summaryrefslogtreecommitdiffstats
path: root/sys/contrib
diff options
context:
space:
mode:
Diffstat (limited to 'sys/contrib')
-rw-r--r--sys/contrib/altq/altq/altq.h204
-rw-r--r--sys/contrib/altq/altq/altq_cbq.c1185
-rw-r--r--sys/contrib/altq/altq/altq_cbq.h221
-rw-r--r--sys/contrib/altq/altq/altq_cdnr.c1391
-rw-r--r--sys/contrib/altq/altq/altq_cdnr.h335
-rw-r--r--sys/contrib/altq/altq/altq_classq.h206
-rw-r--r--sys/contrib/altq/altq/altq_hfsc.c2276
-rw-r--r--sys/contrib/altq/altq/altq_hfsc.h320
-rw-r--r--sys/contrib/altq/altq/altq_priq.c1053
-rw-r--r--sys/contrib/altq/altq/altq_priq.h170
-rw-r--r--sys/contrib/altq/altq/altq_red.c1505
-rw-r--r--sys/contrib/altq/altq/altq_red.h198
-rw-r--r--sys/contrib/altq/altq/altq_rio.c853
-rw-r--r--sys/contrib/altq/altq/altq_rio.h144
-rw-r--r--sys/contrib/altq/altq/altq_rmclass.c1841
-rw-r--r--sys/contrib/altq/altq/altq_rmclass.h266
-rw-r--r--sys/contrib/altq/altq/altq_rmclass_debug.h112
-rw-r--r--sys/contrib/altq/altq/altq_subr.c2003
-rw-r--r--sys/contrib/altq/altq/altq_var.h265
-rw-r--r--sys/contrib/altq/altq/altqconf.h29
-rw-r--r--sys/contrib/altq/altq/if_altq.h191
-rw-r--r--sys/contrib/dev/acpica/CHANGES.txt8448
-rw-r--r--sys/contrib/dev/acpica/acapps.h243
-rw-r--r--sys/contrib/dev/acpica/acconfig.h296
-rw-r--r--sys/contrib/dev/acpica/acdebug.h437
-rw-r--r--sys/contrib/dev/acpica/acdisasm.h680
-rw-r--r--sys/contrib/dev/acpica/acdispat.h514
-rw-r--r--sys/contrib/dev/acpica/acefi.h148
-rw-r--r--sys/contrib/dev/acpica/acenv.h444
-rw-r--r--sys/contrib/dev/acpica/acevents.h374
-rw-r--r--sys/contrib/dev/acpica/acexcep.h390
-rw-r--r--sys/contrib/dev/acpica/acfreebsd.h201
-rw-r--r--sys/contrib/dev/acpica/acgcc.h139
-rw-r--r--sys/contrib/dev/acpica/acglobal.h472
-rw-r--r--sys/contrib/dev/acpica/achware.h247
-rw-r--r--sys/contrib/dev/acpica/acinterp.h793
-rw-r--r--sys/contrib/dev/acpica/aclocal.h1202
-rw-r--r--sys/contrib/dev/acpica/acmacros.h754
-rw-r--r--sys/contrib/dev/acpica/acnames.h158
-rw-r--r--sys/contrib/dev/acpica/acnamesp.h493
-rw-r--r--sys/contrib/dev/acpica/acobject.h619
-rw-r--r--sys/contrib/dev/acpica/acopcode.h398
-rw-r--r--sys/contrib/dev/acpica/acoutput.h263
-rw-r--r--sys/contrib/dev/acpica/acparser.h403
-rw-r--r--sys/contrib/dev/acpica/acpi.h143
-rwxr-xr-xsys/contrib/dev/acpica/acpica_prep.sh92
-rw-r--r--sys/contrib/dev/acpica/acpiosxf.h504
-rw-r--r--sys/contrib/dev/acpica/acpixf.h550
-rw-r--r--sys/contrib/dev/acpica/acresrc.h465
-rw-r--r--sys/contrib/dev/acpica/acstruct.h333
-rw-r--r--sys/contrib/dev/acpica/actables.h243
-rw-r--r--sys/contrib/dev/acpica/actbl.h395
-rw-r--r--sys/contrib/dev/acpica/actbl1.h917
-rw-r--r--sys/contrib/dev/acpica/actbl2.h123
-rw-r--r--sys/contrib/dev/acpica/actypes.h1453
-rw-r--r--sys/contrib/dev/acpica/acutils.h942
-rw-r--r--sys/contrib/dev/acpica/aecommon.h243
-rw-r--r--sys/contrib/dev/acpica/amlcode.h595
-rw-r--r--sys/contrib/dev/acpica/amlresrc.h486
-rw-r--r--sys/contrib/dev/acpica/common/adfile.c398
-rw-r--r--sys/contrib/dev/acpica/common/adisasm.c1132
-rw-r--r--sys/contrib/dev/acpica/common/adwalk.c1001
-rw-r--r--sys/contrib/dev/acpica/common/dmrestag.c990
-rw-r--r--sys/contrib/dev/acpica/common/dmtable.c734
-rw-r--r--sys/contrib/dev/acpica/common/dmtbdump.c798
-rw-r--r--sys/contrib/dev/acpica/common/dmtbinfo.c967
-rw-r--r--sys/contrib/dev/acpica/common/getopt.c246
-rw-r--r--sys/contrib/dev/acpica/compiler/aslanalyze.c2211
-rw-r--r--sys/contrib/dev/acpica/compiler/aslcodegen.c661
-rw-r--r--sys/contrib/dev/acpica/compiler/aslcompile.c929
-rw-r--r--sys/contrib/dev/acpica/compiler/aslcompiler.h913
-rw-r--r--sys/contrib/dev/acpica/compiler/aslcompiler.l1182
-rw-r--r--sys/contrib/dev/acpica/compiler/aslcompiler.y3189
-rw-r--r--sys/contrib/dev/acpica/compiler/asldefine.h211
-rw-r--r--sys/contrib/dev/acpica/compiler/aslerror.c647
-rw-r--r--sys/contrib/dev/acpica/compiler/aslfiles.c873
-rw-r--r--sys/contrib/dev/acpica/compiler/aslfold.c564
-rw-r--r--sys/contrib/dev/acpica/compiler/aslglobal.h278
-rw-r--r--sys/contrib/dev/acpica/compiler/asllength.c531
-rw-r--r--sys/contrib/dev/acpica/compiler/asllisting.c1494
-rw-r--r--sys/contrib/dev/acpica/compiler/aslload.c826
-rw-r--r--sys/contrib/dev/acpica/compiler/asllookup.c1370
-rw-r--r--sys/contrib/dev/acpica/compiler/aslmain.c868
-rw-r--r--sys/contrib/dev/acpica/compiler/aslmap.c750
-rw-r--r--sys/contrib/dev/acpica/compiler/aslopcodes.c812
-rw-r--r--sys/contrib/dev/acpica/compiler/asloperands.c1230
-rw-r--r--sys/contrib/dev/acpica/compiler/aslopt.c869
-rw-r--r--sys/contrib/dev/acpica/compiler/aslresource.c760
-rw-r--r--sys/contrib/dev/acpica/compiler/aslrestype1.c1186
-rw-r--r--sys/contrib/dev/acpica/compiler/aslrestype2.c2842
-rw-r--r--sys/contrib/dev/acpica/compiler/aslstubs.c280
-rw-r--r--sys/contrib/dev/acpica/compiler/asltransform.c806
-rw-r--r--sys/contrib/dev/acpica/compiler/asltree.c1194
-rw-r--r--sys/contrib/dev/acpica/compiler/asltypes.h562
-rw-r--r--sys/contrib/dev/acpica/compiler/aslutils.c1055
-rw-r--r--sys/contrib/dev/acpica/dbcmds.c1838
-rw-r--r--sys/contrib/dev/acpica/dbdisply.c961
-rw-r--r--sys/contrib/dev/acpica/dbexec.c712
-rw-r--r--sys/contrib/dev/acpica/dbfileio.c651
-rw-r--r--sys/contrib/dev/acpica/dbhistry.c292
-rw-r--r--sys/contrib/dev/acpica/dbinput.c1069
-rw-r--r--sys/contrib/dev/acpica/dbstats.c621
-rw-r--r--sys/contrib/dev/acpica/dbutils.c596
-rw-r--r--sys/contrib/dev/acpica/dbxface.c612
-rw-r--r--sys/contrib/dev/acpica/dmbuffer.c555
-rw-r--r--sys/contrib/dev/acpica/dmnames.c521
-rw-r--r--sys/contrib/dev/acpica/dmobject.c649
-rw-r--r--sys/contrib/dev/acpica/dmopcode.c631
-rw-r--r--sys/contrib/dev/acpica/dmresrc.c509
-rw-r--r--sys/contrib/dev/acpica/dmresrcl.c1125
-rw-r--r--sys/contrib/dev/acpica/dmresrcs.c387
-rw-r--r--sys/contrib/dev/acpica/dmutils.c493
-rw-r--r--sys/contrib/dev/acpica/dmwalk.c1043
-rw-r--r--sys/contrib/dev/acpica/dsfield.c748
-rw-r--r--sys/contrib/dev/acpica/dsinit.c299
-rw-r--r--sys/contrib/dev/acpica/dsmethod.c754
-rw-r--r--sys/contrib/dev/acpica/dsmthdat.c844
-rw-r--r--sys/contrib/dev/acpica/dsobject.c789
-rw-r--r--sys/contrib/dev/acpica/dsopcode.c1344
-rw-r--r--sys/contrib/dev/acpica/dsutils.c1010
-rw-r--r--sys/contrib/dev/acpica/dswexec.c833
-rw-r--r--sys/contrib/dev/acpica/dswload.c1294
-rw-r--r--sys/contrib/dev/acpica/dswscope.c311
-rw-r--r--sys/contrib/dev/acpica/dswstate.c926
-rw-r--r--sys/contrib/dev/acpica/evevent.c427
-rw-r--r--sys/contrib/dev/acpica/evgpe.c850
-rw-r--r--sys/contrib/dev/acpica/evgpeblk.c1372
-rw-r--r--sys/contrib/dev/acpica/evmisc.c749
-rw-r--r--sys/contrib/dev/acpica/evregion.c1232
-rw-r--r--sys/contrib/dev/acpica/evrgnini.c821
-rw-r--r--sys/contrib/dev/acpica/evsci.c281
-rw-r--r--sys/contrib/dev/acpica/evxface.c974
-rw-r--r--sys/contrib/dev/acpica/evxfevnt.c924
-rw-r--r--sys/contrib/dev/acpica/evxfregn.c345
-rw-r--r--sys/contrib/dev/acpica/exconfig.c523
-rw-r--r--sys/contrib/dev/acpica/exconvrt.c817
-rw-r--r--sys/contrib/dev/acpica/excreate.c737
-rw-r--r--sys/contrib/dev/acpica/exdump.c1217
-rw-r--r--sys/contrib/dev/acpica/exfield.c475
-rw-r--r--sys/contrib/dev/acpica/exfldio.c1056
-rw-r--r--sys/contrib/dev/acpica/exmisc.c873
-rw-r--r--sys/contrib/dev/acpica/exmutex.c596
-rw-r--r--sys/contrib/dev/acpica/exnames.c560
-rw-r--r--sys/contrib/dev/acpica/exoparg1.c1178
-rw-r--r--sys/contrib/dev/acpica/exoparg2.c741
-rw-r--r--sys/contrib/dev/acpica/exoparg3.c377
-rw-r--r--sys/contrib/dev/acpica/exoparg6.c441
-rw-r--r--sys/contrib/dev/acpica/exprep.c675
-rw-r--r--sys/contrib/dev/acpica/exregion.c609
-rw-r--r--sys/contrib/dev/acpica/exresnte.c377
-rw-r--r--sys/contrib/dev/acpica/exresolv.c639
-rw-r--r--sys/contrib/dev/acpica/exresop.c812
-rw-r--r--sys/contrib/dev/acpica/exstore.c756
-rw-r--r--sys/contrib/dev/acpica/exstoren.c385
-rw-r--r--sys/contrib/dev/acpica/exstorob.c302
-rw-r--r--sys/contrib/dev/acpica/exsystem.c419
-rw-r--r--sys/contrib/dev/acpica/exutils.c558
-rw-r--r--sys/contrib/dev/acpica/hwacpi.c277
-rw-r--r--sys/contrib/dev/acpica/hwgpe.c545
-rw-r--r--sys/contrib/dev/acpica/hwregs.c1001
-rw-r--r--sys/contrib/dev/acpica/hwsleep.c763
-rw-r--r--sys/contrib/dev/acpica/hwtimer.c288
-rw-r--r--sys/contrib/dev/acpica/nsaccess.c750
-rw-r--r--sys/contrib/dev/acpica/nsalloc.c628
-rw-r--r--sys/contrib/dev/acpica/nsdump.c826
-rw-r--r--sys/contrib/dev/acpica/nsdumpdv.c235
-rw-r--r--sys/contrib/dev/acpica/nseval.c316
-rw-r--r--sys/contrib/dev/acpica/nsinit.c701
-rw-r--r--sys/contrib/dev/acpica/nsload.c429
-rw-r--r--sys/contrib/dev/acpica/nsnames.c347
-rw-r--r--sys/contrib/dev/acpica/nsobject.c567
-rw-r--r--sys/contrib/dev/acpica/nsparse.c283
-rw-r--r--sys/contrib/dev/acpica/nssearch.c514
-rw-r--r--sys/contrib/dev/acpica/nsutils.c1220
-rw-r--r--sys/contrib/dev/acpica/nswalk.c388
-rw-r--r--sys/contrib/dev/acpica/nsxfeval.c891
-rw-r--r--sys/contrib/dev/acpica/nsxfname.c474
-rw-r--r--sys/contrib/dev/acpica/nsxfobj.c356
-rw-r--r--sys/contrib/dev/acpica/osunixxf.c1155
-rw-r--r--sys/contrib/dev/acpica/psargs.c869
-rw-r--r--sys/contrib/dev/acpica/psloop.c1186
-rw-r--r--sys/contrib/dev/acpica/psopcode.c589
-rw-r--r--sys/contrib/dev/acpica/psparse.c765
-rw-r--r--sys/contrib/dev/acpica/psscope.c374
-rw-r--r--sys/contrib/dev/acpica/pstree.c427
-rw-r--r--sys/contrib/dev/acpica/psutils.c362
-rw-r--r--sys/contrib/dev/acpica/pswalk.c193
-rw-r--r--sys/contrib/dev/acpica/psxface.c473
-rw-r--r--sys/contrib/dev/acpica/rsaddr.c479
-rw-r--r--sys/contrib/dev/acpica/rscalc.c715
-rw-r--r--sys/contrib/dev/acpica/rscreate.c526
-rw-r--r--sys/contrib/dev/acpica/rsdump.c870
-rw-r--r--sys/contrib/dev/acpica/rsinfo.c290
-rw-r--r--sys/contrib/dev/acpica/rsio.c341
-rw-r--r--sys/contrib/dev/acpica/rsirq.c313
-rw-r--r--sys/contrib/dev/acpica/rslist.c286
-rw-r--r--sys/contrib/dev/acpica/rsmemory.c323
-rw-r--r--sys/contrib/dev/acpica/rsmisc.c671
-rw-r--r--sys/contrib/dev/acpica/rsutils.c875
-rw-r--r--sys/contrib/dev/acpica/rsxface.c713
-rw-r--r--sys/contrib/dev/acpica/tbfadt.c520
-rw-r--r--sys/contrib/dev/acpica/tbfind.c205
-rw-r--r--sys/contrib/dev/acpica/tbinstal.c684
-rw-r--r--sys/contrib/dev/acpica/tbutils.c594
-rw-r--r--sys/contrib/dev/acpica/tbxface.c674
-rw-r--r--sys/contrib/dev/acpica/tbxfroot.c370
-rw-r--r--sys/contrib/dev/acpica/utalloc.c482
-rw-r--r--sys/contrib/dev/acpica/utcache.c425
-rw-r--r--sys/contrib/dev/acpica/utclib.c961
-rw-r--r--sys/contrib/dev/acpica/utcopy.c1091
-rw-r--r--sys/contrib/dev/acpica/utdebug.c807
-rw-r--r--sys/contrib/dev/acpica/utdelete.c775
-rw-r--r--sys/contrib/dev/acpica/uteval.c880
-rw-r--r--sys/contrib/dev/acpica/utglobal.c842
-rw-r--r--sys/contrib/dev/acpica/utinit.c241
-rw-r--r--sys/contrib/dev/acpica/utmath.c431
-rw-r--r--sys/contrib/dev/acpica/utmisc.c1314
-rw-r--r--sys/contrib/dev/acpica/utmutex.c464
-rw-r--r--sys/contrib/dev/acpica/utobject.c764
-rw-r--r--sys/contrib/dev/acpica/utresrc.c772
-rw-r--r--sys/contrib/dev/acpica/utstate.c470
-rw-r--r--sys/contrib/dev/acpica/uttrack.c726
-rw-r--r--sys/contrib/dev/acpica/utxface.c638
-rw-r--r--sys/contrib/dev/ath/COPYRIGHT42
-rw-r--r--sys/contrib/dev/ath/README73
-rw-r--r--sys/contrib/dev/ath/ah.h879
-rw-r--r--sys/contrib/dev/ath/ah_desc.h181
-rw-r--r--sys/contrib/dev/ath/ah_devid.h99
-rw-r--r--sys/contrib/dev/ath/ah_soc.h110
-rw-r--r--sys/contrib/dev/ath/public/alpha-elf.hal.o.uu10150
-rw-r--r--sys/contrib/dev/ath/public/alpha-elf.inc76
-rw-r--r--sys/contrib/dev/ath/public/alpha-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/ap30.hal.o.uu3662
-rw-r--r--sys/contrib/dev/ath/public/ap30.inc69
-rw-r--r--sys/contrib/dev/ath/public/ap30.opt_ah.h5
-rw-r--r--sys/contrib/dev/ath/public/ap43.hal.o.uu3648
-rw-r--r--sys/contrib/dev/ath/public/ap43.inc69
-rw-r--r--sys/contrib/dev/ath/public/ap43.opt_ah.h4
-rw-r--r--sys/contrib/dev/ath/public/ap51.hal.o.uu3404
-rw-r--r--sys/contrib/dev/ath/public/ap51.inc69
-rw-r--r--sys/contrib/dev/ath/public/ap51.opt_ah.h4
-rw-r--r--sys/contrib/dev/ath/public/ap61.hal.o.uu3382
-rw-r--r--sys/contrib/dev/ath/public/ap61.inc69
-rw-r--r--sys/contrib/dev/ath/public/ap61.opt_ah.h3
-rw-r--r--sys/contrib/dev/ath/public/arm9-le-thumb-elf.hal.o.uu5915
-rw-r--r--sys/contrib/dev/ath/public/arm9-le-thumb-elf.inc78
-rw-r--r--sys/contrib/dev/ath/public/arm9-le-thumb-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/armv4-be-elf.hal.o.uu5479
-rw-r--r--sys/contrib/dev/ath/public/armv4-be-elf.inc74
-rw-r--r--sys/contrib/dev/ath/public/armv4-be-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/armv4-le-elf.hal.o.uu5468
-rw-r--r--sys/contrib/dev/ath/public/armv4-le-elf.inc74
-rw-r--r--sys/contrib/dev/ath/public/armv4-le-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/i386-elf.hal.o.uu4300
-rw-r--r--sys/contrib/dev/ath/public/i386-elf.inc58
-rw-r--r--sys/contrib/dev/ath/public/i386-elf.opt_ah.h7
-rw-r--r--sys/contrib/dev/ath/public/mips-be-elf.hal.o.uu5761
-rw-r--r--sys/contrib/dev/ath/public/mips-be-elf.inc75
-rw-r--r--sys/contrib/dev/ath/public/mips-be-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/mips-le-elf.hal.o.uu5758
-rw-r--r--sys/contrib/dev/ath/public/mips-le-elf.inc72
-rw-r--r--sys/contrib/dev/ath/public/mips-le-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/mips1-be-elf.hal.o.uu6052
-rw-r--r--sys/contrib/dev/ath/public/mips1-be-elf.inc72
-rw-r--r--sys/contrib/dev/ath/public/mips1-be-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/mips1-le-elf.hal.o.uu6047
-rw-r--r--sys/contrib/dev/ath/public/mips1-le-elf.inc72
-rw-r--r--sys/contrib/dev/ath/public/mips1-le-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/mipsisa32-be-elf.hal.o.uu6260
-rw-r--r--sys/contrib/dev/ath/public/mipsisa32-be-elf.inc76
-rw-r--r--sys/contrib/dev/ath/public/mipsisa32-be-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/mipsisa32-le-elf.hal.o.uu6257
-rw-r--r--sys/contrib/dev/ath/public/mipsisa32-le-elf.inc74
-rw-r--r--sys/contrib/dev/ath/public/mipsisa32-le-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/powerpc-be-eabi.hal.o.uu5415
-rw-r--r--sys/contrib/dev/ath/public/powerpc-be-eabi.inc76
-rw-r--r--sys/contrib/dev/ath/public/powerpc-be-eabi.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/powerpc-be-elf.hal.o.uu5415
-rw-r--r--sys/contrib/dev/ath/public/powerpc-be-elf.inc72
-rw-r--r--sys/contrib/dev/ath/public/powerpc-be-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/powerpc-le-eabi.hal.o.uu5483
-rw-r--r--sys/contrib/dev/ath/public/powerpc-le-eabi.inc75
-rw-r--r--sys/contrib/dev/ath/public/powerpc-le-eabi.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/sh4-le-elf.hal.o.uu4708
-rw-r--r--sys/contrib/dev/ath/public/sh4-le-elf.inc62
-rw-r--r--sys/contrib/dev/ath/public/sh4-le-elf.opt_ah.h7
-rw-r--r--sys/contrib/dev/ath/public/sparc-be-elf.hal.o.uu5504
-rw-r--r--sys/contrib/dev/ath/public/sparc-be-elf.inc72
-rw-r--r--sys/contrib/dev/ath/public/sparc-be-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/sparc64-be-elf.hal.o.uu6404
-rw-r--r--sys/contrib/dev/ath/public/sparc64-be-elf.inc83
-rw-r--r--sys/contrib/dev/ath/public/sparc64-be-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/wackelf.c121
-rw-r--r--sys/contrib/dev/ath/public/x86_64-elf.hal.o.uu5533
-rw-r--r--sys/contrib/dev/ath/public/x86_64-elf.inc63
-rw-r--r--sys/contrib/dev/ath/public/x86_64-elf.opt_ah.h7
-rw-r--r--sys/contrib/dev/ath/public/xscale-be-elf.hal.o.uu5454
-rw-r--r--sys/contrib/dev/ath/public/xscale-be-elf.inc81
-rw-r--r--sys/contrib/dev/ath/public/xscale-be-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/public/xscale-le-elf.hal.o.uu5443
-rw-r--r--sys/contrib/dev/ath/public/xscale-le-elf.inc82
-rw-r--r--sys/contrib/dev/ath/public/xscale-le-elf.opt_ah.h8
-rw-r--r--sys/contrib/dev/ath/version.h38
-rw-r--r--sys/contrib/dev/ipw/LICENSE207
-rw-r--r--sys/contrib/dev/ipw/ipw2100-1.3-i.fw.uu4678
-rw-r--r--sys/contrib/dev/ipw/ipw2100-1.3-p.fw.uu4574
-rw-r--r--sys/contrib/dev/ipw/ipw2100-1.3.fw.uu4857
-rw-r--r--sys/contrib/dev/iwi/LICENSE210
-rw-r--r--sys/contrib/dev/iwi/ipw2200-bss.fw.uu4459
-rw-r--r--sys/contrib/dev/iwi/ipw2200-ibss.fw.uu4337
-rw-r--r--sys/contrib/dev/iwi/ipw2200-sniffer.fw.uu4386
-rw-r--r--sys/contrib/dev/nve/adapter.h583
-rw-r--r--sys/contrib/dev/nve/amd64/nvenetlib.README52
-rw-r--r--sys/contrib/dev/nve/amd64/nvenetlib.o.bz2.uu321
-rw-r--r--sys/contrib/dev/nve/basetype.h281
-rw-r--r--sys/contrib/dev/nve/drvinfo.h190
-rw-r--r--sys/contrib/dev/nve/i386/nvenetlib.README52
-rw-r--r--sys/contrib/dev/nve/i386/nvenetlib.o.bz2.uu320
-rw-r--r--sys/contrib/dev/nve/nvenet_version.h29
-rw-r--r--sys/contrib/dev/nve/os.h128
-rw-r--r--sys/contrib/dev/nve/phy.h164
-rw-r--r--sys/contrib/dev/oltr/COPYRIGHT62
-rw-r--r--sys/contrib/dev/oltr/i386-elf.trlld.o.uu1850
-rw-r--r--sys/contrib/dev/oltr/if_oltr.c1094
-rw-r--r--sys/contrib/dev/oltr/if_oltr_isa.c321
-rw-r--r--sys/contrib/dev/oltr/if_oltr_pci.c280
-rw-r--r--sys/contrib/dev/oltr/if_oltrvar.h122
-rw-r--r--sys/contrib/dev/oltr/trlld.h902
-rw-r--r--sys/contrib/dev/oltr/trlldbm.c2690
-rw-r--r--sys/contrib/dev/oltr/trlldhm.c2519
-rw-r--r--sys/contrib/dev/oltr/trlldmac.c2641
-rw-r--r--sys/contrib/ia64/libuwx/src/Makefile71
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx.h418
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_bstream.c181
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_bstream.h59
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_context.c408
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_context.h25
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_env.c221
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_env.h111
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_scoreboard.c315
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_scoreboard.h84
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_self.c442
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_self.h112
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_self_context.s383
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_self_info.h44
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_step.c827
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_step.h30
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_str.c128
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_str.h37
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_swap.c70
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_swap.h26
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_symbols.c850
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_symbols.h38
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_trace.c166
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_trace.h370
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_uinfo.c1119
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_uinfo.h66
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_utable.c273
-rw-r--r--sys/contrib/ia64/libuwx/src/uwx_utable.h37
-rw-r--r--sys/contrib/ia64/libuwx/test/Makefile14
-rw-r--r--sys/contrib/ia64/libuwx/test/dump_context.c100
-rw-r--r--sys/contrib/ia64/libuwx/test/dumpmyself.c106
-rw-r--r--sys/contrib/ia64/libuwx/test/primeregs.s93
-rw-r--r--sys/contrib/ipfilter/netinet/IPFILTER.LICENCE30
-rw-r--r--sys/contrib/ipfilter/netinet/QNX_OCL.txt277
-rw-r--r--sys/contrib/ipfilter/netinet/fil.c7319
-rw-r--r--sys/contrib/ipfilter/netinet/ip_auth.c1052
-rw-r--r--sys/contrib/ipfilter/netinet/ip_auth.h71
-rw-r--r--sys/contrib/ipfilter/netinet/ip_compat.h2435
-rw-r--r--sys/contrib/ipfilter/netinet/ip_fil.h1551
-rw-r--r--sys/contrib/ipfilter/netinet/ip_fil_freebsd.c1660
-rw-r--r--sys/contrib/ipfilter/netinet/ip_frag.c993
-rw-r--r--sys/contrib/ipfilter/netinet/ip_frag.h108
-rw-r--r--sys/contrib/ipfilter/netinet/ip_ftp_pxy.c1431
-rw-r--r--sys/contrib/ipfilter/netinet/ip_htable.c654
-rw-r--r--sys/contrib/ipfilter/netinet/ip_htable.h78
-rw-r--r--sys/contrib/ipfilter/netinet/ip_ipsec_pxy.c341
-rw-r--r--sys/contrib/ipfilter/netinet/ip_irc_pxy.c433
-rw-r--r--sys/contrib/ipfilter/netinet/ip_log.c699
-rw-r--r--sys/contrib/ipfilter/netinet/ip_lookup.c659
-rw-r--r--sys/contrib/ipfilter/netinet/ip_lookup.h96
-rw-r--r--sys/contrib/ipfilter/netinet/ip_nat.c5340
-rw-r--r--sys/contrib/ipfilter/netinet/ip_nat.h468
-rw-r--r--sys/contrib/ipfilter/netinet/ip_netbios_pxy.c118
-rw-r--r--sys/contrib/ipfilter/netinet/ip_pool.c1005
-rw-r--r--sys/contrib/ipfilter/netinet/ip_pool.h90
-rw-r--r--sys/contrib/ipfilter/netinet/ip_pptp_pxy.c530
-rw-r--r--sys/contrib/ipfilter/netinet/ip_proxy.c857
-rw-r--r--sys/contrib/ipfilter/netinet/ip_proxy.h462
-rw-r--r--sys/contrib/ipfilter/netinet/ip_raudio_pxy.c339
-rw-r--r--sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c239
-rw-r--r--sys/contrib/ipfilter/netinet/ip_rpcb_pxy.c1464
-rw-r--r--sys/contrib/ipfilter/netinet/ip_rules.c229
-rw-r--r--sys/contrib/ipfilter/netinet/ip_rules.h16
-rw-r--r--sys/contrib/ipfilter/netinet/ip_scan.c599
-rw-r--r--sys/contrib/ipfilter/netinet/ip_scan.h106
-rw-r--r--sys/contrib/ipfilter/netinet/ip_state.c4155
-rw-r--r--sys/contrib/ipfilter/netinet/ip_state.h263
-rw-r--r--sys/contrib/ipfilter/netinet/ip_sync.c1020
-rw-r--r--sys/contrib/ipfilter/netinet/ip_sync.h117
-rw-r--r--sys/contrib/ipfilter/netinet/ipl.h20
-rw-r--r--sys/contrib/ipfilter/netinet/mlfk_ipl.c353
-rw-r--r--sys/contrib/ngatm/FREEBSD-Xlist15
-rw-r--r--sys/contrib/ngatm/FREEBSD-upgrade26
-rw-r--r--sys/contrib/ngatm/netnatm/addr.h42
-rw-r--r--sys/contrib/ngatm/netnatm/api/atmapi.h291
-rw-r--r--sys/contrib/ngatm/netnatm/api/cc_conn.c2096
-rw-r--r--sys/contrib/ngatm/netnatm/api/cc_data.c226
-rw-r--r--sys/contrib/ngatm/netnatm/api/cc_dump.c334
-rw-r--r--sys/contrib/ngatm/netnatm/api/cc_port.c923
-rw-r--r--sys/contrib/ngatm/netnatm/api/cc_sig.c350
-rw-r--r--sys/contrib/ngatm/netnatm/api/cc_user.c1922
-rw-r--r--sys/contrib/ngatm/netnatm/api/ccatm.h154
-rw-r--r--sys/contrib/ngatm/netnatm/api/ccpriv.h562
-rw-r--r--sys/contrib/ngatm/netnatm/api/unisap.c415
-rw-r--r--sys/contrib/ngatm/netnatm/api/unisap.h130
-rw-r--r--sys/contrib/ngatm/netnatm/genfiles15
-rw-r--r--sys/contrib/ngatm/netnatm/misc/straddr.c235
-rw-r--r--sys/contrib/ngatm/netnatm/misc/unimsg_common.c54
-rw-r--r--sys/contrib/ngatm/netnatm/msg/geniec.awk110
-rw-r--r--sys/contrib/ngatm/netnatm/msg/genieh.awk61
-rw-r--r--sys/contrib/ngatm/netnatm/msg/genmsgc.awk274
-rw-r--r--sys/contrib/ngatm/netnatm/msg/genmsgh.awk80
-rw-r--r--sys/contrib/ngatm/netnatm/msg/ie.def84
-rw-r--r--sys/contrib/ngatm/netnatm/msg/msg.def582
-rw-r--r--sys/contrib/ngatm/netnatm/msg/parseie.awk150
-rw-r--r--sys/contrib/ngatm/netnatm/msg/parsemsg.awk138
-rw-r--r--sys/contrib/ngatm/netnatm/msg/priv.h119
-rw-r--r--sys/contrib/ngatm/netnatm/msg/privmsg.c275
-rw-r--r--sys/contrib/ngatm/netnatm/msg/traffic.c406
-rw-r--r--sys/contrib/ngatm/netnatm/msg/uni_config.h70
-rw-r--r--sys/contrib/ngatm/netnatm/msg/uni_hdr.h220
-rw-r--r--sys/contrib/ngatm/netnatm/msg/uni_ie.c7164
-rw-r--r--sys/contrib/ngatm/netnatm/msg/uni_ie.h57
-rw-r--r--sys/contrib/ngatm/netnatm/msg/uni_ietab.h958
-rw-r--r--sys/contrib/ngatm/netnatm/msg/uni_msg.c4901
-rw-r--r--sys/contrib/ngatm/netnatm/msg/uni_msg.h342
-rw-r--r--sys/contrib/ngatm/netnatm/msg/unimsglib.h168
-rw-r--r--sys/contrib/ngatm/netnatm/msg/uniprint.h72
-rw-r--r--sys/contrib/ngatm/netnatm/msg/unistruct.h1371
-rw-r--r--sys/contrib/ngatm/netnatm/saal/saal_sscfu.c577
-rw-r--r--sys/contrib/ngatm/netnatm/saal/saal_sscop.c4947
-rw-r--r--sys/contrib/ngatm/netnatm/saal/sscfu.h103
-rw-r--r--sys/contrib/ngatm/netnatm/saal/sscfudef.h73
-rw-r--r--sys/contrib/ngatm/netnatm/saal/sscfupriv.h66
-rw-r--r--sys/contrib/ngatm/netnatm/saal/sscop.h126
-rw-r--r--sys/contrib/ngatm/netnatm/saal/sscopdef.h159
-rw-r--r--sys/contrib/ngatm/netnatm/saal/sscoppriv.h318
-rw-r--r--sys/contrib/ngatm/netnatm/sig/genmsgcpyc.awk80
-rw-r--r--sys/contrib/ngatm/netnatm/sig/genmsgcpyh.awk55
-rw-r--r--sys/contrib/ngatm/netnatm/sig/sig_call.c4310
-rw-r--r--sys/contrib/ngatm/netnatm/sig/sig_coord.c1171
-rw-r--r--sys/contrib/ngatm/netnatm/sig/sig_party.c1353
-rw-r--r--sys/contrib/ngatm/netnatm/sig/sig_print.c622
-rw-r--r--sys/contrib/ngatm/netnatm/sig/sig_reset.c827
-rw-r--r--sys/contrib/ngatm/netnatm/sig/sig_uni.c749
-rw-r--r--sys/contrib/ngatm/netnatm/sig/sig_unimsgcpy.c594
-rw-r--r--sys/contrib/ngatm/netnatm/sig/sig_verify.c442
-rw-r--r--sys/contrib/ngatm/netnatm/sig/uni.h106
-rw-r--r--sys/contrib/ngatm/netnatm/sig/unidef.h480
-rw-r--r--sys/contrib/ngatm/netnatm/sig/unimkmsg.h159
-rw-r--r--sys/contrib/ngatm/netnatm/sig/unimsgcpy.h113
-rw-r--r--sys/contrib/ngatm/netnatm/sig/unipriv.h563
-rw-r--r--sys/contrib/ngatm/netnatm/sig/unisig.h49
-rw-r--r--sys/contrib/ngatm/netnatm/unimsg.h92
-rw-r--r--sys/contrib/opensolaris/common/acl/acl_common.c217
-rw-r--r--sys/contrib/opensolaris/common/acl/acl_common.h56
-rw-r--r--sys/contrib/opensolaris/common/atomic/amd64/atomic.S68
-rw-r--r--sys/contrib/opensolaris/common/atomic/i386/atomic.S98
-rw-r--r--sys/contrib/opensolaris/common/atomic/ia64/atomic.S82
-rw-r--r--sys/contrib/opensolaris/common/avl/avl.c968
-rw-r--r--sys/contrib/opensolaris/common/nvpair/nvpair.c2953
-rw-r--r--sys/contrib/opensolaris/common/nvpair/nvpair_alloc_fixed.c118
-rw-r--r--sys/contrib/opensolaris/common/zfs/zfs_namecheck.c287
-rw-r--r--sys/contrib/opensolaris/common/zfs/zfs_namecheck.h56
-rw-r--r--sys/contrib/opensolaris/common/zfs/zfs_prop.c657
-rw-r--r--sys/contrib/opensolaris/common/zfs/zfs_prop.h56
-rw-r--r--sys/contrib/opensolaris/uts/common/Makefile.files101
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/gfs.c884
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/arc.c2858
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/bplist.c312
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dbuf.c2247
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dmu.c1029
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c160
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c1037
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c1009
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c888
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c992
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dmu_zfetch.c655
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dnode.c1369
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c623
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c2035
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c1215
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c256
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dsl_prop.c501
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/dsl_synctask.c196
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/fletcher.c145
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/gzip.c69
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/lzjb.c129
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/metaslab.c1023
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/refcount.c194
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sha256.c131
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/spa.c3301
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/spa_config.c375
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c440
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/spa_history.c354
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c1130
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/space_map.c501
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/arc.h109
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/bplist.h89
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dbuf.h334
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h587
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_impl.h237
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_objset.h125
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_traverse.h120
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_tx.h134
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_zfetch.h75
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h267
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h185
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dir.h143
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h82
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_prop.h77
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_synctask.h77
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab.h69
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h81
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/refcount.h103
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h491
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h168
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/space_map.h162
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/txg.h120
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/txg_impl.h77
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/uberblock.h50
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/uberblock_impl.h63
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/unique.h56
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h132
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_disk.h52
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_file.h46
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h298
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap.h359
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap_impl.h204
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap_leaf.h234
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h115
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_context.h120
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ctldir.h71
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_debug.h75
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_dir.h71
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h163
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_rlock.h89
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h100
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h298
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h276
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zil_impl.h111
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h366
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_checksum.h75
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_compress.h82
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h205
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/sys/zvol.h68
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/txg.c611
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/uberblock.c63
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/unique.c107
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev.c1904
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c394
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c363
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c225
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c583
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev_label.c1011
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c495
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c89
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c323
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c1237
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/vdev_root.c118
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zap.c1071
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zap_leaf.c741
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c855
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs.conf28
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c1608
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_byteswap.c99
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c1119
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c797
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_fm.c334
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c1826
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_log.c349
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c430
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c594
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c980
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c3599
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c1070
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zil.c1607
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zio.c1861
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zio_checksum.c172
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zio_compress.c148
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zio_inject.c315
-rw-r--r--sys/contrib/opensolaris/uts/common/fs/zfs/zvol.c801
-rw-r--r--sys/contrib/opensolaris/uts/common/os/callb.c363
-rw-r--r--sys/contrib/opensolaris/uts/common/os/list.c193
-rw-r--r--sys/contrib/opensolaris/uts/common/os/nvpair_alloc_system.c63
-rw-r--r--sys/contrib/opensolaris/uts/common/os/taskq.c1020
-rw-r--r--sys/contrib/opensolaris/uts/common/rpc/xdr.c671
-rw-r--r--sys/contrib/opensolaris/uts/common/rpc/xdr.h605
-rw-r--r--sys/contrib/opensolaris/uts/common/rpc/xdr_array.c123
-rw-r--r--sys/contrib/opensolaris/uts/common/rpc/xdr_mem.c209
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/asm_linkage.h110
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/avl.h298
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/avl_impl.h164
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/bitmap.h194
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/byteorder.h137
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/callb.h214
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/ccompile.h127
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/compress.h46
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/cred.h154
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/debug.h129
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/dkio.h477
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/dklabel.h268
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/errorq.h83
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/feature_tests.h397
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/fm/fs/zfs.h75
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/fm/protocol.h301
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/fm/util.h103
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/fs/zfs.h437
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/gfs.h139
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/isa_defs.h479
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/list.h63
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/list_impl.h53
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/note.h56
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/nvpair.h260
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/nvpair_impl.h73
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/processor.h146
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/procset.h160
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/sdt.h176
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/synch.h161
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/sysevent.h227
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/sysmacros.h287
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/vfs.h569
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/vmem.h142
-rw-r--r--sys/contrib/opensolaris/uts/common/sys/zmod.h68
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/adler32.c149
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/crc32.c428
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/crc32.h443
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/deflate.c1742
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/deflate.h331
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/inffast.c320
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/inffast.h13
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/inffixed.h96
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/inflate.c1395
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/inflate.h117
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/inftrees.c331
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/inftrees.h57
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/trees.c1219
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/zconf.h117
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/zlib.h1359
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/zmod.c109
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/zmod_subr.c84
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/zutil.c324
-rw-r--r--sys/contrib/opensolaris/uts/common/zmod/zutil.h274
-rw-r--r--sys/contrib/pf/net/if_pflog.c289
-rw-r--r--sys/contrib/pf/net/if_pflog.h38
-rw-r--r--sys/contrib/pf/net/if_pfsync.c1046
-rw-r--r--sys/contrib/pf/net/if_pfsync.h96
-rw-r--r--sys/contrib/pf/net/pf.c2074
-rw-r--r--sys/contrib/pf/net/pf_if.c959
-rw-r--r--sys/contrib/pf/net/pf_ioctl.c1817
-rw-r--r--sys/contrib/pf/net/pf_norm.c291
-rw-r--r--sys/contrib/pf/net/pf_osfp.c135
-rw-r--r--sys/contrib/pf/net/pf_subr.c127
-rw-r--r--sys/contrib/pf/net/pf_table.c200
-rw-r--r--sys/contrib/pf/net/pfvar.h533
-rw-r--r--sys/contrib/pf/netinet/in4_cksum.c127
667 files changed, 517478 insertions, 2638 deletions
diff --git a/sys/contrib/altq/altq/altq.h b/sys/contrib/altq/altq/altq.h
new file mode 100644
index 0000000..c740ed3
--- /dev/null
+++ b/sys/contrib/altq/altq/altq.h
@@ -0,0 +1,204 @@
+/* $FreeBSD$ */
+/* $KAME: altq.h,v 1.10 2003/07/10 12:07:47 kjc Exp $ */
+
+/*
+ * Copyright (C) 1998-2003
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _ALTQ_ALTQ_H_
+#define _ALTQ_ALTQ_H_
+
+#if 0
+/*
+ * allow altq-3 (altqd(8) and /dev/altq) to coexist with the new pf-based altq.
+ * altq3 is mainly for research experiments. pf-based altq is for daily use.
+ */
+#define ALTQ3_COMPAT /* for compatibility with altq-3 */
+#define ALTQ3_CLFIER_COMPAT /* for compatibility with altq-3 classifier */
+#endif
+
+#ifdef ALTQ3_COMPAT
+#include <sys/param.h>
+#include <sys/ioccom.h>
+#include <sys/queue.h>
+#include <netinet/in.h>
+
+#ifndef IFNAMSIZ
+#define IFNAMSIZ 16
+#endif
+#endif /* ALTQ3_COMPAT */
+
+/* altq discipline type */
+#define ALTQT_NONE 0 /* reserved */
+#define ALTQT_CBQ 1 /* cbq */
+#define ALTQT_WFQ 2 /* wfq */
+#define ALTQT_AFMAP 3 /* afmap */
+#define ALTQT_FIFOQ 4 /* fifoq */
+#define ALTQT_RED 5 /* red */
+#define ALTQT_RIO 6 /* rio */
+#define ALTQT_LOCALQ 7 /* local use */
+#define ALTQT_HFSC 8 /* hfsc */
+#define ALTQT_CDNR 9 /* traffic conditioner */
+#define ALTQT_BLUE 10 /* blue */
+#define ALTQT_PRIQ 11 /* priority queue */
+#define ALTQT_JOBS 12 /* JoBS */
+#define ALTQT_MAX 13 /* should be max discipline type + 1 */
+
+#ifdef ALTQ3_COMPAT
+struct altqreq {
+ char ifname[IFNAMSIZ]; /* if name, e.g. "en0" */
+ u_long arg; /* request-specific argument */
+};
+#endif
+
+/* simple token backet meter profile */
+struct tb_profile {
+ u_int rate; /* rate in bit-per-sec */
+ u_int depth; /* depth in bytes */
+};
+
+#ifdef ALTQ3_COMPAT
+struct tbrreq {
+ char ifname[IFNAMSIZ]; /* if name, e.g. "en0" */
+ struct tb_profile tb_prof; /* token bucket profile */
+};
+
+#ifdef ALTQ3_CLFIER_COMPAT
+/*
+ * common network flow info structure
+ */
+struct flowinfo {
+ u_char fi_len; /* total length */
+ u_char fi_family; /* address family */
+ u_int8_t fi_data[46]; /* actually longer; address family
+ specific flow info. */
+};
+
+/*
+ * flow info structure for internet protocol family.
+ * (currently this is the only protocol family supported)
+ */
+struct flowinfo_in {
+ u_char fi_len; /* sizeof(struct flowinfo_in) */
+ u_char fi_family; /* AF_INET */
+ u_int8_t fi_proto; /* IPPROTO_XXX */
+ u_int8_t fi_tos; /* type-of-service */
+ struct in_addr fi_dst; /* dest address */
+ struct in_addr fi_src; /* src address */
+ u_int16_t fi_dport; /* dest port */
+ u_int16_t fi_sport; /* src port */
+ u_int32_t fi_gpi; /* generalized port id for ipsec */
+ u_int8_t _pad[28]; /* make the size equal to
+ flowinfo_in6 */
+};
+
+#ifdef SIN6_LEN
+struct flowinfo_in6 {
+ u_char fi6_len; /* sizeof(struct flowinfo_in6) */
+ u_char fi6_family; /* AF_INET6 */
+ u_int8_t fi6_proto; /* IPPROTO_XXX */
+ u_int8_t fi6_tclass; /* traffic class */
+ u_int32_t fi6_flowlabel; /* ipv6 flowlabel */
+ u_int16_t fi6_dport; /* dest port */
+ u_int16_t fi6_sport; /* src port */
+ u_int32_t fi6_gpi; /* generalized port id */
+ struct in6_addr fi6_dst; /* dest address */
+ struct in6_addr fi6_src; /* src address */
+};
+#endif /* INET6 */
+
+/*
+ * flow filters for AF_INET and AF_INET6
+ */
+struct flow_filter {
+ int ff_ruleno;
+ struct flowinfo_in ff_flow;
+ struct {
+ struct in_addr mask_dst;
+ struct in_addr mask_src;
+ u_int8_t mask_tos;
+ u_int8_t _pad[3];
+ } ff_mask;
+ u_int8_t _pad2[24]; /* make the size equal to flow_filter6 */
+};
+
+#ifdef SIN6_LEN
+struct flow_filter6 {
+ int ff_ruleno;
+ struct flowinfo_in6 ff_flow6;
+ struct {
+ struct in6_addr mask6_dst;
+ struct in6_addr mask6_src;
+ u_int8_t mask6_tclass;
+ u_int8_t _pad[3];
+ } ff_mask6;
+};
+#endif /* INET6 */
+#endif /* ALTQ3_CLFIER_COMPAT */
+#endif /* ALTQ3_COMPAT */
+
+/*
+ * generic packet counter
+ */
+struct pktcntr {
+ u_int64_t packets;
+ u_int64_t bytes;
+};
+
+#define PKTCNTR_ADD(cntr, len) \
+ do { (cntr)->packets++; (cntr)->bytes += len; } while (/*CONSTCOND*/ 0)
+
+#ifdef ALTQ3_COMPAT
+/*
+ * altq related ioctls
+ */
+#define ALTQGTYPE _IOWR('q', 0, struct altqreq) /* get queue type */
+#if 0
+/*
+ * these ioctls are currently discipline-specific but could be shared
+ * in the future.
+ */
+#define ALTQATTACH _IOW('q', 1, struct altqreq) /* attach discipline */
+#define ALTQDETACH _IOW('q', 2, struct altqreq) /* detach discipline */
+#define ALTQENABLE _IOW('q', 3, struct altqreq) /* enable discipline */
+#define ALTQDISABLE _IOW('q', 4, struct altqreq) /* disable discipline*/
+#define ALTQCLEAR _IOW('q', 5, struct altqreq) /* (re)initialize */
+#define ALTQCONFIG _IOWR('q', 6, struct altqreq) /* set config params */
+#define ALTQADDCLASS _IOWR('q', 7, struct altqreq) /* add a class */
+#define ALTQMODCLASS _IOWR('q', 8, struct altqreq) /* modify a class */
+#define ALTQDELCLASS _IOWR('q', 9, struct altqreq) /* delete a class */
+#define ALTQADDFILTER _IOWR('q', 10, struct altqreq) /* add a filter */
+#define ALTQDELFILTER _IOWR('q', 11, struct altqreq) /* delete a filter */
+#define ALTQGETSTATS _IOWR('q', 12, struct altqreq) /* get statistics */
+#define ALTQGETCNTR _IOWR('q', 13, struct altqreq) /* get a pkt counter */
+#endif /* 0 */
+#define ALTQTBRSET _IOW('q', 14, struct tbrreq) /* set tb regulator */
+#define ALTQTBRGET _IOWR('q', 15, struct tbrreq) /* get tb regulator */
+#endif /* ALTQ3_COMPAT */
+
+#ifdef _KERNEL
+#include <altq/altq_var.h>
+#endif
+
+#endif /* _ALTQ_ALTQ_H_ */
diff --git a/sys/contrib/altq/altq/altq_cbq.c b/sys/contrib/altq/altq/altq_cbq.c
new file mode 100644
index 0000000..aafa5c8
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_cbq.c
@@ -0,0 +1,1185 @@
+/* $FreeBSD$ */
+/* $KAME: altq_cbq.c,v 1.19 2003/09/17 14:23:25 kjc Exp $ */
+
+/*
+ * Copyright (c) Sun Microsystems, Inc. 1993-1998 All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the SMCC Technology
+ * Development Group at Sun Microsystems, Inc.
+ *
+ * 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * SUN MICROSYSTEMS DOES NOT CLAIM MERCHANTABILITY OF THIS SOFTWARE OR THE
+ * SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE. The software is
+ * provided "as is" without express or implied warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this software.
+ */
+
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+#include "opt_altq.h"
+#if (__FreeBSD__ != 2)
+#include "opt_inet.h"
+#ifdef __FreeBSD__
+#include "opt_inet6.h"
+#endif
+#endif
+#endif /* __FreeBSD__ || __NetBSD__ */
+#ifdef ALTQ_CBQ /* cbq is enabled by ALTQ_CBQ option in opt_altq.h */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/errno.h>
+#include <sys/time.h>
+#ifdef ALTQ3_COMPAT
+#include <sys/uio.h>
+#include <sys/kernel.h>
+#endif
+
+#include <net/if.h>
+#include <netinet/in.h>
+
+#include <net/pfvar.h>
+#include <altq/altq.h>
+#include <altq/altq_cbq.h>
+#ifdef ALTQ3_COMPAT
+#include <altq/altq_conf.h>
+#endif
+
+#ifdef ALTQ3_COMPAT
+/*
+ * Local Data structures.
+ */
+static cbq_state_t *cbq_list = NULL;
+#endif
+
+/*
+ * Forward Declarations.
+ */
+static int cbq_class_destroy(cbq_state_t *, struct rm_class *);
+static struct rm_class *clh_to_clp(cbq_state_t *, u_int32_t);
+static int cbq_clear_interface(cbq_state_t *);
+static int cbq_request(struct ifaltq *, int, void *);
+static int cbq_enqueue(struct ifaltq *, struct mbuf *,
+ struct altq_pktattr *);
+static struct mbuf *cbq_dequeue(struct ifaltq *, int);
+static void cbqrestart(struct ifaltq *);
+static void get_class_stats(class_stats_t *, struct rm_class *);
+static void cbq_purge(cbq_state_t *);
+#ifdef ALTQ3_COMPAT
+static int cbq_add_class(struct cbq_add_class *);
+static int cbq_delete_class(struct cbq_delete_class *);
+static int cbq_modify_class(struct cbq_modify_class *);
+static int cbq_class_create(cbq_state_t *, struct cbq_add_class *,
+ struct rm_class *, struct rm_class *);
+static int cbq_clear_hierarchy(struct cbq_interface *);
+static int cbq_set_enable(struct cbq_interface *, int);
+static int cbq_ifattach(struct cbq_interface *);
+static int cbq_ifdetach(struct cbq_interface *);
+static int cbq_getstats(struct cbq_getstats *);
+
+static int cbq_add_filter(struct cbq_add_filter *);
+static int cbq_delete_filter(struct cbq_delete_filter *);
+#endif /* ALTQ3_COMPAT */
+
+/*
+ * int
+ * cbq_class_destroy(cbq_mod_state_t *, struct rm_class *) - This
+ * function destroys a given traffic class. Before destroying
+ * the class, all traffic for that class is released.
+ */
+static int
+cbq_class_destroy(cbq_state_t *cbqp, struct rm_class *cl)
+{
+ int i;
+
+ /* delete the class */
+ rmc_delete_class(&cbqp->ifnp, cl);
+
+ /*
+ * free the class handle
+ */
+ for (i = 0; i < CBQ_MAX_CLASSES; i++)
+ if (cbqp->cbq_class_tbl[i] == cl)
+ cbqp->cbq_class_tbl[i] = NULL;
+
+ if (cl == cbqp->ifnp.root_)
+ cbqp->ifnp.root_ = NULL;
+ if (cl == cbqp->ifnp.default_)
+ cbqp->ifnp.default_ = NULL;
+#ifdef ALTQ3_COMPAT
+ if (cl == cbqp->ifnp.ctl_)
+ cbqp->ifnp.ctl_ = NULL;
+#endif
+ return (0);
+}
+
+/* convert class handle to class pointer */
+static struct rm_class *
+clh_to_clp(cbq_state_t *cbqp, u_int32_t chandle)
+{
+ int i;
+ struct rm_class *cl;
+
+ if (chandle == 0)
+ return (NULL);
+ /*
+ * first, try optimistically the slot matching the lower bits of
+ * the handle. if it fails, do the linear table search.
+ */
+ i = chandle % CBQ_MAX_CLASSES;
+ if ((cl = cbqp->cbq_class_tbl[i]) != NULL &&
+ cl->stats_.handle == chandle)
+ return (cl);
+ for (i = 0; i < CBQ_MAX_CLASSES; i++)
+ if ((cl = cbqp->cbq_class_tbl[i]) != NULL &&
+ cl->stats_.handle == chandle)
+ return (cl);
+ return (NULL);
+}
+
+static int
+cbq_clear_interface(cbq_state_t *cbqp)
+{
+ int again, i;
+ struct rm_class *cl;
+
+#ifdef ALTQ3_CLFIER_COMPAT
+ /* free the filters for this interface */
+ acc_discard_filters(&cbqp->cbq_classifier, NULL, 1);
+#endif
+
+ /* clear out the classes now */
+ do {
+ again = 0;
+ for (i = 0; i < CBQ_MAX_CLASSES; i++) {
+ if ((cl = cbqp->cbq_class_tbl[i]) != NULL) {
+ if (is_a_parent_class(cl))
+ again++;
+ else {
+ cbq_class_destroy(cbqp, cl);
+ cbqp->cbq_class_tbl[i] = NULL;
+ if (cl == cbqp->ifnp.root_)
+ cbqp->ifnp.root_ = NULL;
+ if (cl == cbqp->ifnp.default_)
+ cbqp->ifnp.default_ = NULL;
+#ifdef ALTQ3_COMPAT
+ if (cl == cbqp->ifnp.ctl_)
+ cbqp->ifnp.ctl_ = NULL;
+#endif
+ }
+ }
+ }
+ } while (again);
+
+ return (0);
+}
+
+static int
+cbq_request(struct ifaltq *ifq, int req, void *arg)
+{
+ cbq_state_t *cbqp = (cbq_state_t *)ifq->altq_disc;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ switch (req) {
+ case ALTRQ_PURGE:
+ cbq_purge(cbqp);
+ break;
+ }
+ return (0);
+}
+
+/* copy the stats info in rm_class to class_states_t */
+static void
+get_class_stats(class_stats_t *statsp, struct rm_class *cl)
+{
+ statsp->xmit_cnt = cl->stats_.xmit_cnt;
+ statsp->drop_cnt = cl->stats_.drop_cnt;
+ statsp->over = cl->stats_.over;
+ statsp->borrows = cl->stats_.borrows;
+ statsp->overactions = cl->stats_.overactions;
+ statsp->delays = cl->stats_.delays;
+
+ statsp->depth = cl->depth_;
+ statsp->priority = cl->pri_;
+ statsp->maxidle = cl->maxidle_;
+ statsp->minidle = cl->minidle_;
+ statsp->offtime = cl->offtime_;
+ statsp->qmax = qlimit(cl->q_);
+ statsp->ns_per_byte = cl->ns_per_byte_;
+ statsp->wrr_allot = cl->w_allotment_;
+ statsp->qcnt = qlen(cl->q_);
+ statsp->avgidle = cl->avgidle_;
+
+ statsp->qtype = qtype(cl->q_);
+#ifdef ALTQ_RED
+ if (q_is_red(cl->q_))
+ red_getstats(cl->red_, &statsp->red[0]);
+#endif
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->q_))
+ rio_getstats((rio_t *)cl->red_, &statsp->red[0]);
+#endif
+}
+
+int
+cbq_pfattach(struct pf_altq *a)
+{
+ struct ifnet *ifp;
+ int s, error;
+
+ if ((ifp = ifunit(a->ifname)) == NULL || a->altq_disc == NULL)
+ return (EINVAL);
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ error = altq_attach(&ifp->if_snd, ALTQT_CBQ, a->altq_disc,
+ cbq_enqueue, cbq_dequeue, cbq_request, NULL, NULL);
+ splx(s);
+ return (error);
+}
+
+int
+cbq_add_altq(struct pf_altq *a)
+{
+ cbq_state_t *cbqp;
+ struct ifnet *ifp;
+
+ if ((ifp = ifunit(a->ifname)) == NULL)
+ return (EINVAL);
+ if (!ALTQ_IS_READY(&ifp->if_snd))
+ return (ENODEV);
+
+ /* allocate and initialize cbq_state_t */
+ MALLOC(cbqp, cbq_state_t *, sizeof(cbq_state_t), M_DEVBUF, M_WAITOK);
+ if (cbqp == NULL)
+ return (ENOMEM);
+ bzero(cbqp, sizeof(cbq_state_t));
+ CALLOUT_INIT(&cbqp->cbq_callout);
+ cbqp->cbq_qlen = 0;
+ cbqp->ifnp.ifq_ = &ifp->if_snd; /* keep the ifq */
+
+ /* keep the state in pf_altq */
+ a->altq_disc = cbqp;
+
+ return (0);
+}
+
+int
+cbq_remove_altq(struct pf_altq *a)
+{
+ cbq_state_t *cbqp;
+
+ if ((cbqp = a->altq_disc) == NULL)
+ return (EINVAL);
+ a->altq_disc = NULL;
+
+ cbq_clear_interface(cbqp);
+
+ if (cbqp->ifnp.default_)
+ cbq_class_destroy(cbqp, cbqp->ifnp.default_);
+ if (cbqp->ifnp.root_)
+ cbq_class_destroy(cbqp, cbqp->ifnp.root_);
+
+ /* deallocate cbq_state_t */
+ FREE(cbqp, M_DEVBUF);
+
+ return (0);
+}
+
+int
+cbq_add_queue(struct pf_altq *a)
+{
+ struct rm_class *borrow, *parent;
+ cbq_state_t *cbqp;
+ struct rm_class *cl;
+ struct cbq_opts *opts;
+ int i;
+
+ if ((cbqp = a->altq_disc) == NULL)
+ return (EINVAL);
+ if (a->qid == 0)
+ return (EINVAL);
+
+ /*
+ * find a free slot in the class table. if the slot matching
+ * the lower bits of qid is free, use this slot. otherwise,
+ * use the first free slot.
+ */
+ i = a->qid % CBQ_MAX_CLASSES;
+ if (cbqp->cbq_class_tbl[i] != NULL) {
+ for (i = 0; i < CBQ_MAX_CLASSES; i++)
+ if (cbqp->cbq_class_tbl[i] == NULL)
+ break;
+ if (i == CBQ_MAX_CLASSES)
+ return (EINVAL);
+ }
+
+ opts = &a->pq_u.cbq_opts;
+ /* check parameters */
+ if (a->priority >= CBQ_MAXPRI)
+ return (EINVAL);
+
+ /* Get pointers to parent and borrow classes. */
+ parent = clh_to_clp(cbqp, a->parent_qid);
+ if (opts->flags & CBQCLF_BORROW)
+ borrow = parent;
+ else
+ borrow = NULL;
+
+ /*
+ * A class must borrow from it's parent or it can not
+ * borrow at all. Hence, borrow can be null.
+ */
+ if (parent == NULL && (opts->flags & CBQCLF_ROOTCLASS) == 0) {
+ printf("cbq_add_queue: no parent class!\n");
+ return (EINVAL);
+ }
+
+ if ((borrow != parent) && (borrow != NULL)) {
+ printf("cbq_add_class: borrow class != parent\n");
+ return (EINVAL);
+ }
+
+ /*
+ * check parameters
+ */
+ switch (opts->flags & CBQCLF_CLASSMASK) {
+ case CBQCLF_ROOTCLASS:
+ if (parent != NULL)
+ return (EINVAL);
+ if (cbqp->ifnp.root_)
+ return (EINVAL);
+ break;
+ case CBQCLF_DEFCLASS:
+ if (cbqp->ifnp.default_)
+ return (EINVAL);
+ break;
+ case 0:
+ if (a->qid == 0)
+ return (EINVAL);
+ break;
+ default:
+ /* more than two flags bits set */
+ return (EINVAL);
+ }
+
+ /*
+ * create a class. if this is a root class, initialize the
+ * interface.
+ */
+ if ((opts->flags & CBQCLF_CLASSMASK) == CBQCLF_ROOTCLASS) {
+ rmc_init(cbqp->ifnp.ifq_, &cbqp->ifnp, opts->ns_per_byte,
+ cbqrestart, a->qlimit, RM_MAXQUEUED,
+ opts->maxidle, opts->minidle, opts->offtime,
+ opts->flags);
+ cl = cbqp->ifnp.root_;
+ } else {
+ cl = rmc_newclass(a->priority,
+ &cbqp->ifnp, opts->ns_per_byte,
+ rmc_delay_action, a->qlimit, parent, borrow,
+ opts->maxidle, opts->minidle, opts->offtime,
+ opts->pktsize, opts->flags);
+ }
+ if (cl == NULL)
+ return (ENOMEM);
+
+ /* return handle to user space. */
+ cl->stats_.handle = a->qid;
+ cl->stats_.depth = cl->depth_;
+
+ /* save the allocated class */
+ cbqp->cbq_class_tbl[i] = cl;
+
+ if ((opts->flags & CBQCLF_CLASSMASK) == CBQCLF_DEFCLASS)
+ cbqp->ifnp.default_ = cl;
+
+ return (0);
+}
+
+int
+cbq_remove_queue(struct pf_altq *a)
+{
+ struct rm_class *cl;
+ cbq_state_t *cbqp;
+ int i;
+
+ if ((cbqp = a->altq_disc) == NULL)
+ return (EINVAL);
+
+ if ((cl = clh_to_clp(cbqp, a->qid)) == NULL)
+ return (EINVAL);
+
+ /* if we are a parent class, then return an error. */
+ if (is_a_parent_class(cl))
+ return (EINVAL);
+
+ /* delete the class */
+ rmc_delete_class(&cbqp->ifnp, cl);
+
+ /*
+ * free the class handle
+ */
+ for (i = 0; i < CBQ_MAX_CLASSES; i++)
+ if (cbqp->cbq_class_tbl[i] == cl) {
+ cbqp->cbq_class_tbl[i] = NULL;
+ if (cl == cbqp->ifnp.root_)
+ cbqp->ifnp.root_ = NULL;
+ if (cl == cbqp->ifnp.default_)
+ cbqp->ifnp.default_ = NULL;
+ break;
+ }
+
+ return (0);
+}
+
+int
+cbq_getqstats(struct pf_altq *a, void *ubuf, int *nbytes)
+{
+ cbq_state_t *cbqp;
+ struct rm_class *cl;
+ class_stats_t stats;
+ int error = 0;
+
+ if ((cbqp = altq_lookup(a->ifname, ALTQT_CBQ)) == NULL)
+ return (EBADF);
+
+ if ((cl = clh_to_clp(cbqp, a->qid)) == NULL)
+ return (EINVAL);
+
+ if (*nbytes < sizeof(stats))
+ return (EINVAL);
+
+ get_class_stats(&stats, cl);
+
+ if ((error = copyout((caddr_t)&stats, ubuf, sizeof(stats))) != 0)
+ return (error);
+ *nbytes = sizeof(stats);
+ return (0);
+}
+
+/*
+ * int
+ * cbq_enqueue(struct ifaltq *ifq, struct mbuf *m, struct altq_pktattr *pattr)
+ * - Queue data packets.
+ *
+ * cbq_enqueue is set to ifp->if_altqenqueue and called by an upper
+ * layer (e.g. ether_output). cbq_enqueue queues the given packet
+ * to the cbq, then invokes the driver's start routine.
+ *
+ * Assumptions: called in splimp
+ * Returns: 0 if the queueing is successful.
+ * ENOBUFS if a packet dropping occurred as a result of
+ * the queueing.
+ */
+
+static int
+cbq_enqueue(struct ifaltq *ifq, struct mbuf *m, struct altq_pktattr *pktattr)
+{
+ cbq_state_t *cbqp = (cbq_state_t *)ifq->altq_disc;
+ struct rm_class *cl;
+ struct m_tag *t;
+ int len;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ /* grab class set by classifier */
+ if ((m->m_flags & M_PKTHDR) == 0) {
+ /* should not happen */
+#if defined(__NetBSD__) || defined(__OpenBSD__)\
+ || (defined(__FreeBSD__) && __FreeBSD_version >= 501113)
+ printf("altq: packet for %s does not have pkthdr\n",
+ ifq->altq_ifp->if_xname);
+#else
+ printf("altq: packet for %s%d does not have pkthdr\n",
+ ifq->altq_ifp->if_name, ifq->altq_ifp->if_unit);
+#endif
+ m_freem(m);
+ return (ENOBUFS);
+ }
+ cl = NULL;
+ if ((t = m_tag_find(m, PACKET_TAG_PF_QID, NULL)) != NULL)
+ cl = clh_to_clp(cbqp, ((struct altq_tag *)(t+1))->qid);
+#ifdef ALTQ3_COMPAT
+ else if ((ifq->altq_flags & ALTQF_CLASSIFY) && pktattr != NULL)
+ cl = pktattr->pattr_class;
+#endif
+ if (cl == NULL) {
+ cl = cbqp->ifnp.default_;
+ if (cl == NULL) {
+ m_freem(m);
+ return (ENOBUFS);
+ }
+ }
+#ifdef ALTQ3_COMPAT
+ if (pktattr != NULL)
+ cl->pktattr_ = pktattr; /* save proto hdr used by ECN */
+ else
+#endif
+ cl->pktattr_ = NULL;
+ len = m_pktlen(m);
+ if (rmc_queue_packet(cl, m) != 0) {
+ /* drop occurred. some mbuf was freed in rmc_queue_packet. */
+ PKTCNTR_ADD(&cl->stats_.drop_cnt, len);
+ return (ENOBUFS);
+ }
+
+ /* successfully queued. */
+ ++cbqp->cbq_qlen;
+ IFQ_INC_LEN(ifq);
+ return (0);
+}
+
+static struct mbuf *
+cbq_dequeue(struct ifaltq *ifq, int op)
+{
+ cbq_state_t *cbqp = (cbq_state_t *)ifq->altq_disc;
+ struct mbuf *m;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ m = rmc_dequeue_next(&cbqp->ifnp, op);
+
+ if (m && op == ALTDQ_REMOVE) {
+ --cbqp->cbq_qlen; /* decrement # of packets in cbq */
+ IFQ_DEC_LEN(ifq);
+
+ /* Update the class. */
+ rmc_update_class_util(&cbqp->ifnp);
+ }
+ return (m);
+}
+
+/*
+ * void
+ * cbqrestart(queue_t *) - Restart sending of data.
+ * called from rmc_restart in splimp via timeout after waking up
+ * a suspended class.
+ * Returns: NONE
+ */
+
+static void
+cbqrestart(struct ifaltq *ifq)
+{
+ cbq_state_t *cbqp;
+ struct ifnet *ifp;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ if (!ALTQ_IS_ENABLED(ifq))
+ /* cbq must have been detached */
+ return;
+
+ if ((cbqp = (cbq_state_t *)ifq->altq_disc) == NULL)
+ /* should not happen */
+ return;
+
+ ifp = ifq->altq_ifp;
+ if (ifp->if_start &&
+ cbqp->cbq_qlen > 0 && (ifp->if_drv_flags & IFF_DRV_OACTIVE) == 0) {
+ IFQ_UNLOCK(ifq);
+ (*ifp->if_start)(ifp);
+ IFQ_LOCK(ifq);
+ }
+}
+
+static void cbq_purge(cbq_state_t *cbqp)
+{
+ struct rm_class *cl;
+ int i;
+
+ for (i = 0; i < CBQ_MAX_CLASSES; i++)
+ if ((cl = cbqp->cbq_class_tbl[i]) != NULL)
+ rmc_dropall(cl);
+ if (ALTQ_IS_ENABLED(cbqp->ifnp.ifq_))
+ cbqp->ifnp.ifq_->ifq_len = 0;
+}
+#ifdef ALTQ3_COMPAT
+
+static int
+cbq_add_class(acp)
+ struct cbq_add_class *acp;
+{
+ char *ifacename;
+ struct rm_class *borrow, *parent;
+ cbq_state_t *cbqp;
+
+ ifacename = acp->cbq_iface.cbq_ifacename;
+ if ((cbqp = altq_lookup(ifacename, ALTQT_CBQ)) == NULL)
+ return (EBADF);
+
+ /* check parameters */
+ if (acp->cbq_class.priority >= CBQ_MAXPRI ||
+ acp->cbq_class.maxq > CBQ_MAXQSIZE)
+ return (EINVAL);
+
+ /* Get pointers to parent and borrow classes. */
+ parent = clh_to_clp(cbqp, acp->cbq_class.parent_class_handle);
+ borrow = clh_to_clp(cbqp, acp->cbq_class.borrow_class_handle);
+
+ /*
+ * A class must borrow from it's parent or it can not
+ * borrow at all. Hence, borrow can be null.
+ */
+ if (parent == NULL && (acp->cbq_class.flags & CBQCLF_ROOTCLASS) == 0) {
+ printf("cbq_add_class: no parent class!\n");
+ return (EINVAL);
+ }
+
+ if ((borrow != parent) && (borrow != NULL)) {
+ printf("cbq_add_class: borrow class != parent\n");
+ return (EINVAL);
+ }
+
+ return cbq_class_create(cbqp, acp, parent, borrow);
+}
+
+static int
+cbq_delete_class(dcp)
+ struct cbq_delete_class *dcp;
+{
+ char *ifacename;
+ struct rm_class *cl;
+ cbq_state_t *cbqp;
+
+ ifacename = dcp->cbq_iface.cbq_ifacename;
+ if ((cbqp = altq_lookup(ifacename, ALTQT_CBQ)) == NULL)
+ return (EBADF);
+
+ if ((cl = clh_to_clp(cbqp, dcp->cbq_class_handle)) == NULL)
+ return (EINVAL);
+
+ /* if we are a parent class, then return an error. */
+ if (is_a_parent_class(cl))
+ return (EINVAL);
+
+ /* if a filter has a reference to this class delete the filter */
+ acc_discard_filters(&cbqp->cbq_classifier, cl, 0);
+
+ return cbq_class_destroy(cbqp, cl);
+}
+
+static int
+cbq_modify_class(acp)
+ struct cbq_modify_class *acp;
+{
+ char *ifacename;
+ struct rm_class *cl;
+ cbq_state_t *cbqp;
+
+ ifacename = acp->cbq_iface.cbq_ifacename;
+ if ((cbqp = altq_lookup(ifacename, ALTQT_CBQ)) == NULL)
+ return (EBADF);
+
+ /* Get pointer to this class */
+ if ((cl = clh_to_clp(cbqp, acp->cbq_class_handle)) == NULL)
+ return (EINVAL);
+
+ if (rmc_modclass(cl, acp->cbq_class.nano_sec_per_byte,
+ acp->cbq_class.maxq, acp->cbq_class.maxidle,
+ acp->cbq_class.minidle, acp->cbq_class.offtime,
+ acp->cbq_class.pktsize) < 0)
+ return (EINVAL);
+ return (0);
+}
+
+/*
+ * struct rm_class *
+ * cbq_class_create(cbq_mod_state_t *cbqp, struct cbq_add_class *acp,
+ * struct rm_class *parent, struct rm_class *borrow)
+ *
+ * This function create a new traffic class in the CBQ class hierarchy of
+ * given paramters. The class that created is either the root, default,
+ * or a new dynamic class. If CBQ is not initilaized, the the root class
+ * will be created.
+ */
+static int
+cbq_class_create(cbqp, acp, parent, borrow)
+ cbq_state_t *cbqp;
+ struct cbq_add_class *acp;
+ struct rm_class *parent, *borrow;
+{
+ struct rm_class *cl;
+ cbq_class_spec_t *spec = &acp->cbq_class;
+ u_int32_t chandle;
+ int i;
+
+ /*
+ * allocate class handle
+ */
+ for (i = 1; i < CBQ_MAX_CLASSES; i++)
+ if (cbqp->cbq_class_tbl[i] == NULL)
+ break;
+ if (i == CBQ_MAX_CLASSES)
+ return (EINVAL);
+ chandle = i; /* use the slot number as class handle */
+
+ /*
+ * create a class. if this is a root class, initialize the
+ * interface.
+ */
+ if ((spec->flags & CBQCLF_CLASSMASK) == CBQCLF_ROOTCLASS) {
+ rmc_init(cbqp->ifnp.ifq_, &cbqp->ifnp, spec->nano_sec_per_byte,
+ cbqrestart, spec->maxq, RM_MAXQUEUED,
+ spec->maxidle, spec->minidle, spec->offtime,
+ spec->flags);
+ cl = cbqp->ifnp.root_;
+ } else {
+ cl = rmc_newclass(spec->priority,
+ &cbqp->ifnp, spec->nano_sec_per_byte,
+ rmc_delay_action, spec->maxq, parent, borrow,
+ spec->maxidle, spec->minidle, spec->offtime,
+ spec->pktsize, spec->flags);
+ }
+ if (cl == NULL)
+ return (ENOMEM);
+
+ /* return handle to user space. */
+ acp->cbq_class_handle = chandle;
+
+ cl->stats_.handle = chandle;
+ cl->stats_.depth = cl->depth_;
+
+ /* save the allocated class */
+ cbqp->cbq_class_tbl[i] = cl;
+
+ if ((spec->flags & CBQCLF_CLASSMASK) == CBQCLF_DEFCLASS)
+ cbqp->ifnp.default_ = cl;
+ if ((spec->flags & CBQCLF_CLASSMASK) == CBQCLF_CTLCLASS)
+ cbqp->ifnp.ctl_ = cl;
+
+ return (0);
+}
+
+static int
+cbq_add_filter(afp)
+ struct cbq_add_filter *afp;
+{
+ char *ifacename;
+ cbq_state_t *cbqp;
+ struct rm_class *cl;
+
+ ifacename = afp->cbq_iface.cbq_ifacename;
+ if ((cbqp = altq_lookup(ifacename, ALTQT_CBQ)) == NULL)
+ return (EBADF);
+
+ /* Get the pointer to class. */
+ if ((cl = clh_to_clp(cbqp, afp->cbq_class_handle)) == NULL)
+ return (EINVAL);
+
+ return acc_add_filter(&cbqp->cbq_classifier, &afp->cbq_filter,
+ cl, &afp->cbq_filter_handle);
+}
+
+static int
+cbq_delete_filter(dfp)
+ struct cbq_delete_filter *dfp;
+{
+ char *ifacename;
+ cbq_state_t *cbqp;
+
+ ifacename = dfp->cbq_iface.cbq_ifacename;
+ if ((cbqp = altq_lookup(ifacename, ALTQT_CBQ)) == NULL)
+ return (EBADF);
+
+ return acc_delete_filter(&cbqp->cbq_classifier,
+ dfp->cbq_filter_handle);
+}
+
+/*
+ * cbq_clear_hierarchy deletes all classes and their filters on the
+ * given interface.
+ */
+static int
+cbq_clear_hierarchy(ifacep)
+ struct cbq_interface *ifacep;
+{
+ char *ifacename;
+ cbq_state_t *cbqp;
+
+ ifacename = ifacep->cbq_ifacename;
+ if ((cbqp = altq_lookup(ifacename, ALTQT_CBQ)) == NULL)
+ return (EBADF);
+
+ return cbq_clear_interface(cbqp);
+}
+
+/*
+ * static int
+ * cbq_set_enable(struct cbq_enable *ep) - this function processed the
+ * ioctl request to enable class based queueing. It searches the list
+ * of interfaces for the specified interface and then enables CBQ on
+ * that interface.
+ *
+ * Returns: 0, for no error.
+ * EBADF, for specified inteface not found.
+ */
+
+static int
+cbq_set_enable(ep, enable)
+ struct cbq_interface *ep;
+ int enable;
+{
+ int error = 0;
+ cbq_state_t *cbqp;
+ char *ifacename;
+
+ ifacename = ep->cbq_ifacename;
+ if ((cbqp = altq_lookup(ifacename, ALTQT_CBQ)) == NULL)
+ return (EBADF);
+
+ switch (enable) {
+ case ENABLE:
+ if (cbqp->ifnp.root_ == NULL || cbqp->ifnp.default_ == NULL ||
+ cbqp->ifnp.ctl_ == NULL) {
+ if (cbqp->ifnp.root_ == NULL)
+ printf("No Root Class for %s\n", ifacename);
+ if (cbqp->ifnp.default_ == NULL)
+ printf("No Default Class for %s\n", ifacename);
+ if (cbqp->ifnp.ctl_ == NULL)
+ printf("No Control Class for %s\n", ifacename);
+ error = EINVAL;
+ } else if ((error = altq_enable(cbqp->ifnp.ifq_)) == 0) {
+ cbqp->cbq_qlen = 0;
+ }
+ break;
+
+ case DISABLE:
+ error = altq_disable(cbqp->ifnp.ifq_);
+ break;
+ }
+ return (error);
+}
+
+static int
+cbq_getstats(gsp)
+ struct cbq_getstats *gsp;
+{
+ char *ifacename;
+ int i, n, nclasses;
+ cbq_state_t *cbqp;
+ struct rm_class *cl;
+ class_stats_t stats, *usp;
+ int error = 0;
+
+ ifacename = gsp->iface.cbq_ifacename;
+ nclasses = gsp->nclasses;
+ usp = gsp->stats;
+
+ if ((cbqp = altq_lookup(ifacename, ALTQT_CBQ)) == NULL)
+ return (EBADF);
+ if (nclasses <= 0)
+ return (EINVAL);
+
+ for (n = 0, i = 0; n < nclasses && i < CBQ_MAX_CLASSES; n++, i++) {
+ while ((cl = cbqp->cbq_class_tbl[i]) == NULL)
+ if (++i >= CBQ_MAX_CLASSES)
+ goto out;
+
+ get_class_stats(&stats, cl);
+ stats.handle = cl->stats_.handle;
+
+ if ((error = copyout((caddr_t)&stats, (caddr_t)usp++,
+ sizeof(stats))) != 0)
+ return (error);
+ }
+
+ out:
+ gsp->nclasses = n;
+ return (error);
+}
+
+static int
+cbq_ifattach(ifacep)
+ struct cbq_interface *ifacep;
+{
+ int error = 0;
+ char *ifacename;
+ cbq_state_t *new_cbqp;
+ struct ifnet *ifp;
+
+ ifacename = ifacep->cbq_ifacename;
+ if ((ifp = ifunit(ifacename)) == NULL)
+ return (ENXIO);
+ if (!ALTQ_IS_READY(&ifp->if_snd))
+ return (ENXIO);
+
+ /* allocate and initialize cbq_state_t */
+ MALLOC(new_cbqp, cbq_state_t *, sizeof(cbq_state_t), M_DEVBUF, M_WAITOK);
+ if (new_cbqp == NULL)
+ return (ENOMEM);
+ bzero(new_cbqp, sizeof(cbq_state_t));
+ CALLOUT_INIT(&new_cbqp->cbq_callout);
+
+ new_cbqp->cbq_qlen = 0;
+ new_cbqp->ifnp.ifq_ = &ifp->if_snd; /* keep the ifq */
+
+ /*
+ * set CBQ to this ifnet structure.
+ */
+ error = altq_attach(&ifp->if_snd, ALTQT_CBQ, new_cbqp,
+ cbq_enqueue, cbq_dequeue, cbq_request,
+ &new_cbqp->cbq_classifier, acc_classify);
+ if (error) {
+ FREE(new_cbqp, M_DEVBUF);
+ return (error);
+ }
+
+ /* prepend to the list of cbq_state_t's. */
+ new_cbqp->cbq_next = cbq_list;
+ cbq_list = new_cbqp;
+
+ return (0);
+}
+
+static int
+cbq_ifdetach(ifacep)
+ struct cbq_interface *ifacep;
+{
+ char *ifacename;
+ cbq_state_t *cbqp;
+
+ ifacename = ifacep->cbq_ifacename;
+ if ((cbqp = altq_lookup(ifacename, ALTQT_CBQ)) == NULL)
+ return (EBADF);
+
+ (void)cbq_set_enable(ifacep, DISABLE);
+
+ cbq_clear_interface(cbqp);
+
+ /* remove CBQ from the ifnet structure. */
+ (void)altq_detach(cbqp->ifnp.ifq_);
+
+ /* remove from the list of cbq_state_t's. */
+ if (cbq_list == cbqp)
+ cbq_list = cbqp->cbq_next;
+ else {
+ cbq_state_t *cp;
+
+ for (cp = cbq_list; cp != NULL; cp = cp->cbq_next)
+ if (cp->cbq_next == cbqp) {
+ cp->cbq_next = cbqp->cbq_next;
+ break;
+ }
+ ASSERT(cp != NULL);
+ }
+
+ /* deallocate cbq_state_t */
+ FREE(cbqp, M_DEVBUF);
+
+ return (0);
+}
+
+/*
+ * cbq device interface
+ */
+
+altqdev_decl(cbq);
+
+int
+cbqopen(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ return (0);
+}
+
+int
+cbqclose(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ struct ifnet *ifp;
+ struct cbq_interface iface;
+ int err, error = 0;
+
+ while (cbq_list) {
+ ifp = cbq_list->ifnp.ifq_->altq_ifp;
+#if defined(__NetBSD__) || defined(__OpenBSD__)\
+ || (defined(__FreeBSD__) && __FreeBSD_version >= 501113)
+ sprintf(iface.cbq_ifacename, "%s", ifp->if_xname);
+#else
+ sprintf(iface.cbq_ifacename,
+ "%s%d", ifp->if_name, ifp->if_unit);
+#endif
+ err = cbq_ifdetach(&iface);
+ if (err != 0 && error == 0)
+ error = err;
+ }
+
+ return (error);
+}
+
+int
+cbqioctl(dev, cmd, addr, flag, p)
+ dev_t dev;
+ ioctlcmd_t cmd;
+ caddr_t addr;
+ int flag;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ int error = 0;
+
+ /* check cmd for superuser only */
+ switch (cmd) {
+ case CBQ_GETSTATS:
+ /* currently only command that an ordinary user can call */
+ break;
+ default:
+#if (__FreeBSD_version > 700000)
+ error = priv_check(p, PRIV_ALTQ_MANAGE);
+#elsif (__FreeBSD_version > 400000)
+ error = suser(p);
+#else
+ error = suser(p->p_ucred, &p->p_acflag);
+#endif
+ if (error)
+ return (error);
+ break;
+ }
+
+ switch (cmd) {
+
+ case CBQ_ENABLE:
+ error = cbq_set_enable((struct cbq_interface *)addr, ENABLE);
+ break;
+
+ case CBQ_DISABLE:
+ error = cbq_set_enable((struct cbq_interface *)addr, DISABLE);
+ break;
+
+ case CBQ_ADD_FILTER:
+ error = cbq_add_filter((struct cbq_add_filter *)addr);
+ break;
+
+ case CBQ_DEL_FILTER:
+ error = cbq_delete_filter((struct cbq_delete_filter *)addr);
+ break;
+
+ case CBQ_ADD_CLASS:
+ error = cbq_add_class((struct cbq_add_class *)addr);
+ break;
+
+ case CBQ_DEL_CLASS:
+ error = cbq_delete_class((struct cbq_delete_class *)addr);
+ break;
+
+ case CBQ_MODIFY_CLASS:
+ error = cbq_modify_class((struct cbq_modify_class *)addr);
+ break;
+
+ case CBQ_CLEAR_HIERARCHY:
+ error = cbq_clear_hierarchy((struct cbq_interface *)addr);
+ break;
+
+ case CBQ_IF_ATTACH:
+ error = cbq_ifattach((struct cbq_interface *)addr);
+ break;
+
+ case CBQ_IF_DETACH:
+ error = cbq_ifdetach((struct cbq_interface *)addr);
+ break;
+
+ case CBQ_GETSTATS:
+ error = cbq_getstats((struct cbq_getstats *)addr);
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+
+ return error;
+}
+
+#if 0
+/* for debug */
+static void cbq_class_dump(int);
+
+static void cbq_class_dump(i)
+ int i;
+{
+ struct rm_class *cl;
+ rm_class_stats_t *s;
+ struct _class_queue_ *q;
+
+ if (cbq_list == NULL) {
+ printf("cbq_class_dump: no cbq_state found\n");
+ return;
+ }
+ cl = cbq_list->cbq_class_tbl[i];
+
+ printf("class %d cl=%p\n", i, cl);
+ if (cl != NULL) {
+ s = &cl->stats_;
+ q = cl->q_;
+
+ printf("pri=%d, depth=%d, maxrate=%d, allotment=%d\n",
+ cl->pri_, cl->depth_, cl->maxrate_, cl->allotment_);
+ printf("w_allotment=%d, bytes_alloc=%d, avgidle=%d, maxidle=%d\n",
+ cl->w_allotment_, cl->bytes_alloc_, cl->avgidle_,
+ cl->maxidle_);
+ printf("minidle=%d, offtime=%d, sleeping=%d, leaf=%d\n",
+ cl->minidle_, cl->offtime_, cl->sleeping_, cl->leaf_);
+ printf("handle=%d, depth=%d, packets=%d, bytes=%d\n",
+ s->handle, s->depth,
+ (int)s->xmit_cnt.packets, (int)s->xmit_cnt.bytes);
+ printf("over=%d\n, borrows=%d, drops=%d, overactions=%d, delays=%d\n",
+ s->over, s->borrows, (int)s->drop_cnt.packets,
+ s->overactions, s->delays);
+ printf("tail=%p, head=%p, qlen=%d, qlim=%d, qthresh=%d,qtype=%d\n",
+ q->tail_, q->head_, q->qlen_, q->qlim_,
+ q->qthresh_, q->qtype_);
+ }
+}
+#endif /* 0 */
+
+#ifdef KLD_MODULE
+
+static struct altqsw cbq_sw =
+ {"cbq", cbqopen, cbqclose, cbqioctl};
+
+ALTQ_MODULE(altq_cbq, ALTQT_CBQ, &cbq_sw);
+MODULE_DEPEND(altq_cbq, altq_red, 1, 1, 1);
+MODULE_DEPEND(altq_cbq, altq_rio, 1, 1, 1);
+
+#endif /* KLD_MODULE */
+#endif /* ALTQ3_COMPAT */
+
+#endif /* ALTQ_CBQ */
diff --git a/sys/contrib/altq/altq/altq_cbq.h b/sys/contrib/altq/altq/altq_cbq.h
new file mode 100644
index 0000000..30a15c7
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_cbq.h
@@ -0,0 +1,221 @@
+/* $KAME: altq_cbq.h,v 1.12 2003/10/03 05:05:15 kjc Exp $ */
+
+/*
+ * Copyright (c) Sun Microsystems, Inc. 1993-1998 All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the SMCC Technology
+ * Development Group at Sun Microsystems, Inc.
+ *
+ * 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * SUN MICROSYSTEMS DOES NOT CLAIM MERCHANTABILITY OF THIS SOFTWARE OR THE
+ * SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE. The software is
+ * provided "as is" without express or implied warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this software.
+ */
+
+#ifndef _ALTQ_ALTQ_CBQ_H_
+#define _ALTQ_ALTQ_CBQ_H_
+
+#include <altq/altq.h>
+#include <altq/altq_rmclass.h>
+#include <altq/altq_red.h>
+#include <altq/altq_rio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define NULL_CLASS_HANDLE 0
+
+/* class flags should be same as class flags in rm_class.h */
+#define CBQCLF_RED 0x0001 /* use RED */
+#define CBQCLF_ECN 0x0002 /* use RED/ECN */
+#define CBQCLF_RIO 0x0004 /* use RIO */
+#define CBQCLF_FLOWVALVE 0x0008 /* use flowvalve (aka penalty-box) */
+#define CBQCLF_CLEARDSCP 0x0010 /* clear diffserv codepoint */
+#define CBQCLF_BORROW 0x0020 /* borrow from parent */
+
+/* class flags only for root class */
+#define CBQCLF_WRR 0x0100 /* weighted-round robin */
+#define CBQCLF_EFFICIENT 0x0200 /* work-conserving */
+
+/* class flags for special classes */
+#define CBQCLF_ROOTCLASS 0x1000 /* root class */
+#define CBQCLF_DEFCLASS 0x2000 /* default class */
+#ifdef ALTQ3_COMPAT
+#define CBQCLF_CTLCLASS 0x4000 /* control class */
+#endif
+#define CBQCLF_CLASSMASK 0xf000 /* class mask */
+
+#define CBQ_MAXQSIZE 200
+#define CBQ_MAXPRI RM_MAXPRIO
+
+typedef struct _cbq_class_stats_ {
+ u_int32_t handle;
+ u_int depth;
+
+ struct pktcntr xmit_cnt; /* packets sent in this class */
+ struct pktcntr drop_cnt; /* dropped packets */
+ u_int over; /* # times went over limit */
+ u_int borrows; /* # times tried to borrow */
+ u_int overactions; /* # times invoked overlimit action */
+ u_int delays; /* # times invoked delay actions */
+
+ /* other static class parameters useful for debugging */
+ int priority;
+ int maxidle;
+ int minidle;
+ int offtime;
+ int qmax;
+ int ns_per_byte;
+ int wrr_allot;
+
+ int qcnt; /* # packets in queue */
+ int avgidle;
+
+ /* red and rio related info */
+ int qtype;
+ struct redstats red[3];
+} class_stats_t;
+
+#ifdef ALTQ3_COMPAT
+/*
+ * Define structures associated with IOCTLS for cbq.
+ */
+
+/*
+ * Define the CBQ interface structure. This must be included in all
+ * IOCTL's such that the CBQ driver may find the appropriate CBQ module
+ * associated with the network interface to be affected.
+ */
+struct cbq_interface {
+ char cbq_ifacename[IFNAMSIZ];
+};
+
+typedef struct cbq_class_spec {
+ u_int priority;
+ u_int nano_sec_per_byte;
+ u_int maxq;
+ u_int maxidle;
+ int minidle;
+ u_int offtime;
+ u_int32_t parent_class_handle;
+ u_int32_t borrow_class_handle;
+
+ u_int pktsize;
+ int flags;
+} cbq_class_spec_t;
+
+struct cbq_add_class {
+ struct cbq_interface cbq_iface;
+
+ cbq_class_spec_t cbq_class;
+ u_int32_t cbq_class_handle;
+};
+
+struct cbq_delete_class {
+ struct cbq_interface cbq_iface;
+ u_int32_t cbq_class_handle;
+};
+
+struct cbq_modify_class {
+ struct cbq_interface cbq_iface;
+
+ cbq_class_spec_t cbq_class;
+ u_int32_t cbq_class_handle;
+};
+
+struct cbq_add_filter {
+ struct cbq_interface cbq_iface;
+ u_int32_t cbq_class_handle;
+ struct flow_filter cbq_filter;
+
+ u_long cbq_filter_handle;
+};
+
+struct cbq_delete_filter {
+ struct cbq_interface cbq_iface;
+ u_long cbq_filter_handle;
+};
+
+/* number of classes are returned in nclasses field */
+struct cbq_getstats {
+ struct cbq_interface iface;
+ int nclasses;
+ class_stats_t *stats;
+};
+
+/*
+ * Define IOCTLs for CBQ.
+ */
+#define CBQ_IF_ATTACH _IOW('Q', 1, struct cbq_interface)
+#define CBQ_IF_DETACH _IOW('Q', 2, struct cbq_interface)
+#define CBQ_ENABLE _IOW('Q', 3, struct cbq_interface)
+#define CBQ_DISABLE _IOW('Q', 4, struct cbq_interface)
+#define CBQ_CLEAR_HIERARCHY _IOW('Q', 5, struct cbq_interface)
+#define CBQ_ADD_CLASS _IOWR('Q', 7, struct cbq_add_class)
+#define CBQ_DEL_CLASS _IOW('Q', 8, struct cbq_delete_class)
+#define CBQ_MODIFY_CLASS _IOWR('Q', 9, struct cbq_modify_class)
+#define CBQ_ADD_FILTER _IOWR('Q', 10, struct cbq_add_filter)
+#define CBQ_DEL_FILTER _IOW('Q', 11, struct cbq_delete_filter)
+#define CBQ_GETSTATS _IOWR('Q', 12, struct cbq_getstats)
+#endif /* ALTQ3_COMPAT */
+
+#ifdef _KERNEL
+/*
+ * Define macros only good for kernel drivers and modules.
+ */
+#define CBQ_WATCHDOG (hz / 20)
+#define CBQ_TIMEOUT 10
+#define CBQ_LS_TIMEOUT (20 * hz / 1000)
+
+#define CBQ_MAX_CLASSES 256
+
+#ifdef ALTQ3_COMPAT
+#define CBQ_MAX_FILTERS 256
+
+#define DISABLE 0x00
+#define ENABLE 0x01
+#endif /* ALTQ3_COMPAT */
+
+/*
+ * Define State structures.
+ */
+typedef struct cbqstate {
+#ifdef ALTQ3_COMPAT
+ struct cbqstate *cbq_next;
+#endif
+ int cbq_qlen; /* # of packets in cbq */
+ struct rm_class *cbq_class_tbl[CBQ_MAX_CLASSES];
+
+ struct rm_ifdat ifnp;
+ struct callout cbq_callout; /* for timeouts */
+#ifdef ALTQ3_CLFIER_COMPAT
+ struct acc_classifier cbq_classifier;
+#endif
+} cbq_state_t;
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_ALTQ_ALTQ_CBQ_H_ */
diff --git a/sys/contrib/altq/altq/altq_cdnr.c b/sys/contrib/altq/altq/altq_cdnr.c
new file mode 100644
index 0000000..3139d51
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_cdnr.c
@@ -0,0 +1,1391 @@
+/* $FreeBSD$ */
+/* $KAME: altq_cdnr.c,v 1.14 2003/09/05 22:40:36 itojun Exp $ */
+
+/*
+ * Copyright (C) 1999-2002
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+#include "opt_altq.h"
+#if (__FreeBSD__ != 2)
+#include "opt_inet.h"
+#ifdef __FreeBSD__
+#include "opt_inet6.h"
+#endif
+#endif
+#endif /* __FreeBSD__ || __NetBSD__ */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/sockio.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/errno.h>
+#include <sys/kernel.h>
+#include <sys/queue.h>
+
+#include <net/if.h>
+#include <net/if_types.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#ifdef INET6
+#include <netinet/ip6.h>
+#endif
+
+#include <altq/altq.h>
+#ifdef ALTQ3_COMPAT
+#include <altq/altq_conf.h>
+#endif
+#include <altq/altq_cdnr.h>
+
+#ifdef ALTQ3_COMPAT
+/*
+ * diffserv traffic conditioning module
+ */
+
+int altq_cdnr_enabled = 0;
+
+/* traffic conditioner is enabled by ALTQ_CDNR option in opt_altq.h */
+#ifdef ALTQ_CDNR
+
+/* cdnr_list keeps all cdnr's allocated. */
+static LIST_HEAD(, top_cdnr) tcb_list;
+
+static int altq_cdnr_input(struct mbuf *, int);
+static struct top_cdnr *tcb_lookup(char *ifname);
+static struct cdnr_block *cdnr_handle2cb(u_long);
+static u_long cdnr_cb2handle(struct cdnr_block *);
+static void *cdnr_cballoc(struct top_cdnr *, int,
+ struct tc_action *(*)(struct cdnr_block *, struct cdnr_pktinfo *));
+static void cdnr_cbdestroy(void *);
+static int tca_verify_action(struct tc_action *);
+static void tca_import_action(struct tc_action *, struct tc_action *);
+static void tca_invalidate_action(struct tc_action *);
+
+static int generic_element_destroy(struct cdnr_block *);
+static struct top_cdnr *top_create(struct ifaltq *);
+static int top_destroy(struct top_cdnr *);
+static struct cdnr_block *element_create(struct top_cdnr *, struct tc_action *);
+static int element_destroy(struct cdnr_block *);
+static void tb_import_profile(struct tbe *, struct tb_profile *);
+static struct tbmeter *tbm_create(struct top_cdnr *, struct tb_profile *,
+ struct tc_action *, struct tc_action *);
+static int tbm_destroy(struct tbmeter *);
+static struct tc_action *tbm_input(struct cdnr_block *, struct cdnr_pktinfo *);
+static struct trtcm *trtcm_create(struct top_cdnr *,
+ struct tb_profile *, struct tb_profile *,
+ struct tc_action *, struct tc_action *, struct tc_action *,
+ int);
+static int trtcm_destroy(struct trtcm *);
+static struct tc_action *trtcm_input(struct cdnr_block *, struct cdnr_pktinfo *);
+static struct tswtcm *tswtcm_create(struct top_cdnr *,
+ u_int32_t, u_int32_t, u_int32_t,
+ struct tc_action *, struct tc_action *, struct tc_action *);
+static int tswtcm_destroy(struct tswtcm *);
+static struct tc_action *tswtcm_input(struct cdnr_block *, struct cdnr_pktinfo *);
+
+static int cdnrcmd_if_attach(char *);
+static int cdnrcmd_if_detach(char *);
+static int cdnrcmd_add_element(struct cdnr_add_element *);
+static int cdnrcmd_delete_element(struct cdnr_delete_element *);
+static int cdnrcmd_add_filter(struct cdnr_add_filter *);
+static int cdnrcmd_delete_filter(struct cdnr_delete_filter *);
+static int cdnrcmd_add_tbm(struct cdnr_add_tbmeter *);
+static int cdnrcmd_modify_tbm(struct cdnr_modify_tbmeter *);
+static int cdnrcmd_tbm_stats(struct cdnr_tbmeter_stats *);
+static int cdnrcmd_add_trtcm(struct cdnr_add_trtcm *);
+static int cdnrcmd_modify_trtcm(struct cdnr_modify_trtcm *);
+static int cdnrcmd_tcm_stats(struct cdnr_tcm_stats *);
+static int cdnrcmd_add_tswtcm(struct cdnr_add_tswtcm *);
+static int cdnrcmd_modify_tswtcm(struct cdnr_modify_tswtcm *);
+static int cdnrcmd_get_stats(struct cdnr_get_stats *);
+
+altqdev_decl(cdnr);
+
+/*
+ * top level input function called from ip_input.
+ * should be called before converting header fields to host-byte-order.
+ */
+int
+altq_cdnr_input(m, af)
+ struct mbuf *m;
+ int af; /* address family */
+{
+ struct ifnet *ifp;
+ struct ip *ip;
+ struct top_cdnr *top;
+ struct tc_action *tca;
+ struct cdnr_block *cb;
+ struct cdnr_pktinfo pktinfo;
+
+ ifp = m->m_pkthdr.rcvif;
+ if (!ALTQ_IS_CNDTNING(&ifp->if_snd))
+ /* traffic conditioner is not enabled on this interface */
+ return (1);
+
+ top = ifp->if_snd.altq_cdnr;
+
+ ip = mtod(m, struct ip *);
+#ifdef INET6
+ if (af == AF_INET6) {
+ u_int32_t flowlabel;
+
+ flowlabel = ((struct ip6_hdr *)ip)->ip6_flow;
+ pktinfo.pkt_dscp = (ntohl(flowlabel) >> 20) & DSCP_MASK;
+ } else
+#endif
+ pktinfo.pkt_dscp = ip->ip_tos & DSCP_MASK;
+ pktinfo.pkt_len = m_pktlen(m);
+
+ tca = NULL;
+
+ cb = acc_classify(&top->tc_classifier, m, af);
+ if (cb != NULL)
+ tca = &cb->cb_action;
+
+ if (tca == NULL)
+ tca = &top->tc_block.cb_action;
+
+ while (1) {
+ PKTCNTR_ADD(&top->tc_cnts[tca->tca_code], pktinfo.pkt_len);
+
+ switch (tca->tca_code) {
+ case TCACODE_PASS:
+ return (1);
+ case TCACODE_DROP:
+ m_freem(m);
+ return (0);
+ case TCACODE_RETURN:
+ return (0);
+ case TCACODE_MARK:
+#ifdef INET6
+ if (af == AF_INET6) {
+ struct ip6_hdr *ip6 = (struct ip6_hdr *)ip;
+ u_int32_t flowlabel;
+
+ flowlabel = ntohl(ip6->ip6_flow);
+ flowlabel = (tca->tca_dscp << 20) |
+ (flowlabel & ~(DSCP_MASK << 20));
+ ip6->ip6_flow = htonl(flowlabel);
+ } else
+#endif
+ ip->ip_tos = tca->tca_dscp |
+ (ip->ip_tos & DSCP_CUMASK);
+ return (1);
+ case TCACODE_NEXT:
+ cb = tca->tca_next;
+ tca = (*cb->cb_input)(cb, &pktinfo);
+ break;
+ case TCACODE_NONE:
+ default:
+ return (1);
+ }
+ }
+}
+
+static struct top_cdnr *
+tcb_lookup(ifname)
+ char *ifname;
+{
+ struct top_cdnr *top;
+ struct ifnet *ifp;
+
+ if ((ifp = ifunit(ifname)) != NULL)
+ LIST_FOREACH(top, &tcb_list, tc_next)
+ if (top->tc_ifq->altq_ifp == ifp)
+ return (top);
+ return (NULL);
+}
+
+static struct cdnr_block *
+cdnr_handle2cb(handle)
+ u_long handle;
+{
+ struct cdnr_block *cb;
+
+ cb = (struct cdnr_block *)handle;
+ if (handle != ALIGN(cb))
+ return (NULL);
+
+ if (cb == NULL || cb->cb_handle != handle)
+ return (NULL);
+ return (cb);
+}
+
+static u_long
+cdnr_cb2handle(cb)
+ struct cdnr_block *cb;
+{
+ return (cb->cb_handle);
+}
+
+static void *
+cdnr_cballoc(top, type, input_func)
+ struct top_cdnr *top;
+ int type;
+ struct tc_action *(*input_func)(struct cdnr_block *,
+ struct cdnr_pktinfo *);
+{
+ struct cdnr_block *cb;
+ int size;
+
+ switch (type) {
+ case TCETYPE_TOP:
+ size = sizeof(struct top_cdnr);
+ break;
+ case TCETYPE_ELEMENT:
+ size = sizeof(struct cdnr_block);
+ break;
+ case TCETYPE_TBMETER:
+ size = sizeof(struct tbmeter);
+ break;
+ case TCETYPE_TRTCM:
+ size = sizeof(struct trtcm);
+ break;
+ case TCETYPE_TSWTCM:
+ size = sizeof(struct tswtcm);
+ break;
+ default:
+ return (NULL);
+ }
+
+ MALLOC(cb, struct cdnr_block *, size, M_DEVBUF, M_WAITOK);
+ if (cb == NULL)
+ return (NULL);
+ bzero(cb, size);
+
+ cb->cb_len = size;
+ cb->cb_type = type;
+ cb->cb_ref = 0;
+ cb->cb_handle = (u_long)cb;
+ if (top == NULL)
+ cb->cb_top = (struct top_cdnr *)cb;
+ else
+ cb->cb_top = top;
+
+ if (input_func != NULL) {
+ /*
+ * if this cdnr has an action function,
+ * make tc_action to call itself.
+ */
+ cb->cb_action.tca_code = TCACODE_NEXT;
+ cb->cb_action.tca_next = cb;
+ cb->cb_input = input_func;
+ } else
+ cb->cb_action.tca_code = TCACODE_NONE;
+
+ /* if this isn't top, register the element to the top level cdnr */
+ if (top != NULL)
+ LIST_INSERT_HEAD(&top->tc_elements, cb, cb_next);
+
+ return ((void *)cb);
+}
+
+static void
+cdnr_cbdestroy(cblock)
+ void *cblock;
+{
+ struct cdnr_block *cb = cblock;
+
+ /* delete filters belonging to this cdnr */
+ acc_discard_filters(&cb->cb_top->tc_classifier, cb, 0);
+
+ /* remove from the top level cdnr */
+ if (cb->cb_top != cblock)
+ LIST_REMOVE(cb, cb_next);
+
+ FREE(cb, M_DEVBUF);
+}
+
+/*
+ * conditioner common destroy routine
+ */
+static int
+generic_element_destroy(cb)
+ struct cdnr_block *cb;
+{
+ int error = 0;
+
+ switch (cb->cb_type) {
+ case TCETYPE_TOP:
+ error = top_destroy((struct top_cdnr *)cb);
+ break;
+ case TCETYPE_ELEMENT:
+ error = element_destroy(cb);
+ break;
+ case TCETYPE_TBMETER:
+ error = tbm_destroy((struct tbmeter *)cb);
+ break;
+ case TCETYPE_TRTCM:
+ error = trtcm_destroy((struct trtcm *)cb);
+ break;
+ case TCETYPE_TSWTCM:
+ error = tswtcm_destroy((struct tswtcm *)cb);
+ break;
+ default:
+ error = EINVAL;
+ }
+ return (error);
+}
+
+static int
+tca_verify_action(utca)
+ struct tc_action *utca;
+{
+ switch (utca->tca_code) {
+ case TCACODE_PASS:
+ case TCACODE_DROP:
+ case TCACODE_MARK:
+ /* these are ok */
+ break;
+
+ case TCACODE_HANDLE:
+ /* verify handle value */
+ if (cdnr_handle2cb(utca->tca_handle) == NULL)
+ return (-1);
+ break;
+
+ case TCACODE_NONE:
+ case TCACODE_RETURN:
+ case TCACODE_NEXT:
+ default:
+ /* should not be passed from a user */
+ return (-1);
+ }
+ return (0);
+}
+
+static void
+tca_import_action(ktca, utca)
+ struct tc_action *ktca, *utca;
+{
+ struct cdnr_block *cb;
+
+ *ktca = *utca;
+ if (ktca->tca_code == TCACODE_HANDLE) {
+ cb = cdnr_handle2cb(ktca->tca_handle);
+ if (cb == NULL) {
+ ktca->tca_code = TCACODE_NONE;
+ return;
+ }
+ ktca->tca_code = TCACODE_NEXT;
+ ktca->tca_next = cb;
+ cb->cb_ref++;
+ } else if (ktca->tca_code == TCACODE_MARK) {
+ ktca->tca_dscp &= DSCP_MASK;
+ }
+ return;
+}
+
+static void
+tca_invalidate_action(tca)
+ struct tc_action *tca;
+{
+ struct cdnr_block *cb;
+
+ if (tca->tca_code == TCACODE_NEXT) {
+ cb = tca->tca_next;
+ if (cb == NULL)
+ return;
+ cb->cb_ref--;
+ }
+ tca->tca_code = TCACODE_NONE;
+}
+
+/*
+ * top level traffic conditioner
+ */
+static struct top_cdnr *
+top_create(ifq)
+ struct ifaltq *ifq;
+{
+ struct top_cdnr *top;
+
+ if ((top = cdnr_cballoc(NULL, TCETYPE_TOP, NULL)) == NULL)
+ return (NULL);
+
+ top->tc_ifq = ifq;
+ /* set default action for the top level conditioner */
+ top->tc_block.cb_action.tca_code = TCACODE_PASS;
+
+ LIST_INSERT_HEAD(&tcb_list, top, tc_next);
+
+ ifq->altq_cdnr = top;
+
+ return (top);
+}
+
+static int
+top_destroy(top)
+ struct top_cdnr *top;
+{
+ struct cdnr_block *cb;
+
+ if (ALTQ_IS_CNDTNING(top->tc_ifq))
+ ALTQ_CLEAR_CNDTNING(top->tc_ifq);
+ top->tc_ifq->altq_cdnr = NULL;
+
+ /*
+ * destroy all the conditioner elements belonging to this interface
+ */
+ while ((cb = LIST_FIRST(&top->tc_elements)) != NULL) {
+ while (cb != NULL && cb->cb_ref > 0)
+ cb = LIST_NEXT(cb, cb_next);
+ if (cb != NULL)
+ generic_element_destroy(cb);
+ }
+
+ LIST_REMOVE(top, tc_next);
+
+ cdnr_cbdestroy(top);
+
+ /* if there is no active conditioner, remove the input hook */
+ if (altq_input != NULL) {
+ LIST_FOREACH(top, &tcb_list, tc_next)
+ if (ALTQ_IS_CNDTNING(top->tc_ifq))
+ break;
+ if (top == NULL)
+ altq_input = NULL;
+ }
+
+ return (0);
+}
+
+/*
+ * simple tc elements without input function (e.g., dropper and makers).
+ */
+static struct cdnr_block *
+element_create(top, action)
+ struct top_cdnr *top;
+ struct tc_action *action;
+{
+ struct cdnr_block *cb;
+
+ if (tca_verify_action(action) < 0)
+ return (NULL);
+
+ if ((cb = cdnr_cballoc(top, TCETYPE_ELEMENT, NULL)) == NULL)
+ return (NULL);
+
+ tca_import_action(&cb->cb_action, action);
+
+ return (cb);
+}
+
+static int
+element_destroy(cb)
+ struct cdnr_block *cb;
+{
+ if (cb->cb_ref > 0)
+ return (EBUSY);
+
+ tca_invalidate_action(&cb->cb_action);
+
+ cdnr_cbdestroy(cb);
+ return (0);
+}
+
+/*
+ * internal representation of token bucket parameters
+ * rate: byte_per_unittime << 32
+ * (((bits_per_sec) / 8) << 32) / machclk_freq
+ * depth: byte << 32
+ *
+ */
+#define TB_SHIFT 32
+#define TB_SCALE(x) ((u_int64_t)(x) << TB_SHIFT)
+#define TB_UNSCALE(x) ((x) >> TB_SHIFT)
+
+static void
+tb_import_profile(tb, profile)
+ struct tbe *tb;
+ struct tb_profile *profile;
+{
+ tb->rate = TB_SCALE(profile->rate / 8) / machclk_freq;
+ tb->depth = TB_SCALE(profile->depth);
+ if (tb->rate > 0)
+ tb->filluptime = tb->depth / tb->rate;
+ else
+ tb->filluptime = 0xffffffffffffffffLL;
+ tb->token = tb->depth;
+ tb->last = read_machclk();
+}
+
+/*
+ * simple token bucket meter
+ */
+static struct tbmeter *
+tbm_create(top, profile, in_action, out_action)
+ struct top_cdnr *top;
+ struct tb_profile *profile;
+ struct tc_action *in_action, *out_action;
+{
+ struct tbmeter *tbm = NULL;
+
+ if (tca_verify_action(in_action) < 0
+ || tca_verify_action(out_action) < 0)
+ return (NULL);
+
+ if ((tbm = cdnr_cballoc(top, TCETYPE_TBMETER,
+ tbm_input)) == NULL)
+ return (NULL);
+
+ tb_import_profile(&tbm->tb, profile);
+
+ tca_import_action(&tbm->in_action, in_action);
+ tca_import_action(&tbm->out_action, out_action);
+
+ return (tbm);
+}
+
+static int
+tbm_destroy(tbm)
+ struct tbmeter *tbm;
+{
+ if (tbm->cdnrblk.cb_ref > 0)
+ return (EBUSY);
+
+ tca_invalidate_action(&tbm->in_action);
+ tca_invalidate_action(&tbm->out_action);
+
+ cdnr_cbdestroy(tbm);
+ return (0);
+}
+
+static struct tc_action *
+tbm_input(cb, pktinfo)
+ struct cdnr_block *cb;
+ struct cdnr_pktinfo *pktinfo;
+{
+ struct tbmeter *tbm = (struct tbmeter *)cb;
+ u_int64_t len;
+ u_int64_t interval, now;
+
+ len = TB_SCALE(pktinfo->pkt_len);
+
+ if (tbm->tb.token < len) {
+ now = read_machclk();
+ interval = now - tbm->tb.last;
+ if (interval >= tbm->tb.filluptime)
+ tbm->tb.token = tbm->tb.depth;
+ else {
+ tbm->tb.token += interval * tbm->tb.rate;
+ if (tbm->tb.token > tbm->tb.depth)
+ tbm->tb.token = tbm->tb.depth;
+ }
+ tbm->tb.last = now;
+ }
+
+ if (tbm->tb.token < len) {
+ PKTCNTR_ADD(&tbm->out_cnt, pktinfo->pkt_len);
+ return (&tbm->out_action);
+ }
+
+ tbm->tb.token -= len;
+ PKTCNTR_ADD(&tbm->in_cnt, pktinfo->pkt_len);
+ return (&tbm->in_action);
+}
+
+/*
+ * two rate three color marker
+ * as described in draft-heinanen-diffserv-trtcm-01.txt
+ */
+static struct trtcm *
+trtcm_create(top, cmtd_profile, peak_profile,
+ green_action, yellow_action, red_action, coloraware)
+ struct top_cdnr *top;
+ struct tb_profile *cmtd_profile, *peak_profile;
+ struct tc_action *green_action, *yellow_action, *red_action;
+ int coloraware;
+{
+ struct trtcm *tcm = NULL;
+
+ if (tca_verify_action(green_action) < 0
+ || tca_verify_action(yellow_action) < 0
+ || tca_verify_action(red_action) < 0)
+ return (NULL);
+
+ if ((tcm = cdnr_cballoc(top, TCETYPE_TRTCM,
+ trtcm_input)) == NULL)
+ return (NULL);
+
+ tb_import_profile(&tcm->cmtd_tb, cmtd_profile);
+ tb_import_profile(&tcm->peak_tb, peak_profile);
+
+ tca_import_action(&tcm->green_action, green_action);
+ tca_import_action(&tcm->yellow_action, yellow_action);
+ tca_import_action(&tcm->red_action, red_action);
+
+ /* set dscps to use */
+ if (tcm->green_action.tca_code == TCACODE_MARK)
+ tcm->green_dscp = tcm->green_action.tca_dscp & DSCP_MASK;
+ else
+ tcm->green_dscp = DSCP_AF11;
+ if (tcm->yellow_action.tca_code == TCACODE_MARK)
+ tcm->yellow_dscp = tcm->yellow_action.tca_dscp & DSCP_MASK;
+ else
+ tcm->yellow_dscp = DSCP_AF12;
+ if (tcm->red_action.tca_code == TCACODE_MARK)
+ tcm->red_dscp = tcm->red_action.tca_dscp & DSCP_MASK;
+ else
+ tcm->red_dscp = DSCP_AF13;
+
+ tcm->coloraware = coloraware;
+
+ return (tcm);
+}
+
+static int
+trtcm_destroy(tcm)
+ struct trtcm *tcm;
+{
+ if (tcm->cdnrblk.cb_ref > 0)
+ return (EBUSY);
+
+ tca_invalidate_action(&tcm->green_action);
+ tca_invalidate_action(&tcm->yellow_action);
+ tca_invalidate_action(&tcm->red_action);
+
+ cdnr_cbdestroy(tcm);
+ return (0);
+}
+
+static struct tc_action *
+trtcm_input(cb, pktinfo)
+ struct cdnr_block *cb;
+ struct cdnr_pktinfo *pktinfo;
+{
+ struct trtcm *tcm = (struct trtcm *)cb;
+ u_int64_t len;
+ u_int64_t interval, now;
+ u_int8_t color;
+
+ len = TB_SCALE(pktinfo->pkt_len);
+ if (tcm->coloraware) {
+ color = pktinfo->pkt_dscp;
+ if (color != tcm->yellow_dscp && color != tcm->red_dscp)
+ color = tcm->green_dscp;
+ } else {
+ /* if color-blind, precolor it as green */
+ color = tcm->green_dscp;
+ }
+
+ now = read_machclk();
+ if (tcm->cmtd_tb.token < len) {
+ interval = now - tcm->cmtd_tb.last;
+ if (interval >= tcm->cmtd_tb.filluptime)
+ tcm->cmtd_tb.token = tcm->cmtd_tb.depth;
+ else {
+ tcm->cmtd_tb.token += interval * tcm->cmtd_tb.rate;
+ if (tcm->cmtd_tb.token > tcm->cmtd_tb.depth)
+ tcm->cmtd_tb.token = tcm->cmtd_tb.depth;
+ }
+ tcm->cmtd_tb.last = now;
+ }
+ if (tcm->peak_tb.token < len) {
+ interval = now - tcm->peak_tb.last;
+ if (interval >= tcm->peak_tb.filluptime)
+ tcm->peak_tb.token = tcm->peak_tb.depth;
+ else {
+ tcm->peak_tb.token += interval * tcm->peak_tb.rate;
+ if (tcm->peak_tb.token > tcm->peak_tb.depth)
+ tcm->peak_tb.token = tcm->peak_tb.depth;
+ }
+ tcm->peak_tb.last = now;
+ }
+
+ if (color == tcm->red_dscp || tcm->peak_tb.token < len) {
+ pktinfo->pkt_dscp = tcm->red_dscp;
+ PKTCNTR_ADD(&tcm->red_cnt, pktinfo->pkt_len);
+ return (&tcm->red_action);
+ }
+
+ if (color == tcm->yellow_dscp || tcm->cmtd_tb.token < len) {
+ pktinfo->pkt_dscp = tcm->yellow_dscp;
+ tcm->peak_tb.token -= len;
+ PKTCNTR_ADD(&tcm->yellow_cnt, pktinfo->pkt_len);
+ return (&tcm->yellow_action);
+ }
+
+ pktinfo->pkt_dscp = tcm->green_dscp;
+ tcm->cmtd_tb.token -= len;
+ tcm->peak_tb.token -= len;
+ PKTCNTR_ADD(&tcm->green_cnt, pktinfo->pkt_len);
+ return (&tcm->green_action);
+}
+
+/*
+ * time sliding window three color marker
+ * as described in draft-fang-diffserv-tc-tswtcm-00.txt
+ */
+static struct tswtcm *
+tswtcm_create(top, cmtd_rate, peak_rate, avg_interval,
+ green_action, yellow_action, red_action)
+ struct top_cdnr *top;
+ u_int32_t cmtd_rate, peak_rate, avg_interval;
+ struct tc_action *green_action, *yellow_action, *red_action;
+{
+ struct tswtcm *tsw;
+
+ if (tca_verify_action(green_action) < 0
+ || tca_verify_action(yellow_action) < 0
+ || tca_verify_action(red_action) < 0)
+ return (NULL);
+
+ if ((tsw = cdnr_cballoc(top, TCETYPE_TSWTCM,
+ tswtcm_input)) == NULL)
+ return (NULL);
+
+ tca_import_action(&tsw->green_action, green_action);
+ tca_import_action(&tsw->yellow_action, yellow_action);
+ tca_import_action(&tsw->red_action, red_action);
+
+ /* set dscps to use */
+ if (tsw->green_action.tca_code == TCACODE_MARK)
+ tsw->green_dscp = tsw->green_action.tca_dscp & DSCP_MASK;
+ else
+ tsw->green_dscp = DSCP_AF11;
+ if (tsw->yellow_action.tca_code == TCACODE_MARK)
+ tsw->yellow_dscp = tsw->yellow_action.tca_dscp & DSCP_MASK;
+ else
+ tsw->yellow_dscp = DSCP_AF12;
+ if (tsw->red_action.tca_code == TCACODE_MARK)
+ tsw->red_dscp = tsw->red_action.tca_dscp & DSCP_MASK;
+ else
+ tsw->red_dscp = DSCP_AF13;
+
+ /* convert rates from bits/sec to bytes/sec */
+ tsw->cmtd_rate = cmtd_rate / 8;
+ tsw->peak_rate = peak_rate / 8;
+ tsw->avg_rate = 0;
+
+ /* timewin is converted from msec to machine clock unit */
+ tsw->timewin = (u_int64_t)machclk_freq * avg_interval / 1000;
+
+ return (tsw);
+}
+
+static int
+tswtcm_destroy(tsw)
+ struct tswtcm *tsw;
+{
+ if (tsw->cdnrblk.cb_ref > 0)
+ return (EBUSY);
+
+ tca_invalidate_action(&tsw->green_action);
+ tca_invalidate_action(&tsw->yellow_action);
+ tca_invalidate_action(&tsw->red_action);
+
+ cdnr_cbdestroy(tsw);
+ return (0);
+}
+
+static struct tc_action *
+tswtcm_input(cb, pktinfo)
+ struct cdnr_block *cb;
+ struct cdnr_pktinfo *pktinfo;
+{
+ struct tswtcm *tsw = (struct tswtcm *)cb;
+ int len;
+ u_int32_t avg_rate;
+ u_int64_t interval, now, tmp;
+
+ /*
+ * rate estimator
+ */
+ len = pktinfo->pkt_len;
+ now = read_machclk();
+
+ interval = now - tsw->t_front;
+ /*
+ * calculate average rate:
+ * avg = (avg * timewin + pkt_len)/(timewin + interval)
+ * pkt_len needs to be multiplied by machclk_freq in order to
+ * get (bytes/sec).
+ * note: when avg_rate (bytes/sec) and timewin (machclk unit) are
+ * less than 32 bits, the following 64-bit operation has enough
+ * precision.
+ */
+ tmp = ((u_int64_t)tsw->avg_rate * tsw->timewin
+ + (u_int64_t)len * machclk_freq) / (tsw->timewin + interval);
+ tsw->avg_rate = avg_rate = (u_int32_t)tmp;
+ tsw->t_front = now;
+
+ /*
+ * marker
+ */
+ if (avg_rate > tsw->cmtd_rate) {
+ u_int32_t randval = arc4random() % avg_rate;
+
+ if (avg_rate > tsw->peak_rate) {
+ if (randval < avg_rate - tsw->peak_rate) {
+ /* mark red */
+ pktinfo->pkt_dscp = tsw->red_dscp;
+ PKTCNTR_ADD(&tsw->red_cnt, len);
+ return (&tsw->red_action);
+ } else if (randval < avg_rate - tsw->cmtd_rate)
+ goto mark_yellow;
+ } else {
+ /* peak_rate >= avg_rate > cmtd_rate */
+ if (randval < avg_rate - tsw->cmtd_rate) {
+ mark_yellow:
+ pktinfo->pkt_dscp = tsw->yellow_dscp;
+ PKTCNTR_ADD(&tsw->yellow_cnt, len);
+ return (&tsw->yellow_action);
+ }
+ }
+ }
+
+ /* mark green */
+ pktinfo->pkt_dscp = tsw->green_dscp;
+ PKTCNTR_ADD(&tsw->green_cnt, len);
+ return (&tsw->green_action);
+}
+
+/*
+ * ioctl requests
+ */
+static int
+cdnrcmd_if_attach(ifname)
+ char *ifname;
+{
+ struct ifnet *ifp;
+ struct top_cdnr *top;
+
+ if ((ifp = ifunit(ifname)) == NULL)
+ return (EBADF);
+
+ if (ifp->if_snd.altq_cdnr != NULL)
+ return (EBUSY);
+
+ if ((top = top_create(&ifp->if_snd)) == NULL)
+ return (ENOMEM);
+ return (0);
+}
+
+static int
+cdnrcmd_if_detach(ifname)
+ char *ifname;
+{
+ struct top_cdnr *top;
+
+ if ((top = tcb_lookup(ifname)) == NULL)
+ return (EBADF);
+
+ return top_destroy(top);
+}
+
+static int
+cdnrcmd_add_element(ap)
+ struct cdnr_add_element *ap;
+{
+ struct top_cdnr *top;
+ struct cdnr_block *cb;
+
+ if ((top = tcb_lookup(ap->iface.cdnr_ifname)) == NULL)
+ return (EBADF);
+
+ cb = element_create(top, &ap->action);
+ if (cb == NULL)
+ return (EINVAL);
+ /* return a class handle to the user */
+ ap->cdnr_handle = cdnr_cb2handle(cb);
+ return (0);
+}
+
+static int
+cdnrcmd_delete_element(ap)
+ struct cdnr_delete_element *ap;
+{
+ struct top_cdnr *top;
+ struct cdnr_block *cb;
+
+ if ((top = tcb_lookup(ap->iface.cdnr_ifname)) == NULL)
+ return (EBADF);
+
+ if ((cb = cdnr_handle2cb(ap->cdnr_handle)) == NULL)
+ return (EINVAL);
+
+ if (cb->cb_type != TCETYPE_ELEMENT)
+ return generic_element_destroy(cb);
+
+ return element_destroy(cb);
+}
+
+static int
+cdnrcmd_add_filter(ap)
+ struct cdnr_add_filter *ap;
+{
+ struct top_cdnr *top;
+ struct cdnr_block *cb;
+
+ if ((top = tcb_lookup(ap->iface.cdnr_ifname)) == NULL)
+ return (EBADF);
+
+ if ((cb = cdnr_handle2cb(ap->cdnr_handle)) == NULL)
+ return (EINVAL);
+
+ return acc_add_filter(&top->tc_classifier, &ap->filter,
+ cb, &ap->filter_handle);
+}
+
+static int
+cdnrcmd_delete_filter(ap)
+ struct cdnr_delete_filter *ap;
+{
+ struct top_cdnr *top;
+
+ if ((top = tcb_lookup(ap->iface.cdnr_ifname)) == NULL)
+ return (EBADF);
+
+ return acc_delete_filter(&top->tc_classifier, ap->filter_handle);
+}
+
+static int
+cdnrcmd_add_tbm(ap)
+ struct cdnr_add_tbmeter *ap;
+{
+ struct top_cdnr *top;
+ struct tbmeter *tbm;
+
+ if ((top = tcb_lookup(ap->iface.cdnr_ifname)) == NULL)
+ return (EBADF);
+
+ tbm = tbm_create(top, &ap->profile, &ap->in_action, &ap->out_action);
+ if (tbm == NULL)
+ return (EINVAL);
+ /* return a class handle to the user */
+ ap->cdnr_handle = cdnr_cb2handle(&tbm->cdnrblk);
+ return (0);
+}
+
+static int
+cdnrcmd_modify_tbm(ap)
+ struct cdnr_modify_tbmeter *ap;
+{
+ struct tbmeter *tbm;
+
+ if ((tbm = (struct tbmeter *)cdnr_handle2cb(ap->cdnr_handle)) == NULL)
+ return (EINVAL);
+
+ tb_import_profile(&tbm->tb, &ap->profile);
+
+ return (0);
+}
+
+static int
+cdnrcmd_tbm_stats(ap)
+ struct cdnr_tbmeter_stats *ap;
+{
+ struct tbmeter *tbm;
+
+ if ((tbm = (struct tbmeter *)cdnr_handle2cb(ap->cdnr_handle)) == NULL)
+ return (EINVAL);
+
+ ap->in_cnt = tbm->in_cnt;
+ ap->out_cnt = tbm->out_cnt;
+
+ return (0);
+}
+
+static int
+cdnrcmd_add_trtcm(ap)
+ struct cdnr_add_trtcm *ap;
+{
+ struct top_cdnr *top;
+ struct trtcm *tcm;
+
+ if ((top = tcb_lookup(ap->iface.cdnr_ifname)) == NULL)
+ return (EBADF);
+
+ tcm = trtcm_create(top, &ap->cmtd_profile, &ap->peak_profile,
+ &ap->green_action, &ap->yellow_action,
+ &ap->red_action, ap->coloraware);
+ if (tcm == NULL)
+ return (EINVAL);
+
+ /* return a class handle to the user */
+ ap->cdnr_handle = cdnr_cb2handle(&tcm->cdnrblk);
+ return (0);
+}
+
+static int
+cdnrcmd_modify_trtcm(ap)
+ struct cdnr_modify_trtcm *ap;
+{
+ struct trtcm *tcm;
+
+ if ((tcm = (struct trtcm *)cdnr_handle2cb(ap->cdnr_handle)) == NULL)
+ return (EINVAL);
+
+ tb_import_profile(&tcm->cmtd_tb, &ap->cmtd_profile);
+ tb_import_profile(&tcm->peak_tb, &ap->peak_profile);
+
+ return (0);
+}
+
+static int
+cdnrcmd_tcm_stats(ap)
+ struct cdnr_tcm_stats *ap;
+{
+ struct cdnr_block *cb;
+
+ if ((cb = cdnr_handle2cb(ap->cdnr_handle)) == NULL)
+ return (EINVAL);
+
+ if (cb->cb_type == TCETYPE_TRTCM) {
+ struct trtcm *tcm = (struct trtcm *)cb;
+
+ ap->green_cnt = tcm->green_cnt;
+ ap->yellow_cnt = tcm->yellow_cnt;
+ ap->red_cnt = tcm->red_cnt;
+ } else if (cb->cb_type == TCETYPE_TSWTCM) {
+ struct tswtcm *tsw = (struct tswtcm *)cb;
+
+ ap->green_cnt = tsw->green_cnt;
+ ap->yellow_cnt = tsw->yellow_cnt;
+ ap->red_cnt = tsw->red_cnt;
+ } else
+ return (EINVAL);
+
+ return (0);
+}
+
+static int
+cdnrcmd_add_tswtcm(ap)
+ struct cdnr_add_tswtcm *ap;
+{
+ struct top_cdnr *top;
+ struct tswtcm *tsw;
+
+ if ((top = tcb_lookup(ap->iface.cdnr_ifname)) == NULL)
+ return (EBADF);
+
+ if (ap->cmtd_rate > ap->peak_rate)
+ return (EINVAL);
+
+ tsw = tswtcm_create(top, ap->cmtd_rate, ap->peak_rate,
+ ap->avg_interval, &ap->green_action,
+ &ap->yellow_action, &ap->red_action);
+ if (tsw == NULL)
+ return (EINVAL);
+
+ /* return a class handle to the user */
+ ap->cdnr_handle = cdnr_cb2handle(&tsw->cdnrblk);
+ return (0);
+}
+
+static int
+cdnrcmd_modify_tswtcm(ap)
+ struct cdnr_modify_tswtcm *ap;
+{
+ struct tswtcm *tsw;
+
+ if ((tsw = (struct tswtcm *)cdnr_handle2cb(ap->cdnr_handle)) == NULL)
+ return (EINVAL);
+
+ if (ap->cmtd_rate > ap->peak_rate)
+ return (EINVAL);
+
+ /* convert rates from bits/sec to bytes/sec */
+ tsw->cmtd_rate = ap->cmtd_rate / 8;
+ tsw->peak_rate = ap->peak_rate / 8;
+ tsw->avg_rate = 0;
+
+ /* timewin is converted from msec to machine clock unit */
+ tsw->timewin = (u_int64_t)machclk_freq * ap->avg_interval / 1000;
+
+ return (0);
+}
+
+static int
+cdnrcmd_get_stats(ap)
+ struct cdnr_get_stats *ap;
+{
+ struct top_cdnr *top;
+ struct cdnr_block *cb;
+ struct tbmeter *tbm;
+ struct trtcm *tcm;
+ struct tswtcm *tsw;
+ struct tce_stats tce, *usp;
+ int error, n, nskip, nelements;
+
+ if ((top = tcb_lookup(ap->iface.cdnr_ifname)) == NULL)
+ return (EBADF);
+
+ /* copy action stats */
+ bcopy(top->tc_cnts, ap->cnts, sizeof(ap->cnts));
+
+ /* stats for each element */
+ nelements = ap->nelements;
+ usp = ap->tce_stats;
+ if (nelements <= 0 || usp == NULL)
+ return (0);
+
+ nskip = ap->nskip;
+ n = 0;
+ LIST_FOREACH(cb, &top->tc_elements, cb_next) {
+ if (nskip > 0) {
+ nskip--;
+ continue;
+ }
+
+ bzero(&tce, sizeof(tce));
+ tce.tce_handle = cb->cb_handle;
+ tce.tce_type = cb->cb_type;
+ switch (cb->cb_type) {
+ case TCETYPE_TBMETER:
+ tbm = (struct tbmeter *)cb;
+ tce.tce_cnts[0] = tbm->in_cnt;
+ tce.tce_cnts[1] = tbm->out_cnt;
+ break;
+ case TCETYPE_TRTCM:
+ tcm = (struct trtcm *)cb;
+ tce.tce_cnts[0] = tcm->green_cnt;
+ tce.tce_cnts[1] = tcm->yellow_cnt;
+ tce.tce_cnts[2] = tcm->red_cnt;
+ break;
+ case TCETYPE_TSWTCM:
+ tsw = (struct tswtcm *)cb;
+ tce.tce_cnts[0] = tsw->green_cnt;
+ tce.tce_cnts[1] = tsw->yellow_cnt;
+ tce.tce_cnts[2] = tsw->red_cnt;
+ break;
+ default:
+ continue;
+ }
+
+ if ((error = copyout((caddr_t)&tce, (caddr_t)usp++,
+ sizeof(tce))) != 0)
+ return (error);
+
+ if (++n == nelements)
+ break;
+ }
+ ap->nelements = n;
+
+ return (0);
+}
+
+/*
+ * conditioner device interface
+ */
+int
+cdnropen(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ if (machclk_freq == 0)
+ init_machclk();
+
+ if (machclk_freq == 0) {
+ printf("cdnr: no cpu clock available!\n");
+ return (ENXIO);
+ }
+
+ /* everything will be done when the queueing scheme is attached. */
+ return 0;
+}
+
+int
+cdnrclose(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ struct top_cdnr *top;
+ int err, error = 0;
+
+ while ((top = LIST_FIRST(&tcb_list)) != NULL) {
+ /* destroy all */
+ err = top_destroy(top);
+ if (err != 0 && error == 0)
+ error = err;
+ }
+ altq_input = NULL;
+
+ return (error);
+}
+
+int
+cdnrioctl(dev, cmd, addr, flag, p)
+ dev_t dev;
+ ioctlcmd_t cmd;
+ caddr_t addr;
+ int flag;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ struct top_cdnr *top;
+ struct cdnr_interface *ifacep;
+ int s, error = 0;
+
+ /* check super-user privilege */
+ switch (cmd) {
+ case CDNR_GETSTATS:
+ break;
+ default:
+#if (__FreeBSD_version > 700000)
+ if ((error = priv_check(p, PRIV_ALTQ_MANAGE)) != 0)
+#elsif (__FreeBSD_version > 400000)
+ if ((error = suser(p)) != 0)
+#else
+ if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
+#endif
+ return (error);
+ break;
+ }
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ switch (cmd) {
+
+ case CDNR_IF_ATTACH:
+ ifacep = (struct cdnr_interface *)addr;
+ error = cdnrcmd_if_attach(ifacep->cdnr_ifname);
+ break;
+
+ case CDNR_IF_DETACH:
+ ifacep = (struct cdnr_interface *)addr;
+ error = cdnrcmd_if_detach(ifacep->cdnr_ifname);
+ break;
+
+ case CDNR_ENABLE:
+ case CDNR_DISABLE:
+ ifacep = (struct cdnr_interface *)addr;
+ if ((top = tcb_lookup(ifacep->cdnr_ifname)) == NULL) {
+ error = EBADF;
+ break;
+ }
+
+ switch (cmd) {
+
+ case CDNR_ENABLE:
+ ALTQ_SET_CNDTNING(top->tc_ifq);
+ if (altq_input == NULL)
+ altq_input = altq_cdnr_input;
+ break;
+
+ case CDNR_DISABLE:
+ ALTQ_CLEAR_CNDTNING(top->tc_ifq);
+ LIST_FOREACH(top, &tcb_list, tc_next)
+ if (ALTQ_IS_CNDTNING(top->tc_ifq))
+ break;
+ if (top == NULL)
+ altq_input = NULL;
+ break;
+ }
+ break;
+
+ case CDNR_ADD_ELEM:
+ error = cdnrcmd_add_element((struct cdnr_add_element *)addr);
+ break;
+
+ case CDNR_DEL_ELEM:
+ error = cdnrcmd_delete_element((struct cdnr_delete_element *)addr);
+ break;
+
+ case CDNR_ADD_TBM:
+ error = cdnrcmd_add_tbm((struct cdnr_add_tbmeter *)addr);
+ break;
+
+ case CDNR_MOD_TBM:
+ error = cdnrcmd_modify_tbm((struct cdnr_modify_tbmeter *)addr);
+ break;
+
+ case CDNR_TBM_STATS:
+ error = cdnrcmd_tbm_stats((struct cdnr_tbmeter_stats *)addr);
+ break;
+
+ case CDNR_ADD_TCM:
+ error = cdnrcmd_add_trtcm((struct cdnr_add_trtcm *)addr);
+ break;
+
+ case CDNR_MOD_TCM:
+ error = cdnrcmd_modify_trtcm((struct cdnr_modify_trtcm *)addr);
+ break;
+
+ case CDNR_TCM_STATS:
+ error = cdnrcmd_tcm_stats((struct cdnr_tcm_stats *)addr);
+ break;
+
+ case CDNR_ADD_FILTER:
+ error = cdnrcmd_add_filter((struct cdnr_add_filter *)addr);
+ break;
+
+ case CDNR_DEL_FILTER:
+ error = cdnrcmd_delete_filter((struct cdnr_delete_filter *)addr);
+ break;
+
+ case CDNR_GETSTATS:
+ error = cdnrcmd_get_stats((struct cdnr_get_stats *)addr);
+ break;
+
+ case CDNR_ADD_TSW:
+ error = cdnrcmd_add_tswtcm((struct cdnr_add_tswtcm *)addr);
+ break;
+
+ case CDNR_MOD_TSW:
+ error = cdnrcmd_modify_tswtcm((struct cdnr_modify_tswtcm *)addr);
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+ splx(s);
+
+ return error;
+}
+
+#ifdef KLD_MODULE
+
+static struct altqsw cdnr_sw =
+ {"cdnr", cdnropen, cdnrclose, cdnrioctl};
+
+ALTQ_MODULE(altq_cdnr, ALTQT_CDNR, &cdnr_sw);
+
+#endif /* KLD_MODULE */
+
+#endif /* ALTQ3_COMPAT */
+#endif /* ALTQ_CDNR */
diff --git a/sys/contrib/altq/altq/altq_cdnr.h b/sys/contrib/altq/altq/altq_cdnr.h
new file mode 100644
index 0000000..d55402f
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_cdnr.h
@@ -0,0 +1,335 @@
+/* $KAME: altq_cdnr.h,v 1.9 2003/07/10 12:07:48 kjc Exp $ */
+
+/*
+ * Copyright (C) 1999-2002
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ALTQ_ALTQ_CDNR_H_
+#define _ALTQ_ALTQ_CDNR_H_
+
+#include <altq/altq.h>
+
+/*
+ * traffic conditioner element types
+ */
+#define TCETYPE_NONE 0
+#define TCETYPE_TOP 1 /* top level conditioner */
+#define TCETYPE_ELEMENT 2 /* a simple tc element */
+#define TCETYPE_TBMETER 3 /* token bucket meter */
+#define TCETYPE_TRTCM 4 /* (two-rate) three color marker */
+#define TCETYPE_TSWTCM 5 /* time sliding window 3-color maker */
+
+/*
+ * traffic conditioner action
+ */
+struct cdnr_block;
+
+struct tc_action {
+ int tca_code; /* e.g., TCACODE_PASS */
+ /* tca_code dependent variable */
+ union {
+ u_long un_value; /* template */
+ u_int8_t un_dscp; /* diffserv code point */
+ u_long un_handle; /* tc action handle */
+ struct cdnr_block *un_next; /* next tc element block */
+ } tca_un;
+};
+#define tca_value tca_un.un_value
+#define tca_dscp tca_un.un_dscp
+#define tca_handle tca_un.un_handle
+#define tca_next tca_un.un_next
+
+#define TCACODE_NONE 0 /* action is not set */
+#define TCACODE_PASS 1 /* pass this packet */
+#define TCACODE_DROP 2 /* discard this packet */
+#define TCACODE_RETURN 3 /* do not process this packet */
+#define TCACODE_MARK 4 /* mark dscp */
+#define TCACODE_HANDLE 5 /* take action specified by handle */
+#define TCACODE_NEXT 6 /* take action in the next tc element */
+#define TCACODE_MAX 6
+
+#define CDNR_NULL_HANDLE 0
+
+struct cdnr_interface {
+ char cdnr_ifname[IFNAMSIZ]; /* interface name (e.g., fxp0) */
+};
+
+/* simple element operations */
+struct cdnr_add_element {
+ struct cdnr_interface iface;
+ struct tc_action action;
+
+ u_long cdnr_handle; /* return value */
+};
+
+struct cdnr_delete_element {
+ struct cdnr_interface iface;
+ u_long cdnr_handle;
+};
+
+/* token-bucket meter operations */
+struct cdnr_add_tbmeter {
+ struct cdnr_interface iface;
+ struct tb_profile profile;
+ struct tc_action in_action;
+ struct tc_action out_action;
+
+ u_long cdnr_handle; /* return value */
+};
+
+struct cdnr_modify_tbmeter {
+ struct cdnr_interface iface;
+ u_long cdnr_handle;
+ struct tb_profile profile;
+};
+
+struct cdnr_tbmeter_stats {
+ struct cdnr_interface iface;
+ u_long cdnr_handle;
+ struct pktcntr in_cnt;
+ struct pktcntr out_cnt;
+};
+
+/* two-rate three-color marker operations */
+struct cdnr_add_trtcm {
+ struct cdnr_interface iface;
+ struct tb_profile cmtd_profile; /* profile for committed tb */
+ struct tb_profile peak_profile; /* profile for peak tb */
+ struct tc_action green_action; /* action for green packets */
+ struct tc_action yellow_action; /* action for yellow packets */
+ struct tc_action red_action; /* action for red packets */
+ int coloraware; /* color-aware/color-blind */
+
+ u_long cdnr_handle; /* return value */
+};
+
+struct cdnr_modify_trtcm {
+ struct cdnr_interface iface;
+ u_long cdnr_handle;
+ struct tb_profile cmtd_profile; /* profile for committed tb */
+ struct tb_profile peak_profile; /* profile for peak tb */
+ int coloraware; /* color-aware/color-blind */
+};
+
+struct cdnr_tcm_stats {
+ struct cdnr_interface iface;
+ u_long cdnr_handle;
+ struct pktcntr green_cnt;
+ struct pktcntr yellow_cnt;
+ struct pktcntr red_cnt;
+};
+
+/* time sliding window three-color marker operations */
+struct cdnr_add_tswtcm {
+ struct cdnr_interface iface;
+ u_int32_t cmtd_rate; /* committed rate (bits/sec) */
+ u_int32_t peak_rate; /* peak rate (bits/sec) */
+ u_int32_t avg_interval; /* averaging interval (msec) */
+ struct tc_action green_action; /* action for green packets */
+ struct tc_action yellow_action; /* action for yellow packets */
+ struct tc_action red_action; /* action for red packets */
+
+ u_long cdnr_handle; /* return value */
+};
+
+struct cdnr_modify_tswtcm {
+ struct cdnr_interface iface;
+ u_long cdnr_handle;
+ u_int32_t cmtd_rate; /* committed rate (bits/sec) */
+ u_int32_t peak_rate; /* peak rate (bits/sec) */
+ u_int32_t avg_interval; /* averaging interval (msec) */
+};
+
+struct cdnr_add_filter {
+ struct cdnr_interface iface;
+ u_long cdnr_handle;
+#ifdef ALTQ3_CLFIER_COMPAT
+ struct flow_filter filter;
+#endif
+ u_long filter_handle; /* return value */
+};
+
+struct cdnr_delete_filter {
+ struct cdnr_interface iface;
+ u_long filter_handle;
+};
+
+struct tce_stats {
+ u_long tce_handle; /* tc element handle */
+ int tce_type; /* e.g., TCETYPE_ELEMENT */
+ struct pktcntr tce_cnts[3]; /* tcm returns 3 counters */
+};
+
+struct cdnr_get_stats {
+ struct cdnr_interface iface;
+ struct pktcntr cnts[TCACODE_MAX+1];
+
+ /* element stats */
+ int nskip; /* skip # of elements */
+ int nelements; /* # of element stats (WR) */
+ struct tce_stats *tce_stats; /* pointer to stats array */
+};
+
+#define CDNR_IF_ATTACH _IOW('Q', 1, struct cdnr_interface)
+#define CDNR_IF_DETACH _IOW('Q', 2, struct cdnr_interface)
+#define CDNR_ENABLE _IOW('Q', 3, struct cdnr_interface)
+#define CDNR_DISABLE _IOW('Q', 4, struct cdnr_interface)
+#define CDNR_ADD_FILTER _IOWR('Q', 10, struct cdnr_add_filter)
+#define CDNR_DEL_FILTER _IOW('Q', 11, struct cdnr_delete_filter)
+#define CDNR_GETSTATS _IOWR('Q', 12, struct cdnr_get_stats)
+#define CDNR_ADD_ELEM _IOWR('Q', 30, struct cdnr_add_element)
+#define CDNR_DEL_ELEM _IOW('Q', 31, struct cdnr_delete_element)
+#define CDNR_ADD_TBM _IOWR('Q', 32, struct cdnr_add_tbmeter)
+#define CDNR_MOD_TBM _IOW('Q', 33, struct cdnr_modify_tbmeter)
+#define CDNR_TBM_STATS _IOWR('Q', 34, struct cdnr_tbmeter_stats)
+#define CDNR_ADD_TCM _IOWR('Q', 35, struct cdnr_add_trtcm)
+#define CDNR_MOD_TCM _IOWR('Q', 36, struct cdnr_modify_trtcm)
+#define CDNR_TCM_STATS _IOWR('Q', 37, struct cdnr_tcm_stats)
+#define CDNR_ADD_TSW _IOWR('Q', 38, struct cdnr_add_tswtcm)
+#define CDNR_MOD_TSW _IOWR('Q', 39, struct cdnr_modify_tswtcm)
+
+#ifndef DSCP_EF
+/* diffserve code points */
+#define DSCP_MASK 0xfc
+#define DSCP_CUMASK 0x03
+#define DSCP_EF 0xb8
+#define DSCP_AF11 0x28
+#define DSCP_AF12 0x30
+#define DSCP_AF13 0x38
+#define DSCP_AF21 0x48
+#define DSCP_AF22 0x50
+#define DSCP_AF23 0x58
+#define DSCP_AF31 0x68
+#define DSCP_AF32 0x70
+#define DSCP_AF33 0x78
+#define DSCP_AF41 0x88
+#define DSCP_AF42 0x90
+#define DSCP_AF43 0x98
+#define AF_CLASSMASK 0xe0
+#define AF_DROPPRECMASK 0x18
+#endif
+
+#ifdef _KERNEL
+
+/*
+ * packet information passed to the input function of tc elements
+ */
+struct cdnr_pktinfo {
+ int pkt_len; /* packet length */
+ u_int8_t pkt_dscp; /* diffserv code point */
+};
+
+/*
+ * traffic conditioner control block common to all types of tc elements
+ */
+struct cdnr_block {
+ LIST_ENTRY(cdnr_block) cb_next;
+ int cb_len; /* size of this tc element */
+ int cb_type; /* cdnr block type */
+ int cb_ref; /* reference count of this element */
+ u_long cb_handle; /* handle of this tc element */
+ struct top_cdnr *cb_top; /* back pointer to top */
+ struct tc_action cb_action; /* top level action for this tcb */
+ struct tc_action *(*cb_input)(struct cdnr_block *,
+ struct cdnr_pktinfo *);
+};
+
+/*
+ * top level traffic conditioner structure for an interface
+ */
+struct top_cdnr {
+ struct cdnr_block tc_block;
+
+ LIST_ENTRY(top_cdnr) tc_next;
+ struct ifaltq *tc_ifq;
+
+ LIST_HEAD(, cdnr_block) tc_elements;
+#ifdef ALTQ3_CLFIER_COMPAT
+ struct acc_classifier tc_classifier;
+#endif
+ struct pktcntr tc_cnts[TCACODE_MAX+1];
+};
+
+/* token bucket element */
+struct tbe {
+ u_int64_t rate;
+ u_int64_t depth;
+
+ u_int64_t token;
+ u_int64_t filluptime;
+ u_int64_t last;
+};
+
+/* token bucket meter structure */
+struct tbmeter {
+ struct cdnr_block cdnrblk; /* conditioner block */
+ struct tbe tb; /* token bucket */
+ struct tc_action in_action; /* actions for IN/OUT */
+ struct tc_action out_action; /* actions for IN/OUT */
+ struct pktcntr in_cnt; /* statistics for IN/OUT */
+ struct pktcntr out_cnt; /* statistics for IN/OUT */
+};
+
+/* two-rate three-color marker structure */
+struct trtcm {
+ struct cdnr_block cdnrblk; /* conditioner block */
+ struct tbe cmtd_tb; /* committed tb profile */
+ struct tbe peak_tb; /* peak tb profile */
+ struct tc_action green_action;
+ struct tc_action yellow_action;
+ struct tc_action red_action;
+ int coloraware;
+ u_int8_t green_dscp;
+ u_int8_t yellow_dscp;
+ u_int8_t red_dscp;
+ struct pktcntr green_cnt;
+ struct pktcntr yellow_cnt;
+ struct pktcntr red_cnt;
+};
+
+/* time sliding window three-color marker structure */
+struct tswtcm {
+ struct cdnr_block cdnrblk; /* conditioner block */
+
+ u_int32_t avg_rate; /* average rate (bytes/sec) */
+ u_int64_t t_front; /* timestamp of last update */
+
+ u_int64_t timewin; /* average interval */
+ u_int32_t cmtd_rate; /* committed target rate */
+ u_int32_t peak_rate; /* peak target rate */
+ struct tc_action green_action;
+ struct tc_action yellow_action;
+ struct tc_action red_action;
+ u_int8_t green_dscp;
+ u_int8_t yellow_dscp;
+ u_int8_t red_dscp;
+ struct pktcntr green_cnt;
+ struct pktcntr yellow_cnt;
+ struct pktcntr red_cnt;
+};
+
+#endif /* _KERNEL */
+
+#endif /* _ALTQ_ALTQ_CDNR_H_ */
diff --git a/sys/contrib/altq/altq/altq_classq.h b/sys/contrib/altq/altq/altq_classq.h
new file mode 100644
index 0000000..dc5c646
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_classq.h
@@ -0,0 +1,206 @@
+/* $KAME: altq_classq.h,v 1.6 2003/01/07 07:33:38 kjc Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Network Research
+ * Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/*
+ * class queue definitions extracted from rm_class.h.
+ */
+#ifndef _ALTQ_ALTQ_CLASSQ_H_
+#define _ALTQ_ALTQ_CLASSQ_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Packet Queue types: RED or DROPHEAD.
+ */
+#define Q_DROPHEAD 0x00
+#define Q_RED 0x01
+#define Q_RIO 0x02
+#define Q_DROPTAIL 0x03
+
+#ifdef _KERNEL
+
+/*
+ * Packet Queue structures and macros to manipulate them.
+ */
+struct _class_queue_ {
+ struct mbuf *tail_; /* Tail of packet queue */
+ int qlen_; /* Queue length (in number of packets) */
+ int qlim_; /* Queue limit (in number of packets*) */
+ int qtype_; /* Queue type */
+};
+
+typedef struct _class_queue_ class_queue_t;
+
+#define qtype(q) (q)->qtype_ /* Get queue type */
+#define qlimit(q) (q)->qlim_ /* Max packets to be queued */
+#define qlen(q) (q)->qlen_ /* Current queue length. */
+#define qtail(q) (q)->tail_ /* Tail of the queue */
+#define qhead(q) ((q)->tail_ ? (q)->tail_->m_nextpkt : NULL)
+
+#define qempty(q) ((q)->qlen_ == 0) /* Is the queue empty?? */
+#define q_is_red(q) ((q)->qtype_ == Q_RED) /* Is the queue a red queue */
+#define q_is_rio(q) ((q)->qtype_ == Q_RIO) /* Is the queue a rio queue */
+#define q_is_red_or_rio(q) ((q)->qtype_ == Q_RED || (q)->qtype_ == Q_RIO)
+
+#if !defined(__GNUC__) || defined(ALTQ_DEBUG)
+
+extern void _addq(class_queue_t *, struct mbuf *);
+extern struct mbuf *_getq(class_queue_t *);
+extern struct mbuf *_getq_tail(class_queue_t *);
+extern struct mbuf *_getq_random(class_queue_t *);
+extern void _removeq(class_queue_t *, struct mbuf *);
+extern void _flushq(class_queue_t *);
+
+#else /* __GNUC__ && !ALTQ_DEBUG */
+/*
+ * inlined versions
+ */
+static __inline void
+_addq(class_queue_t *q, struct mbuf *m)
+{
+ struct mbuf *m0;
+
+ if ((m0 = qtail(q)) != NULL)
+ m->m_nextpkt = m0->m_nextpkt;
+ else
+ m0 = m;
+ m0->m_nextpkt = m;
+ qtail(q) = m;
+ qlen(q)++;
+}
+
+static __inline struct mbuf *
+_getq(class_queue_t *q)
+{
+ struct mbuf *m, *m0;
+
+ if ((m = qtail(q)) == NULL)
+ return (NULL);
+ if ((m0 = m->m_nextpkt) != m)
+ m->m_nextpkt = m0->m_nextpkt;
+ else
+ qtail(q) = NULL;
+ qlen(q)--;
+ m0->m_nextpkt = NULL;
+ return (m0);
+}
+
+/* drop a packet at the tail of the queue */
+static __inline struct mbuf *
+_getq_tail(class_queue_t *q)
+{
+ struct mbuf *m, *m0, *prev;
+
+ if ((m = m0 = qtail(q)) == NULL)
+ return NULL;
+ do {
+ prev = m0;
+ m0 = m0->m_nextpkt;
+ } while (m0 != m);
+ prev->m_nextpkt = m->m_nextpkt;
+ if (prev == m)
+ qtail(q) = NULL;
+ else
+ qtail(q) = prev;
+ qlen(q)--;
+ m->m_nextpkt = NULL;
+ return (m);
+}
+
+/* randomly select a packet in the queue */
+static __inline struct mbuf *
+_getq_random(class_queue_t *q)
+{
+ struct mbuf *m;
+ int i, n;
+
+ if ((m = qtail(q)) == NULL)
+ return NULL;
+ if (m->m_nextpkt == m)
+ qtail(q) = NULL;
+ else {
+ struct mbuf *prev = NULL;
+
+ n = random() % qlen(q) + 1;
+ for (i = 0; i < n; i++) {
+ prev = m;
+ m = m->m_nextpkt;
+ }
+ prev->m_nextpkt = m->m_nextpkt;
+ if (m == qtail(q))
+ qtail(q) = prev;
+ }
+ qlen(q)--;
+ m->m_nextpkt = NULL;
+ return (m);
+}
+
+static __inline void
+_removeq(class_queue_t *q, struct mbuf *m)
+{
+ struct mbuf *m0, *prev;
+
+ m0 = qtail(q);
+ do {
+ prev = m0;
+ m0 = m0->m_nextpkt;
+ } while (m0 != m);
+ prev->m_nextpkt = m->m_nextpkt;
+ if (prev == m)
+ qtail(q) = NULL;
+ else if (qtail(q) == m)
+ qtail(q) = prev;
+ qlen(q)--;
+}
+
+static __inline void
+_flushq(class_queue_t *q)
+{
+ struct mbuf *m;
+
+ while ((m = _getq(q)) != NULL)
+ m_freem(m);
+}
+
+#endif /* __GNUC__ && !ALTQ_DEBUG */
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ALTQ_ALTQ_CLASSQ_H_ */
diff --git a/sys/contrib/altq/altq/altq_hfsc.c b/sys/contrib/altq/altq/altq_hfsc.c
new file mode 100644
index 0000000..8fea4dd
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_hfsc.c
@@ -0,0 +1,2276 @@
+/* $FreeBSD$ */
+/* $KAME: altq_hfsc.c,v 1.24 2003/12/05 05:40:46 kjc Exp $ */
+
+/*
+ * Copyright (c) 1997-1999 Carnegie Mellon University. All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation is hereby granted (including for commercial or
+ * for-profit use), provided that both the copyright notice and this
+ * permission notice appear in all copies of the software, derivative
+ * works, or modified versions, and any portions thereof.
+ *
+ * THIS SOFTWARE IS EXPERIMENTAL AND IS KNOWN TO HAVE BUGS, SOME OF
+ * WHICH MAY HAVE SERIOUS CONSEQUENCES. CARNEGIE MELLON PROVIDES THIS
+ * SOFTWARE IN ITS ``AS IS'' CONDITION, AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Carnegie Mellon encourages (but does not require) users of this
+ * software to return any improvements or extensions that they make,
+ * and to grant Carnegie Mellon the rights to redistribute these
+ * changes without encumbrance.
+ */
+/*
+ * H-FSC is described in Proceedings of SIGCOMM'97,
+ * "A Hierarchical Fair Service Curve Algorithm for Link-Sharing,
+ * Real-Time and Priority Service"
+ * by Ion Stoica, Hui Zhang, and T. S. Eugene Ng.
+ *
+ * Oleg Cherevko <olwi@aq.ml.com.ua> added the upperlimit for link-sharing.
+ * when a class has an upperlimit, the fit-time is computed from the
+ * upperlimit service curve. the link-sharing scheduler does not schedule
+ * a class whose fit-time exceeds the current time.
+ */
+
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+#include "opt_altq.h"
+#if (__FreeBSD__ != 2)
+#include "opt_inet.h"
+#ifdef __FreeBSD__
+#include "opt_inet6.h"
+#endif
+#endif
+#endif /* __FreeBSD__ || __NetBSD__ */
+
+#ifdef ALTQ_HFSC /* hfsc is enabled by ALTQ_HFSC option in opt_altq.h */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/systm.h>
+#include <sys/errno.h>
+#include <sys/queue.h>
+#if 1 /* ALTQ3_COMPAT */
+#include <sys/sockio.h>
+#include <sys/proc.h>
+#include <sys/kernel.h>
+#endif /* ALTQ3_COMPAT */
+
+#include <net/if.h>
+#include <netinet/in.h>
+
+#include <net/pfvar.h>
+#include <altq/altq.h>
+#include <altq/altq_hfsc.h>
+#ifdef ALTQ3_COMPAT
+#include <altq/altq_conf.h>
+#endif
+
+/*
+ * function prototypes
+ */
+static int hfsc_clear_interface(struct hfsc_if *);
+static int hfsc_request(struct ifaltq *, int, void *);
+static void hfsc_purge(struct hfsc_if *);
+static struct hfsc_class *hfsc_class_create(struct hfsc_if *,
+ struct service_curve *, struct service_curve *, struct service_curve *,
+ struct hfsc_class *, int, int, int);
+static int hfsc_class_destroy(struct hfsc_class *);
+static struct hfsc_class *hfsc_nextclass(struct hfsc_class *);
+static int hfsc_enqueue(struct ifaltq *, struct mbuf *,
+ struct altq_pktattr *);
+static struct mbuf *hfsc_dequeue(struct ifaltq *, int);
+
+static int hfsc_addq(struct hfsc_class *, struct mbuf *);
+static struct mbuf *hfsc_getq(struct hfsc_class *);
+static struct mbuf *hfsc_pollq(struct hfsc_class *);
+static void hfsc_purgeq(struct hfsc_class *);
+
+static void update_cfmin(struct hfsc_class *);
+static void set_active(struct hfsc_class *, int);
+static void set_passive(struct hfsc_class *);
+
+static void init_ed(struct hfsc_class *, int);
+static void update_ed(struct hfsc_class *, int);
+static void update_d(struct hfsc_class *, int);
+static void init_vf(struct hfsc_class *, int);
+static void update_vf(struct hfsc_class *, int, u_int64_t);
+static ellist_t *ellist_alloc(void);
+static void ellist_destroy(ellist_t *);
+static void ellist_insert(struct hfsc_class *);
+static void ellist_remove(struct hfsc_class *);
+static void ellist_update(struct hfsc_class *);
+struct hfsc_class *ellist_get_mindl(ellist_t *, u_int64_t);
+static actlist_t *actlist_alloc(void);
+static void actlist_destroy(actlist_t *);
+static void actlist_insert(struct hfsc_class *);
+static void actlist_remove(struct hfsc_class *);
+static void actlist_update(struct hfsc_class *);
+
+static struct hfsc_class *actlist_firstfit(struct hfsc_class *,
+ u_int64_t);
+
+static __inline u_int64_t seg_x2y(u_int64_t, u_int64_t);
+static __inline u_int64_t seg_y2x(u_int64_t, u_int64_t);
+static __inline u_int64_t m2sm(u_int);
+static __inline u_int64_t m2ism(u_int);
+static __inline u_int64_t d2dx(u_int);
+static u_int sm2m(u_int64_t);
+static u_int dx2d(u_int64_t);
+
+static void sc2isc(struct service_curve *, struct internal_sc *);
+static void rtsc_init(struct runtime_sc *, struct internal_sc *,
+ u_int64_t, u_int64_t);
+static u_int64_t rtsc_y2x(struct runtime_sc *, u_int64_t);
+static u_int64_t rtsc_x2y(struct runtime_sc *, u_int64_t);
+static void rtsc_min(struct runtime_sc *, struct internal_sc *,
+ u_int64_t, u_int64_t);
+
+static void get_class_stats(struct hfsc_classstats *,
+ struct hfsc_class *);
+static struct hfsc_class *clh_to_clp(struct hfsc_if *, u_int32_t);
+
+
+#ifdef ALTQ3_COMPAT
+static struct hfsc_if *hfsc_attach(struct ifaltq *, u_int);
+static int hfsc_detach(struct hfsc_if *);
+static int hfsc_class_modify(struct hfsc_class *, struct service_curve *,
+ struct service_curve *, struct service_curve *);
+
+static int hfsccmd_if_attach(struct hfsc_attach *);
+static int hfsccmd_if_detach(struct hfsc_interface *);
+static int hfsccmd_add_class(struct hfsc_add_class *);
+static int hfsccmd_delete_class(struct hfsc_delete_class *);
+static int hfsccmd_modify_class(struct hfsc_modify_class *);
+static int hfsccmd_add_filter(struct hfsc_add_filter *);
+static int hfsccmd_delete_filter(struct hfsc_delete_filter *);
+static int hfsccmd_class_stats(struct hfsc_class_stats *);
+
+altqdev_decl(hfsc);
+#endif /* ALTQ3_COMPAT */
+
+/*
+ * macros
+ */
+#define is_a_parent_class(cl) ((cl)->cl_children != NULL)
+
+#define HT_INFINITY 0xffffffffffffffffLL /* infinite time value */
+
+#ifdef ALTQ3_COMPAT
+/* hif_list keeps all hfsc_if's allocated. */
+static struct hfsc_if *hif_list = NULL;
+#endif /* ALTQ3_COMPAT */
+
+int
+hfsc_pfattach(struct pf_altq *a)
+{
+ struct ifnet *ifp;
+ int s, error;
+
+ if ((ifp = ifunit(a->ifname)) == NULL || a->altq_disc == NULL)
+ return (EINVAL);
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ error = altq_attach(&ifp->if_snd, ALTQT_HFSC, a->altq_disc,
+ hfsc_enqueue, hfsc_dequeue, hfsc_request, NULL, NULL);
+ splx(s);
+ return (error);
+}
+
+int
+hfsc_add_altq(struct pf_altq *a)
+{
+ struct hfsc_if *hif;
+ struct ifnet *ifp;
+
+ if ((ifp = ifunit(a->ifname)) == NULL)
+ return (EINVAL);
+ if (!ALTQ_IS_READY(&ifp->if_snd))
+ return (ENODEV);
+
+ MALLOC(hif, struct hfsc_if *, sizeof(struct hfsc_if),
+ M_DEVBUF, M_WAITOK);
+ if (hif == NULL)
+ return (ENOMEM);
+ bzero(hif, sizeof(struct hfsc_if));
+
+ hif->hif_eligible = ellist_alloc();
+ if (hif->hif_eligible == NULL) {
+ FREE(hif, M_DEVBUF);
+ return (ENOMEM);
+ }
+
+ hif->hif_ifq = &ifp->if_snd;
+
+ /* keep the state in pf_altq */
+ a->altq_disc = hif;
+
+ return (0);
+}
+
+int
+hfsc_remove_altq(struct pf_altq *a)
+{
+ struct hfsc_if *hif;
+
+ if ((hif = a->altq_disc) == NULL)
+ return (EINVAL);
+ a->altq_disc = NULL;
+
+ (void)hfsc_clear_interface(hif);
+ (void)hfsc_class_destroy(hif->hif_rootclass);
+
+ ellist_destroy(hif->hif_eligible);
+
+ FREE(hif, M_DEVBUF);
+
+ return (0);
+}
+
+int
+hfsc_add_queue(struct pf_altq *a)
+{
+ struct hfsc_if *hif;
+ struct hfsc_class *cl, *parent;
+ struct hfsc_opts *opts;
+ struct service_curve rtsc, lssc, ulsc;
+
+ if ((hif = a->altq_disc) == NULL)
+ return (EINVAL);
+
+ opts = &a->pq_u.hfsc_opts;
+
+ if (a->parent_qid == HFSC_NULLCLASS_HANDLE &&
+ hif->hif_rootclass == NULL)
+ parent = NULL;
+ else if ((parent = clh_to_clp(hif, a->parent_qid)) == NULL)
+ return (EINVAL);
+
+ if (a->qid == 0)
+ return (EINVAL);
+
+ if (clh_to_clp(hif, a->qid) != NULL)
+ return (EBUSY);
+
+ rtsc.m1 = opts->rtsc_m1;
+ rtsc.d = opts->rtsc_d;
+ rtsc.m2 = opts->rtsc_m2;
+ lssc.m1 = opts->lssc_m1;
+ lssc.d = opts->lssc_d;
+ lssc.m2 = opts->lssc_m2;
+ ulsc.m1 = opts->ulsc_m1;
+ ulsc.d = opts->ulsc_d;
+ ulsc.m2 = opts->ulsc_m2;
+
+ cl = hfsc_class_create(hif, &rtsc, &lssc, &ulsc,
+ parent, a->qlimit, opts->flags, a->qid);
+ if (cl == NULL)
+ return (ENOMEM);
+
+ return (0);
+}
+
+int
+hfsc_remove_queue(struct pf_altq *a)
+{
+ struct hfsc_if *hif;
+ struct hfsc_class *cl;
+
+ if ((hif = a->altq_disc) == NULL)
+ return (EINVAL);
+
+ if ((cl = clh_to_clp(hif, a->qid)) == NULL)
+ return (EINVAL);
+
+ return (hfsc_class_destroy(cl));
+}
+
+int
+hfsc_getqstats(struct pf_altq *a, void *ubuf, int *nbytes)
+{
+ struct hfsc_if *hif;
+ struct hfsc_class *cl;
+ struct hfsc_classstats stats;
+ int error = 0;
+
+ if ((hif = altq_lookup(a->ifname, ALTQT_HFSC)) == NULL)
+ return (EBADF);
+
+ if ((cl = clh_to_clp(hif, a->qid)) == NULL)
+ return (EINVAL);
+
+ if (*nbytes < sizeof(stats))
+ return (EINVAL);
+
+ get_class_stats(&stats, cl);
+
+ if ((error = copyout((caddr_t)&stats, ubuf, sizeof(stats))) != 0)
+ return (error);
+ *nbytes = sizeof(stats);
+ return (0);
+}
+
+/*
+ * bring the interface back to the initial state by discarding
+ * all the filters and classes except the root class.
+ */
+static int
+hfsc_clear_interface(struct hfsc_if *hif)
+{
+ struct hfsc_class *cl;
+
+#ifdef ALTQ3_COMPAT
+ /* free the filters for this interface */
+ acc_discard_filters(&hif->hif_classifier, NULL, 1);
+#endif
+
+ /* clear out the classes */
+ while (hif->hif_rootclass != NULL &&
+ (cl = hif->hif_rootclass->cl_children) != NULL) {
+ /*
+ * remove the first leaf class found in the hierarchy
+ * then start over
+ */
+ for (; cl != NULL; cl = hfsc_nextclass(cl)) {
+ if (!is_a_parent_class(cl)) {
+ (void)hfsc_class_destroy(cl);
+ break;
+ }
+ }
+ }
+
+ return (0);
+}
+
+static int
+hfsc_request(struct ifaltq *ifq, int req, void *arg)
+{
+ struct hfsc_if *hif = (struct hfsc_if *)ifq->altq_disc;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ switch (req) {
+ case ALTRQ_PURGE:
+ hfsc_purge(hif);
+ break;
+ }
+ return (0);
+}
+
+/* discard all the queued packets on the interface */
+static void
+hfsc_purge(struct hfsc_if *hif)
+{
+ struct hfsc_class *cl;
+
+ for (cl = hif->hif_rootclass; cl != NULL; cl = hfsc_nextclass(cl))
+ if (!qempty(cl->cl_q))
+ hfsc_purgeq(cl);
+ if (ALTQ_IS_ENABLED(hif->hif_ifq))
+ hif->hif_ifq->ifq_len = 0;
+}
+
+struct hfsc_class *
+hfsc_class_create(struct hfsc_if *hif, struct service_curve *rsc,
+ struct service_curve *fsc, struct service_curve *usc,
+ struct hfsc_class *parent, int qlimit, int flags, int qid)
+{
+ struct hfsc_class *cl, *p;
+ int i, s;
+
+ if (hif->hif_classes >= HFSC_MAX_CLASSES)
+ return (NULL);
+
+#ifndef ALTQ_RED
+ if (flags & HFCF_RED) {
+#ifdef ALTQ_DEBUG
+ printf("hfsc_class_create: RED not configured for HFSC!\n");
+#endif
+ return (NULL);
+ }
+#endif
+
+ MALLOC(cl, struct hfsc_class *, sizeof(struct hfsc_class),
+ M_DEVBUF, M_WAITOK);
+ if (cl == NULL)
+ return (NULL);
+ bzero(cl, sizeof(struct hfsc_class));
+
+ MALLOC(cl->cl_q, class_queue_t *, sizeof(class_queue_t),
+ M_DEVBUF, M_WAITOK);
+ if (cl->cl_q == NULL)
+ goto err_ret;
+ bzero(cl->cl_q, sizeof(class_queue_t));
+
+ cl->cl_actc = actlist_alloc();
+ if (cl->cl_actc == NULL)
+ goto err_ret;
+
+ if (qlimit == 0)
+ qlimit = 50; /* use default */
+ qlimit(cl->cl_q) = qlimit;
+ qtype(cl->cl_q) = Q_DROPTAIL;
+ qlen(cl->cl_q) = 0;
+ cl->cl_flags = flags;
+#ifdef ALTQ_RED
+ if (flags & (HFCF_RED|HFCF_RIO)) {
+ int red_flags, red_pkttime;
+ u_int m2;
+
+ m2 = 0;
+ if (rsc != NULL && rsc->m2 > m2)
+ m2 = rsc->m2;
+ if (fsc != NULL && fsc->m2 > m2)
+ m2 = fsc->m2;
+ if (usc != NULL && usc->m2 > m2)
+ m2 = usc->m2;
+
+ red_flags = 0;
+ if (flags & HFCF_ECN)
+ red_flags |= REDF_ECN;
+#ifdef ALTQ_RIO
+ if (flags & HFCF_CLEARDSCP)
+ red_flags |= RIOF_CLEARDSCP;
+#endif
+ if (m2 < 8)
+ red_pkttime = 1000 * 1000 * 1000; /* 1 sec */
+ else
+ red_pkttime = (int64_t)hif->hif_ifq->altq_ifp->if_mtu
+ * 1000 * 1000 * 1000 / (m2 / 8);
+ if (flags & HFCF_RED) {
+ cl->cl_red = red_alloc(0, 0,
+ qlimit(cl->cl_q) * 10/100,
+ qlimit(cl->cl_q) * 30/100,
+ red_flags, red_pkttime);
+ if (cl->cl_red != NULL)
+ qtype(cl->cl_q) = Q_RED;
+ }
+#ifdef ALTQ_RIO
+ else {
+ cl->cl_red = (red_t *)rio_alloc(0, NULL,
+ red_flags, red_pkttime);
+ if (cl->cl_red != NULL)
+ qtype(cl->cl_q) = Q_RIO;
+ }
+#endif
+ }
+#endif /* ALTQ_RED */
+
+ if (rsc != NULL && (rsc->m1 != 0 || rsc->m2 != 0)) {
+ MALLOC(cl->cl_rsc, struct internal_sc *,
+ sizeof(struct internal_sc), M_DEVBUF, M_WAITOK);
+ if (cl->cl_rsc == NULL)
+ goto err_ret;
+ sc2isc(rsc, cl->cl_rsc);
+ rtsc_init(&cl->cl_deadline, cl->cl_rsc, 0, 0);
+ rtsc_init(&cl->cl_eligible, cl->cl_rsc, 0, 0);
+ }
+ if (fsc != NULL && (fsc->m1 != 0 || fsc->m2 != 0)) {
+ MALLOC(cl->cl_fsc, struct internal_sc *,
+ sizeof(struct internal_sc), M_DEVBUF, M_WAITOK);
+ if (cl->cl_fsc == NULL)
+ goto err_ret;
+ sc2isc(fsc, cl->cl_fsc);
+ rtsc_init(&cl->cl_virtual, cl->cl_fsc, 0, 0);
+ }
+ if (usc != NULL && (usc->m1 != 0 || usc->m2 != 0)) {
+ MALLOC(cl->cl_usc, struct internal_sc *,
+ sizeof(struct internal_sc), M_DEVBUF, M_WAITOK);
+ if (cl->cl_usc == NULL)
+ goto err_ret;
+ sc2isc(usc, cl->cl_usc);
+ rtsc_init(&cl->cl_ulimit, cl->cl_usc, 0, 0);
+ }
+
+ cl->cl_id = hif->hif_classid++;
+ cl->cl_handle = qid;
+ cl->cl_hif = hif;
+ cl->cl_parent = parent;
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_LOCK(hif->hif_ifq);
+ hif->hif_classes++;
+
+ /*
+ * find a free slot in the class table. if the slot matching
+ * the lower bits of qid is free, use this slot. otherwise,
+ * use the first free slot.
+ */
+ i = qid % HFSC_MAX_CLASSES;
+ if (hif->hif_class_tbl[i] == NULL)
+ hif->hif_class_tbl[i] = cl;
+ else {
+ for (i = 0; i < HFSC_MAX_CLASSES; i++)
+ if (hif->hif_class_tbl[i] == NULL) {
+ hif->hif_class_tbl[i] = cl;
+ break;
+ }
+ if (i == HFSC_MAX_CLASSES) {
+ IFQ_UNLOCK(hif->hif_ifq);
+ splx(s);
+ goto err_ret;
+ }
+ }
+
+ if (flags & HFCF_DEFAULTCLASS)
+ hif->hif_defaultclass = cl;
+
+ if (parent == NULL) {
+ /* this is root class */
+ hif->hif_rootclass = cl;
+ } else {
+ /* add this class to the children list of the parent */
+ if ((p = parent->cl_children) == NULL)
+ parent->cl_children = cl;
+ else {
+ while (p->cl_siblings != NULL)
+ p = p->cl_siblings;
+ p->cl_siblings = cl;
+ }
+ }
+ IFQ_UNLOCK(hif->hif_ifq);
+ splx(s);
+
+ return (cl);
+
+ err_ret:
+ if (cl->cl_actc != NULL)
+ actlist_destroy(cl->cl_actc);
+ if (cl->cl_red != NULL) {
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ rio_destroy((rio_t *)cl->cl_red);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ red_destroy(cl->cl_red);
+#endif
+ }
+ if (cl->cl_fsc != NULL)
+ FREE(cl->cl_fsc, M_DEVBUF);
+ if (cl->cl_rsc != NULL)
+ FREE(cl->cl_rsc, M_DEVBUF);
+ if (cl->cl_usc != NULL)
+ FREE(cl->cl_usc, M_DEVBUF);
+ if (cl->cl_q != NULL)
+ FREE(cl->cl_q, M_DEVBUF);
+ FREE(cl, M_DEVBUF);
+ return (NULL);
+}
+
+static int
+hfsc_class_destroy(struct hfsc_class *cl)
+{
+ int i, s;
+
+ if (cl == NULL)
+ return (0);
+
+ if (is_a_parent_class(cl))
+ return (EBUSY);
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_LOCK(cl->cl_hif->hif_ifq);
+
+#ifdef ALTQ3_COMPAT
+ /* delete filters referencing to this class */
+ acc_discard_filters(&cl->cl_hif->hif_classifier, cl, 0);
+#endif /* ALTQ3_COMPAT */
+
+ if (!qempty(cl->cl_q))
+ hfsc_purgeq(cl);
+
+ if (cl->cl_parent == NULL) {
+ /* this is root class */
+ } else {
+ struct hfsc_class *p = cl->cl_parent->cl_children;
+
+ if (p == cl)
+ cl->cl_parent->cl_children = cl->cl_siblings;
+ else do {
+ if (p->cl_siblings == cl) {
+ p->cl_siblings = cl->cl_siblings;
+ break;
+ }
+ } while ((p = p->cl_siblings) != NULL);
+ ASSERT(p != NULL);
+ }
+
+ for (i = 0; i < HFSC_MAX_CLASSES; i++)
+ if (cl->cl_hif->hif_class_tbl[i] == cl) {
+ cl->cl_hif->hif_class_tbl[i] = NULL;
+ break;
+ }
+
+ cl->cl_hif->hif_classes--;
+ IFQ_UNLOCK(cl->cl_hif->hif_ifq);
+ splx(s);
+
+ actlist_destroy(cl->cl_actc);
+
+ if (cl->cl_red != NULL) {
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ rio_destroy((rio_t *)cl->cl_red);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ red_destroy(cl->cl_red);
+#endif
+ }
+
+ IFQ_LOCK(cl->cl_hif->hif_ifq);
+ if (cl == cl->cl_hif->hif_rootclass)
+ cl->cl_hif->hif_rootclass = NULL;
+ if (cl == cl->cl_hif->hif_defaultclass)
+ cl->cl_hif->hif_defaultclass = NULL;
+ IFQ_UNLOCK(cl->cl_hif->hif_ifq);
+
+ if (cl->cl_usc != NULL)
+ FREE(cl->cl_usc, M_DEVBUF);
+ if (cl->cl_fsc != NULL)
+ FREE(cl->cl_fsc, M_DEVBUF);
+ if (cl->cl_rsc != NULL)
+ FREE(cl->cl_rsc, M_DEVBUF);
+ FREE(cl->cl_q, M_DEVBUF);
+ FREE(cl, M_DEVBUF);
+
+ return (0);
+}
+
+/*
+ * hfsc_nextclass returns the next class in the tree.
+ * usage:
+ * for (cl = hif->hif_rootclass; cl != NULL; cl = hfsc_nextclass(cl))
+ * do_something;
+ */
+static struct hfsc_class *
+hfsc_nextclass(struct hfsc_class *cl)
+{
+ if (cl->cl_children != NULL)
+ cl = cl->cl_children;
+ else if (cl->cl_siblings != NULL)
+ cl = cl->cl_siblings;
+ else {
+ while ((cl = cl->cl_parent) != NULL)
+ if (cl->cl_siblings) {
+ cl = cl->cl_siblings;
+ break;
+ }
+ }
+
+ return (cl);
+}
+
+/*
+ * hfsc_enqueue is an enqueue function to be registered to
+ * (*altq_enqueue) in struct ifaltq.
+ */
+static int
+hfsc_enqueue(struct ifaltq *ifq, struct mbuf *m, struct altq_pktattr *pktattr)
+{
+ struct hfsc_if *hif = (struct hfsc_if *)ifq->altq_disc;
+ struct hfsc_class *cl;
+ struct m_tag *t;
+ int len;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ /* grab class set by classifier */
+ if ((m->m_flags & M_PKTHDR) == 0) {
+ /* should not happen */
+#if defined(__NetBSD__) || defined(__OpenBSD__)\
+ || (defined(__FreeBSD__) && __FreeBSD_version >= 501113)
+ printf("altq: packet for %s does not have pkthdr\n",
+ ifq->altq_ifp->if_xname);
+#else
+ printf("altq: packet for %s%d does not have pkthdr\n",
+ ifq->altq_ifp->if_name, ifq->altq_ifp->if_unit);
+#endif
+ m_freem(m);
+ return (ENOBUFS);
+ }
+ cl = NULL;
+ if ((t = m_tag_find(m, PACKET_TAG_PF_QID, NULL)) != NULL)
+ cl = clh_to_clp(hif, ((struct altq_tag *)(t+1))->qid);
+#ifdef ALTQ3_COMPAT
+ else if ((ifq->altq_flags & ALTQF_CLASSIFY) && pktattr != NULL)
+ cl = pktattr->pattr_class;
+#endif
+ if (cl == NULL || is_a_parent_class(cl)) {
+ cl = hif->hif_defaultclass;
+ if (cl == NULL) {
+ m_freem(m);
+ return (ENOBUFS);
+ }
+ }
+#ifdef ALTQ3_COMPAT
+ if (pktattr != NULL)
+ cl->cl_pktattr = pktattr; /* save proto hdr used by ECN */
+ else
+#endif
+ cl->cl_pktattr = NULL;
+ len = m_pktlen(m);
+ if (hfsc_addq(cl, m) != 0) {
+ /* drop occurred. mbuf was freed in hfsc_addq. */
+ PKTCNTR_ADD(&cl->cl_stats.drop_cnt, len);
+ return (ENOBUFS);
+ }
+ IFQ_INC_LEN(ifq);
+ cl->cl_hif->hif_packets++;
+
+ /* successfully queued. */
+ if (qlen(cl->cl_q) == 1)
+ set_active(cl, m_pktlen(m));
+
+ return (0);
+}
+
+/*
+ * hfsc_dequeue is a dequeue function to be registered to
+ * (*altq_dequeue) in struct ifaltq.
+ *
+ * note: ALTDQ_POLL returns the next packet without removing the packet
+ * from the queue. ALTDQ_REMOVE is a normal dequeue operation.
+ * ALTDQ_REMOVE must return the same packet if called immediately
+ * after ALTDQ_POLL.
+ */
+static struct mbuf *
+hfsc_dequeue(struct ifaltq *ifq, int op)
+{
+ struct hfsc_if *hif = (struct hfsc_if *)ifq->altq_disc;
+ struct hfsc_class *cl;
+ struct mbuf *m;
+ int len, next_len;
+ int realtime = 0;
+ u_int64_t cur_time;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ if (hif->hif_packets == 0)
+ /* no packet in the tree */
+ return (NULL);
+
+ cur_time = read_machclk();
+
+ if (op == ALTDQ_REMOVE && hif->hif_pollcache != NULL) {
+
+ cl = hif->hif_pollcache;
+ hif->hif_pollcache = NULL;
+ /* check if the class was scheduled by real-time criteria */
+ if (cl->cl_rsc != NULL)
+ realtime = (cl->cl_e <= cur_time);
+ } else {
+ /*
+ * if there are eligible classes, use real-time criteria.
+ * find the class with the minimum deadline among
+ * the eligible classes.
+ */
+ if ((cl = ellist_get_mindl(hif->hif_eligible, cur_time))
+ != NULL) {
+ realtime = 1;
+ } else {
+#ifdef ALTQ_DEBUG
+ int fits = 0;
+#endif
+ /*
+ * use link-sharing criteria
+ * get the class with the minimum vt in the hierarchy
+ */
+ cl = hif->hif_rootclass;
+ while (is_a_parent_class(cl)) {
+
+ cl = actlist_firstfit(cl, cur_time);
+ if (cl == NULL) {
+#ifdef ALTQ_DEBUG
+ if (fits > 0)
+ printf("%d fit but none found\n",fits);
+#endif
+ return (NULL);
+ }
+ /*
+ * update parent's cl_cvtmin.
+ * don't update if the new vt is smaller.
+ */
+ if (cl->cl_parent->cl_cvtmin < cl->cl_vt)
+ cl->cl_parent->cl_cvtmin = cl->cl_vt;
+#ifdef ALTQ_DEBUG
+ fits++;
+#endif
+ }
+ }
+
+ if (op == ALTDQ_POLL) {
+ hif->hif_pollcache = cl;
+ m = hfsc_pollq(cl);
+ return (m);
+ }
+ }
+
+ m = hfsc_getq(cl);
+ if (m == NULL)
+ panic("hfsc_dequeue:");
+ len = m_pktlen(m);
+ cl->cl_hif->hif_packets--;
+ IFQ_DEC_LEN(ifq);
+ PKTCNTR_ADD(&cl->cl_stats.xmit_cnt, len);
+
+ update_vf(cl, len, cur_time);
+ if (realtime)
+ cl->cl_cumul += len;
+
+ if (!qempty(cl->cl_q)) {
+ if (cl->cl_rsc != NULL) {
+ /* update ed */
+ next_len = m_pktlen(qhead(cl->cl_q));
+
+ if (realtime)
+ update_ed(cl, next_len);
+ else
+ update_d(cl, next_len);
+ }
+ } else {
+ /* the class becomes passive */
+ set_passive(cl);
+ }
+
+ return (m);
+}
+
+static int
+hfsc_addq(struct hfsc_class *cl, struct mbuf *m)
+{
+
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ return rio_addq((rio_t *)cl->cl_red, cl->cl_q,
+ m, cl->cl_pktattr);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ return red_addq(cl->cl_red, cl->cl_q, m, cl->cl_pktattr);
+#endif
+ if (qlen(cl->cl_q) >= qlimit(cl->cl_q)) {
+ m_freem(m);
+ return (-1);
+ }
+
+ if (cl->cl_flags & HFCF_CLEARDSCP)
+ write_dsfield(m, cl->cl_pktattr, 0);
+
+ _addq(cl->cl_q, m);
+
+ return (0);
+}
+
+static struct mbuf *
+hfsc_getq(struct hfsc_class *cl)
+{
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ return rio_getq((rio_t *)cl->cl_red, cl->cl_q);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ return red_getq(cl->cl_red, cl->cl_q);
+#endif
+ return _getq(cl->cl_q);
+}
+
+static struct mbuf *
+hfsc_pollq(struct hfsc_class *cl)
+{
+ return qhead(cl->cl_q);
+}
+
+static void
+hfsc_purgeq(struct hfsc_class *cl)
+{
+ struct mbuf *m;
+
+ if (qempty(cl->cl_q))
+ return;
+
+ while ((m = _getq(cl->cl_q)) != NULL) {
+ PKTCNTR_ADD(&cl->cl_stats.drop_cnt, m_pktlen(m));
+ m_freem(m);
+ cl->cl_hif->hif_packets--;
+ IFQ_DEC_LEN(cl->cl_hif->hif_ifq);
+ }
+ ASSERT(qlen(cl->cl_q) == 0);
+
+ update_vf(cl, 0, 0); /* remove cl from the actlist */
+ set_passive(cl);
+}
+
+static void
+set_active(struct hfsc_class *cl, int len)
+{
+ if (cl->cl_rsc != NULL)
+ init_ed(cl, len);
+ if (cl->cl_fsc != NULL)
+ init_vf(cl, len);
+
+ cl->cl_stats.period++;
+}
+
+static void
+set_passive(struct hfsc_class *cl)
+{
+ if (cl->cl_rsc != NULL)
+ ellist_remove(cl);
+
+ /*
+ * actlist is now handled in update_vf() so that update_vf(cl, 0, 0)
+ * needs to be called explicitly to remove a class from actlist
+ */
+}
+
+static void
+init_ed(struct hfsc_class *cl, int next_len)
+{
+ u_int64_t cur_time;
+
+ cur_time = read_machclk();
+
+ /* update the deadline curve */
+ rtsc_min(&cl->cl_deadline, cl->cl_rsc, cur_time, cl->cl_cumul);
+
+ /*
+ * update the eligible curve.
+ * for concave, it is equal to the deadline curve.
+ * for convex, it is a linear curve with slope m2.
+ */
+ cl->cl_eligible = cl->cl_deadline;
+ if (cl->cl_rsc->sm1 <= cl->cl_rsc->sm2) {
+ cl->cl_eligible.dx = 0;
+ cl->cl_eligible.dy = 0;
+ }
+
+ /* compute e and d */
+ cl->cl_e = rtsc_y2x(&cl->cl_eligible, cl->cl_cumul);
+ cl->cl_d = rtsc_y2x(&cl->cl_deadline, cl->cl_cumul + next_len);
+
+ ellist_insert(cl);
+}
+
+static void
+update_ed(struct hfsc_class *cl, int next_len)
+{
+ cl->cl_e = rtsc_y2x(&cl->cl_eligible, cl->cl_cumul);
+ cl->cl_d = rtsc_y2x(&cl->cl_deadline, cl->cl_cumul + next_len);
+
+ ellist_update(cl);
+}
+
+static void
+update_d(struct hfsc_class *cl, int next_len)
+{
+ cl->cl_d = rtsc_y2x(&cl->cl_deadline, cl->cl_cumul + next_len);
+}
+
+static void
+init_vf(struct hfsc_class *cl, int len)
+{
+ struct hfsc_class *max_cl, *p;
+ u_int64_t vt, f, cur_time;
+ int go_active;
+
+ cur_time = 0;
+ go_active = 1;
+ for ( ; cl->cl_parent != NULL; cl = cl->cl_parent) {
+
+ if (go_active && cl->cl_nactive++ == 0)
+ go_active = 1;
+ else
+ go_active = 0;
+
+ if (go_active) {
+ max_cl = actlist_last(cl->cl_parent->cl_actc);
+ if (max_cl != NULL) {
+ /*
+ * set vt to the average of the min and max
+ * classes. if the parent's period didn't
+ * change, don't decrease vt of the class.
+ */
+ vt = max_cl->cl_vt;
+ if (cl->cl_parent->cl_cvtmin != 0)
+ vt = (cl->cl_parent->cl_cvtmin + vt)/2;
+
+ if (cl->cl_parent->cl_vtperiod !=
+ cl->cl_parentperiod || vt > cl->cl_vt)
+ cl->cl_vt = vt;
+ } else {
+ /*
+ * first child for a new parent backlog period.
+ * add parent's cvtmax to vtoff of children
+ * to make a new vt (vtoff + vt) larger than
+ * the vt in the last period for all children.
+ */
+ vt = cl->cl_parent->cl_cvtmax;
+ for (p = cl->cl_parent->cl_children; p != NULL;
+ p = p->cl_siblings)
+ p->cl_vtoff += vt;
+ cl->cl_vt = 0;
+ cl->cl_parent->cl_cvtmax = 0;
+ cl->cl_parent->cl_cvtmin = 0;
+ }
+ cl->cl_initvt = cl->cl_vt;
+
+ /* update the virtual curve */
+ vt = cl->cl_vt + cl->cl_vtoff;
+ rtsc_min(&cl->cl_virtual, cl->cl_fsc, vt, cl->cl_total);
+ if (cl->cl_virtual.x == vt) {
+ cl->cl_virtual.x -= cl->cl_vtoff;
+ cl->cl_vtoff = 0;
+ }
+ cl->cl_vtadj = 0;
+
+ cl->cl_vtperiod++; /* increment vt period */
+ cl->cl_parentperiod = cl->cl_parent->cl_vtperiod;
+ if (cl->cl_parent->cl_nactive == 0)
+ cl->cl_parentperiod++;
+ cl->cl_f = 0;
+
+ actlist_insert(cl);
+
+ if (cl->cl_usc != NULL) {
+ /* class has upper limit curve */
+ if (cur_time == 0)
+ cur_time = read_machclk();
+
+ /* update the ulimit curve */
+ rtsc_min(&cl->cl_ulimit, cl->cl_usc, cur_time,
+ cl->cl_total);
+ /* compute myf */
+ cl->cl_myf = rtsc_y2x(&cl->cl_ulimit,
+ cl->cl_total);
+ cl->cl_myfadj = 0;
+ }
+ }
+
+ if (cl->cl_myf > cl->cl_cfmin)
+ f = cl->cl_myf;
+ else
+ f = cl->cl_cfmin;
+ if (f != cl->cl_f) {
+ cl->cl_f = f;
+ update_cfmin(cl->cl_parent);
+ }
+ }
+}
+
+static void
+update_vf(struct hfsc_class *cl, int len, u_int64_t cur_time)
+{
+ u_int64_t f, myf_bound, delta;
+ int go_passive;
+
+ go_passive = qempty(cl->cl_q);
+
+ for (; cl->cl_parent != NULL; cl = cl->cl_parent) {
+
+ cl->cl_total += len;
+
+ if (cl->cl_fsc == NULL || cl->cl_nactive == 0)
+ continue;
+
+ if (go_passive && --cl->cl_nactive == 0)
+ go_passive = 1;
+ else
+ go_passive = 0;
+
+ if (go_passive) {
+ /* no more active child, going passive */
+
+ /* update cvtmax of the parent class */
+ if (cl->cl_vt > cl->cl_parent->cl_cvtmax)
+ cl->cl_parent->cl_cvtmax = cl->cl_vt;
+
+ /* remove this class from the vt list */
+ actlist_remove(cl);
+
+ update_cfmin(cl->cl_parent);
+
+ continue;
+ }
+
+ /*
+ * update vt and f
+ */
+ cl->cl_vt = rtsc_y2x(&cl->cl_virtual, cl->cl_total)
+ - cl->cl_vtoff + cl->cl_vtadj;
+
+ /*
+ * if vt of the class is smaller than cvtmin,
+ * the class was skipped in the past due to non-fit.
+ * if so, we need to adjust vtadj.
+ */
+ if (cl->cl_vt < cl->cl_parent->cl_cvtmin) {
+ cl->cl_vtadj += cl->cl_parent->cl_cvtmin - cl->cl_vt;
+ cl->cl_vt = cl->cl_parent->cl_cvtmin;
+ }
+
+ /* update the vt list */
+ actlist_update(cl);
+
+ if (cl->cl_usc != NULL) {
+ cl->cl_myf = cl->cl_myfadj
+ + rtsc_y2x(&cl->cl_ulimit, cl->cl_total);
+
+ /*
+ * if myf lags behind by more than one clock tick
+ * from the current time, adjust myfadj to prevent
+ * a rate-limited class from going greedy.
+ * in a steady state under rate-limiting, myf
+ * fluctuates within one clock tick.
+ */
+ myf_bound = cur_time - machclk_per_tick;
+ if (cl->cl_myf < myf_bound) {
+ delta = cur_time - cl->cl_myf;
+ cl->cl_myfadj += delta;
+ cl->cl_myf += delta;
+ }
+ }
+
+ /* cl_f is max(cl_myf, cl_cfmin) */
+ if (cl->cl_myf > cl->cl_cfmin)
+ f = cl->cl_myf;
+ else
+ f = cl->cl_cfmin;
+ if (f != cl->cl_f) {
+ cl->cl_f = f;
+ update_cfmin(cl->cl_parent);
+ }
+ }
+}
+
+static void
+update_cfmin(struct hfsc_class *cl)
+{
+ struct hfsc_class *p;
+ u_int64_t cfmin;
+
+ if (TAILQ_EMPTY(cl->cl_actc)) {
+ cl->cl_cfmin = 0;
+ return;
+ }
+ cfmin = HT_INFINITY;
+ TAILQ_FOREACH(p, cl->cl_actc, cl_actlist) {
+ if (p->cl_f == 0) {
+ cl->cl_cfmin = 0;
+ return;
+ }
+ if (p->cl_f < cfmin)
+ cfmin = p->cl_f;
+ }
+ cl->cl_cfmin = cfmin;
+}
+
+/*
+ * TAILQ based ellist and actlist implementation
+ * (ion wanted to make a calendar queue based implementation)
+ */
+/*
+ * eligible list holds backlogged classes being sorted by their eligible times.
+ * there is one eligible list per interface.
+ */
+
+static ellist_t *
+ellist_alloc(void)
+{
+ ellist_t *head;
+
+ MALLOC(head, ellist_t *, sizeof(ellist_t), M_DEVBUF, M_WAITOK);
+ TAILQ_INIT(head);
+ return (head);
+}
+
+static void
+ellist_destroy(ellist_t *head)
+{
+ FREE(head, M_DEVBUF);
+}
+
+static void
+ellist_insert(struct hfsc_class *cl)
+{
+ struct hfsc_if *hif = cl->cl_hif;
+ struct hfsc_class *p;
+
+ /* check the last entry first */
+ if ((p = TAILQ_LAST(hif->hif_eligible, _eligible)) == NULL ||
+ p->cl_e <= cl->cl_e) {
+ TAILQ_INSERT_TAIL(hif->hif_eligible, cl, cl_ellist);
+ return;
+ }
+
+ TAILQ_FOREACH(p, hif->hif_eligible, cl_ellist) {
+ if (cl->cl_e < p->cl_e) {
+ TAILQ_INSERT_BEFORE(p, cl, cl_ellist);
+ return;
+ }
+ }
+ ASSERT(0); /* should not reach here */
+}
+
+static void
+ellist_remove(struct hfsc_class *cl)
+{
+ struct hfsc_if *hif = cl->cl_hif;
+
+ TAILQ_REMOVE(hif->hif_eligible, cl, cl_ellist);
+}
+
+static void
+ellist_update(struct hfsc_class *cl)
+{
+ struct hfsc_if *hif = cl->cl_hif;
+ struct hfsc_class *p, *last;
+
+ /*
+ * the eligible time of a class increases monotonically.
+ * if the next entry has a larger eligible time, nothing to do.
+ */
+ p = TAILQ_NEXT(cl, cl_ellist);
+ if (p == NULL || cl->cl_e <= p->cl_e)
+ return;
+
+ /* check the last entry */
+ last = TAILQ_LAST(hif->hif_eligible, _eligible);
+ ASSERT(last != NULL);
+ if (last->cl_e <= cl->cl_e) {
+ TAILQ_REMOVE(hif->hif_eligible, cl, cl_ellist);
+ TAILQ_INSERT_TAIL(hif->hif_eligible, cl, cl_ellist);
+ return;
+ }
+
+ /*
+ * the new position must be between the next entry
+ * and the last entry
+ */
+ while ((p = TAILQ_NEXT(p, cl_ellist)) != NULL) {
+ if (cl->cl_e < p->cl_e) {
+ TAILQ_REMOVE(hif->hif_eligible, cl, cl_ellist);
+ TAILQ_INSERT_BEFORE(p, cl, cl_ellist);
+ return;
+ }
+ }
+ ASSERT(0); /* should not reach here */
+}
+
+/* find the class with the minimum deadline among the eligible classes */
+struct hfsc_class *
+ellist_get_mindl(ellist_t *head, u_int64_t cur_time)
+{
+ struct hfsc_class *p, *cl = NULL;
+
+ TAILQ_FOREACH(p, head, cl_ellist) {
+ if (p->cl_e > cur_time)
+ break;
+ if (cl == NULL || p->cl_d < cl->cl_d)
+ cl = p;
+ }
+ return (cl);
+}
+
+/*
+ * active children list holds backlogged child classes being sorted
+ * by their virtual time.
+ * each intermediate class has one active children list.
+ */
+static actlist_t *
+actlist_alloc(void)
+{
+ actlist_t *head;
+
+ MALLOC(head, actlist_t *, sizeof(actlist_t), M_DEVBUF, M_WAITOK);
+ TAILQ_INIT(head);
+ return (head);
+}
+
+static void
+actlist_destroy(actlist_t *head)
+{
+ FREE(head, M_DEVBUF);
+}
+static void
+actlist_insert(struct hfsc_class *cl)
+{
+ struct hfsc_class *p;
+
+ /* check the last entry first */
+ if ((p = TAILQ_LAST(cl->cl_parent->cl_actc, _active)) == NULL
+ || p->cl_vt <= cl->cl_vt) {
+ TAILQ_INSERT_TAIL(cl->cl_parent->cl_actc, cl, cl_actlist);
+ return;
+ }
+
+ TAILQ_FOREACH(p, cl->cl_parent->cl_actc, cl_actlist) {
+ if (cl->cl_vt < p->cl_vt) {
+ TAILQ_INSERT_BEFORE(p, cl, cl_actlist);
+ return;
+ }
+ }
+ ASSERT(0); /* should not reach here */
+}
+
+static void
+actlist_remove(struct hfsc_class *cl)
+{
+ TAILQ_REMOVE(cl->cl_parent->cl_actc, cl, cl_actlist);
+}
+
+static void
+actlist_update(struct hfsc_class *cl)
+{
+ struct hfsc_class *p, *last;
+
+ /*
+ * the virtual time of a class increases monotonically during its
+ * backlogged period.
+ * if the next entry has a larger virtual time, nothing to do.
+ */
+ p = TAILQ_NEXT(cl, cl_actlist);
+ if (p == NULL || cl->cl_vt < p->cl_vt)
+ return;
+
+ /* check the last entry */
+ last = TAILQ_LAST(cl->cl_parent->cl_actc, _active);
+ ASSERT(last != NULL);
+ if (last->cl_vt <= cl->cl_vt) {
+ TAILQ_REMOVE(cl->cl_parent->cl_actc, cl, cl_actlist);
+ TAILQ_INSERT_TAIL(cl->cl_parent->cl_actc, cl, cl_actlist);
+ return;
+ }
+
+ /*
+ * the new position must be between the next entry
+ * and the last entry
+ */
+ while ((p = TAILQ_NEXT(p, cl_actlist)) != NULL) {
+ if (cl->cl_vt < p->cl_vt) {
+ TAILQ_REMOVE(cl->cl_parent->cl_actc, cl, cl_actlist);
+ TAILQ_INSERT_BEFORE(p, cl, cl_actlist);
+ return;
+ }
+ }
+ ASSERT(0); /* should not reach here */
+}
+
+static struct hfsc_class *
+actlist_firstfit(struct hfsc_class *cl, u_int64_t cur_time)
+{
+ struct hfsc_class *p;
+
+ TAILQ_FOREACH(p, cl->cl_actc, cl_actlist) {
+ if (p->cl_f <= cur_time)
+ return (p);
+ }
+ return (NULL);
+}
+
+/*
+ * service curve support functions
+ *
+ * external service curve parameters
+ * m: bits/sec
+ * d: msec
+ * internal service curve parameters
+ * sm: (bytes/tsc_interval) << SM_SHIFT
+ * ism: (tsc_count/byte) << ISM_SHIFT
+ * dx: tsc_count
+ *
+ * SM_SHIFT and ISM_SHIFT are scaled in order to keep effective digits.
+ * we should be able to handle 100K-1Gbps linkspeed with 200Hz-1GHz CPU
+ * speed. SM_SHIFT and ISM_SHIFT are selected to have at least 3 effective
+ * digits in decimal using the following table.
+ *
+ * bits/sec 100Kbps 1Mbps 10Mbps 100Mbps 1Gbps
+ * ----------+-------------------------------------------------------
+ * bytes/nsec 12.5e-6 125e-6 1250e-6 12500e-6 125000e-6
+ * sm(500MHz) 25.0e-6 250e-6 2500e-6 25000e-6 250000e-6
+ * sm(200MHz) 62.5e-6 625e-6 6250e-6 62500e-6 625000e-6
+ *
+ * nsec/byte 80000 8000 800 80 8
+ * ism(500MHz) 40000 4000 400 40 4
+ * ism(200MHz) 16000 1600 160 16 1.6
+ */
+#define SM_SHIFT 24
+#define ISM_SHIFT 10
+
+#define SM_MASK ((1LL << SM_SHIFT) - 1)
+#define ISM_MASK ((1LL << ISM_SHIFT) - 1)
+
+static __inline u_int64_t
+seg_x2y(u_int64_t x, u_int64_t sm)
+{
+ u_int64_t y;
+
+ /*
+ * compute
+ * y = x * sm >> SM_SHIFT
+ * but divide it for the upper and lower bits to avoid overflow
+ */
+ y = (x >> SM_SHIFT) * sm + (((x & SM_MASK) * sm) >> SM_SHIFT);
+ return (y);
+}
+
+static __inline u_int64_t
+seg_y2x(u_int64_t y, u_int64_t ism)
+{
+ u_int64_t x;
+
+ if (y == 0)
+ x = 0;
+ else if (ism == HT_INFINITY)
+ x = HT_INFINITY;
+ else {
+ x = (y >> ISM_SHIFT) * ism
+ + (((y & ISM_MASK) * ism) >> ISM_SHIFT);
+ }
+ return (x);
+}
+
+static __inline u_int64_t
+m2sm(u_int m)
+{
+ u_int64_t sm;
+
+ sm = ((u_int64_t)m << SM_SHIFT) / 8 / machclk_freq;
+ return (sm);
+}
+
+static __inline u_int64_t
+m2ism(u_int m)
+{
+ u_int64_t ism;
+
+ if (m == 0)
+ ism = HT_INFINITY;
+ else
+ ism = ((u_int64_t)machclk_freq << ISM_SHIFT) * 8 / m;
+ return (ism);
+}
+
+static __inline u_int64_t
+d2dx(u_int d)
+{
+ u_int64_t dx;
+
+ dx = ((u_int64_t)d * machclk_freq) / 1000;
+ return (dx);
+}
+
+static u_int
+sm2m(u_int64_t sm)
+{
+ u_int64_t m;
+
+ m = (sm * 8 * machclk_freq) >> SM_SHIFT;
+ return ((u_int)m);
+}
+
+static u_int
+dx2d(u_int64_t dx)
+{
+ u_int64_t d;
+
+ d = dx * 1000 / machclk_freq;
+ return ((u_int)d);
+}
+
+static void
+sc2isc(struct service_curve *sc, struct internal_sc *isc)
+{
+ isc->sm1 = m2sm(sc->m1);
+ isc->ism1 = m2ism(sc->m1);
+ isc->dx = d2dx(sc->d);
+ isc->dy = seg_x2y(isc->dx, isc->sm1);
+ isc->sm2 = m2sm(sc->m2);
+ isc->ism2 = m2ism(sc->m2);
+}
+
+/*
+ * initialize the runtime service curve with the given internal
+ * service curve starting at (x, y).
+ */
+static void
+rtsc_init(struct runtime_sc *rtsc, struct internal_sc * isc, u_int64_t x,
+ u_int64_t y)
+{
+ rtsc->x = x;
+ rtsc->y = y;
+ rtsc->sm1 = isc->sm1;
+ rtsc->ism1 = isc->ism1;
+ rtsc->dx = isc->dx;
+ rtsc->dy = isc->dy;
+ rtsc->sm2 = isc->sm2;
+ rtsc->ism2 = isc->ism2;
+}
+
+/*
+ * calculate the y-projection of the runtime service curve by the
+ * given x-projection value
+ */
+static u_int64_t
+rtsc_y2x(struct runtime_sc *rtsc, u_int64_t y)
+{
+ u_int64_t x;
+
+ if (y < rtsc->y)
+ x = rtsc->x;
+ else if (y <= rtsc->y + rtsc->dy) {
+ /* x belongs to the 1st segment */
+ if (rtsc->dy == 0)
+ x = rtsc->x + rtsc->dx;
+ else
+ x = rtsc->x + seg_y2x(y - rtsc->y, rtsc->ism1);
+ } else {
+ /* x belongs to the 2nd segment */
+ x = rtsc->x + rtsc->dx
+ + seg_y2x(y - rtsc->y - rtsc->dy, rtsc->ism2);
+ }
+ return (x);
+}
+
+static u_int64_t
+rtsc_x2y(struct runtime_sc *rtsc, u_int64_t x)
+{
+ u_int64_t y;
+
+ if (x <= rtsc->x)
+ y = rtsc->y;
+ else if (x <= rtsc->x + rtsc->dx)
+ /* y belongs to the 1st segment */
+ y = rtsc->y + seg_x2y(x - rtsc->x, rtsc->sm1);
+ else
+ /* y belongs to the 2nd segment */
+ y = rtsc->y + rtsc->dy
+ + seg_x2y(x - rtsc->x - rtsc->dx, rtsc->sm2);
+ return (y);
+}
+
+/*
+ * update the runtime service curve by taking the minimum of the current
+ * runtime service curve and the service curve starting at (x, y).
+ */
+static void
+rtsc_min(struct runtime_sc *rtsc, struct internal_sc *isc, u_int64_t x,
+ u_int64_t y)
+{
+ u_int64_t y1, y2, dx, dy;
+
+ if (isc->sm1 <= isc->sm2) {
+ /* service curve is convex */
+ y1 = rtsc_x2y(rtsc, x);
+ if (y1 < y)
+ /* the current rtsc is smaller */
+ return;
+ rtsc->x = x;
+ rtsc->y = y;
+ return;
+ }
+
+ /*
+ * service curve is concave
+ * compute the two y values of the current rtsc
+ * y1: at x
+ * y2: at (x + dx)
+ */
+ y1 = rtsc_x2y(rtsc, x);
+ if (y1 <= y) {
+ /* rtsc is below isc, no change to rtsc */
+ return;
+ }
+
+ y2 = rtsc_x2y(rtsc, x + isc->dx);
+ if (y2 >= y + isc->dy) {
+ /* rtsc is above isc, replace rtsc by isc */
+ rtsc->x = x;
+ rtsc->y = y;
+ rtsc->dx = isc->dx;
+ rtsc->dy = isc->dy;
+ return;
+ }
+
+ /*
+ * the two curves intersect
+ * compute the offsets (dx, dy) using the reverse
+ * function of seg_x2y()
+ * seg_x2y(dx, sm1) == seg_x2y(dx, sm2) + (y1 - y)
+ */
+ dx = ((y1 - y) << SM_SHIFT) / (isc->sm1 - isc->sm2);
+ /*
+ * check if (x, y1) belongs to the 1st segment of rtsc.
+ * if so, add the offset.
+ */
+ if (rtsc->x + rtsc->dx > x)
+ dx += rtsc->x + rtsc->dx - x;
+ dy = seg_x2y(dx, isc->sm1);
+
+ rtsc->x = x;
+ rtsc->y = y;
+ rtsc->dx = dx;
+ rtsc->dy = dy;
+ return;
+}
+
+static void
+get_class_stats(struct hfsc_classstats *sp, struct hfsc_class *cl)
+{
+ sp->class_id = cl->cl_id;
+ sp->class_handle = cl->cl_handle;
+
+ if (cl->cl_rsc != NULL) {
+ sp->rsc.m1 = sm2m(cl->cl_rsc->sm1);
+ sp->rsc.d = dx2d(cl->cl_rsc->dx);
+ sp->rsc.m2 = sm2m(cl->cl_rsc->sm2);
+ } else {
+ sp->rsc.m1 = 0;
+ sp->rsc.d = 0;
+ sp->rsc.m2 = 0;
+ }
+ if (cl->cl_fsc != NULL) {
+ sp->fsc.m1 = sm2m(cl->cl_fsc->sm1);
+ sp->fsc.d = dx2d(cl->cl_fsc->dx);
+ sp->fsc.m2 = sm2m(cl->cl_fsc->sm2);
+ } else {
+ sp->fsc.m1 = 0;
+ sp->fsc.d = 0;
+ sp->fsc.m2 = 0;
+ }
+ if (cl->cl_usc != NULL) {
+ sp->usc.m1 = sm2m(cl->cl_usc->sm1);
+ sp->usc.d = dx2d(cl->cl_usc->dx);
+ sp->usc.m2 = sm2m(cl->cl_usc->sm2);
+ } else {
+ sp->usc.m1 = 0;
+ sp->usc.d = 0;
+ sp->usc.m2 = 0;
+ }
+
+ sp->total = cl->cl_total;
+ sp->cumul = cl->cl_cumul;
+
+ sp->d = cl->cl_d;
+ sp->e = cl->cl_e;
+ sp->vt = cl->cl_vt;
+ sp->f = cl->cl_f;
+
+ sp->initvt = cl->cl_initvt;
+ sp->vtperiod = cl->cl_vtperiod;
+ sp->parentperiod = cl->cl_parentperiod;
+ sp->nactive = cl->cl_nactive;
+ sp->vtoff = cl->cl_vtoff;
+ sp->cvtmax = cl->cl_cvtmax;
+ sp->myf = cl->cl_myf;
+ sp->cfmin = cl->cl_cfmin;
+ sp->cvtmin = cl->cl_cvtmin;
+ sp->myfadj = cl->cl_myfadj;
+ sp->vtadj = cl->cl_vtadj;
+
+ sp->cur_time = read_machclk();
+ sp->machclk_freq = machclk_freq;
+
+ sp->qlength = qlen(cl->cl_q);
+ sp->qlimit = qlimit(cl->cl_q);
+ sp->xmit_cnt = cl->cl_stats.xmit_cnt;
+ sp->drop_cnt = cl->cl_stats.drop_cnt;
+ sp->period = cl->cl_stats.period;
+
+ sp->qtype = qtype(cl->cl_q);
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ red_getstats(cl->cl_red, &sp->red[0]);
+#endif
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ rio_getstats((rio_t *)cl->cl_red, &sp->red[0]);
+#endif
+}
+
+/* convert a class handle to the corresponding class pointer */
+static struct hfsc_class *
+clh_to_clp(struct hfsc_if *hif, u_int32_t chandle)
+{
+ int i;
+ struct hfsc_class *cl;
+
+ if (chandle == 0)
+ return (NULL);
+ /*
+ * first, try optimistically the slot matching the lower bits of
+ * the handle. if it fails, do the linear table search.
+ */
+ i = chandle % HFSC_MAX_CLASSES;
+ if ((cl = hif->hif_class_tbl[i]) != NULL && cl->cl_handle == chandle)
+ return (cl);
+ for (i = 0; i < HFSC_MAX_CLASSES; i++)
+ if ((cl = hif->hif_class_tbl[i]) != NULL &&
+ cl->cl_handle == chandle)
+ return (cl);
+ return (NULL);
+}
+
+#ifdef ALTQ3_COMPAT
+static struct hfsc_if *
+hfsc_attach(ifq, bandwidth)
+ struct ifaltq *ifq;
+ u_int bandwidth;
+{
+ struct hfsc_if *hif;
+
+ MALLOC(hif, struct hfsc_if *, sizeof(struct hfsc_if),
+ M_DEVBUF, M_WAITOK);
+ if (hif == NULL)
+ return (NULL);
+ bzero(hif, sizeof(struct hfsc_if));
+
+ hif->hif_eligible = ellist_alloc();
+ if (hif->hif_eligible == NULL) {
+ FREE(hif, M_DEVBUF);
+ return NULL;
+ }
+
+ hif->hif_ifq = ifq;
+
+ /* add this state to the hfsc list */
+ hif->hif_next = hif_list;
+ hif_list = hif;
+
+ return (hif);
+}
+
+static int
+hfsc_detach(hif)
+ struct hfsc_if *hif;
+{
+ (void)hfsc_clear_interface(hif);
+ (void)hfsc_class_destroy(hif->hif_rootclass);
+
+ /* remove this interface from the hif list */
+ if (hif_list == hif)
+ hif_list = hif->hif_next;
+ else {
+ struct hfsc_if *h;
+
+ for (h = hif_list; h != NULL; h = h->hif_next)
+ if (h->hif_next == hif) {
+ h->hif_next = hif->hif_next;
+ break;
+ }
+ ASSERT(h != NULL);
+ }
+
+ ellist_destroy(hif->hif_eligible);
+
+ FREE(hif, M_DEVBUF);
+
+ return (0);
+}
+
+static int
+hfsc_class_modify(cl, rsc, fsc, usc)
+ struct hfsc_class *cl;
+ struct service_curve *rsc, *fsc, *usc;
+{
+ struct internal_sc *rsc_tmp, *fsc_tmp, *usc_tmp;
+ u_int64_t cur_time;
+ int s;
+
+ rsc_tmp = fsc_tmp = usc_tmp = NULL;
+ if (rsc != NULL && (rsc->m1 != 0 || rsc->m2 != 0) &&
+ cl->cl_rsc == NULL) {
+ MALLOC(rsc_tmp, struct internal_sc *,
+ sizeof(struct internal_sc), M_DEVBUF, M_WAITOK);
+ if (rsc_tmp == NULL)
+ return (ENOMEM);
+ }
+ if (fsc != NULL && (fsc->m1 != 0 || fsc->m2 != 0) &&
+ cl->cl_fsc == NULL) {
+ MALLOC(fsc_tmp, struct internal_sc *,
+ sizeof(struct internal_sc), M_DEVBUF, M_WAITOK);
+ if (fsc_tmp == NULL)
+ return (ENOMEM);
+ }
+ if (usc != NULL && (usc->m1 != 0 || usc->m2 != 0) &&
+ cl->cl_usc == NULL) {
+ MALLOC(usc_tmp, struct internal_sc *,
+ sizeof(struct internal_sc), M_DEVBUF, M_WAITOK);
+ if (usc_tmp == NULL)
+ return (ENOMEM);
+ }
+
+ cur_time = read_machclk();
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_LOCK(cl->cl_hif->hif_ifq);
+
+ if (rsc != NULL) {
+ if (rsc->m1 == 0 && rsc->m2 == 0) {
+ if (cl->cl_rsc != NULL) {
+ if (!qempty(cl->cl_q))
+ hfsc_purgeq(cl);
+ FREE(cl->cl_rsc, M_DEVBUF);
+ cl->cl_rsc = NULL;
+ }
+ } else {
+ if (cl->cl_rsc == NULL)
+ cl->cl_rsc = rsc_tmp;
+ sc2isc(rsc, cl->cl_rsc);
+ rtsc_init(&cl->cl_deadline, cl->cl_rsc, cur_time,
+ cl->cl_cumul);
+ cl->cl_eligible = cl->cl_deadline;
+ if (cl->cl_rsc->sm1 <= cl->cl_rsc->sm2) {
+ cl->cl_eligible.dx = 0;
+ cl->cl_eligible.dy = 0;
+ }
+ }
+ }
+
+ if (fsc != NULL) {
+ if (fsc->m1 == 0 && fsc->m2 == 0) {
+ if (cl->cl_fsc != NULL) {
+ if (!qempty(cl->cl_q))
+ hfsc_purgeq(cl);
+ FREE(cl->cl_fsc, M_DEVBUF);
+ cl->cl_fsc = NULL;
+ }
+ } else {
+ if (cl->cl_fsc == NULL)
+ cl->cl_fsc = fsc_tmp;
+ sc2isc(fsc, cl->cl_fsc);
+ rtsc_init(&cl->cl_virtual, cl->cl_fsc, cl->cl_vt,
+ cl->cl_total);
+ }
+ }
+
+ if (usc != NULL) {
+ if (usc->m1 == 0 && usc->m2 == 0) {
+ if (cl->cl_usc != NULL) {
+ FREE(cl->cl_usc, M_DEVBUF);
+ cl->cl_usc = NULL;
+ cl->cl_myf = 0;
+ }
+ } else {
+ if (cl->cl_usc == NULL)
+ cl->cl_usc = usc_tmp;
+ sc2isc(usc, cl->cl_usc);
+ rtsc_init(&cl->cl_ulimit, cl->cl_usc, cur_time,
+ cl->cl_total);
+ }
+ }
+
+ if (!qempty(cl->cl_q)) {
+ if (cl->cl_rsc != NULL)
+ update_ed(cl, m_pktlen(qhead(cl->cl_q)));
+ if (cl->cl_fsc != NULL)
+ update_vf(cl, 0, cur_time);
+ /* is this enough? */
+ }
+
+ IFQ_UNLOCK(cl->cl_hif->hif_ifq);
+ splx(s);
+
+ return (0);
+}
+
+/*
+ * hfsc device interface
+ */
+int
+hfscopen(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ if (machclk_freq == 0)
+ init_machclk();
+
+ if (machclk_freq == 0) {
+ printf("hfsc: no cpu clock available!\n");
+ return (ENXIO);
+ }
+
+ /* everything will be done when the queueing scheme is attached. */
+ return 0;
+}
+
+int
+hfscclose(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ struct hfsc_if *hif;
+ int err, error = 0;
+
+ while ((hif = hif_list) != NULL) {
+ /* destroy all */
+ if (ALTQ_IS_ENABLED(hif->hif_ifq))
+ altq_disable(hif->hif_ifq);
+
+ err = altq_detach(hif->hif_ifq);
+ if (err == 0)
+ err = hfsc_detach(hif);
+ if (err != 0 && error == 0)
+ error = err;
+ }
+
+ return error;
+}
+
+int
+hfscioctl(dev, cmd, addr, flag, p)
+ dev_t dev;
+ ioctlcmd_t cmd;
+ caddr_t addr;
+ int flag;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ struct hfsc_if *hif;
+ struct hfsc_interface *ifacep;
+ int error = 0;
+
+ /* check super-user privilege */
+ switch (cmd) {
+ case HFSC_GETSTATS:
+ break;
+ default:
+#if (__FreeBSD_version > 700000)
+ if ((error = priv_check(p, PRIV_ALTQ_MANAGE)) != 0)
+ return (error);
+#elsif (__FreeBSD_version > 400000)
+ if ((error = suser(p)) != 0)
+ return (error);
+#else
+ if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
+ return (error);
+#endif
+ break;
+ }
+
+ switch (cmd) {
+
+ case HFSC_IF_ATTACH:
+ error = hfsccmd_if_attach((struct hfsc_attach *)addr);
+ break;
+
+ case HFSC_IF_DETACH:
+ error = hfsccmd_if_detach((struct hfsc_interface *)addr);
+ break;
+
+ case HFSC_ENABLE:
+ case HFSC_DISABLE:
+ case HFSC_CLEAR_HIERARCHY:
+ ifacep = (struct hfsc_interface *)addr;
+ if ((hif = altq_lookup(ifacep->hfsc_ifname,
+ ALTQT_HFSC)) == NULL) {
+ error = EBADF;
+ break;
+ }
+
+ switch (cmd) {
+
+ case HFSC_ENABLE:
+ if (hif->hif_defaultclass == NULL) {
+#ifdef ALTQ_DEBUG
+ printf("hfsc: no default class\n");
+#endif
+ error = EINVAL;
+ break;
+ }
+ error = altq_enable(hif->hif_ifq);
+ break;
+
+ case HFSC_DISABLE:
+ error = altq_disable(hif->hif_ifq);
+ break;
+
+ case HFSC_CLEAR_HIERARCHY:
+ hfsc_clear_interface(hif);
+ break;
+ }
+ break;
+
+ case HFSC_ADD_CLASS:
+ error = hfsccmd_add_class((struct hfsc_add_class *)addr);
+ break;
+
+ case HFSC_DEL_CLASS:
+ error = hfsccmd_delete_class((struct hfsc_delete_class *)addr);
+ break;
+
+ case HFSC_MOD_CLASS:
+ error = hfsccmd_modify_class((struct hfsc_modify_class *)addr);
+ break;
+
+ case HFSC_ADD_FILTER:
+ error = hfsccmd_add_filter((struct hfsc_add_filter *)addr);
+ break;
+
+ case HFSC_DEL_FILTER:
+ error = hfsccmd_delete_filter((struct hfsc_delete_filter *)addr);
+ break;
+
+ case HFSC_GETSTATS:
+ error = hfsccmd_class_stats((struct hfsc_class_stats *)addr);
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+static int
+hfsccmd_if_attach(ap)
+ struct hfsc_attach *ap;
+{
+ struct hfsc_if *hif;
+ struct ifnet *ifp;
+ int error;
+
+ if ((ifp = ifunit(ap->iface.hfsc_ifname)) == NULL)
+ return (ENXIO);
+
+ if ((hif = hfsc_attach(&ifp->if_snd, ap->bandwidth)) == NULL)
+ return (ENOMEM);
+
+ /*
+ * set HFSC to this ifnet structure.
+ */
+ if ((error = altq_attach(&ifp->if_snd, ALTQT_HFSC, hif,
+ hfsc_enqueue, hfsc_dequeue, hfsc_request,
+ &hif->hif_classifier, acc_classify)) != 0)
+ (void)hfsc_detach(hif);
+
+ return (error);
+}
+
+static int
+hfsccmd_if_detach(ap)
+ struct hfsc_interface *ap;
+{
+ struct hfsc_if *hif;
+ int error;
+
+ if ((hif = altq_lookup(ap->hfsc_ifname, ALTQT_HFSC)) == NULL)
+ return (EBADF);
+
+ if (ALTQ_IS_ENABLED(hif->hif_ifq))
+ altq_disable(hif->hif_ifq);
+
+ if ((error = altq_detach(hif->hif_ifq)))
+ return (error);
+
+ return hfsc_detach(hif);
+}
+
+static int
+hfsccmd_add_class(ap)
+ struct hfsc_add_class *ap;
+{
+ struct hfsc_if *hif;
+ struct hfsc_class *cl, *parent;
+ int i;
+
+ if ((hif = altq_lookup(ap->iface.hfsc_ifname, ALTQT_HFSC)) == NULL)
+ return (EBADF);
+
+ if (ap->parent_handle == HFSC_NULLCLASS_HANDLE &&
+ hif->hif_rootclass == NULL)
+ parent = NULL;
+ else if ((parent = clh_to_clp(hif, ap->parent_handle)) == NULL)
+ return (EINVAL);
+
+ /* assign a class handle (use a free slot number for now) */
+ for (i = 1; i < HFSC_MAX_CLASSES; i++)
+ if (hif->hif_class_tbl[i] == NULL)
+ break;
+ if (i == HFSC_MAX_CLASSES)
+ return (EBUSY);
+
+ if ((cl = hfsc_class_create(hif, &ap->service_curve, NULL, NULL,
+ parent, ap->qlimit, ap->flags, i)) == NULL)
+ return (ENOMEM);
+
+ /* return a class handle to the user */
+ ap->class_handle = i;
+
+ return (0);
+}
+
+static int
+hfsccmd_delete_class(ap)
+ struct hfsc_delete_class *ap;
+{
+ struct hfsc_if *hif;
+ struct hfsc_class *cl;
+
+ if ((hif = altq_lookup(ap->iface.hfsc_ifname, ALTQT_HFSC)) == NULL)
+ return (EBADF);
+
+ if ((cl = clh_to_clp(hif, ap->class_handle)) == NULL)
+ return (EINVAL);
+
+ return hfsc_class_destroy(cl);
+}
+
+static int
+hfsccmd_modify_class(ap)
+ struct hfsc_modify_class *ap;
+{
+ struct hfsc_if *hif;
+ struct hfsc_class *cl;
+ struct service_curve *rsc = NULL;
+ struct service_curve *fsc = NULL;
+ struct service_curve *usc = NULL;
+
+ if ((hif = altq_lookup(ap->iface.hfsc_ifname, ALTQT_HFSC)) == NULL)
+ return (EBADF);
+
+ if ((cl = clh_to_clp(hif, ap->class_handle)) == NULL)
+ return (EINVAL);
+
+ if (ap->sctype & HFSC_REALTIMESC)
+ rsc = &ap->service_curve;
+ if (ap->sctype & HFSC_LINKSHARINGSC)
+ fsc = &ap->service_curve;
+ if (ap->sctype & HFSC_UPPERLIMITSC)
+ usc = &ap->service_curve;
+
+ return hfsc_class_modify(cl, rsc, fsc, usc);
+}
+
+static int
+hfsccmd_add_filter(ap)
+ struct hfsc_add_filter *ap;
+{
+ struct hfsc_if *hif;
+ struct hfsc_class *cl;
+
+ if ((hif = altq_lookup(ap->iface.hfsc_ifname, ALTQT_HFSC)) == NULL)
+ return (EBADF);
+
+ if ((cl = clh_to_clp(hif, ap->class_handle)) == NULL)
+ return (EINVAL);
+
+ if (is_a_parent_class(cl)) {
+#ifdef ALTQ_DEBUG
+ printf("hfsccmd_add_filter: not a leaf class!\n");
+#endif
+ return (EINVAL);
+ }
+
+ return acc_add_filter(&hif->hif_classifier, &ap->filter,
+ cl, &ap->filter_handle);
+}
+
+static int
+hfsccmd_delete_filter(ap)
+ struct hfsc_delete_filter *ap;
+{
+ struct hfsc_if *hif;
+
+ if ((hif = altq_lookup(ap->iface.hfsc_ifname, ALTQT_HFSC)) == NULL)
+ return (EBADF);
+
+ return acc_delete_filter(&hif->hif_classifier,
+ ap->filter_handle);
+}
+
+static int
+hfsccmd_class_stats(ap)
+ struct hfsc_class_stats *ap;
+{
+ struct hfsc_if *hif;
+ struct hfsc_class *cl;
+ struct hfsc_classstats stats, *usp;
+ int n, nclasses, error;
+
+ if ((hif = altq_lookup(ap->iface.hfsc_ifname, ALTQT_HFSC)) == NULL)
+ return (EBADF);
+
+ ap->cur_time = read_machclk();
+ ap->machclk_freq = machclk_freq;
+ ap->hif_classes = hif->hif_classes;
+ ap->hif_packets = hif->hif_packets;
+
+ /* skip the first N classes in the tree */
+ nclasses = ap->nskip;
+ for (cl = hif->hif_rootclass, n = 0; cl != NULL && n < nclasses;
+ cl = hfsc_nextclass(cl), n++)
+ ;
+ if (n != nclasses)
+ return (EINVAL);
+
+ /* then, read the next N classes in the tree */
+ nclasses = ap->nclasses;
+ usp = ap->stats;
+ for (n = 0; cl != NULL && n < nclasses; cl = hfsc_nextclass(cl), n++) {
+
+ get_class_stats(&stats, cl);
+
+ if ((error = copyout((caddr_t)&stats, (caddr_t)usp++,
+ sizeof(stats))) != 0)
+ return (error);
+ }
+
+ ap->nclasses = n;
+
+ return (0);
+}
+
+#ifdef KLD_MODULE
+
+static struct altqsw hfsc_sw =
+ {"hfsc", hfscopen, hfscclose, hfscioctl};
+
+ALTQ_MODULE(altq_hfsc, ALTQT_HFSC, &hfsc_sw);
+MODULE_DEPEND(altq_hfsc, altq_red, 1, 1, 1);
+MODULE_DEPEND(altq_hfsc, altq_rio, 1, 1, 1);
+
+#endif /* KLD_MODULE */
+#endif /* ALTQ3_COMPAT */
+
+#endif /* ALTQ_HFSC */
diff --git a/sys/contrib/altq/altq/altq_hfsc.h b/sys/contrib/altq/altq/altq_hfsc.h
new file mode 100644
index 0000000..91ba3d1
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_hfsc.h
@@ -0,0 +1,320 @@
+/* $KAME: altq_hfsc.h,v 1.12 2003/12/05 05:40:46 kjc Exp $ */
+
+/*
+ * Copyright (c) 1997-1999 Carnegie Mellon University. All Rights Reserved.
+ *
+ * Permission to use, copy, modify, and distribute this software and
+ * its documentation is hereby granted (including for commercial or
+ * for-profit use), provided that both the copyright notice and this
+ * permission notice appear in all copies of the software, derivative
+ * works, or modified versions, and any portions thereof.
+ *
+ * THIS SOFTWARE IS EXPERIMENTAL AND IS KNOWN TO HAVE BUGS, SOME OF
+ * WHICH MAY HAVE SERIOUS CONSEQUENCES. CARNEGIE MELLON PROVIDES THIS
+ * SOFTWARE IN ITS ``AS IS'' CONDITION, AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL CARNEGIE MELLON UNIVERSITY BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
+ * OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ * BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
+ * USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * Carnegie Mellon encourages (but does not require) users of this
+ * software to return any improvements or extensions that they make,
+ * and to grant Carnegie Mellon the rights to redistribute these
+ * changes without encumbrance.
+ */
+#ifndef _ALTQ_ALTQ_HFSC_H_
+#define _ALTQ_ALTQ_HFSC_H_
+
+#include <altq/altq.h>
+#include <altq/altq_classq.h>
+#include <altq/altq_red.h>
+#include <altq/altq_rio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct service_curve {
+ u_int m1; /* slope of the first segment in bits/sec */
+ u_int d; /* the x-projection of the first segment in msec */
+ u_int m2; /* slope of the second segment in bits/sec */
+};
+
+/* special class handles */
+#define HFSC_NULLCLASS_HANDLE 0
+#define HFSC_MAX_CLASSES 64
+
+/* hfsc class flags */
+#define HFCF_RED 0x0001 /* use RED */
+#define HFCF_ECN 0x0002 /* use RED/ECN */
+#define HFCF_RIO 0x0004 /* use RIO */
+#define HFCF_CLEARDSCP 0x0010 /* clear diffserv codepoint */
+#define HFCF_DEFAULTCLASS 0x1000 /* default class */
+
+/* service curve types */
+#define HFSC_REALTIMESC 1
+#define HFSC_LINKSHARINGSC 2
+#define HFSC_UPPERLIMITSC 4
+#define HFSC_DEFAULTSC (HFSC_REALTIMESC|HFSC_LINKSHARINGSC)
+
+struct hfsc_classstats {
+ u_int class_id;
+ u_int32_t class_handle;
+ struct service_curve rsc;
+ struct service_curve fsc;
+ struct service_curve usc; /* upper limit service curve */
+
+ u_int64_t total; /* total work in bytes */
+ u_int64_t cumul; /* cumulative work in bytes
+ done by real-time criteria */
+ u_int64_t d; /* deadline */
+ u_int64_t e; /* eligible time */
+ u_int64_t vt; /* virtual time */
+ u_int64_t f; /* fit time for upper-limit */
+
+ /* info helpful for debugging */
+ u_int64_t initvt; /* init virtual time */
+ u_int64_t vtoff; /* cl_vt_ipoff */
+ u_int64_t cvtmax; /* cl_maxvt */
+ u_int64_t myf; /* cl_myf */
+ u_int64_t cfmin; /* cl_mincf */
+ u_int64_t cvtmin; /* cl_mincvt */
+ u_int64_t myfadj; /* cl_myfadj */
+ u_int64_t vtadj; /* cl_vtadj */
+ u_int64_t cur_time;
+ u_int32_t machclk_freq;
+
+ u_int qlength;
+ u_int qlimit;
+ struct pktcntr xmit_cnt;
+ struct pktcntr drop_cnt;
+ u_int period;
+
+ u_int vtperiod; /* vt period sequence no */
+ u_int parentperiod; /* parent's vt period seqno */
+ int nactive; /* number of active children */
+
+ /* red and rio related info */
+ int qtype;
+ struct redstats red[3];
+};
+
+#ifdef ALTQ3_COMPAT
+struct hfsc_interface {
+ char hfsc_ifname[IFNAMSIZ]; /* interface name (e.g., fxp0) */
+};
+
+struct hfsc_attach {
+ struct hfsc_interface iface;
+ u_int bandwidth; /* link bandwidth in bits/sec */
+};
+
+struct hfsc_add_class {
+ struct hfsc_interface iface;
+ u_int32_t parent_handle;
+ struct service_curve service_curve;
+ int qlimit;
+ int flags;
+
+ u_int32_t class_handle; /* return value */
+};
+
+struct hfsc_delete_class {
+ struct hfsc_interface iface;
+ u_int32_t class_handle;
+};
+
+struct hfsc_modify_class {
+ struct hfsc_interface iface;
+ u_int32_t class_handle;
+ struct service_curve service_curve;
+ int sctype;
+};
+
+struct hfsc_add_filter {
+ struct hfsc_interface iface;
+ u_int32_t class_handle;
+ struct flow_filter filter;
+
+ u_long filter_handle; /* return value */
+};
+
+struct hfsc_delete_filter {
+ struct hfsc_interface iface;
+ u_long filter_handle;
+};
+
+struct hfsc_class_stats {
+ struct hfsc_interface iface;
+ int nskip; /* skip # of classes */
+ int nclasses; /* # of class stats (WR) */
+ u_int64_t cur_time; /* current time */
+ u_int32_t machclk_freq; /* machine clock frequency */
+ u_int hif_classes; /* # of classes in the tree */
+ u_int hif_packets; /* # of packets in the tree */
+ struct hfsc_classstats *stats; /* pointer to stats array */
+};
+
+#define HFSC_IF_ATTACH _IOW('Q', 1, struct hfsc_attach)
+#define HFSC_IF_DETACH _IOW('Q', 2, struct hfsc_interface)
+#define HFSC_ENABLE _IOW('Q', 3, struct hfsc_interface)
+#define HFSC_DISABLE _IOW('Q', 4, struct hfsc_interface)
+#define HFSC_CLEAR_HIERARCHY _IOW('Q', 5, struct hfsc_interface)
+#define HFSC_ADD_CLASS _IOWR('Q', 7, struct hfsc_add_class)
+#define HFSC_DEL_CLASS _IOW('Q', 8, struct hfsc_delete_class)
+#define HFSC_MOD_CLASS _IOW('Q', 9, struct hfsc_modify_class)
+#define HFSC_ADD_FILTER _IOWR('Q', 10, struct hfsc_add_filter)
+#define HFSC_DEL_FILTER _IOW('Q', 11, struct hfsc_delete_filter)
+#define HFSC_GETSTATS _IOWR('Q', 12, struct hfsc_class_stats)
+#endif /* ALTQ3_COMPAT */
+
+#ifdef _KERNEL
+/*
+ * kernel internal service curve representation
+ * coordinates are given by 64 bit unsigned integers.
+ * x-axis: unit is clock count. for the intel x86 architecture,
+ * the raw Pentium TSC (Timestamp Counter) value is used.
+ * virtual time is also calculated in this time scale.
+ * y-axis: unit is byte.
+ *
+ * the service curve parameters are converted to the internal
+ * representation.
+ * the slope values are scaled to avoid overflow.
+ * the inverse slope values as well as the y-projection of the 1st
+ * segment are kept in order to to avoid 64-bit divide operations
+ * that are expensive on 32-bit architectures.
+ *
+ * note: Intel Pentium TSC never wraps around in several thousands of years.
+ * x-axis doesn't wrap around for 1089 years with 1GHz clock.
+ * y-axis doesn't wrap around for 4358 years with 1Gbps bandwidth.
+ */
+
+/* kernel internal representation of a service curve */
+struct internal_sc {
+ u_int64_t sm1; /* scaled slope of the 1st segment */
+ u_int64_t ism1; /* scaled inverse-slope of the 1st segment */
+ u_int64_t dx; /* the x-projection of the 1st segment */
+ u_int64_t dy; /* the y-projection of the 1st segment */
+ u_int64_t sm2; /* scaled slope of the 2nd segment */
+ u_int64_t ism2; /* scaled inverse-slope of the 2nd segment */
+};
+
+/* runtime service curve */
+struct runtime_sc {
+ u_int64_t x; /* current starting position on x-axis */
+ u_int64_t y; /* current starting position on x-axis */
+ u_int64_t sm1; /* scaled slope of the 1st segment */
+ u_int64_t ism1; /* scaled inverse-slope of the 1st segment */
+ u_int64_t dx; /* the x-projection of the 1st segment */
+ u_int64_t dy; /* the y-projection of the 1st segment */
+ u_int64_t sm2; /* scaled slope of the 2nd segment */
+ u_int64_t ism2; /* scaled inverse-slope of the 2nd segment */
+};
+
+/* for TAILQ based ellist and actlist implementation */
+struct hfsc_class;
+typedef TAILQ_HEAD(_eligible, hfsc_class) ellist_t;
+typedef TAILQ_ENTRY(hfsc_class) elentry_t;
+typedef TAILQ_HEAD(_active, hfsc_class) actlist_t;
+typedef TAILQ_ENTRY(hfsc_class) actentry_t;
+#define ellist_first(s) TAILQ_FIRST(s)
+#define actlist_first(s) TAILQ_FIRST(s)
+#define actlist_last(s) TAILQ_LAST(s, _active)
+
+struct hfsc_class {
+ u_int cl_id; /* class id (just for debug) */
+ u_int32_t cl_handle; /* class handle */
+ struct hfsc_if *cl_hif; /* back pointer to struct hfsc_if */
+ int cl_flags; /* misc flags */
+
+ struct hfsc_class *cl_parent; /* parent class */
+ struct hfsc_class *cl_siblings; /* sibling classes */
+ struct hfsc_class *cl_children; /* child classes */
+
+ class_queue_t *cl_q; /* class queue structure */
+ struct red *cl_red; /* RED state */
+ struct altq_pktattr *cl_pktattr; /* saved header used by ECN */
+
+ u_int64_t cl_total; /* total work in bytes */
+ u_int64_t cl_cumul; /* cumulative work in bytes
+ done by real-time criteria */
+ u_int64_t cl_d; /* deadline */
+ u_int64_t cl_e; /* eligible time */
+ u_int64_t cl_vt; /* virtual time */
+ u_int64_t cl_f; /* time when this class will fit for
+ link-sharing, max(myf, cfmin) */
+ u_int64_t cl_myf; /* my fit-time (as calculated from this
+ class's own upperlimit curve) */
+ u_int64_t cl_myfadj; /* my fit-time adjustment
+ (to cancel history dependence) */
+ u_int64_t cl_cfmin; /* earliest children's fit-time (used
+ with cl_myf to obtain cl_f) */
+ u_int64_t cl_cvtmin; /* minimal virtual time among the
+ children fit for link-sharing
+ (monotonic within a period) */
+ u_int64_t cl_vtadj; /* intra-period cumulative vt
+ adjustment */
+ u_int64_t cl_vtoff; /* inter-period cumulative vt offset */
+ u_int64_t cl_cvtmax; /* max child's vt in the last period */
+
+ u_int64_t cl_initvt; /* init virtual time (for debugging) */
+
+ struct internal_sc *cl_rsc; /* internal real-time service curve */
+ struct internal_sc *cl_fsc; /* internal fair service curve */
+ struct internal_sc *cl_usc; /* internal upperlimit service curve */
+ struct runtime_sc cl_deadline; /* deadline curve */
+ struct runtime_sc cl_eligible; /* eligible curve */
+ struct runtime_sc cl_virtual; /* virtual curve */
+ struct runtime_sc cl_ulimit; /* upperlimit curve */
+
+ u_int cl_vtperiod; /* vt period sequence no */
+ u_int cl_parentperiod; /* parent's vt period seqno */
+ int cl_nactive; /* number of active children */
+ actlist_t *cl_actc; /* active children list */
+
+ actentry_t cl_actlist; /* active children list entry */
+ elentry_t cl_ellist; /* eligible list entry */
+
+ struct {
+ struct pktcntr xmit_cnt;
+ struct pktcntr drop_cnt;
+ u_int period;
+ } cl_stats;
+};
+
+/*
+ * hfsc interface state
+ */
+struct hfsc_if {
+ struct hfsc_if *hif_next; /* interface state list */
+ struct ifaltq *hif_ifq; /* backpointer to ifaltq */
+ struct hfsc_class *hif_rootclass; /* root class */
+ struct hfsc_class *hif_defaultclass; /* default class */
+ struct hfsc_class *hif_class_tbl[HFSC_MAX_CLASSES];
+ struct hfsc_class *hif_pollcache; /* cache for poll operation */
+
+ u_int hif_classes; /* # of classes in the tree */
+ u_int hif_packets; /* # of packets in the tree */
+ u_int hif_classid; /* class id sequence number */
+
+ ellist_t *hif_eligible; /* eligible list */
+
+#ifdef ALTQ3_CLFIER_COMPAT
+ struct acc_classifier hif_classifier;
+#endif
+};
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ALTQ_ALTQ_HFSC_H_ */
diff --git a/sys/contrib/altq/altq/altq_priq.c b/sys/contrib/altq/altq/altq_priq.c
new file mode 100644
index 0000000..28b0ddb
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_priq.c
@@ -0,0 +1,1053 @@
+/* $FreeBSD$ */
+/* $KAME: altq_priq.c,v 1.11 2003/09/17 14:23:25 kjc Exp $ */
+/*
+ * Copyright (C) 2000-2003
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/*
+ * priority queue
+ */
+
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+#include "opt_altq.h"
+#if (__FreeBSD__ != 2)
+#include "opt_inet.h"
+#ifdef __FreeBSD__
+#include "opt_inet6.h"
+#endif
+#endif
+#endif /* __FreeBSD__ || __NetBSD__ */
+
+#ifdef ALTQ_PRIQ /* priq is enabled by ALTQ_PRIQ option in opt_altq.h */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/sockio.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/errno.h>
+#include <sys/kernel.h>
+#include <sys/queue.h>
+
+#include <net/if.h>
+#include <netinet/in.h>
+
+#include <net/pfvar.h>
+#include <altq/altq.h>
+#ifdef ALTQ3_COMPAT
+#include <altq/altq_conf.h>
+#endif
+#include <altq/altq_priq.h>
+
+/*
+ * function prototypes
+ */
+#ifdef ALTQ3_COMPAT
+static struct priq_if *priq_attach(struct ifaltq *, u_int);
+static int priq_detach(struct priq_if *);
+#endif
+static int priq_clear_interface(struct priq_if *);
+static int priq_request(struct ifaltq *, int, void *);
+static void priq_purge(struct priq_if *);
+static struct priq_class *priq_class_create(struct priq_if *, int, int, int,
+ int);
+static int priq_class_destroy(struct priq_class *);
+static int priq_enqueue(struct ifaltq *, struct mbuf *, struct altq_pktattr *);
+static struct mbuf *priq_dequeue(struct ifaltq *, int);
+
+static int priq_addq(struct priq_class *, struct mbuf *);
+static struct mbuf *priq_getq(struct priq_class *);
+static struct mbuf *priq_pollq(struct priq_class *);
+static void priq_purgeq(struct priq_class *);
+
+#ifdef ALTQ3_COMPAT
+static int priqcmd_if_attach(struct priq_interface *);
+static int priqcmd_if_detach(struct priq_interface *);
+static int priqcmd_add_class(struct priq_add_class *);
+static int priqcmd_delete_class(struct priq_delete_class *);
+static int priqcmd_modify_class(struct priq_modify_class *);
+static int priqcmd_add_filter(struct priq_add_filter *);
+static int priqcmd_delete_filter(struct priq_delete_filter *);
+static int priqcmd_class_stats(struct priq_class_stats *);
+#endif /* ALTQ3_COMPAT */
+
+static void get_class_stats(struct priq_classstats *, struct priq_class *);
+static struct priq_class *clh_to_clp(struct priq_if *, u_int32_t);
+
+#ifdef ALTQ3_COMPAT
+altqdev_decl(priq);
+
+/* pif_list keeps all priq_if's allocated. */
+static struct priq_if *pif_list = NULL;
+#endif /* ALTQ3_COMPAT */
+
+int
+priq_pfattach(struct pf_altq *a)
+{
+ struct ifnet *ifp;
+ int s, error;
+
+ if ((ifp = ifunit(a->ifname)) == NULL || a->altq_disc == NULL)
+ return (EINVAL);
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ error = altq_attach(&ifp->if_snd, ALTQT_PRIQ, a->altq_disc,
+ priq_enqueue, priq_dequeue, priq_request, NULL, NULL);
+ splx(s);
+ return (error);
+}
+
+int
+priq_add_altq(struct pf_altq *a)
+{
+ struct priq_if *pif;
+ struct ifnet *ifp;
+
+ if ((ifp = ifunit(a->ifname)) == NULL)
+ return (EINVAL);
+ if (!ALTQ_IS_READY(&ifp->if_snd))
+ return (ENODEV);
+
+ MALLOC(pif, struct priq_if *, sizeof(struct priq_if),
+ M_DEVBUF, M_WAITOK);
+ if (pif == NULL)
+ return (ENOMEM);
+ bzero(pif, sizeof(struct priq_if));
+ pif->pif_bandwidth = a->ifbandwidth;
+ pif->pif_maxpri = -1;
+ pif->pif_ifq = &ifp->if_snd;
+
+ /* keep the state in pf_altq */
+ a->altq_disc = pif;
+
+ return (0);
+}
+
+int
+priq_remove_altq(struct pf_altq *a)
+{
+ struct priq_if *pif;
+
+ if ((pif = a->altq_disc) == NULL)
+ return (EINVAL);
+ a->altq_disc = NULL;
+
+ (void)priq_clear_interface(pif);
+
+ FREE(pif, M_DEVBUF);
+ return (0);
+}
+
+int
+priq_add_queue(struct pf_altq *a)
+{
+ struct priq_if *pif;
+ struct priq_class *cl;
+
+ if ((pif = a->altq_disc) == NULL)
+ return (EINVAL);
+
+ /* check parameters */
+ if (a->priority >= PRIQ_MAXPRI)
+ return (EINVAL);
+ if (a->qid == 0)
+ return (EINVAL);
+ if (pif->pif_classes[a->priority] != NULL)
+ return (EBUSY);
+ if (clh_to_clp(pif, a->qid) != NULL)
+ return (EBUSY);
+
+ cl = priq_class_create(pif, a->priority, a->qlimit,
+ a->pq_u.priq_opts.flags, a->qid);
+ if (cl == NULL)
+ return (ENOMEM);
+
+ return (0);
+}
+
+int
+priq_remove_queue(struct pf_altq *a)
+{
+ struct priq_if *pif;
+ struct priq_class *cl;
+
+ if ((pif = a->altq_disc) == NULL)
+ return (EINVAL);
+
+ if ((cl = clh_to_clp(pif, a->qid)) == NULL)
+ return (EINVAL);
+
+ return (priq_class_destroy(cl));
+}
+
+int
+priq_getqstats(struct pf_altq *a, void *ubuf, int *nbytes)
+{
+ struct priq_if *pif;
+ struct priq_class *cl;
+ struct priq_classstats stats;
+ int error = 0;
+
+ if ((pif = altq_lookup(a->ifname, ALTQT_PRIQ)) == NULL)
+ return (EBADF);
+
+ if ((cl = clh_to_clp(pif, a->qid)) == NULL)
+ return (EINVAL);
+
+ if (*nbytes < sizeof(stats))
+ return (EINVAL);
+
+ get_class_stats(&stats, cl);
+
+ if ((error = copyout((caddr_t)&stats, ubuf, sizeof(stats))) != 0)
+ return (error);
+ *nbytes = sizeof(stats);
+ return (0);
+}
+
+/*
+ * bring the interface back to the initial state by discarding
+ * all the filters and classes.
+ */
+static int
+priq_clear_interface(struct priq_if *pif)
+{
+ struct priq_class *cl;
+ int pri;
+
+#ifdef ALTQ3_CLFIER_COMPAT
+ /* free the filters for this interface */
+ acc_discard_filters(&pif->pif_classifier, NULL, 1);
+#endif
+
+ /* clear out the classes */
+ for (pri = 0; pri <= pif->pif_maxpri; pri++)
+ if ((cl = pif->pif_classes[pri]) != NULL)
+ priq_class_destroy(cl);
+
+ return (0);
+}
+
+static int
+priq_request(struct ifaltq *ifq, int req, void *arg)
+{
+ struct priq_if *pif = (struct priq_if *)ifq->altq_disc;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ switch (req) {
+ case ALTRQ_PURGE:
+ priq_purge(pif);
+ break;
+ }
+ return (0);
+}
+
+/* discard all the queued packets on the interface */
+static void
+priq_purge(struct priq_if *pif)
+{
+ struct priq_class *cl;
+ int pri;
+
+ for (pri = 0; pri <= pif->pif_maxpri; pri++) {
+ if ((cl = pif->pif_classes[pri]) != NULL && !qempty(cl->cl_q))
+ priq_purgeq(cl);
+ }
+ if (ALTQ_IS_ENABLED(pif->pif_ifq))
+ pif->pif_ifq->ifq_len = 0;
+}
+
+static struct priq_class *
+priq_class_create(struct priq_if *pif, int pri, int qlimit, int flags, int qid)
+{
+ struct priq_class *cl;
+ int s;
+
+#ifndef ALTQ_RED
+ if (flags & PRCF_RED) {
+#ifdef ALTQ_DEBUG
+ printf("priq_class_create: RED not configured for PRIQ!\n");
+#endif
+ return (NULL);
+ }
+#endif
+
+ if ((cl = pif->pif_classes[pri]) != NULL) {
+ /* modify the class instead of creating a new one */
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_LOCK(cl->cl_pif->pif_ifq);
+ if (!qempty(cl->cl_q))
+ priq_purgeq(cl);
+ IFQ_UNLOCK(cl->cl_pif->pif_ifq);
+ splx(s);
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ rio_destroy((rio_t *)cl->cl_red);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ red_destroy(cl->cl_red);
+#endif
+ } else {
+ MALLOC(cl, struct priq_class *, sizeof(struct priq_class),
+ M_DEVBUF, M_WAITOK);
+ if (cl == NULL)
+ return (NULL);
+ bzero(cl, sizeof(struct priq_class));
+
+ MALLOC(cl->cl_q, class_queue_t *, sizeof(class_queue_t),
+ M_DEVBUF, M_WAITOK);
+ if (cl->cl_q == NULL)
+ goto err_ret;
+ bzero(cl->cl_q, sizeof(class_queue_t));
+ }
+
+ pif->pif_classes[pri] = cl;
+ if (flags & PRCF_DEFAULTCLASS)
+ pif->pif_default = cl;
+ if (qlimit == 0)
+ qlimit = 50; /* use default */
+ qlimit(cl->cl_q) = qlimit;
+ qtype(cl->cl_q) = Q_DROPTAIL;
+ qlen(cl->cl_q) = 0;
+ cl->cl_flags = flags;
+ cl->cl_pri = pri;
+ if (pri > pif->pif_maxpri)
+ pif->pif_maxpri = pri;
+ cl->cl_pif = pif;
+ cl->cl_handle = qid;
+
+#ifdef ALTQ_RED
+ if (flags & (PRCF_RED|PRCF_RIO)) {
+ int red_flags, red_pkttime;
+
+ red_flags = 0;
+ if (flags & PRCF_ECN)
+ red_flags |= REDF_ECN;
+#ifdef ALTQ_RIO
+ if (flags & PRCF_CLEARDSCP)
+ red_flags |= RIOF_CLEARDSCP;
+#endif
+ if (pif->pif_bandwidth < 8)
+ red_pkttime = 1000 * 1000 * 1000; /* 1 sec */
+ else
+ red_pkttime = (int64_t)pif->pif_ifq->altq_ifp->if_mtu
+ * 1000 * 1000 * 1000 / (pif->pif_bandwidth / 8);
+#ifdef ALTQ_RIO
+ if (flags & PRCF_RIO) {
+ cl->cl_red = (red_t *)rio_alloc(0, NULL,
+ red_flags, red_pkttime);
+ if (cl->cl_red != NULL)
+ qtype(cl->cl_q) = Q_RIO;
+ } else
+#endif
+ if (flags & PRCF_RED) {
+ cl->cl_red = red_alloc(0, 0,
+ qlimit(cl->cl_q) * 10/100,
+ qlimit(cl->cl_q) * 30/100,
+ red_flags, red_pkttime);
+ if (cl->cl_red != NULL)
+ qtype(cl->cl_q) = Q_RED;
+ }
+ }
+#endif /* ALTQ_RED */
+
+ return (cl);
+
+ err_ret:
+ if (cl->cl_red != NULL) {
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ rio_destroy((rio_t *)cl->cl_red);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ red_destroy(cl->cl_red);
+#endif
+ }
+ if (cl->cl_q != NULL)
+ FREE(cl->cl_q, M_DEVBUF);
+ FREE(cl, M_DEVBUF);
+ return (NULL);
+}
+
+static int
+priq_class_destroy(struct priq_class *cl)
+{
+ struct priq_if *pif;
+ int s, pri;
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_LOCK(cl->cl_pif->pif_ifq);
+
+#ifdef ALTQ3_CLFIER_COMPAT
+ /* delete filters referencing to this class */
+ acc_discard_filters(&cl->cl_pif->pif_classifier, cl, 0);
+#endif
+
+ if (!qempty(cl->cl_q))
+ priq_purgeq(cl);
+
+ pif = cl->cl_pif;
+ pif->pif_classes[cl->cl_pri] = NULL;
+ if (pif->pif_maxpri == cl->cl_pri) {
+ for (pri = cl->cl_pri; pri >= 0; pri--)
+ if (pif->pif_classes[pri] != NULL) {
+ pif->pif_maxpri = pri;
+ break;
+ }
+ if (pri < 0)
+ pif->pif_maxpri = -1;
+ }
+ IFQ_UNLOCK(cl->cl_pif->pif_ifq);
+ splx(s);
+
+ if (cl->cl_red != NULL) {
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ rio_destroy((rio_t *)cl->cl_red);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ red_destroy(cl->cl_red);
+#endif
+ }
+ FREE(cl->cl_q, M_DEVBUF);
+ FREE(cl, M_DEVBUF);
+ return (0);
+}
+
+/*
+ * priq_enqueue is an enqueue function to be registered to
+ * (*altq_enqueue) in struct ifaltq.
+ */
+static int
+priq_enqueue(struct ifaltq *ifq, struct mbuf *m, struct altq_pktattr *pktattr)
+{
+ struct priq_if *pif = (struct priq_if *)ifq->altq_disc;
+ struct priq_class *cl;
+ struct m_tag *t;
+ int len;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ /* grab class set by classifier */
+ if ((m->m_flags & M_PKTHDR) == 0) {
+ /* should not happen */
+#if defined(__NetBSD__) || defined(__OpenBSD__)\
+ || (defined(__FreeBSD__) && __FreeBSD_version >= 501113)
+ printf("altq: packet for %s does not have pkthdr\n",
+ ifq->altq_ifp->if_xname);
+#else
+ printf("altq: packet for %s%d does not have pkthdr\n",
+ ifq->altq_ifp->if_name, ifq->altq_ifp->if_unit);
+#endif
+ m_freem(m);
+ return (ENOBUFS);
+ }
+ cl = NULL;
+ if ((t = m_tag_find(m, PACKET_TAG_PF_QID, NULL)) != NULL)
+ cl = clh_to_clp(pif, ((struct altq_tag *)(t+1))->qid);
+#ifdef ALTQ3_COMPAT
+ else if ((ifq->altq_flags & ALTQF_CLASSIFY) && pktattr != NULL)
+ cl = pktattr->pattr_class;
+#endif
+ if (cl == NULL) {
+ cl = pif->pif_default;
+ if (cl == NULL) {
+ m_freem(m);
+ return (ENOBUFS);
+ }
+ }
+#ifdef ALTQ3_COMPAT
+ if (pktattr != NULL)
+ cl->cl_pktattr = pktattr; /* save proto hdr used by ECN */
+ else
+#endif
+ cl->cl_pktattr = NULL;
+ len = m_pktlen(m);
+ if (priq_addq(cl, m) != 0) {
+ /* drop occurred. mbuf was freed in priq_addq. */
+ PKTCNTR_ADD(&cl->cl_dropcnt, len);
+ return (ENOBUFS);
+ }
+ IFQ_INC_LEN(ifq);
+
+ /* successfully queued. */
+ return (0);
+}
+
+/*
+ * priq_dequeue is a dequeue function to be registered to
+ * (*altq_dequeue) in struct ifaltq.
+ *
+ * note: ALTDQ_POLL returns the next packet without removing the packet
+ * from the queue. ALTDQ_REMOVE is a normal dequeue operation.
+ * ALTDQ_REMOVE must return the same packet if called immediately
+ * after ALTDQ_POLL.
+ */
+static struct mbuf *
+priq_dequeue(struct ifaltq *ifq, int op)
+{
+ struct priq_if *pif = (struct priq_if *)ifq->altq_disc;
+ struct priq_class *cl;
+ struct mbuf *m;
+ int pri;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ if (IFQ_IS_EMPTY(ifq))
+ /* no packet in the queue */
+ return (NULL);
+
+ for (pri = pif->pif_maxpri; pri >= 0; pri--) {
+ if ((cl = pif->pif_classes[pri]) != NULL &&
+ !qempty(cl->cl_q)) {
+ if (op == ALTDQ_POLL)
+ return (priq_pollq(cl));
+
+ m = priq_getq(cl);
+ if (m != NULL) {
+ IFQ_DEC_LEN(ifq);
+ if (qempty(cl->cl_q))
+ cl->cl_period++;
+ PKTCNTR_ADD(&cl->cl_xmitcnt, m_pktlen(m));
+ }
+ return (m);
+ }
+ }
+ return (NULL);
+}
+
+static int
+priq_addq(struct priq_class *cl, struct mbuf *m)
+{
+
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ return rio_addq((rio_t *)cl->cl_red, cl->cl_q, m,
+ cl->cl_pktattr);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ return red_addq(cl->cl_red, cl->cl_q, m, cl->cl_pktattr);
+#endif
+ if (qlen(cl->cl_q) >= qlimit(cl->cl_q)) {
+ m_freem(m);
+ return (-1);
+ }
+
+ if (cl->cl_flags & PRCF_CLEARDSCP)
+ write_dsfield(m, cl->cl_pktattr, 0);
+
+ _addq(cl->cl_q, m);
+
+ return (0);
+}
+
+static struct mbuf *
+priq_getq(struct priq_class *cl)
+{
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ return rio_getq((rio_t *)cl->cl_red, cl->cl_q);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ return red_getq(cl->cl_red, cl->cl_q);
+#endif
+ return _getq(cl->cl_q);
+}
+
+static struct mbuf *
+priq_pollq(cl)
+ struct priq_class *cl;
+{
+ return qhead(cl->cl_q);
+}
+
+static void
+priq_purgeq(struct priq_class *cl)
+{
+ struct mbuf *m;
+
+ if (qempty(cl->cl_q))
+ return;
+
+ while ((m = _getq(cl->cl_q)) != NULL) {
+ PKTCNTR_ADD(&cl->cl_dropcnt, m_pktlen(m));
+ m_freem(m);
+ }
+ ASSERT(qlen(cl->cl_q) == 0);
+}
+
+static void
+get_class_stats(struct priq_classstats *sp, struct priq_class *cl)
+{
+ sp->class_handle = cl->cl_handle;
+ sp->qlength = qlen(cl->cl_q);
+ sp->qlimit = qlimit(cl->cl_q);
+ sp->period = cl->cl_period;
+ sp->xmitcnt = cl->cl_xmitcnt;
+ sp->dropcnt = cl->cl_dropcnt;
+
+ sp->qtype = qtype(cl->cl_q);
+#ifdef ALTQ_RED
+ if (q_is_red(cl->cl_q))
+ red_getstats(cl->cl_red, &sp->red[0]);
+#endif
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->cl_q))
+ rio_getstats((rio_t *)cl->cl_red, &sp->red[0]);
+#endif
+
+}
+
+/* convert a class handle to the corresponding class pointer */
+static struct priq_class *
+clh_to_clp(struct priq_if *pif, u_int32_t chandle)
+{
+ struct priq_class *cl;
+ int idx;
+
+ if (chandle == 0)
+ return (NULL);
+
+ for (idx = pif->pif_maxpri; idx >= 0; idx--)
+ if ((cl = pif->pif_classes[idx]) != NULL &&
+ cl->cl_handle == chandle)
+ return (cl);
+
+ return (NULL);
+}
+
+
+#ifdef ALTQ3_COMPAT
+
+static struct priq_if *
+priq_attach(ifq, bandwidth)
+ struct ifaltq *ifq;
+ u_int bandwidth;
+{
+ struct priq_if *pif;
+
+ MALLOC(pif, struct priq_if *, sizeof(struct priq_if),
+ M_DEVBUF, M_WAITOK);
+ if (pif == NULL)
+ return (NULL);
+ bzero(pif, sizeof(struct priq_if));
+ pif->pif_bandwidth = bandwidth;
+ pif->pif_maxpri = -1;
+ pif->pif_ifq = ifq;
+
+ /* add this state to the priq list */
+ pif->pif_next = pif_list;
+ pif_list = pif;
+
+ return (pif);
+}
+
+static int
+priq_detach(pif)
+ struct priq_if *pif;
+{
+ (void)priq_clear_interface(pif);
+
+ /* remove this interface from the pif list */
+ if (pif_list == pif)
+ pif_list = pif->pif_next;
+ else {
+ struct priq_if *p;
+
+ for (p = pif_list; p != NULL; p = p->pif_next)
+ if (p->pif_next == pif) {
+ p->pif_next = pif->pif_next;
+ break;
+ }
+ ASSERT(p != NULL);
+ }
+
+ FREE(pif, M_DEVBUF);
+ return (0);
+}
+
+/*
+ * priq device interface
+ */
+int
+priqopen(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ /* everything will be done when the queueing scheme is attached. */
+ return 0;
+}
+
+int
+priqclose(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ struct priq_if *pif;
+ int err, error = 0;
+
+ while ((pif = pif_list) != NULL) {
+ /* destroy all */
+ if (ALTQ_IS_ENABLED(pif->pif_ifq))
+ altq_disable(pif->pif_ifq);
+
+ err = altq_detach(pif->pif_ifq);
+ if (err == 0)
+ err = priq_detach(pif);
+ if (err != 0 && error == 0)
+ error = err;
+ }
+
+ return error;
+}
+
+int
+priqioctl(dev, cmd, addr, flag, p)
+ dev_t dev;
+ ioctlcmd_t cmd;
+ caddr_t addr;
+ int flag;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ struct priq_if *pif;
+ struct priq_interface *ifacep;
+ int error = 0;
+
+ /* check super-user privilege */
+ switch (cmd) {
+ case PRIQ_GETSTATS:
+ break;
+ default:
+#if (__FreeBSD_version > 700000)
+ if ((error = priv_check(p, PRIV_ALTQ_MANAGE)) != 0)
+ return (error);
+#elsif (__FreeBSD_version > 400000)
+ if ((error = suser(p)) != 0)
+ return (error);
+#else
+ if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
+ return (error);
+#endif
+ break;
+ }
+
+ switch (cmd) {
+
+ case PRIQ_IF_ATTACH:
+ error = priqcmd_if_attach((struct priq_interface *)addr);
+ break;
+
+ case PRIQ_IF_DETACH:
+ error = priqcmd_if_detach((struct priq_interface *)addr);
+ break;
+
+ case PRIQ_ENABLE:
+ case PRIQ_DISABLE:
+ case PRIQ_CLEAR:
+ ifacep = (struct priq_interface *)addr;
+ if ((pif = altq_lookup(ifacep->ifname,
+ ALTQT_PRIQ)) == NULL) {
+ error = EBADF;
+ break;
+ }
+
+ switch (cmd) {
+ case PRIQ_ENABLE:
+ if (pif->pif_default == NULL) {
+#ifdef ALTQ_DEBUG
+ printf("priq: no default class\n");
+#endif
+ error = EINVAL;
+ break;
+ }
+ error = altq_enable(pif->pif_ifq);
+ break;
+
+ case PRIQ_DISABLE:
+ error = altq_disable(pif->pif_ifq);
+ break;
+
+ case PRIQ_CLEAR:
+ priq_clear_interface(pif);
+ break;
+ }
+ break;
+
+ case PRIQ_ADD_CLASS:
+ error = priqcmd_add_class((struct priq_add_class *)addr);
+ break;
+
+ case PRIQ_DEL_CLASS:
+ error = priqcmd_delete_class((struct priq_delete_class *)addr);
+ break;
+
+ case PRIQ_MOD_CLASS:
+ error = priqcmd_modify_class((struct priq_modify_class *)addr);
+ break;
+
+ case PRIQ_ADD_FILTER:
+ error = priqcmd_add_filter((struct priq_add_filter *)addr);
+ break;
+
+ case PRIQ_DEL_FILTER:
+ error = priqcmd_delete_filter((struct priq_delete_filter *)addr);
+ break;
+
+ case PRIQ_GETSTATS:
+ error = priqcmd_class_stats((struct priq_class_stats *)addr);
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+static int
+priqcmd_if_attach(ap)
+ struct priq_interface *ap;
+{
+ struct priq_if *pif;
+ struct ifnet *ifp;
+ int error;
+
+ if ((ifp = ifunit(ap->ifname)) == NULL)
+ return (ENXIO);
+
+ if ((pif = priq_attach(&ifp->if_snd, ap->arg)) == NULL)
+ return (ENOMEM);
+
+ /*
+ * set PRIQ to this ifnet structure.
+ */
+ if ((error = altq_attach(&ifp->if_snd, ALTQT_PRIQ, pif,
+ priq_enqueue, priq_dequeue, priq_request,
+ &pif->pif_classifier, acc_classify)) != 0)
+ (void)priq_detach(pif);
+
+ return (error);
+}
+
+static int
+priqcmd_if_detach(ap)
+ struct priq_interface *ap;
+{
+ struct priq_if *pif;
+ int error;
+
+ if ((pif = altq_lookup(ap->ifname, ALTQT_PRIQ)) == NULL)
+ return (EBADF);
+
+ if (ALTQ_IS_ENABLED(pif->pif_ifq))
+ altq_disable(pif->pif_ifq);
+
+ if ((error = altq_detach(pif->pif_ifq)))
+ return (error);
+
+ return priq_detach(pif);
+}
+
+static int
+priqcmd_add_class(ap)
+ struct priq_add_class *ap;
+{
+ struct priq_if *pif;
+ struct priq_class *cl;
+ int qid;
+
+ if ((pif = altq_lookup(ap->iface.ifname, ALTQT_PRIQ)) == NULL)
+ return (EBADF);
+
+ if (ap->pri < 0 || ap->pri >= PRIQ_MAXPRI)
+ return (EINVAL);
+ if (pif->pif_classes[ap->pri] != NULL)
+ return (EBUSY);
+
+ qid = ap->pri + 1;
+ if ((cl = priq_class_create(pif, ap->pri,
+ ap->qlimit, ap->flags, qid)) == NULL)
+ return (ENOMEM);
+
+ /* return a class handle to the user */
+ ap->class_handle = cl->cl_handle;
+
+ return (0);
+}
+
+static int
+priqcmd_delete_class(ap)
+ struct priq_delete_class *ap;
+{
+ struct priq_if *pif;
+ struct priq_class *cl;
+
+ if ((pif = altq_lookup(ap->iface.ifname, ALTQT_PRIQ)) == NULL)
+ return (EBADF);
+
+ if ((cl = clh_to_clp(pif, ap->class_handle)) == NULL)
+ return (EINVAL);
+
+ return priq_class_destroy(cl);
+}
+
+static int
+priqcmd_modify_class(ap)
+ struct priq_modify_class *ap;
+{
+ struct priq_if *pif;
+ struct priq_class *cl;
+
+ if ((pif = altq_lookup(ap->iface.ifname, ALTQT_PRIQ)) == NULL)
+ return (EBADF);
+
+ if (ap->pri < 0 || ap->pri >= PRIQ_MAXPRI)
+ return (EINVAL);
+
+ if ((cl = clh_to_clp(pif, ap->class_handle)) == NULL)
+ return (EINVAL);
+
+ /*
+ * if priority is changed, move the class to the new priority
+ */
+ if (pif->pif_classes[ap->pri] != cl) {
+ if (pif->pif_classes[ap->pri] != NULL)
+ return (EEXIST);
+ pif->pif_classes[cl->cl_pri] = NULL;
+ pif->pif_classes[ap->pri] = cl;
+ cl->cl_pri = ap->pri;
+ }
+
+ /* call priq_class_create to change class parameters */
+ if ((cl = priq_class_create(pif, ap->pri,
+ ap->qlimit, ap->flags, ap->class_handle)) == NULL)
+ return (ENOMEM);
+ return 0;
+}
+
+static int
+priqcmd_add_filter(ap)
+ struct priq_add_filter *ap;
+{
+ struct priq_if *pif;
+ struct priq_class *cl;
+
+ if ((pif = altq_lookup(ap->iface.ifname, ALTQT_PRIQ)) == NULL)
+ return (EBADF);
+
+ if ((cl = clh_to_clp(pif, ap->class_handle)) == NULL)
+ return (EINVAL);
+
+ return acc_add_filter(&pif->pif_classifier, &ap->filter,
+ cl, &ap->filter_handle);
+}
+
+static int
+priqcmd_delete_filter(ap)
+ struct priq_delete_filter *ap;
+{
+ struct priq_if *pif;
+
+ if ((pif = altq_lookup(ap->iface.ifname, ALTQT_PRIQ)) == NULL)
+ return (EBADF);
+
+ return acc_delete_filter(&pif->pif_classifier,
+ ap->filter_handle);
+}
+
+static int
+priqcmd_class_stats(ap)
+ struct priq_class_stats *ap;
+{
+ struct priq_if *pif;
+ struct priq_class *cl;
+ struct priq_classstats stats, *usp;
+ int pri, error;
+
+ if ((pif = altq_lookup(ap->iface.ifname, ALTQT_PRIQ)) == NULL)
+ return (EBADF);
+
+ ap->maxpri = pif->pif_maxpri;
+
+ /* then, read the next N classes in the tree */
+ usp = ap->stats;
+ for (pri = 0; pri <= pif->pif_maxpri; pri++) {
+ cl = pif->pif_classes[pri];
+ if (cl != NULL)
+ get_class_stats(&stats, cl);
+ else
+ bzero(&stats, sizeof(stats));
+ if ((error = copyout((caddr_t)&stats, (caddr_t)usp++,
+ sizeof(stats))) != 0)
+ return (error);
+ }
+ return (0);
+}
+
+#ifdef KLD_MODULE
+
+static struct altqsw priq_sw =
+ {"priq", priqopen, priqclose, priqioctl};
+
+ALTQ_MODULE(altq_priq, ALTQT_PRIQ, &priq_sw);
+MODULE_DEPEND(altq_priq, altq_red, 1, 1, 1);
+MODULE_DEPEND(altq_priq, altq_rio, 1, 1, 1);
+
+#endif /* KLD_MODULE */
+
+#endif /* ALTQ3_COMPAT */
+#endif /* ALTQ_PRIQ */
diff --git a/sys/contrib/altq/altq/altq_priq.h b/sys/contrib/altq/altq/altq_priq.h
new file mode 100644
index 0000000..481d31b
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_priq.h
@@ -0,0 +1,170 @@
+/* $KAME: altq_priq.h,v 1.7 2003/10/03 05:05:15 kjc Exp $ */
+/*
+ * Copyright (C) 2000-2003
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ALTQ_ALTQ_PRIQ_H_
+#define _ALTQ_ALTQ_PRIQ_H_
+
+#include <altq/altq.h>
+#include <altq/altq_classq.h>
+#include <altq/altq_red.h>
+#include <altq/altq_rio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define PRIQ_MAXPRI 16 /* upper limit of the number of priorities */
+
+#ifdef ALTQ3_COMPAT
+struct priq_interface {
+ char ifname[IFNAMSIZ]; /* interface name (e.g., fxp0) */
+ u_long arg; /* request-specific argument */
+};
+
+struct priq_add_class {
+ struct priq_interface iface;
+ int pri; /* priority (0 is the lowest) */
+ int qlimit; /* queue size limit */
+ int flags; /* misc flags (see below) */
+
+ u_int32_t class_handle; /* return value */
+};
+#endif /* ALTQ3_COMPAT */
+
+/* priq class flags */
+#define PRCF_RED 0x0001 /* use RED */
+#define PRCF_ECN 0x0002 /* use RED/ECN */
+#define PRCF_RIO 0x0004 /* use RIO */
+#define PRCF_CLEARDSCP 0x0010 /* clear diffserv codepoint */
+#define PRCF_DEFAULTCLASS 0x1000 /* default class */
+
+/* special class handles */
+#define PRIQ_NULLCLASS_HANDLE 0
+
+#ifdef ALTQ3_COMPAT
+struct priq_delete_class {
+ struct priq_interface iface;
+ u_int32_t class_handle;
+};
+
+struct priq_modify_class {
+ struct priq_interface iface;
+ u_int32_t class_handle;
+ int pri;
+ int qlimit;
+ int flags;
+};
+
+struct priq_add_filter {
+ struct priq_interface iface;
+ u_int32_t class_handle;
+ struct flow_filter filter;
+
+ u_long filter_handle; /* return value */
+};
+
+struct priq_delete_filter {
+ struct priq_interface iface;
+ u_long filter_handle;
+};
+#endif /* ALTQ3_COMPAT */
+
+struct priq_classstats {
+ u_int32_t class_handle;
+
+ u_int qlength;
+ u_int qlimit;
+ u_int period;
+ struct pktcntr xmitcnt; /* transmitted packet counter */
+ struct pktcntr dropcnt; /* dropped packet counter */
+
+ /* red and rio related info */
+ int qtype;
+ struct redstats red[3]; /* rio has 3 red stats */
+};
+
+#ifdef ALTQ3_COMPAT
+struct priq_class_stats {
+ struct priq_interface iface;
+ int maxpri; /* in/out */
+
+ struct priq_classstats *stats; /* pointer to stats array */
+};
+
+#define PRIQ_IF_ATTACH _IOW('Q', 1, struct priq_interface)
+#define PRIQ_IF_DETACH _IOW('Q', 2, struct priq_interface)
+#define PRIQ_ENABLE _IOW('Q', 3, struct priq_interface)
+#define PRIQ_DISABLE _IOW('Q', 4, struct priq_interface)
+#define PRIQ_CLEAR _IOW('Q', 5, struct priq_interface)
+#define PRIQ_ADD_CLASS _IOWR('Q', 7, struct priq_add_class)
+#define PRIQ_DEL_CLASS _IOW('Q', 8, struct priq_delete_class)
+#define PRIQ_MOD_CLASS _IOW('Q', 9, struct priq_modify_class)
+#define PRIQ_ADD_FILTER _IOWR('Q', 10, struct priq_add_filter)
+#define PRIQ_DEL_FILTER _IOW('Q', 11, struct priq_delete_filter)
+#define PRIQ_GETSTATS _IOWR('Q', 12, struct priq_class_stats)
+
+#endif /* ALTQ3_COMPAT */
+
+#ifdef _KERNEL
+
+struct priq_class {
+ u_int32_t cl_handle; /* class handle */
+ class_queue_t *cl_q; /* class queue structure */
+ struct red *cl_red; /* RED state */
+ int cl_pri; /* priority */
+ int cl_flags; /* class flags */
+ struct priq_if *cl_pif; /* back pointer to pif */
+ struct altq_pktattr *cl_pktattr; /* saved header used by ECN */
+
+ /* statistics */
+ u_int cl_period; /* backlog period */
+ struct pktcntr cl_xmitcnt; /* transmitted packet counter */
+ struct pktcntr cl_dropcnt; /* dropped packet counter */
+};
+
+/*
+ * priq interface state
+ */
+struct priq_if {
+ struct priq_if *pif_next; /* interface state list */
+ struct ifaltq *pif_ifq; /* backpointer to ifaltq */
+ u_int pif_bandwidth; /* link bandwidth in bps */
+ int pif_maxpri; /* max priority in use */
+ struct priq_class *pif_default; /* default class */
+ struct priq_class *pif_classes[PRIQ_MAXPRI]; /* classes */
+#ifdef ALTQ3_CLFIER_COMPAT
+ struct acc_classifier pif_classifier; /* classifier */
+#endif
+};
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ALTQ_ALTQ_PRIQ_H_ */
diff --git a/sys/contrib/altq/altq/altq_red.c b/sys/contrib/altq/altq/altq_red.c
new file mode 100644
index 0000000..6010033
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_red.c
@@ -0,0 +1,1505 @@
+/* $FreeBSD$ */
+/* $KAME: altq_red.c,v 1.18 2003/09/05 22:40:36 itojun Exp $ */
+
+/*
+ * Copyright (C) 1997-2003
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+/*
+ * Copyright (c) 1990-1994 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Computer Systems
+ * Engineering Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+#include "opt_altq.h"
+#if (__FreeBSD__ != 2)
+#include "opt_inet.h"
+#ifdef __FreeBSD__
+#include "opt_inet6.h"
+#endif
+#endif
+#endif /* __FreeBSD__ || __NetBSD__ */
+#ifdef ALTQ_RED /* red is enabled by ALTQ_RED option in opt_altq.h */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/systm.h>
+#include <sys/errno.h>
+#if 1 /* ALTQ3_COMPAT */
+#include <sys/sockio.h>
+#include <sys/proc.h>
+#include <sys/kernel.h>
+#ifdef ALTQ_FLOWVALVE
+#include <sys/queue.h>
+#include <sys/time.h>
+#endif
+#endif /* ALTQ3_COMPAT */
+
+#include <net/if.h>
+
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#ifdef INET6
+#include <netinet/ip6.h>
+#endif
+
+#include <net/pfvar.h>
+#include <altq/altq.h>
+#include <altq/altq_red.h>
+#ifdef ALTQ3_COMPAT
+#include <altq/altq_conf.h>
+#ifdef ALTQ_FLOWVALVE
+#include <altq/altq_flowvalve.h>
+#endif
+#endif
+
+/*
+ * ALTQ/RED (Random Early Detection) implementation using 32-bit
+ * fixed-point calculation.
+ *
+ * written by kjc using the ns code as a reference.
+ * you can learn more about red and ns from Sally's home page at
+ * http://www-nrg.ee.lbl.gov/floyd/
+ *
+ * most of the red parameter values are fixed in this implementation
+ * to prevent fixed-point overflow/underflow.
+ * if you change the parameters, watch out for overflow/underflow!
+ *
+ * the parameters used are recommended values by Sally.
+ * the corresponding ns config looks:
+ * q_weight=0.00195
+ * minthresh=5 maxthresh=15 queue-size=60
+ * linterm=30
+ * dropmech=drop-tail
+ * bytes=false (can't be handled by 32-bit fixed-point)
+ * doubleq=false dqthresh=false
+ * wait=true
+ */
+/*
+ * alternative red parameters for a slow link.
+ *
+ * assume the queue length becomes from zero to L and keeps L, it takes
+ * N packets for q_avg to reach 63% of L.
+ * when q_weight is 0.002, N is about 500 packets.
+ * for a slow link like dial-up, 500 packets takes more than 1 minute!
+ * when q_weight is 0.008, N is about 127 packets.
+ * when q_weight is 0.016, N is about 63 packets.
+ * bursts of 50 packets are allowed for 0.002, bursts of 25 packets
+ * are allowed for 0.016.
+ * see Sally's paper for more details.
+ */
+/* normal red parameters */
+#define W_WEIGHT 512 /* inverse of weight of EWMA (511/512) */
+ /* q_weight = 0.00195 */
+
+/* red parameters for a slow link */
+#define W_WEIGHT_1 128 /* inverse of weight of EWMA (127/128) */
+ /* q_weight = 0.0078125 */
+
+/* red parameters for a very slow link (e.g., dialup) */
+#define W_WEIGHT_2 64 /* inverse of weight of EWMA (63/64) */
+ /* q_weight = 0.015625 */
+
+/* fixed-point uses 12-bit decimal places */
+#define FP_SHIFT 12 /* fixed-point shift */
+
+/* red parameters for drop probability */
+#define INV_P_MAX 10 /* inverse of max drop probability */
+#define TH_MIN 5 /* min threshold */
+#define TH_MAX 15 /* max threshold */
+
+#define RED_LIMIT 60 /* default max queue lenght */
+#define RED_STATS /* collect statistics */
+
+/*
+ * our default policy for forced-drop is drop-tail.
+ * (in altq-1.1.2 or earlier, the default was random-drop.
+ * but it makes more sense to punish the cause of the surge.)
+ * to switch to the random-drop policy, define "RED_RANDOM_DROP".
+ */
+
+#ifdef ALTQ3_COMPAT
+#ifdef ALTQ_FLOWVALVE
+/*
+ * flow-valve is an extention to protect red from unresponsive flows
+ * and to promote end-to-end congestion control.
+ * flow-valve observes the average drop rates of the flows that have
+ * experienced packet drops in the recent past.
+ * when the average drop rate exceeds the threshold, the flow is
+ * blocked by the flow-valve. the trapped flow should back off
+ * exponentially to escape from the flow-valve.
+ */
+#ifdef RED_RANDOM_DROP
+#error "random-drop can't be used with flow-valve!"
+#endif
+#endif /* ALTQ_FLOWVALVE */
+
+/* red_list keeps all red_queue_t's allocated. */
+static red_queue_t *red_list = NULL;
+
+#endif /* ALTQ3_COMPAT */
+
+/* default red parameter values */
+static int default_th_min = TH_MIN;
+static int default_th_max = TH_MAX;
+static int default_inv_pmax = INV_P_MAX;
+
+#ifdef ALTQ3_COMPAT
+/* internal function prototypes */
+static int red_enqueue(struct ifaltq *, struct mbuf *, struct altq_pktattr *);
+static struct mbuf *red_dequeue(struct ifaltq *, int);
+static int red_request(struct ifaltq *, int, void *);
+static void red_purgeq(red_queue_t *);
+static int red_detach(red_queue_t *);
+#ifdef ALTQ_FLOWVALVE
+static __inline struct fve *flowlist_lookup(struct flowvalve *,
+ struct altq_pktattr *, struct timeval *);
+static __inline struct fve *flowlist_reclaim(struct flowvalve *,
+ struct altq_pktattr *);
+static __inline void flowlist_move_to_head(struct flowvalve *, struct fve *);
+static __inline int fv_p2f(struct flowvalve *, int);
+#if 0 /* XXX: make the compiler happy (fv_alloc unused) */
+static struct flowvalve *fv_alloc(struct red *);
+#endif
+static void fv_destroy(struct flowvalve *);
+static int fv_checkflow(struct flowvalve *, struct altq_pktattr *,
+ struct fve **);
+static void fv_dropbyred(struct flowvalve *fv, struct altq_pktattr *,
+ struct fve *);
+#endif
+#endif /* ALTQ3_COMPAT */
+
+/*
+ * red support routines
+ */
+red_t *
+red_alloc(int weight, int inv_pmax, int th_min, int th_max, int flags,
+ int pkttime)
+{
+ red_t *rp;
+ int w, i;
+ int npkts_per_sec;
+
+ MALLOC(rp, red_t *, sizeof(red_t), M_DEVBUF, M_WAITOK);
+ if (rp == NULL)
+ return (NULL);
+ bzero(rp, sizeof(red_t));
+
+ rp->red_avg = 0;
+ rp->red_idle = 1;
+
+ if (weight == 0)
+ rp->red_weight = W_WEIGHT;
+ else
+ rp->red_weight = weight;
+ if (inv_pmax == 0)
+ rp->red_inv_pmax = default_inv_pmax;
+ else
+ rp->red_inv_pmax = inv_pmax;
+ if (th_min == 0)
+ rp->red_thmin = default_th_min;
+ else
+ rp->red_thmin = th_min;
+ if (th_max == 0)
+ rp->red_thmax = default_th_max;
+ else
+ rp->red_thmax = th_max;
+
+ rp->red_flags = flags;
+
+ if (pkttime == 0)
+ /* default packet time: 1000 bytes / 10Mbps * 8 * 1000000 */
+ rp->red_pkttime = 800;
+ else
+ rp->red_pkttime = pkttime;
+
+ if (weight == 0) {
+ /* when the link is very slow, adjust red parameters */
+ npkts_per_sec = 1000000 / rp->red_pkttime;
+ if (npkts_per_sec < 50) {
+ /* up to about 400Kbps */
+ rp->red_weight = W_WEIGHT_2;
+ } else if (npkts_per_sec < 300) {
+ /* up to about 2.4Mbps */
+ rp->red_weight = W_WEIGHT_1;
+ }
+ }
+
+ /* calculate wshift. weight must be power of 2 */
+ w = rp->red_weight;
+ for (i = 0; w > 1; i++)
+ w = w >> 1;
+ rp->red_wshift = i;
+ w = 1 << rp->red_wshift;
+ if (w != rp->red_weight) {
+ printf("invalid weight value %d for red! use %d\n",
+ rp->red_weight, w);
+ rp->red_weight = w;
+ }
+
+ /*
+ * thmin_s and thmax_s are scaled versions of th_min and th_max
+ * to be compared with avg.
+ */
+ rp->red_thmin_s = rp->red_thmin << (rp->red_wshift + FP_SHIFT);
+ rp->red_thmax_s = rp->red_thmax << (rp->red_wshift + FP_SHIFT);
+
+ /*
+ * precompute probability denominator
+ * probd = (2 * (TH_MAX-TH_MIN) / pmax) in fixed-point
+ */
+ rp->red_probd = (2 * (rp->red_thmax - rp->red_thmin)
+ * rp->red_inv_pmax) << FP_SHIFT;
+
+ /* allocate weight table */
+ rp->red_wtab = wtab_alloc(rp->red_weight);
+
+ microtime(&rp->red_last);
+ return (rp);
+}
+
+void
+red_destroy(red_t *rp)
+{
+#ifdef ALTQ3_COMPAT
+#ifdef ALTQ_FLOWVALVE
+ if (rp->red_flowvalve != NULL)
+ fv_destroy(rp->red_flowvalve);
+#endif
+#endif /* ALTQ3_COMPAT */
+ wtab_destroy(rp->red_wtab);
+ FREE(rp, M_DEVBUF);
+}
+
+void
+red_getstats(red_t *rp, struct redstats *sp)
+{
+ sp->q_avg = rp->red_avg >> rp->red_wshift;
+ sp->xmit_cnt = rp->red_stats.xmit_cnt;
+ sp->drop_cnt = rp->red_stats.drop_cnt;
+ sp->drop_forced = rp->red_stats.drop_forced;
+ sp->drop_unforced = rp->red_stats.drop_unforced;
+ sp->marked_packets = rp->red_stats.marked_packets;
+}
+
+int
+red_addq(red_t *rp, class_queue_t *q, struct mbuf *m,
+ struct altq_pktattr *pktattr)
+{
+ int avg, droptype;
+ int n;
+#ifdef ALTQ3_COMPAT
+#ifdef ALTQ_FLOWVALVE
+ struct fve *fve = NULL;
+
+ if (rp->red_flowvalve != NULL && rp->red_flowvalve->fv_flows > 0)
+ if (fv_checkflow(rp->red_flowvalve, pktattr, &fve)) {
+ m_freem(m);
+ return (-1);
+ }
+#endif
+#endif /* ALTQ3_COMPAT */
+
+ avg = rp->red_avg;
+
+ /*
+ * if we were idle, we pretend that n packets arrived during
+ * the idle period.
+ */
+ if (rp->red_idle) {
+ struct timeval now;
+ int t;
+
+ rp->red_idle = 0;
+ microtime(&now);
+ t = (now.tv_sec - rp->red_last.tv_sec);
+ if (t > 60) {
+ /*
+ * being idle for more than 1 minute, set avg to zero.
+ * this prevents t from overflow.
+ */
+ avg = 0;
+ } else {
+ t = t * 1000000 + (now.tv_usec - rp->red_last.tv_usec);
+ n = t / rp->red_pkttime - 1;
+
+ /* the following line does (avg = (1 - Wq)^n * avg) */
+ if (n > 0)
+ avg = (avg >> FP_SHIFT) *
+ pow_w(rp->red_wtab, n);
+ }
+ }
+
+ /* run estimator. (note: avg is scaled by WEIGHT in fixed-point) */
+ avg += (qlen(q) << FP_SHIFT) - (avg >> rp->red_wshift);
+ rp->red_avg = avg; /* save the new value */
+
+ /*
+ * red_count keeps a tally of arriving traffic that has not
+ * been dropped.
+ */
+ rp->red_count++;
+
+ /* see if we drop early */
+ droptype = DTYPE_NODROP;
+ if (avg >= rp->red_thmin_s && qlen(q) > 1) {
+ if (avg >= rp->red_thmax_s) {
+ /* avg >= th_max: forced drop */
+ droptype = DTYPE_FORCED;
+ } else if (rp->red_old == 0) {
+ /* first exceeds th_min */
+ rp->red_count = 1;
+ rp->red_old = 1;
+ } else if (drop_early((avg - rp->red_thmin_s) >> rp->red_wshift,
+ rp->red_probd, rp->red_count)) {
+ /* mark or drop by red */
+ if ((rp->red_flags & REDF_ECN) &&
+ mark_ecn(m, pktattr, rp->red_flags)) {
+ /* successfully marked. do not drop. */
+ rp->red_count = 0;
+#ifdef RED_STATS
+ rp->red_stats.marked_packets++;
+#endif
+ } else {
+ /* unforced drop by red */
+ droptype = DTYPE_EARLY;
+ }
+ }
+ } else {
+ /* avg < th_min */
+ rp->red_old = 0;
+ }
+
+ /*
+ * if the queue length hits the hard limit, it's a forced drop.
+ */
+ if (droptype == DTYPE_NODROP && qlen(q) >= qlimit(q))
+ droptype = DTYPE_FORCED;
+
+#ifdef RED_RANDOM_DROP
+ /* if successful or forced drop, enqueue this packet. */
+ if (droptype != DTYPE_EARLY)
+ _addq(q, m);
+#else
+ /* if successful, enqueue this packet. */
+ if (droptype == DTYPE_NODROP)
+ _addq(q, m);
+#endif
+ if (droptype != DTYPE_NODROP) {
+ if (droptype == DTYPE_EARLY) {
+ /* drop the incoming packet */
+#ifdef RED_STATS
+ rp->red_stats.drop_unforced++;
+#endif
+ } else {
+ /* forced drop, select a victim packet in the queue. */
+#ifdef RED_RANDOM_DROP
+ m = _getq_random(q);
+#endif
+#ifdef RED_STATS
+ rp->red_stats.drop_forced++;
+#endif
+ }
+#ifdef RED_STATS
+ PKTCNTR_ADD(&rp->red_stats.drop_cnt, m_pktlen(m));
+#endif
+ rp->red_count = 0;
+#ifdef ALTQ3_COMPAT
+#ifdef ALTQ_FLOWVALVE
+ if (rp->red_flowvalve != NULL)
+ fv_dropbyred(rp->red_flowvalve, pktattr, fve);
+#endif
+#endif /* ALTQ3_COMPAT */
+ m_freem(m);
+ return (-1);
+ }
+ /* successfully queued */
+#ifdef RED_STATS
+ PKTCNTR_ADD(&rp->red_stats.xmit_cnt, m_pktlen(m));
+#endif
+ return (0);
+}
+
+/*
+ * early-drop probability is calculated as follows:
+ * prob = p_max * (avg - th_min) / (th_max - th_min)
+ * prob_a = prob / (2 - count*prob)
+ * = (avg-th_min) / (2*(th_max-th_min)*inv_p_max - count*(avg-th_min))
+ * here prob_a increases as successive undrop count increases.
+ * (prob_a starts from prob/2, becomes prob when (count == (1 / prob)),
+ * becomes 1 when (count >= (2 / prob))).
+ */
+int
+drop_early(int fp_len, int fp_probd, int count)
+{
+ int d; /* denominator of drop-probability */
+
+ d = fp_probd - count * fp_len;
+ if (d <= 0)
+ /* count exceeds the hard limit: drop or mark */
+ return (1);
+
+ /*
+ * now the range of d is [1..600] in fixed-point. (when
+ * th_max-th_min=10 and p_max=1/30)
+ * drop probability = (avg - TH_MIN) / d
+ */
+
+ if ((arc4random() % d) < fp_len) {
+ /* drop or mark */
+ return (1);
+ }
+ /* no drop/mark */
+ return (0);
+}
+
+/*
+ * try to mark CE bit to the packet.
+ * returns 1 if successfully marked, 0 otherwise.
+ */
+int
+mark_ecn(struct mbuf *m, struct altq_pktattr *pktattr, int flags)
+{
+ struct mbuf *m0;
+ struct m_tag *t;
+ struct altq_tag *at;
+ void *hdr;
+ int af;
+
+ t = m_tag_find(m, PACKET_TAG_PF_QID, NULL);
+ if (t != NULL) {
+ at = (struct altq_tag *)(t + 1);
+ if (at == NULL)
+ return (0);
+ af = at->af;
+ hdr = at->hdr;
+#ifdef ALTQ3_COMPAT
+ } else if (pktattr != NULL) {
+ af = pktattr->pattr_af;
+ hdr = pktattr->pattr_hdr;
+#endif /* ALTQ3_COMPAT */
+ } else
+ return (0);
+
+ if (af != AF_INET && af != AF_INET6)
+ return (0);
+
+ /* verify that pattr_hdr is within the mbuf data */
+ for (m0 = m; m0 != NULL; m0 = m0->m_next)
+ if (((caddr_t)hdr >= m0->m_data) &&
+ ((caddr_t)hdr < m0->m_data + m0->m_len))
+ break;
+ if (m0 == NULL) {
+ /* ick, tag info is stale */
+ return (0);
+ }
+
+ switch (af) {
+ case AF_INET:
+ if (flags & REDF_ECN4) {
+ struct ip *ip = hdr;
+ u_int8_t otos;
+ int sum;
+
+ if (ip->ip_v != 4)
+ return (0); /* version mismatch! */
+
+ if ((ip->ip_tos & IPTOS_ECN_MASK) == IPTOS_ECN_NOTECT)
+ return (0); /* not-ECT */
+ if ((ip->ip_tos & IPTOS_ECN_MASK) == IPTOS_ECN_CE)
+ return (1); /* already marked */
+
+ /*
+ * ecn-capable but not marked,
+ * mark CE and update checksum
+ */
+ otos = ip->ip_tos;
+ ip->ip_tos |= IPTOS_ECN_CE;
+ /*
+ * update checksum (from RFC1624)
+ * HC' = ~(~HC + ~m + m')
+ */
+ sum = ~ntohs(ip->ip_sum) & 0xffff;
+ sum += (~otos & 0xffff) + ip->ip_tos;
+ sum = (sum >> 16) + (sum & 0xffff);
+ sum += (sum >> 16); /* add carry */
+ ip->ip_sum = htons(~sum & 0xffff);
+ return (1);
+ }
+ break;
+#ifdef INET6
+ case AF_INET6:
+ if (flags & REDF_ECN6) {
+ struct ip6_hdr *ip6 = hdr;
+ u_int32_t flowlabel;
+
+ flowlabel = ntohl(ip6->ip6_flow);
+ if ((flowlabel >> 28) != 6)
+ return (0); /* version mismatch! */
+ if ((flowlabel & (IPTOS_ECN_MASK << 20)) ==
+ (IPTOS_ECN_NOTECT << 20))
+ return (0); /* not-ECT */
+ if ((flowlabel & (IPTOS_ECN_MASK << 20)) ==
+ (IPTOS_ECN_CE << 20))
+ return (1); /* already marked */
+ /*
+ * ecn-capable but not marked, mark CE
+ */
+ flowlabel |= (IPTOS_ECN_CE << 20);
+ ip6->ip6_flow = htonl(flowlabel);
+ return (1);
+ }
+ break;
+#endif /* INET6 */
+ }
+
+ /* not marked */
+ return (0);
+}
+
+struct mbuf *
+red_getq(rp, q)
+ red_t *rp;
+ class_queue_t *q;
+{
+ struct mbuf *m;
+
+ if ((m = _getq(q)) == NULL) {
+ if (rp->red_idle == 0) {
+ rp->red_idle = 1;
+ microtime(&rp->red_last);
+ }
+ return NULL;
+ }
+
+ rp->red_idle = 0;
+ return (m);
+}
+
+/*
+ * helper routine to calibrate avg during idle.
+ * pow_w(wtab, n) returns (1 - Wq)^n in fixed-point
+ * here Wq = 1/weight and the code assumes Wq is close to zero.
+ *
+ * w_tab[n] holds ((1 - Wq)^(2^n)) in fixed-point.
+ */
+static struct wtab *wtab_list = NULL; /* pointer to wtab list */
+
+struct wtab *
+wtab_alloc(int weight)
+{
+ struct wtab *w;
+ int i;
+
+ for (w = wtab_list; w != NULL; w = w->w_next)
+ if (w->w_weight == weight) {
+ w->w_refcount++;
+ return (w);
+ }
+
+ MALLOC(w, struct wtab *, sizeof(struct wtab), M_DEVBUF, M_WAITOK);
+ if (w == NULL)
+ panic("wtab_alloc: malloc failed!");
+ bzero(w, sizeof(struct wtab));
+ w->w_weight = weight;
+ w->w_refcount = 1;
+ w->w_next = wtab_list;
+ wtab_list = w;
+
+ /* initialize the weight table */
+ w->w_tab[0] = ((weight - 1) << FP_SHIFT) / weight;
+ for (i = 1; i < 32; i++) {
+ w->w_tab[i] = (w->w_tab[i-1] * w->w_tab[i-1]) >> FP_SHIFT;
+ if (w->w_tab[i] == 0 && w->w_param_max == 0)
+ w->w_param_max = 1 << i;
+ }
+
+ return (w);
+}
+
+int
+wtab_destroy(struct wtab *w)
+{
+ struct wtab *prev;
+
+ if (--w->w_refcount > 0)
+ return (0);
+
+ if (wtab_list == w)
+ wtab_list = w->w_next;
+ else for (prev = wtab_list; prev->w_next != NULL; prev = prev->w_next)
+ if (prev->w_next == w) {
+ prev->w_next = w->w_next;
+ break;
+ }
+
+ FREE(w, M_DEVBUF);
+ return (0);
+}
+
+int32_t
+pow_w(struct wtab *w, int n)
+{
+ int i, bit;
+ int32_t val;
+
+ if (n >= w->w_param_max)
+ return (0);
+
+ val = 1 << FP_SHIFT;
+ if (n <= 0)
+ return (val);
+
+ bit = 1;
+ i = 0;
+ while (n) {
+ if (n & bit) {
+ val = (val * w->w_tab[i]) >> FP_SHIFT;
+ n &= ~bit;
+ }
+ i++;
+ bit <<= 1;
+ }
+ return (val);
+}
+
+#ifdef ALTQ3_COMPAT
+/*
+ * red device interface
+ */
+altqdev_decl(red);
+
+int
+redopen(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ /* everything will be done when the queueing scheme is attached. */
+ return 0;
+}
+
+int
+redclose(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ red_queue_t *rqp;
+ int err, error = 0;
+
+ while ((rqp = red_list) != NULL) {
+ /* destroy all */
+ err = red_detach(rqp);
+ if (err != 0 && error == 0)
+ error = err;
+ }
+
+ return error;
+}
+
+int
+redioctl(dev, cmd, addr, flag, p)
+ dev_t dev;
+ ioctlcmd_t cmd;
+ caddr_t addr;
+ int flag;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ red_queue_t *rqp;
+ struct red_interface *ifacep;
+ struct ifnet *ifp;
+ int error = 0;
+
+ /* check super-user privilege */
+ switch (cmd) {
+ case RED_GETSTATS:
+ break;
+ default:
+#if (__FreeBSD_version > 700000)
+ if ((error = priv_check(p, PRIV_ALTQ_MANAGE)) != 0)
+#elsif (__FreeBSD_version > 400000)
+ if ((error = suser(p)) != 0)
+#else
+ if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
+#endif
+ return (error);
+ break;
+ }
+
+ switch (cmd) {
+
+ case RED_ENABLE:
+ ifacep = (struct red_interface *)addr;
+ if ((rqp = altq_lookup(ifacep->red_ifname, ALTQT_RED)) == NULL) {
+ error = EBADF;
+ break;
+ }
+ error = altq_enable(rqp->rq_ifq);
+ break;
+
+ case RED_DISABLE:
+ ifacep = (struct red_interface *)addr;
+ if ((rqp = altq_lookup(ifacep->red_ifname, ALTQT_RED)) == NULL) {
+ error = EBADF;
+ break;
+ }
+ error = altq_disable(rqp->rq_ifq);
+ break;
+
+ case RED_IF_ATTACH:
+ ifp = ifunit(((struct red_interface *)addr)->red_ifname);
+ if (ifp == NULL) {
+ error = ENXIO;
+ break;
+ }
+
+ /* allocate and initialize red_queue_t */
+ MALLOC(rqp, red_queue_t *, sizeof(red_queue_t), M_DEVBUF, M_WAITOK);
+ if (rqp == NULL) {
+ error = ENOMEM;
+ break;
+ }
+ bzero(rqp, sizeof(red_queue_t));
+
+ MALLOC(rqp->rq_q, class_queue_t *, sizeof(class_queue_t),
+ M_DEVBUF, M_WAITOK);
+ if (rqp->rq_q == NULL) {
+ FREE(rqp, M_DEVBUF);
+ error = ENOMEM;
+ break;
+ }
+ bzero(rqp->rq_q, sizeof(class_queue_t));
+
+ rqp->rq_red = red_alloc(0, 0, 0, 0, 0, 0);
+ if (rqp->rq_red == NULL) {
+ FREE(rqp->rq_q, M_DEVBUF);
+ FREE(rqp, M_DEVBUF);
+ error = ENOMEM;
+ break;
+ }
+
+ rqp->rq_ifq = &ifp->if_snd;
+ qtail(rqp->rq_q) = NULL;
+ qlen(rqp->rq_q) = 0;
+ qlimit(rqp->rq_q) = RED_LIMIT;
+ qtype(rqp->rq_q) = Q_RED;
+
+ /*
+ * set RED to this ifnet structure.
+ */
+ error = altq_attach(rqp->rq_ifq, ALTQT_RED, rqp,
+ red_enqueue, red_dequeue, red_request,
+ NULL, NULL);
+ if (error) {
+ red_destroy(rqp->rq_red);
+ FREE(rqp->rq_q, M_DEVBUF);
+ FREE(rqp, M_DEVBUF);
+ break;
+ }
+
+ /* add this state to the red list */
+ rqp->rq_next = red_list;
+ red_list = rqp;
+ break;
+
+ case RED_IF_DETACH:
+ ifacep = (struct red_interface *)addr;
+ if ((rqp = altq_lookup(ifacep->red_ifname, ALTQT_RED)) == NULL) {
+ error = EBADF;
+ break;
+ }
+ error = red_detach(rqp);
+ break;
+
+ case RED_GETSTATS:
+ do {
+ struct red_stats *q_stats;
+ red_t *rp;
+
+ q_stats = (struct red_stats *)addr;
+ if ((rqp = altq_lookup(q_stats->iface.red_ifname,
+ ALTQT_RED)) == NULL) {
+ error = EBADF;
+ break;
+ }
+
+ q_stats->q_len = qlen(rqp->rq_q);
+ q_stats->q_limit = qlimit(rqp->rq_q);
+
+ rp = rqp->rq_red;
+ q_stats->q_avg = rp->red_avg >> rp->red_wshift;
+ q_stats->xmit_cnt = rp->red_stats.xmit_cnt;
+ q_stats->drop_cnt = rp->red_stats.drop_cnt;
+ q_stats->drop_forced = rp->red_stats.drop_forced;
+ q_stats->drop_unforced = rp->red_stats.drop_unforced;
+ q_stats->marked_packets = rp->red_stats.marked_packets;
+
+ q_stats->weight = rp->red_weight;
+ q_stats->inv_pmax = rp->red_inv_pmax;
+ q_stats->th_min = rp->red_thmin;
+ q_stats->th_max = rp->red_thmax;
+
+#ifdef ALTQ_FLOWVALVE
+ if (rp->red_flowvalve != NULL) {
+ struct flowvalve *fv = rp->red_flowvalve;
+ q_stats->fv_flows = fv->fv_flows;
+ q_stats->fv_pass = fv->fv_stats.pass;
+ q_stats->fv_predrop = fv->fv_stats.predrop;
+ q_stats->fv_alloc = fv->fv_stats.alloc;
+ q_stats->fv_escape = fv->fv_stats.escape;
+ } else {
+#endif /* ALTQ_FLOWVALVE */
+ q_stats->fv_flows = 0;
+ q_stats->fv_pass = 0;
+ q_stats->fv_predrop = 0;
+ q_stats->fv_alloc = 0;
+ q_stats->fv_escape = 0;
+#ifdef ALTQ_FLOWVALVE
+ }
+#endif /* ALTQ_FLOWVALVE */
+ } while (/*CONSTCOND*/ 0);
+ break;
+
+ case RED_CONFIG:
+ do {
+ struct red_conf *fc;
+ red_t *new;
+ int s, limit;
+
+ fc = (struct red_conf *)addr;
+ if ((rqp = altq_lookup(fc->iface.red_ifname,
+ ALTQT_RED)) == NULL) {
+ error = EBADF;
+ break;
+ }
+ new = red_alloc(fc->red_weight,
+ fc->red_inv_pmax,
+ fc->red_thmin,
+ fc->red_thmax,
+ fc->red_flags,
+ fc->red_pkttime);
+ if (new == NULL) {
+ error = ENOMEM;
+ break;
+ }
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ red_purgeq(rqp);
+ limit = fc->red_limit;
+ if (limit < fc->red_thmax)
+ limit = fc->red_thmax;
+ qlimit(rqp->rq_q) = limit;
+ fc->red_limit = limit; /* write back the new value */
+
+ red_destroy(rqp->rq_red);
+ rqp->rq_red = new;
+
+ splx(s);
+
+ /* write back new values */
+ fc->red_limit = limit;
+ fc->red_inv_pmax = rqp->rq_red->red_inv_pmax;
+ fc->red_thmin = rqp->rq_red->red_thmin;
+ fc->red_thmax = rqp->rq_red->red_thmax;
+
+ } while (/*CONSTCOND*/ 0);
+ break;
+
+ case RED_SETDEFAULTS:
+ do {
+ struct redparams *rp;
+
+ rp = (struct redparams *)addr;
+
+ default_th_min = rp->th_min;
+ default_th_max = rp->th_max;
+ default_inv_pmax = rp->inv_pmax;
+ } while (/*CONSTCOND*/ 0);
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+static int
+red_detach(rqp)
+ red_queue_t *rqp;
+{
+ red_queue_t *tmp;
+ int error = 0;
+
+ if (ALTQ_IS_ENABLED(rqp->rq_ifq))
+ altq_disable(rqp->rq_ifq);
+
+ if ((error = altq_detach(rqp->rq_ifq)))
+ return (error);
+
+ if (red_list == rqp)
+ red_list = rqp->rq_next;
+ else {
+ for (tmp = red_list; tmp != NULL; tmp = tmp->rq_next)
+ if (tmp->rq_next == rqp) {
+ tmp->rq_next = rqp->rq_next;
+ break;
+ }
+ if (tmp == NULL)
+ printf("red_detach: no state found in red_list!\n");
+ }
+
+ red_destroy(rqp->rq_red);
+ FREE(rqp->rq_q, M_DEVBUF);
+ FREE(rqp, M_DEVBUF);
+ return (error);
+}
+
+/*
+ * enqueue routine:
+ *
+ * returns: 0 when successfully queued.
+ * ENOBUFS when drop occurs.
+ */
+static int
+red_enqueue(ifq, m, pktattr)
+ struct ifaltq *ifq;
+ struct mbuf *m;
+ struct altq_pktattr *pktattr;
+{
+ red_queue_t *rqp = (red_queue_t *)ifq->altq_disc;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ if (red_addq(rqp->rq_red, rqp->rq_q, m, pktattr) < 0)
+ return ENOBUFS;
+ ifq->ifq_len++;
+ return 0;
+}
+
+/*
+ * dequeue routine:
+ * must be called in splimp.
+ *
+ * returns: mbuf dequeued.
+ * NULL when no packet is available in the queue.
+ */
+
+static struct mbuf *
+red_dequeue(ifq, op)
+ struct ifaltq *ifq;
+ int op;
+{
+ red_queue_t *rqp = (red_queue_t *)ifq->altq_disc;
+ struct mbuf *m;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ if (op == ALTDQ_POLL)
+ return qhead(rqp->rq_q);
+
+ /* op == ALTDQ_REMOVE */
+ m = red_getq(rqp->rq_red, rqp->rq_q);
+ if (m != NULL)
+ ifq->ifq_len--;
+ return (m);
+}
+
+static int
+red_request(ifq, req, arg)
+ struct ifaltq *ifq;
+ int req;
+ void *arg;
+{
+ red_queue_t *rqp = (red_queue_t *)ifq->altq_disc;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ switch (req) {
+ case ALTRQ_PURGE:
+ red_purgeq(rqp);
+ break;
+ }
+ return (0);
+}
+
+static void
+red_purgeq(rqp)
+ red_queue_t *rqp;
+{
+ _flushq(rqp->rq_q);
+ if (ALTQ_IS_ENABLED(rqp->rq_ifq))
+ rqp->rq_ifq->ifq_len = 0;
+}
+
+#ifdef ALTQ_FLOWVALVE
+
+#define FV_PSHIFT 7 /* weight of average drop rate -- 1/128 */
+#define FV_PSCALE(x) ((x) << FV_PSHIFT)
+#define FV_PUNSCALE(x) ((x) >> FV_PSHIFT)
+#define FV_FSHIFT 5 /* weight of average fraction -- 1/32 */
+#define FV_FSCALE(x) ((x) << FV_FSHIFT)
+#define FV_FUNSCALE(x) ((x) >> FV_FSHIFT)
+
+#define FV_TIMER (3 * hz) /* timer value for garbage collector */
+#define FV_FLOWLISTSIZE 64 /* how many flows in flowlist */
+
+#define FV_N 10 /* update fve_f every FV_N packets */
+
+#define FV_BACKOFFTHRESH 1 /* backoff threshold interval in second */
+#define FV_TTHRESH 3 /* time threshold to delete fve */
+#define FV_ALPHA 5 /* extra packet count */
+
+#define FV_STATS
+
+#if (__FreeBSD_version > 300000)
+#define FV_TIMESTAMP(tp) getmicrotime(tp)
+#else
+#define FV_TIMESTAMP(tp) { (*(tp)) = time; }
+#endif
+
+/*
+ * Brtt table: 127 entry table to convert drop rate (p) to
+ * the corresponding bandwidth fraction (f)
+ * the following equation is implemented to use scaled values,
+ * fve_p and fve_f, in the fixed point format.
+ *
+ * Brtt(p) = 1 /(sqrt(4*p/3) + min(1,3*sqrt(p*6/8)) * p * (1+32 * p*p))
+ * f = Brtt(p) / (max_th + alpha)
+ */
+#define BRTT_SIZE 128
+#define BRTT_SHIFT 12
+#define BRTT_MASK 0x0007f000
+#define BRTT_PMAX (1 << (FV_PSHIFT + FP_SHIFT))
+
+const int brtt_tab[BRTT_SIZE] = {
+ 0, 1262010, 877019, 703694, 598706, 525854, 471107, 427728,
+ 392026, 361788, 335598, 312506, 291850, 273158, 256081, 240361,
+ 225800, 212247, 199585, 187788, 178388, 169544, 161207, 153333,
+ 145888, 138841, 132165, 125836, 119834, 114141, 108739, 103612,
+ 98747, 94129, 89746, 85585, 81637, 77889, 74333, 70957,
+ 67752, 64711, 61824, 59084, 56482, 54013, 51667, 49440,
+ 47325, 45315, 43406, 41591, 39866, 38227, 36667, 35184,
+ 33773, 32430, 31151, 29933, 28774, 27668, 26615, 25611,
+ 24653, 23740, 22868, 22035, 21240, 20481, 19755, 19062,
+ 18399, 17764, 17157, 16576, 16020, 15487, 14976, 14487,
+ 14017, 13567, 13136, 12721, 12323, 11941, 11574, 11222,
+ 10883, 10557, 10243, 9942, 9652, 9372, 9103, 8844,
+ 8594, 8354, 8122, 7898, 7682, 7474, 7273, 7079,
+ 6892, 6711, 6536, 6367, 6204, 6046, 5893, 5746,
+ 5603, 5464, 5330, 5201, 5075, 4954, 4836, 4722,
+ 4611, 4504, 4400, 4299, 4201, 4106, 4014, 3924
+};
+
+static __inline struct fve *
+flowlist_lookup(fv, pktattr, now)
+ struct flowvalve *fv;
+ struct altq_pktattr *pktattr;
+ struct timeval *now;
+{
+ struct fve *fve;
+ int flows;
+ struct ip *ip;
+#ifdef INET6
+ struct ip6_hdr *ip6;
+#endif
+ struct timeval tthresh;
+
+ if (pktattr == NULL)
+ return (NULL);
+
+ tthresh.tv_sec = now->tv_sec - FV_TTHRESH;
+ flows = 0;
+ /*
+ * search the flow list
+ */
+ switch (pktattr->pattr_af) {
+ case AF_INET:
+ ip = (struct ip *)pktattr->pattr_hdr;
+ TAILQ_FOREACH(fve, &fv->fv_flowlist, fve_lru){
+ if (fve->fve_lastdrop.tv_sec == 0)
+ break;
+ if (fve->fve_lastdrop.tv_sec < tthresh.tv_sec) {
+ fve->fve_lastdrop.tv_sec = 0;
+ break;
+ }
+ if (fve->fve_flow.flow_af == AF_INET &&
+ fve->fve_flow.flow_ip.ip_src.s_addr ==
+ ip->ip_src.s_addr &&
+ fve->fve_flow.flow_ip.ip_dst.s_addr ==
+ ip->ip_dst.s_addr)
+ return (fve);
+ flows++;
+ }
+ break;
+#ifdef INET6
+ case AF_INET6:
+ ip6 = (struct ip6_hdr *)pktattr->pattr_hdr;
+ TAILQ_FOREACH(fve, &fv->fv_flowlist, fve_lru){
+ if (fve->fve_lastdrop.tv_sec == 0)
+ break;
+ if (fve->fve_lastdrop.tv_sec < tthresh.tv_sec) {
+ fve->fve_lastdrop.tv_sec = 0;
+ break;
+ }
+ if (fve->fve_flow.flow_af == AF_INET6 &&
+ IN6_ARE_ADDR_EQUAL(&fve->fve_flow.flow_ip6.ip6_src,
+ &ip6->ip6_src) &&
+ IN6_ARE_ADDR_EQUAL(&fve->fve_flow.flow_ip6.ip6_dst,
+ &ip6->ip6_dst))
+ return (fve);
+ flows++;
+ }
+ break;
+#endif /* INET6 */
+
+ default:
+ /* unknown protocol. no drop. */
+ return (NULL);
+ }
+ fv->fv_flows = flows; /* save the number of active fve's */
+ return (NULL);
+}
+
+static __inline struct fve *
+flowlist_reclaim(fv, pktattr)
+ struct flowvalve *fv;
+ struct altq_pktattr *pktattr;
+{
+ struct fve *fve;
+ struct ip *ip;
+#ifdef INET6
+ struct ip6_hdr *ip6;
+#endif
+
+ /*
+ * get an entry from the tail of the LRU list.
+ */
+ fve = TAILQ_LAST(&fv->fv_flowlist, fv_flowhead);
+
+ switch (pktattr->pattr_af) {
+ case AF_INET:
+ ip = (struct ip *)pktattr->pattr_hdr;
+ fve->fve_flow.flow_af = AF_INET;
+ fve->fve_flow.flow_ip.ip_src = ip->ip_src;
+ fve->fve_flow.flow_ip.ip_dst = ip->ip_dst;
+ break;
+#ifdef INET6
+ case AF_INET6:
+ ip6 = (struct ip6_hdr *)pktattr->pattr_hdr;
+ fve->fve_flow.flow_af = AF_INET6;
+ fve->fve_flow.flow_ip6.ip6_src = ip6->ip6_src;
+ fve->fve_flow.flow_ip6.ip6_dst = ip6->ip6_dst;
+ break;
+#endif
+ }
+
+ fve->fve_state = Green;
+ fve->fve_p = 0.0;
+ fve->fve_f = 0.0;
+ fve->fve_ifseq = fv->fv_ifseq - 1;
+ fve->fve_count = 0;
+
+ fv->fv_flows++;
+#ifdef FV_STATS
+ fv->fv_stats.alloc++;
+#endif
+ return (fve);
+}
+
+static __inline void
+flowlist_move_to_head(fv, fve)
+ struct flowvalve *fv;
+ struct fve *fve;
+{
+ if (TAILQ_FIRST(&fv->fv_flowlist) != fve) {
+ TAILQ_REMOVE(&fv->fv_flowlist, fve, fve_lru);
+ TAILQ_INSERT_HEAD(&fv->fv_flowlist, fve, fve_lru);
+ }
+}
+
+#if 0 /* XXX: make the compiler happy (fv_alloc unused) */
+/*
+ * allocate flowvalve structure
+ */
+static struct flowvalve *
+fv_alloc(rp)
+ struct red *rp;
+{
+ struct flowvalve *fv;
+ struct fve *fve;
+ int i, num;
+
+ num = FV_FLOWLISTSIZE;
+ MALLOC(fv, struct flowvalve *, sizeof(struct flowvalve),
+ M_DEVBUF, M_WAITOK);
+ if (fv == NULL)
+ return (NULL);
+ bzero(fv, sizeof(struct flowvalve));
+
+ MALLOC(fv->fv_fves, struct fve *, sizeof(struct fve) * num,
+ M_DEVBUF, M_WAITOK);
+ if (fv->fv_fves == NULL) {
+ FREE(fv, M_DEVBUF);
+ return (NULL);
+ }
+ bzero(fv->fv_fves, sizeof(struct fve) * num);
+
+ fv->fv_flows = 0;
+ TAILQ_INIT(&fv->fv_flowlist);
+ for (i = 0; i < num; i++) {
+ fve = &fv->fv_fves[i];
+ fve->fve_lastdrop.tv_sec = 0;
+ TAILQ_INSERT_TAIL(&fv->fv_flowlist, fve, fve_lru);
+ }
+
+ /* initialize drop rate threshold in scaled fixed-point */
+ fv->fv_pthresh = (FV_PSCALE(1) << FP_SHIFT) / rp->red_inv_pmax;
+
+ /* initialize drop rate to fraction table */
+ MALLOC(fv->fv_p2ftab, int *, sizeof(int) * BRTT_SIZE,
+ M_DEVBUF, M_WAITOK);
+ if (fv->fv_p2ftab == NULL) {
+ FREE(fv->fv_fves, M_DEVBUF);
+ FREE(fv, M_DEVBUF);
+ return (NULL);
+ }
+ /*
+ * create the p2f table.
+ * (shift is used to keep the precision)
+ */
+ for (i = 1; i < BRTT_SIZE; i++) {
+ int f;
+
+ f = brtt_tab[i] << 8;
+ fv->fv_p2ftab[i] = (f / (rp->red_thmax + FV_ALPHA)) >> 8;
+ }
+
+ return (fv);
+}
+#endif
+
+static void fv_destroy(fv)
+ struct flowvalve *fv;
+{
+ FREE(fv->fv_p2ftab, M_DEVBUF);
+ FREE(fv->fv_fves, M_DEVBUF);
+ FREE(fv, M_DEVBUF);
+}
+
+static __inline int
+fv_p2f(fv, p)
+ struct flowvalve *fv;
+ int p;
+{
+ int val, f;
+
+ if (p >= BRTT_PMAX)
+ f = fv->fv_p2ftab[BRTT_SIZE-1];
+ else if ((val = (p & BRTT_MASK)))
+ f = fv->fv_p2ftab[(val >> BRTT_SHIFT)];
+ else
+ f = fv->fv_p2ftab[1];
+ return (f);
+}
+
+/*
+ * check if an arriving packet should be pre-dropped.
+ * called from red_addq() when a packet arrives.
+ * returns 1 when the packet should be pre-dropped.
+ * should be called in splimp.
+ */
+static int
+fv_checkflow(fv, pktattr, fcache)
+ struct flowvalve *fv;
+ struct altq_pktattr *pktattr;
+ struct fve **fcache;
+{
+ struct fve *fve;
+ struct timeval now;
+
+ fv->fv_ifseq++;
+ FV_TIMESTAMP(&now);
+
+ if ((fve = flowlist_lookup(fv, pktattr, &now)) == NULL)
+ /* no matching entry in the flowlist */
+ return (0);
+
+ *fcache = fve;
+
+ /* update fraction f for every FV_N packets */
+ if (++fve->fve_count == FV_N) {
+ /*
+ * f = Wf * N / (fv_ifseq - fve_ifseq) + (1 - Wf) * f
+ */
+ fve->fve_f =
+ (FV_N << FP_SHIFT) / (fv->fv_ifseq - fve->fve_ifseq)
+ + fve->fve_f - FV_FUNSCALE(fve->fve_f);
+ fve->fve_ifseq = fv->fv_ifseq;
+ fve->fve_count = 0;
+ }
+
+ /*
+ * overpumping test
+ */
+ if (fve->fve_state == Green && fve->fve_p > fv->fv_pthresh) {
+ int fthresh;
+
+ /* calculate a threshold */
+ fthresh = fv_p2f(fv, fve->fve_p);
+ if (fve->fve_f > fthresh)
+ fve->fve_state = Red;
+ }
+
+ if (fve->fve_state == Red) {
+ /*
+ * backoff test
+ */
+ if (now.tv_sec - fve->fve_lastdrop.tv_sec > FV_BACKOFFTHRESH) {
+ /* no drop for at least FV_BACKOFFTHRESH sec */
+ fve->fve_p = 0;
+ fve->fve_state = Green;
+#ifdef FV_STATS
+ fv->fv_stats.escape++;
+#endif
+ } else {
+ /* block this flow */
+ flowlist_move_to_head(fv, fve);
+ fve->fve_lastdrop = now;
+#ifdef FV_STATS
+ fv->fv_stats.predrop++;
+#endif
+ return (1);
+ }
+ }
+
+ /*
+ * p = (1 - Wp) * p
+ */
+ fve->fve_p -= FV_PUNSCALE(fve->fve_p);
+ if (fve->fve_p < 0)
+ fve->fve_p = 0;
+#ifdef FV_STATS
+ fv->fv_stats.pass++;
+#endif
+ return (0);
+}
+
+/*
+ * called from red_addq when a packet is dropped by red.
+ * should be called in splimp.
+ */
+static void fv_dropbyred(fv, pktattr, fcache)
+ struct flowvalve *fv;
+ struct altq_pktattr *pktattr;
+ struct fve *fcache;
+{
+ struct fve *fve;
+ struct timeval now;
+
+ if (pktattr == NULL)
+ return;
+ FV_TIMESTAMP(&now);
+
+ if (fcache != NULL)
+ /* the fve of this packet is already cached */
+ fve = fcache;
+ else if ((fve = flowlist_lookup(fv, pktattr, &now)) == NULL)
+ fve = flowlist_reclaim(fv, pktattr);
+
+ flowlist_move_to_head(fv, fve);
+
+ /*
+ * update p: the following line cancels the update
+ * in fv_checkflow() and calculate
+ * p = Wp + (1 - Wp) * p
+ */
+ fve->fve_p = (1 << FP_SHIFT) + fve->fve_p;
+
+ fve->fve_lastdrop = now;
+}
+
+#endif /* ALTQ_FLOWVALVE */
+
+#ifdef KLD_MODULE
+
+static struct altqsw red_sw =
+ {"red", redopen, redclose, redioctl};
+
+ALTQ_MODULE(altq_red, ALTQT_RED, &red_sw);
+MODULE_VERSION(altq_red, 1);
+
+#endif /* KLD_MODULE */
+#endif /* ALTQ3_COMPAT */
+
+#endif /* ALTQ_RED */
diff --git a/sys/contrib/altq/altq/altq_red.h b/sys/contrib/altq/altq/altq_red.h
new file mode 100644
index 0000000..dc8ea0a
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_red.h
@@ -0,0 +1,198 @@
+/* $KAME: altq_red.h,v 1.8 2003/07/10 12:07:49 kjc Exp $ */
+
+/*
+ * Copyright (C) 1997-2003
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ALTQ_ALTQ_RED_H_
+#define _ALTQ_ALTQ_RED_H_
+
+#include <altq/altq_classq.h>
+
+#ifdef ALTQ3_COMPAT
+struct red_interface {
+ char red_ifname[IFNAMSIZ];
+};
+
+struct red_stats {
+ struct red_interface iface;
+ int q_len;
+ int q_avg;
+
+ struct pktcntr xmit_cnt;
+ struct pktcntr drop_cnt;
+ u_int drop_forced;
+ u_int drop_unforced;
+ u_int marked_packets;
+
+ /* static red parameters */
+ int q_limit;
+ int weight;
+ int inv_pmax;
+ int th_min;
+ int th_max;
+
+ /* flowvalve related stuff */
+ u_int fv_flows;
+ u_int fv_pass;
+ u_int fv_predrop;
+ u_int fv_alloc;
+ u_int fv_escape;
+};
+
+struct red_conf {
+ struct red_interface iface;
+ int red_weight; /* weight for EWMA */
+ int red_inv_pmax; /* inverse of max drop probability */
+ int red_thmin; /* red min threshold */
+ int red_thmax; /* red max threshold */
+ int red_limit; /* max queue length */
+ int red_pkttime; /* average packet time in usec */
+ int red_flags; /* see below */
+};
+#endif /* ALTQ3_COMPAT */
+
+/* red flags */
+#define REDF_ECN4 0x01 /* use packet marking for IPv4 packets */
+#define REDF_ECN6 0x02 /* use packet marking for IPv6 packets */
+#define REDF_ECN (REDF_ECN4 | REDF_ECN6)
+#define REDF_FLOWVALVE 0x04 /* use flowvalve (aka penalty-box) */
+
+/*
+ * simpler versions of red parameters and statistics used by other
+ * disciplines (e.g., CBQ)
+ */
+struct redparams {
+ int th_min; /* red min threshold */
+ int th_max; /* red max threshold */
+ int inv_pmax; /* inverse of max drop probability */
+};
+
+struct redstats {
+ int q_avg;
+ struct pktcntr xmit_cnt;
+ struct pktcntr drop_cnt;
+ u_int drop_forced;
+ u_int drop_unforced;
+ u_int marked_packets;
+};
+
+#ifdef ALTQ3_COMPAT
+/*
+ * IOCTLs for RED
+ */
+#define RED_IF_ATTACH _IOW('Q', 1, struct red_interface)
+#define RED_IF_DETACH _IOW('Q', 2, struct red_interface)
+#define RED_ENABLE _IOW('Q', 3, struct red_interface)
+#define RED_DISABLE _IOW('Q', 4, struct red_interface)
+#define RED_CONFIG _IOWR('Q', 6, struct red_conf)
+#define RED_GETSTATS _IOWR('Q', 12, struct red_stats)
+#define RED_SETDEFAULTS _IOW('Q', 30, struct redparams)
+#endif /* ALTQ3_COMPAT */
+
+#ifdef _KERNEL
+
+#ifdef ALTQ3_COMPAT
+struct flowvalve;
+#endif
+
+/* weight table structure for idle time calibration */
+struct wtab {
+ struct wtab *w_next;
+ int w_weight;
+ int w_param_max;
+ int w_refcount;
+ int32_t w_tab[32];
+};
+
+typedef struct red {
+ int red_pkttime; /* average packet time in micro sec
+ used for idle calibration */
+ int red_flags; /* red flags */
+
+ /* red parameters */
+ int red_weight; /* weight for EWMA */
+ int red_inv_pmax; /* inverse of max drop probability */
+ int red_thmin; /* red min threshold */
+ int red_thmax; /* red max threshold */
+
+ /* variables for internal use */
+ int red_wshift; /* log(red_weight) */
+ int red_thmin_s; /* th_min scaled by avgshift */
+ int red_thmax_s; /* th_max scaled by avgshift */
+ int red_probd; /* drop probability denominator */
+
+ int red_avg; /* queue len avg scaled by avgshift */
+ int red_count; /* packet count since last dropped/
+ marked packet */
+ int red_idle; /* queue was empty */
+ int red_old; /* avg is above th_min */
+ struct wtab *red_wtab; /* weight table */
+ struct timeval red_last; /* time when the queue becomes idle */
+
+#ifdef ALTQ3_COMPAT
+ struct flowvalve *red_flowvalve; /* flowvalve state */
+#endif
+
+ struct {
+ struct pktcntr xmit_cnt;
+ struct pktcntr drop_cnt;
+ u_int drop_forced;
+ u_int drop_unforced;
+ u_int marked_packets;
+ } red_stats;
+} red_t;
+
+#ifdef ALTQ3_COMPAT
+typedef struct red_queue {
+ struct red_queue *rq_next; /* next red_state in the list */
+ struct ifaltq *rq_ifq; /* backpointer to ifaltq */
+
+ class_queue_t *rq_q;
+
+ red_t *rq_red;
+} red_queue_t;
+#endif /* ALTQ3_COMPAT */
+
+/* red drop types */
+#define DTYPE_NODROP 0 /* no drop */
+#define DTYPE_FORCED 1 /* a "forced" drop */
+#define DTYPE_EARLY 2 /* an "unforced" (early) drop */
+
+extern red_t *red_alloc(int, int, int, int, int, int);
+extern void red_destroy(red_t *);
+extern void red_getstats(red_t *, struct redstats *);
+extern int red_addq(red_t *, class_queue_t *, struct mbuf *,
+ struct altq_pktattr *);
+extern struct mbuf *red_getq(red_t *, class_queue_t *);
+extern int drop_early(int, int, int);
+extern int mark_ecn(struct mbuf *, struct altq_pktattr *, int);
+extern struct wtab *wtab_alloc(int);
+extern int wtab_destroy(struct wtab *);
+extern int32_t pow_w(struct wtab *, int);
+
+#endif /* _KERNEL */
+
+#endif /* _ALTQ_ALTQ_RED_H_ */
diff --git a/sys/contrib/altq/altq/altq_rio.c b/sys/contrib/altq/altq/altq_rio.c
new file mode 100644
index 0000000..a05dba7
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_rio.c
@@ -0,0 +1,853 @@
+/* $FreeBSD$ */
+/* $KAME: altq_rio.c,v 1.17 2003/07/10 12:07:49 kjc Exp $ */
+
+/*
+ * Copyright (C) 1998-2003
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+/*
+ * Copyright (c) 1990-1994 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Computer Systems
+ * Engineering Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+#include "opt_altq.h"
+#if (__FreeBSD__ != 2)
+#include "opt_inet.h"
+#ifdef __FreeBSD__
+#include "opt_inet6.h"
+#endif
+#endif
+#endif /* __FreeBSD__ || __NetBSD__ */
+#ifdef ALTQ_RIO /* rio is enabled by ALTQ_RIO option in opt_altq.h */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/systm.h>
+#include <sys/errno.h>
+#if 1 /* ALTQ3_COMPAT */
+#include <sys/proc.h>
+#include <sys/sockio.h>
+#include <sys/kernel.h>
+#endif
+
+#include <net/if.h>
+
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#ifdef INET6
+#include <netinet/ip6.h>
+#endif
+
+#include <net/pfvar.h>
+#include <altq/altq.h>
+#include <altq/altq_cdnr.h>
+#include <altq/altq_red.h>
+#include <altq/altq_rio.h>
+#ifdef ALTQ3_COMPAT
+#include <altq/altq_conf.h>
+#endif
+
+/*
+ * RIO: RED with IN/OUT bit
+ * described in
+ * "Explicit Allocation of Best Effort Packet Delivery Service"
+ * David D. Clark and Wenjia Fang, MIT Lab for Computer Science
+ * http://diffserv.lcs.mit.edu/Papers/exp-alloc-ddc-wf.{ps,pdf}
+ *
+ * this implementation is extended to support more than 2 drop precedence
+ * values as described in RFC2597 (Assured Forwarding PHB Group).
+ *
+ */
+/*
+ * AF DS (differentiated service) codepoints.
+ * (classes can be mapped to CBQ or H-FSC classes.)
+ *
+ * 0 1 2 3 4 5 6 7
+ * +---+---+---+---+---+---+---+---+
+ * | CLASS |DropPre| 0 | CU |
+ * +---+---+---+---+---+---+---+---+
+ *
+ * class 1: 001
+ * class 2: 010
+ * class 3: 011
+ * class 4: 100
+ *
+ * low drop prec: 01
+ * medium drop prec: 10
+ * high drop prec: 01
+ */
+
+/* normal red parameters */
+#define W_WEIGHT 512 /* inverse of weight of EWMA (511/512) */
+ /* q_weight = 0.00195 */
+
+/* red parameters for a slow link */
+#define W_WEIGHT_1 128 /* inverse of weight of EWMA (127/128) */
+ /* q_weight = 0.0078125 */
+
+/* red parameters for a very slow link (e.g., dialup) */
+#define W_WEIGHT_2 64 /* inverse of weight of EWMA (63/64) */
+ /* q_weight = 0.015625 */
+
+/* fixed-point uses 12-bit decimal places */
+#define FP_SHIFT 12 /* fixed-point shift */
+
+/* red parameters for drop probability */
+#define INV_P_MAX 10 /* inverse of max drop probability */
+#define TH_MIN 5 /* min threshold */
+#define TH_MAX 15 /* max threshold */
+
+#define RIO_LIMIT 60 /* default max queue lenght */
+#define RIO_STATS /* collect statistics */
+
+#define TV_DELTA(a, b, delta) { \
+ register int xxs; \
+ \
+ delta = (a)->tv_usec - (b)->tv_usec; \
+ if ((xxs = (a)->tv_sec - (b)->tv_sec) != 0) { \
+ if (xxs < 0) { \
+ delta = 60000000; \
+ } else if (xxs > 4) { \
+ if (xxs > 60) \
+ delta = 60000000; \
+ else \
+ delta += xxs * 1000000; \
+ } else while (xxs > 0) { \
+ delta += 1000000; \
+ xxs--; \
+ } \
+ } \
+}
+
+#ifdef ALTQ3_COMPAT
+/* rio_list keeps all rio_queue_t's allocated. */
+static rio_queue_t *rio_list = NULL;
+#endif
+/* default rio parameter values */
+static struct redparams default_rio_params[RIO_NDROPPREC] = {
+ /* th_min, th_max, inv_pmax */
+ { TH_MAX * 2 + TH_MIN, TH_MAX * 3, INV_P_MAX }, /* low drop precedence */
+ { TH_MAX + TH_MIN, TH_MAX * 2, INV_P_MAX }, /* medium drop precedence */
+ { TH_MIN, TH_MAX, INV_P_MAX } /* high drop precedence */
+};
+
+/* internal function prototypes */
+static int dscp2index(u_int8_t);
+#ifdef ALTQ3_COMPAT
+static int rio_enqueue(struct ifaltq *, struct mbuf *, struct altq_pktattr *);
+static struct mbuf *rio_dequeue(struct ifaltq *, int);
+static int rio_request(struct ifaltq *, int, void *);
+static int rio_detach(rio_queue_t *);
+
+/*
+ * rio device interface
+ */
+altqdev_decl(rio);
+
+#endif /* ALTQ3_COMPAT */
+
+rio_t *
+rio_alloc(int weight, struct redparams *params, int flags, int pkttime)
+{
+ rio_t *rp;
+ int w, i;
+ int npkts_per_sec;
+
+ MALLOC(rp, rio_t *, sizeof(rio_t), M_DEVBUF, M_WAITOK);
+ if (rp == NULL)
+ return (NULL);
+ bzero(rp, sizeof(rio_t));
+
+ rp->rio_flags = flags;
+ if (pkttime == 0)
+ /* default packet time: 1000 bytes / 10Mbps * 8 * 1000000 */
+ rp->rio_pkttime = 800;
+ else
+ rp->rio_pkttime = pkttime;
+
+ if (weight != 0)
+ rp->rio_weight = weight;
+ else {
+ /* use default */
+ rp->rio_weight = W_WEIGHT;
+
+ /* when the link is very slow, adjust red parameters */
+ npkts_per_sec = 1000000 / rp->rio_pkttime;
+ if (npkts_per_sec < 50) {
+ /* up to about 400Kbps */
+ rp->rio_weight = W_WEIGHT_2;
+ } else if (npkts_per_sec < 300) {
+ /* up to about 2.4Mbps */
+ rp->rio_weight = W_WEIGHT_1;
+ }
+ }
+
+ /* calculate wshift. weight must be power of 2 */
+ w = rp->rio_weight;
+ for (i = 0; w > 1; i++)
+ w = w >> 1;
+ rp->rio_wshift = i;
+ w = 1 << rp->rio_wshift;
+ if (w != rp->rio_weight) {
+ printf("invalid weight value %d for red! use %d\n",
+ rp->rio_weight, w);
+ rp->rio_weight = w;
+ }
+
+ /* allocate weight table */
+ rp->rio_wtab = wtab_alloc(rp->rio_weight);
+
+ for (i = 0; i < RIO_NDROPPREC; i++) {
+ struct dropprec_state *prec = &rp->rio_precstate[i];
+
+ prec->avg = 0;
+ prec->idle = 1;
+
+ if (params == NULL || params[i].inv_pmax == 0)
+ prec->inv_pmax = default_rio_params[i].inv_pmax;
+ else
+ prec->inv_pmax = params[i].inv_pmax;
+ if (params == NULL || params[i].th_min == 0)
+ prec->th_min = default_rio_params[i].th_min;
+ else
+ prec->th_min = params[i].th_min;
+ if (params == NULL || params[i].th_max == 0)
+ prec->th_max = default_rio_params[i].th_max;
+ else
+ prec->th_max = params[i].th_max;
+
+ /*
+ * th_min_s and th_max_s are scaled versions of th_min
+ * and th_max to be compared with avg.
+ */
+ prec->th_min_s = prec->th_min << (rp->rio_wshift + FP_SHIFT);
+ prec->th_max_s = prec->th_max << (rp->rio_wshift + FP_SHIFT);
+
+ /*
+ * precompute probability denominator
+ * probd = (2 * (TH_MAX-TH_MIN) / pmax) in fixed-point
+ */
+ prec->probd = (2 * (prec->th_max - prec->th_min)
+ * prec->inv_pmax) << FP_SHIFT;
+
+ microtime(&prec->last);
+ }
+
+ return (rp);
+}
+
+void
+rio_destroy(rio_t *rp)
+{
+ wtab_destroy(rp->rio_wtab);
+ FREE(rp, M_DEVBUF);
+}
+
+void
+rio_getstats(rio_t *rp, struct redstats *sp)
+{
+ int i;
+
+ for (i = 0; i < RIO_NDROPPREC; i++) {
+ bcopy(&rp->q_stats[i], sp, sizeof(struct redstats));
+ sp->q_avg = rp->rio_precstate[i].avg >> rp->rio_wshift;
+ sp++;
+ }
+}
+
+#if (RIO_NDROPPREC == 3)
+/*
+ * internally, a drop precedence value is converted to an index
+ * starting from 0.
+ */
+static int
+dscp2index(u_int8_t dscp)
+{
+ int dpindex = dscp & AF_DROPPRECMASK;
+
+ if (dpindex == 0)
+ return (0);
+ return ((dpindex >> 3) - 1);
+}
+#endif
+
+#if 1
+/*
+ * kludge: when a packet is dequeued, we need to know its drop precedence
+ * in order to keep the queue length of each drop precedence.
+ * use m_pkthdr.rcvif to pass this info.
+ */
+#define RIOM_SET_PRECINDEX(m, idx) \
+ do { (m)->m_pkthdr.rcvif = (void *)((long)(idx)); } while (0)
+#define RIOM_GET_PRECINDEX(m) \
+ ({ long idx; idx = (long)((m)->m_pkthdr.rcvif); \
+ (m)->m_pkthdr.rcvif = NULL; idx; })
+#endif
+
+int
+rio_addq(rio_t *rp, class_queue_t *q, struct mbuf *m,
+ struct altq_pktattr *pktattr)
+{
+ int avg, droptype;
+ u_int8_t dsfield, odsfield;
+ int dpindex, i, n, t;
+ struct timeval now;
+ struct dropprec_state *prec;
+
+ dsfield = odsfield = read_dsfield(m, pktattr);
+ dpindex = dscp2index(dsfield);
+
+ /*
+ * update avg of the precedence states whose drop precedence
+ * is larger than or equal to the drop precedence of the packet
+ */
+ now.tv_sec = 0;
+ for (i = dpindex; i < RIO_NDROPPREC; i++) {
+ prec = &rp->rio_precstate[i];
+ avg = prec->avg;
+ if (prec->idle) {
+ prec->idle = 0;
+ if (now.tv_sec == 0)
+ microtime(&now);
+ t = (now.tv_sec - prec->last.tv_sec);
+ if (t > 60)
+ avg = 0;
+ else {
+ t = t * 1000000 +
+ (now.tv_usec - prec->last.tv_usec);
+ n = t / rp->rio_pkttime;
+ /* calculate (avg = (1 - Wq)^n * avg) */
+ if (n > 0)
+ avg = (avg >> FP_SHIFT) *
+ pow_w(rp->rio_wtab, n);
+ }
+ }
+
+ /* run estimator. (avg is scaled by WEIGHT in fixed-point) */
+ avg += (prec->qlen << FP_SHIFT) - (avg >> rp->rio_wshift);
+ prec->avg = avg; /* save the new value */
+ /*
+ * count keeps a tally of arriving traffic that has not
+ * been dropped.
+ */
+ prec->count++;
+ }
+
+ prec = &rp->rio_precstate[dpindex];
+ avg = prec->avg;
+
+ /* see if we drop early */
+ droptype = DTYPE_NODROP;
+ if (avg >= prec->th_min_s && prec->qlen > 1) {
+ if (avg >= prec->th_max_s) {
+ /* avg >= th_max: forced drop */
+ droptype = DTYPE_FORCED;
+ } else if (prec->old == 0) {
+ /* first exceeds th_min */
+ prec->count = 1;
+ prec->old = 1;
+ } else if (drop_early((avg - prec->th_min_s) >> rp->rio_wshift,
+ prec->probd, prec->count)) {
+ /* unforced drop by red */
+ droptype = DTYPE_EARLY;
+ }
+ } else {
+ /* avg < th_min */
+ prec->old = 0;
+ }
+
+ /*
+ * if the queue length hits the hard limit, it's a forced drop.
+ */
+ if (droptype == DTYPE_NODROP && qlen(q) >= qlimit(q))
+ droptype = DTYPE_FORCED;
+
+ if (droptype != DTYPE_NODROP) {
+ /* always drop incoming packet (as opposed to randomdrop) */
+ for (i = dpindex; i < RIO_NDROPPREC; i++)
+ rp->rio_precstate[i].count = 0;
+#ifdef RIO_STATS
+ if (droptype == DTYPE_EARLY)
+ rp->q_stats[dpindex].drop_unforced++;
+ else
+ rp->q_stats[dpindex].drop_forced++;
+ PKTCNTR_ADD(&rp->q_stats[dpindex].drop_cnt, m_pktlen(m));
+#endif
+ m_freem(m);
+ return (-1);
+ }
+
+ for (i = dpindex; i < RIO_NDROPPREC; i++)
+ rp->rio_precstate[i].qlen++;
+
+ /* save drop precedence index in mbuf hdr */
+ RIOM_SET_PRECINDEX(m, dpindex);
+
+ if (rp->rio_flags & RIOF_CLEARDSCP)
+ dsfield &= ~DSCP_MASK;
+
+ if (dsfield != odsfield)
+ write_dsfield(m, pktattr, dsfield);
+
+ _addq(q, m);
+
+#ifdef RIO_STATS
+ PKTCNTR_ADD(&rp->q_stats[dpindex].xmit_cnt, m_pktlen(m));
+#endif
+ return (0);
+}
+
+struct mbuf *
+rio_getq(rio_t *rp, class_queue_t *q)
+{
+ struct mbuf *m;
+ int dpindex, i;
+
+ if ((m = _getq(q)) == NULL)
+ return NULL;
+
+ dpindex = RIOM_GET_PRECINDEX(m);
+ for (i = dpindex; i < RIO_NDROPPREC; i++) {
+ if (--rp->rio_precstate[i].qlen == 0) {
+ if (rp->rio_precstate[i].idle == 0) {
+ rp->rio_precstate[i].idle = 1;
+ microtime(&rp->rio_precstate[i].last);
+ }
+ }
+ }
+ return (m);
+}
+
+#ifdef ALTQ3_COMPAT
+int
+rioopen(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ /* everything will be done when the queueing scheme is attached. */
+ return 0;
+}
+
+int
+rioclose(dev, flag, fmt, p)
+ dev_t dev;
+ int flag, fmt;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ rio_queue_t *rqp;
+ int err, error = 0;
+
+ while ((rqp = rio_list) != NULL) {
+ /* destroy all */
+ err = rio_detach(rqp);
+ if (err != 0 && error == 0)
+ error = err;
+ }
+
+ return error;
+}
+
+int
+rioioctl(dev, cmd, addr, flag, p)
+ dev_t dev;
+ ioctlcmd_t cmd;
+ caddr_t addr;
+ int flag;
+#if (__FreeBSD_version > 500000)
+ struct thread *p;
+#else
+ struct proc *p;
+#endif
+{
+ rio_queue_t *rqp;
+ struct rio_interface *ifacep;
+ struct ifnet *ifp;
+ int error = 0;
+
+ /* check super-user privilege */
+ switch (cmd) {
+ case RIO_GETSTATS:
+ break;
+ default:
+#if (__FreeBSD_version > 700000)
+ if ((error = priv_check(p, PRIV_ALTQ_MANAGE)) != 0)
+ return (error);
+#elsif (__FreeBSD_version > 400000)
+ if ((error = suser(p)) != 0)
+ return (error);
+#else
+ if ((error = suser(p->p_ucred, &p->p_acflag)) != 0)
+ return (error);
+#endif
+ break;
+ }
+
+ switch (cmd) {
+
+ case RIO_ENABLE:
+ ifacep = (struct rio_interface *)addr;
+ if ((rqp = altq_lookup(ifacep->rio_ifname, ALTQT_RIO)) == NULL) {
+ error = EBADF;
+ break;
+ }
+ error = altq_enable(rqp->rq_ifq);
+ break;
+
+ case RIO_DISABLE:
+ ifacep = (struct rio_interface *)addr;
+ if ((rqp = altq_lookup(ifacep->rio_ifname, ALTQT_RIO)) == NULL) {
+ error = EBADF;
+ break;
+ }
+ error = altq_disable(rqp->rq_ifq);
+ break;
+
+ case RIO_IF_ATTACH:
+ ifp = ifunit(((struct rio_interface *)addr)->rio_ifname);
+ if (ifp == NULL) {
+ error = ENXIO;
+ break;
+ }
+
+ /* allocate and initialize rio_queue_t */
+ MALLOC(rqp, rio_queue_t *, sizeof(rio_queue_t), M_DEVBUF, M_WAITOK);
+ if (rqp == NULL) {
+ error = ENOMEM;
+ break;
+ }
+ bzero(rqp, sizeof(rio_queue_t));
+
+ MALLOC(rqp->rq_q, class_queue_t *, sizeof(class_queue_t),
+ M_DEVBUF, M_WAITOK);
+ if (rqp->rq_q == NULL) {
+ FREE(rqp, M_DEVBUF);
+ error = ENOMEM;
+ break;
+ }
+ bzero(rqp->rq_q, sizeof(class_queue_t));
+
+ rqp->rq_rio = rio_alloc(0, NULL, 0, 0);
+ if (rqp->rq_rio == NULL) {
+ FREE(rqp->rq_q, M_DEVBUF);
+ FREE(rqp, M_DEVBUF);
+ error = ENOMEM;
+ break;
+ }
+
+ rqp->rq_ifq = &ifp->if_snd;
+ qtail(rqp->rq_q) = NULL;
+ qlen(rqp->rq_q) = 0;
+ qlimit(rqp->rq_q) = RIO_LIMIT;
+ qtype(rqp->rq_q) = Q_RIO;
+
+ /*
+ * set RIO to this ifnet structure.
+ */
+ error = altq_attach(rqp->rq_ifq, ALTQT_RIO, rqp,
+ rio_enqueue, rio_dequeue, rio_request,
+ NULL, NULL);
+ if (error) {
+ rio_destroy(rqp->rq_rio);
+ FREE(rqp->rq_q, M_DEVBUF);
+ FREE(rqp, M_DEVBUF);
+ break;
+ }
+
+ /* add this state to the rio list */
+ rqp->rq_next = rio_list;
+ rio_list = rqp;
+ break;
+
+ case RIO_IF_DETACH:
+ ifacep = (struct rio_interface *)addr;
+ if ((rqp = altq_lookup(ifacep->rio_ifname, ALTQT_RIO)) == NULL) {
+ error = EBADF;
+ break;
+ }
+ error = rio_detach(rqp);
+ break;
+
+ case RIO_GETSTATS:
+ do {
+ struct rio_stats *q_stats;
+ rio_t *rp;
+ int i;
+
+ q_stats = (struct rio_stats *)addr;
+ if ((rqp = altq_lookup(q_stats->iface.rio_ifname,
+ ALTQT_RIO)) == NULL) {
+ error = EBADF;
+ break;
+ }
+
+ rp = rqp->rq_rio;
+
+ q_stats->q_limit = qlimit(rqp->rq_q);
+ q_stats->weight = rp->rio_weight;
+ q_stats->flags = rp->rio_flags;
+
+ for (i = 0; i < RIO_NDROPPREC; i++) {
+ q_stats->q_len[i] = rp->rio_precstate[i].qlen;
+ bcopy(&rp->q_stats[i], &q_stats->q_stats[i],
+ sizeof(struct redstats));
+ q_stats->q_stats[i].q_avg =
+ rp->rio_precstate[i].avg >> rp->rio_wshift;
+
+ q_stats->q_params[i].inv_pmax
+ = rp->rio_precstate[i].inv_pmax;
+ q_stats->q_params[i].th_min
+ = rp->rio_precstate[i].th_min;
+ q_stats->q_params[i].th_max
+ = rp->rio_precstate[i].th_max;
+ }
+ } while (/*CONSTCOND*/ 0);
+ break;
+
+ case RIO_CONFIG:
+ do {
+ struct rio_conf *fc;
+ rio_t *new;
+ int s, limit, i;
+
+ fc = (struct rio_conf *)addr;
+ if ((rqp = altq_lookup(fc->iface.rio_ifname,
+ ALTQT_RIO)) == NULL) {
+ error = EBADF;
+ break;
+ }
+
+ new = rio_alloc(fc->rio_weight, &fc->q_params[0],
+ fc->rio_flags, fc->rio_pkttime);
+ if (new == NULL) {
+ error = ENOMEM;
+ break;
+ }
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ _flushq(rqp->rq_q);
+ limit = fc->rio_limit;
+ if (limit < fc->q_params[RIO_NDROPPREC-1].th_max)
+ limit = fc->q_params[RIO_NDROPPREC-1].th_max;
+ qlimit(rqp->rq_q) = limit;
+
+ rio_destroy(rqp->rq_rio);
+ rqp->rq_rio = new;
+
+ splx(s);
+
+ /* write back new values */
+ fc->rio_limit = limit;
+ for (i = 0; i < RIO_NDROPPREC; i++) {
+ fc->q_params[i].inv_pmax =
+ rqp->rq_rio->rio_precstate[i].inv_pmax;
+ fc->q_params[i].th_min =
+ rqp->rq_rio->rio_precstate[i].th_min;
+ fc->q_params[i].th_max =
+ rqp->rq_rio->rio_precstate[i].th_max;
+ }
+ } while (/*CONSTCOND*/ 0);
+ break;
+
+ case RIO_SETDEFAULTS:
+ do {
+ struct redparams *rp;
+ int i;
+
+ rp = (struct redparams *)addr;
+ for (i = 0; i < RIO_NDROPPREC; i++)
+ default_rio_params[i] = rp[i];
+ } while (/*CONSTCOND*/ 0);
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+
+ return error;
+}
+
+static int
+rio_detach(rqp)
+ rio_queue_t *rqp;
+{
+ rio_queue_t *tmp;
+ int error = 0;
+
+ if (ALTQ_IS_ENABLED(rqp->rq_ifq))
+ altq_disable(rqp->rq_ifq);
+
+ if ((error = altq_detach(rqp->rq_ifq)))
+ return (error);
+
+ if (rio_list == rqp)
+ rio_list = rqp->rq_next;
+ else {
+ for (tmp = rio_list; tmp != NULL; tmp = tmp->rq_next)
+ if (tmp->rq_next == rqp) {
+ tmp->rq_next = rqp->rq_next;
+ break;
+ }
+ if (tmp == NULL)
+ printf("rio_detach: no state found in rio_list!\n");
+ }
+
+ rio_destroy(rqp->rq_rio);
+ FREE(rqp->rq_q, M_DEVBUF);
+ FREE(rqp, M_DEVBUF);
+ return (error);
+}
+
+/*
+ * rio support routines
+ */
+static int
+rio_request(ifq, req, arg)
+ struct ifaltq *ifq;
+ int req;
+ void *arg;
+{
+ rio_queue_t *rqp = (rio_queue_t *)ifq->altq_disc;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ switch (req) {
+ case ALTRQ_PURGE:
+ _flushq(rqp->rq_q);
+ if (ALTQ_IS_ENABLED(ifq))
+ ifq->ifq_len = 0;
+ break;
+ }
+ return (0);
+}
+
+/*
+ * enqueue routine:
+ *
+ * returns: 0 when successfully queued.
+ * ENOBUFS when drop occurs.
+ */
+static int
+rio_enqueue(ifq, m, pktattr)
+ struct ifaltq *ifq;
+ struct mbuf *m;
+ struct altq_pktattr *pktattr;
+{
+ rio_queue_t *rqp = (rio_queue_t *)ifq->altq_disc;
+ int error = 0;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ if (rio_addq(rqp->rq_rio, rqp->rq_q, m, pktattr) == 0)
+ ifq->ifq_len++;
+ else
+ error = ENOBUFS;
+ return error;
+}
+
+/*
+ * dequeue routine:
+ * must be called in splimp.
+ *
+ * returns: mbuf dequeued.
+ * NULL when no packet is available in the queue.
+ */
+
+static struct mbuf *
+rio_dequeue(ifq, op)
+ struct ifaltq *ifq;
+ int op;
+{
+ rio_queue_t *rqp = (rio_queue_t *)ifq->altq_disc;
+ struct mbuf *m = NULL;
+
+ IFQ_LOCK_ASSERT(ifq);
+
+ if (op == ALTDQ_POLL)
+ return qhead(rqp->rq_q);
+
+ m = rio_getq(rqp->rq_rio, rqp->rq_q);
+ if (m != NULL)
+ ifq->ifq_len--;
+ return m;
+}
+
+#ifdef KLD_MODULE
+
+static struct altqsw rio_sw =
+ {"rio", rioopen, rioclose, rioioctl};
+
+ALTQ_MODULE(altq_rio, ALTQT_RIO, &rio_sw);
+MODULE_VERSION(altq_rio, 1);
+MODULE_DEPEND(altq_rio, altq_red, 1, 1, 1);
+
+#endif /* KLD_MODULE */
+#endif /* ALTQ3_COMPAT */
+
+#endif /* ALTQ_RIO */
diff --git a/sys/contrib/altq/altq/altq_rio.h b/sys/contrib/altq/altq/altq_rio.h
new file mode 100644
index 0000000..83210f2
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_rio.h
@@ -0,0 +1,144 @@
+/* $KAME: altq_rio.h,v 1.9 2003/07/10 12:07:49 kjc Exp $ */
+
+/*
+ * Copyright (C) 1998-2003
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ALTQ_ALTQ_RIO_H_
+#define _ALTQ_ALTQ_RIO_H_
+
+#include <altq/altq_classq.h>
+
+/*
+ * RIO: RED with IN/OUT bit
+ * (extended to support more than 2 drop precedence values)
+ */
+#define RIO_NDROPPREC 3 /* number of drop precedence values */
+
+#ifdef ALTQ3_COMPAT
+struct rio_interface {
+ char rio_ifname[IFNAMSIZ];
+};
+
+struct rio_stats {
+ struct rio_interface iface;
+ int q_len[RIO_NDROPPREC];
+ struct redstats q_stats[RIO_NDROPPREC];
+
+ /* static red parameters */
+ int q_limit;
+ int weight;
+ int flags;
+ struct redparams q_params[RIO_NDROPPREC];
+};
+
+struct rio_conf {
+ struct rio_interface iface;
+ struct redparams q_params[RIO_NDROPPREC];
+ int rio_weight; /* weight for EWMA */
+ int rio_limit; /* max queue length */
+ int rio_pkttime; /* average packet time in usec */
+ int rio_flags; /* see below */
+};
+#endif /* ALTQ3_COMPAT */
+
+/* rio flags */
+#define RIOF_ECN4 0x01 /* use packet marking for IPv4 packets */
+#define RIOF_ECN6 0x02 /* use packet marking for IPv6 packets */
+#define RIOF_ECN (RIOF_ECN4 | RIOF_ECN6)
+#define RIOF_CLEARDSCP 0x200 /* clear diffserv codepoint */
+
+#ifdef ALTQ3_COMPAT
+/*
+ * IOCTLs for RIO
+ */
+#define RIO_IF_ATTACH _IOW('Q', 1, struct rio_interface)
+#define RIO_IF_DETACH _IOW('Q', 2, struct rio_interface)
+#define RIO_ENABLE _IOW('Q', 3, struct rio_interface)
+#define RIO_DISABLE _IOW('Q', 4, struct rio_interface)
+#define RIO_CONFIG _IOWR('Q', 6, struct rio_conf)
+#define RIO_GETSTATS _IOWR('Q', 12, struct rio_stats)
+#define RIO_SETDEFAULTS _IOW('Q', 30, struct redparams[RIO_NDROPPREC])
+#endif /* ALTQ3_COMPAT */
+
+#ifdef _KERNEL
+
+typedef struct rio {
+ /* per drop precedence structure */
+ struct dropprec_state {
+ /* red parameters */
+ int inv_pmax; /* inverse of max drop probability */
+ int th_min; /* red min threshold */
+ int th_max; /* red max threshold */
+
+ /* variables for internal use */
+ int th_min_s; /* th_min scaled by avgshift */
+ int th_max_s; /* th_max scaled by avgshift */
+ int probd; /* drop probability denominator */
+
+ int qlen; /* queue length */
+ int avg; /* (scaled) queue length average */
+ int count; /* packet count since the last dropped/
+ marked packet */
+ int idle; /* queue was empty */
+ int old; /* avg is above th_min */
+ struct timeval last; /* timestamp when queue becomes idle */
+ } rio_precstate[RIO_NDROPPREC];
+
+ int rio_wshift; /* log(red_weight) */
+ int rio_weight; /* weight for EWMA */
+ struct wtab *rio_wtab; /* weight table */
+
+ int rio_pkttime; /* average packet time in micro sec
+ used for idle calibration */
+ int rio_flags; /* rio flags */
+
+ u_int8_t rio_codepoint; /* codepoint value to tag packets */
+ u_int8_t rio_codepointmask; /* codepoint mask bits */
+
+ struct redstats q_stats[RIO_NDROPPREC]; /* statistics */
+} rio_t;
+
+#ifdef ALTQ3_COMPAT
+typedef struct rio_queue {
+ struct rio_queue *rq_next; /* next red_state in the list */
+ struct ifaltq *rq_ifq; /* backpointer to ifaltq */
+
+ class_queue_t *rq_q;
+
+ rio_t *rq_rio;
+} rio_queue_t;
+#endif /* ALTQ3_COMPAT */
+
+extern rio_t *rio_alloc(int, struct redparams *, int, int);
+extern void rio_destroy(rio_t *);
+extern void rio_getstats(rio_t *, struct redstats *);
+extern int rio_addq(rio_t *, class_queue_t *, struct mbuf *,
+ struct altq_pktattr *);
+extern struct mbuf *rio_getq(rio_t *, class_queue_t *);
+
+#endif /* _KERNEL */
+
+#endif /* _ALTQ_ALTQ_RIO_H_ */
diff --git a/sys/contrib/altq/altq/altq_rmclass.c b/sys/contrib/altq/altq/altq_rmclass.c
new file mode 100644
index 0000000..63194ee
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_rmclass.c
@@ -0,0 +1,1841 @@
+/* $FreeBSD$ */
+/* $KAME: altq_rmclass.c,v 1.18 2003/11/06 06:32:53 kjc Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Network Research
+ * Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * LBL code modified by speer@eng.sun.com, May 1977.
+ * For questions and/or comments, please send mail to cbq@ee.lbl.gov
+ */
+
+#ident "@(#)rm_class.c 1.48 97/12/05 SMI"
+
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+#include "opt_altq.h"
+#if (__FreeBSD__ != 2)
+#include "opt_inet.h"
+#ifdef __FreeBSD__
+#include "opt_inet6.h"
+#endif
+#endif
+#endif /* __FreeBSD__ || __NetBSD__ */
+#ifdef ALTQ_CBQ /* cbq is enabled by ALTQ_CBQ option in opt_altq.h */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/socket.h>
+#include <sys/systm.h>
+#include <sys/errno.h>
+#include <sys/time.h>
+#ifdef ALTQ3_COMPAT
+#include <sys/kernel.h>
+#endif
+
+#include <net/if.h>
+#ifdef ALTQ3_COMPAT
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#endif
+
+#include <altq/altq.h>
+#include <altq/altq_rmclass.h>
+#include <altq/altq_rmclass_debug.h>
+#include <altq/altq_red.h>
+#include <altq/altq_rio.h>
+
+/*
+ * Local Macros
+ */
+
+#define reset_cutoff(ifd) { ifd->cutoff_ = RM_MAXDEPTH; }
+
+/*
+ * Local routines.
+ */
+
+static int rmc_satisfied(struct rm_class *, struct timeval *);
+static void rmc_wrr_set_weights(struct rm_ifdat *);
+static void rmc_depth_compute(struct rm_class *);
+static void rmc_depth_recompute(rm_class_t *);
+
+static mbuf_t *_rmc_wrr_dequeue_next(struct rm_ifdat *, int);
+static mbuf_t *_rmc_prr_dequeue_next(struct rm_ifdat *, int);
+
+static int _rmc_addq(rm_class_t *, mbuf_t *);
+static void _rmc_dropq(rm_class_t *);
+static mbuf_t *_rmc_getq(rm_class_t *);
+static mbuf_t *_rmc_pollq(rm_class_t *);
+
+static int rmc_under_limit(struct rm_class *, struct timeval *);
+static void rmc_tl_satisfied(struct rm_ifdat *, struct timeval *);
+static void rmc_drop_action(struct rm_class *);
+static void rmc_restart(struct rm_class *);
+static void rmc_root_overlimit(struct rm_class *, struct rm_class *);
+
+#define BORROW_OFFTIME
+/*
+ * BORROW_OFFTIME (experimental):
+ * borrow the offtime of the class borrowing from.
+ * the reason is that when its own offtime is set, the class is unable
+ * to borrow much, especially when cutoff is taking effect.
+ * but when the borrowed class is overloaded (advidle is close to minidle),
+ * use the borrowing class's offtime to avoid overload.
+ */
+#define ADJUST_CUTOFF
+/*
+ * ADJUST_CUTOFF (experimental):
+ * if no underlimit class is found due to cutoff, increase cutoff and
+ * retry the scheduling loop.
+ * also, don't invoke delay_actions while cutoff is taking effect,
+ * since a sleeping class won't have a chance to be scheduled in the
+ * next loop.
+ *
+ * now heuristics for setting the top-level variable (cutoff_) becomes:
+ * 1. if a packet arrives for a not-overlimit class, set cutoff
+ * to the depth of the class.
+ * 2. if cutoff is i, and a packet arrives for an overlimit class
+ * with an underlimit ancestor at a lower level than i (say j),
+ * then set cutoff to j.
+ * 3. at scheduling a packet, if there is no underlimit class
+ * due to the current cutoff level, increase cutoff by 1 and
+ * then try to schedule again.
+ */
+
+/*
+ * rm_class_t *
+ * rmc_newclass(...) - Create a new resource management class at priority
+ * 'pri' on the interface given by 'ifd'.
+ *
+ * nsecPerByte is the data rate of the interface in nanoseconds/byte.
+ * E.g., 800 for a 10Mb/s ethernet. If the class gets less
+ * than 100% of the bandwidth, this number should be the
+ * 'effective' rate for the class. Let f be the
+ * bandwidth fraction allocated to this class, and let
+ * nsPerByte be the data rate of the output link in
+ * nanoseconds/byte. Then nsecPerByte is set to
+ * nsPerByte / f. E.g., 1600 (= 800 / .5)
+ * for a class that gets 50% of an ethernet's bandwidth.
+ *
+ * action the routine to call when the class is over limit.
+ *
+ * maxq max allowable queue size for class (in packets).
+ *
+ * parent parent class pointer.
+ *
+ * borrow class to borrow from (should be either 'parent' or null).
+ *
+ * maxidle max value allowed for class 'idle' time estimate (this
+ * parameter determines how large an initial burst of packets
+ * can be before overlimit action is invoked.
+ *
+ * offtime how long 'delay' action will delay when class goes over
+ * limit (this parameter determines the steady-state burst
+ * size when a class is running over its limit).
+ *
+ * Maxidle and offtime have to be computed from the following: If the
+ * average packet size is s, the bandwidth fraction allocated to this
+ * class is f, we want to allow b packet bursts, and the gain of the
+ * averaging filter is g (= 1 - 2^(-RM_FILTER_GAIN)), then:
+ *
+ * ptime = s * nsPerByte * (1 - f) / f
+ * maxidle = ptime * (1 - g^b) / g^b
+ * minidle = -ptime * (1 / (f - 1))
+ * offtime = ptime * (1 + 1/(1 - g) * (1 - g^(b - 1)) / g^(b - 1)
+ *
+ * Operationally, it's convenient to specify maxidle & offtime in units
+ * independent of the link bandwidth so the maxidle & offtime passed to
+ * this routine are the above values multiplied by 8*f/(1000*nsPerByte).
+ * (The constant factor is a scale factor needed to make the parameters
+ * integers. This scaling also means that the 'unscaled' values of
+ * maxidle*nsecPerByte/8 and offtime*nsecPerByte/8 will be in microseconds,
+ * not nanoseconds.) Also note that the 'idle' filter computation keeps
+ * an estimate scaled upward by 2^RM_FILTER_GAIN so the passed value of
+ * maxidle also must be scaled upward by this value. Thus, the passed
+ * values for maxidle and offtime can be computed as follows:
+ *
+ * maxidle = maxidle * 2^RM_FILTER_GAIN * 8 / (1000 * nsecPerByte)
+ * offtime = offtime * 8 / (1000 * nsecPerByte)
+ *
+ * When USE_HRTIME is employed, then maxidle and offtime become:
+ * maxidle = maxilde * (8.0 / nsecPerByte);
+ * offtime = offtime * (8.0 / nsecPerByte);
+ */
+struct rm_class *
+rmc_newclass(int pri, struct rm_ifdat *ifd, u_int nsecPerByte,
+ void (*action)(rm_class_t *, rm_class_t *), int maxq,
+ struct rm_class *parent, struct rm_class *borrow, u_int maxidle,
+ int minidle, u_int offtime, int pktsize, int flags)
+{
+ struct rm_class *cl;
+ struct rm_class *peer;
+ int s;
+
+ if (pri >= RM_MAXPRIO)
+ return (NULL);
+#ifndef ALTQ_RED
+ if (flags & RMCF_RED) {
+#ifdef ALTQ_DEBUG
+ printf("rmc_newclass: RED not configured for CBQ!\n");
+#endif
+ return (NULL);
+ }
+#endif
+#ifndef ALTQ_RIO
+ if (flags & RMCF_RIO) {
+#ifdef ALTQ_DEBUG
+ printf("rmc_newclass: RIO not configured for CBQ!\n");
+#endif
+ return (NULL);
+ }
+#endif
+
+ MALLOC(cl, struct rm_class *, sizeof(struct rm_class),
+ M_DEVBUF, M_WAITOK);
+ if (cl == NULL)
+ return (NULL);
+ bzero(cl, sizeof(struct rm_class));
+ CALLOUT_INIT(&cl->callout_);
+ MALLOC(cl->q_, class_queue_t *, sizeof(class_queue_t),
+ M_DEVBUF, M_WAITOK);
+ if (cl->q_ == NULL) {
+ FREE(cl, M_DEVBUF);
+ return (NULL);
+ }
+ bzero(cl->q_, sizeof(class_queue_t));
+
+ /*
+ * Class initialization.
+ */
+ cl->children_ = NULL;
+ cl->parent_ = parent;
+ cl->borrow_ = borrow;
+ cl->leaf_ = 1;
+ cl->ifdat_ = ifd;
+ cl->pri_ = pri;
+ cl->allotment_ = RM_NS_PER_SEC / nsecPerByte; /* Bytes per sec */
+ cl->depth_ = 0;
+ cl->qthresh_ = 0;
+ cl->ns_per_byte_ = nsecPerByte;
+
+ qlimit(cl->q_) = maxq;
+ qtype(cl->q_) = Q_DROPHEAD;
+ qlen(cl->q_) = 0;
+ cl->flags_ = flags;
+
+#if 1 /* minidle is also scaled in ALTQ */
+ cl->minidle_ = (minidle * (int)nsecPerByte) / 8;
+ if (cl->minidle_ > 0)
+ cl->minidle_ = 0;
+#else
+ cl->minidle_ = minidle;
+#endif
+ cl->maxidle_ = (maxidle * nsecPerByte) / 8;
+ if (cl->maxidle_ == 0)
+ cl->maxidle_ = 1;
+#if 1 /* offtime is also scaled in ALTQ */
+ cl->avgidle_ = cl->maxidle_;
+ cl->offtime_ = ((offtime * nsecPerByte) / 8) >> RM_FILTER_GAIN;
+ if (cl->offtime_ == 0)
+ cl->offtime_ = 1;
+#else
+ cl->avgidle_ = 0;
+ cl->offtime_ = (offtime * nsecPerByte) / 8;
+#endif
+ cl->overlimit = action;
+
+#ifdef ALTQ_RED
+ if (flags & (RMCF_RED|RMCF_RIO)) {
+ int red_flags, red_pkttime;
+
+ red_flags = 0;
+ if (flags & RMCF_ECN)
+ red_flags |= REDF_ECN;
+ if (flags & RMCF_FLOWVALVE)
+ red_flags |= REDF_FLOWVALVE;
+#ifdef ALTQ_RIO
+ if (flags & RMCF_CLEARDSCP)
+ red_flags |= RIOF_CLEARDSCP;
+#endif
+ red_pkttime = nsecPerByte * pktsize / 1000;
+
+ if (flags & RMCF_RED) {
+ cl->red_ = red_alloc(0, 0,
+ qlimit(cl->q_) * 10/100,
+ qlimit(cl->q_) * 30/100,
+ red_flags, red_pkttime);
+ if (cl->red_ != NULL)
+ qtype(cl->q_) = Q_RED;
+ }
+#ifdef ALTQ_RIO
+ else {
+ cl->red_ = (red_t *)rio_alloc(0, NULL,
+ red_flags, red_pkttime);
+ if (cl->red_ != NULL)
+ qtype(cl->q_) = Q_RIO;
+ }
+#endif
+ }
+#endif /* ALTQ_RED */
+
+ /*
+ * put the class into the class tree
+ */
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_LOCK(ifd->ifq_);
+ if ((peer = ifd->active_[pri]) != NULL) {
+ /* find the last class at this pri */
+ cl->peer_ = peer;
+ while (peer->peer_ != ifd->active_[pri])
+ peer = peer->peer_;
+ peer->peer_ = cl;
+ } else {
+ ifd->active_[pri] = cl;
+ cl->peer_ = cl;
+ }
+
+ if (cl->parent_) {
+ cl->next_ = parent->children_;
+ parent->children_ = cl;
+ parent->leaf_ = 0;
+ }
+
+ /*
+ * Compute the depth of this class and its ancestors in the class
+ * hierarchy.
+ */
+ rmc_depth_compute(cl);
+
+ /*
+ * If CBQ's WRR is enabled, then initialize the class WRR state.
+ */
+ if (ifd->wrr_) {
+ ifd->num_[pri]++;
+ ifd->alloc_[pri] += cl->allotment_;
+ rmc_wrr_set_weights(ifd);
+ }
+ IFQ_UNLOCK(ifd->ifq_);
+ splx(s);
+ return (cl);
+}
+
+int
+rmc_modclass(struct rm_class *cl, u_int nsecPerByte, int maxq, u_int maxidle,
+ int minidle, u_int offtime, int pktsize)
+{
+ struct rm_ifdat *ifd;
+ u_int old_allotment;
+ int s;
+
+ ifd = cl->ifdat_;
+ old_allotment = cl->allotment_;
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_LOCK(ifd->ifq_);
+ cl->allotment_ = RM_NS_PER_SEC / nsecPerByte; /* Bytes per sec */
+ cl->qthresh_ = 0;
+ cl->ns_per_byte_ = nsecPerByte;
+
+ qlimit(cl->q_) = maxq;
+
+#if 1 /* minidle is also scaled in ALTQ */
+ cl->minidle_ = (minidle * nsecPerByte) / 8;
+ if (cl->minidle_ > 0)
+ cl->minidle_ = 0;
+#else
+ cl->minidle_ = minidle;
+#endif
+ cl->maxidle_ = (maxidle * nsecPerByte) / 8;
+ if (cl->maxidle_ == 0)
+ cl->maxidle_ = 1;
+#if 1 /* offtime is also scaled in ALTQ */
+ cl->avgidle_ = cl->maxidle_;
+ cl->offtime_ = ((offtime * nsecPerByte) / 8) >> RM_FILTER_GAIN;
+ if (cl->offtime_ == 0)
+ cl->offtime_ = 1;
+#else
+ cl->avgidle_ = 0;
+ cl->offtime_ = (offtime * nsecPerByte) / 8;
+#endif
+
+ /*
+ * If CBQ's WRR is enabled, then initialize the class WRR state.
+ */
+ if (ifd->wrr_) {
+ ifd->alloc_[cl->pri_] += cl->allotment_ - old_allotment;
+ rmc_wrr_set_weights(ifd);
+ }
+ IFQ_UNLOCK(ifd->ifq_);
+ splx(s);
+ return (0);
+}
+
+/*
+ * static void
+ * rmc_wrr_set_weights(struct rm_ifdat *ifdat) - This function computes
+ * the appropriate run robin weights for the CBQ weighted round robin
+ * algorithm.
+ *
+ * Returns: NONE
+ */
+
+static void
+rmc_wrr_set_weights(struct rm_ifdat *ifd)
+{
+ int i;
+ struct rm_class *cl, *clh;
+
+ for (i = 0; i < RM_MAXPRIO; i++) {
+ /*
+ * This is inverted from that of the simulator to
+ * maintain precision.
+ */
+ if (ifd->num_[i] == 0)
+ ifd->M_[i] = 0;
+ else
+ ifd->M_[i] = ifd->alloc_[i] /
+ (ifd->num_[i] * ifd->maxpkt_);
+ /*
+ * Compute the weighted allotment for each class.
+ * This takes the expensive div instruction out
+ * of the main loop for the wrr scheduling path.
+ * These only get recomputed when a class comes or
+ * goes.
+ */
+ if (ifd->active_[i] != NULL) {
+ clh = cl = ifd->active_[i];
+ do {
+ /* safe-guard for slow link or alloc_ == 0 */
+ if (ifd->M_[i] == 0)
+ cl->w_allotment_ = 0;
+ else
+ cl->w_allotment_ = cl->allotment_ /
+ ifd->M_[i];
+ cl = cl->peer_;
+ } while ((cl != NULL) && (cl != clh));
+ }
+ }
+}
+
+int
+rmc_get_weight(struct rm_ifdat *ifd, int pri)
+{
+ if ((pri >= 0) && (pri < RM_MAXPRIO))
+ return (ifd->M_[pri]);
+ else
+ return (0);
+}
+
+/*
+ * static void
+ * rmc_depth_compute(struct rm_class *cl) - This function computes the
+ * appropriate depth of class 'cl' and its ancestors.
+ *
+ * Returns: NONE
+ */
+
+static void
+rmc_depth_compute(struct rm_class *cl)
+{
+ rm_class_t *t = cl, *p;
+
+ /*
+ * Recompute the depth for the branch of the tree.
+ */
+ while (t != NULL) {
+ p = t->parent_;
+ if (p && (t->depth_ >= p->depth_)) {
+ p->depth_ = t->depth_ + 1;
+ t = p;
+ } else
+ t = NULL;
+ }
+}
+
+/*
+ * static void
+ * rmc_depth_recompute(struct rm_class *cl) - This function re-computes
+ * the depth of the tree after a class has been deleted.
+ *
+ * Returns: NONE
+ */
+
+static void
+rmc_depth_recompute(rm_class_t *cl)
+{
+#if 1 /* ALTQ */
+ rm_class_t *p, *t;
+
+ p = cl;
+ while (p != NULL) {
+ if ((t = p->children_) == NULL) {
+ p->depth_ = 0;
+ } else {
+ int cdepth = 0;
+
+ while (t != NULL) {
+ if (t->depth_ > cdepth)
+ cdepth = t->depth_;
+ t = t->next_;
+ }
+
+ if (p->depth_ == cdepth + 1)
+ /* no change to this parent */
+ return;
+
+ p->depth_ = cdepth + 1;
+ }
+
+ p = p->parent_;
+ }
+#else
+ rm_class_t *t;
+
+ if (cl->depth_ >= 1) {
+ if (cl->children_ == NULL) {
+ cl->depth_ = 0;
+ } else if ((t = cl->children_) != NULL) {
+ while (t != NULL) {
+ if (t->children_ != NULL)
+ rmc_depth_recompute(t);
+ t = t->next_;
+ }
+ } else
+ rmc_depth_compute(cl);
+ }
+#endif
+}
+
+/*
+ * void
+ * rmc_delete_class(struct rm_ifdat *ifdat, struct rm_class *cl) - This
+ * function deletes a class from the link-sharing structure and frees
+ * all resources associated with the class.
+ *
+ * Returns: NONE
+ */
+
+void
+rmc_delete_class(struct rm_ifdat *ifd, struct rm_class *cl)
+{
+ struct rm_class *p, *head, *previous;
+ int s;
+
+ ASSERT(cl->children_ == NULL);
+
+ if (cl->sleeping_)
+ CALLOUT_STOP(&cl->callout_);
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_LOCK(ifd->ifq_);
+ /*
+ * Free packets in the packet queue.
+ * XXX - this may not be a desired behavior. Packets should be
+ * re-queued.
+ */
+ rmc_dropall(cl);
+
+ /*
+ * If the class has a parent, then remove the class from the
+ * class from the parent's children chain.
+ */
+ if (cl->parent_ != NULL) {
+ head = cl->parent_->children_;
+ p = previous = head;
+ if (head->next_ == NULL) {
+ ASSERT(head == cl);
+ cl->parent_->children_ = NULL;
+ cl->parent_->leaf_ = 1;
+ } else while (p != NULL) {
+ if (p == cl) {
+ if (cl == head)
+ cl->parent_->children_ = cl->next_;
+ else
+ previous->next_ = cl->next_;
+ cl->next_ = NULL;
+ p = NULL;
+ } else {
+ previous = p;
+ p = p->next_;
+ }
+ }
+ }
+
+ /*
+ * Delete class from class priority peer list.
+ */
+ if ((p = ifd->active_[cl->pri_]) != NULL) {
+ /*
+ * If there is more than one member of this priority
+ * level, then look for class(cl) in the priority level.
+ */
+ if (p != p->peer_) {
+ while (p->peer_ != cl)
+ p = p->peer_;
+ p->peer_ = cl->peer_;
+
+ if (ifd->active_[cl->pri_] == cl)
+ ifd->active_[cl->pri_] = cl->peer_;
+ } else {
+ ASSERT(p == cl);
+ ifd->active_[cl->pri_] = NULL;
+ }
+ }
+
+ /*
+ * Recompute the WRR weights.
+ */
+ if (ifd->wrr_) {
+ ifd->alloc_[cl->pri_] -= cl->allotment_;
+ ifd->num_[cl->pri_]--;
+ rmc_wrr_set_weights(ifd);
+ }
+
+ /*
+ * Re-compute the depth of the tree.
+ */
+#if 1 /* ALTQ */
+ rmc_depth_recompute(cl->parent_);
+#else
+ rmc_depth_recompute(ifd->root_);
+#endif
+
+ IFQ_UNLOCK(ifd->ifq_);
+ splx(s);
+
+ /*
+ * Free the class structure.
+ */
+ if (cl->red_ != NULL) {
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->q_))
+ rio_destroy((rio_t *)cl->red_);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->q_))
+ red_destroy(cl->red_);
+#endif
+ }
+ FREE(cl->q_, M_DEVBUF);
+ FREE(cl, M_DEVBUF);
+}
+
+
+/*
+ * void
+ * rmc_init(...) - Initialize the resource management data structures
+ * associated with the output portion of interface 'ifp'. 'ifd' is
+ * where the structures will be built (for backwards compatibility, the
+ * structures aren't kept in the ifnet struct). 'nsecPerByte'
+ * gives the link speed (inverse of bandwidth) in nanoseconds/byte.
+ * 'restart' is the driver-specific routine that the generic 'delay
+ * until under limit' action will call to restart output. `maxq'
+ * is the queue size of the 'link' & 'default' classes. 'maxqueued'
+ * is the maximum number of packets that the resource management
+ * code will allow to be queued 'downstream' (this is typically 1).
+ *
+ * Returns: NONE
+ */
+
+void
+rmc_init(struct ifaltq *ifq, struct rm_ifdat *ifd, u_int nsecPerByte,
+ void (*restart)(struct ifaltq *), int maxq, int maxqueued, u_int maxidle,
+ int minidle, u_int offtime, int flags)
+{
+ int i, mtu;
+
+ /*
+ * Initialize the CBQ tracing/debug facility.
+ */
+ CBQTRACEINIT();
+
+ bzero((char *)ifd, sizeof (*ifd));
+ mtu = ifq->altq_ifp->if_mtu;
+ ifd->ifq_ = ifq;
+ ifd->restart = restart;
+ ifd->maxqueued_ = maxqueued;
+ ifd->ns_per_byte_ = nsecPerByte;
+ ifd->maxpkt_ = mtu;
+ ifd->wrr_ = (flags & RMCF_WRR) ? 1 : 0;
+ ifd->efficient_ = (flags & RMCF_EFFICIENT) ? 1 : 0;
+#if 1
+ ifd->maxiftime_ = mtu * nsecPerByte / 1000 * 16;
+ if (mtu * nsecPerByte > 10 * 1000000)
+ ifd->maxiftime_ /= 4;
+#endif
+
+ reset_cutoff(ifd);
+ CBQTRACE(rmc_init, 'INIT', ifd->cutoff_);
+
+ /*
+ * Initialize the CBQ's WRR state.
+ */
+ for (i = 0; i < RM_MAXPRIO; i++) {
+ ifd->alloc_[i] = 0;
+ ifd->M_[i] = 0;
+ ifd->num_[i] = 0;
+ ifd->na_[i] = 0;
+ ifd->active_[i] = NULL;
+ }
+
+ /*
+ * Initialize current packet state.
+ */
+ ifd->qi_ = 0;
+ ifd->qo_ = 0;
+ for (i = 0; i < RM_MAXQUEUED; i++) {
+ ifd->class_[i] = NULL;
+ ifd->curlen_[i] = 0;
+ ifd->borrowed_[i] = NULL;
+ }
+
+ /*
+ * Create the root class of the link-sharing structure.
+ */
+ if ((ifd->root_ = rmc_newclass(0, ifd,
+ nsecPerByte,
+ rmc_root_overlimit, maxq, 0, 0,
+ maxidle, minidle, offtime,
+ 0, 0)) == NULL) {
+ printf("rmc_init: root class not allocated\n");
+ return ;
+ }
+ ifd->root_->depth_ = 0;
+}
+
+/*
+ * void
+ * rmc_queue_packet(struct rm_class *cl, mbuf_t *m) - Add packet given by
+ * mbuf 'm' to queue for resource class 'cl'. This routine is called
+ * by a driver's if_output routine. This routine must be called with
+ * output packet completion interrupts locked out (to avoid racing with
+ * rmc_dequeue_next).
+ *
+ * Returns: 0 on successful queueing
+ * -1 when packet drop occurs
+ */
+int
+rmc_queue_packet(struct rm_class *cl, mbuf_t *m)
+{
+ struct timeval now;
+ struct rm_ifdat *ifd = cl->ifdat_;
+ int cpri = cl->pri_;
+ int is_empty = qempty(cl->q_);
+
+ RM_GETTIME(now);
+ if (ifd->cutoff_ > 0) {
+ if (TV_LT(&cl->undertime_, &now)) {
+ if (ifd->cutoff_ > cl->depth_)
+ ifd->cutoff_ = cl->depth_;
+ CBQTRACE(rmc_queue_packet, 'ffoc', cl->depth_);
+ }
+#if 1 /* ALTQ */
+ else {
+ /*
+ * the class is overlimit. if the class has
+ * underlimit ancestors, set cutoff to the lowest
+ * depth among them.
+ */
+ struct rm_class *borrow = cl->borrow_;
+
+ while (borrow != NULL &&
+ borrow->depth_ < ifd->cutoff_) {
+ if (TV_LT(&borrow->undertime_, &now)) {
+ ifd->cutoff_ = borrow->depth_;
+ CBQTRACE(rmc_queue_packet, 'ffob', ifd->cutoff_);
+ break;
+ }
+ borrow = borrow->borrow_;
+ }
+ }
+#else /* !ALTQ */
+ else if ((ifd->cutoff_ > 1) && cl->borrow_) {
+ if (TV_LT(&cl->borrow_->undertime_, &now)) {
+ ifd->cutoff_ = cl->borrow_->depth_;
+ CBQTRACE(rmc_queue_packet, 'ffob',
+ cl->borrow_->depth_);
+ }
+ }
+#endif /* !ALTQ */
+ }
+
+ if (_rmc_addq(cl, m) < 0)
+ /* failed */
+ return (-1);
+
+ if (is_empty) {
+ CBQTRACE(rmc_queue_packet, 'ytpe', cl->stats_.handle);
+ ifd->na_[cpri]++;
+ }
+
+ if (qlen(cl->q_) > qlimit(cl->q_)) {
+ /* note: qlimit can be set to 0 or 1 */
+ rmc_drop_action(cl);
+ return (-1);
+ }
+ return (0);
+}
+
+/*
+ * void
+ * rmc_tl_satisfied(struct rm_ifdat *ifd, struct timeval *now) - Check all
+ * classes to see if there are satified.
+ */
+
+static void
+rmc_tl_satisfied(struct rm_ifdat *ifd, struct timeval *now)
+{
+ int i;
+ rm_class_t *p, *bp;
+
+ for (i = RM_MAXPRIO - 1; i >= 0; i--) {
+ if ((bp = ifd->active_[i]) != NULL) {
+ p = bp;
+ do {
+ if (!rmc_satisfied(p, now)) {
+ ifd->cutoff_ = p->depth_;
+ return;
+ }
+ p = p->peer_;
+ } while (p != bp);
+ }
+ }
+
+ reset_cutoff(ifd);
+}
+
+/*
+ * rmc_satisfied - Return 1 of the class is satisfied. O, otherwise.
+ */
+
+static int
+rmc_satisfied(struct rm_class *cl, struct timeval *now)
+{
+ rm_class_t *p;
+
+ if (cl == NULL)
+ return (1);
+ if (TV_LT(now, &cl->undertime_))
+ return (1);
+ if (cl->depth_ == 0) {
+ if (!cl->sleeping_ && (qlen(cl->q_) > cl->qthresh_))
+ return (0);
+ else
+ return (1);
+ }
+ if (cl->children_ != NULL) {
+ p = cl->children_;
+ while (p != NULL) {
+ if (!rmc_satisfied(p, now))
+ return (0);
+ p = p->next_;
+ }
+ }
+
+ return (1);
+}
+
+/*
+ * Return 1 if class 'cl' is under limit or can borrow from a parent,
+ * 0 if overlimit. As a side-effect, this routine will invoke the
+ * class overlimit action if the class if overlimit.
+ */
+
+static int
+rmc_under_limit(struct rm_class *cl, struct timeval *now)
+{
+ rm_class_t *p = cl;
+ rm_class_t *top;
+ struct rm_ifdat *ifd = cl->ifdat_;
+
+ ifd->borrowed_[ifd->qi_] = NULL;
+ /*
+ * If cl is the root class, then always return that it is
+ * underlimit. Otherwise, check to see if the class is underlimit.
+ */
+ if (cl->parent_ == NULL)
+ return (1);
+
+ if (cl->sleeping_) {
+ if (TV_LT(now, &cl->undertime_))
+ return (0);
+
+ CALLOUT_STOP(&cl->callout_);
+ cl->sleeping_ = 0;
+ cl->undertime_.tv_sec = 0;
+ return (1);
+ }
+
+ top = NULL;
+ while (cl->undertime_.tv_sec && TV_LT(now, &cl->undertime_)) {
+ if (((cl = cl->borrow_) == NULL) ||
+ (cl->depth_ > ifd->cutoff_)) {
+#ifdef ADJUST_CUTOFF
+ if (cl != NULL)
+ /* cutoff is taking effect, just
+ return false without calling
+ the delay action. */
+ return (0);
+#endif
+#ifdef BORROW_OFFTIME
+ /*
+ * check if the class can borrow offtime too.
+ * borrow offtime from the top of the borrow
+ * chain if the top class is not overloaded.
+ */
+ if (cl != NULL) {
+ /* cutoff is taking effect, use this class as top. */
+ top = cl;
+ CBQTRACE(rmc_under_limit, 'ffou', ifd->cutoff_);
+ }
+ if (top != NULL && top->avgidle_ == top->minidle_)
+ top = NULL;
+ p->overtime_ = *now;
+ (p->overlimit)(p, top);
+#else
+ p->overtime_ = *now;
+ (p->overlimit)(p, NULL);
+#endif
+ return (0);
+ }
+ top = cl;
+ }
+
+ if (cl != p)
+ ifd->borrowed_[ifd->qi_] = cl;
+ return (1);
+}
+
+/*
+ * _rmc_wrr_dequeue_next() - This is scheduler for WRR as opposed to
+ * Packet-by-packet round robin.
+ *
+ * The heart of the weighted round-robin scheduler, which decides which
+ * class next gets to send a packet. Highest priority first, then
+ * weighted round-robin within priorites.
+ *
+ * Each able-to-send class gets to send until its byte allocation is
+ * exhausted. Thus, the active pointer is only changed after a class has
+ * exhausted its allocation.
+ *
+ * If the scheduler finds no class that is underlimit or able to borrow,
+ * then the first class found that had a nonzero queue and is allowed to
+ * borrow gets to send.
+ */
+
+static mbuf_t *
+_rmc_wrr_dequeue_next(struct rm_ifdat *ifd, int op)
+{
+ struct rm_class *cl = NULL, *first = NULL;
+ u_int deficit;
+ int cpri;
+ mbuf_t *m;
+ struct timeval now;
+
+ RM_GETTIME(now);
+
+ /*
+ * if the driver polls the top of the queue and then removes
+ * the polled packet, we must return the same packet.
+ */
+ if (op == ALTDQ_REMOVE && ifd->pollcache_) {
+ cl = ifd->pollcache_;
+ cpri = cl->pri_;
+ if (ifd->efficient_) {
+ /* check if this class is overlimit */
+ if (cl->undertime_.tv_sec != 0 &&
+ rmc_under_limit(cl, &now) == 0)
+ first = cl;
+ }
+ ifd->pollcache_ = NULL;
+ goto _wrr_out;
+ }
+ else {
+ /* mode == ALTDQ_POLL || pollcache == NULL */
+ ifd->pollcache_ = NULL;
+ ifd->borrowed_[ifd->qi_] = NULL;
+ }
+#ifdef ADJUST_CUTOFF
+ _again:
+#endif
+ for (cpri = RM_MAXPRIO - 1; cpri >= 0; cpri--) {
+ if (ifd->na_[cpri] == 0)
+ continue;
+ deficit = 0;
+ /*
+ * Loop through twice for a priority level, if some class
+ * was unable to send a packet the first round because
+ * of the weighted round-robin mechanism.
+ * During the second loop at this level, deficit==2.
+ * (This second loop is not needed if for every class,
+ * "M[cl->pri_])" times "cl->allotment" is greater than
+ * the byte size for the largest packet in the class.)
+ */
+ _wrr_loop:
+ cl = ifd->active_[cpri];
+ ASSERT(cl != NULL);
+ do {
+ if ((deficit < 2) && (cl->bytes_alloc_ <= 0))
+ cl->bytes_alloc_ += cl->w_allotment_;
+ if (!qempty(cl->q_)) {
+ if ((cl->undertime_.tv_sec == 0) ||
+ rmc_under_limit(cl, &now)) {
+ if (cl->bytes_alloc_ > 0 || deficit > 1)
+ goto _wrr_out;
+
+ /* underlimit but no alloc */
+ deficit = 1;
+#if 1
+ ifd->borrowed_[ifd->qi_] = NULL;
+#endif
+ }
+ else if (first == NULL && cl->borrow_ != NULL)
+ first = cl; /* borrowing candidate */
+ }
+
+ cl->bytes_alloc_ = 0;
+ cl = cl->peer_;
+ } while (cl != ifd->active_[cpri]);
+
+ if (deficit == 1) {
+ /* first loop found an underlimit class with deficit */
+ /* Loop on same priority level, with new deficit. */
+ deficit = 2;
+ goto _wrr_loop;
+ }
+ }
+
+#ifdef ADJUST_CUTOFF
+ /*
+ * no underlimit class found. if cutoff is taking effect,
+ * increase cutoff and try again.
+ */
+ if (first != NULL && ifd->cutoff_ < ifd->root_->depth_) {
+ ifd->cutoff_++;
+ CBQTRACE(_rmc_wrr_dequeue_next, 'ojda', ifd->cutoff_);
+ goto _again;
+ }
+#endif /* ADJUST_CUTOFF */
+ /*
+ * If LINK_EFFICIENCY is turned on, then the first overlimit
+ * class we encounter will send a packet if all the classes
+ * of the link-sharing structure are overlimit.
+ */
+ reset_cutoff(ifd);
+ CBQTRACE(_rmc_wrr_dequeue_next, 'otsr', ifd->cutoff_);
+
+ if (!ifd->efficient_ || first == NULL)
+ return (NULL);
+
+ cl = first;
+ cpri = cl->pri_;
+#if 0 /* too time-consuming for nothing */
+ if (cl->sleeping_)
+ CALLOUT_STOP(&cl->callout_);
+ cl->sleeping_ = 0;
+ cl->undertime_.tv_sec = 0;
+#endif
+ ifd->borrowed_[ifd->qi_] = cl->borrow_;
+ ifd->cutoff_ = cl->borrow_->depth_;
+
+ /*
+ * Deque the packet and do the book keeping...
+ */
+ _wrr_out:
+ if (op == ALTDQ_REMOVE) {
+ m = _rmc_getq(cl);
+ if (m == NULL)
+ panic("_rmc_wrr_dequeue_next");
+ if (qempty(cl->q_))
+ ifd->na_[cpri]--;
+
+ /*
+ * Update class statistics and link data.
+ */
+ if (cl->bytes_alloc_ > 0)
+ cl->bytes_alloc_ -= m_pktlen(m);
+
+ if ((cl->bytes_alloc_ <= 0) || first == cl)
+ ifd->active_[cl->pri_] = cl->peer_;
+ else
+ ifd->active_[cl->pri_] = cl;
+
+ ifd->class_[ifd->qi_] = cl;
+ ifd->curlen_[ifd->qi_] = m_pktlen(m);
+ ifd->now_[ifd->qi_] = now;
+ ifd->qi_ = (ifd->qi_ + 1) % ifd->maxqueued_;
+ ifd->queued_++;
+ } else {
+ /* mode == ALTDQ_PPOLL */
+ m = _rmc_pollq(cl);
+ ifd->pollcache_ = cl;
+ }
+ return (m);
+}
+
+/*
+ * Dequeue & return next packet from the highest priority class that
+ * has a packet to send & has enough allocation to send it. This
+ * routine is called by a driver whenever it needs a new packet to
+ * output.
+ */
+static mbuf_t *
+_rmc_prr_dequeue_next(struct rm_ifdat *ifd, int op)
+{
+ mbuf_t *m;
+ int cpri;
+ struct rm_class *cl, *first = NULL;
+ struct timeval now;
+
+ RM_GETTIME(now);
+
+ /*
+ * if the driver polls the top of the queue and then removes
+ * the polled packet, we must return the same packet.
+ */
+ if (op == ALTDQ_REMOVE && ifd->pollcache_) {
+ cl = ifd->pollcache_;
+ cpri = cl->pri_;
+ ifd->pollcache_ = NULL;
+ goto _prr_out;
+ } else {
+ /* mode == ALTDQ_POLL || pollcache == NULL */
+ ifd->pollcache_ = NULL;
+ ifd->borrowed_[ifd->qi_] = NULL;
+ }
+#ifdef ADJUST_CUTOFF
+ _again:
+#endif
+ for (cpri = RM_MAXPRIO - 1; cpri >= 0; cpri--) {
+ if (ifd->na_[cpri] == 0)
+ continue;
+ cl = ifd->active_[cpri];
+ ASSERT(cl != NULL);
+ do {
+ if (!qempty(cl->q_)) {
+ if ((cl->undertime_.tv_sec == 0) ||
+ rmc_under_limit(cl, &now))
+ goto _prr_out;
+ if (first == NULL && cl->borrow_ != NULL)
+ first = cl;
+ }
+ cl = cl->peer_;
+ } while (cl != ifd->active_[cpri]);
+ }
+
+#ifdef ADJUST_CUTOFF
+ /*
+ * no underlimit class found. if cutoff is taking effect, increase
+ * cutoff and try again.
+ */
+ if (first != NULL && ifd->cutoff_ < ifd->root_->depth_) {
+ ifd->cutoff_++;
+ goto _again;
+ }
+#endif /* ADJUST_CUTOFF */
+ /*
+ * If LINK_EFFICIENCY is turned on, then the first overlimit
+ * class we encounter will send a packet if all the classes
+ * of the link-sharing structure are overlimit.
+ */
+ reset_cutoff(ifd);
+ if (!ifd->efficient_ || first == NULL)
+ return (NULL);
+
+ cl = first;
+ cpri = cl->pri_;
+#if 0 /* too time-consuming for nothing */
+ if (cl->sleeping_)
+ CALLOUT_STOP(&cl->callout_);
+ cl->sleeping_ = 0;
+ cl->undertime_.tv_sec = 0;
+#endif
+ ifd->borrowed_[ifd->qi_] = cl->borrow_;
+ ifd->cutoff_ = cl->borrow_->depth_;
+
+ /*
+ * Deque the packet and do the book keeping...
+ */
+ _prr_out:
+ if (op == ALTDQ_REMOVE) {
+ m = _rmc_getq(cl);
+ if (m == NULL)
+ panic("_rmc_prr_dequeue_next");
+ if (qempty(cl->q_))
+ ifd->na_[cpri]--;
+
+ ifd->active_[cpri] = cl->peer_;
+
+ ifd->class_[ifd->qi_] = cl;
+ ifd->curlen_[ifd->qi_] = m_pktlen(m);
+ ifd->now_[ifd->qi_] = now;
+ ifd->qi_ = (ifd->qi_ + 1) % ifd->maxqueued_;
+ ifd->queued_++;
+ } else {
+ /* mode == ALTDQ_POLL */
+ m = _rmc_pollq(cl);
+ ifd->pollcache_ = cl;
+ }
+ return (m);
+}
+
+/*
+ * mbuf_t *
+ * rmc_dequeue_next(struct rm_ifdat *ifd, struct timeval *now) - this function
+ * is invoked by the packet driver to get the next packet to be
+ * dequeued and output on the link. If WRR is enabled, then the
+ * WRR dequeue next routine will determine the next packet to sent.
+ * Otherwise, packet-by-packet round robin is invoked.
+ *
+ * Returns: NULL, if a packet is not available or if all
+ * classes are overlimit.
+ *
+ * Otherwise, Pointer to the next packet.
+ */
+
+mbuf_t *
+rmc_dequeue_next(struct rm_ifdat *ifd, int mode)
+{
+ if (ifd->queued_ >= ifd->maxqueued_)
+ return (NULL);
+ else if (ifd->wrr_)
+ return (_rmc_wrr_dequeue_next(ifd, mode));
+ else
+ return (_rmc_prr_dequeue_next(ifd, mode));
+}
+
+/*
+ * Update the utilization estimate for the packet that just completed.
+ * The packet's class & the parent(s) of that class all get their
+ * estimators updated. This routine is called by the driver's output-
+ * packet-completion interrupt service routine.
+ */
+
+/*
+ * a macro to approximate "divide by 1000" that gives 0.000999,
+ * if a value has enough effective digits.
+ * (on pentium, mul takes 9 cycles but div takes 46!)
+ */
+#define NSEC_TO_USEC(t) (((t) >> 10) + ((t) >> 16) + ((t) >> 17))
+void
+rmc_update_class_util(struct rm_ifdat *ifd)
+{
+ int idle, avgidle, pktlen;
+ int pkt_time, tidle;
+ rm_class_t *cl, *borrowed;
+ rm_class_t *borrows;
+ struct timeval *nowp;
+
+ /*
+ * Get the most recent completed class.
+ */
+ if ((cl = ifd->class_[ifd->qo_]) == NULL)
+ return;
+
+ pktlen = ifd->curlen_[ifd->qo_];
+ borrowed = ifd->borrowed_[ifd->qo_];
+ borrows = borrowed;
+
+ PKTCNTR_ADD(&cl->stats_.xmit_cnt, pktlen);
+
+ /*
+ * Run estimator on class and its ancestors.
+ */
+ /*
+ * rm_update_class_util is designed to be called when the
+ * transfer is completed from a xmit complete interrupt,
+ * but most drivers don't implement an upcall for that.
+ * so, just use estimated completion time.
+ * as a result, ifd->qi_ and ifd->qo_ are always synced.
+ */
+ nowp = &ifd->now_[ifd->qo_];
+ /* get pkt_time (for link) in usec */
+#if 1 /* use approximation */
+ pkt_time = ifd->curlen_[ifd->qo_] * ifd->ns_per_byte_;
+ pkt_time = NSEC_TO_USEC(pkt_time);
+#else
+ pkt_time = ifd->curlen_[ifd->qo_] * ifd->ns_per_byte_ / 1000;
+#endif
+#if 1 /* ALTQ4PPP */
+ if (TV_LT(nowp, &ifd->ifnow_)) {
+ int iftime;
+
+ /*
+ * make sure the estimated completion time does not go
+ * too far. it can happen when the link layer supports
+ * data compression or the interface speed is set to
+ * a much lower value.
+ */
+ TV_DELTA(&ifd->ifnow_, nowp, iftime);
+ if (iftime+pkt_time < ifd->maxiftime_) {
+ TV_ADD_DELTA(&ifd->ifnow_, pkt_time, &ifd->ifnow_);
+ } else {
+ TV_ADD_DELTA(nowp, ifd->maxiftime_, &ifd->ifnow_);
+ }
+ } else {
+ TV_ADD_DELTA(nowp, pkt_time, &ifd->ifnow_);
+ }
+#else
+ if (TV_LT(nowp, &ifd->ifnow_)) {
+ TV_ADD_DELTA(&ifd->ifnow_, pkt_time, &ifd->ifnow_);
+ } else {
+ TV_ADD_DELTA(nowp, pkt_time, &ifd->ifnow_);
+ }
+#endif
+
+ while (cl != NULL) {
+ TV_DELTA(&ifd->ifnow_, &cl->last_, idle);
+ if (idle >= 2000000)
+ /*
+ * this class is idle enough, reset avgidle.
+ * (TV_DELTA returns 2000000 us when delta is large.)
+ */
+ cl->avgidle_ = cl->maxidle_;
+
+ /* get pkt_time (for class) in usec */
+#if 1 /* use approximation */
+ pkt_time = pktlen * cl->ns_per_byte_;
+ pkt_time = NSEC_TO_USEC(pkt_time);
+#else
+ pkt_time = pktlen * cl->ns_per_byte_ / 1000;
+#endif
+ idle -= pkt_time;
+
+ avgidle = cl->avgidle_;
+ avgidle += idle - (avgidle >> RM_FILTER_GAIN);
+ cl->avgidle_ = avgidle;
+
+ /* Are we overlimit ? */
+ if (avgidle <= 0) {
+ CBQTRACE(rmc_update_class_util, 'milo', cl->stats_.handle);
+#if 1 /* ALTQ */
+ /*
+ * need some lower bound for avgidle, otherwise
+ * a borrowing class gets unbounded penalty.
+ */
+ if (avgidle < cl->minidle_)
+ avgidle = cl->avgidle_ = cl->minidle_;
+#endif
+ /* set next idle to make avgidle 0 */
+ tidle = pkt_time +
+ (((1 - RM_POWER) * avgidle) >> RM_FILTER_GAIN);
+ TV_ADD_DELTA(nowp, tidle, &cl->undertime_);
+ ++cl->stats_.over;
+ } else {
+ cl->avgidle_ =
+ (avgidle > cl->maxidle_) ? cl->maxidle_ : avgidle;
+ cl->undertime_.tv_sec = 0;
+ if (cl->sleeping_) {
+ CALLOUT_STOP(&cl->callout_);
+ cl->sleeping_ = 0;
+ }
+ }
+
+ if (borrows != NULL) {
+ if (borrows != cl)
+ ++cl->stats_.borrows;
+ else
+ borrows = NULL;
+ }
+ cl->last_ = ifd->ifnow_;
+ cl->last_pkttime_ = pkt_time;
+
+#if 1
+ if (cl->parent_ == NULL) {
+ /* take stats of root class */
+ PKTCNTR_ADD(&cl->stats_.xmit_cnt, pktlen);
+ }
+#endif
+
+ cl = cl->parent_;
+ }
+
+ /*
+ * Check to see if cutoff needs to set to a new level.
+ */
+ cl = ifd->class_[ifd->qo_];
+ if (borrowed && (ifd->cutoff_ >= borrowed->depth_)) {
+#if 1 /* ALTQ */
+ if ((qlen(cl->q_) <= 0) || TV_LT(nowp, &borrowed->undertime_)) {
+ rmc_tl_satisfied(ifd, nowp);
+ CBQTRACE(rmc_update_class_util, 'broe', ifd->cutoff_);
+ } else {
+ ifd->cutoff_ = borrowed->depth_;
+ CBQTRACE(rmc_update_class_util, 'ffob', borrowed->depth_);
+ }
+#else /* !ALTQ */
+ if ((qlen(cl->q_) <= 1) || TV_LT(&now, &borrowed->undertime_)) {
+ reset_cutoff(ifd);
+#ifdef notdef
+ rmc_tl_satisfied(ifd, &now);
+#endif
+ CBQTRACE(rmc_update_class_util, 'broe', ifd->cutoff_);
+ } else {
+ ifd->cutoff_ = borrowed->depth_;
+ CBQTRACE(rmc_update_class_util, 'ffob', borrowed->depth_);
+ }
+#endif /* !ALTQ */
+ }
+
+ /*
+ * Release class slot
+ */
+ ifd->borrowed_[ifd->qo_] = NULL;
+ ifd->class_[ifd->qo_] = NULL;
+ ifd->qo_ = (ifd->qo_ + 1) % ifd->maxqueued_;
+ ifd->queued_--;
+}
+
+/*
+ * void
+ * rmc_drop_action(struct rm_class *cl) - Generic (not protocol-specific)
+ * over-limit action routines. These get invoked by rmc_under_limit()
+ * if a class with packets to send if over its bandwidth limit & can't
+ * borrow from a parent class.
+ *
+ * Returns: NONE
+ */
+
+static void
+rmc_drop_action(struct rm_class *cl)
+{
+ struct rm_ifdat *ifd = cl->ifdat_;
+
+ ASSERT(qlen(cl->q_) > 0);
+ _rmc_dropq(cl);
+ if (qempty(cl->q_))
+ ifd->na_[cl->pri_]--;
+}
+
+void rmc_dropall(struct rm_class *cl)
+{
+ struct rm_ifdat *ifd = cl->ifdat_;
+
+ if (!qempty(cl->q_)) {
+ _flushq(cl->q_);
+
+ ifd->na_[cl->pri_]--;
+ }
+}
+
+#if (__FreeBSD_version > 300000)
+/* hzto() is removed from FreeBSD-3.0 */
+static int hzto(struct timeval *);
+
+static int
+hzto(tv)
+ struct timeval *tv;
+{
+ struct timeval t2;
+
+ getmicrotime(&t2);
+ t2.tv_sec = tv->tv_sec - t2.tv_sec;
+ t2.tv_usec = tv->tv_usec - t2.tv_usec;
+ return (tvtohz(&t2));
+}
+#endif /* __FreeBSD_version > 300000 */
+
+/*
+ * void
+ * rmc_delay_action(struct rm_class *cl) - This function is the generic CBQ
+ * delay action routine. It is invoked via rmc_under_limit when the
+ * packet is discoverd to be overlimit.
+ *
+ * If the delay action is result of borrow class being overlimit, then
+ * delay for the offtime of the borrowing class that is overlimit.
+ *
+ * Returns: NONE
+ */
+
+void
+rmc_delay_action(struct rm_class *cl, struct rm_class *borrow)
+{
+ int delay, t, extradelay;
+
+ cl->stats_.overactions++;
+ TV_DELTA(&cl->undertime_, &cl->overtime_, delay);
+#ifndef BORROW_OFFTIME
+ delay += cl->offtime_;
+#endif
+
+ if (!cl->sleeping_) {
+ CBQTRACE(rmc_delay_action, 'yled', cl->stats_.handle);
+#ifdef BORROW_OFFTIME
+ if (borrow != NULL)
+ extradelay = borrow->offtime_;
+ else
+#endif
+ extradelay = cl->offtime_;
+
+#ifdef ALTQ
+ /*
+ * XXX recalculate suspend time:
+ * current undertime is (tidle + pkt_time) calculated
+ * from the last transmission.
+ * tidle: time required to bring avgidle back to 0
+ * pkt_time: target waiting time for this class
+ * we need to replace pkt_time by offtime
+ */
+ extradelay -= cl->last_pkttime_;
+#endif
+ if (extradelay > 0) {
+ TV_ADD_DELTA(&cl->undertime_, extradelay, &cl->undertime_);
+ delay += extradelay;
+ }
+
+ cl->sleeping_ = 1;
+ cl->stats_.delays++;
+
+ /*
+ * Since packets are phased randomly with respect to the
+ * clock, 1 tick (the next clock tick) can be an arbitrarily
+ * short time so we have to wait for at least two ticks.
+ * NOTE: If there's no other traffic, we need the timer as
+ * a 'backstop' to restart this class.
+ */
+ if (delay > tick * 2) {
+#ifdef __FreeBSD__
+ /* FreeBSD rounds up the tick */
+ t = hzto(&cl->undertime_);
+#else
+ /* other BSDs round down the tick */
+ t = hzto(&cl->undertime_) + 1;
+#endif
+ } else
+ t = 2;
+ CALLOUT_RESET(&cl->callout_, t,
+ (timeout_t *)rmc_restart, (caddr_t)cl);
+ }
+}
+
+/*
+ * void
+ * rmc_restart() - is just a helper routine for rmc_delay_action -- it is
+ * called by the system timer code & is responsible checking if the
+ * class is still sleeping (it might have been restarted as a side
+ * effect of the queue scan on a packet arrival) and, if so, restarting
+ * output for the class. Inspecting the class state & restarting output
+ * require locking the class structure. In general the driver is
+ * responsible for locking but this is the only routine that is not
+ * called directly or indirectly from the interface driver so it has
+ * know about system locking conventions. Under bsd, locking is done
+ * by raising IPL to splimp so that's what's implemented here. On a
+ * different system this would probably need to be changed.
+ *
+ * Returns: NONE
+ */
+
+static void
+rmc_restart(struct rm_class *cl)
+{
+ struct rm_ifdat *ifd = cl->ifdat_;
+ int s;
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_LOCK(ifd->ifq_);
+ if (cl->sleeping_) {
+ cl->sleeping_ = 0;
+ cl->undertime_.tv_sec = 0;
+
+ if (ifd->queued_ < ifd->maxqueued_ && ifd->restart != NULL) {
+ CBQTRACE(rmc_restart, 'trts', cl->stats_.handle);
+ (ifd->restart)(ifd->ifq_);
+ }
+ }
+ IFQ_UNLOCK(ifd->ifq_);
+ splx(s);
+}
+
+/*
+ * void
+ * rmc_root_overlimit(struct rm_class *cl) - This the generic overlimit
+ * handling routine for the root class of the link sharing structure.
+ *
+ * Returns: NONE
+ */
+
+static void
+rmc_root_overlimit(struct rm_class *cl, struct rm_class *borrow)
+{
+ panic("rmc_root_overlimit");
+}
+
+/*
+ * Packet Queue handling routines. Eventually, this is to localize the
+ * effects on the code whether queues are red queues or droptail
+ * queues.
+ */
+
+static int
+_rmc_addq(rm_class_t *cl, mbuf_t *m)
+{
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->q_))
+ return rio_addq((rio_t *)cl->red_, cl->q_, m, cl->pktattr_);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->q_))
+ return red_addq(cl->red_, cl->q_, m, cl->pktattr_);
+#endif /* ALTQ_RED */
+
+ if (cl->flags_ & RMCF_CLEARDSCP)
+ write_dsfield(m, cl->pktattr_, 0);
+
+ _addq(cl->q_, m);
+ return (0);
+}
+
+/* note: _rmc_dropq is not called for red */
+static void
+_rmc_dropq(rm_class_t *cl)
+{
+ mbuf_t *m;
+
+ if ((m = _getq(cl->q_)) != NULL)
+ m_freem(m);
+}
+
+static mbuf_t *
+_rmc_getq(rm_class_t *cl)
+{
+#ifdef ALTQ_RIO
+ if (q_is_rio(cl->q_))
+ return rio_getq((rio_t *)cl->red_, cl->q_);
+#endif
+#ifdef ALTQ_RED
+ if (q_is_red(cl->q_))
+ return red_getq(cl->red_, cl->q_);
+#endif
+ return _getq(cl->q_);
+}
+
+static mbuf_t *
+_rmc_pollq(rm_class_t *cl)
+{
+ return qhead(cl->q_);
+}
+
+#ifdef CBQ_TRACE
+
+struct cbqtrace cbqtrace_buffer[NCBQTRACE+1];
+struct cbqtrace *cbqtrace_ptr = NULL;
+int cbqtrace_count;
+
+/*
+ * DDB hook to trace cbq events:
+ * the last 1024 events are held in a circular buffer.
+ * use "call cbqtrace_dump(N)" to display 20 events from Nth event.
+ */
+void cbqtrace_dump(int);
+static char *rmc_funcname(void *);
+
+static struct rmc_funcs {
+ void *func;
+ char *name;
+} rmc_funcs[] =
+{
+ rmc_init, "rmc_init",
+ rmc_queue_packet, "rmc_queue_packet",
+ rmc_under_limit, "rmc_under_limit",
+ rmc_update_class_util, "rmc_update_class_util",
+ rmc_delay_action, "rmc_delay_action",
+ rmc_restart, "rmc_restart",
+ _rmc_wrr_dequeue_next, "_rmc_wrr_dequeue_next",
+ NULL, NULL
+};
+
+static char *rmc_funcname(void *func)
+{
+ struct rmc_funcs *fp;
+
+ for (fp = rmc_funcs; fp->func != NULL; fp++)
+ if (fp->func == func)
+ return (fp->name);
+ return ("unknown");
+}
+
+void cbqtrace_dump(int counter)
+{
+ int i, *p;
+ char *cp;
+
+ counter = counter % NCBQTRACE;
+ p = (int *)&cbqtrace_buffer[counter];
+
+ for (i=0; i<20; i++) {
+ printf("[0x%x] ", *p++);
+ printf("%s: ", rmc_funcname((void *)*p++));
+ cp = (char *)p++;
+ printf("%c%c%c%c: ", cp[0], cp[1], cp[2], cp[3]);
+ printf("%d\n",*p++);
+
+ if (p >= (int *)&cbqtrace_buffer[NCBQTRACE])
+ p = (int *)cbqtrace_buffer;
+ }
+}
+#endif /* CBQ_TRACE */
+#endif /* ALTQ_CBQ */
+
+#if defined(ALTQ_CBQ) || defined(ALTQ_RED) || defined(ALTQ_RIO) || defined(ALTQ_HFSC) || defined(ALTQ_PRIQ)
+#if !defined(__GNUC__) || defined(ALTQ_DEBUG)
+
+void
+_addq(class_queue_t *q, mbuf_t *m)
+{
+ mbuf_t *m0;
+
+ if ((m0 = qtail(q)) != NULL)
+ m->m_nextpkt = m0->m_nextpkt;
+ else
+ m0 = m;
+ m0->m_nextpkt = m;
+ qtail(q) = m;
+ qlen(q)++;
+}
+
+mbuf_t *
+_getq(class_queue_t *q)
+{
+ mbuf_t *m, *m0;
+
+ if ((m = qtail(q)) == NULL)
+ return (NULL);
+ if ((m0 = m->m_nextpkt) != m)
+ m->m_nextpkt = m0->m_nextpkt;
+ else {
+ ASSERT(qlen(q) == 1);
+ qtail(q) = NULL;
+ }
+ qlen(q)--;
+ m0->m_nextpkt = NULL;
+ return (m0);
+}
+
+/* drop a packet at the tail of the queue */
+mbuf_t *
+_getq_tail(class_queue_t *q)
+{
+ mbuf_t *m, *m0, *prev;
+
+ if ((m = m0 = qtail(q)) == NULL)
+ return NULL;
+ do {
+ prev = m0;
+ m0 = m0->m_nextpkt;
+ } while (m0 != m);
+ prev->m_nextpkt = m->m_nextpkt;
+ if (prev == m) {
+ ASSERT(qlen(q) == 1);
+ qtail(q) = NULL;
+ } else
+ qtail(q) = prev;
+ qlen(q)--;
+ m->m_nextpkt = NULL;
+ return (m);
+}
+
+/* randomly select a packet in the queue */
+mbuf_t *
+_getq_random(class_queue_t *q)
+{
+ struct mbuf *m;
+ int i, n;
+
+ if ((m = qtail(q)) == NULL)
+ return NULL;
+ if (m->m_nextpkt == m) {
+ ASSERT(qlen(q) == 1);
+ qtail(q) = NULL;
+ } else {
+ struct mbuf *prev = NULL;
+
+ n = arc4random() % qlen(q) + 1;
+ for (i = 0; i < n; i++) {
+ prev = m;
+ m = m->m_nextpkt;
+ }
+ prev->m_nextpkt = m->m_nextpkt;
+ if (m == qtail(q))
+ qtail(q) = prev;
+ }
+ qlen(q)--;
+ m->m_nextpkt = NULL;
+ return (m);
+}
+
+void
+_removeq(class_queue_t *q, mbuf_t *m)
+{
+ mbuf_t *m0, *prev;
+
+ m0 = qtail(q);
+ do {
+ prev = m0;
+ m0 = m0->m_nextpkt;
+ } while (m0 != m);
+ prev->m_nextpkt = m->m_nextpkt;
+ if (prev == m)
+ qtail(q) = NULL;
+ else if (qtail(q) == m)
+ qtail(q) = prev;
+ qlen(q)--;
+}
+
+void
+_flushq(class_queue_t *q)
+{
+ mbuf_t *m;
+
+ while ((m = _getq(q)) != NULL)
+ m_freem(m);
+ ASSERT(qlen(q) == 0);
+}
+
+#endif /* !__GNUC__ || ALTQ_DEBUG */
+#endif /* ALTQ_CBQ || ALTQ_RED || ALTQ_RIO || ALTQ_HFSC || ALTQ_PRIQ */
diff --git a/sys/contrib/altq/altq/altq_rmclass.h b/sys/contrib/altq/altq/altq_rmclass.h
new file mode 100644
index 0000000..cf0ddf4
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_rmclass.h
@@ -0,0 +1,266 @@
+/* $KAME: altq_rmclass.h,v 1.10 2003/08/20 23:30:23 itojun Exp $ */
+
+/*
+ * Copyright (c) 1991-1997 Regents of the University of California.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the Network Research
+ * Group at Lawrence Berkeley Laboratory.
+ * 4. Neither the name of the University nor of the Laboratory may be used
+ * to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#ifndef _ALTQ_ALTQ_RMCLASS_H_
+#define _ALTQ_ALTQ_RMCLASS_H_
+
+#include <altq/altq_classq.h>
+
+/* #pragma ident "@(#)rm_class.h 1.20 97/10/23 SMI" */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define RM_MAXPRIO 8 /* Max priority */
+
+#ifdef _KERNEL
+
+typedef struct mbuf mbuf_t;
+typedef struct rm_ifdat rm_ifdat_t;
+typedef struct rm_class rm_class_t;
+
+struct red;
+
+/*
+ * Macros for dealing with time values. We assume all times are
+ * 'timevals'. `microtime' is used to get the best available clock
+ * resolution. If `microtime' *doesn't* return a value that's about
+ * ten times smaller than the average packet time on the fastest
+ * link that will use these routines, a slightly different clock
+ * scheme than this one should be used.
+ * (Bias due to truncation error in this scheme will overestimate utilization
+ * and discriminate against high bandwidth classes. To remove this bias an
+ * integrator needs to be added. The simplest integrator uses a history of
+ * 10 * avg.packet.time / min.tick.time packet completion entries. This is
+ * straight forward to add but we don't want to pay the extra memory
+ * traffic to maintain it if it's not necessary (occasionally a vendor
+ * accidentally builds a workstation with a decent clock - e.g., Sun & HP).)
+ */
+
+#define RM_GETTIME(now) microtime(&now)
+
+#define TV_LT(a, b) (((a)->tv_sec < (b)->tv_sec) || \
+ (((a)->tv_usec < (b)->tv_usec) && ((a)->tv_sec <= (b)->tv_sec)))
+
+#define TV_DELTA(a, b, delta) { \
+ register int xxs; \
+ \
+ delta = (a)->tv_usec - (b)->tv_usec; \
+ if ((xxs = (a)->tv_sec - (b)->tv_sec)) { \
+ switch (xxs) { \
+ default: \
+ /* if (xxs < 0) \
+ printf("rm_class: bogus time values\n"); */ \
+ delta = 0; \
+ /* fall through */ \
+ case 2: \
+ delta += 1000000; \
+ /* fall through */ \
+ case 1: \
+ delta += 1000000; \
+ break; \
+ } \
+ } \
+}
+
+#define TV_ADD_DELTA(a, delta, res) { \
+ register int xxus = (a)->tv_usec + (delta); \
+ \
+ (res)->tv_sec = (a)->tv_sec; \
+ while (xxus >= 1000000) { \
+ ++((res)->tv_sec); \
+ xxus -= 1000000; \
+ } \
+ (res)->tv_usec = xxus; \
+}
+
+#define RM_TIMEOUT 2 /* 1 Clock tick. */
+
+#if 1
+#define RM_MAXQUEUED 1 /* this isn't used in ALTQ/CBQ */
+#else
+#define RM_MAXQUEUED 16 /* Max number of packets downstream of CBQ */
+#endif
+#define RM_MAXQUEUE 64 /* Max queue length */
+#define RM_FILTER_GAIN 5 /* log2 of gain, e.g., 5 => 31/32 */
+#define RM_POWER (1 << RM_FILTER_GAIN)
+#define RM_MAXDEPTH 32
+#define RM_NS_PER_SEC (1000000000)
+
+typedef struct _rm_class_stats_ {
+ u_int handle;
+ u_int depth;
+
+ struct pktcntr xmit_cnt; /* packets sent in this class */
+ struct pktcntr drop_cnt; /* dropped packets */
+ u_int over; /* # times went over limit */
+ u_int borrows; /* # times tried to borrow */
+ u_int overactions; /* # times invoked overlimit action */
+ u_int delays; /* # times invoked delay actions */
+} rm_class_stats_t;
+
+/*
+ * CBQ Class state structure
+ */
+struct rm_class {
+ class_queue_t *q_; /* Queue of packets */
+ rm_ifdat_t *ifdat_;
+ int pri_; /* Class priority. */
+ int depth_; /* Class depth */
+ u_int ns_per_byte_; /* NanoSeconds per byte. */
+ u_int maxrate_; /* Bytes per second for this class. */
+ u_int allotment_; /* Fraction of link bandwidth. */
+ u_int w_allotment_; /* Weighted allotment for WRR */
+ int bytes_alloc_; /* Allocation for round of WRR */
+
+ int avgidle_;
+ int maxidle_;
+ int minidle_;
+ int offtime_;
+ int sleeping_; /* != 0 if delaying */
+ int qthresh_; /* Queue threshold for formal link sharing */
+ int leaf_; /* Note whether leaf class or not.*/
+
+ rm_class_t *children_; /* Children of this class */
+ rm_class_t *next_; /* Next pointer, used if child */
+
+ rm_class_t *peer_; /* Peer class */
+ rm_class_t *borrow_; /* Borrow class */
+ rm_class_t *parent_; /* Parent class */
+
+ void (*overlimit)(struct rm_class *, struct rm_class *);
+ void (*drop)(struct rm_class *); /* Class drop action. */
+
+ struct red *red_; /* RED state pointer */
+ struct altq_pktattr *pktattr_; /* saved hdr used by RED/ECN */
+ int flags_;
+
+ int last_pkttime_; /* saved pkt_time */
+ struct timeval undertime_; /* time can next send */
+ struct timeval last_; /* time last packet sent */
+ struct timeval overtime_;
+ struct callout callout_; /* for timeout() calls */
+
+ rm_class_stats_t stats_; /* Class Statistics */
+};
+
+/*
+ * CBQ Interface state
+ */
+struct rm_ifdat {
+ int queued_; /* # pkts queued downstream */
+ int efficient_; /* Link Efficency bit */
+ int wrr_; /* Enable Weighted Round-Robin */
+ u_long ns_per_byte_; /* Link byte speed. */
+ int maxqueued_; /* Max packets to queue */
+ int maxpkt_; /* Max packet size. */
+ int qi_; /* In/out pointers for downstream */
+ int qo_; /* packets */
+
+ /*
+ * Active class state and WRR state.
+ */
+ rm_class_t *active_[RM_MAXPRIO]; /* Active cl's in each pri */
+ int na_[RM_MAXPRIO]; /* # of active cl's in a pri */
+ int num_[RM_MAXPRIO]; /* # of cl's per pri */
+ int alloc_[RM_MAXPRIO]; /* Byte Allocation */
+ u_long M_[RM_MAXPRIO]; /* WRR weights. */
+
+ /*
+ * Network Interface/Solaris Queue state pointer.
+ */
+ struct ifaltq *ifq_;
+ rm_class_t *default_; /* Default Pkt class, BE */
+ rm_class_t *root_; /* Root Link class. */
+ rm_class_t *ctl_; /* Control Traffic class. */
+ void (*restart)(struct ifaltq *); /* Restart routine. */
+
+ /*
+ * Current packet downstream packet state and dynamic state.
+ */
+ rm_class_t *borrowed_[RM_MAXQUEUED]; /* Class borrowed last */
+ rm_class_t *class_[RM_MAXQUEUED]; /* class sending */
+ int curlen_[RM_MAXQUEUED]; /* Current pktlen */
+ struct timeval now_[RM_MAXQUEUED]; /* Current packet time. */
+ int is_overlimit_[RM_MAXQUEUED];/* Current packet time. */
+
+ int cutoff_; /* Cut-off depth for borrowing */
+
+ struct timeval ifnow_; /* expected xmit completion time */
+#if 1 /* ALTQ4PPP */
+ int maxiftime_; /* max delay inside interface */
+#endif
+ rm_class_t *pollcache_; /* cached rm_class by poll operation */
+};
+
+/* flags for rmc_init and rmc_newclass */
+/* class flags */
+#define RMCF_RED 0x0001
+#define RMCF_ECN 0x0002
+#define RMCF_RIO 0x0004
+#define RMCF_FLOWVALVE 0x0008 /* use flowvalve (aka penalty-box) */
+#define RMCF_CLEARDSCP 0x0010 /* clear diffserv codepoint */
+
+/* flags for rmc_init */
+#define RMCF_WRR 0x0100
+#define RMCF_EFFICIENT 0x0200
+
+#define is_a_parent_class(cl) ((cl)->children_ != NULL)
+
+extern rm_class_t *rmc_newclass(int, struct rm_ifdat *, u_int,
+ void (*)(struct rm_class *, struct rm_class *),
+ int, struct rm_class *, struct rm_class *,
+ u_int, int, u_int, int, int);
+extern void rmc_delete_class(struct rm_ifdat *, struct rm_class *);
+extern int rmc_modclass(struct rm_class *, u_int, int,
+ u_int, int, u_int, int);
+extern void rmc_init(struct ifaltq *, struct rm_ifdat *, u_int,
+ void (*)(struct ifaltq *),
+ int, int, u_int, int, u_int, int);
+extern int rmc_queue_packet(struct rm_class *, mbuf_t *);
+extern mbuf_t *rmc_dequeue_next(struct rm_ifdat *, int);
+extern void rmc_update_class_util(struct rm_ifdat *);
+extern void rmc_delay_action(struct rm_class *, struct rm_class *);
+extern void rmc_dropall(struct rm_class *);
+extern int rmc_get_weight(struct rm_ifdat *, int);
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ALTQ_ALTQ_RMCLASS_H_ */
diff --git a/sys/contrib/altq/altq/altq_rmclass_debug.h b/sys/contrib/altq/altq/altq_rmclass_debug.h
new file mode 100644
index 0000000..8f471b2
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_rmclass_debug.h
@@ -0,0 +1,112 @@
+/* $KAME: altq_rmclass_debug.h,v 1.3 2002/11/29 04:36:24 kjc Exp $ */
+
+/*
+ * Copyright (c) Sun Microsystems, Inc. 1998 All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by the SMCC Technology
+ * Development Group at Sun Microsystems, Inc.
+ *
+ * 4. The name of the Sun Microsystems, Inc nor may not be used to endorse or
+ * promote products derived from this software without specific prior
+ * written permission.
+ *
+ * SUN MICROSYSTEMS DOES NOT CLAIM MERCHANTABILITY OF THIS SOFTWARE OR THE
+ * SUITABILITY OF THIS SOFTWARE FOR ANY PARTICULAR PURPOSE. The software is
+ * provided "as is" without express or implied warranty of any kind.
+ *
+ * These notices must be retained in any copies of any part of this software.
+ */
+
+#ifndef _ALTQ_ALTQ_RMCLASS_DEBUG_H_
+#define _ALTQ_ALTQ_RMCLASS_DEBUG_H_
+
+/* #pragma ident "@(#)rm_class_debug.h 1.7 98/05/04 SMI" */
+
+/*
+ * Cbq debugging macros
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef CBQ_TRACE
+#ifndef NCBQTRACE
+#define NCBQTRACE (16 * 1024)
+#endif
+
+/*
+ * To view the trace output, using adb, type:
+ * adb -k /dev/ksyms /dev/mem <cr>, then type
+ * cbqtrace_count/D to get the count, then type
+ * cbqtrace_buffer,0tcount/Dp4C" "Xn
+ * This will dump the trace buffer from 0 to count.
+ */
+/*
+ * in ALTQ, "call cbqtrace_dump(N)" from DDB to display 20 events
+ * from Nth event in the circular buffer.
+ */
+
+struct cbqtrace {
+ int count;
+ int function; /* address of function */
+ int trace_action; /* descriptive 4 characters */
+ int object; /* object operated on */
+};
+
+extern struct cbqtrace cbqtrace_buffer[];
+extern struct cbqtrace *cbqtrace_ptr;
+extern int cbqtrace_count;
+
+#define CBQTRACEINIT() { \
+ if (cbqtrace_ptr == NULL) \
+ cbqtrace_ptr = cbqtrace_buffer; \
+ else { \
+ cbqtrace_ptr = cbqtrace_buffer; \
+ bzero((void *)cbqtrace_ptr, sizeof(cbqtrace_buffer)); \
+ cbqtrace_count = 0; \
+ } \
+}
+
+#define LOCK_TRACE() splimp()
+#define UNLOCK_TRACE(x) splx(x)
+
+#define CBQTRACE(func, act, obj) { \
+ int __s = LOCK_TRACE(); \
+ int *_p = &cbqtrace_ptr->count; \
+ *_p++ = ++cbqtrace_count; \
+ *_p++ = (int)(func); \
+ *_p++ = (int)(act); \
+ *_p++ = (int)(obj); \
+ if ((struct cbqtrace *)(void *)_p >= &cbqtrace_buffer[NCBQTRACE])\
+ cbqtrace_ptr = cbqtrace_buffer; \
+ else \
+ cbqtrace_ptr = (struct cbqtrace *)(void *)_p; \
+ UNLOCK_TRACE(__s); \
+ }
+#else
+
+/* If no tracing, define no-ops */
+#define CBQTRACEINIT()
+#define CBQTRACE(a, b, c)
+
+#endif /* !CBQ_TRACE */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ALTQ_ALTQ_RMCLASS_DEBUG_H_ */
diff --git a/sys/contrib/altq/altq/altq_subr.c b/sys/contrib/altq/altq/altq_subr.c
new file mode 100644
index 0000000..fb6b91c
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_subr.c
@@ -0,0 +1,2003 @@
+/* $FreeBSD$ */
+/* $KAME: altq_subr.c,v 1.21 2003/11/06 06:32:53 kjc Exp $ */
+
+/*
+ * Copyright (C) 1997-2003
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+
+#if defined(__FreeBSD__) || defined(__NetBSD__)
+#include "opt_altq.h"
+#if (__FreeBSD__ != 2)
+#include "opt_inet.h"
+#ifdef __FreeBSD__
+#include "opt_inet6.h"
+#endif
+#endif
+#endif /* __FreeBSD__ || __NetBSD__ */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/mbuf.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <sys/kernel.h>
+#include <sys/errno.h>
+#include <sys/syslog.h>
+#include <sys/sysctl.h>
+#include <sys/queue.h>
+
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <net/if_types.h>
+
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#ifdef INET6
+#include <netinet/ip6.h>
+#endif
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+
+#include <net/pfvar.h>
+#include <altq/altq.h>
+#ifdef ALTQ3_COMPAT
+#include <altq/altq_conf.h>
+#endif
+
+/* machine dependent clock related includes */
+#ifdef __FreeBSD__
+#if __FreeBSD__ < 3
+#include "opt_cpu.h" /* for FreeBSD-2.2.8 to get i586_ctr_freq */
+#endif
+#include <sys/bus.h>
+#include <sys/cpu.h>
+#include <sys/eventhandler.h>
+#include <machine/clock.h>
+#endif
+#if defined(__i386__)
+#include <machine/cpufunc.h> /* for pentium tsc */
+#include <machine/specialreg.h> /* for CPUID_TSC */
+#ifdef __FreeBSD__
+#include <machine/md_var.h> /* for cpu_feature */
+#elif defined(__NetBSD__) || defined(__OpenBSD__)
+#include <machine/cpu.h> /* for cpu_feature */
+#endif
+#endif /* __i386__ */
+
+/*
+ * internal function prototypes
+ */
+static void tbr_timeout(void *);
+int (*altq_input)(struct mbuf *, int) = NULL;
+static struct mbuf *tbr_dequeue(struct ifaltq *, int);
+static int tbr_timer = 0; /* token bucket regulator timer */
+#if !defined(__FreeBSD__) || (__FreeBSD_version < 600000)
+static struct callout tbr_callout = CALLOUT_INITIALIZER;
+#else
+static struct callout tbr_callout;
+#endif
+
+#ifdef ALTQ3_CLFIER_COMPAT
+static int extract_ports4(struct mbuf *, struct ip *, struct flowinfo_in *);
+#ifdef INET6
+static int extract_ports6(struct mbuf *, struct ip6_hdr *,
+ struct flowinfo_in6 *);
+#endif
+static int apply_filter4(u_int32_t, struct flow_filter *,
+ struct flowinfo_in *);
+static int apply_ppfilter4(u_int32_t, struct flow_filter *,
+ struct flowinfo_in *);
+#ifdef INET6
+static int apply_filter6(u_int32_t, struct flow_filter6 *,
+ struct flowinfo_in6 *);
+#endif
+static int apply_tosfilter4(u_int32_t, struct flow_filter *,
+ struct flowinfo_in *);
+static u_long get_filt_handle(struct acc_classifier *, int);
+static struct acc_filter *filth_to_filtp(struct acc_classifier *, u_long);
+static u_int32_t filt2fibmask(struct flow_filter *);
+
+static void ip4f_cache(struct ip *, struct flowinfo_in *);
+static int ip4f_lookup(struct ip *, struct flowinfo_in *);
+static int ip4f_init(void);
+static struct ip4_frag *ip4f_alloc(void);
+static void ip4f_free(struct ip4_frag *);
+#endif /* ALTQ3_CLFIER_COMPAT */
+
+/*
+ * alternate queueing support routines
+ */
+
+/* look up the queue state by the interface name and the queueing type. */
+void *
+altq_lookup(name, type)
+ char *name;
+ int type;
+{
+ struct ifnet *ifp;
+
+ if ((ifp = ifunit(name)) != NULL) {
+ /* read if_snd unlocked */
+ if (type != ALTQT_NONE && ifp->if_snd.altq_type == type)
+ return (ifp->if_snd.altq_disc);
+ }
+
+ return NULL;
+}
+
+int
+altq_attach(ifq, type, discipline, enqueue, dequeue, request, clfier, classify)
+ struct ifaltq *ifq;
+ int type;
+ void *discipline;
+ int (*enqueue)(struct ifaltq *, struct mbuf *, struct altq_pktattr *);
+ struct mbuf *(*dequeue)(struct ifaltq *, int);
+ int (*request)(struct ifaltq *, int, void *);
+ void *clfier;
+ void *(*classify)(void *, struct mbuf *, int);
+{
+ IFQ_LOCK(ifq);
+ if (!ALTQ_IS_READY(ifq)) {
+ IFQ_UNLOCK(ifq);
+ return ENXIO;
+ }
+
+#ifdef ALTQ3_COMPAT
+ /*
+ * pfaltq can override the existing discipline, but altq3 cannot.
+ * check these if clfier is not NULL (which implies altq3).
+ */
+ if (clfier != NULL) {
+ if (ALTQ_IS_ENABLED(ifq)) {
+ IFQ_UNLOCK(ifq);
+ return EBUSY;
+ }
+ if (ALTQ_IS_ATTACHED(ifq)) {
+ IFQ_UNLOCK(ifq);
+ return EEXIST;
+ }
+ }
+#endif
+ ifq->altq_type = type;
+ ifq->altq_disc = discipline;
+ ifq->altq_enqueue = enqueue;
+ ifq->altq_dequeue = dequeue;
+ ifq->altq_request = request;
+ ifq->altq_clfier = clfier;
+ ifq->altq_classify = classify;
+ ifq->altq_flags &= (ALTQF_CANTCHANGE|ALTQF_ENABLED);
+#ifdef ALTQ3_COMPAT
+#ifdef ALTQ_KLD
+ altq_module_incref(type);
+#endif
+#endif
+ IFQ_UNLOCK(ifq);
+ return 0;
+}
+
+int
+altq_detach(ifq)
+ struct ifaltq *ifq;
+{
+ IFQ_LOCK(ifq);
+
+ if (!ALTQ_IS_READY(ifq)) {
+ IFQ_UNLOCK(ifq);
+ return ENXIO;
+ }
+ if (ALTQ_IS_ENABLED(ifq)) {
+ IFQ_UNLOCK(ifq);
+ return EBUSY;
+ }
+ if (!ALTQ_IS_ATTACHED(ifq)) {
+ IFQ_UNLOCK(ifq);
+ return (0);
+ }
+#ifdef ALTQ3_COMPAT
+#ifdef ALTQ_KLD
+ altq_module_declref(ifq->altq_type);
+#endif
+#endif
+
+ ifq->altq_type = ALTQT_NONE;
+ ifq->altq_disc = NULL;
+ ifq->altq_enqueue = NULL;
+ ifq->altq_dequeue = NULL;
+ ifq->altq_request = NULL;
+ ifq->altq_clfier = NULL;
+ ifq->altq_classify = NULL;
+ ifq->altq_flags &= ALTQF_CANTCHANGE;
+
+ IFQ_UNLOCK(ifq);
+ return 0;
+}
+
+int
+altq_enable(ifq)
+ struct ifaltq *ifq;
+{
+ int s;
+
+ IFQ_LOCK(ifq);
+
+ if (!ALTQ_IS_READY(ifq)) {
+ IFQ_UNLOCK(ifq);
+ return ENXIO;
+ }
+ if (ALTQ_IS_ENABLED(ifq)) {
+ IFQ_UNLOCK(ifq);
+ return 0;
+ }
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_PURGE_NOLOCK(ifq);
+ ASSERT(ifq->ifq_len == 0);
+ ifq->ifq_drv_maxlen = 0; /* disable bulk dequeue */
+ ifq->altq_flags |= ALTQF_ENABLED;
+ if (ifq->altq_clfier != NULL)
+ ifq->altq_flags |= ALTQF_CLASSIFY;
+ splx(s);
+
+ IFQ_UNLOCK(ifq);
+ return 0;
+}
+
+int
+altq_disable(ifq)
+ struct ifaltq *ifq;
+{
+ int s;
+
+ IFQ_LOCK(ifq);
+ if (!ALTQ_IS_ENABLED(ifq)) {
+ IFQ_UNLOCK(ifq);
+ return 0;
+ }
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ IFQ_PURGE_NOLOCK(ifq);
+ ASSERT(ifq->ifq_len == 0);
+ ifq->altq_flags &= ~(ALTQF_ENABLED|ALTQF_CLASSIFY);
+ splx(s);
+
+ IFQ_UNLOCK(ifq);
+ return 0;
+}
+
+#ifdef ALTQ_DEBUG
+void
+altq_assert(file, line, failedexpr)
+ const char *file, *failedexpr;
+ int line;
+{
+ (void)printf("altq assertion \"%s\" failed: file \"%s\", line %d\n",
+ failedexpr, file, line);
+ panic("altq assertion");
+ /* NOTREACHED */
+}
+#endif
+
+/*
+ * internal representation of token bucket parameters
+ * rate: byte_per_unittime << 32
+ * (((bits_per_sec) / 8) << 32) / machclk_freq
+ * depth: byte << 32
+ *
+ */
+#define TBR_SHIFT 32
+#define TBR_SCALE(x) ((int64_t)(x) << TBR_SHIFT)
+#define TBR_UNSCALE(x) ((x) >> TBR_SHIFT)
+
+static struct mbuf *
+tbr_dequeue(ifq, op)
+ struct ifaltq *ifq;
+ int op;
+{
+ struct tb_regulator *tbr;
+ struct mbuf *m;
+ int64_t interval;
+ u_int64_t now;
+
+ IFQ_LOCK_ASSERT(ifq);
+ tbr = ifq->altq_tbr;
+ if (op == ALTDQ_REMOVE && tbr->tbr_lastop == ALTDQ_POLL) {
+ /* if this is a remove after poll, bypass tbr check */
+ } else {
+ /* update token only when it is negative */
+ if (tbr->tbr_token <= 0) {
+ now = read_machclk();
+ interval = now - tbr->tbr_last;
+ if (interval >= tbr->tbr_filluptime)
+ tbr->tbr_token = tbr->tbr_depth;
+ else {
+ tbr->tbr_token += interval * tbr->tbr_rate;
+ if (tbr->tbr_token > tbr->tbr_depth)
+ tbr->tbr_token = tbr->tbr_depth;
+ }
+ tbr->tbr_last = now;
+ }
+ /* if token is still negative, don't allow dequeue */
+ if (tbr->tbr_token <= 0)
+ return (NULL);
+ }
+
+ if (ALTQ_IS_ENABLED(ifq))
+ m = (*ifq->altq_dequeue)(ifq, op);
+ else {
+ if (op == ALTDQ_POLL)
+ _IF_POLL(ifq, m);
+ else
+ _IF_DEQUEUE(ifq, m);
+ }
+
+ if (m != NULL && op == ALTDQ_REMOVE)
+ tbr->tbr_token -= TBR_SCALE(m_pktlen(m));
+ tbr->tbr_lastop = op;
+ return (m);
+}
+
+/*
+ * set a token bucket regulator.
+ * if the specified rate is zero, the token bucket regulator is deleted.
+ */
+int
+tbr_set(ifq, profile)
+ struct ifaltq *ifq;
+ struct tb_profile *profile;
+{
+ struct tb_regulator *tbr, *otbr;
+
+ if (tbr_dequeue_ptr == NULL)
+ tbr_dequeue_ptr = tbr_dequeue;
+
+ if (machclk_freq == 0)
+ init_machclk();
+ if (machclk_freq == 0) {
+ printf("tbr_set: no cpu clock available!\n");
+ return (ENXIO);
+ }
+
+ IFQ_LOCK(ifq);
+ if (profile->rate == 0) {
+ /* delete this tbr */
+ if ((tbr = ifq->altq_tbr) == NULL) {
+ IFQ_UNLOCK(ifq);
+ return (ENOENT);
+ }
+ ifq->altq_tbr = NULL;
+ FREE(tbr, M_DEVBUF);
+ IFQ_UNLOCK(ifq);
+ return (0);
+ }
+
+ IFQ_UNLOCK(ifq);
+ MALLOC(tbr, struct tb_regulator *, sizeof(struct tb_regulator),
+ M_DEVBUF, M_WAITOK);
+ if (tbr == NULL) { /* can not happen */
+ IFQ_UNLOCK(ifq);
+ return (ENOMEM);
+ }
+ bzero(tbr, sizeof(struct tb_regulator));
+
+ tbr->tbr_rate = TBR_SCALE(profile->rate / 8) / machclk_freq;
+ tbr->tbr_depth = TBR_SCALE(profile->depth);
+ if (tbr->tbr_rate > 0)
+ tbr->tbr_filluptime = tbr->tbr_depth / tbr->tbr_rate;
+ else
+ tbr->tbr_filluptime = 0xffffffffffffffffLL;
+ tbr->tbr_token = tbr->tbr_depth;
+ tbr->tbr_last = read_machclk();
+ tbr->tbr_lastop = ALTDQ_REMOVE;
+
+ IFQ_LOCK(ifq);
+ otbr = ifq->altq_tbr;
+ ifq->altq_tbr = tbr; /* set the new tbr */
+
+ if (otbr != NULL)
+ FREE(otbr, M_DEVBUF);
+ else {
+ if (tbr_timer == 0) {
+ CALLOUT_RESET(&tbr_callout, 1, tbr_timeout, (void *)0);
+ tbr_timer = 1;
+ }
+ }
+ IFQ_UNLOCK(ifq);
+ return (0);
+}
+
+/*
+ * tbr_timeout goes through the interface list, and kicks the drivers
+ * if necessary.
+ *
+ * MPSAFE
+ */
+static void
+tbr_timeout(arg)
+ void *arg;
+{
+ struct ifnet *ifp;
+ int active, s;
+
+ active = 0;
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+#if defined(__FreeBSD__) && (__FreeBSD_version >= 500000)
+ IFNET_RLOCK();
+#endif
+ for (ifp = TAILQ_FIRST(&ifnet); ifp; ifp = TAILQ_NEXT(ifp, if_list)) {
+ /* read from if_snd unlocked */
+ if (!TBR_IS_ENABLED(&ifp->if_snd))
+ continue;
+ active++;
+ if (!IFQ_IS_EMPTY(&ifp->if_snd) && ifp->if_start != NULL)
+ (*ifp->if_start)(ifp);
+ }
+#if defined(__FreeBSD__) && (__FreeBSD_version >= 500000)
+ IFNET_RUNLOCK();
+#endif
+ splx(s);
+ if (active > 0)
+ CALLOUT_RESET(&tbr_callout, 1, tbr_timeout, (void *)0);
+ else
+ tbr_timer = 0; /* don't need tbr_timer anymore */
+#if defined(__alpha__) && !defined(ALTQ_NOPCC)
+ {
+ /*
+ * XXX read out the machine dependent clock once a second
+ * to detect counter wrap-around.
+ */
+ static u_int cnt;
+
+ if (++cnt >= hz) {
+ (void)read_machclk();
+ cnt = 0;
+ }
+ }
+#endif /* __alpha__ && !ALTQ_NOPCC */
+}
+
+/*
+ * get token bucket regulator profile
+ */
+int
+tbr_get(ifq, profile)
+ struct ifaltq *ifq;
+ struct tb_profile *profile;
+{
+ struct tb_regulator *tbr;
+
+ IFQ_LOCK(ifq);
+ if ((tbr = ifq->altq_tbr) == NULL) {
+ profile->rate = 0;
+ profile->depth = 0;
+ } else {
+ profile->rate =
+ (u_int)TBR_UNSCALE(tbr->tbr_rate * 8 * machclk_freq);
+ profile->depth = (u_int)TBR_UNSCALE(tbr->tbr_depth);
+ }
+ IFQ_UNLOCK(ifq);
+ return (0);
+}
+
+/*
+ * attach a discipline to the interface. if one already exists, it is
+ * overridden.
+ * Locking is done in the discipline specific attach functions. Basically
+ * they call back to altq_attach which takes care of the attach and locking.
+ */
+int
+altq_pfattach(struct pf_altq *a)
+{
+ int error = 0;
+
+ switch (a->scheduler) {
+ case ALTQT_NONE:
+ break;
+#ifdef ALTQ_CBQ
+ case ALTQT_CBQ:
+ error = cbq_pfattach(a);
+ break;
+#endif
+#ifdef ALTQ_PRIQ
+ case ALTQT_PRIQ:
+ error = priq_pfattach(a);
+ break;
+#endif
+#ifdef ALTQ_HFSC
+ case ALTQT_HFSC:
+ error = hfsc_pfattach(a);
+ break;
+#endif
+ default:
+ error = ENXIO;
+ }
+
+ return (error);
+}
+
+/*
+ * detach a discipline from the interface.
+ * it is possible that the discipline was already overridden by another
+ * discipline.
+ */
+int
+altq_pfdetach(struct pf_altq *a)
+{
+ struct ifnet *ifp;
+ int s, error = 0;
+
+ if ((ifp = ifunit(a->ifname)) == NULL)
+ return (EINVAL);
+
+ /* if this discipline is no longer referenced, just return */
+ /* read unlocked from if_snd */
+ if (a->altq_disc == NULL || a->altq_disc != ifp->if_snd.altq_disc)
+ return (0);
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ /* read unlocked from if_snd, _disable and _detach take care */
+ if (ALTQ_IS_ENABLED(&ifp->if_snd))
+ error = altq_disable(&ifp->if_snd);
+ if (error == 0)
+ error = altq_detach(&ifp->if_snd);
+ splx(s);
+
+ return (error);
+}
+
+/*
+ * add a discipline or a queue
+ * Locking is done in the discipline specific functions with regards to
+ * malloc with WAITOK, also it is not yet clear which lock to use.
+ */
+int
+altq_add(struct pf_altq *a)
+{
+ int error = 0;
+
+ if (a->qname[0] != 0)
+ return (altq_add_queue(a));
+
+ if (machclk_freq == 0)
+ init_machclk();
+ if (machclk_freq == 0)
+ panic("altq_add: no cpu clock");
+
+ switch (a->scheduler) {
+#ifdef ALTQ_CBQ
+ case ALTQT_CBQ:
+ error = cbq_add_altq(a);
+ break;
+#endif
+#ifdef ALTQ_PRIQ
+ case ALTQT_PRIQ:
+ error = priq_add_altq(a);
+ break;
+#endif
+#ifdef ALTQ_HFSC
+ case ALTQT_HFSC:
+ error = hfsc_add_altq(a);
+ break;
+#endif
+ default:
+ error = ENXIO;
+ }
+
+ return (error);
+}
+
+/*
+ * remove a discipline or a queue
+ * It is yet unclear what lock to use to protect this operation, the
+ * discipline specific functions will determine and grab it
+ */
+int
+altq_remove(struct pf_altq *a)
+{
+ int error = 0;
+
+ if (a->qname[0] != 0)
+ return (altq_remove_queue(a));
+
+ switch (a->scheduler) {
+#ifdef ALTQ_CBQ
+ case ALTQT_CBQ:
+ error = cbq_remove_altq(a);
+ break;
+#endif
+#ifdef ALTQ_PRIQ
+ case ALTQT_PRIQ:
+ error = priq_remove_altq(a);
+ break;
+#endif
+#ifdef ALTQ_HFSC
+ case ALTQT_HFSC:
+ error = hfsc_remove_altq(a);
+ break;
+#endif
+ default:
+ error = ENXIO;
+ }
+
+ return (error);
+}
+
+/*
+ * add a queue to the discipline
+ * It is yet unclear what lock to use to protect this operation, the
+ * discipline specific functions will determine and grab it
+ */
+int
+altq_add_queue(struct pf_altq *a)
+{
+ int error = 0;
+
+ switch (a->scheduler) {
+#ifdef ALTQ_CBQ
+ case ALTQT_CBQ:
+ error = cbq_add_queue(a);
+ break;
+#endif
+#ifdef ALTQ_PRIQ
+ case ALTQT_PRIQ:
+ error = priq_add_queue(a);
+ break;
+#endif
+#ifdef ALTQ_HFSC
+ case ALTQT_HFSC:
+ error = hfsc_add_queue(a);
+ break;
+#endif
+ default:
+ error = ENXIO;
+ }
+
+ return (error);
+}
+
+/*
+ * remove a queue from the discipline
+ * It is yet unclear what lock to use to protect this operation, the
+ * discipline specific functions will determine and grab it
+ */
+int
+altq_remove_queue(struct pf_altq *a)
+{
+ int error = 0;
+
+ switch (a->scheduler) {
+#ifdef ALTQ_CBQ
+ case ALTQT_CBQ:
+ error = cbq_remove_queue(a);
+ break;
+#endif
+#ifdef ALTQ_PRIQ
+ case ALTQT_PRIQ:
+ error = priq_remove_queue(a);
+ break;
+#endif
+#ifdef ALTQ_HFSC
+ case ALTQT_HFSC:
+ error = hfsc_remove_queue(a);
+ break;
+#endif
+ default:
+ error = ENXIO;
+ }
+
+ return (error);
+}
+
+/*
+ * get queue statistics
+ * Locking is done in the discipline specific functions with regards to
+ * copyout operations, also it is not yet clear which lock to use.
+ */
+int
+altq_getqstats(struct pf_altq *a, void *ubuf, int *nbytes)
+{
+ int error = 0;
+
+ switch (a->scheduler) {
+#ifdef ALTQ_CBQ
+ case ALTQT_CBQ:
+ error = cbq_getqstats(a, ubuf, nbytes);
+ break;
+#endif
+#ifdef ALTQ_PRIQ
+ case ALTQT_PRIQ:
+ error = priq_getqstats(a, ubuf, nbytes);
+ break;
+#endif
+#ifdef ALTQ_HFSC
+ case ALTQT_HFSC:
+ error = hfsc_getqstats(a, ubuf, nbytes);
+ break;
+#endif
+ default:
+ error = ENXIO;
+ }
+
+ return (error);
+}
+
+/*
+ * read and write diffserv field in IPv4 or IPv6 header
+ */
+u_int8_t
+read_dsfield(m, pktattr)
+ struct mbuf *m;
+ struct altq_pktattr *pktattr;
+{
+ struct mbuf *m0;
+ u_int8_t ds_field = 0;
+
+ if (pktattr == NULL ||
+ (pktattr->pattr_af != AF_INET && pktattr->pattr_af != AF_INET6))
+ return ((u_int8_t)0);
+
+ /* verify that pattr_hdr is within the mbuf data */
+ for (m0 = m; m0 != NULL; m0 = m0->m_next)
+ if ((pktattr->pattr_hdr >= m0->m_data) &&
+ (pktattr->pattr_hdr < m0->m_data + m0->m_len))
+ break;
+ if (m0 == NULL) {
+ /* ick, pattr_hdr is stale */
+ pktattr->pattr_af = AF_UNSPEC;
+#ifdef ALTQ_DEBUG
+ printf("read_dsfield: can't locate header!\n");
+#endif
+ return ((u_int8_t)0);
+ }
+
+ if (pktattr->pattr_af == AF_INET) {
+ struct ip *ip = (struct ip *)pktattr->pattr_hdr;
+
+ if (ip->ip_v != 4)
+ return ((u_int8_t)0); /* version mismatch! */
+ ds_field = ip->ip_tos;
+ }
+#ifdef INET6
+ else if (pktattr->pattr_af == AF_INET6) {
+ struct ip6_hdr *ip6 = (struct ip6_hdr *)pktattr->pattr_hdr;
+ u_int32_t flowlabel;
+
+ flowlabel = ntohl(ip6->ip6_flow);
+ if ((flowlabel >> 28) != 6)
+ return ((u_int8_t)0); /* version mismatch! */
+ ds_field = (flowlabel >> 20) & 0xff;
+ }
+#endif
+ return (ds_field);
+}
+
+void
+write_dsfield(m, pktattr, dsfield)
+ struct mbuf *m;
+ struct altq_pktattr *pktattr;
+ u_int8_t dsfield;
+{
+ struct mbuf *m0;
+
+ if (pktattr == NULL ||
+ (pktattr->pattr_af != AF_INET && pktattr->pattr_af != AF_INET6))
+ return;
+
+ /* verify that pattr_hdr is within the mbuf data */
+ for (m0 = m; m0 != NULL; m0 = m0->m_next)
+ if ((pktattr->pattr_hdr >= m0->m_data) &&
+ (pktattr->pattr_hdr < m0->m_data + m0->m_len))
+ break;
+ if (m0 == NULL) {
+ /* ick, pattr_hdr is stale */
+ pktattr->pattr_af = AF_UNSPEC;
+#ifdef ALTQ_DEBUG
+ printf("write_dsfield: can't locate header!\n");
+#endif
+ return;
+ }
+
+ if (pktattr->pattr_af == AF_INET) {
+ struct ip *ip = (struct ip *)pktattr->pattr_hdr;
+ u_int8_t old;
+ int32_t sum;
+
+ if (ip->ip_v != 4)
+ return; /* version mismatch! */
+ old = ip->ip_tos;
+ dsfield |= old & 3; /* leave CU bits */
+ if (old == dsfield)
+ return;
+ ip->ip_tos = dsfield;
+ /*
+ * update checksum (from RFC1624)
+ * HC' = ~(~HC + ~m + m')
+ */
+ sum = ~ntohs(ip->ip_sum) & 0xffff;
+ sum += 0xff00 + (~old & 0xff) + dsfield;
+ sum = (sum >> 16) + (sum & 0xffff);
+ sum += (sum >> 16); /* add carry */
+
+ ip->ip_sum = htons(~sum & 0xffff);
+ }
+#ifdef INET6
+ else if (pktattr->pattr_af == AF_INET6) {
+ struct ip6_hdr *ip6 = (struct ip6_hdr *)pktattr->pattr_hdr;
+ u_int32_t flowlabel;
+
+ flowlabel = ntohl(ip6->ip6_flow);
+ if ((flowlabel >> 28) != 6)
+ return; /* version mismatch! */
+ flowlabel = (flowlabel & 0xf03fffff) | (dsfield << 20);
+ ip6->ip6_flow = htonl(flowlabel);
+ }
+#endif
+ return;
+}
+
+
+/*
+ * high resolution clock support taking advantage of a machine dependent
+ * high resolution time counter (e.g., timestamp counter of intel pentium).
+ * we assume
+ * - 64-bit-long monotonically-increasing counter
+ * - frequency range is 100M-4GHz (CPU speed)
+ */
+/* if pcc is not available or disabled, emulate 256MHz using microtime() */
+#define MACHCLK_SHIFT 8
+
+int machclk_usepcc;
+u_int32_t machclk_freq = 0;
+u_int32_t machclk_per_tick = 0;
+
+#ifdef __alpha__
+#ifdef __FreeBSD__
+extern u_int32_t cycles_per_sec; /* alpha cpu clock frequency */
+#elif defined(__NetBSD__) || defined(__OpenBSD__)
+extern u_int64_t cycles_per_usec; /* alpha cpu clock frequency */
+#endif
+#endif /* __alpha__ */
+#if defined(__i386__) && defined(__NetBSD__)
+extern u_int64_t cpu_tsc_freq;
+#endif /* __alpha__ */
+
+#if (__FreeBSD_version >= 700035)
+/* Update TSC freq with the value indicated by the caller. */
+static void
+tsc_freq_changed(void *arg, const struct cf_level *level, int status)
+{
+ /* If there was an error during the transition, don't do anything. */
+ if (status != 0)
+ return;
+
+ /* Total setting for this level gives the new frequency in MHz. */
+ machclk_freq = level->total_set.freq * 1000000;
+}
+EVENTHANDLER_DEFINE(cpufreq_post_change, tsc_freq_changed, NULL,
+ EVENTHANDLER_PRI_ANY);
+#endif /* __FreeBSD_version >= 700035 */
+
+void
+init_machclk(void)
+{
+#if (__FreeBSD_version >= 600000)
+ callout_init(&tbr_callout, 0);
+#endif
+
+ machclk_usepcc = 1;
+
+#if (!defined(__i386__) && !defined(__alpha__)) || defined(ALTQ_NOPCC)
+ machclk_usepcc = 0;
+#endif
+#if defined(__FreeBSD__) && defined(SMP)
+ machclk_usepcc = 0;
+#endif
+#if defined(__NetBSD__) && defined(MULTIPROCESSOR)
+ machclk_usepcc = 0;
+#endif
+#ifdef __i386__
+ /* check if TSC is available */
+ if (machclk_usepcc == 1 && ((cpu_feature & CPUID_TSC) == 0 ||
+ tsc_is_broken))
+ machclk_usepcc = 0;
+#endif
+
+ if (machclk_usepcc == 0) {
+ /* emulate 256MHz using microtime() */
+ machclk_freq = 1000000 << MACHCLK_SHIFT;
+ machclk_per_tick = machclk_freq / hz;
+#ifdef ALTQ_DEBUG
+ printf("altq: emulate %uHz cpu clock\n", machclk_freq);
+#endif
+ return;
+ }
+
+ /*
+ * if the clock frequency (of Pentium TSC or Alpha PCC) is
+ * accessible, just use it.
+ */
+#ifdef __i386__
+#ifdef __FreeBSD__
+#if (__FreeBSD_version > 300000)
+ machclk_freq = tsc_freq;
+#else
+ machclk_freq = i586_ctr_freq;
+#endif
+#elif defined(__NetBSD__)
+ machclk_freq = (u_int32_t)cpu_tsc_freq;
+#elif defined(__OpenBSD__) && (defined(I586_CPU) || defined(I686_CPU))
+ machclk_freq = pentium_mhz * 1000000;
+#endif
+#elif defined(__alpha__)
+#ifdef __FreeBSD__
+ machclk_freq = cycles_per_sec;
+#elif defined(__NetBSD__) || defined(__OpenBSD__)
+ machclk_freq = (u_int32_t)(cycles_per_usec * 1000000);
+#endif
+#endif /* __alpha__ */
+
+ /*
+ * if we don't know the clock frequency, measure it.
+ */
+ if (machclk_freq == 0) {
+ static int wait;
+ struct timeval tv_start, tv_end;
+ u_int64_t start, end, diff;
+ int timo;
+
+ microtime(&tv_start);
+ start = read_machclk();
+ timo = hz; /* 1 sec */
+ (void)tsleep(&wait, PWAIT | PCATCH, "init_machclk", timo);
+ microtime(&tv_end);
+ end = read_machclk();
+ diff = (u_int64_t)(tv_end.tv_sec - tv_start.tv_sec) * 1000000
+ + tv_end.tv_usec - tv_start.tv_usec;
+ if (diff != 0)
+ machclk_freq = (u_int)((end - start) * 1000000 / diff);
+ }
+
+ machclk_per_tick = machclk_freq / hz;
+
+#ifdef ALTQ_DEBUG
+ printf("altq: CPU clock: %uHz\n", machclk_freq);
+#endif
+}
+
+#if defined(__OpenBSD__) && defined(__i386__)
+static __inline u_int64_t
+rdtsc(void)
+{
+ u_int64_t rv;
+ __asm __volatile(".byte 0x0f, 0x31" : "=A" (rv));
+ return (rv);
+}
+#endif /* __OpenBSD__ && __i386__ */
+
+u_int64_t
+read_machclk(void)
+{
+ u_int64_t val;
+
+ if (machclk_usepcc) {
+#if defined(__i386__)
+ val = rdtsc();
+#elif defined(__alpha__)
+ static u_int32_t last_pcc, upper;
+ u_int32_t pcc;
+
+ /*
+ * for alpha, make a 64bit counter value out of the 32bit
+ * alpha processor cycle counter.
+ * read_machclk must be called within a half of its
+ * wrap-around cycle (about 5 sec for 400MHz cpu) to properly
+ * detect a counter wrap-around.
+ * tbr_timeout calls read_machclk once a second.
+ */
+ pcc = (u_int32_t)alpha_rpcc();
+ if (pcc <= last_pcc)
+ upper++;
+ last_pcc = pcc;
+ val = ((u_int64_t)upper << 32) + pcc;
+#else
+ panic("read_machclk");
+#endif
+ } else {
+ struct timeval tv;
+
+ microtime(&tv);
+ val = (((u_int64_t)(tv.tv_sec - boottime.tv_sec) * 1000000
+ + tv.tv_usec) << MACHCLK_SHIFT);
+ }
+ return (val);
+}
+
+#ifdef ALTQ3_CLFIER_COMPAT
+
+#ifndef IPPROTO_ESP
+#define IPPROTO_ESP 50 /* encapsulating security payload */
+#endif
+#ifndef IPPROTO_AH
+#define IPPROTO_AH 51 /* authentication header */
+#endif
+
+/*
+ * extract flow information from a given packet.
+ * filt_mask shows flowinfo fields required.
+ * we assume the ip header is in one mbuf, and addresses and ports are
+ * in network byte order.
+ */
+int
+altq_extractflow(m, af, flow, filt_bmask)
+ struct mbuf *m;
+ int af;
+ struct flowinfo *flow;
+ u_int32_t filt_bmask;
+{
+
+ switch (af) {
+ case PF_INET: {
+ struct flowinfo_in *fin;
+ struct ip *ip;
+
+ ip = mtod(m, struct ip *);
+
+ if (ip->ip_v != 4)
+ break;
+
+ fin = (struct flowinfo_in *)flow;
+ fin->fi_len = sizeof(struct flowinfo_in);
+ fin->fi_family = AF_INET;
+
+ fin->fi_proto = ip->ip_p;
+ fin->fi_tos = ip->ip_tos;
+
+ fin->fi_src.s_addr = ip->ip_src.s_addr;
+ fin->fi_dst.s_addr = ip->ip_dst.s_addr;
+
+ if (filt_bmask & FIMB4_PORTS)
+ /* if port info is required, extract port numbers */
+ extract_ports4(m, ip, fin);
+ else {
+ fin->fi_sport = 0;
+ fin->fi_dport = 0;
+ fin->fi_gpi = 0;
+ }
+ return (1);
+ }
+
+#ifdef INET6
+ case PF_INET6: {
+ struct flowinfo_in6 *fin6;
+ struct ip6_hdr *ip6;
+
+ ip6 = mtod(m, struct ip6_hdr *);
+ /* should we check the ip version? */
+
+ fin6 = (struct flowinfo_in6 *)flow;
+ fin6->fi6_len = sizeof(struct flowinfo_in6);
+ fin6->fi6_family = AF_INET6;
+
+ fin6->fi6_proto = ip6->ip6_nxt;
+ fin6->fi6_tclass = (ntohl(ip6->ip6_flow) >> 20) & 0xff;
+
+ fin6->fi6_flowlabel = ip6->ip6_flow & htonl(0x000fffff);
+ fin6->fi6_src = ip6->ip6_src;
+ fin6->fi6_dst = ip6->ip6_dst;
+
+ if ((filt_bmask & FIMB6_PORTS) ||
+ ((filt_bmask & FIMB6_PROTO)
+ && ip6->ip6_nxt > IPPROTO_IPV6))
+ /*
+ * if port info is required, or proto is required
+ * but there are option headers, extract port
+ * and protocol numbers.
+ */
+ extract_ports6(m, ip6, fin6);
+ else {
+ fin6->fi6_sport = 0;
+ fin6->fi6_dport = 0;
+ fin6->fi6_gpi = 0;
+ }
+ return (1);
+ }
+#endif /* INET6 */
+
+ default:
+ break;
+ }
+
+ /* failed */
+ flow->fi_len = sizeof(struct flowinfo);
+ flow->fi_family = AF_UNSPEC;
+ return (0);
+}
+
+/*
+ * helper routine to extract port numbers
+ */
+/* structure for ipsec and ipv6 option header template */
+struct _opt6 {
+ u_int8_t opt6_nxt; /* next header */
+ u_int8_t opt6_hlen; /* header extension length */
+ u_int16_t _pad;
+ u_int32_t ah_spi; /* security parameter index
+ for authentication header */
+};
+
+/*
+ * extract port numbers from a ipv4 packet.
+ */
+static int
+extract_ports4(m, ip, fin)
+ struct mbuf *m;
+ struct ip *ip;
+ struct flowinfo_in *fin;
+{
+ struct mbuf *m0;
+ u_short ip_off;
+ u_int8_t proto;
+ int off;
+
+ fin->fi_sport = 0;
+ fin->fi_dport = 0;
+ fin->fi_gpi = 0;
+
+ ip_off = ntohs(ip->ip_off);
+ /* if it is a fragment, try cached fragment info */
+ if (ip_off & IP_OFFMASK) {
+ ip4f_lookup(ip, fin);
+ return (1);
+ }
+
+ /* locate the mbuf containing the protocol header */
+ for (m0 = m; m0 != NULL; m0 = m0->m_next)
+ if (((caddr_t)ip >= m0->m_data) &&
+ ((caddr_t)ip < m0->m_data + m0->m_len))
+ break;
+ if (m0 == NULL) {
+#ifdef ALTQ_DEBUG
+ printf("extract_ports4: can't locate header! ip=%p\n", ip);
+#endif
+ return (0);
+ }
+ off = ((caddr_t)ip - m0->m_data) + (ip->ip_hl << 2);
+ proto = ip->ip_p;
+
+#ifdef ALTQ_IPSEC
+ again:
+#endif
+ while (off >= m0->m_len) {
+ off -= m0->m_len;
+ m0 = m0->m_next;
+ if (m0 == NULL)
+ return (0); /* bogus ip_hl! */
+ }
+ if (m0->m_len < off + 4)
+ return (0);
+
+ switch (proto) {
+ case IPPROTO_TCP:
+ case IPPROTO_UDP: {
+ struct udphdr *udp;
+
+ udp = (struct udphdr *)(mtod(m0, caddr_t) + off);
+ fin->fi_sport = udp->uh_sport;
+ fin->fi_dport = udp->uh_dport;
+ fin->fi_proto = proto;
+ }
+ break;
+
+#ifdef ALTQ_IPSEC
+ case IPPROTO_ESP:
+ if (fin->fi_gpi == 0){
+ u_int32_t *gpi;
+
+ gpi = (u_int32_t *)(mtod(m0, caddr_t) + off);
+ fin->fi_gpi = *gpi;
+ }
+ fin->fi_proto = proto;
+ break;
+
+ case IPPROTO_AH: {
+ /* get next header and header length */
+ struct _opt6 *opt6;
+
+ opt6 = (struct _opt6 *)(mtod(m0, caddr_t) + off);
+ proto = opt6->opt6_nxt;
+ off += 8 + (opt6->opt6_hlen * 4);
+ if (fin->fi_gpi == 0 && m0->m_len >= off + 8)
+ fin->fi_gpi = opt6->ah_spi;
+ }
+ /* goto the next header */
+ goto again;
+#endif /* ALTQ_IPSEC */
+
+ default:
+ fin->fi_proto = proto;
+ return (0);
+ }
+
+ /* if this is a first fragment, cache it. */
+ if (ip_off & IP_MF)
+ ip4f_cache(ip, fin);
+
+ return (1);
+}
+
+#ifdef INET6
+static int
+extract_ports6(m, ip6, fin6)
+ struct mbuf *m;
+ struct ip6_hdr *ip6;
+ struct flowinfo_in6 *fin6;
+{
+ struct mbuf *m0;
+ int off;
+ u_int8_t proto;
+
+ fin6->fi6_gpi = 0;
+ fin6->fi6_sport = 0;
+ fin6->fi6_dport = 0;
+
+ /* locate the mbuf containing the protocol header */
+ for (m0 = m; m0 != NULL; m0 = m0->m_next)
+ if (((caddr_t)ip6 >= m0->m_data) &&
+ ((caddr_t)ip6 < m0->m_data + m0->m_len))
+ break;
+ if (m0 == NULL) {
+#ifdef ALTQ_DEBUG
+ printf("extract_ports6: can't locate header! ip6=%p\n", ip6);
+#endif
+ return (0);
+ }
+ off = ((caddr_t)ip6 - m0->m_data) + sizeof(struct ip6_hdr);
+
+ proto = ip6->ip6_nxt;
+ do {
+ while (off >= m0->m_len) {
+ off -= m0->m_len;
+ m0 = m0->m_next;
+ if (m0 == NULL)
+ return (0);
+ }
+ if (m0->m_len < off + 4)
+ return (0);
+
+ switch (proto) {
+ case IPPROTO_TCP:
+ case IPPROTO_UDP: {
+ struct udphdr *udp;
+
+ udp = (struct udphdr *)(mtod(m0, caddr_t) + off);
+ fin6->fi6_sport = udp->uh_sport;
+ fin6->fi6_dport = udp->uh_dport;
+ fin6->fi6_proto = proto;
+ }
+ return (1);
+
+ case IPPROTO_ESP:
+ if (fin6->fi6_gpi == 0) {
+ u_int32_t *gpi;
+
+ gpi = (u_int32_t *)(mtod(m0, caddr_t) + off);
+ fin6->fi6_gpi = *gpi;
+ }
+ fin6->fi6_proto = proto;
+ return (1);
+
+ case IPPROTO_AH: {
+ /* get next header and header length */
+ struct _opt6 *opt6;
+
+ opt6 = (struct _opt6 *)(mtod(m0, caddr_t) + off);
+ if (fin6->fi6_gpi == 0 && m0->m_len >= off + 8)
+ fin6->fi6_gpi = opt6->ah_spi;
+ proto = opt6->opt6_nxt;
+ off += 8 + (opt6->opt6_hlen * 4);
+ /* goto the next header */
+ break;
+ }
+
+ case IPPROTO_HOPOPTS:
+ case IPPROTO_ROUTING:
+ case IPPROTO_DSTOPTS: {
+ /* get next header and header length */
+ struct _opt6 *opt6;
+
+ opt6 = (struct _opt6 *)(mtod(m0, caddr_t) + off);
+ proto = opt6->opt6_nxt;
+ off += (opt6->opt6_hlen + 1) * 8;
+ /* goto the next header */
+ break;
+ }
+
+ case IPPROTO_FRAGMENT:
+ /* ipv6 fragmentations are not supported yet */
+ default:
+ fin6->fi6_proto = proto;
+ return (0);
+ }
+ } while (1);
+ /*NOTREACHED*/
+}
+#endif /* INET6 */
+
+/*
+ * altq common classifier
+ */
+int
+acc_add_filter(classifier, filter, class, phandle)
+ struct acc_classifier *classifier;
+ struct flow_filter *filter;
+ void *class;
+ u_long *phandle;
+{
+ struct acc_filter *afp, *prev, *tmp;
+ int i, s;
+
+#ifdef INET6
+ if (filter->ff_flow.fi_family != AF_INET &&
+ filter->ff_flow.fi_family != AF_INET6)
+ return (EINVAL);
+#else
+ if (filter->ff_flow.fi_family != AF_INET)
+ return (EINVAL);
+#endif
+
+ MALLOC(afp, struct acc_filter *, sizeof(struct acc_filter),
+ M_DEVBUF, M_WAITOK);
+ if (afp == NULL)
+ return (ENOMEM);
+ bzero(afp, sizeof(struct acc_filter));
+
+ afp->f_filter = *filter;
+ afp->f_class = class;
+
+ i = ACC_WILDCARD_INDEX;
+ if (filter->ff_flow.fi_family == AF_INET) {
+ struct flow_filter *filter4 = &afp->f_filter;
+
+ /*
+ * if address is 0, it's a wildcard. if address mask
+ * isn't set, use full mask.
+ */
+ if (filter4->ff_flow.fi_dst.s_addr == 0)
+ filter4->ff_mask.mask_dst.s_addr = 0;
+ else if (filter4->ff_mask.mask_dst.s_addr == 0)
+ filter4->ff_mask.mask_dst.s_addr = 0xffffffff;
+ if (filter4->ff_flow.fi_src.s_addr == 0)
+ filter4->ff_mask.mask_src.s_addr = 0;
+ else if (filter4->ff_mask.mask_src.s_addr == 0)
+ filter4->ff_mask.mask_src.s_addr = 0xffffffff;
+
+ /* clear extra bits in addresses */
+ filter4->ff_flow.fi_dst.s_addr &=
+ filter4->ff_mask.mask_dst.s_addr;
+ filter4->ff_flow.fi_src.s_addr &=
+ filter4->ff_mask.mask_src.s_addr;
+
+ /*
+ * if dst address is a wildcard, use hash-entry
+ * ACC_WILDCARD_INDEX.
+ */
+ if (filter4->ff_mask.mask_dst.s_addr != 0xffffffff)
+ i = ACC_WILDCARD_INDEX;
+ else
+ i = ACC_GET_HASH_INDEX(filter4->ff_flow.fi_dst.s_addr);
+ }
+#ifdef INET6
+ else if (filter->ff_flow.fi_family == AF_INET6) {
+ struct flow_filter6 *filter6 =
+ (struct flow_filter6 *)&afp->f_filter;
+#ifndef IN6MASK0 /* taken from kame ipv6 */
+#define IN6MASK0 {{{ 0, 0, 0, 0 }}}
+#define IN6MASK128 {{{ 0xffffffff, 0xffffffff, 0xffffffff, 0xffffffff }}}
+ const struct in6_addr in6mask0 = IN6MASK0;
+ const struct in6_addr in6mask128 = IN6MASK128;
+#endif
+
+ if (IN6_IS_ADDR_UNSPECIFIED(&filter6->ff_flow6.fi6_dst))
+ filter6->ff_mask6.mask6_dst = in6mask0;
+ else if (IN6_IS_ADDR_UNSPECIFIED(&filter6->ff_mask6.mask6_dst))
+ filter6->ff_mask6.mask6_dst = in6mask128;
+ if (IN6_IS_ADDR_UNSPECIFIED(&filter6->ff_flow6.fi6_src))
+ filter6->ff_mask6.mask6_src = in6mask0;
+ else if (IN6_IS_ADDR_UNSPECIFIED(&filter6->ff_mask6.mask6_src))
+ filter6->ff_mask6.mask6_src = in6mask128;
+
+ /* clear extra bits in addresses */
+ for (i = 0; i < 16; i++)
+ filter6->ff_flow6.fi6_dst.s6_addr[i] &=
+ filter6->ff_mask6.mask6_dst.s6_addr[i];
+ for (i = 0; i < 16; i++)
+ filter6->ff_flow6.fi6_src.s6_addr[i] &=
+ filter6->ff_mask6.mask6_src.s6_addr[i];
+
+ if (filter6->ff_flow6.fi6_flowlabel == 0)
+ i = ACC_WILDCARD_INDEX;
+ else
+ i = ACC_GET_HASH_INDEX(filter6->ff_flow6.fi6_flowlabel);
+ }
+#endif /* INET6 */
+
+ afp->f_handle = get_filt_handle(classifier, i);
+
+ /* update filter bitmask */
+ afp->f_fbmask = filt2fibmask(filter);
+ classifier->acc_fbmask |= afp->f_fbmask;
+
+ /*
+ * add this filter to the filter list.
+ * filters are ordered from the highest rule number.
+ */
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ prev = NULL;
+ LIST_FOREACH(tmp, &classifier->acc_filters[i], f_chain) {
+ if (tmp->f_filter.ff_ruleno > afp->f_filter.ff_ruleno)
+ prev = tmp;
+ else
+ break;
+ }
+ if (prev == NULL)
+ LIST_INSERT_HEAD(&classifier->acc_filters[i], afp, f_chain);
+ else
+ LIST_INSERT_AFTER(prev, afp, f_chain);
+ splx(s);
+
+ *phandle = afp->f_handle;
+ return (0);
+}
+
+int
+acc_delete_filter(classifier, handle)
+ struct acc_classifier *classifier;
+ u_long handle;
+{
+ struct acc_filter *afp;
+ int s;
+
+ if ((afp = filth_to_filtp(classifier, handle)) == NULL)
+ return (EINVAL);
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ LIST_REMOVE(afp, f_chain);
+ splx(s);
+
+ FREE(afp, M_DEVBUF);
+
+ /* todo: update filt_bmask */
+
+ return (0);
+}
+
+/*
+ * delete filters referencing to the specified class.
+ * if the all flag is not 0, delete all the filters.
+ */
+int
+acc_discard_filters(classifier, class, all)
+ struct acc_classifier *classifier;
+ void *class;
+ int all;
+{
+ struct acc_filter *afp;
+ int i, s;
+
+#ifdef __NetBSD__
+ s = splnet();
+#else
+ s = splimp();
+#endif
+ for (i = 0; i < ACC_FILTER_TABLESIZE; i++) {
+ do {
+ LIST_FOREACH(afp, &classifier->acc_filters[i], f_chain)
+ if (all || afp->f_class == class) {
+ LIST_REMOVE(afp, f_chain);
+ FREE(afp, M_DEVBUF);
+ /* start again from the head */
+ break;
+ }
+ } while (afp != NULL);
+ }
+ splx(s);
+
+ if (all)
+ classifier->acc_fbmask = 0;
+
+ return (0);
+}
+
+void *
+acc_classify(clfier, m, af)
+ void *clfier;
+ struct mbuf *m;
+ int af;
+{
+ struct acc_classifier *classifier;
+ struct flowinfo flow;
+ struct acc_filter *afp;
+ int i;
+
+ classifier = (struct acc_classifier *)clfier;
+ altq_extractflow(m, af, &flow, classifier->acc_fbmask);
+
+ if (flow.fi_family == AF_INET) {
+ struct flowinfo_in *fp = (struct flowinfo_in *)&flow;
+
+ if ((classifier->acc_fbmask & FIMB4_ALL) == FIMB4_TOS) {
+ /* only tos is used */
+ LIST_FOREACH(afp,
+ &classifier->acc_filters[ACC_WILDCARD_INDEX],
+ f_chain)
+ if (apply_tosfilter4(afp->f_fbmask,
+ &afp->f_filter, fp))
+ /* filter matched */
+ return (afp->f_class);
+ } else if ((classifier->acc_fbmask &
+ (~(FIMB4_PROTO|FIMB4_SPORT|FIMB4_DPORT) & FIMB4_ALL))
+ == 0) {
+ /* only proto and ports are used */
+ LIST_FOREACH(afp,
+ &classifier->acc_filters[ACC_WILDCARD_INDEX],
+ f_chain)
+ if (apply_ppfilter4(afp->f_fbmask,
+ &afp->f_filter, fp))
+ /* filter matched */
+ return (afp->f_class);
+ } else {
+ /* get the filter hash entry from its dest address */
+ i = ACC_GET_HASH_INDEX(fp->fi_dst.s_addr);
+ do {
+ /*
+ * go through this loop twice. first for dst
+ * hash, second for wildcards.
+ */
+ LIST_FOREACH(afp, &classifier->acc_filters[i],
+ f_chain)
+ if (apply_filter4(afp->f_fbmask,
+ &afp->f_filter, fp))
+ /* filter matched */
+ return (afp->f_class);
+
+ /*
+ * check again for filters with a dst addr
+ * wildcard.
+ * (daddr == 0 || dmask != 0xffffffff).
+ */
+ if (i != ACC_WILDCARD_INDEX)
+ i = ACC_WILDCARD_INDEX;
+ else
+ break;
+ } while (1);
+ }
+ }
+#ifdef INET6
+ else if (flow.fi_family == AF_INET6) {
+ struct flowinfo_in6 *fp6 = (struct flowinfo_in6 *)&flow;
+
+ /* get the filter hash entry from its flow ID */
+ if (fp6->fi6_flowlabel != 0)
+ i = ACC_GET_HASH_INDEX(fp6->fi6_flowlabel);
+ else
+ /* flowlable can be zero */
+ i = ACC_WILDCARD_INDEX;
+
+ /* go through this loop twice. first for flow hash, second
+ for wildcards. */
+ do {
+ LIST_FOREACH(afp, &classifier->acc_filters[i], f_chain)
+ if (apply_filter6(afp->f_fbmask,
+ (struct flow_filter6 *)&afp->f_filter,
+ fp6))
+ /* filter matched */
+ return (afp->f_class);
+
+ /*
+ * check again for filters with a wildcard.
+ */
+ if (i != ACC_WILDCARD_INDEX)
+ i = ACC_WILDCARD_INDEX;
+ else
+ break;
+ } while (1);
+ }
+#endif /* INET6 */
+
+ /* no filter matched */
+ return (NULL);
+}
+
+static int
+apply_filter4(fbmask, filt, pkt)
+ u_int32_t fbmask;
+ struct flow_filter *filt;
+ struct flowinfo_in *pkt;
+{
+ if (filt->ff_flow.fi_family != AF_INET)
+ return (0);
+ if ((fbmask & FIMB4_SPORT) && filt->ff_flow.fi_sport != pkt->fi_sport)
+ return (0);
+ if ((fbmask & FIMB4_DPORT) && filt->ff_flow.fi_dport != pkt->fi_dport)
+ return (0);
+ if ((fbmask & FIMB4_DADDR) &&
+ filt->ff_flow.fi_dst.s_addr !=
+ (pkt->fi_dst.s_addr & filt->ff_mask.mask_dst.s_addr))
+ return (0);
+ if ((fbmask & FIMB4_SADDR) &&
+ filt->ff_flow.fi_src.s_addr !=
+ (pkt->fi_src.s_addr & filt->ff_mask.mask_src.s_addr))
+ return (0);
+ if ((fbmask & FIMB4_PROTO) && filt->ff_flow.fi_proto != pkt->fi_proto)
+ return (0);
+ if ((fbmask & FIMB4_TOS) && filt->ff_flow.fi_tos !=
+ (pkt->fi_tos & filt->ff_mask.mask_tos))
+ return (0);
+ if ((fbmask & FIMB4_GPI) && filt->ff_flow.fi_gpi != (pkt->fi_gpi))
+ return (0);
+ /* match */
+ return (1);
+}
+
+/*
+ * filter matching function optimized for a common case that checks
+ * only protocol and port numbers
+ */
+static int
+apply_ppfilter4(fbmask, filt, pkt)
+ u_int32_t fbmask;
+ struct flow_filter *filt;
+ struct flowinfo_in *pkt;
+{
+ if (filt->ff_flow.fi_family != AF_INET)
+ return (0);
+ if ((fbmask & FIMB4_SPORT) && filt->ff_flow.fi_sport != pkt->fi_sport)
+ return (0);
+ if ((fbmask & FIMB4_DPORT) && filt->ff_flow.fi_dport != pkt->fi_dport)
+ return (0);
+ if ((fbmask & FIMB4_PROTO) && filt->ff_flow.fi_proto != pkt->fi_proto)
+ return (0);
+ /* match */
+ return (1);
+}
+
+/*
+ * filter matching function only for tos field.
+ */
+static int
+apply_tosfilter4(fbmask, filt, pkt)
+ u_int32_t fbmask;
+ struct flow_filter *filt;
+ struct flowinfo_in *pkt;
+{
+ if (filt->ff_flow.fi_family != AF_INET)
+ return (0);
+ if ((fbmask & FIMB4_TOS) && filt->ff_flow.fi_tos !=
+ (pkt->fi_tos & filt->ff_mask.mask_tos))
+ return (0);
+ /* match */
+ return (1);
+}
+
+#ifdef INET6
+static int
+apply_filter6(fbmask, filt, pkt)
+ u_int32_t fbmask;
+ struct flow_filter6 *filt;
+ struct flowinfo_in6 *pkt;
+{
+ int i;
+
+ if (filt->ff_flow6.fi6_family != AF_INET6)
+ return (0);
+ if ((fbmask & FIMB6_FLABEL) &&
+ filt->ff_flow6.fi6_flowlabel != pkt->fi6_flowlabel)
+ return (0);
+ if ((fbmask & FIMB6_PROTO) &&
+ filt->ff_flow6.fi6_proto != pkt->fi6_proto)
+ return (0);
+ if ((fbmask & FIMB6_SPORT) &&
+ filt->ff_flow6.fi6_sport != pkt->fi6_sport)
+ return (0);
+ if ((fbmask & FIMB6_DPORT) &&
+ filt->ff_flow6.fi6_dport != pkt->fi6_dport)
+ return (0);
+ if (fbmask & FIMB6_SADDR) {
+ for (i = 0; i < 4; i++)
+ if (filt->ff_flow6.fi6_src.s6_addr32[i] !=
+ (pkt->fi6_src.s6_addr32[i] &
+ filt->ff_mask6.mask6_src.s6_addr32[i]))
+ return (0);
+ }
+ if (fbmask & FIMB6_DADDR) {
+ for (i = 0; i < 4; i++)
+ if (filt->ff_flow6.fi6_dst.s6_addr32[i] !=
+ (pkt->fi6_dst.s6_addr32[i] &
+ filt->ff_mask6.mask6_dst.s6_addr32[i]))
+ return (0);
+ }
+ if ((fbmask & FIMB6_TCLASS) &&
+ filt->ff_flow6.fi6_tclass !=
+ (pkt->fi6_tclass & filt->ff_mask6.mask6_tclass))
+ return (0);
+ if ((fbmask & FIMB6_GPI) &&
+ filt->ff_flow6.fi6_gpi != pkt->fi6_gpi)
+ return (0);
+ /* match */
+ return (1);
+}
+#endif /* INET6 */
+
+/*
+ * filter handle:
+ * bit 20-28: index to the filter hash table
+ * bit 0-19: unique id in the hash bucket.
+ */
+static u_long
+get_filt_handle(classifier, i)
+ struct acc_classifier *classifier;
+ int i;
+{
+ static u_long handle_number = 1;
+ u_long handle;
+ struct acc_filter *afp;
+
+ while (1) {
+ handle = handle_number++ & 0x000fffff;
+
+ if (LIST_EMPTY(&classifier->acc_filters[i]))
+ break;
+
+ LIST_FOREACH(afp, &classifier->acc_filters[i], f_chain)
+ if ((afp->f_handle & 0x000fffff) == handle)
+ break;
+ if (afp == NULL)
+ break;
+ /* this handle is already used, try again */
+ }
+
+ return ((i << 20) | handle);
+}
+
+/* convert filter handle to filter pointer */
+static struct acc_filter *
+filth_to_filtp(classifier, handle)
+ struct acc_classifier *classifier;
+ u_long handle;
+{
+ struct acc_filter *afp;
+ int i;
+
+ i = ACC_GET_HINDEX(handle);
+
+ LIST_FOREACH(afp, &classifier->acc_filters[i], f_chain)
+ if (afp->f_handle == handle)
+ return (afp);
+
+ return (NULL);
+}
+
+/* create flowinfo bitmask */
+static u_int32_t
+filt2fibmask(filt)
+ struct flow_filter *filt;
+{
+ u_int32_t mask = 0;
+#ifdef INET6
+ struct flow_filter6 *filt6;
+#endif
+
+ switch (filt->ff_flow.fi_family) {
+ case AF_INET:
+ if (filt->ff_flow.fi_proto != 0)
+ mask |= FIMB4_PROTO;
+ if (filt->ff_flow.fi_tos != 0)
+ mask |= FIMB4_TOS;
+ if (filt->ff_flow.fi_dst.s_addr != 0)
+ mask |= FIMB4_DADDR;
+ if (filt->ff_flow.fi_src.s_addr != 0)
+ mask |= FIMB4_SADDR;
+ if (filt->ff_flow.fi_sport != 0)
+ mask |= FIMB4_SPORT;
+ if (filt->ff_flow.fi_dport != 0)
+ mask |= FIMB4_DPORT;
+ if (filt->ff_flow.fi_gpi != 0)
+ mask |= FIMB4_GPI;
+ break;
+#ifdef INET6
+ case AF_INET6:
+ filt6 = (struct flow_filter6 *)filt;
+
+ if (filt6->ff_flow6.fi6_proto != 0)
+ mask |= FIMB6_PROTO;
+ if (filt6->ff_flow6.fi6_tclass != 0)
+ mask |= FIMB6_TCLASS;
+ if (!IN6_IS_ADDR_UNSPECIFIED(&filt6->ff_flow6.fi6_dst))
+ mask |= FIMB6_DADDR;
+ if (!IN6_IS_ADDR_UNSPECIFIED(&filt6->ff_flow6.fi6_src))
+ mask |= FIMB6_SADDR;
+ if (filt6->ff_flow6.fi6_sport != 0)
+ mask |= FIMB6_SPORT;
+ if (filt6->ff_flow6.fi6_dport != 0)
+ mask |= FIMB6_DPORT;
+ if (filt6->ff_flow6.fi6_gpi != 0)
+ mask |= FIMB6_GPI;
+ if (filt6->ff_flow6.fi6_flowlabel != 0)
+ mask |= FIMB6_FLABEL;
+ break;
+#endif /* INET6 */
+ }
+ return (mask);
+}
+
+
+/*
+ * helper functions to handle IPv4 fragments.
+ * currently only in-sequence fragments are handled.
+ * - fragment info is cached in a LRU list.
+ * - when a first fragment is found, cache its flow info.
+ * - when a non-first fragment is found, lookup the cache.
+ */
+
+struct ip4_frag {
+ TAILQ_ENTRY(ip4_frag) ip4f_chain;
+ char ip4f_valid;
+ u_short ip4f_id;
+ struct flowinfo_in ip4f_info;
+};
+
+static TAILQ_HEAD(ip4f_list, ip4_frag) ip4f_list; /* IPv4 fragment cache */
+
+#define IP4F_TABSIZE 16 /* IPv4 fragment cache size */
+
+
+static void
+ip4f_cache(ip, fin)
+ struct ip *ip;
+ struct flowinfo_in *fin;
+{
+ struct ip4_frag *fp;
+
+ if (TAILQ_EMPTY(&ip4f_list)) {
+ /* first time call, allocate fragment cache entries. */
+ if (ip4f_init() < 0)
+ /* allocation failed! */
+ return;
+ }
+
+ fp = ip4f_alloc();
+ fp->ip4f_id = ip->ip_id;
+ fp->ip4f_info.fi_proto = ip->ip_p;
+ fp->ip4f_info.fi_src.s_addr = ip->ip_src.s_addr;
+ fp->ip4f_info.fi_dst.s_addr = ip->ip_dst.s_addr;
+
+ /* save port numbers */
+ fp->ip4f_info.fi_sport = fin->fi_sport;
+ fp->ip4f_info.fi_dport = fin->fi_dport;
+ fp->ip4f_info.fi_gpi = fin->fi_gpi;
+}
+
+static int
+ip4f_lookup(ip, fin)
+ struct ip *ip;
+ struct flowinfo_in *fin;
+{
+ struct ip4_frag *fp;
+
+ for (fp = TAILQ_FIRST(&ip4f_list); fp != NULL && fp->ip4f_valid;
+ fp = TAILQ_NEXT(fp, ip4f_chain))
+ if (ip->ip_id == fp->ip4f_id &&
+ ip->ip_src.s_addr == fp->ip4f_info.fi_src.s_addr &&
+ ip->ip_dst.s_addr == fp->ip4f_info.fi_dst.s_addr &&
+ ip->ip_p == fp->ip4f_info.fi_proto) {
+
+ /* found the matching entry */
+ fin->fi_sport = fp->ip4f_info.fi_sport;
+ fin->fi_dport = fp->ip4f_info.fi_dport;
+ fin->fi_gpi = fp->ip4f_info.fi_gpi;
+
+ if ((ntohs(ip->ip_off) & IP_MF) == 0)
+ /* this is the last fragment,
+ release the entry. */
+ ip4f_free(fp);
+
+ return (1);
+ }
+
+ /* no matching entry found */
+ return (0);
+}
+
+static int
+ip4f_init(void)
+{
+ struct ip4_frag *fp;
+ int i;
+
+ TAILQ_INIT(&ip4f_list);
+ for (i=0; i<IP4F_TABSIZE; i++) {
+ MALLOC(fp, struct ip4_frag *, sizeof(struct ip4_frag),
+ M_DEVBUF, M_NOWAIT);
+ if (fp == NULL) {
+ printf("ip4f_init: can't alloc %dth entry!\n", i);
+ if (i == 0)
+ return (-1);
+ return (0);
+ }
+ fp->ip4f_valid = 0;
+ TAILQ_INSERT_TAIL(&ip4f_list, fp, ip4f_chain);
+ }
+ return (0);
+}
+
+static struct ip4_frag *
+ip4f_alloc(void)
+{
+ struct ip4_frag *fp;
+
+ /* reclaim an entry at the tail, put it at the head */
+ fp = TAILQ_LAST(&ip4f_list, ip4f_list);
+ TAILQ_REMOVE(&ip4f_list, fp, ip4f_chain);
+ fp->ip4f_valid = 1;
+ TAILQ_INSERT_HEAD(&ip4f_list, fp, ip4f_chain);
+ return (fp);
+}
+
+static void
+ip4f_free(fp)
+ struct ip4_frag *fp;
+{
+ TAILQ_REMOVE(&ip4f_list, fp, ip4f_chain);
+ fp->ip4f_valid = 0;
+ TAILQ_INSERT_TAIL(&ip4f_list, fp, ip4f_chain);
+}
+
+#endif /* ALTQ3_CLFIER_COMPAT */
diff --git a/sys/contrib/altq/altq/altq_var.h b/sys/contrib/altq/altq/altq_var.h
new file mode 100644
index 0000000..4c4fc29
--- /dev/null
+++ b/sys/contrib/altq/altq/altq_var.h
@@ -0,0 +1,265 @@
+/* $FreeBSD$ */
+/* $KAME: altq_var.h,v 1.16 2003/10/03 05:05:15 kjc Exp $ */
+
+/*
+ * Copyright (C) 1998-2003
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _ALTQ_ALTQ_VAR_H_
+#define _ALTQ_ALTQ_VAR_H_
+
+#ifdef _KERNEL
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/queue.h>
+
+#ifdef ALTQ3_CLFIER_COMPAT
+/*
+ * filter structure for altq common classifier
+ */
+struct acc_filter {
+ LIST_ENTRY(acc_filter) f_chain;
+ void *f_class; /* pointer to the class */
+ u_long f_handle; /* filter id */
+ u_int32_t f_fbmask; /* filter bitmask */
+ struct flow_filter f_filter; /* filter value */
+};
+
+/*
+ * XXX ACC_FILTER_TABLESIZE can't be larger than 2048 unless we fix
+ * the handle assignment.
+ */
+#define ACC_FILTER_TABLESIZE (256+1)
+#define ACC_FILTER_MASK (ACC_FILTER_TABLESIZE - 2)
+#define ACC_WILDCARD_INDEX (ACC_FILTER_TABLESIZE - 1)
+#ifdef __GNUC__
+#define ACC_GET_HASH_INDEX(addr) \
+ ({int x = (addr) + ((addr) >> 16); (x + (x >> 8)) & ACC_FILTER_MASK;})
+#else
+#define ACC_GET_HASH_INDEX(addr) \
+ (((addr) + ((addr) >> 8) + ((addr) >> 16) + ((addr) >> 24)) \
+ & ACC_FILTER_MASK)
+#endif
+#define ACC_GET_HINDEX(handle) ((handle) >> 20)
+
+#if (__FreeBSD_version > 500000)
+#define ACC_LOCK_INIT(ac) mtx_init(&(ac)->acc_mtx, "classifier", MTX_DEF)
+#define ACC_LOCK_DESTROY(ac) mtx_destroy(&(ac)->acc_mtx)
+#define ACC_LOCK(ac) mtx_lock(&(ac)->acc_mtx)
+#define ACC_UNLOCK(ac) mtx_unlock(&(ac)->acc_mtx)
+#else
+#define ACC_LOCK_INIT(ac)
+#define ACC_LOCK_DESTROY(ac)
+#define ACC_LOCK(ac)
+#define ACC_UNLOCK(ac)
+#endif
+
+struct acc_classifier {
+ u_int32_t acc_fbmask;
+ LIST_HEAD(filt, acc_filter) acc_filters[ACC_FILTER_TABLESIZE];
+
+#if (__FreeBSD_version > 500000)
+ struct mtx acc_mtx;
+#endif
+};
+
+/*
+ * flowinfo mask bits used by classifier
+ */
+/* for ipv4 */
+#define FIMB4_PROTO 0x0001
+#define FIMB4_TOS 0x0002
+#define FIMB4_DADDR 0x0004
+#define FIMB4_SADDR 0x0008
+#define FIMB4_DPORT 0x0010
+#define FIMB4_SPORT 0x0020
+#define FIMB4_GPI 0x0040
+#define FIMB4_ALL 0x007f
+/* for ipv6 */
+#define FIMB6_PROTO 0x0100
+#define FIMB6_TCLASS 0x0200
+#define FIMB6_DADDR 0x0400
+#define FIMB6_SADDR 0x0800
+#define FIMB6_DPORT 0x1000
+#define FIMB6_SPORT 0x2000
+#define FIMB6_GPI 0x4000
+#define FIMB6_FLABEL 0x8000
+#define FIMB6_ALL 0xff00
+
+#define FIMB_ALL (FIMB4_ALL|FIMB6_ALL)
+
+#define FIMB4_PORTS (FIMB4_DPORT|FIMB4_SPORT|FIMB4_GPI)
+#define FIMB6_PORTS (FIMB6_DPORT|FIMB6_SPORT|FIMB6_GPI)
+#endif /* ALTQ3_CLFIER_COMPAT */
+
+/*
+ * machine dependent clock
+ * a 64bit high resolution time counter.
+ */
+extern int machclk_usepcc;
+extern u_int32_t machclk_freq;
+extern u_int32_t machclk_per_tick;
+extern void init_machclk(void);
+extern u_int64_t read_machclk(void);
+
+/*
+ * debug support
+ */
+#ifdef ALTQ_DEBUG
+#ifdef __STDC__
+#define ASSERT(e) ((e) ? (void)0 : altq_assert(__FILE__, __LINE__, #e))
+#else /* PCC */
+#define ASSERT(e) ((e) ? (void)0 : altq_assert(__FILE__, __LINE__, "e"))
+#endif
+#else
+#define ASSERT(e) ((void)0)
+#endif
+
+/*
+ * misc stuff for compatibility
+ */
+/* ioctl cmd type */
+#if defined(__FreeBSD__) && (__FreeBSD__ < 3)
+typedef int ioctlcmd_t;
+#else
+typedef u_long ioctlcmd_t;
+#endif
+
+/*
+ * queue macros:
+ * the interface of TAILQ_LAST macro changed after the introduction
+ * of softupdate. redefine it here to make it work with pre-2.2.7.
+ */
+#undef TAILQ_LAST
+#define TAILQ_LAST(head, headname) \
+ (*(((struct headname *)((head)->tqh_last))->tqh_last))
+
+#ifndef TAILQ_EMPTY
+#define TAILQ_EMPTY(head) ((head)->tqh_first == NULL)
+#endif
+#ifndef TAILQ_FOREACH
+#define TAILQ_FOREACH(var, head, field) \
+ for (var = TAILQ_FIRST(head); var; var = TAILQ_NEXT(var, field))
+#endif
+
+/* macro for timeout/untimeout */
+#if (__FreeBSD_version > 300000) || defined(__NetBSD__)
+/* use callout */
+#include <sys/callout.h>
+
+#if (__FreeBSD_version > 500000)
+#define CALLOUT_INIT(c) callout_init((c), 0)
+#else
+#define CALLOUT_INIT(c) callout_init((c))
+#endif
+#define CALLOUT_RESET(c,t,f,a) callout_reset((c),(t),(f),(a))
+#define CALLOUT_STOP(c) callout_stop((c))
+#if !defined(CALLOUT_INITIALIZER) && (__FreeBSD_version < 600000)
+#define CALLOUT_INITIALIZER { { { NULL } }, 0, NULL, NULL, 0 }
+#endif
+#elif defined(__OpenBSD__)
+#include <sys/timeout.h>
+/* callout structure as a wrapper of struct timeout */
+struct callout {
+ struct timeout c_to;
+};
+#define CALLOUT_INIT(c) do { bzero((c), sizeof(*(c))); } while (/*CONSTCOND*/ 0)
+#define CALLOUT_RESET(c,t,f,a) do { if (!timeout_initialized(&(c)->c_to)) \
+ timeout_set(&(c)->c_to, (f), (a)); \
+ timeout_add(&(c)->c_to, (t)); } while (/*CONSTCOND*/ 0)
+#define CALLOUT_STOP(c) timeout_del(&(c)->c_to)
+#define CALLOUT_INITIALIZER { { { NULL }, NULL, NULL, 0, 0 } }
+#else
+/* use old-style timeout/untimeout */
+/* dummy callout structure */
+struct callout {
+ void *c_arg; /* function argument */
+ void (*c_func)(void *); /* functiuon to call */
+};
+#define CALLOUT_INIT(c) do { bzero((c), sizeof(*(c))); } while (/*CONSTCOND*/ 0)
+#define CALLOUT_RESET(c,t,f,a) do { (c)->c_arg = (a); \
+ (c)->c_func = (f); \
+ timeout((f),(a),(t)); } while (/*CONSTCOND*/ 0)
+#define CALLOUT_STOP(c) untimeout((c)->c_func,(c)->c_arg)
+#define CALLOUT_INITIALIZER { NULL, NULL }
+#endif
+#if !defined(__FreeBSD__)
+typedef void (timeout_t)(void *);
+#endif
+
+#define m_pktlen(m) ((m)->m_pkthdr.len)
+
+struct ifnet; struct mbuf;
+struct pf_altq;
+#ifdef ALTQ3_CLFIER_COMPAT
+struct flowinfo;
+#endif
+
+void *altq_lookup(char *, int);
+#ifdef ALTQ3_CLFIER_COMPAT
+int altq_extractflow(struct mbuf *, int, struct flowinfo *, u_int32_t);
+int acc_add_filter(struct acc_classifier *, struct flow_filter *,
+ void *, u_long *);
+int acc_delete_filter(struct acc_classifier *, u_long);
+int acc_discard_filters(struct acc_classifier *, void *, int);
+void *acc_classify(void *, struct mbuf *, int);
+#endif
+u_int8_t read_dsfield(struct mbuf *, struct altq_pktattr *);
+void write_dsfield(struct mbuf *, struct altq_pktattr *, u_int8_t);
+void altq_assert(const char *, int, const char *);
+int tbr_set(struct ifaltq *, struct tb_profile *);
+int tbr_get(struct ifaltq *, struct tb_profile *);
+
+int altq_pfattach(struct pf_altq *);
+int altq_pfdetach(struct pf_altq *);
+int altq_add(struct pf_altq *);
+int altq_remove(struct pf_altq *);
+int altq_add_queue(struct pf_altq *);
+int altq_remove_queue(struct pf_altq *);
+int altq_getqstats(struct pf_altq *, void *, int *);
+
+int cbq_pfattach(struct pf_altq *);
+int cbq_add_altq(struct pf_altq *);
+int cbq_remove_altq(struct pf_altq *);
+int cbq_add_queue(struct pf_altq *);
+int cbq_remove_queue(struct pf_altq *);
+int cbq_getqstats(struct pf_altq *, void *, int *);
+
+int priq_pfattach(struct pf_altq *);
+int priq_add_altq(struct pf_altq *);
+int priq_remove_altq(struct pf_altq *);
+int priq_add_queue(struct pf_altq *);
+int priq_remove_queue(struct pf_altq *);
+int priq_getqstats(struct pf_altq *, void *, int *);
+
+int hfsc_pfattach(struct pf_altq *);
+int hfsc_add_altq(struct pf_altq *);
+int hfsc_remove_altq(struct pf_altq *);
+int hfsc_add_queue(struct pf_altq *);
+int hfsc_remove_queue(struct pf_altq *);
+int hfsc_getqstats(struct pf_altq *, void *, int *);
+
+#endif /* _KERNEL */
+#endif /* _ALTQ_ALTQ_VAR_H_ */
diff --git a/sys/contrib/altq/altq/altqconf.h b/sys/contrib/altq/altq/altqconf.h
new file mode 100644
index 0000000..4d3921c
--- /dev/null
+++ b/sys/contrib/altq/altq/altqconf.h
@@ -0,0 +1,29 @@
+/* $OpenBSD: altqconf.h,v 1.1 2001/06/27 05:28:36 kjc Exp $ */
+/* $NetBSD: altqconf.h,v 1.2 2001/05/30 11:57:16 mrg Exp $ */
+
+#if defined(_KERNEL_OPT) || defined(__OpenBSD__)
+
+#if defined(_KERNEL_OPT)
+#include "opt_altq_enabled.h"
+#endif
+
+#include <sys/conf.h>
+
+#ifdef ALTQ
+#define NALTQ 1
+#else
+#define NALTQ 0
+#endif
+
+cdev_decl(altq);
+
+#ifdef __OpenBSD__
+#define cdev_altq_init(c,n) { \
+ dev_init(c,n,open), dev_init(c,n,close), (dev_type_read((*))) enodev, \
+ (dev_type_write((*))) enodev, dev_init(c,n,ioctl), \
+ (dev_type_stop((*))) enodev, 0, (dev_type_select((*))) enodev, \
+ (dev_type_mmap((*))) enodev }
+#else
+#define cdev_altq_init(x,y) cdev__oci_init(x,y)
+#endif
+#endif /* defined(_KERNEL_OPT) || defined(__OpenBSD__) */
diff --git a/sys/contrib/altq/altq/if_altq.h b/sys/contrib/altq/altq/if_altq.h
new file mode 100644
index 0000000..0676e40
--- /dev/null
+++ b/sys/contrib/altq/altq/if_altq.h
@@ -0,0 +1,191 @@
+/* $FreeBSD$ */
+/* $KAME: if_altq.h,v 1.11 2003/07/10 12:07:50 kjc Exp $ */
+
+/*
+ * Copyright (C) 1997-2003
+ * Sony Computer Science Laboratories Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY SONY CSL AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL SONY CSL OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ */
+#ifndef _ALTQ_IF_ALTQ_H_
+#define _ALTQ_IF_ALTQ_H_
+
+#if (defined(__FreeBSD__) && __FreeBSD_version >= 500000)
+#include <sys/lock.h> /* XXX */
+#include <sys/mutex.h> /* XXX */
+#include <sys/event.h> /* XXX */
+#endif
+
+#ifdef _KERNEL_OPT
+#include <altq/altqconf.h>
+#endif
+
+struct altq_pktattr; struct tb_regulator; struct top_cdnr;
+
+/*
+ * Structure defining a queue for a network interface.
+ */
+struct ifaltq {
+ /* fields compatible with struct ifqueue */
+ struct mbuf *ifq_head;
+ struct mbuf *ifq_tail;
+ int ifq_len;
+ int ifq_maxlen;
+ int ifq_drops;
+#if (defined(__FreeBSD__) && __FreeBSD_version >= 500000)
+ struct mtx ifq_mtx;
+#endif
+
+ /* driver owned queue (used for bulk dequeue and prepend) UNLOCKED */
+ struct mbuf *ifq_drv_head;
+ struct mbuf *ifq_drv_tail;
+ int ifq_drv_len;
+ int ifq_drv_maxlen;
+
+ /* alternate queueing related fields */
+ int altq_type; /* discipline type */
+ int altq_flags; /* flags (e.g. ready, in-use) */
+ void *altq_disc; /* for discipline-specific use */
+ struct ifnet *altq_ifp; /* back pointer to interface */
+
+ int (*altq_enqueue)(struct ifaltq *, struct mbuf *,
+ struct altq_pktattr *);
+ struct mbuf *(*altq_dequeue)(struct ifaltq *, int);
+ int (*altq_request)(struct ifaltq *, int, void *);
+
+ /* classifier fields */
+ void *altq_clfier; /* classifier-specific use */
+ void *(*altq_classify)(void *, struct mbuf *, int);
+
+ /* token bucket regulator */
+ struct tb_regulator *altq_tbr;
+
+ /* input traffic conditioner (doesn't belong to the output queue...) */
+ struct top_cdnr *altq_cdnr;
+};
+
+
+#ifdef _KERNEL
+
+/*
+ * packet attributes used by queueing disciplines.
+ * pattr_class is a discipline-dependent scheduling class that is
+ * set by a classifier.
+ * pattr_hdr and pattr_af may be used by a discipline to access
+ * the header within a mbuf. (e.g. ECN needs to update the CE bit)
+ * note that pattr_hdr could be stale after m_pullup, though link
+ * layer output routines usually don't use m_pullup. link-level
+ * compression also invalidates these fields. thus, pattr_hdr needs
+ * to be verified when a discipline touches the header.
+ */
+struct altq_pktattr {
+ void *pattr_class; /* sched class set by classifier */
+ int pattr_af; /* address family */
+ caddr_t pattr_hdr; /* saved header position in mbuf */
+};
+
+/*
+ * mbuf tag to carry a queue id (and hints for ECN).
+ */
+struct altq_tag {
+ u_int32_t qid; /* queue id */
+ /* hints for ecn */
+ int af; /* address family */
+ void *hdr; /* saved header position in mbuf */
+};
+
+/*
+ * a token-bucket regulator limits the rate that a network driver can
+ * dequeue packets from the output queue.
+ * modern cards are able to buffer a large amount of packets and dequeue
+ * too many packets at a time. this bursty dequeue behavior makes it
+ * impossible to schedule packets by queueing disciplines.
+ * a token-bucket is used to control the burst size in a device
+ * independent manner.
+ */
+struct tb_regulator {
+ int64_t tbr_rate; /* (scaled) token bucket rate */
+ int64_t tbr_depth; /* (scaled) token bucket depth */
+
+ int64_t tbr_token; /* (scaled) current token */
+ int64_t tbr_filluptime; /* (scaled) time to fill up bucket */
+ u_int64_t tbr_last; /* last time token was updated */
+
+ int tbr_lastop; /* last dequeue operation type
+ needed for poll-and-dequeue */
+};
+
+/* if_altqflags */
+#define ALTQF_READY 0x01 /* driver supports alternate queueing */
+#define ALTQF_ENABLED 0x02 /* altq is in use */
+#define ALTQF_CLASSIFY 0x04 /* classify packets */
+#define ALTQF_CNDTNING 0x08 /* altq traffic conditioning is enabled */
+#define ALTQF_DRIVER1 0x40 /* driver specific */
+
+/* if_altqflags set internally only: */
+#define ALTQF_CANTCHANGE (ALTQF_READY)
+
+/* altq_dequeue 2nd arg */
+#define ALTDQ_REMOVE 1 /* dequeue mbuf from the queue */
+#define ALTDQ_POLL 2 /* don't dequeue mbuf from the queue */
+
+/* altq request types (currently only purge is defined) */
+#define ALTRQ_PURGE 1 /* purge all packets */
+
+#define ALTQ_IS_READY(ifq) ((ifq)->altq_flags & ALTQF_READY)
+#define ALTQ_IS_ENABLED(ifq) ((ifq)->altq_flags & ALTQF_ENABLED)
+#define ALTQ_NEEDS_CLASSIFY(ifq) ((ifq)->altq_flags & ALTQF_CLASSIFY)
+#define ALTQ_IS_CNDTNING(ifq) ((ifq)->altq_flags & ALTQF_CNDTNING)
+
+#define ALTQ_SET_CNDTNING(ifq) ((ifq)->altq_flags |= ALTQF_CNDTNING)
+#define ALTQ_CLEAR_CNDTNING(ifq) ((ifq)->altq_flags &= ~ALTQF_CNDTNING)
+#define ALTQ_IS_ATTACHED(ifq) ((ifq)->altq_disc != NULL)
+
+#define ALTQ_ENQUEUE(ifq, m, pa, err) \
+ (err) = (*(ifq)->altq_enqueue)((ifq),(m),(pa))
+#define ALTQ_DEQUEUE(ifq, m) \
+ (m) = (*(ifq)->altq_dequeue)((ifq), ALTDQ_REMOVE)
+#define ALTQ_POLL(ifq, m) \
+ (m) = (*(ifq)->altq_dequeue)((ifq), ALTDQ_POLL)
+#define ALTQ_PURGE(ifq) \
+ (void)(*(ifq)->altq_request)((ifq), ALTRQ_PURGE, (void *)0)
+#define ALTQ_IS_EMPTY(ifq) ((ifq)->ifq_len == 0)
+#define TBR_IS_ENABLED(ifq) ((ifq)->altq_tbr != NULL)
+
+extern int altq_attach(struct ifaltq *, int, void *,
+ int (*)(struct ifaltq *, struct mbuf *,
+ struct altq_pktattr *),
+ struct mbuf *(*)(struct ifaltq *, int),
+ int (*)(struct ifaltq *, int, void *),
+ void *,
+ void *(*)(void *, struct mbuf *, int));
+extern int altq_detach(struct ifaltq *);
+extern int altq_enable(struct ifaltq *);
+extern int altq_disable(struct ifaltq *);
+extern struct mbuf *(*tbr_dequeue_ptr)(struct ifaltq *, int);
+extern int (*altq_input)(struct mbuf *, int);
+#if 0 /* ALTQ3_CLFIER_COMPAT */
+void altq_etherclassify(struct ifaltq *, struct mbuf *, struct altq_pktattr *);
+#endif
+#endif /* _KERNEL */
+
+#endif /* _ALTQ_IF_ALTQ_H_ */
diff --git a/sys/contrib/dev/acpica/CHANGES.txt b/sys/contrib/dev/acpica/CHANGES.txt
new file mode 100644
index 0000000..f26ed47
--- /dev/null
+++ b/sys/contrib/dev/acpica/CHANGES.txt
@@ -0,0 +1,8448 @@
+----------------------------------------
+20 March 2007. Summary of changes for version 20070320:
+
+1) ACPI CA Core Subsystem:
+
+Implemented a change to the order of interpretation and
+evaluation of AML operand objects within the AML interpreter. The
+interpreter now evaluates operands in the order that they appear
+in the AML stream (and the corresponding ASL code), instead of in
+the reverse order (after the entire operand list has been
+parsed). The previous behavior caused several subtle
+incompatibilities with the Microsoft AML interpreter as well as
+being somewhat non-intuitive. BZ 7871, local BZ 263. Valery
+Podrezov.
+
+Implemented a change to the ACPI Global Lock support. All
+interfaces to the global lock now allow the same thread to
+acquire the lock multiple times. This affects the
+AcpiAcquireGlobalLock external interface to the global lock as
+well as the internal use of the global lock to support AML fields
+-- a control method that is holding the global lock can now
+simultaneously access AML fields that require global lock
+protection. Previously, in both cases, this would have resulted
+in an AE_ALREADY_ACQUIRED exception. The change to
+AcpiAcquireGlobalLock is of special interest to drivers for the
+Embedded Controller. There is no change to the behavior of the
+AML Acquire operator, as this can already be used to acquire a
+mutex multiple times by the same thread. BZ 8066. With assistance
+from Alexey Starikovskiy.
+
+Fixed a problem where invalid objects could be referenced in the
+AML Interpreter after error conditions. During operand
+evaluation, ensure that the internal "Return Object" field is
+cleared on error and only valid pointers are stored there. Caused
+occasional access to deleted objects that resulted in "large
+reference count" warning messages. Valery Podrezov.
+
+Fixed a problem where an AE_STACK_OVERFLOW internal exception
+could occur on deeply nested control method invocations. BZ 7873,
+local BZ 487. Valery Podrezov.
+
+Fixed an internal problem with the handling of result objects on
+the interpreter result stack. BZ 7872. Valery Podrezov.
+
+Removed obsolete code that handled the case where AML_NAME_OP is
+the target of a reference (Reference.Opcode). This code was no
+longer necessary. BZ 7874. Valery Podrezov.
+
+Removed obsolete ACPI_NO_INTEGER64_SUPPORT from two header files.
+This was a remnant from the previously discontinued 16-bit
+support.
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 78.0K Code, 17.1K Data, 95.1K Total
+ Debug Version: 155.8K Code, 63.3K Data, 219.1K Total
+ Current Release:
+ Non-Debug Version: 78.0K Code, 17.1K Data, 95.1K Total
+ Debug Version: 155.9K Code, 63.1K Data, 219.0K Total
+
+----------------------------------------
+26 January 2007. Summary of changes for version 20070126:
+
+1) ACPI CA Core Subsystem:
+
+Added the 2007 copyright to all module headers and signons. This
+affects virtually every file in the ACPICA core subsystem, the
+iASL compiler, and the utilities.
+
+Implemented a fix for an incorrect parameter passed to
+AcpiTbDeleteTable during a table load. A bad pointer was passed
+in the case where the DSDT is overridden, causing a fault in this
+case.
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 78.0K Code, 17.1K Data, 95.1K Total
+ Debug Version: 155.8K Code, 63.3K Data, 219.1K Total
+ Current Release:
+ Non-Debug Version: 78.0K Code, 17.1K Data, 95.1K Total
+ Debug Version: 155.8K Code, 63.3K Data, 219.1K Total
+
+----------------------------------------
+15 December 2006. Summary of changes for version 20061215:
+
+1) ACPI CA Core Subsystem:
+
+Support for 16-bit ACPICA has been completely removed since it is
+no longer necessary and it clutters the code. All 16-bit macros,
+types, and conditional compiles have been removed, cleaning up
+and simplifying the code across the entire subsystem. DOS support
+is no longer needed since the bootable Linux firmware kit is now
+available.
+
+The handler for the Global Lock is now removed during
+AcpiTerminate to enable a clean subsystem restart, via the
+implementation of the AcpiEvRemoveGlobalLockHandler function.
+(With assistance from Joel Bretz, HP)
+
+Implemented enhancements to the multithreading support within the
+debugger to enable improved multithreading debugging and
+evaluation of the subsystem. (Valery Podrezov)
+
+Debugger: Enhanced the Statistics/Memory command to emit the
+total (maximum) memory used during the execution, as well as the
+maximum memory consumed by each of the various object types.
+(Valery Podrezov)
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 77.9K Code, 17.0K Data, 94.9K Total
+ Debug Version: 155.2K Code, 63.1K Data, 218.3K Total
+ Current Release:
+ Non-Debug Version: 78.0K Code, 17.1K Data, 95.1K Total
+ Debug Version: 155.8K Code, 63.3K Data, 219.1K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+AcpiExec: Implemented a new option (-m) to display full memory
+use statistics upon subsystem/program termination. (Valery
+Podrezov)
+
+----------------------------------------
+09 November 2006. Summary of changes for version 20061109:
+
+1) ACPI CA Core Subsystem:
+
+Optimized the Load ASL operator in the case where the source
+operand is an operation region. Simply map the operation region
+memory, instead of performing a bytewise read. (Region must be of
+type SystemMemory, see below.)
+
+Fixed the Load ASL operator for the case where the source operand
+is a region field. A buffer object is also allowed as the source
+operand. BZ 480
+
+Fixed a problem where the Load ASL operator allowed the source
+operand to be an operation region of any type. It is now
+restricted to regions of type SystemMemory, as per the ACPI
+specification. BZ 481
+
+Additional cleanup and optimizations for the new Table Manager
+code.
+
+AcpiEnable will now fail if all of the required ACPI tables are
+not loaded (FADT, FACS, DSDT). BZ 477
+
+Added #pragma pack(8/4) to acobject.h to ensure that the
+structures in this header are always compiled as aligned. The
+ACPI_OPERAND_OBJECT has been manually optimized to be aligned and
+will not work if it is byte-packed.
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 78.1K Code, 17.1K Data, 95.2K Total
+ Debug Version: 155.4K Code, 63.1K Data, 218.5K Total
+ Current Release:
+ Non-Debug Version: 77.9K Code, 17.0K Data, 94.9K Total
+ Debug Version: 155.2K Code, 63.1K Data, 218.3K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Fixed a problem where the presence of the _OSI predefined control
+method within complex expressions could cause an internal
+compiler error.
+
+AcpiExec: Implemented full region support for multiple address
+spaces. SpaceId is now part of the REGION object. BZ 429
+
+----------------------------------------
+11 October 2006. Summary of changes for version 20061011:
+
+1) ACPI CA Core Subsystem:
+
+Completed an AML interpreter performance enhancement for control
+method execution. Previously a 2-pass parse/execution, control
+methods are now completely parsed and executed in a single pass.
+This improves overall interpreter performance by ~25%, reduces
+code size, and reduces CPU stack use. (Valery Podrezov +
+interpreter changes in version 20051202 that eliminated namespace
+loading during the pass one parse.)
+
+Implemented _CID support for PCI Root Bridge detection. If the
+_HID does not match the predefined PCI Root Bridge IDs, the _CID
+list (if present) is now obtained and also checked for an ID
+match.
+
+Implemented additional support for the PCI _ADR execution:
+upsearch until a device scope is found before executing _ADR.
+This allows PCI_Config operation regions to be declared locally
+within control methods underneath PCI device objects.
+
+Fixed a problem with a possible race condition between threads
+executing AcpiWalkNamespace and the AML interpreter. This
+condition was removed by modifying AcpiWalkNamespace to (by
+default) ignore all temporary namespace entries created during
+any concurrent control method execution. An additional namespace
+race condition is known to exist between AcpiWalkNamespace and
+the Load/Unload ASL operators and is still under investigation.
+
+Restructured the AML ParseLoop function, breaking it into several
+subfunctions in order to reduce CPU stack use and improve
+maintainability. (Mikhail Kouzmich)
+
+AcpiGetHandle: Fix for parameter validation to detect invalid
+combinations of prefix handle and pathname. BZ 478
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 77.9K Code, 17.1K Data, 95.0K Total
+ Debug Version: 154.6K Code, 63.0K Data, 217.6K Total
+ Current Release:
+ Non-Debug Version: 78.1K Code, 17.1K Data, 95.2K Total
+ Debug Version: 155.4K Code, 63.1K Data, 218.5K Total
+
+2) iASL Compiler/Disassembler and Tools:
+
+Ported the -g option (get local ACPI tables) to the new ACPICA
+Table Manager to restore original behavior.
+
+----------------------------------------
+27 September 2006. Summary of changes for version 20060927:
+
+1) ACPI CA Core Subsystem:
+
+Removed the "Flags" parameter from AcpiGetRegister and
+AcpiSetRegister. These functions now use a spinlock for mutual
+exclusion and the interrupt level indication flag is not needed.
+
+Fixed a problem with the Global Lock where the lock could appear
+to be obtained before it is actually obtained. The global lock
+semaphore was inadvertently created with one unit instead of zero
+units. (BZ 464) Fiodor Suietov.
+
+Fixed a possible memory leak and fault in
+AcpiExResolveObjectToValue during a read from a buffer or region
+field. (BZ 458) Fiodor Suietov.
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 77.9K Code, 17.1K Data, 95.0K Total
+ Debug Version: 154.7K Code, 63.0K Data, 217.7K Total
+ Current Release:
+ Non-Debug Version: 77.9K Code, 17.1K Data, 95.0K Total
+ Debug Version: 154.6K Code, 63.0K Data, 217.6K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Fixed a compilation problem with the pre-defined Resource
+Descriptor field names where an "object does not exist" error
+could be incorrectly generated if the parent ResourceTemplate
+pathname places the template within a different namespace scope
+than the current scope. (BZ 7212)
+
+Fixed a problem where the compiler could hang after syntax errors
+detected in an ElseIf construct. (BZ 453)
+
+Fixed a problem with the AmlFilename parameter to the
+DefinitionBlock() operator. An incorrect output filename was
+produced when this parameter was a null string (""). Now, the
+original input filename is used as the AML output filename, with
+an ".aml" extension.
+
+Implemented a generic batch command mode for the AcpiExec utility
+(execute any AML debugger command) (Valery Podrezov).
+
+----------------------------------------
+12 September 2006. Summary of changes for version 20060912:
+
+1) ACPI CA Core Subsystem:
+
+Enhanced the implementation of the "serialized mode" of the
+interpreter (enabled via the AcpiGbl_AllMethodsSerialized flag.)
+When this mode is specified, instead of creating a serialization
+semaphore per control method, the interpreter lock is simply no
+longer released before a blocking operation during control method
+execution. This effectively makes the AML Interpreter single-
+threaded. The overhead of a semaphore per-method is eliminated.
+
+Fixed a regression where an error was no longer emitted if a
+control method attempts to create 2 objects of the same name.
+This once again returns AE_ALREADY_EXISTS. When this exception
+occurs, it invokes the mechanism that will dynamically serialize
+the control method to possible prevent future errors. (BZ 440)
+
+Integrated a fix for a problem with PCI Express HID detection in
+the PCI Config Space setup procedure. (BZ 7145)
+
+Moved all FADT-related functions to a new file, tbfadt.c.
+Eliminated the AcpiHwInitialize function - the FADT registers are
+now validated when the table is loaded.
+
+Added two new warnings during FADT verification - 1) if the FADT
+is larger than the largest known FADT version, and 2) if there is
+a mismatch between a 32-bit block address and the 64-bit X
+counterpart (when both are non-zero.)
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 77.9K Code, 16.7K Data, 94.6K Total
+ Debug Version: 154.9K Code, 62.6K Data, 217.5K Total
+ Current Release:
+ Non-Debug Version: 77.9K Code, 17.1K Data, 95.0K Total
+ Debug Version: 154.7K Code, 63.0K Data, 217.7K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Fixed a problem with the implementation of the Switch() operator
+where the temporary variable was declared too close to the actual
+Switch, instead of at method level. This could cause a problem if
+the Switch() operator is within a while loop, causing an error on
+the second iteration. (BZ 460)
+
+Disassembler - fix for error emitted for unknown type for target
+of scope operator. Now, ignore it and continue.
+
+Disassembly of an FADT now verifies the input FADT and reports
+any errors found. Fix for proper disassembly of full-sized (ACPI
+2.0) FADTs.
+
+Disassembly of raw data buffers with byte initialization data now
+prefixes each output line with the current buffer offset.
+
+Disassembly of ASF! table now includes all variable-length data
+fields at the end of some of the subtables.
+
+The disassembler now emits a comment if a buffer appears to be a
+ResourceTemplate, but cannot be disassembled as such because the
+EndTag does not appear at the very end of the buffer.
+
+AcpiExec - Added the "-t" command line option to enable the
+serialized mode of the AML interpreter.
+
+----------------------------------------
+31 August 2006. Summary of changes for version 20060831:
+
+1) ACPI CA Core Subsystem:
+
+Miscellaneous fixes for the Table Manager:
+- Correctly initialize internal common FADT for all 64-bit "X"
+fields
+- Fixed a couple table mapping issues during table load
+- Fixed a couple alignment issues for IA64
+- Initialize input array to zero in AcpiInitializeTables
+- Additional parameter validation for AcpiGetTable,
+AcpiGetTableHeader, AcpiGetTableByIndex
+
+Change for GPE support: when a "wake" GPE is received, all wake
+GPEs are now immediately disabled to prevent the waking GPE from
+firing again and to prevent other wake GPEs from interrupting the
+wake process.
+
+Added the AcpiGpeCount global that tracks the number of processed
+GPEs, to be used for debugging systems with a large number of
+ACPI interrupts.
+
+Implemented support for the "DMAR" ACPI table (DMA Redirection
+Table) in both the ACPICA headers and the disassembler.
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 77.8K Code, 16.5K Data, 94.3K Total
+ Debug Version: 154.6K Code, 62.3K Data, 216.9K Total
+ Current Release:
+ Non-Debug Version: 77.9K Code, 16.7K Data, 94.6K Total
+ Debug Version: 154.9K Code, 62.6K Data, 217.5K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Disassembler support for the DMAR ACPI table.
+
+----------------------------------------
+23 August 2006. Summary of changes for version 20060823:
+
+1) ACPI CA Core Subsystem:
+
+The Table Manager component has been completely redesigned and
+reimplemented. The new design is much simpler, and reduces the
+overall code and data size of the kernel-resident ACPICA by
+approximately 5%. Also, it is now possible to obtain the ACPI
+tables very early during kernel initialization, even before
+dynamic memory management is initialized. (Alexey Starikovskiy,
+Fiodor Suietov, Bob Moore)
+
+Obsolete ACPICA interfaces:
+
+- AcpiGetFirmwareTable: Use AcpiGetTable instead (works at early
+kernel init time).
+- AcpiLoadTable: Not needed.
+- AcpiUnloadTable: Not needed.
+
+New ACPICA interfaces:
+
+- AcpiInitializeTables: Must be called before the table manager
+can be used.
+- AcpiReallocateRootTable: Used to transfer the root table to
+dynamically allocated memory after it becomes available.
+- AcpiGetTableByIndex: Allows the host to easily enumerate all
+ACPI tables in the RSDT/XSDT.
+
+Other ACPICA changes:
+
+- AcpiGetTableHeader returns the actual mapped table header, not
+a copy. Use AcpiOsUnmapMemory to free this mapping.
+- AcpiGetTable returns the actual mapped table. The mapping is
+managed internally and must not be deleted by the caller. Use of
+this interface causes no additional dynamic memory allocation.
+- AcpiFindRootPointer: Support for physical addressing has been
+eliminated, it appeared to be unused.
+- The interface to AcpiOsMapMemory has changed to be consistent
+with the other allocation interfaces.
+- The interface to AcpiOsGetRootPointer has changed to eliminate
+unnecessary parameters.
+- ACPI_PHYSICAL_ADDRESS is now 32 bits on 32-bit platforms, 64
+bits on 64-bit platforms. Was previously 64 bits on all
+platforms.
+- The interface to the ACPI Global Lock acquire/release macros
+have changed slightly since ACPICA no longer keeps a local copy
+of the FACS with a constructed pointer to the actual global lock.
+
+Porting to the new table manager:
+
+- AcpiInitializeTables: Must be called once, and can be called
+anytime during the OS initialization process. It allows the host
+to specify an area of memory to be used to store the internal
+version of the RSDT/XSDT (root table). This allows the host to
+access ACPI tables before memory management is initialized and
+running.
+- AcpiReallocateRootTable: Can be called after memory management
+is running to copy the root table to a dynamically allocated
+array, freeing up the scratch memory specified in the call to
+AcpiInitializeTables.
+- AcpiSubsystemInitialize: This existing interface is independent
+of the Table Manager, and does not have to be called before the
+Table Manager can be used, it only must be called before the rest
+of ACPICA can be used.
+- ACPI Tables: Some changes have been made to the names and
+structure of the actbl.h and actbl1.h header files and may
+require changes to existing code. For example, bitfields have
+been completely removed because of their lack of portability
+across C compilers.
+- Update interfaces to the Global Lock acquire/release macros if
+local versions are used. (see acwin.h)
+
+Obsolete files: tbconvrt.c, tbget.c, tbgetall.c, tbrsdt.c
+
+New files: tbfind.c
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 80.7K Code, 17.9K Data, 98.6K Total
+ Debug Version: 161.0K Code, 65.1K Data, 226.1K Total
+ Current Release:
+ Non-Debug Version: 77.8K Code, 16.5K Data, 94.3K Total
+ Debug Version: 154.6K Code, 62.3K Data, 216.9K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+No changes for this release.
+
+----------------------------------------
+21 July 2006. Summary of changes for version 20060721:
+
+1) ACPI CA Core Subsystem:
+
+The full source code for the ASL test suite used to validate the
+iASL compiler and the ACPICA core subsystem is being released
+with the ACPICA source for the first time. The source is
+contained in a separate package and consists of over 1100 files
+that exercise all ASL/AML operators. The package should appear on
+the Intel/ACPI web site shortly. (Valery Podrezov, Fiodor
+Suietov)
+
+Completed a new design and implementation for support of the ACPI
+Global Lock. On the OS side, the global lock is now treated as a
+standard AML mutex. Previously, multiple OS threads could
+"acquire" the global lock simultaneously. However, this could
+cause the BIOS to be starved out of the lock - especially in
+cases such as the Embedded Controller driver where there is a
+tight coupling between the OS and the BIOS.
+
+Implemented an optimization for the ACPI Global Lock interrupt
+mechanism. The Global Lock interrupt handler no longer queues the
+execution of a separate thread to signal the global lock
+semaphore. Instead, the semaphore is signaled directly from the
+interrupt handler.
+
+Implemented support within the AML interpreter for package
+objects that contain a larger AML length (package list length)
+than the package element count. In this case, the length of the
+package is truncated to match the package element count. Some
+BIOS code apparently modifies the package length on the fly, and
+this change supports this behavior. Provides compatibility with
+the MS AML interpreter. (With assistance from Fiodor Suietov)
+
+Implemented a temporary fix for the BankValue parameter of a Bank
+Field to support all constant values, now including the Zero and
+One opcodes. Evaluation of this parameter must eventually be
+converted to a full TermArg evaluation. A not-implemented error
+is now returned (temporarily) for non-constant values for this
+parameter.
+
+Fixed problem reports (Fiodor Suietov) integrated:
+- Fix for premature object deletion after CopyObject on Operation
+Region (BZ 350)
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 80.7K Code, 18.0K Data, 98.7K Total
+ Debug Version: 160.9K Code, 65.1K Data, 226.0K Total
+ Current Release:
+ Non-Debug Version: 80.7K Code, 17.9K Data, 98.6K Total
+ Debug Version: 161.0K Code, 65.1K Data, 226.1K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+No changes for this release.
+
+----------------------------------------
+07 July 2006. Summary of changes for version 20060707:
+
+1) ACPI CA Core Subsystem:
+
+Added the ACPI_PACKED_POINTERS_NOT_SUPPORTED macro to support C
+compilers that do not allow the initialization of address
+pointers within packed structures - even though the hardware
+itself may support misaligned transfers. Some of the debug data
+structures are packed by default to minimize size.
+
+Added an error message for the case where AcpiOsGetThreadId()
+returns zero. A non-zero value is required by the core ACPICA
+code to ensure the proper operation of AML mutexes and recursive
+control methods.
+
+The DSDT is now the only ACPI table that determines whether the
+AML interpreter is in 32-bit or 64-bit mode. Not really a
+functional change, but the hooks for per-table 32/64 switching
+have been removed from the code. A clarification to the ACPI
+specification is forthcoming in ACPI 3.0B.
+
+Fixed a possible leak of an OwnerID in the error path of
+AcpiTbInitTableDescriptor (tbinstal.c), and migrated all table
+OwnerID deletion to a single place in AcpiTbUninstallTable to
+correct possible leaks when using the AcpiTbDeleteTablesByType
+interface (with assistance from Lance Ortiz.)
+
+Fixed a problem with Serialized control methods where the
+semaphore associated with the method could be over-signaled after
+multiple method invocations.
+
+Fixed two issues with the locking of the internal namespace data
+structure. Both the Unload() operator and AcpiUnloadTable
+interface now lock the namespace during the namespace deletion
+associated with the table unload (with assistance from Linn
+Crosetto.)
+
+Fixed problem reports (Valery Podrezov) integrated:
+- Eliminate unnecessary memory allocation for CreateXxxxField (BZ
+5426)
+
+Fixed problem reports (Fiodor Suietov) integrated:
+- Incomplete cleanup branches in AcpiTbGetTableRsdt (BZ 369)
+- On Address Space handler deletion, needless deactivation call
+(BZ 374)
+- AcpiRemoveAddressSpaceHandler: validate Device handle parameter
+(BZ 375)
+- Possible memory leak, Notify sub-objects of Processor, Power,
+ThermalZone (BZ 376)
+- AcpiRemoveAddressSpaceHandler: validate Handler parameter (BZ
+378)
+- Minimum Length of RSDT should be validated (BZ 379)
+- AcpiRemoveNotifyHandler: return AE_NOT_EXIST if Processor Obj
+has no Handler (BZ (380)
+- AcpiUnloadTable: return AE_NOT_EXIST if no table of specified
+type loaded (BZ 381)
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 80.5K Code, 17.8K Data, 98.3K Total
+ Debug Version: 160.8K Code, 64.8K Data, 225.6K Total
+ Current Release:
+ Non-Debug Version: 80.7K Code, 17.9K Data, 98.6K Total
+ Debug Version: 161.0K Code, 65.1K Data, 226.1K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Fixed problem reports:
+Compiler segfault when ASL contains a long (>1024) String
+declaration (BZ 436)
+
+----------------------------------------
+23 June 2006. Summary of changes for version 20060623:
+
+1) ACPI CA Core Subsystem:
+
+Implemented a new ACPI_SPINLOCK type for the OSL lock interfaces.
+This allows the type to be customized to the host OS for improved
+efficiency (since a spinlock is usually a very small object.)
+
+Implemented support for "ignored" bits in the ACPI registers.
+According to the ACPI specification, these bits should be
+preserved when writing the registers via a read/modify/write
+cycle. There are 3 bits preserved in this manner: PM1_CONTROL[0]
+(SCI_EN), PM1_CONTROL[9], and PM1_STATUS[11].
+
+Implemented the initial deployment of new OSL mutex interfaces.
+Since some host operating systems have separate mutex and
+semaphore objects, this feature was requested. The base code now
+uses mutexes (and the new mutex interfaces) wherever a binary
+semaphore was used previously. However, for the current release,
+the mutex interfaces are defined as macros to map them to the
+existing semaphore interfaces. Therefore, no OSL changes are
+required at this time. (See acpiosxf.h)
+
+Fixed several problems with the support for the control method
+SyncLevel parameter. The SyncLevel now works according to the
+ACPI specification and in concert with the Mutex SyncLevel
+parameter, since the current SyncLevel is a property of the
+executing thread. Mutual exclusion for control methods is now
+implemented with a mutex instead of a semaphore.
+
+Fixed three instances of the use of the C shift operator in the
+bitfield support code (exfldio.c) to avoid the use of a shift
+value larger than the target data width. The behavior of C
+compilers is undefined in this case and can cause unpredictable
+results, and therefore the case must be detected and avoided.
+(Fiodor Suietov)
+
+Added an info message whenever an SSDT or OEM table is loaded
+dynamically via the Load() or LoadTable() ASL operators. This
+should improve debugging capability since it will show exactly
+what tables have been loaded (beyond the tables present in the
+RSDT/XSDT.)
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 80.0K Code, 17.6K Data, 97.6K Total
+ Debug Version: 160.2K Code, 64.7K Data, 224.9K Total
+ Current Release:
+ Non-Debug Version: 80.5K Code, 17.8K Data, 98.3K Total
+ Debug Version: 160.8K Code, 64.8K Data, 225.6K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+No changes for this release.
+
+----------------------------------------
+08 June 2006. Summary of changes for version 20060608:
+
+1) ACPI CA Core Subsystem:
+
+Converted the locking mutex used for the ACPI hardware to a
+spinlock. This change should eliminate all problems caused by
+attempting to acquire a semaphore at interrupt level, and it
+means that all ACPICA external interfaces that directly access
+the ACPI hardware can be safely called from interrupt level. OSL
+code that implements the semaphore interfaces should be able to
+eliminate any workarounds for being called at interrupt level.
+
+Fixed a regression introduced in 20060526 where the ACPI device
+initialization could be prematurely aborted with an AE_NOT_FOUND
+if a device did not have an optional _INI method.
+
+Fixed an IndexField issue where a write to the Data Register
+should be limited in size to the AccessSize (width) of the
+IndexField itself. (BZ 433, Fiodor Suietov)
+
+Fixed problem reports (Valery Podrezov) integrated:
+- Allow store of ThermalZone objects to Debug object (BZ
+5369/5370)
+
+Fixed problem reports (Fiodor Suietov) integrated:
+- AcpiGetTableHeader doesn't handle multiple instances correctly
+(BZ 364)
+
+Removed four global mutexes that were obsolete and were no longer
+being used.
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 80.0K Code, 17.7K Data, 97.7K Total
+ Debug Version: 160.3K Code, 64.9K Data, 225.2K Total
+ Current Release:
+ Non-Debug Version: 80.0K Code, 17.6K Data, 97.6K Total
+ Debug Version: 160.2K Code, 64.7K Data, 224.9K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Fixed a fault when using -g option (get tables from registry) on
+Windows machines.
+
+Fixed problem reports integrated:
+- Generate error if CreateField NumBits parameter is zero. (BZ
+405)
+- Fault if Offset/Length in Field unit is very large (BZ 432,
+Fiodor Suietov)
+- Global table revision override (-r) is ignored (BZ 413)
+
+----------------------------------------
+26 May 2006. Summary of changes for version 20060526:
+
+1) ACPI CA Core Subsystem:
+
+Restructured, flattened, and simplified the internal interfaces
+for namespace object evaluation - resulting in smaller code, less
+CPU stack use, and fewer interfaces. (With assistance from
+Mikhail Kouzmich)
+
+Fixed a problem with the CopyObject operator where the first
+parameter was not typed correctly for the parser, interpreter,
+compiler, and disassembler. Caused various errors and unexpected
+behavior.
+
+Fixed a problem where a ShiftLeft or ShiftRight of more than 64
+bits produced incorrect results with some C compilers. Since the
+behavior of C compilers when the shift value is larger than the
+datatype width is apparently not well defined, the interpreter
+now detects this condition and simply returns zero as expected in
+all such cases. (BZ 395)
+
+Fixed problem reports (Valery Podrezov) integrated:
+- Update String-to-Integer conversion to match ACPI 3.0A spec (BZ
+5329)
+- Allow interpreter to handle nested method declarations (BZ
+5361)
+
+Fixed problem reports (Fiodor Suietov) integrated:
+- AcpiTerminate doesn't free debug memory allocation list objects
+(BZ 355)
+- After Core Subsystem shutdown, AcpiSubsystemStatus returns
+AE_OK (BZ 356)
+- AcpiOsUnmapMemory for RSDP can be invoked inconsistently (BZ
+357)
+- Resource Manager should return AE_TYPE for non-device objects
+(BZ 358)
+- Incomplete cleanup branch in AcpiNsEvaluateRelative (BZ 359)
+- Use AcpiOsFree instead of ACPI_FREE in AcpiRsSetSrsMethodData
+(BZ 360)
+- Incomplete cleanup branch in AcpiPsParseAml (BZ 361)
+- Incomplete cleanup branch in AcpiDsDeleteWalkState (BZ 362)
+- AcpiGetTableHeader returns AE_NO_ACPI_TABLES until DSDT is
+loaded (BZ 365)
+- Status of the Global Initialization Handler call not used (BZ
+366)
+- Incorrect object parameter to Global Initialization Handler (BZ
+367)
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 79.8K Code, 17.7K Data, 97.5K Total
+ Debug Version: 160.5K Code, 65.1K Data, 225.6K Total
+ Current Release:
+ Non-Debug Version: 80.0K Code, 17.7K Data, 97.7K Total
+ Debug Version: 160.3K Code, 64.9K Data, 225.2K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Modified the parser to allow the names IO, DMA, and IRQ to be
+used as namespace identifiers with no collision with existing
+resource descriptor macro names. This provides compatibility with
+other ASL compilers and is most useful for
+disassembly/recompilation of existing tables without parse
+errors. (With assistance from Thomas Renninger)
+
+Disassembler: fixed an incorrect disassembly problem with the
+DataTableRegion and CopyObject operators. Fixed a possible fault
+during disassembly of some Alias operators.
+
+----------------------------------------
+12 May 2006. Summary of changes for version 20060512:
+
+1) ACPI CA Core Subsystem:
+
+Replaced the AcpiOsQueueForExecution interface with a new
+interface named AcpiOsExecute. The major difference is that the
+new interface does not have a Priority parameter, this appeared
+to be useless and has been replaced by a Type parameter. The Type
+tells the host what type of execution is being requested, such as
+global lock handler, notify handler, GPE handler, etc. This
+allows the host to queue and execute the request as appropriate
+for the request type, possibly using different work queues and
+different priorities for the various request types. This enables
+fixes for multithreading deadlock problems such as BZ #5534, and
+will require changes to all existing OS interface layers. (Alexey
+Starikovskiy and Bob Moore)
+
+Fixed a possible memory leak associated with the support for the
+so-called "implicit return" ACPI extension. Reported by FreeBSD,
+BZ #6514. (Fiodor Suietov)
+
+Fixed a problem with the Load() operator where a table load from
+an operation region could overwrite an internal table buffer by
+up to 7 bytes and cause alignment faults on IPF systems. (With
+assistance from Luming Yu)
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 79.7K Code, 17.7K Data, 97.4K Total
+ Debug Version: 160.1K Code, 65.2K Data, 225.3K Total
+ Current Release:
+ Non-Debug Version: 79.8K Code, 17.7K Data, 97.5K Total
+ Debug Version: 160.5K Code, 65.1K Data, 225.6K Total
+
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Disassembler: Implemented support to cross reference the internal
+namespace and automatically generate ASL External() statements
+for symbols not defined within the current table being
+disassembled. This will simplify the disassembly and
+recompilation of interdependent tables such as SSDTs since these
+statements will no longer have to be added manually.
+
+Disassembler: Implemented experimental support to automatically
+detect invocations of external control methods and generate
+appropriate External() statements. This is problematic because
+the AML cannot be correctly parsed until the number of arguments
+for each control method is known. Currently, standalone method
+invocations and invocations as the source operand of a Store()
+statement are supported.
+
+Disassembler: Implemented support for the ASL pseudo-operators
+LNotEqual, LLessEqual, and LGreaterEqual. Previously disassembled
+as LNot(LEqual()), LNot(LGreater()), and LNot(LLess()), this
+makes the disassembled ASL code more readable and likely closer
+to the original ASL source.
+
+----------------------------------------
+21 April 2006. Summary of changes for version 20060421:
+
+1) ACPI CA Core Subsystem:
+
+Removed a device initialization optimization introduced in
+20051216 where the _STA method was not run unless an _INI was
+also present for the same device. This optimization could cause
+problems because it could allow _INI methods to be run within a
+not-present device subtree. (If a not-present device had no _INI,
+_STA would not be run, the not-present status would not be
+discovered, and the children of the device would be incorrectly
+traversed.)
+
+Implemented a new _STA optimization where namespace subtrees that
+do not contain _INI are identified and ignored during device
+initialization. Selectively running _STA can significantly
+improve boot time on large machines (with assistance from Len
+Brown.)
+
+Implemented support for the device initialization case where the
+returned _STA flags indicate a device not-present but
+functioning. In this case, _INI is not run, but the device
+children are examined for presence, as per the ACPI
+specification.
+
+Implemented an additional change to the IndexField support in
+order to conform to MS behavior. The value written to the Index
+Register is not simply a byte offset, it is a byte offset in
+units of the access width of the parent Index Field. (Fiodor
+Suietov)
+
+Defined and deployed a new OSL interface, AcpiOsValidateAddress.
+This interface is called during the creation of all AML operation
+regions, and allows the host OS to exert control over what
+addresses it will allow the AML code to access. Operation Regions
+whose addresses are disallowed will cause a runtime exception
+when they are actually accessed (will not affect or abort table
+loading.) See oswinxf or osunixxf for an example implementation.
+
+Defined and deployed a new OSL interface,
+AcpiOsValidateInterface. This interface allows the host OS to
+match the various "optional" interface/behavior strings for the
+_OSI predefined control method as appropriate (with assistance
+from Bjorn Helgaas.) See oswinxf or osunixxf for an example
+implementation.
+
+Restructured and corrected various problems in the exception
+handling code paths within DsCallControlMethod and
+DsTerminateControlMethod in dsmethod (with assistance from
+Takayoshi Kochi.)
+
+Modified the Linux source converter to ignore quoted string
+literals while converting identifiers from mixed to lower case.
+This will correct problems with the disassembler and other areas
+where such strings must not be modified.
+
+The ACPI_FUNCTION_* macros no longer require quotes around the
+function name. This allows the Linux source converter to convert
+the names, now that the converter ignores quoted strings.
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+
+ Non-Debug Version: 81.1K Code, 17.7K Data, 98.8K Total
+ Debug Version: 158.9K Code, 64.9K Data, 223.8K Total
+ Current Release:
+ Non-Debug Version: 79.7K Code, 17.7K Data, 97.4K Total
+ Debug Version: 160.1K Code, 65.2K Data, 225.3K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Implemented 3 new warnings for iASL, and implemented multiple
+warning levels (w2 flag).
+
+1) Ignored timeouts: If the TimeoutValue parameter to Wait or
+Acquire is not WAIT_FOREVER (0xFFFF) and the code does not
+examine the return value to check for the possible timeout, a
+warning is issued.
+
+2) Useless operators: If an ASL operator does not specify an
+optional target operand and it also does not use the function
+return value from the operator, a warning is issued since the
+operator effectively does nothing.
+
+3) Unreferenced objects: If a namespace object is created, but
+never referenced, a warning is issued. This is a warning level 2
+since there are cases where this is ok, such as when a secondary
+table is loaded that uses the unreferenced objects. Even so, care
+is taken to only flag objects that don't look like they will ever
+be used. For example, the reserved methods (starting with an
+underscore) are usually not referenced because it is expected
+that the OS will invoke them.
+
+----------------------------------------
+31 March 2006. Summary of changes for version 20060331:
+
+1) ACPI CA Core Subsystem:
+
+Implemented header file support for the following additional ACPI
+tables: ASF!, BOOT, CPEP, DBGP, MCFG, SPCR, SPMI, TCPA, and WDRT.
+With this support, all current and known ACPI tables are now
+defined in the ACPICA headers and are available for use by device
+drivers and other software.
+
+Implemented support to allow tables that contain ACPI names with
+invalid characters to be loaded. Previously, this would cause the
+table load to fail, but since there are several known cases of
+such tables on existing machines, this change was made to enable
+ACPI support for them. Also, this matches the behavior of the
+Microsoft ACPI implementation.
+
+Fixed a couple regressions introduced during the memory
+optimization in the 20060317 release. The namespace node
+definition required additional reorganization and an internal
+datatype that had been changed to 8-bit was restored to 32-bit.
+(Valery Podrezov)
+
+Fixed a problem where a null pointer passed to
+AcpiUtDeleteGenericState could be passed through to
+AcpiOsReleaseObject which is unexpected. Such null pointers are
+now trapped and ignored, matching the behavior of the previous
+implementation before the deployment of AcpiOsReleaseObject.
+(Valery Podrezov, Fiodor Suietov)
+
+Fixed a memory mapping leak during the deletion of a SystemMemory
+operation region where a cached memory mapping was not deleted.
+This became a noticeable problem for operation regions that are
+defined within frequently used control methods. (Dana Meyers)
+
+Reorganized the ACPI table header files into two main files: one
+for the ACPI tables consumed by the ACPICA core, and another for
+the miscellaneous ACPI tables that are consumed by the drivers
+and other software. The various FADT definitions were merged into
+one common section and three different tables (ACPI 1.0, 1.0+,
+and 2.0)
+
+Example Code and Data Size: These are the sizes for the OS-
+independent acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+
+ Previous Release:
+ Non-Debug Version: 80.9K Code, 17.7K Data, 98.6K Total
+ Debug Version: 158.7K Code, 64.8K Data, 223.5K Total
+ Current Release:
+ Non-Debug Version: 81.1K Code, 17.7K Data, 98.8K Total
+ Debug Version: 158.9K Code, 64.9K Data, 223.8K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Disassembler: Implemented support to decode and format all non-
+AML ACPI tables (tables other than DSDTs and SSDTs.) This
+includes the new tables added to the ACPICA headers, therefore
+all current and known ACPI tables are supported.
+
+Disassembler: The change to allow ACPI names with invalid
+characters also enables the disassembly of such tables. Invalid
+characters within names are changed to '*' to make the name
+printable; the iASL compiler will still generate an error for
+such names, however, since this is an invalid ACPI character.
+
+Implemented an option for AcpiXtract (-a) to extract all tables
+found in the input file. The default invocation extracts only the
+DSDTs and SSDTs.
+
+Fixed a couple of gcc generation issues for iASL and AcpiExec and
+added a makefile for the AcpiXtract utility.
+
+----------------------------------------
+17 March 2006. Summary of changes for version 20060317:
+
+1) ACPI CA Core Subsystem:
+
+Implemented the use of a cache object for all internal namespace
+nodes. Since there are about 1000 static nodes in a typical
+system, this will decrease memory use for cache implementations
+that minimize per-allocation overhead (such as a slab allocator.)
+
+Removed the reference count mechanism for internal namespace
+nodes, since it was deemed unnecessary. This reduces the size of
+each namespace node by about 5%-10% on all platforms. Nodes are
+now 20 bytes for the 32-bit case, and 32 bytes for the 64-bit
+case.
+
+Optimized several internal data structures to reduce object size
+on 64-bit platforms by packing data within the 64-bit alignment.
+This includes the frequently used ACPI_OPERAND_OBJECT, of which
+there can be ~1000 static instances corresponding to the
+namespace objects.
+
+Added two new strings for the predefined _OSI method: "Windows
+2001.1 SP1" and "Windows 2006".
+
+Split the allocation tracking mechanism out to a separate file,
+from utalloc.c to uttrack.c. This mechanism appears to be only
+useful for application-level code. Kernels may wish to not
+include uttrack.c in distributions.
+
+Removed all remnants of the obsolete ACPI_REPORT_* macros and the
+associated code. (These macros have been replaced by the
+ACPI_ERROR and ACPI_WARNING macros.)
+
+Code and Data Size: These are the sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 32-bit compiler. The
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 81.1K Code, 17.8K Data, 98.9K Total
+ Debug Version: 161.6K Code, 65.7K Data, 227.3K Total
+ Current Release:
+ Non-Debug Version: 80.9K Code, 17.7K Data, 98.6K Total
+ Debug Version: 158.7K Code, 64.8K Data, 223.5K Total
+
+
+2) iASL Compiler/Disassembler and Tools:
+
+Implemented an ANSI C version of the acpixtract utility. This
+version will automatically extract the DSDT and all SSDTs from
+the input acpidump text file and dump the binary output to
+separate files. It can also display a summary of the input file
+including the headers for each table found and will extract any
+single ACPI table, with any signature. (See
+source/tools/acpixtract)
+
+----------------------------------------
+10 March 2006. Summary of changes for version 20060310:
+
+1) ACPI CA Core Subsystem:
+
+Tagged all external interfaces to the subsystem with the new
+ACPI_EXPORT_SYMBOL macro. This macro can be defined as necessary
+to assist kernel integration. For Linux, the macro resolves to
+the EXPORT_SYMBOL macro. The default definition is NULL.
+
+Added the ACPI_THREAD_ID type for the return value from
+AcpiOsGetThreadId. This allows the host to define this as
+necessary to simplify kernel integration. The default definition
+is ACPI_NATIVE_UINT.
+
+Fixed two interpreter problems related to error processing, the
+deletion of objects, and placing invalid pointers onto the
+internal operator result stack. BZ 6028, 6151 (Valery Podrezov)
+
+Increased the reference count threshold where a warning is
+emitted for large reference counts in order to eliminate
+unnecessary warnings on systems with large namespaces (especially
+64-bit.) Increased the value from 0x400 to 0x800.
+
+Due to universal disagreement as to the meaning of the 'c' in the
+calloc() function, the ACPI_MEM_CALLOCATE macro has been renamed
+to ACPI_ALLOCATE_ZEROED so that the purpose of the interface is
+'clear'. ACPI_MEM_ALLOCATE and ACPI_MEM_FREE are renamed to
+ACPI_ALLOCATE and ACPI_FREE.
+
+Code and Data Size: These are the sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 32-bit compiler. The
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 81.0K Code, 17.8K Data, 98.8K Total
+ Debug Version: 161.4K Code, 65.7K Data, 227.1K Total
+ Current Release:
+ Non-Debug Version: 81.1K Code, 17.8K Data, 98.9K Total
+ Debug Version: 161.6K Code, 65.7K Data, 227.3K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Disassembler: implemented support for symbolic resource
+descriptor references. If a CreateXxxxField operator references a
+fixed offset within a resource descriptor, a name is assigned to
+the descriptor and the offset is translated to the appropriate
+resource tag and pathname. The addition of this support brings
+the disassembled code very close to the original ASL source code
+and helps eliminate run-time errors when the disassembled code is
+modified (and recompiled) in such a way as to invalidate the
+original fixed offsets.
+
+Implemented support for a Descriptor Name as the last parameter
+to the ASL Register() macro. This parameter was inadvertently
+left out of the ACPI specification, and will be added for ACPI
+3.0b.
+
+Fixed a problem where the use of the "_OSI" string (versus the
+full path "\_OSI") caused an internal compiler error. ("No back
+ptr to op")
+
+Fixed a problem with the error message that occurs when an
+invalid string is used for a _HID object (such as one with an
+embedded asterisk: "*PNP010A".) The correct message is now
+displayed.
+
+----------------------------------------
+17 February 2006. Summary of changes for version 20060217:
+
+1) ACPI CA Core Subsystem:
+
+Implemented a change to the IndexField support to match the
+behavior of the Microsoft AML interpreter. The value written to
+the Index register is now a byte offset, no longer an index based
+upon the width of the Data register. This should fix IndexField
+problems seen on some machines where the Data register is not
+exactly one byte wide. The ACPI specification will be clarified
+on this point.
+
+Fixed a problem where several resource descriptor types could
+overrun the internal descriptor buffer due to size
+miscalculation: VendorShort, VendorLong, and Interrupt. This was
+noticed on IA64 machines, but could affect all platforms.
+
+Fixed a problem where individual resource descriptors were
+misaligned within the internal buffer, causing alignment faults
+on IA64 platforms.
+
+Code and Data Size: These are the sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 32-bit compiler. The
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 81.1K Code, 17.8K Data, 98.9K Total
+ Debug Version: 161.3K Code, 65.6K Data, 226.9K Total
+ Current Release:
+ Non-Debug Version: 81.0K Code, 17.8K Data, 98.8K Total
+ Debug Version: 161.4K Code, 65.7K Data, 227.1K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Implemented support for new reserved names: _WDG and _WED are
+Microsoft extensions for Windows Instrumentation Management, _TDL
+is a new ACPI-defined method (Throttling Depth Limit.)
+
+Fixed a problem where a zero-length VendorShort or VendorLong
+resource descriptor was incorrectly emitted as a descriptor of
+length one.
+
+----------------------------------------
+10 February 2006. Summary of changes for version 20060210:
+
+1) ACPI CA Core Subsystem:
+
+Removed a couple of extraneous ACPI_ERROR messages that appeared
+during normal execution. These became apparent after the
+conversion from ACPI_DEBUG_PRINT.
+
+Fixed a problem where the CreateField operator could hang if the
+BitIndex or NumBits parameter referred to a named object. (Valery
+Podrezov, BZ 5359)
+
+Fixed a problem where a DeRefOf operation on a buffer object
+incorrectly failed with an exception. This also fixes a couple of
+related RefOf and DeRefOf issues. (Valery Podrezov, BZ
+5360/5392/5387)
+
+Fixed a problem where the AE_BUFFER_LIMIT exception was returned
+instead of AE_STRING_LIMIT on an out-of-bounds Index() operation.
+(Valery Podrezov, BZ 5480)
+
+Implemented a memory cleanup at the end of the execution of each
+iteration of an AML While() loop, preventing the accumulation of
+outstanding objects. (Valery Podrezov, BZ 5427)
+
+Eliminated a chunk of duplicate code in the object resolution
+code. (Valery Podrezov, BZ 5336)
+
+Fixed several warnings during the 64-bit code generation.
+
+The AcpiSrc source code conversion tool now inserts one line of
+whitespace after an if() statement that is followed immediately
+by a comment, improving readability of the Linux code.
+
+Code and Data Size: The current and previous library sizes for
+the core subsystem are shown below. These are the code and data
+sizes for the acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. These values do not include any ACPI driver or
+OSPM code. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+Note that these values will vary depending on the efficiency of
+the compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 81.0K Code, 17.9K Data, 98.9K Total
+ Debug Version: 161.3K Code, 65.7K Data, 227.0K Total
+ Current Release:
+ Non-Debug Version: 81.1K Code, 17.8K Data, 98.9K Total
+ Debug Version: 161.3K Code, 65.6K Data, 226.9K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a problem with the disassembly of a BankField operator with
+a complex expression for the BankValue parameter.
+
+----------------------------------------
+27 January 2006. Summary of changes for version 20060127:
+
+1) ACPI CA Core Subsystem:
+
+Implemented support in the Resource Manager to allow unresolved
+namestring references within resource package objects for the
+_PRT method. This support is in addition to the previously
+implemented unresolved reference support within the AML parser.
+If the interpreter slack mode is enabled, these unresolved
+references will be passed through to the caller as a NULL package
+entry.
+
+Implemented and deployed new macros and functions for error and
+warning messages across the subsystem. These macros are simpler
+and generate less code than their predecessors. The new macros
+ACPI_ERROR, ACPI_EXCEPTION, ACPI_WARNING, and ACPI_INFO replace
+the ACPI_REPORT_* macros. The older macros remain defined to
+allow ACPI drivers time to migrate to the new macros.
+
+Implemented the ACPI_CPU_FLAGS type to simplify host OS
+integration of the Acquire/Release Lock OSL interfaces.
+
+Fixed a problem where Alias ASL operators are sometimes not
+correctly resolved, in both the interpreter and the iASL
+compiler.
+
+Fixed several problems with the implementation of the
+ConcatenateResTemplate ASL operator. As per the ACPI
+specification, zero length buffers are now treated as a single
+EndTag. One-length buffers always cause a fatal exception. Non-
+zero length buffers that do not end with a full 2-byte EndTag
+cause a fatal exception.
+
+Fixed a possible structure overwrite in the AcpiGetObjectInfo
+external interface. (With assistance from Thomas Renninger)
+
+Code and Data Size: The current and previous library sizes for
+the core subsystem are shown below. These are the code and data
+sizes for the acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. These values do not include any ACPI driver or
+OSPM code. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+Note that these values will vary depending on the efficiency of
+the compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 83.1K Code, 18.4K Data, 101.5K Total
+ Debug Version: 163.2K Code, 66.2K Data, 229.4K Total
+ Current Release:
+ Non-Debug Version: 81.0K Code, 17.9K Data, 98.9K Total
+ Debug Version: 161.3K Code, 65.7K Data, 227.0K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed an internal error that was generated for any forward
+references to ASL Alias objects.
+
+----------------------------------------
+13 January 2006. Summary of changes for version 20060113:
+
+1) ACPI CA Core Subsystem:
+
+Added 2006 copyright to all module headers and signons. This
+affects virtually every file in the ACPICA core subsystem, iASL
+compiler, and the utilities.
+
+Enhanced the ACPICA error reporting in order to simplify user
+migration to the non-debug version of ACPICA. Replaced all
+instances of the ACPI_DEBUG_PRINT macro invoked at the
+ACPI_DB_ERROR and ACPI_DB_WARN debug levels with the
+ACPI_REPORT_ERROR and ACPI_REPORT_WARNING macros, respectively.
+This preserves all error and warning messages in the non-debug
+version of the ACPICA code (this has been referred to as the
+"debug lite" option.) Over 200 cases were converted to create a
+total of over 380 error/warning messages across the ACPICA code.
+This increases the code and data size of the default non-debug
+version of the code somewhat (about 13K), but all error/warning
+reporting may be disabled if desired (and code eliminated) by
+specifying the ACPI_NO_ERROR_MESSAGES compile-time configuration
+option. The size of the debug version of ACPICA remains about the
+same.
+
+Fixed a memory leak within the AML Debugger "Set" command. One
+object was not properly deleted for every successful invocation
+of the command.
+
+Code and Data Size: The current and previous library sizes for
+the core subsystem are shown below. These are the code and data
+sizes for the acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. These values do not include any ACPI driver or
+OSPM code. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+Note that these values will vary depending on the efficiency of
+the compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 76.6K Code, 12.3K Data, 88.9K Total
+ Debug Version: 163.7K Code, 67.5K Data, 231.2K Total
+ Current Release:
+ Non-Debug Version: 83.1K Code, 18.4K Data, 101.5K Total
+ Debug Version: 163.2K Code, 66.2K Data, 229.4K Total
+
+
+2) iASL Compiler/Disassembler:
+
+The compiler now officially supports the ACPI 3.0a specification
+that was released on December 30, 2005. (Specification is
+available at www.acpi.info)
+
+----------------------------------------
+16 December 2005. Summary of changes for version 20051216:
+
+1) ACPI CA Core Subsystem:
+
+Implemented optional support to allow unresolved names within ASL
+Package objects. A null object is inserted in the package when a
+named reference cannot be located in the current namespace.
+Enabled via the interpreter slack flag, this should eliminate
+AE_NOT_FOUND exceptions seen on machines that contain such code.
+
+Implemented an optimization to the initialization sequence that
+can improve boot time. During ACPI device initialization, the
+_STA method is now run if and only if the _INI method exists. The
+_STA method is used to determine if the device is present; An
+_INI can only be run if _STA returns present, but it is a waste
+of time to run the _STA method if the _INI does not exist.
+(Prototype and assistance from Dong Wei)
+
+Implemented use of the C99 uintptr_t for the pointer casting
+macros if it is available in the current compiler. Otherwise, the
+default (void *) cast is used as before.
+
+Fixed some possible memory leaks found within the execution path
+of the Break, Continue, If, and CreateField operators. (Valery
+Podrezov)
+
+Fixed a problem introduced in the 20051202 release where an
+exception is generated during method execution if a control
+method attempts to declare another method.
+
+Moved resource descriptor string constants that are used by both
+the AML disassembler and AML debugger to the common utilities
+directory so that these components are independent.
+
+Implemented support in the AcpiExec utility (-e switch) to
+globally ignore exceptions during control method execution
+(method is not aborted.)
+
+Added the rsinfo.c source file to the AcpiExec makefile for
+Linux/Unix generation.
+
+Code and Data Size: The current and previous library sizes for
+the core subsystem are shown below. These are the code and data
+sizes for the acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. These values do not include any ACPI driver or
+OSPM code. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+Note that these values will vary depending on the efficiency of
+the compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 76.3K Code, 12.3K Data, 88.6K Total
+ Debug Version: 163.2K Code, 67.4K Data, 230.6K Total
+ Current Release:
+ Non-Debug Version: 76.6K Code, 12.3K Data, 88.9K Total
+ Debug Version: 163.7K Code, 67.5K Data, 231.2K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a problem where a CPU stack overflow fault could occur if a
+recursive method call was made from within a Return statement.
+
+----------------------------------------
+02 December 2005. Summary of changes for version 20051202:
+
+1) ACPI CA Core Subsystem:
+
+Modified the parsing of control methods to no longer create
+namespace objects during the first pass of the parse. Objects are
+now created only during the execute phase, at the moment the
+namespace creation operator is encountered in the AML (Name,
+OperationRegion, CreateByteField, etc.) This should eliminate
+ALREADY_EXISTS exceptions seen on some machines where reentrant
+control methods are protected by an AML mutex. The mutex will now
+correctly block multiple threads from attempting to create the
+same object more than once.
+
+Increased the number of available Owner Ids for namespace object
+tracking from 32 to 255. This should eliminate the OWNER_ID_LIMIT
+exceptions seen on some machines with a large number of ACPI
+tables (either static or dynamic).
+
+Fixed a problem with the AcpiExec utility where a fault could
+occur when the -b switch (batch mode) is used.
+
+Enhanced the namespace dump routine to output the owner ID for
+each namespace object.
+
+Code and Data Size: The current and previous library sizes for
+the core subsystem are shown below. These are the code and data
+sizes for the acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. These values do not include any ACPI driver or
+OSPM code. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+Note that these values will vary depending on the efficiency of
+the compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 76.3K Code, 12.3K Data, 88.6K Total
+ Debug Version: 163.0K Code, 67.4K Data, 230.4K Total
+ Current Release:
+ Non-Debug Version: 76.3K Code, 12.3K Data, 88.6K Total
+ Debug Version: 163.2K Code, 67.4K Data, 230.6K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a parse error during compilation of certain Switch/Case
+constructs. To simplify the parse, the grammar now allows for
+multiple Default statements and this error is now detected and
+flagged during the analysis phase.
+
+Disassembler: The disassembly now includes the contents of the
+original table header within a comment at the start of the file.
+This includes the name and version of the original ASL compiler.
+
+----------------------------------------
+17 November 2005. Summary of changes for version 20051117:
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem in the AML parser where the method thread count
+could be decremented below zero if any errors occurred during the
+method parse phase. This should eliminate AE_AML_METHOD_LIMIT
+exceptions seen on some machines. This also fixed a related
+regression with the mechanism that detects and corrects methods
+that cannot properly handle reentrancy (related to the deployment
+of the new OwnerId mechanism.)
+
+Eliminated the pre-parsing of control methods (to detect errors)
+during table load. Related to the problem above, this was causing
+unwind issues if any errors occurred during the parse, and it
+seemed to be overkill. A table load should not be aborted if
+there are problems with any single control method, thus rendering
+this feature rather pointless.
+
+Fixed a problem with the new table-driven resource manager where
+an internal buffer overflow could occur for small resource
+templates.
+
+Implemented a new external interface, AcpiGetVendorResource. This
+interface will find and return a vendor-defined resource
+descriptor within a _CRS or _PRS method via an ACPI 3.0 UUID
+match. With assistance from Bjorn Helgaas.
+
+Removed the length limit (200) on string objects as per the
+upcoming ACPI 3.0A specification. This affects the following
+areas of the interpreter: 1) any implicit conversion of a Buffer
+to a String, 2) a String object result of the ASL Concatentate
+operator, 3) the String object result of the ASL ToString
+operator.
+
+Fixed a problem in the Windows OS interface layer (OSL) where a
+WAIT_FOREVER on a semaphore object would incorrectly timeout.
+This allows the multithreading features of the AcpiExec utility
+to work properly under Windows.
+
+Updated the Linux makefiles for the iASL compiler and AcpiExec to
+include the recently added file named "utresrc.c".
+
+Code and Data Size: The current and previous library sizes for
+the core subsystem are shown below. These are the code and data
+sizes for the acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. These values do not include any ACPI driver or
+OSPM code. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+Note that these values will vary depending on the efficiency of
+the compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 76.2K Code, 12.3K Data, 88.5K Total
+ Debug Version: 163.0K Code, 67.4K Data, 230.4K Total
+ Current Release:
+ Non-Debug Version: 76.3K Code, 12.3K Data, 88.6K Total
+ Debug Version: 163.0K Code, 67.4K Data, 230.4K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Removed the limit (200) on string objects as per the upcoming
+ACPI 3.0A specification. For the iASL compiler, this means that
+string literals within the source ASL can be of any length.
+
+Enhanced the listing output to dump the AML code for resource
+descriptors immediately after the ASL code for each descriptor,
+instead of in a block at the end of the entire resource template.
+
+Enhanced the compiler debug output to dump the entire original
+parse tree constructed during the parse phase, before any
+transforms are applied to the tree. The transformed tree is
+dumped also.
+
+----------------------------------------
+02 November 2005. Summary of changes for version 20051102:
+
+1) ACPI CA Core Subsystem:
+
+Modified the subsystem initialization sequence to improve GPE
+support. The GPE initialization has been split into two parts in
+order to defer execution of the _PRW methods (Power Resources for
+Wake) until after the hardware is fully initialized and the SCI
+handler is installed. This allows the _PRW methods to access
+fields protected by the Global Lock. This will fix systems where
+a NO_GLOBAL_LOCK exception has been seen during initialization.
+
+Converted the ACPI internal object disassemble and display code
+within the AML debugger to fully table-driven operation, reducing
+code size and increasing maintainability.
+
+Fixed a regression with the ConcatenateResTemplate() ASL operator
+introduced in the 20051021 release.
+
+Implemented support for "local" internal ACPI object types within
+the debugger "Object" command and the AcpiWalkNamespace external
+interfaces. These local types include RegionFields, BankFields,
+IndexFields, Alias, and reference objects.
+
+Moved common AML resource handling code into a new file,
+"utresrc.c". This code is shared by both the Resource Manager and
+the AML Debugger.
+
+Code and Data Size: The current and previous library sizes for
+the core subsystem are shown below. These are the code and data
+sizes for the acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. These values do not include any ACPI driver or
+OSPM code. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+Note that these values will vary depending on the efficiency of
+the compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 76.1K Code, 12.2K Data, 88.3K Total
+ Debug Version: 163.5K Code, 67.0K Data, 230.5K Total
+ Current Release:
+ Non-Debug Version: 76.2K Code, 12.3K Data, 88.5K Total
+ Debug Version: 163.0K Code, 67.4K Data, 230.4K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a problem with very large initializer lists (more than 4000
+elements) for both Buffer and Package objects where the parse
+stack could overflow.
+
+Enhanced the pre-compile source code scan for non-ASCII
+characters to ignore characters within comment fields. The scan
+is now always performed and is no longer optional, detecting
+invalid characters within a source file immediately rather than
+during the parse phase or later.
+
+Enhanced the ASL grammar definition to force early reductions on
+all list-style grammar elements so that the overall parse stack
+usage is greatly reduced. This should improve performance and
+reduce the possibility of parse stack overflow.
+
+Eliminated all reduce/reduce conflicts in the iASL parser
+generation. Also, with the addition of a %expected statement, the
+compiler generates from source with no warnings.
+
+Fixed a possible segment fault in the disassembler if the input
+filename does not contain a "dot" extension (Thomas Renninger).
+
+----------------------------------------
+21 October 2005. Summary of changes for version 20051021:
+
+1) ACPI CA Core Subsystem:
+
+Implemented support for the EM64T and other x86-64 processors.
+This essentially entails recognizing that these processors
+support non-aligned memory transfers. Previously, all 64-bit
+processors were assumed to lack hardware support for non-aligned
+transfers.
+
+Completed conversion of the Resource Manager to nearly full table-
+driven operation. Specifically, the resource conversion code
+(convert AML to internal format and the reverse) and the debug
+code to dump internal resource descriptors are fully table-
+driven, reducing code and data size and improving
+maintainability.
+
+The OSL interfaces for Acquire and Release Lock now use a 64-bit
+flag word on 64-bit processors instead of a fixed 32-bit word.
+(With assistance from Alexey Starikovskiy)
+
+Implemented support within the resource conversion code for the
+Type-Specific byte within the various ACPI 3.0 *WordSpace macros.
+
+Fixed some issues within the resource conversion code for the
+type-specific flags for both Memory and I/O address resource
+descriptors. For Memory, implemented support for the MTP and TTP
+flags. For I/O, split the TRS and TTP flags into two separate
+fields.
+
+Code and Data Size: The current and previous library sizes for
+the core subsystem are shown below. These are the code and data
+sizes for the acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. These values do not include any ACPI driver or
+OSPM code. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+Note that these values will vary depending on the efficiency of
+the compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.1K Code, 12.1K Data, 89.2K Total
+ Debug Version: 168.0K Code, 68.3K Data, 236.3K Total
+ Current Release:
+ Non-Debug Version: 76.1K Code, 12.2K Data, 88.3K Total
+ Debug Version: 163.5K Code, 67.0K Data, 230.5K Total
+
+
+
+2) iASL Compiler/Disassembler:
+
+Relaxed a compiler restriction that disallowed a ResourceIndex
+byte if the corresponding ResourceSource string was not also
+present in a resource descriptor declaration. This restriction
+caused problems with existing AML/ASL code that includes the
+Index byte without the string. When such AML was disassembled, it
+could not be compiled without modification. Further, the modified
+code created a resource template with a different size than the
+original, breaking code that used fixed offsets into the resource
+template buffer.
+
+Removed a recent feature of the disassembler to ignore a lone
+ResourceIndex byte. This byte is now emitted if present so that
+the exact AML can be reproduced when the disassembled code is
+recompiled.
+
+Improved comments and text alignment for the resource descriptor
+code emitted by the disassembler.
+
+Implemented disassembler support for the ACPI 3.0 AccessSize
+field within a Register() resource descriptor.
+
+----------------------------------------
+30 September 2005. Summary of changes for version 20050930:
+
+1) ACPI CA Core Subsystem:
+
+Completed a major overhaul of the Resource Manager code -
+specifically, optimizations in the area of the AML/internal
+resource conversion code. The code has been optimized to simplify
+and eliminate duplicated code, CPU stack use has been decreased
+by optimizing function parameters and local variables, and naming
+conventions across the manager have been standardized for clarity
+and ease of maintenance (this includes function, parameter,
+variable, and struct/typedef names.) The update may force changes
+in some driver code, depending on how resources are handled by
+the host OS.
+
+All Resource Manager dispatch and information tables have been
+moved to a single location for clarity and ease of maintenance.
+One new file was created, named "rsinfo.c".
+
+The ACPI return macros (return_ACPI_STATUS, etc.) have been
+modified to guarantee that the argument is not evaluated twice,
+making them less prone to macro side-effects. However, since
+there exists the possibility of additional stack use if a
+particular compiler cannot optimize them (such as in the debug
+generation case), the original macros are optionally available.
+Note that some invocations of the return_VALUE macro may now
+cause size mismatch warnings; the return_UINT8 and return_UINT32
+macros are provided to eliminate these. (From Randy Dunlap)
+
+Implemented a new mechanism to enable debug tracing for
+individual control methods. A new external interface,
+AcpiDebugTrace, is provided to enable this mechanism. The intent
+is to allow the host OS to easily enable and disable tracing for
+problematic control methods. This interface can be easily exposed
+to a user or debugger interface if desired. See the file
+psxface.c for details.
+
+AcpiUtCallocate will now return a valid pointer if a length of
+zero is specified - a length of one is used and a warning is
+issued. This matches the behavior of AcpiUtAllocate.
+
+Code and Data Size: The current and previous library sizes for
+the core subsystem are shown below. These are the code and data
+sizes for the acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. These values do not include any ACPI driver or
+OSPM code. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+Note that these values will vary depending on the efficiency of
+the compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.5K Code, 12.0K Data, 89.5K Total
+ Debug Version: 168.1K Code, 68.4K Data, 236.5K Total
+ Current Release:
+ Non-Debug Version: 77.1K Code, 12.1K Data, 89.2K Total
+ Debug Version: 168.0K Code, 68.3K Data, 236.3K Total
+
+
+2) iASL Compiler/Disassembler:
+
+A remark is issued if the effective compile-time length of a
+package or buffer is zero. Previously, this was a warning.
+
+----------------------------------------
+16 September 2005. Summary of changes for version 20050916:
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem within the Resource Manager where support for the
+Generic Register descriptor was not fully implemented. This
+descriptor is now fully recognized, parsed, disassembled, and
+displayed.
+
+Completely restructured the Resource Manager code to utilize
+table-driven dispatch and lookup, eliminating many of the large
+switch() statements. This reduces overall subsystem code size and
+code complexity. Affects the resource parsing and construction,
+disassembly, and debug dump output.
+
+Cleaned up and restructured the debug dump output for all
+resource descriptors. Improved readability of the output and
+reduced code size.
+
+Fixed a problem where changes to internal data structures caused
+the optional ACPI_MUTEX_DEBUG code to fail compilation if
+specified.
+
+Code and Data Size: The current and previous library sizes for
+the core subsystem are shown below. These are the code and data
+sizes for the acpica.lib produced by the Microsoft Visual C++ 6.0
+32-bit compiler. These values do not include any ACPI driver or
+OSPM code. The debug version of the code includes the debug
+output trace mechanism and has a much larger code and data size.
+Note that these values will vary depending on the efficiency of
+the compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.4K Code, 11.8K Data, 90.2K Total
+ Debug Version: 169.6K Code, 69.9K Data, 239.5K Total
+ Current Release:
+ Non-Debug Version: 77.5K Code, 12.0K Data, 89.5K Total
+ Debug Version: 168.1K Code, 68.4K Data, 236.5K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Updated the disassembler to automatically insert an
+EndDependentFn() macro into the ASL stream if this macro is
+missing in the original AML code, simplifying compilation of the
+resulting ASL module.
+
+Fixed a problem in the disassembler where a disassembled
+ResourceSource string (within a large resource descriptor) was
+not surrounded by quotes and not followed by a comma, causing
+errors when the resulting ASL module was compiled. Also, escape
+sequences within a ResourceSource string are now handled
+correctly (especially "\\")
+
+----------------------------------------
+02 September 2005. Summary of changes for version 20050902:
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem with the internal Owner ID allocation and
+deallocation mechanisms for control method execution and
+recursive method invocation. This should eliminate the
+OWNER_ID_LIMIT exceptions and "Invalid OwnerId" messages seen on
+some systems. Recursive method invocation depth is currently
+limited to 255. (Alexey Starikovskiy)
+
+Completely eliminated all vestiges of support for the "module-
+level executable code" until this support is fully implemented
+and debugged. This should eliminate the NO_RETURN_VALUE
+exceptions seen during table load on some systems that invoke
+this support.
+
+Fixed a problem within the resource manager code where the
+transaction flags for a 64-bit address descriptor were handled
+incorrectly in the type-specific flag byte.
+
+Consolidated duplicate code within the address descriptor
+resource manager code, reducing overall subsystem code size.
+
+Fixed a fault when using the AML debugger "disassemble" command
+to disassemble individual control methods.
+
+Removed references to the "release_current" directory within the
+Unix release package.
+
+Code and Data Size: The current and previous core subsystem
+library sizes are shown below. These are the code and data sizes
+for the acpica.lib produced by the Microsoft Visual C++ 6.0
+compiler. These values do not include any ACPI driver or OSPM
+code. The debug version of the code includes the debug output
+trace mechanism and has a much larger code and data size. Note
+that these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.6K Code, 11.7K Data, 90.3K Total
+ Debug Version: 170.0K Code, 69.9K Data, 239.9K Total
+ Current Release:
+ Non-Debug Version: 78.4K Code, 11.8K Data, 90.2K Total
+ Debug Version: 169.6K Code, 69.9K Data, 239.5K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Implemented an error check for illegal duplicate values in the
+interrupt and dma lists for the following ASL macros: Dma(),
+Irq(), IrqNoFlags(), and Interrupt().
+
+Implemented error checking for the Irq() and IrqNoFlags() macros
+to detect too many values in the interrupt list (16 max) and
+invalid values in the list (range 0 - 15)
+
+The maximum length string literal within an ASL file is now
+restricted to 200 characters as per the ACPI specification.
+
+Fixed a fault when using the -ln option (generate namespace
+listing).
+
+Implemented an error check to determine if a DescriptorName
+within a resource descriptor has already been used within the
+current scope.
+
+----------------------------------------
+15 August 2005. Summary of changes for version 20050815:
+
+1) ACPI CA Core Subsystem:
+
+Implemented a full bytewise compare to determine if a table load
+request is attempting to load a duplicate table. The compare is
+performed if the table signatures and table lengths match. This
+will allow different tables with the same OEM Table ID and
+revision to be loaded - probably against the ACPI specification,
+but discovered in the field nonetheless.
+
+Added the changes.txt logfile to each of the zipped release
+packages.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.6K Code, 11.7K Data, 90.3K Total
+ Debug Version: 167.0K Code, 69.9K Data, 236.9K Total
+ Current Release:
+ Non-Debug Version: 78.6K Code, 11.7K Data, 90.3K Total
+ Debug Version: 170.0K Code, 69.9K Data, 239.9K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a problem where incorrect AML code could be generated for
+Package objects if optimization is disabled (via the -oa switch).
+
+Fixed a problem with where incorrect AML code is generated for
+variable-length packages when the package length is not specified
+and the number of initializer values is greater than 255.
+
+
+----------------------------------------
+29 July 2005. Summary of changes for version 20050729:
+
+1) ACPI CA Core Subsystem:
+
+Implemented support to ignore an attempt to install/load a
+particular ACPI table more than once. Apparently there exists
+BIOS code that repeatedly attempts to load the same SSDT upon
+certain events. With assistance from Venkatesh Pallipadi.
+
+Restructured the main interface to the AML parser in order to
+correctly handle all exceptional conditions. This will prevent
+leakage of the OwnerId resource and should eliminate the
+AE_OWNER_ID_LIMIT exceptions seen on some machines. With
+assistance from Alexey Starikovskiy.
+
+Support for "module level code" has been disabled in this version
+due to a number of issues that have appeared on various machines.
+The support can be enabled by defining
+ACPI_ENABLE_MODULE_LEVEL_CODE during subsystem compilation. When
+the issues are fully resolved, the code will be enabled by
+default again.
+
+Modified the internal functions for debug print support to define
+the FunctionName parameter as a (const char *) for compatibility
+with compiler built-in macros such as __FUNCTION__, etc.
+
+Linted the entire ACPICA source tree for both 32-bit and 64-bit.
+
+Implemented support to display an object count summary for the
+AML Debugger commands Object and Methods.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.6K Code, 11.6K Data, 90.2K Total
+ Debug Version: 170.0K Code, 69.7K Data, 239.7K Total
+ Current Release:
+ Non-Debug Version: 78.6K Code, 11.7K Data, 90.3K Total
+ Debug Version: 167.0K Code, 69.9K Data, 236.9K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a regression that appeared in the 20050708 version of the
+compiler where an error message was inadvertently emitted for
+invocations of the _OSI reserved control method.
+
+----------------------------------------
+08 July 2005. Summary of changes for version 20050708:
+
+1) ACPI CA Core Subsystem:
+
+The use of the CPU stack in the debug version of the subsystem
+has been considerably reduced. Previously, a debug structure was
+declared in every function that used the debug macros. This
+structure has been removed in favor of declaring the individual
+elements as parameters to the debug functions. This reduces the
+cumulative stack use during nested execution of ACPI function
+calls at the cost of a small increase in the code size of the
+debug version of the subsystem. With assistance from Alexey
+Starikovskiy and Len Brown.
+
+Added the ACPI_GET_FUNCTION_NAME macro to enable the compiler-
+dependent headers to define a macro that will return the current
+function name at runtime (such as __FUNCTION__ or _func_, etc.)
+The function name is used by the debug trace output. If
+ACPI_GET_FUNCTION_NAME is not defined in the compiler-dependent
+header, the function name is saved on the CPU stack (one pointer
+per function.) This mechanism is used because apparently there
+exists no standard ANSI-C defined macro that that returns the
+function name.
+
+Redesigned and reimplemented the "Owner ID" mechanism used to
+track namespace objects created/deleted by ACPI tables and
+control method execution. A bitmap is now used to allocate and
+free the IDs, thus solving the wraparound problem present in the
+previous implementation. The size of the namespace node
+descriptor was reduced by 2 bytes as a result (Alexey
+Starikovskiy).
+
+Removed the UINT32_BIT and UINT16_BIT types that were used for
+the bitfield flag definitions within the headers for the
+predefined ACPI tables. These have been replaced by UINT8_BIT in
+order to increase the code portability of the subsystem. If the
+use of UINT8 remains a problem, we may be forced to eliminate
+bitfields entirely because of a lack of portability.
+
+Enhanced the performance of the AcpiUtUpdateObjectReference
+procedure. This is a frequently used function and this
+improvement increases the performance of the entire subsystem
+(Alexey Starikovskiy).
+
+Fixed several possible memory leaks and the inverse - premature
+object deletion (Alexey Starikovskiy).
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.6K Code, 11.5K Data, 90.1K Total
+ Debug Version: 165.2K Code, 69.6K Data, 234.8K Total
+ Current Release:
+ Non-Debug Version: 78.6K Code, 11.6K Data, 90.2K Total
+ Debug Version: 170.0K Code, 69.7K Data, 239.7K Total
+
+----------------------------------------
+24 June 2005. Summary of changes for version 20050624:
+
+1) ACPI CA Core Subsystem:
+
+Modified the new OSL cache interfaces to use ACPI_CACHE_T as the
+type for the host-defined cache object. This allows the OSL
+implementation to define and type this object in any manner
+desired, simplifying the OSL implementation. For example,
+ACPI_CACHE_T is defined as kmem_cache_t for Linux, and should be
+defined in the OS-specific header file for other operating
+systems as required.
+
+Changed the interface to AcpiOsAcquireObject to directly return
+the requested object as the function return (instead of
+ACPI_STATUS.) This change was made for performance reasons, since
+this is the purpose of the interface in the first place.
+AcpiOsAcquireObject is now similar to the AcpiOsAllocate
+interface.
+
+Implemented a new AML debugger command named Businfo. This
+command displays information about all devices that have an
+associate _PRT object. The _ADR, _HID, _UID, and _CID are
+displayed for these devices.
+
+Modified the initialization sequence in AcpiInitializeSubsystem
+to call the OSL interface AcpiOslInitialize first, before any
+local initialization. This change was required because the global
+initialization now calls OSL interfaces.
+
+Enhanced the Dump command to display the entire contents of
+Package objects (including all sub-objects and their values.)
+
+Restructured the code base to split some files because of size
+and/or because the code logically belonged in a separate file.
+New files are listed below. All makefiles and project files
+included in the ACPI CA release have been updated.
+ utilities/utcache.c /* Local cache interfaces */
+ utilities/utmutex.c /* Local mutex support */
+ utilities/utstate.c /* State object support */
+ interpreter/parser/psloop.c /* Main AML parse loop */
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.3K Code, 11.6K Data, 89.9K Total
+ Debug Version: 164.0K Code, 69.1K Data, 233.1K Total
+ Current Release:
+ Non-Debug Version: 78.6K Code, 11.5K Data, 90.1K Total
+ Debug Version: 165.2K Code, 69.6K Data, 234.8K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a regression introduced in version 20050513 where the use
+of a Package object within a Case() statement caused a compile
+time exception. The original behavior has been restored (a
+Match() operator is emitted.)
+
+----------------------------------------
+17 June 2005. Summary of changes for version 20050617:
+
+1) ACPI CA Core Subsystem:
+
+Moved the object cache operations into the OS interface layer
+(OSL) to allow the host OS to handle these operations if desired
+(for example, the Linux OSL will invoke the slab allocator). This
+support is optional; the compile time define ACPI_USE_LOCAL_CACHE
+may be used to utilize the original cache code in the ACPI CA
+core. The new OSL interfaces are shown below. See utalloc.c for
+an example implementation, and acpiosxf.h for the exact interface
+definitions. With assistance from Alexey Starikovskiy.
+ AcpiOsCreateCache
+ AcpiOsDeleteCache
+ AcpiOsPurgeCache
+ AcpiOsAcquireObject
+ AcpiOsReleaseObject
+
+Modified the interfaces to AcpiOsAcquireLock and
+AcpiOsReleaseLock to return and restore a flags parameter. This
+fits better with many OS lock models. Note: the current execution
+state (interrupt handler or not) is no longer passed to these
+interfaces. If necessary, the OSL must determine this state by
+itself, a simple and fast operation. With assistance from Alexey
+Starikovskiy.
+
+Fixed a problem in the ACPI table handling where a valid XSDT was
+assumed present if the revision of the RSDP was 2 or greater.
+According to the ACPI specification, the XSDT is optional in all
+cases, and the table manager therefore now checks for both an
+RSDP >=2 and a valid XSDT pointer. Otherwise, the RSDT pointer is
+used. Some ACPI 2.0 compliant BIOSs contain only the RSDT.
+
+Fixed an interpreter problem with the Mid() operator in the case
+of an input string where the resulting output string is of zero
+length. It now correctly returns a valid, null terminated string
+object instead of a string object with a null pointer.
+
+Fixed a problem with the control method argument handling to
+allow a store to an Arg object that already contains an object of
+type Device. The Device object is now correctly overwritten.
+Previously, an error was returned.
+
+
+Enhanced the debugger Find command to emit object values in
+addition to the found object pathnames. The output format is the
+same as the dump namespace command.
+
+Enhanced the debugger Set command. It now has the ability to set
+the value of any Named integer object in the namespace
+(Previously, only method locals and args could be set.)
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.1K Code, 11.6K Data, 89.7K Total
+ Debug Version: 164.0K Code, 69.3K Data, 233.3K Total
+ Current Release:
+ Non-Debug Version: 78.3K Code, 11.6K Data, 89.9K Total
+ Debug Version: 164.0K Code, 69.1K Data, 233.1K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a regression in the disassembler where if/else/while
+constructs were output incorrectly. This problem was introduced
+in the previous release (20050526). This problem also affected
+the single-step disassembly in the debugger.
+
+Fixed a problem where compiling the reserved _OSI method would
+randomly (but rarely) produce compile errors.
+
+Enhanced the disassembler to emit compilable code in the face of
+incorrect AML resource descriptors. If the optional
+ResourceSourceIndex is present, but the ResourceSource is not, do
+not emit the ResourceSourceIndex in the disassembly. Otherwise,
+the resulting code cannot be compiled without errors.
+
+----------------------------------------
+26 May 2005. Summary of changes for version 20050526:
+
+1) ACPI CA Core Subsystem:
+
+Implemented support to execute Type 1 and Type 2 AML opcodes
+appearing at the module level (not within a control method.)
+These opcodes are executed exactly once at the time the table is
+loaded. This type of code was legal up until the release of ACPI
+2.0B (2002) and is now supported within ACPI CA in order to
+provide backwards compatibility with earlier BIOS
+implementations. This eliminates the "Encountered executable code
+at module level" warning that was previously generated upon
+detection of such code.
+
+Fixed a problem in the interpreter where an AE_NOT_FOUND
+exception could inadvertently be generated during the lookup of
+namespace objects in the second pass parse of ACPI tables and
+control methods. It appears that this problem could occur during
+the resolution of forward references to namespace objects.
+
+Added the ACPI_MUTEX_DEBUG #ifdef to the AcpiUtReleaseMutex
+function, corresponding to the same #ifdef in the
+AcpiUtAcquireMutex function. This allows the deadlock detection
+debug code to be compiled out in the normal case, improving mutex
+performance (and overall subsystem performance) considerably.
+
+Implemented a handful of miscellaneous fixes for possible memory
+leaks on error conditions and error handling control paths. These
+fixes were suggested by FreeBSD and the Coverity Prevent source
+code analysis tool.
+
+Added a check for a null RSDT pointer in AcpiGetFirmwareTable
+(tbxfroot.c) to prevent a fault in this error case.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.2K Code, 11.6K Data, 89.8K Total
+ Debug Version: 163.7K Code, 69.3K Data, 233.0K Total
+ Current Release:
+ Non-Debug Version: 78.1K Code, 11.6K Data, 89.7K Total
+ Debug Version: 164.0K Code, 69.3K Data, 233.3K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Implemented support to allow Type 1 and Type 2 ASL operators to
+appear at the module level (not within a control method.) These
+operators will be executed once at the time the table is loaded.
+This type of code was legal up until the release of ACPI 2.0B
+(2002) and is now supported by the iASL compiler in order to
+provide backwards compatibility with earlier BIOS ASL code.
+
+The ACPI integer width (specified via the table revision ID or
+the -r override, 32 or 64 bits) is now used internally during
+compile-time constant folding to ensure that constants are
+truncated to 32 bits if necessary. Previously, the revision ID
+value was only emitted in the AML table header.
+
+An error message is now generated for the Mutex and Method
+operators if the SyncLevel parameter is outside the legal range
+of 0 through 15.
+
+Fixed a problem with the Method operator ParameterTypes list
+handling (ACPI 3.0). Previously, more than 2 types or 2 arguments
+generated a syntax error. The actual underlying implementation
+of method argument typechecking is still under development,
+however.
+
+----------------------------------------
+13 May 2005. Summary of changes for version 20050513:
+
+1) ACPI CA Core Subsystem:
+
+Implemented support for PCI Express root bridges -- added support
+for device PNP0A08 in the root bridge search within
+AcpiEvPciConfigRegionSetup.
+
+The interpreter now automatically truncates incoming 64-bit
+constants to 32 bits if currently executing out of a 32-bit ACPI
+table (Revision < 2). This also affects the iASL compiler
+constant folding. (Note: as per below, the iASL compiler no
+longer allows 64-bit constants within 32-bit tables.)
+
+Fixed a problem where string and buffer objects with "static"
+pointers (pointers to initialization data within an ACPI table)
+were not handled consistently. The internal object copy operation
+now always copies the data to a newly allocated buffer,
+regardless of whether the source object is static or not.
+
+Fixed a problem with the FromBCD operator where an implicit
+result conversion was improperly performed while storing the
+result to the target operand. Since this is an "explicit
+conversion" operator, the implicit conversion should never be
+performed on the output.
+
+Fixed a problem with the CopyObject operator where a copy to an
+existing named object did not always completely overwrite the
+existing object stored at name. Specifically, a buffer-to-buffer
+copy did not delete the existing buffer.
+
+Replaced "InterruptLevel" with "InterruptNumber" in all GPE
+interfaces and structs for consistency.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.2K Code, 11.6K Data, 89.8K Total
+ Debug Version: 163.7K Code, 69.3K Data, 233.0K Total
+ Current Release: (Same sizes)
+ Non-Debug Version: 78.2K Code, 11.6K Data, 89.8K Total
+ Debug Version: 163.7K Code, 69.3K Data, 233.0K Total
+
+
+2) iASL Compiler/Disassembler:
+
+The compiler now emits a warning if an attempt is made to
+generate a 64-bit integer constant from within a 32-bit ACPI
+table (Revision < 2). The integer is truncated to 32 bits.
+
+Fixed a problem with large package objects: if the static length
+of the package is greater than 255, the "variable length package"
+opcode is emitted. Previously, this caused an error. This
+requires an update to the ACPI spec, since it currently
+(incorrectly) states that packages larger than 255 elements are
+not allowed.
+
+The disassembler now correctly handles variable length packages
+and packages larger than 255 elements.
+
+----------------------------------------
+08 April 2005. Summary of changes for version 20050408:
+
+1) ACPI CA Core Subsystem:
+
+Fixed three cases in the interpreter where an "index" argument to
+an ASL function was still (internally) 32 bits instead of the
+required 64 bits. This was the Index argument to the Index, Mid,
+and Match operators.
+
+The "strupr" function is now permanently local (AcpiUtStrupr),
+since this is not a POSIX-defined function and not present in
+most kernel-level C libraries. All references to the C library
+strupr function have been removed from the headers.
+
+Completed the deployment of static functions/prototypes. All
+prototypes with the static attribute have been moved from the
+headers to the owning C file.
+
+Implemented an extract option (-e) for the AcpiBin utility (AML
+binary utility). This option allows the utility to extract
+individual ACPI tables from the output of AcpiDmp. It provides
+the same functionality of the acpixtract.pl perl script without
+the worry of setting the correct perl options. AcpiBin runs on
+Windows and has not yet been generated/validated in the
+Linux/Unix environment (but should be soon).
+
+Updated and fixed the table dump option for AcpiBin (-d). This
+option converts a single ACPI table to a hex/ascii file, similar
+to the output of AcpiDmp.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.0K Code, 11.6K Data, 89.6K Total
+ Debug Version: 163.5K Code, 69.3K Data, 232.8K Total
+ Current Release:
+ Non-Debug Version: 78.2K Code, 11.6K Data, 89.8K Total
+ Debug Version: 163.7K Code, 69.3K Data, 233.0K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Disassembler fix: Added a check to ensure that the table length
+found in the ACPI table header within the input file is not
+longer than the actual input file size. This indicates some kind
+of file or table corruption.
+
+----------------------------------------
+29 March 2005. Summary of changes for version 20050329:
+
+1) ACPI CA Core Subsystem:
+
+An error is now generated if an attempt is made to create a
+Buffer Field of length zero (A CreateField with a length operand
+of zero.)
+
+The interpreter now issues a warning whenever executable code at
+the module level is detected during ACPI table load. This will
+give some idea of the prevalence of this type of code.
+
+Implemented support for references to named objects (other than
+control methods) within package objects.
+
+Enhanced package object output for the debug object. Package
+objects are now completely dumped, showing all elements.
+
+Enhanced miscellaneous object output for the debug object. Any
+object can now be written to the debug object (for example, a
+device object can be written, and the type of the object will be
+displayed.)
+
+The "static" qualifier has been added to all local functions
+across both the core subsystem and the iASL compiler.
+
+The number of "long" lines (> 80 chars) within the source has
+been significantly reduced, by about 1/3.
+
+Cleaned up all header files to ensure that all CA/iASL functions
+are prototyped (even static functions) and the formatting is
+consistent.
+
+Two new header files have been added, acopcode.h and acnames.h.
+
+Removed several obsolete functions that were no longer used.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.3K Code, 11.5K Data, 89.8K Total
+ Debug Version: 165.4K Code, 69.7K Data, 236.1K Total
+ Current Release:
+ Non-Debug Version: 78.0K Code, 11.6K Data, 89.6K Total
+ Debug Version: 163.5K Code, 69.3K Data, 232.8K Total
+
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a problem with the resource descriptor generation/support.
+For the ResourceSourceIndex and the ResourceSource fields, both
+must be present, or both must be not present - can't have one
+without the other.
+
+The compiler now returns non-zero from the main procedure if any
+errors have occurred during the compilation.
+
+
+----------------------------------------
+09 March 2005. Summary of changes for version 20050309:
+
+1) ACPI CA Core Subsystem:
+
+The string-to-buffer implicit conversion code has been modified
+again after a change to the ACPI specification. In order to
+match the behavior of the other major ACPI implementation, the
+target buffer is no longer truncated if the source string is
+smaller than an existing target buffer. This change requires an
+update to the ACPI spec, and should eliminate the recent
+AE_AML_BUFFER_LIMIT issues.
+
+The "implicit return" support was rewritten to a new algorithm
+that solves the general case. Rather than attempt to determine
+when a method is about to exit, the result of every ASL operator
+is saved momentarily until the very next ASL operator is
+executed. Therefore, no matter how the method exits, there will
+always be a saved implicit return value. This feature is only
+enabled with the AcpiGbl_EnableInterpreterSlack flag, and should
+eliminate AE_AML_NO_RETURN_VALUE errors when enabled.
+
+Implemented implicit conversion support for the predicate
+(operand) of the If, Else, and While operators. String and Buffer
+arguments are automatically converted to Integers.
+
+Changed the string-to-integer conversion behavior to match the
+new ACPI errata: "If no integer object exists, a new integer is
+created. The ASCII string is interpreted as a hexadecimal
+constant. Each string character is interpreted as a hexadecimal
+value (`0'-`9', `A'-`F', `a', `f'), starting with the first
+character as the most significant digit, and ending with the
+first non-hexadecimal character or end-of-string." This means
+that the first non-hex character terminates the conversion and
+this is the code that was changed.
+
+Fixed a problem where the ObjectType operator would fail (fault)
+when used on an Index of a Package which pointed to a null
+package element. The operator now properly returns zero
+(Uninitialized) in this case.
+
+Fixed a problem where the While operator used excessive memory by
+not properly popping the result stack during execution. There was
+no memory leak after execution, however. (Code provided by Valery
+Podrezov.)
+
+Fixed a problem where references to control methods within
+Package objects caused the method to be invoked, instead of
+producing a reference object pointing to the method.
+
+Restructured and simplified the pswalk.c module
+(AcpiPsDeleteParseTree) to improve performance and reduce code
+size. (Code provided by Alexey Starikovskiy.)
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.3K Code, 11.5K Data, 89.8K Total
+ Debug Version: 165.4K Code, 69.6K Data, 236.0K Total
+ Current Release:
+ Non-Debug Version: 78.3K Code, 11.5K Data, 89.8K Total
+ Debug Version: 165.4K Code, 69.7K Data, 236.1K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a problem with the Return operator with no arguments. Since
+the AML grammar for the byte encoding requires an operand for the
+Return opcode, the compiler now emits a Return(Zero) for this
+case. An ACPI specification update has been written for this
+case.
+
+For tables other than the DSDT, namepath optimization is
+automatically disabled. This is because SSDTs can be loaded
+anywhere in the namespace, the compiler has no knowledge of
+where, and thus cannot optimize namepaths.
+
+Added "ProcessorObj" to the ObjectTypeKeyword list. This object
+type was inadvertently omitted from the ACPI specification, and
+will require an update to the spec.
+
+The source file scan for ASCII characters is now optional (-a).
+This change was made because some vendors place non-ascii
+characters within comments. However, the scan is simply a brute-
+force byte compare to ensure all characters in the file are in
+the range 0x00 to 0x7F.
+
+Fixed a problem with the CondRefOf operator where the compiler
+was inappropriately checking for the existence of the target.
+Since the point of the operator is to check for the existence of
+the target at run-time, the compiler no longer checks for the
+target existence.
+
+Fixed a problem where errors generated from the internal AML
+interpreter during constant folding were not handled properly,
+causing a fault.
+
+Fixed a problem with overly aggressive range checking for the
+Stall operator. The valid range (max 255) is now only checked if
+the operand is of type Integer. All other operand types cannot be
+statically checked.
+
+Fixed a problem where control method references within the RefOf,
+DeRefOf, and ObjectType operators were not treated properly. They
+are now treated as actual references, not method invocations.
+
+Fixed and enhanced the "list namespace" option (-ln). This option
+was broken a number of releases ago.
+
+Improved error handling for the Field, IndexField, and BankField
+operators. The compiler now cleanly reports and recovers from
+errors in the field component (FieldUnit) list.
+
+Fixed a disassembler problem where the optional
+ResourceDescriptor fields TRS and TTP were not always handled
+correctly.
+
+Disassembler - Comments in output now use "//" instead of "/*"
+
+----------------------------------------
+28 February 2005. Summary of changes for version 20050228:
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem where the result of an Index() operator (an
+object reference) must increment the reference count on the
+target object for the life of the object reference.
+
+Implemented AML Interpreter and Debugger support for the new ACPI
+3.0 Extended Address (IO, Memory, Space), QwordSpace, DwordSpace,
+and WordSpace resource descriptors.
+
+Implemented support in the _OSI method for the ACPI 3.0 "Extended
+Address Space Descriptor" string, indicating interpreter support
+for the descriptors above.
+
+Implemented header support for the new ACPI 3.0 FADT flag bits.
+
+Implemented header support for the new ACPI 3.0 PCI Express bits
+for the PM1 status/enable registers.
+
+Updated header support for the MADT processor local Apic struct
+and MADT platform interrupt source struct for new ACPI 3.0
+fields.
+
+Implemented header support for the SRAT and SLIT ACPI tables.
+
+Implemented the -s switch in AcpiExec to enable the
+"InterpreterSlack" flag at runtime.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.2K Code, 11.5K Data, 89.7K Total
+ Debug Version: 164.9K Code, 69.2K Data, 234.1K Total
+ Current Release:
+ Non-Debug Version: 78.3K Code, 11.5K Data, 89.8K Total
+ Debug Version: 165.4K Code, 69.6K Data, 236.0K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a problem with the internal 64-bit String-to-integer
+conversion with strings less than two characters long.
+
+Fixed a problem with constant folding where the result of the
+Index() operator can not be considered a constant. This means
+that Index() cannot be a type3 opcode and this will require an
+update to the ACPI specification.
+
+Disassembler: Implemented support for the TTP, MTP, and TRS
+resource descriptor fields. These fields were inadvertently
+ignored and not output in the disassembly of the resource
+descriptor.
+
+
+ ----------------------------------------
+11 February 2005. Summary of changes for version 20050211:
+
+1) ACPI CA Core Subsystem:
+
+Implemented ACPI 3.0 support for implicit conversion within the
+Match() operator. MatchObjects can now be of type integer,
+buffer, or string instead of just type integer. Package elements
+are implicitly converted to the type of the MatchObject. This
+change aligns the behavior of Match() with the behavior of the
+other logical operators (LLess(), etc.) It also requires an
+errata change to the ACPI specification as this support was
+intended for ACPI 3.0, but was inadvertently omitted.
+
+Fixed a problem with the internal implicit "to buffer"
+conversion. Strings that are converted to buffers will cause
+buffer truncation if the string is smaller than the target
+buffer. Integers that are converted to buffers will not cause
+buffer truncation, only zero extension (both as per the ACPI
+spec.) The problem was introduced when code was added to truncate
+the buffer, but this should not be performed in all cases, only
+the string case.
+
+Fixed a problem with the Buffer and Package operators where the
+interpreter would get confused if two such operators were used as
+operands to an ASL operator (such as
+LLess(Buffer(1){0},Buffer(1){1}). The internal result stack was
+not being popped after the execution of these operators,
+resulting in an AE_NO_RETURN_VALUE exception.
+
+Fixed a problem with constructs of the form
+Store(Index(...),...). The reference object returned from Index
+was inadvertently resolved to an actual value. This problem was
+introduced in version 20050114 when the behavior of Store() was
+modified to restrict the object types that can be used as the
+source operand (to match the ACPI specification.)
+
+Reduced excessive stack use within the AcpiGetObjectInfo
+procedure.
+
+Added a fix to aclinux.h to allow generation of AcpiExec on
+Linux.
+
+Updated the AcpiSrc utility to add the FADT_DESCRIPTOR_REV2_MINUS
+struct.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.1K Code, 11.5K Data, 89.6K Total
+ Debug Version: 164.8K Code, 69.2K Data, 234.0K Total
+ Current Release:
+ Non-Debug Version: 78.2K Code, 11.5K Data, 89.7K Total
+ Debug Version: 164.9K Code, 69.2K Data, 234.1K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a code generation problem in the constant folding
+optimization code where incorrect code was generated if a
+constant was reduced to a buffer object (i.e., a reduced type 5
+opcode.)
+
+Fixed a typechecking problem for the ToBuffer operator. Caused by
+an incorrect return type in the internal opcode information
+table.
+
+----------------------------------------
+25 January 2005. Summary of changes for version 20050125:
+
+1) ACPI CA Core Subsystem:
+
+Fixed a recently introduced problem with the Global Lock where
+the underlying semaphore was not created. This problem was
+introduced in version 20050114, and caused an AE_AML_NO_OPERAND
+exception during an Acquire() operation on _GL.
+
+The local object cache is now optional, and is disabled by
+default. Both AcpiExec and the iASL compiler enable the cache
+because they run in user mode and this enhances their
+performance. #define ACPI_ENABLE_OBJECT_CACHE to enable the local
+cache.
+
+Fixed an issue in the internal function AcpiUtEvaluateObject
+concerning the optional "implicit return" support where an error
+was returned if no return object was expected, but one was
+implicitly returned. AE_OK is now returned in this case and the
+implicitly returned object is deleted. AcpiUtEvaluateObject is
+only occasionally used, and only to execute reserved methods such
+as _STA and _INI where the return type is known up front.
+
+Fixed a few issues with the internal convert-to-integer code. It
+now returns an error if an attempt is made to convert a null
+string, a string of only blanks/tabs, or a zero-length buffer.
+This affects both implicit conversion and explicit conversion via
+the ToInteger() operator.
+
+The internal debug code in AcpiUtAcquireMutex has been commented
+out. It is not needed for normal operation and should increase
+the performance of the entire subsystem. The code remains in case
+it is needed for debug purposes again.
+
+The AcpiExec source and makefile are included in the Unix/Linux
+package for the first time.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.4K Code, 11.5K Data, 89.9K Total
+ Debug Version: 165.4K Code, 69.4K Data, 234.8K Total
+ Current Release:
+ Non-Debug Version: 78.1K Code, 11.5K Data, 89.6K Total
+ Debug Version: 164.8K Code, 69.2K Data, 234.0K Total
+
+2) iASL Compiler/Disassembler:
+
+Switch/Case support: A warning is now issued if the type of the
+Switch value cannot be determined at compile time. For example,
+Switch(Arg0) will generate the warning, and the type is assumed
+to be an integer. As per the ACPI spec, use a construct such as
+Switch(ToInteger(Arg0)) to eliminate the warning.
+
+Switch/Case support: Implemented support for buffer and string
+objects as the switch value. This is an ACPI 3.0 feature, now
+that LEqual supports buffers and strings.
+
+Switch/Case support: The emitted code for the LEqual()
+comparisons now uses the switch value as the first operand, not
+the second. The case value is now the second operand, and this
+allows the case value to be implicitly converted to the type of
+the switch value, not the other way around.
+
+Switch/Case support: Temporary variables are now emitted
+immediately within the control method, not at the global level.
+This means that there are now 36 temps available per-method, not
+36 temps per-module as was the case with the earlier
+implementation (_T_0 through _T_9 and _T_A through _T_Z.)
+
+----------------------------------------
+14 January 2005. Summary of changes for version 20050114:
+
+Added 2005 copyright to all module headers. This affects every
+module in the core subsystem, iASL compiler, and the utilities.
+
+1) ACPI CA Core Subsystem:
+
+Fixed an issue with the String-to-Buffer conversion code where
+the string null terminator was not included in the buffer after
+conversion, but there is existing ASL that assumes the string
+null terminator is included. This is the root of the
+ACPI_AML_BUFFER_LIMIT regression. This problem was introduced in
+the previous version when the code was updated to correctly set
+the converted buffer size as per the ACPI specification. The ACPI
+spec is ambiguous and will be updated to specify that the null
+terminator must be included in the converted buffer. This also
+affects the ToBuffer() ASL operator.
+
+Fixed a problem with the Mid() ASL/AML operator where it did not
+work correctly on Buffer objects. Newly created sub-buffers were
+not being marked as initialized.
+
+
+Fixed a problem in AcpiTbFindTable where incorrect string
+compares were performed on the OemId and OemTableId table header
+fields. These fields are not null terminated, so strncmp is now
+used instead of strcmp.
+
+Implemented a restriction on the Store() ASL/AML operator to
+align the behavior with the ACPI specification. Previously, any
+object could be used as the source operand. Now, the only
+objects that may be used are Integers, Buffers, Strings,
+Packages, Object References, and DDB Handles. If necessary, the
+original behavior can be restored by enabling the
+EnableInterpreterSlack flag.
+
+Enhanced the optional "implicit return" support to allow an
+implicit return value from methods that are invoked externally
+via the AcpiEvaluateObject interface. This enables implicit
+returns from the _STA and _INI methods, for example.
+
+Changed the Revision() ASL/AML operator to return the current
+version of the AML interpreter, in the YYYYMMDD format.
+Previously, it incorrectly returned the supported ACPI version
+(This is the function of the _REV method).
+
+Updated the _REV predefined method to return the currently
+supported version of ACPI, now 3.
+
+Implemented batch mode option for the AcpiExec utility (-b).
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.3K Code, 11.5K Data, 89.8K Total
+ Debug Version: 165.3K Code, 69.4K Data, 234.7K Total
+ Current Release:
+ Non-Debug Version: 78.4K Code, 11.5K Data, 89.9K Total
+ Debug Version: 165.4K Code, 69.4K Data, 234.8K Total
+
+----------------------------------------
+10 December 2004. Summary of changes for version 20041210:
+
+ACPI 3.0 support is nearing completion in both the iASL compiler
+and the ACPI CA core subsystem.
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem in the ToDecimalString operator where the
+resulting string length was incorrectly calculated. The length is
+now calculated exactly, eliminating incorrect AE_STRING_LIMIT
+exceptions.
+
+Fixed a problem in the ToHexString operator to allow a maximum
+200 character string to be produced.
+
+Fixed a problem in the internal string-to-buffer and buffer-to-
+buffer copy routine where the length of the resulting buffer was
+not truncated to the new size (if the target buffer already
+existed).
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.3K Code, 11.5K Data, 89.8K Total
+ Debug Version: 164.7K Code, 68.5K Data, 233.2K Total
+ Current Release:
+ Non-Debug Version: 78.3K Code, 11.5K Data, 89.8K Total
+ Debug Version: 165.3K Code, 69.4K Data, 234.7K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Implemented the new ACPI 3.0 resource template macros -
+DWordSpace, ExtendedIO, ExtendedMemory, ExtendedSpace,
+QWordSpace, and WordSpace. Includes support in the disassembler.
+
+Implemented support for the new (ACPI 3.0) parameter to the
+Register macro, AccessSize.
+
+Fixed a problem where the _HE resource name for the Interrupt
+macro was referencing bit 0 instead of bit 1.
+
+Implemented check for maximum 255 interrupts in the Interrupt
+macro.
+
+Fixed a problem with the predefined resource descriptor names
+where incorrect AML code was generated if the offset within the
+resource buffer was 0 or 1. The optimizer shortened the AML code
+to a single byte opcode but did not update the surrounding
+package lengths.
+
+Changes to the Dma macro: All channels within the channel list
+must be in the range 0-7. Maximum 8 channels can be specified.
+BusMaster operand is optional (default is BusMaster).
+
+Implemented check for maximum 7 data bytes for the VendorShort
+macro.
+
+The ReadWrite parameter is now optional for the Memory32 and
+similar macros.
+
+----------------------------------------
+03 December 2004. Summary of changes for version 20041203:
+
+1) ACPI CA Core Subsystem:
+
+The low-level field insertion/extraction code (exfldio) has been
+completely rewritten to eliminate unnecessary complexity, bugs,
+and boundary conditions.
+
+Fixed a problem in the ToInteger, ToBuffer, ToHexString, and
+ToDecimalString operators where the input operand could be
+inadvertently deleted if no conversion was necessary (e.g., if
+the input to ToInteger was an Integer object.)
+
+Fixed a problem with the ToDecimalString and ToHexString where an
+incorrect exception code was returned if the resulting string
+would be > 200 chars. AE_STRING_LIMIT is now returned.
+
+Fixed a problem with the Concatenate operator where AE_OK was
+always returned, even if the operation failed.
+
+Fixed a problem in oswinxf (used by AcpiExec and iASL) to allow >
+128 semaphores to be allocated.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.5K Code, 11.5K Data, 90.0K Total
+ Debug Version: 165.2K Code, 68.6K Data, 233.8K Total
+ Current Release:
+ Non-Debug Version: 78.3K Code, 11.5K Data, 89.8K Total
+ Debug Version: 164.7K Code, 68.5K Data, 233.2K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed typechecking for the ObjectType and SizeOf operators.
+Problem was recently introduced in 20041119.
+
+Fixed a problem with the ToUUID macro where the upper nybble of
+each buffer byte was inadvertently set to zero.
+
+----------------------------------------
+19 November 2004. Summary of changes for version 20041119:
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem in the internal ConvertToInteger routine where
+new integers were not truncated to 32 bits for 32-bit ACPI
+tables. This routine converts buffers and strings to integers.
+
+Implemented support to store a value to an Index() on a String
+object. This is an ACPI 2.0 feature that had not yet been
+implemented.
+
+Implemented new behavior for storing objects to individual
+package elements (via the Index() operator). The previous
+behavior was to invoke the implicit conversion rules if an object
+was already present at the index. The new behavior is to simply
+delete any existing object and directly store the new object.
+Although the ACPI specification seems unclear on this subject,
+other ACPI implementations behave in this manner. (This is the
+root of the AE_BAD_HEX_CONSTANT issue.)
+
+Modified the RSDP memory scan mechanism to support the extended
+checksum for ACPI 2.0 (and above) RSDPs. Note that the search
+continues until a valid RSDP signature is found with a valid
+checksum.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.5K Code, 11.5K Data, 90.0K Total
+ Debug Version: 165.2K Code, 68.6K Data, 233.8K Total
+ Current Release:
+ Non-Debug Version: 78.5K Code, 11.5K Data, 90.0K Total
+ Debug Version: 165.2K Code, 68.6K Data, 233.8K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a missing semicolon in the aslcompiler.y file.
+
+----------------------------------------
+05 November 2004. Summary of changes for version 20041105:
+
+1) ACPI CA Core Subsystem:
+
+Implemented support for FADT revision 2. This was an interim
+table (between ACPI 1.0 and ACPI 2.0) that adds support for the
+FADT reset register.
+
+Implemented optional support to allow uninitialized LocalX and
+ArgX variables in a control method. The variables are
+initialized to an Integer object with a value of zero. This
+support is enabled by setting the AcpiGbl_EnableInterpreterSlack
+flag to TRUE.
+
+Implemented support for Integer objects for the SizeOf operator.
+Either 4 or 8 is returned, depending on the current integer size
+(32-bit or 64-bit, depending on the parent table revision).
+
+Fixed a problem in the implementation of the SizeOf and
+ObjectType operators where the operand was resolved to a value
+too early, causing incorrect return values for some objects.
+
+Fixed some possible memory leaks during exceptional conditions.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.0K Code, 11.5K Data, 89.5K Total
+ Debug Version: 164.8K Code, 68.6K Data, 233.4K Total
+ Current Release:
+ Non-Debug Version: 78.5K Code, 11.5K Data, 90.0K Total
+ Debug Version: 165.2K Code, 68.6K Data, 233.8K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Implemented support for all ACPI 3.0 reserved names and methods.
+
+Implemented all ACPI 3.0 grammar elements in the front-end,
+including support for semicolons.
+
+Implemented the ACPI 3.0 Function() and ToUUID() macros
+
+Fixed a problem in the disassembler where a Scope() operator
+would not be emitted properly if the target of the scope was in
+another table.
+
+----------------------------------------
+15 October 2004. Summary of changes for version 20041015:
+
+Note: ACPI CA is currently undergoing an in-depth and complete
+formal evaluation to test/verify the following areas. Other
+suggestions are welcome. This will result in an increase in the
+frequency of releases and the number of bug fixes in the next few
+months.
+ - Functional tests for all ASL/AML operators
+ - All implicit/explicit type conversions
+ - Bit fields and operation regions
+ - 64-bit math support and 32-bit-only "truncated" math support
+ - Exceptional conditions, both compiler and interpreter
+ - Dynamic object deletion and memory leaks
+ - ACPI 3.0 support when implemented
+ - External interfaces to the ACPI subsystem
+
+
+1) ACPI CA Core Subsystem:
+
+Fixed two alignment issues on 64-bit platforms - within debug
+statements in AcpiEvGpeDetect and AcpiEvCreateGpeBlock. Removed
+references to the Address field within the non-aligned ACPI
+generic address structure.
+
+Fixed a problem in the Increment and Decrement operators where
+incorrect operand resolution could result in the inadvertent
+modification of the original integer when the integer is passed
+into another method as an argument and the arg is then
+incremented/decremented.
+
+Fixed a problem in the FromBCD operator where the upper 32-bits
+of a 64-bit BCD number were truncated during conversion.
+
+Fixed a problem in the ToDecimal operator where the length of the
+resulting string could be set incorrectly too long if the input
+operand was a Buffer object.
+
+Fixed a problem in the Logical operators (LLess, etc.) where a
+NULL byte (0) within a buffer would prematurely terminate a
+compare between buffer objects.
+
+Added a check for string overflow (>200 characters as per the
+ACPI specification) during the Concatenate operator with two
+string operands.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.8K Code, 11.5K Data, 89.3K Total
+ Debug Version: 164.6K Code, 68.5K Data, 233.1K Total
+ Current Release:
+ Non-Debug Version: 78.0K Code, 11.5K Data, 89.5K Total
+ Debug Version: 164.8K Code, 68.6K Data, 233.4K Total
+
+
+
+2) iASL Compiler/Disassembler:
+
+Allow the use of the ObjectType operator on uninitialized Locals
+and Args (returns 0 as per the ACPI specification).
+
+Fixed a problem where the compiler would fault if there was a
+syntax error in the FieldName of all of the various
+CreateXXXField operators.
+
+Disallow the use of lower case letters within the EISAID macro,
+as per the ACPI specification. All EISAID strings must be of the
+form "UUUNNNN" Where U is an uppercase letter and N is a hex
+digit.
+
+
+----------------------------------------
+06 October 2004. Summary of changes for version 20041006:
+
+1) ACPI CA Core Subsystem:
+
+Implemented support for the ACPI 3.0 Timer operator. This ASL
+function implements a 64-bit timer with 100 nanosecond
+granularity.
+
+Defined a new OSL interface, AcpiOsGetTimer. This interface is
+used to implement the ACPI 3.0 Timer operator. This allows the
+host OS to implement the timer with the best clock available.
+Also, it keeps the core subsystem out of the clock handling
+business, since the host OS (usually) performs this function.
+
+Fixed an alignment issue on 64-bit platforms. The
+HwLowLevelRead(Write) functions use a 64-bit address which is
+part of the packed ACPI Generic Address Structure. Since the
+structure is non-aligned, the alignment macros are now used to
+extract the address to a local variable before use.
+
+Fixed a problem where the ToInteger operator assumed all input
+strings were hexadecimal. The operator now handles both decimal
+strings and hex strings (prefixed with "0x").
+
+Fixed a problem where the string length in the string object
+created as a result of the internal ConvertToString procedure
+could be incorrect. This potentially affected all implicit
+conversions and also the ToDecimalString and ToHexString
+operators.
+
+Fixed two problems in the ToString operator. If the length
+parameter was zero, an incorrect string object was created and
+the value of the input length parameter was inadvertently changed
+from zero to Ones.
+
+Fixed a problem where the optional ResourceSource string in the
+ExtendedIRQ resource macro was ignored.
+
+Simplified the interfaces to the internal division functions,
+reducing code size and complexity.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.9K Code, 11.4K Data, 89.3K Total
+ Debug Version: 164.5K Code, 68.3K Data, 232.8K Total
+ Current Release:
+ Non-Debug Version: 77.8K Code, 11.5K Data, 89.3K Total
+ Debug Version: 164.6K Code, 68.5K Data, 233.1K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Implemented support for the ACPI 3.0 Timer operator.
+
+Fixed a problem where the Default() operator was inadvertently
+ignored in a Switch/Case block. This was a problem in the
+translation of the Switch statement to If...Else pairs.
+
+Added support to allow a standalone Return operator, with no
+parentheses (or operands).
+
+Fixed a problem with code generation for the ElseIf operator
+where the translated Else...If parse tree was improperly
+constructed leading to the loss of some code.
+
+----------------------------------------
+22 September 2004. Summary of changes for version 20040922:
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem with the implementation of the LNot() operator
+where "Ones" was not returned for the TRUE case. Changed the code
+to return Ones instead of (!Arg) which was usually 1. This change
+affects iASL constant folding for this operator also.
+
+Fixed a problem in AcpiUtInitializeBuffer where an existing
+buffer was not initialized properly -- Now zero the entire buffer
+in this case where the buffer already exists.
+
+Changed the interface to AcpiOsSleep from (UINT32 Seconds, UINT32
+Milliseconds) to simply (ACPI_INTEGER Milliseconds). This
+simplifies all related code considerably. This will require
+changes/updates to all OS interface layers (OSLs.)
+
+Implemented a new external interface,
+AcpiInstallExceptionHandler, to allow a system exception handler
+to be installed. This handler is invoked upon any run-time
+exception that occurs during control method execution.
+
+Added support for the DSDT in AcpiTbFindTable. This allows the
+DataTableRegion() operator to access the local copy of the DSDT.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.8K Code, 11.4K Data, 89.2K Total
+ Debug Version: 164.2K Code, 68.2K Data, 232.4K Total
+ Current Release:
+ Non-Debug Version: 77.9K Code, 11.4K Data, 89.3K Total
+ Debug Version: 164.5K Code, 68.3K Data, 232.8K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a problem with constant folding and the LNot operator. LNot
+was returning 1 in the TRUE case, not Ones as per the ACPI
+specification. This could result in the generation of an
+incorrect folded/reduced constant.
+
+End-Of-File is now allowed within a "//"-style comment. A parse
+error no longer occurs if such a comment is at the very end of
+the input ASL source file.
+
+Implemented the "-r" option to override the Revision in the table
+header. The initial use of this option will be to simplify the
+evaluation of the AML interpreter by allowing a single ASL source
+module to be compiled for either 32-bit or 64-bit integers.
+
+
+----------------------------------------
+27 August 2004. Summary of changes for version 20040827:
+
+1) ACPI CA Core Subsystem:
+
+- Implemented support for implicit object conversion in the non-
+numeric logical operators (LEqual, LGreater, LGreaterEqual,
+LLess, LLessEqual, and LNotEqual.) Any combination of
+Integers/Strings/Buffers may now be used; the second operand is
+implicitly converted on the fly to match the type of the first
+operand. For example:
+
+ LEqual (Source1, Source2)
+
+Source1 and Source2 must each evaluate to an integer, a string,
+or a buffer. The data type of Source1 dictates the required type
+of Source2. Source2 is implicitly converted if necessary to match
+the type of Source1.
+
+- Updated and corrected the behavior of the string conversion
+support. The rules concerning conversion of buffers to strings
+(according to the ACPI specification) are as follows:
+
+ToDecimalString - explicit byte-wise conversion of buffer to
+string of decimal values (0-255) separated by commas. ToHexString
+- explicit byte-wise conversion of buffer to string of hex values
+(0-FF) separated by commas. ToString - explicit byte-wise
+conversion of buffer to string. Byte-by-byte copy with no
+transform except NULL terminated. Any other implicit buffer-to-
+string conversion - byte-wise conversion of buffer to string of
+hex values (0-FF) separated by spaces.
+
+- Fixed typo in definition of AcpiGbl_EnableInterpreterSlack.
+
+- Fixed a problem in AcpiNsGetPathnameLength where the returned
+length was one byte too short in the case of a node in the root
+scope. This could cause a fault during debug output.
+
+- Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.9K Code, 11.5K Data, 89.4K Total
+ Debug Version: 164.1K Code, 68.3K Data, 232.4K Total
+ Current Release:
+ Non-Debug Version: 77.8K Code, 11.4K Data, 89.2K Total
+ Debug Version: 164.2K Code, 68.2K Data, 232.4K Total
+
+
+2) iASL Compiler/Disassembler:
+
+- Fixed a Linux generation error.
+
+
+----------------------------------------
+16 August 2004. Summary of changes for version 20040816:
+
+1) ACPI CA Core Subsystem:
+
+Designed and implemented support within the AML interpreter for
+the so-called "implicit return". This support returns the result
+of the last ASL operation within a control method, in the absence
+of an explicit Return() operator. A few machines depend on this
+behavior, even though it is not explicitly supported by the ASL
+language. It is optional support that can be enabled at runtime
+via the AcpiGbl_EnableInterpreterSlack flag.
+
+Removed support for the PCI_Config address space from the
+internal low level hardware interfaces (AcpiHwLowLevelRead and
+AcpiHwLowLevelWrite). This support was not used internally, and
+would not work correctly anyway because the PCI bus number and
+segment number were not supported. There are separate interfaces
+for PCI configuration space access because of the unique
+interface.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 78.0K Code, 11.5K Data, 89.5K Total
+ Debug Version: 164.1K Code, 68.2K Data, 232.3K Total
+ Current Release:
+ Non-Debug Version: 77.9K Code, 11.5K Data, 89.4K Total
+ Debug Version: 164.1K Code, 68.3K Data, 232.4K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a problem where constants in ASL expressions at the root
+level (not within a control method) could be inadvertently
+truncated during code generation. This problem was introduced in
+the 20040715 release.
+
+
+----------------------------------------
+15 July 2004. Summary of changes for version 20040715:
+
+1) ACPI CA Core Subsystem:
+
+Restructured the internal HW GPE interfaces to pass/track the
+current state of interrupts (enabled/disabled) in order to avoid
+possible deadlock and increase flexibility of the interfaces.
+
+Implemented a "lexicographical compare" for String and Buffer
+objects within the logical operators -- LGreater, LLess,
+LGreaterEqual, and LLessEqual -- as per further clarification to
+the ACPI specification. Behavior is similar to C library
+"strcmp".
+
+Completed a major reduction in CPU stack use for the
+AcpiGetFirmwareTable external function. In the 32-bit non-debug
+case, the stack use has been reduced from 168 bytes to 32 bytes.
+
+Deployed a new run-time configuration flag,
+AcpiGbl_EnableInterpreterSlack, whose purpose is to allow the AML
+interpreter to forgive certain bad AML constructs. Default
+setting is FALSE.
+
+Implemented the first use of AcpiGbl_EnableInterpreterSlack in
+the Field IO support code. If enabled, it allows field access to
+go beyond the end of a region definition if the field is within
+the region length rounded up to the next access width boundary (a
+common coding error.)
+
+Renamed OSD_HANDLER to ACPI_OSD_HANDLER, and
+OSD_EXECUTION_CALLBACK to ACPI_OSD_EXEC_CALLBACK for consistency
+with other ACPI symbols. Also, these symbols are lowercased by
+the latest version of the AcpiSrc tool.
+
+The prototypes for the PCI interfaces in acpiosxf.h have been
+updated to rename "Register" to simply "Reg" to prevent certain
+compilers from complaining.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.8K Code, 11.5K Data, 89.3K Total
+ Debug Version: 163.8K Code, 68.2K Data, 232.0K Total
+ Current Release:
+ Non-Debug Version: 78.0K Code, 11.5K Data, 89.5K Total
+ Debug Version: 164.1K Code, 68.2K Data, 232.3K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Implemented full support for Package objects within the Case()
+operator. Note: The Break() operator is currently not supported
+within Case blocks (TermLists) as there is some question about
+backward compatibility with ACPI 1.0 interpreters.
+
+
+Fixed a problem where complex terms were not supported properly
+within the Switch() operator.
+
+Eliminated extraneous warning for compiler-emitted reserved names
+of the form "_T_x". (Used in Switch/Case operators.)
+
+Eliminated optimization messages for "_T_x" objects and small
+constants within the DefinitionBlock operator.
+
+
+----------------------------------------
+15 June 2004. Summary of changes for version 20040615:
+
+1) ACPI CA Core Subsystem:
+
+Implemented support for Buffer and String objects (as per ACPI
+2.0) for the following ASL operators: LEqual, LGreater, LLess,
+LGreaterEqual, and LLessEqual.
+
+All directory names in the entire source package are lower case,
+as they were in earlier releases.
+
+Implemented "Disassemble" command in the AML debugger that will
+disassemble a single control method.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.7K Code, 11.5K Data, 89.2K Total
+ Debug Version: 163.3K Code, 67.2K Data, 230.5K Total
+
+ Current Release:
+ Non-Debug Version: 77.8K Code, 11.5K Data, 89.3K Total
+ Debug Version: 163.8K Code, 68.2K Data, 232.0K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Implemented support for Buffer and String objects (as per ACPI
+2.0) for the following ASL operators: LEqual, LGreater, LLess,
+LGreaterEqual, and LLessEqual.
+
+All directory names in the entire source package are lower case,
+as they were in earlier releases.
+
+Fixed a fault when using the -g or -d<nofilename> options if the
+FADT was not found.
+
+Fixed an issue with the Windows version of the compiler where
+later versions of Windows place the FADT in the registry under
+the name "FADT" and not "FACP" as earlier versions did. This
+applies when using the -g or -d<nofilename> options. The
+compiler now looks for both strings as necessary.
+
+Fixed a problem with compiler namepath optimization where a
+namepath within the Scope() operator could not be optimized if
+the namepath was a subpath of the current scope path.
+
+----------------------------------------
+27 May 2004. Summary of changes for version 20040527:
+
+1) ACPI CA Core Subsystem:
+
+Completed a new design and implementation for EBDA (Extended BIOS
+Data Area) support in the RSDP scan code. The original code
+improperly scanned for the EBDA by simply scanning from memory
+location 0 to 0x400. The correct method is to first obtain the
+EBDA pointer from within the BIOS data area, then scan 1K of
+memory starting at the EBDA pointer. There appear to be few if
+any machines that place the RSDP in the EBDA, however.
+
+Integrated a fix for a possible fault during evaluation of
+BufferField arguments. Obsolete code that was causing the
+problem was removed.
+
+Found and fixed a problem in the Field Support Code where data
+could be corrupted on a bit field read that starts on an aligned
+boundary but does not end on an aligned boundary. Merged the
+read/write "datum length" calculation code into a common
+procedure.
+
+Rolled in a couple of changes to the FreeBSD-specific header.
+
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.6K Code, 11.5K Data, 89.1K Total
+ Debug Version: 163.2K Code, 67.2K Data, 230.4K Total
+ Current Release:
+ Non-Debug Version: 77.7K Code, 11.5K Data, 89.2K Total
+ Debug Version: 163.3K Code, 67.2K Data, 230.5K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Fixed a generation warning produced by some overly-verbose
+compilers for a 64-bit constant.
+
+----------------------------------------
+14 May 2004. Summary of changes for version 20040514:
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem where hardware GPE enable bits sometimes not set
+properly during and after GPE method execution. Result of 04/27
+changes.
+
+Removed extra "clear all GPEs" when sleeping/waking.
+
+Removed AcpiHwEnableGpe and AcpiHwDisableGpe, replaced by the
+single AcpiHwWriteGpeEnableReg. Changed a couple of calls to the
+functions above to the new AcpiEv* calls as appropriate.
+
+ACPI_OS_NAME was removed from the OS-specific headers. The
+default name is now "Microsoft Windows NT" for maximum
+compatibility. However this can be changed by modifying the
+acconfig.h file.
+
+Allow a single invocation of AcpiInstallNotifyHandler for a
+handler that traps both types of notifies (System, Device). Use
+ACPI_ALL_NOTIFY flag.
+
+Run _INI methods on ThermalZone objects. This is against the
+ACPI specification, but there is apparently ASL code in the field
+that has these _INI methods, and apparently "other" AML
+interpreters execute them.
+
+Performed a full 16/32/64 bit lint that resulted in some small
+changes.
+
+Added a sleep simulation command to the AML debugger to test
+sleep code.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.6K Code, 11.5K Data, 89.1K Total
+ Debug Version: 162.9K Code, 67.0K Data, 229.9K Total
+ Current Release:
+ Non-Debug Version: 77.6K Code, 11.5K Data, 89.1K Total
+ Debug Version: 163.2K Code, 67.2K Data, 230.4K Total
+
+----------------------------------------
+27 April 2004. Summary of changes for version 20040427:
+
+1) ACPI CA Core Subsystem:
+
+Completed a major overhaul of the GPE handling within ACPI CA.
+There are now three types of GPEs: wake-only, runtime-only, and
+combination wake/run. The only GPEs allowed to be combination
+wake/run are for button-style devices such as a control-method
+power button, control-method sleep button, or a notebook lid
+switch. GPEs that have an _Lxx or _Exx method and are not
+referenced by any _PRW methods are marked for "runtime" and
+hardware enabled. Any GPE that is referenced by a _PRW method is
+marked for "wake" (and disabled at runtime). However, at sleep
+time, only those GPEs that have been specifically enabled for
+wake via the AcpiEnableGpe interface will actually be hardware
+enabled.
+
+A new external interface has been added, AcpiSetGpeType(), that
+is meant to be used by device drivers to force a GPE to a
+particular type. It will be especially useful for the drivers
+for the button devices mentioned above.
+
+Completed restructuring of the ACPI CA initialization sequence so
+that default operation region handlers are installed before GPEs
+are initialized and the _PRW methods are executed. This will
+prevent errors when the _PRW methods attempt to access system
+memory or I/O space.
+
+GPE enable/disable no longer reads the GPE enable register. We
+now keep the enable info for runtime and wake separate and in the
+GPE_EVENT_INFO. We thus no longer depend on the hardware to
+maintain these bits.
+
+Always clear the wake status and fixed/GPE status bits before
+sleep, even for state S5.
+
+Improved the AML debugger output for displaying the GPE blocks
+and their current status.
+
+Added new strings for the _OSI method, of the form "Windows 2001
+SPx" where x = 0,1,2,3,4.
+
+Fixed a problem where the physical address was incorrectly
+calculated when the Load() operator was used to directly load
+from an Operation Region (vs. loading from a Field object.) Also
+added check for minimum table length for this case.
+
+Fix for multiple mutex acquisition. Restore original thread
+SyncLevel on mutex release.
+
+Added ACPI_VALID_SXDS flag to the AcpiGetObjectInfo interface for
+consistency with the other fields returned.
+
+Shrunk the ACPI_GPE_EVENT_INFO structure by 40%. There is one
+such structure for each GPE in the system, so the size of this
+structure is important.
+
+CPU stack requirement reduction: Cleaned up the method execution
+and object evaluation paths so that now a parameter structure is
+passed, instead of copying the various method parameters over and
+over again.
+
+In evregion.c: Correctly exit and reenter the interpreter region
+if and only if dispatching an operation region request to a user-
+installed handler. Do not exit/reenter when dispatching to a
+default handler (e.g., default system memory or I/O handlers)
+
+
+Notes for updating drivers for the new GPE support. The
+following changes must be made to ACPI-related device drivers
+that are attached to one or more GPEs: (This information will be
+added to the ACPI CA Programmer Reference.)
+
+1) AcpiInstallGpeHandler no longer automatically enables the GPE,
+you must explicitly call AcpiEnableGpe.
+2) There is a new interface called AcpiSetGpeType. This should be
+called before enabling the GPE. Also, this interface will
+automatically disable the GPE if it is currently enabled.
+3) AcpiEnableGpe no longer supports a GPE type flag.
+
+Specific drivers that must be changed:
+1) EC driver:
+ AcpiInstallGpeHandler (NULL, GpeNum, ACPI_GPE_EDGE_TRIGGERED,
+AeGpeHandler, NULL);
+ AcpiSetGpeType (NULL, GpeNum, ACPI_GPE_TYPE_RUNTIME);
+ AcpiEnableGpe (NULL, GpeNum, ACPI_NOT_ISR);
+
+2) Button Drivers (Power, Lid, Sleep):
+Run _PRW method under parent device
+If _PRW exists: /* This is a control-method button */
+ Extract GPE number and possibly GpeDevice
+ AcpiSetGpeType (GpeDevice, GpeNum, ACPI_GPE_TYPE_WAKE_RUN);
+ AcpiEnableGpe (GpeDevice, GpeNum, ACPI_NOT_ISR);
+
+For all other devices that have _PRWs, we automatically set the
+GPE type to ACPI_GPE_TYPE_WAKE, but the GPE is NOT automatically
+(wake) enabled. This must be done on a selective basis, usually
+requiring some kind of user app to allow the user to pick the
+wake devices.
+
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 77.0K Code, 11.4K Data, 88.4K Total
+ Debug Version: 161.0K Code, 66.3K Data, 227.3K Total
+ Current Release:
+
+ Non-Debug Version: 77.6K Code, 11.5K Data, 89.1K Total
+ Debug Version: 162.9K Code, 67.0K Data, 229.9K Total
+
+
+
+----------------------------------------
+02 April 2004. Summary of changes for version 20040402:
+
+1) ACPI CA Core Subsystem:
+
+Fixed an interpreter problem where an indirect store through an
+ArgX parameter was incorrectly applying the "implicit conversion
+rules" during the store. From the ACPI specification: "If the
+target is a method local or argument (LocalX or ArgX), no
+conversion is performed and the result is stored directly to the
+target". The new behavior is to disable implicit conversion
+during ALL stores to an ArgX.
+
+Changed the behavior of the _PRW method scan to ignore any and
+all errors returned by a given _PRW. This prevents the scan from
+aborting from the failure of any single _PRW.
+
+Moved the runtime configuration parameters from the global init
+procedure to static variables in acglobal.h. This will allow the
+host to override the default values easily.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 76.9K Code, 11.4K Data, 88.3K Total
+ Debug Version: 160.8K Code, 66.1K Data, 226.9K Total
+ Current Release:
+ Non-Debug Version: 77.0K Code, 11.4K Data, 88.4K Total
+ Debug Version: 161.0K Code, 66.3K Data, 227.3K Total
+
+
+2) iASL Compiler/Disassembler:
+
+iASL now fully disassembles SSDTs. However, External()
+statements are not generated automatically for unresolved symbols
+at this time. This is a planned feature for future
+implementation.
+
+Fixed a scoping problem in the disassembler that occurs when the
+type of the target of a Scope() operator is overridden. This
+problem caused an incorrectly nested internal namespace to be
+constructed.
+
+Any warnings or errors that are emitted during disassembly are
+now commented out automatically so that the resulting file can be
+recompiled without any hand editing.
+
+----------------------------------------
+26 March 2004. Summary of changes for version 20040326:
+
+1) ACPI CA Core Subsystem:
+
+Implemented support for "wake" GPEs via interaction between GPEs
+and the _PRW methods. Every GPE that is pointed to by one or
+more _PRWs is identified as a WAKE GPE and by default will no
+longer be enabled at runtime. Previously, we were blindly
+enabling all GPEs with a corresponding _Lxx or _Exx method - but
+most of these turn out to be WAKE GPEs anyway. We believe this
+has been the cause of thousands of "spurious" GPEs on some
+systems.
+
+This new GPE behavior is can be reverted to the original behavior
+(enable ALL GPEs at runtime) via a runtime flag.
+
+Fixed a problem where aliased control methods could not access
+objects properly. The proper scope within the namespace was not
+initialized (transferred to the target of the aliased method)
+before executing the target method.
+
+Fixed a potential race condition on internal object deletion on
+the return object in AcpiEvaluateObject.
+
+Integrated a fix for resource descriptors where both _MEM and
+_MTP were being extracted instead of just _MEM. (i.e. bitmask
+was incorrectly too wide, 0x0F instead of 0x03.)
+
+Added a special case for ACPI_ROOT_OBJECT in AcpiUtGetNodeName,
+preventing a fault in some cases.
+
+Updated Notify() values for debug statements in evmisc.c
+
+Return proper status from AcpiUtMutexInitialize, not just simply
+AE_OK.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+
+ Non-Debug Version: 76.5K Code, 11.3K Data, 87.8K Total
+ Debug Version: 160.3K Code, 66.0K Data, 226.3K Total
+ Current Release:
+ Non-Debug Version: 76.9K Code, 11.4K Data, 88.3K Total
+ Debug Version: 160.8K Code, 66.1K Data, 226.9K Total
+
+----------------------------------------
+11 March 2004. Summary of changes for version 20040311:
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem where errors occurring during the parse phase of
+control method execution did not abort cleanly. For example,
+objects created and installed in the namespace were not deleted.
+This caused all subsequent invocations of the method to return
+the AE_ALREADY_EXISTS exception.
+
+Implemented a mechanism to force a control method to "Serialized"
+execution if the method attempts to create namespace objects.
+(The root of the AE_ALREADY_EXISTS problem.)
+
+Implemented support for the predefined _OSI "internal" control
+method. Initial supported strings are "Linux", "Windows 2000",
+"Windows 2001", and "Windows 2001.1", and can be easily upgraded
+for new strings as necessary. This feature will allow "other"
+operating systems to execute the fully tested, "Windows" code
+path through the ASL code
+
+Global Lock Support: Now allows multiple acquires and releases
+with any internal thread. Removed concept of "owning thread" for
+this special mutex.
+
+Fixed two functions that were inappropriately declaring large
+objects on the CPU stack: PsParseLoop, NsEvaluateRelative.
+Reduces the stack usage during method execution considerably.
+
+Fixed a problem in the ACPI 2.0 FACS descriptor (actbl2.h) where
+the S4Bios_f field was incorrectly defined as UINT32 instead of
+UINT32_BIT.
+
+Fixed a problem where AcpiEvGpeDetect would fault if there were
+no GPEs defined on the machine.
+
+Implemented two runtime options: One to force all control method
+execution to "Serialized" to mimic Windows behavior, another to
+disable _OSI support if it causes problems on a given machine.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler and the compiler options used during generation.
+
+ Previous Release:
+ Non-Debug Version: 74.8K Code, 10.1K Data, 84.9K Total
+ Debug Version: 158.7K Code, 65.1K Data, 223.8K Total
+ Current Release:
+ Non-Debug Version: 76.5K Code, 11.3K Data, 87.8K Total
+ Debug Version: 160.3K Code, 66.0K Data, 226.3K Total
+
+2) iASL Compiler/Disassembler:
+
+Fixed an array size problem for FreeBSD that would cause the
+compiler to fault.
+
+----------------------------------------
+20 February 2004. Summary of changes for version 20040220:
+
+
+1) ACPI CA Core Subsystem:
+
+Implemented execution of _SxD methods for Device objects in the
+GetObjectInfo interface.
+
+Fixed calls to _SST method to pass the correct arguments.
+
+Added a call to _SST on wake to restore to "working" state.
+
+Check for End-Of-Buffer failure case in the WalkResources
+interface.
+
+Integrated fix for 64-bit alignment issue in acglobal.h by moving
+two structures to the beginning of the file.
+
+After wake, clear GPE status register(s) before enabling GPEs.
+
+After wake, clear/enable power button. (Perhaps we should
+clear/enable all fixed events upon wake.)
+
+Fixed a couple of possible memory leaks in the Namespace manager.
+
+Integrated latest acnetbsd.h file.
+
+----------------------------------------
+11 February 2004. Summary of changes for version 20040211:
+
+
+1) ACPI CA Core Subsystem:
+
+Completed investigation and implementation of the call-by-
+reference mechanism for control method arguments.
+
+Fixed a problem where a store of an object into an indexed
+package could fail if the store occurs within a different method
+than the method that created the package.
+
+Fixed a problem where the ToDecimal operator could return
+incorrect results.
+
+Fixed a problem where the CopyObject operator could fail on some
+of the more obscure objects (e.g., Reference objects.)
+
+Improved the output of the Debug object to display buffer,
+package, and index objects.
+
+Fixed a problem where constructs of the form "RefOf (ArgX)" did
+not return the expected result.
+
+Added permanent ACPI_REPORT_ERROR macros for all instances of the
+ACPI_AML_INTERNAL exception.
+
+Integrated latest version of acfreebsd.h
+
+----------------------------------------
+16 January 2004. Summary of changes for version 20040116:
+
+The purpose of this release is primarily to update the copyright
+years in each module, thus causing a huge number of diffs. There
+are a few small functional changes, however.
+
+1) ACPI CA Core Subsystem:
+
+Improved error messages when there is a problem finding one or
+more of the required base ACPI tables
+
+Reintroduced the definition of APIC_HEADER in actbl.h
+
+Changed definition of MADT_ADDRESS_OVERRIDE to 64 bits (actbl.h)
+
+Removed extraneous reference to NewObj in dsmthdat.c
+
+2) iASL compiler
+
+Fixed a problem introduced in December that disabled the correct
+disassembly of Resource Templates
+
+
+----------------------------------------
+03 December 2003. Summary of changes for version 20031203:
+
+1) ACPI CA Core Subsystem:
+
+Changed the initialization of Operation Regions during subsystem
+init to perform two entire walks of the ACPI namespace; The first
+to initialize the regions themselves, the second to execute the
+_REG methods. This fixed some interdependencies across _REG
+methods found on some machines.
+
+Fixed a problem where a Store(Local0, Local1) could simply update
+the object reference count, and not create a new copy of the
+object if the Local1 is uninitialized.
+
+Implemented support for the _SST reserved method during sleep
+transitions.
+
+Implemented support to clear the SLP_TYP and SLP_EN bits when
+waking up, this is apparently required by some machines.
+
+When sleeping, clear the wake status only if SleepState is not
+S5.
+
+Fixed a problem in AcpiRsExtendedIrqResource() where an incorrect
+pointer arithmetic advanced a string pointer too far.
+
+Fixed a problem in AcpiTbGetTablePtr() where a garbage pointer
+could be returned if the requested table has not been loaded.
+
+Within the support for IRQ resources, restructured the handling
+of
+the active and edge/level bits.
+
+Fixed a few problems in AcpiPsxExecute() where memory could be
+leaked under certain error conditions.
+
+Improved error messages for the cases where the ACPI mode could
+not be entered.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler
+and the compiler options used during generation.
+
+ Previous Release (20031029):
+ Non-Debug Version: 74.4K Code, 10.1K Data, 84.5K Total
+ Debug Version: 158.3K Code, 65.0K Data, 223.3K Total
+ Current Release:
+ Non-Debug Version: 74.8K Code, 10.1K Data, 84.9K Total
+ Debug Version: 158.7K Code, 65.1K Data, 223.8K Total
+
+2) iASL Compiler/Disassembler:
+
+Implemented a fix for the iASL disassembler where a bad index was
+generated. This was most noticeable on 64-bit platforms
+
+
+----------------------------------------
+29 October 2003. Summary of changes for version 20031029:
+
+1) ACPI CA Core Subsystem:
+
+
+Fixed a problem where a level-triggered GPE with an associated
+_Lxx control method was incorrectly cleared twice.
+
+Fixed a problem with the Field support code where an access can
+occur beyond the end-of-region if the field is non-aligned but
+extends to the very end of the parent region (resulted in an
+AE_AML_REGION_LIMIT exception.)
+
+Fixed a problem with ACPI Fixed Events where an RT Clock handler
+would not get invoked on an RTC event. The RTC event bitmasks
+for
+the PM1 registers were not being initialized properly.
+
+Implemented support for executing _STA and _INI methods for
+Processor objects. Although this is currently not part of the
+ACPI specification, there is existing ASL code that depends on
+the
+init-time execution of these methods.
+
+Implemented and deployed a GetDescriptorName function to decode
+the various types of internal descriptors. Guards against null
+descriptors during debug output also.
+
+Implemented and deployed a GetNodeName function to extract the 4-
+character namespace node name. This function simplifies the
+debug
+and error output, as well as guarding against null pointers
+during
+output.
+
+Implemented and deployed the ACPI_FORMAT_UINT64 helper macro to
+simplify the debug and error output of 64-bit integers. This
+macro replaces the HIDWORD and LODWORD macros for dumping these
+integers.
+
+Updated the implementation of the Stall() operator to only call
+AcpiOsStall(), and also return an error if the operand is larger
+than 255. This preserves the required behavior of not
+relinquishing the processor, as would happen if AcpiOsSleep() was
+called for "long stalls".
+
+Constructs of the form "Store(LocalX,LocalX)" where LocalX is not
+initialized are now treated as NOOPs.
+
+Cleaned up a handful of warnings during 64-bit generation.
+
+Fixed a reported error where and incorrect GPE number was passed
+to the GPE dispatch handler. This value is only used for error
+output, however. Used this opportunity to clean up and
+streamline
+the GPE dispatch code.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler
+and the compiler options used during generation.
+
+ Previous Release (20031002):
+ Non-Debug Version: 74.1K Code, 9.7K Data, 83.8K Total
+ Debug Version: 157.9K Code, 64.8K Data, 222.7K Total
+ Current Release:
+ Non-Debug Version: 74.4K Code, 10.1K Data, 84.5K Total
+ Debug Version: 158.3K Code, 65.0K Data, 223.3K Total
+
+
+2) iASL Compiler/Disassembler:
+
+Updated the iASL compiler to return an error if the operand to
+the
+Stall() operator is larger than 255.
+
+
+----------------------------------------
+02 October 2003. Summary of changes for version 20031002:
+
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem with Index Fields where the index was not
+incremented for fields that require multiple writes to the
+index/data registers (Fields that are wider than the data
+register.)
+
+Fixed a problem with all Field objects where a write could go
+beyond the end-of-field if the field was larger than the access
+granularity and therefore required multiple writes to complete
+the
+request. An extra write beyond the end of the field could happen
+inadvertently.
+
+Fixed a problem with Index Fields where a BUFFER_OVERFLOW error
+would incorrectly be returned if the width of the Data Register
+was larger than the specified field access width.
+
+Completed fixes for LoadTable() and Unload() and verified their
+operation. Implemented full support for the "DdbHandle" object
+throughout the ACPI CA subsystem.
+
+Implemented full support for the MADT and ECDT tables in the ACPI
+CA header files. Even though these tables are not directly
+consumed by ACPI CA, the header definitions are useful for ACPI
+device drivers.
+
+Integrated resource descriptor fixes posted to the Linux ACPI
+list. This included checks for minimum descriptor length, and
+support for trailing NULL strings within descriptors that have
+optional string elements.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler
+and the compiler options used during generation.
+
+ Previous Release (20030918):
+ Non-Debug Version: 73.9K Code, 9.7K Data, 83.6K Total
+ Debug Version: 157.3K Code, 64.5K Data, 221.8K Total
+ Current Release:
+ Non-Debug Version: 74.1K Code, 9.7K Data, 83.8K Total
+ Debug Version: 157.9K Code, 64.8K Data, 222.7K Total
+
+
+2) iASL Compiler:
+
+Implemented detection of non-ASCII characters within the input
+source ASL file. This catches attempts to compile binary (AML)
+files early in the compile, with an informative error message.
+
+Fixed a problem where the disassembler would fault if the output
+filename could not be generated or if the output file could not
+be
+opened.
+
+----------------------------------------
+18 September 2003. Summary of changes for version 20030918:
+
+
+1) ACPI CA Core Subsystem:
+
+Found and fixed a longstanding problem with the late execution of
+the various deferred AML opcodes (such as Operation Regions,
+Buffer Fields, Buffers, and Packages). If the name string
+specified for the name of the new object placed the object in a
+scope other than the current scope, the initialization/execution
+of the opcode failed. The solution to this problem was to
+implement a mechanism where the late execution of such opcodes
+does not attempt to lookup/create the name a second time in an
+incorrect scope. This fixes the "region size computed
+incorrectly" problem.
+
+Fixed a call to AcpiHwRegisterWrite in hwregs.c that was causing
+a
+Global Lock AE_BAD_PARAMETER error.
+
+Fixed several 64-bit issues with prototypes, casting and data
+types.
+
+Removed duplicate prototype from acdisasm.h
+
+Fixed an issue involving EC Operation Region Detach (Shaohua Li)
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler
+and the compiler options used during generation.
+
+ Previous Release:
+
+ Non-Debug Version: 73.7K Code, 9.7K Data, 83.4K Total
+ Debug Version: 156.9K Code, 64.2K Data, 221.1K Total
+ Current Release:
+ Non-Debug Version: 73.9K Code, 9.7K Data, 83.6K Total
+ Debug Version: 157.3K Code, 64.5K Data, 221.8K Total
+
+
+2) Linux:
+
+Fixed the AcpiOsSleep implementation in osunixxf.c to pass the
+correct sleep time in seconds.
+
+----------------------------------------
+14 July 2003. Summary of changes for version 20030619:
+
+1) ACPI CA Core Subsystem:
+
+Parse SSDTs in order discovered, as opposed to reverse order
+(Hrvoje Habjanic)
+
+Fixes from FreeBSD and NetBSD. (Frank van der Linden, Thomas
+Klausner,
+ Nate Lawson)
+
+
+2) Linux:
+
+Dynamically allocate SDT list (suggested by Andi Kleen)
+
+proc function return value cleanups (Andi Kleen)
+
+Correctly handle NMI watchdog during long stalls (Andrew Morton)
+
+Make it so acpismp=force works (reported by Andrew Morton)
+
+
+----------------------------------------
+19 June 2003. Summary of changes for version 20030619:
+
+1) ACPI CA Core Subsystem:
+
+Fix To/FromBCD, eliminating the need for an arch-specific
+#define.
+
+Do not acquire a semaphore in the S5 shutdown path.
+
+Fix ex_digits_needed for 0. (Takayoshi Kochi)
+
+Fix sleep/stall code reversal. (Andi Kleen)
+
+Revert a change having to do with control method calling
+semantics.
+
+2) Linux:
+
+acpiphp update (Takayoshi Kochi)
+
+Export acpi_disabled for sonypi (Stelian Pop)
+
+Mention acpismp=force in config help
+
+Re-add acpitable.c and acpismp=force. This improves backwards
+
+compatibility and also cleans up the code to a significant
+degree.
+
+Add ASUS Value-add driver (Karol Kozimor and Julien Lerouge)
+
+----------------------------------------
+22 May 2003. Summary of changes for version 20030522:
+
+1) ACPI CA Core Subsystem:
+
+Found and fixed a reported problem where an AE_NOT_FOUND error
+occurred occasionally during _BST evaluation. This turned out to
+be an Owner ID allocation issue where a called method did not get
+a new ID assigned to it. Eventually, (after 64k calls), the
+Owner
+ID UINT16 would wraparound so that the ID would be the same as
+the
+caller's and the called method would delete the caller's
+namespace.
+
+Implemented extended error reporting for control methods that are
+aborted due to a run-time exception. Output includes the exact
+AML instruction that caused the method abort, a dump of the
+method
+locals and arguments at the time of the abort, and a trace of all
+nested control method calls.
+
+Modified the interpreter to allow the creation of buffers of zero
+length from the AML code. Implemented new code to ensure that no
+attempt is made to actually allocate a memory buffer (of length
+zero) - instead, a simple buffer object with a NULL buffer
+pointer
+and length zero is created. A warning is no longer issued when
+the AML attempts to create a zero-length buffer.
+
+Implemented a workaround for the "leading asterisk issue" in
+_HIDs, _UIDs, and _CIDs in the AML interpreter. One leading
+asterisk is automatically removed if present in any HID, UID, or
+CID strings. The iASL compiler will still flag this asterisk as
+an error, however.
+
+Implemented full support for _CID methods that return a package
+of
+multiple CIDs (Compatible IDs). The AcpiGetObjectInfo()
+interface
+now additionally returns a device _CID list if present. This
+required a change to the external interface in order to pass an
+ACPI_BUFFER object as a parameter since the _CID list is of
+variable length.
+
+Fixed a problem with the new AE_SAME_HANDLER exception where
+handler initialization code did not know about this exception.
+
+Code and Data Size: Current and previous core subsystem library
+sizes are shown below. These are the code and data sizes for the
+acpica.lib produced by the Microsoft Visual C++ 6.0 compiler, and
+these values do not include any ACPI driver or OSPM code. The
+debug version of the code includes the debug output trace
+mechanism and has a much larger code and data size. Note that
+these values will vary depending on the efficiency of the
+compiler
+and the compiler options used during generation.
+
+ Previous Release (20030509):
+ Non-Debug Version: 73.4K Code, 9.7K Data, 83.1K Total
+ Debug Version: 156.1K Code, 63.9K Data, 220.0K Total
+ Current Release:
+ Non-Debug Version: 73.7K Code, 9.7K Data, 83.4K Total
+ Debug Version: 156.9K Code, 64.2K Data, 221.1K Total
+
+
+2) Linux:
+
+Fixed a bug in which we would reinitialize the ACPI interrupt
+after it was already working, thus disabling all ACPI and the
+IRQs
+for any other device sharing the interrupt. (Thanks to Stian
+Jordet)
+
+Toshiba driver update (John Belmonte)
+
+Return only 0 or 1 for our interrupt handler status (Andrew
+Morton)
+
+
+3) iASL Compiler:
+
+Fixed a reported problem where multiple (nested) ElseIf()
+statements were not handled correctly by the compiler, resulting
+in incorrect warnings and incorrect AML code. This was a problem
+in both the ASL parser and the code generator.
+
+
+4) Documentation:
+
+Added changes to existing interfaces, new exception codes, and
+new
+text concerning reference count object management versus garbage
+collection.
+
+----------------------------------------
+09 May 2003. Summary of changes for version 20030509.
+
+
+1) ACPI CA Core Subsystem:
+
+Changed the subsystem initialization sequence to hold off
+installation of address space handlers until the hardware has
+been
+initialized and the system has entered ACPI mode. This is
+because
+the installation of space handlers can cause _REG methods to be
+run. Previously, the _REG methods could potentially be run
+before
+ACPI mode was enabled.
+
+Fixed some memory leak issues related to address space handler
+and
+notify handler installation. There were some problems with the
+reference count mechanism caused by the fact that the handler
+objects are shared across several namespace objects.
+
+Fixed a reported problem where reference counts within the
+namespace were not properly updated when named objects created by
+method execution were deleted.
+
+Fixed a reported problem where multiple SSDTs caused a deletion
+issue during subsystem termination. Restructured the table data
+structures to simplify the linked lists and the related code.
+
+Fixed a problem where the table ID associated with secondary
+tables (SSDTs) was not being propagated into the namespace
+objects
+created by those tables. This would only present a problem for
+tables that are unloaded at run-time, however.
+
+Updated AcpiOsReadable and AcpiOsWritable to use the ACPI_SIZE
+type as the length parameter (instead of UINT32).
+
+Solved a long-standing problem where an ALREADY_EXISTS error
+appears on various systems. This problem could happen when there
+are multiple PCI_Config operation regions under a single PCI root
+bus. This doesn't happen very frequently, but there are some
+systems that do this in the ASL.
+
+Fixed a reported problem where the internal DeleteNode function
+was incorrectly handling the case where a namespace node was the
+first in the parent's child list, and had additional peers (not
+the only child, but first in the list of children.)
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values
+will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 73.7K Code, 9.5K Data, 83.2K Total
+ Debug Version: 156.1K Code, 63.6K Data, 219.7K Total
+ Current Release:
+ Non-Debug Version: 73.4K Code, 9.7K Data, 83.1K Total
+ Debug Version: 156.1K Code, 63.9K Data, 220.0K Total
+
+
+2) Linux:
+
+Allow ":" in OS override string (Ducrot Bruno)
+
+Kobject fix (Greg KH)
+
+
+3 iASL Compiler/Disassembler:
+
+Fixed a problem in the generation of the C source code files (AML
+is emitted in C source statements for BIOS inclusion) where the
+Ascii dump that appears within a C comment at the end of each
+line
+could cause a compile time error if the AML sequence happens to
+have an open comment or close comment sequence embedded.
+
+
+----------------------------------------
+24 April 2003. Summary of changes for version 20030424.
+
+
+1) ACPI CA Core Subsystem:
+
+Support for big-endian systems has been implemented. Most of the
+support has been invisibly added behind big-endian versions of
+the
+ACPI_MOVE_* macros.
+
+Fixed a problem in AcpiHwDisableGpeBlock() and
+AcpiHwClearGpeBlock() where an incorrect offset was passed to the
+low level hardware write routine. The offset parameter was
+actually eliminated from the low level read/write routines
+because
+they had become obsolete.
+
+Fixed a problem where a handler object was deleted twice during
+the removal of a fixed event handler.
+
+
+2) Linux:
+
+A fix for SMP systems with link devices was contributed by
+
+Compaq's Dan Zink.
+
+(2.5) Return whether we handled the interrupt in our IRQ handler.
+(Linux ISRs no longer return void, so we can propagate the
+handler
+return value from the ACPI CA core back to the OS.)
+
+
+
+3) Documentation:
+
+The ACPI CA Programmer Reference has been updated to reflect new
+interfaces and changes to existing interfaces.
+
+----------------------------------------
+28 March 2003. Summary of changes for version 20030328.
+
+1) ACPI CA Core Subsystem:
+
+The GPE Block Device support has been completed. New interfaces
+are AcpiInstallGpeBlock and AcpiRemoveGpeBlock. The Event
+interfaces (enable, disable, clear, getstatus) have been split
+into separate interfaces for Fixed Events and General Purpose
+Events (GPEs) in order to support GPE Block Devices properly.
+
+Fixed a problem where the error message "Failed to acquire
+semaphore" would appear during operations on the embedded
+controller (EC).
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values
+will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 72.3K Code, 9.5K Data, 81.8K Total
+ Debug Version: 154.0K Code, 63.4K Data, 217.4K Total
+ Current Release:
+ Non-Debug Version: 73.7K Code, 9.5K Data, 83.2K Total
+ Debug Version: 156.1K Code, 63.6K Data, 219.7K Total
+
+
+----------------------------------------
+28 February 2003. Summary of changes for version 20030228.
+
+
+1) ACPI CA Core Subsystem:
+
+The GPE handling and dispatch code has been completely overhauled
+in preparation for support of GPE Block Devices (ID ACPI0006).
+This affects internal data structures and code only; there should
+be no differences visible externally. One new file has been
+added, evgpeblk.c
+
+The FADT fields GPE0_BLK_LEN and GPE1_BLK_LEN are now the only
+fields that are used to determine the GPE block lengths. The
+REGISTER_BIT_WIDTH field of the X_GPEx_BLK extended address
+structures are ignored. This is per the ACPI specification but
+it
+isn't very clear. The full 256 Block 0/1 GPEs are now supported
+(the use of REGISTER_BIT_WIDTH limited the number of GPEs to
+128).
+
+In the SCI interrupt handler, removed the read of the PM1_CONTROL
+register to look at the SCI_EN bit. On some machines, this read
+causes an SMI event and greatly slows down SCI events. (This may
+in fact be the cause of slow battery status response on some
+systems.)
+
+Fixed a problem where a store of a NULL string to a package
+object
+could cause the premature deletion of the object. This was seen
+during execution of the battery _BIF method on some systems,
+resulting in no battery data being returned.
+
+Added AcpiWalkResources interface to simplify parsing of resource
+lists.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values
+will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 72.0K Code, 9.5K Data, 81.5K Total
+ Debug Version: 153.0K Code, 62.9K Data, 215.9K Total
+ Current Release:
+ Non-Debug Version: 72.3K Code, 9.5K Data, 81.8K Total
+ Debug Version: 154.0K Code, 63.4K Data, 217.4K Total
+
+
+2) Linux
+
+S3 fixes (Ole Rohne)
+
+Update ACPI PHP driver with to use new acpi_walk_resource API
+(Bjorn Helgaas)
+
+Add S4BIOS support (Pavel Machek)
+
+Map in entire table before performing checksum (John Stultz)
+
+Expand the mem= cmdline to allow the specification of reserved
+and
+ACPI DATA blocks (Pavel Machek)
+
+Never use ACPI on VISWS
+
+Fix derive_pci_id (Ducrot Bruno, Alvaro Lopez)
+
+Revert a change that allowed P_BLK lengths to be 4 or 5. This is
+causing us to think that some systems support C2 when they really
+don't.
+
+Do not count processor objects for non-present CPUs (Thanks to
+Dominik Brodowski)
+
+
+3) iASL Compiler:
+
+Fixed a problem where ASL include files could not be found and
+opened.
+
+Added support for the _PDC reserved name.
+
+
+----------------------------------------
+22 January 2003. Summary of changes for version 20030122.
+
+
+1) ACPI CA Core Subsystem:
+
+Added a check for constructs of the form: Store (Local0, Local0)
+where Local0 is not initialized. Apparently, some BIOS
+programmers believe that this is a NOOP. Since this store
+doesn't
+do anything anyway, the new prototype behavior will ignore this
+error. This is a case where we can relax the strict checking in
+the interpreter in the name of compatibility.
+
+
+2) Linux
+
+The AcpiSrc Source Conversion Utility has been released with the
+Linux package for the first time. This is the utility that is
+used to convert the ACPI CA base source code to the Linux
+version.
+
+(Both) Handle P_BLK lengths shorter than 6 more gracefully
+
+(Both) Move more headers to include/acpi, and delete an unused
+header.
+
+(Both) Move drivers/acpi/include directory to include/acpi
+
+(Both) Boot functions don't use cmdline, so don't pass it around
+
+(Both) Remove include of unused header (Adrian Bunk)
+
+(Both) acpiphp.h includes both linux/acpi.h and acpi_bus.h. Since
+the
+former now also includes the latter, acpiphp.h only needs the
+one,
+now.
+
+(2.5) Make it possible to select method of bios restoring after
+S3
+resume. [=> no more ugly ifdefs] (Pavel Machek)
+
+(2.5) Make proc write interfaces work (Pavel Machek)
+
+(2.5) Properly init/clean up in cpufreq/acpi (Dominik Brodowski)
+
+(2.5) Break out ACPI Perf code into its own module, under cpufreq
+(Dominik Brodowski)
+
+(2.4) S4BIOS support (Ducrot Bruno)
+
+(2.4) Fix acpiphp_glue.c for latest ACPI struct changes (Sergio
+Visinoni)
+
+
+3) iASL Compiler:
+
+Added support to disassemble SSDT and PSDTs.
+
+Implemented support to obtain SSDTs from the Windows registry if
+available.
+
+
+----------------------------------------
+09 January 2003. Summary of changes for version 20030109.
+
+1) ACPI CA Core Subsystem:
+
+Changed the behavior of the internal Buffer-to-String conversion
+function. The current ACPI specification states that the
+contents
+of the buffer are "converted to a string of two-character
+hexadecimal numbers, each separated by a space". Unfortunately,
+this definition is not backwards compatible with existing ACPI
+1.0
+implementations (although the behavior was not defined in the
+ACPI
+1.0 specification). The new behavior simply copies data from the
+buffer to the string until a null character is found or the end
+of
+the buffer is reached. The new String object is always null
+terminated. This problem was seen during the generation of _BIF
+battery data where incorrect strings were returned for battery
+type, etc. This will also require an errata to the ACPI
+specification.
+
+Renamed all instances of NATIVE_UINT and NATIVE_INT to
+ACPI_NATIVE_UINT and ACPI_NATIVE_INT, respectively.
+
+Copyright in all module headers (both Linux and non-Linux) has be
+updated to 2003.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values
+will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 72.0K Code, 9.5K Data, 81.5K Total
+ Debug Version: 153.0K Code, 62.9K Data, 215.9K Total
+ Current Release:
+ Non-Debug Version: 72.0K Code, 9.5K Data, 81.5K Total
+ Debug Version: 153.0K Code, 62.9K Data, 215.9K Total
+
+
+2) Linux
+
+Fixed an oops on module insertion/removal (Matthew Tippett)
+
+(2.4) Fix to handle dynamic size of mp_irqs (Joerg Prante)
+
+(2.5) Replace pr_debug (Randy Dunlap)
+
+(2.5) Remove usage of CPUFREQ_ALL_CPUS (Dominik Brodowski)
+
+(Both) Eliminate spawning of thread from timer callback, in favor
+of schedule_work()
+
+(Both) Show Lid status in /proc (Zdenek OGAR Skalak)
+
+(Both) Added define for Fixed Function HW region (Matthew Wilcox)
+
+(Both) Add missing statics to button.c (Pavel Machek)
+
+Several changes have been made to the source code translation
+utility that generates the Linux Code in order to make the code
+more "Linux-like":
+
+All typedefs on structs and unions have been removed in keeping
+with the Linux coding style.
+
+Removed the non-Linux SourceSafe module revision number from each
+module header.
+
+Completed major overhaul of symbols to be lowercased for linux.
+Doubled the number of symbols that are lowercased.
+
+Fixed a problem where identifiers within procedure headers and
+within quotes were not fully lower cased (they were left with a
+starting capital.)
+
+Some C macros whose only purpose is to allow the generation of 16-
+bit code are now completely removed in the Linux code, increasing
+readability and maintainability.
+
+----------------------------------------
+
+12 December 2002. Summary of changes for version 20021212.
+
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem where the creation of a zero-length AML Buffer
+would cause a fault.
+
+Fixed a problem where a Buffer object that pointed to a static
+AML
+buffer (in an ACPI table) could inadvertently be deleted, causing
+memory corruption.
+
+Fixed a problem where a user buffer (passed in to the external
+ACPI CA interfaces) could be overwritten if the buffer was too
+small to complete the operation, causing memory corruption.
+
+Fixed a problem in the Buffer-to-String conversion code where a
+string of length one was always returned, regardless of the size
+of the input Buffer object.
+
+Removed the NATIVE_CHAR data type across the entire source due to
+lack of need and lack of consistent use.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values
+will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 72.1K Code, 9.5K Data, 81.6K Total
+ Debug Version: 152.7K Code, 62.7K Data, 215.4K Total
+ Current Release:
+ Non-Debug Version: 72.0K Code, 9.5K Data, 81.5K Total
+ Debug Version: 153.0K Code, 62.9K Data, 215.9K Total
+
+
+----------------------------------------
+05 December 2002. Summary of changes for version 20021205.
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem where a store to a String or Buffer object could
+cause corruption of the DSDT if the object type being stored was
+the same as the target object type and the length of the object
+being stored was equal to or smaller than the original (existing)
+target object. This was seen to cause corruption of battery _BIF
+buffers if the _BIF method modified the buffer on the fly.
+
+Fixed a problem where an internal error was generated if a
+control
+method invocation was used in an OperationRegion, Buffer, or
+Package declaration. This was caused by the deferred parsing of
+the control method and thus the deferred creation of the internal
+method object. The solution to this problem was to create the
+internal method object at the moment the method is encountered in
+the first pass - so that subsequent references to the method will
+able to obtain the required parameter count and thus properly
+parse the method invocation. This problem presented itself as an
+AE_AML_INTERNAL during the pass 1 parse phase during table load.
+
+Fixed a problem where the internal String object copy routine did
+not always allocate sufficient memory for the target String
+object
+and caused memory corruption. This problem was seen to cause
+"Allocation already present in list!" errors as memory allocation
+became corrupted.
+
+Implemented a new function for the evaluation of namespace
+objects
+that allows the specification of the allowable return object
+types. This simplifies a lot of code that checks for a return
+object of one or more specific objects returned from the
+evaluation (such as _STA, etc.) This may become and external
+function if it would be useful to ACPI-related drivers.
+
+Completed another round of prefixing #defines with "ACPI_" for
+clarity.
+
+Completed additional code restructuring to allow more modular
+linking for iASL compiler and AcpiExec. Several files were split
+creating new files. New files: nsparse.c dsinit.c evgpe.c
+
+Implemented an abort mechanism to terminate an executing control
+method via the AML debugger. This feature is useful for
+debugging
+control methods that depend (wait) for specific hardware
+responses.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values
+will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 71.4K Code, 9.0K Data, 80.4K Total
+ Debug Version: 152.9K Code, 63.3K Data, 216.2K Total
+ Current Release:
+ Non-Debug Version: 72.1K Code, 9.5K Data, 81.6K Total
+ Debug Version: 152.7K Code, 62.7K Data, 215.4K Total
+
+
+2) iASL Compiler/Disassembler
+
+Fixed a compiler code generation problem for "Interrupt" Resource
+Descriptors. If specified in the ASL, the optional "Resource
+Source Index" and "Resource Source" fields were not inserted into
+the correct location within the AML resource descriptor, creating
+an invalid descriptor.
+
+Fixed a disassembler problem for "Interrupt" resource
+descriptors.
+The optional "Resource Source Index" and "Resource Source" fields
+were ignored.
+
+
+----------------------------------------
+22 November 2002. Summary of changes for version 20021122.
+
+
+1) ACPI CA Core Subsystem:
+
+Fixed a reported problem where an object stored to a Method Local
+or Arg was not copied to a new object during the store - the
+object pointer was simply copied to the Local/Arg. This caused
+all subsequent operations on the Local/Arg to also affect the
+original source of the store operation.
+
+Fixed a problem where a store operation to a Method Local or Arg
+was not completed properly if the Local/Arg contained a reference
+(from RefOf) to a named field. The general-purpose store-to-
+namespace-node code is now used so that this case is handled
+automatically.
+
+Fixed a problem where the internal object copy routine would
+cause
+a protection fault if the object being copied was a Package and
+contained either 1) a NULL package element or 2) a nested sub-
+package.
+
+Fixed a problem with the GPE initialization that resulted from an
+ambiguity in the ACPI specification. One section of the
+specification states that both the address and length of the GPE
+block must be zero if the block is not supported. Another
+section
+implies that only the address need be zero if the block is not
+supported. The code has been changed so that both the address
+and
+the length must be non-zero to indicate a valid GPE block (i.e.,
+if either the address or the length is zero, the GPE block is
+invalid.)
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values
+will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 71.3K Code, 9.0K Data, 80.3K Total
+ Debug Version: 152.7K Code, 63.2K Data, 215.5K Total
+ Current Release:
+ Non-Debug Version: 71.4K Code, 9.0K Data, 80.4K Total
+ Debug Version: 152.9K Code, 63.3K Data, 216.2K Total
+
+
+2) Linux
+
+Cleaned up EC driver. Exported an external EC read/write
+interface. By going through this, other drivers (most notably
+sonypi) will be able to serialize access to the EC.
+
+
+3) iASL Compiler/Disassembler
+
+Implemented support to optionally generate include files for both
+ASM and C (the -i switch). This simplifies BIOS development by
+automatically creating include files that contain external
+declarations for the symbols that are created within the
+
+(optionally generated) ASM and C AML source files.
+
+
+----------------------------------------
+15 November 2002. Summary of changes for version 20021115.
+
+1) ACPI CA Core Subsystem:
+
+Fixed a memory leak problem where an error during resolution of
+
+method arguments during a method invocation from another method
+failed to cleanup properly by deleting all successfully resolved
+argument objects.
+
+Fixed a problem where the target of the Index() operator was not
+correctly constructed if the source object was a package. This
+problem has not been detected because the use of a target operand
+with Index() is very rare.
+
+Fixed a problem with the Index() operator where an attempt was
+made to delete the operand objects twice.
+
+Fixed a problem where an attempt was made to delete an operand
+twice during execution of the CondRefOf() operator if the target
+did not exist.
+
+Implemented the first of perhaps several internal create object
+functions that create and initialize a specific object type.
+This
+consolidates duplicated code wherever the object is created, thus
+shrinking the size of the subsystem.
+
+Implemented improved debug/error messages for errors that occur
+during nested method invocations. All executing method pathnames
+are displayed (with the error) as the call stack is unwound -
+thus
+simplifying debug.
+
+Fixed a problem introduced in the 10/02 release that caused
+premature deletion of a buffer object if a buffer was used as an
+ASL operand where an integer operand is required (Thus causing an
+implicit object conversion from Buffer to Integer.) The change
+in
+the 10/02 release was attempting to fix a memory leak (albeit
+incorrectly.)
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values
+will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 71.9K Code, 9.1K Data, 81.0K Total
+ Debug Version: 153.1K Code, 63.3K Data, 216.4K Total
+ Current Release:
+ Non-Debug Version: 71.3K Code, 9.0K Data, 80.3K Total
+ Debug Version: 152.7K Code, 63.2K Data, 215.5K Total
+
+
+2) Linux
+
+Changed the implementation of the ACPI semaphores to use down()
+instead of down_interruptable(). It is important that the
+execution of ACPI control methods not be interrupted by signals.
+Methods must run to completion, or the system may be left in an
+unknown/unstable state.
+
+Fixed a compilation error when CONFIG_SOFTWARE_SUSPEND is not
+set.
+(Shawn Starr)
+
+
+3) iASL Compiler/Disassembler
+
+
+Changed the default location of output files. All output files
+are now placed in the current directory by default instead of in
+the directory of the source file. This change may affect some
+existing makefiles, but it brings the behavior of the compiler in
+line with other similar tools. The location of the output files
+can be overridden with the -p command line switch.
+
+
+----------------------------------------
+11 November 2002. Summary of changes for version 20021111.
+
+
+0) ACPI Specification 2.0B is released and is now available at:
+http://www.acpi.info/index.html
+
+
+1) ACPI CA Core Subsystem:
+
+Implemented support for the ACPI 2.0 SMBus Operation Regions.
+This includes the early detection and handoff of the request to
+the SMBus region handler (avoiding all of the complex field
+support code), and support for the bidirectional return packet
+from an SMBus write operation. This paves the way for the
+development of SMBus drivers in each host operating system.
+
+Fixed a problem where the semaphore WAIT_FOREVER constant was
+defined as 32 bits, but must be 16 bits according to the ACPI
+specification. This had the side effect of causing ASL
+Mutex/Event timeouts even though the ASL code requested a wait
+forever. Changed all internal references to the ACPI timeout
+parameter to 16 bits to prevent future problems. Changed the
+name
+of WAIT_FOREVER to ACPI_WAIT_FOREVER.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values
+will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 71.4K Code, 9.0K Data, 80.4K Total
+ Debug Version: 152.3K Code, 63.0K Data, 215.3K Total
+ Current Release:
+ Non-Debug Version: 71.9K Code, 9.1K Data, 81.0K Total
+ Debug Version: 153.1K Code, 63.3K Data, 216.4K Total
+
+
+2) Linux
+
+Module loading/unloading fixes (John Cagle)
+
+
+3) iASL Compiler/Disassembler
+
+Added support for the SMBBlockProcessCall keyword (ACPI 2.0)
+
+Implemented support for the disassembly of all SMBus protocol
+keywords (SMBQuick, SMBWord, etc.)
+
+----------------------------------------
+01 November 2002. Summary of changes for version 20021101.
+
+
+1) ACPI CA Core Subsystem:
+
+Fixed a problem where platforms that have a GPE1 block but no
+GPE0
+block were not handled correctly. This resulted in a "GPE
+overlap" error message. GPE0 is no longer required.
+
+Removed code added in the previous release that inserted nodes
+into the namespace in alphabetical order. This caused some side-
+effects on various machines. The root cause of the problem is
+still under investigation since in theory, the internal ordering
+of the namespace nodes should not matter.
+
+
+Enhanced error reporting for the case where a named object is not
+found during control method execution. The full ACPI namepath
+(name reference) of the object that was not found is displayed in
+this case.
+
+Note: as a result of the overhaul of the namespace object types
+in
+the previous release, the namespace nodes for the predefined
+scopes (_TZ, _PR, etc.) are now of the type ACPI_TYPE_LOCAL_SCOPE
+instead of ACPI_TYPE_ANY. This simplifies the namespace
+management code but may affect code that walks the namespace tree
+looking for specific object types.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a much larger code and data size. Note that these values
+will
+vary depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 70.7K Code, 8.6K Data, 79.3K Total
+ Debug Version: 151.7K Code, 62.4K Data, 214.1K Total
+ Current Release:
+ Non-Debug Version: 71.4K Code, 9.0K Data, 80.4K Total
+ Debug Version: 152.3K Code, 63.0K Data, 215.3K Total
+
+
+2) Linux
+
+Fixed a problem introduced in the previous release where the
+Processor and Thermal objects were not recognized and installed
+in
+/proc. This was related to the scope type change described
+above.
+
+
+3) iASL Compiler/Disassembler
+
+Implemented the -g option to get all of the required ACPI tables
+from the registry and save them to files (Windows version of the
+compiler only.) The required tables are the FADT, FACS, and
+DSDT.
+
+Added ACPI table checksum validation during table disassembly in
+order to catch corrupted tables.
+
+
+----------------------------------------
+22 October 2002. Summary of changes for version 20021022.
+
+1) ACPI CA Core Subsystem:
+
+Implemented a restriction on the Scope operator that the target
+must already exist in the namespace at the time the operator is
+encountered (during table load or method execution). In other
+words, forward references are not allowed and Scope() cannot
+create a new object. This changes the previous behavior where the
+interpreter would create the name if not found. This new
+behavior
+correctly enables the search-to-root algorithm during namespace
+lookup of the target name. Because of this upsearch, this fixes
+the known Compaq _SB_.OKEC problem and makes both the AML
+interpreter and iASL compiler compatible with other ACPI
+implementations.
+
+Completed a major overhaul of the internal ACPI object types for
+the ACPI Namespace and the associated operand objects. Many of
+these types had become obsolete with the introduction of the two-
+pass namespace load. This cleanup simplifies the code and makes
+the entire namespace load mechanism much clearer and easier to
+understand.
+
+Improved debug output for tracking scope opening/closing to help
+diagnose scoping issues. The old scope name as well as the new
+scope name are displayed. Also improved error messages for
+problems with ASL Mutex objects and error messages for GPE
+problems.
+
+Cleaned up the namespace dump code, removed obsolete code.
+
+All string output (for all namespace/object dumps) now uses the
+common ACPI string output procedure which handles escapes
+properly
+and does not emit non-printable characters.
+
+Fixed some issues with constants in the 64-bit version of the
+local C library (utclib.c)
+
+
+2) Linux
+
+EC Driver: No longer attempts to acquire the Global Lock at
+interrupt level.
+
+
+3) iASL Compiler/Disassembler
+
+Implemented ACPI 2.0B grammar change that disallows all Type 1
+and
+2 opcodes outside of a control method. This means that the
+"executable" operators (versus the "namespace" operators) cannot
+be used at the table level; they can only be used within a
+control
+method.
+
+Implemented the restriction on the Scope() operator where the
+target must already exist in the namespace at the time the
+operator is encountered (during ASL compilation). In other words,
+forward references are not allowed and Scope() cannot create a
+new
+object. This makes the iASL compiler compatible with other ACPI
+implementations and makes the Scope() implementation adhere to
+the
+ACPI specification.
+
+Fixed a problem where namepath optimization for the Alias
+operator
+was optimizing the wrong path (of the two namepaths.) This
+caused
+a "Missing alias link" error message.
+
+Fixed a problem where an "unknown reserved name" warning could be
+incorrectly generated for names like "_SB" when the trailing
+underscore is not used in the original ASL.
+
+Fixed a problem where the reserved name check did not handle
+NamePaths with multiple NameSegs correctly. The first nameseg of
+the NamePath was examined instead of the last NameSeg.
+
+
+----------------------------------------
+
+02 October 2002. Summary of changes for this release.
+
+
+1) ACPI CA Core Subsystem version 20021002:
+
+Fixed a problem where a store/copy of a string to an existing
+string did not always set the string length properly in the
+String
+object.
+
+Fixed a reported problem with the ToString operator where the
+behavior was identical to the ToHexString operator instead of
+just
+simply converting a raw buffer to a string data type.
+
+Fixed a problem where CopyObject and the other "explicit"
+conversion operators were not updating the internal namespace
+node
+type as part of the store operation.
+
+Fixed a memory leak during implicit source operand conversion
+where the original object was not deleted if it was converted to
+a
+new object of a different type.
+
+Enhanced error messages for all problems associated with
+namespace
+lookups. Common procedure generates and prints the lookup name
+as
+well as the formatted status.
+
+Completed implementation of a new design for the Alias support
+within the namespace. The existing design did not handle the
+case
+where a new object was assigned to one of the two names due to
+the
+use of an explicit conversion operator, resulting in the two
+names
+pointing to two different objects. The new design simply points
+the Alias name to the original name node - not to the object.
+This results in a level of indirection that must be handled in
+the
+name resolution mechanism.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 69.6K Code, 8.3K Data, 77.9K Total
+ Debug Version: 150.0K Code, 61.7K Data, 211.7K Total
+ Current Release:
+ Non-Debug Version: 70.7K Code, 8.6K Data, 79.3K Total
+ Debug Version: 151.7K Code, 62.4K Data, 214.1K Total
+
+
+2) Linux
+
+Initialize thermal driver's timer before it is used. (Knut
+Neumann)
+
+Allow handling negative celsius values. (Kochi Takayoshi)
+
+Fix thermal management and make trip points. R/W (Pavel Machek)
+
+Fix /proc/acpi/sleep. (P. Christeas)
+
+IA64 fixes. (David Mosberger)
+
+Fix reversed logic in blacklist code. (Sergio Monteiro Basto)
+
+Replace ACPI_DEBUG define with ACPI_DEBUG_OUTPUT. (Dominik
+Brodowski)
+
+
+3) iASL Compiler/Disassembler
+
+Clarified some warning/error messages.
+
+
+----------------------------------------
+18 September 2002. Summary of changes for this release.
+
+
+1) ACPI CA Core Subsystem version 20020918:
+
+Fixed a reported problem with reference chaining (via the Index()
+and RefOf() operators) in the ObjectType() and SizeOf()
+operators.
+The definition of these operators includes the dereferencing of
+all chained references to return information on the base object.
+
+Fixed a problem with stores to indexed package elements - the
+existing code would not complete the store if an "implicit
+conversion" was not performed. In other words, if the existing
+object (package element) was to be replaced completely, the code
+didn't handle this case.
+
+Relaxed typechecking on the ASL "Scope" operator to allow the
+target name to refer to an object of type Integer, String, or
+Buffer, in addition to the scoping object types (Device,
+predefined Scopes, Processor, PowerResource, and ThermalZone.)
+This allows existing AML code that has workarounds for a bug in
+Windows to function properly. A warning is issued, however.
+This
+affects both the AML interpreter and the iASL compiler. Below is
+an example of this type of ASL code:
+
+ Name(DEB,0x00)
+ Scope(DEB)
+ {
+
+Fixed some reported problems with 64-bit integer support in the
+local implementation of C library functions (clib.c)
+
+
+2) Linux
+
+Use ACPI fix map region instead of IOAPIC region, since it is
+undefined in non-SMP.
+
+Ensure that the SCI has the proper polarity and trigger, even on
+systems that do not have an interrupt override entry in the MADT.
+
+2.5 big driver reorganization (Pat Mochel)
+
+Use early table mapping code from acpitable.c (Andi Kleen)
+
+New blacklist entries (Andi Kleen)
+
+Blacklist improvements. Split blacklist code out into a separate
+file. Move checking the blacklist to very early. Previously, we
+would use ACPI tables, and then halfway through init, check the
+blacklist -- too late. Now, it's early enough to completely fall-
+back to non-ACPI.
+
+
+3) iASL Compiler/Disassembler version 20020918:
+
+Fixed a problem where the typechecking code didn't know that an
+alias could point to a method. In other words, aliases were not
+being dereferenced during typechecking.
+
+
+----------------------------------------
+29 August 2002. Summary of changes for this release.
+
+1) ACPI CA Core Subsystem Version 20020829:
+
+If the target of a Scope() operator already exists, it must be an
+object type that actually opens a scope -- such as a Device,
+Method, Scope, etc. This is a fatal runtime error. Similar
+error
+check has been added to the iASL compiler also.
+
+Tightened up the namespace load to disallow multiple names in the
+same scope. This previously was allowed if both objects were of
+the same type. (i.e., a lookup was the same as entering a new
+name).
+
+
+2) Linux
+
+Ensure that the ACPI interrupt has the proper trigger and
+polarity.
+
+local_irq_disable is extraneous. (Matthew Wilcox)
+
+Make "acpi=off" actually do what it says, and not use the ACPI
+interpreter *or* the tables.
+
+Added arch-neutral support for parsing SLIT and SRAT tables
+(Kochi
+Takayoshi)
+
+
+3) iASL Compiler/Disassembler Version 20020829:
+
+Implemented namepath optimization for name declarations. For
+example, a declaration like "Method (\_SB_.ABCD)" would get
+optimized to "Method (ABCD)" if the declaration is within the
+\_SB_ scope. This optimization is in addition to the named
+reference path optimization first released in the previous
+version. This would seem to complete all possible optimizations
+for namepaths within the ASL/AML.
+
+If the target of a Scope() operator already exists, it must be an
+object type that actually opens a scope -- such as a Device,
+Method, Scope, etc.
+
+Implemented a check and warning for unreachable code in the same
+block below a Return() statement.
+
+Fixed a problem where the listing file was not generated if the
+compiler aborted if the maximum error count was exceeded (200).
+
+Fixed a problem where the typechecking of method return values
+was
+broken. This includes the check for a return value when the
+method is invoked as a TermArg (a return value is expected.)
+
+Fixed a reported problem where EOF conditions during a quoted
+string or comment caused a fault.
+
+
+----------------------------------------
+15 August 2002. Summary of changes for this release.
+
+1) ACPI CA Core Subsystem Version 20020815:
+
+Fixed a reported problem where a Store to a method argument that
+contains a reference did not perform the indirect store
+correctly.
+This problem was created during the conversion to the new
+reference object model - the indirect store to a method argument
+code was not updated to reflect the new model.
+
+Reworked the ACPI mode change code to better conform to ACPI 2.0,
+handle corner cases, and improve code legibility (Kochi
+Takayoshi)
+
+Fixed a problem with the pathname parsing for the carat (^)
+prefix. The heavy use of the carat operator by the new namepath
+optimization in the iASL compiler uncovered a problem with the
+AML
+interpreter handling of this prefix. In the case where one or
+more carats precede a single nameseg, the nameseg was treated as
+standalone and the search rule (to root) was inadvertently
+applied. This could cause both the iASL compiler and the
+interpreter to find the wrong object or to miss the error that
+should occur if the object does not exist at that exact pathname.
+
+Found and fixed the problem where the HP Pavilion DSDT would not
+load. This was a relatively minor tweak to the table loading
+code
+(a problem caused by the unexpected encounter with a method
+invocation not within a control method), but it does not solve
+the
+overall issue of the execution of AML code at the table level.
+This investigation is still ongoing.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 69.1K Code, 8.2K Data, 77.3K Total
+ Debug Version: 149.4K Code, 61.6K Data, 211.0K Total
+ Current Release:
+ Non-Debug Version: 69.6K Code, 8.3K Data, 77.9K Total
+ Debug Version: 150.0K Code, 61.7K Data, 211.7K Total
+
+
+2) Linux
+
+Remove redundant slab.h include (Brad Hards)
+
+Fix several bugs in thermal.c (Herbert Nachtnebel)
+
+Make CONFIG_ACPI_BOOT work properly (Pavel Machek)
+
+Change acpi_system_suspend to use updated irq functions (Pavel
+Machek)
+
+Export acpi_get_firmware_table (Matthew Wilcox)
+
+Use proper root proc entry for ACPI (Kochi Takayoshi)
+
+Fix early-boot table parsing (Bjorn Helgaas)
+
+
+3) iASL Compiler/Disassembler
+
+Reworked the compiler options to make them more consistent and to
+use two-letter options where appropriate. We were running out of
+sensible letters. This may break some makefiles, so check the
+current options list by invoking the compiler with no parameters.
+
+Completed the design and implementation of the ASL namepath
+optimization option for the compiler. This option optimizes all
+references to named objects to the shortest possible path. The
+first attempt tries to utilize a single nameseg (4 characters)
+and
+the "search-to-root" algorithm used by the interpreter. If that
+cannot be used (because either the name is not in the search path
+or there is a conflict with another object with the same name),
+the pathname is optimized using the carat prefix (usually a
+shorter string than specifying the entire path from the root.)
+
+Implemented support to obtain the DSDT from the Windows registry
+(when the disassembly option is specified with no input file).
+Added this code as the implementation for AcpiOsTableOverride in
+the Windows OSL. Migrated the 16-bit code (used in the AcpiDump
+utility) to scan memory for the DSDT to the AcpiOsTableOverride
+function in the DOS OSL to make the disassembler truly OS
+independent.
+
+Implemented a new option to disassemble and compile in one step.
+When used without an input filename, this option will grab the
+DSDT from the local machine, disassemble it, and compile it in
+one
+step.
+
+Added a warning message for invalid escapes (a backslash followed
+by any character other than the allowable escapes). This catches
+the quoted string error "\_SB_" (which should be "\\_SB_" ).
+
+Also, there are numerous instances in the ACPI specification
+where
+this error occurs.
+
+Added a compiler option to disable all optimizations. This is
+basically the "compatibility mode" because by using this option,
+the AML code will come out exactly the same as other ASL
+compilers.
+
+Added error messages for incorrectly ordered dependent resource
+functions. This includes: missing EndDependentFn macro at end of
+dependent resource list, nested dependent function macros (both
+start and end), and missing StartDependentFn macro. These are
+common errors that should be caught at compile time.
+
+Implemented _OSI support for the disassembler and compiler. _OSI
+must be included in the namespace for proper disassembly (because
+the disassembler must know the number of arguments.)
+
+Added an "optimization" message type that is optional (off by
+default). This message is used for all optimizations - including
+constant folding, integer optimization, and namepath
+optimization.
+
+----------------------------------------
+25 July 2002. Summary of changes for this release.
+
+
+1) ACPI CA Core Subsystem Version 20020725:
+
+The AML Disassembler has been enhanced to produce compilable ASL
+code and has been integrated into the iASL compiler (see below)
+as
+well as the single-step disassembly for the AML debugger and the
+disassembler for the AcpiDump utility. All ACPI 2.0A opcodes,
+resource templates and macros are fully supported. The
+disassembler has been tested on over 30 different AML files,
+producing identical AML when the resulting disassembled ASL file
+is recompiled with the same ASL compiler.
+
+Modified the Resource Manager to allow zero interrupts and zero
+dma channels during the GetCurrentResources call. This was
+causing problems on some platforms.
+
+Added the AcpiOsRedirectOutput interface to the OSL to simplify
+output redirection for the AcpiOsPrintf and AcpiOsVprintf
+interfaces.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 68.7K Code, 7.4K Data, 76.1K Total
+ Debug Version: 142.9K Code, 58.7K Data, 201.6K Total
+ Current Release:
+ Non-Debug Version: 69.1K Code, 8.2K Data, 77.3K Total
+ Debug Version: 149.4K Code, 61.6K Data, 211.0K Total
+
+
+2) Linux
+
+Fixed a panic in the EC driver (Dominik Brodowski)
+
+Implemented checksum of the R/XSDT itself during Linux table scan
+(Richard Schaal)
+
+
+3) iASL compiler
+
+The AML disassembler is integrated into the compiler. The "-d"
+option invokes the disassembler to completely disassemble an
+input AML file, producing as output a text ASL file with the
+extension ".dsl" (to avoid name collisions with existing .asl
+source files.) A future enhancement will allow the disassembler
+to obtain the BIOS DSDT from the registry under Windows.
+
+Fixed a problem with the VendorShort and VendorLong resource
+descriptors where an invalid AML sequence was created.
+
+Implemented a fix for BufferData term in the ASL parser. It was
+inadvertently defined twice, allowing invalid syntax to pass and
+causing reduction conflicts.
+
+Fixed a problem where the Ones opcode could get converted to a
+value of zero if "Ones" was used where a byte, word or dword
+value
+was expected. The 64-bit value is now truncated to the correct
+size with the correct value.
+
+
+
+----------------------------------------
+02 July 2002. Summary of changes for this release.
+
+
+1) ACPI CA Core Subsystem Version 20020702:
+
+The Table Manager code has been restructured to add several new
+features. Tables that are not required by the core subsystem
+(other than the FADT, DSDT, FACS, PSDTs, etc.) are no longer
+validated in any way and are returned from AcpiGetFirmwareTable
+if
+requested. The AcpiOsTableOverride interface is now called for
+each table that is loaded by the subsystem in order to allow the
+host to override any table it chooses. Previously, only the DSDT
+could be overridden. Added one new files, tbrsdt.c and
+tbgetall.c.
+
+Fixed a problem with the conversion of internal package objects
+to
+external objects (when a package is returned from a control
+method.) The return buffer length was set to zero instead of the
+proper length of the package object.
+
+Fixed a reported problem with the use of the RefOf and DeRefOf
+operators when passing reference arguments to control methods. A
+new type of Reference object is used internally for references
+produced by the RefOf operator.
+
+Added additional error messages in the Resource Manager to
+explain
+AE_BAD_DATA errors when they occur during resource parsing.
+
+Split the AcpiEnableSubsystem into two primitives to enable a
+finer granularity initialization sequence. These two calls
+should
+be called in this order: AcpiEnableSubsystem (flags),
+AcpiInitializeObjects (flags). The flags parameter remains the
+same.
+
+
+2) Linux
+
+Updated the ACPI utilities module to understand the new style of
+fully resolved package objects that are now returned from the
+core
+subsystem. This eliminates errors of the form:
+
+ ACPI: PCI Interrupt Routing Table [\_SB_.PCI0.PPB_._PRT]
+ acpi_utils-0430 [145] acpi_evaluate_reference:
+ Invalid element in package (not a device reference)
+
+The method evaluation utility uses the new buffer allocation
+scheme instead of calling AcpiEvaluate Object twice.
+
+Added support for ECDT. This allows the use of the Embedded
+
+Controller before the namespace has been fully initialized, which
+is necessary for ACPI 2.0 support, and for some laptops to
+initialize properly. (Laptops using ECDT are still rare, so only
+limited testing was performed of the added functionality.)
+
+Fixed memory leaks in the EC driver.
+
+Eliminated a brittle code structure in acpi_bus_init().
+
+Eliminated the acpi_evaluate() helper function in utils.c. It is
+no longer needed since acpi_evaluate_object can optionally
+allocate memory for the return object.
+
+Implemented fix for keyboard hang when getting battery readings
+on
+some systems (Stephen White)
+
+PCI IRQ routing update (Dominik Brodowski)
+
+Fix an ifdef to allow compilation on UP with LAPIC but no IOAPIC
+support
+
+----------------------------------------
+11 June 2002. Summary of changes for this release.
+
+
+1) ACPI CA Core Subsystem Version 20020611:
+
+Fixed a reported problem where constants such as Zero and One
+appearing within _PRT packages were not handled correctly within
+the resource manager code. Originally reported against the ASL
+compiler because the code generator now optimizes integers to
+their minimal AML representation (i.e. AML constants if
+possible.)
+The _PRT code now handles all AML constant opcodes correctly
+(Zero, One, Ones, Revision).
+
+Fixed a problem with the Concatenate operator in the AML
+interpreter where a buffer result object was incorrectly marked
+as
+not fully evaluated, causing a run-time error of AE_AML_INTERNAL.
+
+All package sub-objects are now fully resolved before they are
+returned from the external ACPI interfaces. This means that name
+strings are resolved to object handles, and constant operators
+(Zero, One, Ones, Revision) are resolved to Integers.
+
+Implemented immediate resolution of the AML Constant opcodes
+(Zero, One, Ones, Revision) to Integer objects upon detection
+within the AML stream. This has simplified and reduced the
+generated code size of the subsystem by eliminating about 10
+switch statements for these constants (which previously were
+contained in Reference objects.) The complicating issues are
+that
+the Zero opcode is used as a "placeholder" for unspecified
+optional target operands and stores to constants are defined to
+be
+no-ops.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 69.3K Code, 7.4K Data, 76.7K Total
+ Debug Version: 143.8K Code, 58.8K Data, 202.6K Total
+ Current Release:
+ Non-Debug Version: 68.7K Code, 7.4K Data, 76.1K Total
+ Debug Version: 142.9K Code, 58.7K Data, 201.6K Total
+
+
+2) Linux
+
+
+Added preliminary support for obtaining _TRA data for PCI root
+bridges (Bjorn Helgaas).
+
+
+3) iASL Compiler Version X2046:
+
+Fixed a problem where the "_DDN" reserved name was defined to be
+a
+control method with one argument. There are no arguments, and
+_DDN does not have to be a control method.
+
+Fixed a problem with the Linux version of the compiler where the
+source lines printed with error messages were the wrong lines.
+This turned out to be the "LF versus CR/LF" difference between
+Windows and Unix. This appears to be the longstanding issue
+concerning listing output and error messages.
+
+Fixed a problem with the Linux version of compiler where opcode
+names within error messages were wrong. This was caused by a
+slight difference in the output of the Flex tool on Linux versus
+Windows.
+
+Fixed a problem with the Linux compiler where the hex output
+files
+contained some garbage data caused by an internal buffer overrun.
+
+
+----------------------------------------
+17 May 2002. Summary of changes for this release.
+
+
+1) ACPI CA Core Subsystem Version 20020517:
+
+Implemented a workaround to an BIOS bug discovered on the HP
+OmniBook where the FADT revision number and the table size are
+inconsistent (ACPI 2.0 revision vs. ACPI 1.0 table size). The
+new
+behavior is to fallback to using only the ACPI 1.0 fields of the
+FADT if the table is too small to be a ACPI 2.0 table as claimed
+by the revision number. Although this is a BIOS bug, this is a
+case where the workaround is simple enough and with no side
+effects, so it seemed prudent to add it. A warning message is
+issued, however.
+
+Implemented minimum size checks for the fixed-length ACPI tables
+-
+- the FADT and FACS, as well as consistency checks between the
+revision number and the table size.
+
+Fixed a reported problem in the table override support where the
+new table pointer was incorrectly treated as a physical address
+instead of a logical address.
+
+Eliminated the use of the AE_AML_ERROR exception and replaced it
+with more descriptive codes.
+
+Fixed a problem where an exception would occur if an ASL Field
+was
+defined with no named Field Units underneath it (used by some
+index fields).
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 68.8K Code, 7.1K Data, 75.9K Total
+ Debug Version: 142.9K Code, 58.4K Data, 201.3K Total
+ Current Release:
+ Non-Debug Version: 69.3K Code, 7.4K Data, 76.7K Total
+ Debug Version: 143.8K Code, 58.8K Data, 202.6K Total
+
+
+
+2) Linux
+
+Much work done on ACPI init (MADT and PCI IRQ routing support).
+(Paul D. and Dominik Brodowski)
+
+Fix PCI IRQ-related panic on boot (Sam Revitch)
+
+Set BM_ARB_DIS when entering a sleep state (Ducrot Bruno)
+
+Fix "MHz" typo (Dominik Brodowski)
+
+Fix RTC year 2000 issue (Dominik Brodowski)
+
+Preclude multiple button proc entries (Eric Brunet)
+
+Moved arch-specific code out of include/platform/aclinux.h
+
+3) iASL Compiler Version X2044:
+
+Implemented error checking for the string used in the EISAID
+macro
+(Usually used in the definition of the _HID object.) The code
+now
+strictly enforces the PnP format - exactly 7 characters, 3
+uppercase letters and 4 hex digits.
+
+If a raw string is used in the definition of the _HID object
+(instead of the EISAID macro), the string must contain all
+alphanumeric characters (e.g., "*PNP0011" is not allowed because
+of the asterisk.)
+
+Implemented checking for invalid use of ACPI reserved names for
+most of the name creation operators (Name, Device, Event, Mutex,
+OperationRegion, PowerResource, Processor, and ThermalZone.)
+Previously, this check was only performed for control methods.
+
+Implemented an additional check on the Name operator to emit an
+error if a reserved name that must be implemented in ASL as a
+control method is used. We know that a reserved name must be a
+method if it is defined with input arguments.
+
+The warning emitted when a namespace object reference is not
+found
+during the cross reference phase has been changed into an error.
+The "External" directive should be used for names defined in
+other
+modules.
+
+
+4) Tools and Utilities
+
+The 16-bit tools (adump16 and aexec16) have been regenerated and
+tested.
+
+Fixed a problem with the output of both acpidump and adump16
+where
+the indentation of closing parentheses and brackets was not
+
+aligned properly with the parent block.
+
+
+----------------------------------------
+03 May 2002. Summary of changes for this release.
+
+
+1) ACPI CA Core Subsystem Version 20020503:
+
+Added support a new OSL interface that allows the host operating
+
+system software to override the DSDT found in the firmware -
+AcpiOsTableOverride. With this interface, the OSL can examine
+the
+version of the firmware DSDT and replace it with a different one
+if desired.
+
+Added new external interfaces for accessing ACPI registers from
+device drivers and other system software - AcpiGetRegister and
+AcpiSetRegister. This was simply an externalization of the
+existing AcpiHwBitRegister interfaces.
+
+Fixed a regression introduced in the previous build where the
+ASL/AML CreateField operator always returned an error,
+"destination must be a NS Node".
+
+Extended the maximum time (before failure) to successfully enable
+ACPI mode to 3 seconds.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 68.5K Code, 7.0K Data, 75.5K Total
+ Debug Version: 142.4K Code, 58.3K Data, 200.7K Total
+ Current Release:
+ Non-Debug Version: 68.8K Code, 7.1K Data, 75.9K Total
+ Debug Version: 142.9K Code, 58.4K Data, 201.3K Total
+
+
+2) Linux
+
+Enhanced ACPI init code for SMP. We are now fully MPS and $PIR-
+free. While 3 out of 4 of our in-house systems work fine, the
+last
+one still hangs when testing the LAPIC timer.
+
+Renamed many files in 2.5 kernel release to omit "acpi_" from the
+name.
+
+Added warning on boot for Presario 711FR.
+
+Sleep improvements (Pavel Machek)
+
+ACPI can now be built without CONFIG_PCI enabled.
+
+IA64: Fixed memory map functions (JI Lee)
+
+
+3) iASL Compiler Version X2043:
+
+Added support to allow the compiler to be integrated into the MS
+VC++ development environment for one-button compilation of single
+files or entire projects -- with error-to-source-line mapping.
+
+Implemented support for compile-time constant folding for the
+Type3, Type4, and Type5 opcodes first defined in the ACPI 2.0
+specification. This allows the ASL writer to use expressions
+instead of Integer/Buffer/String constants in terms that must
+evaluate to constants at compile time and will also simplify the
+emitted AML in any such sub-expressions that can be folded
+(evaluated at compile-time.) This increases the size of the
+compiler significantly because a portion of the ACPI CA AML
+interpreter is included within the compiler in order to pre-
+evaluate constant expressions.
+
+
+Fixed a problem with the "Unicode" ASL macro that caused the
+compiler to fault. (This macro is used in conjunction with the
+_STR reserved name.)
+
+Implemented an AML opcode optimization to use the Zero, One, and
+Ones opcodes where possible to further reduce the size of integer
+constants and thus reduce the overall size of the generated AML
+code.
+
+Implemented error checking for new reserved terms for ACPI
+version
+2.0A.
+
+Implemented the -qr option to display the current list of ACPI
+reserved names known to the compiler.
+
+Implemented the -qc option to display the current list of ASL
+operators that are allowed within constant expressions and can
+therefore be folded at compile time if the operands are
+constants.
+
+
+4) Documentation
+
+Updated the Programmer's Reference for new interfaces, data
+types,
+and memory allocation model options.
+
+Updated the iASL Compiler User Reference to apply new format and
+add information about new features and options.
+
+----------------------------------------
+19 April 2002. Summary of changes for this release.
+
+1) ACPI CA Core Subsystem Version 20020419:
+
+The source code base for the Core Subsystem has been completely
+cleaned with PC-lint (FlexLint) for both 32-bit and 64-bit
+versions. The Lint option files used are included in the
+/acpi/generate/lint directory.
+
+Implemented enhanced status/error checking across the entire
+Hardware manager subsystem. Any hardware errors (reported from
+the OSL) are now bubbled up and will abort a running control
+method.
+
+
+Fixed a problem where the per-ACPI-table integer width (32 or 64)
+was stored only with control method nodes, causing a fault when
+non-control method code was executed during table loading. The
+solution implemented uses a global variable to indicate table
+width across the entire ACPI subsystem. Therefore, ACPI CA does
+not support mixed integer widths across different ACPI tables
+(DSDT, SSDT).
+
+Fixed a problem where NULL extended fields (X fields) in an ACPI
+2.0 ACPI FADT caused the table load to fail. Although the
+existing ACPI specification is a bit fuzzy on this topic, the new
+behavior is to fall back on a ACPI 1.0 field if the corresponding
+ACPI 2.0 X field is zero (even though the table revision
+indicates
+a full ACPI 2.0 table.) The ACPI specification will be updated
+to
+clarify this issue.
+
+Fixed a problem with the SystemMemory operation region handler
+where memory was always accessed byte-wise even if the AML-
+specified access width was larger than a byte. This caused
+problems on systems with memory-mapped I/O. Memory is now
+accessed with the width specified. On systems that do not
+support
+non-aligned transfers, a check is made to guarantee proper
+address
+alignment before proceeding in order to avoid an AML-caused
+alignment fault within the kernel.
+
+
+Fixed a problem with the ExtendedIrq resource where only one byte
+of the 4-byte Irq field was extracted.
+
+Fixed the AcpiExDigitsNeeded() procedure to support _UID. This
+function was out of date and required a rewrite.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 66.6K Code, 6.5K Data, 73.1K Total
+ Debug Version: 139.8K Code, 57.4K Data, 197.2K Total
+ Current Release:
+ Non-Debug Version: 68.5K Code, 7.0K Data, 75.5K Total
+ Debug Version: 142.4K Code, 58.3K Data, 200.7K Total
+
+
+2) Linux
+
+PCI IRQ routing fixes (Dominik Brodowski)
+
+
+3) iASL Compiler Version X2042:
+
+Implemented an additional compile-time error check for a field
+unit whose size + minimum access width would cause a run-time
+access beyond the end-of-region. Previously, only the field size
+itself was checked.
+
+The Core subsystem and iASL compiler now share a common parse
+object in preparation for compile-time evaluation of the type
+3/4/5 ASL operators.
+
+
+----------------------------------------
+Summary of changes for this release: 03_29_02
+
+1) ACPI CA Core Subsystem Version 20020329:
+
+Implemented support for late evaluation of TermArg operands to
+Buffer and Package objects. This allows complex expressions to
+be
+used in the declarations of these object types.
+
+Fixed an ACPI 1.0 compatibility issue when reading Fields. In
+ACPI
+1.0, if the field was larger than 32 bits, it was returned as a
+buffer - otherwise it was returned as an integer. In ACPI 2.0,
+the field is returned as a buffer only if the field is larger
+than
+64 bits. The TableRevision is now considered when making this
+conversion to avoid incompatibility with existing ASL code.
+
+Implemented logical addressing for AcpiOsGetRootPointer. This
+allows an RSDP with either a logical or physical address. With
+this support, the host OS can now override all ACPI tables with
+one logical RSDP. Includes implementation of "typed" pointer
+support to allow a common data type for both physical and logical
+pointers internally. This required a change to the
+AcpiOsGetRootPointer interface.
+
+Implemented the use of ACPI 2.0 Generic Address Structures for
+all
+GPE, Fixed Event, and PM Timer I/O. This allows the use of
+memory
+mapped I/O for these ACPI features.
+
+Initialization now ignores not only non-required tables (All
+tables other than the FADT, FACS, DSDT, and SSDTs), but also does
+not validate the table headers of unrecognized tables.
+
+Fixed a problem where a notify handler could only be
+installed/removed on an object of type Device. All "notify"
+
+objects are now supported -- Devices, Processor, Power, and
+Thermal.
+
+Removed most verbosity from the ACPI_DB_INFO debug level. Only
+critical information is returned when this debug level is
+enabled.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release
+ Non-Debug Version: 65.4K Code, 6.2K Data, 71.6K Total
+ Debug Version: 138.0K Code, 56.6K Data, 194.6K Total
+ Current Release:
+ Non-Debug Version: 66.6K Code, 6.5K Data, 73.1K Total
+ Debug Version: 139.8K Code, 57.4K Data, 197.2K Total
+
+
+2) Linux:
+
+The processor driver (acpi_processor.c) now fully supports ACPI
+2.0-based processor performance control (e.g. Intel(R)
+SpeedStep(TM) technology) Note that older laptops that only have
+the Intel "applet" interface are not supported through this. The
+'limit' and 'performance' interface (/proc) are fully functional.
+[Note that basic policy for controlling performance state
+transitions will be included in the next version of ospmd.] The
+idle handler was modified to more aggressively use C2, and PIIX4
+errata handling underwent a complete overhaul (big thanks to
+Dominik Brodowski).
+
+Added support for ACPI-PCI device binding (acpi_pci_root.c). _ADR-
+based devices in the ACPI namespace are now dynamically bound
+(associated) with their PCI counterparts (e.g. PCI1->01:00.0).
+This allows, among other things, ACPI to resolve bus numbers for
+subordinate PCI bridges.
+
+Enhanced PCI IRQ routing to get the proper bus number for _PRT
+entries defined underneath PCI bridges.
+
+Added IBM 600E to bad bios list due to invalid _ADR value for
+PIIX4 PCI-ISA bridge, resulting in improper PCI IRQ routing.
+
+In the process of adding full MADT support (e.g. IOAPIC) for IA32
+(acpi.c, mpparse.c) -- stay tuned.
+
+Added back visual differentiation between fixed-feature and
+control-method buttons in dmesg. Buttons are also subtyped (e.g.
+button/power/PWRF) to simplify button identification.
+
+We no longer use -Wno-unused when compiling debug. Please ignore
+any "_THIS_MODULE defined but not used" messages.
+
+Can now shut down the system using "magic sysrq" key.
+
+
+3) iASL Compiler version 2041:
+
+Fixed a problem where conversion errors for hex/octal/decimal
+constants were not reported.
+
+Implemented a fix for the General Register template Address
+field.
+This field was 8 bits when it should be 64.
+
+Fixed a problem where errors/warnings were no longer being
+emitted
+within the listing output file.
+
+Implemented the ACPI 2.0A restriction on ACPI Table Signatures to
+exactly 4 characters, alphanumeric only.
+
+
+
+
+----------------------------------------
+Summary of changes for this release: 03_08_02
+
+
+1) ACPI CA Core Subsystem Version 20020308:
+
+Fixed a problem with AML Fields where the use of the "AccessAny"
+keyword could cause an interpreter error due to attempting to
+read
+or write beyond the end of the parent Operation Region.
+
+Fixed a problem in the SystemMemory Operation Region handler
+where
+an attempt was made to map memory beyond the end of the region.
+This was the root cause of the "AE_ERROR" and "AE_NO_MEMORY"
+errors on some Linux systems.
+
+Fixed a problem where the interpreter/namespace "search to root"
+algorithm was not functioning for some object types. Relaxed the
+internal restriction on the search to allow upsearches for all
+external object types as well as most internal types.
+
+
+2) Linux:
+
+We now use safe_halt() macro versus individual calls to sti |
+hlt.
+
+Writing to the processor limit interface should now work. "echo
+1"
+will increase the limit, 2 will decrease, and 0 will reset to the
+
+default.
+
+
+3) ASL compiler:
+
+Fixed segfault on Linux version.
+
+
+----------------------------------------
+Summary of changes for this release: 02_25_02
+
+1) ACPI CA Core Subsystem:
+
+
+Fixed a problem where the GPE bit masks were not initialized
+properly, causing erratic GPE behavior.
+
+Implemented limited support for multiple calling conventions.
+The
+code can be generated with either the VPL (variable parameter
+list, or "C") convention, or the FPL (fixed parameter list, or
+"Pascal") convention. The core subsystem is about 3.4% smaller
+when generated with FPL.
+
+
+2) Linux
+
+Re-add some /proc/acpi/event functionality that was lost during
+the rewrite
+
+Resolved issue with /proc events for fixed-feature buttons
+showing
+up as the system device.
+
+Fixed checks on C2/C3 latencies to be inclusive of maximum
+values.
+
+Replaced AE_ERRORs in acpi_osl.c with more specific error codes.
+
+Changed ACPI PRT option from "pci=noacpi-routing" to "pci=noacpi"
+
+Fixed limit interface & usage to fix bugs with passive cooling
+hysterisis.
+
+Restructured PRT support.
+
+
+----------------------------------------
+Summary of changes for this label: 02_14_02
+
+
+1) ACPI CA Core Subsystem:
+
+Implemented support in AcpiLoadTable to allow loading of FACS and
+FADT tables.
+
+Suport for the now-obsolete interim 0.71 64-bit ACPI tables has
+been removed. All 64-bit platforms should be migrated to the
+ACPI
+2.0 tables. The actbl71.h header has been removed from the
+source
+tree.
+
+All C macros defined within the subsystem have been prefixed with
+"ACPI_" to avoid collision with other system include files.
+
+Removed the return value for the two AcpiOsPrint interfaces,
+since
+it is never used and causes lint warnings for ignoring the return
+value.
+
+Added error checking to all internal mutex acquire and release
+calls. Although a failure from one of these interfaces is
+probably a fatal system error, these checks will cause the
+immediate abort of the currently executing method or interface.
+
+Fixed a problem where the AcpiSetCurrentResources interface could
+fault. This was a side effect of the deployment of the new
+memory
+allocation model.
+
+Fixed a couple of problems with the Global Lock support
+introduced
+in the last major build. The "common" (1.0/2.0) internal FACS
+was
+being overwritten with the FACS signature and clobbering the
+Global Lock pointer. Also, the actual firmware FACS was being
+unmapped after construction of the "common" FACS, preventing
+access to the actual Global Lock field within it. The "common"
+internal FACS is no longer installed as an actual ACPI table; it
+is used simply as a global.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release (02_07_01)
+ Non-Debug Version: 65.2K Code, 6.2K Data, 71.4K Total
+ Debug Version: 136.9K Code, 56.4K Data, 193.3K Total
+ Current Release:
+ Non-Debug Version: 65.4K Code, 6.2K Data, 71.6K Total
+ Debug Version: 138.0K Code, 56.6K Data, 194.6K Total
+
+
+2) Linux
+
+Updated Linux-specific code for core macro and OSL interface
+changes described above.
+
+Improved /proc/acpi/event. It now can be opened only once and has
+proper poll functionality.
+
+Fixed and restructured power management (acpi_bus).
+
+Only create /proc "view by type" when devices of that class
+exist.
+
+Fixed "charging/discharging" bug (and others) in acpi_battery.
+
+Improved thermal zone code.
+
+
+3) ASL Compiler, version X2039:
+
+
+Implemented the new compiler restriction on ASL String hex/octal
+escapes to non-null, ASCII values. An error results if an
+invalid
+value is used. (This will require an ACPI 2.0 specification
+change.)
+
+AML object labels that are output to the optional C and ASM
+source
+are now prefixed with both the ACPI table signature and table ID
+to help guarantee uniqueness within a large BIOS project.
+
+
+----------------------------------------
+Summary of changes for this label: 02_01_02
+
+1) ACPI CA Core Subsystem:
+
+ACPI 2.0 support is complete in the entire Core Subsystem and the
+ASL compiler. All new ACPI 2.0 operators are implemented and all
+other changes for ACPI 2.0 support are complete. With
+simultaneous code and data optimizations throughout the
+subsystem,
+ACPI 2.0 support has been implemented with almost no additional
+cost in terms of code and data size.
+
+Implemented a new mechanism for allocation of return buffers. If
+the buffer length is set to ACPI_ALLOCATE_BUFFER, the buffer will
+be allocated on behalf of the caller. Consolidated all return
+buffer validation and allocation to a common procedure. Return
+buffers will be allocated via the primary OSL allocation
+interface
+since it appears that a separate pool is not needed by most
+users.
+If a separate pool is required for these buffers, the caller can
+still use the original mechanism and pre-allocate the buffer(s).
+
+Implemented support for string operands within the DerefOf
+operator.
+
+Restructured the Hardware and Event managers to be table driven,
+simplifying the source code and reducing the amount of generated
+code.
+
+Split the common read/write low-level ACPI register bitfield
+procedure into a separate read and write, simplifying the code
+considerably.
+
+Obsoleted the AcpiOsCallocate OSL interface. This interface was
+used only a handful of times and didn't have enough critical mass
+for a separate interface. Replaced with a common calloc
+procedure
+in the core.
+
+Fixed a reported problem with the GPE number mapping mechanism
+that allows GPE1 numbers to be non-contiguous with GPE0.
+Reorganized the GPE information and shrunk a large array that was
+originally large enough to hold info for all possible GPEs (256)
+to simply large enough to hold all GPEs up to the largest GPE
+number on the machine.
+
+Fixed a reported problem with resource structure alignment on 64-
+bit platforms.
+
+Changed the AcpiEnableEvent and AcpiDisableEvent external
+interfaces to not require any flags for the common case of
+enabling/disabling a GPE.
+
+Implemented support to allow a "Notify" on a Processor object.
+
+Most TBDs in comments within the source code have been resolved
+and eliminated.
+
+
+Fixed a problem in the interpreter where a standalone parent
+prefix (^) was not handled correctly in the interpreter and
+debugger.
+
+Removed obsolete and unnecessary GPE save/restore code.
+
+Implemented Field support in the ASL Load operator. This allows
+a
+table to be loaded from a named field, in addition to loading a
+table directly from an Operation Region.
+
+Implemented timeout and handle support in the external Global
+Lock
+interfaces.
+
+Fixed a problem in the AcpiDump utility where pathnames were no
+longer being generated correctly during the dump of named
+objects.
+
+Modified the AML debugger to give a full display of if/while
+predicates instead of just one AML opcode at a time. (The
+predicate can have several nested ASL statements.) The old
+method
+was confusing during single stepping.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release (12_18_01)
+ Non-Debug Version: 66.1K Code, 5.5K Data, 71.6K Total
+ Debug Version: 138.3K Code, 55.9K Data, 194.2K Total
+ Current Release:
+ Non-Debug Version: 65.2K Code, 6.2K Data, 71.4K Total
+ Debug Version: 136.9K Code, 56.4K Data, 193.3K Total
+
+2) Linux
+
+ Implemented fix for PIIX reverse throttling errata (Processor
+driver)
+
+Added new Limit interface (Processor and Thermal drivers)
+
+New thermal policy (Thermal driver)
+
+Many updates to /proc
+
+Battery "low" event support (Battery driver)
+
+Supports ACPI PCI IRQ routing (PCI Link and PCI root drivers)
+
+IA32 - IA64 initialization unification, no longer experimental
+
+Menuconfig options redesigned
+
+3) ASL Compiler, version X2037:
+
+Implemented several new output features to simplify integration
+of
+AML code into firmware: 1) Output the AML in C source code with
+labels for each named ASL object. The original ASL source
+code
+is interleaved as C comments. 2) Output the AML in ASM source
+code
+with labels and interleaved ASL source. 3) Output the AML in
+raw hex table form, in either C or ASM.
+
+Implemented support for optional string parameters to the
+LoadTable operator.
+
+Completed support for embedded escape sequences within string
+literals. The compiler now supports all single character escapes
+as well as the Octal and Hex escapes. Note: the insertion of a
+null byte into a string literal (via the hex/octal escape) causes
+the string to be immediately terminated. A warning is issued.
+
+Fixed a problem where incorrect AML was generated for the case
+where an ASL namepath consists of a single parent prefix (
+
+) with no trailing name segments.
+
+The compiler has been successfully generated with a 64-bit C
+compiler.
+
+
+
+
+----------------------------------------
+Summary of changes for this label: 12_18_01
+
+1) Linux
+
+Enhanced blacklist with reason and severity fields. Any table's
+signature may now be used to identify a blacklisted system.
+
+Call _PIC control method to inform the firmware which interrupt
+model the OS is using. Turn on any disabled link devices.
+
+Cleaned up busmgr /proc error handling (Andreas Dilger)
+
+ 2) ACPI CA Core Subsystem:
+
+Implemented ACPI 2.0 semantics for the "Break" operator (Exit
+from
+while loop)
+
+Completed implementation of the ACPI 2.0 "Continue",
+"ConcatenateResTemplate", "DataTableRegion", and "LoadTable"
+operators. All new ACPI 2.0 operators are now implemented in
+both
+the ASL compiler and the AML interpreter. The only remaining
+ACPI
+2.0 task is support for the String data type in the DerefOf
+operator. Fixed a problem with AcquireMutex where the status
+code
+was lost if the caller had to actually wait for the mutex.
+
+Increased the maximum ASL Field size from 64K bits to 4G bits.
+
+Completed implementation of the external Global Lock interfaces -
+-
+AcpiAcquireGlobalLock and AcpiReleaseGlobalLock. The Timeout and
+Handler parameters were added.
+
+Completed another pass at removing warnings and issues when
+compiling with 64-bit compilers. The code now compiles cleanly
+with the Intel 64-bit C/C++ compiler. Most notably, the pointer
+add and subtract (diff) macros have changed considerably.
+
+
+Created and deployed a new ACPI_SIZE type that is 64-bits wide on
+64-bit platforms, 32-bits on all others. This type is used
+wherever memory allocation and/or the C sizeof() operator is
+used,
+and affects the OSL memory allocation interfaces AcpiOsAllocate
+and AcpiOsCallocate.
+
+Implemented sticky user breakpoints in the AML debugger.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release (12_05_01)
+ Non-Debug Version: 64.7K Code, 5.3K Data, 70.0K Total
+ Debug Version: 136.2K Code, 55.6K Data, 191.8K Total
+ Current Release:
+ Non-Debug Version: 66.1K Code, 5.5K Data, 71.6K Total
+ Debug Version: 138.3K Code, 55.9K Data, 194.2K Total
+
+ 3) ASL Compiler, version X2034:
+
+Now checks for (and generates an error if detected) the use of a
+Break or Continue statement without an enclosing While statement.
+
+
+Successfully generated the compiler with the Intel 64-bit C
+compiler.
+
+ ----------------------------------------
+Summary of changes for this label: 12_05_01
+
+ 1) ACPI CA Core Subsystem:
+
+The ACPI 2.0 CopyObject operator is fully implemented. This
+operator creates a new copy of an object (and is also used to
+bypass the "implicit conversion" mechanism of the Store
+operator.)
+
+The ACPI 2.0 semantics for the SizeOf operator are fully
+implemented. The change is that performing a SizeOf on a
+reference object causes an automatic dereference of the object to
+tha actual value before the size is evaluated. This behavior was
+undefined in ACPI 1.0.
+
+The ACPI 2.0 semantics for the Extended IRQ resource descriptor
+have been implemented. The interrupt polarity and mode are now
+independently set.
+
+Fixed a problem where ASL Constants (Zero, One, Ones, Revision)
+appearing in Package objects were not properly converted to
+integers when the internal Package was converted to an external
+object (via the AcpiEvaluateObject interface.)
+
+Fixed a problem with the namespace object deletion mechanism for
+objects created by control methods. There were two parts to this
+problem: 1) Objects created during the initialization phase
+method
+parse were not being deleted, and 2) The object owner ID
+mechanism
+to track objects was broken.
+
+Fixed a problem where the use of the ASL Scope operator within a
+control method would result in an invalid opcode exception.
+
+Fixed a problem introduced in the previous label where the buffer
+length required for the _PRT structure was not being returned
+correctly.
+
+Code and Data Size: Current core subsystem library sizes are
+shown
+below. These are the code and data sizes for the acpica.lib
+produced by the Microsoft Visual C++ 6.0 compiler, and these
+values do not include any ACPI driver or OSPM code. The debug
+version of the code includes the debug output trace mechanism and
+has a larger code and data size. Note that these values will
+vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Release (11_20_01)
+ Non-Debug Version: 64.1K Code, 5.3K Data, 69.4K Total
+ Debug Version: 135.1K Code, 55.4K Data, 190.5K Total
+
+ Current Release:
+ Non-Debug Version: 64.7K Code, 5.3K Data, 70.0K Total
+ Debug Version: 136.2K Code, 55.6K Data, 191.8K Total
+
+ 2) Linux:
+
+Updated all files to apply cleanly against 2.4.16.
+
+Added basic PCI Interrupt Routing Table (PRT) support for IA32
+(acpi_pci.c), and unified the PRT code for IA32 and IA64. This
+version supports both static and dyanmic PRT entries, but dynamic
+entries are treated as if they were static (not yet
+reconfigurable). Architecture- specific code to use this data is
+absent on IA32 but should be available shortly.
+
+Changed the initialization sequence to start the ACPI interpreter
+(acpi_init) prior to initialization of the PCI driver (pci_init)
+in init/main.c. This ordering is required to support PRT and
+facilitate other (future) enhancement. A side effect is that the
+ACPI bus driver and certain device drivers can no longer be
+loaded
+as modules.
+
+Modified the 'make menuconfig' options to allow PCI Interrupt
+Routing support to be included without the ACPI Bus and other
+device drivers.
+
+ 3) ASL Compiler, version X2033:
+
+Fixed some issues with the use of the new CopyObject and
+DataTableRegion operators. Both are fully functional.
+
+ ----------------------------------------
+Summary of changes for this label: 11_20_01
+
+ 20 November 2001. Summary of changes for this release.
+
+ 1) ACPI CA Core Subsystem:
+
+Updated Index support to match ACPI 2.0 semantics. Storing a
+Integer, String, or Buffer to an Index of a Buffer will store
+only
+the least-significant byte of the source to the Indexed buffer
+byte. Multiple writes are not performed.
+
+Fixed a problem where the access type used in an AccessAs ASL
+operator was not recorded correctly into the field object.
+
+Fixed a problem where ASL Event objects were created in a
+signalled state. Events are now created in an unsignalled state.
+
+The internal object cache is now purged after table loading and
+initialization to reduce the use of dynamic kernel memory -- on
+the assumption that object use is greatest during the parse phase
+of the entire table (versus the run-time use of individual
+control
+methods.)
+
+ACPI 2.0 variable-length packages are now fully operational.
+
+Code and Data Size: Code and Data optimizations have permitted
+new
+feature development with an actual reduction in the library size.
+Current core subsystem library sizes are shown below. These are
+the code and data sizes for the acpica.lib produced by the
+Microsoft Visual C++ 6.0 compiler, and these values do not
+include
+any ACPI driver or OSPM code. The debug version of the code
+includes the debug output trace mechanism and has a larger code
+and data size. Note that these values will vary depending on the
+efficiency of the compiler and the compiler options used during
+generation.
+
+ Previous Release (11_09_01):
+ Non-Debug Version: 63.7K Code, 5.2K Data, 68.9K Total
+ Debug Version: 134.5K Code, 55.4K Data, 189.9K Total
+
+ Current Release:
+ Non-Debug Version: 64.1K Code, 5.3K Data, 69.4K Total
+ Debug Version: 135.1K Code, 55.4K Data, 190.5K Total
+
+ 2) Linux:
+
+Enhanced the ACPI boot-time initialization code to allow the use
+of Local APIC tables for processor enumeration on IA-32, and to
+pave the way for a fully MPS-free boot (on SMP systems) in the
+near future. This functionality replaces
+arch/i386/kernel/acpitables.c, which was introduced in an earlier
+2.4.15-preX release. To enable this feature you must add
+"acpi_boot=on" to the kernel command line -- see the help entry
+for CONFIG_ACPI_BOOT for more information. An IA-64 release is
+in
+the works...
+
+Restructured the configuration options to allow boot-time table
+parsing support without inclusion of the ACPI Interpreter (and
+other) code.
+
+NOTE: This release does not include fixes for the reported
+events,
+power-down, and thermal passive cooling issues (coming soon).
+
+ 3) ASL Compiler:
+
+Added additional typechecking for Fields within restricted access
+Operation Regions. All fields within EC and CMOS regions must be
+declared with ByteAcc. All fields withing SMBus regions must be
+declared with the BufferAcc access type.
+
+Fixed a problem where the listing file output of control methods
+no longer interleaved the actual AML code with the ASL source
+code.
+
+
+
+
+----------------------------------------
+Summary of changes for this label: 11_09_01
+
+1) ACPI CA Core Subsystem:
+
+Implemented ACPI 2.0-defined support for writes to fields with a
+Buffer, String, or Integer source operand that is smaller than
+the
+target field. In these cases, the source operand is zero-extended
+to fill the target field.
+
+Fixed a problem where a Field starting bit offset (within the
+parent operation region) was calculated incorrectly if the
+
+alignment of the field differed from the access width. This
+affected CreateWordField, CreateDwordField, CreateQwordField, and
+possibly other fields that use the "AccessAny" keyword.
+
+Fixed a problem introduced in the 11_02_01 release where indirect
+stores through method arguments did not operate correctly.
+
+2) Linux:
+
+Implemented boot-time ACPI table parsing support
+(CONFIG_ACPI_BOOT) for IA32 and IA64 UP/SMP systems. This code
+facilitates the use of ACPI tables (e.g. MADT, SRAT) rather than
+legacy BIOS interfaces (e.g. MPS) for the configuration of system
+processors, memory, and interrupts during setup_arch(). Note
+that
+this patch does not include the required architecture-specific
+changes required to apply this information -- subsequent patches
+will be posted for both IA32 and IA64 to achieve this.
+
+Added low-level sleep support for IA32 platforms, courtesy of Pat
+Mochel. This allows IA32 systems to transition to/from various
+sleeping states (e.g. S1, S3), although the lack of a centralized
+driver model and power-manageable drivers will prevent its
+(successful) use on most systems.
+
+Revamped the ACPI 'menuconfig' layout: created new "ACPI Support"
+submenu, unified IA32 and IA64 options, added new "Boot using
+ACPI
+tables" option, etc.
+
+Increased the default timeout for the EC driver from 1ms to 10ms
+(1000 cycles of 10us) to try to address AE_TIME errors during EC
+transactions.
+
+ ----------------------------------------
+Summary of changes for this label: 11_02_01
+
+1) ACPI CA Core Subsystem:
+
+ACPI 2.0 Support: Implemented ACPI 2.0 64-bit Field access
+(QWordAcc keyword). All ACPI 2.0 64-bit support is now
+implemented.
+
+OSL Interfaces: Several of the OSL (AcpiOs*) interfaces required
+changes to support ACPI 2.0 Qword field access. Read/Write
+PciConfiguration(), Read/Write Memory(), and Read/Write Port()
+now
+accept an ACPI_INTEGER (64 bits) as the value parameter. Also,
+the value parameter for the address space handler interface is
+now
+an ACPI_INTEGER. OSL implementations of these interfaces must
+now
+handle the case where the Width parameter is 64.
+
+Index Fields: Fixed a problem where unaligned bit assembly and
+disassembly for IndexFields was not supported correctly.
+
+Index and Bank Fields: Nested Index and Bank Fields are now
+supported. During field access, a check is performed to ensure
+that the value written to an Index or Bank register is not out of
+the range of the register. The Index (or Bank) register is
+written before each access to the field data. Future support will
+include allowing individual IndexFields to be wider than the
+DataRegister width.
+
+Fields: Fixed a problem where the AML interpreter was incorrectly
+attempting to write beyond the end of a Field/OpRegion. This was
+a boundary case that occurred when a DWORD field was written to a
+BYTE access OpRegion, forcing multiple writes and causing the
+interpreter to write one datum too many.
+
+Fields: Fixed a problem with Field/OpRegion access where the
+starting bit address of a field was incorrectly calculated if the
+current access type was wider than a byte (WordAcc, DwordAcc, or
+QwordAcc).
+
+Fields: Fixed a problem where forward references to individual
+FieldUnits (individual Field names within a Field definition)
+were
+not resolved during the AML table load.
+
+Fields: Fixed a problem where forward references from a Field
+definition to the parent Operation Region definition were not
+resolved during the AML table load.
+
+Fields: Duplicate FieldUnit names within a scope are now detected
+during AML table load.
+
+Acpi Interfaces: Fixed a problem where the AcpiGetName()
+interface
+returned an incorrect name for the root node.
+
+Code and Data Size: Code and Data optimizations have permitted
+new
+feature development with an actual reduction in the library size.
+Current core subsystem library sizes are shown below. These are
+the code and data sizes for the acpica.lib produced by the
+Microsoft Visual C++ 6.0 compiler, and these values do not
+include
+any ACPI driver or OSPM code. The debug version of the code
+includes the debug output trace mechanism and has a larger code
+and data size. Note that these values will vary depending on the
+efficiency of the compiler and the compiler options used during
+generation.
+
+ Previous Release (10_18_01):
+ Non-Debug Version: 63.9K Code, 5.1K Data, 69.0K Total
+ Debug Version: 136.7K Code, 57.4K Data, 194.2K Total
+
+ Current Release:
+ Non-Debug Version: 63.7K Code, 5.2K Data, 68.9K Total
+ Debug Version: 134.5K Code, 55.4K Data, 189.9K Total
+
+ 2) Linux:
+
+Improved /proc processor output (Pavel Machek) Re-added
+MODULE_LICENSE("GPL") to all modules.
+
+ 3) ASL Compiler version X2030:
+
+Duplicate FieldUnit names within a scope are now detected and
+flagged as errors.
+
+ 4) Documentation:
+
+Programmer Reference updated to reflect OSL and address space
+handler interface changes described above.
+
+----------------------------------------
+Summary of changes for this label: 10_18_01
+
+ACPI CA Core Subsystem:
+
+Fixed a problem with the internal object reference count
+mechanism
+that occasionally caused premature object deletion. This resolves
+all of the outstanding problem reports where an object is deleted
+in the middle of an interpreter evaluation. Although this
+problem
+only showed up in rather obscure cases, the solution to the
+problem involved an adjustment of all reference counts involving
+objects attached to namespace nodes.
+
+Fixed a problem with Field support in the interpreter where
+writing to an aligned field whose length is an exact multiple (2
+or greater) of the field access granularity would cause an
+attempt
+to write beyond the end of the field.
+
+The top level AML opcode execution functions within the
+interpreter have been renamed with a more meaningful and
+consistent naming convention. The modules exmonad.c and
+exdyadic.c were eliminated. New modules are exoparg1.c,
+exoparg2.c, exoparg3.c, and exoparg6.c.
+
+Support for the ACPI 2.0 "Mid" ASL operator has been implemented.
+
+Fixed a problem where the AML debugger was causing some internal
+objects to not be deleted during subsystem termination.
+
+Fixed a problem with the external AcpiEvaluateObject interface
+where the subsystem would fault if the named object to be
+evaluated refered to a constant such as Zero, Ones, etc.
+
+Fixed a problem with IndexFields and BankFields where the
+subsystem would fault if the index, data, or bank registers were
+not defined in the same scope as the field itself.
+
+Added printf format string checking for compilers that support
+this feature. Corrected more than 50 instances of issues with
+format specifiers within invocations of ACPI_DEBUG_PRINT
+throughout the core subsystem code.
+
+The ASL "Revision" operator now returns the ACPI support level
+implemented in the core - the value "2" since the ACPI 2.0
+support
+is more than 50% implemented.
+
+Enhanced the output of the AML debugger "dump namespace" command
+to output in a more human-readable form.
+
+Current core subsystem library code sizes are shown below. These
+
+are the code and data sizes for the acpica.lib produced by the
+Microsoft Visual C++ 6.0 compiler, and these values do not
+include
+any ACPI driver or OSPM code. The debug version of the code
+includes the full debug trace mechanism -- leading to a much
+
+larger code and data size. Note that these values will vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Previous Label (09_20_01):
+ Non-Debug Version: 65K Code, 5K Data, 70K Total
+ Debug Version: 138K Code, 58K Data, 196K Total
+
+ This Label:
+
+ Non-Debug Version: 63.9K Code, 5.1K Data, 69.0K Total
+ Debug Version: 136.7K Code, 57.4K Data, 194.2K Total
+
+Linux:
+
+Implemented a "Bad BIOS Blacklist" to track machines that have
+known ASL/AML problems.
+
+Enhanced the /proc interface for the thermal zone driver and
+added
+support for _HOT (the critical suspend trip point). The 'info'
+file now includes threshold/policy information, and allows
+setting
+of _SCP (cooling preference) and _TZP (polling frequency) values
+to the 'info' file. Examples: "echo tzp=5 > info" sets the
+polling
+frequency to 5 seconds, and "echo scp=1 > info" sets the cooling
+preference to the passive/quiet mode (if supported by the ASL).
+
+Implemented a workaround for a gcc bug that resuted in an OOPs
+when loading the control method battery driver.
+
+ ----------------------------------------
+Summary of changes for this label: 09_20_01
+
+ ACPI CA Core Subsystem:
+
+The AcpiEnableEvent and AcpiDisableEvent interfaces have been
+modified to allow individual GPE levels to be flagged as wake-
+enabled (i.e., these GPEs are to remain enabled when the platform
+sleeps.)
+
+The AcpiEnterSleepState and AcpiLeaveSleepState interfaces now
+support wake-enabled GPEs. This means that upon entering the
+sleep state, all GPEs that are not wake-enabled are disabled.
+When leaving the sleep state, these GPEs are reenabled.
+
+A local double-precision divide/modulo module has been added to
+enhance portability to OS kernels where a 64-bit math library is
+not available. The new module is "utmath.c".
+
+Several optimizations have been made to reduce the use of CPU
+stack. Originally over 2K, the maximum stack usage is now below
+2K at 1860 bytes (1.82k)
+
+Fixed a problem with the AcpiGetFirmwareTable interface where the
+root table pointer was not mapped into a logical address
+properly.
+
+Fixed a problem where a NULL pointer was being dereferenced in
+the
+interpreter code for the ASL Notify operator.
+
+Fixed a problem where the use of the ASL Revision operator
+returned an error. This operator now returns the current version
+of the ACPI CA core subsystem.
+
+Fixed a problem where objects passed as control method parameters
+to AcpiEvaluateObject were always deleted at method termination.
+However, these objects may end up being stored into the namespace
+by the called method. The object reference count mechanism was
+applied to these objects instead of a force delete.
+
+Fixed a problem where static strings or buffers (contained in the
+AML code) that are declared as package elements within the ASL
+code could cause a fault because the interpreter would attempt to
+delete them. These objects are now marked with the "static
+object" flag to prevent any attempt to delete them.
+
+Implemented an interpreter optimization to use operands directly
+from the state object instead of extracting the operands to local
+variables. This reduces stack use and code size, and improves
+performance.
+
+The module exxface.c was eliminated as it was an unnecessary
+extra
+layer of code.
+
+Current core subsystem library code sizes are shown below. These
+are the code and data sizes for the acpica.lib produced by the
+Microsoft Visual C++ 6.0 compiler, and these values do not
+include
+any ACPI driver or OSPM code. The debug version of the code
+includes the full debug trace mechanism -- leading to a much
+larger code and data size. Note that these values will vary
+depending on the efficiency of the compiler and the compiler
+options used during generation.
+
+ Non-Debug Version: 65K Code, 5K Data, 70K Total
+(Previously 69K) Debug Version: 138K Code, 58K Data, 196K
+Total (Previously 195K)
+
+Linux:
+
+Support for ACPI 2.0 64-bit integers has been added. All ACPI
+Integer objects are now 64 bits wide
+
+All Acpi data types and structures are now in lower case. Only
+Acpi macros are upper case for differentiation.
+
+ Documentation:
+
+Changes to the external interfaces as described above.
+
+ ----------------------------------------
+Summary of changes for this label: 08_31_01
+
+ ACPI CA Core Subsystem:
+
+A bug with interpreter implementation of the ASL Divide operator
+was found and fixed. The implicit function return value (not the
+explicit store operands) was returning the remainder instead of
+the quotient. This was a longstanding bug and it fixes several
+known outstanding issues on various platforms.
+
+The ACPI_DEBUG_PRINT and function trace entry/exit macros have
+been further optimized for size. There are 700 invocations of
+the
+DEBUG_PRINT macro alone, so each optimization reduces the size of
+the debug version of the subsystem significantly.
+
+A stack trace mechanism has been implemented. The maximum stack
+usage is about 2K on 32-bit platforms. The debugger command
+"stat
+stack" will display the current maximum stack usage.
+
+All public symbols and global variables within the subsystem are
+now prefixed with the string "Acpi". This keeps all of the
+symbols grouped together in a kernel map, and avoids conflicts
+with other kernel subsystems.
+
+Most of the internal fixed lookup tables have been moved into the
+code segment via the const operator.
+
+Several enhancements have been made to the interpreter to both
+reduce the code size and improve performance.
+
+Current core subsystem library code sizes are shown below. These
+are the code and data sizes for the acpica.lib produced by the
+Microsoft Visual C++ 6.0 compiler, and these values do not
+include
+any ACPI driver or OSPM code. The debug version of the code
+includes the full debug trace mechanism which contains over 700
+invocations of the DEBUG_PRINT macro, 500 function entry macro
+invocations, and over 900 function exit macro invocations --
+leading to a much larger code and data size. Note that these
+values will vary depending on the efficiency of the compiler and
+the compiler options used during generation.
+
+ Non-Debug Version: 64K Code, 5K Data, 69K Total
+Debug Version: 137K Code, 58K Data, 195K Total
+
+ Linux:
+
+Implemented wbinvd() macro, pending a kernel-wide definition.
+
+Fixed /proc/acpi/event to handle poll() and short reads.
+
+ ASL Compiler, version X2026:
+
+Fixed a problem introduced in the previous label where the AML
+
+code emitted for package objects produced packages with zero
+length.
+
+ ----------------------------------------
+Summary of changes for this label: 08_16_01
+
+ACPI CA Core Subsystem:
+
+The following ACPI 2.0 ASL operators have been implemented in the
+AML interpreter (These are already supported by the Intel ASL
+compiler): ToDecimalString, ToHexString, ToString, ToInteger,
+and
+ToBuffer. Support for 64-bit AML constants is implemented in the
+AML parser, debugger, and disassembler.
+
+The internal memory tracking mechanism (leak detection code) has
+been upgraded to reduce the memory overhead (a separate tracking
+block is no longer allocated for each memory allocation), and now
+supports all of the internal object caches.
+
+The data structures and code for the internal object caches have
+been coelesced and optimized so that there is a single cache and
+memory list data structure and a single group of functions that
+implement generic cache management. This has reduced the code
+size in both the debug and release versions of the subsystem.
+
+The DEBUG_PRINT macro(s) have been optimized for size and
+replaced
+by ACPI_DEBUG_PRINT. The syntax for this macro is slightly
+different, because it generates a single call to an internal
+function. This results in a savings of about 90 bytes per
+invocation, resulting in an overall code and data savings of
+about
+16% in the debug version of the subsystem.
+
+ Linux:
+
+Fixed C3 disk corruption problems and re-enabled C3 on supporting
+machines.
+
+Integrated low-level sleep code by Patrick Mochel.
+
+Further tweaked source code Linuxization.
+
+Other minor fixes.
+
+ ASL Compiler:
+
+Support for ACPI 2.0 variable length packages is fixed/completed.
+
+Fixed a problem where the optional length parameter for the ACPI
+2.0 ToString operator.
+
+Fixed multiple extraneous error messages when a syntax error is
+detected within the declaration line of a control method.
+
+ ----------------------------------------
+Summary of changes for this label: 07_17_01
+
+ACPI CA Core Subsystem:
+
+Added a new interface named AcpiGetFirmwareTable to obtain any
+ACPI table via the ACPI signature. The interface can be called
+at
+any time during kernel initialization, even before the kernel
+virtual memory manager is initialized and paging is enabled.
+This
+allows kernel subsystems to obtain ACPI tables very early, even
+before the ACPI CA subsystem is initialized.
+
+Fixed a problem where Fields defined with the AnyAcc attribute
+could be resolved to the incorrect address under the following
+conditions: 1) the field width is larger than 8 bits and 2) the
+parent operation region is not defined on a DWORD boundary.
+
+Fixed a problem where the interpreter is not being locked during
+namespace initialization (during execution of the _INI control
+methods), causing an error when an attempt is made to release it
+later.
+
+ACPI 2.0 support in the AML Interpreter has begun and will be
+ongoing throughout the rest of this year. In this label, The Mod
+operator is implemented.
+
+Added a new data type to contain full PCI addresses named
+ACPI_PCI_ID. This structure contains the PCI Segment, Bus,
+Device,
+and Function values.
+
+ Linux:
+
+Enhanced the Linux version of the source code to change most
+capitalized ACPI type names to lowercase. For example, all
+instances of ACPI_STATUS are changed to acpi_status. This will
+result in a large diff, but the change is strictly cosmetic and
+aligns the CA code closer to the Linux coding standard.
+
+OSL Interfaces:
+
+The interfaces to the PCI configuration space have been changed
+to
+add the PCI Segment number and to split the single 32-bit
+combined
+DeviceFunction field into two 16-bit fields. This was
+accomplished by moving the four values that define an address in
+PCI configuration space (segment, bus, device, and function) to
+the new ACPI_PCI_ID structure.
+
+The changes to the PCI configuration space interfaces led to a
+reexamination of the complete set of address space access
+interfaces for PCI, I/O, and Memory. The previously existing 18
+interfaces have proven difficult to maintain (any small change
+must be propagated across at least 6 interfaces) and do not
+easily
+allow for future expansion to 64 bits if necessary. Also, on
+some
+systems, it would not be appropriate to demultiplex the access
+width (8, 16, 32,or 64) before calling the OSL if the
+corresponding native OS interfaces contain a similar access width
+parameter. For these reasons, the 18 address space interfaces
+have been replaced by these 6 new ones:
+
+AcpiOsReadPciConfiguration
+AcpiOsWritePciConfiguration
+AcpiOsReadMemory
+AcpiOsWriteMemory
+AcpiOsReadPort
+AcpiOsWritePort
+
+Added a new interface named AcpiOsGetRootPointer to allow the OSL
+to perform the platform and/or OS-specific actions necessary to
+obtain the ACPI RSDP table pointer. On IA-32 platforms, this
+interface will simply call down to the CA core to perform the low-
+memory search for the table. On IA-64, the RSDP is obtained from
+EFI. Migrating this interface to the OSL allows the CA core to
+
+remain OS and platform independent.
+
+Added a new interface named AcpiOsSignal to provide a generic
+"function code and pointer" interface for various miscellaneous
+signals and notifications that must be made to the host OS. The
+first such signals are intended to support the ASL Fatal and
+Breakpoint operators. In the latter case, the AcpiOsBreakpoint
+interface has been obsoleted.
+
+The definition of the AcpiFormatException interface has been
+changed to simplify its use. The caller no longer must supply a
+buffer to the call; A pointer to a const string is now returned
+directly. This allows the call to be easily used in printf
+statements, etc. since the caller does not have to manage a local
+buffer.
+
+
+ ASL Compiler, Version X2025:
+
+The ACPI 2.0 Switch/Case/Default operators have been implemented
+and are fully functional. They will work with all ACPI 1.0
+interpreters, since the operators are simply translated to
+If/Else
+pairs.
+
+The ACPI 2.0 ElseIf operator is implemented and will also work
+with 1.0 interpreters, for the same reason.
+
+Implemented support for ACPI 2.0 variable-length packages. These
+packages have a separate opcode, and their size is determined by
+the interpreter at run-time.
+
+Documentation The ACPI CA Programmer Reference has been updated
+to
+reflect the new interfaces and changes to existing interfaces.
+
+ ------------------------------------------
+Summary of changes for this label: 06_15_01
+
+ ACPI CA Core Subsystem:
+
+Fixed a problem where a DWORD-accessed field within a Buffer
+object would get its byte address inadvertently rounded down to
+the nearest DWORD. Buffers are always Byte-accessible.
+
+ ASL Compiler, version X2024:
+
+Fixed a problem where the Switch() operator would either fault or
+hang the compiler. Note however, that the AML code for this ACPI
+2.0 operator is not yet implemented.
+
+Compiler uses the new AcpiOsGetTimer interface to obtain compile
+timings.
+
+Implementation of the CreateField operator automatically converts
+a reference to a named field within a resource descriptor from a
+byte offset to a bit offset if required.
+
+Added some missing named fields from the resource descriptor
+support. These are the names that are automatically created by
+the
+compiler to reference fields within a descriptor. They are only
+valid at compile time and are not passed through to the AML
+interpreter.
+
+Resource descriptor named fields are now typed as Integers and
+subject to compile-time typechecking when used in expressions.
+
+ ------------------------------------------
+Summary of changes for this label: 05_18_01
+
+ ACPI CA Core Subsystem:
+
+Fixed a couple of problems in the Field support code where bits
+from adjacent fields could be returned along with the proper
+field
+bits. Restructured the field support code to improve performance,
+readability and maintainability.
+
+New DEBUG_PRINTP macro automatically inserts the procedure name
+into the output, saving hundreds of copies of procedure name
+strings within the source, shrinking the memory footprint of the
+debug version of the core subsystem.
+
+ Source Code Structure:
+
+The source code directory tree was restructured to reflect the
+current organization of the component architecture. Some files
+and directories have been moved and/or renamed.
+
+ Linux:
+
+Fixed leaking kacpidpc processes.
+
+Fixed queueing event data even when /proc/acpi/event is not
+opened.
+
+ ASL Compiler, version X2020:
+
+Memory allocation performance enhancement - over 24X compile time
+improvement on large ASL files. Parse nodes and namestring
+buffers are now allocated from a large internal compiler buffer.
+
+The temporary .SRC file is deleted unless the "-s" option is
+specified
+
+The "-d" debug output option now sends all output to the .DBG
+file
+instead of the console.
+
+"External" second parameter is now optional
+
+"ElseIf" syntax now properly allows the predicate
+
+Last operand to "Load" now recognized as a Target operand
+
+Debug object can now be used anywhere as a normal object.
+
+ResourceTemplate now returns an object of type BUFFER
+
+EISAID now returns an object of type INTEGER
+
+"Index" now works with a STRING operand
+
+"LoadTable" now accepts optional parameters
+
+"ToString" length parameter is now optional
+
+"Interrupt (ResourceType," parse error fixed.
+
+"Register" with a user-defined region space parse error fixed
+
+Escaped backslash at the end of a string ("\\") scan/parse error
+fixed
+
+"Revision" is now an object of type INTEGER.
+
+
+
+------------------------------------------
+Summary of changes for this label: 05_02_01
+
+Linux:
+
+/proc/acpi/event now blocks properly.
+
+Removed /proc/sys/acpi. You can still dump your DSDT from
+/proc/acpi/dsdt.
+
+ ACPI CA Core Subsystem:
+
+Fixed a problem introduced in the previous label where some of
+the
+"small" resource descriptor types were not recognized.
+
+Improved error messages for the case where an ASL Field is
+outside
+the range of the parent operation region.
+
+ ASL Compiler, version X2018:
+
+
+Added error detection for ASL Fields that extend beyond the
+length
+of the parent operation region (only if the length of the region
+is known at compile time.) This includes fields that have a
+minimum access width that is smaller than the parent region, and
+individual field units that are partially or entirely beyond the
+extent of the parent.
+
+
+
+------------------------------------------
+Summary of changes for this label: 04_27_01
+
+ ACPI CA Core Subsystem:
+
+Fixed a problem where the namespace mutex could be released at
+the
+wrong time during execution of AcpiRemoveAddressSpaceHandler.
+
+Added optional thread ID output for debug traces, to simplify
+debugging of multiple threads. Added context switch notification
+when the debug code realizes that a different thread is now
+executing ACPI code.
+
+Some additional external data types have been prefixed with the
+string "ACPI_" for consistency. This may effect existing code.
+The data types affected are the external callback typedefs -
+e.g.,
+
+WALK_CALLBACK becomes ACPI_WALK_CALLBACK.
+
+ Linux:
+
+Fixed an issue with the OSL semaphore implementation where a
+thread was waking up with an error from receiving a SIGCHLD
+signal.
+
+Linux version of ACPI CA now uses the system C library for string
+manipulation routines instead of a local implementation.
+
+Cleaned up comments and removed TBDs.
+
+ ASL Compiler, version X2017:
+
+Enhanced error detection and reporting for all file I/O
+operations.
+
+ Documentation:
+
+Programmer Reference updated to version 1.06.
+
+
+
+------------------------------------------
+Summary of changes for this label: 04_13_01
+
+ ACPI CA Core Subsystem:
+
+Restructured support for BufferFields and RegionFields.
+BankFields support is now fully operational. All known 32-bit
+limitations on field sizes have been removed. Both BufferFields
+and (Operation) RegionFields are now supported by the same field
+management code.
+
+Resource support now supports QWORD address and IO resources. The
+16/32/64 bit address structures and the Extended IRQ structure
+have been changed to properly handle Source Resource strings.
+
+A ThreadId of -1 is now used to indicate a "mutex not acquired"
+condition internally and must never be returned by
+AcpiOsThreadId.
+This reserved value was changed from 0 since Unix systems allow a
+thread ID of 0.
+
+Linux:
+
+Driver code reorganized to enhance portability
+
+Added a kernel configuration option to control ACPI_DEBUG
+
+Fixed the EC driver to honor _GLK.
+
+ASL Compiler, version X2016:
+
+Fixed support for the "FixedHw" keyword. Previously, the FixedHw
+address space was set to 0, not 0x7f as it should be.
+
+ ------------------------------------------
+Summary of changes for this label: 03_13_01
+
+ ACPI CA Core Subsystem:
+
+During ACPI initialization, the _SB_._INI method is now run if
+present.
+
+Notify handler fix - notifies are deferred until the parent
+method
+completes execution. This fixes the "mutex already acquired"
+issue seen occasionally.
+
+Part of the "implicit conversion" rules in ACPI 2.0 have been
+found to cause compatibility problems with existing ASL/AML. The
+convert "result-to-target-type" implementation has been removed
+for stores to method Args and Locals. Source operand conversion
+is still fully implemented. Possible changes to ACPI 2.0
+specification pending.
+
+Fix to AcpiRsCalculatePciRoutingTableLength to return correct
+length.
+
+Fix for compiler warnings for 64-bit compiles.
+
+ Linux:
+
+/proc output aligned for easier parsing.
+
+Release-version compile problem fixed.
+
+New kernel configuration options documented in Configure.help.
+
+IBM 600E - Fixed Sleep button may generate "Invalid <NULL>
+context" message.
+
+ OSPM:
+
+Power resource driver integrated with bus manager.
+
+Fixed kernel fault during active cooling for thermal zones.
+
+Source Code:
+
+The source code tree has been restructured.
+
+
+
+------------------------------------------
+Summary of changes for this label: 03_02_01
+
+ Linux OS Services Layer (OSL):
+
+Major revision of all Linux-specific code.
+
+Modularized all ACPI-specific drivers.
+
+Added new thermal zone and power resource drivers.
+
+Revamped /proc interface (new functionality is under /proc/acpi).
+
+New kernel configuration options.
+
+ Linux known issues:
+
+New kernel configuration options not documented in Configure.help
+yet.
+
+
+Module dependencies not currently implemented. If used, they
+should be loaded in this order: busmgr, power, ec, system,
+processor, battery, ac_adapter, button, thermal.
+
+Modules will not load if CONFIG_MODVERSION is set.
+
+IBM 600E - entering S5 may reboot instead of shutting down.
+
+IBM 600E - Sleep button may generate "Invalid <NULL> context"
+message.
+
+Some systems may fail with "execution mutex already acquired"
+message.
+
+ ACPI CA Core Subsystem:
+
+Added a new OSL Interface, AcpiOsGetThreadId. This was required
+for the deadlock detection code. Defined to return a non-zero,
+32-
+bit thread ID for the currently executing thread. May be a non-
+zero constant integer on single-thread systems.
+
+Implemented deadlock detection for internal subsystem mutexes.
+We
+may add conditional compilation for this code (debug only) later.
+
+ASL/AML Mutex object semantics are now fully supported. This
+includes multiple acquires/releases by owner and support for the
+
+Mutex SyncLevel parameter.
+
+A new "Force Release" mechanism automatically frees all ASL
+Mutexes that have been acquired but not released when a thread
+exits the interpreter. This forces conformance to the ACPI spec
+("All mutexes must be released when an invocation exits") and
+prevents deadlocked ASL threads. This mechanism can be expanded
+(later) to monitor other resource acquisitions if OEM ASL code
+continues to misbehave (which it will).
+
+Several new ACPI exception codes have been added for the Mutex
+support.
+
+Recursive method calls are now allowed and supported (the ACPI
+spec does in fact allow recursive method calls.) The number of
+recursive calls is subject to the restrictions imposed by the
+SERIALIZED method keyword and SyncLevel (ACPI 2.0) method
+parameter.
+
+Implemented support for the SyncLevel parameter for control
+methods (ACPI 2.0 feature)
+
+Fixed a deadlock problem when multiple threads attempted to use
+the interpreter.
+
+Fixed a problem where the string length of a String package
+element was not always set in a package returned from
+AcpiEvaluateObject.
+
+Fixed a problem where the length of a String package element was
+not always included in the length of the overall package returned
+from AcpiEvaluateObject.
+
+Added external interfaces (Acpi*) to the ACPI debug memory
+manager. This manager keeps a list of all outstanding
+allocations, and can therefore detect memory leaks and attempts
+to
+free memory blocks more than once. Useful for code such as the
+power manager, etc. May not be appropriate for device drivers.
+Performance with the debug code enabled is slow.
+
+The ACPI Global Lock is now an optional hardware element.
+
+ ASL Compiler Version X2015:
+
+Integrated changes to allow the compiler to be generated on
+multiple platforms.
+
+Linux makefile added to generate the compiler on Linux
+
+ Source Code:
+
+All platform-specific headers have been moved to their own
+subdirectory, Include/Platform.
+
+New source file added, Interpreter/ammutex.c
+
+New header file, Include/acstruct.h
+
+ Documentation:
+
+The programmer reference has been updated for the following new
+interfaces: AcpiOsGetThreadId AcpiAllocate AcpiCallocate AcpiFree
+
+ ------------------------------------------
+Summary of changes for this label: 02_08_01
+
+Core ACPI CA Subsystem: Fixed a problem where an error was
+incorrectly returned if the return resource buffer was larger
+than
+the actual data (in the resource interfaces).
+
+References to named objects within packages are resolved to the
+
+full pathname string before packages are returned directly (via
+the AcpiEvaluateObject interface) or indirectly via the resource
+interfaces.
+
+Linux OS Services Layer (OSL):
+
+Improved /proc battery interface.
+
+
+Added C-state debugging output and other miscellaneous fixes.
+
+ASL Compiler Version X2014:
+
+All defined method arguments can now be used as local variables,
+including the ones that are not actually passed in as parameters.
+The compiler tracks initialization of the arguments and issues an
+exception if they are used without prior assignment (just like
+locals).
+
+The -o option now specifies a filename prefix that is used for
+all
+output files, including the AML output file. Otherwise, the
+default behavior is as follows: 1) the AML goes to the file
+specified in the DSDT. 2) all other output files use the input
+source filename as the base.
+
+ ------------------------------------------
+Summary of changes for this label: 01_25_01
+
+Core ACPI CA Subsystem: Restructured the implementation of object
+store support within the interpreter. This includes support for
+the Store operator as well as any ASL operators that include a
+target operand.
+
+Partially implemented support for Implicit Result-to-Target
+conversion. This is when a result object is converted on the fly
+to the type of an existing target object. Completion of this
+support is pending further analysis of the ACPI specification
+concerning this matter.
+
+CPU-specific code has been removed from the subsystem (hardware
+directory).
+
+New Power Management Timer functions added
+
+Linux OS Services Layer (OSL): Moved system state transition code
+to the core, fixed it, and modified Linux OSL accordingly.
+
+Fixed C2 and C3 latency calculations.
+
+
+We no longer use the compilation date for the version message on
+initialization, but retrieve the version from
+AcpiGetSystemInfo().
+
+Incorporated for fix Sony VAIO machines.
+
+Documentation: The Programmer Reference has been updated and
+reformatted.
+
+
+ASL Compiler: Version X2013: Fixed a problem where the line
+numbering and error reporting could get out of sync in the
+presence of multiple include files.
+
+ ------------------------------------------
+Summary of changes for this label: 01_15_01
+
+Core ACPI CA Subsystem:
+
+Implemented support for type conversions in the execution of the
+ASL Concatenate operator (The second operand is converted to
+match the type of the first operand before concatenation.)
+
+Support for implicit source operand conversion is partially
+implemented. The ASL source operand types Integer, Buffer, and
+String are freely interchangeable for most ASL operators and are
+converted by the interpreter on the fly as required. Implicit
+Target operand conversion (where the result is converted to the
+target type before storing) is not yet implemented.
+
+Support for 32-bit and 64-bit BCD integers is implemented.
+
+Problem fixed where a field read on an aligned field could cause
+a
+read past the end of the field.
+
+New exception, AE_AML_NO_RETURN_VALUE, is returned when a method
+does not return a value, but the caller expects one. (The ASL
+compiler flags this as a warning.)
+
+ASL Compiler:
+
+Version X2011:
+1. Static typechecking of all operands is implemented. This
+prevents the use of invalid objects (such as using a Package
+where
+an Integer is required) at compile time instead of at interpreter
+run-time.
+2. The ASL source line is printed with ALL errors and warnings.
+3. Bug fix for source EOF without final linefeed.
+4. Debug option is split into a parse trace and a namespace
+trace.
+5. Namespace output option (-n) includes initial values for
+integers and strings.
+6. Parse-only option added for quick syntax checking.
+7. Compiler checks for duplicate ACPI name declarations
+
+Version X2012:
+1. Relaxed typechecking to allow interchangeability between
+strings, integers, and buffers. These types are now converted by
+the interpreter at runtime.
+2. Compiler reports time taken by each internal subsystem in the
+debug output file.
+
+
+ ------------------------------------------
+Summary of changes for this label: 12_14_00
+
+ASL Compiler:
+
+This is the first official release of the compiler. Since the
+compiler requires elements of the Core Subsystem, this label
+synchronizes everything.
+
+------------------------------------------
+Summary of changes for this label: 12_08_00
+
+
+Fixed a problem where named references within the ASL definition
+of both OperationRegions and CreateXXXFields did not work
+properly. The symptom was an AE_AML_OPERAND_TYPE during
+initialization of the region/field. This is similar (but not
+related internally) to the problem that was fixed in the last
+label.
+
+Implemented both 32-bit and 64-bit support for the BCD ASL
+functions ToBCD and FromBCD.
+
+Updated all legal headers to include "2000" in the copyright
+years.
+
+ ------------------------------------------
+Summary of changes for this label: 12_01_00
+
+Fixed a problem where method invocations within the ASL
+definition
+of both OperationRegions and CreateXXXFields did not work
+properly. The symptom was an AE_AML_OPERAND_TYPE during
+initialization of the region/field:
+
+ nsinit-0209: AE_AML_OPERAND_TYPE while getting region arguments
+[DEBG] ammonad-0284: Exec_monadic2_r/Not: bad operand(s)
+(0x3005)
+
+Fixed a problem where operators with more than one nested
+subexpression would fail. The symptoms were varied, by mostly
+AE_AML_OPERAND_TYPE errors. This was actually a rather serious
+problem that has gone unnoticed until now.
+
+ Subtract (Add (1,2), Multiply (3,4))
+
+Fixed a problem where AcpiGetHandle didn't quite get fixed in the
+previous build (The prefix part of a relative path was handled
+incorrectly).
+
+Fixed a problem where Operation Region initialization failed if
+the operation region name was a "namepath" instead of a simple
+"nameseg". Symptom was an AE_NO_OPERAND error.
+
+Fixed a problem where an assignment to a local variable via the
+indirect RefOf mechanism only worked for the first such
+assignment. Subsequent assignments were ignored.
+
+ ------------------------------------------
+Summary of changes for this label: 11_15_00
+
+ACPI 2.0 table support with backwards support for ACPI 1.0 and
+the
+0.71 extensions. Note: although we can read ACPI 2.0 BIOS
+tables,
+the AML interpreter does NOT have support for the new 2.0 ASL
+grammar terms at this time.
+
+All ACPI hardware access is via the GAS structures in the ACPI
+2.0
+FADT.
+
+All physical memory addresses across all platforms are now 64
+bits
+wide. Logical address width remains dependent on the platform
+(i.e., "void *").
+
+AcpiOsMapMemory interface changed to a 64-bit physical address.
+
+The AML interpreter integer size is now 64 bits, as per the ACPI
+2.0 specification.
+
+For backwards compatibility with ACPI 1.0, ACPI tables with a
+revision number less than 2 use 32-bit integers only.
+
+Fixed a problem where the evaluation of OpRegion operands did not
+always resolve them to numbers properly.
+
+------------------------------------------
+Summary of changes for this label: 10_20_00
+
+Fix for CBN_._STA issue. This fix will allow correct access to
+CBN_ OpRegions when the _STA returns 0x8.
+
+Support to convert ACPI constants (Ones, Zeros, One) to actual
+values before a package object is returned
+
+Fix for method call as predicate to if/while construct causing
+incorrect if/while behavior
+
+Fix for Else block package lengths sometimes calculated wrong (if
+block > 63 bytes)
+
+Fix for Processor object length field, was always zero
+
+Table load abort if FACP sanity check fails
+
+Fix for problem with Scope(name) if name already exists
+
+Warning emitted if a named object referenced cannot be found
+(resolved) during method execution.
+
+
+
+
+
+------------------------------------------
+Summary of changes for this label: 9_29_00
+
+New table initialization interfaces: AcpiInitializeSubsystem no
+longer has any parameters AcpiFindRootPointer - Find the RSDP (if
+necessary) AcpiLoadTables (RSDP) - load all tables found at RSDP-
+>RSDT Obsolete Interfaces AcpiLoadFirmwareTables - replaced by
+AcpiLoadTables
+
+Note: These interface changes require changes to all existing
+OSDs
+
+The PCI_Config default address space handler is always installed
+at the root namespace object.
+
+-------------------------------------------
+Summary of changes for this label: 09_15_00
+
+The new initialization architecture is implemented. New
+interfaces are: AcpiInitializeSubsystem (replaces AcpiInitialize)
+AcpiEnableSubsystem Obsolete Interfaces: AcpiLoadNamespace
+
+(Namespace is automatically loaded when a table is loaded)
+
+The ACPI_OPERAND_OBJECT has been optimized to shrink its size
+from
+52 bytes to 32 bytes. There is usually one of these for every
+namespace object, so the memory savings is significant.
+
+Implemented just-in-time evaluation of the CreateField operators.
+
+Bug fixes for IA-64 support have been integrated.
+
+Additional code review comments have been implemented
+
+The so-called "third pass parse" has been replaced by a final
+walk
+through the namespace to initialize all operation regions
+(address
+spaces) and fields that have not yet been initialized during the
+execution of the various _INI and REG methods.
+
+New file - namespace/nsinit.c
+
+-------------------------------------------
+Summary of changes for this label: 09_01_00
+
+Namespace manager data structures have been reworked to change
+the
+primary object from a table to a single object. This has
+resulted in dynamic memory savings of 3X within the namespace
+and
+2X overall in the ACPI CA subsystem.
+
+Fixed problem where the call to AcpiEvFindPciRootBuses was
+inadvertently left commented out.
+
+Reduced the warning count when generating the source with the GCC
+compiler.
+
+Revision numbers added to each module header showing the
+SourceSafe version of the file. Please refer to this version
+number when giving us feedback or comments on individual modules.
+
+The main object types within the subsystem have been renamed to
+clarify their purpose:
+
+ACPI_INTERNAL_OBJECT -> ACPI_OPERAND_OBJECT
+ACPI_GENERIC_OP -> ACPI_PARSE_OBJECT
+ACPI_NAME_TABLE_ENTRY -> ACPI_NAMESPACE_NODE
+
+NOTE: no changes to the initialization sequence are included in
+this label.
+
+-------------------------------------------
+Summary of changes for this label: 08_23_00
+
+Fixed problem where TerminateControlMethod was being called
+multiple times per method
+
+Fixed debugger problem where single stepping caused a semaphore
+to
+be oversignalled
+
+Improved performance through additional parse object caching -
+added ACPI_EXTENDED_OP type
+
+-------------------------------------------
+Summary of changes for this label: 08_10_00
+
+Parser/Interpreter integration: Eliminated the creation of
+complete parse trees for ACPI tables and control methods.
+Instead, parse subtrees are created and then deleted as soon as
+they are processed (Either entered into the namespace or
+executed
+by the interpreter). This reduces the use of dynamic kernel
+memory significantly. (about 10X)
+
+Exception codes broken into classes and renumbered. Be sure to
+recompile all code that includes acexcep.h. Hopefully we won't
+have to renumber the codes again now that they are split into
+classes (environment, programmer, AML code, ACPI table, and
+internal).
+
+Fixed some additional alignment issues in the Resource Manager
+subcomponent
+
+Implemented semaphore tracking in the AcpiExec utility, and fixed
+several places where mutexes/semaphores were being unlocked
+without a corresponding lock operation. There are no known
+semaphore or mutex "leaks" at this time.
+
+Fixed the case where an ASL Return operator is used to return an
+unnamed package.
+
+-------------------------------------------
+Summary of changes for this label: 07_28_00
+
+Fixed a problem with the way addresses were calculated in
+AcpiAmlReadFieldData() and AcpiAmlWriteFieldData(). This problem
+manifested itself when a Field was created with WordAccess or
+DwordAccess, but the field unit defined within the Field was
+less
+
+than a Word or Dword.
+
+Fixed a problem in AmlDumpOperands() module's loop to pull
+operands off of the operand stack to display information. The
+problem manifested itself as a TLB error on 64-bit systems when
+accessing an operand stack with two or more operands.
+
+Fixed a problem with the PCI configuration space handlers where
+context was getting confused between accesses. This required a
+change to the generic address space handler and address space
+setup definitions. Handlers now get both a global handler
+context
+(this is the one passed in by the user when executing
+AcpiInstallAddressSpaceHandler() and a specific region context
+that is unique to each region (For example, the _ADR, _SEG and
+_BBN values associated with a specific region). The generic
+function definitions have changed to the following:
+
+typedef ACPI_STATUS (*ADDRESS_SPACE_HANDLER) ( UINT32 Function,
+UINT32 Address, UINT32 BitWidth, UINT32 *Value, void
+*HandlerContext, // This used to be void *Context void
+*RegionContext); // This is an additional parameter
+
+typedef ACPI_STATUS (*ADDRESS_SPACE_SETUP) ( ACPI_HANDLE
+RegionHandle, UINT32 Function, void *HandlerContext, void
+**RegionContext); // This used to be **ReturnContext
+
+-------------------------------------------
+Summary of changes for this label: 07_21_00
+
+Major file consolidation and rename. All files within the
+interpreter have been renamed as well as most header files.
+This
+was done to prevent collisions with existing files in the host
+OSs -- filenames such as "config.h" and "global.h" seem to be
+quite common. The VC project files have been updated. All
+makefiles will require modification.
+
+The parser/interpreter integration continues in Phase 5 with the
+implementation of a complete 2-pass parse (the AML is parsed
+twice) for each table; This avoids the construction of a huge
+parse tree and therefore reduces the amount of dynamic memory
+required by the subsystem. Greater use of the parse object cache
+means that performance is unaffected.
+
+Many comments from the two code reviews have been rolled in.
+
+The 64-bit alignment support is complete.
+
+-------------------------------------------
+Summary of changes for this label: 06_30_00
+
+With a nod and a tip of the hat to the technology of yesteryear,
+we've added support in the source code for 80 column output
+devices. The code is now mostly constrained to 80 columns or
+less to support environments and editors that 1) cannot display
+or print more than 80 characters on a single line, and 2) cannot
+disable line wrapping.
+
+A major restructuring of the namespace data structure has been
+completed. The result is 1) cleaner and more
+understandable/maintainable code, and 2) a significant reduction
+in the dynamic memory requirement for each named ACPI object
+(almost half).
+
+-------------------------------------------
+Summary of changes for this label: 06_23_00
+
+Linux support has been added. In order to obtain approval to get
+the ACPI CA subsystem into the Linux kernel, we've had to make
+quite a few changes to the base subsystem that will affect all
+users (all the changes are generic and OS- independent). The
+effects of these global changes have been somewhat far reaching.
+Files have been merged and/or renamed and interfaces have been
+renamed. The major changes are described below.
+
+Osd* interfaces renamed to AcpiOs* to eliminate namespace
+pollution/confusion within our target kernels. All OSD
+interfaces must be modified to match the new naming convention.
+
+Files merged across the subsystem. A number of the smaller
+source
+and header files have been merged to reduce the file count and
+increase the density of the existing files. There are too many
+to list here. In general, makefiles that call out individual
+files will require rebuilding.
+
+Interpreter files renamed. All interpreter files now have the
+prefix am* instead of ie* and is*.
+
+Header files renamed: The acapi.h file is now acpixf.h. The
+acpiosd.h file is now acpiosxf.h. We are removing references to
+the acronym "API" since it is somewhat windowsy. The new name is
+"external interface" or xface or xf in the filenames.j
+
+
+All manifest constants have been forced to upper case (some were
+mixed case.) Also, the string "ACPI_" has been prepended to
+many
+(not all) of the constants, typedefs, and structs.
+
+The globals "DebugLevel" and "DebugLayer" have been renamed
+"AcpiDbgLevel" and "AcpiDbgLayer" respectively.
+
+All other globals within the subsystem are now prefixed with
+"AcpiGbl_" Internal procedures within the subsystem are now
+prefixed with "Acpi" (with only a few exceptions). The original
+two-letter abbreviation for the subcomponent remains after
+"Acpi"
+- for example, CmCallocate became AcpiCmCallocate.
+
+Added a source code translation/conversion utility. Used to
+generate the Linux source code, it can be modified to generate
+other types of source as well. Can also be used to cleanup
+existing source by removing extraneous spaces and blank lines.
+Found in tools/acpisrc/*
+
+OsdUnMapMemory was renamed to OsdUnmapMemory and then
+AcpiOsUnmapMemory. (UnMap became Unmap).
+
+A "MaxUnits" parameter has been added to AcpiOsCreateSemaphore.
+When set to one, this indicates that the caller wants to use the
+
+semaphore as a mutex, not a counting semaphore. ACPI CA uses
+both types. However, implementers of this call may want to use
+different OS primitives depending on the type of semaphore
+requested. For example, some operating systems provide separate
+
+"mutex" and "semaphore" interfaces - where the mutex interface
+is
+much faster because it doesn't have all the overhead of a full
+semaphore implementation.
+
+Fixed a deadlock problem where a method that accesses the PCI
+address space can block forever if it is the first access to the
+space.
+
+-------------------------------------------
+Summary of changes for this label: 06_02_00
+
+Support for environments that cannot handle unaligned data
+accesses (e.g. firmware and OS environments devoid of alignment
+handler technology namely SAL/EFI and the IA-64 Linux kernel)
+has
+been added (via configurable macros) in these three areas: -
+Transfer of data from the raw AML byte stream is done via byte
+moves instead of word/dword/qword moves. - External objects
+are
+aligned within the user buffer, including package elements (sub-
+objects). - Conversion of name strings to UINT32 Acpi Names is
+now
+done byte-wise.
+
+The Store operator was modified to mimic Microsoft's
+implementation when storing to a Buffer Field.
+
+Added a check of the BM_STS bit before entering C3.
+
+The methods subdirectory has been obsoleted and removed. A new
+file, cmeval.c subsumes the functionality.
+
+A 16-bit (DOS) version of AcpiExec has been developed. The
+makefile is under the acpiexec directory.
diff --git a/sys/contrib/dev/acpica/acapps.h b/sys/contrib/dev/acpica/acapps.h
new file mode 100644
index 0000000..e2d20b2
--- /dev/null
+++ b/sys/contrib/dev/acpica/acapps.h
@@ -0,0 +1,243 @@
+/******************************************************************************
+ *
+ * Module Name: acapps - common include for ACPI applications/tools
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef _ACAPPS
+#define _ACAPPS
+
+
+#ifdef _MSC_VER /* disable some level-4 warnings */
+#pragma warning(disable:4100) /* warning C4100: unreferenced formal parameter */
+#endif
+
+#define FILE_SUFFIX_DISASSEMBLY "dsl"
+#define ACPI_TABLE_FILE_SUFFIX ".dat"
+
+extern UINT8 *DsdtPtr;
+extern UINT32 AcpiDsdtLength;
+extern UINT8 *AmlStart;
+extern UINT32 AmlLength;
+
+
+extern int AcpiGbl_Optind;
+extern char *AcpiGbl_Optarg;
+
+int
+AcpiGetopt(
+ int argc,
+ char **argv,
+ char *opts);
+
+/*
+ * adisasm
+ */
+ACPI_STATUS
+AdAmlDisassemble (
+ BOOLEAN OutToFile,
+ char *Filename,
+ char *Prefix,
+ char **OutFilename,
+ BOOLEAN GetAllTables);
+
+void
+AdPrintStatistics (void);
+
+ACPI_STATUS
+AdFindDsdt(
+ UINT8 **DsdtPtr,
+ UINT32 *DsdtLength);
+
+void
+AdDumpTables (void);
+
+ACPI_STATUS
+AdGetLocalTables (
+ char *Filename,
+ BOOLEAN GetAllTables);
+
+ACPI_STATUS
+AdParseTable (
+ ACPI_TABLE_HEADER *Table);
+
+ACPI_STATUS
+AdDisplayTables (
+ char *Filename,
+ ACPI_TABLE_HEADER *Table);
+
+ACPI_STATUS
+AdDisplayStatistics (void);
+
+/*
+ * adwalk
+ */
+void
+AcpiDmCrossReferenceNamespace (
+ ACPI_PARSE_OBJECT *ParseTreeRoot,
+ ACPI_NAMESPACE_NODE *NamespaceRoot);
+
+void
+AcpiDmDumpTree (
+ ACPI_PARSE_OBJECT *Origin);
+
+void
+AcpiDmFindOrphanMethods (
+ ACPI_PARSE_OBJECT *Origin);
+
+void
+AcpiDmFinishNamespaceLoad (
+ ACPI_PARSE_OBJECT *ParseTreeRoot,
+ ACPI_NAMESPACE_NODE *NamespaceRoot);
+
+void
+AcpiDmConvertResourceIndexes (
+ ACPI_PARSE_OBJECT *ParseTreeRoot,
+ ACPI_NAMESPACE_NODE *NamespaceRoot);
+
+/*
+ * adfile
+ */
+ACPI_STATUS
+AdInitialize (
+ void);
+
+char *
+FlGenerateFilename (
+ char *InputFilename,
+ char *Suffix);
+
+ACPI_STATUS
+FlSplitInputPathname (
+ char *InputPath,
+ char **OutDirectoryPath,
+ char **OutFilename);
+
+char *
+FlGenerateFilename (
+ char *InputFilename,
+ char *Suffix);
+
+char *
+AdGenerateFilename (
+ char *Prefix,
+ char *TableId);
+
+void
+AdWriteTable (
+ ACPI_TABLE_HEADER *Table,
+ UINT32 Length,
+ char *TableName,
+ char *OemTableId);
+
+#endif /* _ACAPPS */
+
diff --git a/sys/contrib/dev/acpica/acconfig.h b/sys/contrib/dev/acpica/acconfig.h
new file mode 100644
index 0000000..c3c15a8
--- /dev/null
+++ b/sys/contrib/dev/acpica/acconfig.h
@@ -0,0 +1,296 @@
+/******************************************************************************
+ *
+ * Name: acconfig.h - Global configuration constants
+ * $Revision: 1.234 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef _ACCONFIG_H
+#define _ACCONFIG_H
+
+
+/******************************************************************************
+ *
+ * Configuration options
+ *
+ *****************************************************************************/
+
+/*
+ * ACPI_DEBUG_OUTPUT - This switch enables all the debug facilities of the
+ * ACPI subsystem. This includes the DEBUG_PRINT output
+ * statements. When disabled, all DEBUG_PRINT
+ * statements are compiled out.
+ *
+ * ACPI_APPLICATION - Use this switch if the subsystem is going to be run
+ * at the application level.
+ *
+ */
+
+/* Current ACPICA subsystem version in YYYYMMDD format */
+
+#define ACPI_CA_VERSION 0x20070320
+
+/*
+ * OS name, used for the _OS object. The _OS object is essentially obsolete,
+ * but there is a large base of ASL/AML code in existing machines that check
+ * for the string below. The use of this string usually guarantees that
+ * the ASL will execute down the most tested code path. Also, there is some
+ * code that will not execute the _OSI method unless _OS matches the string
+ * below. Therefore, change this string at your own risk.
+ */
+#define ACPI_OS_NAME "Microsoft Windows NT"
+
+/* Maximum objects in the various object caches */
+
+#define ACPI_MAX_STATE_CACHE_DEPTH 96 /* State objects */
+#define ACPI_MAX_PARSE_CACHE_DEPTH 96 /* Parse tree objects */
+#define ACPI_MAX_EXTPARSE_CACHE_DEPTH 96 /* Parse tree objects */
+#define ACPI_MAX_OBJECT_CACHE_DEPTH 96 /* Interpreter operand objects */
+#define ACPI_MAX_NAMESPACE_CACHE_DEPTH 96 /* Namespace objects */
+
+/*
+ * Should the subsystem abort the loading of an ACPI table if the
+ * table checksum is incorrect?
+ */
+#define ACPI_CHECKSUM_ABORT FALSE
+
+
+/******************************************************************************
+ *
+ * Subsystem Constants
+ *
+ *****************************************************************************/
+
+/* Version of ACPI supported */
+
+#define ACPI_CA_SUPPORT_LEVEL 3
+
+/* Maximum count for a semaphore object */
+
+#define ACPI_MAX_SEMAPHORE_COUNT 256
+
+/* Maximum object reference count (detects object deletion issues) */
+
+#define ACPI_MAX_REFERENCE_COUNT 0x800
+
+/* Size of cached memory mapping for system memory operation region */
+
+#define ACPI_SYSMEM_REGION_WINDOW_SIZE 4096
+
+/* OwnerId tracking. 8 entries allows for 255 OwnerIds */
+
+#define ACPI_NUM_OWNERID_MASKS 8
+
+/* Size of the root table array is increased by this increment */
+
+#define ACPI_ROOT_TABLE_SIZE_INCREMENT 4
+
+
+/******************************************************************************
+ *
+ * ACPI Specification constants (Do not change unless the specification changes)
+ *
+ *****************************************************************************/
+
+/* Number of distinct GPE register blocks and register width */
+
+#define ACPI_MAX_GPE_BLOCKS 2
+#define ACPI_GPE_REGISTER_WIDTH 8
+
+/* Method info (in WALK_STATE), containing local variables and argumetns */
+
+#define ACPI_METHOD_NUM_LOCALS 8
+#define ACPI_METHOD_MAX_LOCAL 7
+
+#define ACPI_METHOD_NUM_ARGS 7
+#define ACPI_METHOD_MAX_ARG 6
+
+/* Length of _HID, _UID, _CID, and UUID values */
+
+#define ACPI_DEVICE_ID_LENGTH 0x09
+#define ACPI_MAX_CID_LENGTH 48
+#define ACPI_UUID_LENGTH 16
+
+/*
+ * Operand Stack (in WALK_STATE), Must be large enough to contain METHOD_MAX_ARG
+ */
+#define ACPI_OBJ_NUM_OPERANDS 8
+#define ACPI_OBJ_MAX_OPERAND 7
+
+/* Number of elements in the Result Stack frame, can be an arbitrary value */
+
+#define ACPI_RESULTS_FRAME_OBJ_NUM 8
+
+/*
+ * Maximal number of elements the Result Stack can contain,
+ * it may be an arbitray value not exceeding the types of
+ * ResultSize and ResultCount (now UINT8).
+ */
+#define ACPI_RESULTS_OBJ_NUM_MAX 255
+
+/* Names within the namespace are 4 bytes long */
+
+#define ACPI_NAME_SIZE 4
+#define ACPI_PATH_SEGMENT_LENGTH 5 /* 4 chars for name + 1 char for separator */
+#define ACPI_PATH_SEPARATOR '.'
+
+/* Sizes for ACPI table headers */
+
+#define ACPI_OEM_ID_SIZE 6
+#define ACPI_OEM_TABLE_ID_SIZE 8
+
+/* Constants used in searching for the RSDP in low memory */
+
+#define ACPI_EBDA_PTR_LOCATION 0x0000040E /* Physical Address */
+#define ACPI_EBDA_PTR_LENGTH 2
+#define ACPI_EBDA_WINDOW_SIZE 1024
+#define ACPI_HI_RSDP_WINDOW_BASE 0x000E0000 /* Physical Address */
+#define ACPI_HI_RSDP_WINDOW_SIZE 0x00020000
+#define ACPI_RSDP_SCAN_STEP 16
+
+/* Operation regions */
+
+#define ACPI_NUM_PREDEFINED_REGIONS 8
+#define ACPI_USER_REGION_BEGIN 0x80
+
+/* Maximum SpaceIds for Operation Regions */
+
+#define ACPI_MAX_ADDRESS_SPACE 255
+
+/* Array sizes. Used for range checking also */
+
+#define ACPI_MAX_MATCH_OPCODE 5
+
+/* RSDP checksums */
+
+#define ACPI_RSDP_CHECKSUM_LENGTH 20
+#define ACPI_RSDP_XCHECKSUM_LENGTH 36
+
+/* SMBus bidirectional buffer size */
+
+#define ACPI_SMBUS_BUFFER_SIZE 34
+
+
+/******************************************************************************
+ *
+ * ACPI AML Debugger
+ *
+ *****************************************************************************/
+
+#define ACPI_DEBUGGER_MAX_ARGS 8 /* Must be max method args + 1 */
+
+#define ACPI_DEBUGGER_COMMAND_PROMPT '-'
+#define ACPI_DEBUGGER_EXECUTE_PROMPT '%'
+
+
+#endif /* _ACCONFIG_H */
+
diff --git a/sys/contrib/dev/acpica/acdebug.h b/sys/contrib/dev/acpica/acdebug.h
new file mode 100644
index 0000000..cdf566e
--- /dev/null
+++ b/sys/contrib/dev/acpica/acdebug.h
@@ -0,0 +1,437 @@
+/******************************************************************************
+ *
+ * Name: acdebug.h - ACPI/AML debugger
+ * $Revision: 1.84 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACDEBUG_H__
+#define __ACDEBUG_H__
+
+
+#define ACPI_DEBUG_BUFFER_SIZE 4196
+
+typedef struct CommandInfo
+{
+ char *Name; /* Command Name */
+ UINT8 MinArgs; /* Minimum arguments required */
+
+} COMMAND_INFO;
+
+
+typedef struct ArgumentInfo
+{
+ char *Name; /* Argument Name */
+
+} ARGUMENT_INFO;
+
+
+#define PARAM_LIST(pl) pl
+#define DBTEST_OUTPUT_LEVEL(lvl) if (AcpiGbl_DbOpt_verbose)
+#define VERBOSE_PRINT(fp) DBTEST_OUTPUT_LEVEL(lvl) {\
+ AcpiOsPrintf PARAM_LIST(fp);}
+
+#define EX_NO_SINGLE_STEP 1
+#define EX_SINGLE_STEP 2
+
+
+/*
+ * dbxface - external debugger interfaces
+ */
+ACPI_STATUS
+AcpiDbInitialize (
+ void);
+
+void
+AcpiDbTerminate (
+ void);
+
+ACPI_STATUS
+AcpiDbSingleStep (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 OpType);
+
+
+/*
+ * dbcmds - debug commands and output routines
+ */
+ACPI_STATUS
+AcpiDbDisassembleMethod (
+ char *Name);
+
+void
+AcpiDbDisplayTableInfo (
+ char *TableArg);
+
+void
+AcpiDbUnloadAcpiTable (
+ char *TableArg,
+ char *InstanceArg);
+
+void
+AcpiDbSetMethodBreakpoint (
+ char *Location,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDbSetMethodCallBreakpoint (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDbGetBusInfo (
+ void);
+
+void
+AcpiDbDisassembleAml (
+ char *Statements,
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDbDumpNamespace (
+ char *StartArg,
+ char *DepthArg);
+
+void
+AcpiDbDumpNamespaceByOwner (
+ char *OwnerArg,
+ char *DepthArg);
+
+void
+AcpiDbSendNotify (
+ char *Name,
+ UINT32 Value);
+
+void
+AcpiDbSetMethodData (
+ char *TypeArg,
+ char *IndexArg,
+ char *ValueArg);
+
+ACPI_STATUS
+AcpiDbDisplayObjects (
+ char *ObjTypeArg,
+ char *DisplayCountArg);
+
+ACPI_STATUS
+AcpiDbFindNameInNamespace (
+ char *NameArg);
+
+void
+AcpiDbSetScope (
+ char *Name);
+
+ACPI_STATUS
+AcpiDbSleep (
+ char *ObjectArg);
+
+void
+AcpiDbFindReferences (
+ char *ObjectArg);
+
+void
+AcpiDbDisplayLocks (
+ void);
+
+void
+AcpiDbDisplayResources (
+ char *ObjectArg);
+
+void
+AcpiDbDisplayGpes (
+ void);
+
+void
+AcpiDbCheckIntegrity (
+ void);
+
+void
+AcpiDbGenerateGpe (
+ char *GpeArg,
+ char *BlockArg);
+
+
+/*
+ * dbdisply - debug display commands
+ */
+void
+AcpiDbDisplayMethodInfo (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDbDecodeAndDisplayObject (
+ char *Target,
+ char *OutputType);
+
+void
+AcpiDbDisplayResultObject (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDbDisplayAllMethods (
+ char *DisplayCountArg);
+
+void
+AcpiDbDisplayArguments (
+ void);
+
+void
+AcpiDbDisplayLocals (
+ void);
+
+void
+AcpiDbDisplayResults (
+ void);
+
+void
+AcpiDbDisplayCallingTree (
+ void);
+
+void
+AcpiDbDisplayObjectType (
+ char *ObjectArg);
+
+void
+AcpiDbDisplayArgumentObject (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * dbexec - debugger control method execution
+ */
+void
+AcpiDbExecute (
+ char *Name,
+ char **Args,
+ UINT32 Flags);
+
+void
+AcpiDbCreateExecutionThreads (
+ char *NumThreadsArg,
+ char *NumLoopsArg,
+ char *MethodNameArg);
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+UINT32
+AcpiDbGetCacheInfo (
+ ACPI_MEMORY_LIST *Cache);
+#endif
+
+
+/*
+ * dbfileio - Debugger file I/O commands
+ */
+ACPI_OBJECT_TYPE
+AcpiDbMatchArgument (
+ char *UserArgument,
+ ARGUMENT_INFO *Arguments);
+
+void
+AcpiDbCloseDebugFile (
+ void);
+
+void
+AcpiDbOpenDebugFile (
+ char *Name);
+
+ACPI_STATUS
+AcpiDbLoadAcpiTable (
+ char *Filename);
+
+ACPI_STATUS
+AcpiDbGetTableFromFile (
+ char *Filename,
+ ACPI_TABLE_HEADER **Table);
+
+ACPI_STATUS
+AcpiDbReadTableFromFile (
+ char *Filename,
+ ACPI_TABLE_HEADER **Table);
+
+
+/*
+ * dbhistry - debugger HISTORY command
+ */
+void
+AcpiDbAddToHistory (
+ char *CommandLine);
+
+void
+AcpiDbDisplayHistory (
+ void);
+
+char *
+AcpiDbGetFromHistory (
+ char *CommandNumArg);
+
+
+/*
+ * dbinput - user front-end to the AML debugger
+ */
+ACPI_STATUS
+AcpiDbCommandDispatch (
+ char *InputBuffer,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+void ACPI_SYSTEM_XFACE
+AcpiDbExecuteThread (
+ void *Context);
+
+ACPI_STATUS
+AcpiDbUserCommands (
+ char Prompt,
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * dbstats - Generation and display of ACPI table statistics
+ */
+void
+AcpiDbGenerateStatistics (
+ ACPI_PARSE_OBJECT *Root,
+ BOOLEAN IsMethod);
+
+ACPI_STATUS
+AcpiDbDisplayStatistics (
+ char *TypeArg);
+
+
+/*
+ * dbutils - AML debugger utilities
+ */
+void
+AcpiDbSetOutputDestination (
+ UINT32 Where);
+
+void
+AcpiDbDumpExternalObject (
+ ACPI_OBJECT *ObjDesc,
+ UINT32 Level);
+
+void
+AcpiDbPrepNamestring (
+ char *Name);
+
+ACPI_NAMESPACE_NODE *
+AcpiDbLocalNsLookup (
+ char *Name);
+
+void
+AcpiDbUInt32ToHexString (
+ UINT32 Value,
+ char *Buffer);
+
+#endif /* __ACDEBUG_H__ */
diff --git a/sys/contrib/dev/acpica/acdisasm.h b/sys/contrib/dev/acpica/acdisasm.h
new file mode 100644
index 0000000..4371de7
--- /dev/null
+++ b/sys/contrib/dev/acpica/acdisasm.h
@@ -0,0 +1,680 @@
+/******************************************************************************
+ *
+ * Name: acdisasm.h - AML disassembler
+ * $Revision: 1.39 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACDISASM_H__
+#define __ACDISASM_H__
+
+#include <contrib/dev/acpica/amlresrc.h>
+
+
+#define BLOCK_NONE 0
+#define BLOCK_PAREN 1
+#define BLOCK_BRACE 2
+#define BLOCK_COMMA_LIST 4
+#define ACPI_DEFAULT_RESNAME *(UINT32 *) "__RD"
+
+typedef struct acpi_external_list
+{
+ char *Path;
+ char *InternalPath;
+ struct acpi_external_list *Next;
+ UINT32 Value;
+ UINT16 Length;
+ UINT8 Type;
+
+} ACPI_EXTERNAL_LIST;
+
+extern ACPI_EXTERNAL_LIST *AcpiGbl_ExternalList;
+
+typedef const struct acpi_dmtable_info
+{
+ UINT8 Opcode;
+ UINT8 Offset;
+ char *Name;
+
+} ACPI_DMTABLE_INFO;
+
+/*
+ * Values for Opcode above.
+ * Note: 0-7 must not change, used as a flag shift value
+ */
+#define ACPI_DMT_FLAG0 0
+#define ACPI_DMT_FLAG1 1
+#define ACPI_DMT_FLAG2 2
+#define ACPI_DMT_FLAG3 3
+#define ACPI_DMT_FLAG4 4
+#define ACPI_DMT_FLAG5 5
+#define ACPI_DMT_FLAG6 6
+#define ACPI_DMT_FLAG7 7
+#define ACPI_DMT_FLAGS0 8
+#define ACPI_DMT_FLAGS2 9
+#define ACPI_DMT_UINT8 10
+#define ACPI_DMT_UINT16 11
+#define ACPI_DMT_UINT24 12
+#define ACPI_DMT_UINT32 13
+#define ACPI_DMT_UINT56 14
+#define ACPI_DMT_UINT64 15
+#define ACPI_DMT_STRING 16
+#define ACPI_DMT_NAME4 17
+#define ACPI_DMT_NAME6 18
+#define ACPI_DMT_NAME8 19
+#define ACPI_DMT_CHKSUM 20
+#define ACPI_DMT_SPACEID 21
+#define ACPI_DMT_GAS 22
+#define ACPI_DMT_DMAR 23
+#define ACPI_DMT_MADT 24
+#define ACPI_DMT_SRAT 25
+#define ACPI_DMT_EXIT 26
+#define ACPI_DMT_SIG 27
+
+typedef
+void (*ACPI_TABLE_HANDLER) (
+ ACPI_TABLE_HEADER *Table);
+
+typedef struct acpi_dmtable_data
+{
+ char *Signature;
+ ACPI_DMTABLE_INFO *TableInfo;
+ ACPI_TABLE_HANDLER TableHandler;
+ char *Name;
+
+} ACPI_DMTABLE_DATA;
+
+
+typedef struct acpi_op_walk_info
+{
+ UINT32 Level;
+ UINT32 LastLevel;
+ UINT32 Count;
+ UINT32 BitOffset;
+ UINT32 Flags;
+ ACPI_WALK_STATE *WalkState;
+
+} ACPI_OP_WALK_INFO;
+
+typedef
+ACPI_STATUS (*ASL_WALK_CALLBACK) (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+typedef struct acpi_resource_tag
+{
+ UINT32 BitIndex;
+ char *Tag;
+
+} ACPI_RESOURCE_TAG;
+
+/* Strings used for decoding flags to ASL keywords */
+
+extern const char *AcpiGbl_WordDecode[];
+extern const char *AcpiGbl_IrqDecode[];
+extern const char *AcpiGbl_LockRule[];
+extern const char *AcpiGbl_AccessTypes[];
+extern const char *AcpiGbl_UpdateRules[];
+extern const char *AcpiGbl_MatchOps[];
+
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf0[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1a[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf2[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf2a[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf3[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsf4[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoAsfHdr[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoBoot[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoCpep[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoCpep0[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoDbgp[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoDmar[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoDmarHdr[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoDmarScope[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoDmar0[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoDmar1[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoEcdt[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoFacs[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoFadt1[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoFadt2[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoGas[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoHeader[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoHpet[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadt[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadt0[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadt1[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadt2[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadt3[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadt4[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadt5[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadt6[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadt7[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadt8[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMadtHdr[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMcfg[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoMcfg0[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoRsdp1[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoRsdp2[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoSbst[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoSlit[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoSpcr[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoSpmi[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoSrat[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoSrat0[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoSrat1[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoTcpa[];
+extern ACPI_DMTABLE_INFO AcpiDmTableInfoWdrt[];
+
+
+/*
+ * dmtable
+ */
+void
+AcpiDmDumpDataTable (
+ ACPI_TABLE_HEADER *Table);
+
+void
+AcpiDmDumpTable (
+ UINT32 TableLength,
+ UINT32 TableOffset,
+ void *Table,
+ UINT32 SubTableLength,
+ ACPI_DMTABLE_INFO *Info);
+
+void
+AcpiDmLineHeader (
+ UINT32 Offset,
+ UINT32 ByteLength,
+ char *Name);
+
+void
+AcpiDmLineHeader2 (
+ UINT32 Offset,
+ UINT32 ByteLength,
+ char *Name,
+ UINT32 Value);
+
+
+/*
+ * dmtbdump
+ */
+void
+AcpiDmDumpAsf (
+ ACPI_TABLE_HEADER *Table);
+
+void
+AcpiDmDumpCpep (
+ ACPI_TABLE_HEADER *Table);
+
+void
+AcpiDmDumpDmar (
+ ACPI_TABLE_HEADER *Table);
+
+void
+AcpiDmDumpFadt (
+ ACPI_TABLE_HEADER *Table);
+
+void
+AcpiDmDumpSrat (
+ ACPI_TABLE_HEADER *Table);
+
+void
+AcpiDmDumpMcfg (
+ ACPI_TABLE_HEADER *Table);
+
+void
+AcpiDmDumpMadt (
+ ACPI_TABLE_HEADER *Table);
+
+UINT32
+AcpiDmDumpRsdp (
+ ACPI_TABLE_HEADER *Table);
+
+void
+AcpiDmDumpRsdt (
+ ACPI_TABLE_HEADER *Table);
+
+void
+AcpiDmDumpSlit (
+ ACPI_TABLE_HEADER *Table);
+
+void
+AcpiDmDumpXsdt (
+ ACPI_TABLE_HEADER *Table);
+
+
+/*
+ * dmwalk
+ */
+void
+AcpiDmDisassemble (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Origin,
+ UINT32 NumOpcodes);
+
+void
+AcpiDmWalkParseTree (
+ ACPI_PARSE_OBJECT *Op,
+ ASL_WALK_CALLBACK DescendingCallback,
+ ASL_WALK_CALLBACK AscendingCallback,
+ void *Context);
+
+
+/*
+ * dmopcode
+ */
+void
+AcpiDmDisassembleOneOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OP_WALK_INFO *Info,
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDmDecodeInternalObject (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+UINT32
+AcpiDmListType (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDmMethodFlags (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDmFieldFlags (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDmAddressSpace (
+ UINT8 SpaceId);
+
+void
+AcpiDmRegionFlags (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDmMatchOp (
+ ACPI_PARSE_OBJECT *Op);
+
+BOOLEAN
+AcpiDmCommaIfListMember (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDmCommaIfFieldMember (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * dmnames
+ */
+UINT32
+AcpiDmDumpName (
+ char *Name);
+
+ACPI_STATUS
+AcpiPsDisplayObjectPathname (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDmNamestring (
+ char *Name);
+
+
+/*
+ * dmobject
+ */
+void
+AcpiDmDisplayInternalObject (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState);
+
+void
+AcpiDmDisplayArguments (
+ ACPI_WALK_STATE *WalkState);
+
+void
+AcpiDmDisplayLocals (
+ ACPI_WALK_STATE *WalkState);
+
+void
+AcpiDmDumpMethodInfo (
+ ACPI_STATUS Status,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * dmbuffer
+ */
+void
+AcpiDmDisasmByteList (
+ UINT32 Level,
+ UINT8 *ByteData,
+ UINT32 ByteCount);
+
+void
+AcpiDmByteList (
+ ACPI_OP_WALK_INFO *Info,
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDmIsEisaId (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDmEisaId (
+ UINT32 EncodedId);
+
+BOOLEAN
+AcpiDmIsUnicodeBuffer (
+ ACPI_PARSE_OBJECT *Op);
+
+BOOLEAN
+AcpiDmIsStringBuffer (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * dmresrc
+ */
+void
+AcpiDmDumpInteger8 (
+ UINT8 Value,
+ char *Name);
+
+void
+AcpiDmDumpInteger16 (
+ UINT16 Value,
+ char *Name);
+
+void
+AcpiDmDumpInteger32 (
+ UINT32 Value,
+ char *Name);
+
+void
+AcpiDmDumpInteger64 (
+ UINT64 Value,
+ char *Name);
+
+void
+AcpiDmResourceTemplate (
+ ACPI_OP_WALK_INFO *Info,
+ ACPI_PARSE_OBJECT *Op,
+ UINT8 *ByteData,
+ UINT32 ByteCount);
+
+ACPI_STATUS
+AcpiDmIsResourceTemplate (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiDmIndent (
+ UINT32 Level);
+
+void
+AcpiDmBitList (
+ UINT16 Mask);
+
+void
+AcpiDmDecodeAttribute (
+ UINT8 Attribute);
+
+void
+AcpiDmDescriptorName (
+ void);
+
+
+/*
+ * dmresrcl
+ */
+void
+AcpiDmWordDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmDwordDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmExtendedDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmQwordDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmMemory24Descriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmMemory32Descriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmFixedMemory32Descriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmGenericRegisterDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmInterruptDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmVendorLargeDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmVendorCommon (
+ char *Name,
+ UINT8 *ByteData,
+ UINT32 Length,
+ UINT32 Level);
+
+
+/*
+ * dmresrcs
+ */
+void
+AcpiDmIrqDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmDmaDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmIoDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmFixedIoDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmStartDependentDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmEndDependentDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+void
+AcpiDmVendorSmallDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+
+/*
+ * dmutils
+ */
+void
+AcpiDmAddToExternalList (
+ char *Path,
+ UINT8 Type,
+ UINT32 Value);
+
+/*
+ * dmrestag
+ */
+void
+AcpiDmFindResources (
+ ACPI_PARSE_OBJECT *Root);
+
+void
+AcpiDmCheckResourceReference (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState);
+
+#endif /* __ACDISASM_H__ */
diff --git a/sys/contrib/dev/acpica/acdispat.h b/sys/contrib/dev/acpica/acdispat.h
new file mode 100644
index 0000000..056acd9
--- /dev/null
+++ b/sys/contrib/dev/acpica/acdispat.h
@@ -0,0 +1,514 @@
+/******************************************************************************
+ *
+ * Name: acdispat.h - dispatcher (parser to interpreter interface)
+ * $Revision: 1.76 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#ifndef _ACDISPAT_H_
+#define _ACDISPAT_H_
+
+
+#define NAMEOF_LOCAL_NTE "__L0"
+#define NAMEOF_ARG_NTE "__A0"
+
+
+/*
+ * dsopcode - support for late evaluation
+ */
+ACPI_STATUS
+AcpiDsGetBufferFieldArguments (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+ACPI_STATUS
+AcpiDsGetRegionArguments (
+ ACPI_OPERAND_OBJECT *RgnDesc);
+
+ACPI_STATUS
+AcpiDsGetBufferArguments (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+ACPI_STATUS
+AcpiDsGetPackageArguments (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+ACPI_STATUS
+AcpiDsEvalBufferFieldOperands (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+ACPI_STATUS
+AcpiDsEvalRegionOperands (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+ACPI_STATUS
+AcpiDsEvalDataObjectOperands (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+ACPI_STATUS
+AcpiDsInitializeRegion (
+ ACPI_HANDLE ObjHandle);
+
+
+/*
+ * dsctrl - Parser/Interpreter interface, control stack routines
+ */
+ACPI_STATUS
+AcpiDsExecBeginControlOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+ACPI_STATUS
+AcpiDsExecEndControlOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * dsexec - Parser/Interpreter interface, method execution callbacks
+ */
+ACPI_STATUS
+AcpiDsGetPredicateValue (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT *ResultObj);
+
+ACPI_STATUS
+AcpiDsExecBeginOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT **OutOp);
+
+ACPI_STATUS
+AcpiDsExecEndOp (
+ ACPI_WALK_STATE *State);
+
+
+/*
+ * dsfield - Parser/Interpreter interface for AML fields
+ */
+ACPI_STATUS
+AcpiDsCreateField (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_NAMESPACE_NODE *RegionNode,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsCreateBankField (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_NAMESPACE_NODE *RegionNode,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsCreateIndexField (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_NAMESPACE_NODE *RegionNode,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsCreateBufferField (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsInitFieldObjects (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * dsload - Parser/Interpreter interface, namespace load callbacks
+ */
+ACPI_STATUS
+AcpiDsLoad1BeginOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT **OutOp);
+
+ACPI_STATUS
+AcpiDsLoad1EndOp (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsLoad2BeginOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT **OutOp);
+
+ACPI_STATUS
+AcpiDsLoad2EndOp (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsInitCallbacks (
+ ACPI_WALK_STATE *WalkState,
+ UINT32 PassNumber);
+
+
+/*
+ * dsmthdat - method data (locals/args)
+ */
+ACPI_STATUS
+AcpiDsStoreObjectToLocal (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_OPERAND_OBJECT *SrcDesc,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsMethodDataGetEntry (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT ***Node);
+
+void
+AcpiDsMethodDataDeleteAll (
+ ACPI_WALK_STATE *WalkState);
+
+BOOLEAN
+AcpiDsIsMethodValue (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+ACPI_STATUS
+AcpiDsMethodDataGetValue (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT **DestDesc);
+
+ACPI_STATUS
+AcpiDsMethodDataInitArgs (
+ ACPI_OPERAND_OBJECT **Params,
+ UINT32 MaxParamCount,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsMethodDataGetNode (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE **Node);
+
+void
+AcpiDsMethodDataInit (
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * dsmethod - Parser/Interpreter interface - control method parsing
+ */
+ACPI_STATUS
+AcpiDsParseMethod (
+ ACPI_NAMESPACE_NODE *Node);
+
+ACPI_STATUS
+AcpiDsCallControlMethod (
+ ACPI_THREAD_STATE *Thread,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+ACPI_STATUS
+AcpiDsRestartControlMethod (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT *ReturnDesc);
+
+void
+AcpiDsTerminateControlMethod (
+ ACPI_OPERAND_OBJECT *MethodDesc,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsBeginMethodExecution (
+ ACPI_NAMESPACE_NODE *MethodNode,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsMethodError (
+ ACPI_STATUS Status,
+ ACPI_WALK_STATE *WalkState);
+
+/*
+ * dsinit
+ */
+ACPI_STATUS
+AcpiDsInitializeObjects (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_NAMESPACE_NODE *StartNode);
+
+
+/*
+ * dsobject - Parser/Interpreter interface - object initialization and conversion
+ */
+ACPI_STATUS
+AcpiDsBuildInternalBufferObj (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 BufferLength,
+ ACPI_OPERAND_OBJECT **ObjDescPtr);
+
+ACPI_STATUS
+AcpiDsBuildInternalPackageObj (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *op,
+ UINT32 PackageLength,
+ ACPI_OPERAND_OBJECT **ObjDesc);
+
+ACPI_STATUS
+AcpiDsInitObjectFromOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ UINT16 Opcode,
+ ACPI_OPERAND_OBJECT **ObjDesc);
+
+ACPI_STATUS
+AcpiDsCreateNode (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * dsutils - Parser/Interpreter interface utility routines
+ */
+void
+AcpiDsClearImplicitReturn (
+ ACPI_WALK_STATE *WalkState);
+
+BOOLEAN
+AcpiDsDoImplicitReturn (
+ ACPI_OPERAND_OBJECT *ReturnDesc,
+ ACPI_WALK_STATE *WalkState,
+ BOOLEAN AddReference);
+
+BOOLEAN
+AcpiDsIsResultUsed (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState);
+
+void
+AcpiDsDeleteResultIfNotUsed (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_OPERAND_OBJECT *ResultObj,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsCreateOperand (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Arg,
+ UINT32 ArgsRemaining);
+
+ACPI_STATUS
+AcpiDsCreateOperands (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *FirstArg);
+
+ACPI_STATUS
+AcpiDsResolveOperands (
+ ACPI_WALK_STATE *WalkState);
+
+void
+AcpiDsClearOperands (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsEvaluateNamePath (
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * dswscope - Scope Stack manipulation
+ */
+ACPI_STATUS
+AcpiDsScopeStackPush (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_TYPE Type,
+ ACPI_WALK_STATE *WalkState);
+
+
+ACPI_STATUS
+AcpiDsScopeStackPop (
+ ACPI_WALK_STATE *WalkState);
+
+void
+AcpiDsScopeStackClear (
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * dswstate - parser WALK_STATE management routines
+ */
+ACPI_STATUS
+AcpiDsObjStackPush (
+ void *Object,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsObjStackPop (
+ UINT32 PopCount,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_WALK_STATE *
+AcpiDsCreateWalkState (
+ ACPI_OWNER_ID OwnerId,
+ ACPI_PARSE_OBJECT *Origin,
+ ACPI_OPERAND_OBJECT *MthDesc,
+ ACPI_THREAD_STATE *Thread);
+
+ACPI_STATUS
+AcpiDsInitAmlWalk (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_NAMESPACE_NODE *MethodNode,
+ UINT8 *AmlStart,
+ UINT32 AmlLength,
+ ACPI_EVALUATE_INFO *Info,
+ UINT8 PassNumber);
+
+void
+AcpiDsObjStackPopAndDelete (
+ UINT32 PopCount,
+ ACPI_WALK_STATE *WalkState);
+
+void
+AcpiDsDeleteWalkState (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_WALK_STATE *
+AcpiDsPopWalkState (
+ ACPI_THREAD_STATE *Thread);
+
+void
+AcpiDsPushWalkState (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_THREAD_STATE *Thread);
+
+ACPI_STATUS
+AcpiDsResultStackClear (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_WALK_STATE *
+AcpiDsGetCurrentWalkState (
+ ACPI_THREAD_STATE *Thread);
+
+ACPI_STATUS
+AcpiDsResultPop (
+ ACPI_OPERAND_OBJECT **Object,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiDsResultPush (
+ ACPI_OPERAND_OBJECT *Object,
+ ACPI_WALK_STATE *WalkState);
+
+#endif /* _ACDISPAT_H_ */
diff --git a/sys/contrib/dev/acpica/acefi.h b/sys/contrib/dev/acpica/acefi.h
new file mode 100644
index 0000000..3916ffa
--- /dev/null
+++ b/sys/contrib/dev/acpica/acefi.h
@@ -0,0 +1,148 @@
+/******************************************************************************
+ *
+ * Name: acefi.h - OS specific defines, etc.
+ * $Revision: 1.18 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACEFI_H__
+#define __ACEFI_H__
+
+#include <efi.h>
+#include <efistdarg.h>
+#include <efilib.h>
+
+
+/* _int64 works for both IA32 and IA64 */
+
+#define COMPILER_DEPENDENT_INT64 __int64
+#define COMPILER_DEPENDENT_UINT64 unsigned __int64
+
+/*
+ * Calling conventions:
+ *
+ * ACPI_SYSTEM_XFACE - Interfaces to host OS (handlers, threads)
+ * ACPI_EXTERNAL_XFACE - External ACPI interfaces
+ * ACPI_INTERNAL_XFACE - Internal ACPI interfaces
+ * ACPI_INTERNAL_VAR_XFACE - Internal variable-parameter list interfaces
+ */
+#define ACPI_SYSTEM_XFACE
+#define ACPI_EXTERNAL_XFACE
+#define ACPI_INTERNAL_XFACE
+#define ACPI_INTERNAL_VAR_XFACE
+
+/* warn C4142: redefinition of type */
+
+#pragma warning(disable:4142)
+
+
+#endif /* __ACEFI_H__ */
diff --git a/sys/contrib/dev/acpica/acenv.h b/sys/contrib/dev/acpica/acenv.h
new file mode 100644
index 0000000..7ae1042
--- /dev/null
+++ b/sys/contrib/dev/acpica/acenv.h
@@ -0,0 +1,444 @@
+/******************************************************************************
+ *
+ * Name: acenv.h - Generation environment specific items
+ * $Revision: 1.131 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACENV_H__
+#define __ACENV_H__
+
+
+/*
+ * Configuration for ACPI tools and utilities
+ */
+
+#ifdef ACPI_LIBRARY
+/*
+ * Note: The non-debug version of the AcpiLibrary does not contain any
+ * debug support, for minimimal size. The debug version uses ACPI_FULL_DEBUG
+ */
+#define ACPI_USE_LOCAL_CACHE
+#endif
+
+#ifdef ACPI_ASL_COMPILER
+#define ACPI_DEBUG_OUTPUT
+#define ACPI_APPLICATION
+#define ACPI_DISASSEMBLER
+#define ACPI_CONSTANT_EVAL_ONLY
+#define ACPI_LARGE_NAMESPACE_NODE
+#define ACPI_DATA_TABLE_DISASSEMBLY
+#endif
+
+#ifdef ACPI_EXEC_APP
+#undef DEBUGGER_THREADING
+#define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED
+#define ACPI_FULL_DEBUG
+#define ACPI_APPLICATION
+#define ACPI_DEBUGGER
+#define ACPI_MUTEX_DEBUG
+#define ACPI_DBG_TRACK_ALLOCATIONS
+#endif
+
+#ifdef ACPI_DASM_APP
+#ifndef MSDOS
+#define ACPI_DEBUG_OUTPUT
+#endif
+#define ACPI_APPLICATION
+#define ACPI_DISASSEMBLER
+#define ACPI_NO_METHOD_EXECUTION
+#define ACPI_LARGE_NAMESPACE_NODE
+#define ACPI_DATA_TABLE_DISASSEMBLY
+#endif
+
+#ifdef ACPI_APPLICATION
+#define ACPI_USE_SYSTEM_CLIBRARY
+#define ACPI_USE_LOCAL_CACHE
+#endif
+
+#ifdef ACPI_FULL_DEBUG
+#define ACPI_DEBUGGER
+#define ACPI_DEBUG_OUTPUT
+#define ACPI_DISASSEMBLER
+#endif
+
+
+/*
+ * Environment configuration. The purpose of this file is to interface to the
+ * local generation environment.
+ *
+ * 1) ACPI_USE_SYSTEM_CLIBRARY - Define this if linking to an actual C library.
+ * Otherwise, local versions of string/memory functions will be used.
+ * 2) ACPI_USE_STANDARD_HEADERS - Define this if linking to a C library and
+ * the standard header files may be used.
+ *
+ * The ACPI subsystem only uses low level C library functions that do not call
+ * operating system services and may therefore be inlined in the code.
+ *
+ * It may be necessary to tailor these include files to the target
+ * generation environment.
+ *
+ *
+ * Functions and constants used from each header:
+ *
+ * string.h: memcpy
+ * memset
+ * strcat
+ * strcmp
+ * strcpy
+ * strlen
+ * strncmp
+ * strncat
+ * strncpy
+ *
+ * stdlib.h: strtoul
+ *
+ * stdarg.h: va_list
+ * va_arg
+ * va_start
+ * va_end
+ *
+ */
+
+/*! [Begin] no source code translation */
+
+#if defined(__linux__)
+#include "aclinux.h"
+
+#elif defined(_AED_EFI)
+#include "acefi.h"
+
+#elif defined(WIN32)
+#include "acwin.h"
+
+#elif defined(WIN64)
+#include "acwin64.h"
+
+#elif defined(MSDOS) /* Must appear after WIN32 and WIN64 check */
+#include "acdos16.h"
+
+#elif defined(__FreeBSD__) || defined(__FreeBSD_kernel__)
+#include <contrib/dev/acpica/acfreebsd.h>
+
+#elif defined(__NetBSD__)
+#include "acnetbsd.h"
+
+#elif defined(MODESTO)
+#include "acmodesto.h"
+
+#elif defined(NETWARE)
+#include "acnetware.h"
+
+#elif defined(__sun)
+#include "acsolaris.h"
+
+#else
+
+/* All other environments */
+
+#define ACPI_USE_STANDARD_HEADERS
+
+#define COMPILER_DEPENDENT_INT64 long long
+#define COMPILER_DEPENDENT_UINT64 unsigned long long
+
+#endif
+
+/*! [End] no source code translation !*/
+
+
+/*
+ * Debugger threading model
+ * Use single threaded if the entire subsystem is contained in an application
+ * Use multiple threaded when the subsystem is running in the kernel.
+ *
+ * By default the model is single threaded if ACPI_APPLICATION is set,
+ * multi-threaded if ACPI_APPLICATION is not set.
+ */
+#define DEBUGGER_SINGLE_THREADED 0
+#define DEBUGGER_MULTI_THREADED 1
+
+#ifndef DEBUGGER_THREADING
+#ifdef ACPI_APPLICATION
+#define DEBUGGER_THREADING DEBUGGER_SINGLE_THREADED
+
+#else
+#define DEBUGGER_THREADING DEBUGGER_MULTI_THREADED
+#endif
+#endif /* !DEBUGGER_THREADING */
+
+
+/******************************************************************************
+ *
+ * C library configuration
+ *
+ *****************************************************************************/
+
+#define ACPI_IS_ASCII(c) ((c) < 0x80)
+
+#ifdef ACPI_USE_SYSTEM_CLIBRARY
+/*
+ * Use the standard C library headers.
+ * We want to keep these to a minimum.
+ */
+#ifdef ACPI_USE_STANDARD_HEADERS
+/*
+ * Use the standard headers from the standard locations
+ */
+#include <stdarg.h>
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+
+#endif /* ACPI_USE_STANDARD_HEADERS */
+
+/*
+ * We will be linking to the standard Clib functions
+ */
+#define ACPI_STRSTR(s1,s2) strstr((s1), (s2))
+#define ACPI_STRCHR(s1,c) strchr((s1), (c))
+#define ACPI_STRLEN(s) (ACPI_SIZE) strlen((s))
+#define ACPI_STRCPY(d,s) (void) strcpy((d), (s))
+#define ACPI_STRNCPY(d,s,n) (void) strncpy((d), (s), (ACPI_SIZE)(n))
+#define ACPI_STRNCMP(d,s,n) strncmp((d), (s), (ACPI_SIZE)(n))
+#define ACPI_STRCMP(d,s) strcmp((d), (s))
+#define ACPI_STRCAT(d,s) (void) strcat((d), (s))
+#define ACPI_STRNCAT(d,s,n) strncat((d), (s), (ACPI_SIZE)(n))
+#define ACPI_STRTOUL(d,s,n) strtoul((d), (s), (ACPI_SIZE)(n))
+#define ACPI_MEMCMP(s1,s2,n) memcmp((const char *)(s1), (const char *)(s2), (ACPI_SIZE)(n))
+#define ACPI_MEMCPY(d,s,n) (void) memcpy((d), (s), (ACPI_SIZE)(n))
+#define ACPI_MEMSET(d,s,n) (void) memset((d), (s), (ACPI_SIZE)(n))
+
+#define ACPI_TOUPPER(i) toupper((int) (i))
+#define ACPI_TOLOWER(i) tolower((int) (i))
+#define ACPI_IS_XDIGIT(i) isxdigit((int) (i))
+#define ACPI_IS_DIGIT(i) isdigit((int) (i))
+#define ACPI_IS_SPACE(i) isspace((int) (i))
+#define ACPI_IS_UPPER(i) isupper((int) (i))
+#define ACPI_IS_PRINT(i) isprint((int) (i))
+#define ACPI_IS_ALPHA(i) isalpha((int) (i))
+
+#else
+
+/******************************************************************************
+ *
+ * Not using native C library, use local implementations
+ *
+ *****************************************************************************/
+
+ /*
+ * Use local definitions of C library macros and functions
+ * NOTE: The function implementations may not be as efficient
+ * as an inline or assembly code implementation provided by a
+ * native C library.
+ */
+
+#ifndef va_arg
+
+#ifndef _VALIST
+#define _VALIST
+typedef char *va_list;
+#endif /* _VALIST */
+
+/*
+ * Storage alignment properties
+ */
+#define _AUPBND (sizeof (ACPI_NATIVE_INT) - 1)
+#define _ADNBND (sizeof (ACPI_NATIVE_INT) - 1)
+
+/*
+ * Variable argument list macro definitions
+ */
+#define _Bnd(X, bnd) (((sizeof (X)) + (bnd)) & (~(bnd)))
+#define va_arg(ap, T) (*(T *)(((ap) += (_Bnd (T, _AUPBND))) - (_Bnd (T,_ADNBND))))
+#define va_end(ap) (void) 0
+#define va_start(ap, A) (void) ((ap) = (((char *) &(A)) + (_Bnd (A,_AUPBND))))
+
+#endif /* va_arg */
+
+
+#define ACPI_STRSTR(s1,s2) AcpiUtStrstr ((s1), (s2))
+#define ACPI_STRCHR(s1,c) AcpiUtStrchr ((s1), (c))
+#define ACPI_STRLEN(s) (ACPI_SIZE) AcpiUtStrlen ((s))
+#define ACPI_STRCPY(d,s) (void) AcpiUtStrcpy ((d), (s))
+#define ACPI_STRNCPY(d,s,n) (void) AcpiUtStrncpy ((d), (s), (ACPI_SIZE)(n))
+#define ACPI_STRNCMP(d,s,n) AcpiUtStrncmp ((d), (s), (ACPI_SIZE)(n))
+#define ACPI_STRCMP(d,s) AcpiUtStrcmp ((d), (s))
+#define ACPI_STRCAT(d,s) (void) AcpiUtStrcat ((d), (s))
+#define ACPI_STRNCAT(d,s,n) AcpiUtStrncat ((d), (s), (ACPI_SIZE)(n))
+#define ACPI_STRTOUL(d,s,n) AcpiUtStrtoul ((d), (s), (ACPI_SIZE)(n))
+#define ACPI_MEMCMP(s1,s2,n) AcpiUtMemcmp((const char *)(s1), (const char *)(s2), (ACPI_SIZE)(n))
+#define ACPI_MEMCPY(d,s,n) (void) AcpiUtMemcpy ((d), (s), (ACPI_SIZE)(n))
+#define ACPI_MEMSET(d,v,n) (void) AcpiUtMemset ((d), (v), (ACPI_SIZE)(n))
+#define ACPI_TOUPPER AcpiUtToUpper
+#define ACPI_TOLOWER AcpiUtToLower
+
+#endif /* ACPI_USE_SYSTEM_CLIBRARY */
+
+
+/******************************************************************************
+ *
+ * Assembly code macros
+ *
+ *****************************************************************************/
+
+/*
+ * Handle platform- and compiler-specific assembly language differences.
+ * These should already have been defined by the platform includes above.
+ *
+ * Notes:
+ * 1) Interrupt 3 is used to break into a debugger
+ * 2) Interrupts are turned off during ACPI register setup
+ */
+
+/* Unrecognized compiler, use defaults */
+
+#ifndef ACPI_ASM_MACROS
+
+/*
+ * Calling conventions:
+ *
+ * ACPI_SYSTEM_XFACE - Interfaces to host OS (handlers, threads)
+ * ACPI_EXTERNAL_XFACE - External ACPI interfaces
+ * ACPI_INTERNAL_XFACE - Internal ACPI interfaces
+ * ACPI_INTERNAL_VAR_XFACE - Internal variable-parameter list interfaces
+ */
+#define ACPI_SYSTEM_XFACE
+#define ACPI_EXTERNAL_XFACE
+#define ACPI_INTERNAL_XFACE
+#define ACPI_INTERNAL_VAR_XFACE
+
+#define ACPI_ASM_MACROS
+#define BREAKPOINT3
+#define ACPI_DISABLE_IRQS()
+#define ACPI_ENABLE_IRQS()
+#define ACPI_ACQUIRE_GLOBAL_LOCK(GLptr, Acq)
+#define ACPI_RELEASE_GLOBAL_LOCK(GLptr, Acq)
+
+#endif /* ACPI_ASM_MACROS */
+
+
+#ifdef ACPI_APPLICATION
+
+/* Don't want software interrupts within a ring3 application */
+
+#undef BREAKPOINT3
+#define BREAKPOINT3
+#endif
+
+
+/******************************************************************************
+ *
+ * Compiler-specific information is contained in the compiler-specific
+ * headers.
+ *
+ *****************************************************************************/
+#endif /* __ACENV_H__ */
diff --git a/sys/contrib/dev/acpica/acevents.h b/sys/contrib/dev/acpica/acevents.h
new file mode 100644
index 0000000..8f74cb7
--- /dev/null
+++ b/sys/contrib/dev/acpica/acevents.h
@@ -0,0 +1,374 @@
+/******************************************************************************
+ *
+ * Name: acevents.h - Event subcomponent prototypes and defines
+ * $Revision: 1.107 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACEVENTS_H__
+#define __ACEVENTS_H__
+
+
+/*
+ * evevent
+ */
+ACPI_STATUS
+AcpiEvInitializeEvents (
+ void);
+
+ACPI_STATUS
+AcpiEvInstallXruptHandlers (
+ void);
+
+ACPI_STATUS
+AcpiEvInstallFadtGpes (
+ void);
+
+UINT32
+AcpiEvFixedEventDetect (
+ void);
+
+
+/*
+ * evmisc
+ */
+BOOLEAN
+AcpiEvIsNotifyObject (
+ ACPI_NAMESPACE_NODE *Node);
+
+ACPI_STATUS
+AcpiEvAcquireGlobalLock(
+ UINT16 Timeout);
+
+ACPI_STATUS
+AcpiEvReleaseGlobalLock(
+ void);
+
+ACPI_STATUS
+AcpiEvInitGlobalLockHandler (
+ void);
+
+UINT32
+AcpiEvGetGpeNumberIndex (
+ UINT32 GpeNumber);
+
+ACPI_STATUS
+AcpiEvQueueNotifyRequest (
+ ACPI_NAMESPACE_NODE *Node,
+ UINT32 NotifyValue);
+
+
+/*
+ * evgpe - GPE handling and dispatch
+ */
+ACPI_STATUS
+AcpiEvUpdateGpeEnableMasks (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo,
+ UINT8 Type);
+
+ACPI_STATUS
+AcpiEvEnableGpe (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo,
+ BOOLEAN WriteToHardware);
+
+ACPI_STATUS
+AcpiEvDisableGpe (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo);
+
+ACPI_GPE_EVENT_INFO *
+AcpiEvGetGpeEventInfo (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber);
+
+
+/*
+ * evgpeblk
+ */
+BOOLEAN
+AcpiEvValidGpeEvent (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo);
+
+ACPI_STATUS
+AcpiEvWalkGpeList (
+ ACPI_GPE_CALLBACK GpeWalkCallback);
+
+ACPI_STATUS
+AcpiEvDeleteGpeHandlers (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock);
+
+ACPI_STATUS
+AcpiEvCreateGpeBlock (
+ ACPI_NAMESPACE_NODE *GpeDevice,
+ ACPI_GENERIC_ADDRESS *GpeBlockAddress,
+ UINT32 RegisterCount,
+ UINT8 GpeBlockBaseNumber,
+ UINT32 InterruptNumber,
+ ACPI_GPE_BLOCK_INFO **ReturnGpeBlock);
+
+ACPI_STATUS
+AcpiEvInitializeGpeBlock (
+ ACPI_NAMESPACE_NODE *GpeDevice,
+ ACPI_GPE_BLOCK_INFO *GpeBlock);
+
+ACPI_STATUS
+AcpiEvDeleteGpeBlock (
+ ACPI_GPE_BLOCK_INFO *GpeBlock);
+
+UINT32
+AcpiEvGpeDispatch (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo,
+ UINT32 GpeNumber);
+
+UINT32
+AcpiEvGpeDetect (
+ ACPI_GPE_XRUPT_INFO *GpeXruptList);
+
+ACPI_STATUS
+AcpiEvSetGpeType (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo,
+ UINT8 Type);
+
+ACPI_STATUS
+AcpiEvCheckForWakeOnlyGpe (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo);
+
+ACPI_STATUS
+AcpiEvGpeInitialize (
+ void);
+
+
+/*
+ * evregion - Address Space handling
+ */
+ACPI_STATUS
+AcpiEvInstallRegionHandlers (
+ void);
+
+ACPI_STATUS
+AcpiEvInitializeOpRegions (
+ void);
+
+ACPI_STATUS
+AcpiEvAddressSpaceDispatch (
+ ACPI_OPERAND_OBJECT *RegionObj,
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value);
+
+ACPI_STATUS
+AcpiEvAttachRegion (
+ ACPI_OPERAND_OBJECT *HandlerObj,
+ ACPI_OPERAND_OBJECT *RegionObj,
+ BOOLEAN AcpiNsIsLocked);
+
+void
+AcpiEvDetachRegion (
+ ACPI_OPERAND_OBJECT *RegionObj,
+ BOOLEAN AcpiNsIsLocked);
+
+ACPI_STATUS
+AcpiEvInstallSpaceHandler (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_ADR_SPACE_TYPE SpaceId,
+ ACPI_ADR_SPACE_HANDLER Handler,
+ ACPI_ADR_SPACE_SETUP Setup,
+ void *Context);
+
+ACPI_STATUS
+AcpiEvExecuteRegMethods (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_ADR_SPACE_TYPE SpaceId);
+
+ACPI_STATUS
+AcpiEvExecuteRegMethod (
+ ACPI_OPERAND_OBJECT *RegionObj,
+ UINT32 Function);
+
+
+/*
+ * evregini - Region initialization and setup
+ */
+ACPI_STATUS
+AcpiEvSystemMemoryRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext);
+
+ACPI_STATUS
+AcpiEvIoSpaceRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext);
+
+ACPI_STATUS
+AcpiEvPciConfigRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext);
+
+ACPI_STATUS
+AcpiEvCmosRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext);
+
+ACPI_STATUS
+AcpiEvPciBarRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext);
+
+ACPI_STATUS
+AcpiEvDefaultRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext);
+
+ACPI_STATUS
+AcpiEvInitializeRegion (
+ ACPI_OPERAND_OBJECT *RegionObj,
+ BOOLEAN AcpiNsLocked);
+
+
+/*
+ * evsci - SCI (System Control Interrupt) handling/dispatch
+ */
+UINT32 ACPI_SYSTEM_XFACE
+AcpiEvGpeXruptHandler (
+ void *Context);
+
+UINT32
+AcpiEvInstallSciHandler (
+ void);
+
+ACPI_STATUS
+AcpiEvRemoveSciHandler (
+ void);
+
+UINT32
+AcpiEvInitializeSCI (
+ UINT32 ProgramSCI);
+
+void
+AcpiEvTerminate (
+ void);
+
+
+#endif /* __ACEVENTS_H__ */
diff --git a/sys/contrib/dev/acpica/acexcep.h b/sys/contrib/dev/acpica/acexcep.h
new file mode 100644
index 0000000..ccc1537
--- /dev/null
+++ b/sys/contrib/dev/acpica/acexcep.h
@@ -0,0 +1,390 @@
+/******************************************************************************
+ *
+ * Name: acexcep.h - Exception codes returned by the ACPI subsystem
+ * $Revision: 1.79 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACEXCEP_H__
+#define __ACEXCEP_H__
+
+
+/*
+ * Exceptions returned by external ACPI interfaces
+ */
+#define AE_CODE_ENVIRONMENTAL 0x0000
+#define AE_CODE_PROGRAMMER 0x1000
+#define AE_CODE_ACPI_TABLES 0x2000
+#define AE_CODE_AML 0x3000
+#define AE_CODE_CONTROL 0x4000
+#define AE_CODE_MASK 0xF000
+
+
+#define ACPI_SUCCESS(a) (!(a))
+#define ACPI_FAILURE(a) (a)
+
+
+#define AE_OK (ACPI_STATUS) 0x0000
+
+/*
+ * Environmental exceptions
+ */
+#define AE_ERROR (ACPI_STATUS) (0x0001 | AE_CODE_ENVIRONMENTAL)
+#define AE_NO_ACPI_TABLES (ACPI_STATUS) (0x0002 | AE_CODE_ENVIRONMENTAL)
+#define AE_NO_NAMESPACE (ACPI_STATUS) (0x0003 | AE_CODE_ENVIRONMENTAL)
+#define AE_NO_MEMORY (ACPI_STATUS) (0x0004 | AE_CODE_ENVIRONMENTAL)
+#define AE_NOT_FOUND (ACPI_STATUS) (0x0005 | AE_CODE_ENVIRONMENTAL)
+#define AE_NOT_EXIST (ACPI_STATUS) (0x0006 | AE_CODE_ENVIRONMENTAL)
+#define AE_ALREADY_EXISTS (ACPI_STATUS) (0x0007 | AE_CODE_ENVIRONMENTAL)
+#define AE_TYPE (ACPI_STATUS) (0x0008 | AE_CODE_ENVIRONMENTAL)
+#define AE_NULL_OBJECT (ACPI_STATUS) (0x0009 | AE_CODE_ENVIRONMENTAL)
+#define AE_NULL_ENTRY (ACPI_STATUS) (0x000A | AE_CODE_ENVIRONMENTAL)
+#define AE_BUFFER_OVERFLOW (ACPI_STATUS) (0x000B | AE_CODE_ENVIRONMENTAL)
+#define AE_STACK_OVERFLOW (ACPI_STATUS) (0x000C | AE_CODE_ENVIRONMENTAL)
+#define AE_STACK_UNDERFLOW (ACPI_STATUS) (0x000D | AE_CODE_ENVIRONMENTAL)
+#define AE_NOT_IMPLEMENTED (ACPI_STATUS) (0x000E | AE_CODE_ENVIRONMENTAL)
+#define AE_VERSION_MISMATCH (ACPI_STATUS) (0x000F | AE_CODE_ENVIRONMENTAL)
+#define AE_SUPPORT (ACPI_STATUS) (0x0010 | AE_CODE_ENVIRONMENTAL)
+#define AE_SHARE (ACPI_STATUS) (0x0011 | AE_CODE_ENVIRONMENTAL)
+#define AE_LIMIT (ACPI_STATUS) (0x0012 | AE_CODE_ENVIRONMENTAL)
+#define AE_TIME (ACPI_STATUS) (0x0013 | AE_CODE_ENVIRONMENTAL)
+#define AE_UNKNOWN_STATUS (ACPI_STATUS) (0x0014 | AE_CODE_ENVIRONMENTAL)
+#define AE_ACQUIRE_DEADLOCK (ACPI_STATUS) (0x0015 | AE_CODE_ENVIRONMENTAL)
+#define AE_RELEASE_DEADLOCK (ACPI_STATUS) (0x0016 | AE_CODE_ENVIRONMENTAL)
+#define AE_NOT_ACQUIRED (ACPI_STATUS) (0x0017 | AE_CODE_ENVIRONMENTAL)
+#define AE_ALREADY_ACQUIRED (ACPI_STATUS) (0x0018 | AE_CODE_ENVIRONMENTAL)
+#define AE_NO_HARDWARE_RESPONSE (ACPI_STATUS) (0x0019 | AE_CODE_ENVIRONMENTAL)
+#define AE_NO_GLOBAL_LOCK (ACPI_STATUS) (0x001A | AE_CODE_ENVIRONMENTAL)
+#define AE_LOGICAL_ADDRESS (ACPI_STATUS) (0x001B | AE_CODE_ENVIRONMENTAL)
+#define AE_ABORT_METHOD (ACPI_STATUS) (0x001C | AE_CODE_ENVIRONMENTAL)
+#define AE_SAME_HANDLER (ACPI_STATUS) (0x001D | AE_CODE_ENVIRONMENTAL)
+#define AE_WAKE_ONLY_GPE (ACPI_STATUS) (0x001E | AE_CODE_ENVIRONMENTAL)
+#define AE_OWNER_ID_LIMIT (ACPI_STATUS) (0x001F | AE_CODE_ENVIRONMENTAL)
+
+#define AE_CODE_ENV_MAX 0x001F
+
+
+/*
+ * Programmer exceptions
+ */
+#define AE_BAD_PARAMETER (ACPI_STATUS) (0x0001 | AE_CODE_PROGRAMMER)
+#define AE_BAD_CHARACTER (ACPI_STATUS) (0x0002 | AE_CODE_PROGRAMMER)
+#define AE_BAD_PATHNAME (ACPI_STATUS) (0x0003 | AE_CODE_PROGRAMMER)
+#define AE_BAD_DATA (ACPI_STATUS) (0x0004 | AE_CODE_PROGRAMMER)
+#define AE_BAD_ADDRESS (ACPI_STATUS) (0x0005 | AE_CODE_PROGRAMMER)
+#define AE_ALIGNMENT (ACPI_STATUS) (0x0006 | AE_CODE_PROGRAMMER)
+#define AE_BAD_HEX_CONSTANT (ACPI_STATUS) (0x0007 | AE_CODE_PROGRAMMER)
+#define AE_BAD_OCTAL_CONSTANT (ACPI_STATUS) (0x0008 | AE_CODE_PROGRAMMER)
+#define AE_BAD_DECIMAL_CONSTANT (ACPI_STATUS) (0x0009 | AE_CODE_PROGRAMMER)
+
+#define AE_CODE_PGM_MAX 0x0009
+
+
+/*
+ * Acpi table exceptions
+ */
+#define AE_BAD_SIGNATURE (ACPI_STATUS) (0x0001 | AE_CODE_ACPI_TABLES)
+#define AE_BAD_HEADER (ACPI_STATUS) (0x0002 | AE_CODE_ACPI_TABLES)
+#define AE_BAD_CHECKSUM (ACPI_STATUS) (0x0003 | AE_CODE_ACPI_TABLES)
+#define AE_BAD_VALUE (ACPI_STATUS) (0x0004 | AE_CODE_ACPI_TABLES)
+#define AE_TABLE_NOT_SUPPORTED (ACPI_STATUS) (0x0005 | AE_CODE_ACPI_TABLES)
+#define AE_INVALID_TABLE_LENGTH (ACPI_STATUS) (0x0006 | AE_CODE_ACPI_TABLES)
+
+#define AE_CODE_TBL_MAX 0x0006
+
+
+/*
+ * AML exceptions. These are caused by problems with
+ * the actual AML byte stream
+ */
+#define AE_AML_ERROR (ACPI_STATUS) (0x0001 | AE_CODE_AML)
+#define AE_AML_PARSE (ACPI_STATUS) (0x0002 | AE_CODE_AML)
+#define AE_AML_BAD_OPCODE (ACPI_STATUS) (0x0003 | AE_CODE_AML)
+#define AE_AML_NO_OPERAND (ACPI_STATUS) (0x0004 | AE_CODE_AML)
+#define AE_AML_OPERAND_TYPE (ACPI_STATUS) (0x0005 | AE_CODE_AML)
+#define AE_AML_OPERAND_VALUE (ACPI_STATUS) (0x0006 | AE_CODE_AML)
+#define AE_AML_UNINITIALIZED_LOCAL (ACPI_STATUS) (0x0007 | AE_CODE_AML)
+#define AE_AML_UNINITIALIZED_ARG (ACPI_STATUS) (0x0008 | AE_CODE_AML)
+#define AE_AML_UNINITIALIZED_ELEMENT (ACPI_STATUS) (0x0009 | AE_CODE_AML)
+#define AE_AML_NUMERIC_OVERFLOW (ACPI_STATUS) (0x000A | AE_CODE_AML)
+#define AE_AML_REGION_LIMIT (ACPI_STATUS) (0x000B | AE_CODE_AML)
+#define AE_AML_BUFFER_LIMIT (ACPI_STATUS) (0x000C | AE_CODE_AML)
+#define AE_AML_PACKAGE_LIMIT (ACPI_STATUS) (0x000D | AE_CODE_AML)
+#define AE_AML_DIVIDE_BY_ZERO (ACPI_STATUS) (0x000E | AE_CODE_AML)
+#define AE_AML_BAD_NAME (ACPI_STATUS) (0x000F | AE_CODE_AML)
+#define AE_AML_NAME_NOT_FOUND (ACPI_STATUS) (0x0010 | AE_CODE_AML)
+#define AE_AML_INTERNAL (ACPI_STATUS) (0x0011 | AE_CODE_AML)
+#define AE_AML_INVALID_SPACE_ID (ACPI_STATUS) (0x0012 | AE_CODE_AML)
+#define AE_AML_STRING_LIMIT (ACPI_STATUS) (0x0013 | AE_CODE_AML)
+#define AE_AML_NO_RETURN_VALUE (ACPI_STATUS) (0x0014 | AE_CODE_AML)
+#define AE_AML_METHOD_LIMIT (ACPI_STATUS) (0x0015 | AE_CODE_AML)
+#define AE_AML_NOT_OWNER (ACPI_STATUS) (0x0016 | AE_CODE_AML)
+#define AE_AML_MUTEX_ORDER (ACPI_STATUS) (0x0017 | AE_CODE_AML)
+#define AE_AML_MUTEX_NOT_ACQUIRED (ACPI_STATUS) (0x0018 | AE_CODE_AML)
+#define AE_AML_INVALID_RESOURCE_TYPE (ACPI_STATUS) (0x0019 | AE_CODE_AML)
+#define AE_AML_INVALID_INDEX (ACPI_STATUS) (0x001A | AE_CODE_AML)
+#define AE_AML_REGISTER_LIMIT (ACPI_STATUS) (0x001B | AE_CODE_AML)
+#define AE_AML_NO_WHILE (ACPI_STATUS) (0x001C | AE_CODE_AML)
+#define AE_AML_ALIGNMENT (ACPI_STATUS) (0x001D | AE_CODE_AML)
+#define AE_AML_NO_RESOURCE_END_TAG (ACPI_STATUS) (0x001E | AE_CODE_AML)
+#define AE_AML_BAD_RESOURCE_VALUE (ACPI_STATUS) (0x001F | AE_CODE_AML)
+#define AE_AML_CIRCULAR_REFERENCE (ACPI_STATUS) (0x0020 | AE_CODE_AML)
+#define AE_AML_BAD_RESOURCE_LENGTH (ACPI_STATUS) (0x0021 | AE_CODE_AML)
+#define AE_AML_ILLEGAL_ADDRESS (ACPI_STATUS) (0x0022 | AE_CODE_AML)
+
+#define AE_CODE_AML_MAX 0x0022
+
+
+/*
+ * Internal exceptions used for control
+ */
+#define AE_CTRL_RETURN_VALUE (ACPI_STATUS) (0x0001 | AE_CODE_CONTROL)
+#define AE_CTRL_PENDING (ACPI_STATUS) (0x0002 | AE_CODE_CONTROL)
+#define AE_CTRL_TERMINATE (ACPI_STATUS) (0x0003 | AE_CODE_CONTROL)
+#define AE_CTRL_TRUE (ACPI_STATUS) (0x0004 | AE_CODE_CONTROL)
+#define AE_CTRL_FALSE (ACPI_STATUS) (0x0005 | AE_CODE_CONTROL)
+#define AE_CTRL_DEPTH (ACPI_STATUS) (0x0006 | AE_CODE_CONTROL)
+#define AE_CTRL_END (ACPI_STATUS) (0x0007 | AE_CODE_CONTROL)
+#define AE_CTRL_TRANSFER (ACPI_STATUS) (0x0008 | AE_CODE_CONTROL)
+#define AE_CTRL_BREAK (ACPI_STATUS) (0x0009 | AE_CODE_CONTROL)
+#define AE_CTRL_CONTINUE (ACPI_STATUS) (0x000A | AE_CODE_CONTROL)
+#define AE_CTRL_SKIP (ACPI_STATUS) (0x000B | AE_CODE_CONTROL)
+#define AE_CTRL_PARSE_CONTINUE (ACPI_STATUS) (0x000C | AE_CODE_CONTROL)
+#define AE_CTRL_PARSE_PENDING (ACPI_STATUS) (0x000D | AE_CODE_CONTROL)
+
+#define AE_CODE_CTRL_MAX 0x000D
+
+
+#ifdef DEFINE_ACPI_GLOBALS
+
+
+/*
+ * String versions of the exception codes above
+ * These strings must match the corresponding defines exactly
+ */
+char const *AcpiGbl_ExceptionNames_Env[] =
+{
+ "AE_OK",
+ "AE_ERROR",
+ "AE_NO_ACPI_TABLES",
+ "AE_NO_NAMESPACE",
+ "AE_NO_MEMORY",
+ "AE_NOT_FOUND",
+ "AE_NOT_EXIST",
+ "AE_ALREADY_EXISTS",
+ "AE_TYPE",
+ "AE_NULL_OBJECT",
+ "AE_NULL_ENTRY",
+ "AE_BUFFER_OVERFLOW",
+ "AE_STACK_OVERFLOW",
+ "AE_STACK_UNDERFLOW",
+ "AE_NOT_IMPLEMENTED",
+ "AE_VERSION_MISMATCH",
+ "AE_SUPPORT",
+ "AE_SHARE",
+ "AE_LIMIT",
+ "AE_TIME",
+ "AE_UNKNOWN_STATUS",
+ "AE_ACQUIRE_DEADLOCK",
+ "AE_RELEASE_DEADLOCK",
+ "AE_NOT_ACQUIRED",
+ "AE_ALREADY_ACQUIRED",
+ "AE_NO_HARDWARE_RESPONSE",
+ "AE_NO_GLOBAL_LOCK",
+ "AE_LOGICAL_ADDRESS",
+ "AE_ABORT_METHOD",
+ "AE_SAME_HANDLER",
+ "AE_WAKE_ONLY_GPE",
+ "AE_OWNER_ID_LIMIT"
+};
+
+char const *AcpiGbl_ExceptionNames_Pgm[] =
+{
+ "AE_BAD_PARAMETER",
+ "AE_BAD_CHARACTER",
+ "AE_BAD_PATHNAME",
+ "AE_BAD_DATA",
+ "AE_BAD_ADDRESS",
+ "AE_ALIGNMENT",
+ "AE_BAD_HEX_CONSTANT",
+ "AE_BAD_OCTAL_CONSTANT",
+ "AE_BAD_DECIMAL_CONSTANT"
+};
+
+char const *AcpiGbl_ExceptionNames_Tbl[] =
+{
+ "AE_BAD_SIGNATURE",
+ "AE_BAD_HEADER",
+ "AE_BAD_CHECKSUM",
+ "AE_BAD_VALUE",
+ "AE_TABLE_NOT_SUPPORTED",
+ "AE_INVALID_TABLE_LENGTH"
+};
+
+char const *AcpiGbl_ExceptionNames_Aml[] =
+{
+ "AE_AML_ERROR",
+ "AE_AML_PARSE",
+ "AE_AML_BAD_OPCODE",
+ "AE_AML_NO_OPERAND",
+ "AE_AML_OPERAND_TYPE",
+ "AE_AML_OPERAND_VALUE",
+ "AE_AML_UNINITIALIZED_LOCAL",
+ "AE_AML_UNINITIALIZED_ARG",
+ "AE_AML_UNINITIALIZED_ELEMENT",
+ "AE_AML_NUMERIC_OVERFLOW",
+ "AE_AML_REGION_LIMIT",
+ "AE_AML_BUFFER_LIMIT",
+ "AE_AML_PACKAGE_LIMIT",
+ "AE_AML_DIVIDE_BY_ZERO",
+ "AE_AML_BAD_NAME",
+ "AE_AML_NAME_NOT_FOUND",
+ "AE_AML_INTERNAL",
+ "AE_AML_INVALID_SPACE_ID",
+ "AE_AML_STRING_LIMIT",
+ "AE_AML_NO_RETURN_VALUE",
+ "AE_AML_METHOD_LIMIT",
+ "AE_AML_NOT_OWNER",
+ "AE_AML_MUTEX_ORDER",
+ "AE_AML_MUTEX_NOT_ACQUIRED",
+ "AE_AML_INVALID_RESOURCE_TYPE",
+ "AE_AML_INVALID_INDEX",
+ "AE_AML_REGISTER_LIMIT",
+ "AE_AML_NO_WHILE",
+ "AE_AML_ALIGNMENT",
+ "AE_AML_NO_RESOURCE_END_TAG",
+ "AE_AML_BAD_RESOURCE_VALUE",
+ "AE_AML_CIRCULAR_REFERENCE",
+ "AE_AML_BAD_RESOURCE_LENGTH",
+ "AE_AML_ILLEGAL_ADDRESS"
+};
+
+char const *AcpiGbl_ExceptionNames_Ctrl[] =
+{
+ "AE_CTRL_RETURN_VALUE",
+ "AE_CTRL_PENDING",
+ "AE_CTRL_TERMINATE",
+ "AE_CTRL_TRUE",
+ "AE_CTRL_FALSE",
+ "AE_CTRL_DEPTH",
+ "AE_CTRL_END",
+ "AE_CTRL_TRANSFER",
+ "AE_CTRL_BREAK",
+ "AE_CTRL_CONTINUE",
+ "AE_CTRL_SKIP",
+ "AE_CTRL_PARSE_CONTINUE",
+ "AE_CTRL_PARSE_PENDING"
+};
+
+#endif /* ACPI GLOBALS */
+
+#endif /* __ACEXCEP_H__ */
diff --git a/sys/contrib/dev/acpica/acfreebsd.h b/sys/contrib/dev/acpica/acfreebsd.h
new file mode 100644
index 0000000..bc22ba2
--- /dev/null
+++ b/sys/contrib/dev/acpica/acfreebsd.h
@@ -0,0 +1,201 @@
+/******************************************************************************
+ *
+ * Name: acfreebsd.h - OS specific defines, etc.
+ * $Revision: 1.25 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACFREEBSD_H__
+#define __ACFREEBSD_H__
+
+
+/* FreeBSD uses GCC */
+
+#include <contrib/dev/acpica/acgcc.h>
+#include <sys/types.h>
+#include <machine/acpica_machdep.h>
+
+#define ACPI_THREAD_ID pid_t
+#define ACPI_UINTPTR_T uintptr_t
+#define ACPI_USE_LOCAL_CACHE
+#define __cdecl
+
+#ifdef _KERNEL
+#include "opt_acpi.h"
+#endif
+
+#ifdef ACPI_DEBUG
+#define ACPI_DEBUG_OUTPUT /* for backward compatibility */
+#define ACPI_DISASSEMBLER
+#endif
+
+#ifdef _KERNEL
+#include <sys/ctype.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/libkern.h>
+#include <machine/stdarg.h>
+
+#ifdef DEBUGGER_THREADING
+#undef DEBUGGER_THREADING
+#endif /* DEBUGGER_THREADING */
+
+#define DEBUGGER_THREADING 0 /* integrated with DDB */
+
+#ifdef ACPI_DEBUG_OUTPUT
+#include "opt_ddb.h"
+#ifdef DDB
+#define ACPI_DEBUGGER
+#endif /* DDB */
+#endif /* ACPI_DEBUG_OUTPUT */
+
+#else /* _KERNEL */
+
+/* Not building kernel code, so use libc */
+#define ACPI_USE_STANDARD_HEADERS
+#define ACPI_FLUSH_CPU_CACHE()
+
+#if __STDC_HOSTED__
+#include <ctype.h>
+#endif
+
+#define __cli()
+#define __sti()
+
+#endif /* _KERNEL */
+
+/* Always use FreeBSD code over our local versions */
+#define ACPI_USE_SYSTEM_CLIBRARY
+
+#if defined(_KERNEL) && (__FreeBSD_version < 700020)
+/* Or strstr (used in debugging mode, also move to libkern) */
+static __inline char *
+strstr (char *s, char *find)
+{
+ char c, sc;
+ size_t len;
+
+ if ((c = *find++) != 0) {
+ len = strlen (find);
+ do {
+ do {
+ if ((sc = *s++) == 0)
+ return (NULL);
+ } while (sc != c);
+ } while (strncmp (s, find, len) != 0);
+ s--;
+ }
+ return ((char *) s);
+}
+#endif /* _KERNEL */
+
+#endif /* __ACFREEBSD_H__ */
diff --git a/sys/contrib/dev/acpica/acgcc.h b/sys/contrib/dev/acpica/acgcc.h
new file mode 100644
index 0000000..28576b1
--- /dev/null
+++ b/sys/contrib/dev/acpica/acgcc.h
@@ -0,0 +1,139 @@
+/******************************************************************************
+ *
+ * Name: acgcc.h - GCC specific defines, etc.
+ * $Revision: 1.32 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACGCC_H__
+#define __ACGCC_H__
+
+/* Function name is used for debug output. Non-ANSI, compiler-dependent */
+
+#define ACPI_GET_FUNCTION_NAME __FUNCTION__
+
+/*
+ * This macro is used to tag functions as "printf-like" because
+ * some compilers (like GCC) can catch printf format string problems.
+ */
+#define ACPI_PRINTF_LIKE(c) __attribute__ ((__format__ (__printf__, c, c+1)))
+
+/*
+ * Some compilers complain about unused variables. Sometimes we don't want to
+ * use all the variables (for example, _AcpiModuleName). This allows us
+ * to to tell the compiler warning in a per-variable manner that a variable
+ * is unused.
+ */
+#define ACPI_UNUSED_VAR __attribute__ ((unused))
+
+
+#endif /* __ACGCC_H__ */
diff --git a/sys/contrib/dev/acpica/acglobal.h b/sys/contrib/dev/acpica/acglobal.h
new file mode 100644
index 0000000..1e13733
--- /dev/null
+++ b/sys/contrib/dev/acpica/acglobal.h
@@ -0,0 +1,472 @@
+/******************************************************************************
+ *
+ * Name: acglobal.h - Declarations for global variables
+ * $Revision: 1.194 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACGLOBAL_H__
+#define __ACGLOBAL_H__
+
+
+/*
+ * Ensure that the globals are actually defined and initialized only once.
+ *
+ * The use of these macros allows a single list of globals (here) in order
+ * to simplify maintenance of the code.
+ */
+#ifdef DEFINE_ACPI_GLOBALS
+#define ACPI_EXTERN
+#define ACPI_INIT_GLOBAL(a,b) a=b
+#else
+#define ACPI_EXTERN extern
+#define ACPI_INIT_GLOBAL(a,b) a
+#endif
+
+
+/*****************************************************************************
+ *
+ * Runtime configuration (static defaults that can be overriden at runtime)
+ *
+ ****************************************************************************/
+
+/*
+ * Enable "slack" in the AML interpreter? Default is FALSE, and the
+ * interpreter strictly follows the ACPI specification. Setting to TRUE
+ * allows the interpreter to ignore certain errors and/or bad AML constructs.
+ *
+ * Currently, these features are enabled by this flag:
+ *
+ * 1) Allow "implicit return" of last value in a control method
+ * 2) Allow access beyond the end of an operation region
+ * 3) Allow access to uninitialized locals/args (auto-init to integer 0)
+ * 4) Allow ANY object type to be a source operand for the Store() operator
+ * 5) Allow unresolved references (invalid target name) in package objects
+ * 6) Enable warning messages for behavior that is not ACPI spec compliant
+ */
+ACPI_EXTERN UINT8 ACPI_INIT_GLOBAL (AcpiGbl_EnableInterpreterSlack, FALSE);
+
+/*
+ * Automatically serialize ALL control methods? Default is FALSE, meaning
+ * to use the Serialized/NotSerialized method flags on a per method basis.
+ * Only change this if the ASL code is poorly written and cannot handle
+ * reentrancy even though methods are marked "NotSerialized".
+ */
+ACPI_EXTERN UINT8 ACPI_INIT_GLOBAL (AcpiGbl_AllMethodsSerialized, FALSE);
+
+/*
+ * Create the predefined _OSI method in the namespace? Default is TRUE
+ * because ACPI CA is fully compatible with other ACPI implementations.
+ * Changing this will revert ACPI CA (and machine ASL) to pre-OSI behavior.
+ */
+ACPI_EXTERN UINT8 ACPI_INIT_GLOBAL (AcpiGbl_CreateOsiMethod, TRUE);
+
+/*
+ * Disable wakeup GPEs during runtime? Default is TRUE because WAKE and
+ * RUNTIME GPEs should never be shared, and WAKE GPEs should typically only
+ * be enabled just before going to sleep.
+ */
+ACPI_EXTERN UINT8 ACPI_INIT_GLOBAL (AcpiGbl_LeaveWakeGpesDisabled, TRUE);
+
+
+/*****************************************************************************
+ *
+ * ACPI Table globals
+ *
+ ****************************************************************************/
+
+/*
+ * AcpiGbl_RootTableList is the master list of ACPI tables found in the
+ * RSDT/XSDT.
+ *
+ * AcpiGbl_FADT is a local copy of the FADT, converted to a common format.
+ */
+ACPI_EXTERN ACPI_INTERNAL_RSDT AcpiGbl_RootTableList;
+ACPI_EXTERN ACPI_TABLE_FADT AcpiGbl_FADT;
+
+/* These addresses are calculated from FADT address values */
+
+ACPI_EXTERN ACPI_GENERIC_ADDRESS AcpiGbl_XPm1aEnable;
+ACPI_EXTERN ACPI_GENERIC_ADDRESS AcpiGbl_XPm1bEnable;
+
+/*
+ * Handle both ACPI 1.0 and ACPI 2.0 Integer widths. The integer width is
+ * determined by the revision of the DSDT: If the DSDT revision is less than
+ * 2, use only the lower 32 bits of the internal 64-bit Integer.
+ */
+ACPI_EXTERN UINT8 AcpiGbl_IntegerBitWidth;
+ACPI_EXTERN UINT8 AcpiGbl_IntegerByteWidth;
+ACPI_EXTERN UINT8 AcpiGbl_IntegerNybbleWidth;
+
+
+/*****************************************************************************
+ *
+ * Mutual exlusion within ACPICA subsystem
+ *
+ ****************************************************************************/
+
+/*
+ * Predefined mutex objects. This array contains the
+ * actual OS mutex handles, indexed by the local ACPI_MUTEX_HANDLEs.
+ * (The table maps local handles to the real OS handles)
+ */
+ACPI_EXTERN ACPI_MUTEX_INFO AcpiGbl_MutexInfo[ACPI_NUM_MUTEX];
+
+/*
+ * Global lock mutex is an actual AML mutex object
+ * Global lock semaphore works in conjunction with the HW global lock
+ */
+ACPI_EXTERN ACPI_OPERAND_OBJECT *AcpiGbl_GlobalLockMutex;
+ACPI_EXTERN ACPI_SEMAPHORE AcpiGbl_GlobalLockSemaphore;
+ACPI_EXTERN UINT16 AcpiGbl_GlobalLockHandle;
+ACPI_EXTERN BOOLEAN AcpiGbl_GlobalLockAcquired;
+ACPI_EXTERN BOOLEAN AcpiGbl_GlobalLockPresent;
+
+/*
+ * Spinlocks are used for interfaces that can be possibly called at
+ * interrupt level
+ */
+ACPI_EXTERN ACPI_SPINLOCK AcpiGbl_GpeLock; /* For GPE data structs and registers */
+ACPI_EXTERN ACPI_SPINLOCK AcpiGbl_HardwareLock; /* For ACPI H/W except GPE registers */
+
+
+/*****************************************************************************
+ *
+ * Miscellaneous globals
+ *
+ ****************************************************************************/
+
+/* Object caches */
+
+ACPI_EXTERN ACPI_CACHE_T *AcpiGbl_NamespaceCache;
+ACPI_EXTERN ACPI_CACHE_T *AcpiGbl_StateCache;
+ACPI_EXTERN ACPI_CACHE_T *AcpiGbl_PsNodeCache;
+ACPI_EXTERN ACPI_CACHE_T *AcpiGbl_PsNodeExtCache;
+ACPI_EXTERN ACPI_CACHE_T *AcpiGbl_OperandCache;
+
+/* Global handlers */
+
+ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER AcpiGbl_DeviceNotify;
+ACPI_EXTERN ACPI_OBJECT_NOTIFY_HANDLER AcpiGbl_SystemNotify;
+ACPI_EXTERN ACPI_EXCEPTION_HANDLER AcpiGbl_ExceptionHandler;
+ACPI_EXTERN ACPI_INIT_HANDLER AcpiGbl_InitHandler;
+ACPI_EXTERN ACPI_WALK_STATE *AcpiGbl_BreakpointWalk;
+
+/* Owner ID support */
+
+ACPI_EXTERN UINT32 AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS];
+ACPI_EXTERN UINT8 AcpiGbl_LastOwnerIdIndex;
+ACPI_EXTERN UINT8 AcpiGbl_NextOwnerIdOffset;
+
+/* Misc */
+
+ACPI_EXTERN UINT32 AcpiGbl_OriginalMode;
+ACPI_EXTERN UINT32 AcpiGbl_RsdpOriginalLocation;
+ACPI_EXTERN UINT32 AcpiGbl_NsLookupCount;
+ACPI_EXTERN UINT32 AcpiGbl_PsFindCount;
+ACPI_EXTERN UINT16 AcpiGbl_Pm1EnableRegisterSave;
+ACPI_EXTERN UINT8 AcpiGbl_DebuggerConfiguration;
+ACPI_EXTERN BOOLEAN AcpiGbl_StepToNextCall;
+ACPI_EXTERN BOOLEAN AcpiGbl_AcpiHardwarePresent;
+ACPI_EXTERN BOOLEAN AcpiGbl_EventsInitialized;
+ACPI_EXTERN BOOLEAN AcpiGbl_SystemAwakeAndRunning;
+
+
+#ifndef DEFINE_ACPI_GLOBALS
+
+/* Exception codes */
+
+extern char const *AcpiGbl_ExceptionNames_Env[];
+extern char const *AcpiGbl_ExceptionNames_Pgm[];
+extern char const *AcpiGbl_ExceptionNames_Tbl[];
+extern char const *AcpiGbl_ExceptionNames_Aml[];
+extern char const *AcpiGbl_ExceptionNames_Ctrl[];
+
+/* Other miscellaneous */
+
+extern BOOLEAN AcpiGbl_Shutdown;
+extern UINT32 AcpiGbl_StartupFlags;
+extern const char *AcpiGbl_SleepStateNames[ACPI_S_STATE_COUNT];
+extern const char *AcpiGbl_HighestDstateNames[4];
+extern const ACPI_OPCODE_INFO AcpiGbl_AmlOpInfo[AML_NUM_OPCODES];
+extern const char *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS];
+#endif
+
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+
+/* Lists for tracking memory allocations */
+
+ACPI_EXTERN ACPI_MEMORY_LIST *AcpiGbl_GlobalList;
+ACPI_EXTERN ACPI_MEMORY_LIST *AcpiGbl_NsNodeList;
+ACPI_EXTERN BOOLEAN AcpiGbl_DisplayFinalMemStats;
+#endif
+
+
+/*****************************************************************************
+ *
+ * Namespace globals
+ *
+ ****************************************************************************/
+
+#define NUM_NS_TYPES ACPI_TYPE_INVALID+1
+
+#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
+#define NUM_PREDEFINED_NAMES 10
+#else
+#define NUM_PREDEFINED_NAMES 9
+#endif
+
+ACPI_EXTERN ACPI_NAMESPACE_NODE AcpiGbl_RootNodeStruct;
+ACPI_EXTERN ACPI_NAMESPACE_NODE *AcpiGbl_RootNode;
+ACPI_EXTERN ACPI_NAMESPACE_NODE *AcpiGbl_FadtGpeDevice;
+
+extern const UINT8 AcpiGbl_NsProperties[NUM_NS_TYPES];
+extern const ACPI_PREDEFINED_NAMES AcpiGbl_PreDefinedNames [NUM_PREDEFINED_NAMES];
+
+#ifdef ACPI_DEBUG_OUTPUT
+ACPI_EXTERN UINT32 AcpiGbl_CurrentNodeCount;
+ACPI_EXTERN UINT32 AcpiGbl_CurrentNodeSize;
+ACPI_EXTERN UINT32 AcpiGbl_MaxConcurrentNodeCount;
+ACPI_EXTERN ACPI_SIZE AcpiGbl_EntryStackPointer;
+ACPI_EXTERN ACPI_SIZE AcpiGbl_LowestStackPointer;
+ACPI_EXTERN UINT32 AcpiGbl_DeepestNesting;
+#endif
+
+
+/*****************************************************************************
+ *
+ * Interpreter globals
+ *
+ ****************************************************************************/
+
+
+ACPI_EXTERN ACPI_THREAD_STATE *AcpiGbl_CurrentWalkList;
+
+/* Control method single step flag */
+
+ACPI_EXTERN UINT8 AcpiGbl_CmSingleStep;
+
+
+/*****************************************************************************
+ *
+ * Hardware globals
+ *
+ ****************************************************************************/
+
+extern ACPI_BIT_REGISTER_INFO AcpiGbl_BitRegisterInfo[ACPI_NUM_BITREG];
+ACPI_EXTERN UINT8 AcpiGbl_SleepTypeA;
+ACPI_EXTERN UINT8 AcpiGbl_SleepTypeB;
+
+
+/*****************************************************************************
+ *
+ * Event and GPE globals
+ *
+ ****************************************************************************/
+
+extern ACPI_FIXED_EVENT_INFO AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EVENTS];
+ACPI_EXTERN ACPI_FIXED_EVENT_HANDLER AcpiGbl_FixedEventHandlers[ACPI_NUM_FIXED_EVENTS];
+ACPI_EXTERN ACPI_GPE_XRUPT_INFO *AcpiGbl_GpeXruptListHead;
+ACPI_EXTERN ACPI_GPE_BLOCK_INFO *AcpiGbl_GpeFadtBlocks[ACPI_MAX_GPE_BLOCKS];
+
+
+/*****************************************************************************
+ *
+ * Debug support
+ *
+ ****************************************************************************/
+
+/* Runtime configuration of debug print levels */
+
+extern UINT32 AcpiDbgLevel;
+extern UINT32 AcpiDbgLayer;
+
+/* Procedure nesting level for debug output */
+
+extern UINT32 AcpiGbl_NestingLevel;
+
+/* Event counters */
+
+ACPI_EXTERN UINT32 AcpiGpeCount;
+
+/* Support for dynamic control method tracing mechanism */
+
+ACPI_EXTERN UINT32 AcpiGbl_OriginalDbgLevel;
+ACPI_EXTERN UINT32 AcpiGbl_OriginalDbgLayer;
+ACPI_EXTERN ACPI_NAME AcpiGbl_TraceMethodName;
+ACPI_EXTERN UINT32 AcpiGbl_TraceDbgLevel;
+ACPI_EXTERN UINT32 AcpiGbl_TraceDbgLayer;
+ACPI_EXTERN UINT32 AcpiGbl_TraceFlags;
+
+
+/*****************************************************************************
+ *
+ * Debugger globals
+ *
+ ****************************************************************************/
+
+ACPI_EXTERN UINT8 AcpiGbl_DbOutputFlags;
+
+#ifdef ACPI_DISASSEMBLER
+
+ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_disasm;
+ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_verbose;
+#endif
+
+
+#ifdef ACPI_DEBUGGER
+
+extern BOOLEAN AcpiGbl_MethodExecuting;
+extern BOOLEAN AcpiGbl_AbortMethod;
+extern BOOLEAN AcpiGbl_DbTerminateThreads;
+
+ACPI_EXTERN int optind;
+ACPI_EXTERN char *optarg;
+
+ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_tables;
+ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_stats;
+ACPI_EXTERN BOOLEAN AcpiGbl_DbOpt_ini_methods;
+
+
+ACPI_EXTERN char *AcpiGbl_DbArgs[ACPI_DEBUGGER_MAX_ARGS];
+ACPI_EXTERN char AcpiGbl_DbLineBuf[80];
+ACPI_EXTERN char AcpiGbl_DbParsedBuf[80];
+ACPI_EXTERN char AcpiGbl_DbScopeBuf[40];
+ACPI_EXTERN char AcpiGbl_DbDebugFilename[40];
+ACPI_EXTERN BOOLEAN AcpiGbl_DbOutputToFile;
+ACPI_EXTERN char *AcpiGbl_DbBuffer;
+ACPI_EXTERN char *AcpiGbl_DbFilename;
+ACPI_EXTERN UINT32 AcpiGbl_DbDebugLevel;
+ACPI_EXTERN UINT32 AcpiGbl_DbConsoleDebugLevel;
+ACPI_EXTERN ACPI_TABLE_HEADER *AcpiGbl_DbTablePtr;
+ACPI_EXTERN ACPI_NAMESPACE_NODE *AcpiGbl_DbScopeNode;
+
+/*
+ * Statistic globals
+ */
+ACPI_EXTERN UINT16 AcpiGbl_ObjTypeCount[ACPI_TYPE_NS_NODE_MAX+1];
+ACPI_EXTERN UINT16 AcpiGbl_NodeTypeCount[ACPI_TYPE_NS_NODE_MAX+1];
+ACPI_EXTERN UINT16 AcpiGbl_ObjTypeCountMisc;
+ACPI_EXTERN UINT16 AcpiGbl_NodeTypeCountMisc;
+ACPI_EXTERN UINT32 AcpiGbl_NumNodes;
+ACPI_EXTERN UINT32 AcpiGbl_NumObjects;
+
+
+ACPI_EXTERN UINT32 AcpiGbl_SizeOfParseTree;
+ACPI_EXTERN UINT32 AcpiGbl_SizeOfMethodTrees;
+ACPI_EXTERN UINT32 AcpiGbl_SizeOfNodeEntries;
+ACPI_EXTERN UINT32 AcpiGbl_SizeOfAcpiObjects;
+
+#endif /* ACPI_DEBUGGER */
+
+#endif /* __ACGLOBAL_H__ */
diff --git a/sys/contrib/dev/acpica/achware.h b/sys/contrib/dev/acpica/achware.h
new file mode 100644
index 0000000..e132ec6
--- /dev/null
+++ b/sys/contrib/dev/acpica/achware.h
@@ -0,0 +1,247 @@
+/******************************************************************************
+ *
+ * Name: achware.h -- hardware specific interfaces
+ * $Revision: 1.83 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACHWARE_H__
+#define __ACHWARE_H__
+
+
+/* PM Timer ticks per second (HZ) */
+
+#define PM_TIMER_FREQUENCY 3579545
+
+/* Values for the _SST reserved method */
+
+#define ACPI_SST_INDICATOR_OFF 0
+#define ACPI_SST_WORKING 1
+#define ACPI_SST_WAKING 2
+#define ACPI_SST_SLEEPING 3
+#define ACPI_SST_SLEEP_CONTEXT 4
+
+
+/* Prototypes */
+
+
+/*
+ * hwacpi - high level functions
+ */
+ACPI_STATUS
+AcpiHwSetMode (
+ UINT32 Mode);
+
+UINT32
+AcpiHwGetMode (
+ void);
+
+
+/*
+ * hwregs - ACPI Register I/O
+ */
+ACPI_BIT_REGISTER_INFO *
+AcpiHwGetBitRegisterInfo (
+ UINT32 RegisterId);
+
+ACPI_STATUS
+AcpiHwRegisterRead (
+ BOOLEAN UseLock,
+ UINT32 RegisterId,
+ UINT32 *ReturnValue);
+
+ACPI_STATUS
+AcpiHwRegisterWrite (
+ BOOLEAN UseLock,
+ UINT32 RegisterId,
+ UINT32 Value);
+
+ACPI_STATUS
+AcpiHwLowLevelRead (
+ UINT32 Width,
+ UINT32 *Value,
+ ACPI_GENERIC_ADDRESS *Reg);
+
+ACPI_STATUS
+AcpiHwLowLevelWrite (
+ UINT32 Width,
+ UINT32 Value,
+ ACPI_GENERIC_ADDRESS *Reg);
+
+ACPI_STATUS
+AcpiHwClearAcpiStatus (
+ void);
+
+
+/*
+ * hwgpe - GPE support
+ */
+ACPI_STATUS
+AcpiHwWriteGpeEnableReg (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo);
+
+ACPI_STATUS
+AcpiHwDisableGpeBlock (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock);
+
+ACPI_STATUS
+AcpiHwClearGpe (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo);
+
+ACPI_STATUS
+AcpiHwClearGpeBlock (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock);
+
+ACPI_STATUS
+AcpiHwGetGpeStatus (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo,
+ ACPI_EVENT_STATUS *EventStatus);
+
+ACPI_STATUS
+AcpiHwDisableAllGpes (
+ void);
+
+ACPI_STATUS
+AcpiHwEnableAllRuntimeGpes (
+ void);
+
+ACPI_STATUS
+AcpiHwEnableAllWakeupGpes (
+ void);
+
+ACPI_STATUS
+AcpiHwEnableRuntimeGpeBlock (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock);
+
+
+/*
+ * hwtimer - ACPI Timer prototypes
+ */
+ACPI_STATUS
+AcpiGetTimerResolution (
+ UINT32 *Resolution);
+
+ACPI_STATUS
+AcpiGetTimer (
+ UINT32 *Ticks);
+
+ACPI_STATUS
+AcpiGetTimerDuration (
+ UINT32 StartTicks,
+ UINT32 EndTicks,
+ UINT32 *TimeElapsed);
+
+
+#endif /* __ACHWARE_H__ */
diff --git a/sys/contrib/dev/acpica/acinterp.h b/sys/contrib/dev/acpica/acinterp.h
new file mode 100644
index 0000000..367266c
--- /dev/null
+++ b/sys/contrib/dev/acpica/acinterp.h
@@ -0,0 +1,793 @@
+/******************************************************************************
+ *
+ * Name: acinterp.h - Interpreter subcomponent prototypes and defines
+ * $Revision: 1.171 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACINTERP_H__
+#define __ACINTERP_H__
+
+
+#define ACPI_WALK_OPERANDS (&(WalkState->Operands [WalkState->NumOperands -1]))
+
+/* Macros for tables used for debug output */
+
+#define ACPI_EXD_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_OPERAND_OBJECT,f)
+#define ACPI_EXD_NSOFFSET(f) (UINT8) ACPI_OFFSET (ACPI_NAMESPACE_NODE,f)
+#define ACPI_EXD_TABLE_SIZE(name) (sizeof(name) / sizeof (ACPI_EXDUMP_INFO))
+
+/*
+ * If possible, pack the following structures to byte alignment, since we
+ * don't care about performance for debug output. Two cases where we cannot
+ * pack the structures:
+ *
+ * 1) Hardware does not support misaligned memory transfers
+ * 2) Compiler does not support pointers within packed structures
+ */
+#if (!defined(ACPI_MISALIGNMENT_NOT_SUPPORTED) && !defined(ACPI_PACKED_POINTERS_NOT_SUPPORTED))
+#pragma pack(1)
+#endif
+
+typedef const struct acpi_exdump_info
+{
+ UINT8 Opcode;
+ UINT8 Offset;
+ char *Name;
+
+} ACPI_EXDUMP_INFO;
+
+/* Values for the Opcode field above */
+
+#define ACPI_EXD_INIT 0
+#define ACPI_EXD_TYPE 1
+#define ACPI_EXD_UINT8 2
+#define ACPI_EXD_UINT16 3
+#define ACPI_EXD_UINT32 4
+#define ACPI_EXD_UINT64 5
+#define ACPI_EXD_LITERAL 6
+#define ACPI_EXD_POINTER 7
+#define ACPI_EXD_ADDRESS 8
+#define ACPI_EXD_STRING 9
+#define ACPI_EXD_BUFFER 10
+#define ACPI_EXD_PACKAGE 11
+#define ACPI_EXD_FIELD 12
+#define ACPI_EXD_REFERENCE 13
+
+/* restore default alignment */
+
+#pragma pack()
+
+
+/*
+ * exconvrt - object conversion
+ */
+ACPI_STATUS
+AcpiExConvertToInteger (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc,
+ UINT32 Flags);
+
+ACPI_STATUS
+AcpiExConvertToBuffer (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc);
+
+ACPI_STATUS
+AcpiExConvertToString (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc,
+ UINT32 Type);
+
+/* Types for ->String conversion */
+
+#define ACPI_EXPLICIT_BYTE_COPY 0x00000000
+#define ACPI_EXPLICIT_CONVERT_HEX 0x00000001
+#define ACPI_IMPLICIT_CONVERT_HEX 0x00000002
+#define ACPI_EXPLICIT_CONVERT_DECIMAL 0x00000003
+
+ACPI_STATUS
+AcpiExConvertToTargetType (
+ ACPI_OBJECT_TYPE DestinationType,
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * exfield - ACPI AML (p-code) execution - field manipulation
+ */
+ACPI_STATUS
+AcpiExCommonBufferSetup (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 BufferLength,
+ UINT32 *DatumCount);
+
+ACPI_STATUS
+AcpiExWriteWithUpdateRule (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_INTEGER Mask,
+ ACPI_INTEGER FieldValue,
+ UINT32 FieldDatumByteOffset);
+
+void
+AcpiExGetBufferDatum(
+ ACPI_INTEGER *Datum,
+ void *Buffer,
+ UINT32 BufferLength,
+ UINT32 ByteGranularity,
+ UINT32 BufferOffset);
+
+void
+AcpiExSetBufferDatum (
+ ACPI_INTEGER MergedDatum,
+ void *Buffer,
+ UINT32 BufferLength,
+ UINT32 ByteGranularity,
+ UINT32 BufferOffset);
+
+ACPI_STATUS
+AcpiExReadDataFromField (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **RetBufferDesc);
+
+ACPI_STATUS
+AcpiExWriteDataToField (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc);
+
+
+/*
+ * exfldio - low level field I/O
+ */
+ACPI_STATUS
+AcpiExExtractFromField (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ void *Buffer,
+ UINT32 BufferLength);
+
+ACPI_STATUS
+AcpiExInsertIntoField (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ void *Buffer,
+ UINT32 BufferLength);
+
+ACPI_STATUS
+AcpiExAccessRegion (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 FieldDatumByteOffset,
+ ACPI_INTEGER *Value,
+ UINT32 ReadWrite);
+
+
+/*
+ * exmisc - misc support routines
+ */
+ACPI_STATUS
+AcpiExGetObjectReference (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ReturnDesc,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExConcatTemplate (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT *ObjDesc2,
+ ACPI_OPERAND_OBJECT **ActualReturnDesc,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExDoConcatenate (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT *ObjDesc2,
+ ACPI_OPERAND_OBJECT **ActualReturnDesc,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExDoLogicalNumericOp (
+ UINT16 Opcode,
+ ACPI_INTEGER Integer0,
+ ACPI_INTEGER Integer1,
+ BOOLEAN *LogicalResult);
+
+ACPI_STATUS
+AcpiExDoLogicalOp (
+ UINT16 Opcode,
+ ACPI_OPERAND_OBJECT *Operand0,
+ ACPI_OPERAND_OBJECT *Operand1,
+ BOOLEAN *LogicalResult);
+
+ACPI_INTEGER
+AcpiExDoMathOp (
+ UINT16 Opcode,
+ ACPI_INTEGER Operand0,
+ ACPI_INTEGER Operand1);
+
+ACPI_STATUS
+AcpiExCreateMutex (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExCreateProcessor (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExCreatePowerResource (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExCreateRegion (
+ UINT8 *AmlStart,
+ UINT32 AmlLength,
+ UINT8 RegionSpace,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExCreateTableRegion (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExCreateEvent (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExCreateAlias (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExCreateMethod (
+ UINT8 *AmlStart,
+ UINT32 AmlLength,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * exconfig - dynamic table load/unload
+ */
+ACPI_STATUS
+AcpiExLoadOp (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT *Target,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExLoadTableOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT **ReturnDesc);
+
+ACPI_STATUS
+AcpiExUnloadTable (
+ ACPI_OPERAND_OBJECT *DdbHandle);
+
+
+/*
+ * exmutex - mutex support
+ */
+ACPI_STATUS
+AcpiExAcquireMutex (
+ ACPI_OPERAND_OBJECT *TimeDesc,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExAcquireMutexObject (
+ UINT16 Timeout,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_THREAD_ID ThreadId);
+
+ACPI_STATUS
+AcpiExReleaseMutex (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExReleaseMutexObject (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+void
+AcpiExReleaseAllMutexes (
+ ACPI_THREAD_STATE *Thread);
+
+void
+AcpiExUnlinkMutex (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+
+/*
+ * exprep - ACPI AML execution - prep utilities
+ */
+ACPI_STATUS
+AcpiExPrepCommonFieldObject (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT8 FieldFlags,
+ UINT8 FieldAttribute,
+ UINT32 FieldBitPosition,
+ UINT32 FieldBitLength);
+
+ACPI_STATUS
+AcpiExPrepFieldValue (
+ ACPI_CREATE_FIELD_INFO *Info);
+
+
+/*
+ * exsystem - Interface to OS services
+ */
+ACPI_STATUS
+AcpiExSystemDoNotifyOp (
+ ACPI_OPERAND_OBJECT *Value,
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+ACPI_STATUS
+AcpiExSystemDoSuspend(
+ ACPI_INTEGER Time);
+
+ACPI_STATUS
+AcpiExSystemDoStall (
+ UINT32 Time);
+
+ACPI_STATUS
+AcpiExSystemSignalEvent(
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+ACPI_STATUS
+AcpiExSystemWaitEvent(
+ ACPI_OPERAND_OBJECT *Time,
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+ACPI_STATUS
+AcpiExSystemResetEvent(
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+ACPI_STATUS
+AcpiExSystemWaitSemaphore (
+ ACPI_SEMAPHORE Semaphore,
+ UINT16 Timeout);
+
+ACPI_STATUS
+AcpiExSystemWaitMutex (
+ ACPI_MUTEX Mutex,
+ UINT16 Timeout);
+
+/*
+ * exoparg1 - ACPI AML execution, 1 operand
+ */
+ACPI_STATUS
+AcpiExOpcode_0A_0T_1R (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExOpcode_1A_0T_0R (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExOpcode_1A_0T_1R (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExOpcode_1A_1T_1R (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExOpcode_1A_1T_0R (
+ ACPI_WALK_STATE *WalkState);
+
+/*
+ * exoparg2 - ACPI AML execution, 2 operands
+ */
+ACPI_STATUS
+AcpiExOpcode_2A_0T_0R (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExOpcode_2A_0T_1R (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExOpcode_2A_1T_1R (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExOpcode_2A_2T_1R (
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * exoparg3 - ACPI AML execution, 3 operands
+ */
+ACPI_STATUS
+AcpiExOpcode_3A_0T_0R (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExOpcode_3A_1T_1R (
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * exoparg6 - ACPI AML execution, 6 operands
+ */
+ACPI_STATUS
+AcpiExOpcode_6A_0T_1R (
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * exresolv - Object resolution and get value functions
+ */
+ACPI_STATUS
+AcpiExResolveToValue (
+ ACPI_OPERAND_OBJECT **StackPtr,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExResolveMultiple (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT *Operand,
+ ACPI_OBJECT_TYPE *ReturnType,
+ ACPI_OPERAND_OBJECT **ReturnDesc);
+
+
+/*
+ * exresnte - resolve namespace node
+ */
+ACPI_STATUS
+AcpiExResolveNodeToValue (
+ ACPI_NAMESPACE_NODE **StackPtr,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * exresop - resolve operand to value
+ */
+ACPI_STATUS
+AcpiExResolveOperands (
+ UINT16 Opcode,
+ ACPI_OPERAND_OBJECT **StackPtr,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * exdump - Interpreter debug output routines
+ */
+void
+AcpiExDumpOperand (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 Depth);
+
+void
+AcpiExDumpOperands (
+ ACPI_OPERAND_OBJECT **Operands,
+ ACPI_INTERPRETER_MODE InterpreterMode,
+ char *Ident,
+ UINT32 NumLevels,
+ char *Note,
+ char *ModuleName,
+ UINT32 LineNumber);
+
+void
+AcpiExDumpObjectDescriptor (
+ ACPI_OPERAND_OBJECT *Object,
+ UINT32 Flags);
+
+void
+AcpiExDumpNamespaceNode (
+ ACPI_NAMESPACE_NODE *Node,
+ UINT32 Flags);
+
+
+/*
+ * exnames - AML namestring support
+ */
+ACPI_STATUS
+AcpiExGetNameString (
+ ACPI_OBJECT_TYPE DataType,
+ UINT8 *InAmlAddress,
+ char **OutNameString,
+ UINT32 *OutNameLength);
+
+
+/*
+ * exstore - Object store support
+ */
+ACPI_STATUS
+AcpiExStore (
+ ACPI_OPERAND_OBJECT *ValDesc,
+ ACPI_OPERAND_OBJECT *DestDesc,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExStoreObjectToNode (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_WALK_STATE *WalkState,
+ UINT8 ImplicitConversion);
+
+#define ACPI_IMPLICIT_CONVERSION TRUE
+#define ACPI_NO_IMPLICIT_CONVERSION FALSE
+
+
+/*
+ * exstoren - resolve/store object
+ */
+ACPI_STATUS
+AcpiExResolveObject (
+ ACPI_OPERAND_OBJECT **SourceDescPtr,
+ ACPI_OBJECT_TYPE TargetType,
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiExStoreObjectToObject (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *DestDesc,
+ ACPI_OPERAND_OBJECT **NewDesc,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * exstorob - store object - buffer/string
+ */
+ACPI_STATUS
+AcpiExStoreBufferToBuffer (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *TargetDesc);
+
+ACPI_STATUS
+AcpiExStoreStringToString (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *TargetDesc);
+
+
+/*
+ * excopy - object copy
+ */
+ACPI_STATUS
+AcpiExCopyIntegerToIndexField (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *TargetDesc);
+
+ACPI_STATUS
+AcpiExCopyIntegerToBankField (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *TargetDesc);
+
+ACPI_STATUS
+AcpiExCopyDataToNamedField (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_NAMESPACE_NODE *Node);
+
+ACPI_STATUS
+AcpiExCopyIntegerToBufferField (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *TargetDesc);
+
+
+/*
+ * exutils - interpreter/scanner utilities
+ */
+void
+AcpiExEnterInterpreter (
+ void);
+
+void
+AcpiExExitInterpreter (
+ void);
+
+void
+AcpiExReacquireInterpreter (
+ void);
+
+void
+AcpiExRelinquishInterpreter (
+ void);
+
+void
+AcpiExTruncateFor32bitTable (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+void
+AcpiExAcquireGlobalLock (
+ UINT32 Rule);
+
+void
+AcpiExReleaseGlobalLock (
+ UINT32 Rule);
+
+void
+AcpiExEisaIdToString (
+ UINT32 NumericId,
+ char *OutString);
+
+void
+AcpiExUnsignedIntegerToString (
+ ACPI_INTEGER Value,
+ char *OutString);
+
+
+/*
+ * exregion - default OpRegion handlers
+ */
+ACPI_STATUS
+AcpiExSystemMemorySpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext);
+
+ACPI_STATUS
+AcpiExSystemIoSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext);
+
+ACPI_STATUS
+AcpiExPciConfigSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext);
+
+ACPI_STATUS
+AcpiExCmosSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext);
+
+ACPI_STATUS
+AcpiExPciBarSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext);
+
+ACPI_STATUS
+AcpiExEmbeddedControllerSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext);
+
+ACPI_STATUS
+AcpiExSmBusSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext);
+
+
+ACPI_STATUS
+AcpiExDataTableSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext);
+
+#endif /* __INTERP_H__ */
diff --git a/sys/contrib/dev/acpica/aclocal.h b/sys/contrib/dev/acpica/aclocal.h
new file mode 100644
index 0000000..ba1145e
--- /dev/null
+++ b/sys/contrib/dev/acpica/aclocal.h
@@ -0,0 +1,1202 @@
+/******************************************************************************
+ *
+ * Name: aclocal.h - Internal data types used across the ACPI subsystem
+ * $Revision: 1.247 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACLOCAL_H__
+#define __ACLOCAL_H__
+
+/* acpisrc:StructDefs -- for acpisrc conversion */
+
+#define ACPI_WAIT_FOREVER 0xFFFF /* UINT16, as per ACPI spec */
+#define ACPI_DO_NOT_WAIT 0
+#define ACPI_SERIALIZED 0xFF
+
+typedef UINT32 ACPI_MUTEX_HANDLE;
+#define ACPI_GLOBAL_LOCK (ACPI_SEMAPHORE) (-1)
+
+/* Total number of aml opcodes defined */
+
+#define AML_NUM_OPCODES 0x7F
+
+
+/* Forward declarations */
+
+struct acpi_walk_state;
+struct acpi_obj_mutex;
+union acpi_parse_object;
+
+
+/*****************************************************************************
+ *
+ * Mutex typedefs and structs
+ *
+ ****************************************************************************/
+
+
+/*
+ * Predefined handles for the mutex objects used within the subsystem
+ * All mutex objects are automatically created by AcpiUtMutexInitialize.
+ *
+ * The acquire/release ordering protocol is implied via this list. Mutexes
+ * with a lower value must be acquired before mutexes with a higher value.
+ *
+ * NOTE: any changes here must be reflected in the AcpiGbl_MutexNames
+ * table below also!
+ */
+#define ACPI_MTX_INTERPRETER 0 /* AML Interpreter, main lock */
+#define ACPI_MTX_NAMESPACE 1 /* ACPI Namespace */
+#define ACPI_MTX_TABLES 2 /* Data for ACPI tables */
+#define ACPI_MTX_EVENTS 3 /* Data for ACPI events */
+#define ACPI_MTX_CACHES 4 /* Internal caches, general purposes */
+#define ACPI_MTX_MEMORY 5 /* Debug memory tracking lists */
+#define ACPI_MTX_DEBUG_CMD_COMPLETE 6 /* AML debugger */
+#define ACPI_MTX_DEBUG_CMD_READY 7 /* AML debugger */
+
+#define ACPI_MAX_MUTEX 7
+#define ACPI_NUM_MUTEX ACPI_MAX_MUTEX+1
+
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+#ifdef DEFINE_ACPI_GLOBALS
+
+/* Debug names for the mutexes above */
+
+static char *AcpiGbl_MutexNames[ACPI_NUM_MUTEX] =
+{
+ "ACPI_MTX_Interpreter",
+ "ACPI_MTX_Tables",
+ "ACPI_MTX_Namespace",
+ "ACPI_MTX_Events",
+ "ACPI_MTX_Caches",
+ "ACPI_MTX_Memory",
+ "ACPI_MTX_CommandComplete",
+ "ACPI_MTX_CommandReady"
+};
+
+#endif
+#endif
+
+
+/*
+ * Predefined handles for spinlocks used within the subsystem.
+ * These spinlocks are created by AcpiUtMutexInitialize
+ */
+#define ACPI_LOCK_GPES 0
+#define ACPI_LOCK_HARDWARE 1
+
+#define ACPI_MAX_LOCK 1
+#define ACPI_NUM_LOCK ACPI_MAX_LOCK+1
+
+
+/* Owner IDs are used to track namespace nodes for selective deletion */
+
+typedef UINT8 ACPI_OWNER_ID;
+#define ACPI_OWNER_ID_MAX 0xFF
+
+/* This Thread ID means that the mutex is not in use (unlocked) */
+
+#define ACPI_MUTEX_NOT_ACQUIRED (UINT32) -1
+
+/* Table for the global mutexes */
+
+typedef struct acpi_mutex_info
+{
+ ACPI_MUTEX Mutex;
+ UINT32 UseCount;
+ ACPI_THREAD_ID ThreadId;
+
+} ACPI_MUTEX_INFO;
+
+
+/* Lock flag parameter for various interfaces */
+
+#define ACPI_MTX_DO_NOT_LOCK 0
+#define ACPI_MTX_LOCK 1
+
+
+/* Field access granularities */
+
+#define ACPI_FIELD_BYTE_GRANULARITY 1
+#define ACPI_FIELD_WORD_GRANULARITY 2
+#define ACPI_FIELD_DWORD_GRANULARITY 4
+#define ACPI_FIELD_QWORD_GRANULARITY 8
+
+
+#define ACPI_ENTRY_NOT_FOUND NULL
+
+
+/*****************************************************************************
+ *
+ * Namespace typedefs and structs
+ *
+ ****************************************************************************/
+
+/* Operational modes of the AML interpreter/scanner */
+
+typedef enum
+{
+ ACPI_IMODE_LOAD_PASS1 = 0x01,
+ ACPI_IMODE_LOAD_PASS2 = 0x02,
+ ACPI_IMODE_EXECUTE = 0x03
+
+} ACPI_INTERPRETER_MODE;
+
+typedef union acpi_name_union
+{
+ UINT32 Integer;
+ char Ascii[4];
+
+} ACPI_NAME_UNION;
+
+
+/*
+ * The Namespace Node describes a named object that appears in the AML.
+ * DescriptorType is used to differentiate between internal descriptors.
+ *
+ * The node is optimized for both 32-bit and 64-bit platforms:
+ * 20 bytes for the 32-bit case, 32 bytes for the 64-bit case.
+ *
+ * Note: The DescriptorType and Type fields must appear in the identical
+ * position in both the ACPI_NAMESPACE_NODE and ACPI_OPERAND_OBJECT
+ * structures.
+ */
+typedef struct acpi_namespace_node
+{
+ union acpi_operand_object *Object; /* Interpreter object */
+ UINT8 DescriptorType; /* Differentiate object descriptor types */
+ UINT8 Type; /* ACPI Type associated with this name */
+ UINT8 Flags; /* Miscellaneous flags */
+ ACPI_OWNER_ID OwnerId; /* Node creator */
+ ACPI_NAME_UNION Name; /* ACPI Name, always 4 chars per ACPI spec */
+ struct acpi_namespace_node *Child; /* First child */
+ struct acpi_namespace_node *Peer; /* Peer. Parent if ANOBJ_END_OF_PEER_LIST set */
+
+ /*
+ * The following fields are used by the ASL compiler and disassembler only
+ */
+#ifdef ACPI_LARGE_NAMESPACE_NODE
+ union acpi_parse_object *Op;
+ UINT32 Value;
+ UINT32 Length;
+#endif
+
+} ACPI_NAMESPACE_NODE;
+
+
+/* Namespace Node flags */
+
+#define ANOBJ_END_OF_PEER_LIST 0x01 /* End-of-list, Peer field points to parent */
+#define ANOBJ_TEMPORARY 0x02 /* Node is create by a method and is temporary */
+#define ANOBJ_METHOD_ARG 0x04 /* Node is a method argument */
+#define ANOBJ_METHOD_LOCAL 0x08 /* Node is a method local */
+#define ANOBJ_SUBTREE_HAS_INI 0x10 /* Used to optimize device initialization */
+
+#define ANOBJ_IS_EXTERNAL 0x08 /* iASL only: This object created via External() */
+#define ANOBJ_METHOD_NO_RETVAL 0x10 /* iASL only: Method has no return value */
+#define ANOBJ_METHOD_SOME_NO_RETVAL 0x20 /* iASL only: Method has at least one return value */
+#define ANOBJ_IS_BIT_OFFSET 0x40 /* iASL only: Reference is a bit offset */
+#define ANOBJ_IS_REFERENCED 0x80 /* iASL only: Object was referenced */
+
+/*
+ * ACPI Table Descriptor. One per ACPI table
+ */
+typedef struct acpi_table_desc
+{
+ ACPI_PHYSICAL_ADDRESS Address;
+ ACPI_TABLE_HEADER *Pointer;
+ UINT32 Length; /* Length fixed at 32 bits */
+ ACPI_NAME_UNION Signature;
+ ACPI_OWNER_ID OwnerId;
+ UINT8 Flags;
+
+} ACPI_TABLE_DESC;
+
+/* Flags for above */
+
+#define ACPI_TABLE_ORIGIN_UNKNOWN (0)
+#define ACPI_TABLE_ORIGIN_MAPPED (1)
+#define ACPI_TABLE_ORIGIN_ALLOCATED (2)
+#define ACPI_TABLE_ORIGIN_MASK (3)
+#define ACPI_TABLE_IS_LOADED (4)
+
+/* One internal RSDT for table management */
+
+typedef struct acpi_internal_rsdt
+{
+ ACPI_TABLE_DESC *Tables;
+ UINT32 Count;
+ UINT32 Size;
+ UINT8 Flags;
+
+} ACPI_INTERNAL_RSDT;
+
+/* Flags for above */
+
+#define ACPI_ROOT_ORIGIN_UNKNOWN (0) /* ~ORIGIN_ALLOCATED */
+#define ACPI_ROOT_ORIGIN_ALLOCATED (1)
+#define ACPI_ROOT_ALLOW_RESIZE (2)
+
+
+/* Predefined (fixed) table indexes */
+
+#define ACPI_TABLE_INDEX_DSDT (0)
+#define ACPI_TABLE_INDEX_FACS (1)
+
+
+typedef struct acpi_find_context
+{
+ char *SearchFor;
+ ACPI_HANDLE *List;
+ UINT32 *Count;
+
+} ACPI_FIND_CONTEXT;
+
+
+typedef struct acpi_ns_search_data
+{
+ ACPI_NAMESPACE_NODE *Node;
+
+} ACPI_NS_SEARCH_DATA;
+
+
+/*
+ * Predefined Namespace items
+ */
+typedef struct acpi_predefined_names
+{
+ char *Name;
+ UINT8 Type;
+ char *Val;
+
+} ACPI_PREDEFINED_NAMES;
+
+
+/* Object types used during package copies */
+
+#define ACPI_COPY_TYPE_SIMPLE 0
+#define ACPI_COPY_TYPE_PACKAGE 1
+
+
+/* Info structure used to convert external<->internal namestrings */
+
+typedef struct acpi_namestring_info
+{
+ char *ExternalName;
+ char *NextExternalChar;
+ char *InternalName;
+ UINT32 Length;
+ UINT32 NumSegments;
+ UINT32 NumCarats;
+ BOOLEAN FullyQualified;
+
+} ACPI_NAMESTRING_INFO;
+
+
+/* Field creation info */
+
+typedef struct acpi_create_field_info
+{
+ ACPI_NAMESPACE_NODE *RegionNode;
+ ACPI_NAMESPACE_NODE *FieldNode;
+ ACPI_NAMESPACE_NODE *RegisterNode;
+ ACPI_NAMESPACE_NODE *DataRegisterNode;
+ UINT32 BankValue;
+ UINT32 FieldBitPosition;
+ UINT32 FieldBitLength;
+ UINT8 FieldFlags;
+ UINT8 Attribute;
+ UINT8 FieldType;
+
+} ACPI_CREATE_FIELD_INFO;
+
+
+typedef
+ACPI_STATUS (*ACPI_INTERNAL_METHOD) (
+ struct acpi_walk_state *WalkState);
+
+
+/*
+ * Bitmapped ACPI types. Used internally only
+ */
+#define ACPI_BTYPE_ANY 0x00000000
+#define ACPI_BTYPE_INTEGER 0x00000001
+#define ACPI_BTYPE_STRING 0x00000002
+#define ACPI_BTYPE_BUFFER 0x00000004
+#define ACPI_BTYPE_PACKAGE 0x00000008
+#define ACPI_BTYPE_FIELD_UNIT 0x00000010
+#define ACPI_BTYPE_DEVICE 0x00000020
+#define ACPI_BTYPE_EVENT 0x00000040
+#define ACPI_BTYPE_METHOD 0x00000080
+#define ACPI_BTYPE_MUTEX 0x00000100
+#define ACPI_BTYPE_REGION 0x00000200
+#define ACPI_BTYPE_POWER 0x00000400
+#define ACPI_BTYPE_PROCESSOR 0x00000800
+#define ACPI_BTYPE_THERMAL 0x00001000
+#define ACPI_BTYPE_BUFFER_FIELD 0x00002000
+#define ACPI_BTYPE_DDB_HANDLE 0x00004000
+#define ACPI_BTYPE_DEBUG_OBJECT 0x00008000
+#define ACPI_BTYPE_REFERENCE 0x00010000
+#define ACPI_BTYPE_RESOURCE 0x00020000
+
+#define ACPI_BTYPE_COMPUTE_DATA (ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER)
+
+#define ACPI_BTYPE_DATA (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_PACKAGE)
+#define ACPI_BTYPE_DATA_REFERENCE (ACPI_BTYPE_DATA | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE)
+#define ACPI_BTYPE_DEVICE_OBJECTS (ACPI_BTYPE_DEVICE | ACPI_BTYPE_THERMAL | ACPI_BTYPE_PROCESSOR)
+#define ACPI_BTYPE_OBJECTS_AND_REFS 0x0001FFFF /* ARG or LOCAL */
+#define ACPI_BTYPE_ALL_OBJECTS 0x0000FFFF
+
+
+/*****************************************************************************
+ *
+ * Event typedefs and structs
+ *
+ ****************************************************************************/
+
+/* Dispatch info for each GPE -- either a method or handler, cannot be both */
+
+typedef struct acpi_handler_info
+{
+ ACPI_EVENT_HANDLER Address; /* Address of handler, if any */
+ void *Context; /* Context to be passed to handler */
+ ACPI_NAMESPACE_NODE *MethodNode; /* Method node for this GPE level (saved) */
+
+} ACPI_HANDLER_INFO;
+
+typedef union acpi_gpe_dispatch_info
+{
+ ACPI_NAMESPACE_NODE *MethodNode; /* Method node for this GPE level */
+ struct acpi_handler_info *Handler;
+
+} ACPI_GPE_DISPATCH_INFO;
+
+/*
+ * Information about a GPE, one per each GPE in an array.
+ * NOTE: Important to keep this struct as small as possible.
+ */
+typedef struct acpi_gpe_event_info
+{
+ union acpi_gpe_dispatch_info Dispatch; /* Either Method or Handler */
+ struct acpi_gpe_register_info *RegisterInfo; /* Backpointer to register info */
+ UINT8 Flags; /* Misc info about this GPE */
+ UINT8 GpeNumber; /* This GPE */
+
+} ACPI_GPE_EVENT_INFO;
+
+/* Information about a GPE register pair, one per each status/enable pair in an array */
+
+typedef struct acpi_gpe_register_info
+{
+ ACPI_GENERIC_ADDRESS StatusAddress; /* Address of status reg */
+ ACPI_GENERIC_ADDRESS EnableAddress; /* Address of enable reg */
+ UINT8 EnableForWake; /* GPEs to keep enabled when sleeping */
+ UINT8 EnableForRun; /* GPEs to keep enabled when running */
+ UINT8 BaseGpeNumber; /* Base GPE number for this register */
+
+} ACPI_GPE_REGISTER_INFO;
+
+/*
+ * Information about a GPE register block, one per each installed block --
+ * GPE0, GPE1, and one per each installed GPE Block Device.
+ */
+typedef struct acpi_gpe_block_info
+{
+ ACPI_NAMESPACE_NODE *Node;
+ struct acpi_gpe_block_info *Previous;
+ struct acpi_gpe_block_info *Next;
+ struct acpi_gpe_xrupt_info *XruptBlock; /* Backpointer to interrupt block */
+ ACPI_GPE_REGISTER_INFO *RegisterInfo; /* One per GPE register pair */
+ ACPI_GPE_EVENT_INFO *EventInfo; /* One for each GPE */
+ ACPI_GENERIC_ADDRESS BlockAddress; /* Base address of the block */
+ UINT32 RegisterCount; /* Number of register pairs in block */
+ UINT8 BlockBaseNumber;/* Base GPE number for this block */
+
+} ACPI_GPE_BLOCK_INFO;
+
+/* Information about GPE interrupt handlers, one per each interrupt level used for GPEs */
+
+typedef struct acpi_gpe_xrupt_info
+{
+ struct acpi_gpe_xrupt_info *Previous;
+ struct acpi_gpe_xrupt_info *Next;
+ ACPI_GPE_BLOCK_INFO *GpeBlockListHead; /* List of GPE blocks for this xrupt */
+ UINT32 InterruptNumber; /* System interrupt number */
+
+} ACPI_GPE_XRUPT_INFO;
+
+
+typedef struct acpi_gpe_walk_info
+{
+ ACPI_NAMESPACE_NODE *GpeDevice;
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+
+} ACPI_GPE_WALK_INFO;
+
+
+typedef ACPI_STATUS (*ACPI_GPE_CALLBACK) (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock);
+
+
+/* Information about each particular fixed event */
+
+typedef struct acpi_fixed_event_handler
+{
+ ACPI_EVENT_HANDLER Handler; /* Address of handler. */
+ void *Context; /* Context to be passed to handler */
+
+} ACPI_FIXED_EVENT_HANDLER;
+
+typedef struct acpi_fixed_event_info
+{
+ UINT8 StatusRegisterId;
+ UINT8 EnableRegisterId;
+ UINT16 StatusBitMask;
+ UINT16 EnableBitMask;
+
+} ACPI_FIXED_EVENT_INFO;
+
+/* Information used during field processing */
+
+typedef struct acpi_field_info
+{
+ UINT8 SkipField;
+ UINT8 FieldFlag;
+ UINT32 PkgLength;
+
+} ACPI_FIELD_INFO;
+
+
+/*****************************************************************************
+ *
+ * Generic "state" object for stacks
+ *
+ ****************************************************************************/
+
+#define ACPI_CONTROL_NORMAL 0xC0
+#define ACPI_CONTROL_CONDITIONAL_EXECUTING 0xC1
+#define ACPI_CONTROL_PREDICATE_EXECUTING 0xC2
+#define ACPI_CONTROL_PREDICATE_FALSE 0xC3
+#define ACPI_CONTROL_PREDICATE_TRUE 0xC4
+
+
+#define ACPI_STATE_COMMON \
+ void *Next; \
+ UINT8 DescriptorType; /* To differentiate various internal objs */\
+ UINT8 Flags; \
+ UINT16 Value; \
+ UINT16 State;
+
+ /* There are 2 bytes available here until the next natural alignment boundary */
+
+typedef struct acpi_common_state
+{
+ ACPI_STATE_COMMON
+} ACPI_COMMON_STATE;
+
+
+/*
+ * Update state - used to traverse complex objects such as packages
+ */
+typedef struct acpi_update_state
+{
+ ACPI_STATE_COMMON
+ union acpi_operand_object *Object;
+
+} ACPI_UPDATE_STATE;
+
+
+/*
+ * Pkg state - used to traverse nested package structures
+ */
+typedef struct acpi_pkg_state
+{
+ ACPI_STATE_COMMON
+ UINT16 Index;
+ union acpi_operand_object *SourceObject;
+ union acpi_operand_object *DestObject;
+ struct acpi_walk_state *WalkState;
+ void *ThisTargetObj;
+ UINT32 NumPackages;
+
+} ACPI_PKG_STATE;
+
+
+/*
+ * Control state - one per if/else and while constructs.
+ * Allows nesting of these constructs
+ */
+typedef struct acpi_control_state
+{
+ ACPI_STATE_COMMON
+ UINT16 Opcode;
+ union acpi_parse_object *PredicateOp;
+ UINT8 *AmlPredicateStart; /* Start of if/while predicate */
+ UINT8 *PackageEnd; /* End of if/while block */
+
+} ACPI_CONTROL_STATE;
+
+
+/*
+ * Scope state - current scope during namespace lookups
+ */
+typedef struct acpi_scope_state
+{
+ ACPI_STATE_COMMON
+ ACPI_NAMESPACE_NODE *Node;
+
+} ACPI_SCOPE_STATE;
+
+
+typedef struct acpi_pscope_state
+{
+ ACPI_STATE_COMMON
+ UINT32 ArgCount; /* Number of fixed arguments */
+ union acpi_parse_object *Op; /* Current op being parsed */
+ UINT8 *ArgEnd; /* Current argument end */
+ UINT8 *PkgEnd; /* Current package end */
+ UINT32 ArgList; /* Next argument to parse */
+
+} ACPI_PSCOPE_STATE;
+
+
+/*
+ * Thread state - one per thread across multiple walk states. Multiple walk
+ * states are created when there are nested control methods executing.
+ */
+typedef struct acpi_thread_state
+{
+ ACPI_STATE_COMMON
+ UINT8 CurrentSyncLevel; /* Mutex Sync (nested acquire) level */
+ struct acpi_walk_state *WalkStateList; /* Head of list of WalkStates for this thread */
+ union acpi_operand_object *AcquiredMutexList; /* List of all currently acquired mutexes */
+ ACPI_THREAD_ID ThreadId; /* Running thread ID */
+
+} ACPI_THREAD_STATE;
+
+
+/*
+ * Result values - used to accumulate the results of nested
+ * AML arguments
+ */
+typedef struct acpi_result_values
+{
+ ACPI_STATE_COMMON
+ union acpi_operand_object *ObjDesc [ACPI_RESULTS_FRAME_OBJ_NUM];
+
+} ACPI_RESULT_VALUES;
+
+
+typedef
+ACPI_STATUS (*ACPI_PARSE_DOWNWARDS) (
+ struct acpi_walk_state *WalkState,
+ union acpi_parse_object **OutOp);
+
+typedef
+ACPI_STATUS (*ACPI_PARSE_UPWARDS) (
+ struct acpi_walk_state *WalkState);
+
+
+/*
+ * Notify info - used to pass info to the deferred notify
+ * handler/dispatcher.
+ */
+typedef struct acpi_notify_info
+{
+ ACPI_STATE_COMMON
+ ACPI_NAMESPACE_NODE *Node;
+ union acpi_operand_object *HandlerObj;
+
+} ACPI_NOTIFY_INFO;
+
+
+/* Generic state is union of structs above */
+
+typedef union acpi_generic_state
+{
+ ACPI_COMMON_STATE Common;
+ ACPI_CONTROL_STATE Control;
+ ACPI_UPDATE_STATE Update;
+ ACPI_SCOPE_STATE Scope;
+ ACPI_PSCOPE_STATE ParseScope;
+ ACPI_PKG_STATE Pkg;
+ ACPI_THREAD_STATE Thread;
+ ACPI_RESULT_VALUES Results;
+ ACPI_NOTIFY_INFO Notify;
+
+} ACPI_GENERIC_STATE;
+
+
+/*****************************************************************************
+ *
+ * Interpreter typedefs and structs
+ *
+ ****************************************************************************/
+
+typedef
+ACPI_STATUS (*ACPI_EXECUTE_OP) (
+ struct acpi_walk_state *WalkState);
+
+
+/*****************************************************************************
+ *
+ * Parser typedefs and structs
+ *
+ ****************************************************************************/
+
+/*
+ * AML opcode, name, and argument layout
+ */
+typedef struct acpi_opcode_info
+{
+#if defined(ACPI_DISASSEMBLER) || defined(ACPI_DEBUG_OUTPUT)
+ char *Name; /* Opcode name (disassembler/debug only) */
+#endif
+ UINT32 ParseArgs; /* Grammar/Parse time arguments */
+ UINT32 RuntimeArgs; /* Interpret time arguments */
+ UINT16 Flags; /* Misc flags */
+ UINT8 ObjectType; /* Corresponding internal object type */
+ UINT8 Class; /* Opcode class */
+ UINT8 Type; /* Opcode type */
+
+} ACPI_OPCODE_INFO;
+
+typedef union acpi_parse_value
+{
+ ACPI_INTEGER Integer; /* Integer constant (Up to 64 bits) */
+ UINT64_STRUCT Integer64; /* Structure overlay for 2 32-bit Dwords */
+ UINT32 Size; /* bytelist or field size */
+ char *String; /* NULL terminated string */
+ UINT8 *Buffer; /* buffer or string */
+ char *Name; /* NULL terminated string */
+ union acpi_parse_object *Arg; /* arguments and contained ops */
+
+} ACPI_PARSE_VALUE;
+
+#define ACPI_PARSE_COMMON \
+ union acpi_parse_object *Parent; /* Parent op */\
+ UINT8 DescriptorType; /* To differentiate various internal objs */\
+ UINT8 Flags; /* Type of Op */\
+ UINT16 AmlOpcode; /* AML opcode */\
+ UINT32 AmlOffset; /* Offset of declaration in AML */\
+ union acpi_parse_object *Next; /* Next op */\
+ ACPI_NAMESPACE_NODE *Node; /* For use by interpreter */\
+ ACPI_PARSE_VALUE Value; /* Value or args associated with the opcode */\
+ UINT8 ArgListLength; /* Number of elements in the arg list */\
+ ACPI_DISASM_ONLY_MEMBERS (\
+ UINT8 DisasmFlags; /* Used during AML disassembly */\
+ UINT8 DisasmOpcode; /* Subtype used for disassembly */\
+ char AmlOpName[16]) /* Op name (debug only) */
+
+
+#define ACPI_DASM_BUFFER 0x00
+#define ACPI_DASM_RESOURCE 0x01
+#define ACPI_DASM_STRING 0x02
+#define ACPI_DASM_UNICODE 0x03
+#define ACPI_DASM_EISAID 0x04
+#define ACPI_DASM_MATCHOP 0x05
+#define ACPI_DASM_LNOT_PREFIX 0x06
+#define ACPI_DASM_LNOT_SUFFIX 0x07
+#define ACPI_DASM_IGNORE 0x08
+
+/*
+ * Generic operation (for example: If, While, Store)
+ */
+typedef struct acpi_parse_obj_common
+{
+ ACPI_PARSE_COMMON
+} ACPI_PARSE_OBJ_COMMON;
+
+
+/*
+ * Extended Op for named ops (Scope, Method, etc.), deferred ops (Methods and OpRegions),
+ * and bytelists.
+ */
+typedef struct acpi_parse_obj_named
+{
+ ACPI_PARSE_COMMON
+ UINT8 *Path;
+ UINT8 *Data; /* AML body or bytelist data */
+ UINT32 Length; /* AML length */
+ UINT32 Name; /* 4-byte name or zero if no name */
+
+} ACPI_PARSE_OBJ_NAMED;
+
+
+/* This version is used by the iASL compiler only */
+
+#define ACPI_MAX_PARSEOP_NAME 20
+
+typedef struct acpi_parse_obj_asl
+{
+ ACPI_PARSE_COMMON
+ union acpi_parse_object *Child;
+ union acpi_parse_object *ParentMethod;
+ char *Filename;
+ char *ExternalName;
+ char *Namepath;
+ char NameSeg[4];
+ UINT32 ExtraValue;
+ UINT32 Column;
+ UINT32 LineNumber;
+ UINT32 LogicalLineNumber;
+ UINT32 LogicalByteOffset;
+ UINT32 EndLine;
+ UINT32 EndLogicalLine;
+ UINT32 AcpiBtype;
+ UINT32 AmlLength;
+ UINT32 AmlSubtreeLength;
+ UINT32 FinalAmlLength;
+ UINT32 FinalAmlOffset;
+ UINT32 CompileFlags;
+ UINT16 ParseOpcode;
+ UINT8 AmlOpcodeLength;
+ UINT8 AmlPkgLenBytes;
+ UINT8 Extra;
+ char ParseOpName[ACPI_MAX_PARSEOP_NAME];
+
+} ACPI_PARSE_OBJ_ASL;
+
+typedef union acpi_parse_object
+{
+ ACPI_PARSE_OBJ_COMMON Common;
+ ACPI_PARSE_OBJ_NAMED Named;
+ ACPI_PARSE_OBJ_ASL Asl;
+
+} ACPI_PARSE_OBJECT;
+
+
+/*
+ * Parse state - one state per parser invocation and each control
+ * method.
+ */
+typedef struct acpi_parse_state
+{
+ UINT8 *AmlStart; /* First AML byte */
+ UINT8 *Aml; /* Next AML byte */
+ UINT8 *AmlEnd; /* (last + 1) AML byte */
+ UINT8 *PkgStart; /* Current package begin */
+ UINT8 *PkgEnd; /* Current package end */
+ union acpi_parse_object *StartOp; /* Root of parse tree */
+ struct acpi_namespace_node *StartNode;
+ union acpi_generic_state *Scope; /* Current scope */
+ union acpi_parse_object *StartScope;
+ UINT32 AmlSize;
+
+} ACPI_PARSE_STATE;
+
+
+/* Parse object flags */
+
+#define ACPI_PARSEOP_GENERIC 0x01
+#define ACPI_PARSEOP_NAMED 0x02
+#define ACPI_PARSEOP_DEFERRED 0x04
+#define ACPI_PARSEOP_BYTELIST 0x08
+#define ACPI_PARSEOP_IN_STACK 0x10
+#define ACPI_PARSEOP_TARGET 0x20
+#define ACPI_PARSEOP_IN_CACHE 0x80
+
+/* Parse object DisasmFlags */
+
+#define ACPI_PARSEOP_IGNORE 0x01
+#define ACPI_PARSEOP_PARAMLIST 0x02
+#define ACPI_PARSEOP_EMPTY_TERMLIST 0x04
+#define ACPI_PARSEOP_SPECIAL 0x10
+
+
+/*****************************************************************************
+ *
+ * Hardware (ACPI registers) and PNP
+ *
+ ****************************************************************************/
+
+#define PCI_ROOT_HID_STRING "PNP0A03"
+#define PCI_EXPRESS_ROOT_HID_STRING "PNP0A08"
+
+typedef struct acpi_bit_register_info
+{
+ UINT8 ParentRegister;
+ UINT8 BitPosition;
+ UINT16 AccessBitMask;
+
+} ACPI_BIT_REGISTER_INFO;
+
+
+/*
+ * Some ACPI registers have bits that must be ignored -- meaning that they
+ * must be preserved.
+ */
+#define ACPI_PM1_STATUS_PRESERVED_BITS 0x0800 /* Bit 11 */
+#define ACPI_PM1_CONTROL_PRESERVED_BITS 0x0201 /* Bit 9, Bit 0 (SCI_EN) */
+
+
+/*
+ * Register IDs
+ * These are the full ACPI registers
+ */
+#define ACPI_REGISTER_PM1_STATUS 0x01
+#define ACPI_REGISTER_PM1_ENABLE 0x02
+#define ACPI_REGISTER_PM1_CONTROL 0x03
+#define ACPI_REGISTER_PM1A_CONTROL 0x04
+#define ACPI_REGISTER_PM1B_CONTROL 0x05
+#define ACPI_REGISTER_PM2_CONTROL 0x06
+#define ACPI_REGISTER_PM_TIMER 0x07
+#define ACPI_REGISTER_PROCESSOR_BLOCK 0x08
+#define ACPI_REGISTER_SMI_COMMAND_BLOCK 0x09
+
+
+/* Masks used to access the BitRegisters */
+
+#define ACPI_BITMASK_TIMER_STATUS 0x0001
+#define ACPI_BITMASK_BUS_MASTER_STATUS 0x0010
+#define ACPI_BITMASK_GLOBAL_LOCK_STATUS 0x0020
+#define ACPI_BITMASK_POWER_BUTTON_STATUS 0x0100
+#define ACPI_BITMASK_SLEEP_BUTTON_STATUS 0x0200
+#define ACPI_BITMASK_RT_CLOCK_STATUS 0x0400
+#define ACPI_BITMASK_PCIEXP_WAKE_STATUS 0x4000 /* ACPI 3.0 */
+#define ACPI_BITMASK_WAKE_STATUS 0x8000
+
+#define ACPI_BITMASK_ALL_FIXED_STATUS (\
+ ACPI_BITMASK_TIMER_STATUS | \
+ ACPI_BITMASK_BUS_MASTER_STATUS | \
+ ACPI_BITMASK_GLOBAL_LOCK_STATUS | \
+ ACPI_BITMASK_POWER_BUTTON_STATUS | \
+ ACPI_BITMASK_SLEEP_BUTTON_STATUS | \
+ ACPI_BITMASK_RT_CLOCK_STATUS | \
+ ACPI_BITMASK_WAKE_STATUS)
+
+#define ACPI_BITMASK_TIMER_ENABLE 0x0001
+#define ACPI_BITMASK_GLOBAL_LOCK_ENABLE 0x0020
+#define ACPI_BITMASK_POWER_BUTTON_ENABLE 0x0100
+#define ACPI_BITMASK_SLEEP_BUTTON_ENABLE 0x0200
+#define ACPI_BITMASK_RT_CLOCK_ENABLE 0x0400
+#define ACPI_BITMASK_PCIEXP_WAKE_DISABLE 0x4000 /* ACPI 3.0 */
+
+#define ACPI_BITMASK_SCI_ENABLE 0x0001
+#define ACPI_BITMASK_BUS_MASTER_RLD 0x0002
+#define ACPI_BITMASK_GLOBAL_LOCK_RELEASE 0x0004
+#define ACPI_BITMASK_SLEEP_TYPE_X 0x1C00
+#define ACPI_BITMASK_SLEEP_ENABLE 0x2000
+
+#define ACPI_BITMASK_ARB_DISABLE 0x0001
+
+
+/* Raw bit position of each BitRegister */
+
+#define ACPI_BITPOSITION_TIMER_STATUS 0x00
+#define ACPI_BITPOSITION_BUS_MASTER_STATUS 0x04
+#define ACPI_BITPOSITION_GLOBAL_LOCK_STATUS 0x05
+#define ACPI_BITPOSITION_POWER_BUTTON_STATUS 0x08
+#define ACPI_BITPOSITION_SLEEP_BUTTON_STATUS 0x09
+#define ACPI_BITPOSITION_RT_CLOCK_STATUS 0x0A
+#define ACPI_BITPOSITION_PCIEXP_WAKE_STATUS 0x0E /* ACPI 3.0 */
+#define ACPI_BITPOSITION_WAKE_STATUS 0x0F
+
+#define ACPI_BITPOSITION_TIMER_ENABLE 0x00
+#define ACPI_BITPOSITION_GLOBAL_LOCK_ENABLE 0x05
+#define ACPI_BITPOSITION_POWER_BUTTON_ENABLE 0x08
+#define ACPI_BITPOSITION_SLEEP_BUTTON_ENABLE 0x09
+#define ACPI_BITPOSITION_RT_CLOCK_ENABLE 0x0A
+#define ACPI_BITPOSITION_PCIEXP_WAKE_DISABLE 0x0E /* ACPI 3.0 */
+
+#define ACPI_BITPOSITION_SCI_ENABLE 0x00
+#define ACPI_BITPOSITION_BUS_MASTER_RLD 0x01
+#define ACPI_BITPOSITION_GLOBAL_LOCK_RELEASE 0x02
+#define ACPI_BITPOSITION_SLEEP_TYPE_X 0x0A
+#define ACPI_BITPOSITION_SLEEP_ENABLE 0x0D
+
+#define ACPI_BITPOSITION_ARB_DISABLE 0x00
+
+
+/*****************************************************************************
+ *
+ * Resource descriptors
+ *
+ ****************************************************************************/
+
+/* ResourceType values */
+
+#define ACPI_ADDRESS_TYPE_MEMORY_RANGE 0
+#define ACPI_ADDRESS_TYPE_IO_RANGE 1
+#define ACPI_ADDRESS_TYPE_BUS_NUMBER_RANGE 2
+
+/* Resource descriptor types and masks */
+
+#define ACPI_RESOURCE_NAME_LARGE 0x80
+#define ACPI_RESOURCE_NAME_SMALL 0x00
+
+#define ACPI_RESOURCE_NAME_SMALL_MASK 0x78 /* Bits 6:3 contain the type */
+#define ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK 0x07 /* Bits 2:0 contain the length */
+#define ACPI_RESOURCE_NAME_LARGE_MASK 0x7F /* Bits 6:0 contain the type */
+
+
+/*
+ * Small resource descriptor "names" as defined by the ACPI specification.
+ * Note: Bits 2:0 are used for the descriptor length
+ */
+#define ACPI_RESOURCE_NAME_IRQ 0x20
+#define ACPI_RESOURCE_NAME_DMA 0x28
+#define ACPI_RESOURCE_NAME_START_DEPENDENT 0x30
+#define ACPI_RESOURCE_NAME_END_DEPENDENT 0x38
+#define ACPI_RESOURCE_NAME_IO 0x40
+#define ACPI_RESOURCE_NAME_FIXED_IO 0x48
+#define ACPI_RESOURCE_NAME_RESERVED_S1 0x50
+#define ACPI_RESOURCE_NAME_RESERVED_S2 0x58
+#define ACPI_RESOURCE_NAME_RESERVED_S3 0x60
+#define ACPI_RESOURCE_NAME_RESERVED_S4 0x68
+#define ACPI_RESOURCE_NAME_VENDOR_SMALL 0x70
+#define ACPI_RESOURCE_NAME_END_TAG 0x78
+
+/*
+ * Large resource descriptor "names" as defined by the ACPI specification.
+ * Note: includes the Large Descriptor bit in bit[7]
+ */
+#define ACPI_RESOURCE_NAME_MEMORY24 0x81
+#define ACPI_RESOURCE_NAME_GENERIC_REGISTER 0x82
+#define ACPI_RESOURCE_NAME_RESERVED_L1 0x83
+#define ACPI_RESOURCE_NAME_VENDOR_LARGE 0x84
+#define ACPI_RESOURCE_NAME_MEMORY32 0x85
+#define ACPI_RESOURCE_NAME_FIXED_MEMORY32 0x86
+#define ACPI_RESOURCE_NAME_ADDRESS32 0x87
+#define ACPI_RESOURCE_NAME_ADDRESS16 0x88
+#define ACPI_RESOURCE_NAME_EXTENDED_IRQ 0x89
+#define ACPI_RESOURCE_NAME_ADDRESS64 0x8A
+#define ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 0x8B
+#define ACPI_RESOURCE_NAME_LARGE_MAX 0x8B
+
+
+/*****************************************************************************
+ *
+ * Miscellaneous
+ *
+ ****************************************************************************/
+
+#define ACPI_ASCII_ZERO 0x30
+
+
+/*****************************************************************************
+ *
+ * Debugger
+ *
+ ****************************************************************************/
+
+typedef struct acpi_db_method_info
+{
+ ACPI_HANDLE MainThreadGate;
+ ACPI_HANDLE ThreadCompleteGate;
+ UINT32 *Threads;
+ UINT32 NumThreads;
+ UINT32 NumCreated;
+ UINT32 NumCompleted;
+
+ char *Name;
+ UINT32 Flags;
+ UINT32 NumLoops;
+ char Pathname[128];
+ char **Args;
+
+ /*
+ * Arguments to be passed to method for the command
+ * Threads -
+ * the Number of threads, ID of current thread and
+ * Index of current thread inside all them created.
+ */
+ char InitArgs;
+ char *Arguments[4];
+ char NumThreadsStr[11];
+ char IdOfThreadStr[11];
+ char IndexOfThreadStr[11];
+
+} ACPI_DB_METHOD_INFO;
+
+typedef struct acpi_integrity_info
+{
+ UINT32 Nodes;
+ UINT32 Objects;
+
+} ACPI_INTEGRITY_INFO;
+
+
+#define ACPI_DB_REDIRECTABLE_OUTPUT 0x01
+#define ACPI_DB_CONSOLE_OUTPUT 0x02
+#define ACPI_DB_DUPLICATE_OUTPUT 0x03
+
+
+/*****************************************************************************
+ *
+ * Debug
+ *
+ ****************************************************************************/
+
+/* Entry for a memory allocation (debug only) */
+
+#define ACPI_MEM_MALLOC 0
+#define ACPI_MEM_CALLOC 1
+#define ACPI_MAX_MODULE_NAME 16
+
+#define ACPI_COMMON_DEBUG_MEM_HEADER \
+ struct acpi_debug_mem_block *Previous; \
+ struct acpi_debug_mem_block *Next; \
+ UINT32 Size; \
+ UINT32 Component; \
+ UINT32 Line; \
+ char Module[ACPI_MAX_MODULE_NAME]; \
+ UINT8 AllocType;
+
+typedef struct acpi_debug_mem_header
+{
+ ACPI_COMMON_DEBUG_MEM_HEADER
+
+} ACPI_DEBUG_MEM_HEADER;
+
+typedef struct acpi_debug_mem_block
+{
+ ACPI_COMMON_DEBUG_MEM_HEADER
+ UINT64 UserSpace;
+
+} ACPI_DEBUG_MEM_BLOCK;
+
+
+#define ACPI_MEM_LIST_GLOBAL 0
+#define ACPI_MEM_LIST_NSNODE 1
+#define ACPI_MEM_LIST_MAX 1
+#define ACPI_NUM_MEM_LISTS 2
+
+
+typedef struct acpi_memory_list
+{
+ char *ListName;
+ void *ListHead;
+ UINT16 ObjectSize;
+ UINT16 MaxDepth;
+ UINT16 CurrentDepth;
+ UINT16 LinkOffset;
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+
+ /* Statistics for debug memory tracking only */
+
+ UINT32 TotalAllocated;
+ UINT32 TotalFreed;
+ UINT32 MaxOccupied;
+ UINT32 TotalSize;
+ UINT32 CurrentTotalSize;
+ UINT32 Requests;
+ UINT32 Hits;
+#endif
+
+} ACPI_MEMORY_LIST;
+
+
+#endif /* __ACLOCAL_H__ */
diff --git a/sys/contrib/dev/acpica/acmacros.h b/sys/contrib/dev/acpica/acmacros.h
new file mode 100644
index 0000000..6583ba6
--- /dev/null
+++ b/sys/contrib/dev/acpica/acmacros.h
@@ -0,0 +1,754 @@
+/******************************************************************************
+ *
+ * Name: acmacros.h - C macros for the entire subsystem.
+ * $Revision: 1.195 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACMACROS_H__
+#define __ACMACROS_H__
+
+
+/*
+ * Data manipulation macros
+ */
+#define ACPI_LOWORD(l) ((UINT16)(UINT32)(l))
+#define ACPI_HIWORD(l) ((UINT16)((((UINT32)(l)) >> 16) & 0xFFFF))
+#define ACPI_LOBYTE(l) ((UINT8)(UINT16)(l))
+#define ACPI_HIBYTE(l) ((UINT8)((((UINT16)(l)) >> 8) & 0xFF))
+
+#define ACPI_SET_BIT(target,bit) ((target) |= (bit))
+#define ACPI_CLEAR_BIT(target,bit) ((target) &= ~(bit))
+#define ACPI_MIN(a,b) (((a)<(b))?(a):(b))
+#define ACPI_MAX(a,b) (((a)>(b))?(a):(b))
+
+/* Size calculation */
+
+#define ACPI_ARRAY_LENGTH(x) (sizeof(x) / sizeof((x)[0]))
+
+
+/*
+ * Full 64-bit integer must be available on both 32-bit and 64-bit platforms
+ */
+#define ACPI_LODWORD(l) ((UINT32)(UINT64)(l))
+#define ACPI_HIDWORD(l) ((UINT32)(((*(UINT64_STRUCT *)(void *)(&l))).Hi))
+
+
+/*
+ * printf() format helpers
+ */
+
+/* Split 64-bit integer into two 32-bit values. Use with %8.8X%8.8X */
+
+#define ACPI_FORMAT_UINT64(i) ACPI_HIDWORD(i),ACPI_LODWORD(i)
+
+/*
+ * Extract data using a pointer. Any more than a byte and we
+ * get into potential aligment issues -- see the STORE macros below.
+ * Use with care.
+ */
+#define ACPI_GET8(ptr) *ACPI_CAST_PTR (UINT8, ptr)
+#define ACPI_GET16(ptr) *ACPI_CAST_PTR (UINT16, ptr)
+#define ACPI_GET32(ptr) *ACPI_CAST_PTR (UINT32, ptr)
+#define ACPI_GET64(ptr) *ACPI_CAST_PTR (UINT64, ptr)
+#define ACPI_SET8(ptr) *ACPI_CAST_PTR (UINT8, ptr)
+#define ACPI_SET16(ptr) *ACPI_CAST_PTR (UINT16, ptr)
+#define ACPI_SET32(ptr) *ACPI_CAST_PTR (UINT32, ptr)
+#define ACPI_SET64(ptr) *ACPI_CAST_PTR (UINT64, ptr)
+
+/*
+ * Pointer manipulation
+ */
+#define ACPI_CAST_PTR(t, p) ((t *) (ACPI_UINTPTR_T) (p))
+#define ACPI_CAST_INDIRECT_PTR(t, p) ((t **) (ACPI_UINTPTR_T) (p))
+#define ACPI_ADD_PTR(t,a,b) ACPI_CAST_PTR (t, (ACPI_CAST_PTR (UINT8,(a)) + (ACPI_NATIVE_UINT)(b)))
+#define ACPI_PTR_DIFF(a,b) (ACPI_NATIVE_UINT) (ACPI_CAST_PTR (UINT8,(a)) - ACPI_CAST_PTR (UINT8,(b)))
+
+/* Pointer/Integer type conversions */
+
+#define ACPI_TO_POINTER(i) ACPI_ADD_PTR (void,(void *) NULL,(ACPI_NATIVE_UINT) i)
+#define ACPI_TO_INTEGER(p) ACPI_PTR_DIFF (p,(void *) NULL)
+#define ACPI_OFFSET(d,f) (ACPI_SIZE) ACPI_PTR_DIFF (&(((d *)0)->f),(void *) NULL)
+#define ACPI_PHYSADDR_TO_PTR(i) ACPI_TO_POINTER(i)
+#define ACPI_PTR_TO_PHYSADDR(i) ACPI_TO_INTEGER(i)
+
+#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
+#define ACPI_COMPARE_NAME(a,b) (*ACPI_CAST_PTR (UINT32,(a)) == *ACPI_CAST_PTR (UINT32,(b)))
+#else
+#define ACPI_COMPARE_NAME(a,b) (!ACPI_STRNCMP (ACPI_CAST_PTR (char,(a)), ACPI_CAST_PTR (char,(b)), ACPI_NAME_SIZE))
+#endif
+
+/*
+ * Macros for moving data around to/from buffers that are possibly unaligned.
+ * If the hardware supports the transfer of unaligned data, just do the store.
+ * Otherwise, we have to move one byte at a time.
+ */
+#ifdef ACPI_BIG_ENDIAN
+/*
+ * Macros for big-endian machines
+ */
+
+/* This macro sets a buffer index, starting from the end of the buffer */
+
+#define ACPI_BUFFER_INDEX(BufLen,BufOffset,ByteGran) ((BufLen) - (((BufOffset)+1) * (ByteGran)))
+
+/* These macros reverse the bytes during the move, converting little-endian to big endian */
+
+ /* Big Endian <== Little Endian */
+ /* Hi...Lo Lo...Hi */
+/* 16-bit source, 16/32/64 destination */
+
+#define ACPI_MOVE_16_TO_16(d,s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[1];\
+ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[0];}
+
+#define ACPI_MOVE_16_TO_32(d,s) {(*(UINT32 *)(void *)(d))=0;\
+ ((UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[1];\
+ ((UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[0];}
+
+#define ACPI_MOVE_16_TO_64(d,s) {(*(UINT64 *)(void *)(d))=0;\
+ ((UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\
+ ((UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];}
+
+/* 32-bit source, 16/32/64 destination */
+
+#define ACPI_MOVE_32_TO_16(d,s) ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
+
+#define ACPI_MOVE_32_TO_32(d,s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[3];\
+ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[2];\
+ (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[1];\
+ (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[0];}
+
+#define ACPI_MOVE_32_TO_64(d,s) {(*(UINT64 *)(void *)(d))=0;\
+ ((UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[3];\
+ ((UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[2];\
+ ((UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\
+ ((UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];}
+
+/* 64-bit source, 16/32/64 destination */
+
+#define ACPI_MOVE_64_TO_16(d,s) ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
+
+#define ACPI_MOVE_64_TO_32(d,s) ACPI_MOVE_32_TO_32(d,s) /* Truncate to 32 */
+
+#define ACPI_MOVE_64_TO_64(d,s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[7];\
+ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[6];\
+ (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[5];\
+ (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[4];\
+ (( UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[3];\
+ (( UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[2];\
+ (( UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[1];\
+ (( UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[0];}
+#else
+/*
+ * Macros for little-endian machines
+ */
+
+/* This macro sets a buffer index, starting from the beginning of the buffer */
+
+#define ACPI_BUFFER_INDEX(BufLen,BufOffset,ByteGran) (BufOffset)
+
+#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
+
+/* The hardware supports unaligned transfers, just do the little-endian move */
+
+/* 16-bit source, 16/32/64 destination */
+
+#define ACPI_MOVE_16_TO_16(d,s) *(UINT16 *)(void *)(d) = *(UINT16 *)(void *)(s)
+#define ACPI_MOVE_16_TO_32(d,s) *(UINT32 *)(void *)(d) = *(UINT16 *)(void *)(s)
+#define ACPI_MOVE_16_TO_64(d,s) *(UINT64 *)(void *)(d) = *(UINT16 *)(void *)(s)
+
+/* 32-bit source, 16/32/64 destination */
+
+#define ACPI_MOVE_32_TO_16(d,s) ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
+#define ACPI_MOVE_32_TO_32(d,s) *(UINT32 *)(void *)(d) = *(UINT32 *)(void *)(s)
+#define ACPI_MOVE_32_TO_64(d,s) *(UINT64 *)(void *)(d) = *(UINT32 *)(void *)(s)
+
+/* 64-bit source, 16/32/64 destination */
+
+#define ACPI_MOVE_64_TO_16(d,s) ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
+#define ACPI_MOVE_64_TO_32(d,s) ACPI_MOVE_32_TO_32(d,s) /* Truncate to 32 */
+#define ACPI_MOVE_64_TO_64(d,s) *(UINT64 *)(void *)(d) = *(UINT64 *)(void *)(s)
+
+#else
+/*
+ * The hardware does not support unaligned transfers. We must move the
+ * data one byte at a time. These macros work whether the source or
+ * the destination (or both) is/are unaligned. (Little-endian move)
+ */
+
+/* 16-bit source, 16/32/64 destination */
+
+#define ACPI_MOVE_16_TO_16(d,s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\
+ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];}
+
+#define ACPI_MOVE_16_TO_32(d,s) {(*(UINT32 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d,s);}
+#define ACPI_MOVE_16_TO_64(d,s) {(*(UINT64 *)(void *)(d)) = 0; ACPI_MOVE_16_TO_16(d,s);}
+
+/* 32-bit source, 16/32/64 destination */
+
+#define ACPI_MOVE_32_TO_16(d,s) ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
+
+#define ACPI_MOVE_32_TO_32(d,s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\
+ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];\
+ (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[2];\
+ (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[3];}
+
+#define ACPI_MOVE_32_TO_64(d,s) {(*(UINT64 *)(void *)(d)) = 0; ACPI_MOVE_32_TO_32(d,s);}
+
+/* 64-bit source, 16/32/64 destination */
+
+#define ACPI_MOVE_64_TO_16(d,s) ACPI_MOVE_16_TO_16(d,s) /* Truncate to 16 */
+#define ACPI_MOVE_64_TO_32(d,s) ACPI_MOVE_32_TO_32(d,s) /* Truncate to 32 */
+#define ACPI_MOVE_64_TO_64(d,s) {(( UINT8 *)(void *)(d))[0] = ((UINT8 *)(void *)(s))[0];\
+ (( UINT8 *)(void *)(d))[1] = ((UINT8 *)(void *)(s))[1];\
+ (( UINT8 *)(void *)(d))[2] = ((UINT8 *)(void *)(s))[2];\
+ (( UINT8 *)(void *)(d))[3] = ((UINT8 *)(void *)(s))[3];\
+ (( UINT8 *)(void *)(d))[4] = ((UINT8 *)(void *)(s))[4];\
+ (( UINT8 *)(void *)(d))[5] = ((UINT8 *)(void *)(s))[5];\
+ (( UINT8 *)(void *)(d))[6] = ((UINT8 *)(void *)(s))[6];\
+ (( UINT8 *)(void *)(d))[7] = ((UINT8 *)(void *)(s))[7];}
+#endif
+#endif
+
+/* Macros based on machine integer width */
+
+#if ACPI_MACHINE_WIDTH == 32
+#define ACPI_MOVE_SIZE_TO_16(d,s) ACPI_MOVE_32_TO_16(d,s)
+
+#elif ACPI_MACHINE_WIDTH == 64
+#define ACPI_MOVE_SIZE_TO_16(d,s) ACPI_MOVE_64_TO_16(d,s)
+
+#else
+#error unknown ACPI_MACHINE_WIDTH
+#endif
+
+
+/*
+ * Fast power-of-two math macros for non-optimized compilers
+ */
+#define _ACPI_DIV(value,PowerOf2) ((UINT32) ((value) >> (PowerOf2)))
+#define _ACPI_MUL(value,PowerOf2) ((UINT32) ((value) << (PowerOf2)))
+#define _ACPI_MOD(value,Divisor) ((UINT32) ((value) & ((Divisor) -1)))
+
+#define ACPI_DIV_2(a) _ACPI_DIV(a,1)
+#define ACPI_MUL_2(a) _ACPI_MUL(a,1)
+#define ACPI_MOD_2(a) _ACPI_MOD(a,2)
+
+#define ACPI_DIV_4(a) _ACPI_DIV(a,2)
+#define ACPI_MUL_4(a) _ACPI_MUL(a,2)
+#define ACPI_MOD_4(a) _ACPI_MOD(a,4)
+
+#define ACPI_DIV_8(a) _ACPI_DIV(a,3)
+#define ACPI_MUL_8(a) _ACPI_MUL(a,3)
+#define ACPI_MOD_8(a) _ACPI_MOD(a,8)
+
+#define ACPI_DIV_16(a) _ACPI_DIV(a,4)
+#define ACPI_MUL_16(a) _ACPI_MUL(a,4)
+#define ACPI_MOD_16(a) _ACPI_MOD(a,16)
+
+#define ACPI_DIV_32(a) _ACPI_DIV(a,5)
+#define ACPI_MUL_32(a) _ACPI_MUL(a,5)
+#define ACPI_MOD_32(a) _ACPI_MOD(a,32)
+
+/*
+ * Rounding macros (Power of two boundaries only)
+ */
+#define ACPI_ROUND_DOWN(value,boundary) (((ACPI_NATIVE_UINT)(value)) & \
+ (~(((ACPI_NATIVE_UINT) boundary)-1)))
+
+#define ACPI_ROUND_UP(value,boundary) ((((ACPI_NATIVE_UINT)(value)) + \
+ (((ACPI_NATIVE_UINT) boundary)-1)) & \
+ (~(((ACPI_NATIVE_UINT) boundary)-1)))
+
+/* Note: sizeof(ACPI_NATIVE_UINT) evaluates to either 2, 4, or 8 */
+
+#define ACPI_ROUND_DOWN_TO_32BIT(a) ACPI_ROUND_DOWN(a,4)
+#define ACPI_ROUND_DOWN_TO_64BIT(a) ACPI_ROUND_DOWN(a,8)
+#define ACPI_ROUND_DOWN_TO_NATIVE_WORD(a) ACPI_ROUND_DOWN(a,sizeof(ACPI_NATIVE_UINT))
+
+#define ACPI_ROUND_UP_TO_32BIT(a) ACPI_ROUND_UP(a,4)
+#define ACPI_ROUND_UP_TO_64BIT(a) ACPI_ROUND_UP(a,8)
+#define ACPI_ROUND_UP_TO_NATIVE_WORD(a) ACPI_ROUND_UP(a,sizeof(ACPI_NATIVE_UINT))
+
+#define ACPI_ROUND_BITS_UP_TO_BYTES(a) ACPI_DIV_8((a) + 7)
+#define ACPI_ROUND_BITS_DOWN_TO_BYTES(a) ACPI_DIV_8((a))
+
+#define ACPI_ROUND_UP_TO_1K(a) (((a) + 1023) >> 10)
+
+/* Generic (non-power-of-two) rounding */
+
+#define ACPI_ROUND_UP_TO(value,boundary) (((value) + ((boundary)-1)) / (boundary))
+
+#define ACPI_IS_MISALIGNED(value) (((ACPI_NATIVE_UINT)value) & (sizeof(ACPI_NATIVE_UINT)-1))
+
+/*
+ * Bitmask creation
+ * Bit positions start at zero.
+ * MASK_BITS_ABOVE creates a mask starting AT the position and above
+ * MASK_BITS_BELOW creates a mask starting one bit BELOW the position
+ */
+#define ACPI_MASK_BITS_ABOVE(position) (~((ACPI_INTEGER_MAX) << ((UINT32) (position))))
+#define ACPI_MASK_BITS_BELOW(position) ((ACPI_INTEGER_MAX) << ((UINT32) (position)))
+
+#define ACPI_IS_OCTAL_DIGIT(d) (((char)(d) >= '0') && ((char)(d) <= '7'))
+
+
+/* Bitfields within ACPI registers */
+
+#define ACPI_REGISTER_PREPARE_BITS(Val, Pos, Mask) ((Val << Pos) & Mask)
+#define ACPI_REGISTER_INSERT_VALUE(Reg, Pos, Mask, Val) Reg = (Reg & (~(Mask))) | ACPI_REGISTER_PREPARE_BITS(Val, Pos, Mask)
+
+#define ACPI_INSERT_BITS(Target, Mask, Source) Target = ((Target & (~(Mask))) | (Source & Mask))
+
+/* Generate a UUID */
+
+#define ACPI_INIT_UUID(a,b,c,d0,d1,d2,d3,d4,d5,d6,d7) \
+ (a) & 0xFF, ((a) >> 8) & 0xFF, ((a) >> 16) & 0xFF, ((a) >> 24) & 0xFF, \
+ (b) & 0xFF, ((b) >> 8) & 0xFF, \
+ (c) & 0xFF, ((c) >> 8) & 0xFF, \
+ (d0), (d1), (d2), (d3), (d4), (d5), (d6), (d7)
+
+/*
+ * An ACPI_NAMESPACE_NODE * can appear in some contexts,
+ * where a pointer to an ACPI_OPERAND_OBJECT can also
+ * appear. This macro is used to distinguish them.
+ *
+ * The "Descriptor" field is the first field in both structures.
+ */
+#define ACPI_GET_DESCRIPTOR_TYPE(d) (((ACPI_DESCRIPTOR *)(void *)(d))->Common.DescriptorType)
+#define ACPI_SET_DESCRIPTOR_TYPE(d,t) (((ACPI_DESCRIPTOR *)(void *)(d))->Common.DescriptorType = t)
+
+
+/* Macro to test the object type */
+
+#define ACPI_GET_OBJECT_TYPE(d) (((ACPI_OPERAND_OBJECT *)(void *)(d))->Common.Type)
+
+/* Macro to check the table flags for SINGLE or MULTIPLE tables are allowed */
+
+#define ACPI_IS_SINGLE_TABLE(x) (((x) & 0x01) == ACPI_TABLE_SINGLE ? 1 : 0)
+
+/*
+ * Macros for the master AML opcode table
+ */
+#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT)
+#define ACPI_OP(Name,PArgs,IArgs,ObjType,Class,Type,Flags) {Name,(UINT32)(PArgs),(UINT32)(IArgs),(UINT32)(Flags),ObjType,Class,Type}
+#else
+#define ACPI_OP(Name,PArgs,IArgs,ObjType,Class,Type,Flags) {(UINT32)(PArgs),(UINT32)(IArgs),(UINT32)(Flags),ObjType,Class,Type}
+#endif
+
+#ifdef ACPI_DISASSEMBLER
+#define ACPI_DISASM_ONLY_MEMBERS(a) a;
+#else
+#define ACPI_DISASM_ONLY_MEMBERS(a)
+#endif
+
+#define ARG_TYPE_WIDTH 5
+#define ARG_1(x) ((UINT32)(x))
+#define ARG_2(x) ((UINT32)(x) << (1 * ARG_TYPE_WIDTH))
+#define ARG_3(x) ((UINT32)(x) << (2 * ARG_TYPE_WIDTH))
+#define ARG_4(x) ((UINT32)(x) << (3 * ARG_TYPE_WIDTH))
+#define ARG_5(x) ((UINT32)(x) << (4 * ARG_TYPE_WIDTH))
+#define ARG_6(x) ((UINT32)(x) << (5 * ARG_TYPE_WIDTH))
+
+#define ARGI_LIST1(a) (ARG_1(a))
+#define ARGI_LIST2(a,b) (ARG_1(b)|ARG_2(a))
+#define ARGI_LIST3(a,b,c) (ARG_1(c)|ARG_2(b)|ARG_3(a))
+#define ARGI_LIST4(a,b,c,d) (ARG_1(d)|ARG_2(c)|ARG_3(b)|ARG_4(a))
+#define ARGI_LIST5(a,b,c,d,e) (ARG_1(e)|ARG_2(d)|ARG_3(c)|ARG_4(b)|ARG_5(a))
+#define ARGI_LIST6(a,b,c,d,e,f) (ARG_1(f)|ARG_2(e)|ARG_3(d)|ARG_4(c)|ARG_5(b)|ARG_6(a))
+
+#define ARGP_LIST1(a) (ARG_1(a))
+#define ARGP_LIST2(a,b) (ARG_1(a)|ARG_2(b))
+#define ARGP_LIST3(a,b,c) (ARG_1(a)|ARG_2(b)|ARG_3(c))
+#define ARGP_LIST4(a,b,c,d) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d))
+#define ARGP_LIST5(a,b,c,d,e) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e))
+#define ARGP_LIST6(a,b,c,d,e,f) (ARG_1(a)|ARG_2(b)|ARG_3(c)|ARG_4(d)|ARG_5(e)|ARG_6(f))
+
+#define GET_CURRENT_ARG_TYPE(List) (List & ((UINT32) 0x1F))
+#define INCREMENT_ARG_LIST(List) (List >>= ((UINT32) ARG_TYPE_WIDTH))
+
+
+#if defined (ACPI_DEBUG_OUTPUT) || !defined (ACPI_NO_ERROR_MESSAGES)
+/*
+ * Module name is include in both debug and non-debug versions primarily for
+ * error messages. The __FILE__ macro is not very useful for this, because it
+ * often includes the entire pathname to the module
+ */
+#define ACPI_MODULE_NAME(Name) static char ACPI_UNUSED_VAR *_AcpiModuleName = Name;
+#else
+#define ACPI_MODULE_NAME(Name)
+#endif
+
+/*
+ * Ascii error messages can be configured out
+ */
+#ifndef ACPI_NO_ERROR_MESSAGES
+#define AE_INFO _AcpiModuleName, __LINE__
+
+/*
+ * Error reporting. Callers module and line number are inserted by AE_INFO,
+ * the plist contains a set of parens to allow variable-length lists.
+ * These macros are used for both the debug and non-debug versions of the code.
+ */
+#define ACPI_INFO(plist) AcpiUtInfo plist
+#define ACPI_WARNING(plist) AcpiUtWarning plist
+#define ACPI_EXCEPTION(plist) AcpiUtException plist
+#define ACPI_ERROR(plist) AcpiUtError plist
+#define ACPI_ERROR_NAMESPACE(s,e) AcpiNsReportError (AE_INFO, s, e);
+#define ACPI_ERROR_METHOD(s,n,p,e) AcpiNsReportMethodError (AE_INFO, s, n, p, e);
+
+#else
+
+/* No error messages */
+
+#define ACPI_INFO(plist)
+#define ACPI_WARNING(plist)
+#define ACPI_EXCEPTION(plist)
+#define ACPI_ERROR(plist)
+#define ACPI_ERROR_NAMESPACE(s,e)
+#define ACPI_ERROR_METHOD(s,n,p,e)
+#endif
+
+/*
+ * Debug macros that are conditionally compiled
+ */
+#ifdef ACPI_DEBUG_OUTPUT
+
+/*
+ * Common parameters used for debug output functions:
+ * line number, function name, module(file) name, component ID
+ */
+#define ACPI_DEBUG_PARAMETERS __LINE__, ACPI_GET_FUNCTION_NAME, _AcpiModuleName, _COMPONENT
+
+/*
+ * Function entry tracing
+ */
+
+/*
+ * If ACPI_GET_FUNCTION_NAME was not defined in the compiler-dependent header,
+ * define it now. This is the case where there the compiler does not support
+ * a __FUNCTION__ macro or equivalent. We save the function name on the
+ * local stack.
+ */
+#ifndef ACPI_GET_FUNCTION_NAME
+#define ACPI_GET_FUNCTION_NAME _AcpiFunctionName
+/*
+ * The Name parameter should be the procedure name as a quoted string.
+ * This is declared as a local string ("MyFunctionName") so that it can
+ * be also used by the function exit macros below.
+ * Note: (const char) is used to be compatible with the debug interfaces
+ * and macros such as __FUNCTION__.
+ */
+#define ACPI_FUNCTION_NAME(Name) const char *_AcpiFunctionName = #Name;
+
+#else
+/* Compiler supports __FUNCTION__ (or equivalent) -- Ignore this macro */
+
+#define ACPI_FUNCTION_NAME(Name)
+#endif
+
+#define ACPI_FUNCTION_TRACE(a) ACPI_FUNCTION_NAME(a) \
+ AcpiUtTrace(ACPI_DEBUG_PARAMETERS)
+#define ACPI_FUNCTION_TRACE_PTR(a,b) ACPI_FUNCTION_NAME(a) \
+ AcpiUtTracePtr(ACPI_DEBUG_PARAMETERS,(void *)b)
+#define ACPI_FUNCTION_TRACE_U32(a,b) ACPI_FUNCTION_NAME(a) \
+ AcpiUtTraceU32(ACPI_DEBUG_PARAMETERS,(UINT32)b)
+#define ACPI_FUNCTION_TRACE_STR(a,b) ACPI_FUNCTION_NAME(a) \
+ AcpiUtTraceStr(ACPI_DEBUG_PARAMETERS,(char *)b)
+
+#define ACPI_FUNCTION_ENTRY() AcpiUtTrackStackPtr()
+
+/*
+ * Function exit tracing.
+ * WARNING: These macros include a return statement. This is usually considered
+ * bad form, but having a separate exit macro is very ugly and difficult to maintain.
+ * One of the FUNCTION_TRACE macros above must be used in conjunction with these macros
+ * so that "_AcpiFunctionName" is defined.
+ *
+ * Note: the DO_WHILE0 macro is used to prevent some compilers from complaining
+ * about these constructs.
+ */
+#ifdef ACPI_USE_DO_WHILE_0
+#define ACPI_DO_WHILE0(a) do a while(0)
+#else
+#define ACPI_DO_WHILE0(a) a
+#endif
+
+#define return_VOID ACPI_DO_WHILE0 ({ \
+ AcpiUtExit (ACPI_DEBUG_PARAMETERS); \
+ return;})
+/*
+ * There are two versions of most of the return macros. The default version is
+ * safer, since it avoids side-effects by guaranteeing that the argument will
+ * not be evaluated twice.
+ *
+ * A less-safe version of the macros is provided for optional use if the
+ * compiler uses excessive CPU stack (for example, this may happen in the
+ * debug case if code optimzation is disabled.)
+ */
+#ifndef ACPI_SIMPLE_RETURN_MACROS
+
+#define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({ \
+ register ACPI_STATUS _s = (s); \
+ AcpiUtStatusExit (ACPI_DEBUG_PARAMETERS, _s); \
+ return (_s); })
+#define return_PTR(s) ACPI_DO_WHILE0 ({ \
+ register void *_s = (void *) (s); \
+ AcpiUtPtrExit (ACPI_DEBUG_PARAMETERS, (UINT8 *) _s); \
+ return (_s); })
+#define return_VALUE(s) ACPI_DO_WHILE0 ({ \
+ register ACPI_INTEGER _s = (s); \
+ AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, _s); \
+ return (_s); })
+#define return_UINT8(s) ACPI_DO_WHILE0 ({ \
+ register UINT8 _s = (UINT8) (s); \
+ AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (ACPI_INTEGER) _s); \
+ return (_s); })
+#define return_UINT32(s) ACPI_DO_WHILE0 ({ \
+ register UINT32 _s = (UINT32) (s); \
+ AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (ACPI_INTEGER) _s); \
+ return (_s); })
+#else /* Use original less-safe macros */
+
+#define return_ACPI_STATUS(s) ACPI_DO_WHILE0 ({ \
+ AcpiUtStatusExit (ACPI_DEBUG_PARAMETERS, (s)); \
+ return((s)); })
+#define return_PTR(s) ACPI_DO_WHILE0 ({ \
+ AcpiUtPtrExit (ACPI_DEBUG_PARAMETERS, (UINT8 *) (s)); \
+ return((s)); })
+#define return_VALUE(s) ACPI_DO_WHILE0 ({ \
+ AcpiUtValueExit (ACPI_DEBUG_PARAMETERS, (ACPI_INTEGER) (s)); \
+ return((s)); })
+#define return_UINT8(s) return_VALUE(s)
+#define return_UINT32(s) return_VALUE(s)
+
+#endif /* ACPI_SIMPLE_RETURN_MACROS */
+
+
+/* Conditional execution */
+
+#define ACPI_DEBUG_EXEC(a) a
+#define ACPI_NORMAL_EXEC(a)
+
+#define ACPI_DEBUG_DEFINE(a) a;
+#define ACPI_DEBUG_ONLY_MEMBERS(a) a;
+#define _VERBOSE_STRUCTURES
+
+
+/* Stack and buffer dumping */
+
+#define ACPI_DUMP_STACK_ENTRY(a) AcpiExDumpOperand((a),0)
+#define ACPI_DUMP_OPERANDS(a,b,c,d,e) AcpiExDumpOperands(a,b,c,d,e,_AcpiModuleName,__LINE__)
+
+
+#define ACPI_DUMP_ENTRY(a,b) AcpiNsDumpEntry (a,b)
+#define ACPI_DUMP_PATHNAME(a,b,c,d) AcpiNsDumpPathname(a,b,c,d)
+#define ACPI_DUMP_RESOURCE_LIST(a) AcpiRsDumpResourceList(a)
+#define ACPI_DUMP_BUFFER(a,b) AcpiUtDumpBuffer((UINT8 *)a,b,DB_BYTE_DISPLAY,_COMPONENT)
+
+/*
+ * Master debug print macros
+ * Print iff:
+ * 1) Debug print for the current component is enabled
+ * 2) Debug error level or trace level for the print statement is enabled
+ */
+#define ACPI_DEBUG_PRINT(plist) AcpiUtDebugPrint plist
+#define ACPI_DEBUG_PRINT_RAW(plist) AcpiUtDebugPrintRaw plist
+
+
+#else
+/*
+ * This is the non-debug case -- make everything go away,
+ * leaving no executable debug code!
+ */
+#define ACPI_DEBUG_EXEC(a)
+#define ACPI_NORMAL_EXEC(a) a;
+
+#define ACPI_DEBUG_DEFINE(a)
+#define ACPI_DEBUG_ONLY_MEMBERS(a)
+#define ACPI_FUNCTION_NAME(a)
+#define ACPI_FUNCTION_TRACE(a)
+#define ACPI_FUNCTION_TRACE_PTR(a,b)
+#define ACPI_FUNCTION_TRACE_U32(a,b)
+#define ACPI_FUNCTION_TRACE_STR(a,b)
+#define ACPI_FUNCTION_EXIT
+#define ACPI_FUNCTION_STATUS_EXIT(s)
+#define ACPI_FUNCTION_VALUE_EXIT(s)
+#define ACPI_FUNCTION_ENTRY()
+#define ACPI_DUMP_STACK_ENTRY(a)
+#define ACPI_DUMP_OPERANDS(a,b,c,d,e)
+#define ACPI_DUMP_ENTRY(a,b)
+#define ACPI_DUMP_TABLES(a,b)
+#define ACPI_DUMP_PATHNAME(a,b,c,d)
+#define ACPI_DUMP_RESOURCE_LIST(a)
+#define ACPI_DUMP_BUFFER(a,b)
+#define ACPI_DEBUG_PRINT(pl)
+#define ACPI_DEBUG_PRINT_RAW(pl)
+
+#define return_VOID return
+#define return_ACPI_STATUS(s) return(s)
+#define return_VALUE(s) return(s)
+#define return_UINT8(s) return(s)
+#define return_UINT32(s) return(s)
+#define return_PTR(s) return(s)
+
+#endif
+
+/*
+ * Some code only gets executed when the debugger is built in.
+ * Note that this is entirely independent of whether the
+ * DEBUG_PRINT stuff (set by ACPI_DEBUG_OUTPUT) is on, or not.
+ */
+#ifdef ACPI_DEBUGGER
+#define ACPI_DEBUGGER_EXEC(a) a
+#else
+#define ACPI_DEBUGGER_EXEC(a)
+#endif
+
+
+#ifdef ACPI_DEBUG_OUTPUT
+/*
+ * 1) Set name to blanks
+ * 2) Copy the object name
+ */
+#define ACPI_ADD_OBJECT_NAME(a,b) ACPI_MEMSET (a->Common.Name, ' ', sizeof (a->Common.Name));\
+ ACPI_STRNCPY (a->Common.Name, AcpiGbl_NsTypeNames[b], sizeof (a->Common.Name))
+#else
+
+#define ACPI_ADD_OBJECT_NAME(a,b)
+#endif
+
+
+/*
+ * Memory allocation tracking (DEBUG ONLY)
+ */
+#ifndef ACPI_DBG_TRACK_ALLOCATIONS
+
+/* Memory allocation */
+
+#define ACPI_ALLOCATE(a) AcpiUtAllocate((ACPI_SIZE)(a),_COMPONENT,_AcpiModuleName,__LINE__)
+#define ACPI_ALLOCATE_ZEROED(a) AcpiUtAllocateZeroed((ACPI_SIZE)(a), _COMPONENT,_AcpiModuleName,__LINE__)
+#define ACPI_FREE(a) AcpiOsFree(a)
+#define ACPI_MEM_TRACKING(a)
+
+#else
+
+/* Memory allocation */
+
+#define ACPI_ALLOCATE(a) AcpiUtAllocateAndTrack((ACPI_SIZE)(a),_COMPONENT,_AcpiModuleName,__LINE__)
+#define ACPI_ALLOCATE_ZEROED(a) AcpiUtAllocateZeroedAndTrack((ACPI_SIZE)(a), _COMPONENT,_AcpiModuleName,__LINE__)
+#define ACPI_FREE(a) AcpiUtFreeAndTrack(a,_COMPONENT,_AcpiModuleName,__LINE__)
+#define ACPI_MEM_TRACKING(a) a
+
+#endif /* ACPI_DBG_TRACK_ALLOCATIONS */
+
+#endif /* ACMACROS_H */
diff --git a/sys/contrib/dev/acpica/acnames.h b/sys/contrib/dev/acpica/acnames.h
new file mode 100644
index 0000000..344a7cb
--- /dev/null
+++ b/sys/contrib/dev/acpica/acnames.h
@@ -0,0 +1,158 @@
+/******************************************************************************
+ *
+ * Name: acnames.h - Global names and strings
+ * $Revision: 1.7 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACNAMES_H__
+#define __ACNAMES_H__
+
+/* Method names - these methods can appear anywhere in the namespace */
+
+#define METHOD_NAME__HID "_HID"
+#define METHOD_NAME__CID "_CID"
+#define METHOD_NAME__UID "_UID"
+#define METHOD_NAME__ADR "_ADR"
+#define METHOD_NAME__INI "_INI"
+#define METHOD_NAME__STA "_STA"
+#define METHOD_NAME__REG "_REG"
+#define METHOD_NAME__SEG "_SEG"
+#define METHOD_NAME__BBN "_BBN"
+#define METHOD_NAME__PRT "_PRT"
+#define METHOD_NAME__CRS "_CRS"
+#define METHOD_NAME__PRS "_PRS"
+#define METHOD_NAME__PRW "_PRW"
+#define METHOD_NAME__SRS "_SRS"
+
+/* Method names - these methods must appear at the namespace root */
+
+#define METHOD_NAME__BFS "\\_BFS"
+#define METHOD_NAME__GTS "\\_GTS"
+#define METHOD_NAME__PTS "\\_PTS"
+#define METHOD_NAME__SST "\\_SI._SST"
+#define METHOD_NAME__WAK "\\_WAK"
+
+/* Definitions of the predefined namespace names */
+
+#define ACPI_UNKNOWN_NAME (UINT32) 0x3F3F3F3F /* Unknown name is "????" */
+#define ACPI_ROOT_NAME (UINT32) 0x5F5F5F5C /* Root name is "\___" */
+
+#define ACPI_PREFIX_MIXED (UINT32) 0x69706341 /* "Acpi" */
+#define ACPI_PREFIX_LOWER (UINT32) 0x69706361 /* "acpi" */
+
+#define ACPI_NS_ROOT_PATH "\\"
+#define ACPI_NS_SYSTEM_BUS "_SB_"
+
+#endif /* __ACNAMES_H__ */
+
+
diff --git a/sys/contrib/dev/acpica/acnamesp.h b/sys/contrib/dev/acpica/acnamesp.h
new file mode 100644
index 0000000..8d07fb3
--- /dev/null
+++ b/sys/contrib/dev/acpica/acnamesp.h
@@ -0,0 +1,493 @@
+/******************************************************************************
+ *
+ * Name: acnamesp.h - Namespace subcomponent prototypes and defines
+ * $Revision: 1.152 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACNAMESP_H__
+#define __ACNAMESP_H__
+
+
+/* To search the entire name space, pass this as SearchBase */
+
+#define ACPI_NS_ALL ((ACPI_HANDLE)0)
+
+/*
+ * Elements of AcpiNsProperties are bit significant
+ * and should be one-to-one with values of ACPI_OBJECT_TYPE
+ */
+#define ACPI_NS_NORMAL 0
+#define ACPI_NS_NEWSCOPE 1 /* a definition of this type opens a name scope */
+#define ACPI_NS_LOCAL 2 /* suppress search of enclosing scopes */
+
+/* Flags for AcpiNsLookup, AcpiNsSearchAndEnter */
+
+#define ACPI_NS_NO_UPSEARCH 0
+#define ACPI_NS_SEARCH_PARENT 0x01
+#define ACPI_NS_DONT_OPEN_SCOPE 0x02
+#define ACPI_NS_NO_PEER_SEARCH 0x04
+#define ACPI_NS_ERROR_IF_FOUND 0x08
+#define ACPI_NS_PREFIX_IS_SCOPE 0x10
+#define ACPI_NS_EXTERNAL 0x20
+#define ACPI_NS_TEMPORARY 0x40
+
+/* Flags for AcpiNsWalkNamespace */
+
+#define ACPI_NS_WALK_NO_UNLOCK 0
+#define ACPI_NS_WALK_UNLOCK 0x01
+#define ACPI_NS_WALK_TEMP_NODES 0x02
+
+
+/*
+ * nsinit - Namespace initialization
+ */
+ACPI_STATUS
+AcpiNsInitializeObjects (
+ void);
+
+ACPI_STATUS
+AcpiNsInitializeDevices (
+ void);
+
+
+/*
+ * nsload - Namespace loading
+ */
+ACPI_STATUS
+AcpiNsLoadNamespace (
+ void);
+
+ACPI_STATUS
+AcpiNsLoadTable (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_NAMESPACE_NODE *Node);
+
+
+/*
+ * nswalk - walk the namespace
+ */
+ACPI_STATUS
+AcpiNsWalkNamespace (
+ ACPI_OBJECT_TYPE Type,
+ ACPI_HANDLE StartObject,
+ UINT32 MaxDepth,
+ UINT32 Flags,
+ ACPI_WALK_CALLBACK UserFunction,
+ void *Context,
+ void **ReturnValue);
+
+ACPI_NAMESPACE_NODE *
+AcpiNsGetNextNode (
+ ACPI_OBJECT_TYPE Type,
+ ACPI_NAMESPACE_NODE *Parent,
+ ACPI_NAMESPACE_NODE *Child);
+
+
+/*
+ * nsparse - table parsing
+ */
+ACPI_STATUS
+AcpiNsParseTable (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_NAMESPACE_NODE *StartNode);
+
+ACPI_STATUS
+AcpiNsOneCompleteParse (
+ ACPI_NATIVE_UINT PassNumber,
+ ACPI_NATIVE_UINT TableIndex);
+
+
+/*
+ * nsaccess - Top-level namespace access
+ */
+ACPI_STATUS
+AcpiNsRootInitialize (
+ void);
+
+ACPI_STATUS
+AcpiNsLookup (
+ ACPI_GENERIC_STATE *ScopeInfo,
+ char *Name,
+ ACPI_OBJECT_TYPE Type,
+ ACPI_INTERPRETER_MODE InterpreterMode,
+ UINT32 Flags,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE **RetNode);
+
+
+/*
+ * nsalloc - Named object allocation/deallocation
+ */
+ACPI_NAMESPACE_NODE *
+AcpiNsCreateNode (
+ UINT32 Name);
+
+void
+AcpiNsDeleteNode (
+ ACPI_NAMESPACE_NODE *Node);
+
+void
+AcpiNsDeleteNamespaceSubtree (
+ ACPI_NAMESPACE_NODE *ParentHandle);
+
+void
+AcpiNsDeleteNamespaceByOwner (
+ ACPI_OWNER_ID OwnerId);
+
+void
+AcpiNsDetachObject (
+ ACPI_NAMESPACE_NODE *Node);
+
+void
+AcpiNsDeleteChildren (
+ ACPI_NAMESPACE_NODE *Parent);
+
+int
+AcpiNsCompareNames (
+ char *Name1,
+ char *Name2);
+
+
+/*
+ * nsdump - Namespace dump/print utilities
+ */
+void
+AcpiNsDumpTables (
+ ACPI_HANDLE SearchBase,
+ UINT32 MaxDepth);
+
+void
+AcpiNsDumpEntry (
+ ACPI_HANDLE Handle,
+ UINT32 DebugLevel);
+
+void
+AcpiNsDumpPathname (
+ ACPI_HANDLE Handle,
+ char *Msg,
+ UINT32 Level,
+ UINT32 Component);
+
+void
+AcpiNsPrintPathname (
+ UINT32 NumSegments,
+ char *Pathname);
+
+ACPI_STATUS
+AcpiNsDumpOneObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue);
+
+void
+AcpiNsDumpObjects (
+ ACPI_OBJECT_TYPE Type,
+ UINT8 DisplayType,
+ UINT32 MaxDepth,
+ ACPI_OWNER_ID OwnerId,
+ ACPI_HANDLE StartHandle);
+
+
+/*
+ * nseval - Namespace evaluation functions
+ */
+ACPI_STATUS
+AcpiNsEvaluate (
+ ACPI_EVALUATE_INFO *Info);
+
+
+/*
+ * nsnames - Name and Scope manipulation
+ */
+UINT32
+AcpiNsOpensScope (
+ ACPI_OBJECT_TYPE Type);
+
+void
+AcpiNsBuildExternalPath (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_SIZE Size,
+ char *NameBuffer);
+
+char *
+AcpiNsGetExternalPathname (
+ ACPI_NAMESPACE_NODE *Node);
+
+char *
+AcpiNsNameOfCurrentScope (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiNsHandleToPathname (
+ ACPI_HANDLE TargetHandle,
+ ACPI_BUFFER *Buffer);
+
+BOOLEAN
+AcpiNsPatternMatch (
+ ACPI_NAMESPACE_NODE *ObjNode,
+ char *SearchFor);
+
+ACPI_STATUS
+AcpiNsGetNode (
+ ACPI_NAMESPACE_NODE *PrefixNode,
+ char *ExternalPathname,
+ UINT32 Flags,
+ ACPI_NAMESPACE_NODE **OutNode);
+
+ACPI_SIZE
+AcpiNsGetPathnameLength (
+ ACPI_NAMESPACE_NODE *Node);
+
+
+/*
+ * nsobject - Object management for namespace nodes
+ */
+ACPI_STATUS
+AcpiNsAttachObject (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OPERAND_OBJECT *Object,
+ ACPI_OBJECT_TYPE Type);
+
+ACPI_OPERAND_OBJECT *
+AcpiNsGetAttachedObject (
+ ACPI_NAMESPACE_NODE *Node);
+
+ACPI_OPERAND_OBJECT *
+AcpiNsGetSecondaryObject (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+ACPI_STATUS
+AcpiNsAttachData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_HANDLER Handler,
+ void *Data);
+
+ACPI_STATUS
+AcpiNsDetachData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_HANDLER Handler);
+
+ACPI_STATUS
+AcpiNsGetAttachedData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_HANDLER Handler,
+ void **Data);
+
+
+/*
+ * nssearch - Namespace searching and entry
+ */
+ACPI_STATUS
+AcpiNsSearchAndEnter (
+ UINT32 EntryName,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_INTERPRETER_MODE InterpreterMode,
+ ACPI_OBJECT_TYPE Type,
+ UINT32 Flags,
+ ACPI_NAMESPACE_NODE **RetNode);
+
+ACPI_STATUS
+AcpiNsSearchOneScope (
+ UINT32 EntryName,
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_TYPE Type,
+ ACPI_NAMESPACE_NODE **RetNode);
+
+void
+AcpiNsInstallNode (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *ParentNode,
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_TYPE Type);
+
+
+/*
+ * nsutils - Utility functions
+ */
+BOOLEAN
+AcpiNsValidRootPrefix (
+ char Prefix);
+
+ACPI_OBJECT_TYPE
+AcpiNsGetType (
+ ACPI_NAMESPACE_NODE *Node);
+
+UINT32
+AcpiNsLocal (
+ ACPI_OBJECT_TYPE Type);
+
+void
+AcpiNsReportError (
+ char *ModuleName,
+ UINT32 LineNumber,
+ char *InternalName,
+ ACPI_STATUS LookupStatus);
+
+void
+AcpiNsReportMethodError (
+ char *ModuleName,
+ UINT32 LineNumber,
+ char *Message,
+ ACPI_NAMESPACE_NODE *Node,
+ char *Path,
+ ACPI_STATUS LookupStatus);
+
+void
+AcpiNsPrintNodePathname (
+ ACPI_NAMESPACE_NODE *Node,
+ char *Msg);
+
+ACPI_STATUS
+AcpiNsBuildInternalName (
+ ACPI_NAMESTRING_INFO *Info);
+
+void
+AcpiNsGetInternalNameLength (
+ ACPI_NAMESTRING_INFO *Info);
+
+ACPI_STATUS
+AcpiNsInternalizeName (
+ char *DottedName,
+ char **ConvertedName);
+
+ACPI_STATUS
+AcpiNsExternalizeName (
+ UINT32 InternalNameLength,
+ char *InternalName,
+ UINT32 *ConvertedNameLength,
+ char **ConvertedName);
+
+ACPI_NAMESPACE_NODE *
+AcpiNsMapHandleToNode (
+ ACPI_HANDLE Handle);
+
+ACPI_HANDLE
+AcpiNsConvertEntryToHandle(
+ ACPI_NAMESPACE_NODE *Node);
+
+void
+AcpiNsTerminate (
+ void);
+
+ACPI_NAMESPACE_NODE *
+AcpiNsGetParentNode (
+ ACPI_NAMESPACE_NODE *Node);
+
+
+ACPI_NAMESPACE_NODE *
+AcpiNsGetNextValidNode (
+ ACPI_NAMESPACE_NODE *Node);
+
+#endif /* __ACNAMESP_H__ */
diff --git a/sys/contrib/dev/acpica/acobject.h b/sys/contrib/dev/acpica/acobject.h
new file mode 100644
index 0000000..a9d27eb
--- /dev/null
+++ b/sys/contrib/dev/acpica/acobject.h
@@ -0,0 +1,619 @@
+
+/******************************************************************************
+ *
+ * Name: acobject.h - Definition of ACPI_OPERAND_OBJECT (Internal object only)
+ * $Revision: 1.143 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef _ACOBJECT_H
+#define _ACOBJECT_H
+
+/* acpisrc:StructDefs -- for acpisrc conversion */
+
+
+/*
+ * The ACPI_OPERAND_OBJECT is used to pass AML operands from the dispatcher
+ * to the interpreter, and to keep track of the various handlers such as
+ * address space handlers and notify handlers. The object is a constant
+ * size in order to allow it to be cached and reused.
+ *
+ * Note: The object is optimized to be aligned and will not work if it is
+ * byte-packed.
+ */
+#if ACPI_MACHINE_WIDTH == 64
+#pragma pack(8)
+#else
+#pragma pack(4)
+#endif
+
+/*******************************************************************************
+ *
+ * Common Descriptors
+ *
+ ******************************************************************************/
+
+/*
+ * Common area for all objects.
+ *
+ * DescriptorType is used to differentiate between internal descriptors, and
+ * must be in the same place across all descriptors
+ *
+ * Note: The DescriptorType and Type fields must appear in the identical
+ * position in both the ACPI_NAMESPACE_NODE and ACPI_OPERAND_OBJECT
+ * structures.
+ */
+#define ACPI_OBJECT_COMMON_HEADER \
+ union acpi_operand_object *NextObject; /* Objects linked to parent NS node */\
+ UINT8 DescriptorType; /* To differentiate various internal objs */\
+ UINT8 Type; /* ACPI_OBJECT_TYPE */\
+ UINT16 ReferenceCount; /* For object deletion management */\
+ UINT8 Flags;
+ /*
+ * Note: There are 3 bytes available here before the
+ * next natural alignment boundary (for both 32/64 cases)
+ */
+
+/* Values for Flag byte above */
+
+#define AOPOBJ_AML_CONSTANT 0x01
+#define AOPOBJ_STATIC_POINTER 0x02
+#define AOPOBJ_DATA_VALID 0x04
+#define AOPOBJ_OBJECT_INITIALIZED 0x08
+#define AOPOBJ_SETUP_COMPLETE 0x10
+#define AOPOBJ_SINGLE_DATUM 0x20
+#define AOPOBJ_INVALID 0x40 /* Used if host OS won't allow an OpRegion address */
+
+
+/******************************************************************************
+ *
+ * Basic data types
+ *
+ *****************************************************************************/
+
+typedef struct acpi_object_common
+{
+ ACPI_OBJECT_COMMON_HEADER
+
+} ACPI_OBJECT_COMMON;
+
+
+typedef struct acpi_object_integer
+{
+ ACPI_OBJECT_COMMON_HEADER
+ UINT8 Fill[3]; /* Prevent warning on some compilers */
+ ACPI_INTEGER Value;
+
+} ACPI_OBJECT_INTEGER;
+
+
+/*
+ * Note: The String and Buffer object must be identical through the Pointer
+ * and length elements. There is code that depends on this.
+ *
+ * Fields common to both Strings and Buffers
+ */
+#define ACPI_COMMON_BUFFER_INFO(_Type) \
+ _Type *Pointer; \
+ UINT32 Length;
+
+
+typedef struct acpi_object_string /* Null terminated, ASCII characters only */
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_BUFFER_INFO (char) /* String in AML stream or allocated string */
+
+} ACPI_OBJECT_STRING;
+
+
+typedef struct acpi_object_buffer
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_BUFFER_INFO (UINT8) /* Buffer in AML stream or allocated buffer */
+ UINT32 AmlLength;
+ UINT8 *AmlStart;
+ ACPI_NAMESPACE_NODE *Node; /* Link back to parent node */
+
+} ACPI_OBJECT_BUFFER;
+
+
+typedef struct acpi_object_package
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_NAMESPACE_NODE *Node; /* Link back to parent node */
+ union acpi_operand_object **Elements; /* Array of pointers to AcpiObjects */
+ UINT8 *AmlStart;
+ UINT32 AmlLength;
+ UINT32 Count; /* # of elements in package */
+
+} ACPI_OBJECT_PACKAGE;
+
+
+/******************************************************************************
+ *
+ * Complex data types
+ *
+ *****************************************************************************/
+
+typedef struct acpi_object_event
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_SEMAPHORE OsSemaphore; /* Actual OS synchronization object */
+
+} ACPI_OBJECT_EVENT;
+
+
+typedef struct acpi_object_mutex
+{
+ ACPI_OBJECT_COMMON_HEADER
+ UINT8 SyncLevel; /* 0-15, specified in Mutex() call */
+ UINT16 AcquisitionDepth; /* Allow multiple Acquires, same thread */
+ ACPI_MUTEX OsMutex; /* Actual OS synchronization object */
+ ACPI_THREAD_ID ThreadId; /* Current owner of the mutex */
+ struct acpi_thread_state *OwnerThread; /* Current owner of the mutex */
+ union acpi_operand_object *Prev; /* Link for list of acquired mutexes */
+ union acpi_operand_object *Next; /* Link for list of acquired mutexes */
+ ACPI_NAMESPACE_NODE *Node; /* Containing namespace node */
+ UINT8 OriginalSyncLevel; /* Owner's original sync level (0-15) */
+
+} ACPI_OBJECT_MUTEX;
+
+
+typedef struct acpi_object_region
+{
+ ACPI_OBJECT_COMMON_HEADER
+ UINT8 SpaceId;
+ ACPI_NAMESPACE_NODE *Node; /* Containing namespace node */
+ union acpi_operand_object *Handler; /* Handler for region access */
+ union acpi_operand_object *Next;
+ ACPI_PHYSICAL_ADDRESS Address;
+ UINT32 Length;
+
+} ACPI_OBJECT_REGION;
+
+
+typedef struct acpi_object_method
+{
+ ACPI_OBJECT_COMMON_HEADER
+ UINT8 MethodFlags;
+ UINT8 ParamCount;
+ UINT8 SyncLevel;
+ union acpi_operand_object *Mutex;
+ UINT8 *AmlStart;
+ ACPI_INTERNAL_METHOD Implementation;
+ UINT32 AmlLength;
+ UINT8 ThreadCount;
+ ACPI_OWNER_ID OwnerId;
+
+} ACPI_OBJECT_METHOD;
+
+
+/******************************************************************************
+ *
+ * Objects that can be notified. All share a common NotifyInfo area.
+ *
+ *****************************************************************************/
+
+/*
+ * Common fields for objects that support ASL notifications
+ */
+#define ACPI_COMMON_NOTIFY_INFO \
+ union acpi_operand_object *SystemNotify; /* Handler for system notifies */\
+ union acpi_operand_object *DeviceNotify; /* Handler for driver notifies */\
+ union acpi_operand_object *Handler; /* Handler for Address space */
+
+
+typedef struct acpi_object_notify_common /* COMMON NOTIFY for POWER, PROCESSOR, DEVICE, and THERMAL */
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_NOTIFY_INFO
+
+} ACPI_OBJECT_NOTIFY_COMMON;
+
+
+typedef struct acpi_object_device
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_NOTIFY_INFO
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+
+} ACPI_OBJECT_DEVICE;
+
+
+typedef struct acpi_object_power_resource
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_NOTIFY_INFO
+ UINT32 SystemLevel;
+ UINT32 ResourceOrder;
+
+} ACPI_OBJECT_POWER_RESOURCE;
+
+
+typedef struct acpi_object_processor
+{
+ ACPI_OBJECT_COMMON_HEADER
+
+ /* The next two fields take advantage of the 3-byte space before NOTIFY_INFO */
+
+ UINT8 ProcId;
+ UINT8 Length;
+ ACPI_COMMON_NOTIFY_INFO
+ ACPI_IO_ADDRESS Address;
+
+} ACPI_OBJECT_PROCESSOR;
+
+
+typedef struct acpi_object_thermal_zone
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_NOTIFY_INFO
+
+} ACPI_OBJECT_THERMAL_ZONE;
+
+
+/******************************************************************************
+ *
+ * Fields. All share a common header/info field.
+ *
+ *****************************************************************************/
+
+/*
+ * Common bitfield for the field objects
+ * "Field Datum" -- a datum from the actual field object
+ * "Buffer Datum" -- a datum from a user buffer, read from or to be written to the field
+ */
+#define ACPI_COMMON_FIELD_INFO \
+ UINT8 FieldFlags; /* Access, update, and lock bits */\
+ UINT8 Attribute; /* From AccessAs keyword */\
+ UINT8 AccessByteWidth; /* Read/Write size in bytes */\
+ ACPI_NAMESPACE_NODE *Node; /* Link back to parent node */\
+ UINT32 BitLength; /* Length of field in bits */\
+ UINT32 BaseByteOffset; /* Byte offset within containing object */\
+ UINT32 Value; /* Value to store into the Bank or Index register */\
+ UINT8 StartFieldBitOffset;/* Bit offset within first field datum (0-63) */\
+ UINT8 AccessBitWidth; /* Read/Write size in bits (8-64) */
+
+
+typedef struct acpi_object_field_common /* COMMON FIELD (for BUFFER, REGION, BANK, and INDEX fields) */
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_FIELD_INFO
+ union acpi_operand_object *RegionObj; /* Parent Operation Region object (REGION/BANK fields only) */
+
+} ACPI_OBJECT_FIELD_COMMON;
+
+
+typedef struct acpi_object_region_field
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_FIELD_INFO
+ union acpi_operand_object *RegionObj; /* Containing OpRegion object */
+
+} ACPI_OBJECT_REGION_FIELD;
+
+
+typedef struct acpi_object_bank_field
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_FIELD_INFO
+ union acpi_operand_object *RegionObj; /* Containing OpRegion object */
+ union acpi_operand_object *BankObj; /* BankSelect Register object */
+
+} ACPI_OBJECT_BANK_FIELD;
+
+
+typedef struct acpi_object_index_field
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_FIELD_INFO
+
+ /*
+ * No "RegionObj" pointer needed since the Index and Data registers
+ * are each field definitions unto themselves.
+ */
+ union acpi_operand_object *IndexObj; /* Index register */
+ union acpi_operand_object *DataObj; /* Data register */
+
+} ACPI_OBJECT_INDEX_FIELD;
+
+
+/* The BufferField is different in that it is part of a Buffer, not an OpRegion */
+
+typedef struct acpi_object_buffer_field
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_COMMON_FIELD_INFO
+ union acpi_operand_object *BufferObj; /* Containing Buffer object */
+
+} ACPI_OBJECT_BUFFER_FIELD;
+
+
+/******************************************************************************
+ *
+ * Objects for handlers
+ *
+ *****************************************************************************/
+
+typedef struct acpi_object_notify_handler
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_NAMESPACE_NODE *Node; /* Parent device */
+ ACPI_NOTIFY_HANDLER Handler;
+ void *Context;
+
+} ACPI_OBJECT_NOTIFY_HANDLER;
+
+
+typedef struct acpi_object_addr_handler
+{
+ ACPI_OBJECT_COMMON_HEADER
+ UINT8 SpaceId;
+ UINT8 HandlerFlags;
+ ACPI_ADR_SPACE_HANDLER Handler;
+ ACPI_NAMESPACE_NODE *Node; /* Parent device */
+ void *Context;
+ ACPI_ADR_SPACE_SETUP Setup;
+ union acpi_operand_object *RegionList; /* regions using this handler */
+ union acpi_operand_object *Next;
+
+} ACPI_OBJECT_ADDR_HANDLER;
+
+/* Flags for address handler (HandlerFlags) */
+
+#define ACPI_ADDR_HANDLER_DEFAULT_INSTALLED 0x01
+
+
+/******************************************************************************
+ *
+ * Special internal objects
+ *
+ *****************************************************************************/
+
+/*
+ * The Reference object type is used for these opcodes:
+ * Arg[0-6], Local[0-7], IndexOp, NameOp, ZeroOp, OneOp, OnesOp, DebugOp
+ */
+typedef struct acpi_object_reference
+{
+ ACPI_OBJECT_COMMON_HEADER
+ UINT8 TargetType; /* Used for IndexOp */
+ UINT16 Opcode;
+ void *Object; /* NameOp=>HANDLE to obj, IndexOp=>ACPI_OPERAND_OBJECT */
+ ACPI_NAMESPACE_NODE *Node;
+ union acpi_operand_object **Where;
+ UINT32 Offset; /* Used for ArgOp, LocalOp, and IndexOp */
+
+} ACPI_OBJECT_REFERENCE;
+
+
+/*
+ * Extra object is used as additional storage for types that
+ * have AML code in their declarations (TermArgs) that must be
+ * evaluated at run time.
+ *
+ * Currently: Region and FieldUnit types
+ */
+typedef struct acpi_object_extra
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_NAMESPACE_NODE *Method_REG; /* _REG method for this region (if any) */
+ void *RegionContext; /* Region-specific data */
+ UINT8 *AmlStart;
+ UINT32 AmlLength;
+
+} ACPI_OBJECT_EXTRA;
+
+
+/* Additional data that can be attached to namespace nodes */
+
+typedef struct acpi_object_data
+{
+ ACPI_OBJECT_COMMON_HEADER
+ ACPI_OBJECT_HANDLER Handler;
+ void *Pointer;
+
+} ACPI_OBJECT_DATA;
+
+
+/* Structure used when objects are cached for reuse */
+
+typedef struct acpi_object_cache_list
+{
+ ACPI_OBJECT_COMMON_HEADER
+ union acpi_operand_object *Next; /* Link for object cache and internal lists*/
+
+} ACPI_OBJECT_CACHE_LIST;
+
+
+/******************************************************************************
+ *
+ * ACPI_OPERAND_OBJECT Descriptor - a giant union of all of the above
+ *
+ *****************************************************************************/
+
+typedef union acpi_operand_object
+{
+ ACPI_OBJECT_COMMON Common;
+ ACPI_OBJECT_INTEGER Integer;
+ ACPI_OBJECT_STRING String;
+ ACPI_OBJECT_BUFFER Buffer;
+ ACPI_OBJECT_PACKAGE Package;
+ ACPI_OBJECT_EVENT Event;
+ ACPI_OBJECT_METHOD Method;
+ ACPI_OBJECT_MUTEX Mutex;
+ ACPI_OBJECT_REGION Region;
+ ACPI_OBJECT_NOTIFY_COMMON CommonNotify;
+ ACPI_OBJECT_DEVICE Device;
+ ACPI_OBJECT_POWER_RESOURCE PowerResource;
+ ACPI_OBJECT_PROCESSOR Processor;
+ ACPI_OBJECT_THERMAL_ZONE ThermalZone;
+ ACPI_OBJECT_FIELD_COMMON CommonField;
+ ACPI_OBJECT_REGION_FIELD Field;
+ ACPI_OBJECT_BUFFER_FIELD BufferField;
+ ACPI_OBJECT_BANK_FIELD BankField;
+ ACPI_OBJECT_INDEX_FIELD IndexField;
+ ACPI_OBJECT_NOTIFY_HANDLER Notify;
+ ACPI_OBJECT_ADDR_HANDLER AddressSpace;
+ ACPI_OBJECT_REFERENCE Reference;
+ ACPI_OBJECT_EXTRA Extra;
+ ACPI_OBJECT_DATA Data;
+ ACPI_OBJECT_CACHE_LIST Cache;
+
+} ACPI_OPERAND_OBJECT;
+
+
+/******************************************************************************
+ *
+ * ACPI_DESCRIPTOR - objects that share a common descriptor identifier
+ *
+ *****************************************************************************/
+
+/* Object descriptor types */
+
+#define ACPI_DESC_TYPE_CACHED 0x01 /* Used only when object is cached */
+#define ACPI_DESC_TYPE_STATE 0x02
+#define ACPI_DESC_TYPE_STATE_UPDATE 0x03
+#define ACPI_DESC_TYPE_STATE_PACKAGE 0x04
+#define ACPI_DESC_TYPE_STATE_CONTROL 0x05
+#define ACPI_DESC_TYPE_STATE_RPSCOPE 0x06
+#define ACPI_DESC_TYPE_STATE_PSCOPE 0x07
+#define ACPI_DESC_TYPE_STATE_WSCOPE 0x08
+#define ACPI_DESC_TYPE_STATE_RESULT 0x09
+#define ACPI_DESC_TYPE_STATE_NOTIFY 0x0A
+#define ACPI_DESC_TYPE_STATE_THREAD 0x0B
+#define ACPI_DESC_TYPE_WALK 0x0C
+#define ACPI_DESC_TYPE_PARSER 0x0D
+#define ACPI_DESC_TYPE_OPERAND 0x0E
+#define ACPI_DESC_TYPE_NAMED 0x0F
+#define ACPI_DESC_TYPE_MAX 0x0F
+
+
+typedef struct acpi_common_descriptor
+{
+ void *CommonPointer;
+ UINT8 DescriptorType; /* To differentiate various internal objs */
+
+} ACPI_COMMON_DESCRIPTOR;
+
+typedef union acpi_descriptor
+{
+ ACPI_COMMON_DESCRIPTOR Common;
+ ACPI_OPERAND_OBJECT Object;
+ ACPI_NAMESPACE_NODE Node;
+ ACPI_PARSE_OBJECT Op;
+
+} ACPI_DESCRIPTOR;
+
+#pragma pack()
+
+#endif /* _ACOBJECT_H */
diff --git a/sys/contrib/dev/acpica/acopcode.h b/sys/contrib/dev/acpica/acopcode.h
new file mode 100644
index 0000000..557fa57
--- /dev/null
+++ b/sys/contrib/dev/acpica/acopcode.h
@@ -0,0 +1,398 @@
+/******************************************************************************
+ *
+ * Name: acopcode.h - AML opcode information for the AML parser and interpreter
+ * $Revision: 1.7 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACOPCODE_H__
+#define __ACOPCODE_H__
+
+#define MAX_EXTENDED_OPCODE 0x88
+#define NUM_EXTENDED_OPCODE (MAX_EXTENDED_OPCODE + 1)
+#define MAX_INTERNAL_OPCODE
+#define NUM_INTERNAL_OPCODE (MAX_INTERNAL_OPCODE + 1)
+
+/* Used for non-assigned opcodes */
+
+#define _UNK 0x6B
+
+/*
+ * Reserved ASCII characters. Do not use any of these for
+ * internal opcodes, since they are used to differentiate
+ * name strings from AML opcodes
+ */
+#define _ASC 0x6C
+#define _NAM 0x6C
+#define _PFX 0x6D
+
+
+/*
+ * All AML opcodes and the parse-time arguments for each. Used by the AML
+ * parser Each list is compressed into a 32-bit number and stored in the
+ * master opcode table (in psopcode.c).
+ */
+#define ARGP_ACCESSFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING)
+#define ARGP_ACQUIRE_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_WORDDATA)
+#define ARGP_ADD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_ALIAS_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_NAME)
+#define ARGP_ARG0 ARG_NONE
+#define ARGP_ARG1 ARG_NONE
+#define ARGP_ARG2 ARG_NONE
+#define ARGP_ARG3 ARG_NONE
+#define ARGP_ARG4 ARG_NONE
+#define ARGP_ARG5 ARG_NONE
+#define ARGP_ARG6 ARG_NONE
+#define ARGP_BANK_FIELD_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_TERMARG, ARGP_BYTEDATA, ARGP_FIELDLIST)
+#define ARGP_BIT_AND_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_BIT_NAND_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_BIT_NOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_BIT_NOT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_BIT_OR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_BIT_XOR_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_BREAK_OP ARG_NONE
+#define ARGP_BREAK_POINT_OP ARG_NONE
+#define ARGP_BUFFER_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_BYTELIST)
+#define ARGP_BYTE_OP ARGP_LIST1 (ARGP_BYTEDATA)
+#define ARGP_BYTELIST_OP ARGP_LIST1 (ARGP_NAMESTRING)
+#define ARGP_CONCAT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_CONCAT_RES_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_COND_REF_OF_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_SUPERNAME)
+#define ARGP_CONTINUE_OP ARG_NONE
+#define ARGP_COPY_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SIMPLENAME)
+#define ARGP_CREATE_BIT_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME)
+#define ARGP_CREATE_BYTE_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME)
+#define ARGP_CREATE_DWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME)
+#define ARGP_CREATE_FIELD_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME)
+#define ARGP_CREATE_QWORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME)
+#define ARGP_CREATE_WORD_FIELD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_NAME)
+#define ARGP_DATA_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_DEBUG_OP ARG_NONE
+#define ARGP_DECREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME)
+#define ARGP_DEREF_OF_OP ARGP_LIST1 (ARGP_TERMARG)
+#define ARGP_DEVICE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST)
+#define ARGP_DIVIDE_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET, ARGP_TARGET)
+#define ARGP_DWORD_OP ARGP_LIST1 (ARGP_DWORDDATA)
+#define ARGP_ELSE_OP ARGP_LIST2 (ARGP_PKGLENGTH, ARGP_TERMLIST)
+#define ARGP_EVENT_OP ARGP_LIST1 (ARGP_NAME)
+#define ARGP_FATAL_OP ARGP_LIST3 (ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_TERMARG)
+#define ARGP_FIELD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_BYTEDATA, ARGP_FIELDLIST)
+#define ARGP_FIND_SET_LEFT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_FIND_SET_RIGHT_BIT_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_FROM_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_IF_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST)
+#define ARGP_INCREMENT_OP ARGP_LIST1 (ARGP_SUPERNAME)
+#define ARGP_INDEX_FIELD_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAMESTRING, ARGP_NAMESTRING,ARGP_BYTEDATA, ARGP_FIELDLIST)
+#define ARGP_INDEX_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_LAND_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_LEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_LGREATER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_LGREATEREQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_LLESS_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_LLESSEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_LNOT_OP ARGP_LIST1 (ARGP_TERMARG)
+#define ARGP_LNOTEQUAL_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_LOAD_OP ARGP_LIST2 (ARGP_NAMESTRING, ARGP_SUPERNAME)
+#define ARGP_LOAD_TABLE_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_LOCAL0 ARG_NONE
+#define ARGP_LOCAL1 ARG_NONE
+#define ARGP_LOCAL2 ARG_NONE
+#define ARGP_LOCAL3 ARG_NONE
+#define ARGP_LOCAL4 ARG_NONE
+#define ARGP_LOCAL5 ARG_NONE
+#define ARGP_LOCAL6 ARG_NONE
+#define ARGP_LOCAL7 ARG_NONE
+#define ARGP_LOR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_MATCH_OP ARGP_LIST6 (ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_METHOD_OP ARGP_LIST4 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMLIST)
+#define ARGP_METHODCALL_OP ARGP_LIST1 (ARGP_NAMESTRING)
+#define ARGP_MID_OP ARGP_LIST4 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_MOD_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_MULTIPLY_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_MUTEX_OP ARGP_LIST2 (ARGP_NAME, ARGP_BYTEDATA)
+#define ARGP_NAME_OP ARGP_LIST2 (ARGP_NAME, ARGP_DATAOBJ)
+#define ARGP_NAMEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING)
+#define ARGP_NAMEPATH_OP ARGP_LIST1 (ARGP_NAMESTRING)
+#define ARGP_NOOP_OP ARG_NONE
+#define ARGP_NOTIFY_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG)
+#define ARGP_ONE_OP ARG_NONE
+#define ARGP_ONES_OP ARG_NONE
+#define ARGP_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_BYTEDATA, ARGP_DATAOBJLIST)
+#define ARGP_POWER_RES_OP ARGP_LIST5 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_WORDDATA, ARGP_OBJLIST)
+#define ARGP_PROCESSOR_OP ARGP_LIST6 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_BYTEDATA, ARGP_DWORDDATA, ARGP_BYTEDATA, ARGP_OBJLIST)
+#define ARGP_QWORD_OP ARGP_LIST1 (ARGP_QWORDDATA)
+#define ARGP_REF_OF_OP ARGP_LIST1 (ARGP_SUPERNAME)
+#define ARGP_REGION_OP ARGP_LIST4 (ARGP_NAME, ARGP_BYTEDATA, ARGP_TERMARG, ARGP_TERMARG)
+#define ARGP_RELEASE_OP ARGP_LIST1 (ARGP_SUPERNAME)
+#define ARGP_RESERVEDFIELD_OP ARGP_LIST1 (ARGP_NAMESTRING)
+#define ARGP_RESET_OP ARGP_LIST1 (ARGP_SUPERNAME)
+#define ARGP_RETURN_OP ARGP_LIST1 (ARGP_TERMARG)
+#define ARGP_REVISION_OP ARG_NONE
+#define ARGP_SCOPE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_TERMLIST)
+#define ARGP_SHIFT_LEFT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_SHIFT_RIGHT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_SIGNAL_OP ARGP_LIST1 (ARGP_SUPERNAME)
+#define ARGP_SIZE_OF_OP ARGP_LIST1 (ARGP_SUPERNAME)
+#define ARGP_SLEEP_OP ARGP_LIST1 (ARGP_TERMARG)
+#define ARGP_STALL_OP ARGP_LIST1 (ARGP_TERMARG)
+#define ARGP_STATICSTRING_OP ARGP_LIST1 (ARGP_NAMESTRING)
+#define ARGP_STORE_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_SUPERNAME)
+#define ARGP_STRING_OP ARGP_LIST1 (ARGP_CHARLIST)
+#define ARGP_SUBTRACT_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_THERMAL_ZONE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_NAME, ARGP_OBJLIST)
+#define ARGP_TIMER_OP ARG_NONE
+#define ARGP_TO_BCD_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_TO_BUFFER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_TO_DEC_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_TO_HEX_STR_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_TO_INTEGER_OP ARGP_LIST2 (ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_TO_STRING_OP ARGP_LIST3 (ARGP_TERMARG, ARGP_TERMARG, ARGP_TARGET)
+#define ARGP_TYPE_OP ARGP_LIST1 (ARGP_SUPERNAME)
+#define ARGP_UNLOAD_OP ARGP_LIST1 (ARGP_SUPERNAME)
+#define ARGP_VAR_PACKAGE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_DATAOBJLIST)
+#define ARGP_WAIT_OP ARGP_LIST2 (ARGP_SUPERNAME, ARGP_TERMARG)
+#define ARGP_WHILE_OP ARGP_LIST3 (ARGP_PKGLENGTH, ARGP_TERMARG, ARGP_TERMLIST)
+#define ARGP_WORD_OP ARGP_LIST1 (ARGP_WORDDATA)
+#define ARGP_ZERO_OP ARG_NONE
+
+
+/*
+ * All AML opcodes and the runtime arguments for each. Used by the AML
+ * interpreter Each list is compressed into a 32-bit number and stored
+ * in the master opcode table (in psopcode.c).
+ *
+ * (Used by PrepOperands procedure and the ASL Compiler)
+ */
+#define ARGI_ACCESSFIELD_OP ARGI_INVALID_OPCODE
+#define ARGI_ACQUIRE_OP ARGI_LIST2 (ARGI_MUTEX, ARGI_INTEGER)
+#define ARGI_ADD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_ALIAS_OP ARGI_INVALID_OPCODE
+#define ARGI_ARG0 ARG_NONE
+#define ARGI_ARG1 ARG_NONE
+#define ARGI_ARG2 ARG_NONE
+#define ARGI_ARG3 ARG_NONE
+#define ARGI_ARG4 ARG_NONE
+#define ARGI_ARG5 ARG_NONE
+#define ARGI_ARG6 ARG_NONE
+#define ARGI_BANK_FIELD_OP ARGI_INVALID_OPCODE
+#define ARGI_BIT_AND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_BIT_NAND_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_BIT_NOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_BIT_NOT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_BIT_OR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_BIT_XOR_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_BREAK_OP ARG_NONE
+#define ARGI_BREAK_POINT_OP ARG_NONE
+#define ARGI_BUFFER_OP ARGI_LIST1 (ARGI_INTEGER)
+#define ARGI_BYTE_OP ARGI_INVALID_OPCODE
+#define ARGI_BYTELIST_OP ARGI_INVALID_OPCODE
+#define ARGI_CONCAT_OP ARGI_LIST3 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA, ARGI_TARGETREF)
+#define ARGI_CONCAT_RES_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_BUFFER, ARGI_TARGETREF)
+#define ARGI_COND_REF_OF_OP ARGI_LIST2 (ARGI_OBJECT_REF, ARGI_TARGETREF)
+#define ARGI_CONTINUE_OP ARGI_INVALID_OPCODE
+#define ARGI_COPY_OP ARGI_LIST2 (ARGI_ANYTYPE, ARGI_SIMPLE_TARGET)
+#define ARGI_CREATE_BIT_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE)
+#define ARGI_CREATE_BYTE_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE)
+#define ARGI_CREATE_DWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE)
+#define ARGI_CREATE_FIELD_OP ARGI_LIST4 (ARGI_BUFFER, ARGI_INTEGER, ARGI_INTEGER, ARGI_REFERENCE)
+#define ARGI_CREATE_QWORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE)
+#define ARGI_CREATE_WORD_FIELD_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_REFERENCE)
+#define ARGI_DATA_REGION_OP ARGI_LIST3 (ARGI_STRING, ARGI_STRING, ARGI_STRING)
+#define ARGI_DEBUG_OP ARG_NONE
+#define ARGI_DECREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF)
+#define ARGI_DEREF_OF_OP ARGI_LIST1 (ARGI_REF_OR_STRING)
+#define ARGI_DEVICE_OP ARGI_INVALID_OPCODE
+#define ARGI_DIVIDE_OP ARGI_LIST4 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF, ARGI_TARGETREF)
+#define ARGI_DWORD_OP ARGI_INVALID_OPCODE
+#define ARGI_ELSE_OP ARGI_INVALID_OPCODE
+#define ARGI_EVENT_OP ARGI_INVALID_OPCODE
+#define ARGI_FATAL_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_INTEGER)
+#define ARGI_FIELD_OP ARGI_INVALID_OPCODE
+#define ARGI_FIND_SET_LEFT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_FIND_SET_RIGHT_BIT_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_FROM_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_FIXED_TARGET)
+#define ARGI_IF_OP ARGI_INVALID_OPCODE
+#define ARGI_INCREMENT_OP ARGI_LIST1 (ARGI_INTEGER_REF)
+#define ARGI_INDEX_FIELD_OP ARGI_INVALID_OPCODE
+#define ARGI_INDEX_OP ARGI_LIST3 (ARGI_COMPLEXOBJ, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_LAND_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER)
+#define ARGI_LEQUAL_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA)
+#define ARGI_LGREATER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA)
+#define ARGI_LGREATEREQUAL_OP ARGI_INVALID_OPCODE
+#define ARGI_LLESS_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_COMPUTEDATA)
+#define ARGI_LLESSEQUAL_OP ARGI_INVALID_OPCODE
+#define ARGI_LNOT_OP ARGI_LIST1 (ARGI_INTEGER)
+#define ARGI_LNOTEQUAL_OP ARGI_INVALID_OPCODE
+#define ARGI_LOAD_OP ARGI_LIST2 (ARGI_REGION_OR_BUFFER,ARGI_TARGETREF)
+#define ARGI_LOAD_TABLE_OP ARGI_LIST6 (ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_STRING, ARGI_ANYTYPE)
+#define ARGI_LOCAL0 ARG_NONE
+#define ARGI_LOCAL1 ARG_NONE
+#define ARGI_LOCAL2 ARG_NONE
+#define ARGI_LOCAL3 ARG_NONE
+#define ARGI_LOCAL4 ARG_NONE
+#define ARGI_LOCAL5 ARG_NONE
+#define ARGI_LOCAL6 ARG_NONE
+#define ARGI_LOCAL7 ARG_NONE
+#define ARGI_LOR_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER)
+#define ARGI_MATCH_OP ARGI_LIST6 (ARGI_PACKAGE, ARGI_INTEGER, ARGI_COMPUTEDATA, ARGI_INTEGER,ARGI_COMPUTEDATA,ARGI_INTEGER)
+#define ARGI_METHOD_OP ARGI_INVALID_OPCODE
+#define ARGI_METHODCALL_OP ARGI_INVALID_OPCODE
+#define ARGI_MID_OP ARGI_LIST4 (ARGI_BUFFER_OR_STRING,ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_MOD_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_MULTIPLY_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_MUTEX_OP ARGI_INVALID_OPCODE
+#define ARGI_NAME_OP ARGI_INVALID_OPCODE
+#define ARGI_NAMEDFIELD_OP ARGI_INVALID_OPCODE
+#define ARGI_NAMEPATH_OP ARGI_INVALID_OPCODE
+#define ARGI_NOOP_OP ARG_NONE
+#define ARGI_NOTIFY_OP ARGI_LIST2 (ARGI_DEVICE_REF, ARGI_INTEGER)
+#define ARGI_ONE_OP ARG_NONE
+#define ARGI_ONES_OP ARG_NONE
+#define ARGI_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER)
+#define ARGI_POWER_RES_OP ARGI_INVALID_OPCODE
+#define ARGI_PROCESSOR_OP ARGI_INVALID_OPCODE
+#define ARGI_QWORD_OP ARGI_INVALID_OPCODE
+#define ARGI_REF_OF_OP ARGI_LIST1 (ARGI_OBJECT_REF)
+#define ARGI_REGION_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_INTEGER)
+#define ARGI_RELEASE_OP ARGI_LIST1 (ARGI_MUTEX)
+#define ARGI_RESERVEDFIELD_OP ARGI_INVALID_OPCODE
+#define ARGI_RESET_OP ARGI_LIST1 (ARGI_EVENT)
+#define ARGI_RETURN_OP ARGI_INVALID_OPCODE
+#define ARGI_REVISION_OP ARG_NONE
+#define ARGI_SCOPE_OP ARGI_INVALID_OPCODE
+#define ARGI_SHIFT_LEFT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_SHIFT_RIGHT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_SIGNAL_OP ARGI_LIST1 (ARGI_EVENT)
+#define ARGI_SIZE_OF_OP ARGI_LIST1 (ARGI_DATAOBJECT)
+#define ARGI_SLEEP_OP ARGI_LIST1 (ARGI_INTEGER)
+#define ARGI_STALL_OP ARGI_LIST1 (ARGI_INTEGER)
+#define ARGI_STATICSTRING_OP ARGI_INVALID_OPCODE
+#define ARGI_STORE_OP ARGI_LIST2 (ARGI_DATAREFOBJ, ARGI_TARGETREF)
+#define ARGI_STRING_OP ARGI_INVALID_OPCODE
+#define ARGI_SUBTRACT_OP ARGI_LIST3 (ARGI_INTEGER, ARGI_INTEGER, ARGI_TARGETREF)
+#define ARGI_THERMAL_ZONE_OP ARGI_INVALID_OPCODE
+#define ARGI_TIMER_OP ARG_NONE
+#define ARGI_TO_BCD_OP ARGI_LIST2 (ARGI_INTEGER, ARGI_FIXED_TARGET)
+#define ARGI_TO_BUFFER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
+#define ARGI_TO_DEC_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
+#define ARGI_TO_HEX_STR_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
+#define ARGI_TO_INTEGER_OP ARGI_LIST2 (ARGI_COMPUTEDATA,ARGI_FIXED_TARGET)
+#define ARGI_TO_STRING_OP ARGI_LIST3 (ARGI_BUFFER, ARGI_INTEGER, ARGI_FIXED_TARGET)
+#define ARGI_TYPE_OP ARGI_LIST1 (ARGI_ANYTYPE)
+#define ARGI_UNLOAD_OP ARGI_LIST1 (ARGI_DDBHANDLE)
+#define ARGI_VAR_PACKAGE_OP ARGI_LIST1 (ARGI_INTEGER)
+#define ARGI_WAIT_OP ARGI_LIST2 (ARGI_EVENT, ARGI_INTEGER)
+#define ARGI_WHILE_OP ARGI_INVALID_OPCODE
+#define ARGI_WORD_OP ARGI_INVALID_OPCODE
+#define ARGI_ZERO_OP ARG_NONE
+
+#endif /* __ACOPCODE_H__ */
diff --git a/sys/contrib/dev/acpica/acoutput.h b/sys/contrib/dev/acpica/acoutput.h
new file mode 100644
index 0000000..ebd58c3
--- /dev/null
+++ b/sys/contrib/dev/acpica/acoutput.h
@@ -0,0 +1,263 @@
+/******************************************************************************
+ *
+ * Name: acoutput.h -- debug output
+ * $Revision: 1.101 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACOUTPUT_H__
+#define __ACOUTPUT_H__
+
+/*
+ * Debug levels and component IDs. These are used to control the
+ * granularity of the output of the DEBUG_PRINT macro -- on a per-
+ * component basis and a per-exception-type basis.
+ */
+
+/* Component IDs are used in the global "DebugLayer" */
+
+#define ACPI_UTILITIES 0x00000001
+#define ACPI_HARDWARE 0x00000002
+#define ACPI_EVENTS 0x00000004
+#define ACPI_TABLES 0x00000008
+#define ACPI_NAMESPACE 0x00000010
+#define ACPI_PARSER 0x00000020
+#define ACPI_DISPATCHER 0x00000040
+#define ACPI_EXECUTER 0x00000080
+#define ACPI_RESOURCES 0x00000100
+#define ACPI_CA_DEBUGGER 0x00000200
+#define ACPI_OS_SERVICES 0x00000400
+#define ACPI_CA_DISASSEMBLER 0x00000800
+
+/* Component IDs for ACPI tools and utilities */
+
+#define ACPI_COMPILER 0x00001000
+#define ACPI_TOOLS 0x00002000
+
+#define ACPI_ALL_COMPONENTS 0x00003FFF
+#define ACPI_COMPONENT_DEFAULT (ACPI_ALL_COMPONENTS)
+
+
+/* Component IDs reserved for ACPI drivers */
+
+#define ACPI_ALL_DRIVERS 0xFFFF0000
+
+
+/*
+ * Raw debug output levels, do not use these in the DEBUG_PRINT macros
+ */
+#define ACPI_LV_ERROR 0x00000001
+#define ACPI_LV_WARN 0x00000002
+#define ACPI_LV_INIT 0x00000004
+#define ACPI_LV_DEBUG_OBJECT 0x00000008
+#define ACPI_LV_INFO 0x00000010
+#define ACPI_LV_ALL_EXCEPTIONS 0x0000001F
+
+/* Trace verbosity level 1 [Standard Trace Level] */
+
+#define ACPI_LV_INIT_NAMES 0x00000020
+#define ACPI_LV_PARSE 0x00000040
+#define ACPI_LV_LOAD 0x00000080
+#define ACPI_LV_DISPATCH 0x00000100
+#define ACPI_LV_EXEC 0x00000200
+#define ACPI_LV_NAMES 0x00000400
+#define ACPI_LV_OPREGION 0x00000800
+#define ACPI_LV_BFIELD 0x00001000
+#define ACPI_LV_TABLES 0x00002000
+#define ACPI_LV_VALUES 0x00004000
+#define ACPI_LV_OBJECTS 0x00008000
+#define ACPI_LV_RESOURCES 0x00010000
+#define ACPI_LV_USER_REQUESTS 0x00020000
+#define ACPI_LV_PACKAGE 0x00040000
+#define ACPI_LV_VERBOSITY1 0x0007FF40 | ACPI_LV_ALL_EXCEPTIONS
+
+/* Trace verbosity level 2 [Function tracing and memory allocation] */
+
+#define ACPI_LV_ALLOCATIONS 0x00100000
+#define ACPI_LV_FUNCTIONS 0x00200000
+#define ACPI_LV_OPTIMIZATIONS 0x00400000
+#define ACPI_LV_VERBOSITY2 0x00700000 | ACPI_LV_VERBOSITY1
+#define ACPI_LV_ALL ACPI_LV_VERBOSITY2
+
+/* Trace verbosity level 3 [Threading, I/O, and Interrupts] */
+
+#define ACPI_LV_MUTEX 0x01000000
+#define ACPI_LV_THREADS 0x02000000
+#define ACPI_LV_IO 0x04000000
+#define ACPI_LV_INTERRUPTS 0x08000000
+#define ACPI_LV_VERBOSITY3 0x0F000000 | ACPI_LV_VERBOSITY2
+
+/* Exceptionally verbose output -- also used in the global "DebugLevel" */
+
+#define ACPI_LV_AML_DISASSEMBLE 0x10000000
+#define ACPI_LV_VERBOSE_INFO 0x20000000
+#define ACPI_LV_FULL_TABLES 0x40000000
+#define ACPI_LV_EVENTS 0x80000000
+
+#define ACPI_LV_VERBOSE 0xF0000000
+
+
+/*
+ * Debug level macros that are used in the DEBUG_PRINT macros
+ */
+#define ACPI_DEBUG_LEVEL(dl) (UINT32) dl,ACPI_DEBUG_PARAMETERS
+
+/* Exception level -- used in the global "DebugLevel" */
+
+#define ACPI_DB_INIT ACPI_DEBUG_LEVEL (ACPI_LV_INIT)
+#define ACPI_DB_DEBUG_OBJECT ACPI_DEBUG_LEVEL (ACPI_LV_DEBUG_OBJECT)
+#define ACPI_DB_INFO ACPI_DEBUG_LEVEL (ACPI_LV_INFO)
+#define ACPI_DB_ALL_EXCEPTIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALL_EXCEPTIONS)
+
+/*
+ * These two levels are essentially obsolete, all instances in the
+ * ACPICA core code have been replaced by ACPI_ERROR and ACPI_WARNING
+ * (Kept here because some drivers may still use them)
+ */
+#define ACPI_DB_ERROR ACPI_DEBUG_LEVEL (ACPI_LV_ERROR)
+#define ACPI_DB_WARN ACPI_DEBUG_LEVEL (ACPI_LV_WARN)
+
+/* Trace level -- also used in the global "DebugLevel" */
+
+#define ACPI_DB_INIT_NAMES ACPI_DEBUG_LEVEL (ACPI_LV_INIT_NAMES)
+#define ACPI_DB_THREADS ACPI_DEBUG_LEVEL (ACPI_LV_THREADS)
+#define ACPI_DB_PARSE ACPI_DEBUG_LEVEL (ACPI_LV_PARSE)
+#define ACPI_DB_DISPATCH ACPI_DEBUG_LEVEL (ACPI_LV_DISPATCH)
+#define ACPI_DB_LOAD ACPI_DEBUG_LEVEL (ACPI_LV_LOAD)
+#define ACPI_DB_EXEC ACPI_DEBUG_LEVEL (ACPI_LV_EXEC)
+#define ACPI_DB_NAMES ACPI_DEBUG_LEVEL (ACPI_LV_NAMES)
+#define ACPI_DB_OPREGION ACPI_DEBUG_LEVEL (ACPI_LV_OPREGION)
+#define ACPI_DB_BFIELD ACPI_DEBUG_LEVEL (ACPI_LV_BFIELD)
+#define ACPI_DB_TABLES ACPI_DEBUG_LEVEL (ACPI_LV_TABLES)
+#define ACPI_DB_FUNCTIONS ACPI_DEBUG_LEVEL (ACPI_LV_FUNCTIONS)
+#define ACPI_DB_OPTIMIZATIONS ACPI_DEBUG_LEVEL (ACPI_LV_OPTIMIZATIONS)
+#define ACPI_DB_VALUES ACPI_DEBUG_LEVEL (ACPI_LV_VALUES)
+#define ACPI_DB_OBJECTS ACPI_DEBUG_LEVEL (ACPI_LV_OBJECTS)
+#define ACPI_DB_ALLOCATIONS ACPI_DEBUG_LEVEL (ACPI_LV_ALLOCATIONS)
+#define ACPI_DB_RESOURCES ACPI_DEBUG_LEVEL (ACPI_LV_RESOURCES)
+#define ACPI_DB_IO ACPI_DEBUG_LEVEL (ACPI_LV_IO)
+#define ACPI_DB_INTERRUPTS ACPI_DEBUG_LEVEL (ACPI_LV_INTERRUPTS)
+#define ACPI_DB_USER_REQUESTS ACPI_DEBUG_LEVEL (ACPI_LV_USER_REQUESTS)
+#define ACPI_DB_PACKAGE ACPI_DEBUG_LEVEL (ACPI_LV_PACKAGE)
+#define ACPI_DB_MUTEX ACPI_DEBUG_LEVEL (ACPI_LV_MUTEX)
+
+#define ACPI_DB_ALL ACPI_DEBUG_LEVEL (ACPI_LV_ALL)
+
+
+/* Defaults for DebugLevel, debug and normal */
+
+#define ACPI_DEBUG_DEFAULT (ACPI_LV_INIT | ACPI_LV_WARN | ACPI_LV_ERROR | ACPI_LV_DEBUG_OBJECT)
+#define ACPI_NORMAL_DEFAULT (ACPI_LV_INIT | ACPI_LV_WARN | ACPI_LV_ERROR | ACPI_LV_DEBUG_OBJECT)
+#define ACPI_DEBUG_ALL (ACPI_LV_AML_DISASSEMBLE | ACPI_LV_ALL_EXCEPTIONS | ACPI_LV_ALL)
+
+
+#endif /* __ACOUTPUT_H__ */
diff --git a/sys/contrib/dev/acpica/acparser.h b/sys/contrib/dev/acpica/acparser.h
new file mode 100644
index 0000000..34b6bd1
--- /dev/null
+++ b/sys/contrib/dev/acpica/acparser.h
@@ -0,0 +1,403 @@
+/******************************************************************************
+ *
+ * Module Name: acparser.h - AML Parser subcomponent prototypes and defines
+ * $Revision: 1.83 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#ifndef __ACPARSER_H__
+#define __ACPARSER_H__
+
+
+#define OP_HAS_RETURN_VALUE 1
+
+/* Variable number of arguments. This field must be 32 bits */
+
+#define ACPI_VAR_ARGS ACPI_UINT32_MAX
+
+
+#define ACPI_PARSE_DELETE_TREE 0x0001
+#define ACPI_PARSE_NO_TREE_DELETE 0x0000
+#define ACPI_PARSE_TREE_MASK 0x0001
+
+#define ACPI_PARSE_LOAD_PASS1 0x0010
+#define ACPI_PARSE_LOAD_PASS2 0x0020
+#define ACPI_PARSE_EXECUTE 0x0030
+#define ACPI_PARSE_MODE_MASK 0x0030
+
+#define ACPI_PARSE_DEFERRED_OP 0x0100
+#define ACPI_PARSE_DISASSEMBLE 0x0200
+
+
+/******************************************************************************
+ *
+ * Parser interfaces
+ *
+ *****************************************************************************/
+
+
+/*
+ * psxface - Parser external interfaces
+ */
+ACPI_STATUS
+AcpiPsExecuteMethod (
+ ACPI_EVALUATE_INFO *Info);
+
+
+/*
+ * psargs - Parse AML opcode arguments
+ */
+UINT8 *
+AcpiPsGetNextPackageEnd (
+ ACPI_PARSE_STATE *ParserState);
+
+char *
+AcpiPsGetNextNamestring (
+ ACPI_PARSE_STATE *ParserState);
+
+void
+AcpiPsGetNextSimpleArg (
+ ACPI_PARSE_STATE *ParserState,
+ UINT32 ArgType,
+ ACPI_PARSE_OBJECT *Arg);
+
+ACPI_STATUS
+AcpiPsGetNextNamepath (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_STATE *ParserState,
+ ACPI_PARSE_OBJECT *Arg,
+ BOOLEAN MethodCall);
+
+ACPI_STATUS
+AcpiPsGetNextArg (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_STATE *ParserState,
+ UINT32 ArgType,
+ ACPI_PARSE_OBJECT **ReturnArg);
+
+
+/*
+ * psfind
+ */
+ACPI_PARSE_OBJECT *
+AcpiPsFindName (
+ ACPI_PARSE_OBJECT *Scope,
+ UINT32 Name,
+ UINT32 Opcode);
+
+ACPI_PARSE_OBJECT*
+AcpiPsGetParent (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * psopcode - AML Opcode information
+ */
+const ACPI_OPCODE_INFO *
+AcpiPsGetOpcodeInfo (
+ UINT16 Opcode);
+
+char *
+AcpiPsGetOpcodeName (
+ UINT16 Opcode);
+
+UINT8
+AcpiPsGetArgumentCount (
+ UINT32 OpType);
+
+
+/*
+ * psparse - top level parsing routines
+ */
+ACPI_STATUS
+AcpiPsParseAml (
+ ACPI_WALK_STATE *WalkState);
+
+UINT32
+AcpiPsGetOpcodeSize (
+ UINT32 Opcode);
+
+UINT16
+AcpiPsPeekOpcode (
+ ACPI_PARSE_STATE *state);
+
+ACPI_STATUS
+AcpiPsCompleteThisOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+ACPI_STATUS
+AcpiPsNextParseState (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_STATUS CallbackStatus);
+
+
+/*
+ * psloop - main parse loop
+ */
+ACPI_STATUS
+AcpiPsParseLoop (
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * psscope - Scope stack management routines
+ */
+ACPI_STATUS
+AcpiPsInitScope (
+ ACPI_PARSE_STATE *ParserState,
+ ACPI_PARSE_OBJECT *Root);
+
+ACPI_PARSE_OBJECT *
+AcpiPsGetParentScope (
+ ACPI_PARSE_STATE *state);
+
+BOOLEAN
+AcpiPsHasCompletedScope (
+ ACPI_PARSE_STATE *ParserState);
+
+void
+AcpiPsPopScope (
+ ACPI_PARSE_STATE *ParserState,
+ ACPI_PARSE_OBJECT **Op,
+ UINT32 *ArgList,
+ UINT32 *ArgCount);
+
+ACPI_STATUS
+AcpiPsPushScope (
+ ACPI_PARSE_STATE *ParserState,
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 RemainingArgs,
+ UINT32 ArgCount);
+
+void
+AcpiPsCleanupScope (
+ ACPI_PARSE_STATE *state);
+
+
+/*
+ * pstree - parse tree manipulation routines
+ */
+void
+AcpiPsAppendArg(
+ ACPI_PARSE_OBJECT *op,
+ ACPI_PARSE_OBJECT *arg);
+
+ACPI_PARSE_OBJECT*
+AcpiPsFind (
+ ACPI_PARSE_OBJECT *Scope,
+ char *Path,
+ UINT16 Opcode,
+ UINT32 Create);
+
+ACPI_PARSE_OBJECT *
+AcpiPsGetArg(
+ ACPI_PARSE_OBJECT *op,
+ UINT32 argn);
+
+ACPI_PARSE_OBJECT *
+AcpiPsGetDepthNext (
+ ACPI_PARSE_OBJECT *Origin,
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * pswalk - parse tree walk routines
+ */
+ACPI_STATUS
+AcpiPsWalkParsedAml (
+ ACPI_PARSE_OBJECT *StartOp,
+ ACPI_PARSE_OBJECT *EndOp,
+ ACPI_OPERAND_OBJECT *MthDesc,
+ ACPI_NAMESPACE_NODE *StartNode,
+ ACPI_OPERAND_OBJECT **Params,
+ ACPI_OPERAND_OBJECT **CallerReturnDesc,
+ ACPI_OWNER_ID OwnerId,
+ ACPI_PARSE_DOWNWARDS DescendingCallback,
+ ACPI_PARSE_UPWARDS AscendingCallback);
+
+ACPI_STATUS
+AcpiPsGetNextWalkOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_PARSE_UPWARDS AscendingCallback);
+
+ACPI_STATUS
+AcpiPsDeleteCompletedOp (
+ ACPI_WALK_STATE *WalkState);
+
+void
+AcpiPsDeleteParseTree (
+ ACPI_PARSE_OBJECT *root);
+
+
+/*
+ * psutils - parser utilities
+ */
+ACPI_PARSE_OBJECT *
+AcpiPsCreateScopeOp (
+ void);
+
+void
+AcpiPsInitOp (
+ ACPI_PARSE_OBJECT *op,
+ UINT16 opcode);
+
+ACPI_PARSE_OBJECT *
+AcpiPsAllocOp (
+ UINT16 opcode);
+
+void
+AcpiPsFreeOp (
+ ACPI_PARSE_OBJECT *Op);
+
+BOOLEAN
+AcpiPsIsLeadingChar (
+ UINT32 c);
+
+BOOLEAN
+AcpiPsIsPrefixChar (
+ UINT32 c);
+
+UINT32
+AcpiPsGetName(
+ ACPI_PARSE_OBJECT *op);
+
+void
+AcpiPsSetName(
+ ACPI_PARSE_OBJECT *op,
+ UINT32 name);
+
+
+/*
+ * psdump - display parser tree
+ */
+UINT32
+AcpiPsSprintPath (
+ char *BufferStart,
+ UINT32 BufferSize,
+ ACPI_PARSE_OBJECT *Op);
+
+UINT32
+AcpiPsSprintOp (
+ char *BufferStart,
+ UINT32 BufferSize,
+ ACPI_PARSE_OBJECT *Op);
+
+void
+AcpiPsShow (
+ ACPI_PARSE_OBJECT *op);
+
+
+#endif /* __ACPARSER_H__ */
diff --git a/sys/contrib/dev/acpica/acpi.h b/sys/contrib/dev/acpica/acpi.h
new file mode 100644
index 0000000..b0f7848
--- /dev/null
+++ b/sys/contrib/dev/acpica/acpi.h
@@ -0,0 +1,143 @@
+/******************************************************************************
+ *
+ * Name: acpi.h - Master include file, Publics and external data.
+ * $Revision: 1.61 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACPI_H__
+#define __ACPI_H__
+
+/*
+ * Common includes for all ACPI driver files
+ * We put them here because we don't want to duplicate them
+ * in the rest of the source code again and again.
+ */
+#include <contrib/dev/acpica/acnames.h> /* Global ACPI names and strings */
+#include <contrib/dev/acpica/acconfig.h> /* Configuration constants */
+#include <contrib/dev/acpica/acenv.h> /* Target environment specific items */
+#include <contrib/dev/acpica/actypes.h> /* Fundamental common data types */
+#include <contrib/dev/acpica/acexcep.h> /* ACPI exception codes */
+#include <contrib/dev/acpica/acmacros.h> /* C macros */
+#include <contrib/dev/acpica/actbl.h> /* ACPI table definitions */
+#include <contrib/dev/acpica/aclocal.h> /* Internal data types */
+#include <contrib/dev/acpica/acoutput.h> /* Error output and Debug macros */
+#include <contrib/dev/acpica/acpiosxf.h> /* Interfaces to the ACPI-to-OS layer*/
+#include <contrib/dev/acpica/acpixf.h> /* ACPI core subsystem external interfaces */
+#include <contrib/dev/acpica/acobject.h> /* ACPI internal object */
+#include <contrib/dev/acpica/acstruct.h> /* Common structures */
+#include <contrib/dev/acpica/acglobal.h> /* All global variables */
+#include <contrib/dev/acpica/achware.h> /* Hardware defines and interfaces */
+#include <contrib/dev/acpica/acutils.h> /* Utility interfaces */
+
+
+#endif /* __ACPI_H__ */
diff --git a/sys/contrib/dev/acpica/acpica_prep.sh b/sys/contrib/dev/acpica/acpica_prep.sh
new file mode 100755
index 0000000..353975e
--- /dev/null
+++ b/sys/contrib/dev/acpica/acpica_prep.sh
@@ -0,0 +1,92 @@
+#!/bin/sh
+# $FreeBSD$
+#
+# Unpack an ACPI CA drop and restructure it to fit the FreeBSD layout
+#
+
+if [ ! $# -eq 1 ]; then
+ echo "usage: $0 acpica_archive"
+ exit
+fi
+
+src=$1
+wrk=./_acpi_ca_unpack
+dst=./acpi_ca_destination
+
+# files that should keep their full directory path
+fulldirs="common compiler"
+# files to remove
+stripdirs="generate acpisrc"
+stripfiles="16bit.h Makefile README a16find.c a16utils.asm a16utils.obj \
+ acdos16.h acintel.h aclinux.h acmsvc.h acnetbsd.h acpixtract.c \
+ acwin.h acwin64.h aeexec.c aemain.c osdosxf.c osunixdir.c \
+ oswindir.c oswinxf.c readme.txt"
+# include files to canonify
+src_headers="acapps.h acconfig.h acdebug.h acdisasm.h acdispat.h \
+ acenv.h acevents.h acexcep.h acfreebsd.h acgcc.h acglobal.h \
+ achware.h acinterp.h aclocal.h acmacros.h acnames.h acnamesp.h \
+ acobject.h acopcode.h acoutput.h acparser.h acpi.h acpiosxf.h \
+ acpixf.h acresrc.h acstruct.h actables.h actbl.h actbl1.h \
+ actbl2.h actypes.h acutils.h aecommon.h amlcode.h amlresrc.h"
+comp_headers="aslcompiler.h asldefine.h aslglobal.h asltypes.h"
+
+# files to update paths in
+src_update_files="acpi.h acpiosxf.h"
+
+# pre-clean
+echo pre-clean
+rm -rf ${wrk}
+rm -rf ${dst}
+mkdir -p ${wrk}
+mkdir -p ${dst}
+
+# unpack
+echo unpack
+tar -x -z -f ${src} -C ${wrk}
+
+# strip files
+echo strip
+for i in ${stripdirs}; do
+ find ${wrk} -name ${i} -type d | xargs rm -r
+done
+for i in ${stripfiles}; do
+ find ${wrk} -name ${i} -type f -delete
+done
+
+echo copying full dirs
+for i in ${fulldirs}; do
+ find ${wrk} -name ${i} -type d | xargs -J % mv % ${dst}
+done
+
+# move files to destination
+echo copying flat dirs
+find ${wrk} -type f | xargs -J % mv % ${dst}
+mv ${dst}/changes.txt ${dst}/CHANGES.txt
+
+# update src/headers for appropriate paths
+echo updating paths
+for i in ${src_update_files}; do
+ i=${dst}/$i
+ sed -e 's/platform\///' $i > $i.new && mv $i.new $i
+done
+
+# canonify include paths
+for H in ${src_headers}; do
+ find ${dst} -name "*.[chy]" -type f | \
+ xargs sed -i "" -e "s|[\"<]$H[\">]|\<contrib/dev/acpica/$H\>|g"
+done
+for H in ${comp_headers}; do
+ find ${dst}/compiler -name "*.[chly]" -type f | \
+ xargs sed -i "" -e "s|[\"<]$H[\">]|\<contrib/dev/acpica/compiler/$H\>|g"
+done
+
+# post-clean
+echo post-clean
+rm -rf ${wrk}
+
+# assist the developer in generating a diff
+echo "Directories you may want to 'cvs diff':"
+echo " src/sys/contrib/dev/acpica src/sys/dev/acpica \\"
+echo " src/sys/amd64/acpica src/sys/i386/acpica src/sys/ia64/acpica \\"
+echo " src/sys/amd64/include src/sys/i386/include src/sys/ia64/include \\"
+echo " src/sys/boot src/sys/conf src/sys/modules/acpi src/usr.sbin/acpi"
diff --git a/sys/contrib/dev/acpica/acpiosxf.h b/sys/contrib/dev/acpica/acpiosxf.h
new file mode 100644
index 0000000..69997d8
--- /dev/null
+++ b/sys/contrib/dev/acpica/acpiosxf.h
@@ -0,0 +1,504 @@
+
+/******************************************************************************
+ *
+ * Name: acpiosxf.h - All interfaces to the OS Services Layer (OSL). These
+ * interfaces must be implemented by OSL to interface the
+ * ACPI components to the host operating system.
+ *
+ *****************************************************************************/
+
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exer
+ se the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACPIOSXF_H__
+#define __ACPIOSXF_H__
+
+#include <contrib/dev/acpica/acenv.h>
+#include <contrib/dev/acpica/actypes.h>
+
+
+/* Types for AcpiOsExecute */
+
+typedef enum
+{
+ OSL_GLOBAL_LOCK_HANDLER,
+ OSL_NOTIFY_HANDLER,
+ OSL_GPE_HANDLER,
+ OSL_DEBUGGER_THREAD,
+ OSL_EC_POLL_HANDLER,
+ OSL_EC_BURST_HANDLER
+
+} ACPI_EXECUTE_TYPE;
+
+#define ACPI_NO_UNIT_LIMIT ((UINT32) -1)
+#define ACPI_MUTEX_SEM 1
+
+
+/* Functions for AcpiOsSignal */
+
+#define ACPI_SIGNAL_FATAL 0
+#define ACPI_SIGNAL_BREAKPOINT 1
+
+typedef struct acpi_signal_fatal_info
+{
+ UINT32 Type;
+ UINT32 Code;
+ UINT32 Argument;
+
+} ACPI_SIGNAL_FATAL_INFO;
+
+
+/*
+ * OSL Initialization and shutdown primitives
+ */
+ACPI_STATUS
+AcpiOsInitialize (
+ void);
+
+ACPI_STATUS
+AcpiOsTerminate (
+ void);
+
+
+/*
+ * ACPI Table interfaces
+ */
+ACPI_PHYSICAL_ADDRESS
+AcpiOsGetRootPointer (
+ void);
+
+ACPI_STATUS
+AcpiOsPredefinedOverride (
+ const ACPI_PREDEFINED_NAMES *InitVal,
+ ACPI_STRING *NewVal);
+
+ACPI_STATUS
+AcpiOsTableOverride (
+ ACPI_TABLE_HEADER *ExistingTable,
+ ACPI_TABLE_HEADER **NewTable);
+
+
+/*
+ * Spinlock primitives
+ */
+ACPI_STATUS
+AcpiOsCreateLock (
+ ACPI_SPINLOCK *OutHandle);
+
+void
+AcpiOsDeleteLock (
+ ACPI_SPINLOCK Handle);
+
+ACPI_CPU_FLAGS
+AcpiOsAcquireLock (
+ ACPI_SPINLOCK Handle);
+
+void
+AcpiOsReleaseLock (
+ ACPI_SPINLOCK Handle,
+ ACPI_CPU_FLAGS Flags);
+
+
+/*
+ * Semaphore primitives
+ */
+ACPI_STATUS
+AcpiOsCreateSemaphore (
+ UINT32 MaxUnits,
+ UINT32 InitialUnits,
+ ACPI_SEMAPHORE *OutHandle);
+
+ACPI_STATUS
+AcpiOsDeleteSemaphore (
+ ACPI_SEMAPHORE Handle);
+
+ACPI_STATUS
+AcpiOsWaitSemaphore (
+ ACPI_SEMAPHORE Handle,
+ UINT32 Units,
+ UINT16 Timeout);
+
+ACPI_STATUS
+AcpiOsSignalSemaphore (
+ ACPI_SEMAPHORE Handle,
+ UINT32 Units);
+
+
+/*
+ * Mutex primitives
+ */
+ACPI_STATUS
+AcpiOsCreateMutex (
+ ACPI_MUTEX *OutHandle);
+
+void
+AcpiOsDeleteMutex (
+ ACPI_MUTEX Handle);
+
+ACPI_STATUS
+AcpiOsAcquireMutex (
+ ACPI_MUTEX Handle,
+ UINT16 Timeout);
+
+void
+AcpiOsReleaseMutex (
+ ACPI_MUTEX Handle);
+
+/* Temporary macros for Mutex* interfaces, map to existing semaphore xfaces */
+
+#define AcpiOsCreateMutex(OutHandle) AcpiOsCreateSemaphore (1, 1, OutHandle)
+#define AcpiOsDeleteMutex(Handle) (void) AcpiOsDeleteSemaphore (Handle)
+#define AcpiOsAcquireMutex(Handle,Time) AcpiOsWaitSemaphore (Handle, 1, Time)
+#define AcpiOsReleaseMutex(Handle) (void) AcpiOsSignalSemaphore (Handle, 1)
+
+
+/*
+ * Memory allocation and mapping
+ */
+void *
+AcpiOsAllocate (
+ ACPI_SIZE Size);
+
+void
+AcpiOsFree (
+ void * Memory);
+
+void *
+AcpiOsMapMemory (
+ ACPI_PHYSICAL_ADDRESS Where,
+ ACPI_NATIVE_UINT Length);
+
+void
+AcpiOsUnmapMemory (
+ void *LogicalAddress,
+ ACPI_SIZE Size);
+
+ACPI_STATUS
+AcpiOsGetPhysicalAddress (
+ void *LogicalAddress,
+ ACPI_PHYSICAL_ADDRESS *PhysicalAddress);
+
+
+/*
+ * Memory/Object Cache
+ */
+ACPI_STATUS
+AcpiOsCreateCache (
+ char *CacheName,
+ UINT16 ObjectSize,
+ UINT16 MaxDepth,
+ ACPI_CACHE_T **ReturnCache);
+
+ACPI_STATUS
+AcpiOsDeleteCache (
+ ACPI_CACHE_T *Cache);
+
+ACPI_STATUS
+AcpiOsPurgeCache (
+ ACPI_CACHE_T *Cache);
+
+void *
+AcpiOsAcquireObject (
+ ACPI_CACHE_T *Cache);
+
+ACPI_STATUS
+AcpiOsReleaseObject (
+ ACPI_CACHE_T *Cache,
+ void *Object);
+
+
+/*
+ * Interrupt handlers
+ */
+ACPI_STATUS
+AcpiOsInstallInterruptHandler (
+ UINT32 InterruptNumber,
+ ACPI_OSD_HANDLER ServiceRoutine,
+ void *Context);
+
+ACPI_STATUS
+AcpiOsRemoveInterruptHandler (
+ UINT32 InterruptNumber,
+ ACPI_OSD_HANDLER ServiceRoutine);
+
+
+/*
+ * Threads and Scheduling
+ */
+ACPI_THREAD_ID
+AcpiOsGetThreadId (
+ void);
+
+ACPI_STATUS
+AcpiOsExecute (
+ ACPI_EXECUTE_TYPE Type,
+ ACPI_OSD_EXEC_CALLBACK Function,
+ void *Context);
+
+void
+AcpiOsWaitEventsComplete (
+ void *Context);
+
+void
+AcpiOsSleep (
+ ACPI_INTEGER Milliseconds);
+
+void
+AcpiOsStall (
+ UINT32 Microseconds);
+
+
+/*
+ * Platform and hardware-independent I/O interfaces
+ */
+ACPI_STATUS
+AcpiOsReadPort (
+ ACPI_IO_ADDRESS Address,
+ UINT32 *Value,
+ UINT32 Width);
+
+ACPI_STATUS
+AcpiOsWritePort (
+ ACPI_IO_ADDRESS Address,
+ UINT32 Value,
+ UINT32 Width);
+
+
+/*
+ * Platform and hardware-independent physical memory interfaces
+ */
+ACPI_STATUS
+AcpiOsReadMemory (
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 *Value,
+ UINT32 Width);
+
+ACPI_STATUS
+AcpiOsWriteMemory (
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 Value,
+ UINT32 Width);
+
+
+/*
+ * Platform and hardware-independent PCI configuration space access
+ * Note: Can't use "Register" as a parameter, changed to "Reg" --
+ * certain compilers complain.
+ */
+ACPI_STATUS
+AcpiOsReadPciConfiguration (
+ ACPI_PCI_ID *PciId,
+ UINT32 Reg,
+ void *Value,
+ UINT32 Width);
+
+ACPI_STATUS
+AcpiOsWritePciConfiguration (
+ ACPI_PCI_ID *PciId,
+ UINT32 Reg,
+ ACPI_INTEGER Value,
+ UINT32 Width);
+
+
+/*
+ * Interim function needed for PCI IRQ routing
+ */
+void
+AcpiOsDerivePciId(
+ ACPI_HANDLE Rhandle,
+ ACPI_HANDLE Chandle,
+ ACPI_PCI_ID **PciId);
+
+
+/*
+ * Miscellaneous
+ */
+ACPI_STATUS
+AcpiOsValidateInterface (
+ char *Interface);
+
+ACPI_STATUS
+AcpiOsValidateAddress (
+ UINT8 SpaceId,
+ ACPI_PHYSICAL_ADDRESS Address,
+ ACPI_SIZE Length);
+
+BOOLEAN
+AcpiOsReadable (
+ void *Pointer,
+ ACPI_SIZE Length);
+
+BOOLEAN
+AcpiOsWritable (
+ void *Pointer,
+ ACPI_SIZE Length);
+
+UINT64
+AcpiOsGetTimer (
+ void);
+
+ACPI_STATUS
+AcpiOsSignal (
+ UINT32 Function,
+ void *Info);
+
+
+/*
+ * Debug print routines
+ */
+void ACPI_INTERNAL_VAR_XFACE
+AcpiOsPrintf (
+ const char *Format,
+ ...);
+
+void
+AcpiOsVprintf (
+ const char *Format,
+ va_list Args);
+
+void
+AcpiOsRedirectOutput (
+ void *Destination);
+
+
+/*
+ * Debug input
+ */
+UINT32
+AcpiOsGetLine (
+ char *Buffer);
+
+
+/*
+ * Directory manipulation
+ */
+void *
+AcpiOsOpenDirectory (
+ char *Pathname,
+ char *WildcardSpec,
+ char RequestedFileType);
+
+/* RequesteFileType values */
+
+#define REQUEST_FILE_ONLY 0
+#define REQUEST_DIR_ONLY 1
+
+
+char *
+AcpiOsGetNextFilename (
+ void *DirHandle);
+
+void
+AcpiOsCloseDirectory (
+ void *DirHandle);
+
+
+#endif /* __ACPIOSXF_H__ */
diff --git a/sys/contrib/dev/acpica/acpixf.h b/sys/contrib/dev/acpica/acpixf.h
new file mode 100644
index 0000000..f85fd67
--- /dev/null
+++ b/sys/contrib/dev/acpica/acpixf.h
@@ -0,0 +1,550 @@
+
+/******************************************************************************
+ *
+ * Name: acpixf.h - External interfaces to the ACPI subsystem
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#ifndef __ACXFACE_H__
+#define __ACXFACE_H__
+
+#include <contrib/dev/acpica/actypes.h>
+#include <contrib/dev/acpica/actbl.h>
+
+
+/*
+ * Global interfaces
+ */
+ACPI_STATUS
+AcpiInitializeTables (
+ ACPI_TABLE_DESC *InitialStorage,
+ UINT32 InitialTableCount,
+ BOOLEAN AllowResize);
+
+ACPI_STATUS
+AcpiInitializeSubsystem (
+ void);
+
+ACPI_STATUS
+AcpiEnableSubsystem (
+ UINT32 Flags);
+
+ACPI_STATUS
+AcpiInitializeObjects (
+ UINT32 Flags);
+
+ACPI_STATUS
+AcpiTerminate (
+ void);
+
+ACPI_STATUS
+AcpiSubsystemStatus (
+ void);
+
+ACPI_STATUS
+AcpiEnable (
+ void);
+
+ACPI_STATUS
+AcpiDisable (
+ void);
+
+ACPI_STATUS
+AcpiGetSystemInfo (
+ ACPI_BUFFER *RetBuffer);
+
+const char *
+AcpiFormatException (
+ ACPI_STATUS Exception);
+
+ACPI_STATUS
+AcpiPurgeCachedObjects (
+ void);
+
+ACPI_STATUS
+AcpiInstallInitializationHandler (
+ ACPI_INIT_HANDLER Handler,
+ UINT32 Function);
+
+/*
+ * ACPI Memory managment
+ */
+void *
+AcpiAllocate (
+ UINT32 Size);
+
+void *
+AcpiCallocate (
+ UINT32 Size);
+
+void
+AcpiFree (
+ void *Address);
+
+
+/*
+ * ACPI table manipulation interfaces
+ */
+ACPI_STATUS
+AcpiReallocateRootTable (
+ void);
+
+ACPI_STATUS
+AcpiFindRootPointer (
+ ACPI_NATIVE_UINT *RsdpAddress);
+
+ACPI_STATUS
+AcpiLoadTables (
+ void);
+
+ACPI_STATUS
+AcpiGetTableHeader (
+ ACPI_STRING Signature,
+ ACPI_NATIVE_UINT Instance,
+ ACPI_TABLE_HEADER *OutTableHeader);
+
+ACPI_STATUS
+AcpiGetTable (
+ ACPI_STRING Signature,
+ ACPI_NATIVE_UINT Instance,
+ ACPI_TABLE_HEADER **OutTable);
+
+ACPI_STATUS
+AcpiGetTableByIndex (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_TABLE_HEADER **OutTable);
+
+
+/*
+ * Namespace and name interfaces
+ */
+ACPI_STATUS
+AcpiWalkNamespace (
+ ACPI_OBJECT_TYPE Type,
+ ACPI_HANDLE StartObject,
+ UINT32 MaxDepth,
+ ACPI_WALK_CALLBACK UserFunction,
+ void *Context,
+ void **ReturnValue);
+
+ACPI_STATUS
+AcpiGetDevices (
+ char *HID,
+ ACPI_WALK_CALLBACK UserFunction,
+ void *Context,
+ void **ReturnValue);
+
+ACPI_STATUS
+AcpiGetName (
+ ACPI_HANDLE Handle,
+ UINT32 NameType,
+ ACPI_BUFFER *RetPathPtr);
+
+ACPI_STATUS
+AcpiGetHandle (
+ ACPI_HANDLE Parent,
+ ACPI_STRING Pathname,
+ ACPI_HANDLE *RetHandle);
+
+ACPI_STATUS
+AcpiAttachData (
+ ACPI_HANDLE ObjHandle,
+ ACPI_OBJECT_HANDLER Handler,
+ void *Data);
+
+ACPI_STATUS
+AcpiDetachData (
+ ACPI_HANDLE ObjHandle,
+ ACPI_OBJECT_HANDLER Handler);
+
+ACPI_STATUS
+AcpiGetData (
+ ACPI_HANDLE ObjHandle,
+ ACPI_OBJECT_HANDLER Handler,
+ void **Data);
+
+ACPI_STATUS
+AcpiDebugTrace (
+ char *Name,
+ UINT32 DebugLevel,
+ UINT32 DebugLayer,
+ UINT32 Flags);
+
+
+/*
+ * Object manipulation and enumeration
+ */
+ACPI_STATUS
+AcpiEvaluateObject (
+ ACPI_HANDLE Object,
+ ACPI_STRING Pathname,
+ ACPI_OBJECT_LIST *ParameterObjects,
+ ACPI_BUFFER *ReturnObjectBuffer);
+
+ACPI_STATUS
+AcpiEvaluateObjectTyped (
+ ACPI_HANDLE Object,
+ ACPI_STRING Pathname,
+ ACPI_OBJECT_LIST *ExternalParams,
+ ACPI_BUFFER *ReturnBuffer,
+ ACPI_OBJECT_TYPE ReturnType);
+
+ACPI_STATUS
+AcpiGetObjectInfo (
+ ACPI_HANDLE Handle,
+ ACPI_BUFFER *ReturnBuffer);
+
+ACPI_STATUS
+AcpiGetNextObject (
+ ACPI_OBJECT_TYPE Type,
+ ACPI_HANDLE Parent,
+ ACPI_HANDLE Child,
+ ACPI_HANDLE *OutHandle);
+
+ACPI_STATUS
+AcpiGetType (
+ ACPI_HANDLE Object,
+ ACPI_OBJECT_TYPE *OutType);
+
+ACPI_STATUS
+AcpiGetParent (
+ ACPI_HANDLE Object,
+ ACPI_HANDLE *OutHandle);
+
+
+/*
+ * Event handler interfaces
+ */
+ACPI_STATUS
+AcpiInstallFixedEventHandler (
+ UINT32 AcpiEvent,
+ ACPI_EVENT_HANDLER Handler,
+ void *Context);
+
+ACPI_STATUS
+AcpiRemoveFixedEventHandler (
+ UINT32 AcpiEvent,
+ ACPI_EVENT_HANDLER Handler);
+
+ACPI_STATUS
+AcpiInstallNotifyHandler (
+ ACPI_HANDLE Device,
+ UINT32 HandlerType,
+ ACPI_NOTIFY_HANDLER Handler,
+ void *Context);
+
+ACPI_STATUS
+AcpiRemoveNotifyHandler (
+ ACPI_HANDLE Device,
+ UINT32 HandlerType,
+ ACPI_NOTIFY_HANDLER Handler);
+
+ACPI_STATUS
+AcpiInstallAddressSpaceHandler (
+ ACPI_HANDLE Device,
+ ACPI_ADR_SPACE_TYPE SpaceId,
+ ACPI_ADR_SPACE_HANDLER Handler,
+ ACPI_ADR_SPACE_SETUP Setup,
+ void *Context);
+
+ACPI_STATUS
+AcpiRemoveAddressSpaceHandler (
+ ACPI_HANDLE Device,
+ ACPI_ADR_SPACE_TYPE SpaceId,
+ ACPI_ADR_SPACE_HANDLER Handler);
+
+ACPI_STATUS
+AcpiInstallGpeHandler (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT32 Type,
+ ACPI_EVENT_HANDLER Address,
+ void *Context);
+
+ACPI_STATUS
+AcpiInstallExceptionHandler (
+ ACPI_EXCEPTION_HANDLER Handler);
+
+
+/*
+ * Event interfaces
+ */
+ACPI_STATUS
+AcpiAcquireGlobalLock (
+ UINT16 Timeout,
+ UINT32 *Handle);
+
+ACPI_STATUS
+AcpiReleaseGlobalLock (
+ UINT32 Handle);
+
+ACPI_STATUS
+AcpiRemoveGpeHandler (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ ACPI_EVENT_HANDLER Address);
+
+ACPI_STATUS
+AcpiEnableEvent (
+ UINT32 Event,
+ UINT32 Flags);
+
+ACPI_STATUS
+AcpiDisableEvent (
+ UINT32 Event,
+ UINT32 Flags);
+
+ACPI_STATUS
+AcpiClearEvent (
+ UINT32 Event);
+
+ACPI_STATUS
+AcpiGetEventStatus (
+ UINT32 Event,
+ ACPI_EVENT_STATUS *EventStatus);
+
+ACPI_STATUS
+AcpiSetGpeType (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT8 Type);
+
+ACPI_STATUS
+AcpiEnableGpe (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT32 Flags);
+
+ACPI_STATUS
+AcpiDisableGpe (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT32 Flags);
+
+ACPI_STATUS
+AcpiClearGpe (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT32 Flags);
+
+ACPI_STATUS
+AcpiGetGpeStatus (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT32 Flags,
+ ACPI_EVENT_STATUS *EventStatus);
+
+ACPI_STATUS
+AcpiInstallGpeBlock (
+ ACPI_HANDLE GpeDevice,
+ ACPI_GENERIC_ADDRESS *GpeBlockAddress,
+ UINT32 RegisterCount,
+ UINT32 InterruptNumber);
+
+ACPI_STATUS
+AcpiRemoveGpeBlock (
+ ACPI_HANDLE GpeDevice);
+
+
+/*
+ * Resource interfaces
+ */
+typedef
+ACPI_STATUS (*ACPI_WALK_RESOURCE_CALLBACK) (
+ ACPI_RESOURCE *Resource,
+ void *Context);
+
+ACPI_STATUS
+AcpiGetVendorResource (
+ ACPI_HANDLE DeviceHandle,
+ char *Name,
+ ACPI_VENDOR_UUID *Uuid,
+ ACPI_BUFFER *RetBuffer);
+
+ACPI_STATUS
+AcpiGetCurrentResources(
+ ACPI_HANDLE DeviceHandle,
+ ACPI_BUFFER *RetBuffer);
+
+ACPI_STATUS
+AcpiGetPossibleResources(
+ ACPI_HANDLE DeviceHandle,
+ ACPI_BUFFER *RetBuffer);
+
+ACPI_STATUS
+AcpiWalkResources (
+ ACPI_HANDLE DeviceHandle,
+ char *Name,
+ ACPI_WALK_RESOURCE_CALLBACK UserFunction,
+ void *Context);
+
+ACPI_STATUS
+AcpiSetCurrentResources (
+ ACPI_HANDLE DeviceHandle,
+ ACPI_BUFFER *InBuffer);
+
+ACPI_STATUS
+AcpiGetIrqRoutingTable (
+ ACPI_HANDLE BusDeviceHandle,
+ ACPI_BUFFER *RetBuffer);
+
+ACPI_STATUS
+AcpiResourceToAddress64 (
+ ACPI_RESOURCE *Resource,
+ ACPI_RESOURCE_ADDRESS64 *Out);
+
+/*
+ * Hardware (ACPI device) interfaces
+ */
+ACPI_STATUS
+AcpiGetRegister (
+ UINT32 RegisterId,
+ UINT32 *ReturnValue);
+
+ACPI_STATUS
+AcpiSetRegister (
+ UINT32 RegisterId,
+ UINT32 Value);
+
+ACPI_STATUS
+AcpiSetFirmwareWakingVector (
+ ACPI_PHYSICAL_ADDRESS PhysicalAddress);
+
+ACPI_STATUS
+AcpiGetFirmwareWakingVector (
+ ACPI_PHYSICAL_ADDRESS *PhysicalAddress);
+
+ACPI_STATUS
+AcpiGetSleepTypeData (
+ UINT8 SleepState,
+ UINT8 *Slp_TypA,
+ UINT8 *Slp_TypB);
+
+ACPI_STATUS
+AcpiEnterSleepStatePrep (
+ UINT8 SleepState);
+
+ACPI_STATUS
+AcpiEnterSleepState (
+ UINT8 SleepState);
+
+ACPI_STATUS
+AcpiEnterSleepStateS4bios (
+ void);
+
+ACPI_STATUS
+AcpiLeaveSleepState (
+ UINT8 SleepState);
+
+
+#endif /* __ACXFACE_H__ */
diff --git a/sys/contrib/dev/acpica/acresrc.h b/sys/contrib/dev/acpica/acresrc.h
new file mode 100644
index 0000000..345c21e
--- /dev/null
+++ b/sys/contrib/dev/acpica/acresrc.h
@@ -0,0 +1,465 @@
+/******************************************************************************
+ *
+ * Name: acresrc.h - Resource Manager function prototypes
+ * $Revision: 1.60 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACRESRC_H__
+#define __ACRESRC_H__
+
+/* Need the AML resource descriptor structs */
+
+#include <contrib/dev/acpica/amlresrc.h>
+
+
+/*
+ * If possible, pack the following structures to byte alignment, since we
+ * don't care about performance for debug output. Two cases where we cannot
+ * pack the structures:
+ *
+ * 1) Hardware does not support misaligned memory transfers
+ * 2) Compiler does not support pointers within packed structures
+ */
+#if (!defined(ACPI_MISALIGNMENT_NOT_SUPPORTED) && !defined(ACPI_PACKED_POINTERS_NOT_SUPPORTED))
+#pragma pack(1)
+#endif
+
+/*
+ * Individual entry for the resource conversion tables
+ */
+typedef const struct acpi_rsconvert_info
+{
+ UINT8 Opcode;
+ UINT8 ResourceOffset;
+ UINT8 AmlOffset;
+ UINT8 Value;
+
+} ACPI_RSCONVERT_INFO;
+
+/* Resource conversion opcodes */
+
+#define ACPI_RSC_INITGET 0
+#define ACPI_RSC_INITSET 1
+#define ACPI_RSC_FLAGINIT 2
+#define ACPI_RSC_1BITFLAG 3
+#define ACPI_RSC_2BITFLAG 4
+#define ACPI_RSC_COUNT 5
+#define ACPI_RSC_COUNT16 6
+#define ACPI_RSC_LENGTH 7
+#define ACPI_RSC_MOVE8 8
+#define ACPI_RSC_MOVE16 9
+#define ACPI_RSC_MOVE32 10
+#define ACPI_RSC_MOVE64 11
+#define ACPI_RSC_SET8 12
+#define ACPI_RSC_DATA8 13
+#define ACPI_RSC_ADDRESS 14
+#define ACPI_RSC_SOURCE 15
+#define ACPI_RSC_SOURCEX 16
+#define ACPI_RSC_BITMASK 17
+#define ACPI_RSC_BITMASK16 18
+#define ACPI_RSC_EXIT_NE 19
+#define ACPI_RSC_EXIT_LE 20
+
+/* Resource Conversion sub-opcodes */
+
+#define ACPI_RSC_COMPARE_AML_LENGTH 0
+#define ACPI_RSC_COMPARE_VALUE 1
+
+#define ACPI_RSC_TABLE_SIZE(d) (sizeof (d) / sizeof (ACPI_RSCONVERT_INFO))
+
+#define ACPI_RS_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_RESOURCE,f)
+#define AML_OFFSET(f) (UINT8) ACPI_OFFSET (AML_RESOURCE,f)
+
+
+typedef const struct acpi_rsdump_info
+{
+ UINT8 Opcode;
+ UINT8 Offset;
+ char *Name;
+ const char **Pointer;
+
+} ACPI_RSDUMP_INFO;
+
+/* Values for the Opcode field above */
+
+#define ACPI_RSD_TITLE 0
+#define ACPI_RSD_LITERAL 1
+#define ACPI_RSD_STRING 2
+#define ACPI_RSD_UINT8 3
+#define ACPI_RSD_UINT16 4
+#define ACPI_RSD_UINT32 5
+#define ACPI_RSD_UINT64 6
+#define ACPI_RSD_1BITFLAG 7
+#define ACPI_RSD_2BITFLAG 8
+#define ACPI_RSD_SHORTLIST 9
+#define ACPI_RSD_LONGLIST 10
+#define ACPI_RSD_DWORDLIST 11
+#define ACPI_RSD_ADDRESS 12
+#define ACPI_RSD_SOURCE 13
+
+/* restore default alignment */
+
+#pragma pack()
+
+
+/* Resource tables indexed by internal resource type */
+
+extern const UINT8 AcpiGbl_AmlResourceSizes[];
+extern ACPI_RSCONVERT_INFO *AcpiGbl_SetResourceDispatch[];
+
+/* Resource tables indexed by raw AML resource descriptor type */
+
+extern const UINT8 AcpiGbl_ResourceStructSizes[];
+extern ACPI_RSCONVERT_INFO *AcpiGbl_GetResourceDispatch[];
+
+
+typedef struct acpi_vendor_walk_info
+{
+ ACPI_VENDOR_UUID *Uuid;
+ ACPI_BUFFER *Buffer;
+ ACPI_STATUS Status;
+
+} ACPI_VENDOR_WALK_INFO;
+
+
+/*
+ * rscreate
+ */
+ACPI_STATUS
+AcpiRsCreateResourceList (
+ ACPI_OPERAND_OBJECT *AmlBuffer,
+ ACPI_BUFFER *OutputBuffer);
+
+ACPI_STATUS
+AcpiRsCreateAmlResources (
+ ACPI_RESOURCE *LinkedListBuffer,
+ ACPI_BUFFER *OutputBuffer);
+
+ACPI_STATUS
+AcpiRsCreatePciRoutingTable (
+ ACPI_OPERAND_OBJECT *PackageObject,
+ ACPI_BUFFER *OutputBuffer);
+
+
+/*
+ * rsutils
+ */
+ACPI_STATUS
+AcpiRsGetPrtMethodData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_BUFFER *RetBuffer);
+
+ACPI_STATUS
+AcpiRsGetCrsMethodData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_BUFFER *RetBuffer);
+
+ACPI_STATUS
+AcpiRsGetPrsMethodData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_BUFFER *RetBuffer);
+
+ACPI_STATUS
+AcpiRsGetMethodData (
+ ACPI_HANDLE Handle,
+ char *Path,
+ ACPI_BUFFER *RetBuffer);
+
+ACPI_STATUS
+AcpiRsSetSrsMethodData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_BUFFER *RetBuffer);
+
+
+/*
+ * rscalc
+ */
+ACPI_STATUS
+AcpiRsGetListLength (
+ UINT8 *AmlBuffer,
+ UINT32 AmlBufferLength,
+ ACPI_SIZE *SizeNeeded);
+
+ACPI_STATUS
+AcpiRsGetAmlLength (
+ ACPI_RESOURCE *LinkedListBuffer,
+ ACPI_SIZE *SizeNeeded);
+
+ACPI_STATUS
+AcpiRsGetPciRoutingTableLength (
+ ACPI_OPERAND_OBJECT *PackageObject,
+ ACPI_SIZE *BufferSizeNeeded);
+
+ACPI_STATUS
+AcpiRsConvertAmlToResources (
+ UINT8 *Aml,
+ UINT32 Length,
+ UINT32 Offset,
+ UINT8 ResourceIndex,
+ void *Context);
+
+ACPI_STATUS
+AcpiRsConvertResourcesToAml (
+ ACPI_RESOURCE *Resource,
+ ACPI_SIZE AmlSizeNeeded,
+ UINT8 *OutputBuffer);
+
+
+/*
+ * rsaddr
+ */
+void
+AcpiRsSetAddressCommon (
+ AML_RESOURCE *Aml,
+ ACPI_RESOURCE *Resource);
+
+BOOLEAN
+AcpiRsGetAddressCommon (
+ ACPI_RESOURCE *Resource,
+ AML_RESOURCE *Aml);
+
+
+/*
+ * rsmisc
+ */
+ACPI_STATUS
+AcpiRsConvertAmlToResource (
+ ACPI_RESOURCE *Resource,
+ AML_RESOURCE *Aml,
+ ACPI_RSCONVERT_INFO *Info);
+
+ACPI_STATUS
+AcpiRsConvertResourceToAml (
+ ACPI_RESOURCE *Resource,
+ AML_RESOURCE *Aml,
+ ACPI_RSCONVERT_INFO *Info);
+
+
+/*
+ * rsutils
+ */
+void
+AcpiRsMoveData (
+ void *Destination,
+ void *Source,
+ UINT16 ItemCount,
+ UINT8 MoveType);
+
+UINT8
+AcpiRsDecodeBitmask (
+ UINT16 Mask,
+ UINT8 *List);
+
+UINT16
+AcpiRsEncodeBitmask (
+ UINT8 *List,
+ UINT8 Count);
+
+ACPI_RS_LENGTH
+AcpiRsGetResourceSource (
+ ACPI_RS_LENGTH ResourceLength,
+ ACPI_RS_LENGTH MinimumLength,
+ ACPI_RESOURCE_SOURCE *ResourceSource,
+ AML_RESOURCE *Aml,
+ char *StringPtr);
+
+ACPI_RSDESC_SIZE
+AcpiRsSetResourceSource (
+ AML_RESOURCE *Aml,
+ ACPI_RS_LENGTH MinimumLength,
+ ACPI_RESOURCE_SOURCE *ResourceSource);
+
+void
+AcpiRsSetResourceHeader (
+ UINT8 DescriptorType,
+ ACPI_RSDESC_SIZE TotalLength,
+ AML_RESOURCE *Aml);
+
+void
+AcpiRsSetResourceLength (
+ ACPI_RSDESC_SIZE TotalLength,
+ AML_RESOURCE *Aml);
+
+
+/*
+ * rsdump
+ */
+void
+AcpiRsDumpResourceList (
+ ACPI_RESOURCE *Resource);
+
+void
+AcpiRsDumpIrqList (
+ UINT8 *RouteTable);
+
+
+/*
+ * Resource conversion tables
+ */
+extern ACPI_RSCONVERT_INFO AcpiRsConvertDma[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertEndDpf[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertIo[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertFixedIo[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertEndTag[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertMemory24[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertGenericReg[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertMemory32[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertFixedMemory32[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertAddress32[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertAddress16[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertExtIrq[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertAddress64[];
+extern ACPI_RSCONVERT_INFO AcpiRsConvertExtAddress64[];
+
+/* These resources require separate get/set tables */
+
+extern ACPI_RSCONVERT_INFO AcpiRsGetIrq[];
+extern ACPI_RSCONVERT_INFO AcpiRsGetStartDpf[];
+extern ACPI_RSCONVERT_INFO AcpiRsGetVendorSmall[];
+extern ACPI_RSCONVERT_INFO AcpiRsGetVendorLarge[];
+
+extern ACPI_RSCONVERT_INFO AcpiRsSetIrq[];
+extern ACPI_RSCONVERT_INFO AcpiRsSetStartDpf[];
+extern ACPI_RSCONVERT_INFO AcpiRsSetVendor[];
+
+
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+/*
+ * rsinfo
+ */
+extern ACPI_RSDUMP_INFO *AcpiGbl_DumpResourceDispatch[];
+
+/*
+ * rsdump
+ */
+extern ACPI_RSDUMP_INFO AcpiRsDumpIrq[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpDma[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpStartDpf[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpEndDpf[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpIo[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpFixedIo[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpVendor[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpEndTag[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpMemory24[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpMemory32[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpFixedMemory32[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpAddress16[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpAddress32[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpAddress64[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpExtAddress64[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpExtIrq[];
+extern ACPI_RSDUMP_INFO AcpiRsDumpGenericReg[];
+#endif
+
+#endif /* __ACRESRC_H__ */
diff --git a/sys/contrib/dev/acpica/acstruct.h b/sys/contrib/dev/acpica/acstruct.h
new file mode 100644
index 0000000..7861e7a
--- /dev/null
+++ b/sys/contrib/dev/acpica/acstruct.h
@@ -0,0 +1,333 @@
+/******************************************************************************
+ *
+ * Name: acstruct.h - Internal structs
+ * $Revision: 1.47 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACSTRUCT_H__
+#define __ACSTRUCT_H__
+
+/* acpisrc:StructDefs -- for acpisrc conversion */
+
+/*****************************************************************************
+ *
+ * Tree walking typedefs and structs
+ *
+ ****************************************************************************/
+
+
+/*
+ * Walk state - current state of a parse tree walk. Used for both a leisurely
+ * stroll through the tree (for whatever reason), and for control method
+ * execution.
+ */
+#define ACPI_NEXT_OP_DOWNWARD 1
+#define ACPI_NEXT_OP_UPWARD 2
+
+/*
+ * Groups of definitions for WalkType used for different implementations of
+ * walkers (never simultaneously) - flags for interpreter:
+ */
+#define ACPI_WALK_NON_METHOD 0
+#define ACPI_WALK_METHOD 0x01
+#define ACPI_WALK_METHOD_RESTART 0x02
+
+/* Flags for iASL compiler only */
+
+#define ACPI_WALK_CONST_REQUIRED 0x10
+#define ACPI_WALK_CONST_OPTIONAL 0x20
+
+
+typedef struct acpi_walk_state
+{
+ struct acpi_walk_state *Next; /* Next WalkState in list */
+ UINT8 DescriptorType; /* To differentiate various internal objs */
+ UINT8 WalkType;
+ UINT16 Opcode; /* Current AML opcode */
+ UINT8 NextOpInfo; /* Info about NextOp */
+ UINT8 NumOperands; /* Stack pointer for Operands[] array */
+ UINT8 OperandIndex; /* Index into operand stack, to be used by AcpiDsObjStackPush */
+ ACPI_OWNER_ID OwnerId; /* Owner of objects created during the walk */
+ BOOLEAN LastPredicate; /* Result of last predicate */
+ UINT8 CurrentResult;
+ UINT8 ReturnUsed;
+ UINT8 ScopeDepth;
+ UINT8 PassNumber; /* Parse pass during table load */
+ UINT8 ResultSize; /* Total elements for the result stack */
+ UINT8 ResultCount; /* Current number of occupied elements of result stack */
+ UINT32 AmlOffset;
+ UINT32 ArgTypes;
+ UINT32 MethodBreakpoint; /* For single stepping */
+ UINT32 UserBreakpoint; /* User AML breakpoint */
+ UINT32 ParseFlags;
+
+ ACPI_PARSE_STATE ParserState; /* Current state of parser */
+ UINT32 PrevArgTypes;
+ UINT32 ArgCount; /* push for fixed or var args */
+
+ struct acpi_namespace_node Arguments[ACPI_METHOD_NUM_ARGS]; /* Control method arguments */
+ struct acpi_namespace_node LocalVariables[ACPI_METHOD_NUM_LOCALS]; /* Control method locals */
+ union acpi_operand_object *Operands[ACPI_OBJ_NUM_OPERANDS + 1]; /* Operands passed to the interpreter (+1 for NULL terminator) */
+ union acpi_operand_object **Params;
+
+ UINT8 *AmlLastWhile;
+ union acpi_operand_object **CallerReturnDesc;
+ ACPI_GENERIC_STATE *ControlState; /* List of control states (nested IFs) */
+ struct acpi_namespace_node *DeferredNode; /* Used when executing deferred opcodes */
+ struct acpi_gpe_event_info *GpeEventInfo; /* Info for GPE (_Lxx/_Exx methods only */
+ union acpi_operand_object *ImplicitReturnObj;
+ struct acpi_namespace_node *MethodCallNode; /* Called method Node*/
+ ACPI_PARSE_OBJECT *MethodCallOp; /* MethodCall Op if running a method */
+ union acpi_operand_object *MethodDesc; /* Method descriptor if running a method */
+ struct acpi_namespace_node *MethodNode; /* Method node if running a method. */
+ ACPI_PARSE_OBJECT *Op; /* Current parser op */
+ const ACPI_OPCODE_INFO *OpInfo; /* Info on current opcode */
+ ACPI_PARSE_OBJECT *Origin; /* Start of walk [Obsolete] */
+ union acpi_operand_object *ResultObj;
+ ACPI_GENERIC_STATE *Results; /* Stack of accumulated results */
+ union acpi_operand_object *ReturnDesc; /* Return object, if any */
+ ACPI_GENERIC_STATE *ScopeInfo; /* Stack of nested scopes */
+ ACPI_PARSE_OBJECT *PrevOp; /* Last op that was processed */
+ ACPI_PARSE_OBJECT *NextOp; /* next op to be processed */
+ ACPI_THREAD_STATE *Thread;
+ ACPI_PARSE_DOWNWARDS DescendingCallback;
+ ACPI_PARSE_UPWARDS AscendingCallback;
+
+} ACPI_WALK_STATE;
+
+
+/* Info used by AcpiPsInitObjects */
+
+typedef struct acpi_init_walk_info
+{
+ UINT16 MethodCount;
+ UINT16 DeviceCount;
+ UINT16 OpRegionCount;
+ UINT16 FieldCount;
+ UINT16 BufferCount;
+ UINT16 PackageCount;
+ UINT16 OpRegionInit;
+ UINT16 FieldInit;
+ UINT16 BufferInit;
+ UINT16 PackageInit;
+ UINT16 ObjectCount;
+ ACPI_OWNER_ID OwnerId;
+ ACPI_NATIVE_UINT TableIndex;
+
+} ACPI_INIT_WALK_INFO;
+
+
+typedef struct acpi_get_devices_info
+{
+ ACPI_WALK_CALLBACK UserFunction;
+ void *Context;
+ char *Hid;
+
+} ACPI_GET_DEVICES_INFO;
+
+
+typedef union acpi_aml_operands
+{
+ ACPI_OPERAND_OBJECT *Operands[7];
+
+ struct
+ {
+ ACPI_OBJECT_INTEGER *Type;
+ ACPI_OBJECT_INTEGER *Code;
+ ACPI_OBJECT_INTEGER *Argument;
+
+ } Fatal;
+
+ struct
+ {
+ ACPI_OPERAND_OBJECT *Source;
+ ACPI_OBJECT_INTEGER *Index;
+ ACPI_OPERAND_OBJECT *Target;
+
+ } Index;
+
+ struct
+ {
+ ACPI_OPERAND_OBJECT *Source;
+ ACPI_OBJECT_INTEGER *Index;
+ ACPI_OBJECT_INTEGER *Length;
+ ACPI_OPERAND_OBJECT *Target;
+
+ } Mid;
+
+} ACPI_AML_OPERANDS;
+
+
+/*
+ * Structure used to pass object evaluation parameters.
+ * Purpose is to reduce CPU stack use.
+ */
+typedef struct acpi_evaluate_info
+{
+ ACPI_NAMESPACE_NODE *PrefixNode;
+ char *Pathname;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT **Parameters;
+ ACPI_NAMESPACE_NODE *ResolvedNode;
+ ACPI_OPERAND_OBJECT *ReturnObject;
+ UINT8 PassNumber;
+ UINT8 ParameterType;
+ UINT8 ReturnObjectType;
+ UINT8 Flags;
+
+} ACPI_EVALUATE_INFO;
+
+/* Types for ParameterType above */
+
+#define ACPI_PARAM_ARGS 0
+#define ACPI_PARAM_GPE 1
+
+/* Values for Flags above */
+
+#define ACPI_IGNORE_RETURN_VALUE 1
+
+
+/* Info used by AcpiNsInitializeDevices */
+
+typedef struct acpi_device_walk_info
+{
+ UINT16 DeviceCount;
+ UINT16 Num_STA;
+ UINT16 Num_INI;
+ ACPI_TABLE_DESC *TableDesc;
+ ACPI_EVALUATE_INFO *EvaluateInfo;
+
+} ACPI_DEVICE_WALK_INFO;
+
+
+/* TBD: [Restructure] Merge with struct above */
+
+typedef struct acpi_walk_info
+{
+ UINT32 DebugLevel;
+ UINT32 Count;
+ ACPI_OWNER_ID OwnerId;
+ UINT8 DisplayType;
+
+} ACPI_WALK_INFO;
+
+/* Display Types */
+
+#define ACPI_DISPLAY_SUMMARY (UINT8) 0
+#define ACPI_DISPLAY_OBJECTS (UINT8) 1
+#define ACPI_DISPLAY_MASK (UINT8) 1
+
+#define ACPI_DISPLAY_SHORT (UINT8) 2
+
+
+#endif
diff --git a/sys/contrib/dev/acpica/actables.h b/sys/contrib/dev/acpica/actables.h
new file mode 100644
index 0000000..144b59f
--- /dev/null
+++ b/sys/contrib/dev/acpica/actables.h
@@ -0,0 +1,243 @@
+/******************************************************************************
+ *
+ * Name: actables.h - ACPI table management
+ * $Revision: 1.64 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACTABLES_H__
+#define __ACTABLES_H__
+
+
+ACPI_STATUS
+AcpiAllocateRootTable (
+ UINT32 InitialTableCount);
+
+/*
+ * tbfadt - FADT parse/convert/validate
+ */
+void
+AcpiTbParseFadt (
+ ACPI_NATIVE_UINT TableIndex,
+ UINT8 Flags);
+
+void
+AcpiTbCreateLocalFadt (
+ ACPI_TABLE_HEADER *Table,
+ UINT32 Length);
+
+
+/*
+ * tbfind - find ACPI table
+ */
+ACPI_STATUS
+AcpiTbFindTable (
+ char *Signature,
+ char *OemId,
+ char *OemTableId,
+ ACPI_NATIVE_UINT *TableIndex);
+
+
+/*
+ * tbinstal - Table removal and deletion
+ */
+ACPI_STATUS
+AcpiTbResizeRootTableList (
+ void);
+
+ACPI_STATUS
+AcpiTbVerifyTable (
+ ACPI_TABLE_DESC *TableDesc);
+
+ACPI_STATUS
+AcpiTbAddTable (
+ ACPI_TABLE_DESC *TableDesc,
+ ACPI_NATIVE_UINT *TableIndex);
+
+ACPI_STATUS
+AcpiTbStoreTable (
+ ACPI_PHYSICAL_ADDRESS Address,
+ ACPI_TABLE_HEADER *Table,
+ UINT32 Length,
+ UINT8 Flags,
+ ACPI_NATIVE_UINT *TableIndex);
+
+void
+AcpiTbDeleteTable (
+ ACPI_TABLE_DESC *TableDesc);
+
+void
+AcpiTbTerminate (
+ void);
+
+void
+AcpiTbDeleteNamespaceByOwner (
+ ACPI_NATIVE_UINT TableIndex);
+
+ACPI_STATUS
+AcpiTbAllocateOwnerId (
+ ACPI_NATIVE_UINT TableIndex);
+
+ACPI_STATUS
+AcpiTbReleaseOwnerId (
+ ACPI_NATIVE_UINT TableIndex);
+
+ACPI_STATUS
+AcpiTbGetOwnerId (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_OWNER_ID *OwnerId);
+
+BOOLEAN
+AcpiTbIsTableLoaded (
+ ACPI_NATIVE_UINT TableIndex);
+
+void
+AcpiTbSetTableLoadedFlag (
+ ACPI_NATIVE_UINT TableIndex,
+ BOOLEAN IsLoaded);
+
+
+/*
+ * tbutils - table manager utilities
+ */
+BOOLEAN
+AcpiTbTablesLoaded (
+ void);
+
+void
+AcpiTbPrintTableHeader(
+ ACPI_PHYSICAL_ADDRESS Address,
+ ACPI_TABLE_HEADER *Header);
+
+UINT8
+AcpiTbChecksum (
+ UINT8 *Buffer,
+ ACPI_NATIVE_UINT Length);
+
+ACPI_STATUS
+AcpiTbVerifyChecksum (
+ ACPI_TABLE_HEADER *Table,
+ UINT32 Length);
+
+void
+AcpiTbInstallTable (
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT8 Flags,
+ char *Signature,
+ ACPI_NATIVE_UINT TableIndex);
+
+ACPI_STATUS
+AcpiTbParseRootTable (
+ ACPI_PHYSICAL_ADDRESS RsdpAddress,
+ UINT8 Flags);
+
+#endif /* __ACTABLES_H__ */
diff --git a/sys/contrib/dev/acpica/actbl.h b/sys/contrib/dev/acpica/actbl.h
new file mode 100644
index 0000000..41859ff
--- /dev/null
+++ b/sys/contrib/dev/acpica/actbl.h
@@ -0,0 +1,395 @@
+/******************************************************************************
+ *
+ * Name: actbl.h - Basic ACPI Table Definitions
+ * $Revision: 1.84 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACTBL_H__
+#define __ACTBL_H__
+
+/*
+ * Values for description table header signatures. Useful because they make
+ * it more difficult to inadvertently type in the wrong signature.
+ */
+#define ACPI_SIG_DSDT "DSDT" /* Differentiated System Description Table */
+#define ACPI_SIG_FADT "FACP" /* Fixed ACPI Description Table */
+#define ACPI_SIG_FACS "FACS" /* Firmware ACPI Control Structure */
+#define ACPI_SIG_PSDT "PSDT" /* Persistent System Description Table */
+#define ACPI_SIG_RSDP "RSD PTR " /* Root System Description Pointer */
+#define ACPI_SIG_RSDT "RSDT" /* Root System Description Table */
+#define ACPI_SIG_XSDT "XSDT" /* Extended System Description Table */
+#define ACPI_SIG_SSDT "SSDT" /* Secondary System Description Table */
+#define ACPI_RSDP_NAME "RSDP" /* Short name for RSDP, not signature */
+
+
+/*
+ * All tables and structures must be byte-packed to match the ACPI
+ * specification, since the tables are provided by the system BIOS
+ */
+#pragma pack(1)
+
+
+/*
+ * These are the ACPI tables that are directly consumed by the subsystem.
+ *
+ * The RSDP and FACS do not use the common ACPI table header. All other ACPI
+ * tables use the header.
+ *
+ * Note about bitfields: The UINT8 type is used for bitfields in ACPI tables.
+ * This is the only type that is even remotely portable. Anything else is not
+ * portable, so do not use any other bitfield types.
+ */
+
+/*******************************************************************************
+ *
+ * ACPI Table Header. This common header is used by all tables except the
+ * RSDP and FACS. The define is used for direct inclusion of header into
+ * other ACPI tables
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_header
+{
+ char Signature[ACPI_NAME_SIZE]; /* ASCII table signature */
+ UINT32 Length; /* Length of table in bytes, including this header */
+ UINT8 Revision; /* ACPI Specification minor version # */
+ UINT8 Checksum; /* To make sum of entire table == 0 */
+ char OemId[ACPI_OEM_ID_SIZE]; /* ASCII OEM identification */
+ char OemTableId[ACPI_OEM_TABLE_ID_SIZE]; /* ASCII OEM table identification */
+ UINT32 OemRevision; /* OEM revision number */
+ char AslCompilerId[ACPI_NAME_SIZE]; /* ASCII ASL compiler vendor ID */
+ UINT32 AslCompilerRevision; /* ASL compiler version */
+
+} ACPI_TABLE_HEADER;
+
+
+/*
+ * GAS - Generic Address Structure (ACPI 2.0+)
+ *
+ * Note: Since this structure is used in the ACPI tables, it is byte aligned.
+ * If misalignment is not supported, access to the Address field must be
+ * performed with care.
+ */
+typedef struct acpi_generic_address
+{
+ UINT8 SpaceId; /* Address space where struct or register exists */
+ UINT8 BitWidth; /* Size in bits of given register */
+ UINT8 BitOffset; /* Bit offset within the register */
+ UINT8 AccessWidth; /* Minimum Access size (ACPI 3.0) */
+ UINT64 Address; /* 64-bit address of struct or register */
+
+} ACPI_GENERIC_ADDRESS;
+
+
+/*******************************************************************************
+ *
+ * RSDP - Root System Description Pointer (Signature is "RSD PTR ")
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_rsdp
+{
+ char Signature[8]; /* ACPI signature, contains "RSD PTR " */
+ UINT8 Checksum; /* ACPI 1.0 checksum */
+ char OemId[ACPI_OEM_ID_SIZE]; /* OEM identification */
+ UINT8 Revision; /* Must be (0) for ACPI 1.0 or (2) for ACPI 2.0+ */
+ UINT32 RsdtPhysicalAddress; /* 32-bit physical address of the RSDT */
+ UINT32 Length; /* Table length in bytes, including header (ACPI 2.0+) */
+ UINT64 XsdtPhysicalAddress; /* 64-bit physical address of the XSDT (ACPI 2.0+) */
+ UINT8 ExtendedChecksum; /* Checksum of entire table (ACPI 2.0+) */
+ UINT8 Reserved[3]; /* Reserved, must be zero */
+
+} ACPI_TABLE_RSDP;
+
+#define ACPI_RSDP_REV0_SIZE 20 /* Size of original ACPI 1.0 RSDP */
+
+
+/*******************************************************************************
+ *
+ * RSDT/XSDT - Root System Description Tables
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_rsdt
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT32 TableOffsetEntry[1]; /* Array of pointers to ACPI tables */
+
+} ACPI_TABLE_RSDT;
+
+typedef struct acpi_table_xsdt
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT64 TableOffsetEntry[1]; /* Array of pointers to ACPI tables */
+
+} ACPI_TABLE_XSDT;
+
+
+/*******************************************************************************
+ *
+ * FACS - Firmware ACPI Control Structure (FACS)
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_facs
+{
+ char Signature[4]; /* ASCII table signature */
+ UINT32 Length; /* Length of structure, in bytes */
+ UINT32 HardwareSignature; /* Hardware configuration signature */
+ UINT32 FirmwareWakingVector; /* 32-bit physical address of the Firmware Waking Vector */
+ UINT32 GlobalLock; /* Global Lock for shared hardware resources */
+ UINT32 Flags;
+ UINT64 XFirmwareWakingVector; /* 64-bit version of the Firmware Waking Vector (ACPI 2.0+) */
+ UINT8 Version; /* Version of this table (ACPI 2.0+) */
+ UINT8 Reserved[31]; /* Reserved, must be zero */
+
+} ACPI_TABLE_FACS;
+
+/* Flag macros */
+
+#define ACPI_FACS_S4_BIOS_PRESENT (1) /* 00: S4BIOS support is present */
+
+/* Global lock flags */
+
+#define ACPI_GLOCK_PENDING 0x01 /* 00: Pending global lock ownership */
+#define ACPI_GLOCK_OWNED 0x02 /* 01: Global lock is owned */
+
+
+/*******************************************************************************
+ *
+ * FADT - Fixed ACPI Description Table (Signature "FACP")
+ *
+ ******************************************************************************/
+
+/* Fields common to all versions of the FADT */
+
+typedef struct acpi_table_fadt
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT32 Facs; /* 32-bit physical address of FACS */
+ UINT32 Dsdt; /* 32-bit physical address of DSDT */
+ UINT8 Model; /* System Interrupt Model (ACPI 1.0) - not used in ACPI 2.0+ */
+ UINT8 PreferredProfile; /* Conveys preferred power management profile to OSPM. */
+ UINT16 SciInterrupt; /* System vector of SCI interrupt */
+ UINT32 SmiCommand; /* 32-bit Port address of SMI command port */
+ UINT8 AcpiEnable; /* Value to write to smi_cmd to enable ACPI */
+ UINT8 AcpiDisable; /* Value to write to smi_cmd to disable ACPI */
+ UINT8 S4BiosRequest; /* Value to write to SMI CMD to enter S4BIOS state */
+ UINT8 PstateControl; /* Processor performance state control*/
+ UINT32 Pm1aEventBlock; /* 32-bit Port address of Power Mgt 1a Event Reg Blk */
+ UINT32 Pm1bEventBlock; /* 32-bit Port address of Power Mgt 1b Event Reg Blk */
+ UINT32 Pm1aControlBlock; /* 32-bit Port address of Power Mgt 1a Control Reg Blk */
+ UINT32 Pm1bControlBlock; /* 32-bit Port address of Power Mgt 1b Control Reg Blk */
+ UINT32 Pm2ControlBlock; /* 32-bit Port address of Power Mgt 2 Control Reg Blk */
+ UINT32 PmTimerBlock; /* 32-bit Port address of Power Mgt Timer Ctrl Reg Blk */
+ UINT32 Gpe0Block; /* 32-bit Port address of General Purpose Event 0 Reg Blk */
+ UINT32 Gpe1Block; /* 32-bit Port address of General Purpose Event 1 Reg Blk */
+ UINT8 Pm1EventLength; /* Byte Length of ports at Pm1xEventBlock */
+ UINT8 Pm1ControlLength; /* Byte Length of ports at Pm1xControlBlock */
+ UINT8 Pm2ControlLength; /* Byte Length of ports at Pm2ControlBlock */
+ UINT8 PmTimerLength; /* Byte Length of ports at PmTimerBlock */
+ UINT8 Gpe0BlockLength; /* Byte Length of ports at Gpe0Block */
+ UINT8 Gpe1BlockLength; /* Byte Length of ports at Gpe1Block */
+ UINT8 Gpe1Base; /* Offset in GPE number space where GPE1 events start */
+ UINT8 CstControl; /* Support for the _CST object and C States change notification */
+ UINT16 C2Latency; /* Worst case HW latency to enter/exit C2 state */
+ UINT16 C3Latency; /* Worst case HW latency to enter/exit C3 state */
+ UINT16 FlushSize; /* Processor's memory cache line width, in bytes */
+ UINT16 FlushStride; /* Number of flush strides that need to be read */
+ UINT8 DutyOffset; /* Processor duty cycle index in processor's P_CNT reg*/
+ UINT8 DutyWidth; /* Processor duty cycle value bit width in P_CNT register.*/
+ UINT8 DayAlarm; /* Index to day-of-month alarm in RTC CMOS RAM */
+ UINT8 MonthAlarm; /* Index to month-of-year alarm in RTC CMOS RAM */
+ UINT8 Century; /* Index to century in RTC CMOS RAM */
+ UINT16 BootFlags; /* IA-PC Boot Architecture Flags. See Table 5-10 for description */
+ UINT8 Reserved; /* Reserved, must be zero */
+ UINT32 Flags; /* Miscellaneous flag bits (see below for individual flags) */
+ ACPI_GENERIC_ADDRESS ResetRegister; /* 64-bit address of the Reset register */
+ UINT8 ResetValue; /* Value to write to the ResetRegister port to reset the system */
+ UINT8 Reserved4[3]; /* Reserved, must be zero */
+ UINT64 XFacs; /* 64-bit physical address of FACS */
+ UINT64 XDsdt; /* 64-bit physical address of DSDT */
+ ACPI_GENERIC_ADDRESS XPm1aEventBlock; /* 64-bit Extended Power Mgt 1a Event Reg Blk address */
+ ACPI_GENERIC_ADDRESS XPm1bEventBlock; /* 64-bit Extended Power Mgt 1b Event Reg Blk address */
+ ACPI_GENERIC_ADDRESS XPm1aControlBlock; /* 64-bit Extended Power Mgt 1a Control Reg Blk address */
+ ACPI_GENERIC_ADDRESS XPm1bControlBlock; /* 64-bit Extended Power Mgt 1b Control Reg Blk address */
+ ACPI_GENERIC_ADDRESS XPm2ControlBlock; /* 64-bit Extended Power Mgt 2 Control Reg Blk address */
+ ACPI_GENERIC_ADDRESS XPmTimerBlock; /* 64-bit Extended Power Mgt Timer Ctrl Reg Blk address */
+ ACPI_GENERIC_ADDRESS XGpe0Block; /* 64-bit Extended General Purpose Event 0 Reg Blk address */
+ ACPI_GENERIC_ADDRESS XGpe1Block; /* 64-bit Extended General Purpose Event 1 Reg Blk address */
+
+} ACPI_TABLE_FADT;
+
+
+/* FADT flags */
+
+#define ACPI_FADT_WBINVD (1) /* 00: The wbinvd instruction works properly */
+#define ACPI_FADT_WBINVD_FLUSH (1<<1) /* 01: The wbinvd flushes but does not invalidate */
+#define ACPI_FADT_C1_SUPPORTED (1<<2) /* 02: All processors support C1 state */
+#define ACPI_FADT_C2_MP_SUPPORTED (1<<3) /* 03: C2 state works on MP system */
+#define ACPI_FADT_POWER_BUTTON (1<<4) /* 04: Power button is handled as a generic feature */
+#define ACPI_FADT_SLEEP_BUTTON (1<<5) /* 05: Sleep button is handled as a generic feature, or not present */
+#define ACPI_FADT_FIXED_RTC (1<<6) /* 06: RTC wakeup stat not in fixed register space */
+#define ACPI_FADT_S4_RTC_WAKE (1<<7) /* 07: RTC wakeup stat not possible from S4 */
+#define ACPI_FADT_32BIT_TIMER (1<<8) /* 08: tmr_val is 32 bits 0=24-bits */
+#define ACPI_FADT_DOCKING_SUPPORTED (1<<9) /* 09: Docking supported */
+#define ACPI_FADT_RESET_REGISTER (1<<10) /* 10: System reset via the FADT RESET_REG supported */
+#define ACPI_FADT_SEALED_CASE (1<<11) /* 11: No internal expansion capabilities and case is sealed */
+#define ACPI_FADT_HEADLESS (1<<12) /* 12: No local video capabilities or local input devices */
+#define ACPI_FADT_SLEEP_TYPE (1<<13) /* 13: Must execute native instruction after writing SLP_TYPx register */
+#define ACPI_FADT_PCI_EXPRESS_WAKE (1<<14) /* 14: System supports PCIEXP_WAKE (STS/EN) bits (ACPI 3.0) */
+#define ACPI_FADT_PLATFORM_CLOCK (1<<15) /* 15: OSPM should use platform-provided timer (ACPI 3.0) */
+#define ACPI_FADT_S4_RTC_VALID (1<<16) /* 16: Contents of RTC_STS valid after S4 wake (ACPI 3.0) */
+#define ACPI_FADT_REMOTE_POWER_ON (1<<17) /* 17: System is compatible with remote power on (ACPI 3.0) */
+#define ACPI_FADT_APIC_CLUSTER (1<<18) /* 18: All local APICs must use cluster model (ACPI 3.0) */
+#define ACPI_FADT_APIC_PHYSICAL (1<<19) /* 19: All local xAPICs must use physical dest mode (ACPI 3.0) */
+
+
+/*
+ * FADT Prefered Power Management Profiles
+ */
+enum AcpiPreferedPmProfiles
+{
+ PM_UNSPECIFIED = 0,
+ PM_DESKTOP = 1,
+ PM_MOBILE = 2,
+ PM_WORKSTATION = 3,
+ PM_ENTERPRISE_SERVER = 4,
+ PM_SOHO_SERVER = 5,
+ PM_APPLIANCE_PC = 6
+};
+
+
+/* FADT Boot Arch Flags */
+
+#define BAF_LEGACY_DEVICES 0x0001
+#define BAF_8042_KEYBOARD_CONTROLLER 0x0002
+
+#define FADT2_REVISION_ID 3
+#define FADT2_MINUS_REVISION_ID 2
+
+
+/* Reset to default packing */
+
+#pragma pack()
+
+/*
+ * Get the remaining ACPI tables
+ */
+#include <contrib/dev/acpica/actbl1.h>
+
+/* Macros used to generate offsets to specific table fields */
+
+#define ACPI_FADT_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_FADT, f)
+
+#endif /* __ACTBL_H__ */
diff --git a/sys/contrib/dev/acpica/actbl1.h b/sys/contrib/dev/acpica/actbl1.h
new file mode 100644
index 0000000..41e435b
--- /dev/null
+++ b/sys/contrib/dev/acpica/actbl1.h
@@ -0,0 +1,917 @@
+/******************************************************************************
+ *
+ * Name: actbl1.h - Additional ACPI table definitions
+ * $Revision: 1.47 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACTBL1_H__
+#define __ACTBL1_H__
+
+
+/*******************************************************************************
+ *
+ * Additional ACPI Tables
+ *
+ * These tables are not consumed directly by the ACPICA subsystem, but are
+ * included here to support device drivers and the AML disassembler.
+ *
+ ******************************************************************************/
+
+
+/*
+ * Values for description table header signatures. Useful because they make
+ * it more difficult to inadvertently type in the wrong signature.
+ */
+#define ACPI_SIG_ASF "ASF!" /* Alert Standard Format table */
+#define ACPI_SIG_BOOT "BOOT" /* Simple Boot Flag Table */
+#define ACPI_SIG_CPEP "CPEP" /* Corrected Platform Error Polling table */
+#define ACPI_SIG_DBGP "DBGP" /* Debug Port table */
+#define ACPI_SIG_DMAR "DMAR" /* DMA Remapping table */
+#define ACPI_SIG_ECDT "ECDT" /* Embedded Controller Boot Resources Table */
+#define ACPI_SIG_HPET "HPET" /* High Precision Event Timer table */
+#define ACPI_SIG_MADT "APIC" /* Multiple APIC Description Table */
+#define ACPI_SIG_MCFG "MCFG" /* PCI Memory Mapped Configuration table */
+#define ACPI_SIG_SBST "SBST" /* Smart Battery Specification Table */
+#define ACPI_SIG_SLIT "SLIT" /* System Locality Distance Information Table */
+#define ACPI_SIG_SPCR "SPCR" /* Serial Port Console Redirection table */
+#define ACPI_SIG_SPMI "SPMI" /* Server Platform Management Interface table */
+#define ACPI_SIG_SRAT "SRAT" /* System Resource Affinity Table */
+#define ACPI_SIG_TCPA "TCPA" /* Trusted Computing Platform Alliance table */
+#define ACPI_SIG_WDRT "WDRT" /* Watchdog Resource Table */
+
+
+/*
+ * All tables must be byte-packed to match the ACPI specification, since
+ * the tables are provided by the system BIOS.
+ */
+#pragma pack(1)
+
+/*
+ * Note about bitfields: The UINT8 type is used for bitfields in ACPI tables.
+ * This is the only type that is even remotely portable. Anything else is not
+ * portable, so do not use any other bitfield types.
+ */
+
+
+/* Common Sub-table header (used in MADT, SRAT, etc.) */
+
+typedef struct acpi_subtable_header
+{
+ UINT8 Type;
+ UINT8 Length;
+
+} ACPI_SUBTABLE_HEADER;
+
+
+/*******************************************************************************
+ *
+ * ASF - Alert Standard Format table (Signature "ASF!")
+ *
+ * Conforms to the Alert Standard Format Specification V2.0, 23 April 2003
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_asf
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+
+} ACPI_TABLE_ASF;
+
+
+/* ASF subtable header */
+
+typedef struct acpi_asf_header
+{
+ UINT8 Type;
+ UINT8 Reserved;
+ UINT16 Length;
+
+} ACPI_ASF_HEADER;
+
+
+/* Values for Type field above */
+
+enum AcpiAsfType
+{
+ ACPI_ASF_TYPE_INFO = 0,
+ ACPI_ASF_TYPE_ALERT = 1,
+ ACPI_ASF_TYPE_CONTROL = 2,
+ ACPI_ASF_TYPE_BOOT = 3,
+ ACPI_ASF_TYPE_ADDRESS = 4,
+ ACPI_ASF_TYPE_RESERVED = 5
+};
+
+/*
+ * ASF subtables
+ */
+
+/* 0: ASF Information */
+
+typedef struct acpi_asf_info
+{
+ ACPI_ASF_HEADER Header;
+ UINT8 MinResetValue;
+ UINT8 MinPollInterval;
+ UINT16 SystemId;
+ UINT32 MfgId;
+ UINT8 Flags;
+ UINT8 Reserved2[3];
+
+} ACPI_ASF_INFO;
+
+/* 1: ASF Alerts */
+
+typedef struct acpi_asf_alert
+{
+ ACPI_ASF_HEADER Header;
+ UINT8 AssertMask;
+ UINT8 DeassertMask;
+ UINT8 Alerts;
+ UINT8 DataLength;
+
+} ACPI_ASF_ALERT;
+
+typedef struct acpi_asf_alert_data
+{
+ UINT8 Address;
+ UINT8 Command;
+ UINT8 Mask;
+ UINT8 Value;
+ UINT8 SensorType;
+ UINT8 Type;
+ UINT8 Offset;
+ UINT8 SourceType;
+ UINT8 Severity;
+ UINT8 SensorNumber;
+ UINT8 Entity;
+ UINT8 Instance;
+
+} ACPI_ASF_ALERT_DATA;
+
+/* 2: ASF Remote Control */
+
+typedef struct acpi_asf_remote
+{
+ ACPI_ASF_HEADER Header;
+ UINT8 Controls;
+ UINT8 DataLength;
+ UINT16 Reserved2;
+
+} ACPI_ASF_REMOTE;
+
+typedef struct acpi_asf_control_data
+{
+ UINT8 Function;
+ UINT8 Address;
+ UINT8 Command;
+ UINT8 Value;
+
+} ACPI_ASF_CONTROL_DATA;
+
+/* 3: ASF RMCP Boot Options */
+
+typedef struct acpi_asf_rmcp
+{
+ ACPI_ASF_HEADER Header;
+ UINT8 Capabilities[7];
+ UINT8 CompletionCode;
+ UINT32 EnterpriseId;
+ UINT8 Command;
+ UINT16 Parameter;
+ UINT16 BootOptions;
+ UINT16 OemParameters;
+
+} ACPI_ASF_RMCP;
+
+/* 4: ASF Address */
+
+typedef struct acpi_asf_address
+{
+ ACPI_ASF_HEADER Header;
+ UINT8 EpromAddress;
+ UINT8 Devices;
+
+} ACPI_ASF_ADDRESS;
+
+
+/*******************************************************************************
+ *
+ * BOOT - Simple Boot Flag Table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_boot
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT8 CmosIndex; /* Index in CMOS RAM for the boot register */
+ UINT8 Reserved[3];
+
+} ACPI_TABLE_BOOT;
+
+
+/*******************************************************************************
+ *
+ * CPEP - Corrected Platform Error Polling table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_cpep
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT64 Reserved;
+
+} ACPI_TABLE_CPEP;
+
+
+/* Subtable */
+
+typedef struct acpi_cpep_polling
+{
+ UINT8 Type;
+ UINT8 Length;
+ UINT8 Id; /* Processor ID */
+ UINT8 Eid; /* Processor EID */
+ UINT32 Interval; /* Polling interval (msec) */
+
+} ACPI_CPEP_POLLING;
+
+
+/*******************************************************************************
+ *
+ * DBGP - Debug Port table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_dbgp
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT8 Type; /* 0=full 16550, 1=subset of 16550 */
+ UINT8 Reserved[3];
+ ACPI_GENERIC_ADDRESS DebugPort;
+
+} ACPI_TABLE_DBGP;
+
+
+/*******************************************************************************
+ *
+ * DMAR - DMA Remapping table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_dmar
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT8 Width; /* Host Address Width */
+ UINT8 Reserved[11];
+
+} ACPI_TABLE_DMAR;
+
+/* DMAR subtable header */
+
+typedef struct acpi_dmar_header
+{
+ UINT16 Type;
+ UINT16 Length;
+ UINT8 Flags;
+ UINT8 Reserved[3];
+
+} ACPI_DMAR_HEADER;
+
+/* Values for subtable type in ACPI_DMAR_HEADER */
+
+enum AcpiDmarType
+{
+ ACPI_DMAR_TYPE_HARDWARE_UNIT = 0,
+ ACPI_DMAR_TYPE_RESERVED_MEMORY = 1,
+ ACPI_DMAR_TYPE_RESERVED = 2 /* 2 and greater are reserved */
+};
+
+typedef struct acpi_dmar_device_scope
+{
+ UINT8 EntryType;
+ UINT8 Length;
+ UINT8 Segment;
+ UINT8 Bus;
+
+} ACPI_DMAR_DEVICE_SCOPE;
+
+/* Values for EntryType in ACPI_DMAR_DEVICE_SCOPE */
+
+enum AcpiDmarScopeType
+{
+ ACPI_DMAR_SCOPE_TYPE_NOT_USED = 0,
+ ACPI_DMAR_SCOPE_TYPE_ENDPOINT = 1,
+ ACPI_DMAR_SCOPE_TYPE_BRIDGE = 2,
+ ACPI_DMAR_SCOPE_TYPE_RESERVED = 3 /* 3 and greater are reserved */
+};
+
+
+/*
+ * DMAR Sub-tables, correspond to Type in ACPI_DMAR_HEADER
+ */
+
+/* 0: Hardware Unit Definition */
+
+typedef struct acpi_dmar_hardware_unit
+{
+ ACPI_DMAR_HEADER Header;
+ UINT64 Address; /* Register Base Address */
+
+} ACPI_DMAR_HARDWARE_UNIT;
+
+/* Flags */
+
+#define ACPI_DMAR_INCLUDE_ALL (1)
+
+/* 1: Reserved Memory Defininition */
+
+typedef struct acpi_dmar_reserved_memory
+{
+ ACPI_DMAR_HEADER Header;
+ UINT64 Address; /* 4K aligned base address */
+ UINT64 EndAddress; /* 4K aligned limit address */
+
+} ACPI_DMAR_RESERVED_MEMORY;
+
+/* Flags */
+
+#define ACPI_DMAR_ALLOW_ALL (1)
+
+
+/*******************************************************************************
+ *
+ * ECDT - Embedded Controller Boot Resources Table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_ecdt
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ ACPI_GENERIC_ADDRESS Control; /* Address of EC command/status register */
+ ACPI_GENERIC_ADDRESS Data; /* Address of EC data register */
+ UINT32 Uid; /* Unique ID - must be same as the EC _UID method */
+ UINT8 Gpe; /* The GPE for the EC */
+ UINT8 Id[1]; /* Full namepath of the EC in the ACPI namespace */
+
+} ACPI_TABLE_ECDT;
+
+
+/*******************************************************************************
+ *
+ * HPET - High Precision Event Timer table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_hpet
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT32 Id; /* Hardware ID of event timer block */
+ ACPI_GENERIC_ADDRESS Address; /* Address of event timer block */
+ UINT8 Sequence; /* HPET sequence number */
+ UINT16 MinimumTick; /* Main counter min tick, periodic mode */
+ UINT8 Flags;
+
+} ACPI_TABLE_HPET;
+
+/*! Flags */
+
+#define ACPI_HPET_PAGE_PROTECT (1) /* 00: No page protection */
+#define ACPI_HPET_PAGE_PROTECT_4 (1<<1) /* 01: 4KB page protected */
+#define ACPI_HPET_PAGE_PROTECT_64 (1<<2) /* 02: 64KB page protected */
+
+/*! [End] no source code translation !*/
+
+
+/*******************************************************************************
+ *
+ * MADT - Multiple APIC Description Table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_madt
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT32 Address; /* Physical address of local APIC */
+ UINT32 Flags;
+
+} ACPI_TABLE_MADT;
+
+/* Flags */
+
+#define ACPI_MADT_PCAT_COMPAT (1) /* 00: System also has dual 8259s */
+
+/* Values for PCATCompat flag */
+
+#define ACPI_MADT_DUAL_PIC 0
+#define ACPI_MADT_MULTIPLE_APIC 1
+
+
+/* Values for subtable type in ACPI_SUBTABLE_HEADER */
+
+enum AcpiMadtType
+{
+ ACPI_MADT_TYPE_LOCAL_APIC = 0,
+ ACPI_MADT_TYPE_IO_APIC = 1,
+ ACPI_MADT_TYPE_INTERRUPT_OVERRIDE = 2,
+ ACPI_MADT_TYPE_NMI_SOURCE = 3,
+ ACPI_MADT_TYPE_LOCAL_APIC_NMI = 4,
+ ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE = 5,
+ ACPI_MADT_TYPE_IO_SAPIC = 6,
+ ACPI_MADT_TYPE_LOCAL_SAPIC = 7,
+ ACPI_MADT_TYPE_INTERRUPT_SOURCE = 8,
+ ACPI_MADT_TYPE_RESERVED = 9 /* 9 and greater are reserved */
+};
+
+
+/*
+ * MADT Sub-tables, correspond to Type in ACPI_SUBTABLE_HEADER
+ */
+
+/* 0: Processor Local APIC */
+
+typedef struct acpi_madt_local_apic
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT8 ProcessorId; /* ACPI processor id */
+ UINT8 Id; /* Processor's local APIC id */
+ UINT32 LapicFlags;
+
+} ACPI_MADT_LOCAL_APIC;
+
+/* 1: IO APIC */
+
+typedef struct acpi_madt_io_apic
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT8 Id; /* I/O APIC ID */
+ UINT8 Reserved; /* Reserved - must be zero */
+ UINT32 Address; /* APIC physical address */
+ UINT32 GlobalIrqBase; /* Global system interrupt where INTI lines start */
+
+} ACPI_MADT_IO_APIC;
+
+/* 2: Interrupt Override */
+
+typedef struct acpi_madt_interrupt_override
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT8 Bus; /* 0 - ISA */
+ UINT8 SourceIrq; /* Interrupt source (IRQ) */
+ UINT32 GlobalIrq; /* Global system interrupt */
+ UINT16 IntiFlags;
+
+} ACPI_MADT_INTERRUPT_OVERRIDE;
+
+/* 3: NMI Source */
+
+typedef struct acpi_madt_nmi_source
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT16 IntiFlags;
+ UINT32 GlobalIrq; /* Global system interrupt */
+
+} ACPI_MADT_NMI_SOURCE;
+
+/* 4: Local APIC NMI */
+
+typedef struct acpi_madt_local_apic_nmi
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT8 ProcessorId; /* ACPI processor id */
+ UINT16 IntiFlags;
+ UINT8 Lint; /* LINTn to which NMI is connected */
+
+} ACPI_MADT_LOCAL_APIC_NMI;
+
+/* 5: Address Override */
+
+typedef struct acpi_madt_local_apic_override
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT16 Reserved; /* Reserved, must be zero */
+ UINT64 Address; /* APIC physical address */
+
+} ACPI_MADT_LOCAL_APIC_OVERRIDE;
+
+/* 6: I/O Sapic */
+
+typedef struct acpi_madt_io_sapic
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT8 Id; /* I/O SAPIC ID */
+ UINT8 Reserved; /* Reserved, must be zero */
+ UINT32 GlobalIrqBase; /* Global interrupt for SAPIC start */
+ UINT64 Address; /* SAPIC physical address */
+
+} ACPI_MADT_IO_SAPIC;
+
+/* 7: Local Sapic */
+
+typedef struct acpi_madt_local_sapic
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT8 ProcessorId; /* ACPI processor id */
+ UINT8 Id; /* SAPIC ID */
+ UINT8 Eid; /* SAPIC EID */
+ UINT8 Reserved[3]; /* Reserved, must be zero */
+ UINT32 LapicFlags;
+ UINT32 Uid; /* Numeric UID - ACPI 3.0 */
+ char UidString[1]; /* String UID - ACPI 3.0 */
+
+} ACPI_MADT_LOCAL_SAPIC;
+
+/* 8: Platform Interrupt Source */
+
+typedef struct acpi_madt_interrupt_source
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT16 IntiFlags;
+ UINT8 Type; /* 1=PMI, 2=INIT, 3=corrected */
+ UINT8 Id; /* Processor ID */
+ UINT8 Eid; /* Processor EID */
+ UINT8 IoSapicVector; /* Vector value for PMI interrupts */
+ UINT32 GlobalIrq; /* Global system interrupt */
+ UINT32 Flags; /* Interrupt Source Flags */
+
+} ACPI_MADT_INTERRUPT_SOURCE;
+
+/* Flags field above */
+
+#define ACPI_MADT_CPEI_OVERRIDE (1)
+
+
+/*
+ * Common flags fields for MADT subtables
+ */
+
+/* MADT Local APIC flags (LapicFlags) */
+
+#define ACPI_MADT_ENABLED (1) /* 00: Processor is usable if set */
+
+/* MADT MPS INTI flags (IntiFlags) */
+
+#define ACPI_MADT_POLARITY_MASK (3) /* 00-01: Polarity of APIC I/O input signals */
+#define ACPI_MADT_TRIGGER_MASK (3<<2) /* 02-03: Trigger mode of APIC input signals */
+
+/* Values for MPS INTI flags */
+
+#define ACPI_MADT_POLARITY_CONFORMS 0
+#define ACPI_MADT_POLARITY_ACTIVE_HIGH 1
+#define ACPI_MADT_POLARITY_RESERVED 2
+#define ACPI_MADT_POLARITY_ACTIVE_LOW 3
+
+#define ACPI_MADT_TRIGGER_CONFORMS (0)
+#define ACPI_MADT_TRIGGER_EDGE (1<<2)
+#define ACPI_MADT_TRIGGER_RESERVED (2<<2)
+#define ACPI_MADT_TRIGGER_LEVEL (3<<2)
+
+
+/*******************************************************************************
+ *
+ * MCFG - PCI Memory Mapped Configuration table and sub-table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_mcfg
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT8 Reserved[8];
+
+} ACPI_TABLE_MCFG;
+
+
+/* Subtable */
+
+typedef struct acpi_mcfg_allocation
+{
+ UINT64 Address; /* Base address, processor-relative */
+ UINT16 PciSegment; /* PCI segment group number */
+ UINT8 StartBusNumber; /* Starting PCI Bus number */
+ UINT8 EndBusNumber; /* Final PCI Bus number */
+ UINT32 Reserved;
+
+} ACPI_MCFG_ALLOCATION;
+
+
+/*******************************************************************************
+ *
+ * SBST - Smart Battery Specification Table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_sbst
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT32 WarningLevel;
+ UINT32 LowLevel;
+ UINT32 CriticalLevel;
+
+} ACPI_TABLE_SBST;
+
+
+/*******************************************************************************
+ *
+ * SLIT - System Locality Distance Information Table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_slit
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT64 LocalityCount;
+ UINT8 Entry[1]; /* Real size = localities^2 */
+
+} ACPI_TABLE_SLIT;
+
+
+/*******************************************************************************
+ *
+ * SPCR - Serial Port Console Redirection table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_spcr
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT8 InterfaceType; /* 0=full 16550, 1=subset of 16550 */
+ UINT8 Reserved[3];
+ ACPI_GENERIC_ADDRESS SerialPort;
+ UINT8 InterruptType;
+ UINT8 PcInterrupt;
+ UINT32 Interrupt;
+ UINT8 BaudRate;
+ UINT8 Parity;
+ UINT8 StopBits;
+ UINT8 FlowControl;
+ UINT8 TerminalType;
+ UINT8 Reserved1;
+ UINT16 PciDeviceId;
+ UINT16 PciVendorId;
+ UINT8 PciBus;
+ UINT8 PciDevice;
+ UINT8 PciFunction;
+ UINT32 PciFlags;
+ UINT8 PciSegment;
+ UINT32 Reserved2;
+
+} ACPI_TABLE_SPCR;
+
+
+/*******************************************************************************
+ *
+ * SPMI - Server Platform Management Interface table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_spmi
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT8 Reserved;
+ UINT8 InterfaceType;
+ UINT16 SpecRevision; /* Version of IPMI */
+ UINT8 InterruptType;
+ UINT8 GpeNumber; /* GPE assigned */
+ UINT8 Reserved1;
+ UINT8 PciDeviceFlag;
+ UINT32 Interrupt;
+ ACPI_GENERIC_ADDRESS IpmiRegister;
+ UINT8 PciSegment;
+ UINT8 PciBus;
+ UINT8 PciDevice;
+ UINT8 PciFunction;
+
+} ACPI_TABLE_SPMI;
+
+
+/*******************************************************************************
+ *
+ * SRAT - System Resource Affinity Table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_srat
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT32 TableRevision; /* Must be value '1' */
+ UINT64 Reserved; /* Reserved, must be zero */
+
+} ACPI_TABLE_SRAT;
+
+/* Values for subtable type in ACPI_SUBTABLE_HEADER */
+
+enum AcpiSratType
+{
+ ACPI_SRAT_TYPE_CPU_AFFINITY = 0,
+ ACPI_SRAT_TYPE_MEMORY_AFFINITY = 1,
+ ACPI_SRAT_TYPE_RESERVED = 2
+};
+
+/* SRAT sub-tables */
+
+typedef struct acpi_srat_cpu_affinity
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT8 ProximityDomainLo;
+ UINT8 ApicId;
+ UINT32 Flags;
+ UINT8 LocalSapicEid;
+ UINT8 ProximityDomainHi[3];
+ UINT32 Reserved; /* Reserved, must be zero */
+
+} ACPI_SRAT_CPU_AFFINITY;
+
+/* Flags */
+
+#define ACPI_SRAT_CPU_ENABLED (1) /* 00: Use affinity structure */
+
+
+typedef struct acpi_srat_mem_affinity
+{
+ ACPI_SUBTABLE_HEADER Header;
+ UINT32 ProximityDomain;
+ UINT16 Reserved; /* Reserved, must be zero */
+ UINT64 BaseAddress;
+ UINT64 Length;
+ UINT32 MemoryType; /* See acpi_address_range_id */
+ UINT32 Flags;
+ UINT64 Reserved1; /* Reserved, must be zero */
+
+} ACPI_SRAT_MEM_AFFINITY;
+
+/* Flags */
+
+#define ACPI_SRAT_MEM_ENABLED (1) /* 00: Use affinity structure */
+#define ACPI_SRAT_MEM_HOT_PLUGGABLE (1<<1) /* 01: Memory region is hot pluggable */
+#define ACPI_SRAT_MEM_NON_VOLATILE (1<<2) /* 02: Memory region is non-volatile */
+
+/* Memory types */
+
+enum acpi_address_range_id
+{
+ ACPI_ADDRESS_RANGE_MEMORY = 1,
+ ACPI_ADDRESS_RANGE_RESERVED = 2,
+ ACPI_ADDRESS_RANGE_ACPI = 3,
+ ACPI_ADDRESS_RANGE_NVS = 4,
+ ACPI_ADDRESS_RANGE_COUNT = 5
+};
+
+
+/*******************************************************************************
+ *
+ * TCPA - Trusted Computing Platform Alliance table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_tcpa
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT16 Reserved;
+ UINT32 MaxLogLength; /* Maximum length for the event log area */
+ UINT64 LogAddress; /* Address of the event log area */
+
+} ACPI_TABLE_TCPA;
+
+
+/*******************************************************************************
+ *
+ * WDRT - Watchdog Resource Table
+ *
+ ******************************************************************************/
+
+typedef struct acpi_table_wdrt
+{
+ ACPI_TABLE_HEADER Header; /* Common ACPI table header */
+ UINT32 HeaderLength; /* Watchdog Header Length */
+ UINT8 PciSegment; /* PCI Segment number */
+ UINT8 PciBus; /* PCI Bus number */
+ UINT8 PciDevice; /* PCI Device number */
+ UINT8 PciFunction; /* PCI Function number */
+ UINT32 TimerPeriod; /* Period of one timer count (msec) */
+ UINT32 MaxCount; /* Maximum counter value supported */
+ UINT32 MinCount; /* Minimum counter value */
+ UINT8 Flags;
+ UINT8 Reserved[3];
+ UINT32 Entries; /* Number of watchdog entries that follow */
+
+} ACPI_TABLE_WDRT;
+
+/* Flags */
+
+#define ACPI_WDRT_TIMER_ENABLED (1) /* 00: Timer enabled */
+
+
+/* Reset to default packing */
+
+#pragma pack()
+
+#endif /* __ACTBL1_H__ */
diff --git a/sys/contrib/dev/acpica/actbl2.h b/sys/contrib/dev/acpica/actbl2.h
new file mode 100644
index 0000000..97979c6
--- /dev/null
+++ b/sys/contrib/dev/acpica/actbl2.h
@@ -0,0 +1,123 @@
+/******************************************************************************
+ *
+ * Name: actbl2.h - ACPI Specification Revision 2.0 Tables
+ * $Revision: 1.51 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACTBL2_H__
+#define __ACTBL2_H__
+
+/* Code moved to both actbl.h and actbl1.h */
+
+#endif /* __ACTBL2_H__ */
+
diff --git a/sys/contrib/dev/acpica/actypes.h b/sys/contrib/dev/acpica/actypes.h
new file mode 100644
index 0000000..9f04da2
--- /dev/null
+++ b/sys/contrib/dev/acpica/actypes.h
@@ -0,0 +1,1453 @@
+/******************************************************************************
+ *
+ * Name: actypes.h - Common data types for the entire ACPI subsystem
+ * $Revision: 1.316 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __ACTYPES_H__
+#define __ACTYPES_H__
+
+/* acpisrc:StructDefs -- for acpisrc conversion */
+
+/*
+ * ACPI_MACHINE_WIDTH must be specified in an OS- or compiler-dependent header
+ * and must be either 32 or 64. 16-bit ACPICA is no longer supported, as of
+ * 12/2006.
+ */
+#ifndef ACPI_MACHINE_WIDTH
+#error ACPI_MACHINE_WIDTH not defined
+#endif
+
+/*! [Begin] no source code translation */
+
+/*
+ * Data type ranges
+ * Note: These macros are designed to be compiler independent as well as
+ * working around problems that some 32-bit compilers have with 64-bit
+ * constants.
+ */
+#define ACPI_UINT8_MAX (UINT8) (~((UINT8) 0)) /* 0xFF */
+#define ACPI_UINT16_MAX (UINT16)(~((UINT16) 0)) /* 0xFFFF */
+#define ACPI_UINT32_MAX (UINT32)(~((UINT32) 0)) /* 0xFFFFFFFF */
+#define ACPI_UINT64_MAX (UINT64)(~((UINT64) 0)) /* 0xFFFFFFFFFFFFFFFF */
+#define ACPI_ASCII_MAX 0x7F
+
+
+/*
+ * Architecture-specific ACPICA Subsystem Data Types
+ *
+ * The goal of these types is to provide source code portability across
+ * 16-bit, 32-bit, and 64-bit targets.
+ *
+ * 1) The following types are of fixed size for all targets (16/32/64):
+ *
+ * BOOLEAN Logical boolean
+ *
+ * UINT8 8-bit (1 byte) unsigned value
+ * UINT16 16-bit (2 byte) unsigned value
+ * UINT32 32-bit (4 byte) unsigned value
+ * UINT64 64-bit (8 byte) unsigned value
+ *
+ * INT16 16-bit (2 byte) signed value
+ * INT32 32-bit (4 byte) signed value
+ * INT64 64-bit (8 byte) signed value
+ *
+ * COMPILER_DEPENDENT_UINT64/INT64 - These types are defined in the
+ * compiler-dependent header(s) and were introduced because there is no common
+ * 64-bit integer type across the various compilation models, as shown in
+ * the table below.
+ *
+ * Datatype LP64 ILP64 LLP64 ILP32 LP32 16bit
+ * char 8 8 8 8 8 8
+ * short 16 16 16 16 16 16
+ * _int32 32
+ * int 32 64 32 32 16 16
+ * long 64 64 32 32 32 32
+ * long long 64 64
+ * pointer 64 64 64 32 32 32
+ *
+ * Note: ILP64 and LP32 are currently not supported.
+ *
+ *
+ * 2) These types represent the native word size of the target mode of the
+ * processor, and may be 16-bit, 32-bit, or 64-bit as required. They are
+ * usually used for memory allocation, efficient loop counters, and array
+ * indexes. The types are similar to the size_t type in the C library and are
+ * required because there is no C type that consistently represents the native
+ * data width.
+ *
+ * ACPI_SIZE 16/32/64-bit unsigned value
+ * ACPI_NATIVE_UINT 16/32/64-bit unsigned value
+ * ACPI_NATIVE_INT 16/32/64-bit signed value
+ *
+ */
+
+/*******************************************************************************
+ *
+ * Common types for all compilers, all targets
+ *
+ ******************************************************************************/
+
+typedef unsigned char BOOLEAN;
+typedef unsigned char UINT8;
+typedef unsigned short UINT16;
+typedef COMPILER_DEPENDENT_UINT64 UINT64;
+typedef COMPILER_DEPENDENT_INT64 INT64;
+
+/*! [End] no source code translation !*/
+
+
+/*******************************************************************************
+ *
+ * Types specific to 64-bit targets
+ *
+ ******************************************************************************/
+
+#if ACPI_MACHINE_WIDTH == 64
+
+/*! [Begin] no source code translation (keep the typedefs as-is) */
+
+typedef unsigned int UINT32;
+typedef int INT32;
+
+/*! [End] no source code translation !*/
+
+
+typedef UINT64 ACPI_NATIVE_UINT;
+typedef INT64 ACPI_NATIVE_INT;
+
+typedef UINT64 ACPI_IO_ADDRESS;
+typedef UINT64 ACPI_PHYSICAL_ADDRESS;
+
+#define ACPI_MAX_PTR ACPI_UINT64_MAX
+#define ACPI_SIZE_MAX ACPI_UINT64_MAX
+
+#define ACPI_USE_NATIVE_DIVIDE /* Has native 64-bit integer support */
+
+/*
+ * In the case of the Itanium Processor Family (IPF), the hardware does not
+ * support misaligned memory transfers. Set the MISALIGNMENT_NOT_SUPPORTED flag
+ * to indicate that special precautions must be taken to avoid alignment faults.
+ * (IA64 or ia64 is currently used by existing compilers to indicate IPF.)
+ *
+ * Note: EM64T and other X86-64 processors support misaligned transfers,
+ * so there is no need to define this flag.
+ */
+#if defined (__IA64__) || defined (__ia64__)
+#define ACPI_MISALIGNMENT_NOT_SUPPORTED
+#endif
+
+
+/*******************************************************************************
+ *
+ * Types specific to 32-bit targets
+ *
+ ******************************************************************************/
+
+#elif ACPI_MACHINE_WIDTH == 32
+
+/*! [Begin] no source code translation (keep the typedefs as-is) */
+
+typedef unsigned int UINT32;
+typedef int INT32;
+
+/*! [End] no source code translation !*/
+
+
+typedef UINT32 ACPI_NATIVE_UINT;
+typedef INT32 ACPI_NATIVE_INT;
+
+typedef UINT32 ACPI_IO_ADDRESS;
+typedef UINT32 ACPI_PHYSICAL_ADDRESS;
+
+#define ACPI_MAX_PTR ACPI_UINT32_MAX
+#define ACPI_SIZE_MAX ACPI_UINT32_MAX
+
+#else
+
+/* ACPI_MACHINE_WIDTH must be either 64 or 32 */
+
+#error unknown ACPI_MACHINE_WIDTH
+#endif
+
+
+/* Variable-width type, used instead of clib size_t */
+
+typedef ACPI_NATIVE_UINT ACPI_SIZE;
+
+
+/*******************************************************************************
+ *
+ * OS-dependent and compiler-dependent types
+ *
+ * If the defaults below are not appropriate for the host system, they can
+ * be defined in the compiler-specific or OS-specific header, and this will
+ * take precedence.
+ *
+ ******************************************************************************/
+
+
+/* Value returned by AcpiOsGetThreadId */
+
+#ifndef ACPI_THREAD_ID
+#define ACPI_THREAD_ID ACPI_NATIVE_UINT
+#endif
+
+/* Object returned from AcpiOsCreateLock */
+
+#ifndef ACPI_SPINLOCK
+#define ACPI_SPINLOCK void *
+#endif
+
+/* Flags for AcpiOsAcquireLock/AcpiOsReleaseLock */
+
+#ifndef ACPI_CPU_FLAGS
+#define ACPI_CPU_FLAGS ACPI_NATIVE_UINT
+#endif
+
+/* Object returned from AcpiOsCreateCache */
+
+#ifndef ACPI_CACHE_T
+#define ACPI_CACHE_T ACPI_MEMORY_LIST
+#endif
+
+/* Use C99 uintptr_t for pointer casting if available, "void *" otherwise */
+
+#ifndef ACPI_UINTPTR_T
+#define ACPI_UINTPTR_T void *
+#endif
+
+/*
+ * ACPI_PRINTF_LIKE is used to tag functions as "printf-like" because
+ * some compilers can catch printf format string problems
+ */
+#ifndef ACPI_PRINTF_LIKE
+#define ACPI_PRINTF_LIKE(c)
+#endif
+
+/*
+ * Some compilers complain about unused variables. Sometimes we don't want to
+ * use all the variables (for example, _AcpiModuleName). This allows us
+ * to to tell the compiler in a per-variable manner that a variable
+ * is unused
+ */
+#ifndef ACPI_UNUSED_VAR
+#define ACPI_UNUSED_VAR
+#endif
+
+/*
+ * All ACPICA functions that are available to the rest of the kernel are
+ * tagged with this macro which can be defined as appropriate for the host.
+ */
+#ifndef ACPI_EXPORT_SYMBOL
+#define ACPI_EXPORT_SYMBOL(Symbol)
+#endif
+
+
+/*******************************************************************************
+ *
+ * Independent types
+ *
+ ******************************************************************************/
+
+/* Logical defines and NULL */
+
+#ifdef FALSE
+#undef FALSE
+#endif
+#define FALSE (1 == 0)
+
+#ifdef TRUE
+#undef TRUE
+#endif
+#define TRUE (1 == 1)
+
+#ifndef NULL
+#define NULL (void *) 0
+#endif
+
+
+/*
+ * Mescellaneous types
+ */
+typedef UINT32 ACPI_STATUS; /* All ACPI Exceptions */
+typedef UINT32 ACPI_NAME; /* 4-byte ACPI name */
+typedef char * ACPI_STRING; /* Null terminated ASCII string */
+typedef void * ACPI_HANDLE; /* Actually a ptr to a NS Node */
+
+typedef struct uint64_struct
+{
+ UINT32 Lo;
+ UINT32 Hi;
+
+} UINT64_STRUCT;
+
+typedef union uint64_overlay
+{
+ UINT64 Full;
+ UINT64_STRUCT Part;
+
+} UINT64_OVERLAY;
+
+typedef struct uint32_struct
+{
+ UINT32 Lo;
+ UINT32 Hi;
+
+} UINT32_STRUCT;
+
+
+/* Synchronization objects */
+
+#define ACPI_MUTEX void *
+#define ACPI_SEMAPHORE void *
+
+
+/*
+ * Acpi integer width. In ACPI version 1, integers are 32 bits. In ACPI
+ * version 2, integers are 64 bits. Note that this pertains to the ACPI integer
+ * type only, not other integers used in the implementation of the ACPI CA
+ * subsystem.
+ */
+typedef UINT64 ACPI_INTEGER;
+#define ACPI_INTEGER_MAX ACPI_UINT64_MAX
+#define ACPI_INTEGER_BIT_SIZE 64
+#define ACPI_MAX_DECIMAL_DIGITS 20 /* 2^64 = 18,446,744,073,709,551,616 */
+
+
+#if ACPI_MACHINE_WIDTH == 64
+#define ACPI_USE_NATIVE_DIVIDE /* Use compiler native 64-bit divide */
+#endif
+
+#define ACPI_MAX64_DECIMAL_DIGITS 20
+#define ACPI_MAX32_DECIMAL_DIGITS 10
+#define ACPI_MAX16_DECIMAL_DIGITS 5
+#define ACPI_MAX8_DECIMAL_DIGITS 3
+
+/*
+ * Constants with special meanings
+ */
+#define ACPI_ROOT_OBJECT ACPI_ADD_PTR (ACPI_HANDLE, NULL, ACPI_MAX_PTR)
+
+
+/*
+ * Initialization sequence
+ */
+#define ACPI_FULL_INITIALIZATION 0x00
+#define ACPI_NO_ADDRESS_SPACE_INIT 0x01
+#define ACPI_NO_HARDWARE_INIT 0x02
+#define ACPI_NO_EVENT_INIT 0x04
+#define ACPI_NO_HANDLER_INIT 0x08
+#define ACPI_NO_ACPI_ENABLE 0x10
+#define ACPI_NO_DEVICE_INIT 0x20
+#define ACPI_NO_OBJECT_INIT 0x40
+
+/*
+ * Initialization state
+ */
+#define ACPI_SUBSYSTEM_INITIALIZE 0x01
+#define ACPI_INITIALIZED_OK 0x02
+
+/*
+ * Power state values
+ */
+#define ACPI_STATE_UNKNOWN (UINT8) 0xFF
+
+#define ACPI_STATE_S0 (UINT8) 0
+#define ACPI_STATE_S1 (UINT8) 1
+#define ACPI_STATE_S2 (UINT8) 2
+#define ACPI_STATE_S3 (UINT8) 3
+#define ACPI_STATE_S4 (UINT8) 4
+#define ACPI_STATE_S5 (UINT8) 5
+#define ACPI_S_STATES_MAX ACPI_STATE_S5
+#define ACPI_S_STATE_COUNT 6
+
+#define ACPI_STATE_D0 (UINT8) 0
+#define ACPI_STATE_D1 (UINT8) 1
+#define ACPI_STATE_D2 (UINT8) 2
+#define ACPI_STATE_D3 (UINT8) 3
+#define ACPI_D_STATES_MAX ACPI_STATE_D3
+#define ACPI_D_STATE_COUNT 4
+
+#define ACPI_STATE_C0 (UINT8) 0
+#define ACPI_STATE_C1 (UINT8) 1
+#define ACPI_STATE_C2 (UINT8) 2
+#define ACPI_STATE_C3 (UINT8) 3
+#define ACPI_C_STATES_MAX ACPI_STATE_C3
+#define ACPI_C_STATE_COUNT 4
+
+/*
+ * Sleep type invalid value
+ */
+#define ACPI_SLEEP_TYPE_MAX 0x7
+#define ACPI_SLEEP_TYPE_INVALID 0xFF
+
+/*
+ * Standard notify values
+ */
+#define ACPI_NOTIFY_BUS_CHECK (UINT8) 0
+#define ACPI_NOTIFY_DEVICE_CHECK (UINT8) 1
+#define ACPI_NOTIFY_DEVICE_WAKE (UINT8) 2
+#define ACPI_NOTIFY_EJECT_REQUEST (UINT8) 3
+#define ACPI_NOTIFY_DEVICE_CHECK_LIGHT (UINT8) 4
+#define ACPI_NOTIFY_FREQUENCY_MISMATCH (UINT8) 5
+#define ACPI_NOTIFY_BUS_MODE_MISMATCH (UINT8) 6
+#define ACPI_NOTIFY_POWER_FAULT (UINT8) 7
+
+/*
+ * 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 ObjectType() operator (See the ACPI Spec). Therefore,
+ * only add to the first group if the spec changes.
+ *
+ * NOTE: Types must be kept in sync with the global AcpiNsProperties
+ * and AcpiNsTypeNames arrays.
+ */
+typedef UINT32 ACPI_OBJECT_TYPE;
+
+#define ACPI_TYPE_ANY 0x00
+#define ACPI_TYPE_INTEGER 0x01 /* Byte/Word/Dword/Zero/One/Ones */
+#define ACPI_TYPE_STRING 0x02
+#define ACPI_TYPE_BUFFER 0x03
+#define ACPI_TYPE_PACKAGE 0x04 /* ByteConst, multiple DataTerm/Constant/SuperName */
+#define ACPI_TYPE_FIELD_UNIT 0x05
+#define ACPI_TYPE_DEVICE 0x06 /* Name, multiple Node */
+#define ACPI_TYPE_EVENT 0x07
+#define ACPI_TYPE_METHOD 0x08 /* Name, ByteConst, multiple Code */
+#define ACPI_TYPE_MUTEX 0x09
+#define ACPI_TYPE_REGION 0x0A
+#define ACPI_TYPE_POWER 0x0B /* Name,ByteConst,WordConst,multi Node */
+#define ACPI_TYPE_PROCESSOR 0x0C /* Name,ByteConst,DWordConst,ByteConst,multi NmO */
+#define ACPI_TYPE_THERMAL 0x0D /* Name, multiple Node */
+#define ACPI_TYPE_BUFFER_FIELD 0x0E
+#define ACPI_TYPE_DDB_HANDLE 0x0F
+#define ACPI_TYPE_DEBUG_OBJECT 0x10
+
+#define ACPI_TYPE_EXTERNAL_MAX 0x10
+
+/*
+ * These are object types that do not map directly to the ACPI
+ * ObjectType() 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, RefOf, Index */
+#define ACPI_TYPE_LOCAL_ALIAS 0x15
+#define ACPI_TYPE_LOCAL_METHOD_ALIAS 0x16
+#define ACPI_TYPE_LOCAL_NOTIFY 0x17
+#define ACPI_TYPE_LOCAL_ADDRESS_HANDLER 0x18
+#define ACPI_TYPE_LOCAL_RESOURCE 0x19
+#define ACPI_TYPE_LOCAL_RESOURCE_FIELD 0x1A
+#define ACPI_TYPE_LOCAL_SCOPE 0x1B /* 1 Name, multiple ObjectList Nodes */
+
+#define ACPI_TYPE_NS_NODE_MAX 0x1B /* Last typecode used within a NS Node */
+
+/*
+ * These are special object types that never appear in
+ * a Namespace node, only in an ACPI_OPERAND_OBJECT
+ */
+#define ACPI_TYPE_LOCAL_EXTRA 0x1C
+#define ACPI_TYPE_LOCAL_DATA 0x1D
+
+#define ACPI_TYPE_LOCAL_MAX 0x1D
+
+/* All types above here are invalid */
+
+#define ACPI_TYPE_INVALID 0x1E
+#define ACPI_TYPE_NOT_FOUND 0xFF
+
+/*
+ * All I/O
+ */
+#define ACPI_READ 0
+#define ACPI_WRITE 1
+#define ACPI_IO_MASK 1
+
+/*
+ * Event Types: Fixed & General Purpose
+ */
+typedef UINT32 ACPI_EVENT_TYPE;
+
+/*
+ * Fixed events
+ */
+#define ACPI_EVENT_PMTIMER 0
+#define ACPI_EVENT_GLOBAL 1
+#define ACPI_EVENT_POWER_BUTTON 2
+#define ACPI_EVENT_SLEEP_BUTTON 3
+#define ACPI_EVENT_RTC 4
+#define ACPI_EVENT_MAX 4
+#define ACPI_NUM_FIXED_EVENTS ACPI_EVENT_MAX + 1
+
+/*
+ * Event Status - Per event
+ * -------------
+ * The encoding of ACPI_EVENT_STATUS is illustrated below.
+ * Note that a set bit (1) indicates the property is TRUE
+ * (e.g. if bit 0 is set then the event is enabled).
+ * +-------------+-+-+-+
+ * | Bits 31:3 |2|1|0|
+ * +-------------+-+-+-+
+ * | | | |
+ * | | | +- Enabled?
+ * | | +--- Enabled for wake?
+ * | +----- Set?
+ * +----------- <Reserved>
+ */
+typedef UINT32 ACPI_EVENT_STATUS;
+
+#define ACPI_EVENT_FLAG_DISABLED (ACPI_EVENT_STATUS) 0x00
+#define ACPI_EVENT_FLAG_ENABLED (ACPI_EVENT_STATUS) 0x01
+#define ACPI_EVENT_FLAG_WAKE_ENABLED (ACPI_EVENT_STATUS) 0x02
+#define ACPI_EVENT_FLAG_SET (ACPI_EVENT_STATUS) 0x04
+
+/*
+ * General Purpose Events (GPE)
+ */
+#define ACPI_GPE_INVALID 0xFF
+#define ACPI_GPE_MAX 0xFF
+#define ACPI_NUM_GPE 256
+
+#define ACPI_GPE_ENABLE 0
+#define ACPI_GPE_DISABLE 1
+
+
+/*
+ * GPE info flags - Per GPE
+ * +-+-+-+---+---+-+
+ * |7|6|5|4:3|2:1|0|
+ * +-+-+-+---+---+-+
+ * | | | | | |
+ * | | | | | +--- Interrupt type: Edge or Level Triggered
+ * | | | | +--- Type: Wake-only, Runtime-only, or wake/runtime
+ * | | | +--- Type of dispatch -- to method, handler, or none
+ * | | +--- Enabled for runtime?
+ * | +--- Enabled for wake?
+ * +--- Unused
+ */
+#define ACPI_GPE_XRUPT_TYPE_MASK (UINT8) 0x01
+#define ACPI_GPE_LEVEL_TRIGGERED (UINT8) 0x01
+#define ACPI_GPE_EDGE_TRIGGERED (UINT8) 0x00
+
+#define ACPI_GPE_TYPE_MASK (UINT8) 0x06
+#define ACPI_GPE_TYPE_WAKE_RUN (UINT8) 0x06
+#define ACPI_GPE_TYPE_WAKE (UINT8) 0x02
+#define ACPI_GPE_TYPE_RUNTIME (UINT8) 0x04 /* Default */
+
+#define ACPI_GPE_DISPATCH_MASK (UINT8) 0x18
+#define ACPI_GPE_DISPATCH_HANDLER (UINT8) 0x08
+#define ACPI_GPE_DISPATCH_METHOD (UINT8) 0x10
+#define ACPI_GPE_DISPATCH_NOT_USED (UINT8) 0x00 /* Default */
+
+#define ACPI_GPE_RUN_ENABLE_MASK (UINT8) 0x20
+#define ACPI_GPE_RUN_ENABLED (UINT8) 0x20
+#define ACPI_GPE_RUN_DISABLED (UINT8) 0x00 /* Default */
+
+#define ACPI_GPE_WAKE_ENABLE_MASK (UINT8) 0x40
+#define ACPI_GPE_WAKE_ENABLED (UINT8) 0x40
+#define ACPI_GPE_WAKE_DISABLED (UINT8) 0x00 /* Default */
+
+#define ACPI_GPE_ENABLE_MASK (UINT8) 0x60 /* Both run/wake */
+
+/*
+ * Flags for GPE and Lock interfaces
+ */
+#define ACPI_EVENT_WAKE_ENABLE 0x2 /* AcpiGpeEnable */
+#define ACPI_EVENT_WAKE_DISABLE 0x2 /* AcpiGpeDisable */
+
+#define ACPI_NOT_ISR 0x1
+#define ACPI_ISR 0x0
+
+
+/* Notify types */
+
+#define ACPI_SYSTEM_NOTIFY 0x1
+#define ACPI_DEVICE_NOTIFY 0x2
+#define ACPI_ALL_NOTIFY 0x3
+#define ACPI_MAX_NOTIFY_HANDLER_TYPE 0x3
+
+#define ACPI_MAX_SYS_NOTIFY 0x7f
+
+
+/* Address Space (Operation Region) Types */
+
+typedef UINT8 ACPI_ADR_SPACE_TYPE;
+
+#define ACPI_ADR_SPACE_SYSTEM_MEMORY (ACPI_ADR_SPACE_TYPE) 0
+#define ACPI_ADR_SPACE_SYSTEM_IO (ACPI_ADR_SPACE_TYPE) 1
+#define ACPI_ADR_SPACE_PCI_CONFIG (ACPI_ADR_SPACE_TYPE) 2
+#define ACPI_ADR_SPACE_EC (ACPI_ADR_SPACE_TYPE) 3
+#define ACPI_ADR_SPACE_SMBUS (ACPI_ADR_SPACE_TYPE) 4
+#define ACPI_ADR_SPACE_CMOS (ACPI_ADR_SPACE_TYPE) 5
+#define ACPI_ADR_SPACE_PCI_BAR_TARGET (ACPI_ADR_SPACE_TYPE) 6
+#define ACPI_ADR_SPACE_DATA_TABLE (ACPI_ADR_SPACE_TYPE) 7
+#define ACPI_ADR_SPACE_FIXED_HARDWARE (ACPI_ADR_SPACE_TYPE) 127
+
+
+/*
+ * BitRegister IDs
+ * These are bitfields defined within the full ACPI registers
+ */
+#define ACPI_BITREG_TIMER_STATUS 0x00
+#define ACPI_BITREG_BUS_MASTER_STATUS 0x01
+#define ACPI_BITREG_GLOBAL_LOCK_STATUS 0x02
+#define ACPI_BITREG_POWER_BUTTON_STATUS 0x03
+#define ACPI_BITREG_SLEEP_BUTTON_STATUS 0x04
+#define ACPI_BITREG_RT_CLOCK_STATUS 0x05
+#define ACPI_BITREG_WAKE_STATUS 0x06
+#define ACPI_BITREG_PCIEXP_WAKE_STATUS 0x07
+
+#define ACPI_BITREG_TIMER_ENABLE 0x08
+#define ACPI_BITREG_GLOBAL_LOCK_ENABLE 0x09
+#define ACPI_BITREG_POWER_BUTTON_ENABLE 0x0A
+#define ACPI_BITREG_SLEEP_BUTTON_ENABLE 0x0B
+#define ACPI_BITREG_RT_CLOCK_ENABLE 0x0C
+#define ACPI_BITREG_WAKE_ENABLE 0x0D
+#define ACPI_BITREG_PCIEXP_WAKE_DISABLE 0x0E
+
+#define ACPI_BITREG_SCI_ENABLE 0x0F
+#define ACPI_BITREG_BUS_MASTER_RLD 0x10
+#define ACPI_BITREG_GLOBAL_LOCK_RELEASE 0x11
+#define ACPI_BITREG_SLEEP_TYPE_A 0x12
+#define ACPI_BITREG_SLEEP_TYPE_B 0x13
+#define ACPI_BITREG_SLEEP_ENABLE 0x14
+
+#define ACPI_BITREG_ARB_DISABLE 0x15
+
+#define ACPI_BITREG_MAX 0x15
+#define ACPI_NUM_BITREG ACPI_BITREG_MAX + 1
+
+
+/*
+ * External ACPI object definition
+ */
+typedef union acpi_object
+{
+ ACPI_OBJECT_TYPE Type; /* See definition of AcpiNsType for values */
+ struct
+ {
+ ACPI_OBJECT_TYPE Type;
+ ACPI_INTEGER Value; /* The actual number */
+ } Integer;
+
+ struct
+ {
+ ACPI_OBJECT_TYPE Type;
+ UINT32 Length; /* # of bytes in string, excluding trailing null */
+ char *Pointer; /* points to the string value */
+ } String;
+
+ struct
+ {
+ ACPI_OBJECT_TYPE Type;
+ UINT32 Length; /* # of bytes in buffer */
+ UINT8 *Pointer; /* points to the buffer */
+ } Buffer;
+
+ struct
+ {
+ ACPI_OBJECT_TYPE Type;
+ UINT32 Fill1;
+ ACPI_HANDLE Handle; /* object reference */
+ } Reference;
+
+ struct
+ {
+ ACPI_OBJECT_TYPE Type;
+ UINT32 Count; /* # of elements in package */
+ union acpi_object *Elements; /* Pointer to an array of ACPI_OBJECTs */
+ } Package;
+
+ struct
+ {
+ ACPI_OBJECT_TYPE Type;
+ UINT32 ProcId;
+ ACPI_IO_ADDRESS PblkAddress;
+ UINT32 PblkLength;
+ } Processor;
+
+ struct
+ {
+ ACPI_OBJECT_TYPE Type;
+ UINT32 SystemLevel;
+ UINT32 ResourceOrder;
+ } PowerResource;
+
+} ACPI_OBJECT;
+
+
+/*
+ * List of objects, used as a parameter list for control method evaluation
+ */
+typedef struct acpi_object_list
+{
+ UINT32 Count;
+ ACPI_OBJECT *Pointer;
+
+} ACPI_OBJECT_LIST;
+
+
+/*
+ * 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)
+
+typedef struct acpi_buffer
+{
+ ACPI_SIZE Length; /* Length in bytes of the buffer */
+ void *Pointer; /* pointer to buffer */
+
+} ACPI_BUFFER;
+
+
+/*
+ * NameType for AcpiGetName
+ */
+#define ACPI_FULL_PATHNAME 0
+#define ACPI_SINGLE_NAME 1
+#define ACPI_NAME_TYPE_MAX 1
+
+
+/*
+ * Structure and flags for AcpiGetSystemInfo
+ */
+#define ACPI_SYS_MODE_UNKNOWN 0x0000
+#define ACPI_SYS_MODE_ACPI 0x0001
+#define ACPI_SYS_MODE_LEGACY 0x0002
+#define ACPI_SYS_MODES_MASK 0x0003
+
+
+/*
+ * System info returned by AcpiGetSystemInfo()
+ */
+typedef struct acpi_system_info
+{
+ UINT32 AcpiCaVersion;
+ UINT32 Flags;
+ UINT32 TimerResolution;
+ UINT32 Reserved1;
+ UINT32 Reserved2;
+ UINT32 DebugLevel;
+ UINT32 DebugLayer;
+
+} ACPI_SYSTEM_INFO;
+
+
+/*
+ * Types specific to the OS service interfaces
+ */
+typedef UINT32
+(ACPI_SYSTEM_XFACE *ACPI_OSD_HANDLER) (
+ void *Context);
+
+typedef void
+(ACPI_SYSTEM_XFACE *ACPI_OSD_EXEC_CALLBACK) (
+ void *Context);
+
+/*
+ * Various handlers and callback procedures
+ */
+typedef
+UINT32 (*ACPI_EVENT_HANDLER) (
+ void *Context);
+
+typedef
+void (*ACPI_NOTIFY_HANDLER) (
+ ACPI_HANDLE Device,
+ UINT32 Value,
+ void *Context);
+
+typedef
+void (*ACPI_OBJECT_HANDLER) (
+ ACPI_HANDLE Object,
+ UINT32 Function,
+ void *Data);
+
+typedef
+ACPI_STATUS (*ACPI_INIT_HANDLER) (
+ ACPI_HANDLE Object,
+ UINT32 Function);
+
+#define ACPI_INIT_DEVICE_INI 1
+
+typedef
+ACPI_STATUS (*ACPI_EXCEPTION_HANDLER) (
+ ACPI_STATUS AmlStatus,
+ ACPI_NAME Name,
+ UINT16 Opcode,
+ UINT32 AmlOffset,
+ void *Context);
+
+
+/* Address Spaces (For Operation Regions) */
+
+typedef
+ACPI_STATUS (*ACPI_ADR_SPACE_HANDLER) (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext);
+
+#define ACPI_DEFAULT_HANDLER NULL
+
+
+typedef
+ACPI_STATUS (*ACPI_ADR_SPACE_SETUP) (
+ ACPI_HANDLE RegionHandle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext);
+
+#define ACPI_REGION_ACTIVATE 0
+#define ACPI_REGION_DEACTIVATE 1
+
+typedef
+ACPI_STATUS (*ACPI_WALK_CALLBACK) (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue);
+
+
+/* Interrupt handler return values */
+
+#define ACPI_INTERRUPT_NOT_HANDLED 0x00
+#define ACPI_INTERRUPT_HANDLED 0x01
+
+
+/* Common string version of device HIDs and UIDs */
+
+typedef struct acpi_device_id
+{
+ char Value[ACPI_DEVICE_ID_LENGTH];
+
+} ACPI_DEVICE_ID;
+
+/* Common string version of device CIDs */
+
+typedef struct acpi_compatible_id
+{
+ char Value[ACPI_MAX_CID_LENGTH];
+
+} ACPI_COMPATIBLE_ID;
+
+typedef struct acpi_compatible_id_list
+{
+ UINT32 Count;
+ UINT32 Size;
+ ACPI_COMPATIBLE_ID Id[1];
+
+} ACPI_COMPATIBLE_ID_LIST;
+
+
+/* Structure and flags for AcpiGetObjectInfo */
+
+#define ACPI_VALID_STA 0x0001
+#define ACPI_VALID_ADR 0x0002
+#define ACPI_VALID_HID 0x0004
+#define ACPI_VALID_UID 0x0008
+#define ACPI_VALID_CID 0x0010
+#define ACPI_VALID_SXDS 0x0020
+
+/* Flags for _STA method */
+
+#define ACPI_STA_DEVICE_PRESENT 0x01
+#define ACPI_STA_DEVICE_ENABLED 0x02
+#define ACPI_STA_DEVICE_UI 0x04
+#define ACPI_STA_DEVICE_FUNCTIONING 0x08
+#define ACPI_STA_DEVICE_OK 0x08 /* Synonym */
+#define ACPI_STA_BATTERY_PRESENT 0x10
+
+
+#define ACPI_COMMON_OBJ_INFO \
+ ACPI_OBJECT_TYPE Type; /* ACPI object type */ \
+ ACPI_NAME Name /* ACPI object Name */
+
+
+typedef struct acpi_obj_info_header
+{
+ ACPI_COMMON_OBJ_INFO;
+
+} ACPI_OBJ_INFO_HEADER;
+
+
+/* Structure returned from Get Object Info */
+
+typedef struct acpi_device_info
+{
+ ACPI_COMMON_OBJ_INFO;
+
+ UINT32 Valid; /* Indicates which fields below are valid */
+ UINT32 CurrentStatus; /* _STA value */
+ ACPI_INTEGER Address; /* _ADR value if any */
+ ACPI_DEVICE_ID HardwareId; /* _HID value if any */
+ ACPI_DEVICE_ID UniqueId; /* _UID value if any */
+ UINT8 HighestDstates[4]; /* _SxD values: 0xFF indicates not valid */
+ ACPI_COMPATIBLE_ID_LIST CompatibilityId; /* List of _CIDs if any */
+
+} ACPI_DEVICE_INFO;
+
+
+/* Context structs for address space handlers */
+
+typedef struct acpi_pci_id
+{
+ UINT16 Segment;
+ UINT16 Bus;
+ UINT16 Device;
+ UINT16 Function;
+
+} ACPI_PCI_ID;
+
+
+typedef struct acpi_mem_space_context
+{
+ UINT32 Length;
+ ACPI_PHYSICAL_ADDRESS Address;
+ ACPI_PHYSICAL_ADDRESS MappedPhysicalAddress;
+ UINT8 *MappedLogicalAddress;
+ ACPI_SIZE MappedLength;
+
+} ACPI_MEM_SPACE_CONTEXT;
+
+
+/*
+ * Definitions for Resource Attributes
+ */
+typedef UINT16 ACPI_RS_LENGTH; /* Resource Length field is fixed at 16 bits */
+typedef UINT32 ACPI_RSDESC_SIZE; /* Max Resource Descriptor size is (Length+3) = (64K-1)+3 */
+
+/*
+ * Memory Attributes
+ */
+#define ACPI_READ_ONLY_MEMORY (UINT8) 0x00
+#define ACPI_READ_WRITE_MEMORY (UINT8) 0x01
+
+#define ACPI_NON_CACHEABLE_MEMORY (UINT8) 0x00
+#define ACPI_CACHABLE_MEMORY (UINT8) 0x01
+#define ACPI_WRITE_COMBINING_MEMORY (UINT8) 0x02
+#define ACPI_PREFETCHABLE_MEMORY (UINT8) 0x03
+
+/*
+ * IO Attributes
+ * The ISA IO ranges are: n000-n0FFh, n400-n4FFh, n800-n8FFh, nC00-nCFFh.
+ * The non-ISA IO ranges are: n100-n3FFh, n500-n7FFh, n900-nBFFh, nCD0-nFFFh.
+ */
+#define ACPI_NON_ISA_ONLY_RANGES (UINT8) 0x01
+#define ACPI_ISA_ONLY_RANGES (UINT8) 0x02
+#define ACPI_ENTIRE_RANGE (ACPI_NON_ISA_ONLY_RANGES | ACPI_ISA_ONLY_RANGES)
+
+/* Type of translation - 1=Sparse, 0=Dense */
+
+#define ACPI_SPARSE_TRANSLATION (UINT8) 0x01
+
+/*
+ * IO Port Descriptor Decode
+ */
+#define ACPI_DECODE_10 (UINT8) 0x00 /* 10-bit IO address decode */
+#define ACPI_DECODE_16 (UINT8) 0x01 /* 16-bit IO address decode */
+
+/*
+ * IRQ Attributes
+ */
+#define ACPI_LEVEL_SENSITIVE (UINT8) 0x00
+#define ACPI_EDGE_SENSITIVE (UINT8) 0x01
+
+#define ACPI_ACTIVE_HIGH (UINT8) 0x00
+#define ACPI_ACTIVE_LOW (UINT8) 0x01
+
+#define ACPI_EXCLUSIVE (UINT8) 0x00
+#define ACPI_SHARED (UINT8) 0x01
+
+/*
+ * DMA Attributes
+ */
+#define ACPI_COMPATIBILITY (UINT8) 0x00
+#define ACPI_TYPE_A (UINT8) 0x01
+#define ACPI_TYPE_B (UINT8) 0x02
+#define ACPI_TYPE_F (UINT8) 0x03
+
+#define ACPI_NOT_BUS_MASTER (UINT8) 0x00
+#define ACPI_BUS_MASTER (UINT8) 0x01
+
+#define ACPI_TRANSFER_8 (UINT8) 0x00
+#define ACPI_TRANSFER_8_16 (UINT8) 0x01
+#define ACPI_TRANSFER_16 (UINT8) 0x02
+
+/*
+ * Start Dependent Functions Priority definitions
+ */
+#define ACPI_GOOD_CONFIGURATION (UINT8) 0x00
+#define ACPI_ACCEPTABLE_CONFIGURATION (UINT8) 0x01
+#define ACPI_SUB_OPTIMAL_CONFIGURATION (UINT8) 0x02
+
+/*
+ * 16, 32 and 64-bit Address Descriptor resource types
+ */
+#define ACPI_MEMORY_RANGE (UINT8) 0x00
+#define ACPI_IO_RANGE (UINT8) 0x01
+#define ACPI_BUS_NUMBER_RANGE (UINT8) 0x02
+
+#define ACPI_ADDRESS_NOT_FIXED (UINT8) 0x00
+#define ACPI_ADDRESS_FIXED (UINT8) 0x01
+
+#define ACPI_POS_DECODE (UINT8) 0x00
+#define ACPI_SUB_DECODE (UINT8) 0x01
+
+#define ACPI_PRODUCER (UINT8) 0x00
+#define ACPI_CONSUMER (UINT8) 0x01
+
+
+/*
+ * If possible, pack the following structures to byte alignment
+ */
+#ifndef ACPI_MISALIGNMENT_NOT_SUPPORTED
+#pragma pack(1)
+#endif
+
+/* UUID data structures for use in vendor-defined resource descriptors */
+
+typedef struct acpi_uuid
+{
+ UINT8 Data[ACPI_UUID_LENGTH];
+} ACPI_UUID;
+
+typedef struct acpi_vendor_uuid
+{
+ UINT8 Subtype;
+ UINT8 Data[ACPI_UUID_LENGTH];
+
+} ACPI_VENDOR_UUID;
+
+/*
+ * Structures used to describe device resources
+ */
+typedef struct acpi_resource_irq
+{
+ UINT8 Triggering;
+ UINT8 Polarity;
+ UINT8 Sharable;
+ UINT8 InterruptCount;
+ UINT8 Interrupts[1];
+
+} ACPI_RESOURCE_IRQ;
+
+
+typedef struct ACPI_RESOURCE_DMA
+{
+ UINT8 Type;
+ UINT8 BusMaster;
+ UINT8 Transfer;
+ UINT8 ChannelCount;
+ UINT8 Channels[1];
+
+} ACPI_RESOURCE_DMA;
+
+
+typedef struct acpi_resource_start_dependent
+{
+ UINT8 CompatibilityPriority;
+ UINT8 PerformanceRobustness;
+
+} ACPI_RESOURCE_START_DEPENDENT;
+
+
+/*
+ * END_DEPENDENT_FUNCTIONS_RESOURCE struct is not
+ * needed because it has no fields
+ */
+
+
+typedef struct acpi_resource_io
+{
+ UINT8 IoDecode;
+ UINT8 Alignment;
+ UINT8 AddressLength;
+ UINT16 Minimum;
+ UINT16 Maximum;
+
+} ACPI_RESOURCE_IO;
+
+typedef struct acpi_resource_fixed_io
+{
+ UINT16 Address;
+ UINT8 AddressLength;
+
+} ACPI_RESOURCE_FIXED_IO;
+
+typedef struct acpi_resource_vendor
+{
+ UINT16 ByteLength;
+ UINT8 ByteData[1];
+
+} ACPI_RESOURCE_VENDOR;
+
+/* Vendor resource with UUID info (introduced in ACPI 3.0) */
+
+typedef struct acpi_resource_vendor_typed
+{
+ UINT16 ByteLength;
+ UINT8 UuidSubtype;
+ UINT8 Uuid[ACPI_UUID_LENGTH];
+ UINT8 ByteData[1];
+
+} ACPI_RESOURCE_VENDOR_TYPED;
+
+typedef struct acpi_resource_end_tag
+{
+ UINT8 Checksum;
+
+} ACPI_RESOURCE_END_TAG;
+
+typedef struct acpi_resource_memory24
+{
+ UINT8 WriteProtect;
+ UINT16 Minimum;
+ UINT16 Maximum;
+ UINT16 Alignment;
+ UINT16 AddressLength;
+
+} ACPI_RESOURCE_MEMORY24;
+
+typedef struct acpi_resource_memory32
+{
+ UINT8 WriteProtect;
+ UINT32 Minimum;
+ UINT32 Maximum;
+ UINT32 Alignment;
+ UINT32 AddressLength;
+
+} ACPI_RESOURCE_MEMORY32;
+
+typedef struct acpi_resource_fixed_memory32
+{
+ UINT8 WriteProtect;
+ UINT32 Address;
+ UINT32 AddressLength;
+
+} ACPI_RESOURCE_FIXED_MEMORY32;
+
+typedef struct acpi_memory_attribute
+{
+ UINT8 WriteProtect;
+ UINT8 Caching;
+ UINT8 RangeType;
+ UINT8 Translation;
+
+} ACPI_MEMORY_ATTRIBUTE;
+
+typedef struct acpi_io_attribute
+{
+ UINT8 RangeType;
+ UINT8 Translation;
+ UINT8 TranslationType;
+ UINT8 Reserved1;
+
+} ACPI_IO_ATTRIBUTE;
+
+typedef union acpi_resource_attribute
+{
+ ACPI_MEMORY_ATTRIBUTE Mem;
+ ACPI_IO_ATTRIBUTE Io;
+
+ /* Used for the *WordSpace macros */
+
+ UINT8 TypeSpecific;
+
+} ACPI_RESOURCE_ATTRIBUTE;
+
+typedef struct acpi_resource_source
+{
+ UINT8 Index;
+ UINT16 StringLength;
+ char *StringPtr;
+
+} ACPI_RESOURCE_SOURCE;
+
+/* Fields common to all address descriptors, 16/32/64 bit */
+
+#define ACPI_RESOURCE_ADDRESS_COMMON \
+ UINT8 ResourceType; \
+ UINT8 ProducerConsumer; \
+ UINT8 Decode; \
+ UINT8 MinAddressFixed; \
+ UINT8 MaxAddressFixed; \
+ ACPI_RESOURCE_ATTRIBUTE Info;
+
+typedef struct acpi_resource_address
+{
+ ACPI_RESOURCE_ADDRESS_COMMON
+
+} ACPI_RESOURCE_ADDRESS;
+
+typedef struct acpi_resource_address16
+{
+ ACPI_RESOURCE_ADDRESS_COMMON
+ UINT16 Granularity;
+ UINT16 Minimum;
+ UINT16 Maximum;
+ UINT16 TranslationOffset;
+ UINT16 AddressLength;
+ ACPI_RESOURCE_SOURCE ResourceSource;
+
+} ACPI_RESOURCE_ADDRESS16;
+
+typedef struct acpi_resource_address32
+{
+ ACPI_RESOURCE_ADDRESS_COMMON
+ UINT32 Granularity;
+ UINT32 Minimum;
+ UINT32 Maximum;
+ UINT32 TranslationOffset;
+ UINT32 AddressLength;
+ ACPI_RESOURCE_SOURCE ResourceSource;
+
+} ACPI_RESOURCE_ADDRESS32;
+
+typedef struct acpi_resource_address64
+{
+ ACPI_RESOURCE_ADDRESS_COMMON
+ UINT64 Granularity;
+ UINT64 Minimum;
+ UINT64 Maximum;
+ UINT64 TranslationOffset;
+ UINT64 AddressLength;
+ ACPI_RESOURCE_SOURCE ResourceSource;
+
+} ACPI_RESOURCE_ADDRESS64;
+
+typedef struct acpi_resource_extended_address64
+{
+ ACPI_RESOURCE_ADDRESS_COMMON
+ UINT8 RevisionID;
+ UINT64 Granularity;
+ UINT64 Minimum;
+ UINT64 Maximum;
+ UINT64 TranslationOffset;
+ UINT64 AddressLength;
+ UINT64 TypeSpecific;
+
+} ACPI_RESOURCE_EXTENDED_ADDRESS64;
+
+typedef struct acpi_resource_extended_irq
+{
+ UINT8 ProducerConsumer;
+ UINT8 Triggering;
+ UINT8 Polarity;
+ UINT8 Sharable;
+ UINT8 InterruptCount;
+ ACPI_RESOURCE_SOURCE ResourceSource;
+ UINT32 Interrupts[1];
+
+} ACPI_RESOURCE_EXTENDED_IRQ;
+
+typedef struct acpi_resource_generic_register
+{
+ UINT8 SpaceId;
+ UINT8 BitWidth;
+ UINT8 BitOffset;
+ UINT8 AccessSize;
+ UINT64 Address;
+
+} ACPI_RESOURCE_GENERIC_REGISTER;
+
+
+/* ACPI_RESOURCE_TYPEs */
+
+#define ACPI_RESOURCE_TYPE_IRQ 0
+#define ACPI_RESOURCE_TYPE_DMA 1
+#define ACPI_RESOURCE_TYPE_START_DEPENDENT 2
+#define ACPI_RESOURCE_TYPE_END_DEPENDENT 3
+#define ACPI_RESOURCE_TYPE_IO 4
+#define ACPI_RESOURCE_TYPE_FIXED_IO 5
+#define ACPI_RESOURCE_TYPE_VENDOR 6
+#define ACPI_RESOURCE_TYPE_END_TAG 7
+#define ACPI_RESOURCE_TYPE_MEMORY24 8
+#define ACPI_RESOURCE_TYPE_MEMORY32 9
+#define ACPI_RESOURCE_TYPE_FIXED_MEMORY32 10
+#define ACPI_RESOURCE_TYPE_ADDRESS16 11
+#define ACPI_RESOURCE_TYPE_ADDRESS32 12
+#define ACPI_RESOURCE_TYPE_ADDRESS64 13
+#define ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 14 /* ACPI 3.0 */
+#define ACPI_RESOURCE_TYPE_EXTENDED_IRQ 15
+#define ACPI_RESOURCE_TYPE_GENERIC_REGISTER 16
+#define ACPI_RESOURCE_TYPE_MAX 16
+
+
+typedef union acpi_resource_data
+{
+ ACPI_RESOURCE_IRQ Irq;
+ ACPI_RESOURCE_DMA Dma;
+ ACPI_RESOURCE_START_DEPENDENT StartDpf;
+ ACPI_RESOURCE_IO Io;
+ ACPI_RESOURCE_FIXED_IO FixedIo;
+ ACPI_RESOURCE_VENDOR Vendor;
+ ACPI_RESOURCE_VENDOR_TYPED VendorTyped;
+ ACPI_RESOURCE_END_TAG EndTag;
+ ACPI_RESOURCE_MEMORY24 Memory24;
+ ACPI_RESOURCE_MEMORY32 Memory32;
+ ACPI_RESOURCE_FIXED_MEMORY32 FixedMemory32;
+ ACPI_RESOURCE_ADDRESS16 Address16;
+ ACPI_RESOURCE_ADDRESS32 Address32;
+ ACPI_RESOURCE_ADDRESS64 Address64;
+ ACPI_RESOURCE_EXTENDED_ADDRESS64 ExtAddress64;
+ ACPI_RESOURCE_EXTENDED_IRQ ExtendedIrq;
+ ACPI_RESOURCE_GENERIC_REGISTER GenericReg;
+
+ /* Common fields */
+
+ ACPI_RESOURCE_ADDRESS Address; /* Common 16/32/64 address fields */
+
+} ACPI_RESOURCE_DATA;
+
+
+typedef struct acpi_resource
+{
+ UINT32 Type;
+ UINT32 Length;
+ ACPI_RESOURCE_DATA Data;
+
+} ACPI_RESOURCE;
+
+/* restore default alignment */
+
+#pragma pack()
+
+
+#define ACPI_RS_SIZE_MIN 12
+#define ACPI_RS_SIZE_NO_DATA 8 /* Id + Length fields */
+#define ACPI_RS_SIZE(Type) (UINT32) (ACPI_RS_SIZE_NO_DATA + sizeof (Type))
+
+#define ACPI_NEXT_RESOURCE(Res) (ACPI_RESOURCE *)((UINT8 *) Res + Res->Length)
+
+
+typedef struct acpi_pci_routing_table
+{
+ UINT32 Length;
+ UINT32 Pin;
+ ACPI_INTEGER Address; /* here for 64-bit alignment */
+ UINT32 SourceIndex;
+ char Source[4]; /* pad to 64 bits so sizeof() works in all cases */
+
+} ACPI_PCI_ROUTING_TABLE;
+
+
+#endif /* __ACTYPES_H__ */
diff --git a/sys/contrib/dev/acpica/acutils.h b/sys/contrib/dev/acpica/acutils.h
new file mode 100644
index 0000000..fef6f08
--- /dev/null
+++ b/sys/contrib/dev/acpica/acutils.h
@@ -0,0 +1,942 @@
+/******************************************************************************
+ *
+ * Name: acutils.h -- prototypes for the common (subsystem-wide) procedures
+ * $Revision: 1.200 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef _ACUTILS_H
+#define _ACUTILS_H
+
+
+extern const UINT8 AcpiGbl_ResourceAmlSizes[];
+
+/* Strings used by the disassembler and debugger resource dump routines */
+
+#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
+
+extern const char *AcpiGbl_BmDecode[];
+extern const char *AcpiGbl_ConfigDecode[];
+extern const char *AcpiGbl_ConsumeDecode[];
+extern const char *AcpiGbl_DecDecode[];
+extern const char *AcpiGbl_HeDecode[];
+extern const char *AcpiGbl_IoDecode[];
+extern const char *AcpiGbl_LlDecode[];
+extern const char *AcpiGbl_MaxDecode[];
+extern const char *AcpiGbl_MemDecode[];
+extern const char *AcpiGbl_MinDecode[];
+extern const char *AcpiGbl_MtpDecode[];
+extern const char *AcpiGbl_RngDecode[];
+extern const char *AcpiGbl_RwDecode[];
+extern const char *AcpiGbl_ShrDecode[];
+extern const char *AcpiGbl_SizDecode[];
+extern const char *AcpiGbl_TrsDecode[];
+extern const char *AcpiGbl_TtpDecode[];
+extern const char *AcpiGbl_TypDecode[];
+#endif
+
+/* Types for Resource descriptor entries */
+
+#define ACPI_INVALID_RESOURCE 0
+#define ACPI_FIXED_LENGTH 1
+#define ACPI_VARIABLE_LENGTH 2
+#define ACPI_SMALL_VARIABLE_LENGTH 3
+
+typedef
+ACPI_STATUS (*ACPI_WALK_AML_CALLBACK) (
+ UINT8 *Aml,
+ UINT32 Length,
+ UINT32 Offset,
+ UINT8 ResourceIndex,
+ void *Context);
+
+typedef
+ACPI_STATUS (*ACPI_PKG_CALLBACK) (
+ UINT8 ObjectType,
+ ACPI_OPERAND_OBJECT *SourceObject,
+ ACPI_GENERIC_STATE *State,
+ void *Context);
+
+typedef struct acpi_pkg_info
+{
+ UINT8 *FreeSpace;
+ ACPI_SIZE Length;
+ UINT32 ObjectSpace;
+ UINT32 NumPackages;
+
+} ACPI_PKG_INFO;
+
+#define REF_INCREMENT (UINT16) 0
+#define REF_DECREMENT (UINT16) 1
+#define REF_FORCE_DELETE (UINT16) 2
+
+/* AcpiUtDumpBuffer */
+
+#define DB_BYTE_DISPLAY 1
+#define DB_WORD_DISPLAY 2
+#define DB_DWORD_DISPLAY 4
+#define DB_QWORD_DISPLAY 8
+
+
+/*
+ * utglobal - Global data structures and procedures
+ */
+void
+AcpiUtInitGlobals (
+ void);
+
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+
+char *
+AcpiUtGetMutexName (
+ UINT32 MutexId);
+
+#endif
+
+char *
+AcpiUtGetTypeName (
+ ACPI_OBJECT_TYPE Type);
+
+char *
+AcpiUtGetNodeName (
+ void *Object);
+
+char *
+AcpiUtGetDescriptorName (
+ void *Object);
+
+char *
+AcpiUtGetObjectTypeName (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+char *
+AcpiUtGetRegionName (
+ UINT8 SpaceId);
+
+char *
+AcpiUtGetEventName (
+ UINT32 EventId);
+
+char
+AcpiUtHexToAsciiChar (
+ ACPI_INTEGER Integer,
+ UINT32 Position);
+
+BOOLEAN
+AcpiUtValidObjectType (
+ ACPI_OBJECT_TYPE Type);
+
+
+/*
+ * utinit - miscellaneous initialization and shutdown
+ */
+ACPI_STATUS
+AcpiUtHardwareInitialize (
+ void);
+
+void
+AcpiUtSubsystemShutdown (
+ void);
+
+
+/*
+ * utclib - Local implementations of C library functions
+ */
+#ifndef ACPI_USE_SYSTEM_CLIBRARY
+
+ACPI_SIZE
+AcpiUtStrlen (
+ const char *String);
+
+char *
+AcpiUtStrcpy (
+ char *DstString,
+ const char *SrcString);
+
+char *
+AcpiUtStrncpy (
+ char *DstString,
+ const char *SrcString,
+ ACPI_SIZE Count);
+
+int
+AcpiUtMemcmp (
+ const char *Buffer1,
+ const char *Buffer2,
+ ACPI_SIZE Count);
+
+int
+AcpiUtStrncmp (
+ const char *String1,
+ const char *String2,
+ ACPI_SIZE Count);
+
+int
+AcpiUtStrcmp (
+ const char *String1,
+ const char *String2);
+
+char *
+AcpiUtStrcat (
+ char *DstString,
+ const char *SrcString);
+
+char *
+AcpiUtStrncat (
+ char *DstString,
+ const char *SrcString,
+ ACPI_SIZE Count);
+
+UINT32
+AcpiUtStrtoul (
+ const char *String,
+ char **Terminator,
+ UINT32 Base);
+
+char *
+AcpiUtStrstr (
+ char *String1,
+ char *String2);
+
+void *
+AcpiUtMemcpy (
+ void *Dest,
+ const void *Src,
+ ACPI_SIZE Count);
+
+void *
+AcpiUtMemset (
+ void *Dest,
+ ACPI_NATIVE_UINT Value,
+ ACPI_SIZE Count);
+
+int
+AcpiUtToUpper (
+ int c);
+
+int
+AcpiUtToLower (
+ int c);
+
+extern const UINT8 _acpi_ctype[];
+
+#define _ACPI_XA 0x00 /* extra alphabetic - not supported */
+#define _ACPI_XS 0x40 /* extra space */
+#define _ACPI_BB 0x00 /* BEL, BS, etc. - not supported */
+#define _ACPI_CN 0x20 /* CR, FF, HT, NL, VT */
+#define _ACPI_DI 0x04 /* '0'-'9' */
+#define _ACPI_LO 0x02 /* 'a'-'z' */
+#define _ACPI_PU 0x10 /* punctuation */
+#define _ACPI_SP 0x08 /* space */
+#define _ACPI_UP 0x01 /* 'A'-'Z' */
+#define _ACPI_XD 0x80 /* '0'-'9', 'A'-'F', 'a'-'f' */
+
+#define ACPI_IS_DIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_DI))
+#define ACPI_IS_SPACE(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_SP))
+#define ACPI_IS_XDIGIT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_XD))
+#define ACPI_IS_UPPER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_UP))
+#define ACPI_IS_LOWER(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO))
+#define ACPI_IS_PRINT(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP | _ACPI_DI | _ACPI_SP | _ACPI_PU))
+#define ACPI_IS_ALPHA(c) (_acpi_ctype[(unsigned char)(c)] & (_ACPI_LO | _ACPI_UP))
+
+#endif /* ACPI_USE_SYSTEM_CLIBRARY */
+
+
+/*
+ * utcopy - Object construction and conversion interfaces
+ */
+ACPI_STATUS
+AcpiUtBuildSimpleObject(
+ ACPI_OPERAND_OBJECT *Obj,
+ ACPI_OBJECT *UserObj,
+ UINT8 *DataSpace,
+ UINT32 *BufferSpaceUsed);
+
+ACPI_STATUS
+AcpiUtBuildPackageObject (
+ ACPI_OPERAND_OBJECT *Obj,
+ UINT8 *Buffer,
+ UINT32 *SpaceUsed);
+
+ACPI_STATUS
+AcpiUtCopyIobjectToEobject (
+ ACPI_OPERAND_OBJECT *Obj,
+ ACPI_BUFFER *RetBuffer);
+
+ACPI_STATUS
+AcpiUtCopyEobjectToIobject (
+ ACPI_OBJECT *Obj,
+ ACPI_OPERAND_OBJECT **InternalObj);
+
+ACPI_STATUS
+AcpiUtCopyISimpleToIsimple (
+ ACPI_OPERAND_OBJECT *SourceObj,
+ ACPI_OPERAND_OBJECT *DestObj);
+
+ACPI_STATUS
+AcpiUtCopyIobjectToIobject (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT **DestDesc,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*
+ * utcreate - Object creation
+ */
+ACPI_STATUS
+AcpiUtUpdateObjectReference (
+ ACPI_OPERAND_OBJECT *Object,
+ UINT16 Action);
+
+
+/*
+ * utdebug - Debug interfaces
+ */
+void
+AcpiUtInitStackPtrTrace (
+ void);
+
+void
+AcpiUtTrackStackPtr (
+ void);
+
+void
+AcpiUtTrace (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId);
+
+void
+AcpiUtTracePtr (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ void *Pointer);
+
+void
+AcpiUtTraceU32 (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ UINT32 Integer);
+
+void
+AcpiUtTraceStr (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ char *String);
+
+void
+AcpiUtExit (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId);
+
+void
+AcpiUtStatusExit (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ ACPI_STATUS Status);
+
+void
+AcpiUtValueExit (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ ACPI_INTEGER Value);
+
+void
+AcpiUtPtrExit (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ UINT8 *Ptr);
+
+void
+AcpiUtDumpBuffer (
+ UINT8 *Buffer,
+ UINT32 Count,
+ UINT32 Display,
+ UINT32 componentId);
+
+void
+AcpiUtDumpBuffer2 (
+ UINT8 *Buffer,
+ UINT32 Count,
+ UINT32 Display);
+
+void
+AcpiUtReportError (
+ char *ModuleName,
+ UINT32 LineNumber);
+
+void
+AcpiUtReportInfo (
+ char *ModuleName,
+ UINT32 LineNumber);
+
+void
+AcpiUtReportWarning (
+ char *ModuleName,
+ UINT32 LineNumber);
+
+/* Error and message reporting interfaces */
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtDebugPrint (
+ UINT32 RequestedDebugLevel,
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ char *Format,
+ ...) ACPI_PRINTF_LIKE(6);
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtDebugPrintRaw (
+ UINT32 RequestedDebugLevel,
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ char *Format,
+ ...) ACPI_PRINTF_LIKE(6);
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtError (
+ char *ModuleName,
+ UINT32 LineNumber,
+ char *Format,
+ ...) ACPI_PRINTF_LIKE(3);
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtException (
+ char *ModuleName,
+ UINT32 LineNumber,
+ ACPI_STATUS Status,
+ char *Format,
+ ...) ACPI_PRINTF_LIKE(4);
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtWarning (
+ char *ModuleName,
+ UINT32 LineNumber,
+ char *Format,
+ ...) ACPI_PRINTF_LIKE(3);
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtInfo (
+ char *ModuleName,
+ UINT32 LineNumber,
+ char *Format,
+ ...) ACPI_PRINTF_LIKE(3);
+
+
+/*
+ * utdelete - Object deletion and reference counts
+ */
+void
+AcpiUtAddReference (
+ ACPI_OPERAND_OBJECT *Object);
+
+void
+AcpiUtRemoveReference (
+ ACPI_OPERAND_OBJECT *Object);
+
+void
+AcpiUtDeleteInternalPackageObject (
+ ACPI_OPERAND_OBJECT *Object);
+
+void
+AcpiUtDeleteInternalSimpleObject (
+ ACPI_OPERAND_OBJECT *Object);
+
+void
+AcpiUtDeleteInternalObjectList (
+ ACPI_OPERAND_OBJECT **ObjList);
+
+
+/*
+ * uteval - object evaluation
+ */
+ACPI_STATUS
+AcpiUtOsiImplementation (
+ ACPI_WALK_STATE *WalkState);
+
+ACPI_STATUS
+AcpiUtEvaluateObject (
+ ACPI_NAMESPACE_NODE *PrefixNode,
+ char *Path,
+ UINT32 ExpectedReturnBtypes,
+ ACPI_OPERAND_OBJECT **ReturnDesc);
+
+ACPI_STATUS
+AcpiUtEvaluateNumericObject (
+ char *ObjectName,
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ ACPI_INTEGER *Address);
+
+ACPI_STATUS
+AcpiUtExecute_HID (
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ ACPI_DEVICE_ID *Hid);
+
+ACPI_STATUS
+AcpiUtExecute_CID (
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ ACPI_COMPATIBLE_ID_LIST **ReturnCidList);
+
+ACPI_STATUS
+AcpiUtExecute_STA (
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ UINT32 *StatusFlags);
+
+ACPI_STATUS
+AcpiUtExecute_UID (
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ ACPI_DEVICE_ID *Uid);
+
+ACPI_STATUS
+AcpiUtExecute_Sxds (
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ UINT8 *Highest);
+
+
+/*
+ * utobject - internal object create/delete/cache routines
+ */
+ACPI_OPERAND_OBJECT *
+AcpiUtCreateInternalObjectDbg (
+ char *ModuleName,
+ UINT32 LineNumber,
+ UINT32 ComponentId,
+ ACPI_OBJECT_TYPE Type);
+
+void *
+AcpiUtAllocateObjectDescDbg (
+ char *ModuleName,
+ UINT32 LineNumber,
+ UINT32 ComponentId);
+
+#define AcpiUtCreateInternalObject(t) AcpiUtCreateInternalObjectDbg (_AcpiModuleName,__LINE__,_COMPONENT,t)
+#define AcpiUtAllocateObjectDesc() AcpiUtAllocateObjectDescDbg (_AcpiModuleName,__LINE__,_COMPONENT)
+
+void
+AcpiUtDeleteObjectDesc (
+ ACPI_OPERAND_OBJECT *Object);
+
+BOOLEAN
+AcpiUtValidInternalObject (
+ void *Object);
+
+ACPI_OPERAND_OBJECT *
+AcpiUtCreateBufferObject (
+ ACPI_SIZE BufferSize);
+
+ACPI_OPERAND_OBJECT *
+AcpiUtCreateStringObject (
+ ACPI_SIZE StringSize);
+
+ACPI_STATUS
+AcpiUtGetObjectSize(
+ ACPI_OPERAND_OBJECT *Obj,
+ ACPI_SIZE *ObjLength);
+
+
+/*
+ * utstate - Generic state creation/cache routines
+ */
+void
+AcpiUtPushGenericState (
+ ACPI_GENERIC_STATE **ListHead,
+ ACPI_GENERIC_STATE *State);
+
+ACPI_GENERIC_STATE *
+AcpiUtPopGenericState (
+ ACPI_GENERIC_STATE **ListHead);
+
+
+ACPI_GENERIC_STATE *
+AcpiUtCreateGenericState (
+ void);
+
+ACPI_THREAD_STATE *
+AcpiUtCreateThreadState (
+ void);
+
+ACPI_GENERIC_STATE *
+AcpiUtCreateUpdateState (
+ ACPI_OPERAND_OBJECT *Object,
+ UINT16 Action);
+
+ACPI_GENERIC_STATE *
+AcpiUtCreatePkgState (
+ void *InternalObject,
+ void *ExternalObject,
+ UINT16 Index);
+
+ACPI_STATUS
+AcpiUtCreateUpdateStateAndPush (
+ ACPI_OPERAND_OBJECT *Object,
+ UINT16 Action,
+ ACPI_GENERIC_STATE **StateList);
+
+ACPI_STATUS
+AcpiUtCreatePkgStateAndPush (
+ void *InternalObject,
+ void *ExternalObject,
+ UINT16 Index,
+ ACPI_GENERIC_STATE **StateList);
+
+ACPI_GENERIC_STATE *
+AcpiUtCreateControlState (
+ void);
+
+void
+AcpiUtDeleteGenericState (
+ ACPI_GENERIC_STATE *State);
+
+
+/*
+ * utmath
+ */
+ACPI_STATUS
+AcpiUtDivide (
+ ACPI_INTEGER InDividend,
+ ACPI_INTEGER InDivisor,
+ ACPI_INTEGER *OutQuotient,
+ ACPI_INTEGER *OutRemainder);
+
+ACPI_STATUS
+AcpiUtShortDivide (
+ ACPI_INTEGER InDividend,
+ UINT32 Divisor,
+ ACPI_INTEGER *OutQuotient,
+ UINT32 *OutRemainder);
+
+/*
+ * utmisc
+ */
+const char *
+AcpiUtValidateException (
+ ACPI_STATUS Status);
+
+BOOLEAN
+AcpiUtIsAmlTable (
+ ACPI_TABLE_HEADER *Table);
+
+ACPI_STATUS
+AcpiUtAllocateOwnerId (
+ ACPI_OWNER_ID *OwnerId);
+
+void
+AcpiUtReleaseOwnerId (
+ ACPI_OWNER_ID *OwnerId);
+
+ACPI_STATUS
+AcpiUtWalkPackageTree (
+ ACPI_OPERAND_OBJECT *SourceObject,
+ void *TargetObject,
+ ACPI_PKG_CALLBACK WalkCallback,
+ void *Context);
+
+void
+AcpiUtStrupr (
+ char *SrcString);
+
+void
+AcpiUtPrintString (
+ char *String,
+ UINT8 MaxLength);
+
+BOOLEAN
+AcpiUtValidAcpiName (
+ UINT32 Name);
+
+ACPI_NAME
+AcpiUtRepairName (
+ char *Name);
+
+BOOLEAN
+AcpiUtValidAcpiChar (
+ char Character,
+ ACPI_NATIVE_UINT Position);
+
+ACPI_STATUS
+AcpiUtStrtoul64 (
+ char *String,
+ UINT32 Base,
+ ACPI_INTEGER *RetInteger);
+
+/* Values for Base above (16=Hex, 10=Decimal) */
+
+#define ACPI_ANY_BASE 0
+
+UINT32
+AcpiUtDwordByteSwap (
+ UINT32 Value);
+
+void
+AcpiUtSetIntegerWidth (
+ UINT8 Revision);
+
+#ifdef ACPI_DEBUG_OUTPUT
+void
+AcpiUtDisplayInitPathname (
+ UINT8 Type,
+ ACPI_NAMESPACE_NODE *ObjHandle,
+ char *Path);
+#endif
+
+
+/*
+ * utresrc
+ */
+ACPI_STATUS
+AcpiUtWalkAmlResources (
+ UINT8 *Aml,
+ ACPI_SIZE AmlLength,
+ ACPI_WALK_AML_CALLBACK UserFunction,
+ void *Context);
+
+ACPI_STATUS
+AcpiUtValidateResource (
+ void *Aml,
+ UINT8 *ReturnIndex);
+
+UINT32
+AcpiUtGetDescriptorLength (
+ void *Aml);
+
+UINT16
+AcpiUtGetResourceLength (
+ void *Aml);
+
+UINT8
+AcpiUtGetResourceHeaderLength (
+ void *Aml);
+
+UINT8
+AcpiUtGetResourceType (
+ void *Aml);
+
+ACPI_STATUS
+AcpiUtGetResourceEndTag (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT8 **EndTag);
+
+
+/*
+ * utmutex - mutex support
+ */
+ACPI_STATUS
+AcpiUtMutexInitialize (
+ void);
+
+void
+AcpiUtMutexTerminate (
+ void);
+
+ACPI_STATUS
+AcpiUtAcquireMutex (
+ ACPI_MUTEX_HANDLE MutexId);
+
+ACPI_STATUS
+AcpiUtReleaseMutex (
+ ACPI_MUTEX_HANDLE MutexId);
+
+
+/*
+ * utalloc - memory allocation and object caching
+ */
+ACPI_STATUS
+AcpiUtCreateCaches (
+ void);
+
+ACPI_STATUS
+AcpiUtDeleteCaches (
+ void);
+
+ACPI_STATUS
+AcpiUtValidateBuffer (
+ ACPI_BUFFER *Buffer);
+
+ACPI_STATUS
+AcpiUtInitializeBuffer (
+ ACPI_BUFFER *Buffer,
+ ACPI_SIZE RequiredLength);
+
+void *
+AcpiUtAllocate (
+ ACPI_SIZE Size,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line);
+
+void *
+AcpiUtAllocateZeroed (
+ ACPI_SIZE Size,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line);
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+void *
+AcpiUtAllocateAndTrack (
+ ACPI_SIZE Size,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line);
+
+void *
+AcpiUtAllocateZeroedAndTrack (
+ ACPI_SIZE Size,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line);
+
+void
+AcpiUtFreeAndTrack (
+ void *Address,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line);
+
+void
+AcpiUtDumpAllocationInfo (
+ void);
+
+void
+AcpiUtDumpAllocations (
+ UINT32 Component,
+ char *Module);
+
+ACPI_STATUS
+AcpiUtCreateList (
+ char *ListName,
+ UINT16 ObjectSize,
+ ACPI_MEMORY_LIST **ReturnCache);
+
+
+#endif
+
+#endif /* _ACUTILS_H */
diff --git a/sys/contrib/dev/acpica/aecommon.h b/sys/contrib/dev/acpica/aecommon.h
new file mode 100644
index 0000000..0dd1e5f
--- /dev/null
+++ b/sys/contrib/dev/acpica/aecommon.h
@@ -0,0 +1,243 @@
+/******************************************************************************
+ *
+ * Module Name: aecommon - common include for the AcpiExec utility
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef _AECOMMON
+#define _AECOMMON
+
+#ifdef _MSC_VER /* disable some level-4 warnings */
+#pragma warning(disable:4100) /* warning C4100: unreferenced formal parameter */
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <signal.h>
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdebug.h>
+#include <contrib/dev/acpica/actables.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acapps.h>
+
+extern FILE *AcpiGbl_DebugFile;
+extern BOOLEAN AcpiGbl_IgnoreErrors;
+
+/*
+ * Debug Regions
+ */
+typedef struct Region
+{
+ ACPI_PHYSICAL_ADDRESS Address;
+ UINT32 Length;
+ void *Buffer;
+ void *NextRegion;
+ UINT8 SpaceId;
+
+} REGION;
+
+typedef struct DebugRegions
+{
+ UINT32 NumberOfRegions;
+ REGION *RegionList;
+
+} DEBUG_REGIONS;
+
+
+/*
+ * Pointer overlay for 16-bit code
+ */
+typedef union ptr_ovl
+{
+ void *ptr;
+ UINT32 dword;
+ struct
+ {
+ UINT16 offset;
+ UINT16 base;
+ } ovl;
+
+} PTR_OVL;
+
+
+#define GET_SEGMENT(ptr) ((UINT16)(_segment)(ptr))
+#define GET_OFFSET(ptr) ((UINT16)(UINT32) (ptr))
+#define GET_PHYSICAL_ADDRESS(ptr) (((((UINT32)GET_SEGMENT(ptr)) << 4)) + GET_OFFSET(ptr))
+#define PTR_OVL_BUILD_PTR(p,b,o) {p.ovl.base=b;p.ovl.offset=o;}
+
+
+#define TEST_OUTPUT_LEVEL(lvl) if ((lvl) & OutputLevel)
+
+#define OSD_PRINT(lvl,fp) TEST_OUTPUT_LEVEL(lvl) {\
+ AcpiOsPrintf PARAM_LIST(fp);}
+
+void __cdecl
+AeCtrlCHandler (
+ int Sig);
+
+ACPI_STATUS
+AeBuildLocalTables (
+ ACPI_TABLE_HEADER *UserTable);
+
+ACPI_STATUS
+AeInstallTables (
+ void);
+
+void
+AeDumpNamespace (
+ void);
+
+void
+AeDumpObject (
+ char *MethodName,
+ ACPI_BUFFER *ReturnObj);
+
+void
+AeDumpBuffer (
+ UINT32 Address);
+
+void
+AeExecute (
+ char *Name);
+
+void
+AeSetScope (
+ char *Name);
+
+void
+AeCloseDebugFile (
+ void);
+
+void
+AeOpenDebugFile (
+ char *Name);
+
+ACPI_STATUS
+AeDisplayAllMethods (
+ UINT32 DisplayCount);
+
+ACPI_STATUS
+AeInstallHandlers (
+ void);
+
+void
+AeMiscellaneousTests (
+ void);
+
+
+#endif /* _AECOMMON */
+
diff --git a/sys/contrib/dev/acpica/amlcode.h b/sys/contrib/dev/acpica/amlcode.h
new file mode 100644
index 0000000..6376b57
--- /dev/null
+++ b/sys/contrib/dev/acpica/amlcode.h
@@ -0,0 +1,595 @@
+/******************************************************************************
+ *
+ * Name: amlcode.h - Definitions for AML, as included in "definition blocks"
+ * Declarations and definitions contained herein are derived
+ * directly from the ACPI specification.
+ * $Revision: 1.86 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#ifndef __AMLCODE_H__
+#define __AMLCODE_H__
+
+/* primary opcodes */
+
+#define AML_NULL_CHAR (UINT16) 0x00
+
+#define AML_ZERO_OP (UINT16) 0x00
+#define AML_ONE_OP (UINT16) 0x01
+#define AML_UNASSIGNED (UINT16) 0x02
+#define AML_ALIAS_OP (UINT16) 0x06
+#define AML_NAME_OP (UINT16) 0x08
+#define AML_BYTE_OP (UINT16) 0x0a
+#define AML_WORD_OP (UINT16) 0x0b
+#define AML_DWORD_OP (UINT16) 0x0c
+#define AML_STRING_OP (UINT16) 0x0d
+#define AML_QWORD_OP (UINT16) 0x0e /* ACPI 2.0 */
+#define AML_SCOPE_OP (UINT16) 0x10
+#define AML_BUFFER_OP (UINT16) 0x11
+#define AML_PACKAGE_OP (UINT16) 0x12
+#define AML_VAR_PACKAGE_OP (UINT16) 0x13 /* ACPI 2.0 */
+#define AML_METHOD_OP (UINT16) 0x14
+#define AML_DUAL_NAME_PREFIX (UINT16) 0x2e
+#define AML_MULTI_NAME_PREFIX_OP (UINT16) 0x2f
+#define AML_NAME_CHAR_SUBSEQ (UINT16) 0x30
+#define AML_NAME_CHAR_FIRST (UINT16) 0x41
+#define AML_EXTENDED_OP_PREFIX (UINT16) 0x5b
+#define AML_ROOT_PREFIX (UINT16) 0x5c
+#define AML_PARENT_PREFIX (UINT16) 0x5e
+#define AML_LOCAL_OP (UINT16) 0x60
+#define AML_LOCAL0 (UINT16) 0x60
+#define AML_LOCAL1 (UINT16) 0x61
+#define AML_LOCAL2 (UINT16) 0x62
+#define AML_LOCAL3 (UINT16) 0x63
+#define AML_LOCAL4 (UINT16) 0x64
+#define AML_LOCAL5 (UINT16) 0x65
+#define AML_LOCAL6 (UINT16) 0x66
+#define AML_LOCAL7 (UINT16) 0x67
+#define AML_ARG_OP (UINT16) 0x68
+#define AML_ARG0 (UINT16) 0x68
+#define AML_ARG1 (UINT16) 0x69
+#define AML_ARG2 (UINT16) 0x6a
+#define AML_ARG3 (UINT16) 0x6b
+#define AML_ARG4 (UINT16) 0x6c
+#define AML_ARG5 (UINT16) 0x6d
+#define AML_ARG6 (UINT16) 0x6e
+#define AML_STORE_OP (UINT16) 0x70
+#define AML_REF_OF_OP (UINT16) 0x71
+#define AML_ADD_OP (UINT16) 0x72
+#define AML_CONCAT_OP (UINT16) 0x73
+#define AML_SUBTRACT_OP (UINT16) 0x74
+#define AML_INCREMENT_OP (UINT16) 0x75
+#define AML_DECREMENT_OP (UINT16) 0x76
+#define AML_MULTIPLY_OP (UINT16) 0x77
+#define AML_DIVIDE_OP (UINT16) 0x78
+#define AML_SHIFT_LEFT_OP (UINT16) 0x79
+#define AML_SHIFT_RIGHT_OP (UINT16) 0x7a
+#define AML_BIT_AND_OP (UINT16) 0x7b
+#define AML_BIT_NAND_OP (UINT16) 0x7c
+#define AML_BIT_OR_OP (UINT16) 0x7d
+#define AML_BIT_NOR_OP (UINT16) 0x7e
+#define AML_BIT_XOR_OP (UINT16) 0x7f
+#define AML_BIT_NOT_OP (UINT16) 0x80
+#define AML_FIND_SET_LEFT_BIT_OP (UINT16) 0x81
+#define AML_FIND_SET_RIGHT_BIT_OP (UINT16) 0x82
+#define AML_DEREF_OF_OP (UINT16) 0x83
+#define AML_CONCAT_RES_OP (UINT16) 0x84 /* ACPI 2.0 */
+#define AML_MOD_OP (UINT16) 0x85 /* ACPI 2.0 */
+#define AML_NOTIFY_OP (UINT16) 0x86
+#define AML_SIZE_OF_OP (UINT16) 0x87
+#define AML_INDEX_OP (UINT16) 0x88
+#define AML_MATCH_OP (UINT16) 0x89
+#define AML_CREATE_DWORD_FIELD_OP (UINT16) 0x8a
+#define AML_CREATE_WORD_FIELD_OP (UINT16) 0x8b
+#define AML_CREATE_BYTE_FIELD_OP (UINT16) 0x8c
+#define AML_CREATE_BIT_FIELD_OP (UINT16) 0x8d
+#define AML_TYPE_OP (UINT16) 0x8e
+#define AML_CREATE_QWORD_FIELD_OP (UINT16) 0x8f /* ACPI 2.0 */
+#define AML_LAND_OP (UINT16) 0x90
+#define AML_LOR_OP (UINT16) 0x91
+#define AML_LNOT_OP (UINT16) 0x92
+#define AML_LEQUAL_OP (UINT16) 0x93
+#define AML_LGREATER_OP (UINT16) 0x94
+#define AML_LLESS_OP (UINT16) 0x95
+#define AML_TO_BUFFER_OP (UINT16) 0x96 /* ACPI 2.0 */
+#define AML_TO_DECSTRING_OP (UINT16) 0x97 /* ACPI 2.0 */
+#define AML_TO_HEXSTRING_OP (UINT16) 0x98 /* ACPI 2.0 */
+#define AML_TO_INTEGER_OP (UINT16) 0x99 /* ACPI 2.0 */
+#define AML_TO_STRING_OP (UINT16) 0x9c /* ACPI 2.0 */
+#define AML_COPY_OP (UINT16) 0x9d /* ACPI 2.0 */
+#define AML_MID_OP (UINT16) 0x9e /* ACPI 2.0 */
+#define AML_CONTINUE_OP (UINT16) 0x9f /* ACPI 2.0 */
+#define AML_IF_OP (UINT16) 0xa0
+#define AML_ELSE_OP (UINT16) 0xa1
+#define AML_WHILE_OP (UINT16) 0xa2
+#define AML_NOOP_OP (UINT16) 0xa3
+#define AML_RETURN_OP (UINT16) 0xa4
+#define AML_BREAK_OP (UINT16) 0xa5
+#define AML_BREAK_POINT_OP (UINT16) 0xcc
+#define AML_ONES_OP (UINT16) 0xff
+
+/* prefixed opcodes */
+
+#define AML_EXTENDED_OPCODE (UINT16) 0x5b00 /* prefix for 2-byte opcodes */
+
+#define AML_MUTEX_OP (UINT16) 0x5b01
+#define AML_EVENT_OP (UINT16) 0x5b02
+#define AML_SHIFT_RIGHT_BIT_OP (UINT16) 0x5b10
+#define AML_SHIFT_LEFT_BIT_OP (UINT16) 0x5b11
+#define AML_COND_REF_OF_OP (UINT16) 0x5b12
+#define AML_CREATE_FIELD_OP (UINT16) 0x5b13
+#define AML_LOAD_TABLE_OP (UINT16) 0x5b1f /* ACPI 2.0 */
+#define AML_LOAD_OP (UINT16) 0x5b20
+#define AML_STALL_OP (UINT16) 0x5b21
+#define AML_SLEEP_OP (UINT16) 0x5b22
+#define AML_ACQUIRE_OP (UINT16) 0x5b23
+#define AML_SIGNAL_OP (UINT16) 0x5b24
+#define AML_WAIT_OP (UINT16) 0x5b25
+#define AML_RESET_OP (UINT16) 0x5b26
+#define AML_RELEASE_OP (UINT16) 0x5b27
+#define AML_FROM_BCD_OP (UINT16) 0x5b28
+#define AML_TO_BCD_OP (UINT16) 0x5b29
+#define AML_UNLOAD_OP (UINT16) 0x5b2a
+#define AML_REVISION_OP (UINT16) 0x5b30
+#define AML_DEBUG_OP (UINT16) 0x5b31
+#define AML_FATAL_OP (UINT16) 0x5b32
+#define AML_TIMER_OP (UINT16) 0x5b33 /* ACPI 3.0 */
+#define AML_REGION_OP (UINT16) 0x5b80
+#define AML_FIELD_OP (UINT16) 0x5b81
+#define AML_DEVICE_OP (UINT16) 0x5b82
+#define AML_PROCESSOR_OP (UINT16) 0x5b83
+#define AML_POWER_RES_OP (UINT16) 0x5b84
+#define AML_THERMAL_ZONE_OP (UINT16) 0x5b85
+#define AML_INDEX_FIELD_OP (UINT16) 0x5b86
+#define AML_BANK_FIELD_OP (UINT16) 0x5b87
+#define AML_DATA_REGION_OP (UINT16) 0x5b88 /* ACPI 2.0 */
+
+
+/*
+ * Combination opcodes (actually two one-byte opcodes)
+ * Used by the disassembler and iASL compiler
+ */
+#define AML_LGREATEREQUAL_OP (UINT16) 0x9295
+#define AML_LLESSEQUAL_OP (UINT16) 0x9294
+#define AML_LNOTEQUAL_OP (UINT16) 0x9293
+
+
+/*
+ * Internal opcodes
+ * Use only "Unknown" AML opcodes, don't attempt to use
+ * any valid ACPI ASCII values (A-Z, 0-9, '-')
+ */
+#define AML_INT_NAMEPATH_OP (UINT16) 0x002d
+#define AML_INT_NAMEDFIELD_OP (UINT16) 0x0030
+#define AML_INT_RESERVEDFIELD_OP (UINT16) 0x0031
+#define AML_INT_ACCESSFIELD_OP (UINT16) 0x0032
+#define AML_INT_BYTELIST_OP (UINT16) 0x0033
+#define AML_INT_STATICSTRING_OP (UINT16) 0x0034
+#define AML_INT_METHODCALL_OP (UINT16) 0x0035
+#define AML_INT_RETURN_VALUE_OP (UINT16) 0x0036
+#define AML_INT_EVAL_SUBTREE_OP (UINT16) 0x0037
+
+
+#define ARG_NONE 0x0
+
+/*
+ * Argument types for the AML Parser
+ * Each field in the ArgTypes UINT32 is 5 bits, allowing for a maximum of 6 arguments.
+ * There can be up to 31 unique argument types
+ * Zero is reserved as end-of-list indicator
+ */
+#define ARGP_BYTEDATA 0x01
+#define ARGP_BYTELIST 0x02
+#define ARGP_CHARLIST 0x03
+#define ARGP_DATAOBJ 0x04
+#define ARGP_DATAOBJLIST 0x05
+#define ARGP_DWORDDATA 0x06
+#define ARGP_FIELDLIST 0x07
+#define ARGP_NAME 0x08
+#define ARGP_NAMESTRING 0x09
+#define ARGP_OBJLIST 0x0A
+#define ARGP_PKGLENGTH 0x0B
+#define ARGP_SUPERNAME 0x0C
+#define ARGP_TARGET 0x0D
+#define ARGP_TERMARG 0x0E
+#define ARGP_TERMLIST 0x0F
+#define ARGP_WORDDATA 0x10
+#define ARGP_QWORDDATA 0x11
+#define ARGP_SIMPLENAME 0x12
+
+/*
+ * Resolved argument types for the AML Interpreter
+ * Each field in the ArgTypes UINT32 is 5 bits, allowing for a maximum of 6 arguments.
+ * There can be up to 31 unique argument types (0 is end-of-arg-list indicator)
+ *
+ * Note1: These values are completely independent from the ACPI_TYPEs
+ * i.e., ARGI_INTEGER != ACPI_TYPE_INTEGER
+ *
+ * Note2: If and when 5 bits becomes insufficient, it would probably be best
+ * to convert to a 6-byte array of argument types, allowing 8 bits per argument.
+ */
+
+/* Single, simple types */
+
+#define ARGI_ANYTYPE 0x01 /* Don't care */
+#define ARGI_PACKAGE 0x02
+#define ARGI_EVENT 0x03
+#define ARGI_MUTEX 0x04
+#define ARGI_DDBHANDLE 0x05
+
+/* Interchangeable types (via implicit conversion) */
+
+#define ARGI_INTEGER 0x06
+#define ARGI_STRING 0x07
+#define ARGI_BUFFER 0x08
+#define ARGI_BUFFER_OR_STRING 0x09 /* Used by MID op only */
+#define ARGI_COMPUTEDATA 0x0A /* Buffer, String, or Integer */
+
+/* Reference objects */
+
+#define ARGI_INTEGER_REF 0x0B
+#define ARGI_OBJECT_REF 0x0C
+#define ARGI_DEVICE_REF 0x0D
+#define ARGI_REFERENCE 0x0E
+#define ARGI_TARGETREF 0x0F /* Target, subject to implicit conversion */
+#define ARGI_FIXED_TARGET 0x10 /* Target, no implicit conversion */
+#define ARGI_SIMPLE_TARGET 0x11 /* Name, Local, Arg -- no implicit conversion */
+
+/* Multiple/complex types */
+
+#define ARGI_DATAOBJECT 0x12 /* Buffer, String, package or reference to a Node - Used only by SizeOf operator*/
+#define ARGI_COMPLEXOBJ 0x13 /* Buffer, String, or package (Used by INDEX op only) */
+#define ARGI_REF_OR_STRING 0x14 /* Reference or String (Used by DEREFOF op only) */
+#define ARGI_REGION_OR_BUFFER 0x15 /* Used by LOAD op only */
+#define ARGI_DATAREFOBJ 0x16
+
+/* Note: types above can expand to 0x1F maximum */
+
+#define ARGI_INVALID_OPCODE 0xFFFFFFFF
+
+
+/*
+ * hash offsets
+ */
+#define AML_EXTOP_HASH_OFFSET 22
+#define AML_LNOT_HASH_OFFSET 19
+
+
+/*
+ * opcode groups and types
+ */
+#define OPGRP_NAMED 0x01
+#define OPGRP_FIELD 0x02
+#define OPGRP_BYTELIST 0x04
+
+
+/*
+ * Opcode information
+ */
+
+/* Opcode flags */
+
+#define AML_LOGICAL 0x0001
+#define AML_LOGICAL_NUMERIC 0x0002
+#define AML_MATH 0x0004
+#define AML_CREATE 0x0008
+#define AML_FIELD 0x0010
+#define AML_DEFER 0x0020
+#define AML_NAMED 0x0040
+#define AML_NSNODE 0x0080
+#define AML_NSOPCODE 0x0100
+#define AML_NSOBJECT 0x0200
+#define AML_HAS_RETVAL 0x0400
+#define AML_HAS_TARGET 0x0800
+#define AML_HAS_ARGS 0x1000
+#define AML_CONSTANT 0x2000
+#define AML_NO_OPERAND_RESOLVE 0x4000
+
+/* Convenient flag groupings */
+
+#define AML_FLAGS_EXEC_0A_0T_1R AML_HAS_RETVAL
+#define AML_FLAGS_EXEC_1A_0T_0R AML_HAS_ARGS /* Monadic1 */
+#define AML_FLAGS_EXEC_1A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL /* Monadic2 */
+#define AML_FLAGS_EXEC_1A_1T_0R AML_HAS_ARGS | AML_HAS_TARGET
+#define AML_FLAGS_EXEC_1A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL /* Monadic2R */
+#define AML_FLAGS_EXEC_2A_0T_0R AML_HAS_ARGS /* Dyadic1 */
+#define AML_FLAGS_EXEC_2A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL /* Dyadic2 */
+#define AML_FLAGS_EXEC_2A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL /* Dyadic2R */
+#define AML_FLAGS_EXEC_2A_2T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL
+#define AML_FLAGS_EXEC_3A_0T_0R AML_HAS_ARGS
+#define AML_FLAGS_EXEC_3A_1T_1R AML_HAS_ARGS | AML_HAS_TARGET | AML_HAS_RETVAL
+#define AML_FLAGS_EXEC_6A_0T_1R AML_HAS_ARGS | AML_HAS_RETVAL
+
+
+/*
+ * The opcode Type is used in a dispatch table, do not change
+ * without updating the table.
+ */
+#define AML_TYPE_EXEC_0A_0T_1R 0x00
+#define AML_TYPE_EXEC_1A_0T_0R 0x01 /* Monadic1 */
+#define AML_TYPE_EXEC_1A_0T_1R 0x02 /* Monadic2 */
+#define AML_TYPE_EXEC_1A_1T_0R 0x03
+#define AML_TYPE_EXEC_1A_1T_1R 0x04 /* Monadic2R */
+#define AML_TYPE_EXEC_2A_0T_0R 0x05 /* Dyadic1 */
+#define AML_TYPE_EXEC_2A_0T_1R 0x06 /* Dyadic2 */
+#define AML_TYPE_EXEC_2A_1T_1R 0x07 /* Dyadic2R */
+#define AML_TYPE_EXEC_2A_2T_1R 0x08
+#define AML_TYPE_EXEC_3A_0T_0R 0x09
+#define AML_TYPE_EXEC_3A_1T_1R 0x0A
+#define AML_TYPE_EXEC_6A_0T_1R 0x0B
+/* End of types used in dispatch table */
+
+#define AML_TYPE_LITERAL 0x0B
+#define AML_TYPE_CONSTANT 0x0C
+#define AML_TYPE_METHOD_ARGUMENT 0x0D
+#define AML_TYPE_LOCAL_VARIABLE 0x0E
+#define AML_TYPE_DATA_TERM 0x0F
+
+/* Generic for an op that returns a value */
+
+#define AML_TYPE_METHOD_CALL 0x10
+
+/* Misc */
+
+#define AML_TYPE_CREATE_FIELD 0x11
+#define AML_TYPE_CREATE_OBJECT 0x12
+#define AML_TYPE_CONTROL 0x13
+#define AML_TYPE_NAMED_NO_OBJ 0x14
+#define AML_TYPE_NAMED_FIELD 0x15
+#define AML_TYPE_NAMED_SIMPLE 0x16
+#define AML_TYPE_NAMED_COMPLEX 0x17
+#define AML_TYPE_RETURN 0x18
+
+#define AML_TYPE_UNDEFINED 0x19
+#define AML_TYPE_BOGUS 0x1A
+
+/* AML Package Length encodings */
+
+#define ACPI_AML_PACKAGE_TYPE1 0x40
+#define ACPI_AML_PACKAGE_TYPE2 0x4000
+#define ACPI_AML_PACKAGE_TYPE3 0x400000
+#define ACPI_AML_PACKAGE_TYPE4 0x40000000
+
+/*
+ * Opcode classes
+ */
+#define AML_CLASS_EXECUTE 0x00
+#define AML_CLASS_CREATE 0x01
+#define AML_CLASS_ARGUMENT 0x02
+#define AML_CLASS_NAMED_OBJECT 0x03
+#define AML_CLASS_CONTROL 0x04
+#define AML_CLASS_ASCII 0x05
+#define AML_CLASS_PREFIX 0x06
+#define AML_CLASS_INTERNAL 0x07
+#define AML_CLASS_RETURN_VALUE 0x08
+#define AML_CLASS_METHOD_CALL 0x09
+#define AML_CLASS_UNKNOWN 0x0A
+
+
+/* Predefined Operation Region SpaceIDs */
+
+typedef enum
+{
+ REGION_MEMORY = 0,
+ REGION_IO,
+ REGION_PCI_CONFIG,
+ REGION_EC,
+ REGION_SMBUS,
+ REGION_CMOS,
+ REGION_PCI_BAR,
+ REGION_DATA_TABLE, /* Internal use only */
+ REGION_FIXED_HW = 0x7F
+
+} AML_REGION_TYPES;
+
+
+/* Comparison operation codes for MatchOp operator */
+
+typedef enum
+{
+ MATCH_MTR = 0,
+ MATCH_MEQ = 1,
+ MATCH_MLE = 2,
+ MATCH_MLT = 3,
+ MATCH_MGE = 4,
+ MATCH_MGT = 5
+
+} AML_MATCH_OPERATOR;
+
+#define MAX_MATCH_OPERATOR 5
+
+
+/*
+ * FieldFlags
+ *
+ * This byte is extracted from the AML and includes three separate
+ * pieces of information about the field:
+ * 1) The field access type
+ * 2) The field update rule
+ * 3) The lock rule for the field
+ *
+ * Bits 00 - 03 : AccessType (AnyAcc, ByteAcc, etc.)
+ * 04 : LockRule (1 == Lock)
+ * 05 - 06 : UpdateRule
+ */
+#define AML_FIELD_ACCESS_TYPE_MASK 0x0F
+#define AML_FIELD_LOCK_RULE_MASK 0x10
+#define AML_FIELD_UPDATE_RULE_MASK 0x60
+
+
+/* 1) Field Access Types */
+
+typedef enum
+{
+ AML_FIELD_ACCESS_ANY = 0x00,
+ AML_FIELD_ACCESS_BYTE = 0x01,
+ AML_FIELD_ACCESS_WORD = 0x02,
+ AML_FIELD_ACCESS_DWORD = 0x03,
+ AML_FIELD_ACCESS_QWORD = 0x04, /* ACPI 2.0 */
+ AML_FIELD_ACCESS_BUFFER = 0x05 /* ACPI 2.0 */
+
+} AML_ACCESS_TYPE;
+
+
+/* 2) Field Lock Rules */
+
+typedef enum
+{
+ AML_FIELD_LOCK_NEVER = 0x00,
+ AML_FIELD_LOCK_ALWAYS = 0x10
+
+} AML_LOCK_RULE;
+
+
+/* 3) Field Update Rules */
+
+typedef enum
+{
+ AML_FIELD_UPDATE_PRESERVE = 0x00,
+ AML_FIELD_UPDATE_WRITE_AS_ONES = 0x20,
+ AML_FIELD_UPDATE_WRITE_AS_ZEROS = 0x40
+
+} AML_UPDATE_RULE;
+
+
+/*
+ * Field Access Attributes.
+ * This byte is extracted from the AML via the
+ * AccessAs keyword
+ */
+typedef enum
+{
+ AML_FIELD_ATTRIB_SMB_QUICK = 0x02,
+ AML_FIELD_ATTRIB_SMB_SEND_RCV = 0x04,
+ AML_FIELD_ATTRIB_SMB_BYTE = 0x06,
+ AML_FIELD_ATTRIB_SMB_WORD = 0x08,
+ AML_FIELD_ATTRIB_SMB_BLOCK = 0x0A,
+ AML_FIELD_ATTRIB_SMB_WORD_CALL = 0x0C,
+ AML_FIELD_ATTRIB_SMB_BLOCK_CALL = 0x0D
+
+} AML_ACCESS_ATTRIBUTE;
+
+
+/* Bit fields in MethodFlags byte */
+
+#define AML_METHOD_ARG_COUNT 0x07
+#define AML_METHOD_SERIALIZED 0x08
+#define AML_METHOD_SYNCH_LEVEL 0xF0
+
+/* METHOD_FLAGS_ARG_COUNT is not used internally, define additional flags */
+
+#define AML_METHOD_INTERNAL_ONLY 0x01
+#define AML_METHOD_RESERVED1 0x02
+#define AML_METHOD_RESERVED2 0x04
+
+
+#endif /* __AMLCODE_H__ */
diff --git a/sys/contrib/dev/acpica/amlresrc.h b/sys/contrib/dev/acpica/amlresrc.h
new file mode 100644
index 0000000..e5b19fa
--- /dev/null
+++ b/sys/contrib/dev/acpica/amlresrc.h
@@ -0,0 +1,486 @@
+
+/******************************************************************************
+ *
+ * Module Name: amlresrc.h - AML resource descriptors
+ * $Revision: 1.40 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+/* acpisrc:StructDefs -- for acpisrc conversion */
+
+#ifndef __AMLRESRC_H
+#define __AMLRESRC_H
+
+
+/*
+ * Resource descriptor tags, as defined in the ACPI specification.
+ * Used to symbolically reference fields within a descriptor.
+ */
+#define ACPI_RESTAG_ADDRESS "_ADR"
+#define ACPI_RESTAG_ALIGNMENT "_ALN"
+#define ACPI_RESTAG_ADDRESSSPACE "_ASI"
+#define ACPI_RESTAG_ACCESSSIZE "_ASZ"
+#define ACPI_RESTAG_TYPESPECIFICATTRIBUTES "_ATT"
+#define ACPI_RESTAG_BASEADDRESS "_BAS"
+#define ACPI_RESTAG_BUSMASTER "_BM_" /* Master(1), Slave(0) */
+#define ACPI_RESTAG_DECODE "_DEC"
+#define ACPI_RESTAG_DMA "_DMA"
+#define ACPI_RESTAG_DMATYPE "_TYP" /* Compatible(0), A(1), B(2), F(3) */
+#define ACPI_RESTAG_GRANULARITY "_GRA"
+#define ACPI_RESTAG_INTERRUPT "_INT"
+#define ACPI_RESTAG_INTERRUPTLEVEL "_LL_" /* ActiveLo(1), ActiveHi(0) */
+#define ACPI_RESTAG_INTERRUPTSHARE "_SHR" /* Shareable(1), NoShare(0) */
+#define ACPI_RESTAG_INTERRUPTTYPE "_HE_" /* Edge(1), Level(0) */
+#define ACPI_RESTAG_LENGTH "_LEN"
+#define ACPI_RESTAG_MEMATTRIBUTES "_MTP" /* Memory(0), Reserved(1), ACPI(2), NVS(3) */
+#define ACPI_RESTAG_MEMTYPE "_MEM" /* NonCache(0), Cacheable(1) Cache+combine(2), Cache+prefetch(3) */
+#define ACPI_RESTAG_MAXADDR "_MAX"
+#define ACPI_RESTAG_MINADDR "_MIN"
+#define ACPI_RESTAG_MAXTYPE "_MAF"
+#define ACPI_RESTAG_MINTYPE "_MIF"
+#define ACPI_RESTAG_REGISTERBITOFFSET "_RBO"
+#define ACPI_RESTAG_REGISTERBITWIDTH "_RBW"
+#define ACPI_RESTAG_RANGETYPE "_RNG"
+#define ACPI_RESTAG_READWRITETYPE "_RW_" /* ReadOnly(0), Writeable (1) */
+#define ACPI_RESTAG_TRANSLATION "_TRA"
+#define ACPI_RESTAG_TRANSTYPE "_TRS" /* Sparse(1), Dense(0) */
+#define ACPI_RESTAG_TYPE "_TTP" /* Translation(1), Static (0) */
+#define ACPI_RESTAG_XFERTYPE "_SIZ" /* 8(0), 8And16(1), 16(2) */
+
+
+/* Default sizes for "small" resource descriptors */
+
+#define ASL_RDESC_IRQ_SIZE 0x02
+#define ASL_RDESC_DMA_SIZE 0x02
+#define ASL_RDESC_ST_DEPEND_SIZE 0x00
+#define ASL_RDESC_END_DEPEND_SIZE 0x00
+#define ASL_RDESC_IO_SIZE 0x07
+#define ASL_RDESC_FIXED_IO_SIZE 0x03
+#define ASL_RDESC_END_TAG_SIZE 0x01
+
+
+typedef struct asl_resource_node
+{
+ UINT32 BufferLength;
+ void *Buffer;
+ struct asl_resource_node *Next;
+
+} ASL_RESOURCE_NODE;
+
+
+/* Macros used to generate AML resource length fields */
+
+#define ACPI_AML_SIZE_LARGE(r) (sizeof (r) - sizeof (AML_RESOURCE_LARGE_HEADER))
+#define ACPI_AML_SIZE_SMALL(r) (sizeof (r) - sizeof (AML_RESOURCE_SMALL_HEADER))
+
+/*
+ * Resource descriptors defined in the ACPI specification.
+ *
+ * Packing/alignment must be BYTE because these descriptors
+ * are used to overlay the raw AML byte stream.
+ */
+#pragma pack(1)
+
+/*
+ * SMALL descriptors
+ */
+#define AML_RESOURCE_SMALL_HEADER_COMMON \
+ UINT8 DescriptorType;
+
+typedef struct aml_resource_small_header
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+
+} AML_RESOURCE_SMALL_HEADER;
+
+
+typedef struct aml_resource_irq
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+ UINT16 IrqMask;
+ UINT8 Flags;
+
+} AML_RESOURCE_IRQ;
+
+
+typedef struct aml_resource_irq_noflags
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+ UINT16 IrqMask;
+
+} AML_RESOURCE_IRQ_NOFLAGS;
+
+
+typedef struct aml_resource_dma
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+ UINT8 DmaChannelMask;
+ UINT8 Flags;
+
+} AML_RESOURCE_DMA;
+
+
+typedef struct aml_resource_start_dependent
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+ UINT8 Flags;
+
+} AML_RESOURCE_START_DEPENDENT;
+
+
+typedef struct aml_resource_start_dependent_noprio
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+
+} AML_RESOURCE_START_DEPENDENT_NOPRIO;
+
+
+typedef struct aml_resource_end_dependent
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+
+} AML_RESOURCE_END_DEPENDENT;
+
+
+typedef struct aml_resource_io
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+ UINT8 Flags;
+ UINT16 Minimum;
+ UINT16 Maximum;
+ UINT8 Alignment;
+ UINT8 AddressLength;
+
+} AML_RESOURCE_IO;
+
+
+typedef struct aml_resource_fixed_io
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+ UINT16 Address;
+ UINT8 AddressLength;
+
+} AML_RESOURCE_FIXED_IO;
+
+
+typedef struct aml_resource_vendor_small
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+
+} AML_RESOURCE_VENDOR_SMALL;
+
+
+typedef struct aml_resource_end_tag
+{
+ AML_RESOURCE_SMALL_HEADER_COMMON
+ UINT8 Checksum;
+
+} AML_RESOURCE_END_TAG;
+
+
+/*
+ * LARGE descriptors
+ */
+#define AML_RESOURCE_LARGE_HEADER_COMMON \
+ UINT8 DescriptorType;\
+ UINT16 ResourceLength;
+
+typedef struct aml_resource_large_header
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+
+} AML_RESOURCE_LARGE_HEADER;
+
+
+typedef struct aml_resource_memory24
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+ UINT8 Flags;
+ UINT16 Minimum;
+ UINT16 Maximum;
+ UINT16 Alignment;
+ UINT16 AddressLength;
+
+} AML_RESOURCE_MEMORY24;
+
+
+typedef struct aml_resource_vendor_large
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+
+} AML_RESOURCE_VENDOR_LARGE;
+
+
+typedef struct aml_resource_memory32
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+ UINT8 Flags;
+ UINT32 Minimum;
+ UINT32 Maximum;
+ UINT32 Alignment;
+ UINT32 AddressLength;
+
+} AML_RESOURCE_MEMORY32;
+
+
+typedef struct aml_resource_fixed_memory32
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+ UINT8 Flags;
+ UINT32 Address;
+ UINT32 AddressLength;
+
+} AML_RESOURCE_FIXED_MEMORY32;
+
+
+#define AML_RESOURCE_ADDRESS_COMMON \
+ UINT8 ResourceType; \
+ UINT8 Flags; \
+ UINT8 SpecificFlags;
+
+
+typedef struct aml_resource_address
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+ AML_RESOURCE_ADDRESS_COMMON
+
+} AML_RESOURCE_ADDRESS;
+
+
+typedef struct aml_resource_extended_address64
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+ AML_RESOURCE_ADDRESS_COMMON
+ UINT8 RevisionID;
+ UINT8 Reserved;
+ UINT64 Granularity;
+ UINT64 Minimum;
+ UINT64 Maximum;
+ UINT64 TranslationOffset;
+ UINT64 AddressLength;
+ UINT64 TypeSpecific;
+
+} AML_RESOURCE_EXTENDED_ADDRESS64;
+
+#define AML_RESOURCE_EXTENDED_ADDRESS_REVISION 1 /* ACPI 3.0 */
+
+
+typedef struct aml_resource_address64
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+ AML_RESOURCE_ADDRESS_COMMON
+ UINT64 Granularity;
+ UINT64 Minimum;
+ UINT64 Maximum;
+ UINT64 TranslationOffset;
+ UINT64 AddressLength;
+
+} AML_RESOURCE_ADDRESS64;
+
+
+typedef struct aml_resource_address32
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+ AML_RESOURCE_ADDRESS_COMMON
+ UINT32 Granularity;
+ UINT32 Minimum;
+ UINT32 Maximum;
+ UINT32 TranslationOffset;
+ UINT32 AddressLength;
+
+} AML_RESOURCE_ADDRESS32;
+
+
+typedef struct aml_resource_address16
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+ AML_RESOURCE_ADDRESS_COMMON
+ UINT16 Granularity;
+ UINT16 Minimum;
+ UINT16 Maximum;
+ UINT16 TranslationOffset;
+ UINT16 AddressLength;
+
+} AML_RESOURCE_ADDRESS16;
+
+
+typedef struct aml_resource_extended_irq
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+ UINT8 Flags;
+ UINT8 InterruptCount;
+ UINT32 Interrupts[1];
+ /* ResSourceIndex, ResSource optional fields follow */
+
+} AML_RESOURCE_EXTENDED_IRQ;
+
+
+typedef struct aml_resource_generic_register
+{
+ AML_RESOURCE_LARGE_HEADER_COMMON
+ UINT8 AddressSpaceId;
+ UINT8 BitWidth;
+ UINT8 BitOffset;
+ UINT8 AccessSize; /* ACPI 3.0, was previously Reserved */
+ UINT64 Address;
+
+} AML_RESOURCE_GENERIC_REGISTER;
+
+/* restore default alignment */
+
+#pragma pack()
+
+/* Union of all resource descriptors, so we can allocate the worst case */
+
+typedef union aml_resource
+{
+ /* Descriptor headers */
+
+ UINT8 DescriptorType;
+ AML_RESOURCE_SMALL_HEADER SmallHeader;
+ AML_RESOURCE_LARGE_HEADER LargeHeader;
+
+ /* Small resource descriptors */
+
+ AML_RESOURCE_IRQ Irq;
+ AML_RESOURCE_DMA Dma;
+ AML_RESOURCE_START_DEPENDENT StartDpf;
+ AML_RESOURCE_END_DEPENDENT EndDpf;
+ AML_RESOURCE_IO Io;
+ AML_RESOURCE_FIXED_IO FixedIo;
+ AML_RESOURCE_VENDOR_SMALL VendorSmall;
+ AML_RESOURCE_END_TAG EndTag;
+
+ /* Large resource descriptors */
+
+ AML_RESOURCE_MEMORY24 Memory24;
+ AML_RESOURCE_GENERIC_REGISTER GenericReg;
+ AML_RESOURCE_VENDOR_LARGE VendorLarge;
+ AML_RESOURCE_MEMORY32 Memory32;
+ AML_RESOURCE_FIXED_MEMORY32 FixedMemory32;
+ AML_RESOURCE_ADDRESS16 Address16;
+ AML_RESOURCE_ADDRESS32 Address32;
+ AML_RESOURCE_ADDRESS64 Address64;
+ AML_RESOURCE_EXTENDED_ADDRESS64 ExtAddress64;
+ AML_RESOURCE_EXTENDED_IRQ ExtendedIrq;
+
+ /* Utility overlays */
+
+ AML_RESOURCE_ADDRESS Address;
+ UINT32 DwordItem;
+ UINT16 WordItem;
+ UINT8 ByteItem;
+
+} AML_RESOURCE;
+
+#endif
+
diff --git a/sys/contrib/dev/acpica/common/adfile.c b/sys/contrib/dev/acpica/common/adfile.c
new file mode 100644
index 0000000..732b2bb
--- /dev/null
+++ b/sys/contrib/dev/acpica/common/adfile.c
@@ -0,0 +1,398 @@
+/******************************************************************************
+ *
+ * Module Name: adfile - Application-level disassembler file support routines
+ * $Revision: 1.3 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acapps.h>
+
+#include <stdio.h>
+#include <string.h>
+
+
+#define _COMPONENT ACPI_TOOLS
+ ACPI_MODULE_NAME ("adfile")
+
+
+char FilenameBuf[20];
+
+/******************************************************************************
+ *
+ * FUNCTION: AfGenerateFilename
+ *
+ * PARAMETERS: Prefix - prefix string
+ * TableId - The table ID
+ *
+ * RETURN: Pointer to the completed string
+ *
+ * DESCRIPTION: Build an output filename from an ACPI table ID string
+ *
+ ******************************************************************************/
+
+char *
+AdGenerateFilename (
+ char *Prefix,
+ char *TableId)
+{
+ ACPI_NATIVE_UINT i;
+ ACPI_NATIVE_UINT j;
+
+
+ for (i = 0; Prefix[i]; i++)
+ {
+ FilenameBuf[i] = Prefix[i];
+ }
+
+ FilenameBuf[i] = '_';
+ i++;
+
+ for (j = 0; j < 8 && (TableId[j] != ' ') && (TableId[j] != 0); i++, j++)
+ {
+ FilenameBuf[i] = TableId[j];
+ }
+
+ FilenameBuf[i] = 0;
+ strcat (FilenameBuf, ACPI_TABLE_FILE_SUFFIX);
+ return FilenameBuf;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AfWriteBuffer
+ *
+ * PARAMETERS: Filename - name of file
+ * Buffer - data to write
+ * Length - length of data
+ *
+ * RETURN: Actual number of bytes written
+ *
+ * DESCRIPTION: Open a file and write out a single buffer
+ *
+ ******************************************************************************/
+
+ACPI_NATIVE_INT
+AdWriteBuffer (
+ char *Filename,
+ char *Buffer,
+ UINT32 Length)
+{
+ FILE *fp;
+ ACPI_SIZE Actual;
+
+
+ fp = fopen (Filename, "wb");
+ if (!fp)
+ {
+ printf ("Couldn't open %s\n", Filename);
+ return (-1);
+ }
+
+ Actual = fwrite (Buffer, (size_t) Length, 1, fp);
+ fclose (fp);
+ return ((ACPI_NATIVE_INT) Actual);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AfWriteTable
+ *
+ * PARAMETERS: Table - pointer to the ACPI table
+ * Length - length of the table
+ * TableName - the table signature
+ * OemTableID - from the table header
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump the loaded tables to a file (or files)
+ *
+ ******************************************************************************/
+
+void
+AdWriteTable (
+ ACPI_TABLE_HEADER *Table,
+ UINT32 Length,
+ char *TableName,
+ char *OemTableId)
+{
+ char *Filename;
+
+
+ Filename = AdGenerateFilename (TableName, OemTableId);
+ AdWriteBuffer (Filename, (char *) Table, Length);
+
+ AcpiOsPrintf ("Table [%s] written to \"%s\"\n", TableName, Filename);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlGenerateFilename
+ *
+ * PARAMETERS: InputFilename - Original ASL source filename
+ * Suffix - New extension.
+ *
+ * RETURN: New filename containing the original base + the new suffix
+ *
+ * DESCRIPTION: Generate a new filename from the ASL source filename and a new
+ * extension. Used to create the *.LST, *.TXT, etc. files.
+ *
+ ******************************************************************************/
+
+char *
+FlGenerateFilename (
+ char *InputFilename,
+ char *Suffix)
+{
+ char *Position;
+ char *NewFilename;
+
+
+ /*
+ * Copy the original filename to a new buffer. Leave room for the worst case
+ * where we append the suffix, an added dot and the null terminator.
+ */
+ NewFilename = ACPI_ALLOCATE_ZEROED (
+ strlen (InputFilename) + strlen (Suffix) + 2);
+ strcpy (NewFilename, InputFilename);
+
+ /* Try to find the last dot in the filename */
+
+ Position = strrchr (NewFilename, '.');
+ if (Position)
+ {
+ /* Tack on the new suffix */
+
+ Position++;
+ *Position = 0;
+ strcat (Position, Suffix);
+ }
+ else
+ {
+ /* No dot, add one and then the suffix */
+
+ strcat (NewFilename, ".");
+ strcat (NewFilename, Suffix);
+ }
+
+ return NewFilename;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlStrdup
+ *
+ * DESCRIPTION: Local strdup function
+ *
+ ******************************************************************************/
+
+static char *
+FlStrdup (
+ char *String)
+{
+ char *NewString;
+
+
+ NewString = ACPI_ALLOCATE (strlen (String) + 1);
+ if (!NewString)
+ {
+ return (NULL);
+ }
+
+ strcpy (NewString, String);
+ return (NewString);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlSplitInputPathname
+ *
+ * PARAMETERS: InputFilename - The user-specified ASL source file to be
+ * compiled
+ * OutDirectoryPath - Where the directory path prefix is
+ * returned
+ * OutFilename - Where the filename part is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Split the input path into a directory and filename part
+ * 1) Directory part used to open include files
+ * 2) Filename part used to generate output filenames
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+FlSplitInputPathname (
+ char *InputPath,
+ char **OutDirectoryPath,
+ char **OutFilename)
+{
+ char *Substring;
+ char *DirectoryPath;
+ char *Filename;
+
+
+ *OutDirectoryPath = NULL;
+ *OutFilename = NULL;
+
+ if (!InputPath)
+ {
+ return (AE_OK);
+ }
+
+ /* Get the path to the input filename's directory */
+
+ DirectoryPath = FlStrdup (InputPath);
+ if (!DirectoryPath)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ Substring = strrchr (DirectoryPath, '\\');
+ if (!Substring)
+ {
+ Substring = strrchr (DirectoryPath, '/');
+ if (!Substring)
+ {
+ Substring = strrchr (DirectoryPath, ':');
+ }
+ }
+
+ if (!Substring)
+ {
+ DirectoryPath[0] = 0;
+ Filename = FlStrdup (InputPath);
+ }
+ else
+ {
+ Filename = FlStrdup (Substring + 1);
+ *(Substring+1) = 0;
+ }
+
+ if (!Filename)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ *OutDirectoryPath = DirectoryPath;
+ *OutFilename = Filename;
+
+ return (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/common/adisasm.c b/sys/contrib/dev/acpica/common/adisasm.c
new file mode 100644
index 0000000..843a9a8
--- /dev/null
+++ b/sys/contrib/dev/acpica/common/adisasm.c
@@ -0,0 +1,1132 @@
+/******************************************************************************
+ *
+ * Module Name: adisasm - Application-level disassembler routines
+ * $Revision: 1.104 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdebug.h>
+#include <contrib/dev/acpica/acdisasm.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/actables.h>
+#include <contrib/dev/acpica/acapps.h>
+
+#include <stdio.h>
+#include <time.h>
+
+
+#define _COMPONENT ACPI_TOOLS
+ ACPI_MODULE_NAME ("adisasm")
+
+extern int AslCompilerdebug;
+
+ACPI_STATUS
+LsDisplayNamespace (
+ void);
+
+void
+LsSetupNsList (void * Handle);
+
+
+/* Local prototypes */
+
+void
+AdCreateTableHeader (
+ char *Filename,
+ ACPI_TABLE_HEADER *Table);
+
+void
+AdDisassemblerHeader (
+ char *Filename);
+
+ACPI_PARSE_OBJECT *AcpiGbl_ParseOpRoot;
+
+
+/* Stubs for ASL compiler */
+
+#ifndef ACPI_ASL_COMPILER
+BOOLEAN
+AcpiDsIsResultUsed (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState)
+{
+ return TRUE;
+}
+
+ACPI_STATUS
+AcpiDsMethodError (
+ ACPI_STATUS Status,
+ ACPI_WALK_STATE *WalkState)
+{
+ return (Status);
+}
+
+#endif
+
+ACPI_STATUS
+AcpiNsLoadTable (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_NAMESPACE_NODE *Node)
+{
+ return (AE_NOT_IMPLEMENTED);
+}
+
+ACPI_STATUS
+AcpiDsRestartControlMethod (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT *ReturnDesc)
+{
+ return (AE_OK);
+}
+
+void
+AcpiDsTerminateControlMethod (
+ ACPI_OPERAND_OBJECT *MethodDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ return;
+}
+
+ACPI_STATUS
+AcpiDsCallControlMethod (
+ ACPI_THREAD_STATE *Thread,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ return (AE_OK);
+}
+
+ACPI_STATUS
+AcpiDsMethodDataInitArgs (
+ ACPI_OPERAND_OBJECT **Params,
+ UINT32 MaxParamCount,
+ ACPI_WALK_STATE *WalkState)
+{
+ return (AE_OK);
+}
+
+
+ACPI_TABLE_DESC LocalTables[1];
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AdInitialize
+ *
+ * PARAMETERS: None.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: CA initialization
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AdInitialize (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ /* ACPI CA subsystem initialization */
+
+ Status = AcpiOsInitialize ();
+ AcpiUtInitGlobals ();
+
+ Status = AcpiUtMutexInitialize ();
+ if (ACPI_FAILURE (Status))
+ {
+ return Status;
+ }
+
+ Status = AcpiNsRootInitialize ();
+ if (ACPI_FAILURE (Status))
+ {
+ return Status;
+ }
+
+ /* Setup the Table Manager (cheat - there is no RSDT) */
+
+ AcpiGbl_RootTableList.Size = 1;
+ AcpiGbl_RootTableList.Count = 0;
+ AcpiGbl_RootTableList.Tables = LocalTables;
+
+ return Status;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AdAddExternalsToNamespace
+ *
+ * PARAMETERS:
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION:
+ *
+ ******************************************************************************/
+
+void
+AdAddExternalsToNamespace (
+ void)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList;
+ ACPI_OPERAND_OBJECT *MethodDesc;
+
+
+ while (External)
+ {
+ Status = AcpiNsLookup (NULL, External->InternalPath, External->Type,
+ ACPI_IMODE_LOAD_PASS1, ACPI_NS_EXTERNAL | ACPI_NS_DONT_OPEN_SCOPE,
+ NULL, &Node);
+
+ if (External->Type == ACPI_TYPE_METHOD)
+ {
+ MethodDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
+ MethodDesc->Method.ParamCount = (UINT8) External->Value;
+ Node->Object = MethodDesc;
+ }
+
+ External = External->Next;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AdMethodExternalCount
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Return the number of externals that have been generated
+ *
+ ******************************************************************************/
+
+UINT32
+AdMethodExternalCount (
+ void)
+{
+ ACPI_EXTERNAL_LIST *External = AcpiGbl_ExternalList;
+ UINT32 Count = 0;
+
+
+ while (External)
+ {
+ if (External->Type == ACPI_TYPE_METHOD)
+ {
+ Count++;
+ }
+
+ External = External->Next;
+ }
+
+ return (Count);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AdAmlDisassemble
+ *
+ * PARAMETERS: Filename - AML input filename
+ * OutToFile - TRUE if output should go to a file
+ * Prefix - Path prefix for output
+ * OutFilename - where the filename is returned
+ * GetAllTables - TRUE if all tables are desired
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Disassemble an entire ACPI table
+ *
+ *****************************************************************************/
+
+extern char *Gbl_ExternalFilename;
+
+ACPI_STATUS
+AdAmlDisassemble (
+ BOOLEAN OutToFile,
+ char *Filename,
+ char *Prefix,
+ char **OutFilename,
+ BOOLEAN GetAllTables)
+{
+ ACPI_STATUS Status;
+ char *DisasmFilename = NULL;
+ FILE *File = NULL;
+ ACPI_TABLE_HEADER *Table;
+ ACPI_TABLE_HEADER *ExternalTable;
+
+
+ /*
+ * Input: AML Code from either a file,
+ * or via GetTables (memory or registry)
+ */
+ if (Filename)
+ {
+ Status = AcpiDbGetTableFromFile (Filename, &Table);
+ if (ACPI_FAILURE (Status))
+ {
+ return Status;
+ }
+
+ if (Gbl_ExternalFilename)
+ {
+ Status = AcpiDbGetTableFromFile (Gbl_ExternalFilename, &ExternalTable);
+ if (ACPI_FAILURE (Status))
+ {
+ return Status;
+ }
+ }
+ }
+ else
+ {
+ Status = AdGetLocalTables (Filename, GetAllTables);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not get ACPI tables, %s\n",
+ AcpiFormatException (Status));
+ return Status;
+ }
+
+ if (!AcpiGbl_DbOpt_disasm)
+ {
+ return AE_OK;
+ }
+
+ /* Obtained the local tables, just disassemble the DSDT */
+
+ Status = AcpiGetTable (ACPI_SIG_DSDT, 0, &Table);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not get DSDT, %s\n",
+ AcpiFormatException (Status));
+ return Status;
+ }
+
+ AcpiOsPrintf ("\nDisassembly of DSDT\n");
+ Prefix = AdGenerateFilename ("dsdt", Table->OemTableId);
+ }
+
+ /*
+ * Output: ASL code.
+ * Redirect to a file if requested
+ */
+ if (OutToFile)
+ {
+ /* Create/Open a disassembly output file */
+
+ DisasmFilename = FlGenerateFilename (Prefix, FILE_SUFFIX_DISASSEMBLY);
+ if (!OutFilename)
+ {
+ fprintf (stderr, "Could not generate output filename\n");
+ Status = AE_ERROR;
+ goto Cleanup;
+ }
+
+ File = fopen (DisasmFilename, "w+");
+ if (!File)
+ {
+ fprintf (stderr, "Could not open output file %s\n", DisasmFilename);
+ Status = AE_ERROR;
+ goto Cleanup;
+ }
+
+ AcpiOsRedirectOutput (File);
+ }
+
+ *OutFilename = DisasmFilename;
+
+ if (!AcpiUtIsAmlTable (Table))
+ {
+ AdDisassemblerHeader (Filename);
+ AcpiOsPrintf (" * ACPI Data Table [%4.4s]\n *\n",
+ Table->Signature);
+ AcpiOsPrintf (" * Format: [HexOffset DecimalOffset ByteLength] FieldName : FieldValue\n */\n\n");
+
+ AcpiDmDumpDataTable (Table);
+ fprintf (stderr, "Acpi Data Table [%4.4s] decoded, written to \"%s\"\n",
+ Table->Signature, DisasmFilename);
+ }
+ else
+ {
+ /* Always parse the tables, only option is what to display */
+
+ Status = AdParseTable (Table);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not parse ACPI tables, %s\n",
+ AcpiFormatException (Status));
+ goto Cleanup;
+ }
+
+ if (AslCompilerdebug)
+ {
+ AcpiOsPrintf ("/**** Before second load\n");
+
+ LsSetupNsList (File);
+ LsDisplayNamespace ();
+ AcpiOsPrintf ("*****/\n");
+ }
+
+ /*
+ * Load namespace from names created within control methods
+ */
+ AcpiDmFinishNamespaceLoad (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode);
+
+ /*
+ * Cross reference the namespace here, in order to generate External() statements
+ */
+ AcpiDmCrossReferenceNamespace (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode);
+
+ if (AslCompilerdebug)
+ {
+ AcpiDmDumpTree (AcpiGbl_ParseOpRoot);
+ }
+
+ /* Find possible calls to external control methods */
+
+ AcpiDmFindOrphanMethods (AcpiGbl_ParseOpRoot);
+
+ /* Convert fixed-offset references to resource descriptors to symbolic references */
+
+ AcpiDmConvertResourceIndexes (AcpiGbl_ParseOpRoot, AcpiGbl_RootNode);
+
+ if (AslCompilerdebug)
+ {
+ AcpiOsPrintf ("/**** After second load and resource conversion\n");
+ LsSetupNsList (File);
+ LsDisplayNamespace ();
+ AcpiOsPrintf ("*****/\n");
+ }
+
+ /*
+ * If we found any external control methods, we must reparse the entire
+ * tree with the new information (namely, the number of arguments per
+ * method)
+ */
+ if (AdMethodExternalCount ())
+ {
+ fprintf (stderr,
+ "\nFound %d external control methods, reparsing with new information\n",
+ AdMethodExternalCount());
+
+ /*
+ * Reparse, rebuild namespace. no need to xref namespace
+ */
+ AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
+ AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode);
+
+ AcpiGbl_RootNode = NULL;
+ AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
+ AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
+ AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE;
+ AcpiGbl_RootNodeStruct.Child = NULL;
+ AcpiGbl_RootNodeStruct.Peer = NULL;
+ AcpiGbl_RootNodeStruct.Object = NULL;
+ AcpiGbl_RootNodeStruct.Flags = ANOBJ_END_OF_PEER_LIST;
+
+ Status = AcpiNsRootInitialize ();
+ AdAddExternalsToNamespace ();
+
+ Status = AdParseTable (Table);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not parse ACPI tables, %s\n",
+ AcpiFormatException (Status));
+ goto Cleanup;
+ }
+
+ if (AslCompilerdebug)
+ {
+ AcpiDmDumpTree (AcpiGbl_ParseOpRoot);
+ }
+ }
+
+ /* Optional displays */
+
+ if (AcpiGbl_DbOpt_disasm)
+ {
+ AdDisplayTables (Filename, Table);
+ fprintf (stderr,
+ "Disassembly completed, written to \"%s\"\n",
+ DisasmFilename);
+ }
+ }
+
+Cleanup:
+ if (OutToFile && File)
+ {
+
+#ifdef ASL_DISASM_DEBUG
+ LsSetupNsList (File);
+ LsDisplayNamespace ();
+#endif
+ fclose (File);
+ AcpiOsRedirectOutput (stdout);
+ }
+
+ AcpiPsDeleteParseTree (AcpiGbl_ParseOpRoot);
+ return Status;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AdDisassemblerHeader
+ *
+ * PARAMETERS: Filename - Input file for the table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Create the disassembler header, including ACPI CA signon with
+ * current time and date.
+ *
+ *****************************************************************************/
+
+void
+AdDisassemblerHeader (
+ char *Filename)
+{
+ time_t Timer;
+
+ time (&Timer);
+
+ /* Header and input table info */
+
+ AcpiOsPrintf ("/*\n * Intel ACPI Component Architecture\n");
+ AcpiOsPrintf (" * AML Disassembler version %8.8X\n", ACPI_CA_VERSION);
+
+ AcpiOsPrintf (" *\n * Disassembly of %s, %s", Filename, ctime (&Timer));
+ AcpiOsPrintf (" *\n");
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AdCreateTableHeader
+ *
+ * PARAMETERS: Filename - Input file for the table
+ * Table - Pointer to the raw table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Create the ASL table header, including ACPI CA signon with
+ * current time and date.
+ *
+ *****************************************************************************/
+
+void
+AdCreateTableHeader (
+ char *Filename,
+ ACPI_TABLE_HEADER *Table)
+{
+ char *NewFilename;
+
+
+ AdDisassemblerHeader (Filename);
+
+ AcpiOsPrintf (" *\n * Original Table Header:\n");
+ AcpiOsPrintf (" * Signature \"%4.4s\"\n", Table->Signature);
+ AcpiOsPrintf (" * Length 0x%8.8X (%u)\n", Table->Length, Table->Length);
+ AcpiOsPrintf (" * Revision 0x%2.2X\n", Table->Revision);
+ AcpiOsPrintf (" * OEM ID \"%.6s\"\n", Table->OemId);
+ AcpiOsPrintf (" * OEM Table ID \"%.8s\"\n", Table->OemTableId);
+ AcpiOsPrintf (" * OEM Revision 0x%8.8X (%u)\n", Table->OemRevision, Table->OemRevision);
+ AcpiOsPrintf (" * Creator ID \"%.4s\"\n", Table->AslCompilerId);
+ AcpiOsPrintf (" * Creator Revision 0x%8.8X (%u)\n", Table->AslCompilerRevision, Table->AslCompilerRevision);
+ AcpiOsPrintf (" */\n");
+
+ /* Create AML output filename based on input filename */
+
+ if (Filename)
+ {
+ NewFilename = FlGenerateFilename (Filename, "aml");
+ }
+ else
+ {
+ NewFilename = ACPI_ALLOCATE_ZEROED (9);
+ strncat (NewFilename, Table->Signature, 4);
+ strcat (NewFilename, ".aml");
+ }
+
+ /* Open the ASL definition block */
+
+ AcpiOsPrintf (
+ "DefinitionBlock (\"%s\", \"%4.4s\", %hd, \"%.6s\", \"%.8s\", 0x%8.8X)\n",
+ NewFilename, Table->Signature, Table->Revision,
+ Table->OemId, Table->OemTableId, Table->OemRevision);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AdDisplayTables
+ *
+ * PARAMETERS: Filename - Input file for the table
+ * Table - Pointer to the raw table
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Display (disassemble) loaded tables and dump raw tables
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AdDisplayTables (
+ char *Filename,
+ ACPI_TABLE_HEADER *Table)
+{
+
+
+ if (!AcpiGbl_ParseOpRoot)
+ {
+ return AE_NOT_EXIST;
+ }
+
+ if (!AcpiGbl_DbOpt_verbose)
+ {
+ AdCreateTableHeader (Filename, Table);
+ }
+
+ AcpiDmDisassemble (NULL, AcpiGbl_ParseOpRoot, ACPI_UINT32_MAX);
+
+ if (AcpiGbl_DbOpt_verbose)
+ {
+ AcpiOsPrintf ("\n\nTable Header:\n");
+ AcpiUtDumpBuffer ((UINT8 *) Table, sizeof (ACPI_TABLE_HEADER),
+ DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
+
+ AcpiOsPrintf ("Table Body (Length 0x%X)\n", Table->Length);
+ AcpiUtDumpBuffer (((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER)), Table->Length,
+ DB_BYTE_DISPLAY, ACPI_UINT32_MAX);
+ }
+
+ return AE_OK;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AdDeferredParse
+ *
+ * PARAMETERS: Op - Root Op of the deferred opcode
+ * Aml - Pointer to the raw AML
+ * AmlLength - Length of the AML
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Parse one deferred opcode
+ * (Methods, operation regions, etc.)
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AdDeferredParse (
+ ACPI_PARSE_OBJECT *Op,
+ UINT8 *Aml,
+ UINT32 AmlLength)
+{
+ ACPI_WALK_STATE *WalkState;
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *SearchOp;
+ ACPI_PARSE_OBJECT *StartOp;
+ UINT32 BaseAmlOffset;
+ ACPI_PARSE_OBJECT *ExtraOp;
+
+
+ ACPI_FUNCTION_TRACE (AdDeferredParse);
+
+
+ fprintf (stderr, ".");
+
+ if (!Aml || !AmlLength)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Parsing %s [%4.4s]\n",
+ Op->Common.AmlOpName, (char *) &Op->Named.Name));
+
+ WalkState = AcpiDsCreateWalkState (0, Op, NULL, NULL);
+ if (!WalkState)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, Aml,
+ AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Parse the method */
+
+ WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
+ WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
+ Status = AcpiPsParseAml (WalkState);
+
+ /*
+ * We need to update all of the Aml offsets, since the parser thought
+ * that the method began at offset zero. In reality, it began somewhere
+ * within the ACPI table, at the BaseAmlOffset. Walk the entire tree that
+ * was just created and update the AmlOffset in each Op
+ */
+ BaseAmlOffset = (Op->Common.Value.Arg)->Common.AmlOffset + 1;
+ StartOp = (Op->Common.Value.Arg)->Common.Next;
+ SearchOp = StartOp;
+
+ /* Walk the parse tree */
+
+ while (SearchOp)
+ {
+ SearchOp->Common.AmlOffset += BaseAmlOffset;
+ SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);
+ }
+
+ /*
+ * Link the newly parsed subtree into the main parse tree
+ */
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_BUFFER_OP:
+ case AML_PACKAGE_OP:
+ case AML_VAR_PACKAGE_OP:
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_PACKAGE_OP:
+ ExtraOp = Op->Common.Value.Arg;
+ ExtraOp = ExtraOp->Common.Next;
+ Op->Common.Value.Arg = ExtraOp->Common.Value.Arg;
+ break;
+
+ case AML_VAR_PACKAGE_OP:
+ case AML_BUFFER_OP:
+ default:
+ ExtraOp = Op->Common.Value.Arg;
+ Op->Common.Value.Arg = ExtraOp->Common.Value.Arg;
+ break;
+ }
+
+ /* Must point all parents to the main tree */
+
+ StartOp = Op;
+ SearchOp = StartOp;
+ while (SearchOp)
+ {
+ if (SearchOp->Common.Parent == ExtraOp)
+ {
+ SearchOp->Common.Parent = Op;
+ }
+ SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AdParseDeferredOps
+ *
+ * PARAMETERS: Root - Root of the parse tree
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Parse the deferred opcodes (Methods, regions, etc.)
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AdParseDeferredOps (
+ ACPI_PARSE_OBJECT *Root)
+{
+ ACPI_PARSE_OBJECT *Op = Root;
+ ACPI_STATUS Status = AE_OK;
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ ACPI_FUNCTION_NAME (AdParseDeferredOps);
+ fprintf (stderr, "Parsing Deferred Opcodes (Methods/Buffers/Packages/Regions)\n");
+
+ while (Op)
+ {
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ if (!(OpInfo->Flags & AML_DEFER))
+ {
+ Op = AcpiPsGetDepthNext (Root, Op);
+ continue;
+ }
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_METHOD_OP:
+ case AML_BUFFER_OP:
+ case AML_PACKAGE_OP:
+ case AML_VAR_PACKAGE_OP:
+
+ Status = AdDeferredParse (Op, Op->Named.Data, Op->Named.Length);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ break;
+
+ case AML_REGION_OP:
+ case AML_CREATE_QWORD_FIELD_OP:
+ case AML_CREATE_DWORD_FIELD_OP:
+ case AML_CREATE_WORD_FIELD_OP:
+ case AML_CREATE_BYTE_FIELD_OP:
+ case AML_CREATE_BIT_FIELD_OP:
+ case AML_CREATE_FIELD_OP:
+
+ /* Nothing to do in these cases */
+
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO, "Unhandled deferred opcode [%s]",
+ Op->Common.AmlOpName));
+ break;
+ }
+
+ Op = AcpiPsGetDepthNext (Root, Op);
+ }
+
+ fprintf (stderr, "\n");
+ return Status;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AdGetLocalTables
+ *
+ * PARAMETERS: Filename - Not used
+ * GetAllTables - TRUE if all tables are desired
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get the ACPI tables from either memory or a file
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AdGetLocalTables (
+ char *Filename,
+ BOOLEAN GetAllTables)
+{
+ ACPI_STATUS Status;
+ ACPI_TABLE_HEADER TableHeader;
+ ACPI_TABLE_HEADER *NewTable;
+ UINT32 NumTables;
+ UINT32 PointerSize;
+ ACPI_NATIVE_UINT TableIndex;
+
+
+ if (GetAllTables)
+ {
+ ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_RSDT);
+ AcpiOsTableOverride (&TableHeader, &NewTable);
+ if (!NewTable)
+ {
+ fprintf (stderr, "Could not obtain RSDT\n");
+ return AE_NO_ACPI_TABLES;
+ }
+
+ if (ACPI_COMPARE_NAME (NewTable->Signature, ACPI_SIG_RSDT))
+ {
+ PointerSize = sizeof (UINT32);
+ }
+ else
+ {
+ PointerSize = sizeof (UINT64);
+ }
+
+ /*
+ * Determine the number of tables pointed to by the RSDT/XSDT.
+ * This is defined by the ACPI Specification to be the number of
+ * pointers contained within the RSDT/XSDT. The size of the pointers
+ * is architecture-dependent.
+ */
+ NumTables = (NewTable->Length - sizeof (ACPI_TABLE_HEADER)) / PointerSize;
+ AcpiOsPrintf ("There are %d tables defined in the %4.4s\n\n",
+ NumTables, NewTable->Signature);
+
+ /* Get the FADT */
+
+ ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_FADT);
+ AcpiOsTableOverride (&TableHeader, &NewTable);
+ if (NewTable)
+ {
+ AdWriteTable (NewTable, NewTable->Length,
+ ACPI_SIG_FADT, NewTable->OemTableId);
+ }
+ AcpiOsPrintf ("\n");
+
+ /* Don't bother with FACS, it is usually all zeros */
+ }
+
+ /* Always get the DSDT */
+
+ ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_DSDT);
+ AcpiOsTableOverride (&TableHeader, &NewTable);
+ if (NewTable)
+ {
+ AdWriteTable (NewTable, NewTable->Length,
+ ACPI_SIG_DSDT, NewTable->OemTableId);
+
+ /* Store DSDT in the Table Manager */
+
+ Status = AcpiTbStoreTable (0, NewTable, NewTable->Length,
+ 0, &TableIndex);
+ }
+ else
+ {
+ fprintf (stderr, "Could not obtain DSDT\n");
+ return AE_NO_ACPI_TABLES;
+ }
+
+#if 0
+ /* TBD: Future implementation */
+
+ AcpiOsPrintf ("\n");
+
+ /* Get all SSDTs */
+
+ ACPI_MOVE_32_TO_32 (TableHeader.Signature, ACPI_SIG_SSDT);
+ do
+ {
+ NewTable = NULL;
+ Status = AcpiOsTableOverride (&TableHeader, &NewTable);
+
+ } while (NewTable);
+#endif
+
+ return AE_OK;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AdParseTable
+ *
+ * PARAMETERS: Table - Pointer to the raw table
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Parse the DSDT.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AdParseTable (
+ ACPI_TABLE_HEADER *Table)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_WALK_STATE *WalkState;
+ UINT8 *AmlStart;
+ UINT32 AmlLength;
+ ACPI_NATIVE_UINT TableIndex;
+
+
+ if (!Table)
+ {
+ return AE_NOT_EXIST;
+ }
+
+ /* Pass 1: Parse everything except control method bodies */
+
+ fprintf (stderr, "Pass 1 parse of [%4.4s]\n", (char *) Table->Signature);
+
+ AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
+ AmlStart = ((UINT8 *) Table + sizeof (ACPI_TABLE_HEADER));
+
+ /* Create the root object */
+
+ AcpiGbl_ParseOpRoot = AcpiPsCreateScopeOp ();
+ if (!AcpiGbl_ParseOpRoot)
+ {
+ return AE_NO_MEMORY;
+ }
+
+ /* Create and initialize a new walk state */
+
+ WalkState = AcpiDsCreateWalkState (0,
+ AcpiGbl_ParseOpRoot, NULL, NULL);
+ if (!WalkState)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ Status = AcpiDsInitAmlWalk (WalkState, AcpiGbl_ParseOpRoot,
+ NULL, AmlStart, AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
+ WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
+
+ Status = AcpiPsParseAml (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return Status;
+ }
+
+ /* Pass 2 */
+
+ Status = AcpiTbStoreTable ((ACPI_NATIVE_UINT) Table, Table,
+ Table->Length, ACPI_TABLE_ORIGIN_ALLOCATED, &TableIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ return Status;
+ }
+
+ fprintf (stderr, "Pass 2 parse of [%4.4s]\n", (char *) Table->Signature);
+
+ Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS2, 0);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Pass 3: Parse control methods and link their parse trees into the main parse tree */
+
+ Status = AdParseDeferredOps (AcpiGbl_ParseOpRoot);
+
+ /* Process Resource Templates */
+
+ AcpiDmFindResources (AcpiGbl_ParseOpRoot);
+
+ fprintf (stderr, "Parsing completed\n");
+ return AE_OK;
+}
+
+
diff --git a/sys/contrib/dev/acpica/common/adwalk.c b/sys/contrib/dev/acpica/common/adwalk.c
new file mode 100644
index 0000000..108561c
--- /dev/null
+++ b/sys/contrib/dev/acpica/common/adwalk.c
@@ -0,0 +1,1001 @@
+/******************************************************************************
+ *
+ * Module Name: adwalk - Application-level disassembler parse tree walk routines
+ * $Revision: 1.6 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdebug.h>
+#include <contrib/dev/acpica/acdisasm.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acapps.h>
+
+
+#define _COMPONENT ACPI_TOOLS
+ ACPI_MODULE_NAME ("adwalk")
+
+/*
+ * aslmap - opcode mappings and reserved method names
+ */
+ACPI_OBJECT_TYPE
+AslMapNamedOpcodeToDataType (
+ UINT16 Opcode);
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDmFindOrphanDescending (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static ACPI_STATUS
+AcpiDmDumpDescending (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static ACPI_STATUS
+AcpiDmXrefDescendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static ACPI_STATUS
+AcpiDmCommonAscendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static ACPI_STATUS
+AcpiDmLoadDescendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static UINT32
+AcpiDmInspectPossibleArgs (
+ UINT32 CurrentOpArgCount,
+ UINT32 TargetCount,
+ ACPI_PARSE_OBJECT *Op);
+
+static ACPI_STATUS
+AcpiDmResourceDescendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpTree
+ *
+ * PARAMETERS: Origin - Starting object
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Parse tree walk to format and output the nodes
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpTree (
+ ACPI_PARSE_OBJECT *Origin)
+{
+ ACPI_OP_WALK_INFO Info;
+
+
+ if (!Origin)
+ {
+ return;
+ }
+
+ AcpiOsPrintf ("/*\nAML Parse Tree\n\n");
+ Info.Flags = 0;
+ Info.Count = 0;
+ Info.Level = 0;
+ Info.WalkState = NULL;
+ AcpiDmWalkParseTree (Origin, AcpiDmDumpDescending, NULL, &Info);
+ AcpiOsPrintf ("*/\n\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmFindOrphanMethods
+ *
+ * PARAMETERS: Origin - Starting object
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Parse tree walk to find "orphaned" method invocations -- methods
+ * that are not resolved in the namespace
+ *
+ ******************************************************************************/
+
+void
+AcpiDmFindOrphanMethods (
+ ACPI_PARSE_OBJECT *Origin)
+{
+ ACPI_OP_WALK_INFO Info;
+
+
+ if (!Origin)
+ {
+ return;
+ }
+
+ Info.Flags = 0;
+ Info.Level = 0;
+ Info.WalkState = NULL;
+ AcpiDmWalkParseTree (Origin, AcpiDmFindOrphanDescending, NULL, &Info);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmFinishNamespaceLoad
+ *
+ * PARAMETERS: ParseTreeRoot - Root of the parse tree
+ * NamespaceRoot - Root of the internal namespace
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Load all namespace items that are created within control
+ * methods. Used before namespace cross reference
+ *
+ ******************************************************************************/
+
+void
+AcpiDmFinishNamespaceLoad (
+ ACPI_PARSE_OBJECT *ParseTreeRoot,
+ ACPI_NAMESPACE_NODE *NamespaceRoot)
+{
+ ACPI_STATUS Status;
+ ACPI_OP_WALK_INFO Info;
+ ACPI_WALK_STATE *WalkState;
+
+
+ if (!ParseTreeRoot)
+ {
+ return;
+ }
+
+ /* Create and initialize a new walk state */
+
+ WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
+ if (!WalkState)
+ {
+ return;
+ }
+
+ Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ Info.Flags = 0;
+ Info.Level = 0;
+ Info.WalkState = WalkState;
+ AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmLoadDescendingOp,
+ AcpiDmCommonAscendingOp, &Info);
+ ACPI_FREE (WalkState);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmCrossReferenceNamespace
+ *
+ * PARAMETERS: ParseTreeRoot - Root of the parse tree
+ * NamespaceRoot - Root of the internal namespace
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Cross reference the namespace to create externals
+ *
+ ******************************************************************************/
+
+void
+AcpiDmCrossReferenceNamespace (
+ ACPI_PARSE_OBJECT *ParseTreeRoot,
+ ACPI_NAMESPACE_NODE *NamespaceRoot)
+{
+ ACPI_STATUS Status;
+ ACPI_OP_WALK_INFO Info;
+ ACPI_WALK_STATE *WalkState;
+
+
+ if (!ParseTreeRoot)
+ {
+ return;
+ }
+
+ /* Create and initialize a new walk state */
+
+ WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
+ if (!WalkState)
+ {
+ return;
+ }
+
+ Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ Info.Flags = 0;
+ Info.Level = 0;
+ Info.WalkState = WalkState;
+ AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmXrefDescendingOp,
+ AcpiDmCommonAscendingOp, &Info);
+ ACPI_FREE (WalkState);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmConvertResourceIndexes
+ *
+ * PARAMETERS: ParseTreeRoot - Root of the parse tree
+ * NamespaceRoot - Root of the internal namespace
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Convert fixed-offset references to resource descriptors to
+ * symbolic references. Should only be called after namespace has
+ * been cross referenced.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmConvertResourceIndexes (
+ ACPI_PARSE_OBJECT *ParseTreeRoot,
+ ACPI_NAMESPACE_NODE *NamespaceRoot)
+{
+ ACPI_STATUS Status;
+ ACPI_OP_WALK_INFO Info;
+ ACPI_WALK_STATE *WalkState;
+
+
+ if (!ParseTreeRoot)
+ {
+ return;
+ }
+
+ /* Create and initialize a new walk state */
+
+ WalkState = AcpiDsCreateWalkState (0, ParseTreeRoot, NULL, NULL);
+ if (!WalkState)
+ {
+ return;
+ }
+
+ Status = AcpiDsScopeStackPush (NamespaceRoot, NamespaceRoot->Type, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ Info.Flags = 0;
+ Info.Level = 0;
+ Info.WalkState = WalkState;
+ AcpiDmWalkParseTree (ParseTreeRoot, AcpiDmResourceDescendingOp,
+ AcpiDmCommonAscendingOp, &Info);
+ ACPI_FREE (WalkState);
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpDescending
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Format and print contents of one parse Op.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmDumpDescending (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_OP_WALK_INFO *Info = Context;
+ const ACPI_OPCODE_INFO *OpInfo;
+ char *Path;
+
+
+ if (!Op)
+ {
+ return (AE_OK);
+ }
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ Info->Count++;
+
+ /* Most of the information (count, level, name) here */
+
+ AcpiOsPrintf ("% 5d [%2.2d] ", Info->Count, Level);
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("%-28s", AcpiPsGetOpcodeName (Op->Common.AmlOpcode));
+
+ /* Extra info is helpful */
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_BYTE_OP:
+ case AML_WORD_OP:
+ case AML_DWORD_OP:
+ AcpiOsPrintf ("%X", (UINT32) Op->Common.Value.Integer);
+ break;
+
+ case AML_INT_NAMEPATH_OP:
+ if (Op->Common.Value.String)
+ {
+ AcpiNsExternalizeName (ACPI_UINT32_MAX, Op->Common.Value.String,
+ NULL, &Path);
+ AcpiOsPrintf ("%s %p", Path, Op->Common.Node);
+ ACPI_FREE (Path);
+ }
+ else
+ {
+ AcpiOsPrintf ("[NULL]");
+ }
+ break;
+
+ case AML_NAME_OP:
+ case AML_METHOD_OP:
+ case AML_DEVICE_OP:
+ case AML_INT_NAMEDFIELD_OP:
+ AcpiOsPrintf ("%4.4s", &Op->Named.Name);
+ break;
+ }
+
+ AcpiOsPrintf ("\n");
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmFindOrphanDescending
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Check namepath Ops for orphaned method invocations
+ *
+ * Note: Experimental.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmFindOrphanDescending (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ const ACPI_OPCODE_INFO *OpInfo;
+ ACPI_PARSE_OBJECT *ChildOp;
+ ACPI_PARSE_OBJECT *NextOp;
+ ACPI_PARSE_OBJECT *ParentOp;
+ UINT32 ArgCount;
+
+
+ if (!Op)
+ {
+ return (AE_OK);
+ }
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ switch (Op->Common.AmlOpcode)
+ {
+#ifdef ACPI_UNDER_DEVELOPMENT
+ case AML_ADD_OP:
+ ChildOp = Op->Common.Value.Arg;
+ if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
+ !ChildOp->Common.Node)
+ {
+ AcpiNsExternalizeName (ACPI_UINT32_MAX, ChildOp->Common.Value.String,
+ NULL, &Path);
+ AcpiOsPrintf ("/* %-16s A-NAMEPATH: %s */\n", Op->Common.AmlOpName, Path);
+ ACPI_FREE (Path);
+
+ NextOp = Op->Common.Next;
+ if (!NextOp)
+ {
+ /* This NamePath has no args, assume it is an integer */
+
+ AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
+ return (AE_OK);
+ }
+
+ ArgCount = AcpiDmInspectPossibleArgs (3, 1, NextOp);
+ AcpiOsPrintf ("/* A-CHILDREN: %d Actual %d */\n", ArgCount, AcpiDmCountChildren (Op));
+
+ if (ArgCount < 1)
+ {
+ /* One Arg means this is just a Store(Name,Target) */
+
+ AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
+ return (AE_OK);
+ }
+
+ AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount);
+ }
+ break;
+#endif
+
+ case AML_STORE_OP:
+
+ ChildOp = Op->Common.Value.Arg;
+ if ((ChildOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
+ !ChildOp->Common.Node)
+ {
+ NextOp = Op->Common.Next;
+ if (!NextOp)
+ {
+ /* This NamePath has no args, assume it is an integer */
+
+ AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
+ return (AE_OK);
+ }
+
+ ArgCount = AcpiDmInspectPossibleArgs (2, 1, NextOp);
+ if (ArgCount <= 1)
+ {
+ /* One Arg means this is just a Store(Name,Target) */
+
+ AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_INTEGER, 0);
+ return (AE_OK);
+ }
+
+ AcpiDmAddToExternalList (ChildOp->Common.Value.String, ACPI_TYPE_METHOD, ArgCount);
+ }
+ break;
+
+ case AML_INT_NAMEPATH_OP:
+
+ /* Must examine parent to see if this namepath is an argument */
+
+ ParentOp = Op->Common.Parent;
+ OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
+
+ if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
+ (OpInfo->Class != AML_CLASS_CREATE) &&
+ (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
+ !Op->Common.Node)
+ {
+ ArgCount = AcpiDmInspectPossibleArgs (0, 0, Op->Common.Next);
+
+ /*
+ * Check if namepath is a predicate for if/while or lone parameter to
+ * a return.
+ */
+ if (ArgCount == 0)
+ {
+ if (((ParentOp->Common.AmlOpcode == AML_IF_OP) ||
+ (ParentOp->Common.AmlOpcode == AML_WHILE_OP) ||
+ (ParentOp->Common.AmlOpcode == AML_RETURN_OP)) &&
+
+ /* And namepath is the first argument */
+ (ParentOp->Common.Value.Arg == Op))
+ {
+ AcpiDmAddToExternalList (Op->Common.Value.String, ACPI_TYPE_INTEGER, 0);
+ break;
+ }
+ }
+
+ /*
+ * This is a standalone namestring (not a parameter to another
+ * operator) - it *must* be a method invocation, nothing else is
+ * grammatically possible.
+ */
+ AcpiDmAddToExternalList (Op->Common.Value.String, ACPI_TYPE_METHOD, ArgCount);
+
+ }
+ break;
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmLoadDescendingOp
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending handler for namespace control method object load
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmLoadDescendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_OP_WALK_INFO *Info = Context;
+ const ACPI_OPCODE_INFO *OpInfo;
+ ACPI_WALK_STATE *WalkState;
+ ACPI_OBJECT_TYPE ObjectType;
+ ACPI_STATUS Status;
+ char *Path = NULL;
+ ACPI_PARSE_OBJECT *NextOp;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ WalkState = Info->WalkState;
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ ObjectType = OpInfo->ObjectType;
+ ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
+
+ /* Only interested in operators that create new names */
+
+ if (!(OpInfo->Flags & AML_NAMED) &&
+ !(OpInfo->Flags & AML_CREATE))
+ {
+ goto Exit;
+ }
+
+ /* Get the NamePath from the appropriate place */
+
+ if (OpInfo->Flags & AML_NAMED)
+ {
+ /* For all named operators, get the new name */
+
+ Path = (char *) Op->Named.Path;
+ }
+ else if (OpInfo->Flags & AML_CREATE)
+ {
+ /* New name is the last child */
+
+ NextOp = Op->Common.Value.Arg;
+
+ while (NextOp->Common.Next)
+ {
+ NextOp = NextOp->Common.Next;
+ }
+ Path = NextOp->Common.Value.String;
+ }
+
+ if (!Path)
+ {
+ goto Exit;
+ }
+
+ /* Insert the name into the namespace */
+
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
+ ACPI_IMODE_LOAD_PASS2, ACPI_NS_DONT_OPEN_SCOPE,
+ WalkState, &Node);
+
+ Op->Common.Node = Node;
+
+
+Exit:
+
+ if (AcpiNsOpensScope (ObjectType))
+ {
+ if (Op->Common.Node)
+ {
+ Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmXrefDescendingOp
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending handler for namespace cross reference
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmXrefDescendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_OP_WALK_INFO *Info = Context;
+ const ACPI_OPCODE_INFO *OpInfo;
+ ACPI_WALK_STATE *WalkState;
+ ACPI_OBJECT_TYPE ObjectType;
+ ACPI_STATUS Status;
+ char *Path = NULL;
+ ACPI_PARSE_OBJECT *NextOp;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ WalkState = Info->WalkState;
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ ObjectType = OpInfo->ObjectType;
+ ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
+
+ if ((!(OpInfo->Flags & AML_NAMED)) &&
+ (!(OpInfo->Flags & AML_CREATE)) &&
+ (Op->Common.AmlOpcode != AML_INT_NAMEPATH_OP))
+ {
+ goto Exit;
+ }
+
+ /* Get the NamePath from the appropriate place */
+
+ if (OpInfo->Flags & AML_NAMED)
+ {
+ if ((Op->Common.AmlOpcode == AML_ALIAS_OP) ||
+ (Op->Common.AmlOpcode == AML_SCOPE_OP))
+ {
+ /*
+ * Only these two operators refer to an existing name,
+ * first argument
+ */
+ Path = (char *) Op->Named.Path;
+ }
+ }
+ else if (OpInfo->Flags & AML_CREATE)
+ {
+ /* Referenced Buffer Name is the first child */
+
+ NextOp = Op->Common.Value.Arg;
+ if (NextOp->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
+ {
+ Path = NextOp->Common.Value.String;
+ }
+ }
+ else
+ {
+ Path = Op->Common.Value.String;
+ }
+
+ if (!Path)
+ {
+ goto Exit;
+ }
+
+ /*
+ * Lookup the name in the namespace. Name must exist at this point, or it
+ * is an invalid reference.
+ *
+ * The namespace is also used as a lookup table for references to resource
+ * descriptors and the fields within them.
+ */
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
+ ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
+ WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_NOT_FOUND)
+ {
+ AcpiDmAddToExternalList (Path, (UINT8) ObjectType, 0);
+
+ /*
+ * We could install this into the namespace, but we catch duplicate
+ * externals when they are added to the list.
+ */
+#if 0
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
+ ACPI_IMODE_LOAD_PASS1, ACPI_NS_DONT_OPEN_SCOPE,
+ WalkState, &Node);
+#endif
+ }
+ }
+ else
+ {
+ Op->Common.Node = Node;
+ }
+
+
+Exit:
+ /* Open new scope if necessary */
+
+ if (AcpiNsOpensScope (ObjectType))
+ {
+ if (Op->Common.Node)
+ {
+ Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmResourceDescendingOp
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Process one parse op during symbolic resource index conversion.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmResourceDescendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_OP_WALK_INFO *Info = Context;
+ const ACPI_OPCODE_INFO *OpInfo;
+ ACPI_WALK_STATE *WalkState;
+ ACPI_OBJECT_TYPE ObjectType;
+ ACPI_STATUS Status;
+
+
+ WalkState = Info->WalkState;
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ /* Open new scope if necessary */
+
+ ObjectType = OpInfo->ObjectType;
+ if (AcpiNsOpensScope (ObjectType))
+ {
+ if (Op->Common.Node)
+ {
+
+ Status = AcpiDsScopeStackPush (Op->Common.Node, ObjectType, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+ }
+
+ /*
+ * Check if this operator contains a reference to a resource descriptor.
+ * If so, convert the reference into a symbolic reference.
+ */
+ AcpiDmCheckResourceReference (Op, WalkState);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmCommonAscendingOp
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Ascending handler for combined parse/namespace walks. Closes
+ * scope if necessary.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmCommonAscendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_OP_WALK_INFO *Info = Context;
+ const ACPI_OPCODE_INFO *OpInfo;
+ ACPI_OBJECT_TYPE ObjectType;
+
+
+ /* Close scope if necessary */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ ObjectType = OpInfo->ObjectType;
+ ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
+
+ if (AcpiNsOpensScope (ObjectType))
+ {
+ (void) AcpiDsScopeStackPop (Info->WalkState);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmInspectPossibleArgs
+ *
+ * PARAMETERS: CurrentOpArgCount - Which arg of the current op was the
+ * possible method invocation found
+ * TargetCount - Number of targets (0,1,2) for this op
+ * Op - Parse op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Examine following args and next ops for possible arguments
+ * for an unrecognized method invocation.
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiDmInspectPossibleArgs (
+ UINT32 CurrentOpArgCount,
+ UINT32 TargetCount,
+ ACPI_PARSE_OBJECT *Op)
+{
+ const ACPI_OPCODE_INFO *OpInfo;
+ UINT32 i;
+ UINT32 Last = 0;
+ UINT32 Lookahead;
+
+
+ Lookahead = (ACPI_METHOD_NUM_ARGS + TargetCount) - CurrentOpArgCount;
+
+ /* Lookahead for the maximum number of possible arguments */
+
+ for (i = 0; i < Lookahead; i++)
+ {
+ if (!Op)
+ {
+ break;
+ }
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ /*
+ * Any one of these operators is "very probably" not a method arg
+ */
+ if ((Op->Common.AmlOpcode == AML_STORE_OP) ||
+ (Op->Common.AmlOpcode == AML_NOTIFY_OP))
+ {
+ break;
+ }
+
+ if ((OpInfo->Class != AML_CLASS_EXECUTE) &&
+ (OpInfo->Class != AML_CLASS_CONTROL))
+ {
+ Last = i+1;
+ }
+
+ Op = Op->Common.Next;
+ }
+
+ return (Last);
+}
+
+
diff --git a/sys/contrib/dev/acpica/common/dmrestag.c b/sys/contrib/dev/acpica/common/dmrestag.c
new file mode 100644
index 0000000..ed8b36b
--- /dev/null
+++ b/sys/contrib/dev/acpica/common/dmrestag.c
@@ -0,0 +1,990 @@
+/******************************************************************************
+ *
+ * Module Name: dmrestag - Add tags to resource descriptors (Application-level)
+ * $Revision: 1.11 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acdisasm.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+/* This module used for application-level code only */
+
+#define _COMPONENT ACPI_CA_DISASSEMBLER
+ ACPI_MODULE_NAME ("dmrestag")
+
+/* Local prototypes */
+
+static void
+AcpiDmUpdateResourceName (
+ ACPI_NAMESPACE_NODE *ResourceNode);
+
+static char *
+AcpiDmSearchTagList (
+ UINT32 BitIndex,
+ ACPI_RESOURCE_TAG *TagList);
+
+static char *
+AcpiDmGetResourceTag (
+ UINT32 BitIndex,
+ AML_RESOURCE *Resource,
+ UINT8 ResourceIndex);
+
+static char *
+AcpiGetTagPathname (
+ ACPI_NAMESPACE_NODE *BufferNode,
+ ACPI_NAMESPACE_NODE *ResourceNode,
+ UINT32 BitIndex);
+
+static ACPI_NAMESPACE_NODE *
+AcpiDmGetResourceNode (
+ ACPI_NAMESPACE_NODE *BufferNode,
+ UINT32 BitIndex);
+
+static ACPI_STATUS
+AcpiDmAddResourceToNamespace (
+ UINT8 *Aml,
+ UINT32 Length,
+ UINT32 Offset,
+ UINT8 ResourceIndex,
+ void *Context);
+
+static void
+AcpiDmAddResourcesToNamespace (
+ ACPI_NAMESPACE_NODE *BufferNode,
+ ACPI_PARSE_OBJECT *Op);
+
+
+/******************************************************************************
+ *
+ * Resource Tag tables
+ *
+ * These are the predefined tags that refer to elements of a resource
+ * descriptor. Each name and offset is defined in the ACPI specification.
+ *
+ * Each table entry contains the bit offset of the field and the associated
+ * name.
+ *
+ ******************************************************************************/
+
+static ACPI_RESOURCE_TAG AcpiDmIrqTags[] =
+{
+ {( 1 * 8), ACPI_RESTAG_INTERRUPT},
+ {( 3 * 8) + 0, ACPI_RESTAG_INTERRUPTTYPE},
+ {( 3 * 8) + 3, ACPI_RESTAG_INTERRUPTLEVEL},
+ {( 3 * 8) + 4, ACPI_RESTAG_INTERRUPTSHARE},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmDmaTags[] =
+{
+ {( 1 * 8), ACPI_RESTAG_DMA},
+ {( 2 * 8) + 0, ACPI_RESTAG_XFERTYPE},
+ {( 2 * 8) + 2, ACPI_RESTAG_BUSMASTER},
+ {( 2 * 8) + 5, ACPI_RESTAG_DMATYPE},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmIoTags[] =
+{
+ {( 1 * 8) + 0, ACPI_RESTAG_DECODE},
+ {( 2 * 8), ACPI_RESTAG_MINADDR},
+ {( 4 * 8), ACPI_RESTAG_MAXADDR},
+ {( 6 * 8), ACPI_RESTAG_ALIGNMENT},
+ {( 7 * 8), ACPI_RESTAG_LENGTH},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmFixedIoTags[] =
+{
+ {( 1 * 8), ACPI_RESTAG_BASEADDRESS},
+ {( 3 * 8), ACPI_RESTAG_LENGTH},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmMemory24Tags[] =
+{
+ {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE},
+ {( 4 * 8), ACPI_RESTAG_MINADDR},
+ {( 6 * 8), ACPI_RESTAG_MAXADDR},
+ {( 8 * 8), ACPI_RESTAG_ALIGNMENT},
+ {(10 * 8), ACPI_RESTAG_LENGTH},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmRegisterTags[] =
+{
+ {( 3 * 8), ACPI_RESTAG_ADDRESSSPACE},
+ {( 4 * 8), ACPI_RESTAG_REGISTERBITWIDTH},
+ {( 5 * 8), ACPI_RESTAG_REGISTERBITOFFSET},
+ {( 6 * 8), ACPI_RESTAG_ACCESSSIZE},
+ {( 7 * 8), ACPI_RESTAG_ADDRESS},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmMemory32Tags[] =
+{
+ {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE},
+ {( 4 * 8), ACPI_RESTAG_MINADDR},
+ {( 8 * 8), ACPI_RESTAG_MAXADDR},
+ {(12 * 8), ACPI_RESTAG_ALIGNMENT},
+ {(16 * 8), ACPI_RESTAG_LENGTH},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmFixedMemory32Tags[] =
+{
+ {( 3 * 8) + 0, ACPI_RESTAG_READWRITETYPE},
+ {( 4 * 8), ACPI_RESTAG_BASEADDRESS},
+ {( 8 * 8), ACPI_RESTAG_LENGTH},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmInterruptTags[] =
+{
+ {( 3 * 8) + 1, ACPI_RESTAG_INTERRUPTTYPE},
+ {( 3 * 8) + 2, ACPI_RESTAG_INTERRUPTLEVEL},
+ {( 3 * 8) + 3, ACPI_RESTAG_INTERRUPTSHARE},
+ {( 5 * 8), ACPI_RESTAG_INTERRUPT},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmAddress16Tags[] =
+{
+ {( 4 * 8) + 1, ACPI_RESTAG_DECODE},
+ {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE},
+ {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE},
+ {( 6 * 8), ACPI_RESTAG_GRANULARITY},
+ {( 8 * 8), ACPI_RESTAG_MINADDR},
+ {(10 * 8), ACPI_RESTAG_MAXADDR},
+ {(12 * 8), ACPI_RESTAG_TRANSLATION},
+ {(14 * 8), ACPI_RESTAG_LENGTH},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmAddress32Tags[] =
+{
+ {( 4 * 8) + 1, ACPI_RESTAG_DECODE},
+ {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE},
+ {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE},
+ {( 6 * 8), ACPI_RESTAG_GRANULARITY},
+ {(10 * 8), ACPI_RESTAG_MINADDR},
+ {(14 * 8), ACPI_RESTAG_MAXADDR},
+ {(18 * 8), ACPI_RESTAG_TRANSLATION},
+ {(22 * 8), ACPI_RESTAG_LENGTH},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmAddress64Tags[] =
+{
+ {( 4 * 8) + 1, ACPI_RESTAG_DECODE},
+ {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE},
+ {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE},
+ {( 6 * 8), ACPI_RESTAG_GRANULARITY},
+ {(14 * 8), ACPI_RESTAG_MINADDR},
+ {(22 * 8), ACPI_RESTAG_MAXADDR},
+ {(30 * 8), ACPI_RESTAG_TRANSLATION},
+ {(38 * 8), ACPI_RESTAG_LENGTH},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmExtendedAddressTags[] =
+{
+ {( 4 * 8) + 1, ACPI_RESTAG_DECODE},
+ {( 4 * 8) + 2, ACPI_RESTAG_MINTYPE},
+ {( 4 * 8) + 3, ACPI_RESTAG_MAXTYPE},
+ {( 8 * 8), ACPI_RESTAG_GRANULARITY},
+ {(16 * 8), ACPI_RESTAG_MINADDR},
+ {(24 * 8), ACPI_RESTAG_MAXADDR},
+ {(32 * 8), ACPI_RESTAG_TRANSLATION},
+ {(40 * 8), ACPI_RESTAG_LENGTH},
+ {(48 * 8), ACPI_RESTAG_TYPESPECIFICATTRIBUTES},
+ {0, NULL}
+};
+
+/* Special-case tables for the type-specific flags */
+
+static ACPI_RESOURCE_TAG AcpiDmMemoryFlagTags[] =
+{
+ {( 5 * 8) + 0, ACPI_RESTAG_READWRITETYPE},
+ {( 5 * 8) + 1, ACPI_RESTAG_MEMTYPE},
+ {( 5 * 8) + 3, ACPI_RESTAG_MEMATTRIBUTES},
+ {( 5 * 8) + 5, ACPI_RESTAG_TYPE},
+ {0, NULL}
+};
+
+static ACPI_RESOURCE_TAG AcpiDmIoFlagTags[] =
+{
+ {( 5 * 8) + 0, ACPI_RESTAG_RANGETYPE},
+ {( 5 * 8) + 4, ACPI_RESTAG_TYPE},
+ {( 5 * 8) + 5, ACPI_RESTAG_TRANSTYPE},
+ {0, NULL}
+};
+
+
+/* Dispatch table used to obtain the correct tag table for a descriptor */
+
+static ACPI_RESOURCE_TAG *AcpiGbl_ResourceTags [] =
+{
+ /* Small descriptors */
+
+ NULL, /* 0x00, Reserved */
+ NULL, /* 0x01, Reserved */
+ NULL, /* 0x02, Reserved */
+ NULL, /* 0x03, Reserved */
+ AcpiDmIrqTags, /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */
+ AcpiDmDmaTags, /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */
+ NULL, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */
+ NULL, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
+ AcpiDmIoTags, /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */
+ AcpiDmFixedIoTags, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */
+ NULL, /* 0x0A, Reserved */
+ NULL, /* 0x0B, Reserved */
+ NULL, /* 0x0C, Reserved */
+ NULL, /* 0x0D, Reserved */
+ NULL, /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */
+ NULL, /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */
+
+ /* Large descriptors */
+
+ NULL, /* 0x00, Reserved */
+ AcpiDmMemory24Tags, /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */
+ AcpiDmRegisterTags, /* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */
+ NULL, /* 0x03, Reserved */
+ NULL, /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */
+ AcpiDmMemory32Tags, /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */
+ AcpiDmFixedMemory32Tags, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */
+ AcpiDmAddress32Tags, /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */
+ AcpiDmAddress16Tags, /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */
+ AcpiDmInterruptTags, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */
+ AcpiDmAddress64Tags, /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
+ AcpiDmExtendedAddressTags /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
+};
+
+
+/*
+ * Globals used to generate unique resource descriptor names. We use names that
+ * start with underscore and a prefix letter that is not used by other ACPI
+ * reserved names. To this, we append hex 0x00 through 0xFF. These 5 prefixes
+ * allow for 5*256 = 1280 unique names, probably sufficient for any single ASL
+ * file. If this becomes too small, we can use alpha+numerals for a total
+ * of 5*36*36 = 6480.
+ */
+#define ACPI_NUM_RES_PREFIX 5
+
+static UINT32 AcpiGbl_NextResourceId = 0;
+static UINT8 AcpiGbl_NextPrefix = 0;
+static UINT8 AcpiGbl_Prefix[ACPI_NUM_RES_PREFIX] =
+ {'Y','Z','J','K','X'};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmCheckResourceReference
+ *
+ * PARAMETERS: Op - Parse Op for the AML opcode
+ * WalkState - Current walk state (with valid scope)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Convert a reference to a resource descriptor to a symbolic
+ * reference if possible
+ *
+ * NOTE: Bit index is used to transparently handle both resource bit
+ * fields and byte fields.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmCheckResourceReference (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *BufferNameOp;
+ ACPI_PARSE_OBJECT *IndexOp;
+ ACPI_NAMESPACE_NODE *BufferNode;
+ ACPI_NAMESPACE_NODE *ResourceNode;
+ const ACPI_OPCODE_INFO *OpInfo;
+ char *Pathname;
+ UINT32 BitIndex;
+
+
+ /* We are only interested in the CreateXxxxField opcodes */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ if (OpInfo->Type != AML_TYPE_CREATE_FIELD)
+ {
+ return;
+ }
+
+ /* Get the buffer term operand */
+
+ BufferNameOp = AcpiPsGetDepthNext (NULL, Op);
+
+ /* Must be a named buffer, not an arg or local or method call */
+
+ if (BufferNameOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP)
+ {
+ return;
+ }
+
+ /* Get the Index term, must be an integer constant to convert */
+
+ IndexOp = BufferNameOp->Common.Next;
+ OpInfo = AcpiPsGetOpcodeInfo (IndexOp->Common.AmlOpcode);
+ if (OpInfo->ObjectType != ACPI_TYPE_INTEGER)
+ {
+ return;
+ }
+
+ /* Get the bit offset of the descriptor within the buffer */
+
+ if ((Op->Common.AmlOpcode == AML_CREATE_BIT_FIELD_OP) ||
+ (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP))
+ {
+ /* Index operand is a bit offset */
+
+ BitIndex = (UINT32) IndexOp->Common.Value.Integer;
+ }
+ else
+ {
+ /* Index operand is a byte offset, convert to bits */
+
+ BitIndex = (UINT32) ACPI_MUL_8 (IndexOp->Common.Value.Integer);
+ }
+
+ /* Lookup the buffer in the namespace */
+
+ Status = AcpiNsLookup (WalkState->ScopeInfo,
+ BufferNameOp->Common.Value.String, ACPI_TYPE_BUFFER,
+ ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState,
+ &BufferNode);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ /* Validate object type, we must have a buffer */
+
+ if (BufferNode->Type != ACPI_TYPE_BUFFER)
+ {
+ return;
+ }
+
+ /* Find the resource descriptor node corresponding to the index */
+
+ ResourceNode = AcpiDmGetResourceNode (BufferNode, BitIndex);
+ if (!ResourceNode)
+ {
+ return;
+ }
+
+ /* Translate the Index to a resource tag pathname */
+
+ Pathname = AcpiGetTagPathname (BufferNode, ResourceNode, BitIndex);
+ if (Pathname)
+ {
+ /* Complete the conversion of the Index to a symbol */
+
+ IndexOp->Common.AmlOpcode = AML_INT_NAMEPATH_OP;
+ IndexOp->Common.Value.String = Pathname;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmGetResourceNode
+ *
+ * PARAMETERS: BufferNode - Node for the parent buffer
+ * BitIndex - Index into the resource descriptor
+ *
+ * RETURN: Namespace node for the resource descriptor. NULL if not found
+ *
+ * DESCRIPTION: Find a resource descriptor that corresponds to the bit index
+ *
+ ******************************************************************************/
+
+static ACPI_NAMESPACE_NODE *
+AcpiDmGetResourceNode (
+ ACPI_NAMESPACE_NODE *BufferNode,
+ UINT32 BitIndex)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ UINT32 ByteIndex = ACPI_DIV_8 (BitIndex);
+
+
+ /*
+ * Child list contains an entry for each resource descriptor. Find
+ * the descriptor that corresponds to the Index.
+ *
+ * If there are no children, this is not a resource template
+ */
+ Node = BufferNode->Child;
+ while (Node)
+ {
+ /*
+ * Check if the Index falls within this resource.
+ *
+ * Value contains the resource offset, Object contains the resource
+ * length (both in bytes)
+ */
+ if ((ByteIndex >= Node->Value) &&
+ (ByteIndex < (Node->Value + Node->Length)))
+ {
+ return (Node);
+ }
+
+ /* List is circular, this flag marks the end */
+
+ if (Node->Flags & ANOBJ_END_OF_PEER_LIST)
+ {
+ return (NULL);
+ }
+
+ Node = Node->Peer;
+ }
+
+ return (NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetTagPathname
+ *
+ * PARAMETERS: BufferNode - Node for the parent buffer
+ * ResourceNode - Node for a resource descriptor
+ * BitIndex - Index into the resource descriptor
+ *
+ * RETURN: Full pathname for a resource tag. NULL if no match.
+ * Path is returned in AML (packed) format.
+ *
+ * DESCRIPTION: Convert a BitIndex into a symbolic resource tag (full pathname)
+ *
+ ******************************************************************************/
+
+static char *
+AcpiGetTagPathname (
+ ACPI_NAMESPACE_NODE *BufferNode,
+ ACPI_NAMESPACE_NODE *ResourceNode,
+ UINT32 BitIndex)
+{
+ ACPI_STATUS Status;
+ UINT32 ResourceBitIndex;
+ UINT8 ResourceTableIndex;
+ ACPI_SIZE RequiredSize;
+ char *Pathname;
+ AML_RESOURCE *Aml;
+ ACPI_PARSE_OBJECT *Op;
+ char *InternalPath;
+ char *Tag;
+
+
+ /* Get the Op that contains the actual buffer data */
+
+ Op = BufferNode->Op->Common.Value.Arg;
+ Op = Op->Common.Next;
+ if (!Op)
+ {
+ return (NULL);
+ }
+
+ /* Get the individual resource descriptor and validate it */
+
+ Aml = ACPI_CAST_PTR (AML_RESOURCE,
+ &Op->Named.Data[ResourceNode->Value]);
+
+ Status = AcpiUtValidateResource (Aml, &ResourceTableIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ return (NULL);
+ }
+
+ /* Get offset into this descriptor (from offset into entire buffer) */
+
+ ResourceBitIndex = BitIndex - ACPI_MUL_8 (ResourceNode->Value);
+
+ /* Get the tag associated with this resource descriptor and offset */
+
+ Tag = AcpiDmGetResourceTag (ResourceBitIndex, Aml, ResourceTableIndex);
+ if (!Tag)
+ {
+ return (NULL);
+ }
+
+ /*
+ * Now that we know that we have a reference that can be converted to a
+ * symbol, change the name of the resource to a unique name.
+ */
+ AcpiDmUpdateResourceName (ResourceNode);
+
+ /* Get the full pathname to the parent buffer */
+
+ RequiredSize = AcpiNsGetPathnameLength (BufferNode);
+ Pathname = ACPI_ALLOCATE_ZEROED (RequiredSize + ACPI_PATH_SEGMENT_LENGTH);
+ if (!Pathname)
+ {
+ return (NULL);
+ }
+
+ AcpiNsBuildExternalPath (BufferNode, RequiredSize, Pathname);
+
+ /*
+ * Create the full path to the resource and tag by: remove the buffer name,
+ * append the resource descriptor name, append a dot, append the tag name.
+ *
+ * TBD: Always using the full path is a bit brute force, the path can be
+ * often be optimized with carats (if the original buffer namepath is a
+ * single nameseg). This doesn't really matter, because these paths do not
+ * end up in the final compiled AML, it's just an appearance issue for the
+ * disassembled code.
+ */
+ Pathname[ACPI_STRLEN (Pathname) - ACPI_NAME_SIZE] = 0;
+ ACPI_STRNCAT (Pathname, ResourceNode->Name.Ascii, ACPI_NAME_SIZE);
+ ACPI_STRCAT (Pathname, ".");
+ ACPI_STRNCAT (Pathname, Tag, ACPI_NAME_SIZE);
+
+ /* Internalize the namepath to AML format */
+
+ AcpiNsInternalizeName (Pathname, &InternalPath);
+ ACPI_FREE (Pathname);
+ return (InternalPath);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmUpdateResourceName
+ *
+ * PARAMETERS: ResourceNode - Node for a resource descriptor
+ *
+ * RETURN: Stores new name in the ResourceNode
+ *
+ * DESCRIPTION: Create a new, unique name for a resource descriptor. Used by
+ * both the disassembly of the descriptor itself and any symbolic
+ * references to the descriptor. Ignored if a unique name has
+ * already been assigned to the resource.
+ *
+ * NOTE: Single threaded, suitable for applications only!
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmUpdateResourceName (
+ ACPI_NAMESPACE_NODE *ResourceNode)
+{
+ char Name[ACPI_NAME_SIZE];
+
+
+ /* Ignore if a unique name has already been assigned */
+
+ if (ResourceNode->Name.Integer != ACPI_DEFAULT_RESNAME)
+ {
+ return;
+ }
+
+ /* Generate a new ACPI name for the descriptor */
+
+ Name[0] = '_';
+ Name[1] = AcpiGbl_Prefix[AcpiGbl_NextPrefix];
+ Name[2] = AcpiUtHexToAsciiChar (AcpiGbl_NextResourceId, 4);
+ Name[3] = AcpiUtHexToAsciiChar (AcpiGbl_NextResourceId, 0);
+
+ /* Update globals for next name */
+
+ AcpiGbl_NextResourceId++;
+ if (AcpiGbl_NextResourceId >= 256)
+ {
+ AcpiGbl_NextResourceId = 0;
+ AcpiGbl_NextPrefix++;
+ if (AcpiGbl_NextPrefix > ACPI_NUM_RES_PREFIX)
+ {
+ AcpiGbl_NextPrefix = 0;
+ }
+ }
+
+ /* Change the resource descriptor name */
+
+ ResourceNode->Name.Integer = *(UINT32 *) Name;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmGetResourceTag
+ *
+ * PARAMETERS: BitIndex - Index into the resource descriptor
+ * Resource - Pointer to the raw resource data
+ * ResourceIndex - Index correspoinding to the resource type
+ *
+ * RETURN: Pointer to the resource tag (ACPI_NAME). NULL if no match.
+ *
+ * DESCRIPTION: Convert a BitIndex into a symbolic resource tag.
+ *
+ ******************************************************************************/
+
+static char *
+AcpiDmGetResourceTag (
+ UINT32 BitIndex,
+ AML_RESOURCE *Resource,
+ UINT8 ResourceIndex)
+{
+ ACPI_RESOURCE_TAG *TagList;
+ char *Tag = NULL;
+
+
+ /* Get the tag list for this resource descriptor type */
+
+ TagList = AcpiGbl_ResourceTags[ResourceIndex];
+ if (!TagList)
+ {
+ /* There are no tags for this resource type */
+
+ return (NULL);
+ }
+
+ /*
+ * Handle the type-specific flags field for the address descriptors.
+ * Kindof brute force, but just blindly search for an index match.
+ */
+ switch (Resource->DescriptorType)
+ {
+ case ACPI_RESOURCE_NAME_ADDRESS16:
+ case ACPI_RESOURCE_NAME_ADDRESS32:
+ case ACPI_RESOURCE_NAME_ADDRESS64:
+ case ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64:
+
+ if (Resource->Address.ResourceType == ACPI_ADDRESS_TYPE_MEMORY_RANGE)
+ {
+ Tag = AcpiDmSearchTagList (BitIndex, AcpiDmMemoryFlagTags);
+ }
+ else if (Resource->Address.ResourceType == ACPI_ADDRESS_TYPE_IO_RANGE)
+ {
+ Tag = AcpiDmSearchTagList (BitIndex, AcpiDmIoFlagTags);
+ }
+
+ /* If we found a match, all done. Else, drop to normal search below */
+
+ if (Tag)
+ {
+ return (Tag);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ /* Search the tag list for this descriptor type */
+
+ Tag = AcpiDmSearchTagList (BitIndex, TagList);
+ return (Tag);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmSearchTagList
+ *
+ * PARAMETERS: BitIndex - Index into the resource descriptor
+ * TagList - List to search
+ *
+ * RETURN: Pointer to a tag (ACPI_NAME). NULL if no match found.
+ *
+ * DESCRIPTION: Search a tag list for a match to the input BitIndex. Matches
+ * a fixed offset to a symbolic resource tag name.
+ *
+ ******************************************************************************/
+
+static char *
+AcpiDmSearchTagList (
+ UINT32 BitIndex,
+ ACPI_RESOURCE_TAG *TagList)
+{
+
+ /*
+ * Walk the null-terminated tag list to find a matching bit offset.
+ * We are looking for an exact match.
+ */
+ for ( ; TagList->Tag; TagList++)
+ {
+ if (BitIndex == TagList->BitIndex)
+ {
+ return (TagList->Tag);
+ }
+ }
+
+ /* A matching offset was not found */
+
+ return (NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmFindResources
+ *
+ * PARAMETERS: Root - Root of the parse tree
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Add all ResourceTemplate declarations to the namespace. Each
+ * resource descriptor in each template is given a node -- used
+ * for later conversion of resource references to symbolic refs.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmFindResources (
+ ACPI_PARSE_OBJECT *Root)
+{
+ ACPI_PARSE_OBJECT *Op = Root;
+ ACPI_PARSE_OBJECT *Parent;
+
+
+ /* Walk the entire parse tree */
+
+ while (Op)
+ {
+ /* We are interested in Buffer() declarations */
+
+ if (Op->Common.AmlOpcode == AML_BUFFER_OP)
+ {
+ /* And only declarations of the form Name (XXXX, Buffer()... ) */
+
+ Parent = Op->Common.Parent;
+ if (Parent->Common.AmlOpcode == AML_NAME_OP)
+ {
+ /*
+ * If the buffer is a resource template, add the individual
+ * resource descriptors to the namespace, as children of the
+ * buffer node.
+ */
+ if (ACPI_SUCCESS (AcpiDmIsResourceTemplate (Op)))
+ {
+ Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
+ AcpiDmAddResourcesToNamespace (Parent->Common.Node, Op);
+ }
+ }
+ }
+
+ Op = AcpiPsGetDepthNext (Root, Op);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmAddResourcesToNamespace
+ *
+ * PARAMETERS: BufferNode - Node for the parent buffer
+ * Op - Parse op for the buffer
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Add an entire resource template to the namespace. Each
+ * resource descriptor is added as a namespace node.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmAddResourcesToNamespace (
+ ACPI_NAMESPACE_NODE *BufferNode,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *NextOp;
+
+
+ /* Get to the ByteData list */
+
+ NextOp = Op->Common.Value.Arg;
+ NextOp = NextOp->Common.Next;
+ if (!NextOp)
+ {
+ return;
+ }
+
+ /* Set Node and Op to point to each other */
+
+ BufferNode->Op = Op;
+ Op->Common.Node = BufferNode;
+
+ /*
+ * Insert each resource into the namespace
+ * NextOp contains the Aml pointer and the Aml length
+ */
+ AcpiUtWalkAmlResources ((UINT8 *) NextOp->Named.Data,
+ (ACPI_SIZE) NextOp->Common.Value.Integer,
+ AcpiDmAddResourceToNamespace, BufferNode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmAddResourceToNamespace
+ *
+ * PARAMETERS: ACPI_WALK_AML_CALLBACK
+ * BufferNode - Node for the parent buffer
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Add one resource descriptor to the namespace as a child of the
+ * parent buffer. The same name is used for each descriptor. This
+ * is changed later to a unique name if the resource is actually
+ * referenced by an AML operator.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmAddResourceToNamespace (
+ UINT8 *Aml,
+ UINT32 Length,
+ UINT32 Offset,
+ UINT8 ResourceIndex,
+ void *Context)
+{
+ ACPI_STATUS Status;
+ ACPI_GENERIC_STATE ScopeInfo;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ /* TBD: Don't need to add descriptors that have no tags defined? */
+
+ /* Add the resource to the namespace, as child of the buffer */
+
+ ScopeInfo.Scope.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Context);
+ Status = AcpiNsLookup (&ScopeInfo, "_TMP", ACPI_TYPE_LOCAL_RESOURCE,
+ ACPI_IMODE_LOAD_PASS2,
+ ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE | ACPI_NS_PREFIX_IS_SCOPE,
+ NULL, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return (AE_OK);
+ }
+
+ /* Set the name to the default, changed later if resource is referenced */
+
+ Node->Name.Integer = ACPI_DEFAULT_RESNAME;
+
+ /* Save the offset of the descriptor (within the original buffer) */
+
+ Node->Value = Offset;
+ Node->Length = Length;
+ return (AE_OK);
+}
+
diff --git a/sys/contrib/dev/acpica/common/dmtable.c b/sys/contrib/dev/acpica/common/dmtable.c
new file mode 100644
index 0000000..ce4b5f9
--- /dev/null
+++ b/sys/contrib/dev/acpica/common/dmtable.c
@@ -0,0 +1,734 @@
+/******************************************************************************
+ *
+ * Module Name: dmtable - Support for ACPI tables that contain no AML code
+ * $Revision: 1.12 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdisasm.h>
+#include <contrib/dev/acpica/actables.h>
+
+/* This module used for application-level code only */
+
+#define _COMPONENT ACPI_CA_DISASSEMBLER
+ ACPI_MODULE_NAME ("dmtable")
+
+/* Local Prototypes */
+
+static ACPI_DMTABLE_DATA *
+AcpiDmGetTableData (
+ char *Signature);
+
+static void
+AcpiDmCheckAscii (
+ UINT8 *Target,
+ UINT32 Count);
+
+
+/* These tables map a subtable type to a description string */
+
+static const char *AcpiDmDmarSubnames[] =
+{
+ "Hardware Unit Definition",
+ "Reserved Memory Region",
+ "Unknown SubTable Type" /* Reserved */
+};
+
+static const char *AcpiDmMadtSubnames[] =
+{
+ "Processor Local APIC", /* ACPI_MADT_TYPE_LOCAL_APIC */
+ "I/O APIC", /* ACPI_MADT_TYPE_IO_APIC */
+ "Interrupt Source Override", /* ACPI_MADT_TYPE_INTERRUPT_OVERRIDE */
+ "NMI Source", /* ACPI_MADT_TYPE_NMI_SOURCE */
+ "Local APIC NMI", /* ACPI_MADT_TYPE_LOCAL_APIC_NMI */
+ "Local APIC Address Override", /* ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE */
+ "I/O SAPIC", /* ACPI_MADT_TYPE_IO_SAPIC */
+ "Local SAPIC", /* ACPI_MADT_TYPE_LOCAL_SAPIC */
+ "Platform Interrupt Sources", /* ACPI_MADT_TYPE_INTERRUPT_SOURCE */
+ "Unknown SubTable Type" /* Reserved */
+};
+
+static const char *AcpiDmSratSubnames[] =
+{
+ "Processor Local APIC/SAPIC Affinity",
+ "Memory Affinity",
+ "Unknown SubTable Type" /* Reserved */
+};
+
+
+/*******************************************************************************
+ *
+ * ACPI Table Data, indexed by signature.
+ *
+ * Simple tables have only a TableInfo structure, complex tables have a handler.
+ * This table must be NULL terminated. RSDP and FACS are special-cased
+ * elsewhere.
+ *
+ ******************************************************************************/
+
+static ACPI_DMTABLE_DATA AcpiDmTableData[] =
+{
+ {ACPI_SIG_ASF, NULL, AcpiDmDumpAsf, "Alert Standard Format table"},
+ {ACPI_SIG_BOOT, AcpiDmTableInfoBoot, NULL, "Simple Boot Flag Table"},
+ {ACPI_SIG_CPEP, NULL, AcpiDmDumpCpep, "Corrected Platform Error Polling table"},
+ {ACPI_SIG_DBGP, AcpiDmTableInfoDbgp, NULL, "Debug Port table"},
+ {ACPI_SIG_DMAR, NULL, AcpiDmDumpDmar, "DMA Remapping table"},
+ {ACPI_SIG_ECDT, AcpiDmTableInfoEcdt, NULL, "Embedded Controller Boot Resources Table"},
+ {ACPI_SIG_FADT, NULL, AcpiDmDumpFadt, "Fixed ACPI Description Table"},
+ {ACPI_SIG_HPET, AcpiDmTableInfoHpet, NULL, "High Precision Event Timer table"},
+ {ACPI_SIG_MADT, NULL, AcpiDmDumpMadt, "Multiple APIC Description Table"},
+ {ACPI_SIG_MCFG, NULL, AcpiDmDumpMcfg, "Memory Mapped Configuration table"},
+ {ACPI_SIG_RSDT, NULL, AcpiDmDumpRsdt, "Root System Description Table"},
+ {ACPI_SIG_SBST, AcpiDmTableInfoSbst, NULL, "Smart Battery Specification Table"},
+ {ACPI_SIG_SLIT, NULL, AcpiDmDumpSlit, "System Locality Information Table"},
+ {ACPI_SIG_SPCR, AcpiDmTableInfoSpcr, NULL, "Serial Port Console Redirection table"},
+ {ACPI_SIG_SPMI, AcpiDmTableInfoSpmi, NULL, "Server Platform Management Interface table"},
+ {ACPI_SIG_SRAT, NULL, AcpiDmDumpSrat, "System Resource Affinity Table"},
+ {ACPI_SIG_TCPA, AcpiDmTableInfoTcpa, NULL, "Trusted Computing Platform Alliance table"},
+ {ACPI_SIG_WDRT, AcpiDmTableInfoWdrt, NULL, "Watchdog Resource Table"},
+ {ACPI_SIG_XSDT, NULL, AcpiDmDumpXsdt, "Extended System Description Table"},
+ {NULL, NULL, NULL, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbGenerateChecksum
+ *
+ * PARAMETERS: Table - Pointer to a valid ACPI table (with a
+ * standard ACPI header)
+ *
+ * RETURN: 8 bit checksum of buffer
+ *
+ * DESCRIPTION: Computes an 8 bit checksum of the table.
+ *
+ ******************************************************************************/
+
+UINT8
+AcpiTbGenerateChecksum (
+ ACPI_TABLE_HEADER *Table)
+{
+ UINT8 Checksum;
+
+
+ /* Sum the entire table as-is */
+
+ Checksum = AcpiTbChecksum ((UINT8 *) Table, Table->Length);
+
+ /* Subtract off the existing checksum value in the table */
+
+ Checksum = (UINT8) (Checksum - Table->Checksum);
+
+ /* Compute the final checksum */
+
+ Checksum = (UINT8) (0 - Checksum);
+ return (Checksum);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmGetTableData
+ *
+ * PARAMETERS: Signature - ACPI signature (4 chars) to match
+ *
+ * RETURN: Pointer to a valid ACPI_DMTABLE_DATA. Null if no match found.
+ *
+ * DESCRIPTION: Find a match in the global table of supported ACPI tables
+ *
+ ******************************************************************************/
+
+static ACPI_DMTABLE_DATA *
+AcpiDmGetTableData (
+ char *Signature)
+{
+ ACPI_DMTABLE_DATA *TableData;
+
+
+ for (TableData = AcpiDmTableData; TableData->Signature; TableData++)
+ {
+ if (ACPI_COMPARE_NAME (Signature, TableData->Signature))
+ {
+ return (TableData);
+ }
+ }
+
+ return (NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpDataTable
+ *
+ * PARAMETERS: Table - An ACPI table
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Format the contents of an ACPI data table (any table other
+ * than an SSDT or DSDT that does not contain executable AML code)
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpDataTable (
+ ACPI_TABLE_HEADER *Table)
+{
+ ACPI_DMTABLE_DATA *TableData;
+ UINT32 Length;
+
+
+ /* Ignore tables that contain AML */
+
+ if (AcpiUtIsAmlTable (Table))
+ {
+ return;
+ }
+
+ /*
+ * Handle tables that don't use the common ACPI table header structure.
+ * Currently, these are the FACS and RSDP.
+ */
+ if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_FACS))
+ {
+ Length = Table->Length;
+ AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoFacs);
+ }
+ else if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_RSDP))
+ {
+ Length = AcpiDmDumpRsdp (Table);
+ }
+ else
+ {
+ /*
+ * All other tables must use the common ACPI table header, dump it now
+ */
+ Length = Table->Length;
+ AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoHeader);
+ AcpiOsPrintf ("\n");
+
+ /* Match signature and dispatch appropriately */
+
+ TableData = AcpiDmGetTableData (Table->Signature);
+ if (!TableData)
+ {
+ if (!ACPI_STRNCMP (Table->Signature, "OEM", 3))
+ {
+ AcpiOsPrintf ("\n**** OEM-defined ACPI table [%4.4s], unknown contents\n\n",
+ Table->Signature);
+ }
+ else
+ {
+ AcpiOsPrintf ("\n**** Unknown ACPI table type [%4.4s]\n\n",
+ Table->Signature);
+ }
+ }
+ else if (TableData->TableHandler)
+ {
+ /* Complex table, has a handler */
+
+ TableData->TableHandler (Table);
+ }
+ else if (TableData->TableInfo)
+ {
+ /* Simple table, just walk the info table */
+
+ AcpiDmDumpTable (Length, 0, Table, 0, TableData->TableInfo);
+ }
+ }
+
+ /* Always dump the raw table data */
+
+ AcpiOsPrintf ("\nRaw Table Data\n\n");
+ AcpiUtDumpBuffer2 (ACPI_CAST_PTR (UINT8, Table), Length, DB_BYTE_DISPLAY);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmLineHeader
+ *
+ * PARAMETERS: Offset - Current byte offset, from table start
+ * ByteLength - Length of the field in bytes, 0 for flags
+ * Name - Name of this field
+ * Value - Optional value, displayed on left of ':'
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Utility routines for formatting output lines. Displays the
+ * current table offset in hex and decimal, the field length,
+ * and the field name.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmLineHeader (
+ UINT32 Offset,
+ UINT32 ByteLength,
+ char *Name)
+{
+
+ if (ByteLength)
+ {
+ AcpiOsPrintf ("[%3.3Xh %3.3d% 3d] %28s : ",
+ Offset, Offset, ByteLength, Name);
+ }
+ else
+ {
+ AcpiOsPrintf ("%42s : ",
+ Name);
+ }
+}
+
+void
+AcpiDmLineHeader2 (
+ UINT32 Offset,
+ UINT32 ByteLength,
+ char *Name,
+ UINT32 Value)
+{
+
+ if (ByteLength)
+ {
+ AcpiOsPrintf ("[%3.3Xh %3.3d% 3d] %24s % 3d : ",
+ Offset, Offset, ByteLength, Name, Value);
+ }
+ else
+ {
+ AcpiOsPrintf ("[%3.3Xh %3.3d ] %24s % 3d : ",
+ Offset, Offset, Name, Value);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpTable
+ *
+ * PARAMETERS: TableLength - Length of the entire ACPI table
+ * TableOffset - Starting offset within the table for this
+ * sub-descriptor (0 if main table)
+ * Table - The ACPI table
+ * SubtableLength - Lenghth of this sub-descriptor
+ * Info - Info table for this ACPI table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display ACPI table contents by walking the Info table.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpTable (
+ UINT32 TableLength,
+ UINT32 TableOffset,
+ void *Table,
+ UINT32 SubtableLength,
+ ACPI_DMTABLE_INFO *Info)
+{
+ UINT8 *Target;
+ UINT32 CurrentOffset;
+ UINT32 ByteLength;
+ UINT8 Temp8;
+ UINT16 Temp16;
+ ACPI_DMTABLE_DATA *TableData;
+
+
+ if (!Info)
+ {
+ AcpiOsPrintf ("Display not implemented\n");
+ return;
+ }
+
+ /* Walk entire Info table; Null name terminates */
+
+ for (; Info->Name; Info++)
+ {
+ /*
+ * Target points to the field within the ACPI Table. CurrentOffset is
+ * the offset of the field from the start of the main table.
+ */
+ Target = ACPI_ADD_PTR (UINT8, Table, Info->Offset);
+ CurrentOffset = TableOffset + Info->Offset;
+
+ /* Check for beyond EOT or beyond subtable end */
+
+ if ((CurrentOffset >= TableLength) ||
+ (SubtableLength && (Info->Offset >= SubtableLength)))
+ {
+ return;
+ }
+
+ /* Generate the byte length for this field */
+
+ switch (Info->Opcode)
+ {
+ case ACPI_DMT_UINT8:
+ case ACPI_DMT_CHKSUM:
+ case ACPI_DMT_SPACEID:
+ case ACPI_DMT_MADT:
+ case ACPI_DMT_SRAT:
+ ByteLength = 1;
+ break;
+ case ACPI_DMT_UINT16:
+ case ACPI_DMT_DMAR:
+ ByteLength = 2;
+ break;
+ case ACPI_DMT_UINT24:
+ ByteLength = 3;
+ break;
+ case ACPI_DMT_UINT32:
+ case ACPI_DMT_NAME4:
+ case ACPI_DMT_SIG:
+ ByteLength = 4;
+ break;
+ case ACPI_DMT_NAME6:
+ ByteLength = 6;
+ break;
+ case ACPI_DMT_UINT56:
+ ByteLength = 7;
+ break;
+ case ACPI_DMT_UINT64:
+ case ACPI_DMT_NAME8:
+ ByteLength = 8;
+ break;
+ case ACPI_DMT_STRING:
+ ByteLength = ACPI_STRLEN (ACPI_CAST_PTR (char, Target)) + 1;
+ break;
+ case ACPI_DMT_GAS:
+ AcpiOsPrintf ("\n");
+ ByteLength = sizeof (ACPI_GENERIC_ADDRESS);
+ break;
+ default:
+ ByteLength = 0;
+ break;
+ }
+
+ /* Start a new line and decode the opcode */
+
+ AcpiDmLineHeader (CurrentOffset, ByteLength, Info->Name);
+
+ switch (Info->Opcode)
+ {
+ /* Single-bit Flag fields. Note: Opcode is the bit position */
+
+ case ACPI_DMT_FLAG0:
+ case ACPI_DMT_FLAG1:
+ case ACPI_DMT_FLAG2:
+ case ACPI_DMT_FLAG3:
+ case ACPI_DMT_FLAG4:
+ case ACPI_DMT_FLAG5:
+ case ACPI_DMT_FLAG6:
+ case ACPI_DMT_FLAG7:
+
+ AcpiOsPrintf ("%1.1X\n", (*Target >> Info->Opcode) & 0x01);
+ break;
+
+ /* 2-bit Flag fields */
+
+ case ACPI_DMT_FLAGS0:
+
+ AcpiOsPrintf ("%1.1X\n", *Target & 0x03);
+ break;
+
+ case ACPI_DMT_FLAGS2:
+
+ AcpiOsPrintf ("%1.1X\n", (*Target >> 2) & 0x03);
+ break;
+
+ /* Standard Data Types */
+
+ case ACPI_DMT_UINT8:
+
+ AcpiOsPrintf ("%2.2X\n", *Target);
+ break;
+
+ case ACPI_DMT_UINT16:
+
+ AcpiOsPrintf ("%4.4X\n", ACPI_GET16 (Target));
+ break;
+
+ case ACPI_DMT_UINT24:
+
+ AcpiOsPrintf ("%2.2X%2.2X%2.2X\n",
+ *Target, *(Target + 1), *(Target + 2));
+ break;
+
+ case ACPI_DMT_UINT32:
+
+ AcpiOsPrintf ("%8.8X\n", ACPI_GET32 (Target));
+ break;
+
+ case ACPI_DMT_UINT56:
+
+ AcpiOsPrintf ("%6.6X%8.8X\n",
+ ACPI_HIDWORD (ACPI_GET64 (Target)) & 0x00FFFFFF,
+ ACPI_LODWORD (ACPI_GET64 (Target)));
+ break;
+
+ case ACPI_DMT_UINT64:
+
+ AcpiOsPrintf ("%8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
+ break;
+
+ case ACPI_DMT_STRING:
+
+ AcpiOsPrintf ("%s\n", ACPI_CAST_PTR (char, Target));
+ break;
+
+ /* Fixed length ASCII name fields */
+
+ case ACPI_DMT_SIG:
+
+ AcpiDmCheckAscii (Target, 4);
+ AcpiOsPrintf ("\"%4.4s\" ", Target);
+ TableData = AcpiDmGetTableData (ACPI_CAST_PTR (char, Target));
+ if (TableData)
+ {
+ AcpiOsPrintf ("/* %s */", TableData->Name);
+ }
+ AcpiOsPrintf ("\n");
+ break;
+
+ case ACPI_DMT_NAME4:
+
+ AcpiDmCheckAscii (Target, 4);
+ AcpiOsPrintf ("\"%4.4s\"\n", Target);
+ break;
+
+ case ACPI_DMT_NAME6:
+
+ AcpiDmCheckAscii (Target, 6);
+ AcpiOsPrintf ("\"%6.6s\"\n", Target);
+ break;
+
+ case ACPI_DMT_NAME8:
+
+ AcpiDmCheckAscii (Target, 8);
+ AcpiOsPrintf ("\"%8.8s\"\n", Target);
+ break;
+
+ /* Special Data Types */
+
+ case ACPI_DMT_CHKSUM:
+
+ /* Checksum, display and validate */
+
+ AcpiOsPrintf ("%2.2X", *Target);
+ Temp8 = AcpiTbGenerateChecksum (Table);
+ if (Temp8 != ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Checksum)
+ {
+ AcpiOsPrintf (
+ " /* Incorrect checksum, should be %2.2X */", Temp8);
+ }
+ AcpiOsPrintf ("\n");
+ break;
+
+ case ACPI_DMT_SPACEID:
+
+ /* Address Space ID */
+
+ AcpiOsPrintf ("%2.2X (%s)\n", *Target, AcpiUtGetRegionName (*Target));
+ break;
+
+ case ACPI_DMT_GAS:
+
+ /* Generic Address Structure */
+
+ AcpiOsPrintf ("<Generic Address Structure>\n");
+ AcpiDmDumpTable (ACPI_CAST_PTR (ACPI_TABLE_HEADER, Table)->Length,
+ CurrentOffset, Target, 0, AcpiDmTableInfoGas);
+ break;
+
+ case ACPI_DMT_DMAR:
+
+ /* DMAR subtable types */
+
+ Temp16 = *Target;
+ if (Temp16 > ACPI_DMAR_TYPE_RESERVED)
+ {
+ Temp16 = ACPI_DMAR_TYPE_RESERVED;
+ }
+
+ AcpiOsPrintf ("%4.4X <%s>\n", *Target, AcpiDmDmarSubnames[Temp16]);
+ break;
+
+ case ACPI_DMT_MADT:
+
+ /* MADT subtable types */
+
+ Temp8 = *Target;
+ if (Temp8 > ACPI_MADT_TYPE_RESERVED)
+ {
+ Temp8 = ACPI_MADT_TYPE_RESERVED;
+ }
+
+ AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmMadtSubnames[Temp8]);
+ break;
+
+ case ACPI_DMT_SRAT:
+
+ /* SRAT subtable types */
+
+ Temp8 = *Target;
+ if (Temp8 > ACPI_SRAT_TYPE_RESERVED)
+ {
+ Temp8 = ACPI_SRAT_TYPE_RESERVED;
+ }
+
+ AcpiOsPrintf ("%2.2X <%s>\n", *Target, AcpiDmSratSubnames[Temp8]);
+ break;
+
+ case ACPI_DMT_EXIT:
+ return;
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "**** Invalid table opcode [%X] ****\n", Info->Opcode));
+ return;
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmCheckAscii
+ *
+ * PARAMETERS: Name - Ascii string
+ * Count - Number of characters to check
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Ensure that the requested number of characters are printable
+ * Ascii characters. Sets non-printable and null chars to <space>.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmCheckAscii (
+ UINT8 *Name,
+ UINT32 Count)
+{
+ UINT32 i;
+
+
+ for (i = 0; i < Count; i++)
+ {
+ if (!Name[i] || !isprint (Name[i]))
+ {
+ Name[i] = ' ';
+ }
+ }
+}
diff --git a/sys/contrib/dev/acpica/common/dmtbdump.c b/sys/contrib/dev/acpica/common/dmtbdump.c
new file mode 100644
index 0000000..03ca323
--- /dev/null
+++ b/sys/contrib/dev/acpica/common/dmtbdump.c
@@ -0,0 +1,798 @@
+/******************************************************************************
+ *
+ * Module Name: dmtbdump - Dump ACPI data tables that contain no AML code
+ * $Revision: 1.15 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdisasm.h>
+#include <contrib/dev/acpica/actables.h>
+
+/* This module used for application-level code only */
+
+#define _COMPONENT ACPI_CA_DISASSEMBLER
+ ACPI_MODULE_NAME ("dmtbdump")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpRsdp
+ *
+ * PARAMETERS: Table - A RSDP
+ *
+ * RETURN: Length of the table (there is no length field, use revision)
+ *
+ * DESCRIPTION: Format the contents of a RSDP
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiDmDumpRsdp (
+ ACPI_TABLE_HEADER *Table)
+{
+ UINT32 Length = ACPI_RSDP_REV0_SIZE;
+
+
+ /* Dump the common ACPI 1.0 portion */
+
+ AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp1);
+
+ /* ACPI 2.0+ contains more data and has a Length field */
+
+ if (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table)->Revision > 0)
+ {
+ Length = ACPI_CAST_PTR (ACPI_TABLE_RSDP, Table)->Length;
+ AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoRsdp2);
+ }
+
+ return (Length);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpRsdt
+ *
+ * PARAMETERS: Table - A RSDT
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a RSDT
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpRsdt (
+ ACPI_TABLE_HEADER *Table)
+{
+ UINT32 *Array;
+ UINT32 Entries;
+ UINT32 Offset;
+ UINT32 i;
+
+
+ /* Point to start of table pointer array */
+
+ Array = ACPI_CAST_PTR (ACPI_TABLE_RSDT, Table)->TableOffsetEntry;
+ Offset = sizeof (ACPI_TABLE_HEADER);
+
+ /* RSDT uses 32-bit pointers */
+
+ Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT32);
+
+ for (i = 0; i < Entries; i++)
+ {
+ AcpiDmLineHeader2 (Offset, sizeof (UINT32), "ACPI Table Address", i);
+ AcpiOsPrintf ("%8.8X\n", Array[i]);
+ Offset += sizeof (UINT32);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpXsdt
+ *
+ * PARAMETERS: Table - A XSDT
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a XSDT
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpXsdt (
+ ACPI_TABLE_HEADER *Table)
+{
+ UINT64 *Array;
+ UINT32 Entries;
+ UINT32 Offset;
+ UINT32 i;
+
+
+ /* Point to start of table pointer array */
+
+ Array = ACPI_CAST_PTR (ACPI_TABLE_XSDT, Table)->TableOffsetEntry;
+ Offset = sizeof (ACPI_TABLE_HEADER);
+
+ /* XSDT uses 64-bit pointers */
+
+ Entries = (Table->Length - sizeof (ACPI_TABLE_HEADER)) / sizeof (UINT64);
+
+ for (i = 0; i < Entries; i++)
+ {
+ AcpiDmLineHeader2 (Offset, sizeof (UINT64), "ACPI Table Address", i);
+ AcpiOsPrintf ("%8.8X%8.8X\n", ACPI_FORMAT_UINT64 (Array[i]));
+ Offset += sizeof (UINT64);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpFadt
+ *
+ * PARAMETERS: Table - A FADT
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a FADT
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpFadt (
+ ACPI_TABLE_HEADER *Table)
+{
+
+ /* Common ACPI 1.0 portion of FADT */
+
+ AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt1);
+
+ /* Check for ACPI 2.0+ extended data (cannot depend on Revision field) */
+
+ if (Table->Length >= sizeof (ACPI_TABLE_FADT))
+ {
+ AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoFadt2);
+ }
+
+ /* Validate various fields in the FADT, including length */
+
+ AcpiTbCreateLocalFadt (Table, Table->Length);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpAsf
+ *
+ * PARAMETERS: Table - A ASF table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a ASF table
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpAsf (
+ ACPI_TABLE_HEADER *Table)
+{
+ UINT32 Offset = sizeof (ACPI_TABLE_HEADER);
+ ACPI_ASF_INFO *SubTable;
+ ACPI_DMTABLE_INFO *InfoTable;
+ ACPI_DMTABLE_INFO *DataInfoTable = NULL;
+ UINT8 *DataTable = NULL;
+ ACPI_NATIVE_UINT DataCount = 0;
+ ACPI_NATIVE_UINT DataLength = 0;
+ ACPI_NATIVE_UINT DataOffset = 0;
+ ACPI_NATIVE_UINT i;
+
+
+ /* No main table, only sub-tables */
+
+ SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, Table, Offset);
+ while (Offset < Table->Length)
+ {
+ /* Common sub-table header */
+
+ AcpiDmDumpTable (Table->Length, Offset, SubTable, 0, AcpiDmTableInfoAsfHdr);
+
+ switch (SubTable->Header.Type & 0x7F) /* Mask off top bit */
+ {
+ case ACPI_ASF_TYPE_INFO:
+ InfoTable = AcpiDmTableInfoAsf0;
+ break;
+
+ case ACPI_ASF_TYPE_ALERT:
+ InfoTable = AcpiDmTableInfoAsf1;
+ DataInfoTable = AcpiDmTableInfoAsf1a;
+ DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ALERT));
+ DataCount = ((ACPI_ASF_ALERT *) SubTable)->Alerts;
+ DataLength = ((ACPI_ASF_ALERT *) SubTable)->DataLength;
+ DataOffset = Offset + sizeof (ACPI_ASF_ALERT);
+ break;
+
+ case ACPI_ASF_TYPE_CONTROL:
+ InfoTable = AcpiDmTableInfoAsf2;
+ DataInfoTable = AcpiDmTableInfoAsf2a;
+ DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_REMOTE));
+ DataCount = ((ACPI_ASF_REMOTE *) SubTable)->Controls;
+ DataLength = ((ACPI_ASF_REMOTE *) SubTable)->DataLength;
+ DataOffset = Offset + sizeof (ACPI_ASF_REMOTE);
+ break;
+
+ case ACPI_ASF_TYPE_BOOT:
+ InfoTable = AcpiDmTableInfoAsf3;
+ break;
+
+ case ACPI_ASF_TYPE_ADDRESS:
+ InfoTable = AcpiDmTableInfoAsf4;
+ DataTable = ACPI_ADD_PTR (UINT8, SubTable, sizeof (ACPI_ASF_ADDRESS));
+ DataLength = ((ACPI_ASF_ADDRESS *) SubTable)->Devices;
+ DataOffset = Offset + sizeof (ACPI_ASF_ADDRESS);
+ break;
+
+ default:
+ AcpiOsPrintf ("\n**** Unknown ASF sub-table type %X\n", SubTable->Header.Type);
+ return;
+ }
+
+ AcpiDmDumpTable (Table->Length, Offset, SubTable, SubTable->Header.Length, InfoTable);
+
+
+ /* Dump variable-length extra data */
+
+ switch (SubTable->Header.Type & 0x7F) /* Mask off top bit */
+ {
+ case ACPI_ASF_TYPE_ALERT:
+ case ACPI_ASF_TYPE_CONTROL:
+
+ for (i = 0; i < DataCount; i++)
+ {
+ AcpiOsPrintf ("\n");
+ AcpiDmDumpTable (Table->Length, DataOffset, DataTable, DataLength, DataInfoTable);
+
+ DataTable = ACPI_ADD_PTR (UINT8, DataTable, DataLength);
+ DataOffset += DataLength;
+ }
+ break;
+
+ case ACPI_ASF_TYPE_ADDRESS:
+
+ for (i = 0; i < DataLength; i++)
+ {
+ if (!(i % 16))
+ {
+ AcpiDmLineHeader (DataOffset, 1, "Addresses");
+ }
+
+ AcpiOsPrintf ("%2.2X ", *DataTable);
+ DataTable++;
+ DataOffset++;
+ }
+
+ AcpiOsPrintf ("\n");
+ break;
+ }
+
+ AcpiOsPrintf ("\n");
+
+ /* Point to next sub-table */
+
+ Offset += SubTable->Header.Length;
+ SubTable = ACPI_ADD_PTR (ACPI_ASF_INFO, SubTable, SubTable->Header.Length);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpCpep
+ *
+ * PARAMETERS: Table - A CPEP table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a CPEP. This table type consists
+ * of an open-ended number of subtables.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpCpep (
+ ACPI_TABLE_HEADER *Table)
+{
+ ACPI_CPEP_POLLING *SubTable;
+ UINT32 Length = Table->Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_CPEP);
+
+
+ /* Main table */
+
+ AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoCpep);
+
+ /* Sub-tables */
+
+ SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, Table, Offset);
+ while (Offset < Table->Length)
+ {
+ AcpiOsPrintf ("\n");
+ AcpiDmDumpTable (Length, Offset, SubTable, SubTable->Length, AcpiDmTableInfoCpep0);
+
+ /* Point to next sub-table */
+
+ Offset += SubTable->Length;
+ SubTable = ACPI_ADD_PTR (ACPI_CPEP_POLLING, SubTable, SubTable->Length);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpDmar
+ *
+ * PARAMETERS: Table - A DMAR table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a DMAR. This table type consists
+ * of an open-ended number of subtables.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpDmar (
+ ACPI_TABLE_HEADER *Table)
+{
+ ACPI_DMAR_HEADER *SubTable;
+ UINT32 Length = Table->Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_DMAR);
+ ACPI_DMTABLE_INFO *InfoTable;
+ ACPI_DMAR_DEVICE_SCOPE *ScopeTable;
+ UINT32 ScopeOffset;
+ UINT8 *PciPath;
+ UINT32 PathOffset;
+
+
+ /* Main table */
+
+ AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoDmar);
+
+ /* Sub-tables */
+
+ SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, Table, Offset);
+ while (Offset < Table->Length)
+ {
+ /* Common sub-table header */
+
+ AcpiOsPrintf ("\n");
+ AcpiDmDumpTable (Length, Offset, SubTable, 0, AcpiDmTableInfoDmarHdr);
+
+ switch (SubTable->Type)
+ {
+ case ACPI_DMAR_TYPE_HARDWARE_UNIT:
+ InfoTable = AcpiDmTableInfoDmar0;
+ ScopeOffset = sizeof (ACPI_DMAR_HARDWARE_UNIT);
+ break;
+ case ACPI_DMAR_TYPE_RESERVED_MEMORY:
+ InfoTable = AcpiDmTableInfoDmar1;
+ ScopeOffset = sizeof (ACPI_DMAR_RESERVED_MEMORY);
+ break;
+ default:
+ AcpiOsPrintf ("\n**** Unknown DMAR sub-table type %X\n\n", SubTable->Type);
+ return;
+ }
+
+ AcpiDmDumpTable (Length, Offset, SubTable, SubTable->Length, InfoTable);
+
+ /*
+ * Currently, a common flag indicates whether there are any
+ * device scope entries present at the end of the subtable.
+ */
+ if ((SubTable->Flags & ACPI_DMAR_INCLUDE_ALL) == 0)
+ {
+ /* Dump the device scope entries */
+
+ ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE, SubTable, ScopeOffset);
+ while (ScopeOffset < SubTable->Length)
+ {
+ AcpiOsPrintf ("\n");
+ AcpiDmDumpTable (Length, Offset + ScopeOffset, ScopeTable,
+ ScopeTable->Length, AcpiDmTableInfoDmarScope);
+
+ /* Dump the PCI Path entries for this device scope */
+
+ PathOffset = sizeof (ACPI_DMAR_DEVICE_SCOPE); /* Path entries start at this offset */
+
+ PciPath = ACPI_ADD_PTR (UINT8, ScopeTable,
+ sizeof (ACPI_DMAR_DEVICE_SCOPE));
+
+ while (PathOffset < ScopeTable->Length)
+ {
+ AcpiDmLineHeader ((PathOffset + ScopeOffset + Offset), 2, "PCI Path");
+ AcpiOsPrintf ("[%2.2X, %2.2X]\n", PciPath[0], PciPath[1]);
+
+ /* Point to next PCI Path entry */
+
+ PathOffset += 2;
+ PciPath += 2;
+ }
+
+ /* Point to next device scope entry */
+
+ ScopeOffset += ScopeTable->Length;
+ ScopeTable = ACPI_ADD_PTR (ACPI_DMAR_DEVICE_SCOPE,
+ ScopeTable, ScopeTable->Length);
+ }
+ }
+
+ /* Point to next sub-table */
+
+ Offset += SubTable->Length;
+ SubTable = ACPI_ADD_PTR (ACPI_DMAR_HEADER, SubTable, SubTable->Length);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpMadt
+ *
+ * PARAMETERS: Table - A MADT table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a MADT. This table type consists
+ * of an open-ended number of subtables.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpMadt (
+ ACPI_TABLE_HEADER *Table)
+{
+ ACPI_SUBTABLE_HEADER *SubTable;
+ UINT32 Length = Table->Length;
+ UINT32 Offset = sizeof (ACPI_TABLE_MADT);
+ ACPI_DMTABLE_INFO *InfoTable;
+
+
+ /* Main table */
+
+ AcpiDmDumpTable (Length, 0, Table, 0, AcpiDmTableInfoMadt);
+
+ /* Sub-tables */
+
+ SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
+ while (Offset < Table->Length)
+ {
+ /* Common sub-table header */
+
+ AcpiOsPrintf ("\n");
+ AcpiDmDumpTable (Length, Offset, SubTable, 0, AcpiDmTableInfoMadtHdr);
+
+ switch (SubTable->Type)
+ {
+ case ACPI_MADT_TYPE_LOCAL_APIC:
+ InfoTable = AcpiDmTableInfoMadt0;
+ break;
+ case ACPI_MADT_TYPE_IO_APIC:
+ InfoTable = AcpiDmTableInfoMadt1;
+ break;
+ case ACPI_MADT_TYPE_INTERRUPT_OVERRIDE:
+ InfoTable = AcpiDmTableInfoMadt2;
+ break;
+ case ACPI_MADT_TYPE_NMI_SOURCE:
+ InfoTable = AcpiDmTableInfoMadt3;
+ break;
+ case ACPI_MADT_TYPE_LOCAL_APIC_NMI:
+ InfoTable = AcpiDmTableInfoMadt4;
+ break;
+ case ACPI_MADT_TYPE_LOCAL_APIC_OVERRIDE:
+ InfoTable = AcpiDmTableInfoMadt5;
+ break;
+ case ACPI_MADT_TYPE_IO_SAPIC:
+ InfoTable = AcpiDmTableInfoMadt6;
+ break;
+ case ACPI_MADT_TYPE_LOCAL_SAPIC:
+ InfoTable = AcpiDmTableInfoMadt7;
+ break;
+ case ACPI_MADT_TYPE_INTERRUPT_SOURCE:
+ InfoTable = AcpiDmTableInfoMadt8;
+ break;
+ default:
+ AcpiOsPrintf ("\n**** Unknown MADT sub-table type %X\n\n", SubTable->Type);
+ return;
+ }
+
+ AcpiDmDumpTable (Length, Offset, SubTable, SubTable->Length, InfoTable);
+
+ /* Point to next sub-table */
+
+ Offset += SubTable->Length;
+ SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpMcfg
+ *
+ * PARAMETERS: Table - A MCFG Table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a MCFG table
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpMcfg (
+ ACPI_TABLE_HEADER *Table)
+{
+ UINT32 Offset = sizeof (ACPI_TABLE_MCFG);
+ ACPI_MCFG_ALLOCATION *SubTable;
+
+
+ /* Main table */
+
+ AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoMcfg);
+
+ /* Sub-tables */
+
+ SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, Table, Offset);
+ while (Offset < Table->Length)
+ {
+ if (Offset + sizeof (ACPI_MCFG_ALLOCATION) > Table->Length)
+ {
+ AcpiOsPrintf ("Warning: there are %d invalid trailing bytes\n",
+ sizeof (ACPI_MCFG_ALLOCATION) - (Offset - Table->Length));
+ return;
+ }
+
+ AcpiOsPrintf ("\n");
+ AcpiDmDumpTable (Table->Length, Offset, SubTable, 0, AcpiDmTableInfoMcfg0);
+
+ /* Point to next sub-table (each subtable is of fixed length) */
+
+ Offset += sizeof (ACPI_MCFG_ALLOCATION);
+ SubTable = ACPI_ADD_PTR (ACPI_MCFG_ALLOCATION, SubTable,
+ sizeof (ACPI_MCFG_ALLOCATION));
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpSlit
+ *
+ * PARAMETERS: Table - An SLIT
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a SLIT
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpSlit (
+ ACPI_TABLE_HEADER *Table)
+{
+ UINT32 Offset;
+ UINT8 *Row;
+ UINT32 Localities;
+ UINT32 i;
+ UINT32 j;
+
+
+ /* Main table */
+
+ AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSlit);
+
+ /* Display the Locality NxN Matrix */
+
+ Localities = (UINT32) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->LocalityCount;
+ Offset = ACPI_OFFSET (ACPI_TABLE_SLIT, Entry[0]);
+ Row = (UINT8 *) ACPI_CAST_PTR (ACPI_TABLE_SLIT, Table)->Entry;
+
+ for (i = 0; i < Localities; i++)
+ {
+ /* Display one row of the matrix */
+
+ AcpiDmLineHeader2 (Offset, Localities, "Locality", i);
+ for (j = 0; j < Localities; j++)
+ {
+ /* Check for beyond EOT */
+
+ if (Offset >= Table->Length)
+ {
+ AcpiOsPrintf ("\n**** Not enough room in table for all localities\n");
+ return;
+ }
+
+ AcpiOsPrintf ("%2.2X ", Row[j]);
+ Offset++;
+
+ /* Display up to 16 bytes per output row */
+
+ if (j && (((j+1) % 16) == 0) && ((j+1) < Localities))
+ {
+ AcpiOsPrintf ("\n");
+ AcpiDmLineHeader (Offset, 0, "");
+ }
+ }
+
+ /* Point to next row */
+
+ AcpiOsPrintf ("\n");
+ Row += Localities;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpSrat
+ *
+ * PARAMETERS: Table - A SRAT table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Format the contents of a SRAT
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpSrat (
+ ACPI_TABLE_HEADER *Table)
+{
+ UINT32 Offset = sizeof (ACPI_TABLE_SRAT);
+ ACPI_SUBTABLE_HEADER *SubTable;
+ ACPI_DMTABLE_INFO *InfoTable;
+
+
+ /* Main table */
+
+ AcpiDmDumpTable (Table->Length, 0, Table, 0, AcpiDmTableInfoSrat);
+
+ /* Sub-tables */
+
+ SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, Table, Offset);
+ while (Offset < Table->Length)
+ {
+ switch (SubTable->Type)
+ {
+ case ACPI_SRAT_TYPE_CPU_AFFINITY:
+ InfoTable = AcpiDmTableInfoSrat0;
+ break;
+ case ACPI_SRAT_TYPE_MEMORY_AFFINITY:
+ InfoTable = AcpiDmTableInfoSrat1;
+ break;
+ default:
+ AcpiOsPrintf ("\n**** Unknown SRAT sub-table type %X\n", SubTable->Type);
+ return;
+ }
+
+ AcpiOsPrintf ("\n");
+ AcpiDmDumpTable (Table->Length, Offset, SubTable, SubTable->Length, InfoTable);
+
+ /* Point to next sub-table */
+
+ Offset += SubTable->Length;
+ SubTable = ACPI_ADD_PTR (ACPI_SUBTABLE_HEADER, SubTable, SubTable->Length);
+ }
+}
+
diff --git a/sys/contrib/dev/acpica/common/dmtbinfo.c b/sys/contrib/dev/acpica/common/dmtbinfo.c
new file mode 100644
index 0000000..5454005
--- /dev/null
+++ b/sys/contrib/dev/acpica/common/dmtbinfo.c
@@ -0,0 +1,967 @@
+/******************************************************************************
+ *
+ * Module Name: dmtbinfo - Table info for non-AML tables
+ * $Revision: 1.13 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+/* This module used for application-level code only */
+
+#define _COMPONENT ACPI_CA_DISASSEMBLER
+ ACPI_MODULE_NAME ("dmtbinfo")
+
+/*
+ * Macros used to generate offsets to specific table fields
+ */
+#define ACPI_FACS_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_FACS,f)
+#define ACPI_GAS_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_GENERIC_ADDRESS,f)
+#define ACPI_HDR_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_HEADER,f)
+#define ACPI_RSDP_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_RSDP,f)
+#define ACPI_BOOT_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_BOOT,f)
+#define ACPI_CPEP_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_CPEP,f)
+#define ACPI_DBGP_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_DBGP,f)
+#define ACPI_DMAR_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_DMAR,f)
+#define ACPI_ECDT_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_ECDT,f)
+#define ACPI_HPET_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_HPET,f)
+#define ACPI_MADT_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_MADT,f)
+#define ACPI_MCFG_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_MCFG,f)
+#define ACPI_SBST_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_SBST,f)
+#define ACPI_SLIT_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_SLIT,f)
+#define ACPI_SPCR_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_SPCR,f)
+#define ACPI_SPMI_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_SPMI,f)
+#define ACPI_SRAT_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_SRAT,f)
+#define ACPI_TCPA_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_TCPA,f)
+#define ACPI_WDRT_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_TABLE_WDRT,f)
+
+/* Sub-tables */
+
+#define ACPI_ASF0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_ASF_INFO,f)
+#define ACPI_ASF1_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_ASF_ALERT,f)
+#define ACPI_ASF1a_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_ASF_ALERT_DATA,f)
+#define ACPI_ASF2_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_ASF_REMOTE,f)
+#define ACPI_ASF2a_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_ASF_CONTROL_DATA,f)
+#define ACPI_ASF3_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_ASF_RMCP,f)
+#define ACPI_ASF4_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_ASF_ADDRESS,f)
+#define ACPI_CPEP0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_CPEP_POLLING,f)
+#define ACPI_DMARS_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_DMAR_DEVICE_SCOPE,f)
+#define ACPI_DMAR0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_DMAR_HARDWARE_UNIT,f)
+#define ACPI_DMAR1_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_DMAR_RESERVED_MEMORY,f)
+#define ACPI_MADT0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MADT_LOCAL_APIC,f)
+#define ACPI_MADT1_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MADT_IO_APIC,f)
+#define ACPI_MADT2_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MADT_INTERRUPT_OVERRIDE,f)
+#define ACPI_MADT3_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MADT_NMI_SOURCE,f)
+#define ACPI_MADT4_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MADT_LOCAL_APIC_NMI,f)
+#define ACPI_MADT5_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MADT_LOCAL_APIC_OVERRIDE,f)
+#define ACPI_MADT6_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MADT_IO_SAPIC,f)
+#define ACPI_MADT7_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MADT_LOCAL_SAPIC,f)
+#define ACPI_MADT8_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MADT_INTERRUPT_SOURCE,f)
+#define ACPI_MADTH_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_SUBTABLE_HEADER,f)
+#define ACPI_MCFG0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_MCFG_ALLOCATION,f)
+#define ACPI_SRAT0_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_SRAT_CPU_AFFINITY,f)
+#define ACPI_SRAT1_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_SRAT_MEM_AFFINITY,f)
+
+/*
+ * Simplify access to flag fields by breaking them up into bytes
+ */
+#define ACPI_FLAG_OFFSET(d,f,o) (UINT8) (ACPI_OFFSET (d,f) + o)
+
+/* Flags */
+
+#define ACPI_FADT_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_TABLE_FADT,f,o)
+#define ACPI_FACS_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_TABLE_FACS,f,o)
+#define ACPI_HPET_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_TABLE_HPET,f,o)
+#define ACPI_SRAT0_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_SRAT_CPU_AFFINITY,f,o)
+#define ACPI_SRAT1_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_SRAT_MEM_AFFINITY,f,o)
+#define ACPI_MADT_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_TABLE_MADT,f,o)
+#define ACPI_MADT0_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_MADT_LOCAL_APIC,f,o)
+#define ACPI_MADT2_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_MADT_INTERRUPT_OVERRIDE,f,o)
+#define ACPI_MADT3_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_MADT_NMI_SOURCE,f,o)
+#define ACPI_MADT4_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_MADT_LOCAL_APIC_NMI,f,o)
+#define ACPI_MADT7_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_MADT_LOCAL_SAPIC,f,o)
+#define ACPI_MADT8_FLAG_OFFSET(f,o) ACPI_FLAG_OFFSET (ACPI_MADT_INTERRUPT_SOURCE,f,o)
+
+
+/*
+ * ACPI Table Information, used to dump formatted ACPI tables
+ *
+ * Each entry is of the form: <Field Type, Field Offset, Field Name>
+ */
+
+/*******************************************************************************
+ *
+ * Common ACPI table header
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoHeader[] =
+{
+ {ACPI_DMT_SIG, ACPI_HDR_OFFSET (Signature[0]), "Signature"},
+ {ACPI_DMT_UINT32, ACPI_HDR_OFFSET (Length), "Table Length"},
+ {ACPI_DMT_UINT8, ACPI_HDR_OFFSET (Revision), "Revision"},
+ {ACPI_DMT_CHKSUM, ACPI_HDR_OFFSET (Checksum), "Checksum"},
+ {ACPI_DMT_NAME6, ACPI_HDR_OFFSET (OemId[0]), "Oem ID"},
+ {ACPI_DMT_NAME8, ACPI_HDR_OFFSET (OemTableId[0]), "Oem Table ID"},
+ {ACPI_DMT_UINT32, ACPI_HDR_OFFSET (OemRevision), "Oem Revision"},
+ {ACPI_DMT_NAME4, ACPI_HDR_OFFSET (AslCompilerId[0]), "Asl Compiler ID"},
+ {ACPI_DMT_UINT32, ACPI_HDR_OFFSET (AslCompilerRevision), "Asl Compiler Revision"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * GAS - Generic Address Structure
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoGas[] =
+{
+ {ACPI_DMT_SPACEID, ACPI_GAS_OFFSET (SpaceId), "Space ID"},
+ {ACPI_DMT_UINT8, ACPI_GAS_OFFSET (BitWidth), "Bit Width"},
+ {ACPI_DMT_UINT8, ACPI_GAS_OFFSET (BitOffset), "Bit Offset"},
+ {ACPI_DMT_UINT8, ACPI_GAS_OFFSET (AccessWidth), "Access Width"},
+ {ACPI_DMT_UINT64, ACPI_GAS_OFFSET (Address), "Address"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * RSDP - Root System Description Pointer (Signature is "RSD PTR ")
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoRsdp1[] =
+{
+ {ACPI_DMT_NAME8, ACPI_RSDP_OFFSET (Signature[0]), "Signature"},
+ {ACPI_DMT_UINT8, ACPI_RSDP_OFFSET (Checksum), "Checksum"},
+ {ACPI_DMT_NAME6, ACPI_RSDP_OFFSET (OemId[0]), "Oem ID"},
+ {ACPI_DMT_UINT8, ACPI_RSDP_OFFSET (Revision), "Revision"},
+ {ACPI_DMT_UINT32, ACPI_RSDP_OFFSET (RsdtPhysicalAddress), "RSDT Address"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* ACPI 2.0+ Extensions */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoRsdp2[] =
+{
+ {ACPI_DMT_UINT32, ACPI_RSDP_OFFSET (Length), "Length"},
+ {ACPI_DMT_UINT64, ACPI_RSDP_OFFSET (XsdtPhysicalAddress), "XSDT Address"},
+ {ACPI_DMT_UINT8, ACPI_RSDP_OFFSET (ExtendedChecksum), "Extended Checksum"},
+ {ACPI_DMT_UINT24, ACPI_RSDP_OFFSET (Reserved[0]), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * FACS - Firmware ACPI Control Structure
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoFacs[] =
+{
+ {ACPI_DMT_NAME4, ACPI_FACS_OFFSET (Signature[0]), "Signature"},
+ {ACPI_DMT_UINT32, ACPI_FACS_OFFSET (Length), "Length"},
+ {ACPI_DMT_UINT32, ACPI_FACS_OFFSET (HardwareSignature), "Hardware Signature"},
+ {ACPI_DMT_UINT32, ACPI_FACS_OFFSET (FirmwareWakingVector), "Firmware Waking Vector(32)"},
+ {ACPI_DMT_UINT32, ACPI_FACS_OFFSET (GlobalLock), "Global Lock"},
+ {ACPI_DMT_UINT32, ACPI_FACS_OFFSET (Flags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAG0, ACPI_FACS_FLAG_OFFSET (Flags,0), "S4BIOS Support Present"},
+ {ACPI_DMT_UINT64, ACPI_FACS_OFFSET (XFirmwareWakingVector), "Firmware Waking Vector(64)"},
+ {ACPI_DMT_UINT8, ACPI_FACS_OFFSET (Version), "Version"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * FADT - Fixed ACPI Description Table (Signature is FACP)
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoFadt1[] =
+{
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Facs), "FACS Address"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Dsdt), "DSDT Address"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Model), "Model"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (PreferredProfile), "PM Profile"},
+ {ACPI_DMT_UINT16, ACPI_FADT_OFFSET (SciInterrupt), "SCI Interrupt"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (SmiCommand), "SMI Command Port"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (AcpiEnable), "ACPI Enable Value"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (AcpiDisable), "ACPI Disable Value"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (S4BiosRequest), "S4BIOS Command"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (PstateControl), "P-State Control"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Pm1aEventBlock), "PM1A Event Block Address"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Pm1bEventBlock), "PM1B Event Block Address"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Pm1aControlBlock), "PM1A Control Block Address"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Pm1bControlBlock), "PM1B Control Block Address"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Pm2ControlBlock), "PM2 Control Block Address"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (PmTimerBlock), "PM Timer Block Address"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Gpe0Block), "GPE0 Block Address"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Gpe1Block), "GPE1 Block Address"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Pm1EventLength), "PM1 Event Block Length"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Pm1ControlLength), "PM1 Control Block Length"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Pm2ControlLength), "PM2 Control Block Length"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (PmTimerLength), "PM Timer Block Length"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Gpe0BlockLength), "GPE0 Block Length"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Gpe1BlockLength), "GPE1 Block Length"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Gpe1Base), "GPE1 Base Offset"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (CstControl), "_CST Support"},
+ {ACPI_DMT_UINT16, ACPI_FADT_OFFSET (C2Latency), "C2 Latency"},
+ {ACPI_DMT_UINT16, ACPI_FADT_OFFSET (C3Latency), "C3 Latency"},
+ {ACPI_DMT_UINT16, ACPI_FADT_OFFSET (FlushSize), "CPU Cache Size"},
+ {ACPI_DMT_UINT16, ACPI_FADT_OFFSET (FlushStride), "Cache Flush Stride"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (DutyOffset), "Duty Cycle Offset"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (DutyWidth), "Duty Cycle Width"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (DayAlarm), "RTC Day Alarm Index"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (MonthAlarm), "RTC Month Alarm Index"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Century), "RTC Century Index"},
+ {ACPI_DMT_UINT16, ACPI_FADT_OFFSET (BootFlags), "Boot Architecture Flags"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_UINT32, ACPI_FADT_OFFSET (Flags), "Flags (decoded below)"},
+
+ /* Flags byte 0 */
+
+ {ACPI_DMT_FLAG0, ACPI_FADT_FLAG_OFFSET (Flags,0), "WBINVD is operational"},
+ {ACPI_DMT_FLAG1, ACPI_FADT_FLAG_OFFSET (Flags,0), "WBINVD does not invalidate"},
+ {ACPI_DMT_FLAG2, ACPI_FADT_FLAG_OFFSET (Flags,0), "All CPUs support C1"},
+ {ACPI_DMT_FLAG3, ACPI_FADT_FLAG_OFFSET (Flags,0), "C2 works on MP system"},
+ {ACPI_DMT_FLAG4, ACPI_FADT_FLAG_OFFSET (Flags,0), "Power button is generic"},
+ {ACPI_DMT_FLAG5, ACPI_FADT_FLAG_OFFSET (Flags,0), "Sleep button is generic"},
+ {ACPI_DMT_FLAG6, ACPI_FADT_FLAG_OFFSET (Flags,0), "RTC wakeup not fixed"},
+ {ACPI_DMT_FLAG7, ACPI_FADT_FLAG_OFFSET (Flags,0), "RTC wakeup/S4 not possible"},
+
+ /* Flags byte 1 */
+
+ {ACPI_DMT_FLAG0, ACPI_FADT_FLAG_OFFSET (Flags,1), "32-bit PM Timer"},
+ {ACPI_DMT_FLAG1, ACPI_FADT_FLAG_OFFSET (Flags,1), "Docking Supported"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* ACPI 2.0+ Extensions */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoFadt2[] =
+{
+ {ACPI_DMT_FLAG2, ACPI_FADT_FLAG_OFFSET (Flags,1), "Reset Register Supported"},
+ {ACPI_DMT_FLAG3, ACPI_FADT_FLAG_OFFSET (Flags,1), "Sealed Case"},
+ {ACPI_DMT_FLAG4, ACPI_FADT_FLAG_OFFSET (Flags,1), "Headless - No Video"},
+ {ACPI_DMT_FLAG5, ACPI_FADT_FLAG_OFFSET (Flags,1), "Native instr after SLP_TYP"},
+ {ACPI_DMT_FLAG6, ACPI_FADT_FLAG_OFFSET (Flags,1), "PCIEXP_WAK Supported"},
+ {ACPI_DMT_FLAG7, ACPI_FADT_FLAG_OFFSET (Flags,1), "Use Platform Timer"},
+
+ /* Flags byte 2 */
+
+ {ACPI_DMT_FLAG0, ACPI_FADT_FLAG_OFFSET (Flags,2), "RTC_STS valid after S4"},
+ {ACPI_DMT_FLAG1, ACPI_FADT_FLAG_OFFSET (Flags,2), "Remote Power-on capable"},
+ {ACPI_DMT_FLAG2, ACPI_FADT_FLAG_OFFSET (Flags,2), "APIC Cluster Model"},
+ {ACPI_DMT_FLAG3, ACPI_FADT_FLAG_OFFSET (Flags,2), "APIC Physical Dest Mode"},
+
+ {ACPI_DMT_GAS, ACPI_FADT_OFFSET (ResetRegister), "Reset Register"},
+ {ACPI_DMT_UINT8, ACPI_FADT_OFFSET (ResetValue), "Value to cause reset"},
+ {ACPI_DMT_UINT24, ACPI_FADT_OFFSET (Reserved4[0]), "Reserved"},
+ {ACPI_DMT_UINT64, ACPI_FADT_OFFSET (XFacs), "FACS Address"},
+ {ACPI_DMT_UINT64, ACPI_FADT_OFFSET (XDsdt), "DSDT Address"},
+ {ACPI_DMT_GAS, ACPI_FADT_OFFSET (XPm1aEventBlock), "PM1A Event Block"},
+ {ACPI_DMT_GAS, ACPI_FADT_OFFSET (XPm1bEventBlock), "PM1B Event Block"},
+ {ACPI_DMT_GAS, ACPI_FADT_OFFSET (XPm1aControlBlock), "PM1A Control Block"},
+ {ACPI_DMT_GAS, ACPI_FADT_OFFSET (XPm1bControlBlock), "PM1B Control Block"},
+ {ACPI_DMT_GAS, ACPI_FADT_OFFSET (XPm2ControlBlock), "PM2 Control Block"},
+ {ACPI_DMT_GAS, ACPI_FADT_OFFSET (XPmTimerBlock), "PM Timer Block"},
+ {ACPI_DMT_GAS, ACPI_FADT_OFFSET (XGpe0Block), "GPE0 Block"},
+ {ACPI_DMT_GAS, ACPI_FADT_OFFSET (XGpe1Block), "GPE1 Block"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*
+ * Remaining tables are not consumed directly by the ACPICA subsystem
+ */
+
+/*******************************************************************************
+ *
+ * ASF - Alert Standard Format table (Signature "ASF!")
+ *
+ ******************************************************************************/
+
+/* Common sub-table header (one per sub-table) */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoAsfHdr[] =
+{
+ {ACPI_DMT_UINT8, ACPI_ASF0_OFFSET (Header.Type), "Sub-Table Type"},
+ {ACPI_DMT_UINT8, ACPI_ASF0_OFFSET (Header.Reserved), "Reserved"},
+ {ACPI_DMT_UINT16, ACPI_ASF0_OFFSET (Header.Length), "Length"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 0: ASF Information */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoAsf0[] =
+{
+ {ACPI_DMT_UINT8, ACPI_ASF0_OFFSET (MinResetValue), "Minimum Reset Value"},
+ {ACPI_DMT_UINT8, ACPI_ASF0_OFFSET (MinResetValue), "Minimum Polling Interval"},
+ {ACPI_DMT_UINT16, ACPI_ASF0_OFFSET (SystemId), "System ID"},
+ {ACPI_DMT_UINT32, ACPI_ASF0_OFFSET (SystemId), "Manufacturer ID"},
+ {ACPI_DMT_UINT8, ACPI_ASF0_OFFSET (Flags), "Flags"},
+ {ACPI_DMT_UINT24, ACPI_ASF0_OFFSET (Reserved2[0]), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 1: ASF Alerts */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1[] =
+{
+ {ACPI_DMT_UINT8, ACPI_ASF1_OFFSET (AssertMask), "AssertMask"},
+ {ACPI_DMT_UINT8, ACPI_ASF1_OFFSET (DeassertMask), "DeassertMask"},
+ {ACPI_DMT_UINT8, ACPI_ASF1_OFFSET (Alerts), "Alert Count"},
+ {ACPI_DMT_UINT8, ACPI_ASF1_OFFSET (DataLength), "Alert Data Length"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 1a: ASF Alert data */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoAsf1a[] =
+{
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (Address), "Address"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (Command), "Command"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (Mask), "Mask"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (Value), "Value"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (SensorType), "SensorType"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (Type), "Type"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (Offset), "Offset"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (SourceType), "SourceType"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (Severity), "Severity"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (SensorNumber), "SensorNumber"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (Entity), "Entity"},
+ {ACPI_DMT_UINT8, ACPI_ASF1a_OFFSET (Instance), "Instance"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 2: ASF Remote Control */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoAsf2[] =
+{
+ {ACPI_DMT_UINT8, ACPI_ASF2_OFFSET (Controls), "Control Count"},
+ {ACPI_DMT_UINT8, ACPI_ASF2_OFFSET (DataLength), "Control Data Length"},
+ {ACPI_DMT_UINT16, ACPI_ASF2_OFFSET (Reserved2), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 2a: ASF Control data */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoAsf2a[] =
+{
+ {ACPI_DMT_UINT8, ACPI_ASF2a_OFFSET (Function), "Function"},
+ {ACPI_DMT_UINT8, ACPI_ASF2a_OFFSET (Address), "Address"},
+ {ACPI_DMT_UINT8, ACPI_ASF2a_OFFSET (Command), "Command"},
+ {ACPI_DMT_UINT8, ACPI_ASF2a_OFFSET (Value), "Value"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 3: ASF RMCP Boot Options */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoAsf3[] =
+{
+ {ACPI_DMT_UINT56, ACPI_ASF3_OFFSET (Capabilities[0]), "Capabilites"},
+ {ACPI_DMT_UINT8, ACPI_ASF3_OFFSET (CompletionCode), "Completion Code"},
+ {ACPI_DMT_UINT32, ACPI_ASF3_OFFSET (EnterpriseId), "Enterprise ID"},
+ {ACPI_DMT_UINT8, ACPI_ASF3_OFFSET (Command), "Command"},
+ {ACPI_DMT_UINT16, ACPI_ASF3_OFFSET (Parameter), "Parameter"},
+ {ACPI_DMT_UINT16, ACPI_ASF3_OFFSET (BootOptions), "Boot Options"},
+ {ACPI_DMT_UINT16, ACPI_ASF3_OFFSET (OemParameters), "Oem Parameters"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 4: ASF Address */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoAsf4[] =
+{
+ {ACPI_DMT_UINT8, ACPI_ASF4_OFFSET (EpromAddress), "Eprom Address"},
+ {ACPI_DMT_UINT8, ACPI_ASF4_OFFSET (Devices), "Device Count"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * BOOT - Simple Boot Flag Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoBoot[] =
+{
+ {ACPI_DMT_UINT8, ACPI_BOOT_OFFSET (CmosIndex), "Boot Register Index"},
+ {ACPI_DMT_UINT24, ACPI_BOOT_OFFSET (Reserved[0]), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * CPEP - Corrected Platform Error Polling table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoCpep[] =
+{
+ {ACPI_DMT_UINT64, ACPI_CPEP_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoCpep0[] =
+{
+ {ACPI_DMT_UINT8, ACPI_CPEP0_OFFSET (Type), "Sub-Table Type"},
+ {ACPI_DMT_UINT8, ACPI_CPEP0_OFFSET (Length), "Length"},
+ {ACPI_DMT_UINT8, ACPI_CPEP0_OFFSET (Id), "Processor ID"},
+ {ACPI_DMT_UINT8, ACPI_CPEP0_OFFSET (Eid), "Processor EID"},
+ {ACPI_DMT_UINT32, ACPI_CPEP0_OFFSET (Interval), "Polling Interval"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * DBGP - Debug Port
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoDbgp[] =
+{
+ {ACPI_DMT_UINT8, ACPI_DBGP_OFFSET (Type), "Interface Type"},
+ {ACPI_DMT_UINT24, ACPI_DBGP_OFFSET (Reserved[0]), "Reserved"},
+ {ACPI_DMT_GAS, ACPI_DBGP_OFFSET (DebugPort), "Debug Port Register"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * DMAR - DMA Remapping table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoDmar[] =
+{
+ {ACPI_DMT_UINT8, ACPI_DMAR_OFFSET (Width), "Host Address Width"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* Common sub-table header (one per sub-table) */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoDmarHdr[] =
+{
+ {ACPI_DMT_DMAR, ACPI_DMAR0_OFFSET (Header.Type), "Sub-Table Type"},
+ {ACPI_DMT_UINT16, ACPI_DMAR0_OFFSET (Header.Length), "Length"},
+ {ACPI_DMT_UINT8, ACPI_DMAR0_OFFSET (Header.Flags), "Flags"},
+ {ACPI_DMT_UINT24, ACPI_DMAR0_OFFSET (Header.Reserved[0]), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* Common device scope entry */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoDmarScope[] =
+{
+ {ACPI_DMT_UINT8, ACPI_DMARS_OFFSET (EntryType), "Device Scope Entry Type"},
+ {ACPI_DMT_UINT8, ACPI_DMARS_OFFSET (Length), "Entry Length"},
+ {ACPI_DMT_UINT8, ACPI_DMARS_OFFSET (Segment), "PCI Segment Number"},
+ {ACPI_DMT_UINT8, ACPI_DMARS_OFFSET (Bus), "PCI Bus Number"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* DMAR sub-tables */
+
+/* 0: Hardware Unit Definition */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoDmar0[] =
+{
+ {ACPI_DMT_UINT64, ACPI_DMAR0_OFFSET (Address), "Register Base Address"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 1: Reserved Memory Defininition */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoDmar1[] =
+{
+ {ACPI_DMT_UINT64, ACPI_DMAR1_OFFSET (Address), "Base Address"},
+ {ACPI_DMT_UINT64, ACPI_DMAR1_OFFSET (EndAddress), "End Address (limit)"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * ECDT - Embedded Controller Boot Resources Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoEcdt[] =
+{
+ {ACPI_DMT_GAS, ACPI_ECDT_OFFSET (Control), "Command/Status Register"},
+ {ACPI_DMT_GAS, ACPI_ECDT_OFFSET (Data), "Data Register"},
+ {ACPI_DMT_UINT32, ACPI_ECDT_OFFSET (Uid), "UID"},
+ {ACPI_DMT_UINT8, ACPI_ECDT_OFFSET (Gpe), "GPE Number"},
+ {ACPI_DMT_STRING, ACPI_ECDT_OFFSET (Id[0]), "Namepath"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * HPET - High Precision Event Timer table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoHpet[] =
+{
+ {ACPI_DMT_UINT32, ACPI_HPET_OFFSET (Id), "Hardware Block ID"},
+ {ACPI_DMT_GAS, ACPI_HPET_OFFSET (Address), "Timer Block Register"},
+ {ACPI_DMT_UINT8, ACPI_HPET_OFFSET (Sequence), "Sequence Number"},
+ {ACPI_DMT_UINT16, ACPI_HPET_OFFSET (MinimumTick), "Minimum Clock Ticks"},
+ {ACPI_DMT_UINT8, ACPI_HPET_OFFSET (Flags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAG0, ACPI_HPET_FLAG_OFFSET (Flags,0), "Page Protect"},
+ {ACPI_DMT_FLAG1, ACPI_HPET_FLAG_OFFSET (Flags,0), "4K Page Protect"},
+ {ACPI_DMT_FLAG2, ACPI_HPET_FLAG_OFFSET (Flags,0), "64K Page Protect"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * MADT - Multiple APIC Description Table and subtables
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadt[] =
+{
+ {ACPI_DMT_UINT32, ACPI_MADT_OFFSET (Address), "Local Apic Address"},
+ {ACPI_DMT_UINT32, ACPI_MADT_OFFSET (Flags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAG0, ACPI_MADT_FLAG_OFFSET (Flags,0), "PC-AT Compatibility"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* Common sub-table header (one per sub-table) */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadtHdr[] =
+{
+ {ACPI_DMT_MADT, ACPI_MADTH_OFFSET (Type), "Sub-Table Type"},
+ {ACPI_DMT_UINT8, ACPI_MADTH_OFFSET (Length), "Length"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* MADT sub-tables */
+
+/* 0: processor APIC */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadt0[] =
+{
+ {ACPI_DMT_UINT8, ACPI_MADT0_OFFSET (ProcessorId), "Processor ID"},
+ {ACPI_DMT_UINT8, ACPI_MADT0_OFFSET (Id), "Local Apic ID"},
+ {ACPI_DMT_UINT32, ACPI_MADT0_OFFSET (LapicFlags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAG0, ACPI_MADT0_FLAG_OFFSET (LapicFlags,0), "Processor Enabled"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 1: IO APIC */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadt1[] =
+{
+ {ACPI_DMT_UINT8, ACPI_MADT1_OFFSET (Id), "I/O Apic ID"},
+ {ACPI_DMT_UINT8, ACPI_MADT1_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_UINT32, ACPI_MADT1_OFFSET (Address), "Address"},
+ {ACPI_DMT_UINT32, ACPI_MADT1_OFFSET (GlobalIrqBase), "Interrupt"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 2: Interrupt Override */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadt2[] =
+{
+ {ACPI_DMT_UINT8, ACPI_MADT2_OFFSET (Bus), "Bus"},
+ {ACPI_DMT_UINT8, ACPI_MADT2_OFFSET (SourceIrq), "Source"},
+ {ACPI_DMT_UINT32, ACPI_MADT2_OFFSET (GlobalIrq), "Interrupt"},
+ {ACPI_DMT_UINT16, ACPI_MADT2_OFFSET (IntiFlags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAGS0, ACPI_MADT2_FLAG_OFFSET (IntiFlags,0), "Polarity"},
+ {ACPI_DMT_FLAGS2, ACPI_MADT2_FLAG_OFFSET (IntiFlags,0), "Trigger Mode"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 3: NMI Sources */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadt3[] =
+{
+ {ACPI_DMT_UINT16, ACPI_MADT3_OFFSET (IntiFlags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAGS0, ACPI_MADT3_FLAG_OFFSET (IntiFlags,0), "Polarity"},
+ {ACPI_DMT_FLAGS2, ACPI_MADT3_FLAG_OFFSET (IntiFlags,0), "Trigger Mode"},
+ {ACPI_DMT_UINT32, ACPI_MADT3_OFFSET (GlobalIrq), "Interrupt"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 4: Local APIC NMI */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadt4[] =
+{
+ {ACPI_DMT_UINT8, ACPI_MADT4_OFFSET (ProcessorId), "Processor ID"},
+ {ACPI_DMT_UINT16, ACPI_MADT4_OFFSET (IntiFlags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAGS0, ACPI_MADT4_FLAG_OFFSET (IntiFlags,0), "Polarity"},
+ {ACPI_DMT_FLAGS2, ACPI_MADT4_FLAG_OFFSET (IntiFlags,0), "Trigger Mode"},
+ {ACPI_DMT_UINT8, ACPI_MADT4_OFFSET (Lint), "Interrupt Input LINT"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 5: Address Override */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadt5[] =
+{
+ {ACPI_DMT_UINT16, ACPI_MADT5_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_UINT64, ACPI_MADT5_OFFSET (Address), "APIC Address"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 6: I/O Sapic */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadt6[] =
+{
+ {ACPI_DMT_UINT8, ACPI_MADT6_OFFSET (Id), "I/O Sapic ID"},
+ {ACPI_DMT_UINT8, ACPI_MADT6_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_UINT32, ACPI_MADT6_OFFSET (GlobalIrqBase), "Interrupt Base"},
+ {ACPI_DMT_UINT64, ACPI_MADT6_OFFSET (Address), "Address"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 7: Local Sapic */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadt7[] =
+{
+ {ACPI_DMT_UINT8, ACPI_MADT7_OFFSET (ProcessorId), "Processor ID"},
+ {ACPI_DMT_UINT8, ACPI_MADT7_OFFSET (Id), "Local Sapic ID"},
+ {ACPI_DMT_UINT8, ACPI_MADT7_OFFSET (Eid), "Local Sapic EID"},
+ {ACPI_DMT_UINT24, ACPI_MADT7_OFFSET (Reserved[0]), "Reserved"},
+ {ACPI_DMT_UINT32, ACPI_MADT7_OFFSET (LapicFlags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAG0, ACPI_MADT7_FLAG_OFFSET (LapicFlags,0), "Processor Enabled"},
+ {ACPI_DMT_UINT32, ACPI_MADT7_OFFSET (Uid), "Processor UID"},
+ {ACPI_DMT_STRING, ACPI_MADT7_OFFSET (UidString[0]), "Processor UID String"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+/* 8: Platform Interrupt Source */
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMadt8[] =
+{
+ {ACPI_DMT_UINT16, ACPI_MADT8_OFFSET (IntiFlags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAGS0, ACPI_MADT8_FLAG_OFFSET (IntiFlags,0), "Polarity"},
+ {ACPI_DMT_FLAGS2, ACPI_MADT8_FLAG_OFFSET (IntiFlags,0), "Trigger Mode"},
+ {ACPI_DMT_UINT8, ACPI_MADT8_OFFSET (Type), "InterruptType"},
+ {ACPI_DMT_UINT8, ACPI_MADT8_OFFSET (Id), "Processor ID"},
+ {ACPI_DMT_UINT8, ACPI_MADT8_OFFSET (Eid), "Processor EID"},
+ {ACPI_DMT_UINT8, ACPI_MADT8_OFFSET (IoSapicVector), "I/O Sapic Vector"},
+ {ACPI_DMT_UINT32, ACPI_MADT8_OFFSET (GlobalIrq), "Interrupt"},
+ {ACPI_DMT_UINT32, ACPI_MADT8_OFFSET (Flags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAG0, ACPI_MADT8_OFFSET (Flags), "CPEI Override"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * MCFG - PCI Memory Mapped Configuration table and sub-table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMcfg[] =
+{
+ {ACPI_DMT_UINT64, ACPI_MCFG_OFFSET (Reserved[0]), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoMcfg0[] =
+{
+ {ACPI_DMT_UINT64, ACPI_MCFG0_OFFSET (Address), "Base Address"},
+ {ACPI_DMT_UINT16, ACPI_MCFG0_OFFSET (PciSegment), "Segment Group Number"},
+ {ACPI_DMT_UINT8, ACPI_MCFG0_OFFSET (StartBusNumber), "Start Bus Number"},
+ {ACPI_DMT_UINT8, ACPI_MCFG0_OFFSET (EndBusNumber), "End Bus Number"},
+ {ACPI_DMT_UINT32, ACPI_MCFG0_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * SBST - Smart Battery Specification Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoSbst[] =
+{
+ {ACPI_DMT_UINT32, ACPI_SBST_OFFSET (WarningLevel), "Warning Level"},
+ {ACPI_DMT_UINT32, ACPI_SBST_OFFSET (LowLevel), "Low Level"},
+ {ACPI_DMT_UINT32, ACPI_SBST_OFFSET (CriticalLevel), "Critical Level"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * SLIT - System Locality Information Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoSlit[] =
+{
+ {ACPI_DMT_UINT64, ACPI_SLIT_OFFSET (LocalityCount), "Localities"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * SPCR - Serial Port Console Redirection table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoSpcr[] =
+{
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (InterfaceType), "Interface Type"},
+ {ACPI_DMT_UINT24, ACPI_SPCR_OFFSET (Reserved[0]), "Reserved"},
+ {ACPI_DMT_GAS, ACPI_SPCR_OFFSET (SerialPort), "Serial Port Register"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (InterruptType), "Interrupt Type"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (PcInterrupt), "PCAT-compatible IRQ"},
+ {ACPI_DMT_UINT32, ACPI_SPCR_OFFSET (Interrupt), "Interrupt"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (BaudRate), "Baud Rate"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (Parity), "Parity"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (StopBits), "Stop Bits"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (FlowControl), "Flow Control"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (TerminalType), "Terminal Type"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (Reserved2), "Reserved"},
+ {ACPI_DMT_UINT16, ACPI_SPCR_OFFSET (PciDeviceId), "PCI Device ID"},
+ {ACPI_DMT_UINT16, ACPI_SPCR_OFFSET (PciVendorId), "PCI Vendor ID"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (PciBus), "PCI Bus"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (PciDevice), "PCI Device"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (PciFunction), "PCI Function"},
+ {ACPI_DMT_UINT32, ACPI_SPCR_OFFSET (PciFlags), "PCI Flags"},
+ {ACPI_DMT_UINT8, ACPI_SPCR_OFFSET (PciSegment), "PCI Segment"},
+ {ACPI_DMT_UINT32, ACPI_SPCR_OFFSET (Reserved2), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * SPMI - Server Platform Management Interface table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoSpmi[] =
+{
+ {ACPI_DMT_UINT8, ACPI_SPMI_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_UINT8, ACPI_SPMI_OFFSET (InterfaceType), "Interface Type"},
+ {ACPI_DMT_UINT16, ACPI_SPMI_OFFSET (SpecRevision), "IPMI Spec Version"},
+ {ACPI_DMT_UINT8, ACPI_SPMI_OFFSET (InterruptType), "Interrupt Type"},
+ {ACPI_DMT_UINT8, ACPI_SPMI_OFFSET (GpeNumber), "GPE Number"},
+ {ACPI_DMT_UINT8, ACPI_SPMI_OFFSET (Reserved1), "Reserved"},
+ {ACPI_DMT_UINT8, ACPI_SPMI_OFFSET (PciDeviceFlag), "PCI Device Flag"},
+ {ACPI_DMT_UINT32, ACPI_SPMI_OFFSET (Interrupt), "Interrupt"},
+ {ACPI_DMT_GAS, ACPI_SPMI_OFFSET (IpmiRegister), "IPMI Register"},
+ {ACPI_DMT_UINT8, ACPI_SPMI_OFFSET (PciSegment), "PCI Segment"},
+ {ACPI_DMT_UINT8, ACPI_SPMI_OFFSET (PciBus), "PCI Bus"},
+ {ACPI_DMT_UINT8, ACPI_SPMI_OFFSET (PciDevice), "PCI Device"},
+ {ACPI_DMT_UINT8, ACPI_SPMI_OFFSET (PciFunction), "PCI Function"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * SRAT - System Resource Affinity Table and sub-tables
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoSrat[] =
+{
+ {ACPI_DMT_UINT32, ACPI_SRAT_OFFSET (TableRevision), "Table Revision"},
+ {ACPI_DMT_UINT64, ACPI_SRAT_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoSrat0[] =
+{
+ {ACPI_DMT_SRAT, ACPI_SRAT0_OFFSET (Header.Type), "Sub-Table Type"},
+ {ACPI_DMT_UINT8, ACPI_SRAT0_OFFSET (Header.Length), "Length"},
+ {ACPI_DMT_UINT8, ACPI_SRAT0_OFFSET (ProximityDomainLo), "Proximity Domain Low(8)"},
+ {ACPI_DMT_UINT8, ACPI_SRAT0_OFFSET (ApicId), "Apic ID"},
+ {ACPI_DMT_UINT32, ACPI_SRAT0_OFFSET (Flags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAG0, ACPI_SRAT0_FLAG_OFFSET (Flags,0), "Enabled"},
+ {ACPI_DMT_UINT8, ACPI_SRAT0_OFFSET (LocalSapicEid), "Local Sapic EID"},
+ {ACPI_DMT_UINT24, ACPI_SRAT0_OFFSET (ProximityDomainHi[0]), "Proximity Domain High(24)"},
+ {ACPI_DMT_UINT32, ACPI_SRAT0_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoSrat1[] =
+{
+ {ACPI_DMT_SRAT, ACPI_SRAT1_OFFSET (Header.Type), "Sub-Table Type"},
+ {ACPI_DMT_UINT8, ACPI_SRAT1_OFFSET (Header.Length), "Length"},
+ {ACPI_DMT_UINT32, ACPI_SRAT1_OFFSET (ProximityDomain), "Proximity Domain"},
+ {ACPI_DMT_UINT16, ACPI_SRAT1_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_UINT64, ACPI_SRAT1_OFFSET (BaseAddress), "Base Address"},
+ {ACPI_DMT_UINT64, ACPI_SRAT1_OFFSET (Length), "Address Length"},
+ {ACPI_DMT_UINT32, ACPI_SRAT1_OFFSET (MemoryType), "Memory Type"},
+ {ACPI_DMT_UINT32, ACPI_SRAT1_OFFSET (Flags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAG0, ACPI_SRAT1_FLAG_OFFSET (Flags,0), "Enabled"},
+ {ACPI_DMT_FLAG1, ACPI_SRAT1_FLAG_OFFSET (Flags,0), "Hot Pluggable"},
+ {ACPI_DMT_FLAG2, ACPI_SRAT1_FLAG_OFFSET (Flags,0), "Non-Volatile"},
+ {ACPI_DMT_UINT64, ACPI_SRAT1_OFFSET (Reserved1), "Reserved"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * TCPA - Trusted Computing Platform Alliance table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoTcpa[] =
+{
+ {ACPI_DMT_UINT16, ACPI_TCPA_OFFSET (Reserved), "Reserved"},
+ {ACPI_DMT_UINT32, ACPI_TCPA_OFFSET (MaxLogLength), "Max Event Log Length"},
+ {ACPI_DMT_UINT64, ACPI_TCPA_OFFSET (LogAddress), "Event Log Address"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * WDRT - Watchdog Resource Table
+ *
+ ******************************************************************************/
+
+ACPI_DMTABLE_INFO AcpiDmTableInfoWdrt[] =
+{
+ {ACPI_DMT_UINT32, ACPI_WDRT_OFFSET (HeaderLength), "Header Length"},
+ {ACPI_DMT_UINT8, ACPI_WDRT_OFFSET (PciSegment), "PCI Segment"},
+ {ACPI_DMT_UINT8, ACPI_WDRT_OFFSET (PciBus), "PCI Bus"},
+ {ACPI_DMT_UINT8, ACPI_WDRT_OFFSET (PciDevice), "PCI Device"},
+ {ACPI_DMT_UINT8, ACPI_WDRT_OFFSET (PciFunction), "PCI Function"},
+ {ACPI_DMT_UINT32, ACPI_WDRT_OFFSET (TimerPeriod), "Timer Period"},
+ {ACPI_DMT_UINT32, ACPI_WDRT_OFFSET (MaxCount), "Max Count"},
+ {ACPI_DMT_UINT32, ACPI_WDRT_OFFSET (MinCount), "Min Count"},
+ {ACPI_DMT_UINT8, ACPI_WDRT_OFFSET (Flags), "Flags (decoded below)"},
+ {ACPI_DMT_FLAG0, ACPI_WDRT_OFFSET (Flags), "Enabled"},
+ {ACPI_DMT_FLAG7, ACPI_WDRT_OFFSET (Flags), "Stopped When Asleep"},
+ {ACPI_DMT_UINT24, ACPI_WDRT_OFFSET (Reserved[0]), "Reserved"},
+ {ACPI_DMT_UINT32, ACPI_WDRT_OFFSET (Entries), "Watchdog Entries"},
+ {ACPI_DMT_EXIT, 0, NULL}
+};
+
diff --git a/sys/contrib/dev/acpica/common/getopt.c b/sys/contrib/dev/acpica/common/getopt.c
new file mode 100644
index 0000000..2c61575
--- /dev/null
+++ b/sys/contrib/dev/acpica/common/getopt.c
@@ -0,0 +1,246 @@
+
+/******************************************************************************
+ *
+ * Module Name: getopt
+ * $Revision: 1.10 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <stdio.h>
+#include <string.h>
+
+#define ERR(szz,czz) if(AcpiGbl_Opterr){fprintf(stderr,"%s%s%c\n",argv[0],szz,czz);}
+
+
+int AcpiGbl_Opterr = 1;
+int AcpiGbl_Optind = 1;
+int AcpiGbl_Optopt;
+char *AcpiGbl_Optarg;
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetopt
+ *
+ * PARAMETERS: argc, argv - from main
+ * opts - options info list
+ *
+ * RETURN: Option character or EOF
+ *
+ * DESCRIPTION: Get the next option
+ *
+ ******************************************************************************/
+
+int
+AcpiGetopt(
+ int argc,
+ char **argv,
+ char *opts)
+{
+ static int CurrentCharPtr = 1;
+ int CurrentChar;
+ char *OptsPtr;
+
+
+ if (CurrentCharPtr == 1)
+ {
+ if (AcpiGbl_Optind >= argc ||
+ argv[AcpiGbl_Optind][0] != '-' ||
+ argv[AcpiGbl_Optind][1] == '\0')
+ {
+ return(EOF);
+ }
+ else if (strcmp (argv[AcpiGbl_Optind], "--") == 0)
+ {
+ AcpiGbl_Optind++;
+ return(EOF);
+ }
+ }
+
+ /* Get the option */
+
+ CurrentChar =
+ AcpiGbl_Optopt =
+ argv[AcpiGbl_Optind][CurrentCharPtr];
+
+ /* Make sure that the option is legal */
+
+ if (CurrentChar == ':' ||
+ (OptsPtr = strchr (opts, CurrentChar)) == NULL)
+ {
+ ERR (": illegal option -- ", CurrentChar);
+
+ if (argv[AcpiGbl_Optind][++CurrentCharPtr] == '\0')
+ {
+ AcpiGbl_Optind++;
+ CurrentCharPtr = 1;
+ }
+
+ return ('?');
+ }
+
+ /* Option requires an argument? */
+
+ if (*++OptsPtr == ':')
+ {
+ if (argv[AcpiGbl_Optind][CurrentCharPtr+1] != '\0')
+ {
+ AcpiGbl_Optarg = &argv[AcpiGbl_Optind++][CurrentCharPtr+1];
+ }
+ else if (++AcpiGbl_Optind >= argc)
+ {
+ ERR (": option requires an argument -- ", CurrentChar);
+
+ CurrentCharPtr = 1;
+ return ('?');
+ }
+ else
+ {
+ AcpiGbl_Optarg = argv[AcpiGbl_Optind++];
+ }
+
+ CurrentCharPtr = 1;
+ }
+
+ /* Option has optional single-char arguments? */
+
+ else if (*OptsPtr == '^')
+ {
+ if (argv[AcpiGbl_Optind][CurrentCharPtr+1] != '\0')
+ {
+ AcpiGbl_Optarg = &argv[AcpiGbl_Optind][CurrentCharPtr+1];
+ }
+ else
+ {
+ AcpiGbl_Optarg = "^";
+ }
+
+ AcpiGbl_Optind++;
+ CurrentCharPtr = 1;
+ }
+
+ /* Option with no arguments */
+
+ else
+ {
+ if (argv[AcpiGbl_Optind][++CurrentCharPtr] == '\0')
+ {
+ CurrentCharPtr = 1;
+ AcpiGbl_Optind++;
+ }
+
+ AcpiGbl_Optarg = NULL;
+ }
+
+ return (CurrentChar);
+}
diff --git a/sys/contrib/dev/acpica/compiler/aslanalyze.c b/sys/contrib/dev/acpica/compiler/aslanalyze.c
new file mode 100644
index 0000000..93f2f0b
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslanalyze.c
@@ -0,0 +1,2211 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslanalyze.c - check for semantic errors
+ * $Revision: 1.115 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+#include <ctype.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslanalyze")
+
+/* Local prototypes */
+
+static UINT32
+AnMapArgTypeToBtype (
+ UINT32 ArgType);
+
+static UINT32
+AnMapEtypeToBtype (
+ UINT32 Etype);
+
+static void
+AnFormatBtype (
+ char *Buffer,
+ UINT32 Btype);
+
+static UINT32
+AnGetBtype (
+ ACPI_PARSE_OBJECT *Op);
+
+static UINT32
+AnCheckForReservedName (
+ ACPI_PARSE_OBJECT *Op,
+ char *Name);
+
+static void
+AnCheckForReservedMethod (
+ ACPI_PARSE_OBJECT *Op,
+ ASL_METHOD_INFO *MethodInfo);
+
+static UINT32
+AnMapObjTypeToBtype (
+ ACPI_PARSE_OBJECT *Op);
+
+static BOOLEAN
+AnLastStatementIsReturn (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+AnCheckMethodReturnValue (
+ ACPI_PARSE_OBJECT *Op,
+ const ACPI_OPCODE_INFO *OpInfo,
+ ACPI_PARSE_OBJECT *ArgOp,
+ UINT32 RequiredBtypes,
+ UINT32 ThisNodeBtype);
+
+static BOOLEAN
+AnIsInternalMethod (
+ ACPI_PARSE_OBJECT *Op);
+
+static UINT32
+AnGetInternalMethodReturnType (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnIsInternalMethod
+ *
+ * PARAMETERS: Op - Current op
+ *
+ * RETURN: Boolean
+ *
+ * DESCRIPTION: Check for an internal control method.
+ *
+ ******************************************************************************/
+
+static BOOLEAN
+AnIsInternalMethod (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ if ((!ACPI_STRCMP (Op->Asl.ExternalName, "\\_OSI")) ||
+ (!ACPI_STRCMP (Op->Asl.ExternalName, "_OSI")))
+ {
+ return (TRUE);
+ }
+
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnGetInternalMethodReturnType
+ *
+ * PARAMETERS: Op - Current op
+ *
+ * RETURN: Btype
+ *
+ * DESCRIPTION: Get the return type of an internal method
+ *
+ ******************************************************************************/
+
+static UINT32
+AnGetInternalMethodReturnType (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ if ((!ACPI_STRCMP (Op->Asl.ExternalName, "\\_OSI")) ||
+ (!ACPI_STRCMP (Op->Asl.ExternalName, "_OSI")))
+ {
+ return (ACPI_BTYPE_STRING);
+ }
+
+ return (0);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnMapArgTypeToBtype
+ *
+ * PARAMETERS: ArgType - The ARGI required type(s) for this argument,
+ * from the opcode info table
+ *
+ * RETURN: The corresponding Bit-encoded types
+ *
+ * DESCRIPTION: Convert an encoded ARGI required argument type code into a
+ * bitfield type code. Implements the implicit source conversion
+ * rules.
+ *
+ ******************************************************************************/
+
+static UINT32
+AnMapArgTypeToBtype (
+ UINT32 ArgType)
+{
+
+ switch (ArgType)
+ {
+
+ /* Simple types */
+
+ case ARGI_ANYTYPE:
+ return (ACPI_BTYPE_OBJECTS_AND_REFS);
+
+ case ARGI_PACKAGE:
+ return (ACPI_BTYPE_PACKAGE);
+
+ case ARGI_EVENT:
+ return (ACPI_BTYPE_EVENT);
+
+ case ARGI_MUTEX:
+ return (ACPI_BTYPE_MUTEX);
+
+ case ARGI_DDBHANDLE:
+ return (ACPI_BTYPE_DDB_HANDLE);
+
+ /* Interchangeable types */
+ /*
+ * Source conversion rules:
+ * Integer, String, and Buffer are all interchangeable
+ */
+ case ARGI_INTEGER:
+ case ARGI_STRING:
+ case ARGI_BUFFER:
+ case ARGI_BUFFER_OR_STRING:
+ case ARGI_COMPUTEDATA:
+ return (ACPI_BTYPE_COMPUTE_DATA);
+
+ /* References */
+
+ case ARGI_INTEGER_REF:
+ return (ACPI_BTYPE_INTEGER);
+
+ case ARGI_OBJECT_REF:
+ return (ACPI_BTYPE_ALL_OBJECTS);
+
+ case ARGI_DEVICE_REF:
+ return (ACPI_BTYPE_DEVICE_OBJECTS);
+
+ case ARGI_REFERENCE:
+ return (ACPI_BTYPE_REFERENCE);
+
+ case ARGI_TARGETREF:
+ case ARGI_FIXED_TARGET:
+ case ARGI_SIMPLE_TARGET:
+ return (ACPI_BTYPE_OBJECTS_AND_REFS);
+
+ /* Complex types */
+
+ case ARGI_DATAOBJECT:
+
+ /*
+ * Buffer, string, package or reference to a Op -
+ * Used only by SizeOf operator
+ */
+ return (ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER |
+ ACPI_BTYPE_PACKAGE | ACPI_BTYPE_REFERENCE);
+
+ case ARGI_COMPLEXOBJ:
+
+ /* Buffer, String, or package */
+
+ return (ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER | ACPI_BTYPE_PACKAGE);
+
+ case ARGI_REF_OR_STRING:
+ return (ACPI_BTYPE_STRING | ACPI_BTYPE_REFERENCE);
+
+ case ARGI_REGION_OR_BUFFER:
+
+ /* Used by Load() only. Allow buffers in addition to regions/fields */
+
+ return (ACPI_BTYPE_REGION | ACPI_BTYPE_BUFFER | ACPI_BTYPE_FIELD_UNIT);
+
+ case ARGI_DATAREFOBJ:
+ return (ACPI_BTYPE_INTEGER |ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER |
+ ACPI_BTYPE_PACKAGE | ACPI_BTYPE_REFERENCE | ACPI_BTYPE_DDB_HANDLE);
+
+ default:
+ break;
+ }
+
+ return (ACPI_BTYPE_OBJECTS_AND_REFS);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnMapEtypeToBtype
+ *
+ * PARAMETERS: Etype - Encoded ACPI Type
+ *
+ * RETURN: Btype corresponding to the Etype
+ *
+ * DESCRIPTION: Convert an encoded ACPI type to a bitfield type applying the
+ * operand conversion rules. In other words, returns the type(s)
+ * this Etype is implicitly converted to during interpretation.
+ *
+ ******************************************************************************/
+
+static UINT32
+AnMapEtypeToBtype (
+ UINT32 Etype)
+{
+
+
+ if (Etype == ACPI_TYPE_ANY)
+ {
+ return ACPI_BTYPE_OBJECTS_AND_REFS;
+ }
+
+ /* Try the standard ACPI data types */
+
+ if (Etype <= ACPI_TYPE_EXTERNAL_MAX)
+ {
+ /*
+ * This switch statement implements the allowed operand conversion
+ * rules as per the "ASL Data Types" section of the ACPI
+ * specification.
+ */
+ switch (Etype)
+ {
+ case ACPI_TYPE_INTEGER:
+ return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_DDB_HANDLE);
+
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+ return (ACPI_BTYPE_COMPUTE_DATA);
+
+ case ACPI_TYPE_PACKAGE:
+ return (ACPI_BTYPE_PACKAGE);
+
+ case ACPI_TYPE_FIELD_UNIT:
+ return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_FIELD_UNIT);
+
+ case ACPI_TYPE_BUFFER_FIELD:
+ return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_BUFFER_FIELD);
+
+ case ACPI_TYPE_DDB_HANDLE:
+ return (ACPI_BTYPE_INTEGER | ACPI_BTYPE_DDB_HANDLE);
+
+ case ACPI_BTYPE_DEBUG_OBJECT:
+
+ /* Cannot be used as a source operand */
+
+ return (0);
+
+ default:
+ return (1 << (Etype - 1));
+ }
+ }
+
+ /* Try the internal data types */
+
+ switch (Etype)
+ {
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
+
+ /* Named fields can be either Integer/Buffer/String */
+
+ return (ACPI_BTYPE_COMPUTE_DATA | ACPI_BTYPE_FIELD_UNIT);
+
+ case ACPI_TYPE_LOCAL_ALIAS:
+
+ return (ACPI_BTYPE_INTEGER);
+
+
+ case ACPI_TYPE_LOCAL_RESOURCE:
+ case ACPI_TYPE_LOCAL_RESOURCE_FIELD:
+
+ return (ACPI_BTYPE_REFERENCE);
+
+ default:
+ printf ("Unhandled encoded type: %X\n", Etype);
+ return (0);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnFormatBtype
+ *
+ * PARAMETERS: Btype - Bitfield of ACPI types
+ * Buffer - Where to put the ascii string
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Convert a Btype to a string of ACPI types
+ *
+ ******************************************************************************/
+
+static void
+AnFormatBtype (
+ char *Buffer,
+ UINT32 Btype)
+{
+ UINT32 Type;
+ BOOLEAN First = TRUE;
+
+
+ *Buffer = 0;
+
+ if (Btype == 0)
+ {
+ strcat (Buffer, "NoReturnValue");
+ return;
+ }
+
+ for (Type = 1; Type <= ACPI_TYPE_EXTERNAL_MAX; Type++)
+ {
+ if (Btype & 0x00000001)
+ {
+ if (!First)
+ {
+ strcat (Buffer, "|");
+ }
+ First = FALSE;
+ strcat (Buffer, AcpiUtGetTypeName (Type));
+ }
+ Btype >>= 1;
+ }
+
+ if (Btype & 0x00000001)
+ {
+ if (!First)
+ {
+ strcat (Buffer, "|");
+ }
+ First = FALSE;
+ strcat (Buffer, "Reference");
+ }
+
+ Btype >>= 1;
+ if (Btype & 0x00000001)
+ {
+ if (!First)
+ {
+ strcat (Buffer, "|");
+ }
+ First = FALSE;
+ strcat (Buffer, "Resource");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnGetBtype
+ *
+ * PARAMETERS: Op - Parse node whose type will be returned.
+ *
+ * RETURN: The Btype associated with the Op.
+ *
+ * DESCRIPTION: Get the (bitfield) ACPI type associated with the parse node.
+ * Handles the case where the node is a name or method call and
+ * the actual type must be obtained from the namespace node.
+ *
+ ******************************************************************************/
+
+static UINT32
+AnGetBtype (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_PARSE_OBJECT *ReferencedNode;
+ UINT32 ThisNodeBtype = 0;
+
+
+ if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
+ (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
+ (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
+ {
+ Node = Op->Asl.Node;
+ if (!Node)
+ {
+ DbgPrint (ASL_DEBUG_OUTPUT,
+ "No attached Nsnode: [%s] at line %d name [%s], ignoring typecheck\n",
+ Op->Asl.ParseOpName, Op->Asl.LineNumber,
+ Op->Asl.ExternalName);
+ return ACPI_UINT32_MAX;
+ }
+
+ ThisNodeBtype = AnMapEtypeToBtype (Node->Type);
+ if (!ThisNodeBtype)
+ {
+ AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op,
+ "could not map type");
+ }
+
+ /*
+ * Since it was a named reference, enable the
+ * reference bit also
+ */
+ ThisNodeBtype |= ACPI_BTYPE_REFERENCE;
+
+ if (Op->Asl.ParseOpcode == PARSEOP_METHODCALL)
+ {
+ ReferencedNode = Node->Op;
+ if (!ReferencedNode)
+ {
+ /* Check for an internal method */
+
+ if (AnIsInternalMethod (Op))
+ {
+ return (AnGetInternalMethodReturnType (Op));
+ }
+
+ AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op,
+ "null Op pointer");
+ return ACPI_UINT32_MAX;
+ }
+
+ if (ReferencedNode->Asl.CompileFlags & NODE_METHOD_TYPED)
+ {
+ ThisNodeBtype = ReferencedNode->Asl.AcpiBtype;
+ }
+ else
+ {
+ return (ACPI_UINT32_MAX -1);
+ }
+ }
+ }
+ else
+ {
+ ThisNodeBtype = Op->Asl.AcpiBtype;
+ }
+
+ return (ThisNodeBtype);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnCheckForReservedName
+ *
+ * PARAMETERS: Op - A parse node
+ * Name - NameSeg to check
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Check a NameSeg against the reserved list.
+ *
+ ******************************************************************************/
+
+static UINT32
+AnCheckForReservedName (
+ ACPI_PARSE_OBJECT *Op,
+ char *Name)
+{
+ UINT32 i;
+
+
+ if (Name[0] == 0)
+ {
+ AcpiOsPrintf ("Found a null name, external = %s\n",
+ Op->Asl.ExternalName);
+ }
+
+ /* All reserved names are prefixed with a single underscore */
+
+ if (Name[0] != '_')
+ {
+ return (ACPI_NOT_RESERVED_NAME);
+ }
+
+ /* Check for a standard reserved method name */
+
+ for (i = 0; ReservedMethods[i].Name; i++)
+ {
+ if (ACPI_COMPARE_NAME (Name, ReservedMethods[i].Name))
+ {
+ if (ReservedMethods[i].Flags & ASL_RSVD_SCOPE)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESERVED_WORD, Op,
+ Op->Asl.ExternalName);
+ return (ACPI_PREDEFINED_NAME);
+ }
+ else if (ReservedMethods[i].Flags & ASL_RSVD_RESOURCE_NAME)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESERVED_WORD, Op,
+ Op->Asl.ExternalName);
+ return (ACPI_PREDEFINED_NAME);
+ }
+
+ /* Return index into reserved array */
+
+ return i;
+ }
+ }
+
+ /*
+ * Now check for the "special" reserved names --
+ * GPE: _Lxx
+ * GPE: _Exx
+ * EC: _Qxx
+ */
+ if ((Name[1] == 'L') ||
+ (Name[1] == 'E') ||
+ (Name[1] == 'Q'))
+ {
+ /* The next two characters must be hex digits */
+
+ if ((isxdigit (Name[2])) &&
+ (isxdigit (Name[3])))
+ {
+ return (ACPI_EVENT_RESERVED_NAME);
+ }
+ }
+
+
+ /* Check for the names reserved for the compiler itself: _T_x */
+
+ else if ((Op->Asl.ExternalName[1] == 'T') &&
+ (Op->Asl.ExternalName[2] == '_'))
+ {
+ /* Ignore if actually emitted by the compiler */
+
+ if (Op->Asl.CompileFlags & NODE_COMPILER_EMITTED)
+ {
+ return (ACPI_NOT_RESERVED_NAME);
+ }
+
+ AslError (ASL_ERROR, ASL_MSG_RESERVED_WORD, Op, Op->Asl.ExternalName);
+ return (ACPI_COMPILER_RESERVED_NAME);
+ }
+
+ /*
+ * The name didn't match any of the known reserved names. Flag it as a
+ * warning, since the entire namespace starting with an underscore is
+ * reserved by the ACPI spec.
+ */
+ AslError (ASL_WARNING, ASL_MSG_UNKNOWN_RESERVED_NAME, Op,
+ Op->Asl.ExternalName);
+
+ return (ACPI_NOT_RESERVED_NAME);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnCheckForReservedMethod
+ *
+ * PARAMETERS: Op - A parse node of type "METHOD".
+ * MethodInfo - Saved info about this method
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: If method is a reserved name, check that the number of arguments
+ * and the return type (returns a value or not) is correct.
+ *
+ ******************************************************************************/
+
+static void
+AnCheckForReservedMethod (
+ ACPI_PARSE_OBJECT *Op,
+ ASL_METHOD_INFO *MethodInfo)
+{
+ UINT32 Index;
+
+
+ /* Check for a match against the reserved name list */
+
+ Index = AnCheckForReservedName (Op, Op->Asl.NameSeg);
+
+ switch (Index)
+ {
+ case ACPI_NOT_RESERVED_NAME:
+ case ACPI_PREDEFINED_NAME:
+ case ACPI_COMPILER_RESERVED_NAME:
+
+ /* Just return, nothing to do */
+ break;
+
+
+ case ACPI_EVENT_RESERVED_NAME:
+
+ Gbl_ReservedMethods++;
+
+ /* NumArguments must be zero for all _Lxx, _Exx, and _Qxx methods */
+
+ if (MethodInfo->NumArguments != 0)
+ {
+ sprintf (MsgBuffer, "%s requires %d",
+ Op->Asl.ExternalName, 0);
+
+ AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op, MsgBuffer);
+ }
+ break;
+
+
+ default:
+
+ Gbl_ReservedMethods++;
+
+ /* Matched a reserved method name */
+
+ if (MethodInfo->NumArguments != ReservedMethods[Index].NumArguments)
+ {
+ sprintf (MsgBuffer, "%s requires %d",
+ ReservedMethods[Index].Name,
+ ReservedMethods[Index].NumArguments);
+
+ if (MethodInfo->NumArguments > ReservedMethods[Index].NumArguments)
+ {
+ AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_HI, Op,
+ MsgBuffer);
+ }
+ else
+ {
+ AslError (ASL_WARNING, ASL_MSG_RESERVED_ARG_COUNT_LO, Op,
+ MsgBuffer);
+ }
+ }
+
+ if (MethodInfo->NumReturnNoValue &&
+ ReservedMethods[Index].Flags & ASL_RSVD_RETURN_VALUE)
+ {
+ sprintf (MsgBuffer, "%s", ReservedMethods[Index].Name);
+
+ AslError (ASL_WARNING, ASL_MSG_RESERVED_RETURN_VALUE, Op, MsgBuffer);
+ }
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnMapObjTypeToBtype
+ *
+ * PARAMETERS: Op - A parse node
+ *
+ * RETURN: A Btype
+ *
+ * DESCRIPTION: Map object to the associated "Btype"
+ *
+ ******************************************************************************/
+
+static UINT32
+AnMapObjTypeToBtype (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_OBJECTTYPE_BFF: /* "BuffFieldObj" */
+ return (ACPI_BTYPE_BUFFER_FIELD);
+
+ case PARSEOP_OBJECTTYPE_BUF: /* "BuffObj" */
+ return (ACPI_BTYPE_BUFFER);
+
+ case PARSEOP_OBJECTTYPE_DDB: /* "DDBHandleObj" */
+ return (ACPI_BTYPE_DDB_HANDLE);
+
+ case PARSEOP_OBJECTTYPE_DEV: /* "DeviceObj" */
+ return (ACPI_BTYPE_DEVICE);
+
+ case PARSEOP_OBJECTTYPE_EVT: /* "EventObj" */
+ return (ACPI_BTYPE_EVENT);
+
+ case PARSEOP_OBJECTTYPE_FLD: /* "FieldUnitObj" */
+ return (ACPI_BTYPE_FIELD_UNIT);
+
+ case PARSEOP_OBJECTTYPE_INT: /* "IntObj" */
+ return (ACPI_BTYPE_INTEGER);
+
+ case PARSEOP_OBJECTTYPE_MTH: /* "MethodObj" */
+ return (ACPI_BTYPE_METHOD);
+
+ case PARSEOP_OBJECTTYPE_MTX: /* "MutexObj" */
+ return (ACPI_BTYPE_MUTEX);
+
+ case PARSEOP_OBJECTTYPE_OPR: /* "OpRegionObj" */
+ return (ACPI_BTYPE_REGION);
+
+ case PARSEOP_OBJECTTYPE_PKG: /* "PkgObj" */
+ return (ACPI_BTYPE_PACKAGE);
+
+ case PARSEOP_OBJECTTYPE_POW: /* "PowerResObj" */
+ return (ACPI_BTYPE_POWER);
+
+ case PARSEOP_OBJECTTYPE_STR: /* "StrObj" */
+ return (ACPI_BTYPE_STRING);
+
+ case PARSEOP_OBJECTTYPE_THZ: /* "ThermalZoneObj" */
+ return (ACPI_BTYPE_THERMAL);
+
+ case PARSEOP_OBJECTTYPE_UNK: /* "UnknownObj" */
+ return (ACPI_BTYPE_OBJECTS_AND_REFS);
+
+ default:
+ return (0);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnMethodAnalysisWalkBegin
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback for the analysis walk. Check methods for:
+ * 1) Initialized local variables
+ * 2) Valid arguments
+ * 3) Return types
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AnMethodAnalysisWalkBegin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ASL_ANALYSIS_WALK_INFO *WalkInfo = (ASL_ANALYSIS_WALK_INFO *) Context;
+ ASL_METHOD_INFO *MethodInfo = WalkInfo->MethodStack;
+ ACPI_PARSE_OBJECT *Next;
+ UINT32 RegisterNumber;
+ UINT32 i;
+ char LocalName[] = "Local0";
+ char ArgName[] = "Arg0";
+ ACPI_PARSE_OBJECT *ArgNode;
+ ACPI_PARSE_OBJECT *NextType;
+ ACPI_PARSE_OBJECT *NextParamType;
+ UINT8 ActualArgs = 0;
+
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_METHOD:
+
+ TotalMethods++;
+
+ /* Create and init method info */
+
+ MethodInfo = UtLocalCalloc (sizeof (ASL_METHOD_INFO));
+ MethodInfo->Next = WalkInfo->MethodStack;
+ MethodInfo->Op = Op;
+
+ WalkInfo->MethodStack = MethodInfo;
+
+ /* Get the name node, ignored here */
+
+ Next = Op->Asl.Child;
+
+ /* Get the NumArguments node */
+
+ Next = Next->Asl.Next;
+ MethodInfo->NumArguments = (UINT8)
+ (((UINT8) Next->Asl.Value.Integer) & 0x07);
+
+ /* Get the SerializeRule and SyncLevel nodes, ignored here */
+
+ Next = Next->Asl.Next;
+ Next = Next->Asl.Next;
+ ArgNode = Next;
+
+ /* Get the ReturnType node */
+
+ Next = Next->Asl.Next;
+
+ NextType = Next->Asl.Child;
+ while (NextType)
+ {
+ /* Get and map each of the ReturnTypes */
+
+ MethodInfo->ValidReturnTypes |= AnMapObjTypeToBtype (NextType);
+ NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ NextType = NextType->Asl.Next;
+ }
+
+ /* Get the ParameterType node */
+
+ Next = Next->Asl.Next;
+
+ NextType = Next->Asl.Child;
+ while (NextType)
+ {
+ if (NextType->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+ {
+ NextParamType = NextType->Asl.Child;
+ while (NextParamType)
+ {
+ MethodInfo->ValidArgTypes[ActualArgs] |= AnMapObjTypeToBtype (NextParamType);
+ NextParamType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ NextParamType = NextParamType->Asl.Next;
+ }
+ }
+ else
+ {
+ MethodInfo->ValidArgTypes[ActualArgs] =
+ AnMapObjTypeToBtype (NextType);
+ NextType->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ }
+
+ ActualArgs++;
+ NextType = NextType->Asl.Next;
+ }
+
+ if ((MethodInfo->NumArguments) &&
+ (MethodInfo->NumArguments != ActualArgs))
+ {
+ /* error: Param list did not match number of args */
+ }
+
+ /* Allow numarguments == 0 for Function() */
+
+ if ((!MethodInfo->NumArguments) && (ActualArgs))
+ {
+ MethodInfo->NumArguments = ActualArgs;
+ ArgNode->Asl.Value.Integer |= ActualArgs;
+ }
+
+ /*
+ * Actual arguments are initialized at method entry.
+ * All other ArgX "registers" can be used as locals, so we
+ * track their initialization.
+ */
+ for (i = 0; i < MethodInfo->NumArguments; i++)
+ {
+ MethodInfo->ArgInitialized[i] = TRUE;
+ }
+ break;
+
+
+ case PARSEOP_METHODCALL:
+
+ if (MethodInfo &&
+ (Op->Asl.Node == MethodInfo->Op->Asl.Node))
+ {
+ AslError (ASL_REMARK, ASL_MSG_RECURSION, Op, Op->Asl.ExternalName);
+ }
+ break;
+
+
+ case PARSEOP_LOCAL0:
+ case PARSEOP_LOCAL1:
+ case PARSEOP_LOCAL2:
+ case PARSEOP_LOCAL3:
+ case PARSEOP_LOCAL4:
+ case PARSEOP_LOCAL5:
+ case PARSEOP_LOCAL6:
+ case PARSEOP_LOCAL7:
+
+ if (!MethodInfo)
+ {
+ /*
+ * Probably was an error in the method declaration,
+ * no additional error here
+ */
+ ACPI_WARNING ((AE_INFO, "%p, No parent method", Op));
+ return (AE_ERROR);
+ }
+
+ RegisterNumber = (Op->Asl.AmlOpcode & 0x000F);
+
+ /*
+ * If the local is being used as a target, mark the local
+ * initialized
+ */
+ if (Op->Asl.CompileFlags & NODE_IS_TARGET)
+ {
+ MethodInfo->LocalInitialized[RegisterNumber] = TRUE;
+ }
+
+ /*
+ * Otherwise, this is a reference, check if the local
+ * has been previously initialized.
+ *
+ * The only operator that accepts an uninitialized value is ObjectType()
+ */
+ else if ((!MethodInfo->LocalInitialized[RegisterNumber]) &&
+ (Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_OBJECTTYPE))
+ {
+ LocalName[strlen (LocalName) -1] = (char) (RegisterNumber + 0x30);
+ AslError (ASL_ERROR, ASL_MSG_LOCAL_INIT, Op, LocalName);
+ }
+ break;
+
+
+ case PARSEOP_ARG0:
+ case PARSEOP_ARG1:
+ case PARSEOP_ARG2:
+ case PARSEOP_ARG3:
+ case PARSEOP_ARG4:
+ case PARSEOP_ARG5:
+ case PARSEOP_ARG6:
+
+ if (!MethodInfo)
+ {
+ /*
+ * Probably was an error in the method declaration,
+ * no additional error here
+ */
+ ACPI_WARNING ((AE_INFO, "%p, No parent method", Op));
+ return (AE_ERROR);
+ }
+
+ RegisterNumber = (Op->Asl.AmlOpcode & 0x000F) - 8;
+ ArgName[strlen (ArgName) -1] = (char) (RegisterNumber + 0x30);
+
+ /*
+ * If the Arg is being used as a target, mark the local
+ * initialized
+ */
+ if (Op->Asl.CompileFlags & NODE_IS_TARGET)
+ {
+ MethodInfo->ArgInitialized[RegisterNumber] = TRUE;
+ }
+
+ /*
+ * Otherwise, this is a reference, check if the Arg
+ * has been previously initialized.
+ *
+ * The only operator that accepts an uninitialized value is ObjectType()
+ */
+ else if ((!MethodInfo->ArgInitialized[RegisterNumber]) &&
+ (Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_OBJECTTYPE))
+ {
+ AslError (ASL_ERROR, ASL_MSG_ARG_INIT, Op, ArgName);
+ }
+
+ /* Flag this arg if it is not a "real" argument to the method */
+
+ if (RegisterNumber >= MethodInfo->NumArguments)
+ {
+ AslError (ASL_REMARK, ASL_MSG_NOT_PARAMETER, Op, ArgName);
+ }
+ break;
+
+
+ case PARSEOP_RETURN:
+
+ if (!MethodInfo)
+ {
+ /*
+ * Probably was an error in the method declaration,
+ * no additional error here
+ */
+ ACPI_WARNING ((AE_INFO, "%p, No parent method", Op));
+ return (AE_ERROR);
+ }
+
+ /* Child indicates a return value */
+
+ if ((Op->Asl.Child) &&
+ (Op->Asl.Child->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG))
+ {
+ MethodInfo->NumReturnWithValue++;
+ }
+ else
+ {
+ MethodInfo->NumReturnNoValue++;
+ }
+ break;
+
+
+ case PARSEOP_BREAK:
+ case PARSEOP_CONTINUE:
+
+ Next = Op->Asl.Parent;
+ while (Next)
+ {
+ if (Next->Asl.ParseOpcode == PARSEOP_WHILE)
+ {
+ break;
+ }
+ Next = Next->Asl.Parent;
+ }
+
+ if (!Next)
+ {
+ AslError (ASL_ERROR, ASL_MSG_NO_WHILE, Op, NULL);
+ }
+ break;
+
+
+ case PARSEOP_STALL:
+
+ /* We can range check if the argument is an integer */
+
+ if ((Op->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER) &&
+ (Op->Asl.Child->Asl.Value.Integer > ACPI_UINT8_MAX))
+ {
+ AslError (ASL_ERROR, ASL_MSG_INVALID_TIME, Op, NULL);
+ }
+ break;
+
+
+ case PARSEOP_DEVICE:
+ case PARSEOP_EVENT:
+ case PARSEOP_MUTEX:
+ case PARSEOP_OPERATIONREGION:
+ case PARSEOP_POWERRESOURCE:
+ case PARSEOP_PROCESSOR:
+ case PARSEOP_THERMALZONE:
+
+ /*
+ * The first operand is a name to be created in the namespace.
+ * Check against the reserved list.
+ */
+ i = AnCheckForReservedName (Op, Op->Asl.NameSeg);
+ if (i < ACPI_VALID_RESERVED_NAME_MAX)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESERVED_USE, Op, Op->Asl.ExternalName);
+ }
+ break;
+
+
+ case PARSEOP_NAME:
+
+ i = AnCheckForReservedName (Op, Op->Asl.NameSeg);
+ if (i < ACPI_VALID_RESERVED_NAME_MAX)
+ {
+ if (ReservedMethods[i].NumArguments > 0)
+ {
+ /*
+ * This reserved name must be a control method because
+ * it must have arguments
+ */
+ AslError (ASL_ERROR, ASL_MSG_RESERVED_METHOD, Op,
+ "with arguments");
+ }
+
+ /* Typechecking for _HID */
+
+ else if (!ACPI_STRCMP (METHOD_NAME__HID, ReservedMethods[i].Name))
+ {
+ /* Examine the second operand to typecheck it */
+
+ Next = Op->Asl.Child->Asl.Next;
+
+ if ((Next->Asl.ParseOpcode != PARSEOP_INTEGER) &&
+ (Next->Asl.ParseOpcode != PARSEOP_STRING_LITERAL))
+ {
+ /* _HID must be a string or an integer */
+
+ AslError (ASL_ERROR, ASL_MSG_RESERVED_OPERAND_TYPE, Next,
+ "String or Integer");
+ }
+
+ if (Next->Asl.ParseOpcode == PARSEOP_STRING_LITERAL)
+ {
+ /*
+ * _HID is a string, all characters must be alphanumeric.
+ * One of the things we want to catch here is the use of
+ * a leading asterisk in the string.
+ */
+ for (i = 0; Next->Asl.Value.String[i]; i++)
+ {
+ if (!isalnum (Next->Asl.Value.String[i]))
+ {
+ AslError (ASL_ERROR, ASL_MSG_ALPHANUMERIC_STRING,
+ Next, Next->Asl.Value.String);
+ break;
+ }
+ }
+ }
+ }
+ }
+ break;
+
+
+ default:
+ break;
+ }
+
+ return AE_OK;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnLastStatementIsReturn
+ *
+ * PARAMETERS: Op - A method parse node
+ *
+ * RETURN: TRUE if last statement is an ASL RETURN. False otherwise
+ *
+ * DESCRIPTION: Walk down the list of top level statements within a method
+ * to find the last one. Check if that last statement is in
+ * fact a RETURN statement.
+ *
+ ******************************************************************************/
+
+static BOOLEAN
+AnLastStatementIsReturn (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ /*
+ * Check if last statement is a return
+ */
+ Next = ASL_GET_CHILD_NODE (Op);
+ while (Next)
+ {
+ if ((!Next->Asl.Next) &&
+ (Next->Asl.ParseOpcode == PARSEOP_RETURN))
+ {
+ return TRUE;
+ }
+
+ Next = ASL_GET_PEER_NODE (Next);
+ }
+
+ return FALSE;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnMethodAnalysisWalkEnd
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback for analysis walk. Complete method
+ * return analysis.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AnMethodAnalysisWalkEnd (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ASL_ANALYSIS_WALK_INFO *WalkInfo = (ASL_ANALYSIS_WALK_INFO *) Context;
+ ASL_METHOD_INFO *MethodInfo = WalkInfo->MethodStack;
+
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_METHOD:
+ case PARSEOP_RETURN:
+ if (!MethodInfo)
+ {
+ printf ("No method info for method! [%s]\n", Op->Asl.Namepath);
+ AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, Op,
+ "No method info for this method");
+ CmCleanupAndExit ();
+ return (AE_AML_INTERNAL);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_METHOD:
+
+ WalkInfo->MethodStack = MethodInfo->Next;
+
+ /*
+ * Check if there is no return statement at the end of the
+ * method AND we can actually get there -- i.e., the execution
+ * of the method can possibly terminate without a return statement.
+ */
+ if ((!AnLastStatementIsReturn (Op)) &&
+ (!(Op->Asl.CompileFlags & NODE_HAS_NO_EXIT)))
+ {
+ /*
+ * No return statement, and execution can possibly exit
+ * via this path. This is equivalent to Return ()
+ */
+ MethodInfo->NumReturnNoValue++;
+ }
+
+ /*
+ * Check for case where some return statements have a return value
+ * and some do not. Exit without a return statement is a return with
+ * no value
+ */
+ if (MethodInfo->NumReturnNoValue &&
+ MethodInfo->NumReturnWithValue)
+ {
+ AslError (ASL_WARNING, ASL_MSG_RETURN_TYPES, Op,
+ Op->Asl.ExternalName);
+ }
+
+ /*
+ * If there are any RETURN() statements with no value, or there is a
+ * control path that allows the method to exit without a return value,
+ * we mark the method as a method that does not return a value. This
+ * knowledge can be used to check method invocations that expect a
+ * returned value.
+ */
+ if (MethodInfo->NumReturnNoValue)
+ {
+ if (MethodInfo->NumReturnWithValue)
+ {
+ Op->Asl.CompileFlags |= NODE_METHOD_SOME_NO_RETVAL;
+ }
+ else
+ {
+ Op->Asl.CompileFlags |= NODE_METHOD_NO_RETVAL;
+ }
+ }
+
+ /*
+ * Check predefined method names for correct return behavior
+ * and correct number of arguments
+ */
+ AnCheckForReservedMethod (Op, MethodInfo);
+ ACPI_FREE (MethodInfo);
+ break;
+
+
+ case PARSEOP_RETURN:
+
+ /*
+ * The parent block does not "exit" and continue execution -- the
+ * method is terminated here with the Return() statement.
+ */
+ Op->Asl.Parent->Asl.CompileFlags |= NODE_HAS_NO_EXIT;
+
+ /* Used in the "typing" pass later */
+
+ Op->Asl.ParentMethod = MethodInfo->Op;
+
+ /*
+ * If there is a peer node after the return statement, then this
+ * node is unreachable code -- i.e., it won't be executed because of
+ * the preceeding Return() statement.
+ */
+ if (Op->Asl.Next)
+ {
+ AslError (ASL_WARNING, ASL_MSG_UNREACHABLE_CODE, Op->Asl.Next, NULL);
+ }
+ break;
+
+
+ case PARSEOP_IF:
+
+ if ((Op->Asl.CompileFlags & NODE_HAS_NO_EXIT) &&
+ (Op->Asl.Next) &&
+ (Op->Asl.Next->Asl.ParseOpcode == PARSEOP_ELSE))
+ {
+ /*
+ * This IF has a corresponding ELSE. The IF block has no exit,
+ * (it contains an unconditional Return)
+ * mark the ELSE block to remember this fact.
+ */
+ Op->Asl.Next->Asl.CompileFlags |= NODE_IF_HAS_NO_EXIT;
+ }
+ break;
+
+
+ case PARSEOP_ELSE:
+
+ if ((Op->Asl.CompileFlags & NODE_HAS_NO_EXIT) &&
+ (Op->Asl.CompileFlags & NODE_IF_HAS_NO_EXIT))
+ {
+ /*
+ * This ELSE block has no exit and the corresponding IF block
+ * has no exit either. Therefore, the parent node has no exit.
+ */
+ Op->Asl.Parent->Asl.CompileFlags |= NODE_HAS_NO_EXIT;
+ }
+ break;
+
+
+ default:
+
+ if ((Op->Asl.CompileFlags & NODE_HAS_NO_EXIT) &&
+ (Op->Asl.Parent))
+ {
+ /* If this node has no exit, then the parent has no exit either */
+
+ Op->Asl.Parent->Asl.CompileFlags |= NODE_HAS_NO_EXIT;
+ }
+ break;
+ }
+
+ return AE_OK;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnMethodTypingWalkBegin
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback for the typing walk.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AnMethodTypingWalkBegin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+
+ return AE_OK;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnMethodTypingWalkEnd
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback for typing walk. Complete the method
+ * return analysis. Check methods for:
+ * 1) Initialized local variables
+ * 2) Valid arguments
+ * 3) Return types
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AnMethodTypingWalkEnd (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ UINT32 ThisNodeBtype;
+
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_METHOD:
+
+ Op->Asl.CompileFlags |= NODE_METHOD_TYPED;
+ break;
+
+ case PARSEOP_RETURN:
+
+ if ((Op->Asl.Child) &&
+ (Op->Asl.Child->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG))
+ {
+ ThisNodeBtype = AnGetBtype (Op->Asl.Child);
+
+ if ((Op->Asl.Child->Asl.ParseOpcode == PARSEOP_METHODCALL) &&
+ (ThisNodeBtype == (ACPI_UINT32_MAX -1)))
+ {
+ /*
+ * The called method is untyped at this time (typically a
+ * forward reference).
+ *
+ * Check for a recursive method call first.
+ */
+ if (Op->Asl.ParentMethod != Op->Asl.Child->Asl.Node->Op)
+ {
+ /* We must type the method here */
+
+ TrWalkParseTree (Op->Asl.Child->Asl.Node->Op,
+ ASL_WALK_VISIT_TWICE, AnMethodTypingWalkBegin,
+ AnMethodTypingWalkEnd, NULL);
+
+ ThisNodeBtype = AnGetBtype (Op->Asl.Child);
+ }
+ }
+
+ /* Returns a value, save the value type */
+
+ if (Op->Asl.ParentMethod)
+ {
+ Op->Asl.ParentMethod->Asl.AcpiBtype |= ThisNodeBtype;
+ }
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return AE_OK;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnCheckMethodReturnValue
+ *
+ * PARAMETERS: Op - Parent
+ * OpInfo - Parent info
+ * ArgOp - Method invocation op
+ * RequiredBtypes - What caller requires
+ * ThisNodeBtype - What this node returns (if anything)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Check a method invocation for 1) A return value and if it does
+ * in fact return a value, 2) check the type of the return value.
+ *
+ ******************************************************************************/
+
+static void
+AnCheckMethodReturnValue (
+ ACPI_PARSE_OBJECT *Op,
+ const ACPI_OPCODE_INFO *OpInfo,
+ ACPI_PARSE_OBJECT *ArgOp,
+ UINT32 RequiredBtypes,
+ UINT32 ThisNodeBtype)
+{
+ ACPI_PARSE_OBJECT *OwningOp;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ Node = ArgOp->Asl.Node;
+
+
+ /* Examine the parent op of this method */
+
+ OwningOp = Node->Op;
+ if (OwningOp->Asl.CompileFlags & NODE_METHOD_NO_RETVAL)
+ {
+ /* Method NEVER returns a value */
+
+ AslError (ASL_ERROR, ASL_MSG_NO_RETVAL, Op, Op->Asl.ExternalName);
+ }
+ else if (OwningOp->Asl.CompileFlags & NODE_METHOD_SOME_NO_RETVAL)
+ {
+ /* Method SOMETIMES returns a value, SOMETIMES not */
+
+ AslError (ASL_WARNING, ASL_MSG_SOME_NO_RETVAL, Op, Op->Asl.ExternalName);
+ }
+ else if (!(ThisNodeBtype & RequiredBtypes))
+ {
+ /* Method returns a value, but the type is wrong */
+
+ AnFormatBtype (StringBuffer, ThisNodeBtype);
+ AnFormatBtype (StringBuffer2, RequiredBtypes);
+
+
+ /*
+ * The case where the method does not return any value at all
+ * was already handled in the namespace cross reference
+ * -- Only issue an error if the method in fact returns a value,
+ * but it is of the wrong type
+ */
+ if (ThisNodeBtype != 0)
+ {
+ sprintf (MsgBuffer,
+ "Method returns [%s], %s operator requires [%s]",
+ StringBuffer, OpInfo->Name, StringBuffer2);
+
+ AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ArgOp, MsgBuffer);
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnOperandTypecheckWalkBegin
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback for the analysis walk. Check methods for:
+ * 1) Initialized local variables
+ * 2) Valid arguments
+ * 3) Return types
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AnOperandTypecheckWalkBegin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+
+ return AE_OK;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnOperandTypecheckWalkEnd
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback for analysis walk. Complete method
+ * return analysis.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AnOperandTypecheckWalkEnd (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ const ACPI_OPCODE_INFO *OpInfo;
+ UINT32 RuntimeArgTypes;
+ UINT32 RuntimeArgTypes2;
+ UINT32 RequiredBtypes;
+ UINT32 ThisNodeBtype;
+ UINT32 CommonBtypes;
+ UINT32 OpcodeClass;
+ ACPI_PARSE_OBJECT *ArgOp;
+ UINT32 ArgType;
+
+
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_RAW_DATA_BYTE:
+ case AML_RAW_DATA_WORD:
+ case AML_RAW_DATA_DWORD:
+ case AML_RAW_DATA_QWORD:
+ case AML_RAW_DATA_BUFFER:
+ case AML_RAW_DATA_CHAIN:
+ case AML_PACKAGE_LENGTH:
+ case AML_UNASSIGNED_OPCODE:
+ case AML_DEFAULT_ARG_OP:
+
+ /* Ignore the internal (compiler-only) AML opcodes */
+
+ return (AE_OK);
+
+ default:
+ break;
+ }
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
+ if (!OpInfo)
+ {
+ return (AE_OK);
+ }
+
+ ArgOp = Op->Asl.Child;
+ RuntimeArgTypes = OpInfo->RuntimeArgs;
+ OpcodeClass = OpInfo->Class;
+
+
+ /*
+ * Special case for control opcodes IF/RETURN/WHILE since they
+ * have no runtime arg list (at this time)
+ */
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_IF_OP:
+ case AML_WHILE_OP:
+ case AML_RETURN_OP:
+
+ if (ArgOp->Asl.ParseOpcode == PARSEOP_METHODCALL)
+ {
+ /* Check for an internal method */
+
+ if (AnIsInternalMethod (ArgOp))
+ {
+ return (AE_OK);
+ }
+
+ /* The lone arg is a method call, check it */
+
+ RequiredBtypes = AnMapArgTypeToBtype (ARGI_INTEGER);
+ if (Op->Asl.AmlOpcode == AML_RETURN_OP)
+ {
+ RequiredBtypes = 0xFFFFFFFF;
+ }
+
+ ThisNodeBtype = AnGetBtype (ArgOp);
+ if (ThisNodeBtype == ACPI_UINT32_MAX)
+ {
+ return (AE_OK);
+ }
+ AnCheckMethodReturnValue (Op, OpInfo, ArgOp,
+ RequiredBtypes, ThisNodeBtype);
+ }
+ return (AE_OK);
+
+ default:
+ break;
+ }
+
+ /* Ignore the non-executable opcodes */
+
+ if (RuntimeArgTypes == ARGI_INVALID_OPCODE)
+ {
+ return (AE_OK);
+ }
+
+ switch (OpcodeClass)
+ {
+ case AML_CLASS_EXECUTE:
+ case AML_CLASS_CREATE:
+ case AML_CLASS_CONTROL:
+ case AML_CLASS_RETURN_VALUE:
+
+ /* TBD: Change class or fix typechecking for these */
+
+ if ((Op->Asl.AmlOpcode == AML_BUFFER_OP) ||
+ (Op->Asl.AmlOpcode == AML_PACKAGE_OP) ||
+ (Op->Asl.AmlOpcode == AML_VAR_PACKAGE_OP))
+ {
+ break;
+ }
+
+ /* Reverse the runtime argument list */
+
+ RuntimeArgTypes2 = 0;
+ while ((ArgType = GET_CURRENT_ARG_TYPE (RuntimeArgTypes)))
+ {
+ RuntimeArgTypes2 <<= ARG_TYPE_WIDTH;
+ RuntimeArgTypes2 |= ArgType;
+ INCREMENT_ARG_LIST (RuntimeArgTypes);
+ }
+
+ while ((ArgType = GET_CURRENT_ARG_TYPE (RuntimeArgTypes2)))
+ {
+ RequiredBtypes = AnMapArgTypeToBtype (ArgType);
+
+ ThisNodeBtype = AnGetBtype (ArgOp);
+ if (ThisNodeBtype == ACPI_UINT32_MAX)
+ {
+ goto NextArgument;
+ }
+
+ /* Examine the arg based on the required type of the arg */
+
+ switch (ArgType)
+ {
+ case ARGI_TARGETREF:
+
+ if (ArgOp->Asl.ParseOpcode == PARSEOP_ZERO)
+ {
+ /* ZERO is the placeholder for "don't store result" */
+
+ ThisNodeBtype = RequiredBtypes;
+ break;
+ }
+
+ if (ArgOp->Asl.ParseOpcode == PARSEOP_INTEGER)
+ {
+ /*
+ * This is the case where an original reference to a resource
+ * descriptor field has been replaced by an (Integer) offset.
+ * These named fields are supported at compile-time only;
+ * the names are not passed to the interpreter (via the AML).
+ */
+ if ((ArgOp->Asl.Node->Type == ACPI_TYPE_LOCAL_RESOURCE_FIELD) ||
+ (ArgOp->Asl.Node->Type == ACPI_TYPE_LOCAL_RESOURCE))
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_FIELD, ArgOp, NULL);
+ }
+ else
+ {
+ AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ArgOp, NULL);
+ }
+ break;
+ }
+
+ if ((ArgOp->Asl.ParseOpcode == PARSEOP_METHODCALL) ||
+ (ArgOp->Asl.ParseOpcode == PARSEOP_DEREFOF))
+ {
+ break;
+ }
+
+ ThisNodeBtype = RequiredBtypes;
+ break;
+
+
+ case ARGI_REFERENCE: /* References */
+ case ARGI_INTEGER_REF:
+ case ARGI_OBJECT_REF:
+ case ARGI_DEVICE_REF:
+
+ switch (ArgOp->Asl.ParseOpcode)
+ {
+ case PARSEOP_LOCAL0:
+ case PARSEOP_LOCAL1:
+ case PARSEOP_LOCAL2:
+ case PARSEOP_LOCAL3:
+ case PARSEOP_LOCAL4:
+ case PARSEOP_LOCAL5:
+ case PARSEOP_LOCAL6:
+ case PARSEOP_LOCAL7:
+
+ /* TBD: implement analysis of current value (type) of the local */
+ /* For now, just treat any local as a typematch */
+
+ /*ThisNodeBtype = RequiredBtypes;*/
+ break;
+
+ case PARSEOP_ARG0:
+ case PARSEOP_ARG1:
+ case PARSEOP_ARG2:
+ case PARSEOP_ARG3:
+ case PARSEOP_ARG4:
+ case PARSEOP_ARG5:
+ case PARSEOP_ARG6:
+
+ /* Hard to analyze argument types, sow we won't */
+ /* For now, just treat any arg as a typematch */
+
+ /* ThisNodeBtype = RequiredBtypes; */
+ break;
+
+ case PARSEOP_DEBUG:
+ break;
+
+ case PARSEOP_REFOF:
+ case PARSEOP_INDEX:
+ default:
+ break;
+
+ }
+ break;
+
+ case ARGI_INTEGER:
+ default:
+ break;
+ }
+
+
+ CommonBtypes = ThisNodeBtype & RequiredBtypes;
+
+ if (ArgOp->Asl.ParseOpcode == PARSEOP_METHODCALL)
+ {
+ if (AnIsInternalMethod (ArgOp))
+ {
+ return (AE_OK);
+ }
+
+ /* Check a method call for a valid return value */
+
+ AnCheckMethodReturnValue (Op, OpInfo, ArgOp,
+ RequiredBtypes, ThisNodeBtype);
+ }
+
+ /*
+ * Now check if the actual type(s) match at least one
+ * bit to the required type
+ */
+ else if (!CommonBtypes)
+ {
+ /* No match -- this is a type mismatch error */
+
+ AnFormatBtype (StringBuffer, ThisNodeBtype);
+ AnFormatBtype (StringBuffer2, RequiredBtypes);
+
+ sprintf (MsgBuffer, "[%s] found, %s operator requires [%s]",
+ StringBuffer, OpInfo->Name, StringBuffer2);
+
+ AslError (ASL_ERROR, ASL_MSG_INVALID_TYPE, ArgOp, MsgBuffer);
+ }
+
+ NextArgument:
+ ArgOp = ArgOp->Asl.Next;
+ INCREMENT_ARG_LIST (RuntimeArgTypes2);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnIsResultUsed
+ *
+ * PARAMETERS: Op - Parent op for the operator
+ *
+ * RETURN: TRUE if result from this operation is actually consumed
+ *
+ * DESCRIPTION: Determine if the function result value from an operator is
+ * used.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AnIsResultUsed (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Parent;
+
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_INCREMENT:
+ case PARSEOP_DECREMENT:
+
+ /* These are standalone operators, no return value */
+
+ return (TRUE);
+
+ default:
+ break;
+ }
+
+ /* Examine parent to determine if the return value is used */
+
+ Parent = Op->Asl.Parent;
+ switch (Parent->Asl.ParseOpcode)
+ {
+ /* If/While - check if the operator is the predicate */
+
+ case PARSEOP_IF:
+ case PARSEOP_WHILE:
+
+ /* First child is the predicate */
+
+ if (Parent->Asl.Child == Op)
+ {
+ return (TRUE);
+ }
+ return (FALSE);
+
+ /* Not used if one of these is the parent */
+
+ case PARSEOP_METHOD:
+ case PARSEOP_DEFINITIONBLOCK:
+ case PARSEOP_ELSE:
+
+ return (FALSE);
+
+ default:
+ /* Any other type of parent means that the result is used */
+
+ return (TRUE);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnOtherSemanticAnalysisWalkBegin
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback for the analysis walk. Checks for
+ * miscellaneous issues in the code.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AnOtherSemanticAnalysisWalkBegin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_PARSE_OBJECT *ArgNode;
+ ACPI_PARSE_OBJECT *PrevArgNode = NULL;
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
+
+ /*
+ * Determine if an execution class operator actually does something by
+ * checking if it has a target and/or the function return value is used.
+ * (Target is optional, so a standalone statement can actually do nothing.)
+ */
+ if ((OpInfo->Class == AML_CLASS_EXECUTE) &&
+ (OpInfo->Flags & AML_HAS_RETVAL) &&
+ (!AnIsResultUsed (Op)))
+ {
+ if (OpInfo->Flags & AML_HAS_TARGET)
+ {
+ /*
+ * Find the target node, it is always the last child. If the traget
+ * is not specified in the ASL, a default node of type Zero was
+ * created by the parser.
+ */
+ ArgNode = Op->Asl.Child;
+ while (ArgNode->Asl.Next)
+ {
+ PrevArgNode = ArgNode;
+ ArgNode = ArgNode->Asl.Next;
+ }
+
+ /* Divide() is the only weird case, it has two targets */
+
+ if (Op->Asl.AmlOpcode == AML_DIVIDE_OP)
+ {
+ if ((ArgNode->Asl.ParseOpcode == PARSEOP_ZERO) &&
+ (PrevArgNode->Asl.ParseOpcode == PARSEOP_ZERO))
+ {
+ AslError (ASL_WARNING, ASL_MSG_RESULT_NOT_USED, Op, Op->Asl.ExternalName);
+ }
+ }
+ else if (ArgNode->Asl.ParseOpcode == PARSEOP_ZERO)
+ {
+ AslError (ASL_WARNING, ASL_MSG_RESULT_NOT_USED, Op, Op->Asl.ExternalName);
+ }
+ }
+ else
+ {
+ /*
+ * Has no target and the result is not used. Only a couple opcodes
+ * can have this combination.
+ */
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_ACQUIRE:
+ case PARSEOP_WAIT:
+ break;
+
+ default:
+ AslError (ASL_WARNING, ASL_MSG_RESULT_NOT_USED, Op, Op->Asl.ExternalName);
+ break;
+ }
+ }
+ }
+
+
+ /*
+ * Semantic checks for individual ASL operators
+ */
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_ACQUIRE:
+ case PARSEOP_WAIT:
+ /*
+ * Emit a warning if the timeout parameter for these operators is not
+ * ACPI_WAIT_FOREVER, and the result value from the operator is not
+ * checked, meaning that a timeout could happen, but the code
+ * would not know about it.
+ */
+
+ /* First child is the namepath, 2nd child is timeout */
+
+ ArgNode = Op->Asl.Child;
+ ArgNode = ArgNode->Asl.Next;
+
+ /*
+ * Check for the WAIT_FOREVER case - defined by the ACPI spec to be
+ * 0xFFFF or greater
+ */
+ if (((ArgNode->Asl.ParseOpcode == PARSEOP_WORDCONST) ||
+ (ArgNode->Asl.ParseOpcode == PARSEOP_INTEGER)) &&
+ (ArgNode->Asl.Value.Integer >= (ACPI_INTEGER) ACPI_WAIT_FOREVER))
+ {
+ break;
+ }
+
+ /*
+ * The operation could timeout. If the return value is not used
+ * (indicates timeout occurred), issue a warning
+ */
+ if (!AnIsResultUsed (Op))
+ {
+ AslError (ASL_WARNING, ASL_MSG_TIMEOUT, ArgNode, Op->Asl.ExternalName);
+ }
+ break;
+
+ case PARSEOP_CREATEFIELD:
+ /*
+ * Check for a zero Length (NumBits) operand. NumBits is the 3rd operand
+ */
+ ArgNode = Op->Asl.Child;
+ ArgNode = ArgNode->Asl.Next;
+ ArgNode = ArgNode->Asl.Next;
+
+ if ((ArgNode->Asl.ParseOpcode == PARSEOP_ZERO) ||
+ ((ArgNode->Asl.ParseOpcode == PARSEOP_INTEGER) &&
+ (ArgNode->Asl.Value.Integer == 0)))
+ {
+ AslError (ASL_ERROR, ASL_MSG_NON_ZERO, ArgNode, NULL);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return AE_OK;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AnOtherSemanticAnalysisWalkEnd
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback for analysis walk. Complete method
+ * return analysis.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AnOtherSemanticAnalysisWalkEnd (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+
+ return AE_OK;
+
+}
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+/*******************************************************************************
+ *
+ * FUNCTION: AnMapBtypeToEtype
+ *
+ * PARAMETERS: Btype - Bitfield of ACPI types
+ *
+ * RETURN: The Etype corresponding the the Btype
+ *
+ * DESCRIPTION: Convert a bitfield type to an encoded type
+ *
+ ******************************************************************************/
+
+UINT32
+AnMapBtypeToEtype (
+ UINT32 Btype)
+{
+ UINT32 i;
+ UINT32 Etype;
+
+
+ if (Btype == 0)
+ {
+ return 0;
+ }
+
+ Etype = 1;
+ for (i = 1; i < Btype; i *= 2)
+ {
+ Etype++;
+ }
+
+ return (Etype);
+}
+#endif
+
diff --git a/sys/contrib/dev/acpica/compiler/aslcodegen.c b/sys/contrib/dev/acpica/compiler/aslcodegen.c
new file mode 100644
index 0000000..25ee729
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslcodegen.c
@@ -0,0 +1,661 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslcodegen - AML code generation
+ * $Revision: 1.62 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+#include <contrib/dev/acpica/amlcode.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslcodegen")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+CgAmlWriteWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static void
+CgLocalWriteAmlData (
+ ACPI_PARSE_OBJECT *Op,
+ void *Buffer,
+ UINT32 Length);
+
+static void
+CgWriteAmlOpcode (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+CgWriteTableHeader (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+CgCloseTable (
+ void);
+
+static void
+CgWriteNode (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CgGenerateAmlOutput
+ *
+ * PARAMETERS: None.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Generate AML code. Currently generates the listing file
+ * simultaneously.
+ *
+ ******************************************************************************/
+
+void
+CgGenerateAmlOutput (
+ void)
+{
+
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nWriting AML\n\n");
+
+ /* Generate the AML output file */
+
+ FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0);
+ Gbl_SourceLine = 0;
+ Gbl_NextError = Gbl_ErrorLog;
+
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
+ CgAmlWriteWalk, NULL, NULL);
+ CgCloseTable ();
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CgAmlWriteWalk
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Parse tree walk to generate the AML code.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+CgAmlWriteWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+
+ /*
+ * Print header at level 0. Alignment assumes 32-bit pointers
+ */
+ if (!Level)
+ {
+ DbgPrint (ASL_TREE_OUTPUT,
+ "Final parse tree used for AML output:\n");
+ DbgPrint (ASL_TREE_OUTPUT,
+ "%*s Value P_Op A_Op OpLen PByts Len SubLen PSubLen OpPtr Child Parent Flags AcTyp Final Col L\n",
+ 76, " ");
+ }
+
+ /* Debug output */
+
+ DbgPrint (ASL_TREE_OUTPUT,
+ "%5.5d [%2d]", Op->Asl.LogicalLineNumber, Level);
+ UtPrintFormattedName (Op->Asl.ParseOpcode, Level);
+
+ if (Op->Asl.ParseOpcode == PARSEOP_NAMESEG ||
+ Op->Asl.ParseOpcode == PARSEOP_NAMESTRING ||
+ Op->Asl.ParseOpcode == PARSEOP_METHODCALL)
+ {
+ DbgPrint (ASL_TREE_OUTPUT,
+ "%10.32s ", Op->Asl.ExternalName);
+ }
+ else
+ {
+ DbgPrint (ASL_TREE_OUTPUT, " ");
+ }
+
+ DbgPrint (ASL_TREE_OUTPUT,
+ "%08X %04X %04X %01X %04X %04X %04X %04X %08X %08X %08X %08X %08X %04X %02d %02d\n",
+ /* 1 */ (UINT32) Op->Asl.Value.Integer,
+ /* 2 */ Op->Asl.ParseOpcode,
+ /* 3 */ Op->Asl.AmlOpcode,
+ /* 4 */ Op->Asl.AmlOpcodeLength,
+ /* 5 */ Op->Asl.AmlPkgLenBytes,
+ /* 6 */ Op->Asl.AmlLength,
+ /* 7 */ Op->Asl.AmlSubtreeLength,
+ /* 8 */ Op->Asl.Parent ? Op->Asl.Parent->Asl.AmlSubtreeLength : 0,
+ /* 9 */ Op,
+ /* 10 */ Op->Asl.Child,
+ /* 11 */ Op->Asl.Parent,
+ /* 12 */ Op->Asl.CompileFlags,
+ /* 13 */ Op->Asl.AcpiBtype,
+ /* 14 */ Op->Asl.FinalAmlLength,
+ /* 15 */ Op->Asl.Column,
+ /* 16 */ Op->Asl.LineNumber);
+
+ /* Generate the AML for this node */
+
+ CgWriteNode (Op);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CgLocalWriteAmlData
+ *
+ * PARAMETERS: Op - Current parse op
+ * Buffer - Buffer to write
+ * Length - Size of data in buffer
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Write a buffer of AML data to the AML output file.
+ *
+ ******************************************************************************/
+
+static void
+CgLocalWriteAmlData (
+ ACPI_PARSE_OBJECT *Op,
+ void *Buffer,
+ UINT32 Length)
+{
+
+ /* Write the raw data to the AML file */
+
+ FlWriteFile (ASL_FILE_AML_OUTPUT, Buffer, Length);
+
+ /* Update the final AML length for this node (used for listings) */
+
+ if (Op)
+ {
+ Op->Asl.FinalAmlLength += Length;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CgWriteAmlOpcode
+ *
+ * PARAMETERS: Op - Parse node with an AML opcode
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Write the AML opcode corresponding to a parse node.
+ *
+ ******************************************************************************/
+
+static void
+CgWriteAmlOpcode (
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT8 PkgLenFirstByte;
+ UINT32 i;
+ union {
+ UINT16 Opcode;
+ UINT8 OpcodeBytes[2];
+ } Aml;
+ union {
+ UINT32 Len;
+ UINT8 LenBytes[4];
+ } PkgLen;
+
+
+ /* We expect some DEFAULT_ARGs, just ignore them */
+
+ if (Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+ {
+ return;
+ }
+
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_UNASSIGNED_OPCODE:
+
+ /* These opcodes should not get here */
+
+ printf ("Found a node with an unassigned AML opcode\n");
+ fprintf (stderr, "Found a node with an unassigned AML opcode\n");
+ return;
+
+ case AML_INT_RESERVEDFIELD_OP:
+
+ /* Special opcodes for within a field definition */
+
+ Aml.Opcode = 0x00;
+ break;
+
+ case AML_INT_ACCESSFIELD_OP:
+
+ Aml.Opcode = 0x01;
+ break;
+
+ default:
+ Aml.Opcode = Op->Asl.AmlOpcode;
+ break;
+ }
+
+
+ switch (Aml.Opcode)
+ {
+ case AML_PACKAGE_LENGTH:
+
+ /* Value is the length to be encoded (Used in field definitions) */
+
+ PkgLen.Len = (UINT32) Op->Asl.Value.Integer;
+ break;
+
+ default:
+
+ /* Check for two-byte opcode */
+
+ if (Aml.Opcode > 0x00FF)
+ {
+ /* Write the high byte first */
+
+ CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[1], 1);
+ }
+
+ CgLocalWriteAmlData (Op, &Aml.OpcodeBytes[0], 1);
+
+ /* Subtreelength doesn't include length of package length bytes */
+
+ PkgLen.Len = Op->Asl.AmlSubtreeLength + Op->Asl.AmlPkgLenBytes;
+ break;
+ }
+
+ /* Does this opcode have an associated "PackageLength" field? */
+
+ if (Op->Asl.CompileFlags & NODE_AML_PACKAGE)
+ {
+ if (Op->Asl.AmlPkgLenBytes == 1)
+ {
+ /* Simplest case -- no bytes to follow, just write the count */
+
+ CgLocalWriteAmlData (Op, &PkgLen.LenBytes[0], 1);
+ }
+ else if (Op->Asl.AmlPkgLenBytes != 0)
+ {
+ /*
+ * Encode the "bytes to follow" in the first byte, top two bits.
+ * The low-order nybble of the length is in the bottom 4 bits
+ */
+ PkgLenFirstByte = (UINT8)
+ (((UINT32) (Op->Asl.AmlPkgLenBytes - 1) << 6) |
+ (PkgLen.LenBytes[0] & 0x0F));
+
+ CgLocalWriteAmlData (Op, &PkgLenFirstByte, 1);
+
+ /*
+ * Shift the length over by the 4 bits we just stuffed
+ * in the first byte
+ */
+ PkgLen.Len >>= 4;
+
+ /* Now we can write the remaining bytes - either 1, 2, or 3 bytes */
+
+ for (i = 0; i < (UINT32) (Op->Asl.AmlPkgLenBytes - 1); i++)
+ {
+ CgLocalWriteAmlData (Op, &PkgLen.LenBytes[i], 1);
+ }
+ }
+ }
+
+ switch (Aml.Opcode)
+ {
+ case AML_BYTE_OP:
+
+ CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 1);
+ break;
+
+ case AML_WORD_OP:
+
+ CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 2);
+ break;
+
+ case AML_DWORD_OP:
+
+ CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 4);
+ break;
+
+ case AML_QWORD_OP:
+
+ CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, 8);
+ break;
+
+ case AML_STRING_OP:
+
+ CgLocalWriteAmlData (Op, Op->Asl.Value.String, Op->Asl.AmlLength);
+ break;
+
+ default:
+ /* All data opcodes must appear above */
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CgWriteTableHeader
+ *
+ * PARAMETERS: Op - The DEFINITIONBLOCK node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Write a table header corresponding to the DEFINITIONBLOCK
+ *
+ ******************************************************************************/
+
+static void
+CgWriteTableHeader (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Child;
+
+
+ /* AML filename */
+
+ Child = Op->Asl.Child;
+
+ /* Signature */
+
+ Child = Child->Asl.Next;
+ strncpy (TableHeader.Signature, Child->Asl.Value.String, 4);
+
+ /* Revision */
+
+ Child = Child->Asl.Next;
+ TableHeader.Revision = (UINT8) Child->Asl.Value.Integer;
+
+ /* Command-line Revision override */
+
+ if (Gbl_RevisionOverride)
+ {
+ TableHeader.Revision = Gbl_RevisionOverride;
+ }
+
+ /* OEMID */
+
+ Child = Child->Asl.Next;
+ strncpy (TableHeader.OemId, Child->Asl.Value.String, 6);
+
+ /* OEM TableID */
+
+ Child = Child->Asl.Next;
+ strncpy (TableHeader.OemTableId, Child->Asl.Value.String, 8);
+
+ /* OEM Revision */
+
+ Child = Child->Asl.Next;
+ TableHeader.OemRevision = (UINT32) Child->Asl.Value.Integer;
+
+ /* Compiler ID */
+
+ strncpy (TableHeader.AslCompilerId, CompilerCreatorId, 4);
+
+ /* Compiler version */
+
+ TableHeader.AslCompilerRevision = CompilerCreatorRevision;
+
+ /* Table length. Checksum zero for now, will rewrite later */
+
+ TableHeader.Length = Gbl_TableLength;
+ TableHeader.Checksum = 0;
+
+ CgLocalWriteAmlData (Op, &TableHeader, sizeof (ACPI_TABLE_HEADER));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CgCloseTable
+ *
+ * PARAMETERS: None.
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Complete the ACPI table by calculating the checksum and
+ * re-writing the header.
+ *
+ ******************************************************************************/
+
+static void
+CgCloseTable (
+ void)
+{
+ signed char Sum;
+ UINT8 FileByte;
+
+
+ FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
+ Sum = 0;
+
+ /* Calculate the checksum over the entire file */
+
+ while (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1) == AE_OK)
+ {
+ Sum = (signed char) (Sum + FileByte);
+ }
+
+ /* Re-write the table header with the checksum */
+
+ TableHeader.Checksum = (UINT8) (0 - Sum);
+
+ FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
+ CgLocalWriteAmlData (NULL, &TableHeader, sizeof (ACPI_TABLE_HEADER));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CgWriteNode
+ *
+ * PARAMETERS: Op - Parse node to write.
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Write the AML that corresponds to a parse node.
+ *
+ ******************************************************************************/
+
+static void
+CgWriteNode (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ASL_RESOURCE_NODE *Rnode;
+
+
+ /* Always check for DEFAULT_ARG and other "Noop" nodes */
+ /* TBD: this may not be the best place for this check */
+
+ if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) ||
+ (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL) ||
+ (Op->Asl.ParseOpcode == PARSEOP_INCLUDE) ||
+ (Op->Asl.ParseOpcode == PARSEOP_INCLUDE_END))
+ {
+ return;
+ }
+
+ Op->Asl.FinalAmlLength = 0;
+
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_RAW_DATA_BYTE:
+ case AML_RAW_DATA_WORD:
+ case AML_RAW_DATA_DWORD:
+ case AML_RAW_DATA_QWORD:
+
+ CgLocalWriteAmlData (Op, &Op->Asl.Value.Integer, Op->Asl.AmlLength);
+ return;
+
+
+ case AML_RAW_DATA_BUFFER:
+
+ CgLocalWriteAmlData (Op, Op->Asl.Value.Buffer, Op->Asl.AmlLength);
+ return;
+
+
+ case AML_RAW_DATA_CHAIN:
+
+ Rnode = ACPI_CAST_PTR (ASL_RESOURCE_NODE, Op->Asl.Value.Buffer);
+ while (Rnode)
+ {
+ CgLocalWriteAmlData (Op, Rnode->Buffer, Rnode->BufferLength);
+ Rnode = Rnode->Next;
+ }
+ return;
+
+ default:
+ /* Internal data opcodes must all appear above */
+ break;
+ }
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_DEFAULT_ARG:
+
+ break;
+
+ case PARSEOP_DEFINITIONBLOCK:
+
+ CgWriteTableHeader (Op);
+ break;
+
+ case PARSEOP_NAMESEG:
+ case PARSEOP_NAMESTRING:
+ case PARSEOP_METHODCALL:
+
+ CgLocalWriteAmlData (Op, Op->Asl.Value.String, Op->Asl.AmlLength);
+ break;
+
+ default:
+
+ CgWriteAmlOpcode (Op);
+ break;
+ }
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslcompile.c b/sys/contrib/dev/acpica/compiler/aslcompile.c
new file mode 100644
index 0000000..eba3552
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslcompile.c
@@ -0,0 +1,929 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslcompile - top level compile module
+ * $Revision: 1.97 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <time.h>
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslcompile")
+
+/* Local prototypes */
+
+static void
+CmFlushSourceCode (
+ void);
+
+static ACPI_STATUS
+FlCheckForAscii (
+ ASL_FILE_INFO *FileInfo);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslCompilerSignon
+ *
+ * PARAMETERS: FileId - ID of the output file
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display compiler signon
+ *
+ ******************************************************************************/
+
+void
+AslCompilerSignon (
+ UINT32 FileId)
+{
+ char *Prefix = "";
+
+
+ /* Set line prefix depending on the destination file type */
+
+ switch (FileId)
+ {
+ case ASL_FILE_ASM_SOURCE_OUTPUT:
+ case ASL_FILE_ASM_INCLUDE_OUTPUT:
+
+ Prefix = "; ";
+ break;
+
+ case ASL_FILE_HEX_OUTPUT:
+
+ if (Gbl_HexOutputFlag == HEX_OUTPUT_ASM)
+ {
+ Prefix = "; ";
+ }
+ else if (Gbl_HexOutputFlag == HEX_OUTPUT_C)
+ {
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, "/*\n");
+ Prefix = " * ";
+ }
+ break;
+
+ case ASL_FILE_C_SOURCE_OUTPUT:
+ case ASL_FILE_C_INCLUDE_OUTPUT:
+
+ Prefix = " * ";
+ break;
+
+ default:
+ /* No other output types supported */
+ break;
+ }
+
+ /*
+ * Compiler signon with copyright
+ */
+ FlPrintFile (FileId,
+ "%s\n%s%s\n%s",
+ Prefix,
+ Prefix, IntelAcpiCA,
+ Prefix);
+
+ /* Running compiler or disassembler? */
+
+ if (Gbl_DisasmFlag)
+ {
+ FlPrintFile (FileId,
+ "%s", DisassemblerId);
+ }
+ else
+ {
+ FlPrintFile (FileId,
+ "%s", CompilerId);
+ }
+
+ /* Version, build date, copyright, compliance */
+
+ FlPrintFile (FileId,
+ " version %X [%s]\n%s%s\n%s%s\n%s\n",
+ (UINT32) ACPI_CA_VERSION, __DATE__,
+ Prefix, CompilerCopyright,
+ Prefix, CompilerCompliance,
+ Prefix);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslCompilerFileHeader
+ *
+ * PARAMETERS: FileId - ID of the output file
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Header used at the beginning of output files
+ *
+ ******************************************************************************/
+
+void
+AslCompilerFileHeader (
+ UINT32 FileId)
+{
+ struct tm *NewTime;
+ time_t Aclock;
+ char *Prefix = "";
+
+
+ /* Set line prefix depending on the destination file type */
+
+ switch (FileId)
+ {
+ case ASL_FILE_ASM_SOURCE_OUTPUT:
+ case ASL_FILE_ASM_INCLUDE_OUTPUT:
+
+ Prefix = "; ";
+ break;
+
+ case ASL_FILE_HEX_OUTPUT:
+
+ if (Gbl_HexOutputFlag == HEX_OUTPUT_ASM)
+ {
+ Prefix = "; ";
+ }
+ else if (Gbl_HexOutputFlag == HEX_OUTPUT_C)
+ {
+ Prefix = " * ";
+ }
+ break;
+
+ case ASL_FILE_C_SOURCE_OUTPUT:
+ case ASL_FILE_C_INCLUDE_OUTPUT:
+
+ Prefix = " * ";
+ break;
+
+ default:
+ /* No other output types supported */
+ break;
+ }
+
+ /* Compilation header with timestamp */
+
+ (void) time (&Aclock);
+ NewTime = localtime (&Aclock);
+
+ FlPrintFile (FileId,
+ "%sCompilation of \"%s\" - %s%s\n",
+ Prefix, Gbl_Files[ASL_FILE_INPUT].Filename, asctime (NewTime),
+ Prefix);
+
+ switch (FileId)
+ {
+ case ASL_FILE_C_SOURCE_OUTPUT:
+ case ASL_FILE_C_INCLUDE_OUTPUT:
+ FlPrintFile (FileId, " */\n");
+ break;
+
+ default:
+ /* Nothing to do for other output types */
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CmFlushSourceCode
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Read in any remaining source code after the parse tree
+ * has been constructed.
+ *
+ ******************************************************************************/
+
+static void
+CmFlushSourceCode (
+ void)
+{
+ char Buffer;
+
+
+ while (FlReadFile (ASL_FILE_INPUT, &Buffer, 1) != AE_ERROR)
+ {
+ InsertLineBuffer ((int) Buffer);
+ }
+
+ ResetCurrentLineBuffer ();
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlConsume*
+ *
+ * PARAMETERS: FileInfo - Points to an open input file
+ *
+ * RETURN: Number of lines consumed
+ *
+ * DESCRIPTION: Step over both types of comment during check for ascii chars
+ *
+ ******************************************************************************/
+
+void
+FlConsumeAnsiComment (
+ ASL_FILE_INFO *FileInfo,
+ ASL_FILE_STATUS *Status)
+{
+ UINT8 Byte;
+ BOOLEAN ClosingComment = FALSE;
+
+
+ while (fread (&Byte, 1, 1, FileInfo->Handle))
+ {
+ /* Scan until comment close is found */
+
+ if (ClosingComment)
+ {
+ if (Byte == '/')
+ {
+ return;
+ }
+
+ if (Byte != '*')
+ {
+ /* Reset */
+
+ ClosingComment = FALSE;
+ }
+ }
+ else if (Byte == '*')
+ {
+ ClosingComment = TRUE;
+ }
+
+ /* Maintain line count */
+
+ if (Byte == 0x0A)
+ {
+ Status->Line++;
+ }
+
+ Status->Offset++;
+ }
+}
+
+
+void
+FlConsumeNewComment (
+ ASL_FILE_INFO *FileInfo,
+ ASL_FILE_STATUS *Status)
+{
+ UINT8 Byte;
+
+
+ while (fread (&Byte, 1, 1, FileInfo->Handle))
+ {
+ Status->Offset++;
+
+ /* Comment ends at newline */
+
+ if (Byte == 0x0A)
+ {
+ Status->Line++;
+ return;
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlCheckForAscii
+ *
+ * PARAMETERS: FileInfo - Points to an open input file
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Verify that the input file is entirely ASCII. Ignores characters
+ * within comments. Note: does not handle nested comments and does
+ * not handle comment delimiters within string literals. However,
+ * on the rare chance this happens and an invalid character is
+ * missed, the parser will catch the error by failing in some
+ * spectactular manner.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+FlCheckForAscii (
+ ASL_FILE_INFO *FileInfo)
+{
+ UINT8 Byte;
+ ACPI_SIZE BadBytes = 0;
+ BOOLEAN OpeningComment = FALSE;
+ ASL_FILE_STATUS Status;
+
+
+ Status.Line = 1;
+ Status.Offset = 0;
+
+ /* Read the entire file */
+
+ while (fread (&Byte, 1, 1, FileInfo->Handle))
+ {
+ /* Ignore comment fields (allow non-ascii within) */
+
+ if (OpeningComment)
+ {
+ /* Check for second comment open delimiter */
+
+ if (Byte == '*')
+ {
+ FlConsumeAnsiComment (FileInfo, &Status);
+ }
+
+ if (Byte == '/')
+ {
+ FlConsumeNewComment (FileInfo, &Status);
+ }
+
+ /* Reset */
+
+ OpeningComment = FALSE;
+ }
+ else if (Byte == '/')
+ {
+ OpeningComment = TRUE;
+ }
+
+ /* Check for an ASCII character */
+
+ if (!isascii (Byte))
+ {
+ if (BadBytes < 10)
+ {
+ AcpiOsPrintf (
+ "Non-ASCII character [0x%2.2X] found in line %u, file offset 0x%.2X\n",
+ Byte, Status.Line, Status.Offset);
+ }
+
+ BadBytes++;
+ }
+
+ /* Update line counter */
+
+ else if (Byte == 0x0A)
+ {
+ Status.Line++;
+ }
+
+ Status.Offset++;
+ }
+
+ /* Seek back to the beginning of the source file */
+
+ fseek (FileInfo->Handle, 0, SEEK_SET);
+
+ /* Were there any non-ASCII characters in the file? */
+
+ if (BadBytes)
+ {
+ AcpiOsPrintf (
+ "%u non-ASCII characters found in input source text, could be a binary file\n",
+ BadBytes);
+ AslError (ASL_ERROR, ASL_MSG_NON_ASCII, NULL, FileInfo->Filename);
+ return (AE_BAD_CHARACTER);
+ }
+
+ /* File is OK */
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CmDoCompile
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status (0 = OK)
+ *
+ * DESCRIPTION: This procedure performs the entire compile
+ *
+ ******************************************************************************/
+
+int
+CmDoCompile (
+ void)
+{
+ ACPI_STATUS Status;
+ UINT8 FullCompile;
+ UINT8 Event;
+
+
+ FullCompile = UtBeginEvent ("*** Total Compile time ***");
+ Event = UtBeginEvent ("Open input and output files");
+
+ /* Open the required input and output files */
+
+ Status = FlOpenInputFile (Gbl_Files[ASL_FILE_INPUT].Filename);
+ if (ACPI_FAILURE (Status))
+ {
+ AePrintErrorLog (ASL_FILE_STDERR);
+ return -1;
+ }
+
+ /* Check for 100% ASCII source file (comments are ignored) */
+
+ Status = FlCheckForAscii (&Gbl_Files[ASL_FILE_INPUT]);
+ if (ACPI_FAILURE (Status))
+ {
+ AePrintErrorLog (ASL_FILE_STDERR);
+ return -1;
+ }
+
+ Status = FlOpenMiscOutputFiles (Gbl_OutputFilenamePrefix);
+ if (ACPI_FAILURE (Status))
+ {
+ AePrintErrorLog (ASL_FILE_STDERR);
+ return -1;
+ }
+ UtEndEvent (Event);
+
+ /* Build the parse tree */
+
+ Event = UtBeginEvent ("Parse source code and build parse tree");
+ AslCompilerparse();
+ UtEndEvent (Event);
+
+ /* Flush out any remaining source after parse tree is complete */
+
+ Event = UtBeginEvent ("Flush source input");
+ CmFlushSourceCode ();
+
+ /* Did the parse tree get successfully constructed? */
+
+ if (!RootNode)
+ {
+ CmCleanupAndExit ();
+ return -1;
+ }
+
+ /* Optional parse tree dump, compiler debug output only */
+
+ LsDumpParseTree ();
+
+ OpcGetIntegerWidth (RootNode);
+ UtEndEvent (Event);
+
+ /* Pre-process parse tree for any operator transforms */
+
+ Event = UtBeginEvent ("Parse tree transforms");
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nParse tree transforms\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
+ TrAmlTransformWalk, NULL, NULL);
+ UtEndEvent (Event);
+
+ /* Generate AML opcodes corresponding to the parse tokens */
+
+ Event = UtBeginEvent ("Generate AML opcodes");
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nGenerating AML opcodes\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,
+ OpcAmlOpcodeWalk, NULL);
+ UtEndEvent (Event);
+
+ /*
+ * Now that the input is parsed, we can open the AML output file.
+ * Note: by default, the name of this file comes from the table descriptor
+ * within the input file.
+ */
+ Event = UtBeginEvent ("Open AML output file");
+ Status = FlOpenAmlOutputFile (Gbl_OutputFilenamePrefix);
+ if (ACPI_FAILURE (Status))
+ {
+ AePrintErrorLog (ASL_FILE_STDERR);
+ return -1;
+ }
+ UtEndEvent (Event);
+
+ /* Interpret and generate all compile-time constants */
+
+ Event = UtBeginEvent ("Constant folding via AML interpreter");
+ DbgPrint (ASL_DEBUG_OUTPUT,
+ "\nInterpreting compile-time constant expressions\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
+ OpcAmlConstantWalk, NULL, NULL);
+ UtEndEvent (Event);
+
+ /* Update AML opcodes if necessary, after constant folding */
+
+ Event = UtBeginEvent ("Updating AML opcodes after constant folding");
+ DbgPrint (ASL_DEBUG_OUTPUT,
+ "\nUpdating AML opcodes after constant folding\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD,
+ NULL, OpcAmlOpcodeUpdateWalk, NULL);
+ UtEndEvent (Event);
+
+ /* Calculate all AML package lengths */
+
+ Event = UtBeginEvent ("Generate AML package lengths");
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nGenerating Package lengths\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,
+ LnPackageLengthWalk, NULL);
+ UtEndEvent (Event);
+
+ if (Gbl_ParseOnlyFlag)
+ {
+ AePrintErrorLog (ASL_FILE_STDOUT);
+ UtDisplaySummary (ASL_FILE_STDOUT);
+ if (Gbl_DebugFlag)
+ {
+ /* Print error summary to the debug file */
+
+ AePrintErrorLog (ASL_FILE_STDERR);
+ UtDisplaySummary (ASL_FILE_STDERR);
+ }
+ return 0;
+ }
+
+ /*
+ * Create an internal namespace and use it as a symbol table
+ */
+
+ /* Namespace loading */
+
+ Event = UtBeginEvent ("Create ACPI Namespace");
+ Status = LdLoadNamespace (RootNode);
+ UtEndEvent (Event);
+ if (ACPI_FAILURE (Status))
+ {
+ return -1;
+ }
+
+ /* Namespace cross-reference */
+
+ AslGbl_NamespaceEvent = UtBeginEvent ("Cross reference parse tree and Namespace");
+ Status = LkCrossReferenceNamespace ();
+ if (ACPI_FAILURE (Status))
+ {
+ return -1;
+ }
+
+ /* Namespace - Check for non-referenced objects */
+
+ LkFindUnreferencedObjects ();
+ UtEndEvent (AslGbl_NamespaceEvent);
+
+ /*
+ * Semantic analysis. This can happen only after the
+ * namespace has been loaded and cross-referenced.
+ *
+ * part one - check control methods
+ */
+ Event = UtBeginEvent ("Analyze control method return types");
+ AnalysisWalkInfo.MethodStack = NULL;
+
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - Method analysis\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE,
+ AnMethodAnalysisWalkBegin,
+ AnMethodAnalysisWalkEnd, &AnalysisWalkInfo);
+ UtEndEvent (Event);
+
+ /* Semantic error checking part two - typing of method returns */
+
+ Event = UtBeginEvent ("Determine object types returned by methods");
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - Method typing\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE,
+ AnMethodTypingWalkBegin,
+ AnMethodTypingWalkEnd, NULL);
+ UtEndEvent (Event);
+
+ /* Semantic error checking part three - operand type checking */
+
+ Event = UtBeginEvent ("Analyze AML operand types");
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - Operand type checking\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE,
+ AnOperandTypecheckWalkBegin,
+ AnOperandTypecheckWalkEnd, &AnalysisWalkInfo);
+ UtEndEvent (Event);
+
+ /* Semantic error checking part four - other miscellaneous checks */
+
+ Event = UtBeginEvent ("Miscellaneous analysis");
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nSemantic analysis - miscellaneous\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE,
+ AnOtherSemanticAnalysisWalkBegin,
+ AnOtherSemanticAnalysisWalkEnd, &AnalysisWalkInfo);
+ UtEndEvent (Event);
+
+ /* Calculate all AML package lengths */
+
+ Event = UtBeginEvent ("Finish AML package length generation");
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nGenerating Package lengths\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,
+ LnInitLengthsWalk, NULL);
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_UPWARD, NULL,
+ LnPackageLengthWalk, NULL);
+ UtEndEvent (Event);
+
+ /* Code generation - emit the AML */
+
+ Event = UtBeginEvent ("Generate AML code and write output files");
+ CgGenerateAmlOutput ();
+ UtEndEvent (Event);
+
+ Event = UtBeginEvent ("Write optional output files");
+ CmDoOutputFiles ();
+ UtEndEvent (Event);
+
+ UtEndEvent (FullCompile);
+ CmCleanupAndExit ();
+ return 0;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CmDoOutputFiles
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Create all "listing" type files
+ *
+ ******************************************************************************/
+
+void
+CmDoOutputFiles (
+ void)
+{
+
+ /* Create listings and hex files */
+
+ LsDoListings ();
+ LsDoHexOutput ();
+
+ /* Dump the namespace to the .nsp file if requested */
+
+ (void) LsDisplayNamespace ();
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CmDumpEvent
+ *
+ * PARAMETERS: Event - A compiler event struct
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Dump a compiler event struct
+ *
+ ******************************************************************************/
+
+static void
+CmDumpEvent (
+ ASL_EVENT_INFO *Event)
+{
+ UINT32 Delta;
+ UINT32 USec;
+ UINT32 MSec;
+
+ if (!Event->Valid)
+ {
+ return;
+ }
+
+ /* Delta will be in 100-nanosecond units */
+
+ Delta = (UINT32) (Event->EndTime - Event->StartTime);
+
+ USec = Delta / 10;
+ MSec = Delta / 10000;
+
+ /* Round milliseconds up */
+
+ if ((USec - (MSec * 1000)) >= 500)
+ {
+ MSec++;
+ }
+
+ DbgPrint (ASL_DEBUG_OUTPUT, "%8u usec %8u msec - %s\n",
+ USec, MSec, Event->EventName);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CmCleanupAndExit
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Close all open files and exit the compiler
+ *
+ ******************************************************************************/
+
+void
+CmCleanupAndExit (
+ void)
+{
+ UINT32 i;
+
+
+ AePrintErrorLog (ASL_FILE_STDOUT);
+ if (Gbl_DebugFlag)
+ {
+ /* Print error summary to the debug file */
+
+ AePrintErrorLog (ASL_FILE_STDERR);
+ }
+
+ DbgPrint (ASL_DEBUG_OUTPUT, "\n\nElapsed time for major events\n\n");
+ for (i = 0; i < AslGbl_NextEvent; i++)
+ {
+ CmDumpEvent (&AslGbl_Events[i]);
+ }
+
+ if (Gbl_CompileTimesFlag)
+ {
+ printf ("\nElapsed time for major events\n\n");
+ for (i = 0; i < AslGbl_NextEvent; i++)
+ {
+ CmDumpEvent (&AslGbl_Events[i]);
+ }
+
+ printf ("\nMiscellaneous compile statistics\n\n");
+ printf ("%11u : %s\n", TotalParseNodes, "Parse nodes");
+ printf ("%11u : %s\n", Gbl_NsLookupCount, "Namespace searches");
+ printf ("%11u : %s\n", TotalNamedObjects, "Named objects");
+ printf ("%11u : %s\n", TotalMethods, "Control methods");
+ printf ("%11u : %s\n", TotalAllocations, "Memory Allocations");
+ printf ("%11u : %s\n", TotalAllocated, "Total allocated memory");
+ printf ("%11u : %s\n", TotalFolds, "Constant subtrees folded");
+ printf ("\n");
+ }
+
+ if (Gbl_NsLookupCount)
+ {
+ DbgPrint (ASL_DEBUG_OUTPUT, "\n\nMiscellaneous compile statistics\n\n");
+ DbgPrint (ASL_DEBUG_OUTPUT, "%32s : %d\n", "Total Namespace searches",
+ Gbl_NsLookupCount);
+ DbgPrint (ASL_DEBUG_OUTPUT, "%32s : %d usec\n", "Time per search",
+ ((UINT32) (AslGbl_Events[AslGbl_NamespaceEvent].EndTime -
+ AslGbl_Events[AslGbl_NamespaceEvent].StartTime) /
+ 10) / Gbl_NsLookupCount);
+ }
+
+ /* Close all open files */
+
+ for (i = 2; i < ASL_MAX_FILE_TYPE; i++)
+ {
+ FlCloseFile (i);
+ }
+
+ /*
+ * TBD: SourceOutput should be .TMP, then rename if we want to keep it?
+ */
+ if (!Gbl_SourceOutputFlag)
+ {
+ remove (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Filename);
+ }
+
+ /* Delete AML file if there are errors */
+
+ if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors))
+ {
+ remove (Gbl_Files[ASL_FILE_AML_OUTPUT].Filename);
+ }
+
+ if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
+ {
+ printf ("\nMaximum error count (%d) exceeded\n", ASL_MAX_ERROR_COUNT);
+ }
+
+ UtDisplaySummary (ASL_FILE_STDOUT);
+
+ /*
+ * Return non-zero exit code if there have been errors, unless the
+ * global ignore error flag has been set
+ */
+ if ((Gbl_ExceptionCount[ASL_ERROR] > 0) && (!Gbl_IgnoreErrors))
+ {
+ exit (1);
+ }
+ exit (0);
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.h b/sys/contrib/dev/acpica/compiler/aslcompiler.h
new file mode 100644
index 0000000..6477665
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslcompiler.h
@@ -0,0 +1,913 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslcompiler.h - common include file for iASL
+ * $Revision: 1.148 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#ifndef __ASLCOMPILER_H
+#define __ASLCOMPILER_H
+
+
+/* Microsoft-specific */
+
+#if (defined WIN32 || defined WIN64)
+
+/* warn : used #pragma pack */
+#pragma warning(disable:4103)
+
+/* warn : named type definition in parentheses */
+#pragma warning(disable:4115)
+#endif
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <string.h>
+#include <errno.h>
+#include <ctype.h>
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlresrc.h>
+#include <contrib/dev/acpica/acdebug.h>
+
+/* Compiler headers */
+
+#include <contrib/dev/acpica/compiler/asldefine.h>
+#include <contrib/dev/acpica/compiler/asltypes.h>
+#include <contrib/dev/acpica/compiler/aslglobal.h>
+
+
+/*******************************************************************************
+ *
+ * Compiler prototypes
+ *
+ ******************************************************************************/
+
+/*
+ * parser - generated from flex/bison, lex/yacc, etc.
+ */
+int
+AslCompilerparse(
+ void);
+
+ACPI_PARSE_OBJECT *
+AslDoError (
+ void);
+
+int
+AslCompilerlex(
+ void);
+
+void
+ResetCurrentLineBuffer (
+ void);
+
+void
+InsertLineBuffer (
+ int SourceChar);
+
+int
+AslPopInputFileStack (
+ void);
+
+void
+AslPushInputFileStack (
+ FILE *InputFile,
+ char *Filename);
+
+
+/*
+ * aslcompile - compile mainline
+ */
+void
+AslCompilerSignon (
+ UINT32 FileId);
+
+void
+AslCompilerFileHeader (
+ UINT32 FileId);
+
+int
+CmDoCompile (
+ void);
+
+void
+CmDoOutputFiles (
+ void);
+
+void
+CmCleanupAndExit (
+ void);
+
+
+/*
+ * aslanalyze - semantic analysis
+ */
+ACPI_STATUS
+AnOtherSemanticAnalysisWalkBegin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+ACPI_STATUS
+AnOtherSemanticAnalysisWalkEnd (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+ACPI_STATUS
+AnOperandTypecheckWalkBegin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+ACPI_STATUS
+AnOperandTypecheckWalkEnd (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+ACPI_STATUS
+AnMethodAnalysisWalkBegin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+ACPI_STATUS
+AnMethodAnalysisWalkEnd (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+ACPI_STATUS
+AnMethodTypingWalkBegin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+ACPI_STATUS
+AnMethodTypingWalkEnd (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+
+/*
+ * aslerror - error handling/reporting
+ */
+void
+AslError (
+ UINT8 Level,
+ UINT8 MessageId,
+ ACPI_PARSE_OBJECT *Op,
+ char *ExtraMessage);
+
+void
+AslCoreSubsystemError (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_STATUS Status,
+ char *ExtraMessage,
+ BOOLEAN Abort);
+
+int
+AslCompilererror(
+ char *s);
+
+void
+AslCommonError (
+ UINT8 Level,
+ UINT8 MessageId,
+ UINT32 CurrentLineNumber,
+ UINT32 LogicalLineNumber,
+ UINT32 LogicalByteOffset,
+ UINT32 Column,
+ char *Filename,
+ char *ExtraMessage);
+
+void
+AePrintException (
+ UINT32 FileId,
+ ASL_ERROR_MSG *Enode,
+ char *Header);
+
+void
+AePrintErrorLog (
+ UINT32 FileId);
+
+ACPI_PHYSICAL_ADDRESS
+AeLocalGetRootPointer (
+ void);
+
+
+/*
+ * asllisting - generate all "listing" type files
+ */
+void
+LsDoListings (
+ void);
+
+void
+LsWriteNodeToAsmListing (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+LsWriteNode (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 FileId);
+
+void
+LsDoHexOutput (
+ void);
+
+void
+LsDumpParseTree (
+ void);
+
+/*
+ * aslfold - constant folding
+ */
+ACPI_STATUS
+OpcAmlConstantWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+
+/*
+ * aslopcodes - generate AML opcodes
+ */
+ACPI_STATUS
+OpcAmlOpcodeWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+ACPI_STATUS
+OpcAmlOpcodeUpdateWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+void
+OpcGenerateAmlOpcode (
+ ACPI_PARSE_OBJECT *Op);
+
+UINT32
+OpcSetOptimalIntegerSize (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+OpcGetIntegerWidth (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * asloperands - generate AML operands for the AML opcodes
+ */
+ACPI_PARSE_OBJECT *
+UtGetArg (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Argn);
+
+void
+OpnGenerateAmlOperands (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+OpnDoPackage (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * aslopt - optmization
+ */
+void
+OptOptimizeNamePath (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Flags,
+ ACPI_WALK_STATE *WalkState,
+ char *AmlNameString,
+ ACPI_NAMESPACE_NODE *TargetNode);
+
+
+/*
+ * aslcodegen - code generation
+ */
+void
+CgGenerateAmlOutput (
+ void);
+
+
+/*
+ * asllength - calculate/adjust AML package lengths
+ */
+ACPI_STATUS
+LnPackageLengthWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+ACPI_STATUS
+LnInitLengthsWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+void
+CgGenerateAmlLengths (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * aslmap - opcode mappings and reserved method names
+ */
+ACPI_OBJECT_TYPE
+AslMapNamedOpcodeToDataType (
+ UINT16 Opcode);
+
+void
+MpDisplayReservedNames (
+ void);
+
+
+/*
+ * asltransform - parse tree transformations
+ */
+ACPI_STATUS
+TrAmlTransformWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+
+/*
+ * asltree - parse tree support
+ */
+ACPI_STATUS
+TrWalkParseTree (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Visitation,
+ ASL_WALK_CALLBACK DescendingCallback,
+ ASL_WALK_CALLBACK AscendingCallback,
+ void *Context);
+
+/* Values for "Visitation" parameter above */
+
+#define ASL_WALK_VISIT_DOWNWARD 0x01
+#define ASL_WALK_VISIT_UPWARD 0x02
+#define ASL_WALK_VISIT_TWICE (ASL_WALK_VISIT_DOWNWARD | ASL_WALK_VISIT_UPWARD)
+
+
+ACPI_PARSE_OBJECT *
+TrAllocateNode (
+ UINT32 ParseOpcode);
+
+void
+TrReleaseNode (
+ ACPI_PARSE_OBJECT *Op);
+
+ACPI_PARSE_OBJECT *
+TrUpdateNode (
+ UINT32 ParseOpcode,
+ ACPI_PARSE_OBJECT *Op);
+
+ACPI_PARSE_OBJECT *
+TrCreateNode (
+ UINT32 ParseOpcode,
+ UINT32 NumChildren,
+ ...);
+
+ACPI_PARSE_OBJECT *
+TrCreateLeafNode (
+ UINT32 ParseOpcode);
+
+ACPI_PARSE_OBJECT *
+TrCreateValuedLeafNode (
+ UINT32 ParseOpcode,
+ ACPI_INTEGER Value);
+
+ACPI_PARSE_OBJECT *
+TrLinkChildren (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 NumChildren,
+ ...);
+
+void
+TrSetEndLineNumber (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+TrWalkTree (
+ void);
+
+ACPI_PARSE_OBJECT *
+TrLinkPeerNode (
+ ACPI_PARSE_OBJECT *Op1,
+ ACPI_PARSE_OBJECT *Op2);
+
+ACPI_PARSE_OBJECT *
+TrLinkChildNode (
+ ACPI_PARSE_OBJECT *Op1,
+ ACPI_PARSE_OBJECT *Op2);
+
+ACPI_PARSE_OBJECT *
+TrSetNodeFlags (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Flags);
+
+ACPI_PARSE_OBJECT *
+TrLinkPeerNodes (
+ UINT32 NumPeers,
+ ...);
+
+
+/*
+ * aslfiles - File I/O support
+ */
+void
+AslAbort (
+ void);
+
+void
+FlOpenIncludeFile (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+FlFileError (
+ UINT32 FileId,
+ UINT8 ErrorId);
+
+ACPI_STATUS
+FlReadFile (
+ UINT32 FileId,
+ void *Buffer,
+ UINT32 Length);
+
+void
+FlWriteFile (
+ UINT32 FileId,
+ void *Buffer,
+ UINT32 Length);
+
+void
+FlSeekFile (
+ UINT32 FileId,
+ long Offset);
+
+void
+FlCloseFile (
+ UINT32 FileId);
+
+void
+FlPrintFile (
+ UINT32 FileId,
+ char *Format,
+ ...);
+
+void
+FlSetLineNumber (
+ ACPI_PARSE_OBJECT *Op);
+
+ACPI_STATUS
+FlOpenInputFile (
+ char *InputFilename);
+
+ACPI_STATUS
+FlOpenAmlOutputFile (
+ char *InputFilename);
+
+ACPI_STATUS
+FlOpenMiscOutputFiles (
+ char *InputFilename);
+
+
+/*
+ * asload - load namespace in prep for cross reference
+ */
+ACPI_STATUS
+LdLoadNamespace (
+ ACPI_PARSE_OBJECT *RootOp);
+
+
+/*
+ * asllookup - namespace cross reference
+ */
+ACPI_STATUS
+LkCrossReferenceNamespace (
+ void);
+
+void
+LkFindUnreferencedObjects (
+ void);
+
+ACPI_STATUS
+LsDisplayNamespace (
+ void);
+
+
+/*
+ * aslutils - common compiler utilites
+ */
+void
+DbgPrint (
+ UINT32 Type,
+ char *Format,
+ ...);
+
+/* Type values for above */
+
+#define ASL_DEBUG_OUTPUT 0
+#define ASL_PARSE_OUTPUT 1
+#define ASL_TREE_OUTPUT 2
+
+void
+UtDisplayConstantOpcodes (
+ void);
+
+UINT8
+UtBeginEvent (
+ char *Name);
+
+void
+UtEndEvent (
+ UINT8 Event);
+
+void *
+UtLocalCalloc (
+ UINT32 Size);
+
+void
+UtPrintFormattedName (
+ UINT16 ParseOpcode,
+ UINT32 Level);
+
+void
+UtDisplaySummary (
+ UINT32 FileId);
+
+UINT8
+UtHexCharToValue (
+ int HexChar);
+
+void
+UtConvertByteToHex (
+ UINT8 RawByte,
+ UINT8 *Buffer);
+
+void
+UtConvertByteToAsmHex (
+ UINT8 RawByte,
+ UINT8 *Buffer);
+
+char *
+UtGetOpName (
+ UINT32 ParseOpcode);
+
+void
+UtSetParseOpName (
+ ACPI_PARSE_OBJECT *Op);
+
+char *
+UtGetStringBuffer (
+ UINT32 Length);
+
+ACPI_STATUS
+UtInternalizeName (
+ char *ExternalName,
+ char **ConvertedName);
+
+void
+UtAttachNamepathToOwner (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_PARSE_OBJECT *NameNode);
+
+ACPI_PARSE_OBJECT *
+UtCheckIntegerRange (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 LowValue,
+ UINT32 HighValue);
+
+ACPI_INTEGER
+UtDoConstant (
+ char *String);
+
+
+/*
+ * aslresource - Resource template generation utilities
+ */
+ASL_RESOURCE_NODE *
+RsAllocateResourceNode (
+ UINT32 Size);
+
+void
+RsCreateBitField (
+ ACPI_PARSE_OBJECT *Op,
+ char *Name,
+ UINT32 ByteOffset,
+ UINT32 BitOffset);
+
+void
+RsCreateByteField (
+ ACPI_PARSE_OBJECT *Op,
+ char *Name,
+ UINT32 ByteOffset);
+
+void
+RsSetFlagBits (
+ UINT8 *Flags,
+ ACPI_PARSE_OBJECT *Op,
+ UINT8 Position,
+ UINT8 DefaultBit);
+
+ACPI_PARSE_OBJECT *
+RsCompleteNodeAndGetNext (
+ ACPI_PARSE_OBJECT *Op);
+
+void
+RsCheckListForDuplicates (
+ ACPI_PARSE_OBJECT *Op);
+
+ASL_RESOURCE_NODE *
+RsDoOneResourceDescriptor (
+ ACPI_PARSE_OBJECT *DescriptorTypeOp,
+ UINT32 CurrentByteOffset,
+ UINT8 *State);
+
+/* Values for State above */
+
+#define ACPI_RSTATE_NORMAL 0
+#define ACPI_RSTATE_START_DEPENDENT 1
+#define ACPI_RSTATE_DEPENDENT_LIST 2
+
+UINT32
+RsLinkDescriptorChain (
+ ASL_RESOURCE_NODE **PreviousRnode,
+ ASL_RESOURCE_NODE *Rnode);
+
+void
+RsDoResourceTemplate (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*
+ * aslrestype1 - generate Small descriptors
+ */
+ASL_RESOURCE_NODE *
+RsDoEndTagDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoDmaDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoEndDependentDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoFixedIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoIrqDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoIrqNoFlagsDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoMemory24Descriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoMemory32Descriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoMemory32FixedDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoStartDependentDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoStartDependentNoPriDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoVendorSmallDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+
+/*
+ * aslrestype2 - generate Large descriptors
+ */
+ASL_RESOURCE_NODE *
+RsDoInterruptDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoDwordIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoDwordMemoryDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoDwordSpaceDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoExtendedIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoExtendedMemoryDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoExtendedSpaceDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoQwordIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoQwordMemoryDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoQwordSpaceDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoWordIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoWordSpaceDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoWordBusNumberDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoVendorLargeDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+ASL_RESOURCE_NODE *
+RsDoGeneralRegisterDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset);
+
+#endif /* __ASLCOMPILER_H */
+
diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.l b/sys/contrib/dev/acpica/compiler/aslcompiler.l
new file mode 100644
index 0000000..78be4ea
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslcompiler.l
@@ -0,0 +1,1182 @@
+
+%{
+/******************************************************************************
+ *
+ * Module Name: aslcompiler.l - Flex input file
+ * $Revision: 1.79 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <stdlib.h>
+#include <string.h>
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+YYSTYPE AslCompilerlval;
+
+/*
+ * Generation: Use the following command line:
+ *
+ * flex.exe -PAslCompiler -i -o$(InputPath).c $(InputPath)
+ *
+ * -i: Scanner must be case-insensitive
+ */
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslscan")
+char
+comment (void);
+char
+comment2 (void);
+void
+count (int type);
+char
+literal (void);
+void
+copy (void);
+
+/*! [Begin] no source code translation */
+
+%}
+
+
+LeadNameChar [A-Za-z_]
+DigitChar [0-9]
+HexDigitChar [A-Fa-f0-9]
+RootChar [\\]
+Nothing []
+
+NameChar [A-Za-z_0-9]
+NameSeg1 {LeadNameChar}{NameChar}
+NameSeg2 {LeadNameChar}{NameChar}{NameChar}
+NameSeg3 {LeadNameChar}{NameChar}{NameChar}{NameChar}
+NameSeg {LeadNameChar}|{NameSeg1}|{NameSeg2}|{NameSeg3}
+
+NameString {RootChar}|{RootChar}{NamePath}|[\^]+{NamePath}|{NonEmptyNamePath}
+NamePath {NonEmptyNamePath}?
+NonEmptyNamePath {NameSeg}{NamePathTail}*
+NamePathTail [.]{NameSeg}
+
+%%
+
+[ ] { count (0); }
+[\n] { count (0); }
+[ \t] { count (0); }
+
+
+"/*" { if (!comment ()) yyterminate (); }
+"//" { if (!comment2 ()) yyterminate (); }
+
+"\"" { if (literal ()) return (PARSEOP_STRING_LITERAL); else yyterminate (); }
+
+
+0[xX]{HexDigitChar}+ |
+{DigitChar}+ { AslCompilerlval.i = UtDoConstant ((char *) AslCompilertext);
+ count (1); return (PARSEOP_INTEGER); }
+
+"Include" { count (1); return (PARSEOP_INCLUDE); }
+"#include" { count (1); return (PARSEOP_INCLUDE_CSTYLE); }
+"#line" { count (1); return (PARSEOP_LINE_CSTYLE); }
+"External" { count (1); return (PARSEOP_EXTERNAL); }
+
+
+"Ones" { count (1); return (PARSEOP_ONES); }
+"One" { count (1); return (PARSEOP_ONE); }
+"Zero" { count (1); return (PARSEOP_ZERO); }
+"Revision" { count (1); return (PARSEOP_REVISION); }
+
+"Offset" { count (1); return (PARSEOP_OFFSET); }
+"AccessAs" { count (1); return (PARSEOP_ACCESSAS); }
+"BankField" { count (2); return (PARSEOP_BANKFIELD); }
+"CreateBitField" { count (2); return (PARSEOP_CREATEBITFIELD); }
+"CreateByteField" { count (2); return (PARSEOP_CREATEBYTEFIELD); }
+"CreateDWordField" { count (2); return (PARSEOP_CREATEDWORDFIELD); }
+"CreateField" { count (2); return (PARSEOP_CREATEFIELD); }
+"CreateQWordField" { count (2); return (PARSEOP_CREATEQWORDFIELD); }
+"CreateWordField" { count (2); return (PARSEOP_CREATEWORDFIELD); }
+"DataTableRegion" { count (2); return (PARSEOP_DATATABLEREGION); }
+"Device" { count (2); return (PARSEOP_DEVICE); }
+"Event" { count (2); return (PARSEOP_EVENT); }
+"Field" { count (2); return (PARSEOP_FIELD); }
+"Function" { count (2); return (PARSEOP_FUNCTION); }
+"IndexField" { count (2); return (PARSEOP_INDEXFIELD); }
+"Method" { count (2); return (PARSEOP_METHOD); }
+"Mutex" { count (2); return (PARSEOP_MUTEX); }
+"OperationRegion" { count (2); return (PARSEOP_OPERATIONREGION); }
+"PowerResource" { count (2); return (PARSEOP_POWERRESOURCE); }
+"Processor" { count (2); return (PARSEOP_PROCESSOR); }
+"ThermalZone" { count (2); return (PARSEOP_THERMALZONE); }
+"Alias" { count (2); return (PARSEOP_ALIAS); }
+"Name" { count (2); return (PARSEOP_NAME); }
+"Scope" { count (2); return (PARSEOP_SCOPE); }
+"Break" { count (3); return (PARSEOP_BREAK); }
+"BreakPoint" { count (3); return (PARSEOP_BREAKPOINT); }
+"Continue" { count (3); return (PARSEOP_CONTINUE); }
+"Fatal" { count (3); return (PARSEOP_FATAL); }
+"If" { count (3); return (PARSEOP_IF); }
+"Else" { count (3); return (PARSEOP_ELSE); }
+"ElseIf" { count (3); return (PARSEOP_ELSEIF); }
+"Load" { count (3); return (PARSEOP_LOAD); }
+"Noop" { count (3); return (PARSEOP_NOOP); }
+"Notify" { count (3); return (PARSEOP_NOTIFY); }
+"Release" { count (3); return (PARSEOP_RELEASE); }
+"Reset" { count (3); return (PARSEOP_RESET); }
+"Return" { count (3); return (PARSEOP_RETURN); }
+"Signal" { count (3); return (PARSEOP_SIGNAL); }
+"Sleep" { count (3); return (PARSEOP_SLEEP); }
+"Stall" { count (3); return (PARSEOP_STALL); }
+"Switch" { count (3); return (PARSEOP_SWITCH); }
+"Case" { count (3); return (PARSEOP_CASE); }
+"Default" { count (3); return (PARSEOP_DEFAULT); }
+"Unload" { count (3); return (PARSEOP_UNLOAD); }
+"While" { count (3); return (PARSEOP_WHILE); }
+
+"Acquire" { count (3); return (PARSEOP_ACQUIRE); }
+"Add" { count (3); return (PARSEOP_ADD); }
+"And" { count (3); return (PARSEOP_AND); }
+"Concatenate" { count (3); return (PARSEOP_CONCATENATE); }
+"ConcatenateResTemplate" { count (3); return (PARSEOP_CONCATENATERESTEMPLATE); }
+"CondRefOf" { count (3); return (PARSEOP_CONDREFOF); }
+"CopyObject" { count (3); return (PARSEOP_COPYOBJECT); }
+"Decrement" { count (3); return (PARSEOP_DECREMENT); }
+"DeRefOf" { count (3); return (PARSEOP_DEREFOF); }
+"Divide" { count (3); return (PARSEOP_DIVIDE); }
+"FindSetLeftBit" { count (3); return (PARSEOP_FINDSETLEFTBIT); }
+"FindSetRightBit" { count (3); return (PARSEOP_FINDSETRIGHTBIT); }
+"FromBCD" { count (3); return (PARSEOP_FROMBCD); }
+"Increment" { count (3); return (PARSEOP_INCREMENT); }
+"Index" { count (3); return (PARSEOP_INDEX); }
+"LAnd" { count (3); return (PARSEOP_LAND); }
+"LEqual" { count (3); return (PARSEOP_LEQUAL); }
+"LGreater" { count (3); return (PARSEOP_LGREATER); }
+"LGreaterEqual" { count (3); return (PARSEOP_LGREATEREQUAL); }
+"LLess" { count (3); return (PARSEOP_LLESS); }
+"LLessEqual" { count (3); return (PARSEOP_LLESSEQUAL); }
+"LNot" { count (3); return (PARSEOP_LNOT); }
+"LNotEqual" { count (3); return (PARSEOP_LNOTEQUAL); }
+"LoadTable" { count (3); return (PARSEOP_LOADTABLE); }
+"LOr" { count (3); return (PARSEOP_LOR); }
+"Match" { count (3); return (PARSEOP_MATCH); }
+"Mid" { count (3); return (PARSEOP_MID); }
+"Mod" { count (3); return (PARSEOP_MOD); }
+"Multiply" { count (3); return (PARSEOP_MULTIPLY); }
+"NAnd" { count (3); return (PARSEOP_NAND); }
+"NOr" { count (3); return (PARSEOP_NOR); }
+"Not" { count (3); return (PARSEOP_NOT); }
+"ObjectType" { count (3); return (PARSEOP_OBJECTTYPE); }
+"Or" { count (3); return (PARSEOP_OR); }
+"RefOf" { count (3); return (PARSEOP_REFOF); }
+"ShiftLeft" { count (3); return (PARSEOP_SHIFTLEFT); }
+"ShiftRight" { count (3); return (PARSEOP_SHIFTRIGHT); }
+"SizeOf" { count (3); return (PARSEOP_SIZEOF); }
+"Store" { count (3); return (PARSEOP_STORE); }
+"Subtract" { count (3); return (PARSEOP_SUBTRACT); }
+"Timer" { count (3); return (PARSEOP_TIMER); }
+"ToBCD" { count (3); return (PARSEOP_TOBCD); }
+"ToBuffer" { count (3); return (PARSEOP_TOBUFFER); }
+"ToDecimalString" { count (3); return (PARSEOP_TODECIMALSTRING); }
+"ToHexString" { count (3); return (PARSEOP_TOHEXSTRING); }
+"ToInteger" { count (3); return (PARSEOP_TOINTEGER); }
+"ToString" { count (3); return (PARSEOP_TOSTRING); }
+"Wait" { count (3); return (PARSEOP_WAIT); }
+"XOr" { count (3); return (PARSEOP_XOR); }
+
+"Arg0" { count (1); return (PARSEOP_ARG0); }
+"Arg1" { count (1); return (PARSEOP_ARG1); }
+"Arg2" { count (1); return (PARSEOP_ARG2); }
+"Arg3" { count (1); return (PARSEOP_ARG3); }
+"Arg4" { count (1); return (PARSEOP_ARG4); }
+"Arg5" { count (1); return (PARSEOP_ARG5); }
+"Arg6" { count (1); return (PARSEOP_ARG6); }
+
+"Local0" { count (1); return (PARSEOP_LOCAL0); }
+"Local1" { count (1); return (PARSEOP_LOCAL1); }
+"Local2" { count (1); return (PARSEOP_LOCAL2); }
+"Local3" { count (1); return (PARSEOP_LOCAL3); }
+"Local4" { count (1); return (PARSEOP_LOCAL4); }
+"Local5" { count (1); return (PARSEOP_LOCAL5); }
+"Local6" { count (1); return (PARSEOP_LOCAL6); }
+"Local7" { count (1); return (PARSEOP_LOCAL7); }
+
+"Debug" { count (1); return (PARSEOP_DEBUG); }
+
+"DefinitionBlock" { count (1); return (PARSEOP_DEFINITIONBLOCK); }
+"Buffer" { count (1); return (PARSEOP_BUFFER); }
+"Package" { count (1); return (PARSEOP_PACKAGE); }
+
+"EISAID" { count (1); return (PARSEOP_EISAID); }
+"ResourceTemplate" { count (1); return (PARSEOP_RESOURCETEMPLATE); }
+"ToUUID" { count (1); return (PARSEOP_TOUUID); }
+"Unicode" { count (1); return (PARSEOP_UNICODE); }
+"DMA" { count (1); return (PARSEOP_DMA); }
+"DWordIO" { count (1); return (PARSEOP_DWORDIO); }
+"DWordMemory" { count (1); return (PARSEOP_DWORDMEMORY); }
+"DWordSpace" { count (1); return (PARSEOP_DWORDSPACE); }
+"EndDependentFn" { count (1); return (PARSEOP_ENDDEPENDENTFN); }
+"ExtendedIO" { count (1); return (PARSEOP_EXTENDEDIO); }
+"ExtendedMemory" { count (1); return (PARSEOP_EXTENDEDMEMORY); }
+"ExtendedSpace" { count (1); return (PARSEOP_EXTENDEDSPACE); }
+"FixedIO" { count (1); return (PARSEOP_FIXEDIO); }
+"Interrupt" { count (1); return (PARSEOP_INTERRUPT); }
+"IO" { count (1); return (PARSEOP_IO); }
+"IRQNoFlags" { count (1); return (PARSEOP_IRQNOFLAGS); }
+"IRQ" { count (1); return (PARSEOP_IRQ); }
+"Memory24" { count (1); return (PARSEOP_MEMORY24); }
+"Memory32Fixed" { count (1); return (PARSEOP_MEMORY32FIXED); }
+"Memory32" { count (1); return (PARSEOP_MEMORY32); }
+"QWordIO" { count (1); return (PARSEOP_QWORDIO); }
+"QWordMemory" { count (1); return (PARSEOP_QWORDMEMORY); }
+"QWordSpace" { count (1); return (PARSEOP_QWORDSPACE); }
+"Register" { count (1); return (PARSEOP_REGISTER); }
+"StartDependentFn" { count (1); return (PARSEOP_STARTDEPENDENTFN); }
+"StartDependentFnNoPri" { count (1); return (PARSEOP_STARTDEPENDENTFN_NOPRI); }
+"VendorLong" { count (1); return (PARSEOP_VENDORLONG); }
+"VendorShort" { count (1); return (PARSEOP_VENDORSHORT); }
+"WordBusNumber" { count (1); return (PARSEOP_WORDBUSNUMBER); }
+"WordIO" { count (1); return (PARSEOP_WORDIO); }
+"WordSpace" { count (1); return (PARSEOP_WORDSPACE); }
+
+"UnknownObj" { count (0); return (PARSEOP_OBJECTTYPE_UNK); }
+"IntObj" { count (0); return (PARSEOP_OBJECTTYPE_INT); }
+"StrObj" { count (0); return (PARSEOP_OBJECTTYPE_STR); }
+"BuffObj" { count (0); return (PARSEOP_OBJECTTYPE_BUF); }
+"PkgObj" { count (0); return (PARSEOP_OBJECTTYPE_PKG); }
+"FieldUnitObj" { count (0); return (PARSEOP_OBJECTTYPE_FLD); }
+"DeviceObj" { count (0); return (PARSEOP_OBJECTTYPE_DEV); }
+"EventObj" { count (0); return (PARSEOP_OBJECTTYPE_EVT); }
+"MethodObj" { count (0); return (PARSEOP_OBJECTTYPE_MTH); }
+"MutexObj" { count (0); return (PARSEOP_OBJECTTYPE_MTX); }
+"OpRegionObj" { count (0); return (PARSEOP_OBJECTTYPE_OPR); }
+"PowerResObj" { count (0); return (PARSEOP_OBJECTTYPE_POW); }
+"ProcessorObj" { count (0); return (PARSEOP_OBJECTTYPE_PRO); }
+"ThermalZoneObj" { count (0); return (PARSEOP_OBJECTTYPE_THZ); }
+"BuffFieldObj" { count (0); return (PARSEOP_OBJECTTYPE_BFF); }
+"DDBHandleObj" { count (0); return (PARSEOP_OBJECTTYPE_DDB); }
+
+"AnyAcc" { count (0); return (PARSEOP_ACCESSTYPE_ANY); }
+"ByteAcc" { count (0); return (PARSEOP_ACCESSTYPE_BYTE); }
+"WordAcc" { count (0); return (PARSEOP_ACCESSTYPE_WORD); }
+"DWordAcc" { count (0); return (PARSEOP_ACCESSTYPE_DWORD); }
+"QWordAcc" { count (0); return (PARSEOP_ACCESSTYPE_QWORD); }
+"BufferAcc" { count (0); return (PARSEOP_ACCESSTYPE_BUF); }
+
+"Lock" { count (0); return (PARSEOP_LOCKRULE_LOCK); }
+"NoLock" { count (0); return (PARSEOP_LOCKRULE_NOLOCK); }
+
+"Preserve" { count (0); return (PARSEOP_UPDATERULE_PRESERVE); }
+"WriteAsOnes" { count (0); return (PARSEOP_UPDATERULE_ONES); }
+"WriteAsZeros" { count (0); return (PARSEOP_UPDATERULE_ZEROS); }
+
+"Serialized" { count (0); return (PARSEOP_SERIALIZERULE_SERIAL); }
+"NotSerialized" { count (0); return (PARSEOP_SERIALIZERULE_NOTSERIAL); }
+
+"SystemIO" { count (0); return (PARSEOP_REGIONSPACE_IO); }
+"SystemMemory" { count (0); return (PARSEOP_REGIONSPACE_MEM); }
+"PCI_Config" { count (0); return (PARSEOP_REGIONSPACE_PCI); }
+"EmbeddedControl" { count (0); return (PARSEOP_REGIONSPACE_EC); }
+"SMBus" { count (0); return (PARSEOP_REGIONSPACE_SMBUS); }
+"SystemCMOS" { count (0); return (PARSEOP_REGIONSPACE_CMOS); }
+"PciBarTarget" { count (0); return (PARSEOP_REGIONSPACE_PCIBAR); }
+
+"FFixedHW" { count (0); return (PARSEOP_ADDRESSSPACE_FFIXEDHW); }
+
+"SMBQuick" { count (0); return (PARSEOP_ACCESSATTRIB_QUICK); }
+"SMBSendReceive" { count (0); return (PARSEOP_ACCESSATTRIB_SND_RCV); }
+"SMBByte" { count (0); return (PARSEOP_ACCESSATTRIB_BYTE); }
+"SMBWord" { count (0); return (PARSEOP_ACCESSATTRIB_WORD); }
+"SMBBlock" { count (0); return (PARSEOP_ACCESSATTRIB_BLOCK); }
+"SMBProcessCall" { count (0); return (PARSEOP_ACCESSATTRIB_WORD_CALL); }
+"SMBBlockProcessCall" { count (0); return (PARSEOP_ACCESSATTRIB_BLOCK_CALL); }
+
+"MTR" { count (0); return (PARSEOP_MATCHTYPE_MTR); }
+"MEQ" { count (0); return (PARSEOP_MATCHTYPE_MEQ); }
+"MLE" { count (0); return (PARSEOP_MATCHTYPE_MLE); }
+"MLT" { count (0); return (PARSEOP_MATCHTYPE_MLT); }
+"MGE" { count (0); return (PARSEOP_MATCHTYPE_MGE); }
+"MGT" { count (0); return (PARSEOP_MATCHTYPE_MGT); }
+
+"Compatibility" { count (0); return (PARSEOP_DMATYPE_COMPATIBILITY); }
+"TypeA" { count (0); return (PARSEOP_DMATYPE_A); }
+"TypeB" { count (0); return (PARSEOP_DMATYPE_B); }
+"TypeF" { count (0); return (PARSEOP_DMATYPE_F); }
+
+"BusMaster" { count (0); return (PARSEOP_BUSMASTERTYPE_MASTER); }
+"NotBusMaster" { count (0); return (PARSEOP_BUSMASTERTYPE_NOTMASTER); }
+
+"Transfer8" { count (0); return (PARSEOP_XFERTYPE_8); }
+"Transfer8_16" { count (0); return (PARSEOP_XFERTYPE_8_16); }
+"Transfer16" { count (0); return (PARSEOP_XFERTYPE_16); }
+
+"ResourceConsumer" { count (0); return (PARSEOP_RESOURCETYPE_CONSUMER); }
+"ResourceProducer" { count (0); return (PARSEOP_RESOURCETYPE_PRODUCER); }
+
+"MinFixed" { count (0); return (PARSEOP_MINTYPE_FIXED); }
+"MinNotFixed" { count (0); return (PARSEOP_MINTYPE_NOTFIXED); }
+
+"MaxFixed" { count (0); return (PARSEOP_MAXTYPE_FIXED); }
+"MaxNotFixed" { count (0); return (PARSEOP_MAXTYPE_NOTFIXED); }
+
+"PosDecode" { count (0); return (PARSEOP_DECODETYPE_POS); }
+"SubDecode" { count (0); return (PARSEOP_DECODETYPE_SUB); }
+
+"ISAOnlyRanges" { count (0); return (PARSEOP_RANGETYPE_ISAONLY); }
+"NonISAOnlyRanges" { count (0); return (PARSEOP_RANGETYPE_NONISAONLY); }
+"EntireRange" { count (0); return (PARSEOP_RANGETYPE_ENTIRE); }
+
+"Cacheable" { count (0); return (PARSEOP_MEMTYPE_CACHEABLE); }
+"WriteCombining" { count (0); return (PARSEOP_MEMTYPE_WRITECOMBINING); }
+"Prefetchable" { count (0); return (PARSEOP_MEMTYPE_PREFETCHABLE); }
+"NonCacheable" { count (0); return (PARSEOP_MEMTYPE_NONCACHEABLE); }
+
+"ReadWrite" { count (0); return (PARSEOP_READWRITETYPE_BOTH); }
+"ReadOnly" { count (0); return (PARSEOP_READWRITETYPE_READONLY); }
+
+"Edge" { count (0); return (PARSEOP_INTTYPE_EDGE); }
+"Level" { count (0); return (PARSEOP_INTTYPE_LEVEL); }
+
+"ActiveHigh" { count (0); return (PARSEOP_INTLEVEL_ACTIVEHIGH); }
+"ActiveLow" { count (0); return (PARSEOP_INTLEVEL_ACTIVELOW); }
+
+"Shared" { count (0); return (PARSEOP_SHARETYPE_SHARED); }
+"Exclusive" { count (0); return (PARSEOP_SHARETYPE_EXCLUSIVE); }
+
+"Decode10" { count (0); return (PARSEOP_IODECODETYPE_10); }
+"Decode16" { count (0); return (PARSEOP_IODECODETYPE_16); }
+
+"TypeTranslation" { count (0); return (PARSEOP_TYPE_TRANSLATION); }
+"TypeStatic" { count (0); return (PARSEOP_TYPE_STATIC); }
+
+"SparseTranslation" { count (0); return (PARSEOP_TRANSLATIONTYPE_SPARSE); }
+"DenseTranslation" { count (0); return (PARSEOP_TRANSLATIONTYPE_DENSE); }
+
+"AddressRangeMemory" { count (0); return (PARSEOP_ADDRESSTYPE_MEMORY); }
+"AddressRangeReserved" { count (0); return (PARSEOP_ADDRESSTYPE_RESERVED); }
+"AddressRangeNVS" { count (0); return (PARSEOP_ADDRESSTYPE_NVS); }
+"AddressRangeACPI" { count (0); return (PARSEOP_ADDRESSTYPE_ACPI); }
+
+
+"{" { count (0); return('{'); }
+"}" { count (0); return('}'); }
+"," { count (0); return(','); }
+"(" { count (0); return('('); }
+")" { count (0); return(')'); }
+
+
+{NameSeg} { char *s;
+ count (0);
+ s=malloc (ACPI_NAME_SIZE + 1);
+ if (strcmp (AslCompilertext, "\\"))
+ {
+ strcpy (s, "____");
+ AcpiUtStrupr (AslCompilertext);
+ }
+ memcpy (s, AslCompilertext, strlen (AslCompilertext));
+ AslCompilerlval.s = s;
+ DbgPrint (ASL_PARSE_OUTPUT, "NameSeg: %s\n", s);
+ return (PARSEOP_NAMESEG); }
+
+{NameString} { char *s;
+ count (0);
+ s=malloc (strlen (AslCompilertext)+1);
+ AcpiUtStrupr (AslCompilertext);
+ strcpy (s, AslCompilertext);
+ s[strlen (AslCompilertext)] = 0;
+ AslCompilerlval.s = s;
+ DbgPrint (ASL_PARSE_OUTPUT, "NameString: %s\n", s);
+ return (PARSEOP_NAMESTRING); }
+
+"*" |
+"/" { count (1);
+ AslCompilererror ("Parse error, expecting ASL keyword or name");}
+
+. { count (1);
+ sprintf (MsgBuffer,
+ "Invalid character (0x%2.2X), expecting ASL keyword or name",
+ *AslCompilertext);
+ AslCompilererror (MsgBuffer);}
+
+<<EOF>> { if (AslPopInputFileStack ())
+ yyterminate();
+ else
+ return (PARSEOP_INCLUDE_END);};
+
+%%
+
+/*! [End] no source code translation !*/
+
+typedef struct asl_file_node
+{
+ FILE *File;
+ UINT32 CurrentLineNumber;
+ YY_BUFFER_STATE State;
+ char *Filename;
+ struct asl_file_node *Next;
+
+} ASL_FILE_NODE;
+
+ASL_FILE_NODE *InputStack = NULL;
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslPopInputFileStack
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: 0 if a node was popped, -1 otherwise
+ *
+ * DESCRIPTION: Pop the top of the input file stack and point the parser to
+ * the saved parse buffer contained in the fnode. Also, set the
+ * global line counters to the saved values. This function is
+ * called when an include file reaches EOF.
+ *
+ ******************************************************************************/
+
+int
+AslPopInputFileStack (
+ void)
+{
+ ASL_FILE_NODE *Fnode;
+ FILE *InputFile = NULL;
+
+
+ Fnode = InputStack;
+ DbgPrint (ASL_PARSE_OUTPUT, "\nPop InputFile Stack, Fnode %p\n\n", Fnode);
+
+
+ if (!Fnode)
+ {
+ return -1;
+ }
+
+ /* Close the current include file */
+
+ fclose (yyin);
+
+ /* Update the top-of-stack */
+
+ InputStack = Fnode->Next;
+ InputFile = Fnode->File;
+
+ /* Reset global line counter and filename */
+
+ Gbl_Files[ASL_FILE_INPUT].Filename = Fnode->Filename;
+ Gbl_CurrentLineNumber = Fnode->CurrentLineNumber;
+
+ /* Point the parser to the popped file */
+
+ yy_delete_buffer (YY_CURRENT_BUFFER);
+ yy_switch_to_buffer (Fnode->State);
+
+ /* All done with this node */
+
+ ACPI_FREE (Fnode);
+ return 0;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslPushInputFileStack
+ *
+ * PARAMETERS: InputFile - Open file pointer
+ * Filename - Name of the file
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Push the InputFile onto the file stack, and point the parser
+ * to this file. Called when an include file is successfully
+ * opened.
+ *
+ ******************************************************************************/
+
+void
+AslPushInputFileStack (
+ FILE *InputFile,
+ char *Filename)
+{
+ ASL_FILE_NODE *Fnode;
+ YY_BUFFER_STATE State;
+
+
+ /* Save the current state in an Fnode */
+
+ Fnode = UtLocalCalloc (sizeof (ASL_FILE_NODE));
+
+ Fnode->File = yyin;
+ Fnode->Next = InputStack;
+ Fnode->State = YY_CURRENT_BUFFER;
+ Fnode->CurrentLineNumber = Gbl_CurrentLineNumber;
+ Fnode->Filename = Gbl_Files[ASL_FILE_INPUT].Filename;
+
+ /* Push it on the stack */
+
+ InputStack = Fnode;
+
+ /* Point the parser to this file */
+
+ State = yy_create_buffer (InputFile, YY_BUF_SIZE);
+ yy_switch_to_buffer (State);
+
+ DbgPrint (ASL_PARSE_OUTPUT, "\nPush InputFile Stack, returning %p\n\n", InputFile);
+
+ /* Reset the global line count and filename */
+
+ Gbl_Files[ASL_FILE_INPUT].Filename = Filename;
+ Gbl_CurrentLineNumber = 1;
+ yyin = InputFile;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: ResetCurrentLineBuffer
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Reset the Line Buffer to zero, increment global line numbers.
+ *
+ ******************************************************************************/
+
+void
+ResetCurrentLineBuffer (
+ void)
+{
+
+ if (Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle)
+ {
+ FlWriteFile (ASL_FILE_SOURCE_OUTPUT, Gbl_CurrentLineBuffer,
+ Gbl_LineBufPtr - Gbl_CurrentLineBuffer);
+ }
+
+ Gbl_CurrentLineOffset += Gbl_CurrentColumn;
+ Gbl_CurrentColumn = 0;
+
+ Gbl_CurrentLineNumber++;
+ Gbl_LogicalLineNumber++;
+ Gbl_LineBufPtr = Gbl_CurrentLineBuffer;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: InsertLineBuffer
+ *
+ * PARAMETERS: SourceChar - One char from the input ASL source file
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Put one character of the source file into the temp line buffer
+ *
+ ******************************************************************************/
+
+#define ASL_SPACES_PER_TAB 4
+
+void
+InsertLineBuffer (
+ int SourceChar)
+{
+ UINT32 i;
+ UINT32 Count = 1;
+
+
+ if (SourceChar == EOF)
+ {
+ return;
+ }
+
+ Gbl_InputByteCount++;
+
+ /* Handle tabs. Convert to spaces */
+
+ if (SourceChar == '\t')
+ {
+ SourceChar = ' ';
+ Count = ASL_SPACES_PER_TAB -
+ (Gbl_CurrentColumn & (ASL_SPACES_PER_TAB-1));
+ }
+
+
+ for (i = 0; i < Count; i++)
+ {
+ Gbl_CurrentColumn++;
+
+ /* Insert the character into the line buffer */
+
+ *Gbl_LineBufPtr = (UINT8) SourceChar;
+ Gbl_LineBufPtr++;
+
+ if (Gbl_LineBufPtr > (Gbl_CurrentLineBuffer + (ASL_LINE_BUFFER_SIZE - 1)))
+ {
+#if 0
+ /*
+ * Warning if we have split a long source line.
+ * <Probably overkill>
+ */
+ sprintf (MsgBuffer, "Max %d", ASL_LINE_BUFFER_SIZE);
+ AslCommonError (ASL_WARNING, ASL_MSG_LONG_LINE,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_CurrentLineOffset, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, MsgBuffer);
+#endif
+
+ ResetCurrentLineBuffer ();
+ }
+ else if (SourceChar == '\n')
+ {
+ /* End of line */
+
+ ResetCurrentLineBuffer ();
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: count
+ *
+ * PARAMETERS: yytext - Contains the matched keyword.
+ * Type - Keyword/Character type:
+ * 0 = anything except a keyword
+ * 1 = pseudo-keywords
+ * 2 = non-executable ASL keywords
+ * 3 = executable ASL keywords
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Count keywords and put them into the line buffer
+ *
+ ******************************************************************************/
+
+void
+count (
+ int Type)
+{
+ int i;
+
+
+ switch (Type)
+ {
+ case 2:
+ TotalKeywords++;
+ TotalNamedObjects++;
+ break;
+
+ case 3:
+ TotalKeywords++;
+ TotalExecutableOpcodes++;
+ break;
+ }
+
+ for (i = 0; (yytext[i] != 0) && (yytext[i] != EOF); i++)
+ {
+ InsertLineBuffer (yytext[i]);
+ *Gbl_LineBufPtr = 0;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: comment
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Process a standard comment.
+ *
+ ******************************************************************************/
+
+char
+comment (void)
+{
+ char c;
+ char c1 = 0;
+
+
+ InsertLineBuffer ('/');
+ InsertLineBuffer ('*');
+
+loop:
+
+ /* Eat chars until end-of-comment */
+
+ while ((c = (char) input()) != '*' && c != EOF)
+ {
+ InsertLineBuffer (c);
+ c1 = c;
+ }
+
+ if (c == EOF)
+ {
+ goto EarlyEOF;
+ }
+
+ /*
+ * Check for nested comment -- can help catch cases where a previous
+ * comment was accidently left unterminated
+ */
+ if ((c1 == '/') && (c == '*'))
+ {
+ AslCommonError (ASL_WARNING, ASL_MSG_NESTED_COMMENT,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_InputByteCount, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
+ }
+
+ /* Comment is closed only if the NEXT character is a slash */
+
+ InsertLineBuffer (c);
+
+ if ((c1 = (char) input()) != '/' && c1 != EOF)
+ {
+ unput(c1);
+ goto loop;
+ }
+
+ if (c1 == EOF)
+ {
+ goto EarlyEOF;
+ }
+
+ InsertLineBuffer (c1);
+ return TRUE;
+
+
+EarlyEOF:
+ /*
+ * Premature End-Of-File
+ */
+ AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_CurrentLineOffset, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: comment
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Process a new "//" comment.
+ *
+ ******************************************************************************/
+
+char
+comment2 (void)
+{
+ char c;
+
+
+ InsertLineBuffer ('/');
+ InsertLineBuffer ('/');
+
+ while ((c = (char) input()) != '\n' && c != EOF)
+ {
+ InsertLineBuffer (c);
+ }
+
+ if (c == EOF)
+ {
+ /* End of file is OK, change to newline. Let parser detect EOF later */
+
+ c = '\n';
+ }
+
+ InsertLineBuffer (c);
+ return (TRUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: literal
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Process a string literal (surrounded by quotes)
+ *
+ ******************************************************************************/
+
+#define ASL_NORMAL_CHAR 0
+#define ASL_ESCAPE_SEQUENCE 1
+#define ASL_OCTAL_CONSTANT 2
+#define ASL_HEX_CONSTANT 3
+
+char
+literal (void)
+{
+ char *StringBuffer = MsgBuffer;
+ char *EndBuffer = MsgBuffer + ASL_MSG_BUFFER_SIZE;
+ char *CleanString;
+ char StringChar;
+ UINT32 State = ASL_NORMAL_CHAR;
+ UINT32 i = 0;
+ UINT8 Digit;
+ char ConvertBuffer[4];
+
+
+ /*
+ * Eat chars until end-of-literal.
+ * NOTE: Put back the original surrounding quotes into the
+ * source line buffer.
+ */
+ InsertLineBuffer ('\"');
+ while ((StringChar = (char) input()) != EOF)
+ {
+ InsertLineBuffer (StringChar);
+
+DoCharacter:
+
+ switch (State)
+ {
+ case ASL_NORMAL_CHAR:
+
+ switch (StringChar)
+ {
+ case '\\':
+ /*
+ * Special handling for backslash-escape sequence. We will
+ * toss the backslash and translate the escape char(s).
+ */
+ State = ASL_ESCAPE_SEQUENCE;
+ continue;
+
+ case '\"':
+
+ /* String terminator */
+
+ goto CompletedString;
+ }
+ break;
+
+
+ case ASL_ESCAPE_SEQUENCE:
+
+ State = ASL_NORMAL_CHAR;
+ switch (StringChar)
+ {
+ case 'a':
+ StringChar = 0x07; /* BELL */
+ break;
+
+ case 'b':
+ StringChar = 0x08; /* BACKSPACE */
+ break;
+
+ case 'f':
+ StringChar = 0x0C; /* FORMFEED */
+ break;
+
+ case 'n':
+ StringChar = 0x0A; /* LINEFEED */
+ break;
+
+ case 'r':
+ StringChar = 0x0D; /* CARRIAGE RETURN*/
+ break;
+
+ case 't':
+ StringChar = 0x09; /* HORIZONTAL TAB */
+ break;
+
+ case 'v':
+ StringChar = 0x0B; /* VERTICAL TAB */
+ break;
+
+ case 'x':
+ State = ASL_HEX_CONSTANT;
+ i = 0;
+ continue;
+
+ case '\'': /* Single Quote */
+ case '\"': /* Double Quote */
+ case '\\': /* Backslash */
+ break;
+
+ default:
+
+ /* Check for an octal digit (0-7) */
+
+ if (ACPI_IS_OCTAL_DIGIT (StringChar))
+ {
+ State = ASL_OCTAL_CONSTANT;
+ ConvertBuffer[0] = StringChar;
+ i = 1;
+ continue;
+ }
+
+ /* Unknown escape sequence issue warning, but use the character */
+
+ AslCommonError (ASL_WARNING, ASL_MSG_INVALID_ESCAPE,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_CurrentLineOffset, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
+ break;
+ }
+ break;
+
+
+ case ASL_OCTAL_CONSTANT:
+
+ /* Up to three octal digits allowed */
+
+ if (!ACPI_IS_OCTAL_DIGIT (StringChar) ||
+ (i > 2))
+ {
+ /*
+ * Reached end of the constant. Convert the assembled ASCII
+ * string and resume processing of the next character
+ */
+ ConvertBuffer[i] = 0;
+ Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 8);
+
+ /* Check for NULL or non-ascii character (ignore if so) */
+
+ if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
+ {
+ AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_CurrentLineOffset, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
+ }
+ else
+ {
+ *StringBuffer = (char) Digit;
+ StringBuffer++;
+ if (StringBuffer >= EndBuffer)
+ {
+ goto BufferOverflow;
+ }
+ }
+
+ State = ASL_NORMAL_CHAR;
+ goto DoCharacter;
+ break;
+ }
+
+ /* Append another digit of the constant */
+
+ ConvertBuffer[i] = StringChar;
+ i++;
+ continue;
+
+
+ case ASL_HEX_CONSTANT:
+
+ /* Up to two hex digits allowed */
+
+ if (!ACPI_IS_XDIGIT (StringChar) ||
+ (i > 1))
+ {
+ /*
+ * Reached end of the constant. Convert the assembled ASCII
+ * string and resume processing of the next character
+ */
+ ConvertBuffer[i] = 0;
+ Digit = (UINT8) ACPI_STRTOUL (ConvertBuffer, NULL, 16);
+
+ /* Check for NULL or non-ascii character (ignore if so) */
+
+ if ((Digit == 0) || (Digit > ACPI_ASCII_MAX))
+ {
+ AslCommonError (ASL_WARNING, ASL_MSG_INVALID_STRING,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_CurrentLineOffset, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
+ }
+ else
+ {
+ *StringBuffer = (char) Digit;
+ StringBuffer++;
+ if (StringBuffer >= EndBuffer)
+ {
+ goto BufferOverflow;
+ }
+ }
+
+ State = ASL_NORMAL_CHAR;
+ goto DoCharacter;
+ break;
+ }
+
+ /* Append another digit of the constant */
+
+ ConvertBuffer[i] = StringChar;
+ i++;
+ continue;
+ }
+
+ /* Save the finished character */
+
+ *StringBuffer = StringChar;
+ StringBuffer++;
+ if (StringBuffer >= EndBuffer)
+ {
+ goto BufferOverflow;
+ }
+ }
+
+ /*
+ * Premature End-Of-File
+ */
+ AslCommonError (ASL_ERROR, ASL_MSG_EARLY_EOF,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_CurrentLineOffset, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
+ return (FALSE);
+
+
+CompletedString:
+ /*
+ * Null terminate the input string and copy string to a new buffer
+ */
+ *StringBuffer = 0;
+
+ CleanString = UtGetStringBuffer (strlen (MsgBuffer) + 1);
+ if (!CleanString)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_CurrentLineOffset, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
+ return (FALSE);
+ }
+
+ ACPI_STRCPY (CleanString, MsgBuffer);
+ AslCompilerlval.s = CleanString;
+ return (TRUE);
+
+
+BufferOverflow:
+
+ /* Literal was too long */
+
+ AslCommonError (ASL_ERROR, ASL_MSG_STRING_LENGTH,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_CurrentLineOffset, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, "Max length 4096");
+ return (FALSE);
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslcompiler.y b/sys/contrib/dev/acpica/compiler/aslcompiler.y
new file mode 100644
index 0000000..0b33d38
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslcompiler.y
@@ -0,0 +1,3189 @@
+
+%{
+/******************************************************************************
+ *
+ * Module Name: aslcompiler.y - Bison input file (ASL grammar and actions)
+ * $Revision: 1.105 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define YYDEBUG 1
+#define YYERROR_VERBOSE 1
+
+/*
+ * State stack - compiler will fault if it overflows. (Default was 200)
+ */
+#define YYINITDEPTH 600
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <contrib/dev/acpica/acpi.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslparse")
+
+/*
+ * Global Notes:
+ *
+ * October 2005: The following list terms have been optimized (from the
+ * original ASL grammar in the ACPI specification) to force the immediate
+ * reduction of each list item so that the parse stack use doesn't increase on
+ * each list element and possibly overflow on very large lists (>4000 items).
+ * This dramatically reduces use of the parse stack overall.
+ *
+ * ArgList, TermList, Objectlist, ByteList, DWordList, PackageList,
+ * ResourceMacroList, and FieldUnitList
+ */
+
+
+/*
+ * Next statement is important - this makes everything public so that
+ * we can access some of the parser tables from other modules
+ */
+#define static
+#undef alloca
+#define alloca AslLocalAllocate
+#define YYERROR_VERBOSE 1
+
+void *
+AslLocalAllocate (unsigned int Size);
+
+/*
+ * The windows version of bison defines this incorrectly as "32768" (Not negative).
+ * Using a custom (edited binary) version of bison that defines YYFLAG as YYFBAD
+ * instead (#define YYFBAD 32768), so we can define it correctly here.
+ *
+ * The problem is that if YYFLAG is positive, the extended syntax error messages
+ * are disabled.
+ */
+
+#define YYFLAG -32768
+
+
+%}
+
+
+/*
+ * Declare the type of values in the grammar
+ */
+
+%union {
+ UINT64 i;
+ char *s;
+ ACPI_PARSE_OBJECT *n;
+}
+
+
+/*! [Begin] no source code translation */
+
+/*
+ * These shift/reduce conflicts are expected. There should be zer0
+ * reduce/reduce conflicts.
+ */
+%expect 64
+
+
+/*
+ * Token types: These are returned by the lexer
+ *
+ * NOTE: This list MUST match the AslKeywordMapping table found
+ * in aslmap.c EXACTLY! Double check any changes!
+ */
+
+%token <i> PARSEOP_ACCESSAS
+%token <i> PARSEOP_ACCESSATTRIB_BLOCK
+%token <i> PARSEOP_ACCESSATTRIB_BLOCK_CALL
+%token <i> PARSEOP_ACCESSATTRIB_BYTE
+%token <i> PARSEOP_ACCESSATTRIB_WORD_CALL
+%token <i> PARSEOP_ACCESSATTRIB_QUICK
+%token <i> PARSEOP_ACCESSATTRIB_SND_RCV
+%token <i> PARSEOP_ACCESSATTRIB_WORD
+%token <i> PARSEOP_ACCESSTYPE_ANY
+%token <i> PARSEOP_ACCESSTYPE_BUF
+%token <i> PARSEOP_ACCESSTYPE_BYTE
+%token <i> PARSEOP_ACCESSTYPE_DWORD
+%token <i> PARSEOP_ACCESSTYPE_QWORD
+%token <i> PARSEOP_ACCESSTYPE_WORD
+%token <i> PARSEOP_ACQUIRE
+%token <i> PARSEOP_ADD
+%token <i> PARSEOP_ADDRESSSPACE_FFIXEDHW
+%token <i> PARSEOP_ADDRESSTYPE_ACPI
+%token <i> PARSEOP_ADDRESSTYPE_MEMORY
+%token <i> PARSEOP_ADDRESSTYPE_NVS
+%token <i> PARSEOP_ADDRESSTYPE_RESERVED
+%token <i> PARSEOP_ALIAS
+%token <i> PARSEOP_AND
+%token <i> PARSEOP_ARG0
+%token <i> PARSEOP_ARG1
+%token <i> PARSEOP_ARG2
+%token <i> PARSEOP_ARG3
+%token <i> PARSEOP_ARG4
+%token <i> PARSEOP_ARG5
+%token <i> PARSEOP_ARG6
+%token <i> PARSEOP_BANKFIELD
+%token <i> PARSEOP_BREAK
+%token <i> PARSEOP_BREAKPOINT
+%token <i> PARSEOP_BUFFER
+%token <i> PARSEOP_BUSMASTERTYPE_MASTER
+%token <i> PARSEOP_BUSMASTERTYPE_NOTMASTER
+%token <i> PARSEOP_BYTECONST
+%token <i> PARSEOP_CASE
+%token <i> PARSEOP_CONCATENATE
+%token <i> PARSEOP_CONCATENATERESTEMPLATE
+%token <i> PARSEOP_CONDREFOF
+%token <i> PARSEOP_CONTINUE
+%token <i> PARSEOP_COPYOBJECT
+%token <i> PARSEOP_CREATEBITFIELD
+%token <i> PARSEOP_CREATEBYTEFIELD
+%token <i> PARSEOP_CREATEDWORDFIELD
+%token <i> PARSEOP_CREATEFIELD
+%token <i> PARSEOP_CREATEQWORDFIELD
+%token <i> PARSEOP_CREATEWORDFIELD
+%token <i> PARSEOP_DATATABLEREGION
+%token <i> PARSEOP_DEBUG
+%token <i> PARSEOP_DECODETYPE_POS
+%token <i> PARSEOP_DECODETYPE_SUB
+%token <i> PARSEOP_DECREMENT
+%token <i> PARSEOP_DEFAULT
+%token <i> PARSEOP_DEFAULT_ARG
+%token <i> PARSEOP_DEFINITIONBLOCK
+%token <i> PARSEOP_DEREFOF
+%token <i> PARSEOP_DEVICE
+%token <i> PARSEOP_DIVIDE
+%token <i> PARSEOP_DMA
+%token <i> PARSEOP_DMATYPE_A
+%token <i> PARSEOP_DMATYPE_COMPATIBILITY
+%token <i> PARSEOP_DMATYPE_B
+%token <i> PARSEOP_DMATYPE_F
+%token <i> PARSEOP_DWORDCONST
+%token <i> PARSEOP_DWORDIO
+%token <i> PARSEOP_DWORDMEMORY
+%token <i> PARSEOP_DWORDSPACE
+%token <i> PARSEOP_EISAID
+%token <i> PARSEOP_ELSE
+%token <i> PARSEOP_ELSEIF
+%token <i> PARSEOP_ENDDEPENDENTFN
+%token <i> PARSEOP_ENDTAG
+%token <i> PARSEOP_ERRORNODE
+%token <i> PARSEOP_EVENT
+%token <i> PARSEOP_EXTENDEDIO
+%token <i> PARSEOP_EXTENDEDMEMORY
+%token <i> PARSEOP_EXTENDEDSPACE
+%token <i> PARSEOP_EXTERNAL
+%token <i> PARSEOP_FATAL
+%token <i> PARSEOP_FIELD
+%token <i> PARSEOP_FINDSETLEFTBIT
+%token <i> PARSEOP_FINDSETRIGHTBIT
+%token <i> PARSEOP_FIXEDIO
+%token <i> PARSEOP_FROMBCD
+%token <i> PARSEOP_FUNCTION
+%token <i> PARSEOP_IF
+%token <i> PARSEOP_INCLUDE
+%token <i> PARSEOP_INCLUDE_CSTYLE
+%token <i> PARSEOP_INCLUDE_END
+%token <i> PARSEOP_INCREMENT
+%token <i> PARSEOP_INDEX
+%token <i> PARSEOP_INDEXFIELD
+%token <i> PARSEOP_INTEGER
+%token <i> PARSEOP_INTERRUPT
+%token <i> PARSEOP_INTLEVEL_ACTIVEHIGH
+%token <i> PARSEOP_INTLEVEL_ACTIVELOW
+%token <i> PARSEOP_INTTYPE_EDGE
+%token <i> PARSEOP_INTTYPE_LEVEL
+%token <i> PARSEOP_IO
+%token <i> PARSEOP_IODECODETYPE_10
+%token <i> PARSEOP_IODECODETYPE_16
+%token <i> PARSEOP_IRQ
+%token <i> PARSEOP_IRQNOFLAGS
+%token <i> PARSEOP_LAND
+%token <i> PARSEOP_LEQUAL
+%token <i> PARSEOP_LGREATER
+%token <i> PARSEOP_LGREATEREQUAL
+%token <i> PARSEOP_LINE_CSTYLE
+%token <i> PARSEOP_LLESS
+%token <i> PARSEOP_LLESSEQUAL
+%token <i> PARSEOP_LNOT
+%token <i> PARSEOP_LNOTEQUAL
+%token <i> PARSEOP_LOAD
+%token <i> PARSEOP_LOADTABLE
+%token <i> PARSEOP_LOCAL0
+%token <i> PARSEOP_LOCAL1
+%token <i> PARSEOP_LOCAL2
+%token <i> PARSEOP_LOCAL3
+%token <i> PARSEOP_LOCAL4
+%token <i> PARSEOP_LOCAL5
+%token <i> PARSEOP_LOCAL6
+%token <i> PARSEOP_LOCAL7
+%token <i> PARSEOP_LOCKRULE_LOCK
+%token <i> PARSEOP_LOCKRULE_NOLOCK
+%token <i> PARSEOP_LOR
+%token <i> PARSEOP_MATCH
+%token <i> PARSEOP_MATCHTYPE_MEQ
+%token <i> PARSEOP_MATCHTYPE_MGE
+%token <i> PARSEOP_MATCHTYPE_MGT
+%token <i> PARSEOP_MATCHTYPE_MLE
+%token <i> PARSEOP_MATCHTYPE_MLT
+%token <i> PARSEOP_MATCHTYPE_MTR
+%token <i> PARSEOP_MAXTYPE_FIXED
+%token <i> PARSEOP_MAXTYPE_NOTFIXED
+%token <i> PARSEOP_MEMORY24
+%token <i> PARSEOP_MEMORY32
+%token <i> PARSEOP_MEMORY32FIXED
+%token <i> PARSEOP_MEMTYPE_CACHEABLE
+%token <i> PARSEOP_MEMTYPE_NONCACHEABLE
+%token <i> PARSEOP_MEMTYPE_PREFETCHABLE
+%token <i> PARSEOP_MEMTYPE_WRITECOMBINING
+%token <i> PARSEOP_METHOD
+%token <i> PARSEOP_METHODCALL
+%token <i> PARSEOP_MID
+%token <i> PARSEOP_MINTYPE_FIXED
+%token <i> PARSEOP_MINTYPE_NOTFIXED
+%token <i> PARSEOP_MOD
+%token <i> PARSEOP_MULTIPLY
+%token <i> PARSEOP_MUTEX
+%token <i> PARSEOP_NAME
+%token <s> PARSEOP_NAMESEG
+%token <s> PARSEOP_NAMESTRING
+%token <i> PARSEOP_NAND
+%token <i> PARSEOP_NOOP
+%token <i> PARSEOP_NOR
+%token <i> PARSEOP_NOT
+%token <i> PARSEOP_NOTIFY
+%token <i> PARSEOP_OBJECTTYPE
+%token <i> PARSEOP_OBJECTTYPE_BFF
+%token <i> PARSEOP_OBJECTTYPE_BUF
+%token <i> PARSEOP_OBJECTTYPE_DDB
+%token <i> PARSEOP_OBJECTTYPE_DEV
+%token <i> PARSEOP_OBJECTTYPE_EVT
+%token <i> PARSEOP_OBJECTTYPE_FLD
+%token <i> PARSEOP_OBJECTTYPE_INT
+%token <i> PARSEOP_OBJECTTYPE_MTH
+%token <i> PARSEOP_OBJECTTYPE_MTX
+%token <i> PARSEOP_OBJECTTYPE_OPR
+%token <i> PARSEOP_OBJECTTYPE_PKG
+%token <i> PARSEOP_OBJECTTYPE_POW
+%token <i> PARSEOP_OBJECTTYPE_PRO
+%token <i> PARSEOP_OBJECTTYPE_STR
+%token <i> PARSEOP_OBJECTTYPE_THZ
+%token <i> PARSEOP_OBJECTTYPE_UNK
+%token <i> PARSEOP_OFFSET
+%token <i> PARSEOP_ONE
+%token <i> PARSEOP_ONES
+%token <i> PARSEOP_OPERATIONREGION
+%token <i> PARSEOP_OR
+%token <i> PARSEOP_PACKAGE
+%token <i> PARSEOP_PACKAGE_LENGTH
+%token <i> PARSEOP_POWERRESOURCE
+%token <i> PARSEOP_PROCESSOR
+%token <i> PARSEOP_QWORDCONST
+%token <i> PARSEOP_QWORDIO
+%token <i> PARSEOP_QWORDMEMORY
+%token <i> PARSEOP_QWORDSPACE
+%token <i> PARSEOP_RANGETYPE_ENTIRE
+%token <i> PARSEOP_RANGETYPE_ISAONLY
+%token <i> PARSEOP_RANGETYPE_NONISAONLY
+%token <i> PARSEOP_RAW_DATA
+%token <i> PARSEOP_READWRITETYPE_BOTH
+%token <i> PARSEOP_READWRITETYPE_READONLY
+%token <i> PARSEOP_REFOF
+%token <i> PARSEOP_REGIONSPACE_CMOS
+%token <i> PARSEOP_REGIONSPACE_EC
+%token <i> PARSEOP_REGIONSPACE_IO
+%token <i> PARSEOP_REGIONSPACE_MEM
+%token <i> PARSEOP_REGIONSPACE_PCI
+%token <i> PARSEOP_REGIONSPACE_PCIBAR
+%token <i> PARSEOP_REGIONSPACE_SMBUS
+%token <i> PARSEOP_REGISTER
+%token <i> PARSEOP_RELEASE
+%token <i> PARSEOP_RESERVED_BYTES
+%token <i> PARSEOP_RESET
+%token <i> PARSEOP_RESOURCETEMPLATE
+%token <i> PARSEOP_RESOURCETYPE_CONSUMER
+%token <i> PARSEOP_RESOURCETYPE_PRODUCER
+%token <i> PARSEOP_RETURN
+%token <i> PARSEOP_REVISION
+%token <i> PARSEOP_SCOPE
+%token <i> PARSEOP_SERIALIZERULE_NOTSERIAL
+%token <i> PARSEOP_SERIALIZERULE_SERIAL
+%token <i> PARSEOP_SHARETYPE_EXCLUSIVE
+%token <i> PARSEOP_SHARETYPE_SHARED
+%token <i> PARSEOP_SHIFTLEFT
+%token <i> PARSEOP_SHIFTRIGHT
+%token <i> PARSEOP_SIGNAL
+%token <i> PARSEOP_SIZEOF
+%token <i> PARSEOP_SLEEP
+%token <i> PARSEOP_STALL
+%token <i> PARSEOP_STARTDEPENDENTFN
+%token <i> PARSEOP_STARTDEPENDENTFN_NOPRI
+%token <i> PARSEOP_STORE
+%token <s> PARSEOP_STRING_LITERAL
+%token <i> PARSEOP_SUBTRACT
+%token <i> PARSEOP_SWITCH
+%token <i> PARSEOP_THERMALZONE
+%token <i> PARSEOP_TIMER
+%token <i> PARSEOP_TOBCD
+%token <i> PARSEOP_TOBUFFER
+%token <i> PARSEOP_TODECIMALSTRING
+%token <i> PARSEOP_TOHEXSTRING
+%token <i> PARSEOP_TOINTEGER
+%token <i> PARSEOP_TOSTRING
+%token <i> PARSEOP_TOUUID
+%token <i> PARSEOP_TRANSLATIONTYPE_DENSE
+%token <i> PARSEOP_TRANSLATIONTYPE_SPARSE
+%token <i> PARSEOP_TYPE_STATIC
+%token <i> PARSEOP_TYPE_TRANSLATION
+%token <i> PARSEOP_UNICODE
+%token <i> PARSEOP_UNLOAD
+%token <i> PARSEOP_UPDATERULE_ONES
+%token <i> PARSEOP_UPDATERULE_PRESERVE
+%token <i> PARSEOP_UPDATERULE_ZEROS
+%token <i> PARSEOP_VAR_PACKAGE
+%token <i> PARSEOP_VENDORLONG
+%token <i> PARSEOP_VENDORSHORT
+%token <i> PARSEOP_WAIT
+%token <i> PARSEOP_WHILE
+%token <i> PARSEOP_WORDBUSNUMBER
+%token <i> PARSEOP_WORDCONST
+%token <i> PARSEOP_WORDIO
+%token <i> PARSEOP_WORDSPACE
+%token <i> PARSEOP_XFERTYPE_8
+%token <i> PARSEOP_XFERTYPE_8_16
+%token <i> PARSEOP_XFERTYPE_16
+%token <i> PARSEOP_XOR
+%token <i> PARSEOP_ZERO
+
+
+/*
+ * Production names
+ */
+
+%type <n> ASLCode
+%type <n> DefinitionBlockTerm
+%type <n> TermList
+%type <n> Term
+%type <n> CompilerDirective
+%type <n> ObjectList
+%type <n> Object
+%type <n> DataObject
+%type <n> BufferData
+%type <n> PackageData
+%type <n> IntegerData
+%type <n> StringData
+%type <n> NamedObject
+%type <n> NameSpaceModifier
+%type <n> UserTerm
+%type <n> ArgList
+%type <n> TermArg
+%type <n> Target
+%type <n> RequiredTarget
+%type <n> SimpleTarget
+%type <n> BufferTermData
+%type <n> ParameterTypePackage
+%type <n> ParameterTypePackageList
+%type <n> ParameterTypesPackage
+%type <n> ParameterTypesPackageList
+
+%type <n> Type1Opcode
+%type <n> Type2Opcode
+%type <n> Type2IntegerOpcode
+%type <n> Type2StringOpcode
+%type <n> Type2BufferOpcode
+%type <n> Type2BufferOrStringOpcode
+%type <n> Type3Opcode
+
+/* Obsolete %type <n> Type4Opcode */
+
+%type <n> Type5Opcode
+%type <n> Type6Opcode
+
+%type <n> LineTerm
+%type <n> IncludeTerm
+%type <n> IncludeCStyleTerm
+%type <n> ExternalTerm
+
+%type <n> FieldUnitList
+%type <n> FieldUnit
+%type <n> FieldUnitEntry
+
+%type <n> OffsetTerm
+%type <n> AccessAsTerm
+%type <n> OptionalAccessAttribTerm
+
+
+/* Named Objects */
+
+%type <n> BankFieldTerm
+%type <n> CreateBitFieldTerm
+%type <n> CreateByteFieldTerm
+%type <n> CreateDWordFieldTerm
+%type <n> CreateFieldTerm
+%type <n> CreateQWordFieldTerm
+%type <n> CreateWordFieldTerm
+%type <n> DataRegionTerm
+%type <n> DeviceTerm
+%type <n> EventTerm
+%type <n> FieldTerm
+%type <n> FunctionTerm
+%type <n> IndexFieldTerm
+%type <n> MethodTerm
+%type <n> MutexTerm
+%type <n> OpRegionTerm
+%type <n> OpRegionSpaceIdTerm
+%type <n> PowerResTerm
+%type <n> ProcessorTerm
+%type <n> ThermalZoneTerm
+
+
+/* Namespace modifiers */
+
+%type <n> AliasTerm
+%type <n> NameTerm
+%type <n> ScopeTerm
+
+/* Type 1 opcodes */
+
+%type <n> BreakTerm
+%type <n> BreakPointTerm
+%type <n> ContinueTerm
+%type <n> FatalTerm
+%type <n> IfElseTerm
+%type <n> IfTerm
+%type <n> ElseTerm
+%type <n> LoadTerm
+%type <n> NoOpTerm
+%type <n> NotifyTerm
+%type <n> ReleaseTerm
+%type <n> ResetTerm
+%type <n> ReturnTerm
+%type <n> SignalTerm
+%type <n> SleepTerm
+%type <n> StallTerm
+%type <n> SwitchTerm
+%type <n> CaseDefaultTermList
+//%type <n> CaseTermList
+%type <n> CaseTerm
+%type <n> DefaultTerm
+%type <n> UnloadTerm
+%type <n> WhileTerm
+
+/* Type 2 opcodes */
+
+%type <n> AcquireTerm
+%type <n> AddTerm
+%type <n> AndTerm
+%type <n> ConcatTerm
+%type <n> ConcatResTerm
+%type <n> CondRefOfTerm
+%type <n> CopyObjectTerm
+%type <n> DecTerm
+%type <n> DerefOfTerm
+%type <n> DivideTerm
+%type <n> FindSetLeftBitTerm
+%type <n> FindSetRightBitTerm
+%type <n> FromBCDTerm
+%type <n> IncTerm
+%type <n> IndexTerm
+%type <n> LAndTerm
+%type <n> LEqualTerm
+%type <n> LGreaterTerm
+%type <n> LGreaterEqualTerm
+%type <n> LLessTerm
+%type <n> LLessEqualTerm
+%type <n> LNotTerm
+%type <n> LNotEqualTerm
+%type <n> LoadTableTerm
+%type <n> LOrTerm
+%type <n> MatchTerm
+%type <n> MidTerm
+%type <n> ModTerm
+%type <n> MultiplyTerm
+%type <n> NAndTerm
+%type <n> NOrTerm
+%type <n> NotTerm
+%type <n> ObjectTypeTerm
+%type <n> OrTerm
+%type <n> RefOfTerm
+%type <n> ShiftLeftTerm
+%type <n> ShiftRightTerm
+%type <n> SizeOfTerm
+%type <n> StoreTerm
+%type <n> SubtractTerm
+%type <n> TimerTerm
+%type <n> ToBCDTerm
+%type <n> ToBufferTerm
+%type <n> ToDecimalStringTerm
+%type <n> ToHexStringTerm
+%type <n> ToIntegerTerm
+%type <n> ToStringTerm
+%type <n> WaitTerm
+%type <n> XOrTerm
+
+%type <n> OptionalTermArg
+%type <n> OptionalReturnArg
+%type <n> OptionalListString
+
+
+/* Keywords */
+
+%type <n> ObjectTypeKeyword
+%type <n> AccessTypeKeyword
+%type <n> AccessAttribKeyword
+%type <n> LockRuleKeyword
+%type <n> UpdateRuleKeyword
+%type <n> RegionSpaceKeyword
+%type <n> AddressSpaceKeyword
+%type <n> MatchOpKeyword
+%type <n> SerializeRuleKeyword
+%type <n> DMATypeKeyword
+%type <n> OptionalBusMasterKeyword
+%type <n> XferTypeKeyword
+%type <n> ResourceTypeKeyword
+%type <n> MinKeyword
+%type <n> MaxKeyword
+%type <n> DecodeKeyword
+%type <n> RangeTypeKeyword
+%type <n> MemTypeKeyword
+%type <n> OptionalReadWriteKeyword
+%type <n> InterruptTypeKeyword
+%type <n> InterruptLevel
+%type <n> ShareTypeKeyword
+%type <n> IODecodeKeyword
+%type <n> TypeKeyword
+%type <n> TranslationKeyword
+%type <n> AddressKeyword
+
+/* Types */
+
+%type <n> SuperName
+%type <n> ArgTerm
+%type <n> LocalTerm
+%type <n> DebugTerm
+
+%type <n> Integer
+%type <n> ByteConst
+%type <n> WordConst
+%type <n> DWordConst
+%type <n> QWordConst
+%type <n> String
+
+%type <n> ConstTerm
+%type <n> ByteConstExpr
+%type <n> WordConstExpr
+%type <n> DWordConstExpr
+%type <n> QWordConstExpr
+%type <n> ConstExprTerm
+
+%type <n> BufferTerm
+%type <n> ByteList
+%type <n> DWordList
+
+%type <n> PackageTerm
+%type <n> PackageList
+%type <n> PackageElement
+
+%type <n> VarPackageLengthTerm
+
+/* Macros */
+
+%type <n> EISAIDTerm
+%type <n> ResourceTemplateTerm
+%type <n> ToUUIDTerm
+%type <n> UnicodeTerm
+%type <n> ResourceMacroList
+%type <n> ResourceMacroTerm
+
+%type <n> DMATerm
+%type <n> DWordIOTerm
+%type <n> DWordMemoryTerm
+%type <n> DWordSpaceTerm
+%type <n> EndDependentFnTerm
+%type <n> ExtendedIOTerm
+%type <n> ExtendedMemoryTerm
+%type <n> ExtendedSpaceTerm
+%type <n> FixedIOTerm
+%type <n> InterruptTerm
+%type <n> IOTerm
+%type <n> IRQNoFlagsTerm
+%type <n> IRQTerm
+%type <n> Memory24Term
+%type <n> Memory32FixedTerm
+%type <n> Memory32Term
+%type <n> QWordIOTerm
+%type <n> QWordMemoryTerm
+%type <n> QWordSpaceTerm
+%type <n> RegisterTerm
+%type <n> StartDependentFnTerm
+%type <n> StartDependentFnNoPriTerm
+%type <n> VendorLongTerm
+%type <n> VendorShortTerm
+%type <n> WordBusNumberTerm
+%type <n> WordIOTerm
+%type <n> WordSpaceTerm
+
+%type <n> NameString
+%type <n> NameSeg
+
+
+/* Local types that help construct the AML, not in ACPI spec */
+
+%type <n> IncludeEndTerm
+%type <n> AmlPackageLengthTerm
+%type <n> OptionalByteConstExpr
+%type <n> OptionalDWordConstExpr
+%type <n> OptionalQWordConstExpr
+%type <n> OptionalSerializeRuleKeyword
+%type <n> OptionalResourceType_First
+%type <n> OptionalResourceType
+%type <n> OptionalMinType
+%type <n> OptionalMaxType
+%type <n> OptionalMemType
+%type <n> OptionalCount
+%type <n> OptionalDecodeType
+%type <n> OptionalRangeType
+%type <n> OptionalShareType
+%type <n> OptionalType
+%type <n> OptionalType_Last
+%type <n> OptionalTranslationType_Last
+%type <n> OptionalStringData
+%type <n> OptionalNameString
+%type <n> OptionalNameString_First
+%type <n> OptionalNameString_Last
+%type <n> OptionalAddressRange
+%type <n> OptionalObjectTypeKeyword
+%type <n> OptionalParameterTypePackage
+%type <n> OptionalParameterTypesPackage
+%type <n> OptionalReference
+%type <n> OptionalAccessSize
+
+
+%type <n> TermArgItem
+%type <n> NameStringItem
+
+%%
+
+
+/*******************************************************************************
+ *
+ * Production rules start here
+ *
+ ******************************************************************************/
+
+/*
+ * ASL Names
+ */
+
+
+/*
+ * Blocks, Data, and Opcodes
+ */
+
+ASLCode
+ : DefinitionBlockTerm
+ | error {YYABORT; $$ = NULL;}
+ ;
+
+DefinitionBlockTerm
+ : PARSEOP_DEFINITIONBLOCK '(' {$$ = TrCreateLeafNode (PARSEOP_DEFINITIONBLOCK);}
+ String ','
+ String ','
+ ByteConst ','
+ String ','
+ String ','
+ DWordConst
+ ')' {TrSetEndLineNumber ($<n>3);}
+ '{' TermList '}' {$$ = TrLinkChildren ($<n>3,7,$4,$6,$8,$10,$12,$14,$18);}
+ ;
+
+/* ACPI 3.0 -- allow semicolons between terms */
+
+TermList
+ : {$$ = NULL;}
+ | TermList Term {$$ = TrLinkPeerNode (TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$2);}
+ | TermList ';' Term {$$ = TrLinkPeerNode (TrSetNodeFlags ($1, NODE_RESULT_NOT_USED),$3);}
+ ;
+
+Term
+ : Object {}
+ | Type1Opcode {}
+ | Type2Opcode {}
+ | Type2IntegerOpcode {}
+ | Type2StringOpcode {}
+ | Type2BufferOpcode {}
+ | Type2BufferOrStringOpcode {}
+ | error {$$ = AslDoError(); yyclearin;}
+ ;
+
+CompilerDirective
+ : IncludeTerm {}
+ | IncludeCStyleTerm {$$ = NULL;}
+ | LineTerm {$$ = NULL;}
+ | ExternalTerm {}
+ ;
+
+ObjectList
+ : {$$ = NULL;}
+ | ObjectList Object {$$ = TrLinkPeerNode ($1,$2);}
+ | error {$$ = AslDoError(); yyclearin;}
+ ;
+
+Object
+ : CompilerDirective {}
+ | NamedObject {}
+ | NameSpaceModifier {}
+ ;
+
+DataObject
+ : BufferData {}
+ | PackageData {}
+ | IntegerData {}
+ | StringData {}
+ ;
+
+BufferData
+ : Type5Opcode {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);}
+ | Type2BufferOrStringOpcode {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);}
+ | Type2BufferOpcode {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);}
+ | BufferTerm {}
+ ;
+
+PackageData
+ : PackageTerm {}
+ ;
+
+IntegerData
+ : Type2IntegerOpcode {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);}
+ | Type3Opcode {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);}
+ | Integer {}
+ | ConstTerm {}
+ ;
+
+StringData
+ : Type2StringOpcode {$$ = TrSetNodeFlags ($1, NODE_COMPILE_TIME_CONST);}
+ | String {}
+ ;
+
+NamedObject
+ : BankFieldTerm {}
+ | CreateBitFieldTerm {}
+ | CreateByteFieldTerm {}
+ | CreateDWordFieldTerm {}
+ | CreateFieldTerm {}
+ | CreateQWordFieldTerm {}
+ | CreateWordFieldTerm {}
+ | DataRegionTerm {}
+ | DeviceTerm {}
+ | EventTerm {}
+ | FieldTerm {}
+ | FunctionTerm {}
+ | IndexFieldTerm {}
+ | MethodTerm {}
+ | MutexTerm {}
+ | OpRegionTerm {}
+ | PowerResTerm {}
+ | ProcessorTerm {}
+ | ThermalZoneTerm {}
+ ;
+
+NameSpaceModifier
+ : AliasTerm {}
+ | NameTerm {}
+ | ScopeTerm {}
+ ;
+
+UserTerm
+ : NameString '(' {TrUpdateNode (PARSEOP_METHODCALL, $1);}
+ ArgList ')' {$$ = TrLinkChildNode ($1,$4);}
+ ;
+
+ArgList
+ : {$$ = NULL;}
+ | TermArg
+ | ArgList ',' /* Allows a trailing comma at list end */
+ | ArgList ','
+ TermArg {$$ = TrLinkPeerNode ($1,$3);}
+ ;
+
+/*
+Removed from TermArg due to reduce/reduce conflicts
+ | Type2IntegerOpcode {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
+ | Type2StringOpcode {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
+ | Type2BufferOpcode {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
+ | Type2BufferOrStringOpcode {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
+
+*/
+
+TermArg
+ : Type2Opcode {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
+ | DataObject {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
+ | NameString {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
+ | ArgTerm {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
+ | LocalTerm {$$ = TrSetNodeFlags ($1, NODE_IS_TERM_ARG);}
+ ;
+
+Target
+ : {$$ = TrSetNodeFlags (TrCreateLeafNode (PARSEOP_ZERO), NODE_IS_TARGET | NODE_COMPILE_TIME_CONST);} /* Placeholder is a ZeroOp object */
+ | ',' {$$ = TrSetNodeFlags (TrCreateLeafNode (PARSEOP_ZERO), NODE_IS_TARGET | NODE_COMPILE_TIME_CONST);} /* Placeholder is a ZeroOp object */
+ | ',' SuperName {$$ = TrSetNodeFlags ($2, NODE_IS_TARGET);}
+ ;
+
+RequiredTarget
+ : ',' SuperName {$$ = TrSetNodeFlags ($2, NODE_IS_TARGET);}
+ ;
+
+SimpleTarget
+ : NameString {}
+ | LocalTerm {}
+ | ArgTerm {}
+ ;
+
+/* Rules for specifying the type of one method argument or return value */
+
+ParameterTypePackage
+ : {$$ = NULL;}
+ | ObjectTypeKeyword {$$ = $1;}
+ | ParameterTypePackage ','
+ ObjectTypeKeyword {$$ = TrLinkPeerNodes (2,$1,$3);}
+ ;
+
+ParameterTypePackageList
+ : {$$ = NULL;}
+ | ObjectTypeKeyword {$$ = $1;}
+ | '{' ParameterTypePackage '}' {$$ = $2;}
+ ;
+
+OptionalParameterTypePackage
+ : {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);}
+ | ',' ParameterTypePackageList {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_DEFAULT_ARG),1,$2);}
+ ;
+
+/* Rules for specifying the types for method arguments */
+
+ParameterTypesPackage
+ : ParameterTypePackageList {$$ = $1;}
+ | ParameterTypesPackage ','
+ ParameterTypePackageList {$$ = TrLinkPeerNodes (2,$1,$3);}
+ ;
+
+ParameterTypesPackageList
+ : {$$ = NULL;}
+ | ObjectTypeKeyword {$$ = $1;}
+ | '{' ParameterTypesPackage '}' {$$ = $2;}
+ ;
+
+OptionalParameterTypesPackage
+ : {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);}
+ | ',' ParameterTypesPackageList {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_DEFAULT_ARG),1,$2);}
+ ;
+
+
+/* Opcode types */
+
+Type1Opcode
+ : BreakTerm {}
+ | BreakPointTerm {}
+ | ContinueTerm {}
+ | FatalTerm {}
+ | IfElseTerm {}
+ | LoadTerm {}
+ | NoOpTerm {}
+ | NotifyTerm {}
+ | ReleaseTerm {}
+ | ResetTerm {}
+ | ReturnTerm {}
+ | SignalTerm {}
+ | SleepTerm {}
+ | StallTerm {}
+ | SwitchTerm {}
+ | UnloadTerm {}
+ | WhileTerm {}
+ ;
+
+Type2Opcode
+ : AcquireTerm {}
+ | CondRefOfTerm {}
+ | CopyObjectTerm {}
+ | DerefOfTerm {}
+ | ObjectTypeTerm {}
+ | RefOfTerm {}
+ | SizeOfTerm {}
+ | StoreTerm {}
+ | TimerTerm {}
+ | WaitTerm {}
+ | UserTerm {}
+ ;
+
+/*
+ * Type 3/4/5 opcodes
+ */
+
+Type2IntegerOpcode /* "Type3" opcodes */
+ : AddTerm {}
+ | AndTerm {}
+ | DecTerm {}
+ | DivideTerm {}
+ | FindSetLeftBitTerm {}
+ | FindSetRightBitTerm {}
+ | FromBCDTerm {}
+ | IncTerm {}
+ | IndexTerm {}
+ | LAndTerm {}
+ | LEqualTerm {}
+ | LGreaterTerm {}
+ | LGreaterEqualTerm {}
+ | LLessTerm {}
+ | LLessEqualTerm {}
+ | LNotTerm {}
+ | LNotEqualTerm {}
+ | LoadTableTerm {}
+ | LOrTerm {}
+ | MatchTerm {}
+ | ModTerm {}
+ | MultiplyTerm {}
+ | NAndTerm {}
+ | NOrTerm {}
+ | NotTerm {}
+ | OrTerm {}
+ | ShiftLeftTerm {}
+ | ShiftRightTerm {}
+ | SubtractTerm {}
+ | ToBCDTerm {}
+ | ToIntegerTerm {}
+ | XOrTerm {}
+ ;
+
+Type2StringOpcode /* "Type4" Opcodes */
+ : ToDecimalStringTerm {}
+ | ToHexStringTerm {}
+ | ToStringTerm {}
+ ;
+
+Type2BufferOpcode /* "Type5" Opcodes */
+ : ToBufferTerm {}
+ | ConcatResTerm {}
+ ;
+
+Type2BufferOrStringOpcode
+ : ConcatTerm {}
+ | MidTerm {}
+ ;
+
+/*
+ * A type 3 opcode evaluates to an Integer and cannot have a destination operand
+ */
+
+Type3Opcode
+ : EISAIDTerm {}
+ ;
+
+/* Obsolete
+Type4Opcode
+ : ConcatTerm {}
+ | ToDecimalStringTerm {}
+ | ToHexStringTerm {}
+ | MidTerm {}
+ | ToStringTerm {}
+ ;
+*/
+
+
+Type5Opcode
+ : ResourceTemplateTerm {}
+ | UnicodeTerm {}
+ | ToUUIDTerm {}
+ ;
+
+Type6Opcode
+ : RefOfTerm {}
+ | DerefOfTerm {}
+ | IndexTerm {}
+ | UserTerm {}
+ ;
+
+IncludeTerm
+ : PARSEOP_INCLUDE '(' {$$ = TrCreateLeafNode (PARSEOP_INCLUDE);}
+ String ')' {$$ = TrLinkChildren ($<n>3,1,$4);FlOpenIncludeFile ($4);}
+ TermList
+ IncludeEndTerm {$$ = TrLinkPeerNodes (3,$<n>3,$7,$8);}
+ ;
+
+IncludeEndTerm
+ : PARSEOP_INCLUDE_END {$$ = TrCreateLeafNode (PARSEOP_INCLUDE_END);}
+ ;
+
+IncludeCStyleTerm
+ : PARSEOP_INCLUDE_CSTYLE
+ String {FlOpenIncludeFile ($2);}
+ ;
+
+LineTerm
+ : PARSEOP_LINE_CSTYLE
+ Integer {FlSetLineNumber ($2);}
+ ;
+
+ExternalTerm
+ : PARSEOP_EXTERNAL '('
+ NameString
+ OptionalObjectTypeKeyword
+ OptionalParameterTypePackage
+ OptionalParameterTypesPackage
+ ')' {$$ = TrCreateNode (PARSEOP_EXTERNAL,4,$3,$4,$5,$6);}
+ | PARSEOP_EXTERNAL '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+
+/******* Named Objects *******************************************************/
+
+
+BankFieldTerm
+ : PARSEOP_BANKFIELD '(' {$$ = TrCreateLeafNode (PARSEOP_BANKFIELD);}
+ NameString
+ NameStringItem
+ TermArgItem
+ ',' AccessTypeKeyword
+ ',' LockRuleKeyword
+ ',' UpdateRuleKeyword
+ ')' '{'
+ FieldUnitList '}' {$$ = TrLinkChildren ($<n>3,7,$4,$5,$6,$8,$10,$12,$15);}
+ | PARSEOP_BANKFIELD '('
+ error ')' '{' error '}' {$$ = AslDoError(); yyclearin;}
+ ;
+
+FieldUnitList
+ : {$$ = NULL;}
+ | FieldUnit
+ | FieldUnitList ',' /* Allows a trailing comma at list end */
+ | FieldUnitList ','
+ FieldUnit {$$ = TrLinkPeerNode ($1,$3);}
+ ;
+
+FieldUnit
+ : FieldUnitEntry {}
+ | OffsetTerm {}
+ | AccessAsTerm {}
+ ;
+
+FieldUnitEntry
+ : ',' AmlPackageLengthTerm {$$ = TrCreateNode (PARSEOP_RESERVED_BYTES,1,$2);}
+ | NameSeg ','
+ AmlPackageLengthTerm {$$ = TrLinkChildNode ($1,$3);}
+ ;
+
+OffsetTerm
+ : PARSEOP_OFFSET '('
+ AmlPackageLengthTerm
+ ')' {$$ = TrCreateNode (PARSEOP_OFFSET,1,$3);}
+ | PARSEOP_OFFSET '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+AccessAsTerm
+ : PARSEOP_ACCESSAS '('
+ AccessTypeKeyword
+ OptionalAccessAttribTerm
+ ')' {$$ = TrCreateNode (PARSEOP_ACCESSAS,2,$3,$4);}
+ | PARSEOP_ACCESSAS '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+CreateBitFieldTerm
+ : PARSEOP_CREATEBITFIELD '(' {$$ = TrCreateLeafNode (PARSEOP_CREATEBITFIELD);}
+ TermArg
+ TermArgItem
+ NameStringItem
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,TrSetNodeFlags ($6, NODE_IS_NAME_DECLARATION));}
+ | PARSEOP_CREATEBITFIELD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+CreateByteFieldTerm
+ : PARSEOP_CREATEBYTEFIELD '(' {$$ = TrCreateLeafNode (PARSEOP_CREATEBYTEFIELD);}
+ TermArg
+ TermArgItem
+ NameStringItem
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,TrSetNodeFlags ($6, NODE_IS_NAME_DECLARATION));}
+ | PARSEOP_CREATEBYTEFIELD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+CreateDWordFieldTerm
+ : PARSEOP_CREATEDWORDFIELD '(' {$$ = TrCreateLeafNode (PARSEOP_CREATEDWORDFIELD);}
+ TermArg
+ TermArgItem
+ NameStringItem
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,TrSetNodeFlags ($6, NODE_IS_NAME_DECLARATION));}
+ | PARSEOP_CREATEDWORDFIELD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+CreateFieldTerm
+ : PARSEOP_CREATEFIELD '(' {$$ = TrCreateLeafNode (PARSEOP_CREATEFIELD);}
+ TermArg
+ TermArgItem
+ TermArgItem
+ NameStringItem
+ ')' {$$ = TrLinkChildren ($<n>3,4,$4,$5,$6,TrSetNodeFlags ($7, NODE_IS_NAME_DECLARATION));}
+ | PARSEOP_CREATEFIELD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+CreateQWordFieldTerm
+ : PARSEOP_CREATEQWORDFIELD '(' {$$ = TrCreateLeafNode (PARSEOP_CREATEQWORDFIELD);}
+ TermArg
+ TermArgItem
+ NameStringItem
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,TrSetNodeFlags ($6, NODE_IS_NAME_DECLARATION));}
+ | PARSEOP_CREATEQWORDFIELD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+CreateWordFieldTerm
+ : PARSEOP_CREATEWORDFIELD '(' {$$ = TrCreateLeafNode (PARSEOP_CREATEWORDFIELD);}
+ TermArg
+ TermArgItem
+ NameStringItem
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,TrSetNodeFlags ($6, NODE_IS_NAME_DECLARATION));}
+ | PARSEOP_CREATEWORDFIELD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+DataRegionTerm
+ : PARSEOP_DATATABLEREGION '(' {$$ = TrCreateLeafNode (PARSEOP_DATATABLEREGION);}
+ NameString
+ TermArgItem
+ TermArgItem
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,4,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$5,$6,$7);}
+ | PARSEOP_DATATABLEREGION '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+DeviceTerm
+ : PARSEOP_DEVICE '(' {$$ = TrCreateLeafNode (PARSEOP_DEVICE);}
+ NameString
+ ')' '{'
+ ObjectList '}' {$$ = TrLinkChildren ($<n>3,2,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$7);}
+ | PARSEOP_DEVICE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+EventTerm
+ : PARSEOP_EVENT '(' {$$ = TrCreateLeafNode (PARSEOP_EVENT);}
+ NameString
+ ')' {$$ = TrLinkChildren ($<n>3,1,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION));}
+ | PARSEOP_EVENT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+FieldTerm
+ : PARSEOP_FIELD '(' {$$ = TrCreateLeafNode (PARSEOP_FIELD);}
+ NameString
+ ',' AccessTypeKeyword
+ ',' LockRuleKeyword
+ ',' UpdateRuleKeyword
+ ')' '{'
+ FieldUnitList '}' {$$ = TrLinkChildren ($<n>3,5,$4,$6,$8,$10,$13);}
+ | PARSEOP_FIELD '('
+ error ')' '{' error '}' {$$ = AslDoError(); yyclearin;}
+ ;
+
+FunctionTerm
+ : PARSEOP_FUNCTION '(' {$$ = TrCreateLeafNode (PARSEOP_METHOD);}
+ NameString
+ OptionalParameterTypePackage
+ OptionalParameterTypesPackage
+ ')' '{'
+ TermList '}' {$$ = TrLinkChildren ($<n>3,7,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),
+ TrCreateValuedLeafNode (PARSEOP_BYTECONST, 0),
+ TrCreateLeafNode (PARSEOP_SERIALIZERULE_NOTSERIAL),
+ TrCreateValuedLeafNode (PARSEOP_BYTECONST, 0),$5,$6,$9);}
+ | PARSEOP_FUNCTION '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+IndexFieldTerm
+ : PARSEOP_INDEXFIELD '(' {$$ = TrCreateLeafNode (PARSEOP_INDEXFIELD);}
+ NameString
+ NameStringItem
+ ',' AccessTypeKeyword
+ ',' LockRuleKeyword
+ ',' UpdateRuleKeyword
+ ')' '{'
+ FieldUnitList '}' {$$ = TrLinkChildren ($<n>3,6,$4,$5,$7,$9,$11,$14);}
+ | PARSEOP_INDEXFIELD '('
+ error ')' '{' error '}' {$$ = AslDoError(); yyclearin;}
+ ;
+
+MethodTerm
+ : PARSEOP_METHOD '(' {$$ = TrCreateLeafNode (PARSEOP_METHOD);}
+ NameString
+ OptionalByteConstExpr {$$ = UtCheckIntegerRange ($5, 0, 7);}
+ OptionalSerializeRuleKeyword
+ OptionalByteConstExpr
+ OptionalParameterTypePackage
+ OptionalParameterTypesPackage
+ ')' '{'
+ TermList '}' {$$ = TrLinkChildren ($<n>3,7,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$5,$7,$8,$9,$10,$13);}
+ | PARSEOP_METHOD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+MutexTerm
+ : PARSEOP_MUTEX '(' {$$ = TrCreateLeafNode (PARSEOP_MUTEX);}
+ NameString
+ ',' ByteConstExpr
+ ')' {$$ = TrLinkChildren ($<n>3,2,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$6);}
+ | PARSEOP_MUTEX '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+OpRegionTerm
+ : PARSEOP_OPERATIONREGION '(' {$$ = TrCreateLeafNode (PARSEOP_OPERATIONREGION);}
+ NameString
+ ',' OpRegionSpaceIdTerm
+ TermArgItem
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,4,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$6,$7,$8);}
+ | PARSEOP_OPERATIONREGION '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+OpRegionSpaceIdTerm
+ : RegionSpaceKeyword {}
+ | ByteConst {$$ = UtCheckIntegerRange ($1, 0x80, 0xFF);}
+ ;
+
+PowerResTerm
+ : PARSEOP_POWERRESOURCE '(' {$$ = TrCreateLeafNode (PARSEOP_POWERRESOURCE);}
+ NameString
+ ',' ByteConstExpr
+ ',' WordConstExpr
+ ')' '{'
+ ObjectList '}' {$$ = TrLinkChildren ($<n>3,4,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$6,$8,$11);}
+ | PARSEOP_POWERRESOURCE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ProcessorTerm
+ : PARSEOP_PROCESSOR '(' {$$ = TrCreateLeafNode (PARSEOP_PROCESSOR);}
+ NameString
+ ',' ByteConstExpr
+ OptionalDWordConstExpr
+ OptionalByteConstExpr
+ ')' '{'
+ ObjectList '}' {$$ = TrLinkChildren ($<n>3,5,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$6,$7,$8,$11);}
+ | PARSEOP_PROCESSOR '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ThermalZoneTerm
+ : PARSEOP_THERMALZONE '(' {$$ = TrCreateLeafNode (PARSEOP_THERMALZONE);}
+ NameString
+ ')' '{'
+ ObjectList '}' {$$ = TrLinkChildren ($<n>3,2,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$7);}
+ | PARSEOP_THERMALZONE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+
+/******* Namespace modifiers *************************************************/
+
+
+AliasTerm
+ : PARSEOP_ALIAS '(' {$$ = TrCreateLeafNode (PARSEOP_ALIAS);}
+ NameString
+ NameStringItem
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,TrSetNodeFlags ($5, NODE_IS_NAME_DECLARATION));}
+ | PARSEOP_ALIAS '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+NameTerm
+ : PARSEOP_NAME '(' {$$ = TrCreateLeafNode (PARSEOP_NAME);}
+ NameString
+ ',' DataObject
+ ')' {$$ = TrLinkChildren ($<n>3,2,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$6);}
+ | PARSEOP_NAME '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ScopeTerm
+ : PARSEOP_SCOPE '(' {$$ = TrCreateLeafNode (PARSEOP_SCOPE);}
+ NameString
+ ')' '{'
+ ObjectList '}' {$$ = TrLinkChildren ($<n>3,2,TrSetNodeFlags ($4, NODE_IS_NAME_DECLARATION),$7);}
+ | PARSEOP_SCOPE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+
+/******* Type 1 opcodes *******************************************************/
+
+
+BreakTerm
+ : PARSEOP_BREAK {$$ = TrCreateNode (PARSEOP_BREAK, 0);}
+ ;
+
+BreakPointTerm
+ : PARSEOP_BREAKPOINT {$$ = TrCreateNode (PARSEOP_BREAKPOINT, 0);}
+ ;
+
+ContinueTerm
+ : PARSEOP_CONTINUE {$$ = TrCreateNode (PARSEOP_CONTINUE, 0);}
+ ;
+
+FatalTerm
+ : PARSEOP_FATAL '(' {$$ = TrCreateLeafNode (PARSEOP_FATAL);}
+ ByteConstExpr
+ ',' DWordConstExpr
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$6,$7);}
+ | PARSEOP_FATAL '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+IfElseTerm
+ : IfTerm ElseTerm {$$ = TrLinkPeerNode ($1,$2);}
+ ;
+
+IfTerm
+ : PARSEOP_IF '(' {$$ = TrCreateLeafNode (PARSEOP_IF);}
+ TermArg
+ ')' '{'
+ TermList '}' {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
+
+ | PARSEOP_IF '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ElseTerm
+ : {$$ = NULL;}
+ | PARSEOP_ELSE '{' {$$ = TrCreateLeafNode (PARSEOP_ELSE);}
+ TermList '}' {$$ = TrLinkChildren ($<n>3,1,$4);}
+
+ | PARSEOP_ELSE '{'
+ error '}' {$$ = AslDoError(); yyclearin;}
+
+ | PARSEOP_ELSE
+ error {$$ = AslDoError(); yyclearin;}
+
+ | PARSEOP_ELSEIF '(' {$$ = TrCreateLeafNode (PARSEOP_ELSE);}
+ TermArg {$$ = TrCreateLeafNode (PARSEOP_IF);}
+ ')' '{'
+ TermList '}' {$$ = TrLinkChildren ($<n>5,2,$4,$8);}
+ ElseTerm {$$ = TrLinkPeerNode ($<n>5,$11);}
+ {$$ = TrLinkChildren ($<n>3,1,$<n>5);}
+
+ | PARSEOP_ELSEIF '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+
+ | PARSEOP_ELSEIF
+ error {$$ = AslDoError(); yyclearin;}
+ ;
+
+LoadTerm
+ : PARSEOP_LOAD '(' {$$ = TrCreateLeafNode (PARSEOP_LOAD);}
+ NameString
+ RequiredTarget
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_LOAD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+NoOpTerm
+ : PARSEOP_NOOP {$$ = TrCreateNode (PARSEOP_NOOP, 0);}
+ ;
+
+NotifyTerm
+ : PARSEOP_NOTIFY '(' {$$ = TrCreateLeafNode (PARSEOP_NOTIFY);}
+ SuperName
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_NOTIFY '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ReleaseTerm
+ : PARSEOP_RELEASE '(' {$$ = TrCreateLeafNode (PARSEOP_RELEASE);}
+ SuperName
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_RELEASE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ResetTerm
+ : PARSEOP_RESET '(' {$$ = TrCreateLeafNode (PARSEOP_RESET);}
+ SuperName
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_RESET '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ReturnTerm
+ : PARSEOP_RETURN '(' {$$ = TrCreateLeafNode (PARSEOP_RETURN);}
+ OptionalReturnArg
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_RETURN {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_RETURN),1,TrCreateLeafNode (PARSEOP_ZERO));}
+ | PARSEOP_RETURN '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+SignalTerm
+ : PARSEOP_SIGNAL '(' {$$ = TrCreateLeafNode (PARSEOP_SIGNAL);}
+ SuperName
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_SIGNAL '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+SleepTerm
+ : PARSEOP_SLEEP '(' {$$ = TrCreateLeafNode (PARSEOP_SLEEP);}
+ TermArg
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_SLEEP '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+StallTerm
+ : PARSEOP_STALL '(' {$$ = TrCreateLeafNode (PARSEOP_STALL);}
+ TermArg
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_STALL '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+SwitchTerm
+ : PARSEOP_SWITCH '(' {$$ = TrCreateLeafNode (PARSEOP_SWITCH);}
+ TermArg
+ ')' '{'
+ CaseDefaultTermList '}'
+ {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
+ | PARSEOP_SWITCH '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+/*
+ * Case-Default list; allow only one Default term and unlimited Case terms
+ */
+
+CaseDefaultTermList
+ : {$$ = NULL;}
+ | CaseTerm {}
+ | DefaultTerm {}
+ | CaseDefaultTermList
+ CaseTerm {$$ = TrLinkPeerNode ($1,$2);}
+ | CaseDefaultTermList
+ DefaultTerm {$$ = TrLinkPeerNode ($1,$2);}
+
+/* Original - attempts to force zero or one default term within the switch */
+
+/*
+CaseDefaultTermList
+ : {$$ = NULL;}
+ | CaseTermList
+ DefaultTerm
+ CaseTermList {$$ = TrLinkPeerNode ($1,TrLinkPeerNode ($2, $3));}
+ | CaseTermList
+ CaseTerm {$$ = TrLinkPeerNode ($1,$2);}
+ ;
+
+CaseTermList
+ : {$$ = NULL;}
+ | CaseTerm {}
+ | CaseTermList
+ CaseTerm {$$ = TrLinkPeerNode ($1,$2);}
+ ;
+*/
+
+CaseTerm
+ : PARSEOP_CASE '(' {$$ = TrCreateLeafNode (PARSEOP_CASE);}
+ DataObject
+ ')' '{'
+ TermList '}' {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
+ | PARSEOP_CASE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+DefaultTerm
+ : PARSEOP_DEFAULT '{' {$$ = TrCreateLeafNode (PARSEOP_DEFAULT);}
+ TermList '}' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_DEFAULT '{'
+ error '}' {$$ = AslDoError(); yyclearin;}
+ ;
+
+UnloadTerm
+ : PARSEOP_UNLOAD '(' {$$ = TrCreateLeafNode (PARSEOP_UNLOAD);}
+ SuperName
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_UNLOAD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+WhileTerm
+ : PARSEOP_WHILE '(' {$$ = TrCreateLeafNode (PARSEOP_WHILE);}
+ TermArg
+ ')' '{' TermList '}'
+ {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
+ | PARSEOP_WHILE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+
+/******* Type 2 opcodes *******************************************************/
+
+AcquireTerm
+ : PARSEOP_ACQUIRE '(' {$$ = TrCreateLeafNode (PARSEOP_ACQUIRE);}
+ SuperName
+ ',' WordConstExpr
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$6);}
+ | PARSEOP_ACQUIRE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+AddTerm
+ : PARSEOP_ADD '(' {$$ = TrCreateLeafNode (PARSEOP_ADD);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_ADD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+AndTerm
+ : PARSEOP_AND '(' {$$ = TrCreateLeafNode (PARSEOP_AND);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_AND '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ConcatTerm
+ : PARSEOP_CONCATENATE '(' {$$ = TrCreateLeafNode (PARSEOP_CONCATENATE);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_CONCATENATE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ConcatResTerm
+ : PARSEOP_CONCATENATERESTEMPLATE '(' {$$ = TrCreateLeafNode (PARSEOP_CONCATENATERESTEMPLATE);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_CONCATENATERESTEMPLATE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+CondRefOfTerm
+ : PARSEOP_CONDREFOF '(' {$$ = TrCreateLeafNode (PARSEOP_CONDREFOF);}
+ SuperName
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_CONDREFOF '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+CopyObjectTerm
+ : PARSEOP_COPYOBJECT '(' {$$ = TrCreateLeafNode (PARSEOP_COPYOBJECT);}
+ TermArg
+ ',' SimpleTarget
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,TrSetNodeFlags ($6, NODE_IS_TARGET));}
+ | PARSEOP_COPYOBJECT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+DecTerm
+ : PARSEOP_DECREMENT '(' {$$ = TrCreateLeafNode (PARSEOP_DECREMENT);}
+ SuperName
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_DECREMENT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+DerefOfTerm
+ : PARSEOP_DEREFOF '(' {$$ = TrCreateLeafNode (PARSEOP_DEREFOF);}
+ TermArg
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_DEREFOF '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+DivideTerm
+ : PARSEOP_DIVIDE '(' {$$ = TrCreateLeafNode (PARSEOP_DIVIDE);}
+ TermArg
+ TermArgItem
+ Target
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,4,$4,$5,$6,$7);}
+ | PARSEOP_DIVIDE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+FindSetLeftBitTerm
+ : PARSEOP_FINDSETLEFTBIT '(' {$$ = TrCreateLeafNode (PARSEOP_FINDSETLEFTBIT);}
+ TermArg
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_FINDSETLEFTBIT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+FindSetRightBitTerm
+ : PARSEOP_FINDSETRIGHTBIT '(' {$$ = TrCreateLeafNode (PARSEOP_FINDSETRIGHTBIT);}
+ TermArg
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_FINDSETRIGHTBIT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+FromBCDTerm
+ : PARSEOP_FROMBCD '(' {$$ = TrCreateLeafNode (PARSEOP_FROMBCD);}
+ TermArg
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_FROMBCD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+IncTerm
+ : PARSEOP_INCREMENT '(' {$$ = TrCreateLeafNode (PARSEOP_INCREMENT);}
+ SuperName
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_INCREMENT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+IndexTerm
+ : PARSEOP_INDEX '(' {$$ = TrCreateLeafNode (PARSEOP_INDEX);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_INDEX '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+LAndTerm
+ : PARSEOP_LAND '(' {$$ = TrCreateLeafNode (PARSEOP_LAND);}
+ TermArg
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_LAND '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+LEqualTerm
+ : PARSEOP_LEQUAL '(' {$$ = TrCreateLeafNode (PARSEOP_LEQUAL);}
+ TermArg
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_LEQUAL '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+LGreaterTerm
+ : PARSEOP_LGREATER '(' {$$ = TrCreateLeafNode (PARSEOP_LGREATER);}
+ TermArg
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_LGREATER '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+LGreaterEqualTerm
+ : PARSEOP_LGREATEREQUAL '(' {$$ = TrCreateLeafNode (PARSEOP_LLESS);}
+ TermArg
+ TermArgItem
+ ')' {$$ = TrCreateNode (PARSEOP_LNOT, 1, TrLinkChildren ($<n>3,2,$4,$5));}
+ | PARSEOP_LGREATEREQUAL '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+LLessTerm
+ : PARSEOP_LLESS '(' {$$ = TrCreateLeafNode (PARSEOP_LLESS);}
+ TermArg
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_LLESS '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+LLessEqualTerm
+ : PARSEOP_LLESSEQUAL '(' {$$ = TrCreateLeafNode (PARSEOP_LGREATER);}
+ TermArg
+ TermArgItem
+ ')' {$$ = TrCreateNode (PARSEOP_LNOT, 1, TrLinkChildren ($<n>3,2,$4,$5));}
+ | PARSEOP_LLESSEQUAL '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+LNotTerm
+ : PARSEOP_LNOT '(' {$$ = TrCreateLeafNode (PARSEOP_LNOT);}
+ TermArg
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_LNOT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+LNotEqualTerm
+ : PARSEOP_LNOTEQUAL '(' {$$ = TrCreateLeafNode (PARSEOP_LEQUAL);}
+ TermArg
+ TermArgItem
+ ')' {$$ = TrCreateNode (PARSEOP_LNOT, 1, TrLinkChildren ($<n>3,2,$4,$5));}
+ | PARSEOP_LNOTEQUAL '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+LoadTableTerm
+ : PARSEOP_LOADTABLE '(' {$$ = TrCreateLeafNode (PARSEOP_LOADTABLE);}
+ TermArg
+ TermArgItem
+ TermArgItem
+ OptionalListString
+ OptionalListString
+ OptionalReference
+ ')' {$$ = TrLinkChildren ($<n>3,6,$4,$5,$6,$7,$8,$9);}
+ | PARSEOP_LOADTABLE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+LOrTerm
+ : PARSEOP_LOR '(' {$$ = TrCreateLeafNode (PARSEOP_LOR);}
+ TermArg
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_LOR '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+MatchTerm
+ : PARSEOP_MATCH '(' {$$ = TrCreateLeafNode (PARSEOP_MATCH);}
+ TermArg
+ ',' MatchOpKeyword
+ TermArgItem
+ ',' MatchOpKeyword
+ TermArgItem
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,6,$4,$6,$7,$9,$10,$11);}
+ | PARSEOP_MATCH '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+MidTerm
+ : PARSEOP_MID '(' {$$ = TrCreateLeafNode (PARSEOP_MID);}
+ TermArg
+ TermArgItem
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,4,$4,$5,$6,$7);}
+ | PARSEOP_MID '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ModTerm
+ : PARSEOP_MOD '(' {$$ = TrCreateLeafNode (PARSEOP_MOD);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_MOD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+MultiplyTerm
+ : PARSEOP_MULTIPLY '(' {$$ = TrCreateLeafNode (PARSEOP_MULTIPLY);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_MULTIPLY '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+NAndTerm
+ : PARSEOP_NAND '(' {$$ = TrCreateLeafNode (PARSEOP_NAND);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_NAND '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+NOrTerm
+ : PARSEOP_NOR '(' {$$ = TrCreateLeafNode (PARSEOP_NOR);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_NOR '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+NotTerm
+ : PARSEOP_NOT '(' {$$ = TrCreateLeafNode (PARSEOP_NOT);}
+ TermArg
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_NOT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ObjectTypeTerm
+ : PARSEOP_OBJECTTYPE '(' {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE);}
+ SuperName
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_OBJECTTYPE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+OrTerm
+ : PARSEOP_OR '(' {$$ = TrCreateLeafNode (PARSEOP_OR);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_OR '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+/*
+ * In RefOf, the node isn't really a target, but we can't keep track of it after
+ * we've taken a pointer to it. (hard to tell if a local becomes initialized this way.)
+ */
+RefOfTerm
+ : PARSEOP_REFOF '(' {$$ = TrCreateLeafNode (PARSEOP_REFOF);}
+ SuperName
+ ')' {$$ = TrLinkChildren ($<n>3,1,TrSetNodeFlags ($4, NODE_IS_TARGET));}
+ | PARSEOP_REFOF '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ShiftLeftTerm
+ : PARSEOP_SHIFTLEFT '(' {$$ = TrCreateLeafNode (PARSEOP_SHIFTLEFT);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_SHIFTLEFT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ShiftRightTerm
+ : PARSEOP_SHIFTRIGHT '(' {$$ = TrCreateLeafNode (PARSEOP_SHIFTRIGHT);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_SHIFTRIGHT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+SizeOfTerm
+ : PARSEOP_SIZEOF '(' {$$ = TrCreateLeafNode (PARSEOP_SIZEOF);}
+ SuperName
+ ')' {$$ = TrLinkChildren ($<n>3,1,$4);}
+ | PARSEOP_SIZEOF '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+StoreTerm
+ : PARSEOP_STORE '(' {$$ = TrCreateLeafNode (PARSEOP_STORE);}
+ TermArg
+ ',' SuperName
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,TrSetNodeFlags ($6, NODE_IS_TARGET));}
+ | PARSEOP_STORE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+SubtractTerm
+ : PARSEOP_SUBTRACT '(' {$$ = TrCreateLeafNode (PARSEOP_SUBTRACT);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_SUBTRACT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+TimerTerm
+ : PARSEOP_TIMER '(' {$$ = TrCreateLeafNode (PARSEOP_TIMER);}
+ ')' {$$ = TrLinkChildren ($<n>3,0);}
+ | PARSEOP_TIMER {$$ = TrLinkChildren (TrCreateLeafNode (PARSEOP_TIMER),0);}
+ | PARSEOP_TIMER '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ToBCDTerm
+ : PARSEOP_TOBCD '(' {$$ = TrCreateLeafNode (PARSEOP_TOBCD);}
+ TermArg
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_TOBCD '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ToBufferTerm
+ : PARSEOP_TOBUFFER '(' {$$ = TrCreateLeafNode (PARSEOP_TOBUFFER);}
+ TermArg
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_TOBUFFER '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ToDecimalStringTerm
+ : PARSEOP_TODECIMALSTRING '(' {$$ = TrCreateLeafNode (PARSEOP_TODECIMALSTRING);}
+ TermArg
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_TODECIMALSTRING '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ToHexStringTerm
+ : PARSEOP_TOHEXSTRING '(' {$$ = TrCreateLeafNode (PARSEOP_TOHEXSTRING);}
+ TermArg
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_TOHEXSTRING '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ToIntegerTerm
+ : PARSEOP_TOINTEGER '(' {$$ = TrCreateLeafNode (PARSEOP_TOINTEGER);}
+ TermArg
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_TOINTEGER '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ToStringTerm
+ : PARSEOP_TOSTRING '(' {$$ = TrCreateLeafNode (PARSEOP_TOSTRING);}
+ TermArg
+ OptionalCount
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_TOSTRING '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ToUUIDTerm
+ : PARSEOP_TOUUID '('
+ StringData ')' {$$ = TrUpdateNode (PARSEOP_TOUUID, $3);}
+ | PARSEOP_TOUUID '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+WaitTerm
+ : PARSEOP_WAIT '(' {$$ = TrCreateLeafNode (PARSEOP_WAIT);}
+ SuperName
+ TermArgItem
+ ')' {$$ = TrLinkChildren ($<n>3,2,$4,$5);}
+ | PARSEOP_WAIT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+XOrTerm
+ : PARSEOP_XOR '(' {$$ = TrCreateLeafNode (PARSEOP_XOR);}
+ TermArg
+ TermArgItem
+ Target
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$5,$6);}
+ | PARSEOP_XOR '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+
+/******* Keywords *************************************************************/
+
+
+ObjectTypeKeyword
+ : PARSEOP_OBJECTTYPE_UNK {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_UNK);}
+ | PARSEOP_OBJECTTYPE_INT {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_INT);}
+ | PARSEOP_OBJECTTYPE_STR {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_STR);}
+ | PARSEOP_OBJECTTYPE_BUF {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_BUF);}
+ | PARSEOP_OBJECTTYPE_PKG {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_PKG);}
+ | PARSEOP_OBJECTTYPE_FLD {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_FLD);}
+ | PARSEOP_OBJECTTYPE_DEV {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_DEV);}
+ | PARSEOP_OBJECTTYPE_EVT {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_EVT);}
+ | PARSEOP_OBJECTTYPE_MTH {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_MTH);}
+ | PARSEOP_OBJECTTYPE_MTX {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_MTX);}
+ | PARSEOP_OBJECTTYPE_OPR {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_OPR);}
+ | PARSEOP_OBJECTTYPE_POW {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_POW);}
+ | PARSEOP_OBJECTTYPE_PRO {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_PRO);}
+ | PARSEOP_OBJECTTYPE_THZ {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_THZ);}
+ | PARSEOP_OBJECTTYPE_BFF {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_BFF);}
+ | PARSEOP_OBJECTTYPE_DDB {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_DDB);}
+ ;
+
+AccessTypeKeyword
+ : PARSEOP_ACCESSTYPE_ANY {$$ = TrCreateLeafNode (PARSEOP_ACCESSTYPE_ANY);}
+ | PARSEOP_ACCESSTYPE_BYTE {$$ = TrCreateLeafNode (PARSEOP_ACCESSTYPE_BYTE);}
+ | PARSEOP_ACCESSTYPE_WORD {$$ = TrCreateLeafNode (PARSEOP_ACCESSTYPE_WORD);}
+ | PARSEOP_ACCESSTYPE_DWORD {$$ = TrCreateLeafNode (PARSEOP_ACCESSTYPE_DWORD);}
+ | PARSEOP_ACCESSTYPE_QWORD {$$ = TrCreateLeafNode (PARSEOP_ACCESSTYPE_QWORD);}
+ | PARSEOP_ACCESSTYPE_BUF {$$ = TrCreateLeafNode (PARSEOP_ACCESSTYPE_BUF);}
+ ;
+
+AccessAttribKeyword
+ : PARSEOP_ACCESSATTRIB_QUICK {$$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_QUICK );}
+ | PARSEOP_ACCESSATTRIB_SND_RCV {$$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_SND_RCV);}
+ | PARSEOP_ACCESSATTRIB_BYTE {$$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_BYTE);}
+ | PARSEOP_ACCESSATTRIB_WORD {$$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_WORD);}
+ | PARSEOP_ACCESSATTRIB_BLOCK {$$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_BLOCK);}
+ | PARSEOP_ACCESSATTRIB_WORD_CALL {$$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_WORD_CALL);}
+ | PARSEOP_ACCESSATTRIB_BLOCK_CALL {$$ = TrCreateLeafNode (PARSEOP_ACCESSATTRIB_BLOCK_CALL);}
+ ;
+
+LockRuleKeyword
+ : PARSEOP_LOCKRULE_LOCK {$$ = TrCreateLeafNode (PARSEOP_LOCKRULE_LOCK);}
+ | PARSEOP_LOCKRULE_NOLOCK {$$ = TrCreateLeafNode (PARSEOP_LOCKRULE_NOLOCK);}
+ ;
+
+UpdateRuleKeyword
+ : PARSEOP_UPDATERULE_PRESERVE {$$ = TrCreateLeafNode (PARSEOP_UPDATERULE_PRESERVE);}
+ | PARSEOP_UPDATERULE_ONES {$$ = TrCreateLeafNode (PARSEOP_UPDATERULE_ONES);}
+ | PARSEOP_UPDATERULE_ZEROS {$$ = TrCreateLeafNode (PARSEOP_UPDATERULE_ZEROS);}
+ ;
+
+
+RegionSpaceKeyword
+ : PARSEOP_REGIONSPACE_IO {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_IO);}
+ | PARSEOP_REGIONSPACE_MEM {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_MEM);}
+ | PARSEOP_REGIONSPACE_PCI {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_PCI);}
+ | PARSEOP_REGIONSPACE_EC {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_EC);}
+ | PARSEOP_REGIONSPACE_SMBUS {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_SMBUS);}
+ | PARSEOP_REGIONSPACE_CMOS {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_CMOS);}
+ | PARSEOP_REGIONSPACE_PCIBAR {$$ = TrCreateLeafNode (PARSEOP_REGIONSPACE_PCIBAR);}
+ ;
+
+AddressSpaceKeyword
+ : ByteConst {$$ = UtCheckIntegerRange ($1, 0x80, 0xFF);}
+ | RegionSpaceKeyword {}
+ | PARSEOP_ADDRESSSPACE_FFIXEDHW {$$ = TrCreateLeafNode (PARSEOP_ADDRESSSPACE_FFIXEDHW);}
+ ;
+
+
+SerializeRuleKeyword
+ : PARSEOP_SERIALIZERULE_SERIAL {$$ = TrCreateLeafNode (PARSEOP_SERIALIZERULE_SERIAL);}
+ | PARSEOP_SERIALIZERULE_NOTSERIAL {$$ = TrCreateLeafNode (PARSEOP_SERIALIZERULE_NOTSERIAL);}
+ ;
+
+MatchOpKeyword
+ : PARSEOP_MATCHTYPE_MTR {$$ = TrCreateLeafNode (PARSEOP_MATCHTYPE_MTR);}
+ | PARSEOP_MATCHTYPE_MEQ {$$ = TrCreateLeafNode (PARSEOP_MATCHTYPE_MEQ);}
+ | PARSEOP_MATCHTYPE_MLE {$$ = TrCreateLeafNode (PARSEOP_MATCHTYPE_MLE);}
+ | PARSEOP_MATCHTYPE_MLT {$$ = TrCreateLeafNode (PARSEOP_MATCHTYPE_MLT);}
+ | PARSEOP_MATCHTYPE_MGE {$$ = TrCreateLeafNode (PARSEOP_MATCHTYPE_MGE);}
+ | PARSEOP_MATCHTYPE_MGT {$$ = TrCreateLeafNode (PARSEOP_MATCHTYPE_MGT);}
+ ;
+
+DMATypeKeyword
+ : PARSEOP_DMATYPE_A {$$ = TrCreateLeafNode (PARSEOP_DMATYPE_A);}
+ | PARSEOP_DMATYPE_COMPATIBILITY {$$ = TrCreateLeafNode (PARSEOP_DMATYPE_COMPATIBILITY);}
+ | PARSEOP_DMATYPE_B {$$ = TrCreateLeafNode (PARSEOP_DMATYPE_B);}
+ | PARSEOP_DMATYPE_F {$$ = TrCreateLeafNode (PARSEOP_DMATYPE_F);}
+ ;
+
+XferTypeKeyword
+ : PARSEOP_XFERTYPE_8 {$$ = TrCreateLeafNode (PARSEOP_XFERTYPE_8);}
+ | PARSEOP_XFERTYPE_8_16 {$$ = TrCreateLeafNode (PARSEOP_XFERTYPE_8_16);}
+ | PARSEOP_XFERTYPE_16 {$$ = TrCreateLeafNode (PARSEOP_XFERTYPE_16);}
+ ;
+
+ResourceTypeKeyword
+ : PARSEOP_RESOURCETYPE_CONSUMER {$$ = TrCreateLeafNode (PARSEOP_RESOURCETYPE_CONSUMER);}
+ | PARSEOP_RESOURCETYPE_PRODUCER {$$ = TrCreateLeafNode (PARSEOP_RESOURCETYPE_PRODUCER);}
+ ;
+
+MinKeyword
+ : PARSEOP_MINTYPE_FIXED {$$ = TrCreateLeafNode (PARSEOP_MINTYPE_FIXED);}
+ | PARSEOP_MINTYPE_NOTFIXED {$$ = TrCreateLeafNode (PARSEOP_MINTYPE_NOTFIXED);}
+ ;
+
+MaxKeyword
+ : PARSEOP_MAXTYPE_FIXED {$$ = TrCreateLeafNode (PARSEOP_MAXTYPE_FIXED);}
+ | PARSEOP_MAXTYPE_NOTFIXED {$$ = TrCreateLeafNode (PARSEOP_MAXTYPE_NOTFIXED);}
+ ;
+
+DecodeKeyword
+ : PARSEOP_DECODETYPE_POS {$$ = TrCreateLeafNode (PARSEOP_DECODETYPE_POS);}
+ | PARSEOP_DECODETYPE_SUB {$$ = TrCreateLeafNode (PARSEOP_DECODETYPE_SUB);}
+ ;
+
+RangeTypeKeyword
+ : PARSEOP_RANGETYPE_ISAONLY {$$ = TrCreateLeafNode (PARSEOP_RANGETYPE_ISAONLY);}
+ | PARSEOP_RANGETYPE_NONISAONLY {$$ = TrCreateLeafNode (PARSEOP_RANGETYPE_NONISAONLY);}
+ | PARSEOP_RANGETYPE_ENTIRE {$$ = TrCreateLeafNode (PARSEOP_RANGETYPE_ENTIRE);}
+ ;
+
+MemTypeKeyword
+ : PARSEOP_MEMTYPE_CACHEABLE {$$ = TrCreateLeafNode (PARSEOP_MEMTYPE_CACHEABLE);}
+ | PARSEOP_MEMTYPE_WRITECOMBINING {$$ = TrCreateLeafNode (PARSEOP_MEMTYPE_WRITECOMBINING);}
+ | PARSEOP_MEMTYPE_PREFETCHABLE {$$ = TrCreateLeafNode (PARSEOP_MEMTYPE_PREFETCHABLE);}
+ | PARSEOP_MEMTYPE_NONCACHEABLE {$$ = TrCreateLeafNode (PARSEOP_MEMTYPE_NONCACHEABLE);}
+ ;
+
+OptionalReadWriteKeyword
+ : {$$ = TrCreateLeafNode (PARSEOP_READWRITETYPE_BOTH);}
+ | PARSEOP_READWRITETYPE_BOTH {$$ = TrCreateLeafNode (PARSEOP_READWRITETYPE_BOTH);}
+ | PARSEOP_READWRITETYPE_READONLY {$$ = TrCreateLeafNode (PARSEOP_READWRITETYPE_READONLY);}
+ ;
+
+InterruptTypeKeyword
+ : PARSEOP_INTTYPE_EDGE {$$ = TrCreateLeafNode (PARSEOP_INTTYPE_EDGE);}
+ | PARSEOP_INTTYPE_LEVEL {$$ = TrCreateLeafNode (PARSEOP_INTTYPE_LEVEL);}
+ ;
+
+InterruptLevel
+ : PARSEOP_INTLEVEL_ACTIVEHIGH {$$ = TrCreateLeafNode (PARSEOP_INTLEVEL_ACTIVEHIGH);}
+ | PARSEOP_INTLEVEL_ACTIVELOW {$$ = TrCreateLeafNode (PARSEOP_INTLEVEL_ACTIVELOW);}
+ ;
+
+ShareTypeKeyword
+ : PARSEOP_SHARETYPE_SHARED {$$ = TrCreateLeafNode (PARSEOP_SHARETYPE_SHARED);}
+ | PARSEOP_SHARETYPE_EXCLUSIVE {$$ = TrCreateLeafNode (PARSEOP_SHARETYPE_EXCLUSIVE);}
+ ;
+
+IODecodeKeyword
+ : PARSEOP_IODECODETYPE_16 {$$ = TrCreateLeafNode (PARSEOP_IODECODETYPE_16);}
+ | PARSEOP_IODECODETYPE_10 {$$ = TrCreateLeafNode (PARSEOP_IODECODETYPE_10);}
+ ;
+
+TypeKeyword
+ : PARSEOP_TYPE_TRANSLATION {$$ = TrCreateLeafNode (PARSEOP_TYPE_TRANSLATION);}
+ | PARSEOP_TYPE_STATIC {$$ = TrCreateLeafNode (PARSEOP_TYPE_STATIC);}
+ ;
+
+TranslationKeyword
+ : PARSEOP_TRANSLATIONTYPE_SPARSE {$$ = TrCreateLeafNode (PARSEOP_TRANSLATIONTYPE_SPARSE);}
+ | PARSEOP_TRANSLATIONTYPE_DENSE {$$ = TrCreateLeafNode (PARSEOP_TRANSLATIONTYPE_DENSE);}
+ ;
+
+AddressKeyword
+ : PARSEOP_ADDRESSTYPE_MEMORY {$$ = TrCreateLeafNode (PARSEOP_ADDRESSTYPE_MEMORY);}
+ | PARSEOP_ADDRESSTYPE_RESERVED {$$ = TrCreateLeafNode (PARSEOP_ADDRESSTYPE_RESERVED);}
+ | PARSEOP_ADDRESSTYPE_NVS {$$ = TrCreateLeafNode (PARSEOP_ADDRESSTYPE_NVS);}
+ | PARSEOP_ADDRESSTYPE_ACPI {$$ = TrCreateLeafNode (PARSEOP_ADDRESSTYPE_ACPI);}
+ ;
+
+
+/******* Miscellaneous Types **************************************************/
+
+
+SuperName
+ : NameString {}
+ | ArgTerm {}
+ | LocalTerm {}
+ | DebugTerm {}
+ | Type6Opcode {}
+/* | UserTerm {} */ /* Caused reduce/reduce with Type6Opcode->UserTerm */
+ ;
+
+ArgTerm
+ : PARSEOP_ARG0 {$$ = TrCreateLeafNode (PARSEOP_ARG0);}
+ | PARSEOP_ARG1 {$$ = TrCreateLeafNode (PARSEOP_ARG1);}
+ | PARSEOP_ARG2 {$$ = TrCreateLeafNode (PARSEOP_ARG2);}
+ | PARSEOP_ARG3 {$$ = TrCreateLeafNode (PARSEOP_ARG3);}
+ | PARSEOP_ARG4 {$$ = TrCreateLeafNode (PARSEOP_ARG4);}
+ | PARSEOP_ARG5 {$$ = TrCreateLeafNode (PARSEOP_ARG5);}
+ | PARSEOP_ARG6 {$$ = TrCreateLeafNode (PARSEOP_ARG6);}
+ ;
+
+LocalTerm
+ : PARSEOP_LOCAL0 {$$ = TrCreateLeafNode (PARSEOP_LOCAL0);}
+ | PARSEOP_LOCAL1 {$$ = TrCreateLeafNode (PARSEOP_LOCAL1);}
+ | PARSEOP_LOCAL2 {$$ = TrCreateLeafNode (PARSEOP_LOCAL2);}
+ | PARSEOP_LOCAL3 {$$ = TrCreateLeafNode (PARSEOP_LOCAL3);}
+ | PARSEOP_LOCAL4 {$$ = TrCreateLeafNode (PARSEOP_LOCAL4);}
+ | PARSEOP_LOCAL5 {$$ = TrCreateLeafNode (PARSEOP_LOCAL5);}
+ | PARSEOP_LOCAL6 {$$ = TrCreateLeafNode (PARSEOP_LOCAL6);}
+ | PARSEOP_LOCAL7 {$$ = TrCreateLeafNode (PARSEOP_LOCAL7);}
+ ;
+
+DebugTerm
+ : PARSEOP_DEBUG {$$ = TrCreateLeafNode (PARSEOP_DEBUG);}
+ ;
+
+
+ByteConst
+ : Integer {$$ = TrUpdateNode (PARSEOP_BYTECONST, $1);}
+ ;
+
+WordConst
+ : Integer {$$ = TrUpdateNode (PARSEOP_WORDCONST, $1);}
+ ;
+
+DWordConst
+ : Integer {$$ = TrUpdateNode (PARSEOP_DWORDCONST, $1);}
+ ;
+
+QWordConst
+ : Integer {$$ = TrUpdateNode (PARSEOP_QWORDCONST, $1);}
+ ;
+
+Integer
+ : PARSEOP_INTEGER {$$ = TrCreateValuedLeafNode (PARSEOP_INTEGER, AslCompilerlval.i);}
+ ;
+
+String
+ : PARSEOP_STRING_LITERAL {$$ = TrCreateValuedLeafNode (PARSEOP_STRING_LITERAL, (ACPI_NATIVE_INT) AslCompilerlval.s);}
+ ;
+
+ConstTerm
+ : ConstExprTerm {}
+ | PARSEOP_REVISION {$$ = TrCreateLeafNode (PARSEOP_REVISION);}
+ ;
+
+ByteConstExpr
+ : Type3Opcode {$$ = TrUpdateNode (PARSEOP_BYTECONST, $1);}
+ | Type2IntegerOpcode {$$ = TrUpdateNode (PARSEOP_BYTECONST, $1);}
+ | ConstExprTerm {$$ = TrUpdateNode (PARSEOP_BYTECONST, $1);}
+ | ByteConst {}
+ ;
+
+WordConstExpr
+ : Type3Opcode {$$ = TrUpdateNode (PARSEOP_WORDCONST, $1);}
+ | Type2IntegerOpcode {$$ = TrUpdateNode (PARSEOP_WORDCONST, $1);}
+ | ConstExprTerm {$$ = TrUpdateNode (PARSEOP_WORDCONST, $1);}
+ | WordConst {}
+ ;
+
+DWordConstExpr
+ : Type3Opcode {$$ = TrUpdateNode (PARSEOP_DWORDCONST, $1);}
+ | Type2IntegerOpcode {$$ = TrUpdateNode (PARSEOP_DWORDCONST, $1);}
+ | ConstExprTerm {$$ = TrUpdateNode (PARSEOP_DWORDCONST, $1);}
+ | DWordConst {}
+ ;
+
+QWordConstExpr
+ : Type3Opcode {$$ = TrUpdateNode (PARSEOP_QWORDCONST, $1);}
+ | Type2IntegerOpcode {$$ = TrUpdateNode (PARSEOP_QWORDCONST, $1);}
+ | ConstExprTerm {$$ = TrUpdateNode (PARSEOP_QWORDCONST, $1);}
+ | QWordConst {}
+ ;
+
+ConstExprTerm
+ : PARSEOP_ZERO {$$ = TrCreateValuedLeafNode (PARSEOP_ZERO, 0);}
+ | PARSEOP_ONE {$$ = TrCreateValuedLeafNode (PARSEOP_ONE, 1);}
+ | PARSEOP_ONES {$$ = TrCreateValuedLeafNode (PARSEOP_ONES, ACPI_INTEGER_MAX);}
+ ;
+
+/* OptionalCount must appear before ByteList or an incorrect reduction will result */
+
+OptionalCount
+ : {$$ = TrCreateLeafNode (PARSEOP_ONES);} /* Placeholder is a OnesOp object */
+ | ',' {$$ = TrCreateLeafNode (PARSEOP_ONES);} /* Placeholder is a OnesOp object */
+ | ',' TermArg {$$ = $2;}
+ ;
+
+
+BufferTerm
+ : PARSEOP_BUFFER '(' {$$ = TrCreateLeafNode (PARSEOP_BUFFER);}
+ OptionalTermArg
+ ')' '{'
+ BufferTermData '}' {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
+ | PARSEOP_BUFFER '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+BufferTermData
+ : ByteList {}
+ | StringData {}
+ ;
+
+ByteList
+ : {$$ = NULL;}
+ | ByteConstExpr
+ | ByteList ',' /* Allows a trailing comma at list end */
+ | ByteList ','
+ ByteConstExpr {$$ = TrLinkPeerNode ($1,$3);}
+ ;
+
+DWordList
+ : {$$ = NULL;}
+ | DWordConstExpr
+ | DWordList ',' /* Allows a trailing comma at list end */
+ | DWordList ','
+ DWordConstExpr {$$ = TrLinkPeerNode ($1,$3);}
+ ;
+
+PackageTerm
+ : PARSEOP_PACKAGE '(' {$$ = TrCreateLeafNode (PARSEOP_VAR_PACKAGE);}
+ VarPackageLengthTerm
+ ')' '{'
+ PackageList '}' {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
+ | PARSEOP_PACKAGE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+VarPackageLengthTerm
+ : {$$ = TrCreateLeafNode (PARSEOP_DEFAULT_ARG);}
+ | TermArg {$$ = $1;}
+ ;
+
+PackageList
+ : {$$ = NULL;}
+ | PackageElement
+ | PackageList ',' /* Allows a trailing comma at list end */
+ | PackageList ','
+ PackageElement {$$ = TrLinkPeerNode ($1,$3);}
+ ;
+
+PackageElement
+ : DataObject {}
+ | NameString {}
+ ;
+
+EISAIDTerm
+ : PARSEOP_EISAID '('
+ StringData ')' {$$ = TrUpdateNode (PARSEOP_EISAID, $3);}
+ | PARSEOP_EISAID '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+
+/******* Resources and Memory ***********************************************/
+
+
+/*
+ * Note: Create two default nodes to allow conversion to a Buffer AML opcode
+ * Also, insert the EndTag at the end of the template.
+ */
+ResourceTemplateTerm
+ : PARSEOP_RESOURCETEMPLATE '(' ')'
+ '{'
+ ResourceMacroList '}' {$$ = TrCreateNode (PARSEOP_RESOURCETEMPLATE,4,
+ TrCreateLeafNode (PARSEOP_DEFAULT_ARG),
+ TrCreateLeafNode (PARSEOP_DEFAULT_ARG),
+ $5,
+ TrCreateLeafNode (PARSEOP_ENDTAG));}
+ ;
+
+UnicodeTerm
+ : PARSEOP_UNICODE '(' {$$ = TrCreateLeafNode (PARSEOP_UNICODE);}
+ StringData
+ ')' {$$ = TrLinkChildren ($<n>3,2,0,$4);}
+ | PARSEOP_UNICODE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ResourceMacroList
+ : {$$ = NULL;}
+ | ResourceMacroList
+ ResourceMacroTerm {$$ = TrLinkPeerNode ($1,$2);}
+ ;
+
+ResourceMacroTerm
+ : DMATerm {}
+ | DWordIOTerm {}
+ | DWordMemoryTerm {}
+ | DWordSpaceTerm {}
+ | EndDependentFnTerm {}
+ | ExtendedIOTerm {}
+ | ExtendedMemoryTerm {}
+ | ExtendedSpaceTerm {}
+ | FixedIOTerm {}
+ | InterruptTerm {}
+ | IOTerm {}
+ | IRQNoFlagsTerm {}
+ | IRQTerm {}
+ | Memory24Term {}
+ | Memory32FixedTerm {}
+ | Memory32Term {}
+ | QWordIOTerm {}
+ | QWordMemoryTerm {}
+ | QWordSpaceTerm {}
+ | RegisterTerm {}
+ | StartDependentFnTerm {}
+ | StartDependentFnNoPriTerm {}
+ | VendorLongTerm {}
+ | VendorShortTerm {}
+ | WordBusNumberTerm {}
+ | WordIOTerm {}
+ | WordSpaceTerm {}
+ ;
+
+DMATerm
+ : PARSEOP_DMA '(' {$$ = TrCreateLeafNode (PARSEOP_DMA);}
+ DMATypeKeyword
+ OptionalBusMasterKeyword
+ ',' XferTypeKeyword
+ OptionalNameString_Last
+ ')' '{'
+ ByteList '}' {$$ = TrLinkChildren ($<n>3,5,$4,$5,$7,$8,$11);}
+ | PARSEOP_DMA '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+DWordIOTerm
+ : PARSEOP_DWORDIO '(' {$$ = TrCreateLeafNode (PARSEOP_DWORDIO);}
+ OptionalResourceType_First
+ OptionalMinType
+ OptionalMaxType
+ OptionalDecodeType
+ OptionalRangeType
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ OptionalByteConstExpr
+ OptionalStringData
+ OptionalNameString
+ OptionalType
+ OptionalTranslationType_Last
+ ')' {$$ = TrLinkChildren ($<n>3,15,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$19,$20,$21,$22,$23);}
+ | PARSEOP_DWORDIO '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+DWordMemoryTerm
+ : PARSEOP_DWORDMEMORY '(' {$$ = TrCreateLeafNode (PARSEOP_DWORDMEMORY);}
+ OptionalResourceType_First
+ OptionalDecodeType
+ OptionalMinType
+ OptionalMaxType
+ OptionalMemType
+ ',' OptionalReadWriteKeyword
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ OptionalByteConstExpr
+ OptionalStringData
+ OptionalNameString
+ OptionalAddressRange
+ OptionalType_Last
+ ')' {$$ = TrLinkChildren ($<n>3,16,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$20,$21,$22,$23,$24,$25);}
+ | PARSEOP_DWORDMEMORY '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+DWordSpaceTerm
+ : PARSEOP_DWORDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_DWORDSPACE);}
+ ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);}
+ OptionalResourceType
+ OptionalDecodeType
+ OptionalMinType
+ OptionalMaxType
+ ',' ByteConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ OptionalByteConstExpr
+ OptionalStringData
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,14,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);}
+ | PARSEOP_DWORDSPACE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+
+EndDependentFnTerm
+ : PARSEOP_ENDDEPENDENTFN '('
+ ')' {$$ = TrCreateLeafNode (PARSEOP_ENDDEPENDENTFN);}
+ | PARSEOP_ENDDEPENDENTFN '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ExtendedIOTerm
+ : PARSEOP_EXTENDEDIO '(' {$$ = TrCreateLeafNode (PARSEOP_EXTENDEDIO);}
+ OptionalResourceType_First
+ OptionalMinType
+ OptionalMaxType
+ OptionalDecodeType
+ OptionalRangeType
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ OptionalQWordConstExpr
+ OptionalNameString
+ OptionalType
+ OptionalTranslationType_Last
+ ')' {$$ = TrLinkChildren ($<n>3,14,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$19,$20,$21,$22);}
+ | PARSEOP_EXTENDEDIO '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ExtendedMemoryTerm
+ : PARSEOP_EXTENDEDMEMORY '(' {$$ = TrCreateLeafNode (PARSEOP_EXTENDEDMEMORY);}
+ OptionalResourceType_First
+ OptionalDecodeType
+ OptionalMinType
+ OptionalMaxType
+ OptionalMemType
+ ',' OptionalReadWriteKeyword
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ OptionalQWordConstExpr
+ OptionalNameString
+ OptionalAddressRange
+ OptionalType_Last
+ ')' {$$ = TrLinkChildren ($<n>3,15,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$20,$21,$22,$23,$24);}
+ | PARSEOP_EXTENDEDMEMORY '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+ExtendedSpaceTerm
+ : PARSEOP_EXTENDEDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_EXTENDEDSPACE);}
+ ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);}
+ OptionalResourceType
+ OptionalDecodeType
+ OptionalMinType
+ OptionalMaxType
+ ',' ByteConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ OptionalQWordConstExpr
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,13,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23);}
+ | PARSEOP_EXTENDEDSPACE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+FixedIOTerm
+ : PARSEOP_FIXEDIO '(' {$$ = TrCreateLeafNode (PARSEOP_FIXEDIO);}
+ WordConstExpr
+ ',' ByteConstExpr
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,3,$4,$6,$7);}
+ | PARSEOP_FIXEDIO '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+InterruptTerm
+ : PARSEOP_INTERRUPT '(' {$$ = TrCreateLeafNode (PARSEOP_INTERRUPT);}
+ OptionalResourceType_First
+ ',' InterruptTypeKeyword
+ ',' InterruptLevel
+ OptionalShareType
+ OptionalByteConstExpr
+ OptionalStringData
+ OptionalNameString_Last
+ ')' '{'
+ DWordList '}' {$$ = TrLinkChildren ($<n>3,8,$4,$6,$8,$9,$10,$11,$12,$15);}
+ | PARSEOP_INTERRUPT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+IOTerm
+ : PARSEOP_IO '(' {$$ = TrCreateLeafNode (PARSEOP_IO);}
+ IODecodeKeyword
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' ByteConstExpr
+ ',' ByteConstExpr
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$12,$13);}
+ | PARSEOP_IO '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+IRQNoFlagsTerm
+ : PARSEOP_IRQNOFLAGS '(' {$$ = TrCreateLeafNode (PARSEOP_IRQNOFLAGS);}
+ OptionalNameString_First
+ ')' '{'
+ ByteList '}' {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
+ | PARSEOP_IRQNOFLAGS '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+IRQTerm
+ : PARSEOP_IRQ '(' {$$ = TrCreateLeafNode (PARSEOP_IRQ);}
+ InterruptTypeKeyword
+ ',' InterruptLevel
+ OptionalShareType
+ OptionalNameString_Last
+ ')' '{'
+ ByteList '}' {$$ = TrLinkChildren ($<n>3,5,$4,$6,$7,$8,$11);}
+ | PARSEOP_IRQ '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+Memory24Term
+ : PARSEOP_MEMORY24 '(' {$$ = TrCreateLeafNode (PARSEOP_MEMORY24);}
+ OptionalReadWriteKeyword
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$12,$13);}
+ | PARSEOP_MEMORY24 '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+Memory32FixedTerm
+ : PARSEOP_MEMORY32FIXED '(' {$$ = TrCreateLeafNode (PARSEOP_MEMORY32FIXED);}
+ OptionalReadWriteKeyword
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,4,$4,$6,$8,$9);}
+ | PARSEOP_MEMORY32FIXED '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+Memory32Term
+ : PARSEOP_MEMORY32 '(' {$$ = TrCreateLeafNode (PARSEOP_MEMORY32);}
+ OptionalReadWriteKeyword
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ ',' DWordConstExpr
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$12,$13);}
+ | PARSEOP_MEMORY32 '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+QWordIOTerm
+ : PARSEOP_QWORDIO '(' {$$ = TrCreateLeafNode (PARSEOP_QWORDIO);}
+ OptionalResourceType_First
+ OptionalMinType
+ OptionalMaxType
+ OptionalDecodeType
+ OptionalRangeType
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ OptionalByteConstExpr
+ OptionalStringData
+ OptionalNameString
+ OptionalType
+ OptionalTranslationType_Last
+ ')' {$$ = TrLinkChildren ($<n>3,15,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$19,$20,$21,$22,$23);}
+ | PARSEOP_QWORDIO '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+QWordMemoryTerm
+ : PARSEOP_QWORDMEMORY '(' {$$ = TrCreateLeafNode (PARSEOP_QWORDMEMORY);}
+ OptionalResourceType_First
+ OptionalDecodeType
+ OptionalMinType
+ OptionalMaxType
+ OptionalMemType
+ ',' OptionalReadWriteKeyword
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ OptionalByteConstExpr
+ OptionalStringData
+ OptionalNameString
+ OptionalAddressRange
+ OptionalType_Last
+ ')' {$$ = TrLinkChildren ($<n>3,16,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$20,$21,$22,$23,$24,$25);}
+ | PARSEOP_QWORDMEMORY '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+QWordSpaceTerm
+ : PARSEOP_QWORDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_QWORDSPACE);}
+ ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);}
+ OptionalResourceType
+ OptionalDecodeType
+ OptionalMinType
+ OptionalMaxType
+ ',' ByteConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ ',' QWordConstExpr
+ OptionalByteConstExpr
+ OptionalStringData
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,14,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);}
+ | PARSEOP_QWORDSPACE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+RegisterTerm
+ : PARSEOP_REGISTER '(' {$$ = TrCreateLeafNode (PARSEOP_REGISTER);}
+ AddressSpaceKeyword
+ ',' ByteConstExpr
+ ',' ByteConstExpr
+ ',' QWordConstExpr
+ OptionalAccessSize
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,6,$4,$6,$8,$10,$11,$12);}
+ | PARSEOP_REGISTER '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+StartDependentFnTerm
+ : PARSEOP_STARTDEPENDENTFN '(' {$$ = TrCreateLeafNode (PARSEOP_STARTDEPENDENTFN);}
+ ByteConstExpr
+ ',' ByteConstExpr
+ ')' '{'
+ ResourceMacroList '}' {$$ = TrLinkChildren ($<n>3,3,$4,$6,$9);}
+ | PARSEOP_STARTDEPENDENTFN '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+StartDependentFnNoPriTerm
+ : PARSEOP_STARTDEPENDENTFN_NOPRI '(' {$$ = TrCreateLeafNode (PARSEOP_STARTDEPENDENTFN_NOPRI);}
+ ')' '{'
+ ResourceMacroList '}' {$$ = TrLinkChildren ($<n>3,1,$6);}
+ | PARSEOP_STARTDEPENDENTFN_NOPRI '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+VendorLongTerm
+ : PARSEOP_VENDORLONG '(' {$$ = TrCreateLeafNode (PARSEOP_VENDORLONG);}
+ OptionalNameString_First
+ ')' '{'
+ ByteList '}' {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
+ | PARSEOP_VENDORLONG '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+VendorShortTerm
+ : PARSEOP_VENDORSHORT '(' {$$ = TrCreateLeafNode (PARSEOP_VENDORSHORT);}
+ OptionalNameString_First
+ ')' '{'
+ ByteList '}' {$$ = TrLinkChildren ($<n>3,2,$4,$7);}
+ | PARSEOP_VENDORSHORT '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+WordBusNumberTerm
+ : PARSEOP_WORDBUSNUMBER '(' {$$ = TrCreateLeafNode (PARSEOP_WORDBUSNUMBER);}
+ OptionalResourceType_First
+ OptionalMinType
+ OptionalMaxType
+ OptionalDecodeType
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ OptionalByteConstExpr
+ OptionalStringData
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,12,$4,$5,$6,$7,$9,$11,$13,$15,$17,$18,$19,$20);}
+ | PARSEOP_WORDBUSNUMBER '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+WordIOTerm
+ : PARSEOP_WORDIO '(' {$$ = TrCreateLeafNode (PARSEOP_WORDIO);}
+ OptionalResourceType_First
+ OptionalMinType
+ OptionalMaxType
+ OptionalDecodeType
+ OptionalRangeType
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ OptionalByteConstExpr
+ OptionalStringData
+ OptionalNameString
+ OptionalType
+ OptionalTranslationType_Last
+ ')' {$$ = TrLinkChildren ($<n>3,15,$4,$5,$6,$7,$8,$10,$12,$14,$16,$18,$19,$20,$21,$22,$23);}
+ | PARSEOP_WORDIO '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+WordSpaceTerm
+ : PARSEOP_WORDSPACE '(' {$$ = TrCreateLeafNode (PARSEOP_WORDSPACE);}
+ ByteConstExpr {$$ = UtCheckIntegerRange ($4, 0xC0, 0xFF);}
+ OptionalResourceType
+ OptionalDecodeType
+ OptionalMinType
+ OptionalMaxType
+ ',' ByteConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ ',' WordConstExpr
+ OptionalByteConstExpr
+ OptionalStringData
+ OptionalNameString_Last
+ ')' {$$ = TrLinkChildren ($<n>3,14,$4,$6,$7,$8,$9,$11,$13,$15,$17,$19,$21,$22,$23,$24);}
+ | PARSEOP_WORDSPACE '('
+ error ')' {$$ = AslDoError(); yyclearin;}
+ ;
+
+
+/******* Object References ***********************************************/
+
+/* Allow IO, DMA, IRQ Resource macro names to also be used as identifiers */
+
+NameString
+ : NameSeg {}
+ | PARSEOP_NAMESTRING {$$ = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, (ACPI_NATIVE_INT) AslCompilerlval.s);}
+ | PARSEOP_IO {$$ = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, (ACPI_NATIVE_INT) "IO");}
+ | PARSEOP_DMA {$$ = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, (ACPI_NATIVE_INT) "DMA");}
+ | PARSEOP_IRQ {$$ = TrCreateValuedLeafNode (PARSEOP_NAMESTRING, (ACPI_NATIVE_INT) "IRQ");}
+ ;
+
+NameSeg
+ : PARSEOP_NAMESEG {$$ = TrCreateValuedLeafNode (PARSEOP_NAMESEG, (ACPI_NATIVE_INT) AslCompilerlval.s);}
+ ;
+
+
+/******* Helper rules ****************************************************/
+
+
+AmlPackageLengthTerm
+ : Integer {$$ = TrUpdateNode (PARSEOP_PACKAGE_LENGTH,(ACPI_PARSE_OBJECT *) $1);}
+ ;
+
+OptionalBusMasterKeyword
+ : ',' {$$ = TrCreateLeafNode (PARSEOP_BUSMASTERTYPE_MASTER);}
+ | ',' PARSEOP_BUSMASTERTYPE_MASTER {$$ = TrCreateLeafNode (PARSEOP_BUSMASTERTYPE_MASTER);}
+ | ',' PARSEOP_BUSMASTERTYPE_NOTMASTER {$$ = TrCreateLeafNode (PARSEOP_BUSMASTERTYPE_NOTMASTER);}
+ ;
+
+OptionalAccessAttribTerm
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' ByteConstExpr {$$ = $2;}
+ | ',' AccessAttribKeyword {$$ = $2;}
+ ;
+
+OptionalAccessSize
+ : {$$ = TrCreateValuedLeafNode (PARSEOP_BYTECONST, 0);}
+ | ',' {$$ = TrCreateValuedLeafNode (PARSEOP_BYTECONST, 0);}
+ | ',' ByteConstExpr {$$ = $2;}
+ ;
+
+OptionalAddressRange
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' AddressKeyword {$$ = $2;}
+ ;
+
+OptionalByteConstExpr
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' ByteConstExpr {$$ = $2;}
+ ;
+
+OptionalDecodeType
+ : ',' {$$ = NULL;}
+ | ',' DecodeKeyword {$$ = $2;}
+ ;
+
+OptionalDWordConstExpr
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' DWordConstExpr {$$ = $2;}
+ ;
+
+OptionalListString
+ : {$$ = TrCreateValuedLeafNode (PARSEOP_STRING_LITERAL, ACPI_TO_INTEGER (""));} /* Placeholder is a NULL string */
+ | ',' {$$ = TrCreateValuedLeafNode (PARSEOP_STRING_LITERAL, ACPI_TO_INTEGER (""));} /* Placeholder is a NULL string */
+ | ',' TermArg {$$ = $2;}
+ ;
+
+OptionalMaxType
+ : ',' {$$ = NULL;}
+ | ',' MaxKeyword {$$ = $2;}
+ ;
+
+OptionalMemType
+ : ',' {$$ = NULL;}
+ | ',' MemTypeKeyword {$$ = $2;}
+ ;
+
+OptionalMinType
+ : ',' {$$ = NULL;}
+ | ',' MinKeyword {$$ = $2;}
+ ;
+
+OptionalNameString
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' NameString {$$ = $2;}
+ ;
+
+OptionalNameString_Last
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' NameString {$$ = $2;}
+ ;
+
+OptionalNameString_First
+ : {$$ = TrCreateLeafNode (PARSEOP_ZERO);}
+ | NameString {$$ = $1;}
+ ;
+
+OptionalObjectTypeKeyword
+ : {$$ = TrCreateLeafNode (PARSEOP_OBJECTTYPE_UNK);}
+ | ',' ObjectTypeKeyword {$$ = $2;}
+ ;
+
+OptionalQWordConstExpr
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' QWordConstExpr {$$ = $2;}
+ ;
+
+OptionalRangeType
+ : ',' {$$ = NULL;}
+ | ',' RangeTypeKeyword {$$ = $2;}
+ ;
+
+OptionalReference
+ : {$$ = TrCreateLeafNode (PARSEOP_ZERO);} /* Placeholder is a ZeroOp object */
+ | ',' {$$ = TrCreateLeafNode (PARSEOP_ZERO);} /* Placeholder is a ZeroOp object */
+ | ',' DataObject {$$ = $2;}
+ | ',' NameString {$$ = $2;}
+ ;
+
+OptionalResourceType_First
+ : {$$ = NULL;}
+ | ResourceTypeKeyword {$$ = $1;}
+ ;
+
+OptionalResourceType
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' ResourceTypeKeyword {$$ = $2;}
+ ;
+
+OptionalSerializeRuleKeyword
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' SerializeRuleKeyword {$$ = $2;}
+ ;
+
+OptionalShareType
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' ShareTypeKeyword {$$ = $2;}
+ ;
+
+OptionalStringData
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' StringData {$$ = $2;}
+ ;
+
+OptionalTermArg
+ : {$$ = NULL;}
+ | TermArg {$$ = $1;}
+ ;
+
+OptionalReturnArg
+ : {$$ = TrCreateLeafNode (PARSEOP_ZERO);} /* Placeholder is a ZeroOp object */
+ | TermArg {$$ = $1;}
+ ;
+
+OptionalType
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' TypeKeyword {$$ = $2;}
+ ;
+
+OptionalType_Last
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' TypeKeyword {$$ = $2;}
+ ;
+
+OptionalTranslationType_Last
+ : {$$ = NULL;}
+ | ',' {$$ = NULL;}
+ | ',' TranslationKeyword {$$ = $2;}
+ ;
+
+
+TermArgItem
+ : ',' TermArg {$$ = $2;}
+ | ',' error {$$ = AslDoError (); yyclearin;}
+ ;
+
+NameStringItem
+ : ',' NameString {$$ = $2;}
+ | ',' error {$$ = AslDoError (); yyclearin;}
+ ;
+
+
+%%
+
+
+/*
+ * Local support functions
+ */
+
+int
+AslCompilerwrap(void)
+{
+ return 1;
+}
+
+/*! [End] no source code translation !*/
+
+void *
+AslLocalAllocate (unsigned int Size)
+{
+ void *Mem;
+
+
+ DbgPrint (ASL_PARSE_OUTPUT, "\nAslLocalAllocate: Expanding Stack to %d\n\n", Size);
+
+ Mem = ACPI_ALLOCATE_ZEROED (Size);
+ if (!Mem)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_InputByteCount, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
+ exit (1);
+ }
+
+ return (Mem);
+}
+
+ACPI_PARSE_OBJECT *
+AslDoError (void)
+{
+
+
+ return (TrCreateLeafNode (PARSEOP_ERRORNODE));
+
+}
diff --git a/sys/contrib/dev/acpica/compiler/asldefine.h b/sys/contrib/dev/acpica/compiler/asldefine.h
new file mode 100644
index 0000000..29f3568
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/asldefine.h
@@ -0,0 +1,211 @@
+
+/******************************************************************************
+ *
+ * Module Name: asldefine.h - Common defines for the iASL compiler
+ * $Revision: 1.7 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#ifndef __ASLDEFINE_H
+#define __ASLDEFINE_H
+
+
+/*
+ * Compiler versions and names
+ */
+#define CompilerCreatorRevision ACPI_CA_VERSION
+
+#define IntelAcpiCA "Intel ACPI Component Architecture"
+#define CompilerId "ASL Optimizing Compiler"
+#define DisassemblerId "AML Disassembler"
+#define CompilerCopyright "Copyright (C) 2000 - 2007 Intel Corporation"
+#define CompilerCompliance "Supports ACPI Specification Revision 3.0a"
+#define CompilerName "iasl"
+#define CompilerCreatorId "INTL"
+
+
+/* Configuration constants */
+
+#define ASL_MAX_ERROR_COUNT 200
+#define ASL_NODE_CACHE_SIZE 1024
+#define ASL_STRING_CACHE_SIZE 32768
+
+#define ASL_FIRST_PARSE_OPCODE PARSEOP_ACCESSAS
+#define ASL_YYTNAME_START 3
+
+#define ASL_PARSE_OPCODE_BASE PARSEOP_ACCESSAS /* First Lex type */
+
+
+/*
+ * Macros
+ */
+#define ASL_RESDESC_OFFSET(m) ACPI_OFFSET (AML_RESOURCE, m)
+#define ASL_PTR_DIFF(a,b) ((UINT8 *)(b) - (UINT8 *)(a))
+#define ASL_PTR_ADD(a,b) ((UINT8 *)(a) = ((UINT8 *)(a) + (b)))
+#define ASL_GET_CHILD_NODE(a) (a)->Asl.Child
+#define ASL_GET_PEER_NODE(a) (a)->Asl.Next
+#define OP_TABLE_ENTRY(a,b,c,d) {b,d,a,c}
+
+
+/* Internal AML opcodes */
+
+#define AML_RAW_DATA_BYTE (UINT16) 0xAA01 /* write one raw byte */
+#define AML_RAW_DATA_WORD (UINT16) 0xAA02 /* write 2 raw bytes */
+#define AML_RAW_DATA_DWORD (UINT16) 0xAA04 /* write 4 raw bytes */
+#define AML_RAW_DATA_QWORD (UINT16) 0xAA08 /* write 8 raw bytes */
+#define AML_RAW_DATA_BUFFER (UINT16) 0xAA0B /* raw buffer with length */
+#define AML_RAW_DATA_CHAIN (UINT16) 0xAA0C /* chain of raw buffers */
+#define AML_PACKAGE_LENGTH (UINT16) 0xAA10
+#define AML_UNASSIGNED_OPCODE (UINT16) 0xEEEE
+#define AML_DEFAULT_ARG_OP (UINT16) 0xDDDD
+
+
+/* filename suffixes for output files */
+
+#define FILE_SUFFIX_AML_CODE "aml"
+#define FILE_SUFFIX_LISTING "lst"
+#define FILE_SUFFIX_HEX_DUMP "hex"
+#define FILE_SUFFIX_DEBUG "txt"
+#define FILE_SUFFIX_SOURCE "src"
+#define FILE_SUFFIX_NAMESPACE "nsp"
+#define FILE_SUFFIX_ASM_SOURCE "asm"
+#define FILE_SUFFIX_C_SOURCE "c"
+#define FILE_SUFFIX_DISASSEMBLY "dsl"
+#define FILE_SUFFIX_ASM_INCLUDE "inc"
+#define FILE_SUFFIX_C_INCLUDE "h"
+
+
+/* Misc */
+
+#define ASL_EXTERNAL_METHOD 255
+#define ASL_ABORT TRUE
+#define ASL_NO_ABORT FALSE
+
+
+/* Support for reserved method names */
+
+#define ACPI_VALID_RESERVED_NAME_MAX 0x80000000
+#define ACPI_NOT_RESERVED_NAME ACPI_UINT32_MAX
+#define ACPI_PREDEFINED_NAME (ACPI_UINT32_MAX - 1)
+#define ACPI_EVENT_RESERVED_NAME (ACPI_UINT32_MAX - 2)
+#define ACPI_COMPILER_RESERVED_NAME (ACPI_UINT32_MAX - 3)
+
+
+/* String to Integer conversion */
+
+#define NEGATIVE 1
+#define POSITIVE 0
+
+
+#endif /* ASLDEFINE.H */
+
diff --git a/sys/contrib/dev/acpica/compiler/aslerror.c b/sys/contrib/dev/acpica/compiler/aslerror.c
new file mode 100644
index 0000000..7600158
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslerror.c
@@ -0,0 +1,647 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslerror - Error handling and statistics
+ * $Revision: 1.92 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define ASL_EXCEPTIONS
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslerror")
+
+/* Local prototypes */
+
+static void
+AeAddToErrorLog (
+ ASL_ERROR_MSG *Enode);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AeAddToErrorLog
+ *
+ * PARAMETERS: Enode - An error node to add to the log
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Add a new error node to the error log. The error log is
+ * ordered by the "logical" line number (cumulative line number
+ * including all include files.)
+ *
+ ******************************************************************************/
+
+static void
+AeAddToErrorLog (
+ ASL_ERROR_MSG *Enode)
+{
+ ASL_ERROR_MSG *Next;
+ ASL_ERROR_MSG *Prev;
+
+
+ if (!Gbl_ErrorLog)
+ {
+ Gbl_ErrorLog = Enode;
+ return;
+ }
+
+ /* List is sorted according to line number */
+
+ if (!Gbl_ErrorLog)
+ {
+ Gbl_ErrorLog = Enode;
+ return;
+ }
+
+ /* Walk error list until we find a line number greater than ours */
+
+ Prev = NULL;
+ Next = Gbl_ErrorLog;
+
+ while ((Next) &&
+ (Next->LogicalLineNumber <= Enode->LogicalLineNumber))
+ {
+ Prev = Next;
+ Next = Next->Next;
+ }
+
+ /* Found our place in the list */
+
+ Enode->Next = Next;
+
+ if (Prev)
+ {
+ Prev->Next = Enode;
+ }
+ else
+ {
+ Gbl_ErrorLog = Enode;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AePrintException
+ *
+ * PARAMETERS: FileId - ID of output file
+ * Enode - Error node to print
+ * Header - Additional text before each message
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print the contents of an error node.
+ *
+ * NOTE: We don't use the FlxxxFile I/O functions here because on error
+ * they abort the compiler and call this function! Since we
+ * are reporting errors here, we ignore most output errors and
+ * just try to get out as much as we can.
+ *
+ ******************************************************************************/
+
+void
+AePrintException (
+ UINT32 FileId,
+ ASL_ERROR_MSG *Enode,
+ char *Header)
+{
+ UINT8 SourceByte;
+ int Actual;
+ size_t RActual;
+ UINT32 MsgLength;
+ char *MainMessage;
+ char *ExtraMessage;
+ UINT32 SourceColumn;
+ UINT32 ErrorColumn;
+ FILE *OutputFile;
+ FILE *SourceFile;
+
+
+ /*
+ * Only listing files have a header, and remarks/optimizations
+ * are always output
+ */
+ if (!Header)
+ {
+ /* Ignore remarks if requested */
+
+ switch (Enode->Level)
+ {
+ case ASL_REMARK:
+ if (!Gbl_DisplayRemarks)
+ {
+ return;
+ }
+ break;
+
+ case ASL_OPTIMIZATION:
+ if (!Gbl_DisplayOptimizations)
+ {
+ return;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ /* Get the file handles */
+
+ OutputFile = Gbl_Files[FileId].Handle;
+ SourceFile = Gbl_Files[ASL_FILE_SOURCE_OUTPUT].Handle;
+
+ if (Header)
+ {
+ fprintf (OutputFile, "%s", Header);
+ }
+
+ /* Print filename and line number if present and valid */
+
+ if (Enode->Filename)
+ {
+ if (Gbl_VerboseErrors)
+ {
+ fprintf (OutputFile, "%6s", Enode->Filename);
+
+ if (Enode->LineNumber)
+ {
+ fprintf (OutputFile, "%6u: ", Enode->LineNumber);
+
+ /*
+ * Seek to the offset in the combined source file, read the source
+ * line, and write it to the output.
+ */
+ Actual = fseek (SourceFile, (long) Enode->LogicalByteOffset,
+ (int) SEEK_SET);
+ if (Actual)
+ {
+ fprintf (OutputFile,
+ "[*** iASL: Seek error on source code temp file ***]");
+ }
+ else
+ {
+ RActual = fread (&SourceByte, 1, 1, SourceFile);
+ if (!RActual)
+ {
+ fprintf (OutputFile,
+ "[*** iASL: Read error on source code temp file ***]");
+ }
+
+ else while (RActual && SourceByte && (SourceByte != '\n'))
+ {
+ fwrite (&SourceByte, 1, 1, OutputFile);
+ RActual = fread (&SourceByte, 1, 1, SourceFile);
+ }
+ }
+ fprintf (OutputFile, "\n");
+ }
+ }
+ else
+ {
+ fprintf (OutputFile, "%s", Enode->Filename);
+
+ if (Enode->LineNumber)
+ {
+ fprintf (OutputFile, "(%u) : ", Enode->LineNumber);
+ }
+ }
+ }
+
+ /* NULL message ID, just print the raw message */
+
+ if (Enode->MessageId == 0)
+ {
+ fprintf (OutputFile, "%s\n", Enode->Message);
+ }
+ else
+ {
+ /* Decode the message ID */
+
+ fprintf (OutputFile, "%s %4.4d -",
+ AslErrorLevel[Enode->Level],
+ Enode->MessageId + ((Enode->Level+1) * 1000));
+
+ MainMessage = AslMessages[Enode->MessageId];
+ ExtraMessage = Enode->Message;
+
+ if (Enode->LineNumber)
+ {
+ MsgLength = strlen (MainMessage);
+ if (MsgLength == 0)
+ {
+ MainMessage = Enode->Message;
+
+ MsgLength = strlen (MainMessage);
+ ExtraMessage = NULL;
+ }
+
+ if (Gbl_VerboseErrors)
+ {
+ SourceColumn = Enode->Column + Enode->FilenameLength + 6 + 2;
+ ErrorColumn = ASL_ERROR_LEVEL_LENGTH + 5 + 2 + 1;
+
+ if ((MsgLength + ErrorColumn) < (SourceColumn - 1))
+ {
+ fprintf (OutputFile, "%*s%s",
+ (int) ((SourceColumn - 1) - ErrorColumn),
+ MainMessage, " ^ ");
+ }
+ else
+ {
+ fprintf (OutputFile, "%*s %s",
+ (int) ((SourceColumn - ErrorColumn) + 1), "^",
+ MainMessage);
+ }
+ }
+ else
+ {
+ fprintf (OutputFile, " %s", MainMessage);
+ }
+
+ /* Print the extra info message if present */
+
+ if (ExtraMessage)
+ {
+ fprintf (OutputFile, " (%s)", ExtraMessage);
+ }
+
+ fprintf (OutputFile, "\n");
+ if (Gbl_VerboseErrors)
+ {
+ fprintf (OutputFile, "\n");
+ }
+ }
+ else
+ {
+ fprintf (OutputFile, " %s %s\n\n", MainMessage, ExtraMessage);
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AePrintErrorLog
+ *
+ * PARAMETERS: FileId - Where to output the error log
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print the entire contents of the error log
+ *
+ ******************************************************************************/
+
+void
+AePrintErrorLog (
+ UINT32 FileId)
+{
+ ASL_ERROR_MSG *Enode = Gbl_ErrorLog;
+
+
+ /* Walk the error node list */
+
+ while (Enode)
+ {
+ AePrintException (FileId, Enode, NULL);
+ Enode = Enode->Next;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslCommonError
+ *
+ * PARAMETERS: Level - Seriousness (Warning/error, etc.)
+ * MessageId - Index into global message buffer
+ * CurrentLineNumber - Actual file line number
+ * LogicalLineNumber - Cumulative line number
+ * LogicalByteOffset - Byte offset in source file
+ * Column - Column in current line
+ * Filename - source filename
+ * ExtraMessage - additional error message
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Create a new error node and add it to the error log
+ *
+ ******************************************************************************/
+
+void
+AslCommonError (
+ UINT8 Level,
+ UINT8 MessageId,
+ UINT32 CurrentLineNumber,
+ UINT32 LogicalLineNumber,
+ UINT32 LogicalByteOffset,
+ UINT32 Column,
+ char *Filename,
+ char *ExtraMessage)
+{
+ UINT32 MessageSize;
+ char *MessageBuffer = NULL;
+ ASL_ERROR_MSG *Enode;
+
+
+ Enode = UtLocalCalloc (sizeof (ASL_ERROR_MSG));
+
+ if (ExtraMessage)
+ {
+ /* Allocate a buffer for the message and a new error node */
+
+ MessageSize = strlen (ExtraMessage) + 1;
+ MessageBuffer = UtLocalCalloc (MessageSize);
+
+ /* Keep a copy of the extra message */
+
+ ACPI_STRCPY (MessageBuffer, ExtraMessage);
+ }
+
+ /* Initialize the error node */
+
+ if (Filename)
+ {
+ Enode->Filename = Filename;
+ Enode->FilenameLength = strlen (Filename);
+ if (Enode->FilenameLength < 6)
+ {
+ Enode->FilenameLength = 6;
+ }
+ }
+
+ Enode->MessageId = MessageId;
+ Enode->Level = Level;
+ Enode->LineNumber = CurrentLineNumber;
+ Enode->LogicalLineNumber = LogicalLineNumber;
+ Enode->LogicalByteOffset = LogicalByteOffset;
+ Enode->Column = Column;
+ Enode->Message = MessageBuffer;
+
+ /* Add the new node to the error node list */
+
+ AeAddToErrorLog (Enode);
+
+ if (Gbl_DebugFlag)
+ {
+ /* stderr is a file, send error to it immediately */
+
+ AePrintException (ASL_FILE_STDERR, Enode, NULL);
+ }
+
+ Gbl_ExceptionCount[Level]++;
+ if (Gbl_ExceptionCount[ASL_ERROR] > ASL_MAX_ERROR_COUNT)
+ {
+ printf ("\nMaximum error count (%d) exceeded\n", ASL_MAX_ERROR_COUNT);
+
+ Gbl_SourceLine = 0;
+ Gbl_NextError = Gbl_ErrorLog;
+ CmDoOutputFiles ();
+ CmCleanupAndExit ();
+ }
+
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslError
+ *
+ * PARAMETERS: Level - Seriousness (Warning/error, etc.)
+ * MessageId - Index into global message buffer
+ * Op - Parse node where error happened
+ * ExtraMessage - additional error message
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Main error reporting routine for the ASL compiler (all code
+ * except the parser.)
+ *
+ ******************************************************************************/
+
+void
+AslError (
+ UINT8 Level,
+ UINT8 MessageId,
+ ACPI_PARSE_OBJECT *Op,
+ char *ExtraMessage)
+{
+
+ switch (Level)
+ {
+ case ASL_WARNING2:
+ case ASL_WARNING3:
+ if (Gbl_WarningLevel < Level)
+ {
+ return;
+ }
+ break;
+
+ default:
+ break;
+ }
+
+
+ if (Op)
+ {
+ AslCommonError (Level, MessageId, Op->Asl.LineNumber,
+ Op->Asl.LogicalLineNumber,
+ Op->Asl.LogicalByteOffset,
+ Op->Asl.Column,
+ Op->Asl.Filename, ExtraMessage);
+ }
+ else
+ {
+ AslCommonError (Level, MessageId, 0,
+ 0, 0, 0, NULL, ExtraMessage);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslCoreSubsystemError
+ *
+ * PARAMETERS: Op - Parse node where error happened
+ * Status - The ACPI CA Exception
+ * ExtraMessage - additional error message
+ * Abort - TRUE -> Abort compilation
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Error reporting routine for exceptions returned by the ACPI
+ * CA core subsystem.
+ *
+ ******************************************************************************/
+
+void
+AslCoreSubsystemError (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_STATUS Status,
+ char *ExtraMessage,
+ BOOLEAN Abort)
+{
+
+ sprintf (MsgBuffer, "%s %s", AcpiFormatException (Status), ExtraMessage);
+
+ if (Op)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Op->Asl.LineNumber,
+ Op->Asl.LogicalLineNumber,
+ Op->Asl.LogicalByteOffset,
+ Op->Asl.Column,
+ Op->Asl.Filename, MsgBuffer);
+ }
+ else
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, 0,
+ 0, 0, 0, NULL, MsgBuffer);
+ }
+
+ if (Abort)
+ {
+ AslAbort ();
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslCompilererror
+ *
+ * PARAMETERS: CompilerMessage - Error message from the parser
+ *
+ * RETURN: Status (0 for now)
+ *
+ * DESCRIPTION: Report an error situation discovered in a production
+ * NOTE: don't change the name of this function, it is called
+ * from the auto-generated parser.
+ *
+ ******************************************************************************/
+
+int
+AslCompilererror (
+ char *CompilerMessage)
+{
+
+ AslCommonError (ASL_ERROR, ASL_MSG_SYNTAX, Gbl_CurrentLineNumber,
+ Gbl_LogicalLineNumber, Gbl_CurrentLineOffset,
+ Gbl_CurrentColumn, Gbl_Files[ASL_FILE_INPUT].Filename,
+ CompilerMessage);
+
+ return 0;
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslfiles.c b/sys/contrib/dev/acpica/compiler/aslfiles.c
new file mode 100644
index 0000000..9eace43
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslfiles.c
@@ -0,0 +1,873 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslfiles - file I/O suppoert
+ * $Revision: 1.54 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include <contrib/dev/acpica/acapps.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslfiles")
+
+/* Local prototypes */
+
+static void
+FlOpenFile (
+ UINT32 FileId,
+ char *Filename,
+ char *Mode);
+
+static FILE *
+FlOpenLocalFile (
+ char *LocalName,
+ char *Mode);
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+ACPI_STATUS
+FlParseInputPathname (
+ char *InputFilename);
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslAbort
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump the error log and abort the compiler. Used for serious
+ * I/O errors
+ *
+ ******************************************************************************/
+
+void
+AslAbort (
+ void)
+{
+
+ AePrintErrorLog (ASL_FILE_STDOUT);
+ if (Gbl_DebugFlag)
+ {
+ /* Print error summary to the debug file */
+
+ AePrintErrorLog (ASL_FILE_STDERR);
+ }
+
+ exit (1);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlOpenLocalFile
+ *
+ * PARAMETERS: LocalName - Single filename (not a pathname)
+ * Mode - Open mode for fopen
+ *
+ * RETURN: File descriptor
+ *
+ * DESCRIPTION: Build a complete pathname for the input filename and open
+ * the file.
+ *
+ ******************************************************************************/
+
+static FILE *
+FlOpenLocalFile (
+ char *LocalName,
+ char *Mode)
+{
+
+ strcpy (StringBuffer, Gbl_DirectoryPath);
+ strcat (StringBuffer, LocalName);
+
+ DbgPrint (ASL_PARSE_OUTPUT, "FlOpenLocalFile: %s\n", StringBuffer);
+ return (fopen (StringBuffer, (const char *) Mode));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlFileError
+ *
+ * PARAMETERS: FileId - Index into file info array
+ * ErrorId - Index into error message array
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode errno to an error message and add the entire error
+ * to the error log.
+ *
+ ******************************************************************************/
+
+void
+FlFileError (
+ UINT32 FileId,
+ UINT8 ErrorId)
+{
+
+ sprintf (MsgBuffer, "\"%s\" (%s)", Gbl_Files[FileId].Filename,
+ strerror (errno));
+ AslCommonError (ASL_ERROR, ErrorId, 0, 0, 0, 0, NULL, MsgBuffer);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlOpenFile
+ *
+ * PARAMETERS: FileId - Index into file info array
+ * Filename - file pathname to open
+ * Mode - Open mode for fopen
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Open a file.
+ * NOTE: Aborts compiler on any error.
+ *
+ ******************************************************************************/
+
+static void
+FlOpenFile (
+ UINT32 FileId,
+ char *Filename,
+ char *Mode)
+{
+ FILE *File;
+
+
+ File = fopen (Filename, Mode);
+
+ Gbl_Files[FileId].Filename = Filename;
+ Gbl_Files[FileId].Handle = File;
+
+ if (!File)
+ {
+ FlFileError (FileId, ASL_MSG_OPEN);
+ AslAbort ();
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlReadFile
+ *
+ * PARAMETERS: FileId - Index into file info array
+ * Buffer - Where to place the data
+ * Length - Amount to read
+ *
+ * RETURN: Status. AE_ERROR indicates EOF.
+ *
+ * DESCRIPTION: Read data from an open file.
+ * NOTE: Aborts compiler on any error.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+FlReadFile (
+ UINT32 FileId,
+ void *Buffer,
+ UINT32 Length)
+{
+ UINT32 Actual;
+
+
+ /* Read and check for error */
+
+ Actual = fread (Buffer, 1, Length, Gbl_Files[FileId].Handle);
+ if (Actual != Length)
+ {
+ if (feof (Gbl_Files[FileId].Handle))
+ {
+ /* End-of-file, just return error */
+
+ return (AE_ERROR);
+ }
+
+ FlFileError (FileId, ASL_MSG_READ);
+ AslAbort ();
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlWriteFile
+ *
+ * PARAMETERS: FileId - Index into file info array
+ * Buffer - Data to write
+ * Length - Amount of data to write
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Write data to an open file.
+ * NOTE: Aborts compiler on any error.
+ *
+ ******************************************************************************/
+
+void
+FlWriteFile (
+ UINT32 FileId,
+ void *Buffer,
+ UINT32 Length)
+{
+ UINT32 Actual;
+
+
+ /* Write and check for error */
+
+ Actual = fwrite ((char *) Buffer, 1, Length, Gbl_Files[FileId].Handle);
+ if (Actual != Length)
+ {
+ FlFileError (FileId, ASL_MSG_WRITE);
+ AslAbort ();
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlPrintFile
+ *
+ * PARAMETERS: FileId - Index into file info array
+ * Format - Printf format string
+ * ... - Printf arguments
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Formatted write to an open file.
+ * NOTE: Aborts compiler on any error.
+ *
+ ******************************************************************************/
+
+void
+FlPrintFile (
+ UINT32 FileId,
+ char *Format,
+ ...)
+{
+ INT32 Actual;
+ va_list Args;
+
+
+ va_start (Args, Format);
+
+ Actual = vfprintf (Gbl_Files[FileId].Handle, Format, Args);
+ if (Actual == -1)
+ {
+ FlFileError (FileId, ASL_MSG_WRITE);
+ AslAbort ();
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlSeekFile
+ *
+ * PARAMETERS: FileId - Index into file info array
+ * Offset - Absolute byte offset in file
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Seek to absolute offset
+ * NOTE: Aborts compiler on any error.
+ *
+ ******************************************************************************/
+
+void
+FlSeekFile (
+ UINT32 FileId,
+ long Offset)
+{
+ int Error;
+
+
+ Error = fseek (Gbl_Files[FileId].Handle, Offset, SEEK_SET);
+ if (Error)
+ {
+ FlFileError (FileId, ASL_MSG_SEEK);
+ AslAbort ();
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlCloseFile
+ *
+ * PARAMETERS: FileId - Index into file info array
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Close an open file. Aborts compiler on error
+ *
+ ******************************************************************************/
+
+void
+FlCloseFile (
+ UINT32 FileId)
+{
+ int Error;
+
+
+ if (!Gbl_Files[FileId].Handle)
+ {
+ return;
+ }
+
+ Error = fclose (Gbl_Files[FileId].Handle);
+ Gbl_Files[FileId].Handle = NULL;
+
+ if (Error)
+ {
+ FlFileError (FileId, ASL_MSG_CLOSE);
+ AslAbort ();
+ }
+
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlSetLineNumber
+ *
+ * PARAMETERS: Op - Parse node for the LINE asl statement
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Set the current line number
+ *
+ ******************************************************************************/
+
+void
+FlSetLineNumber (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ Gbl_CurrentLineNumber = (UINT32) Op->Asl.Value.Integer;
+ Gbl_LogicalLineNumber = (UINT32) Op->Asl.Value.Integer;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlOpenIncludeFile
+ *
+ * PARAMETERS: Op - Parse node for the INCLUDE ASL statement
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Open an include file and push it on the input file stack.
+ *
+ ******************************************************************************/
+
+void
+FlOpenIncludeFile (
+ ACPI_PARSE_OBJECT *Op)
+{
+ FILE *IncFile;
+
+
+ /* Op must be valid */
+
+ if (!Op)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_InputByteCount, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, " - Null parse node");
+
+ return;
+ }
+
+ /*
+ * Flush out the "include ()" statement on this line, start
+ * the actual include file on the next line
+ */
+ ResetCurrentLineBuffer ();
+ FlPrintFile (ASL_FILE_SOURCE_OUTPUT, "\n");
+ Gbl_CurrentLineOffset++;
+
+ /* Prepend the directory pathname and open the include file */
+
+ DbgPrint (ASL_PARSE_OUTPUT, "\nOpen include file: path %s\n\n",
+ Op->Asl.Value.String);
+ IncFile = FlOpenLocalFile (Op->Asl.Value.String, "r");
+ if (!IncFile)
+ {
+ sprintf (MsgBuffer, "%s (%s)", Op->Asl.Value.String, strerror (errno));
+ AslError (ASL_ERROR, ASL_MSG_INCLUDE_FILE_OPEN, Op, MsgBuffer);
+ return;
+ }
+
+ /* Push the include file on the open input file stack */
+
+ AslPushInputFileStack (IncFile, Op->Asl.Value.String);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlOpenInputFile
+ *
+ * PARAMETERS: InputFilename - The user-specified ASL source file to be
+ * compiled
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Open the specified input file, and save the directory path to
+ * the file so that include files can be opened in
+ * the same directory.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+FlOpenInputFile (
+ char *InputFilename)
+{
+
+ /* Open the input ASL file, text mode */
+
+ FlOpenFile (ASL_FILE_INPUT, InputFilename, "r");
+ AslCompilerin = Gbl_Files[ASL_FILE_INPUT].Handle;
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlOpenAmlOutputFile
+ *
+ * PARAMETERS: FilenamePrefix - The user-specified ASL source file
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create the output filename (*.AML) and open the file. The file
+ * is created in the same directory as the parent input file.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+FlOpenAmlOutputFile (
+ char *FilenamePrefix)
+{
+ char *Filename;
+
+
+ /* Output filename usually comes from the ASL itself */
+
+ Filename = Gbl_Files[ASL_FILE_AML_OUTPUT].Filename;
+ if (!Filename)
+ {
+ /* Create the output AML filename */
+
+ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_AML_CODE);
+ if (!Filename)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_OUTPUT_FILENAME,
+ 0, 0, 0, 0, NULL, NULL);
+ return (AE_ERROR);
+ }
+ }
+
+ /* Open the output AML file in binary mode */
+
+ FlOpenFile (ASL_FILE_AML_OUTPUT, Filename, "w+b");
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: FlOpenMiscOutputFiles
+ *
+ * PARAMETERS: FilenamePrefix - The user-specified ASL source file
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create and open the various output files needed, depending on
+ * the command line options
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+FlOpenMiscOutputFiles (
+ char *FilenamePrefix)
+{
+ char *Filename;
+
+
+ /* Create/Open a combined source output file */
+
+ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_SOURCE);
+ if (!Filename)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
+ 0, 0, 0, 0, NULL, NULL);
+ return (AE_ERROR);
+ }
+
+ /*
+ * Open the source output file, binary mode (so that LF does not get
+ * expanded to CR/LF on some systems, messing up our seek
+ * calculations.)
+ */
+ FlOpenFile (ASL_FILE_SOURCE_OUTPUT, Filename, "w+b");
+
+ /* Create/Open a listing output file if asked */
+
+ if (Gbl_ListingFlag)
+ {
+ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_LISTING);
+ if (!Filename)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
+ 0, 0, 0, 0, NULL, NULL);
+ return (AE_ERROR);
+ }
+
+ /* Open the listing file, text mode */
+
+ FlOpenFile (ASL_FILE_LISTING_OUTPUT, Filename, "w+");
+
+ AslCompilerSignon (ASL_FILE_LISTING_OUTPUT);
+ AslCompilerFileHeader (ASL_FILE_LISTING_OUTPUT);
+ }
+
+ /* Create/Open a assembly code source output file if asked */
+
+ if (Gbl_AsmOutputFlag)
+ {
+ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_SOURCE);
+ if (!Filename)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
+ 0, 0, 0, 0, NULL, NULL);
+ return (AE_ERROR);
+ }
+
+ /* Open the assembly code source file, text mode */
+
+ FlOpenFile (ASL_FILE_ASM_SOURCE_OUTPUT, Filename, "w+");
+
+ AslCompilerSignon (ASL_FILE_ASM_SOURCE_OUTPUT);
+ AslCompilerFileHeader (ASL_FILE_ASM_SOURCE_OUTPUT);
+ }
+
+ /* Create/Open a C code source output file if asked */
+
+ if (Gbl_C_OutputFlag)
+ {
+ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_SOURCE);
+ if (!Filename)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
+ 0, 0, 0, 0, NULL, NULL);
+ return (AE_ERROR);
+ }
+
+ /* Open the C code source file, text mode */
+
+ FlOpenFile (ASL_FILE_C_SOURCE_OUTPUT, Filename, "w+");
+
+ FlPrintFile (ASL_FILE_C_SOURCE_OUTPUT, "/*\n");
+ AslCompilerSignon (ASL_FILE_C_SOURCE_OUTPUT);
+ AslCompilerFileHeader (ASL_FILE_C_SOURCE_OUTPUT);
+ }
+
+ /* Create/Open a assembly include output file if asked */
+
+ if (Gbl_AsmIncludeOutputFlag)
+ {
+ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_ASM_INCLUDE);
+ if (!Filename)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
+ 0, 0, 0, 0, NULL, NULL);
+ return (AE_ERROR);
+ }
+
+ /* Open the assembly include file, text mode */
+
+ FlOpenFile (ASL_FILE_ASM_INCLUDE_OUTPUT, Filename, "w+");
+
+ AslCompilerSignon (ASL_FILE_ASM_INCLUDE_OUTPUT);
+ AslCompilerFileHeader (ASL_FILE_ASM_INCLUDE_OUTPUT);
+ }
+
+ /* Create/Open a C include output file if asked */
+
+ if (Gbl_C_IncludeOutputFlag)
+ {
+ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_C_INCLUDE);
+ if (!Filename)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
+ 0, 0, 0, 0, NULL, NULL);
+ return (AE_ERROR);
+ }
+
+ /* Open the C include file, text mode */
+
+ FlOpenFile (ASL_FILE_C_INCLUDE_OUTPUT, Filename, "w+");
+
+ FlPrintFile (ASL_FILE_C_INCLUDE_OUTPUT, "/*\n");
+ AslCompilerSignon (ASL_FILE_C_INCLUDE_OUTPUT);
+ AslCompilerFileHeader (ASL_FILE_C_INCLUDE_OUTPUT);
+ }
+
+ /* Create/Open a hex output file if asked */
+
+ if (Gbl_HexOutputFlag)
+ {
+ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_HEX_DUMP);
+ if (!Filename)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
+ 0, 0, 0, 0, NULL, NULL);
+ return (AE_ERROR);
+ }
+
+ /* Open the hex file, text mode */
+
+ FlOpenFile (ASL_FILE_HEX_OUTPUT, Filename, "w+");
+
+ AslCompilerSignon (ASL_FILE_HEX_OUTPUT);
+ AslCompilerFileHeader (ASL_FILE_HEX_OUTPUT);
+ }
+
+ /* Create a namespace output file if asked */
+
+ if (Gbl_NsOutputFlag)
+ {
+ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_NAMESPACE);
+ if (!Filename)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_LISTING_FILENAME,
+ 0, 0, 0, 0, NULL, NULL);
+ return (AE_ERROR);
+ }
+
+ /* Open the namespace file, text mode */
+
+ FlOpenFile (ASL_FILE_NAMESPACE_OUTPUT, Filename, "w+");
+
+ AslCompilerSignon (ASL_FILE_NAMESPACE_OUTPUT);
+ AslCompilerFileHeader (ASL_FILE_NAMESPACE_OUTPUT);
+ }
+
+ /* Create/Open a debug output file if asked */
+
+ if (Gbl_DebugFlag)
+ {
+ Filename = FlGenerateFilename (FilenamePrefix, FILE_SUFFIX_DEBUG);
+ if (!Filename)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_DEBUG_FILENAME,
+ 0, 0, 0, 0, NULL, NULL);
+ return (AE_ERROR);
+ }
+
+ /* Open the debug file as STDERR, text mode */
+
+ /* TBD: hide this behind a FlReopenFile function */
+
+ Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Filename = Filename;
+ Gbl_Files[ASL_FILE_DEBUG_OUTPUT].Handle =
+ freopen (Filename, "w+t", stderr);
+
+ AslCompilerSignon (ASL_FILE_DEBUG_OUTPUT);
+ AslCompilerFileHeader (ASL_FILE_DEBUG_OUTPUT);
+ }
+
+ return (AE_OK);
+}
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+/*******************************************************************************
+ *
+ * FUNCTION: FlParseInputPathname
+ *
+ * PARAMETERS: InputFilename - The user-specified ASL source file to be
+ * compiled
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Split the input path into a directory and filename part
+ * 1) Directory part used to open include files
+ * 2) Filename part used to generate output filenames
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+FlParseInputPathname (
+ char *InputFilename)
+{
+ char *Substring;
+
+
+ if (!InputFilename)
+ {
+ return (AE_OK);
+ }
+
+ /* Get the path to the input filename's directory */
+
+ Gbl_DirectoryPath = strdup (InputFilename);
+ if (!Gbl_DirectoryPath)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ Substring = strrchr (Gbl_DirectoryPath, '\\');
+ if (!Substring)
+ {
+ Substring = strrchr (Gbl_DirectoryPath, '/');
+ if (!Substring)
+ {
+ Substring = strrchr (Gbl_DirectoryPath, ':');
+ }
+ }
+
+ if (!Substring)
+ {
+ Gbl_DirectoryPath[0] = 0;
+ if (Gbl_UseDefaultAmlFilename)
+ {
+ Gbl_OutputFilenamePrefix = strdup (InputFilename);
+ }
+ }
+ else
+ {
+ if (Gbl_UseDefaultAmlFilename)
+ {
+ Gbl_OutputFilenamePrefix = strdup (Substring + 1);
+ }
+ *(Substring+1) = 0;
+ }
+
+ return (AE_OK);
+}
+#endif
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslfold.c b/sys/contrib/dev/acpica/compiler/aslfold.c
new file mode 100644
index 0000000..d744021
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslfold.c
@@ -0,0 +1,564 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslfold - Constant folding
+ * $Revision: 1.20 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+#include <contrib/dev/acpica/amlcode.h>
+
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acparser.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslfold")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+OpcAmlEvaluationWalk1 (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static ACPI_STATUS
+OpcAmlEvaluationWalk2 (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static ACPI_STATUS
+OpcAmlCheckForConstant (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcAmlEvaluationWalk1
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback for AML execution of constant subtrees
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+OpcAmlEvaluationWalk1 (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_WALK_STATE *WalkState = Context;
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *OutOp;
+
+
+ WalkState->Op = Op;
+ WalkState->Opcode = Op->Common.AmlOpcode;
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ /* Copy child pointer to Arg for compatibility with Interpreter */
+
+ if (Op->Asl.Child)
+ {
+ Op->Common.Value.Arg = Op->Asl.Child;
+ }
+
+ /* Call AML dispatcher */
+
+ Status = AcpiDsExecBeginOp (WalkState, &OutOp);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Constant interpretation failed - %s\n",
+ AcpiFormatException (Status));
+ }
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcAmlEvaluationWalk2
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback for AML execution of constant subtrees
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+OpcAmlEvaluationWalk2 (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_WALK_STATE *WalkState = Context;
+ ACPI_STATUS Status;
+
+
+ WalkState->Op = Op;
+ WalkState->Opcode = Op->Common.AmlOpcode;
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ /* Copy child pointer to Arg for compatibility with Interpreter */
+
+ if (Op->Asl.Child)
+ {
+ Op->Common.Value.Arg = Op->Asl.Child;
+ }
+
+ /* Call AML dispatcher */
+
+ Status = AcpiDsExecEndOp (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Constant interpretation failed - %s\n",
+ AcpiFormatException (Status));
+ }
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcAmlCheckForConstant
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Check one Op for a type 3/4/5 AML opcode
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+OpcAmlCheckForConstant (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_WALK_STATE *WalkState = Context;
+
+
+ WalkState->Op = Op;
+ WalkState->Opcode = Op->Common.AmlOpcode;
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ DbgPrint (ASL_PARSE_OUTPUT, "[%.4d] Opcode: %12.12s ",
+ Op->Asl.LogicalLineNumber, Op->Asl.ParseOpName);
+
+ if (!(WalkState->OpInfo->Flags & AML_CONSTANT))
+ {
+ /* The opcode is not a Type 3/4/5 opcode */
+
+ if (Op->Asl.CompileFlags & NODE_IS_TARGET)
+ {
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "**** Valid Target, cannot reduce ****\n");
+ }
+ else
+ {
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "**** Not a Type 3/4/5 opcode ****\n");
+ }
+
+ if (WalkState->WalkType == ACPI_WALK_CONST_OPTIONAL)
+ {
+ /*
+ * We are looking at at normal expression to see if it can be
+ * reduced. It can't. No error
+ */
+ return (AE_TYPE);
+ }
+
+ /*
+ * This is an expression that MUST reduce to a constant, and it
+ * can't be reduced. This is an error
+ */
+ if (Op->Asl.CompileFlags & NODE_IS_TARGET)
+ {
+ AslError (ASL_ERROR, ASL_MSG_INVALID_TARGET, Op,
+ Op->Asl.ParseOpName);
+ }
+ else
+ {
+ AslError (ASL_ERROR, ASL_MSG_INVALID_CONSTANT_OP, Op,
+ Op->Asl.ParseOpName);
+ }
+
+ return (AE_TYPE);
+ }
+
+ /* Debug output */
+
+ DbgPrint (ASL_PARSE_OUTPUT, "TYPE_345");
+
+ if (Op->Asl.CompileFlags & NODE_IS_TARGET)
+ {
+ DbgPrint (ASL_PARSE_OUTPUT, " TARGET");
+ }
+ if (Op->Asl.CompileFlags & NODE_IS_TERM_ARG)
+ {
+ DbgPrint (ASL_PARSE_OUTPUT, " TERMARG");
+ }
+ DbgPrint (ASL_PARSE_OUTPUT, "\n");
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcAmlConstantWalk
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Reduce an Op and its subtree to a constant if possible
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+OpcAmlConstantWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_WALK_STATE *WalkState;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_PARSE_OBJECT *RootOp;
+ ACPI_PARSE_OBJECT *OriginalParentOp;
+ UINT8 WalkType;
+
+
+ /*
+ * Only interested in subtrees that could possibly contain
+ * expressions that can be evaluated at this time
+ */
+ if ((!(Op->Asl.CompileFlags & NODE_COMPILE_TIME_CONST)) ||
+ (Op->Asl.CompileFlags & NODE_IS_TARGET))
+ {
+ return (AE_OK);
+ }
+
+ /* Set the walk type based on the reduction used for this op */
+
+ if (Op->Asl.CompileFlags & NODE_IS_TERM_ARG)
+ {
+ /* Op is a TermArg, constant folding is merely optional */
+
+ if (!Gbl_FoldConstants)
+ {
+ return (AE_CTRL_DEPTH);
+ }
+
+ WalkType = ACPI_WALK_CONST_OPTIONAL;
+ }
+ else
+ {
+ /* Op is a DataObject, the expression MUST reduced to a constant */
+
+ WalkType = ACPI_WALK_CONST_REQUIRED;
+ }
+
+ /* Create a new walk state */
+
+ WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
+ if (!WalkState)
+ {
+ return AE_NO_MEMORY;
+ }
+
+ WalkState->NextOp = NULL;
+ WalkState->Params = NULL;
+ WalkState->CallerReturnDesc = &ObjDesc;
+ WalkState->WalkType = WalkType;
+
+ /*
+ * Examine the entire subtree -- all nodes must be constants
+ * or type 3/4/5 opcodes
+ */
+ Status = TrWalkParseTree (Op, ASL_WALK_VISIT_DOWNWARD,
+ OpcAmlCheckForConstant, NULL, WalkState);
+
+ /*
+ * Did we find an entire subtree that contains all constants and type 3/4/5
+ * opcodes? (Only AE_OK or AE_TYPE returned from above)
+ */
+ if (Status == AE_TYPE)
+ {
+ /* Subtree cannot be reduced to a constant */
+
+ if (WalkState->WalkType == ACPI_WALK_CONST_OPTIONAL)
+ {
+ AcpiDsDeleteWalkState (WalkState);
+ return (AE_OK);
+ }
+
+ /* Don't descend any further, and use a default "constant" value */
+
+ Status = AE_CTRL_DEPTH;
+ }
+ else
+ {
+ /* Subtree can be reduced */
+
+ /* Allocate a new temporary root for this subtree */
+
+ RootOp = TrAllocateNode (PARSEOP_INTEGER);
+ if (!RootOp)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ RootOp->Common.AmlOpcode = AML_INT_EVAL_SUBTREE_OP;
+
+ OriginalParentOp = Op->Common.Parent;
+ Op->Common.Parent = RootOp;
+
+ /* Hand off the subtree to the AML interpreter */
+
+ Status = TrWalkParseTree (Op, ASL_WALK_VISIT_TWICE,
+ OpcAmlEvaluationWalk1, OpcAmlEvaluationWalk2, WalkState);
+ Op->Common.Parent = OriginalParentOp;
+
+ /* TBD: we really *should* release the RootOp node */
+
+ if (ACPI_SUCCESS (Status))
+ {
+ TotalFolds++;
+
+ /* Get the final result */
+
+ Status = AcpiDsResultPop (&ObjDesc, WalkState);
+ }
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ /* We could not resolve the subtree for some reason */
+
+ AslCoreSubsystemError (Op, Status,
+ "Failure during constant evaluation", FALSE);
+ AslError (ASL_ERROR, ASL_MSG_CONSTANT_EVALUATION, Op,
+ Op->Asl.ParseOpName);
+
+ /* Set the subtree value to ZERO anyway. Eliminates further errors */
+
+ Op->Asl.ParseOpcode = PARSEOP_INTEGER;
+ Op->Common.Value.Integer = 0;
+ OpcSetOptimalIntegerSize (Op);
+ }
+ else
+ {
+ AslError (ASL_OPTIMIZATION, ASL_MSG_CONSTANT_FOLDED, Op,
+ Op->Asl.ParseOpName);
+
+ /*
+ * Because we know we executed type 3/4/5 opcodes above, we know that
+ * the result must be either an Integer, String, or Buffer.
+ */
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+
+ Op->Asl.ParseOpcode = PARSEOP_INTEGER;
+ Op->Common.Value.Integer = ObjDesc->Integer.Value;
+ OpcSetOptimalIntegerSize (Op);
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Constant expression reduced to (INTEGER) %8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ Op->Asl.ParseOpcode = PARSEOP_STRING_LITERAL;
+ Op->Common.AmlOpcode = AML_STRING_OP;
+ Op->Asl.AmlLength = ACPI_STRLEN (ObjDesc->String.Pointer) + 1;
+ Op->Common.Value.String = ObjDesc->String.Pointer;
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Constant expression reduced to (STRING) %s\n",
+ Op->Common.Value.String);
+
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ Op->Asl.ParseOpcode = PARSEOP_BUFFER;
+ Op->Common.AmlOpcode = AML_BUFFER_OP;
+ Op->Asl.CompileFlags = NODE_AML_PACKAGE;
+ UtSetParseOpName (Op);
+
+ /* Child node is the buffer length */
+
+ RootOp = TrAllocateNode (PARSEOP_INTEGER);
+
+ RootOp->Asl.AmlOpcode = AML_DWORD_OP;
+ RootOp->Asl.Value.Integer = ObjDesc->Buffer.Length;
+ RootOp->Asl.Parent = Op;
+
+ (void) OpcSetOptimalIntegerSize (RootOp);
+
+ Op->Asl.Child = RootOp;
+ Op = RootOp;
+ UtSetParseOpName (Op);
+
+ /* Peer to the child is the raw buffer data */
+
+ RootOp = TrAllocateNode (PARSEOP_RAW_DATA);
+ RootOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER;
+ RootOp->Asl.AmlLength = ObjDesc->Buffer.Length;
+ RootOp->Asl.Value.String = (char *) ObjDesc->Buffer.Pointer;
+ RootOp->Asl.Parent = Op->Asl.Parent;
+
+ Op->Asl.Next = RootOp;
+ Op = RootOp;
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "Constant expression reduced to (BUFFER) length %X\n",
+ ObjDesc->Buffer.Length);
+ break;
+
+
+ default:
+ printf ("Unsupported return type: %s\n",
+ AcpiUtGetObjectTypeName (ObjDesc));
+ break;
+ }
+ }
+
+ UtSetParseOpName (Op);
+ Op->Asl.Child = NULL;
+
+ AcpiDsDeleteWalkState (WalkState);
+
+ return (AE_CTRL_DEPTH);
+}
+
diff --git a/sys/contrib/dev/acpica/compiler/aslglobal.h b/sys/contrib/dev/acpica/compiler/aslglobal.h
new file mode 100644
index 0000000..07e8a46
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslglobal.h
@@ -0,0 +1,278 @@
+
+
+/******************************************************************************
+ *
+ * Module Name: aslglobal.h - Global variable definitions
+ * $Revision: 1.56 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#ifndef __ASLGLOBAL_H
+#define __ASLGLOBAL_H
+
+
+/*
+ * Global variables. Defined in aslmain.c only, externed in all other files
+ */
+
+#undef ASL_EXTERN
+
+#ifdef _DECLARE_GLOBALS
+#define ASL_EXTERN
+#define ASL_INIT_GLOBAL(a,b) (a)=(b)
+#else
+#define ASL_EXTERN extern
+#define ASL_INIT_GLOBAL(a,b) (a)
+#endif
+
+
+/*
+ * Parser and other externals
+ */
+extern int yydebug;
+extern FILE *AslCompilerin;
+extern int AslCompilerdebug;
+extern const ASL_MAPPING_ENTRY AslKeywordMapping[];
+extern char *AslCompilertext;
+extern char hex[];
+
+#define ASL_LINE_BUFFER_SIZE 512
+#define ASL_MSG_BUFFER_SIZE 4096
+#define HEX_TABLE_LINE_SIZE 8
+#define HEX_LISTING_LINE_SIZE 16
+
+
+/* Source code buffers and pointers for error reporting */
+
+ASL_EXTERN char Gbl_CurrentLineBuffer[ASL_LINE_BUFFER_SIZE];
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentColumn, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentLineNumber, 1);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_LogicalLineNumber, 1);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentLineOffset, 0);
+ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_LineBufPtr, Gbl_CurrentLineBuffer);
+
+
+/* Exception reporting */
+
+ASL_EXTERN ASL_ERROR_MSG ASL_INIT_GLOBAL (*Gbl_ErrorLog,NULL);
+ASL_EXTERN ASL_ERROR_MSG ASL_INIT_GLOBAL (*Gbl_NextError,NULL);
+extern UINT32 Gbl_ExceptionCount[];
+
+
+/* Option flags */
+
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_Acpi2, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_UseDefaultAmlFilename, TRUE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_NsOutputFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DebugFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_AsmOutputFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_C_OutputFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_AsmIncludeOutputFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_C_IncludeOutputFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_ListingFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_IgnoreErrors, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_SourceOutputFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_ParseOnlyFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_CompileTimesFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_FoldConstants, TRUE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_VerboseErrors, TRUE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DisasmFlag, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_GetAllTables, FALSE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_IntegerOptimizationFlag, TRUE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_ReferenceOptimizationFlag, TRUE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DisplayRemarks, TRUE);
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_DisplayOptimizations, FALSE);
+ASL_EXTERN UINT8 ASL_INIT_GLOBAL (Gbl_WarningLevel, ASL_WARNING);
+
+
+#define HEX_OUTPUT_NONE 0
+#define HEX_OUTPUT_C 1
+#define HEX_OUTPUT_ASM 2
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_HexOutputFlag, HEX_OUTPUT_NONE);
+
+
+/* Files */
+
+ASL_EXTERN ASL_FILE_INFO Gbl_Files [ASL_NUM_FILES];
+
+ASL_EXTERN char *Gbl_DirectoryPath;
+ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_ExternalFilename, NULL);
+ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_IncludeFilename, NULL);
+ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_OutputFilenamePrefix, NULL);
+ASL_EXTERN char *Gbl_CurrentInputFilename;
+
+ASL_EXTERN BOOLEAN ASL_INIT_GLOBAL (Gbl_HasIncludeFiles, FALSE);
+
+
+/* Statistics */
+
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_InputByteCount, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_NsLookupCount, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (TotalKeywords, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (TotalNamedObjects, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (TotalExecutableOpcodes, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (TotalParseNodes, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (TotalMethods, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (TotalAllocations, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (TotalAllocated, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (TotalFolds, 0);
+
+
+/* Misc */
+
+ASL_EXTERN UINT8 ASL_INIT_GLOBAL (Gbl_RevisionOverride, 0);
+ASL_EXTERN UINT8 ASL_INIT_GLOBAL (Gbl_TempCount, 0);
+ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*RootNode, NULL);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_TableLength, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_SourceLine, 0);
+ASL_EXTERN ASL_LISTING_NODE ASL_INIT_GLOBAL (*Gbl_ListingNode, NULL);
+ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*Gbl_NodeCacheNext, NULL);
+ASL_EXTERN ACPI_PARSE_OBJECT ASL_INIT_GLOBAL (*Gbl_NodeCacheLast, NULL);
+ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_StringCacheNext, NULL);
+ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_StringCacheLast, NULL);
+ASL_EXTERN ACPI_PARSE_OBJECT *Gbl_FirstLevelInsertionNode;
+
+
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentHexColumn, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentAmlOffset, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_CurrentLine, 0);
+ASL_EXTERN UINT8 ASL_INIT_GLOBAL (Gbl_HexBytesWereWritten, FALSE);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_NumNamespaceObjects, 0);
+ASL_EXTERN UINT32 ASL_INIT_GLOBAL (Gbl_ReservedMethods, 0);
+ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_TableSignature, "NO_SIG");
+ASL_EXTERN char ASL_INIT_GLOBAL (*Gbl_TableId, "NO_ID");
+ASL_EXTERN FILE *AcpiGbl_DebugFile; /* Placeholder for oswinxf only */
+
+
+/* Static structures */
+
+ASL_EXTERN ASL_ANALYSIS_WALK_INFO AnalysisWalkInfo;
+ASL_EXTERN ACPI_TABLE_HEADER TableHeader;
+extern const ASL_RESERVED_INFO ReservedMethods[];
+
+/* Event timing */
+
+#define ASL_NUM_EVENTS 19
+ASL_EXTERN ASL_EVENT_INFO AslGbl_Events[ASL_NUM_EVENTS];
+ASL_EXTERN UINT8 AslGbl_NextEvent;
+ASL_EXTERN UINT8 AslGbl_NamespaceEvent;
+
+/* Scratch buffers */
+
+ASL_EXTERN UINT8 Gbl_AmlBuffer[HEX_LISTING_LINE_SIZE];
+ASL_EXTERN char MsgBuffer[ASL_MSG_BUFFER_SIZE];
+ASL_EXTERN char StringBuffer[ASL_MSG_BUFFER_SIZE];
+ASL_EXTERN char StringBuffer2[ASL_MSG_BUFFER_SIZE];
+
+#endif /* __ASLGLOBAL_H */
+
diff --git a/sys/contrib/dev/acpica/compiler/asllength.c b/sys/contrib/dev/acpica/compiler/asllength.c
new file mode 100644
index 0000000..056aaeb
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/asllength.c
@@ -0,0 +1,531 @@
+
+/******************************************************************************
+ *
+ * Module Name: asllength - Tree walk to determine package and opcode lengths
+ * $Revision: 1.37 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("asllength")
+
+/* Local prototypes */
+
+static UINT8
+CgGetPackageLenByteCount (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 PackageLength);
+
+static void
+CgGenerateAmlOpcodeLength (
+ ACPI_PARSE_OBJECT *Op);
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+void
+LnAdjustLengthToRoot (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 LengthDelta);
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LnInitLengthsWalk
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Walk callback to initialize (and re-initialize) the node
+ * subtree length(s) to zero. The Subtree lengths are bubbled
+ * up to the root node in order to get a total AML length.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+LnInitLengthsWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+
+ Op->Asl.AmlSubtreeLength = 0;
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LnPackageLengthWalk
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Walk callback to calculate the total AML length.
+ * 1) Calculate the AML lengths (opcode, package length, etc.) for
+ * THIS node.
+ * 2) Bubbble up all of these lengths to the parent node by summing
+ * them all into the parent subtree length.
+ *
+ * Note: The SubtreeLength represents the total AML length of all child nodes
+ * in all subtrees under a given node. Therefore, once this walk is
+ * complete, the Root Node subtree length is the AML length of the entire
+ * tree (and thus, the entire ACPI table)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+LnPackageLengthWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+
+ /* Generate the AML lengths for this node */
+
+ CgGenerateAmlLengths (Op);
+
+ /* Bubble up all lengths (this node and all below it) to the parent */
+
+ if ((Op->Asl.Parent) &&
+ (Op->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG))
+ {
+ Op->Asl.Parent->Asl.AmlSubtreeLength += (Op->Asl.AmlLength +
+ Op->Asl.AmlOpcodeLength +
+ Op->Asl.AmlPkgLenBytes +
+ Op->Asl.AmlSubtreeLength);
+ }
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CgGetPackageLenByteCount
+ *
+ * PARAMETERS: Op - Parse node
+ * PackageLength - Length to be encoded
+ *
+ * RETURN: Required length of the package length encoding
+ *
+ * DESCRIPTION: Calculate the number of bytes required to encode the given
+ * package length.
+ *
+ ******************************************************************************/
+
+static UINT8
+CgGetPackageLenByteCount (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 PackageLength)
+{
+
+ /*
+ * Determine the number of bytes required to encode the package length
+ * Note: the package length includes the number of bytes used to encode
+ * the package length, so we must account for this also.
+ */
+ if (PackageLength <= (0x0000003F - 1))
+ {
+ return (1);
+ }
+ else if (PackageLength <= (0x00000FFF - 2))
+ {
+ return (2);
+ }
+ else if (PackageLength <= (0x000FFFFF - 3))
+ {
+ return (3);
+ }
+ else if (PackageLength <= (0x0FFFFFFF - 4))
+ {
+ return (4);
+ }
+ else
+ {
+ /* Fatal error - the package length is too large to encode */
+
+ AslError (ASL_ERROR, ASL_MSG_ENCODING_LENGTH, Op, NULL);
+ }
+
+ return (0);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CgGenerateAmlOpcodeLength
+ *
+ * PARAMETERS: Op - Parse node whose AML opcode lengths will be
+ * calculated
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Calculate the AmlOpcodeLength, AmlPkgLenBytes, and AmlLength
+ * fields for this node.
+ *
+ ******************************************************************************/
+
+static void
+CgGenerateAmlOpcodeLength (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ /* Check for two-byte opcode */
+
+ if (Op->Asl.AmlOpcode > 0x00FF)
+ {
+ Op->Asl.AmlOpcodeLength = 2;
+ }
+ else
+ {
+ Op->Asl.AmlOpcodeLength = 1;
+ }
+
+ /* Does this opcode have an associated "PackageLength" field? */
+
+ Op->Asl.AmlPkgLenBytes = 0;
+ if (Op->Asl.CompileFlags & NODE_AML_PACKAGE)
+ {
+ Op->Asl.AmlPkgLenBytes = CgGetPackageLenByteCount (
+ Op, Op->Asl.AmlSubtreeLength);
+ }
+
+ /* Data opcode lengths are easy */
+
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_BYTE_OP:
+
+ Op->Asl.AmlLength = 1;
+ break;
+
+ case AML_WORD_OP:
+
+ Op->Asl.AmlLength = 2;
+ break;
+
+ case AML_DWORD_OP:
+
+ Op->Asl.AmlLength = 4;
+ break;
+
+ case AML_QWORD_OP:
+
+ Op->Asl.AmlLength = 8;
+ break;
+
+ default:
+ /* All data opcodes must be above */
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: CgGenerateAmlLengths
+ *
+ * PARAMETERS: Op - Parse node
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Generate internal length fields based on the AML opcode or
+ * parse opcode.
+ *
+ ******************************************************************************/
+
+void
+CgGenerateAmlLengths (
+ ACPI_PARSE_OBJECT *Op)
+{
+ char *Buffer;
+ ACPI_STATUS Status;
+
+
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_RAW_DATA_BYTE:
+
+ Op->Asl.AmlOpcodeLength = 0;
+ Op->Asl.AmlLength = 1;
+ return;
+
+ case AML_RAW_DATA_WORD:
+
+ Op->Asl.AmlOpcodeLength = 0;
+ Op->Asl.AmlLength = 2;
+ return;
+
+ case AML_RAW_DATA_DWORD:
+
+ Op->Asl.AmlOpcodeLength = 0;
+ Op->Asl.AmlLength = 4;
+ return;
+
+ case AML_RAW_DATA_QWORD:
+
+ Op->Asl.AmlOpcodeLength = 0;
+ Op->Asl.AmlLength = 8;
+ return;
+
+ case AML_RAW_DATA_BUFFER:
+
+ /* Aml length is/was set by creator */
+
+ Op->Asl.AmlOpcodeLength = 0;
+ return;
+
+ case AML_RAW_DATA_CHAIN:
+
+ /* Aml length is/was set by creator */
+
+ Op->Asl.AmlOpcodeLength = 0;
+ return;
+
+ default:
+ break;
+ }
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_DEFINITIONBLOCK:
+
+ Gbl_TableLength = sizeof (ACPI_TABLE_HEADER) +
+ Op->Asl.AmlSubtreeLength;
+ break;
+
+ case PARSEOP_NAMESEG:
+
+ Op->Asl.AmlOpcodeLength = 0;
+ Op->Asl.AmlLength = 4;
+ Op->Asl.ExternalName = Op->Asl.Value.String;
+ break;
+
+ case PARSEOP_NAMESTRING:
+ case PARSEOP_METHODCALL:
+
+ if (Op->Asl.CompileFlags & NODE_NAME_INTERNALIZED)
+ {
+ break;
+ }
+
+ Op->Asl.AmlOpcodeLength = 0;
+ Status = UtInternalizeName (Op->Asl.Value.String, &Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ DbgPrint (ASL_DEBUG_OUTPUT,
+ "Failure from internalize name %X\n", Status);
+ break;
+ }
+
+ Op->Asl.ExternalName = Op->Asl.Value.String;
+ Op->Asl.Value.String = Buffer;
+ Op->Asl.CompileFlags |= NODE_NAME_INTERNALIZED;
+
+ Op->Asl.AmlLength = strlen (Buffer);
+
+ /*
+ * Check for single backslash reference to root,
+ * make it a null terminated string in the AML
+ */
+ if (Op->Asl.AmlLength == 1)
+ {
+ Op->Asl.AmlLength = 2;
+ }
+ break;
+
+ case PARSEOP_STRING_LITERAL:
+
+ Op->Asl.AmlOpcodeLength = 1;
+
+ /* Get null terminator */
+
+ Op->Asl.AmlLength = strlen (Op->Asl.Value.String) + 1;
+ break;
+
+ case PARSEOP_PACKAGE_LENGTH:
+
+ Op->Asl.AmlOpcodeLength = 0;
+ Op->Asl.AmlPkgLenBytes = CgGetPackageLenByteCount (Op,
+ (UINT32) Op->Asl.Value.Integer);
+ break;
+
+ case PARSEOP_RAW_DATA:
+
+ Op->Asl.AmlOpcodeLength = 0;
+ break;
+
+ case PARSEOP_DEFAULT_ARG:
+ case PARSEOP_EXTERNAL:
+ case PARSEOP_INCLUDE:
+ case PARSEOP_INCLUDE_END:
+
+ /* Ignore the "default arg" nodes, they are extraneous at this point */
+
+ break;
+
+ default:
+
+ CgGenerateAmlOpcodeLength (Op);
+ break;
+ }
+}
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+/*******************************************************************************
+ *
+ * FUNCTION: LnAdjustLengthToRoot
+ *
+ * PARAMETERS: Op - Node whose Length was changed
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Change the Subtree length of the given node, and bubble the
+ * change all the way up to the root node. This allows for
+ * last second changes to a package length (for example, if the
+ * package length encoding gets shorter or longer.)
+ *
+ ******************************************************************************/
+
+void
+LnAdjustLengthToRoot (
+ ACPI_PARSE_OBJECT *SubtreeOp,
+ UINT32 LengthDelta)
+{
+ ACPI_PARSE_OBJECT *Op;
+
+
+ /* Adjust all subtree lengths up to the root */
+
+ Op = SubtreeOp->Asl.Parent;
+ while (Op)
+ {
+ Op->Asl.AmlSubtreeLength -= LengthDelta;
+ Op = Op->Asl.Parent;
+ }
+
+ /* Adjust the global table length */
+
+ Gbl_TableLength -= LengthDelta;
+}
+#endif
+
+
diff --git a/sys/contrib/dev/acpica/compiler/asllisting.c b/sys/contrib/dev/acpica/compiler/asllisting.c
new file mode 100644
index 0000000..31f70b8
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/asllisting.c
@@ -0,0 +1,1494 @@
+
+/******************************************************************************
+ *
+ * Module Name: asllisting - Listing file generation
+ * $Revision: 1.63 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslisting")
+
+/* Local prototypes */
+
+static void
+LsDumpAscii (
+ UINT32 FileId,
+ UINT32 Count,
+ UINT8 *Buffer);
+
+static void
+LsDumpAsciiInComment (
+ UINT32 FileId,
+ UINT32 Count,
+ UINT8 *Buffer);
+
+static ACPI_STATUS
+LsAmlListingWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static void
+LsGenerateListing (
+ UINT32 FileId);
+
+static void
+LsPushNode (
+ char *Filename);
+
+static ASL_LISTING_NODE *
+LsPopNode (
+ void);
+
+static void
+LsCheckException (
+ UINT32 LineNumber,
+ UINT32 FileId);
+
+static void
+LsFlushListingBuffer (
+ UINT32 FileId);
+
+static void
+LsWriteListingHexBytes (
+ UINT8 *Buffer,
+ UINT32 Length,
+ UINT32 FileId);
+
+static UINT32
+LsWriteOneSourceLine (
+ UINT32 FileId);
+
+static void
+LsFinishSourceListing (
+ UINT32 FileId);
+
+static void
+LsWriteSourceLines (
+ UINT32 ToLineNumber,
+ UINT32 ToLogicalLineNumber,
+ UINT32 FileId);
+
+static void
+LsWriteNodeToListing (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 FileId);
+
+static void
+LsDoHexOutputC (
+ void);
+
+static void
+LsDoHexOutputAsm (
+ void);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsTreeWriteWalk
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Dump entire parse tree, for compiler debug only
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+LsTreeWriteWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+
+ /* Debug output */
+
+ DbgPrint (ASL_TREE_OUTPUT,
+ "%5.5d [%2d]", Op->Asl.LogicalLineNumber, Level);
+ UtPrintFormattedName (Op->Asl.ParseOpcode, Level);
+
+
+ DbgPrint (ASL_TREE_OUTPUT, "\n");
+ return (AE_OK);
+}
+
+
+void
+LsDumpParseTree (
+ void)
+{
+
+ if (!Gbl_DebugFlag)
+ {
+ return;
+ }
+
+ DbgPrint (ASL_TREE_OUTPUT, "\nOriginal parse tree from parser:\n\n");
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD,
+ LsTreeWriteWalk, NULL, NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsDumpAscii
+ *
+ * PARAMETERS: FileId - ID of current listing file
+ * Count - Number of bytes to convert
+ * Buffer - Buffer of bytes to convert
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Convert hex bytes to ascii
+ *
+ ******************************************************************************/
+
+static void
+LsDumpAscii (
+ UINT32 FileId,
+ UINT32 Count,
+ UINT8 *Buffer)
+{
+ UINT8 BufChar;
+ UINT32 i;
+
+
+ FlPrintFile (FileId, " \"");
+ for (i = 0; i < Count; i++)
+ {
+ BufChar = Buffer[i];
+ if (isprint (BufChar))
+ {
+ FlPrintFile (FileId, "%c", BufChar);
+ }
+ else
+ {
+ /* Not a printable character, just put out a dot */
+
+ FlPrintFile (FileId, ".");
+ }
+ }
+ FlPrintFile (FileId, "\"");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsDumpAsciiInComment
+ *
+ * PARAMETERS: FileId - ID of current listing file
+ * Count - Number of bytes to convert
+ * Buffer - Buffer of bytes to convert
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Convert hex bytes to ascii
+ *
+ ******************************************************************************/
+
+static void
+LsDumpAsciiInComment (
+ UINT32 FileId,
+ UINT32 Count,
+ UINT8 *Buffer)
+{
+ UINT8 BufChar = 0;
+ UINT8 LastChar;
+ UINT32 i;
+
+
+ FlPrintFile (FileId, " \"");
+ for (i = 0; i < Count; i++)
+ {
+ LastChar = BufChar;
+ BufChar = Buffer[i];
+
+ if (isprint (BufChar))
+ {
+ /* Handle embedded C comment sequences */
+
+ if (((LastChar == '*') && (BufChar == '/')) ||
+ ((LastChar == '/') && (BufChar == '*')))
+ {
+ /* Insert a space to break the sequence */
+
+ FlPrintFile (FileId, ".", BufChar);
+ }
+
+ FlPrintFile (FileId, "%c", BufChar);
+ }
+ else
+ {
+ /* Not a printable character, just put out a dot */
+
+ FlPrintFile (FileId, ".");
+ }
+ }
+ FlPrintFile (FileId, "\"");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsAmlListingWalk
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Process one node during a listing file generation.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LsAmlListingWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ UINT8 FileByte;
+ UINT32 i;
+ UINT32 FileId = (UINT32) ACPI_TO_INTEGER (Context);
+
+
+ LsWriteNodeToListing (Op, FileId);
+
+ if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DATA)
+ {
+ /* Buffer is a resource template, don't dump the data all at once */
+
+ return (AE_OK);
+ }
+
+ /* Write the hex bytes to the listing file(s) (if requested) */
+
+ for (i = 0; i < Op->Asl.FinalAmlLength; i++)
+ {
+ if (ACPI_FAILURE (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte, 1)))
+ {
+ FlFileError (ASL_FILE_AML_OUTPUT, ASL_MSG_READ);
+ AslAbort ();
+ }
+ LsWriteListingHexBytes (&FileByte, 1, FileId);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsGenerateListing
+ *
+ * PARAMETERS: FileId - ID of listing file
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Generate a listing file. This can be one of the several types
+ * of "listings" supported.
+ *
+ ******************************************************************************/
+
+static void
+LsGenerateListing (
+ UINT32 FileId)
+{
+
+ /* Start at the beginning of both the source and AML files */
+
+ FlSeekFile (ASL_FILE_SOURCE_OUTPUT, 0);
+ FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
+ Gbl_SourceLine = 0;
+ Gbl_CurrentHexColumn = 0;
+ LsPushNode (Gbl_Files[ASL_FILE_INPUT].Filename);
+
+ /* Process all parse nodes */
+
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_DOWNWARD, LsAmlListingWalk,
+ NULL, (void *) ACPI_TO_POINTER (FileId));
+
+ /* Final processing */
+
+ LsFinishSourceListing (FileId);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsDoListings
+ *
+ * PARAMETERS: None.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Generate all requested listing files.
+ *
+ ******************************************************************************/
+
+void
+LsDoListings (
+ void)
+{
+
+ if (Gbl_C_OutputFlag)
+ {
+ LsGenerateListing (ASL_FILE_C_SOURCE_OUTPUT);
+ }
+
+ if (Gbl_ListingFlag)
+ {
+ LsGenerateListing (ASL_FILE_LISTING_OUTPUT);
+ }
+
+ if (Gbl_AsmOutputFlag)
+ {
+ LsGenerateListing (ASL_FILE_ASM_SOURCE_OUTPUT);
+ }
+
+ if (Gbl_C_IncludeOutputFlag)
+ {
+ LsGenerateListing (ASL_FILE_C_INCLUDE_OUTPUT);
+ }
+
+ if (Gbl_AsmIncludeOutputFlag)
+ {
+ LsGenerateListing (ASL_FILE_ASM_INCLUDE_OUTPUT);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsPushNode
+ *
+ * PARAMETERS: Filename - Pointer to the include filename
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Push a listing node on the listing/include file stack. This
+ * stack enables tracking of include files (infinitely nested)
+ * and resumption of the listing of the parent file when the
+ * include file is finished.
+ *
+ ******************************************************************************/
+
+static void
+LsPushNode (
+ char *Filename)
+{
+ ASL_LISTING_NODE *Lnode;
+
+
+ /* Create a new node */
+
+ Lnode = UtLocalCalloc (sizeof (ASL_LISTING_NODE));
+
+ /* Initialize */
+
+ Lnode->Filename = Filename;
+ Lnode->LineNumber = 0;
+
+ /* Link (push) */
+
+ Lnode->Next = Gbl_ListingNode;
+ Gbl_ListingNode = Lnode;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsPopNode
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: List head after current head is popped off
+ *
+ * DESCRIPTION: Pop the current head of the list, free it, and return the
+ * next node on the stack (the new current node).
+ *
+ ******************************************************************************/
+
+static ASL_LISTING_NODE *
+LsPopNode (
+ void)
+{
+ ASL_LISTING_NODE *Lnode;
+
+
+ /* Just grab the node at the head of the list */
+
+ Lnode = Gbl_ListingNode;
+ if ((!Lnode) ||
+ (!Lnode->Next))
+ {
+ AslError (ASL_ERROR, ASL_MSG_COMPILER_INTERNAL, NULL,
+ "Could not pop empty listing stack");
+ return Gbl_ListingNode;
+ }
+
+ Gbl_ListingNode = Lnode->Next;
+ ACPI_FREE (Lnode);
+
+ /* New "Current" node is the new head */
+
+ return (Gbl_ListingNode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsCheckException
+ *
+ * PARAMETERS: LineNumber - Current logical (cumulative) line #
+ * FileId - ID of output listing file
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Check if there is an exception for this line, and if there is,
+ * put it in the listing immediately. Handles multiple errors
+ * per line. Gbl_NextError points to the next error in the
+ * sorted (by line #) list of compile errors/warnings.
+ *
+ ******************************************************************************/
+
+static void
+LsCheckException (
+ UINT32 LineNumber,
+ UINT32 FileId)
+{
+
+ if ((!Gbl_NextError) ||
+ (LineNumber < Gbl_NextError->LogicalLineNumber ))
+ {
+ return;
+ }
+
+ /* Handle multiple errors per line */
+
+ if (FileId == ASL_FILE_LISTING_OUTPUT)
+ {
+ while (Gbl_NextError &&
+ (LineNumber >= Gbl_NextError->LogicalLineNumber))
+ {
+ AePrintException (FileId, Gbl_NextError, "\n[****iasl****]\n");
+
+ Gbl_NextError = Gbl_NextError->Next;
+ }
+
+ FlPrintFile (FileId, "\n");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsFlushListingBuffer
+ *
+ * PARAMETERS: FileId - ID of the listing file
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Flush out the current contents of the 16-byte hex AML code
+ * buffer. Usually called at the termination of a single line
+ * of source code or when the buffer is full.
+ *
+ ******************************************************************************/
+
+static void
+LsFlushListingBuffer (
+ UINT32 FileId)
+{
+ UINT32 i;
+
+
+ if (Gbl_CurrentHexColumn == 0)
+ {
+ return;
+ }
+
+ /* Write the hex bytes */
+
+ switch (FileId)
+ {
+ case ASL_FILE_LISTING_OUTPUT:
+
+ for (i = 0; i < Gbl_CurrentHexColumn; i++)
+ {
+ FlPrintFile (FileId, "%2.2X ", Gbl_AmlBuffer[i]);
+ }
+
+ for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 3); i++)
+ {
+ FlWriteFile (FileId, ".", 1);
+ }
+
+ /* Write the ASCII character associated with each of the bytes */
+
+ LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
+ break;
+
+
+ case ASL_FILE_ASM_SOURCE_OUTPUT:
+
+ for (i = 0; i < Gbl_CurrentHexColumn; i++)
+ {
+ if (i > 0)
+ {
+ FlPrintFile (FileId, ",");
+ }
+ FlPrintFile (FileId, "0%2.2Xh", Gbl_AmlBuffer[i]);
+ }
+
+ for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++)
+ {
+ FlWriteFile (FileId, " ", 1);
+ }
+
+ FlPrintFile (FileId, " ;%8.8X",
+ Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE);
+
+ /* Write the ASCII character associated with each of the bytes */
+
+ LsDumpAscii (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
+ break;
+
+
+ case ASL_FILE_C_SOURCE_OUTPUT:
+
+ for (i = 0; i < Gbl_CurrentHexColumn; i++)
+ {
+ FlPrintFile (FileId, "0x%2.2X,", Gbl_AmlBuffer[i]);
+ }
+
+ for (i = 0; i < ((HEX_LISTING_LINE_SIZE - Gbl_CurrentHexColumn) * 5); i++)
+ {
+ FlWriteFile (FileId, " ", 1);
+ }
+
+ FlPrintFile (FileId, " /* %8.8X",
+ Gbl_CurrentAmlOffset - HEX_LISTING_LINE_SIZE);
+
+ /* Write the ASCII character associated with each of the bytes */
+
+ LsDumpAsciiInComment (FileId, Gbl_CurrentHexColumn, Gbl_AmlBuffer);
+ FlPrintFile (FileId, " */");
+ break;
+
+ default:
+ /* No other types supported */
+ return;
+ }
+
+ FlPrintFile (FileId, "\n");
+
+ Gbl_CurrentHexColumn = 0;
+ Gbl_HexBytesWereWritten = TRUE;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsWriteListingHexBytes
+ *
+ * PARAMETERS: Buffer - AML code buffer
+ * Length - Number of AML bytes to write
+ * FileId - ID of current listing file.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Write the contents of the AML buffer to the listing file via
+ * the listing buffer. The listing buffer is flushed every 16
+ * AML bytes.
+ *
+ ******************************************************************************/
+
+static void
+LsWriteListingHexBytes (
+ UINT8 *Buffer,
+ UINT32 Length,
+ UINT32 FileId)
+{
+ UINT32 i;
+
+
+ /* Transfer all requested bytes */
+
+ for (i = 0; i < Length; i++)
+ {
+ /* Print line header when buffer is empty */
+
+ if (Gbl_CurrentHexColumn == 0)
+ {
+ if (Gbl_HasIncludeFiles)
+ {
+ FlPrintFile (FileId, "%*s", 10, " ");
+ }
+
+ switch (FileId)
+ {
+ case ASL_FILE_LISTING_OUTPUT:
+
+ FlPrintFile (FileId, "%8.8X....", Gbl_CurrentAmlOffset);
+ break;
+
+ case ASL_FILE_ASM_SOURCE_OUTPUT:
+
+ FlPrintFile (FileId, " db ");
+ break;
+
+ case ASL_FILE_C_SOURCE_OUTPUT:
+
+ FlPrintFile (FileId, " ");
+ break;
+
+ default:
+ /* No other types supported */
+ return;
+ }
+ }
+
+ /* Transfer AML byte and update counts */
+
+ Gbl_AmlBuffer[Gbl_CurrentHexColumn] = Buffer[i];
+
+ Gbl_CurrentHexColumn++;
+ Gbl_CurrentAmlOffset++;
+
+ /* Flush buffer when it is full */
+
+ if (Gbl_CurrentHexColumn >= HEX_LISTING_LINE_SIZE)
+ {
+ LsFlushListingBuffer (FileId);
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsWriteOneSourceLine
+ *
+ * PARAMETERS: FileID - ID of current listing file
+ *
+ * RETURN: FALSE on EOF (input source file), TRUE otherwise
+ *
+ * DESCRIPTION: Read one line from the input source file and echo it to the
+ * listing file, prefixed with the line number, and if the source
+ * file contains include files, prefixed with the current filename
+ *
+ ******************************************************************************/
+
+static UINT32
+LsWriteOneSourceLine (
+ UINT32 FileId)
+{
+ UINT8 FileByte;
+
+
+ Gbl_SourceLine++;
+ Gbl_ListingNode->LineNumber++;
+
+ if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
+ {
+ FlPrintFile (FileId, " *");
+ }
+ if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT)
+ {
+ FlPrintFile (FileId, "; ");
+ }
+
+ if (Gbl_HasIncludeFiles)
+ {
+ /*
+ * This file contains "include" statements, print the current
+ * filename and line number within the current file
+ */
+ FlPrintFile (FileId, "%12s %5d....",
+ Gbl_ListingNode->Filename, Gbl_ListingNode->LineNumber);
+ }
+ else
+ {
+ /* No include files, just print the line number */
+
+ FlPrintFile (FileId, "%8d....", Gbl_SourceLine);
+ }
+
+ /* Read one line (up to a newline or EOF) */
+
+ while (FlReadFile (ASL_FILE_SOURCE_OUTPUT, &FileByte, 1) == AE_OK)
+ {
+ if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
+ {
+ if (FileByte == '/')
+ {
+ FileByte = '*';
+ }
+ }
+
+ FlWriteFile (FileId, &FileByte, 1);
+ if (FileByte == '\n')
+ {
+ /*
+ * Check if an error occurred on this source line during the compile.
+ * If so, we print the error message after the source line.
+ */
+ LsCheckException (Gbl_SourceLine, FileId);
+ return (1);
+ }
+ }
+
+ /* EOF on the input file was reached */
+
+ return (0);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsFinishSourceListing
+ *
+ * PARAMETERS: FileId - ID of current listing file.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Cleanup routine for the listing file. Flush the hex AML
+ * listing buffer, and flush out any remaining lines in the
+ * source input file.
+ *
+ ******************************************************************************/
+
+static void
+LsFinishSourceListing (
+ UINT32 FileId)
+{
+
+ if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
+ (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
+ {
+ return;
+ }
+
+ LsFlushListingBuffer (FileId);
+ Gbl_CurrentAmlOffset = 0;
+
+ /* Flush any remaining text in the source file */
+
+ if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
+ {
+ FlPrintFile (FileId, " /*\n");
+ }
+
+ while (LsWriteOneSourceLine (FileId))
+ { ; }
+
+ if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
+ {
+ FlPrintFile (FileId, "\n */\n };\n");
+ }
+
+ FlPrintFile (FileId, "\n");
+
+ if (FileId == ASL_FILE_LISTING_OUTPUT)
+ {
+ /* Print a summary of the compile exceptions */
+
+ FlPrintFile (FileId, "\n\nSummary of errors and warnings\n\n");
+ AePrintErrorLog (FileId);
+ FlPrintFile (FileId, "\n\n");
+ UtDisplaySummary (FileId);
+ FlPrintFile (FileId, "\n\n");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsWriteSourceLines
+ *
+ * PARAMETERS: ToLineNumber -
+ * ToLogicalLineNumber - Write up to this source line number
+ * FileId - ID of current listing file
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Read then write source lines to the listing file until we have
+ * reached the specified logical (cumulative) line number. This
+ * automatically echos out comment blocks and other non-AML
+ * generating text until we get to the actual AML-generating line
+ * of ASL code specified by the logical line number.
+ *
+ ******************************************************************************/
+
+static void
+LsWriteSourceLines (
+ UINT32 ToLineNumber,
+ UINT32 ToLogicalLineNumber,
+ UINT32 FileId)
+{
+
+ if ((FileId == ASL_FILE_ASM_INCLUDE_OUTPUT) ||
+ (FileId == ASL_FILE_C_INCLUDE_OUTPUT))
+ {
+ return;
+ }
+
+ Gbl_CurrentLine = ToLogicalLineNumber;
+
+ /* Flush any hex bytes remaining from the last opcode */
+
+ LsFlushListingBuffer (FileId);
+
+ /* Read lines and write them as long as we are not caught up */
+
+ if (Gbl_SourceLine < Gbl_CurrentLine)
+ {
+ /*
+ * If we just completed writing some AML hex bytes, output a linefeed
+ * to add some whitespace for readability.
+ */
+ if (Gbl_HexBytesWereWritten)
+ {
+ FlPrintFile (FileId, "\n");
+ Gbl_HexBytesWereWritten = FALSE;
+ }
+
+ if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
+ {
+ FlPrintFile (FileId, " /*\n");
+ }
+
+ /* Write one line at a time until we have reached the target line # */
+
+ while ((Gbl_SourceLine < Gbl_CurrentLine) &&
+ LsWriteOneSourceLine (FileId))
+ { ; }
+
+ if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
+ {
+ FlPrintFile (FileId, " */");
+ }
+ FlPrintFile (FileId, "\n");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsWriteNodeToListing
+ *
+ * PARAMETERS: Op - Parse node to write to the listing file.
+ * FileId - ID of current listing file
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Write "a node" to the listing file. This means to
+ * 1) Write out all of the source text associated with the node
+ * 2) Write out all of the AML bytes associated with the node
+ * 3) Write any compiler exceptions associated with the node
+ *
+ ******************************************************************************/
+
+static void
+LsWriteNodeToListing (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 FileId)
+{
+ const ACPI_OPCODE_INFO *OpInfo;
+ UINT32 OpClass;
+ char *Pathname;
+ UINT32 Length;
+ UINT32 i;
+
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
+ OpClass = OpInfo->Class;
+
+ /* TBD: clean this up with a single flag that says:
+ * I start a named output block
+ */
+ if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
+ {
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_DEFINITIONBLOCK:
+ case PARSEOP_METHODCALL:
+ case PARSEOP_INCLUDE:
+ case PARSEOP_INCLUDE_END:
+ case PARSEOP_DEFAULT_ARG:
+
+ break;
+
+ default:
+ switch (OpClass)
+ {
+ case AML_CLASS_NAMED_OBJECT:
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_SCOPE_OP:
+ case AML_ALIAS_OP:
+ break;
+
+ default:
+ if (Op->Asl.ExternalName)
+ {
+ LsFlushListingBuffer (FileId);
+ FlPrintFile (FileId, " };\n");
+ }
+ break;
+ }
+ break;
+
+ default:
+ /* Don't care about other objects */
+ break;
+ }
+ break;
+ }
+ }
+
+ /* These cases do not have a corresponding AML opcode */
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_DEFINITIONBLOCK:
+
+ LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine, FileId);
+
+ /* Use the table Signature and TableId to build a unique name */
+
+ if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT)
+ {
+ FlPrintFile (FileId,
+ "%s_%s_Header \\\n",
+ Gbl_TableSignature, Gbl_TableId);
+ }
+ if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
+ {
+ FlPrintFile (FileId,
+ " unsigned char %s_%s_Header [] =\n {\n",
+ Gbl_TableSignature, Gbl_TableId);
+ }
+ if (FileId == ASL_FILE_ASM_INCLUDE_OUTPUT)
+ {
+ FlPrintFile (FileId,
+ "extrn %s_%s_Header : byte\n",
+ Gbl_TableSignature, Gbl_TableId);
+ }
+ if (FileId == ASL_FILE_C_INCLUDE_OUTPUT)
+ {
+ FlPrintFile (FileId,
+ "extern unsigned char %s_%s_Header [];\n",
+ Gbl_TableSignature, Gbl_TableId);
+ }
+ return;
+
+
+ case PARSEOP_METHODCALL:
+
+ LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
+ FileId);
+ return;
+
+
+ case PARSEOP_INCLUDE:
+
+ /* Flush everything up to and including the include source line */
+
+ LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
+ FileId);
+
+ /* Create a new listing node and push it */
+
+ LsPushNode (Op->Asl.Child->Asl.Value.String);
+ return;
+
+
+ case PARSEOP_INCLUDE_END:
+
+ /* Flush out the rest of the include file */
+
+ LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
+ FileId);
+
+ /* Pop off this listing node and go back to the parent file */
+
+ (void) LsPopNode ();
+ return;
+
+
+ case PARSEOP_DEFAULT_ARG:
+
+ if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
+ {
+ LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.EndLogicalLine,
+ FileId);
+ }
+ return;
+
+
+ default:
+ /* All other opcodes have an AML opcode */
+ break;
+ }
+
+ /*
+ * Otherwise, we look at the AML opcode because we can
+ * switch on the opcode type, getting an entire class
+ * at once
+ */
+ switch (OpClass)
+ {
+ case AML_CLASS_ARGUMENT: /* argument type only */
+ case AML_CLASS_INTERNAL:
+
+ break;
+
+
+ case AML_CLASS_NAMED_OBJECT:
+
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_FIELD_OP:
+ case AML_INDEX_FIELD_OP:
+ case AML_BANK_FIELD_OP:
+
+ /*
+ * For fields, we want to dump all the AML after the
+ * entire definition
+ */
+ LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine,
+ FileId);
+ break;
+
+ case AML_NAME_OP:
+
+ if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
+ {
+ LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
+ FileId);
+ }
+ else
+ {
+ /*
+ * For fields, we want to dump all the AML after the
+ * entire definition
+ */
+ LsWriteSourceLines (Op->Asl.EndLine, Op->Asl.EndLogicalLine,
+ FileId);
+ }
+ break;
+
+ default:
+ LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
+ FileId);
+ break;
+ }
+
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_SCOPE_OP:
+ case AML_ALIAS_OP:
+
+ /* These opcodes do not declare a new object, ignore them */
+
+ break;
+
+ default:
+
+ /* All other named object opcodes come here */
+
+ switch (FileId)
+ {
+ case ASL_FILE_ASM_SOURCE_OUTPUT:
+ case ASL_FILE_C_SOURCE_OUTPUT:
+ case ASL_FILE_ASM_INCLUDE_OUTPUT:
+ case ASL_FILE_C_INCLUDE_OUTPUT:
+
+ /*
+ * For named objects, we will create a valid symbol so that the
+ * AML code can be referenced from C or ASM
+ */
+ if (Op->Asl.ExternalName)
+ {
+ /* Get the full pathname associated with this node */
+
+ Pathname = AcpiNsGetExternalPathname (Op->Asl.Node);
+ Length = strlen (Pathname);
+ if (Length >= 4)
+ {
+ /* Convert all dots in the path to underscores */
+
+ for (i = 0; i < Length; i++)
+ {
+ if (Pathname[i] == '.')
+ {
+ Pathname[i] = '_';
+ }
+ }
+
+ /* Create the appropriate symbol in the output file */
+
+ if (FileId == ASL_FILE_ASM_SOURCE_OUTPUT)
+ {
+ FlPrintFile (FileId,
+ "%s_%s_%s \\\n",
+ Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
+ }
+ if (FileId == ASL_FILE_C_SOURCE_OUTPUT)
+ {
+ FlPrintFile (FileId,
+ " unsigned char %s_%s_%s [] =\n {\n",
+ Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
+ }
+ if (FileId == ASL_FILE_ASM_INCLUDE_OUTPUT)
+ {
+ FlPrintFile (FileId,
+ "extrn %s_%s_%s : byte\n",
+ Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
+ }
+ if (FileId == ASL_FILE_C_INCLUDE_OUTPUT)
+ {
+ FlPrintFile (FileId,
+ "extern unsigned char %s_%s_%s [];\n",
+ Gbl_TableSignature, Gbl_TableId, &Pathname[1]);
+ }
+ }
+ ACPI_FREE (Pathname);
+ }
+ break;
+
+ default:
+ /* Nothing to do for listing file */
+ break;
+ }
+ }
+ break;
+
+ case AML_CLASS_EXECUTE:
+ case AML_CLASS_CREATE:
+ default:
+
+ if ((Op->Asl.ParseOpcode == PARSEOP_BUFFER) &&
+ (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC))
+ {
+ return;
+ }
+
+ LsWriteSourceLines (Op->Asl.LineNumber, Op->Asl.LogicalLineNumber,
+ FileId);
+ break;
+
+ case AML_CLASS_UNKNOWN:
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsDoHexOutput
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Create the hex output file.
+ *
+ ******************************************************************************/
+
+void
+LsDoHexOutput (
+ void)
+{
+
+ switch (Gbl_HexOutputFlag)
+ {
+ case HEX_OUTPUT_C:
+
+ LsDoHexOutputC ();
+ break;
+
+ case HEX_OUTPUT_ASM:
+
+ LsDoHexOutputAsm ();
+ break;
+
+ default:
+ /* No other output types supported */
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsDoHexOutputC
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Create the hex output file. This is the same data as the AML
+ * output file, but formatted into hex/ascii bytes suitable for
+ * inclusion into a C source file.
+ *
+ ******************************************************************************/
+
+static void
+LsDoHexOutputC (
+ void)
+{
+ UINT32 j;
+ UINT8 FileByte[HEX_TABLE_LINE_SIZE];
+ UINT8 Buffer[4];
+ UINT32 Offset = 0;
+
+
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, " * C source code output\n *\n */\n");
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, "unsigned char AmlCode[] =\n{\n");
+
+ /* Start at the beginning of the AML file */
+
+ FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
+
+ /* Process all AML bytes in the AML file */
+
+ j = 0;
+ while (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte[j], 1) == AE_OK)
+ {
+ if (j == 0)
+ {
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, " ");
+ }
+
+ /* Convert each AML byte to hex */
+
+ UtConvertByteToHex (FileByte[j], Buffer);
+ FlWriteFile (ASL_FILE_HEX_OUTPUT, Buffer, 4);
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
+
+ /* An occasional linefeed improves readability */
+
+ Offset++;
+ j++;
+
+ if (j >= HEX_TABLE_LINE_SIZE)
+ {
+ /* End of line, emit the ascii dump of the entire line */
+
+ FlPrintFile (ASL_FILE_HEX_OUTPUT,
+ " /* %8.8X", Offset - HEX_TABLE_LINE_SIZE);
+
+ /* Write the ASCII character associated with each of the bytes */
+
+ LsDumpAsciiInComment (ASL_FILE_HEX_OUTPUT,
+ HEX_TABLE_LINE_SIZE, FileByte);
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, " */\n");
+
+ /* Start new line */
+
+ j = 0;
+ }
+ }
+
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n};\n");
+ FlCloseFile (ASL_FILE_HEX_OUTPUT);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsDoHexOutputAsm
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Create the hex output file. This is the same data as the AML
+ * output file, but formatted into hex/ascii bytes suitable for
+ * inclusion into a ASM source file.
+ *
+ ******************************************************************************/
+
+static void
+LsDoHexOutputAsm (
+ void)
+{
+ UINT32 j;
+ UINT8 FileByte[HEX_TABLE_LINE_SIZE];
+ UINT8 Buffer[4];
+ UINT32 Offset = 0;
+ BOOLEAN DoComma = FALSE;
+
+
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, "; Assembly code source output\n;\n");
+
+ /* Start at the beginning of the AML file */
+
+ FlSeekFile (ASL_FILE_AML_OUTPUT, 0);
+
+ /* Process all AML bytes in the AML file */
+
+ j = 0;
+ while (FlReadFile (ASL_FILE_AML_OUTPUT, &FileByte[j], 1) == AE_OK)
+ {
+ if (j == 0)
+ {
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, " db ");
+ }
+ else if (DoComma)
+ {
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, ",");
+ DoComma = FALSE;
+ }
+
+ /* Convert each AML byte to hex */
+
+ UtConvertByteToAsmHex (FileByte[j], Buffer);
+ FlWriteFile (ASL_FILE_HEX_OUTPUT, Buffer, 4);
+
+ /* An occasional linefeed improves readability */
+
+ Offset++;
+ j++;
+ if (j >= HEX_TABLE_LINE_SIZE)
+ {
+ FlPrintFile (ASL_FILE_HEX_OUTPUT,
+ " ;%8.8X", Offset - HEX_TABLE_LINE_SIZE);
+
+ /* Write the ASCII character associated with each of the bytes */
+
+ LsDumpAscii (ASL_FILE_HEX_OUTPUT, HEX_TABLE_LINE_SIZE, FileByte);
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
+ j = 0;
+ }
+ else
+ {
+ DoComma = TRUE;
+ }
+ }
+
+ FlPrintFile (ASL_FILE_HEX_OUTPUT, "\n");
+ FlCloseFile (ASL_FILE_HEX_OUTPUT);
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslload.c b/sys/contrib/dev/acpica/compiler/aslload.c
new file mode 100644
index 0000000..ebbc487
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslload.c
@@ -0,0 +1,826 @@
+/******************************************************************************
+ *
+ * Module Name: dswload - Dispatcher namespace load callbacks
+ * $Revision: 1.77 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __ASLLOAD_C__
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#include "aslcompiler.y.h"
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslload")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+LdLoadFieldElements (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState);
+
+static ACPI_STATUS
+LdLoadResourceElements (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState);
+
+static ACPI_STATUS
+LdNamespace1Begin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static ACPI_STATUS
+LdNamespace1End (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LdLoadNamespace
+ *
+ * PARAMETERS: RootOp - Root of the parse tree
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Perform a walk of the parse tree that in turn loads all of the
+ * named ASL/AML objects into the namespace. The namespace is
+ * constructed in order to resolve named references and references
+ * to named fields within resource templates/descriptors.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+LdLoadNamespace (
+ ACPI_PARSE_OBJECT *RootOp)
+{
+ ACPI_WALK_STATE *WalkState;
+
+
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nCreating namespace\n\n");
+
+ /* Create a new walk state */
+
+ WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
+ if (!WalkState)
+ {
+ return AE_NO_MEMORY;
+ }
+
+ /* Perform the walk of the parse tree */
+
+ TrWalkParseTree (RootOp, ASL_WALK_VISIT_TWICE, LdNamespace1Begin,
+ LdNamespace1End, WalkState);
+
+ /* Dump the namespace if debug is enabled */
+
+ AcpiNsDumpTables (ACPI_NS_ALL, ACPI_UINT32_MAX);
+ return AE_OK;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LdLoadFieldElements
+ *
+ * PARAMETERS: Op - Parent node (Field)
+ * WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enter the named elements of the field (children of the parent)
+ * into the namespace.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LdLoadFieldElements (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_PARSE_OBJECT *Child = NULL;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ /* Get the first named field element */
+
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_BANK_FIELD_OP:
+
+ Child = UtGetArg (Op, 6);
+ break;
+
+ case AML_INDEX_FIELD_OP:
+
+ Child = UtGetArg (Op, 5);
+ break;
+
+ case AML_FIELD_OP:
+
+ Child = UtGetArg (Op, 4);
+ break;
+
+ default:
+ /* No other opcodes should arrive here */
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Enter all elements into the namespace */
+
+ while (Child)
+ {
+ switch (Child->Asl.AmlOpcode)
+ {
+ case AML_INT_RESERVEDFIELD_OP:
+ case AML_INT_ACCESSFIELD_OP:
+
+ break;
+
+ default:
+
+ Status = AcpiNsLookup (WalkState->ScopeInfo,
+ Child->Asl.Value.String,
+ ACPI_TYPE_LOCAL_REGION_FIELD,
+ ACPI_IMODE_LOAD_PASS1,
+ ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
+ ACPI_NS_ERROR_IF_FOUND,
+ NULL, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status != AE_ALREADY_EXISTS)
+ {
+ AslError (ASL_ERROR, ASL_MSG_CORE_EXCEPTION, Child,
+ Child->Asl.Value.String);
+ return (Status);
+ }
+
+ /*
+ * The name already exists in this scope
+ * But continue processing the elements
+ */
+ AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Child,
+ Child->Asl.Value.String);
+ }
+ else
+ {
+ Child->Asl.Node = Node;
+ Node->Op = Child;
+ }
+ break;
+ }
+ Child = Child->Asl.Next;
+ }
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LdLoadResourceElements
+ *
+ * PARAMETERS: Op - Parent node (Resource Descriptor)
+ * WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enter the named elements of the resource descriptor (children
+ * of the parent) into the namespace.
+ *
+ * NOTE: In the real AML namespace, these named elements never exist. But
+ * we simply use the namespace here as a symbol table so we can look
+ * them up as they are referenced.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LdLoadResourceElements (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_PARSE_OBJECT *InitializerOp = NULL;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ /*
+ * Enter the resource name into the namespace. Name must not already exist.
+ * This opens a scope, so later field names are guaranteed to be new/unique.
+ */
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Asl.Namepath,
+ ACPI_TYPE_LOCAL_RESOURCE, ACPI_IMODE_LOAD_PASS1,
+ ACPI_NS_NO_UPSEARCH | ACPI_NS_ERROR_IF_FOUND,
+ WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_ALREADY_EXISTS)
+ {
+ /* Actual node causing the error was saved in ParentMethod */
+
+ AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS,
+ (ACPI_PARSE_OBJECT *) Op->Asl.ParentMethod, Op->Asl.Namepath);
+ return (AE_OK);
+ }
+ return (Status);
+ }
+
+ Node->Value = (UINT32) Op->Asl.Value.Integer;
+ Node->Op = Op;
+
+ /*
+ * Now enter the predefined fields, for easy lookup when referenced
+ * by the source ASL
+ */
+ InitializerOp = ASL_GET_CHILD_NODE (Op);
+ while (InitializerOp)
+ {
+
+ if (InitializerOp->Asl.ExternalName)
+ {
+ Status = AcpiNsLookup (WalkState->ScopeInfo,
+ InitializerOp->Asl.ExternalName,
+ ACPI_TYPE_LOCAL_RESOURCE_FIELD,
+ ACPI_IMODE_LOAD_PASS1,
+ ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE,
+ NULL, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /*
+ * Store the field offset in the namespace node so it
+ * can be used when the field is referenced
+ */
+ Node->Value = (UINT32) InitializerOp->Asl.Value.Integer;
+ InitializerOp->Asl.Node = Node;
+ Node->Op = InitializerOp;
+
+ /* Pass thru the field type (Bitfield or Bytefield) */
+
+ if (InitializerOp->Asl.CompileFlags & NODE_IS_BIT_OFFSET)
+ {
+ Node->Flags |= ANOBJ_IS_BIT_OFFSET;
+ }
+ }
+ InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LdNamespace1Begin
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback used during the parse tree walk. If this
+ * is a named AML opcode, enter into the namespace
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LdNamespace1Begin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+ ACPI_OBJECT_TYPE ObjectType;
+ ACPI_OBJECT_TYPE ActualObjectType = ACPI_TYPE_ANY;
+ char *Path;
+ UINT32 Flags = ACPI_NS_NO_UPSEARCH;
+ ACPI_PARSE_OBJECT *Arg;
+ UINT32 i;
+ BOOLEAN ForceNewScope = FALSE;
+
+
+ ACPI_FUNCTION_NAME (LdNamespace1Begin);
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op %p [%s]\n",
+ Op, Op->Asl.ParseOpName));
+
+
+ /*
+ * We are only interested in opcodes that have an associated name
+ * (or multiple names)
+ */
+ switch (Op->Asl.AmlOpcode)
+ {
+ case AML_BANK_FIELD_OP:
+ case AML_INDEX_FIELD_OP:
+ case AML_FIELD_OP:
+
+ Status = LdLoadFieldElements (Op, WalkState);
+ return (Status);
+
+ default:
+
+ /* All other opcodes go below */
+ break;
+ }
+
+ /* Check if this object has already been installed in the namespace */
+
+ if (Op->Asl.Node)
+ {
+ return (AE_OK);
+ }
+
+ Path = Op->Asl.Namepath;
+ if (!Path)
+ {
+ return (AE_OK);
+ }
+
+ /* Map the raw opcode into an internal object type */
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_NAME:
+
+ Arg = Op->Asl.Child; /* Get the NameSeg/NameString node */
+ Arg = Arg->Asl.Next; /* First peer is the object to be associated with the name */
+
+ /*
+ * If this name refers to a ResourceTemplate, we will need to open
+ * a new scope so that the resource subfield names can be entered into
+ * the namespace underneath this name
+ */
+ if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
+ {
+ ForceNewScope = TRUE;
+ }
+
+ /* Get the data type associated with the named object, not the name itself */
+
+ /* Log2 loop to convert from Btype (binary) to Etype (encoded) */
+
+ ObjectType = 1;
+ for (i = 1; i < Arg->Asl.AcpiBtype; i *= 2)
+ {
+ ObjectType++;
+ }
+ break;
+
+
+ case PARSEOP_EXTERNAL:
+
+ /*
+ * "External" simply enters a name and type into the namespace.
+ * We must be careful to not open a new scope, however, no matter
+ * what type the external name refers to (e.g., a method)
+ *
+ * first child is name, next child is ObjectType
+ */
+ ActualObjectType = (UINT8) Op->Asl.Child->Asl.Next->Asl.Value.Integer;
+ ObjectType = ACPI_TYPE_ANY;
+
+ /*
+ * We will mark every new node along the path as "External". This
+ * allows some or all of the nodes to be created later in the ASL
+ * code. Handles cases like this:
+ *
+ * External (\_SB_.PCI0.ABCD, IntObj)
+ * Scope (_SB_)
+ * {
+ * Device (PCI0)
+ * {
+ * }
+ * }
+ * Method (X)
+ * {
+ * Store (\_SB_.PCI0.ABCD, Local0)
+ * }
+ */
+ Flags |= ACPI_NS_EXTERNAL;
+ break;
+
+ case PARSEOP_DEFAULT_ARG:
+
+ if (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC)
+ {
+ Status = LdLoadResourceElements (Op, WalkState);
+ goto Exit;
+ }
+
+ ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
+ break;
+
+
+ case PARSEOP_SCOPE:
+
+ /*
+ * The name referenced by Scope(Name) must already exist at this point.
+ * In other words, forward references for Scope() are not supported.
+ * The only real reason for this is that the MS interpreter cannot
+ * handle this case. Perhaps someday this case can go away.
+ */
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ACPI_TYPE_ANY,
+ ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
+ WalkState, &(Node));
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_NOT_FOUND)
+ {
+ /* The name was not found, go ahead and create it */
+
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Path,
+ ACPI_TYPE_LOCAL_SCOPE,
+ ACPI_IMODE_LOAD_PASS1, Flags,
+ WalkState, &(Node));
+
+ /*
+ * However, this is an error -- primarily because the MS
+ * interpreter can't handle a forward reference from the
+ * Scope() operator.
+ */
+ AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op,
+ Op->Asl.ExternalName);
+ AslError (ASL_ERROR, ASL_MSG_SCOPE_FWD_REF, Op,
+ Op->Asl.ExternalName);
+ goto FinishNode;
+ }
+
+ AslCoreSubsystemError (Op, Status, "Failure from lookup\n", FALSE);
+ goto Exit;
+ }
+
+ /* We found a node with this name, now check the type */
+
+ switch (Node->Type)
+ {
+ case ACPI_TYPE_LOCAL_SCOPE:
+ case ACPI_TYPE_DEVICE:
+ case ACPI_TYPE_POWER:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_THERMAL:
+
+ /* These are acceptable types - they all open a new scope */
+ break;
+
+ case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+
+ /*
+ * These types we will allow, but we will change the type.
+ * This enables some existing code of the form:
+ *
+ * Name (DEB, 0)
+ * Scope (DEB) { ... }
+ *
+ * Which is used to workaround the fact that the MS interpreter
+ * does not allow Scope() forward references.
+ */
+ sprintf (MsgBuffer, "%s [%s], changing type to [Scope]",
+ Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type));
+ AslError (ASL_REMARK, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer);
+
+ /* Switch the type to scope, open the new scope */
+
+ Node->Type = ACPI_TYPE_LOCAL_SCOPE;
+ Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE,
+ WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ break;
+
+ default:
+
+ /* All other types are an error */
+
+ sprintf (MsgBuffer, "%s [%s]", Op->Asl.ExternalName,
+ AcpiUtGetTypeName (Node->Type));
+ AslError (ASL_ERROR, ASL_MSG_SCOPE_TYPE, Op, MsgBuffer);
+
+ /*
+ * However, switch the type to be an actual scope so
+ * that compilation can continue without generating a whole
+ * cascade of additional errors. Open the new scope.
+ */
+ Node->Type = ACPI_TYPE_LOCAL_SCOPE;
+ Status = AcpiDsScopeStackPush (Node, ACPI_TYPE_LOCAL_SCOPE,
+ WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ break;
+ }
+
+ Status = AE_OK;
+ goto FinishNode;
+
+
+ default:
+
+ ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
+ break;
+ }
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Loading name: %s, (%s)\n",
+ Op->Asl.ExternalName, AcpiUtGetTypeName (ObjectType)));
+
+ /* The name must not already exist */
+
+ Flags |= ACPI_NS_ERROR_IF_FOUND;
+
+ /*
+ * 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 = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
+ ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_ALREADY_EXISTS)
+ {
+ /* The name already exists in this scope */
+
+ if (Node->Type == ACPI_TYPE_LOCAL_SCOPE)
+ {
+ /* Allow multiple references to the same scope */
+
+ Node->Type = (UINT8) ObjectType;
+ Status = AE_OK;
+ }
+ else if (Node->Flags & ANOBJ_IS_EXTERNAL)
+ {
+ /*
+ * Allow one create on an object or segment that was
+ * previously declared External
+ */
+ Node->Flags &= ~ANOBJ_IS_EXTERNAL;
+ Node->Type = (UINT8) ObjectType;
+
+ /* Just retyped a node, probably will need to open a scope */
+
+ if (AcpiNsOpensScope (ObjectType))
+ {
+ Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ Status = AE_OK;
+ }
+ else
+ {
+ /* Valid error, object already exists */
+
+ AslError (ASL_ERROR, ASL_MSG_NAME_EXISTS, Op,
+ Op->Asl.ExternalName);
+ Status = AE_OK;
+ goto Exit;
+ }
+ }
+ else
+ {
+ AslCoreSubsystemError (Op, Status,
+ "Failure from lookup %s\n", FALSE);
+ goto Exit;
+ }
+ }
+
+ if (ForceNewScope)
+ {
+ Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+FinishNode:
+ /*
+ * Point the parse node to the new namespace node, and point
+ * the Node back to the original Parse node
+ */
+ Op->Asl.Node = Node;
+ Node->Op = Op;
+
+ /* Set the actual data type if appropriate (EXTERNAL term only) */
+
+ if (ActualObjectType != ACPI_TYPE_ANY)
+ {
+ Node->Type = (UINT8) ActualObjectType;
+ Node->Value = ASL_EXTERNAL_METHOD;
+ }
+
+ if (Op->Asl.ParseOpcode == PARSEOP_METHOD)
+ {
+ /*
+ * Get the method argument count from "Extra" and save
+ * it in the namespace node
+ */
+ Node->Value = (UINT32) Op->Asl.Extra;
+ }
+
+Exit:
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LdNamespace1End
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback used during the loading of the namespace,
+ * We only need to worry about managing the scope stack here.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LdNamespace1End (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context;
+ ACPI_OBJECT_TYPE ObjectType;
+ BOOLEAN ForceNewScope = FALSE;
+
+
+ ACPI_FUNCTION_NAME (LdNamespace1End);
+
+
+ /* We are only interested in opcodes that have an associated name */
+
+ if (!Op->Asl.Namepath)
+ {
+ return (AE_OK);
+ }
+
+ /* Get the type to determine if we should pop the scope */
+
+ if ((Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG) &&
+ (Op->Asl.CompileFlags == NODE_IS_RESOURCE_DESC))
+ {
+ /* TBD: Merge into AcpiDsMapNamedOpcodeToDataType */
+
+ ObjectType = ACPI_TYPE_LOCAL_RESOURCE;
+ }
+ else
+ {
+ ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
+ }
+
+ /* Pop scope that was pushed for Resource Templates */
+
+ if (Op->Asl.ParseOpcode == PARSEOP_NAME)
+ {
+ if (Op->Asl.CompileFlags & NODE_IS_RESOURCE_DESC)
+ {
+ ForceNewScope = TRUE;
+ }
+ }
+
+ /* Pop the scope stack */
+
+ if (ForceNewScope || AcpiNsOpensScope (ObjectType))
+ {
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "(%s): Popping scope for Op [%s] %p\n",
+ AcpiUtGetTypeName (ObjectType), Op->Asl.ParseOpName, Op));
+
+ (void) AcpiDsScopeStackPop (WalkState);
+ }
+
+ return (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/asllookup.c b/sys/contrib/dev/acpica/compiler/asllookup.c
new file mode 100644
index 0000000..a970f12
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/asllookup.c
@@ -0,0 +1,1370 @@
+/******************************************************************************
+ *
+ * Module Name: asllookup- Namespace lookup
+ * $Revision: 1.103 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdispat.h>
+
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("asllookup")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+LsCompareOneNamespaceObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue);
+
+static ACPI_STATUS
+LsDoOneNamespaceObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue);
+
+static BOOLEAN
+LkObjectExists (
+ char *Name);
+
+static void
+LkCheckFieldRange (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 RegionBitLength,
+ UINT32 FieldBitOffset,
+ UINT32 FieldBitLength,
+ UINT32 AccessBitWidth);
+
+static ACPI_STATUS
+LkNamespaceLocateBegin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static ACPI_STATUS
+LkNamespaceLocateEnd (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static ACPI_STATUS
+LkIsObjectUsed (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsDoOneNamespaceObject
+ *
+ * PARAMETERS: ACPI_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Dump a namespace object to the namespace output file.
+ * Called during the walk of the namespace to dump all objects.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LsDoOneNamespaceObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_PARSE_OBJECT *Op;
+
+
+ Gbl_NumNamespaceObjects++;
+
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "%5d [%d] %*s %4.4s - %s",
+ Gbl_NumNamespaceObjects, Level, (Level * 3), " ",
+ &Node->Name,
+ AcpiUtGetTypeName (Node->Type));
+
+ Op = Node->Op;
+ ObjDesc = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node->Object);
+
+ if (!Op)
+ {
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n");
+ return (AE_OK);
+ }
+
+
+ if ((ObjDesc) &&
+ (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND))
+ {
+ switch (Node->Type)
+ {
+ case ACPI_TYPE_INTEGER:
+
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Initial Value 0x%8.8X%8.8X]",
+ ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Initial Value \"%s\"]",
+ ObjDesc->String.Pointer);
+ break;
+
+ default:
+ /* Nothing to do for other types */
+ break;
+ }
+
+ }
+ else
+ {
+ switch (Node->Type)
+ {
+ case ACPI_TYPE_INTEGER:
+
+ if (Op->Asl.ParseOpcode == PARSEOP_NAME)
+ {
+ Op = Op->Asl.Child;
+ }
+ if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
+ (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
+ {
+ Op = Op->Asl.Next;
+ }
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Initial Value 0x%8.8X%8.8X]",
+ ACPI_FORMAT_UINT64 (Op->Asl.Value.Integer));
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ if (Op->Asl.ParseOpcode == PARSEOP_NAME)
+ {
+ Op = Op->Asl.Child;
+ }
+ if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
+ (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
+ {
+ Op = Op->Asl.Next;
+ }
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Initial Value \"%s\"]",
+ Op->Asl.Value.String);
+ break;
+
+
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+
+ if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
+ (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
+ {
+ Op = Op->Asl.Child;
+ }
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Offset 0x%04X Length 0x%04X bits]",
+ Op->Asl.Parent->Asl.ExtraValue, (UINT32) Op->Asl.Value.Integer);
+ break;
+
+
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_CREATEBYTEFIELD:
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [BYTE ( 8 bit)]");
+ break;
+
+ case PARSEOP_CREATEDWORDFIELD:
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [DWORD (32 bit)]");
+ break;
+
+ case PARSEOP_CREATEQWORDFIELD:
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [QWORD (64 bit)]");
+ break;
+
+ case PARSEOP_CREATEWORDFIELD:
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [WORD (16 bit)]");
+ break;
+
+ case PARSEOP_CREATEBITFIELD:
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [BIT ( 1 bit)]");
+ break;
+
+ case PARSEOP_CREATEFIELD:
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, " [Arbitrary Bit Field]");
+ break;
+
+ default:
+ break;
+
+ }
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ if (Op->Asl.ParseOpcode == PARSEOP_NAME)
+ {
+ Op = Op->Asl.Child;
+ }
+ if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
+ (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
+ {
+ Op = Op->Asl.Next;
+ }
+ Op = Op->Asl.Child;
+
+ if ((Op->Asl.ParseOpcode == PARSEOP_BYTECONST) ||
+ (Op->Asl.ParseOpcode == PARSEOP_RAW_DATA))
+ {
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Initial Length 0x%.2X elements]",
+ Op->Asl.Value.Integer);
+ }
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ if (Op->Asl.ParseOpcode == PARSEOP_NAME)
+ {
+ Op = Op->Asl.Child;
+ }
+ if ((Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
+ (Op->Asl.ParseOpcode == PARSEOP_NAMESTRING))
+ {
+ Op = Op->Asl.Next;
+ }
+ Op = Op->Asl.Child;
+
+ if (Op && (Op->Asl.ParseOpcode == PARSEOP_INTEGER))
+ {
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Initial Length 0x%.2X bytes]",
+ Op->Asl.Value.Integer);
+ }
+ break;
+
+
+ case ACPI_TYPE_METHOD:
+
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Code Length 0x%.4X bytes]",
+ Op->Asl.AmlSubtreeLength);
+ break;
+
+
+ case ACPI_TYPE_LOCAL_RESOURCE:
+
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Desc Offset 0x%.4X Bytes]", Node->Value);
+ break;
+
+
+ case ACPI_TYPE_LOCAL_RESOURCE_FIELD:
+
+ if (Node->Flags & 0x80)
+ {
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Field Offset 0x%.4X Bits 0x%.4X Bytes]",
+ Node->Value, Node->Value / 8);
+ }
+ else
+ {
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT,
+ " [Field Offset 0x%.4X Bytes]", Node->Value);
+ }
+ break;
+
+
+ default:
+ /* Nothing to do for other types */
+ break;
+ }
+ }
+
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "\n");
+ return (AE_OK);
+}
+
+
+void
+LsSetupNsList (void * Handle)
+{
+
+ Gbl_NsOutputFlag = TRUE;
+ Gbl_Files[ASL_FILE_NAMESPACE_OUTPUT].Handle = Handle;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsDisplayNamespace
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Walk the namespace an display information about each node
+ * in the tree. Information is written to the optional
+ * namespace output file.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+LsDisplayNamespace (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ if (!Gbl_NsOutputFlag)
+ {
+ return (AE_OK);
+ }
+
+ Gbl_NumNamespaceObjects = 0;
+
+ /* File header */
+
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Contents of ACPI Namespace\n\n");
+ FlPrintFile (ASL_FILE_NAMESPACE_OUTPUT, "Count Depth Name - Type\n\n");
+
+ /* Walk entire namespace from the root */
+
+ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX, FALSE, LsDoOneNamespaceObject,
+ NULL, NULL);
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LsCompareOneNamespaceObject
+ *
+ * PARAMETERS: ACPI_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Compare name of one object.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LsCompareOneNamespaceObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
+
+
+ /* Simply check the name */
+
+ if (*((UINT32 *) (Context)) == Node->Name.Integer)
+ {
+ /* Abort walk if we found one instance */
+
+ return (AE_CTRL_TRUE);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LkObjectExists
+ *
+ * PARAMETERS: Name - 4 char ACPI name
+ *
+ * RETURN: TRUE if name exists in namespace
+ *
+ * DESCRIPTION: Walk the namespace to find an object
+ *
+ ******************************************************************************/
+
+static BOOLEAN
+LkObjectExists (
+ char *Name)
+{
+ ACPI_STATUS Status;
+
+
+ /* Walk entire namespace from the supplied root */
+
+ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX, FALSE, LsCompareOneNamespaceObject,
+ Name, NULL);
+ if (Status == AE_CTRL_TRUE)
+ {
+ /* At least one instance of the name was found */
+
+ return (TRUE);
+ }
+
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LkGetNameOp
+ *
+ * PARAMETERS: Op - Current Op
+ *
+ * RETURN: NameOp associated with the input op
+ *
+ * DESCRIPTION: Find the name declaration op associated with the operator
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+LkGetNameOp (
+ ACPI_PARSE_OBJECT *Op)
+{
+ const ACPI_OPCODE_INFO *OpInfo;
+ ACPI_PARSE_OBJECT *NameOp = Op;
+
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
+
+
+ /* Get the NamePath from the appropriate place */
+
+ if (OpInfo->Flags & AML_NAMED)
+ {
+ /* For nearly all NAMED operators, the name reference is the first child */
+
+ NameOp = Op->Asl.Child;
+ if (Op->Asl.AmlOpcode == AML_ALIAS_OP)
+ {
+ /*
+ * ALIAS is the only oddball opcode, the name declaration
+ * (alias name) is the second operand
+ */
+ NameOp = Op->Asl.Child->Asl.Next;
+ }
+ }
+ else if (OpInfo->Flags & AML_CREATE)
+ {
+ /* Name must appear as the last parameter */
+
+ NameOp = Op->Asl.Child;
+ while (!(NameOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION))
+ {
+ NameOp = NameOp->Asl.Next;
+ }
+ }
+
+ return (NameOp);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LkIsObjectUsed
+ *
+ * PARAMETERS: ACPI_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Check for an unreferenced namespace object and emit a warning.
+ * We have to be careful, because some types and names are
+ * typically or always unreferenced, we don't want to issue
+ * excessive warnings.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LkIsObjectUsed (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_NAMESPACE_NODE *Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
+
+
+ /* Referenced flag is set during the namespace xref */
+
+ if (Node->Flags & ANOBJ_IS_REFERENCED)
+ {
+ return (AE_OK);
+ }
+
+ /*
+ * Ignore names that start with an underscore,
+ * these are the reserved ACPI names and are typically not referenced,
+ * they are called by the host OS.
+ */
+ if (Node->Name.Ascii[0] == '_')
+ {
+ return (AE_OK);
+ }
+
+ /* There are some types that are typically not referenced, ignore them */
+
+ switch (Node->Type)
+ {
+ case ACPI_TYPE_DEVICE:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_POWER:
+ case ACPI_TYPE_LOCAL_RESOURCE:
+ return (AE_OK);
+
+ default:
+ break;
+ }
+
+ /* All others are valid unreferenced namespace objects */
+
+ if (Node->Op)
+ {
+ AslError (ASL_WARNING2, ASL_MSG_NOT_REFERENCED, LkGetNameOp (Node->Op), NULL);
+ }
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LkFindUnreferencedObjects
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Namespace walk to find objects that are not referenced in any
+ * way. Must be called after the namespace has been cross
+ * referenced.
+ *
+ ******************************************************************************/
+
+void
+LkFindUnreferencedObjects (
+ void)
+{
+
+ /* Walk entire namespace from the supplied root */
+
+ (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX, FALSE, LkIsObjectUsed,
+ NULL, NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LkCrossReferenceNamespace
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Perform a cross reference check of the parse tree against the
+ * namespace. Every named referenced within the parse tree
+ * should be get resolved with a namespace lookup. If not, the
+ * original reference in the ASL code is invalid -- i.e., refers
+ * to a non-existent object.
+ *
+ * NOTE: The ASL "External" operator causes the name to be inserted into the
+ * namespace so that references to the external name will be resolved
+ * correctly here.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+LkCrossReferenceNamespace (
+ void)
+{
+ ACPI_WALK_STATE *WalkState;
+
+
+ DbgPrint (ASL_DEBUG_OUTPUT, "\nCross referencing namespace\n\n");
+
+ /*
+ * Create a new walk state for use when looking up names
+ * within the namespace (Passed as context to the callbacks)
+ */
+ WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
+ if (!WalkState)
+ {
+ return AE_NO_MEMORY;
+ }
+
+ /* Walk the entire parse tree */
+
+ TrWalkParseTree (RootNode, ASL_WALK_VISIT_TWICE, LkNamespaceLocateBegin,
+ LkNamespaceLocateEnd, WalkState);
+ return AE_OK;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LkCheckFieldRange
+ *
+ * PARAMETERS: RegionBitLength - Length of entire parent region
+ * FieldBitOffset - Start of the field unit (within region)
+ * FieldBitLength - Entire length of field unit
+ * AccessBitWidth - Access width of the field unit
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Check one field unit to make sure it fits in the parent
+ * op region.
+ *
+ * Note: AccessBitWidth must be either 8,16,32, or 64
+ *
+ ******************************************************************************/
+
+static void
+LkCheckFieldRange (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 RegionBitLength,
+ UINT32 FieldBitOffset,
+ UINT32 FieldBitLength,
+ UINT32 AccessBitWidth)
+{
+ UINT32 FieldEndBitOffset;
+
+
+ /*
+ * Check each field unit against the region size. The entire
+ * field unit (start offset plus length) must fit within the
+ * region.
+ */
+ FieldEndBitOffset = FieldBitOffset + FieldBitLength;
+
+ if (FieldEndBitOffset > RegionBitLength)
+ {
+ /* Field definition itself is beyond the end-of-region */
+
+ AslError (ASL_ERROR, ASL_MSG_FIELD_UNIT_OFFSET, Op, NULL);
+ return;
+ }
+
+ /*
+ * Now check that the field plus AccessWidth doesn't go beyond
+ * the end-of-region. Assumes AccessBitWidth is a power of 2
+ */
+ FieldEndBitOffset = ACPI_ROUND_UP (FieldEndBitOffset, AccessBitWidth);
+
+ if (FieldEndBitOffset > RegionBitLength)
+ {
+ /* Field definition combined with the access is beyond EOR */
+
+ AslError (ASL_ERROR, ASL_MSG_FIELD_UNIT_ACCESS_WIDTH, Op, NULL);
+ }
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: LkNamespaceLocateBegin
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback used during cross-reference. For named
+ * object references, attempt to locate the name in the
+ * namespace.
+ *
+ * NOTE: ASL references to named fields within resource descriptors are
+ * resolved to integer values here. Therefore, this step is an
+ * important part of the code generation. We don't know that the
+ * name refers to a resource descriptor until now.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LkNamespaceLocateBegin (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+ ACPI_OBJECT_TYPE ObjectType;
+ char *Path;
+ UINT8 PassedArgs;
+ ACPI_PARSE_OBJECT *NextOp;
+ ACPI_PARSE_OBJECT *OwningOp;
+ ACPI_PARSE_OBJECT *SpaceIdOp;
+ UINT32 MinimumLength;
+ UINT32 Temp;
+ const ACPI_OPCODE_INFO *OpInfo;
+ UINT32 Flags;
+
+
+ ACPI_FUNCTION_TRACE_PTR (LkNamespaceLocateBegin, Op);
+
+ /*
+ * If this node is the actual declaration of a name
+ * [such as the XXXX name in "Method (XXXX)"],
+ * we are not interested in it here. We only care about names that are
+ * references to other objects within the namespace and the parent objects
+ * of name declarations
+ */
+ if (Op->Asl.CompileFlags & NODE_IS_NAME_DECLARATION)
+ {
+ return (AE_OK);
+ }
+
+ /* We are only interested in opcodes that have an associated name */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
+
+ if ((!(OpInfo->Flags & AML_NAMED)) &&
+ (!(OpInfo->Flags & AML_CREATE)) &&
+ (Op->Asl.ParseOpcode != PARSEOP_NAMESTRING) &&
+ (Op->Asl.ParseOpcode != PARSEOP_NAMESEG) &&
+ (Op->Asl.ParseOpcode != PARSEOP_METHODCALL))
+ {
+ return (AE_OK);
+ }
+
+ /*
+ * We must enable the "search-to-root" for single NameSegs, but
+ * we have to be very careful about opening up scopes
+ */
+ Flags = ACPI_NS_SEARCH_PARENT;
+ if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
+ (Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
+ (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
+ {
+ /*
+ * These are name references, do not push the scope stack
+ * for them.
+ */
+ Flags |= ACPI_NS_DONT_OPEN_SCOPE;
+ }
+
+ /* Get the NamePath from the appropriate place */
+
+ if (OpInfo->Flags & AML_NAMED)
+ {
+ /* For nearly all NAMED operators, the name reference is the first child */
+
+ Path = Op->Asl.Child->Asl.Value.String;
+ if (Op->Asl.AmlOpcode == AML_ALIAS_OP)
+ {
+ /*
+ * ALIAS is the only oddball opcode, the name declaration
+ * (alias name) is the second operand
+ */
+ Path = Op->Asl.Child->Asl.Next->Asl.Value.String;
+ }
+ }
+ else if (OpInfo->Flags & AML_CREATE)
+ {
+ /* Name must appear as the last parameter */
+
+ NextOp = Op->Asl.Child;
+ while (!(NextOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION))
+ {
+ NextOp = NextOp->Asl.Next;
+ }
+ Path = NextOp->Asl.Value.String;
+ }
+ else
+ {
+ Path = Op->Asl.Value.String;
+ }
+
+ ObjectType = AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode);
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Type=%s\n", AcpiUtGetTypeName (ObjectType)));
+
+ /*
+ * Lookup the name in the namespace. Name must exist at this point, or it
+ * is an invalid reference.
+ *
+ * The namespace is also used as a lookup table for references to resource
+ * descriptors and the fields within them.
+ */
+ Gbl_NsLookupCount++;
+
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
+ ACPI_IMODE_EXECUTE, Flags, WalkState, &(Node));
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_NOT_FOUND)
+ {
+ /*
+ * We didn't find the name reference by path -- we can qualify this
+ * a little better before we print an error message
+ */
+ if (strlen (Path) == ACPI_NAME_SIZE)
+ {
+ /* A simple, one-segment ACPI name */
+
+ if (LkObjectExists (Path))
+ {
+ /*
+ * There exists such a name, but we couldn't get to it
+ * from this scope
+ */
+ AslError (ASL_ERROR, ASL_MSG_NOT_REACHABLE, Op,
+ Op->Asl.ExternalName);
+ }
+ else
+ {
+ /* The name doesn't exist, period */
+
+ if ((Op->Asl.Parent) &&
+ (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF))
+ {
+ /* Ignore not found if parent is CondRefOf */
+
+ return (AE_OK);
+ }
+
+ AslError (ASL_ERROR, ASL_MSG_NOT_EXIST,
+ Op, Op->Asl.ExternalName);
+ }
+ }
+ else
+ {
+ /* Check for a fully qualified path */
+
+ if (Path[0] == AML_ROOT_PREFIX)
+ {
+ /* Gave full path, the object does not exist */
+
+ if ((Op->Asl.Parent) &&
+ (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF))
+ {
+ /* Ignore not found if parent is CondRefOf */
+
+ return (AE_OK);
+ }
+
+ AslError (ASL_ERROR, ASL_MSG_NOT_EXIST, Op,
+ Op->Asl.ExternalName);
+ }
+ else
+ {
+ /*
+ * We can't tell whether it doesn't exist or just
+ * can't be reached.
+ */
+ AslError (ASL_ERROR, ASL_MSG_NOT_FOUND, Op,
+ Op->Asl.ExternalName);
+ }
+ }
+
+ Status = AE_OK;
+ }
+ return (Status);
+ }
+
+ /* Check for a reference vs. name declaration */
+
+ if (!(OpInfo->Flags & AML_NAMED) &&
+ !(OpInfo->Flags & AML_CREATE))
+ {
+ /* This node has been referenced, mark it for reference check */
+
+ Node->Flags |= ANOBJ_IS_REFERENCED;
+ }
+
+ /* Attempt to optimize the NamePath */
+
+ OptOptimizeNamePath (Op, OpInfo->Flags, WalkState, Path, Node);
+
+ /*
+ * 1) Dereference an alias (A name reference that is an alias)
+ * Aliases are not nested, the alias always points to the final object
+ */
+ if ((Op->Asl.ParseOpcode != PARSEOP_ALIAS) &&
+ (Node->Type == ACPI_TYPE_LOCAL_ALIAS))
+ {
+ /* This node points back to the original PARSEOP_ALIAS */
+
+ NextOp = Node->Op;
+
+ /* The first child is the alias target op */
+
+ NextOp = NextOp->Asl.Child;
+
+ /* That in turn points back to original target alias node */
+
+ if (NextOp->Asl.Node)
+ {
+ Node = NextOp->Asl.Node;
+ }
+
+ /* Else - forward reference to alias, will be resolved later */
+ }
+
+ /* 2) Check for a reference to a resource descriptor */
+
+ if ((Node->Type == ACPI_TYPE_LOCAL_RESOURCE_FIELD) ||
+ (Node->Type == ACPI_TYPE_LOCAL_RESOURCE))
+ {
+ /*
+ * This was a reference to a field within a resource descriptor. Extract
+ * the associated field offset (either a bit or byte offset depending on
+ * the field type) and change the named reference into an integer for
+ * AML code generation
+ */
+ Temp = Node->Value;
+ if (Node->Flags & ANOBJ_IS_BIT_OFFSET)
+ {
+ Op->Asl.CompileFlags |= NODE_IS_BIT_OFFSET;
+ }
+
+ /* Perform BitOffset <--> ByteOffset conversion if necessary */
+
+ switch (Op->Asl.Parent->Asl.AmlOpcode)
+ {
+ case AML_CREATE_FIELD_OP:
+
+ /* We allow a Byte offset to Bit Offset conversion for this op */
+
+ if (!(Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET))
+ {
+ /* Simply multiply byte offset times 8 to get bit offset */
+
+ Temp = ACPI_MUL_8 (Temp);
+ }
+ break;
+
+
+ case AML_CREATE_BIT_FIELD_OP:
+
+ /* This op requires a Bit Offset */
+
+ if (!(Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET))
+ {
+ AslError (ASL_ERROR, ASL_MSG_BYTES_TO_BITS, Op, NULL);
+ }
+ break;
+
+
+ case AML_CREATE_BYTE_FIELD_OP:
+ case AML_CREATE_WORD_FIELD_OP:
+ case AML_CREATE_DWORD_FIELD_OP:
+ case AML_CREATE_QWORD_FIELD_OP:
+ case AML_INDEX_OP:
+
+ /* These Ops require Byte offsets */
+
+ if (Op->Asl.CompileFlags & NODE_IS_BIT_OFFSET)
+ {
+ AslError (ASL_ERROR, ASL_MSG_BITS_TO_BYTES, Op, NULL);
+ }
+ break;
+
+
+ default:
+ /* Nothing to do for other opcodes */
+ break;
+ }
+
+ /* Now convert this node to an integer whose value is the field offset */
+
+ Op->Asl.AmlLength = 0;
+ Op->Asl.ParseOpcode = PARSEOP_INTEGER;
+ Op->Asl.Value.Integer = (UINT64) Temp;
+ Op->Asl.CompileFlags |= NODE_IS_RESOURCE_FIELD;
+
+ OpcGenerateAmlOpcode (Op);
+ }
+
+ /* 3) Check for a method invocation */
+
+ else if ((((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) || (Op->Asl.ParseOpcode == PARSEOP_NAMESEG)) &&
+ (Node->Type == ACPI_TYPE_METHOD) &&
+ (Op->Asl.Parent) &&
+ (Op->Asl.Parent->Asl.ParseOpcode != PARSEOP_METHOD)) ||
+
+ (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
+ {
+
+ /*
+ * A reference to a method within one of these opcodes is not an
+ * invocation of the method, it is simply a reference to the method.
+ */
+ if ((Op->Asl.Parent) &&
+ ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_REFOF) ||
+ (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEREFOF) ||
+ (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_OBJECTTYPE)))
+ {
+ return (AE_OK);
+ }
+ /*
+ * There are two types of method invocation:
+ * 1) Invocation with arguments -- the parser recognizes this
+ * as a METHODCALL.
+ * 2) Invocation with no arguments --the parser cannot determine that
+ * this is a method invocation, therefore we have to figure it out
+ * here.
+ */
+ if (Node->Type != ACPI_TYPE_METHOD)
+ {
+ sprintf (MsgBuffer, "%s is a %s",
+ Op->Asl.ExternalName, AcpiUtGetTypeName (Node->Type));
+
+ AslError (ASL_ERROR, ASL_MSG_NOT_METHOD, Op, MsgBuffer);
+ return (AE_OK);
+ }
+
+ /* Save the method node in the caller's op */
+
+ Op->Asl.Node = Node;
+ if (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_CONDREFOF)
+ {
+ return (AE_OK);
+ }
+
+ /*
+ * This is a method invocation, with or without arguments.
+ * Count the number of arguments, each appears as a child
+ * under the parent node
+ */
+ Op->Asl.ParseOpcode = PARSEOP_METHODCALL;
+ UtSetParseOpName (Op);
+
+ PassedArgs = 0;
+ NextOp = Op->Asl.Child;
+
+ while (NextOp)
+ {
+ PassedArgs++;
+ NextOp = NextOp->Asl.Next;
+ }
+
+ if (Node->Value != ASL_EXTERNAL_METHOD)
+ {
+ /*
+ * Check the parsed arguments with the number expected by the
+ * method declaration itself
+ */
+ if (PassedArgs != Node->Value)
+ {
+ sprintf (MsgBuffer, "%s requires %d", Op->Asl.ExternalName,
+ Node->Value);
+
+ if (PassedArgs < Node->Value)
+ {
+ AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_LO, Op, MsgBuffer);
+ }
+ else
+ {
+ AslError (ASL_ERROR, ASL_MSG_ARG_COUNT_HI, Op, MsgBuffer);
+ }
+ }
+ }
+ }
+
+ /* 4) Check for an ASL Field definition */
+
+ else if ((Op->Asl.Parent) &&
+ ((Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_FIELD) ||
+ (Op->Asl.Parent->Asl.ParseOpcode == PARSEOP_BANKFIELD)))
+ {
+ /*
+ * Offset checking for fields. If the parent operation region has a
+ * constant length (known at compile time), we can check fields
+ * defined in that region against the region length. This will catch
+ * fields and field units that cannot possibly fit within the region.
+ *
+ * Note: Index fields do not directly reference an operation region,
+ * thus they are not included in this check.
+ */
+ if (Op == Op->Asl.Parent->Asl.Child)
+ {
+ /*
+ * This is the first child of the field node, which is
+ * the name of the region. Get the parse node for the
+ * region -- which contains the length of the region.
+ */
+ OwningOp = Node->Op;
+ Op->Asl.Parent->Asl.ExtraValue =
+ ACPI_MUL_8 ((UINT32) OwningOp->Asl.Value.Integer);
+
+ /* Examine the field access width */
+
+ switch ((UINT8) Op->Asl.Parent->Asl.Value.Integer)
+ {
+ case AML_FIELD_ACCESS_ANY:
+ case AML_FIELD_ACCESS_BYTE:
+ case AML_FIELD_ACCESS_BUFFER:
+ default:
+ MinimumLength = 1;
+ break;
+
+ case AML_FIELD_ACCESS_WORD:
+ MinimumLength = 2;
+ break;
+
+ case AML_FIELD_ACCESS_DWORD:
+ MinimumLength = 4;
+ break;
+
+ case AML_FIELD_ACCESS_QWORD:
+ MinimumLength = 8;
+ break;
+ }
+
+ /*
+ * Is the region at least as big as the access width?
+ * Note: DataTableRegions have 0 length
+ */
+ if (((UINT32) OwningOp->Asl.Value.Integer) &&
+ ((UINT32) OwningOp->Asl.Value.Integer < MinimumLength))
+ {
+ AslError (ASL_ERROR, ASL_MSG_FIELD_ACCESS_WIDTH, Op, NULL);
+ }
+
+ /*
+ * Check EC/CMOS/SMBUS fields to make sure that the correct
+ * access type is used (BYTE for EC/CMOS, BUFFER for SMBUS)
+ */
+ SpaceIdOp = OwningOp->Asl.Child->Asl.Next;
+ switch ((UINT32) SpaceIdOp->Asl.Value.Integer)
+ {
+ case REGION_EC:
+ case REGION_CMOS:
+
+ if ((UINT8) Op->Asl.Parent->Asl.Value.Integer != AML_FIELD_ACCESS_BYTE)
+ {
+ AslError (ASL_ERROR, ASL_MSG_REGION_BYTE_ACCESS, Op, NULL);
+ }
+ break;
+
+ case REGION_SMBUS:
+
+ if ((UINT8) Op->Asl.Parent->Asl.Value.Integer != AML_FIELD_ACCESS_BUFFER)
+ {
+ AslError (ASL_ERROR, ASL_MSG_REGION_BUFFER_ACCESS, Op, NULL);
+ }
+ break;
+
+ default:
+
+ /* Nothing to do for other address spaces */
+ break;
+ }
+ }
+ else
+ {
+ /*
+ * This is one element of the field list. Check to make sure
+ * that it does not go beyond the end of the parent operation region.
+ *
+ * In the code below:
+ * Op->Asl.Parent->Asl.ExtraValue - Region Length (bits)
+ * Op->Asl.ExtraValue - Field start offset (bits)
+ * Op->Asl.Child->Asl.Value.Integer32 - Field length (bits)
+ * Op->Asl.Child->Asl.ExtraValue - Field access width (bits)
+ */
+ if (Op->Asl.Parent->Asl.ExtraValue && Op->Asl.Child)
+ {
+ LkCheckFieldRange (Op,
+ Op->Asl.Parent->Asl.ExtraValue,
+ Op->Asl.ExtraValue,
+ (UINT32) Op->Asl.Child->Asl.Value.Integer,
+ Op->Asl.Child->Asl.ExtraValue);
+ }
+ }
+ }
+
+ Op->Asl.Node = Node;
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: LkNamespaceLocateEnd
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback used during cross reference. We only
+ * need to worry about scope management here.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+LkNamespaceLocateEnd (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_WALK_STATE *WalkState = (ACPI_WALK_STATE *) Context;
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ ACPI_FUNCTION_TRACE (LkNamespaceLocateEnd);
+
+
+ /* We are only interested in opcodes that have an associated name */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Asl.AmlOpcode);
+ if (!(OpInfo->Flags & AML_NAMED))
+ {
+ return (AE_OK);
+ }
+
+ /* Not interested in name references, we did not open a scope for them */
+
+ if ((Op->Asl.ParseOpcode == PARSEOP_NAMESTRING) ||
+ (Op->Asl.ParseOpcode == PARSEOP_NAMESEG) ||
+ (Op->Asl.ParseOpcode == PARSEOP_METHODCALL))
+ {
+ return (AE_OK);
+ }
+
+ /* Pop the scope stack if necessary */
+
+ if (AcpiNsOpensScope (AslMapNamedOpcodeToDataType (Op->Asl.AmlOpcode)))
+ {
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "%s: Popping scope for Op %p\n",
+ AcpiUtGetTypeName (OpInfo->ObjectType), Op));
+
+ (void) AcpiDsScopeStackPop (WalkState);
+ }
+
+ return (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslmain.c b/sys/contrib/dev/acpica/compiler/aslmain.c
new file mode 100644
index 0000000..6fe94b4
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslmain.c
@@ -0,0 +1,868 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslmain - compiler main and utilities
+ * $Revision: 1.96 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define _DECLARE_GLOBALS
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/actables.h>
+#include <contrib/dev/acpica/acapps.h>
+
+#ifdef _DEBUG
+#include <crtdbg.h>
+#endif
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslmain")
+
+BOOLEAN AslToFile = TRUE;
+BOOLEAN DoCompile = TRUE;
+BOOLEAN DoSignon = TRUE;
+
+char hex[] =
+{
+ '0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'
+};
+
+/* Local prototypes */
+
+static void
+Options (
+ void);
+
+static void
+HelpMessage (
+ void);
+
+static void
+Usage (
+ void);
+
+static void
+AslInitialize (
+ void);
+
+static void
+AslCommandLine (
+ int argc,
+ char **argv);
+
+#ifdef _DEBUG
+#include <crtdbg.h>
+#endif
+
+/*******************************************************************************
+ *
+ * FUNCTION: Options
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display option help message
+ *
+ ******************************************************************************/
+
+static void
+Options (
+ void)
+{
+
+ printf ("General Output:\n");
+ printf (" -p <prefix> Specify filename prefix for all output files (including .aml)\n");
+ printf (" -vi Less verbose errors and warnings for use with IDEs\n");
+ printf (" -vo Enable optimization comments\n");
+ printf (" -vr Disable remarks\n");
+ printf (" -vs Disable signon\n");
+ printf (" -w<1|2|3> Set warning reporting level\n");
+
+ printf ("\nAML Output Files:\n");
+ printf (" -s<a|c> Create AML in assembler or C source file (*.asm or *.c)\n");
+ printf (" -i<a|c> Create assembler or C include file (*.inc or *.h)\n");
+ printf (" -t<a|c> Create AML in assembler or C hex table (*.hex)\n");
+
+ printf ("\nAML Code Generation:\n");
+ printf (" -oa Disable all optimizations (compatibility mode)\n");
+ printf (" -of Disable constant folding\n");
+ printf (" -oi Disable integer optimization to Zero/One/Ones\n");
+ printf (" -on Disable named reference string optimization\n");
+ printf (" -r<Revision> Override table header Revision (1-255)\n");
+
+ printf ("\nListings:\n");
+ printf (" -l Create mixed listing file (ASL source and AML) (*.lst)\n");
+ printf (" -ln Create namespace file (*.nsp)\n");
+ printf (" -ls Create combined source file (expanded includes) (*.src)\n");
+
+ printf ("\nAML Disassembler:\n");
+ printf (" -d [file] Disassemble or decode binary ACPI table to file (*.dsl)\n");
+ printf (" -dc [file] Disassemble AML and immediately compile it\n");
+ printf (" (Obtain DSDT from current system if no input file)\n");
+ printf (" -e [file] Include ACPI table for external symbol resolution\n");
+ printf (" -2 Emit ACPI 2.0 compatible ASL code\n");
+ printf (" -g Get ACPI tables and write to files (*.dat)\n");
+
+ printf ("\nHelp:\n");
+ printf (" -h Additional help and compiler debug options\n");
+ printf (" -hc Display operators allowed in constant expressions\n");
+ printf (" -hr Display ACPI reserved method names\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: HelpMessage
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display help message
+ *
+ ******************************************************************************/
+
+static void
+HelpMessage (
+ void)
+{
+
+ printf ("AML output filename generation:\n");
+ printf (" Output filenames are generated by appending an extension to a common\n");
+ printf (" filename prefix. The filename prefix is obtained via one of the\n");
+ printf (" following methods (in priority order):\n");
+ printf (" 1) The -p option specifies the prefix\n");
+ printf (" 2) The prefix of the AMLFileName in the ASL Definition Block\n");
+ printf (" 3) The prefix of the input filename\n");
+ printf ("\n");
+
+ Options ();
+
+ printf ("\nCompiler/Disassembler Debug Options:\n");
+ printf (" -b<p|t|b> Create compiler debug/trace file (*.txt)\n");
+ printf (" Types: Parse/Tree/Both\n");
+ printf (" -f Ignore errors, force creation of AML output file(s)\n");
+ printf (" -c Parse only, no output generation\n");
+ printf (" -ot Display compile times\n");
+ printf (" -x<level> Set debug level for trace output\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Usage
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display usage and option message
+ *
+ ******************************************************************************/
+
+static void
+Usage (
+ void)
+{
+
+ printf ("Usage: %s [Options] [InputFile]\n\n", CompilerName);
+ Options ();
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslInitialize
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Initialize compiler globals
+ *
+ ******************************************************************************/
+
+static void
+AslInitialize (
+ void)
+{
+ UINT32 i;
+
+
+#ifdef _DEBUG
+ _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CrtSetDbgFlag(0));
+#endif
+
+ AcpiDbgLevel = 0;
+
+ for (i = 0; i < ASL_NUM_FILES; i++)
+ {
+ Gbl_Files[i].Handle = NULL;
+ Gbl_Files[i].Filename = NULL;
+ }
+
+ Gbl_Files[ASL_FILE_STDOUT].Handle = stdout;
+ Gbl_Files[ASL_FILE_STDOUT].Filename = "STDOUT";
+
+ Gbl_Files[ASL_FILE_STDERR].Handle = stderr;
+ Gbl_Files[ASL_FILE_STDERR].Filename = "STDERR";
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslCommandLine
+ *
+ * PARAMETERS: argc/argv
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Command line processing
+ *
+ ******************************************************************************/
+
+static void
+AslCommandLine (
+ int argc,
+ char **argv)
+{
+ BOOLEAN BadCommandLine = FALSE;
+ ACPI_NATIVE_INT j;
+
+
+ /* Minimum command line contains at least one option or an input file */
+
+ if (argc < 2)
+ {
+ AslCompilerSignon (ASL_FILE_STDOUT);
+ Usage ();
+ exit (1);
+ }
+
+ /* Get the command line options */
+
+ while ((j = AcpiGetopt (argc, argv, "2b:cd^e:fgh^i^l^o:p:r:s:t:v:w:x:")) != EOF) switch (j)
+ {
+ case '2':
+ Gbl_Acpi2 = TRUE;
+ break;
+
+
+ case 'b':
+
+ switch (AcpiGbl_Optarg[0])
+ {
+ case 'b':
+ AslCompilerdebug = 1; /* same as yydebug */
+ break;
+
+ case 'p':
+ AslCompilerdebug = 1; /* same as yydebug */
+ break;
+
+ case 't':
+ break;
+
+ default:
+ printf ("Unknown option: -b%s\n", AcpiGbl_Optarg);
+ BadCommandLine = TRUE;
+ break;
+ }
+
+ /* Produce debug output file */
+
+ Gbl_DebugFlag = TRUE;
+ break;
+
+
+ case 'c':
+
+ /* Parse only */
+
+ Gbl_ParseOnlyFlag = TRUE;
+ break;
+
+
+ case 'd':
+ switch (AcpiGbl_Optarg[0])
+ {
+ case '^':
+ DoCompile = FALSE;
+ break;
+
+ case 'c':
+ break;
+
+ default:
+ printf ("Unknown option: -d%s\n", AcpiGbl_Optarg);
+ BadCommandLine = TRUE;
+ break;
+ }
+
+ Gbl_DisasmFlag = TRUE;
+ break;
+
+
+ case 'e':
+ Gbl_ExternalFilename = AcpiGbl_Optarg;
+ break;
+
+
+ case 'f':
+
+ /* Ignore errors and force creation of aml file */
+
+ Gbl_IgnoreErrors = TRUE;
+ break;
+
+
+ case 'g':
+
+ /* Get all ACPI tables */
+
+ Gbl_GetAllTables = TRUE;
+ DoCompile = FALSE;
+ break;
+
+
+ case 'h':
+
+ switch (AcpiGbl_Optarg[0])
+ {
+ case '^':
+ HelpMessage ();
+ exit (0);
+
+ case 'c':
+ UtDisplayConstantOpcodes ();
+ exit (0);
+
+ case 'r':
+ /* reserved names */
+
+ MpDisplayReservedNames ();
+ exit (0);
+
+ default:
+ printf ("Unknown option: -h%s\n", AcpiGbl_Optarg);
+ BadCommandLine = TRUE;
+ break;
+ }
+ break;
+
+
+ case 'i':
+
+ switch (AcpiGbl_Optarg[0])
+ {
+ case 'a':
+
+ /* Produce assembly code include file */
+
+ Gbl_AsmIncludeOutputFlag = TRUE;
+ break;
+
+ case 'c':
+
+ /* Produce C include file */
+
+ Gbl_C_IncludeOutputFlag = TRUE;
+ break;
+
+ default:
+ printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
+ BadCommandLine = TRUE;
+ break;
+ }
+ break;
+
+
+ case 'l':
+
+ switch (AcpiGbl_Optarg[0])
+ {
+ case '^':
+ /* Produce listing file (Mixed source/aml) */
+
+ Gbl_ListingFlag = TRUE;
+ break;
+
+ case 'n':
+ /* Produce namespace file */
+
+ Gbl_NsOutputFlag = TRUE;
+ break;
+
+ case 's':
+ /* Produce combined source file */
+
+ Gbl_SourceOutputFlag = TRUE;
+ break;
+
+ default:
+ printf ("Unknown option: -l%s\n", AcpiGbl_Optarg);
+ BadCommandLine = TRUE;
+ break;
+ }
+ break;
+
+
+ case 'o':
+
+ switch (AcpiGbl_Optarg[0])
+ {
+ case 'a':
+
+ /* Disable all optimizations */
+
+ Gbl_FoldConstants = FALSE;
+ Gbl_IntegerOptimizationFlag = FALSE;
+ Gbl_ReferenceOptimizationFlag = FALSE;
+ break;
+
+ case 'f':
+
+ /* Disable folding on "normal" expressions */
+
+ Gbl_FoldConstants = FALSE;
+ break;
+
+ case 'i':
+
+ /* Disable integer optimization to constants */
+
+ Gbl_IntegerOptimizationFlag = FALSE;
+ break;
+
+ case 'n':
+
+ /* Disable named reference optimization */
+
+ Gbl_ReferenceOptimizationFlag = FALSE;
+ break;
+
+ case 't':
+
+ /* Display compile time(s) */
+
+ Gbl_CompileTimesFlag = TRUE;
+ break;
+
+ default:
+ printf ("Unknown option: -c%s\n", AcpiGbl_Optarg);
+ BadCommandLine = TRUE;
+ break;
+ }
+ break;
+
+
+ case 'p':
+
+ /* Override default AML output filename */
+
+ Gbl_OutputFilenamePrefix = AcpiGbl_Optarg;
+ Gbl_UseDefaultAmlFilename = FALSE;
+ break;
+
+
+ case 'r':
+ Gbl_RevisionOverride = (UINT8) strtoul (AcpiGbl_Optarg, NULL, 0);
+ break;
+
+
+ case 's':
+
+ switch (AcpiGbl_Optarg[0])
+ {
+ case 'a':
+
+ /* Produce assembly code output file */
+
+ Gbl_AsmOutputFlag = TRUE;
+ break;
+
+ case 'c':
+
+ /* Produce C hex output file */
+
+ Gbl_C_OutputFlag = TRUE;
+ break;
+
+ default:
+ printf ("Unknown option: -s%s\n", AcpiGbl_Optarg);
+ BadCommandLine = TRUE;
+ break;
+ }
+ break;
+
+
+ case 't':
+
+ /* Produce hex table output file */
+
+ switch (AcpiGbl_Optarg[0])
+ {
+ case 'a':
+ Gbl_HexOutputFlag = HEX_OUTPUT_ASM;
+ break;
+
+ case 'c':
+ Gbl_HexOutputFlag = HEX_OUTPUT_C;
+ break;
+
+ default:
+ printf ("Unknown option: -t%s\n", AcpiGbl_Optarg);
+ BadCommandLine = TRUE;
+ break;
+ }
+ break;
+
+
+ case 'v':
+
+ switch (AcpiGbl_Optarg[0])
+ {
+ case 'i':
+ /* Less verbose error messages */
+
+ Gbl_VerboseErrors = FALSE;
+ break;
+
+ case 'o':
+ Gbl_DisplayOptimizations = TRUE;
+ break;
+
+ case 'r':
+ Gbl_DisplayRemarks = FALSE;
+ break;
+
+ case 's':
+ DoSignon = FALSE;
+ break;
+
+ default:
+ printf ("Unknown option: -v%s\n", AcpiGbl_Optarg);
+ BadCommandLine = TRUE;
+ break;
+ }
+ break;
+
+
+ case 'w': /* Set warning levels */
+
+ switch (AcpiGbl_Optarg[0])
+ {
+ case '1':
+ Gbl_WarningLevel = ASL_WARNING;
+ break;
+
+ case '2':
+ Gbl_WarningLevel = ASL_WARNING2;
+ break;
+
+ case '3':
+ Gbl_WarningLevel = ASL_WARNING3;
+ break;
+
+ default:
+ printf ("Unknown option: -w%s\n", AcpiGbl_Optarg);
+ BadCommandLine = TRUE;
+ break;
+ }
+ break;
+
+
+ case 'x':
+
+ AcpiDbgLevel = strtoul (AcpiGbl_Optarg, NULL, 16);
+ break;
+
+
+ default:
+
+ BadCommandLine = TRUE;
+ break;
+ }
+
+ /* Next parameter must be the input filename */
+
+ Gbl_Files[ASL_FILE_INPUT].Filename = argv[AcpiGbl_Optind];
+
+ if (!Gbl_Files[ASL_FILE_INPUT].Filename &&
+ !Gbl_DisasmFlag &&
+ !Gbl_GetAllTables)
+ {
+ printf ("Missing input filename\n");
+ BadCommandLine = TRUE;
+ }
+
+ if (DoSignon)
+ {
+ AslCompilerSignon (ASL_FILE_STDOUT);
+ }
+
+ /* Abort if anything went wrong on the command line */
+
+ if (BadCommandLine)
+ {
+ printf ("\n");
+ Usage ();
+ exit (1);
+ }
+
+ if ((AcpiGbl_Optind + 1) < argc)
+ {
+ printf ("Warning: extra arguments (%d) after input filename are ignored\n\n",
+ argc - AcpiGbl_Optind - 1);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: main
+ *
+ * PARAMETERS: Standard argc/argv
+ *
+ * RETURN: Program termination code
+ *
+ * DESCRIPTION: C main routine for the Asl Compiler. Handle command line
+ * options and begin the compile.
+ *
+ ******************************************************************************/
+
+int ACPI_SYSTEM_XFACE
+main (
+ int argc,
+ char **argv)
+{
+ ACPI_STATUS Status;
+ char *Prefix;
+
+
+#ifdef _DEBUG
+ _CrtSetDbgFlag (_CRTDBG_CHECK_ALWAYS_DF | _CRTDBG_LEAK_CHECK_DF |
+ _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG));
+#endif
+
+ /* Init and command line */
+
+ AslInitialize ();
+ AslCommandLine (argc, argv);
+
+ /*
+ * If -p not specified, we will use the input filename as the
+ * output filename prefix
+ */
+ Status = FlSplitInputPathname (Gbl_Files[ASL_FILE_INPUT].Filename,
+ &Gbl_DirectoryPath, &Prefix);
+ if (ACPI_FAILURE (Status))
+ {
+ return -1;
+ }
+
+ if (Gbl_UseDefaultAmlFilename)
+ {
+ Gbl_OutputFilenamePrefix = Prefix;
+ }
+
+ /* AML Disassembly (Optional) */
+
+ if (Gbl_DisasmFlag || Gbl_GetAllTables)
+ {
+ /* ACPI CA subsystem initialization */
+
+ Status = AdInitialize ();
+ if (ACPI_FAILURE (Status))
+ {
+ return -1;
+ }
+
+ Status = AcpiAllocateRootTable (4);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not initialize ACPI Table Manager, %s\n",
+ AcpiFormatException (Status));
+ return -1;
+ }
+
+ /* This is where the disassembly happens */
+
+ AcpiGbl_DbOpt_disasm = TRUE;
+ Status = AdAmlDisassemble (AslToFile,
+ Gbl_Files[ASL_FILE_INPUT].Filename,
+ Gbl_OutputFilenamePrefix,
+ &Gbl_Files[ASL_FILE_INPUT].Filename,
+ Gbl_GetAllTables);
+ if (ACPI_FAILURE (Status))
+ {
+ return -1;
+ }
+
+ /*
+ * Gbl_Files[ASL_FILE_INPUT].Filename was replaced with the
+ * .DSL disassembly file, which can now be compiled if requested
+ */
+ if (DoCompile)
+ {
+ AcpiOsPrintf ("\nCompiling \"%s\"\n",
+ Gbl_Files[ASL_FILE_INPUT].Filename);
+ }
+ }
+
+ /*
+ * ASL Compilation (Optional)
+ */
+ if (DoCompile)
+ {
+ /*
+ * If -p not specified, we will use the input filename as the
+ * output filename prefix
+ */
+ Status = FlSplitInputPathname (Gbl_Files[ASL_FILE_INPUT].Filename,
+ &Gbl_DirectoryPath, &Prefix);
+ if (ACPI_FAILURE (Status))
+ {
+ return -1;
+ }
+
+ if (Gbl_UseDefaultAmlFilename)
+ {
+ Gbl_OutputFilenamePrefix = Prefix;
+ }
+
+ /* ACPI CA subsystem initialization (Must be re-initialized) */
+
+ Status = AcpiOsInitialize ();
+ AcpiUtInitGlobals ();
+ Status = AcpiUtMutexInitialize ();
+ if (ACPI_FAILURE (Status))
+ {
+ return -1;
+ }
+
+ Status = AcpiNsRootInitialize ();
+ if (ACPI_FAILURE (Status))
+ {
+ return -1;
+ }
+ Status = CmDoCompile ();
+ }
+
+ return (0);
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslmap.c b/sys/contrib/dev/acpica/compiler/aslmap.c
new file mode 100644
index 0000000..5384d0b
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslmap.c
@@ -0,0 +1,750 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslmap - parser to AML opcode mapping table
+ * $Revision: 1.87 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acparser.h>
+
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslmap")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AslMapNamedOpcodeToDataType
+ *
+ * PARAMETERS: Opcode - The Named AML opcode to map
+ *
+ * RETURN: The ACPI type associated with the named opcode
+ *
+ * DESCRIPTION: Convert a raw Named AML opcode to the associated data type.
+ * Named opcodes are a subset of the AML opcodes.
+ *
+ ******************************************************************************/
+
+ACPI_OBJECT_TYPE
+AslMapNamedOpcodeToDataType (
+ UINT16 Opcode)
+{
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ /*
+ * There are some differences from the opcode table types, we
+ * catch them here.
+ */
+ OpInfo = AcpiPsGetOpcodeInfo (Opcode);
+
+ if (Opcode == AML_INT_NAMEPATH_OP)
+ {
+ return (ACPI_TYPE_ANY);
+ }
+
+ if (Opcode == AML_INT_METHODCALL_OP)
+ {
+ return (ACPI_TYPE_ANY);
+ }
+
+ if (OpInfo->Flags & AML_NSOBJECT)
+ {
+ return (OpInfo->ObjectType);
+ }
+
+ return (ACPI_TYPE_ANY);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: MpDisplayReservedNames
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print the table above
+ *
+ ******************************************************************************/
+
+void
+MpDisplayReservedNames (
+ void)
+{
+ UINT32 i;
+
+ printf ("Reserved name information\n\n");
+
+ for (i = 0; ReservedMethods[i].Name; i++)
+ {
+ printf ("%s ", ReservedMethods[i].Name);
+
+ if (ReservedMethods[i].Flags & ASL_RSVD_SCOPE)
+ {
+ printf ("Reserved scope name\n");
+ }
+ else if (ReservedMethods[i].Flags & ASL_RSVD_RESOURCE_NAME)
+ {
+ printf ("Resource data type reserved field name\n");
+ }
+ else
+ {
+ printf ("Method with %d arguments, ",
+ ReservedMethods[i].NumArguments);
+
+ if (ReservedMethods[i].Flags & ASL_RSVD_RETURN_VALUE)
+ {
+ printf ("must return a value\n");
+ }
+ else
+ {
+ printf ("no return value\n");
+ }
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * DATA STRUCTURE: ReservedMethods
+ *
+ * DESCRIPTION: Contains all reserved methods and names as defined in the
+ * ACPI specification. Used during the analysis phase to
+ * ensure that reserved methods have the required number of
+ * arguments and the proper return type.
+ *
+ * Each entry in the table contains the following items:
+ *
+ * Name - The ACPI reserved name
+ * Args - Number of arguments to the method
+ * Flags - Whether this method must return a value or not
+ *
+ ******************************************************************************/
+
+const ASL_RESERVED_INFO ReservedMethods[] = {
+ {"_AC0", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AC1", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AC2", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AC3", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AC4", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AC5", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AC6", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AC7", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AC8", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AC9", 0, ASL_RSVD_RETURN_VALUE},
+ {"_ADR", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AL0", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AL1", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AL2", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AL3", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AL4", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AL5", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AL6", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AL7", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AL8", 0, ASL_RSVD_RETURN_VALUE},
+ {"_AL9", 0, ASL_RSVD_RETURN_VALUE},
+ {"_ALC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_ALI", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_ALN", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_ALP", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_ALR", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_ALT", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_ASI", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_BAS", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_BBN", 0, ASL_RSVD_RETURN_VALUE},
+ {"_BCL", 0, ASL_RSVD_RETURN_VALUE},
+ {"_BCM", 1, 0},
+ {"_BDN", 0, ASL_RSVD_RETURN_VALUE},
+ {"_BFS", 1, 0},
+ {"_BIF", 0, ASL_RSVD_RETURN_VALUE},
+ {"_BLT", 3, 0}, /* Acpi 3.0 */
+ {"_BM_", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_BMC", 1, 0}, /* Acpi 3.0 */
+ {"_BMD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_BQC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_BST", 0, ASL_RSVD_RETURN_VALUE},
+ {"_BTM", 1, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_BTP", 1, 0},
+ {"_CBA", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_CID", 0, ASL_RSVD_RETURN_VALUE},
+ {"_CRS", 0, ASL_RSVD_RETURN_VALUE},
+ {"_CRT", 0, ASL_RSVD_RETURN_VALUE},
+ {"_CSD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_CST", 0, ASL_RSVD_RETURN_VALUE},
+ {"_DCK", 1, ASL_RSVD_RETURN_VALUE},
+ {"_DCS", 0, ASL_RSVD_RETURN_VALUE},
+ {"_DDC", 1, ASL_RSVD_RETURN_VALUE},
+ {"_DDN", 0, 0},
+ {"_DEC", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_DGS", 0, ASL_RSVD_RETURN_VALUE},
+ {"_DIS", 0, 0},
+ {"_DMA", 0, ASL_RSVD_RETURN_VALUE},
+ {"_DOD", 0, ASL_RSVD_RETURN_VALUE},
+ {"_DOS", 1, 0},
+ {"_DSM", 4, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_DSS", 1, 0},
+ {"_DSW", 3, 0}, /* Acpi 3.0 */
+ {"_EC_", 0, ASL_RSVD_RETURN_VALUE},
+ {"_EDL", 0, ASL_RSVD_RETURN_VALUE},
+ {"_EJ0", 1, 0},
+ {"_EJ1", 1, 0},
+ {"_EJ2", 1, 0},
+ {"_EJ3", 1, 0},
+ {"_EJ4", 1, 0},
+ {"_EJD", 0, ASL_RSVD_RETURN_VALUE},
+ {"_ERR", 3, ASL_RSVD_RETURN_VALUE},
+ {"_FDE", 0, ASL_RSVD_RETURN_VALUE},
+ {"_FDI", 0, ASL_RSVD_RETURN_VALUE},
+ {"_FDM", 1, 0},
+ {"_FIX", 0, ASL_RSVD_RETURN_VALUE},
+ {"_GL_", 0, ASL_RSVD_RETURN_VALUE},
+ {"_GLK", 0, ASL_RSVD_RETURN_VALUE},
+ {"_GPD", 0, ASL_RSVD_RETURN_VALUE},
+ {"_GPE", 0, ASL_RSVD_RETURN_VALUE},
+ {"_GRA", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_GSB", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_GTF", 0, ASL_RSVD_RETURN_VALUE},
+ {"_GTM", 0, ASL_RSVD_RETURN_VALUE},
+ {"_GTS", 1, 0},
+ {"_HE_", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_HID", 0, ASL_RSVD_RETURN_VALUE},
+ {"_HOT", 0, ASL_RSVD_RETURN_VALUE},
+ {"_HPP", 0, ASL_RSVD_RETURN_VALUE},
+ {"_HPX", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_IFT", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_INI", 0, 0},
+ {"_INT", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_IRC", 0, 0},
+ {"_LCK", 1, 0},
+ {"_LEN", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_LID", 0, ASL_RSVD_RETURN_VALUE},
+ {"_LL_", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_MAF", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_MAT", 0, ASL_RSVD_RETURN_VALUE},
+ {"_MAX", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_MEM", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_MIF", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_MIN", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_MLS", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_MSG", 1, 0},
+ {"_OFF", 0, 0},
+ {"_ON_", 0, 0},
+ {"_OS_", 0, ASL_RSVD_RETURN_VALUE},
+ {"_OSC", 4, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_OSI", 1, ASL_RSVD_RETURN_VALUE},
+ {"_OST", 3, 0}, /* Acpi 3.0 */
+ {"_PCL", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PCT", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PDC", 1, 0},
+ {"_PIC", 1, 0},
+ {"_PLD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_PPC", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PPE", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_PR0", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PR1", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PR2", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PRS", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PRT", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PRW", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PS0", 0, 0},
+ {"_PS1", 0, 0},
+ {"_PS2", 0, 0},
+ {"_PS3", 0, 0},
+ {"_PSC", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PSD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_PSL", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PSR", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PSS", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PSV", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PSW", 1, 0},
+ {"_PTC", 0, ASL_RSVD_RETURN_VALUE},
+ {"_PTS", 1, 0},
+ {"_PXM", 0, ASL_RSVD_RETURN_VALUE},
+ {"_RBO", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_RBW", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_REG", 2, 0},
+ {"_REV", 0, ASL_RSVD_RETURN_VALUE},
+ {"_RMV", 0, ASL_RSVD_RETURN_VALUE},
+ {"_RNG", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_ROM", 2, ASL_RSVD_RETURN_VALUE},
+ {"_RT_", 0, ASL_RSVD_RESOURCE_NAME}, /* Acpi 3.0 */
+ {"_RTV", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_RW_", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_S0_", 0, ASL_RSVD_RETURN_VALUE},
+ {"_S1_", 0, ASL_RSVD_RETURN_VALUE},
+ {"_S2_", 0, ASL_RSVD_RETURN_VALUE},
+ {"_S3_", 0, ASL_RSVD_RETURN_VALUE},
+ {"_S4_", 0, ASL_RSVD_RETURN_VALUE},
+ {"_S5_", 0, ASL_RSVD_RETURN_VALUE},
+ {"_S1D", 0, ASL_RSVD_RETURN_VALUE},
+ {"_S2D", 0, ASL_RSVD_RETURN_VALUE},
+ {"_S3D", 0, ASL_RSVD_RETURN_VALUE},
+ {"_S4D", 0, ASL_RSVD_RETURN_VALUE},
+ {"_S0W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_S1W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_S2W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_S3W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_S4W", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_SB_", 0, ASL_RSVD_SCOPE},
+ {"_SBS", 0, ASL_RSVD_RETURN_VALUE},
+ {"_SCP", 1, 0},
+ {"_SDD", 1, 0}, /* Acpi 3.0 */
+ {"_SEG", 0, ASL_RSVD_RETURN_VALUE},
+ {"_SHR", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_SI_", 0, ASL_RSVD_SCOPE},
+ {"_SIZ", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_SLI", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_SPD", 1, ASL_RSVD_RETURN_VALUE},
+ {"_SRS", 1, 0},
+ {"_SRV", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_SST", 1, 0},
+ {"_STA", 0, ASL_RSVD_RETURN_VALUE},
+ {"_STM", 3, 0},
+ {"_STR", 0, ASL_RSVD_RETURN_VALUE},
+ {"_SUN", 0, ASL_RSVD_RETURN_VALUE},
+ {"_SWS", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_TC1", 0, ASL_RSVD_RETURN_VALUE},
+ {"_TC2", 0, ASL_RSVD_RETURN_VALUE},
+ {"_TDL", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0b */
+ {"_TMP", 0, ASL_RSVD_RETURN_VALUE},
+ {"_TPC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_TPT", 1, 0}, /* Acpi 3.0 */
+ {"_TRA", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_TRS", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_TRT", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_TSD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_TSF", 0, ASL_RSVD_RESOURCE_NAME}, /* Acpi 3.0 */
+ {"_TSP", 0, ASL_RSVD_RETURN_VALUE},
+ {"_TSS", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_TST", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_TTP", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_TTS", 1, 0}, /* Acpi 3.0 */
+ {"_TYP", 0, ASL_RSVD_RESOURCE_NAME},
+ {"_TZ_", 0, ASL_RSVD_SCOPE},
+ {"_TZD", 0, ASL_RSVD_RETURN_VALUE},
+ {"_TZM", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_TZP", 0, ASL_RSVD_RETURN_VALUE},
+ {"_UID", 0, ASL_RSVD_RETURN_VALUE},
+ {"_UPC", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_UPD", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_UPP", 0, ASL_RSVD_RETURN_VALUE}, /* Acpi 3.0 */
+ {"_VPO", 0, ASL_RSVD_RETURN_VALUE},
+ {"_WAK", 1, ASL_RSVD_RETURN_VALUE},
+ {"_WDG", 0, ASL_RSVD_RETURN_VALUE}, /* MS Extension */
+ {"_WED", 1, ASL_RSVD_RETURN_VALUE}, /* MS Extension */
+ {NULL, 0, 0},
+};
+
+
+/*******************************************************************************
+ *
+ * DATA STRUCTURE: AslKeywordMapping
+ *
+ * DESCRIPTION: Maps the ParseOpcode to the actual AML opcode. The parse
+ * opcodes are generated from Bison, and this table must
+ * track any additions to them.
+ *
+ * Each entry in the table contains the following items:
+ *
+ * AML opcode - Opcode that is written to the AML file
+ * Value - Value of the object to be written (if applicable)
+ * Flags - 1) Whether this opcode opens an AML "package".
+ *
+ ******************************************************************************/
+/*
+ * TBD:
+ * AccessAttrib
+ * AccessType
+ * AMlop for DMA?
+ * ObjectType keywords
+ * Register
+ */
+
+const ASL_MAPPING_ENTRY AslKeywordMapping [] =
+{
+/*! [Begin] no source code translation (keep the table structure) */
+
+
+/* ACCESSAS */ OP_TABLE_ENTRY (AML_INT_ACCESSFIELD_OP, 0, 0, 0),
+/* ACCESSATTRIB_BLOCK */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ATTRIB_SMB_BLOCK, 0, 0),
+/* ACCESSATTRIB_BLOCK_CALL */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ATTRIB_SMB_BLOCK_CALL,0, 0),
+/* ACCESSATTRIB_BYTE */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ATTRIB_SMB_BYTE, 0, 0),
+/* ACCESSATTRIB_WORD_CALL */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ATTRIB_SMB_WORD_CALL, 0, 0),
+/* ACCESSATTRIB_QUICK */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ATTRIB_SMB_QUICK, 0, 0),
+/* ACCESSATTRIB_SND_RCV */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ATTRIB_SMB_SEND_RCV, 0, 0),
+/* ACCESSATTRIB_WORD */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ATTRIB_SMB_WORD, 0, 0),
+/* ACCESSTYPE_ANY */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ACCESS_ANY, 0, 0),
+/* ACCESSTYPE_BUF */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ACCESS_BUFFER, 0, 0),
+/* ACCESSTYPE_BYTE */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ACCESS_BYTE, 0, 0),
+/* ACCESSTYPE_DWORD */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ACCESS_DWORD, 0, 0),
+/* ACCESSTYPE_QWORD */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ACCESS_QWORD, 0, 0),
+/* ACCESSTYPE_WORD */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_ACCESS_WORD, 0, 0),
+/* ACQUIRE */ OP_TABLE_ENTRY (AML_ACQUIRE_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* ADD */ OP_TABLE_ENTRY (AML_ADD_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* ADDRESSSPACE_FFIXEDHW */ OP_TABLE_ENTRY (AML_BYTE_OP, REGION_FIXED_HW, 0, 0),
+/* ADDRESSTYPE_ACPI */ OP_TABLE_ENTRY (AML_BYTE_OP, 2, 0, 0),
+/* ADDRESSTYPE_MEMORY */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* ADDRESSTYPE_NVS */ OP_TABLE_ENTRY (AML_BYTE_OP, 3, 0, 0),
+/* ADDRESSTYPE_RESERVED */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* ALIAS */ OP_TABLE_ENTRY (AML_ALIAS_OP, 0, 0, 0),
+/* AND */ OP_TABLE_ENTRY (AML_BIT_AND_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* ARG0 */ OP_TABLE_ENTRY (AML_ARG0, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* ARG1 */ OP_TABLE_ENTRY (AML_ARG1, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* ARG2 */ OP_TABLE_ENTRY (AML_ARG2, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* ARG3 */ OP_TABLE_ENTRY (AML_ARG3, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* ARG4 */ OP_TABLE_ENTRY (AML_ARG4, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* ARG5 */ OP_TABLE_ENTRY (AML_ARG5, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* ARG6 */ OP_TABLE_ENTRY (AML_ARG6, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* BANKFIELD */ OP_TABLE_ENTRY (AML_BANK_FIELD_OP, 0, NODE_AML_PACKAGE, 0),
+/* BREAK */ OP_TABLE_ENTRY (AML_BREAK_OP, 0, 0, 0),
+/* BREAKPOINT */ OP_TABLE_ENTRY (AML_BREAK_POINT_OP, 0, 0, 0),
+/* BUFFER */ OP_TABLE_ENTRY (AML_BUFFER_OP, 0, NODE_AML_PACKAGE, ACPI_BTYPE_BUFFER),
+/* BUSMASTERTYPE_MASTER */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* BUSMASTERTYPE_NOTMASTER */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* BYTECONST */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, 0, 0, ACPI_BTYPE_INTEGER),
+/* CASE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* CONCATENATE */ OP_TABLE_ENTRY (AML_CONCAT_OP, 0, 0, ACPI_BTYPE_COMPUTE_DATA),
+/* CONCATENATERESTEMPLATE */ OP_TABLE_ENTRY (AML_CONCAT_RES_OP, 0, 0, ACPI_BTYPE_BUFFER),
+/* CONDREFOF */ OP_TABLE_ENTRY (AML_COND_REF_OF_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* CONTINUE */ OP_TABLE_ENTRY (AML_CONTINUE_OP, 0, 0, 0),
+/* COPY */ OP_TABLE_ENTRY (AML_COPY_OP, 0, 0, ACPI_BTYPE_DATA_REFERENCE),
+/* CREATEBITFIELD */ OP_TABLE_ENTRY (AML_CREATE_BIT_FIELD_OP, 0, 0, 0),
+/* CREATEBYTEFIELD */ OP_TABLE_ENTRY (AML_CREATE_BYTE_FIELD_OP, 0, 0, 0),
+/* CREATEDWORDFIELD */ OP_TABLE_ENTRY (AML_CREATE_DWORD_FIELD_OP, 0, 0, 0),
+/* CREATEFIELD */ OP_TABLE_ENTRY (AML_CREATE_FIELD_OP, 0, 0, 0),
+/* CREATEQWORDFIELD */ OP_TABLE_ENTRY (AML_CREATE_QWORD_FIELD_OP, 0, 0, 0),
+/* CREATEWORDFIELD */ OP_TABLE_ENTRY (AML_CREATE_WORD_FIELD_OP, 0, 0, 0),
+/* DATATABLEREGION */ OP_TABLE_ENTRY (AML_DATA_REGION_OP, 0, 0, 0),
+/* DEBUG */ OP_TABLE_ENTRY (AML_DEBUG_OP, 0, 0, ACPI_BTYPE_DEBUG_OBJECT),
+/* DECODETYPE_POS */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* DECODETYPE_SUB */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* DECREMENT */ OP_TABLE_ENTRY (AML_DECREMENT_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* DEFAULT */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* DEFAULT_ARG */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* DEFINITIONBLOCK */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* DEREFOF */ OP_TABLE_ENTRY (AML_DEREF_OF_OP, 0, 0, ACPI_BTYPE_DATA_REFERENCE | ACPI_BTYPE_STRING),
+/* DEVICE */ OP_TABLE_ENTRY (AML_DEVICE_OP, 0, NODE_AML_PACKAGE, 0),
+/* DIVIDE */ OP_TABLE_ENTRY (AML_DIVIDE_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* DMA */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* DMATYPE_A */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* DMATYPE_COMPATIBILITY */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* DMATYPE_B */ OP_TABLE_ENTRY (AML_BYTE_OP, 2, 0, 0),
+/* DMATYPE_F */ OP_TABLE_ENTRY (AML_BYTE_OP, 3, 0, 0),
+/* DWORDCONST */ OP_TABLE_ENTRY (AML_RAW_DATA_DWORD, 0, 0, ACPI_BTYPE_INTEGER),
+/* DWORDIO */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* DWORDMEMORY */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* DWORDSPACE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* EISAID */ OP_TABLE_ENTRY (AML_DWORD_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* ELSE */ OP_TABLE_ENTRY (AML_ELSE_OP, 0, NODE_AML_PACKAGE, 0),
+/* ELSEIF */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, NODE_AML_PACKAGE, 0),
+/* ENDDEPENDENTFN */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* ENDTAG */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* ERRORNODE */ OP_TABLE_ENTRY (AML_NOOP_OP, 0, 0, 0),
+/* EVENT */ OP_TABLE_ENTRY (AML_EVENT_OP, 0, 0, 0),
+/* EXTENDEDIO */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* EXTENDEDMEMORY */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* EXTENDEDSPACE */ OP_TABLE_ENTRY (AML_RAW_DATA_QWORD, 0, 0, ACPI_BTYPE_INTEGER),
+/* EXTERNAL */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* FATAL */ OP_TABLE_ENTRY (AML_FATAL_OP, 0, 0, 0),
+/* FIELD */ OP_TABLE_ENTRY (AML_FIELD_OP, 0, NODE_AML_PACKAGE, 0),
+/* FINDSETLEFTBIT */ OP_TABLE_ENTRY (AML_FIND_SET_LEFT_BIT_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* FINDSETRIGHTBIT */ OP_TABLE_ENTRY (AML_FIND_SET_RIGHT_BIT_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* FIXEDIO */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* FROMBCD */ OP_TABLE_ENTRY (AML_FROM_BCD_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* FUNCTION */ OP_TABLE_ENTRY (AML_METHOD_OP, 0, NODE_AML_PACKAGE, 0),
+/* IF */ OP_TABLE_ENTRY (AML_IF_OP, 0, NODE_AML_PACKAGE, 0),
+/* INCLUDE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* INCLUDE_CSTYLE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* INCLUDE_END */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* INCREMENT */ OP_TABLE_ENTRY (AML_INCREMENT_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* INDEX */ OP_TABLE_ENTRY (AML_INDEX_OP, 0, 0, ACPI_BTYPE_REFERENCE),
+/* INDEXFIELD */ OP_TABLE_ENTRY (AML_INDEX_FIELD_OP, 0, NODE_AML_PACKAGE, 0),
+/* INTEGER */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* INTERRUPT */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* INTLEVEL_ACTIVEHIGH */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* INTLEVEL_ACTIVELOW */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* INTTYPE_EDGE */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* INTTYPE_LEVEL */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* IO */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* IODECODETYPE_10 */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* IODECODETYPE_16 */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* IRQ */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* IRQNOFLAGS */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* LAND */ OP_TABLE_ENTRY (AML_LAND_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* LEQUAL */ OP_TABLE_ENTRY (AML_LEQUAL_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* LGREATER */ OP_TABLE_ENTRY (AML_LGREATER_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* LGREATEREQUAL */ OP_TABLE_ENTRY (AML_LGREATEREQUAL_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* LINE */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* LLESS */ OP_TABLE_ENTRY (AML_LLESS_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* LLESSEQUAL */ OP_TABLE_ENTRY (AML_LLESSEQUAL_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* LNOT */ OP_TABLE_ENTRY (AML_LNOT_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* LNOTEQUAL */ OP_TABLE_ENTRY (AML_LNOTEQUAL_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* LOAD */ OP_TABLE_ENTRY (AML_LOAD_OP, 0, 0, 0),
+/* LOADTABLE */ OP_TABLE_ENTRY (AML_LOAD_TABLE_OP, 0, 0, ACPI_BTYPE_DDB_HANDLE),
+/* LOCAL0 */ OP_TABLE_ENTRY (AML_LOCAL0, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* LOCAL1 */ OP_TABLE_ENTRY (AML_LOCAL1, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* LOCAL2 */ OP_TABLE_ENTRY (AML_LOCAL2, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* LOCAL3 */ OP_TABLE_ENTRY (AML_LOCAL3, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* LOCAL4 */ OP_TABLE_ENTRY (AML_LOCAL4, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* LOCAL5 */ OP_TABLE_ENTRY (AML_LOCAL5, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* LOCAL6 */ OP_TABLE_ENTRY (AML_LOCAL6, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* LOCAL7 */ OP_TABLE_ENTRY (AML_LOCAL7, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* LOCKRULE_LOCK */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_LOCK_ALWAYS, 0, 0),
+/* LOCKRULE_NOLOCK */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_LOCK_NEVER, 0, 0),
+/* LOR */ OP_TABLE_ENTRY (AML_LOR_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* MATCH */ OP_TABLE_ENTRY (AML_MATCH_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* MATCHTYPE_MEQ */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, MATCH_MEQ, 0, ACPI_BTYPE_INTEGER),
+/* MATCHTYPE_MGE */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, MATCH_MGE, 0, ACPI_BTYPE_INTEGER),
+/* MATCHTYPE_MGT */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, MATCH_MGT, 0, ACPI_BTYPE_INTEGER),
+/* MATCHTYPE_MLE */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, MATCH_MLE, 0, ACPI_BTYPE_INTEGER),
+/* MATCHTYPE_MLT */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, MATCH_MLT, 0, ACPI_BTYPE_INTEGER),
+/* MATCHTYPE_MTR */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, MATCH_MTR, 0, ACPI_BTYPE_INTEGER),
+/* MAXTYPE_FIXED */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* MAXTYPE_NOTFIXED */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* MEMORY24 */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* MEMORY32 */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* MEMORY32FIXED */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* MEMTYPE_CACHEABLE */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* MEMTYPE_NONCACHEABLE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* MEMTYPE_PREFETCHABLE */ OP_TABLE_ENTRY (AML_BYTE_OP, 3, 0, 0),
+/* MEMTYPE_WRITECOMBINING */ OP_TABLE_ENTRY (AML_BYTE_OP, 2, 0, 0),
+/* METHOD */ OP_TABLE_ENTRY (AML_METHOD_OP, 0, NODE_AML_PACKAGE, 0),
+/* METHODCALL */ OP_TABLE_ENTRY (AML_INT_METHODCALL_OP, 0, 0, ACPI_BTYPE_OBJECTS_AND_REFS),
+/* MID */ OP_TABLE_ENTRY (AML_MID_OP, 0, 0, ACPI_BTYPE_STRING | ACPI_BTYPE_BUFFER),
+/* MINTYPE_FIXED */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* MINTYPE_NOTFIXED */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* MOD */ OP_TABLE_ENTRY (AML_MOD_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* MULTIPLY */ OP_TABLE_ENTRY (AML_MULTIPLY_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* MUTEX */ OP_TABLE_ENTRY (AML_MUTEX_OP, 0, 0, 0),
+/* NAME */ OP_TABLE_ENTRY (AML_NAME_OP, 0, 0, 0),
+/* NAMESEG */ OP_TABLE_ENTRY (AML_INT_NAMEPATH_OP, 0, 0, 0),
+/* NAMESTRING */ OP_TABLE_ENTRY (AML_INT_NAMEPATH_OP, 0, 0, 0),
+/* NAND */ OP_TABLE_ENTRY (AML_BIT_NAND_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* NOOP */ OP_TABLE_ENTRY (AML_NOOP_OP, 0, 0, 0),
+/* NOR */ OP_TABLE_ENTRY (AML_BIT_NOR_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* NOT */ OP_TABLE_ENTRY (AML_BIT_NOT_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* NOTIFY */ OP_TABLE_ENTRY (AML_NOTIFY_OP, 0, 0, 0),
+/* OBJECTTYPE */ OP_TABLE_ENTRY (AML_TYPE_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* OBJECTTYPE_BFF */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_BUFFER_FIELD, 0, 0),
+/* OBJECTTYPE_BUF */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_BUFFER, 0, 0),
+/* OBJECTTYPE_DDB */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_DDB_HANDLE, 0, 0),
+/* OBJECTTYPE_DEV */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_DEVICE, 0, 0),
+/* OBJECTTYPE_EVT */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_EVENT, 0, 0),
+/* OBJECTTYPE_FLD */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_FIELD_UNIT, 0, 0),
+/* OBJECTTYPE_INT */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_INTEGER, 0, 0),
+/* OBJECTTYPE_MTH */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_METHOD, 0, 0),
+/* OBJECTTYPE_MTX */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_MUTEX, 0, 0),
+/* OBJECTTYPE_OPR */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_REGION, 0, 0),
+/* OBJECTTYPE_PKG */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_PACKAGE, 0, 0),
+/* OBJECTTYPE_POW */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_POWER, 0, 0),
+/* OBJECTTYPE_PRO */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_PROCESSOR, 0, 0),
+/* OBJECTTYPE_STR */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_STRING, 0, 0),
+/* OBJECTTYPE_THZ */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_THERMAL, 0, 0),
+/* OBJECTTYPE_UNK */ OP_TABLE_ENTRY (AML_BYTE_OP, ACPI_TYPE_ANY, 0, 0),
+/* OFFSET */ OP_TABLE_ENTRY (AML_INT_RESERVEDFIELD_OP, 0, 0, 0),
+/* ONE */ OP_TABLE_ENTRY (AML_ONE_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* ONES */ OP_TABLE_ENTRY (AML_ONES_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* OPERATIONREGION */ OP_TABLE_ENTRY (AML_REGION_OP, 0, 0, 0),
+/* OR */ OP_TABLE_ENTRY (AML_BIT_OR_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* PACKAGE */ OP_TABLE_ENTRY (AML_PACKAGE_OP, 0, NODE_AML_PACKAGE, ACPI_BTYPE_PACKAGE),
+/* PACKAGEP_LENGTH */ OP_TABLE_ENTRY (AML_PACKAGE_LENGTH, 0, NODE_AML_PACKAGE, 0),
+/* POWERRESOURCE */ OP_TABLE_ENTRY (AML_POWER_RES_OP, 0, NODE_AML_PACKAGE, 0),
+/* PROCESSOR */ OP_TABLE_ENTRY (AML_PROCESSOR_OP, 0, NODE_AML_PACKAGE, 0),
+/* QWORDCONST */ OP_TABLE_ENTRY (AML_RAW_DATA_QWORD, 0, 0, ACPI_BTYPE_INTEGER),
+/* QWORDIO */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* QWORDMEMORY */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* QWORDSPACE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* RANGE_TYPE_ENTIRE */ OP_TABLE_ENTRY (AML_BYTE_OP, 3, 0, 0),
+/* RANGE_TYPE_ISAONLY */ OP_TABLE_ENTRY (AML_BYTE_OP, 2, 0, 0),
+/* RANGE_TYPE_NONISAONLY */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* RAW_DATA */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* READWRITETYPE_BOTH */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* READWRITETYPE_READONLY */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* REFOF */ OP_TABLE_ENTRY (AML_REF_OF_OP, 0, 0, ACPI_BTYPE_REFERENCE),
+/* REGIONSPACE_CMOS */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, REGION_CMOS, 0, 0),
+/* REGIONSPACE_EC */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, REGION_EC, 0, 0),
+/* REGIONSPACE_IO */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, REGION_IO, 0, 0),
+/* REGIONSPACE_MEM */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, REGION_MEMORY, 0, 0),
+/* REGIONSPACE_PCI */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, REGION_PCI_CONFIG, 0, 0),
+/* REGIONSPACE_PCIBAR */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, REGION_PCI_BAR, 0, 0),
+/* REGIONSPACE_SMBUS */ OP_TABLE_ENTRY (AML_RAW_DATA_BYTE, REGION_SMBUS, 0, 0),
+/* REGISTER */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* RELEASE */ OP_TABLE_ENTRY (AML_RELEASE_OP, 0, 0, 0),
+/* RESERVED_BYTES */ OP_TABLE_ENTRY (AML_INT_RESERVEDFIELD_OP, 0, 0, 0),
+/* RESET */ OP_TABLE_ENTRY (AML_RESET_OP, 0, 0, 0),
+/* RESOURCETEMPLATE */ OP_TABLE_ENTRY (AML_BUFFER_OP, 0, 0, ACPI_BTYPE_BUFFER),
+/* RESOURCETYPE_CONSUMER */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* RESOURCETYPE_PRODUCER */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* RETURN */ OP_TABLE_ENTRY (AML_RETURN_OP, 0, 0, 0),
+/* REVISION */ OP_TABLE_ENTRY (AML_REVISION_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* SCOPE */ OP_TABLE_ENTRY (AML_SCOPE_OP, 0, NODE_AML_PACKAGE, 0),
+/* SERIALIZERULE_NOTSERIAL */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* SERIALIZERULE_SERIAL */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* SHARETYPE_EXCLUSIVE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* SHARETYPE_SHARED */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* SHIFTLEFT */ OP_TABLE_ENTRY (AML_SHIFT_LEFT_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* SHIFTRIGHT */ OP_TABLE_ENTRY (AML_SHIFT_RIGHT_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* SIGNAL */ OP_TABLE_ENTRY (AML_SIGNAL_OP, 0, 0, 0),
+/* SIZEOF */ OP_TABLE_ENTRY (AML_SIZE_OF_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* SLEEP */ OP_TABLE_ENTRY (AML_SLEEP_OP, 0, 0, 0),
+/* STALL */ OP_TABLE_ENTRY (AML_STALL_OP, 0, 0, 0),
+/* STARTDEPENDENTFN */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* STARTDEPENDENTFN_NOPRI */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* STORE */ OP_TABLE_ENTRY (AML_STORE_OP, 0, 0, ACPI_BTYPE_DATA_REFERENCE),
+/* STRING_LITERAL */ OP_TABLE_ENTRY (AML_STRING_OP, 0, 0, ACPI_BTYPE_STRING),
+/* SUBTRACT */ OP_TABLE_ENTRY (AML_SUBTRACT_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* SWITCH */ OP_TABLE_ENTRY (AML_DEFAULT_ARG_OP, 0, 0, 0),
+/* THERMALZONE */ OP_TABLE_ENTRY (AML_THERMAL_ZONE_OP, 0, NODE_AML_PACKAGE, 0),
+/* TIMER */ OP_TABLE_ENTRY (AML_TIMER_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* TOBCD */ OP_TABLE_ENTRY (AML_TO_BCD_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* TOBUFFER */ OP_TABLE_ENTRY (AML_TO_BUFFER_OP, 0, 0, ACPI_BTYPE_BUFFER),
+/* TODECIMALSTRING */ OP_TABLE_ENTRY (AML_TO_DECSTRING_OP, 0, 0, ACPI_BTYPE_STRING),
+/* TOHEXSTRING */ OP_TABLE_ENTRY (AML_TO_HEXSTRING_OP, 0, 0, ACPI_BTYPE_STRING),
+/* TOINTEGER */ OP_TABLE_ENTRY (AML_TO_INTEGER_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* TOSTRING */ OP_TABLE_ENTRY (AML_TO_STRING_OP, 0, 0, ACPI_BTYPE_STRING),
+/* TOUUID */ OP_TABLE_ENTRY (AML_DWORD_OP, 0, NODE_AML_PACKAGE, ACPI_BTYPE_INTEGER),
+/* TRANSLATIONTYPE_DENSE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* TRANSLATIONTYPE_SPARSE */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* TYPE_STATIC */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* TYPE_TRANSLATION */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* UNICODE */ OP_TABLE_ENTRY (AML_BUFFER_OP, 0, NODE_AML_PACKAGE, 0),
+/* UNLOAD */ OP_TABLE_ENTRY (AML_UNLOAD_OP, 0, 0, 0),
+/* UPDATERULE_ONES */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_UPDATE_WRITE_AS_ONES, 0, 0),
+/* UPDATERULE_PRESERVE */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_UPDATE_PRESERVE, 0, 0),
+/* UPDATERULE_ZEROS */ OP_TABLE_ENTRY (AML_BYTE_OP, AML_FIELD_UPDATE_WRITE_AS_ZEROS,0, 0),
+/* VAR_PACKAGE */ OP_TABLE_ENTRY (AML_VAR_PACKAGE_OP, 0, NODE_AML_PACKAGE, ACPI_BTYPE_PACKAGE),
+/* VENDORLONG */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* VENDORSHORT */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* WAIT */ OP_TABLE_ENTRY (AML_WAIT_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* WHILE */ OP_TABLE_ENTRY (AML_WHILE_OP, 0, NODE_AML_PACKAGE, 0),
+/* WORDBUSNUMBER */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* WORDCONST */ OP_TABLE_ENTRY (AML_RAW_DATA_WORD, 0, 0, ACPI_BTYPE_INTEGER),
+/* WORDIO */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* WORDSPACE */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* XFERTYPE_8 */ OP_TABLE_ENTRY (AML_BYTE_OP, 0, 0, 0),
+/* XFERTYPE_8_16 */ OP_TABLE_ENTRY (AML_BYTE_OP, 1, 0, 0),
+/* XFERTYPE_16 */ OP_TABLE_ENTRY (AML_BYTE_OP, 2, 0, 0),
+/* XOR */ OP_TABLE_ENTRY (AML_BIT_XOR_OP, 0, 0, ACPI_BTYPE_INTEGER),
+/* ZERO */ OP_TABLE_ENTRY (AML_ZERO_OP, 0, 0, ACPI_BTYPE_INTEGER),
+
+/*! [End] no source code translation !*/
+
+};
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslopcodes.c b/sys/contrib/dev/acpica/compiler/aslopcodes.c
new file mode 100644
index 0000000..ae91dc8
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslopcodes.c
@@ -0,0 +1,812 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslopcode - AML opcode generation
+ * $Revision: 1.74 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+#include <contrib/dev/acpica/amlcode.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslopcodes")
+
+
+/* UUID support */
+
+static UINT8 OpcMapToUUID[16] =
+{
+ 6,4,2,0,11,9,16,14,19,21,24,26,28,30,32,34
+};
+
+/* Local prototypes */
+
+static void
+OpcDoAccessAs (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpcDoUnicode (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpcDoEisaId (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpcDoUuId (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcAmlOpcodeUpdateWalk
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Opcode update walk, ascending callback
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+OpcAmlOpcodeUpdateWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+
+ /*
+ * Handle the Package() case where the actual opcode cannot be determined
+ * until the PackageLength operand has been folded and minimized.
+ * (PackageOp versus VarPackageOp)
+ *
+ * This is (as of ACPI 3.0) the only case where the AML opcode can change
+ * based upon the value of a parameter.
+ *
+ * The parser always inserts a VarPackage opcode, which can possibly be
+ * optimized to a Package opcode.
+ */
+ if (Op->Asl.ParseOpcode == PARSEOP_VAR_PACKAGE)
+ {
+ OpnDoPackage (Op);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcAmlOpcodeWalk
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Parse tree walk to generate both the AML opcodes and the AML
+ * operands.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+OpcAmlOpcodeWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+
+ TotalParseNodes++;
+
+ OpcGenerateAmlOpcode (Op);
+ OpnGenerateAmlOperands (Op);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcGetIntegerWidth
+ *
+ * PARAMETERS: Op - DEFINITION BLOCK op
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Extract integer width from the table revision
+ *
+ ******************************************************************************/
+
+void
+OpcGetIntegerWidth (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Child;
+
+
+ if (!Op)
+ {
+ return;
+ }
+
+ if (Gbl_RevisionOverride)
+ {
+ AcpiUtSetIntegerWidth (Gbl_RevisionOverride);
+ }
+ else
+ {
+ Child = Op->Asl.Child;
+ Child = Child->Asl.Next;
+ Child = Child->Asl.Next;
+
+ /* Use the revision to set the integer width */
+
+ AcpiUtSetIntegerWidth ((UINT8) Child->Asl.Value.Integer);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcSetOptimalIntegerSize
+ *
+ * PARAMETERS: Op - A parse tree node
+ *
+ * RETURN: Integer width, in bytes. Also sets the node AML opcode to the
+ * optimal integer AML prefix opcode.
+ *
+ * DESCRIPTION: Determine the optimal AML encoding of an integer. All leading
+ * zeros can be truncated to squeeze the integer into the
+ * minimal number of AML bytes.
+ *
+ ******************************************************************************/
+
+UINT32
+OpcSetOptimalIntegerSize (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+#if 0
+ /*
+ * TBD: - we don't want to optimize integers in the block header, but the
+ * code below does not work correctly.
+ */
+ if (Op->Asl.Parent &&
+ Op->Asl.Parent->Asl.Parent &&
+ (Op->Asl.Parent->Asl.Parent->Asl.ParseOpcode == PARSEOP_DEFINITIONBLOCK))
+ {
+ return 0;
+ }
+#endif
+
+ /*
+ * Check for the special AML integers first - Zero, One, Ones.
+ * These are single-byte opcodes that are the smallest possible
+ * representation of an integer.
+ *
+ * This optimization is optional.
+ */
+ if (Gbl_IntegerOptimizationFlag)
+ {
+ switch (Op->Asl.Value.Integer)
+ {
+ case 0:
+
+ Op->Asl.AmlOpcode = AML_ZERO_OP;
+ AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
+ Op, "Zero");
+ return 1;
+
+ case 1:
+
+ Op->Asl.AmlOpcode = AML_ONE_OP;
+ AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
+ Op, "One");
+ return 1;
+
+ case ACPI_UINT32_MAX:
+
+ /* Check for table integer width (32 or 64) */
+
+ if (AcpiGbl_IntegerByteWidth == 4)
+ {
+ Op->Asl.AmlOpcode = AML_ONES_OP;
+ AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
+ Op, "Ones");
+ return 1;
+ }
+ break;
+
+ case ACPI_INTEGER_MAX:
+
+ /* Check for table integer width (32 or 64) */
+
+ if (AcpiGbl_IntegerByteWidth == 8)
+ {
+ Op->Asl.AmlOpcode = AML_ONES_OP;
+ AslError (ASL_OPTIMIZATION, ASL_MSG_INTEGER_OPTIMIZATION,
+ Op, "Ones");
+ return 1;
+ }
+ break;
+
+ default:
+ break;
+ }
+ }
+
+ /* Find the best fit using the various AML integer prefixes */
+
+ if (Op->Asl.Value.Integer <= ACPI_UINT8_MAX)
+ {
+ Op->Asl.AmlOpcode = AML_BYTE_OP;
+ return 1;
+ }
+ if (Op->Asl.Value.Integer <= ACPI_UINT16_MAX)
+ {
+ Op->Asl.AmlOpcode = AML_WORD_OP;
+ return 2;
+ }
+ if (Op->Asl.Value.Integer <= ACPI_UINT32_MAX)
+ {
+ Op->Asl.AmlOpcode = AML_DWORD_OP;
+ return 4;
+ }
+ else
+ {
+ if (AcpiGbl_IntegerByteWidth == 4)
+ {
+ AslError (ASL_WARNING, ASL_MSG_INTEGER_LENGTH,
+ Op, NULL);
+
+ if (!Gbl_IgnoreErrors)
+ {
+ /* Truncate the integer to 32-bit */
+ Op->Asl.AmlOpcode = AML_DWORD_OP;
+ return 4;
+ }
+ }
+
+ Op->Asl.AmlOpcode = AML_QWORD_OP;
+ return 8;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcDoAccessAs
+ *
+ * PARAMETERS: Op - Parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Implement the ACCESS_AS ASL keyword.
+ *
+ ******************************************************************************/
+
+static void
+OpcDoAccessAs (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ Op->Asl.AmlOpcodeLength = 1;
+ Next = Op->Asl.Child;
+
+ /* First child is the access type */
+
+ Next->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
+ Next->Asl.ParseOpcode = PARSEOP_RAW_DATA;
+
+ /* Second child is the optional access attribute */
+
+ Next = Next->Asl.Next;
+ if (Next->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+ {
+ Next->Asl.Value.Integer = 0;
+ }
+ Next->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
+ Next->Asl.ParseOpcode = PARSEOP_RAW_DATA;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcDoUnicode
+ *
+ * PARAMETERS: Op - Parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Implement the UNICODE ASL "macro". Convert the input string
+ * to a unicode buffer. There is no Unicode AML opcode.
+ *
+ * Note: The Unicode string is 16 bits per character, no leading signature,
+ * with a 16-bit terminating NULL.
+ *
+ ******************************************************************************/
+
+static void
+OpcDoUnicode (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *InitializerOp;
+ UINT32 Length;
+ UINT32 Count;
+ UINT32 i;
+ UINT8 *AsciiString;
+ UINT16 *UnicodeString;
+ ACPI_PARSE_OBJECT *BufferLengthOp;
+
+
+ /* Change op into a buffer object */
+
+ Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;
+ Op->Asl.ParseOpcode = PARSEOP_BUFFER;
+ UtSetParseOpName (Op);
+
+ /* Buffer Length is first, followed by the string */
+
+ BufferLengthOp = Op->Asl.Child;
+ InitializerOp = BufferLengthOp->Asl.Next;
+
+ AsciiString = (UINT8 *) InitializerOp->Asl.Value.String;
+
+ /* Create a new buffer for the Unicode string */
+
+ Count = strlen (InitializerOp->Asl.Value.String) + 1;
+ Length = Count * sizeof (UINT16);
+ UnicodeString = UtLocalCalloc (Length);
+
+ /* Convert to Unicode string (including null terminator) */
+
+ for (i = 0; i < Count; i++)
+ {
+ UnicodeString[i] = (UINT16) AsciiString[i];
+ }
+
+ /*
+ * Just set the buffer size node to be the buffer length, regardless
+ * of whether it was previously an integer or a default_arg placeholder
+ */
+ BufferLengthOp->Asl.ParseOpcode = PARSEOP_INTEGER;
+ BufferLengthOp->Asl.AmlOpcode = AML_DWORD_OP;
+ BufferLengthOp->Asl.Value.Integer = Length;
+ UtSetParseOpName (BufferLengthOp);
+
+ (void) OpcSetOptimalIntegerSize (BufferLengthOp);
+
+ /* The Unicode string is a raw data buffer */
+
+ InitializerOp->Asl.Value.Buffer = (UINT8 *) UnicodeString;
+ InitializerOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER;
+ InitializerOp->Asl.AmlLength = Length;
+ InitializerOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
+ InitializerOp->Asl.Child = NULL;
+ UtSetParseOpName (InitializerOp);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcDoEisaId
+ *
+ * PARAMETERS: Op - Parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Convert a string EISA ID to numeric representation. See the
+ * Pnp BIOS Specification for details. Here is an excerpt:
+ *
+ * A seven character ASCII representation of the product
+ * identifier compressed into a 32-bit identifier. The seven
+ * character ID consists of a three character manufacturer code,
+ * a three character hexadecimal product identifier, and a one
+ * character hexadecimal revision number. The manufacturer code
+ * is a 3 uppercase character code that is compressed into 3 5-bit
+ * values as follows:
+ * 1) Find hex ASCII value for each letter
+ * 2) Subtract 40h from each ASCII value
+ * 3) Retain 5 least signficant bits for each letter by
+ * discarding upper 3 bits because they are always 0.
+ * 4) Compressed code = concatenate 0 and the 3 5-bit values
+ *
+ * The format of the compressed product identifier is as follows:
+ * Byte 0: Bit 7 - Reserved (0)
+ * Bits 6-2: - 1st character of compressed mfg code
+ * Bits 1-0 - Upper 2 bits of 2nd character of mfg code
+ * Byte 1: Bits 7-5 - Lower 3 bits of 2nd character of mfg code
+ * Bits 4-0 - 3rd character of mfg code
+ * Byte 2: Bits 7-4 - 1st hex digit of product number
+ * Bits 3-0 - 2nd hex digit of product number
+ * Byte 3: Bits 7-4 - 3st hex digit of product number
+ * Bits 3-0 - Hex digit of the revision number
+ *
+ ******************************************************************************/
+
+static void
+OpcDoEisaId (
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT32 EisaId = 0;
+ UINT32 BigEndianId;
+ char *InString;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_NATIVE_UINT i;
+
+
+ InString = (char *) Op->Asl.Value.String;
+
+ /*
+ * The EISAID string must be exactly 7 characters and of the form
+ * "UUUXXXX" -- 3 uppercase letters and 4 hex digits (e.g., "PNP0001")
+ */
+ if (ACPI_STRLEN (InString) != 7)
+ {
+ Status = AE_BAD_PARAMETER;
+ }
+ else
+ {
+ /* Check all 7 characters for correct format */
+
+ for (i = 0; i < 7; i++)
+ {
+ /* First 3 characters must be uppercase letters */
+
+ if (i < 3)
+ {
+ if (!isupper (InString[i]))
+ {
+ Status = AE_BAD_PARAMETER;
+ }
+ }
+
+ /* Last 4 characters must be hex digits */
+
+ else if (!isxdigit (InString[i]))
+ {
+ Status = AE_BAD_PARAMETER;
+ }
+ }
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ AslError (ASL_ERROR, ASL_MSG_INVALID_EISAID, Op, Op->Asl.Value.String);
+ }
+ else
+ {
+ /* Create ID big-endian first (bits are contiguous) */
+
+ BigEndianId =
+ (UINT32) (InString[0] - 0x40) << 26 |
+ (UINT32) (InString[1] - 0x40) << 21 |
+ (UINT32) (InString[2] - 0x40) << 16 |
+
+ (UtHexCharToValue (InString[3])) << 12 |
+ (UtHexCharToValue (InString[4])) << 8 |
+ (UtHexCharToValue (InString[5])) << 4 |
+ UtHexCharToValue (InString[6]);
+
+ /* Swap to little-endian to get final ID (see function header) */
+
+ EisaId = AcpiUtDwordByteSwap (BigEndianId);
+ }
+
+ /*
+ * Morph the Op into an integer, regardless of whether there
+ * was an error in the EISAID string
+ */
+ Op->Asl.Value.Integer = EisaId;
+
+ Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;
+ Op->Asl.ParseOpcode = PARSEOP_INTEGER;
+ (void) OpcSetOptimalIntegerSize (Op);
+
+ /* Op is now an integer */
+
+ UtSetParseOpName (Op);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcDoUiId
+ *
+ * PARAMETERS: Op - Parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Convert UUID string to 16-byte buffer
+ *
+ ******************************************************************************/
+
+static void
+OpcDoUuId (
+ ACPI_PARSE_OBJECT *Op)
+{
+ char *InString;
+ char *Buffer;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_NATIVE_UINT i;
+ ACPI_PARSE_OBJECT *NewOp;
+
+
+ InString = (char *) Op->Asl.Value.String;
+
+ if (ACPI_STRLEN (InString) != 36)
+ {
+ Status = AE_BAD_PARAMETER;
+ }
+ else
+ {
+ /* Check all 36 characters for correct format */
+
+ for (i = 0; i < 36; i++)
+ {
+ if ((i == 8) || (i == 13) || (i == 18) || (i == 23))
+ {
+ if (InString[i] != '-')
+ {
+ Status = AE_BAD_PARAMETER;
+ }
+ }
+ else
+ {
+ if (!isxdigit (InString[i]))
+ {
+ Status = AE_BAD_PARAMETER;
+ }
+ }
+ }
+ }
+
+ Buffer = UtLocalCalloc (16);
+
+ if (ACPI_FAILURE (Status))
+ {
+ AslError (ASL_ERROR, ASL_MSG_INVALID_UUID, Op, Op->Asl.Value.String);
+ }
+ else for (i = 0; i < 16; i++)
+ {
+ Buffer[i] = (char) (UtHexCharToValue (InString[OpcMapToUUID[i]]) << 4);
+ Buffer[i] |= (char) UtHexCharToValue (InString[OpcMapToUUID[i] + 1]);
+ }
+
+ /* Change Op to a Buffer */
+
+ Op->Asl.ParseOpcode = PARSEOP_BUFFER;
+ Op->Common.AmlOpcode = AML_BUFFER_OP;
+
+ /* Disable further optimization */
+
+ Op->Asl.CompileFlags &= ~NODE_COMPILE_TIME_CONST;
+ UtSetParseOpName (Op);
+
+ /* Child node is the buffer length */
+
+ NewOp = TrAllocateNode (PARSEOP_INTEGER);
+
+ NewOp->Asl.AmlOpcode = AML_BYTE_OP;
+ NewOp->Asl.Value.Integer = 16;
+ NewOp->Asl.Parent = Op;
+
+ Op->Asl.Child = NewOp;
+ Op = NewOp;
+
+ /* Peer to the child is the raw buffer data */
+
+ NewOp = TrAllocateNode (PARSEOP_RAW_DATA);
+ NewOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER;
+ NewOp->Asl.AmlLength = 16;
+ NewOp->Asl.Value.String = (char *) Buffer;
+ NewOp->Asl.Parent = Op->Asl.Parent;
+
+ Op->Asl.Next = NewOp;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpcGenerateAmlOpcode
+ *
+ * PARAMETERS: Op - Parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Generate the AML opcode associated with the node and its
+ * parse (lex/flex) keyword opcode. Essentially implements
+ * a mapping between the parse opcodes and the actual AML opcodes.
+ *
+ ******************************************************************************/
+
+void
+OpcGenerateAmlOpcode (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ UINT16 Index;
+
+
+ Index = (UINT16) (Op->Asl.ParseOpcode - ASL_PARSE_OPCODE_BASE);
+
+ Op->Asl.AmlOpcode = AslKeywordMapping[Index].AmlOpcode;
+ Op->Asl.AcpiBtype = AslKeywordMapping[Index].AcpiBtype;
+ Op->Asl.CompileFlags |= AslKeywordMapping[Index].Flags;
+
+ if (!Op->Asl.Value.Integer)
+ {
+ Op->Asl.Value.Integer = AslKeywordMapping[Index].Value;
+ }
+
+ /* Special handling for some opcodes */
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_INTEGER:
+ /*
+ * Set the opcode based on the size of the integer
+ */
+ (void) OpcSetOptimalIntegerSize (Op);
+ break;
+
+ case PARSEOP_OFFSET:
+
+ Op->Asl.AmlOpcodeLength = 1;
+ break;
+
+ case PARSEOP_ACCESSAS:
+
+ OpcDoAccessAs (Op);
+ break;
+
+ case PARSEOP_EISAID:
+
+ OpcDoEisaId (Op);
+ break;
+
+ case PARSEOP_TOUUID:
+
+ OpcDoUuId (Op);
+ break;
+
+ case PARSEOP_UNICODE:
+
+ OpcDoUnicode (Op);
+ break;
+
+ case PARSEOP_INCLUDE:
+
+ Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ Gbl_HasIncludeFiles = TRUE;
+ break;
+
+ case PARSEOP_EXTERNAL:
+
+ Op->Asl.Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ Op->Asl.Child->Asl.Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ break;
+
+ default:
+ /* Nothing to do for other opcodes */
+ break;
+ }
+
+ return;
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/asloperands.c b/sys/contrib/dev/acpica/compiler/asloperands.c
new file mode 100644
index 0000000..8f4500e
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/asloperands.c
@@ -0,0 +1,1230 @@
+
+/******************************************************************************
+ *
+ * Module Name: asloperands - AML operand processing
+ * $Revision: 1.61 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+#include <contrib/dev/acpica/amlcode.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("asloperands")
+
+/* Local prototypes */
+
+static void
+OpnDoField (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpnDoBankField (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpnDoBuffer (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpnDoDefinitionBlock (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpnDoFieldCommon (
+ ACPI_PARSE_OBJECT *FieldOp,
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpnDoIndexField (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpnDoLoadTable (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpnDoMethod (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpnDoMutex (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpnDoRegion (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+OpnAttachNameToNode (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoMutex
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Construct the operands for the MUTEX ASL keyword.
+ *
+ ******************************************************************************/
+
+static void
+OpnDoMutex (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ Next = Op->Asl.Child;
+ Next = Next->Asl.Next;
+
+ if (Next->Asl.Value.Integer > 15)
+ {
+ AslError (ASL_ERROR, ASL_MSG_SYNC_LEVEL, Next, NULL);
+ }
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoMethod
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Construct the operands for the METHOD ASL keyword.
+ *
+ ******************************************************************************/
+
+static void
+OpnDoMethod (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+ /* Optional arguments for this opcode with defaults */
+
+ UINT8 NumArgs = 0;
+ UINT8 Serialized = 0;
+ UINT8 Concurrency = 0;
+ UINT8 MethodFlags;
+
+
+ /* Opcode and package length first */
+ /* Method name */
+
+ Next = Op->Asl.Child;
+
+ /* Num args */
+
+ Next = Next->Asl.Next;
+ if (Next->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ NumArgs = (UINT8) Next->Asl.Value.Integer;
+ Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ }
+
+ /* Serialized Flag */
+
+ Next = Next->Asl.Next;
+ if (Next->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ Serialized = (UINT8) Next->Asl.Value.Integer;
+ Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ }
+
+ /* Concurrency value (valid values are 0-15) */
+
+ Next = Next->Asl.Next;
+ if (Next->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ if (Next->Asl.Value.Integer > 15)
+ {
+ AslError (ASL_ERROR, ASL_MSG_SYNC_LEVEL, Next, NULL);
+ }
+ Concurrency = (UINT8) Next->Asl.Value.Integer;
+ }
+
+ /* Put the bits in their proper places */
+
+ MethodFlags = (UINT8) ((NumArgs & 0x7) |
+ ((Serialized & 0x1) << 3) |
+ ((Concurrency & 0xF) << 4));
+
+ /* Use the last node for the combined flags byte */
+
+ Next->Asl.Value.Integer = MethodFlags;
+ Next->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
+ Next->Asl.AmlLength = 1;
+ Next->Asl.ParseOpcode = PARSEOP_RAW_DATA;
+
+ /* Save the arg count in the first node */
+
+ Op->Asl.Extra = NumArgs;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoFieldCommon
+ *
+ * PARAMETERS: FieldOp - Node for an ASL field
+ * Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Construct the AML operands for the various field keywords,
+ * FIELD, BANKFIELD, INDEXFIELD
+ *
+ ******************************************************************************/
+
+static void
+OpnDoFieldCommon (
+ ACPI_PARSE_OBJECT *FieldOp,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+ ACPI_PARSE_OBJECT *PkgLengthNode;
+ UINT32 CurrentBitOffset;
+ UINT32 NewBitOffset;
+ UINT8 AccessType;
+ UINT8 LockRule;
+ UINT8 UpdateRule;
+ UINT8 FieldFlags;
+ UINT32 MinimumLength;
+
+
+ /* AccessType -- not optional, so no need to check for DEFAULT_ARG */
+
+ AccessType = (UINT8) Op->Asl.Value.Integer;
+ Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+
+ /* Set the access type in the parent (field) node for use later */
+
+ FieldOp->Asl.Value.Integer = AccessType;
+
+ /* LockRule -- not optional, so no need to check for DEFAULT_ARG */
+
+ Next = Op->Asl.Next;
+ LockRule = (UINT8) Next->Asl.Value.Integer;
+ Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+
+ /* UpdateRule -- not optional, so no need to check for DEFAULT_ARG */
+
+ Next = Next->Asl.Next;
+ UpdateRule = (UINT8) Next->Asl.Value.Integer;
+
+ /*
+ * Generate the flags byte. The various fields are already
+ * in the right bit position via translation from the
+ * keywords by the parser.
+ */
+ FieldFlags = (UINT8) (AccessType | LockRule | UpdateRule);
+
+ /* Use the previous node to be the FieldFlags node */
+
+ /* Set the node to RAW_DATA */
+
+ Next->Asl.Value.Integer = FieldFlags;
+ Next->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
+ Next->Asl.AmlLength = 1;
+ Next->Asl.ParseOpcode = PARSEOP_RAW_DATA;
+
+ /* Process the FieldUnitList */
+
+ Next = Next->Asl.Next;
+ CurrentBitOffset = 0;
+
+ while (Next)
+ {
+ /* Save the offset of this field unit */
+
+ Next->Asl.ExtraValue = CurrentBitOffset;
+
+ switch (Next->Asl.ParseOpcode)
+ {
+ case PARSEOP_ACCESSAS:
+
+ PkgLengthNode = Next->Asl.Child;
+ AccessType = (UINT8) PkgLengthNode->Asl.Value.Integer;
+
+ /* Nothing additional to do */
+ break;
+
+
+ case PARSEOP_OFFSET:
+
+ /* New offset into the field */
+
+ PkgLengthNode = Next->Asl.Child;
+ NewBitOffset = ((UINT32) PkgLengthNode->Asl.Value.Integer) * 8;
+
+ /*
+ * Examine the specified offset in relation to the
+ * current offset counter.
+ */
+ if (NewBitOffset < CurrentBitOffset)
+ {
+ /*
+ * Not allowed to specify a backwards offset!
+ * Issue error and ignore this node.
+ */
+ AslError (ASL_ERROR, ASL_MSG_BACKWARDS_OFFSET, PkgLengthNode,
+ NULL);
+ Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ PkgLengthNode->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ }
+ else if (NewBitOffset == CurrentBitOffset)
+ {
+ /*
+ * Offset is redundant; we don't need to output an
+ * offset opcode. Just set these nodes to default
+ */
+ Next->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ PkgLengthNode->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ }
+ else
+ {
+ /*
+ * Valid new offset - set the value to be inserted into the AML
+ * and update the offset counter.
+ */
+ PkgLengthNode->Asl.Value.Integer =
+ NewBitOffset - CurrentBitOffset;
+ CurrentBitOffset = NewBitOffset;
+ }
+ break;
+
+
+ case PARSEOP_NAMESEG:
+ case PARSEOP_RESERVED_BYTES:
+
+ /* Named or reserved field entry */
+
+ PkgLengthNode = Next->Asl.Child;
+ NewBitOffset = (UINT32) PkgLengthNode->Asl.Value.Integer;
+ CurrentBitOffset += NewBitOffset;
+
+ /* Save the current AccessAs value for error checking later */
+
+ switch (AccessType)
+ {
+ case AML_FIELD_ACCESS_ANY:
+ case AML_FIELD_ACCESS_BYTE:
+ case AML_FIELD_ACCESS_BUFFER:
+ default:
+ MinimumLength = 8;
+ break;
+
+ case AML_FIELD_ACCESS_WORD:
+ MinimumLength = 16;
+ break;
+
+ case AML_FIELD_ACCESS_DWORD:
+ MinimumLength = 32;
+ break;
+
+ case AML_FIELD_ACCESS_QWORD:
+ MinimumLength = 64;
+ break;
+ }
+
+ PkgLengthNode->Asl.ExtraValue = MinimumLength;
+ break;
+
+ default:
+ /* All supported field opcodes must appear above */
+ break;
+ }
+
+ /* Move on to next entry in the field list */
+
+ Next = Next->Asl.Next;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoField
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Construct the AML operands for the FIELD ASL keyword
+ *
+ ******************************************************************************/
+
+static void
+OpnDoField (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ /* Opcode is parent node */
+ /* First child is field name */
+
+ Next = Op->Asl.Child;
+
+ /* Second child is the AccessType */
+
+ OpnDoFieldCommon (Op, Next->Asl.Next);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoIndexField
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Construct the AML operands for the INDEXFIELD ASL keyword
+ *
+ ******************************************************************************/
+
+static void
+OpnDoIndexField (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ /* Opcode is parent node */
+ /* First child is the index name */
+
+ Next = Op->Asl.Child;
+
+ /* Second child is the data name */
+
+ Next = Next->Asl.Next;
+
+ /* Third child is the AccessType */
+
+ OpnDoFieldCommon (Op, Next->Asl.Next);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoBankField
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Construct the AML operands for the BANKFIELD ASL keyword
+ *
+ ******************************************************************************/
+
+static void
+OpnDoBankField (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ /* Opcode is parent node */
+ /* First child is the region name */
+
+ Next = Op->Asl.Child;
+
+ /* Second child is the bank name */
+
+ Next = Next->Asl.Next;
+
+ /* Third child is the bank value */
+
+ Next = Next->Asl.Next;
+
+ /* Fourth child is the AccessType */
+
+ OpnDoFieldCommon (Op, Next->Asl.Next);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoRegion
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Tries to get the length of the region. Can only do this at
+ * compile time if the length is a constant.
+ *
+ ******************************************************************************/
+
+static void
+OpnDoRegion (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ /* Opcode is parent node */
+ /* First child is the region name */
+
+ Next = Op->Asl.Child;
+
+ /* Second child is the space ID*/
+
+ Next = Next->Asl.Next;
+
+ /* Third child is the region offset */
+
+ Next = Next->Asl.Next;
+
+ /* Fourth child is the region length */
+
+ Next = Next->Asl.Next;
+ if (Next->Asl.ParseOpcode == PARSEOP_INTEGER)
+ {
+ Op->Asl.Value.Integer = Next->Asl.Value.Integer;
+ }
+ else
+ {
+ Op->Asl.Value.Integer = ACPI_INTEGER_MAX;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoBuffer
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Construct the AML operands for the BUFFER ASL keyword. We
+ * build a single raw byte buffer from the initialization nodes,
+ * each parse node contains a buffer byte.
+ *
+ ******************************************************************************/
+
+static void
+OpnDoBuffer (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ACPI_PARSE_OBJECT *BufferLengthOp;
+
+ /* Optional arguments for this opcode with defaults */
+
+ UINT32 BufferLength = 0;
+
+
+ /* Opcode and package length first */
+ /* Buffer Length is next, followed by the initializer list */
+
+ BufferLengthOp = Op->Asl.Child;
+ InitializerOp = BufferLengthOp->Asl.Next;
+
+ /*
+ * If the BufferLength is not an INTEGER or was not specified in the ASL
+ * (DEFAULT_ARG), it is a TermArg that is
+ * evaluated at run-time, and we are therefore finished.
+ */
+ if ((BufferLengthOp->Asl.ParseOpcode != PARSEOP_INTEGER) &&
+ (BufferLengthOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG))
+ {
+ return;
+ }
+
+ /*
+ * We want to count the number of items in the initializer list, because if
+ * it is larger than the buffer length, we will define the buffer size
+ * to be the size of the initializer list (as per the ACPI Specification)
+ */
+ switch (InitializerOp->Asl.ParseOpcode)
+ {
+ case PARSEOP_INTEGER:
+ case PARSEOP_BYTECONST:
+ case PARSEOP_WORDCONST:
+ case PARSEOP_DWORDCONST:
+
+ /* The peer list contains the byte list (if any...) */
+
+ while (InitializerOp)
+ {
+ /* For buffers, this is a list of raw bytes */
+
+ InitializerOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
+ InitializerOp->Asl.AmlLength = 1;
+ InitializerOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
+
+ BufferLength++;
+ InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
+ }
+ break;
+
+
+ case PARSEOP_STRING_LITERAL:
+
+ /*
+ * Only one initializer, the string. Buffer must be big enough to hold
+ * the string plus the null termination byte
+ */
+ BufferLength = strlen (InitializerOp->Asl.Value.String) + 1;
+
+ InitializerOp->Asl.AmlOpcode = AML_RAW_DATA_BUFFER;
+ InitializerOp->Asl.AmlLength = BufferLength;
+ InitializerOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
+ break;
+
+
+ case PARSEOP_RAW_DATA:
+
+ /* Buffer nodes are already initialized (e.g. Unicode operator) */
+ return;
+
+
+ case PARSEOP_DEFAULT_ARG:
+ break;
+
+
+ default:
+ AslError (ASL_ERROR, ASL_MSG_INVALID_OPERAND, InitializerOp,
+ "Unknown buffer initializer opcode");
+ printf ("Unknown buffer initializer opcode [%s]\n",
+ UtGetOpName (InitializerOp->Asl.ParseOpcode));
+ return;
+ }
+
+ /* Check if initializer list is longer than the buffer length */
+
+ if (BufferLengthOp->Asl.Value.Integer > BufferLength)
+ {
+ BufferLength = (UINT32) BufferLengthOp->Asl.Value.Integer;
+ }
+
+ if (!BufferLength)
+ {
+ /* No length AND no items -- issue notice */
+
+ AslError (ASL_REMARK, ASL_MSG_BUFFER_LENGTH, BufferLengthOp, NULL);
+
+ /* But go ahead and put the buffer length of zero into the AML */
+ }
+
+ /*
+ * Just set the buffer size node to be the buffer length, regardless
+ * of whether it was previously an integer or a default_arg placeholder
+ */
+ BufferLengthOp->Asl.ParseOpcode = PARSEOP_INTEGER;
+ BufferLengthOp->Asl.AmlOpcode = AML_DWORD_OP;
+ BufferLengthOp->Asl.Value.Integer = BufferLength;
+
+ (void) OpcSetOptimalIntegerSize (BufferLengthOp);
+
+ /* Remaining nodes are handled via the tree walk */
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoPackage
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Construct the AML operands for the PACKAGE ASL keyword. NOTE:
+ * can only be called after constants have been folded, to ensure
+ * that the PackageLength operand has been fully reduced.
+ *
+ ******************************************************************************/
+
+void
+OpnDoPackage (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ACPI_PARSE_OBJECT *PackageLengthOp;
+ UINT32 PackageLength = 0;
+
+
+ /* Opcode and package length first, followed by the initializer list */
+
+ PackageLengthOp = Op->Asl.Child;
+ InitializerOp = PackageLengthOp->Asl.Next;
+
+ /* Count the number of items in the initializer list */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ /* The peer list contains the byte list (if any...) */
+
+ while (InitializerOp)
+ {
+ PackageLength++;
+ InitializerOp = InitializerOp->Asl.Next;
+ }
+ }
+
+ /* If package length is a constant, compare to the initializer list */
+
+ if ((PackageLengthOp->Asl.ParseOpcode == PARSEOP_INTEGER) ||
+ (PackageLengthOp->Asl.ParseOpcode == PARSEOP_QWORDCONST))
+ {
+ if (PackageLengthOp->Asl.Value.Integer >= PackageLength)
+ {
+ /* Allow package to be longer than the initializer list */
+
+ PackageLength = (UINT32) PackageLengthOp->Asl.Value.Integer;
+ }
+ else
+ {
+ /*
+ * Initializer list is longer than the package length. This
+ * is an error as per the ACPI spec.
+ */
+ AslError (ASL_ERROR, ASL_MSG_LIST_LENGTH,
+ PackageLengthOp->Asl.Next, NULL);
+ }
+ }
+
+ if (PackageLengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+ {
+ /*
+ * This is the case if the PackageLength was left empty - Package()
+ * The package length becomes the length of the initializer list
+ */
+ Op->Asl.Child->Asl.ParseOpcode = PARSEOP_INTEGER;
+ Op->Asl.Child->Asl.Value.Integer = PackageLength;
+
+ /* Set the AML opcode */
+
+ (void) OpcSetOptimalIntegerSize (Op->Asl.Child);
+ }
+
+ /* If not a variable-length package, check for a zero package length */
+
+ if ((PackageLengthOp->Asl.ParseOpcode == PARSEOP_INTEGER) ||
+ (PackageLengthOp->Asl.ParseOpcode == PARSEOP_QWORDCONST) ||
+ (PackageLengthOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG))
+ {
+ if (!PackageLength)
+ {
+ /* No length AND no initializer list -- issue a remark */
+
+ AslError (ASL_REMARK, ASL_MSG_PACKAGE_LENGTH,
+ PackageLengthOp, NULL);
+
+ /* But go ahead and put the buffer length of zero into the AML */
+ }
+ }
+
+ /*
+ * If the PackageLength is a constant <= 255, we can change the
+ * AML opcode from VarPackage to a simple (ACPI 1.0) Package opcode.
+ */
+ if ((Op->Asl.Child->Asl.ParseOpcode == PARSEOP_INTEGER) &&
+ (Op->Asl.Child->Asl.Value.Integer <= 255))
+ {
+ Op->Asl.AmlOpcode = AML_PACKAGE_OP;
+ Op->Asl.ParseOpcode = PARSEOP_PACKAGE;
+
+ /*
+ * Just set the package size node to be the package length, regardless
+ * of whether it was previously an integer or a default_arg placeholder
+ */
+ PackageLengthOp->Asl.AmlOpcode = AML_RAW_DATA_BYTE;
+ PackageLengthOp->Asl.AmlLength = 1;
+ PackageLengthOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
+ PackageLengthOp->Asl.Value.Integer = PackageLength;
+ }
+
+ /* Remaining nodes are handled via the tree walk */
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoLoadTable
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Construct the AML operands for the LOADTABLE ASL keyword.
+ *
+ ******************************************************************************/
+
+static void
+OpnDoLoadTable (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ /* Opcode is parent node */
+ /* First child is the table signature */
+
+ Next = Op->Asl.Child;
+
+ /* Second child is the OEM ID*/
+
+ Next = Next->Asl.Next;
+
+ /* Third child is the OEM table ID */
+
+ Next = Next->Asl.Next;
+
+ /* Fourth child is the RootPath string */
+
+ Next = Next->Asl.Next;
+ if (Next->Asl.ParseOpcode == PARSEOP_ZERO)
+ {
+ Next->Asl.ParseOpcode = PARSEOP_STRING_LITERAL;
+ Next->Asl.Value.String = "\\";
+ Next->Asl.AmlLength = 2;
+ OpcGenerateAmlOpcode (Next);
+ }
+
+#ifdef ASL_FUTURE_IMPLEMENTATION
+
+ /* TBD: NOT IMPLEMENTED */
+ /* Fifth child is the [optional] ParameterPathString */
+ /* Sixth child is the [optional] ParameterData */
+
+ Next = Next->Asl.Next;
+ if (Next->Asl.ParseOpcode == DEFAULT_ARG)
+ {
+ Next->Asl.AmlLength = 1;
+ Next->Asl.ParseOpcode = ZERO;
+ OpcGenerateAmlOpcode (Next);
+ }
+
+
+ Next = Next->Asl.Next;
+ if (Next->Asl.ParseOpcode == DEFAULT_ARG)
+ {
+ Next->Asl.AmlLength = 1;
+ Next->Asl.ParseOpcode = ZERO;
+ OpcGenerateAmlOpcode (Next);
+ }
+#endif
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnDoDefinitionBlock
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Construct the AML operands for the DEFINITIONBLOCK ASL keyword
+ *
+ ******************************************************************************/
+
+static void
+OpnDoDefinitionBlock (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Child;
+ ACPI_SIZE Length;
+ ACPI_NATIVE_UINT i;
+
+
+ /*
+ * These nodes get stuffed into the table header. They are special
+ * cased when the table is written to the output file.
+ *
+ * Mark all of these nodes as non-usable so they won't get output
+ * as AML opcodes!
+ */
+
+ /* Get AML filename. Use it if non-null */
+
+ Child = Op->Asl.Child;
+ if (Child->Asl.Value.Buffer &&
+ *Child->Asl.Value.Buffer &&
+ (Gbl_UseDefaultAmlFilename))
+ {
+ Gbl_OutputFilenamePrefix = (char *) Child->Asl.Value.Buffer;
+ }
+ Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+
+ /* Signature */
+
+ Child = Child->Asl.Next;
+ Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ if (Child->Asl.Value.String)
+ {
+ Gbl_TableSignature = Child->Asl.Value.String;
+ if (ACPI_STRLEN (Gbl_TableSignature) != 4)
+ {
+ AslError (ASL_ERROR, ASL_MSG_TABLE_SIGNATURE, Child,
+ "Length not exactly 4");
+ }
+
+ for (i = 0; i < 4; i++)
+ {
+ if (!isalnum (Gbl_TableSignature[i]))
+ {
+ AslError (ASL_ERROR, ASL_MSG_TABLE_SIGNATURE, Child,
+ "Contains non-alphanumeric characters");
+ }
+ }
+ }
+
+ /* Revision */
+
+ Child = Child->Asl.Next;
+ Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ /*
+ * We used the revision to set the integer width earlier
+ */
+
+ /* OEMID */
+
+ Child = Child->Asl.Next;
+ Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+
+ /* OEM TableID */
+
+ Child = Child->Asl.Next;
+ Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ if (Child->Asl.Value.String)
+ {
+ Length = ACPI_STRLEN (Child->Asl.Value.String);
+ Gbl_TableId = AcpiOsAllocate (Length + 1);
+ ACPI_STRCPY (Gbl_TableId, Child->Asl.Value.String);
+
+ for (i = 0; i < Length; i++)
+ {
+ if (Gbl_TableId[i] == ' ')
+ {
+ Gbl_TableId[i] = 0;
+ break;
+ }
+ }
+ }
+
+ /* OEM Revision */
+
+ Child = Child->Asl.Next;
+ Child->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtGetArg
+ *
+ * PARAMETERS: Op - Get an argument for this op
+ * Argn - Nth argument to get
+ *
+ * RETURN: The argument (as an Op object). NULL if argument does not exist
+ *
+ * DESCRIPTION: Get the specified op's argument (peer)
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+UtGetArg (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Argn)
+{
+ ACPI_PARSE_OBJECT *Arg = NULL;
+
+
+ /* Get the requested argument object */
+
+ Arg = Op->Asl.Child;
+ while (Arg && Argn)
+ {
+ Argn--;
+ Arg = Arg->Asl.Next;
+ }
+
+ return (Arg);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnAttachNameToNode
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: For the named ASL/AML operators, get the actual name from the
+ * argument list and attach it to the parent node so that we
+ * can get to it quickly later.
+ *
+ ******************************************************************************/
+
+static void
+OpnAttachNameToNode (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Child = NULL;
+
+
+ if (Op->Asl.ParseOpcode == PARSEOP_EXTERNAL)
+ {
+ Child = UtGetArg (Op, 0);
+ }
+ else switch (Op->Asl.AmlOpcode)
+ {
+ case AML_DATA_REGION_OP:
+ case AML_DEVICE_OP:
+ case AML_EVENT_OP:
+ case AML_METHOD_OP:
+ case AML_MUTEX_OP:
+ case AML_REGION_OP:
+ case AML_POWER_RES_OP:
+ case AML_PROCESSOR_OP:
+ case AML_THERMAL_ZONE_OP:
+ case AML_NAME_OP:
+ case AML_SCOPE_OP:
+
+ Child = UtGetArg (Op, 0);
+ break;
+
+ case AML_ALIAS_OP:
+
+ Child = UtGetArg (Op, 1);
+ break;
+
+ case AML_CREATE_BIT_FIELD_OP:
+ case AML_CREATE_BYTE_FIELD_OP:
+ case AML_CREATE_WORD_FIELD_OP:
+ case AML_CREATE_DWORD_FIELD_OP:
+ case AML_CREATE_QWORD_FIELD_OP:
+
+ Child = UtGetArg (Op, 2);
+ break;
+
+ case AML_CREATE_FIELD_OP:
+
+ Child = UtGetArg (Op, 3);
+ break;
+
+ case AML_BANK_FIELD_OP:
+ case AML_INDEX_FIELD_OP:
+ case AML_FIELD_OP:
+
+ return;
+
+ default:
+ return;
+ }
+
+ if (Child)
+ {
+ UtAttachNamepathToOwner (Op, Child);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OpnGenerateAmlOperands
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Prepare nodes to be output as AML data and operands. The more
+ * complex AML opcodes require processing of the child nodes
+ * (arguments/operands).
+ *
+ ******************************************************************************/
+
+void
+OpnGenerateAmlOperands (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+
+ if (Op->Asl.AmlOpcode == AML_RAW_DATA_BYTE)
+ {
+ return;
+ }
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_DEFINITIONBLOCK:
+ OpnDoDefinitionBlock (Op);
+ break;
+
+ case PARSEOP_METHOD:
+ OpnDoMethod (Op);
+ break;
+
+ case PARSEOP_MUTEX:
+ OpnDoMutex (Op);
+ break;
+
+ case PARSEOP_FIELD:
+ OpnDoField (Op);
+ break;
+
+ case PARSEOP_INDEXFIELD:
+ OpnDoIndexField (Op);
+ break;
+
+ case PARSEOP_BANKFIELD:
+ OpnDoBankField (Op);
+ break;
+
+ case PARSEOP_BUFFER:
+ OpnDoBuffer (Op);
+ break;
+
+ case PARSEOP_LOADTABLE:
+ OpnDoLoadTable (Op);
+ break;
+
+ case PARSEOP_OPERATIONREGION:
+ OpnDoRegion (Op);
+ break;
+
+ case PARSEOP_RESOURCETEMPLATE:
+ RsDoResourceTemplate (Op);
+ break;
+
+ case PARSEOP_NAMESEG:
+ case PARSEOP_NAMESTRING:
+ case PARSEOP_METHODCALL:
+ case PARSEOP_STRING_LITERAL:
+ break;
+
+ default:
+ break;
+ }
+
+ /* TBD: move */
+
+ OpnAttachNameToNode (Op);
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslopt.c b/sys/contrib/dev/acpica/compiler/aslopt.c
new file mode 100644
index 0000000..2ea9aea
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslopt.c
@@ -0,0 +1,869 @@
+/******************************************************************************
+ *
+ * Module Name: aslopt- Compiler optimizations
+ * $Revision: 1.26 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslopt")
+
+
+static UINT32 OptTotal = 0;
+
+/* Local prototypes */
+
+static ACPI_STATUS
+OptSearchToRoot (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *CurrentNode,
+ ACPI_NAMESPACE_NODE *TargetNode,
+ ACPI_BUFFER *TargetPath,
+ char **NewPath);
+
+static ACPI_STATUS
+OptBuildShortestPath (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *CurrentNode,
+ ACPI_NAMESPACE_NODE *TargetNode,
+ ACPI_BUFFER *CurrentPath,
+ ACPI_BUFFER *TargetPath,
+ ACPI_SIZE AmlNameStringLength,
+ UINT8 IsDeclaration,
+ char **ReturnNewPath);
+
+static ACPI_STATUS
+OptOptimizeNameDeclaration (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *CurrentNode,
+ ACPI_NAMESPACE_NODE *TargetNode,
+ char *AmlNameString,
+ char **NewPath);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OptSearchToRoot
+ *
+ * PARAMETERS: Op - Current parser op
+ * WalkState - Current state
+ * CurrentNode - Where we are in the namespace
+ * TargetNode - Node to which we are referring
+ * TargetPath - External full path to the target node
+ * NewPath - Where the optimized path is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Attempt to optimize a reference to a single 4-character ACPI
+ * name utilizing the search-to-root name resolution algorithm
+ * that is used by AML interpreters.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+OptSearchToRoot (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *CurrentNode,
+ ACPI_NAMESPACE_NODE *TargetNode,
+ ACPI_BUFFER *TargetPath,
+ char **NewPath)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_GENERIC_STATE ScopeInfo;
+ ACPI_STATUS Status;
+ char *Path;
+
+
+ ACPI_FUNCTION_NAME (OptSearchToRoot);
+
+
+ /*
+ * Check if search-to-root can be utilized. Use the last NameSeg of
+ * the NamePath and 1) See if can be found and 2) If found, make
+ * sure that it is the same node that we want. If there is another
+ * name in the search path before the one we want, the nodes will
+ * not match, and we cannot use this optimization.
+ */
+ Path = &(((char *) TargetPath->Pointer)[TargetPath->Length -
+ ACPI_NAME_SIZE]),
+ ScopeInfo.Scope.Node = CurrentNode;
+
+ /* Lookup the NameSeg using SEARCH_PARENT (search-to-root) */
+
+ Status = AcpiNsLookup (&ScopeInfo, Path, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
+ WalkState, &(Node));
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /*
+ * We found the name, but we must check to make sure that the node
+ * matches. Otherwise, there is another identical name in the search
+ * path that precludes the use of this optimization.
+ */
+ if (Node != TargetNode)
+ {
+ /*
+ * This means that another object with the same name was found first,
+ * and we cannot use this optimization.
+ */
+ return (AE_NOT_FOUND);
+ }
+
+ /* Found the node, we can use this optimization */
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,
+ "NAMESEG: %-24s", Path));
+
+ /* We must allocate a new string for the name (TargetPath gets deleted) */
+
+ *NewPath = ACPI_ALLOCATE_ZEROED (ACPI_NAME_SIZE + 1);
+ ACPI_STRCPY (*NewPath, Path);
+
+ if (ACPI_STRNCMP (*NewPath, "_T_", 3))
+ {
+ AslError (ASL_OPTIMIZATION, ASL_MSG_SINGLE_NAME_OPTIMIZATION, Op,
+ *NewPath);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OptBuildShortestPath
+ *
+ * PARAMETERS: Op - Current parser op
+ * WalkState - Current state
+ * CurrentNode - Where we are in the namespace
+ * TargetNode - Node to which we are referring
+ * CurrentPath - External full path to the current node
+ * TargetPath - External full path to the target node
+ * AmlNameStringLength - Length of the original namepath
+ * IsDeclaration - TRUE for declaration, FALSE for reference
+ * ReturnNewPath - Where the optimized path is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Build an optimal NamePath using carats
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+OptBuildShortestPath (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *CurrentNode,
+ ACPI_NAMESPACE_NODE *TargetNode,
+ ACPI_BUFFER *CurrentPath,
+ ACPI_BUFFER *TargetPath,
+ ACPI_SIZE AmlNameStringLength,
+ UINT8 IsDeclaration,
+ char **ReturnNewPath)
+{
+ UINT32 NumCommonSegments;
+ UINT32 MaxCommonSegments;
+ ACPI_NATIVE_UINT Index;
+ UINT32 NumCarats;
+ ACPI_NATIVE_UINT i;
+ char *NewPath;
+ char *NewPathExternal;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_GENERIC_STATE ScopeInfo;
+ ACPI_STATUS Status;
+ BOOLEAN SubPath = FALSE;
+
+
+ ACPI_FUNCTION_NAME (OptBuildShortestPath);
+
+
+ ScopeInfo.Scope.Node = CurrentNode;
+
+ /*
+ * Determine the maximum number of NameSegs that the Target and Current paths
+ * can possibly have in common. (To optimize, we have to have at least 1)
+ *
+ * Note: The external NamePath string lengths are always a multiple of 5
+ * (ACPI_NAME_SIZE + separator)
+ */
+ MaxCommonSegments = TargetPath->Length / ACPI_PATH_SEGMENT_LENGTH;
+ if (CurrentPath->Length < TargetPath->Length)
+ {
+ MaxCommonSegments = CurrentPath->Length / ACPI_PATH_SEGMENT_LENGTH;
+ }
+
+ /*
+ * Determine how many NameSegs the two paths have in common.
+ * (Starting from the root)
+ */
+ for (NumCommonSegments = 0;
+ NumCommonSegments < MaxCommonSegments;
+ NumCommonSegments++)
+ {
+ /* Compare two single NameSegs */
+
+ if (ACPI_STRNCMP (
+ &((char *) TargetPath->Pointer)[(NumCommonSegments *
+ ACPI_PATH_SEGMENT_LENGTH) + 1],
+ &((char *) CurrentPath->Pointer)[(NumCommonSegments *
+ ACPI_PATH_SEGMENT_LENGTH) + 1],
+ ACPI_NAME_SIZE))
+ {
+ /* Mismatch */
+
+ break;
+ }
+ }
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " COMMON: %d",
+ NumCommonSegments));
+
+ /* There must be at least 1 common NameSeg in order to optimize */
+
+ if (NumCommonSegments == 0)
+ {
+ return (AE_NOT_FOUND);
+ }
+
+ if (NumCommonSegments == MaxCommonSegments)
+ {
+ if (CurrentPath->Length == TargetPath->Length)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " SAME PATH"));
+ return (AE_NOT_FOUND);
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " SUBPATH"));
+ SubPath = TRUE;
+ }
+ }
+
+ /* Determine how many prefix Carats are required */
+
+ NumCarats = (CurrentPath->Length / ACPI_PATH_SEGMENT_LENGTH) -
+ NumCommonSegments;
+
+ /*
+ * Construct a new target string
+ */
+ NewPathExternal = ACPI_ALLOCATE_ZEROED (
+ TargetPath->Length + NumCarats + 1);
+
+ /* Insert the Carats into the Target string */
+
+ for (i = 0; i < NumCarats; i++)
+ {
+ NewPathExternal[i] = '^';
+ }
+
+ /*
+ * Copy only the necessary (optimal) segments from the original
+ * target string
+ */
+ Index = (NumCommonSegments * ACPI_PATH_SEGMENT_LENGTH) + 1;
+
+ /* Special handling for exact subpath in a name declaration */
+
+ if (IsDeclaration && SubPath && (CurrentPath->Length > TargetPath->Length))
+ {
+ /*
+ * The current path is longer than the target, and the target is a
+ * subpath of the current path. We must include one more NameSeg of
+ * the target path
+ */
+ Index -= ACPI_PATH_SEGMENT_LENGTH;
+
+ /* Special handling for Scope() operator */
+
+ if (Op->Asl.AmlOpcode == AML_SCOPE_OP)
+ {
+ NewPathExternal[i] = '^';
+ i++;
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "(EXTRA ^)"));
+ }
+ }
+
+ /* Make sure we haven't gone off the end of the target path */
+
+ if (Index > TargetPath->Length)
+ {
+ Index = TargetPath->Length;
+ }
+
+ ACPI_STRCPY (&NewPathExternal[i], &((char *) TargetPath->Pointer)[Index]);
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " %-24s", NewPathExternal));
+
+ /*
+ * Internalize the new target string and check it against the original
+ * string to make sure that this is in fact an optimization. If the
+ * original string is already optimal, there is no point in continuing.
+ */
+ Status = AcpiNsInternalizeName (NewPathExternal, &NewPath);
+ if (ACPI_FAILURE (Status))
+ {
+ AslCoreSubsystemError (Op, Status, "Internalizing new NamePath",
+ ASL_NO_ABORT);
+ ACPI_FREE (NewPathExternal);
+ return (Status);
+ }
+
+ if (ACPI_STRLEN (NewPath) >= AmlNameStringLength)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,
+ " NOT SHORTER (New %u old %u)",
+ ACPI_STRLEN (NewPath), AmlNameStringLength));
+ ACPI_FREE (NewPathExternal);
+ return (AE_NOT_FOUND);
+ }
+
+ /*
+ * Check to make sure that the optimization finds the node we are
+ * looking for. This is simply a sanity check on the new
+ * path that has been created.
+ */
+ Status = AcpiNsLookup (&ScopeInfo, NewPath,
+ ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_DONT_OPEN_SCOPE, WalkState, &(Node));
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Found the namepath, but make sure the node is correct */
+
+ if (Node == TargetNode)
+ {
+ /* The lookup matched the node, accept this optimization */
+
+ AslError (ASL_OPTIMIZATION, ASL_MSG_NAME_OPTIMIZATION,
+ Op, NewPathExternal);
+ *ReturnNewPath = NewPath;
+ }
+ else
+ {
+ /* Node is not correct, do not use this optimization */
+
+ Status = AE_NOT_FOUND;
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " ***** WRONG NODE"));
+ AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op,
+ "Not using optimized name - found wrong node");
+ }
+ }
+ else
+ {
+ /* The lookup failed, we obviously cannot use this optimization */
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " ***** NOT FOUND"));
+ AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op,
+ "Not using optimized name - did not find node");
+ }
+
+ ACPI_FREE (NewPathExternal);
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OptOptimizeNameDeclaration
+ *
+ * PARAMETERS: Op - Current parser op
+ * WalkState - Current state
+ * CurrentNode - Where we are in the namespace
+ * AmlNameString - Unoptimized namepath
+ * NewPath - Where the optimized path is returned
+ *
+ * RETURN: Status. AE_OK If path is optimized
+ *
+ * DESCRIPTION: Perform a simple optimization of removing an extraneous
+ * backslash prefix if we are already at the root scope.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+OptOptimizeNameDeclaration (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *CurrentNode,
+ ACPI_NAMESPACE_NODE *TargetNode,
+ char *AmlNameString,
+ char **NewPath)
+{
+ ACPI_STATUS Status;
+ char *NewPathExternal;
+ ACPI_GENERIC_STATE ScopeInfo;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ACPI_FUNCTION_TRACE (OptOptimizeNameDeclaration);
+
+
+ if (((CurrentNode == AcpiGbl_RootNode) ||
+ (Op->Common.Parent->Asl.ParseOpcode == PARSEOP_DEFINITIONBLOCK)) &&
+ (AmlNameString[0] == '\\'))
+ {
+ /*
+ * The current scope is the root, and the namepath has a root prefix
+ * that is therefore extraneous. Remove it.
+ */
+ *NewPath = &AmlNameString[1];
+
+ /* Debug output */
+
+ Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, *NewPath,
+ NULL, &NewPathExternal);
+ if (ACPI_FAILURE (Status))
+ {
+ AslCoreSubsystemError (Op, Status, "Externalizing NamePath",
+ ASL_NO_ABORT);
+ return (Status);
+ }
+
+ /*
+ * Check to make sure that the optimization finds the node we are
+ * looking for. This is simply a sanity check on the new
+ * path that has been created.
+ */
+ ScopeInfo.Scope.Node = CurrentNode;
+ Status = AcpiNsLookup (&ScopeInfo, *NewPath,
+ ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_DONT_OPEN_SCOPE, WalkState, &(Node));
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Found the namepath, but make sure the node is correct */
+
+ if (Node == TargetNode)
+ {
+ /* The lookup matched the node, accept this optimization */
+
+ AslError (ASL_OPTIMIZATION, ASL_MSG_NAME_OPTIMIZATION,
+ Op, NewPathExternal);
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,
+ "AT ROOT: %-24s", NewPathExternal));
+ }
+ else
+ {
+ /* Node is not correct, do not use this optimization */
+
+ Status = AE_NOT_FOUND;
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,
+ " ***** WRONG NODE"));
+ AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op,
+ "Not using optimized name - found wrong node");
+ }
+ }
+ else
+ {
+ /* The lookup failed, we obviously cannot use this optimization */
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,
+ " ***** NOT FOUND"));
+ AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op,
+ "Not using optimized name - did not find node");
+ }
+
+ ACPI_FREE (NewPathExternal);
+ return (Status);
+ }
+
+ /* Could not optimize */
+
+ return (AE_NOT_FOUND);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: OptOptimizeNamePath
+ *
+ * PARAMETERS: Op - Current parser op
+ * Flags - Opcode info flags
+ * WalkState - Current state
+ * AmlNameString - Unoptimized namepath
+ * TargetNode - Node to which AmlNameString refers
+ *
+ * RETURN: None. If path is optimized, the Op is updated with new path
+ *
+ * DESCRIPTION: Optimize a Named Declaration or Reference to the minimal length.
+ * Must take into account both the current location in the
+ * namespace and the actual reference path.
+ *
+ ******************************************************************************/
+
+void
+OptOptimizeNamePath (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Flags,
+ ACPI_WALK_STATE *WalkState,
+ char *AmlNameString,
+ ACPI_NAMESPACE_NODE *TargetNode)
+{
+ ACPI_STATUS Status;
+ ACPI_BUFFER TargetPath;
+ ACPI_BUFFER CurrentPath;
+ ACPI_SIZE AmlNameStringLength;
+ ACPI_NAMESPACE_NODE *CurrentNode;
+ char *ExternalNameString;
+ char *NewPath = NULL;
+ ACPI_SIZE HowMuchShorter;
+ ACPI_PARSE_OBJECT *NextOp;
+
+
+ ACPI_FUNCTION_TRACE (OptOptimizeNamePath);
+
+
+ /* This is an optional optimization */
+
+ if (!Gbl_ReferenceOptimizationFlag)
+ {
+ return_VOID;
+ }
+
+ /* Various required items */
+
+ if (!TargetNode || !WalkState || !AmlNameString || !Op->Common.Parent)
+ {
+ return_VOID;
+ }
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "%5d [%12.12s] [%12.12s] ",
+ Op->Asl.LogicalLineNumber,
+ AcpiPsGetOpcodeName (Op->Common.Parent->Common.AmlOpcode),
+ AcpiPsGetOpcodeName (Op->Common.AmlOpcode)));
+
+ if (!(Flags & (AML_NAMED | AML_CREATE)))
+ {
+ if (Op->Asl.CompileFlags & NODE_IS_NAME_DECLARATION)
+ {
+ /* We don't want to fuss with actual name declaration nodes here */
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,
+ "******* NAME DECLARATION\n"));
+ return_VOID;
+ }
+ }
+
+ /*
+ * The original path must be longer than one NameSeg (4 chars) for there
+ * to be any possibility that it can be optimized to a shorter string
+ */
+ AmlNameStringLength = ACPI_STRLEN (AmlNameString);
+ if (AmlNameStringLength <= ACPI_NAME_SIZE)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,
+ "NAMESEG %4.4s\n", AmlNameString));
+ return_VOID;
+ }
+
+ /*
+ * We need to obtain the node that represents the current scope -- where
+ * we are right now in the namespace. We will compare this path
+ * against the Namepath, looking for commonality.
+ */
+ CurrentNode = AcpiGbl_RootNode;
+ if (WalkState->ScopeInfo)
+ {
+ CurrentNode = WalkState->ScopeInfo->Scope.Node;
+ }
+
+ if (Flags & (AML_NAMED | AML_CREATE))
+ {
+ /* This is the declaration of a new name */
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "NAME"));
+
+ /*
+ * The node of interest is the parent of this node
+ * (the containing scope)
+ */
+ CurrentNode = Op->Asl.Parent->Asl.Node;
+ if (!CurrentNode)
+ {
+ CurrentNode = AcpiGbl_RootNode;
+ }
+ }
+ else
+ {
+ /* This is a reference to an existing named object */
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "REF "));
+ }
+
+ /*
+ * Obtain the full paths to the two nodes that we are interested in
+ * (Target and current namespace location) in external
+ * format -- something we can easily manipulate
+ */
+ TargetPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ Status = AcpiNsHandleToPathname (TargetNode, &TargetPath);
+ if (ACPI_FAILURE (Status))
+ {
+ AslCoreSubsystemError (Op, Status, "Getting Target NamePath",
+ ASL_NO_ABORT);
+ return_VOID;
+ }
+ TargetPath.Length--; /* Subtract one for null terminator */
+
+ /* CurrentPath is the path to this scope (where we are in the namespace) */
+
+ CurrentPath.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ Status = AcpiNsHandleToPathname (CurrentNode, &CurrentPath);
+ if (ACPI_FAILURE (Status))
+ {
+ AslCoreSubsystemError (Op, Status, "Getting Current NamePath",
+ ASL_NO_ABORT);
+ return_VOID;
+ }
+ CurrentPath.Length--; /* Subtract one for null terminator */
+
+ /* Debug output only */
+
+ Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, AmlNameString,
+ NULL, &ExternalNameString);
+ if (ACPI_FAILURE (Status))
+ {
+ AslCoreSubsystemError (Op, Status, "Externalizing NamePath",
+ ASL_NO_ABORT);
+ return_VOID;
+ }
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS,
+ "%37s (%2u) ==> %-32s(%2u) %-32s",
+ (char *) CurrentPath.Pointer, CurrentPath.Length,
+ (char *) TargetPath.Pointer, TargetPath.Length, ExternalNameString));
+
+ ACPI_FREE (ExternalNameString);
+
+ /*
+ * Attempt an optmization depending on the type of namepath
+ */
+ if (Flags & (AML_NAMED | AML_CREATE))
+ {
+ /*
+ * This is a named opcode and the namepath is a name declaration, not
+ * a reference.
+ */
+ Status = OptOptimizeNameDeclaration (Op, WalkState, CurrentNode,
+ TargetNode, AmlNameString, &NewPath);
+ if (ACPI_FAILURE (Status))
+ {
+ /*
+ * 2) now attempt to
+ * optimize the namestring with carats (up-arrow)
+ */
+ Status = OptBuildShortestPath (Op, WalkState, CurrentNode,
+ TargetNode, &CurrentPath, &TargetPath,
+ AmlNameStringLength, 1, &NewPath);
+ }
+ }
+ else
+ {
+ /*
+ * This is a reference to an existing named object
+ *
+ * 1) Check if search-to-root can be utilized using the last
+ * NameSeg of the NamePath
+ */
+ Status = OptSearchToRoot (Op, WalkState, CurrentNode,
+ TargetNode, &TargetPath, &NewPath);
+ if (ACPI_FAILURE (Status))
+ {
+ /*
+ * 2) Search-to-root could not be used, now attempt to
+ * optimize the namestring with carats (up-arrow)
+ */
+ Status = OptBuildShortestPath (Op, WalkState, CurrentNode,
+ TargetNode, &CurrentPath, &TargetPath,
+ AmlNameStringLength, 0, &NewPath);
+ }
+ }
+
+ /*
+ * Success from above indicates that the NamePath was successfully
+ * optimized. We need to update the parse op with the new name
+ */
+ if (ACPI_SUCCESS (Status))
+ {
+ HowMuchShorter = (AmlNameStringLength - ACPI_STRLEN (NewPath));
+ OptTotal += HowMuchShorter;
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " REDUCED %2u (%u)",
+ HowMuchShorter, OptTotal));
+
+ if (Flags & AML_NAMED)
+ {
+ if (Op->Asl.AmlOpcode == AML_ALIAS_OP)
+ {
+ /*
+ * ALIAS is the only oddball opcode, the name declaration
+ * (alias name) is the second operand
+ */
+ Op->Asl.Child->Asl.Next->Asl.Value.String = NewPath;
+ Op->Asl.Child->Asl.Next->Asl.AmlLength = ACPI_STRLEN (NewPath);
+ }
+ else
+ {
+ Op->Asl.Child->Asl.Value.String = NewPath;
+ Op->Asl.Child->Asl.AmlLength = ACPI_STRLEN (NewPath);
+ }
+ }
+ else if (Flags & AML_CREATE)
+ {
+ /* Name must appear as the last parameter */
+
+ NextOp = Op->Asl.Child;
+ while (!(NextOp->Asl.CompileFlags & NODE_IS_NAME_DECLARATION))
+ {
+ NextOp = NextOp->Asl.Next;
+ }
+ /* Update the parse node with the new NamePath */
+
+ NextOp->Asl.Value.String = NewPath;
+ NextOp->Asl.AmlLength = ACPI_STRLEN (NewPath);
+ }
+ else
+ {
+ /* Update the parse node with the new NamePath */
+
+ Op->Asl.Value.String = NewPath;
+ Op->Asl.AmlLength = ACPI_STRLEN (NewPath);
+ }
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, " ALREADY OPTIMAL"));
+ }
+
+ /* Cleanup path buffers */
+
+ ACPI_FREE (TargetPath.Pointer);
+ ACPI_FREE (CurrentPath.Pointer);
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_OPTIMIZATIONS, "\n"));
+ return_VOID;
+}
+
diff --git a/sys/contrib/dev/acpica/compiler/aslresource.c b/sys/contrib/dev/acpica/compiler/aslresource.c
new file mode 100644
index 0000000..c33637e
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslresource.c
@@ -0,0 +1,760 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslresource - Resource templates and descriptors
+ * $Revision: 1.43 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslresource")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsAllocateResourceNode
+ *
+ * PARAMETERS: Size - Size of node in bytes
+ *
+ * RETURN: The allocated node - aborts on allocation failure
+ *
+ * DESCRIPTION: Allocate a resource description node and the resource
+ * descriptor itself (the nodes are used to link descriptors).
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsAllocateResourceNode (
+ UINT32 Size)
+{
+ ASL_RESOURCE_NODE *Rnode;
+
+
+ /* Allocate the node */
+
+ Rnode = UtLocalCalloc (sizeof (ASL_RESOURCE_NODE));
+
+ /* Allocate the resource descriptor itself */
+
+ Rnode->Buffer = UtLocalCalloc (Size);
+ Rnode->BufferLength = Size;
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsCreateBitField
+ *
+ * PARAMETERS: Op - Resource field node
+ * Name - Name of the field (Used only to reference
+ * the field in the ASL, not in the AML)
+ * ByteOffset - Offset from the field start
+ * BitOffset - Additional bit offset
+ *
+ * RETURN: None, sets fields within the input node
+ *
+ * DESCRIPTION: Utility function to generate a named bit field within a
+ * resource descriptor. Mark a node as 1) a field in a resource
+ * descriptor, and 2) set the value to be a BIT offset
+ *
+ ******************************************************************************/
+
+void
+RsCreateBitField (
+ ACPI_PARSE_OBJECT *Op,
+ char *Name,
+ UINT32 ByteOffset,
+ UINT32 BitOffset)
+{
+
+ Op->Asl.ExternalName = Name;
+ Op->Asl.Value.Integer = ((ACPI_INTEGER) ByteOffset * 8) + BitOffset;
+ Op->Asl.CompileFlags |= (NODE_IS_RESOURCE_FIELD | NODE_IS_BIT_OFFSET);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsCreateByteField
+ *
+ * PARAMETERS: Op - Resource field node
+ * Name - Name of the field (Used only to reference
+ * the field in the ASL, not in the AML)
+ * ByteOffset - Offset from the field start
+ *
+ * RETURN: None, sets fields within the input node
+ *
+ * DESCRIPTION: Utility function to generate a named byte field within a
+ * resource descriptor. Mark a node as 1) a field in a resource
+ * descriptor, and 2) set the value to be a BYTE offset
+ *
+ ******************************************************************************/
+
+void
+RsCreateByteField (
+ ACPI_PARSE_OBJECT *Op,
+ char *Name,
+ UINT32 ByteOffset)
+{
+
+ Op->Asl.ExternalName = Name;
+ Op->Asl.Value.Integer = ByteOffset;
+ Op->Asl.CompileFlags |= NODE_IS_RESOURCE_FIELD;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsSetFlagBits
+ *
+ * PARAMETERS: *Flags - Pointer to the flag byte
+ * Op - Flag initialization node
+ * Position - Bit position within the flag byte
+ * Default - Used if the node is DEFAULT.
+ *
+ * RETURN: Sets bits within the *Flags output byte.
+ *
+ * DESCRIPTION: Set a bit in a cumulative flags word from an initialization
+ * node. Will use a default value if the node is DEFAULT, meaning
+ * that no value was specified in the ASL. Used to merge multiple
+ * keywords into a single flags byte.
+ *
+ ******************************************************************************/
+
+void
+RsSetFlagBits (
+ UINT8 *Flags,
+ ACPI_PARSE_OBJECT *Op,
+ UINT8 Position,
+ UINT8 DefaultBit)
+{
+
+ if (Op->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+ {
+ /* Use the default bit */
+
+ *Flags |= (DefaultBit << Position);
+ }
+ else
+ {
+ /* Use the bit specified in the initialization node */
+
+ *Flags |= (((UINT8) Op->Asl.Value.Integer) << Position);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsCompleteNodeAndGetNext
+ *
+ * PARAMETERS: Op - Resource node to be completed
+ *
+ * RETURN: The next peer to the input node.
+ *
+ * DESCRIPTION: Mark the current node completed and return the next peer.
+ * The node ParseOpcode is set to DEFAULT_ARG, meaning that
+ * this node is to be ignored from now on.
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+RsCompleteNodeAndGetNext (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ /* Mark this node unused */
+
+ Op->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+
+ /* Move on to the next peer node in the initializer list */
+
+ return (ASL_GET_PEER_NODE (Op));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsCheckListForDuplicates
+ *
+ * PARAMETERS: Op - First op in the initializer list
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Check an initializer list for duplicate values. Emits an error
+ * if any duplicates are found.
+ *
+ ******************************************************************************/
+
+void
+RsCheckListForDuplicates (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *NextValueOp = Op;
+ ACPI_PARSE_OBJECT *NextOp;
+ UINT32 Value;
+
+
+ if (!Op)
+ {
+ return;
+ }
+
+ /* Search list once for each value in the list */
+
+ while (NextValueOp)
+ {
+ Value = (UINT32) NextValueOp->Asl.Value.Integer;
+
+ /* Compare this value to all remaining values in the list */
+
+ NextOp = ASL_GET_PEER_NODE (NextValueOp);
+ while (NextOp)
+ {
+ if (NextOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ /* Compare values */
+
+ if (Value == (UINT32) NextOp->Asl.Value.Integer)
+ {
+ /* Emit error only once per duplicate node */
+
+ if (!(NextOp->Asl.CompileFlags & NODE_IS_DUPLICATE))
+ {
+ NextOp->Asl.CompileFlags |= NODE_IS_DUPLICATE;
+ AslError (ASL_ERROR, ASL_MSG_DUPLICATE_ITEM,
+ NextOp, NULL);
+ }
+ }
+ }
+
+ NextOp = ASL_GET_PEER_NODE (NextOp);
+ }
+
+ NextValueOp = ASL_GET_PEER_NODE (NextValueOp);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoOneResourceDescriptor
+ *
+ * PARAMETERS: DescriptorTypeOp - Parent parse node of the descriptor
+ * CurrentByteOffset - Offset in the resource descriptor
+ * buffer.
+ *
+ * RETURN: A valid resource node for the descriptor
+ *
+ * DESCRIPTION: Dispatches the processing of one resource descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoOneResourceDescriptor (
+ ACPI_PARSE_OBJECT *DescriptorTypeOp,
+ UINT32 CurrentByteOffset,
+ UINT8 *State)
+{
+ ASL_RESOURCE_NODE *Rnode = NULL;
+
+
+ /* Construct the resource */
+
+ switch (DescriptorTypeOp->Asl.ParseOpcode)
+ {
+ case PARSEOP_DMA:
+ Rnode = RsDoDmaDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_DWORDIO:
+ Rnode = RsDoDwordIoDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_DWORDMEMORY:
+ Rnode = RsDoDwordMemoryDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_DWORDSPACE:
+ Rnode = RsDoDwordSpaceDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_ENDDEPENDENTFN:
+ switch (*State)
+ {
+ case ACPI_RSTATE_NORMAL:
+ AslError (ASL_ERROR, ASL_MSG_MISSING_STARTDEPENDENT,
+ DescriptorTypeOp, NULL);
+ break;
+
+ case ACPI_RSTATE_START_DEPENDENT:
+ AslError (ASL_ERROR, ASL_MSG_DEPENDENT_NESTING,
+ DescriptorTypeOp, NULL);
+ break;
+
+ case ACPI_RSTATE_DEPENDENT_LIST:
+ default:
+ break;
+ }
+
+ *State = ACPI_RSTATE_NORMAL;
+ Rnode = RsDoEndDependentDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_ENDTAG:
+ Rnode = RsDoEndTagDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_EXTENDEDIO:
+ Rnode = RsDoExtendedIoDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_EXTENDEDMEMORY:
+ Rnode = RsDoExtendedMemoryDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_EXTENDEDSPACE:
+ Rnode = RsDoExtendedSpaceDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_FIXEDIO:
+ Rnode = RsDoFixedIoDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_INTERRUPT:
+ Rnode = RsDoInterruptDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_IO:
+ Rnode = RsDoIoDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_IRQ:
+ Rnode = RsDoIrqDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_IRQNOFLAGS:
+ Rnode = RsDoIrqNoFlagsDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_MEMORY24:
+ Rnode = RsDoMemory24Descriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_MEMORY32:
+ Rnode = RsDoMemory32Descriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_MEMORY32FIXED:
+ Rnode = RsDoMemory32FixedDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_QWORDIO:
+ Rnode = RsDoQwordIoDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_QWORDMEMORY:
+ Rnode = RsDoQwordMemoryDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_QWORDSPACE:
+ Rnode = RsDoQwordSpaceDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_REGISTER:
+ Rnode = RsDoGeneralRegisterDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_STARTDEPENDENTFN:
+ switch (*State)
+ {
+ case ACPI_RSTATE_START_DEPENDENT:
+ AslError (ASL_ERROR, ASL_MSG_DEPENDENT_NESTING,
+ DescriptorTypeOp, NULL);
+ break;
+
+ case ACPI_RSTATE_NORMAL:
+ case ACPI_RSTATE_DEPENDENT_LIST:
+ default:
+ break;
+ }
+
+ *State = ACPI_RSTATE_START_DEPENDENT;
+ Rnode = RsDoStartDependentDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ *State = ACPI_RSTATE_DEPENDENT_LIST;
+ break;
+
+ case PARSEOP_STARTDEPENDENTFN_NOPRI:
+ switch (*State)
+ {
+ case ACPI_RSTATE_START_DEPENDENT:
+ AslError (ASL_ERROR, ASL_MSG_DEPENDENT_NESTING,
+ DescriptorTypeOp, NULL);
+ break;
+
+ case ACPI_RSTATE_NORMAL:
+ case ACPI_RSTATE_DEPENDENT_LIST:
+ default:
+ break;
+ }
+
+ *State = ACPI_RSTATE_START_DEPENDENT;
+ Rnode = RsDoStartDependentNoPriDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ *State = ACPI_RSTATE_DEPENDENT_LIST;
+ break;
+
+ case PARSEOP_VENDORLONG:
+ Rnode = RsDoVendorLargeDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_VENDORSHORT:
+ Rnode = RsDoVendorSmallDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_WORDBUSNUMBER:
+ Rnode = RsDoWordBusNumberDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_WORDIO:
+ Rnode = RsDoWordIoDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_WORDSPACE:
+ Rnode = RsDoWordSpaceDescriptor (DescriptorTypeOp,
+ CurrentByteOffset);
+ break;
+
+ case PARSEOP_DEFAULT_ARG:
+ /* Just ignore any of these, they are used as fillers/placeholders */
+ break;
+
+ default:
+ printf ("Unknown resource descriptor type [%s]\n",
+ DescriptorTypeOp->Asl.ParseOpName);
+ break;
+ }
+
+ /*
+ * Mark original node as unused, but head of a resource descriptor.
+ * This allows the resource to be installed in the namespace so that
+ * references to the descriptor can be resolved.
+ */
+ DescriptorTypeOp->Asl.ParseOpcode = PARSEOP_DEFAULT_ARG;
+ DescriptorTypeOp->Asl.CompileFlags = NODE_IS_RESOURCE_DESC;
+ DescriptorTypeOp->Asl.Value.Integer = CurrentByteOffset;
+
+ if (Rnode)
+ {
+ DescriptorTypeOp->Asl.FinalAmlLength = Rnode->BufferLength;
+ }
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsLinkDescriptorChain
+ *
+ * PARAMETERS: PreviousRnode - Pointer to the node that will be previous
+ * to the linked node, At exit, set to the
+ * last node in the new chain.
+ * Rnode - Resource node to link into the list
+ *
+ * RETURN: Cumulative buffer byte offset of the new segment of chain
+ *
+ * DESCRIPTION: Link a descriptor chain at the end of an existing chain.
+ *
+ ******************************************************************************/
+
+UINT32
+RsLinkDescriptorChain (
+ ASL_RESOURCE_NODE **PreviousRnode,
+ ASL_RESOURCE_NODE *Rnode)
+{
+ ASL_RESOURCE_NODE *LastRnode;
+ UINT32 CurrentByteOffset;
+
+
+ /* Anything to do? */
+
+ if (!Rnode)
+ {
+ return 0;
+ }
+
+ /* Point the previous node to the new node */
+
+ (*PreviousRnode)->Next = Rnode;
+ CurrentByteOffset = Rnode->BufferLength;
+
+ /* Walk to the end of the chain headed by Rnode */
+
+ LastRnode = Rnode;
+ while (LastRnode->Next)
+ {
+ LastRnode = LastRnode->Next;
+ CurrentByteOffset += LastRnode->BufferLength;
+ }
+
+ /* Previous node becomes the last node in the chain */
+
+ *PreviousRnode = LastRnode;
+ return CurrentByteOffset;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoResourceTemplate
+ *
+ * PARAMETERS: Op - Parent of a resource template list
+ *
+ * RETURN: None. Sets input node to point to a list of AML code
+ *
+ * DESCRIPTION: Merge a list of resource descriptors into a single AML buffer,
+ * in preparation for output to the AML output file.
+ *
+ ******************************************************************************/
+
+void
+RsDoResourceTemplate (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *BufferLengthOp;
+ ACPI_PARSE_OBJECT *BufferOp;
+ ACPI_PARSE_OBJECT *DescriptorTypeOp;
+ ACPI_PARSE_OBJECT *LastOp = NULL;
+ UINT32 CurrentByteOffset = 0;
+ ASL_RESOURCE_NODE HeadRnode;
+ ASL_RESOURCE_NODE *PreviousRnode;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 State;
+
+
+ /* Mark parent as containing a resource template */
+
+ if (Op->Asl.Parent)
+ {
+ Op->Asl.Parent->Asl.CompileFlags |= NODE_IS_RESOURCE_DESC;
+ }
+
+ /* ResourceTemplate Opcode is first (Op) */
+ /* Buffer Length node is first child */
+
+ BufferLengthOp = ASL_GET_CHILD_NODE (Op);
+
+ /* Buffer Op is first peer */
+
+ BufferOp = ASL_GET_PEER_NODE (BufferLengthOp);
+
+ /* First Descriptor type is next */
+
+ DescriptorTypeOp = ASL_GET_PEER_NODE (BufferOp);
+
+ /*
+ * Process all resource descriptors in the list
+ * Note: It is assumed that the EndTag node has been automatically
+ * inserted at the end of the template by the parser.
+ */
+ State = ACPI_RSTATE_NORMAL;
+ PreviousRnode = &HeadRnode;
+ while (DescriptorTypeOp)
+ {
+ DescriptorTypeOp->Asl.CompileFlags |= NODE_IS_RESOURCE_DESC;
+ Rnode = RsDoOneResourceDescriptor (DescriptorTypeOp, CurrentByteOffset,
+ &State);
+
+ /*
+ * Update current byte offset to indicate the number of bytes from the
+ * start of the buffer. Buffer can include multiple descriptors, we
+ * must keep track of the offset of not only each descriptor, but each
+ * element (field) within each descriptor as well.
+ */
+ CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode, Rnode);
+
+ /* Get the next descriptor in the list */
+
+ LastOp = DescriptorTypeOp;
+ DescriptorTypeOp = ASL_GET_PEER_NODE (DescriptorTypeOp);
+ }
+
+ if (State == ACPI_RSTATE_DEPENDENT_LIST)
+ {
+ if (LastOp)
+ {
+ LastOp = LastOp->Asl.Parent;
+ }
+ AslError (ASL_ERROR, ASL_MSG_MISSING_ENDDEPENDENT, LastOp, NULL);
+ }
+
+ /*
+ * Transform the nodes into the following
+ *
+ * Op -> AML_BUFFER_OP
+ * First Child -> BufferLength
+ * Second Child -> Descriptor Buffer (raw byte data)
+ */
+ Op->Asl.ParseOpcode = PARSEOP_BUFFER;
+ Op->Asl.AmlOpcode = AML_BUFFER_OP;
+ Op->Asl.CompileFlags = NODE_AML_PACKAGE | NODE_IS_RESOURCE_DESC;
+
+ BufferLengthOp->Asl.ParseOpcode = PARSEOP_INTEGER;
+ BufferLengthOp->Asl.Value.Integer = CurrentByteOffset;
+ (void) OpcSetOptimalIntegerSize (BufferLengthOp);
+
+ BufferOp->Asl.ParseOpcode = PARSEOP_RAW_DATA;
+ BufferOp->Asl.AmlOpcode = AML_RAW_DATA_CHAIN;
+ BufferOp->Asl.AmlOpcodeLength = 0;
+ BufferOp->Asl.AmlLength = CurrentByteOffset;
+ BufferOp->Asl.Value.Buffer = (UINT8 *) HeadRnode.Next;
+ BufferOp->Asl.CompileFlags |= NODE_IS_RESOURCE_DATA;
+
+ return;
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslrestype1.c b/sys/contrib/dev/acpica/compiler/aslrestype1.c
new file mode 100644
index 0000000..e317436
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslrestype1.c
@@ -0,0 +1,1186 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslrestype1 - Short (type1) resource templates and descriptors
+ * $Revision: 1.40 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslrestype1")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoEndTagDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "EndDependentFn" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoEndTagDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ASL_RESOURCE_NODE *Rnode;
+
+
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_TAG));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->EndTag.DescriptorType = ACPI_RESOURCE_NAME_END_TAG |
+ ASL_RDESC_END_TAG_SIZE;
+ Descriptor->EndTag.Checksum = 0;
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoDmaDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "DMA" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoDmaDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT32 i;
+ UINT8 DmaChannelMask = 0;
+ UINT8 DmaChannels = 0;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_DMA));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Dma.DescriptorType = ACPI_RESOURCE_NAME_DMA |
+ ASL_RDESC_DMA_SIZE;
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* DMA type */
+
+ RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 5, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DMATYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 5);
+ break;
+
+ case 1: /* Bus Master */
+
+ RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_BUSMASTER,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 2);
+ break;
+
+ case 2: /* Xfer Type (transfer width) */
+
+ RsSetFlagBits (&Descriptor->Dma.Flags, InitializerOp, 0, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_XFERTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Dma.Flags), 0);
+ break;
+
+ case 3: /* Name */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ /* All DMA channel bytes are handled here, after flags and name */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ /* Up to 8 channels can be specified in the list */
+
+ DmaChannels++;
+ if (DmaChannels > 8)
+ {
+ AslError (ASL_ERROR, ASL_MSG_DMA_LIST,
+ InitializerOp, NULL);
+ return (Rnode);
+ }
+
+ /* Only DMA channels 0-7 are allowed (mask is 8 bits) */
+
+ if (InitializerOp->Asl.Value.Integer > 7)
+ {
+ AslError (ASL_ERROR, ASL_MSG_DMA_CHANNEL,
+ InitializerOp, NULL);
+ }
+
+ /* Build the mask */
+
+ DmaChannelMask |=
+ (1 << ((UINT8) InitializerOp->Asl.Value.Integer));
+ }
+
+ if (i == 4) /* case 4: First DMA byte */
+ {
+ /* Check now for duplicates in list */
+
+ RsCheckListForDuplicates (InitializerOp);
+
+ /* Create a named field at the start of the list */
+
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_DMA,
+ CurrentByteOffset +
+ ASL_RESDESC_OFFSET (Dma.DmaChannelMask));
+ }
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ /* Now we can set the channel mask */
+
+ Descriptor->Dma.DmaChannelMask = DmaChannelMask;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoEndDependentDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "EndDependentFn" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoEndDependentDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ASL_RESOURCE_NODE *Rnode;
+
+
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_END_DEPENDENT));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->EndDpf.DescriptorType = ACPI_RESOURCE_NAME_END_DEPENDENT |
+ ASL_RDESC_END_DEPEND_SIZE;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoFixedIoDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "FixedIO" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoFixedIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_IO));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Io.DescriptorType = ACPI_RESOURCE_NAME_FIXED_IO |
+ ASL_RDESC_FIXED_IO_SIZE;
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Base Address */
+
+ Descriptor->FixedIo.Address =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_BASEADDRESS,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.Address));
+ break;
+
+ case 1: /* Length */
+
+ Descriptor->FixedIo.AddressLength =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (FixedIo.AddressLength));
+ break;
+
+ case 2: /* Name */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoIoDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "IO" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IO));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Io.DescriptorType = ACPI_RESOURCE_NAME_IO |
+ ASL_RDESC_IO_SIZE;
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Decode size */
+
+ RsSetFlagBits (&Descriptor->Io.Flags, InitializerOp, 0, 1);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Flags), 0);
+ break;
+
+ case 1: /* Min Address */
+
+ Descriptor->Io.Minimum =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Minimum));
+ break;
+
+ case 2: /* Max Address */
+
+ Descriptor->Io.Maximum =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Maximum));
+ break;
+
+ case 3: /* Alignment */
+
+ Descriptor->Io.Alignment =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Io.Alignment));
+ break;
+
+ case 4: /* Length */
+
+ Descriptor->Io.AddressLength =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Io.AddressLength));
+ break;
+
+ case 5: /* Name */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoIrqDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "IRQ" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoIrqDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT32 Interrupts = 0;
+ UINT16 IrqMask = 0;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IRQ));
+
+ /* Length = 3 (with flag byte) */
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Irq.DescriptorType = ACPI_RESOURCE_NAME_IRQ |
+ (ASL_RDESC_IRQ_SIZE + 0x01);
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Interrupt Type (or Mode - edge/level) */
+
+ RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 0, 1);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 0);
+ break;
+
+ case 1: /* Interrupt Level (or Polarity - Active high/low) */
+
+ RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTLEVEL,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 3);
+ break;
+
+ case 2: /* Share Type - Default: exclusive (0) */
+
+ RsSetFlagBits (&Descriptor->Irq.Flags, InitializerOp, 4, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.Flags), 4);
+ break;
+
+ case 3: /* Name */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ /* All IRQ bytes are handled here, after the flags and name */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ /* Up to 16 interrupts can be specified in the list */
+
+ Interrupts++;
+ if (Interrupts > 16)
+ {
+ AslError (ASL_ERROR, ASL_MSG_INTERRUPT_LIST,
+ InitializerOp, NULL);
+ return (Rnode);
+ }
+
+ /* Only interrupts 0-15 are allowed (mask is 16 bits) */
+
+ if (InitializerOp->Asl.Value.Integer > 15)
+ {
+ AslError (ASL_ERROR, ASL_MSG_INTERRUPT_NUMBER,
+ InitializerOp, NULL);
+ }
+ else
+ {
+ IrqMask |= (1 << (UINT8) InitializerOp->Asl.Value.Integer);
+ }
+ }
+
+ /* Case 4: First IRQ value in list */
+
+ if (i == 4)
+ {
+ /* Check now for duplicates in list */
+
+ RsCheckListForDuplicates (InitializerOp);
+
+ /* Create a named field at the start of the list */
+
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.IrqMask));
+ }
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ /* Now we can set the channel mask */
+
+ Descriptor->Irq.IrqMask = IrqMask;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoIrqNoFlagsDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "IRQNoFlags" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoIrqNoFlagsDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT16 IrqMask = 0;
+ UINT32 Interrupts = 0;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_IRQ_NOFLAGS));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Irq.DescriptorType = ACPI_RESOURCE_NAME_IRQ |
+ ASL_RDESC_IRQ_SIZE;
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Name */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ /* IRQ bytes are handled here, after the flags and name */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ /* Up to 16 interrupts can be specified in the list */
+
+ Interrupts++;
+ if (Interrupts > 16)
+ {
+ AslError (ASL_ERROR, ASL_MSG_INTERRUPT_LIST,
+ InitializerOp, NULL);
+ return (Rnode);
+ }
+
+ /* Only interrupts 0-15 are allowed (mask is 16 bits) */
+
+ if (InitializerOp->Asl.Value.Integer > 15)
+ {
+ AslError (ASL_ERROR, ASL_MSG_INTERRUPT_NUMBER,
+ InitializerOp, NULL);
+ }
+ else
+ {
+ IrqMask |= (1 << ((UINT8) InitializerOp->Asl.Value.Integer));
+ }
+ }
+
+ /* Case 1: First IRQ value in list */
+
+ if (i == 1)
+ {
+ /* Check now for duplicates in list */
+
+ RsCheckListForDuplicates (InitializerOp);
+
+ /* Create a named field at the start of the list */
+
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Irq.IrqMask));
+ }
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ /* Now we can set the interrupt mask */
+
+ Descriptor->Irq.IrqMask = IrqMask;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoMemory24Descriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "Memory24" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoMemory24Descriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY24));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Memory24.DescriptorType = ACPI_RESOURCE_NAME_MEMORY24;
+ Descriptor->Memory24.ResourceLength = 9;
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Read/Write type */
+
+ RsSetFlagBits (&Descriptor->Memory24.Flags, InitializerOp, 0, 1);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Flags), 0);
+ break;
+
+ case 1: /* Min Address */
+
+ Descriptor->Memory24.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Minimum));
+ break;
+
+ case 2: /* Max Address */
+
+ Descriptor->Memory24.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Maximum));
+ break;
+
+ case 3: /* Alignment */
+
+ Descriptor->Memory24.Alignment = (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.Alignment));
+ break;
+
+ case 4: /* Length */
+
+ Descriptor->Memory24.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Memory24.AddressLength));
+ break;
+
+ case 5: /* Name */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoMemory32Descriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "Memory32" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoMemory32Descriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_MEMORY32));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Memory32.DescriptorType = ACPI_RESOURCE_NAME_MEMORY32;
+ Descriptor->Memory32.ResourceLength = 17;
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Read/Write type */
+
+ RsSetFlagBits (&Descriptor->Memory32.Flags, InitializerOp, 0, 1);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Flags), 0);
+ break;
+
+ case 1: /* Min Address */
+
+ Descriptor->Memory32.Minimum = (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Minimum));
+ break;
+
+ case 2: /* Max Address */
+
+ Descriptor->Memory32.Maximum = (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Maximum));
+ break;
+
+ case 3: /* Alignment */
+
+ Descriptor->Memory32.Alignment = (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_ALIGNMENT,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.Alignment));
+ break;
+
+ case 4: /* Length */
+
+ Descriptor->Memory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Memory32.AddressLength));
+ break;
+
+ case 5: /* Name */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoMemory32FixedDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "Memory32Fixed" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoMemory32FixedDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_FIXED_MEMORY32));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->FixedMemory32.DescriptorType = ACPI_RESOURCE_NAME_FIXED_MEMORY32;
+ Descriptor->FixedMemory32.ResourceLength = 9;
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Read/Write type */
+
+ RsSetFlagBits (&Descriptor->FixedMemory32.Flags, InitializerOp, 0, 1);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Flags), 0);
+ break;
+
+ case 1: /* Address */
+
+ Descriptor->FixedMemory32.Address = (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_BASEADDRESS,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.Address));
+ break;
+
+ case 2: /* Length */
+
+ Descriptor->FixedMemory32.AddressLength = (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (FixedMemory32.AddressLength));
+ break;
+
+ case 3: /* Name */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoStartDependentDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "StartDependentFn" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoStartDependentDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ ASL_RESOURCE_NODE *PreviousRnode;
+ ASL_RESOURCE_NODE *NextRnode;
+ UINT32 i;
+ UINT8 State;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT));
+
+ PreviousRnode = Rnode;
+ Descriptor = Rnode->Buffer;
+
+ /* Descriptor has priority byte */
+
+ Descriptor->StartDpf.DescriptorType = ACPI_RESOURCE_NAME_START_DEPENDENT |
+ (ASL_RDESC_ST_DEPEND_SIZE + 0x01);
+
+ /* Process all child initialization nodes */
+
+ State = ACPI_RSTATE_START_DEPENDENT;
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Compatibility Priority */
+
+ if ((UINT8) InitializerOp->Asl.Value.Integer > 2)
+ {
+ AslError (ASL_ERROR, ASL_MSG_INVALID_PRIORITY,
+ InitializerOp, NULL);
+ }
+
+ RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 0, 0);
+ break;
+
+ case 1: /* Performance/Robustness Priority */
+
+ if ((UINT8) InitializerOp->Asl.Value.Integer > 2)
+ {
+ AslError (ASL_ERROR, ASL_MSG_INVALID_PERFORMANCE,
+ InitializerOp, NULL);
+ }
+
+ RsSetFlagBits (&Descriptor->StartDpf.Flags, InitializerOp, 2, 0);
+ break;
+
+ default:
+ NextRnode = RsDoOneResourceDescriptor (InitializerOp,
+ CurrentByteOffset, &State);
+
+ /*
+ * Update current byte offset to indicate the number of bytes from the
+ * start of the buffer. Buffer can include multiple descriptors, we
+ * must keep track of the offset of not only each descriptor, but each
+ * element (field) within each descriptor as well.
+ */
+
+ CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode,
+ NextRnode);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoStartDependentNoPriDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "StartDependentNoPri" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoStartDependentNoPriDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ ASL_RESOURCE_NODE *PreviousRnode;
+ ASL_RESOURCE_NODE *NextRnode;
+ UINT8 State;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->StartDpf.DescriptorType = ACPI_RESOURCE_NAME_START_DEPENDENT |
+ ASL_RDESC_ST_DEPEND_SIZE;
+ PreviousRnode = Rnode;
+
+ /* Process all child initialization nodes */
+
+ State = ACPI_RSTATE_START_DEPENDENT;
+ while (InitializerOp)
+ {
+ NextRnode = RsDoOneResourceDescriptor (InitializerOp,
+ CurrentByteOffset, &State);
+
+ /*
+ * Update current byte offset to indicate the number of bytes from the
+ * start of the buffer. Buffer can include multiple descriptors, we
+ * must keep track of the offset of not only each descriptor, but each
+ * element (field) within each descriptor as well.
+ */
+ CurrentByteOffset += RsLinkDescriptorChain (&PreviousRnode, NextRnode);
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoVendorSmallDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a short "VendorShort" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoVendorSmallDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 *VendorData;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+
+ /* Allocate worst case - 7 vendor bytes */
+
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_VENDOR_SMALL) + 7);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->VendorSmall.DescriptorType = ACPI_RESOURCE_NAME_VENDOR_SMALL;
+ VendorData = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_SMALL_HEADER);
+
+ /* Process all child initialization nodes */
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ for (i = 0; InitializerOp; i++)
+ {
+ if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+ {
+ break;
+ }
+
+ /* Maximum 7 vendor data bytes allowed (0-6) */
+
+ if (i >= 7)
+ {
+ AslError (ASL_ERROR, ASL_MSG_VENDOR_LIST, InitializerOp, NULL);
+
+ /* Eat the excess initializers */
+
+ while (InitializerOp)
+ {
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+ break;
+ }
+
+ VendorData[i] = (UINT8) InitializerOp->Asl.Value.Integer;
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ /* Adjust the Rnode buffer size, so correct number of bytes are emitted */
+
+ Rnode->BufferLength -= (7 - i);
+
+ /* Set the length in the Type Tag */
+
+ Descriptor->VendorSmall.DescriptorType |= (UINT8) i;
+ return (Rnode);
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslrestype2.c b/sys/contrib/dev/acpica/compiler/aslrestype2.c
new file mode 100644
index 0000000..c42e4a9
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslrestype2.c
@@ -0,0 +1,2842 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslrestype2 - Long (type2) resource templates and descriptors
+ * $Revision: 1.51 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslrestype2")
+
+/* Local prototypes */
+
+static UINT16
+RsGetStringDataLength (
+ ACPI_PARSE_OBJECT *InitializerOp);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsGetStringDataLength
+ *
+ * PARAMETERS: InitializerOp - Start of a subtree of init nodes
+ *
+ * RETURN: Valid string length if a string node is found (otherwise 0)
+ *
+ * DESCRIPTION: In a list of peer nodes, find the first one that contains a
+ * string and return the length of the string.
+ *
+ ******************************************************************************/
+
+static UINT16
+RsGetStringDataLength (
+ ACPI_PARSE_OBJECT *InitializerOp)
+{
+
+ while (InitializerOp)
+ {
+ if (InitializerOp->Asl.ParseOpcode == PARSEOP_STRING_LITERAL)
+ {
+ return ((UINT16) (strlen (InitializerOp->Asl.Value.String) + 1));
+ }
+ InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
+ }
+
+ return 0;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoDwordIoDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "DwordIO" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoDwordIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT16 StringLength = 0;
+ UINT32 OptionIndex = 0;
+ UINT8 *OptionalFields;
+ UINT32 i;
+ BOOLEAN ResSourceIndex = FALSE;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
+ Descriptor->Address32.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
+
+ /*
+ * Initial descriptor length -- may be enlarged if there are
+ * optional fields present
+ */
+ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
+ Descriptor->Address32.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_ADDRESS32) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 1: /* MinType */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
+ break;
+
+ case 2: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
+ break;
+
+ case 3: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
+ break;
+
+ case 4: /* Range Type */
+
+ RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 3);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0);
+ break;
+
+ case 5: /* Address Granularity */
+
+ Descriptor->Address32.Granularity =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
+ break;
+
+ case 6: /* Address Min */
+
+ Descriptor->Address32.Minimum =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
+ break;
+
+ case 7: /* Address Max */
+
+ Descriptor->Address32.Maximum =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
+ break;
+
+ case 8: /* Translation Offset */
+
+ Descriptor->Address32.TranslationOffset =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
+ break;
+
+ case 9: /* Address Length */
+
+ Descriptor->Address32.AddressLength =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
+ break;
+
+ case 10: /* ResSourceIndex [Optional Field - BYTE] */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ /* Found a valid ResourceSourceIndex */
+
+ OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
+ OptionIndex++;
+ Descriptor->Address32.ResourceLength++;
+ ResSourceIndex = TRUE;
+ }
+ break;
+
+ case 11: /* ResSource [Optional Field - STRING] */
+
+ if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
+ (InitializerOp->Asl.Value.String))
+ {
+ if (StringLength)
+ {
+ /* Found a valid ResourceSource */
+
+ Descriptor->Address32.ResourceLength = (UINT16)
+ (Descriptor->Address32.ResourceLength + StringLength);
+
+ strcpy ((char *)
+ &OptionalFields[OptionIndex],
+ InitializerOp->Asl.Value.String);
+
+ /* ResourceSourceIndex must also be valid */
+
+ if (!ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
+ InitializerOp, NULL);
+ }
+ }
+ }
+
+#if 0
+ /*
+ * Not a valid ResourceSource, ResourceSourceIndex must also
+ * be invalid
+ */
+ else if (ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
+ InitializerOp, NULL);
+ }
+#endif
+ break;
+
+ case 12: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ case 13: /* Type */
+
+ RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 4, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 4);
+ break;
+
+ case 14: /* Translation Type */
+
+ RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
+ OptionIndex + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoDwordMemoryDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "DwordMemory" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoDwordMemoryDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 *OptionalFields;
+ UINT16 StringLength = 0;
+ UINT32 OptionIndex = 0;
+ UINT32 i;
+ BOOLEAN ResSourceIndex = FALSE;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
+ Descriptor->Address32.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
+
+ /*
+ * Initial descriptor length -- may be enlarged if there are
+ * optional fields present
+ */
+ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
+ Descriptor->Address32.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_ADDRESS32) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 1: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
+ break;
+
+ case 2: /* MinType */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
+ break;
+
+ case 3: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
+ break;
+
+ case 4: /* Memory Type */
+
+ RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 1);
+ break;
+
+ case 5: /* Read/Write Type */
+
+ RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 0, 1);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 0);
+ break;
+
+ case 6: /* Address Granularity */
+
+ Descriptor->Address32.Granularity =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
+ break;
+
+ case 7: /* Min Address */
+
+ Descriptor->Address32.Minimum =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
+ break;
+
+ case 8: /* Max Address */
+
+ Descriptor->Address32.Maximum =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
+ break;
+
+ case 9: /* Translation Offset */
+
+ Descriptor->Address32.TranslationOffset =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
+ break;
+
+ case 10: /* Address Length */
+
+ Descriptor->Address32.AddressLength =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
+ break;
+
+ case 11: /* ResSourceIndex [Optional Field - BYTE] */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
+ OptionIndex++;
+ Descriptor->Address32.ResourceLength++;
+ ResSourceIndex = TRUE;
+ }
+ break;
+
+ case 12: /* ResSource [Optional Field - STRING] */
+
+ if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
+ (InitializerOp->Asl.Value.String))
+ {
+ if (StringLength)
+ {
+ Descriptor->Address32.ResourceLength = (UINT16)
+ (Descriptor->Address32.ResourceLength + StringLength);
+
+ strcpy ((char *)
+ &OptionalFields[OptionIndex],
+ InitializerOp->Asl.Value.String);
+
+ /* ResourceSourceIndex must also be valid */
+
+ if (!ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
+ InitializerOp, NULL);
+ }
+ }
+ }
+
+#if 0
+ /*
+ * Not a valid ResourceSource, ResourceSourceIndex must also
+ * be invalid
+ */
+ else if (ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
+ InitializerOp, NULL);
+ }
+#endif
+ break;
+
+ case 13: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+
+ case 14: /* Address Range */
+
+ RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 3);
+ break;
+
+ case 15: /* Type */
+
+ RsSetFlagBits (&Descriptor->Address32.SpecificFlags, InitializerOp, 5, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.SpecificFlags), 5);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
+ OptionIndex + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoDwordSpaceDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "DwordSpace" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoDwordSpaceDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 *OptionalFields;
+ UINT16 StringLength = 0;
+ UINT32 OptionIndex = 0;
+ UINT32 i;
+ BOOLEAN ResSourceIndex = FALSE;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_ADDRESS32) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Address32.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS32;
+
+ /*
+ * Initial descriptor length -- may be enlarged if there are
+ * optional fields present
+ */
+ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS32);
+ Descriptor->Address32.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_ADDRESS32) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Type */
+
+ Descriptor->Address32.ResourceType =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ break;
+
+ case 1: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 2: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 1);
+ break;
+
+ case 3: /* MinType */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 2);
+ break;
+
+ case 4: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->Address32.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Flags), 3);
+ break;
+
+ case 5: /* Type-Specific flags */
+
+ Descriptor->Address32.SpecificFlags =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ break;
+
+ case 6: /* Address Granularity */
+
+ Descriptor->Address32.Granularity =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Granularity));
+ break;
+
+ case 7: /* Min Address */
+
+ Descriptor->Address32.Minimum =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Minimum));
+ break;
+
+ case 8: /* Max Address */
+
+ Descriptor->Address32.Maximum =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.Maximum));
+ break;
+
+ case 9: /* Translation Offset */
+
+ Descriptor->Address32.TranslationOffset =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.TranslationOffset));
+ break;
+
+ case 10: /* Address Length */
+
+ Descriptor->Address32.AddressLength =
+ (UINT32) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address32.AddressLength));
+ break;
+
+ case 11: /* ResSourceIndex [Optional Field - BYTE] */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
+ OptionIndex++;
+ Descriptor->Address32.ResourceLength++;
+ ResSourceIndex = TRUE;
+ }
+ break;
+
+ case 12: /* ResSource [Optional Field - STRING] */
+
+ if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
+ (InitializerOp->Asl.Value.String))
+ {
+ if (StringLength)
+ {
+ Descriptor->Address32.ResourceLength = (UINT16)
+ (Descriptor->Address32.ResourceLength + StringLength);
+
+ strcpy ((char *)
+ &OptionalFields[OptionIndex],
+ InitializerOp->Asl.Value.String);
+
+ /* ResourceSourceIndex must also be valid */
+
+ if (!ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
+ InitializerOp, NULL);
+ }
+ }
+ }
+
+#if 0
+ /*
+ * Not a valid ResourceSource, ResourceSourceIndex must also
+ * be invalid
+ */
+ else if (ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
+ InitializerOp, NULL);
+ }
+#endif
+ break;
+
+ case 13: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST,
+ InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS32) +
+ OptionIndex + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoExtendedIoDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "ExtendedIO" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoExtendedIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT16 StringLength = 0;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
+ Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
+ Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
+
+ Descriptor->ExtAddress64.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 1: /* MinType */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
+ break;
+
+ case 2: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
+ break;
+
+ case 3: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
+ break;
+
+ case 4: /* Range Type */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 3);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0);
+ break;
+
+ case 5: /* Address Granularity */
+
+ Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
+ break;
+
+ case 6: /* Address Min */
+
+ Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
+ break;
+
+ case 7: /* Address Max */
+
+ Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
+ break;
+
+ case 8: /* Translation Offset */
+
+ Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
+ break;
+
+ case 9: /* Address Length */
+
+ Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
+ break;
+
+ case 10: /* Type-Specific Attributes */
+
+ Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
+ break;
+
+ case 11: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ case 12: /* Type */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 4, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 4);
+ break;
+
+ case 13: /* Translation Type */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoExtendedMemoryDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "ExtendedMemory" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoExtendedMemoryDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT16 StringLength = 0;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
+ Descriptor->ExtAddress64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
+ Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
+
+ Descriptor->ExtAddress64.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 1: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
+ break;
+
+ case 2: /* MinType */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
+ break;
+
+ case 3: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
+ break;
+
+ case 4: /* Memory Type */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 1);
+ break;
+
+ case 5: /* Read/Write Type */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 0, 1);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 0);
+ break;
+
+ case 6: /* Address Granularity */
+
+ Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
+ break;
+
+ case 7: /* Min Address */
+
+ Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
+ break;
+
+ case 8: /* Max Address */
+
+ Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
+ break;
+
+ case 9: /* Translation Offset */
+
+ Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
+ break;
+
+ case 10: /* Address Length */
+
+ Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
+ break;
+
+ case 11: /* Type-Specific Attributes */
+
+ Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
+ break;
+
+ case 12: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+
+ case 13: /* Address Range */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 3);
+ break;
+
+ case 14: /* Type */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.SpecificFlags, InitializerOp, 5, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.SpecificFlags), 5);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoExtendedSpaceDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "ExtendedSpace" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoExtendedSpaceDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT16 StringLength = 0;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->ExtAddress64.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64;
+ Descriptor->ExtAddress64.RevisionID = AML_RESOURCE_EXTENDED_ADDRESS_REVISION;
+
+ Descriptor->ExtAddress64.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Type */
+
+ Descriptor->ExtAddress64.ResourceType =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ break;
+
+ case 1: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 2: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 1);
+ break;
+
+ case 3: /* MinType */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 2);
+ break;
+
+ case 4: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->ExtAddress64.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Flags), 3);
+ break;
+
+ case 5: /* Type-Specific flags */
+
+ Descriptor->ExtAddress64.SpecificFlags =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ break;
+
+ case 6: /* Address Granularity */
+
+ Descriptor->ExtAddress64.Granularity = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Granularity));
+ break;
+
+ case 7: /* Min Address */
+
+ Descriptor->ExtAddress64.Minimum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Minimum));
+ break;
+
+ case 8: /* Max Address */
+
+ Descriptor->ExtAddress64.Maximum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.Maximum));
+ break;
+
+ case 9: /* Translation Offset */
+
+ Descriptor->ExtAddress64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TranslationOffset));
+ break;
+
+ case 10: /* Address Length */
+
+ Descriptor->ExtAddress64.AddressLength = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.AddressLength));
+ break;
+
+ case 11: /* Type-Specific Attributes */
+
+ Descriptor->ExtAddress64.TypeSpecific = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TYPESPECIFICATTRIBUTES,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtAddress64.TypeSpecific));
+ break;
+
+ case 12: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_EXTENDED_ADDRESS64) + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoQwordIoDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "QwordIO" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoQwordIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 *OptionalFields;
+ UINT16 StringLength = 0;
+ UINT32 OptionIndex = 0;
+ UINT32 i;
+ BOOLEAN ResSourceIndex = FALSE;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
+ Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
+
+ /*
+ * Initial descriptor length -- may be enlarged if there are
+ * optional fields present
+ */
+ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
+ Descriptor->Address64.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_ADDRESS64) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 1: /* MinType */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
+ break;
+
+ case 2: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
+ break;
+
+ case 3: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
+ break;
+
+ case 4: /* Range Type */
+
+ RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 3);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0);
+ break;
+
+ case 5: /* Address Granularity */
+
+ Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
+ break;
+
+ case 6: /* Address Min */
+
+ Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
+ break;
+
+ case 7: /* Address Max */
+
+ Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
+ break;
+
+ case 8: /* Translation Offset */
+
+ Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
+ break;
+
+ case 9: /* Address Length */
+
+ Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
+ break;
+
+ case 10: /* ResSourceIndex [Optional Field - BYTE] */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
+ OptionIndex++;
+ Descriptor->Address64.ResourceLength++;
+ ResSourceIndex = TRUE;
+ }
+ break;
+
+ case 11: /* ResSource [Optional Field - STRING] */
+
+ if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
+ (InitializerOp->Asl.Value.String))
+ {
+ if (StringLength)
+ {
+ Descriptor->Address64.ResourceLength = (UINT16)
+ (Descriptor->Address64.ResourceLength + StringLength);
+
+ strcpy ((char *)
+ &OptionalFields[OptionIndex],
+ InitializerOp->Asl.Value.String);
+
+ /* ResourceSourceIndex must also be valid */
+
+ if (!ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
+ InitializerOp, NULL);
+ }
+ }
+ }
+
+#if 0
+ /*
+ * Not a valid ResourceSource, ResourceSourceIndex must also
+ * be invalid
+ */
+ else if (ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
+ InitializerOp, NULL);
+ }
+#endif
+ break;
+
+ case 12: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ case 13: /* Type */
+
+ RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 4, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 4);
+ break;
+
+ case 14: /* Translation Type */
+
+ RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
+ OptionIndex + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoQwordMemoryDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "QwordMemory" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoQwordMemoryDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 *OptionalFields;
+ UINT16 StringLength = 0;
+ UINT32 OptionIndex = 0;
+ UINT32 i;
+ BOOLEAN ResSourceIndex = FALSE;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
+ Descriptor->Address64.ResourceType = ACPI_ADDRESS_TYPE_MEMORY_RANGE;
+
+ /*
+ * Initial descriptor length -- may be enlarged if there are
+ * optional fields present
+ */
+ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
+ Descriptor->Address64.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_ADDRESS64) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 1: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
+ break;
+
+ case 2: /* MinType */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
+ break;
+
+ case 3: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
+ break;
+
+ case 4: /* Memory Type */
+
+ RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 1);
+ break;
+
+ case 5: /* Read/Write Type */
+
+ RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 0, 1);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_READWRITETYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 0);
+ break;
+
+ case 6: /* Address Granularity */
+
+ Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
+ break;
+
+ case 7: /* Min Address */
+
+ Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
+ break;
+
+ case 8: /* Max Address */
+
+ Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
+ break;
+
+ case 9: /* Translation Offset */
+
+ Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
+ break;
+
+ case 10: /* Address Length */
+
+ Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
+ break;
+
+ case 11: /* ResSourceIndex [Optional Field - BYTE] */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
+ OptionIndex++;
+ Descriptor->Address64.ResourceLength++;
+ ResSourceIndex = TRUE;
+ }
+ break;
+
+ case 12: /* ResSource [Optional Field - STRING] */
+
+ if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
+ (InitializerOp->Asl.Value.String))
+ {
+ if (StringLength)
+ {
+ Descriptor->Address64.ResourceLength = (UINT16)
+ (Descriptor->Address64.ResourceLength + StringLength);
+
+ strcpy ((char *)
+ &OptionalFields[OptionIndex],
+ InitializerOp->Asl.Value.String);
+
+ /* ResourceSourceIndex must also be valid */
+
+ if (!ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
+ InitializerOp, NULL);
+ }
+ }
+ }
+
+#if 0
+ /*
+ * Not a valid ResourceSource, ResourceSourceIndex must also
+ * be invalid
+ */
+ else if (ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
+ InitializerOp, NULL);
+ }
+#endif
+ break;
+
+ case 13: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+
+ case 14: /* Address Range */
+
+ RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MEMATTRIBUTES,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 3);
+ break;
+
+ case 15: /* Type */
+
+ RsSetFlagBits (&Descriptor->Address64.SpecificFlags, InitializerOp, 5, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.SpecificFlags), 5);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
+ OptionIndex + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoQwordSpaceDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "QwordSpace" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoQwordSpaceDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 *OptionalFields;
+ UINT16 StringLength = 0;
+ UINT32 OptionIndex = 0;
+ UINT32 i;
+ BOOLEAN ResSourceIndex = FALSE;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_ADDRESS64) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Address64.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS64;
+
+ /*
+ * Initial descriptor length -- may be enlarged if there are
+ * optional fields present
+ */
+ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS64);
+ Descriptor->Address64.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_ADDRESS64) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Type */
+
+ Descriptor->Address64.ResourceType =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ break;
+
+ case 1: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 2: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 1);
+ break;
+
+ case 3: /* MinType */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 2);
+ break;
+
+ case 4: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->Address64.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Flags), 3);
+ break;
+
+ case 5: /* Type-Specific flags */
+
+ Descriptor->Address64.SpecificFlags =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ break;
+
+ case 6: /* Address Granularity */
+
+ Descriptor->Address64.Granularity = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Granularity));
+ break;
+
+ case 7: /* Min Address */
+
+ Descriptor->Address64.Minimum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Minimum));
+ break;
+
+ case 8: /* Max Address */
+
+ Descriptor->Address64.Maximum = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.Maximum));
+ break;
+
+ case 9: /* Translation Offset */
+
+ Descriptor->Address64.TranslationOffset = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.TranslationOffset));
+ break;
+
+ case 10: /* Address Length */
+
+ Descriptor->Address64.AddressLength = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address64.AddressLength));
+ break;
+
+ case 11: /* ResSourceIndex [Optional Field - BYTE] */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
+ OptionIndex++;
+ Descriptor->Address64.ResourceLength++;
+ ResSourceIndex = TRUE;
+ }
+ break;
+
+ case 12: /* ResSource [Optional Field - STRING] */
+
+ if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
+ (InitializerOp->Asl.Value.String))
+ {
+ if (StringLength)
+ {
+ Descriptor->Address64.ResourceLength = (UINT16)
+ (Descriptor->Address64.ResourceLength + StringLength);
+
+ strcpy ((char *)
+ &OptionalFields[OptionIndex],
+ InitializerOp->Asl.Value.String);
+
+ /* ResourceSourceIndex must also be valid */
+
+ if (!ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
+ InitializerOp, NULL);
+ }
+ }
+ }
+
+#if 0
+ /*
+ * Not a valid ResourceSource, ResourceSourceIndex must also
+ * be invalid
+ */
+ else if (ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
+ InitializerOp, NULL);
+ }
+#endif
+ break;
+
+ case 13: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS64) +
+ OptionIndex + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoWordIoDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "WordIO" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoWordIoDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 *OptionalFields;
+ UINT16 StringLength = 0;
+ UINT32 OptionIndex = 0;
+ UINT32 i;
+ BOOLEAN ResSourceIndex = FALSE;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
+ Descriptor->Address16.ResourceType = ACPI_ADDRESS_TYPE_IO_RANGE;
+
+ /*
+ * Initial descriptor length -- may be enlarged if there are
+ * optional fields present
+ */
+ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
+ Descriptor->Address16.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_ADDRESS16) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 1: /* MinType */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
+ break;
+
+ case 2: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
+ break;
+
+ case 3: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
+ break;
+
+ case 4: /* Range Type */
+
+ RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 0, 3);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_RANGETYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 0);
+ break;
+
+ case 5: /* Address Granularity */
+
+ Descriptor->Address16.Granularity = (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
+ break;
+
+ case 6: /* Address Min */
+
+ Descriptor->Address16.Minimum = (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
+ break;
+
+ case 7: /* Address Max */
+
+ Descriptor->Address16.Maximum = (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
+ break;
+
+ case 8: /* Translation Offset */
+
+ Descriptor->Address16.TranslationOffset = (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
+ break;
+
+ case 9: /* Address Length */
+
+ Descriptor->Address16.AddressLength = (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
+ break;
+
+ case 10: /* ResSourceIndex [Optional Field - BYTE] */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
+ OptionIndex++;
+ Descriptor->Address16.ResourceLength++;
+ ResSourceIndex = TRUE;
+ }
+ break;
+
+ case 11: /* ResSource [Optional Field - STRING] */
+
+ if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
+ (InitializerOp->Asl.Value.String))
+ {
+ if (StringLength)
+ {
+ Descriptor->Address16.ResourceLength = (UINT16)
+ (Descriptor->Address16.ResourceLength + StringLength);
+
+ strcpy ((char *)
+ &OptionalFields[OptionIndex],
+ InitializerOp->Asl.Value.String);
+
+ /* ResourceSourceIndex must also be valid */
+
+ if (!ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
+ InitializerOp, NULL);
+ }
+ }
+ }
+
+#if 0
+ /*
+ * Not a valid ResourceSource, ResourceSourceIndex must also
+ * be invalid
+ */
+ else if (ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
+ InitializerOp, NULL);
+ }
+#endif
+ break;
+
+ case 12: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ case 13: /* Type */
+
+ RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 4, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 4);
+ break;
+
+ case 14: /* Translation Type */
+
+ RsSetFlagBits (&Descriptor->Address16.SpecificFlags, InitializerOp, 5, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_TRANSTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.SpecificFlags), 5);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
+ OptionIndex + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoWordBusNumberDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "WordBusNumber" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoWordBusNumberDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 *OptionalFields;
+ UINT16 StringLength = 0;
+ UINT32 OptionIndex = 0;
+ UINT32 i;
+ BOOLEAN ResSourceIndex = FALSE;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
+ Descriptor->Address16.ResourceType = ACPI_ADDRESS_TYPE_BUS_NUMBER_RANGE;
+
+ /*
+ * Initial descriptor length -- may be enlarged if there are
+ * optional fields present
+ */
+ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
+ Descriptor->Address16.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_ADDRESS16) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 1: /* MinType */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
+ break;
+
+ case 2: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
+ break;
+
+ case 3: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
+ break;
+
+ case 4: /* Address Granularity */
+
+ Descriptor->Address16.Granularity =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
+ break;
+
+ case 5: /* Min Address */
+
+ Descriptor->Address16.Minimum =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
+ break;
+
+ case 6: /* Max Address */
+
+ Descriptor->Address16.Maximum =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
+ break;
+
+ case 7: /* Translation Offset */
+
+ Descriptor->Address16.TranslationOffset =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
+ break;
+
+ case 8: /* Address Length */
+
+ Descriptor->Address16.AddressLength =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
+ break;
+
+ case 9: /* ResSourceIndex [Optional Field - BYTE] */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
+ OptionIndex++;
+ Descriptor->Address16.ResourceLength++;
+ ResSourceIndex = TRUE;
+ }
+ break;
+
+ case 10: /* ResSource [Optional Field - STRING] */
+
+ if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
+ (InitializerOp->Asl.Value.String))
+ {
+ if (StringLength)
+ {
+ Descriptor->Address16.ResourceLength = (UINT16)
+ (Descriptor->Address16.ResourceLength + StringLength);
+
+ strcpy ((char *)
+ &OptionalFields[OptionIndex],
+ InitializerOp->Asl.Value.String);
+
+ /* ResourceSourceIndex must also be valid */
+
+ if (!ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
+ InitializerOp, NULL);
+ }
+ }
+ }
+
+#if 0
+ /*
+ * Not a valid ResourceSource, ResourceSourceIndex must also
+ * be invalid
+ */
+ else if (ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
+ InitializerOp, NULL);
+ }
+#endif
+ break;
+
+ case 11: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
+ OptionIndex + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoWordSpaceDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "WordSpace" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoWordSpaceDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 *OptionalFields;
+ UINT16 StringLength = 0;
+ UINT32 OptionIndex = 0;
+ UINT32 i;
+ BOOLEAN ResSourceIndex = FALSE;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+
+ Rnode = RsAllocateResourceNode (
+ sizeof (AML_RESOURCE_ADDRESS16) + 1 + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->Address16.DescriptorType = ACPI_RESOURCE_NAME_ADDRESS16;
+
+ /*
+ * Initial descriptor length -- may be enlarged if there are
+ * optional fields present
+ */
+ OptionalFields = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_ADDRESS16);
+ Descriptor->Address16.ResourceLength = (UINT16)
+ (sizeof (AML_RESOURCE_ADDRESS16) -
+ sizeof (AML_RESOURCE_LARGE_HEADER));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Type */
+
+ Descriptor->Address16.ResourceType =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ break;
+
+ case 1: /* Resource Usage */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 2: /* DecodeType */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_DECODE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 1);
+ break;
+
+ case 3: /* MinType */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MINTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 2);
+ break;
+
+ case 4: /* MaxType */
+
+ RsSetFlagBits (&Descriptor->Address16.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_MAXTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Flags), 3);
+ break;
+
+ case 5: /* Type-Specific flags */
+
+ Descriptor->Address16.SpecificFlags =
+ (UINT8) InitializerOp->Asl.Value.Integer;
+ break;
+
+ case 6: /* Address Granularity */
+
+ Descriptor->Address16.Granularity =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_GRANULARITY,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Granularity));
+ break;
+
+ case 7: /* Min Address */
+
+ Descriptor->Address16.Minimum =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MINADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Minimum));
+ break;
+
+ case 8: /* Max Address */
+
+ Descriptor->Address16.Maximum =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_MAXADDR,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.Maximum));
+ break;
+
+ case 9: /* Translation Offset */
+
+ Descriptor->Address16.TranslationOffset =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_TRANSLATION,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.TranslationOffset));
+ break;
+
+ case 10: /* Address Length */
+
+ Descriptor->Address16.AddressLength =
+ (UINT16) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_LENGTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (Address16.AddressLength));
+ break;
+
+ case 11: /* ResSourceIndex [Optional Field - BYTE] */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ OptionalFields[0] = (UINT8) InitializerOp->Asl.Value.Integer;
+ OptionIndex++;
+ Descriptor->Address16.ResourceLength++;
+ ResSourceIndex = TRUE;
+ }
+ break;
+
+ case 12: /* ResSource [Optional Field - STRING] */
+
+ if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
+ (InitializerOp->Asl.Value.String))
+ {
+ if (StringLength)
+ {
+ Descriptor->Address16.ResourceLength = (UINT16)
+ (Descriptor->Address16.ResourceLength + StringLength);
+
+ strcpy ((char *)
+ &OptionalFields[OptionIndex],
+ InitializerOp->Asl.Value.String);
+
+ /* ResourceSourceIndex must also be valid */
+
+ if (!ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
+ InitializerOp, NULL);
+ }
+ }
+ }
+
+#if 0
+ /*
+ * Not a valid ResourceSource, ResourceSourceIndex must also
+ * be invalid
+ */
+ else if (ResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
+ InitializerOp, NULL);
+ }
+#endif
+ break;
+
+ case 13: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ Rnode->BufferLength = sizeof (AML_RESOURCE_ADDRESS16) +
+ OptionIndex + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoInterruptDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "Interrupt" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoInterruptDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ AML_RESOURCE *Rover = NULL;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT16 StringLength = 0;
+ UINT32 OptionIndex = 0;
+ UINT32 i;
+ BOOLEAN HasResSourceIndex = FALSE;
+ UINT8 ResSourceIndex = 0;
+ UINT8 *ResSourceString = NULL;
+
+
+ InitializerOp = Op->Asl.Child;
+ StringLength = RsGetStringDataLength (InitializerOp);
+ if (StringLength)
+ {
+ /* Make room for the ResourceSourceIndex */
+
+ OptionIndex++;
+ }
+
+ /* Count the interrupt numbers */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ InitializerOp = ASL_GET_PEER_NODE (InitializerOp);
+ if (i <= 6)
+ {
+ continue;
+ }
+
+ OptionIndex += 4;
+ }
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_EXTENDED_IRQ) +
+ 1 + OptionIndex + StringLength);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->ExtendedIrq.DescriptorType = ACPI_RESOURCE_NAME_EXTENDED_IRQ;
+
+ /*
+ * Initial descriptor length -- may be enlarged if there are
+ * optional fields present
+ */
+ Descriptor->ExtendedIrq.ResourceLength = 2; /* Flags and table length byte */
+ Descriptor->ExtendedIrq.InterruptCount = 0;
+
+ Rover = ACPI_CAST_PTR (AML_RESOURCE,
+ (&(Descriptor->ExtendedIrq.Interrupts[0])));
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Resource Usage (Default: consumer (1) */
+
+ RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 0, 1);
+ break;
+
+ case 1: /* Interrupt Type (or Mode - edge/level) */
+
+ RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 1, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTTYPE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtendedIrq.Flags), 1);
+ break;
+
+ case 2: /* Interrupt Level (or Polarity - Active high/low) */
+
+ RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 2, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTLEVEL,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtendedIrq.Flags), 2);
+ break;
+
+ case 3: /* Share Type - Default: exclusive (0) */
+
+ RsSetFlagBits (&Descriptor->ExtendedIrq.Flags, InitializerOp, 3, 0);
+ RsCreateBitField (InitializerOp, ACPI_RESTAG_INTERRUPTSHARE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (ExtendedIrq.Flags), 3);
+ break;
+
+ case 4: /* ResSourceIndex [Optional Field - BYTE] */
+
+ if (InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG)
+ {
+ HasResSourceIndex = TRUE;
+ ResSourceIndex = (UINT8) InitializerOp->Asl.Value.Integer;
+ }
+ break;
+
+ case 5: /* ResSource [Optional Field - STRING] */
+
+ if ((InitializerOp->Asl.ParseOpcode != PARSEOP_DEFAULT_ARG) &&
+ (InitializerOp->Asl.Value.String))
+ {
+ if (StringLength)
+ {
+ ResSourceString = (UINT8 *) InitializerOp->Asl.Value.String;
+ }
+
+ /* ResourceSourceIndex must also be valid */
+
+ if (!HasResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_INDEX,
+ InitializerOp, NULL);
+ }
+ }
+
+#if 0
+ /*
+ * Not a valid ResourceSource, ResourceSourceIndex must also
+ * be invalid
+ */
+ else if (HasResSourceIndex)
+ {
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_SOURCE,
+ InitializerOp, NULL);
+ }
+#endif
+ break;
+
+ case 6: /* ResourceTag */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+ /*
+ * Interrupt Numbers come through here, repeatedly
+ */
+
+ /* Maximum 255 interrupts allowed for this descriptor */
+
+ if (Descriptor->ExtendedIrq.InterruptCount == 255)
+ {
+ AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_LIST,
+ InitializerOp, NULL);
+ return (Rnode);
+ }
+
+ /* Each interrupt number must be a 32-bit value */
+
+ if (InitializerOp->Asl.Value.Integer > ACPI_UINT32_MAX)
+ {
+ AslError (ASL_ERROR, ASL_MSG_EX_INTERRUPT_NUMBER,
+ InitializerOp, NULL);
+ }
+
+ /* Save the integer and move pointer to the next one */
+
+ Rover->DwordItem = (UINT32) InitializerOp->Asl.Value.Integer;
+ Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->DwordItem), 4);
+ Descriptor->ExtendedIrq.InterruptCount++;
+ Descriptor->ExtendedIrq.ResourceLength += 4;
+
+ /* Case 7: First interrupt number in list */
+
+ if (i == 7)
+ {
+ /* Check now for duplicates in list */
+
+ RsCheckListForDuplicates (InitializerOp);
+
+ /* Create a named field at the start of the list */
+
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_INTERRUPT,
+ CurrentByteOffset +
+ ASL_RESDESC_OFFSET (ExtendedIrq.Interrupts[0]));
+ }
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+
+ /* Add optional ResSourceIndex if present */
+
+ if (HasResSourceIndex)
+ {
+ Rover->ByteItem = ResSourceIndex;
+ Rover = ACPI_ADD_PTR (AML_RESOURCE, &(Rover->ByteItem), 1);
+ Descriptor->ExtendedIrq.ResourceLength += 1;
+ }
+
+ /* Add optional ResSource string if present */
+
+ if (StringLength && ResSourceString)
+ {
+
+ strcpy ((char *) Rover, (char *) ResSourceString);
+ Rover = ACPI_ADD_PTR (
+ AML_RESOURCE, &(Rover->ByteItem), StringLength);
+
+ Descriptor->ExtendedIrq.ResourceLength = (UINT16)
+ (Descriptor->ExtendedIrq.ResourceLength + StringLength);
+ }
+
+ Rnode->BufferLength = (ASL_RESDESC_OFFSET (ExtendedIrq.Interrupts[0]) -
+ ASL_RESDESC_OFFSET (ExtendedIrq.DescriptorType))
+ + OptionIndex + StringLength;
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoVendorLargeDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "VendorLong" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoVendorLargeDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT8 *VendorData;
+ UINT32 i;
+
+
+ /* Count the number of data bytes */
+
+ InitializerOp = Op->Asl.Child;
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+
+ for (i = 0; InitializerOp; i++)
+ {
+ if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+ {
+ break;
+ }
+ InitializerOp = InitializerOp->Asl.Next;
+ }
+
+ InitializerOp = Op->Asl.Child;
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_VENDOR_LARGE) + i);
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->VendorLarge.DescriptorType = ACPI_RESOURCE_NAME_VENDOR_LARGE;
+ Descriptor->VendorLarge.ResourceLength = (UINT16) i;
+
+ /* Point to end-of-descriptor for vendor data */
+
+ VendorData = ((UINT8 *) Descriptor) + sizeof (AML_RESOURCE_LARGE_HEADER);
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ if (InitializerOp->Asl.ParseOpcode == PARSEOP_DEFAULT_ARG)
+ {
+ break;
+ }
+
+ VendorData[i] = (UINT8) InitializerOp->Asl.Value.Integer;
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+
+ return (Rnode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: RsDoGeneralRegisterDescriptor
+ *
+ * PARAMETERS: Op - Parent resource descriptor parse node
+ * CurrentByteOffset - Offset into the resource template AML
+ * buffer (to track references to the desc)
+ *
+ * RETURN: Completed resource node
+ *
+ * DESCRIPTION: Construct a long "Register" descriptor
+ *
+ ******************************************************************************/
+
+ASL_RESOURCE_NODE *
+RsDoGeneralRegisterDescriptor (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 CurrentByteOffset)
+{
+ AML_RESOURCE *Descriptor;
+ ACPI_PARSE_OBJECT *InitializerOp;
+ ASL_RESOURCE_NODE *Rnode;
+ UINT32 i;
+
+
+ InitializerOp = Op->Asl.Child;
+ Rnode = RsAllocateResourceNode (sizeof (AML_RESOURCE_GENERIC_REGISTER));
+
+ Descriptor = Rnode->Buffer;
+ Descriptor->GenericReg.DescriptorType = ACPI_RESOURCE_NAME_GENERIC_REGISTER;
+ Descriptor->GenericReg.ResourceLength = 12;
+
+ /* Process all child initialization nodes */
+
+ for (i = 0; InitializerOp; i++)
+ {
+ switch (i)
+ {
+ case 0: /* Address space */
+
+ Descriptor->GenericReg.AddressSpaceId = (UINT8) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_ADDRESSSPACE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.AddressSpaceId));
+ break;
+
+ case 1: /* Register Bit Width */
+
+ Descriptor->GenericReg.BitWidth = (UINT8) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_REGISTERBITWIDTH,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.BitWidth));
+ break;
+
+ case 2: /* Register Bit Offset */
+
+ Descriptor->GenericReg.BitOffset = (UINT8) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_REGISTERBITOFFSET,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.BitOffset));
+ break;
+
+ case 3: /* Register Address */
+
+ Descriptor->GenericReg.Address = InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_ADDRESS,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.Address));
+ break;
+
+ case 4: /* Access Size (ACPI 3.0) */
+
+ Descriptor->GenericReg.AccessSize = (UINT8) InitializerOp->Asl.Value.Integer;
+ RsCreateByteField (InitializerOp, ACPI_RESTAG_ACCESSSIZE,
+ CurrentByteOffset + ASL_RESDESC_OFFSET (GenericReg.AccessSize));
+ break;
+
+ case 5: /* ResourceTag (ACPI 3.0b) */
+
+ UtAttachNamepathToOwner (Op, InitializerOp);
+ break;
+
+ default:
+
+ AslError (ASL_ERROR, ASL_MSG_RESOURCE_LIST, InitializerOp, NULL);
+ break;
+ }
+
+ InitializerOp = RsCompleteNodeAndGetNext (InitializerOp);
+ }
+ return (Rnode);
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/aslstubs.c b/sys/contrib/dev/acpica/compiler/aslstubs.c
new file mode 100644
index 0000000..eb6b12a
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslstubs.c
@@ -0,0 +1,280 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslstubs - Stubs used to link to Aml interpreter
+ * $Revision: 1.20 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <stdio.h>
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/actables.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslstubs")
+
+
+/*
+ * Stubs to simplify linkage to the ACPI CA core subsystem.
+ * Things like Events, Global Lock, etc. are not used
+ * by the compiler, so they are stubbed out here.
+ */
+ACPI_PHYSICAL_ADDRESS
+AeLocalGetRootPointer (
+ void)
+{
+ return 0;
+}
+
+ACPI_STATUS
+AcpiDsMethodError (
+ ACPI_STATUS Status,
+ ACPI_WALK_STATE *WalkState)
+{
+ return (Status);
+}
+
+ACPI_STATUS
+AcpiDsMethodDataGetValue (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT **DestDesc)
+{
+ return (AE_OK);
+}
+
+ACPI_STATUS
+AcpiDsMethodDataGetNode (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE **Node)
+{
+ return (AE_OK);
+}
+
+ACPI_STATUS
+AcpiDsStoreObjectToLocal (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_OPERAND_OBJECT *SrcDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ return (AE_OK);
+}
+
+ACPI_STATUS
+AcpiEvDeleteGpeBlock (
+ ACPI_GPE_BLOCK_INFO *GpeBlock)
+{
+ return (AE_OK);
+}
+
+ACPI_STATUS
+AcpiEvQueueNotifyRequest (
+ ACPI_NAMESPACE_NODE *Node,
+ UINT32 NotifyValue)
+{
+ return (AE_OK);
+}
+
+BOOLEAN
+AcpiEvIsNotifyObject (
+ ACPI_NAMESPACE_NODE *Node)
+{
+ return (FALSE);
+}
+
+ACPI_STATUS
+AcpiEvAcquireGlobalLock(
+ UINT32 Timeout)
+{
+ return (AE_OK);
+}
+
+ACPI_STATUS
+AcpiEvReleaseGlobalLock(
+ void)
+{
+ return (AE_OK);
+}
+
+ACPI_STATUS
+AcpiEvInitializeRegion (
+ ACPI_OPERAND_OBJECT *RegionObj,
+ BOOLEAN AcpiNsLocked)
+{
+ return (AE_OK);
+}
+
+ACPI_STATUS
+AcpiEvCheckForWakeOnlyGpe (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo)
+{
+ return (AE_OK);
+}
+
+ACPI_STATUS
+AcpiExReadDataFromField (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **RetBufferDesc)
+{
+ return (AE_SUPPORT);
+}
+
+ACPI_STATUS
+AcpiExWriteDataToField (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc)
+{
+ return (AE_SUPPORT);
+}
+
+ACPI_STATUS
+AcpiExLoadTableOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT **ReturnDesc)
+{
+ return (AE_SUPPORT);
+}
+
+
+ACPI_STATUS
+AcpiExUnloadTable (
+ ACPI_OPERAND_OBJECT *DdbHandle)
+{
+ return (AE_SUPPORT);
+}
+
+ACPI_STATUS
+AcpiExLoadOp (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT *Target,
+ ACPI_WALK_STATE *WalkState)
+{
+ return (AE_SUPPORT);
+}
+
+ACPI_STATUS
+AcpiTbFindTable (
+ char *Signature,
+ char *OemId,
+ char *OemTableId,
+ ACPI_NATIVE_UINT *TableIndex)
+{
+ return (AE_SUPPORT);
+}
+
diff --git a/sys/contrib/dev/acpica/compiler/asltransform.c b/sys/contrib/dev/acpica/compiler/asltransform.c
new file mode 100644
index 0000000..b76a266
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/asltransform.c
@@ -0,0 +1,806 @@
+
+/******************************************************************************
+ *
+ * Module Name: asltransform - Parse tree transforms
+ * $Revision: 1.42 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("asltransform")
+
+/* Local prototypes */
+
+static void
+TrTransformSubtree (
+ ACPI_PARSE_OBJECT *Op);
+
+static char *
+TrAmlGetNextTempName (
+ ACPI_PARSE_OBJECT *Op,
+ UINT8 *TempCount);
+
+static void
+TrAmlInitLineNumbers (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_PARSE_OBJECT *Neighbor);
+
+static void
+TrAmlInitNode (
+ ACPI_PARSE_OBJECT *Op,
+ UINT16 ParseOpcode);
+
+static void
+TrAmlSetSubtreeParent (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_PARSE_OBJECT *Parent);
+
+static void
+TrAmlInsertPeer (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_PARSE_OBJECT *NewPeer);
+
+static void
+TrDoDefinitionBlock (
+ ACPI_PARSE_OBJECT *Op);
+
+static void
+TrDoSwitch (
+ ACPI_PARSE_OBJECT *StartNode);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrAmlGetNextTempName
+ *
+ * PARAMETERS: Op - Current parse op
+ * TempCount - Current temporary counter. Was originally
+ * per-module; Currently per method, could be
+ * expanded to per-scope.
+ *
+ * RETURN: A pointer to name (allocated here).
+ *
+ * DESCRIPTION: Generate an ACPI name of the form _T_x. These names are
+ * reserved for use by the ASL compiler. (_T_0 through _T_Z)
+ *
+ ******************************************************************************/
+
+static char *
+TrAmlGetNextTempName (
+ ACPI_PARSE_OBJECT *Op,
+ UINT8 *TempCount)
+{
+ char *TempName;
+
+
+ if (*TempCount >= (10+26)) /* 0-35 valid: 0-9 and A-Z for TempName[3] */
+ {
+ /* Too many temps */
+
+ AslError (ASL_ERROR, ASL_MSG_TOO_MANY_TEMPS, Op, NULL);
+ return (NULL);
+ }
+
+ TempName = UtLocalCalloc (5);
+
+ if (*TempCount < 10) /* 0-9 */
+ {
+ TempName[3] = (char) (*TempCount + '0');
+ }
+ else /* 10-35: A-Z */
+ {
+ TempName[3] = (char) (*TempCount + ('A' - 10));
+ }
+ (*TempCount)++;
+
+ /* First three characters are always "_T_" */
+
+ TempName[0] = '_';
+ TempName[1] = 'T';
+ TempName[2] = '_';
+
+ return (TempName);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrAmlInitLineNumbers
+ *
+ * PARAMETERS: Op - Op to be initialized
+ * Neighbor - Op used for initialization values
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Initialized the various line numbers for a parse node.
+ *
+ ******************************************************************************/
+
+static void
+TrAmlInitLineNumbers (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_PARSE_OBJECT *Neighbor)
+{
+
+ Op->Asl.EndLine = Neighbor->Asl.EndLine;
+ Op->Asl.EndLogicalLine = Neighbor->Asl.EndLogicalLine;
+ Op->Asl.LineNumber = Neighbor->Asl.LineNumber;
+ Op->Asl.LogicalByteOffset = Neighbor->Asl.LogicalByteOffset;
+ Op->Asl.LogicalLineNumber = Neighbor->Asl.LogicalLineNumber;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrAmlInitNode
+ *
+ * PARAMETERS: Op - Op to be initialized
+ * ParseOpcode - Opcode for this node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Initialize a node with the parse opcode and opcode name.
+ *
+ ******************************************************************************/
+
+static void
+TrAmlInitNode (
+ ACPI_PARSE_OBJECT *Op,
+ UINT16 ParseOpcode)
+{
+
+ Op->Asl.ParseOpcode = ParseOpcode;
+ UtSetParseOpName (Op);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrAmlSetSubtreeParent
+ *
+ * PARAMETERS: Op - First node in a list of peer nodes
+ * Parent - Parent of the subtree
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Set the parent for all peer nodes in a subtree
+ *
+ ******************************************************************************/
+
+static void
+TrAmlSetSubtreeParent (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_PARSE_OBJECT *Parent)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ Next = Op;
+ while (Next)
+ {
+ Next->Asl.Parent = Parent;
+ Next = Next->Asl.Next;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrAmlInsertPeer
+ *
+ * PARAMETERS: Op - First node in a list of peer nodes
+ * NewPeer - Peer node to insert
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Insert a new peer node into a list of peers.
+ *
+ ******************************************************************************/
+
+static void
+TrAmlInsertPeer (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_PARSE_OBJECT *NewPeer)
+{
+
+ NewPeer->Asl.Next = Op->Asl.Next;
+ Op->Asl.Next = NewPeer;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrAmlTransformWalk
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Parse tree walk to generate both the AML opcodes and the AML
+ * operands.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+TrAmlTransformWalk (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+
+ TrTransformSubtree (Op);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrTransformSubtree
+ *
+ * PARAMETERS: Op - The parent parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Prepare nodes to be output as AML data and operands. The more
+ * complex AML opcodes require processing of the child nodes
+ * (arguments/operands).
+ *
+ ******************************************************************************/
+
+static void
+TrTransformSubtree (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ if (Op->Asl.AmlOpcode == AML_RAW_DATA_BYTE)
+ {
+ return;
+ }
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_DEFINITIONBLOCK:
+ TrDoDefinitionBlock (Op);
+ break;
+
+ case PARSEOP_SWITCH:
+ TrDoSwitch (Op);
+ break;
+
+ case PARSEOP_METHOD:
+
+ /*
+ * TBD: Zero the tempname (_T_x) count. Probably shouldn't be a global,
+ * however
+ */
+ Gbl_TempCount = 0;
+ break;
+
+ default:
+ /* Nothing to do here for other opcodes */
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrDoDefinitionBlock
+ *
+ * PARAMETERS: Op - Parse node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Find the end of the definition block and set a global to this
+ * node. It is used by the compiler to insert compiler-generated
+ * names at the root level of the namespace.
+ *
+ ******************************************************************************/
+
+static void
+TrDoDefinitionBlock (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+ UINT32 i;
+
+
+ Next = Op->Asl.Child;
+ for (i = 0; i < 5; i++)
+ {
+ Next = Next->Asl.Next;
+ if (i == 0)
+ {
+ /*
+ * This is the table signature. Only the DSDT can be assumed
+ * to be at the root of the namespace; Therefore, namepath
+ * optimization can only be performed on the DSDT.
+ */
+ if (!ACPI_COMPARE_NAME (Next->Asl.Value.String, ACPI_SIG_DSDT))
+ {
+ Gbl_ReferenceOptimizationFlag = FALSE;
+ }
+ }
+ }
+
+ Gbl_FirstLevelInsertionNode = Next;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrDoSwitch
+ *
+ * PARAMETERS: StartNode - Parse node for SWITCH
+ *
+ * RETURN: None
+ *
+ *
+ * DESCRIPTION: Translate ASL SWITCH statement to if/else pairs. There is
+ * no actual AML opcode for SWITCH -- it must be simulated.
+ *
+ ******************************************************************************/
+
+static void
+TrDoSwitch (
+ ACPI_PARSE_OBJECT *StartNode)
+{
+ ACPI_PARSE_OBJECT *Next;
+ ACPI_PARSE_OBJECT *CaseOp = NULL;
+ ACPI_PARSE_OBJECT *CaseBlock = NULL;
+ ACPI_PARSE_OBJECT *DefaultOp = NULL;
+ ACPI_PARSE_OBJECT *CurrentParentNode;
+ ACPI_PARSE_OBJECT *Conditional = NULL;
+ ACPI_PARSE_OBJECT *Predicate;
+ ACPI_PARSE_OBJECT *Peer;
+ ACPI_PARSE_OBJECT *NewOp;
+ ACPI_PARSE_OBJECT *NewOp2;
+ char *PredicateValueName;
+ UINT16 Index;
+ UINT32 Btype;
+
+
+ /* Start node is the Switch() node */
+
+ CurrentParentNode = StartNode;
+
+ /* Create a new temp name of the form _T_x */
+
+ PredicateValueName = TrAmlGetNextTempName (StartNode, &Gbl_TempCount);
+ if (!PredicateValueName)
+ {
+ return;
+ }
+
+ /* First child is the Switch() predicate */
+
+ Next = StartNode->Asl.Child;
+
+ /*
+ * Examine the return type of the Switch Value -
+ * must be Integer/Buffer/String
+ */
+ Index = (UINT16) (Next->Asl.ParseOpcode - ASL_PARSE_OPCODE_BASE);
+ Btype = AslKeywordMapping[Index].AcpiBtype;
+ if ((Btype != ACPI_BTYPE_INTEGER) &&
+ (Btype != ACPI_BTYPE_STRING) &&
+ (Btype != ACPI_BTYPE_BUFFER))
+ {
+ AslError (ASL_WARNING, ASL_MSG_SWITCH_TYPE, Next, NULL);
+ Btype = ACPI_BTYPE_INTEGER;
+ }
+
+ /* CASE statements start at next child */
+
+ Peer = Next->Asl.Next;
+ while (Peer)
+ {
+ Next = Peer;
+ Peer = Next->Asl.Next;
+
+ if (Next->Asl.ParseOpcode == PARSEOP_CASE)
+ {
+ if (CaseOp)
+ {
+ /* Add an ELSE to complete the previous CASE */
+
+ if (!Conditional)
+ {
+ return;
+ }
+ NewOp = TrCreateLeafNode (PARSEOP_ELSE);
+ NewOp->Asl.Parent = Conditional->Asl.Parent;
+ TrAmlInitLineNumbers (NewOp, NewOp->Asl.Parent);
+
+ /* Link ELSE node as a peer to the previous IF */
+
+ TrAmlInsertPeer (Conditional, NewOp);
+ CurrentParentNode = NewOp;
+ }
+
+ CaseOp = Next;
+ Conditional = CaseOp;
+ CaseBlock = CaseOp->Asl.Child->Asl.Next;
+ Conditional->Asl.Child->Asl.Next = NULL;
+ Predicate = CaseOp->Asl.Child;
+
+ if ((Predicate->Asl.ParseOpcode == PARSEOP_PACKAGE) ||
+ (Predicate->Asl.ParseOpcode == PARSEOP_VAR_PACKAGE))
+ {
+ /*
+ * Convert the package declaration to this form:
+ *
+ * If (LNotEqual (Match (Package(<size>){<data>},
+ * MEQ, _T_x, MTR, Zero, Zero), Ones))
+ */
+ NewOp2 = TrCreateLeafNode (PARSEOP_MATCHTYPE_MEQ);
+ Predicate->Asl.Next = NewOp2;
+ TrAmlInitLineNumbers (NewOp2, Conditional);
+
+ NewOp = NewOp2;
+ NewOp2 = TrCreateValuedLeafNode (PARSEOP_NAMESTRING,
+ (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValueName));
+ NewOp->Asl.Next = NewOp2;
+ TrAmlInitLineNumbers (NewOp2, Predicate);
+
+ NewOp = NewOp2;
+ NewOp2 = TrCreateLeafNode (PARSEOP_MATCHTYPE_MTR);
+ NewOp->Asl.Next = NewOp2;
+ TrAmlInitLineNumbers (NewOp2, Predicate);
+
+ NewOp = NewOp2;
+ NewOp2 = TrCreateLeafNode (PARSEOP_ZERO);
+ NewOp->Asl.Next = NewOp2;
+ TrAmlInitLineNumbers (NewOp2, Predicate);
+
+ NewOp = NewOp2;
+ NewOp2 = TrCreateLeafNode (PARSEOP_ZERO);
+ NewOp->Asl.Next = NewOp2;
+ TrAmlInitLineNumbers (NewOp2, Predicate);
+
+ NewOp2 = TrCreateLeafNode (PARSEOP_MATCH);
+ NewOp2->Asl.Child = Predicate; /* PARSEOP_PACKAGE */
+ TrAmlInitLineNumbers (NewOp2, Conditional);
+ TrAmlSetSubtreeParent (Predicate, NewOp2);
+
+ NewOp = NewOp2;
+ NewOp2 = TrCreateLeafNode (PARSEOP_ONES);
+ NewOp->Asl.Next = NewOp2;
+ TrAmlInitLineNumbers (NewOp2, Conditional);
+
+ NewOp2 = TrCreateLeafNode (PARSEOP_LEQUAL);
+ NewOp2->Asl.Child = NewOp;
+ NewOp->Asl.Parent = NewOp2;
+ TrAmlInitLineNumbers (NewOp2, Conditional);
+ TrAmlSetSubtreeParent (NewOp, NewOp2);
+
+ NewOp = NewOp2;
+ NewOp2 = TrCreateLeafNode (PARSEOP_LNOT);
+ NewOp2->Asl.Child = NewOp;
+ NewOp2->Asl.Parent = Conditional;
+ NewOp->Asl.Parent = NewOp2;
+ TrAmlInitLineNumbers (NewOp2, Conditional);
+
+ Conditional->Asl.Child = NewOp2;
+ NewOp2->Asl.Next = CaseBlock;
+ }
+ else
+ {
+ /*
+ * Integer and Buffer case.
+ *
+ * Change CaseOp() to: If (LEqual (SwitchValue, CaseValue)) {...}
+ * Note: SwitchValue is first to allow the CaseValue to be implicitly
+ * converted to the type of SwitchValue if necessary.
+ *
+ * CaseOp->Child is the case value
+ * CaseOp->Child->Peer is the beginning of the case block
+ */
+ NewOp = TrCreateValuedLeafNode (PARSEOP_NAMESTRING,
+ (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValueName));
+ NewOp->Asl.Next = Predicate;
+ TrAmlInitLineNumbers (NewOp, Predicate);
+
+ NewOp2 = TrCreateLeafNode (PARSEOP_LEQUAL);
+ NewOp2->Asl.Parent = Conditional;
+ NewOp2->Asl.Child = NewOp;
+ TrAmlInitLineNumbers (NewOp2, Conditional);
+
+ TrAmlSetSubtreeParent (NewOp, NewOp2);
+
+ Predicate = NewOp2;
+ Predicate->Asl.Next = CaseBlock;
+
+ TrAmlSetSubtreeParent (Predicate, Conditional);
+ Conditional->Asl.Child = Predicate;
+ }
+
+ /* Reinitialize the CASE node to an IF node */
+
+ TrAmlInitNode (Conditional, PARSEOP_IF);
+
+ /*
+ * The first CASE(IF) is not nested under an ELSE.
+ * All other CASEs are children of a parent ELSE.
+ */
+ if (CurrentParentNode == StartNode)
+ {
+ Conditional->Asl.Parent = CurrentParentNode->Asl.Parent;
+
+ /* Link IF into the peer list */
+
+ TrAmlInsertPeer (CurrentParentNode, Conditional);
+ }
+ else
+ {
+ /*
+ * The IF is a child of previous IF/ELSE. It
+ * is therefore without peer.
+ */
+ CurrentParentNode->Asl.Child = Conditional;
+ Conditional->Asl.Parent = CurrentParentNode;
+ Conditional->Asl.Next = NULL;
+ }
+ }
+ else if (Next->Asl.ParseOpcode == PARSEOP_DEFAULT)
+ {
+ if (DefaultOp)
+ {
+ /*
+ * More than one Default
+ * (Parser does not catch this, must check here)
+ */
+ AslError (ASL_ERROR, ASL_MSG_MULTIPLE_DEFAULT, Next, NULL);
+ }
+ else
+ {
+ /* Save the DEFAULT node for later, after CASEs */
+
+ DefaultOp = Next;
+ }
+ }
+ else
+ {
+ /* Unknown peer opcode */
+
+ AcpiOsPrintf ("Unknown parse opcode for switch statement: %s (%d)\n",
+ Next->Asl.ParseOpName, Next->Asl.ParseOpcode);
+ }
+ }
+
+ /* Add the default case at the end of the if/else construct */
+
+ if (DefaultOp)
+ {
+ /* If no CASE statements, this is an error - see below */
+
+ if (CaseOp)
+ {
+ /* Convert the DEFAULT node to an ELSE */
+
+ if (!Conditional)
+ {
+ return;
+ }
+ TrAmlInitNode (DefaultOp, PARSEOP_ELSE);
+ DefaultOp->Asl.Parent = Conditional->Asl.Parent;
+
+ /* Link ELSE node as a peer to the previous IF */
+
+ TrAmlInsertPeer (Conditional, DefaultOp);
+ }
+ }
+
+ if (!CaseOp)
+ {
+ AslError (ASL_ERROR, ASL_MSG_NO_CASES, StartNode, NULL);
+ }
+
+
+ /*
+ * Create a Name(_T_x, ...) statement. This statement must appear at the
+ * method level, in case a loop surrounds the switch statement and could
+ * cause the name to be created twice (error).
+ */
+
+ /* Create the Name node */
+
+ Predicate = StartNode->Asl.Child;
+ NewOp = TrCreateLeafNode (PARSEOP_NAME);
+
+ /* Find the parent method */
+
+ Next = StartNode;
+ while ((Next->Asl.ParseOpcode != PARSEOP_METHOD) &&
+ (Next->Asl.ParseOpcode != PARSEOP_DEFINITIONBLOCK))
+ {
+ Next = Next->Asl.Parent;
+ }
+
+ NewOp->Asl.CompileFlags |= NODE_COMPILER_EMITTED;
+ NewOp->Asl.Parent = Next;
+
+ /* Insert name after the method name and arguments */
+
+ Next = Next->Asl.Child;
+ Next = Next->Asl.Next;
+ Next = Next->Asl.Next;
+ Next = Next->Asl.Next;
+ Next = Next->Asl.Next;
+ Next = Next->Asl.Next;
+
+ TrAmlInsertPeer (Next, NewOp);
+ TrAmlInitLineNumbers (NewOp, Next);
+
+ /* Create the NameSeg child for the Name node */
+
+ NewOp2 = TrCreateValuedLeafNode (PARSEOP_NAMESEG,
+ (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValueName));
+ NewOp2->Asl.CompileFlags |= NODE_IS_NAME_DECLARATION;
+ NewOp->Asl.Child = NewOp2;
+
+ /* Create the initial value for the Name. Btype was already validated above */
+
+ switch (Btype)
+ {
+ case ACPI_BTYPE_INTEGER:
+ NewOp2->Asl.Next = TrCreateValuedLeafNode (PARSEOP_ZERO,
+ (ACPI_INTEGER) 0);
+ break;
+
+ case ACPI_BTYPE_STRING:
+ NewOp2->Asl.Next = TrCreateValuedLeafNode (PARSEOP_STRING_LITERAL,
+ (ACPI_INTEGER) "");
+ break;
+
+ case ACPI_BTYPE_BUFFER:
+ (void) TrLinkPeerNode (NewOp2, TrCreateValuedLeafNode (PARSEOP_BUFFER,
+ (ACPI_INTEGER) 0));
+ Next = NewOp2->Asl.Next;
+ (void) TrLinkChildren (Next, 1, TrCreateValuedLeafNode (PARSEOP_ZERO,
+ (ACPI_INTEGER) 1));
+ (void) TrLinkPeerNode (Next->Asl.Child,
+ TrCreateValuedLeafNode (PARSEOP_DEFAULT_ARG, (ACPI_INTEGER) 0));
+
+ TrAmlSetSubtreeParent (Next->Asl.Child, Next);
+ break;
+
+ default:
+ break;
+ }
+
+ TrAmlSetSubtreeParent (NewOp2, NewOp);
+
+ /*
+ * Transform the Switch() into a Store() node which will be used to save the
+ * Switch() value. The store is of the form: Store (Value, _T_x)
+ * where _T_x is the temp variable.
+ */
+ TrAmlInitNode (StartNode, PARSEOP_STORE);
+ StartNode->Asl.Child = NULL;
+
+ /* Complete the Store subtree */
+
+ StartNode->Asl.Child = Predicate;
+ Predicate->Asl.Parent = StartNode;
+
+ NewOp = TrCreateValuedLeafNode (PARSEOP_NAMESEG,
+ (ACPI_INTEGER) ACPI_TO_INTEGER (PredicateValueName));
+ NewOp->Asl.Parent = StartNode;
+ Predicate->Asl.Next = NewOp;
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/asltree.c b/sys/contrib/dev/acpica/compiler/asltree.c
new file mode 100644
index 0000000..db9893d
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/asltree.c
@@ -0,0 +1,1194 @@
+
+/******************************************************************************
+ *
+ * Module Name: asltree - parse tree management
+ * $Revision: 1.63 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("asltree")
+
+/* Local prototypes */
+
+static ACPI_PARSE_OBJECT *
+TrGetNextNode (
+ void);
+
+static char *
+TrGetNodeFlagName (
+ UINT32 Flags);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrGetNextNode
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: New parse node. Aborts on allocation failure
+ *
+ * DESCRIPTION: Allocate a new parse node for the parse tree. Bypass the local
+ * dynamic memory manager for performance reasons (This has a
+ * major impact on the speed of the compiler.)
+ *
+ ******************************************************************************/
+
+static ACPI_PARSE_OBJECT *
+TrGetNextNode (
+ void)
+{
+
+ if (Gbl_NodeCacheNext >= Gbl_NodeCacheLast)
+ {
+ Gbl_NodeCacheNext = UtLocalCalloc (sizeof (ACPI_PARSE_OBJECT) *
+ ASL_NODE_CACHE_SIZE);
+ Gbl_NodeCacheLast = Gbl_NodeCacheNext + ASL_NODE_CACHE_SIZE;
+ }
+
+ return (Gbl_NodeCacheNext++);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrAllocateNode
+ *
+ * PARAMETERS: ParseOpcode - Opcode to be assigned to the node
+ *
+ * RETURN: New parse node. Aborts on allocation failure
+ *
+ * DESCRIPTION: Allocate and initialize a new parse node for the parse tree
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrAllocateNode (
+ UINT32 ParseOpcode)
+{
+ ACPI_PARSE_OBJECT *Op;
+
+
+ Op = TrGetNextNode ();
+
+ Op->Asl.ParseOpcode = (UINT16) ParseOpcode;
+ Op->Asl.Filename = Gbl_Files[ASL_FILE_INPUT].Filename;
+ Op->Asl.LineNumber = Gbl_CurrentLineNumber;
+ Op->Asl.LogicalLineNumber = Gbl_LogicalLineNumber;
+ Op->Asl.LogicalByteOffset = Gbl_CurrentLineOffset;
+ Op->Asl.Column = Gbl_CurrentColumn;
+
+ UtSetParseOpName (Op);
+ return Op;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrReleaseNode
+ *
+ * PARAMETERS: Op - Op to be released
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: "release" a node. In truth, nothing is done since the node
+ * is part of a larger buffer
+ *
+ ******************************************************************************/
+
+void
+TrReleaseNode (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrUpdateNode
+ *
+ * PARAMETERS: ParseOpcode - New opcode to be assigned to the node
+ * Op - An existing parse node
+ *
+ * RETURN: The updated node
+ *
+ * DESCRIPTION: Change the parse opcode assigned to a node. Usually used to
+ * change an opcode to DEFAULT_ARG so that the node is ignored
+ * during the code generation. Also used to set generic integers
+ * to a specific size (8, 16, 32, or 64 bits)
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrUpdateNode (
+ UINT32 ParseOpcode,
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ if (!Op)
+ {
+ return NULL;
+ }
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nUpdateNode: Old - %s, New - %s\n\n",
+ UtGetOpName (Op->Asl.ParseOpcode),
+ UtGetOpName (ParseOpcode));
+
+ /* Assign new opcode and name */
+
+ if (Op->Asl.ParseOpcode == PARSEOP_ONES)
+ {
+ switch (ParseOpcode)
+ {
+ case PARSEOP_BYTECONST:
+ Op->Asl.Value.Integer = 0xFF;
+ break;
+
+ case PARSEOP_WORDCONST:
+ Op->Asl.Value.Integer = 0xFFFF;
+ break;
+
+ case PARSEOP_DWORDCONST:
+ Op->Asl.Value.Integer = 0xFFFFFFFF;
+ break;
+
+ default:
+ /* Don't care about others, don't need to check QWORD */
+ break;
+ }
+ }
+
+ Op->Asl.ParseOpcode = (UINT16) ParseOpcode;
+ UtSetParseOpName (Op);
+
+ /*
+ * For the BYTE, WORD, and DWORD constants, make sure that the integer
+ * that was passed in will actually fit into the data type
+ */
+ switch (ParseOpcode)
+ {
+ case PARSEOP_BYTECONST:
+ Op = UtCheckIntegerRange (Op, 0x00, ACPI_UINT8_MAX);
+ break;
+
+ case PARSEOP_WORDCONST:
+ Op = UtCheckIntegerRange (Op, 0x00, ACPI_UINT16_MAX);
+ break;
+
+ case PARSEOP_DWORDCONST:
+ Op = UtCheckIntegerRange (Op, 0x00, ACPI_UINT32_MAX);
+ break;
+
+ default:
+ /* Don't care about others, don't need to check QWORD */
+ break;
+ }
+
+ return Op;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrGetNodeFlagName
+ *
+ * PARAMETERS: Flags - Flags word to be decoded
+ *
+ * RETURN: Name string. Always returns a valid string pointer.
+ *
+ * DESCRIPTION: Decode a flags word
+ *
+ ******************************************************************************/
+
+static char *
+TrGetNodeFlagName (
+ UINT32 Flags)
+{
+
+ switch (Flags)
+ {
+ case NODE_VISITED:
+ return ("NODE_VISITED");
+
+ case NODE_AML_PACKAGE:
+ return ("NODE_AML_PACKAGE");
+
+ case NODE_IS_TARGET:
+ return ("NODE_IS_TARGET");
+
+ case NODE_IS_RESOURCE_DESC:
+ return ("NODE_IS_RESOURCE_DESC");
+
+ case NODE_IS_RESOURCE_FIELD:
+ return ("NODE_IS_RESOURCE_FIELD");
+
+ case NODE_HAS_NO_EXIT:
+ return ("NODE_HAS_NO_EXIT");
+
+ case NODE_IF_HAS_NO_EXIT:
+ return ("NODE_IF_HAS_NO_EXIT");
+
+ case NODE_NAME_INTERNALIZED:
+ return ("NODE_NAME_INTERNALIZED");
+
+ case NODE_METHOD_NO_RETVAL:
+ return ("NODE_METHOD_NO_RETVAL");
+
+ case NODE_METHOD_SOME_NO_RETVAL:
+ return ("NODE_METHOD_SOME_NO_RETVAL");
+
+ case NODE_RESULT_NOT_USED:
+ return ("NODE_RESULT_NOT_USED");
+
+ case NODE_METHOD_TYPED:
+ return ("NODE_METHOD_TYPED");
+
+ case NODE_IS_BIT_OFFSET:
+ return ("NODE_IS_BIT_OFFSET");
+
+ case NODE_COMPILE_TIME_CONST:
+ return ("NODE_COMPILE_TIME_CONST");
+
+ case NODE_IS_TERM_ARG:
+ return ("NODE_IS_TERM_ARG");
+
+ case NODE_WAS_ONES_OP:
+ return ("NODE_WAS_ONES_OP");
+
+ case NODE_IS_NAME_DECLARATION:
+ return ("NODE_IS_NAME_DECLARATION");
+
+ default:
+ return ("Multiple Flags (or unknown flag) set");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrSetNodeFlags
+ *
+ * PARAMETERS: Op - An existing parse node
+ * Flags - New flags word
+ *
+ * RETURN: The updated parser op
+ *
+ * DESCRIPTION: Set bits in the node flags word. Will not clear bits, only set
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrSetNodeFlags (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Flags)
+{
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nSetNodeFlags: Op %p, %8.8X %s\n\n", Op, Flags,
+ TrGetNodeFlagName (Flags));
+
+ if (!Op)
+ {
+ return NULL;
+ }
+
+ Op->Asl.CompileFlags |= Flags;
+
+ return Op;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrSetEndLineNumber
+ *
+ * PARAMETERS: Op - An existing parse node
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Set the ending line numbers (file line and logical line) of a
+ * parse node to the current line numbers.
+ *
+ ******************************************************************************/
+
+void
+TrSetEndLineNumber (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ /* If the end line # is already set, just return */
+
+ if (Op->Asl.EndLine)
+ {
+ return;
+ }
+
+ Op->Asl.EndLine = Gbl_CurrentLineNumber;
+ Op->Asl.EndLogicalLine = Gbl_LogicalLineNumber;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrCreateLeafNode
+ *
+ * PARAMETERS: ParseOpcode - New opcode to be assigned to the node
+ *
+ * RETURN: Pointer to the new node. Aborts on allocation failure
+ *
+ * DESCRIPTION: Create a simple leaf node (no children or peers, and no value
+ * assigned to the node)
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrCreateLeafNode (
+ UINT32 ParseOpcode)
+{
+ ACPI_PARSE_OBJECT *Op;
+
+
+ Op = TrAllocateNode (ParseOpcode);
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nCreateLeafNode Ln/Col %d/%d NewNode %p Op %s\n\n",
+ Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName(ParseOpcode));
+
+ return Op;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrCreateValuedLeafNode
+ *
+ * PARAMETERS: ParseOpcode - New opcode to be assigned to the node
+ * Value - Value to be assigned to the node
+ *
+ * RETURN: Pointer to the new node. Aborts on allocation failure
+ *
+ * DESCRIPTION: Create a leaf node (no children or peers) with a value
+ * assigned to it
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrCreateValuedLeafNode (
+ UINT32 ParseOpcode,
+ ACPI_INTEGER Value)
+{
+ ACPI_PARSE_OBJECT *Op;
+
+
+ Op = TrAllocateNode (ParseOpcode);
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nCreateValuedLeafNode Ln/Col %d/%d NewNode %p Op %s Value %8.8X%8.8X ",
+ Op->Asl.LineNumber, Op->Asl.Column, Op, UtGetOpName(ParseOpcode),
+ ACPI_FORMAT_UINT64 (Value));
+ Op->Asl.Value.Integer = Value;
+
+ switch (ParseOpcode)
+ {
+ case PARSEOP_STRING_LITERAL:
+ DbgPrint (ASL_PARSE_OUTPUT, "STRING->%s", Value);
+ break;
+
+ case PARSEOP_NAMESEG:
+ DbgPrint (ASL_PARSE_OUTPUT, "NAMESEG->%s", Value);
+ break;
+
+ case PARSEOP_NAMESTRING:
+ DbgPrint (ASL_PARSE_OUTPUT, "NAMESTRING->%s", Value);
+ break;
+
+ case PARSEOP_EISAID:
+ DbgPrint (ASL_PARSE_OUTPUT, "EISAID->%s", Value);
+ break;
+
+ case PARSEOP_METHOD:
+ DbgPrint (ASL_PARSE_OUTPUT, "METHOD");
+ break;
+
+ case PARSEOP_INTEGER:
+ DbgPrint (ASL_PARSE_OUTPUT, "INTEGER");
+ break;
+
+ default:
+ break;
+ }
+
+ DbgPrint (ASL_PARSE_OUTPUT, "\n\n");
+ return Op;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrCreateNode
+ *
+ * PARAMETERS: ParseOpcode - Opcode to be assigned to the node
+ * NumChildren - Number of children to follow
+ * ... - A list of child nodes to link to the new
+ * node. NumChildren long.
+ *
+ * RETURN: Pointer to the new node. Aborts on allocation failure
+ *
+ * DESCRIPTION: Create a new parse node and link together a list of child
+ * nodes underneath the new node.
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrCreateNode (
+ UINT32 ParseOpcode,
+ UINT32 NumChildren,
+ ...)
+{
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_PARSE_OBJECT *Child;
+ ACPI_PARSE_OBJECT *PrevChild;
+ va_list ap;
+ UINT32 i;
+ BOOLEAN FirstChild;
+
+
+ va_start (ap, NumChildren);
+
+ /* Allocate one new node */
+
+ Op = TrAllocateNode (ParseOpcode);
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nCreateNode Ln/Col %d/%d NewParent %p Child %d Op %s ",
+ Op->Asl.LineNumber, Op->Asl.Column, Op, NumChildren, UtGetOpName(ParseOpcode));
+
+ /* Some extra debug output based on the parse opcode */
+
+ switch (ParseOpcode)
+ {
+ case PARSEOP_DEFINITIONBLOCK:
+ RootNode = Op;
+ DbgPrint (ASL_PARSE_OUTPUT, "DEFINITION_BLOCK (Tree Completed)->");
+ break;
+
+ case PARSEOP_OPERATIONREGION:
+ DbgPrint (ASL_PARSE_OUTPUT, "OPREGION->");
+ break;
+
+ case PARSEOP_OR:
+ DbgPrint (ASL_PARSE_OUTPUT, "OR->");
+ break;
+
+ default:
+ /* Nothing to do for other opcodes */
+ break;
+ }
+
+ /* Link the new node to its children */
+
+ PrevChild = NULL;
+ FirstChild = TRUE;
+ for (i = 0; i < NumChildren; i++)
+ {
+ /* Get the next child */
+
+ Child = va_arg (ap, ACPI_PARSE_OBJECT *);
+ DbgPrint (ASL_PARSE_OUTPUT, "%p, ", Child);
+
+ /*
+ * If child is NULL, this means that an optional argument
+ * was omitted. We must create a placeholder with a special
+ * opcode (DEFAULT_ARG) so that the code generator will know
+ * that it must emit the correct default for this argument
+ */
+ if (!Child)
+ {
+ Child = TrAllocateNode (PARSEOP_DEFAULT_ARG);
+ }
+
+ /* Link first child to parent */
+
+ if (FirstChild)
+ {
+ FirstChild = FALSE;
+ Op->Asl.Child = Child;
+ }
+
+ /* Point all children to parent */
+
+ Child->Asl.Parent = Op;
+
+ /* Link children in a peer list */
+
+ if (PrevChild)
+ {
+ PrevChild->Asl.Next = Child;
+ };
+
+ /*
+ * This child might be a list, point all nodes in the list
+ * to the same parent
+ */
+ while (Child->Asl.Next)
+ {
+ Child = Child->Asl.Next;
+ Child->Asl.Parent = Op;
+ }
+
+ PrevChild = Child;
+ }
+ va_end(ap);
+
+ DbgPrint (ASL_PARSE_OUTPUT, "\n\n");
+ return Op;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrLinkChildren
+ *
+ * PARAMETERS: Op - An existing parse node
+ * NumChildren - Number of children to follow
+ * ... - A list of child nodes to link to the new
+ * node. NumChildren long.
+ *
+ * RETURN: The updated (linked) node
+ *
+ * DESCRIPTION: Link a group of nodes to an existing parse node
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrLinkChildren (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 NumChildren,
+ ...)
+{
+ ACPI_PARSE_OBJECT *Child;
+ ACPI_PARSE_OBJECT *PrevChild;
+ va_list ap;
+ UINT32 i;
+ BOOLEAN FirstChild;
+
+
+ va_start (ap, NumChildren);
+
+
+ TrSetEndLineNumber (Op);
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nLinkChildren Line [%d to %d] NewParent %p Child %d Op %s ",
+ Op->Asl.LineNumber, Op->Asl.EndLine,
+ Op, NumChildren, UtGetOpName(Op->Asl.ParseOpcode));
+
+ switch (Op->Asl.ParseOpcode)
+ {
+ case PARSEOP_DEFINITIONBLOCK:
+ RootNode = Op;
+ DbgPrint (ASL_PARSE_OUTPUT, "DEFINITION_BLOCK (Tree Completed)->");
+ break;
+
+ case PARSEOP_OPERATIONREGION:
+ DbgPrint (ASL_PARSE_OUTPUT, "OPREGION->");
+ break;
+
+ case PARSEOP_OR:
+ DbgPrint (ASL_PARSE_OUTPUT, "OR->");
+ break;
+
+ default:
+ /* Nothing to do for other opcodes */
+ break;
+ }
+
+ /* Link the new node to it's children */
+
+ PrevChild = NULL;
+ FirstChild = TRUE;
+ for (i = 0; i < NumChildren; i++)
+ {
+ Child = va_arg (ap, ACPI_PARSE_OBJECT *);
+
+ if ((Child == PrevChild) && (Child != NULL))
+ {
+ AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Child,
+ "Child node list invalid");
+ return Op;
+ }
+
+ DbgPrint (ASL_PARSE_OUTPUT, "%p, ", Child);
+
+ /*
+ * If child is NULL, this means that an optional argument
+ * was omitted. We must create a placeholder with a special
+ * opcode (DEFAULT_ARG) so that the code generator will know
+ * that it must emit the correct default for this argument
+ */
+ if (!Child)
+ {
+ Child = TrAllocateNode (PARSEOP_DEFAULT_ARG);
+ }
+
+ /* Link first child to parent */
+
+ if (FirstChild)
+ {
+ FirstChild = FALSE;
+ Op->Asl.Child = Child;
+ }
+
+ /* Point all children to parent */
+
+ Child->Asl.Parent = Op;
+
+ /* Link children in a peer list */
+
+ if (PrevChild)
+ {
+ PrevChild->Asl.Next = Child;
+ };
+
+ /*
+ * This child might be a list, point all nodes in the list
+ * to the same parent
+ */
+ while (Child->Asl.Next)
+ {
+ Child = Child->Asl.Next;
+ Child->Asl.Parent = Op;
+ }
+ PrevChild = Child;
+ }
+ va_end(ap);
+
+ DbgPrint (ASL_PARSE_OUTPUT, "\n\n");
+ return Op;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrLinkPeerNode
+ *
+ * PARAMETERS: Op1 - First peer
+ * Op2 - Second peer
+ *
+ * RETURN: Op1 or the non-null node.
+ *
+ * DESCRIPTION: Link two nodes as peers. Handles cases where one peer is null.
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrLinkPeerNode (
+ ACPI_PARSE_OBJECT *Op1,
+ ACPI_PARSE_OBJECT *Op2)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nLinkPeerNode: 1=%p (%s), 2=%p (%s)\n\n",
+ Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode) : NULL,
+ Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode) : NULL);
+
+
+ if ((!Op1) && (!Op2))
+ {
+ DbgPrint (ASL_PARSE_OUTPUT, "\nTwo Null nodes!\n");
+ return Op1;
+ }
+
+ /* If one of the nodes is null, just return the non-null node */
+
+ if (!Op2)
+ {
+ return Op1;
+ }
+
+ if (!Op1)
+ {
+ return Op2;
+ }
+
+ if (Op1 == Op2)
+ {
+ DbgPrint (ASL_DEBUG_OUTPUT,
+ "\n\n************* Internal error, linking node to itself %p\n\n\n",
+ Op1);
+ AslError (ASL_WARNING, ASL_MSG_COMPILER_INTERNAL, Op1,
+ "Linking node to itself");
+ return Op1;
+ }
+
+ Op1->Asl.Parent = Op2->Asl.Parent;
+
+ /*
+ * Op 1 may already have a peer list (such as an IF/ELSE pair),
+ * so we must walk to the end of the list and attach the new
+ * peer at the end
+ */
+ Next = Op1;
+ while (Next->Asl.Next)
+ {
+ Next = Next->Asl.Next;
+ }
+
+ Next->Asl.Next = Op2;
+ return Op1;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrLinkPeerNodes
+ *
+ * PARAMETERS: NumPeers - The number of nodes in the list to follow
+ * ... - A list of nodes to link together as peers
+ *
+ * RETURN: The first node in the list (head of the peer list)
+ *
+ * DESCRIPTION: Link together an arbitrary number of peer nodes.
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrLinkPeerNodes (
+ UINT32 NumPeers,
+ ...)
+{
+ ACPI_PARSE_OBJECT *This;
+ ACPI_PARSE_OBJECT *Next;
+ va_list ap;
+ UINT32 i;
+ ACPI_PARSE_OBJECT *Start;
+
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nLinkPeerNodes: (%d) ", NumPeers);
+
+ va_start (ap, NumPeers);
+ This = va_arg (ap, ACPI_PARSE_OBJECT *);
+ Start = This;
+
+ /*
+ * Link all peers
+ */
+ for (i = 0; i < (NumPeers -1); i++)
+ {
+ DbgPrint (ASL_PARSE_OUTPUT, "%d=%p ", (i+1), This);
+
+ while (This->Asl.Next)
+ {
+ This = This->Asl.Next;
+ }
+
+ /* Get another peer node */
+
+ Next = va_arg (ap, ACPI_PARSE_OBJECT *);
+ if (!Next)
+ {
+ Next = TrAllocateNode (PARSEOP_DEFAULT_ARG);
+ }
+
+ /* link new node to the current node */
+
+ This->Asl.Next = Next;
+ This = Next;
+ }
+
+ DbgPrint (ASL_PARSE_OUTPUT,"\n\n");
+ return (Start);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrLinkChildNode
+ *
+ * PARAMETERS: Op1 - Parent node
+ * Op2 - Op to become a child
+ *
+ * RETURN: The parent node
+ *
+ * DESCRIPTION: Link two nodes together as a parent and child
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+TrLinkChildNode (
+ ACPI_PARSE_OBJECT *Op1,
+ ACPI_PARSE_OBJECT *Op2)
+{
+ ACPI_PARSE_OBJECT *Next;
+
+
+ DbgPrint (ASL_PARSE_OUTPUT,
+ "\nLinkChildNode: Parent=%p (%s), Child=%p (%s)\n\n",
+ Op1, Op1 ? UtGetOpName(Op1->Asl.ParseOpcode): NULL,
+ Op2, Op2 ? UtGetOpName(Op2->Asl.ParseOpcode): NULL);
+
+ if (!Op1 || !Op2)
+ {
+ return Op1;
+ }
+
+ Op1->Asl.Child = Op2;
+
+ /* Set the child and all peers of the child to point to the parent */
+
+ Next = Op2;
+ while (Next)
+ {
+ Next->Asl.Parent = Op1;
+ Next = Next->Asl.Next;
+ }
+
+ return Op1;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: TrWalkParseTree
+ *
+ * PARAMETERS: Visitation - Type of walk
+ * DescendingCallback - Called during tree descent
+ * AscendingCallback - Called during tree ascent
+ * Context - To be passed to the callbacks
+ *
+ * RETURN: Status from callback(s)
+ *
+ * DESCRIPTION: Walk the entire parse tree.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+TrWalkParseTree (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Visitation,
+ ASL_WALK_CALLBACK DescendingCallback,
+ ASL_WALK_CALLBACK AscendingCallback,
+ void *Context)
+{
+ UINT32 Level;
+ BOOLEAN NodePreviouslyVisited;
+ ACPI_PARSE_OBJECT *StartOp = Op;
+ ACPI_STATUS Status;
+
+
+ if (!RootNode)
+ {
+ return (AE_OK);
+ }
+
+ Level = 0;
+ NodePreviouslyVisited = FALSE;
+
+ switch (Visitation)
+ {
+ case ASL_WALK_VISIT_DOWNWARD:
+
+ while (Op)
+ {
+ if (!NodePreviouslyVisited)
+ {
+ /* Let the callback process the node. */
+
+ Status = DescendingCallback (Op, Level, Context);
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Visit children first, once */
+
+ if (Op->Asl.Child)
+ {
+ Level++;
+ Op = Op->Asl.Child;
+ continue;
+ }
+ }
+ else if (Status != AE_CTRL_DEPTH)
+ {
+ /* Exit immediately on any error */
+
+ return (Status);
+ }
+ }
+
+ /* Terminate walk at start op */
+
+ if (Op == StartOp)
+ {
+ break;
+ }
+
+ /* No more children, visit peers */
+
+ if (Op->Asl.Next)
+ {
+ Op = Op->Asl.Next;
+ NodePreviouslyVisited = FALSE;
+ }
+ else
+ {
+ /* No children or peers, re-visit parent */
+
+ if (Level != 0 )
+ {
+ Level--;
+ }
+ Op = Op->Asl.Parent;
+ NodePreviouslyVisited = TRUE;
+ }
+ }
+ break;
+
+
+ case ASL_WALK_VISIT_UPWARD:
+
+ while (Op)
+ {
+ /* Visit leaf node (no children) or parent node on return trip */
+
+ if ((!Op->Asl.Child) ||
+ (NodePreviouslyVisited))
+ {
+ /* Let the callback process the node. */
+
+ Status = AscendingCallback (Op, Level, Context);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+ else
+ {
+ /* Visit children first, once */
+
+ Level++;
+ Op = Op->Asl.Child;
+ continue;
+ }
+
+ /* Terminate walk at start op */
+
+ if (Op == StartOp)
+ {
+ break;
+ }
+
+ /* No more children, visit peers */
+
+ if (Op->Asl.Next)
+ {
+ Op = Op->Asl.Next;
+ NodePreviouslyVisited = FALSE;
+ }
+ else
+ {
+ /* No children or peers, re-visit parent */
+
+ if (Level != 0 )
+ {
+ Level--;
+ }
+ Op = Op->Asl.Parent;
+ NodePreviouslyVisited = TRUE;
+ }
+ }
+ break;
+
+
+ case ASL_WALK_VISIT_TWICE:
+
+ while (Op)
+ {
+ if (NodePreviouslyVisited)
+ {
+ Status = AscendingCallback (Op, Level, Context);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+ else
+ {
+ /* Let the callback process the node. */
+
+ Status = DescendingCallback (Op, Level, Context);
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Visit children first, once */
+
+ if (Op->Asl.Child)
+ {
+ Level++;
+ Op = Op->Asl.Child;
+ continue;
+ }
+ }
+ else if (Status != AE_CTRL_DEPTH)
+ {
+ /* Exit immediately on any error */
+
+ return (Status);
+ }
+ }
+
+ /* Terminate walk at start op */
+
+ if (Op == StartOp)
+ {
+ break;
+ }
+
+ /* No more children, visit peers */
+
+ if (Op->Asl.Next)
+ {
+ Op = Op->Asl.Next;
+ NodePreviouslyVisited = FALSE;
+ }
+ else
+ {
+ /* No children or peers, re-visit parent */
+
+ if (Level != 0 )
+ {
+ Level--;
+ }
+ Op = Op->Asl.Parent;
+ NodePreviouslyVisited = TRUE;
+ }
+ }
+ break;
+
+ default:
+ /* No other types supported */
+ break;
+ }
+
+ /* If we get here, the walk completed with no errors */
+
+ return (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/compiler/asltypes.h b/sys/contrib/dev/acpica/compiler/asltypes.h
new file mode 100644
index 0000000..51beeb2
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/asltypes.h
@@ -0,0 +1,562 @@
+
+/******************************************************************************
+ *
+ * Module Name: asltypes.h - compiler data types and struct definitions
+ * $Revision: 1.89 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#ifndef __ASLTYPES_H
+#define __ASLTYPES_H
+
+
+/*******************************************************************************
+ *
+ * Structure definitions
+ *
+ ******************************************************************************/
+
+
+/* Op flags for the ACPI_PARSE_OBJECT */
+
+#define NODE_VISITED 0x00000001
+#define NODE_AML_PACKAGE 0x00000002
+#define NODE_IS_TARGET 0x00000004
+#define NODE_IS_RESOURCE_DESC 0x00000008
+#define NODE_IS_RESOURCE_FIELD 0x00000010
+#define NODE_HAS_NO_EXIT 0x00000020
+#define NODE_IF_HAS_NO_EXIT 0x00000040
+#define NODE_NAME_INTERNALIZED 0x00000080
+#define NODE_METHOD_NO_RETVAL 0x00000100
+#define NODE_METHOD_SOME_NO_RETVAL 0x00000200
+#define NODE_RESULT_NOT_USED 0x00000400
+#define NODE_METHOD_TYPED 0x00000800
+#define NODE_IS_BIT_OFFSET 0x00001000
+#define NODE_COMPILE_TIME_CONST 0x00002000
+#define NODE_IS_TERM_ARG 0x00004000
+#define NODE_WAS_ONES_OP 0x00008000
+#define NODE_IS_NAME_DECLARATION 0x00010000
+#define NODE_COMPILER_EMITTED 0x00020000
+#define NODE_IS_DUPLICATE 0x00040000
+#define NODE_IS_RESOURCE_DATA 0x00080000
+
+/* Keeps information about individual control methods */
+
+typedef struct asl_method_info
+{
+ UINT8 NumArguments;
+ UINT8 LocalInitialized[ACPI_METHOD_NUM_LOCALS];
+ UINT8 ArgInitialized[ACPI_METHOD_NUM_ARGS];
+ UINT32 ValidArgTypes[ACPI_METHOD_NUM_ARGS];
+ UINT32 ValidReturnTypes;
+ UINT32 NumReturnNoValue;
+ UINT32 NumReturnWithValue;
+ ACPI_PARSE_OBJECT *Op;
+ struct asl_method_info *Next;
+ UINT8 HasBeenTyped;
+
+} ASL_METHOD_INFO;
+
+
+/* Parse tree walk info for control method analysis */
+
+typedef struct asl_analysis_walk_info
+{
+ ASL_METHOD_INFO *MethodStack;
+
+} ASL_ANALYSIS_WALK_INFO;
+
+
+/* An entry in the ParseOpcode to AmlOpcode mapping table */
+
+typedef struct asl_mapping_entry
+{
+ UINT32 Value;
+ UINT32 AcpiBtype; /* Object type or return type */
+ UINT16 AmlOpcode;
+ UINT8 Flags;
+
+} ASL_MAPPING_ENTRY;
+
+
+/* An entry in the Reserved Name information table */
+
+#define ASL_RSVD_RETURN_VALUE 0x01
+#define ASL_RSVD_RESOURCE_NAME 0x02
+#define ASL_RSVD_SCOPE 0x04
+
+typedef struct asl_reserved_info
+{
+ char *Name;
+ UINT8 NumArguments;
+ UINT8 Flags;
+
+} ASL_RESERVED_INFO;
+
+
+/* Parse tree walk info structure */
+
+typedef struct asl_walk_info
+{
+ ACPI_PARSE_OBJECT **NodePtr;
+ UINT32 *LevelPtr;
+
+} ASL_WALK_INFO;
+
+
+/* File info */
+
+typedef struct asl_file_info
+{
+ FILE *Handle;
+ char *Filename;
+
+} ASL_FILE_INFO;
+
+typedef struct asl_file_status
+{
+ UINT32 Line;
+ UINT32 Offset;
+
+} ASL_FILE_STATUS;
+
+
+/* File types */
+
+typedef enum
+{
+ ASL_FILE_STDOUT = 0,
+ ASL_FILE_STDERR,
+ ASL_FILE_INPUT,
+ ASL_FILE_AML_OUTPUT,
+ ASL_FILE_SOURCE_OUTPUT,
+ ASL_FILE_LISTING_OUTPUT,
+ ASL_FILE_HEX_OUTPUT,
+ ASL_FILE_NAMESPACE_OUTPUT,
+ ASL_FILE_DEBUG_OUTPUT,
+ ASL_FILE_ASM_SOURCE_OUTPUT,
+ ASL_FILE_C_SOURCE_OUTPUT,
+ ASL_FILE_ASM_INCLUDE_OUTPUT,
+ ASL_FILE_C_INCLUDE_OUTPUT
+
+} ASL_FILE_TYPES;
+
+
+#define ASL_MAX_FILE_TYPE 12
+#define ASL_NUM_FILES (ASL_MAX_FILE_TYPE + 1)
+
+
+/* An entry in the exception list, one for each error/warning */
+
+typedef struct asl_error_msg
+{
+ UINT32 LineNumber;
+ UINT32 LogicalLineNumber;
+ UINT32 LogicalByteOffset;
+ UINT32 Column;
+ char *Message;
+ struct asl_error_msg *Next;
+ char *Filename;
+ UINT32 FilenameLength;
+ UINT8 MessageId;
+ UINT8 Level;
+
+} ASL_ERROR_MSG;
+
+
+/* An entry in the listing file stack (for include files) */
+
+typedef struct asl_listing_node
+{
+ char *Filename;
+ UINT32 LineNumber;
+ struct asl_listing_node *Next;
+
+} ASL_LISTING_NODE;
+
+
+/* Callback interface for a parse tree walk */
+
+typedef
+ACPI_STATUS (*ASL_WALK_CALLBACK) (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+
+typedef struct asl_event_info
+{
+ UINT64 StartTime;
+ UINT64 EndTime;
+ char *EventName;
+ BOOLEAN Valid;
+
+} ASL_EVENT_INFO;
+
+
+#define ASL_WARNING 0
+#define ASL_WARNING2 1
+#define ASL_WARNING3 2
+#define ASL_ERROR 3
+#define ASL_REMARK 4
+#define ASL_OPTIMIZATION 5
+#define ASL_NUM_REPORT_LEVELS 6
+
+
+typedef enum
+{
+ ASL_MSG_RESERVED = 0,
+ ASL_MSG_ALPHANUMERIC_STRING,
+ ASL_MSG_AML_NOT_IMPLEMENTED,
+ ASL_MSG_ARG_COUNT_HI,
+ ASL_MSG_ARG_COUNT_LO,
+ ASL_MSG_ARG_INIT,
+ ASL_MSG_BACKWARDS_OFFSET,
+ ASL_MSG_BITS_TO_BYTES,
+ ASL_MSG_BUFFER_LENGTH,
+ ASL_MSG_BYTES_TO_BITS,
+ ASL_MSG_CLOSE,
+ ASL_MSG_COMPILER_INTERNAL,
+ ASL_MSG_CONSTANT_EVALUATION,
+ ASL_MSG_CONSTANT_FOLDED,
+ ASL_MSG_CORE_EXCEPTION,
+ ASL_MSG_DEBUG_FILE_OPEN,
+ ASL_MSG_DEBUG_FILENAME,
+ ASL_MSG_DEPENDENT_NESTING,
+ ASL_MSG_DMA_CHANNEL,
+ ASL_MSG_DMA_LIST,
+ ASL_MSG_DUPLICATE_CASE,
+ ASL_MSG_DUPLICATE_ITEM,
+ ASL_MSG_EARLY_EOF,
+ ASL_MSG_ENCODING_LENGTH,
+ ASL_MSG_EX_INTERRUPT_LIST,
+ ASL_MSG_EX_INTERRUPT_NUMBER,
+ ASL_MSG_FIELD_ACCESS_WIDTH,
+ ASL_MSG_FIELD_UNIT_ACCESS_WIDTH,
+ ASL_MSG_FIELD_UNIT_OFFSET,
+ ASL_MSG_INCLUDE_FILE_OPEN,
+ ASL_MSG_INPUT_FILE_OPEN,
+ ASL_MSG_INTEGER_LENGTH,
+ ASL_MSG_INTEGER_OPTIMIZATION,
+ ASL_MSG_INTERRUPT_LIST,
+ ASL_MSG_INTERRUPT_NUMBER,
+ ASL_MSG_INVALID_CONSTANT_OP,
+ ASL_MSG_INVALID_EISAID,
+ ASL_MSG_INVALID_ESCAPE,
+ ASL_MSG_INVALID_OPERAND,
+ ASL_MSG_INVALID_PERFORMANCE,
+ ASL_MSG_INVALID_PRIORITY,
+ ASL_MSG_INVALID_STRING,
+ ASL_MSG_INVALID_TARGET,
+ ASL_MSG_INVALID_TIME,
+ ASL_MSG_INVALID_TYPE,
+ ASL_MSG_INVALID_UUID,
+ ASL_MSG_LIST_LENGTH,
+ ASL_MSG_LISTING_FILE_OPEN,
+ ASL_MSG_LISTING_FILENAME,
+ ASL_MSG_LOCAL_INIT,
+ ASL_MSG_LONG_LINE,
+ ASL_MSG_MEMORY_ALLOCATION,
+ ASL_MSG_MISSING_ENDDEPENDENT,
+ ASL_MSG_MISSING_STARTDEPENDENT,
+ ASL_MSG_MULTIPLE_TYPES,
+ ASL_MSG_NAME_EXISTS,
+ ASL_MSG_NAME_OPTIMIZATION,
+ ASL_MSG_NESTED_COMMENT,
+ ASL_MSG_NO_CASES,
+ ASL_MSG_NO_RETVAL,
+ ASL_MSG_NO_WHILE,
+ ASL_MSG_NON_ASCII,
+ ASL_MSG_NOT_EXIST,
+ ASL_MSG_NOT_FOUND,
+ ASL_MSG_NOT_METHOD,
+ ASL_MSG_NOT_PARAMETER,
+ ASL_MSG_NOT_REACHABLE,
+ ASL_MSG_OPEN,
+ ASL_MSG_OUTPUT_FILE_OPEN,
+ ASL_MSG_OUTPUT_FILENAME,
+ ASL_MSG_PACKAGE_LENGTH,
+ ASL_MSG_READ,
+ ASL_MSG_RECURSION,
+ ASL_MSG_REGION_BUFFER_ACCESS,
+ ASL_MSG_REGION_BYTE_ACCESS,
+ ASL_MSG_RESERVED_ARG_COUNT_HI,
+ ASL_MSG_RESERVED_ARG_COUNT_LO,
+ ASL_MSG_RESERVED_METHOD,
+ ASL_MSG_RESERVED_OPERAND_TYPE,
+ ASL_MSG_RESERVED_RETURN_VALUE,
+ ASL_MSG_RESERVED_USE,
+ ASL_MSG_RESERVED_WORD,
+ ASL_MSG_RESOURCE_FIELD,
+ ASL_MSG_RESOURCE_INDEX,
+ ASL_MSG_RESOURCE_LIST,
+ ASL_MSG_RESOURCE_SOURCE,
+ ASL_MSG_RETURN_TYPES,
+ ASL_MSG_SCOPE_FWD_REF,
+ ASL_MSG_SCOPE_TYPE,
+ ASL_MSG_SEEK,
+ ASL_MSG_SINGLE_NAME_OPTIMIZATION,
+ ASL_MSG_SOME_NO_RETVAL,
+ ASL_MSG_SWITCH_TYPE,
+ ASL_MSG_SYNC_LEVEL,
+ ASL_MSG_SYNTAX,
+ ASL_MSG_TABLE_SIGNATURE,
+ ASL_MSG_TOO_MANY_TEMPS,
+ ASL_MSG_UNKNOWN_RESERVED_NAME,
+ ASL_MSG_UNREACHABLE_CODE,
+ ASL_MSG_UNSUPPORTED,
+ ASL_MSG_VENDOR_LIST,
+ ASL_MSG_WRITE,
+ ASL_MSG_MULTIPLE_DEFAULT,
+ ASL_MSG_TIMEOUT,
+ ASL_MSG_RESULT_NOT_USED,
+ ASL_MSG_NOT_REFERENCED,
+ ASL_MSG_NON_ZERO,
+ ASL_MSG_STRING_LENGTH
+
+} ASL_MESSAGE_IDS;
+
+#ifdef ASL_EXCEPTIONS
+
+char *AslMessages [] = {
+/* The zeroth message is resesrved */ "",
+/* ASL_MSG_ALPHANUMERIC_STRING */ "String must be entirely alphanumeric",
+/* ASL_MSG_AML_NOT_IMPLEMENTED */ "Opcode is not implemented in compiler AML code generator",
+/* ASL_MSG_ARG_COUNT_HI */ "Too many arguments",
+/* ASL_MSG_ARG_COUNT_LO */ "Too few arguments",
+/* ASL_MSG_ARG_INIT */ "Method argument is not initialized",
+/* ASL_MSG_BACKWARDS_OFFSET */ "Invalid backwards offset",
+/* ASL_MSG_BITS_TO_BYTES */ "Field offset is in bits, but a byte offset is required",
+/* ASL_MSG_BUFFER_LENGTH */ "Effective AML buffer length is zero",
+/* ASL_MSG_BYTES_TO_BITS */ "Field offset is in bytes, but a bit offset is required",
+/* ASL_MSG_CLOSE */ "Could not close file",
+/* ASL_MSG_COMPILER_INTERNAL */ "Internal compiler error",
+/* ASL_MSG_CONSTANT_EVALUATION */ "Could not evaluate constant expression",
+/* ASL_MSG_CONSTANT_FOLDED */ "Constant expression evaluated and reduced",
+/* ASL_MSG_CORE_EXCEPTION */ "From ACPI CA Subsystem",
+/* ASL_MSG_DEBUG_FILE_OPEN */ "Could not open debug file",
+/* ASL_MSG_DEBUG_FILENAME */ "Could not create debug filename",
+/* ASL_MSG_DEPENDENT_NESTING */ "Dependent function macros cannot be nested",\
+/* ASL_MSG_DMA_CHANNEL */ "Invalid DMA channel (must be 0-7)",
+/* ASL_MSG_DMA_LIST */ "Too many DMA channels (8 max)",
+/* ASL_MSG_DUPLICATE_CASE */ "Case value already specified",
+/* ASL_MSG_DUPLICATE_ITEM */ "Duplicate value in list",
+/* ASL_MSG_EARLY_EOF */ "Premature end-of-file reached",
+/* ASL_MSG_ENCODING_LENGTH */ "Package length too long to encode",
+/* ASL_MSG_EX_INTERRUPT_LIST */ "Too many interrupts (255 max)",
+/* ASL_MSG_EX_INTERRUPT_NUMBER */ "Invalid interrupt number (must be 32 bits)",
+/* ASL_MSG_FIELD_ACCESS_WIDTH */ "Access width is greater than region size",
+/* ASL_MSG_FIELD_UNIT_ACCESS_WIDTH */ "Access width of Field Unit extends beyond region limit",
+/* ASL_MSG_FIELD_UNIT_OFFSET */ "Field Unit extends beyond region limit",
+/* ASL_MSG_INCLUDE_FILE_OPEN */ "Could not open include file",
+/* ASL_MSG_INPUT_FILE_OPEN */ "Could not open input file",
+/* ASL_MSG_INTEGER_LENGTH */ "64-bit integer in 32-bit table, truncating",
+/* ASL_MSG_INTEGER_OPTIMIZATION */ "Integer optimized to single-byte AML opcode",
+/* ASL_MSG_INTERRUPT_LIST */ "Too many interrupts (16 max)",
+/* ASL_MSG_INTERRUPT_NUMBER */ "Invalid interrupt number (must be 0-15)",
+/* ASL_MSG_INVALID_CONSTANT_OP */ "Invalid operator in constant expression (not type 3/4/5)",
+/* ASL_MSG_INVALID_EISAID */ "EISAID string must be of the form \"UUUXXXX\" (3 uppercase, 4 hex digits)",
+/* ASL_MSG_INVALID_ESCAPE */ "Invalid or unknown escape sequence",
+/* ASL_MSG_INVALID_OPERAND */ "Invalid operand",
+/* ASL_MSG_INVALID_PERFORMANCE */ "Invalid performance/robustness value",
+/* ASL_MSG_INVALID_PRIORITY */ "Invalid priority value",
+/* ASL_MSG_INVALID_STRING */ "Invalid Hex/Octal Escape - Non-ASCII or NULL",
+/* ASL_MSG_INVALID_TARGET */ "Target operand not allowed in constant expression",
+/* ASL_MSG_INVALID_TIME */ "Time parameter too long (255 max)",
+/* ASL_MSG_INVALID_TYPE */ "Invalid type",
+/* ASL_MSG_INVALID_UUID */ "UUID string must be of the form \"aabbccdd-eeff-gghh-iijj-kkllmmnnoopp\"",
+/* ASL_MSG_LIST_LENGTH */ "Initializer list too long",
+/* ASL_MSG_LISTING_FILE_OPEN */ "Could not open listing file",
+/* ASL_MSG_LISTING_FILENAME */ "Could not create listing filename",
+/* ASL_MSG_LOCAL_INIT */ "Method local variable is not initialized",
+/* ASL_MSG_LONG_LINE */ "Splitting long input line",
+/* ASL_MSG_MEMORY_ALLOCATION */ "Memory allocation failure",
+/* ASL_MSG_MISSING_ENDDEPENDENT */ "Missing EndDependentFn() macro in dependent resource list",
+/* ASL_MSG_MISSING_STARTDEPENDENT */ "Missing StartDependentFn() macro in dependent resource list",
+/* ASL_MSG_MULTIPLE_TYPES */ "Multiple types",
+/* ASL_MSG_NAME_EXISTS */ "Name already exists in scope",
+/* ASL_MSG_NAME_OPTIMIZATION */ "NamePath optimized",
+/* ASL_MSG_NESTED_COMMENT */ "Nested comment found",
+/* ASL_MSG_NO_CASES */ "No Case statements under Switch",
+/* ASL_MSG_NO_RETVAL */ "Called method returns no value",
+/* ASL_MSG_NO_WHILE */ "No enclosing While statement",
+/* ASL_MSG_NON_ASCII */ "Invalid characters found in file",
+/* ASL_MSG_NOT_EXIST */ "Object does not exist",
+/* ASL_MSG_NOT_FOUND */ "Object not found or not accessible from scope",
+/* ASL_MSG_NOT_METHOD */ "Not a control method, cannot invoke",
+/* ASL_MSG_NOT_PARAMETER */ "Not a parameter, used as local only",
+/* ASL_MSG_NOT_REACHABLE */ "Object is not accessible from this scope",
+/* ASL_MSG_OPEN */ "Could not open file",
+/* ASL_MSG_OUTPUT_FILE_OPEN */ "Could not open output AML file",
+/* ASL_MSG_OUTPUT_FILENAME */ "Could not create output filename",
+/* ASL_MSG_PACKAGE_LENGTH */ "Effective AML package length is zero",
+/* ASL_MSG_READ */ "Could not read file",
+/* ASL_MSG_RECURSION */ "Recursive method call",
+/* ASL_MSG_REGION_BUFFER_ACCESS */ "Host Operation Region requires BufferAcc access",
+/* ASL_MSG_REGION_BYTE_ACCESS */ "Host Operation Region requires ByteAcc access",
+/* ASL_MSG_RESERVED_ARG_COUNT_HI */ "Reserved method has too many arguments",
+/* ASL_MSG_RESERVED_ARG_COUNT_LO */ "Reserved method has too few arguments",
+/* ASL_MSG_RESERVED_METHOD */ "Reserved name must be a control method",
+/* ASL_MSG_RESERVED_OPERAND_TYPE */ "Invalid operand type for reserved name, must be",
+/* ASL_MSG_RESERVED_RETURN_VALUE */ "Reserved method must return a value",
+/* ASL_MSG_RESERVED_USE */ "Invalid use of reserved name",
+/* ASL_MSG_RESERVED_WORD */ "Use of reserved word",
+/* ASL_MSG_RESOURCE_FIELD */ "Resource field name cannot be used as a target",
+/* ASL_MSG_RESOURCE_INDEX */ "Missing ResourceSourceIndex (required)",
+/* ASL_MSG_RESOURCE_LIST */ "Too many resource items (internal error)",
+/* ASL_MSG_RESOURCE_SOURCE */ "Missing ResourceSource string (required)",
+/* ASL_MSG_RETURN_TYPES */ "Not all control paths return a value",
+/* ASL_MSG_SCOPE_FWD_REF */ "Forward references from Scope operator not allowed",
+/* ASL_MSG_SCOPE_TYPE */ "Existing object has invalid type for Scope operator",
+/* ASL_MSG_SEEK */ "Could not seek file",
+/* ASL_MSG_SINGLE_NAME_OPTIMIZATION */ "NamePath optimized to NameSeg (uses run-time search path)",
+/* ASL_MSG_SOME_NO_RETVAL */ "Called method may not always return a value",
+/* ASL_MSG_SWITCH_TYPE */ "Switch expression is not a static Integer/Buffer/String data type, defaulting to Integer",
+/* ASL_MSG_SYNC_LEVEL */ "SyncLevel must be in the range 0-15",
+/* ASL_MSG_SYNTAX */ "",
+/* ASL_MSG_TABLE_SIGNATURE */ "Invalid Table Signature",
+/* ASL_MSG_TOO_MANY_TEMPS */ "Method requires too many temporary variables (_T_x)",
+/* ASL_MSG_UNKNOWN_RESERVED_NAME */ "Unknown reserved name",
+/* ASL_MSG_UNREACHABLE_CODE */ "Statement is unreachable",
+/* ASL_MSG_UNSUPPORTED */ "Unsupported feature",
+/* ASL_MSG_VENDOR_LIST */ "Too many vendor data bytes (7 max)",
+/* ASL_MSG_WRITE */ "Could not write file",
+/* ASL_MSG_MULTIPLE_DEFAULT */ "More than one Default statement within Switch construct",
+/* ASL_MSG_TIMEOUT */ "Possible operator timeout is ignored",
+/* ASL_MSG_RESULT_NOT_USED */ "Result is not used, operator has no effect",
+/* ASL_MSG_NOT_REFERENCED */ "Namespace object is not referenced",
+/* ASL_MSG_NON_ZERO */ "Operand evaluates to zero",
+/* ASL_MSG_STRING_LENGTH */ "String literal too long"
+
+};
+
+
+char *AslErrorLevel [ASL_NUM_REPORT_LEVELS] = {
+ "Warning ",
+ "Warning ",
+ "Warning ",
+ "Error ",
+ "Remark ",
+ "Optimize"
+};
+
+#define ASL_ERROR_LEVEL_LENGTH 8 /* Length of strings above */
+
+/* Exception counters */
+
+UINT32 Gbl_ExceptionCount[ASL_NUM_REPORT_LEVELS] = {0,0,0,0,0,0};
+
+#endif
+
+
+#endif /* __ASLTYPES_H */
diff --git a/sys/contrib/dev/acpica/compiler/aslutils.c b/sys/contrib/dev/acpica/compiler/aslutils.c
new file mode 100644
index 0000000..5acf1fc
--- /dev/null
+++ b/sys/contrib/dev/acpica/compiler/aslutils.c
@@ -0,0 +1,1055 @@
+
+/******************************************************************************
+ *
+ * Module Name: aslutils -- compiler utilities
+ * $Revision: 1.72 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/compiler/aslcompiler.h>
+#include "aslcompiler.y.h"
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+#define _COMPONENT ACPI_COMPILER
+ ACPI_MODULE_NAME ("aslutils")
+
+#ifdef _USE_BERKELEY_YACC
+extern const char * const AslCompilername[];
+static const char * const *yytname = &AslCompilername[254];
+#else
+extern const char * const yytname[];
+#endif
+
+/* Local prototypes */
+
+static ACPI_STATUS
+UtStrtoul64 (
+ char *String,
+ UINT32 Base,
+ ACPI_INTEGER *RetInteger);
+
+static void
+UtPadNameWithUnderscores (
+ char *NameSeg,
+ char *PaddedNameSeg);
+
+static void
+UtAttachNameseg (
+ ACPI_PARSE_OBJECT *Op,
+ char *Name);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsDisplayConstantOpcodes
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print AML opcodes that can be used in constant expressions.
+ *
+ ******************************************************************************/
+
+void
+UtDisplayConstantOpcodes (
+ void)
+{
+ UINT32 i;
+
+
+ printf ("Constant expression opcode information\n\n");
+
+ for (i = 0; i < sizeof (AcpiGbl_AmlOpInfo) / sizeof (ACPI_OPCODE_INFO); i++)
+ {
+ if (AcpiGbl_AmlOpInfo[i].Flags & AML_CONSTANT)
+ {
+ printf ("%s\n", AcpiGbl_AmlOpInfo[i].Name);
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtLocalCalloc
+ *
+ * PARAMETERS: Size - Bytes to be allocated
+ *
+ * RETURN: Pointer to the allocated memory. Guaranteed to be valid.
+ *
+ * DESCRIPTION: Allocate zero-initialized memory. Aborts the compile on an
+ * allocation failure, on the assumption that nothing more can be
+ * accomplished.
+ *
+ ******************************************************************************/
+
+void *
+UtLocalCalloc (
+ UINT32 Size)
+{
+ void *Allocated;
+
+
+ Allocated = ACPI_ALLOCATE_ZEROED (Size);
+ if (!Allocated)
+ {
+ AslCommonError (ASL_ERROR, ASL_MSG_MEMORY_ALLOCATION,
+ Gbl_CurrentLineNumber, Gbl_LogicalLineNumber,
+ Gbl_InputByteCount, Gbl_CurrentColumn,
+ Gbl_Files[ASL_FILE_INPUT].Filename, NULL);
+ exit (1);
+ }
+
+ TotalAllocations++;
+ TotalAllocated += Size;
+ return (Allocated);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtBeginEvent
+ *
+ * PARAMETERS: Name - Ascii name of this event
+ *
+ * RETURN: Event - Event number (integer index)
+ *
+ * DESCRIPTION: Saves the current time with this event
+ *
+ ******************************************************************************/
+
+UINT8
+UtBeginEvent (
+ char *Name)
+{
+
+ if (AslGbl_NextEvent >= ASL_NUM_EVENTS)
+ {
+ AcpiOsPrintf ("Ran out of compiler event structs!\n");
+ return (AslGbl_NextEvent);
+ }
+
+ /* Init event with current (start) time */
+
+ AslGbl_Events[AslGbl_NextEvent].StartTime = AcpiOsGetTimer ();
+ AslGbl_Events[AslGbl_NextEvent].EventName = Name;
+ AslGbl_Events[AslGbl_NextEvent].Valid = TRUE;
+
+ return (AslGbl_NextEvent++);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtEndEvent
+ *
+ * PARAMETERS: Event - Event number (integer index)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Saves the current time (end time) with this event
+ *
+ ******************************************************************************/
+
+void
+UtEndEvent (
+ UINT8 Event)
+{
+
+ if (Event >= ASL_NUM_EVENTS)
+ {
+ return;
+ }
+
+ /* Insert end time for event */
+
+ AslGbl_Events[Event].EndTime = AcpiOsGetTimer ();
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtHexCharToValue
+ *
+ * PARAMETERS: HexChar - Hex character in Ascii
+ *
+ * RETURN: The binary value of the hex character
+ *
+ * DESCRIPTION: Perform ascii-to-hex translation
+ *
+ ******************************************************************************/
+
+UINT8
+UtHexCharToValue (
+ int HexChar)
+{
+
+ if (HexChar <= 0x39)
+ {
+ return ((UINT8) (HexChar - 0x30));
+ }
+
+ if (HexChar <= 0x46)
+ {
+ return ((UINT8) (HexChar - 0x37));
+ }
+
+ return ((UINT8) (HexChar - 0x57));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtConvertByteToHex
+ *
+ * PARAMETERS: RawByte - Binary data
+ * Buffer - Pointer to where the hex bytes will be stored
+ *
+ * RETURN: Ascii hex byte is stored in Buffer.
+ *
+ * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
+ * with "0x"
+ *
+ ******************************************************************************/
+
+void
+UtConvertByteToHex (
+ UINT8 RawByte,
+ UINT8 *Buffer)
+{
+
+ Buffer[0] = '0';
+ Buffer[1] = 'x';
+
+ Buffer[2] = (UINT8) hex[(RawByte >> 4) & 0xF];
+ Buffer[3] = (UINT8) hex[RawByte & 0xF];
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtConvertByteToAsmHex
+ *
+ * PARAMETERS: RawByte - Binary data
+ * Buffer - Pointer to where the hex bytes will be stored
+ *
+ * RETURN: Ascii hex byte is stored in Buffer.
+ *
+ * DESCRIPTION: Perform hex-to-ascii translation. The return data is prefixed
+ * with "0x"
+ *
+ ******************************************************************************/
+
+void
+UtConvertByteToAsmHex (
+ UINT8 RawByte,
+ UINT8 *Buffer)
+{
+
+ Buffer[0] = '0';
+ Buffer[1] = (UINT8) hex[(RawByte >> 4) & 0xF];
+ Buffer[2] = (UINT8) hex[RawByte & 0xF];
+ Buffer[3] = 'h';
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: DbgPrint
+ *
+ * PARAMETERS: Type - Type of output
+ * Fmt - Printf format string
+ * ... - variable printf list
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Conditional print statement. Prints to stderr only if the
+ * debug flag is set.
+ *
+ ******************************************************************************/
+
+void
+DbgPrint (
+ UINT32 Type,
+ char *Fmt,
+ ...)
+{
+ va_list Args;
+
+
+ va_start (Args, Fmt);
+
+ if (!Gbl_DebugFlag)
+ {
+ return;
+ }
+
+ if ((Type == ASL_PARSE_OUTPUT) &&
+ (!(AslCompilerdebug)))
+ {
+ return;
+ }
+
+ (void) vfprintf (stderr, Fmt, Args);
+ va_end (Args);
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtPrintFormattedName
+ *
+ * PARAMETERS: ParseOpcode - Parser keyword ID
+ * Level - Indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print the ascii name of the parse opcode.
+ *
+ ******************************************************************************/
+
+#define TEXT_OFFSET 10
+
+void
+UtPrintFormattedName (
+ UINT16 ParseOpcode,
+ UINT32 Level)
+{
+
+ if (Level)
+ {
+ DbgPrint (ASL_TREE_OUTPUT,
+ "%*s", (3 * Level), " ");
+ }
+ DbgPrint (ASL_TREE_OUTPUT,
+ " %-20.20s", UtGetOpName (ParseOpcode));
+
+ if (Level < TEXT_OFFSET)
+ {
+ DbgPrint (ASL_TREE_OUTPUT,
+ "%*s", (TEXT_OFFSET - Level) * 3, " ");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtSetParseOpName
+ *
+ * PARAMETERS: Op
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Insert the ascii name of the parse opcode
+ *
+ ******************************************************************************/
+
+void
+UtSetParseOpName (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ strncpy (Op->Asl.ParseOpName, UtGetOpName (Op->Asl.ParseOpcode),
+ ACPI_MAX_PARSEOP_NAME);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtGetOpName
+ *
+ * PARAMETERS: ParseOpcode - Parser keyword ID
+ *
+ * RETURN: Pointer to the opcode name
+ *
+ * DESCRIPTION: Get the ascii name of the parse opcode
+ *
+ ******************************************************************************/
+
+char *
+UtGetOpName (
+ UINT32 ParseOpcode)
+{
+
+ /*
+ * First entries (ASL_YYTNAME_START) in yytname are special reserved names.
+ * Ignore first 8 characters of the name
+ */
+ return ((char *) yytname
+ [(ParseOpcode - ASL_FIRST_PARSE_OPCODE) + ASL_YYTNAME_START] + 8);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtDisplaySummary
+ *
+ * PARAMETERS: FileID - ID of outpout file
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display compilation statistics
+ *
+ ******************************************************************************/
+
+void
+UtDisplaySummary (
+ UINT32 FileId)
+{
+
+ if (FileId != ASL_FILE_STDOUT)
+ {
+ /* Compiler name and version number */
+
+ FlPrintFile (FileId, "%s version %X [%s]\n",
+ CompilerId, (UINT32) ACPI_CA_VERSION, __DATE__);
+ }
+
+ /* Input/Output summary */
+
+ FlPrintFile (FileId,
+ "ASL Input: %s - %d lines, %d bytes, %d keywords\n",
+ Gbl_Files[ASL_FILE_INPUT].Filename, Gbl_CurrentLineNumber,
+ Gbl_InputByteCount, TotalKeywords);
+
+ /* AML summary */
+
+ if ((Gbl_ExceptionCount[ASL_ERROR] == 0) || (Gbl_IgnoreErrors))
+ {
+ FlPrintFile (FileId,
+ "AML Output: %s - %d bytes %d named objects %d executable opcodes\n\n",
+ Gbl_Files[ASL_FILE_AML_OUTPUT].Filename, Gbl_TableLength,
+ TotalNamedObjects, TotalExecutableOpcodes);
+ }
+
+ /* Error summary */
+
+ FlPrintFile (FileId,
+ "Compilation complete. %d Errors, %d Warnings, %d Remarks, %d Optimizations\n",
+ Gbl_ExceptionCount[ASL_ERROR],
+ Gbl_ExceptionCount[ASL_WARNING] +
+ Gbl_ExceptionCount[ASL_WARNING2] +
+ Gbl_ExceptionCount[ASL_WARNING3],
+ Gbl_ExceptionCount[ASL_REMARK],
+ Gbl_ExceptionCount[ASL_OPTIMIZATION]);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtDisplaySummary
+ *
+ * PARAMETERS: Op - Integer parse node
+ * LowValue - Smallest allowed value
+ * HighValue - Largest allowed value
+ *
+ * RETURN: Op if OK, otherwise NULL
+ *
+ * DESCRIPTION: Check integer for an allowable range
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+UtCheckIntegerRange (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 LowValue,
+ UINT32 HighValue)
+{
+ char *ParseError = NULL;
+ char Buffer[64];
+
+
+ if (!Op)
+ {
+ return NULL;
+ }
+
+ if (Op->Asl.Value.Integer < LowValue)
+ {
+ ParseError = "Value below valid range";
+ Op->Asl.Value.Integer = LowValue;
+ }
+
+ if (Op->Asl.Value.Integer > HighValue)
+ {
+ ParseError = "Value above valid range";
+ Op->Asl.Value.Integer = HighValue;
+ }
+
+ if (ParseError)
+ {
+ sprintf (Buffer, "%s 0x%X-0x%X", ParseError, LowValue, HighValue);
+ AslCompilererror (Buffer);
+
+ return NULL;
+ }
+
+ return Op;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtGetStringBuffer
+ *
+ * PARAMETERS: Length - Size of buffer requested
+ *
+ * RETURN: Pointer to the buffer. Aborts on allocation failure
+ *
+ * DESCRIPTION: Allocate a string buffer. Bypass the local
+ * dynamic memory manager for performance reasons (This has a
+ * major impact on the speed of the compiler.)
+ *
+ ******************************************************************************/
+
+char *
+UtGetStringBuffer (
+ UINT32 Length)
+{
+ char *Buffer;
+
+
+ if ((Gbl_StringCacheNext + Length) >= Gbl_StringCacheLast)
+ {
+ Gbl_StringCacheNext = UtLocalCalloc (ASL_STRING_CACHE_SIZE + Length);
+ Gbl_StringCacheLast = Gbl_StringCacheNext + ASL_STRING_CACHE_SIZE +
+ Length;
+ }
+
+ Buffer = Gbl_StringCacheNext;
+ Gbl_StringCacheNext += Length;
+
+ return (Buffer);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtInternalizeName
+ *
+ * PARAMETERS: ExternalName - Name to convert
+ * ConvertedName - Where the converted name is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert an external (ASL) name to an internal (AML) name
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+UtInternalizeName (
+ char *ExternalName,
+ char **ConvertedName)
+{
+ ACPI_NAMESTRING_INFO Info;
+ ACPI_STATUS Status;
+
+
+ if (!ExternalName)
+ {
+ return (AE_OK);
+ }
+
+ /* Get the length of the new internal name */
+
+ Info.ExternalName = ExternalName;
+ AcpiNsGetInternalNameLength (&Info);
+
+ /* We need a segment to store the internal name */
+
+ Info.InternalName = UtGetStringBuffer (Info.Length);
+ if (!Info.InternalName)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ /* Build the name */
+
+ Status = AcpiNsBuildInternalName (&Info);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ *ConvertedName = Info.InternalName;
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtPadNameWithUnderscores
+ *
+ * PARAMETERS: NameSeg - Input nameseg
+ * PaddedNameSeg - Output padded nameseg
+ *
+ * RETURN: Padded nameseg.
+ *
+ * DESCRIPTION: Pads a NameSeg with underscores if necessary to form a full
+ * ACPI_NAME.
+ *
+ ******************************************************************************/
+
+static void
+UtPadNameWithUnderscores (
+ char *NameSeg,
+ char *PaddedNameSeg)
+{
+ UINT32 i;
+
+
+ for (i = 0; (i < ACPI_NAME_SIZE); i++)
+ {
+ if (*NameSeg)
+ {
+ *PaddedNameSeg = *NameSeg;
+ NameSeg++;
+ }
+ else
+ {
+ *PaddedNameSeg = '_';
+ }
+ PaddedNameSeg++;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtAttachNameseg
+ *
+ * PARAMETERS: Op - Parent parse node
+ * Name - Full ExternalName
+ *
+ * RETURN: None; Sets the NameSeg field in parent node
+ *
+ * DESCRIPTION: Extract the last nameseg of the ExternalName and store it
+ * in the NameSeg field of the Op.
+ *
+ ******************************************************************************/
+
+static void
+UtAttachNameseg (
+ ACPI_PARSE_OBJECT *Op,
+ char *Name)
+{
+ char *NameSeg;
+ char PaddedNameSeg[4];
+
+
+ if (!Name)
+ {
+ return;
+ }
+
+ /* Look for the last dot in the namepath */
+
+ NameSeg = strrchr (Name, '.');
+ if (NameSeg)
+ {
+ /* Found last dot, we have also found the final nameseg */
+
+ NameSeg++;
+ UtPadNameWithUnderscores (NameSeg, PaddedNameSeg);
+ }
+ else
+ {
+ /* No dots in the namepath, there is only a single nameseg. */
+ /* Handle prefixes */
+
+ while ((*Name == '\\') || (*Name == '^'))
+ {
+ Name++;
+ }
+
+ /* Remaing string should be one single nameseg */
+
+ UtPadNameWithUnderscores (Name, PaddedNameSeg);
+ }
+
+ strncpy (Op->Asl.NameSeg, PaddedNameSeg, 4);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtAttachNamepathToOwner
+ *
+ * PARAMETERS: Op - Parent parse node
+ * NameOp - Node that contains the name
+ *
+ * RETURN: Sets the ExternalName and Namepath in the parent node
+ *
+ * DESCRIPTION: Store the name in two forms in the parent node: The original
+ * (external) name, and the internalized name that is used within
+ * the ACPI namespace manager.
+ *
+ ******************************************************************************/
+
+void
+UtAttachNamepathToOwner (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_PARSE_OBJECT *NameOp)
+{
+ ACPI_STATUS Status;
+
+
+ /* Full external path */
+
+ Op->Asl.ExternalName = NameOp->Asl.Value.String;
+
+ /* Save the NameOp for possible error reporting later */
+
+ Op->Asl.ParentMethod = (void *) NameOp;
+
+ /* Last nameseg of the path */
+
+ UtAttachNameseg (Op, Op->Asl.ExternalName);
+
+ /* Create internalized path */
+
+ Status = UtInternalizeName (NameOp->Asl.Value.String, &Op->Asl.Namepath);
+ if (ACPI_FAILURE (Status))
+ {
+ /* TBD: abort on no memory */
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtDoConstant
+ *
+ * PARAMETERS: String - Hex, Octal, or Decimal string
+ *
+ * RETURN: Converted Integer
+ *
+ * DESCRIPTION: Convert a string to an integer. With error checking.
+ *
+ ******************************************************************************/
+
+ACPI_INTEGER
+UtDoConstant (
+ char *String)
+{
+ ACPI_STATUS Status;
+ ACPI_INTEGER Converted;
+ char ErrBuf[64];
+
+
+ Status = UtStrtoul64 (String, 0, &Converted);
+ if (ACPI_FAILURE (Status))
+ {
+ sprintf (ErrBuf, "%s %s\n", "Conversion error:",
+ AcpiFormatException (Status));
+ AslCompilererror (ErrBuf);
+ }
+
+ return (Converted);
+}
+
+
+/* TBD: use version in ACPI CA main code base? */
+
+/*******************************************************************************
+ *
+ * FUNCTION: UtStrtoul64
+ *
+ * PARAMETERS: String - Null terminated string
+ * Terminater - Where a pointer to the terminating byte is
+ * returned
+ * Base - Radix of the string
+ *
+ * RETURN: Converted value
+ *
+ * DESCRIPTION: Convert a string into an unsigned value.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+UtStrtoul64 (
+ char *String,
+ UINT32 Base,
+ ACPI_INTEGER *RetInteger)
+{
+ UINT32 Index;
+ UINT32 Sign;
+ ACPI_INTEGER ReturnValue = 0;
+ ACPI_STATUS Status = AE_OK;
+
+
+ *RetInteger = 0;
+
+ switch (Base)
+ {
+ case 0:
+ case 8:
+ case 10:
+ case 16:
+ break;
+
+ default:
+ /*
+ * The specified Base parameter is not in the domain of
+ * this function:
+ */
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Skip over any white space in the buffer: */
+
+ while (isspace (*String) || *String == '\t')
+ {
+ ++String;
+ }
+
+ /*
+ * The buffer may contain an optional plus or minus sign.
+ * If it does, then skip over it but remember what is was:
+ */
+ if (*String == '-')
+ {
+ Sign = NEGATIVE;
+ ++String;
+ }
+ else if (*String == '+')
+ {
+ ++String;
+ Sign = POSITIVE;
+ }
+ else
+ {
+ Sign = POSITIVE;
+ }
+
+ /*
+ * If the input parameter Base is zero, then we need to
+ * determine if it is octal, decimal, or hexadecimal:
+ */
+ if (Base == 0)
+ {
+ if (*String == '0')
+ {
+ if (tolower (*(++String)) == 'x')
+ {
+ Base = 16;
+ ++String;
+ }
+ else
+ {
+ Base = 8;
+ }
+ }
+ else
+ {
+ Base = 10;
+ }
+ }
+
+ /*
+ * For octal and hexadecimal bases, skip over the leading
+ * 0 or 0x, if they are present.
+ */
+ if (Base == 8 && *String == '0')
+ {
+ String++;
+ }
+
+ if (Base == 16 &&
+ *String == '0' &&
+ tolower (*(++String)) == 'x')
+ {
+ String++;
+ }
+
+ /* Main loop: convert the string to an unsigned long */
+
+ while (*String)
+ {
+ if (isdigit (*String))
+ {
+ Index = ((UINT8) *String) - '0';
+ }
+ else
+ {
+ Index = (UINT8) toupper (*String);
+ if (isupper ((char) Index))
+ {
+ Index = Index - 'A' + 10;
+ }
+ else
+ {
+ goto ErrorExit;
+ }
+ }
+
+ if (Index >= Base)
+ {
+ goto ErrorExit;
+ }
+
+ /* Check to see if value is out of range: */
+
+ if (ReturnValue > ((ACPI_INTEGER_MAX - (ACPI_INTEGER) Index) /
+ (ACPI_INTEGER) Base))
+ {
+ goto ErrorExit;
+ }
+ else
+ {
+ ReturnValue *= Base;
+ ReturnValue += Index;
+ }
+
+ ++String;
+ }
+
+
+ /* If a minus sign was present, then "the conversion is negated": */
+
+ if (Sign == NEGATIVE)
+ {
+ ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;
+ }
+
+ *RetInteger = ReturnValue;
+ return (Status);
+
+
+ErrorExit:
+ switch (Base)
+ {
+ case 8:
+ Status = AE_BAD_OCTAL_CONSTANT;
+ break;
+
+ case 10:
+ Status = AE_BAD_DECIMAL_CONSTANT;
+ break;
+
+ case 16:
+ Status = AE_BAD_HEX_CONSTANT;
+ break;
+
+ default:
+ /* Base validated above */
+ break;
+ }
+
+ return (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/dbcmds.c b/sys/contrib/dev/acpica/dbcmds.c
new file mode 100644
index 0000000..70120ff
--- /dev/null
+++ b/sys/contrib/dev/acpica/dbcmds.c
@@ -0,0 +1,1838 @@
+/*******************************************************************************
+ *
+ * Module Name: dbcmds - debug commands and output routines
+ * $Revision: 1.150 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/acdebug.h>
+#include <contrib/dev/acpica/acresrc.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+
+#include <contrib/dev/acpica/acparser.h>
+
+#ifdef ACPI_DEBUGGER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbcmds")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDbIntegrityWalk (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue);
+
+static ACPI_STATUS
+AcpiDbWalkAndMatchName (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue);
+
+static ACPI_STATUS
+AcpiDbWalkForReferences (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue);
+
+static ACPI_STATUS
+AcpiDbWalkForSpecificObjects (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue);
+
+static ACPI_NAMESPACE_NODE *
+AcpiDbConvertToNode (
+ char *InString);
+
+static void
+AcpiDmCompareAmlResources (
+ UINT8 *Aml1Buffer,
+ ACPI_RSDESC_SIZE Aml1BufferLength,
+ UINT8 *Aml2Buffer,
+ ACPI_RSDESC_SIZE Aml2BufferLength);
+
+static ACPI_STATUS
+AcpiDmTestResourceConversion (
+ ACPI_NAMESPACE_NODE *Node,
+ char *Name);
+
+
+/*
+ * Arguments for the Objects command
+ * These object types map directly to the ACPI_TYPES
+ */
+static ARGUMENT_INFO AcpiDbObjectTypes [] =
+{
+ {"ANY"},
+ {"INTEGERS"},
+ {"STRINGS"},
+ {"BUFFERS"},
+ {"PACKAGES"},
+ {"FIELDS"},
+ {"DEVICES"},
+ {"EVENTS"},
+ {"METHODS"},
+ {"MUTEXES"},
+ {"REGIONS"},
+ {"POWERRESOURCES"},
+ {"PROCESSORS"},
+ {"THERMALZONES"},
+ {"BUFFERFIELDS"},
+ {"DDBHANDLES"},
+ {"DEBUG"},
+ {"REGIONFIELDS"},
+ {"BANKFIELDS"},
+ {"INDEXFIELDS"},
+ {"REFERENCES"},
+ {"ALIAS"},
+ {NULL} /* Must be null terminated */
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbConvertToNode
+ *
+ * PARAMETERS: InString - String to convert
+ *
+ * RETURN: Pointer to a NS node
+ *
+ * DESCRIPTION: Convert a string to a valid NS pointer. Handles numeric or
+ * alpha strings.
+ *
+ ******************************************************************************/
+
+static ACPI_NAMESPACE_NODE *
+AcpiDbConvertToNode (
+ char *InString)
+{
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ if ((*InString >= 0x30) && (*InString <= 0x39))
+ {
+ /* Numeric argument, convert */
+
+ Node = ACPI_TO_POINTER (ACPI_STRTOUL (InString, NULL, 16));
+ if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
+ {
+ AcpiOsPrintf ("Address %p is invalid in this address space\n",
+ Node);
+ return (NULL);
+ }
+
+ /* Make sure pointer is valid NS node */
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
+ {
+ AcpiOsPrintf ("Address %p is not a valid NS node [%s]\n",
+ Node, AcpiUtGetDescriptorName (Node));
+ return (NULL);
+ }
+ }
+ else
+ {
+ /* Alpha argument */
+ /* The parameter is a name string that must be resolved to a
+ * Named obj
+ */
+ Node = AcpiDbLocalNsLookup (InString);
+ if (!Node)
+ {
+ Node = AcpiGbl_RootNode;
+ }
+ }
+
+ return (Node);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbSleep
+ *
+ * PARAMETERS: ObjectArg - Desired sleep state (0-5)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Simulate a sleep/wake sequence
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbSleep (
+ char *ObjectArg)
+{
+ ACPI_STATUS Status;
+ UINT8 SleepState;
+
+
+ SleepState = (UINT8) ACPI_STRTOUL (ObjectArg, NULL, 0);
+
+ AcpiOsPrintf ("**** Prepare to sleep ****\n");
+ Status = AcpiEnterSleepStatePrep (SleepState);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ AcpiOsPrintf ("**** Going to sleep ****\n");
+ Status = AcpiEnterSleepState (SleepState);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ AcpiOsPrintf ("**** returning from sleep ****\n");
+ Status = AcpiLeaveSleepState (SleepState);
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbWalkForReferences
+ *
+ * PARAMETERS: Callback from WalkNamespace
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Check if this namespace object refers to the target object
+ * that is passed in as the context value.
+ *
+ * Note: Currently doesn't check subobjects within the Node's object
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbWalkForReferences (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc = (ACPI_OPERAND_OBJECT *) Context;
+ ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
+
+
+ /* Check for match against the namespace node itself */
+
+ if (Node == (void *) ObjDesc)
+ {
+ AcpiOsPrintf ("Object is a Node [%4.4s]\n",
+ AcpiUtGetNodeName (Node));
+ }
+
+ /* Check for match against the object attached to the node */
+
+ if (AcpiNsGetAttachedObject (Node) == ObjDesc)
+ {
+ AcpiOsPrintf ("Reference at Node->Object %p [%4.4s]\n",
+ Node, AcpiUtGetNodeName (Node));
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbFindReferences
+ *
+ * PARAMETERS: ObjectArg - String with hex value of the object
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Search namespace for all references to the input object
+ *
+ ******************************************************************************/
+
+void
+AcpiDbFindReferences (
+ char *ObjectArg)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ /* Convert string to object pointer */
+
+ ObjDesc = ACPI_TO_POINTER (ACPI_STRTOUL (ObjectArg, NULL, 16));
+
+ /* Search all nodes in namespace */
+
+ (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
+ AcpiDbWalkForReferences, (void *) ObjDesc, NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayLocks
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display information about internal mutexes.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayLocks (
+ void)
+{
+ UINT32 i;
+
+
+ for (i = 0; i < ACPI_MAX_MUTEX; i++)
+ {
+ AcpiOsPrintf ("%26s : %s\n", AcpiUtGetMutexName (i),
+ AcpiGbl_MutexInfo[i].ThreadId == ACPI_MUTEX_NOT_ACQUIRED
+ ? "Locked" : "Unlocked");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayTableInfo
+ *
+ * PARAMETERS: TableArg - String with name of table to be displayed
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display information about loaded tables. Current
+ * implementation displays all loaded tables.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayTableInfo (
+ char *TableArg)
+{
+ ACPI_NATIVE_UINT i;
+ ACPI_TABLE_DESC *TableDesc;
+
+
+ /*
+ * Walk the root table list
+ */
+ for (i = 0; i < AcpiGbl_RootTableList.Count; i++)
+ {
+ TableDesc = &AcpiGbl_RootTableList.Tables[i];
+ AcpiOsPrintf ( "%4.4s at %p length %.5X",
+ TableDesc->Signature.Ascii, TableDesc->Pointer,
+ (UINT32) TableDesc->Length);
+
+ if (TableDesc->Pointer && (i != ACPI_TABLE_INDEX_FACS))
+ {
+ AcpiOsPrintf (" OemId=\"%6s\" OemTableId=\"%8s\" OemRevision=%8.8X",
+ TableDesc->Pointer->OemId,
+ TableDesc->Pointer->OemTableId,
+ TableDesc->Pointer->OemRevision);
+ }
+ AcpiOsPrintf ("\n");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbUnloadAcpiTable
+ *
+ * PARAMETERS: TableArg - Name of the table to be unloaded
+ * InstanceArg - Which instance of the table to unload (if
+ * there are multiple tables of the same type)
+ *
+ * RETURN: Nonde
+ *
+ * DESCRIPTION: Unload an ACPI table.
+ * Instance is not implemented
+ *
+ ******************************************************************************/
+
+void
+AcpiDbUnloadAcpiTable (
+ char *TableArg,
+ char *InstanceArg)
+{
+/* TBD: Need to reimplement for new data structures */
+
+#if 0
+ UINT32 i;
+ ACPI_STATUS Status;
+
+
+ /* Search all tables for the target type */
+
+ for (i = 0; i < (ACPI_TABLE_ID_MAX+1); i++)
+ {
+ if (!ACPI_STRNCMP (TableArg, AcpiGbl_TableData[i].Signature,
+ AcpiGbl_TableData[i].SigLength))
+ {
+ /* Found the table, unload it */
+
+ Status = AcpiUnloadTable (i);
+ if (ACPI_SUCCESS (Status))
+ {
+ AcpiOsPrintf ("[%s] unloaded and uninstalled\n", TableArg);
+ }
+ else
+ {
+ AcpiOsPrintf ("%s, while unloading [%s]\n",
+ AcpiFormatException (Status), TableArg);
+ }
+
+ return;
+ }
+ }
+
+ AcpiOsPrintf ("Unknown table type [%s]\n", TableArg);
+#endif
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbSetMethodBreakpoint
+ *
+ * PARAMETERS: Location - AML offset of breakpoint
+ * WalkState - Current walk info
+ * Op - Current Op (from parse walk)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Set a breakpoint in a control method at the specified
+ * AML offset
+ *
+ ******************************************************************************/
+
+void
+AcpiDbSetMethodBreakpoint (
+ char *Location,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT32 Address;
+
+
+ if (!Op)
+ {
+ AcpiOsPrintf ("There is no method currently executing\n");
+ return;
+ }
+
+ /* Get and verify the breakpoint address */
+
+ Address = ACPI_STRTOUL (Location, NULL, 16);
+ if (Address <= Op->Common.AmlOffset)
+ {
+ AcpiOsPrintf ("Breakpoint %X is beyond current address %X\n",
+ Address, Op->Common.AmlOffset);
+ }
+
+ /* Save breakpoint in current walk */
+
+ WalkState->UserBreakpoint = Address;
+ AcpiOsPrintf ("Breakpoint set at AML offset %X\n", Address);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbSetMethodCallBreakpoint
+ *
+ * PARAMETERS: Op - Current Op (from parse walk)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Set a breakpoint in a control method at the specified
+ * AML offset
+ *
+ ******************************************************************************/
+
+void
+AcpiDbSetMethodCallBreakpoint (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+
+ if (!Op)
+ {
+ AcpiOsPrintf ("There is no method currently executing\n");
+ return;
+ }
+
+ AcpiGbl_StepToNextCall = TRUE;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisassembleAml
+ *
+ * PARAMETERS: Statements - Number of statements to disassemble
+ * Op - Current Op (from parse walk)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number
+ * of statements specified.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisassembleAml (
+ char *Statements,
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT32 NumStatements = 8;
+
+
+ if (!Op)
+ {
+ AcpiOsPrintf ("There is no method currently executing\n");
+ return;
+ }
+
+ if (Statements)
+ {
+ NumStatements = ACPI_STRTOUL (Statements, NULL, 0);
+ }
+
+#ifdef ACPI_DISASSEMBLER
+ AcpiDmDisassemble (NULL, Op, NumStatements);
+#endif
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisassembleMethod
+ *
+ * PARAMETERS: Name - Name of control method
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display disassembled AML (ASL) starting from Op for the number
+ * of statements specified.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbDisassembleMethod (
+ char *Name)
+{
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_WALK_STATE *WalkState;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Method;
+
+
+ Method = AcpiDbConvertToNode (Name);
+ if (!Method)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ ObjDesc = Method->Object;
+
+ Op = AcpiPsCreateScopeOp ();
+ if (!Op)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ /* Create and initialize a new walk state */
+
+ WalkState = AcpiDsCreateWalkState (0, Op, NULL, NULL);
+ if (!WalkState)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ Status = AcpiDsInitAmlWalk (WalkState, Op, NULL,
+ ObjDesc->Method.AmlStart,
+ ObjDesc->Method.AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Parse the AML */
+
+ WalkState->ParseFlags &= ~ACPI_PARSE_DELETE_TREE;
+ WalkState->ParseFlags |= ACPI_PARSE_DISASSEMBLE;
+ Status = AcpiPsParseAml (WalkState);
+
+#ifdef ACPI_DISASSEMBLER
+ AcpiDmDisassemble (NULL, Op, 0);
+#endif
+ AcpiPsDeleteParseTree (Op);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDumpNamespace
+ *
+ * PARAMETERS: StartArg - Node to begin namespace dump
+ * DepthArg - Maximum tree depth to be dumped
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump entire namespace or a subtree. Each node is displayed
+ * with type and other information.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDumpNamespace (
+ char *StartArg,
+ char *DepthArg)
+{
+ ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode;
+ UINT32 MaxDepth = ACPI_UINT32_MAX;
+
+
+ /* No argument given, just start at the root and dump entire namespace */
+
+ if (StartArg)
+ {
+ SubtreeEntry = AcpiDbConvertToNode (StartArg);
+ if (!SubtreeEntry)
+ {
+ return;
+ }
+
+ /* Now we can check for the depth argument */
+
+ if (DepthArg)
+ {
+ MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0);
+ }
+ }
+
+ AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
+ AcpiOsPrintf ("ACPI Namespace (from %4.4s (%p) subtree):\n",
+ ((ACPI_NAMESPACE_NODE *) SubtreeEntry)->Name.Ascii, SubtreeEntry);
+
+ /* Display the subtree */
+
+ AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
+ AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth,
+ ACPI_OWNER_ID_MAX, SubtreeEntry);
+ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDumpNamespaceByOwner
+ *
+ * PARAMETERS: OwnerArg - Owner ID whose nodes will be displayed
+ * DepthArg - Maximum tree depth to be dumped
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump elements of the namespace that are owned by the OwnerId.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDumpNamespaceByOwner (
+ char *OwnerArg,
+ char *DepthArg)
+{
+ ACPI_HANDLE SubtreeEntry = AcpiGbl_RootNode;
+ UINT32 MaxDepth = ACPI_UINT32_MAX;
+ ACPI_OWNER_ID OwnerId;
+
+
+ OwnerId = (ACPI_OWNER_ID) ACPI_STRTOUL (OwnerArg, NULL, 0);
+
+ /* Now we can check for the depth argument */
+
+ if (DepthArg)
+ {
+ MaxDepth = ACPI_STRTOUL (DepthArg, NULL, 0);
+ }
+
+ AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
+ AcpiOsPrintf ("ACPI Namespace by owner %X:\n", OwnerId);
+
+ /* Display the subtree */
+
+ AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
+ AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_SUMMARY, MaxDepth, OwnerId,
+ SubtreeEntry);
+ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbSendNotify
+ *
+ * PARAMETERS: Name - Name of ACPI object to send the notify to
+ * Value - Value of the notify to send.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Send an ACPI notification. The value specified is sent to the
+ * named object as an ACPI notify.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbSendNotify (
+ char *Name,
+ UINT32 Value)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ /* Translate name to an Named object */
+
+ Node = AcpiDbConvertToNode (Name);
+ if (!Node)
+ {
+ return;
+ }
+
+ /* Decode Named object type */
+
+ switch (Node->Type)
+ {
+ case ACPI_TYPE_DEVICE:
+ case ACPI_TYPE_THERMAL:
+
+ /* Send the notify */
+
+ Status = AcpiEvQueueNotifyRequest (Node, Value);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not queue notify\n");
+ }
+ break;
+
+ default:
+ AcpiOsPrintf ("Named object is not a device or a thermal object\n");
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbSetMethodData
+ *
+ * PARAMETERS: TypeArg - L for local, A for argument
+ * IndexArg - which one
+ * ValueArg - Value to set.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Set a local or argument for the running control method.
+ * NOTE: only object supported is Number.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbSetMethodData (
+ char *TypeArg,
+ char *IndexArg,
+ char *ValueArg)
+{
+ char Type;
+ UINT32 Index;
+ UINT32 Value;
+ ACPI_WALK_STATE *WalkState;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ /* Validate TypeArg */
+
+ AcpiUtStrupr (TypeArg);
+ Type = TypeArg[0];
+ if ((Type != 'L') &&
+ (Type != 'A') &&
+ (Type != 'N'))
+ {
+ AcpiOsPrintf ("Invalid SET operand: %s\n", TypeArg);
+ return;
+ }
+
+ Value = ACPI_STRTOUL (ValueArg, NULL, 16);
+
+ if (Type == 'N')
+ {
+ Node = AcpiDbConvertToNode (IndexArg);
+ if (Node->Type != ACPI_TYPE_INTEGER)
+ {
+ AcpiOsPrintf ("Can only set Integer nodes\n");
+ return;
+ }
+ ObjDesc = Node->Object;
+ ObjDesc->Integer.Value = Value;
+ return;
+ }
+
+ /* Get the index and value */
+
+ Index = ACPI_STRTOUL (IndexArg, NULL, 16);
+
+ WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
+ if (!WalkState)
+ {
+ AcpiOsPrintf ("There is no method currently executing\n");
+ return;
+ }
+
+ /* Create and initialize the new object */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ObjDesc)
+ {
+ AcpiOsPrintf ("Could not create an internal object\n");
+ return;
+ }
+
+ ObjDesc->Integer.Value = Value;
+
+ /* Store the new object into the target */
+
+ switch (Type)
+ {
+ case 'A':
+
+ /* Set a method argument */
+
+ if (Index > ACPI_METHOD_MAX_ARG)
+ {
+ AcpiOsPrintf ("Arg%d - Invalid argument name\n", Index);
+ goto Cleanup;
+ }
+
+ Status = AcpiDsStoreObjectToLocal (AML_ARG_OP, Index, ObjDesc,
+ WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ ObjDesc = WalkState->Arguments[Index].Object;
+
+ AcpiOsPrintf ("Arg%d: ", Index);
+ AcpiDmDisplayInternalObject (ObjDesc, WalkState);
+ break;
+
+ case 'L':
+
+ /* Set a method local */
+
+ if (Index > ACPI_METHOD_MAX_LOCAL)
+ {
+ AcpiOsPrintf ("Local%d - Invalid local variable name\n", Index);
+ goto Cleanup;
+ }
+
+ Status = AcpiDsStoreObjectToLocal (AML_LOCAL_OP, Index, ObjDesc,
+ WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ ObjDesc = WalkState->LocalVariables[Index].Object;
+
+ AcpiOsPrintf ("Local%d: ", Index);
+ AcpiDmDisplayInternalObject (ObjDesc, WalkState);
+ break;
+
+ default:
+ break;
+ }
+
+Cleanup:
+ AcpiUtRemoveReference (ObjDesc);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbWalkForSpecificObjects
+ *
+ * PARAMETERS: Callback from WalkNamespace
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Display short info about objects in the namespace
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbWalkForSpecificObjects (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_WALK_INFO *Info = (ACPI_WALK_INFO *) Context;
+ ACPI_BUFFER Buffer;
+ ACPI_STATUS Status;
+
+
+ Info->Count++;
+
+ /* Get and display the full pathname to this object */
+
+ Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
+ return (AE_OK);
+ }
+
+ AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
+ ACPI_FREE (Buffer.Pointer);
+
+ /* Dump short info about the object */
+
+ (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, Info, NULL);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayObjects
+ *
+ * PARAMETERS: ObjTypeArg - Type of object to display
+ * DisplayCountArg - Max depth to display
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display objects in the namespace of the requested type
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbDisplayObjects (
+ char *ObjTypeArg,
+ char *DisplayCountArg)
+{
+ ACPI_WALK_INFO Info;
+ ACPI_OBJECT_TYPE Type;
+
+
+ /* Get the object type */
+
+ Type = AcpiDbMatchArgument (ObjTypeArg, AcpiDbObjectTypes);
+ if (Type == ACPI_TYPE_NOT_FOUND)
+ {
+ AcpiOsPrintf ("Invalid or unsupported argument\n");
+ return (AE_OK);
+ }
+
+ AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
+ AcpiOsPrintf (
+ "Objects of type [%s] defined in the current ACPI Namespace:\n",
+ AcpiUtGetTypeName (Type));
+
+ AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
+
+ Info.Count = 0;
+ Info.OwnerId = ACPI_OWNER_ID_MAX;
+ Info.DebugLevel = ACPI_UINT32_MAX;
+ Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
+
+ /* Walk the namespace from the root */
+
+ (void) AcpiWalkNamespace (Type, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
+ AcpiDbWalkForSpecificObjects, (void *) &Info, NULL);
+
+ AcpiOsPrintf (
+ "\nFound %u objects of type [%s] in the current ACPI Namespace\n",
+ Info.Count, AcpiUtGetTypeName (Type));
+
+ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbWalkAndMatchName
+ *
+ * PARAMETERS: Callback from WalkNamespace
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Find a particular name/names within the namespace. Wildcards
+ * are supported -- '?' matches any character.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbWalkAndMatchName (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_STATUS Status;
+ char *RequestedName = (char *) Context;
+ UINT32 i;
+ ACPI_BUFFER Buffer;
+ ACPI_WALK_INFO Info;
+
+
+ /* Check for a name match */
+
+ for (i = 0; i < 4; i++)
+ {
+ /* Wildcard support */
+
+ if ((RequestedName[i] != '?') &&
+ (RequestedName[i] != ((ACPI_NAMESPACE_NODE *) ObjHandle)->Name.Ascii[i]))
+ {
+ /* No match, just exit */
+
+ return (AE_OK);
+ }
+ }
+
+ /* Get the full pathname to this object */
+
+ Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
+ }
+ else
+ {
+ Info.OwnerId = ACPI_OWNER_ID_MAX;
+ Info.DebugLevel = ACPI_UINT32_MAX;
+ Info.DisplayType = ACPI_DISPLAY_SUMMARY | ACPI_DISPLAY_SHORT;
+
+ AcpiOsPrintf ("%32s", (char *) Buffer.Pointer);
+ (void) AcpiNsDumpOneObject (ObjHandle, NestingLevel, &Info, NULL);
+ ACPI_FREE (Buffer.Pointer);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbFindNameInNamespace
+ *
+ * PARAMETERS: NameArg - The 4-character ACPI name to find.
+ * wildcards are supported.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Search the namespace for a given name (with wildcards)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbFindNameInNamespace (
+ char *NameArg)
+{
+
+ if (ACPI_STRLEN (NameArg) > 4)
+ {
+ AcpiOsPrintf ("Name must be no longer than 4 characters\n");
+ return (AE_OK);
+ }
+
+ /* Walk the namespace from the root */
+
+ AcpiUtStrupr (NameArg);
+ (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
+ AcpiDbWalkAndMatchName, NameArg, NULL);
+
+ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbSetScope
+ *
+ * PARAMETERS: Name - New scope path
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Set the "current scope" as maintained by this utility.
+ * The scope is used as a prefix to ACPI paths.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbSetScope (
+ char *Name)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ if (!Name || Name[0] == 0)
+ {
+ AcpiOsPrintf ("Current scope: %s\n", AcpiGbl_DbScopeBuf);
+ return;
+ }
+
+ AcpiDbPrepNamestring (Name);
+
+ if (Name[0] == '\\')
+ {
+ /* Validate new scope from the root */
+
+ Status = AcpiNsGetNode (AcpiGbl_RootNode, Name, ACPI_NS_NO_UPSEARCH,
+ &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+
+ ACPI_STRCPY (AcpiGbl_DbScopeBuf, Name);
+ ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
+ }
+ else
+ {
+ /* Validate new scope relative to old scope */
+
+ Status = AcpiNsGetNode (AcpiGbl_DbScopeNode, Name, ACPI_NS_NO_UPSEARCH,
+ &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+
+ ACPI_STRCAT (AcpiGbl_DbScopeBuf, Name);
+ ACPI_STRCAT (AcpiGbl_DbScopeBuf, "\\");
+ }
+
+ AcpiGbl_DbScopeNode = Node;
+ AcpiOsPrintf ("New scope: %s\n", AcpiGbl_DbScopeBuf);
+ return;
+
+ErrorExit:
+
+ AcpiOsPrintf ("Could not attach scope: %s, %s\n",
+ Name, AcpiFormatException (Status));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmCompareAmlResources
+ *
+ * PARAMETERS: Aml1Buffer - Contains first resource list
+ * Aml1BufferLength - Length of first resource list
+ * Aml2Buffer - Contains second resource list
+ * Aml2BufferLength - Length of second resource list
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Compare two AML resource lists, descriptor by descriptor (in
+ * order to isolate a miscompare to an individual resource)
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmCompareAmlResources (
+ UINT8 *Aml1Buffer,
+ ACPI_RSDESC_SIZE Aml1BufferLength,
+ UINT8 *Aml2Buffer,
+ ACPI_RSDESC_SIZE Aml2BufferLength)
+{
+ UINT8 *Aml1;
+ UINT8 *Aml2;
+ ACPI_RSDESC_SIZE Aml1Length;
+ ACPI_RSDESC_SIZE Aml2Length;
+ ACPI_RSDESC_SIZE Offset = 0;
+ UINT8 ResourceType;
+ UINT32 Count = 0;
+
+
+ /* Compare overall buffer sizes (may be different due to size rounding) */
+
+ if (Aml1BufferLength != Aml2BufferLength)
+ {
+ AcpiOsPrintf (
+ "**** Buffer length mismatch in converted AML: original %X new %X ****\n",
+ Aml1BufferLength, Aml2BufferLength);
+ }
+
+ Aml1 = Aml1Buffer;
+ Aml2 = Aml2Buffer;
+
+ /* Walk the descriptor lists, comparing each descriptor */
+
+ while (Aml1 < (Aml1Buffer + Aml1BufferLength))
+ {
+ /* Get the lengths of each descriptor */
+
+ Aml1Length = AcpiUtGetDescriptorLength (Aml1);
+ Aml2Length = AcpiUtGetDescriptorLength (Aml2);
+ ResourceType = AcpiUtGetResourceType (Aml1);
+
+ /* Check for descriptor length match */
+
+ if (Aml1Length != Aml2Length)
+ {
+ AcpiOsPrintf (
+ "**** Length mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X L1 %X L2 %X ****\n",
+ Count, ResourceType, Offset, Aml1Length, Aml2Length);
+ }
+
+ /* Check for descriptor byte match */
+
+ else if (ACPI_MEMCMP (Aml1, Aml2, Aml1Length))
+ {
+ AcpiOsPrintf (
+ "**** Data mismatch in descriptor [%.2X] type %2.2X, Offset %8.8X ****\n",
+ Count, ResourceType, Offset);
+ }
+
+ /* Exit on EndTag descriptor */
+
+ if (ResourceType == ACPI_RESOURCE_NAME_END_TAG)
+ {
+ return;
+ }
+
+ /* Point to next descriptor in each buffer */
+
+ Count++;
+ Offset += Aml1Length;
+ Aml1 += Aml1Length;
+ Aml2 += Aml2Length;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmTestResourceConversion
+ *
+ * PARAMETERS: Node - Parent device node
+ * Name - resource method name (_CRS)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Compare the original AML with a conversion of the AML to
+ * internal resource list, then back to AML.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmTestResourceConversion (
+ ACPI_NAMESPACE_NODE *Node,
+ char *Name)
+{
+ ACPI_STATUS Status;
+ ACPI_BUFFER ReturnObj;
+ ACPI_BUFFER ResourceObj;
+ ACPI_BUFFER NewAml;
+ ACPI_OBJECT *OriginalAml;
+
+
+ AcpiOsPrintf ("Resource Conversion Comparison:\n");
+
+ NewAml.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ ReturnObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ ResourceObj.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+
+ /* Get the original _CRS AML resource template */
+
+ Status = AcpiEvaluateObject (Node, Name, NULL, &ReturnObj);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not obtain %s: %s\n",
+ Name, AcpiFormatException (Status));
+ return (Status);
+ }
+
+ /* Get the AML resource template, converted to internal resource structs */
+
+ Status = AcpiGetCurrentResources (Node, &ResourceObj);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
+ AcpiFormatException (Status));
+ goto Exit1;
+ }
+
+ /* Convert internal resource list to external AML resource template */
+
+ Status = AcpiRsCreateAmlResources (ResourceObj.Pointer, &NewAml);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("AcpiRsCreateAmlResources failed: %s\n",
+ AcpiFormatException (Status));
+ goto Exit2;
+ }
+
+ /* Compare original AML to the newly created AML resource list */
+
+ OriginalAml = ReturnObj.Pointer;
+
+ AcpiDmCompareAmlResources (
+ OriginalAml->Buffer.Pointer, OriginalAml->Buffer.Length,
+ NewAml.Pointer, NewAml.Length);
+
+ /* Cleanup and exit */
+
+ ACPI_FREE (NewAml.Pointer);
+Exit2:
+ ACPI_FREE (ResourceObj.Pointer);
+Exit1:
+ ACPI_FREE (ReturnObj.Pointer);
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayResources
+ *
+ * PARAMETERS: ObjectArg - String with hex value of the object
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display the resource objects associated with a device.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayResources (
+ char *ObjectArg)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+ ACPI_BUFFER ReturnObj;
+
+
+ AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
+ AcpiDbgLevel |= ACPI_LV_RESOURCES;
+
+ /* Convert string to object pointer */
+
+ Node = AcpiDbConvertToNode (ObjectArg);
+ if (!Node)
+ {
+ return;
+ }
+
+ /* Prepare for a return object of arbitrary size */
+
+ ReturnObj.Pointer = AcpiGbl_DbBuffer;
+ ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE;
+
+ /* _PRT */
+
+ AcpiOsPrintf ("Evaluating _PRT\n");
+
+ /* Check if _PRT exists */
+
+ Status = AcpiEvaluateObject (Node, METHOD_NAME__PRT, NULL, &ReturnObj);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not obtain _PRT: %s\n",
+ AcpiFormatException (Status));
+ goto GetCrs;
+ }
+
+ ReturnObj.Pointer = AcpiGbl_DbBuffer;
+ ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE;
+
+ Status = AcpiGetIrqRoutingTable (Node, &ReturnObj);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("GetIrqRoutingTable failed: %s\n",
+ AcpiFormatException (Status));
+ goto GetCrs;
+ }
+
+ AcpiRsDumpIrqList (ACPI_CAST_PTR (UINT8, AcpiGbl_DbBuffer));
+
+
+ /* _CRS */
+
+GetCrs:
+ AcpiOsPrintf ("Evaluating _CRS\n");
+
+ ReturnObj.Pointer = AcpiGbl_DbBuffer;
+ ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE;
+
+ /* Check if _CRS exists */
+
+ Status = AcpiEvaluateObject (Node, METHOD_NAME__CRS, NULL, &ReturnObj);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not obtain _CRS: %s\n",
+ AcpiFormatException (Status));
+ goto GetPrs;
+ }
+
+ /* Get the _CRS resource list */
+
+ ReturnObj.Pointer = AcpiGbl_DbBuffer;
+ ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE;
+
+ Status = AcpiGetCurrentResources (Node, &ReturnObj);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("AcpiGetCurrentResources failed: %s\n",
+ AcpiFormatException (Status));
+ goto GetPrs;
+ }
+
+ /* Dump the _CRS resource list */
+
+ AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE,
+ ReturnObj.Pointer));
+
+ /*
+ * Perform comparison of original AML to newly created AML. This tests both
+ * the AML->Resource conversion and the Resource->Aml conversion.
+ */
+ Status = AcpiDmTestResourceConversion (Node, METHOD_NAME__CRS);
+
+ /* Execute _SRS with the resource list */
+
+ Status = AcpiSetCurrentResources (Node, &ReturnObj);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("AcpiSetCurrentResources failed: %s\n",
+ AcpiFormatException (Status));
+ goto GetPrs;
+ }
+
+
+ /* _PRS */
+
+GetPrs:
+ AcpiOsPrintf ("Evaluating _PRS\n");
+
+ ReturnObj.Pointer = AcpiGbl_DbBuffer;
+ ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE;
+
+ /* Check if _PRS exists */
+
+ Status = AcpiEvaluateObject (Node, METHOD_NAME__PRS, NULL, &ReturnObj);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not obtain _PRS: %s\n",
+ AcpiFormatException (Status));
+ goto Cleanup;
+ }
+
+ ReturnObj.Pointer = AcpiGbl_DbBuffer;
+ ReturnObj.Length = ACPI_DEBUG_BUFFER_SIZE;
+
+ Status = AcpiGetPossibleResources (Node, &ReturnObj);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("AcpiGetPossibleResources failed: %s\n",
+ AcpiFormatException (Status));
+ goto Cleanup;
+ }
+
+ AcpiRsDumpResourceList (ACPI_CAST_PTR (ACPI_RESOURCE, AcpiGbl_DbBuffer));
+
+Cleanup:
+
+ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbIntegrityWalk
+ *
+ * PARAMETERS: Callback from WalkNamespace
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Examine one NS node for valid values.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbIntegrityWalk (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_INTEGRITY_INFO *Info = (ACPI_INTEGRITY_INFO *) Context;
+ ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
+ ACPI_OPERAND_OBJECT *Object;
+
+
+ Info->Nodes++;
+ if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
+ {
+ AcpiOsPrintf ("Invalid Descriptor Type for Node %p [%s]\n",
+ Node, AcpiUtGetDescriptorName (Node));
+ }
+
+ if (Node->Type > ACPI_TYPE_LOCAL_MAX)
+ {
+ AcpiOsPrintf ("Invalid Object Type for Node %p, Type = %X\n",
+ Node, Node->Type);
+ }
+
+ if (!AcpiUtValidAcpiName (Node->Name.Integer))
+ {
+ AcpiOsPrintf ("Invalid AcpiName for Node %p\n", Node);
+ }
+
+ Object = AcpiNsGetAttachedObject (Node);
+ if (Object)
+ {
+ Info->Objects++;
+ if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
+ {
+ AcpiOsPrintf ("Invalid Descriptor Type for Object %p [%s]\n",
+ Object, AcpiUtGetDescriptorName (Object));
+ }
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbCheckIntegrity
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Check entire namespace for data structure integrity
+ *
+ ******************************************************************************/
+
+void
+AcpiDbCheckIntegrity (
+ void)
+{
+ ACPI_INTEGRITY_INFO Info = {0,0};
+
+ /* Search all nodes in namespace */
+
+ (void) AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
+ AcpiDbIntegrityWalk, (void *) &Info, NULL);
+
+ AcpiOsPrintf ("Verified %d namespace nodes with %d Objects\n",
+ Info.Nodes, Info.Objects);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbGenerateGpe
+ *
+ * PARAMETERS: GpeArg - Raw GPE number, ascii string
+ * BlockArg - GPE block number, ascii string
+ * 0 or 1 for FADT GPE blocks
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Generate a GPE
+ *
+ ******************************************************************************/
+
+void
+AcpiDbGenerateGpe (
+ char *GpeArg,
+ char *BlockArg)
+{
+ UINT32 BlockNumber;
+ UINT32 GpeNumber;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+
+
+ GpeNumber = ACPI_STRTOUL (GpeArg, NULL, 0);
+ BlockNumber = ACPI_STRTOUL (BlockArg, NULL, 0);
+
+
+ GpeEventInfo = AcpiEvGetGpeEventInfo (ACPI_TO_POINTER (BlockNumber),
+ GpeNumber);
+ if (!GpeEventInfo)
+ {
+ AcpiOsPrintf ("Invalid GPE\n");
+ return;
+ }
+
+ (void) AcpiEvGpeDispatch (GpeEventInfo, GpeNumber);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbBusWalk
+ *
+ * PARAMETERS: Callback from WalkNamespace
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Display info about device objects that have a corresponding
+ * _PRT method.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbBusWalk (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
+ ACPI_STATUS Status;
+ ACPI_BUFFER Buffer;
+ ACPI_INTEGER ADR;
+ ACPI_DEVICE_ID Id;
+ ACPI_COMPATIBLE_ID_LIST *Cid;
+ ACPI_NAMESPACE_NODE *TempNode;
+
+
+ /* Exit if there is no _PRT under this device */
+
+ Status = AcpiGetHandle (Node, METHOD_NAME__PRT,
+ ACPI_CAST_PTR (ACPI_HANDLE, &TempNode));
+ if (ACPI_FAILURE (Status))
+ {
+ return (AE_OK);
+ }
+
+ /* Get the full path to this device object */
+
+ Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could Not get pathname for object %p\n", ObjHandle);
+ return (AE_OK);
+ }
+
+ /* Display the full path */
+
+ AcpiOsPrintf ("%-32s", (char *) Buffer.Pointer);
+ ACPI_FREE (Buffer.Pointer);
+
+ /* _PRT info */
+
+ AcpiOsPrintf ("_PRT=%p", TempNode);
+
+ /* Get the _ADR value */
+
+ Status = AcpiUtEvaluateNumericObject (METHOD_NAME__ADR, Node, &ADR);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf (" No _ADR ");
+ }
+ else
+ {
+ AcpiOsPrintf (" _ADR=%8.8X", (UINT32) ADR);
+ }
+
+ /* Get the _HID if present */
+
+ Status = AcpiUtExecute_HID (Node, &Id);
+ if (ACPI_SUCCESS (Status))
+ {
+ AcpiOsPrintf (" _HID=%s", Id.Value);
+ }
+ else
+ {
+ AcpiOsPrintf (" ");
+ }
+
+ /* Get the _UID if present */
+
+ Status = AcpiUtExecute_UID (Node, &Id);
+ if (ACPI_SUCCESS (Status))
+ {
+ AcpiOsPrintf (" _UID=%s", Id.Value);
+ }
+
+ /* Get the _CID if present */
+
+ Status = AcpiUtExecute_CID (Node, &Cid);
+ if (ACPI_SUCCESS (Status))
+ {
+ AcpiOsPrintf (" _CID=%s", Cid->Id[0].Value);
+ ACPI_FREE (Cid);
+ }
+
+ AcpiOsPrintf ("\n");
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbGetBusInfo
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display info about system busses.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbGetBusInfo (
+ void)
+{
+ /* Search all nodes in namespace */
+
+ (void) AcpiWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT, ACPI_UINT32_MAX,
+ AcpiDbBusWalk, NULL, NULL);
+}
+
+#endif /* ACPI_DEBUGGER */
diff --git a/sys/contrib/dev/acpica/dbdisply.c b/sys/contrib/dev/acpica/dbdisply.c
new file mode 100644
index 0000000..40133a1
--- /dev/null
+++ b/sys/contrib/dev/acpica/dbdisply.c
@@ -0,0 +1,961 @@
+/*******************************************************************************
+ *
+ * Module Name: dbdisply - debug display commands
+ * $Revision: 1.120 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acdebug.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+
+#ifdef ACPI_DEBUGGER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbdisply")
+
+/* Local prototypes */
+
+static void
+AcpiDbDumpParserDescriptor (
+ ACPI_PARSE_OBJECT *Op);
+
+static void *
+AcpiDbGetPointer (
+ void *Target);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbGetPointer
+ *
+ * PARAMETERS: Target - Pointer to string to be converted
+ *
+ * RETURN: Converted pointer
+ *
+ * DESCRIPTION: Convert an ascii pointer value to a real value
+ *
+ ******************************************************************************/
+
+static void *
+AcpiDbGetPointer (
+ void *Target)
+{
+ void *ObjPtr;
+
+
+ ObjPtr = ACPI_TO_POINTER (ACPI_STRTOUL (Target, NULL, 16));
+ return (ObjPtr);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDumpParserDescriptor
+ *
+ * PARAMETERS: Op - A parser Op descriptor
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display a formatted parser object
+ *
+ ******************************************************************************/
+
+static void
+AcpiDbDumpParserDescriptor (
+ ACPI_PARSE_OBJECT *Op)
+{
+ const ACPI_OPCODE_INFO *Info;
+
+
+ Info = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ AcpiOsPrintf ("Parser Op Descriptor:\n");
+ AcpiOsPrintf ("%20.20s : %4.4X\n", "Opcode", Op->Common.AmlOpcode);
+
+ ACPI_DEBUG_ONLY_MEMBERS (AcpiOsPrintf ("%20.20s : %s\n", "Opcode Name",
+ Info->Name));
+
+ AcpiOsPrintf ("%20.20s : %p\n", "Value/ArgList", Op->Common.Value.Arg);
+ AcpiOsPrintf ("%20.20s : %p\n", "Parent", Op->Common.Parent);
+ AcpiOsPrintf ("%20.20s : %p\n", "NextOp", Op->Common.Next);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDecodeAndDisplayObject
+ *
+ * PARAMETERS: Target - String with object to be displayed. Names
+ * and hex pointers are supported.
+ * OutputType - Byte, Word, Dword, or Qword (B|W|D|Q)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display a formatted ACPI object
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDecodeAndDisplayObject (
+ char *Target,
+ char *OutputType)
+{
+ void *ObjPtr;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ UINT32 Display = DB_BYTE_DISPLAY;
+ char Buffer[80];
+ ACPI_BUFFER RetBuf;
+ ACPI_STATUS Status;
+ UINT32 Size;
+
+
+ if (!Target)
+ {
+ return;
+ }
+
+ /* Decode the output type */
+
+ if (OutputType)
+ {
+ AcpiUtStrupr (OutputType);
+ if (OutputType[0] == 'W')
+ {
+ Display = DB_WORD_DISPLAY;
+ }
+ else if (OutputType[0] == 'D')
+ {
+ Display = DB_DWORD_DISPLAY;
+ }
+ else if (OutputType[0] == 'Q')
+ {
+ Display = DB_QWORD_DISPLAY;
+ }
+ }
+
+ RetBuf.Length = sizeof (Buffer);
+ RetBuf.Pointer = Buffer;
+
+ /* Differentiate between a number and a name */
+
+ if ((Target[0] >= 0x30) && (Target[0] <= 0x39))
+ {
+ ObjPtr = AcpiDbGetPointer (Target);
+ if (!AcpiOsReadable (ObjPtr, 16))
+ {
+ AcpiOsPrintf ("Address %p is invalid in this address space\n",
+ ObjPtr);
+ return;
+ }
+
+ /* Decode the object type */
+
+ switch (ACPI_GET_DESCRIPTOR_TYPE (ObjPtr))
+ {
+ case ACPI_DESC_TYPE_NAMED:
+
+ /* This is a namespace Node */
+
+ if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_NAMESPACE_NODE)))
+ {
+ AcpiOsPrintf (
+ "Cannot read entire Named object at address %p\n", ObjPtr);
+ return;
+ }
+
+ Node = ObjPtr;
+ goto DumpNode;
+
+
+ case ACPI_DESC_TYPE_OPERAND:
+
+ /* This is a ACPI OPERAND OBJECT */
+
+ if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_OPERAND_OBJECT)))
+ {
+ AcpiOsPrintf ("Cannot read entire ACPI object at address %p\n",
+ ObjPtr);
+ return;
+ }
+
+ AcpiUtDumpBuffer (ObjPtr, sizeof (ACPI_OPERAND_OBJECT), Display,
+ ACPI_UINT32_MAX);
+ AcpiExDumpObjectDescriptor (ObjPtr, 1);
+ break;
+
+
+ case ACPI_DESC_TYPE_PARSER:
+
+ /* This is a Parser Op object */
+
+ if (!AcpiOsReadable (ObjPtr, sizeof (ACPI_PARSE_OBJECT)))
+ {
+ AcpiOsPrintf (
+ "Cannot read entire Parser object at address %p\n", ObjPtr);
+ return;
+ }
+
+ AcpiUtDumpBuffer (ObjPtr, sizeof (ACPI_PARSE_OBJECT), Display,
+ ACPI_UINT32_MAX);
+ AcpiDbDumpParserDescriptor ((ACPI_PARSE_OBJECT *) ObjPtr);
+ break;
+
+
+ default:
+
+ /* Is not a recognizeable object */
+
+ Size = 16;
+ if (AcpiOsReadable (ObjPtr, 64))
+ {
+ Size = 64;
+ }
+
+ /* Just dump some memory */
+
+ AcpiUtDumpBuffer (ObjPtr, Size, Display, ACPI_UINT32_MAX);
+ break;
+ }
+
+ return;
+ }
+
+ /* The parameter is a name string that must be resolved to a Named obj */
+
+ Node = AcpiDbLocalNsLookup (Target);
+ if (!Node)
+ {
+ return;
+ }
+
+
+DumpNode:
+ /* Now dump the NS node */
+
+ Status = AcpiGetName (Node, ACPI_FULL_PATHNAME, &RetBuf);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not convert name to pathname\n");
+ }
+
+ else
+ {
+ AcpiOsPrintf ("Object (%p) Pathname: %s\n",
+ Node, (char *) RetBuf.Pointer);
+ }
+
+ if (!AcpiOsReadable (Node, sizeof (ACPI_NAMESPACE_NODE)))
+ {
+ AcpiOsPrintf ("Invalid Named object at address %p\n", Node);
+ return;
+ }
+
+ AcpiUtDumpBuffer ((void *) Node, sizeof (ACPI_NAMESPACE_NODE),
+ Display, ACPI_UINT32_MAX);
+ AcpiExDumpNamespaceNode (Node, 1);
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (ObjDesc)
+ {
+ AcpiOsPrintf ("\nAttached Object (%p):\n", ObjDesc);
+ if (!AcpiOsReadable (ObjDesc, sizeof (ACPI_OPERAND_OBJECT)))
+ {
+ AcpiOsPrintf ("Invalid internal ACPI Object at address %p\n",
+ ObjDesc);
+ return;
+ }
+
+ AcpiUtDumpBuffer ((void *) ObjDesc, sizeof (ACPI_OPERAND_OBJECT),
+ Display, ACPI_UINT32_MAX);
+ AcpiExDumpObjectDescriptor (ObjDesc, 1);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayMethodInfo
+ *
+ * PARAMETERS: StartOp - Root of the control method parse tree
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display information about the current method
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayMethodInfo (
+ ACPI_PARSE_OBJECT *StartOp)
+{
+ ACPI_WALK_STATE *WalkState;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_PARSE_OBJECT *RootOp;
+ ACPI_PARSE_OBJECT *Op;
+ const ACPI_OPCODE_INFO *OpInfo;
+ UINT32 NumOps = 0;
+ UINT32 NumOperands = 0;
+ UINT32 NumOperators = 0;
+ UINT32 NumRemainingOps = 0;
+ UINT32 NumRemainingOperands = 0;
+ UINT32 NumRemainingOperators = 0;
+ BOOLEAN CountRemaining = FALSE;
+
+
+ WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
+ if (!WalkState)
+ {
+ AcpiOsPrintf ("There is no method currently executing\n");
+ return;
+ }
+
+ ObjDesc = WalkState->MethodDesc;
+ Node = WalkState->MethodNode;
+
+ AcpiOsPrintf ("Currently executing control method is [%4.4s]\n",
+ AcpiUtGetNodeName (Node));
+ AcpiOsPrintf ("%X Arguments, SyncLevel = %X\n",
+ (UINT32) ObjDesc->Method.ParamCount,
+ (UINT32) ObjDesc->Method.SyncLevel);
+
+
+ RootOp = StartOp;
+ while (RootOp->Common.Parent)
+ {
+ RootOp = RootOp->Common.Parent;
+ }
+
+ Op = RootOp;
+
+ while (Op)
+ {
+ if (Op == StartOp)
+ {
+ CountRemaining = TRUE;
+ }
+
+ NumOps++;
+ if (CountRemaining)
+ {
+ NumRemainingOps++;
+ }
+
+ /* Decode the opcode */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ switch (OpInfo->Class)
+ {
+ case AML_CLASS_ARGUMENT:
+ if (CountRemaining)
+ {
+ NumRemainingOperands++;
+ }
+
+ NumOperands++;
+ break;
+
+ case AML_CLASS_UNKNOWN:
+ /* Bad opcode or ASCII character */
+
+ continue;
+
+ default:
+ if (CountRemaining)
+ {
+ NumRemainingOperators++;
+ }
+
+ NumOperators++;
+ break;
+ }
+
+ Op = AcpiPsGetDepthNext (StartOp, Op);
+ }
+
+ AcpiOsPrintf (
+ "Method contains: %X AML Opcodes - %X Operators, %X Operands\n",
+ NumOps, NumOperators, NumOperands);
+
+ AcpiOsPrintf (
+ "Remaining to execute: %X AML Opcodes - %X Operators, %X Operands\n",
+ NumRemainingOps, NumRemainingOperators, NumRemainingOperands);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayLocals
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display all locals for the currently running control method
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayLocals (
+ void)
+{
+ ACPI_WALK_STATE *WalkState;
+
+
+ WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
+ if (!WalkState)
+ {
+ AcpiOsPrintf ("There is no method currently executing\n");
+ return;
+ }
+
+ AcpiDmDisplayLocals (WalkState);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayArguments
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display all arguments for the currently running control method
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayArguments (
+ void)
+{
+ ACPI_WALK_STATE *WalkState;
+
+
+ WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
+ if (!WalkState)
+ {
+ AcpiOsPrintf ("There is no method currently executing\n");
+ return;
+ }
+
+ AcpiDmDisplayArguments (WalkState);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayResults
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display current contents of a method result stack
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayResults (
+ void)
+{
+ UINT32 i;
+ ACPI_WALK_STATE *WalkState;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ UINT32 ResultCount = 0;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_GENERIC_STATE *Frame;
+ UINT32 Index; /* Index onto current frame */
+
+
+ WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
+ if (!WalkState)
+ {
+ AcpiOsPrintf ("There is no method currently executing\n");
+ return;
+ }
+
+ ObjDesc = WalkState->MethodDesc;
+ Node = WalkState->MethodNode;
+
+ if (WalkState->Results)
+ {
+ ResultCount = WalkState->ResultCount;
+ }
+
+ AcpiOsPrintf ("Method [%4.4s] has %X stacked result objects\n",
+ AcpiUtGetNodeName (Node), ResultCount);
+
+ /* From the top element of result stack */
+
+ Frame = WalkState->Results;
+ Index = (ResultCount - 1) % ACPI_RESULTS_FRAME_OBJ_NUM;
+
+ for (i = 0; i < ResultCount; i++)
+ {
+ ObjDesc = Frame->Results.ObjDesc[Index];
+ AcpiOsPrintf ("Result%d: ", i);
+ AcpiDmDisplayInternalObject (ObjDesc, WalkState);
+ if (Index == 0)
+ {
+ Frame = Frame->Results.Next;
+ Index = ACPI_RESULTS_FRAME_OBJ_NUM;
+ }
+ Index--;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayCallingTree
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display current calling tree of nested control methods
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayCallingTree (
+ void)
+{
+ ACPI_WALK_STATE *WalkState;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ WalkState = AcpiDsGetCurrentWalkState (AcpiGbl_CurrentWalkList);
+ if (!WalkState)
+ {
+ AcpiOsPrintf ("There is no method currently executing\n");
+ return;
+ }
+
+ Node = WalkState->MethodNode;
+ AcpiOsPrintf ("Current Control Method Call Tree\n");
+
+ while (WalkState)
+ {
+ Node = WalkState->MethodNode;
+
+ AcpiOsPrintf (" [%4.4s]\n", AcpiUtGetNodeName (Node));
+
+ WalkState = WalkState->Next;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayObjectType
+ *
+ * PARAMETERS: ObjectArg - User entered NS node handle
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display type of an arbitrary NS node
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayObjectType (
+ char *ObjectArg)
+{
+ ACPI_HANDLE Handle;
+ ACPI_BUFFER Buffer;
+ ACPI_DEVICE_INFO *Info;
+ ACPI_STATUS Status;
+ ACPI_NATIVE_UINT i;
+
+
+ Handle = ACPI_TO_POINTER (ACPI_STRTOUL (ObjectArg, NULL, 16));
+ Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+
+ Status = AcpiGetObjectInfo (Handle, &Buffer);
+ if (ACPI_SUCCESS (Status))
+ {
+ Info = Buffer.Pointer;
+ AcpiOsPrintf (
+ "S1D-%2.2X S2D-%2.2X S3D-%2.2X S4D-%2.2X HID: %s, ADR: %8.8X%8.8X, Status %8.8X\n",
+ Info->HighestDstates[0], Info->HighestDstates[1],
+ Info->HighestDstates[2], Info->HighestDstates[3],
+ Info->HardwareId.Value,
+ ACPI_FORMAT_UINT64 (Info->Address),
+ Info->CurrentStatus);
+
+ if (Info->Valid & ACPI_VALID_CID)
+ {
+ for (i = 0; i < Info->CompatibilityId.Count; i++)
+ {
+ AcpiOsPrintf ("CID #%d: %s\n", (UINT32) i,
+ Info->CompatibilityId.Id[i].Value);
+ }
+ }
+
+ ACPI_FREE (Info);
+ }
+ else
+ {
+ AcpiOsPrintf ("%s\n", AcpiFormatException (Status));
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayResultObject
+ *
+ * PARAMETERS: ObjDesc - Object to be displayed
+ * WalkState - Current walk state
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display the result of an AML opcode
+ *
+ * Note: Curently only displays the result object if we are single stepping.
+ * However, this output may be useful in other contexts and could be enabled
+ * to do so if needed.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayResultObject (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+
+ /* Only display if single stepping */
+
+ if (!AcpiGbl_CmSingleStep)
+ {
+ return;
+ }
+
+ AcpiOsPrintf ("ResultObj: ");
+ AcpiDmDisplayInternalObject (ObjDesc, WalkState);
+ AcpiOsPrintf ("\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayArgumentObject
+ *
+ * PARAMETERS: ObjDesc - Object to be displayed
+ * WalkState - Current walk state
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display the result of an AML opcode
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayArgumentObject (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+
+ if (!AcpiGbl_CmSingleStep)
+ {
+ return;
+ }
+
+ AcpiOsPrintf ("ArgObj: ");
+ AcpiDmDisplayInternalObject (ObjDesc, WalkState);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayGpes
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display the current GPE structures
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayGpes (
+ void)
+{
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+ ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
+ UINT32 GpeIndex;
+ UINT32 Block = 0;
+ UINT32 i;
+ UINT32 j;
+ char Buffer[80];
+ ACPI_BUFFER RetBuf;
+ ACPI_STATUS Status;
+
+
+ RetBuf.Length = sizeof (Buffer);
+ RetBuf.Pointer = Buffer;
+
+ Block = 0;
+
+ /* Walk the GPE lists */
+
+ GpeXruptInfo = AcpiGbl_GpeXruptListHead;
+ while (GpeXruptInfo)
+ {
+ GpeBlock = GpeXruptInfo->GpeBlockListHead;
+ while (GpeBlock)
+ {
+ Status = AcpiGetName (GpeBlock->Node, ACPI_FULL_PATHNAME, &RetBuf);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not convert name to pathname\n");
+ }
+
+ AcpiOsPrintf ("\nBlock %d - Info %p DeviceNode %p [%s]\n",
+ Block, GpeBlock, GpeBlock->Node, Buffer);
+
+ AcpiOsPrintf (" Registers: %u (%u GPEs)\n",
+ GpeBlock->RegisterCount,
+ ACPI_MUL_8 (GpeBlock->RegisterCount));
+
+ AcpiOsPrintf (" GPE range: 0x%X to 0x%X\n",
+ GpeBlock->BlockBaseNumber,
+ GpeBlock->BlockBaseNumber +
+ (GpeBlock->RegisterCount * 8) -1);
+
+ AcpiOsPrintf (
+ " RegisterInfo: %p Status %8.8X%8.8X Enable %8.8X%8.8X\n",
+ GpeBlock->RegisterInfo,
+ ACPI_FORMAT_UINT64 (GpeBlock->RegisterInfo->StatusAddress.Address),
+ ACPI_FORMAT_UINT64 (GpeBlock->RegisterInfo->EnableAddress.Address));
+
+ AcpiOsPrintf (" EventInfo: %p\n", GpeBlock->EventInfo);
+
+ /* Examine each GPE Register within the block */
+
+ for (i = 0; i < GpeBlock->RegisterCount; i++)
+ {
+ GpeRegisterInfo = &GpeBlock->RegisterInfo[i];
+
+ AcpiOsPrintf (
+ " Reg %u: WakeEnable %2.2X, RunEnable %2.2X Status %8.8X%8.8X Enable %8.8X%8.8X\n",
+ i, GpeRegisterInfo->EnableForWake,
+ GpeRegisterInfo->EnableForRun,
+ ACPI_FORMAT_UINT64 (GpeRegisterInfo->StatusAddress.Address),
+ ACPI_FORMAT_UINT64 (GpeRegisterInfo->EnableAddress.Address));
+
+ /* Now look at the individual GPEs in this byte register */
+
+ for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++)
+ {
+ GpeIndex = (i * ACPI_GPE_REGISTER_WIDTH) + j;
+ GpeEventInfo = &GpeBlock->EventInfo[GpeIndex];
+
+ if (!(GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK))
+ {
+ /* This GPE is not used (no method or handler) */
+
+ continue;
+ }
+
+ AcpiOsPrintf (
+ " GPE %.3X: %p Flags %2.2X: ",
+ GpeBlock->BlockBaseNumber + GpeIndex,
+ GpeEventInfo,
+ GpeEventInfo->Flags);
+
+ if (GpeEventInfo->Flags & ACPI_GPE_LEVEL_TRIGGERED)
+ {
+ AcpiOsPrintf ("Level, ");
+ }
+ else
+ {
+ AcpiOsPrintf ("Edge, ");
+ }
+
+ switch (GpeEventInfo->Flags & ACPI_GPE_TYPE_MASK)
+ {
+ case ACPI_GPE_TYPE_WAKE:
+ AcpiOsPrintf ("WakeOnly: ");
+ break;
+ case ACPI_GPE_TYPE_RUNTIME:
+ AcpiOsPrintf (" RunOnly: ");
+ break;
+ case ACPI_GPE_TYPE_WAKE_RUN:
+ AcpiOsPrintf (" WakeRun: ");
+ break;
+ default:
+ AcpiOsPrintf (" NotUsed: ");
+ break;
+ }
+
+ if (GpeEventInfo->Flags & ACPI_GPE_WAKE_ENABLED)
+ {
+ AcpiOsPrintf ("[Wake 1 ");
+ }
+ else
+ {
+ AcpiOsPrintf ("[Wake 0 ");
+ }
+
+ if (GpeEventInfo->Flags & ACPI_GPE_RUN_ENABLED)
+ {
+ AcpiOsPrintf ("Run 1], ");
+ }
+ else
+ {
+ AcpiOsPrintf ("Run 0], ");
+ }
+
+ switch (GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK)
+ {
+ case ACPI_GPE_DISPATCH_NOT_USED:
+ AcpiOsPrintf ("NotUsed");
+ break;
+ case ACPI_GPE_DISPATCH_HANDLER:
+ AcpiOsPrintf ("Handler");
+ break;
+ case ACPI_GPE_DISPATCH_METHOD:
+ AcpiOsPrintf ("Method");
+ break;
+ default:
+ AcpiOsPrintf ("UNKNOWN: %X",
+ GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK);
+ break;
+ }
+
+ AcpiOsPrintf ("\n");
+ }
+ }
+ Block++;
+ GpeBlock = GpeBlock->Next;
+ }
+ GpeXruptInfo = GpeXruptInfo->Next;
+ }
+}
+
+#endif /* ACPI_DEBUGGER */
+
diff --git a/sys/contrib/dev/acpica/dbexec.c b/sys/contrib/dev/acpica/dbexec.c
new file mode 100644
index 0000000..10e73f6
--- /dev/null
+++ b/sys/contrib/dev/acpica/dbexec.c
@@ -0,0 +1,712 @@
+/*******************************************************************************
+ *
+ * Module Name: dbexec - debugger control method execution
+ * $Revision: 1.81 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdebug.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#ifdef ACPI_DEBUGGER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbexec")
+
+
+static ACPI_DB_METHOD_INFO AcpiGbl_DbMethodInfo;
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDbExecuteMethod (
+ ACPI_DB_METHOD_INFO *Info,
+ ACPI_BUFFER *ReturnObj);
+
+static void
+AcpiDbExecuteSetup (
+ ACPI_DB_METHOD_INFO *Info);
+
+static UINT32
+AcpiDbGetOutstandingAllocations (
+ void);
+
+static void ACPI_SYSTEM_XFACE
+AcpiDbMethodThread (
+ void *Context);
+
+static ACPI_STATUS
+AcpiDbExecutionWalk (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbExecuteMethod
+ *
+ * PARAMETERS: Info - Valid info segment
+ * ReturnObj - Where to put return object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute a control method.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbExecuteMethod (
+ ACPI_DB_METHOD_INFO *Info,
+ ACPI_BUFFER *ReturnObj)
+{
+ ACPI_STATUS Status;
+ ACPI_OBJECT_LIST ParamObjects;
+ ACPI_OBJECT Params[ACPI_METHOD_NUM_ARGS];
+ UINT32 i;
+
+
+ if (AcpiGbl_DbOutputToFile && !AcpiDbgLevel)
+ {
+ AcpiOsPrintf ("Warning: debug output is not enabled!\n");
+ }
+
+ /* Are there arguments to the method? */
+
+ if (Info->Args && Info->Args[0])
+ {
+ for (i = 0; Info->Args[i] && i < ACPI_METHOD_NUM_ARGS; i++)
+ {
+ Params[i].Type = ACPI_TYPE_INTEGER;
+ Params[i].Integer.Value = ACPI_STRTOUL (Info->Args[i], NULL, 16);
+ }
+
+ ParamObjects.Pointer = Params;
+ ParamObjects.Count = i;
+ }
+ else
+ {
+ /* Setup default parameters */
+
+ Params[0].Type = ACPI_TYPE_INTEGER;
+ Params[0].Integer.Value = 0x01020304;
+
+ Params[1].Type = ACPI_TYPE_STRING;
+ Params[1].String.Length = 12;
+ Params[1].String.Pointer = "AML Debugger";
+
+ ParamObjects.Pointer = Params;
+ ParamObjects.Count = 2;
+ }
+
+ /* Prepare for a return object of arbitrary size */
+
+ ReturnObj->Pointer = AcpiGbl_DbBuffer;
+ ReturnObj->Length = ACPI_DEBUG_BUFFER_SIZE;
+
+ /* Do the actual method execution */
+
+ AcpiGbl_MethodExecuting = TRUE;
+ Status = AcpiEvaluateObject (NULL,
+ Info->Pathname, &ParamObjects, ReturnObj);
+
+ AcpiGbl_CmSingleStep = FALSE;
+ AcpiGbl_MethodExecuting = FALSE;
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbExecuteSetup
+ *
+ * PARAMETERS: Info - Valid method info
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Setup info segment prior to method execution
+ *
+ ******************************************************************************/
+
+static void
+AcpiDbExecuteSetup (
+ ACPI_DB_METHOD_INFO *Info)
+{
+
+ /* Catenate the current scope to the supplied name */
+
+ Info->Pathname[0] = 0;
+ if ((Info->Name[0] != '\\') &&
+ (Info->Name[0] != '/'))
+ {
+ ACPI_STRCAT (Info->Pathname, AcpiGbl_DbScopeBuf);
+ }
+
+ ACPI_STRCAT (Info->Pathname, Info->Name);
+ AcpiDbPrepNamestring (Info->Pathname);
+
+ AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
+ AcpiOsPrintf ("Executing %s\n", Info->Pathname);
+
+ if (Info->Flags & EX_SINGLE_STEP)
+ {
+ AcpiGbl_CmSingleStep = TRUE;
+ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
+ }
+
+ else
+ {
+ /* No single step, allow redirection to a file */
+
+ AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
+ }
+}
+
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+UINT32
+AcpiDbGetCacheInfo (
+ ACPI_MEMORY_LIST *Cache)
+{
+
+ return (Cache->TotalAllocated - Cache->TotalFreed - Cache->CurrentDepth);
+}
+#endif
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbGetOutstandingAllocations
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Current global allocation count minus cache entries
+ *
+ * DESCRIPTION: Determine the current number of "outstanding" allocations --
+ * those allocations that have not been freed and also are not
+ * in one of the various object caches.
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiDbGetOutstandingAllocations (
+ void)
+{
+ UINT32 Outstanding = 0;
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+
+ Outstanding += AcpiDbGetCacheInfo (AcpiGbl_StateCache);
+ Outstanding += AcpiDbGetCacheInfo (AcpiGbl_PsNodeCache);
+ Outstanding += AcpiDbGetCacheInfo (AcpiGbl_PsNodeExtCache);
+ Outstanding += AcpiDbGetCacheInfo (AcpiGbl_OperandCache);
+#endif
+
+ return (Outstanding);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbExecutionWalk
+ *
+ * PARAMETERS: WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute a control method. Name is relative to the current
+ * scope.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbExecutionWalk (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
+ ACPI_BUFFER ReturnObj;
+ ACPI_STATUS Status;
+
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (ObjDesc->Method.ParamCount)
+ {
+ return (AE_OK);
+ }
+
+ ReturnObj.Pointer = NULL;
+ ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
+
+ AcpiNsPrintNodePathname (Node, "Execute");
+
+ /* Do the actual method execution */
+
+ AcpiOsPrintf ("\n");
+ AcpiGbl_MethodExecuting = TRUE;
+
+ Status = AcpiEvaluateObject (Node, NULL, NULL, &ReturnObj);
+
+ AcpiOsPrintf ("[%4.4s] returned %s\n", AcpiUtGetNodeName (Node),
+ AcpiFormatException (Status));
+ AcpiGbl_MethodExecuting = FALSE;
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbExecute
+ *
+ * PARAMETERS: Name - Name of method to execute
+ * Args - Parameters to the method
+ * Flags - single step/no single step
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Execute a control method. Name is relative to the current
+ * scope.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbExecute (
+ char *Name,
+ char **Args,
+ UINT32 Flags)
+{
+ ACPI_STATUS Status;
+ ACPI_BUFFER ReturnObj;
+ char *NameString;
+
+
+#ifdef ACPI_DEBUG_OUTPUT
+ UINT32 PreviousAllocations;
+ UINT32 Allocations;
+
+
+ /* Memory allocation tracking */
+
+ PreviousAllocations = AcpiDbGetOutstandingAllocations ();
+#endif
+
+ if (*Name == '*')
+ {
+ (void) AcpiWalkNamespace (ACPI_TYPE_METHOD, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX, AcpiDbExecutionWalk, NULL, NULL);
+ return;
+ }
+ else
+ {
+ NameString = ACPI_ALLOCATE (ACPI_STRLEN (Name) + 1);
+ if (!NameString)
+ {
+ return;
+ }
+
+ ACPI_MEMSET (&AcpiGbl_DbMethodInfo, 0, sizeof (ACPI_DB_METHOD_INFO));
+
+ ACPI_STRCPY (NameString, Name);
+ AcpiUtStrupr (NameString);
+ AcpiGbl_DbMethodInfo.Name = NameString;
+ AcpiGbl_DbMethodInfo.Args = Args;
+ AcpiGbl_DbMethodInfo.Flags = Flags;
+
+ ReturnObj.Pointer = NULL;
+ ReturnObj.Length = ACPI_ALLOCATE_BUFFER;
+
+ AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
+ Status = AcpiDbExecuteMethod (&AcpiGbl_DbMethodInfo, &ReturnObj);
+ ACPI_FREE (NameString);
+ }
+
+ /*
+ * Allow any handlers in separate threads to complete.
+ * (Such as Notify handlers invoked from AML executed above).
+ */
+ AcpiOsSleep ((ACPI_INTEGER) 10);
+
+
+#ifdef ACPI_DEBUG_OUTPUT
+
+ /* Memory allocation tracking */
+
+ Allocations = AcpiDbGetOutstandingAllocations () - PreviousAllocations;
+
+ AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
+
+ if (Allocations > 0)
+ {
+ AcpiOsPrintf ("Outstanding: 0x%X allocations after execution\n",
+ Allocations);
+ }
+#endif
+
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Execution of %s failed with status %s\n",
+ AcpiGbl_DbMethodInfo.Pathname, AcpiFormatException (Status));
+ }
+ else
+ {
+ /* Display a return object, if any */
+
+ if (ReturnObj.Length)
+ {
+ AcpiOsPrintf ("Execution of %s returned object %p Buflen %X\n",
+ AcpiGbl_DbMethodInfo.Pathname, ReturnObj.Pointer,
+ (UINT32) ReturnObj.Length);
+ AcpiDbDumpExternalObject (ReturnObj.Pointer, 1);
+ }
+ else
+ {
+ AcpiOsPrintf ("No return object from execution of %s\n",
+ AcpiGbl_DbMethodInfo.Pathname);
+ }
+ }
+
+ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbMethodThread
+ *
+ * PARAMETERS: Context - Execution info segment
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Debugger execute thread. Waits for a command line, then
+ * simply dispatches it.
+ *
+ ******************************************************************************/
+
+static void ACPI_SYSTEM_XFACE
+AcpiDbMethodThread (
+ void *Context)
+{
+ ACPI_STATUS Status;
+ ACPI_DB_METHOD_INFO *Info = Context;
+ UINT32 i;
+ UINT8 Allow;
+ ACPI_BUFFER ReturnObj;
+
+
+ if (Info->InitArgs)
+ {
+ AcpiDbUInt32ToHexString (Info->NumCreated, Info->IndexOfThreadStr);
+ AcpiDbUInt32ToHexString (AcpiOsGetThreadId (), Info->IdOfThreadStr);
+ }
+
+ if (Info->Threads && (Info->NumCreated < Info->NumThreads))
+ {
+ Info->Threads[Info->NumCreated++] = AcpiOsGetThreadId();
+ }
+
+ for (i = 0; i < Info->NumLoops; i++)
+ {
+ Status = AcpiDbExecuteMethod (Info, &ReturnObj);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("%s During execution of %s at iteration %X\n",
+ AcpiFormatException (Status), Info->Pathname, i);
+ if (Status == AE_ABORT_METHOD)
+ {
+ break;
+ }
+ }
+
+#if 0
+ if ((i % 100) == 0)
+ {
+ AcpiOsPrintf ("%d executions, Thread 0x%x\n", i, AcpiOsGetThreadId ());
+ }
+
+ if (ReturnObj.Length)
+ {
+ AcpiOsPrintf ("Execution of %s returned object %p Buflen %X\n",
+ Info->Pathname, ReturnObj.Pointer, (UINT32) ReturnObj.Length);
+ AcpiDbDumpExternalObject (ReturnObj.Pointer, 1);
+ }
+#endif
+ }
+
+ /* Signal our completion */
+
+ Allow = 0;
+ AcpiOsWaitSemaphore (Info->ThreadCompleteGate, 1, ACPI_WAIT_FOREVER);
+ Info->NumCompleted++;
+
+ if (Info->NumCompleted == Info->NumThreads)
+ {
+ /* Do signal for main thread once only */
+ Allow = 1;
+ }
+
+ AcpiOsSignalSemaphore (Info->ThreadCompleteGate, 1);
+
+ if (Allow)
+ {
+ Status = AcpiOsSignalSemaphore (Info->MainThreadGate, 1);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not signal debugger thread sync semaphore, %s\n",
+ AcpiFormatException (Status));
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbCreateExecutionThreads
+ *
+ * PARAMETERS: NumThreadsArg - Number of threads to create
+ * NumLoopsArg - Loop count for the thread(s)
+ * MethodNameArg - Control method to execute
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Create threads to execute method(s)
+ *
+ ******************************************************************************/
+
+void
+AcpiDbCreateExecutionThreads (
+ char *NumThreadsArg,
+ char *NumLoopsArg,
+ char *MethodNameArg)
+{
+ ACPI_STATUS Status;
+ UINT32 NumThreads;
+ UINT32 NumLoops;
+ UINT32 i;
+ UINT32 Size;
+ ACPI_MUTEX MainThreadGate;
+ ACPI_MUTEX ThreadCompleteGate;
+
+ /* Get the arguments */
+
+ NumThreads = ACPI_STRTOUL (NumThreadsArg, NULL, 0);
+ NumLoops = ACPI_STRTOUL (NumLoopsArg, NULL, 0);
+
+ if (!NumThreads || !NumLoops)
+ {
+ AcpiOsPrintf ("Bad argument: Threads %X, Loops %X\n",
+ NumThreads, NumLoops);
+ return;
+ }
+
+ /*
+ * Create the semaphore for synchronization of
+ * the created threads with the main thread.
+ */
+ Status = AcpiOsCreateSemaphore (1, 0, &MainThreadGate);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not create semaphore for synchronization with the main thread, %s\n",
+ AcpiFormatException (Status));
+ return;
+ }
+
+ /*
+ * Create the semaphore for synchronization
+ * between the created threads.
+ */
+ Status = AcpiOsCreateSemaphore (1, 1, &ThreadCompleteGate);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not create semaphore for synchronization between the created threads, %s\n",
+ AcpiFormatException (Status));
+ (void) AcpiOsDeleteSemaphore (MainThreadGate);
+ return;
+ }
+
+ ACPI_MEMSET (&AcpiGbl_DbMethodInfo, 0, sizeof (ACPI_DB_METHOD_INFO));
+
+ /* Array to store IDs of threads */
+
+ AcpiGbl_DbMethodInfo.NumThreads = NumThreads;
+ Size = 4 * AcpiGbl_DbMethodInfo.NumThreads;
+ AcpiGbl_DbMethodInfo.Threads = (UINT32 *) AcpiOsAllocate (Size);
+ if (AcpiGbl_DbMethodInfo.Threads == NULL)
+ {
+ AcpiOsPrintf ("No memory for thread IDs array\n");
+ (void) AcpiOsDeleteSemaphore (MainThreadGate);
+ (void) AcpiOsDeleteSemaphore (ThreadCompleteGate);
+ return;
+ }
+ ACPI_MEMSET (AcpiGbl_DbMethodInfo.Threads, 0, Size);
+
+ /* Setup the context to be passed to each thread */
+
+ AcpiGbl_DbMethodInfo.Name = MethodNameArg;
+ AcpiGbl_DbMethodInfo.Flags = 0;
+ AcpiGbl_DbMethodInfo.NumLoops = NumLoops;
+ AcpiGbl_DbMethodInfo.MainThreadGate = MainThreadGate;
+ AcpiGbl_DbMethodInfo.ThreadCompleteGate = ThreadCompleteGate;
+
+ /* Init arguments to be passed to method */
+
+ AcpiGbl_DbMethodInfo.InitArgs = 1;
+ AcpiGbl_DbMethodInfo.Args = AcpiGbl_DbMethodInfo.Arguments;
+ AcpiGbl_DbMethodInfo.Arguments[0] = AcpiGbl_DbMethodInfo.NumThreadsStr;
+ AcpiGbl_DbMethodInfo.Arguments[1] = AcpiGbl_DbMethodInfo.IdOfThreadStr;
+ AcpiGbl_DbMethodInfo.Arguments[2] = AcpiGbl_DbMethodInfo.IndexOfThreadStr;
+ AcpiGbl_DbMethodInfo.Arguments[3] = NULL;
+ AcpiDbUInt32ToHexString (NumThreads, AcpiGbl_DbMethodInfo.NumThreadsStr);
+
+ AcpiDbExecuteSetup (&AcpiGbl_DbMethodInfo);
+
+ /* Create the threads */
+
+ AcpiOsPrintf ("Creating %X threads to execute %X times each\n",
+ NumThreads, NumLoops);
+
+ for (i = 0; i < (NumThreads); i++)
+ {
+ Status = AcpiOsExecute (OSL_DEBUGGER_THREAD, AcpiDbMethodThread,
+ &AcpiGbl_DbMethodInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+ }
+
+ /* Wait for all threads to complete */
+
+ AcpiOsWaitSemaphore (MainThreadGate, 1, ACPI_WAIT_FOREVER);
+
+ AcpiDbSetOutputDestination (ACPI_DB_DUPLICATE_OUTPUT);
+ AcpiOsPrintf ("All threads (%X) have completed\n", NumThreads);
+ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
+
+ /* Cleanup and exit */
+
+ (void) AcpiOsDeleteSemaphore (MainThreadGate);
+ (void) AcpiOsDeleteSemaphore (ThreadCompleteGate);
+
+ AcpiOsFree (AcpiGbl_DbMethodInfo.Threads);
+ AcpiGbl_DbMethodInfo.Threads = NULL;
+}
+
+#endif /* ACPI_DEBUGGER */
+
+
diff --git a/sys/contrib/dev/acpica/dbfileio.c b/sys/contrib/dev/acpica/dbfileio.c
new file mode 100644
index 0000000..dc97d752
--- /dev/null
+++ b/sys/contrib/dev/acpica/dbfileio.c
@@ -0,0 +1,651 @@
+/*******************************************************************************
+ *
+ * Module Name: dbfileio - Debugger file I/O commands. These can't usually
+ * be used when running the debugger in Ring 0 (Kernel mode)
+ * $Revision: 1.94 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdebug.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/actables.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+#if (defined ACPI_DEBUGGER || defined ACPI_DISASSEMBLER)
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbfileio")
+
+/*
+ * NOTE: this is here for lack of a better place. It is used in all
+ * flavors of the debugger, need LCD file
+ */
+#ifdef ACPI_APPLICATION
+#include <stdio.h>
+FILE *AcpiGbl_DebugFile = NULL;
+#endif
+
+
+#ifdef ACPI_DEBUGGER
+
+/* Local prototypes */
+
+#ifdef ACPI_APPLICATION
+
+static ACPI_STATUS
+AcpiDbCheckTextModeCorruption (
+ UINT8 *Table,
+ UINT32 TableLength,
+ UINT32 FileLength);
+
+static ACPI_STATUS
+AeLocalLoadTable (
+ ACPI_TABLE_HEADER *TablePtr);
+#endif
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbCloseDebugFile
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: If open, close the current debug output file
+ *
+ ******************************************************************************/
+
+void
+AcpiDbCloseDebugFile (
+ void)
+{
+
+#ifdef ACPI_APPLICATION
+
+ if (AcpiGbl_DebugFile)
+ {
+ fclose (AcpiGbl_DebugFile);
+ AcpiGbl_DebugFile = NULL;
+ AcpiGbl_DbOutputToFile = FALSE;
+ AcpiOsPrintf ("Debug output file %s closed\n", AcpiGbl_DbDebugFilename);
+ }
+#endif
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbOpenDebugFile
+ *
+ * PARAMETERS: Name - Filename to open
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Open a file where debug output will be directed.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbOpenDebugFile (
+ char *Name)
+{
+
+#ifdef ACPI_APPLICATION
+
+ AcpiDbCloseDebugFile ();
+ AcpiGbl_DebugFile = fopen (Name, "w+");
+ if (AcpiGbl_DebugFile)
+ {
+ AcpiOsPrintf ("Debug output file %s opened\n", Name);
+ ACPI_STRCPY (AcpiGbl_DbDebugFilename, Name);
+ AcpiGbl_DbOutputToFile = TRUE;
+ }
+ else
+ {
+ AcpiOsPrintf ("Could not open debug file %s\n", Name);
+ }
+
+#endif
+}
+#endif
+
+
+#ifdef ACPI_APPLICATION
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbCheckTextModeCorruption
+ *
+ * PARAMETERS: Table - Table buffer
+ * TableLength - Length of table from the table header
+ * FileLength - Length of the file that contains the table
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Check table for text mode file corruption where all linefeed
+ * characters (LF) have been replaced by carriage return linefeed
+ * pairs (CR/LF).
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbCheckTextModeCorruption (
+ UINT8 *Table,
+ UINT32 TableLength,
+ UINT32 FileLength)
+{
+ UINT32 i;
+ UINT32 Pairs = 0;
+
+
+ if (TableLength != FileLength)
+ {
+ ACPI_WARNING ((AE_INFO,
+ "File length (0x%X) is not the same as the table length (0x%X)",
+ FileLength, TableLength));
+ }
+
+ /* Scan entire table to determine if each LF has been prefixed with a CR */
+
+ for (i = 1; i < FileLength; i++)
+ {
+ if (Table[i] == 0x0A)
+ {
+ if (Table[i - 1] != 0x0D)
+ {
+ /* The LF does not have a preceeding CR, table not corrupted */
+
+ return (AE_OK);
+ }
+ else
+ {
+ /* Found a CR/LF pair */
+
+ Pairs++;
+ }
+ i++;
+ }
+ }
+
+ if (!Pairs)
+ {
+ return (AE_OK);
+ }
+
+ /*
+ * Entire table scanned, each CR is part of a CR/LF pair --
+ * meaning that the table was treated as a text file somewhere.
+ *
+ * NOTE: We can't "fix" the table, because any existing CR/LF pairs in the
+ * original table are left untouched by the text conversion process --
+ * meaning that we cannot simply replace CR/LF pairs with LFs.
+ */
+ AcpiOsPrintf ("Table has been corrupted by text mode conversion\n");
+ AcpiOsPrintf ("All LFs (%d) were changed to CR/LF pairs\n", Pairs);
+ AcpiOsPrintf ("Table cannot be repaired!\n");
+ return (AE_BAD_VALUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbReadTable
+ *
+ * PARAMETERS: fp - File that contains table
+ * Table - Return value, buffer with table
+ * TableLength - Return value, length of table
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Load the DSDT from the file pointer
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbReadTable (
+ FILE *fp,
+ ACPI_TABLE_HEADER **Table,
+ UINT32 *TableLength)
+{
+ ACPI_TABLE_HEADER TableHeader;
+ UINT32 Actual;
+ ACPI_STATUS Status;
+ UINT32 FileSize;
+ BOOLEAN StandardHeader = TRUE;
+
+
+ /* Get the file size */
+
+ fseek (fp, 0, SEEK_END);
+ FileSize = (UINT32) ftell (fp);
+ fseek (fp, 0, SEEK_SET);
+
+ if (FileSize < 4)
+ {
+ return (AE_BAD_HEADER);
+ }
+
+ /* Read the signature */
+
+ if (fread (&TableHeader, 1, 4, fp) != 4)
+ {
+ AcpiOsPrintf ("Could not read the table signature\n");
+ return (AE_BAD_HEADER);
+ }
+
+ fseek (fp, 0, SEEK_SET);
+
+ /* The RSDT and FACS tables do not have standard ACPI headers */
+
+ if (ACPI_COMPARE_NAME (TableHeader.Signature, "RSD ") ||
+ ACPI_COMPARE_NAME (TableHeader.Signature, "FACS"))
+ {
+ *TableLength = FileSize;
+ StandardHeader = FALSE;
+ }
+ else
+ {
+ /* Read the table header */
+
+ if (fread (&TableHeader, 1, sizeof (TableHeader), fp) !=
+ sizeof (ACPI_TABLE_HEADER))
+ {
+ AcpiOsPrintf ("Could not read the table header\n");
+ return (AE_BAD_HEADER);
+ }
+
+#if 0
+ /* Validate the table header/length */
+
+ Status = AcpiTbValidateTableHeader (&TableHeader);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Table header is invalid!\n");
+ return (Status);
+ }
+#endif
+
+ /* File size must be at least as long as the Header-specified length */
+
+ if (TableHeader.Length > FileSize)
+ {
+ AcpiOsPrintf (
+ "TableHeader length [0x%X] greater than the input file size [0x%X]\n",
+ TableHeader.Length, FileSize);
+ return (AE_BAD_HEADER);
+ }
+
+#ifdef ACPI_OBSOLETE_CODE
+ /* We only support a limited number of table types */
+
+ if (ACPI_STRNCMP ((char *) TableHeader.Signature, DSDT_SIG, 4) &&
+ ACPI_STRNCMP ((char *) TableHeader.Signature, PSDT_SIG, 4) &&
+ ACPI_STRNCMP ((char *) TableHeader.Signature, SSDT_SIG, 4))
+ {
+ AcpiOsPrintf ("Table signature [%4.4s] is invalid or not supported\n",
+ (char *) TableHeader.Signature);
+ ACPI_DUMP_BUFFER (&TableHeader, sizeof (ACPI_TABLE_HEADER));
+ return (AE_ERROR);
+ }
+#endif
+
+ *TableLength = TableHeader.Length;
+ }
+
+ /* Allocate a buffer for the table */
+
+ *Table = AcpiOsAllocate ((size_t) FileSize);
+ if (!*Table)
+ {
+ AcpiOsPrintf (
+ "Could not allocate memory for ACPI table %4.4s (size=0x%X)\n",
+ TableHeader.Signature, *TableLength);
+ return (AE_NO_MEMORY);
+ }
+
+ /* Get the rest of the table */
+
+ fseek (fp, 0, SEEK_SET);
+ Actual = fread (*Table, 1, (size_t) FileSize, fp);
+ if (Actual == FileSize)
+ {
+ if (StandardHeader)
+ {
+ /* Now validate the checksum */
+
+ Status = AcpiTbChecksum ((void *) *Table,
+ ACPI_CAST_PTR (ACPI_TABLE_HEADER, *Table)->Length);
+
+ if (Status == AE_BAD_CHECKSUM)
+ {
+ Status = AcpiDbCheckTextModeCorruption ((UINT8 *) *Table,
+ FileSize, (*Table)->Length);
+ return (Status);
+ }
+ }
+ return (AE_OK);
+ }
+
+ if (Actual > 0)
+ {
+ AcpiOsPrintf ("Warning - reading table, asked for %X got %X\n",
+ FileSize, Actual);
+ return (AE_OK);
+ }
+
+ AcpiOsPrintf ("Error - could not read the table file\n");
+ AcpiOsFree (*Table);
+ *Table = NULL;
+ *TableLength = 0;
+
+ return (AE_ERROR);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AeLocalLoadTable
+ *
+ * PARAMETERS: Table - pointer to a buffer containing the entire
+ * table to be loaded
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to load a table from the caller's
+ * buffer. The buffer must contain an entire ACPI Table including
+ * a valid header. The header fields will be verified, and if it
+ * is determined that the table is invalid, the call will fail.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AeLocalLoadTable (
+ ACPI_TABLE_HEADER *Table)
+{
+ ACPI_STATUS Status = AE_OK;
+/* ACPI_TABLE_DESC TableInfo; */
+
+
+ ACPI_FUNCTION_TRACE (AeLocalLoadTable);
+#if 0
+
+
+ if (!Table)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ TableInfo.Pointer = Table;
+ Status = AcpiTbRecognizeTable (&TableInfo, ACPI_TABLE_ALL);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Install the new table into the local data structures */
+
+ Status = AcpiTbInstallTable (&TableInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_ALREADY_EXISTS)
+ {
+ /* Table already exists, no error */
+
+ Status = AE_OK;
+ }
+
+ /* Free table allocated by AcpiTbGetTable */
+
+ AcpiTbDeleteSingleTable (&TableInfo);
+ return_ACPI_STATUS (Status);
+ }
+
+#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
+
+ Status = AcpiNsLoadTable (TableInfo.InstalledDesc, AcpiGbl_RootNode);
+ if (ACPI_FAILURE (Status))
+ {
+ /* Uninstall table and free the buffer */
+
+ AcpiTbDeleteTablesByType (ACPI_TABLE_ID_DSDT);
+ return_ACPI_STATUS (Status);
+ }
+#endif
+#endif
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbReadTableFromFile
+ *
+ * PARAMETERS: Filename - File where table is located
+ * Table - Where a pointer to the table is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get an ACPI table from a file
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbReadTableFromFile (
+ char *Filename,
+ ACPI_TABLE_HEADER **Table)
+{
+ FILE *fp;
+ UINT32 TableLength;
+ ACPI_STATUS Status;
+
+
+ /* Open the file */
+
+ fp = fopen (Filename, "rb");
+ if (!fp)
+ {
+ AcpiOsPrintf ("Could not open input file %s\n", Filename);
+ return (AE_ERROR);
+ }
+
+ /* Get the entire file */
+
+ fprintf (stderr, "Loading Acpi table from file %s\n", Filename);
+ Status = AcpiDbReadTable (fp, Table, &TableLength);
+ fclose(fp);
+
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not get table from the file\n");
+ return (Status);
+ }
+
+ return (AE_OK);
+ }
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbGetTableFromFile
+ *
+ * PARAMETERS: Filename - File where table is located
+ * ReturnTable - Where a pointer to the table is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Load an ACPI table from a file
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbGetTableFromFile (
+ char *Filename,
+ ACPI_TABLE_HEADER **ReturnTable)
+{
+#ifdef ACPI_APPLICATION
+ ACPI_STATUS Status;
+ ACPI_TABLE_HEADER *Table;
+ BOOLEAN IsAmlTable = TRUE;
+
+
+ Status = AcpiDbReadTableFromFile (Filename, &Table);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+#ifdef ACPI_DATA_TABLE_DISASSEMBLY
+ IsAmlTable = AcpiUtIsAmlTable (Table);
+#endif
+
+ if (IsAmlTable)
+ {
+ /* Attempt to recognize and install the table */
+
+ Status = AeLocalLoadTable (Table);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_ALREADY_EXISTS)
+ {
+ AcpiOsPrintf ("Table %4.4s is already installed\n",
+ Table->Signature);
+ }
+ else
+ {
+ AcpiOsPrintf ("Could not install table, %s\n",
+ AcpiFormatException (Status));
+ }
+
+ return (Status);
+ }
+
+ fprintf (stderr,
+ "Acpi table [%4.4s] successfully installed and loaded\n",
+ Table->Signature);
+ }
+
+ AcpiGbl_AcpiHardwarePresent = FALSE;
+ if (ReturnTable)
+ {
+ *ReturnTable = Table;
+ }
+
+
+#endif /* ACPI_APPLICATION */
+ return (AE_OK);
+}
+
+#endif /* ACPI_DEBUGGER */
+
diff --git a/sys/contrib/dev/acpica/dbhistry.c b/sys/contrib/dev/acpica/dbhistry.c
new file mode 100644
index 0000000..f766f4f
--- /dev/null
+++ b/sys/contrib/dev/acpica/dbhistry.c
@@ -0,0 +1,292 @@
+/******************************************************************************
+ *
+ * Module Name: dbhistry - debugger HISTORY command
+ * $Revision: 1.34 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdebug.h>
+
+#ifdef ACPI_DEBUGGER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbhistry")
+
+
+#define HI_NO_HISTORY 0
+#define HI_RECORD_HISTORY 1
+#define HISTORY_SIZE 20
+
+
+typedef struct HistoryInfo
+{
+ char Command[80];
+ UINT32 CmdNum;
+
+} HISTORY_INFO;
+
+
+static HISTORY_INFO AcpiGbl_HistoryBuffer[HISTORY_SIZE];
+static UINT16 AcpiGbl_LoHistory = 0;
+static UINT16 AcpiGbl_NumHistory = 0;
+static UINT16 AcpiGbl_NextHistoryIndex = 0;
+static UINT32 AcpiGbl_NextCmdNum = 1;
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbAddToHistory
+ *
+ * PARAMETERS: CommandLine - Command to add
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Add a command line to the history buffer.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbAddToHistory (
+ char *CommandLine)
+{
+
+ /* Put command into the next available slot */
+
+ ACPI_STRCPY (AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].Command,
+ CommandLine);
+
+ AcpiGbl_HistoryBuffer[AcpiGbl_NextHistoryIndex].CmdNum = AcpiGbl_NextCmdNum;
+
+ /* Adjust indexes */
+
+ if ((AcpiGbl_NumHistory == HISTORY_SIZE) &&
+ (AcpiGbl_NextHistoryIndex == AcpiGbl_LoHistory))
+ {
+ AcpiGbl_LoHistory++;
+ if (AcpiGbl_LoHistory >= HISTORY_SIZE)
+ {
+ AcpiGbl_LoHistory = 0;
+ }
+ }
+
+ AcpiGbl_NextHistoryIndex++;
+ if (AcpiGbl_NextHistoryIndex >= HISTORY_SIZE)
+ {
+ AcpiGbl_NextHistoryIndex = 0;
+ }
+
+ AcpiGbl_NextCmdNum++;
+ if (AcpiGbl_NumHistory < HISTORY_SIZE)
+ {
+ AcpiGbl_NumHistory++;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayHistory
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display the contents of the history buffer
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDisplayHistory (
+ void)
+{
+ ACPI_NATIVE_UINT i;
+ UINT16 HistoryIndex;
+
+
+ HistoryIndex = AcpiGbl_LoHistory;
+
+ /* Dump entire history buffer */
+
+ for (i = 0; i < AcpiGbl_NumHistory; i++)
+ {
+ AcpiOsPrintf ("%ld %s\n", AcpiGbl_HistoryBuffer[HistoryIndex].CmdNum,
+ AcpiGbl_HistoryBuffer[HistoryIndex].Command);
+
+ HistoryIndex++;
+ if (HistoryIndex >= HISTORY_SIZE)
+ {
+ HistoryIndex = 0;
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbGetFromHistory
+ *
+ * PARAMETERS: CommandNumArg - String containing the number of the
+ * command to be retrieved
+ *
+ * RETURN: Pointer to the retrieved command. Null on error.
+ *
+ * DESCRIPTION: Get a command from the history buffer
+ *
+ ******************************************************************************/
+
+char *
+AcpiDbGetFromHistory (
+ char *CommandNumArg)
+{
+ ACPI_NATIVE_UINT i;
+ UINT16 HistoryIndex;
+ UINT32 CmdNum;
+
+
+ if (CommandNumArg == NULL)
+ {
+ CmdNum = AcpiGbl_NextCmdNum - 1;
+ }
+
+ else
+ {
+ CmdNum = ACPI_STRTOUL (CommandNumArg, NULL, 0);
+ }
+
+ /* Search history buffer */
+
+ HistoryIndex = AcpiGbl_LoHistory;
+ for (i = 0; i < AcpiGbl_NumHistory; i++)
+ {
+ if (AcpiGbl_HistoryBuffer[HistoryIndex].CmdNum == CmdNum)
+ {
+ /* Found the commnad, return it */
+
+ return (AcpiGbl_HistoryBuffer[HistoryIndex].Command);
+ }
+
+
+ HistoryIndex++;
+ if (HistoryIndex >= HISTORY_SIZE)
+ {
+ HistoryIndex = 0;
+ }
+ }
+
+ AcpiOsPrintf ("Invalid history number: %d\n", HistoryIndex);
+ return (NULL);
+}
+
+#endif /* ACPI_DEBUGGER */
+
diff --git a/sys/contrib/dev/acpica/dbinput.c b/sys/contrib/dev/acpica/dbinput.c
new file mode 100644
index 0000000..a7257ad
--- /dev/null
+++ b/sys/contrib/dev/acpica/dbinput.c
@@ -0,0 +1,1069 @@
+/*******************************************************************************
+ *
+ * Module Name: dbinput - user front-end to the AML debugger
+ * $Revision: 1.114 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdebug.h>
+
+
+#ifdef ACPI_DEBUGGER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbinput")
+
+/* Local prototypes */
+
+static char *
+AcpiDbGetNextToken (
+ char *String,
+ char **Next);
+
+static UINT32
+AcpiDbGetLine (
+ char *InputBuffer);
+
+static UINT32
+AcpiDbMatchCommand (
+ char *UserCommand);
+
+static void
+AcpiDbSingleThread (
+ void);
+
+static void
+AcpiDbDisplayHelp (
+ char *HelpType);
+
+
+/*
+ * Top-level debugger commands.
+ *
+ * This list of commands must match the string table below it
+ */
+enum AcpiExDebuggerCommands
+{
+ CMD_NOT_FOUND = 0,
+ CMD_NULL,
+ CMD_ALLOCATIONS,
+ CMD_ARGS,
+ CMD_ARGUMENTS,
+ CMD_BREAKPOINT,
+ CMD_BUSINFO,
+ CMD_CALL,
+ CMD_CLOSE,
+ CMD_DEBUG,
+ CMD_DISASSEMBLE,
+ CMD_DUMP,
+ CMD_ENABLEACPI,
+ CMD_EVENT,
+ CMD_EXECUTE,
+ CMD_EXIT,
+ CMD_FIND,
+ CMD_GO,
+ CMD_GPE,
+ CMD_GPES,
+ CMD_HELP,
+ CMD_HELP2,
+ CMD_HISTORY,
+ CMD_HISTORY_EXE,
+ CMD_HISTORY_LAST,
+ CMD_INFORMATION,
+ CMD_INTEGRITY,
+ CMD_INTO,
+ CMD_LEVEL,
+ CMD_LIST,
+ CMD_LOAD,
+ CMD_LOCALS,
+ CMD_LOCKS,
+ CMD_METHODS,
+ CMD_NAMESPACE,
+ CMD_NOTIFY,
+ CMD_OBJECT,
+ CMD_OPEN,
+ CMD_OWNER,
+ CMD_PREFIX,
+ CMD_QUIT,
+ CMD_REFERENCES,
+ CMD_RESOURCES,
+ CMD_RESULTS,
+ CMD_SET,
+ CMD_SLEEP,
+ CMD_STATS,
+ CMD_STOP,
+ CMD_TABLES,
+ CMD_TERMINATE,
+ CMD_THREADS,
+ CMD_TRACE,
+ CMD_TREE,
+ CMD_TYPE,
+ CMD_UNLOAD
+};
+
+#define CMD_FIRST_VALID 2
+
+static const COMMAND_INFO AcpiGbl_DbCommands[] =
+{
+ {"<NOT FOUND>", 0},
+ {"<NULL>", 0},
+ {"ALLOCATIONS", 0},
+ {"ARGS", 0},
+ {"ARGUMENTS", 0},
+ {"BREAKPOINT", 1},
+ {"BUSINFO", 0},
+ {"CALL", 0},
+ {"CLOSE", 0},
+ {"DEBUG", 1},
+ {"DISASSEMBLE", 1},
+ {"DUMP", 1},
+ {"ENABLEACPI", 0},
+ {"EVENT", 1},
+ {"EXECUTE", 1},
+ {"EXIT", 0},
+ {"FIND", 1},
+ {"GO", 0},
+ {"GPE", 2},
+ {"GPES", 0},
+ {"HELP", 0},
+ {"?", 0},
+ {"HISTORY", 0},
+ {"!", 1},
+ {"!!", 0},
+ {"INFORMATION", 0},
+ {"INTEGRITY", 0},
+ {"INTO", 0},
+ {"LEVEL", 0},
+ {"LIST", 0},
+ {"LOAD", 1},
+ {"LOCALS", 0},
+ {"LOCKS", 0},
+ {"METHODS", 0},
+ {"NAMESPACE", 0},
+ {"NOTIFY", 2},
+ {"OBJECT", 1},
+ {"OPEN", 1},
+ {"OWNER", 1},
+ {"PREFIX", 0},
+ {"QUIT", 0},
+ {"REFERENCES", 1},
+ {"RESOURCES", 1},
+ {"RESULTS", 0},
+ {"SET", 3},
+ {"SLEEP", 1},
+ {"STATS", 0},
+ {"STOP", 0},
+ {"TABLES", 0},
+ {"TERMINATE", 0},
+ {"THREADS", 3},
+ {"TRACE", 1},
+ {"TREE", 0},
+ {"TYPE", 1},
+ {"UNLOAD", 1},
+ {NULL, 0}
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayHelp
+ *
+ * PARAMETERS: HelpType - Subcommand (optional)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print a usage message.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDbDisplayHelp (
+ char *HelpType)
+{
+
+ AcpiUtStrupr (HelpType);
+
+ /* No parameter, just give the overview */
+
+ if (!HelpType)
+ {
+ AcpiOsPrintf ("ACPI CA Debugger Commands\n\n");
+ AcpiOsPrintf ("The following classes of commands are available. Help is available for\n");
+ AcpiOsPrintf ("each class by entering \"Help <ClassName>\"\n\n");
+ AcpiOsPrintf (" [GENERAL] General-Purpose Commands\n");
+ AcpiOsPrintf (" [NAMESPACE] Namespace Access Commands\n");
+ AcpiOsPrintf (" [METHOD] Control Method Execution Commands\n");
+ AcpiOsPrintf (" [STATISTICS] Statistical Information\n");
+ AcpiOsPrintf (" [FILE] File I/O Commands\n");
+ return;
+ }
+
+ /*
+ * Parameter is the command class
+ *
+ * The idea here is to keep each class of commands smaller than a screenful
+ */
+ switch (HelpType[0])
+ {
+ case 'G':
+ AcpiOsPrintf ("\nGeneral-Purpose Commands\n\n");
+ AcpiOsPrintf ("Allocations Display list of current memory allocations\n");
+ AcpiOsPrintf ("Dump <Address>|<Namepath>\n");
+ AcpiOsPrintf (" [Byte|Word|Dword|Qword] Display ACPI objects or memory\n");
+ AcpiOsPrintf ("EnableAcpi Enable ACPI (hardware) mode\n");
+ AcpiOsPrintf ("Help This help screen\n");
+ AcpiOsPrintf ("History Display command history buffer\n");
+ AcpiOsPrintf ("Level [<DebugLevel>] [console] Get/Set debug level for file or console\n");
+ AcpiOsPrintf ("Locks Current status of internal mutexes\n");
+ AcpiOsPrintf ("Quit or Exit Exit this command\n");
+ AcpiOsPrintf ("Stats [Allocations|Memory|Misc\n");
+ AcpiOsPrintf (" |Objects|Sizes|Stack|Tables] Display namespace and memory statistics\n");
+ AcpiOsPrintf ("Tables Display info about loaded ACPI tables\n");
+ AcpiOsPrintf ("Unload <TableSig> [Instance] Unload an ACPI table\n");
+ AcpiOsPrintf ("! <CommandNumber> Execute command from history buffer\n");
+ AcpiOsPrintf ("!! Execute last command again\n");
+ return;
+
+ case 'S':
+ AcpiOsPrintf ("\nStats Subcommands\n\n");
+ AcpiOsPrintf ("Allocations Display list of current memory allocations\n");
+ AcpiOsPrintf ("Memory Dump internal memory lists\n");
+ AcpiOsPrintf ("Misc Namespace search and mutex stats\n");
+ AcpiOsPrintf ("Objects Summary of namespace objects\n");
+ AcpiOsPrintf ("Sizes Sizes for each of the internal objects\n");
+ AcpiOsPrintf ("Stack Display CPU stack usage\n");
+ AcpiOsPrintf ("Tables Info about current ACPI table(s)\n");
+ return;
+
+ case 'N':
+ AcpiOsPrintf ("\nNamespace Access Commands\n\n");
+ AcpiOsPrintf ("Businfo Display system bus info\n");
+ AcpiOsPrintf ("Disassemble <Method> Disassemble a control method\n");
+ AcpiOsPrintf ("Event <F|G> <Value> Generate AcpiEvent (Fixed/GPE)\n");
+ AcpiOsPrintf ("Find <AcpiName> (? is wildcard) Find ACPI name(s) with wildcards\n");
+ AcpiOsPrintf ("Gpe <GpeNum> <GpeBlock> Simulate a GPE\n");
+ AcpiOsPrintf ("Gpes Display info on all GPEs\n");
+ AcpiOsPrintf ("Integrity Validate namespace integrity\n");
+ AcpiOsPrintf ("Methods Display list of loaded control methods\n");
+ AcpiOsPrintf ("Namespace [Object] [Depth] Display loaded namespace tree/subtree\n");
+ AcpiOsPrintf ("Notify <Object> <Value> Send a notification on Object\n");
+ AcpiOsPrintf ("Objects <ObjectType> Display all objects of the given type\n");
+ AcpiOsPrintf ("Owner <OwnerId> [Depth] Display loaded namespace by object owner\n");
+ AcpiOsPrintf ("Prefix [<NamePath>] Set or Get current execution prefix\n");
+ AcpiOsPrintf ("References <Addr> Find all references to object at addr\n");
+ AcpiOsPrintf ("Resources <Device> Get and display Device resources\n");
+ AcpiOsPrintf ("Set N <NamedObject> <Value> Set value for named integer\n");
+ AcpiOsPrintf ("Sleep <SleepState> Simulate sleep/wake sequence\n");
+ AcpiOsPrintf ("Terminate Delete namespace and all internal objects\n");
+ AcpiOsPrintf ("Type <Object> Display object type\n");
+ return;
+
+ case 'M':
+ AcpiOsPrintf ("\nControl Method Execution Commands\n\n");
+ AcpiOsPrintf ("Arguments (or Args) Display method arguments\n");
+ AcpiOsPrintf ("Breakpoint <AmlOffset> Set an AML execution breakpoint\n");
+ AcpiOsPrintf ("Call Run to next control method invocation\n");
+ AcpiOsPrintf ("Debug <Namepath> [Arguments] Single Step a control method\n");
+ AcpiOsPrintf ("Execute <Namepath> [Arguments] Execute control method\n");
+ AcpiOsPrintf ("Go Allow method to run to completion\n");
+ AcpiOsPrintf ("Information Display info about the current method\n");
+ AcpiOsPrintf ("Into Step into (not over) a method call\n");
+ AcpiOsPrintf ("List [# of Aml Opcodes] Display method ASL statements\n");
+ AcpiOsPrintf ("Locals Display method local variables\n");
+ AcpiOsPrintf ("Results Display method result stack\n");
+ AcpiOsPrintf ("Set <A|L> <#> <Value> Set method data (Arguments/Locals)\n");
+ AcpiOsPrintf ("Stop Terminate control method\n");
+ AcpiOsPrintf ("Thread <Threads><Loops><NamePath> Spawn threads to execute method(s)\n");
+ AcpiOsPrintf ("Trace <method name> Trace method execution\n");
+ AcpiOsPrintf ("Tree Display control method calling tree\n");
+ AcpiOsPrintf ("<Enter> Single step next AML opcode (over calls)\n");
+ return;
+
+ case 'F':
+ AcpiOsPrintf ("\nFile I/O Commands\n\n");
+ AcpiOsPrintf ("Close Close debug output file\n");
+ AcpiOsPrintf ("Open <Output Filename> Open a file for debug output\n");
+ AcpiOsPrintf ("Load <Input Filename> Load ACPI table from a file\n");
+ return;
+
+ default:
+ AcpiOsPrintf ("Unrecognized Command Class: %s\n", HelpType);
+ return;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbGetNextToken
+ *
+ * PARAMETERS: String - Command buffer
+ * Next - Return value, end of next token
+ *
+ * RETURN: Pointer to the start of the next token.
+ *
+ * DESCRIPTION: Command line parsing. Get the next token on the command line
+ *
+ ******************************************************************************/
+
+static char *
+AcpiDbGetNextToken (
+ char *String,
+ char **Next)
+{
+ char *Start;
+
+
+ /* At end of buffer? */
+
+ if (!String || !(*String))
+ {
+ return (NULL);
+ }
+
+ /* Get rid of any spaces at the beginning */
+
+ if (*String == ' ')
+ {
+ while (*String && (*String == ' '))
+ {
+ String++;
+ }
+
+ if (!(*String))
+ {
+ return (NULL);
+ }
+ }
+
+ Start = String;
+
+ /* Find end of token */
+
+ while (*String && (*String != ' '))
+ {
+ String++;
+ }
+
+ if (!(*String))
+ {
+ *Next = NULL;
+ }
+ else
+ {
+ *String = 0;
+ *Next = String + 1;
+ }
+
+ return (Start);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbGetLine
+ *
+ * PARAMETERS: InputBuffer - Command line buffer
+ *
+ * RETURN: Count of arguments to the command
+ *
+ * DESCRIPTION: Get the next command line from the user. Gets entire line
+ * up to the next newline
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiDbGetLine (
+ char *InputBuffer)
+{
+ UINT32 i;
+ UINT32 Count;
+ char *Next;
+ char *This;
+
+
+ ACPI_STRCPY (AcpiGbl_DbParsedBuf, InputBuffer);
+
+ This = AcpiGbl_DbParsedBuf;
+ for (i = 0; i < ACPI_DEBUGGER_MAX_ARGS; i++)
+ {
+ AcpiGbl_DbArgs[i] = AcpiDbGetNextToken (This, &Next);
+ if (!AcpiGbl_DbArgs[i])
+ {
+ break;
+ }
+
+ This = Next;
+ }
+
+ /* Uppercase the actual command */
+
+ if (AcpiGbl_DbArgs[0])
+ {
+ AcpiUtStrupr (AcpiGbl_DbArgs[0]);
+ }
+
+ Count = i;
+ if (Count)
+ {
+ Count--; /* Number of args only */
+ }
+
+ return (Count);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbMatchCommand
+ *
+ * PARAMETERS: UserCommand - User command line
+ *
+ * RETURN: Index into command array, -1 if not found
+ *
+ * DESCRIPTION: Search command array for a command match
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiDbMatchCommand (
+ char *UserCommand)
+{
+ UINT32 i;
+
+
+ if (!UserCommand || UserCommand[0] == 0)
+ {
+ return (CMD_NULL);
+ }
+
+ for (i = CMD_FIRST_VALID; AcpiGbl_DbCommands[i].Name; i++)
+ {
+ if (ACPI_STRSTR (AcpiGbl_DbCommands[i].Name, UserCommand) ==
+ AcpiGbl_DbCommands[i].Name)
+ {
+ return (i);
+ }
+ }
+
+ /* Command not recognized */
+
+ return (CMD_NOT_FOUND);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbCommandDispatch
+ *
+ * PARAMETERS: InputBuffer - Command line buffer
+ * WalkState - Current walk
+ * Op - Current (executing) parse op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Command dispatcher.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbCommandDispatch (
+ char *InputBuffer,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT32 Temp;
+ UINT32 CommandIndex;
+ UINT32 ParamCount;
+ char *CommandLine;
+ ACPI_STATUS Status = AE_CTRL_TRUE;
+
+
+ /* If AcpiTerminate has been called, terminate this thread */
+
+ if (AcpiGbl_DbTerminateThreads)
+ {
+ return (AE_CTRL_TERMINATE);
+ }
+
+ ParamCount = AcpiDbGetLine (InputBuffer);
+ CommandIndex = AcpiDbMatchCommand (AcpiGbl_DbArgs[0]);
+ Temp = 0;
+
+ /* Verify that we have the minimum number of params */
+
+ if (ParamCount < AcpiGbl_DbCommands[CommandIndex].MinArgs)
+ {
+ AcpiOsPrintf ("%d parameters entered, [%s] requires %d parameters\n",
+ ParamCount, AcpiGbl_DbCommands[CommandIndex].Name,
+ AcpiGbl_DbCommands[CommandIndex].MinArgs);
+
+ return (AE_CTRL_TRUE);
+ }
+
+ /* Decode and dispatch the command */
+
+ switch (CommandIndex)
+ {
+ case CMD_NULL:
+ if (Op)
+ {
+ return (AE_OK);
+ }
+ break;
+
+ case CMD_ALLOCATIONS:
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+ AcpiUtDumpAllocations ((UINT32) -1, NULL);
+#endif
+ break;
+
+ case CMD_ARGS:
+ case CMD_ARGUMENTS:
+ AcpiDbDisplayArguments ();
+ break;
+
+ case CMD_BREAKPOINT:
+ AcpiDbSetMethodBreakpoint (AcpiGbl_DbArgs[1], WalkState, Op);
+ break;
+
+ case CMD_BUSINFO:
+ AcpiDbGetBusInfo ();
+ break;
+
+ case CMD_CALL:
+ AcpiDbSetMethodCallBreakpoint (Op);
+ Status = AE_OK;
+ break;
+
+ case CMD_CLOSE:
+ AcpiDbCloseDebugFile ();
+ break;
+
+ case CMD_DEBUG:
+ AcpiDbExecute (AcpiGbl_DbArgs[1], &AcpiGbl_DbArgs[2], EX_SINGLE_STEP);
+ break;
+
+ case CMD_DISASSEMBLE:
+ (void) AcpiDbDisassembleMethod (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_DUMP:
+ AcpiDbDecodeAndDisplayObject (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
+ break;
+
+ case CMD_ENABLEACPI:
+ Status = AcpiEnable();
+ if (ACPI_FAILURE(Status))
+ {
+ AcpiOsPrintf("AcpiEnable failed (Status=%X)\n", Status);
+ return (Status);
+ }
+ break;
+
+ case CMD_EVENT:
+ AcpiOsPrintf ("Event command not implemented\n");
+ break;
+
+ case CMD_EXECUTE:
+ AcpiDbExecute (AcpiGbl_DbArgs[1],
+ &AcpiGbl_DbArgs[2], EX_NO_SINGLE_STEP);
+ break;
+
+ case CMD_FIND:
+ Status = AcpiDbFindNameInNamespace (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_GO:
+ AcpiGbl_CmSingleStep = FALSE;
+ return (AE_OK);
+
+ case CMD_GPE:
+ AcpiDbGenerateGpe (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
+ break;
+
+ case CMD_GPES:
+ AcpiDbDisplayGpes ();
+ break;
+
+ case CMD_HELP:
+ case CMD_HELP2:
+ AcpiDbDisplayHelp (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_HISTORY:
+ AcpiDbDisplayHistory ();
+ break;
+
+ case CMD_HISTORY_EXE:
+ CommandLine = AcpiDbGetFromHistory (AcpiGbl_DbArgs[1]);
+ if (!CommandLine)
+ {
+ return (AE_CTRL_TRUE);
+ }
+
+ Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
+ return (Status);
+
+ case CMD_HISTORY_LAST:
+ CommandLine = AcpiDbGetFromHistory (NULL);
+ if (!CommandLine)
+ {
+ return (AE_CTRL_TRUE);
+ }
+
+ Status = AcpiDbCommandDispatch (CommandLine, WalkState, Op);
+ return (Status);
+
+ case CMD_INFORMATION:
+ AcpiDbDisplayMethodInfo (Op);
+ break;
+
+ case CMD_INTEGRITY:
+ AcpiDbCheckIntegrity ();
+ break;
+
+ case CMD_INTO:
+ if (Op)
+ {
+ AcpiGbl_CmSingleStep = TRUE;
+ return (AE_OK);
+ }
+ break;
+
+ case CMD_LEVEL:
+ if (ParamCount == 0)
+ {
+ AcpiOsPrintf ("Current debug level for file output is: %8.8lX\n",
+ AcpiGbl_DbDebugLevel);
+ AcpiOsPrintf ("Current debug level for console output is: %8.8lX\n",
+ AcpiGbl_DbConsoleDebugLevel);
+ }
+ else if (ParamCount == 2)
+ {
+ Temp = AcpiGbl_DbConsoleDebugLevel;
+ AcpiGbl_DbConsoleDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1],
+ NULL, 16);
+ AcpiOsPrintf (
+ "Debug Level for console output was %8.8lX, now %8.8lX\n",
+ Temp, AcpiGbl_DbConsoleDebugLevel);
+ }
+ else
+ {
+ Temp = AcpiGbl_DbDebugLevel;
+ AcpiGbl_DbDebugLevel = ACPI_STRTOUL (AcpiGbl_DbArgs[1], NULL, 16);
+ AcpiOsPrintf (
+ "Debug Level for file output was %8.8lX, now %8.8lX\n",
+ Temp, AcpiGbl_DbDebugLevel);
+ }
+ break;
+
+ case CMD_LIST:
+ AcpiDbDisassembleAml (AcpiGbl_DbArgs[1], Op);
+ break;
+
+ case CMD_LOAD:
+ Status = AcpiDbGetTableFromFile (AcpiGbl_DbArgs[1], NULL);
+ break;
+
+ case CMD_LOCKS:
+ AcpiDbDisplayLocks ();
+ break;
+
+ case CMD_LOCALS:
+ AcpiDbDisplayLocals ();
+ break;
+
+ case CMD_METHODS:
+ Status = AcpiDbDisplayObjects ("METHOD", AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_NAMESPACE:
+ AcpiDbDumpNamespace (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
+ break;
+
+ case CMD_NOTIFY:
+ Temp = ACPI_STRTOUL (AcpiGbl_DbArgs[2], NULL, 0);
+ AcpiDbSendNotify (AcpiGbl_DbArgs[1], Temp);
+ break;
+
+ case CMD_OBJECT:
+ AcpiUtStrupr (AcpiGbl_DbArgs[1]);
+ Status = AcpiDbDisplayObjects (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
+ break;
+
+ case CMD_OPEN:
+ AcpiDbOpenDebugFile (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_OWNER:
+ AcpiDbDumpNamespaceByOwner (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
+ break;
+
+ case CMD_PREFIX:
+ AcpiDbSetScope (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_REFERENCES:
+ AcpiDbFindReferences (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_RESOURCES:
+ AcpiDbDisplayResources (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_RESULTS:
+ AcpiDbDisplayResults ();
+ break;
+
+ case CMD_SET:
+ AcpiDbSetMethodData (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
+ AcpiGbl_DbArgs[3]);
+ break;
+
+ case CMD_SLEEP:
+ Status = AcpiDbSleep (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_STATS:
+ Status = AcpiDbDisplayStatistics (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_STOP:
+ return (AE_NOT_IMPLEMENTED);
+
+ case CMD_TABLES:
+ AcpiDbDisplayTableInfo (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_TERMINATE:
+ AcpiDbSetOutputDestination (ACPI_DB_REDIRECTABLE_OUTPUT);
+ AcpiUtSubsystemShutdown ();
+
+ /*
+ * TBD: [Restructure] Need some way to re-initialize without
+ * re-creating the semaphores!
+ */
+
+ /* AcpiInitialize (NULL); */
+ break;
+
+ case CMD_THREADS:
+ AcpiDbCreateExecutionThreads (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2],
+ AcpiGbl_DbArgs[3]);
+ break;
+
+ case CMD_TRACE:
+ AcpiDebugTrace (AcpiGbl_DbArgs[1],0,0,1);
+ break;
+
+ case CMD_TREE:
+ AcpiDbDisplayCallingTree ();
+ break;
+
+ case CMD_TYPE:
+ AcpiDbDisplayObjectType (AcpiGbl_DbArgs[1]);
+ break;
+
+ case CMD_UNLOAD:
+ AcpiDbUnloadAcpiTable (AcpiGbl_DbArgs[1], AcpiGbl_DbArgs[2]);
+ break;
+
+ case CMD_EXIT:
+ case CMD_QUIT:
+ if (Op)
+ {
+ AcpiOsPrintf ("Method execution terminated\n");
+ return (AE_CTRL_TERMINATE);
+ }
+
+ if (!AcpiGbl_DbOutputToFile)
+ {
+ AcpiDbgLevel = ACPI_DEBUG_DEFAULT;
+ }
+
+ AcpiDbCloseDebugFile ();
+ AcpiGbl_DbTerminateThreads = TRUE;
+ return (AE_CTRL_TERMINATE);
+
+ case CMD_NOT_FOUND:
+ default:
+ AcpiOsPrintf ("Unknown Command\n");
+ return (AE_CTRL_TRUE);
+ }
+
+ if (ACPI_SUCCESS (Status))
+ {
+ Status = AE_CTRL_TRUE;
+ }
+
+ /* Add all commands that come here to the history buffer */
+
+ AcpiDbAddToHistory (InputBuffer);
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbExecuteThread
+ *
+ * PARAMETERS: Context - Not used
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Debugger execute thread. Waits for a command line, then
+ * simply dispatches it.
+ *
+ ******************************************************************************/
+
+void ACPI_SYSTEM_XFACE
+AcpiDbExecuteThread (
+ void *Context)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_STATUS MStatus;
+
+
+ while (Status != AE_CTRL_TERMINATE)
+ {
+ AcpiGbl_MethodExecuting = FALSE;
+ AcpiGbl_StepToNextCall = FALSE;
+
+ MStatus = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY);
+ if (ACPI_FAILURE (MStatus))
+ {
+ return;
+ }
+
+ Status = AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
+
+ MStatus = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
+ if (ACPI_FAILURE (MStatus))
+ {
+ return;
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbSingleThread
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Debugger execute thread. Waits for a command line, then
+ * simply dispatches it.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDbSingleThread (
+ void)
+{
+
+ AcpiGbl_MethodExecuting = FALSE;
+ AcpiGbl_StepToNextCall = FALSE;
+
+ (void) AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, NULL, NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbUserCommands
+ *
+ * PARAMETERS: Prompt - User prompt (depends on mode)
+ * Op - Current executing parse op
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Command line execution for the AML debugger. Commands are
+ * matched and dispatched here.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbUserCommands (
+ char Prompt,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ /* TBD: [Restructure] Need a separate command line buffer for step mode */
+
+ while (!AcpiGbl_DbTerminateThreads)
+ {
+ /* Force output to console until a command is entered */
+
+ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
+
+ /* Different prompt if method is executing */
+
+ if (!AcpiGbl_MethodExecuting)
+ {
+ AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
+ }
+ else
+ {
+ AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
+ }
+
+ /* Get the user input line */
+
+ (void) AcpiOsGetLine (AcpiGbl_DbLineBuf);
+
+ /* Check for single or multithreaded debug */
+
+ if (AcpiGbl_DebuggerConfiguration & DEBUGGER_MULTI_THREADED)
+ {
+ /*
+ * Signal the debug thread that we have a command to execute,
+ * and wait for the command to complete.
+ */
+ Status = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_READY);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+ else
+ {
+ /* Just call to the command line interpreter */
+
+ AcpiDbSingleThread ();
+ }
+ }
+
+ /*
+ * Only this thread (the original thread) should actually terminate the
+ * subsystem, because all the semaphores are deleted during termination
+ */
+ Status = AcpiTerminate ();
+ return (Status);
+}
+
+#endif /* ACPI_DEBUGGER */
+
diff --git a/sys/contrib/dev/acpica/dbstats.c b/sys/contrib/dev/acpica/dbstats.c
new file mode 100644
index 0000000..d7b2cc0
--- /dev/null
+++ b/sys/contrib/dev/acpica/dbstats.c
@@ -0,0 +1,621 @@
+/*******************************************************************************
+ *
+ * Module Name: dbstats - Generation and display of ACPI table statistics
+ * $Revision: 1.87 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdebug.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#ifdef ACPI_DEBUGGER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbstats")
+
+/* Local prototypes */
+
+static void
+AcpiDbCountNamespaceObjects (
+ void);
+
+static void
+AcpiDbEnumerateObject (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+static ACPI_STATUS
+AcpiDbClassifyOneObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue);
+
+#if defined ACPI_DBG_TRACK_ALLOCATIONS || defined ACPI_USE_LOCAL_CACHE
+static void
+AcpiDbListInfo (
+ ACPI_MEMORY_LIST *List);
+#endif
+
+
+/*
+ * Statistics subcommands
+ */
+static ARGUMENT_INFO AcpiDbStatTypes [] =
+{
+ {"ALLOCATIONS"},
+ {"OBJECTS"},
+ {"MEMORY"},
+ {"MISC"},
+ {"TABLES"},
+ {"SIZES"},
+ {"STACK"},
+ {NULL} /* Must be null terminated */
+};
+
+#define CMD_STAT_ALLOCATIONS 0
+#define CMD_STAT_OBJECTS 1
+#define CMD_STAT_MEMORY 2
+#define CMD_STAT_MISC 3
+#define CMD_STAT_TABLES 4
+#define CMD_STAT_SIZES 5
+#define CMD_STAT_STACK 6
+
+
+#if defined ACPI_DBG_TRACK_ALLOCATIONS || defined ACPI_USE_LOCAL_CACHE
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbListInfo
+ *
+ * PARAMETERS: List - Memory list/cache to be displayed
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display information about the input memory list or cache.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDbListInfo (
+ ACPI_MEMORY_LIST *List)
+{
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+ UINT32 Outstanding;
+#endif
+
+ AcpiOsPrintf ("\n%s\n", List->ListName);
+
+ /* MaxDepth > 0 indicates a cache object */
+
+ if (List->MaxDepth > 0)
+ {
+ AcpiOsPrintf (
+ " Cache: [Depth MaxD Avail Size] %8.2X %8.2X %8.2X %8.2X\n",
+ List->CurrentDepth,
+ List->MaxDepth,
+ List->MaxDepth - List->CurrentDepth,
+ (List->CurrentDepth * List->ObjectSize));
+ }
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+ if (List->MaxDepth > 0)
+ {
+ AcpiOsPrintf (
+ " Cache: [Requests Hits Misses ObjSize] %8.2X %8.2X %8.2X %8.2X\n",
+ List->Requests,
+ List->Hits,
+ List->Requests - List->Hits,
+ List->ObjectSize);
+ }
+
+ Outstanding = AcpiDbGetCacheInfo (List);
+
+ if (List->ObjectSize)
+ {
+ AcpiOsPrintf (
+ " Mem: [Alloc Free Max CurSize Outstanding] %8.2X %8.2X %8.2X %8.2X %8.2X\n",
+ List->TotalAllocated,
+ List->TotalFreed,
+ List->MaxOccupied,
+ Outstanding * List->ObjectSize,
+ Outstanding);
+ }
+ else
+ {
+ AcpiOsPrintf (
+ " Mem: [Alloc Free Max CurSize Outstanding Total] %8.2X %8.2X %8.2X %8.2X %8.2X %8.2X\n",
+ List->TotalAllocated,
+ List->TotalFreed,
+ List->MaxOccupied,
+ List->CurrentTotalSize,
+ Outstanding,
+ List->TotalSize);
+ }
+#endif
+}
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbEnumerateObject
+ *
+ * PARAMETERS: ObjDesc - Object to be counted
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Add this object to the global counts, by object type.
+ * Limited recursion handles subobjects and packages, and this
+ * is probably acceptable within the AML debugger only.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDbEnumerateObject (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ UINT32 i;
+
+
+ if (!ObjDesc)
+ {
+ return;
+ }
+
+ /* Enumerate this object first */
+
+ AcpiGbl_NumObjects++;
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) > ACPI_TYPE_NS_NODE_MAX)
+ {
+ AcpiGbl_ObjTypeCountMisc++;
+ }
+ else
+ {
+ AcpiGbl_ObjTypeCount [ACPI_GET_OBJECT_TYPE (ObjDesc)]++;
+ }
+
+ /* Count the sub-objects */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_PACKAGE:
+
+ for (i = 0; i < ObjDesc->Package.Count; i++)
+ {
+ AcpiDbEnumerateObject (ObjDesc->Package.Elements[i]);
+ }
+ break;
+
+ case ACPI_TYPE_DEVICE:
+
+ AcpiDbEnumerateObject (ObjDesc->Device.SystemNotify);
+ AcpiDbEnumerateObject (ObjDesc->Device.DeviceNotify);
+ AcpiDbEnumerateObject (ObjDesc->Device.Handler);
+ break;
+
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ if (AcpiNsGetSecondaryObject (ObjDesc))
+ {
+ AcpiGbl_ObjTypeCount [ACPI_TYPE_BUFFER_FIELD]++;
+ }
+ break;
+
+ case ACPI_TYPE_REGION:
+
+ AcpiGbl_ObjTypeCount [ACPI_TYPE_LOCAL_REGION_FIELD ]++;
+ AcpiDbEnumerateObject (ObjDesc->Region.Handler);
+ break;
+
+ case ACPI_TYPE_POWER:
+
+ AcpiDbEnumerateObject (ObjDesc->PowerResource.SystemNotify);
+ AcpiDbEnumerateObject (ObjDesc->PowerResource.DeviceNotify);
+ break;
+
+ case ACPI_TYPE_PROCESSOR:
+
+ AcpiDbEnumerateObject (ObjDesc->Processor.SystemNotify);
+ AcpiDbEnumerateObject (ObjDesc->Processor.DeviceNotify);
+ AcpiDbEnumerateObject (ObjDesc->Processor.Handler);
+ break;
+
+ case ACPI_TYPE_THERMAL:
+
+ AcpiDbEnumerateObject (ObjDesc->ThermalZone.SystemNotify);
+ AcpiDbEnumerateObject (ObjDesc->ThermalZone.DeviceNotify);
+ AcpiDbEnumerateObject (ObjDesc->ThermalZone.Handler);
+ break;
+
+ default:
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbClassifyOneObject
+ *
+ * PARAMETERS: Callback for WalkNamespace
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enumerate both the object descriptor (including subobjects) and
+ * the parent namespace node.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbClassifyOneObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ UINT32 Type;
+
+
+ AcpiGbl_NumNodes++;
+
+ Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+
+ AcpiDbEnumerateObject (ObjDesc);
+
+ Type = Node->Type;
+ if (Type > ACPI_TYPE_NS_NODE_MAX)
+ {
+ AcpiGbl_NodeTypeCountMisc++;
+ }
+ else
+ {
+ AcpiGbl_NodeTypeCount [Type]++;
+ }
+
+ return AE_OK;
+
+
+#ifdef ACPI_FUTURE_IMPLEMENTATION
+
+ /* TBD: These need to be counted during the initial parsing phase */
+
+ if (AcpiPsIsNamedOp (Op->Opcode))
+ {
+ NumNodes++;
+ }
+
+ if (IsMethod)
+ {
+ NumMethodElements++;
+ }
+
+ NumGrammarElements++;
+ Op = AcpiPsGetDepthNext (Root, Op);
+
+ SizeOfParseTree = (NumGrammarElements - NumMethodElements) *
+ (UINT32) sizeof (ACPI_PARSE_OBJECT);
+ SizeOfMethodTrees = NumMethodElements * (UINT32) sizeof (ACPI_PARSE_OBJECT);
+ SizeOfNodeEntries = NumNodes * (UINT32) sizeof (ACPI_NAMESPACE_NODE);
+ SizeOfAcpiObjects = NumNodes * (UINT32) sizeof (ACPI_OPERAND_OBJECT);
+#endif
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbCountNamespaceObjects
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Count and classify the entire namespace, including all
+ * namespace nodes and attached objects.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDbCountNamespaceObjects (
+ void)
+{
+ UINT32 i;
+
+
+ AcpiGbl_NumNodes = 0;
+ AcpiGbl_NumObjects = 0;
+
+ AcpiGbl_ObjTypeCountMisc = 0;
+ for (i = 0; i < (ACPI_TYPE_NS_NODE_MAX -1); i++)
+ {
+ AcpiGbl_ObjTypeCount [i] = 0;
+ AcpiGbl_NodeTypeCount [i] = 0;
+ }
+
+ (void) AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX, FALSE, AcpiDbClassifyOneObject, NULL, NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDisplayStatistics
+ *
+ * PARAMETERS: TypeArg - Subcommand
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Display various statistics
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbDisplayStatistics (
+ char *TypeArg)
+{
+ UINT32 i;
+ UINT32 Temp;
+
+
+ if (!TypeArg)
+ {
+ AcpiOsPrintf ("The following subcommands are available:\n ALLOCATIONS, OBJECTS, MEMORY, MISC, SIZES, TABLES\n");
+ return (AE_OK);
+ }
+
+ AcpiUtStrupr (TypeArg);
+ Temp = AcpiDbMatchArgument (TypeArg, AcpiDbStatTypes);
+ if (Temp == (UINT32) -1)
+ {
+ AcpiOsPrintf ("Invalid or unsupported argument\n");
+ return (AE_OK);
+ }
+
+
+ switch (Temp)
+ {
+ case CMD_STAT_ALLOCATIONS:
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+ AcpiUtDumpAllocationInfo ();
+#endif
+ break;
+
+ case CMD_STAT_TABLES:
+
+ AcpiOsPrintf ("ACPI Table Information (not implemented):\n\n");
+ break;
+
+ case CMD_STAT_OBJECTS:
+
+ AcpiDbCountNamespaceObjects ();
+
+ AcpiOsPrintf ("\nObjects defined in the current namespace:\n\n");
+
+ AcpiOsPrintf ("%16.16s %10.10s %10.10s\n",
+ "ACPI_TYPE", "NODES", "OBJECTS");
+
+ for (i = 0; i < ACPI_TYPE_NS_NODE_MAX; i++)
+ {
+ AcpiOsPrintf ("%16.16s % 10ld% 10ld\n", AcpiUtGetTypeName (i),
+ AcpiGbl_NodeTypeCount [i], AcpiGbl_ObjTypeCount [i]);
+ }
+ AcpiOsPrintf ("%16.16s % 10ld% 10ld\n", "Misc/Unknown",
+ AcpiGbl_NodeTypeCountMisc, AcpiGbl_ObjTypeCountMisc);
+
+ AcpiOsPrintf ("%16.16s % 10ld% 10ld\n", "TOTALS:",
+ AcpiGbl_NumNodes, AcpiGbl_NumObjects);
+ break;
+
+ case CMD_STAT_MEMORY:
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+ AcpiOsPrintf ("\n----Object Statistics (all in hex)---------\n");
+
+ AcpiDbListInfo (AcpiGbl_GlobalList);
+ AcpiDbListInfo (AcpiGbl_NsNodeList);
+#endif
+
+#ifdef ACPI_USE_LOCAL_CACHE
+ AcpiOsPrintf ("\n----Cache Statistics (all in hex)----------\n");
+ AcpiDbListInfo (AcpiGbl_OperandCache);
+ AcpiDbListInfo (AcpiGbl_PsNodeCache);
+ AcpiDbListInfo (AcpiGbl_PsNodeExtCache);
+ AcpiDbListInfo (AcpiGbl_StateCache);
+#endif
+
+ break;
+
+ case CMD_STAT_MISC:
+
+ AcpiOsPrintf ("\nMiscellaneous Statistics:\n\n");
+ AcpiOsPrintf ("Calls to AcpiPsFind:.. ........% 7ld\n",
+ AcpiGbl_PsFindCount);
+ AcpiOsPrintf ("Calls to AcpiNsLookup:..........% 7ld\n",
+ AcpiGbl_NsLookupCount);
+
+ AcpiOsPrintf ("\n");
+
+ AcpiOsPrintf ("Mutex usage:\n\n");
+ for (i = 0; i < ACPI_NUM_MUTEX; i++)
+ {
+ AcpiOsPrintf ("%-28s: % 7ld\n",
+ AcpiUtGetMutexName (i), AcpiGbl_MutexInfo[i].UseCount);
+ }
+ break;
+
+
+ case CMD_STAT_SIZES:
+
+ AcpiOsPrintf ("\nInternal object sizes:\n\n");
+
+ AcpiOsPrintf ("Common %3d\n", sizeof (ACPI_OBJECT_COMMON));
+ AcpiOsPrintf ("Number %3d\n", sizeof (ACPI_OBJECT_INTEGER));
+ AcpiOsPrintf ("String %3d\n", sizeof (ACPI_OBJECT_STRING));
+ AcpiOsPrintf ("Buffer %3d\n", sizeof (ACPI_OBJECT_BUFFER));
+ AcpiOsPrintf ("Package %3d\n", sizeof (ACPI_OBJECT_PACKAGE));
+ AcpiOsPrintf ("BufferField %3d\n", sizeof (ACPI_OBJECT_BUFFER_FIELD));
+ AcpiOsPrintf ("Device %3d\n", sizeof (ACPI_OBJECT_DEVICE));
+ AcpiOsPrintf ("Event %3d\n", sizeof (ACPI_OBJECT_EVENT));
+ AcpiOsPrintf ("Method %3d\n", sizeof (ACPI_OBJECT_METHOD));
+ AcpiOsPrintf ("Mutex %3d\n", sizeof (ACPI_OBJECT_MUTEX));
+ AcpiOsPrintf ("Region %3d\n", sizeof (ACPI_OBJECT_REGION));
+ AcpiOsPrintf ("PowerResource %3d\n", sizeof (ACPI_OBJECT_POWER_RESOURCE));
+ AcpiOsPrintf ("Processor %3d\n", sizeof (ACPI_OBJECT_PROCESSOR));
+ AcpiOsPrintf ("ThermalZone %3d\n", sizeof (ACPI_OBJECT_THERMAL_ZONE));
+ AcpiOsPrintf ("RegionField %3d\n", sizeof (ACPI_OBJECT_REGION_FIELD));
+ AcpiOsPrintf ("BankField %3d\n", sizeof (ACPI_OBJECT_BANK_FIELD));
+ AcpiOsPrintf ("IndexField %3d\n", sizeof (ACPI_OBJECT_INDEX_FIELD));
+ AcpiOsPrintf ("Reference %3d\n", sizeof (ACPI_OBJECT_REFERENCE));
+ AcpiOsPrintf ("Notify %3d\n", sizeof (ACPI_OBJECT_NOTIFY_HANDLER));
+ AcpiOsPrintf ("AddressSpace %3d\n", sizeof (ACPI_OBJECT_ADDR_HANDLER));
+ AcpiOsPrintf ("Extra %3d\n", sizeof (ACPI_OBJECT_EXTRA));
+ AcpiOsPrintf ("Data %3d\n", sizeof (ACPI_OBJECT_DATA));
+
+ AcpiOsPrintf ("\n");
+
+ AcpiOsPrintf ("ParseObject %3d\n", sizeof (ACPI_PARSE_OBJ_COMMON));
+ AcpiOsPrintf ("ParseObjectNamed %3d\n", sizeof (ACPI_PARSE_OBJ_NAMED));
+ AcpiOsPrintf ("ParseObjectAsl %3d\n", sizeof (ACPI_PARSE_OBJ_ASL));
+ AcpiOsPrintf ("OperandObject %3d\n", sizeof (ACPI_OPERAND_OBJECT));
+ AcpiOsPrintf ("NamespaceNode %3d\n", sizeof (ACPI_NAMESPACE_NODE));
+
+ break;
+
+
+ case CMD_STAT_STACK:
+#if defined(ACPI_DEBUG_OUTPUT)
+
+ Temp = (UINT32) (AcpiGbl_EntryStackPointer - AcpiGbl_LowestStackPointer);
+
+ AcpiOsPrintf ("\nSubsystem Stack Usage:\n\n");
+ AcpiOsPrintf ("Entry Stack Pointer %X\n", AcpiGbl_EntryStackPointer);
+ AcpiOsPrintf ("Lowest Stack Pointer %X\n", AcpiGbl_LowestStackPointer);
+ AcpiOsPrintf ("Stack Use %X (%d)\n", Temp, Temp);
+ AcpiOsPrintf ("Deepest Procedure Nesting %d\n", AcpiGbl_DeepestNesting);
+#endif
+ break;
+
+ default:
+ break;
+ }
+
+ AcpiOsPrintf ("\n");
+ return (AE_OK);
+}
+
+#endif /* ACPI_DEBUGGER */
diff --git a/sys/contrib/dev/acpica/dbutils.c b/sys/contrib/dev/acpica/dbutils.c
new file mode 100644
index 0000000..dd1e67b
--- /dev/null
+++ b/sys/contrib/dev/acpica/dbutils.c
@@ -0,0 +1,596 @@
+/*******************************************************************************
+ *
+ * Module Name: dbutils - AML debugger utilities
+ * $Revision: 1.83 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdebug.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+
+#ifdef ACPI_DEBUGGER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbutils")
+
+/* Local prototypes */
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+ACPI_STATUS
+AcpiDbSecondPassParse (
+ ACPI_PARSE_OBJECT *Root);
+
+void
+AcpiDbDumpBuffer (
+ UINT32 Address);
+#endif
+
+static char *Converter = "0123456789ABCDEF";
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbMatchArgument
+ *
+ * PARAMETERS: UserArgument - User command line
+ * Arguments - Array of commands to match against
+ *
+ * RETURN: Index into command array or ACPI_TYPE_NOT_FOUND if not found
+ *
+ * DESCRIPTION: Search command array for a command match
+ *
+ ******************************************************************************/
+
+ACPI_OBJECT_TYPE
+AcpiDbMatchArgument (
+ char *UserArgument,
+ ARGUMENT_INFO *Arguments)
+{
+ UINT32 i;
+
+
+ if (!UserArgument || UserArgument[0] == 0)
+ {
+ return (ACPI_TYPE_NOT_FOUND);
+ }
+
+ for (i = 0; Arguments[i].Name; i++)
+ {
+ if (ACPI_STRSTR (Arguments[i].Name, UserArgument) == Arguments[i].Name)
+ {
+ return (i);
+ }
+ }
+
+ /* Argument not recognized */
+
+ return (ACPI_TYPE_NOT_FOUND);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbSetOutputDestination
+ *
+ * PARAMETERS: OutputFlags - Current flags word
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Set the current destination for debugger output. Also sets
+ * the debug output level accordingly.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbSetOutputDestination (
+ UINT32 OutputFlags)
+{
+
+ AcpiGbl_DbOutputFlags = (UINT8) OutputFlags;
+
+ if ((OutputFlags & ACPI_DB_REDIRECTABLE_OUTPUT) && AcpiGbl_DbOutputToFile)
+ {
+ AcpiDbgLevel = AcpiGbl_DbDebugLevel;
+ }
+ else
+ {
+ AcpiDbgLevel = AcpiGbl_DbConsoleDebugLevel;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDumpExternalObject
+ *
+ * PARAMETERS: ObjDesc - External ACPI object to dump
+ * Level - Nesting level.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump the contents of an ACPI external object
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDumpExternalObject (
+ ACPI_OBJECT *ObjDesc,
+ UINT32 Level)
+{
+ UINT32 i;
+
+
+ if (!ObjDesc)
+ {
+ AcpiOsPrintf ("[Null Object]\n");
+ return;
+ }
+
+ for (i = 0; i < Level; i++)
+ {
+ AcpiOsPrintf (" ");
+ }
+
+ switch (ObjDesc->Type)
+ {
+ case ACPI_TYPE_ANY:
+
+ AcpiOsPrintf ("[Object Reference] = %p", ObjDesc->Reference.Handle);
+ AcpiDmDisplayInternalObject (ObjDesc->Reference.Handle, NULL);
+ break;
+
+
+ case ACPI_TYPE_INTEGER:
+
+ AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ AcpiOsPrintf ("[String] Length %.2X = ", ObjDesc->String.Length);
+ for (i = 0; i < ObjDesc->String.Length; i++)
+ {
+ AcpiOsPrintf ("%c", ObjDesc->String.Pointer[i]);
+ }
+ AcpiOsPrintf ("\n");
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
+ if (ObjDesc->Buffer.Length)
+ {
+ AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
+ ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
+ }
+ else
+ {
+ AcpiOsPrintf ("\n");
+ }
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ AcpiOsPrintf ("[Package] Contains %d Elements:\n",
+ ObjDesc->Package.Count);
+
+ for (i = 0; i < ObjDesc->Package.Count; i++)
+ {
+ AcpiDbDumpExternalObject (&ObjDesc->Package.Elements[i], Level+1);
+ }
+ break;
+
+
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ AcpiOsPrintf ("[Object Reference] = %p", ObjDesc->Reference.Handle);
+ AcpiDmDisplayInternalObject (ObjDesc->Reference.Handle, NULL);
+ break;
+
+
+ case ACPI_TYPE_PROCESSOR:
+
+ AcpiOsPrintf ("[Processor]\n");
+ break;
+
+
+ case ACPI_TYPE_POWER:
+
+ AcpiOsPrintf ("[Power Resource]\n");
+ break;
+
+
+ default:
+
+ AcpiOsPrintf ("[Unknown Type] %X\n", ObjDesc->Type);
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbPrepNamestring
+ *
+ * PARAMETERS: Name - String to prepare
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Translate all forward slashes and dots to backslashes.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbPrepNamestring (
+ char *Name)
+{
+
+ if (!Name)
+ {
+ return;
+ }
+
+ AcpiUtStrupr (Name);
+
+ /* Convert a leading forward slash to a backslash */
+
+ if (*Name == '/')
+ {
+ *Name = '\\';
+ }
+
+ /* Ignore a leading backslash, this is the root prefix */
+
+ if (*Name == '\\')
+ {
+ Name++;
+ }
+
+ /* Convert all slash path separators to dots */
+
+ while (*Name)
+ {
+ if ((*Name == '/') ||
+ (*Name == '\\'))
+ {
+ *Name = '.';
+ }
+
+ Name++;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbLocalNsLookup
+ *
+ * PARAMETERS: Name - Name to lookup
+ *
+ * RETURN: Pointer to a namespace node, null on failure
+ *
+ * DESCRIPTION: Lookup a name in the ACPI namespace
+ *
+ * Note: Currently begins search from the root. Could be enhanced to use
+ * the current prefix (scope) node as the search beginning point.
+ *
+ ******************************************************************************/
+
+ACPI_NAMESPACE_NODE *
+AcpiDbLocalNsLookup (
+ char *Name)
+{
+ char *InternalPath;
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node = NULL;
+
+
+ AcpiDbPrepNamestring (Name);
+
+ /* Build an internal namestring */
+
+ Status = AcpiNsInternalizeName (Name, &InternalPath);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Invalid namestring: %s\n", Name);
+ return (NULL);
+ }
+
+ /*
+ * Lookup the name.
+ * (Uses root node as the search starting point)
+ */
+ Status = AcpiNsLookup (NULL, InternalPath, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not locate name: %s, %s\n",
+ Name, AcpiFormatException (Status));
+ }
+
+ ACPI_FREE (InternalPath);
+ return (Node);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbUInt32ToHexString
+ *
+ * PARAMETERS: Value - The value to be converted to string
+ * Buffer - Buffer for result (not less than 11 bytes)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Convert the unsigned 32-bit value to the hexadecimal image
+ *
+ * NOTE: It is the caller's responsibility to ensure that the length of buffer
+ * is sufficient.
+ *
+ ******************************************************************************/
+
+void
+AcpiDbUInt32ToHexString (
+ UINT32 Value,
+ char *Buffer)
+{
+ UINT8 i;
+
+
+ if (Value == 0)
+ {
+ ACPI_STRCPY (Buffer, "0");
+ return;
+ }
+
+ ACPI_STRCPY (Buffer, "0x");
+ Buffer[10] = '\0';
+
+ for (i = 9; i > 1; i--)
+ {
+ Buffer[i] = Converter [Value & 0x0F];
+ Value = Value >> 4;
+ }
+}
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbSecondPassParse
+ *
+ * PARAMETERS: Root - Root of the parse tree
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Second pass parse of the ACPI tables. We need to wait until
+ * second pass to parse the control methods
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbSecondPassParse (
+ ACPI_PARSE_OBJECT *Root)
+{
+ ACPI_PARSE_OBJECT *Op = Root;
+ ACPI_PARSE_OBJECT *Method;
+ ACPI_PARSE_OBJECT *SearchOp;
+ ACPI_PARSE_OBJECT *StartOp;
+ ACPI_STATUS Status = AE_OK;
+ UINT32 BaseAmlOffset;
+ ACPI_WALK_STATE *WalkState;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ AcpiOsPrintf ("Pass two parse ....\n");
+
+ while (Op)
+ {
+ if (Op->Common.AmlOpcode == AML_METHOD_OP)
+ {
+ Method = Op;
+
+ /* Create a new walk state for the parse */
+
+ WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
+ if (!WalkState)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ /* Init the Walk State */
+
+ WalkState->ParserState.Aml =
+ WalkState->ParserState.AmlStart = Method->Named.Data;
+ WalkState->ParserState.AmlEnd =
+ WalkState->ParserState.PkgEnd = Method->Named.Data +
+ Method->Named.Length;
+ WalkState->ParserState.StartScope = Op;
+
+ WalkState->DescendingCallback = AcpiDsLoad1BeginOp;
+ WalkState->AscendingCallback = AcpiDsLoad1EndOp;
+
+ /* Perform the AML parse */
+
+ Status = AcpiPsParseAml (WalkState);
+
+ BaseAmlOffset = (Method->Common.Value.Arg)->Common.AmlOffset + 1;
+ StartOp = (Method->Common.Value.Arg)->Common.Next;
+ SearchOp = StartOp;
+
+ while (SearchOp)
+ {
+ SearchOp->Common.AmlOffset += BaseAmlOffset;
+ SearchOp = AcpiPsGetDepthNext (StartOp, SearchOp);
+ }
+ }
+
+ if (Op->Common.AmlOpcode == AML_REGION_OP)
+ {
+ /* TBD: [Investigate] this isn't quite the right thing to do! */
+ /*
+ *
+ * Method = (ACPI_DEFERRED_OP *) Op;
+ * Status = AcpiPsParseAml (Op, Method->Body, Method->BodyLength);
+ */
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+
+ Op = AcpiPsGetDepthNext (Root, Op);
+ }
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbDumpBuffer
+ *
+ * PARAMETERS: Address - Pointer to the buffer
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print a portion of a buffer
+ *
+ ******************************************************************************/
+
+void
+AcpiDbDumpBuffer (
+ UINT32 Address)
+{
+
+ AcpiOsPrintf ("\nLocation %X:\n", Address);
+
+ AcpiDbgLevel |= ACPI_LV_TABLES;
+ AcpiUtDumpBuffer (ACPI_TO_POINTER (Address), 64, DB_BYTE_DISPLAY,
+ ACPI_UINT32_MAX);
+}
+#endif
+
+#endif /* ACPI_DEBUGGER */
+
+
diff --git a/sys/contrib/dev/acpica/dbxface.c b/sys/contrib/dev/acpica/dbxface.c
new file mode 100644
index 0000000..db2786b
--- /dev/null
+++ b/sys/contrib/dev/acpica/dbxface.c
@@ -0,0 +1,612 @@
+/*******************************************************************************
+ *
+ * Module Name: dbxface - AML Debugger external interfaces
+ * $Revision: 1.78 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdebug.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+
+#ifdef ACPI_DEBUGGER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbxface")
+
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDbStartCommand (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op);
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+void
+AcpiDbMethodEnd (
+ ACPI_WALK_STATE *WalkState);
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbStartCommand
+ *
+ * PARAMETERS: WalkState - Current walk
+ * Op - Current executing Op, from AML interpreter
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enter debugger command loop
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDbStartCommand (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status;
+
+
+ /* TBD: [Investigate] are there namespace locking issues here? */
+
+ /* AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE); */
+
+ /* Go into the command loop and await next user command */
+
+
+ AcpiGbl_MethodExecuting = TRUE;
+ Status = AE_CTRL_TRUE;
+ while (Status == AE_CTRL_TRUE)
+ {
+ if (AcpiGbl_DebuggerConfiguration == DEBUGGER_MULTI_THREADED)
+ {
+ /* Handshake with the front-end that gets user command lines */
+
+ Status = AcpiUtReleaseMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+ else
+ {
+ /* Single threaded, we must get a command line ourselves */
+
+ /* Force output to console until a command is entered */
+
+ AcpiDbSetOutputDestination (ACPI_DB_CONSOLE_OUTPUT);
+
+ /* Different prompt if method is executing */
+
+ if (!AcpiGbl_MethodExecuting)
+ {
+ AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_COMMAND_PROMPT);
+ }
+ else
+ {
+ AcpiOsPrintf ("%1c ", ACPI_DEBUGGER_EXECUTE_PROMPT);
+ }
+
+ /* Get the user input line */
+
+ (void) AcpiOsGetLine (AcpiGbl_DbLineBuf);
+ }
+
+ Status = AcpiDbCommandDispatch (AcpiGbl_DbLineBuf, WalkState, Op);
+ }
+
+ /* AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE); */
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbSingleStep
+ *
+ * PARAMETERS: WalkState - Current walk
+ * Op - Current executing op (from aml interpreter)
+ * OpcodeClass - Class of the current AML Opcode
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Called just before execution of an AML opcode.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbSingleStep (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 OpcodeClass)
+{
+ ACPI_PARSE_OBJECT *Next;
+ ACPI_STATUS Status = AE_OK;
+ UINT32 OriginalDebugLevel;
+ ACPI_PARSE_OBJECT *DisplayOp;
+ ACPI_PARSE_OBJECT *ParentOp;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Check the abort flag */
+
+ if (AcpiGbl_AbortMethod)
+ {
+ AcpiGbl_AbortMethod = FALSE;
+ return (AE_ABORT_METHOD);
+ }
+
+ /* Check for single-step breakpoint */
+
+ if (WalkState->MethodBreakpoint &&
+ (WalkState->MethodBreakpoint <= Op->Common.AmlOffset))
+ {
+ /* Check if the breakpoint has been reached or passed */
+ /* Hit the breakpoint, resume single step, reset breakpoint */
+
+ AcpiOsPrintf ("***Break*** at AML offset %X\n", Op->Common.AmlOffset);
+ AcpiGbl_CmSingleStep = TRUE;
+ AcpiGbl_StepToNextCall = FALSE;
+ WalkState->MethodBreakpoint = 0;
+ }
+
+ /* Check for user breakpoint (Must be on exact Aml offset) */
+
+ else if (WalkState->UserBreakpoint &&
+ (WalkState->UserBreakpoint == Op->Common.AmlOffset))
+ {
+ AcpiOsPrintf ("***UserBreakpoint*** at AML offset %X\n",
+ Op->Common.AmlOffset);
+ AcpiGbl_CmSingleStep = TRUE;
+ AcpiGbl_StepToNextCall = FALSE;
+ WalkState->MethodBreakpoint = 0;
+ }
+
+ /*
+ * Check if this is an opcode that we are interested in --
+ * namely, opcodes that have arguments
+ */
+ if (Op->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
+ {
+ return (AE_OK);
+ }
+
+ switch (OpcodeClass)
+ {
+ case AML_CLASS_UNKNOWN:
+ case AML_CLASS_ARGUMENT: /* constants, literals, etc. do nothing */
+ return (AE_OK);
+
+ default:
+ /* All other opcodes -- continue */
+ break;
+ }
+
+ /*
+ * Under certain debug conditions, display this opcode and its operands
+ */
+ if ((AcpiGbl_DbOutputToFile) ||
+ (AcpiGbl_CmSingleStep) ||
+ (AcpiDbgLevel & ACPI_LV_PARSE))
+ {
+ if ((AcpiGbl_DbOutputToFile) ||
+ (AcpiDbgLevel & ACPI_LV_PARSE))
+ {
+ AcpiOsPrintf ("\n[AmlDebug] Next AML Opcode to execute:\n");
+ }
+
+ /*
+ * Display this op (and only this op - zero out the NEXT field
+ * temporarily, and disable parser trace output for the duration of
+ * the display because we don't want the extraneous debug output)
+ */
+ OriginalDebugLevel = AcpiDbgLevel;
+ AcpiDbgLevel &= ~(ACPI_LV_PARSE | ACPI_LV_FUNCTIONS);
+ Next = Op->Common.Next;
+ Op->Common.Next = NULL;
+
+
+ DisplayOp = Op;
+ ParentOp = Op->Common.Parent;
+ if (ParentOp)
+ {
+ if ((WalkState->ControlState) &&
+ (WalkState->ControlState->Common.State ==
+ ACPI_CONTROL_PREDICATE_EXECUTING))
+ {
+ /*
+ * We are executing the predicate of an IF or WHILE statement
+ * Search upwards for the containing IF or WHILE so that the
+ * entire predicate can be displayed.
+ */
+ while (ParentOp)
+ {
+ if ((ParentOp->Common.AmlOpcode == AML_IF_OP) ||
+ (ParentOp->Common.AmlOpcode == AML_WHILE_OP))
+ {
+ DisplayOp = ParentOp;
+ break;
+ }
+ ParentOp = ParentOp->Common.Parent;
+ }
+ }
+ else
+ {
+ while (ParentOp)
+ {
+ if ((ParentOp->Common.AmlOpcode == AML_IF_OP) ||
+ (ParentOp->Common.AmlOpcode == AML_ELSE_OP) ||
+ (ParentOp->Common.AmlOpcode == AML_SCOPE_OP) ||
+ (ParentOp->Common.AmlOpcode == AML_METHOD_OP) ||
+ (ParentOp->Common.AmlOpcode == AML_WHILE_OP))
+ {
+ break;
+ }
+ DisplayOp = ParentOp;
+ ParentOp = ParentOp->Common.Parent;
+ }
+ }
+ }
+
+ /* Now we can display it */
+
+#ifdef ACPI_DISASSEMBLER
+ AcpiDmDisassemble (WalkState, DisplayOp, ACPI_UINT32_MAX);
+#endif
+
+ if ((Op->Common.AmlOpcode == AML_IF_OP) ||
+ (Op->Common.AmlOpcode == AML_WHILE_OP))
+ {
+ if (WalkState->ControlState->Common.Value)
+ {
+ AcpiOsPrintf ("Predicate = [True], IF block was executed\n");
+ }
+ else
+ {
+ AcpiOsPrintf ("Predicate = [False], Skipping IF block\n");
+ }
+ }
+ else if (Op->Common.AmlOpcode == AML_ELSE_OP)
+ {
+ AcpiOsPrintf ("Predicate = [False], ELSE block was executed\n");
+ }
+
+ /* Restore everything */
+
+ Op->Common.Next = Next;
+ AcpiOsPrintf ("\n");
+ if ((AcpiGbl_DbOutputToFile) ||
+ (AcpiDbgLevel & ACPI_LV_PARSE))
+ {
+ AcpiOsPrintf ("\n");
+ }
+ AcpiDbgLevel = OriginalDebugLevel;
+ }
+
+ /* If we are not single stepping, just continue executing the method */
+
+ if (!AcpiGbl_CmSingleStep)
+ {
+ return (AE_OK);
+ }
+
+ /*
+ * If we are executing a step-to-call command,
+ * Check if this is a method call.
+ */
+ if (AcpiGbl_StepToNextCall)
+ {
+ if (Op->Common.AmlOpcode != AML_INT_METHODCALL_OP)
+ {
+ /* Not a method call, just keep executing */
+
+ return (AE_OK);
+ }
+
+ /* Found a method call, stop executing */
+
+ AcpiGbl_StepToNextCall = FALSE;
+ }
+
+ /*
+ * If the next opcode is a method call, we will "step over" it
+ * by default.
+ */
+ if (Op->Common.AmlOpcode == AML_INT_METHODCALL_OP)
+ {
+ /* Force no more single stepping while executing called method */
+
+ AcpiGbl_CmSingleStep = FALSE;
+
+ /*
+ * Set the breakpoint on/before the call, it will stop execution
+ * as soon as we return
+ */
+ WalkState->MethodBreakpoint = 1; /* Must be non-zero! */
+ }
+
+
+ Status = AcpiDbStartCommand (WalkState, Op);
+
+ /* User commands complete, continue execution of the interrupted method */
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbInitialize
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Init and start debugger
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDbInitialize (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ /* Init globals */
+
+ AcpiGbl_DbBuffer = NULL;
+ AcpiGbl_DbFilename = NULL;
+ AcpiGbl_DbOutputToFile = FALSE;
+
+ AcpiGbl_DbDebugLevel = ACPI_LV_VERBOSITY2;
+ AcpiGbl_DbConsoleDebugLevel = ACPI_NORMAL_DEFAULT | ACPI_LV_TABLES;
+ AcpiGbl_DbOutputFlags = ACPI_DB_CONSOLE_OUTPUT;
+
+ AcpiGbl_DbOpt_tables = FALSE;
+ AcpiGbl_DbOpt_stats = FALSE;
+#ifdef ACPI_DISASSEMBLER
+ AcpiGbl_DbOpt_disasm = FALSE;
+ AcpiGbl_DbOpt_verbose = TRUE;
+#endif
+ AcpiGbl_DbOpt_ini_methods = TRUE;
+
+ AcpiGbl_DbBuffer = AcpiOsAllocate (ACPI_DEBUG_BUFFER_SIZE);
+ if (!AcpiGbl_DbBuffer)
+ {
+ return (AE_NO_MEMORY);
+ }
+ ACPI_MEMSET (AcpiGbl_DbBuffer, 0, ACPI_DEBUG_BUFFER_SIZE);
+
+ /* Initial scope is the root */
+
+ AcpiGbl_DbScopeBuf [0] = '\\';
+ AcpiGbl_DbScopeBuf [1] = 0;
+ AcpiGbl_DbScopeNode = AcpiGbl_RootNode;
+
+ /*
+ * If configured for multi-thread support, the debug executor runs in
+ * a separate thread so that the front end can be in another address
+ * space, environment, or even another machine.
+ */
+ if (AcpiGbl_DebuggerConfiguration & DEBUGGER_MULTI_THREADED)
+ {
+ /* These were created with one unit, grab it */
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_COMPLETE);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not get debugger mutex\n");
+ return (Status);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_DEBUG_CMD_READY);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not get debugger mutex\n");
+ return (Status);
+ }
+
+ /* Create the debug execution thread to execute commands */
+
+ Status = AcpiOsExecute (OSL_DEBUGGER_THREAD, AcpiDbExecuteThread, NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not start debugger thread\n");
+ return (Status);
+ }
+ }
+
+#ifdef ACPI_DISASSEMBLER
+ if (!AcpiGbl_DbOpt_verbose)
+ {
+ AcpiGbl_DbOpt_disasm = TRUE;
+ AcpiGbl_DbOpt_stats = FALSE;
+ }
+#endif
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbTerminate
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Stop debugger
+ *
+ ******************************************************************************/
+
+void
+AcpiDbTerminate (
+ void)
+{
+
+ if (AcpiGbl_DbTablePtr)
+ {
+ AcpiOsFree (AcpiGbl_DbTablePtr);
+ }
+ if (AcpiGbl_DbBuffer)
+ {
+ AcpiOsFree (AcpiGbl_DbBuffer);
+ }
+}
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDbMethodEnd
+ *
+ * PARAMETERS: WalkState - Current walk
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Called at method termination
+ *
+ ******************************************************************************/
+
+void
+AcpiDbMethodEnd (
+ ACPI_WALK_STATE *WalkState)
+{
+
+ if (!AcpiGbl_CmSingleStep)
+ {
+ return;
+ }
+
+ AcpiOsPrintf ("<Method Terminating>\n");
+
+ AcpiDbStartCommand (WalkState, NULL);
+}
+#endif
+
+#endif /* ACPI_DEBUGGER */
diff --git a/sys/contrib/dev/acpica/dmbuffer.c b/sys/contrib/dev/acpica/dmbuffer.c
new file mode 100644
index 0000000..5540220
--- /dev/null
+++ b/sys/contrib/dev/acpica/dmbuffer.c
@@ -0,0 +1,555 @@
+/*******************************************************************************
+ *
+ * Module Name: dmbuffer - AML disassembler, buffer and string support
+ * $Revision: 1.25 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdisasm.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#ifdef ACPI_DISASSEMBLER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dmbuffer")
+
+/* Local prototypes */
+
+static void
+AcpiDmUnicode (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDisasmByteList
+ *
+ * PARAMETERS: Level - Current source code indentation level
+ * ByteData - Pointer to the byte list
+ * ByteCount - Length of the byte list
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump an AML "ByteList" in Hex format. 8 bytes per line, prefixed
+ * with the hex buffer offset.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDisasmByteList (
+ UINT32 Level,
+ UINT8 *ByteData,
+ UINT32 ByteCount)
+{
+ UINT32 i;
+
+
+ if (!ByteCount)
+ {
+ return;
+ }
+
+ /* Dump the byte list */
+
+ for (i = 0; i < ByteCount; i++)
+ {
+ /* New line every 8 bytes */
+
+ if (((i % 8) == 0) && (i < ByteCount))
+ {
+ if (i > 0)
+ {
+ AcpiOsPrintf ("\n");
+ }
+
+ AcpiDmIndent (Level);
+ if (ByteCount > 7)
+ {
+ AcpiOsPrintf ("/* %04X */ ", i);
+ }
+ }
+
+ AcpiOsPrintf ("0x%2.2X", (UINT32) ByteData[i]);
+
+ /* Add comma if there are more bytes to display */
+
+ if (i < (ByteCount -1))
+ {
+ AcpiOsPrintf (", ");
+ }
+ }
+
+ if (Level)
+ {
+ AcpiOsPrintf ("\n");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmByteList
+ *
+ * PARAMETERS: Info - Parse tree walk info
+ * Op - Byte list op
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump a buffer byte list, handling the various types of buffers.
+ * Buffer type must be already set in the Op DisasmOpcode.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmByteList (
+ ACPI_OP_WALK_INFO *Info,
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT8 *ByteData;
+ UINT32 ByteCount;
+
+
+ ByteData = Op->Named.Data;
+ ByteCount = (UINT32) Op->Common.Value.Integer;
+
+ /*
+ * The byte list belongs to a buffer, and can be produced by either
+ * a ResourceTemplate, Unicode, quoted string, or a plain byte list.
+ */
+ switch (Op->Common.Parent->Common.DisasmOpcode)
+ {
+ case ACPI_DASM_RESOURCE:
+
+ AcpiDmResourceTemplate (Info, Op->Common.Parent, ByteData, ByteCount);
+ break;
+
+ case ACPI_DASM_STRING:
+
+ AcpiDmIndent (Info->Level);
+ AcpiUtPrintString ((char *) ByteData, ACPI_UINT8_MAX);
+ AcpiOsPrintf ("\n");
+ break;
+
+ case ACPI_DASM_UNICODE:
+
+ AcpiDmUnicode (Op);
+ break;
+
+ case ACPI_DASM_BUFFER:
+ default:
+
+ /*
+ * Not a resource, string, or unicode string.
+ * Just dump the buffer
+ */
+ AcpiDmDisasmByteList (Info->Level, ByteData, ByteCount);
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmIsUnicodeBuffer
+ *
+ * PARAMETERS: Op - Buffer Object to be examined
+ *
+ * RETURN: TRUE if buffer contains a UNICODE string
+ *
+ * DESCRIPTION: Determine if a buffer Op contains a Unicode string
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiDmIsUnicodeBuffer (
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT8 *ByteData;
+ UINT32 ByteCount;
+ UINT32 WordCount;
+ ACPI_PARSE_OBJECT *SizeOp;
+ ACPI_PARSE_OBJECT *NextOp;
+ ACPI_NATIVE_UINT i;
+
+
+ /* Buffer size is the buffer argument */
+
+ SizeOp = Op->Common.Value.Arg;
+
+ /* Next, the initializer byte list to examine */
+
+ NextOp = SizeOp->Common.Next;
+ if (!NextOp)
+ {
+ return (FALSE);
+ }
+
+ /* Extract the byte list info */
+
+ ByteData = NextOp->Named.Data;
+ ByteCount = (UINT32) NextOp->Common.Value.Integer;
+ WordCount = ACPI_DIV_2 (ByteCount);
+
+ /*
+ * Unicode string must have an even number of bytes and last
+ * word must be zero
+ */
+ if ((!ByteCount) ||
+ (ByteCount < 4) ||
+ (ByteCount & 1) ||
+ ((UINT16 *) (void *) ByteData)[WordCount - 1] != 0)
+ {
+ return (FALSE);
+ }
+
+ /* For each word, 1st byte must be ascii, 2nd byte must be zero */
+
+ for (i = 0; i < (ByteCount - 2); i += 2)
+ {
+ if ((!ACPI_IS_PRINT (ByteData[i])) ||
+ (ByteData[i + 1] != 0))
+ {
+ return (FALSE);
+ }
+ }
+
+ /* Ignore the Size argument in the disassembly of this buffer op */
+
+ SizeOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+ return (TRUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmIsStringBuffer
+ *
+ * PARAMETERS: Op - Buffer Object to be examined
+ *
+ * RETURN: TRUE if buffer contains a ASCII string, FALSE otherwise
+ *
+ * DESCRIPTION: Determine if a buffer Op contains a ASCII string
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiDmIsStringBuffer (
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT8 *ByteData;
+ UINT32 ByteCount;
+ ACPI_PARSE_OBJECT *SizeOp;
+ ACPI_PARSE_OBJECT *NextOp;
+ UINT32 i;
+
+
+ /* Buffer size is the buffer argument */
+
+ SizeOp = Op->Common.Value.Arg;
+
+ /* Next, the initializer byte list to examine */
+
+ NextOp = SizeOp->Common.Next;
+ if (!NextOp)
+ {
+ return (FALSE);
+ }
+
+ /* Extract the byte list info */
+
+ ByteData = NextOp->Named.Data;
+ ByteCount = (UINT32) NextOp->Common.Value.Integer;
+
+ /* Last byte must be the null terminator */
+
+ if ((!ByteCount) ||
+ (ByteCount < 2) ||
+ (ByteData[ByteCount-1] != 0))
+ {
+ return (FALSE);
+ }
+
+ for (i = 0; i < (ByteCount - 1); i++)
+ {
+ /* TBD: allow some escapes (non-ascii chars).
+ * they will be handled in the string output routine
+ */
+
+ if (!ACPI_IS_PRINT (ByteData[i]))
+ {
+ return (FALSE);
+ }
+ }
+
+ return (TRUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmUnicode
+ *
+ * PARAMETERS: Op - Byte List op containing Unicode string
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump Unicode string as a standard ASCII string. (Remove
+ * the extra zero bytes).
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmUnicode (
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT16 *WordData;
+ UINT32 WordCount;
+ UINT32 i;
+
+
+ /* Extract the buffer info as a WORD buffer */
+
+ WordData = ACPI_CAST_PTR (UINT16, Op->Named.Data);
+ WordCount = ACPI_DIV_2 (((UINT32) Op->Common.Value.Integer));
+
+
+ AcpiOsPrintf ("\"");
+
+ /* Write every other byte as an ASCII character */
+
+ for (i = 0; i < (WordCount - 1); i++)
+ {
+ AcpiOsPrintf ("%c", (int) WordData[i]);
+ }
+
+ AcpiOsPrintf ("\")");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmIsEisaId
+ *
+ * PARAMETERS: Op - Op to be examined
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Determine if an Op can be converted to an EisaId.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmIsEisaId (
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT32 Name;
+ UINT32 BigEndianId;
+ ACPI_PARSE_OBJECT *NextOp;
+ ACPI_NATIVE_UINT i;
+ UINT32 Prefix[3];
+
+
+ /* Get the NameSegment */
+
+ Name = AcpiPsGetName (Op);
+ if (!Name)
+ {
+ return;
+ }
+
+ /* We are looking for _HID */
+
+ if (!ACPI_COMPARE_NAME (&Name, METHOD_NAME__HID))
+ {
+ return;
+ }
+
+ /* The parameter must be either a word or a dword */
+
+ NextOp = AcpiPsGetDepthNext (NULL, Op);
+ if ((NextOp->Common.AmlOpcode != AML_DWORD_OP) &&
+ (NextOp->Common.AmlOpcode != AML_WORD_OP))
+ {
+ return;
+ }
+
+ /* Swap from little-endian to big-endian to simplify conversion */
+
+ BigEndianId = AcpiUtDwordByteSwap ((UINT32) NextOp->Common.Value.Integer);
+
+ /* Create the 3 leading ASCII letters */
+
+ Prefix[0] = ((BigEndianId >> 26) & 0x1F) + 0x40;
+ Prefix[1] = ((BigEndianId >> 21) & 0x1F) + 0x40;
+ Prefix[2] = ((BigEndianId >> 16) & 0x1F) + 0x40;
+
+ /* Verify that all 3 are ascii and alpha */
+
+ for (i = 0; i < 3; i++)
+ {
+ if (!ACPI_IS_ASCII (Prefix[i]) ||
+ !ACPI_IS_ALPHA (Prefix[i]))
+ {
+ return;
+ }
+ }
+
+ /* OK - mark this node as convertable to an EISA ID */
+
+ NextOp->Common.DisasmOpcode = ACPI_DASM_EISAID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmEisaId
+ *
+ * PARAMETERS: EncodedId - Raw encoded EISA ID.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Convert an encoded EISAID back to the original ASCII String.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmEisaId (
+ UINT32 EncodedId)
+{
+ UINT32 BigEndianId;
+
+
+ /* Swap from little-endian to big-endian to simplify conversion */
+
+ BigEndianId = AcpiUtDwordByteSwap (EncodedId);
+
+
+ /* Split to form "AAANNNN" string */
+
+ AcpiOsPrintf ("EisaId (\"%c%c%c%4.4X\")",
+
+ /* Three Alpha characters (AAA), 5 bits each */
+
+ (int) ((BigEndianId >> 26) & 0x1F) + 0x40,
+ (int) ((BigEndianId >> 21) & 0x1F) + 0x40,
+ (int) ((BigEndianId >> 16) & 0x1F) + 0x40,
+
+ /* Numeric part (NNNN) is simply the lower 16 bits */
+
+ (UINT32) (BigEndianId & 0xFFFF));
+}
+
+#endif
diff --git a/sys/contrib/dev/acpica/dmnames.c b/sys/contrib/dev/acpica/dmnames.c
new file mode 100644
index 0000000..6936462
--- /dev/null
+++ b/sys/contrib/dev/acpica/dmnames.c
@@ -0,0 +1,521 @@
+/*******************************************************************************
+ *
+ * Module Name: dmnames - AML disassembler, names, namestrings, pathnames
+ * $Revision: 1.17 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+
+#ifdef ACPI_DISASSEMBLER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dmnames")
+
+/* Local prototypes */
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+void
+AcpiDmDisplayPath (
+ ACPI_PARSE_OBJECT *Op);
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpName
+ *
+ * PARAMETERS: Name - 4 character ACPI name
+ *
+ * RETURN: Final length of name
+ *
+ * DESCRIPTION: Dump an ACPI name, minus any trailing underscores.
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiDmDumpName (
+ char *Name)
+{
+ UINT32 i;
+ UINT32 Length;
+ char NewName[4];
+
+
+ /* Ensure that the name is printable, even if we have to fix it */
+
+ *(UINT32 *) NewName = AcpiUtRepairName (Name);
+
+ /* Remove all trailing underscores from the name */
+
+ Length = ACPI_NAME_SIZE;
+ for (i = (ACPI_NAME_SIZE - 1); i != 0; i--)
+ {
+ if (NewName[i] == '_')
+ {
+ Length--;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ /* Dump the name, up to the start of the trailing underscores */
+
+ for (i = 0; i < Length; i++)
+ {
+ AcpiOsPrintf ("%c", NewName[i]);
+ }
+
+ return (Length);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsDisplayObjectPathname
+ *
+ * PARAMETERS: WalkState - Current walk state
+ * Op - Object whose pathname is to be obtained
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Diplay the pathname associated with a named object. Two
+ * versions. One searches the parse tree (for parser-only
+ * applications suchas AcpiDump), and the other searches the
+ * ACPI namespace (the parse tree is probably deleted)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiPsDisplayObjectPathname (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_BUFFER Buffer;
+ UINT32 DebugLevel;
+
+
+ /* Save current debug level so we don't get extraneous debug output */
+
+ DebugLevel = AcpiDbgLevel;
+ AcpiDbgLevel = 0;
+
+ /* Just get the Node out of the Op object */
+
+ Node = Op->Common.Node;
+ if (!Node)
+ {
+ /* Node not defined in this scope, look it up */
+
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Op->Common.Value.String,
+ ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
+ WalkState, &(Node));
+
+ if (ACPI_FAILURE (Status))
+ {
+ /*
+ * We can't get the pathname since the object
+ * is not in the namespace. This can happen during single
+ * stepping where a dynamic named object is *about* to be created.
+ */
+ AcpiOsPrintf (" [Path not found]");
+ goto Exit;
+ }
+
+ /* Save it for next time. */
+
+ Op->Common.Node = Node;
+ }
+
+ /* Convert NamedDesc/handle to a full pathname */
+
+ Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ Status = AcpiNsHandleToPathname (Node, &Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("****Could not get pathname****)");
+ goto Exit;
+ }
+
+ AcpiOsPrintf (" (Path %s)", (char *) Buffer.Pointer);
+ ACPI_FREE (Buffer.Pointer);
+
+
+Exit:
+ /* Restore the debug level */
+
+ AcpiDbgLevel = DebugLevel;
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmNamestring
+ *
+ * PARAMETERS: Name - ACPI Name string to store
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode and dump an ACPI namestring. Handles prefix characters
+ *
+ ******************************************************************************/
+
+void
+AcpiDmNamestring (
+ char *Name)
+{
+ UINT32 SegCount;
+
+
+ if (!Name)
+ {
+ return;
+ }
+
+ /* Handle all Scope Prefix operators */
+
+ while (AcpiPsIsPrefixChar (ACPI_GET8 (Name)))
+ {
+ /* Append prefix character */
+
+ AcpiOsPrintf ("%1c", ACPI_GET8 (Name));
+ Name++;
+ }
+
+ switch (ACPI_GET8 (Name))
+ {
+ case 0:
+ SegCount = 0;
+ break;
+
+ case AML_DUAL_NAME_PREFIX:
+ SegCount = 2;
+ Name++;
+ break;
+
+ case AML_MULTI_NAME_PREFIX_OP:
+ SegCount = (UINT32) ACPI_GET8 (Name + 1);
+ Name += 2;
+ break;
+
+ default:
+ SegCount = 1;
+ break;
+ }
+
+ while (SegCount)
+ {
+ /* Append Name segment */
+
+ AcpiDmDumpName ((char *) Name);
+
+ SegCount--;
+ if (SegCount)
+ {
+ /* Not last name, append dot separator */
+
+ AcpiOsPrintf (".");
+ }
+ Name += ACPI_NAME_SIZE;
+ }
+}
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDisplayPath
+ *
+ * PARAMETERS: Op - Named Op whose path is to be constructed
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Walk backwards from current scope and display the name
+ * of each previous level of scope up to the root scope
+ * (like "pwd" does with file systems)
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDisplayPath (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Prev;
+ ACPI_PARSE_OBJECT *Search;
+ UINT32 Name;
+ BOOLEAN DoDot = FALSE;
+ ACPI_PARSE_OBJECT *NamePath;
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ /* We are only interested in named objects */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ if (!(OpInfo->Flags & AML_NSNODE))
+ {
+ return;
+ }
+
+ if (OpInfo->Flags & AML_CREATE)
+ {
+ /* Field creation - check for a fully qualified namepath */
+
+ if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
+ {
+ NamePath = AcpiPsGetArg (Op, 3);
+ }
+ else
+ {
+ NamePath = AcpiPsGetArg (Op, 2);
+ }
+
+ if ((NamePath) &&
+ (NamePath->Common.Value.String) &&
+ (NamePath->Common.Value.String[0] == '\\'))
+ {
+ AcpiDmNamestring (NamePath->Common.Value.String);
+ return;
+ }
+ }
+
+ Prev = NULL; /* Start with Root Node */
+
+ while (Prev != Op)
+ {
+ /* Search upwards in the tree to find scope with "prev" as its parent */
+
+ Search = Op;
+ for (; ;)
+ {
+ if (Search->Common.Parent == Prev)
+ {
+ break;
+ }
+
+ /* Go up one level */
+
+ Search = Search->Common.Parent;
+ }
+
+ if (Prev)
+ {
+ OpInfo = AcpiPsGetOpcodeInfo (Search->Common.AmlOpcode);
+ if (!(OpInfo->Flags & AML_FIELD))
+ {
+ /* Below root scope, append scope name */
+
+ if (DoDot)
+ {
+ /* Append dot */
+
+ AcpiOsPrintf (".");
+ }
+
+ if (OpInfo->Flags & AML_CREATE)
+ {
+ if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
+ {
+ NamePath = AcpiPsGetArg (Op, 3);
+ }
+ else
+ {
+ NamePath = AcpiPsGetArg (Op, 2);
+ }
+
+ if ((NamePath) &&
+ (NamePath->Common.Value.String))
+ {
+ AcpiDmDumpName (NamePath->Common.Value.String);
+ }
+ }
+ else
+ {
+ Name = AcpiPsGetName (Search);
+ AcpiDmDumpName ((char *) &Name);
+ }
+
+ DoDot = TRUE;
+ }
+ }
+ Prev = Search;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmValidateName
+ *
+ * PARAMETERS: Name - 4 character ACPI name
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Lookup the name
+ *
+ ******************************************************************************/
+
+void
+AcpiDmValidateName (
+ char *Name,
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ if ((!Name) ||
+ (!Op->Common.Parent))
+ {
+ return;
+ }
+
+ if (!Op->Common.Node)
+ {
+ AcpiOsPrintf (
+ " /**** Name not found or not accessible from this scope ****/ ");
+ }
+
+ ACPI_PARSE_OBJECT *TargetOp;
+
+
+ if ((!Name) ||
+ (!Op->Common.Parent))
+ {
+ return;
+ }
+
+ TargetOp = AcpiPsFind (Op, Name, 0, 0);
+ if (!TargetOp)
+ {
+ /*
+ * Didn't find the name in the parse tree. This may be
+ * a problem, or it may simply be one of the predefined names
+ * (such as _OS_). Rather than worry about looking up all
+ * the predefined names, just display the name as given
+ */
+ AcpiOsPrintf (
+ " /**** Name not found or not accessible from this scope ****/ ");
+ }
+}
+#endif
+
+#endif
+
+
diff --git a/sys/contrib/dev/acpica/dmobject.c b/sys/contrib/dev/acpica/dmobject.c
new file mode 100644
index 0000000..7b7d3c3
--- /dev/null
+++ b/sys/contrib/dev/acpica/dmobject.c
@@ -0,0 +1,649 @@
+/*******************************************************************************
+ *
+ * Module Name: dmobject - ACPI object decode and display
+ * $Revision: 1.22 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdisasm.h>
+#include <contrib/dev/acpica/acparser.h>
+
+
+#ifdef ACPI_DISASSEMBLER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dmnames")
+
+/* Local prototypes */
+
+static void
+AcpiDmDecodeNode (
+ ACPI_NAMESPACE_NODE *Node);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpMethodInfo
+ *
+ * PARAMETERS: Status - Method execution status
+ * WalkState - Current state of the parse tree walk
+ * Op - Executing parse op
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Called when a method has been aborted because of an error.
+ * Dumps the method execution stack, and the method locals/args,
+ * and disassembles the AML opcode that failed.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpMethodInfo (
+ ACPI_STATUS Status,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next;
+ ACPI_THREAD_STATE *Thread;
+ ACPI_WALK_STATE *NextWalkState;
+ ACPI_NAMESPACE_NODE *PreviousMethod = NULL;
+
+
+ /* Ignore control codes, they are not errors */
+
+ if ((Status & AE_CODE_MASK) == AE_CODE_CONTROL)
+ {
+ return;
+ }
+
+ /* We may be executing a deferred opcode */
+
+ if (WalkState->DeferredNode)
+ {
+ AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
+ return;
+ }
+
+ /*
+ * If there is no Thread, we are not actually executing a method.
+ * This can happen when the iASL compiler calls the interpreter
+ * to perform constant folding.
+ */
+ Thread = WalkState->Thread;
+ if (!Thread)
+ {
+ return;
+ }
+
+ /* Display exception and method name */
+
+ AcpiOsPrintf ("\n**** Exception %s during execution of method ",
+ AcpiFormatException (Status));
+ AcpiNsPrintNodePathname (WalkState->MethodNode, NULL);
+
+ /* Display stack of executing methods */
+
+ AcpiOsPrintf ("\n\nMethod Execution Stack:\n");
+ NextWalkState = Thread->WalkStateList;
+
+ /* Walk list of linked walk states */
+
+ while (NextWalkState)
+ {
+ AcpiOsPrintf (" Method [%4.4s] executing: ",
+ AcpiUtGetNodeName (NextWalkState->MethodNode));
+
+ /* First method is the currently executing method */
+
+ if (NextWalkState == WalkState)
+ {
+ if (Op)
+ {
+ /* Display currently executing ASL statement */
+
+ Next = Op->Common.Next;
+ Op->Common.Next = NULL;
+
+ AcpiDmDisassemble (NextWalkState, Op, ACPI_UINT32_MAX);
+ Op->Common.Next = Next;
+ }
+ }
+ else
+ {
+ /*
+ * This method has called another method
+ * NOTE: the method call parse subtree is already deleted at this
+ * point, so we cannot disassemble the method invocation.
+ */
+ AcpiOsPrintf ("Call to method ");
+ AcpiNsPrintNodePathname (PreviousMethod, NULL);
+ }
+
+ PreviousMethod = NextWalkState->MethodNode;
+ NextWalkState = NextWalkState->Next;
+ AcpiOsPrintf ("\n");
+ }
+
+ /* Display the method locals and arguments */
+
+ AcpiOsPrintf ("\n");
+ AcpiDmDisplayLocals (WalkState);
+ AcpiOsPrintf ("\n");
+ AcpiDmDisplayArguments (WalkState);
+ AcpiOsPrintf ("\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDecodeInternalObject
+ *
+ * PARAMETERS: ObjDesc - Object to be displayed
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Short display of an internal object. Numbers/Strings/Buffers.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDecodeInternalObject (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ UINT32 i;
+
+
+ if (!ObjDesc)
+ {
+ AcpiOsPrintf (" Uninitialized");
+ return;
+ }
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
+ {
+ AcpiOsPrintf (" %p [%s]", ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
+ return;
+ }
+
+ AcpiOsPrintf (" %s", AcpiUtGetObjectTypeName (ObjDesc));
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+
+ AcpiOsPrintf (" %8.8X%8.8X",
+ ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ AcpiOsPrintf ("(%d) \"%.24s",
+ ObjDesc->String.Length, ObjDesc->String.Pointer);
+
+ if (ObjDesc->String.Length > 24)
+ {
+ AcpiOsPrintf ("...");
+ }
+ else
+ {
+ AcpiOsPrintf ("\"");
+ }
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ AcpiOsPrintf ("(%d)", ObjDesc->Buffer.Length);
+ for (i = 0; (i < 8) && (i < ObjDesc->Buffer.Length); i++)
+ {
+ AcpiOsPrintf (" %2.2X", ObjDesc->Buffer.Pointer[i]);
+ }
+ break;
+
+
+ default:
+
+ AcpiOsPrintf (" %p", ObjDesc);
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDecodeNode
+ *
+ * PARAMETERS: Node - Object to be displayed
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Short display of a namespace node
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmDecodeNode (
+ ACPI_NAMESPACE_NODE *Node)
+{
+
+ AcpiOsPrintf ("<Node> Name %4.4s",
+ AcpiUtGetNodeName (Node));
+
+ if (Node->Flags & ANOBJ_METHOD_ARG)
+ {
+ AcpiOsPrintf (" [Method Arg]");
+ }
+ if (Node->Flags & ANOBJ_METHOD_LOCAL)
+ {
+ AcpiOsPrintf (" [Method Local]");
+ }
+
+ AcpiDmDecodeInternalObject (AcpiNsGetAttachedObject (Node));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDisplayInternalObject
+ *
+ * PARAMETERS: ObjDesc - Object to be displayed
+ * WalkState - Current walk state
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Short display of an internal object
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDisplayInternalObject (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ UINT8 Type;
+
+
+ AcpiOsPrintf ("%p ", ObjDesc);
+
+ if (!ObjDesc)
+ {
+ AcpiOsPrintf ("<Null Object>\n");
+ return;
+ }
+
+ /* Decode the object type */
+
+ switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
+ {
+ case ACPI_DESC_TYPE_PARSER:
+
+ AcpiOsPrintf ("<Parser> ");
+ break;
+
+
+ case ACPI_DESC_TYPE_NAMED:
+
+ AcpiDmDecodeNode ((ACPI_NAMESPACE_NODE *) ObjDesc);
+ break;
+
+
+ case ACPI_DESC_TYPE_OPERAND:
+
+ Type = ACPI_GET_OBJECT_TYPE (ObjDesc);
+ if (Type > ACPI_TYPE_LOCAL_MAX)
+ {
+ AcpiOsPrintf (" Type %X [Invalid Type]", (UINT32) Type);
+ return;
+ }
+
+ /* Decode the ACPI object type */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ switch (ObjDesc->Reference.Opcode)
+ {
+ case AML_LOCAL_OP:
+
+ AcpiOsPrintf ("[Local%d] ", ObjDesc->Reference.Offset);
+ if (WalkState)
+ {
+ ObjDesc = WalkState->LocalVariables[
+ ObjDesc->Reference.Offset].Object;
+ AcpiOsPrintf ("%p", ObjDesc);
+ AcpiDmDecodeInternalObject (ObjDesc);
+ }
+ break;
+
+
+ case AML_ARG_OP:
+
+ AcpiOsPrintf ("[Arg%d] ", ObjDesc->Reference.Offset);
+ if (WalkState)
+ {
+ ObjDesc = WalkState->Arguments[
+ ObjDesc->Reference.Offset].Object;
+ AcpiOsPrintf ("%p", ObjDesc);
+ AcpiDmDecodeInternalObject (ObjDesc);
+ }
+ break;
+
+
+ case AML_DEBUG_OP:
+
+ AcpiOsPrintf ("[Debug] ");
+ break;
+
+
+ case AML_INDEX_OP:
+
+ AcpiOsPrintf ("[Index] ");
+ switch (ObjDesc->Reference.TargetType)
+ {
+ case ACPI_TYPE_BUFFER_FIELD:
+ AcpiOsPrintf ("%p", ObjDesc->Reference.Object);
+ AcpiDmDecodeInternalObject (ObjDesc->Reference.Object);
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+
+ AcpiOsPrintf ("%p", ObjDesc->Reference.Where);
+ if (!ObjDesc->Reference.Where)
+ {
+ AcpiOsPrintf (" Uninitialized WHERE ptr");
+ }
+ else
+ {
+ AcpiDmDecodeInternalObject (
+ *(ObjDesc->Reference.Where));
+ }
+ break;
+
+ default:
+ AcpiOsPrintf ("Unknown index target type");
+ break;
+ }
+ break;
+
+
+ case AML_LOAD_OP:
+
+ AcpiOsPrintf ("[DdbHandle] ");
+ break;
+
+
+ case AML_REF_OF_OP:
+
+ AcpiOsPrintf ("[RefOf] ");
+
+ if (!ObjDesc->Reference.Object)
+ {
+ AcpiOsPrintf ("Uninitialized reference subobject ptr");
+ break;
+ }
+
+ /* Reference can be to a Node or an Operand object */
+
+ switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc->Reference.Object))
+ {
+ case ACPI_DESC_TYPE_NAMED:
+ AcpiDmDecodeNode (ObjDesc->Reference.Object);
+ break;
+
+ case ACPI_DESC_TYPE_OPERAND:
+ AcpiDmDecodeInternalObject (ObjDesc->Reference.Object);
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+ case AML_INT_NAMEPATH_OP:
+
+ AcpiDmDecodeNode (ObjDesc->Reference.Node);
+ break;
+
+ default:
+
+ AcpiOsPrintf ("Unknown Reference opcode %X (%s)\n",
+ ObjDesc->Reference.Opcode,
+ AcpiPsGetOpcodeName (ObjDesc->Reference.Opcode));
+ break;
+ }
+ break;
+
+ default:
+
+ AcpiOsPrintf ("<Obj> ");
+ AcpiDmDecodeInternalObject (ObjDesc);
+ break;
+ }
+ break;
+
+
+ default:
+
+ AcpiOsPrintf ("<Not a valid ACPI Object Descriptor> [%s]",
+ AcpiUtGetDescriptorName (ObjDesc));
+ break;
+ }
+
+ AcpiOsPrintf ("\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDisplayLocals
+ *
+ * PARAMETERS: WalkState - State for current method
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display all locals for the currently running control method
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDisplayLocals (
+ ACPI_WALK_STATE *WalkState)
+{
+ UINT32 i;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ObjDesc = WalkState->MethodDesc;
+ Node = WalkState->MethodNode;
+ if (!Node)
+ {
+ AcpiOsPrintf (
+ "No method node (Executing subtree for buffer or opregion)\n");
+ return;
+ }
+
+ if (Node->Type != ACPI_TYPE_METHOD)
+ {
+ AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
+ return;
+ }
+
+ AcpiOsPrintf ("Local Variables for method [%4.4s]:\n",
+ AcpiUtGetNodeName (Node));
+
+ for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
+ {
+ ObjDesc = WalkState->LocalVariables[i].Object;
+ AcpiOsPrintf (" Local%X: ", i);
+ AcpiDmDisplayInternalObject (ObjDesc, WalkState);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDisplayArguments
+ *
+ * PARAMETERS: WalkState - State for current method
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Display all arguments for the currently running control method
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDisplayArguments (
+ ACPI_WALK_STATE *WalkState)
+{
+ UINT32 i;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ObjDesc = WalkState->MethodDesc;
+ Node = WalkState->MethodNode;
+ if (!Node)
+ {
+ AcpiOsPrintf (
+ "No method node (Executing subtree for buffer or opregion)\n");
+ return;
+ }
+
+ if (Node->Type != ACPI_TYPE_METHOD)
+ {
+ AcpiOsPrintf ("Executing subtree for Buffer/Package/Region\n");
+ return;
+ }
+
+ AcpiOsPrintf (
+ "Arguments for Method [%4.4s]: (%X arguments defined, max concurrency = %X)\n",
+ AcpiUtGetNodeName (Node), ObjDesc->Method.ParamCount, ObjDesc->Method.SyncLevel);
+
+ for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
+ {
+ ObjDesc = WalkState->Arguments[i].Object;
+ AcpiOsPrintf (" Arg%d: ", i);
+ AcpiDmDisplayInternalObject (ObjDesc, WalkState);
+ }
+}
+
+#endif
+
+
diff --git a/sys/contrib/dev/acpica/dmopcode.c b/sys/contrib/dev/acpica/dmopcode.c
new file mode 100644
index 0000000..bdb9eef
--- /dev/null
+++ b/sys/contrib/dev/acpica/dmopcode.c
@@ -0,0 +1,631 @@
+/*******************************************************************************
+ *
+ * Module Name: dmopcode - AML disassembler, specific AML opcodes
+ * $Revision: 1.101 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+#ifdef ACPI_DISASSEMBLER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dmopcode")
+
+/* Local prototypes */
+
+static void
+AcpiDmMatchKeyword (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmMethodFlags
+ *
+ * PARAMETERS: Op - Method Object to be examined
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode control method flags
+ *
+ ******************************************************************************/
+
+void
+AcpiDmMethodFlags (
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT32 Flags;
+ UINT32 Args;
+
+
+ /* The next Op contains the flags */
+
+ Op = AcpiPsGetDepthNext (NULL, Op);
+ Flags = (UINT8) Op->Common.Value.Integer;
+ Args = Flags & 0x07;
+
+ /* Mark the Op as completed */
+
+ Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+
+ /* 1) Method argument count */
+
+ AcpiOsPrintf (", %d, ", Args);
+
+ /* 2) Serialize rule */
+
+ if (!(Flags & 0x08))
+ {
+ AcpiOsPrintf ("Not");
+ }
+
+ AcpiOsPrintf ("Serialized");
+
+ /* 3) SyncLevel */
+
+ if (Flags & 0xF0)
+ {
+ AcpiOsPrintf (", %d", Flags >> 4);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmFieldFlags
+ *
+ * PARAMETERS: Op - Field Object to be examined
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode Field definition flags
+ *
+ ******************************************************************************/
+
+void
+AcpiDmFieldFlags (
+ ACPI_PARSE_OBJECT *Op)
+{
+ UINT32 Flags;
+
+
+ /* The next peer Op (not child op) contains the flags */
+
+ Op = Op->Common.Next;
+ Flags = (UINT8) Op->Common.Value.Integer;
+
+ /* Mark the Op as completed */
+
+ Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+
+ AcpiOsPrintf ("%s, ", AcpiGbl_AccessTypes [Flags & 0x07]);
+ AcpiOsPrintf ("%s, ", AcpiGbl_LockRule [(Flags & 0x10) >> 4]);
+ AcpiOsPrintf ("%s)", AcpiGbl_UpdateRules [(Flags & 0x60) >> 5]);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmAddressSpace
+ *
+ * PARAMETERS: SpaceId - ID to be translated
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a SpaceId to an AddressSpaceKeyword
+ *
+ ******************************************************************************/
+
+void
+AcpiDmAddressSpace (
+ UINT8 SpaceId)
+{
+
+ if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
+ {
+ if (SpaceId == 0x7F)
+ {
+ AcpiOsPrintf ("FFixedHW, ");
+ }
+ else
+ {
+ AcpiOsPrintf ("0x%.2X, ", SpaceId);
+ }
+ }
+ else
+ {
+ AcpiOsPrintf ("%s, ", AcpiGbl_RegionTypes [SpaceId]);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmRegionFlags
+ *
+ * PARAMETERS: Op - Object to be examined
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode OperationRegion flags
+ *
+ ******************************************************************************/
+
+void
+AcpiDmRegionFlags (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+
+ /* The next Op contains the SpaceId */
+
+ Op = AcpiPsGetDepthNext (NULL, Op);
+
+ /* Mark the Op as completed */
+
+ Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+
+ AcpiOsPrintf (", ");
+ AcpiDmAddressSpace ((UINT8) Op->Common.Value.Integer);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmMatchOp
+ *
+ * PARAMETERS: Op - Match Object to be examined
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode Match opcode operands
+ *
+ ******************************************************************************/
+
+void
+AcpiDmMatchOp (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *NextOp;
+
+
+ NextOp = AcpiPsGetDepthNext (NULL, Op);
+ NextOp = NextOp->Common.Next;
+
+ if (!NextOp)
+ {
+ /* Handle partial tree during single-step */
+
+ return;
+ }
+
+ /* Mark the two nodes that contain the encoding for the match keywords */
+
+ NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
+
+ NextOp = NextOp->Common.Next;
+ NextOp = NextOp->Common.Next;
+ NextOp->Common.DisasmOpcode = ACPI_DASM_MATCHOP;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmMatchKeyword
+ *
+ * PARAMETERS: Op - Match Object to be examined
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode Match opcode operands
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmMatchKeyword (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+
+ if (((UINT32) Op->Common.Value.Integer) > ACPI_MAX_MATCH_OPCODE)
+ {
+ AcpiOsPrintf ("/* Unknown Match Keyword encoding */");
+ }
+ else
+ {
+ AcpiOsPrintf ("%s", ACPI_CAST_PTR (char,
+ AcpiGbl_MatchOps[(ACPI_SIZE) Op->Common.Value.Integer]));
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDisassembleOneOp
+ *
+ * PARAMETERS: WalkState - Current walk info
+ * Info - Parse tree walk info
+ * Op - Op that is to be printed
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Disassemble a single AML opcode
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDisassembleOneOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OP_WALK_INFO *Info,
+ ACPI_PARSE_OBJECT *Op)
+{
+ const ACPI_OPCODE_INFO *OpInfo = NULL;
+ UINT32 Offset;
+ UINT32 Length;
+ ACPI_PARSE_OBJECT *Child;
+ ACPI_STATUS Status;
+
+
+ if (!Op)
+ {
+ AcpiOsPrintf ("<NULL OP PTR>");
+ return;
+ }
+
+ switch (Op->Common.DisasmOpcode)
+ {
+ case ACPI_DASM_MATCHOP:
+
+ AcpiDmMatchKeyword (Op);
+ return;
+
+ case ACPI_DASM_LNOT_SUFFIX:
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_LEQUAL_OP:
+ AcpiOsPrintf ("LNotEqual");
+ break;
+
+ case AML_LGREATER_OP:
+ AcpiOsPrintf ("LLessEqual");
+ break;
+
+ case AML_LLESS_OP:
+ AcpiOsPrintf ("LGreaterEqual");
+ break;
+ }
+ Op->Common.DisasmOpcode = 0;
+ Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+ return;
+
+ default:
+ break;
+ }
+
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ /* The op and arguments */
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_LNOT_OP:
+
+ Child = Op->Common.Value.Arg;
+ if ((Child->Common.AmlOpcode == AML_LEQUAL_OP) ||
+ (Child->Common.AmlOpcode == AML_LGREATER_OP) ||
+ (Child->Common.AmlOpcode == AML_LLESS_OP))
+ {
+ Child->Common.DisasmOpcode = ACPI_DASM_LNOT_SUFFIX;
+ Op->Common.DisasmOpcode = ACPI_DASM_LNOT_PREFIX;
+ }
+ else
+ {
+ AcpiOsPrintf ("%s", OpInfo->Name);
+ }
+ break;
+
+ case AML_BYTE_OP:
+
+ AcpiOsPrintf ("0x%2.2X", (UINT32) Op->Common.Value.Integer);
+ break;
+
+
+ case AML_WORD_OP:
+
+ if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
+ {
+ AcpiDmEisaId ((UINT32) Op->Common.Value.Integer);
+ }
+ else
+ {
+ AcpiOsPrintf ("0x%4.4X", (UINT32) Op->Common.Value.Integer);
+ }
+ break;
+
+
+ case AML_DWORD_OP:
+
+ if (Op->Common.DisasmOpcode == ACPI_DASM_EISAID)
+ {
+ AcpiDmEisaId ((UINT32) Op->Common.Value.Integer);
+ }
+ else
+ {
+ AcpiOsPrintf ("0x%8.8X", (UINT32) Op->Common.Value.Integer);
+ }
+ break;
+
+
+ case AML_QWORD_OP:
+
+ AcpiOsPrintf ("0x%8.8X%8.8X", Op->Common.Value.Integer64.Hi,
+ Op->Common.Value.Integer64.Lo);
+ break;
+
+
+ case AML_STRING_OP:
+
+ AcpiUtPrintString (Op->Common.Value.String, ACPI_UINT8_MAX);
+ break;
+
+
+ case AML_BUFFER_OP:
+
+ /*
+ * Determine the type of buffer. We can have one of the following:
+ *
+ * 1) ResourceTemplate containing Resource Descriptors.
+ * 2) Unicode String buffer
+ * 3) ASCII String buffer
+ * 4) Raw data buffer (if none of the above)
+ *
+ * Since there are no special AML opcodes to differentiate these
+ * types of buffers, we have to closely look at the data in the
+ * buffer to determine the type.
+ */
+ Status = AcpiDmIsResourceTemplate (Op);
+ if (ACPI_SUCCESS (Status))
+ {
+ Op->Common.DisasmOpcode = ACPI_DASM_RESOURCE;
+ AcpiOsPrintf ("ResourceTemplate");
+ break;
+ }
+ else if (Status == AE_AML_NO_RESOURCE_END_TAG)
+ {
+ AcpiOsPrintf ("/**** Is ResourceTemplate, but EndTag not at buffer end ****/ ");
+ }
+
+ if (AcpiDmIsUnicodeBuffer (Op))
+ {
+ Op->Common.DisasmOpcode = ACPI_DASM_UNICODE;
+ AcpiOsPrintf ("Unicode (");
+ }
+ else if (AcpiDmIsStringBuffer (Op))
+ {
+ Op->Common.DisasmOpcode = ACPI_DASM_STRING;
+ AcpiOsPrintf ("Buffer");
+ }
+ else
+ {
+ Op->Common.DisasmOpcode = ACPI_DASM_BUFFER;
+ AcpiOsPrintf ("Buffer");
+ }
+ break;
+
+
+ case AML_INT_STATICSTRING_OP:
+
+ if (Op->Common.Value.String)
+ {
+ AcpiOsPrintf ("%s", Op->Common.Value.String);
+ }
+ else
+ {
+ AcpiOsPrintf ("\"<NULL STATIC STRING PTR>\"");
+ }
+ break;
+
+
+ case AML_INT_NAMEPATH_OP:
+
+ AcpiDmNamestring (Op->Common.Value.Name);
+ break;
+
+
+ case AML_INT_NAMEDFIELD_OP:
+
+ Length = AcpiDmDumpName ((char *) &Op->Named.Name);
+ AcpiOsPrintf (",%*.s %d", (int) (5 - Length), " ",
+ (UINT32) Op->Common.Value.Integer);
+ AcpiDmCommaIfFieldMember (Op);
+
+ Info->BitOffset += (UINT32) Op->Common.Value.Integer;
+ break;
+
+
+ case AML_INT_RESERVEDFIELD_OP:
+
+ /* Offset() -- Must account for previous offsets */
+
+ Offset = (UINT32) Op->Common.Value.Integer;
+ Info->BitOffset += Offset;
+
+ if (Info->BitOffset % 8 == 0)
+ {
+ AcpiOsPrintf (" Offset (0x%.2X)", ACPI_DIV_8 (Info->BitOffset));
+ }
+ else
+ {
+ AcpiOsPrintf (" , %d", Offset);
+ }
+
+ AcpiDmCommaIfFieldMember (Op);
+ break;
+
+
+ case AML_INT_ACCESSFIELD_OP:
+
+ AcpiOsPrintf (" AccessAs (%s, ",
+ AcpiGbl_AccessTypes [(UINT32) (Op->Common.Value.Integer >> 8) & 0x7]);
+
+ AcpiDmDecodeAttribute ((UINT8) Op->Common.Value.Integer);
+ AcpiOsPrintf (")");
+ AcpiDmCommaIfFieldMember (Op);
+ break;
+
+
+ case AML_INT_BYTELIST_OP:
+
+ AcpiDmByteList (Info, Op);
+ break;
+
+
+ case AML_INT_METHODCALL_OP:
+
+ Op = AcpiPsGetDepthNext (NULL, Op);
+ Op->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+
+ AcpiDmNamestring (Op->Common.Value.Name);
+ break;
+
+
+ default:
+
+ /* Just get the opcode name and print it */
+
+ AcpiOsPrintf ("%s", OpInfo->Name);
+
+
+#ifdef ACPI_DEBUGGER
+
+ if ((Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP) &&
+ (WalkState) &&
+ (WalkState->Results) &&
+ (WalkState->ResultCount))
+ {
+ AcpiDmDecodeInternalObject (
+ WalkState->Results->Results.ObjDesc [
+ (WalkState->ResultCount - 1) %
+ ACPI_RESULTS_FRAME_OBJ_NUM]);
+ }
+#endif
+
+ break;
+ }
+}
+
+#endif /* ACPI_DISASSEMBLER */
diff --git a/sys/contrib/dev/acpica/dmresrc.c b/sys/contrib/dev/acpica/dmresrc.c
new file mode 100644
index 0000000..60b7896
--- /dev/null
+++ b/sys/contrib/dev/acpica/dmresrc.c
@@ -0,0 +1,509 @@
+/*******************************************************************************
+ *
+ * Module Name: dmresrc.c - Resource Descriptor disassembly
+ * $Revision: 1.35 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+#ifdef ACPI_DISASSEMBLER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbresrc")
+
+
+/* Dispatch tables for Resource disassembly functions */
+
+typedef
+void (*ACPI_RESOURCE_HANDLER) (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level);
+
+static ACPI_RESOURCE_HANDLER AcpiGbl_DumpResourceDispatch [] =
+{
+ /* Small descriptors */
+
+ NULL, /* 0x00, Reserved */
+ NULL, /* 0x01, Reserved */
+ NULL, /* 0x02, Reserved */
+ NULL, /* 0x03, Reserved */
+ AcpiDmIrqDescriptor, /* 0x04, ACPI_RESOURCE_NAME_IRQ_FORMAT */
+ AcpiDmDmaDescriptor, /* 0x05, ACPI_RESOURCE_NAME_DMA_FORMAT */
+ AcpiDmStartDependentDescriptor, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */
+ AcpiDmEndDependentDescriptor, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
+ AcpiDmIoDescriptor, /* 0x08, ACPI_RESOURCE_NAME_IO_PORT */
+ AcpiDmFixedIoDescriptor, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO_PORT */
+ NULL, /* 0x0A, Reserved */
+ NULL, /* 0x0B, Reserved */
+ NULL, /* 0x0C, Reserved */
+ NULL, /* 0x0D, Reserved */
+ AcpiDmVendorSmallDescriptor, /* 0x0E, ACPI_RESOURCE_NAME_SMALL_VENDOR */
+ NULL, /* 0x0F, ACPI_RESOURCE_NAME_END_TAG (not used) */
+
+ /* Large descriptors */
+
+ NULL, /* 0x00, Reserved */
+ AcpiDmMemory24Descriptor, /* 0x01, ACPI_RESOURCE_NAME_MEMORY_24 */
+ AcpiDmGenericRegisterDescriptor,/* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */
+ NULL, /* 0x03, Reserved */
+ AcpiDmVendorLargeDescriptor, /* 0x04, ACPI_RESOURCE_NAME_LARGE_VENDOR */
+ AcpiDmMemory32Descriptor, /* 0x05, ACPI_RESOURCE_NAME_MEMORY_32 */
+ AcpiDmFixedMemory32Descriptor, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY_32 */
+ AcpiDmDwordDescriptor, /* 0x07, ACPI_RESOURCE_NAME_DWORD_ADDRESS_SPACE */
+ AcpiDmWordDescriptor, /* 0x08, ACPI_RESOURCE_NAME_WORD_ADDRESS_SPACE */
+ AcpiDmInterruptDescriptor, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_XRUPT */
+ AcpiDmQwordDescriptor, /* 0x0A, ACPI_RESOURCE_NAME_QWORD_ADDRESS_SPACE */
+ AcpiDmExtendedDescriptor /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS_SPACE */
+};
+
+
+/* Only used for single-threaded applications */
+/* TBD: remove when name is passed as parameter to the dump functions */
+
+static UINT32 ResourceName;
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDescriptorName
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Emit a name for the descriptor if one is present (indicated
+ * by the name being changed from the default name.) A name is only
+ * emitted if a reference to the descriptor has been made somewhere
+ * in the original ASL code.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDescriptorName (
+ void)
+{
+
+ if (ResourceName == ACPI_DEFAULT_RESNAME)
+ {
+ return;
+ }
+
+ AcpiOsPrintf ("%4.4s", (char *) &ResourceName);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDumpInteger*
+ *
+ * PARAMETERS: Value - Value to emit
+ * Name - Associated name (emitted as a comment)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Integer output helper functions
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDumpInteger8 (
+ UINT8 Value,
+ char *Name)
+{
+ AcpiOsPrintf ("0x%2.2X, // %s\n", Value, Name);
+}
+
+void
+AcpiDmDumpInteger16 (
+ UINT16 Value,
+ char *Name)
+{
+ AcpiOsPrintf ("0x%4.4X, // %s\n", Value, Name);
+}
+
+void
+AcpiDmDumpInteger32 (
+ UINT32 Value,
+ char *Name)
+{
+ AcpiOsPrintf ("0x%8.8X, // %s\n", Value, Name);
+}
+
+void
+AcpiDmDumpInteger64 (
+ UINT64 Value,
+ char *Name)
+{
+ AcpiOsPrintf ("0x%8.8X%8.8X, // %s\n", ACPI_FORMAT_UINT64 (Value), Name);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmBitList
+ *
+ * PARAMETERS: Mask - 16-bit value corresponding to 16 interrupt
+ * or DMA values
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump a bit mask as a list of individual interrupt/DMA levels.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmBitList (
+ UINT16 Mask)
+{
+ UINT32 i;
+ BOOLEAN Previous = FALSE;
+
+
+ /* Open the initializer list */
+
+ AcpiOsPrintf ("{");
+
+ /* Examine each bit */
+
+ for (i = 0; i < 16; i++)
+ {
+ /* Only interested in bits that are set to 1 */
+
+ if (Mask & 1)
+ {
+ if (Previous)
+ {
+ AcpiOsPrintf (",");
+ }
+ Previous = TRUE;
+ AcpiOsPrintf ("%d", i);
+ }
+
+ Mask >>= 1;
+ }
+
+ /* Close list */
+
+ AcpiOsPrintf ("}\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmResourceTemplate
+ *
+ * PARAMETERS: Info - Curent parse tree walk info
+ * ByteData - Pointer to the byte list data
+ * ByteCount - Length of the byte list
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump the contents of a Resource Template containing a set of
+ * Resource Descriptors.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmResourceTemplate (
+ ACPI_OP_WALK_INFO *Info,
+ ACPI_PARSE_OBJECT *Op,
+ UINT8 *ByteData,
+ UINT32 ByteCount)
+{
+ ACPI_STATUS Status;
+ ACPI_NATIVE_UINT CurrentByteOffset;
+ UINT8 ResourceType;
+ UINT32 ResourceLength;
+ void *Aml;
+ UINT32 Level;
+ BOOLEAN DependentFns = FALSE;
+ UINT8 ResourceIndex;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ Level = Info->Level;
+ ResourceName = ACPI_DEFAULT_RESNAME;
+ Node = Op->Common.Node;
+ if (Node)
+ {
+ Node = Node->Child;
+ }
+
+ for (CurrentByteOffset = 0; CurrentByteOffset < ByteCount; )
+ {
+ Aml = &ByteData[CurrentByteOffset];
+
+ /* Get the descriptor type and length */
+
+ ResourceType = AcpiUtGetResourceType (Aml);
+ ResourceLength = AcpiUtGetResourceLength (Aml);
+
+ /* Validate the Resource Type and Resource Length */
+
+ Status = AcpiUtValidateResource (Aml, &ResourceIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("/*** Could not validate Resource, type (%X) %s***/\n",
+ ResourceType, AcpiFormatException (Status));
+ return;
+ }
+
+ /* Point to next descriptor */
+
+ CurrentByteOffset += AcpiUtGetDescriptorLength (Aml);
+
+ /* Descriptor pre-processing */
+
+ switch (ResourceType)
+ {
+ case ACPI_RESOURCE_NAME_START_DEPENDENT:
+
+ /* Finish a previous StartDependentFns */
+
+ if (DependentFns)
+ {
+ Level--;
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("}\n");
+ }
+ break;
+
+ case ACPI_RESOURCE_NAME_END_DEPENDENT:
+
+ Level--;
+ DependentFns = FALSE;
+ break;
+
+ case ACPI_RESOURCE_NAME_END_TAG:
+
+ /* Normal exit, the resource list is finished */
+
+ if (DependentFns)
+ {
+ /*
+ * Close an open StartDependentDescriptor. This indicates a
+ * missing EndDependentDescriptor.
+ */
+ Level--;
+ DependentFns = FALSE;
+
+ /* Go ahead and insert EndDependentFn() */
+
+ AcpiDmEndDependentDescriptor (Aml, ResourceLength, Level);
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf (
+ "/*** Disassembler: inserted missing EndDependentFn () ***/\n");
+ }
+ return;
+
+ default:
+ break;
+ }
+
+ /* Disassemble the resource structure */
+
+ if (Node)
+ {
+ ResourceName = Node->Name.Integer;
+ Node = Node->Peer;
+ }
+
+ AcpiGbl_DumpResourceDispatch [ResourceIndex] (
+ Aml, ResourceLength, Level);
+
+ /* Descriptor post-processing */
+
+ if (ResourceType == ACPI_RESOURCE_NAME_START_DEPENDENT)
+ {
+ DependentFns = TRUE;
+ Level++;
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmIsResourceTemplate
+ *
+ * PARAMETERS: Op - Buffer Op to be examined
+ *
+ * RETURN: Status. AE_OK if valid template
+ *
+ * DESCRIPTION: Walk a byte list to determine if it consists of a valid set
+ * of resource descriptors. Nothing is output.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDmIsResourceTemplate (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *NextOp;
+ UINT8 *Aml;
+ UINT8 *EndAml;
+ ACPI_SIZE Length;
+
+
+ /* This op must be a buffer */
+
+ if (Op->Common.AmlOpcode != AML_BUFFER_OP)
+ {
+ return (AE_TYPE);
+ }
+
+ /* Get the ByteData list and length */
+
+ NextOp = Op->Common.Value.Arg;
+ NextOp = NextOp->Common.Next;
+ if (!NextOp)
+ {
+ return (AE_TYPE);
+ }
+
+ Aml = NextOp->Named.Data;
+ Length = (ACPI_SIZE) NextOp->Common.Value.Integer;
+
+ /* Walk the byte list, abort on any invalid descriptor type or length */
+
+ Status = AcpiUtWalkAmlResources (Aml, Length, NULL, &EndAml);
+ if (ACPI_FAILURE (Status))
+ {
+ return (AE_TYPE);
+ }
+
+ /*
+ * For the resource template to be valid, one EndTag must appear
+ * at the very end of the ByteList, not before. (For proper disassembly
+ * of a ResourceTemplate, the buffer must not have any extra data after
+ * the EndTag.)
+ */
+ if ((Aml + Length - sizeof (AML_RESOURCE_END_TAG)) != EndAml)
+ {
+ return (AE_AML_NO_RESOURCE_END_TAG);
+ }
+
+ /*
+ * All resource descriptors are valid, therefore this list appears
+ * to be a valid resource template
+ */
+ return (AE_OK);
+}
+
+#endif
diff --git a/sys/contrib/dev/acpica/dmresrcl.c b/sys/contrib/dev/acpica/dmresrcl.c
new file mode 100644
index 0000000..1cc375d
--- /dev/null
+++ b/sys/contrib/dev/acpica/dmresrcl.c
@@ -0,0 +1,1125 @@
+/*******************************************************************************
+ *
+ * Module Name: dmresrcl.c - "Large" Resource Descriptor disassembly
+ * $Revision: 1.37 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+
+#ifdef ACPI_DISASSEMBLER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbresrcl")
+
+
+/* Common names for address and memory descriptors */
+
+static char *AcpiDmAddressNames[] =
+{
+ "Granularity",
+ "Range Minimum",
+ "Range Maximum",
+ "Translation Offset",
+ "Length"
+};
+
+static char *AcpiDmMemoryNames[] =
+{
+ "Range Minimum",
+ "Range Maximum",
+ "Alignment",
+ "Length"
+};
+
+
+/* Local prototypes */
+
+static void
+AcpiDmSpaceFlags (
+ UINT8 Flags);
+
+static void
+AcpiDmIoFlags (
+ UINT8 Flags);
+
+static void
+AcpiDmIoFlags2 (
+ UINT8 SpecificFlags);
+
+static void
+AcpiDmMemoryFlags (
+ UINT8 Flags,
+ UINT8 SpecificFlags);
+
+static void
+AcpiDmMemoryFlags2 (
+ UINT8 SpecificFlags);
+
+static void
+AcpiDmResourceSource (
+ AML_RESOURCE *Resource,
+ ACPI_SIZE MinimumLength,
+ UINT32 Length);
+
+static void
+AcpiDmAddressFields (
+ void *Source,
+ UINT8 Type,
+ UINT32 Level);
+
+static void
+AcpiDmAddressPrefix (
+ UINT8 Type);
+
+static void
+AcpiDmAddressCommon (
+ AML_RESOURCE *Resource,
+ UINT8 Type,
+ UINT32 Level);
+
+static void
+AcpiDmAddressFlags (
+ AML_RESOURCE *Resource);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmMemoryFields
+ *
+ * PARAMETERS: Source - Pointer to the contiguous data fields
+ * Type - 16 or 32 (bit)
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode fields common to Memory24 and Memory32 descriptors
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmMemoryFields (
+ void *Source,
+ UINT8 Type,
+ UINT32 Level)
+{
+ ACPI_NATIVE_UINT i;
+
+
+ for (i = 0; i < 4; i++)
+ {
+ AcpiDmIndent (Level + 1);
+
+ switch (Type)
+ {
+ case 16:
+ AcpiDmDumpInteger16 (ACPI_CAST_PTR (UINT16, Source)[i],
+ AcpiDmMemoryNames[i]);
+ break;
+
+ case 32:
+ AcpiDmDumpInteger32 (ACPI_CAST_PTR (UINT32, Source)[i],
+ AcpiDmMemoryNames[i]);
+ break;
+
+ default:
+ return;
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmAddressFields
+ *
+ * PARAMETERS: Source - Pointer to the contiguous data fields
+ * Type - 16, 32, or 64 (bit)
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode fields common to address descriptors
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmAddressFields (
+ void *Source,
+ UINT8 Type,
+ UINT32 Level)
+{
+ ACPI_NATIVE_UINT i;
+
+
+ AcpiOsPrintf ("\n");
+
+ for (i = 0; i < 5; i++)
+ {
+ AcpiDmIndent (Level + 1);
+
+ switch (Type)
+ {
+ case 16:
+ AcpiDmDumpInteger16 (ACPI_CAST_PTR (UINT16, Source)[i],
+ AcpiDmAddressNames[i]);
+ break;
+
+ case 32:
+ AcpiDmDumpInteger32 (ACPI_CAST_PTR (UINT32, Source)[i],
+ AcpiDmAddressNames[i]);
+ break;
+
+ case 64:
+ AcpiDmDumpInteger64 (ACPI_CAST_PTR (UINT64, Source)[i],
+ AcpiDmAddressNames[i]);
+ break;
+
+ default:
+ return;
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmAddressPrefix
+ *
+ * PARAMETERS: Type - Descriptor type
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Emit name prefix representing the address descriptor type
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmAddressPrefix (
+ UINT8 Type)
+{
+
+ switch (Type)
+ {
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
+ AcpiOsPrintf ("Word");
+ break;
+
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
+ AcpiOsPrintf ("DWord");
+ break;
+
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+ AcpiOsPrintf ("QWord");
+ break;
+
+ case ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64:
+ AcpiOsPrintf ("Extended");
+ break;
+
+ default:
+ return;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmAddressCommon
+ *
+ * PARAMETERS: Resource - Raw AML descriptor
+ * Type - Descriptor type
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Emit common name and flag fields common to address descriptors
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmAddressCommon (
+ AML_RESOURCE *Resource,
+ UINT8 Type,
+ UINT32 Level)
+{
+ UINT8 ResourceType;
+ UINT8 SpecificFlags;
+ UINT8 Flags;
+
+
+ ResourceType = Resource->Address.ResourceType;
+ SpecificFlags = Resource->Address.SpecificFlags;
+ Flags = Resource->Address.Flags;
+
+ AcpiDmIndent (Level);
+
+ /* Validate ResourceType */
+
+ if ((ResourceType > 2) && (ResourceType < 0xC0))
+ {
+ AcpiOsPrintf ("/**** Invalid Resource Type: 0x%X ****/", ResourceType);
+ return;
+ }
+
+ /* Prefix is either Word, DWord, QWord, or Extended */
+
+ AcpiDmAddressPrefix (Type);
+
+ /* Resource Types above 0xC0 are vendor-defined */
+
+ if (ResourceType > 2)
+ {
+ AcpiOsPrintf ("Space (0x%2.2X, ", ResourceType);
+ AcpiDmSpaceFlags (Flags);
+ AcpiOsPrintf (" 0x%2.2X,", SpecificFlags);
+ return;
+ }
+
+ /* This is either a Memory, IO, or BusNumber descriptor (0,1,2) */
+
+ AcpiOsPrintf ("%s (", AcpiGbl_WordDecode [ResourceType & 0x3]);
+
+ /* Decode the general and type-specific flags */
+
+ if (ResourceType == ACPI_MEMORY_RANGE)
+ {
+ AcpiDmMemoryFlags (Flags, SpecificFlags);
+ }
+ else /* IO range or BusNumberRange */
+ {
+ AcpiDmIoFlags (Flags);
+ if (ResourceType == ACPI_IO_RANGE)
+ {
+ AcpiOsPrintf (" %s,", AcpiGbl_RngDecode [SpecificFlags & 0x3]);
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmAddressFlags
+ *
+ * PARAMETERS: Resource - Raw AML descriptor
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Emit flags common to address descriptors
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmAddressFlags (
+ AML_RESOURCE *Resource)
+{
+
+ if (Resource->Address.ResourceType == ACPI_IO_RANGE)
+ {
+ AcpiDmIoFlags2 (Resource->Address.SpecificFlags);
+ }
+ else if (Resource->Address.ResourceType == ACPI_MEMORY_RANGE)
+ {
+ AcpiDmMemoryFlags2 (Resource->Address.SpecificFlags);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmSpaceFlags
+ *
+ * PARAMETERS: Flags - Flag byte to be decoded
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode the flags specific to Space Address space descriptors
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmSpaceFlags (
+ UINT8 Flags)
+{
+
+ AcpiOsPrintf ("%s, %s, %s, %s,",
+ AcpiGbl_ConsumeDecode [(Flags & 1)],
+ AcpiGbl_DecDecode [(Flags & 0x2) >> 1],
+ AcpiGbl_MinDecode [(Flags & 0x4) >> 2],
+ AcpiGbl_MaxDecode [(Flags & 0x8) >> 3]);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmIoFlags
+ *
+ * PARAMETERS: Flags - Flag byte to be decoded
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode the flags specific to IO Address space descriptors
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmIoFlags (
+ UINT8 Flags)
+{
+ AcpiOsPrintf ("%s, %s, %s, %s,",
+ AcpiGbl_ConsumeDecode [(Flags & 1)],
+ AcpiGbl_MinDecode [(Flags & 0x4) >> 2],
+ AcpiGbl_MaxDecode [(Flags & 0x8) >> 3],
+ AcpiGbl_DecDecode [(Flags & 0x2) >> 1]);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmIoFlags2
+ *
+ * PARAMETERS: SpecificFlags - "Specific" flag byte to be decoded
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode the flags specific to IO Address space descriptors
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmIoFlags2 (
+ UINT8 SpecificFlags)
+{
+
+ AcpiOsPrintf (", %s",
+ AcpiGbl_TtpDecode [(SpecificFlags & 0x10) >> 4]);
+
+ /* TRS is only used if TTP is TypeTranslation */
+
+ if (SpecificFlags & 0x10)
+ {
+ AcpiOsPrintf (", %s",
+ AcpiGbl_TrsDecode [(SpecificFlags & 0x20) >> 5]);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmMemoryFlags
+ *
+ * PARAMETERS: Flags - Flag byte to be decoded
+ * SpecificFlags - "Specific" flag byte to be decoded
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode flags specific to Memory Address Space descriptors
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmMemoryFlags (
+ UINT8 Flags,
+ UINT8 SpecificFlags)
+{
+
+ AcpiOsPrintf ("%s, %s, %s, %s, %s, %s,",
+ AcpiGbl_ConsumeDecode [(Flags & 1)],
+ AcpiGbl_DecDecode [(Flags & 0x2) >> 1],
+ AcpiGbl_MinDecode [(Flags & 0x4) >> 2],
+ AcpiGbl_MaxDecode [(Flags & 0x8) >> 3],
+ AcpiGbl_MemDecode [(SpecificFlags & 0x6) >> 1],
+ AcpiGbl_RwDecode [(SpecificFlags & 0x1)]);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmMemoryFlags2
+ *
+ * PARAMETERS: SpecificFlags - "Specific" flag byte to be decoded
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode flags specific to Memory Address Space descriptors
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmMemoryFlags2 (
+ UINT8 SpecificFlags)
+{
+
+ AcpiOsPrintf (", %s, %s",
+ AcpiGbl_MtpDecode [(SpecificFlags & 0x18) >> 3],
+ AcpiGbl_TtpDecode [(SpecificFlags & 0x20) >> 5]);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmResourceSource
+ *
+ * PARAMETERS: Resource - Raw AML descriptor
+ * MinimumLength - descriptor length without optional fields
+ * ResourceLength
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump optional ResourceSource fields of an address descriptor
+ *
+ ******************************************************************************/
+
+static void
+AcpiDmResourceSource (
+ AML_RESOURCE *Resource,
+ ACPI_SIZE MinimumTotalLength,
+ UINT32 ResourceLength)
+{
+ UINT8 *AmlResourceSource;
+ UINT32 TotalLength;
+
+
+ TotalLength = ResourceLength + sizeof (AML_RESOURCE_LARGE_HEADER);
+
+ /* Check if the optional ResourceSource fields are present */
+
+ if (TotalLength <= MinimumTotalLength)
+ {
+ /* The two optional fields are not used */
+
+ AcpiOsPrintf (",, ");
+ return;
+ }
+
+ /* Get a pointer to the ResourceSource */
+
+ AmlResourceSource = ACPI_ADD_PTR (UINT8, Resource, MinimumTotalLength);
+
+ /*
+ * Always emit the ResourceSourceIndex (Byte)
+ *
+ * NOTE: Some ASL compilers always create a 0 byte (in the AML) for the
+ * Index even if the String does not exist. Although this is in violation
+ * of the ACPI specification, it is very important to emit ASL code that
+ * can be compiled back to the identical AML. There may be fields and/or
+ * indexes into the resource template buffer that are compiled to absolute
+ * offsets, and these will be broken if the AML length is changed.
+ */
+ AcpiOsPrintf ("0x%2.2X,", (UINT32) AmlResourceSource[0]);
+
+ /* Make sure that the ResourceSource string exists before dumping it */
+
+ if (TotalLength > (MinimumTotalLength + 1))
+ {
+ AcpiOsPrintf (" ");
+ AcpiUtPrintString ((char *) &AmlResourceSource[1], ACPI_UINT8_MAX);
+ }
+
+ AcpiOsPrintf (", ");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmWordDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Word Address Space descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmWordDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ /* Dump resource name and flags */
+
+ AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS16, Level);
+
+ /* Dump the 5 contiguous WORD values */
+
+ AcpiDmAddressFields (&Resource->Address16.Granularity, 16, Level);
+
+ /* The ResourceSource fields are optional */
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS16), Length);
+
+ /* Insert a descriptor name */
+
+ AcpiDmDescriptorName ();
+
+ /* Type-specific flags */
+
+ AcpiDmAddressFlags (Resource);
+ AcpiOsPrintf (")\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDwordDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a DWord Address Space descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDwordDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ /* Dump resource name and flags */
+
+ AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS32, Level);
+
+ /* Dump the 5 contiguous DWORD values */
+
+ AcpiDmAddressFields (&Resource->Address32.Granularity, 32, Level);
+
+ /* The ResourceSource fields are optional */
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS32), Length);
+
+ /* Insert a descriptor name */
+
+ AcpiDmDescriptorName ();
+
+ /* Type-specific flags */
+
+ AcpiDmAddressFlags (Resource);
+ AcpiOsPrintf (")\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmQwordDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a QWord Address Space descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmQwordDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ /* Dump resource name and flags */
+
+ AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_ADDRESS64, Level);
+
+ /* Dump the 5 contiguous QWORD values */
+
+ AcpiDmAddressFields (&Resource->Address64.Granularity, 64, Level);
+
+ /* The ResourceSource fields are optional */
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmResourceSource (Resource, sizeof (AML_RESOURCE_ADDRESS64), Length);
+
+ /* Insert a descriptor name */
+
+ AcpiDmDescriptorName ();
+
+ /* Type-specific flags */
+
+ AcpiDmAddressFlags (Resource);
+ AcpiOsPrintf (")\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmExtendedDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Extended Address Space descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmExtendedDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ /* Dump resource name and flags */
+
+ AcpiDmAddressCommon (Resource, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64, Level);
+
+ /* Dump the 5 contiguous QWORD values */
+
+ AcpiDmAddressFields (&Resource->ExtAddress64.Granularity, 64, Level);
+
+ /* Extra field for this descriptor only */
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger64 (Resource->ExtAddress64.TypeSpecific,
+ "Type-Specific Attributes");
+
+ /* Insert a descriptor name */
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDescriptorName ();
+
+ /* Type-specific flags */
+
+ AcpiDmAddressFlags (Resource);
+ AcpiOsPrintf (")\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmMemory24Descriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Memory24 descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmMemory24Descriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ /* Dump name and read/write flag */
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("Memory24 (%s,\n",
+ AcpiGbl_RwDecode [Resource->Memory24.Flags & 1]);
+
+ /* Dump the 4 contiguous WORD values */
+
+ AcpiDmMemoryFields (&Resource->Memory24.Minimum, 16, Level);
+
+ /* Insert a descriptor name */
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDescriptorName ();
+ AcpiOsPrintf (")\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmMemory32Descriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Memory32 descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmMemory32Descriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ /* Dump name and read/write flag */
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("Memory32 (%s,\n",
+ AcpiGbl_RwDecode [Resource->Memory32.Flags & 1]);
+
+ /* Dump the 4 contiguous DWORD values */
+
+ AcpiDmMemoryFields (&Resource->Memory32.Minimum, 32, Level);
+
+ /* Insert a descriptor name */
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDescriptorName ();
+ AcpiOsPrintf (")\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmFixedMemory32Descriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Fixed Memory32 descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmFixedMemory32Descriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ /* Dump name and read/write flag */
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("Memory32Fixed (%s,\n",
+ AcpiGbl_RwDecode [Resource->FixedMemory32.Flags & 1]);
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger32 (Resource->FixedMemory32.Address, "Address Base");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger32 (Resource->FixedMemory32.AddressLength, "Address Length");
+
+ /* Insert a descriptor name */
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDescriptorName ();
+ AcpiOsPrintf (")\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmGenericRegisterDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Generic Register descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmGenericRegisterDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("Register (");
+ AcpiDmAddressSpace (Resource->GenericReg.AddressSpaceId);
+ AcpiOsPrintf ("\n");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger8 (Resource->GenericReg.BitWidth, "Bit Width");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger8 (Resource->GenericReg.BitOffset, "Bit Offset");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger64 (Resource->GenericReg.Address, "Address");
+
+ /* Optional field for ACPI 3.0 */
+
+ AcpiDmIndent (Level + 1);
+ if (Resource->GenericReg.AccessSize)
+ {
+ AcpiOsPrintf ("0x%2.2X, // %s\n",
+ Resource->GenericReg.AccessSize, "Access Size");
+ AcpiDmIndent (Level + 1);
+ }
+ else
+ {
+ AcpiOsPrintf (",");
+ }
+
+ /* DescriptorName was added for ACPI 3.0+ */
+
+ AcpiDmDescriptorName ();
+ AcpiOsPrintf (")\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmInterruptDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a extended Interrupt descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmInterruptDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+ UINT32 i;
+
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("Interrupt (%s, %s, %s, %s, ",
+ AcpiGbl_ConsumeDecode [(Resource->ExtendedIrq.Flags & 1)],
+ AcpiGbl_HeDecode [(Resource->ExtendedIrq.Flags >> 1) & 1],
+ AcpiGbl_LlDecode [(Resource->ExtendedIrq.Flags >> 2) & 1],
+ AcpiGbl_ShrDecode [(Resource->ExtendedIrq.Flags >> 3) & 1]);
+
+ /*
+ * The ResourceSource fields are optional and appear after the interrupt
+ * list. Must compute length based on length of the list. First xrupt
+ * is included in the struct (reason for -1 below)
+ */
+ AcpiDmResourceSource (Resource,
+ sizeof (AML_RESOURCE_EXTENDED_IRQ) +
+ (Resource->ExtendedIrq.InterruptCount - 1) * sizeof (UINT32),
+ Resource->ExtendedIrq.ResourceLength);
+
+ /* Insert a descriptor name */
+
+ AcpiDmDescriptorName ();
+ AcpiOsPrintf (")\n");
+
+ /* Dump the interrupt list */
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("{\n");
+ for (i = 0; i < Resource->ExtendedIrq.InterruptCount; i++)
+ {
+ AcpiDmIndent (Level + 1);
+ AcpiOsPrintf ("0x%8.8X,\n",
+ (UINT32) Resource->ExtendedIrq.Interrupts[i]);
+ }
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("}\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmVendorCommon
+ *
+ * PARAMETERS: Name - Descriptor name suffix
+ * ByteData - Pointer to the vendor byte data
+ * Length - Length of the byte data
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Vendor descriptor, both Large and Small
+ *
+ ******************************************************************************/
+
+void
+AcpiDmVendorCommon (
+ char *Name,
+ UINT8 *ByteData,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ /* Dump macro name */
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("Vendor%s (", Name);
+
+ /* Insert a descriptor name */
+
+ AcpiDmDescriptorName ();
+ AcpiOsPrintf (") // Length = 0x%.2X\n", Length);
+
+ /* Dump the vendor bytes */
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("{\n");
+
+ AcpiDmDisasmByteList (Level + 1, ByteData, Length);
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("}\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmVendorLargeDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Vendor Large descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmVendorLargeDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ AcpiDmVendorCommon ("Long ",
+ ACPI_ADD_PTR (UINT8, Resource, sizeof (AML_RESOURCE_LARGE_HEADER)),
+ Length, Level);
+}
+
+#endif
+
diff --git a/sys/contrib/dev/acpica/dmresrcs.c b/sys/contrib/dev/acpica/dmresrcs.c
new file mode 100644
index 0000000..b7df965
--- /dev/null
+++ b/sys/contrib/dev/acpica/dmresrcs.c
@@ -0,0 +1,387 @@
+/*******************************************************************************
+ *
+ * Module Name: dmresrcs.c - "Small" Resource Descriptor disassembly
+ * $Revision: 1.16 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+
+#ifdef ACPI_DISASSEMBLER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dbresrcs")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmIrqDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a IRQ descriptor, either Irq() or IrqNoFlags()
+ *
+ ******************************************************************************/
+
+void
+AcpiDmIrqDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("%s (",
+ AcpiGbl_IrqDecode [Length & 1]);
+
+ /* Decode flags byte if present */
+
+ if (Length & 1)
+ {
+ AcpiOsPrintf ("%s, %s, %s, ",
+ AcpiGbl_HeDecode [Resource->Irq.Flags & 1],
+ AcpiGbl_LlDecode [(Resource->Irq.Flags >> 3) & 1],
+ AcpiGbl_ShrDecode [(Resource->Irq.Flags >> 4) & 1]);
+ }
+
+ /* Insert a descriptor name */
+
+ AcpiDmDescriptorName ();
+ AcpiOsPrintf (")\n");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmBitList (Resource->Irq.IrqMask);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDmaDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a DMA descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDmaDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("DMA (%s, %s, %s, ",
+ AcpiGbl_TypDecode [(Resource->Dma.Flags >> 5) & 3],
+ AcpiGbl_BmDecode [(Resource->Dma.Flags >> 2) & 1],
+ AcpiGbl_SizDecode [(Resource->Dma.Flags >> 0) & 3]);
+
+ /* Insert a descriptor name */
+
+ AcpiDmDescriptorName ();
+ AcpiOsPrintf (")\n");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmBitList (Resource->Dma.DmaChannelMask);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmIoDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode an IO descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmIoDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("IO (%s,\n",
+ AcpiGbl_IoDecode [(Resource->Io.Flags & 1)]);
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger16 (Resource->Io.Minimum, "Range Minimum");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger16 (Resource->Io.Maximum, "Range Maximum");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger8 (Resource->Io.Alignment, "Alignment");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger8 (Resource->Io.AddressLength, "Length");
+
+ /* Insert a descriptor name */
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDescriptorName ();
+ AcpiOsPrintf (")\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmFixedIoDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Fixed IO descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmFixedIoDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("FixedIO (\n");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger16 (Resource->FixedIo.Address, "Address");
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDumpInteger8 (Resource->FixedIo.AddressLength, "Length");
+
+ /* Insert a descriptor name */
+
+ AcpiDmIndent (Level + 1);
+ AcpiDmDescriptorName ();
+ AcpiOsPrintf (")\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmStartDependentDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Start Dependendent functions descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmStartDependentDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ AcpiDmIndent (Level);
+
+ if (Length & 1)
+ {
+ AcpiOsPrintf ("StartDependentFn (0x%2.2X, 0x%2.2X)\n",
+ (UINT32) Resource->StartDpf.Flags & 3,
+ (UINT32) (Resource->StartDpf.Flags >> 2) & 3);
+ }
+ else
+ {
+ AcpiOsPrintf ("StartDependentFnNoPri ()\n");
+ }
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("{\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmEndDependentDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode an End Dependent functions descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmEndDependentDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("}\n");
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("EndDependentFn ()\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmVendorSmallDescriptor
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Length - Length of the descriptor in bytes
+ * Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode a Vendor Small Descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiDmVendorSmallDescriptor (
+ AML_RESOURCE *Resource,
+ UINT32 Length,
+ UINT32 Level)
+{
+
+ AcpiDmVendorCommon ("Short",
+ ACPI_ADD_PTR (UINT8, Resource, sizeof (AML_RESOURCE_SMALL_HEADER)),
+ Length, Level);
+}
+
+#endif
+
diff --git a/sys/contrib/dev/acpica/dmutils.c b/sys/contrib/dev/acpica/dmutils.c
new file mode 100644
index 0000000..e6340a2
--- /dev/null
+++ b/sys/contrib/dev/acpica/dmutils.c
@@ -0,0 +1,493 @@
+/*******************************************************************************
+ *
+ * Module Name: dmutils - AML disassembler utilities
+ * $Revision: 1.25 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+#ifdef ACPI_ASL_COMPILER
+#include <contrib/dev/acpica/acnamesp.h>
+#endif
+
+#ifdef ACPI_DISASSEMBLER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dmutils")
+
+
+ACPI_EXTERNAL_LIST *AcpiGbl_ExternalList = NULL;
+
+
+/* Data used in keeping track of fields */
+#if 0
+const char *AcpiGbl_FENames[] =
+{
+ "skip",
+ "?access?"
+}; /* FE = Field Element */
+#endif
+
+/* Operators for Match() */
+
+const char *AcpiGbl_MatchOps[] =
+{
+ "MTR",
+ "MEQ",
+ "MLE",
+ "MLT",
+ "MGE",
+ "MGT"
+};
+
+/* Access type decoding */
+
+const char *AcpiGbl_AccessTypes[] =
+{
+ "AnyAcc",
+ "ByteAcc",
+ "WordAcc",
+ "DWordAcc",
+ "QWordAcc",
+ "BufferAcc",
+ "InvalidAccType",
+ "InvalidAccType"
+};
+
+/* Lock rule decoding */
+
+const char *AcpiGbl_LockRule[] =
+{
+ "NoLock",
+ "Lock"
+};
+
+/* Update rule decoding */
+
+const char *AcpiGbl_UpdateRules[] =
+{
+ "Preserve",
+ "WriteAsOnes",
+ "WriteAsZeros",
+ "InvalidUpdateRule"
+};
+
+/* Strings used to decode resource descriptors */
+
+const char *AcpiGbl_WordDecode[] =
+{
+ "Memory",
+ "IO",
+ "BusNumber",
+ "UnknownResourceType"
+};
+
+const char *AcpiGbl_IrqDecode[] =
+{
+ "IRQNoFlags",
+ "IRQ"
+};
+
+
+#ifdef ACPI_ASL_COMPILER
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmAddToExternalList
+ *
+ * PARAMETERS: Path - Internal (AML) path to the object
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Insert a new path into the list of Externals which will in
+ * turn be emitted as an External() declaration in the disassembled
+ * output.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmAddToExternalList (
+ char *Path,
+ UINT8 Type,
+ UINT32 Value)
+{
+ char *ExternalPath;
+ ACPI_EXTERNAL_LIST *NewExternal;
+ ACPI_EXTERNAL_LIST *NextExternal;
+ ACPI_EXTERNAL_LIST *PrevExternal = NULL;
+ ACPI_STATUS Status;
+
+
+ if (!Path)
+ {
+ return;
+ }
+
+ /* Externalize the ACPI path */
+
+ Status = AcpiNsExternalizeName (ACPI_UINT32_MAX, Path,
+ NULL, &ExternalPath);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ /* Ensure that we don't have duplicate externals */
+
+ NextExternal = AcpiGbl_ExternalList;
+ while (NextExternal)
+ {
+ /* Allow upgrade of type from ANY */
+
+ if (!ACPI_STRCMP (ExternalPath, NextExternal->Path))
+ {
+ /* Duplicate method, check that the Value (ArgCount) is the same */
+
+ if ((NextExternal->Type == ACPI_TYPE_METHOD) &&
+ (NextExternal->Value != Value))
+ {
+ ACPI_ERROR ((AE_INFO, "Argument count mismatch for method %s %d %d",
+ NextExternal->Path, NextExternal->Value, Value));
+ }
+ if (NextExternal->Type == ACPI_TYPE_ANY)
+ {
+ NextExternal->Type = Type;
+ NextExternal->Value = Value;
+ }
+ ACPI_FREE (ExternalPath);
+ return;
+ }
+ NextExternal = NextExternal->Next;
+ }
+
+ /* Allocate and init a new External() descriptor */
+
+ NewExternal = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EXTERNAL_LIST));
+ NewExternal->InternalPath = Path;
+ NewExternal->Path = ExternalPath;
+ NewExternal->Type = Type;
+ NewExternal->Value = Value;
+ NewExternal->Length = (UINT16) ACPI_STRLEN (ExternalPath);
+
+ /* Link the new descriptor into the global list, ordered by string length */
+
+ NextExternal = AcpiGbl_ExternalList;
+ while (NextExternal)
+ {
+ if (NewExternal->Length <= NextExternal->Length)
+ {
+ if (PrevExternal)
+ {
+ PrevExternal->Next = NewExternal;
+ }
+ else
+ {
+ AcpiGbl_ExternalList = NewExternal;
+ }
+
+ NewExternal->Next = NextExternal;
+ return;
+ }
+
+ PrevExternal = NextExternal;
+ NextExternal = NextExternal->Next;
+ }
+
+ if (PrevExternal)
+ {
+ PrevExternal->Next = NewExternal;
+ }
+ else
+ {
+ AcpiGbl_ExternalList = NewExternal;
+ }
+}
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDecodeAttribute
+ *
+ * PARAMETERS: Attribute - Attribute field of AccessAs keyword
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decode the AccessAs attribute byte. (Mostly SMBus stuff)
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDecodeAttribute (
+ UINT8 Attribute)
+{
+
+ switch (Attribute)
+ {
+ case AML_FIELD_ATTRIB_SMB_QUICK:
+
+ AcpiOsPrintf ("SMBQuick");
+ break;
+
+ case AML_FIELD_ATTRIB_SMB_SEND_RCV:
+
+ AcpiOsPrintf ("SMBSendReceive");
+ break;
+
+ case AML_FIELD_ATTRIB_SMB_BYTE:
+
+ AcpiOsPrintf ("SMBByte");
+ break;
+
+ case AML_FIELD_ATTRIB_SMB_WORD:
+
+ AcpiOsPrintf ("SMBWord");
+ break;
+
+ case AML_FIELD_ATTRIB_SMB_WORD_CALL:
+
+ AcpiOsPrintf ("SMBProcessCall");
+ break;
+
+ case AML_FIELD_ATTRIB_SMB_BLOCK:
+
+ AcpiOsPrintf ("SMBBlock");
+ break;
+
+ case AML_FIELD_ATTRIB_SMB_BLOCK_CALL:
+
+ AcpiOsPrintf ("SMBBlockProcessCall");
+ break;
+
+ default:
+
+ AcpiOsPrintf ("0x%.2X", Attribute);
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmIndent
+ *
+ * PARAMETERS: Level - Current source code indentation level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Indent 4 spaces per indentation level.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmIndent (
+ UINT32 Level)
+{
+
+ if (!Level)
+ {
+ return;
+ }
+
+ AcpiOsPrintf ("%*.s", ACPI_MUL_4 (Level), " ");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmCommaIfListMember
+ *
+ * PARAMETERS: Op - Current operator/operand
+ *
+ * RETURN: TRUE if a comma was inserted
+ *
+ * DESCRIPTION: Insert a comma if this Op is a member of an argument list.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiDmCommaIfListMember (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ if (!Op->Common.Next)
+ {
+ return FALSE;
+ }
+
+ if (AcpiDmListType (Op->Common.Parent) & BLOCK_COMMA_LIST)
+ {
+ /* Check for a NULL target operand */
+
+ if ((Op->Common.Next->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
+ (!Op->Common.Next->Common.Value.String))
+ {
+ /*
+ * To handle the Divide() case where there are two optional
+ * targets, look ahead one more op. If null, this null target
+ * is the one and only target -- no comma needed. Otherwise,
+ * we need a comma to prepare for the next target.
+ */
+ if (!Op->Common.Next->Common.Next)
+ {
+ return FALSE;
+ }
+ }
+
+ if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
+ (!(Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)))
+ {
+ return FALSE;
+ }
+
+ AcpiOsPrintf (", ");
+ return (TRUE);
+ }
+
+ else if ((Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST) &&
+ (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
+ {
+ AcpiOsPrintf (", ");
+ return (TRUE);
+ }
+
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmCommaIfFieldMember
+ *
+ * PARAMETERS: Op - Current operator/operand
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Insert a comma if this Op is a member of a Field argument list.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmCommaIfFieldMember (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ if (Op->Common.Next)
+ {
+ AcpiOsPrintf (", ");
+ }
+}
+
+#endif
diff --git a/sys/contrib/dev/acpica/dmwalk.c b/sys/contrib/dev/acpica/dmwalk.c
new file mode 100644
index 0000000..12c74f4
--- /dev/null
+++ b/sys/contrib/dev/acpica/dmwalk.c
@@ -0,0 +1,1043 @@
+/*******************************************************************************
+ *
+ * Module Name: dmwalk - AML disassembly tree walk
+ * $Revision: 1.33 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdisasm.h>
+#include <contrib/dev/acpica/acdebug.h>
+
+
+#ifdef ACPI_DISASSEMBLER
+
+#define _COMPONENT ACPI_CA_DEBUGGER
+ ACPI_MODULE_NAME ("dmwalk")
+
+
+#define DB_FULL_OP_INFO "[%4.4s] @%5.5X #%4.4X: "
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDmDescendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static ACPI_STATUS
+AcpiDmAscendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context);
+
+static UINT32
+AcpiDmBlockType (
+ ACPI_PARSE_OBJECT *Op);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDisassemble
+ *
+ * PARAMETERS: WalkState - Current state
+ * Origin - Starting object
+ * NumOpcodes - Max number of opcodes to be displayed
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Disassemble parser object and its children. This is the
+ * main entry point of the disassembler.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmDisassemble (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Origin,
+ UINT32 NumOpcodes)
+{
+ ACPI_PARSE_OBJECT *Op = Origin;
+ ACPI_OP_WALK_INFO Info;
+
+
+ if (!Op)
+ {
+ return;
+ }
+
+ Info.Flags = 0;
+ Info.Level = 0;
+ Info.Count = 0;
+ Info.WalkState = WalkState;
+ AcpiDmWalkParseTree (Op, AcpiDmDescendingOp, AcpiDmAscendingOp, &Info);
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmWalkParseTree
+ *
+ * PARAMETERS: Op - Root Op object
+ * DescendingCallback - Called during tree descent
+ * AscendingCallback - Called during tree ascent
+ * Context - To be passed to the callbacks
+ *
+ * RETURN: Status from callback(s)
+ *
+ * DESCRIPTION: Walk the entire parse tree.
+ *
+ ******************************************************************************/
+
+void
+AcpiDmWalkParseTree (
+ ACPI_PARSE_OBJECT *Op,
+ ASL_WALK_CALLBACK DescendingCallback,
+ ASL_WALK_CALLBACK AscendingCallback,
+ void *Context)
+{
+ BOOLEAN NodePreviouslyVisited;
+ ACPI_PARSE_OBJECT *StartOp = Op;
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *Next;
+ ACPI_OP_WALK_INFO *Info = Context;
+
+
+ Info->Level = 0;
+ NodePreviouslyVisited = FALSE;
+
+ while (Op)
+ {
+ if (NodePreviouslyVisited)
+ {
+ if (AscendingCallback)
+ {
+ Status = AscendingCallback (Op, Info->Level, Context);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+ }
+ }
+ else
+ {
+ /* Let the callback process the node */
+
+ Status = DescendingCallback (Op, Info->Level, Context);
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Visit children first, once */
+
+ Next = AcpiPsGetArg (Op, 0);
+ if (Next)
+ {
+ Info->Level++;
+ Op = Next;
+ continue;
+ }
+ }
+ else if (Status != AE_CTRL_DEPTH)
+ {
+ /* Exit immediately on any error */
+
+ return;
+ }
+ }
+
+ /* Terminate walk at start op */
+
+ if (Op == StartOp)
+ {
+ break;
+ }
+
+ /* No more children, re-visit this node */
+
+ if (!NodePreviouslyVisited)
+ {
+ NodePreviouslyVisited = TRUE;
+ continue;
+ }
+
+ /* No more children, visit peers */
+
+ if (Op->Common.Next)
+ {
+ Op = Op->Common.Next;
+ NodePreviouslyVisited = FALSE;
+ }
+ else
+ {
+ /* No peers, re-visit parent */
+
+ if (Info->Level != 0 )
+ {
+ Info->Level--;
+ }
+
+ Op = Op->Common.Parent;
+ NodePreviouslyVisited = TRUE;
+ }
+ }
+
+ /* If we get here, the walk completed with no errors */
+
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmBlockType
+ *
+ * PARAMETERS: Op - Object to be examined
+ *
+ * RETURN: BlockType - not a block, parens, braces, or even both.
+ *
+ * DESCRIPTION: Type of block for this op (parens or braces)
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiDmBlockType (
+ ACPI_PARSE_OBJECT *Op)
+{
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ if (!Op)
+ {
+ return (BLOCK_NONE);
+ }
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_ELSE_OP:
+
+ return (BLOCK_BRACE);
+
+ case AML_METHOD_OP:
+ case AML_DEVICE_OP:
+ case AML_SCOPE_OP:
+ case AML_PROCESSOR_OP:
+ case AML_POWER_RES_OP:
+ case AML_THERMAL_ZONE_OP:
+ case AML_IF_OP:
+ case AML_WHILE_OP:
+ case AML_FIELD_OP:
+ case AML_INDEX_FIELD_OP:
+ case AML_BANK_FIELD_OP:
+
+ return (BLOCK_PAREN | BLOCK_BRACE);
+
+ case AML_BUFFER_OP:
+
+ if (Op->Common.DisasmOpcode == ACPI_DASM_UNICODE)
+ {
+ return (BLOCK_NONE);
+ }
+
+ /*lint -fallthrough */
+
+ case AML_PACKAGE_OP:
+ case AML_VAR_PACKAGE_OP:
+
+ return (BLOCK_PAREN | BLOCK_BRACE);
+
+ case AML_EVENT_OP:
+
+ return (BLOCK_PAREN);
+
+ default:
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ if (OpInfo->Flags & AML_HAS_ARGS)
+ {
+ return (BLOCK_PAREN);
+ }
+
+ return (BLOCK_NONE);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmListType
+ *
+ * PARAMETERS: Op - Object to be examined
+ *
+ * RETURN: ListType - has commas or not.
+ *
+ * DESCRIPTION: Type of block for this op (parens or braces)
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiDmListType (
+ ACPI_PARSE_OBJECT *Op)
+{
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ if (!Op)
+ {
+ return (BLOCK_NONE);
+ }
+
+ switch (Op->Common.AmlOpcode)
+ {
+
+ case AML_ELSE_OP:
+ case AML_METHOD_OP:
+ case AML_DEVICE_OP:
+ case AML_SCOPE_OP:
+ case AML_POWER_RES_OP:
+ case AML_PROCESSOR_OP:
+ case AML_THERMAL_ZONE_OP:
+ case AML_IF_OP:
+ case AML_WHILE_OP:
+ case AML_FIELD_OP:
+ case AML_INDEX_FIELD_OP:
+ case AML_BANK_FIELD_OP:
+
+ return (BLOCK_NONE);
+
+ case AML_BUFFER_OP:
+ case AML_PACKAGE_OP:
+ case AML_VAR_PACKAGE_OP:
+
+ return (BLOCK_COMMA_LIST);
+
+ default:
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ if (OpInfo->Flags & AML_HAS_ARGS)
+ {
+ return (BLOCK_COMMA_LIST);
+ }
+
+ return (BLOCK_NONE);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmDescendingOp
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: First visitation of a parse object during tree descent.
+ * Decode opcode name and begin parameter list(s), if any.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmDescendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_OP_WALK_INFO *Info = Context;
+ const ACPI_OPCODE_INFO *OpInfo;
+ UINT32 Name;
+ ACPI_PARSE_OBJECT *NextOp;
+ ACPI_EXTERNAL_LIST *NextExternal;
+
+
+ if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
+ {
+ /* Ignore this op -- it was handled elsewhere */
+
+ return (AE_CTRL_DEPTH);
+ }
+
+ /* Level 0 is at the Definition Block level */
+
+ if (Level == 0)
+ {
+ /* In verbose mode, print the AML offset, opcode and depth count */
+
+ if (Info->WalkState)
+ {
+ VERBOSE_PRINT ((DB_FULL_OP_INFO,
+ (Info->WalkState->MethodNode ?
+ Info->WalkState->MethodNode->Name.Ascii : " "),
+ Op->Common.AmlOffset, (UINT32) Op->Common.AmlOpcode));
+ }
+
+ if (Op->Common.AmlOpcode == AML_SCOPE_OP)
+ {
+ /* This is the beginning of the Definition Block */
+
+ AcpiOsPrintf ("{\n");
+
+ /* Emit all External() declarations here */
+
+ if (AcpiGbl_ExternalList)
+ {
+ /*
+ * Walk the list of externals (unresolved references)
+ * found during parsing
+ */
+ while (AcpiGbl_ExternalList)
+ {
+ AcpiOsPrintf (" External (%s",
+ AcpiGbl_ExternalList->Path);
+
+ /* TBD: should be a lookup table */
+
+ switch (AcpiGbl_ExternalList->Type)
+ {
+ case ACPI_TYPE_DEVICE:
+ AcpiOsPrintf (", DeviceObj");
+ break;
+
+ case ACPI_TYPE_METHOD:
+ AcpiOsPrintf (", MethodObj");
+ break;
+
+ case ACPI_TYPE_INTEGER:
+ AcpiOsPrintf (", IntObj");
+ break;
+
+ default:
+ break;
+ }
+
+ if (AcpiGbl_ExternalList->Type == ACPI_TYPE_METHOD)
+ {
+ AcpiOsPrintf (") // %d Arguments\n", AcpiGbl_ExternalList->Value);
+ }
+ else
+ {
+ AcpiOsPrintf (")\n");
+ }
+
+ NextExternal = AcpiGbl_ExternalList->Next;
+ ACPI_FREE (AcpiGbl_ExternalList->Path);
+ ACPI_FREE (AcpiGbl_ExternalList);
+ AcpiGbl_ExternalList = NextExternal;
+ }
+ AcpiOsPrintf ("\n");
+ }
+
+ return (AE_OK);
+ }
+ }
+ else if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
+ (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) &&
+ (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
+ {
+ /*
+ * This is a first-level element of a term list,
+ * indent a new line
+ */
+ AcpiDmIndent (Level);
+ Info->LastLevel = Level;
+ Info->Count = 0;
+ }
+
+ /*
+ * This is an inexpensive mechanism to try and keep lines from getting
+ * too long. When the limit is hit, start a new line at the previous
+ * indent plus one. A better but more expensive mechanism would be to
+ * keep track of the current column.
+ */
+ Info->Count++;
+ if (Info->Count /*+Info->LastLevel*/ > 10)
+ {
+ Info->Count = 0;
+ AcpiOsPrintf ("\n");
+ AcpiDmIndent (Info->LastLevel + 1);
+ }
+
+ /* Print the opcode name */
+
+ AcpiDmDisassembleOneOp (NULL, Info, Op);
+
+ if (Op->Common.DisasmOpcode == ACPI_DASM_LNOT_PREFIX)
+ {
+ return (AE_OK);
+ }
+
+ if ((Op->Common.AmlOpcode == AML_NAME_OP) ||
+ (Op->Common.AmlOpcode == AML_RETURN_OP))
+ {
+ Info->Level--;
+ }
+
+ /* Start the opcode argument list if necessary */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ if ((OpInfo->Flags & AML_HAS_ARGS) ||
+ (Op->Common.AmlOpcode == AML_EVENT_OP))
+ {
+ /* This opcode has an argument list */
+
+ if (AcpiDmBlockType (Op) & BLOCK_PAREN)
+ {
+ AcpiOsPrintf (" (");
+ }
+
+ /* If this is a named opcode, print the associated name value */
+
+ if (OpInfo->Flags & AML_NAMED)
+ {
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_ALIAS_OP:
+
+ NextOp = AcpiPsGetDepthNext (NULL, Op);
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+ AcpiDmNamestring (NextOp->Common.Value.Name);
+ AcpiOsPrintf (", ");
+
+ /*lint -fallthrough */
+
+ default:
+
+ Name = AcpiPsGetName (Op);
+ if (Op->Named.Path)
+ {
+ AcpiDmNamestring ((char *) Op->Named.Path);
+ }
+ else
+ {
+ AcpiDmDumpName ((char *) &Name);
+ }
+
+ if (Op->Common.AmlOpcode != AML_INT_NAMEDFIELD_OP)
+ {
+ if (AcpiGbl_DbOpt_verbose)
+ {
+ (void) AcpiPsDisplayObjectPathname (NULL, Op);
+ }
+ }
+ break;
+ }
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_METHOD_OP:
+
+ AcpiDmMethodFlags (Op);
+ AcpiOsPrintf (")");
+ break;
+
+
+ case AML_NAME_OP:
+
+ /* Check for _HID and related EISAID() */
+
+ AcpiDmIsEisaId (Op);
+ AcpiOsPrintf (", ");
+ break;
+
+
+ case AML_REGION_OP:
+
+ AcpiDmRegionFlags (Op);
+ break;
+
+
+ case AML_POWER_RES_OP:
+
+ /* Mark the next two Ops as part of the parameter list */
+
+ AcpiOsPrintf (", ");
+ NextOp = AcpiPsGetDepthNext (NULL, Op);
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
+
+ NextOp = NextOp->Common.Next;
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
+ return (AE_OK);
+
+
+ case AML_PROCESSOR_OP:
+
+ /* Mark the next three Ops as part of the parameter list */
+
+ AcpiOsPrintf (", ");
+ NextOp = AcpiPsGetDepthNext (NULL, Op);
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
+
+ NextOp = NextOp->Common.Next;
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
+
+ NextOp = NextOp->Common.Next;
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
+ return (AE_OK);
+
+
+ case AML_MUTEX_OP:
+ case AML_DATA_REGION_OP:
+
+ AcpiOsPrintf (", ");
+ return (AE_OK);
+
+
+ case AML_EVENT_OP:
+ case AML_ALIAS_OP:
+
+ return (AE_OK);
+
+
+ case AML_SCOPE_OP:
+ case AML_DEVICE_OP:
+ case AML_THERMAL_ZONE_OP:
+
+ AcpiOsPrintf (")");
+ break;
+
+
+ default:
+
+ AcpiOsPrintf ("*** Unhandled named opcode %X\n", Op->Common.AmlOpcode);
+ break;
+ }
+ }
+
+ else switch (Op->Common.AmlOpcode)
+ {
+ case AML_FIELD_OP:
+ case AML_BANK_FIELD_OP:
+ case AML_INDEX_FIELD_OP:
+
+ Info->BitOffset = 0;
+
+ /* Name of the parent OperationRegion */
+
+ NextOp = AcpiPsGetDepthNext (NULL, Op);
+ AcpiDmNamestring (NextOp->Common.Value.Name);
+ AcpiOsPrintf (", ");
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_BANK_FIELD_OP:
+
+ /* Namestring - Bank Name */
+
+ NextOp = AcpiPsGetDepthNext (NULL, NextOp);
+ AcpiDmNamestring (NextOp->Common.Value.Name);
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+ AcpiOsPrintf (", ");
+
+ /*
+ * Bank Value. This is a TermArg in the middle of the parameter
+ * list, must handle it here.
+ *
+ * Disassemble the TermArg parse tree. ACPI_PARSEOP_PARAMLIST
+ * eliminates newline in the output.
+ */
+ NextOp = NextOp->Common.Next;
+
+ Info->Flags = ACPI_PARSEOP_PARAMLIST;
+ AcpiDmWalkParseTree (NextOp, AcpiDmDescendingOp, AcpiDmAscendingOp, Info);
+ Info->Flags = 0;
+ Info->Level = Level;
+
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+ AcpiOsPrintf (", ");
+ break;
+
+ case AML_INDEX_FIELD_OP:
+
+ /* Namestring - Data Name */
+
+ NextOp = AcpiPsGetDepthNext (NULL, NextOp);
+ AcpiDmNamestring (NextOp->Common.Value.Name);
+ AcpiOsPrintf (", ");
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+ break;
+
+ default:
+
+ break;
+ }
+
+ AcpiDmFieldFlags (NextOp);
+ break;
+
+
+ case AML_BUFFER_OP:
+
+ /* The next op is the size parameter */
+
+ NextOp = AcpiPsGetDepthNext (NULL, Op);
+ if (!NextOp)
+ {
+ /* Single-step support */
+
+ return (AE_OK);
+ }
+
+ if (Op->Common.DisasmOpcode == ACPI_DASM_RESOURCE)
+ {
+ /*
+ * We have a resource list. Don't need to output
+ * the buffer size Op. Open up a new block
+ */
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_IGNORE;
+ NextOp = NextOp->Common.Next;
+ AcpiOsPrintf (")\n");
+ AcpiDmIndent (Info->Level);
+ AcpiOsPrintf ("{\n");
+ return (AE_OK);
+ }
+
+ /* Normal Buffer, mark size as in the parameter list */
+
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
+ return (AE_OK);
+
+
+ case AML_VAR_PACKAGE_OP:
+ case AML_IF_OP:
+ case AML_WHILE_OP:
+
+ /* The next op is the size or predicate parameter */
+
+ NextOp = AcpiPsGetDepthNext (NULL, Op);
+ if (NextOp)
+ {
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
+ }
+ return (AE_OK);
+
+
+ case AML_PACKAGE_OP:
+
+ /* The next op is the size or predicate parameter */
+
+ NextOp = AcpiPsGetDepthNext (NULL, Op);
+ if (NextOp)
+ {
+ NextOp->Common.DisasmFlags |= ACPI_PARSEOP_PARAMLIST;
+ }
+ return (AE_OK);
+
+
+ case AML_MATCH_OP:
+
+ AcpiDmMatchOp (Op);
+ break;
+
+
+ default:
+
+ break;
+ }
+
+ if (AcpiDmBlockType (Op) & BLOCK_BRACE)
+ {
+ AcpiOsPrintf ("\n");
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("{\n");
+ }
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDmAscendingOp
+ *
+ * PARAMETERS: ASL_WALK_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Second visitation of a parse object, during ascent of parse
+ * tree. Close out any parameter lists and complete the opcode.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDmAscendingOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Level,
+ void *Context)
+{
+ ACPI_OP_WALK_INFO *Info = Context;
+
+
+ if (Op->Common.DisasmFlags & ACPI_PARSEOP_IGNORE)
+ {
+ /* Ignore this op -- it was handled elsewhere */
+
+ return (AE_OK);
+ }
+
+ if ((Level == 0) && (Op->Common.AmlOpcode == AML_SCOPE_OP))
+ {
+ /* Indicates the end of the current descriptor block (table) */
+
+ AcpiOsPrintf ("}\n\n");
+ return (AE_OK);
+ }
+
+ switch (AcpiDmBlockType (Op))
+ {
+ case BLOCK_PAREN:
+
+ /* Completed an op that has arguments, add closing paren */
+
+ AcpiOsPrintf (")");
+
+ /* Could be a nested operator, check if comma required */
+
+ if (!AcpiDmCommaIfListMember (Op))
+ {
+ if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
+ (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) &&
+ (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
+ {
+ /*
+ * This is a first-level element of a term list
+ * start a new line
+ */
+ if (!(Info->Flags & ACPI_PARSEOP_PARAMLIST))
+ {
+ AcpiOsPrintf ("\n");
+ }
+ }
+ }
+ break;
+
+
+ case BLOCK_BRACE:
+ case (BLOCK_BRACE | BLOCK_PAREN):
+
+ /* Completed an op that has a term list, add closing brace */
+
+ if (Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST)
+ {
+ AcpiOsPrintf ("}");
+ }
+ else
+ {
+ AcpiDmIndent (Level);
+ AcpiOsPrintf ("}");
+ }
+
+ AcpiDmCommaIfListMember (Op);
+
+ if (AcpiDmBlockType (Op->Common.Parent) != BLOCK_PAREN)
+ {
+ AcpiOsPrintf ("\n");
+ if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_EMPTY_TERMLIST))
+ {
+ if ((Op->Common.AmlOpcode == AML_IF_OP) &&
+ (Op->Common.Next) &&
+ (Op->Common.Next->Common.AmlOpcode == AML_ELSE_OP))
+ {
+ break;
+ }
+
+ if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
+ (!Op->Common.Next))
+ {
+ break;
+ }
+ AcpiOsPrintf ("\n");
+ }
+ }
+ break;
+
+
+ case BLOCK_NONE:
+ default:
+
+ /* Could be a nested operator, check if comma required */
+
+ if (!AcpiDmCommaIfListMember (Op))
+ {
+ if ((AcpiDmBlockType (Op->Common.Parent) & BLOCK_BRACE) &&
+ (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)) &&
+ (Op->Common.AmlOpcode != AML_INT_BYTELIST_OP))
+ {
+ /*
+ * This is a first-level element of a term list
+ * start a new line
+ */
+ AcpiOsPrintf ("\n");
+ }
+ }
+ else if (Op->Common.Parent)
+ {
+ switch (Op->Common.Parent->Common.AmlOpcode)
+ {
+ case AML_PACKAGE_OP:
+ case AML_VAR_PACKAGE_OP:
+
+ if (!(Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
+ {
+ AcpiOsPrintf ("\n");
+ }
+ break;
+
+ default:
+
+ break;
+ }
+ }
+ break;
+ }
+
+ if (Op->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST)
+ {
+ if ((Op->Common.Next) &&
+ (Op->Common.Next->Common.DisasmFlags & ACPI_PARSEOP_PARAMLIST))
+ {
+ return (AE_OK);
+ }
+
+ /*
+ * Just completed a parameter node for something like "Buffer (param)".
+ * Close the paren and open up the term list block with a brace
+ */
+ if (Op->Common.Next)
+ {
+ AcpiOsPrintf (")\n");
+ AcpiDmIndent (Level - 1);
+ AcpiOsPrintf ("{\n");
+ }
+ else
+ {
+ Op->Common.Parent->Common.DisasmFlags |=
+ ACPI_PARSEOP_EMPTY_TERMLIST;
+ AcpiOsPrintf (") {");
+ }
+ }
+
+ if ((Op->Common.AmlOpcode == AML_NAME_OP) ||
+ (Op->Common.AmlOpcode == AML_RETURN_OP))
+ {
+ Info->Level++;
+ }
+ return (AE_OK);
+}
+
+
+#endif /* ACPI_DISASSEMBLER */
diff --git a/sys/contrib/dev/acpica/dsfield.c b/sys/contrib/dev/acpica/dsfield.c
new file mode 100644
index 0000000..a13fe1d
--- /dev/null
+++ b/sys/contrib/dev/acpica/dsfield.c
@@ -0,0 +1,748 @@
+/******************************************************************************
+ *
+ * Module Name: dsfield - Dispatcher field routines
+ * $Revision: 1.84 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __DSFIELD_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acparser.h>
+
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dsfield")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDsGetFieldNames (
+ ACPI_CREATE_FIELD_INFO *Info,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Arg);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsCreateBufferField
+ *
+ * PARAMETERS: Op - Current parse op (CreateXXField)
+ * WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute the CreateField operators:
+ * CreateBitFieldOp,
+ * CreateByteFieldOp,
+ * CreateWordFieldOp,
+ * CreateDWordFieldOp,
+ * CreateQWordFieldOp,
+ * CreateFieldOp (all of which define a field in a buffer)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsCreateBufferField (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_PARSE_OBJECT *Arg;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *SecondDesc = NULL;
+ UINT32 Flags;
+
+
+ ACPI_FUNCTION_TRACE (DsCreateBufferField);
+
+
+ /* Get the NameString argument */
+
+ if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
+ {
+ Arg = AcpiPsGetArg (Op, 3);
+ }
+ else
+ {
+ /* Create Bit/Byte/Word/Dword field */
+
+ Arg = AcpiPsGetArg (Op, 2);
+ }
+
+ if (!Arg)
+ {
+ return_ACPI_STATUS (AE_AML_NO_OPERAND);
+ }
+
+ if (WalkState->DeferredNode)
+ {
+ Node = WalkState->DeferredNode;
+ Status = AE_OK;
+ }
+ else
+ {
+ /*
+ * During the load phase, we want to enter the name of the field into
+ * the namespace. During the execute phase (when we evaluate the size
+ * operand), we want to lookup the name
+ */
+ if (WalkState->ParseFlags & ACPI_PARSE_EXECUTE)
+ {
+ Flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE;
+ }
+ else
+ {
+ Flags = ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
+ ACPI_NS_ERROR_IF_FOUND;
+ }
+
+ /*
+ * Enter the NameString into the namespace
+ */
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
+ ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS1,
+ Flags, WalkState, &(Node));
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * We could put the returned object (Node) on the object stack for later,
+ * but for now, we will put it in the "op" object that the parser uses,
+ * so we can get it again at the end of this scope
+ */
+ Op->Common.Node = Node;
+
+ /*
+ * If there is no object attached to the node, this node was just created
+ * and we need to create the field object. Otherwise, this was a lookup
+ * of an existing node and we don't want to create the field object again.
+ */
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (ObjDesc)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * The Field definition is not fully parsed at this time.
+ * (We must save the address of the AML for the buffer and index operands)
+ */
+
+ /* Create the buffer field object */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER_FIELD);
+ if (!ObjDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /*
+ * Remember location in AML stream of the field unit
+ * opcode and operands -- since the buffer and index
+ * operands must be evaluated.
+ */
+ SecondDesc = ObjDesc->Common.NextObject;
+ SecondDesc->Extra.AmlStart = Op->Named.Data;
+ SecondDesc->Extra.AmlLength = Op->Named.Length;
+ ObjDesc->BufferField.Node = Node;
+
+ /* Attach constructed field descriptors to parent node */
+
+ Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_BUFFER_FIELD);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+
+Cleanup:
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsGetFieldNames
+ *
+ * PARAMETERS: Info - CreateField info structure
+ * ` WalkState - Current method state
+ * Arg - First parser arg for the field name list
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Process all named fields in a field declaration. Names are
+ * entered into the namespace.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDsGetFieldNames (
+ ACPI_CREATE_FIELD_INFO *Info,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Arg)
+{
+ ACPI_STATUS Status;
+ ACPI_INTEGER Position;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsGetFieldNames, Info);
+
+
+ /* First field starts at bit zero */
+
+ Info->FieldBitPosition = 0;
+
+ /* Process all elements in the field list (of parse nodes) */
+
+ while (Arg)
+ {
+ /*
+ * Three types of field elements are handled:
+ * 1) Offset - specifies a bit offset
+ * 2) AccessAs - changes the access mode
+ * 3) Name - Enters a new named field into the namespace
+ */
+ switch (Arg->Common.AmlOpcode)
+ {
+ case AML_INT_RESERVEDFIELD_OP:
+
+ Position = (ACPI_INTEGER) Info->FieldBitPosition
+ + (ACPI_INTEGER) Arg->Common.Value.Size;
+
+ if (Position > ACPI_UINT32_MAX)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Bit offset within field too large (> 0xFFFFFFFF)"));
+ return_ACPI_STATUS (AE_SUPPORT);
+ }
+
+ Info->FieldBitPosition = (UINT32) Position;
+ break;
+
+
+ case AML_INT_ACCESSFIELD_OP:
+
+ /*
+ * Get a new AccessType and AccessAttribute -- to be used for all
+ * field units that follow, until field end or another AccessAs
+ * keyword.
+ *
+ * In FieldFlags, preserve the flag bits other than the
+ * ACCESS_TYPE bits
+ */
+ Info->FieldFlags = (UINT8)
+ ((Info->FieldFlags & ~(AML_FIELD_ACCESS_TYPE_MASK)) |
+ ((UINT8) ((UINT32) Arg->Common.Value.Integer >> 8)));
+
+ Info->Attribute = (UINT8) (Arg->Common.Value.Integer);
+ break;
+
+
+ case AML_INT_NAMEDFIELD_OP:
+
+ /* Lookup the name */
+
+ Status = AcpiNsLookup (WalkState->ScopeInfo,
+ (char *) &Arg->Named.Name,
+ Info->FieldType, ACPI_IMODE_EXECUTE,
+ ACPI_NS_DONT_OPEN_SCOPE,
+ WalkState, &Info->FieldNode);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE ((char *) &Arg->Named.Name, Status);
+ if (Status != AE_ALREADY_EXISTS)
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Already exists, ignore error */
+ }
+ else
+ {
+ Arg->Common.Node = Info->FieldNode;
+ Info->FieldBitLength = Arg->Common.Value.Size;
+
+ /* Create and initialize an object for the new Field Node */
+
+ Status = AcpiExPrepFieldValue (Info);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Keep track of bit position for the next field */
+
+ Position = (ACPI_INTEGER) Info->FieldBitPosition
+ + (ACPI_INTEGER) Arg->Common.Value.Size;
+
+ if (Position > ACPI_UINT32_MAX)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Field [%4.4s] bit offset too large (> 0xFFFFFFFF)",
+ ACPI_CAST_PTR (char, &Info->FieldNode->Name)));
+ return_ACPI_STATUS (AE_SUPPORT);
+ }
+
+ Info->FieldBitPosition += Info->FieldBitLength;
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO,
+ "Invalid opcode in field list: %X",
+ Arg->Common.AmlOpcode));
+ return_ACPI_STATUS (AE_AML_BAD_OPCODE);
+ }
+
+ Arg = Arg->Common.Next;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsCreateField
+ *
+ * PARAMETERS: Op - Op containing the Field definition and args
+ * RegionNode - Object for the containing Operation Region
+ * ` WalkState - Current method state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new field in the specified operation region
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsCreateField (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_NAMESPACE_NODE *RegionNode,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *Arg;
+ ACPI_CREATE_FIELD_INFO Info;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsCreateField, Op);
+
+
+ /* First arg is the name of the parent OpRegion (must already exist) */
+
+ Arg = Op->Common.Value.Arg;
+ if (!RegionNode)
+ {
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
+ ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
+ ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Second arg is the field flags */
+
+ Arg = Arg->Common.Next;
+ Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
+ Info.Attribute = 0;
+
+ /* Each remaining arg is a Named Field */
+
+ Info.FieldType = ACPI_TYPE_LOCAL_REGION_FIELD;
+ Info.RegionNode = RegionNode;
+
+ Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsInitFieldObjects
+ *
+ * PARAMETERS: Op - Op containing the Field definition and args
+ * ` WalkState - Current method state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: For each "Field Unit" name in the argument list that is
+ * part of the field declaration, enter the name into the
+ * namespace.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsInitFieldObjects (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *Arg = NULL;
+ ACPI_NAMESPACE_NODE *Node;
+ UINT8 Type = 0;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsInitFieldObjects, Op);
+
+
+ switch (WalkState->Opcode)
+ {
+ case AML_FIELD_OP:
+ Arg = AcpiPsGetArg (Op, 2);
+ Type = ACPI_TYPE_LOCAL_REGION_FIELD;
+ break;
+
+ case AML_BANK_FIELD_OP:
+ Arg = AcpiPsGetArg (Op, 4);
+ Type = ACPI_TYPE_LOCAL_BANK_FIELD;
+ break;
+
+ case AML_INDEX_FIELD_OP:
+ Arg = AcpiPsGetArg (Op, 3);
+ Type = ACPI_TYPE_LOCAL_INDEX_FIELD;
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Walk the list of entries in the FieldList
+ */
+ while (Arg)
+ {
+ /* Ignore OFFSET and ACCESSAS terms here */
+
+ if (Arg->Common.AmlOpcode == AML_INT_NAMEDFIELD_OP)
+ {
+ Status = AcpiNsLookup (WalkState->ScopeInfo,
+ (char *) &Arg->Named.Name,
+ Type, ACPI_IMODE_LOAD_PASS1,
+ ACPI_NS_NO_UPSEARCH | ACPI_NS_DONT_OPEN_SCOPE |
+ ACPI_NS_ERROR_IF_FOUND,
+ WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE ((char *) &Arg->Named.Name, Status);
+ if (Status != AE_ALREADY_EXISTS)
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Name already exists, just ignore this error */
+
+ Status = AE_OK;
+ }
+
+ Arg->Common.Node = Node;
+ }
+
+ /* Move to next field in the list */
+
+ Arg = Arg->Common.Next;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsCreateBankField
+ *
+ * PARAMETERS: Op - Op containing the Field definition and args
+ * RegionNode - Object for the containing Operation Region
+ * ` WalkState - Current method state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new bank field in the specified operation region
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsCreateBankField (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_NAMESPACE_NODE *RegionNode,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *Arg;
+ ACPI_CREATE_FIELD_INFO Info;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsCreateBankField, Op);
+
+
+ /* First arg is the name of the parent OpRegion (must already exist) */
+
+ Arg = Op->Common.Value.Arg;
+ if (!RegionNode)
+ {
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.Name,
+ ACPI_TYPE_REGION, ACPI_IMODE_EXECUTE,
+ ACPI_NS_SEARCH_PARENT, WalkState, &RegionNode);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (Arg->Common.Value.Name, Status);
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Second arg is the Bank Register (Field) (must already exist) */
+
+ Arg = Arg->Common.Next;
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
+ ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Third arg is the BankValue */
+
+ /* TBD: This arg is a TermArg, not a constant, and must be evaluated */
+
+ Arg = Arg->Common.Next;
+
+ /* Currently, only the following constants are supported */
+
+ switch (Arg->Common.AmlOpcode)
+ {
+ case AML_ZERO_OP:
+ Info.BankValue = 0;
+ break;
+
+ case AML_ONE_OP:
+ Info.BankValue = 1;
+ break;
+
+ case AML_BYTE_OP:
+ case AML_WORD_OP:
+ case AML_DWORD_OP:
+ case AML_QWORD_OP:
+ Info.BankValue = (UINT32) Arg->Common.Value.Integer;
+ break;
+
+ default:
+ Info.BankValue = 0;
+ ACPI_ERROR ((AE_INFO, "Non-constant BankValue for BankField is not implemented"));
+ }
+
+ /* Fourth arg is the field flags */
+
+ Arg = Arg->Common.Next;
+ Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
+
+ /* Each remaining arg is a Named Field */
+
+ Info.FieldType = ACPI_TYPE_LOCAL_BANK_FIELD;
+ Info.RegionNode = RegionNode;
+
+ Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsCreateIndexField
+ *
+ * PARAMETERS: Op - Op containing the Field definition and args
+ * RegionNode - Object for the containing Operation Region
+ * ` WalkState - Current method state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new index field in the specified operation region
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsCreateIndexField (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_NAMESPACE_NODE *RegionNode,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *Arg;
+ ACPI_CREATE_FIELD_INFO Info;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsCreateIndexField, Op);
+
+
+ /* First arg is the name of the Index register (must already exist) */
+
+ Arg = Op->Common.Value.Arg;
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
+ ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_SEARCH_PARENT, WalkState, &Info.RegisterNode);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Second arg is the data register (must already exist) */
+
+ Arg = Arg->Common.Next;
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
+ ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_SEARCH_PARENT, WalkState, &Info.DataRegisterNode);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Next arg is the field flags */
+
+ Arg = Arg->Common.Next;
+ Info.FieldFlags = (UINT8) Arg->Common.Value.Integer;
+
+ /* Each remaining arg is a Named Field */
+
+ Info.FieldType = ACPI_TYPE_LOCAL_INDEX_FIELD;
+ Info.RegionNode = RegionNode;
+
+ Status = AcpiDsGetFieldNames (&Info, WalkState, Arg->Common.Next);
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/dsinit.c b/sys/contrib/dev/acpica/dsinit.c
new file mode 100644
index 0000000..32335e5
--- /dev/null
+++ b/sys/contrib/dev/acpica/dsinit.c
@@ -0,0 +1,299 @@
+/******************************************************************************
+ *
+ * Module Name: dsinit - Object initialization namespace walk
+ * $Revision: 1.28 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __DSINIT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/actables.h>
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dsinit")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDsInitOneObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsInitOneObject
+ *
+ * PARAMETERS: ObjHandle - Node for the object
+ * Level - Current nesting level
+ * Context - Points to a init info struct
+ * ReturnValue - Not used
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Callback from AcpiWalkNamespace. Invoked for every object
+ * within the namespace.
+ *
+ * Currently, the only objects that require initialization are:
+ * 1) Methods
+ * 2) Operation Regions
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDsInitOneObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_INIT_WALK_INFO *Info = (ACPI_INIT_WALK_INFO *) Context;
+ ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
+ ACPI_OBJECT_TYPE Type;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * We are only interested in NS nodes owned by the table that
+ * was just loaded
+ */
+ if (Node->OwnerId != Info->OwnerId)
+ {
+ return (AE_OK);
+ }
+
+ Info->ObjectCount++;
+
+ /* And even then, we are only interested in a few object types */
+
+ Type = AcpiNsGetType (ObjHandle);
+
+ switch (Type)
+ {
+ case ACPI_TYPE_REGION:
+
+ Status = AcpiDsInitializeRegion (ObjHandle);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "During Region initialization %p [%4.4s]",
+ ObjHandle, AcpiUtGetNodeName (ObjHandle)));
+ }
+
+ Info->OpRegionCount++;
+ break;
+
+
+ case ACPI_TYPE_METHOD:
+
+ Info->MethodCount++;
+ break;
+
+
+ case ACPI_TYPE_DEVICE:
+
+ Info->DeviceCount++;
+ break;
+
+
+ default:
+ break;
+ }
+
+ /*
+ * We ignore errors from above, and always return OK, since
+ * we don't want to abort the walk on a single error.
+ */
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsInitializeObjects
+ *
+ * PARAMETERS: TableDesc - Descriptor for parent ACPI table
+ * StartNode - Root of subtree to be initialized.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Walk the namespace starting at "StartNode" and perform any
+ * necessary initialization on the objects found therein
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsInitializeObjects (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_NAMESPACE_NODE *StartNode)
+{
+ ACPI_STATUS Status;
+ ACPI_INIT_WALK_INFO Info;
+ ACPI_TABLE_HEADER *Table;
+ ACPI_OWNER_ID OwnerId;
+
+
+ ACPI_FUNCTION_TRACE (DsInitializeObjects);
+
+
+ Status = AcpiTbGetOwnerId (TableIndex, &OwnerId);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "**** Starting initialization of namespace objects ****\n"));
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "Parsing all Control Methods:"));
+
+ Info.MethodCount = 0;
+ Info.OpRegionCount = 0;
+ Info.ObjectCount = 0;
+ Info.DeviceCount = 0;
+ Info.TableIndex = TableIndex;
+ Info.OwnerId = OwnerId;
+
+ /* Walk entire namespace from the supplied root */
+
+ Status = AcpiWalkNamespace (ACPI_TYPE_ANY, StartNode, ACPI_UINT32_MAX,
+ AcpiDsInitOneObject, &Info, NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "During WalkNamespace"));
+ }
+
+ Status = AcpiGetTableByIndex (TableIndex, &Table);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
+ "\nTable [%4.4s](id %4.4X) - %hd Objects with %hd Devices %hd Methods %hd Regions\n",
+ Table->Signature, OwnerId, Info.ObjectCount,
+ Info.DeviceCount, Info.MethodCount, Info.OpRegionCount));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "%hd Methods, %hd Regions\n", Info.MethodCount, Info.OpRegionCount));
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/dsmethod.c b/sys/contrib/dev/acpica/dsmethod.c
new file mode 100644
index 0000000..514f3a1
--- /dev/null
+++ b/sys/contrib/dev/acpica/dsmethod.c
@@ -0,0 +1,754 @@
+/******************************************************************************
+ *
+ * Module Name: dsmethod - Parser/Interpreter interface - control method parsing
+ * $Revision: 1.136 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __DSMETHOD_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdisasm.h>
+
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dsmethod")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDsCreateMethodMutex (
+ ACPI_OPERAND_OBJECT *MethodDesc);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsMethodError
+ *
+ * PARAMETERS: Status - Execution status
+ * WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Called on method error. Invoke the global exception handler if
+ * present, dump the method data if the disassembler is configured
+ *
+ * Note: Allows the exception handler to change the status code
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsMethodError (
+ ACPI_STATUS Status,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Ignore AE_OK and control exception codes */
+
+ if (ACPI_SUCCESS (Status) ||
+ (Status & AE_CODE_CONTROL))
+ {
+ return (Status);
+ }
+
+ /* Invoke the global exception handler */
+
+ if (AcpiGbl_ExceptionHandler)
+ {
+ /* Exit the interpreter, allow handler to execute methods */
+
+ AcpiExExitInterpreter ();
+
+ /*
+ * Handler can map the exception code to anything it wants, including
+ * AE_OK, in which case the executing method will not be aborted.
+ */
+ Status = AcpiGbl_ExceptionHandler (Status,
+ WalkState->MethodNode ?
+ WalkState->MethodNode->Name.Integer : 0,
+ WalkState->Opcode, WalkState->AmlOffset, NULL);
+ (void) AcpiExEnterInterpreter ();
+ }
+
+#ifdef ACPI_DISASSEMBLER
+ if (ACPI_FAILURE (Status))
+ {
+ /* Display method locals/args if disassembler is present */
+
+ AcpiDmDumpMethodInfo (Status, WalkState, WalkState->Op);
+ }
+#endif
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsCreateMethodMutex
+ *
+ * PARAMETERS: ObjDesc - The method object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a mutex object for a serialized control method
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDsCreateMethodMutex (
+ ACPI_OPERAND_OBJECT *MethodDesc)
+{
+ ACPI_OPERAND_OBJECT *MutexDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (DsCreateMethodMutex);
+
+
+ /* Create the new mutex object */
+
+ MutexDesc = AcpiUtCreateInternalObject (ACPI_TYPE_MUTEX);
+ if (!MutexDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Create the actual OS Mutex */
+
+ Status = AcpiOsCreateMutex (&MutexDesc->Mutex.OsMutex);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ MutexDesc->Mutex.SyncLevel = MethodDesc->Method.SyncLevel;
+ MethodDesc->Method.Mutex = MutexDesc;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsBeginMethodExecution
+ *
+ * PARAMETERS: MethodNode - Node of the method
+ * ObjDesc - The method object
+ * WalkState - current state, NULL if not yet executing
+ * a method.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Prepare a method for execution. Parses the method if necessary,
+ * increments the thread count, and waits at the method semaphore
+ * for clearance to execute.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsBeginMethodExecution (
+ ACPI_NAMESPACE_NODE *MethodNode,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsBeginMethodExecution, MethodNode);
+
+
+ if (!MethodNode)
+ {
+ return_ACPI_STATUS (AE_NULL_ENTRY);
+ }
+
+ /* Prevent wraparound of thread count */
+
+ if (ObjDesc->Method.ThreadCount == ACPI_UINT8_MAX)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Method reached maximum reentrancy limit (255)"));
+ return_ACPI_STATUS (AE_AML_METHOD_LIMIT);
+ }
+
+ /*
+ * If this method is serialized, we need to acquire the method mutex.
+ */
+ if (ObjDesc->Method.MethodFlags & AML_METHOD_SERIALIZED)
+ {
+ /*
+ * Create a mutex for the method if it is defined to be Serialized
+ * and a mutex has not already been created. We defer the mutex creation
+ * until a method is actually executed, to minimize the object count
+ */
+ if (!ObjDesc->Method.Mutex)
+ {
+ Status = AcpiDsCreateMethodMutex (ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * The CurrentSyncLevel (per-thread) must be less than or equal to
+ * the sync level of the method. This mechanism provides some
+ * deadlock prevention
+ *
+ * Top-level method invocation has no walk state at this point
+ */
+ if (WalkState &&
+ (WalkState->Thread->CurrentSyncLevel > ObjDesc->Method.Mutex->Mutex.SyncLevel))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Cannot acquire Mutex for method [%4.4s], current SyncLevel is too large (%d)",
+ AcpiUtGetNodeName (MethodNode),
+ WalkState->Thread->CurrentSyncLevel));
+
+ return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
+ }
+
+ /*
+ * Obtain the method mutex if necessary. Do not acquire mutex for a
+ * recursive call.
+ */
+ if (!WalkState ||
+ !ObjDesc->Method.Mutex->Mutex.ThreadId ||
+ (WalkState->Thread->ThreadId != ObjDesc->Method.Mutex->Mutex.ThreadId))
+ {
+ /*
+ * Acquire the method mutex. This releases the interpreter if we
+ * block (and reacquires it before it returns)
+ */
+ Status = AcpiExSystemWaitMutex (ObjDesc->Method.Mutex->Mutex.OsMutex,
+ ACPI_WAIT_FOREVER);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Update the mutex and walk info and save the original SyncLevel */
+
+ if (WalkState)
+ {
+ ObjDesc->Method.Mutex->Mutex.OriginalSyncLevel =
+ WalkState->Thread->CurrentSyncLevel;
+
+ ObjDesc->Method.Mutex->Mutex.ThreadId = WalkState->Thread->ThreadId;
+ WalkState->Thread->CurrentSyncLevel = ObjDesc->Method.SyncLevel;
+ }
+ else
+ {
+ ObjDesc->Method.Mutex->Mutex.OriginalSyncLevel =
+ ObjDesc->Method.Mutex->Mutex.SyncLevel;
+ }
+ }
+
+ /* Always increase acquisition depth */
+
+ ObjDesc->Method.Mutex->Mutex.AcquisitionDepth++;
+ }
+
+ /*
+ * Allocate an Owner ID for this method, only if this is the first thread
+ * to begin concurrent execution. We only need one OwnerId, even if the
+ * method is invoked recursively.
+ */
+ if (!ObjDesc->Method.OwnerId)
+ {
+ Status = AcpiUtAllocateOwnerId (&ObjDesc->Method.OwnerId);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+ }
+
+ /*
+ * Increment the method parse tree thread count since it has been
+ * reentered one more time (even if it is the same thread)
+ */
+ ObjDesc->Method.ThreadCount++;
+ return_ACPI_STATUS (Status);
+
+
+Cleanup:
+ /* On error, must release the method mutex (if present) */
+
+ if (ObjDesc->Method.Mutex)
+ {
+ AcpiOsReleaseMutex (ObjDesc->Method.Mutex->Mutex.OsMutex);
+ }
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsCallControlMethod
+ *
+ * PARAMETERS: Thread - Info for this thread
+ * ThisWalkState - Current walk state
+ * Op - Current Op to be walked
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Transfer execution to a called control method
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsCallControlMethod (
+ ACPI_THREAD_STATE *Thread,
+ ACPI_WALK_STATE *ThisWalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *MethodNode;
+ ACPI_WALK_STATE *NextWalkState = NULL;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_EVALUATE_INFO *Info;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsCallControlMethod, ThisWalkState);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Calling method %p, currentstate=%p\n",
+ ThisWalkState->PrevOp, ThisWalkState));
+
+ /*
+ * Get the namespace entry for the control method we are about to call
+ */
+ MethodNode = ThisWalkState->MethodCallNode;
+ if (!MethodNode)
+ {
+ return_ACPI_STATUS (AE_NULL_ENTRY);
+ }
+
+ ObjDesc = AcpiNsGetAttachedObject (MethodNode);
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NULL_OBJECT);
+ }
+
+ /* Init for new method, possibly wait on method mutex */
+
+ Status = AcpiDsBeginMethodExecution (MethodNode, ObjDesc,
+ ThisWalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Begin method parse/execution. Create a new walk state */
+
+ NextWalkState = AcpiDsCreateWalkState (ObjDesc->Method.OwnerId,
+ NULL, ObjDesc, Thread);
+ if (!NextWalkState)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /*
+ * The resolved arguments were put on the previous walk state's operand
+ * stack. Operands on the previous walk state stack always
+ * start at index 0. Also, null terminate the list of arguments
+ */
+ ThisWalkState->Operands [ThisWalkState->NumOperands] = NULL;
+
+ /*
+ * Allocate and initialize the evaluation information block
+ * TBD: this is somewhat inefficient, should change interface to
+ * DsInitAmlWalk. For now, keeps this struct off the CPU stack
+ */
+ Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
+ if (!Info)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Info->Parameters = &ThisWalkState->Operands[0];
+ Info->ParameterType = ACPI_PARAM_ARGS;
+
+ Status = AcpiDsInitAmlWalk (NextWalkState, NULL, MethodNode,
+ ObjDesc->Method.AmlStart, ObjDesc->Method.AmlLength,
+ Info, ACPI_IMODE_EXECUTE);
+
+ ACPI_FREE (Info);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /*
+ * Delete the operands on the previous walkstate operand stack
+ * (they were copied to new objects)
+ */
+ for (i = 0; i < ObjDesc->Method.ParamCount; i++)
+ {
+ AcpiUtRemoveReference (ThisWalkState->Operands [i]);
+ ThisWalkState->Operands [i] = NULL;
+ }
+
+ /* Clear the operand stack */
+
+ ThisWalkState->NumOperands = 0;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "**** Begin nested execution of [%4.4s] **** WalkState=%p\n",
+ MethodNode->Name.Ascii, NextWalkState));
+
+ /* Invoke an internal method if necessary */
+
+ if (ObjDesc->Method.MethodFlags & AML_METHOD_INTERNAL_ONLY)
+ {
+ Status = ObjDesc->Method.Implementation (NextWalkState);
+ }
+
+ return_ACPI_STATUS (Status);
+
+
+Cleanup:
+
+ /* On error, we must terminate the method properly */
+
+ AcpiDsTerminateControlMethod (ObjDesc, NextWalkState);
+ if (NextWalkState)
+ {
+ AcpiDsDeleteWalkState (NextWalkState);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsRestartControlMethod
+ *
+ * PARAMETERS: WalkState - State for preempted method (caller)
+ * ReturnDesc - Return value from the called method
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Restart a method that was preempted by another (nested) method
+ * invocation. Handle the return value (if any) from the callee.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsRestartControlMethod (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT *ReturnDesc)
+{
+ ACPI_STATUS Status;
+ int SameAsImplicitReturn;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsRestartControlMethod, WalkState);
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "****Restart [%4.4s] Op %p ReturnValueFromCallee %p\n",
+ AcpiUtGetNodeName (WalkState->MethodNode),
+ WalkState->MethodCallOp, ReturnDesc));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ " ReturnFromThisMethodUsed?=%X ResStack %p Walk %p\n",
+ WalkState->ReturnUsed,
+ WalkState->Results, WalkState));
+
+ /* Did the called method return a value? */
+
+ if (ReturnDesc)
+ {
+ /* Is the implicit return object the same as the return desc? */
+
+ SameAsImplicitReturn = (WalkState->ImplicitReturnObj == ReturnDesc);
+
+ /* Are we actually going to use the return value? */
+
+ if (WalkState->ReturnUsed)
+ {
+ /* Save the return value from the previous method */
+
+ Status = AcpiDsResultPush (ReturnDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ReturnDesc);
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Save as THIS method's return value in case it is returned
+ * immediately to yet another method
+ */
+ WalkState->ReturnDesc = ReturnDesc;
+ }
+
+ /*
+ * The following code is the optional support for the so-called
+ * "implicit return". Some AML code assumes that the last value of the
+ * method is "implicitly" returned to the caller, in the absence of an
+ * explicit return value.
+ *
+ * Just save the last result of the method as the return value.
+ *
+ * NOTE: this is optional because the ASL language does not actually
+ * support this behavior.
+ */
+ else if (!AcpiDsDoImplicitReturn (ReturnDesc, WalkState, FALSE) ||
+ SameAsImplicitReturn)
+ {
+ /*
+ * Delete the return value if it will not be used by the
+ * calling method or remove one reference if the explicit return
+ * is the same as the implicit return value.
+ */
+ AcpiUtRemoveReference (ReturnDesc);
+ }
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsTerminateControlMethod
+ *
+ * PARAMETERS: MethodDesc - Method object
+ * WalkState - State associated with the method
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Terminate a control method. Delete everything that the method
+ * created, delete all locals and arguments, and delete the parse
+ * tree if requested.
+ *
+ * MUTEX: Interpreter is locked
+ *
+ ******************************************************************************/
+
+void
+AcpiDsTerminateControlMethod (
+ ACPI_OPERAND_OBJECT *MethodDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsTerminateControlMethod, WalkState);
+
+
+ /* MethodDesc is required, WalkState is optional */
+
+ if (!MethodDesc)
+ {
+ return_VOID;
+ }
+
+ if (WalkState)
+ {
+ /* Delete all arguments and locals */
+
+ AcpiDsMethodDataDeleteAll (WalkState);
+ }
+
+ /*
+ * If method is serialized, release the mutex and restore the
+ * current sync level for this thread
+ */
+ if (MethodDesc->Method.Mutex)
+ {
+ /* Acquisition Depth handles recursive calls */
+
+ MethodDesc->Method.Mutex->Mutex.AcquisitionDepth--;
+ if (!MethodDesc->Method.Mutex->Mutex.AcquisitionDepth)
+ {
+ WalkState->Thread->CurrentSyncLevel =
+ MethodDesc->Method.Mutex->Mutex.OriginalSyncLevel;
+
+ AcpiOsReleaseMutex (MethodDesc->Method.Mutex->Mutex.OsMutex);
+ MethodDesc->Method.Mutex->Mutex.ThreadId = 0;
+ }
+ }
+
+ if (WalkState)
+ {
+ /*
+ * Delete any namespace objects created anywhere within
+ * the namespace by the execution of this method
+ */
+ AcpiNsDeleteNamespaceByOwner (MethodDesc->Method.OwnerId);
+ }
+
+ /* Decrement the thread count on the method */
+
+ if (MethodDesc->Method.ThreadCount)
+ {
+ MethodDesc->Method.ThreadCount--;
+ }
+ else
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Invalid zero thread count in method"));
+ }
+
+ /* Are there any other threads currently executing this method? */
+
+ if (MethodDesc->Method.ThreadCount)
+ {
+ /*
+ * Additional threads. Do not release the OwnerId in this case,
+ * we immediately reuse it for the next thread executing this method
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "*** Completed execution of one thread, %d threads remaining\n",
+ MethodDesc->Method.ThreadCount));
+ }
+ else
+ {
+ /* This is the only executing thread for this method */
+
+ /*
+ * Support to dynamically change a method from NotSerialized to
+ * Serialized if it appears that the method is incorrectly written and
+ * does not support multiple thread execution. The best example of this
+ * is if such a method creates namespace objects and blocks. A second
+ * thread will fail with an AE_ALREADY_EXISTS exception
+ *
+ * This code is here because we must wait until the last thread exits
+ * before creating the synchronization semaphore.
+ */
+ if ((MethodDesc->Method.MethodFlags & AML_METHOD_SERIALIZED) &&
+ (!MethodDesc->Method.Mutex))
+ {
+ Status = AcpiDsCreateMethodMutex (MethodDesc);
+ }
+
+ /* No more threads, we can free the OwnerId */
+
+ AcpiUtReleaseOwnerId (&MethodDesc->Method.OwnerId);
+ }
+
+ return_VOID;
+}
+
+
diff --git a/sys/contrib/dev/acpica/dsmthdat.c b/sys/contrib/dev/acpica/dsmthdat.c
new file mode 100644
index 0000000..10c1a9b
--- /dev/null
+++ b/sys/contrib/dev/acpica/dsmthdat.c
@@ -0,0 +1,844 @@
+/*******************************************************************************
+ *
+ * Module Name: dsmthdat - control method arguments and local variables
+ * $Revision: 1.92 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __DSMTHDAT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dsmthdat")
+
+/* Local prototypes */
+
+static void
+AcpiDsMethodDataDeleteValue (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState);
+
+static ACPI_STATUS
+AcpiDsMethodDataSetValue (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_OPERAND_OBJECT *Object,
+ ACPI_WALK_STATE *WalkState);
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+ACPI_OBJECT_TYPE
+AcpiDsMethodDataGetType (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState);
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsMethodDataInit
+ *
+ * PARAMETERS: WalkState - Current walk state object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initialize the data structures that hold the method's arguments
+ * and locals. The data struct is an array of namespace nodes for
+ * each - this allows RefOf and DeRefOf to work properly for these
+ * special data types.
+ *
+ * NOTES: WalkState fields are initialized to zero by the
+ * ACPI_ALLOCATE_ZEROED().
+ *
+ * A pseudo-Namespace Node is assigned to each argument and local
+ * so that RefOf() can return a pointer to the Node.
+ *
+ ******************************************************************************/
+
+void
+AcpiDsMethodDataInit (
+ ACPI_WALK_STATE *WalkState)
+{
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE (DsMethodDataInit);
+
+
+ /* Init the method arguments */
+
+ for (i = 0; i < ACPI_METHOD_NUM_ARGS; i++)
+ {
+ ACPI_MOVE_32_TO_32 (&WalkState->Arguments[i].Name, NAMEOF_ARG_NTE);
+ WalkState->Arguments[i].Name.Integer |= (i << 24);
+ WalkState->Arguments[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
+ WalkState->Arguments[i].Type = ACPI_TYPE_ANY;
+ WalkState->Arguments[i].Flags =
+ ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_ARG;
+ }
+
+ /* Init the method locals */
+
+ for (i = 0; i < ACPI_METHOD_NUM_LOCALS; i++)
+ {
+ ACPI_MOVE_32_TO_32 (&WalkState->LocalVariables[i].Name, NAMEOF_LOCAL_NTE);
+
+ WalkState->LocalVariables[i].Name.Integer |= (i << 24);
+ WalkState->LocalVariables[i].DescriptorType = ACPI_DESC_TYPE_NAMED;
+ WalkState->LocalVariables[i].Type = ACPI_TYPE_ANY;
+ WalkState->LocalVariables[i].Flags =
+ ANOBJ_END_OF_PEER_LIST | ANOBJ_METHOD_LOCAL;
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsMethodDataDeleteAll
+ *
+ * PARAMETERS: WalkState - Current walk state object
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Delete method locals and arguments. Arguments are only
+ * deleted if this method was called from another method.
+ *
+ ******************************************************************************/
+
+void
+AcpiDsMethodDataDeleteAll (
+ ACPI_WALK_STATE *WalkState)
+{
+ UINT32 Index;
+
+
+ ACPI_FUNCTION_TRACE (DsMethodDataDeleteAll);
+
+
+ /* Detach the locals */
+
+ for (Index = 0; Index < ACPI_METHOD_NUM_LOCALS; Index++)
+ {
+ if (WalkState->LocalVariables[Index].Object)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Local%d=%p\n",
+ Index, WalkState->LocalVariables[Index].Object));
+
+ /* Detach object (if present) and remove a reference */
+
+ AcpiNsDetachObject (&WalkState->LocalVariables[Index]);
+ }
+ }
+
+ /* Detach the arguments */
+
+ for (Index = 0; Index < ACPI_METHOD_NUM_ARGS; Index++)
+ {
+ if (WalkState->Arguments[Index].Object)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Deleting Arg%d=%p\n",
+ Index, WalkState->Arguments[Index].Object));
+
+ /* Detach object (if present) and remove a reference */
+
+ AcpiNsDetachObject (&WalkState->Arguments[Index]);
+ }
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsMethodDataInitArgs
+ *
+ * PARAMETERS: *Params - Pointer to a parameter list for the method
+ * MaxParamCount - The arg count for this method
+ * WalkState - Current walk state object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initialize arguments for a method. The parameter list is a list
+ * of ACPI operand objects, either null terminated or whose length
+ * is defined by MaxParamCount.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsMethodDataInitArgs (
+ ACPI_OPERAND_OBJECT **Params,
+ UINT32 MaxParamCount,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ UINT32 Index = 0;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsMethodDataInitArgs, Params);
+
+
+ if (!Params)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "No param list passed to method\n"));
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Copy passed parameters into the new method stack frame */
+
+ while ((Index < ACPI_METHOD_NUM_ARGS) &&
+ (Index < MaxParamCount) &&
+ Params[Index])
+ {
+ /*
+ * A valid parameter.
+ * Store the argument in the method/walk descriptor.
+ * Do not copy the arg in order to implement call by reference
+ */
+ Status = AcpiDsMethodDataSetValue (AML_ARG_OP, Index,
+ Params[Index], WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Index++;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%d args passed to method\n", Index));
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsMethodDataGetNode
+ *
+ * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
+ * Index - Which Local or Arg whose type to get
+ * WalkState - Current walk state object
+ * Node - Where the node is returned.
+ *
+ * RETURN: Status and node
+ *
+ * DESCRIPTION: Get the Node associated with a local or arg.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsMethodDataGetNode (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE **Node)
+{
+ ACPI_FUNCTION_TRACE (DsMethodDataGetNode);
+
+
+ /*
+ * Method Locals and Arguments are supported
+ */
+ switch (Opcode)
+ {
+ case AML_LOCAL_OP:
+
+ if (Index > ACPI_METHOD_MAX_LOCAL)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Local index %d is invalid (max %d)",
+ Index, ACPI_METHOD_MAX_LOCAL));
+ return_ACPI_STATUS (AE_AML_INVALID_INDEX);
+ }
+
+ /* Return a pointer to the pseudo-node */
+
+ *Node = &WalkState->LocalVariables[Index];
+ break;
+
+ case AML_ARG_OP:
+
+ if (Index > ACPI_METHOD_MAX_ARG)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Arg index %d is invalid (max %d)",
+ Index, ACPI_METHOD_MAX_ARG));
+ return_ACPI_STATUS (AE_AML_INVALID_INDEX);
+ }
+
+ /* Return a pointer to the pseudo-node */
+
+ *Node = &WalkState->Arguments[Index];
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO, "Opcode %d is invalid", Opcode));
+ return_ACPI_STATUS (AE_AML_BAD_OPCODE);
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsMethodDataSetValue
+ *
+ * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
+ * Index - Which Local or Arg to get
+ * Object - Object to be inserted into the stack entry
+ * WalkState - Current walk state object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Insert an object onto the method stack at entry Opcode:Index.
+ * Note: There is no "implicit conversion" for locals.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDsMethodDataSetValue (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_OPERAND_OBJECT *Object,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ACPI_FUNCTION_TRACE (DsMethodDataSetValue);
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "NewObj %p Opcode %X, Refs=%d [%s]\n", Object,
+ Opcode, Object->Common.ReferenceCount,
+ AcpiUtGetTypeName (Object->Common.Type)));
+
+ /* Get the namespace node for the arg/local */
+
+ Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Increment ref count so object can't be deleted while installed.
+ * NOTE: We do not copy the object in order to preserve the call by
+ * reference semantics of ACPI Control Method invocation.
+ * (See ACPI Specification 2.0C)
+ */
+ AcpiUtAddReference (Object);
+
+ /* Install the object */
+
+ Node->Object = Object;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsMethodDataGetValue
+ *
+ * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
+ * Index - Which localVar or argument to get
+ * WalkState - Current walk state object
+ * DestDesc - Where Arg or Local value is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Retrieve value of selected Arg or Local for this method
+ * Used only in AcpiExResolveToValue().
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsMethodDataGetValue (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT **DestDesc)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_OPERAND_OBJECT *Object;
+
+
+ ACPI_FUNCTION_TRACE (DsMethodDataGetValue);
+
+
+ /* Validate the object descriptor */
+
+ if (!DestDesc)
+ {
+ ACPI_ERROR ((AE_INFO, "Null object descriptor pointer"));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Get the namespace node for the arg/local */
+
+ Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Get the object from the node */
+
+ Object = Node->Object;
+
+ /* Examine the returned object, it must be valid. */
+
+ if (!Object)
+ {
+ /*
+ * Index points to uninitialized object.
+ * This means that either 1) The expected argument was
+ * not passed to the method, or 2) A local variable
+ * was referenced by the method (via the ASL)
+ * before it was initialized. Either case is an error.
+ */
+
+ /* If slack enabled, init the LocalX/ArgX to an Integer of value zero */
+
+ if (AcpiGbl_EnableInterpreterSlack)
+ {
+ Object = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!Object)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Object->Integer.Value = 0;
+ Node->Object = Object;
+ }
+
+ /* Otherwise, return the error */
+
+ else switch (Opcode)
+ {
+ case AML_ARG_OP:
+
+ ACPI_ERROR ((AE_INFO,
+ "Uninitialized Arg[%d] at node %p",
+ Index, Node));
+
+ return_ACPI_STATUS (AE_AML_UNINITIALIZED_ARG);
+
+ case AML_LOCAL_OP:
+
+ ACPI_ERROR ((AE_INFO,
+ "Uninitialized Local[%d] at node %p",
+ Index, Node));
+
+ return_ACPI_STATUS (AE_AML_UNINITIALIZED_LOCAL);
+
+ default:
+ ACPI_ERROR ((AE_INFO, "Not a Arg/Local opcode: %X", Opcode));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+ }
+
+ /*
+ * The Index points to an initialized and valid object.
+ * Return an additional reference to the object
+ */
+ *DestDesc = Object;
+ AcpiUtAddReference (Object);
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsMethodDataDeleteValue
+ *
+ * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
+ * Index - Which localVar or argument to delete
+ * WalkState - Current walk state object
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Delete the entry at Opcode:Index. Inserts
+ * a null into the stack slot after the object is deleted.
+ *
+ ******************************************************************************/
+
+static void
+AcpiDsMethodDataDeleteValue (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_OPERAND_OBJECT *Object;
+
+
+ ACPI_FUNCTION_TRACE (DsMethodDataDeleteValue);
+
+
+ /* Get the namespace node for the arg/local */
+
+ Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return_VOID;
+ }
+
+ /* Get the associated object */
+
+ Object = AcpiNsGetAttachedObject (Node);
+
+ /*
+ * Undefine the Arg or Local by setting its descriptor
+ * pointer to NULL. Locals/Args can contain both
+ * ACPI_OPERAND_OBJECTS and ACPI_NAMESPACE_NODEs
+ */
+ Node->Object = NULL;
+
+ if ((Object) &&
+ (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_OPERAND))
+ {
+ /*
+ * There is a valid object.
+ * Decrement the reference count by one to balance the
+ * increment when the object was stored.
+ */
+ AcpiUtRemoveReference (Object);
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsStoreObjectToLocal
+ *
+ * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
+ * Index - Which Local or Arg to set
+ * ObjDesc - Value to be stored
+ * WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Store a value in an Arg or Local. The ObjDesc is installed
+ * as the new value for the Arg or Local and the reference count
+ * for ObjDesc is incremented.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsStoreObjectToLocal (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_OPERAND_OBJECT *CurrentObjDesc;
+ ACPI_OPERAND_OBJECT *NewObjDesc;
+
+
+ ACPI_FUNCTION_TRACE (DsStoreObjectToLocal);
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Opcode=%X Index=%d Obj=%p\n",
+ Opcode, Index, ObjDesc));
+
+ /* Parameter validation */
+
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Get the namespace node for the arg/local */
+
+ Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ CurrentObjDesc = AcpiNsGetAttachedObject (Node);
+ if (CurrentObjDesc == ObjDesc)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p already installed!\n",
+ ObjDesc));
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * If the reference count on the object is more than one, we must
+ * take a copy of the object before we store. A reference count
+ * of exactly 1 means that the object was just created during the
+ * evaluation of an expression, and we can safely use it since it
+ * is not used anywhere else.
+ */
+ NewObjDesc = ObjDesc;
+ if (ObjDesc->Common.ReferenceCount > 1)
+ {
+ Status = AcpiUtCopyIobjectToIobject (ObjDesc, &NewObjDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * If there is an object already in this slot, we either
+ * have to delete it, or if this is an argument and there
+ * is an object reference stored there, we have to do
+ * an indirect store!
+ */
+ if (CurrentObjDesc)
+ {
+ /*
+ * Check for an indirect store if an argument
+ * contains an object reference (stored as an Node).
+ * We don't allow this automatic dereferencing for
+ * locals, since a store to a local should overwrite
+ * anything there, including an object reference.
+ *
+ * If both Arg0 and Local0 contain RefOf (Local4):
+ *
+ * Store (1, Arg0) - Causes indirect store to local4
+ * Store (1, Local0) - Stores 1 in local0, overwriting
+ * the reference to local4
+ * Store (1, DeRefof (Local0)) - Causes indirect store to local4
+ *
+ * Weird, but true.
+ */
+ if (Opcode == AML_ARG_OP)
+ {
+ /*
+ * If we have a valid reference object that came from RefOf(),
+ * do the indirect store
+ */
+ if ((ACPI_GET_DESCRIPTOR_TYPE (CurrentObjDesc) == ACPI_DESC_TYPE_OPERAND) &&
+ (CurrentObjDesc->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
+ (CurrentObjDesc->Reference.Opcode == AML_REF_OF_OP))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Arg (%p) is an ObjRef(Node), storing in node %p\n",
+ NewObjDesc, CurrentObjDesc));
+
+ /*
+ * Store this object to the Node (perform the indirect store)
+ * NOTE: No implicit conversion is performed, as per the ACPI
+ * specification rules on storing to Locals/Args.
+ */
+ Status = AcpiExStoreObjectToNode (NewObjDesc,
+ CurrentObjDesc->Reference.Object, WalkState,
+ ACPI_NO_IMPLICIT_CONVERSION);
+
+ /* Remove local reference if we copied the object above */
+
+ if (NewObjDesc != ObjDesc)
+ {
+ AcpiUtRemoveReference (NewObjDesc);
+ }
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * Delete the existing object
+ * before storing the new one
+ */
+ AcpiDsMethodDataDeleteValue (Opcode, Index, WalkState);
+ }
+
+ /*
+ * Install the Obj descriptor (*NewObjDesc) into
+ * the descriptor for the Arg or Local.
+ * (increments the object reference count by one)
+ */
+ Status = AcpiDsMethodDataSetValue (Opcode, Index, NewObjDesc, WalkState);
+
+ /* Remove local reference if we copied the object above */
+
+ if (NewObjDesc != ObjDesc)
+ {
+ AcpiUtRemoveReference (NewObjDesc);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsMethodDataGetType
+ *
+ * PARAMETERS: Opcode - Either AML_LOCAL_OP or AML_ARG_OP
+ * Index - Which Local or Arg whose type to get
+ * WalkState - Current walk state object
+ *
+ * RETURN: Data type of current value of the selected Arg or Local
+ *
+ * DESCRIPTION: Get the type of the object stored in the Local or Arg
+ *
+ ******************************************************************************/
+
+ACPI_OBJECT_TYPE
+AcpiDsMethodDataGetType (
+ UINT16 Opcode,
+ UINT32 Index,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_OPERAND_OBJECT *Object;
+
+
+ ACPI_FUNCTION_TRACE (DsMethodDataGetType);
+
+
+ /* Get the namespace node for the arg/local */
+
+ Status = AcpiDsMethodDataGetNode (Opcode, Index, WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return_VALUE ((ACPI_TYPE_NOT_FOUND));
+ }
+
+ /* Get the object */
+
+ Object = AcpiNsGetAttachedObject (Node);
+ if (!Object)
+ {
+ /* Uninitialized local/arg, return TYPE_ANY */
+
+ return_VALUE (ACPI_TYPE_ANY);
+ }
+
+ /* Get the object type */
+
+ return_VALUE (ACPI_GET_OBJECT_TYPE (Object));
+}
+#endif
+
+
diff --git a/sys/contrib/dev/acpica/dsobject.c b/sys/contrib/dev/acpica/dsobject.c
new file mode 100644
index 0000000..a058299
--- /dev/null
+++ b/sys/contrib/dev/acpica/dsobject.c
@@ -0,0 +1,789 @@
+/******************************************************************************
+ *
+ * Module Name: dsobject - Dispatcher object management routines
+ * $Revision: 1.135 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __DSOBJECT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dsobject")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDsBuildInternalObject (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_OPERAND_OBJECT **ObjDescPtr);
+
+
+#ifndef ACPI_NO_METHOD_EXECUTION
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsBuildInternalObject
+ *
+ * PARAMETERS: WalkState - Current walk state
+ * Op - Parser object to be translated
+ * ObjDescPtr - Where the ACPI internal object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Translate a parser Op object to the equivalent namespace object
+ * Simple objects are any objects other than a package object!
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDsBuildInternalObject (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_OPERAND_OBJECT **ObjDescPtr)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (DsBuildInternalObject);
+
+
+ *ObjDescPtr = NULL;
+ if (Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
+ {
+ /*
+ * This is a named object reference. If this name was
+ * previously looked up in the namespace, it was stored in this op.
+ * Otherwise, go ahead and look it up now
+ */
+ if (!Op->Common.Node)
+ {
+ Status = AcpiNsLookup (WalkState->ScopeInfo,
+ Op->Common.Value.String,
+ ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL,
+ ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &(Op->Common.Node)));
+ if (ACPI_FAILURE (Status))
+ {
+ /* Check if we are resolving a named reference within a package */
+
+ if ((Status == AE_NOT_FOUND) && (AcpiGbl_EnableInterpreterSlack) &&
+
+ ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP)))
+ {
+ /*
+ * We didn't find the target and we are populating elements
+ * of a package - ignore if slack enabled. Some ASL code
+ * contains dangling invalid references in packages and
+ * expects that no exception will be issued. Leave the
+ * element as a null element. It cannot be used, but it
+ * can be overwritten by subsequent ASL code - this is
+ * typically the case.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Ignoring unresolved reference in package [%4.4s]\n",
+ WalkState->ScopeInfo->Scope.Node->Name.Ascii));
+
+ return_ACPI_STATUS (AE_OK);
+ }
+ else
+ {
+ ACPI_ERROR_NAMESPACE (Op->Common.Value.String, Status);
+ }
+
+ return_ACPI_STATUS (Status);
+ }
+ }
+ }
+
+ /* Create and init a new internal ACPI object */
+
+ ObjDesc = AcpiUtCreateInternalObject (
+ (AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode))->ObjectType);
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Status = AcpiDsInitObjectFromOp (WalkState, Op, Op->Common.AmlOpcode,
+ &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+ }
+
+ *ObjDescPtr = ObjDesc;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsBuildInternalBufferObj
+ *
+ * PARAMETERS: WalkState - Current walk state
+ * Op - Parser object to be translated
+ * BufferLength - Length of the buffer
+ * ObjDescPtr - Where the ACPI internal object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Translate a parser Op package object to the equivalent
+ * namespace object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsBuildInternalBufferObj (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 BufferLength,
+ ACPI_OPERAND_OBJECT **ObjDescPtr)
+{
+ ACPI_PARSE_OBJECT *Arg;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_PARSE_OBJECT *ByteList;
+ UINT32 ByteListLength = 0;
+
+
+ ACPI_FUNCTION_TRACE (DsBuildInternalBufferObj);
+
+
+ /*
+ * If we are evaluating a Named buffer object "Name (xxxx, Buffer)".
+ * The buffer object already exists (from the NS node), otherwise it must
+ * be created.
+ */
+ ObjDesc = *ObjDescPtr;
+ if (!ObjDesc)
+ {
+ /* Create a new buffer object */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER);
+ *ObjDescPtr = ObjDesc;
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+ }
+
+ /*
+ * Second arg is the buffer data (optional) ByteList can be either
+ * individual bytes or a string initializer. In either case, a
+ * ByteList appears in the AML.
+ */
+ Arg = Op->Common.Value.Arg; /* skip first arg */
+
+ ByteList = Arg->Named.Next;
+ if (ByteList)
+ {
+ if (ByteList->Common.AmlOpcode != AML_INT_BYTELIST_OP)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Expecting bytelist, got AML opcode %X in op %p",
+ ByteList->Common.AmlOpcode, ByteList));
+
+ AcpiUtRemoveReference (ObjDesc);
+ return (AE_TYPE);
+ }
+
+ ByteListLength = (UINT32) ByteList->Common.Value.Integer;
+ }
+
+ /*
+ * The buffer length (number of bytes) will be the larger of:
+ * 1) The specified buffer length and
+ * 2) The length of the initializer byte list
+ */
+ ObjDesc->Buffer.Length = BufferLength;
+ if (ByteListLength > BufferLength)
+ {
+ ObjDesc->Buffer.Length = ByteListLength;
+ }
+
+ /* Allocate the buffer */
+
+ if (ObjDesc->Buffer.Length == 0)
+ {
+ ObjDesc->Buffer.Pointer = NULL;
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Buffer defined with zero length in AML, creating\n"));
+ }
+ else
+ {
+ ObjDesc->Buffer.Pointer = ACPI_ALLOCATE_ZEROED (
+ ObjDesc->Buffer.Length);
+ if (!ObjDesc->Buffer.Pointer)
+ {
+ AcpiUtDeleteObjectDesc (ObjDesc);
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Initialize buffer from the ByteList (if present) */
+
+ if (ByteList)
+ {
+ ACPI_MEMCPY (ObjDesc->Buffer.Pointer, ByteList->Named.Data,
+ ByteListLength);
+ }
+ }
+
+ ObjDesc->Buffer.Flags |= AOPOBJ_DATA_VALID;
+ Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsBuildInternalPackageObj
+ *
+ * PARAMETERS: WalkState - Current walk state
+ * Op - Parser object to be translated
+ * ElementCount - Number of elements in the package - this is
+ * the NumElements argument to Package()
+ * ObjDescPtr - Where the ACPI internal object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Translate a parser Op package object to the equivalent
+ * namespace object
+ *
+ * NOTE: The number of elements in the package will be always be the NumElements
+ * count, regardless of the number of elements in the package list. If
+ * NumElements is smaller, only that many package list elements are used.
+ * if NumElements is larger, the Package object is padded out with
+ * objects of type Uninitialized (as per ACPI spec.)
+ *
+ * Even though the ASL compilers do not allow NumElements to be smaller
+ * than the Package list length (for the fixed length package opcode), some
+ * BIOS code modifies the AML on the fly to adjust the NumElements, and
+ * this code compensates for that. This also provides compatibility with
+ * other AML interpreters.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsBuildInternalPackageObj (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 ElementCount,
+ ACPI_OPERAND_OBJECT **ObjDescPtr)
+{
+ ACPI_PARSE_OBJECT *Arg;
+ ACPI_PARSE_OBJECT *Parent;
+ ACPI_OPERAND_OBJECT *ObjDesc = NULL;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_NATIVE_UINT i;
+ UINT16 Index;
+ UINT16 ReferenceCount;
+
+
+ ACPI_FUNCTION_TRACE (DsBuildInternalPackageObj);
+
+
+ /* Find the parent of a possibly nested package */
+
+ Parent = Op->Common.Parent;
+ while ((Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+ (Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
+ {
+ Parent = Parent->Common.Parent;
+ }
+
+ /*
+ * If we are evaluating a Named package object "Name (xxxx, Package)",
+ * the package object already exists, otherwise it must be created.
+ */
+ ObjDesc = *ObjDescPtr;
+ if (!ObjDesc)
+ {
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
+ *ObjDescPtr = ObjDesc;
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ ObjDesc->Package.Node = Parent->Common.Node;
+ }
+
+ /*
+ * Allocate the element array (array of pointers to the individual
+ * objects) based on the NumElements parameter. Add an extra pointer slot
+ * so that the list is always null terminated.
+ */
+ ObjDesc->Package.Elements = ACPI_ALLOCATE_ZEROED (
+ ((ACPI_SIZE) ElementCount + 1) * sizeof (void *));
+
+ if (!ObjDesc->Package.Elements)
+ {
+ AcpiUtDeleteObjectDesc (ObjDesc);
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ ObjDesc->Package.Count = ElementCount;
+
+ /*
+ * Initialize the elements of the package, up to the NumElements count.
+ * Package is automatically padded with uninitialized (NULL) elements
+ * if NumElements is greater than the package list length. Likewise,
+ * Package is truncated if NumElements is less than the list length.
+ */
+ Arg = Op->Common.Value.Arg;
+ Arg = Arg->Common.Next;
+ for (i = 0; Arg && (i < ElementCount); i++)
+ {
+ if (Arg->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
+ {
+ /* This package element is already built, just get it */
+
+ ObjDesc->Package.Elements[i] =
+ ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Arg->Common.Node);
+ }
+ else
+ {
+ Status = AcpiDsBuildInternalObject (WalkState, Arg,
+ &ObjDesc->Package.Elements[i]);
+ }
+
+ if (*ObjDescPtr)
+ {
+ /* Existing package, get existing reference count */
+
+ ReferenceCount = (*ObjDescPtr)->Common.ReferenceCount;
+ if (ReferenceCount > 1)
+ {
+ /* Make new element ref count match original ref count */
+
+ for (Index = 0; Index < (ReferenceCount - 1); Index++)
+ {
+ AcpiUtAddReference ((ObjDesc->Package.Elements[i]));
+ }
+ }
+ }
+
+ Arg = Arg->Common.Next;
+ }
+
+ if (!Arg)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Package List length larger than NumElements count (%X), truncated\n",
+ ElementCount));
+ }
+
+ ObjDesc->Package.Flags |= AOPOBJ_DATA_VALID;
+ Op->Common.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsCreateNode
+ *
+ * PARAMETERS: WalkState - Current walk state
+ * Node - NS Node to be initialized
+ * Op - Parser object to be translated
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create the object to be associated with a namespace node
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsCreateNode (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsCreateNode, Op);
+
+
+ /*
+ * Because of the execution pass through the non-control-method
+ * parts of the table, we can arrive here twice. Only init
+ * the named object node the first time through
+ */
+ if (AcpiNsGetAttachedObject (Node))
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ if (!Op->Common.Value.Arg)
+ {
+ /* No arguments, there is nothing to do */
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Build an internal object for the argument(s) */
+
+ Status = AcpiDsBuildInternalObject (WalkState, Op->Common.Value.Arg,
+ &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Re-type the object according to its argument */
+
+ Node->Type = ACPI_GET_OBJECT_TYPE (ObjDesc);
+
+ /* Attach obj to node */
+
+ Status = AcpiNsAttachObject (Node, ObjDesc, Node->Type);
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+#endif /* ACPI_NO_METHOD_EXECUTION */
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsInitObjectFromOp
+ *
+ * PARAMETERS: WalkState - Current walk state
+ * Op - Parser op used to init the internal object
+ * Opcode - AML opcode associated with the object
+ * RetObjDesc - Namespace object to be initialized
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initialize a namespace object from a parser Op and its
+ * associated arguments. The namespace object is a more compact
+ * representation of the Op and its arguments.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsInitObjectFromOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ UINT16 Opcode,
+ ACPI_OPERAND_OBJECT **RetObjDesc)
+{
+ const ACPI_OPCODE_INFO *OpInfo;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (DsInitObjectFromOp);
+
+
+ ObjDesc = *RetObjDesc;
+ OpInfo = AcpiPsGetOpcodeInfo (Opcode);
+ if (OpInfo->Class == AML_CLASS_UNKNOWN)
+ {
+ /* Unknown opcode */
+
+ return_ACPI_STATUS (AE_TYPE);
+ }
+
+ /* Perform per-object initialization */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_BUFFER:
+
+ /*
+ * Defer evaluation of Buffer TermArg operand
+ */
+ ObjDesc->Buffer.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
+ WalkState->Operands[0]);
+ ObjDesc->Buffer.AmlStart = Op->Named.Data;
+ ObjDesc->Buffer.AmlLength = Op->Named.Length;
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ /*
+ * Defer evaluation of Package TermArg operand
+ */
+ ObjDesc->Package.Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE,
+ WalkState->Operands[0]);
+ ObjDesc->Package.AmlStart = Op->Named.Data;
+ ObjDesc->Package.AmlLength = Op->Named.Length;
+ break;
+
+
+ case ACPI_TYPE_INTEGER:
+
+ switch (OpInfo->Type)
+ {
+ case AML_TYPE_CONSTANT:
+ /*
+ * Resolve AML Constants here - AND ONLY HERE!
+ * All constants are integers.
+ * We mark the integer with a flag that indicates that it started
+ * life as a constant -- so that stores to constants will perform
+ * as expected (noop). ZeroOp is used as a placeholder for optional
+ * target operands.
+ */
+ ObjDesc->Common.Flags = AOPOBJ_AML_CONSTANT;
+
+ switch (Opcode)
+ {
+ case AML_ZERO_OP:
+
+ ObjDesc->Integer.Value = 0;
+ break;
+
+ case AML_ONE_OP:
+
+ ObjDesc->Integer.Value = 1;
+ break;
+
+ case AML_ONES_OP:
+
+ ObjDesc->Integer.Value = ACPI_INTEGER_MAX;
+
+ /* Truncate value if we are executing from a 32-bit ACPI table */
+
+#ifndef ACPI_NO_METHOD_EXECUTION
+ AcpiExTruncateFor32bitTable (ObjDesc);
+#endif
+ break;
+
+ case AML_REVISION_OP:
+
+ ObjDesc->Integer.Value = ACPI_CA_VERSION;
+ break;
+
+ default:
+
+ ACPI_ERROR ((AE_INFO,
+ "Unknown constant opcode %X", Opcode));
+ Status = AE_AML_OPERAND_TYPE;
+ break;
+ }
+ break;
+
+
+ case AML_TYPE_LITERAL:
+
+ ObjDesc->Integer.Value = Op->Common.Value.Integer;
+#ifndef ACPI_NO_METHOD_EXECUTION
+ AcpiExTruncateFor32bitTable (ObjDesc);
+#endif
+ break;
+
+
+ default:
+ ACPI_ERROR ((AE_INFO, "Unknown Integer type %X",
+ OpInfo->Type));
+ Status = AE_AML_OPERAND_TYPE;
+ break;
+ }
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ ObjDesc->String.Pointer = Op->Common.Value.String;
+ ObjDesc->String.Length = (UINT32) ACPI_STRLEN (Op->Common.Value.String);
+
+ /*
+ * The string is contained in the ACPI table, don't ever try
+ * to delete it
+ */
+ ObjDesc->Common.Flags |= AOPOBJ_STATIC_POINTER;
+ break;
+
+
+ case ACPI_TYPE_METHOD:
+ break;
+
+
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ switch (OpInfo->Type)
+ {
+ case AML_TYPE_LOCAL_VARIABLE:
+
+ /* Split the opcode into a base opcode + offset */
+
+ ObjDesc->Reference.Opcode = AML_LOCAL_OP;
+ ObjDesc->Reference.Offset = Opcode - AML_LOCAL_OP;
+
+#ifndef ACPI_NO_METHOD_EXECUTION
+ Status = AcpiDsMethodDataGetNode (AML_LOCAL_OP,
+ ObjDesc->Reference.Offset,
+ WalkState,
+ (ACPI_NAMESPACE_NODE **) &ObjDesc->Reference.Object);
+#endif
+ break;
+
+
+ case AML_TYPE_METHOD_ARGUMENT:
+
+ /* Split the opcode into a base opcode + offset */
+
+ ObjDesc->Reference.Opcode = AML_ARG_OP;
+ ObjDesc->Reference.Offset = Opcode - AML_ARG_OP;
+
+#ifndef ACPI_NO_METHOD_EXECUTION
+ Status = AcpiDsMethodDataGetNode (AML_ARG_OP,
+ ObjDesc->Reference.Offset,
+ WalkState,
+ (ACPI_NAMESPACE_NODE **) &ObjDesc->Reference.Object);
+#endif
+ break;
+
+ default: /* Other literals, etc.. */
+
+ if (Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
+ {
+ /* Node was saved in Op */
+
+ ObjDesc->Reference.Node = Op->Common.Node;
+ }
+
+ ObjDesc->Reference.Opcode = Opcode;
+ break;
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unimplemented data type: %X",
+ ACPI_GET_OBJECT_TYPE (ObjDesc)));
+
+ Status = AE_AML_OPERAND_TYPE;
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/dsopcode.c b/sys/contrib/dev/acpica/dsopcode.c
new file mode 100644
index 0000000..7760ac6
--- /dev/null
+++ b/sys/contrib/dev/acpica/dsopcode.c
@@ -0,0 +1,1344 @@
+/******************************************************************************
+ *
+ * Module Name: dsopcode - Dispatcher Op Region support and handling of
+ * "control" opcodes
+ * $Revision: 1.111 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __DSOPCODE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acevents.h>
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dsopcode")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDsExecuteArguments (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_NAMESPACE_NODE *ScopeNode,
+ UINT32 AmlLength,
+ UINT8 *AmlStart);
+
+static ACPI_STATUS
+AcpiDsInitBufferField (
+ UINT16 AmlOpcode,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT *BufferDesc,
+ ACPI_OPERAND_OBJECT *OffsetDesc,
+ ACPI_OPERAND_OBJECT *LengthDesc,
+ ACPI_OPERAND_OBJECT *ResultDesc);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsExecuteArguments
+ *
+ * PARAMETERS: Node - Object NS node
+ * ScopeNode - Parent NS node
+ * AmlLength - Length of executable AML
+ * AmlStart - Pointer to the AML
+ *
+ * RETURN: Status.
+ *
+ * DESCRIPTION: Late (deferred) execution of region or field arguments
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDsExecuteArguments (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_NAMESPACE_NODE *ScopeNode,
+ UINT32 AmlLength,
+ UINT8 *AmlStart)
+{
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_WALK_STATE *WalkState;
+
+
+ ACPI_FUNCTION_TRACE (DsExecuteArguments);
+
+
+ /*
+ * Allocate a new parser op to be the root of the parsed tree
+ */
+ Op = AcpiPsAllocOp (AML_INT_EVAL_SUBTREE_OP);
+ if (!Op)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Save the Node for use in AcpiPsParseAml */
+
+ Op->Common.Node = ScopeNode;
+
+ /* Create and initialize a new parser state */
+
+ WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
+ if (!WalkState)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, AmlStart,
+ AmlLength, NULL, ACPI_IMODE_LOAD_PASS1);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiDsDeleteWalkState (WalkState);
+ goto Cleanup;
+ }
+
+ /* Mark this parse as a deferred opcode */
+
+ WalkState->ParseFlags = ACPI_PARSE_DEFERRED_OP;
+ WalkState->DeferredNode = Node;
+
+ /* Pass1: Parse the entire declaration */
+
+ Status = AcpiPsParseAml (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /* Get and init the Op created above */
+
+ Op->Common.Node = Node;
+ AcpiPsDeleteParseTree (Op);
+
+ /* Evaluate the deferred arguments */
+
+ Op = AcpiPsAllocOp (AML_INT_EVAL_SUBTREE_OP);
+ if (!Op)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Op->Common.Node = ScopeNode;
+
+ /* Create and initialize a new parser state */
+
+ WalkState = AcpiDsCreateWalkState (0, NULL, NULL, NULL);
+ if (!WalkState)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /* Execute the opcode and arguments */
+
+ Status = AcpiDsInitAmlWalk (WalkState, Op, NULL, AmlStart,
+ AmlLength, NULL, ACPI_IMODE_EXECUTE);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiDsDeleteWalkState (WalkState);
+ goto Cleanup;
+ }
+
+ /* Mark this execution as a deferred opcode */
+
+ WalkState->DeferredNode = Node;
+ Status = AcpiPsParseAml (WalkState);
+
+Cleanup:
+ AcpiPsDeleteParseTree (Op);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsGetBufferFieldArguments
+ *
+ * PARAMETERS: ObjDesc - A valid BufferField object
+ *
+ * RETURN: Status.
+ *
+ * DESCRIPTION: Get BufferField Buffer and Index. This implements the late
+ * evaluation of these field attributes.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsGetBufferFieldArguments (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_OPERAND_OBJECT *ExtraDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsGetBufferFieldArguments, ObjDesc);
+
+
+ if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Get the AML pointer (method object) and BufferField node */
+
+ ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc);
+ Node = ObjDesc->BufferField.Node;
+
+ ACPI_DEBUG_EXEC(AcpiUtDisplayInitPathname (ACPI_TYPE_BUFFER_FIELD, Node, NULL));
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] BufferField Arg Init\n",
+ AcpiUtGetNodeName (Node)));
+
+ /* Execute the AML code for the TermArg arguments */
+
+ Status = AcpiDsExecuteArguments (Node, AcpiNsGetParentNode (Node),
+ ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsGetBufferArguments
+ *
+ * PARAMETERS: ObjDesc - A valid Buffer object
+ *
+ * RETURN: Status.
+ *
+ * DESCRIPTION: Get Buffer length and initializer byte list. This implements
+ * the late evaluation of these attributes.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsGetBufferArguments (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsGetBufferArguments, ObjDesc);
+
+
+ if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Get the Buffer node */
+
+ Node = ObjDesc->Buffer.Node;
+ if (!Node)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "No pointer back to NS node in buffer obj %p", ObjDesc));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Buffer Arg Init\n"));
+
+ /* Execute the AML code for the TermArg arguments */
+
+ Status = AcpiDsExecuteArguments (Node, Node,
+ ObjDesc->Buffer.AmlLength, ObjDesc->Buffer.AmlStart);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsGetPackageArguments
+ *
+ * PARAMETERS: ObjDesc - A valid Package object
+ *
+ * RETURN: Status.
+ *
+ * DESCRIPTION: Get Package length and initializer byte list. This implements
+ * the late evaluation of these attributes.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsGetPackageArguments (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsGetPackageArguments, ObjDesc);
+
+
+ if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Get the Package node */
+
+ Node = ObjDesc->Package.Node;
+ if (!Node)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "No pointer back to NS node in package %p", ObjDesc));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Package Arg Init\n"));
+
+ /* Execute the AML code for the TermArg arguments */
+
+ Status = AcpiDsExecuteArguments (Node, Node,
+ ObjDesc->Package.AmlLength, ObjDesc->Package.AmlStart);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*****************************************************************************
+ *
+ * FUNCTION: AcpiDsGetRegionArguments
+ *
+ * PARAMETERS: ObjDesc - A valid region object
+ *
+ * RETURN: Status.
+ *
+ * DESCRIPTION: Get region address and length. This implements the late
+ * evaluation of these region attributes.
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+AcpiDsGetRegionArguments (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ExtraDesc;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsGetRegionArguments, ObjDesc);
+
+
+ if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ ExtraDesc = AcpiNsGetSecondaryObject (ObjDesc);
+ if (!ExtraDesc)
+ {
+ return_ACPI_STATUS (AE_NOT_EXIST);
+ }
+
+ /* Get the Region node */
+
+ Node = ObjDesc->Region.Node;
+
+ ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (ACPI_TYPE_REGION, Node, NULL));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s] OpRegion Arg Init at AML %p\n",
+ AcpiUtGetNodeName (Node), ExtraDesc->Extra.AmlStart));
+
+ /* Execute the argument AML */
+
+ Status = AcpiDsExecuteArguments (Node, AcpiNsGetParentNode (Node),
+ ExtraDesc->Extra.AmlLength, ExtraDesc->Extra.AmlStart);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Validate the region address/length via the host OS */
+
+ Status = AcpiOsValidateAddress (ObjDesc->Region.SpaceId,
+ ObjDesc->Region.Address, (ACPI_SIZE) ObjDesc->Region.Length);
+ if (ACPI_FAILURE (Status))
+ {
+ /*
+ * Invalid address/length. We will emit an error message and mark
+ * the region as invalid, so that it will cause an additional error if
+ * it is ever used. Then return AE_OK.
+ */
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "During address validation of OpRegion [%4.4s]", Node->Name.Ascii));
+ ObjDesc->Common.Flags |= AOPOBJ_INVALID;
+ Status = AE_OK;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsInitializeRegion
+ *
+ * PARAMETERS: ObjHandle - Region namespace node
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Front end to EvInitializeRegion
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsInitializeRegion (
+ ACPI_HANDLE ObjHandle)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ObjDesc = AcpiNsGetAttachedObject (ObjHandle);
+
+ /* Namespace is NOT locked */
+
+ Status = AcpiEvInitializeRegion (ObjDesc, FALSE);
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsInitBufferField
+ *
+ * PARAMETERS: AmlOpcode - CreateXxxField
+ * ObjDesc - BufferField object
+ * BufferDesc - Host Buffer
+ * OffsetDesc - Offset into buffer
+ * LengthDesc - Length of field (CREATE_FIELD_OP only)
+ * ResultDesc - Where to store the result
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Perform actual initialization of a buffer field
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDsInitBufferField (
+ UINT16 AmlOpcode,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT *BufferDesc,
+ ACPI_OPERAND_OBJECT *OffsetDesc,
+ ACPI_OPERAND_OBJECT *LengthDesc,
+ ACPI_OPERAND_OBJECT *ResultDesc)
+{
+ UINT32 Offset;
+ UINT32 BitOffset;
+ UINT32 BitCount;
+ UINT8 FieldFlags;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsInitBufferField, ObjDesc);
+
+
+ /* Host object must be a Buffer */
+
+ if (ACPI_GET_OBJECT_TYPE (BufferDesc) != ACPI_TYPE_BUFFER)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Target of Create Field is not a Buffer object - %s",
+ AcpiUtGetObjectTypeName (BufferDesc)));
+
+ Status = AE_AML_OPERAND_TYPE;
+ goto Cleanup;
+ }
+
+ /*
+ * The last parameter to all of these opcodes (ResultDesc) started
+ * out as a NameString, and should therefore now be a NS node
+ * after resolution in AcpiExResolveOperands().
+ */
+ if (ACPI_GET_DESCRIPTOR_TYPE (ResultDesc) != ACPI_DESC_TYPE_NAMED)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "(%s) destination not a NS Node [%s]",
+ AcpiPsGetOpcodeName (AmlOpcode),
+ AcpiUtGetDescriptorName (ResultDesc)));
+
+ Status = AE_AML_OPERAND_TYPE;
+ goto Cleanup;
+ }
+
+ Offset = (UINT32) OffsetDesc->Integer.Value;
+
+ /*
+ * Setup the Bit offsets and counts, according to the opcode
+ */
+ switch (AmlOpcode)
+ {
+ case AML_CREATE_FIELD_OP:
+
+ /* Offset is in bits, count is in bits */
+
+ FieldFlags = AML_FIELD_ACCESS_BYTE;
+ BitOffset = Offset;
+ BitCount = (UINT32) LengthDesc->Integer.Value;
+
+ /* Must have a valid (>0) bit count */
+
+ if (BitCount == 0)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Attempt to CreateField of length zero"));
+ Status = AE_AML_OPERAND_VALUE;
+ goto Cleanup;
+ }
+ break;
+
+ case AML_CREATE_BIT_FIELD_OP:
+
+ /* Offset is in bits, Field is one bit */
+
+ BitOffset = Offset;
+ BitCount = 1;
+ FieldFlags = AML_FIELD_ACCESS_BYTE;
+ break;
+
+ case AML_CREATE_BYTE_FIELD_OP:
+
+ /* Offset is in bytes, field is one byte */
+
+ BitOffset = 8 * Offset;
+ BitCount = 8;
+ FieldFlags = AML_FIELD_ACCESS_BYTE;
+ break;
+
+ case AML_CREATE_WORD_FIELD_OP:
+
+ /* Offset is in bytes, field is one word */
+
+ BitOffset = 8 * Offset;
+ BitCount = 16;
+ FieldFlags = AML_FIELD_ACCESS_WORD;
+ break;
+
+ case AML_CREATE_DWORD_FIELD_OP:
+
+ /* Offset is in bytes, field is one dword */
+
+ BitOffset = 8 * Offset;
+ BitCount = 32;
+ FieldFlags = AML_FIELD_ACCESS_DWORD;
+ break;
+
+ case AML_CREATE_QWORD_FIELD_OP:
+
+ /* Offset is in bytes, field is one qword */
+
+ BitOffset = 8 * Offset;
+ BitCount = 64;
+ FieldFlags = AML_FIELD_ACCESS_QWORD;
+ break;
+
+ default:
+
+ ACPI_ERROR ((AE_INFO,
+ "Unknown field creation opcode %02x",
+ AmlOpcode));
+ Status = AE_AML_BAD_OPCODE;
+ goto Cleanup;
+ }
+
+ /* Entire field must fit within the current length of the buffer */
+
+ if ((BitOffset + BitCount) >
+ (8 * (UINT32) BufferDesc->Buffer.Length))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Field [%4.4s] at %d exceeds Buffer [%4.4s] size %d (bits)",
+ AcpiUtGetNodeName (ResultDesc),
+ BitOffset + BitCount,
+ AcpiUtGetNodeName (BufferDesc->Buffer.Node),
+ 8 * (UINT32) BufferDesc->Buffer.Length));
+ Status = AE_AML_BUFFER_LIMIT;
+ goto Cleanup;
+ }
+
+ /*
+ * Initialize areas of the field object that are common to all fields
+ * For FieldFlags, use LOCK_RULE = 0 (NO_LOCK),
+ * UPDATE_RULE = 0 (UPDATE_PRESERVE)
+ */
+ Status = AcpiExPrepCommonFieldObject (ObjDesc, FieldFlags, 0,
+ BitOffset, BitCount);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ ObjDesc->BufferField.BufferObj = BufferDesc;
+
+ /* Reference count for BufferDesc inherits ObjDesc count */
+
+ BufferDesc->Common.ReferenceCount = (UINT16)
+ (BufferDesc->Common.ReferenceCount + ObjDesc->Common.ReferenceCount);
+
+
+Cleanup:
+
+ /* Always delete the operands */
+
+ AcpiUtRemoveReference (OffsetDesc);
+ AcpiUtRemoveReference (BufferDesc);
+
+ if (AmlOpcode == AML_CREATE_FIELD_OP)
+ {
+ AcpiUtRemoveReference (LengthDesc);
+ }
+
+ /* On failure, delete the result descriptor */
+
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ResultDesc); /* Result descriptor */
+ }
+ else
+ {
+ /* Now the address and length are valid for this BufferField */
+
+ ObjDesc->BufferField.Flags |= AOPOBJ_DATA_VALID;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsEvalBufferFieldOperands
+ *
+ * PARAMETERS: WalkState - Current walk
+ * Op - A valid BufferField Op object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get BufferField Buffer and Index
+ * Called from AcpiDsExecEndOp during BufferField parse tree walk
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsEvalBufferFieldOperands (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_PARSE_OBJECT *NextOp;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsEvalBufferFieldOperands, Op);
+
+
+ /*
+ * This is where we evaluate the address and length fields of the
+ * CreateXxxField declaration
+ */
+ Node = Op->Common.Node;
+
+ /* NextOp points to the op that holds the Buffer */
+
+ NextOp = Op->Common.Value.Arg;
+
+ /* Evaluate/create the address and length operands */
+
+ Status = AcpiDsCreateOperands (WalkState, NextOp);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NOT_EXIST);
+ }
+
+ /* Resolve the operands */
+
+ Status = AcpiExResolveOperands (Op->Common.AmlOpcode,
+ ACPI_WALK_OPERANDS, WalkState);
+
+ ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,
+ AcpiPsGetOpcodeName (Op->Common.AmlOpcode),
+ WalkState->NumOperands, "after AcpiExResolveOperands");
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO, "(%s) bad operand(s) (%X)",
+ AcpiPsGetOpcodeName (Op->Common.AmlOpcode), Status));
+
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Initialize the Buffer Field */
+
+ if (Op->Common.AmlOpcode == AML_CREATE_FIELD_OP)
+ {
+ /* NOTE: Slightly different operands for this opcode */
+
+ Status = AcpiDsInitBufferField (Op->Common.AmlOpcode, ObjDesc,
+ WalkState->Operands[0], WalkState->Operands[1],
+ WalkState->Operands[2], WalkState->Operands[3]);
+ }
+ else
+ {
+ /* All other, CreateXxxField opcodes */
+
+ Status = AcpiDsInitBufferField (Op->Common.AmlOpcode, ObjDesc,
+ WalkState->Operands[0], WalkState->Operands[1],
+ NULL, WalkState->Operands[2]);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsEvalRegionOperands
+ *
+ * PARAMETERS: WalkState - Current walk
+ * Op - A valid region Op object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get region address and length
+ * Called from AcpiDsExecEndOp during OpRegion parse tree walk
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsEvalRegionOperands (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *OperandDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_PARSE_OBJECT *NextOp;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsEvalRegionOperands, Op);
+
+
+ /*
+ * This is where we evaluate the address and length fields of the
+ * OpRegion declaration
+ */
+ Node = Op->Common.Node;
+
+ /* NextOp points to the op that holds the SpaceID */
+
+ NextOp = Op->Common.Value.Arg;
+
+ /* NextOp points to address op */
+
+ NextOp = NextOp->Common.Next;
+
+ /* Evaluate/create the address and length operands */
+
+ Status = AcpiDsCreateOperands (WalkState, NextOp);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Resolve the length and address operands to numbers */
+
+ Status = AcpiExResolveOperands (Op->Common.AmlOpcode,
+ ACPI_WALK_OPERANDS, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,
+ AcpiPsGetOpcodeName (Op->Common.AmlOpcode),
+ 1, "after AcpiExResolveOperands");
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NOT_EXIST);
+ }
+
+ /*
+ * Get the length operand and save it
+ * (at Top of stack)
+ */
+ OperandDesc = WalkState->Operands[WalkState->NumOperands - 1];
+
+ ObjDesc->Region.Length = (UINT32) OperandDesc->Integer.Value;
+ AcpiUtRemoveReference (OperandDesc);
+
+ /*
+ * Get the address and save it
+ * (at top of stack - 1)
+ */
+ OperandDesc = WalkState->Operands[WalkState->NumOperands - 2];
+
+ ObjDesc->Region.Address = (ACPI_PHYSICAL_ADDRESS)
+ OperandDesc->Integer.Value;
+ AcpiUtRemoveReference (OperandDesc);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "RgnObj %p Addr %8.8X%8.8X Len %X\n",
+ ObjDesc,
+ ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
+ ObjDesc->Region.Length));
+
+ /* Now the address and length are valid for this opregion */
+
+ ObjDesc->Region.Flags |= AOPOBJ_DATA_VALID;
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsEvalDataObjectOperands
+ *
+ * PARAMETERS: WalkState - Current walk
+ * Op - A valid DataObject Op object
+ * ObjDesc - DataObject
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get the operands and complete the following data object types:
+ * Buffer, Package.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsEvalDataObjectOperands (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ArgDesc;
+ UINT32 Length;
+
+
+ ACPI_FUNCTION_TRACE (DsEvalDataObjectOperands);
+
+
+ /* The first operand (for all of these data objects) is the length */
+
+ /*
+ * Set proper index into operand stack for AcpiDsObjStackPush
+ * invoked inside AcpiDsCreateOperand.
+ */
+ WalkState->OperandIndex = WalkState->NumOperands;
+
+ Status = AcpiDsCreateOperand (WalkState, Op->Common.Value.Arg, 1);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiExResolveOperands (WalkState->Opcode,
+ &(WalkState->Operands [WalkState->NumOperands -1]),
+ WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Extract length operand */
+
+ ArgDesc = WalkState->Operands [WalkState->NumOperands - 1];
+ Length = (UINT32) ArgDesc->Integer.Value;
+
+ /* Cleanup for length operand */
+
+ Status = AcpiDsObjStackPop (1, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ AcpiUtRemoveReference (ArgDesc);
+
+ /*
+ * Create the actual data object
+ */
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_BUFFER_OP:
+
+ Status = AcpiDsBuildInternalBufferObj (WalkState, Op, Length, &ObjDesc);
+ break;
+
+ case AML_PACKAGE_OP:
+ case AML_VAR_PACKAGE_OP:
+
+ Status = AcpiDsBuildInternalPackageObj (WalkState, Op, Length, &ObjDesc);
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_AML_BAD_OPCODE);
+ }
+
+ if (ACPI_SUCCESS (Status))
+ {
+ /*
+ * Return the object in the WalkState, unless the parent is a package -
+ * in this case, the return object will be stored in the parse tree
+ * for the package.
+ */
+ if ((!Op->Common.Parent) ||
+ ((Op->Common.Parent->Common.AmlOpcode != AML_PACKAGE_OP) &&
+ (Op->Common.Parent->Common.AmlOpcode != AML_VAR_PACKAGE_OP) &&
+ (Op->Common.Parent->Common.AmlOpcode != AML_NAME_OP)))
+ {
+ WalkState->ResultObj = ObjDesc;
+ }
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsExecBeginControlOp
+ *
+ * PARAMETERS: WalkList - The list that owns the walk stack
+ * Op - The control Op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Handles all control ops encountered during control method
+ * execution.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsExecBeginControlOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_GENERIC_STATE *ControlState;
+
+
+ ACPI_FUNCTION_NAME (DsExecBeginControlOp);
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p Opcode=%2.2X State=%p\n", Op,
+ Op->Common.AmlOpcode, WalkState));
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_IF_OP:
+ case AML_WHILE_OP:
+
+ /*
+ * IF/WHILE: Create a new control state to manage these
+ * constructs. We need to manage these as a stack, in order
+ * to handle nesting.
+ */
+ ControlState = AcpiUtCreateControlState ();
+ if (!ControlState)
+ {
+ Status = AE_NO_MEMORY;
+ break;
+ }
+ /*
+ * Save a pointer to the predicate for multiple executions
+ * of a loop
+ */
+ ControlState->Control.AmlPredicateStart = WalkState->ParserState.Aml - 1;
+ ControlState->Control.PackageEnd = WalkState->ParserState.PkgEnd;
+ ControlState->Control.Opcode = Op->Common.AmlOpcode;
+
+
+ /* Push the control state on this walk's control stack */
+
+ AcpiUtPushGenericState (&WalkState->ControlState, ControlState);
+ break;
+
+ case AML_ELSE_OP:
+
+ /* Predicate is in the state object */
+ /* If predicate is true, the IF was executed, ignore ELSE part */
+
+ if (WalkState->LastPredicate)
+ {
+ Status = AE_CTRL_TRUE;
+ }
+
+ break;
+
+ case AML_RETURN_OP:
+
+ break;
+
+ default:
+ break;
+ }
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsExecEndControlOp
+ *
+ * PARAMETERS: WalkList - The list that owns the walk stack
+ * Op - The control Op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Handles all control ops encountered during control method
+ * execution.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsExecEndControlOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_GENERIC_STATE *ControlState;
+
+
+ ACPI_FUNCTION_NAME (DsExecEndControlOp);
+
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_IF_OP:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[IF_OP] Op=%p\n", Op));
+
+ /*
+ * Save the result of the predicate in case there is an
+ * ELSE to come
+ */
+ WalkState->LastPredicate =
+ (BOOLEAN) WalkState->ControlState->Common.Value;
+
+ /*
+ * Pop the control state that was created at the start
+ * of the IF and free it
+ */
+ ControlState = AcpiUtPopGenericState (&WalkState->ControlState);
+ AcpiUtDeleteGenericState (ControlState);
+ break;
+
+
+ case AML_ELSE_OP:
+
+ break;
+
+
+ case AML_WHILE_OP:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[WHILE_OP] Op=%p\n", Op));
+
+ if (WalkState->ControlState->Common.Value)
+ {
+ /* Predicate was true, go back and evaluate it again! */
+
+ Status = AE_CTRL_PENDING;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "[WHILE_OP] termination! Op=%p\n",Op));
+
+ /* Pop this control state and free it */
+
+ ControlState = AcpiUtPopGenericState (&WalkState->ControlState);
+
+ WalkState->AmlLastWhile = ControlState->Control.AmlPredicateStart;
+ AcpiUtDeleteGenericState (ControlState);
+ break;
+
+
+ case AML_RETURN_OP:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "[RETURN_OP] Op=%p Arg=%p\n",Op, Op->Common.Value.Arg));
+
+ /*
+ * One optional operand -- the return value
+ * It can be either an immediate operand or a result that
+ * has been bubbled up the tree
+ */
+ if (Op->Common.Value.Arg)
+ {
+ /* Since we have a real Return(), delete any implicit return */
+
+ AcpiDsClearImplicitReturn (WalkState);
+
+ /* Return statement has an immediate operand */
+
+ Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /*
+ * If value being returned is a Reference (such as
+ * an arg or local), resolve it now because it may
+ * cease to exist at the end of the method.
+ */
+ Status = AcpiExResolveToValue (&WalkState->Operands [0], WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /*
+ * Get the return value and save as the last result
+ * value. This is the only place where WalkState->ReturnDesc
+ * is set to anything other than zero!
+ */
+ WalkState->ReturnDesc = WalkState->Operands[0];
+ }
+ else if (WalkState->ResultCount)
+ {
+ /* Since we have a real Return(), delete any implicit return */
+
+ AcpiDsClearImplicitReturn (WalkState);
+
+ /*
+ * The return value has come from a previous calculation.
+ *
+ * If value being returned is a Reference (such as
+ * an arg or local), resolve it now because it may
+ * cease to exist at the end of the method.
+ *
+ * Allow references created by the Index operator to return unchanged.
+ */
+ if ((ACPI_GET_DESCRIPTOR_TYPE (WalkState->Results->Results.ObjDesc[0]) == ACPI_DESC_TYPE_OPERAND) &&
+ (ACPI_GET_OBJECT_TYPE (WalkState->Results->Results.ObjDesc [0]) == ACPI_TYPE_LOCAL_REFERENCE) &&
+ ((WalkState->Results->Results.ObjDesc [0])->Reference.Opcode != AML_INDEX_OP))
+ {
+ Status = AcpiExResolveToValue (&WalkState->Results->Results.ObjDesc [0], WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+
+ WalkState->ReturnDesc = WalkState->Results->Results.ObjDesc [0];
+ }
+ else
+ {
+ /* No return operand */
+
+ if (WalkState->NumOperands)
+ {
+ AcpiUtRemoveReference (WalkState->Operands [0]);
+ }
+
+ WalkState->Operands [0] = NULL;
+ WalkState->NumOperands = 0;
+ WalkState->ReturnDesc = NULL;
+ }
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Completed RETURN_OP State=%p, RetVal=%p\n",
+ WalkState, WalkState->ReturnDesc));
+
+ /* End the control method execution right now */
+
+ Status = AE_CTRL_TERMINATE;
+ break;
+
+
+ case AML_NOOP_OP:
+
+ /* Just do nothing! */
+ break;
+
+
+ case AML_BREAK_POINT_OP:
+
+ /* Call up to the OS service layer to handle this */
+
+ Status = AcpiOsSignal (ACPI_SIGNAL_BREAKPOINT, "Executed AML Breakpoint opcode");
+
+ /* If and when it returns, all done. */
+
+ break;
+
+
+ case AML_BREAK_OP:
+ case AML_CONTINUE_OP: /* ACPI 2.0 */
+
+
+ /* Pop and delete control states until we find a while */
+
+ while (WalkState->ControlState &&
+ (WalkState->ControlState->Control.Opcode != AML_WHILE_OP))
+ {
+ ControlState = AcpiUtPopGenericState (&WalkState->ControlState);
+ AcpiUtDeleteGenericState (ControlState);
+ }
+
+ /* No while found? */
+
+ if (!WalkState->ControlState)
+ {
+ return (AE_AML_NO_WHILE);
+ }
+
+ /* Was: WalkState->AmlLastWhile = WalkState->ControlState->Control.AmlPredicateStart; */
+
+ WalkState->AmlLastWhile = WalkState->ControlState->Control.PackageEnd;
+
+ /* Return status depending on opcode */
+
+ if (Op->Common.AmlOpcode == AML_BREAK_OP)
+ {
+ Status = AE_CTRL_BREAK;
+ }
+ else
+ {
+ Status = AE_CTRL_CONTINUE;
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown control opcode=%X Op=%p",
+ Op->Common.AmlOpcode, Op));
+
+ Status = AE_AML_BAD_OPCODE;
+ break;
+ }
+
+ return (Status);
+}
+
diff --git a/sys/contrib/dev/acpica/dsutils.c b/sys/contrib/dev/acpica/dsutils.c
new file mode 100644
index 0000000..eb75947
--- /dev/null
+++ b/sys/contrib/dev/acpica/dsutils.c
@@ -0,0 +1,1010 @@
+/*******************************************************************************
+ *
+ * Module Name: dsutils - Dispatcher utilities
+ * $Revision: 1.124 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __DSUTILS_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdebug.h>
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dsutils")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsClearImplicitReturn
+ *
+ * PARAMETERS: WalkState - Current State
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Clear and remove a reference on an implicit return value. Used
+ * to delete "stale" return values (if enabled, the return value
+ * from every operator is saved at least momentarily, in case the
+ * parent method exits.)
+ *
+ ******************************************************************************/
+
+void
+AcpiDsClearImplicitReturn (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_FUNCTION_NAME (DsClearImplicitReturn);
+
+
+ /*
+ * Slack must be enabled for this feature
+ */
+ if (!AcpiGbl_EnableInterpreterSlack)
+ {
+ return;
+ }
+
+ if (WalkState->ImplicitReturnObj)
+ {
+ /*
+ * Delete any "stale" implicit return. However, in
+ * complex statements, the implicit return value can be
+ * bubbled up several levels.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Removing reference on stale implicit return obj %p\n",
+ WalkState->ImplicitReturnObj));
+
+ AcpiUtRemoveReference (WalkState->ImplicitReturnObj);
+ WalkState->ImplicitReturnObj = NULL;
+ }
+}
+
+
+#ifndef ACPI_NO_METHOD_EXECUTION
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsDoImplicitReturn
+ *
+ * PARAMETERS: ReturnDesc - The return value
+ * WalkState - Current State
+ * AddReference - True if a reference should be added to the
+ * return object
+ *
+ * RETURN: TRUE if implicit return enabled, FALSE otherwise
+ *
+ * DESCRIPTION: Implements the optional "implicit return". We save the result
+ * of every ASL operator and control method invocation in case the
+ * parent method exit. Before storing a new return value, we
+ * delete the previous return value.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiDsDoImplicitReturn (
+ ACPI_OPERAND_OBJECT *ReturnDesc,
+ ACPI_WALK_STATE *WalkState,
+ BOOLEAN AddReference)
+{
+ ACPI_FUNCTION_NAME (DsDoImplicitReturn);
+
+
+ /*
+ * Slack must be enabled for this feature, and we must
+ * have a valid return object
+ */
+ if ((!AcpiGbl_EnableInterpreterSlack) ||
+ (!ReturnDesc))
+ {
+ return (FALSE);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Result %p will be implicitly returned; Prev=%p\n",
+ ReturnDesc,
+ WalkState->ImplicitReturnObj));
+
+ /*
+ * Delete any "stale" implicit return value first. However, in
+ * complex statements, the implicit return value can be
+ * bubbled up several levels, so we don't clear the value if it
+ * is the same as the ReturnDesc.
+ */
+ if (WalkState->ImplicitReturnObj)
+ {
+ if (WalkState->ImplicitReturnObj == ReturnDesc)
+ {
+ return (TRUE);
+ }
+ AcpiDsClearImplicitReturn (WalkState);
+ }
+
+ /* Save the implicit return value, add a reference if requested */
+
+ WalkState->ImplicitReturnObj = ReturnDesc;
+ if (AddReference)
+ {
+ AcpiUtAddReference (ReturnDesc);
+ }
+
+ return (TRUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsIsResultUsed
+ *
+ * PARAMETERS: Op - Current Op
+ * WalkState - Current State
+ *
+ * RETURN: TRUE if result is used, FALSE otherwise
+ *
+ * DESCRIPTION: Check if a result object will be used by the parent
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiDsIsResultUsed (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_WALK_STATE *WalkState)
+{
+ const ACPI_OPCODE_INFO *ParentInfo;
+
+ ACPI_FUNCTION_TRACE_PTR (DsIsResultUsed, Op);
+
+
+ /* Must have both an Op and a Result Object */
+
+ if (!Op)
+ {
+ ACPI_ERROR ((AE_INFO, "Null Op"));
+ return_UINT8 (TRUE);
+ }
+
+ /*
+ * We know that this operator is not a
+ * Return() operator (would not come here.) The following code is the
+ * optional support for a so-called "implicit return". Some AML code
+ * assumes that the last value of the method is "implicitly" returned
+ * to the caller. Just save the last result as the return value.
+ * NOTE: this is optional because the ASL language does not actually
+ * support this behavior.
+ */
+ (void) AcpiDsDoImplicitReturn (WalkState->ResultObj, WalkState, TRUE);
+
+ /*
+ * Now determine if the parent will use the result
+ *
+ * If there is no parent, or the parent is a ScopeOp, we are executing
+ * at the method level. An executing method typically has no parent,
+ * since each method is parsed separately. A method invoked externally
+ * via ExecuteControlMethod has a ScopeOp as the parent.
+ */
+ if ((!Op->Common.Parent) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_SCOPE_OP))
+ {
+ /* No parent, the return value cannot possibly be used */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "At Method level, result of [%s] not used\n",
+ AcpiPsGetOpcodeName (Op->Common.AmlOpcode)));
+ return_UINT8 (FALSE);
+ }
+
+ /* Get info on the parent. The RootOp is AML_SCOPE */
+
+ ParentInfo = AcpiPsGetOpcodeInfo (Op->Common.Parent->Common.AmlOpcode);
+ if (ParentInfo->Class == AML_CLASS_UNKNOWN)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Unknown parent opcode Op=%p", Op));
+ return_UINT8 (FALSE);
+ }
+
+ /*
+ * Decide what to do with the result based on the parent. If
+ * the parent opcode will not use the result, delete the object.
+ * Otherwise leave it as is, it will be deleted when it is used
+ * as an operand later.
+ */
+ switch (ParentInfo->Class)
+ {
+ case AML_CLASS_CONTROL:
+
+ switch (Op->Common.Parent->Common.AmlOpcode)
+ {
+ case AML_RETURN_OP:
+
+ /* Never delete the return value associated with a return opcode */
+
+ goto ResultUsed;
+
+ case AML_IF_OP:
+ case AML_WHILE_OP:
+
+ /*
+ * If we are executing the predicate AND this is the predicate op,
+ * we will use the return value
+ */
+ if ((WalkState->ControlState->Common.State == ACPI_CONTROL_PREDICATE_EXECUTING) &&
+ (WalkState->ControlState->Control.PredicateOp == Op))
+ {
+ goto ResultUsed;
+ }
+ break;
+
+ default:
+ /* Ignore other control opcodes */
+ break;
+ }
+
+ /* The general control opcode returns no result */
+
+ goto ResultNotUsed;
+
+
+ case AML_CLASS_CREATE:
+
+ /*
+ * These opcodes allow TermArg(s) as operands and therefore
+ * the operands can be method calls. The result is used.
+ */
+ goto ResultUsed;
+
+
+ case AML_CLASS_NAMED_OBJECT:
+
+ if ((Op->Common.Parent->Common.AmlOpcode == AML_REGION_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_DATA_REGION_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_BUFFER_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_INT_EVAL_SUBTREE_OP))
+ {
+ /*
+ * These opcodes allow TermArg(s) as operands and therefore
+ * the operands can be method calls. The result is used.
+ */
+ goto ResultUsed;
+ }
+
+ goto ResultNotUsed;
+
+
+ default:
+
+ /*
+ * In all other cases. the parent will actually use the return
+ * object, so keep it.
+ */
+ goto ResultUsed;
+ }
+
+
+ResultUsed:
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Result of [%s] used by Parent [%s] Op=%p\n",
+ AcpiPsGetOpcodeName (Op->Common.AmlOpcode),
+ AcpiPsGetOpcodeName (Op->Common.Parent->Common.AmlOpcode), Op));
+
+ return_UINT8 (TRUE);
+
+
+ResultNotUsed:
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Result of [%s] not used by Parent [%s] Op=%p\n",
+ AcpiPsGetOpcodeName (Op->Common.AmlOpcode),
+ AcpiPsGetOpcodeName (Op->Common.Parent->Common.AmlOpcode), Op));
+
+ return_UINT8 (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsDeleteResultIfNotUsed
+ *
+ * PARAMETERS: Op - Current parse Op
+ * ResultObj - Result of the operation
+ * WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Used after interpretation of an opcode. If there is an internal
+ * result descriptor, check if the parent opcode will actually use
+ * this result. If not, delete the result now so that it will
+ * not become orphaned.
+ *
+ ******************************************************************************/
+
+void
+AcpiDsDeleteResultIfNotUsed (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_OPERAND_OBJECT *ResultObj,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsDeleteResultIfNotUsed, ResultObj);
+
+
+ if (!Op)
+ {
+ ACPI_ERROR ((AE_INFO, "Null Op"));
+ return_VOID;
+ }
+
+ if (!ResultObj)
+ {
+ return_VOID;
+ }
+
+ if (!AcpiDsIsResultUsed (Op, WalkState))
+ {
+ /* Must pop the result stack (ObjDesc should be equal to ResultObj) */
+
+ Status = AcpiDsResultPop (&ObjDesc, WalkState);
+ if (ACPI_SUCCESS (Status))
+ {
+ AcpiUtRemoveReference (ResultObj);
+ }
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsResolveOperands
+ *
+ * PARAMETERS: WalkState - Current walk state with operands on stack
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Resolve all operands to their values. Used to prepare
+ * arguments to a control method invocation (a call from one
+ * method to another.)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsResolveOperands (
+ ACPI_WALK_STATE *WalkState)
+{
+ UINT32 i;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsResolveOperands, WalkState);
+
+
+ /*
+ * Attempt to resolve each of the valid operands
+ * Method arguments are passed by reference, not by value. This means
+ * that the actual objects are passed, not copies of the objects.
+ */
+ for (i = 0; i < WalkState->NumOperands; i++)
+ {
+ Status = AcpiExResolveToValue (&WalkState->Operands[i], WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsClearOperands
+ *
+ * PARAMETERS: WalkState - Current walk state with operands on stack
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Clear all operands on the current walk state operand stack.
+ *
+ ******************************************************************************/
+
+void
+AcpiDsClearOperands (
+ ACPI_WALK_STATE *WalkState)
+{
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsClearOperands, WalkState);
+
+
+ /* Remove a reference on each operand on the stack */
+
+ for (i = 0; i < WalkState->NumOperands; i++)
+ {
+ /*
+ * Remove a reference to all operands, including both
+ * "Arguments" and "Targets".
+ */
+ AcpiUtRemoveReference (WalkState->Operands[i]);
+ WalkState->Operands[i] = NULL;
+ }
+
+ WalkState->NumOperands = 0;
+ return_VOID;
+}
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsCreateOperand
+ *
+ * PARAMETERS: WalkState - Current walk state
+ * Arg - Parse object for the argument
+ * ArgIndex - Which argument (zero based)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Translate a parse tree object that is an argument to an AML
+ * opcode to the equivalent interpreter object. This may include
+ * looking up a name or entering a new name into the internal
+ * namespace.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsCreateOperand (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Arg,
+ UINT32 ArgIndex)
+{
+ ACPI_STATUS Status = AE_OK;
+ char *NameString;
+ UINT32 NameLength;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_PARSE_OBJECT *ParentOp;
+ UINT16 Opcode;
+ ACPI_INTERPRETER_MODE InterpreterMode;
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsCreateOperand, Arg);
+
+
+ /* A valid name must be looked up in the namespace */
+
+ if ((Arg->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
+ (Arg->Common.Value.String) &&
+ !(Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Getting a name: Arg=%p\n", Arg));
+
+ /* Get the entire name string from the AML stream */
+
+ Status = AcpiExGetNameString (ACPI_TYPE_ANY, Arg->Common.Value.Buffer,
+ &NameString, &NameLength);
+
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* All prefixes have been handled, and the name is in NameString */
+
+ /*
+ * Special handling for BufferField declarations. This is a deferred
+ * opcode that unfortunately defines the field name as the last
+ * parameter instead of the first. We get here when we are performing
+ * the deferred execution, so the actual name of the field is already
+ * in the namespace. We don't want to attempt to look it up again
+ * because we may be executing in a different scope than where the
+ * actual opcode exists.
+ */
+ if ((WalkState->DeferredNode) &&
+ (WalkState->DeferredNode->Type == ACPI_TYPE_BUFFER_FIELD) &&
+ (ArgIndex == (UINT32) ((WalkState->Opcode == AML_CREATE_FIELD_OP) ? 3 : 2)))
+ {
+ ObjDesc = ACPI_CAST_PTR (
+ ACPI_OPERAND_OBJECT, WalkState->DeferredNode);
+ Status = AE_OK;
+ }
+ else /* All other opcodes */
+ {
+ /*
+ * Differentiate between a namespace "create" operation
+ * versus a "lookup" operation (IMODE_LOAD_PASS2 vs.
+ * IMODE_EXECUTE) in order to support the creation of
+ * namespace objects during the execution of control methods.
+ */
+ ParentOp = Arg->Common.Parent;
+ OpInfo = AcpiPsGetOpcodeInfo (ParentOp->Common.AmlOpcode);
+ if ((OpInfo->Flags & AML_NSNODE) &&
+ (ParentOp->Common.AmlOpcode != AML_INT_METHODCALL_OP) &&
+ (ParentOp->Common.AmlOpcode != AML_REGION_OP) &&
+ (ParentOp->Common.AmlOpcode != AML_INT_NAMEPATH_OP))
+ {
+ /* Enter name into namespace if not found */
+
+ InterpreterMode = ACPI_IMODE_LOAD_PASS2;
+ }
+ else
+ {
+ /* Return a failure if name not found */
+
+ InterpreterMode = ACPI_IMODE_EXECUTE;
+ }
+
+ Status = AcpiNsLookup (WalkState->ScopeInfo, NameString,
+ ACPI_TYPE_ANY, InterpreterMode,
+ ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
+ WalkState,
+ ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, &ObjDesc));
+ /*
+ * The only case where we pass through (ignore) a NOT_FOUND
+ * error is for the CondRefOf opcode.
+ */
+ if (Status == AE_NOT_FOUND)
+ {
+ if (ParentOp->Common.AmlOpcode == AML_COND_REF_OF_OP)
+ {
+ /*
+ * For the Conditional Reference op, it's OK if
+ * the name is not found; We just need a way to
+ * indicate this to the interpreter, set the
+ * object to the root
+ */
+ ObjDesc = ACPI_CAST_PTR (
+ ACPI_OPERAND_OBJECT, AcpiGbl_RootNode);
+ Status = AE_OK;
+ }
+ else
+ {
+ /*
+ * We just plain didn't find it -- which is a
+ * very serious error at this point
+ */
+ Status = AE_AML_NAME_NOT_FOUND;
+ }
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (NameString, Status);
+ }
+ }
+
+ /* Free the namestring created above */
+
+ ACPI_FREE (NameString);
+
+ /* Check status from the lookup */
+
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Put the resulting object onto the current object stack */
+
+ Status = AcpiDsObjStackPush (ObjDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ ACPI_DEBUGGER_EXEC (AcpiDbDisplayArgumentObject (ObjDesc, WalkState));
+ }
+ else
+ {
+ /* Check for null name case */
+
+ if ((Arg->Common.AmlOpcode == AML_INT_NAMEPATH_OP) &&
+ !(Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
+ {
+ /*
+ * If the name is null, this means that this is an
+ * optional result parameter that was not specified
+ * in the original ASL. Create a Zero Constant for a
+ * placeholder. (Store to a constant is a Noop.)
+ */
+ Opcode = AML_ZERO_OP; /* Has no arguments! */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Null namepath: Arg=%p\n", Arg));
+ }
+ else
+ {
+ Opcode = Arg->Common.AmlOpcode;
+ }
+
+ /* Get the object type of the argument */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Opcode);
+ if (OpInfo->ObjectType == ACPI_TYPE_INVALID)
+ {
+ return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
+ }
+
+ if ((OpInfo->Flags & AML_HAS_RETVAL) || (Arg->Common.Flags & ACPI_PARSEOP_IN_STACK))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Argument previously created, already stacked\n"));
+
+ ACPI_DEBUGGER_EXEC (AcpiDbDisplayArgumentObject (
+ WalkState->Operands [WalkState->NumOperands - 1], WalkState));
+
+ /*
+ * Use value that was already previously returned
+ * by the evaluation of this argument
+ */
+ Status = AcpiDsResultPop (&ObjDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ /*
+ * Only error is underflow, and this indicates
+ * a missing or null operand!
+ */
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Missing or null operand"));
+ return_ACPI_STATUS (Status);
+ }
+ }
+ else
+ {
+ /* Create an ACPI_INTERNAL_OBJECT for the argument */
+
+ ObjDesc = AcpiUtCreateInternalObject (OpInfo->ObjectType);
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Initialize the new object */
+
+ Status = AcpiDsInitObjectFromOp (
+ WalkState, Arg, Opcode, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtDeleteObjectDesc (ObjDesc);
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Put the operand object on the object stack */
+
+ Status = AcpiDsObjStackPush (ObjDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUGGER_EXEC (AcpiDbDisplayArgumentObject (ObjDesc, WalkState));
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsCreateOperands
+ *
+ * PARAMETERS: WalkState - Current state
+ * FirstArg - First argument of a parser argument tree
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert an operator's arguments from a parse tree format to
+ * namespace objects and place those argument object on the object
+ * stack in preparation for evaluation by the interpreter.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsCreateOperands (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *FirstArg)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_PARSE_OBJECT *Arg;
+ ACPI_PARSE_OBJECT *Arguments[ACPI_OBJ_NUM_OPERANDS];
+ UINT8 ArgCount = 0;
+ UINT8 Count = 0;
+ UINT8 Index = WalkState->NumOperands;
+ UINT8 i;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsCreateOperands, FirstArg);
+
+
+ /* Get all arguments in the list */
+
+ Arg = FirstArg;
+ while (Arg)
+ {
+ if (Index >= ACPI_OBJ_NUM_OPERANDS)
+ {
+ return_ACPI_STATUS (AE_BAD_DATA);
+ }
+
+ Arguments[Index] = Arg;
+ WalkState->Operands [Index] = NULL;
+
+ /* Move on to next argument, if any */
+
+ Arg = Arg->Common.Next;
+ ArgCount++;
+ Index++;
+ }
+
+ Index--;
+
+ /* It is the appropriate order to get objects from the Result stack */
+
+ for (i = 0; i < ArgCount; i++)
+ {
+ Arg = Arguments[Index];
+
+ /* Force the filling of the operand stack in inverse order */
+
+ WalkState->OperandIndex = Index;
+
+ Status = AcpiDsCreateOperand (WalkState, Arg, Index);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ Count++;
+ Index--;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Arg #%d (%p) done, Arg1=%p\n",
+ Index, Arg, FirstArg));
+ }
+
+ return_ACPI_STATUS (Status);
+
+
+Cleanup:
+ /*
+ * We must undo everything done above; meaning that we must
+ * pop everything off of the operand stack and delete those
+ * objects
+ */
+ AcpiDsObjStackPopAndDelete (ArgCount, WalkState);
+
+ ACPI_EXCEPTION ((AE_INFO, Status, "While creating Arg %d", Index));
+ return_ACPI_STATUS (Status);
+}
+
+
+/*****************************************************************************
+ *
+ * FUNCTION: AcpiDsEvaluateNamePath
+ *
+ * PARAMETERS: WalkState - Current state of the parse tree walk,
+ * the opcode of current operation should be
+ * AML_INT_NAMEPATH_OP
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Translate the -NamePath- parse tree object to the equivalent
+ * interpreter object, convert it to value, if needed, duplicate
+ * it, if needed, and push it onto the current result stack.
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+AcpiDsEvaluateNamePath (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_PARSE_OBJECT *Op = WalkState->Op;
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *NewObjDesc;
+ UINT8 Type;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsEvaluateNamePath, WalkState);
+
+
+ if (!Op->Common.Parent)
+ {
+ /* This happens after certain exception processing */
+
+ goto Exit;
+ }
+
+ if ((Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_REF_OF_OP))
+ {
+ /* TBD: Should we specify this feature as a bit of OpInfo->Flags of these opcodes? */
+
+ goto Exit;
+ }
+
+ Status = AcpiDsCreateOperand (WalkState, Op, 0);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Exit;
+ }
+
+ if (Op->Common.Flags & ACPI_PARSEOP_TARGET)
+ {
+ NewObjDesc = *Operand;
+ goto PushResult;
+ }
+
+ Type = ACPI_GET_OBJECT_TYPE (*Operand);
+
+ Status = AcpiExResolveToValue (Operand, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Exit;
+ }
+
+ if (Type == ACPI_TYPE_INTEGER)
+ {
+ /* It was incremented by AcpiExResolveToValue */
+
+ AcpiUtRemoveReference (*Operand);
+
+ Status = AcpiUtCopyIobjectToIobject (*Operand, &NewObjDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Exit;
+ }
+ }
+ else
+ {
+ /*
+ * The object either was anew created or is
+ * a Namespace node - don't decrement it.
+ */
+ NewObjDesc = *Operand;
+ }
+
+ /* Cleanup for name-path operand */
+
+ Status = AcpiDsObjStackPop (1, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ WalkState->ResultObj = NewObjDesc;
+ goto Exit;
+ }
+
+PushResult:
+
+ WalkState->ResultObj = NewObjDesc;
+
+ Status = AcpiDsResultPush (WalkState->ResultObj, WalkState);
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Force to take it from stack */
+
+ Op->Common.Flags |= ACPI_PARSEOP_IN_STACK;
+ }
+
+Exit:
+
+ return_ACPI_STATUS (Status);
+}
diff --git a/sys/contrib/dev/acpica/dswexec.c b/sys/contrib/dev/acpica/dswexec.c
new file mode 100644
index 0000000..0eef999
--- /dev/null
+++ b/sys/contrib/dev/acpica/dswexec.c
@@ -0,0 +1,833 @@
+/******************************************************************************
+ *
+ * Module Name: dswexec - Dispatcher method execution callbacks;
+ * dispatch to interpreter.
+ * $Revision: 1.134 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __DSWEXEC_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdebug.h>
+
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dswexec")
+
+/*
+ * Dispatch table for opcode classes
+ */
+static ACPI_EXECUTE_OP AcpiGbl_OpTypeDispatch [] =
+{
+ AcpiExOpcode_0A_0T_1R,
+ AcpiExOpcode_1A_0T_0R,
+ AcpiExOpcode_1A_0T_1R,
+ AcpiExOpcode_1A_1T_0R,
+ AcpiExOpcode_1A_1T_1R,
+ AcpiExOpcode_2A_0T_0R,
+ AcpiExOpcode_2A_0T_1R,
+ AcpiExOpcode_2A_1T_1R,
+ AcpiExOpcode_2A_2T_1R,
+ AcpiExOpcode_3A_0T_0R,
+ AcpiExOpcode_3A_1T_1R,
+ AcpiExOpcode_6A_0T_1R
+};
+
+
+/*****************************************************************************
+ *
+ * FUNCTION: AcpiDsGetPredicateValue
+ *
+ * PARAMETERS: WalkState - Current state of the parse tree walk
+ * ResultObj - if non-zero, pop result from result stack
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get the result of a predicate evaluation
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+AcpiDsGetPredicateValue (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT *ResultObj)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *LocalObjDesc = NULL;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsGetPredicateValue, WalkState);
+
+
+ WalkState->ControlState->Common.State = 0;
+
+ if (ResultObj)
+ {
+ Status = AcpiDsResultPop (&ObjDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not get result from predicate evaluation"));
+
+ return_ACPI_STATUS (Status);
+ }
+ }
+ else
+ {
+ Status = AcpiDsCreateOperand (WalkState, WalkState->Op, 0);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiExResolveToValue (&WalkState->Operands [0], WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ObjDesc = WalkState->Operands [0];
+ }
+
+ if (!ObjDesc)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "No predicate ObjDesc=%p State=%p",
+ ObjDesc, WalkState));
+
+ return_ACPI_STATUS (AE_AML_NO_OPERAND);
+ }
+
+ /*
+ * Result of predicate evaluation must be an Integer
+ * object. Implicitly convert the argument if necessary.
+ */
+ Status = AcpiExConvertToInteger (ObjDesc, &LocalObjDesc, 16);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ if (ACPI_GET_OBJECT_TYPE (LocalObjDesc) != ACPI_TYPE_INTEGER)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Bad predicate (not an integer) ObjDesc=%p State=%p Type=%X",
+ ObjDesc, WalkState, ACPI_GET_OBJECT_TYPE (ObjDesc)));
+
+ Status = AE_AML_OPERAND_TYPE;
+ goto Cleanup;
+ }
+
+ /* Truncate the predicate to 32-bits if necessary */
+
+ AcpiExTruncateFor32bitTable (LocalObjDesc);
+
+ /*
+ * Save the result of the predicate evaluation on
+ * the control stack
+ */
+ if (LocalObjDesc->Integer.Value)
+ {
+ WalkState->ControlState->Common.Value = TRUE;
+ }
+ else
+ {
+ /*
+ * Predicate is FALSE, we will just toss the
+ * rest of the package
+ */
+ WalkState->ControlState->Common.Value = FALSE;
+ Status = AE_CTRL_FALSE;
+ }
+
+
+Cleanup:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Completed a predicate eval=%X Op=%p\n",
+ WalkState->ControlState->Common.Value, WalkState->Op));
+
+ /* Break to debugger to display result */
+
+ ACPI_DEBUGGER_EXEC (AcpiDbDisplayResultObject (LocalObjDesc, WalkState));
+
+ /*
+ * Delete the predicate result object (we know that
+ * we don't need it anymore)
+ */
+ if (LocalObjDesc != ObjDesc)
+ {
+ AcpiUtRemoveReference (LocalObjDesc);
+ }
+ AcpiUtRemoveReference (ObjDesc);
+
+ WalkState->ControlState->Common.State = ACPI_CONTROL_NORMAL;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*****************************************************************************
+ *
+ * FUNCTION: AcpiDsExecBeginOp
+ *
+ * PARAMETERS: WalkState - Current state of the parse tree walk
+ * OutOp - Where to return op if a new one is created
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback used during the execution of control
+ * methods. This is where most operators and operands are
+ * dispatched to the interpreter.
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+AcpiDsExecBeginOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT **OutOp)
+{
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_STATUS Status = AE_OK;
+ UINT32 OpcodeClass;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsExecBeginOp, WalkState);
+
+
+ Op = WalkState->Op;
+ if (!Op)
+ {
+ Status = AcpiDsLoad2BeginOp (WalkState, OutOp);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+
+ Op = *OutOp;
+ WalkState->Op = Op;
+ WalkState->Opcode = Op->Common.AmlOpcode;
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+
+ if (AcpiNsOpensScope (WalkState->OpInfo->ObjectType))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "(%s) Popping scope for Op %p\n",
+ AcpiUtGetTypeName (WalkState->OpInfo->ObjectType), Op));
+
+ Status = AcpiDsScopeStackPop (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+ }
+ }
+
+ if (Op == WalkState->Origin)
+ {
+ if (OutOp)
+ {
+ *OutOp = Op;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * If the previous opcode was a conditional, this opcode
+ * must be the beginning of the associated predicate.
+ * Save this knowledge in the current scope descriptor
+ */
+ if ((WalkState->ControlState) &&
+ (WalkState->ControlState->Common.State ==
+ ACPI_CONTROL_CONDITIONAL_EXECUTING))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Exec predicate Op=%p State=%p\n",
+ Op, WalkState));
+
+ WalkState->ControlState->Common.State = ACPI_CONTROL_PREDICATE_EXECUTING;
+
+ /* Save start of predicate */
+
+ WalkState->ControlState->Control.PredicateOp = Op;
+ }
+
+
+ OpcodeClass = WalkState->OpInfo->Class;
+
+ /* We want to send namepaths to the load code */
+
+ if (Op->Common.AmlOpcode == AML_INT_NAMEPATH_OP)
+ {
+ OpcodeClass = AML_CLASS_NAMED_OBJECT;
+ }
+
+ /*
+ * Handle the opcode based upon the opcode type
+ */
+ switch (OpcodeClass)
+ {
+ case AML_CLASS_CONTROL:
+
+ Status = AcpiDsExecBeginControlOp (WalkState, Op);
+ break;
+
+
+ case AML_CLASS_NAMED_OBJECT:
+
+ if (WalkState->WalkType & ACPI_WALK_METHOD)
+ {
+ /*
+ * Found a named object declaration during method execution;
+ * we must enter this object into the namespace. The created
+ * object is temporary and will be deleted upon completion of
+ * the execution of this method.
+ */
+ Status = AcpiDsLoad2BeginOp (WalkState, NULL);
+ }
+
+ break;
+
+
+ case AML_CLASS_EXECUTE:
+ case AML_CLASS_CREATE:
+
+ break;
+
+
+ default:
+ break;
+ }
+
+ /* Nothing to do here during method execution */
+
+ return_ACPI_STATUS (Status);
+
+
+ErrorExit:
+ Status = AcpiDsMethodError (Status, WalkState);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*****************************************************************************
+ *
+ * FUNCTION: AcpiDsExecEndOp
+ *
+ * PARAMETERS: WalkState - Current state of the parse tree walk
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback used during the execution of control
+ * methods. The only thing we really need to do here is to
+ * notice the beginning of IF, ELSE, and WHILE blocks.
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+AcpiDsExecEndOp (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_STATUS Status = AE_OK;
+ UINT32 OpType;
+ UINT32 OpClass;
+ ACPI_PARSE_OBJECT *NextOp;
+ ACPI_PARSE_OBJECT *FirstArg;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsExecEndOp, WalkState);
+
+
+ Op = WalkState->Op;
+ OpType = WalkState->OpInfo->Type;
+ OpClass = WalkState->OpInfo->Class;
+
+ if (OpClass == AML_CLASS_UNKNOWN)
+ {
+ ACPI_ERROR ((AE_INFO, "Unknown opcode %X", Op->Common.AmlOpcode));
+ return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
+ }
+
+ FirstArg = Op->Common.Value.Arg;
+
+ /* Init the walk state */
+
+ WalkState->NumOperands = 0;
+ WalkState->OperandIndex = 0;
+ WalkState->ReturnDesc = NULL;
+ WalkState->ResultObj = NULL;
+
+ /* Call debugger for single step support (DEBUG build only) */
+
+ ACPI_DEBUGGER_EXEC (Status = AcpiDbSingleStep (WalkState, Op, OpClass));
+ ACPI_DEBUGGER_EXEC (if (ACPI_FAILURE (Status)) {return_ACPI_STATUS (Status);});
+
+ /* Decode the Opcode Class */
+
+ switch (OpClass)
+ {
+ case AML_CLASS_ARGUMENT: /* Constants, literals, etc. */
+
+ if (WalkState->Opcode == AML_INT_NAMEPATH_OP)
+ {
+ Status = AcpiDsEvaluateNamePath (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+ }
+ break;
+
+
+ case AML_CLASS_EXECUTE: /* Most operators with arguments */
+
+ /* Build resolved operand stack */
+
+ Status = AcpiDsCreateOperands (WalkState, FirstArg);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /*
+ * All opcodes require operand resolution, with the only exceptions
+ * being the ObjectType and SizeOf operators.
+ */
+ if (!(WalkState->OpInfo->Flags & AML_NO_OPERAND_RESOLVE))
+ {
+ /* Resolve all operands */
+
+ Status = AcpiExResolveOperands (WalkState->Opcode,
+ &(WalkState->Operands [WalkState->NumOperands -1]),
+ WalkState);
+ if (ACPI_SUCCESS (Status))
+ {
+ ACPI_DUMP_OPERANDS (ACPI_WALK_OPERANDS, ACPI_IMODE_EXECUTE,
+ AcpiPsGetOpcodeName (WalkState->Opcode),
+ WalkState->NumOperands, "after ExResolveOperands");
+ }
+ }
+
+ if (ACPI_SUCCESS (Status))
+ {
+ /*
+ * Dispatch the request to the appropriate interpreter handler
+ * routine. There is one routine per opcode "type" based upon the
+ * number of opcode arguments and return type.
+ */
+ Status = AcpiGbl_OpTypeDispatch[OpType] (WalkState);
+ }
+ else
+ {
+ /*
+ * Treat constructs of the form "Store(LocalX,LocalX)" as noops when the
+ * Local is uninitialized.
+ */
+ if ((Status == AE_AML_UNINITIALIZED_LOCAL) &&
+ (WalkState->Opcode == AML_STORE_OP) &&
+ (WalkState->Operands[0]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
+ (WalkState->Operands[1]->Common.Type == ACPI_TYPE_LOCAL_REFERENCE) &&
+ (WalkState->Operands[0]->Reference.Opcode ==
+ WalkState->Operands[1]->Reference.Opcode) &&
+ (WalkState->Operands[0]->Reference.Offset ==
+ WalkState->Operands[1]->Reference.Offset))
+ {
+ Status = AE_OK;
+ }
+ else
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "While resolving operands for [%s]",
+ AcpiPsGetOpcodeName (WalkState->Opcode)));
+ }
+ }
+
+ /* Always delete the argument objects and clear the operand stack */
+
+ AcpiDsClearOperands (WalkState);
+
+ /*
+ * If a result object was returned from above, push it on the
+ * current result stack
+ */
+ if (ACPI_SUCCESS (Status) &&
+ WalkState->ResultObj)
+ {
+ Status = AcpiDsResultPush (WalkState->ResultObj, WalkState);
+ }
+ break;
+
+
+ default:
+
+ switch (OpType)
+ {
+ case AML_TYPE_CONTROL: /* Type 1 opcode, IF/ELSE/WHILE/NOOP */
+
+ /* 1 Operand, 0 ExternalResult, 0 InternalResult */
+
+ Status = AcpiDsExecEndControlOp (WalkState, Op);
+
+ break;
+
+
+ case AML_TYPE_METHOD_CALL:
+
+ /*
+ * If the method is referenced from within a package
+ * declaration, it is not a invocation of the method, just
+ * a reference to it.
+ */
+ if ((Op->Asl.Parent) &&
+ ((Op->Asl.Parent->Asl.AmlOpcode == AML_PACKAGE_OP) ||
+ (Op->Asl.Parent->Asl.AmlOpcode == AML_VAR_PACKAGE_OP)))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Method Reference in a Package, Op=%p\n", Op));
+
+ Op->Common.Node = (ACPI_NAMESPACE_NODE *) Op->Asl.Value.Arg->Asl.Node->Object;
+ AcpiUtAddReference (Op->Asl.Value.Arg->Asl.Node->Object);
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Method invocation, Op=%p\n", Op));
+
+ /*
+ * (AML_METHODCALL) Op->Asl.Value.Arg->Asl.Node contains
+ * the method Node pointer
+ */
+ /* NextOp points to the op that holds the method name */
+
+ NextOp = FirstArg;
+
+ /* NextOp points to first argument op */
+
+ NextOp = NextOp->Common.Next;
+
+ /*
+ * Get the method's arguments and put them on the operand stack
+ */
+ Status = AcpiDsCreateOperands (WalkState, NextOp);
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+
+ /*
+ * Since the operands will be passed to another control method,
+ * we must resolve all local references here (Local variables,
+ * arguments to *this* method, etc.)
+ */
+ Status = AcpiDsResolveOperands (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ /* On error, clear all resolved operands */
+
+ AcpiDsClearOperands (WalkState);
+ break;
+ }
+
+ /*
+ * Tell the walk loop to preempt this running method and
+ * execute the new method
+ */
+ Status = AE_CTRL_TRANSFER;
+
+ /*
+ * Return now; we don't want to disturb anything,
+ * especially the operand count!
+ */
+ return_ACPI_STATUS (Status);
+
+
+ case AML_TYPE_CREATE_FIELD:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Executing CreateField Buffer/Index Op=%p\n", Op));
+
+ Status = AcpiDsLoad2EndOp (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+
+ Status = AcpiDsEvalBufferFieldOperands (WalkState, Op);
+ break;
+
+
+ case AML_TYPE_CREATE_OBJECT:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Executing CreateObject (Buffer/Package) Op=%p\n", Op));
+
+ switch (Op->Common.Parent->Common.AmlOpcode)
+ {
+ case AML_NAME_OP:
+
+ /*
+ * Put the Node on the object stack (Contains the ACPI Name
+ * of this object)
+ */
+ WalkState->Operands[0] = (void *) Op->Common.Parent->Common.Node;
+ WalkState->NumOperands = 1;
+
+ Status = AcpiDsCreateNode (WalkState,
+ Op->Common.Parent->Common.Node,
+ Op->Common.Parent);
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+
+ /* Fall through */
+ /*lint -fallthrough */
+
+ case AML_INT_EVAL_SUBTREE_OP:
+
+ Status = AcpiDsEvalDataObjectOperands (WalkState, Op,
+ AcpiNsGetAttachedObject (Op->Common.Parent->Common.Node));
+ break;
+
+ default:
+
+ Status = AcpiDsEvalDataObjectOperands (WalkState, Op, NULL);
+ break;
+ }
+
+ /*
+ * If a result object was returned from above, push it on the
+ * current result stack
+ */
+ if (WalkState->ResultObj)
+ {
+ Status = AcpiDsResultPush (WalkState->ResultObj, WalkState);
+ }
+ break;
+
+
+ case AML_TYPE_NAMED_FIELD:
+ case AML_TYPE_NAMED_COMPLEX:
+ case AML_TYPE_NAMED_SIMPLE:
+ case AML_TYPE_NAMED_NO_OBJ:
+
+ Status = AcpiDsLoad2EndOp (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+
+ if (Op->Common.AmlOpcode == AML_REGION_OP)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Executing OpRegion Address/Length Op=%p\n", Op));
+
+ Status = AcpiDsEvalRegionOperands (WalkState, Op);
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+ }
+ break;
+
+
+ case AML_TYPE_UNDEFINED:
+
+ ACPI_ERROR ((AE_INFO,
+ "Undefined opcode type Op=%p", Op));
+ return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
+
+
+ case AML_TYPE_BOGUS:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Internal opcode=%X type Op=%p\n",
+ WalkState->Opcode, Op));
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO,
+ "Unimplemented opcode, class=%X type=%X Opcode=%X Op=%p",
+ OpClass, OpType, Op->Common.AmlOpcode, Op));
+
+ Status = AE_NOT_IMPLEMENTED;
+ break;
+ }
+ }
+
+ /*
+ * ACPI 2.0 support for 64-bit integers: Truncate numeric
+ * result value if we are executing from a 32-bit ACPI table
+ */
+ AcpiExTruncateFor32bitTable (WalkState->ResultObj);
+
+ /*
+ * Check if we just completed the evaluation of a
+ * conditional predicate
+ */
+ if ((ACPI_SUCCESS (Status)) &&
+ (WalkState->ControlState) &&
+ (WalkState->ControlState->Common.State ==
+ ACPI_CONTROL_PREDICATE_EXECUTING) &&
+ (WalkState->ControlState->Control.PredicateOp == Op))
+ {
+ Status = AcpiDsGetPredicateValue (WalkState, WalkState->ResultObj);
+ WalkState->ResultObj = NULL;
+ }
+
+
+Cleanup:
+
+ if (WalkState->ResultObj)
+ {
+ /* Break to debugger to display result */
+
+ ACPI_DEBUGGER_EXEC (AcpiDbDisplayResultObject (WalkState->ResultObj,
+ WalkState));
+
+ /*
+ * Delete the result op if and only if:
+ * Parent will not use the result -- such as any
+ * non-nested type2 op in a method (parent will be method)
+ */
+ AcpiDsDeleteResultIfNotUsed (Op, WalkState->ResultObj, WalkState);
+ }
+
+#ifdef _UNDER_DEVELOPMENT
+
+ if (WalkState->ParserState.Aml == WalkState->ParserState.AmlEnd)
+ {
+ AcpiDbMethodEnd (WalkState);
+ }
+#endif
+
+ /* Invoke exception handler on error */
+
+ if (ACPI_FAILURE (Status))
+ {
+ Status = AcpiDsMethodError (Status, WalkState);
+ }
+
+ /* Always clear the object stack */
+
+ WalkState->NumOperands = 0;
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/dswload.c b/sys/contrib/dev/acpica/dswload.c
new file mode 100644
index 0000000..7a65942
--- /dev/null
+++ b/sys/contrib/dev/acpica/dswload.c
@@ -0,0 +1,1294 @@
+/******************************************************************************
+ *
+ * Module Name: dswload - Dispatcher namespace load callbacks
+ * $Revision: 1.117 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __DSWLOAD_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acevents.h>
+
+#ifdef ACPI_ASL_COMPILER
+#include <contrib/dev/acpica/acdisasm.h>
+#endif
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dswload")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsInitCallbacks
+ *
+ * PARAMETERS: WalkState - Current state of the parse tree walk
+ * PassNumber - 1, 2, or 3
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Init walk state callbacks
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsInitCallbacks (
+ ACPI_WALK_STATE *WalkState,
+ UINT32 PassNumber)
+{
+
+ switch (PassNumber)
+ {
+ case 1:
+ WalkState->ParseFlags = ACPI_PARSE_LOAD_PASS1 |
+ ACPI_PARSE_DELETE_TREE;
+ WalkState->DescendingCallback = AcpiDsLoad1BeginOp;
+ WalkState->AscendingCallback = AcpiDsLoad1EndOp;
+ break;
+
+ case 2:
+ WalkState->ParseFlags = ACPI_PARSE_LOAD_PASS1 |
+ ACPI_PARSE_DELETE_TREE;
+ WalkState->DescendingCallback = AcpiDsLoad2BeginOp;
+ WalkState->AscendingCallback = AcpiDsLoad2EndOp;
+ break;
+
+ case 3:
+#ifndef ACPI_NO_METHOD_EXECUTION
+ WalkState->ParseFlags |= ACPI_PARSE_EXECUTE |
+ ACPI_PARSE_DELETE_TREE;
+ WalkState->DescendingCallback = AcpiDsExecBeginOp;
+ WalkState->AscendingCallback = AcpiDsExecEndOp;
+#endif
+ break;
+
+ default:
+ return (AE_BAD_PARAMETER);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsLoad1BeginOp
+ *
+ * PARAMETERS: WalkState - Current state of the parse tree walk
+ * OutOp - Where to return op if a new one is created
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback used during the loading of ACPI tables.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsLoad1BeginOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT **OutOp)
+{
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+ ACPI_OBJECT_TYPE ObjectType;
+ char *Path;
+ UINT32 Flags;
+
+
+ ACPI_FUNCTION_TRACE (DsLoad1BeginOp);
+
+
+ Op = WalkState->Op;
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));
+
+ /* We are only interested in opcodes that have an associated name */
+
+ if (Op)
+ {
+ if (!(WalkState->OpInfo->Flags & AML_NAMED))
+ {
+ *OutOp = Op;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Check if this object has already been installed in the namespace */
+
+ if (Op->Common.Node)
+ {
+ *OutOp = Op;
+ return_ACPI_STATUS (AE_OK);
+ }
+ }
+
+ Path = AcpiPsGetNextNamestring (&WalkState->ParserState);
+
+ /* Map the raw opcode into an internal object type */
+
+ ObjectType = WalkState->OpInfo->ObjectType;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "State=%p Op=%p [%s]\n", WalkState, Op, AcpiUtGetTypeName (ObjectType)));
+
+ switch (WalkState->Opcode)
+ {
+ case AML_SCOPE_OP:
+
+ /*
+ * 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 = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
+ ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT, WalkState, &(Node));
+#ifdef ACPI_ASL_COMPILER
+ if (Status == AE_NOT_FOUND)
+ {
+ /*
+ * Table disassembly:
+ * Target of Scope() not found. Generate an External for it, and
+ * insert the name into the namespace.
+ */
+ AcpiDmAddToExternalList (Path, ACPI_TYPE_DEVICE, 0);
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
+ ACPI_IMODE_LOAD_PASS1, ACPI_NS_SEARCH_PARENT,
+ WalkState, &Node);
+ }
+#endif
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (Path, Status);
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Check to make sure that the target is
+ * one of the opcodes that actually opens a scope
+ */
+ switch (Node->Type)
+ {
+ case ACPI_TYPE_ANY:
+ case ACPI_TYPE_LOCAL_SCOPE: /* Scope */
+ case ACPI_TYPE_DEVICE:
+ case ACPI_TYPE_POWER:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_THERMAL:
+
+ /* These are acceptable types */
+ break;
+
+ case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+
+ /*
+ * These types we will allow, but we will change the type. This
+ * enables some existing code of the form:
+ *
+ * Name (DEB, 0)
+ * Scope (DEB) { ... }
+ *
+ * Note: silently change the type here. On the second pass, we will report
+ * a warning
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)\n",
+ Path, AcpiUtGetTypeName (Node->Type)));
+
+ Node->Type = ACPI_TYPE_ANY;
+ WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
+ break;
+
+ default:
+
+ /* All other types are an error */
+
+ ACPI_ERROR ((AE_INFO,
+ "Invalid type (%s) for target of Scope operator [%4.4s] (Cannot override)",
+ AcpiUtGetTypeName (Node->Type), Path));
+
+ return_ACPI_STATUS (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 (OpRegion, Buffer,
+ * BufferField, or Package), the name of the object is already
+ * in the namespace.
+ */
+ if (WalkState->DeferredNode)
+ {
+ /* This name is already in the namespace, get the node */
+
+ Node = WalkState->DeferredNode;
+ Status = AE_OK;
+ break;
+ }
+
+ /*
+ * If we are executing a method, do not create any namespace objects
+ * during the load phase, only during execution.
+ */
+ if (WalkState->MethodNode)
+ {
+ Node = NULL;
+ Status = AE_OK;
+ break;
+ }
+
+ Flags = ACPI_NS_NO_UPSEARCH;
+ if ((WalkState->Opcode != AML_SCOPE_OP) &&
+ (!(WalkState->ParseFlags & ACPI_PARSE_DEFERRED_OP)))
+ {
+ Flags |= ACPI_NS_ERROR_IF_FOUND;
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "[%s] Cannot already exist\n",
+ AcpiUtGetTypeName (ObjectType)));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "[%s] Both Find or Create allowed\n",
+ AcpiUtGetTypeName (ObjectType)));
+ }
+
+ /*
+ * 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 = AcpiNsLookup (WalkState->ScopeInfo, Path, ObjectType,
+ ACPI_IMODE_LOAD_PASS1, Flags, WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_ALREADY_EXISTS)
+ {
+ /* The name already exists in this scope */
+
+ if (Node->Flags & ANOBJ_IS_EXTERNAL)
+ {
+ /*
+ * Allow one create on an object or segment that was
+ * previously declared External
+ */
+ Node->Flags &= ~ANOBJ_IS_EXTERNAL;
+ Node->Type = (UINT8) ObjectType;
+
+ /* Just retyped a node, probably will need to open a scope */
+
+ if (AcpiNsOpensScope (ObjectType))
+ {
+ Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ Status = AE_OK;
+ }
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (Path, Status);
+ return_ACPI_STATUS (Status);
+ }
+ }
+ break;
+ }
+
+ /* Common exit */
+
+ if (!Op)
+ {
+ /* Create a new op */
+
+ Op = AcpiPsAllocOp (WalkState->Opcode);
+ if (!Op)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+ }
+
+ /* Initialize the op */
+
+#if (defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY))
+ Op->Named.Path = ACPI_CAST_PTR (UINT8, Path);
+#endif
+
+ if (Node)
+ {
+ /*
+ * Put the Node in the "op" object that the parser uses, so we
+ * can get it again quickly when this scope is closed
+ */
+ Op->Common.Node = Node;
+ Op->Named.Name = Node->Name.Integer;
+ }
+
+ AcpiPsAppendArg (AcpiPsGetParentScope (&WalkState->ParserState), Op);
+ *OutOp = Op;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsLoad1EndOp
+ *
+ * PARAMETERS: WalkState - Current state of the parse tree walk
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback used during the loading of the namespace,
+ * both control methods and everything else.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsLoad1EndOp (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_OBJECT_TYPE ObjectType;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (DsLoad1EndOp);
+
+
+ Op = WalkState->Op;
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));
+
+ /* We are only interested in opcodes that have an associated name */
+
+ if (!(WalkState->OpInfo->Flags & (AML_NAMED | AML_FIELD)))
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Get the object type to determine if we should pop the scope */
+
+ ObjectType = WalkState->OpInfo->ObjectType;
+
+#ifndef ACPI_NO_METHOD_EXECUTION
+ if (WalkState->OpInfo->Flags & AML_FIELD)
+ {
+ /*
+ * If we are executing a method, do not create any namespace objects
+ * during the load phase, only during execution.
+ */
+ if (!WalkState->MethodNode)
+ {
+ if (WalkState->Opcode == AML_FIELD_OP ||
+ WalkState->Opcode == AML_BANK_FIELD_OP ||
+ WalkState->Opcode == AML_INDEX_FIELD_OP)
+ {
+ Status = AcpiDsInitFieldObjects (Op, WalkState);
+ }
+ }
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * If we are executing a method, do not create any namespace objects
+ * during the load phase, only during execution.
+ */
+ if (!WalkState->MethodNode)
+ {
+ if (Op->Common.AmlOpcode == AML_REGION_OP)
+ {
+ Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length,
+ (ACPI_ADR_SPACE_TYPE) ((Op->Common.Value.Arg)->Common.Value.Integer),
+ WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ }
+#endif
+
+ if (Op->Common.AmlOpcode == AML_NAME_OP)
+ {
+ /* For Name opcode, get the object type from the argument */
+
+ if (Op->Common.Value.Arg)
+ {
+ ObjectType = (AcpiPsGetOpcodeInfo (
+ (Op->Common.Value.Arg)->Common.AmlOpcode))->ObjectType;
+
+ /* Set node type if we have a namespace node */
+
+ if (Op->Common.Node)
+ {
+ Op->Common.Node->Type = (UINT8) ObjectType;
+ }
+ }
+ }
+
+ /*
+ * If we are executing a method, do not create any namespace objects
+ * during the load phase, only during execution.
+ */
+ if (!WalkState->MethodNode)
+ {
+ if (Op->Common.AmlOpcode == AML_METHOD_OP)
+ {
+ /*
+ * MethodOp PkgLength NameString MethodFlags TermList
+ *
+ * Note: We must create the method node/object pair as soon as we
+ * see the method declaration. This allows later pass1 parsing
+ * of invocations of the method (need to know the number of
+ * arguments.)
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "LOADING-Method: State=%p Op=%p NamedObj=%p\n",
+ WalkState, Op, Op->Named.Node));
+
+ if (!AcpiNsGetAttachedObject (Op->Named.Node))
+ {
+ WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node);
+ WalkState->NumOperands = 1;
+
+ Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg);
+ if (ACPI_SUCCESS (Status))
+ {
+ Status = AcpiExCreateMethod (Op->Named.Data,
+ Op->Named.Length, WalkState);
+ }
+
+ WalkState->Operands[0] = NULL;
+ WalkState->NumOperands = 0;
+
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ }
+ }
+
+ /* Pop the scope stack (only if loading a table) */
+
+ if (!WalkState->MethodNode &&
+ AcpiNsOpensScope (ObjectType))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s): Popping scope for Op %p\n",
+ AcpiUtGetTypeName (ObjectType), Op));
+
+ Status = AcpiDsScopeStackPop (WalkState);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsLoad2BeginOp
+ *
+ * PARAMETERS: WalkState - Current state of the parse tree walk
+ * OutOp - Wher to return op if a new one is created
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Descending callback used during the loading of ACPI tables.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsLoad2BeginOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT **OutOp)
+{
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+ ACPI_OBJECT_TYPE ObjectType;
+ char *BufferPtr;
+ UINT32 Flags;
+
+
+ ACPI_FUNCTION_TRACE (DsLoad2BeginOp);
+
+
+ Op = WalkState->Op;
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Op=%p State=%p\n", Op, WalkState));
+
+ if (Op)
+ {
+ if ((WalkState->ControlState) &&
+ (WalkState->ControlState->Common.State ==
+ ACPI_CONTROL_CONDITIONAL_EXECUTING))
+ {
+ /* We are executing a while loop outside of a method */
+
+ Status = AcpiDsExecBeginOp (WalkState, OutOp);
+ return_ACPI_STATUS (Status);
+ }
+
+ /* We only care about Namespace opcodes here */
+
+ if ((!(WalkState->OpInfo->Flags & AML_NSOPCODE) &&
+ (WalkState->Opcode != AML_INT_NAMEPATH_OP)) ||
+ (!(WalkState->OpInfo->Flags & AML_NAMED)))
+ {
+#ifdef ACPI_ENABLE_MODULE_LEVEL_CODE
+ if ((WalkState->OpInfo->Class == AML_CLASS_EXECUTE) ||
+ (WalkState->OpInfo->Class == AML_CLASS_CONTROL))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Begin/EXEC: %s (fl %8.8X)\n", WalkState->OpInfo->Name,
+ WalkState->OpInfo->Flags));
+
+ /* Executing a type1 or type2 opcode outside of a method */
+
+ Status = AcpiDsExecBeginOp (WalkState, OutOp);
+ return_ACPI_STATUS (Status);
+ }
+#endif
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Get the name we are going to enter or lookup in the namespace */
+
+ if (WalkState->Opcode == AML_INT_NAMEPATH_OP)
+ {
+ /* For Namepath op, get the path string */
+
+ BufferPtr = Op->Common.Value.String;
+ if (!BufferPtr)
+ {
+ /* No name, just exit */
+
+ return_ACPI_STATUS (AE_OK);
+ }
+ }
+ else
+ {
+ /* Get name from the op */
+
+ BufferPtr = ACPI_CAST_PTR (char, &Op->Named.Name);
+ }
+ }
+ else
+ {
+ /* Get the namestring from the raw AML */
+
+ BufferPtr = AcpiPsGetNextNamestring (&WalkState->ParserState);
+ }
+
+ /* Map the opcode into an internal object type */
+
+ ObjectType = WalkState->OpInfo->ObjectType;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "State=%p Op=%p Type=%X\n", WalkState, Op, ObjectType));
+
+ switch (WalkState->Opcode)
+ {
+ case AML_FIELD_OP:
+ case AML_BANK_FIELD_OP:
+ case AML_INDEX_FIELD_OP:
+
+ Node = NULL;
+ Status = AE_OK;
+ break;
+
+ case AML_INT_NAMEPATH_OP:
+ /*
+ * The NamePath is an object reference to an existing object.
+ * Don't enter the name into the namespace, but look it up
+ * for use later.
+ */
+ Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
+ ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
+ WalkState, &(Node));
+ break;
+
+ case AML_SCOPE_OP:
+ /*
+ * 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 = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
+ ACPI_IMODE_EXECUTE, ACPI_NS_SEARCH_PARENT,
+ WalkState, &(Node));
+ if (ACPI_FAILURE (Status))
+ {
+#ifdef ACPI_ASL_COMPILER
+ if (Status == AE_NOT_FOUND)
+ {
+ Status = AE_OK;
+ }
+ else
+ {
+ ACPI_ERROR_NAMESPACE (BufferPtr, Status);
+ }
+#else
+ ACPI_ERROR_NAMESPACE (BufferPtr, Status);
+#endif
+ 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:
+ case ACPI_TYPE_LOCAL_SCOPE: /* Scope */
+ case ACPI_TYPE_DEVICE:
+ case ACPI_TYPE_POWER:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_THERMAL:
+
+ /* These are acceptable types */
+ break;
+
+ case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+
+ /*
+ * These types we will allow, but we will change the type. This
+ * enables some existing code of the form:
+ *
+ * Name (DEB, 0)
+ * Scope (DEB) { ... }
+ */
+ ACPI_WARNING ((AE_INFO,
+ "Type override - [%4.4s] had invalid type (%s) for Scope operator, changed to (Scope)",
+ BufferPtr, AcpiUtGetTypeName (Node->Type)));
+
+ Node->Type = ACPI_TYPE_ANY;
+ WalkState->ScopeInfo->Common.Value = ACPI_TYPE_ANY;
+ break;
+
+ default:
+
+ /* All other types are an error */
+
+ ACPI_ERROR ((AE_INFO,
+ "Invalid type (%s) for target of Scope operator [%4.4s]",
+ AcpiUtGetTypeName (Node->Type), BufferPtr));
+
+ 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 (AcpiNsOpensScope (ObjectType))
+ {
+ Status = AcpiDsScopeStackPush (Node, ObjectType, WalkState);
+ 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.
+ *
+ * Note: Name may already exist if we are executing a deferred opcode.
+ */
+ if (WalkState->DeferredNode)
+ {
+ /* This name is already in the namespace, get the node */
+
+ Node = WalkState->DeferredNode;
+ Status = AE_OK;
+ break;
+ }
+
+ Flags = ACPI_NS_NO_UPSEARCH;
+ if (WalkState->PassNumber == ACPI_IMODE_EXECUTE)
+ {
+ /* Execution mode, node cannot already exist, node is temporary */
+
+ Flags |= (ACPI_NS_ERROR_IF_FOUND | ACPI_NS_TEMPORARY);
+ }
+
+ /* Add new entry or lookup existing entry */
+
+ Status = AcpiNsLookup (WalkState->ScopeInfo, BufferPtr, ObjectType,
+ ACPI_IMODE_LOAD_PASS2, Flags, WalkState, &Node);
+ break;
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (BufferPtr, Status);
+ return_ACPI_STATUS (Status);
+ }
+
+ if (!Op)
+ {
+ /* Create a new op */
+
+ Op = AcpiPsAllocOp (WalkState->Opcode);
+ if (!Op)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Initialize the new op */
+
+ if (Node)
+ {
+ Op->Named.Name = Node->Name.Integer;
+ }
+ *OutOp = Op;
+ }
+
+ /*
+ * Put the Node in the "op" object that the parser uses, so we
+ * can get it again quickly when this scope is closed
+ */
+ Op->Common.Node = Node;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsLoad2EndOp
+ *
+ * PARAMETERS: WalkState - Current state of the parse tree walk
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Ascending callback used during the loading of the namespace,
+ * both control methods and everything else.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsLoad2EndOp (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OBJECT_TYPE ObjectType;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_PARSE_OBJECT *Arg;
+ ACPI_NAMESPACE_NODE *NewNode;
+#ifndef ACPI_NO_METHOD_EXECUTION
+ UINT32 i;
+#endif
+
+
+ ACPI_FUNCTION_TRACE (DsLoad2EndOp);
+
+ Op = WalkState->Op;
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "Opcode [%s] Op %p State %p\n",
+ WalkState->OpInfo->Name, Op, WalkState));
+
+ /* Check if opcode had an associated namespace object */
+
+ if (!(WalkState->OpInfo->Flags & AML_NSOBJECT))
+ {
+#ifndef ACPI_NO_METHOD_EXECUTION
+#ifdef ACPI_ENABLE_MODULE_LEVEL_CODE
+ /* No namespace object. Executable opcode? */
+
+ if ((WalkState->OpInfo->Class == AML_CLASS_EXECUTE) ||
+ (WalkState->OpInfo->Class == AML_CLASS_CONTROL))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "End/EXEC: %s (fl %8.8X)\n", WalkState->OpInfo->Name,
+ WalkState->OpInfo->Flags));
+
+ /* Executing a type1 or type2 opcode outside of a method */
+
+ Status = AcpiDsExecEndOp (WalkState);
+ return_ACPI_STATUS (Status);
+ }
+#endif
+#endif
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ if (Op->Common.AmlOpcode == AML_SCOPE_OP)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Ending scope Op=%p State=%p\n", Op, WalkState));
+ }
+
+ ObjectType = WalkState->OpInfo->ObjectType;
+
+ /*
+ * Get the Node/name from the earlier lookup
+ * (It was saved in the *op structure)
+ */
+ Node = Op->Common.Node;
+
+ /*
+ * Put the Node on the object stack (Contains the ACPI Name of
+ * this object)
+ */
+ WalkState->Operands[0] = (void *) Node;
+ WalkState->NumOperands = 1;
+
+ /* Pop the scope stack */
+
+ if (AcpiNsOpensScope (ObjectType) &&
+ (Op->Common.AmlOpcode != AML_INT_METHODCALL_OP))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH, "(%s) Popping scope for Op %p\n",
+ AcpiUtGetTypeName (ObjectType), Op));
+
+ Status = AcpiDsScopeStackPop (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+ }
+
+ /*
+ * Named operations are as follows:
+ *
+ * AML_ALIAS
+ * AML_BANKFIELD
+ * AML_CREATEBITFIELD
+ * AML_CREATEBYTEFIELD
+ * AML_CREATEDWORDFIELD
+ * AML_CREATEFIELD
+ * AML_CREATEQWORDFIELD
+ * AML_CREATEWORDFIELD
+ * AML_DATA_REGION
+ * AML_DEVICE
+ * AML_EVENT
+ * AML_FIELD
+ * AML_INDEXFIELD
+ * AML_METHOD
+ * AML_METHODCALL
+ * AML_MUTEX
+ * AML_NAME
+ * AML_NAMEDFIELD
+ * AML_OPREGION
+ * AML_POWERRES
+ * AML_PROCESSOR
+ * AML_SCOPE
+ * AML_THERMALZONE
+ */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "Create-Load [%s] State=%p Op=%p NamedObj=%p\n",
+ AcpiPsGetOpcodeName (Op->Common.AmlOpcode), WalkState, Op, Node));
+
+ /* Decode the opcode */
+
+ Arg = Op->Common.Value.Arg;
+
+ switch (WalkState->OpInfo->Type)
+ {
+#ifndef ACPI_NO_METHOD_EXECUTION
+
+ case AML_TYPE_CREATE_FIELD:
+ /*
+ * Create the field object, but the field buffer and index must
+ * be evaluated later during the execution phase
+ */
+ Status = AcpiDsCreateBufferField (Op, WalkState);
+ break;
+
+
+ case AML_TYPE_NAMED_FIELD:
+ /*
+ * If we are executing a method, initialize the field
+ */
+ if (WalkState->MethodNode)
+ {
+ Status = AcpiDsInitFieldObjects (Op, WalkState);
+ }
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_INDEX_FIELD_OP:
+
+ Status = AcpiDsCreateIndexField (Op, (ACPI_HANDLE) Arg->Common.Node,
+ WalkState);
+ break;
+
+ case AML_BANK_FIELD_OP:
+
+ Status = AcpiDsCreateBankField (Op, Arg->Common.Node, WalkState);
+ break;
+
+ case AML_FIELD_OP:
+
+ Status = AcpiDsCreateField (Op, Arg->Common.Node, WalkState);
+ break;
+
+ default:
+ /* All NAMED_FIELD opcodes must be handled above */
+ break;
+ }
+ break;
+
+
+ case AML_TYPE_NAMED_SIMPLE:
+
+ Status = AcpiDsCreateOperands (WalkState, Arg);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_PROCESSOR_OP:
+
+ Status = AcpiExCreateProcessor (WalkState);
+ break;
+
+ case AML_POWER_RES_OP:
+
+ Status = AcpiExCreatePowerResource (WalkState);
+ break;
+
+ case AML_MUTEX_OP:
+
+ Status = AcpiExCreateMutex (WalkState);
+ break;
+
+ case AML_EVENT_OP:
+
+ Status = AcpiExCreateEvent (WalkState);
+ break;
+
+ case AML_DATA_REGION_OP:
+
+ Status = AcpiExCreateTableRegion (WalkState);
+ break;
+
+ case AML_ALIAS_OP:
+
+ Status = AcpiExCreateAlias (WalkState);
+ break;
+
+ default:
+ /* Unknown opcode */
+
+ Status = AE_OK;
+ goto Cleanup;
+ }
+
+ /* Delete operands */
+
+ for (i = 1; i < WalkState->NumOperands; i++)
+ {
+ AcpiUtRemoveReference (WalkState->Operands[i]);
+ WalkState->Operands[i] = NULL;
+ }
+
+ break;
+#endif /* ACPI_NO_METHOD_EXECUTION */
+
+ case AML_TYPE_NAMED_COMPLEX:
+
+ switch (Op->Common.AmlOpcode)
+ {
+#ifndef ACPI_NO_METHOD_EXECUTION
+ case AML_REGION_OP:
+
+ /*
+ * If we are executing a method, initialize the region
+ */
+ if (WalkState->MethodNode)
+ {
+ Status = AcpiExCreateRegion (Op->Named.Data, Op->Named.Length,
+ (ACPI_ADR_SPACE_TYPE)
+ ((Op->Common.Value.Arg)->Common.Value.Integer),
+ WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+
+ /*
+ * The OpRegion is not fully parsed at this time. Only valid
+ * argument is the SpaceId. (We must save the address of the
+ * AML of the address and length operands)
+ */
+
+ /*
+ * If we have a valid region, initialize it
+ * Namespace is NOT locked at this point.
+ *
+ * TBD: need to unlock interpreter if it is locked, in order
+ * to allow _REG methods to be run.
+ */
+ Status = AcpiEvInitializeRegion (AcpiNsGetAttachedObject (Node),
+ FALSE);
+ if (ACPI_FAILURE (Status))
+ {
+ /*
+ * If AE_NOT_EXIST is returned, it is not fatal
+ * because many regions get created before a handler
+ * is installed for said region.
+ */
+ if (AE_NOT_EXIST == Status)
+ {
+ Status = AE_OK;
+ }
+ }
+ break;
+
+
+ case AML_NAME_OP:
+
+ Status = AcpiDsCreateNode (WalkState, Node, Op);
+ break;
+
+
+ case AML_METHOD_OP:
+ /*
+ * MethodOp PkgLength NameString MethodFlags TermList
+ *
+ * Note: We must create the method node/object pair as soon as we
+ * see the method declaration. This allows later pass1 parsing
+ * of invocations of the method (need to know the number of
+ * arguments.)
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "LOADING-Method: State=%p Op=%p NamedObj=%p\n",
+ WalkState, Op, Op->Named.Node));
+
+ if (!AcpiNsGetAttachedObject (Op->Named.Node))
+ {
+ WalkState->Operands[0] = ACPI_CAST_PTR (void, Op->Named.Node);
+ WalkState->NumOperands = 1;
+
+ Status = AcpiDsCreateOperands (WalkState, Op->Common.Value.Arg);
+ if (ACPI_SUCCESS (Status))
+ {
+ Status = AcpiExCreateMethod (Op->Named.Data,
+ Op->Named.Length, WalkState);
+ }
+ WalkState->Operands[0] = NULL;
+ WalkState->NumOperands = 0;
+
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ break;
+
+#endif /* ACPI_NO_METHOD_EXECUTION */
+
+ default:
+ /* All NAMED_COMPLEX opcodes must be handled above */
+ break;
+ }
+ break;
+
+
+ case AML_CLASS_INTERNAL:
+
+ /* case AML_INT_NAMEPATH_OP: */
+ break;
+
+
+ case AML_CLASS_METHOD_CALL:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "RESOLVING-MethodCall: State=%p Op=%p NamedObj=%p\n",
+ WalkState, Op, Node));
+
+ /*
+ * Lookup the method name and save the Node
+ */
+ Status = AcpiNsLookup (WalkState->ScopeInfo, Arg->Common.Value.String,
+ ACPI_TYPE_ANY, ACPI_IMODE_LOAD_PASS2,
+ ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE,
+ WalkState, &(NewNode));
+ if (ACPI_SUCCESS (Status))
+ {
+ /*
+ * Make sure that what we found is indeed a method
+ * We didn't search for a method on purpose, to see if the name
+ * would resolve
+ */
+ if (NewNode->Type != ACPI_TYPE_METHOD)
+ {
+ Status = AE_AML_OPERAND_TYPE;
+ }
+
+ /* We could put the returned object (Node) on the object stack for
+ * later, but for now, we will put it in the "op" object that the
+ * parser uses, so we can get it again at the end of this scope
+ */
+ Op->Common.Node = NewNode;
+ }
+ else
+ {
+ ACPI_ERROR_NAMESPACE (Arg->Common.Value.String, Status);
+ }
+ break;
+
+
+ default:
+ break;
+ }
+
+Cleanup:
+
+ /* Remove the Node pushed at the very beginning */
+
+ WalkState->Operands[0] = NULL;
+ WalkState->NumOperands = 0;
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/dswscope.c b/sys/contrib/dev/acpica/dswscope.c
new file mode 100644
index 0000000..fc55f13
--- /dev/null
+++ b/sys/contrib/dev/acpica/dswscope.c
@@ -0,0 +1,311 @@
+/******************************************************************************
+ *
+ * Module Name: dswscope - Scope stack manipulation
+ * $Revision: 1.69 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __DSWSCOPE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdispat.h>
+
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dswscope")
+
+
+/****************************************************************************
+ *
+ * FUNCTION: AcpiDsScopeStackClear
+ *
+ * PARAMETERS: WalkState - Current state
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Pop (and free) everything on the scope stack except the
+ * root scope object (which remains at the stack top.)
+ *
+ ***************************************************************************/
+
+void
+AcpiDsScopeStackClear (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_GENERIC_STATE *ScopeInfo;
+
+ ACPI_FUNCTION_NAME (DsScopeStackClear);
+
+
+ while (WalkState->ScopeInfo)
+ {
+ /* Pop a scope off the stack */
+
+ ScopeInfo = WalkState->ScopeInfo;
+ WalkState->ScopeInfo = ScopeInfo->Scope.Next;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Popped object type (%s)\n",
+ AcpiUtGetTypeName (ScopeInfo->Common.Value)));
+ AcpiUtDeleteGenericState (ScopeInfo);
+ }
+}
+
+
+/****************************************************************************
+ *
+ * FUNCTION: AcpiDsScopeStackPush
+ *
+ * PARAMETERS: Node - Name to be made current
+ * Type - Type of frame being pushed
+ * WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Push the current scope on the scope stack, and make the
+ * passed Node current.
+ *
+ ***************************************************************************/
+
+ACPI_STATUS
+AcpiDsScopeStackPush (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_TYPE Type,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_GENERIC_STATE *ScopeInfo;
+ ACPI_GENERIC_STATE *OldScopeInfo;
+
+
+ ACPI_FUNCTION_TRACE (DsScopeStackPush);
+
+
+ if (!Node)
+ {
+ /* Invalid scope */
+
+ ACPI_ERROR ((AE_INFO, "Null scope parameter"));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Make sure object type is valid */
+
+ if (!AcpiUtValidObjectType (Type))
+ {
+ ACPI_WARNING ((AE_INFO,
+ "Invalid object type: 0x%X", Type));
+ }
+
+ /* Allocate a new scope object */
+
+ ScopeInfo = AcpiUtCreateGenericState ();
+ if (!ScopeInfo)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Init new scope object */
+
+ ScopeInfo->Common.DescriptorType = ACPI_DESC_TYPE_STATE_WSCOPE;
+ ScopeInfo->Scope.Node = Node;
+ ScopeInfo->Common.Value = (UINT16) Type;
+
+ WalkState->ScopeDepth++;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "[%.2d] Pushed scope ", (UINT32) WalkState->ScopeDepth));
+
+ OldScopeInfo = WalkState->ScopeInfo;
+ if (OldScopeInfo)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
+ "[%4.4s] (%s)",
+ AcpiUtGetNodeName (OldScopeInfo->Scope.Node),
+ AcpiUtGetTypeName (OldScopeInfo->Common.Value)));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
+ "[\\___] (%s)", "ROOT"));
+ }
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
+ ", New scope -> [%4.4s] (%s)\n",
+ AcpiUtGetNodeName (ScopeInfo->Scope.Node),
+ AcpiUtGetTypeName (ScopeInfo->Common.Value)));
+
+ /* Push new scope object onto stack */
+
+ AcpiUtPushGenericState (&WalkState->ScopeInfo, ScopeInfo);
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/****************************************************************************
+ *
+ * FUNCTION: AcpiDsScopeStackPop
+ *
+ * PARAMETERS: WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Pop the scope stack once.
+ *
+ ***************************************************************************/
+
+ACPI_STATUS
+AcpiDsScopeStackPop (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_GENERIC_STATE *ScopeInfo;
+ ACPI_GENERIC_STATE *NewScopeInfo;
+
+
+ ACPI_FUNCTION_TRACE (DsScopeStackPop);
+
+
+ /*
+ * Pop scope info object off the stack.
+ */
+ ScopeInfo = AcpiUtPopGenericState (&WalkState->ScopeInfo);
+ if (!ScopeInfo)
+ {
+ return_ACPI_STATUS (AE_STACK_UNDERFLOW);
+ }
+
+ WalkState->ScopeDepth--;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "[%.2d] Popped scope [%4.4s] (%s), New scope -> ",
+ (UINT32) WalkState->ScopeDepth,
+ AcpiUtGetNodeName (ScopeInfo->Scope.Node),
+ AcpiUtGetTypeName (ScopeInfo->Common.Value)));
+
+ NewScopeInfo = WalkState->ScopeInfo;
+ if (NewScopeInfo)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
+ "[%4.4s] (%s)\n",
+ AcpiUtGetNodeName (NewScopeInfo->Scope.Node),
+ AcpiUtGetTypeName (NewScopeInfo->Common.Value)));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC,
+ "[\\___] (ROOT)\n"));
+ }
+
+ AcpiUtDeleteGenericState (ScopeInfo);
+ return_ACPI_STATUS (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/dswstate.c b/sys/contrib/dev/acpica/dswstate.c
new file mode 100644
index 0000000..f6f7bd2
--- /dev/null
+++ b/sys/contrib/dev/acpica/dswstate.c
@@ -0,0 +1,926 @@
+/******************************************************************************
+ *
+ * Module Name: dswstate - Dispatcher parse tree walk management routines
+ * $Revision: 1.101 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __DSWSTATE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#define _COMPONENT ACPI_DISPATCHER
+ ACPI_MODULE_NAME ("dswstate")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiDsResultStackPush (
+ ACPI_WALK_STATE *WalkState);
+
+static ACPI_STATUS
+AcpiDsResultStackPop (
+ ACPI_WALK_STATE *WalkState);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsResultPop
+ *
+ * PARAMETERS: Object - Where to return the popped object
+ * WalkState - Current Walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Pop an object off the top of this walk's result stack
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsResultPop (
+ ACPI_OPERAND_OBJECT **Object,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_NATIVE_UINT Index;
+ ACPI_GENERIC_STATE *State;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_NAME (DsResultPop);
+
+
+ State = WalkState->Results;
+
+ /* Incorrect state of result stack */
+
+ if (State && !WalkState->ResultCount)
+ {
+ ACPI_ERROR ((AE_INFO, "No results on result stack"));
+ return (AE_AML_INTERNAL);
+ }
+
+ if (!State && WalkState->ResultCount)
+ {
+ ACPI_ERROR ((AE_INFO, "No result state for result stack"));
+ return (AE_AML_INTERNAL);
+ }
+
+ /* Empty result stack */
+
+ if (!State)
+ {
+ ACPI_ERROR ((AE_INFO, "Result stack is empty! State=%p", WalkState));
+ return (AE_AML_NO_RETURN_VALUE);
+ }
+
+ /* Return object of the top element and clean that top element result stack */
+
+ WalkState->ResultCount--;
+ Index = WalkState->ResultCount % ACPI_RESULTS_FRAME_OBJ_NUM;
+
+ *Object = State->Results.ObjDesc [Index];
+ if (!*Object)
+ {
+ ACPI_ERROR ((AE_INFO, "No result objects on result stack, State=%p",
+ WalkState));
+ return (AE_AML_NO_RETURN_VALUE);
+ }
+
+ State->Results.ObjDesc [Index] = NULL;
+ if (Index == 0)
+ {
+ Status = AcpiDsResultStackPop (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Obj=%p [%s] Index=%X State=%p Num=%X\n", *Object,
+ AcpiUtGetObjectTypeName (*Object),
+ (UINT32) Index, WalkState, WalkState->ResultCount));
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsResultPush
+ *
+ * PARAMETERS: Object - Where to return the popped object
+ * WalkState - Current Walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Push an object onto the current result stack
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsResultPush (
+ ACPI_OPERAND_OBJECT *Object,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_GENERIC_STATE *State;
+ ACPI_STATUS Status;
+ ACPI_NATIVE_UINT Index;
+
+
+ ACPI_FUNCTION_NAME (DsResultPush);
+
+
+ if (WalkState->ResultCount > WalkState->ResultSize)
+ {
+ ACPI_ERROR ((AE_INFO, "Result stack is full"));
+ return (AE_AML_INTERNAL);
+ }
+ else if (WalkState->ResultCount == WalkState->ResultSize)
+ {
+ /* Extend the result stack */
+
+ Status = AcpiDsResultStackPush (WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO, "Failed to extend the result stack"));
+ return (Status);
+ }
+ }
+
+ if (!(WalkState->ResultCount < WalkState->ResultSize))
+ {
+ ACPI_ERROR ((AE_INFO, "No free elements in result stack"));
+ return (AE_AML_INTERNAL);
+ }
+
+ State = WalkState->Results;
+ if (!State)
+ {
+ ACPI_ERROR ((AE_INFO, "No result stack frame during push"));
+ return (AE_AML_INTERNAL);
+ }
+
+ if (!Object)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Null Object! Obj=%p State=%p Num=%X",
+ Object, WalkState, WalkState->ResultCount));
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Assign the address of object to the top free element of result stack */
+
+ Index = WalkState->ResultCount % ACPI_RESULTS_FRAME_OBJ_NUM;
+ State->Results.ObjDesc [Index] = Object;
+ WalkState->ResultCount++;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p Num=%X Cur=%X\n",
+ Object, AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object),
+ WalkState, WalkState->ResultCount, WalkState->CurrentResult));
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsResultStackPush
+ *
+ * PARAMETERS: WalkState - Current Walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Push an object onto the WalkState result stack
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDsResultStackPush (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_NAME (DsResultStackPush);
+
+
+ /* Check for stack overflow */
+
+ if ((WalkState->ResultSize + ACPI_RESULTS_FRAME_OBJ_NUM) >
+ ACPI_RESULTS_OBJ_NUM_MAX)
+ {
+ ACPI_ERROR ((AE_INFO, "Result stack overflow: State=%p Num=%X",
+ WalkState, WalkState->ResultSize));
+ return (AE_STACK_OVERFLOW);
+ }
+
+ State = AcpiUtCreateGenericState ();
+ if (!State)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_RESULT;
+ AcpiUtPushGenericState (&WalkState->Results, State);
+
+ /* Increase the length of the result stack by the length of frame */
+
+ WalkState->ResultSize += ACPI_RESULTS_FRAME_OBJ_NUM;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Results=%p State=%p\n",
+ State, WalkState));
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsResultStackPop
+ *
+ * PARAMETERS: WalkState - Current Walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Pop an object off of the WalkState result stack
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiDsResultStackPop (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_NAME (DsResultStackPop);
+
+
+ /* Check for stack underflow */
+
+ if (WalkState->Results == NULL)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Result stack underflow - State=%p\n",
+ WalkState));
+ return (AE_AML_NO_OPERAND);
+ }
+
+ if (WalkState->ResultSize < ACPI_RESULTS_FRAME_OBJ_NUM)
+ {
+ ACPI_ERROR ((AE_INFO, "Insufficient result stack size"));
+ return (AE_AML_INTERNAL);
+ }
+
+ State = AcpiUtPopGenericState (&WalkState->Results);
+ AcpiUtDeleteGenericState (State);
+
+ /* Decrease the length of result stack by the length of frame */
+
+ WalkState->ResultSize -= ACPI_RESULTS_FRAME_OBJ_NUM;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Result=%p RemainingResults=%X State=%p\n",
+ State, WalkState->ResultCount, WalkState));
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsObjStackPush
+ *
+ * PARAMETERS: Object - Object to push
+ * WalkState - Current Walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Push an object onto this walk's object/operand stack
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsObjStackPush (
+ void *Object,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_FUNCTION_NAME (DsObjStackPush);
+
+
+ /* Check for stack overflow */
+
+ if (WalkState->NumOperands >= ACPI_OBJ_NUM_OPERANDS)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Object stack overflow! Obj=%p State=%p #Ops=%X",
+ Object, WalkState, WalkState->NumOperands));
+ return (AE_STACK_OVERFLOW);
+ }
+
+ /* Put the object onto the stack */
+
+ WalkState->Operands [WalkState->OperandIndex] = Object;
+ WalkState->NumOperands++;
+
+ /* For the usual order of filling the operand stack */
+
+ WalkState->OperandIndex++;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Obj=%p [%s] State=%p #Ops=%X\n",
+ Object, AcpiUtGetObjectTypeName ((ACPI_OPERAND_OBJECT *) Object),
+ WalkState, WalkState->NumOperands));
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsObjStackPop
+ *
+ * PARAMETERS: PopCount - Number of objects/entries to pop
+ * WalkState - Current Walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Pop this walk's object stack. Objects on the stack are NOT
+ * deleted by this routine.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsObjStackPop (
+ UINT32 PopCount,
+ ACPI_WALK_STATE *WalkState)
+{
+ UINT32 i;
+
+
+ ACPI_FUNCTION_NAME (DsObjStackPop);
+
+
+ for (i = 0; i < PopCount; i++)
+ {
+ /* Check for stack underflow */
+
+ if (WalkState->NumOperands == 0)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Object stack underflow! Count=%X State=%p #Ops=%X",
+ PopCount, WalkState, WalkState->NumOperands));
+ return (AE_STACK_UNDERFLOW);
+ }
+
+ /* Just set the stack entry to null */
+
+ WalkState->NumOperands--;
+ WalkState->Operands [WalkState->NumOperands] = NULL;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%X\n",
+ PopCount, WalkState, WalkState->NumOperands));
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsObjStackPopAndDelete
+ *
+ * PARAMETERS: PopCount - Number of objects/entries to pop
+ * WalkState - Current Walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Pop this walk's object stack and delete each object that is
+ * popped off.
+ *
+ ******************************************************************************/
+
+void
+AcpiDsObjStackPopAndDelete (
+ UINT32 PopCount,
+ ACPI_WALK_STATE *WalkState)
+{
+ UINT32 i;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ACPI_FUNCTION_NAME (DsObjStackPopAndDelete);
+
+
+ if (PopCount == 0)
+ {
+ return;
+ }
+
+ for (i = (PopCount - 1); i >= 0; i--)
+ {
+ if (WalkState->NumOperands == 0)
+ {
+ return;
+ }
+
+ /* Pop the stack and delete an object if present in this stack entry */
+
+ WalkState->NumOperands--;
+ ObjDesc = WalkState->Operands [i];
+ if (ObjDesc)
+ {
+ AcpiUtRemoveReference (WalkState->Operands [i]);
+ WalkState->Operands [i] = NULL;
+ }
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Count=%X State=%p #Ops=%X\n",
+ PopCount, WalkState, WalkState->NumOperands));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsGetCurrentWalkState
+ *
+ * PARAMETERS: Thread - Get current active state for this Thread
+ *
+ * RETURN: Pointer to the current walk state
+ *
+ * DESCRIPTION: Get the walk state that is at the head of the list (the "current"
+ * walk state.)
+ *
+ ******************************************************************************/
+
+ACPI_WALK_STATE *
+AcpiDsGetCurrentWalkState (
+ ACPI_THREAD_STATE *Thread)
+{
+ ACPI_FUNCTION_NAME (DsGetCurrentWalkState);
+
+
+ if (!Thread)
+ {
+ return (NULL);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Current WalkState %p\n",
+ Thread->WalkStateList));
+
+ return (Thread->WalkStateList);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsPushWalkState
+ *
+ * PARAMETERS: WalkState - State to push
+ * Thread - Thread state object
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Place the Thread state at the head of the state list
+ *
+ ******************************************************************************/
+
+void
+AcpiDsPushWalkState (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_THREAD_STATE *Thread)
+{
+ ACPI_FUNCTION_TRACE (DsPushWalkState);
+
+
+ WalkState->Next = Thread->WalkStateList;
+ Thread->WalkStateList = WalkState;
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsPopWalkState
+ *
+ * PARAMETERS: Thread - Current thread state
+ *
+ * RETURN: A WalkState object popped from the thread's stack
+ *
+ * DESCRIPTION: Remove and return the walkstate object that is at the head of
+ * the walk stack for the given walk list. NULL indicates that
+ * the list is empty.
+ *
+ ******************************************************************************/
+
+ACPI_WALK_STATE *
+AcpiDsPopWalkState (
+ ACPI_THREAD_STATE *Thread)
+{
+ ACPI_WALK_STATE *WalkState;
+
+
+ ACPI_FUNCTION_TRACE (DsPopWalkState);
+
+
+ WalkState = Thread->WalkStateList;
+
+ if (WalkState)
+ {
+ /* Next walk state becomes the current walk state */
+
+ Thread->WalkStateList = WalkState->Next;
+
+ /*
+ * Don't clear the NEXT field, this serves as an indicator
+ * that there is a parent WALK STATE
+ * Do Not: WalkState->Next = NULL;
+ */
+ }
+
+ return_PTR (WalkState);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsCreateWalkState
+ *
+ * PARAMETERS: OwnerId - ID for object creation
+ * Origin - Starting point for this walk
+ * MethodDesc - Method object
+ * Thread - Current thread state
+ *
+ * RETURN: Pointer to the new walk state.
+ *
+ * DESCRIPTION: Allocate and initialize a new walk state. The current walk
+ * state is set to this new state.
+ *
+ ******************************************************************************/
+
+ACPI_WALK_STATE *
+AcpiDsCreateWalkState (
+ ACPI_OWNER_ID OwnerId,
+ ACPI_PARSE_OBJECT *Origin,
+ ACPI_OPERAND_OBJECT *MethodDesc,
+ ACPI_THREAD_STATE *Thread)
+{
+ ACPI_WALK_STATE *WalkState;
+
+
+ ACPI_FUNCTION_TRACE (DsCreateWalkState);
+
+
+ WalkState = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_WALK_STATE));
+ if (!WalkState)
+ {
+ return_PTR (NULL);
+ }
+
+ WalkState->DescriptorType = ACPI_DESC_TYPE_WALK;
+ WalkState->MethodDesc = MethodDesc;
+ WalkState->OwnerId = OwnerId;
+ WalkState->Origin = Origin;
+ WalkState->Thread = Thread;
+
+ WalkState->ParserState.StartOp = Origin;
+
+ /* Init the method args/local */
+
+#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
+ AcpiDsMethodDataInit (WalkState);
+#endif
+
+ /* Put the new state at the head of the walk list */
+
+ if (Thread)
+ {
+ AcpiDsPushWalkState (WalkState, Thread);
+ }
+
+ return_PTR (WalkState);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsInitAmlWalk
+ *
+ * PARAMETERS: WalkState - New state to be initialized
+ * Op - Current parse op
+ * MethodNode - Control method NS node, if any
+ * AmlStart - Start of AML
+ * AmlLength - Length of AML
+ * Info - Method info block (params, etc.)
+ * PassNumber - 1, 2, or 3
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initialize a walk state for a pass 1 or 2 parse tree walk
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDsInitAmlWalk (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_NAMESPACE_NODE *MethodNode,
+ UINT8 *AmlStart,
+ UINT32 AmlLength,
+ ACPI_EVALUATE_INFO *Info,
+ UINT8 PassNumber)
+{
+ ACPI_STATUS Status;
+ ACPI_PARSE_STATE *ParserState = &WalkState->ParserState;
+ ACPI_PARSE_OBJECT *ExtraOp;
+
+
+ ACPI_FUNCTION_TRACE (DsInitAmlWalk);
+
+
+ WalkState->ParserState.Aml =
+ WalkState->ParserState.AmlStart = AmlStart;
+ WalkState->ParserState.AmlEnd =
+ WalkState->ParserState.PkgEnd = AmlStart + AmlLength;
+
+ /* The NextOp of the NextWalk will be the beginning of the method */
+
+ WalkState->NextOp = NULL;
+ WalkState->PassNumber = PassNumber;
+
+ if (Info)
+ {
+ if (Info->ParameterType == ACPI_PARAM_GPE)
+ {
+ WalkState->GpeEventInfo =
+ ACPI_CAST_PTR (ACPI_GPE_EVENT_INFO, Info->Parameters);
+ }
+ else
+ {
+ WalkState->Params = Info->Parameters;
+ WalkState->CallerReturnDesc = &Info->ReturnObject;
+ }
+ }
+
+ Status = AcpiPsInitScope (&WalkState->ParserState, Op);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (MethodNode)
+ {
+ WalkState->ParserState.StartNode = MethodNode;
+ WalkState->WalkType = ACPI_WALK_METHOD;
+ WalkState->MethodNode = MethodNode;
+ WalkState->MethodDesc = AcpiNsGetAttachedObject (MethodNode);
+
+ /* Push start scope on scope stack and make it current */
+
+ Status = AcpiDsScopeStackPush (MethodNode, ACPI_TYPE_METHOD, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Init the method arguments */
+
+ Status = AcpiDsMethodDataInitArgs (WalkState->Params,
+ ACPI_METHOD_NUM_ARGS, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ else
+ {
+ /*
+ * Setup the current scope.
+ * Find a Named Op that has a namespace node associated with it.
+ * search upwards from this Op. Current scope is the first
+ * Op with a namespace node.
+ */
+ ExtraOp = ParserState->StartOp;
+ while (ExtraOp && !ExtraOp->Common.Node)
+ {
+ ExtraOp = ExtraOp->Common.Parent;
+ }
+
+ if (!ExtraOp)
+ {
+ ParserState->StartNode = NULL;
+ }
+ else
+ {
+ ParserState->StartNode = ExtraOp->Common.Node;
+ }
+
+ if (ParserState->StartNode)
+ {
+ /* Push start scope on scope stack and make it current */
+
+ Status = AcpiDsScopeStackPush (ParserState->StartNode,
+ ParserState->StartNode->Type, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ }
+
+ Status = AcpiDsInitCallbacks (WalkState, PassNumber);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDsDeleteWalkState
+ *
+ * PARAMETERS: WalkState - State to delete
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Delete a walk state including all internal data structures
+ *
+ ******************************************************************************/
+
+void
+AcpiDsDeleteWalkState (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_TRACE_PTR (DsDeleteWalkState, WalkState);
+
+
+ if (!WalkState)
+ {
+ return;
+ }
+
+ if (WalkState->DescriptorType != ACPI_DESC_TYPE_WALK)
+ {
+ ACPI_ERROR ((AE_INFO, "%p is not a valid walk state",
+ WalkState));
+ return;
+ }
+
+ /* There should not be any open scopes */
+
+ if (WalkState->ParserState.Scope)
+ {
+ ACPI_ERROR ((AE_INFO, "%p walk still has a scope list",
+ WalkState));
+ AcpiPsCleanupScope (&WalkState->ParserState);
+ }
+
+ /* Always must free any linked control states */
+
+ while (WalkState->ControlState)
+ {
+ State = WalkState->ControlState;
+ WalkState->ControlState = State->Common.Next;
+
+ AcpiUtDeleteGenericState (State);
+ }
+
+ /* Always must free any linked parse states */
+
+ while (WalkState->ScopeInfo)
+ {
+ State = WalkState->ScopeInfo;
+ WalkState->ScopeInfo = State->Common.Next;
+
+ AcpiUtDeleteGenericState (State);
+ }
+
+ /* Always must free any stacked result states */
+
+ while (WalkState->Results)
+ {
+ State = WalkState->Results;
+ WalkState->Results = State->Common.Next;
+
+ AcpiUtDeleteGenericState (State);
+ }
+
+ ACPI_FREE (WalkState);
+ return_VOID;
+}
+
+
diff --git a/sys/contrib/dev/acpica/evevent.c b/sys/contrib/dev/acpica/evevent.c
new file mode 100644
index 0000000..0e15049
--- /dev/null
+++ b/sys/contrib/dev/acpica/evevent.c
@@ -0,0 +1,427 @@
+/******************************************************************************
+ *
+ * Module Name: evevent - Fixed Event handling and dispatch
+ * $Revision: 1.125 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acevents.h>
+
+#define _COMPONENT ACPI_EVENTS
+ ACPI_MODULE_NAME ("evevent")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiEvFixedEventInitialize (
+ void);
+
+static UINT32
+AcpiEvFixedEventDispatch (
+ UINT32 Event);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInitializeEvents
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initialize global data structures for ACPI events (Fixed, GPE)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvInitializeEvents (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvInitializeEvents);
+
+
+ /*
+ * Initialize the Fixed and General Purpose Events. This is done prior to
+ * enabling SCIs to prevent interrupts from occurring before the handlers are
+ * installed.
+ */
+ Status = AcpiEvFixedEventInitialize ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Unable to initialize fixed events"));
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiEvGpeInitialize ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Unable to initialize general purpose events"));
+ return_ACPI_STATUS (Status);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInstallFadtGpes
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Completes initialization of the FADT-defined GPE blocks
+ * (0 and 1). This causes the _PRW methods to be run, so the HW
+ * must be fully initialized at this point, including global lock
+ * support.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvInstallFadtGpes (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvInstallFadtGpes);
+
+
+ /* Namespace must be locked */
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* FADT GPE Block 0 */
+
+ (void) AcpiEvInitializeGpeBlock (
+ AcpiGbl_FadtGpeDevice, AcpiGbl_GpeFadtBlocks[0]);
+
+ /* FADT GPE Block 1 */
+
+ (void) AcpiEvInitializeGpeBlock (
+ AcpiGbl_FadtGpeDevice, AcpiGbl_GpeFadtBlocks[1]);
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInstallXruptHandlers
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Install interrupt handlers for the SCI and Global Lock
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvInstallXruptHandlers (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvInstallXruptHandlers);
+
+
+ /* Install the SCI handler */
+
+ Status = AcpiEvInstallSciHandler ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Unable to install System Control Interrupt handler"));
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Install the handler for the Global Lock */
+
+ Status = AcpiEvInitGlobalLockHandler ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Unable to initialize Global Lock handler"));
+ return_ACPI_STATUS (Status);
+ }
+
+ AcpiGbl_EventsInitialized = TRUE;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvFixedEventInitialize
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Install the fixed event handlers and enable the fixed events.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiEvFixedEventInitialize (
+ void)
+{
+ ACPI_NATIVE_UINT i;
+ ACPI_STATUS Status;
+
+
+ /*
+ * Initialize the structure that keeps track of fixed event handlers
+ * and enable the fixed events.
+ */
+ for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
+ {
+ AcpiGbl_FixedEventHandlers[i].Handler = NULL;
+ AcpiGbl_FixedEventHandlers[i].Context = NULL;
+
+ /* Enable the fixed event */
+
+ if (AcpiGbl_FixedEventInfo[i].EnableRegisterId != 0xFF)
+ {
+ Status = AcpiSetRegister (
+ AcpiGbl_FixedEventInfo[i].EnableRegisterId, 0);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvFixedEventDetect
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
+ *
+ * DESCRIPTION: Checks the PM status register for active fixed events
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiEvFixedEventDetect (
+ void)
+{
+ UINT32 IntStatus = ACPI_INTERRUPT_NOT_HANDLED;
+ UINT32 FixedStatus;
+ UINT32 FixedEnable;
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_NAME (EvFixedEventDetect);
+
+
+ /*
+ * Read the fixed feature status and enable registers, as all the cases
+ * depend on their values. Ignore errors here.
+ */
+ (void) AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_STATUS,
+ &FixedStatus);
+ (void) AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK, ACPI_REGISTER_PM1_ENABLE,
+ &FixedEnable);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS,
+ "Fixed Event Block: Enable %08X Status %08X\n",
+ FixedEnable, FixedStatus));
+
+ /*
+ * Check for all possible Fixed Events and dispatch those that are active
+ */
+ for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
+ {
+ /* Both the status and enable bits must be on for this event */
+
+ if ((FixedStatus & AcpiGbl_FixedEventInfo[i].StatusBitMask) &&
+ (FixedEnable & AcpiGbl_FixedEventInfo[i].EnableBitMask))
+ {
+ /* Found an active (signalled) event */
+
+ IntStatus |= AcpiEvFixedEventDispatch ((UINT32) i);
+ }
+ }
+
+ return (IntStatus);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvFixedEventDispatch
+ *
+ * PARAMETERS: Event - Event type
+ *
+ * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
+ *
+ * DESCRIPTION: Clears the status bit for the requested event, calls the
+ * handler that previously registered for the event.
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiEvFixedEventDispatch (
+ UINT32 Event)
+{
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Clear the status bit */
+
+ (void) AcpiSetRegister (AcpiGbl_FixedEventInfo[Event].StatusRegisterId, 1);
+
+ /*
+ * Make sure we've got a handler. If not, report an error.
+ * The event is disabled to prevent further interrupts.
+ */
+ if (NULL == AcpiGbl_FixedEventHandlers[Event].Handler)
+ {
+ (void) AcpiSetRegister (AcpiGbl_FixedEventInfo[Event].EnableRegisterId, 0);
+
+ ACPI_ERROR ((AE_INFO,
+ "No installed handler for fixed event [%08X]",
+ Event));
+
+ return (ACPI_INTERRUPT_NOT_HANDLED);
+ }
+
+ /* Invoke the Fixed Event handler */
+
+ return ((AcpiGbl_FixedEventHandlers[Event].Handler)(
+ AcpiGbl_FixedEventHandlers[Event].Context));
+}
+
+
diff --git a/sys/contrib/dev/acpica/evgpe.c b/sys/contrib/dev/acpica/evgpe.c
new file mode 100644
index 0000000..e470eae
--- /dev/null
+++ b/sys/contrib/dev/acpica/evgpe.c
@@ -0,0 +1,850 @@
+/******************************************************************************
+ *
+ * Module Name: evgpe - General Purpose Event handling and dispatch
+ * $Revision: 1.68 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#define _COMPONENT ACPI_EVENTS
+ ACPI_MODULE_NAME ("evgpe")
+
+/* Local prototypes */
+
+static void ACPI_SYSTEM_XFACE
+AcpiEvAsynchExecuteGpeMethod (
+ void *Context);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvSetGpeType
+ *
+ * PARAMETERS: GpeEventInfo - GPE to set
+ * Type - New type
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Sets the new type for the GPE (wake, run, or wake/run)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvSetGpeType (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo,
+ UINT8 Type)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvSetGpeType);
+
+
+ /* Validate type and update register enable masks */
+
+ switch (Type)
+ {
+ case ACPI_GPE_TYPE_WAKE:
+ case ACPI_GPE_TYPE_RUNTIME:
+ case ACPI_GPE_TYPE_WAKE_RUN:
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Disable the GPE if currently enabled */
+
+ Status = AcpiEvDisableGpe (GpeEventInfo);
+
+ /* Type was validated above */
+
+ GpeEventInfo->Flags &= ~ACPI_GPE_TYPE_MASK; /* Clear type bits */
+ GpeEventInfo->Flags |= Type; /* Insert type */
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvUpdateGpeEnableMasks
+ *
+ * PARAMETERS: GpeEventInfo - GPE to update
+ * Type - What to do: ACPI_GPE_DISABLE or
+ * ACPI_GPE_ENABLE
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Updates GPE register enable masks based on the GPE type
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvUpdateGpeEnableMasks (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo,
+ UINT8 Type)
+{
+ ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
+ UINT8 RegisterBit;
+
+
+ ACPI_FUNCTION_TRACE (EvUpdateGpeEnableMasks);
+
+
+ GpeRegisterInfo = GpeEventInfo->RegisterInfo;
+ if (!GpeRegisterInfo)
+ {
+ return_ACPI_STATUS (AE_NOT_EXIST);
+ }
+ RegisterBit = (UINT8)
+ (1 << (GpeEventInfo->GpeNumber - GpeRegisterInfo->BaseGpeNumber));
+
+ /* 1) Disable case. Simply clear all enable bits */
+
+ if (Type == ACPI_GPE_DISABLE)
+ {
+ ACPI_CLEAR_BIT (GpeRegisterInfo->EnableForWake, RegisterBit);
+ ACPI_CLEAR_BIT (GpeRegisterInfo->EnableForRun, RegisterBit);
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* 2) Enable case. Set/Clear the appropriate enable bits */
+
+ switch (GpeEventInfo->Flags & ACPI_GPE_TYPE_MASK)
+ {
+ case ACPI_GPE_TYPE_WAKE:
+ ACPI_SET_BIT (GpeRegisterInfo->EnableForWake, RegisterBit);
+ ACPI_CLEAR_BIT (GpeRegisterInfo->EnableForRun, RegisterBit);
+ break;
+
+ case ACPI_GPE_TYPE_RUNTIME:
+ ACPI_CLEAR_BIT (GpeRegisterInfo->EnableForWake, RegisterBit);
+ ACPI_SET_BIT (GpeRegisterInfo->EnableForRun, RegisterBit);
+ break;
+
+ case ACPI_GPE_TYPE_WAKE_RUN:
+ ACPI_SET_BIT (GpeRegisterInfo->EnableForWake, RegisterBit);
+ ACPI_SET_BIT (GpeRegisterInfo->EnableForRun, RegisterBit);
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvEnableGpe
+ *
+ * PARAMETERS: GpeEventInfo - GPE to enable
+ * WriteToHardware - Enable now, or just mark data structs
+ * (WAKE GPEs should be deferred)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enable a GPE based on the GPE type
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvEnableGpe (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo,
+ BOOLEAN WriteToHardware)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvEnableGpe);
+
+
+ /* Make sure HW enable masks are updated */
+
+ Status = AcpiEvUpdateGpeEnableMasks (GpeEventInfo, ACPI_GPE_ENABLE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Mark wake-enabled or HW enable, or both */
+
+ switch (GpeEventInfo->Flags & ACPI_GPE_TYPE_MASK)
+ {
+ case ACPI_GPE_TYPE_WAKE:
+
+ ACPI_SET_BIT (GpeEventInfo->Flags, ACPI_GPE_WAKE_ENABLED);
+ break;
+
+ case ACPI_GPE_TYPE_WAKE_RUN:
+
+ ACPI_SET_BIT (GpeEventInfo->Flags, ACPI_GPE_WAKE_ENABLED);
+
+ /*lint -fallthrough */
+
+ case ACPI_GPE_TYPE_RUNTIME:
+
+ ACPI_SET_BIT (GpeEventInfo->Flags, ACPI_GPE_RUN_ENABLED);
+
+ if (WriteToHardware)
+ {
+ /* Clear the GPE (of stale events), then enable it */
+
+ Status = AcpiHwClearGpe (GpeEventInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Enable the requested runtime GPE */
+
+ Status = AcpiHwWriteGpeEnableReg (GpeEventInfo);
+ }
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvDisableGpe
+ *
+ * PARAMETERS: GpeEventInfo - GPE to disable
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Disable a GPE based on the GPE type
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvDisableGpe (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvDisableGpe);
+
+
+ if (!(GpeEventInfo->Flags & ACPI_GPE_ENABLE_MASK))
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Make sure HW enable masks are updated */
+
+ Status = AcpiEvUpdateGpeEnableMasks (GpeEventInfo, ACPI_GPE_DISABLE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Mark wake-disabled or HW disable, or both */
+
+ switch (GpeEventInfo->Flags & ACPI_GPE_TYPE_MASK)
+ {
+ case ACPI_GPE_TYPE_WAKE:
+ ACPI_CLEAR_BIT (GpeEventInfo->Flags, ACPI_GPE_WAKE_ENABLED);
+ break;
+
+ case ACPI_GPE_TYPE_WAKE_RUN:
+ ACPI_CLEAR_BIT (GpeEventInfo->Flags, ACPI_GPE_WAKE_ENABLED);
+
+ /*lint -fallthrough */
+
+ case ACPI_GPE_TYPE_RUNTIME:
+
+ /* Disable the requested runtime GPE */
+
+ ACPI_CLEAR_BIT (GpeEventInfo->Flags, ACPI_GPE_RUN_ENABLED);
+ Status = AcpiHwWriteGpeEnableReg (GpeEventInfo);
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvGetGpeEventInfo
+ *
+ * PARAMETERS: GpeDevice - Device node. NULL for GPE0/GPE1
+ * GpeNumber - Raw GPE number
+ *
+ * RETURN: A GPE EventInfo struct. NULL if not a valid GPE
+ *
+ * DESCRIPTION: Returns the EventInfo struct associated with this GPE.
+ * Validates the GpeBlock and the GpeNumber
+ *
+ * Should be called only when the GPE lists are semaphore locked
+ * and not subject to change.
+ *
+ ******************************************************************************/
+
+ACPI_GPE_EVENT_INFO *
+AcpiEvGetGpeEventInfo (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* A NULL GpeBlock means use the FADT-defined GPE block(s) */
+
+ if (!GpeDevice)
+ {
+ /* Examine GPE Block 0 and 1 (These blocks are permanent) */
+
+ for (i = 0; i < ACPI_MAX_GPE_BLOCKS; i++)
+ {
+ GpeBlock = AcpiGbl_GpeFadtBlocks[i];
+ if (GpeBlock)
+ {
+ if ((GpeNumber >= GpeBlock->BlockBaseNumber) &&
+ (GpeNumber < GpeBlock->BlockBaseNumber +
+ (GpeBlock->RegisterCount * 8)))
+ {
+ return (&GpeBlock->EventInfo[GpeNumber -
+ GpeBlock->BlockBaseNumber]);
+ }
+ }
+ }
+
+ /* The GpeNumber was not in the range of either FADT GPE block */
+
+ return (NULL);
+ }
+
+ /* A Non-NULL GpeDevice means this is a GPE Block Device */
+
+ ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) GpeDevice);
+ if (!ObjDesc ||
+ !ObjDesc->Device.GpeBlock)
+ {
+ return (NULL);
+ }
+
+ GpeBlock = ObjDesc->Device.GpeBlock;
+
+ if ((GpeNumber >= GpeBlock->BlockBaseNumber) &&
+ (GpeNumber < GpeBlock->BlockBaseNumber + (GpeBlock->RegisterCount * 8)))
+ {
+ return (&GpeBlock->EventInfo[GpeNumber - GpeBlock->BlockBaseNumber]);
+ }
+
+ return (NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvGpeDetect
+ *
+ * PARAMETERS: GpeXruptList - Interrupt block for this interrupt.
+ * Can have multiple GPE blocks attached.
+ *
+ * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
+ *
+ * DESCRIPTION: Detect if any GP events have occurred. This function is
+ * executed at interrupt level.
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiEvGpeDetect (
+ ACPI_GPE_XRUPT_INFO *GpeXruptList)
+{
+ ACPI_STATUS Status;
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+ ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
+ UINT32 IntStatus = ACPI_INTERRUPT_NOT_HANDLED;
+ UINT8 EnabledStatusByte;
+ UINT32 StatusReg;
+ UINT32 EnableReg;
+ ACPI_CPU_FLAGS Flags;
+ ACPI_NATIVE_UINT i;
+ ACPI_NATIVE_UINT j;
+
+
+ ACPI_FUNCTION_NAME (EvGpeDetect);
+
+ /* Check for the case where there are no GPEs */
+
+ if (!GpeXruptList)
+ {
+ return (IntStatus);
+ }
+
+ /*
+ * We need to obtain the GPE lock for both the data structs and registers
+ * Note: Not necessary to obtain the hardware lock, since the GPE registers
+ * are owned by the GpeLock.
+ */
+ Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
+
+ /* Examine all GPE blocks attached to this interrupt level */
+
+ GpeBlock = GpeXruptList->GpeBlockListHead;
+ while (GpeBlock)
+ {
+ /*
+ * Read all of the 8-bit GPE status and enable registers
+ * in this GPE block, saving all of them.
+ * Find all currently active GP events.
+ */
+ for (i = 0; i < GpeBlock->RegisterCount; i++)
+ {
+ /* Get the next status/enable pair */
+
+ GpeRegisterInfo = &GpeBlock->RegisterInfo[i];
+
+ /* Read the Status Register */
+
+ Status = AcpiHwLowLevelRead (ACPI_GPE_REGISTER_WIDTH, &StatusReg,
+ &GpeRegisterInfo->StatusAddress);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* Read the Enable Register */
+
+ Status = AcpiHwLowLevelRead (ACPI_GPE_REGISTER_WIDTH, &EnableReg,
+ &GpeRegisterInfo->EnableAddress);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INTERRUPTS,
+ "Read GPE Register at GPE%X: Status=%02X, Enable=%02X\n",
+ GpeRegisterInfo->BaseGpeNumber, StatusReg, EnableReg));
+
+ /* Check if there is anything active at all in this register */
+
+ EnabledStatusByte = (UINT8) (StatusReg & EnableReg);
+ if (!EnabledStatusByte)
+ {
+ /* No active GPEs in this register, move on */
+
+ continue;
+ }
+
+ /* Now look at the individual GPEs in this byte register */
+
+ for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++)
+ {
+ /* Examine one GPE bit */
+
+ if (EnabledStatusByte & (1 << j))
+ {
+ /*
+ * Found an active GPE. Dispatch the event to a handler
+ * or method.
+ */
+ IntStatus |= AcpiEvGpeDispatch (
+ &GpeBlock->EventInfo[(i * ACPI_GPE_REGISTER_WIDTH) + j],
+ (UINT32) j + GpeRegisterInfo->BaseGpeNumber);
+ }
+ }
+ }
+
+ GpeBlock = GpeBlock->Next;
+ }
+
+UnlockAndExit:
+
+ AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
+ return (IntStatus);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvAsynchExecuteGpeMethod
+ *
+ * PARAMETERS: Context (GpeEventInfo) - Info for this GPE
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Perform the actual execution of a GPE control method. This
+ * function is called from an invocation of AcpiOsExecute and
+ * therefore does NOT execute at interrupt level - so that
+ * the control method itself is not executed in the context of
+ * an interrupt handler.
+ *
+ ******************************************************************************/
+
+static void ACPI_SYSTEM_XFACE
+AcpiEvAsynchExecuteGpeMethod (
+ void *Context)
+{
+ ACPI_GPE_EVENT_INFO *GpeEventInfo = (void *) Context;
+ ACPI_STATUS Status;
+ ACPI_GPE_EVENT_INFO LocalGpeEventInfo;
+ ACPI_EVALUATE_INFO *Info;
+
+
+ ACPI_FUNCTION_TRACE (EvAsynchExecuteGpeMethod);
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_VOID;
+ }
+
+ /* Must revalidate the GpeNumber/GpeBlock */
+
+ if (!AcpiEvValidGpeEvent (GpeEventInfo))
+ {
+ Status = AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ return_VOID;
+ }
+
+ /* Set the GPE flags for return to enabled state */
+
+ (void) AcpiEvEnableGpe (GpeEventInfo, FALSE);
+
+ /*
+ * Take a snapshot of the GPE info for this level - we copy the
+ * info to prevent a race condition with RemoveHandler/RemoveBlock.
+ */
+ ACPI_MEMCPY (&LocalGpeEventInfo, GpeEventInfo,
+ sizeof (ACPI_GPE_EVENT_INFO));
+
+ Status = AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_VOID;
+ }
+
+ /*
+ * Must check for control method type dispatch one more
+ * time to avoid race with EvGpeInstallHandler
+ */
+ if ((LocalGpeEventInfo.Flags & ACPI_GPE_DISPATCH_MASK) ==
+ ACPI_GPE_DISPATCH_METHOD)
+ {
+ /* Allocate the evaluation information block */
+
+ Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
+ if (!Info)
+ {
+ Status = AE_NO_MEMORY;
+ }
+ else
+ {
+ /*
+ * Invoke the GPE Method (_Lxx, _Exx) i.e., evaluate the _Lxx/_Exx
+ * control method that corresponds to this GPE
+ */
+ Info->PrefixNode = LocalGpeEventInfo.Dispatch.MethodNode;
+ Info->Parameters = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT *, GpeEventInfo);
+ Info->ParameterType = ACPI_PARAM_GPE;
+ Info->Flags = ACPI_IGNORE_RETURN_VALUE;
+
+ Status = AcpiNsEvaluate (Info);
+ ACPI_FREE (Info);
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "while evaluating GPE method [%4.4s]",
+ AcpiUtGetNodeName (LocalGpeEventInfo.Dispatch.MethodNode)));
+ }
+ }
+
+ if ((LocalGpeEventInfo.Flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
+ ACPI_GPE_LEVEL_TRIGGERED)
+ {
+ /*
+ * GPE is level-triggered, we clear the GPE status bit after
+ * handling the event.
+ */
+ Status = AcpiHwClearGpe (&LocalGpeEventInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ return_VOID;
+ }
+ }
+
+ /* Enable this GPE */
+
+ (void) AcpiHwWriteGpeEnableReg (&LocalGpeEventInfo);
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvGpeDispatch
+ *
+ * PARAMETERS: GpeEventInfo - Info for this GPE
+ * GpeNumber - Number relative to the parent GPE block
+ *
+ * RETURN: INTERRUPT_HANDLED or INTERRUPT_NOT_HANDLED
+ *
+ * DESCRIPTION: Dispatch a General Purpose Event to either a function (e.g. EC)
+ * or method (e.g. _Lxx/_Exx) handler.
+ *
+ * This function executes at interrupt level.
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiEvGpeDispatch (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo,
+ UINT32 GpeNumber)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvGpeDispatch);
+
+
+ AcpiGpeCount++;
+
+ /*
+ * If edge-triggered, clear the GPE status bit now. Note that
+ * level-triggered events are cleared after the GPE is serviced.
+ */
+ if ((GpeEventInfo->Flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
+ ACPI_GPE_EDGE_TRIGGERED)
+ {
+ Status = AcpiHwClearGpe (GpeEventInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Unable to clear GPE[%2X]", GpeNumber));
+ return_UINT32 (ACPI_INTERRUPT_NOT_HANDLED);
+ }
+ }
+
+ if (!AcpiGbl_SystemAwakeAndRunning)
+ {
+ /*
+ * We just woke up because of a wake GPE. Disable any further GPEs
+ * until we are fully up and running (Only wake GPEs should be enabled
+ * at this time, but we just brute-force disable them all.)
+ * 1) We must disable this particular wake GPE so it won't fire again
+ * 2) We want to disable all wake GPEs, since we are now awake
+ */
+ (void) AcpiHwDisableAllGpes ();
+ }
+
+ /*
+ * Dispatch the GPE to either an installed handler, or the control method
+ * associated with this GPE (_Lxx or _Exx). If a handler exists, we invoke
+ * it and do not attempt to run the method. If there is neither a handler
+ * nor a method, we disable this GPE to prevent further such pointless
+ * events from firing.
+ */
+ switch (GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK)
+ {
+ case ACPI_GPE_DISPATCH_HANDLER:
+
+ /*
+ * Invoke the installed handler (at interrupt level)
+ * Ignore return status for now. TBD: leave GPE disabled on error?
+ */
+ (void) GpeEventInfo->Dispatch.Handler->Address (
+ GpeEventInfo->Dispatch.Handler->Context);
+
+ /* It is now safe to clear level-triggered events. */
+
+ if ((GpeEventInfo->Flags & ACPI_GPE_XRUPT_TYPE_MASK) ==
+ ACPI_GPE_LEVEL_TRIGGERED)
+ {
+ Status = AcpiHwClearGpe (GpeEventInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Unable to clear GPE[%2X]", GpeNumber));
+ return_UINT32 (ACPI_INTERRUPT_NOT_HANDLED);
+ }
+ }
+ break;
+
+ case ACPI_GPE_DISPATCH_METHOD:
+
+ /*
+ * Disable the GPE, so it doesn't keep firing before the method has a
+ * chance to run (it runs asynchronously with interrupts enabled).
+ */
+ Status = AcpiEvDisableGpe (GpeEventInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Unable to disable GPE[%2X]", GpeNumber));
+ return_UINT32 (ACPI_INTERRUPT_NOT_HANDLED);
+ }
+
+ /*
+ * Execute the method associated with the GPE
+ * NOTE: Level-triggered GPEs are cleared after the method completes.
+ */
+ Status = AcpiOsExecute (OSL_GPE_HANDLER,
+ AcpiEvAsynchExecuteGpeMethod, GpeEventInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Unable to queue handler for GPE[%2X] - event disabled",
+ GpeNumber));
+ }
+ break;
+
+ default:
+
+ /* No handler or method to run! */
+
+ ACPI_ERROR ((AE_INFO,
+ "No handler or method for GPE[%2X], disabling event",
+ GpeNumber));
+
+ /*
+ * Disable the GPE. The GPE will remain disabled until the ACPI
+ * Core Subsystem is restarted, or a handler is installed.
+ */
+ Status = AcpiEvDisableGpe (GpeEventInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Unable to disable GPE[%2X]", GpeNumber));
+ return_UINT32 (ACPI_INTERRUPT_NOT_HANDLED);
+ }
+ break;
+ }
+
+ return_UINT32 (ACPI_INTERRUPT_HANDLED);
+}
+
diff --git a/sys/contrib/dev/acpica/evgpeblk.c b/sys/contrib/dev/acpica/evgpeblk.c
new file mode 100644
index 0000000..5e1bdb7
--- /dev/null
+++ b/sys/contrib/dev/acpica/evgpeblk.c
@@ -0,0 +1,1372 @@
+/******************************************************************************
+ *
+ * Module Name: evgpeblk - GPE block creation and initialization.
+ * $Revision: 1.60 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#define _COMPONENT ACPI_EVENTS
+ ACPI_MODULE_NAME ("evgpeblk")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiEvSaveMethodInfo (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *ObjDesc,
+ void **ReturnValue);
+
+static ACPI_STATUS
+AcpiEvMatchPrwAndGpe (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Info,
+ void **ReturnValue);
+
+static ACPI_GPE_XRUPT_INFO *
+AcpiEvGetGpeXruptBlock (
+ UINT32 InterruptNumber);
+
+static ACPI_STATUS
+AcpiEvDeleteGpeXrupt (
+ ACPI_GPE_XRUPT_INFO *GpeXrupt);
+
+static ACPI_STATUS
+AcpiEvInstallGpeBlock (
+ ACPI_GPE_BLOCK_INFO *GpeBlock,
+ UINT32 InterruptNumber);
+
+static ACPI_STATUS
+AcpiEvCreateGpeInfoBlocks (
+ ACPI_GPE_BLOCK_INFO *GpeBlock);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvValidGpeEvent
+ *
+ * PARAMETERS: GpeEventInfo - Info for this GPE
+ *
+ * RETURN: TRUE if the GpeEvent is valid
+ *
+ * DESCRIPTION: Validate a GPE event. DO NOT CALL FROM INTERRUPT LEVEL.
+ * Should be called only when the GPE lists are semaphore locked
+ * and not subject to change.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiEvValidGpeEvent (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo)
+{
+ ACPI_GPE_XRUPT_INFO *GpeXruptBlock;
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* No need for spin lock since we are not changing any list elements */
+
+ /* Walk the GPE interrupt levels */
+
+ GpeXruptBlock = AcpiGbl_GpeXruptListHead;
+ while (GpeXruptBlock)
+ {
+ GpeBlock = GpeXruptBlock->GpeBlockListHead;
+
+ /* Walk the GPE blocks on this interrupt level */
+
+ while (GpeBlock)
+ {
+ if ((&GpeBlock->EventInfo[0] <= GpeEventInfo) &&
+ (&GpeBlock->EventInfo[((ACPI_SIZE) GpeBlock->RegisterCount) * 8] > GpeEventInfo))
+ {
+ return (TRUE);
+ }
+
+ GpeBlock = GpeBlock->Next;
+ }
+
+ GpeXruptBlock = GpeXruptBlock->Next;
+ }
+
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvWalkGpeList
+ *
+ * PARAMETERS: GpeWalkCallback - Routine called for each GPE block
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Walk the GPE lists.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvWalkGpeList (
+ ACPI_GPE_CALLBACK GpeWalkCallback)
+{
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_CPU_FLAGS Flags;
+
+
+ ACPI_FUNCTION_TRACE (EvWalkGpeList);
+
+
+ Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
+
+ /* Walk the interrupt level descriptor list */
+
+ GpeXruptInfo = AcpiGbl_GpeXruptListHead;
+ while (GpeXruptInfo)
+ {
+ /* Walk all Gpe Blocks attached to this interrupt level */
+
+ GpeBlock = GpeXruptInfo->GpeBlockListHead;
+ while (GpeBlock)
+ {
+ /* One callback per GPE block */
+
+ Status = GpeWalkCallback (GpeXruptInfo, GpeBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ GpeBlock = GpeBlock->Next;
+ }
+
+ GpeXruptInfo = GpeXruptInfo->Next;
+ }
+
+UnlockAndExit:
+ AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvDeleteGpeHandlers
+ *
+ * PARAMETERS: GpeXruptInfo - GPE Interrupt info
+ * GpeBlock - Gpe Block info
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Delete all Handler objects found in the GPE data structs.
+ * Used only prior to termination.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvDeleteGpeHandlers (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock)
+{
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+ ACPI_NATIVE_UINT i;
+ ACPI_NATIVE_UINT j;
+
+
+ ACPI_FUNCTION_TRACE (EvDeleteGpeHandlers);
+
+
+ /* Examine each GPE Register within the block */
+
+ for (i = 0; i < GpeBlock->RegisterCount; i++)
+ {
+ /* Now look at the individual GPEs in this byte register */
+
+ for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++)
+ {
+ GpeEventInfo = &GpeBlock->EventInfo[(i * ACPI_GPE_REGISTER_WIDTH) + j];
+
+ if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) ==
+ ACPI_GPE_DISPATCH_HANDLER)
+ {
+ ACPI_FREE (GpeEventInfo->Dispatch.Handler);
+ GpeEventInfo->Dispatch.Handler = NULL;
+ GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK;
+ }
+ }
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvSaveMethodInfo
+ *
+ * PARAMETERS: Callback from WalkNamespace
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Called from AcpiWalkNamespace. Expects each object to be a
+ * control method under the _GPE portion of the namespace.
+ * Extract the name and GPE type from the object, saving this
+ * information for quick lookup during GPE dispatch
+ *
+ * The name of each GPE control method is of the form:
+ * "_Lxx" or "_Exx"
+ * Where:
+ * L - means that the GPE is level triggered
+ * E - means that the GPE is edge triggered
+ * xx - is the GPE number [in HEX]
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiEvSaveMethodInfo (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *ObjDesc,
+ void **ReturnValue)
+{
+ ACPI_GPE_BLOCK_INFO *GpeBlock = (void *) ObjDesc;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+ UINT32 GpeNumber;
+ char Name[ACPI_NAME_SIZE + 1];
+ UINT8 Type;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvSaveMethodInfo);
+
+
+ /*
+ * _Lxx and _Exx GPE method support
+ *
+ * 1) Extract the name from the object and convert to a string
+ */
+ ACPI_MOVE_32_TO_32 (
+ Name, &((ACPI_NAMESPACE_NODE *) ObjHandle)->Name.Integer);
+ Name[ACPI_NAME_SIZE] = 0;
+
+ /*
+ * 2) Edge/Level determination is based on the 2nd character
+ * of the method name
+ *
+ * NOTE: Default GPE type is RUNTIME. May be changed later to WAKE
+ * if a _PRW object is found that points to this GPE.
+ */
+ switch (Name[1])
+ {
+ case 'L':
+ Type = ACPI_GPE_LEVEL_TRIGGERED;
+ break;
+
+ case 'E':
+ Type = ACPI_GPE_EDGE_TRIGGERED;
+ break;
+
+ default:
+ /* Unknown method type, just ignore it! */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD,
+ "Ignoring unknown GPE method type: %s (name not of form _Lxx or _Exx)",
+ Name));
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Convert the last two characters of the name to the GPE Number */
+
+ GpeNumber = ACPI_STRTOUL (&Name[2], NULL, 16);
+ if (GpeNumber == ACPI_UINT32_MAX)
+ {
+ /* Conversion failed; invalid method, just ignore it */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD,
+ "Could not extract GPE number from name: %s (name is not of form _Lxx or _Exx)",
+ Name));
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Ensure that we have a valid GPE number for this GPE block */
+
+ if ((GpeNumber < GpeBlock->BlockBaseNumber) ||
+ (GpeNumber >= (GpeBlock->BlockBaseNumber + (GpeBlock->RegisterCount * 8))))
+ {
+ /*
+ * Not valid for this GPE block, just ignore it
+ * However, it may be valid for a different GPE block, since GPE0 and GPE1
+ * methods both appear under \_GPE.
+ */
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Now we can add this information to the GpeEventInfo block
+ * for use during dispatch of this GPE. Default type is RUNTIME, although
+ * this may change when the _PRW methods are executed later.
+ */
+ GpeEventInfo = &GpeBlock->EventInfo[GpeNumber - GpeBlock->BlockBaseNumber];
+
+ GpeEventInfo->Flags = (UINT8)
+ (Type | ACPI_GPE_DISPATCH_METHOD | ACPI_GPE_TYPE_RUNTIME);
+
+ GpeEventInfo->Dispatch.MethodNode = (ACPI_NAMESPACE_NODE *) ObjHandle;
+
+ /* Update enable mask, but don't enable the HW GPE as of yet */
+
+ Status = AcpiEvEnableGpe (GpeEventInfo, FALSE);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD,
+ "Registered GPE method %s as GPE number 0x%.2X\n",
+ Name, GpeNumber));
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvMatchPrwAndGpe
+ *
+ * PARAMETERS: Callback from WalkNamespace
+ *
+ * RETURN: Status. NOTE: We ignore errors so that the _PRW walk is
+ * not aborted on a single _PRW failure.
+ *
+ * DESCRIPTION: Called from AcpiWalkNamespace. Expects each object to be a
+ * Device. Run the _PRW method. If present, extract the GPE
+ * number and mark the GPE as a WAKE GPE.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiEvMatchPrwAndGpe (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Info,
+ void **ReturnValue)
+{
+ ACPI_GPE_WALK_INFO *GpeInfo = (void *) Info;
+ ACPI_NAMESPACE_NODE *GpeDevice;
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+ ACPI_NAMESPACE_NODE *TargetGpeDevice;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+ ACPI_OPERAND_OBJECT *PkgDesc;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ UINT32 GpeNumber;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvMatchPrwAndGpe);
+
+
+ /* Check for a _PRW method under this device */
+
+ Status = AcpiUtEvaluateObject (ObjHandle, METHOD_NAME__PRW,
+ ACPI_BTYPE_PACKAGE, &PkgDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ /* Ignore all errors from _PRW, we don't want to abort the subsystem */
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* The returned _PRW package must have at least two elements */
+
+ if (PkgDesc->Package.Count < 2)
+ {
+ goto Cleanup;
+ }
+
+ /* Extract pointers from the input context */
+
+ GpeDevice = GpeInfo->GpeDevice;
+ GpeBlock = GpeInfo->GpeBlock;
+
+ /*
+ * The _PRW object must return a package, we are only interested
+ * in the first element
+ */
+ ObjDesc = PkgDesc->Package.Elements[0];
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
+ {
+ /* Use FADT-defined GPE device (from definition of _PRW) */
+
+ TargetGpeDevice = AcpiGbl_FadtGpeDevice;
+
+ /* Integer is the GPE number in the FADT described GPE blocks */
+
+ GpeNumber = (UINT32) ObjDesc->Integer.Value;
+ }
+ else if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_PACKAGE)
+ {
+ /* Package contains a GPE reference and GPE number within a GPE block */
+
+ if ((ObjDesc->Package.Count < 2) ||
+ (ACPI_GET_OBJECT_TYPE (ObjDesc->Package.Elements[0]) != ACPI_TYPE_LOCAL_REFERENCE) ||
+ (ACPI_GET_OBJECT_TYPE (ObjDesc->Package.Elements[1]) != ACPI_TYPE_INTEGER))
+ {
+ goto Cleanup;
+ }
+
+ /* Get GPE block reference and decode */
+
+ TargetGpeDevice = ObjDesc->Package.Elements[0]->Reference.Node;
+ GpeNumber = (UINT32) ObjDesc->Package.Elements[1]->Integer.Value;
+ }
+ else
+ {
+ /* Unknown type, just ignore it */
+
+ goto Cleanup;
+ }
+
+ /*
+ * Is this GPE within this block?
+ *
+ * TRUE iff these conditions are true:
+ * 1) The GPE devices match.
+ * 2) The GPE index(number) is within the range of the Gpe Block
+ * associated with the GPE device.
+ */
+ if ((GpeDevice == TargetGpeDevice) &&
+ (GpeNumber >= GpeBlock->BlockBaseNumber) &&
+ (GpeNumber < GpeBlock->BlockBaseNumber + (GpeBlock->RegisterCount * 8)))
+ {
+ GpeEventInfo = &GpeBlock->EventInfo[GpeNumber - GpeBlock->BlockBaseNumber];
+
+ /* Mark GPE for WAKE-ONLY but WAKE_DISABLED */
+
+ GpeEventInfo->Flags &= ~(ACPI_GPE_WAKE_ENABLED | ACPI_GPE_RUN_ENABLED);
+
+ Status = AcpiEvSetGpeType (GpeEventInfo, ACPI_GPE_TYPE_WAKE);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+ Status = AcpiEvUpdateGpeEnableMasks (GpeEventInfo, ACPI_GPE_DISABLE);
+ }
+
+Cleanup:
+ AcpiUtRemoveReference (PkgDesc);
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvGetGpeXruptBlock
+ *
+ * PARAMETERS: InterruptNumber - Interrupt for a GPE block
+ *
+ * RETURN: A GPE interrupt block
+ *
+ * DESCRIPTION: Get or Create a GPE interrupt block. There is one interrupt
+ * block per unique interrupt level used for GPEs.
+ * Should be called only when the GPE lists are semaphore locked
+ * and not subject to change.
+ *
+ ******************************************************************************/
+
+static ACPI_GPE_XRUPT_INFO *
+AcpiEvGetGpeXruptBlock (
+ UINT32 InterruptNumber)
+{
+ ACPI_GPE_XRUPT_INFO *NextGpeXrupt;
+ ACPI_GPE_XRUPT_INFO *GpeXrupt;
+ ACPI_STATUS Status;
+ ACPI_CPU_FLAGS Flags;
+
+
+ ACPI_FUNCTION_TRACE (EvGetGpeXruptBlock);
+
+
+ /* No need for lock since we are not changing any list elements here */
+
+ NextGpeXrupt = AcpiGbl_GpeXruptListHead;
+ while (NextGpeXrupt)
+ {
+ if (NextGpeXrupt->InterruptNumber == InterruptNumber)
+ {
+ return_PTR (NextGpeXrupt);
+ }
+
+ NextGpeXrupt = NextGpeXrupt->Next;
+ }
+
+ /* Not found, must allocate a new xrupt descriptor */
+
+ GpeXrupt = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_XRUPT_INFO));
+ if (!GpeXrupt)
+ {
+ return_PTR (NULL);
+ }
+
+ GpeXrupt->InterruptNumber = InterruptNumber;
+
+ /* Install new interrupt descriptor with spin lock */
+
+ Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
+ if (AcpiGbl_GpeXruptListHead)
+ {
+ NextGpeXrupt = AcpiGbl_GpeXruptListHead;
+ while (NextGpeXrupt->Next)
+ {
+ NextGpeXrupt = NextGpeXrupt->Next;
+ }
+
+ NextGpeXrupt->Next = GpeXrupt;
+ GpeXrupt->Previous = NextGpeXrupt;
+ }
+ else
+ {
+ AcpiGbl_GpeXruptListHead = GpeXrupt;
+ }
+ AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
+
+ /* Install new interrupt handler if not SCI_INT */
+
+ if (InterruptNumber != AcpiGbl_FADT.SciInterrupt)
+ {
+ Status = AcpiOsInstallInterruptHandler (InterruptNumber,
+ AcpiEvGpeXruptHandler, GpeXrupt);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not install GPE interrupt handler at level 0x%X",
+ InterruptNumber));
+ return_PTR (NULL);
+ }
+ }
+
+ return_PTR (GpeXrupt);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvDeleteGpeXrupt
+ *
+ * PARAMETERS: GpeXrupt - A GPE interrupt info block
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Remove and free a GpeXrupt block. Remove an associated
+ * interrupt handler if not the SCI interrupt.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiEvDeleteGpeXrupt (
+ ACPI_GPE_XRUPT_INFO *GpeXrupt)
+{
+ ACPI_STATUS Status;
+ ACPI_CPU_FLAGS Flags;
+
+
+ ACPI_FUNCTION_TRACE (EvDeleteGpeXrupt);
+
+
+ /* We never want to remove the SCI interrupt handler */
+
+ if (GpeXrupt->InterruptNumber == AcpiGbl_FADT.SciInterrupt)
+ {
+ GpeXrupt->GpeBlockListHead = NULL;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Disable this interrupt */
+
+ Status = AcpiOsRemoveInterruptHandler (
+ GpeXrupt->InterruptNumber, AcpiEvGpeXruptHandler);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Unlink the interrupt block with lock */
+
+ Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
+ if (GpeXrupt->Previous)
+ {
+ GpeXrupt->Previous->Next = GpeXrupt->Next;
+ }
+
+ if (GpeXrupt->Next)
+ {
+ GpeXrupt->Next->Previous = GpeXrupt->Previous;
+ }
+ AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
+
+ /* Free the block */
+
+ ACPI_FREE (GpeXrupt);
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInstallGpeBlock
+ *
+ * PARAMETERS: GpeBlock - New GPE block
+ * InterruptNumber - Xrupt to be associated with this GPE block
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Install new GPE block with mutex support
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiEvInstallGpeBlock (
+ ACPI_GPE_BLOCK_INFO *GpeBlock,
+ UINT32 InterruptNumber)
+{
+ ACPI_GPE_BLOCK_INFO *NextGpeBlock;
+ ACPI_GPE_XRUPT_INFO *GpeXruptBlock;
+ ACPI_STATUS Status;
+ ACPI_CPU_FLAGS Flags;
+
+
+ ACPI_FUNCTION_TRACE (EvInstallGpeBlock);
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ GpeXruptBlock = AcpiEvGetGpeXruptBlock (InterruptNumber);
+ if (!GpeXruptBlock)
+ {
+ Status = AE_NO_MEMORY;
+ goto UnlockAndExit;
+ }
+
+ /* Install the new block at the end of the list with lock */
+
+ Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
+ if (GpeXruptBlock->GpeBlockListHead)
+ {
+ NextGpeBlock = GpeXruptBlock->GpeBlockListHead;
+ while (NextGpeBlock->Next)
+ {
+ NextGpeBlock = NextGpeBlock->Next;
+ }
+
+ NextGpeBlock->Next = GpeBlock;
+ GpeBlock->Previous = NextGpeBlock;
+ }
+ else
+ {
+ GpeXruptBlock->GpeBlockListHead = GpeBlock;
+ }
+
+ GpeBlock->XruptBlock = GpeXruptBlock;
+ AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
+
+
+UnlockAndExit:
+ Status = AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvDeleteGpeBlock
+ *
+ * PARAMETERS: GpeBlock - Existing GPE block
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Remove a GPE block
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvDeleteGpeBlock (
+ ACPI_GPE_BLOCK_INFO *GpeBlock)
+{
+ ACPI_STATUS Status;
+ ACPI_CPU_FLAGS Flags;
+
+
+ ACPI_FUNCTION_TRACE (EvInstallGpeBlock);
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Disable all GPEs in this block */
+
+ Status = AcpiHwDisableGpeBlock (GpeBlock->XruptBlock, GpeBlock);
+
+ if (!GpeBlock->Previous && !GpeBlock->Next)
+ {
+ /* This is the last GpeBlock on this interrupt */
+
+ Status = AcpiEvDeleteGpeXrupt (GpeBlock->XruptBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+ }
+ else
+ {
+ /* Remove the block on this interrupt with lock */
+
+ Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
+ if (GpeBlock->Previous)
+ {
+ GpeBlock->Previous->Next = GpeBlock->Next;
+ }
+ else
+ {
+ GpeBlock->XruptBlock->GpeBlockListHead = GpeBlock->Next;
+ }
+
+ if (GpeBlock->Next)
+ {
+ GpeBlock->Next->Previous = GpeBlock->Previous;
+ }
+ AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
+ }
+
+ /* Free the GpeBlock */
+
+ ACPI_FREE (GpeBlock->RegisterInfo);
+ ACPI_FREE (GpeBlock->EventInfo);
+ ACPI_FREE (GpeBlock);
+
+UnlockAndExit:
+ Status = AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvCreateGpeInfoBlocks
+ *
+ * PARAMETERS: GpeBlock - New GPE block
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create the RegisterInfo and EventInfo blocks for this GPE block
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiEvCreateGpeInfoBlocks (
+ ACPI_GPE_BLOCK_INFO *GpeBlock)
+{
+ ACPI_GPE_REGISTER_INFO *GpeRegisterInfo = NULL;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo = NULL;
+ ACPI_GPE_EVENT_INFO *ThisEvent;
+ ACPI_GPE_REGISTER_INFO *ThisRegister;
+ ACPI_NATIVE_UINT i;
+ ACPI_NATIVE_UINT j;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvCreateGpeInfoBlocks);
+
+
+ /* Allocate the GPE register information block */
+
+ GpeRegisterInfo = ACPI_ALLOCATE_ZEROED (
+ (ACPI_SIZE) GpeBlock->RegisterCount *
+ sizeof (ACPI_GPE_REGISTER_INFO));
+ if (!GpeRegisterInfo)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not allocate the GpeRegisterInfo table"));
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /*
+ * Allocate the GPE EventInfo block. There are eight distinct GPEs
+ * per register. Initialization to zeros is sufficient.
+ */
+ GpeEventInfo = ACPI_ALLOCATE_ZEROED (
+ ((ACPI_SIZE) GpeBlock->RegisterCount *
+ ACPI_GPE_REGISTER_WIDTH) *
+ sizeof (ACPI_GPE_EVENT_INFO));
+ if (!GpeEventInfo)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not allocate the GpeEventInfo table"));
+ Status = AE_NO_MEMORY;
+ goto ErrorExit;
+ }
+
+ /* Save the new Info arrays in the GPE block */
+
+ GpeBlock->RegisterInfo = GpeRegisterInfo;
+ GpeBlock->EventInfo = GpeEventInfo;
+
+ /*
+ * Initialize the GPE Register and Event structures. A goal of these
+ * tables is to hide the fact that there are two separate GPE register sets
+ * in a given GPE hardware block, the status registers occupy the first half,
+ * and the enable registers occupy the second half.
+ */
+ ThisRegister = GpeRegisterInfo;
+ ThisEvent = GpeEventInfo;
+
+ for (i = 0; i < GpeBlock->RegisterCount; i++)
+ {
+ /* Init the RegisterInfo for this GPE register (8 GPEs) */
+
+ ThisRegister->BaseGpeNumber = (UINT8) (GpeBlock->BlockBaseNumber +
+ (i * ACPI_GPE_REGISTER_WIDTH));
+
+ ThisRegister->StatusAddress.Address =
+ GpeBlock->BlockAddress.Address + i;
+
+ ThisRegister->EnableAddress.Address =
+ GpeBlock->BlockAddress.Address + i + GpeBlock->RegisterCount;
+
+ ThisRegister->StatusAddress.SpaceId = GpeBlock->BlockAddress.SpaceId;
+ ThisRegister->EnableAddress.SpaceId = GpeBlock->BlockAddress.SpaceId;
+ ThisRegister->StatusAddress.BitWidth = ACPI_GPE_REGISTER_WIDTH;
+ ThisRegister->EnableAddress.BitWidth = ACPI_GPE_REGISTER_WIDTH;
+ ThisRegister->StatusAddress.BitOffset = ACPI_GPE_REGISTER_WIDTH;
+ ThisRegister->EnableAddress.BitOffset = ACPI_GPE_REGISTER_WIDTH;
+
+ /* Init the EventInfo for each GPE within this register */
+
+ for (j = 0; j < ACPI_GPE_REGISTER_WIDTH; j++)
+ {
+ ThisEvent->GpeNumber = (UINT8) (ThisRegister->BaseGpeNumber + j);
+ ThisEvent->RegisterInfo = ThisRegister;
+ ThisEvent++;
+ }
+
+ /* Disable all GPEs within this register */
+
+ Status = AcpiHwLowLevelWrite (ACPI_GPE_REGISTER_WIDTH, 0x00,
+ &ThisRegister->EnableAddress);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+
+ /* Clear any pending GPE events within this register */
+
+ Status = AcpiHwLowLevelWrite (ACPI_GPE_REGISTER_WIDTH, 0xFF,
+ &ThisRegister->StatusAddress);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+
+ ThisRegister++;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+
+
+ErrorExit:
+ if (GpeRegisterInfo)
+ {
+ ACPI_FREE (GpeRegisterInfo);
+ }
+ if (GpeEventInfo)
+ {
+ ACPI_FREE (GpeEventInfo);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvCreateGpeBlock
+ *
+ * PARAMETERS: GpeDevice - Handle to the parent GPE block
+ * GpeBlockAddress - Address and SpaceID
+ * RegisterCount - Number of GPE register pairs in the block
+ * GpeBlockBaseNumber - Starting GPE number for the block
+ * InterruptNumber - H/W interrupt for the block
+ * ReturnGpeBlock - Where the new block descriptor is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create and Install a block of GPE registers. All GPEs within
+ * the block are disabled at exit.
+ * Note: Assumes namespace is locked.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvCreateGpeBlock (
+ ACPI_NAMESPACE_NODE *GpeDevice,
+ ACPI_GENERIC_ADDRESS *GpeBlockAddress,
+ UINT32 RegisterCount,
+ UINT8 GpeBlockBaseNumber,
+ UINT32 InterruptNumber,
+ ACPI_GPE_BLOCK_INFO **ReturnGpeBlock)
+{
+ ACPI_STATUS Status;
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+
+
+ ACPI_FUNCTION_TRACE (EvCreateGpeBlock);
+
+
+ if (!RegisterCount)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Allocate a new GPE block */
+
+ GpeBlock = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_GPE_BLOCK_INFO));
+ if (!GpeBlock)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Initialize the new GPE block */
+
+ GpeBlock->Node = GpeDevice;
+ GpeBlock->RegisterCount = RegisterCount;
+ GpeBlock->BlockBaseNumber = GpeBlockBaseNumber;
+
+ ACPI_MEMCPY (&GpeBlock->BlockAddress, GpeBlockAddress,
+ sizeof (ACPI_GENERIC_ADDRESS));
+
+ /*
+ * Create the RegisterInfo and EventInfo sub-structures
+ * Note: disables and clears all GPEs in the block
+ */
+ Status = AcpiEvCreateGpeInfoBlocks (GpeBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_FREE (GpeBlock);
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Install the new block in the global lists */
+
+ Status = AcpiEvInstallGpeBlock (GpeBlock, InterruptNumber);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_FREE (GpeBlock);
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Find all GPE methods (_Lxx, _Exx) for this block */
+
+ Status = AcpiNsWalkNamespace (ACPI_TYPE_METHOD, GpeDevice,
+ ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK,
+ AcpiEvSaveMethodInfo, GpeBlock, NULL);
+
+ /* Return the new block */
+
+ if (ReturnGpeBlock)
+ {
+ (*ReturnGpeBlock) = GpeBlock;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
+ "GPE %02X to %02X [%4.4s] %u regs on int 0x%X\n",
+ (UINT32) GpeBlock->BlockBaseNumber,
+ (UINT32) (GpeBlock->BlockBaseNumber +
+ ((GpeBlock->RegisterCount * ACPI_GPE_REGISTER_WIDTH) -1)),
+ GpeDevice->Name.Ascii,
+ GpeBlock->RegisterCount,
+ InterruptNumber));
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInitializeGpeBlock
+ *
+ * PARAMETERS: GpeDevice - Handle to the parent GPE block
+ * GpeBlock - Gpe Block info
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initialize and enable a GPE block. First find and run any
+ * _PRT methods associated with the block, then enable the
+ * appropriate GPEs.
+ * Note: Assumes namespace is locked.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvInitializeGpeBlock (
+ ACPI_NAMESPACE_NODE *GpeDevice,
+ ACPI_GPE_BLOCK_INFO *GpeBlock)
+{
+ ACPI_STATUS Status;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+ ACPI_GPE_WALK_INFO GpeInfo;
+ UINT32 WakeGpeCount;
+ UINT32 GpeEnabledCount;
+ ACPI_NATIVE_UINT i;
+ ACPI_NATIVE_UINT j;
+
+
+ ACPI_FUNCTION_TRACE (EvInitializeGpeBlock);
+
+
+ /* Ignore a null GPE block (e.g., if no GPE block 1 exists) */
+
+ if (!GpeBlock)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Runtime option: Should wake GPEs be enabled at runtime? The default
+ * is no, they should only be enabled just as the machine goes to sleep.
+ */
+ if (AcpiGbl_LeaveWakeGpesDisabled)
+ {
+ /*
+ * Differentiate runtime vs wake GPEs, via the _PRW control methods.
+ * Each GPE that has one or more _PRWs that reference it is by
+ * definition a wake GPE and will not be enabled while the machine
+ * is running.
+ */
+ GpeInfo.GpeBlock = GpeBlock;
+ GpeInfo.GpeDevice = GpeDevice;
+
+ Status = AcpiNsWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK,
+ AcpiEvMatchPrwAndGpe, &GpeInfo, NULL);
+ }
+
+ /*
+ * Enable all GPEs in this block that have these attributes:
+ * 1) are "runtime" or "run/wake" GPEs, and
+ * 2) have a corresponding _Lxx or _Exx method
+ *
+ * Any other GPEs within this block must be enabled via the AcpiEnableGpe()
+ * external interface.
+ */
+ WakeGpeCount = 0;
+ GpeEnabledCount = 0;
+
+ for (i = 0; i < GpeBlock->RegisterCount; i++)
+ {
+ for (j = 0; j < 8; j++)
+ {
+ /* Get the info block for this particular GPE */
+
+ GpeEventInfo = &GpeBlock->EventInfo[(i * ACPI_GPE_REGISTER_WIDTH) + j];
+
+ if (((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_METHOD) &&
+ (GpeEventInfo->Flags & ACPI_GPE_TYPE_RUNTIME))
+ {
+ GpeEnabledCount++;
+ }
+
+ if (GpeEventInfo->Flags & ACPI_GPE_TYPE_WAKE)
+ {
+ WakeGpeCount++;
+ }
+ }
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
+ "Found %u Wake, Enabled %u Runtime GPEs in this block\n",
+ WakeGpeCount, GpeEnabledCount));
+
+ /* Enable all valid runtime GPEs found above */
+
+ Status = AcpiHwEnableRuntimeGpeBlock (NULL, GpeBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO, "Could not enable GPEs in GpeBlock %p",
+ GpeBlock));
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvGpeInitialize
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initialize the GPE data structures
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvGpeInitialize (
+ void)
+{
+ UINT32 RegisterCount0 = 0;
+ UINT32 RegisterCount1 = 0;
+ UINT32 GpeNumberMax = 0;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvGpeInitialize);
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Initialize the GPE Block(s) defined in the FADT
+ *
+ * Why the GPE register block lengths are divided by 2: From the ACPI Spec,
+ * section "General-Purpose Event Registers", we have:
+ *
+ * "Each register block contains two registers of equal length
+ * GPEx_STS and GPEx_EN (where x is 0 or 1). The length of the
+ * GPE0_STS and GPE0_EN registers is equal to half the GPE0_LEN
+ * The length of the GPE1_STS and GPE1_EN registers is equal to
+ * half the GPE1_LEN. If a generic register block is not supported
+ * then its respective block pointer and block length values in the
+ * FADT table contain zeros. The GPE0_LEN and GPE1_LEN do not need
+ * to be the same size."
+ */
+
+ /*
+ * Determine the maximum GPE number for this machine.
+ *
+ * Note: both GPE0 and GPE1 are optional, and either can exist without
+ * the other.
+ *
+ * If EITHER the register length OR the block address are zero, then that
+ * particular block is not supported.
+ */
+ if (AcpiGbl_FADT.Gpe0BlockLength &&
+ AcpiGbl_FADT.XGpe0Block.Address)
+ {
+ /* GPE block 0 exists (has both length and address > 0) */
+
+ RegisterCount0 = (UINT16) (AcpiGbl_FADT.Gpe0BlockLength / 2);
+
+ GpeNumberMax = (RegisterCount0 * ACPI_GPE_REGISTER_WIDTH) - 1;
+
+ /* Install GPE Block 0 */
+
+ Status = AcpiEvCreateGpeBlock (AcpiGbl_FadtGpeDevice,
+ &AcpiGbl_FADT.XGpe0Block, RegisterCount0, 0,
+ AcpiGbl_FADT.SciInterrupt, &AcpiGbl_GpeFadtBlocks[0]);
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not create GPE Block 0"));
+ }
+ }
+
+ if (AcpiGbl_FADT.Gpe1BlockLength &&
+ AcpiGbl_FADT.XGpe1Block.Address)
+ {
+ /* GPE block 1 exists (has both length and address > 0) */
+
+ RegisterCount1 = (UINT16) (AcpiGbl_FADT.Gpe1BlockLength / 2);
+
+ /* Check for GPE0/GPE1 overlap (if both banks exist) */
+
+ if ((RegisterCount0) &&
+ (GpeNumberMax >= AcpiGbl_FADT.Gpe1Base))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "GPE0 block (GPE 0 to %d) overlaps the GPE1 block (GPE %d to %d) - Ignoring GPE1",
+ GpeNumberMax, AcpiGbl_FADT.Gpe1Base,
+ AcpiGbl_FADT.Gpe1Base +
+ ((RegisterCount1 * ACPI_GPE_REGISTER_WIDTH) - 1)));
+
+ /* Ignore GPE1 block by setting the register count to zero */
+
+ RegisterCount1 = 0;
+ }
+ else
+ {
+ /* Install GPE Block 1 */
+
+ Status = AcpiEvCreateGpeBlock (AcpiGbl_FadtGpeDevice,
+ &AcpiGbl_FADT.XGpe1Block, RegisterCount1,
+ AcpiGbl_FADT.Gpe1Base,
+ AcpiGbl_FADT.SciInterrupt, &AcpiGbl_GpeFadtBlocks[1]);
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not create GPE Block 1"));
+ }
+
+ /*
+ * GPE0 and GPE1 do not have to be contiguous in the GPE number
+ * space. However, GPE0 always starts at GPE number zero.
+ */
+ GpeNumberMax = AcpiGbl_FADT.Gpe1Base +
+ ((RegisterCount1 * ACPI_GPE_REGISTER_WIDTH) - 1);
+ }
+ }
+
+ /* Exit if there are no GPE registers */
+
+ if ((RegisterCount0 + RegisterCount1) == 0)
+ {
+ /* GPEs are not required by ACPI, this is OK */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
+ "There are no GPE blocks defined in the FADT\n"));
+ Status = AE_OK;
+ goto Cleanup;
+ }
+
+ /* Check for Max GPE number out-of-range */
+
+ if (GpeNumberMax > ACPI_GPE_MAX)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Maximum GPE number from FADT is too large: 0x%X",
+ GpeNumberMax));
+ Status = AE_BAD_VALUE;
+ goto Cleanup;
+ }
+
+Cleanup:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/evmisc.c b/sys/contrib/dev/acpica/evmisc.c
new file mode 100644
index 0000000..881519f
--- /dev/null
+++ b/sys/contrib/dev/acpica/evmisc.c
@@ -0,0 +1,749 @@
+/******************************************************************************
+ *
+ * Module Name: evmisc - Miscellaneous event manager support functions
+ * $Revision: 1.103 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+#define _COMPONENT ACPI_EVENTS
+ ACPI_MODULE_NAME ("evmisc")
+
+
+/* Names for Notify() values, used for debug output */
+
+#ifdef ACPI_DEBUG_OUTPUT
+static const char *AcpiNotifyValueNames[] =
+{
+ "Bus Check",
+ "Device Check",
+ "Device Wake",
+ "Eject Request",
+ "Device Check Light",
+ "Frequency Mismatch",
+ "Bus Mode Mismatch",
+ "Power Fault"
+};
+#endif
+
+/* Pointer to FACS needed for the Global Lock */
+
+static ACPI_TABLE_FACS *Facs = NULL;
+
+/* Local prototypes */
+
+static void ACPI_SYSTEM_XFACE
+AcpiEvNotifyDispatch (
+ void *Context);
+
+static UINT32
+AcpiEvGlobalLockHandler (
+ void *Context);
+
+static ACPI_STATUS
+AcpiEvRemoveGlobalLockHandler (
+ void);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvIsNotifyObject
+ *
+ * PARAMETERS: Node - Node to check
+ *
+ * RETURN: TRUE if notifies allowed on this object
+ *
+ * DESCRIPTION: Check type of node for a object that supports notifies.
+ *
+ * TBD: This could be replaced by a flag bit in the node.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiEvIsNotifyObject (
+ ACPI_NAMESPACE_NODE *Node)
+{
+ switch (Node->Type)
+ {
+ case ACPI_TYPE_DEVICE:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_POWER:
+ case ACPI_TYPE_THERMAL:
+ /*
+ * These are the ONLY objects that can receive ACPI notifications
+ */
+ return (TRUE);
+
+ default:
+ return (FALSE);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvQueueNotifyRequest
+ *
+ * PARAMETERS: Node - NS node for the notified object
+ * NotifyValue - Value from the Notify() request
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Dispatch a device notification event to a previously
+ * installed handler.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvQueueNotifyRequest (
+ ACPI_NAMESPACE_NODE *Node,
+ UINT32 NotifyValue)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *HandlerObj = NULL;
+ ACPI_GENERIC_STATE *NotifyInfo;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_NAME (EvQueueNotifyRequest);
+
+
+ /*
+ * For value 3 (Ejection Request), some device method may need to be run.
+ * For value 2 (Device Wake) if _PRW exists, the _PS0 method may need
+ * to be run.
+ * For value 0x80 (Status Change) on the power button or sleep button,
+ * initiate soft-off or sleep operation?
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Dispatching Notify(%X) on node %p\n", NotifyValue, Node));
+
+ if (NotifyValue <= 7)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Notify value: %s\n",
+ AcpiNotifyValueNames[NotifyValue]));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Notify value: 0x%2.2X **Device Specific**\n",
+ NotifyValue));
+ }
+
+ /* Get the notify object attached to the NS Node */
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (ObjDesc)
+ {
+ /* We have the notify object, Get the right handler */
+
+ switch (Node->Type)
+ {
+ case ACPI_TYPE_DEVICE:
+ case ACPI_TYPE_THERMAL:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_POWER:
+
+ if (NotifyValue <= ACPI_MAX_SYS_NOTIFY)
+ {
+ HandlerObj = ObjDesc->CommonNotify.SystemNotify;
+ }
+ else
+ {
+ HandlerObj = ObjDesc->CommonNotify.DeviceNotify;
+ }
+ break;
+
+ default:
+ /* All other types are not supported */
+ return (AE_TYPE);
+ }
+ }
+
+ /* If there is any handler to run, schedule the dispatcher */
+
+ if ((AcpiGbl_SystemNotify.Handler && (NotifyValue <= ACPI_MAX_SYS_NOTIFY)) ||
+ (AcpiGbl_DeviceNotify.Handler && (NotifyValue > ACPI_MAX_SYS_NOTIFY)) ||
+ HandlerObj)
+ {
+ NotifyInfo = AcpiUtCreateGenericState ();
+ if (!NotifyInfo)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ NotifyInfo->Common.DescriptorType = ACPI_DESC_TYPE_STATE_NOTIFY;
+ NotifyInfo->Notify.Node = Node;
+ NotifyInfo->Notify.Value = (UINT16) NotifyValue;
+ NotifyInfo->Notify.HandlerObj = HandlerObj;
+
+ Status = AcpiOsExecute (
+ OSL_NOTIFY_HANDLER, AcpiEvNotifyDispatch, NotifyInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtDeleteGenericState (NotifyInfo);
+ }
+ }
+
+ if (!HandlerObj)
+ {
+ /*
+ * There is no per-device notify handler for this device.
+ * This may or may not be a problem.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "No notify handler for Notify(%4.4s, %X) node %p\n",
+ AcpiUtGetNodeName (Node), NotifyValue, Node));
+ }
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvNotifyDispatch
+ *
+ * PARAMETERS: Context - To be passed to the notify handler
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Dispatch a device notification event to a previously
+ * installed handler.
+ *
+ ******************************************************************************/
+
+static void ACPI_SYSTEM_XFACE
+AcpiEvNotifyDispatch (
+ void *Context)
+{
+ ACPI_GENERIC_STATE *NotifyInfo = (ACPI_GENERIC_STATE *) Context;
+ ACPI_NOTIFY_HANDLER GlobalHandler = NULL;
+ void *GlobalContext = NULL;
+ ACPI_OPERAND_OBJECT *HandlerObj;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * We will invoke a global notify handler if installed.
+ * This is done _before_ we invoke the per-device handler attached
+ * to the device.
+ */
+ if (NotifyInfo->Notify.Value <= ACPI_MAX_SYS_NOTIFY)
+ {
+ /* Global system notification handler */
+
+ if (AcpiGbl_SystemNotify.Handler)
+ {
+ GlobalHandler = AcpiGbl_SystemNotify.Handler;
+ GlobalContext = AcpiGbl_SystemNotify.Context;
+ }
+ }
+ else
+ {
+ /* Global driver notification handler */
+
+ if (AcpiGbl_DeviceNotify.Handler)
+ {
+ GlobalHandler = AcpiGbl_DeviceNotify.Handler;
+ GlobalContext = AcpiGbl_DeviceNotify.Context;
+ }
+ }
+
+ /* Invoke the system handler first, if present */
+
+ if (GlobalHandler)
+ {
+ GlobalHandler (NotifyInfo->Notify.Node, NotifyInfo->Notify.Value,
+ GlobalContext);
+ }
+
+ /* Now invoke the per-device handler, if present */
+
+ HandlerObj = NotifyInfo->Notify.HandlerObj;
+ if (HandlerObj)
+ {
+ HandlerObj->Notify.Handler (NotifyInfo->Notify.Node,
+ NotifyInfo->Notify.Value,
+ HandlerObj->Notify.Context);
+ }
+
+ /* All done with the info object */
+
+ AcpiUtDeleteGenericState (NotifyInfo);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvGlobalLockHandler
+ *
+ * PARAMETERS: Context - From thread interface, not used
+ *
+ * RETURN: ACPI_INTERRUPT_HANDLED
+ *
+ * DESCRIPTION: Invoked directly from the SCI handler when a global lock
+ * release interrupt occurs. Attempt to acquire the global lock,
+ * if successful, signal the thread waiting for the lock.
+ *
+ * NOTE: Assumes that the semaphore can be signaled from interrupt level. If
+ * this is not possible for some reason, a separate thread will have to be
+ * scheduled to do this.
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiEvGlobalLockHandler (
+ void *Context)
+{
+ BOOLEAN Acquired = FALSE;
+ ACPI_STATUS Status;
+
+
+ /*
+ * Attempt to get the lock.
+ *
+ * If we don't get it now, it will be marked pending and we will
+ * take another interrupt when it becomes free.
+ */
+ ACPI_ACQUIRE_GLOBAL_LOCK (Facs, Acquired);
+ if (Acquired)
+ {
+ /* Got the lock, now wake the thread waiting for it */
+
+ AcpiGbl_GlobalLockAcquired = TRUE;
+
+ /* Send a unit to the semaphore */
+
+ Status = AcpiOsSignalSemaphore (AcpiGbl_GlobalLockSemaphore, 1);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO, "Could not signal Global Lock semaphore"));
+ }
+ }
+
+ return (ACPI_INTERRUPT_HANDLED);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInitGlobalLockHandler
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Install a handler for the global lock release event
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvInitGlobalLockHandler (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvInitGlobalLockHandler);
+
+
+ Status = AcpiGetTableByIndex (ACPI_TABLE_INDEX_FACS,
+ ACPI_CAST_INDIRECT_PTR (ACPI_TABLE_HEADER, &Facs));
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ AcpiGbl_GlobalLockPresent = TRUE;
+ Status = AcpiInstallFixedEventHandler (ACPI_EVENT_GLOBAL,
+ AcpiEvGlobalLockHandler, NULL);
+
+ /*
+ * If the global lock does not exist on this platform, the attempt
+ * to enable GBL_STATUS will fail (the GBL_ENABLE bit will not stick)
+ * Map to AE_OK, but mark global lock as not present.
+ * Any attempt to actually use the global lock will be flagged
+ * with an error.
+ */
+ if (Status == AE_NO_HARDWARE_RESPONSE)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "No response from Global Lock hardware, disabling lock"));
+
+ AcpiGbl_GlobalLockPresent = FALSE;
+ Status = AE_OK;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvRemoveGlobalLockHandler
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Remove the handler for the Global Lock
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiEvRemoveGlobalLockHandler (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvRemoveGlobalLockHandler);
+
+ AcpiGbl_GlobalLockPresent = FALSE;
+ Status = AcpiRemoveFixedEventHandler (ACPI_EVENT_GLOBAL,
+ AcpiEvGlobalLockHandler);
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiEvAcquireGlobalLock
+ *
+ * PARAMETERS: Timeout - Max time to wait for the lock, in millisec.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Attempt to gain ownership of the Global Lock.
+ *
+ * MUTEX: Interpreter must be locked
+ *
+ * Note: The original implementation allowed multiple threads to "acquire" the
+ * Global Lock, and the OS would hold the lock until the last thread had
+ * released it. However, this could potentially starve the BIOS out of the
+ * lock, especially in the case where there is a tight handshake between the
+ * Embedded Controller driver and the BIOS. Therefore, this implementation
+ * allows only one thread to acquire the HW Global Lock at a time, and makes
+ * the global lock appear as a standard mutex on the OS side.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiEvAcquireGlobalLock (
+ UINT16 Timeout)
+{
+ ACPI_STATUS Status = AE_OK;
+ BOOLEAN Acquired = FALSE;
+
+
+ ACPI_FUNCTION_TRACE (EvAcquireGlobalLock);
+
+
+ /*
+ * Only one thread can acquire the GL at a time, the GlobalLockMutex
+ * enforces this. This interface releases the interpreter if we must wait.
+ */
+ Status = AcpiExSystemWaitMutex (AcpiGbl_GlobalLockMutex->Mutex.OsMutex,
+ Timeout);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Make sure that a global lock actually exists. If not, just treat
+ * the lock as a standard mutex.
+ */
+ if (!AcpiGbl_GlobalLockPresent)
+ {
+ AcpiGbl_GlobalLockAcquired = TRUE;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Attempt to acquire the actual hardware lock */
+
+ ACPI_ACQUIRE_GLOBAL_LOCK (Facs, Acquired);
+ if (Acquired)
+ {
+ /* We got the lock */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Acquired hardware Global Lock\n"));
+
+ AcpiGbl_GlobalLockAcquired = TRUE;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Did not get the lock. The pending bit was set above, and we must now
+ * wait until we get the global lock released interrupt.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Waiting for hardware Global Lock\n"));
+
+ /*
+ * Wait for handshake with the global lock interrupt handler.
+ * This interface releases the interpreter if we must wait.
+ */
+ Status = AcpiExSystemWaitSemaphore (AcpiGbl_GlobalLockSemaphore,
+ ACPI_WAIT_FOREVER);
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvReleaseGlobalLock
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Releases ownership of the Global Lock.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvReleaseGlobalLock (
+ void)
+{
+ BOOLEAN Pending = FALSE;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (EvReleaseGlobalLock);
+
+
+ /* Lock must be already acquired */
+
+ if (!AcpiGbl_GlobalLockAcquired)
+ {
+ ACPI_WARNING ((AE_INFO,
+ "Cannot release the ACPI Global Lock, it has not been acquired"));
+ return_ACPI_STATUS (AE_NOT_ACQUIRED);
+ }
+
+ if (AcpiGbl_GlobalLockPresent)
+ {
+ /* Allow any thread to release the lock */
+
+ ACPI_RELEASE_GLOBAL_LOCK (Facs, Pending);
+
+ /*
+ * If the pending bit was set, we must write GBL_RLS to the control
+ * register
+ */
+ if (Pending)
+ {
+ Status = AcpiSetRegister (
+ ACPI_BITREG_GLOBAL_LOCK_RELEASE, 1);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Released hardware Global Lock\n"));
+ }
+
+ AcpiGbl_GlobalLockAcquired = FALSE;
+
+ /* Release the local GL mutex */
+
+ AcpiOsReleaseMutex (AcpiGbl_GlobalLockMutex->Mutex.OsMutex);
+ return_ACPI_STATUS (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiEvTerminate
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Disable events and free memory allocated for table storage.
+ *
+ ******************************************************************************/
+
+void
+AcpiEvTerminate (
+ void)
+{
+ ACPI_NATIVE_UINT i;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvTerminate);
+
+
+ if (AcpiGbl_EventsInitialized)
+ {
+ /*
+ * Disable all event-related functionality.
+ * In all cases, on error, print a message but obviously we don't abort.
+ */
+
+ /* Disable all fixed events */
+
+ for (i = 0; i < ACPI_NUM_FIXED_EVENTS; i++)
+ {
+ Status = AcpiDisableEvent ((UINT32) i, 0);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not disable fixed event %d", (UINT32) i));
+ }
+ }
+
+ /* Disable all GPEs in all GPE blocks */
+
+ Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock);
+
+ /* Remove SCI handler */
+
+ Status = AcpiEvRemoveSciHandler ();
+ if (ACPI_FAILURE(Status))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not remove SCI handler"));
+ }
+
+ Status = AcpiEvRemoveGlobalLockHandler ();
+ if (ACPI_FAILURE(Status))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not remove Global Lock handler"));
+ }
+ }
+
+ /* Deallocate all handler objects installed within GPE info structs */
+
+ Status = AcpiEvWalkGpeList (AcpiEvDeleteGpeHandlers);
+
+ /* Return to original mode if necessary */
+
+ if (AcpiGbl_OriginalMode == ACPI_SYS_MODE_LEGACY)
+ {
+ Status = AcpiDisable ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_WARNING ((AE_INFO, "AcpiDisable failed"));
+ }
+ }
+ return_VOID;
+}
+
diff --git a/sys/contrib/dev/acpica/evregion.c b/sys/contrib/dev/acpica/evregion.c
new file mode 100644
index 0000000..f7071b1
--- /dev/null
+++ b/sys/contrib/dev/acpica/evregion.c
@@ -0,0 +1,1232 @@
+/******************************************************************************
+ *
+ * Module Name: evregion - ACPI AddressSpace (OpRegion) handler dispatch
+ * $Revision: 1.168 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __EVREGION_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+#define _COMPONENT ACPI_EVENTS
+ ACPI_MODULE_NAME ("evregion")
+
+#define ACPI_NUM_DEFAULT_SPACES 4
+
+static UINT8 AcpiGbl_DefaultAddressSpaces[ACPI_NUM_DEFAULT_SPACES] =
+{
+ ACPI_ADR_SPACE_SYSTEM_MEMORY,
+ ACPI_ADR_SPACE_SYSTEM_IO,
+ ACPI_ADR_SPACE_PCI_CONFIG,
+ ACPI_ADR_SPACE_DATA_TABLE
+};
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiEvRegRun (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue);
+
+static ACPI_STATUS
+AcpiEvInstallHandler (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInstallRegionHandlers
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Installs the core subsystem default address space handlers.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvInstallRegionHandlers (
+ void)
+{
+ ACPI_STATUS Status;
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_TRACE (EvInstallRegionHandlers);
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * All address spaces (PCI Config, EC, SMBus) are scope dependent
+ * and registration must occur for a specific device.
+ *
+ * In the case of the system memory and IO address spaces there is currently
+ * no device associated with the address space. For these we use the root.
+ *
+ * We install the default PCI config space handler at the root so
+ * that this space is immediately available even though the we have
+ * not enumerated all the PCI Root Buses yet. This is to conform
+ * to the ACPI specification which states that the PCI config
+ * space must be always available -- even though we are nowhere
+ * near ready to find the PCI root buses at this point.
+ *
+ * NOTE: We ignore AE_ALREADY_EXISTS because this means that a handler
+ * has already been installed (via AcpiInstallAddressSpaceHandler).
+ * Similar for AE_SAME_HANDLER.
+ */
+ for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++)
+ {
+ Status = AcpiEvInstallSpaceHandler (AcpiGbl_RootNode,
+ AcpiGbl_DefaultAddressSpaces[i],
+ ACPI_DEFAULT_HANDLER, NULL, NULL);
+ switch (Status)
+ {
+ case AE_OK:
+ case AE_SAME_HANDLER:
+ case AE_ALREADY_EXISTS:
+
+ /* These exceptions are all OK */
+
+ Status = AE_OK;
+ break;
+
+ default:
+
+ goto UnlockAndExit;
+ }
+ }
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInitializeOpRegions
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute _REG methods for all Operation Regions that have
+ * an installed default region handler.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvInitializeOpRegions (
+ void)
+{
+ ACPI_STATUS Status;
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_TRACE (EvInitializeOpRegions);
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Run the _REG methods for OpRegions in each default address space
+ */
+ for (i = 0; i < ACPI_NUM_DEFAULT_SPACES; i++)
+ {
+ /* TBD: Make sure handler is the DEFAULT handler, otherwise
+ * _REG will have already been run.
+ */
+ Status = AcpiEvExecuteRegMethods (AcpiGbl_RootNode,
+ AcpiGbl_DefaultAddressSpaces[i]);
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvExecuteRegMethod
+ *
+ * PARAMETERS: RegionObj - Region object
+ * Function - Passed to _REG: On (1) or Off (0)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute _REG method for a region
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvExecuteRegMethod (
+ ACPI_OPERAND_OBJECT *RegionObj,
+ UINT32 Function)
+{
+ ACPI_EVALUATE_INFO *Info;
+ ACPI_OPERAND_OBJECT *Args[3];
+ ACPI_OPERAND_OBJECT *RegionObj2;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvExecuteRegMethod);
+
+
+ RegionObj2 = AcpiNsGetSecondaryObject (RegionObj);
+ if (!RegionObj2)
+ {
+ return_ACPI_STATUS (AE_NOT_EXIST);
+ }
+
+ if (RegionObj2->Extra.Method_REG == NULL)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Allocate and initialize the evaluation information block */
+
+ Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
+ if (!Info)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Info->PrefixNode = RegionObj2->Extra.Method_REG;
+ Info->Pathname = NULL;
+ Info->Parameters = Args;
+ Info->ParameterType = ACPI_PARAM_ARGS;
+ Info->Flags = ACPI_IGNORE_RETURN_VALUE;
+
+ /*
+ * The _REG method has two arguments:
+ *
+ * Arg0 - Integer:
+ * Operation region space ID Same value as RegionObj->Region.SpaceId
+ *
+ * Arg1 - Integer:
+ * connection status 1 for connecting the handler, 0 for disconnecting
+ * the handler (Passed as a parameter)
+ */
+ Args[0] = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!Args[0])
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup1;
+ }
+
+ Args[1] = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!Args[1])
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup2;
+ }
+
+ /* Setup the parameter objects */
+
+ Args[0]->Integer.Value = RegionObj->Region.SpaceId;
+ Args[1]->Integer.Value = Function;
+ Args[2] = NULL;
+
+ /* Execute the method, no return value */
+
+ ACPI_DEBUG_EXEC (
+ AcpiUtDisplayInitPathname (ACPI_TYPE_METHOD, Info->PrefixNode, NULL));
+
+ Status = AcpiNsEvaluate (Info);
+ AcpiUtRemoveReference (Args[1]);
+
+Cleanup2:
+ AcpiUtRemoveReference (Args[0]);
+
+Cleanup1:
+ ACPI_FREE (Info);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvAddressSpaceDispatch
+ *
+ * PARAMETERS: RegionObj - Internal region object
+ * Function - Read or Write operation
+ * Address - Where in the space to read or write
+ * BitWidth - Field width in bits (8, 16, 32, or 64)
+ * Value - Pointer to in or out value, must be
+ * full 64-bit ACPI_INTEGER
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Dispatch an address space or operation region access to
+ * a previously installed handler.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvAddressSpaceDispatch (
+ ACPI_OPERAND_OBJECT *RegionObj,
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value)
+{
+ ACPI_STATUS Status;
+ ACPI_ADR_SPACE_HANDLER Handler;
+ ACPI_ADR_SPACE_SETUP RegionSetup;
+ ACPI_OPERAND_OBJECT *HandlerDesc;
+ ACPI_OPERAND_OBJECT *RegionObj2;
+ void *RegionContext = NULL;
+
+
+ ACPI_FUNCTION_TRACE (EvAddressSpaceDispatch);
+
+
+ RegionObj2 = AcpiNsGetSecondaryObject (RegionObj);
+ if (!RegionObj2)
+ {
+ return_ACPI_STATUS (AE_NOT_EXIST);
+ }
+
+ /* Ensure that there is a handler associated with this region */
+
+ HandlerDesc = RegionObj->Region.Handler;
+ if (!HandlerDesc)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "No handler for Region [%4.4s] (%p) [%s]",
+ AcpiUtGetNodeName (RegionObj->Region.Node),
+ RegionObj, AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
+
+ return_ACPI_STATUS (AE_NOT_EXIST);
+ }
+
+ /*
+ * It may be the case that the region has never been initialized
+ * Some types of regions require special init code
+ */
+ if (!(RegionObj->Region.Flags & AOPOBJ_SETUP_COMPLETE))
+ {
+ /*
+ * This region has not been initialized yet, do it
+ */
+ RegionSetup = HandlerDesc->AddressSpace.Setup;
+ if (!RegionSetup)
+ {
+ /* No initialization routine, exit with error */
+
+ ACPI_ERROR ((AE_INFO,
+ "No init routine for region(%p) [%s]",
+ RegionObj, AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
+ return_ACPI_STATUS (AE_NOT_EXIST);
+ }
+
+ /*
+ * We must exit the interpreter because the region
+ * setup will potentially execute control methods
+ * (e.g., _REG method for this region)
+ */
+ AcpiExRelinquishInterpreter ();
+
+ Status = RegionSetup (RegionObj, ACPI_REGION_ACTIVATE,
+ HandlerDesc->AddressSpace.Context, &RegionContext);
+
+ /* Re-enter the interpreter */
+
+ AcpiExReacquireInterpreter ();
+
+ /* Check for failure of the Region Setup */
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "During region initialization: [%s]",
+ AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Region initialization may have been completed by RegionSetup
+ */
+ if (!(RegionObj->Region.Flags & AOPOBJ_SETUP_COMPLETE))
+ {
+ RegionObj->Region.Flags |= AOPOBJ_SETUP_COMPLETE;
+
+ if (RegionObj2->Extra.RegionContext)
+ {
+ /* The handler for this region was already installed */
+
+ ACPI_FREE (RegionContext);
+ }
+ else
+ {
+ /*
+ * Save the returned context for use in all accesses to
+ * this particular region
+ */
+ RegionObj2->Extra.RegionContext = RegionContext;
+ }
+ }
+ }
+
+ /* We have everything we need, we can invoke the address space handler */
+
+ Handler = HandlerDesc->AddressSpace.Handler;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Handler %p (@%p) Address %8.8X%8.8X [%s]\n",
+ &RegionObj->Region.Handler->AddressSpace, Handler,
+ ACPI_FORMAT_UINT64 (Address),
+ AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
+
+ if (!(HandlerDesc->AddressSpace.HandlerFlags &
+ ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
+ {
+ /*
+ * For handlers other than the default (supplied) handlers, we must
+ * exit the interpreter because the handler *might* block -- we don't
+ * know what it will do, so we can't hold the lock on the intepreter.
+ */
+ AcpiExRelinquishInterpreter();
+ }
+
+ /* Call the handler */
+
+ Status = Handler (Function, Address, BitWidth, Value,
+ HandlerDesc->AddressSpace.Context, RegionObj2->Extra.RegionContext);
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "Returned by Handler for [%s]",
+ AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
+ }
+
+ if (!(HandlerDesc->AddressSpace.HandlerFlags &
+ ACPI_ADDR_HANDLER_DEFAULT_INSTALLED))
+ {
+ /*
+ * We just returned from a non-default handler, we must re-enter the
+ * interpreter
+ */
+ AcpiExReacquireInterpreter ();
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvDetachRegion
+ *
+ * PARAMETERS: RegionObj - Region Object
+ * AcpiNsIsLocked - Namespace Region Already Locked?
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Break the association between the handler and the region
+ * this is a two way association.
+ *
+ ******************************************************************************/
+
+void
+AcpiEvDetachRegion(
+ ACPI_OPERAND_OBJECT *RegionObj,
+ BOOLEAN AcpiNsIsLocked)
+{
+ ACPI_OPERAND_OBJECT *HandlerObj;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT **LastObjPtr;
+ ACPI_ADR_SPACE_SETUP RegionSetup;
+ void **RegionContext;
+ ACPI_OPERAND_OBJECT *RegionObj2;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvDetachRegion);
+
+
+ RegionObj2 = AcpiNsGetSecondaryObject (RegionObj);
+ if (!RegionObj2)
+ {
+ return_VOID;
+ }
+ RegionContext = &RegionObj2->Extra.RegionContext;
+
+ /* Get the address handler from the region object */
+
+ HandlerObj = RegionObj->Region.Handler;
+ if (!HandlerObj)
+ {
+ /* This region has no handler, all done */
+
+ return_VOID;
+ }
+
+ /* Find this region in the handler's list */
+
+ ObjDesc = HandlerObj->AddressSpace.RegionList;
+ LastObjPtr = &HandlerObj->AddressSpace.RegionList;
+
+ while (ObjDesc)
+ {
+ /* Is this the correct Region? */
+
+ if (ObjDesc == RegionObj)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Removing Region %p from address handler %p\n",
+ RegionObj, HandlerObj));
+
+ /* This is it, remove it from the handler's list */
+
+ *LastObjPtr = ObjDesc->Region.Next;
+ ObjDesc->Region.Next = NULL; /* Must clear field */
+
+ if (AcpiNsIsLocked)
+ {
+ Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_VOID;
+ }
+ }
+
+ /* Now stop region accesses by executing the _REG method */
+
+ Status = AcpiEvExecuteRegMethod (RegionObj, 0);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "from region _REG, [%s]",
+ AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
+ }
+
+ if (AcpiNsIsLocked)
+ {
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_VOID;
+ }
+ }
+
+ /*
+ * If the region has been activated, call the setup handler
+ * with the deactivate notification
+ */
+ if (RegionObj->Region.Flags & AOPOBJ_SETUP_COMPLETE)
+ {
+ RegionSetup = HandlerObj->AddressSpace.Setup;
+ Status = RegionSetup (RegionObj, ACPI_REGION_DEACTIVATE,
+ HandlerObj->AddressSpace.Context, RegionContext);
+
+ /* Init routine may fail, Just ignore errors */
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "from region handler - deactivate, [%s]",
+ AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
+ }
+
+ RegionObj->Region.Flags &= ~(AOPOBJ_SETUP_COMPLETE);
+ }
+
+ /*
+ * Remove handler reference in the region
+ *
+ * NOTE: this doesn't mean that the region goes away, the region
+ * is just inaccessible as indicated to the _REG method
+ *
+ * If the region is on the handler's list, this must be the
+ * region's handler
+ */
+ RegionObj->Region.Handler = NULL;
+ AcpiUtRemoveReference (HandlerObj);
+
+ return_VOID;
+ }
+
+ /* Walk the linked list of handlers */
+
+ LastObjPtr = &ObjDesc->Region.Next;
+ ObjDesc = ObjDesc->Region.Next;
+ }
+
+ /* If we get here, the region was not in the handler's region list */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Cannot remove region %p from address handler %p\n",
+ RegionObj, HandlerObj));
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvAttachRegion
+ *
+ * PARAMETERS: HandlerObj - Handler Object
+ * RegionObj - Region Object
+ * AcpiNsIsLocked - Namespace Region Already Locked?
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Create the association between the handler and the region
+ * this is a two way association.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvAttachRegion (
+ ACPI_OPERAND_OBJECT *HandlerObj,
+ ACPI_OPERAND_OBJECT *RegionObj,
+ BOOLEAN AcpiNsIsLocked)
+{
+
+ ACPI_FUNCTION_TRACE (EvAttachRegion);
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Adding Region [%4.4s] %p to address handler %p [%s]\n",
+ AcpiUtGetNodeName (RegionObj->Region.Node),
+ RegionObj, HandlerObj,
+ AcpiUtGetRegionName (RegionObj->Region.SpaceId)));
+
+ /* Link this region to the front of the handler's list */
+
+ RegionObj->Region.Next = HandlerObj->AddressSpace.RegionList;
+ HandlerObj->AddressSpace.RegionList = RegionObj;
+
+ /* Install the region's handler */
+
+ if (RegionObj->Region.Handler)
+ {
+ return_ACPI_STATUS (AE_ALREADY_EXISTS);
+ }
+
+ RegionObj->Region.Handler = HandlerObj;
+ AcpiUtAddReference (HandlerObj);
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInstallHandler
+ *
+ * PARAMETERS: WalkNamespace callback
+ *
+ * DESCRIPTION: This routine installs an address handler into objects that are
+ * of type Region or Device.
+ *
+ * If the Object is a Device, and the device has a handler of
+ * the same type then the search is terminated in that branch.
+ *
+ * This is because the existing handler is closer in proximity
+ * to any more regions than the one we are trying to install.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiEvInstallHandler (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_OPERAND_OBJECT *HandlerObj;
+ ACPI_OPERAND_OBJECT *NextHandlerObj;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_NAME (EvInstallHandler);
+
+
+ HandlerObj = (ACPI_OPERAND_OBJECT *) Context;
+
+ /* Parameter validation */
+
+ if (!HandlerObj)
+ {
+ return (AE_OK);
+ }
+
+ /* Convert and validate the device handle */
+
+ Node = AcpiNsMapHandleToNode (ObjHandle);
+ if (!Node)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * We only care about regions.and objects
+ * that are allowed to have address space handlers
+ */
+ if ((Node->Type != ACPI_TYPE_DEVICE) &&
+ (Node->Type != ACPI_TYPE_REGION) &&
+ (Node != AcpiGbl_RootNode))
+ {
+ return (AE_OK);
+ }
+
+ /* Check for an existing internal object */
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc)
+ {
+ /* No object, just exit */
+
+ return (AE_OK);
+ }
+
+ /* Devices are handled different than regions */
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_DEVICE)
+ {
+ /* Check if this Device already has a handler for this address space */
+
+ NextHandlerObj = ObjDesc->Device.Handler;
+ while (NextHandlerObj)
+ {
+ /* Found a handler, is it for the same address space? */
+
+ if (NextHandlerObj->AddressSpace.SpaceId == HandlerObj->AddressSpace.SpaceId)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Found handler for region [%s] in device %p(%p) handler %p\n",
+ AcpiUtGetRegionName (HandlerObj->AddressSpace.SpaceId),
+ ObjDesc, NextHandlerObj, HandlerObj));
+
+ /*
+ * Since the object we found it on was a device, then it
+ * means that someone has already installed a handler for
+ * the branch of the namespace from this device on. Just
+ * bail out telling the walk routine to not traverse this
+ * branch. This preserves the scoping rule for handlers.
+ */
+ return (AE_CTRL_DEPTH);
+ }
+
+ /* Walk the linked list of handlers attached to this device */
+
+ NextHandlerObj = NextHandlerObj->AddressSpace.Next;
+ }
+
+ /*
+ * As long as the device didn't have a handler for this
+ * space we don't care about it. We just ignore it and
+ * proceed.
+ */
+ return (AE_OK);
+ }
+
+ /* Object is a Region */
+
+ if (ObjDesc->Region.SpaceId != HandlerObj->AddressSpace.SpaceId)
+ {
+ /*
+ * This region is for a different address space
+ * -- just ignore it
+ */
+ return (AE_OK);
+ }
+
+ /*
+ * Now we have a region and it is for the handler's address
+ * space type.
+ *
+ * First disconnect region for any previous handler (if any)
+ */
+ AcpiEvDetachRegion (ObjDesc, FALSE);
+
+ /* Connect the region to the new handler */
+
+ Status = AcpiEvAttachRegion (HandlerObj, ObjDesc, FALSE);
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInstallSpaceHandler
+ *
+ * PARAMETERS: Node - Namespace node for the device
+ * SpaceId - The address space ID
+ * Handler - Address of the handler
+ * Setup - Address of the setup function
+ * Context - Value passed to the handler on each access
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Install a handler for all OpRegions of a given SpaceId.
+ * Assumes namespace is locked
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvInstallSpaceHandler (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_ADR_SPACE_TYPE SpaceId,
+ ACPI_ADR_SPACE_HANDLER Handler,
+ ACPI_ADR_SPACE_SETUP Setup,
+ void *Context)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *HandlerObj;
+ ACPI_STATUS Status;
+ ACPI_OBJECT_TYPE Type;
+ UINT8 Flags = 0;
+
+
+ ACPI_FUNCTION_TRACE (EvInstallSpaceHandler);
+
+
+ /*
+ * This registration is valid for only the types below
+ * and the root. This is where the default handlers
+ * get placed.
+ */
+ if ((Node->Type != ACPI_TYPE_DEVICE) &&
+ (Node->Type != ACPI_TYPE_PROCESSOR) &&
+ (Node->Type != ACPI_TYPE_THERMAL) &&
+ (Node != AcpiGbl_RootNode))
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ if (Handler == ACPI_DEFAULT_HANDLER)
+ {
+ Flags = ACPI_ADDR_HANDLER_DEFAULT_INSTALLED;
+
+ switch (SpaceId)
+ {
+ case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+ Handler = AcpiExSystemMemorySpaceHandler;
+ Setup = AcpiEvSystemMemoryRegionSetup;
+ break;
+
+ case ACPI_ADR_SPACE_SYSTEM_IO:
+ Handler = AcpiExSystemIoSpaceHandler;
+ Setup = AcpiEvIoSpaceRegionSetup;
+ break;
+
+ case ACPI_ADR_SPACE_PCI_CONFIG:
+ Handler = AcpiExPciConfigSpaceHandler;
+ Setup = AcpiEvPciConfigRegionSetup;
+ break;
+
+ case ACPI_ADR_SPACE_CMOS:
+ Handler = AcpiExCmosSpaceHandler;
+ Setup = AcpiEvCmosRegionSetup;
+ break;
+
+ case ACPI_ADR_SPACE_PCI_BAR_TARGET:
+ Handler = AcpiExPciBarSpaceHandler;
+ Setup = AcpiEvPciBarRegionSetup;
+ break;
+
+ case ACPI_ADR_SPACE_DATA_TABLE:
+ Handler = AcpiExDataTableSpaceHandler;
+ Setup = NULL;
+ break;
+
+ default:
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+ }
+
+ /* If the caller hasn't specified a setup routine, use the default */
+
+ if (!Setup)
+ {
+ Setup = AcpiEvDefaultRegionSetup;
+ }
+
+ /* Check for an existing internal object */
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (ObjDesc)
+ {
+ /*
+ * The attached device object already exists.
+ * Make sure the handler is not already installed.
+ */
+ HandlerObj = ObjDesc->Device.Handler;
+
+ /* Walk the handler list for this device */
+
+ while (HandlerObj)
+ {
+ /* Same SpaceId indicates a handler already installed */
+
+ if (HandlerObj->AddressSpace.SpaceId == SpaceId)
+ {
+ if (HandlerObj->AddressSpace.Handler == Handler)
+ {
+ /*
+ * It is (relatively) OK to attempt to install the SAME
+ * handler twice. This can easily happen
+ * with PCI_Config space.
+ */
+ Status = AE_SAME_HANDLER;
+ goto UnlockAndExit;
+ }
+ else
+ {
+ /* A handler is already installed */
+
+ Status = AE_ALREADY_EXISTS;
+ }
+ goto UnlockAndExit;
+ }
+
+ /* Walk the linked list of handlers */
+
+ HandlerObj = HandlerObj->AddressSpace.Next;
+ }
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Creating object on Device %p while installing handler\n", Node));
+
+ /* ObjDesc does not exist, create one */
+
+ if (Node->Type == ACPI_TYPE_ANY)
+ {
+ Type = ACPI_TYPE_DEVICE;
+ }
+ else
+ {
+ Type = Node->Type;
+ }
+
+ ObjDesc = AcpiUtCreateInternalObject (Type);
+ if (!ObjDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto UnlockAndExit;
+ }
+
+ /* Init new descriptor */
+
+ ObjDesc->Common.Type = (UINT8) Type;
+
+ /* Attach the new object to the Node */
+
+ Status = AcpiNsAttachObject (Node, ObjDesc, Type);
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Installing address handler for region %s(%X) on Device %4.4s %p(%p)\n",
+ AcpiUtGetRegionName (SpaceId), SpaceId,
+ AcpiUtGetNodeName (Node), Node, ObjDesc));
+
+ /*
+ * Install the handler
+ *
+ * At this point there is no existing handler.
+ * Just allocate the object for the handler and link it
+ * into the list.
+ */
+ HandlerObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_ADDRESS_HANDLER);
+ if (!HandlerObj)
+ {
+ Status = AE_NO_MEMORY;
+ goto UnlockAndExit;
+ }
+
+ /* Init handler obj */
+
+ HandlerObj->AddressSpace.SpaceId = (UINT8) SpaceId;
+ HandlerObj->AddressSpace.HandlerFlags = Flags;
+ HandlerObj->AddressSpace.RegionList = NULL;
+ HandlerObj->AddressSpace.Node = Node;
+ HandlerObj->AddressSpace.Handler = Handler;
+ HandlerObj->AddressSpace.Context = Context;
+ HandlerObj->AddressSpace.Setup = Setup;
+
+ /* Install at head of Device.AddressSpace list */
+
+ HandlerObj->AddressSpace.Next = ObjDesc->Device.Handler;
+
+ /*
+ * The Device object is the first reference on the HandlerObj.
+ * Each region that uses the handler adds a reference.
+ */
+ ObjDesc->Device.Handler = HandlerObj;
+
+ /*
+ * Walk the namespace finding all of the regions this
+ * handler will manage.
+ *
+ * Start at the device and search the branch toward
+ * the leaf nodes until either the leaf is encountered or
+ * a device is detected that has an address handler of the
+ * same type.
+ *
+ * In either case, back up and search down the remainder
+ * of the branch
+ */
+ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX,
+ ACPI_NS_WALK_UNLOCK, AcpiEvInstallHandler,
+ HandlerObj, NULL);
+
+UnlockAndExit:
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvExecuteRegMethods
+ *
+ * PARAMETERS: Node - Namespace node for the device
+ * SpaceId - The address space ID
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Run all _REG methods for the input Space ID;
+ * Note: assumes namespace is locked, or system init time.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvExecuteRegMethods (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_ADR_SPACE_TYPE SpaceId)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvExecuteRegMethods);
+
+
+ /*
+ * Run all _REG methods for all Operation Regions for this
+ * space ID. This is a separate walk in order to handle any
+ * interdependencies between regions and _REG methods. (i.e. handlers
+ * must be installed for all regions of this Space ID before we
+ * can run any _REG methods)
+ */
+ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, Node, ACPI_UINT32_MAX,
+ ACPI_NS_WALK_UNLOCK, AcpiEvRegRun,
+ &SpaceId, NULL);
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvRegRun
+ *
+ * PARAMETERS: WalkNamespace callback
+ *
+ * DESCRIPTION: Run _REG method for region objects of the requested spaceID
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiEvRegRun (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_ADR_SPACE_TYPE SpaceId;
+ ACPI_STATUS Status;
+
+
+ SpaceId = *ACPI_CAST_PTR (ACPI_ADR_SPACE_TYPE, Context);
+
+ /* Convert and validate the device handle */
+
+ Node = AcpiNsMapHandleToNode (ObjHandle);
+ if (!Node)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * We only care about regions.and objects
+ * that are allowed to have address space handlers
+ */
+ if ((Node->Type != ACPI_TYPE_REGION) &&
+ (Node != AcpiGbl_RootNode))
+ {
+ return (AE_OK);
+ }
+
+ /* Check for an existing internal object */
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc)
+ {
+ /* No object, just exit */
+
+ return (AE_OK);
+ }
+
+ /* Object is a Region */
+
+ if (ObjDesc->Region.SpaceId != SpaceId)
+ {
+ /*
+ * This region is for a different address space
+ * -- just ignore it
+ */
+ return (AE_OK);
+ }
+
+ Status = AcpiEvExecuteRegMethod (ObjDesc, 1);
+ return (Status);
+}
+
diff --git a/sys/contrib/dev/acpica/evrgnini.c b/sys/contrib/dev/acpica/evrgnini.c
new file mode 100644
index 0000000..615c397
--- /dev/null
+++ b/sys/contrib/dev/acpica/evrgnini.c
@@ -0,0 +1,821 @@
+/******************************************************************************
+ *
+ * Module Name: evrgnini- ACPI AddressSpace (OpRegion) init
+ * $Revision: 1.88 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __EVRGNINI_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#define _COMPONENT ACPI_EVENTS
+ ACPI_MODULE_NAME ("evrgnini")
+
+/* Local prototypes */
+
+static BOOLEAN
+AcpiEvMatchPciRootBridge (
+ char *Id);
+
+static BOOLEAN
+AcpiEvIsPciRootBridge (
+ ACPI_NAMESPACE_NODE *Node);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvSystemMemoryRegionSetup
+ *
+ * PARAMETERS: Handle - Region we are interested in
+ * Function - Start or stop
+ * HandlerContext - Address space handler context
+ * RegionContext - Region specific context
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Setup a SystemMemory operation region
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvSystemMemoryRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext)
+{
+ ACPI_OPERAND_OBJECT *RegionDesc = (ACPI_OPERAND_OBJECT *) Handle;
+ ACPI_MEM_SPACE_CONTEXT *LocalRegionContext;
+
+
+ ACPI_FUNCTION_TRACE (EvSystemMemoryRegionSetup);
+
+
+ if (Function == ACPI_REGION_DEACTIVATE)
+ {
+ if (*RegionContext)
+ {
+ LocalRegionContext = (ACPI_MEM_SPACE_CONTEXT *) *RegionContext;
+
+ /* Delete a cached mapping if present */
+
+ if (LocalRegionContext->MappedLength)
+ {
+ AcpiOsUnmapMemory (LocalRegionContext->MappedLogicalAddress,
+ LocalRegionContext->MappedLength);
+ }
+ ACPI_FREE (LocalRegionContext);
+ *RegionContext = NULL;
+ }
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Create a new context */
+
+ LocalRegionContext = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_MEM_SPACE_CONTEXT));
+ if (!(LocalRegionContext))
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Save the region length and address for use in the handler */
+
+ LocalRegionContext->Length = RegionDesc->Region.Length;
+ LocalRegionContext->Address = RegionDesc->Region.Address;
+
+ *RegionContext = LocalRegionContext;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvIoSpaceRegionSetup
+ *
+ * PARAMETERS: Handle - Region we are interested in
+ * Function - Start or stop
+ * HandlerContext - Address space handler context
+ * RegionContext - Region specific context
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Setup a IO operation region
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvIoSpaceRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext)
+{
+ ACPI_FUNCTION_TRACE (EvIoSpaceRegionSetup);
+
+
+ if (Function == ACPI_REGION_DEACTIVATE)
+ {
+ *RegionContext = NULL;
+ }
+ else
+ {
+ *RegionContext = HandlerContext;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvPciConfigRegionSetup
+ *
+ * PARAMETERS: Handle - Region we are interested in
+ * Function - Start or stop
+ * HandlerContext - Address space handler context
+ * RegionContext - Region specific context
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Setup a PCI_Config operation region
+ *
+ * MUTEX: Assumes namespace is not locked
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvPciConfigRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_INTEGER PciValue;
+ ACPI_PCI_ID *PciId = *RegionContext;
+ ACPI_OPERAND_OBJECT *HandlerObj;
+ ACPI_NAMESPACE_NODE *ParentNode;
+ ACPI_NAMESPACE_NODE *PciRootNode;
+ ACPI_NAMESPACE_NODE *PciDeviceNode;
+ ACPI_OPERAND_OBJECT *RegionObj = (ACPI_OPERAND_OBJECT *) Handle;
+
+
+ ACPI_FUNCTION_TRACE (EvPciConfigRegionSetup);
+
+
+ HandlerObj = RegionObj->Region.Handler;
+ if (!HandlerObj)
+ {
+ /*
+ * No installed handler. This shouldn't happen because the dispatch
+ * routine checks before we get here, but we check again just in case.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Attempting to init a region %p, with no handler\n", RegionObj));
+ return_ACPI_STATUS (AE_NOT_EXIST);
+ }
+
+ *RegionContext = NULL;
+ if (Function == ACPI_REGION_DEACTIVATE)
+ {
+ if (PciId)
+ {
+ ACPI_FREE (PciId);
+ }
+ return_ACPI_STATUS (Status);
+ }
+
+ ParentNode = AcpiNsGetParentNode (RegionObj->Region.Node);
+
+ /*
+ * Get the _SEG and _BBN values from the device upon which the handler
+ * is installed.
+ *
+ * We need to get the _SEG and _BBN objects relative to the PCI BUS device.
+ * This is the device the handler has been registered to handle.
+ */
+
+ /*
+ * If the AddressSpace.Node is still pointing to the root, we need
+ * to scan upward for a PCI Root bridge and re-associate the OpRegion
+ * handlers with that device.
+ */
+ if (HandlerObj->AddressSpace.Node == AcpiGbl_RootNode)
+ {
+ /* Start search from the parent object */
+
+ PciRootNode = ParentNode;
+ while (PciRootNode != AcpiGbl_RootNode)
+ {
+ /* Get the _HID/_CID in order to detect a RootBridge */
+
+ if (AcpiEvIsPciRootBridge (PciRootNode))
+ {
+ /* Install a handler for this PCI root bridge */
+
+ Status = AcpiInstallAddressSpaceHandler (
+ (ACPI_HANDLE) PciRootNode,
+ ACPI_ADR_SPACE_PCI_CONFIG,
+ ACPI_DEFAULT_HANDLER, NULL, NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_SAME_HANDLER)
+ {
+ /*
+ * It is OK if the handler is already installed on the root
+ * bridge. Still need to return a context object for the
+ * new PCI_Config operation region, however.
+ */
+ Status = AE_OK;
+ }
+ else
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not install PciConfig handler for Root Bridge %4.4s",
+ AcpiUtGetNodeName (PciRootNode)));
+ }
+ }
+ break;
+ }
+
+ PciRootNode = AcpiNsGetParentNode (PciRootNode);
+ }
+
+ /* PCI root bridge not found, use namespace root node */
+ }
+ else
+ {
+ PciRootNode = HandlerObj->AddressSpace.Node;
+ }
+
+ /*
+ * If this region is now initialized, we are done.
+ * (InstallAddressSpaceHandler could have initialized it)
+ */
+ if (RegionObj->Region.Flags & AOPOBJ_SETUP_COMPLETE)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Region is still not initialized. Create a new context */
+
+ PciId = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_PCI_ID));
+ if (!PciId)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /*
+ * For PCI_Config space access, we need the segment, bus,
+ * device and function numbers. Acquire them here.
+ *
+ * Find the parent device object. (This allows the operation region to be
+ * within a subscope under the device, such as a control method.)
+ */
+ PciDeviceNode = RegionObj->Region.Node;
+ while (PciDeviceNode && (PciDeviceNode->Type != ACPI_TYPE_DEVICE))
+ {
+ PciDeviceNode = AcpiNsGetParentNode (PciDeviceNode);
+ }
+
+ if (!PciDeviceNode)
+ {
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /*
+ * Get the PCI device and function numbers from the _ADR object
+ * contained in the parent's scope.
+ */
+ Status = AcpiUtEvaluateNumericObject (METHOD_NAME__ADR, PciDeviceNode, &PciValue);
+
+ /*
+ * The default is zero, and since the allocation above zeroed
+ * the data, just do nothing on failure.
+ */
+ if (ACPI_SUCCESS (Status))
+ {
+ PciId->Device = ACPI_HIWORD (ACPI_LODWORD (PciValue));
+ PciId->Function = ACPI_LOWORD (ACPI_LODWORD (PciValue));
+ }
+
+ /* The PCI segment number comes from the _SEG method */
+
+ Status = AcpiUtEvaluateNumericObject (METHOD_NAME__SEG, PciRootNode, &PciValue);
+ if (ACPI_SUCCESS (Status))
+ {
+ PciId->Segment = ACPI_LOWORD (PciValue);
+ }
+
+ /* The PCI bus number comes from the _BBN method */
+
+ Status = AcpiUtEvaluateNumericObject (METHOD_NAME__BBN, PciRootNode, &PciValue);
+ if (ACPI_SUCCESS (Status))
+ {
+ PciId->Bus = ACPI_LOWORD (PciValue);
+ }
+
+ /* Complete this device's PciId */
+
+ AcpiOsDerivePciId (PciRootNode, RegionObj->Region.Node, &PciId);
+
+ *RegionContext = PciId;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvMatchPciRootBridge
+ *
+ * PARAMETERS: Id - The HID/CID in string format
+ *
+ * RETURN: TRUE if the Id is a match for a PCI/PCI-Express Root Bridge
+ *
+ * DESCRIPTION: Determine if the input ID is a PCI Root Bridge ID.
+ *
+ ******************************************************************************/
+
+static BOOLEAN
+AcpiEvMatchPciRootBridge (
+ char *Id)
+{
+
+ /*
+ * Check if this is a PCI root.
+ * ACPI 3.0+: check for a PCI Express root also.
+ */
+ if (!(ACPI_STRNCMP (Id,
+ PCI_ROOT_HID_STRING,
+ sizeof (PCI_ROOT_HID_STRING))) ||
+
+ !(ACPI_STRNCMP (Id,
+ PCI_EXPRESS_ROOT_HID_STRING,
+ sizeof (PCI_EXPRESS_ROOT_HID_STRING))))
+ {
+ return (TRUE);
+ }
+
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvIsPciRootBridge
+ *
+ * PARAMETERS: Node - Device node being examined
+ *
+ * RETURN: TRUE if device is a PCI/PCI-Express Root Bridge
+ *
+ * DESCRIPTION: Determine if the input device represents a PCI Root Bridge by
+ * examining the _HID and _CID for the device.
+ *
+ ******************************************************************************/
+
+static BOOLEAN
+AcpiEvIsPciRootBridge (
+ ACPI_NAMESPACE_NODE *Node)
+{
+ ACPI_STATUS Status;
+ ACPI_DEVICE_ID Hid;
+ ACPI_COMPATIBLE_ID_LIST *Cid;
+ ACPI_NATIVE_UINT i;
+
+
+ /*
+ * Get the _HID and check for a PCI Root Bridge
+ */
+ Status = AcpiUtExecute_HID (Node, &Hid);
+ if (ACPI_FAILURE (Status))
+ {
+ return (FALSE);
+ }
+
+ if (AcpiEvMatchPciRootBridge (Hid.Value))
+ {
+ return (TRUE);
+ }
+
+ /*
+ * The _HID did not match.
+ * Get the _CID and check for a PCI Root Bridge
+ */
+ Status = AcpiUtExecute_CID (Node, &Cid);
+ if (ACPI_FAILURE (Status))
+ {
+ return (FALSE);
+ }
+
+ /* Check all _CIDs in the returned list */
+
+ for (i = 0; i < Cid->Count; i++)
+ {
+ if (AcpiEvMatchPciRootBridge (Cid->Id[i].Value))
+ {
+ ACPI_FREE (Cid);
+ return (TRUE);
+ }
+ }
+
+ ACPI_FREE (Cid);
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvPciBarRegionSetup
+ *
+ * PARAMETERS: Handle - Region we are interested in
+ * Function - Start or stop
+ * HandlerContext - Address space handler context
+ * RegionContext - Region specific context
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Setup a PciBAR operation region
+ *
+ * MUTEX: Assumes namespace is not locked
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvPciBarRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext)
+{
+ ACPI_FUNCTION_TRACE (EvPciBarRegionSetup);
+
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvCmosRegionSetup
+ *
+ * PARAMETERS: Handle - Region we are interested in
+ * Function - Start or stop
+ * HandlerContext - Address space handler context
+ * RegionContext - Region specific context
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Setup a CMOS operation region
+ *
+ * MUTEX: Assumes namespace is not locked
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvCmosRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext)
+{
+ ACPI_FUNCTION_TRACE (EvCmosRegionSetup);
+
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvDefaultRegionSetup
+ *
+ * PARAMETERS: Handle - Region we are interested in
+ * Function - Start or stop
+ * HandlerContext - Address space handler context
+ * RegionContext - Region specific context
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Default region initialization
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvDefaultRegionSetup (
+ ACPI_HANDLE Handle,
+ UINT32 Function,
+ void *HandlerContext,
+ void **RegionContext)
+{
+ ACPI_FUNCTION_TRACE (EvDefaultRegionSetup);
+
+
+ if (Function == ACPI_REGION_DEACTIVATE)
+ {
+ *RegionContext = NULL;
+ }
+ else
+ {
+ *RegionContext = HandlerContext;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvInitializeRegion
+ *
+ * PARAMETERS: RegionObj - Region we are initializing
+ * AcpiNsLocked - Is namespace locked?
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initializes the region, finds any _REG methods and saves them
+ * for execution at a later time
+ *
+ * Get the appropriate address space handler for a newly
+ * created region.
+ *
+ * This also performs address space specific initialization. For
+ * example, PCI regions must have an _ADR object that contains
+ * a PCI address in the scope of the definition. This address is
+ * required to perform an access to PCI config space.
+ *
+ * MUTEX: Interpreter should be unlocked, because we may run the _REG
+ * method for this region.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvInitializeRegion (
+ ACPI_OPERAND_OBJECT *RegionObj,
+ BOOLEAN AcpiNsLocked)
+{
+ ACPI_OPERAND_OBJECT *HandlerObj;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_ADR_SPACE_TYPE SpaceId;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *MethodNode;
+ ACPI_NAME *RegNamePtr = (ACPI_NAME *) METHOD_NAME__REG;
+ ACPI_OPERAND_OBJECT *RegionObj2;
+
+
+ ACPI_FUNCTION_TRACE_U32 (EvInitializeRegion, AcpiNsLocked);
+
+
+ if (!RegionObj)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if (RegionObj->Common.Flags & AOPOBJ_OBJECT_INITIALIZED)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ RegionObj2 = AcpiNsGetSecondaryObject (RegionObj);
+ if (!RegionObj2)
+ {
+ return_ACPI_STATUS (AE_NOT_EXIST);
+ }
+
+ Node = AcpiNsGetParentNode (RegionObj->Region.Node);
+ SpaceId = RegionObj->Region.SpaceId;
+
+ /* Setup defaults */
+
+ RegionObj->Region.Handler = NULL;
+ RegionObj2->Extra.Method_REG = NULL;
+ RegionObj->Common.Flags &= ~(AOPOBJ_SETUP_COMPLETE);
+ RegionObj->Common.Flags |= AOPOBJ_OBJECT_INITIALIZED;
+
+ /* Find any "_REG" method associated with this region definition */
+
+ Status = AcpiNsSearchOneScope (
+ *RegNamePtr, Node, ACPI_TYPE_METHOD, &MethodNode);
+ if (ACPI_SUCCESS (Status))
+ {
+ /*
+ * The _REG method is optional and there can be only one per region
+ * definition. This will be executed when the handler is attached
+ * or removed
+ */
+ RegionObj2->Extra.Method_REG = MethodNode;
+ }
+
+ /*
+ * The following loop depends upon the root Node having no parent
+ * ie: AcpiGbl_RootNode->ParentEntry being set to NULL
+ */
+ while (Node)
+ {
+ /* Check to see if a handler exists */
+
+ HandlerObj = NULL;
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (ObjDesc)
+ {
+ /* Can only be a handler if the object exists */
+
+ switch (Node->Type)
+ {
+ case ACPI_TYPE_DEVICE:
+
+ HandlerObj = ObjDesc->Device.Handler;
+ break;
+
+ case ACPI_TYPE_PROCESSOR:
+
+ HandlerObj = ObjDesc->Processor.Handler;
+ break;
+
+ case ACPI_TYPE_THERMAL:
+
+ HandlerObj = ObjDesc->ThermalZone.Handler;
+ break;
+
+ default:
+ /* Ignore other objects */
+ break;
+ }
+
+ while (HandlerObj)
+ {
+ /* Is this handler of the correct type? */
+
+ if (HandlerObj->AddressSpace.SpaceId == SpaceId)
+ {
+ /* Found correct handler */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Found handler %p for region %p in obj %p\n",
+ HandlerObj, RegionObj, ObjDesc));
+
+ Status = AcpiEvAttachRegion (HandlerObj, RegionObj,
+ AcpiNsLocked);
+
+ /*
+ * Tell all users that this region is usable by running the _REG
+ * method
+ */
+ if (AcpiNsLocked)
+ {
+ Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ Status = AcpiEvExecuteRegMethod (RegionObj, 1);
+
+ if (AcpiNsLocked)
+ {
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Try next handler in the list */
+
+ HandlerObj = HandlerObj->AddressSpace.Next;
+ }
+ }
+
+ /*
+ * This node does not have the handler we need;
+ * Pop up one level
+ */
+ Node = AcpiNsGetParentNode (Node);
+ }
+
+ /* If we get here, there is no handler for this region */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "No handler for RegionType %s(%X) (RegionObj %p)\n",
+ AcpiUtGetRegionName (SpaceId), SpaceId, RegionObj));
+
+ return_ACPI_STATUS (AE_NOT_EXIST);
+}
+
diff --git a/sys/contrib/dev/acpica/evsci.c b/sys/contrib/dev/acpica/evsci.c
new file mode 100644
index 0000000..ab81cbb
--- /dev/null
+++ b/sys/contrib/dev/acpica/evsci.c
@@ -0,0 +1,281 @@
+/*******************************************************************************
+ *
+ * Module Name: evsci - System Control Interrupt configuration and
+ * legacy to ACPI mode state transition functions
+ * $Revision: 1.102 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acevents.h>
+
+
+#define _COMPONENT ACPI_EVENTS
+ ACPI_MODULE_NAME ("evsci")
+
+/* Local prototypes */
+
+static UINT32 ACPI_SYSTEM_XFACE
+AcpiEvSciXruptHandler (
+ void *Context);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvSciXruptHandler
+ *
+ * PARAMETERS: Context - Calling Context
+ *
+ * RETURN: Status code indicates whether interrupt was handled.
+ *
+ * DESCRIPTION: Interrupt handler that will figure out what function or
+ * control method to call to deal with a SCI.
+ *
+ ******************************************************************************/
+
+static UINT32 ACPI_SYSTEM_XFACE
+AcpiEvSciXruptHandler (
+ void *Context)
+{
+ ACPI_GPE_XRUPT_INFO *GpeXruptList = Context;
+ UINT32 InterruptHandled = ACPI_INTERRUPT_NOT_HANDLED;
+
+
+ ACPI_FUNCTION_TRACE (EvSciXruptHandler);
+
+
+ /*
+ * We are guaranteed by the ACPI CA initialization/shutdown code that
+ * if this interrupt handler is installed, ACPI is enabled.
+ */
+
+ /*
+ * Fixed Events:
+ * Check for and dispatch any Fixed Events that have occurred
+ */
+ InterruptHandled |= AcpiEvFixedEventDetect ();
+
+ /*
+ * General Purpose Events:
+ * Check for and dispatch any GPEs that have occurred
+ */
+ InterruptHandled |= AcpiEvGpeDetect (GpeXruptList);
+
+ return_UINT32 (InterruptHandled);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvGpeXruptHandler
+ *
+ * PARAMETERS: Context - Calling Context
+ *
+ * RETURN: Status code indicates whether interrupt was handled.
+ *
+ * DESCRIPTION: Handler for GPE Block Device interrupts
+ *
+ ******************************************************************************/
+
+UINT32 ACPI_SYSTEM_XFACE
+AcpiEvGpeXruptHandler (
+ void *Context)
+{
+ ACPI_GPE_XRUPT_INFO *GpeXruptList = Context;
+ UINT32 InterruptHandled = ACPI_INTERRUPT_NOT_HANDLED;
+
+
+ ACPI_FUNCTION_TRACE (EvGpeXruptHandler);
+
+
+ /*
+ * We are guaranteed by the ACPI CA initialization/shutdown code that
+ * if this interrupt handler is installed, ACPI is enabled.
+ */
+
+ /*
+ * GPEs:
+ * Check for and dispatch any GPEs that have occurred
+ */
+ InterruptHandled |= AcpiEvGpeDetect (GpeXruptList);
+
+ return_UINT32 (InterruptHandled);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiEvInstallSciHandler
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Installs SCI handler.
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiEvInstallSciHandler (
+ void)
+{
+ UINT32 Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (EvInstallSciHandler);
+
+
+ Status = AcpiOsInstallInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt,
+ AcpiEvSciXruptHandler, AcpiGbl_GpeXruptListHead);
+ return_ACPI_STATUS (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiEvRemoveSciHandler
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: E_OK if handler uninstalled OK, E_ERROR if handler was not
+ * installed to begin with
+ *
+ * DESCRIPTION: Remove the SCI interrupt handler. No further SCIs will be
+ * taken.
+ *
+ * Note: It doesn't seem important to disable all events or set the event
+ * enable registers to their original values. The OS should disable
+ * the SCI interrupt level when the handler is removed, so no more
+ * events will come in.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvRemoveSciHandler (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (EvRemoveSciHandler);
+
+
+ /* Just let the OS remove the handler and disable the level */
+
+ Status = AcpiOsRemoveInterruptHandler ((UINT32) AcpiGbl_FADT.SciInterrupt,
+ AcpiEvSciXruptHandler);
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/evxface.c b/sys/contrib/dev/acpica/evxface.c
new file mode 100644
index 0000000..021ebf7
--- /dev/null
+++ b/sys/contrib/dev/acpica/evxface.c
@@ -0,0 +1,974 @@
+/******************************************************************************
+ *
+ * Module Name: evxface - External interfaces for ACPI events
+ * $Revision: 1.165 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __EVXFACE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+#define _COMPONENT ACPI_EVENTS
+ ACPI_MODULE_NAME ("evxface")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiInstallExceptionHandler
+ *
+ * PARAMETERS: Handler - Pointer to the handler function for the
+ * event
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Saves the pointer to the handler function
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiInstallExceptionHandler (
+ ACPI_EXCEPTION_HANDLER Handler)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiInstallExceptionHandler);
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Don't allow two handlers. */
+
+ if (AcpiGbl_ExceptionHandler)
+ {
+ Status = AE_ALREADY_EXISTS;
+ goto Cleanup;
+ }
+
+ /* Install the handler */
+
+ AcpiGbl_ExceptionHandler = Handler;
+
+Cleanup:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInstallExceptionHandler)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiInstallFixedEventHandler
+ *
+ * PARAMETERS: Event - Event type to enable.
+ * Handler - Pointer to the handler function for the
+ * event
+ * Context - Value passed to the handler on each GPE
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Saves the pointer to the handler function and then enables the
+ * event.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiInstallFixedEventHandler (
+ UINT32 Event,
+ ACPI_EVENT_HANDLER Handler,
+ void *Context)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiInstallFixedEventHandler);
+
+
+ /* Parameter validation */
+
+ if (Event > ACPI_EVENT_MAX)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Don't allow two handlers. */
+
+ if (NULL != AcpiGbl_FixedEventHandlers[Event].Handler)
+ {
+ Status = AE_ALREADY_EXISTS;
+ goto Cleanup;
+ }
+
+ /* Install the handler before enabling the event */
+
+ AcpiGbl_FixedEventHandlers[Event].Handler = Handler;
+ AcpiGbl_FixedEventHandlers[Event].Context = Context;
+
+ Status = AcpiEnableEvent (Event, 0);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_WARNING ((AE_INFO, "Could not enable fixed event %X", Event));
+
+ /* Remove the handler */
+
+ AcpiGbl_FixedEventHandlers[Event].Handler = NULL;
+ AcpiGbl_FixedEventHandlers[Event].Context = NULL;
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Enabled fixed event %X, Handler=%p\n", Event, Handler));
+ }
+
+
+Cleanup:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInstallFixedEventHandler)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRemoveFixedEventHandler
+ *
+ * PARAMETERS: Event - Event type to disable.
+ * Handler - Address of the handler
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Disables the event and unregisters the event handler.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRemoveFixedEventHandler (
+ UINT32 Event,
+ ACPI_EVENT_HANDLER Handler)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (AcpiRemoveFixedEventHandler);
+
+
+ /* Parameter validation */
+
+ if (Event > ACPI_EVENT_MAX)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Disable the event before removing the handler */
+
+ Status = AcpiDisableEvent (Event, 0);
+
+ /* Always Remove the handler */
+
+ AcpiGbl_FixedEventHandlers[Event].Handler = NULL;
+ AcpiGbl_FixedEventHandlers[Event].Context = NULL;
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_WARNING ((AE_INFO,
+ "Could not write to fixed event enable register %X", Event));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Disabled fixed event %X\n", Event));
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiRemoveFixedEventHandler)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiInstallNotifyHandler
+ *
+ * PARAMETERS: Device - The device for which notifies will be handled
+ * HandlerType - The type of handler:
+ * ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
+ * ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
+ * ACPI_ALL_NOTIFY: both system and device
+ * Handler - Address of the handler
+ * Context - Value passed to the handler on each GPE
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Install a handler for notifies on an ACPI device
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiInstallNotifyHandler (
+ ACPI_HANDLE Device,
+ UINT32 HandlerType,
+ ACPI_NOTIFY_HANDLER Handler,
+ void *Context)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *NotifyObj;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiInstallNotifyHandler);
+
+
+ /* Parameter validation */
+
+ if ((!Device) ||
+ (!Handler) ||
+ (HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Convert and validate the device handle */
+
+ Node = AcpiNsMapHandleToNode (Device);
+ if (!Node)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /*
+ * Root Object:
+ * Registering a notify handler on the root object indicates that the
+ * caller wishes to receive notifications for all objects. Note that
+ * only one <external> global handler can be regsitered (per notify type).
+ */
+ if (Device == ACPI_ROOT_OBJECT)
+ {
+ /* Make sure the handler is not already installed */
+
+ if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
+ AcpiGbl_SystemNotify.Handler) ||
+ ((HandlerType & ACPI_DEVICE_NOTIFY) &&
+ AcpiGbl_DeviceNotify.Handler))
+ {
+ Status = AE_ALREADY_EXISTS;
+ goto UnlockAndExit;
+ }
+
+ if (HandlerType & ACPI_SYSTEM_NOTIFY)
+ {
+ AcpiGbl_SystemNotify.Node = Node;
+ AcpiGbl_SystemNotify.Handler = Handler;
+ AcpiGbl_SystemNotify.Context = Context;
+ }
+
+ if (HandlerType & ACPI_DEVICE_NOTIFY)
+ {
+ AcpiGbl_DeviceNotify.Node = Node;
+ AcpiGbl_DeviceNotify.Handler = Handler;
+ AcpiGbl_DeviceNotify.Context = Context;
+ }
+
+ /* Global notify handler installed */
+ }
+
+ /*
+ * All Other Objects:
+ * Caller will only receive notifications specific to the target object.
+ * Note that only certain object types can receive notifications.
+ */
+ else
+ {
+ /* Notifies allowed on this object? */
+
+ if (!AcpiEvIsNotifyObject (Node))
+ {
+ Status = AE_TYPE;
+ goto UnlockAndExit;
+ }
+
+ /* Check for an existing internal object */
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (ObjDesc)
+ {
+ /* Object exists - make sure there's no handler */
+
+ if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
+ ObjDesc->CommonNotify.SystemNotify) ||
+ ((HandlerType & ACPI_DEVICE_NOTIFY) &&
+ ObjDesc->CommonNotify.DeviceNotify))
+ {
+ Status = AE_ALREADY_EXISTS;
+ goto UnlockAndExit;
+ }
+ }
+ else
+ {
+ /* Create a new object */
+
+ ObjDesc = AcpiUtCreateInternalObject (Node->Type);
+ if (!ObjDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto UnlockAndExit;
+ }
+
+ /* Attach new object to the Node */
+
+ Status = AcpiNsAttachObject (Device, ObjDesc, Node->Type);
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+ }
+
+ /* Install the handler */
+
+ NotifyObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_NOTIFY);
+ if (!NotifyObj)
+ {
+ Status = AE_NO_MEMORY;
+ goto UnlockAndExit;
+ }
+
+ NotifyObj->Notify.Node = Node;
+ NotifyObj->Notify.Handler = Handler;
+ NotifyObj->Notify.Context = Context;
+
+ if (HandlerType & ACPI_SYSTEM_NOTIFY)
+ {
+ ObjDesc->CommonNotify.SystemNotify = NotifyObj;
+ }
+
+ if (HandlerType & ACPI_DEVICE_NOTIFY)
+ {
+ ObjDesc->CommonNotify.DeviceNotify = NotifyObj;
+ }
+
+ if (HandlerType == ACPI_ALL_NOTIFY)
+ {
+ /* Extra ref if installed in both */
+
+ AcpiUtAddReference (NotifyObj);
+ }
+ }
+
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInstallNotifyHandler)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRemoveNotifyHandler
+ *
+ * PARAMETERS: Device - The device for which notifies will be handled
+ * HandlerType - The type of handler:
+ * ACPI_SYSTEM_NOTIFY: SystemHandler (00-7f)
+ * ACPI_DEVICE_NOTIFY: DriverHandler (80-ff)
+ * ACPI_ALL_NOTIFY: both system and device
+ * Handler - Address of the handler
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Remove a handler for notifies on an ACPI device
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRemoveNotifyHandler (
+ ACPI_HANDLE Device,
+ UINT32 HandlerType,
+ ACPI_NOTIFY_HANDLER Handler)
+{
+ ACPI_OPERAND_OBJECT *NotifyObj;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiRemoveNotifyHandler);
+
+
+ /* Parameter validation */
+
+ if ((!Device) ||
+ (!Handler) ||
+ (HandlerType > ACPI_MAX_NOTIFY_HANDLER_TYPE))
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Convert and validate the device handle */
+
+ Node = AcpiNsMapHandleToNode (Device);
+ if (!Node)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Root Object */
+
+ if (Device == ACPI_ROOT_OBJECT)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Removing notify handler for namespace root object\n"));
+
+ if (((HandlerType & ACPI_SYSTEM_NOTIFY) &&
+ !AcpiGbl_SystemNotify.Handler) ||
+ ((HandlerType & ACPI_DEVICE_NOTIFY) &&
+ !AcpiGbl_DeviceNotify.Handler))
+ {
+ Status = AE_NOT_EXIST;
+ goto UnlockAndExit;
+ }
+
+ if (HandlerType & ACPI_SYSTEM_NOTIFY)
+ {
+ AcpiGbl_SystemNotify.Node = NULL;
+ AcpiGbl_SystemNotify.Handler = NULL;
+ AcpiGbl_SystemNotify.Context = NULL;
+ }
+
+ if (HandlerType & ACPI_DEVICE_NOTIFY)
+ {
+ AcpiGbl_DeviceNotify.Node = NULL;
+ AcpiGbl_DeviceNotify.Handler = NULL;
+ AcpiGbl_DeviceNotify.Context = NULL;
+ }
+ }
+
+ /* All Other Objects */
+
+ else
+ {
+ /* Notifies allowed on this object? */
+
+ if (!AcpiEvIsNotifyObject (Node))
+ {
+ Status = AE_TYPE;
+ goto UnlockAndExit;
+ }
+
+ /* Check for an existing internal object */
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc)
+ {
+ Status = AE_NOT_EXIST;
+ goto UnlockAndExit;
+ }
+
+ /* Object exists - make sure there's an existing handler */
+
+ if (HandlerType & ACPI_SYSTEM_NOTIFY)
+ {
+ NotifyObj = ObjDesc->CommonNotify.SystemNotify;
+ if (!NotifyObj)
+ {
+ Status = AE_NOT_EXIST;
+ goto UnlockAndExit;
+ }
+
+ if (NotifyObj->Notify.Handler != Handler)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Remove the handler */
+
+ ObjDesc->CommonNotify.SystemNotify = NULL;
+ AcpiUtRemoveReference (NotifyObj);
+ }
+
+ if (HandlerType & ACPI_DEVICE_NOTIFY)
+ {
+ NotifyObj = ObjDesc->CommonNotify.DeviceNotify;
+ if (!NotifyObj)
+ {
+ Status = AE_NOT_EXIST;
+ goto UnlockAndExit;
+ }
+
+ if (NotifyObj->Notify.Handler != Handler)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Remove the handler */
+
+ ObjDesc->CommonNotify.DeviceNotify = NULL;
+ AcpiUtRemoveReference (NotifyObj);
+ }
+ }
+
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiRemoveNotifyHandler)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiInstallGpeHandler
+ *
+ * PARAMETERS: GpeDevice - Namespace node for the GPE (NULL for FADT
+ * defined GPEs)
+ * GpeNumber - The GPE number within the GPE block
+ * Type - Whether this GPE should be treated as an
+ * edge- or level-triggered interrupt.
+ * Address - Address of the handler
+ * Context - Value passed to the handler on each GPE
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Install a handler for a General Purpose Event.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiInstallGpeHandler (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT32 Type,
+ ACPI_EVENT_HANDLER Address,
+ void *Context)
+{
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+ ACPI_HANDLER_INFO *Handler;
+ ACPI_STATUS Status;
+ ACPI_CPU_FLAGS Flags;
+
+
+ ACPI_FUNCTION_TRACE (AcpiInstallGpeHandler);
+
+
+ /* Parameter validation */
+
+ if ((!Address) || (Type > ACPI_GPE_XRUPT_TYPE_MASK))
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Ensure that we have a valid GPE number */
+
+ GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
+ if (!GpeEventInfo)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Make sure that there isn't a handler there already */
+
+ if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) == ACPI_GPE_DISPATCH_HANDLER)
+ {
+ Status = AE_ALREADY_EXISTS;
+ goto UnlockAndExit;
+ }
+
+ /* Allocate and init handler object */
+
+ Handler = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_HANDLER_INFO));
+ if (!Handler)
+ {
+ Status = AE_NO_MEMORY;
+ goto UnlockAndExit;
+ }
+
+ Handler->Address = Address;
+ Handler->Context = Context;
+ Handler->MethodNode = GpeEventInfo->Dispatch.MethodNode;
+
+ /* Disable the GPE before installing the handler */
+
+ Status = AcpiEvDisableGpe (GpeEventInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* Install the handler */
+
+ Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
+ GpeEventInfo->Dispatch.Handler = Handler;
+
+ /* Setup up dispatch flags to indicate handler (vs. method) */
+
+ GpeEventInfo->Flags &= ~(ACPI_GPE_XRUPT_TYPE_MASK | ACPI_GPE_DISPATCH_MASK); /* Clear bits */
+ GpeEventInfo->Flags |= (UINT8) (Type | ACPI_GPE_DISPATCH_HANDLER);
+
+ AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
+
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInstallGpeHandler)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRemoveGpeHandler
+ *
+ * PARAMETERS: GpeDevice - Namespace node for the GPE (NULL for FADT
+ * defined GPEs)
+ * GpeNumber - The event to remove a handler
+ * Address - Address of the handler
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Remove a handler for a General Purpose AcpiEvent.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRemoveGpeHandler (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ ACPI_EVENT_HANDLER Address)
+{
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+ ACPI_HANDLER_INFO *Handler;
+ ACPI_STATUS Status;
+ ACPI_CPU_FLAGS Flags;
+
+
+ ACPI_FUNCTION_TRACE (AcpiRemoveGpeHandler);
+
+
+ /* Parameter validation */
+
+ if (!Address)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Ensure that we have a valid GPE number */
+
+ GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
+ if (!GpeEventInfo)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Make sure that a handler is indeed installed */
+
+ if ((GpeEventInfo->Flags & ACPI_GPE_DISPATCH_MASK) != ACPI_GPE_DISPATCH_HANDLER)
+ {
+ Status = AE_NOT_EXIST;
+ goto UnlockAndExit;
+ }
+
+ /* Make sure that the installed handler is the same */
+
+ if (GpeEventInfo->Dispatch.Handler->Address != Address)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Disable the GPE before removing the handler */
+
+ Status = AcpiEvDisableGpe (GpeEventInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* Remove the handler */
+
+ Flags = AcpiOsAcquireLock (AcpiGbl_GpeLock);
+ Handler = GpeEventInfo->Dispatch.Handler;
+
+ /* Restore Method node (if any), set dispatch flags */
+
+ GpeEventInfo->Dispatch.MethodNode = Handler->MethodNode;
+ GpeEventInfo->Flags &= ~ACPI_GPE_DISPATCH_MASK; /* Clear bits */
+ if (Handler->MethodNode)
+ {
+ GpeEventInfo->Flags |= ACPI_GPE_DISPATCH_METHOD;
+ }
+ AcpiOsReleaseLock (AcpiGbl_GpeLock, Flags);
+
+ /* Now we can free the handler object */
+
+ ACPI_FREE (Handler);
+
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiRemoveGpeHandler)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiAcquireGlobalLock
+ *
+ * PARAMETERS: Timeout - How long the caller is willing to wait
+ * Handle - Where the handle to the lock is returned
+ * (if acquired)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Acquire the ACPI Global Lock
+ *
+ * Note: Allows callers with the same thread ID to acquire the global lock
+ * multiple times. In other words, externally, the behavior of the global lock
+ * is identical to an AML mutex. On the first acquire, a new handle is
+ * returned. On any subsequent calls to acquire by the same thread, the same
+ * handle is returned.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiAcquireGlobalLock (
+ UINT16 Timeout,
+ UINT32 *Handle)
+{
+ ACPI_STATUS Status;
+
+
+ if (!Handle)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Must lock interpreter to prevent race conditions */
+
+ AcpiExEnterInterpreter ();
+
+ Status = AcpiExAcquireMutexObject (Timeout,
+ AcpiGbl_GlobalLockMutex, AcpiOsGetThreadId ());
+
+ if (ACPI_SUCCESS (Status))
+ {
+ /*
+ * If this was the first acquisition of the Global Lock by this thread,
+ * create a new handle. Otherwise, return the existing handle.
+ */
+ if (AcpiGbl_GlobalLockMutex->Mutex.AcquisitionDepth == 1)
+ {
+ AcpiGbl_GlobalLockHandle++;
+ }
+
+ /* Return the global lock handle */
+
+ *Handle = AcpiGbl_GlobalLockHandle;
+ }
+
+ AcpiExExitInterpreter ();
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiAcquireGlobalLock)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiReleaseGlobalLock
+ *
+ * PARAMETERS: Handle - Returned from AcpiAcquireGlobalLock
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Release the ACPI Global Lock. The handle must be valid.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiReleaseGlobalLock (
+ UINT32 Handle)
+{
+ ACPI_STATUS Status;
+
+
+ if (!Handle || (Handle != AcpiGbl_GlobalLockHandle))
+ {
+ return (AE_NOT_ACQUIRED);
+ }
+
+ Status = AcpiExReleaseMutexObject (AcpiGbl_GlobalLockMutex);
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiReleaseGlobalLock)
+
diff --git a/sys/contrib/dev/acpica/evxfevnt.c b/sys/contrib/dev/acpica/evxfevnt.c
new file mode 100644
index 0000000..e90bded
--- /dev/null
+++ b/sys/contrib/dev/acpica/evxfevnt.c
@@ -0,0 +1,924 @@
+/******************************************************************************
+ *
+ * Module Name: evxfevnt - External Interfaces, ACPI event disable/enable
+ * $Revision: 1.93 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __EVXFEVNT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/actables.h>
+
+#define _COMPONENT ACPI_EVENTS
+ ACPI_MODULE_NAME ("evxfevnt")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEnable
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Transfers the system into ACPI mode.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEnable (
+ void)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (AcpiEnable);
+
+
+ /* ACPI tables must be present */
+
+ if (!AcpiTbTablesLoaded ())
+ {
+ return_ACPI_STATUS (AE_NO_ACPI_TABLES);
+ }
+
+ /* Check current mode */
+
+ if (AcpiHwGetMode() == ACPI_SYS_MODE_ACPI)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "System is already in ACPI mode\n"));
+ }
+ else
+ {
+ /* Transition to ACPI mode */
+
+ Status = AcpiHwSetMode (ACPI_SYS_MODE_ACPI);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO, "Could not transition to ACPI mode"));
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
+ "Transition to ACPI mode successful\n"));
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiEnable)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDisable
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Transfers the system into LEGACY (non-ACPI) mode.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDisable (
+ void)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (AcpiDisable);
+
+
+ if (AcpiHwGetMode() == ACPI_SYS_MODE_LEGACY)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
+ "System is already in legacy (non-ACPI) mode\n"));
+ }
+ else
+ {
+ /* Transition to LEGACY mode */
+
+ Status = AcpiHwSetMode (ACPI_SYS_MODE_LEGACY);
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not exit ACPI mode to legacy mode"));
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI mode disabled\n"));
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiDisable)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEnableEvent
+ *
+ * PARAMETERS: Event - The fixed eventto be enabled
+ * Flags - Reserved
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enable an ACPI event (fixed)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEnableEvent (
+ UINT32 Event,
+ UINT32 Flags)
+{
+ ACPI_STATUS Status = AE_OK;
+ UINT32 Value;
+
+
+ ACPI_FUNCTION_TRACE (AcpiEnableEvent);
+
+
+ /* Decode the Fixed Event */
+
+ if (Event > ACPI_EVENT_MAX)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Enable the requested fixed event (by writing a one to the
+ * enable register bit)
+ */
+ Status = AcpiSetRegister (AcpiGbl_FixedEventInfo[Event].EnableRegisterId, 1);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Make sure that the hardware responded */
+
+ Status = AcpiGetRegister (AcpiGbl_FixedEventInfo[Event].EnableRegisterId,
+ &Value);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (Value != 1)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not enable %s event", AcpiUtGetEventName (Event)));
+ return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiEnableEvent)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiSetGpeType
+ *
+ * PARAMETERS: GpeDevice - Parent GPE Device
+ * GpeNumber - GPE level within the GPE block
+ * Type - New GPE type
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Set the type of an individual GPE
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiSetGpeType (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT8 Type)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+
+
+ ACPI_FUNCTION_TRACE (AcpiSetGpeType);
+
+
+ /* Ensure that we have a valid GPE number */
+
+ GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
+ if (!GpeEventInfo)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ if ((GpeEventInfo->Flags & ACPI_GPE_TYPE_MASK) == Type)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Set the new type (will disable GPE if currently enabled) */
+
+ Status = AcpiEvSetGpeType (GpeEventInfo, Type);
+
+UnlockAndExit:
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiSetGpeType)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEnableGpe
+ *
+ * PARAMETERS: GpeDevice - Parent GPE Device
+ * GpeNumber - GPE level within the GPE block
+ * Flags - Just enable, or also wake enable?
+ * Called from ISR or not
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enable an ACPI event (general purpose)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEnableGpe (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT32 Flags)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+
+
+ ACPI_FUNCTION_TRACE (AcpiEnableGpe);
+
+
+ /* Use semaphore lock if not executing at interrupt level */
+
+ if (Flags & ACPI_NOT_ISR)
+ {
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Ensure that we have a valid GPE number */
+
+ GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
+ if (!GpeEventInfo)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Perform the enable */
+
+ Status = AcpiEvEnableGpe (GpeEventInfo, TRUE);
+
+UnlockAndExit:
+ if (Flags & ACPI_NOT_ISR)
+ {
+ (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ }
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiEnableGpe)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDisableGpe
+ *
+ * PARAMETERS: GpeDevice - Parent GPE Device
+ * GpeNumber - GPE level within the GPE block
+ * Flags - Just disable, or also wake disable?
+ * Called from ISR or not
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Disable an ACPI event (general purpose)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDisableGpe (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT32 Flags)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+
+
+ ACPI_FUNCTION_TRACE (AcpiDisableGpe);
+
+
+ /* Use semaphore lock if not executing at interrupt level */
+
+ if (Flags & ACPI_NOT_ISR)
+ {
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Ensure that we have a valid GPE number */
+
+ GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
+ if (!GpeEventInfo)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ Status = AcpiEvDisableGpe (GpeEventInfo);
+
+UnlockAndExit:
+ if (Flags & ACPI_NOT_ISR)
+ {
+ (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ }
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiDisableGpe)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDisableEvent
+ *
+ * PARAMETERS: Event - The fixed eventto be enabled
+ * Flags - Reserved
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Disable an ACPI event (fixed)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDisableEvent (
+ UINT32 Event,
+ UINT32 Flags)
+{
+ ACPI_STATUS Status = AE_OK;
+ UINT32 Value;
+
+
+ ACPI_FUNCTION_TRACE (AcpiDisableEvent);
+
+
+ /* Decode the Fixed Event */
+
+ if (Event > ACPI_EVENT_MAX)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Disable the requested fixed event (by writing a zero to the
+ * enable register bit)
+ */
+ Status = AcpiSetRegister (AcpiGbl_FixedEventInfo[Event].EnableRegisterId, 0);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiGetRegister (AcpiGbl_FixedEventInfo[Event].EnableRegisterId,
+ &Value);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (Value != 0)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not disable %s events", AcpiUtGetEventName (Event)));
+ return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiDisableEvent)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiClearEvent
+ *
+ * PARAMETERS: Event - The fixed event to be cleared
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Clear an ACPI event (fixed)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiClearEvent (
+ UINT32 Event)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (AcpiClearEvent);
+
+
+ /* Decode the Fixed Event */
+
+ if (Event > ACPI_EVENT_MAX)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Clear the requested fixed event (By writing a one to the
+ * status register bit)
+ */
+ Status = AcpiSetRegister (AcpiGbl_FixedEventInfo[Event].StatusRegisterId, 1);
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiClearEvent)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiClearGpe
+ *
+ * PARAMETERS: GpeDevice - Parent GPE Device
+ * GpeNumber - GPE level within the GPE block
+ * Flags - Called from an ISR or not
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Clear an ACPI event (general purpose)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiClearGpe (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT32 Flags)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+
+
+ ACPI_FUNCTION_TRACE (AcpiClearGpe);
+
+
+ /* Use semaphore lock if not executing at interrupt level */
+
+ if (Flags & ACPI_NOT_ISR)
+ {
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Ensure that we have a valid GPE number */
+
+ GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
+ if (!GpeEventInfo)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ Status = AcpiHwClearGpe (GpeEventInfo);
+
+UnlockAndExit:
+ if (Flags & ACPI_NOT_ISR)
+ {
+ (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ }
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiClearGpe)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetEventStatus
+ *
+ * PARAMETERS: Event - The fixed event
+ * EventStatus - Where the current status of the event will
+ * be returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Obtains and returns the current status of the event
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetEventStatus (
+ UINT32 Event,
+ ACPI_EVENT_STATUS *EventStatus)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetEventStatus);
+
+
+ if (!EventStatus)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Decode the Fixed Event */
+
+ if (Event > ACPI_EVENT_MAX)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Get the status of the requested fixed event */
+
+ Status = AcpiGetRegister (AcpiGbl_FixedEventInfo[Event].StatusRegisterId,
+ EventStatus);
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetEventStatus)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetGpeStatus
+ *
+ * PARAMETERS: GpeDevice - Parent GPE Device
+ * GpeNumber - GPE level within the GPE block
+ * Flags - Called from an ISR or not
+ * EventStatus - Where the current status of the event will
+ * be returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get status of an event (general purpose)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetGpeStatus (
+ ACPI_HANDLE GpeDevice,
+ UINT32 GpeNumber,
+ UINT32 Flags,
+ ACPI_EVENT_STATUS *EventStatus)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_GPE_EVENT_INFO *GpeEventInfo;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetGpeStatus);
+
+
+ /* Use semaphore lock if not executing at interrupt level */
+
+ if (Flags & ACPI_NOT_ISR)
+ {
+ Status = AcpiUtAcquireMutex (ACPI_MTX_EVENTS);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Ensure that we have a valid GPE number */
+
+ GpeEventInfo = AcpiEvGetGpeEventInfo (GpeDevice, GpeNumber);
+ if (!GpeEventInfo)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Obtain status on the requested GPE number */
+
+ Status = AcpiHwGetGpeStatus (GpeEventInfo, EventStatus);
+
+UnlockAndExit:
+ if (Flags & ACPI_NOT_ISR)
+ {
+ (void) AcpiUtReleaseMutex (ACPI_MTX_EVENTS);
+ }
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetGpeStatus)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiInstallGpeBlock
+ *
+ * PARAMETERS: GpeDevice - Handle to the parent GPE Block Device
+ * GpeBlockAddress - Address and SpaceID
+ * RegisterCount - Number of GPE register pairs in the block
+ * InterruptNumber - H/W interrupt for the block
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create and Install a block of GPE registers
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiInstallGpeBlock (
+ ACPI_HANDLE GpeDevice,
+ ACPI_GENERIC_ADDRESS *GpeBlockAddress,
+ UINT32 RegisterCount,
+ UINT32 InterruptNumber)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+
+
+ ACPI_FUNCTION_TRACE (AcpiInstallGpeBlock);
+
+
+ if ((!GpeDevice) ||
+ (!GpeBlockAddress) ||
+ (!RegisterCount))
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Node = AcpiNsMapHandleToNode (GpeDevice);
+ if (!Node)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /*
+ * For user-installed GPE Block Devices, the GpeBlockBaseNumber
+ * is always zero
+ */
+ Status = AcpiEvCreateGpeBlock (Node, GpeBlockAddress, RegisterCount,
+ 0, InterruptNumber, &GpeBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* Run the _PRW methods and enable the GPEs */
+
+ Status = AcpiEvInitializeGpeBlock (Node, GpeBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* Get the DeviceObject attached to the node */
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc)
+ {
+ /* No object, create a new one */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_DEVICE);
+ if (!ObjDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto UnlockAndExit;
+ }
+
+ Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_DEVICE);
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+ }
+
+ /* Install the GPE block in the DeviceObject */
+
+ ObjDesc->Device.GpeBlock = GpeBlock;
+
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInstallGpeBlock)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRemoveGpeBlock
+ *
+ * PARAMETERS: GpeDevice - Handle to the parent GPE Block Device
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Remove a previously installed block of GPE registers
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRemoveGpeBlock (
+ ACPI_HANDLE GpeDevice)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ACPI_FUNCTION_TRACE (AcpiRemoveGpeBlock);
+
+
+ if (!GpeDevice)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Node = AcpiNsMapHandleToNode (GpeDevice);
+ if (!Node)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Get the DeviceObject attached to the node */
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc ||
+ !ObjDesc->Device.GpeBlock)
+ {
+ return_ACPI_STATUS (AE_NULL_OBJECT);
+ }
+
+ /* Delete the GPE block (but not the DeviceObject) */
+
+ Status = AcpiEvDeleteGpeBlock (ObjDesc->Device.GpeBlock);
+ if (ACPI_SUCCESS (Status))
+ {
+ ObjDesc->Device.GpeBlock = NULL;
+ }
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiRemoveGpeBlock)
+
diff --git a/sys/contrib/dev/acpica/evxfregn.c b/sys/contrib/dev/acpica/evxfregn.c
new file mode 100644
index 0000000..7058683
--- /dev/null
+++ b/sys/contrib/dev/acpica/evxfregn.c
@@ -0,0 +1,345 @@
+/******************************************************************************
+ *
+ * Module Name: evxfregn - External Interfaces, ACPI Operation Regions and
+ * Address Spaces.
+ * $Revision: 1.70 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EVXFREGN_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acevents.h>
+
+#define _COMPONENT ACPI_EVENTS
+ ACPI_MODULE_NAME ("evxfregn")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiInstallAddressSpaceHandler
+ *
+ * PARAMETERS: Device - Handle for the device
+ * SpaceId - The address space ID
+ * Handler - Address of the handler
+ * Setup - Address of the setup function
+ * Context - Value passed to the handler on each access
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Install a handler for all OpRegions of a given SpaceId.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiInstallAddressSpaceHandler (
+ ACPI_HANDLE Device,
+ ACPI_ADR_SPACE_TYPE SpaceId,
+ ACPI_ADR_SPACE_HANDLER Handler,
+ ACPI_ADR_SPACE_SETUP Setup,
+ void *Context)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiInstallAddressSpaceHandler);
+
+
+ /* Parameter validation */
+
+ if (!Device)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Convert and validate the device handle */
+
+ Node = AcpiNsMapHandleToNode (Device);
+ if (!Node)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Install the handler for all Regions for this Space ID */
+
+ Status = AcpiEvInstallSpaceHandler (Node, SpaceId, Handler, Setup, Context);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* Run all _REG methods for this address space */
+
+ Status = AcpiEvExecuteRegMethods (Node, SpaceId);
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInstallAddressSpaceHandler)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRemoveAddressSpaceHandler
+ *
+ * PARAMETERS: Device - Handle for the device
+ * SpaceId - The address space ID
+ * Handler - Address of the handler
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Remove a previously installed handler.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRemoveAddressSpaceHandler (
+ ACPI_HANDLE Device,
+ ACPI_ADR_SPACE_TYPE SpaceId,
+ ACPI_ADR_SPACE_HANDLER Handler)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *HandlerObj;
+ ACPI_OPERAND_OBJECT *RegionObj;
+ ACPI_OPERAND_OBJECT **LastObjPtr;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiRemoveAddressSpaceHandler);
+
+
+ /* Parameter validation */
+
+ if (!Device)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Convert and validate the device handle */
+
+ Node = AcpiNsMapHandleToNode (Device);
+ if (!Node ||
+ ((Node->Type != ACPI_TYPE_DEVICE) &&
+ (Node->Type != ACPI_TYPE_PROCESSOR) &&
+ (Node->Type != ACPI_TYPE_THERMAL) &&
+ (Node != AcpiGbl_RootNode)))
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Make sure the internal object exists */
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc)
+ {
+ Status = AE_NOT_EXIST;
+ goto UnlockAndExit;
+ }
+
+ /* Find the address handler the user requested */
+
+ HandlerObj = ObjDesc->Device.Handler;
+ LastObjPtr = &ObjDesc->Device.Handler;
+ while (HandlerObj)
+ {
+ /* We have a handler, see if user requested this one */
+
+ if (HandlerObj->AddressSpace.SpaceId == SpaceId)
+ {
+ /* Handler must be the same as the installed handler */
+
+ if (HandlerObj->AddressSpace.Handler != Handler)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Matched SpaceId, first dereference this in the Regions */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Removing address handler %p(%p) for region %s on Device %p(%p)\n",
+ HandlerObj, Handler, AcpiUtGetRegionName (SpaceId),
+ Node, ObjDesc));
+
+ RegionObj = HandlerObj->AddressSpace.RegionList;
+
+ /* Walk the handler's region list */
+
+ while (RegionObj)
+ {
+ /*
+ * First disassociate the handler from the region.
+ *
+ * NOTE: this doesn't mean that the region goes away
+ * The region is just inaccessible as indicated to
+ * the _REG method
+ */
+ AcpiEvDetachRegion (RegionObj, TRUE);
+
+ /*
+ * Walk the list: Just grab the head because the
+ * DetachRegion removed the previous head.
+ */
+ RegionObj = HandlerObj->AddressSpace.RegionList;
+
+ }
+
+ /* Remove this Handler object from the list */
+
+ *LastObjPtr = HandlerObj->AddressSpace.Next;
+
+ /* Now we can delete the handler object */
+
+ AcpiUtRemoveReference (HandlerObj);
+ goto UnlockAndExit;
+ }
+
+ /* Walk the linked list of handlers */
+
+ LastObjPtr = &HandlerObj->AddressSpace.Next;
+ HandlerObj = HandlerObj->AddressSpace.Next;
+ }
+
+ /* The handler does not exist */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_OPREGION,
+ "Unable to remove address handler %p for %s(%X), DevNode %p, obj %p\n",
+ Handler, AcpiUtGetRegionName (SpaceId), SpaceId, Node, ObjDesc));
+
+ Status = AE_NOT_EXIST;
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiRemoveAddressSpaceHandler)
+
diff --git a/sys/contrib/dev/acpica/exconfig.c b/sys/contrib/dev/acpica/exconfig.c
new file mode 100644
index 0000000..60d8b36
--- /dev/null
+++ b/sys/contrib/dev/acpica/exconfig.c
@@ -0,0 +1,523 @@
+/******************************************************************************
+ *
+ * Module Name: exconfig - Namespace reconfiguration (Load/Unload opcodes)
+ * $Revision: 1.103 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXCONFIG_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/actables.h>
+#include <contrib/dev/acpica/acdispat.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exconfig")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiExAddTable (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_NAMESPACE_NODE *ParentNode,
+ ACPI_OPERAND_OBJECT **DdbHandle);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExAddTable
+ *
+ * PARAMETERS: Table - Pointer to raw table
+ * ParentNode - Where to load the table (scope)
+ * DdbHandle - Where to return the table handle.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Common function to Install and Load an ACPI table with a
+ * returned table handle.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiExAddTable (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_NAMESPACE_NODE *ParentNode,
+ ACPI_OPERAND_OBJECT **DdbHandle)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ACPI_FUNCTION_TRACE (ExAddTable);
+
+
+ /* Create an object to be the table handle */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE);
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Init the table handle */
+
+ ObjDesc->Reference.Opcode = AML_LOAD_OP;
+ *DdbHandle = ObjDesc;
+
+ /* Install the new table into the local data structures */
+
+ ObjDesc->Reference.Object = ACPI_CAST_PTR (void, TableIndex);
+
+ /* Add the table to the namespace */
+
+ Status = AcpiNsLoadTable (TableIndex, ParentNode);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ObjDesc);
+ *DdbHandle = NULL;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExLoadTableOp
+ *
+ * PARAMETERS: WalkState - Current state with operands
+ * ReturnDesc - Where to store the return object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Load an ACPI table from the RSDT/XSDT
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExLoadTableOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT **ReturnDesc)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_NATIVE_UINT TableIndex;
+ ACPI_NAMESPACE_NODE *ParentNode;
+ ACPI_NAMESPACE_NODE *StartNode;
+ ACPI_NAMESPACE_NODE *ParameterNode = NULL;
+ ACPI_OPERAND_OBJECT *DdbHandle;
+ ACPI_TABLE_HEADER *Table;
+
+
+ ACPI_FUNCTION_TRACE (ExLoadTableOp);
+
+
+ /* Find the ACPI table in the RSDT/XSDT */
+
+ Status = AcpiTbFindTable (Operand[0]->String.Pointer,
+ Operand[1]->String.Pointer,
+ Operand[2]->String.Pointer, &TableIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status != AE_NOT_FOUND)
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Table not found, return an Integer=0 and AE_OK */
+
+ DdbHandle = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!DdbHandle)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ DdbHandle->Integer.Value = 0;
+ *ReturnDesc = DdbHandle;
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Default nodes */
+
+ StartNode = WalkState->ScopeInfo->Scope.Node;
+ ParentNode = AcpiGbl_RootNode;
+
+ /* RootPath (optional parameter) */
+
+ if (Operand[3]->String.Length > 0)
+ {
+ /*
+ * Find the node referenced by the RootPathString. This is the
+ * location within the namespace where the table will be loaded.
+ */
+ Status = AcpiNsGetNode (StartNode, Operand[3]->String.Pointer,
+ ACPI_NS_SEARCH_PARENT, &ParentNode);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* ParameterPath (optional parameter) */
+
+ if (Operand[4]->String.Length > 0)
+ {
+ if ((Operand[4]->String.Pointer[0] != '\\') &&
+ (Operand[4]->String.Pointer[0] != '^'))
+ {
+ /*
+ * Path is not absolute, so it will be relative to the node
+ * referenced by the RootPathString (or the NS root if omitted)
+ */
+ StartNode = ParentNode;
+ }
+
+ /* Find the node referenced by the ParameterPathString */
+
+ Status = AcpiNsGetNode (StartNode, Operand[4]->String.Pointer,
+ ACPI_NS_SEARCH_PARENT, &ParameterNode);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Load the table into the namespace */
+
+ Status = AcpiExAddTable (TableIndex, ParentNode, &DdbHandle);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Parameter Data (optional) */
+
+ if (ParameterNode)
+ {
+ /* Store the parameter data into the optional parameter object */
+
+ Status = AcpiExStore (Operand[5],
+ ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, ParameterNode),
+ WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ (void) AcpiExUnloadTable (DdbHandle);
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ Status = AcpiGetTableByIndex (TableIndex, &Table);
+ if (ACPI_SUCCESS (Status))
+ {
+ ACPI_INFO ((AE_INFO,
+ "Dynamic OEM Table Load - [%4.4s] OemId [%6.6s] OemTableId [%8.8s]",
+ Table->Signature, Table->OemId, Table->OemTableId));
+ }
+
+ *ReturnDesc = DdbHandle;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExLoadOp
+ *
+ * PARAMETERS: ObjDesc - Region or Buffer/Field where the table will be
+ * obtained
+ * Target - Where a handle to the table will be stored
+ * WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Load an ACPI table from a field or operation region
+ *
+ * NOTE: Region Fields (Field, BankField, IndexFields) are resolved to buffer
+ * objects before this code is reached.
+ *
+ * If source is an operation region, it must refer to SystemMemory, as
+ * per the ACPI specification.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExLoadOp (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT *Target,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT *DdbHandle;
+ ACPI_TABLE_DESC TableDesc;
+ ACPI_NATIVE_UINT TableIndex;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (ExLoadOp);
+
+
+ ACPI_MEMSET (&TableDesc, 0, sizeof (ACPI_TABLE_DESC));
+ TableDesc.Flags = ACPI_TABLE_ORIGIN_ALLOCATED;
+
+ /* Source Object can be either an OpRegion or a Buffer/Field */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_REGION:
+
+ /* Region must be SystemMemory (from ACPI spec) */
+
+ if (ObjDesc->Region.SpaceId != ACPI_ADR_SPACE_SYSTEM_MEMORY)
+ {
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Load from Region %p %s\n",
+ ObjDesc, AcpiUtGetObjectTypeName (ObjDesc)));
+
+ /*
+ * If the Region Address and Length have not been previously evaluated,
+ * evaluate them now and save the results.
+ */
+ if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID))
+ {
+ Status = AcpiDsGetRegionArguments (ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ TableDesc.Address = ObjDesc->Region.Address;
+ TableDesc.Length = ObjDesc->Region.Length;
+ TableDesc.Flags = ACPI_TABLE_ORIGIN_MAPPED;
+ break;
+
+ case ACPI_TYPE_BUFFER: /* Buffer or resolved RegionField */
+
+ /* Simply extract the buffer from the buffer object */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Load from Buffer or Field %p %s\n",
+ ObjDesc, AcpiUtGetObjectTypeName (ObjDesc)));
+
+ TableDesc.Pointer = ACPI_CAST_PTR (ACPI_TABLE_HEADER,
+ ObjDesc->Buffer.Pointer);
+ TableDesc.Length = TableDesc.Pointer->Length;
+ TableDesc.Flags = ACPI_TABLE_ORIGIN_ALLOCATED;
+
+ ObjDesc->Buffer.Pointer = NULL;
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /*
+ * Install the new table into the local data structures
+ */
+ Status = AcpiTbAddTable (&TableDesc, &TableIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ Status = AcpiExAddTable (TableIndex, AcpiGbl_RootNode, &DdbHandle);
+ if (ACPI_FAILURE (Status))
+ {
+ /* On error, TablePtr was deallocated above */
+
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Store the DdbHandle into the Target operand */
+
+ Status = AcpiExStore (DdbHandle, Target, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ (void) AcpiExUnloadTable (DdbHandle);
+
+ /* TablePtr was deallocated above */
+
+ return_ACPI_STATUS (Status);
+ }
+
+Cleanup:
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiTbDeleteTable (&TableDesc);
+ }
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExUnloadTable
+ *
+ * PARAMETERS: DdbHandle - Handle to a previously loaded table
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Unload an ACPI table
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExUnloadTable (
+ ACPI_OPERAND_OBJECT *DdbHandle)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *TableDesc = DdbHandle;
+ ACPI_NATIVE_UINT TableIndex;
+
+
+ ACPI_FUNCTION_TRACE (ExUnloadTable);
+
+
+ /*
+ * Validate the handle
+ * Although the handle is partially validated in AcpiExReconfiguration(),
+ * when it calls AcpiExResolveOperands(), the handle is more completely
+ * validated here.
+ */
+ if ((!DdbHandle) ||
+ (ACPI_GET_DESCRIPTOR_TYPE (DdbHandle) != ACPI_DESC_TYPE_OPERAND) ||
+ (ACPI_GET_OBJECT_TYPE (DdbHandle) != ACPI_TYPE_LOCAL_REFERENCE))
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Get the table index from the DdbHandle */
+
+ TableIndex = (ACPI_NATIVE_UINT) TableDesc->Reference.Object;
+
+ /*
+ * Delete the entire namespace under this table Node
+ * (Offset contains the TableId)
+ */
+ AcpiTbDeleteNamespaceByOwner (TableIndex);
+ AcpiTbReleaseOwnerId (TableIndex);
+
+ AcpiTbSetTableLoadedFlag (TableIndex, FALSE);
+
+ /* Delete the table descriptor (DdbHandle) */
+
+ AcpiUtRemoveReference (TableDesc);
+ return_ACPI_STATUS (Status);
+}
+
diff --git a/sys/contrib/dev/acpica/exconvrt.c b/sys/contrib/dev/acpica/exconvrt.c
new file mode 100644
index 0000000..17c86c2
--- /dev/null
+++ b/sys/contrib/dev/acpica/exconvrt.c
@@ -0,0 +1,817 @@
+/******************************************************************************
+ *
+ * Module Name: exconvrt - Object conversion routines
+ * $Revision: 1.74 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __EXCONVRT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exconvrt")
+
+/* Local prototypes */
+
+static UINT32
+AcpiExConvertToAscii (
+ ACPI_INTEGER Integer,
+ UINT16 Base,
+ UINT8 *String,
+ UINT8 MaxLength);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExConvertToInteger
+ *
+ * PARAMETERS: ObjDesc - Object to be converted. Must be an
+ * Integer, Buffer, or String
+ * ResultDesc - Where the new Integer object is returned
+ * Flags - Used for string conversion
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert an ACPI Object to an integer.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExConvertToInteger (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc,
+ UINT32 Flags)
+{
+ ACPI_OPERAND_OBJECT *ReturnDesc;
+ UINT8 *Pointer;
+ ACPI_INTEGER Result;
+ UINT32 i;
+ UINT32 Count;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExConvertToInteger, ObjDesc);
+
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+
+ /* No conversion necessary */
+
+ *ResultDesc = ObjDesc;
+ return_ACPI_STATUS (AE_OK);
+
+ case ACPI_TYPE_BUFFER:
+ case ACPI_TYPE_STRING:
+
+ /* Note: Takes advantage of common buffer/string fields */
+
+ Pointer = ObjDesc->Buffer.Pointer;
+ Count = ObjDesc->Buffer.Length;
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_TYPE);
+ }
+
+ /*
+ * Convert the buffer/string to an integer. Note that both buffers and
+ * strings are treated as raw data - we don't convert ascii to hex for
+ * strings.
+ *
+ * There are two terminating conditions for the loop:
+ * 1) The size of an integer has been reached, or
+ * 2) The end of the buffer or string has been reached
+ */
+ Result = 0;
+
+ /* String conversion is different than Buffer conversion */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_STRING:
+
+ /*
+ * Convert string to an integer - for most cases, the string must be
+ * hexadecimal as per the ACPI specification. The only exception (as
+ * of ACPI 3.0) is that the ToInteger() operator allows both decimal
+ * and hexadecimal strings (hex prefixed with "0x").
+ */
+ Status = AcpiUtStrtoul64 ((char *) Pointer, Flags, &Result);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ /* Check for zero-length buffer */
+
+ if (!Count)
+ {
+ return_ACPI_STATUS (AE_AML_BUFFER_LIMIT);
+ }
+
+ /* Transfer no more than an integer's worth of data */
+
+ if (Count > AcpiGbl_IntegerByteWidth)
+ {
+ Count = AcpiGbl_IntegerByteWidth;
+ }
+
+ /*
+ * Convert buffer to an integer - we simply grab enough raw data
+ * from the buffer to fill an integer
+ */
+ for (i = 0; i < Count; i++)
+ {
+ /*
+ * Get next byte and shift it into the Result.
+ * Little endian is used, meaning that the first byte of the buffer
+ * is the LSB of the integer
+ */
+ Result |= (((ACPI_INTEGER) Pointer[i]) << (i * 8));
+ }
+ break;
+
+
+ default:
+ /* No other types can get here */
+ break;
+ }
+
+ /* Create a new integer */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (Result)));
+
+ /* Save the Result */
+
+ ReturnDesc->Integer.Value = Result;
+ AcpiExTruncateFor32bitTable (ReturnDesc);
+ *ResultDesc = ReturnDesc;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExConvertToBuffer
+ *
+ * PARAMETERS: ObjDesc - Object to be converted. Must be an
+ * Integer, Buffer, or String
+ * ResultDesc - Where the new buffer object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert an ACPI Object to a Buffer
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExConvertToBuffer (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc)
+{
+ ACPI_OPERAND_OBJECT *ReturnDesc;
+ UINT8 *NewBuf;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExConvertToBuffer, ObjDesc);
+
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_BUFFER:
+
+ /* No conversion necessary */
+
+ *ResultDesc = ObjDesc;
+ return_ACPI_STATUS (AE_OK);
+
+
+ case ACPI_TYPE_INTEGER:
+
+ /*
+ * Create a new Buffer object.
+ * Need enough space for one integer
+ */
+ ReturnDesc = AcpiUtCreateBufferObject (AcpiGbl_IntegerByteWidth);
+ if (!ReturnDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Copy the integer to the buffer, LSB first */
+
+ NewBuf = ReturnDesc->Buffer.Pointer;
+ ACPI_MEMCPY (NewBuf,
+ &ObjDesc->Integer.Value,
+ AcpiGbl_IntegerByteWidth);
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ /*
+ * Create a new Buffer object
+ * Size will be the string length
+ *
+ * NOTE: Add one to the string length to include the null terminator.
+ * The ACPI spec is unclear on this subject, but there is existing
+ * ASL/AML code that depends on the null being transferred to the new
+ * buffer.
+ */
+ ReturnDesc = AcpiUtCreateBufferObject (
+ (ACPI_SIZE) ObjDesc->String.Length + 1);
+ if (!ReturnDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Copy the string to the buffer */
+
+ NewBuf = ReturnDesc->Buffer.Pointer;
+ ACPI_STRNCPY ((char *) NewBuf, (char *) ObjDesc->String.Pointer,
+ ObjDesc->String.Length);
+ break;
+
+
+ default:
+ return_ACPI_STATUS (AE_TYPE);
+ }
+
+ /* Mark buffer initialized */
+
+ ReturnDesc->Common.Flags |= AOPOBJ_DATA_VALID;
+ *ResultDesc = ReturnDesc;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExConvertToAscii
+ *
+ * PARAMETERS: Integer - Value to be converted
+ * Base - ACPI_STRING_DECIMAL or ACPI_STRING_HEX
+ * String - Where the string is returned
+ * DataWidth - Size of data item to be converted, in bytes
+ *
+ * RETURN: Actual string length
+ *
+ * DESCRIPTION: Convert an ACPI Integer to a hex or decimal string
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiExConvertToAscii (
+ ACPI_INTEGER Integer,
+ UINT16 Base,
+ UINT8 *String,
+ UINT8 DataWidth)
+{
+ ACPI_INTEGER Digit;
+ ACPI_NATIVE_UINT i;
+ ACPI_NATIVE_UINT j;
+ ACPI_NATIVE_UINT k = 0;
+ ACPI_NATIVE_UINT HexLength;
+ ACPI_NATIVE_UINT DecimalLength;
+ UINT32 Remainder;
+ BOOLEAN SupressZeros;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ switch (Base)
+ {
+ case 10:
+
+ /* Setup max length for the decimal number */
+
+ switch (DataWidth)
+ {
+ case 1:
+ DecimalLength = ACPI_MAX8_DECIMAL_DIGITS;
+ break;
+
+ case 4:
+ DecimalLength = ACPI_MAX32_DECIMAL_DIGITS;
+ break;
+
+ case 8:
+ default:
+ DecimalLength = ACPI_MAX64_DECIMAL_DIGITS;
+ break;
+ }
+
+ SupressZeros = TRUE; /* No leading zeros */
+ Remainder = 0;
+
+ for (i = DecimalLength; i > 0; i--)
+ {
+ /* Divide by nth factor of 10 */
+
+ Digit = Integer;
+ for (j = 0; j < i; j++)
+ {
+ (void) AcpiUtShortDivide (Digit, 10, &Digit, &Remainder);
+ }
+
+ /* Handle leading zeros */
+
+ if (Remainder != 0)
+ {
+ SupressZeros = FALSE;
+ }
+
+ if (!SupressZeros)
+ {
+ String[k] = (UINT8) (ACPI_ASCII_ZERO + Remainder);
+ k++;
+ }
+ }
+ break;
+
+ case 16:
+
+ /* HexLength: 2 ascii hex chars per data byte */
+
+ HexLength = (ACPI_NATIVE_UINT) ACPI_MUL_2 (DataWidth);
+ for (i = 0, j = (HexLength-1); i < HexLength; i++, j--)
+ {
+ /* Get one hex digit, most significant digits first */
+
+ String[k] = (UINT8) AcpiUtHexToAsciiChar (Integer, ACPI_MUL_4 (j));
+ k++;
+ }
+ break;
+
+ default:
+ return (0);
+ }
+
+ /*
+ * Since leading zeros are supressed, we must check for the case where
+ * the integer equals 0
+ *
+ * Finally, null terminate the string and return the length
+ */
+ if (!k)
+ {
+ String [0] = ACPI_ASCII_ZERO;
+ k = 1;
+ }
+
+ String [k] = 0;
+ return ((UINT32) k);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExConvertToString
+ *
+ * PARAMETERS: ObjDesc - Object to be converted. Must be an
+ * Integer, Buffer, or String
+ * ResultDesc - Where the string object is returned
+ * Type - String flags (base and conversion type)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert an ACPI Object to a string
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExConvertToString (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc,
+ UINT32 Type)
+{
+ ACPI_OPERAND_OBJECT *ReturnDesc;
+ UINT8 *NewBuf;
+ UINT32 i;
+ UINT32 StringLength = 0;
+ UINT16 Base = 16;
+ UINT8 Separator = ',';
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExConvertToString, ObjDesc);
+
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_STRING:
+
+ /* No conversion necessary */
+
+ *ResultDesc = ObjDesc;
+ return_ACPI_STATUS (AE_OK);
+
+
+ case ACPI_TYPE_INTEGER:
+
+ switch (Type)
+ {
+ case ACPI_EXPLICIT_CONVERT_DECIMAL:
+
+ /* Make room for maximum decimal number */
+
+ StringLength = ACPI_MAX_DECIMAL_DIGITS;
+ Base = 10;
+ break;
+
+ default:
+
+ /* Two hex string characters for each integer byte */
+
+ StringLength = ACPI_MUL_2 (AcpiGbl_IntegerByteWidth);
+ break;
+ }
+
+ /*
+ * Create a new String
+ * Need enough space for one ASCII integer (plus null terminator)
+ */
+ ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE) StringLength);
+ if (!ReturnDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ NewBuf = ReturnDesc->Buffer.Pointer;
+
+ /* Convert integer to string */
+
+ StringLength = AcpiExConvertToAscii (ObjDesc->Integer.Value, Base,
+ NewBuf, AcpiGbl_IntegerByteWidth);
+
+ /* Null terminate at the correct place */
+
+ ReturnDesc->String.Length = StringLength;
+ NewBuf [StringLength] = 0;
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ /* Setup string length, base, and separator */
+
+ switch (Type)
+ {
+ case ACPI_EXPLICIT_CONVERT_DECIMAL: /* Used by ToDecimalString */
+ /*
+ * From ACPI: "If Data is a buffer, it is converted to a string of
+ * decimal values separated by commas."
+ */
+ Base = 10;
+
+ /*
+ * Calculate the final string length. Individual string values
+ * are variable length (include separator for each)
+ */
+ for (i = 0; i < ObjDesc->Buffer.Length; i++)
+ {
+ if (ObjDesc->Buffer.Pointer[i] >= 100)
+ {
+ StringLength += 4;
+ }
+ else if (ObjDesc->Buffer.Pointer[i] >= 10)
+ {
+ StringLength += 3;
+ }
+ else
+ {
+ StringLength += 2;
+ }
+ }
+ break;
+
+ case ACPI_IMPLICIT_CONVERT_HEX:
+ /*
+ * From the ACPI spec:
+ *"The entire contents of the buffer are converted to a string of
+ * two-character hexadecimal numbers, each separated by a space."
+ */
+ Separator = ' ';
+ StringLength = (ObjDesc->Buffer.Length * 3);
+ break;
+
+ case ACPI_EXPLICIT_CONVERT_HEX: /* Used by ToHexString */
+ /*
+ * From ACPI: "If Data is a buffer, it is converted to a string of
+ * hexadecimal values separated by commas."
+ */
+ StringLength = (ObjDesc->Buffer.Length * 3);
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Create a new string object and string buffer
+ * (-1 because of extra separator included in StringLength from above)
+ */
+ ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE) (StringLength - 1));
+ if (!ReturnDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ NewBuf = ReturnDesc->Buffer.Pointer;
+
+ /*
+ * Convert buffer bytes to hex or decimal values
+ * (separated by commas or spaces)
+ */
+ for (i = 0; i < ObjDesc->Buffer.Length; i++)
+ {
+ NewBuf += AcpiExConvertToAscii (
+ (ACPI_INTEGER) ObjDesc->Buffer.Pointer[i], Base,
+ NewBuf, 1);
+ *NewBuf++ = Separator; /* each separated by a comma or space */
+ }
+
+ /*
+ * Null terminate the string
+ * (overwrites final comma/space from above)
+ */
+ NewBuf--;
+ *NewBuf = 0;
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_TYPE);
+ }
+
+ *ResultDesc = ReturnDesc;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExConvertToTargetType
+ *
+ * PARAMETERS: DestinationType - Current type of the destination
+ * SourceDesc - Source object to be converted.
+ * ResultDesc - Where the converted object is returned
+ * WalkState - Current method state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Implements "implicit conversion" rules for storing an object.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExConvertToTargetType (
+ ACPI_OBJECT_TYPE DestinationType,
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (ExConvertToTargetType);
+
+
+ /* Default behavior */
+
+ *ResultDesc = SourceDesc;
+
+ /*
+ * If required by the target,
+ * perform implicit conversion on the source before we store it.
+ */
+ switch (GET_CURRENT_ARG_TYPE (WalkState->OpInfo->RuntimeArgs))
+ {
+ case ARGI_SIMPLE_TARGET:
+ case ARGI_FIXED_TARGET:
+ case ARGI_INTEGER_REF: /* Handles Increment, Decrement cases */
+
+ switch (DestinationType)
+ {
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+ /*
+ * Named field can always handle conversions
+ */
+ break;
+
+ default:
+ /* No conversion allowed for these types */
+
+ if (DestinationType != ACPI_GET_OBJECT_TYPE (SourceDesc))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Explicit operator, will store (%s) over existing type (%s)\n",
+ AcpiUtGetObjectTypeName (SourceDesc),
+ AcpiUtGetTypeName (DestinationType)));
+ Status = AE_TYPE;
+ }
+ }
+ break;
+
+
+ case ARGI_TARGETREF:
+
+ switch (DestinationType)
+ {
+ case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_BUFFER_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.
+ */
+ Status = AcpiExConvertToInteger (SourceDesc, ResultDesc,
+ 16);
+ break;
+
+
+ case ACPI_TYPE_STRING:
+ /*
+ * The operand must be a String. We can convert an
+ * Integer or Buffer if necessary
+ */
+ Status = AcpiExConvertToString (SourceDesc, ResultDesc,
+ ACPI_IMPLICIT_CONVERT_HEX);
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+ /*
+ * The operand must be a Buffer. We can convert an
+ * Integer or String if necessary
+ */
+ Status = AcpiExConvertToBuffer (SourceDesc, ResultDesc);
+ break;
+
+
+ default:
+ ACPI_ERROR ((AE_INFO, "Bad destination type during conversion: %X",
+ DestinationType));
+ Status = AE_AML_INTERNAL;
+ break;
+ }
+ break;
+
+
+ case ARGI_REFERENCE:
+ /*
+ * CreateXxxxField cases - we are storing the field object into the name
+ */
+ break;
+
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Unknown Target type ID 0x%X AmlOpcode %X DestType %s",
+ GET_CURRENT_ARG_TYPE (WalkState->OpInfo->RuntimeArgs),
+ WalkState->Opcode, AcpiUtGetTypeName (DestinationType)));
+ Status = AE_AML_INTERNAL;
+ }
+
+ /*
+ * Source-to-Target conversion semantics:
+ *
+ * If conversion to the target type cannot be performed, then simply
+ * overwrite the target with the new object and type.
+ */
+ if (Status == AE_TYPE)
+ {
+ Status = AE_OK;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/excreate.c b/sys/contrib/dev/acpica/excreate.c
new file mode 100644
index 0000000..d237dab
--- /dev/null
+++ b/sys/contrib/dev/acpica/excreate.c
@@ -0,0 +1,737 @@
+/******************************************************************************
+ *
+ * Module Name: excreate - Named object creation
+ * $Revision: 1.114 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXCREATE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/actables.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("excreate")
+
+
+#ifndef ACPI_NO_METHOD_EXECUTION
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExCreateAlias
+ *
+ * PARAMETERS: WalkState - Current state, contains operands
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new named alias
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExCreateAlias (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_NAMESPACE_NODE *TargetNode;
+ ACPI_NAMESPACE_NODE *AliasNode;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (ExCreateAlias);
+
+
+ /* Get the source/alias operands (both namespace nodes) */
+
+ AliasNode = (ACPI_NAMESPACE_NODE *) WalkState->Operands[0];
+ TargetNode = (ACPI_NAMESPACE_NODE *) WalkState->Operands[1];
+
+ if ((TargetNode->Type == ACPI_TYPE_LOCAL_ALIAS) ||
+ (TargetNode->Type == ACPI_TYPE_LOCAL_METHOD_ALIAS))
+ {
+ /*
+ * Dereference an existing alias so that we don't create a chain
+ * of aliases. With this code, we guarantee that an alias is
+ * always exactly one level of indirection away from the
+ * actual aliased name.
+ */
+ TargetNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, TargetNode->Object);
+ }
+
+ /*
+ * For objects that can never change (i.e., the NS node will
+ * permanently point to the same object), we can simply attach
+ * the object to the new NS node. For other objects (such as
+ * Integers, buffers, etc.), we have to point the Alias node
+ * to the original Node.
+ */
+ switch (TargetNode->Type)
+ {
+ case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+ case ACPI_TYPE_PACKAGE:
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ /*
+ * The new alias has the type ALIAS and points to the original
+ * NS node, not the object itself. This is because for these
+ * types, the object can change dynamically via a Store.
+ */
+ AliasNode->Type = ACPI_TYPE_LOCAL_ALIAS;
+ AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
+ break;
+
+ case ACPI_TYPE_METHOD:
+
+ /*
+ * The new alias has the type ALIAS and points to the original
+ * NS node, not the object itself. This is because for these
+ * types, the object can change dynamically via a Store.
+ */
+ AliasNode->Type = ACPI_TYPE_LOCAL_METHOD_ALIAS;
+ AliasNode->Object = ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, TargetNode);
+ break;
+
+ default:
+
+ /* Attach the original source object to the new Alias Node */
+
+ /*
+ * The new alias assumes the type of the target, and it points
+ * to the same object. The reference count of the object has an
+ * additional reference to prevent deletion out from under either the
+ * target node or the alias Node
+ */
+ Status = AcpiNsAttachObject (AliasNode,
+ AcpiNsGetAttachedObject (TargetNode), TargetNode->Type);
+ break;
+ }
+
+ /* Since both operands are Nodes, we don't need to delete them */
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExCreateEvent
+ *
+ * PARAMETERS: WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new event object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExCreateEvent (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ACPI_FUNCTION_TRACE (ExCreateEvent);
+
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_EVENT);
+ if (!ObjDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /*
+ * Create the actual OS semaphore, with zero initial units -- meaning
+ * that the event is created in an unsignalled state
+ */
+ Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 0,
+ &ObjDesc->Event.OsSemaphore);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /* Attach object to the Node */
+
+ Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) WalkState->Operands[0],
+ ObjDesc, ACPI_TYPE_EVENT);
+
+Cleanup:
+ /*
+ * Remove local reference to the object (on error, will cause deletion
+ * of both object and semaphore if present.)
+ */
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExCreateMutex
+ *
+ * PARAMETERS: WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new mutex object
+ *
+ * Mutex (Name[0], SyncLevel[1])
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExCreateMutex (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExCreateMutex, ACPI_WALK_OPERANDS);
+
+
+ /* Create the new mutex object */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_MUTEX);
+ if (!ObjDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /* Create the actual OS Mutex */
+
+ Status = AcpiOsCreateMutex (&ObjDesc->Mutex.OsMutex);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /* Init object and attach to NS node */
+
+ ObjDesc->Mutex.SyncLevel = (UINT8) WalkState->Operands[1]->Integer.Value;
+ ObjDesc->Mutex.Node = (ACPI_NAMESPACE_NODE *) WalkState->Operands[0];
+
+ Status = AcpiNsAttachObject (ObjDesc->Mutex.Node, ObjDesc, ACPI_TYPE_MUTEX);
+
+
+Cleanup:
+ /*
+ * Remove local reference to the object (on error, will cause deletion
+ * of both object and semaphore if present.)
+ */
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExCreateRegion
+ *
+ * PARAMETERS: AmlStart - Pointer to the region declaration AML
+ * AmlLength - Max length of the declaration AML
+ * RegionSpace - SpaceID for the region
+ * WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new operation region object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExCreateRegion (
+ UINT8 *AmlStart,
+ UINT32 AmlLength,
+ UINT8 RegionSpace,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_OPERAND_OBJECT *RegionObj2;
+
+
+ ACPI_FUNCTION_TRACE (ExCreateRegion);
+
+
+ /* Get the Namespace Node */
+
+ Node = WalkState->Op->Common.Node;
+
+ /*
+ * If the region object is already attached to this node,
+ * just return
+ */
+ if (AcpiNsGetAttachedObject (Node))
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Space ID must be one of the predefined IDs, or in the user-defined
+ * range
+ */
+ if ((RegionSpace >= ACPI_NUM_PREDEFINED_REGIONS) &&
+ (RegionSpace < ACPI_USER_REGION_BEGIN))
+ {
+ ACPI_ERROR ((AE_INFO, "Invalid AddressSpace type %X", RegionSpace));
+ return_ACPI_STATUS (AE_AML_INVALID_SPACE_ID);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Region Type - %s (%X)\n",
+ AcpiUtGetRegionName (RegionSpace), RegionSpace));
+
+ /* Create the region descriptor */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
+ if (!ObjDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /*
+ * Remember location in AML stream of address & length
+ * operands since they need to be evaluated at run time.
+ */
+ RegionObj2 = ObjDesc->Common.NextObject;
+ RegionObj2->Extra.AmlStart = AmlStart;
+ RegionObj2->Extra.AmlLength = AmlLength;
+
+ /* Init the region from the operands */
+
+ ObjDesc->Region.SpaceId = RegionSpace;
+ ObjDesc->Region.Address = 0;
+ ObjDesc->Region.Length = 0;
+ ObjDesc->Region.Node = Node;
+
+ /* Install the new region object in the parent Node */
+
+ Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_REGION);
+
+
+Cleanup:
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExCreateTableRegion
+ *
+ * PARAMETERS: WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new DataTableRegion object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExCreateTableRegion (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_OPERAND_OBJECT *RegionObj2;
+ ACPI_NATIVE_UINT TableIndex;
+ ACPI_TABLE_HEADER *Table;
+
+
+ ACPI_FUNCTION_TRACE (ExCreateTableRegion);
+
+
+ /* Get the Node from the object stack */
+
+ Node = WalkState->Op->Common.Node;
+
+ /*
+ * If the region object is already attached to this node,
+ * just return
+ */
+ if (AcpiNsGetAttachedObject (Node))
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Find the ACPI table */
+
+ Status = AcpiTbFindTable (Operand[1]->String.Pointer,
+ Operand[2]->String.Pointer, Operand[3]->String.Pointer,
+ &TableIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Create the region descriptor */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_REGION);
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ RegionObj2 = ObjDesc->Common.NextObject;
+ RegionObj2->Extra.RegionContext = NULL;
+
+ Status = AcpiGetTableByIndex (TableIndex, &Table);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Init the region from the operands */
+
+ ObjDesc->Region.SpaceId = REGION_DATA_TABLE;
+ ObjDesc->Region.Address = (ACPI_PHYSICAL_ADDRESS) ACPI_TO_INTEGER (Table);
+ ObjDesc->Region.Length = Table->Length;
+ ObjDesc->Region.Node = Node;
+ ObjDesc->Region.Flags = AOPOBJ_DATA_VALID;
+
+ /* Install the new region object in the parent Node */
+
+ Status = AcpiNsAttachObject (Node, ObjDesc, ACPI_TYPE_REGION);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ Status = AcpiEvInitializeRegion (ObjDesc, FALSE);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_NOT_EXIST)
+ {
+ Status = AE_OK;
+ }
+ else
+ {
+ goto Cleanup;
+ }
+ }
+
+ ObjDesc->Region.Flags |= AOPOBJ_SETUP_COMPLETE;
+
+
+Cleanup:
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExCreateProcessor
+ *
+ * PARAMETERS: WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new processor object and populate the fields
+ *
+ * Processor (Name[0], CpuID[1], PblockAddr[2], PblockLength[3])
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExCreateProcessor (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExCreateProcessor, WalkState);
+
+
+ /* Create the processor object */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_PROCESSOR);
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Initialize the processor object from the operands */
+
+ ObjDesc->Processor.ProcId = (UINT8) Operand[1]->Integer.Value;
+ ObjDesc->Processor.Length = (UINT8) Operand[3]->Integer.Value;
+ ObjDesc->Processor.Address = (ACPI_IO_ADDRESS) Operand[2]->Integer.Value;
+
+ /* Install the processor object in the parent Node */
+
+ Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0],
+ ObjDesc, ACPI_TYPE_PROCESSOR);
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExCreatePowerResource
+ *
+ * PARAMETERS: WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new PowerResource object and populate the fields
+ *
+ * PowerResource (Name[0], SystemLevel[1], ResourceOrder[2])
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExCreatePowerResource (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExCreatePowerResource, WalkState);
+
+
+ /* Create the power resource object */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_POWER);
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Initialize the power object from the operands */
+
+ ObjDesc->PowerResource.SystemLevel = (UINT8) Operand[1]->Integer.Value;
+ ObjDesc->PowerResource.ResourceOrder = (UINT16) Operand[2]->Integer.Value;
+
+ /* Install the power resource object in the parent Node */
+
+ Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0],
+ ObjDesc, ACPI_TYPE_POWER);
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExCreateMethod
+ *
+ * PARAMETERS: AmlStart - First byte of the method's AML
+ * AmlLength - AML byte count for this method
+ * WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new method object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExCreateMethod (
+ UINT8 *AmlStart,
+ UINT32 AmlLength,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+ UINT8 MethodFlags;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExCreateMethod, WalkState);
+
+
+ /* Create a new method object */
+
+ ObjDesc = AcpiUtCreateInternalObject (ACPI_TYPE_METHOD);
+ if (!ObjDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Exit;
+ }
+
+ /* Save the method's AML pointer and length */
+
+ ObjDesc->Method.AmlStart = AmlStart;
+ ObjDesc->Method.AmlLength = AmlLength;
+
+ /*
+ * Disassemble the method flags. Split off the Arg Count
+ * for efficiency
+ */
+ MethodFlags = (UINT8) Operand[1]->Integer.Value;
+
+ ObjDesc->Method.MethodFlags = (UINT8) (MethodFlags & ~AML_METHOD_ARG_COUNT);
+ ObjDesc->Method.ParamCount = (UINT8) (MethodFlags & AML_METHOD_ARG_COUNT);
+
+ /*
+ * Get the SyncLevel. If method is serialized, a mutex will be
+ * created for this method when it is parsed.
+ */
+ if (MethodFlags & AML_METHOD_SERIALIZED)
+ {
+ /*
+ * ACPI 1.0: SyncLevel = 0
+ * ACPI 2.0: SyncLevel = SyncLevel in method declaration
+ */
+ ObjDesc->Method.SyncLevel = (UINT8)
+ ((MethodFlags & AML_METHOD_SYNCH_LEVEL) >> 4);
+ }
+
+ /* Attach the new object to the method Node */
+
+ Status = AcpiNsAttachObject ((ACPI_NAMESPACE_NODE *) Operand[0],
+ ObjDesc, ACPI_TYPE_METHOD);
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+
+Exit:
+ /* Remove a reference to the operand */
+
+ AcpiUtRemoveReference (Operand[1]);
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exdump.c b/sys/contrib/dev/acpica/exdump.c
new file mode 100644
index 0000000..c7d26ae
--- /dev/null
+++ b/sys/contrib/dev/acpica/exdump.c
@@ -0,0 +1,1217 @@
+/******************************************************************************
+ *
+ * Module Name: exdump - Interpreter debug output routines
+ * $Revision: 1.202 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXDUMP_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acparser.h>
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exdump")
+
+/*
+ * The following routines are used for debug output only
+ */
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+
+/* Local prototypes */
+
+static void
+AcpiExOutString (
+ char *Title,
+ char *Value);
+
+static void
+AcpiExOutPointer (
+ char *Title,
+ void *Value);
+
+static void
+AcpiExDumpObject (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_EXDUMP_INFO *Info);
+
+static void
+AcpiExDumpReferenceObj (
+ ACPI_OPERAND_OBJECT *ObjDesc);
+
+static void
+AcpiExDumpPackageObj (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 Level,
+ UINT32 Index);
+
+
+/*******************************************************************************
+ *
+ * Object Descriptor info tables
+ *
+ * Note: The first table entry must be an INIT opcode and must contain
+ * the table length (number of table entries)
+ *
+ ******************************************************************************/
+
+static ACPI_EXDUMP_INFO AcpiExDumpInteger[2] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpInteger), NULL},
+ {ACPI_EXD_UINT64, ACPI_EXD_OFFSET (Integer.Value), "Value"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpString[4] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpString), NULL},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (String.Length), "Length"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (String.Pointer), "Pointer"},
+ {ACPI_EXD_STRING, 0, NULL}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpBuffer[5] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBuffer), NULL},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Buffer.Length), "Length"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Buffer.Pointer), "Pointer"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Buffer.Node), "Parent Node"},
+ {ACPI_EXD_BUFFER, 0, NULL}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpPackage[5] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPackage), NULL},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Package.Flags), "Flags"},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Package.Count), "Elements"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Package.Elements), "Element List"},
+ {ACPI_EXD_PACKAGE, 0, NULL}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpDevice[4] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpDevice), NULL},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.Handler), "Handler"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.SystemNotify), "System Notify"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Device.DeviceNotify), "Device Notify"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpEvent[2] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpEvent), NULL},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Event.OsSemaphore), "OsSemaphore"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpMethod[8] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpMethod), NULL},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.ParamCount), "ParamCount"},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.SyncLevel), "Sync Level"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Method.Mutex), "Mutex"},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.OwnerId), "Owner Id"},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Method.ThreadCount), "Thread Count"},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Method.AmlLength), "Aml Length"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Method.AmlStart), "Aml Start"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpMutex[5] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpMutex), NULL},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Mutex.SyncLevel), "Sync Level"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Mutex.OwnerThread), "Owner Thread"},
+ {ACPI_EXD_UINT16, ACPI_EXD_OFFSET (Mutex.AcquisitionDepth), "Acquire Depth"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Mutex.OsMutex), "OsMutex"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpRegion[7] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpRegion), NULL},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Region.SpaceId), "Space Id"},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Region.Flags), "Flags"},
+ {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET (Region.Address), "Address"},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Region.Length), "Length"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Region.Handler), "Handler"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Region.Next), "Next"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpPower[5] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpPower), NULL},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.SystemLevel), "System Level"},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (PowerResource.ResourceOrder), "Resource Order"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.SystemNotify), "System Notify"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (PowerResource.DeviceNotify), "Device Notify"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpProcessor[7] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpProcessor), NULL},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Processor.ProcId), "Processor ID"},
+ {ACPI_EXD_UINT8 , ACPI_EXD_OFFSET (Processor.Length), "Length"},
+ {ACPI_EXD_ADDRESS, ACPI_EXD_OFFSET (Processor.Address), "Address"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.SystemNotify), "System Notify"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.DeviceNotify), "Device Notify"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Processor.Handler), "Handler"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpThermal[4] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpThermal), NULL},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.SystemNotify), "System Notify"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.DeviceNotify), "Device Notify"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (ThermalZone.Handler), "Handler"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpBufferField[3] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBufferField), NULL},
+ {ACPI_EXD_FIELD, 0, NULL},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BufferField.BufferObj), "Buffer Object"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpRegionField[3] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpRegionField), NULL},
+ {ACPI_EXD_FIELD, 0, NULL},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Field.RegionObj), "Region Object"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpBankField[5] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField), NULL},
+ {ACPI_EXD_FIELD, 0, NULL},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (BankField.Value), "Value"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BankField.RegionObj), "Region Object"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (BankField.BankObj), "Bank Object"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpIndexField[5] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpBankField), NULL},
+ {ACPI_EXD_FIELD, 0, NULL},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (IndexField.Value), "Value"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (IndexField.IndexObj), "Index Object"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (IndexField.DataObj), "Data Object"}
+};
+
+
+static ACPI_EXDUMP_INFO AcpiExDumpReference[7] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpReference), NULL},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Reference.TargetType), "Target Type"},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (Reference.Offset), "Offset"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Object), "Object Desc"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Node), "Node"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Reference.Where), "Where"},
+ {ACPI_EXD_REFERENCE,0, NULL}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpAddressHandler[6] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpAddressHandler), NULL},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (AddressSpace.SpaceId), "Space Id"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Next), "Next"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.RegionList), "Region List"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Node), "Node"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (AddressSpace.Context), "Context"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpNotify[3] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNotify), NULL},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Node), "Node"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (Notify.Context), "Context"}
+};
+
+
+/* Miscellaneous tables */
+
+static ACPI_EXDUMP_INFO AcpiExDumpCommon[4] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpCommon), NULL},
+ {ACPI_EXD_TYPE , 0, NULL},
+ {ACPI_EXD_UINT16, ACPI_EXD_OFFSET (Common.ReferenceCount), "Reference Count"},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (Common.Flags), "Flags"}
+};
+
+
+static ACPI_EXDUMP_INFO AcpiExDumpFieldCommon[7] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpFieldCommon), NULL},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.FieldFlags), "Field Flags"},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.AccessByteWidth), "Access Byte Width"},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (CommonField.BitLength), "Bit Length"},
+ {ACPI_EXD_UINT8, ACPI_EXD_OFFSET (CommonField.StartFieldBitOffset),"Field Bit Offset"},
+ {ACPI_EXD_UINT32, ACPI_EXD_OFFSET (CommonField.BaseByteOffset), "Base Byte Offset"},
+ {ACPI_EXD_POINTER, ACPI_EXD_OFFSET (CommonField.Node), "Parent Node"}
+};
+
+static ACPI_EXDUMP_INFO AcpiExDumpNode[5] =
+{
+ {ACPI_EXD_INIT, ACPI_EXD_TABLE_SIZE (AcpiExDumpNode), NULL},
+ {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET (Flags), "Flags"},
+ {ACPI_EXD_UINT8, ACPI_EXD_NSOFFSET (OwnerId), "Owner Id"},
+ {ACPI_EXD_POINTER, ACPI_EXD_NSOFFSET (Child), "Child List"},
+ {ACPI_EXD_POINTER, ACPI_EXD_NSOFFSET (Peer), "Next Peer"}
+};
+
+
+/* Dispatch table, indexed by object type */
+
+static ACPI_EXDUMP_INFO *AcpiExDumpInfo[] =
+{
+ NULL,
+ AcpiExDumpInteger,
+ AcpiExDumpString,
+ AcpiExDumpBuffer,
+ AcpiExDumpPackage,
+ NULL,
+ AcpiExDumpDevice,
+ AcpiExDumpEvent,
+ AcpiExDumpMethod,
+ AcpiExDumpMutex,
+ AcpiExDumpRegion,
+ AcpiExDumpPower,
+ AcpiExDumpProcessor,
+ AcpiExDumpThermal,
+ AcpiExDumpBufferField,
+ NULL,
+ NULL,
+ AcpiExDumpRegionField,
+ AcpiExDumpBankField,
+ AcpiExDumpIndexField,
+ AcpiExDumpReference,
+ NULL,
+ NULL,
+ AcpiExDumpNotify,
+ AcpiExDumpAddressHandler,
+ NULL,
+ NULL,
+ NULL
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDumpObject
+ *
+ * PARAMETERS: ObjDesc - Descriptor to dump
+ * Info - Info table corresponding to this object
+ * type
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Walk the info table for this object
+ *
+ ******************************************************************************/
+
+static void
+AcpiExDumpObject (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_EXDUMP_INFO *Info)
+{
+ UINT8 *Target;
+ char *Name;
+ UINT8 Count;
+
+
+ if (!Info)
+ {
+ AcpiOsPrintf (
+ "ExDumpObject: Display not implemented for object type %s\n",
+ AcpiUtGetObjectTypeName (ObjDesc));
+ return;
+ }
+
+ /* First table entry must contain the table length (# of table entries) */
+
+ Count = Info->Offset;
+
+ while (Count)
+ {
+ Target = ACPI_ADD_PTR (UINT8, ObjDesc, Info->Offset);
+ Name = Info->Name;
+
+ switch (Info->Opcode)
+ {
+ case ACPI_EXD_INIT:
+ break;
+
+ case ACPI_EXD_TYPE:
+ AcpiExOutString ("Type", AcpiUtGetObjectTypeName (ObjDesc));
+ break;
+
+ case ACPI_EXD_UINT8:
+
+ AcpiOsPrintf ("%20s : %2.2X\n", Name, *Target);
+ break;
+
+ case ACPI_EXD_UINT16:
+
+ AcpiOsPrintf ("%20s : %4.4X\n", Name, ACPI_GET16 (Target));
+ break;
+
+ case ACPI_EXD_UINT32:
+
+ AcpiOsPrintf ("%20s : %8.8X\n", Name, ACPI_GET32 (Target));
+ break;
+
+ case ACPI_EXD_UINT64:
+
+ AcpiOsPrintf ("%20s : %8.8X%8.8X\n", "Value",
+ ACPI_FORMAT_UINT64 (ACPI_GET64 (Target)));
+ break;
+
+ case ACPI_EXD_POINTER:
+ case ACPI_EXD_ADDRESS:
+
+ AcpiExOutPointer (Name, *ACPI_CAST_PTR (void *, Target));
+ break;
+
+ case ACPI_EXD_STRING:
+
+ AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
+ AcpiOsPrintf ("\n");
+ break;
+
+ case ACPI_EXD_BUFFER:
+
+ ACPI_DUMP_BUFFER (ObjDesc->Buffer.Pointer, ObjDesc->Buffer.Length);
+ break;
+
+ case ACPI_EXD_PACKAGE:
+
+ /* Dump the package contents */
+
+ AcpiOsPrintf ("\nPackage Contents:\n");
+ AcpiExDumpPackageObj (ObjDesc, 0, 0);
+ break;
+
+ case ACPI_EXD_FIELD:
+
+ AcpiExDumpObject (ObjDesc, AcpiExDumpFieldCommon);
+ break;
+
+ case ACPI_EXD_REFERENCE:
+
+ AcpiExOutString ("Opcode",
+ (AcpiPsGetOpcodeInfo (ObjDesc->Reference.Opcode))->Name);
+ AcpiExDumpReferenceObj (ObjDesc);
+ break;
+
+ default:
+ AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n", Info->Opcode);
+ return;
+ }
+
+ Info++;
+ Count--;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDumpOperand
+ *
+ * PARAMETERS: *ObjDesc - Pointer to entry to be dumped
+ * Depth - Current nesting depth
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump an operand object
+ *
+ ******************************************************************************/
+
+void
+AcpiExDumpOperand (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 Depth)
+{
+ UINT32 Length;
+ UINT32 Index;
+
+
+ ACPI_FUNCTION_NAME (ExDumpOperand)
+
+
+ if (!((ACPI_LV_EXEC & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer)))
+ {
+ return;
+ }
+
+ if (!ObjDesc)
+ {
+ /* This could be a null element of a package */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Null Object Descriptor\n"));
+ return;
+ }
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p Namespace Node: ", ObjDesc));
+ ACPI_DUMP_ENTRY (ObjDesc, ACPI_LV_EXEC);
+ return;
+ }
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "%p is not a node or operand object: [%s]\n",
+ ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
+ ACPI_DUMP_BUFFER (ObjDesc, sizeof (ACPI_OPERAND_OBJECT));
+ return;
+ }
+
+ /* ObjDesc is a valid object */
+
+ if (Depth > 0)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%*s[%u] %p ",
+ Depth, " ", Depth, ObjDesc));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%p ", ObjDesc));
+ }
+
+ /* Decode object type */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ switch (ObjDesc->Reference.Opcode)
+ {
+ case AML_DEBUG_OP:
+
+ AcpiOsPrintf ("Reference: Debug\n");
+ break;
+
+
+ case AML_INDEX_OP:
+
+ AcpiOsPrintf ("Reference: Index %p\n",
+ ObjDesc->Reference.Object);
+ break;
+
+
+ case AML_REF_OF_OP:
+
+ AcpiOsPrintf ("Reference: (RefOf) %p\n",
+ ObjDesc->Reference.Object);
+ break;
+
+
+ case AML_ARG_OP:
+
+ AcpiOsPrintf ("Reference: Arg%d",
+ ObjDesc->Reference.Offset);
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
+ {
+ /* Value is an Integer */
+
+ AcpiOsPrintf (" value is [%8.8X%8.8x]",
+ ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
+ }
+
+ AcpiOsPrintf ("\n");
+ break;
+
+
+ case AML_LOCAL_OP:
+
+ AcpiOsPrintf ("Reference: Local%d",
+ ObjDesc->Reference.Offset);
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
+ {
+
+ /* Value is an Integer */
+
+ AcpiOsPrintf (" value is [%8.8X%8.8x]",
+ ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
+ }
+
+ AcpiOsPrintf ("\n");
+ break;
+
+
+ case AML_INT_NAMEPATH_OP:
+
+ AcpiOsPrintf ("Reference.Node->Name %X\n",
+ ObjDesc->Reference.Node->Name.Integer);
+ break;
+
+
+ default:
+
+ /* Unknown opcode */
+
+ AcpiOsPrintf ("Unknown Reference opcode=%X\n",
+ ObjDesc->Reference.Opcode);
+ break;
+
+ }
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ AcpiOsPrintf ("Buffer len %X @ %p\n",
+ ObjDesc->Buffer.Length, ObjDesc->Buffer.Pointer);
+
+ Length = ObjDesc->Buffer.Length;
+ if (Length > 64)
+ {
+ Length = 64;
+ }
+
+ /* Debug only -- dump the buffer contents */
+
+ if (ObjDesc->Buffer.Pointer)
+ {
+ AcpiOsPrintf ("Buffer Contents: ");
+
+ for (Index = 0; Index < Length; Index++)
+ {
+ AcpiOsPrintf (" %02x", ObjDesc->Buffer.Pointer[Index]);
+ }
+ AcpiOsPrintf ("\n");
+ }
+ break;
+
+
+ case ACPI_TYPE_INTEGER:
+
+ AcpiOsPrintf ("Integer %8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ AcpiOsPrintf ("Package [Len %X] ElementArray %p\n",
+ ObjDesc->Package.Count, ObjDesc->Package.Elements);
+
+ /*
+ * If elements exist, package element pointer is valid,
+ * and debug_level exceeds 1, dump package's elements.
+ */
+ if (ObjDesc->Package.Count &&
+ ObjDesc->Package.Elements &&
+ AcpiDbgLevel > 1)
+ {
+ for (Index = 0; Index < ObjDesc->Package.Count; Index++)
+ {
+ AcpiExDumpOperand (ObjDesc->Package.Elements[Index], Depth+1);
+ }
+ }
+ break;
+
+
+ case ACPI_TYPE_REGION:
+
+ AcpiOsPrintf ("Region %s (%X)",
+ AcpiUtGetRegionName (ObjDesc->Region.SpaceId),
+ ObjDesc->Region.SpaceId);
+
+ /*
+ * If the address and length have not been evaluated,
+ * don't print them.
+ */
+ if (!(ObjDesc->Region.Flags & AOPOBJ_DATA_VALID))
+ {
+ AcpiOsPrintf ("\n");
+ }
+ else
+ {
+ AcpiOsPrintf (" base %8.8X%8.8X Length %X\n",
+ ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
+ ObjDesc->Region.Length);
+ }
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ AcpiOsPrintf ("String length %X @ %p ",
+ ObjDesc->String.Length,
+ ObjDesc->String.Pointer);
+
+ AcpiUtPrintString (ObjDesc->String.Pointer, ACPI_UINT8_MAX);
+ AcpiOsPrintf ("\n");
+ break;
+
+
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+
+ AcpiOsPrintf ("BankField\n");
+ break;
+
+
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+
+ AcpiOsPrintf (
+ "RegionField: Bits=%X AccWidth=%X Lock=%X Update=%X at byte=%X bit=%X of below:\n",
+ ObjDesc->Field.BitLength,
+ ObjDesc->Field.AccessByteWidth,
+ ObjDesc->Field.FieldFlags & AML_FIELD_LOCK_RULE_MASK,
+ ObjDesc->Field.FieldFlags & AML_FIELD_UPDATE_RULE_MASK,
+ ObjDesc->Field.BaseByteOffset,
+ ObjDesc->Field.StartFieldBitOffset);
+
+ AcpiExDumpOperand (ObjDesc->Field.RegionObj, Depth+1);
+ break;
+
+
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
+
+ AcpiOsPrintf ("IndexField\n");
+ break;
+
+
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ AcpiOsPrintf (
+ "BufferField: %X bits at byte %X bit %X of\n",
+ ObjDesc->BufferField.BitLength,
+ ObjDesc->BufferField.BaseByteOffset,
+ ObjDesc->BufferField.StartFieldBitOffset);
+
+ if (!ObjDesc->BufferField.BufferObj)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "*NULL*\n"));
+ }
+ else if (ACPI_GET_OBJECT_TYPE (ObjDesc->BufferField.BufferObj) !=
+ ACPI_TYPE_BUFFER)
+ {
+ AcpiOsPrintf ("*not a Buffer*\n");
+ }
+ else
+ {
+ AcpiExDumpOperand (ObjDesc->BufferField.BufferObj, Depth+1);
+ }
+ break;
+
+
+ case ACPI_TYPE_EVENT:
+
+ AcpiOsPrintf ("Event\n");
+ break;
+
+
+ case ACPI_TYPE_METHOD:
+
+ AcpiOsPrintf ("Method(%X) @ %p:%X\n",
+ ObjDesc->Method.ParamCount,
+ ObjDesc->Method.AmlStart,
+ ObjDesc->Method.AmlLength);
+ break;
+
+
+ case ACPI_TYPE_MUTEX:
+
+ AcpiOsPrintf ("Mutex\n");
+ break;
+
+
+ case ACPI_TYPE_DEVICE:
+
+ AcpiOsPrintf ("Device\n");
+ break;
+
+
+ case ACPI_TYPE_POWER:
+
+ AcpiOsPrintf ("Power\n");
+ break;
+
+
+ case ACPI_TYPE_PROCESSOR:
+
+ AcpiOsPrintf ("Processor\n");
+ break;
+
+
+ case ACPI_TYPE_THERMAL:
+
+ AcpiOsPrintf ("Thermal\n");
+ break;
+
+
+ default:
+ /* Unknown Type */
+
+ AcpiOsPrintf ("Unknown Type %X\n", ACPI_GET_OBJECT_TYPE (ObjDesc));
+ break;
+ }
+
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDumpOperands
+ *
+ * PARAMETERS: Operands - Operand list
+ * InterpreterMode - Load or Exec
+ * Ident - Identification
+ * NumLevels - # of stack entries to dump above line
+ * Note - Output notation
+ * ModuleName - Caller's module name
+ * LineNumber - Caller's invocation line number
+ *
+ * DESCRIPTION: Dump the object stack
+ *
+ ******************************************************************************/
+
+void
+AcpiExDumpOperands (
+ ACPI_OPERAND_OBJECT **Operands,
+ ACPI_INTERPRETER_MODE InterpreterMode,
+ char *Ident,
+ UINT32 NumLevels,
+ char *Note,
+ char *ModuleName,
+ UINT32 LineNumber)
+{
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_NAME (ExDumpOperands);
+
+
+ if (!Ident)
+ {
+ Ident = "?";
+ }
+
+ if (!Note)
+ {
+ Note = "?";
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "************* Operand Stack Contents (Opcode [%s], %d Operands)\n",
+ Ident, NumLevels));
+
+ if (NumLevels == 0)
+ {
+ NumLevels = 1;
+ }
+
+ /* Dump the operand stack starting at the top */
+
+ for (i = 0; NumLevels > 0; i--, NumLevels--)
+ {
+ AcpiExDumpOperand (Operands[i], 0);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "************* Operand Stack dump from %s(%d), %s\n",
+ ModuleName, LineNumber, Note));
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOut* functions
+ *
+ * PARAMETERS: Title - Descriptive text
+ * Value - Value to be displayed
+ *
+ * DESCRIPTION: Object dump output formatting functions. These functions
+ * reduce the number of format strings required and keeps them
+ * all in one place for easy modification.
+ *
+ ******************************************************************************/
+
+static void
+AcpiExOutString (
+ char *Title,
+ char *Value)
+{
+ AcpiOsPrintf ("%20s : %s\n", Title, Value);
+}
+
+static void
+AcpiExOutPointer (
+ char *Title,
+ void *Value)
+{
+ AcpiOsPrintf ("%20s : %p\n", Title, Value);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDumpNamespaceNode
+ *
+ * PARAMETERS: Node - Descriptor to dump
+ * Flags - Force display if TRUE
+ *
+ * DESCRIPTION: Dumps the members of the given.Node
+ *
+ ******************************************************************************/
+
+void
+AcpiExDumpNamespaceNode (
+ ACPI_NAMESPACE_NODE *Node,
+ UINT32 Flags)
+{
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!Flags)
+ {
+ if (!((ACPI_LV_OBJECTS & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer)))
+ {
+ return;
+ }
+ }
+
+ AcpiOsPrintf ("%20s : %4.4s\n", "Name", AcpiUtGetNodeName (Node));
+ AcpiExOutString ("Type", AcpiUtGetTypeName (Node->Type));
+ AcpiExOutPointer ("Attached Object", AcpiNsGetAttachedObject (Node));
+ AcpiExOutPointer ("Parent", AcpiNsGetParentNode (Node));
+
+ AcpiExDumpObject (ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Node),
+ AcpiExDumpNode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDumpReferenceObj
+ *
+ * PARAMETERS: Object - Descriptor to dump
+ *
+ * DESCRIPTION: Dumps a reference object
+ *
+ ******************************************************************************/
+
+static void
+AcpiExDumpReferenceObj (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_BUFFER RetBuf;
+ ACPI_STATUS Status;
+
+
+ RetBuf.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+
+ if (ObjDesc->Reference.Opcode == AML_INT_NAMEPATH_OP)
+ {
+ AcpiOsPrintf ("Named Object %p ", ObjDesc->Reference.Node);
+
+ Status = AcpiNsHandleToPathname (ObjDesc->Reference.Node, &RetBuf);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("Could not convert name to pathname\n");
+ }
+ else
+ {
+ AcpiOsPrintf ("%s\n", (char *) RetBuf.Pointer);
+ ACPI_FREE (RetBuf.Pointer);
+ }
+ }
+ else if (ObjDesc->Reference.Object)
+ {
+ AcpiOsPrintf ("\nReferenced Object: %p\n", ObjDesc->Reference.Object);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDumpPackageObj
+ *
+ * PARAMETERS: ObjDesc - Descriptor to dump
+ * Level - Indentation Level
+ * Index - Package index for this object
+ *
+ * DESCRIPTION: Dumps the elements of the package
+ *
+ ******************************************************************************/
+
+static void
+AcpiExDumpPackageObj (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 Level,
+ UINT32 Index)
+{
+ UINT32 i;
+
+
+ /* Indentation and index output */
+
+ if (Level > 0)
+ {
+ for (i = 0; i < Level; i++)
+ {
+ AcpiOsPrintf (" ");
+ }
+
+ AcpiOsPrintf ("[%.2d] ", Index);
+ }
+
+ AcpiOsPrintf ("%p ", ObjDesc);
+
+ /* Null package elements are allowed */
+
+ if (!ObjDesc)
+ {
+ AcpiOsPrintf ("[Null Object]\n");
+ return;
+ }
+
+ /* Packages may only contain a few object types */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+
+ AcpiOsPrintf ("[Integer] = %8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ AcpiOsPrintf ("[String] Value: ");
+ for (i = 0; i < ObjDesc->String.Length; i++)
+ {
+ AcpiOsPrintf ("%c", ObjDesc->String.Pointer[i]);
+ }
+ AcpiOsPrintf ("\n");
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ AcpiOsPrintf ("[Buffer] Length %.2X = ", ObjDesc->Buffer.Length);
+ if (ObjDesc->Buffer.Length)
+ {
+ AcpiUtDumpBuffer (ACPI_CAST_PTR (UINT8, ObjDesc->Buffer.Pointer),
+ ObjDesc->Buffer.Length, DB_DWORD_DISPLAY, _COMPONENT);
+ }
+ else
+ {
+ AcpiOsPrintf ("\n");
+ }
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ AcpiOsPrintf ("[Package] Contains %d Elements:\n",
+ ObjDesc->Package.Count);
+
+ for (i = 0; i < ObjDesc->Package.Count; i++)
+ {
+ AcpiExDumpPackageObj (ObjDesc->Package.Elements[i], Level+1, i);
+ }
+ break;
+
+
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ AcpiOsPrintf ("[Object Reference] ");
+ AcpiExDumpReferenceObj (ObjDesc);
+ break;
+
+
+ default:
+
+ AcpiOsPrintf ("[Unknown Type] %X\n", ACPI_GET_OBJECT_TYPE (ObjDesc));
+ break;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDumpObjectDescriptor
+ *
+ * PARAMETERS: ObjDesc - Descriptor to dump
+ * Flags - Force display if TRUE
+ *
+ * DESCRIPTION: Dumps the members of the object descriptor given.
+ *
+ ******************************************************************************/
+
+void
+AcpiExDumpObjectDescriptor (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 Flags)
+{
+ ACPI_FUNCTION_TRACE (ExDumpObjectDescriptor);
+
+
+ if (!ObjDesc)
+ {
+ return_VOID;
+ }
+
+ if (!Flags)
+ {
+ if (!((ACPI_LV_OBJECTS & AcpiDbgLevel) && (_COMPONENT & AcpiDbgLayer)))
+ {
+ return_VOID;
+ }
+ }
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
+ {
+ AcpiExDumpNamespaceNode ((ACPI_NAMESPACE_NODE *) ObjDesc, Flags);
+
+ AcpiOsPrintf ("\nAttached Object (%p):\n",
+ ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object);
+
+ AcpiExDumpObjectDescriptor (
+ ((ACPI_NAMESPACE_NODE *) ObjDesc)->Object, Flags);
+ return_VOID;
+ }
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
+ {
+ AcpiOsPrintf (
+ "ExDumpObjectDescriptor: %p is not an ACPI operand object: [%s]\n",
+ ObjDesc, AcpiUtGetDescriptorName (ObjDesc));
+ return_VOID;
+ }
+
+ if (ObjDesc->Common.Type > ACPI_TYPE_NS_NODE_MAX)
+ {
+ return_VOID;
+ }
+
+ /* Common Fields */
+
+ AcpiExDumpObject (ObjDesc, AcpiExDumpCommon);
+
+ /* Object-specific fields */
+
+ AcpiExDumpObject (ObjDesc, AcpiExDumpInfo[ObjDesc->Common.Type]);
+ return_VOID;
+}
+
+#endif
+
diff --git a/sys/contrib/dev/acpica/exfield.c b/sys/contrib/dev/acpica/exfield.c
new file mode 100644
index 0000000..c4cbf23
--- /dev/null
+++ b/sys/contrib/dev/acpica/exfield.c
@@ -0,0 +1,475 @@
+/******************************************************************************
+ *
+ * Module Name: exfield - ACPI AML (p-code) execution - field manipulation
+ * $Revision: 1.131 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __EXFIELD_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exfield")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExReadDataFromField
+ *
+ * PARAMETERS: WalkState - Current execution state
+ * ObjDesc - The named field
+ * RetBufferDesc - Where the return data object is stored
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Read from a named field. Returns either an Integer or a
+ * Buffer, depending on the size of the field.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExReadDataFromField (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **RetBufferDesc)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *BufferDesc;
+ ACPI_SIZE Length;
+ void *Buffer;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExReadDataFromField, ObjDesc);
+
+
+ /* Parameter validation */
+
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_AML_NO_OPERAND);
+ }
+ if (!RetBufferDesc)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_BUFFER_FIELD)
+ {
+ /*
+ * If the BufferField arguments have not been previously evaluated,
+ * evaluate them now and save the results.
+ */
+ if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID))
+ {
+ Status = AcpiDsGetBufferFieldArguments (ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ }
+ else if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_REGION_FIELD) &&
+ (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS))
+ {
+ /*
+ * This is an SMBus read. We must create a buffer to hold the data
+ * and directly access the region handler.
+ */
+ BufferDesc = AcpiUtCreateBufferObject (ACPI_SMBUS_BUFFER_SIZE);
+ if (!BufferDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Lock entire transaction if requested */
+
+ AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
+
+ /*
+ * Perform the read.
+ * Note: Smbus protocol value is passed in upper 16-bits of Function
+ */
+ Status = AcpiExAccessRegion (ObjDesc, 0,
+ ACPI_CAST_PTR (ACPI_INTEGER, BufferDesc->Buffer.Pointer),
+ ACPI_READ | (ObjDesc->Field.Attribute << 16));
+ AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
+ goto Exit;
+ }
+
+ /*
+ * Allocate a buffer for the contents of the field.
+ *
+ * If the field is larger than the size of an ACPI_INTEGER, create
+ * a BUFFER to hold it. Otherwise, use an INTEGER. This allows
+ * the use of arithmetic operators on the returned value if the
+ * field size is equal or smaller than an Integer.
+ *
+ * Note: Field.length is in bits.
+ */
+ Length = (ACPI_SIZE) ACPI_ROUND_BITS_UP_TO_BYTES (ObjDesc->Field.BitLength);
+ if (Length > AcpiGbl_IntegerByteWidth)
+ {
+ /* Field is too large for an Integer, create a Buffer instead */
+
+ BufferDesc = AcpiUtCreateBufferObject (Length);
+ if (!BufferDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+ Buffer = BufferDesc->Buffer.Pointer;
+ }
+ else
+ {
+ /* Field will fit within an Integer (normal case) */
+
+ BufferDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!BufferDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Length = AcpiGbl_IntegerByteWidth;
+ BufferDesc->Integer.Value = 0;
+ Buffer = &BufferDesc->Integer.Value;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "FieldRead [TO]: Obj %p, Type %X, Buf %p, ByteLen %X\n",
+ ObjDesc, ACPI_GET_OBJECT_TYPE (ObjDesc), Buffer, (UINT32) Length));
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "FieldRead [FROM]: BitLen %X, BitOff %X, ByteOff %X\n",
+ ObjDesc->CommonField.BitLength,
+ ObjDesc->CommonField.StartFieldBitOffset,
+ ObjDesc->CommonField.BaseByteOffset));
+
+ /* Lock entire transaction if requested */
+
+ AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
+
+ /* Read from the field */
+
+ Status = AcpiExExtractFromField (ObjDesc, Buffer, (UINT32) Length);
+ AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
+
+
+Exit:
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (BufferDesc);
+ }
+ else
+ {
+ *RetBufferDesc = BufferDesc;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExWriteDataToField
+ *
+ * PARAMETERS: SourceDesc - Contains data to write
+ * ObjDesc - The named field
+ * ResultDesc - Where the return value is returned, if any
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Write to a named field
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExWriteDataToField (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ResultDesc)
+{
+ ACPI_STATUS Status;
+ UINT32 Length;
+ UINT32 RequiredLength;
+ void *Buffer;
+ void *NewBuffer;
+ ACPI_OPERAND_OBJECT *BufferDesc;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExWriteDataToField, ObjDesc);
+
+
+ /* Parameter validation */
+
+ if (!SourceDesc || !ObjDesc)
+ {
+ return_ACPI_STATUS (AE_AML_NO_OPERAND);
+ }
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_BUFFER_FIELD)
+ {
+ /*
+ * If the BufferField arguments have not been previously evaluated,
+ * evaluate them now and save the results.
+ */
+ if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID))
+ {
+ Status = AcpiDsGetBufferFieldArguments (ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ }
+ else if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_REGION_FIELD) &&
+ (ObjDesc->Field.RegionObj->Region.SpaceId == ACPI_ADR_SPACE_SMBUS))
+ {
+ /*
+ * This is an SMBus write. We will bypass the entire field mechanism
+ * and handoff the buffer directly to the handler.
+ *
+ * Source must be a buffer of sufficient size (ACPI_SMBUS_BUFFER_SIZE).
+ */
+ if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_BUFFER)
+ {
+ ACPI_ERROR ((AE_INFO, "SMBus write requires Buffer, found type %s",
+ AcpiUtGetObjectTypeName (SourceDesc)));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ if (SourceDesc->Buffer.Length < ACPI_SMBUS_BUFFER_SIZE)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "SMBus write requires Buffer of length %X, found length %X",
+ ACPI_SMBUS_BUFFER_SIZE, SourceDesc->Buffer.Length));
+
+ return_ACPI_STATUS (AE_AML_BUFFER_LIMIT);
+ }
+
+ BufferDesc = AcpiUtCreateBufferObject (ACPI_SMBUS_BUFFER_SIZE);
+ if (!BufferDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Buffer = BufferDesc->Buffer.Pointer;
+ ACPI_MEMCPY (Buffer, SourceDesc->Buffer.Pointer,
+ ACPI_SMBUS_BUFFER_SIZE);
+
+ /* Lock entire transaction if requested */
+
+ AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
+
+ /*
+ * Perform the write (returns status and perhaps data in the
+ * same buffer)
+ * Note: SMBus protocol type is passed in upper 16-bits of Function.
+ */
+ Status = AcpiExAccessRegion (ObjDesc, 0,
+ (ACPI_INTEGER *) Buffer,
+ ACPI_WRITE | (ObjDesc->Field.Attribute << 16));
+ AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
+
+ *ResultDesc = BufferDesc;
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Get a pointer to the data to be written */
+
+ switch (ACPI_GET_OBJECT_TYPE (SourceDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+ Buffer = &SourceDesc->Integer.Value;
+ Length = sizeof (SourceDesc->Integer.Value);
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ Buffer = SourceDesc->Buffer.Pointer;
+ Length = SourceDesc->Buffer.Length;
+ break;
+
+ case ACPI_TYPE_STRING:
+ Buffer = SourceDesc->String.Pointer;
+ Length = SourceDesc->String.Length;
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /*
+ * We must have a buffer that is at least as long as the field
+ * we are writing to. This is because individual fields are
+ * indivisible and partial writes are not supported -- as per
+ * the ACPI specification.
+ */
+ NewBuffer = NULL;
+ RequiredLength = ACPI_ROUND_BITS_UP_TO_BYTES (
+ ObjDesc->CommonField.BitLength);
+
+ if (Length < RequiredLength)
+ {
+ /* We need to create a new buffer */
+
+ NewBuffer = ACPI_ALLOCATE_ZEROED (RequiredLength);
+ if (!NewBuffer)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /*
+ * Copy the original data to the new buffer, starting
+ * at Byte zero. All unused (upper) bytes of the
+ * buffer will be 0.
+ */
+ ACPI_MEMCPY ((char *) NewBuffer, (char *) Buffer, Length);
+ Buffer = NewBuffer;
+ Length = RequiredLength;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "FieldWrite [FROM]: Obj %p (%s:%X), Buf %p, ByteLen %X\n",
+ SourceDesc, AcpiUtGetTypeName (ACPI_GET_OBJECT_TYPE (SourceDesc)),
+ ACPI_GET_OBJECT_TYPE (SourceDesc), Buffer, Length));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "FieldWrite [TO]: Obj %p (%s:%X), BitLen %X, BitOff %X, ByteOff %X\n",
+ ObjDesc, AcpiUtGetTypeName (ACPI_GET_OBJECT_TYPE (ObjDesc)),
+ ACPI_GET_OBJECT_TYPE (ObjDesc),
+ ObjDesc->CommonField.BitLength,
+ ObjDesc->CommonField.StartFieldBitOffset,
+ ObjDesc->CommonField.BaseByteOffset));
+
+ /* Lock entire transaction if requested */
+
+ AcpiExAcquireGlobalLock (ObjDesc->CommonField.FieldFlags);
+
+ /* Write to the field */
+
+ Status = AcpiExInsertIntoField (ObjDesc, Buffer, Length);
+ AcpiExReleaseGlobalLock (ObjDesc->CommonField.FieldFlags);
+
+ /* Free temporary buffer if we used one */
+
+ if (NewBuffer)
+ {
+ ACPI_FREE (NewBuffer);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exfldio.c b/sys/contrib/dev/acpica/exfldio.c
new file mode 100644
index 0000000..1a8631b
--- /dev/null
+++ b/sys/contrib/dev/acpica/exfldio.c
@@ -0,0 +1,1056 @@
+/******************************************************************************
+ *
+ * Module Name: exfldio - Aml Field I/O
+ * $Revision: 1.128 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __EXFLDIO_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/acdispat.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exfldio")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiExFieldDatumIo (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 FieldDatumByteOffset,
+ ACPI_INTEGER *Value,
+ UINT32 ReadWrite);
+
+static BOOLEAN
+AcpiExRegisterOverflow (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_INTEGER Value);
+
+static ACPI_STATUS
+AcpiExSetupRegion (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 FieldDatumByteOffset);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExSetupRegion
+ *
+ * PARAMETERS: ObjDesc - Field to be read or written
+ * FieldDatumByteOffset - Byte offset of this datum within the
+ * parent field
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Common processing for AcpiExExtractFromField and
+ * AcpiExInsertIntoField. Initialize the Region if necessary and
+ * validate the request.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiExSetupRegion (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 FieldDatumByteOffset)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *RgnDesc;
+
+
+ ACPI_FUNCTION_TRACE_U32 (ExSetupRegion, FieldDatumByteOffset);
+
+
+ RgnDesc = ObjDesc->CommonField.RegionObj;
+
+ /* We must have a valid region */
+
+ if (ACPI_GET_OBJECT_TYPE (RgnDesc) != ACPI_TYPE_REGION)
+ {
+ ACPI_ERROR ((AE_INFO, "Needed Region, found type %X (%s)",
+ ACPI_GET_OBJECT_TYPE (RgnDesc),
+ AcpiUtGetObjectTypeName (RgnDesc)));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /*
+ * If the Region Address and Length have not been previously evaluated,
+ * evaluate them now and save the results.
+ */
+ if (!(RgnDesc->Common.Flags & AOPOBJ_DATA_VALID))
+ {
+ Status = AcpiDsGetRegionArguments (RgnDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Exit if Address/Length have been disallowed by the host OS */
+
+ if (RgnDesc->Common.Flags & AOPOBJ_INVALID)
+ {
+ return_ACPI_STATUS (AE_AML_ILLEGAL_ADDRESS);
+ }
+
+ /*
+ * Exit now for SMBus address space, it has a non-linear address space
+ * and the request cannot be directly validated
+ */
+ if (RgnDesc->Region.SpaceId == ACPI_ADR_SPACE_SMBUS)
+ {
+ /* SMBus has a non-linear address space */
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+#ifdef ACPI_UNDER_DEVELOPMENT
+ /*
+ * If the Field access is AnyAcc, we can now compute the optimal
+ * access (because we know know the length of the parent region)
+ */
+ if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID))
+ {
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+#endif
+
+ /*
+ * Validate the request. The entire request from the byte offset for a
+ * length of one field datum (access width) must fit within the region.
+ * (Region length is specified in bytes)
+ */
+ if (RgnDesc->Region.Length <
+ (ObjDesc->CommonField.BaseByteOffset +
+ FieldDatumByteOffset +
+ ObjDesc->CommonField.AccessByteWidth))
+ {
+ if (AcpiGbl_EnableInterpreterSlack)
+ {
+ /*
+ * Slack mode only: We will go ahead and allow access to this
+ * field if it is within the region length rounded up to the next
+ * access width boundary.
+ */
+ if (ACPI_ROUND_UP (RgnDesc->Region.Length,
+ ObjDesc->CommonField.AccessByteWidth) >=
+ (ObjDesc->CommonField.BaseByteOffset +
+ (ACPI_NATIVE_UINT) ObjDesc->CommonField.AccessByteWidth +
+ FieldDatumByteOffset))
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+ }
+
+ if (RgnDesc->Region.Length < ObjDesc->CommonField.AccessByteWidth)
+ {
+ /*
+ * This is the case where the AccessType (AccWord, etc.) is wider
+ * than the region itself. For example, a region of length one
+ * byte, and a field with Dword access specified.
+ */
+ ACPI_ERROR ((AE_INFO,
+ "Field [%4.4s] access width (%d bytes) too large for region [%4.4s] (length %X)",
+ AcpiUtGetNodeName (ObjDesc->CommonField.Node),
+ ObjDesc->CommonField.AccessByteWidth,
+ AcpiUtGetNodeName (RgnDesc->Region.Node),
+ RgnDesc->Region.Length));
+ }
+
+ /*
+ * Offset rounded up to next multiple of field width
+ * exceeds region length, indicate an error
+ */
+ ACPI_ERROR ((AE_INFO,
+ "Field [%4.4s] Base+Offset+Width %X+%X+%X is beyond end of region [%4.4s] (length %X)",
+ AcpiUtGetNodeName (ObjDesc->CommonField.Node),
+ ObjDesc->CommonField.BaseByteOffset,
+ FieldDatumByteOffset, ObjDesc->CommonField.AccessByteWidth,
+ AcpiUtGetNodeName (RgnDesc->Region.Node),
+ RgnDesc->Region.Length));
+
+ return_ACPI_STATUS (AE_AML_REGION_LIMIT);
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExAccessRegion
+ *
+ * PARAMETERS: ObjDesc - Field to be read
+ * FieldDatumByteOffset - Byte offset of this datum within the
+ * parent field
+ * Value - Where to store value (must at least
+ * the size of ACPI_INTEGER)
+ * Function - Read or Write flag plus other region-
+ * dependent flags
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Read or Write a single field datum to an Operation Region.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExAccessRegion (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 FieldDatumByteOffset,
+ ACPI_INTEGER *Value,
+ UINT32 Function)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *RgnDesc;
+ ACPI_PHYSICAL_ADDRESS Address;
+
+
+ ACPI_FUNCTION_TRACE (ExAccessRegion);
+
+
+ /*
+ * Ensure that the region operands are fully evaluated and verify
+ * the validity of the request
+ */
+ Status = AcpiExSetupRegion (ObjDesc, FieldDatumByteOffset);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * The physical address of this field datum is:
+ *
+ * 1) The base of the region, plus
+ * 2) The base offset of the field, plus
+ * 3) The current offset into the field
+ */
+ RgnDesc = ObjDesc->CommonField.RegionObj;
+ Address = RgnDesc->Region.Address +
+ ObjDesc->CommonField.BaseByteOffset +
+ FieldDatumByteOffset;
+
+ if ((Function & ACPI_IO_MASK) == ACPI_READ)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "[READ]"));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "[WRITE]"));
+ }
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_BFIELD,
+ " Region [%s:%X], Width %X, ByteBase %X, Offset %X at %p\n",
+ AcpiUtGetRegionName (RgnDesc->Region.SpaceId),
+ RgnDesc->Region.SpaceId,
+ ObjDesc->CommonField.AccessByteWidth,
+ ObjDesc->CommonField.BaseByteOffset,
+ FieldDatumByteOffset,
+ (void *) Address));
+
+ /* Invoke the appropriate AddressSpace/OpRegion handler */
+
+ Status = AcpiEvAddressSpaceDispatch (RgnDesc, Function,
+ Address,
+ ACPI_MUL_8 (ObjDesc->CommonField.AccessByteWidth), Value);
+
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_NOT_IMPLEMENTED)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Region %s(%X) not implemented",
+ AcpiUtGetRegionName (RgnDesc->Region.SpaceId),
+ RgnDesc->Region.SpaceId));
+ }
+ else if (Status == AE_NOT_EXIST)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Region %s(%X) has no handler",
+ AcpiUtGetRegionName (RgnDesc->Region.SpaceId),
+ RgnDesc->Region.SpaceId));
+ }
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExRegisterOverflow
+ *
+ * PARAMETERS: ObjDesc - Register(Field) to be written
+ * Value - Value to be stored
+ *
+ * RETURN: TRUE if value overflows the field, FALSE otherwise
+ *
+ * DESCRIPTION: Check if a value is out of range of the field being written.
+ * Used to check if the values written to Index and Bank registers
+ * are out of range. Normally, the value is simply truncated
+ * to fit the field, but this case is most likely a serious
+ * coding error in the ASL.
+ *
+ ******************************************************************************/
+
+static BOOLEAN
+AcpiExRegisterOverflow (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_INTEGER Value)
+{
+
+ if (ObjDesc->CommonField.BitLength >= ACPI_INTEGER_BIT_SIZE)
+ {
+ /*
+ * The field is large enough to hold the maximum integer, so we can
+ * never overflow it.
+ */
+ return (FALSE);
+ }
+
+ if (Value >= ((ACPI_INTEGER) 1 << ObjDesc->CommonField.BitLength))
+ {
+ /*
+ * The Value is larger than the maximum value that can fit into
+ * the register.
+ */
+ return (TRUE);
+ }
+
+ /* The Value will fit into the field with no truncation */
+
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExFieldDatumIo
+ *
+ * PARAMETERS: ObjDesc - Field to be read
+ * FieldDatumByteOffset - Byte offset of this datum within the
+ * parent field
+ * Value - Where to store value (must be 64 bits)
+ * ReadWrite - Read or Write flag
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Read or Write a single datum of a field. The FieldType is
+ * demultiplexed here to handle the different types of fields
+ * (BufferField, RegionField, IndexField, BankField)
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiExFieldDatumIo (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT32 FieldDatumByteOffset,
+ ACPI_INTEGER *Value,
+ UINT32 ReadWrite)
+{
+ ACPI_STATUS Status;
+ ACPI_INTEGER LocalValue;
+
+
+ ACPI_FUNCTION_TRACE_U32 (ExFieldDatumIo, FieldDatumByteOffset);
+
+
+ if (ReadWrite == ACPI_READ)
+ {
+ if (!Value)
+ {
+ LocalValue = 0;
+
+ /* To support reads without saving return value */
+ Value = &LocalValue;
+ }
+
+ /* Clear the entire return buffer first, [Very Important!] */
+
+ *Value = 0;
+ }
+
+ /*
+ * The four types of fields are:
+ *
+ * BufferField - Read/write from/to a Buffer
+ * RegionField - Read/write from/to a Operation Region.
+ * BankField - Write to a Bank Register, then read/write from/to an
+ * OperationRegion
+ * IndexField - Write to an Index Register, then read/write from/to a
+ * Data Register
+ */
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_BUFFER_FIELD:
+ /*
+ * If the BufferField arguments have not been previously evaluated,
+ * evaluate them now and save the results.
+ */
+ if (!(ObjDesc->Common.Flags & AOPOBJ_DATA_VALID))
+ {
+ Status = AcpiDsGetBufferFieldArguments (ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ if (ReadWrite == ACPI_READ)
+ {
+ /*
+ * Copy the data from the source buffer.
+ * Length is the field width in bytes.
+ */
+ ACPI_MEMCPY (Value,
+ (ObjDesc->BufferField.BufferObj)->Buffer.Pointer +
+ ObjDesc->BufferField.BaseByteOffset +
+ FieldDatumByteOffset,
+ ObjDesc->CommonField.AccessByteWidth);
+ }
+ else
+ {
+ /*
+ * Copy the data to the target buffer.
+ * Length is the field width in bytes.
+ */
+ ACPI_MEMCPY ((ObjDesc->BufferField.BufferObj)->Buffer.Pointer +
+ ObjDesc->BufferField.BaseByteOffset +
+ FieldDatumByteOffset,
+ Value, ObjDesc->CommonField.AccessByteWidth);
+ }
+
+ Status = AE_OK;
+ break;
+
+
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+
+ /*
+ * Ensure that the BankValue is not beyond the capacity of
+ * the register
+ */
+ if (AcpiExRegisterOverflow (ObjDesc->BankField.BankObj,
+ (ACPI_INTEGER) ObjDesc->BankField.Value))
+ {
+ return_ACPI_STATUS (AE_AML_REGISTER_LIMIT);
+ }
+
+ /*
+ * For BankFields, we must write the BankValue to the BankRegister
+ * (itself a RegionField) before we can access the data.
+ */
+ Status = AcpiExInsertIntoField (ObjDesc->BankField.BankObj,
+ &ObjDesc->BankField.Value,
+ sizeof (ObjDesc->BankField.Value));
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Now that the Bank has been selected, fall through to the
+ * RegionField case and write the datum to the Operation Region
+ */
+
+ /*lint -fallthrough */
+
+
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+ /*
+ * For simple RegionFields, we just directly access the owning
+ * Operation Region.
+ */
+ Status = AcpiExAccessRegion (ObjDesc, FieldDatumByteOffset, Value,
+ ReadWrite);
+ break;
+
+
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
+
+
+ /*
+ * Ensure that the IndexValue is not beyond the capacity of
+ * the register
+ */
+ if (AcpiExRegisterOverflow (ObjDesc->IndexField.IndexObj,
+ (ACPI_INTEGER) ObjDesc->IndexField.Value))
+ {
+ return_ACPI_STATUS (AE_AML_REGISTER_LIMIT);
+ }
+
+ /* Write the index value to the IndexRegister (itself a RegionField) */
+
+ FieldDatumByteOffset += ObjDesc->IndexField.Value;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Write to Index Register: Value %8.8X\n",
+ FieldDatumByteOffset));
+
+ Status = AcpiExInsertIntoField (ObjDesc->IndexField.IndexObj,
+ &FieldDatumByteOffset,
+ sizeof (FieldDatumByteOffset));
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "I/O to Data Register: ValuePtr %p\n", Value));
+
+ if (ReadWrite == ACPI_READ)
+ {
+ /* Read the datum from the DataRegister */
+
+ Status = AcpiExExtractFromField (ObjDesc->IndexField.DataObj,
+ Value, sizeof (ACPI_INTEGER));
+ }
+ else
+ {
+ /* Write the datum to the DataRegister */
+
+ Status = AcpiExInsertIntoField (ObjDesc->IndexField.DataObj,
+ Value, sizeof (ACPI_INTEGER));
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Wrong object type in field I/O %X",
+ ACPI_GET_OBJECT_TYPE (ObjDesc)));
+ Status = AE_AML_INTERNAL;
+ break;
+ }
+
+ if (ACPI_SUCCESS (Status))
+ {
+ if (ReadWrite == ACPI_READ)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Value Read %8.8X%8.8X, Width %d\n",
+ ACPI_FORMAT_UINT64 (*Value),
+ ObjDesc->CommonField.AccessByteWidth));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Value Written %8.8X%8.8X, Width %d\n",
+ ACPI_FORMAT_UINT64 (*Value),
+ ObjDesc->CommonField.AccessByteWidth));
+ }
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExWriteWithUpdateRule
+ *
+ * PARAMETERS: ObjDesc - Field to be written
+ * Mask - bitmask within field datum
+ * FieldValue - Value to write
+ * FieldDatumByteOffset - Offset of datum within field
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Apply the field update rule to a field write
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExWriteWithUpdateRule (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_INTEGER Mask,
+ ACPI_INTEGER FieldValue,
+ UINT32 FieldDatumByteOffset)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_INTEGER MergedValue;
+ ACPI_INTEGER CurrentValue;
+
+
+ ACPI_FUNCTION_TRACE_U32 (ExWriteWithUpdateRule, Mask);
+
+
+ /* Start with the new bits */
+
+ MergedValue = FieldValue;
+
+ /* If the mask is all ones, we don't need to worry about the update rule */
+
+ if (Mask != ACPI_INTEGER_MAX)
+ {
+ /* Decode the update rule */
+
+ switch (ObjDesc->CommonField.FieldFlags & AML_FIELD_UPDATE_RULE_MASK)
+ {
+ case AML_FIELD_UPDATE_PRESERVE:
+ /*
+ * Check if update rule needs to be applied (not if mask is all
+ * ones) The left shift drops the bits we want to ignore.
+ */
+ if ((~Mask << (ACPI_MUL_8 (sizeof (Mask)) -
+ ACPI_MUL_8 (ObjDesc->CommonField.AccessByteWidth))) != 0)
+ {
+ /*
+ * Read the current contents of the byte/word/dword containing
+ * the field, and merge with the new field value.
+ */
+ Status = AcpiExFieldDatumIo (ObjDesc, FieldDatumByteOffset,
+ &CurrentValue, ACPI_READ);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ MergedValue |= (CurrentValue & ~Mask);
+ }
+ break;
+
+ case AML_FIELD_UPDATE_WRITE_AS_ONES:
+
+ /* Set positions outside the field to all ones */
+
+ MergedValue |= ~Mask;
+ break;
+
+ case AML_FIELD_UPDATE_WRITE_AS_ZEROS:
+
+ /* Set positions outside the field to all zeros */
+
+ MergedValue &= Mask;
+ break;
+
+ default:
+
+ ACPI_ERROR ((AE_INFO,
+ "Unknown UpdateRule value: %X",
+ (ObjDesc->CommonField.FieldFlags & AML_FIELD_UPDATE_RULE_MASK)));
+ return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
+ }
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Mask %8.8X%8.8X, DatumOffset %X, Width %X, Value %8.8X%8.8X, MergedValue %8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (Mask),
+ FieldDatumByteOffset,
+ ObjDesc->CommonField.AccessByteWidth,
+ ACPI_FORMAT_UINT64 (FieldValue),
+ ACPI_FORMAT_UINT64 (MergedValue)));
+
+ /* Write the merged value */
+
+ Status = AcpiExFieldDatumIo (ObjDesc, FieldDatumByteOffset,
+ &MergedValue, ACPI_WRITE);
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExExtractFromField
+ *
+ * PARAMETERS: ObjDesc - Field to be read
+ * Buffer - Where to store the field data
+ * BufferLength - Length of Buffer
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Retrieve the current value of the given field
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExExtractFromField (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ void *Buffer,
+ UINT32 BufferLength)
+{
+ ACPI_STATUS Status;
+ ACPI_INTEGER RawDatum;
+ ACPI_INTEGER MergedDatum;
+ UINT32 FieldOffset = 0;
+ UINT32 BufferOffset = 0;
+ UINT32 BufferTailBits;
+ UINT32 DatumCount;
+ UINT32 FieldDatumCount;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE (ExExtractFromField);
+
+
+ /* Validate target buffer and clear it */
+
+ if (BufferLength <
+ ACPI_ROUND_BITS_UP_TO_BYTES (ObjDesc->CommonField.BitLength))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Field size %X (bits) is too large for buffer (%X)",
+ ObjDesc->CommonField.BitLength, BufferLength));
+
+ return_ACPI_STATUS (AE_BUFFER_OVERFLOW);
+ }
+ ACPI_MEMSET (Buffer, 0, BufferLength);
+
+ /* Compute the number of datums (access width data items) */
+
+ DatumCount = ACPI_ROUND_UP_TO (
+ ObjDesc->CommonField.BitLength,
+ ObjDesc->CommonField.AccessBitWidth);
+ FieldDatumCount = ACPI_ROUND_UP_TO (
+ ObjDesc->CommonField.BitLength +
+ ObjDesc->CommonField.StartFieldBitOffset,
+ ObjDesc->CommonField.AccessBitWidth);
+
+ /* Priming read from the field */
+
+ Status = AcpiExFieldDatumIo (ObjDesc, FieldOffset, &RawDatum, ACPI_READ);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ MergedDatum = RawDatum >> ObjDesc->CommonField.StartFieldBitOffset;
+
+ /* Read the rest of the field */
+
+ for (i = 1; i < FieldDatumCount; i++)
+ {
+ /* Get next input datum from the field */
+
+ FieldOffset += ObjDesc->CommonField.AccessByteWidth;
+ Status = AcpiExFieldDatumIo (ObjDesc, FieldOffset,
+ &RawDatum, ACPI_READ);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Merge with previous datum if necessary.
+ *
+ * Note: Before the shift, check if the shift value will be larger than
+ * the integer size. If so, there is no need to perform the operation.
+ * This avoids the differences in behavior between different compilers
+ * concerning shift values larger than the target data width.
+ */
+ if ((ObjDesc->CommonField.AccessBitWidth -
+ ObjDesc->CommonField.StartFieldBitOffset) < ACPI_INTEGER_BIT_SIZE)
+ {
+ MergedDatum |= RawDatum <<
+ (ObjDesc->CommonField.AccessBitWidth -
+ ObjDesc->CommonField.StartFieldBitOffset);
+ }
+
+ if (i == DatumCount)
+ {
+ break;
+ }
+
+ /* Write merged datum to target buffer */
+
+ ACPI_MEMCPY (((char *) Buffer) + BufferOffset, &MergedDatum,
+ ACPI_MIN(ObjDesc->CommonField.AccessByteWidth,
+ BufferLength - BufferOffset));
+
+ BufferOffset += ObjDesc->CommonField.AccessByteWidth;
+ MergedDatum = RawDatum >> ObjDesc->CommonField.StartFieldBitOffset;
+ }
+
+ /* Mask off any extra bits in the last datum */
+
+ BufferTailBits = ObjDesc->CommonField.BitLength %
+ ObjDesc->CommonField.AccessBitWidth;
+ if (BufferTailBits)
+ {
+ MergedDatum &= ACPI_MASK_BITS_ABOVE (BufferTailBits);
+ }
+
+ /* Write the last datum to the buffer */
+
+ ACPI_MEMCPY (((char *) Buffer) + BufferOffset, &MergedDatum,
+ ACPI_MIN(ObjDesc->CommonField.AccessByteWidth,
+ BufferLength - BufferOffset));
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExInsertIntoField
+ *
+ * PARAMETERS: ObjDesc - Field to be written
+ * Buffer - Data to be written
+ * BufferLength - Length of Buffer
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Store the Buffer contents into the given field
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExInsertIntoField (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ void *Buffer,
+ UINT32 BufferLength)
+{
+ ACPI_STATUS Status;
+ ACPI_INTEGER Mask;
+ ACPI_INTEGER WidthMask;
+ ACPI_INTEGER MergedDatum;
+ ACPI_INTEGER RawDatum = 0;
+ UINT32 FieldOffset = 0;
+ UINT32 BufferOffset = 0;
+ UINT32 BufferTailBits;
+ UINT32 DatumCount;
+ UINT32 FieldDatumCount;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE (ExInsertIntoField);
+
+
+ /* Validate input buffer */
+
+ if (BufferLength <
+ ACPI_ROUND_BITS_UP_TO_BYTES (ObjDesc->CommonField.BitLength))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Field size %X (bits) is too large for buffer (%X)",
+ ObjDesc->CommonField.BitLength, BufferLength));
+
+ return_ACPI_STATUS (AE_BUFFER_OVERFLOW);
+ }
+
+ /*
+ * Create the bitmasks used for bit insertion.
+ * Note: This if/else is used to bypass compiler differences with the
+ * shift operator
+ */
+ if (ObjDesc->CommonField.AccessBitWidth == ACPI_INTEGER_BIT_SIZE)
+ {
+ WidthMask = ACPI_INTEGER_MAX;
+ }
+ else
+ {
+ WidthMask = ACPI_MASK_BITS_ABOVE (ObjDesc->CommonField.AccessBitWidth);
+ }
+
+ Mask = WidthMask &
+ ACPI_MASK_BITS_BELOW (ObjDesc->CommonField.StartFieldBitOffset);
+
+ /* Compute the number of datums (access width data items) */
+
+ DatumCount = ACPI_ROUND_UP_TO (ObjDesc->CommonField.BitLength,
+ ObjDesc->CommonField.AccessBitWidth);
+
+ FieldDatumCount = ACPI_ROUND_UP_TO (ObjDesc->CommonField.BitLength +
+ ObjDesc->CommonField.StartFieldBitOffset,
+ ObjDesc->CommonField.AccessBitWidth);
+
+ /* Get initial Datum from the input buffer */
+
+ ACPI_MEMCPY (&RawDatum, Buffer,
+ ACPI_MIN(ObjDesc->CommonField.AccessByteWidth,
+ BufferLength - BufferOffset));
+
+ MergedDatum = RawDatum << ObjDesc->CommonField.StartFieldBitOffset;
+
+ /* Write the entire field */
+
+ for (i = 1; i < FieldDatumCount; i++)
+ {
+ /* Write merged datum to the target field */
+
+ MergedDatum &= Mask;
+ Status = AcpiExWriteWithUpdateRule (ObjDesc, Mask,
+ MergedDatum, FieldOffset);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ FieldOffset += ObjDesc->CommonField.AccessByteWidth;
+
+ /*
+ * Start new output datum by merging with previous input datum
+ * if necessary.
+ *
+ * Note: Before the shift, check if the shift value will be larger than
+ * the integer size. If so, there is no need to perform the operation.
+ * This avoids the differences in behavior between different compilers
+ * concerning shift values larger than the target data width.
+ */
+ if ((ObjDesc->CommonField.AccessBitWidth -
+ ObjDesc->CommonField.StartFieldBitOffset) < ACPI_INTEGER_BIT_SIZE)
+ {
+ MergedDatum = RawDatum >>
+ (ObjDesc->CommonField.AccessBitWidth -
+ ObjDesc->CommonField.StartFieldBitOffset);
+ }
+ else
+ {
+ MergedDatum = 0;
+ }
+
+ Mask = WidthMask;
+
+ if (i == DatumCount)
+ {
+ break;
+ }
+
+ /* Get the next input datum from the buffer */
+
+ BufferOffset += ObjDesc->CommonField.AccessByteWidth;
+ ACPI_MEMCPY (&RawDatum, ((char *) Buffer) + BufferOffset,
+ ACPI_MIN(ObjDesc->CommonField.AccessByteWidth,
+ BufferLength - BufferOffset));
+ MergedDatum |= RawDatum << ObjDesc->CommonField.StartFieldBitOffset;
+ }
+
+ /* Mask off any extra bits in the last datum */
+
+ BufferTailBits = (ObjDesc->CommonField.BitLength +
+ ObjDesc->CommonField.StartFieldBitOffset) %
+ ObjDesc->CommonField.AccessBitWidth;
+ if (BufferTailBits)
+ {
+ Mask &= ACPI_MASK_BITS_ABOVE (BufferTailBits);
+ }
+
+ /* Write the last datum to the field */
+
+ MergedDatum &= Mask;
+ Status = AcpiExWriteWithUpdateRule (ObjDesc,
+ Mask, MergedDatum, FieldOffset);
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exmisc.c b/sys/contrib/dev/acpica/exmisc.c
new file mode 100644
index 0000000..11dd35a
--- /dev/null
+++ b/sys/contrib/dev/acpica/exmisc.c
@@ -0,0 +1,873 @@
+
+/******************************************************************************
+ *
+ * Module Name: exmisc - ACPI AML (p-code) execution - specific opcodes
+ * $Revision: 1.144 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXMISC_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/amlresrc.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exmisc")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExGetObjectReference
+ *
+ * PARAMETERS: ObjDesc - Create a reference to this object
+ * ReturnDesc - Where to store the reference
+ * WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Obtain and return a "reference" to the target object
+ * Common code for the RefOfOp and the CondRefOfOp.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExGetObjectReference (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_OPERAND_OBJECT **ReturnDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT *ReferenceObj;
+ ACPI_OPERAND_OBJECT *ReferencedObj;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExGetObjectReference, ObjDesc);
+
+
+ *ReturnDesc = NULL;
+
+ switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
+ {
+ case ACPI_DESC_TYPE_OPERAND:
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) != ACPI_TYPE_LOCAL_REFERENCE)
+ {
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /*
+ * Must be a reference to a Local or Arg
+ */
+ switch (ObjDesc->Reference.Opcode)
+ {
+ case AML_LOCAL_OP:
+ case AML_ARG_OP:
+ case AML_DEBUG_OP:
+
+ /* The referenced object is the pseudo-node for the local/arg */
+
+ ReferencedObj = ObjDesc->Reference.Object;
+ break;
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown Reference opcode %X",
+ ObjDesc->Reference.Opcode));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+ break;
+
+
+ case ACPI_DESC_TYPE_NAMED:
+
+ /*
+ * A named reference that has already been resolved to a Node
+ */
+ ReferencedObj = ObjDesc;
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Invalid descriptor type %X",
+ ACPI_GET_DESCRIPTOR_TYPE (ObjDesc)));
+ return_ACPI_STATUS (AE_TYPE);
+ }
+
+
+ /* Create a new reference object */
+
+ ReferenceObj = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE);
+ if (!ReferenceObj)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ ReferenceObj->Reference.Opcode = AML_REF_OF_OP;
+ ReferenceObj->Reference.Object = ReferencedObj;
+ *ReturnDesc = ReferenceObj;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Object %p Type [%s], returning Reference %p\n",
+ ObjDesc, AcpiUtGetObjectTypeName (ObjDesc), *ReturnDesc));
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExConcatTemplate
+ *
+ * PARAMETERS: Operand0 - First source object
+ * Operand1 - Second source object
+ * ActualReturnDesc - Where to place the return object
+ * WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Concatenate two resource templates
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExConcatTemplate (
+ ACPI_OPERAND_OBJECT *Operand0,
+ ACPI_OPERAND_OBJECT *Operand1,
+ ACPI_OPERAND_OBJECT **ActualReturnDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *ReturnDesc;
+ UINT8 *NewBuf;
+ UINT8 *EndTag;
+ ACPI_SIZE Length0;
+ ACPI_SIZE Length1;
+ ACPI_SIZE NewLength;
+
+
+ ACPI_FUNCTION_TRACE (ExConcatTemplate);
+
+
+ /*
+ * Find the EndTag descriptor in each resource template.
+ * Note1: returned pointers point TO the EndTag, not past it.
+ * Note2: zero-length buffers are allowed; treated like one EndTag
+ */
+
+ /* Get the length of the first resource template */
+
+ Status = AcpiUtGetResourceEndTag (Operand0, &EndTag);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Length0 = ACPI_PTR_DIFF (EndTag, Operand0->Buffer.Pointer);
+
+ /* Get the length of the second resource template */
+
+ Status = AcpiUtGetResourceEndTag (Operand1, &EndTag);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Length1 = ACPI_PTR_DIFF (EndTag, Operand1->Buffer.Pointer);
+
+ /* Combine both lengths, minimum size will be 2 for EndTag */
+
+ NewLength = Length0 + Length1 + sizeof (AML_RESOURCE_END_TAG);
+
+ /* Create a new buffer object for the result (with one EndTag) */
+
+ ReturnDesc = AcpiUtCreateBufferObject (NewLength);
+ if (!ReturnDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /*
+ * Copy the templates to the new buffer, 0 first, then 1 follows. One
+ * EndTag descriptor is copied from Operand1.
+ */
+ NewBuf = ReturnDesc->Buffer.Pointer;
+ ACPI_MEMCPY (NewBuf, Operand0->Buffer.Pointer, Length0);
+ ACPI_MEMCPY (NewBuf + Length0, Operand1->Buffer.Pointer, Length1);
+
+ /* Insert EndTag and set the checksum to zero, means "ignore checksum" */
+
+ NewBuf[NewLength - 1] = 0;
+ NewBuf[NewLength - 2] = ACPI_RESOURCE_NAME_END_TAG | 1;
+
+ /* Return the completed resource template */
+
+ *ActualReturnDesc = ReturnDesc;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDoConcatenate
+ *
+ * PARAMETERS: Operand0 - First source object
+ * Operand1 - Second source object
+ * ActualReturnDesc - Where to place the return object
+ * WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Concatenate two objects OF THE SAME TYPE.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExDoConcatenate (
+ ACPI_OPERAND_OBJECT *Operand0,
+ ACPI_OPERAND_OBJECT *Operand1,
+ ACPI_OPERAND_OBJECT **ActualReturnDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT *LocalOperand1 = Operand1;
+ ACPI_OPERAND_OBJECT *ReturnDesc;
+ char *NewBuf;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (ExDoConcatenate);
+
+
+ /*
+ * Convert the second operand if necessary. The first operand
+ * determines the type of the second operand, (See the Data Types
+ * section of the ACPI specification.) Both object types are
+ * guaranteed to be either Integer/String/Buffer by the operand
+ * resolution mechanism.
+ */
+ switch (ACPI_GET_OBJECT_TYPE (Operand0))
+ {
+ case ACPI_TYPE_INTEGER:
+ Status = AcpiExConvertToInteger (Operand1, &LocalOperand1, 16);
+ break;
+
+ case ACPI_TYPE_STRING:
+ Status = AcpiExConvertToString (Operand1, &LocalOperand1,
+ ACPI_IMPLICIT_CONVERT_HEX);
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ Status = AcpiExConvertToBuffer (Operand1, &LocalOperand1);
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO, "Invalid object type: %X",
+ ACPI_GET_OBJECT_TYPE (Operand0)));
+ Status = AE_AML_INTERNAL;
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /*
+ * Both operands are now known to be the same object type
+ * (Both are Integer, String, or Buffer), and we can now perform the
+ * concatenation.
+ */
+
+ /*
+ * There are three cases to handle:
+ *
+ * 1) Two Integers concatenated to produce a new Buffer
+ * 2) Two Strings concatenated to produce a new String
+ * 3) Two Buffers concatenated to produce a new Buffer
+ */
+ switch (ACPI_GET_OBJECT_TYPE (Operand0))
+ {
+ case ACPI_TYPE_INTEGER:
+
+ /* Result of two Integers is a Buffer */
+ /* Need enough buffer space for two integers */
+
+ ReturnDesc = AcpiUtCreateBufferObject ((ACPI_SIZE)
+ ACPI_MUL_2 (AcpiGbl_IntegerByteWidth));
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ NewBuf = (char *) ReturnDesc->Buffer.Pointer;
+
+ /* Copy the first integer, LSB first */
+
+ ACPI_MEMCPY (NewBuf, &Operand0->Integer.Value,
+ AcpiGbl_IntegerByteWidth);
+
+ /* Copy the second integer (LSB first) after the first */
+
+ ACPI_MEMCPY (NewBuf + AcpiGbl_IntegerByteWidth,
+ &LocalOperand1->Integer.Value,
+ AcpiGbl_IntegerByteWidth);
+ break;
+
+ case ACPI_TYPE_STRING:
+
+ /* Result of two Strings is a String */
+
+ ReturnDesc = AcpiUtCreateStringObject ((ACPI_SIZE)
+ (Operand0->String.Length +
+ LocalOperand1->String.Length));
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ NewBuf = ReturnDesc->String.Pointer;
+
+ /* Concatenate the strings */
+
+ ACPI_STRCPY (NewBuf, Operand0->String.Pointer);
+ ACPI_STRCPY (NewBuf + Operand0->String.Length,
+ LocalOperand1->String.Pointer);
+ break;
+
+ case ACPI_TYPE_BUFFER:
+
+ /* Result of two Buffers is a Buffer */
+
+ ReturnDesc = AcpiUtCreateBufferObject ((ACPI_SIZE)
+ (Operand0->Buffer.Length +
+ LocalOperand1->Buffer.Length));
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ NewBuf = (char *) ReturnDesc->Buffer.Pointer;
+
+ /* Concatenate the buffers */
+
+ ACPI_MEMCPY (NewBuf, Operand0->Buffer.Pointer,
+ Operand0->Buffer.Length);
+ ACPI_MEMCPY (NewBuf + Operand0->Buffer.Length,
+ LocalOperand1->Buffer.Pointer,
+ LocalOperand1->Buffer.Length);
+ break;
+
+ default:
+
+ /* Invalid object type, should not happen here */
+
+ ACPI_ERROR ((AE_INFO, "Invalid object type: %X",
+ ACPI_GET_OBJECT_TYPE (Operand0)));
+ Status =AE_AML_INTERNAL;
+ goto Cleanup;
+ }
+
+ *ActualReturnDesc = ReturnDesc;
+
+Cleanup:
+ if (LocalOperand1 != Operand1)
+ {
+ AcpiUtRemoveReference (LocalOperand1);
+ }
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDoMathOp
+ *
+ * PARAMETERS: Opcode - AML opcode
+ * Integer0 - Integer operand #0
+ * Integer1 - Integer operand #1
+ *
+ * RETURN: Integer result of the operation
+ *
+ * DESCRIPTION: Execute a math AML opcode. The purpose of having all of the
+ * math functions here is to prevent a lot of pointer dereferencing
+ * to obtain the operands.
+ *
+ ******************************************************************************/
+
+ACPI_INTEGER
+AcpiExDoMathOp (
+ UINT16 Opcode,
+ ACPI_INTEGER Integer0,
+ ACPI_INTEGER Integer1)
+{
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ switch (Opcode)
+ {
+ case AML_ADD_OP: /* Add (Integer0, Integer1, Result) */
+
+ return (Integer0 + Integer1);
+
+
+ case AML_BIT_AND_OP: /* And (Integer0, Integer1, Result) */
+
+ return (Integer0 & Integer1);
+
+
+ case AML_BIT_NAND_OP: /* NAnd (Integer0, Integer1, Result) */
+
+ return (~(Integer0 & Integer1));
+
+
+ case AML_BIT_OR_OP: /* Or (Integer0, Integer1, Result) */
+
+ return (Integer0 | Integer1);
+
+
+ case AML_BIT_NOR_OP: /* NOr (Integer0, Integer1, Result) */
+
+ return (~(Integer0 | Integer1));
+
+
+ case AML_BIT_XOR_OP: /* XOr (Integer0, Integer1, Result) */
+
+ return (Integer0 ^ Integer1);
+
+
+ case AML_MULTIPLY_OP: /* Multiply (Integer0, Integer1, Result) */
+
+ return (Integer0 * Integer1);
+
+
+ case AML_SHIFT_LEFT_OP: /* ShiftLeft (Operand, ShiftCount, Result)*/
+
+ /*
+ * We need to check if the shiftcount is larger than the integer bit
+ * width since the behavior of this is not well-defined in the C language.
+ */
+ if (Integer1 >= AcpiGbl_IntegerBitWidth)
+ {
+ return (0);
+ }
+ return (Integer0 << Integer1);
+
+
+ case AML_SHIFT_RIGHT_OP: /* ShiftRight (Operand, ShiftCount, Result) */
+
+ /*
+ * We need to check if the shiftcount is larger than the integer bit
+ * width since the behavior of this is not well-defined in the C language.
+ */
+ if (Integer1 >= AcpiGbl_IntegerBitWidth)
+ {
+ return (0);
+ }
+ return (Integer0 >> Integer1);
+
+
+ case AML_SUBTRACT_OP: /* Subtract (Integer0, Integer1, Result) */
+
+ return (Integer0 - Integer1);
+
+ default:
+
+ return (0);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDoLogicalNumericOp
+ *
+ * PARAMETERS: Opcode - AML opcode
+ * Integer0 - Integer operand #0
+ * Integer1 - Integer operand #1
+ * LogicalResult - TRUE/FALSE result of the operation
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute a logical "Numeric" AML opcode. For these Numeric
+ * operators (LAnd and LOr), both operands must be integers.
+ *
+ * Note: cleanest machine code seems to be produced by the code
+ * below, rather than using statements of the form:
+ * Result = (Integer0 && Integer1);
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExDoLogicalNumericOp (
+ UINT16 Opcode,
+ ACPI_INTEGER Integer0,
+ ACPI_INTEGER Integer1,
+ BOOLEAN *LogicalResult)
+{
+ ACPI_STATUS Status = AE_OK;
+ BOOLEAN LocalResult = FALSE;
+
+
+ ACPI_FUNCTION_TRACE (ExDoLogicalNumericOp);
+
+
+ switch (Opcode)
+ {
+ case AML_LAND_OP: /* LAnd (Integer0, Integer1) */
+
+ if (Integer0 && Integer1)
+ {
+ LocalResult = TRUE;
+ }
+ break;
+
+ case AML_LOR_OP: /* LOr (Integer0, Integer1) */
+
+ if (Integer0 || Integer1)
+ {
+ LocalResult = TRUE;
+ }
+ break;
+
+ default:
+ Status = AE_AML_INTERNAL;
+ break;
+ }
+
+ /* Return the logical result and status */
+
+ *LogicalResult = LocalResult;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDoLogicalOp
+ *
+ * PARAMETERS: Opcode - AML opcode
+ * Operand0 - operand #0
+ * Operand1 - operand #1
+ * LogicalResult - TRUE/FALSE result of the operation
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute a logical AML opcode. The purpose of having all of the
+ * functions here is to prevent a lot of pointer dereferencing
+ * to obtain the operands and to simplify the generation of the
+ * logical value. For the Numeric operators (LAnd and LOr), both
+ * operands must be integers. For the other logical operators,
+ * operands can be any combination of Integer/String/Buffer. The
+ * first operand determines the type to which the second operand
+ * will be converted.
+ *
+ * Note: cleanest machine code seems to be produced by the code
+ * below, rather than using statements of the form:
+ * Result = (Operand0 == Operand1);
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExDoLogicalOp (
+ UINT16 Opcode,
+ ACPI_OPERAND_OBJECT *Operand0,
+ ACPI_OPERAND_OBJECT *Operand1,
+ BOOLEAN *LogicalResult)
+{
+ ACPI_OPERAND_OBJECT *LocalOperand1 = Operand1;
+ ACPI_INTEGER Integer0;
+ ACPI_INTEGER Integer1;
+ UINT32 Length0;
+ UINT32 Length1;
+ ACPI_STATUS Status = AE_OK;
+ BOOLEAN LocalResult = FALSE;
+ int Compare;
+
+
+ ACPI_FUNCTION_TRACE (ExDoLogicalOp);
+
+
+ /*
+ * Convert the second operand if necessary. The first operand
+ * determines the type of the second operand, (See the Data Types
+ * section of the ACPI 3.0+ specification.) Both object types are
+ * guaranteed to be either Integer/String/Buffer by the operand
+ * resolution mechanism.
+ */
+ switch (ACPI_GET_OBJECT_TYPE (Operand0))
+ {
+ case ACPI_TYPE_INTEGER:
+ Status = AcpiExConvertToInteger (Operand1, &LocalOperand1, 16);
+ break;
+
+ case ACPI_TYPE_STRING:
+ Status = AcpiExConvertToString (Operand1, &LocalOperand1,
+ ACPI_IMPLICIT_CONVERT_HEX);
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ Status = AcpiExConvertToBuffer (Operand1, &LocalOperand1);
+ break;
+
+ default:
+ Status = AE_AML_INTERNAL;
+ break;
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /*
+ * Two cases: 1) Both Integers, 2) Both Strings or Buffers
+ */
+ if (ACPI_GET_OBJECT_TYPE (Operand0) == ACPI_TYPE_INTEGER)
+ {
+ /*
+ * 1) Both operands are of type integer
+ * Note: LocalOperand1 may have changed above
+ */
+ Integer0 = Operand0->Integer.Value;
+ Integer1 = LocalOperand1->Integer.Value;
+
+ switch (Opcode)
+ {
+ case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */
+
+ if (Integer0 == Integer1)
+ {
+ LocalResult = TRUE;
+ }
+ break;
+
+ case AML_LGREATER_OP: /* LGreater (Operand0, Operand1) */
+
+ if (Integer0 > Integer1)
+ {
+ LocalResult = TRUE;
+ }
+ break;
+
+ case AML_LLESS_OP: /* LLess (Operand0, Operand1) */
+
+ if (Integer0 < Integer1)
+ {
+ LocalResult = TRUE;
+ }
+ break;
+
+ default:
+ Status = AE_AML_INTERNAL;
+ break;
+ }
+ }
+ else
+ {
+ /*
+ * 2) Both operands are Strings or both are Buffers
+ * Note: Code below takes advantage of common Buffer/String
+ * object fields. LocalOperand1 may have changed above. Use
+ * memcmp to handle nulls in buffers.
+ */
+ Length0 = Operand0->Buffer.Length;
+ Length1 = LocalOperand1->Buffer.Length;
+
+ /* Lexicographic compare: compare the data bytes */
+
+ Compare = ACPI_MEMCMP (Operand0->Buffer.Pointer,
+ LocalOperand1->Buffer.Pointer,
+ (Length0 > Length1) ? Length1 : Length0);
+
+ switch (Opcode)
+ {
+ case AML_LEQUAL_OP: /* LEqual (Operand0, Operand1) */
+
+ /* Length and all bytes must be equal */
+
+ if ((Length0 == Length1) &&
+ (Compare == 0))
+ {
+ /* Length and all bytes match ==> TRUE */
+
+ LocalResult = TRUE;
+ }
+ break;
+
+ case AML_LGREATER_OP: /* LGreater (Operand0, Operand1) */
+
+ if (Compare > 0)
+ {
+ LocalResult = TRUE;
+ goto Cleanup; /* TRUE */
+ }
+ if (Compare < 0)
+ {
+ goto Cleanup; /* FALSE */
+ }
+
+ /* Bytes match (to shortest length), compare lengths */
+
+ if (Length0 > Length1)
+ {
+ LocalResult = TRUE;
+ }
+ break;
+
+ case AML_LLESS_OP: /* LLess (Operand0, Operand1) */
+
+ if (Compare > 0)
+ {
+ goto Cleanup; /* FALSE */
+ }
+ if (Compare < 0)
+ {
+ LocalResult = TRUE;
+ goto Cleanup; /* TRUE */
+ }
+
+ /* Bytes match (to shortest length), compare lengths */
+
+ if (Length0 < Length1)
+ {
+ LocalResult = TRUE;
+ }
+ break;
+
+ default:
+ Status = AE_AML_INTERNAL;
+ break;
+ }
+ }
+
+Cleanup:
+
+ /* New object was created if implicit conversion performed - delete */
+
+ if (LocalOperand1 != Operand1)
+ {
+ AcpiUtRemoveReference (LocalOperand1);
+ }
+
+ /* Return the logical result and status */
+
+ *LogicalResult = LocalResult;
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exmutex.c b/sys/contrib/dev/acpica/exmutex.c
new file mode 100644
index 0000000..e1925ec
--- /dev/null
+++ b/sys/contrib/dev/acpica/exmutex.c
@@ -0,0 +1,596 @@
+
+/******************************************************************************
+ *
+ * Module Name: exmutex - ASL Mutex Acquire/Release functions
+ * $Revision: 1.40 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXMUTEX_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acevents.h>
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exmutex")
+
+/* Local prototypes */
+
+static void
+AcpiExLinkMutex (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_THREAD_STATE *Thread);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExUnlinkMutex
+ *
+ * PARAMETERS: ObjDesc - The mutex to be unlinked
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Remove a mutex from the "AcquiredMutex" list
+ *
+ ******************************************************************************/
+
+void
+AcpiExUnlinkMutex (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_THREAD_STATE *Thread = ObjDesc->Mutex.OwnerThread;
+
+
+ if (!Thread)
+ {
+ return;
+ }
+
+ /* Doubly linked list */
+
+ if (ObjDesc->Mutex.Next)
+ {
+ (ObjDesc->Mutex.Next)->Mutex.Prev = ObjDesc->Mutex.Prev;
+ }
+
+ if (ObjDesc->Mutex.Prev)
+ {
+ (ObjDesc->Mutex.Prev)->Mutex.Next = ObjDesc->Mutex.Next;
+ }
+ else
+ {
+ Thread->AcquiredMutexList = ObjDesc->Mutex.Next;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExLinkMutex
+ *
+ * PARAMETERS: ObjDesc - The mutex to be linked
+ * Thread - Current executing thread object
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Add a mutex to the "AcquiredMutex" list for this walk
+ *
+ ******************************************************************************/
+
+static void
+AcpiExLinkMutex (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_THREAD_STATE *Thread)
+{
+ ACPI_OPERAND_OBJECT *ListHead;
+
+
+ ListHead = Thread->AcquiredMutexList;
+
+ /* This object will be the first object in the list */
+
+ ObjDesc->Mutex.Prev = NULL;
+ ObjDesc->Mutex.Next = ListHead;
+
+ /* Update old first object to point back to this object */
+
+ if (ListHead)
+ {
+ ListHead->Mutex.Prev = ObjDesc;
+ }
+
+ /* Update list head */
+
+ Thread->AcquiredMutexList = ObjDesc;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExAcquireMutexObject
+ *
+ * PARAMETERS: TimeDesc - Timeout in milliseconds
+ * ObjDesc - Mutex object
+ * Thread - Current thread state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Acquire an AML mutex, low-level interface. Provides a common
+ * path that supports multiple acquires by the same thread.
+ *
+ * MUTEX: Interpreter must be locked
+ *
+ * NOTE: This interface is called from three places:
+ * 1) From AcpiExAcquireMutex, via an AML Acquire() operator
+ * 2) From AcpiExAcquireGlobalLock when an AML Field access requires the
+ * global lock
+ * 3) From the external interface, AcpiAcquireGlobalLock
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExAcquireMutexObject (
+ UINT16 Timeout,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_THREAD_ID ThreadId)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExAcquireMutexObject, ObjDesc);
+
+
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Support for multiple acquires by the owning thread */
+
+ if (ObjDesc->Mutex.ThreadId == ThreadId)
+ {
+ /*
+ * The mutex is already owned by this thread, just increment the
+ * acquisition depth
+ */
+ ObjDesc->Mutex.AcquisitionDepth++;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Acquire the mutex, wait if necessary. Special case for Global Lock */
+
+ if (ObjDesc == AcpiGbl_GlobalLockMutex)
+ {
+ Status = AcpiEvAcquireGlobalLock (Timeout);
+ }
+ else
+ {
+ Status = AcpiExSystemWaitMutex (ObjDesc->Mutex.OsMutex,
+ Timeout);
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ /* Includes failure from a timeout on TimeDesc */
+
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Acquired the mutex: update mutex object */
+
+ ObjDesc->Mutex.ThreadId = ThreadId;
+ ObjDesc->Mutex.AcquisitionDepth = 1;
+ ObjDesc->Mutex.OriginalSyncLevel = 0;
+ ObjDesc->Mutex.OwnerThread = NULL; /* Used only for AML Acquire() */
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExAcquireMutex
+ *
+ * PARAMETERS: TimeDesc - Timeout integer
+ * ObjDesc - Mutex object
+ * WalkState - Current method execution state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Acquire an AML mutex
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExAcquireMutex (
+ ACPI_OPERAND_OBJECT *TimeDesc,
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExAcquireMutex, ObjDesc);
+
+
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Must have a valid thread ID */
+
+ if (!WalkState->Thread)
+ {
+ ACPI_ERROR ((AE_INFO, "Cannot acquire Mutex [%4.4s], null thread info",
+ AcpiUtGetNodeName (ObjDesc->Mutex.Node)));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
+ /*
+ * Current sync level must be less than or equal to the sync level of the
+ * mutex. This mechanism provides some deadlock prevention
+ */
+ if (WalkState->Thread->CurrentSyncLevel > ObjDesc->Mutex.SyncLevel)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Cannot acquire Mutex [%4.4s], current SyncLevel is too large (%d)",
+ AcpiUtGetNodeName (ObjDesc->Mutex.Node),
+ WalkState->Thread->CurrentSyncLevel));
+ return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
+ }
+
+ Status = AcpiExAcquireMutexObject ((UINT16) TimeDesc->Integer.Value,
+ ObjDesc, WalkState->Thread->ThreadId);
+ if (ACPI_SUCCESS (Status) && ObjDesc->Mutex.AcquisitionDepth == 1)
+ {
+ /* Save Thread object, original/current sync levels */
+
+ ObjDesc->Mutex.OwnerThread = WalkState->Thread;
+ ObjDesc->Mutex.OriginalSyncLevel = WalkState->Thread->CurrentSyncLevel;
+ WalkState->Thread->CurrentSyncLevel = ObjDesc->Mutex.SyncLevel;
+
+ /* Link the mutex to the current thread for force-unlock at method exit */
+
+ AcpiExLinkMutex (ObjDesc, WalkState->Thread);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExReleaseMutexObject
+ *
+ * PARAMETERS: ObjDesc - The object descriptor for this op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Release a previously acquired Mutex, low level interface.
+ * Provides a common path that supports multiple releases (after
+ * previous multiple acquires) by the same thread.
+ *
+ * MUTEX: Interpreter must be locked
+ *
+ * NOTE: This interface is called from three places:
+ * 1) From AcpiExReleaseMutex, via an AML Acquire() operator
+ * 2) From AcpiExReleaseGlobalLock when an AML Field access requires the
+ * global lock
+ * 3) From the external interface, AcpiReleaseGlobalLock
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExReleaseMutexObject (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (ExReleaseMutexObject);
+
+
+ if (ObjDesc->Mutex.AcquisitionDepth == 0)
+ {
+ return (AE_NOT_ACQUIRED);
+ }
+
+ /* Match multiple Acquires with multiple Releases */
+
+ ObjDesc->Mutex.AcquisitionDepth--;
+ if (ObjDesc->Mutex.AcquisitionDepth != 0)
+ {
+ /* Just decrement the depth and return */
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ if (ObjDesc->Mutex.OwnerThread)
+ {
+ /* Unlink the mutex from the owner's list */
+
+ AcpiExUnlinkMutex (ObjDesc);
+ ObjDesc->Mutex.OwnerThread = NULL;
+ }
+
+ /* Release the mutex, special case for Global Lock */
+
+ if (ObjDesc == AcpiGbl_GlobalLockMutex)
+ {
+ Status = AcpiEvReleaseGlobalLock ();
+ }
+ else
+ {
+ AcpiOsReleaseMutex (ObjDesc->Mutex.OsMutex);
+ }
+
+ /* Clear mutex info */
+
+ ObjDesc->Mutex.ThreadId = 0;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExReleaseMutex
+ *
+ * PARAMETERS: ObjDesc - The object descriptor for this op
+ * WalkState - Current method execution state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Release a previously acquired Mutex.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExReleaseMutex (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (ExReleaseMutex);
+
+
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* The mutex must have been previously acquired in order to release it */
+
+ if (!ObjDesc->Mutex.OwnerThread)
+ {
+ ACPI_ERROR ((AE_INFO, "Cannot release Mutex [%4.4s], not acquired",
+ AcpiUtGetNodeName (ObjDesc->Mutex.Node)));
+ return_ACPI_STATUS (AE_AML_MUTEX_NOT_ACQUIRED);
+ }
+
+ /*
+ * The Mutex is owned, but this thread must be the owner.
+ * Special case for Global Lock, any thread can release
+ */
+ if ((ObjDesc->Mutex.OwnerThread->ThreadId != WalkState->Thread->ThreadId) &&
+ (ObjDesc != AcpiGbl_GlobalLockMutex))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Thread %X cannot release Mutex [%4.4s] acquired by thread %X",
+ WalkState->Thread->ThreadId,
+ AcpiUtGetNodeName (ObjDesc->Mutex.Node),
+ ObjDesc->Mutex.OwnerThread->ThreadId));
+ return_ACPI_STATUS (AE_AML_NOT_OWNER);
+ }
+
+ /* Must have a valid thread ID */
+
+ if (!WalkState->Thread)
+ {
+ ACPI_ERROR ((AE_INFO, "Cannot release Mutex [%4.4s], null thread info",
+ AcpiUtGetNodeName (ObjDesc->Mutex.Node)));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
+ /*
+ * The sync level of the mutex must be less than or equal to the current
+ * sync level
+ */
+ if (ObjDesc->Mutex.SyncLevel > WalkState->Thread->CurrentSyncLevel)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Cannot release Mutex [%4.4s], SyncLevel mismatch: mutex %d current %d",
+ AcpiUtGetNodeName (ObjDesc->Mutex.Node),
+ ObjDesc->Mutex.SyncLevel, WalkState->Thread->CurrentSyncLevel));
+ return_ACPI_STATUS (AE_AML_MUTEX_ORDER);
+ }
+
+ Status = AcpiExReleaseMutexObject (ObjDesc);
+
+ if (ObjDesc->Mutex.AcquisitionDepth == 0)
+ {
+ /* Restore the original SyncLevel */
+
+ WalkState->Thread->CurrentSyncLevel = ObjDesc->Mutex.OriginalSyncLevel;
+ }
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExReleaseAllMutexes
+ *
+ * PARAMETERS: Thread - Current executing thread object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Release all mutexes held by this thread
+ *
+ * NOTE: This function is called as the thread is exiting the interpreter.
+ * Mutexes are not released when an individual control method is exited, but
+ * only when the parent thread actually exits the interpreter. This allows one
+ * method to acquire a mutex, and a different method to release it, as long as
+ * this is performed underneath a single parent control method.
+ *
+ ******************************************************************************/
+
+void
+AcpiExReleaseAllMutexes (
+ ACPI_THREAD_STATE *Thread)
+{
+ ACPI_OPERAND_OBJECT *Next = Thread->AcquiredMutexList;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Traverse the list of owned mutexes, releasing each one */
+
+ while (Next)
+ {
+ ObjDesc = Next;
+ Next = ObjDesc->Mutex.Next;
+
+ ObjDesc->Mutex.Prev = NULL;
+ ObjDesc->Mutex.Next = NULL;
+ ObjDesc->Mutex.AcquisitionDepth = 0;
+
+ /* Release the mutex, special case for Global Lock */
+
+ if (ObjDesc == AcpiGbl_GlobalLockMutex)
+ {
+ /* Ignore errors */
+
+ (void) AcpiEvReleaseGlobalLock ();
+ }
+ else
+ {
+ AcpiOsReleaseMutex (ObjDesc->Mutex.OsMutex);
+ }
+
+ /* Mark mutex unowned */
+
+ ObjDesc->Mutex.OwnerThread = NULL;
+ ObjDesc->Mutex.ThreadId = 0;
+
+ /* Update Thread SyncLevel (Last mutex is the important one) */
+
+ Thread->CurrentSyncLevel = ObjDesc->Mutex.OriginalSyncLevel;
+ }
+}
+
+
diff --git a/sys/contrib/dev/acpica/exnames.c b/sys/contrib/dev/acpica/exnames.c
new file mode 100644
index 0000000..1304adb
--- /dev/null
+++ b/sys/contrib/dev/acpica/exnames.c
@@ -0,0 +1,560 @@
+
+/******************************************************************************
+ *
+ * Module Name: exnames - interpreter/scanner name load/execute
+ * $Revision: 1.111 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXNAMES_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exnames")
+
+/* Local prototypes */
+
+static char *
+AcpiExAllocateNameString (
+ UINT32 PrefixCount,
+ UINT32 NumNameSegs);
+
+static ACPI_STATUS
+AcpiExNameSegment (
+ UINT8 **InAmlAddress,
+ char *NameString);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExAllocateNameString
+ *
+ * PARAMETERS: PrefixCount - Count of parent levels. Special cases:
+ * (-1)==root, 0==none
+ * NumNameSegs - count of 4-character name segments
+ *
+ * RETURN: A pointer to the allocated string segment. This segment must
+ * be deleted by the caller.
+ *
+ * DESCRIPTION: Allocate a buffer for a name string. Ensure allocated name
+ * string is long enough, and set up prefix if any.
+ *
+ ******************************************************************************/
+
+static char *
+AcpiExAllocateNameString (
+ UINT32 PrefixCount,
+ UINT32 NumNameSegs)
+{
+ char *TempPtr;
+ char *NameString;
+ UINT32 SizeNeeded;
+
+ ACPI_FUNCTION_TRACE (ExAllocateNameString);
+
+
+ /*
+ * Allow room for all \ and ^ prefixes, all segments and a MultiNamePrefix.
+ * Also, one byte for the null terminator.
+ * This may actually be somewhat longer than needed.
+ */
+ if (PrefixCount == ACPI_UINT32_MAX)
+ {
+ /* Special case for root */
+
+ SizeNeeded = 1 + (ACPI_NAME_SIZE * NumNameSegs) + 2 + 1;
+ }
+ else
+ {
+ SizeNeeded = PrefixCount + (ACPI_NAME_SIZE * NumNameSegs) + 2 + 1;
+ }
+
+ /*
+ * Allocate a buffer for the name.
+ * This buffer must be deleted by the caller!
+ */
+ NameString = ACPI_ALLOCATE (SizeNeeded);
+ if (!NameString)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not allocate size %d", SizeNeeded));
+ return_PTR (NULL);
+ }
+
+ TempPtr = NameString;
+
+ /* Set up Root or Parent prefixes if needed */
+
+ if (PrefixCount == ACPI_UINT32_MAX)
+ {
+ *TempPtr++ = AML_ROOT_PREFIX;
+ }
+ else
+ {
+ while (PrefixCount--)
+ {
+ *TempPtr++ = AML_PARENT_PREFIX;
+ }
+ }
+
+
+ /* Set up Dual or Multi prefixes if needed */
+
+ if (NumNameSegs > 2)
+ {
+ /* Set up multi prefixes */
+
+ *TempPtr++ = AML_MULTI_NAME_PREFIX_OP;
+ *TempPtr++ = (char) NumNameSegs;
+ }
+ else if (2 == NumNameSegs)
+ {
+ /* Set up dual prefixes */
+
+ *TempPtr++ = AML_DUAL_NAME_PREFIX;
+ }
+
+ /*
+ * Terminate string following prefixes. AcpiExNameSegment() will
+ * append the segment(s)
+ */
+ *TempPtr = 0;
+
+ return_PTR (NameString);
+}
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExNameSegment
+ *
+ * PARAMETERS: InAmlAddress - Pointer to the name in the AML code
+ * NameString - Where to return the name. The name is appended
+ * to any existing string to form a namepath
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Extract an ACPI name (4 bytes) from the AML byte stream
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiExNameSegment (
+ UINT8 **InAmlAddress,
+ char *NameString)
+{
+ char *AmlAddress = (void *) *InAmlAddress;
+ ACPI_STATUS Status = AE_OK;
+ UINT32 Index;
+ char CharBuf[5];
+
+
+ ACPI_FUNCTION_TRACE (ExNameSegment);
+
+
+ /*
+ * If first character is a digit, then we know that we aren't looking at a
+ * valid name segment
+ */
+ CharBuf[0] = *AmlAddress;
+
+ if ('0' <= CharBuf[0] && CharBuf[0] <= '9')
+ {
+ ACPI_ERROR ((AE_INFO, "Invalid leading digit: %c", CharBuf[0]));
+ return_ACPI_STATUS (AE_CTRL_PENDING);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "Bytes from stream:\n"));
+
+ for (Index = 0;
+ (Index < ACPI_NAME_SIZE) && (AcpiUtValidAcpiChar (*AmlAddress, 0));
+ Index++)
+ {
+ CharBuf[Index] = *AmlAddress++;
+ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "%c\n", CharBuf[Index]));
+ }
+
+
+ /* Valid name segment */
+
+ if (Index == 4)
+ {
+ /* Found 4 valid characters */
+
+ CharBuf[4] = '\0';
+
+ if (NameString)
+ {
+ ACPI_STRCAT (NameString, CharBuf);
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Appended to - %s\n", NameString));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "No Name string - %s\n", CharBuf));
+ }
+ }
+ else if (Index == 0)
+ {
+ /*
+ * First character was not a valid name character,
+ * so we are looking at something other than a name.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Leading character is not alpha: %02Xh (not a name)\n",
+ CharBuf[0]));
+ Status = AE_CTRL_PENDING;
+ }
+ else
+ {
+ /*
+ * Segment started with one or more valid characters, but fewer than
+ * the required 4
+ */
+ Status = AE_AML_BAD_NAME;
+ ACPI_ERROR ((AE_INFO,
+ "Bad character %02x in name, at %p",
+ *AmlAddress, AmlAddress));
+ }
+
+ *InAmlAddress = ACPI_CAST_PTR (UINT8, AmlAddress);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExGetNameString
+ *
+ * PARAMETERS: DataType - Object type to be associated with this
+ * name
+ * InAmlAddress - Pointer to the namestring in the AML code
+ * OutNameString - Where the namestring is returned
+ * OutNameLength - Length of the returned string
+ *
+ * RETURN: Status, namestring and length
+ *
+ * DESCRIPTION: Extract a full namepath from the AML byte stream,
+ * including any prefixes.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExGetNameString (
+ ACPI_OBJECT_TYPE DataType,
+ UINT8 *InAmlAddress,
+ char **OutNameString,
+ UINT32 *OutNameLength)
+{
+ ACPI_STATUS Status = AE_OK;
+ UINT8 *AmlAddress = InAmlAddress;
+ char *NameString = NULL;
+ UINT32 NumSegments;
+ UINT32 PrefixCount = 0;
+ BOOLEAN HasPrefix = FALSE;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExGetNameString, AmlAddress);
+
+
+ if (ACPI_TYPE_LOCAL_REGION_FIELD == DataType ||
+ ACPI_TYPE_LOCAL_BANK_FIELD == DataType ||
+ ACPI_TYPE_LOCAL_INDEX_FIELD == DataType)
+ {
+ /* Disallow prefixes for types associated with FieldUnit names */
+
+ NameString = AcpiExAllocateNameString (0, 1);
+ if (!NameString)
+ {
+ Status = AE_NO_MEMORY;
+ }
+ else
+ {
+ Status = AcpiExNameSegment (&AmlAddress, NameString);
+ }
+ }
+ else
+ {
+ /*
+ * DataType is not a field name.
+ * Examine first character of name for root or parent prefix operators
+ */
+ switch (*AmlAddress)
+ {
+ case AML_ROOT_PREFIX:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "RootPrefix(\\) at %p\n",
+ AmlAddress));
+
+ /*
+ * Remember that we have a RootPrefix --
+ * see comment in AcpiExAllocateNameString()
+ */
+ AmlAddress++;
+ PrefixCount = ACPI_UINT32_MAX;
+ HasPrefix = TRUE;
+ break;
+
+
+ case AML_PARENT_PREFIX:
+
+ /* Increment past possibly multiple parent prefixes */
+
+ do
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "ParentPrefix (^) at %p\n",
+ AmlAddress));
+
+ AmlAddress++;
+ PrefixCount++;
+
+ } while (*AmlAddress == AML_PARENT_PREFIX);
+
+ HasPrefix = TRUE;
+ break;
+
+
+ default:
+
+ /* Not a prefix character */
+
+ break;
+ }
+
+ /* Examine first character of name for name segment prefix operator */
+
+ switch (*AmlAddress)
+ {
+ case AML_DUAL_NAME_PREFIX:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "DualNamePrefix at %p\n",
+ AmlAddress));
+
+ AmlAddress++;
+ NameString = AcpiExAllocateNameString (PrefixCount, 2);
+ if (!NameString)
+ {
+ Status = AE_NO_MEMORY;
+ break;
+ }
+
+ /* Indicate that we processed a prefix */
+
+ HasPrefix = TRUE;
+
+ Status = AcpiExNameSegment (&AmlAddress, NameString);
+ if (ACPI_SUCCESS (Status))
+ {
+ Status = AcpiExNameSegment (&AmlAddress, NameString);
+ }
+ break;
+
+
+ case AML_MULTI_NAME_PREFIX_OP:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_LOAD, "MultiNamePrefix at %p\n",
+ AmlAddress));
+
+ /* Fetch count of segments remaining in name path */
+
+ AmlAddress++;
+ NumSegments = *AmlAddress;
+
+ NameString = AcpiExAllocateNameString (PrefixCount, NumSegments);
+ if (!NameString)
+ {
+ Status = AE_NO_MEMORY;
+ break;
+ }
+
+ /* Indicate that we processed a prefix */
+
+ AmlAddress++;
+ HasPrefix = TRUE;
+
+ while (NumSegments &&
+ (Status = AcpiExNameSegment (&AmlAddress, NameString)) ==
+ AE_OK)
+ {
+ NumSegments--;
+ }
+
+ break;
+
+
+ case 0:
+
+ /* NullName valid as of 8-12-98 ASL/AML Grammar Update */
+
+ if (PrefixCount == ACPI_UINT32_MAX)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "NameSeg is \"\\\" followed by NULL\n"));
+ }
+
+ /* Consume the NULL byte */
+
+ AmlAddress++;
+ NameString = AcpiExAllocateNameString (PrefixCount, 0);
+ if (!NameString)
+ {
+ Status = AE_NO_MEMORY;
+ break;
+ }
+
+ break;
+
+
+ default:
+
+ /* Name segment string */
+
+ NameString = AcpiExAllocateNameString (PrefixCount, 1);
+ if (!NameString)
+ {
+ Status = AE_NO_MEMORY;
+ break;
+ }
+
+ Status = AcpiExNameSegment (&AmlAddress, NameString);
+ break;
+ }
+ }
+
+ if (AE_CTRL_PENDING == Status && HasPrefix)
+ {
+ /* Ran out of segments after processing a prefix */
+
+ ACPI_ERROR ((AE_INFO,
+ "Malformed Name at %p", NameString));
+ Status = AE_AML_BAD_NAME;
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ if (NameString)
+ {
+ ACPI_FREE (NameString);
+ }
+ return_ACPI_STATUS (Status);
+ }
+
+ *OutNameString = NameString;
+ *OutNameLength = (UINT32) (AmlAddress - InAmlAddress);
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exoparg1.c b/sys/contrib/dev/acpica/exoparg1.c
new file mode 100644
index 0000000..51f34af
--- /dev/null
+++ b/sys/contrib/dev/acpica/exoparg1.c
@@ -0,0 +1,1178 @@
+
+/******************************************************************************
+ *
+ * Module Name: exoparg1 - AML execution - opcodes with 1 argument
+ * $Revision: 1.184 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXOPARG1_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exoparg1")
+
+
+/*!
+ * Naming convention for AML interpreter execution routines.
+ *
+ * The routines that begin execution of AML opcodes are named with a common
+ * convention based upon the number of arguments, the number of target operands,
+ * and whether or not a value is returned:
+ *
+ * AcpiExOpcode_xA_yT_zR
+ *
+ * Where:
+ *
+ * xA - ARGUMENTS: The number of arguments (input operands) that are
+ * required for this opcode type (0 through 6 args).
+ * yT - TARGETS: The number of targets (output operands) that are required
+ * for this opcode type (0, 1, or 2 targets).
+ * zR - RETURN VALUE: Indicates whether this opcode type returns a value
+ * as the function return (0 or 1).
+ *
+ * The AcpiExOpcode* functions are called via the Dispatcher component with
+ * fully resolved operands.
+!*/
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_0A_0T_1R
+ *
+ * PARAMETERS: WalkState - Current state (contains AML opcode)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute operator with no operands, one return value
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_0A_0T_1R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_0A_0T_1R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ /* Examine the AML opcode */
+
+ switch (WalkState->Opcode)
+ {
+ case AML_TIMER_OP: /* Timer () */
+
+ /* Create a return object of type Integer */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+ ReturnDesc->Integer.Value = AcpiOsGetTimer ();
+ break;
+
+ default: /* Unknown opcode */
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ break;
+ }
+
+Cleanup:
+
+ /* Delete return object on error */
+
+ if ((ACPI_FAILURE (Status)) || WalkState->ResultObj)
+ {
+ AcpiUtRemoveReference (ReturnDesc);
+ WalkState->ResultObj = NULL;
+ }
+ else
+ {
+ /* Save the return value */
+
+ WalkState->ResultObj = ReturnDesc;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_1A_0T_0R
+ *
+ * PARAMETERS: WalkState - Current state (contains AML opcode)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute Type 1 monadic operator with numeric operand on
+ * object stack
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_1A_0T_0R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_0T_0R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ /* Examine the AML opcode */
+
+ switch (WalkState->Opcode)
+ {
+ case AML_RELEASE_OP: /* Release (MutexObject) */
+
+ Status = AcpiExReleaseMutex (Operand[0], WalkState);
+ break;
+
+
+ case AML_RESET_OP: /* Reset (EventObject) */
+
+ Status = AcpiExSystemResetEvent (Operand[0]);
+ break;
+
+
+ case AML_SIGNAL_OP: /* Signal (EventObject) */
+
+ Status = AcpiExSystemSignalEvent (Operand[0]);
+ break;
+
+
+ case AML_SLEEP_OP: /* Sleep (MsecTime) */
+
+ Status = AcpiExSystemDoSuspend (Operand[0]->Integer.Value);
+ break;
+
+
+ case AML_STALL_OP: /* Stall (UsecTime) */
+
+ Status = AcpiExSystemDoStall ((UINT32) Operand[0]->Integer.Value);
+ break;
+
+
+ case AML_UNLOAD_OP: /* Unload (Handle) */
+
+ Status = AcpiExUnloadTable (Operand[0]);
+ break;
+
+
+ default: /* Unknown opcode */
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_1A_1T_0R
+ *
+ * PARAMETERS: WalkState - Current state (contains AML opcode)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute opcode with one argument, one target, and no
+ * return value.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_1A_1T_0R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_1T_0R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ /* Examine the AML opcode */
+
+ switch (WalkState->Opcode)
+ {
+ case AML_LOAD_OP:
+
+ Status = AcpiExLoadOp (Operand[0], Operand[1], WalkState);
+ break;
+
+ default: /* Unknown opcode */
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ goto Cleanup;
+ }
+
+
+Cleanup:
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_1A_1T_1R
+ *
+ * PARAMETERS: WalkState - Current state (contains AML opcode)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute opcode with one argument, one target, and a
+ * return value.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_1A_1T_1R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
+ ACPI_OPERAND_OBJECT *ReturnDesc2 = NULL;
+ UINT32 Temp32;
+ UINT32 i;
+ ACPI_INTEGER PowerOfTen;
+ ACPI_INTEGER Digit;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_1T_1R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ /* Examine the AML opcode */
+
+ switch (WalkState->Opcode)
+ {
+ case AML_BIT_NOT_OP:
+ case AML_FIND_SET_LEFT_BIT_OP:
+ case AML_FIND_SET_RIGHT_BIT_OP:
+ case AML_FROM_BCD_OP:
+ case AML_TO_BCD_OP:
+ case AML_COND_REF_OF_OP:
+
+ /* Create a return object of type Integer for these opcodes */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ switch (WalkState->Opcode)
+ {
+ case AML_BIT_NOT_OP: /* Not (Operand, Result) */
+
+ ReturnDesc->Integer.Value = ~Operand[0]->Integer.Value;
+ break;
+
+
+ case AML_FIND_SET_LEFT_BIT_OP: /* FindSetLeftBit (Operand, Result) */
+
+ ReturnDesc->Integer.Value = Operand[0]->Integer.Value;
+
+ /*
+ * Acpi specification describes Integer type as a little
+ * endian unsigned value, so this boundary condition is valid.
+ */
+ for (Temp32 = 0; ReturnDesc->Integer.Value &&
+ Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)
+ {
+ ReturnDesc->Integer.Value >>= 1;
+ }
+
+ ReturnDesc->Integer.Value = Temp32;
+ break;
+
+
+ case AML_FIND_SET_RIGHT_BIT_OP: /* FindSetRightBit (Operand, Result) */
+
+ ReturnDesc->Integer.Value = Operand[0]->Integer.Value;
+
+ /*
+ * The Acpi specification describes Integer type as a little
+ * endian unsigned value, so this boundary condition is valid.
+ */
+ for (Temp32 = 0; ReturnDesc->Integer.Value &&
+ Temp32 < ACPI_INTEGER_BIT_SIZE; ++Temp32)
+ {
+ ReturnDesc->Integer.Value <<= 1;
+ }
+
+ /* Since the bit position is one-based, subtract from 33 (65) */
+
+ ReturnDesc->Integer.Value =
+ Temp32 == 0 ? 0 : (ACPI_INTEGER_BIT_SIZE + 1) - Temp32;
+ break;
+
+
+ case AML_FROM_BCD_OP: /* FromBcd (BCDValue, Result) */
+
+ /*
+ * The 64-bit ACPI integer can hold 16 4-bit BCD characters
+ * (if table is 32-bit, integer can hold 8 BCD characters)
+ * Convert each 4-bit BCD value
+ */
+ PowerOfTen = 1;
+ ReturnDesc->Integer.Value = 0;
+ Digit = Operand[0]->Integer.Value;
+
+ /* Convert each BCD digit (each is one nybble wide) */
+
+ for (i = 0; (i < AcpiGbl_IntegerNybbleWidth) && (Digit > 0); i++)
+ {
+ /* Get the least significant 4-bit BCD digit */
+
+ Temp32 = ((UINT32) Digit) & 0xF;
+
+ /* Check the range of the digit */
+
+ if (Temp32 > 9)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "BCD digit too large (not decimal): 0x%X",
+ Temp32));
+
+ Status = AE_AML_NUMERIC_OVERFLOW;
+ goto Cleanup;
+ }
+
+ /* Sum the digit into the result with the current power of 10 */
+
+ ReturnDesc->Integer.Value +=
+ (((ACPI_INTEGER) Temp32) * PowerOfTen);
+
+ /* Shift to next BCD digit */
+
+ Digit >>= 4;
+
+ /* Next power of 10 */
+
+ PowerOfTen *= 10;
+ }
+ break;
+
+
+ case AML_TO_BCD_OP: /* ToBcd (Operand, Result) */
+
+ ReturnDesc->Integer.Value = 0;
+ Digit = Operand[0]->Integer.Value;
+
+ /* Each BCD digit is one nybble wide */
+
+ for (i = 0; (i < AcpiGbl_IntegerNybbleWidth) && (Digit > 0); i++)
+ {
+ (void) AcpiUtShortDivide (Digit, 10, &Digit, &Temp32);
+
+ /*
+ * Insert the BCD digit that resides in the
+ * remainder from above
+ */
+ ReturnDesc->Integer.Value |=
+ (((ACPI_INTEGER) Temp32) << ACPI_MUL_4 (i));
+ }
+
+ /* Overflow if there is any data left in Digit */
+
+ if (Digit > 0)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Integer too large to convert to BCD: %8.8X%8.8X",
+ ACPI_FORMAT_UINT64 (Operand[0]->Integer.Value)));
+ Status = AE_AML_NUMERIC_OVERFLOW;
+ goto Cleanup;
+ }
+ break;
+
+
+ case AML_COND_REF_OF_OP: /* CondRefOf (SourceObject, Result) */
+
+ /*
+ * This op is a little strange because the internal return value is
+ * different than the return value stored in the result descriptor
+ * (There are really two return values)
+ */
+ if ((ACPI_NAMESPACE_NODE *) Operand[0] == AcpiGbl_RootNode)
+ {
+ /*
+ * This means that the object does not exist in the namespace,
+ * return FALSE
+ */
+ ReturnDesc->Integer.Value = 0;
+ goto Cleanup;
+ }
+
+ /* Get the object reference, store it, and remove our reference */
+
+ Status = AcpiExGetObjectReference (Operand[0],
+ &ReturnDesc2, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ Status = AcpiExStore (ReturnDesc2, Operand[1], WalkState);
+ AcpiUtRemoveReference (ReturnDesc2);
+
+ /* The object exists in the namespace, return TRUE */
+
+ ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;
+ goto Cleanup;
+
+
+ default:
+ /* No other opcodes get here */
+ break;
+ }
+ break;
+
+
+ case AML_STORE_OP: /* Store (Source, Target) */
+
+ /*
+ * A store operand is typically a number, string, buffer or lvalue
+ * Be careful about deleting the source object,
+ * since the object itself may have been stored.
+ */
+ Status = AcpiExStore (Operand[0], Operand[1], WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* It is possible that the Store already produced a return object */
+
+ if (!WalkState->ResultObj)
+ {
+ /*
+ * Normally, we would remove a reference on the Operand[0]
+ * parameter; But since it is being used as the internal return
+ * object (meaning we would normally increment it), the two
+ * cancel out, and we simply don't do anything.
+ */
+ WalkState->ResultObj = Operand[0];
+ WalkState->Operands[0] = NULL; /* Prevent deletion */
+ }
+ return_ACPI_STATUS (Status);
+
+
+ /*
+ * ACPI 2.0 Opcodes
+ */
+ case AML_COPY_OP: /* Copy (Source, Target) */
+
+ Status = AcpiUtCopyIobjectToIobject (Operand[0], &ReturnDesc,
+ WalkState);
+ break;
+
+
+ case AML_TO_DECSTRING_OP: /* ToDecimalString (Data, Result) */
+
+ Status = AcpiExConvertToString (Operand[0], &ReturnDesc,
+ ACPI_EXPLICIT_CONVERT_DECIMAL);
+ if (ReturnDesc == Operand[0])
+ {
+ /* No conversion performed, add ref to handle return value */
+ AcpiUtAddReference (ReturnDesc);
+ }
+ break;
+
+
+ case AML_TO_HEXSTRING_OP: /* ToHexString (Data, Result) */
+
+ Status = AcpiExConvertToString (Operand[0], &ReturnDesc,
+ ACPI_EXPLICIT_CONVERT_HEX);
+ if (ReturnDesc == Operand[0])
+ {
+ /* No conversion performed, add ref to handle return value */
+ AcpiUtAddReference (ReturnDesc);
+ }
+ break;
+
+
+ case AML_TO_BUFFER_OP: /* ToBuffer (Data, Result) */
+
+ Status = AcpiExConvertToBuffer (Operand[0], &ReturnDesc);
+ if (ReturnDesc == Operand[0])
+ {
+ /* No conversion performed, add ref to handle return value */
+ AcpiUtAddReference (ReturnDesc);
+ }
+ break;
+
+
+ case AML_TO_INTEGER_OP: /* ToInteger (Data, Result) */
+
+ Status = AcpiExConvertToInteger (Operand[0], &ReturnDesc,
+ ACPI_ANY_BASE);
+ if (ReturnDesc == Operand[0])
+ {
+ /* No conversion performed, add ref to handle return value */
+ AcpiUtAddReference (ReturnDesc);
+ }
+ break;
+
+
+ case AML_SHIFT_LEFT_BIT_OP: /* ShiftLeftBit (Source, BitNum) */
+ case AML_SHIFT_RIGHT_BIT_OP: /* ShiftRightBit (Source, BitNum) */
+
+ /* These are two obsolete opcodes */
+
+ ACPI_ERROR ((AE_INFO,
+ "%s is obsolete and not implemented",
+ AcpiPsGetOpcodeName (WalkState->Opcode)));
+ Status = AE_SUPPORT;
+ goto Cleanup;
+
+
+ default: /* Unknown opcode */
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ goto Cleanup;
+ }
+
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Store the return value computed above into the target object */
+
+ Status = AcpiExStore (ReturnDesc, Operand[1], WalkState);
+ }
+
+
+Cleanup:
+
+ /* Delete return object on error */
+
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ReturnDesc);
+ }
+
+ /* Save return object on success */
+
+ else if (!WalkState->ResultObj)
+ {
+ WalkState->ResultObj = ReturnDesc;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_1A_0T_1R
+ *
+ * PARAMETERS: WalkState - Current state (contains AML opcode)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute opcode with one argument, no target, and a return value
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_1A_0T_1R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *TempDesc;
+ ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
+ ACPI_STATUS Status = AE_OK;
+ UINT32 Type;
+ ACPI_INTEGER Value;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_1A_0T_1R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ /* Examine the AML opcode */
+
+ switch (WalkState->Opcode)
+ {
+ case AML_LNOT_OP: /* LNot (Operand) */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /*
+ * Set result to ONES (TRUE) if Value == 0. Note:
+ * ReturnDesc->Integer.Value is initially == 0 (FALSE) from above.
+ */
+ if (!Operand[0]->Integer.Value)
+ {
+ ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;
+ }
+ break;
+
+
+ case AML_DECREMENT_OP: /* Decrement (Operand) */
+ case AML_INCREMENT_OP: /* Increment (Operand) */
+
+ /*
+ * Create a new integer. Can't just get the base integer and
+ * increment it because it may be an Arg or Field.
+ */
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /*
+ * Since we are expecting a Reference operand, it can be either a
+ * NS Node or an internal object.
+ */
+ TempDesc = Operand[0];
+ if (ACPI_GET_DESCRIPTOR_TYPE (TempDesc) == ACPI_DESC_TYPE_OPERAND)
+ {
+ /* Internal reference object - prevent deletion */
+
+ AcpiUtAddReference (TempDesc);
+ }
+
+ /*
+ * Convert the Reference operand to an Integer (This removes a
+ * reference on the Operand[0] object)
+ *
+ * NOTE: We use LNOT_OP here in order to force resolution of the
+ * reference operand to an actual integer.
+ */
+ Status = AcpiExResolveOperands (AML_LNOT_OP, &TempDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "While resolving operands for [%s]",
+ AcpiPsGetOpcodeName (WalkState->Opcode)));
+
+ goto Cleanup;
+ }
+
+ /*
+ * TempDesc is now guaranteed to be an Integer object --
+ * Perform the actual increment or decrement
+ */
+ if (WalkState->Opcode == AML_INCREMENT_OP)
+ {
+ ReturnDesc->Integer.Value = TempDesc->Integer.Value +1;
+ }
+ else
+ {
+ ReturnDesc->Integer.Value = TempDesc->Integer.Value -1;
+ }
+
+ /* Finished with this Integer object */
+
+ AcpiUtRemoveReference (TempDesc);
+
+ /*
+ * Store the result back (indirectly) through the original
+ * Reference object
+ */
+ Status = AcpiExStore (ReturnDesc, Operand[0], WalkState);
+ break;
+
+
+ case AML_TYPE_OP: /* ObjectType (SourceObject) */
+
+ /*
+ * Note: The operand is not resolved at this point because we want to
+ * get the associated object, not its value. For example, we don't
+ * want to resolve a FieldUnit to its value, we want the actual
+ * FieldUnit object.
+ */
+
+ /* Get the type of the base object */
+
+ Status = AcpiExResolveMultiple (WalkState, Operand[0], &Type, NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /* Allocate a descriptor to hold the type. */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ ReturnDesc->Integer.Value = Type;
+ break;
+
+
+ case AML_SIZE_OF_OP: /* SizeOf (SourceObject) */
+
+ /*
+ * Note: The operand is not resolved at this point because we want to
+ * get the associated object, not its value.
+ */
+
+ /* Get the base object */
+
+ Status = AcpiExResolveMultiple (WalkState,
+ Operand[0], &Type, &TempDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /*
+ * The type of the base object must be integer, buffer, string, or
+ * package. All others are not supported.
+ *
+ * NOTE: Integer is not specifically supported by the ACPI spec,
+ * but is supported implicitly via implicit operand conversion.
+ * rather than bother with conversion, we just use the byte width
+ * global (4 or 8 bytes).
+ */
+ switch (Type)
+ {
+ case ACPI_TYPE_INTEGER:
+ Value = AcpiGbl_IntegerByteWidth;
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ Value = TempDesc->Buffer.Length;
+ break;
+
+ case ACPI_TYPE_STRING:
+ Value = TempDesc->String.Length;
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+ Value = TempDesc->Package.Count;
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Operand is not Buf/Int/Str/Pkg - found type %s",
+ AcpiUtGetTypeName (Type)));
+ Status = AE_AML_OPERAND_TYPE;
+ goto Cleanup;
+ }
+
+ /*
+ * Now that we have the size of the object, create a result
+ * object to hold the value
+ */
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ ReturnDesc->Integer.Value = Value;
+ break;
+
+
+ case AML_REF_OF_OP: /* RefOf (SourceObject) */
+
+ Status = AcpiExGetObjectReference (Operand[0], &ReturnDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+ break;
+
+
+ case AML_DEREF_OF_OP: /* DerefOf (ObjReference | String) */
+
+ /* Check for a method local or argument, or standalone String */
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_NAMED)
+ {
+ TempDesc = AcpiNsGetAttachedObject (
+ (ACPI_NAMESPACE_NODE *) Operand[0]);
+ if (TempDesc &&
+ ((ACPI_GET_OBJECT_TYPE (TempDesc) == ACPI_TYPE_STRING) ||
+ (ACPI_GET_OBJECT_TYPE (TempDesc) == ACPI_TYPE_LOCAL_REFERENCE)))
+ {
+ Operand[0] = TempDesc;
+ AcpiUtAddReference (TempDesc);
+ }
+ else
+ {
+ Status = AE_AML_OPERAND_TYPE;
+ goto Cleanup;
+ }
+ }
+ else
+ {
+ switch (ACPI_GET_OBJECT_TYPE (Operand[0]))
+ {
+ case ACPI_TYPE_LOCAL_REFERENCE:
+ /*
+ * This is a DerefOf (LocalX | ArgX)
+ *
+ * Must resolve/dereference the local/arg reference first
+ */
+ switch (Operand[0]->Reference.Opcode)
+ {
+ case AML_LOCAL_OP:
+ case AML_ARG_OP:
+
+ /* Set Operand[0] to the value of the local/arg */
+
+ Status = AcpiDsMethodDataGetValue (
+ Operand[0]->Reference.Opcode,
+ Operand[0]->Reference.Offset,
+ WalkState, &TempDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /*
+ * Delete our reference to the input object and
+ * point to the object just retrieved
+ */
+ AcpiUtRemoveReference (Operand[0]);
+ Operand[0] = TempDesc;
+ break;
+
+ case AML_REF_OF_OP:
+
+ /* Get the object to which the reference refers */
+
+ TempDesc = Operand[0]->Reference.Object;
+ AcpiUtRemoveReference (Operand[0]);
+ Operand[0] = TempDesc;
+ break;
+
+ default:
+
+ /* Must be an Index op - handled below */
+ break;
+ }
+ break;
+
+ case ACPI_TYPE_STRING:
+ break;
+
+ default:
+ Status = AE_AML_OPERAND_TYPE;
+ goto Cleanup;
+ }
+ }
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) != ACPI_DESC_TYPE_NAMED)
+ {
+ if (ACPI_GET_OBJECT_TYPE (Operand[0]) == ACPI_TYPE_STRING)
+ {
+ /*
+ * This is a DerefOf (String). The string is a reference
+ * to a named ACPI object.
+ *
+ * 1) Find the owning Node
+ * 2) Dereference the node to an actual object. Could be a
+ * Field, so we need to resolve the node to a value.
+ */
+ Status = AcpiNsGetNode (WalkState->ScopeInfo->Scope.Node,
+ Operand[0]->String.Pointer,
+ ACPI_NS_SEARCH_PARENT,
+ ACPI_CAST_INDIRECT_PTR (
+ ACPI_NAMESPACE_NODE, &ReturnDesc));
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ Status = AcpiExResolveNodeToValue (
+ ACPI_CAST_INDIRECT_PTR (
+ ACPI_NAMESPACE_NODE, &ReturnDesc),
+ WalkState);
+ goto Cleanup;
+ }
+ }
+
+ /* Operand[0] may have changed from the code above */
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Operand[0]) == ACPI_DESC_TYPE_NAMED)
+ {
+ /*
+ * This is a DerefOf (ObjectReference)
+ * Get the actual object from the Node (This is the dereference).
+ * This case may only happen when a LocalX or ArgX is
+ * dereferenced above.
+ */
+ ReturnDesc = AcpiNsGetAttachedObject (
+ (ACPI_NAMESPACE_NODE *) Operand[0]);
+ AcpiUtAddReference (ReturnDesc);
+ }
+ else
+ {
+ /*
+ * This must be a reference object produced by either the
+ * Index() or RefOf() operator
+ */
+ switch (Operand[0]->Reference.Opcode)
+ {
+ case AML_INDEX_OP:
+
+ /*
+ * The target type for the Index operator must be
+ * either a Buffer or a Package
+ */
+ switch (Operand[0]->Reference.TargetType)
+ {
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ TempDesc = Operand[0]->Reference.Object;
+
+ /*
+ * Create a new object that contains one element of the
+ * buffer -- the element pointed to by the index.
+ *
+ * NOTE: index into a buffer is NOT a pointer to a
+ * sub-buffer of the main buffer, it is only a pointer to a
+ * single element (byte) of the buffer!
+ */
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /*
+ * Since we are returning the value of the buffer at the
+ * indexed location, we don't need to add an additional
+ * reference to the buffer itself.
+ */
+ ReturnDesc->Integer.Value =
+ TempDesc->Buffer.Pointer[Operand[0]->Reference.Offset];
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ /*
+ * Return the referenced element of the package. We must
+ * add another reference to the referenced object, however.
+ */
+ ReturnDesc = *(Operand[0]->Reference.Where);
+ if (ReturnDesc)
+ {
+ AcpiUtAddReference (ReturnDesc);
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO,
+ "Unknown Index TargetType %X in obj %p",
+ Operand[0]->Reference.TargetType, Operand[0]));
+ Status = AE_AML_OPERAND_TYPE;
+ goto Cleanup;
+ }
+ break;
+
+
+ case AML_REF_OF_OP:
+
+ ReturnDesc = Operand[0]->Reference.Object;
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (ReturnDesc) ==
+ ACPI_DESC_TYPE_NAMED)
+ {
+ ReturnDesc = AcpiNsGetAttachedObject (
+ (ACPI_NAMESPACE_NODE *) ReturnDesc);
+ }
+
+ /* Add another reference to the object! */
+
+ AcpiUtAddReference (ReturnDesc);
+ break;
+
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Unknown opcode in reference(%p) - %X",
+ Operand[0], Operand[0]->Reference.Opcode));
+
+ Status = AE_TYPE;
+ goto Cleanup;
+ }
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ goto Cleanup;
+ }
+
+
+Cleanup:
+
+ /* Delete return object on error */
+
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ReturnDesc);
+ }
+
+ /* Save return object on success */
+
+ else
+ {
+ WalkState->ResultObj = ReturnDesc;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
diff --git a/sys/contrib/dev/acpica/exoparg2.c b/sys/contrib/dev/acpica/exoparg2.c
new file mode 100644
index 0000000..f7f05e4
--- /dev/null
+++ b/sys/contrib/dev/acpica/exoparg2.c
@@ -0,0 +1,741 @@
+/******************************************************************************
+ *
+ * Module Name: exoparg2 - AML execution - opcodes with 2 arguments
+ * $Revision: 1.143 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __EXOPARG2_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exoparg2")
+
+
+/*!
+ * Naming convention for AML interpreter execution routines.
+ *
+ * The routines that begin execution of AML opcodes are named with a common
+ * convention based upon the number of arguments, the number of target operands,
+ * and whether or not a value is returned:
+ *
+ * AcpiExOpcode_xA_yT_zR
+ *
+ * Where:
+ *
+ * xA - ARGUMENTS: The number of arguments (input operands) that are
+ * required for this opcode type (1 through 6 args).
+ * yT - TARGETS: The number of targets (output operands) that are required
+ * for this opcode type (0, 1, or 2 targets).
+ * zR - RETURN VALUE: Indicates whether this opcode type returns a value
+ * as the function return (0 or 1).
+ *
+ * The AcpiExOpcode* functions are called via the Dispatcher component with
+ * fully resolved operands.
+!*/
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_2A_0T_0R
+ *
+ * PARAMETERS: WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute opcode with two arguments, no target, and no return
+ * value.
+ *
+ * ALLOCATION: Deletes both operands
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_2A_0T_0R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_NAMESPACE_NODE *Node;
+ UINT32 Value;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_0T_0R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ /* Examine the opcode */
+
+ switch (WalkState->Opcode)
+ {
+ case AML_NOTIFY_OP: /* Notify (NotifyObject, NotifyValue) */
+
+ /* The first operand is a namespace node */
+
+ Node = (ACPI_NAMESPACE_NODE *) Operand[0];
+
+ /* Second value is the notify value */
+
+ Value = (UINT32) Operand[1]->Integer.Value;
+
+ /* Are notifies allowed on this object? */
+
+ if (!AcpiEvIsNotifyObject (Node))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Unexpected notify object type [%s]",
+ AcpiUtGetTypeName (Node->Type)));
+
+ Status = AE_AML_OPERAND_TYPE;
+ break;
+ }
+
+#ifdef ACPI_GPE_NOTIFY_CHECK
+ /*
+ * GPE method wake/notify check. Here, we want to ensure that we
+ * don't receive any "DeviceWake" Notifies from a GPE _Lxx or _Exx
+ * GPE method during system runtime. If we do, the GPE is marked
+ * as "wake-only" and disabled.
+ *
+ * 1) Is the Notify() value == DeviceWake?
+ * 2) Is this a GPE deferred method? (An _Lxx or _Exx method)
+ * 3) Did the original GPE happen at system runtime?
+ * (versus during wake)
+ *
+ * If all three cases are true, this is a wake-only GPE that should
+ * be disabled at runtime.
+ */
+ if (Value == 2) /* DeviceWake */
+ {
+ Status = AcpiEvCheckForWakeOnlyGpe (WalkState->GpeEventInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ /* AE_WAKE_ONLY_GPE only error, means ignore this notify */
+
+ return_ACPI_STATUS (AE_OK)
+ }
+ }
+#endif
+
+ /*
+ * Dispatch the notify to the appropriate handler
+ * NOTE: the request is queued for execution after this method
+ * completes. The notify handlers are NOT invoked synchronously
+ * from this thread -- because handlers may in turn run other
+ * control methods.
+ */
+ Status = AcpiEvQueueNotifyRequest (Node, Value);
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_2A_2T_1R
+ *
+ * PARAMETERS: WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute a dyadic operator (2 operands) with 2 output targets
+ * and one implicit return value.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_2A_2T_1R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *ReturnDesc1 = NULL;
+ ACPI_OPERAND_OBJECT *ReturnDesc2 = NULL;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_2T_1R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ /* Execute the opcode */
+
+ switch (WalkState->Opcode)
+ {
+ case AML_DIVIDE_OP:
+
+ /* Divide (Dividend, Divisor, RemainderResult QuotientResult) */
+
+ ReturnDesc1 = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc1)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ ReturnDesc2 = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc2)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /* Quotient to ReturnDesc1, remainder to ReturnDesc2 */
+
+ Status = AcpiUtDivide (Operand[0]->Integer.Value,
+ Operand[1]->Integer.Value,
+ &ReturnDesc1->Integer.Value,
+ &ReturnDesc2->Integer.Value);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ goto Cleanup;
+ }
+
+ /* Store the results to the target reference operands */
+
+ Status = AcpiExStore (ReturnDesc2, Operand[2], WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ Status = AcpiExStore (ReturnDesc1, Operand[3], WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+Cleanup:
+ /*
+ * Since the remainder is not returned indirectly, remove a reference to
+ * it. Only the quotient is returned indirectly.
+ */
+ AcpiUtRemoveReference (ReturnDesc2);
+
+ if (ACPI_FAILURE (Status))
+ {
+ /* Delete the return object */
+
+ AcpiUtRemoveReference (ReturnDesc1);
+ }
+
+ /* Save return object (the remainder) on success */
+
+ else
+ {
+ WalkState->ResultObj = ReturnDesc1;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_2A_1T_1R
+ *
+ * PARAMETERS: WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute opcode with two arguments, one target, and a return
+ * value.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_2A_1T_1R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
+ ACPI_INTEGER Index;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_SIZE Length;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_1T_1R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ /* Execute the opcode */
+
+ if (WalkState->OpInfo->Flags & AML_MATH)
+ {
+ /* All simple math opcodes (add, etc.) */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ ReturnDesc->Integer.Value = AcpiExDoMathOp (WalkState->Opcode,
+ Operand[0]->Integer.Value,
+ Operand[1]->Integer.Value);
+ goto StoreResultToTarget;
+ }
+
+ switch (WalkState->Opcode)
+ {
+ case AML_MOD_OP: /* Mod (Dividend, Divisor, RemainderResult (ACPI 2.0) */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /* ReturnDesc will contain the remainder */
+
+ Status = AcpiUtDivide (Operand[0]->Integer.Value,
+ Operand[1]->Integer.Value,
+ NULL,
+ &ReturnDesc->Integer.Value);
+ break;
+
+
+ case AML_CONCAT_OP: /* Concatenate (Data1, Data2, Result) */
+
+ Status = AcpiExDoConcatenate (Operand[0], Operand[1],
+ &ReturnDesc, WalkState);
+ break;
+
+
+ case AML_TO_STRING_OP: /* ToString (Buffer, Length, Result) (ACPI 2.0) */
+
+ /*
+ * Input object is guaranteed to be a buffer at this point (it may have
+ * been converted.) Copy the raw buffer data to a new object of
+ * type String.
+ */
+
+ /*
+ * Get the length of the new string. It is the smallest of:
+ * 1) Length of the input buffer
+ * 2) Max length as specified in the ToString operator
+ * 3) Length of input buffer up to a zero byte (null terminator)
+ *
+ * NOTE: A length of zero is ok, and will create a zero-length, null
+ * terminated string.
+ */
+ Length = 0;
+ while ((Length < Operand[0]->Buffer.Length) &&
+ (Length < Operand[1]->Integer.Value) &&
+ (Operand[0]->Buffer.Pointer[Length]))
+ {
+ Length++;
+ }
+
+ /* Allocate a new string object */
+
+ ReturnDesc = AcpiUtCreateStringObject (Length);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /*
+ * Copy the raw buffer data with no transform.
+ * (NULL terminated already)
+ */
+ ACPI_MEMCPY (ReturnDesc->String.Pointer,
+ Operand[0]->Buffer.Pointer, Length);
+ break;
+
+
+ case AML_CONCAT_RES_OP:
+
+ /* ConcatenateResTemplate (Buffer, Buffer, Result) (ACPI 2.0) */
+
+ Status = AcpiExConcatTemplate (Operand[0], Operand[1],
+ &ReturnDesc, WalkState);
+ break;
+
+
+ case AML_INDEX_OP: /* Index (Source Index Result) */
+
+ /* Create the internal return object */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_REFERENCE);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /* Initialize the Index reference object */
+
+ Index = Operand[1]->Integer.Value;
+ ReturnDesc->Reference.Offset = (UINT32) Index;
+ ReturnDesc->Reference.Opcode = AML_INDEX_OP;
+
+ /*
+ * At this point, the Source operand is a String, Buffer, or Package.
+ * Verify that the index is within range.
+ */
+ switch (ACPI_GET_OBJECT_TYPE (Operand[0]))
+ {
+ case ACPI_TYPE_STRING:
+
+ if (Index >= Operand[0]->String.Length)
+ {
+ Status = AE_AML_STRING_LIMIT;
+ }
+
+ ReturnDesc->Reference.TargetType = ACPI_TYPE_BUFFER_FIELD;
+ break;
+
+ case ACPI_TYPE_BUFFER:
+
+ if (Index >= Operand[0]->Buffer.Length)
+ {
+ Status = AE_AML_BUFFER_LIMIT;
+ }
+
+ ReturnDesc->Reference.TargetType = ACPI_TYPE_BUFFER_FIELD;
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+
+ if (Index >= Operand[0]->Package.Count)
+ {
+ Status = AE_AML_PACKAGE_LIMIT;
+ }
+
+ ReturnDesc->Reference.TargetType = ACPI_TYPE_PACKAGE;
+ ReturnDesc->Reference.Where = &Operand[0]->Package.Elements [Index];
+ break;
+
+ default:
+
+ Status = AE_AML_INTERNAL;
+ goto Cleanup;
+ }
+
+ /* Failure means that the Index was beyond the end of the object */
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Index (%X%8.8X) is beyond end of object",
+ ACPI_FORMAT_UINT64 (Index)));
+ goto Cleanup;
+ }
+
+ /*
+ * Save the target object and add a reference to it for the life
+ * of the index
+ */
+ ReturnDesc->Reference.Object = Operand[0];
+ AcpiUtAddReference (Operand[0]);
+
+ /* Store the reference to the Target */
+
+ Status = AcpiExStore (ReturnDesc, Operand[2], WalkState);
+
+ /* Return the reference */
+
+ WalkState->ResultObj = ReturnDesc;
+ goto Cleanup;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ break;
+ }
+
+
+StoreResultToTarget:
+
+ if (ACPI_SUCCESS (Status))
+ {
+ /*
+ * Store the result of the operation (which is now in ReturnDesc) into
+ * the Target descriptor.
+ */
+ Status = AcpiExStore (ReturnDesc, Operand[2], WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ if (!WalkState->ResultObj)
+ {
+ WalkState->ResultObj = ReturnDesc;
+ }
+ }
+
+
+Cleanup:
+
+ /* Delete return object on error */
+
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ReturnDesc);
+ WalkState->ResultObj = NULL;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_2A_0T_1R
+ *
+ * PARAMETERS: WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute opcode with 2 arguments, no target, and a return value
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_2A_0T_1R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
+ ACPI_STATUS Status = AE_OK;
+ BOOLEAN LogicalResult = FALSE;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_2A_0T_1R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ /* Create the internal return object */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /* Execute the Opcode */
+
+ if (WalkState->OpInfo->Flags & AML_LOGICAL_NUMERIC)
+ {
+ /* LogicalOp (Operand0, Operand1) */
+
+ Status = AcpiExDoLogicalNumericOp (WalkState->Opcode,
+ Operand[0]->Integer.Value, Operand[1]->Integer.Value,
+ &LogicalResult);
+ goto StoreLogicalResult;
+ }
+ else if (WalkState->OpInfo->Flags & AML_LOGICAL)
+ {
+ /* LogicalOp (Operand0, Operand1) */
+
+ Status = AcpiExDoLogicalOp (WalkState->Opcode, Operand[0],
+ Operand[1], &LogicalResult);
+ goto StoreLogicalResult;
+ }
+
+ switch (WalkState->Opcode)
+ {
+ case AML_ACQUIRE_OP: /* Acquire (MutexObject, Timeout) */
+
+ Status = AcpiExAcquireMutex (Operand[1], Operand[0], WalkState);
+ if (Status == AE_TIME)
+ {
+ LogicalResult = TRUE; /* TRUE = Acquire timed out */
+ Status = AE_OK;
+ }
+ break;
+
+
+ case AML_WAIT_OP: /* Wait (EventObject, Timeout) */
+
+ Status = AcpiExSystemWaitEvent (Operand[1], Operand[0]);
+ if (Status == AE_TIME)
+ {
+ LogicalResult = TRUE; /* TRUE, Wait timed out */
+ Status = AE_OK;
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ goto Cleanup;
+ }
+
+
+StoreLogicalResult:
+ /*
+ * Set return value to according to LogicalResult. logical TRUE (all ones)
+ * Default is FALSE (zero)
+ */
+ if (LogicalResult)
+ {
+ ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;
+ }
+
+Cleanup:
+
+ /* Delete return object on error */
+
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ReturnDesc);
+ }
+
+ /* Save return object on success */
+
+ else
+ {
+ WalkState->ResultObj = ReturnDesc;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exoparg3.c b/sys/contrib/dev/acpica/exoparg3.c
new file mode 100644
index 0000000..926e22a
--- /dev/null
+++ b/sys/contrib/dev/acpica/exoparg3.c
@@ -0,0 +1,377 @@
+
+/******************************************************************************
+ *
+ * Module Name: exoparg3 - AML execution - opcodes with 3 arguments
+ * $Revision: 1.35 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXOPARG3_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exoparg3")
+
+
+/*!
+ * Naming convention for AML interpreter execution routines.
+ *
+ * The routines that begin execution of AML opcodes are named with a common
+ * convention based upon the number of arguments, the number of target operands,
+ * and whether or not a value is returned:
+ *
+ * AcpiExOpcode_xA_yT_zR
+ *
+ * Where:
+ *
+ * xA - ARGUMENTS: The number of arguments (input operands) that are
+ * required for this opcode type (1 through 6 args).
+ * yT - TARGETS: The number of targets (output operands) that are required
+ * for this opcode type (0, 1, or 2 targets).
+ * zR - RETURN VALUE: Indicates whether this opcode type returns a value
+ * as the function return (0 or 1).
+ *
+ * The AcpiExOpcode* functions are called via the Dispatcher component with
+ * fully resolved operands.
+!*/
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_3A_0T_0R
+ *
+ * PARAMETERS: WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute Triadic operator (3 operands)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_3A_0T_0R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_SIGNAL_FATAL_INFO *Fatal;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_3A_0T_0R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ switch (WalkState->Opcode)
+ {
+ case AML_FATAL_OP: /* Fatal (FatalType FatalCode FatalArg) */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "FatalOp: Type %X Code %X Arg %X <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<\n",
+ (UINT32) Operand[0]->Integer.Value,
+ (UINT32) Operand[1]->Integer.Value,
+ (UINT32) Operand[2]->Integer.Value));
+
+ Fatal = ACPI_ALLOCATE (sizeof (ACPI_SIGNAL_FATAL_INFO));
+ if (Fatal)
+ {
+ Fatal->Type = (UINT32) Operand[0]->Integer.Value;
+ Fatal->Code = (UINT32) Operand[1]->Integer.Value;
+ Fatal->Argument = (UINT32) Operand[2]->Integer.Value;
+ }
+
+ /* Always signal the OS! */
+
+ Status = AcpiOsSignal (ACPI_SIGNAL_FATAL, Fatal);
+
+ /* Might return while OS is shutting down, just continue */
+
+ ACPI_FREE (Fatal);
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ goto Cleanup;
+ }
+
+
+Cleanup:
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_3A_1T_1R
+ *
+ * PARAMETERS: WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute Triadic operator (3 operands)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_3A_1T_1R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
+ char *Buffer = NULL;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_INTEGER Index;
+ ACPI_SIZE Length;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_3A_1T_1R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ switch (WalkState->Opcode)
+ {
+ case AML_MID_OP: /* Mid (Source[0], Index[1], Length[2], Result[3]) */
+
+ /*
+ * Create the return object. The Source operand is guaranteed to be
+ * either a String or a Buffer, so just use its type.
+ */
+ ReturnDesc = AcpiUtCreateInternalObject (
+ ACPI_GET_OBJECT_TYPE (Operand[0]));
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /* Get the Integer values from the objects */
+
+ Index = Operand[1]->Integer.Value;
+ Length = (ACPI_SIZE) Operand[2]->Integer.Value;
+
+ /*
+ * If the index is beyond the length of the String/Buffer, or if the
+ * requested length is zero, return a zero-length String/Buffer
+ */
+ if (Index >= Operand[0]->String.Length)
+ {
+ Length = 0;
+ }
+
+ /* Truncate request if larger than the actual String/Buffer */
+
+ else if ((Index + Length) > Operand[0]->String.Length)
+ {
+ Length = (ACPI_SIZE) Operand[0]->String.Length -
+ (ACPI_SIZE) Index;
+ }
+
+ /* Strings always have a sub-pointer, not so for buffers */
+
+ switch (ACPI_GET_OBJECT_TYPE (Operand[0]))
+ {
+ case ACPI_TYPE_STRING:
+
+ /* Always allocate a new buffer for the String */
+
+ Buffer = ACPI_ALLOCATE_ZEROED ((ACPI_SIZE) Length + 1);
+ if (!Buffer)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+ break;
+
+ case ACPI_TYPE_BUFFER:
+
+ /* If the requested length is zero, don't allocate a buffer */
+
+ if (Length > 0)
+ {
+ /* Allocate a new buffer for the Buffer */
+
+ Buffer = ACPI_ALLOCATE_ZEROED (Length);
+ if (!Buffer)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+ }
+ break;
+
+ default: /* Should not happen */
+
+ Status = AE_AML_OPERAND_TYPE;
+ goto Cleanup;
+ }
+
+ if (Buffer)
+ {
+ /* We have a buffer, copy the portion requested */
+
+ ACPI_MEMCPY (Buffer, Operand[0]->String.Pointer + Index,
+ Length);
+ }
+
+ /* Set the length of the new String/Buffer */
+
+ ReturnDesc->String.Pointer = Buffer;
+ ReturnDesc->String.Length = (UINT32) Length;
+
+ /* Mark buffer initialized */
+
+ ReturnDesc->Buffer.Flags |= AOPOBJ_DATA_VALID;
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ goto Cleanup;
+ }
+
+ /* Store the result in the target */
+
+ Status = AcpiExStore (ReturnDesc, Operand[3], WalkState);
+
+Cleanup:
+
+ /* Delete return object on error */
+
+ if (ACPI_FAILURE (Status) || WalkState->ResultObj)
+ {
+ AcpiUtRemoveReference (ReturnDesc);
+ WalkState->ResultObj = NULL;
+ }
+
+ /* Set the return object and exit */
+
+ else
+ {
+ WalkState->ResultObj = ReturnDesc;
+ }
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exoparg6.c b/sys/contrib/dev/acpica/exoparg6.c
new file mode 100644
index 0000000..e144bcf
--- /dev/null
+++ b/sys/contrib/dev/acpica/exoparg6.c
@@ -0,0 +1,441 @@
+
+/******************************************************************************
+ *
+ * Module Name: exoparg6 - AML execution - opcodes with 6 arguments
+ * $Revision: 1.29 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXOPARG6_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exoparg6")
+
+
+/*!
+ * Naming convention for AML interpreter execution routines.
+ *
+ * The routines that begin execution of AML opcodes are named with a common
+ * convention based upon the number of arguments, the number of target operands,
+ * and whether or not a value is returned:
+ *
+ * AcpiExOpcode_xA_yT_zR
+ *
+ * Where:
+ *
+ * xA - ARGUMENTS: The number of arguments (input operands) that are
+ * required for this opcode type (1 through 6 args).
+ * yT - TARGETS: The number of targets (output operands) that are required
+ * for this opcode type (0, 1, or 2 targets).
+ * zR - RETURN VALUE: Indicates whether this opcode type returns a value
+ * as the function return (0 or 1).
+ *
+ * The AcpiExOpcode* functions are called via the Dispatcher component with
+ * fully resolved operands.
+!*/
+
+/* Local prototypes */
+
+static BOOLEAN
+AcpiExDoMatch (
+ UINT32 MatchOp,
+ ACPI_OPERAND_OBJECT *PackageObj,
+ ACPI_OPERAND_OBJECT *MatchObj);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDoMatch
+ *
+ * PARAMETERS: MatchOp - The AML match operand
+ * PackageObj - Object from the target package
+ * MatchObj - Object to be matched
+ *
+ * RETURN: TRUE if the match is successful, FALSE otherwise
+ *
+ * DESCRIPTION: Implements the low-level match for the ASL Match operator.
+ * Package elements will be implicitly converted to the type of
+ * the match object (Integer/Buffer/String).
+ *
+ ******************************************************************************/
+
+static BOOLEAN
+AcpiExDoMatch (
+ UINT32 MatchOp,
+ ACPI_OPERAND_OBJECT *PackageObj,
+ ACPI_OPERAND_OBJECT *MatchObj)
+{
+ BOOLEAN LogicalResult = TRUE;
+ ACPI_STATUS Status;
+
+
+ /*
+ * Note: Since the PackageObj/MatchObj ordering is opposite to that of
+ * the standard logical operators, we have to reverse them when we call
+ * DoLogicalOp in order to make the implicit conversion rules work
+ * correctly. However, this means we have to flip the entire equation
+ * also. A bit ugly perhaps, but overall, better than fussing the
+ * parameters around at runtime, over and over again.
+ *
+ * Below, P[i] refers to the package element, M refers to the Match object.
+ */
+ switch (MatchOp)
+ {
+ case MATCH_MTR:
+
+ /* Always true */
+
+ break;
+
+ case MATCH_MEQ:
+
+ /*
+ * True if equal: (P[i] == M)
+ * Change to: (M == P[i])
+ */
+ Status = AcpiExDoLogicalOp (AML_LEQUAL_OP, MatchObj, PackageObj,
+ &LogicalResult);
+ if (ACPI_FAILURE (Status))
+ {
+ return (FALSE);
+ }
+ break;
+
+ case MATCH_MLE:
+
+ /*
+ * True if less than or equal: (P[i] <= M) (P[i] NotGreater than M)
+ * Change to: (M >= P[i]) (M NotLess than P[i])
+ */
+ Status = AcpiExDoLogicalOp (AML_LLESS_OP, MatchObj, PackageObj,
+ &LogicalResult);
+ if (ACPI_FAILURE (Status))
+ {
+ return (FALSE);
+ }
+ LogicalResult = (BOOLEAN) !LogicalResult;
+ break;
+
+ case MATCH_MLT:
+
+ /*
+ * True if less than: (P[i] < M)
+ * Change to: (M > P[i])
+ */
+ Status = AcpiExDoLogicalOp (AML_LGREATER_OP, MatchObj, PackageObj,
+ &LogicalResult);
+ if (ACPI_FAILURE (Status))
+ {
+ return (FALSE);
+ }
+ break;
+
+ case MATCH_MGE:
+
+ /*
+ * True if greater than or equal: (P[i] >= M) (P[i] NotLess than M)
+ * Change to: (M <= P[i]) (M NotGreater than P[i])
+ */
+ Status = AcpiExDoLogicalOp (AML_LGREATER_OP, MatchObj, PackageObj,
+ &LogicalResult);
+ if (ACPI_FAILURE (Status))
+ {
+ return (FALSE);
+ }
+ LogicalResult = (BOOLEAN)!LogicalResult;
+ break;
+
+ case MATCH_MGT:
+
+ /*
+ * True if greater than: (P[i] > M)
+ * Change to: (M < P[i])
+ */
+ Status = AcpiExDoLogicalOp (AML_LLESS_OP, MatchObj, PackageObj,
+ &LogicalResult);
+ if (ACPI_FAILURE (Status))
+ {
+ return (FALSE);
+ }
+ break;
+
+ default:
+
+ /* Undefined */
+
+ return (FALSE);
+ }
+
+ return LogicalResult;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExOpcode_6A_0T_1R
+ *
+ * PARAMETERS: WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute opcode with 6 arguments, no target, and a return value
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExOpcode_6A_0T_1R (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT **Operand = &WalkState->Operands[0];
+ ACPI_OPERAND_OBJECT *ReturnDesc = NULL;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_INTEGER Index;
+ ACPI_OPERAND_OBJECT *ThisElement;
+
+
+ ACPI_FUNCTION_TRACE_STR (ExOpcode_6A_0T_1R,
+ AcpiPsGetOpcodeName (WalkState->Opcode));
+
+
+ switch (WalkState->Opcode)
+ {
+ case AML_MATCH_OP:
+ /*
+ * Match (SearchPkg[0], MatchOp1[1], MatchObj1[2],
+ * MatchOp2[3], MatchObj2[4], StartIndex[5])
+ */
+
+ /* Validate both Match Term Operators (MTR, MEQ, etc.) */
+
+ if ((Operand[1]->Integer.Value > MAX_MATCH_OPERATOR) ||
+ (Operand[3]->Integer.Value > MAX_MATCH_OPERATOR))
+ {
+ ACPI_ERROR ((AE_INFO, "Match operator out of range"));
+ Status = AE_AML_OPERAND_VALUE;
+ goto Cleanup;
+ }
+
+ /* Get the package StartIndex, validate against the package length */
+
+ Index = Operand[5]->Integer.Value;
+ if (Index >= Operand[0]->Package.Count)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Index (%X%8.8X) beyond package end (%X)",
+ ACPI_FORMAT_UINT64 (Index), Operand[0]->Package.Count));
+ Status = AE_AML_PACKAGE_LIMIT;
+ goto Cleanup;
+ }
+
+ /* Create an integer for the return value */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+
+ }
+
+ /* Default return value if no match found */
+
+ ReturnDesc->Integer.Value = ACPI_INTEGER_MAX;
+
+ /*
+ * Examine each element until a match is found. Both match conditions
+ * must be satisfied for a match to occur. Within the loop,
+ * "continue" signifies that the current element does not match
+ * and the next should be examined.
+ *
+ * Upon finding a match, the loop will terminate via "break" at
+ * the bottom. If it terminates "normally", MatchValue will be
+ * ACPI_INTEGER_MAX (Ones) (its initial value) indicating that no
+ * match was found.
+ */
+ for ( ; Index < Operand[0]->Package.Count; Index++)
+ {
+ /* Get the current package element */
+
+ ThisElement = Operand[0]->Package.Elements[Index];
+
+ /* Treat any uninitialized (NULL) elements as non-matching */
+
+ if (!ThisElement)
+ {
+ continue;
+ }
+
+ /*
+ * Both match conditions must be satisfied. Execution of a continue
+ * (proceed to next iteration of enclosing for loop) signifies a
+ * non-match.
+ */
+ if (!AcpiExDoMatch ((UINT32) Operand[1]->Integer.Value,
+ ThisElement, Operand[2]))
+ {
+ continue;
+ }
+
+ if (!AcpiExDoMatch ((UINT32) Operand[3]->Integer.Value,
+ ThisElement, Operand[4]))
+ {
+ continue;
+ }
+
+ /* Match found: Index is the return value */
+
+ ReturnDesc->Integer.Value = Index;
+ break;
+ }
+ break;
+
+
+ case AML_LOAD_TABLE_OP:
+
+ Status = AcpiExLoadTableOp (WalkState, &ReturnDesc);
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ WalkState->Opcode));
+ Status = AE_AML_BAD_OPCODE;
+ goto Cleanup;
+ }
+
+
+Cleanup:
+
+ /* Delete return object on error */
+
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ReturnDesc);
+ }
+
+ /* Save return object on success */
+
+ else
+ {
+ WalkState->ResultObj = ReturnDesc;
+ }
+
+ return_ACPI_STATUS (Status);
+}
diff --git a/sys/contrib/dev/acpica/exprep.c b/sys/contrib/dev/acpica/exprep.c
new file mode 100644
index 0000000..b67db31
--- /dev/null
+++ b/sys/contrib/dev/acpica/exprep.c
@@ -0,0 +1,675 @@
+
+/******************************************************************************
+ *
+ * Module Name: exprep - ACPI AML (p-code) execution - field prep utilities
+ * $Revision: 1.142 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXPREP_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exprep")
+
+/* Local prototypes */
+
+static UINT32
+AcpiExDecodeFieldAccess (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT8 FieldFlags,
+ UINT32 *ReturnByteAlignment);
+
+
+#ifdef ACPI_UNDER_DEVELOPMENT
+
+static UINT32
+AcpiExGenerateAccess (
+ UINT32 FieldBitOffset,
+ UINT32 FieldBitLength,
+ UINT32 RegionLength);
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExGenerateAccess
+ *
+ * PARAMETERS: FieldBitOffset - Start of field within parent region/buffer
+ * FieldBitLength - Length of field in bits
+ * RegionLength - Length of parent in bytes
+ *
+ * RETURN: Field granularity (8, 16, 32 or 64) and
+ * ByteAlignment (1, 2, 3, or 4)
+ *
+ * DESCRIPTION: Generate an optimal access width for fields defined with the
+ * AnyAcc keyword.
+ *
+ * NOTE: Need to have the RegionLength in order to check for boundary
+ * conditions (end-of-region). However, the RegionLength is a deferred
+ * operation. Therefore, to complete this implementation, the generation
+ * of this access width must be deferred until the region length has
+ * been evaluated.
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiExGenerateAccess (
+ UINT32 FieldBitOffset,
+ UINT32 FieldBitLength,
+ UINT32 RegionLength)
+{
+ UINT32 FieldByteLength;
+ UINT32 FieldByteOffset;
+ UINT32 FieldByteEndOffset;
+ UINT32 AccessByteWidth;
+ UINT32 FieldStartOffset;
+ UINT32 FieldEndOffset;
+ UINT32 MinimumAccessWidth = 0xFFFFFFFF;
+ UINT32 MinimumAccesses = 0xFFFFFFFF;
+ UINT32 Accesses;
+
+
+ ACPI_FUNCTION_TRACE (ExGenerateAccess);
+
+
+ /* Round Field start offset and length to "minimal" byte boundaries */
+
+ FieldByteOffset = ACPI_DIV_8 (ACPI_ROUND_DOWN (FieldBitOffset, 8));
+ FieldByteEndOffset = ACPI_DIV_8 (ACPI_ROUND_UP (FieldBitLength +
+ FieldBitOffset, 8));
+ FieldByteLength = FieldByteEndOffset - FieldByteOffset;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Bit length %d, Bit offset %d\n",
+ FieldBitLength, FieldBitOffset));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Byte Length %d, Byte Offset %d, End Offset %d\n",
+ FieldByteLength, FieldByteOffset, FieldByteEndOffset));
+
+ /*
+ * Iterative search for the maximum access width that is both aligned
+ * and does not go beyond the end of the region
+ *
+ * Start at ByteAcc and work upwards to QwordAcc max. (1,2,4,8 bytes)
+ */
+ for (AccessByteWidth = 1; AccessByteWidth <= 8; AccessByteWidth <<= 1)
+ {
+ /*
+ * 1) Round end offset up to next access boundary and make sure that
+ * this does not go beyond the end of the parent region.
+ * 2) When the Access width is greater than the FieldByteLength, we
+ * are done. (This does not optimize for the perfectly aligned
+ * case yet).
+ */
+ if (ACPI_ROUND_UP (FieldByteEndOffset, AccessByteWidth) <= RegionLength)
+ {
+ FieldStartOffset =
+ ACPI_ROUND_DOWN (FieldByteOffset, AccessByteWidth) /
+ AccessByteWidth;
+
+ FieldEndOffset =
+ ACPI_ROUND_UP ((FieldByteLength + FieldByteOffset),
+ AccessByteWidth) / AccessByteWidth;
+
+ Accesses = FieldEndOffset - FieldStartOffset;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "AccessWidth %d end is within region\n", AccessByteWidth));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Field Start %d, Field End %d -- requires %d accesses\n",
+ FieldStartOffset, FieldEndOffset, Accesses));
+
+ /* Single access is optimal */
+
+ if (Accesses <= 1)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Entire field can be accessed with one operation of size %d\n",
+ AccessByteWidth));
+ return_VALUE (AccessByteWidth);
+ }
+
+ /*
+ * Fits in the region, but requires more than one read/write.
+ * try the next wider access on next iteration
+ */
+ if (Accesses < MinimumAccesses)
+ {
+ MinimumAccesses = Accesses;
+ MinimumAccessWidth = AccessByteWidth;
+ }
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "AccessWidth %d end is NOT within region\n", AccessByteWidth));
+ if (AccessByteWidth == 1)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Field goes beyond end-of-region!\n"));
+
+ /* Field does not fit in the region at all */
+
+ return_VALUE (0);
+ }
+
+ /*
+ * This width goes beyond the end-of-region, back off to
+ * previous access
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Backing off to previous optimal access width of %d\n",
+ MinimumAccessWidth));
+ return_VALUE (MinimumAccessWidth);
+ }
+ }
+
+ /*
+ * Could not read/write field with one operation,
+ * just use max access width
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Cannot access field in one operation, using width 8\n"));
+ return_VALUE (8);
+}
+#endif /* ACPI_UNDER_DEVELOPMENT */
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDecodeFieldAccess
+ *
+ * PARAMETERS: ObjDesc - Field object
+ * FieldFlags - Encoded fieldflags (contains access bits)
+ * ReturnByteAlignment - Where the byte alignment is returned
+ *
+ * RETURN: Field granularity (8, 16, 32 or 64) and
+ * ByteAlignment (1, 2, 3, or 4)
+ *
+ * DESCRIPTION: Decode the AccessType bits of a field definition.
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiExDecodeFieldAccess (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT8 FieldFlags,
+ UINT32 *ReturnByteAlignment)
+{
+ UINT32 Access;
+ UINT32 ByteAlignment;
+ UINT32 BitLength;
+
+
+ ACPI_FUNCTION_TRACE (ExDecodeFieldAccess);
+
+
+ Access = (FieldFlags & AML_FIELD_ACCESS_TYPE_MASK);
+
+ switch (Access)
+ {
+ case AML_FIELD_ACCESS_ANY:
+
+#ifdef ACPI_UNDER_DEVELOPMENT
+ ByteAlignment =
+ AcpiExGenerateAccess (ObjDesc->CommonField.StartFieldBitOffset,
+ ObjDesc->CommonField.BitLength,
+ 0xFFFFFFFF /* Temp until we pass RegionLength as parameter */);
+ BitLength = ByteAlignment * 8;
+#endif
+
+ ByteAlignment = 1;
+ BitLength = 8;
+ break;
+
+ case AML_FIELD_ACCESS_BYTE:
+ case AML_FIELD_ACCESS_BUFFER: /* ACPI 2.0 (SMBus Buffer) */
+ ByteAlignment = 1;
+ BitLength = 8;
+ break;
+
+ case AML_FIELD_ACCESS_WORD:
+ ByteAlignment = 2;
+ BitLength = 16;
+ break;
+
+ case AML_FIELD_ACCESS_DWORD:
+ ByteAlignment = 4;
+ BitLength = 32;
+ break;
+
+ case AML_FIELD_ACCESS_QWORD: /* ACPI 2.0 */
+ ByteAlignment = 8;
+ BitLength = 64;
+ break;
+
+ default:
+ /* Invalid field access type */
+
+ ACPI_ERROR ((AE_INFO,
+ "Unknown field access type %X",
+ Access));
+ return_UINT32 (0);
+ }
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_BUFFER_FIELD)
+ {
+ /*
+ * BufferField access can be on any byte boundary, so the
+ * ByteAlignment is always 1 byte -- regardless of any ByteAlignment
+ * implied by the field access type.
+ */
+ ByteAlignment = 1;
+ }
+
+ *ReturnByteAlignment = ByteAlignment;
+ return_UINT32 (BitLength);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExPrepCommonFieldObject
+ *
+ * PARAMETERS: ObjDesc - The field object
+ * FieldFlags - Access, LockRule, and UpdateRule.
+ * The format of a FieldFlag is described
+ * in the ACPI specification
+ * FieldAttribute - Special attributes (not used)
+ * FieldBitPosition - Field start position
+ * FieldBitLength - Field length in number of bits
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initialize the areas of the field object that are common
+ * to the various types of fields. Note: This is very "sensitive"
+ * code because we are solving the general case for field
+ * alignment.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExPrepCommonFieldObject (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT8 FieldFlags,
+ UINT8 FieldAttribute,
+ UINT32 FieldBitPosition,
+ UINT32 FieldBitLength)
+{
+ UINT32 AccessBitWidth;
+ UINT32 ByteAlignment;
+ UINT32 NearestByteAddress;
+
+
+ ACPI_FUNCTION_TRACE (ExPrepCommonFieldObject);
+
+
+ /*
+ * Note: the structure being initialized is the
+ * ACPI_COMMON_FIELD_INFO; No structure fields outside of the common
+ * area are initialized by this procedure.
+ */
+ ObjDesc->CommonField.FieldFlags = FieldFlags;
+ ObjDesc->CommonField.Attribute = FieldAttribute;
+ ObjDesc->CommonField.BitLength = FieldBitLength;
+
+ /*
+ * Decode the access type so we can compute offsets. The access type gives
+ * two pieces of information - the width of each field access and the
+ * necessary ByteAlignment (address granularity) of the access.
+ *
+ * For AnyAcc, the AccessBitWidth is the largest width that is both
+ * necessary and possible in an attempt to access the whole field in one
+ * I/O operation. However, for AnyAcc, the ByteAlignment is always one
+ * byte.
+ *
+ * For all Buffer Fields, the ByteAlignment is always one byte.
+ *
+ * For all other access types (Byte, Word, Dword, Qword), the Bitwidth is
+ * the same (equivalent) as the ByteAlignment.
+ */
+ AccessBitWidth = AcpiExDecodeFieldAccess (ObjDesc, FieldFlags,
+ &ByteAlignment);
+ if (!AccessBitWidth)
+ {
+ return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
+ }
+
+ /* Setup width (access granularity) fields */
+
+ ObjDesc->CommonField.AccessByteWidth = (UINT8)
+ ACPI_DIV_8 (AccessBitWidth); /* 1, 2, 4, 8 */
+
+ ObjDesc->CommonField.AccessBitWidth = (UINT8) AccessBitWidth;
+
+ /*
+ * BaseByteOffset is the address of the start of the field within the
+ * region. It is the byte address of the first *datum* (field-width data
+ * unit) of the field. (i.e., the first datum that contains at least the
+ * first *bit* of the field.)
+ *
+ * Note: ByteAlignment is always either equal to the AccessBitWidth or 8
+ * (Byte access), and it defines the addressing granularity of the parent
+ * region or buffer.
+ */
+ NearestByteAddress =
+ ACPI_ROUND_BITS_DOWN_TO_BYTES (FieldBitPosition);
+ ObjDesc->CommonField.BaseByteOffset = (UINT32)
+ ACPI_ROUND_DOWN (NearestByteAddress, ByteAlignment);
+
+ /*
+ * StartFieldBitOffset is the offset of the first bit of the field within
+ * a field datum.
+ */
+ ObjDesc->CommonField.StartFieldBitOffset = (UINT8)
+ (FieldBitPosition - ACPI_MUL_8 (ObjDesc->CommonField.BaseByteOffset));
+
+ /*
+ * Does the entire field fit within a single field access element? (datum)
+ * (i.e., without crossing a datum boundary)
+ */
+ if ((ObjDesc->CommonField.StartFieldBitOffset + FieldBitLength) <=
+ (UINT16) AccessBitWidth)
+ {
+ ObjDesc->Common.Flags |= AOPOBJ_SINGLE_DATUM;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExPrepFieldValue
+ *
+ * PARAMETERS: Info - Contains all field creation info
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Construct an ACPI_OPERAND_OBJECT of type DefField and
+ * connect it to the parent Node.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExPrepFieldValue (
+ ACPI_CREATE_FIELD_INFO *Info)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ UINT32 Type;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (ExPrepFieldValue);
+
+
+ /* Parameter validation */
+
+ if (Info->FieldType != ACPI_TYPE_LOCAL_INDEX_FIELD)
+ {
+ if (!Info->RegionNode)
+ {
+ ACPI_ERROR ((AE_INFO, "Null RegionNode"));
+ return_ACPI_STATUS (AE_AML_NO_OPERAND);
+ }
+
+ Type = AcpiNsGetType (Info->RegionNode);
+ if (Type != ACPI_TYPE_REGION)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Needed Region, found type %X (%s)",
+ Type, AcpiUtGetTypeName (Type)));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+ }
+
+ /* Allocate a new field object */
+
+ ObjDesc = AcpiUtCreateInternalObject (Info->FieldType);
+ if (!ObjDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Initialize areas of the object that are common to all fields */
+
+ ObjDesc->CommonField.Node = Info->FieldNode;
+ Status = AcpiExPrepCommonFieldObject (ObjDesc, Info->FieldFlags,
+ Info->Attribute, Info->FieldBitPosition, Info->FieldBitLength);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtDeleteObjectDesc (ObjDesc);
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Initialize areas of the object that are specific to the field type */
+
+ switch (Info->FieldType)
+ {
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+
+ ObjDesc->Field.RegionObj = AcpiNsGetAttachedObject (Info->RegionNode);
+
+ /* An additional reference for the container */
+
+ AcpiUtAddReference (ObjDesc->Field.RegionObj);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "RegionField: BitOff %X, Off %X, Gran %X, Region %p\n",
+ ObjDesc->Field.StartFieldBitOffset, ObjDesc->Field.BaseByteOffset,
+ ObjDesc->Field.AccessByteWidth, ObjDesc->Field.RegionObj));
+ break;
+
+
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+
+ ObjDesc->BankField.Value = Info->BankValue;
+ ObjDesc->BankField.RegionObj = AcpiNsGetAttachedObject (
+ Info->RegionNode);
+ ObjDesc->BankField.BankObj = AcpiNsGetAttachedObject (
+ Info->RegisterNode);
+
+ /* An additional reference for the attached objects */
+
+ AcpiUtAddReference (ObjDesc->BankField.RegionObj);
+ AcpiUtAddReference (ObjDesc->BankField.BankObj);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "Bank Field: BitOff %X, Off %X, Gran %X, Region %p, BankReg %p\n",
+ ObjDesc->BankField.StartFieldBitOffset,
+ ObjDesc->BankField.BaseByteOffset,
+ ObjDesc->Field.AccessByteWidth,
+ ObjDesc->BankField.RegionObj,
+ ObjDesc->BankField.BankObj));
+ break;
+
+
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
+
+ /* Get the Index and Data registers */
+
+ ObjDesc->IndexField.IndexObj = AcpiNsGetAttachedObject (
+ Info->RegisterNode);
+ ObjDesc->IndexField.DataObj = AcpiNsGetAttachedObject (
+ Info->DataRegisterNode);
+
+ if (!ObjDesc->IndexField.DataObj || !ObjDesc->IndexField.IndexObj)
+ {
+ ACPI_ERROR ((AE_INFO, "Null Index Object during field prep"));
+ AcpiUtDeleteObjectDesc (ObjDesc);
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
+ /* An additional reference for the attached objects */
+
+ AcpiUtAddReference (ObjDesc->IndexField.DataObj);
+ AcpiUtAddReference (ObjDesc->IndexField.IndexObj);
+
+ /*
+ * April 2006: Changed to match MS behavior
+ *
+ * The value written to the Index register is the byte offset of the
+ * target field in units of the granularity of the IndexField
+ *
+ * Previously, the value was calculated as an index in terms of the
+ * width of the Data register, as below:
+ *
+ * ObjDesc->IndexField.Value = (UINT32)
+ * (Info->FieldBitPosition / ACPI_MUL_8 (
+ * ObjDesc->Field.AccessByteWidth));
+ *
+ * February 2006: Tried value as a byte offset:
+ * ObjDesc->IndexField.Value = (UINT32)
+ * ACPI_DIV_8 (Info->FieldBitPosition);
+ */
+ ObjDesc->IndexField.Value = (UINT32) ACPI_ROUND_DOWN (
+ ACPI_DIV_8 (Info->FieldBitPosition),
+ ObjDesc->IndexField.AccessByteWidth);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD,
+ "IndexField: BitOff %X, Off %X, Value %X, Gran %X, Index %p, Data %p\n",
+ ObjDesc->IndexField.StartFieldBitOffset,
+ ObjDesc->IndexField.BaseByteOffset,
+ ObjDesc->IndexField.Value,
+ ObjDesc->Field.AccessByteWidth,
+ ObjDesc->IndexField.IndexObj,
+ ObjDesc->IndexField.DataObj));
+ break;
+
+ default:
+ /* No other types should get here */
+ break;
+ }
+
+ /*
+ * Store the constructed descriptor (ObjDesc) into the parent Node,
+ * preserving the current type of that NamedObj.
+ */
+ Status = AcpiNsAttachObject (Info->FieldNode, ObjDesc,
+ AcpiNsGetType (Info->FieldNode));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_BFIELD, "Set NamedObj %p [%4.4s], ObjDesc %p\n",
+ Info->FieldNode, AcpiUtGetNodeName (Info->FieldNode), ObjDesc));
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
diff --git a/sys/contrib/dev/acpica/exregion.c b/sys/contrib/dev/acpica/exregion.c
new file mode 100644
index 0000000..184ef7d
--- /dev/null
+++ b/sys/contrib/dev/acpica/exregion.c
@@ -0,0 +1,609 @@
+
+/******************************************************************************
+ *
+ * Module Name: exregion - ACPI default OpRegion (address space) handlers
+ * $Revision: 1.101 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __EXREGION_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exregion")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExSystemMemorySpaceHandler
+ *
+ * PARAMETERS: Function - Read or Write operation
+ * Address - Where in the space to read or write
+ * BitWidth - Field width in bits (8, 16, or 32)
+ * Value - Pointer to in or out value
+ * HandlerContext - Pointer to Handler's context
+ * RegionContext - Pointer to context specific to the
+ * accessed region
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Handler for the System Memory address space (Op Region)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExSystemMemorySpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext)
+{
+ ACPI_STATUS Status = AE_OK;
+ void *LogicalAddrPtr = NULL;
+ ACPI_MEM_SPACE_CONTEXT *MemInfo = RegionContext;
+ UINT32 Length;
+ ACPI_SIZE WindowSize;
+#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
+ UINT32 Remainder;
+#endif
+
+
+ ACPI_FUNCTION_TRACE (ExSystemMemorySpaceHandler);
+
+
+ /* Validate and translate the bit width */
+
+ switch (BitWidth)
+ {
+ case 8:
+ Length = 1;
+ break;
+
+ case 16:
+ Length = 2;
+ break;
+
+ case 32:
+ Length = 4;
+ break;
+
+ case 64:
+ Length = 8;
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO, "Invalid SystemMemory width %d",
+ BitWidth));
+ return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
+ }
+
+#ifdef ACPI_MISALIGNMENT_NOT_SUPPORTED
+ /*
+ * Hardware does not support non-aligned data transfers, we must verify
+ * the request.
+ */
+ (void) AcpiUtShortDivide ((ACPI_INTEGER) Address, Length, NULL, &Remainder);
+ if (Remainder != 0)
+ {
+ return_ACPI_STATUS (AE_AML_ALIGNMENT);
+ }
+#endif
+
+ /*
+ * Does the request fit into the cached memory mapping?
+ * Is 1) Address below the current mapping? OR
+ * 2) Address beyond the current mapping?
+ */
+ if ((Address < MemInfo->MappedPhysicalAddress) ||
+ (((ACPI_INTEGER) Address + Length) >
+ ((ACPI_INTEGER)
+ MemInfo->MappedPhysicalAddress + MemInfo->MappedLength)))
+ {
+ /*
+ * The request cannot be resolved by the current memory mapping;
+ * Delete the existing mapping and create a new one.
+ */
+ if (MemInfo->MappedLength)
+ {
+ /* Valid mapping, delete it */
+
+ AcpiOsUnmapMemory (MemInfo->MappedLogicalAddress,
+ MemInfo->MappedLength);
+ }
+
+ /*
+ * Don't attempt to map memory beyond the end of the region, and
+ * constrain the maximum mapping size to something reasonable.
+ */
+ WindowSize = (ACPI_SIZE)
+ ((MemInfo->Address + MemInfo->Length) - Address);
+
+ if (WindowSize > ACPI_SYSMEM_REGION_WINDOW_SIZE)
+ {
+ WindowSize = ACPI_SYSMEM_REGION_WINDOW_SIZE;
+ }
+
+ /* Create a new mapping starting at the address given */
+
+ MemInfo->MappedLogicalAddress = AcpiOsMapMemory ((ACPI_NATIVE_UINT) Address, WindowSize);
+ if (!MemInfo->MappedLogicalAddress)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not map memory at %8.8X%8.8X, size %X",
+ ACPI_FORMAT_UINT64 (Address), (UINT32) WindowSize));
+ MemInfo->MappedLength = 0;
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Save the physical address and mapping size */
+
+ MemInfo->MappedPhysicalAddress = Address;
+ MemInfo->MappedLength = WindowSize;
+ }
+
+ /*
+ * Generate a logical pointer corresponding to the address we want to
+ * access
+ */
+ LogicalAddrPtr = MemInfo->MappedLogicalAddress +
+ ((ACPI_INTEGER) Address - (ACPI_INTEGER) MemInfo->MappedPhysicalAddress);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "System-Memory (width %d) R/W %d Address=%8.8X%8.8X\n",
+ BitWidth, Function, ACPI_FORMAT_UINT64 (Address)));
+
+ /*
+ * Perform the memory read or write
+ *
+ * Note: For machines that do not support non-aligned transfers, the target
+ * address was checked for alignment above. We do not attempt to break the
+ * transfer up into smaller (byte-size) chunks because the AML specifically
+ * asked for a transfer width that the hardware may require.
+ */
+ switch (Function)
+ {
+ case ACPI_READ:
+
+ *Value = 0;
+ switch (BitWidth)
+ {
+ case 8:
+ *Value = (ACPI_INTEGER) ACPI_GET8 (LogicalAddrPtr);
+ break;
+
+ case 16:
+ *Value = (ACPI_INTEGER) ACPI_GET16 (LogicalAddrPtr);
+ break;
+
+ case 32:
+ *Value = (ACPI_INTEGER) ACPI_GET32 (LogicalAddrPtr);
+ break;
+
+ case 64:
+ *Value = (ACPI_INTEGER) ACPI_GET64 (LogicalAddrPtr);
+ break;
+
+ default:
+ /* BitWidth was already validated */
+ break;
+ }
+ break;
+
+ case ACPI_WRITE:
+
+ switch (BitWidth)
+ {
+ case 8:
+ ACPI_SET8 (LogicalAddrPtr) = (UINT8) *Value;
+ break;
+
+ case 16:
+ ACPI_SET16 (LogicalAddrPtr) = (UINT16) *Value;
+ break;
+
+ case 32:
+ ACPI_SET32 ( LogicalAddrPtr) = (UINT32) *Value;
+ break;
+
+ case 64:
+ ACPI_SET64 (LogicalAddrPtr) = (UINT64) *Value;
+ break;
+
+ default:
+ /* BitWidth was already validated */
+ break;
+ }
+ break;
+
+ default:
+ Status = AE_BAD_PARAMETER;
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExSystemIoSpaceHandler
+ *
+ * PARAMETERS: Function - Read or Write operation
+ * Address - Where in the space to read or write
+ * BitWidth - Field width in bits (8, 16, or 32)
+ * Value - Pointer to in or out value
+ * HandlerContext - Pointer to Handler's context
+ * RegionContext - Pointer to context specific to the
+ * accessed region
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Handler for the System IO address space (Op Region)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExSystemIoSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext)
+{
+ ACPI_STATUS Status = AE_OK;
+ UINT32 Value32;
+
+
+ ACPI_FUNCTION_TRACE (ExSystemIoSpaceHandler);
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "System-IO (width %d) R/W %d Address=%8.8X%8.8X\n",
+ BitWidth, Function, ACPI_FORMAT_UINT64 (Address)));
+
+ /* Decode the function parameter */
+
+ switch (Function)
+ {
+ case ACPI_READ:
+
+ Status = AcpiOsReadPort ((ACPI_IO_ADDRESS) Address,
+ &Value32, BitWidth);
+ *Value = Value32;
+ break;
+
+ case ACPI_WRITE:
+
+ Status = AcpiOsWritePort ((ACPI_IO_ADDRESS) Address,
+ (UINT32) *Value, BitWidth);
+ break;
+
+ default:
+ Status = AE_BAD_PARAMETER;
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExPciConfigSpaceHandler
+ *
+ * PARAMETERS: Function - Read or Write operation
+ * Address - Where in the space to read or write
+ * BitWidth - Field width in bits (8, 16, or 32)
+ * Value - Pointer to in or out value
+ * HandlerContext - Pointer to Handler's context
+ * RegionContext - Pointer to context specific to the
+ * accessed region
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Handler for the PCI Config address space (Op Region)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExPciConfigSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_PCI_ID *PciId;
+ UINT16 PciRegister;
+
+
+ ACPI_FUNCTION_TRACE (ExPciConfigSpaceHandler);
+
+
+ /*
+ * The arguments to AcpiOs(Read|Write)PciConfiguration are:
+ *
+ * PciSegment is the PCI bus segment range 0-31
+ * PciBus is the PCI bus number range 0-255
+ * PciDevice is the PCI device number range 0-31
+ * PciFunction is the PCI device function number
+ * PciRegister is the Config space register range 0-255 bytes
+ *
+ * Value - input value for write, output address for read
+ *
+ */
+ PciId = (ACPI_PCI_ID *) RegionContext;
+ PciRegister = (UINT16) (UINT32) Address;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Pci-Config %d (%d) Seg(%04x) Bus(%04x) Dev(%04x) Func(%04x) Reg(%04x)\n",
+ Function, BitWidth, PciId->Segment, PciId->Bus, PciId->Device,
+ PciId->Function, PciRegister));
+
+ switch (Function)
+ {
+ case ACPI_READ:
+
+ *Value = 0;
+ Status = AcpiOsReadPciConfiguration (PciId, PciRegister,
+ Value, BitWidth);
+ break;
+
+ case ACPI_WRITE:
+
+ Status = AcpiOsWritePciConfiguration (PciId, PciRegister,
+ *Value, BitWidth);
+ break;
+
+ default:
+
+ Status = AE_BAD_PARAMETER;
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExCmosSpaceHandler
+ *
+ * PARAMETERS: Function - Read or Write operation
+ * Address - Where in the space to read or write
+ * BitWidth - Field width in bits (8, 16, or 32)
+ * Value - Pointer to in or out value
+ * HandlerContext - Pointer to Handler's context
+ * RegionContext - Pointer to context specific to the
+ * accessed region
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Handler for the CMOS address space (Op Region)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExCmosSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (ExCmosSpaceHandler);
+
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExPciBarSpaceHandler
+ *
+ * PARAMETERS: Function - Read or Write operation
+ * Address - Where in the space to read or write
+ * BitWidth - Field width in bits (8, 16, or 32)
+ * Value - Pointer to in or out value
+ * HandlerContext - Pointer to Handler's context
+ * RegionContext - Pointer to context specific to the
+ * accessed region
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Handler for the PCI BarTarget address space (Op Region)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExPciBarSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (ExPciBarSpaceHandler);
+
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDataTableSpaceHandler
+ *
+ * PARAMETERS: Function - Read or Write operation
+ * Address - Where in the space to read or write
+ * BitWidth - Field width in bits (8, 16, or 32)
+ * Value - Pointer to in or out value
+ * HandlerContext - Pointer to Handler's context
+ * RegionContext - Pointer to context specific to the
+ * accessed region
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Handler for the Data Table address space (Op Region)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExDataTableSpaceHandler (
+ UINT32 Function,
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 BitWidth,
+ ACPI_INTEGER *Value,
+ void *HandlerContext,
+ void *RegionContext)
+{
+ ACPI_FUNCTION_TRACE (ExDataTableSpaceHandler);
+
+
+ /* Perform the memory read or write */
+
+ switch (Function)
+ {
+ case ACPI_READ:
+
+ ACPI_MEMCPY (ACPI_CAST_PTR (char, Value), ACPI_PHYSADDR_TO_PTR (Address),
+ ACPI_DIV_8 (BitWidth));
+ break;
+
+ case ACPI_WRITE:
+ default:
+
+ return_ACPI_STATUS (AE_SUPPORT);
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exresnte.c b/sys/contrib/dev/acpica/exresnte.c
new file mode 100644
index 0000000..f5f2e14
--- /dev/null
+++ b/sys/contrib/dev/acpica/exresnte.c
@@ -0,0 +1,377 @@
+
+/******************************************************************************
+ *
+ * Module Name: exresnte - AML Interpreter object resolution
+ * $Revision: 1.75 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXRESNTE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exresnte")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExResolveNodeToValue
+ *
+ * PARAMETERS: ObjectPtr - Pointer to a location that contains
+ * a pointer to a NS node, and will receive a
+ * pointer to the resolved object.
+ * WalkState - Current state. Valid only if executing AML
+ * code. NULL if simply resolving an object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Resolve a Namespace node to a valued object
+ *
+ * Note: for some of the data types, the pointer attached to the Node
+ * can be either a pointer to an actual internal object or a pointer into the
+ * AML stream itself. These types are currently:
+ *
+ * ACPI_TYPE_INTEGER
+ * ACPI_TYPE_STRING
+ * ACPI_TYPE_BUFFER
+ * ACPI_TYPE_MUTEX
+ * ACPI_TYPE_PACKAGE
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExResolveNodeToValue (
+ ACPI_NAMESPACE_NODE **ObjectPtr,
+ ACPI_WALK_STATE *WalkState)
+
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *SourceDesc;
+ ACPI_OPERAND_OBJECT *ObjDesc = NULL;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_OBJECT_TYPE EntryType;
+
+
+ ACPI_FUNCTION_TRACE (ExResolveNodeToValue);
+
+
+ /*
+ * The stack pointer points to a ACPI_NAMESPACE_NODE (Node). Get the
+ * object that is attached to the Node.
+ */
+ Node = *ObjectPtr;
+ SourceDesc = AcpiNsGetAttachedObject (Node);
+ EntryType = AcpiNsGetType ((ACPI_HANDLE) Node);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Entry=%p SourceDesc=%p [%s]\n",
+ Node, SourceDesc, AcpiUtGetTypeName (EntryType)));
+
+ if ((EntryType == ACPI_TYPE_LOCAL_ALIAS) ||
+ (EntryType == ACPI_TYPE_LOCAL_METHOD_ALIAS))
+ {
+ /* There is always exactly one level of indirection */
+
+ Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Node->Object);
+ SourceDesc = AcpiNsGetAttachedObject (Node);
+ EntryType = AcpiNsGetType ((ACPI_HANDLE) Node);
+ *ObjectPtr = Node;
+ }
+
+ /*
+ * Several object types require no further processing:
+ * 1) Device/Thermal objects don't have a "real" subobject, return the Node
+ * 2) Method locals and arguments have a pseudo-Node
+ */
+ if ((EntryType == ACPI_TYPE_DEVICE) ||
+ (EntryType == ACPI_TYPE_THERMAL) ||
+ (Node->Flags & (ANOBJ_METHOD_ARG | ANOBJ_METHOD_LOCAL)))
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ if (!SourceDesc)
+ {
+ ACPI_ERROR ((AE_INFO, "No object attached to node %p",
+ Node));
+ return_ACPI_STATUS (AE_AML_NO_OPERAND);
+ }
+
+ /*
+ * Action is based on the type of the Node, which indicates the type
+ * of the attached object or pointer
+ */
+ switch (EntryType)
+ {
+ case ACPI_TYPE_PACKAGE:
+
+ if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_PACKAGE)
+ {
+ ACPI_ERROR ((AE_INFO, "Object not a Package, type %s",
+ AcpiUtGetObjectTypeName (SourceDesc)));
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ Status = AcpiDsGetPackageArguments (SourceDesc);
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Return an additional reference to the object */
+
+ ObjDesc = SourceDesc;
+ AcpiUtAddReference (ObjDesc);
+ }
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_BUFFER)
+ {
+ ACPI_ERROR ((AE_INFO, "Object not a Buffer, type %s",
+ AcpiUtGetObjectTypeName (SourceDesc)));
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ Status = AcpiDsGetBufferArguments (SourceDesc);
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Return an additional reference to the object */
+
+ ObjDesc = SourceDesc;
+ AcpiUtAddReference (ObjDesc);
+ }
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_STRING)
+ {
+ ACPI_ERROR ((AE_INFO, "Object not a String, type %s",
+ AcpiUtGetObjectTypeName (SourceDesc)));
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /* Return an additional reference to the object */
+
+ ObjDesc = SourceDesc;
+ AcpiUtAddReference (ObjDesc);
+ break;
+
+
+ case ACPI_TYPE_INTEGER:
+
+ if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_INTEGER)
+ {
+ ACPI_ERROR ((AE_INFO, "Object not a Integer, type %s",
+ AcpiUtGetObjectTypeName (SourceDesc)));
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /* Return an additional reference to the object */
+
+ ObjDesc = SourceDesc;
+ AcpiUtAddReference (ObjDesc);
+ break;
+
+
+ case ACPI_TYPE_BUFFER_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,
+ "FieldRead Node=%p SourceDesc=%p Type=%X\n",
+ Node, SourceDesc, EntryType));
+
+ Status = AcpiExReadDataFromField (WalkState, SourceDesc, &ObjDesc);
+ break;
+
+ /* For these objects, just return the object attached to the Node */
+
+ case ACPI_TYPE_MUTEX:
+ case ACPI_TYPE_METHOD:
+ case ACPI_TYPE_POWER:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_EVENT:
+ case ACPI_TYPE_REGION:
+
+ /* Return an additional reference to the object */
+
+ ObjDesc = SourceDesc;
+ AcpiUtAddReference (ObjDesc);
+ break;
+
+ /* TYPE_ANY is untyped, and thus there is no object associated with it */
+
+ case ACPI_TYPE_ANY:
+
+ ACPI_ERROR ((AE_INFO,
+ "Untyped entry %p, no attached object!", Node));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE); /* Cannot be AE_TYPE */
+
+
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ switch (SourceDesc->Reference.Opcode)
+ {
+ case AML_LOAD_OP:
+
+ /* This is a DdbHandle */
+ /* Return an additional reference to the object */
+
+ case AML_REF_OF_OP:
+
+ ObjDesc = SourceDesc;
+ AcpiUtAddReference (ObjDesc);
+ break;
+
+ default:
+ /* No named references are allowed here */
+
+ ACPI_ERROR ((AE_INFO,
+ "Unsupported Reference opcode %X (%s)",
+ SourceDesc->Reference.Opcode,
+ AcpiPsGetOpcodeName (SourceDesc->Reference.Opcode)));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+ break;
+
+
+ default:
+
+ /* Default case is for unknown types */
+
+ ACPI_ERROR ((AE_INFO,
+ "Node %p - Unknown object type %X",
+ Node, EntryType));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+
+ } /* switch (EntryType) */
+
+
+ /* Return the object descriptor */
+
+ *ObjectPtr = (void *) ObjDesc;
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exresolv.c b/sys/contrib/dev/acpica/exresolv.c
new file mode 100644
index 0000000..b15e86b
--- /dev/null
+++ b/sys/contrib/dev/acpica/exresolv.c
@@ -0,0 +1,639 @@
+
+/******************************************************************************
+ *
+ * Module Name: exresolv - AML Interpreter object resolution
+ * $Revision: 1.142 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXRESOLV_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acparser.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exresolv")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiExResolveObjectToValue (
+ ACPI_OPERAND_OBJECT **StackPtr,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExResolveToValue
+ *
+ * PARAMETERS: **StackPtr - Points to entry on ObjStack, which can
+ * be either an (ACPI_OPERAND_OBJECT *)
+ * or an ACPI_HANDLE.
+ * WalkState - Current method state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert Reference objects to values
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExResolveToValue (
+ ACPI_OPERAND_OBJECT **StackPtr,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExResolveToValue, StackPtr);
+
+
+ if (!StackPtr || !*StackPtr)
+ {
+ ACPI_ERROR ((AE_INFO, "Internal - null pointer"));
+ return_ACPI_STATUS (AE_AML_NO_OPERAND);
+ }
+
+ /*
+ * The entity pointed to by the StackPtr can be either
+ * 1) A valid ACPI_OPERAND_OBJECT, or
+ * 2) A ACPI_NAMESPACE_NODE (NamedObj)
+ */
+ if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_OPERAND)
+ {
+ Status = AcpiExResolveObjectToValue (StackPtr, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (!*StackPtr)
+ {
+ ACPI_ERROR ((AE_INFO, "Internal - null pointer"));
+ return_ACPI_STATUS (AE_AML_NO_OPERAND);
+ }
+ }
+
+ /*
+ * Object on the stack may have changed if AcpiExResolveObjectToValue()
+ * was called (i.e., we can't use an _else_ here.)
+ */
+ if (ACPI_GET_DESCRIPTOR_TYPE (*StackPtr) == ACPI_DESC_TYPE_NAMED)
+ {
+ Status = AcpiExResolveNodeToValue (
+ ACPI_CAST_INDIRECT_PTR (ACPI_NAMESPACE_NODE, StackPtr),
+ WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Resolved object %p\n", *StackPtr));
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExResolveObjectToValue
+ *
+ * PARAMETERS: StackPtr - Pointer to an internal object
+ * WalkState - Current method state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Retrieve the value from an internal object. The Reference type
+ * uses the associated AML opcode to determine the value.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiExResolveObjectToValue (
+ ACPI_OPERAND_OBJECT **StackPtr,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *StackDesc;
+ ACPI_OPERAND_OBJECT *ObjDesc = NULL;
+ UINT16 Opcode;
+
+
+ ACPI_FUNCTION_TRACE (ExResolveObjectToValue);
+
+
+ StackDesc = *StackPtr;
+
+ /* This is an ACPI_OPERAND_OBJECT */
+
+ switch (ACPI_GET_OBJECT_TYPE (StackDesc))
+ {
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ Opcode = StackDesc->Reference.Opcode;
+
+ switch (Opcode)
+ {
+ case AML_LOCAL_OP:
+ case AML_ARG_OP:
+
+ /*
+ * Get the local from the method's state info
+ * Note: this increments the local's object reference count
+ */
+ Status = AcpiDsMethodDataGetValue (Opcode,
+ StackDesc->Reference.Offset, WalkState, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Arg/Local %X] ValueObj is %p\n",
+ StackDesc->Reference.Offset, ObjDesc));
+
+ /*
+ * Now we can delete the original Reference Object and
+ * replace it with the resolved value
+ */
+ AcpiUtRemoveReference (StackDesc);
+ *StackPtr = ObjDesc;
+ break;
+
+
+ case AML_INDEX_OP:
+
+ switch (StackDesc->Reference.TargetType)
+ {
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ /* Just return - leave the Reference on the stack */
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ ObjDesc = *StackDesc->Reference.Where;
+ if (ObjDesc)
+ {
+ /*
+ * Valid obj descriptor, copy pointer to return value
+ * (i.e., dereference the package index)
+ * Delete the ref object, increment the returned object
+ */
+ AcpiUtRemoveReference (StackDesc);
+ AcpiUtAddReference (ObjDesc);
+ *StackPtr = ObjDesc;
+ }
+ else
+ {
+ /*
+ * A NULL object descriptor means an unitialized element of
+ * the package, can't dereference it
+ */
+ ACPI_ERROR ((AE_INFO,
+ "Attempt to deref an Index to NULL pkg element Idx=%p",
+ StackDesc));
+ Status = AE_AML_UNINITIALIZED_ELEMENT;
+ }
+ break;
+
+
+ default:
+
+ /* Invalid reference object */
+
+ ACPI_ERROR ((AE_INFO,
+ "Unknown TargetType %X in Index/Reference obj %p",
+ StackDesc->Reference.TargetType, StackDesc));
+ Status = AE_AML_INTERNAL;
+ break;
+ }
+ break;
+
+
+ case AML_REF_OF_OP:
+ case AML_DEBUG_OP:
+ case AML_LOAD_OP:
+
+ /* Just leave the object as-is */
+
+ break;
+
+ case AML_INT_NAMEPATH_OP: /* Reference to a named object */
+
+ /* Dereference the name */
+
+ if ((StackDesc->Reference.Node->Type == ACPI_TYPE_DEVICE) ||
+ (StackDesc->Reference.Node->Type == ACPI_TYPE_THERMAL))
+ {
+ /* These node types do not have 'real' subobjects */
+
+ *StackPtr = (void *) StackDesc->Reference.Node;
+ }
+ else
+ {
+ /* Get the object pointed to by the namespace node */
+
+ *StackPtr = (StackDesc->Reference.Node)->Object;
+ AcpiUtAddReference (*StackPtr);
+ }
+
+ AcpiUtRemoveReference (StackDesc);
+ break;
+
+ default:
+
+ ACPI_ERROR ((AE_INFO,
+ "Unknown Reference opcode %X (%s) in %p",
+ Opcode, AcpiPsGetOpcodeName (Opcode), StackDesc));
+ Status = AE_AML_INTERNAL;
+ break;
+ }
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ Status = AcpiDsGetBufferArguments (StackDesc);
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ Status = AcpiDsGetPackageArguments (StackDesc);
+ break;
+
+
+ case ACPI_TYPE_BUFFER_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, "FieldRead SourceDesc=%p Type=%X\n",
+ StackDesc, ACPI_GET_OBJECT_TYPE (StackDesc)));
+
+ Status = AcpiExReadDataFromField (WalkState, StackDesc, &ObjDesc);
+
+ /* Remove a reference to the original operand, then override */
+
+ AcpiUtRemoveReference (*StackPtr);
+ *StackPtr = (void *) ObjDesc;
+ break;
+
+ default:
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExResolveMultiple
+ *
+ * PARAMETERS: WalkState - Current state (contains AML opcode)
+ * Operand - Starting point for resolution
+ * ReturnType - Where the object type is returned
+ * ReturnDesc - Where the resolved object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Return the base object and type. Traverse a reference list if
+ * necessary to get to the base object.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExResolveMultiple (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_OPERAND_OBJECT *Operand,
+ ACPI_OBJECT_TYPE *ReturnType,
+ ACPI_OPERAND_OBJECT **ReturnDesc)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc = (void *) Operand;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_OBJECT_TYPE Type;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiExResolveMultiple);
+
+
+ /* Operand can be either a namespace node or an operand descriptor */
+
+ switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
+ {
+ case ACPI_DESC_TYPE_OPERAND:
+ Type = ObjDesc->Common.Type;
+ break;
+
+ case ACPI_DESC_TYPE_NAMED:
+ Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
+ ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc);
+
+ /* If we had an Alias node, use the attached object for type info */
+
+ if (Type == ACPI_TYPE_LOCAL_ALIAS)
+ {
+ Type = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
+ ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc);
+ }
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /* If type is anything other than a reference, we are done */
+
+ if (Type != ACPI_TYPE_LOCAL_REFERENCE)
+ {
+ goto Exit;
+ }
+
+ /*
+ * For reference objects created via the RefOf or Index operators,
+ * we need to get to the base object (as per the ACPI specification
+ * of the ObjectType and SizeOf operators). This means traversing
+ * the list of possibly many nested references.
+ */
+ while (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_REFERENCE)
+ {
+ switch (ObjDesc->Reference.Opcode)
+ {
+ case AML_REF_OF_OP:
+ case AML_INT_NAMEPATH_OP:
+
+ /* Dereference the reference pointer */
+
+ if (ObjDesc->Reference.Opcode == AML_REF_OF_OP)
+ {
+ Node = ObjDesc->Reference.Object;
+ }
+ else /* AML_INT_NAMEPATH_OP */
+ {
+ Node = ObjDesc->Reference.Node;
+ }
+
+ /* All "References" point to a NS node */
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Not a NS node %p [%s]",
+ Node, AcpiUtGetDescriptorName (Node)));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
+ /* Get the attached object */
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc)
+ {
+ /* No object, use the NS node type */
+
+ Type = AcpiNsGetType (Node);
+ goto Exit;
+ }
+
+ /* Check for circular references */
+
+ if (ObjDesc == Operand)
+ {
+ return_ACPI_STATUS (AE_AML_CIRCULAR_REFERENCE);
+ }
+ break;
+
+
+ case AML_INDEX_OP:
+
+ /* Get the type of this reference (index into another object) */
+
+ Type = ObjDesc->Reference.TargetType;
+ if (Type != ACPI_TYPE_PACKAGE)
+ {
+ goto Exit;
+ }
+
+ /*
+ * The main object is a package, we want to get the type
+ * of the individual package element that is referenced by
+ * the index.
+ *
+ * This could of course in turn be another reference object.
+ */
+ ObjDesc = *(ObjDesc->Reference.Where);
+ if (!ObjDesc)
+ {
+ /* NULL package elements are allowed */
+
+ Type = 0; /* Uninitialized */
+ goto Exit;
+ }
+ break;
+
+
+ case AML_LOCAL_OP:
+ case AML_ARG_OP:
+
+ if (ReturnDesc)
+ {
+ Status = AcpiDsMethodDataGetValue (ObjDesc->Reference.Opcode,
+ ObjDesc->Reference.Offset, WalkState, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ AcpiUtRemoveReference (ObjDesc);
+ }
+ else
+ {
+ Status = AcpiDsMethodDataGetNode (ObjDesc->Reference.Opcode,
+ ObjDesc->Reference.Offset, WalkState, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc)
+ {
+ Type = ACPI_TYPE_ANY;
+ goto Exit;
+ }
+ }
+ break;
+
+
+ case AML_DEBUG_OP:
+
+ /* The Debug Object is of type "DebugObject" */
+
+ Type = ACPI_TYPE_DEBUG_OBJECT;
+ goto Exit;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO,
+ "Unknown Reference subtype %X",
+ ObjDesc->Reference.Opcode));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+ }
+
+ /*
+ * Now we are guaranteed to have an object that has not been created
+ * via the RefOf or Index operators.
+ */
+ Type = ACPI_GET_OBJECT_TYPE (ObjDesc);
+
+
+Exit:
+ /* Convert internal types to external types */
+
+ switch (Type)
+ {
+ 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:
+ /* No change to Type required */
+ break;
+ }
+
+ *ReturnType = Type;
+ if (ReturnDesc)
+ {
+ *ReturnDesc = ObjDesc;
+ }
+ return_ACPI_STATUS (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exresop.c b/sys/contrib/dev/acpica/exresop.c
new file mode 100644
index 0000000..5bbce15
--- /dev/null
+++ b/sys/contrib/dev/acpica/exresop.c
@@ -0,0 +1,812 @@
+
+/******************************************************************************
+ *
+ * Module Name: exresop - AML Interpreter operand/object resolution
+ * $Revision: 1.95 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXRESOP_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exresop")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiExCheckObjectType (
+ ACPI_OBJECT_TYPE TypeNeeded,
+ ACPI_OBJECT_TYPE ThisType,
+ void *Object);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExCheckObjectType
+ *
+ * PARAMETERS: TypeNeeded Object type needed
+ * ThisType Actual object type
+ * Object Object pointer
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Check required type against actual type
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiExCheckObjectType (
+ ACPI_OBJECT_TYPE TypeNeeded,
+ ACPI_OBJECT_TYPE ThisType,
+ void *Object)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (TypeNeeded == ACPI_TYPE_ANY)
+ {
+ /* All types OK, so we don't perform any typechecks */
+
+ return (AE_OK);
+ }
+
+ if (TypeNeeded == 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
+ * specification, a store to a constant is a noop.)
+ */
+ if ((ThisType == ACPI_TYPE_INTEGER) &&
+ (((ACPI_OPERAND_OBJECT *) Object)->Common.Flags & AOPOBJ_AML_CONSTANT))
+ {
+ return (AE_OK);
+ }
+ }
+
+ if (TypeNeeded != ThisType)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Needed type [%s], found [%s] %p",
+ AcpiUtGetTypeName (TypeNeeded),
+ AcpiUtGetTypeName (ThisType), Object));
+
+ return (AE_AML_OPERAND_TYPE);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExResolveOperands
+ *
+ * PARAMETERS: Opcode - Opcode being interpreted
+ * StackPtr - Pointer to the operand stack to be
+ * resolved
+ * WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert multiple input operands to the types required by the
+ * target operator.
+ *
+ * Each 5-bit group in ArgTypes represents one required
+ * operand and indicates the required Type. The corresponding operand
+ * will be converted to the required type if possible, otherwise we
+ * abort with an exception.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExResolveOperands (
+ UINT16 Opcode,
+ ACPI_OPERAND_OBJECT **StackPtr,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status = AE_OK;
+ UINT8 ObjectType;
+ UINT32 ArgTypes;
+ const ACPI_OPCODE_INFO *OpInfo;
+ UINT32 ThisArgType;
+ ACPI_OBJECT_TYPE TypeNeeded;
+ UINT16 TargetOp = 0;
+
+
+ ACPI_FUNCTION_TRACE_U32 (ExResolveOperands, Opcode);
+
+
+ OpInfo = AcpiPsGetOpcodeInfo (Opcode);
+ if (OpInfo->Class == AML_CLASS_UNKNOWN)
+ {
+ return_ACPI_STATUS (AE_AML_BAD_OPCODE);
+ }
+
+ ArgTypes = OpInfo->RuntimeArgs;
+ if (ArgTypes == ARGI_INVALID_OPCODE)
+ {
+ ACPI_ERROR ((AE_INFO, "Unknown AML opcode %X",
+ Opcode));
+
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Opcode %X [%s] RequiredOperandTypes=%8.8X\n",
+ Opcode, OpInfo->Name, ArgTypes));
+
+ /*
+ * Normal exit is with (ArgTypes == 0) at end of argument list.
+ * Function will return an exception from within the loop upon
+ * finding an entry which is not (or cannot be converted
+ * to) the required type; if stack underflows; or upon
+ * finding a NULL stack entry (which should not happen).
+ */
+ while (GET_CURRENT_ARG_TYPE (ArgTypes))
+ {
+ if (!StackPtr || !*StackPtr)
+ {
+ ACPI_ERROR ((AE_INFO, "Null stack entry at %p",
+ StackPtr));
+
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
+ /* Extract useful items */
+
+ ObjDesc = *StackPtr;
+
+ /* Decode the descriptor type */
+
+ switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
+ {
+ case ACPI_DESC_TYPE_NAMED:
+
+ /* Namespace Node */
+
+ ObjectType = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
+
+ /*
+ * Resolve an alias object. The construction of these objects
+ * guarantees that there is only one level of alias indirection;
+ * thus, the attached object is always the aliased namespace node
+ */
+ if (ObjectType == ACPI_TYPE_LOCAL_ALIAS)
+ {
+ ObjDesc = AcpiNsGetAttachedObject ((ACPI_NAMESPACE_NODE *) ObjDesc);
+ *StackPtr = ObjDesc;
+ ObjectType = ((ACPI_NAMESPACE_NODE *) ObjDesc)->Type;
+ }
+ break;
+
+
+ case ACPI_DESC_TYPE_OPERAND:
+
+ /* ACPI internal object */
+
+ ObjectType = ACPI_GET_OBJECT_TYPE (ObjDesc);
+
+ /* Check for bad ACPI_OBJECT_TYPE */
+
+ if (!AcpiUtValidObjectType (ObjectType))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Bad operand object type [%X]",
+ ObjectType));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ if (ObjectType == (UINT8) ACPI_TYPE_LOCAL_REFERENCE)
+ {
+ /* Decode the Reference */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Opcode);
+ if (OpInfo->Class == AML_CLASS_UNKNOWN)
+ {
+ return_ACPI_STATUS (AE_AML_BAD_OPCODE);
+ }
+
+ switch (ObjDesc->Reference.Opcode)
+ {
+ case AML_DEBUG_OP:
+ TargetOp = AML_DEBUG_OP;
+
+ /*lint -fallthrough */
+
+ case AML_INDEX_OP:
+ case AML_REF_OF_OP:
+ case AML_ARG_OP:
+ case AML_LOCAL_OP:
+ case AML_LOAD_OP: /* DdbHandle from LOAD_OP or LOAD_TABLE_OP */
+ case AML_INT_NAMEPATH_OP: /* Reference to a named object */
+
+ ACPI_DEBUG_ONLY_MEMBERS (ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Operand is a Reference, RefOpcode [%s]\n",
+ (AcpiPsGetOpcodeInfo (ObjDesc->Reference.Opcode))->Name)));
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Operand is a Reference, Unknown Reference Opcode: %X",
+ ObjDesc->Reference.Opcode));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+ }
+ break;
+
+
+ default:
+
+ /* Invalid descriptor */
+
+ ACPI_ERROR ((AE_INFO,
+ "Invalid descriptor %p [%s]",
+ ObjDesc, AcpiUtGetDescriptorName (ObjDesc)));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /* Get one argument type, point to the next */
+
+ ThisArgType = GET_CURRENT_ARG_TYPE (ArgTypes);
+ INCREMENT_ARG_LIST (ArgTypes);
+
+ /*
+ * Handle cases where the object does not need to be
+ * resolved to a value
+ */
+ switch (ThisArgType)
+ {
+ case ARGI_REF_OR_STRING: /* Can be a String or Reference */
+
+ if ((ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND) &&
+ (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_STRING))
+ {
+ /*
+ * String found - the string references a named object and
+ * must be resolved to a node
+ */
+ goto NextOperand;
+ }
+
+ /*
+ * Else not a string - fall through to the normal Reference
+ * case below
+ */
+ /*lint -fallthrough */
+
+ case ARGI_REFERENCE: /* References: */
+ case ARGI_INTEGER_REF:
+ case ARGI_OBJECT_REF:
+ case ARGI_DEVICE_REF:
+ case ARGI_TARGETREF: /* Allows implicit conversion rules before store */
+ 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 ACPI_TYPE_LOCAL_REFERENCE
+ * A Namespace Node is OK as-is
+ */
+ if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_NAMED)
+ {
+ goto NextOperand;
+ }
+
+ Status = AcpiExCheckObjectType (ACPI_TYPE_LOCAL_REFERENCE,
+ ObjectType, ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ goto NextOperand;
+
+
+ case ARGI_DATAREFOBJ: /* Store operator only */
+
+ /*
+ * We don't want to resolve IndexOp reference objects during
+ * a store because this would be an implicit DeRefOf operation.
+ * Instead, we just want to store the reference object.
+ * -- All others must be resolved below.
+ */
+ if ((Opcode == AML_STORE_OP) &&
+ (ACPI_GET_OBJECT_TYPE (*StackPtr) == ACPI_TYPE_LOCAL_REFERENCE) &&
+ ((*StackPtr)->Reference.Opcode == AML_INDEX_OP))
+ {
+ goto NextOperand;
+ }
+ break;
+
+ default:
+ /* All cases covered above */
+ break;
+ }
+
+ /*
+ * Resolve this object to a value
+ */
+ Status = AcpiExResolveToValue (StackPtr, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Get the resolved object */
+
+ ObjDesc = *StackPtr;
+
+ /*
+ * Check the resulting object (value) type
+ */
+ switch (ThisArgType)
+ {
+ /*
+ * For the simple cases, only one type of resolved object
+ * is allowed
+ */
+ case ARGI_MUTEX:
+
+ /* Need an operand of type ACPI_TYPE_MUTEX */
+
+ TypeNeeded = ACPI_TYPE_MUTEX;
+ break;
+
+ case ARGI_EVENT:
+
+ /* Need an operand of type ACPI_TYPE_EVENT */
+
+ TypeNeeded = ACPI_TYPE_EVENT;
+ break;
+
+ case ARGI_PACKAGE: /* Package */
+
+ /* Need an operand of type ACPI_TYPE_PACKAGE */
+
+ TypeNeeded = ACPI_TYPE_PACKAGE;
+ break;
+
+ case ARGI_ANYTYPE:
+
+ /* Any operand type will do */
+
+ TypeNeeded = ACPI_TYPE_ANY;
+ break;
+
+ case ARGI_DDBHANDLE:
+
+ /* Need an operand of type ACPI_TYPE_DDB_HANDLE */
+
+ TypeNeeded = ACPI_TYPE_LOCAL_REFERENCE;
+ break;
+
+
+ /*
+ * The more complex cases allow multiple resolved object types
+ */
+ case ARGI_INTEGER:
+
+ /*
+ * Need an operand of type ACPI_TYPE_INTEGER,
+ * But we can implicitly convert from a STRING or BUFFER
+ * Aka - "Implicit Source Operand Conversion"
+ */
+ Status = AcpiExConvertToInteger (ObjDesc, StackPtr, 16);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_TYPE)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Needed [Integer/String/Buffer], found [%s] %p",
+ AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ return_ACPI_STATUS (Status);
+ }
+
+ if (ObjDesc != *StackPtr)
+ {
+ AcpiUtRemoveReference (ObjDesc);
+ }
+ goto NextOperand;
+
+
+ case ARGI_BUFFER:
+
+ /*
+ * Need an operand of type ACPI_TYPE_BUFFER,
+ * But we can implicitly convert from a STRING or INTEGER
+ * Aka - "Implicit Source Operand Conversion"
+ */
+ Status = AcpiExConvertToBuffer (ObjDesc, StackPtr);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_TYPE)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Needed [Integer/String/Buffer], found [%s] %p",
+ AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ return_ACPI_STATUS (Status);
+ }
+
+ if (ObjDesc != *StackPtr)
+ {
+ AcpiUtRemoveReference (ObjDesc);
+ }
+ goto NextOperand;
+
+
+ case ARGI_STRING:
+
+ /*
+ * Need an operand of type ACPI_TYPE_STRING,
+ * But we can implicitly convert from a BUFFER or INTEGER
+ * Aka - "Implicit Source Operand Conversion"
+ */
+ Status = AcpiExConvertToString (ObjDesc, StackPtr,
+ ACPI_IMPLICIT_CONVERT_HEX);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_TYPE)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Needed [Integer/String/Buffer], found [%s] %p",
+ AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ return_ACPI_STATUS (Status);
+ }
+
+ if (ObjDesc != *StackPtr)
+ {
+ AcpiUtRemoveReference (ObjDesc);
+ }
+ goto NextOperand;
+
+
+ case ARGI_COMPUTEDATA:
+
+ /* Need an operand of type INTEGER, STRING or BUFFER */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+
+ /* Valid operand */
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Needed [Integer/String/Buffer], found [%s] %p",
+ AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+ goto NextOperand;
+
+
+ case ARGI_BUFFER_OR_STRING:
+
+ /* Need an operand of type STRING or BUFFER */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+
+ /* Valid operand */
+ break;
+
+ case ACPI_TYPE_INTEGER:
+
+ /* Highest priority conversion is to type Buffer */
+
+ Status = AcpiExConvertToBuffer (ObjDesc, StackPtr);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (ObjDesc != *StackPtr)
+ {
+ AcpiUtRemoveReference (ObjDesc);
+ }
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Needed [Integer/String/Buffer], found [%s] %p",
+ AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+ goto NextOperand;
+
+
+ case ARGI_DATAOBJECT:
+ /*
+ * ARGI_DATAOBJECT is only used by the SizeOf operator.
+ * Need a buffer, string, package, or RefOf reference.
+ *
+ * The only reference allowed here is a direct reference to
+ * a namespace node.
+ */
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_PACKAGE:
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ /* Valid operand */
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Needed [Buffer/String/Package/Reference], found [%s] %p",
+ AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+ goto NextOperand;
+
+
+ case ARGI_COMPLEXOBJ:
+
+ /* Need a buffer or package or (ACPI 2.0) String */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_PACKAGE:
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+
+ /* Valid operand */
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Needed [Buffer/String/Package], found [%s] %p",
+ AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+ goto NextOperand;
+
+
+ case ARGI_REGION_OR_BUFFER: /* Used by Load() only */
+
+ /* Need an operand of type REGION or a BUFFER (which could be a resolved region field) */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_BUFFER:
+ case ACPI_TYPE_REGION:
+
+ /* Valid operand */
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Needed [Region/Buffer], found [%s] %p",
+ AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+ goto NextOperand;
+
+
+ case ARGI_DATAREFOBJ:
+
+ /* Used by the Store() operator only */
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_PACKAGE:
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+ case ACPI_TYPE_BUFFER_FIELD:
+ case ACPI_TYPE_LOCAL_REFERENCE:
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
+ case ACPI_TYPE_DDB_HANDLE:
+
+ /* Valid operand */
+ break;
+
+ default:
+
+ if (AcpiGbl_EnableInterpreterSlack)
+ {
+ /*
+ * Enable original behavior of Store(), allowing any and all
+ * objects as the source operand. The ACPI spec does not
+ * allow this, however.
+ */
+ break;
+ }
+
+ if (TargetOp == AML_DEBUG_OP)
+ {
+ /* Allow store of any object to the Debug object */
+
+ break;
+ }
+
+ ACPI_ERROR ((AE_INFO,
+ "Needed Integer/Buffer/String/Package/Ref/Ddb], found [%s] %p",
+ AcpiUtGetObjectTypeName (ObjDesc), ObjDesc));
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+ goto NextOperand;
+
+
+ default:
+
+ /* Unknown type */
+
+ ACPI_ERROR ((AE_INFO,
+ "Internal - Unknown ARGI (required operand) type %X",
+ ThisArgType));
+
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Make sure that the original object was resolved to the
+ * required object type (Simple cases only).
+ */
+ Status = AcpiExCheckObjectType (TypeNeeded,
+ ACPI_GET_OBJECT_TYPE (*StackPtr), *StackPtr);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+NextOperand:
+ /*
+ * If more operands needed, decrement StackPtr to point
+ * to next operand on stack
+ */
+ if (GET_CURRENT_ARG_TYPE (ArgTypes))
+ {
+ StackPtr--;
+ }
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exstore.c b/sys/contrib/dev/acpica/exstore.c
new file mode 100644
index 0000000..c4eb8915
--- /dev/null
+++ b/sys/contrib/dev/acpica/exstore.c
@@ -0,0 +1,756 @@
+
+/******************************************************************************
+ *
+ * Module Name: exstore - AML Interpreter object store support
+ * $Revision: 1.203 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXSTORE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acparser.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exstore")
+
+/* Local prototypes */
+
+static void
+AcpiExDoDebugObject (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ UINT32 Level,
+ UINT32 Index);
+
+static ACPI_STATUS
+AcpiExStoreObjectToIndex (
+ ACPI_OPERAND_OBJECT *ValDesc,
+ ACPI_OPERAND_OBJECT *DestDesc,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDoDebugObject
+ *
+ * PARAMETERS: SourceDesc - Value to be stored
+ * Level - Indentation level (used for packages)
+ * Index - Current package element, zero if not pkg
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Handles stores to the Debug Object.
+ *
+ ******************************************************************************/
+
+static void
+AcpiExDoDebugObject (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ UINT32 Level,
+ UINT32 Index)
+{
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExDoDebugObject, SourceDesc);
+
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[ACPI Debug] %*s",
+ Level, " "));
+
+ /* Display index for package output only */
+
+ if (Index > 0)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT,
+ "(%.2u) ", Index -1));
+ }
+
+ if (!SourceDesc)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "<Null Object>\n"));
+ return_VOID;
+ }
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_OPERAND)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%s: ",
+ AcpiUtGetObjectTypeName (SourceDesc)));
+
+ if (!AcpiUtValidInternalObject (SourceDesc))
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT,
+ "%p, Invalid Internal Object!\n", SourceDesc));
+ return_VOID;
+ }
+ }
+ else if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc) == ACPI_DESC_TYPE_NAMED)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%s: %p\n",
+ AcpiUtGetTypeName (((ACPI_NAMESPACE_NODE *) SourceDesc)->Type),
+ SourceDesc));
+ return_VOID;
+ }
+ else
+ {
+ return_VOID;
+ }
+
+ switch (ACPI_GET_OBJECT_TYPE (SourceDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+
+ /* Output correct integer width */
+
+ if (AcpiGbl_IntegerByteWidth == 4)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X\n",
+ (UINT32) SourceDesc->Integer.Value));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "0x%8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (SourceDesc->Integer.Value)));
+ }
+ break;
+
+ case ACPI_TYPE_BUFFER:
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X]\n",
+ (UINT32) SourceDesc->Buffer.Length));
+ ACPI_DUMP_BUFFER (SourceDesc->Buffer.Pointer,
+ (SourceDesc->Buffer.Length < 256) ? SourceDesc->Buffer.Length : 256);
+ break;
+
+ case ACPI_TYPE_STRING:
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X] \"%s\"\n",
+ SourceDesc->String.Length, SourceDesc->String.Pointer));
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[0x%.2X Elements]\n",
+ SourceDesc->Package.Count));
+
+ /* Output the entire contents of the package */
+
+ for (i = 0; i < SourceDesc->Package.Count; i++)
+ {
+ AcpiExDoDebugObject (SourceDesc->Package.Elements[i],
+ Level+4, i+1);
+ }
+ break;
+
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ if (SourceDesc->Reference.Opcode == AML_INDEX_OP)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[%s, 0x%X]\n",
+ AcpiPsGetOpcodeName (SourceDesc->Reference.Opcode),
+ SourceDesc->Reference.Offset));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "[%s]\n",
+ AcpiPsGetOpcodeName (SourceDesc->Reference.Opcode)));
+ }
+
+
+ if (SourceDesc->Reference.Object)
+ {
+ if (ACPI_GET_DESCRIPTOR_TYPE (SourceDesc->Reference.Object) ==
+ ACPI_DESC_TYPE_NAMED)
+ {
+ AcpiExDoDebugObject (((ACPI_NAMESPACE_NODE *)
+ SourceDesc->Reference.Object)->Object,
+ Level+4, 0);
+ }
+ else
+ {
+ AcpiExDoDebugObject (SourceDesc->Reference.Object, Level+4, 0);
+ }
+ }
+ else if (SourceDesc->Reference.Node)
+ {
+ AcpiExDoDebugObject ((SourceDesc->Reference.Node)->Object,
+ Level+4, 0);
+ }
+ break;
+
+ default:
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_DEBUG_OBJECT, "%p %s\n",
+ SourceDesc, AcpiUtGetObjectTypeName (SourceDesc)));
+ break;
+ }
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_EXEC, "\n"));
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExStore
+ *
+ * PARAMETERS: *SourceDesc - Value to be stored
+ * *DestDesc - Where to store it. Must be an NS node
+ * or an ACPI_OPERAND_OBJECT of type
+ * Reference;
+ * WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Store the value described by SourceDesc into the location
+ * described by DestDesc. Called by various interpreter
+ * functions to store the result of an operation into
+ * the destination operand -- not just simply the actual "Store"
+ * ASL operator.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExStore (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *DestDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *RefDesc = DestDesc;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExStore, DestDesc);
+
+
+ /* Validate parameters */
+
+ if (!SourceDesc || !DestDesc)
+ {
+ ACPI_ERROR ((AE_INFO, "Null parameter"));
+ return_ACPI_STATUS (AE_AML_NO_OPERAND);
+ }
+
+ /* DestDesc can be either a namespace node or an ACPI object */
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (DestDesc) == ACPI_DESC_TYPE_NAMED)
+ {
+ /*
+ * Dest is a namespace node,
+ * Storing an object into a Named node.
+ */
+ Status = AcpiExStoreObjectToNode (SourceDesc,
+ (ACPI_NAMESPACE_NODE *) DestDesc, WalkState,
+ ACPI_IMPLICIT_CONVERSION);
+
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Destination object must be a Reference or a Constant object */
+
+ switch (ACPI_GET_OBJECT_TYPE (DestDesc))
+ {
+ case ACPI_TYPE_LOCAL_REFERENCE:
+ break;
+
+ case ACPI_TYPE_INTEGER:
+
+ /* Allow stores to Constants -- a Noop as per ACPI spec */
+
+ if (DestDesc->Common.Flags & AOPOBJ_AML_CONSTANT)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*lint -fallthrough */
+
+ default:
+
+ /* Destination is not a Reference object */
+
+ ACPI_ERROR ((AE_INFO,
+ "Target is not a Reference or Constant object - %s [%p]",
+ AcpiUtGetObjectTypeName (DestDesc), DestDesc));
+
+ ACPI_DUMP_STACK_ENTRY (SourceDesc);
+ ACPI_DUMP_STACK_ENTRY (DestDesc);
+ ACPI_DUMP_OPERANDS (&DestDesc, ACPI_IMODE_EXECUTE, "ExStore",
+ 2, "Target is not a Reference or Constant object");
+
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /*
+ * Examine the Reference opcode. These cases are handled:
+ *
+ * 1) Store to Name (Change the object associated with a name)
+ * 2) Store to an indexed area of a Buffer or Package
+ * 3) Store to a Method Local or Arg
+ * 4) Store to the debug object
+ */
+ switch (RefDesc->Reference.Opcode)
+ {
+ case AML_REF_OF_OP:
+
+ /* Storing an object into a Name "container" */
+
+ Status = AcpiExStoreObjectToNode (SourceDesc,
+ RefDesc->Reference.Object,
+ WalkState, ACPI_IMPLICIT_CONVERSION);
+ break;
+
+
+ case AML_INDEX_OP:
+
+ /* Storing to an Index (pointer into a packager or buffer) */
+
+ Status = AcpiExStoreObjectToIndex (SourceDesc, RefDesc, WalkState);
+ break;
+
+
+ case AML_LOCAL_OP:
+ case AML_ARG_OP:
+
+ /* Store to a method local/arg */
+
+ Status = AcpiDsStoreObjectToLocal (RefDesc->Reference.Opcode,
+ RefDesc->Reference.Offset, SourceDesc, WalkState);
+ break;
+
+
+ case AML_DEBUG_OP:
+
+ /*
+ * Storing to the Debug object causes the value stored to be
+ * displayed and otherwise has no effect -- see ACPI Specification
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "**** Write to Debug Object: Object %p %s ****:\n\n",
+ SourceDesc, AcpiUtGetObjectTypeName (SourceDesc)));
+
+ AcpiExDoDebugObject (SourceDesc, 0, 0);
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown Reference opcode %X",
+ RefDesc->Reference.Opcode));
+ ACPI_DUMP_ENTRY (RefDesc, ACPI_LV_ERROR);
+
+ Status = AE_AML_INTERNAL;
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExStoreObjectToIndex
+ *
+ * PARAMETERS: *SourceDesc - Value to be stored
+ * *DestDesc - Named object to receive the value
+ * WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Store the object to indexed Buffer or Package element
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiExStoreObjectToIndex (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *IndexDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *NewDesc;
+ UINT8 Value = 0;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE (ExStoreObjectToIndex);
+
+
+ /*
+ * Destination must be a reference pointer, and
+ * must point to either a buffer or a package
+ */
+ switch (IndexDesc->Reference.TargetType)
+ {
+ case ACPI_TYPE_PACKAGE:
+ /*
+ * Storing to a package element. Copy the object and replace
+ * any existing object with the new object. No implicit
+ * conversion is performed.
+ *
+ * The object at *(IndexDesc->Reference.Where) is the
+ * element within the package that is to be modified.
+ * The parent package object is at IndexDesc->Reference.Object
+ */
+ ObjDesc = *(IndexDesc->Reference.Where);
+
+ Status = AcpiUtCopyIobjectToIobject (SourceDesc, &NewDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (ObjDesc)
+ {
+ /* Decrement reference count by the ref count of the parent package */
+
+ for (i = 0;
+ i < ((ACPI_OPERAND_OBJECT *)
+ IndexDesc->Reference.Object)->Common.ReferenceCount;
+ i++)
+ {
+ AcpiUtRemoveReference (ObjDesc);
+ }
+ }
+
+ *(IndexDesc->Reference.Where) = NewDesc;
+
+ /* Increment ref count by the ref count of the parent package-1 */
+
+ for (i = 1;
+ i < ((ACPI_OPERAND_OBJECT *)
+ IndexDesc->Reference.Object)->Common.ReferenceCount;
+ i++)
+ {
+ AcpiUtAddReference (NewDesc);
+ }
+
+ break;
+
+
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ /*
+ * Store into a Buffer or String (not actually a real BufferField)
+ * at a location defined by an Index.
+ *
+ * The first 8-bit element of the source object is written to the
+ * 8-bit Buffer location defined by the Index destination object,
+ * according to the ACPI 2.0 specification.
+ */
+
+ /*
+ * Make sure the target is a Buffer or String. An error should
+ * not happen here, since the ReferenceObject was constructed
+ * by the INDEX_OP code.
+ */
+ ObjDesc = IndexDesc->Reference.Object;
+ if ((ACPI_GET_OBJECT_TYPE (ObjDesc) != ACPI_TYPE_BUFFER) &&
+ (ACPI_GET_OBJECT_TYPE (ObjDesc) != ACPI_TYPE_STRING))
+ {
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /*
+ * The assignment of the individual elements will be slightly
+ * different for each source type.
+ */
+ switch (ACPI_GET_OBJECT_TYPE (SourceDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+
+ /* Use the least-significant byte of the integer */
+
+ Value = (UINT8) (SourceDesc->Integer.Value);
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ case ACPI_TYPE_STRING:
+
+ /* Note: Takes advantage of common string/buffer fields */
+
+ Value = SourceDesc->Buffer.Pointer[0];
+ break;
+
+ default:
+
+ /* All other types are invalid */
+
+ ACPI_ERROR ((AE_INFO,
+ "Source must be Integer/Buffer/String type, not %s",
+ AcpiUtGetObjectTypeName (SourceDesc)));
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /* Store the source value into the target buffer byte */
+
+ ObjDesc->Buffer.Pointer[IndexDesc->Reference.Offset] = Value;
+ break;
+
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Target is not a Package or BufferField"));
+ Status = AE_AML_OPERAND_TYPE;
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExStoreObjectToNode
+ *
+ * PARAMETERS: SourceDesc - Value to be stored
+ * Node - Named object to receive the value
+ * WalkState - Current walk state
+ * ImplicitConversion - Perform implicit conversion (yes/no)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Store the object to the named object.
+ *
+ * The Assignment of an object to a named object is handled here
+ * The value passed in will replace the current value (if any)
+ * with the input value.
+ *
+ * When storing into an object the data is converted to the
+ * target object type then stored in the object. This means
+ * that the target object type (for an initialized target) will
+ * not be changed by a store operation.
+ *
+ * Assumes parameters are already validated.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExStoreObjectToNode (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_WALK_STATE *WalkState,
+ UINT8 ImplicitConversion)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_OPERAND_OBJECT *TargetDesc;
+ ACPI_OPERAND_OBJECT *NewDesc;
+ ACPI_OBJECT_TYPE TargetType;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExStoreObjectToNode, SourceDesc);
+
+
+ /* Get current type of the node, and object attached to Node */
+
+ TargetType = AcpiNsGetType (Node);
+ TargetDesc = AcpiNsGetAttachedObject (Node);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Storing %p(%s) into node %p(%s)\n",
+ SourceDesc, AcpiUtGetObjectTypeName (SourceDesc),
+ Node, AcpiUtGetTypeName (TargetType)));
+
+ /*
+ * Resolve the source object to an actual value
+ * (If it is a reference object)
+ */
+ Status = AcpiExResolveObject (&SourceDesc, TargetType, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* If no implicit conversion, drop into the default case below */
+
+ if ((!ImplicitConversion) || (WalkState->Opcode == AML_COPY_OP))
+ {
+ /* Force execution of default (no implicit conversion) */
+
+ TargetType = ACPI_TYPE_ANY;
+ }
+
+ /* Do the actual store operation */
+
+ switch (TargetType)
+ {
+ case ACPI_TYPE_BUFFER_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. */
+
+ Status = AcpiExWriteDataToField (SourceDesc, TargetDesc,
+ &WalkState->ResultObj);
+ break;
+
+
+ case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+
+ /*
+ * These target types are all of type Integer/String/Buffer, and
+ * therefore support implicit conversion before the store.
+ *
+ * Copy and/or convert the source object to a new target object
+ */
+ Status = AcpiExStoreObjectToObject (SourceDesc, TargetDesc,
+ &NewDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (NewDesc != TargetDesc)
+ {
+ /*
+ * Store the new NewDesc as the new value of the Name, and set
+ * the Name's type to that of the value being stored in it.
+ * SourceDesc reference count is incremented by AttachObject.
+ *
+ * Note: This may change the type of the node if an explicit store
+ * has been performed such that the node/object type has been
+ * changed.
+ */
+ Status = AcpiNsAttachObject (Node, NewDesc, NewDesc->Common.Type);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Store %s into %s via Convert/Attach\n",
+ AcpiUtGetObjectTypeName (SourceDesc),
+ AcpiUtGetObjectTypeName (NewDesc)));
+ }
+ break;
+
+
+ default:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Storing %s (%p) directly into node (%p) with no implicit conversion\n",
+ AcpiUtGetObjectTypeName (SourceDesc), SourceDesc, Node));
+
+ /* No conversions for all other types. Just attach the source object */
+
+ Status = AcpiNsAttachObject (Node, SourceDesc,
+ ACPI_GET_OBJECT_TYPE (SourceDesc));
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exstoren.c b/sys/contrib/dev/acpica/exstoren.c
new file mode 100644
index 0000000..1f87ab2
--- /dev/null
+++ b/sys/contrib/dev/acpica/exstoren.c
@@ -0,0 +1,385 @@
+
+/******************************************************************************
+ *
+ * Module Name: exstoren - AML Interpreter object store support,
+ * Store to Node (namespace object)
+ * $Revision: 1.71 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXSTOREN_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exstoren")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExResolveObject
+ *
+ * PARAMETERS: SourceDescPtr - Pointer to the source object
+ * TargetType - Current type of the target
+ * WalkState - Current walk state
+ *
+ * RETURN: Status, resolved object in SourceDescPtr.
+ *
+ * DESCRIPTION: Resolve an object. If the object is a reference, dereference
+ * it and return the actual object in the SourceDescPtr.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExResolveObject (
+ ACPI_OPERAND_OBJECT **SourceDescPtr,
+ ACPI_OBJECT_TYPE TargetType,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT *SourceDesc = *SourceDescPtr;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (ExResolveObject);
+
+
+ /* Ensure we have a Target that can be stored to */
+
+ switch (TargetType)
+ {
+ case ACPI_TYPE_BUFFER_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)
+ */
+
+ case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+
+ /*
+ * Stores into a Field/Region or into a Integer/Buffer/String
+ * are all essentially the same. This case handles the
+ * "interchangeable" types Integer, String, and Buffer.
+ */
+ if (ACPI_GET_OBJECT_TYPE (SourceDesc) == ACPI_TYPE_LOCAL_REFERENCE)
+ {
+ /* Resolve a reference object first */
+
+ Status = AcpiExResolveToValue (SourceDescPtr, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+ }
+
+ /* For CopyObject, no further validation necessary */
+
+ if (WalkState->Opcode == AML_COPY_OP)
+ {
+ break;
+ }
+
+ /* Must have a Integer, Buffer, or String */
+
+ if ((ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_INTEGER) &&
+ (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_BUFFER) &&
+ (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_TYPE_STRING) &&
+ !((ACPI_GET_OBJECT_TYPE (SourceDesc) == ACPI_TYPE_LOCAL_REFERENCE) && (SourceDesc->Reference.Opcode == AML_LOAD_OP)))
+ {
+ /* Conversion successful but still not a valid type */
+
+ ACPI_ERROR ((AE_INFO,
+ "Cannot assign type %s to %s (must be type Int/Str/Buf)",
+ AcpiUtGetObjectTypeName (SourceDesc),
+ AcpiUtGetTypeName (TargetType)));
+ Status = AE_AML_OPERAND_TYPE;
+ }
+ break;
+
+
+ case ACPI_TYPE_LOCAL_ALIAS:
+ case ACPI_TYPE_LOCAL_METHOD_ALIAS:
+
+ /*
+ * All aliases should have been resolved earlier, during the
+ * operand resolution phase.
+ */
+ ACPI_ERROR ((AE_INFO, "Store into an unresolved Alias object"));
+ Status = AE_AML_INTERNAL;
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+ default:
+
+ /*
+ * All other types than Alias and the various Fields come here,
+ * including the untyped case - ACPI_TYPE_ANY.
+ */
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExStoreObjectToObject
+ *
+ * PARAMETERS: SourceDesc - Object to store
+ * DestDesc - Object to receive a copy of the source
+ * NewDesc - New object if DestDesc is obsoleted
+ * WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: "Store" an object to another object. This may include
+ * converting the source type to the target type (implicit
+ * conversion), and a copy of the value of the source to
+ * the target.
+ *
+ * The Assignment of an object to another (not named) object
+ * is handled here.
+ * The Source passed in will replace the current value (if any)
+ * with the input value.
+ *
+ * When storing into an object the data is converted to the
+ * target object type then stored in the object. This means
+ * that the target object type (for an initialized target) will
+ * not be changed by a store operation.
+ *
+ * This module allows destination types of Number, String,
+ * Buffer, and Package.
+ *
+ * Assumes parameters are already validated. NOTE: SourceDesc
+ * resolution (from a reference object) must be performed by
+ * the caller if necessary.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExStoreObjectToObject (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *DestDesc,
+ ACPI_OPERAND_OBJECT **NewDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_OPERAND_OBJECT *ActualSrcDesc;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExStoreObjectToObject, SourceDesc);
+
+
+ ActualSrcDesc = SourceDesc;
+ if (!DestDesc)
+ {
+ /*
+ * There is no destination object (An uninitialized node or
+ * package element), so we can simply copy the source object
+ * creating a new destination object
+ */
+ Status = AcpiUtCopyIobjectToIobject (ActualSrcDesc, NewDesc, WalkState);
+ return_ACPI_STATUS (Status);
+ }
+
+ if (ACPI_GET_OBJECT_TYPE (SourceDesc) != ACPI_GET_OBJECT_TYPE (DestDesc))
+ {
+ /*
+ * The source type does not match the type of the destination.
+ * Perform the "implicit conversion" of the source to the current type
+ * of the target as per the ACPI specification.
+ *
+ * If no conversion performed, ActualSrcDesc = SourceDesc.
+ * Otherwise, ActualSrcDesc is a temporary object to hold the
+ * converted object.
+ */
+ Status = AcpiExConvertToTargetType (ACPI_GET_OBJECT_TYPE (DestDesc),
+ SourceDesc, &ActualSrcDesc, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (SourceDesc == ActualSrcDesc)
+ {
+ /*
+ * No conversion was performed. Return the SourceDesc as the
+ * new object.
+ */
+ *NewDesc = SourceDesc;
+ return_ACPI_STATUS (AE_OK);
+ }
+ }
+
+ /*
+ * We now have two objects of identical types, and we can perform a
+ * copy of the *value* of the source object.
+ */
+ switch (ACPI_GET_OBJECT_TYPE (DestDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+
+ DestDesc->Integer.Value = ActualSrcDesc->Integer.Value;
+
+ /* Truncate value if we are executing from a 32-bit ACPI table */
+
+ AcpiExTruncateFor32bitTable (DestDesc);
+ break;
+
+ case ACPI_TYPE_STRING:
+
+ Status = AcpiExStoreStringToString (ActualSrcDesc, DestDesc);
+ break;
+
+ case ACPI_TYPE_BUFFER:
+
+ Status = AcpiExStoreBufferToBuffer (ActualSrcDesc, DestDesc);
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+
+ Status = AcpiUtCopyIobjectToIobject (ActualSrcDesc, &DestDesc,
+ WalkState);
+ break;
+
+ default:
+ /*
+ * All other types come here.
+ */
+ ACPI_WARNING ((AE_INFO, "Store into type %s not implemented",
+ AcpiUtGetObjectTypeName (DestDesc)));
+
+ Status = AE_NOT_IMPLEMENTED;
+ break;
+ }
+
+ if (ActualSrcDesc != SourceDesc)
+ {
+ /* Delete the intermediate (temporary) source object */
+
+ AcpiUtRemoveReference (ActualSrcDesc);
+ }
+
+ *NewDesc = DestDesc;
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exstorob.c b/sys/contrib/dev/acpica/exstorob.c
new file mode 100644
index 0000000..02daa39
--- /dev/null
+++ b/sys/contrib/dev/acpica/exstorob.c
@@ -0,0 +1,302 @@
+
+/******************************************************************************
+ *
+ * Module Name: exstorob - AML Interpreter object store support, store to object
+ * $Revision: 1.62 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXSTOROB_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exstorob")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExStoreBufferToBuffer
+ *
+ * PARAMETERS: SourceDesc - Source object to copy
+ * TargetDesc - Destination object of the copy
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Copy a buffer object to another buffer object.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExStoreBufferToBuffer (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *TargetDesc)
+{
+ UINT32 Length;
+ UINT8 *Buffer;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExStoreBufferToBuffer, SourceDesc);
+
+
+ /* We know that SourceDesc is a buffer by now */
+
+ Buffer = ACPI_CAST_PTR (UINT8, SourceDesc->Buffer.Pointer);
+ Length = SourceDesc->Buffer.Length;
+
+ /*
+ * If target is a buffer of length zero or is a static buffer,
+ * allocate a new buffer of the proper length
+ */
+ if ((TargetDesc->Buffer.Length == 0) ||
+ (TargetDesc->Common.Flags & AOPOBJ_STATIC_POINTER))
+ {
+ TargetDesc->Buffer.Pointer = ACPI_ALLOCATE (Length);
+ if (!TargetDesc->Buffer.Pointer)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ TargetDesc->Buffer.Length = Length;
+ }
+
+ /* Copy source buffer to target buffer */
+
+ if (Length <= TargetDesc->Buffer.Length)
+ {
+ /* Clear existing buffer and copy in the new one */
+
+ ACPI_MEMSET (TargetDesc->Buffer.Pointer, 0, TargetDesc->Buffer.Length);
+ ACPI_MEMCPY (TargetDesc->Buffer.Pointer, Buffer, Length);
+
+#ifdef ACPI_OBSOLETE_BEHAVIOR
+ /*
+ * NOTE: ACPI versions up to 3.0 specified that the buffer must be
+ * truncated if the string is smaller than the buffer. However, "other"
+ * implementations of ACPI never did this and thus became the defacto
+ * standard. ACPI 3.0A changes this behavior such that the buffer
+ * is no longer truncated.
+ */
+
+ /*
+ * OBSOLETE BEHAVIOR:
+ * If the original source was a string, we must truncate the buffer,
+ * according to the ACPI spec. Integer-to-Buffer and Buffer-to-Buffer
+ * copy must not truncate the original buffer.
+ */
+ if (OriginalSrcType == ACPI_TYPE_STRING)
+ {
+ /* Set the new length of the target */
+
+ TargetDesc->Buffer.Length = Length;
+ }
+#endif
+ }
+ else
+ {
+ /* Truncate the source, copy only what will fit */
+
+ ACPI_MEMCPY (TargetDesc->Buffer.Pointer, Buffer,
+ TargetDesc->Buffer.Length);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Truncating source buffer from %X to %X\n",
+ Length, TargetDesc->Buffer.Length));
+ }
+
+ /* Copy flags */
+
+ TargetDesc->Buffer.Flags = SourceDesc->Buffer.Flags;
+ TargetDesc->Common.Flags &= ~AOPOBJ_STATIC_POINTER;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExStoreStringToString
+ *
+ * PARAMETERS: SourceDesc - Source object to copy
+ * TargetDesc - Destination object of the copy
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Copy a String object to another String object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExStoreStringToString (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *TargetDesc)
+{
+ UINT32 Length;
+ UINT8 *Buffer;
+
+
+ ACPI_FUNCTION_TRACE_PTR (ExStoreStringToString, SourceDesc);
+
+
+ /* We know that SourceDesc is a string by now */
+
+ Buffer = ACPI_CAST_PTR (UINT8, SourceDesc->String.Pointer);
+ Length = SourceDesc->String.Length;
+
+ /*
+ * Replace existing string value if it will fit and the string
+ * pointer is not a static pointer (part of an ACPI table)
+ */
+ if ((Length < TargetDesc->String.Length) &&
+ (!(TargetDesc->Common.Flags & AOPOBJ_STATIC_POINTER)))
+ {
+ /*
+ * String will fit in existing non-static buffer.
+ * Clear old string and copy in the new one
+ */
+ ACPI_MEMSET (TargetDesc->String.Pointer, 0,
+ (ACPI_SIZE) TargetDesc->String.Length + 1);
+ ACPI_MEMCPY (TargetDesc->String.Pointer, Buffer, Length);
+ }
+ else
+ {
+ /*
+ * Free the current buffer, then allocate a new buffer
+ * large enough to hold the value
+ */
+ if (TargetDesc->String.Pointer &&
+ (!(TargetDesc->Common.Flags & AOPOBJ_STATIC_POINTER)))
+ {
+ /* Only free if not a pointer into the DSDT */
+
+ ACPI_FREE (TargetDesc->String.Pointer);
+ }
+
+ TargetDesc->String.Pointer = ACPI_ALLOCATE_ZEROED (
+ (ACPI_SIZE) Length + 1);
+ if (!TargetDesc->String.Pointer)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ TargetDesc->Common.Flags &= ~AOPOBJ_STATIC_POINTER;
+ ACPI_MEMCPY (TargetDesc->String.Pointer, Buffer, Length);
+ }
+
+ /* Set the new target length */
+
+ TargetDesc->String.Length = Length;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/exsystem.c b/sys/contrib/dev/acpica/exsystem.c
new file mode 100644
index 0000000..81c92be
--- /dev/null
+++ b/sys/contrib/dev/acpica/exsystem.c
@@ -0,0 +1,419 @@
+
+/******************************************************************************
+ *
+ * Module Name: exsystem - Interface to OS services
+ * $Revision: 1.93 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXSYSTEM_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acevents.h>
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exsystem")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExSystemWaitSemaphore
+ *
+ * PARAMETERS: Semaphore - Semaphore to wait on
+ * Timeout - Max time to wait
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Implements a semaphore wait with a check to see if the
+ * semaphore is available immediately. If it is not, the
+ * interpreter is released before waiting.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExSystemWaitSemaphore (
+ ACPI_SEMAPHORE Semaphore,
+ UINT16 Timeout)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (ExSystemWaitSemaphore);
+
+
+ Status = AcpiOsWaitSemaphore (Semaphore, 1, ACPI_DO_NOT_WAIT);
+ if (ACPI_SUCCESS (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (Status == AE_TIME)
+ {
+ /* We must wait, so unlock the interpreter */
+
+ AcpiExRelinquishInterpreter ();
+
+ Status = AcpiOsWaitSemaphore (Semaphore, 1, Timeout);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "*** Thread awake after blocking, %s\n",
+ AcpiFormatException (Status)));
+
+ /* Reacquire the interpreter */
+
+ AcpiExReacquireInterpreter ();
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExSystemWaitMutex
+ *
+ * PARAMETERS: Mutex - Mutex to wait on
+ * Timeout - Max time to wait
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Implements a mutex wait with a check to see if the
+ * mutex is available immediately. If it is not, the
+ * interpreter is released before waiting.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExSystemWaitMutex (
+ ACPI_MUTEX Mutex,
+ UINT16 Timeout)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (ExSystemWaitMutex);
+
+
+ Status = AcpiOsAcquireMutex (Mutex, ACPI_DO_NOT_WAIT);
+ if (ACPI_SUCCESS (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (Status == AE_TIME)
+ {
+ /* We must wait, so unlock the interpreter */
+
+ AcpiExRelinquishInterpreter ();
+
+ Status = AcpiOsAcquireMutex (Mutex, Timeout);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "*** Thread awake after blocking, %s\n",
+ AcpiFormatException (Status)));
+
+ /* Reacquire the interpreter */
+
+ AcpiExReacquireInterpreter ();
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExSystemDoStall
+ *
+ * PARAMETERS: HowLong - The amount of time to stall,
+ * in microseconds
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Suspend running thread for specified amount of time.
+ * Note: ACPI specification requires that Stall() does not
+ * relinquish the processor, and delays longer than 100 usec
+ * should use Sleep() instead. We allow stalls up to 255 usec
+ * for compatibility with other interpreters and existing BIOSs.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExSystemDoStall (
+ UINT32 HowLong)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (HowLong > 255) /* 255 microseconds */
+ {
+ /*
+ * Longer than 255 usec, this is an error
+ *
+ * (ACPI specifies 100 usec as max, but this gives some slack in
+ * order to support existing BIOSs)
+ */
+ ACPI_ERROR ((AE_INFO, "Time parameter is too large (%d)",
+ HowLong));
+ Status = AE_AML_OPERAND_VALUE;
+ }
+ else
+ {
+ AcpiOsStall (HowLong);
+ }
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExSystemDoSuspend
+ *
+ * PARAMETERS: HowLong - The amount of time to suspend,
+ * in milliseconds
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Suspend running thread for specified amount of time.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExSystemDoSuspend (
+ ACPI_INTEGER HowLong)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Since this thread will sleep, we must release the interpreter */
+
+ AcpiExRelinquishInterpreter ();
+
+ AcpiOsSleep (HowLong);
+
+ /* And now we must get the interpreter again */
+
+ AcpiExReacquireInterpreter ();
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExSystemSignalEvent
+ *
+ * PARAMETERS: ObjDesc - The object descriptor for this op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Provides an access point to perform synchronization operations
+ * within the AML.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExSystemSignalEvent (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (ExSystemSignalEvent);
+
+
+ if (ObjDesc)
+ {
+ Status = AcpiOsSignalSemaphore (ObjDesc->Event.OsSemaphore, 1);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExSystemWaitEvent
+ *
+ * PARAMETERS: TimeDesc - The 'time to delay' object descriptor
+ * ObjDesc - The object descriptor for this op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Provides an access point to perform synchronization operations
+ * within the AML. This operation is a request to wait for an
+ * event.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExSystemWaitEvent (
+ ACPI_OPERAND_OBJECT *TimeDesc,
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (ExSystemWaitEvent);
+
+
+ if (ObjDesc)
+ {
+ Status = AcpiExSystemWaitSemaphore (ObjDesc->Event.OsSemaphore,
+ (UINT16) TimeDesc->Integer.Value);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExSystemResetEvent
+ *
+ * PARAMETERS: ObjDesc - The object descriptor for this op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Reset an event to a known state.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiExSystemResetEvent (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_SEMAPHORE TempSemaphore;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * We are going to simply delete the existing semaphore and
+ * create a new one!
+ */
+ Status = AcpiOsCreateSemaphore (ACPI_NO_UNIT_LIMIT, 0, &TempSemaphore);
+ if (ACPI_SUCCESS (Status))
+ {
+ (void) AcpiOsDeleteSemaphore (ObjDesc->Event.OsSemaphore);
+ ObjDesc->Event.OsSemaphore = TempSemaphore;
+ }
+
+ return (Status);
+}
+
diff --git a/sys/contrib/dev/acpica/exutils.c b/sys/contrib/dev/acpica/exutils.c
new file mode 100644
index 0000000..2ce75bb
--- /dev/null
+++ b/sys/contrib/dev/acpica/exutils.c
@@ -0,0 +1,558 @@
+
+/******************************************************************************
+ *
+ * Module Name: exutils - interpreter/scanner utilities
+ * $Revision: 1.129 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __EXUTILS_C__
+
+/*
+ * DEFINE_AML_GLOBALS is tested in amlcode.h
+ * to determine whether certain global names should be "defined" or only
+ * "declared" in the current compilation. This enhances maintainability
+ * by enabling a single header file to embody all knowledge of the names
+ * in question.
+ *
+ * Exactly one module of any executable should #define DEFINE_GLOBALS
+ * before #including the header files which use this convention. The
+ * names in question will be defined and initialized in that module,
+ * and declared as extern in all other modules which #include those
+ * header files.
+ */
+
+#define DEFINE_AML_GLOBALS
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acevents.h>
+
+#define _COMPONENT ACPI_EXECUTER
+ ACPI_MODULE_NAME ("exutils")
+
+/* Local prototypes */
+
+static UINT32
+AcpiExDigitsNeeded (
+ ACPI_INTEGER Value,
+ UINT32 Base);
+
+
+#ifndef ACPI_NO_METHOD_EXECUTION
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExEnterInterpreter
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Enter the interpreter execution region. Failure to enter
+ * the interpreter region is a fatal system error. Used in
+ * conjunction with ExitInterpreter.
+ *
+ ******************************************************************************/
+
+void
+AcpiExEnterInterpreter (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (ExEnterInterpreter);
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_INTERPRETER);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO, "Could not acquire AML Interpreter mutex"));
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExReacquireInterpreter
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Reacquire the interpreter execution region from within the
+ * interpreter code. Failure to enter the interpreter region is a
+ * fatal system error. Used in conjuction with
+ * RelinquishInterpreter
+ *
+ ******************************************************************************/
+
+void
+AcpiExReacquireInterpreter (
+ void)
+{
+ ACPI_FUNCTION_TRACE (ExReacquireInterpreter);
+
+
+ /*
+ * If the global serialized flag is set, do not release the interpreter,
+ * since it was not actually released by AcpiExRelinquishInterpreter.
+ * This forces the interpreter to be single threaded.
+ */
+ if (!AcpiGbl_AllMethodsSerialized)
+ {
+ AcpiExEnterInterpreter ();
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExExitInterpreter
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Exit the interpreter execution region. This is the top level
+ * routine used to exit the interpreter when all processing has
+ * been completed.
+ *
+ ******************************************************************************/
+
+void
+AcpiExExitInterpreter (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (ExExitInterpreter);
+
+
+ Status = AcpiUtReleaseMutex (ACPI_MTX_INTERPRETER);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO, "Could not release AML Interpreter mutex"));
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExRelinquishInterpreter
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Exit the interpreter execution region, from within the
+ * interpreter - before attempting an operation that will possibly
+ * block the running thread.
+ *
+ * Cases where the interpreter is unlocked internally
+ * 1) Method to be blocked on a Sleep() AML opcode
+ * 2) Method to be blocked on an Acquire() AML opcode
+ * 3) Method to be blocked on a Wait() AML opcode
+ * 4) Method to be blocked to acquire the global lock
+ * 5) Method to be blocked waiting to execute a serialized control method
+ * that is currently executing
+ * 6) About to invoke a user-installed opregion handler
+ *
+ ******************************************************************************/
+
+void
+AcpiExRelinquishInterpreter (
+ void)
+{
+ ACPI_FUNCTION_TRACE (ExRelinquishInterpreter);
+
+
+ /*
+ * If the global serialized flag is set, do not release the interpreter.
+ * This forces the interpreter to be single threaded.
+ */
+ if (!AcpiGbl_AllMethodsSerialized)
+ {
+ AcpiExExitInterpreter ();
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExTruncateFor32bitTable
+ *
+ * PARAMETERS: ObjDesc - Object to be truncated
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Truncate an ACPI Integer to 32 bits if the execution mode is
+ * 32-bit, as determined by the revision of the DSDT.
+ *
+ ******************************************************************************/
+
+void
+AcpiExTruncateFor32bitTable (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * Object must be a valid number and we must be executing
+ * a control method. NS node could be there for AML_INT_NAMEPATH_OP.
+ */
+ if ((!ObjDesc) ||
+ (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND) ||
+ (ACPI_GET_OBJECT_TYPE (ObjDesc) != ACPI_TYPE_INTEGER))
+ {
+ return;
+ }
+
+ if (AcpiGbl_IntegerByteWidth == 4)
+ {
+ /*
+ * We are running a method that exists in a 32-bit ACPI table.
+ * Truncate the value to 32 bits by zeroing out the upper 32-bit field
+ */
+ ObjDesc->Integer.Value &= (ACPI_INTEGER) ACPI_UINT32_MAX;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExAcquireGlobalLock
+ *
+ * PARAMETERS: FieldFlags - Flags with Lock rule:
+ * AlwaysLock or NeverLock
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Obtain the ACPI hardware Global Lock, only if the field
+ * flags specifiy that it is to be obtained before field access.
+ *
+ ******************************************************************************/
+
+void
+AcpiExAcquireGlobalLock (
+ UINT32 FieldFlags)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (ExAcquireGlobalLock);
+
+
+ /* Only use the lock if the AlwaysLock bit is set */
+
+ if (!(FieldFlags & AML_FIELD_LOCK_RULE_MASK))
+ {
+ return_VOID;
+ }
+
+ /* Attempt to get the global lock, wait forever */
+
+ Status = AcpiExAcquireMutexObject (ACPI_WAIT_FOREVER,
+ AcpiGbl_GlobalLockMutex, AcpiOsGetThreadId ());
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not acquire Global Lock"));
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExReleaseGlobalLock
+ *
+ * PARAMETERS: FieldFlags - Flags with Lock rule:
+ * AlwaysLock or NeverLock
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Release the ACPI hardware Global Lock
+ *
+ ******************************************************************************/
+
+void
+AcpiExReleaseGlobalLock (
+ UINT32 FieldFlags)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (ExReleaseGlobalLock);
+
+
+ /* Only use the lock if the AlwaysLock bit is set */
+
+ if (!(FieldFlags & AML_FIELD_LOCK_RULE_MASK))
+ {
+ return_VOID;
+ }
+
+ /* Release the global lock */
+
+ Status = AcpiExReleaseMutexObject (AcpiGbl_GlobalLockMutex);
+ if (ACPI_FAILURE (Status))
+ {
+ /* Report the error, but there isn't much else we can do */
+
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not release Global Lock"));
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExDigitsNeeded
+ *
+ * PARAMETERS: Value - Value to be represented
+ * Base - Base of representation
+ *
+ * RETURN: The number of digits.
+ *
+ * DESCRIPTION: Calculate the number of digits needed to represent the Value
+ * in the given Base (Radix)
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiExDigitsNeeded (
+ ACPI_INTEGER Value,
+ UINT32 Base)
+{
+ UINT32 NumDigits;
+ ACPI_INTEGER CurrentValue;
+
+
+ ACPI_FUNCTION_TRACE (ExDigitsNeeded);
+
+
+ /* ACPI_INTEGER is unsigned, so we don't worry about a '-' prefix */
+
+ if (Value == 0)
+ {
+ return_UINT32 (1);
+ }
+
+ CurrentValue = Value;
+ NumDigits = 0;
+
+ /* Count the digits in the requested base */
+
+ while (CurrentValue)
+ {
+ (void) AcpiUtShortDivide (CurrentValue, Base, &CurrentValue, NULL);
+ NumDigits++;
+ }
+
+ return_UINT32 (NumDigits);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExEisaIdToString
+ *
+ * PARAMETERS: NumericId - EISA ID to be converted
+ * OutString - Where to put the converted string (8 bytes)
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Convert a numeric EISA ID to string representation
+ *
+ ******************************************************************************/
+
+void
+AcpiExEisaIdToString (
+ UINT32 NumericId,
+ char *OutString)
+{
+ UINT32 EisaId;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Swap ID to big-endian to get contiguous bits */
+
+ EisaId = AcpiUtDwordByteSwap (NumericId);
+
+ OutString[0] = (char) ('@' + (((unsigned long) EisaId >> 26) & 0x1f));
+ OutString[1] = (char) ('@' + ((EisaId >> 21) & 0x1f));
+ OutString[2] = (char) ('@' + ((EisaId >> 16) & 0x1f));
+ OutString[3] = AcpiUtHexToAsciiChar ((ACPI_INTEGER) EisaId, 12);
+ OutString[4] = AcpiUtHexToAsciiChar ((ACPI_INTEGER) EisaId, 8);
+ OutString[5] = AcpiUtHexToAsciiChar ((ACPI_INTEGER) EisaId, 4);
+ OutString[6] = AcpiUtHexToAsciiChar ((ACPI_INTEGER) EisaId, 0);
+ OutString[7] = 0;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiExUnsignedIntegerToString
+ *
+ * PARAMETERS: Value - Value to be converted
+ * OutString - Where to put the converted string (8 bytes)
+ *
+ * RETURN: None, string
+ *
+ * DESCRIPTION: Convert a number to string representation. Assumes string
+ * buffer is large enough to hold the string.
+ *
+ ******************************************************************************/
+
+void
+AcpiExUnsignedIntegerToString (
+ ACPI_INTEGER Value,
+ char *OutString)
+{
+ UINT32 Count;
+ UINT32 DigitsNeeded;
+ UINT32 Remainder;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ DigitsNeeded = AcpiExDigitsNeeded (Value, 10);
+ OutString[DigitsNeeded] = 0;
+
+ for (Count = DigitsNeeded; Count > 0; Count--)
+ {
+ (void) AcpiUtShortDivide (Value, 10, &Value, &Remainder);
+ OutString[Count-1] = (char) ('0' + Remainder);\
+ }
+}
+
+#endif
diff --git a/sys/contrib/dev/acpica/hwacpi.c b/sys/contrib/dev/acpica/hwacpi.c
new file mode 100644
index 0000000..3c9bce9
--- /dev/null
+++ b/sys/contrib/dev/acpica/hwacpi.c
@@ -0,0 +1,277 @@
+
+/******************************************************************************
+ *
+ * Module Name: hwacpi - ACPI Hardware Initialization/Mode Interface
+ * $Revision: 1.78 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __HWACPI_C__
+
+#include <contrib/dev/acpica/acpi.h>
+
+
+#define _COMPONENT ACPI_HARDWARE
+ ACPI_MODULE_NAME ("hwacpi")
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwSetMode
+ *
+ * PARAMETERS: Mode - SYS_MODE_ACPI or SYS_MODE_LEGACY
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Transitions the system into the requested mode.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwSetMode (
+ UINT32 Mode)
+{
+
+ ACPI_STATUS Status;
+ UINT32 Retry;
+
+
+ ACPI_FUNCTION_TRACE (HwSetMode);
+
+ /*
+ * ACPI 2.0 clarified that if SMI_CMD in FADT is zero,
+ * system does not support mode transition.
+ */
+ if (!AcpiGbl_FADT.SmiCommand)
+ {
+ ACPI_ERROR ((AE_INFO, "No SMI_CMD in FADT, mode transition failed"));
+ return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
+ }
+
+ /*
+ * ACPI 2.0 clarified the meaning of ACPI_ENABLE and ACPI_DISABLE
+ * in FADT: If it is zero, enabling or disabling is not supported.
+ * As old systems may have used zero for mode transition,
+ * we make sure both the numbers are zero to determine these
+ * transitions are not supported.
+ */
+ if (!AcpiGbl_FADT.AcpiEnable && !AcpiGbl_FADT.AcpiDisable)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "No ACPI mode transition supported in this system (enable/disable both zero)"));
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ switch (Mode)
+ {
+ case ACPI_SYS_MODE_ACPI:
+
+ /* BIOS should have disabled ALL fixed and GP events */
+
+ Status = AcpiOsWritePort (AcpiGbl_FADT.SmiCommand,
+ (UINT32) AcpiGbl_FADT.AcpiEnable, 8);
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Attempting to enable ACPI mode\n"));
+ break;
+
+ case ACPI_SYS_MODE_LEGACY:
+
+ /*
+ * BIOS should clear all fixed status bits and restore fixed event
+ * enable bits to default
+ */
+ Status = AcpiOsWritePort (AcpiGbl_FADT.SmiCommand,
+ (UINT32) AcpiGbl_FADT.AcpiDisable, 8);
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Attempting to enable Legacy (non-ACPI) mode\n"));
+ break;
+
+ default:
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not write ACPI mode change"));
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Some hardware takes a LONG time to switch modes. Give them 3 sec to
+ * do so, but allow faster systems to proceed more quickly.
+ */
+ Retry = 3000;
+ while (Retry)
+ {
+ if (AcpiHwGetMode() == Mode)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Mode %X successfully enabled\n",
+ Mode));
+ return_ACPI_STATUS (AE_OK);
+ }
+ AcpiOsStall(1000);
+ Retry--;
+ }
+
+ ACPI_ERROR ((AE_INFO, "Hardware did not change modes"));
+ return_ACPI_STATUS (AE_NO_HARDWARE_RESPONSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiHwGetMode
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: SYS_MODE_ACPI or SYS_MODE_LEGACY
+ *
+ * DESCRIPTION: Return current operating state of system. Determined by
+ * querying the SCI_EN bit.
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiHwGetMode (
+ void)
+{
+ ACPI_STATUS Status;
+ UINT32 Value;
+
+
+ ACPI_FUNCTION_TRACE (HwGetMode);
+
+
+ /*
+ * ACPI 2.0 clarified that if SMI_CMD in FADT is zero,
+ * system does not support mode transition.
+ */
+ if (!AcpiGbl_FADT.SmiCommand)
+ {
+ return_UINT32 (ACPI_SYS_MODE_ACPI);
+ }
+
+ Status = AcpiGetRegister (ACPI_BITREG_SCI_ENABLE, &Value);
+ if (ACPI_FAILURE (Status))
+ {
+ return_UINT32 (ACPI_SYS_MODE_LEGACY);
+ }
+
+ if (Value)
+ {
+ return_UINT32 (ACPI_SYS_MODE_ACPI);
+ }
+ else
+ {
+ return_UINT32 (ACPI_SYS_MODE_LEGACY);
+ }
+}
diff --git a/sys/contrib/dev/acpica/hwgpe.c b/sys/contrib/dev/acpica/hwgpe.c
new file mode 100644
index 0000000..d7498e5
--- /dev/null
+++ b/sys/contrib/dev/acpica/hwgpe.c
@@ -0,0 +1,545 @@
+
+/******************************************************************************
+ *
+ * Module Name: hwgpe - Low level GPE enable/disable/clear functions
+ * $Revision: 1.75 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acevents.h>
+
+#define _COMPONENT ACPI_HARDWARE
+ ACPI_MODULE_NAME ("hwgpe")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiHwEnableWakeupGpeBlock (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock);
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwWriteGpeEnableReg
+ *
+ * PARAMETERS: GpeEventInfo - Info block for the GPE to be enabled
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Write a GPE enable register. Note: The bit for this GPE must
+ * already be cleared or set in the parent register
+ * EnableForRun mask.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwWriteGpeEnableReg (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo)
+{
+ ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Get the info block for the entire GPE register */
+
+ GpeRegisterInfo = GpeEventInfo->RegisterInfo;
+ if (!GpeRegisterInfo)
+ {
+ return (AE_NOT_EXIST);
+ }
+
+ /* Write the entire GPE (runtime) enable register */
+
+ Status = AcpiHwLowLevelWrite (8, GpeRegisterInfo->EnableForRun,
+ &GpeRegisterInfo->EnableAddress);
+
+ return (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwClearGpe
+ *
+ * PARAMETERS: GpeEventInfo - Info block for the GPE to be cleared
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Clear the status bit for a single GPE.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwClearGpe (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo)
+{
+ ACPI_STATUS Status;
+ UINT8 RegisterBit;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ RegisterBit = (UINT8)
+ (1 << (GpeEventInfo->GpeNumber - GpeEventInfo->RegisterInfo->BaseGpeNumber));
+
+ /*
+ * Write a one to the appropriate bit in the status register to
+ * clear this GPE.
+ */
+ Status = AcpiHwLowLevelWrite (8, RegisterBit,
+ &GpeEventInfo->RegisterInfo->StatusAddress);
+
+ return (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwGetGpeStatus
+ *
+ * PARAMETERS: GpeEventInfo - Info block for the GPE to queried
+ * EventStatus - Where the GPE status is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Return the status of a single GPE.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwGetGpeStatus (
+ ACPI_GPE_EVENT_INFO *GpeEventInfo,
+ ACPI_EVENT_STATUS *EventStatus)
+{
+ UINT32 InByte;
+ UINT8 RegisterBit;
+ ACPI_GPE_REGISTER_INFO *GpeRegisterInfo;
+ ACPI_STATUS Status;
+ ACPI_EVENT_STATUS LocalEventStatus = 0;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!EventStatus)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Get the info block for the entire GPE register */
+
+ GpeRegisterInfo = GpeEventInfo->RegisterInfo;
+
+ /* Get the register bitmask for this GPE */
+
+ RegisterBit = (UINT8)
+ (1 << (GpeEventInfo->GpeNumber - GpeEventInfo->RegisterInfo->BaseGpeNumber));
+
+ /* GPE currently enabled? (enabled for runtime?) */
+
+ if (RegisterBit & GpeRegisterInfo->EnableForRun)
+ {
+ LocalEventStatus |= ACPI_EVENT_FLAG_ENABLED;
+ }
+
+ /* GPE enabled for wake? */
+
+ if (RegisterBit & GpeRegisterInfo->EnableForWake)
+ {
+ LocalEventStatus |= ACPI_EVENT_FLAG_WAKE_ENABLED;
+ }
+
+ /* GPE currently active (status bit == 1)? */
+
+ Status = AcpiHwLowLevelRead (8, &InByte, &GpeRegisterInfo->StatusAddress);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ if (RegisterBit & InByte)
+ {
+ LocalEventStatus |= ACPI_EVENT_FLAG_SET;
+ }
+
+ /* Set return value */
+
+ (*EventStatus) = LocalEventStatus;
+
+
+UnlockAndExit:
+ return (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwDisableGpeBlock
+ *
+ * PARAMETERS: GpeXruptInfo - GPE Interrupt info
+ * GpeBlock - Gpe Block info
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Disable all GPEs within a single GPE block
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwDisableGpeBlock (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock)
+{
+ UINT32 i;
+ ACPI_STATUS Status;
+
+
+ /* Examine each GPE Register within the block */
+
+ for (i = 0; i < GpeBlock->RegisterCount; i++)
+ {
+ /* Disable all GPEs in this register */
+
+ Status = AcpiHwLowLevelWrite (8, 0x00,
+ &GpeBlock->RegisterInfo[i].EnableAddress);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwClearGpeBlock
+ *
+ * PARAMETERS: GpeXruptInfo - GPE Interrupt info
+ * GpeBlock - Gpe Block info
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Clear status bits for all GPEs within a single GPE block
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwClearGpeBlock (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock)
+{
+ UINT32 i;
+ ACPI_STATUS Status;
+
+
+ /* Examine each GPE Register within the block */
+
+ for (i = 0; i < GpeBlock->RegisterCount; i++)
+ {
+ /* Clear status on all GPEs in this register */
+
+ Status = AcpiHwLowLevelWrite (8, 0xFF,
+ &GpeBlock->RegisterInfo[i].StatusAddress);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwEnableRuntimeGpeBlock
+ *
+ * PARAMETERS: GpeXruptInfo - GPE Interrupt info
+ * GpeBlock - Gpe Block info
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enable all "runtime" GPEs within a single GPE block. Includes
+ * combination wake/run GPEs.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwEnableRuntimeGpeBlock (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock)
+{
+ UINT32 i;
+ ACPI_STATUS Status;
+
+
+ /* NOTE: assumes that all GPEs are currently disabled */
+
+ /* Examine each GPE Register within the block */
+
+ for (i = 0; i < GpeBlock->RegisterCount; i++)
+ {
+ if (!GpeBlock->RegisterInfo[i].EnableForRun)
+ {
+ continue;
+ }
+
+ /* Enable all "runtime" GPEs in this register */
+
+ Status = AcpiHwLowLevelWrite (8, GpeBlock->RegisterInfo[i].EnableForRun,
+ &GpeBlock->RegisterInfo[i].EnableAddress);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwEnableWakeupGpeBlock
+ *
+ * PARAMETERS: GpeXruptInfo - GPE Interrupt info
+ * GpeBlock - Gpe Block info
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enable all "wake" GPEs within a single GPE block. Includes
+ * combination wake/run GPEs.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiHwEnableWakeupGpeBlock (
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo,
+ ACPI_GPE_BLOCK_INFO *GpeBlock)
+{
+ UINT32 i;
+ ACPI_STATUS Status;
+
+
+ /* Examine each GPE Register within the block */
+
+ for (i = 0; i < GpeBlock->RegisterCount; i++)
+ {
+ if (!GpeBlock->RegisterInfo[i].EnableForWake)
+ {
+ continue;
+ }
+
+ /* Enable all "wake" GPEs in this register */
+
+ Status = AcpiHwLowLevelWrite (8,
+ GpeBlock->RegisterInfo[i].EnableForWake,
+ &GpeBlock->RegisterInfo[i].EnableAddress);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwDisableAllGpes
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Disable and clear all GPEs in all GPE blocks
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwDisableAllGpes (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (HwDisableAllGpes);
+
+
+ Status = AcpiEvWalkGpeList (AcpiHwDisableGpeBlock);
+ Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock);
+ return_ACPI_STATUS (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwEnableAllRuntimeGpes
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enable all "runtime" GPEs, in all GPE blocks
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwEnableAllRuntimeGpes (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (HwEnableAllRuntimeGpes);
+
+
+ Status = AcpiEvWalkGpeList (AcpiHwEnableRuntimeGpeBlock);
+ return_ACPI_STATUS (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwEnableAllWakeupGpes
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enable all "wakeup" GPEs, in all GPE blocks
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwEnableAllWakeupGpes (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (HwEnableAllWakeupGpes);
+
+
+ Status = AcpiEvWalkGpeList (AcpiHwEnableWakeupGpeBlock);
+ return_ACPI_STATUS (Status);
+}
+
diff --git a/sys/contrib/dev/acpica/hwregs.c b/sys/contrib/dev/acpica/hwregs.c
new file mode 100644
index 0000000..36cc47b
--- /dev/null
+++ b/sys/contrib/dev/acpica/hwregs.c
@@ -0,0 +1,1001 @@
+
+/*******************************************************************************
+ *
+ * Module Name: hwregs - Read/write access functions for the various ACPI
+ * control and status registers.
+ * $Revision: 1.187 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __HWREGS_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acevents.h>
+
+#define _COMPONENT ACPI_HARDWARE
+ ACPI_MODULE_NAME ("hwregs")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiHwClearAcpiStatus
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Clears all fixed and general purpose status bits
+ * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwClearAcpiStatus (
+ void)
+{
+ ACPI_STATUS Status;
+ ACPI_CPU_FLAGS LockFlags = 0;
+
+
+ ACPI_FUNCTION_TRACE (HwClearAcpiStatus);
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %04X to %04X\n",
+ ACPI_BITMASK_ALL_FIXED_STATUS,
+ (UINT16) AcpiGbl_FADT.XPm1aEventBlock.Address));
+
+ LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
+
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1_STATUS,
+ ACPI_BITMASK_ALL_FIXED_STATUS);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* Clear the fixed events */
+
+ if (AcpiGbl_FADT.XPm1bEventBlock.Address)
+ {
+ Status = AcpiHwLowLevelWrite (16, ACPI_BITMASK_ALL_FIXED_STATUS,
+ &AcpiGbl_FADT.XPm1bEventBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+ }
+
+ /* Clear the GPE Bits in all GPE registers in all GPE blocks */
+
+ Status = AcpiEvWalkGpeList (AcpiHwClearGpeBlock);
+
+UnlockAndExit:
+ AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetSleepTypeData
+ *
+ * PARAMETERS: SleepState - Numeric sleep state
+ * *SleepTypeA - Where SLP_TYPa is returned
+ * *SleepTypeB - Where SLP_TYPb is returned
+ *
+ * RETURN: Status - ACPI status
+ *
+ * DESCRIPTION: Obtain the SLP_TYPa and SLP_TYPb values for the requested sleep
+ * state.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetSleepTypeData (
+ UINT8 SleepState,
+ UINT8 *SleepTypeA,
+ UINT8 *SleepTypeB)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_EVALUATE_INFO *Info;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetSleepTypeData);
+
+
+ /* Validate parameters */
+
+ if ((SleepState > ACPI_S_STATES_MAX) ||
+ !SleepTypeA || !SleepTypeB)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Allocate the evaluation information block */
+
+ Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
+ if (!Info)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Info->Pathname = ACPI_CAST_PTR (char, AcpiGbl_SleepStateNames[SleepState]);
+
+ /* Evaluate the namespace object containing the values for this state */
+
+ Status = AcpiNsEvaluate (Info);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "%s while evaluating SleepState [%s]\n",
+ AcpiFormatException (Status), Info->Pathname));
+
+ goto Cleanup;
+ }
+
+ /* Must have a return object */
+
+ if (!Info->ReturnObject)
+ {
+ ACPI_ERROR ((AE_INFO, "No Sleep State object returned from [%s]",
+ Info->Pathname));
+ Status = AE_NOT_EXIST;
+ }
+
+ /* It must be of type Package */
+
+ else if (ACPI_GET_OBJECT_TYPE (Info->ReturnObject) != ACPI_TYPE_PACKAGE)
+ {
+ ACPI_ERROR ((AE_INFO, "Sleep State return object is not a Package"));
+ Status = AE_AML_OPERAND_TYPE;
+ }
+
+ /*
+ * The package must have at least two elements. NOTE (March 2005): This
+ * goes against the current ACPI spec which defines this object as a
+ * package with one encoded DWORD element. However, existing practice
+ * by BIOS vendors seems to be to have 2 or more elements, at least
+ * one per sleep type (A/B).
+ */
+ else if (Info->ReturnObject->Package.Count < 2)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Sleep State return package does not have at least two elements"));
+ Status = AE_AML_NO_OPERAND;
+ }
+
+ /* The first two elements must both be of type Integer */
+
+ else if ((ACPI_GET_OBJECT_TYPE (Info->ReturnObject->Package.Elements[0])
+ != ACPI_TYPE_INTEGER) ||
+ (ACPI_GET_OBJECT_TYPE (Info->ReturnObject->Package.Elements[1])
+ != ACPI_TYPE_INTEGER))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Sleep State return package elements are not both Integers (%s, %s)",
+ AcpiUtGetObjectTypeName (Info->ReturnObject->Package.Elements[0]),
+ AcpiUtGetObjectTypeName (Info->ReturnObject->Package.Elements[1])));
+ Status = AE_AML_OPERAND_TYPE;
+ }
+ else
+ {
+ /* Valid _Sx_ package size, type, and value */
+
+ *SleepTypeA = (UINT8)
+ (Info->ReturnObject->Package.Elements[0])->Integer.Value;
+ *SleepTypeB = (UINT8)
+ (Info->ReturnObject->Package.Elements[1])->Integer.Value;
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "While evaluating SleepState [%s], bad Sleep object %p type %s",
+ Info->Pathname, Info->ReturnObject,
+ AcpiUtGetObjectTypeName (Info->ReturnObject)));
+ }
+
+ AcpiUtRemoveReference (Info->ReturnObject);
+
+Cleanup:
+ ACPI_FREE (Info);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetSleepTypeData)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiHwGetRegisterBitMask
+ *
+ * PARAMETERS: RegisterId - Index of ACPI Register to access
+ *
+ * RETURN: The bitmask to be used when accessing the register
+ *
+ * DESCRIPTION: Map RegisterId into a register bitmask.
+ *
+ ******************************************************************************/
+
+ACPI_BIT_REGISTER_INFO *
+AcpiHwGetBitRegisterInfo (
+ UINT32 RegisterId)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (RegisterId > ACPI_BITREG_MAX)
+ {
+ ACPI_ERROR ((AE_INFO, "Invalid BitRegister ID: %X", RegisterId));
+ return (NULL);
+ }
+
+ return (&AcpiGbl_BitRegisterInfo[RegisterId]);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetRegister
+ *
+ * PARAMETERS: RegisterId - ID of ACPI BitRegister to access
+ * ReturnValue - Value that was read from the register
+ *
+ * RETURN: Status and the value read from specified Register. Value
+ * returned is normalized to bit0 (is shifted all the way right)
+ *
+ * DESCRIPTION: ACPI BitRegister read function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetRegister (
+ UINT32 RegisterId,
+ UINT32 *ReturnValue)
+{
+ UINT32 RegisterValue = 0;
+ ACPI_BIT_REGISTER_INFO *BitRegInfo;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetRegister);
+
+
+ /* Get the info structure corresponding to the requested ACPI Register */
+
+ BitRegInfo = AcpiHwGetBitRegisterInfo (RegisterId);
+ if (!BitRegInfo)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Read from the register */
+
+ Status = AcpiHwRegisterRead (ACPI_MTX_LOCK,
+ BitRegInfo->ParentRegister, &RegisterValue);
+
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Normalize the value that was read */
+
+ RegisterValue = ((RegisterValue & BitRegInfo->AccessBitMask)
+ >> BitRegInfo->BitPosition);
+
+ *ReturnValue = RegisterValue;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Read value %8.8X register %X\n",
+ RegisterValue, BitRegInfo->ParentRegister));
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetRegister)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiSetRegister
+ *
+ * PARAMETERS: RegisterId - ID of ACPI BitRegister to access
+ * Value - (only used on write) value to write to the
+ * Register, NOT pre-normalized to the bit pos
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: ACPI Bit Register write function.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiSetRegister (
+ UINT32 RegisterId,
+ UINT32 Value)
+{
+ UINT32 RegisterValue = 0;
+ ACPI_BIT_REGISTER_INFO *BitRegInfo;
+ ACPI_STATUS Status;
+ ACPI_CPU_FLAGS LockFlags;
+
+
+ ACPI_FUNCTION_TRACE_U32 (AcpiSetRegister, RegisterId);
+
+
+ /* Get the info structure corresponding to the requested ACPI Register */
+
+ BitRegInfo = AcpiHwGetBitRegisterInfo (RegisterId);
+ if (!BitRegInfo)
+ {
+ ACPI_ERROR ((AE_INFO, "Bad ACPI HW RegisterId: %X", RegisterId));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
+
+ /* Always do a register read first so we can insert the new bits */
+
+ Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,
+ BitRegInfo->ParentRegister, &RegisterValue);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /*
+ * Decode the Register ID
+ * Register ID = [Register block ID] | [bit ID]
+ *
+ * Check bit ID to fine locate Register offset.
+ * Check Mask to determine Register offset, and then read-write.
+ */
+ switch (BitRegInfo->ParentRegister)
+ {
+ case ACPI_REGISTER_PM1_STATUS:
+
+ /*
+ * Status Registers are different from the rest. Clear by
+ * writing 1, and writing 0 has no effect. So, the only relevant
+ * information is the single bit we're interested in, all others should
+ * be written as 0 so they will be left unchanged.
+ */
+ Value = ACPI_REGISTER_PREPARE_BITS (Value,
+ BitRegInfo->BitPosition, BitRegInfo->AccessBitMask);
+ if (Value)
+ {
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1_STATUS, (UINT16) Value);
+ RegisterValue = 0;
+ }
+ break;
+
+
+ case ACPI_REGISTER_PM1_ENABLE:
+
+ ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition,
+ BitRegInfo->AccessBitMask, Value);
+
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1_ENABLE, (UINT16) RegisterValue);
+ break;
+
+
+ case ACPI_REGISTER_PM1_CONTROL:
+
+ /*
+ * Write the PM1 Control register.
+ * Note that at this level, the fact that there are actually TWO
+ * registers (A and B - and B may not exist) is abstracted.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM1 control: Read %X\n",
+ RegisterValue));
+
+ ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition,
+ BitRegInfo->AccessBitMask, Value);
+
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1_CONTROL, (UINT16) RegisterValue);
+ break;
+
+
+ case ACPI_REGISTER_PM2_CONTROL:
+
+ Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM2_CONTROL, &RegisterValue);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "PM2 control: Read %X from %8.8X%8.8X\n",
+ RegisterValue,
+ ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XPm2ControlBlock.Address)));
+
+ ACPI_REGISTER_INSERT_VALUE (RegisterValue, BitRegInfo->BitPosition,
+ BitRegInfo->AccessBitMask, Value);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "About to write %4.4X to %8.8X%8.8X\n",
+ RegisterValue,
+ ACPI_FORMAT_UINT64 (AcpiGbl_FADT.XPm2ControlBlock.Address)));
+
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM2_CONTROL, (UINT8) (RegisterValue));
+ break;
+
+
+ default:
+ break;
+ }
+
+
+UnlockAndExit:
+
+ AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
+
+ /* Normalize the value that was read */
+
+ ACPI_DEBUG_EXEC (RegisterValue =
+ ((RegisterValue & BitRegInfo->AccessBitMask) >>
+ BitRegInfo->BitPosition));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO, "Set bits: %8.8X actual %8.8X register %X\n",
+ Value, RegisterValue, BitRegInfo->ParentRegister));
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiSetRegister)
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwRegisterRead
+ *
+ * PARAMETERS: UseLock - Lock hardware? True/False
+ * RegisterId - ACPI Register ID
+ * ReturnValue - Where the register value is returned
+ *
+ * RETURN: Status and the value read.
+ *
+ * DESCRIPTION: Read from the specified ACPI register
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwRegisterRead (
+ BOOLEAN UseLock,
+ UINT32 RegisterId,
+ UINT32 *ReturnValue)
+{
+ UINT32 Value1 = 0;
+ UINT32 Value2 = 0;
+ ACPI_STATUS Status;
+ ACPI_CPU_FLAGS LockFlags = 0;
+
+
+ ACPI_FUNCTION_TRACE (HwRegisterRead);
+
+
+ if (ACPI_MTX_LOCK == UseLock)
+ {
+ LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
+ }
+
+ switch (RegisterId)
+ {
+ case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */
+
+ Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT.XPm1aEventBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* PM1B is optional */
+
+ Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT.XPm1bEventBlock);
+ Value1 |= Value2;
+ break;
+
+
+ case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */
+
+ Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_XPm1aEnable);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* PM1B is optional */
+
+ Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_XPm1bEnable);
+ Value1 |= Value2;
+ break;
+
+
+ case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */
+
+ Status = AcpiHwLowLevelRead (16, &Value1, &AcpiGbl_FADT.XPm1aControlBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ Status = AcpiHwLowLevelRead (16, &Value2, &AcpiGbl_FADT.XPm1bControlBlock);
+ Value1 |= Value2;
+ break;
+
+
+ case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
+
+ Status = AcpiHwLowLevelRead (8, &Value1, &AcpiGbl_FADT.XPm2ControlBlock);
+ break;
+
+
+ case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
+
+ Status = AcpiHwLowLevelRead (32, &Value1, &AcpiGbl_FADT.XPmTimerBlock);
+ break;
+
+ case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */
+
+ Status = AcpiOsReadPort (AcpiGbl_FADT.SmiCommand, &Value1, 8);
+ break;
+
+ default:
+ ACPI_ERROR ((AE_INFO, "Unknown Register ID: %X",
+ RegisterId));
+ Status = AE_BAD_PARAMETER;
+ break;
+ }
+
+UnlockAndExit:
+ if (ACPI_MTX_LOCK == UseLock)
+ {
+ AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
+ }
+
+ if (ACPI_SUCCESS (Status))
+ {
+ *ReturnValue = Value1;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwRegisterWrite
+ *
+ * PARAMETERS: UseLock - Lock hardware? True/False
+ * RegisterId - ACPI Register ID
+ * Value - The value to write
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Write to the specified ACPI register
+ *
+ * NOTE: In accordance with the ACPI specification, this function automatically
+ * preserves the value of the following bits, meaning that these bits cannot be
+ * changed via this interface:
+ *
+ * PM1_CONTROL[0] = SCI_EN
+ * PM1_CONTROL[9]
+ * PM1_STATUS[11]
+ *
+ * ACPI References:
+ * 1) Hardware Ignored Bits: When software writes to a register with ignored
+ * bit fields, it preserves the ignored bit fields
+ * 2) SCI_EN: OSPM always preserves this bit position
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwRegisterWrite (
+ BOOLEAN UseLock,
+ UINT32 RegisterId,
+ UINT32 Value)
+{
+ ACPI_STATUS Status;
+ ACPI_CPU_FLAGS LockFlags = 0;
+ UINT32 ReadValue;
+
+
+ ACPI_FUNCTION_TRACE (HwRegisterWrite);
+
+
+ if (ACPI_MTX_LOCK == UseLock)
+ {
+ LockFlags = AcpiOsAcquireLock (AcpiGbl_HardwareLock);
+ }
+
+ switch (RegisterId)
+ {
+ case ACPI_REGISTER_PM1_STATUS: /* 16-bit access */
+
+ /* Perform a read first to preserve certain bits (per ACPI spec) */
+
+ Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1_STATUS, &ReadValue);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* Insert the bits to be preserved */
+
+ ACPI_INSERT_BITS (Value, ACPI_PM1_STATUS_PRESERVED_BITS, ReadValue);
+
+ /* Now we can write the data */
+
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aEventBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* PM1B is optional */
+
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bEventBlock);
+ break;
+
+
+ case ACPI_REGISTER_PM1_ENABLE: /* 16-bit access */
+
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_XPm1aEnable);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* PM1B is optional */
+
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_XPm1bEnable);
+ break;
+
+
+ case ACPI_REGISTER_PM1_CONTROL: /* 16-bit access */
+
+ /*
+ * Perform a read first to preserve certain bits (per ACPI spec)
+ *
+ * Note: This includes SCI_EN, we never want to change this bit
+ */
+ Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1_CONTROL, &ReadValue);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* Insert the bits to be preserved */
+
+ ACPI_INSERT_BITS (Value, ACPI_PM1_CONTROL_PRESERVED_BITS, ReadValue);
+
+ /* Now we can write the data */
+
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aControlBlock);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bControlBlock);
+ break;
+
+
+ case ACPI_REGISTER_PM1A_CONTROL: /* 16-bit access */
+
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1aControlBlock);
+ break;
+
+
+ case ACPI_REGISTER_PM1B_CONTROL: /* 16-bit access */
+
+ Status = AcpiHwLowLevelWrite (16, Value, &AcpiGbl_FADT.XPm1bControlBlock);
+ break;
+
+
+ case ACPI_REGISTER_PM2_CONTROL: /* 8-bit access */
+
+ Status = AcpiHwLowLevelWrite (8, Value, &AcpiGbl_FADT.XPm2ControlBlock);
+ break;
+
+
+ case ACPI_REGISTER_PM_TIMER: /* 32-bit access */
+
+ Status = AcpiHwLowLevelWrite (32, Value, &AcpiGbl_FADT.XPmTimerBlock);
+ break;
+
+
+ case ACPI_REGISTER_SMI_COMMAND_BLOCK: /* 8-bit access */
+
+ /* SMI_CMD is currently always in IO space */
+
+ Status = AcpiOsWritePort (AcpiGbl_FADT.SmiCommand, Value, 8);
+ break;
+
+
+ default:
+ Status = AE_BAD_PARAMETER;
+ break;
+ }
+
+UnlockAndExit:
+ if (ACPI_MTX_LOCK == UseLock)
+ {
+ AcpiOsReleaseLock (AcpiGbl_HardwareLock, LockFlags);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwLowLevelRead
+ *
+ * PARAMETERS: Width - 8, 16, or 32
+ * Value - Where the value is returned
+ * Reg - GAS register structure
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Read from either memory or IO space.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwLowLevelRead (
+ UINT32 Width,
+ UINT32 *Value,
+ ACPI_GENERIC_ADDRESS *Reg)
+{
+ UINT64 Address;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_NAME (HwLowLevelRead);
+
+
+ /*
+ * Must have a valid pointer to a GAS structure, and
+ * a non-zero address within. However, don't return an error
+ * because the PM1A/B code must not fail if B isn't present.
+ */
+ if (!Reg)
+ {
+ return (AE_OK);
+ }
+
+ /* Get a local copy of the address. Handles possible alignment issues */
+
+ ACPI_MOVE_64_TO_64 (&Address, &Reg->Address);
+ if (!Address)
+ {
+ return (AE_OK);
+ }
+ *Value = 0;
+
+ /*
+ * Two address spaces supported: Memory or IO.
+ * PCI_Config is not supported here because the GAS struct is insufficient
+ */
+ switch (Reg->SpaceId)
+ {
+ case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+
+ Status = AcpiOsReadMemory (
+ (ACPI_PHYSICAL_ADDRESS) Address, Value, Width);
+ break;
+
+
+ case ACPI_ADR_SPACE_SYSTEM_IO:
+
+ Status = AcpiOsReadPort ((ACPI_IO_ADDRESS) Address, Value, Width);
+ break;
+
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Unsupported address space: %X", Reg->SpaceId));
+ return (AE_BAD_PARAMETER);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO,
+ "Read: %8.8X width %2d from %8.8X%8.8X (%s)\n",
+ *Value, Width, ACPI_FORMAT_UINT64 (Address),
+ AcpiUtGetRegionName (Reg->SpaceId)));
+
+ return (Status);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiHwLowLevelWrite
+ *
+ * PARAMETERS: Width - 8, 16, or 32
+ * Value - To be written
+ * Reg - GAS register structure
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Write to either memory or IO space.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiHwLowLevelWrite (
+ UINT32 Width,
+ UINT32 Value,
+ ACPI_GENERIC_ADDRESS *Reg)
+{
+ UINT64 Address;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_NAME (HwLowLevelWrite);
+
+
+ /*
+ * Must have a valid pointer to a GAS structure, and
+ * a non-zero address within. However, don't return an error
+ * because the PM1A/B code must not fail if B isn't present.
+ */
+ if (!Reg)
+ {
+ return (AE_OK);
+ }
+
+ /* Get a local copy of the address. Handles possible alignment issues */
+
+ ACPI_MOVE_64_TO_64 (&Address, &Reg->Address);
+ if (!Address)
+ {
+ return (AE_OK);
+ }
+
+ /*
+ * Two address spaces supported: Memory or IO.
+ * PCI_Config is not supported here because the GAS struct is insufficient
+ */
+ switch (Reg->SpaceId)
+ {
+ case ACPI_ADR_SPACE_SYSTEM_MEMORY:
+
+ Status = AcpiOsWriteMemory (
+ (ACPI_PHYSICAL_ADDRESS) Address, Value, Width);
+ break;
+
+
+ case ACPI_ADR_SPACE_SYSTEM_IO:
+
+ Status = AcpiOsWritePort (
+ (ACPI_IO_ADDRESS) Address, Value, Width);
+ break;
+
+
+ default:
+ ACPI_ERROR ((AE_INFO,
+ "Unsupported address space: %X", Reg->SpaceId));
+ return (AE_BAD_PARAMETER);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_IO,
+ "Wrote: %8.8X width %2d to %8.8X%8.8X (%s)\n",
+ Value, Width, ACPI_FORMAT_UINT64 (Address),
+ AcpiUtGetRegionName (Reg->SpaceId)));
+
+ return (Status);
+}
diff --git a/sys/contrib/dev/acpica/hwsleep.c b/sys/contrib/dev/acpica/hwsleep.c
new file mode 100644
index 0000000..8369dc7
--- /dev/null
+++ b/sys/contrib/dev/acpica/hwsleep.c
@@ -0,0 +1,763 @@
+
+/******************************************************************************
+ *
+ * Name: hwsleep.c - ACPI Hardware Sleep/Wake Interface
+ * $Revision: 1.87 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/actables.h>
+
+#define _COMPONENT ACPI_HARDWARE
+ ACPI_MODULE_NAME ("hwsleep")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiSetFirmwareWakingVector
+ *
+ * PARAMETERS: PhysicalAddress - Physical address of ACPI real mode
+ * entry point.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Access function for the FirmwareWakingVector field in FACS
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiSetFirmwareWakingVector (
+ ACPI_PHYSICAL_ADDRESS PhysicalAddress)
+{
+ ACPI_TABLE_FACS *Facs;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiSetFirmwareWakingVector);
+
+ /* Get the FACS */
+
+ Status = AcpiGetTableByIndex (ACPI_TABLE_INDEX_FACS,
+ ACPI_CAST_INDIRECT_PTR (ACPI_TABLE_HEADER, &Facs));
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Set the vector */
+
+ if ((Facs->Length < 32) ||
+ (!(Facs->XFirmwareWakingVector)))
+ {
+ /*
+ * ACPI 1.0 FACS or short table or optional X_ field is zero
+ */
+ Facs->FirmwareWakingVector = (UINT32) PhysicalAddress;
+ }
+ else
+ {
+ /*
+ * ACPI 2.0 FACS with valid X_ field
+ */
+ Facs->XFirmwareWakingVector = PhysicalAddress;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiSetFirmwareWakingVector)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetFirmwareWakingVector
+ *
+ * PARAMETERS: *PhysicalAddress - Where the contents of
+ * the FirmwareWakingVector field of
+ * the FACS will be returned.
+ *
+ * RETURN: Status, vector
+ *
+ * DESCRIPTION: Access function for the FirmwareWakingVector field in FACS
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetFirmwareWakingVector (
+ ACPI_PHYSICAL_ADDRESS *PhysicalAddress)
+{
+ ACPI_TABLE_FACS *Facs;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetFirmwareWakingVector);
+
+
+ if (!PhysicalAddress)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Get the FACS */
+
+ Status = AcpiGetTableByIndex (ACPI_TABLE_INDEX_FACS,
+ ACPI_CAST_INDIRECT_PTR (ACPI_TABLE_HEADER, &Facs));
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Get the vector */
+
+ if ((Facs->Length < 32) ||
+ (!(Facs->XFirmwareWakingVector)))
+ {
+ /*
+ * ACPI 1.0 FACS or short table or optional X_ field is zero
+ */
+ *PhysicalAddress =
+ (ACPI_PHYSICAL_ADDRESS) Facs->FirmwareWakingVector;
+ }
+ else
+ {
+ /*
+ * ACPI 2.0 FACS with valid X_ field
+ */
+ *PhysicalAddress = (ACPI_PHYSICAL_ADDRESS) Facs->XFirmwareWakingVector;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetFirmwareWakingVector)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEnterSleepStatePrep
+ *
+ * PARAMETERS: SleepState - Which sleep state to enter
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Prepare to enter a system sleep state (see ACPI 2.0 spec p 231)
+ * This function must execute with interrupts enabled.
+ * We break sleeping into 2 stages so that OSPM can handle
+ * various OS-specific tasks between the two steps.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEnterSleepStatePrep (
+ UINT8 SleepState)
+{
+ ACPI_STATUS Status;
+ ACPI_OBJECT_LIST ArgList;
+ ACPI_OBJECT Arg;
+
+
+ ACPI_FUNCTION_TRACE (AcpiEnterSleepStatePrep);
+
+
+ /*
+ * _PSW methods could be run here to enable wake-on keyboard, LAN, etc.
+ */
+ Status = AcpiGetSleepTypeData (SleepState,
+ &AcpiGbl_SleepTypeA, &AcpiGbl_SleepTypeB);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Setup parameter object */
+
+ ArgList.Count = 1;
+ ArgList.Pointer = &Arg;
+
+ Arg.Type = ACPI_TYPE_INTEGER;
+ Arg.Integer.Value = SleepState;
+
+ /* Run the _PTS and _GTS methods */
+
+ Status = AcpiEvaluateObject (NULL, METHOD_NAME__PTS, &ArgList, NULL);
+ if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND)
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiEvaluateObject (NULL, METHOD_NAME__GTS, &ArgList, NULL);
+ if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND)
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Setup the argument to _SST */
+
+ switch (SleepState)
+ {
+ case ACPI_STATE_S0:
+ Arg.Integer.Value = ACPI_SST_WORKING;
+ break;
+
+ case ACPI_STATE_S1:
+ case ACPI_STATE_S2:
+ case ACPI_STATE_S3:
+ Arg.Integer.Value = ACPI_SST_SLEEPING;
+ break;
+
+ case ACPI_STATE_S4:
+ Arg.Integer.Value = ACPI_SST_SLEEP_CONTEXT;
+ break;
+
+ default:
+ Arg.Integer.Value = ACPI_SST_INDICATOR_OFF; /* Default is off */
+ break;
+ }
+
+ /* Set the system indicators to show the desired sleep state. */
+
+ Status = AcpiEvaluateObject (NULL, METHOD_NAME__SST, &ArgList, NULL);
+ if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND)
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "While executing method _SST"));
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiEnterSleepStatePrep)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEnterSleepState
+ *
+ * PARAMETERS: SleepState - Which sleep state to enter
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Enter a system sleep state (see ACPI 2.0 spec p 231)
+ * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEnterSleepState (
+ UINT8 SleepState)
+{
+ UINT32 PM1AControl;
+ UINT32 PM1BControl;
+ ACPI_BIT_REGISTER_INFO *SleepTypeRegInfo;
+ ACPI_BIT_REGISTER_INFO *SleepEnableRegInfo;
+ UINT32 InValue;
+ UINT32 Retry;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiEnterSleepState);
+
+
+ if ((AcpiGbl_SleepTypeA > ACPI_SLEEP_TYPE_MAX) ||
+ (AcpiGbl_SleepTypeB > ACPI_SLEEP_TYPE_MAX))
+ {
+ ACPI_ERROR ((AE_INFO, "Sleep values out of range: A=%X B=%X",
+ AcpiGbl_SleepTypeA, AcpiGbl_SleepTypeB));
+ return_ACPI_STATUS (AE_AML_OPERAND_VALUE);
+ }
+
+ SleepTypeRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_TYPE_A);
+ SleepEnableRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_ENABLE);
+
+ /* Clear wake status */
+
+ Status = AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Clear all fixed and general purpose status bits */
+
+ Status = AcpiHwClearAcpiStatus ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (SleepState != ACPI_STATE_S5)
+ {
+ /* Disable BM arbitration */
+
+ Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 1);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * 1) Disable/Clear all GPEs
+ * 2) Enable all wakeup GPEs
+ */
+ Status = AcpiHwDisableAllGpes ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ AcpiGbl_SystemAwakeAndRunning = FALSE;
+
+ Status = AcpiHwEnableAllWakeupGpes ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Get current value of PM1A control */
+
+ Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1_CONTROL, &PM1AControl);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ ACPI_DEBUG_PRINT ((ACPI_DB_INIT,
+ "Entering sleep state [S%d]\n", SleepState));
+
+ /* Clear SLP_EN and SLP_TYP fields */
+
+ PM1AControl &= ~(SleepTypeRegInfo->AccessBitMask |
+ SleepEnableRegInfo->AccessBitMask);
+ PM1BControl = PM1AControl;
+
+ /* Insert SLP_TYP bits */
+
+ PM1AControl |= (AcpiGbl_SleepTypeA << SleepTypeRegInfo->BitPosition);
+ PM1BControl |= (AcpiGbl_SleepTypeB << SleepTypeRegInfo->BitPosition);
+
+ /*
+ * We split the writes of SLP_TYP and SLP_EN to workaround
+ * poorly implemented hardware.
+ */
+
+ /* Write #1: fill in SLP_TYP data */
+
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1A_CONTROL, PM1AControl);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1B_CONTROL, PM1BControl);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Insert SLP_ENABLE bit */
+
+ PM1AControl |= SleepEnableRegInfo->AccessBitMask;
+ PM1BControl |= SleepEnableRegInfo->AccessBitMask;
+
+ /* Write #2: SLP_TYP + SLP_EN */
+
+ ACPI_FLUSH_CPU_CACHE ();
+
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1A_CONTROL, PM1AControl);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1B_CONTROL, PM1BControl);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (SleepState > ACPI_STATE_S3)
+ {
+ /*
+ * We wanted to sleep > S3, but it didn't happen (by virtue of the
+ * fact that we are still executing!)
+ *
+ * Wait ten seconds, then try again. This is to get S4/S5 to work on
+ * all machines.
+ *
+ * We wait so long to allow chipsets that poll this reg very slowly to
+ * still read the right value. Ideally, this block would go
+ * away entirely.
+ */
+ AcpiOsStall (10000000);
+
+ Status = AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1_CONTROL,
+ SleepEnableRegInfo->AccessBitMask);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Wait until we enter sleep state */
+
+ Retry = 1000;
+ do
+ {
+ Status = AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &InValue);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Some BIOSs don't set WAK_STS at all. Give up waiting after
+ * 1000 retries if it still isn't set.
+ */
+ if (Retry-- == 0)
+ {
+ break;
+ }
+
+ /* Spin until we wake */
+
+ } while (!InValue);
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiEnterSleepState)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEnterSleepStateS4bios
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Perform a S4 bios request.
+ * THIS FUNCTION MUST BE CALLED WITH INTERRUPTS DISABLED
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEnterSleepStateS4bios (
+ void)
+{
+ UINT32 InValue;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiEnterSleepStateS4bios);
+
+
+ Status = AcpiSetRegister (ACPI_BITREG_WAKE_STATUS, 1);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiHwClearAcpiStatus ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * 1) Disable/Clear all GPEs
+ * 2) Enable all wakeup GPEs
+ */
+ Status = AcpiHwDisableAllGpes ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ AcpiGbl_SystemAwakeAndRunning = FALSE;
+
+ Status = AcpiHwEnableAllWakeupGpes ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_FLUSH_CPU_CACHE ();
+
+ Status = AcpiOsWritePort (AcpiGbl_FADT.SmiCommand,
+ (UINT32) AcpiGbl_FADT.S4BiosRequest, 8);
+
+ do {
+ AcpiOsStall(1000);
+ Status = AcpiGetRegister (ACPI_BITREG_WAKE_STATUS, &InValue);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ } while (!InValue);
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiEnterSleepStateS4bios)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiLeaveSleepState
+ *
+ * PARAMETERS: SleepState - Which sleep state we just exited
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Perform OS-independent ACPI cleanup after a sleep
+ * Called with interrupts ENABLED.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiLeaveSleepState (
+ UINT8 SleepState)
+{
+ ACPI_OBJECT_LIST ArgList;
+ ACPI_OBJECT Arg;
+ ACPI_STATUS Status;
+ ACPI_BIT_REGISTER_INFO *SleepTypeRegInfo;
+ ACPI_BIT_REGISTER_INFO *SleepEnableRegInfo;
+ UINT32 PM1AControl;
+ UINT32 PM1BControl;
+
+
+ ACPI_FUNCTION_TRACE (AcpiLeaveSleepState);
+
+
+ /*
+ * Set SLP_TYPE and SLP_EN to state S0.
+ * This is unclear from the ACPI Spec, but it is required
+ * by some machines.
+ */
+ Status = AcpiGetSleepTypeData (ACPI_STATE_S0,
+ &AcpiGbl_SleepTypeA, &AcpiGbl_SleepTypeB);
+ if (ACPI_SUCCESS (Status))
+ {
+ SleepTypeRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_TYPE_A);
+ SleepEnableRegInfo = AcpiHwGetBitRegisterInfo (ACPI_BITREG_SLEEP_ENABLE);
+
+ /* Get current value of PM1A control */
+
+ Status = AcpiHwRegisterRead (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1_CONTROL, &PM1AControl);
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Clear SLP_EN and SLP_TYP fields */
+
+ PM1AControl &= ~(SleepTypeRegInfo->AccessBitMask |
+ SleepEnableRegInfo->AccessBitMask);
+ PM1BControl = PM1AControl;
+
+ /* Insert SLP_TYP bits */
+
+ PM1AControl |= (AcpiGbl_SleepTypeA << SleepTypeRegInfo->BitPosition);
+ PM1BControl |= (AcpiGbl_SleepTypeB << SleepTypeRegInfo->BitPosition);
+
+ /* Just ignore any errors */
+
+ (void) AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1A_CONTROL, PM1AControl);
+ (void) AcpiHwRegisterWrite (ACPI_MTX_DO_NOT_LOCK,
+ ACPI_REGISTER_PM1B_CONTROL, PM1BControl);
+ }
+ }
+
+ /* Ensure EnterSleepStatePrep -> EnterSleepState ordering */
+
+ AcpiGbl_SleepTypeA = ACPI_SLEEP_TYPE_INVALID;
+
+ /* Setup parameter object */
+
+ ArgList.Count = 1;
+ ArgList.Pointer = &Arg;
+ Arg.Type = ACPI_TYPE_INTEGER;
+
+ /* Ignore any errors from these methods */
+
+ Arg.Integer.Value = ACPI_SST_WAKING;
+ Status = AcpiEvaluateObject (NULL, METHOD_NAME__SST, &ArgList, NULL);
+ if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND)
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "During Method _SST"));
+ }
+
+ Arg.Integer.Value = SleepState;
+ Status = AcpiEvaluateObject (NULL, METHOD_NAME__BFS, &ArgList, NULL);
+ if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND)
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "During Method _BFS"));
+ }
+
+ Status = AcpiEvaluateObject (NULL, METHOD_NAME__WAK, &ArgList, NULL);
+ if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND)
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "During Method _WAK"));
+ }
+ /* TBD: _WAK "sometimes" returns stuff - do we want to look at it? */
+
+ /*
+ * Restore the GPEs:
+ * 1) Disable/Clear all GPEs
+ * 2) Enable all runtime GPEs
+ */
+ Status = AcpiHwDisableAllGpes ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ AcpiGbl_SystemAwakeAndRunning = TRUE;
+
+ Status = AcpiHwEnableAllRuntimeGpes ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Enable power button */
+
+ (void) AcpiSetRegister(
+ AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].EnableRegisterId, 1);
+
+ (void) AcpiSetRegister(
+ AcpiGbl_FixedEventInfo[ACPI_EVENT_POWER_BUTTON].StatusRegisterId, 1);
+
+ /* Enable BM arbitration */
+
+ Status = AcpiSetRegister (ACPI_BITREG_ARB_DISABLE, 0);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Arg.Integer.Value = ACPI_SST_WORKING;
+ Status = AcpiEvaluateObject (NULL, METHOD_NAME__SST, &ArgList, NULL);
+ if (ACPI_FAILURE (Status) && Status != AE_NOT_FOUND)
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "During Method _SST"));
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiLeaveSleepState)
+
diff --git a/sys/contrib/dev/acpica/hwtimer.c b/sys/contrib/dev/acpica/hwtimer.c
new file mode 100644
index 0000000..78114e5
--- /dev/null
+++ b/sys/contrib/dev/acpica/hwtimer.c
@@ -0,0 +1,288 @@
+
+/******************************************************************************
+ *
+ * Name: hwtimer.c - ACPI Power Management Timer Interface
+ * $Revision: 1.37 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#include <contrib/dev/acpica/acpi.h>
+
+#define _COMPONENT ACPI_HARDWARE
+ ACPI_MODULE_NAME ("hwtimer")
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiGetTimerResolution
+ *
+ * PARAMETERS: Resolution - Where the resolution is returned
+ *
+ * RETURN: Status and timer resolution
+ *
+ * DESCRIPTION: Obtains resolution of the ACPI PM Timer (24 or 32 bits).
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetTimerResolution (
+ UINT32 *Resolution)
+{
+ ACPI_FUNCTION_TRACE (AcpiGetTimerResolution);
+
+
+ if (!Resolution)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if ((AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) == 0)
+ {
+ *Resolution = 24;
+ }
+ else
+ {
+ *Resolution = 32;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetTimerResolution)
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiGetTimer
+ *
+ * PARAMETERS: Ticks - Where the timer value is returned
+ *
+ * RETURN: Status and current timer value (ticks)
+ *
+ * DESCRIPTION: Obtains current value of ACPI PM Timer (in ticks).
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetTimer (
+ UINT32 *Ticks)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetTimer);
+
+
+ if (!Ticks)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiHwLowLevelRead (32, Ticks, &AcpiGbl_FADT.XPmTimerBlock);
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetTimer)
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiGetTimerDuration
+ *
+ * PARAMETERS: StartTicks - Starting timestamp
+ * EndTicks - End timestamp
+ * TimeElapsed - Where the elapsed time is returned
+ *
+ * RETURN: Status and TimeElapsed
+ *
+ * DESCRIPTION: Computes the time elapsed (in microseconds) between two
+ * PM Timer time stamps, taking into account the possibility of
+ * rollovers, the timer resolution, and timer frequency.
+ *
+ * The PM Timer's clock ticks at roughly 3.6 times per
+ * _microsecond_, and its clock continues through Cx state
+ * transitions (unlike many CPU timestamp counters) -- making it
+ * a versatile and accurate timer.
+ *
+ * Note that this function accommodates only a single timer
+ * rollover. Thus for 24-bit timers, this function should only
+ * be used for calculating durations less than ~4.6 seconds
+ * (~20 minutes for 32-bit timers) -- calculations below:
+ *
+ * 2**24 Ticks / 3,600,000 Ticks/Sec = 4.66 sec
+ * 2**32 Ticks / 3,600,000 Ticks/Sec = 1193 sec or 19.88 minutes
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetTimerDuration (
+ UINT32 StartTicks,
+ UINT32 EndTicks,
+ UINT32 *TimeElapsed)
+{
+ ACPI_STATUS Status;
+ UINT32 DeltaTicks;
+ ACPI_INTEGER Quotient;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetTimerDuration);
+
+
+ if (!TimeElapsed)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Compute Tick Delta:
+ * Handle (max one) timer rollovers on 24-bit versus 32-bit timers.
+ */
+ if (StartTicks < EndTicks)
+ {
+ DeltaTicks = EndTicks - StartTicks;
+ }
+ else if (StartTicks > EndTicks)
+ {
+ if ((AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER) == 0)
+ {
+ /* 24-bit Timer */
+
+ DeltaTicks = (((0x00FFFFFF - StartTicks) + EndTicks) & 0x00FFFFFF);
+ }
+ else
+ {
+ /* 32-bit Timer */
+
+ DeltaTicks = (0xFFFFFFFF - StartTicks) + EndTicks;
+ }
+ }
+ else /* StartTicks == EndTicks */
+ {
+ *TimeElapsed = 0;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Compute Duration (Requires a 64-bit multiply and divide):
+ *
+ * TimeElapsed = (DeltaTicks * 1000000) / PM_TIMER_FREQUENCY;
+ */
+ Status = AcpiUtShortDivide (((UINT64) DeltaTicks) * 1000000,
+ PM_TIMER_FREQUENCY, &Quotient, NULL);
+
+ *TimeElapsed = (UINT32) Quotient;
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetTimerDuration)
+
diff --git a/sys/contrib/dev/acpica/nsaccess.c b/sys/contrib/dev/acpica/nsaccess.c
new file mode 100644
index 0000000..d1b4f73
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsaccess.c
@@ -0,0 +1,750 @@
+/*******************************************************************************
+ *
+ * Module Name: nsaccess - Top-level functions for accessing ACPI namespace
+ * $Revision: 1.206 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __NSACCESS_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdispat.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsaccess")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsRootInitialize
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Allocate and initialize the default root named objects
+ *
+ * MUTEX: Locks namespace for entire execution
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsRootInitialize (
+ void)
+{
+ ACPI_STATUS Status;
+ const ACPI_PREDEFINED_NAMES *InitVal = NULL;
+ ACPI_NAMESPACE_NODE *NewNode;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STRING Val = NULL;
+
+
+ ACPI_FUNCTION_TRACE (NsRootInitialize);
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * The global root ptr is initially NULL, so a non-NULL value indicates
+ * that AcpiNsRootInitialize() has already been called; just return.
+ */
+ if (AcpiGbl_RootNode)
+ {
+ Status = AE_OK;
+ goto UnlockAndExit;
+ }
+
+ /*
+ * Tell the rest of the subsystem that the root is initialized
+ * (This is OK because the namespace is locked)
+ */
+ AcpiGbl_RootNode = &AcpiGbl_RootNodeStruct;
+
+ /* Enter the pre-defined names in the name table */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Entering predefined entries into namespace\n"));
+
+ for (InitVal = AcpiGbl_PreDefinedNames; InitVal->Name; InitVal++)
+ {
+ /* _OSI is optional for now, will be permanent later */
+
+ if (!ACPI_STRCMP (InitVal->Name, "_OSI") && !AcpiGbl_CreateOsiMethod)
+ {
+ continue;
+ }
+
+ Status = AcpiNsLookup (NULL, InitVal->Name, InitVal->Type,
+ ACPI_IMODE_LOAD_PASS2, ACPI_NS_NO_UPSEARCH,
+ NULL, &NewNode);
+
+ if (ACPI_FAILURE (Status) || (!NewNode)) /* Must be on same line for code converter */
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not create predefined name %s",
+ InitVal->Name));
+ }
+
+ /*
+ * Name entered successfully.
+ * If entry in PreDefinedNames[] specifies an
+ * initial value, create the initial value.
+ */
+ if (InitVal->Val)
+ {
+ Status = AcpiOsPredefinedOverride (InitVal, &Val);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not override predefined %s",
+ InitVal->Name));
+ }
+
+ if (!Val)
+ {
+ Val = InitVal->Val;
+ }
+
+ /*
+ * Entry requests an initial value, allocate a
+ * descriptor for it.
+ */
+ ObjDesc = AcpiUtCreateInternalObject (InitVal->Type);
+ if (!ObjDesc)
+ {
+ Status = AE_NO_MEMORY;
+ goto UnlockAndExit;
+ }
+
+ /*
+ * Convert value string from table entry to
+ * internal representation. Only types actually
+ * used for initial values are implemented here.
+ */
+ switch (InitVal->Type)
+ {
+ case ACPI_TYPE_METHOD:
+ ObjDesc->Method.ParamCount = (UINT8) ACPI_TO_INTEGER (Val);
+ ObjDesc->Common.Flags |= AOPOBJ_DATA_VALID;
+
+#if defined (ACPI_ASL_COMPILER)
+
+ /* Save the parameter count for the iASL compiler */
+
+ NewNode->Value = ObjDesc->Method.ParamCount;
+#else
+ /* Mark this as a very SPECIAL method */
+
+ ObjDesc->Method.MethodFlags = AML_METHOD_INTERNAL_ONLY;
+
+#ifndef ACPI_DUMP_APP
+ ObjDesc->Method.Implementation = AcpiUtOsiImplementation;
+#endif
+#endif
+ break;
+
+ case ACPI_TYPE_INTEGER:
+
+ ObjDesc->Integer.Value = ACPI_TO_INTEGER (Val);
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ /*
+ * Build an object around the static string
+ */
+ ObjDesc->String.Length = (UINT32) ACPI_STRLEN (Val);
+ ObjDesc->String.Pointer = Val;
+ ObjDesc->Common.Flags |= AOPOBJ_STATIC_POINTER;
+ break;
+
+
+ case ACPI_TYPE_MUTEX:
+
+ ObjDesc->Mutex.Node = NewNode;
+ ObjDesc->Mutex.SyncLevel = (UINT8) (ACPI_TO_INTEGER (Val) - 1);
+
+ /* Create a mutex */
+
+ Status = AcpiOsCreateMutex (&ObjDesc->Mutex.OsMutex);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ObjDesc);
+ goto UnlockAndExit;
+ }
+
+ /* Special case for ACPI Global Lock */
+
+ if (ACPI_STRCMP (InitVal->Name, "_GL_") == 0)
+ {
+ AcpiGbl_GlobalLockMutex = ObjDesc;
+
+ /* Create additional counting semaphore for global lock */
+
+ Status = AcpiOsCreateSemaphore (
+ 1, 0, &AcpiGbl_GlobalLockSemaphore);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiUtRemoveReference (ObjDesc);
+ goto UnlockAndExit;
+ }
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unsupported initial type value %X",
+ InitVal->Type));
+ AcpiUtRemoveReference (ObjDesc);
+ ObjDesc = NULL;
+ continue;
+ }
+
+ /* Store pointer to value descriptor in the Node */
+
+ Status = AcpiNsAttachObject (NewNode, ObjDesc,
+ ACPI_GET_OBJECT_TYPE (ObjDesc));
+
+ /* Remove local reference to the object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ }
+ }
+
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+
+ /* Save a handle to "_GPE", it is always present */
+
+ if (ACPI_SUCCESS (Status))
+ {
+ Status = AcpiNsGetNode (NULL, "\\_GPE", ACPI_NS_NO_UPSEARCH,
+ &AcpiGbl_FadtGpeDevice);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsLookup
+ *
+ * PARAMETERS: ScopeInfo - Current scope info block
+ * Pathname - Search pathname, in internal format
+ * (as represented in the AML stream)
+ * Type - Type associated with name
+ * InterpreterMode - IMODE_LOAD_PASS2 => add name if not found
+ * Flags - Flags describing the search restrictions
+ * WalkState - Current state of the walk
+ * ReturnNode - Where the Node is placed (if found
+ * or created successfully)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Find or enter the passed name in the name space.
+ * Log an error if name not found in Exec mode.
+ *
+ * MUTEX: Assumes namespace is locked.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsLookup (
+ ACPI_GENERIC_STATE *ScopeInfo,
+ char *Pathname,
+ ACPI_OBJECT_TYPE Type,
+ ACPI_INTERPRETER_MODE InterpreterMode,
+ UINT32 Flags,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE **ReturnNode)
+{
+ ACPI_STATUS Status;
+ char *Path = Pathname;
+ ACPI_NAMESPACE_NODE *PrefixNode;
+ ACPI_NAMESPACE_NODE *CurrentNode = NULL;
+ ACPI_NAMESPACE_NODE *ThisNode = NULL;
+ UINT32 NumSegments;
+ UINT32 NumCarats;
+ ACPI_NAME SimpleName;
+ ACPI_OBJECT_TYPE TypeToCheckFor;
+ ACPI_OBJECT_TYPE ThisSearchType;
+ UINT32 SearchParentFlag = ACPI_NS_SEARCH_PARENT;
+ UINT32 LocalFlags;
+
+
+ ACPI_FUNCTION_TRACE (NsLookup);
+
+
+ if (!ReturnNode)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ LocalFlags = Flags & ~(ACPI_NS_ERROR_IF_FOUND | ACPI_NS_SEARCH_PARENT);
+ *ReturnNode = ACPI_ENTRY_NOT_FOUND;
+ AcpiGbl_NsLookupCount++;
+
+ if (!AcpiGbl_RootNode)
+ {
+ return_ACPI_STATUS (AE_NO_NAMESPACE);
+ }
+
+ /*
+ * Get the prefix scope.
+ * A null scope means use the root scope
+ */
+ if ((!ScopeInfo) ||
+ (!ScopeInfo->Scope.Node))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Null scope prefix, using root node (%p)\n",
+ AcpiGbl_RootNode));
+
+ PrefixNode = AcpiGbl_RootNode;
+ }
+ else
+ {
+ PrefixNode = ScopeInfo->Scope.Node;
+ if (ACPI_GET_DESCRIPTOR_TYPE (PrefixNode) != ACPI_DESC_TYPE_NAMED)
+ {
+ ACPI_ERROR ((AE_INFO, "%p is not a namespace node [%s]",
+ PrefixNode, AcpiUtGetDescriptorName (PrefixNode)));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
+ if (!(Flags & ACPI_NS_PREFIX_IS_SCOPE))
+ {
+ /*
+ * This node might not be a actual "scope" node (such as a
+ * Device/Method, etc.) It could be a Package or other object node.
+ * Backup up the tree to find the containing scope node.
+ */
+ while (!AcpiNsOpensScope (PrefixNode->Type) &&
+ PrefixNode->Type != ACPI_TYPE_ANY)
+ {
+ PrefixNode = AcpiNsGetParentNode (PrefixNode);
+ }
+ }
+ }
+
+ /* Save type TBD: may be no longer necessary */
+
+ TypeToCheckFor = Type;
+
+ /*
+ * Begin examination of the actual pathname
+ */
+ if (!Pathname)
+ {
+ /* A Null NamePath is allowed and refers to the root */
+
+ NumSegments = 0;
+ ThisNode = AcpiGbl_RootNode;
+ Path = "";
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Null Pathname (Zero segments), Flags=%X\n", Flags));
+ }
+ else
+ {
+ /*
+ * Name pointer is valid (and must be in internal name format)
+ *
+ * Check for scope prefixes:
+ *
+ * As represented in the AML stream, a namepath consists of an
+ * optional scope prefix followed by a name segment part.
+ *
+ * If present, the scope prefix is either a Root Prefix (in
+ * which case the name is fully qualified), or one or more
+ * Parent Prefixes (in which case the name's scope is relative
+ * to the current scope).
+ */
+ if (*Path == (UINT8) AML_ROOT_PREFIX)
+ {
+ /* Pathname is fully qualified, start from the root */
+
+ ThisNode = AcpiGbl_RootNode;
+ SearchParentFlag = ACPI_NS_NO_UPSEARCH;
+
+ /* Point to name segment part */
+
+ Path++;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Path is absolute from root [%p]\n", ThisNode));
+ }
+ else
+ {
+ /* Pathname is relative to current scope, start there */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Searching relative to prefix scope [%4.4s] (%p)\n",
+ AcpiUtGetNodeName (PrefixNode), PrefixNode));
+
+ /*
+ * Handle multiple Parent Prefixes (carat) by just getting
+ * the parent node for each prefix instance.
+ */
+ ThisNode = PrefixNode;
+ NumCarats = 0;
+ while (*Path == (UINT8) AML_PARENT_PREFIX)
+ {
+ /* Name is fully qualified, no search rules apply */
+
+ SearchParentFlag = ACPI_NS_NO_UPSEARCH;
+ /*
+ * Point past this prefix to the name segment
+ * part or the next Parent Prefix
+ */
+ Path++;
+
+ /* Backup to the parent node */
+
+ NumCarats++;
+ ThisNode = AcpiNsGetParentNode (ThisNode);
+ if (!ThisNode)
+ {
+ /* Current scope has no parent scope */
+
+ ACPI_ERROR ((AE_INFO,
+ "ACPI path has too many parent prefixes (^) - reached beyond root node"));
+ return_ACPI_STATUS (AE_NOT_FOUND);
+ }
+ }
+
+ if (SearchParentFlag == ACPI_NS_NO_UPSEARCH)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Search scope is [%4.4s], path has %d carat(s)\n",
+ AcpiUtGetNodeName (ThisNode), NumCarats));
+ }
+ }
+
+ /*
+ * Determine the number of ACPI name segments in this pathname.
+ *
+ * The segment part consists of either:
+ * - A Null name segment (0)
+ * - A DualNamePrefix followed by two 4-byte name segments
+ * - A MultiNamePrefix followed by a byte indicating the
+ * number of segments and the segments themselves.
+ * - A single 4-byte name segment
+ *
+ * Examine the name prefix opcode, if any, to determine the number of
+ * segments.
+ */
+ switch (*Path)
+ {
+ case 0:
+ /*
+ * Null name after a root or parent prefixes. We already
+ * have the correct target node and there are no name segments.
+ */
+ NumSegments = 0;
+ Type = ThisNode->Type;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Prefix-only Pathname (Zero name segments), Flags=%X\n",
+ Flags));
+ break;
+
+ case AML_DUAL_NAME_PREFIX:
+
+ /* More than one NameSeg, search rules do not apply */
+
+ SearchParentFlag = ACPI_NS_NO_UPSEARCH;
+
+ /* Two segments, point to first name segment */
+
+ NumSegments = 2;
+ Path++;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Dual Pathname (2 segments, Flags=%X)\n", Flags));
+ break;
+
+ case AML_MULTI_NAME_PREFIX_OP:
+
+ /* More than one NameSeg, search rules do not apply */
+
+ SearchParentFlag = ACPI_NS_NO_UPSEARCH;
+
+ /* Extract segment count, point to first name segment */
+
+ Path++;
+ NumSegments = (UINT32) (UINT8) *Path;
+ Path++;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Multi Pathname (%d Segments, Flags=%X)\n",
+ NumSegments, Flags));
+ break;
+
+ default:
+ /*
+ * Not a Null name, no Dual or Multi prefix, hence there is
+ * only one name segment and Pathname is already pointing to it.
+ */
+ NumSegments = 1;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Simple Pathname (1 segment, Flags=%X)\n", Flags));
+ break;
+ }
+
+ ACPI_DEBUG_EXEC (AcpiNsPrintPathname (NumSegments, Path));
+ }
+
+
+ /*
+ * Search namespace for each segment of the name. Loop through and
+ * verify (or add to the namespace) each name segment.
+ *
+ * The object type is significant only at the last name
+ * segment. (We don't care about the types along the path, only
+ * the type of the final target object.)
+ */
+ ThisSearchType = ACPI_TYPE_ANY;
+ CurrentNode = ThisNode;
+ while (NumSegments && CurrentNode)
+ {
+ NumSegments--;
+ if (!NumSegments)
+ {
+ /*
+ * This is the last segment, enable typechecking
+ */
+ ThisSearchType = Type;
+
+ /*
+ * Only allow automatic parent search (search rules) if the caller
+ * requested it AND we have a single, non-fully-qualified NameSeg
+ */
+ if ((SearchParentFlag != ACPI_NS_NO_UPSEARCH) &&
+ (Flags & ACPI_NS_SEARCH_PARENT))
+ {
+ LocalFlags |= ACPI_NS_SEARCH_PARENT;
+ }
+
+ /* Set error flag according to caller */
+
+ if (Flags & ACPI_NS_ERROR_IF_FOUND)
+ {
+ LocalFlags |= ACPI_NS_ERROR_IF_FOUND;
+ }
+ }
+
+ /* Extract one ACPI name from the front of the pathname */
+
+ ACPI_MOVE_32_TO_32 (&SimpleName, Path);
+
+ /* Try to find the single (4 character) ACPI name */
+
+ Status = AcpiNsSearchAndEnter (SimpleName, WalkState, CurrentNode,
+ InterpreterMode, ThisSearchType, LocalFlags, &ThisNode);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_NOT_FOUND)
+ {
+ /* Name not found in ACPI namespace */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Name [%4.4s] not found in scope [%4.4s] %p\n",
+ (char *) &SimpleName, (char *) &CurrentNode->Name,
+ CurrentNode));
+ }
+
+ *ReturnNode = ThisNode;
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Sanity typecheck of the target object:
+ *
+ * If 1) This is the last segment (NumSegments == 0)
+ * 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_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 ((NumSegments == 0) &&
+ (TypeToCheckFor != ACPI_TYPE_ANY) &&
+ (TypeToCheckFor != ACPI_TYPE_LOCAL_ALIAS) &&
+ (TypeToCheckFor != ACPI_TYPE_LOCAL_METHOD_ALIAS) &&
+ (TypeToCheckFor != ACPI_TYPE_LOCAL_SCOPE) &&
+ (ThisNode->Type != ACPI_TYPE_ANY) &&
+ (ThisNode->Type != TypeToCheckFor))
+ {
+ /* Complain about a type mismatch */
+
+ ACPI_WARNING ((AE_INFO,
+ "NsLookup: Type mismatch on %4.4s (%s), searching for (%s)",
+ ACPI_CAST_PTR (char, &SimpleName),
+ AcpiUtGetTypeName (ThisNode->Type),
+ AcpiUtGetTypeName (TypeToCheckFor)));
+ }
+
+ /*
+ * If this is the last name segment and we are not looking for a
+ * specific type, but the type of found object is known, use that type
+ * to see if it opens a scope.
+ */
+ if ((NumSegments == 0) && (Type == ACPI_TYPE_ANY))
+ {
+ Type = ThisNode->Type;
+ }
+
+ /* Point to next name segment and make this node current */
+
+ Path += ACPI_NAME_SIZE;
+ CurrentNode = ThisNode;
+ }
+
+ /*
+ * Always check if we need to open a new scope
+ */
+ if (!(Flags & ACPI_NS_DONT_OPEN_SCOPE) && (WalkState))
+ {
+ /*
+ * If entry is a type which opens a scope, push the new scope on the
+ * scope stack.
+ */
+ if (AcpiNsOpensScope (Type))
+ {
+ Status = AcpiDsScopeStackPush (ThisNode, Type, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ }
+
+ *ReturnNode = ThisNode;
+ return_ACPI_STATUS (AE_OK);
+}
+
diff --git a/sys/contrib/dev/acpica/nsalloc.c b/sys/contrib/dev/acpica/nsalloc.c
new file mode 100644
index 0000000..e6ecf5a
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsalloc.c
@@ -0,0 +1,628 @@
+/*******************************************************************************
+ *
+ * Module Name: nsalloc - Namespace allocation and deletion utilities
+ * $Revision: 1.108 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __NSALLOC_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsalloc")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsCreateNode
+ *
+ * PARAMETERS: Name - Name of the new node (4 char ACPI name)
+ *
+ * RETURN: New namespace node (Null on failure)
+ *
+ * DESCRIPTION: Create a namespace node
+ *
+ ******************************************************************************/
+
+ACPI_NAMESPACE_NODE *
+AcpiNsCreateNode (
+ UINT32 Name)
+{
+ ACPI_NAMESPACE_NODE *Node;
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+ UINT32 Temp;
+#endif
+
+
+ ACPI_FUNCTION_TRACE (NsCreateNode);
+
+
+ Node = AcpiOsAcquireObject (AcpiGbl_NamespaceCache);
+ if (!Node)
+ {
+ return_PTR (NULL);
+ }
+
+ ACPI_MEM_TRACKING (AcpiGbl_NsNodeList->TotalAllocated++);
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+ Temp = AcpiGbl_NsNodeList->TotalAllocated - AcpiGbl_NsNodeList->TotalFreed;
+ if (Temp > AcpiGbl_NsNodeList->MaxOccupied)
+ {
+ AcpiGbl_NsNodeList->MaxOccupied = Temp;
+ }
+#endif
+
+ Node->Name.Integer = Name;
+ ACPI_SET_DESCRIPTOR_TYPE (Node, ACPI_DESC_TYPE_NAMED);
+ return_PTR (Node);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDeleteNode
+ *
+ * PARAMETERS: Node - Node to be deleted
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Delete a namespace node
+ *
+ ******************************************************************************/
+
+void
+AcpiNsDeleteNode (
+ ACPI_NAMESPACE_NODE *Node)
+{
+ ACPI_NAMESPACE_NODE *ParentNode;
+ ACPI_NAMESPACE_NODE *PrevNode;
+ ACPI_NAMESPACE_NODE *NextNode;
+
+
+ ACPI_FUNCTION_TRACE_PTR (NsDeleteNode, Node);
+
+
+ ParentNode = AcpiNsGetParentNode (Node);
+
+ PrevNode = NULL;
+ NextNode = ParentNode->Child;
+
+ /* Find the node that is the previous peer in the parent's child list */
+
+ while (NextNode != Node)
+ {
+ PrevNode = NextNode;
+ NextNode = PrevNode->Peer;
+ }
+
+ if (PrevNode)
+ {
+ /* Node is not first child, unlink it */
+
+ PrevNode->Peer = NextNode->Peer;
+ if (NextNode->Flags & ANOBJ_END_OF_PEER_LIST)
+ {
+ PrevNode->Flags |= ANOBJ_END_OF_PEER_LIST;
+ }
+ }
+ else
+ {
+ /* Node is first child (has no previous peer) */
+
+ if (NextNode->Flags & ANOBJ_END_OF_PEER_LIST)
+ {
+ /* No peers at all */
+
+ ParentNode->Child = NULL;
+ }
+ else
+ { /* Link peer list to parent */
+
+ ParentNode->Child = NextNode->Peer;
+ }
+ }
+
+ ACPI_MEM_TRACKING (AcpiGbl_NsNodeList->TotalFreed++);
+
+ /*
+ * Detach an object if there is one, then delete the node
+ */
+ AcpiNsDetachObject (Node);
+ (void) AcpiOsReleaseObject (AcpiGbl_NamespaceCache, Node);
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsInstallNode
+ *
+ * PARAMETERS: WalkState - Current state of the walk
+ * ParentNode - The parent of the new Node
+ * Node - The new Node to install
+ * Type - ACPI object type of the new Node
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Initialize a new namespace node and install it amongst
+ * its peers.
+ *
+ * Note: Current namespace lookup is linear search. This appears
+ * to be sufficient as namespace searches consume only a small
+ * fraction of the execution time of the ACPI subsystem.
+ *
+ ******************************************************************************/
+
+void
+AcpiNsInstallNode (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *ParentNode, /* Parent */
+ ACPI_NAMESPACE_NODE *Node, /* New Child*/
+ ACPI_OBJECT_TYPE Type)
+{
+ ACPI_OWNER_ID OwnerId = 0;
+ ACPI_NAMESPACE_NODE *ChildNode;
+
+
+ ACPI_FUNCTION_TRACE (NsInstallNode);
+
+
+ /*
+ * Get the owner ID from the Walk state
+ * The owner ID is used to track table deletion and
+ * deletion of objects created by methods
+ */
+ if (WalkState)
+ {
+ OwnerId = WalkState->OwnerId;
+ }
+
+ /* Link the new entry into the parent and existing children */
+
+ ChildNode = ParentNode->Child;
+ if (!ChildNode)
+ {
+ ParentNode->Child = Node;
+ Node->Flags |= ANOBJ_END_OF_PEER_LIST;
+ Node->Peer = ParentNode;
+ }
+ else
+ {
+ while (!(ChildNode->Flags & ANOBJ_END_OF_PEER_LIST))
+ {
+ ChildNode = ChildNode->Peer;
+ }
+
+ ChildNode->Peer = Node;
+
+ /* Clear end-of-list flag */
+
+ ChildNode->Flags &= ~ANOBJ_END_OF_PEER_LIST;
+ Node->Flags |= ANOBJ_END_OF_PEER_LIST;
+ Node->Peer = ParentNode;
+ }
+
+ /* Init the new entry */
+
+ Node->OwnerId = OwnerId;
+ Node->Type = (UINT8) Type;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "%4.4s (%s) [Node %p Owner %X] added to %4.4s (%s) [Node %p]\n",
+ AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Node->Type), Node, OwnerId,
+ AcpiUtGetNodeName (ParentNode), AcpiUtGetTypeName (ParentNode->Type),
+ ParentNode));
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDeleteChildren
+ *
+ * PARAMETERS: ParentNode - Delete this objects children
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Delete all children of the parent object. In other words,
+ * deletes a "scope".
+ *
+ ******************************************************************************/
+
+void
+AcpiNsDeleteChildren (
+ ACPI_NAMESPACE_NODE *ParentNode)
+{
+ ACPI_NAMESPACE_NODE *ChildNode;
+ ACPI_NAMESPACE_NODE *NextNode;
+ UINT8 Flags;
+
+
+ ACPI_FUNCTION_TRACE_PTR (NsDeleteChildren, ParentNode);
+
+
+ if (!ParentNode)
+ {
+ return_VOID;
+ }
+
+ /* If no children, all done! */
+
+ ChildNode = ParentNode->Child;
+ if (!ChildNode)
+ {
+ return_VOID;
+ }
+
+ /*
+ * Deallocate all children at this level
+ */
+ do
+ {
+ /* Get the things we need */
+
+ NextNode = ChildNode->Peer;
+ Flags = ChildNode->Flags;
+
+ /* Grandchildren should have all been deleted already */
+
+ if (ChildNode->Child)
+ {
+ ACPI_ERROR ((AE_INFO, "Found a grandchild! P=%p C=%p",
+ ParentNode, ChildNode));
+ }
+
+ /* Now we can free this child object */
+
+ ACPI_MEM_TRACKING (AcpiGbl_NsNodeList->TotalFreed++);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Object %p, Remaining %X\n",
+ ChildNode, AcpiGbl_CurrentNodeCount));
+
+ /*
+ * Detach an object if there is one, then free the child node
+ */
+ AcpiNsDetachObject (ChildNode);
+
+ /* Now we can delete the node */
+
+ (void) AcpiOsReleaseObject (AcpiGbl_NamespaceCache, ChildNode);
+
+ /* And move on to the next child in the list */
+
+ ChildNode = NextNode;
+
+ } while (!(Flags & ANOBJ_END_OF_PEER_LIST));
+
+
+ /* Clear the parent's child pointer */
+
+ ParentNode->Child = NULL;
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDeleteNamespaceSubtree
+ *
+ * PARAMETERS: ParentNode - Root of the subtree to be deleted
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Delete a subtree of the namespace. This includes all objects
+ * stored within the subtree.
+ *
+ ******************************************************************************/
+
+void
+AcpiNsDeleteNamespaceSubtree (
+ ACPI_NAMESPACE_NODE *ParentNode)
+{
+ ACPI_NAMESPACE_NODE *ChildNode = NULL;
+ UINT32 Level = 1;
+
+
+ ACPI_FUNCTION_TRACE (NsDeleteNamespaceSubtree);
+
+
+ if (!ParentNode)
+ {
+ return_VOID;
+ }
+
+ /*
+ * Traverse the tree of objects until we bubble back up
+ * to where we started.
+ */
+ while (Level > 0)
+ {
+ /* Get the next node in this scope (NULL if none) */
+
+ ChildNode = AcpiNsGetNextNode (ACPI_TYPE_ANY, ParentNode, ChildNode);
+ if (ChildNode)
+ {
+ /* Found a child node - detach any attached object */
+
+ AcpiNsDetachObject (ChildNode);
+
+ /* Check if this node has any children */
+
+ if (AcpiNsGetNextNode (ACPI_TYPE_ANY, ChildNode, NULL))
+ {
+ /*
+ * There is at least one child of this node,
+ * visit the node
+ */
+ Level++;
+ ParentNode = ChildNode;
+ ChildNode = NULL;
+ }
+ }
+ else
+ {
+ /*
+ * No more children of this parent node.
+ * Move up to the grandparent.
+ */
+ Level--;
+
+ /*
+ * Now delete all of the children of this parent
+ * all at the same time.
+ */
+ AcpiNsDeleteChildren (ParentNode);
+
+ /* New "last child" is this parent node */
+
+ ChildNode = ParentNode;
+
+ /* Move up the tree to the grandparent */
+
+ ParentNode = AcpiNsGetParentNode (ParentNode);
+ }
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDeleteNamespaceByOwner
+ *
+ * PARAMETERS: OwnerId - All nodes with this owner will be deleted
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Delete entries within the namespace that are owned by a
+ * specific ID. Used to delete entire ACPI tables. All
+ * reference counts are updated.
+ *
+ * MUTEX: Locks namespace during deletion walk.
+ *
+ ******************************************************************************/
+
+void
+AcpiNsDeleteNamespaceByOwner (
+ ACPI_OWNER_ID OwnerId)
+{
+ ACPI_NAMESPACE_NODE *ChildNode;
+ ACPI_NAMESPACE_NODE *DeletionNode;
+ ACPI_NAMESPACE_NODE *ParentNode;
+ UINT32 Level;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_U32 (NsDeleteNamespaceByOwner, OwnerId);
+
+
+ if (OwnerId == 0)
+ {
+ return_VOID;
+ }
+
+ /* Lock namespace for possible update */
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_VOID;
+ }
+
+ DeletionNode = NULL;
+ ParentNode = AcpiGbl_RootNode;
+ ChildNode = NULL;
+ Level = 1;
+
+ /*
+ * Traverse the tree of nodes until we bubble back up
+ * to where we started.
+ */
+ while (Level > 0)
+ {
+ /*
+ * Get the next child of this parent node. When ChildNode is NULL,
+ * the first child of the parent is returned
+ */
+ ChildNode = AcpiNsGetNextNode (ACPI_TYPE_ANY, ParentNode, ChildNode);
+
+ if (DeletionNode)
+ {
+ AcpiNsDeleteChildren (DeletionNode);
+ AcpiNsDeleteNode (DeletionNode);
+ DeletionNode = NULL;
+ }
+
+ if (ChildNode)
+ {
+ if (ChildNode->OwnerId == OwnerId)
+ {
+ /* Found a matching child node - detach any attached object */
+
+ AcpiNsDetachObject (ChildNode);
+ }
+
+ /* Check if this node has any children */
+
+ if (AcpiNsGetNextNode (ACPI_TYPE_ANY, ChildNode, NULL))
+ {
+ /*
+ * There is at least one child of this node,
+ * visit the node
+ */
+ Level++;
+ ParentNode = ChildNode;
+ ChildNode = NULL;
+ }
+ else if (ChildNode->OwnerId == OwnerId)
+ {
+ DeletionNode = ChildNode;
+ }
+ }
+ else
+ {
+ /*
+ * No more children of this parent node.
+ * Move up to the grandparent.
+ */
+ Level--;
+ if (Level != 0)
+ {
+ if (ParentNode->OwnerId == OwnerId)
+ {
+ DeletionNode = ParentNode;
+ }
+ }
+
+ /* New "last child" is this parent node */
+
+ ChildNode = ParentNode;
+
+ /* Move up the tree to the grandparent */
+
+ ParentNode = AcpiNsGetParentNode (ParentNode);
+ }
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_VOID;
+}
+
+
diff --git a/sys/contrib/dev/acpica/nsdump.c b/sys/contrib/dev/acpica/nsdump.c
new file mode 100644
index 0000000..7c2028a
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsdump.c
@@ -0,0 +1,826 @@
+/******************************************************************************
+ *
+ * Module Name: nsdump - table dumping routines for debug
+ * $Revision: 1.182 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __NSDUMP_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acparser.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsdump")
+
+/* Local prototypes */
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+void
+AcpiNsDumpRootDevices (
+ void);
+
+static ACPI_STATUS
+AcpiNsDumpOneDevice (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue);
+#endif
+
+
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsPrintPathname
+ *
+ * PARAMETERS: NumSegments - Number of ACPI name segments
+ * Pathname - The compressed (internal) path
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print an object's full namespace pathname
+ *
+ ******************************************************************************/
+
+void
+AcpiNsPrintPathname (
+ UINT32 NumSegments,
+ char *Pathname)
+{
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_NAME (NsPrintPathname);
+
+
+ if (!(AcpiDbgLevel & ACPI_LV_NAMES) || !(AcpiDbgLayer & ACPI_NAMESPACE))
+ {
+ return;
+ }
+
+ /* Print the entire name */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "["));
+
+ while (NumSegments)
+ {
+ for (i = 0; i < 4; i++)
+ {
+ ACPI_IS_PRINT (Pathname[i]) ?
+ AcpiOsPrintf ("%c", Pathname[i]) :
+ AcpiOsPrintf ("?");
+ }
+
+ Pathname += ACPI_NAME_SIZE;
+ NumSegments--;
+ if (NumSegments)
+ {
+ AcpiOsPrintf (".");
+ }
+ }
+
+ AcpiOsPrintf ("]\n");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDumpPathname
+ *
+ * PARAMETERS: Handle - Object
+ * Msg - Prefix message
+ * Level - Desired debug level
+ * Component - Caller's component ID
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print an object's full namespace pathname
+ * Manages allocation/freeing of a pathname buffer
+ *
+ ******************************************************************************/
+
+void
+AcpiNsDumpPathname (
+ ACPI_HANDLE Handle,
+ char *Msg,
+ UINT32 Level,
+ UINT32 Component)
+{
+
+ ACPI_FUNCTION_TRACE (NsDumpPathname);
+
+
+ /* Do this only if the requested debug level and component are enabled */
+
+ if (!(AcpiDbgLevel & Level) || !(AcpiDbgLayer & Component))
+ {
+ return_VOID;
+ }
+
+ /* Convert handle to a full pathname and print it (with supplied message) */
+
+ AcpiNsPrintNodePathname (Handle, Msg);
+ AcpiOsPrintf ("\n");
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDumpOneObject
+ *
+ * PARAMETERS: ObjHandle - Node to be dumped
+ * Level - Nesting level of the handle
+ * Context - Passed into WalkNamespace
+ * ReturnValue - Not used
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Dump a single Node
+ * This procedure is a UserFunction called by AcpiNsWalkNamespace.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsDumpOneObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_WALK_INFO *Info = (ACPI_WALK_INFO *) Context;
+ ACPI_NAMESPACE_NODE *ThisNode;
+ ACPI_OPERAND_OBJECT *ObjDesc = NULL;
+ ACPI_OBJECT_TYPE ObjType;
+ ACPI_OBJECT_TYPE Type;
+ UINT32 BytesToDump;
+ UINT32 DbgLevel;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_NAME (NsDumpOneObject);
+
+
+ /* Is output enabled? */
+
+ if (!(AcpiDbgLevel & Info->DebugLevel))
+ {
+ return (AE_OK);
+ }
+
+ if (!ObjHandle)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Null object handle\n"));
+ return (AE_OK);
+ }
+
+ ThisNode = AcpiNsMapHandleToNode (ObjHandle);
+ Type = ThisNode->Type;
+
+ /* Check if the owner matches */
+
+ if ((Info->OwnerId != ACPI_OWNER_ID_MAX) &&
+ (Info->OwnerId != ThisNode->OwnerId))
+ {
+ return (AE_OK);
+ }
+
+ if (!(Info->DisplayType & ACPI_DISPLAY_SHORT))
+ {
+ /* Indent the object according to the level */
+
+ AcpiOsPrintf ("%2d%*s", (UINT32) Level - 1, (int) Level * 2, " ");
+
+ /* Check the node type and name */
+
+ if (Type > ACPI_TYPE_LOCAL_MAX)
+ {
+ ACPI_WARNING ((AE_INFO, "Invalid ACPI Object Type %08X", Type));
+ }
+
+ if (!AcpiUtValidAcpiName (ThisNode->Name.Integer))
+ {
+ ThisNode->Name.Integer = AcpiUtRepairName (ThisNode->Name.Ascii);
+
+ ACPI_WARNING ((AE_INFO, "Invalid ACPI Name %08X",
+ ThisNode->Name.Integer));
+ }
+
+ AcpiOsPrintf ("%4.4s", AcpiUtGetNodeName (ThisNode));
+ }
+
+ /*
+ * Now we can print out the pertinent information
+ */
+ AcpiOsPrintf (" %-12s %p %2.2X ",
+ AcpiUtGetTypeName (Type), ThisNode, ThisNode->OwnerId);
+
+ DbgLevel = AcpiDbgLevel;
+ AcpiDbgLevel = 0;
+ ObjDesc = AcpiNsGetAttachedObject (ThisNode);
+ AcpiDbgLevel = DbgLevel;
+
+ /* Temp nodes are those nodes created by a control method */
+
+ if (ThisNode->Flags & ANOBJ_TEMPORARY)
+ {
+ AcpiOsPrintf ("(T) ");
+ }
+
+ switch (Info->DisplayType & ACPI_DISPLAY_MASK)
+ {
+ case ACPI_DISPLAY_SUMMARY:
+
+ if (!ObjDesc)
+ {
+ /* No attached object, we are done */
+
+ AcpiOsPrintf ("\n");
+ return (AE_OK);
+ }
+
+ switch (Type)
+ {
+ case ACPI_TYPE_PROCESSOR:
+
+ AcpiOsPrintf ("ID %X Len %.4X Addr %p\n",
+ ObjDesc->Processor.ProcId, ObjDesc->Processor.Length,
+ (char *) ObjDesc->Processor.Address);
+ break;
+
+
+ case ACPI_TYPE_DEVICE:
+
+ AcpiOsPrintf ("Notify Object: %p\n", ObjDesc);
+ break;
+
+
+ case ACPI_TYPE_METHOD:
+
+ AcpiOsPrintf ("Args %X Len %.4X Aml %p\n",
+ (UINT32) ObjDesc->Method.ParamCount,
+ ObjDesc->Method.AmlLength, ObjDesc->Method.AmlStart);
+ break;
+
+
+ case ACPI_TYPE_INTEGER:
+
+ AcpiOsPrintf ("= %8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
+ {
+ AcpiOsPrintf ("Elements %.2X\n",
+ ObjDesc->Package.Count);
+ }
+ else
+ {
+ AcpiOsPrintf ("[Length not yet evaluated]\n");
+ }
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
+ {
+ AcpiOsPrintf ("Len %.2X",
+ ObjDesc->Buffer.Length);
+
+ /* Dump some of the buffer */
+
+ if (ObjDesc->Buffer.Length > 0)
+ {
+ AcpiOsPrintf (" =");
+ for (i = 0; (i < ObjDesc->Buffer.Length && i < 12); i++)
+ {
+ AcpiOsPrintf (" %.2hX", ObjDesc->Buffer.Pointer[i]);
+ }
+ }
+ AcpiOsPrintf ("\n");
+ }
+ else
+ {
+ AcpiOsPrintf ("[Length not yet evaluated]\n");
+ }
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ AcpiOsPrintf ("Len %.2X ", ObjDesc->String.Length);
+ AcpiUtPrintString (ObjDesc->String.Pointer, 32);
+ AcpiOsPrintf ("\n");
+ break;
+
+
+ case ACPI_TYPE_REGION:
+
+ AcpiOsPrintf ("[%s]",
+ AcpiUtGetRegionName (ObjDesc->Region.SpaceId));
+ if (ObjDesc->Region.Flags & AOPOBJ_DATA_VALID)
+ {
+ AcpiOsPrintf (" Addr %8.8X%8.8X Len %.4X\n",
+ ACPI_FORMAT_UINT64 (ObjDesc->Region.Address),
+ ObjDesc->Region.Length);
+ }
+ else
+ {
+ AcpiOsPrintf (" [Address/Length not yet evaluated]\n");
+ }
+ break;
+
+
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ AcpiOsPrintf ("[%s]\n",
+ AcpiPsGetOpcodeName (ObjDesc->Reference.Opcode));
+ break;
+
+
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ if (ObjDesc->BufferField.BufferObj &&
+ ObjDesc->BufferField.BufferObj->Buffer.Node)
+ {
+ AcpiOsPrintf ("Buf [%4.4s]",
+ AcpiUtGetNodeName (ObjDesc->BufferField.BufferObj->Buffer.Node));
+ }
+ break;
+
+
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+
+ AcpiOsPrintf ("Rgn [%4.4s]",
+ AcpiUtGetNodeName (ObjDesc->CommonField.RegionObj->Region.Node));
+ break;
+
+
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+
+ AcpiOsPrintf ("Rgn [%4.4s] Bnk [%4.4s]",
+ AcpiUtGetNodeName (ObjDesc->CommonField.RegionObj->Region.Node),
+ AcpiUtGetNodeName (ObjDesc->BankField.BankObj->CommonField.Node));
+ break;
+
+
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
+
+ AcpiOsPrintf ("Idx [%4.4s] Dat [%4.4s]",
+ AcpiUtGetNodeName (ObjDesc->IndexField.IndexObj->CommonField.Node),
+ AcpiUtGetNodeName (ObjDesc->IndexField.DataObj->CommonField.Node));
+ break;
+
+
+ case ACPI_TYPE_LOCAL_ALIAS:
+ case ACPI_TYPE_LOCAL_METHOD_ALIAS:
+
+ AcpiOsPrintf ("Target %4.4s (%p)\n",
+ AcpiUtGetNodeName (ObjDesc), ObjDesc);
+ break;
+
+ default:
+
+ AcpiOsPrintf ("Object %p\n", ObjDesc);
+ break;
+ }
+
+ /* Common field handling */
+
+ switch (Type)
+ {
+ case ACPI_TYPE_BUFFER_FIELD:
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
+
+ AcpiOsPrintf (" Off %.3X Len %.2X Acc %.2hd\n",
+ (ObjDesc->CommonField.BaseByteOffset * 8)
+ + ObjDesc->CommonField.StartFieldBitOffset,
+ ObjDesc->CommonField.BitLength,
+ ObjDesc->CommonField.AccessByteWidth);
+ break;
+
+ default:
+ break;
+ }
+ break;
+
+
+ case ACPI_DISPLAY_OBJECTS:
+
+ AcpiOsPrintf ("O:%p", ObjDesc);
+ if (!ObjDesc)
+ {
+ /* No attached object, we are done */
+
+ AcpiOsPrintf ("\n");
+ return (AE_OK);
+ }
+
+ AcpiOsPrintf ("(R%d)", ObjDesc->Common.ReferenceCount);
+
+ switch (Type)
+ {
+ case ACPI_TYPE_METHOD:
+
+ /* Name is a Method and its AML offset/length are set */
+
+ AcpiOsPrintf (" M:%p-%X\n", ObjDesc->Method.AmlStart,
+ ObjDesc->Method.AmlLength);
+ break;
+
+ case ACPI_TYPE_INTEGER:
+
+ AcpiOsPrintf (" I:%8.8X8.8%X\n",
+ ACPI_FORMAT_UINT64 (ObjDesc->Integer.Value));
+ break;
+
+ case ACPI_TYPE_STRING:
+
+ AcpiOsPrintf (" S:%p-%X\n", ObjDesc->String.Pointer,
+ ObjDesc->String.Length);
+ break;
+
+ case ACPI_TYPE_BUFFER:
+
+ AcpiOsPrintf (" B:%p-%X\n", ObjDesc->Buffer.Pointer,
+ ObjDesc->Buffer.Length);
+ break;
+
+ default:
+
+ AcpiOsPrintf ("\n");
+ break;
+ }
+ break;
+
+
+ default:
+ AcpiOsPrintf ("\n");
+ break;
+ }
+
+ /* If debug turned off, done */
+
+ if (!(AcpiDbgLevel & ACPI_LV_VALUES))
+ {
+ return (AE_OK);
+ }
+
+
+ /* If there is an attached object, display it */
+
+ DbgLevel = AcpiDbgLevel;
+ AcpiDbgLevel = 0;
+ ObjDesc = AcpiNsGetAttachedObject (ThisNode);
+ AcpiDbgLevel = DbgLevel;
+
+ /* Dump attached objects */
+
+ while (ObjDesc)
+ {
+ ObjType = ACPI_TYPE_INVALID;
+ AcpiOsPrintf ("Attached Object %p: ", ObjDesc);
+
+ /* Decode the type of attached object and dump the contents */
+
+ switch (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc))
+ {
+ case ACPI_DESC_TYPE_NAMED:
+
+ AcpiOsPrintf ("(Ptr to Node)\n");
+ BytesToDump = sizeof (ACPI_NAMESPACE_NODE);
+ ACPI_DUMP_BUFFER (ObjDesc, BytesToDump);
+ break;
+
+ case ACPI_DESC_TYPE_OPERAND:
+
+ ObjType = ACPI_GET_OBJECT_TYPE (ObjDesc);
+
+ if (ObjType > ACPI_TYPE_LOCAL_MAX)
+ {
+ AcpiOsPrintf ("(Ptr to ACPI Object type %X [UNKNOWN])\n",
+ ObjType);
+ BytesToDump = 32;
+ }
+ else
+ {
+ AcpiOsPrintf ("(Ptr to ACPI Object type %X [%s])\n",
+ ObjType, AcpiUtGetTypeName (ObjType));
+ BytesToDump = sizeof (ACPI_OPERAND_OBJECT);
+ }
+
+ ACPI_DUMP_BUFFER (ObjDesc, BytesToDump);
+ break;
+
+ default:
+
+ break;
+ }
+
+ /* If value is NOT an internal object, we are done */
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) != ACPI_DESC_TYPE_OPERAND)
+ {
+ goto Cleanup;
+ }
+
+ /*
+ * Valid object, get the pointer to next level, if any
+ */
+ switch (ObjType)
+ {
+ case ACPI_TYPE_BUFFER:
+ case ACPI_TYPE_STRING:
+ /*
+ * NOTE: takes advantage of common fields between string/buffer
+ */
+ BytesToDump = ObjDesc->String.Length;
+ ObjDesc = (void *) ObjDesc->String.Pointer;
+ AcpiOsPrintf ( "(Buffer/String pointer %p length %X)\n",
+ ObjDesc, BytesToDump);
+ ACPI_DUMP_BUFFER (ObjDesc, BytesToDump);
+ goto Cleanup;
+
+ case ACPI_TYPE_BUFFER_FIELD:
+ ObjDesc = (ACPI_OPERAND_OBJECT *) ObjDesc->BufferField.BufferObj;
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+ ObjDesc = (void *) ObjDesc->Package.Elements;
+ break;
+
+ case ACPI_TYPE_METHOD:
+ ObjDesc = (void *) ObjDesc->Method.AmlStart;
+ break;
+
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+ ObjDesc = (void *) ObjDesc->Field.RegionObj;
+ break;
+
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+ ObjDesc = (void *) ObjDesc->BankField.RegionObj;
+ break;
+
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
+ ObjDesc = (void *) ObjDesc->IndexField.IndexObj;
+ break;
+
+ default:
+ goto Cleanup;
+ }
+
+ ObjType = ACPI_TYPE_INVALID; /* Terminate loop after next pass */
+ }
+
+Cleanup:
+ AcpiOsPrintf ("\n");
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDumpObjects
+ *
+ * PARAMETERS: Type - Object type to be dumped
+ * DisplayType - 0 or ACPI_DISPLAY_SUMMARY
+ * MaxDepth - Maximum depth of dump. Use ACPI_UINT32_MAX
+ * for an effectively unlimited depth.
+ * OwnerId - Dump only objects owned by this ID. Use
+ * ACPI_UINT32_MAX to match all owners.
+ * StartHandle - Where in namespace to start/end search
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump typed objects within the loaded namespace.
+ * Uses AcpiNsWalkNamespace in conjunction with AcpiNsDumpOneObject.
+ *
+ ******************************************************************************/
+
+void
+AcpiNsDumpObjects (
+ ACPI_OBJECT_TYPE Type,
+ UINT8 DisplayType,
+ UINT32 MaxDepth,
+ ACPI_OWNER_ID OwnerId,
+ ACPI_HANDLE StartHandle)
+{
+ ACPI_WALK_INFO Info;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ Info.DebugLevel = ACPI_LV_TABLES;
+ Info.OwnerId = OwnerId;
+ Info.DisplayType = DisplayType;
+
+ (void) AcpiNsWalkNamespace (Type, StartHandle, MaxDepth,
+ ACPI_NS_WALK_NO_UNLOCK | ACPI_NS_WALK_TEMP_NODES,
+ AcpiNsDumpOneObject, (void *) &Info, NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDumpEntry
+ *
+ * PARAMETERS: Handle - Node to be dumped
+ * DebugLevel - Output level
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump a single Node
+ *
+ ******************************************************************************/
+
+void
+AcpiNsDumpEntry (
+ ACPI_HANDLE Handle,
+ UINT32 DebugLevel)
+{
+ ACPI_WALK_INFO Info;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ Info.DebugLevel = DebugLevel;
+ Info.OwnerId = ACPI_OWNER_ID_MAX;
+ Info.DisplayType = ACPI_DISPLAY_SUMMARY;
+
+ (void) AcpiNsDumpOneObject (Handle, 1, &Info, NULL);
+}
+
+
+#ifdef ACPI_ASL_COMPILER
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDumpTables
+ *
+ * PARAMETERS: SearchBase - Root of subtree to be dumped, or
+ * NS_ALL to dump the entire namespace
+ * MaxDepth - Maximum depth of dump. Use INT_MAX
+ * for an effectively unlimited depth.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump the name space, or a portion of it.
+ *
+ ******************************************************************************/
+
+void
+AcpiNsDumpTables (
+ ACPI_HANDLE SearchBase,
+ UINT32 MaxDepth)
+{
+ ACPI_HANDLE SearchHandle = SearchBase;
+
+
+ ACPI_FUNCTION_TRACE (NsDumpTables);
+
+
+ if (!AcpiGbl_RootNode)
+ {
+ /*
+ * If the name space has not been initialized,
+ * there is nothing to dump.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "namespace not initialized!\n"));
+ return_VOID;
+ }
+
+ if (ACPI_NS_ALL == SearchBase)
+ {
+ /* Entire namespace */
+
+ SearchHandle = AcpiGbl_RootNode;
+ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "\\\n"));
+ }
+
+ AcpiNsDumpObjects (ACPI_TYPE_ANY, ACPI_DISPLAY_OBJECTS, MaxDepth,
+ ACPI_OWNER_ID_MAX, SearchHandle);
+ return_VOID;
+}
+#endif
+#endif
+
diff --git a/sys/contrib/dev/acpica/nsdumpdv.c b/sys/contrib/dev/acpica/nsdumpdv.c
new file mode 100644
index 0000000..91c6b54
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsdumpdv.c
@@ -0,0 +1,235 @@
+/******************************************************************************
+ *
+ * Module Name: nsdump - table dumping routines for debug
+ * $Revision: 1.20 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __NSDUMPDV_C__
+
+#include <contrib/dev/acpica/acpi.h>
+
+
+/* TBD: This entire module is apparently obsolete and should be removed */
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsdumpdv")
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+
+#include <contrib/dev/acpica/acnamesp.h>
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDumpOneDevice
+ *
+ * PARAMETERS: Handle - Node to be dumped
+ * Level - Nesting level of the handle
+ * Context - Passed into WalkNamespace
+ * ReturnValue - Not used
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Dump a single Node that represents a device
+ * This procedure is a UserFunction called by AcpiNsWalkNamespace.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiNsDumpOneDevice (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_BUFFER Buffer;
+ ACPI_DEVICE_INFO *Info;
+ ACPI_STATUS Status;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_NAME (NsDumpOneDevice);
+
+
+ Status = AcpiNsDumpOneObject (ObjHandle, Level, Context, ReturnValue);
+
+ Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ Status = AcpiGetObjectInfo (ObjHandle, &Buffer);
+ if (ACPI_SUCCESS (Status))
+ {
+ Info = Buffer.Pointer;
+ for (i = 0; i < Level; i++)
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES, " "));
+ }
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_TABLES,
+ " HID: %s, ADR: %8.8X%8.8X, Status: %X\n",
+ Info->HardwareId.Value, ACPI_FORMAT_UINT64 (Info->Address),
+ Info->CurrentStatus));
+ ACPI_FREE (Info);
+ }
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDumpRootDevices
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump all objects of type "device"
+ *
+ ******************************************************************************/
+
+void
+AcpiNsDumpRootDevices (
+ void)
+{
+ ACPI_HANDLE SysBusHandle;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_NAME (NsDumpRootDevices);
+
+
+ /* Only dump the table if tracing is enabled */
+
+ if (!(ACPI_LV_TABLES & AcpiDbgLevel))
+ {
+ return;
+ }
+
+ Status = AcpiGetHandle (NULL, ACPI_NS_SYSTEM_BUS, &SysBusHandle);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES,
+ "Display of all devices in the namespace:\n"));
+
+ Status = AcpiNsWalkNamespace (ACPI_TYPE_DEVICE, SysBusHandle,
+ ACPI_UINT32_MAX, ACPI_NS_WALK_NO_UNLOCK,
+ AcpiNsDumpOneDevice, NULL, NULL);
+}
+
+#endif
+#endif
+
+
diff --git a/sys/contrib/dev/acpica/nseval.c b/sys/contrib/dev/acpica/nseval.c
new file mode 100644
index 0000000..c44af2d
--- /dev/null
+++ b/sys/contrib/dev/acpica/nseval.c
@@ -0,0 +1,316 @@
+/*******************************************************************************
+ *
+ * Module Name: nseval - Object evaluation, includes control method execution
+ * $Revision: 1.144 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __NSEVAL_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nseval")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsEvaluate
+ *
+ * PARAMETERS: Info - Evaluation info block, contains:
+ * PrefixNode - Prefix or Method/Object Node to execute
+ * Pathname - Name of method to execute, If NULL, the
+ * Node is the object to execute
+ * Parameters - List of parameters to pass to the method,
+ * terminated by NULL. Params itself may be
+ * NULL if no parameters are being passed.
+ * ReturnObject - Where to put method's return value (if
+ * any). If NULL, no value is returned.
+ * ParameterType - Type of Parameter list
+ * ReturnObject - Where to put method's return value (if
+ * any). If NULL, no value is returned.
+ * Flags - ACPI_IGNORE_RETURN_VALUE to delete return
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute a control method or return the current value of an
+ * ACPI namespace object.
+ *
+ * MUTEX: Locks interpreter
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsEvaluate (
+ ACPI_EVALUATE_INFO *Info)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (NsEvaluate);
+
+
+ if (!Info)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Initialize the return value to an invalid object */
+
+ Info->ReturnObject = NULL;
+
+ /*
+ * Get the actual namespace node for the target object. Handles these cases:
+ *
+ * 1) Null node, Pathname (absolute path)
+ * 2) Node, Pathname (path relative to Node)
+ * 3) Node, Null Pathname
+ */
+ Status = AcpiNsGetNode (Info->PrefixNode, Info->Pathname,
+ ACPI_NS_NO_UPSEARCH, &Info->ResolvedNode);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * For a method alias, we must grab the actual method node so that proper
+ * scoping context will be established before execution.
+ */
+ if (AcpiNsGetType (Info->ResolvedNode) == ACPI_TYPE_LOCAL_METHOD_ALIAS)
+ {
+ Info->ResolvedNode =
+ ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Info->ResolvedNode->Object);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "%s [%p] Value %p\n", Info->Pathname,
+ Info->ResolvedNode, AcpiNsGetAttachedObject (Info->ResolvedNode)));
+
+ /*
+ * Two major cases here:
+ *
+ * 1) The object is a control method -- execute it
+ * 2) The object is not a method -- just return it's current value
+ */
+ if (AcpiNsGetType (Info->ResolvedNode) == ACPI_TYPE_METHOD)
+ {
+ /*
+ * 1) Object is a control method - execute it
+ */
+
+ /* Verify that there is a method object associated with this node */
+
+ Info->ObjDesc = AcpiNsGetAttachedObject (Info->ResolvedNode);
+ if (!Info->ObjDesc)
+ {
+ ACPI_ERROR ((AE_INFO, "Control method has no attached sub-object"));
+ return_ACPI_STATUS (AE_NULL_OBJECT);
+ }
+
+ ACPI_DUMP_PATHNAME (Info->ResolvedNode, "Execute Method:",
+ ACPI_LV_INFO, _COMPONENT);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Method at AML address %p Length %X\n",
+ Info->ObjDesc->Method.AmlStart + 1,
+ Info->ObjDesc->Method.AmlLength - 1));
+
+ /*
+ * Any namespace deletion must acquire both the namespace and
+ * interpreter locks to ensure that no thread is using the portion of
+ * the namespace that is being deleted.
+ *
+ * Execute the method via the interpreter. The interpreter is locked
+ * here before calling into the AML parser
+ */
+ AcpiExEnterInterpreter ();
+ Status = AcpiPsExecuteMethod (Info);
+ AcpiExExitInterpreter ();
+ }
+ else
+ {
+ /*
+ * 2) Object is not a method, return its current value
+ */
+
+ /*
+ * Objects require additional resolution steps (e.g., the Node may be
+ * a field that must be read, etc.) -- we can't just grab the object
+ * out of the node.
+ *
+ * Use ResolveNodeToValue() to get the associated value.
+ *
+ * NOTE: we can get away with passing in NULL for a walk state because
+ * ResolvedNode is guaranteed to not be a reference to either a method
+ * local or a method argument (because this interface is never called
+ * from a running method.)
+ *
+ * Even though we do not directly invoke the interpreter for object
+ * resolution, we must lock it because we could access an opregion.
+ * The opregion access code assumes that the interpreter is locked.
+ */
+ AcpiExEnterInterpreter ();
+
+ /* Function has a strange interface */
+
+ Status = AcpiExResolveNodeToValue (&Info->ResolvedNode, NULL);
+ AcpiExExitInterpreter ();
+
+ /*
+ * If AcpiExResolveNodeToValue() succeeded, the return value was placed
+ * in ResolvedNode.
+ */
+ if (ACPI_SUCCESS (Status))
+ {
+ Status = AE_CTRL_RETURN_VALUE;
+ Info->ReturnObject =
+ ACPI_CAST_PTR (ACPI_OPERAND_OBJECT, Info->ResolvedNode);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Returning object %p [%s]\n",
+ Info->ReturnObject,
+ AcpiUtGetObjectTypeName (Info->ReturnObject)));
+ }
+ }
+
+ /*
+ * Check if there is a return value that must be dealt with
+ */
+ if (Status == AE_CTRL_RETURN_VALUE)
+ {
+ /* If caller does not want the return value, delete it */
+
+ if (Info->Flags & ACPI_IGNORE_RETURN_VALUE)
+ {
+ AcpiUtRemoveReference (Info->ReturnObject);
+ Info->ReturnObject = NULL;
+ }
+
+ /* Map AE_CTRL_RETURN_VALUE to AE_OK, we are done with it */
+
+ Status = AE_OK;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "*** Completed evaluation of object %s ***\n", Info->Pathname));
+
+ /*
+ * Namespace was unlocked by the handling AcpiNs* function, so we
+ * just return
+ */
+ return_ACPI_STATUS (Status);
+}
+
diff --git a/sys/contrib/dev/acpica/nsinit.c b/sys/contrib/dev/acpica/nsinit.c
new file mode 100644
index 0000000..e06ccf7
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsinit.c
@@ -0,0 +1,701 @@
+/******************************************************************************
+ *
+ * Module Name: nsinit - namespace initialization
+ * $Revision: 1.86 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __NSXFINIT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsinit")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiNsInitOneObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue);
+
+static ACPI_STATUS
+AcpiNsInitOneDevice (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue);
+
+static ACPI_STATUS
+AcpiNsFindIniMethods (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsInitializeObjects
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Walk the entire namespace and perform any necessary
+ * initialization on the objects found therein
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsInitializeObjects (
+ void)
+{
+ ACPI_STATUS Status;
+ ACPI_INIT_WALK_INFO Info;
+
+
+ ACPI_FUNCTION_TRACE (NsInitializeObjects);
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "**** Starting initialization of namespace objects ****\n"));
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
+ "Completing Region/Field/Buffer/Package initialization:"));
+
+ /* Set all init info to zero */
+
+ ACPI_MEMSET (&Info, 0, sizeof (ACPI_INIT_WALK_INFO));
+
+ /* Walk entire namespace from the supplied root */
+
+ Status = AcpiWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX, AcpiNsInitOneObject,
+ &Info, NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "During WalkNamespace"));
+ }
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
+ "\nInitialized %hd/%hd Regions %hd/%hd Fields %hd/%hd Buffers %hd/%hd Packages (%hd nodes)\n",
+ Info.OpRegionInit, Info.OpRegionCount,
+ Info.FieldInit, Info.FieldCount,
+ Info.BufferInit, Info.BufferCount,
+ Info.PackageInit, Info.PackageCount, Info.ObjectCount));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "%hd Control Methods found\n", Info.MethodCount));
+ ACPI_DEBUG_PRINT ((ACPI_DB_DISPATCH,
+ "%hd Op Regions found\n", Info.OpRegionCount));
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsInitializeDevices
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: ACPI_STATUS
+ *
+ * DESCRIPTION: Walk the entire namespace and initialize all ACPI devices.
+ * This means running _INI on all present devices.
+ *
+ * Note: We install PCI config space handler on region access,
+ * not here.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsInitializeDevices (
+ void)
+{
+ ACPI_STATUS Status;
+ ACPI_DEVICE_WALK_INFO Info;
+
+
+ ACPI_FUNCTION_TRACE (NsInitializeDevices);
+
+
+ /* Init counters */
+
+ Info.DeviceCount = 0;
+ Info.Num_STA = 0;
+ Info.Num_INI = 0;
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
+ "Initializing Device/Processor/Thermal objects by executing _INI methods:"));
+
+ /* Tree analysis: find all subtrees that contain _INI methods */
+
+ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX, FALSE, AcpiNsFindIniMethods, &Info, NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+
+ /* Allocate the evaluation information block */
+
+ Info.EvaluateInfo = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
+ if (!Info.EvaluateInfo)
+ {
+ Status = AE_NO_MEMORY;
+ goto ErrorExit;
+ }
+
+ /* Walk namespace to execute all _INIs on present devices */
+
+ Status = AcpiNsWalkNamespace (ACPI_TYPE_ANY, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX, FALSE, AcpiNsInitOneDevice, &Info, NULL);
+
+ ACPI_FREE (Info.EvaluateInfo);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
+ "\nExecuted %hd _INI methods requiring %hd _STA executions (examined %hd objects)\n",
+ Info.Num_INI, Info.Num_STA, Info.DeviceCount));
+
+ return_ACPI_STATUS (Status);
+
+
+ErrorExit:
+ ACPI_EXCEPTION ((AE_INFO, Status, "During device initialization"));
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsInitOneObject
+ *
+ * PARAMETERS: ObjHandle - Node
+ * Level - Current nesting level
+ * Context - Points to a init info struct
+ * ReturnValue - Not used
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Callback from AcpiWalkNamespace. Invoked for every object
+ * within the namespace.
+ *
+ * Currently, the only objects that require initialization are:
+ * 1) Methods
+ * 2) Op Regions
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiNsInitOneObject (
+ ACPI_HANDLE ObjHandle,
+ UINT32 Level,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_OBJECT_TYPE Type;
+ ACPI_STATUS Status = AE_OK;
+ ACPI_INIT_WALK_INFO *Info = (ACPI_INIT_WALK_INFO *) Context;
+ ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) ObjHandle;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ACPI_FUNCTION_NAME (NsInitOneObject);
+
+
+ Info->ObjectCount++;
+
+ /* And even then, we are only interested in a few object types */
+
+ Type = AcpiNsGetType (ObjHandle);
+ ObjDesc = AcpiNsGetAttachedObject (Node);
+ if (!ObjDesc)
+ {
+ return (AE_OK);
+ }
+
+ /* Increment counters for object types we are looking for */
+
+ switch (Type)
+ {
+ case ACPI_TYPE_REGION:
+ Info->OpRegionCount++;
+ break;
+
+ case ACPI_TYPE_BUFFER_FIELD:
+ Info->FieldCount++;
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ Info->BufferCount++;
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+ Info->PackageCount++;
+ break;
+
+ default:
+
+ /* No init required, just exit now */
+ return (AE_OK);
+ }
+
+ /*
+ * If the object is already initialized, nothing else to do
+ */
+ if (ObjDesc->Common.Flags & AOPOBJ_DATA_VALID)
+ {
+ return (AE_OK);
+ }
+
+ /*
+ * Must lock the interpreter before executing AML code
+ */
+ AcpiExEnterInterpreter ();
+
+ /*
+ * Each of these types can contain executable AML code within the
+ * declaration.
+ */
+ switch (Type)
+ {
+ case ACPI_TYPE_REGION:
+
+ Info->OpRegionInit++;
+ Status = AcpiDsGetRegionArguments (ObjDesc);
+ break;
+
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ Info->FieldInit++;
+ Status = AcpiDsGetBufferFieldArguments (ObjDesc);
+ break;
+
+ case ACPI_TYPE_BUFFER:
+
+ Info->BufferInit++;
+ Status = AcpiDsGetBufferArguments (ObjDesc);
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+
+ Info->PackageInit++;
+ Status = AcpiDsGetPackageArguments (ObjDesc);
+ break;
+
+ default:
+ /* No other types can get here */
+ break;
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not execute arguments for [%4.4s] (%s)",
+ AcpiUtGetNodeName (Node), AcpiUtGetTypeName (Type)));
+ }
+
+ /*
+ * Print a dot for each object unless we are going to print the entire
+ * pathname
+ */
+ if (!(AcpiDbgLevel & ACPI_LV_INIT_NAMES))
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
+ }
+
+ /*
+ * We ignore errors from above, and always return OK, since we don't want
+ * to abort the walk on any single error.
+ */
+ AcpiExExitInterpreter ();
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsFindIniMethods
+ *
+ * PARAMETERS: ACPI_WALK_CALLBACK
+ *
+ * RETURN: ACPI_STATUS
+ *
+ * DESCRIPTION: Called during namespace walk. Finds objects named _INI under
+ * device/processor/thermal objects, and marks the entire subtree
+ * with a SUBTREE_HAS_INI flag. This flag is used during the
+ * subsequent device initialization walk to avoid entire subtrees
+ * that do not contain an _INI.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiNsFindIniMethods (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_DEVICE_WALK_INFO *Info = ACPI_CAST_PTR (ACPI_DEVICE_WALK_INFO, Context);
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_NAMESPACE_NODE *ParentNode;
+
+
+ /* Keep count of device/processor/thermal objects */
+
+ Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
+ if ((Node->Type == ACPI_TYPE_DEVICE) ||
+ (Node->Type == ACPI_TYPE_PROCESSOR) ||
+ (Node->Type == ACPI_TYPE_THERMAL))
+ {
+ Info->DeviceCount++;
+ return (AE_OK);
+ }
+
+ /* We are only looking for methods named _INI */
+
+ if (!ACPI_COMPARE_NAME (Node->Name.Ascii, METHOD_NAME__INI))
+ {
+ return (AE_OK);
+ }
+
+ /*
+ * The only _INI methods that we care about are those that are
+ * present under Device, Processor, and Thermal objects.
+ */
+ ParentNode = AcpiNsGetParentNode (Node);
+ switch (ParentNode->Type)
+ {
+ case ACPI_TYPE_DEVICE:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_THERMAL:
+
+ /* Mark parent and bubble up the INI present flag to the root */
+
+ while (ParentNode)
+ {
+ ParentNode->Flags |= ANOBJ_SUBTREE_HAS_INI;
+ ParentNode = AcpiNsGetParentNode (ParentNode);
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsInitOneDevice
+ *
+ * PARAMETERS: ACPI_WALK_CALLBACK
+ *
+ * RETURN: ACPI_STATUS
+ *
+ * DESCRIPTION: This is called once per device soon after ACPI is enabled
+ * to initialize each device. It determines if the device is
+ * present, and if so, calls _INI.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiNsInitOneDevice (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_DEVICE_WALK_INFO *WalkInfo = ACPI_CAST_PTR (ACPI_DEVICE_WALK_INFO, Context);
+ ACPI_EVALUATE_INFO *Info = WalkInfo->EvaluateInfo;
+ UINT32 Flags;
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *DeviceNode;
+
+
+ ACPI_FUNCTION_TRACE (NsInitOneDevice);
+
+
+ /* We are interested in Devices, Processors and ThermalZones only */
+
+ DeviceNode = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, ObjHandle);
+ if ((DeviceNode->Type != ACPI_TYPE_DEVICE) &&
+ (DeviceNode->Type != ACPI_TYPE_PROCESSOR) &&
+ (DeviceNode->Type != ACPI_TYPE_THERMAL))
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Because of an earlier namespace analysis, all subtrees that contain an
+ * _INI method are tagged.
+ *
+ * If this device subtree does not contain any _INI methods, we
+ * can exit now and stop traversing this entire subtree.
+ */
+ if (!(DeviceNode->Flags & ANOBJ_SUBTREE_HAS_INI))
+ {
+ return_ACPI_STATUS (AE_CTRL_DEPTH);
+ }
+
+ /*
+ * Run _STA to determine if this device is present and functioning. We
+ * must know this information for two important reasons (from ACPI spec):
+ *
+ * 1) We can only run _INI if the device is present.
+ * 2) We must abort the device tree walk on this subtree if the device is
+ * not present and is not functional (we will not examine the children)
+ *
+ * The _STA method is not required to be present under the device, we
+ * assume the device is present if _STA does not exist.
+ */
+ ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (
+ ACPI_TYPE_METHOD, DeviceNode, METHOD_NAME__STA));
+
+ Status = AcpiUtExecute_STA (DeviceNode, &Flags);
+ if (ACPI_FAILURE (Status))
+ {
+ /* Ignore error and move on to next device */
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Flags == -1 means that _STA was not found. In this case, we assume that
+ * the device is both present and functional.
+ *
+ * From the ACPI spec, description of _STA:
+ *
+ * "If a device object (including the processor object) does not have an
+ * _STA object, then OSPM assumes that all of the above bits are set (in
+ * other words, the device is present, ..., and functioning)"
+ */
+ if (Flags != ACPI_UINT32_MAX)
+ {
+ WalkInfo->Num_STA++;
+ }
+
+ /*
+ * Examine the PRESENT and FUNCTIONING status bits
+ *
+ * Note: ACPI spec does not seem to specify behavior for the present but
+ * not functioning case, so we assume functioning if present.
+ */
+ if (!(Flags & ACPI_STA_DEVICE_PRESENT))
+ {
+ /* Device is not present, we must examine the Functioning bit */
+
+ if (Flags & ACPI_STA_DEVICE_FUNCTIONING)
+ {
+ /*
+ * Device is not present but is "functioning". In this case,
+ * we will not run _INI, but we continue to examine the children
+ * of this device.
+ *
+ * From the ACPI spec, description of _STA: (Note - no mention
+ * of whether to run _INI or not on the device in question)
+ *
+ * "_STA may return bit 0 clear (not present) with bit 3 set
+ * (device is functional). This case is used to indicate a valid
+ * device for which no device driver should be loaded (for example,
+ * a bridge device.) Children of this device may be present and
+ * valid. OSPM should continue enumeration below a device whose
+ * _STA returns this bit combination"
+ */
+ return_ACPI_STATUS (AE_OK);
+ }
+ else
+ {
+ /*
+ * Device is not present and is not functioning. We must abort the
+ * walk of this subtree immediately -- don't look at the children
+ * of such a device.
+ *
+ * From the ACPI spec, description of _INI:
+ *
+ * "If the _STA method indicates that the device is not present,
+ * OSPM will not run the _INI and will not examine the children
+ * of the device for _INI methods"
+ */
+ return_ACPI_STATUS (AE_CTRL_DEPTH);
+ }
+ }
+
+ /*
+ * The device is present or is assumed present if no _STA exists.
+ * Run the _INI if it exists (not required to exist)
+ *
+ * Note: We know there is an _INI within this subtree, but it may not be
+ * under this particular device, it may be lower in the branch.
+ */
+ ACPI_DEBUG_EXEC (AcpiUtDisplayInitPathname (
+ ACPI_TYPE_METHOD, DeviceNode, METHOD_NAME__INI));
+
+ Info->PrefixNode = DeviceNode;
+ Info->Pathname = METHOD_NAME__INI;
+ Info->Parameters = NULL;
+ Info->ParameterType = ACPI_PARAM_ARGS;
+ Info->Flags = ACPI_IGNORE_RETURN_VALUE;
+
+ Status = AcpiNsEvaluate (Info);
+ if (ACPI_SUCCESS (Status))
+ {
+ WalkInfo->Num_INI++;
+
+ if ((AcpiDbgLevel <= ACPI_LV_ALL_EXCEPTIONS) &&
+ (!(AcpiDbgLevel & ACPI_LV_INFO)))
+ {
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT, "."));
+ }
+ }
+
+#ifdef ACPI_DEBUG_OUTPUT
+ else if (Status != AE_NOT_FOUND)
+ {
+ /* Ignore error and move on to next device */
+
+ char *ScopeName = AcpiNsGetExternalPathname (Info->ResolvedNode);
+
+ ACPI_EXCEPTION ((AE_INFO, Status, "during %s._INI execution",
+ ScopeName));
+ ACPI_FREE (ScopeName);
+ }
+#endif
+
+ /* Ignore errors from above */
+
+ Status = AE_OK;
+
+ /*
+ * The _INI method has been run if present; call the Global Initialization
+ * Handler for this device.
+ */
+ if (AcpiGbl_InitHandler)
+ {
+ Status = AcpiGbl_InitHandler (DeviceNode, ACPI_INIT_DEVICE_INI);
+ }
+
+ return_ACPI_STATUS (Status);
+}
diff --git a/sys/contrib/dev/acpica/nsload.c b/sys/contrib/dev/acpica/nsload.c
new file mode 100644
index 0000000..07dd567
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsload.c
@@ -0,0 +1,429 @@
+/******************************************************************************
+ *
+ * Module Name: nsload - namespace loading/expanding/contracting procedures
+ * $Revision: 1.80 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __NSLOAD_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/actables.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsload")
+
+/* Local prototypes */
+
+#ifdef ACPI_FUTURE_IMPLEMENTATION
+ACPI_STATUS
+AcpiNsUnloadNamespace (
+ ACPI_HANDLE Handle);
+
+static ACPI_STATUS
+AcpiNsDeleteSubtree (
+ ACPI_HANDLE StartHandle);
+#endif
+
+
+#ifndef ACPI_NO_METHOD_EXECUTION
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsLoadTable
+ *
+ * PARAMETERS: TableIndex - Index for table to be loaded
+ * Node - Owning NS node
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Load one ACPI table into the namespace
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsLoadTable (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_NAMESPACE_NODE *Node)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (NsLoadTable);
+
+
+ /*
+ * Parse the table and load the namespace with all named
+ * objects found within. Control methods are NOT parsed
+ * at this time. In fact, the control methods cannot be
+ * parsed until the entire namespace is loaded, because
+ * if a control method makes a forward reference (call)
+ * to another control method, we can't continue parsing
+ * because we don't know how many arguments to parse next!
+ */
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* If table already loaded into namespace, just return */
+
+ if (AcpiTbIsTableLoaded (TableIndex))
+ {
+ Status = AE_ALREADY_EXISTS;
+ goto Unlock;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "**** Loading table into namespace ****\n"));
+
+ Status = AcpiTbAllocateOwnerId (TableIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Unlock;
+ }
+
+ Status = AcpiNsParseTable (TableIndex, Node->Child);
+ if (ACPI_SUCCESS (Status))
+ {
+ AcpiTbSetTableLoadedFlag (TableIndex, TRUE);
+ }
+ else
+ {
+ AcpiTbReleaseOwnerId (TableIndex);
+ }
+
+Unlock:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Now we can parse the control methods. We always parse
+ * them here for a sanity check, and if configured for
+ * just-in-time parsing, we delete the control method
+ * parse trees.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "**** Begin Table Method Parsing and Object Initialization ****\n"));
+
+ Status = AcpiDsInitializeObjects (TableIndex, Node);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "**** Completed Table Method Parsing and Object Initialization ****\n"));
+
+ return_ACPI_STATUS (Status);
+}
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiLoadNamespace
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Load the name space from what ever is pointed to by DSDT.
+ * (DSDT points to either the BIOS or a buffer.)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsLoadNamespace (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiLoadNameSpace);
+
+
+ /* There must be at least a DSDT installed */
+
+ if (AcpiGbl_DSDT == NULL)
+ {
+ ACPI_ERROR ((AE_INFO, "DSDT is not in memory"));
+ return_ACPI_STATUS (AE_NO_ACPI_TABLES);
+ }
+
+ /*
+ * Load the namespace. The DSDT is required,
+ * but the SSDT and PSDT tables are optional.
+ */
+ Status = AcpiNsLoadTableByType (ACPI_TABLE_ID_DSDT);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Ignore exceptions from these */
+
+ (void) AcpiNsLoadTableByType (ACPI_TABLE_ID_SSDT);
+ (void) AcpiNsLoadTableByType (ACPI_TABLE_ID_PSDT);
+
+ ACPI_DEBUG_PRINT_RAW ((ACPI_DB_INIT,
+ "ACPI Namespace successfully loaded at root %p\n",
+ AcpiGbl_RootNode));
+
+ return_ACPI_STATUS (Status);
+}
+#endif
+
+#ifdef ACPI_FUTURE_IMPLEMENTATION
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDeleteSubtree
+ *
+ * PARAMETERS: StartHandle - Handle in namespace where search begins
+ *
+ * RETURNS Status
+ *
+ * DESCRIPTION: Walks the namespace starting at the given handle and deletes
+ * all objects, entries, and scopes in the entire subtree.
+ *
+ * Namespace/Interpreter should be locked or the subsystem should
+ * be in shutdown before this routine is called.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiNsDeleteSubtree (
+ ACPI_HANDLE StartHandle)
+{
+ ACPI_STATUS Status;
+ ACPI_HANDLE ChildHandle;
+ ACPI_HANDLE ParentHandle;
+ ACPI_HANDLE NextChildHandle;
+ ACPI_HANDLE Dummy;
+ UINT32 Level;
+
+
+ ACPI_FUNCTION_TRACE (NsDeleteSubtree);
+
+
+ ParentHandle = StartHandle;
+ ChildHandle = NULL;
+ Level = 1;
+
+ /*
+ * Traverse the tree of objects until we bubble back up
+ * to where we started.
+ */
+ while (Level > 0)
+ {
+ /* Attempt to get the next object in this scope */
+
+ Status = AcpiGetNextObject (ACPI_TYPE_ANY, ParentHandle,
+ ChildHandle, &NextChildHandle);
+
+ ChildHandle = NextChildHandle;
+
+ /* Did we get a new object? */
+
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Check if this object has any children */
+
+ if (ACPI_SUCCESS (AcpiGetNextObject (ACPI_TYPE_ANY, ChildHandle,
+ NULL, &Dummy)))
+ {
+ /*
+ * There is at least one child of this object,
+ * visit the object
+ */
+ Level++;
+ ParentHandle = ChildHandle;
+ ChildHandle = NULL;
+ }
+ }
+ else
+ {
+ /*
+ * No more children in this object, go back up to
+ * the object's parent
+ */
+ Level--;
+
+ /* Delete all children now */
+
+ AcpiNsDeleteChildren (ChildHandle);
+
+ ChildHandle = ParentHandle;
+ Status = AcpiGetParent (ParentHandle, &ParentHandle);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ }
+
+ /* Now delete the starting object, and we are done */
+
+ AcpiNsDeleteNode (ChildHandle);
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsUnloadNameSpace
+ *
+ * PARAMETERS: Handle - Root of namespace subtree to be deleted
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Shrinks the namespace, typically in response to an undocking
+ * event. Deletes an entire subtree starting from (and
+ * including) the given handle.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsUnloadNamespace (
+ ACPI_HANDLE Handle)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (NsUnloadNameSpace);
+
+
+ /* Parameter validation */
+
+ if (!AcpiGbl_RootNode)
+ {
+ return_ACPI_STATUS (AE_NO_NAMESPACE);
+ }
+
+ if (!Handle)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* This function does the real work */
+
+ Status = AcpiNsDeleteSubtree (Handle);
+
+ return_ACPI_STATUS (Status);
+}
+#endif
+#endif
+
diff --git a/sys/contrib/dev/acpica/nsnames.c b/sys/contrib/dev/acpica/nsnames.c
new file mode 100644
index 0000000..8ff7aaf
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsnames.c
@@ -0,0 +1,347 @@
+/*******************************************************************************
+ *
+ * Module Name: nsnames - Name manipulation and search
+ * $Revision: 1.98 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __NSNAMES_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsnames")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsBuildExternalPath
+ *
+ * PARAMETERS: Node - NS node whose pathname is needed
+ * Size - Size of the pathname
+ * *NameBuffer - Where to return the pathname
+ *
+ * RETURN: Places the pathname into the NameBuffer, in external format
+ * (name segments separated by path separators)
+ *
+ * DESCRIPTION: Generate a full pathaname
+ *
+ ******************************************************************************/
+
+void
+AcpiNsBuildExternalPath (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_SIZE Size,
+ char *NameBuffer)
+{
+ ACPI_SIZE Index;
+ ACPI_NAMESPACE_NODE *ParentNode;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Special case for root */
+
+ Index = Size - 1;
+ if (Index < ACPI_NAME_SIZE)
+ {
+ NameBuffer[0] = AML_ROOT_PREFIX;
+ NameBuffer[1] = 0;
+ return;
+ }
+
+ /* Store terminator byte, then build name backwards */
+
+ ParentNode = Node;
+ NameBuffer[Index] = 0;
+
+ while ((Index > ACPI_NAME_SIZE) && (ParentNode != AcpiGbl_RootNode))
+ {
+ Index -= ACPI_NAME_SIZE;
+
+ /* Put the name into the buffer */
+
+ ACPI_MOVE_32_TO_32 ((NameBuffer + Index), &ParentNode->Name);
+ ParentNode = AcpiNsGetParentNode (ParentNode);
+
+ /* Prefix name with the path separator */
+
+ Index--;
+ NameBuffer[Index] = ACPI_PATH_SEPARATOR;
+ }
+
+ /* Overwrite final separator with the root prefix character */
+
+ NameBuffer[Index] = AML_ROOT_PREFIX;
+
+ if (Index != 0)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not construct pathname; index=%X, size=%X, Path=%s",
+ (UINT32) Index, (UINT32) Size, &NameBuffer[Size]));
+ }
+
+ return;
+}
+
+
+#ifdef ACPI_DEBUG_OUTPUT
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetExternalPathname
+ *
+ * PARAMETERS: Node - Namespace node whose pathname is needed
+ *
+ * RETURN: Pointer to storage containing the fully qualified name of
+ * the node, In external format (name segments separated by path
+ * separators.)
+ *
+ * DESCRIPTION: Used for debug printing in AcpiNsSearchTable().
+ *
+ ******************************************************************************/
+
+char *
+AcpiNsGetExternalPathname (
+ ACPI_NAMESPACE_NODE *Node)
+{
+ char *NameBuffer;
+ ACPI_SIZE Size;
+
+
+ ACPI_FUNCTION_TRACE_PTR (NsGetExternalPathname, Node);
+
+
+ /* Calculate required buffer size based on depth below root */
+
+ Size = AcpiNsGetPathnameLength (Node);
+
+ /* Allocate a buffer to be returned to caller */
+
+ NameBuffer = ACPI_ALLOCATE_ZEROED (Size);
+ if (!NameBuffer)
+ {
+ ACPI_ERROR ((AE_INFO, "Allocation failure"));
+ return_PTR (NULL);
+ }
+
+ /* Build the path in the allocated buffer */
+
+ AcpiNsBuildExternalPath (Node, Size, NameBuffer);
+ return_PTR (NameBuffer);
+}
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetPathnameLength
+ *
+ * PARAMETERS: Node - Namespace node
+ *
+ * RETURN: Length of path, including prefix
+ *
+ * DESCRIPTION: Get the length of the pathname string for this node
+ *
+ ******************************************************************************/
+
+ACPI_SIZE
+AcpiNsGetPathnameLength (
+ ACPI_NAMESPACE_NODE *Node)
+{
+ ACPI_SIZE Size;
+ ACPI_NAMESPACE_NODE *NextNode;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * Compute length of pathname as 5 * number of name segments.
+ * Go back up the parent tree to the root
+ */
+ Size = 0;
+ NextNode = Node;
+
+ while (NextNode && (NextNode != AcpiGbl_RootNode))
+ {
+ Size += ACPI_PATH_SEGMENT_LENGTH;
+ NextNode = AcpiNsGetParentNode (NextNode);
+ }
+
+ if (!Size)
+ {
+ Size = 1; /* Root node case */
+ }
+
+ return (Size + 1); /* +1 for null string terminator */
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsHandleToPathname
+ *
+ * PARAMETERS: TargetHandle - Handle of named object whose name is
+ * to be found
+ * Buffer - Where the pathname is returned
+ *
+ * RETURN: Status, Buffer is filled with pathname if status is AE_OK
+ *
+ * DESCRIPTION: Build and return a full namespace pathname
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsHandleToPathname (
+ ACPI_HANDLE TargetHandle,
+ ACPI_BUFFER *Buffer)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_SIZE RequiredSize;
+
+
+ ACPI_FUNCTION_TRACE_PTR (NsHandleToPathname, TargetHandle);
+
+
+ Node = AcpiNsMapHandleToNode (TargetHandle);
+ if (!Node)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Determine size required for the caller buffer */
+
+ RequiredSize = AcpiNsGetPathnameLength (Node);
+
+ /* Validate/Allocate/Clear caller buffer */
+
+ Status = AcpiUtInitializeBuffer (Buffer, RequiredSize);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Build the path in the caller buffer */
+
+ AcpiNsBuildExternalPath (Node, RequiredSize, Buffer->Pointer);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "%s [%X]\n",
+ (char *) Buffer->Pointer, (UINT32) RequiredSize));
+ return_ACPI_STATUS (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/nsobject.c b/sys/contrib/dev/acpica/nsobject.c
new file mode 100644
index 0000000..622638c
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsobject.c
@@ -0,0 +1,567 @@
+/*******************************************************************************
+ *
+ * Module Name: nsobject - Utilities for objects attached to namespace
+ * table entries
+ * $Revision: 1.98 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __NSOBJECT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsobject")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsAttachObject
+ *
+ * PARAMETERS: Node - Parent Node
+ * Object - Object to be attached
+ * Type - Type of object, or ACPI_TYPE_ANY if not
+ * known
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Record the given object as the value associated with the
+ * name whose ACPI_HANDLE is passed. If Object is NULL
+ * and Type is ACPI_TYPE_ANY, set the name as having no value.
+ * Note: Future may require that the Node->Flags field be passed
+ * as a parameter.
+ *
+ * MUTEX: Assumes namespace is locked
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsAttachObject (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OPERAND_OBJECT *Object,
+ ACPI_OBJECT_TYPE Type)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *LastObjDesc;
+ ACPI_OBJECT_TYPE ObjectType = ACPI_TYPE_ANY;
+
+
+ ACPI_FUNCTION_TRACE (NsAttachObject);
+
+
+ /*
+ * Parameter validation
+ */
+ if (!Node)
+ {
+ /* Invalid handle */
+
+ ACPI_ERROR ((AE_INFO, "Null NamedObj handle"));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if (!Object && (ACPI_TYPE_ANY != Type))
+ {
+ /* Null object */
+
+ ACPI_ERROR ((AE_INFO,
+ "Null object, but type not ACPI_TYPE_ANY"));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
+ {
+ /* Not a name handle */
+
+ ACPI_ERROR ((AE_INFO, "Invalid handle %p [%s]",
+ Node, AcpiUtGetDescriptorName (Node)));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Check if this object is already attached */
+
+ if (Node->Object == Object)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Obj %p already installed in NameObj %p\n",
+ Object, Node));
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* If null object, we will just install it */
+
+ if (!Object)
+ {
+ ObjDesc = NULL;
+ ObjectType = ACPI_TYPE_ANY;
+ }
+
+ /*
+ * If the source object is a namespace Node with an attached object,
+ * we will use that (attached) object
+ */
+ else if ((ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED) &&
+ ((ACPI_NAMESPACE_NODE *) Object)->Object)
+ {
+ /*
+ * Value passed is a name handle and that name has a
+ * non-null value. Use that name's value and type.
+ */
+ ObjDesc = ((ACPI_NAMESPACE_NODE *) Object)->Object;
+ ObjectType = ((ACPI_NAMESPACE_NODE *) Object)->Type;
+ }
+
+ /*
+ * Otherwise, we will use the parameter object, but we must type
+ * it first
+ */
+ else
+ {
+ ObjDesc = (ACPI_OPERAND_OBJECT *) Object;
+
+ /* Use the given type */
+
+ ObjectType = Type;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Installing %p into Node %p [%4.4s]\n",
+ ObjDesc, Node, AcpiUtGetNodeName (Node)));
+
+ /* Detach an existing attached object if present */
+
+ if (Node->Object)
+ {
+ AcpiNsDetachObject (Node);
+ }
+
+ if (ObjDesc)
+ {
+ /*
+ * Must increment the new value's reference count
+ * (if it is an internal object)
+ */
+ AcpiUtAddReference (ObjDesc);
+
+ /*
+ * Handle objects with multiple descriptors - walk
+ * to the end of the descriptor list
+ */
+ LastObjDesc = ObjDesc;
+ while (LastObjDesc->Common.NextObject)
+ {
+ LastObjDesc = LastObjDesc->Common.NextObject;
+ }
+
+ /* Install the object at the front of the object list */
+
+ LastObjDesc->Common.NextObject = Node->Object;
+ }
+
+ Node->Type = (UINT8) ObjectType;
+ Node->Object = ObjDesc;
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDetachObject
+ *
+ * PARAMETERS: Node - A Namespace node whose object will be detached
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Detach/delete an object associated with a namespace node.
+ * if the object is an allocated object, it is freed.
+ * Otherwise, the field is simply cleared.
+ *
+ ******************************************************************************/
+
+void
+AcpiNsDetachObject (
+ ACPI_NAMESPACE_NODE *Node)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ACPI_FUNCTION_TRACE (NsDetachObject);
+
+
+ ObjDesc = Node->Object;
+
+ if (!ObjDesc ||
+ (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA))
+ {
+ return_VOID;
+ }
+
+ /* Clear the entry in all cases */
+
+ Node->Object = NULL;
+ if (ACPI_GET_DESCRIPTOR_TYPE (ObjDesc) == ACPI_DESC_TYPE_OPERAND)
+ {
+ Node->Object = ObjDesc->Common.NextObject;
+ if (Node->Object &&
+ (ACPI_GET_OBJECT_TYPE (Node->Object) != ACPI_TYPE_LOCAL_DATA))
+ {
+ Node->Object = Node->Object->Common.NextObject;
+ }
+ }
+
+ /* Reset the node type to untyped */
+
+ Node->Type = ACPI_TYPE_ANY;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "Node %p [%4.4s] Object %p\n",
+ Node, AcpiUtGetNodeName (Node), ObjDesc));
+
+ /* Remove one reference on the object (and all subobjects) */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetAttachedObject
+ *
+ * PARAMETERS: Node - Namespace node
+ *
+ * RETURN: Current value of the object field from the Node whose
+ * handle is passed
+ *
+ * DESCRIPTION: Obtain the object attached to a namespace node.
+ *
+ ******************************************************************************/
+
+ACPI_OPERAND_OBJECT *
+AcpiNsGetAttachedObject (
+ ACPI_NAMESPACE_NODE *Node)
+{
+ ACPI_FUNCTION_TRACE_PTR (NsGetAttachedObject, Node);
+
+
+ if (!Node)
+ {
+ ACPI_WARNING ((AE_INFO, "Null Node ptr"));
+ return_PTR (NULL);
+ }
+
+ 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) == ACPI_TYPE_LOCAL_DATA))
+ {
+ return_PTR (NULL);
+ }
+
+ return_PTR (Node->Object);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetSecondaryObject
+ *
+ * PARAMETERS: Node - Namespace node
+ *
+ * RETURN: Current value of the object field from the Node whose
+ * handle is passed.
+ *
+ * DESCRIPTION: Obtain a secondary object associated with a namespace node.
+ *
+ ******************************************************************************/
+
+ACPI_OPERAND_OBJECT *
+AcpiNsGetSecondaryObject (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+ ACPI_FUNCTION_TRACE_PTR (NsGetSecondaryObject, ObjDesc);
+
+
+ if ((!ObjDesc) ||
+ (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) ||
+ (!ObjDesc->Common.NextObject) ||
+ (ACPI_GET_OBJECT_TYPE (ObjDesc->Common.NextObject) == ACPI_TYPE_LOCAL_DATA))
+ {
+ return_PTR (NULL);
+ }
+
+ return_PTR (ObjDesc->Common.NextObject);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsAttachData
+ *
+ * PARAMETERS: Node - Namespace node
+ * Handler - Handler to be associated with the data
+ * Data - Data to be attached
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Low-level attach data. Create and attach a Data object.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsAttachData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_HANDLER Handler,
+ void *Data)
+{
+ ACPI_OPERAND_OBJECT *PrevObjDesc;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *DataDesc;
+
+
+ /* We only allow one attachment per handler */
+
+ PrevObjDesc = NULL;
+ ObjDesc = Node->Object;
+ while (ObjDesc)
+ {
+ if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) &&
+ (ObjDesc->Data.Handler == Handler))
+ {
+ return (AE_ALREADY_EXISTS);
+ }
+
+ PrevObjDesc = ObjDesc;
+ ObjDesc = ObjDesc->Common.NextObject;
+ }
+
+ /* Create an internal object for the data */
+
+ DataDesc = AcpiUtCreateInternalObject (ACPI_TYPE_LOCAL_DATA);
+ if (!DataDesc)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ DataDesc->Data.Handler = Handler;
+ DataDesc->Data.Pointer = Data;
+
+ /* Install the data object */
+
+ if (PrevObjDesc)
+ {
+ PrevObjDesc->Common.NextObject = DataDesc;
+ }
+ else
+ {
+ Node->Object = DataDesc;
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsDetachData
+ *
+ * PARAMETERS: Node - Namespace node
+ * Handler - Handler associated with the data
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Low-level detach data. Delete the data node, but the caller
+ * is responsible for the actual data.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsDetachData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_HANDLER Handler)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_OPERAND_OBJECT *PrevObjDesc;
+
+
+ PrevObjDesc = NULL;
+ ObjDesc = Node->Object;
+ while (ObjDesc)
+ {
+ if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) &&
+ (ObjDesc->Data.Handler == Handler))
+ {
+ if (PrevObjDesc)
+ {
+ PrevObjDesc->Common.NextObject = ObjDesc->Common.NextObject;
+ }
+ else
+ {
+ Node->Object = ObjDesc->Common.NextObject;
+ }
+
+ AcpiUtRemoveReference (ObjDesc);
+ return (AE_OK);
+ }
+
+ PrevObjDesc = ObjDesc;
+ ObjDesc = ObjDesc->Common.NextObject;
+ }
+
+ return (AE_NOT_FOUND);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetAttachedData
+ *
+ * PARAMETERS: Node - Namespace node
+ * Handler - Handler associated with the data
+ * Data - Where the data is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Low level interface to obtain data previously associated with
+ * a namespace node.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsGetAttachedData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_HANDLER Handler,
+ void **Data)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ObjDesc = Node->Object;
+ while (ObjDesc)
+ {
+ if ((ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_LOCAL_DATA) &&
+ (ObjDesc->Data.Handler == Handler))
+ {
+ *Data = ObjDesc->Data.Pointer;
+ return (AE_OK);
+ }
+
+ ObjDesc = ObjDesc->Common.NextObject;
+ }
+
+ return (AE_NOT_FOUND);
+}
+
+
diff --git a/sys/contrib/dev/acpica/nsparse.c b/sys/contrib/dev/acpica/nsparse.c
new file mode 100644
index 0000000..8cb17a7
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsparse.c
@@ -0,0 +1,283 @@
+/******************************************************************************
+ *
+ * Module Name: nsparse - namespace interface to AML parser
+ * $Revision: 1.16 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __NSPARSE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/actables.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsparse")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: NsOneCompleteParse
+ *
+ * PARAMETERS: PassNumber - 1 or 2
+ * TableDesc - The table to be parsed.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Perform one complete parse of an ACPI/AML table.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsOneCompleteParse (
+ ACPI_NATIVE_UINT PassNumber,
+ ACPI_NATIVE_UINT TableIndex)
+{
+ ACPI_PARSE_OBJECT *ParseRoot;
+ ACPI_STATUS Status;
+ ACPI_NATIVE_UINT AmlLength;
+ UINT8 *AmlStart;
+ ACPI_WALK_STATE *WalkState;
+ ACPI_TABLE_HEADER *Table;
+ ACPI_OWNER_ID OwnerId;
+
+
+ ACPI_FUNCTION_TRACE (NsOneCompleteParse);
+
+
+ Status = AcpiTbGetOwnerId (TableIndex, &OwnerId);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Create and init a Root Node */
+
+ ParseRoot = AcpiPsCreateScopeOp ();
+ if (!ParseRoot)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Create and initialize a new walk state */
+
+ WalkState = AcpiDsCreateWalkState (OwnerId, NULL, NULL, NULL);
+ if (!WalkState)
+ {
+ AcpiPsFreeOp (ParseRoot);
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Status = AcpiGetTableByIndex (TableIndex, &Table);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiDsDeleteWalkState (WalkState);
+ AcpiPsFreeOp (ParseRoot);
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Table must consist of at least a complete header */
+
+ if (Table->Length < sizeof (ACPI_TABLE_HEADER))
+ {
+ Status = AE_BAD_HEADER;
+ }
+ else
+ {
+ AmlStart = (UINT8 *) Table + sizeof (ACPI_TABLE_HEADER);
+ AmlLength = Table->Length - sizeof (ACPI_TABLE_HEADER);
+ Status = AcpiDsInitAmlWalk (WalkState, ParseRoot, NULL,
+ AmlStart, AmlLength, NULL, (UINT8) PassNumber);
+ }
+
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiDsDeleteWalkState (WalkState);
+ AcpiPsDeleteParseTree (ParseRoot);
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Parse the AML */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "*PARSE* pass %lu parse\n",
+ (unsigned long) PassNumber));
+ Status = AcpiPsParseAml (WalkState);
+
+ AcpiPsDeleteParseTree (ParseRoot);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsParseTable
+ *
+ * PARAMETERS: TableDesc - An ACPI table descriptor for table to parse
+ * StartNode - Where to enter the table into the namespace
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Parse AML within an ACPI table and return a tree of ops
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsParseTable (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_NAMESPACE_NODE *StartNode)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (NsParseTable);
+
+
+ /*
+ * AML Parse, pass 1
+ *
+ * In this pass, we load most of the namespace. Control methods
+ * are not parsed until later. A parse tree is not created. Instead,
+ * each Parser Op subtree is deleted when it is finished. This saves
+ * a great deal of memory, and allows a small cache of parse objects
+ * to service the entire parse. The second pass of the parse then
+ * performs another complete parse of the AML.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "**** Start pass 1\n"));
+ Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS1, TableIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * AML Parse, pass 2
+ *
+ * In this pass, we resolve forward references and other things
+ * that could not be completed during the first pass.
+ * Another complete parse of the AML is performed, but the
+ * overhead of this is compensated for by the fact that the
+ * parse objects are all cached.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "**** Start pass 2\n"));
+ Status = AcpiNsOneCompleteParse (ACPI_IMODE_LOAD_PASS2, TableIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/nssearch.c b/sys/contrib/dev/acpica/nssearch.c
new file mode 100644
index 0000000..23d6ec2
--- /dev/null
+++ b/sys/contrib/dev/acpica/nssearch.c
@@ -0,0 +1,514 @@
+/*******************************************************************************
+ *
+ * Module Name: nssearch - Namespace search
+ * $Revision: 1.121 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __NSSEARCH_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nssearch")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiNsSearchParentTree (
+ UINT32 TargetName,
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_TYPE Type,
+ ACPI_NAMESPACE_NODE **ReturnNode);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsSearchOneScope
+ *
+ * PARAMETERS: TargetName - Ascii ACPI name to search for
+ * ParentNode - Starting node where search will begin
+ * Type - Object type to match
+ * ReturnNode - Where the matched Named obj is returned
+ *
+ * RETURN: Status
+ *
+ * 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
+ * order in which the names are encountered during the namespace load;
+ *
+ * All namespace searching is linear in this implementation, but
+ * could be easily modified to support any improved search
+ * algorithm. However, the linear search was chosen for simplicity
+ * and because the trees are small and the other interpreter
+ * execution overhead is relatively high.
+ *
+ * Note: CPU execution analysis has shown that the AML interpreter spends
+ * a very small percentage of its time searching the namespace. Therefore,
+ * the linear search seems to be sufficient, as there would seem to be
+ * little value in improving the search.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsSearchOneScope (
+ UINT32 TargetName,
+ ACPI_NAMESPACE_NODE *ParentNode,
+ ACPI_OBJECT_TYPE Type,
+ ACPI_NAMESPACE_NODE **ReturnNode)
+{
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ACPI_FUNCTION_TRACE (NsSearchOneScope);
+
+
+#ifdef ACPI_DEBUG_OUTPUT
+ if (ACPI_LV_NAMES & AcpiDbgLevel)
+ {
+ char *ScopeName;
+
+ ScopeName = AcpiNsGetExternalPathname (ParentNode);
+ if (ScopeName)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Searching %s (%p) For [%4.4s] (%s)\n",
+ ScopeName, ParentNode, ACPI_CAST_PTR (char, &TargetName),
+ AcpiUtGetTypeName (Type)));
+
+ ACPI_FREE (ScopeName);
+ }
+ }
+#endif
+
+ /*
+ * Search for name at this namespace level, which is to say that we
+ * must search for the name among the children of this object
+ */
+ Node = ParentNode->Child;
+ while (Node)
+ {
+ /* Check for match against the name */
+
+ if (Node->Name.Integer == TargetName)
+ {
+ /* Resolve a control method alias if any */
+
+ if (AcpiNsGetType (Node) == ACPI_TYPE_LOCAL_METHOD_ALIAS)
+ {
+ Node = ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Node->Object);
+ }
+
+ /* Found matching entry */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Name [%4.4s] (%s) %p found in scope [%4.4s] %p\n",
+ ACPI_CAST_PTR (char, &TargetName),
+ AcpiUtGetTypeName (Node->Type),
+ Node, AcpiUtGetNodeName (ParentNode), ParentNode));
+
+ *ReturnNode = Node;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * The last entry in the list points back to the parent,
+ * so a flag is used to indicate the end-of-list
+ */
+ if (Node->Flags & ANOBJ_END_OF_PEER_LIST)
+ {
+ /* Searched entire list, we are done */
+
+ break;
+ }
+
+ /* Didn't match name, move on to the next peer object */
+
+ Node = Node->Peer;
+ }
+
+ /* Searched entire namespace level, not found */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Name [%4.4s] (%s) not found in search in scope [%4.4s] %p first child %p\n",
+ ACPI_CAST_PTR (char, &TargetName), AcpiUtGetTypeName (Type),
+ AcpiUtGetNodeName (ParentNode), ParentNode, ParentNode->Child));
+
+ return_ACPI_STATUS (AE_NOT_FOUND);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsSearchParentTree
+ *
+ * PARAMETERS: TargetName - Ascii ACPI name to search for
+ * Node - Starting node where search will begin
+ * Type - Object type to match
+ * ReturnNode - Where the matched Node is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Called when a name has not been found in the current namespace
+ * level. Before adding it or giving up, ACPI scope rules require
+ * searching enclosing scopes in cases identified by AcpiNsLocal().
+ *
+ * "A name is located by finding the matching name in the current
+ * name space, and then in the parent name space. If the parent
+ * name space does not contain the name, the search continues
+ * recursively until either the name is found or the name space
+ * does not have a parent (the root of the name space). This
+ * indicates that the name is not found" (From ACPI Specification,
+ * section 5.3)
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiNsSearchParentTree (
+ UINT32 TargetName,
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_OBJECT_TYPE Type,
+ ACPI_NAMESPACE_NODE **ReturnNode)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *ParentNode;
+
+
+ ACPI_FUNCTION_TRACE (NsSearchParentTree);
+
+
+ ParentNode = AcpiNsGetParentNode (Node);
+
+ /*
+ * 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 (!ParentNode)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES, "[%4.4s] has no parent\n",
+ ACPI_CAST_PTR (char, &TargetName)));
+ return_ACPI_STATUS (AE_NOT_FOUND);
+ }
+
+ if (AcpiNsLocal (Type))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "[%4.4s] type [%s] must be local to this scope (no parent search)\n",
+ ACPI_CAST_PTR (char, &TargetName), AcpiUtGetTypeName (Type)));
+ return_ACPI_STATUS (AE_NOT_FOUND);
+ }
+
+ /* Search the parent tree */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "Searching parent [%4.4s] for [%4.4s]\n",
+ AcpiUtGetNodeName (ParentNode), ACPI_CAST_PTR (char, &TargetName)));
+
+ /*
+ * Search parents until target is found or we have backed up to the root
+ */
+ while (ParentNode)
+ {
+ /*
+ * Search parent scope. Use TYPE_ANY because we don't care about the
+ * object type at this point, we only care about the existence of
+ * the actual name we are searching for. Typechecking comes later.
+ */
+ Status = AcpiNsSearchOneScope (
+ TargetName, ParentNode, ACPI_TYPE_ANY, ReturnNode);
+ if (ACPI_SUCCESS (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Not found here, go up another level (until we reach the root) */
+
+ ParentNode = AcpiNsGetParentNode (ParentNode);
+ }
+
+ /* Not found in parent tree */
+
+ return_ACPI_STATUS (AE_NOT_FOUND);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsSearchAndEnter
+ *
+ * PARAMETERS: TargetName - Ascii ACPI name to search for (4 chars)
+ * WalkState - Current state of the walk
+ * Node - Starting node where search will begin
+ * InterpreterMode - Add names only in ACPI_MODE_LOAD_PASS_x.
+ * Otherwise,search only.
+ * Type - Object type to match
+ * Flags - Flags describing the search restrictions
+ * ReturnNode - Where the Node is returned
+ *
+ * RETURN: Status
+ *
+ * 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 ACPI_IMODE_EXECUTE, search only.
+ * In other modes, search and add if not found.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsSearchAndEnter (
+ UINT32 TargetName,
+ ACPI_WALK_STATE *WalkState,
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_INTERPRETER_MODE InterpreterMode,
+ ACPI_OBJECT_TYPE Type,
+ UINT32 Flags,
+ ACPI_NAMESPACE_NODE **ReturnNode)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *NewNode;
+
+
+ ACPI_FUNCTION_TRACE (NsSearchAndEnter);
+
+
+ /* Parameter validation */
+
+ if (!Node || !TargetName || !ReturnNode)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Null parameter: Node %p Name %X ReturnNode %p",
+ Node, TargetName, ReturnNode));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Name must consist of valid ACPI characters. We will repair the name if
+ * necessary because we don't want to abort because of this, but we want
+ * all namespace names to be printable. A warning message is appropriate.
+ *
+ * This issue came up because there are in fact machines that exhibit
+ * this problem, and we want to be able to enable ACPI support for them,
+ * even though there are a few bad names.
+ */
+ if (!AcpiUtValidAcpiName (TargetName))
+ {
+ TargetName = AcpiUtRepairName (ACPI_CAST_PTR (char, &TargetName));
+
+ /* Report warning only if in strict mode or debug mode */
+
+ if (!AcpiGbl_EnableInterpreterSlack)
+ {
+ ACPI_WARNING ((AE_INFO,
+ "Found bad character(s) in name, repaired: [%4.4s]\n",
+ ACPI_CAST_PTR (char, &TargetName)));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_WARN,
+ "Found bad character(s) in name, repaired: [%4.4s]\n",
+ ACPI_CAST_PTR (char, &TargetName)));
+ }
+ }
+
+ /* Try to find the name in the namespace level specified by the caller */
+
+ *ReturnNode = ACPI_ENTRY_NOT_FOUND;
+ Status = AcpiNsSearchOneScope (TargetName, Node, Type, ReturnNode);
+ if (Status != AE_NOT_FOUND)
+ {
+ /*
+ * If we found it AND the request specifies that a find is an error,
+ * return the error
+ */
+ if ((Status == AE_OK) &&
+ (Flags & ACPI_NS_ERROR_IF_FOUND))
+ {
+ Status = AE_ALREADY_EXISTS;
+ }
+
+ /* Either found it or there was an error: finished either way */
+
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * The name was not found. If we are NOT performing the first pass
+ * (name entry) of loading the namespace, search the parent tree (all the
+ * way to the root if necessary.) We don't want to perform the parent
+ * search when the namespace is actually being loaded. We want to perform
+ * the search when namespace references are being resolved (load pass 2)
+ * and during the execution phase.
+ */
+ if ((InterpreterMode != ACPI_IMODE_LOAD_PASS1) &&
+ (Flags & ACPI_NS_SEARCH_PARENT))
+ {
+ /*
+ * Not found at this level - search parent tree according to the
+ * ACPI specification
+ */
+ Status = AcpiNsSearchParentTree (TargetName, Node, Type, ReturnNode);
+ if (ACPI_SUCCESS (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* In execute mode, just search, never add names. Exit now */
+
+ if (InterpreterMode == ACPI_IMODE_EXECUTE)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_NAMES,
+ "%4.4s Not found in %p [Not adding]\n",
+ ACPI_CAST_PTR (char, &TargetName), Node));
+
+ return_ACPI_STATUS (AE_NOT_FOUND);
+ }
+
+ /* Create the new named object */
+
+ NewNode = AcpiNsCreateNode (TargetName);
+ if (!NewNode)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+#ifdef ACPI_ASL_COMPILER
+ /*
+ * Node is an object defined by an External() statement
+ */
+ if (Flags & ACPI_NS_EXTERNAL)
+ {
+ NewNode->Flags |= ANOBJ_IS_EXTERNAL;
+ }
+#endif
+
+ if (Flags & ACPI_NS_TEMPORARY)
+ {
+ NewNode->Flags |= ANOBJ_TEMPORARY;
+ }
+
+ /* Install the new object into the parent's list of children */
+
+ AcpiNsInstallNode (WalkState, Node, NewNode, Type);
+ *ReturnNode = NewNode;
+ return_ACPI_STATUS (AE_OK);
+}
+
diff --git a/sys/contrib/dev/acpica/nsutils.c b/sys/contrib/dev/acpica/nsutils.c
new file mode 100644
index 0000000..7aac1f3
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsutils.c
@@ -0,0 +1,1220 @@
+/******************************************************************************
+ *
+ * Module Name: nsutils - Utilities for accessing ACPI namespace, accessing
+ * parents and siblings and Scope manipulation
+ * $Revision: 1.155 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __NSUTILS_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/actables.h>
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsutils")
+
+/* Local prototypes */
+
+static BOOLEAN
+AcpiNsValidPathSeparator (
+ char Sep);
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+ACPI_NAME
+AcpiNsFindParentName (
+ ACPI_NAMESPACE_NODE *NodeToSearch);
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsReportError
+ *
+ * PARAMETERS: ModuleName - Caller's module name (for error output)
+ * LineNumber - Caller's line number (for error output)
+ * InternalName - Name or path of the namespace node
+ * LookupStatus - Exception code from NS lookup
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print warning message with full pathname
+ *
+ ******************************************************************************/
+
+void
+AcpiNsReportError (
+ char *ModuleName,
+ UINT32 LineNumber,
+ char *InternalName,
+ ACPI_STATUS LookupStatus)
+{
+ ACPI_STATUS Status;
+ UINT32 BadName;
+ char *Name = NULL;
+
+
+ AcpiOsPrintf ("ACPI Error (%s-%04d): ", ModuleName, LineNumber);
+
+ if (LookupStatus == AE_BAD_CHARACTER)
+ {
+ /* There is a non-ascii character in the name */
+
+ ACPI_MOVE_32_TO_32 (&BadName, InternalName);
+ AcpiOsPrintf ("[0x%4.4X] (NON-ASCII)", BadName);
+ }
+ else
+ {
+ /* Convert path to external format */
+
+ Status = AcpiNsExternalizeName (ACPI_UINT32_MAX,
+ InternalName, NULL, &Name);
+
+ /* Print target name */
+
+ if (ACPI_SUCCESS (Status))
+ {
+ AcpiOsPrintf ("[%s]", Name);
+ }
+ else
+ {
+ AcpiOsPrintf ("[COULD NOT EXTERNALIZE NAME]");
+ }
+
+ if (Name)
+ {
+ ACPI_FREE (Name);
+ }
+ }
+
+ AcpiOsPrintf (" Namespace lookup failure, %s\n",
+ AcpiFormatException (LookupStatus));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsReportMethodError
+ *
+ * PARAMETERS: ModuleName - Caller's module name (for error output)
+ * LineNumber - Caller's line number (for error output)
+ * Message - Error message to use on failure
+ * PrefixNode - Prefix relative to the path
+ * Path - Path to the node (optional)
+ * MethodStatus - Execution status
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print warning message with full pathname
+ *
+ ******************************************************************************/
+
+void
+AcpiNsReportMethodError (
+ char *ModuleName,
+ UINT32 LineNumber,
+ char *Message,
+ ACPI_NAMESPACE_NODE *PrefixNode,
+ char *Path,
+ ACPI_STATUS MethodStatus)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node = PrefixNode;
+
+
+ AcpiOsPrintf ("ACPI Error (%s-%04d): ", ModuleName, LineNumber);
+
+ if (Path)
+ {
+ Status = AcpiNsGetNode (PrefixNode, Path, ACPI_NS_NO_UPSEARCH,
+ &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsPrintf ("[Could not get node by pathname]");
+ }
+ }
+
+ AcpiNsPrintNodePathname (Node, Message);
+ AcpiOsPrintf (", %s\n", AcpiFormatException (MethodStatus));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsPrintNodePathname
+ *
+ * PARAMETERS: Node - Object
+ * Message - Prefix message
+ *
+ * DESCRIPTION: Print an object's full namespace pathname
+ * Manages allocation/freeing of a pathname buffer
+ *
+ ******************************************************************************/
+
+void
+AcpiNsPrintNodePathname (
+ ACPI_NAMESPACE_NODE *Node,
+ char *Message)
+{
+ ACPI_BUFFER Buffer;
+ ACPI_STATUS Status;
+
+
+ if (!Node)
+ {
+ AcpiOsPrintf ("[NULL NAME]");
+ return;
+ }
+
+ /* Convert handle to full pathname and print it (with supplied message) */
+
+ Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+
+ Status = AcpiNsHandleToPathname (Node, &Buffer);
+ if (ACPI_SUCCESS (Status))
+ {
+ if (Message)
+ {
+ AcpiOsPrintf ("%s ", Message);
+ }
+
+ AcpiOsPrintf ("[%s] (Node %p)", (char *) Buffer.Pointer, Node);
+ ACPI_FREE (Buffer.Pointer);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsValidRootPrefix
+ *
+ * PARAMETERS: Prefix - Character to be checked
+ *
+ * RETURN: TRUE if a valid prefix
+ *
+ * DESCRIPTION: Check if a character is a valid ACPI Root prefix
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiNsValidRootPrefix (
+ char Prefix)
+{
+
+ return ((BOOLEAN) (Prefix == '\\'));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsValidPathSeparator
+ *
+ * PARAMETERS: Sep - Character to be checked
+ *
+ * RETURN: TRUE if a valid path separator
+ *
+ * DESCRIPTION: Check if a character is a valid ACPI path separator
+ *
+ ******************************************************************************/
+
+static BOOLEAN
+AcpiNsValidPathSeparator (
+ char Sep)
+{
+
+ return ((BOOLEAN) (Sep == '.'));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetType
+ *
+ * PARAMETERS: Node - Parent Node to be examined
+ *
+ * RETURN: Type field from Node whose handle is passed
+ *
+ * DESCRIPTION: Return the type of a Namespace node
+ *
+ ******************************************************************************/
+
+ACPI_OBJECT_TYPE
+AcpiNsGetType (
+ ACPI_NAMESPACE_NODE *Node)
+{
+ ACPI_FUNCTION_TRACE (NsGetType);
+
+
+ if (!Node)
+ {
+ ACPI_WARNING ((AE_INFO, "Null Node parameter"));
+ return_UINT32 (ACPI_TYPE_ANY);
+ }
+
+ return_UINT32 ((ACPI_OBJECT_TYPE) Node->Type);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsLocal
+ *
+ * PARAMETERS: Type - A namespace object type
+ *
+ * RETURN: LOCAL if names must be found locally in objects of the
+ * passed type, 0 if enclosing scopes should be searched
+ *
+ * DESCRIPTION: Returns scope rule for the given object type.
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiNsLocal (
+ ACPI_OBJECT_TYPE Type)
+{
+ ACPI_FUNCTION_TRACE (NsLocal);
+
+
+ if (!AcpiUtValidObjectType (Type))
+ {
+ /* Type code out of range */
+
+ ACPI_WARNING ((AE_INFO, "Invalid Object Type %X", Type));
+ return_UINT32 (ACPI_NS_NORMAL);
+ }
+
+ return_UINT32 ((UINT32) AcpiGbl_NsProperties[Type] & ACPI_NS_LOCAL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetInternalNameLength
+ *
+ * PARAMETERS: Info - Info struct initialized with the
+ * external name pointer.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Calculate the length of the internal (AML) namestring
+ * corresponding to the external (ASL) namestring.
+ *
+ ******************************************************************************/
+
+void
+AcpiNsGetInternalNameLength (
+ ACPI_NAMESTRING_INFO *Info)
+{
+ char *NextExternalChar;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ NextExternalChar = Info->ExternalName;
+ Info->NumCarats = 0;
+ Info->NumSegments = 0;
+ Info->FullyQualified = FALSE;
+
+ /*
+ * For the internal name, the required length is 4 bytes per segment, plus
+ * 1 each for RootPrefix, MultiNamePrefixOp, segment count, trailing null
+ * (which is not really needed, but no there's harm in putting it there)
+ *
+ * strlen() + 1 covers the first NameSeg, which has no path separator
+ */
+ if (AcpiNsValidRootPrefix (NextExternalChar[0]))
+ {
+ Info->FullyQualified = TRUE;
+ NextExternalChar++;
+ }
+ else
+ {
+ /*
+ * Handle Carat prefixes
+ */
+ while (*NextExternalChar == '^')
+ {
+ Info->NumCarats++;
+ NextExternalChar++;
+ }
+ }
+
+ /*
+ * Determine the number of ACPI name "segments" by counting the number of
+ * path separators within the string. Start with one segment since the
+ * segment count is [(# separators) + 1], and zero separators is ok.
+ */
+ if (*NextExternalChar)
+ {
+ Info->NumSegments = 1;
+ for (i = 0; NextExternalChar[i]; i++)
+ {
+ if (AcpiNsValidPathSeparator (NextExternalChar[i]))
+ {
+ Info->NumSegments++;
+ }
+ }
+ }
+
+ Info->Length = (ACPI_NAME_SIZE * Info->NumSegments) +
+ 4 + Info->NumCarats;
+
+ Info->NextExternalChar = NextExternalChar;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsBuildInternalName
+ *
+ * PARAMETERS: Info - Info struct fully initialized
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Construct the internal (AML) namestring
+ * corresponding to the external (ASL) namestring.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsBuildInternalName (
+ ACPI_NAMESTRING_INFO *Info)
+{
+ UINT32 NumSegments = Info->NumSegments;
+ char *InternalName = Info->InternalName;
+ char *ExternalName = Info->NextExternalChar;
+ char *Result = NULL;
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_TRACE (NsBuildInternalName);
+
+
+ /* Setup the correct prefixes, counts, and pointers */
+
+ if (Info->FullyQualified)
+ {
+ InternalName[0] = '\\';
+
+ if (NumSegments <= 1)
+ {
+ Result = &InternalName[1];
+ }
+ else if (NumSegments == 2)
+ {
+ InternalName[1] = AML_DUAL_NAME_PREFIX;
+ Result = &InternalName[2];
+ }
+ else
+ {
+ InternalName[1] = AML_MULTI_NAME_PREFIX_OP;
+ InternalName[2] = (char) NumSegments;
+ Result = &InternalName[3];
+ }
+ }
+ else
+ {
+ /*
+ * Not fully qualified.
+ * Handle Carats first, then append the name segments
+ */
+ i = 0;
+ if (Info->NumCarats)
+ {
+ for (i = 0; i < Info->NumCarats; i++)
+ {
+ InternalName[i] = '^';
+ }
+ }
+
+ if (NumSegments <= 1)
+ {
+ Result = &InternalName[i];
+ }
+ else if (NumSegments == 2)
+ {
+ InternalName[i] = AML_DUAL_NAME_PREFIX;
+ Result = &InternalName[(ACPI_NATIVE_UINT) (i+1)];
+ }
+ else
+ {
+ InternalName[i] = AML_MULTI_NAME_PREFIX_OP;
+ InternalName[(ACPI_NATIVE_UINT) (i+1)] = (char) NumSegments;
+ Result = &InternalName[(ACPI_NATIVE_UINT) (i+2)];
+ }
+ }
+
+ /* Build the name (minus path separators) */
+
+ for (; NumSegments; NumSegments--)
+ {
+ for (i = 0; i < ACPI_NAME_SIZE; i++)
+ {
+ if (AcpiNsValidPathSeparator (*ExternalName) ||
+ (*ExternalName == 0))
+ {
+ /* Pad the segment with underscore(s) if segment is short */
+
+ Result[i] = '_';
+ }
+ else
+ {
+ /* Convert the character to uppercase and save it */
+
+ Result[i] = (char) ACPI_TOUPPER ((int) *ExternalName);
+ ExternalName++;
+ }
+ }
+
+ /* Now we must have a path separator, or the pathname is bad */
+
+ if (!AcpiNsValidPathSeparator (*ExternalName) &&
+ (*ExternalName != 0))
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Move on the next segment */
+
+ ExternalName++;
+ Result += ACPI_NAME_SIZE;
+ }
+
+ /* Terminate the string */
+
+ *Result = 0;
+
+ if (Info->FullyQualified)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (abs) \"\\%s\"\n",
+ InternalName, InternalName));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Returning [%p] (rel) \"%s\"\n",
+ InternalName, InternalName));
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsInternalizeName
+ *
+ * PARAMETERS: *ExternalName - External representation of name
+ * **Converted Name - Where to return the resulting
+ * internal represention of the name
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert an external representation (e.g. "\_PR_.CPU0")
+ * to internal form (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30)
+ *
+ *******************************************************************************/
+
+ACPI_STATUS
+AcpiNsInternalizeName (
+ char *ExternalName,
+ char **ConvertedName)
+{
+ char *InternalName;
+ ACPI_NAMESTRING_INFO Info;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (NsInternalizeName);
+
+
+ if ((!ExternalName) ||
+ (*ExternalName == 0) ||
+ (!ConvertedName))
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Get the length of the new internal name */
+
+ Info.ExternalName = ExternalName;
+ AcpiNsGetInternalNameLength (&Info);
+
+ /* We need a segment to store the internal name */
+
+ InternalName = ACPI_ALLOCATE_ZEROED (Info.Length);
+ if (!InternalName)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Build the name */
+
+ Info.InternalName = InternalName;
+ Status = AcpiNsBuildInternalName (&Info);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_FREE (InternalName);
+ return_ACPI_STATUS (Status);
+ }
+
+ *ConvertedName = InternalName;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsExternalizeName
+ *
+ * PARAMETERS: InternalNameLength - Lenth of the internal name below
+ * InternalName - Internal representation of name
+ * ConvertedNameLength - Where the length is returned
+ * ConvertedName - Where the resulting external name
+ * is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert internal name (e.g. 5c 2f 02 5f 50 52 5f 43 50 55 30)
+ * to its external (printable) form (e.g. "\_PR_.CPU0")
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsExternalizeName (
+ UINT32 InternalNameLength,
+ char *InternalName,
+ UINT32 *ConvertedNameLength,
+ char **ConvertedName)
+{
+ ACPI_NATIVE_UINT NamesIndex = 0;
+ ACPI_NATIVE_UINT NumSegments = 0;
+ ACPI_NATIVE_UINT RequiredLength;
+ ACPI_NATIVE_UINT PrefixLength = 0;
+ ACPI_NATIVE_UINT i = 0;
+ ACPI_NATIVE_UINT j = 0;
+
+
+ ACPI_FUNCTION_TRACE (NsExternalizeName);
+
+
+ if (!InternalNameLength ||
+ !InternalName ||
+ !ConvertedName)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Check for a prefix (one '\' | one or more '^').
+ */
+ switch (InternalName[0])
+ {
+ case '\\':
+ PrefixLength = 1;
+ break;
+
+ case '^':
+ for (i = 0; i < InternalNameLength; i++)
+ {
+ if (InternalName[i] == '^')
+ {
+ PrefixLength = i + 1;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ if (i == InternalNameLength)
+ {
+ PrefixLength = i;
+ }
+
+ break;
+
+ default:
+ break;
+ }
+
+ /*
+ * Check for object names. Note that there could be 0-255 of these
+ * 4-byte elements.
+ */
+ if (PrefixLength < InternalNameLength)
+ {
+ switch (InternalName[PrefixLength])
+ {
+ case AML_MULTI_NAME_PREFIX_OP:
+
+ /* <count> 4-byte names */
+
+ NamesIndex = PrefixLength + 2;
+ NumSegments = (ACPI_NATIVE_UINT) (UINT8)
+ InternalName[(ACPI_NATIVE_UINT) (PrefixLength + 1)];
+ break;
+
+ case AML_DUAL_NAME_PREFIX:
+
+ /* Two 4-byte names */
+
+ NamesIndex = PrefixLength + 1;
+ NumSegments = 2;
+ break;
+
+ case 0:
+
+ /* NullName */
+
+ NamesIndex = 0;
+ NumSegments = 0;
+ break;
+
+ default:
+
+ /* one 4-byte name */
+
+ NamesIndex = PrefixLength;
+ NumSegments = 1;
+ break;
+ }
+ }
+
+ /*
+ * Calculate the length of ConvertedName, which equals the length
+ * of the prefix, length of all object names, length of any required
+ * punctuation ('.') between object names, plus the NULL terminator.
+ */
+ RequiredLength = PrefixLength + (4 * NumSegments) +
+ ((NumSegments > 0) ? (NumSegments - 1) : 0) + 1;
+
+ /*
+ * Check to see if we're still in bounds. If not, there's a problem
+ * with InternalName (invalid format).
+ */
+ if (RequiredLength > InternalNameLength)
+ {
+ ACPI_ERROR ((AE_INFO, "Invalid internal name"));
+ return_ACPI_STATUS (AE_BAD_PATHNAME);
+ }
+
+ /*
+ * Build ConvertedName
+ */
+ *ConvertedName = ACPI_ALLOCATE_ZEROED (RequiredLength);
+ if (!(*ConvertedName))
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ j = 0;
+
+ for (i = 0; i < PrefixLength; i++)
+ {
+ (*ConvertedName)[j++] = InternalName[i];
+ }
+
+ if (NumSegments > 0)
+ {
+ for (i = 0; i < NumSegments; i++)
+ {
+ if (i > 0)
+ {
+ (*ConvertedName)[j++] = '.';
+ }
+
+ (*ConvertedName)[j++] = InternalName[NamesIndex++];
+ (*ConvertedName)[j++] = InternalName[NamesIndex++];
+ (*ConvertedName)[j++] = InternalName[NamesIndex++];
+ (*ConvertedName)[j++] = InternalName[NamesIndex++];
+ }
+ }
+
+ if (ConvertedNameLength)
+ {
+ *ConvertedNameLength = (UINT32) RequiredLength;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsMapHandleToNode
+ *
+ * PARAMETERS: Handle - Handle to be converted to an Node
+ *
+ * RETURN: A Name table entry pointer
+ *
+ * DESCRIPTION: Convert a namespace handle to a real Node
+ *
+ * Note: Real integer handles would allow for more verification
+ * and keep all pointers within this subsystem - however this introduces
+ * more (and perhaps unnecessary) overhead.
+ *
+ ******************************************************************************/
+
+ACPI_NAMESPACE_NODE *
+AcpiNsMapHandleToNode (
+ ACPI_HANDLE Handle)
+{
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * Simple implementation
+ */
+ if ((!Handle) || (Handle == ACPI_ROOT_OBJECT))
+ {
+ return (AcpiGbl_RootNode);
+ }
+
+ /* We can at least attempt to verify the handle */
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Handle) != ACPI_DESC_TYPE_NAMED)
+ {
+ return (NULL);
+ }
+
+ return (ACPI_CAST_PTR (ACPI_NAMESPACE_NODE, Handle));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsConvertEntryToHandle
+ *
+ * PARAMETERS: Node - Node to be converted to a Handle
+ *
+ * RETURN: A user handle
+ *
+ * DESCRIPTION: Convert a real Node to a namespace handle
+ *
+ ******************************************************************************/
+
+ACPI_HANDLE
+AcpiNsConvertEntryToHandle (
+ ACPI_NAMESPACE_NODE *Node)
+{
+
+
+ /*
+ * Simple implementation for now;
+ */
+ return ((ACPI_HANDLE) Node);
+
+
+/* Example future implementation ---------------------
+
+ if (!Node)
+ {
+ return (NULL);
+ }
+
+ if (Node == AcpiGbl_RootNode)
+ {
+ return (ACPI_ROOT_OBJECT);
+ }
+
+
+ return ((ACPI_HANDLE) Node);
+------------------------------------------------------*/
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsTerminate
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: free memory allocated for namespace and ACPI table storage.
+ *
+ ******************************************************************************/
+
+void
+AcpiNsTerminate (
+ void)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+
+
+ ACPI_FUNCTION_TRACE (NsTerminate);
+
+
+ /*
+ * 1) Free the entire namespace -- all nodes and objects
+ *
+ * Delete all object descriptors attached to namepsace nodes
+ */
+ AcpiNsDeleteNamespaceSubtree (AcpiGbl_RootNode);
+
+ /* Detach any objects attached to the root */
+
+ ObjDesc = AcpiNsGetAttachedObject (AcpiGbl_RootNode);
+ if (ObjDesc)
+ {
+ AcpiNsDetachObject (AcpiGbl_RootNode);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Namespace freed\n"));
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsOpensScope
+ *
+ * PARAMETERS: Type - A valid namespace type
+ *
+ * RETURN: NEWSCOPE if the passed type "opens a name scope" according
+ * to the ACPI specification, else 0
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiNsOpensScope (
+ ACPI_OBJECT_TYPE Type)
+{
+ ACPI_FUNCTION_TRACE_STR (NsOpensScope, AcpiUtGetTypeName (Type));
+
+
+ if (!AcpiUtValidObjectType (Type))
+ {
+ /* type code out of range */
+
+ ACPI_WARNING ((AE_INFO, "Invalid Object Type %X", Type));
+ return_UINT32 (ACPI_NS_NORMAL);
+ }
+
+ return_UINT32 (((UINT32) AcpiGbl_NsProperties[Type]) & ACPI_NS_NEWSCOPE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetNode
+ *
+ * PARAMETERS: *Pathname - Name to be found, in external (ASL) format. The
+ * \ (backslash) and ^ (carat) prefixes, and the
+ * . (period) to separate segments are supported.
+ * PrefixNode - Root of subtree to be searched, or NS_ALL for the
+ * root of the name space. If Name is fully
+ * qualified (first INT8 is '\'), the passed value
+ * of Scope will not be accessed.
+ * Flags - Used to indicate whether to perform upsearch or
+ * not.
+ * ReturnNode - Where the Node is returned
+ *
+ * DESCRIPTION: Look up a name relative to a given scope and return the
+ * corresponding Node. NOTE: Scope can be null.
+ *
+ * MUTEX: Locks namespace
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsGetNode (
+ ACPI_NAMESPACE_NODE *PrefixNode,
+ char *Pathname,
+ UINT32 Flags,
+ ACPI_NAMESPACE_NODE **ReturnNode)
+{
+ ACPI_GENERIC_STATE ScopeInfo;
+ ACPI_STATUS Status;
+ char *InternalPath;
+
+
+ ACPI_FUNCTION_TRACE_PTR (NsGetNode, Pathname);
+
+
+ if (!Pathname)
+ {
+ *ReturnNode = PrefixNode;
+ if (!PrefixNode)
+ {
+ *ReturnNode = AcpiGbl_RootNode;
+ }
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Convert path to internal representation */
+
+ Status = AcpiNsInternalizeName (Pathname, &InternalPath);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Must lock namespace during lookup */
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /* Setup lookup scope (search starting point) */
+
+ ScopeInfo.Scope.Node = PrefixNode;
+
+ /* Lookup the name in the namespace */
+
+ Status = AcpiNsLookup (&ScopeInfo, InternalPath, ACPI_TYPE_ANY,
+ ACPI_IMODE_EXECUTE, (Flags | ACPI_NS_DONT_OPEN_SCOPE),
+ NULL, ReturnNode);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "%s, %s\n",
+ Pathname, AcpiFormatException (Status)));
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+
+Cleanup:
+ ACPI_FREE (InternalPath);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetParentNode
+ *
+ * PARAMETERS: Node - Current table entry
+ *
+ * RETURN: Parent entry of the given entry
+ *
+ * DESCRIPTION: Obtain the parent entry for a given entry in the namespace.
+ *
+ ******************************************************************************/
+
+ACPI_NAMESPACE_NODE *
+AcpiNsGetParentNode (
+ ACPI_NAMESPACE_NODE *Node)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!Node)
+ {
+ return (NULL);
+ }
+
+ /*
+ * Walk to the end of this peer list. The last entry is marked with a flag
+ * and the peer pointer is really a pointer back to the parent. This saves
+ * putting a parent back pointer in each and every named object!
+ */
+ while (!(Node->Flags & ANOBJ_END_OF_PEER_LIST))
+ {
+ Node = Node->Peer;
+ }
+
+ return (Node->Peer);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetNextValidNode
+ *
+ * PARAMETERS: Node - Current table entry
+ *
+ * RETURN: Next valid Node in the linked node list. NULL if no more valid
+ * nodes.
+ *
+ * DESCRIPTION: Find the next valid node within a name table.
+ * Useful for implementing NULL-end-of-list loops.
+ *
+ ******************************************************************************/
+
+ACPI_NAMESPACE_NODE *
+AcpiNsGetNextValidNode (
+ ACPI_NAMESPACE_NODE *Node)
+{
+
+ /* If we are at the end of this peer list, return NULL */
+
+ if (Node->Flags & ANOBJ_END_OF_PEER_LIST)
+ {
+ return NULL;
+ }
+
+ /* Otherwise just return the next peer */
+
+ return (Node->Peer);
+}
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsFindParentName
+ *
+ * PARAMETERS: *ChildNode - Named Obj whose name is to be found
+ *
+ * RETURN: The ACPI name
+ *
+ * DESCRIPTION: Search for the given obj in its parent scope and return the
+ * name segment, or "????" if the parent name can't be found
+ * (which "should not happen").
+ *
+ ******************************************************************************/
+
+ACPI_NAME
+AcpiNsFindParentName (
+ ACPI_NAMESPACE_NODE *ChildNode)
+{
+ ACPI_NAMESPACE_NODE *ParentNode;
+
+
+ ACPI_FUNCTION_TRACE (NsFindParentName);
+
+
+ if (ChildNode)
+ {
+ /* Valid entry. Get the parent Node */
+
+ ParentNode = AcpiNsGetParentNode (ChildNode);
+ if (ParentNode)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Parent of %p [%4.4s] is %p [%4.4s]\n",
+ ChildNode, AcpiUtGetNodeName (ChildNode),
+ ParentNode, AcpiUtGetNodeName (ParentNode)));
+
+ if (ParentNode->Name.Integer)
+ {
+ return_VALUE ((ACPI_NAME) ParentNode->Name.Integer);
+ }
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Unable to find parent of %p (%4.4s)\n",
+ ChildNode, AcpiUtGetNodeName (ChildNode)));
+ }
+
+ return_VALUE (ACPI_UNKNOWN_NAME);
+}
+#endif
+
+
diff --git a/sys/contrib/dev/acpica/nswalk.c b/sys/contrib/dev/acpica/nswalk.c
new file mode 100644
index 0000000..a3ac86c
--- /dev/null
+++ b/sys/contrib/dev/acpica/nswalk.c
@@ -0,0 +1,388 @@
+/******************************************************************************
+ *
+ * Module Name: nswalk - Functions for walking the ACPI namespace
+ * $Revision: 1.46 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __NSWALK_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nswalk")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetNextNode
+ *
+ * PARAMETERS: Type - Type of node to be searched for
+ * ParentNode - Parent node whose children we are
+ * getting
+ * ChildNode - Previous child that was found.
+ * The NEXT child will be returned
+ *
+ * RETURN: ACPI_NAMESPACE_NODE - Pointer to the NEXT child or NULL if
+ * none is found.
+ *
+ * DESCRIPTION: Return the next peer node within the namespace. If Handle
+ * is valid, Scope is ignored. Otherwise, the first node
+ * within Scope is returned.
+ *
+ ******************************************************************************/
+
+ACPI_NAMESPACE_NODE *
+AcpiNsGetNextNode (
+ ACPI_OBJECT_TYPE Type,
+ ACPI_NAMESPACE_NODE *ParentNode,
+ ACPI_NAMESPACE_NODE *ChildNode)
+{
+ ACPI_NAMESPACE_NODE *NextNode = NULL;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!ChildNode)
+ {
+ /* It's really the parent's _scope_ that we want */
+
+ NextNode = ParentNode->Child;
+ }
+
+ else
+ {
+ /* Start search at the NEXT node */
+
+ NextNode = AcpiNsGetNextValidNode (ChildNode);
+ }
+
+ /* If any type is OK, we are done */
+
+ if (Type == ACPI_TYPE_ANY)
+ {
+ /* NextNode is NULL if we are at the end-of-list */
+
+ return (NextNode);
+ }
+
+ /* Must search for the node -- but within this scope only */
+
+ while (NextNode)
+ {
+ /* If type matches, we are done */
+
+ if (NextNode->Type == Type)
+ {
+ return (NextNode);
+ }
+
+ /* Otherwise, move on to the next node */
+
+ NextNode = AcpiNsGetNextValidNode (NextNode);
+ }
+
+ /* Not found */
+
+ return (NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsWalkNamespace
+ *
+ * PARAMETERS: Type - ACPI_OBJECT_TYPE to search for
+ * StartNode - Handle in namespace where search begins
+ * MaxDepth - Depth to which search is to reach
+ * Flags - Whether to unlock the NS before invoking
+ * the callback routine
+ * UserFunction - Called when an object of "Type" is found
+ * Context - Passed to user function
+ * ReturnValue - from the UserFunction if terminated early.
+ * Otherwise, returns NULL.
+ * RETURNS: Status
+ *
+ * DESCRIPTION: Performs a modified depth-first walk of the namespace tree,
+ * starting (and ending) at the node specified by StartHandle.
+ * The UserFunction is called whenever a node that matches
+ * the type parameter is found. If the user function returns
+ * a non-zero value, the search is terminated immediately and this
+ * value is returned to the caller.
+ *
+ * The point of this procedure is to provide a generic namespace
+ * walk routine that can be called from multiple places to
+ * provide multiple services; the User Function can be tailored
+ * to each task, whether it is a print function, a compare
+ * function, etc.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiNsWalkNamespace (
+ ACPI_OBJECT_TYPE Type,
+ ACPI_HANDLE StartNode,
+ UINT32 MaxDepth,
+ UINT32 Flags,
+ ACPI_WALK_CALLBACK UserFunction,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_STATUS Status;
+ ACPI_STATUS MutexStatus;
+ ACPI_NAMESPACE_NODE *ChildNode;
+ ACPI_NAMESPACE_NODE *ParentNode;
+ ACPI_OBJECT_TYPE ChildType;
+ UINT32 Level;
+
+
+ ACPI_FUNCTION_TRACE (NsWalkNamespace);
+
+
+ /* Special case for the namespace Root Node */
+
+ if (StartNode == ACPI_ROOT_OBJECT)
+ {
+ StartNode = AcpiGbl_RootNode;
+ }
+
+ /* Null child means "get first node" */
+
+ ParentNode = StartNode;
+ ChildNode = NULL;
+ ChildType = ACPI_TYPE_ANY;
+ Level = 1;
+
+ /*
+ * Traverse the tree of nodes until we bubble back up to where we
+ * started. When Level is zero, the loop is done because we have
+ * bubbled up to (and passed) the original parent handle (StartEntry)
+ */
+ while (Level > 0)
+ {
+ /* Get the next node in this scope. Null if not found */
+
+ Status = AE_OK;
+ ChildNode = AcpiNsGetNextNode (ACPI_TYPE_ANY, ParentNode, ChildNode);
+ if (ChildNode)
+ {
+ /* Found next child, get the type if we are not searching for ANY */
+
+ if (Type != ACPI_TYPE_ANY)
+ {
+ ChildType = ChildNode->Type;
+ }
+
+ /*
+ * Ignore all temporary namespace nodes (created during control
+ * method execution) unless told otherwise. These temporary nodes
+ * can cause a race condition because they can be deleted during the
+ * execution of the user function (if the namespace is unlocked before
+ * invocation of the user function.) Only the debugger namespace dump
+ * will examine the temporary nodes.
+ */
+ if ((ChildNode->Flags & ANOBJ_TEMPORARY) &&
+ !(Flags & ACPI_NS_WALK_TEMP_NODES))
+ {
+ Status = AE_CTRL_DEPTH;
+ }
+
+ /* Type must match requested type */
+
+ else if (ChildType == Type)
+ {
+ /*
+ * Found a matching node, invoke the user callback function.
+ * Unlock the namespace if flag is set.
+ */
+ if (Flags & ACPI_NS_WALK_UNLOCK)
+ {
+ MutexStatus = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (MutexStatus))
+ {
+ return_ACPI_STATUS (MutexStatus);
+ }
+ }
+
+ Status = UserFunction (ChildNode, Level, Context, ReturnValue);
+
+ if (Flags & ACPI_NS_WALK_UNLOCK)
+ {
+ MutexStatus = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (MutexStatus))
+ {
+ return_ACPI_STATUS (MutexStatus);
+ }
+ }
+
+ switch (Status)
+ {
+ case AE_OK:
+ case AE_CTRL_DEPTH:
+
+ /* Just keep going */
+ break;
+
+ case AE_CTRL_TERMINATE:
+
+ /* Exit now, with OK status */
+
+ return_ACPI_STATUS (AE_OK);
+
+ default:
+
+ /* All others are valid exceptions */
+
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * Depth first search: Attempt to go down another level in the
+ * namespace if we are allowed to. Don't go any further if we have
+ * reached the caller specified maximum depth or if the user
+ * function has specified that the maximum depth has been reached.
+ */
+ if ((Level < MaxDepth) && (Status != AE_CTRL_DEPTH))
+ {
+ if (AcpiNsGetNextNode (ACPI_TYPE_ANY, ChildNode, NULL))
+ {
+ /* There is at least one child of this node, visit it */
+
+ Level++;
+ ParentNode = ChildNode;
+ ChildNode = NULL;
+ }
+ }
+ }
+ else
+ {
+ /*
+ * No more children of this node (AcpiNsGetNextNode failed), go
+ * back upwards in the namespace tree to the node's parent.
+ */
+ Level--;
+ ChildNode = ParentNode;
+ ParentNode = AcpiNsGetParentNode (ParentNode);
+ }
+ }
+
+ /* Complete walk, not terminated by user function */
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/nsxfeval.c b/sys/contrib/dev/acpica/nsxfeval.c
new file mode 100644
index 0000000..617002c
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsxfeval.c
@@ -0,0 +1,891 @@
+/*******************************************************************************
+ *
+ * Module Name: nsxfeval - Public interfaces to the ACPI subsystem
+ * ACPI Object evaluation interfaces
+ * $Revision: 1.30 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __NSXFEVAL_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsxfeval")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvaluateObjectTyped
+ *
+ * PARAMETERS: Handle - Object handle (optional)
+ * Pathname - Object pathname (optional)
+ * ExternalParams - List of parameters to pass to method,
+ * terminated by NULL. May be NULL
+ * if no parameters are being passed.
+ * ReturnBuffer - Where to put method's return value (if
+ * any). If NULL, no value is returned.
+ * ReturnType - Expected type of return object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Find and evaluate the given object, passing the given
+ * parameters if necessary. One of "Handle" or "Pathname" must
+ * be valid (non-null)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvaluateObjectTyped (
+ ACPI_HANDLE Handle,
+ ACPI_STRING Pathname,
+ ACPI_OBJECT_LIST *ExternalParams,
+ ACPI_BUFFER *ReturnBuffer,
+ ACPI_OBJECT_TYPE ReturnType)
+{
+ ACPI_STATUS Status;
+ BOOLEAN MustFree = FALSE;
+
+
+ ACPI_FUNCTION_TRACE (AcpiEvaluateObjectTyped);
+
+
+ /* Return buffer must be valid */
+
+ if (!ReturnBuffer)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if (ReturnBuffer->Length == ACPI_ALLOCATE_BUFFER)
+ {
+ MustFree = TRUE;
+ }
+
+ /* Evaluate the object */
+
+ Status = AcpiEvaluateObject (Handle, Pathname, ExternalParams, ReturnBuffer);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Type ANY means "don't care" */
+
+ if (ReturnType == ACPI_TYPE_ANY)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ if (ReturnBuffer->Length == 0)
+ {
+ /* Error because caller specifically asked for a return value */
+
+ ACPI_ERROR ((AE_INFO, "No return value"));
+ return_ACPI_STATUS (AE_NULL_OBJECT);
+ }
+
+ /* Examine the object type returned from EvaluateObject */
+
+ if (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type == ReturnType)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Return object type does not match requested type */
+
+ ACPI_ERROR ((AE_INFO,
+ "Incorrect return type [%s] requested [%s]",
+ AcpiUtGetTypeName (((ACPI_OBJECT *) ReturnBuffer->Pointer)->Type),
+ AcpiUtGetTypeName (ReturnType)));
+
+ if (MustFree)
+ {
+ /* Caller used ACPI_ALLOCATE_BUFFER, free the return buffer */
+
+ AcpiOsFree (ReturnBuffer->Pointer);
+ ReturnBuffer->Pointer = NULL;
+ }
+
+ ReturnBuffer->Length = 0;
+ return_ACPI_STATUS (AE_TYPE);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiEvaluateObjectTyped)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEvaluateObject
+ *
+ * PARAMETERS: Handle - Object handle (optional)
+ * Pathname - Object pathname (optional)
+ * ExternalParams - List of parameters to pass to method,
+ * terminated by NULL. May be NULL
+ * if no parameters are being passed.
+ * ReturnBuffer - Where to put method's return value (if
+ * any). If NULL, no value is returned.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Find and evaluate the given object, passing the given
+ * parameters if necessary. One of "Handle" or "Pathname" must
+ * be valid (non-null)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEvaluateObject (
+ ACPI_HANDLE Handle,
+ ACPI_STRING Pathname,
+ ACPI_OBJECT_LIST *ExternalParams,
+ ACPI_BUFFER *ReturnBuffer)
+{
+ ACPI_STATUS Status;
+ ACPI_EVALUATE_INFO *Info;
+ ACPI_SIZE BufferSpaceNeeded;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE (AcpiEvaluateObject);
+
+
+ /* Allocate and initialize the evaluation information block */
+
+ Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
+ if (!Info)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Info->Pathname = Pathname;
+ Info->ParameterType = ACPI_PARAM_ARGS;
+
+ /* Convert and validate the device handle */
+
+ Info->PrefixNode = AcpiNsMapHandleToNode (Handle);
+ if (!Info->PrefixNode)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto Cleanup;
+ }
+
+ /*
+ * If there are parameters to be passed to a control method, the external
+ * objects must all be converted to internal objects
+ */
+ if (ExternalParams && ExternalParams->Count)
+ {
+ /*
+ * Allocate a new parameter block for the internal objects
+ * Add 1 to count to allow for null terminated internal list
+ */
+ Info->Parameters = ACPI_ALLOCATE_ZEROED (
+ ((ACPI_SIZE) ExternalParams->Count + 1) * sizeof (void *));
+ if (!Info->Parameters)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /* Convert each external object in the list to an internal object */
+
+ for (i = 0; i < ExternalParams->Count; i++)
+ {
+ Status = AcpiUtCopyEobjectToIobject (
+ &ExternalParams->Pointer[i], &Info->Parameters[i]);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+ }
+ Info->Parameters[ExternalParams->Count] = NULL;
+ }
+
+ /*
+ * Three major cases:
+ * 1) Fully qualified pathname
+ * 2) No handle, not fully qualified pathname (error)
+ * 3) Valid handle
+ */
+ if ((Pathname) &&
+ (AcpiNsValidRootPrefix (Pathname[0])))
+ {
+ /* The path is fully qualified, just evaluate by name */
+
+ Info->PrefixNode = NULL;
+ Status = AcpiNsEvaluate (Info);
+ }
+ else if (!Handle)
+ {
+ /*
+ * A handle is optional iff a fully qualified pathname is specified.
+ * Since we've already handled fully qualified names above, this is
+ * an error
+ */
+ if (!Pathname)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Both Handle and Pathname are NULL"));
+ }
+ else
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Null Handle with relative pathname [%s]", Pathname));
+ }
+
+ Status = AE_BAD_PARAMETER;
+ }
+ else
+ {
+ /* We have a namespace a node and a possible relative path */
+
+ Status = AcpiNsEvaluate (Info);
+ }
+
+ /*
+ * If we are expecting a return value, and all went well above,
+ * copy the return value to an external object.
+ */
+ if (ReturnBuffer)
+ {
+ if (!Info->ReturnObject)
+ {
+ ReturnBuffer->Length = 0;
+ }
+ else
+ {
+ if (ACPI_GET_DESCRIPTOR_TYPE (Info->ReturnObject) ==
+ ACPI_DESC_TYPE_NAMED)
+ {
+ /*
+ * If we received a NS Node as a return object, this means that
+ * the object we are evaluating has nothing interesting to
+ * return (such as a mutex, etc.) We return an error because
+ * these types are essentially unsupported by this interface.
+ * We don't check up front because this makes it easier to add
+ * support for various types at a later date if necessary.
+ */
+ Status = AE_TYPE;
+ Info->ReturnObject = NULL; /* No need to delete a NS Node */
+ ReturnBuffer->Length = 0;
+ }
+
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Get the size of the returned object */
+
+ Status = AcpiUtGetObjectSize (Info->ReturnObject,
+ &BufferSpaceNeeded);
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Validate/Allocate/Clear caller buffer */
+
+ Status = AcpiUtInitializeBuffer (ReturnBuffer,
+ BufferSpaceNeeded);
+ if (ACPI_FAILURE (Status))
+ {
+ /*
+ * Caller's buffer is too small or a new one can't
+ * be allocated
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Needed buffer size %X, %s\n",
+ (UINT32) BufferSpaceNeeded,
+ AcpiFormatException (Status)));
+ }
+ else
+ {
+ /* We have enough space for the object, build it */
+
+ Status = AcpiUtCopyIobjectToEobject (Info->ReturnObject,
+ ReturnBuffer);
+ }
+ }
+ }
+ }
+ }
+
+ if (Info->ReturnObject)
+ {
+ /*
+ * Delete the internal return object. NOTE: Interpreter must be
+ * locked to avoid race condition.
+ */
+ AcpiExEnterInterpreter ();
+
+ /* Remove one reference on the return object (should delete it) */
+
+ AcpiUtRemoveReference (Info->ReturnObject);
+ AcpiExExitInterpreter ();
+ }
+
+
+Cleanup:
+
+ /* Free the input parameter list (if we created one) */
+
+ if (Info->Parameters)
+ {
+ /* Free the allocated parameter block */
+
+ AcpiUtDeleteInternalObjectList (Info->Parameters);
+ }
+
+ ACPI_FREE (Info);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiEvaluateObject)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiWalkNamespace
+ *
+ * PARAMETERS: Type - ACPI_OBJECT_TYPE to search for
+ * StartObject - Handle in namespace where search begins
+ * MaxDepth - Depth to which search is to reach
+ * UserFunction - Called when an object of "Type" is found
+ * Context - Passed to user function
+ * ReturnValue - Location where return value of
+ * UserFunction is put if terminated early
+ *
+ * RETURNS Return value from the UserFunction if terminated early.
+ * Otherwise, returns NULL.
+ *
+ * DESCRIPTION: Performs a modified depth-first walk of the namespace tree,
+ * starting (and ending) at the object specified by StartHandle.
+ * The UserFunction is called whenever an object that matches
+ * the type parameter is found. If the user function returns
+ * a non-zero value, the search is terminated immediately and this
+ * value is returned to the caller.
+ *
+ * The point of this procedure is to provide a generic namespace
+ * walk routine that can be called from multiple places to
+ * provide multiple services; the User Function can be tailored
+ * to each task, whether it is a print function, a compare
+ * function, etc.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiWalkNamespace (
+ ACPI_OBJECT_TYPE Type,
+ ACPI_HANDLE StartObject,
+ UINT32 MaxDepth,
+ ACPI_WALK_CALLBACK UserFunction,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiWalkNamespace);
+
+
+ /* Parameter validation */
+
+ if ((Type > ACPI_TYPE_LOCAL_MAX) ||
+ (!MaxDepth) ||
+ (!UserFunction))
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Lock the namespace around the walk.
+ * The namespace will be unlocked/locked around each call
+ * to the user function - since this function
+ * must be allowed to make Acpi calls itself.
+ */
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiNsWalkNamespace (Type, StartObject, MaxDepth,
+ ACPI_NS_WALK_UNLOCK,
+ UserFunction, Context, ReturnValue);
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiWalkNamespace)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiNsGetDeviceCallback
+ *
+ * PARAMETERS: Callback from AcpiGetDevice
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Takes callbacks from WalkNamespace and filters out all non-
+ * present devices, or if they specified a HID, it filters based
+ * on that.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiNsGetDeviceCallback (
+ ACPI_HANDLE ObjHandle,
+ UINT32 NestingLevel,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_GET_DEVICES_INFO *Info = Context;
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+ UINT32 Flags;
+ ACPI_DEVICE_ID Hid;
+ ACPI_COMPATIBLE_ID_LIST *Cid;
+ ACPI_NATIVE_UINT i;
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Node = AcpiNsMapHandleToNode (ObjHandle);
+ Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ if (!Node)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Run _STA to determine if device is present */
+
+ Status = AcpiUtExecute_STA (Node, &Flags);
+ if (ACPI_FAILURE (Status))
+ {
+ return (AE_CTRL_DEPTH);
+ }
+
+ if (!(Flags & ACPI_STA_DEVICE_PRESENT))
+ {
+ /* Don't examine children of the device if not present */
+
+ return (AE_CTRL_DEPTH);
+ }
+
+ /* Filter based on device HID & CID */
+
+ if (Info->Hid != NULL)
+ {
+ Status = AcpiUtExecute_HID (Node, &Hid);
+ if (Status == AE_NOT_FOUND)
+ {
+ return (AE_OK);
+ }
+ else if (ACPI_FAILURE (Status))
+ {
+ return (AE_CTRL_DEPTH);
+ }
+
+ if (ACPI_STRNCMP (Hid.Value, Info->Hid, sizeof (Hid.Value)) != 0)
+ {
+ /* Get the list of Compatible IDs */
+
+ Status = AcpiUtExecute_CID (Node, &Cid);
+ if (Status == AE_NOT_FOUND)
+ {
+ return (AE_OK);
+ }
+ else if (ACPI_FAILURE (Status))
+ {
+ return (AE_CTRL_DEPTH);
+ }
+
+ /* Walk the CID list */
+
+ for (i = 0; i < Cid->Count; i++)
+ {
+ if (ACPI_STRNCMP (Cid->Id[i].Value, Info->Hid,
+ sizeof (ACPI_COMPATIBLE_ID)) != 0)
+ {
+ ACPI_FREE (Cid);
+ return (AE_OK);
+ }
+ }
+ ACPI_FREE (Cid);
+ }
+ }
+
+ Status = Info->UserFunction (ObjHandle, NestingLevel, Info->Context,
+ ReturnValue);
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetDevices
+ *
+ * PARAMETERS: HID - HID to search for. Can be NULL.
+ * UserFunction - Called when a matching object is found
+ * Context - Passed to user function
+ * ReturnValue - Location where return value of
+ * UserFunction is put if terminated early
+ *
+ * RETURNS Return value from the UserFunction if terminated early.
+ * Otherwise, returns NULL.
+ *
+ * DESCRIPTION: Performs a modified depth-first walk of the namespace tree,
+ * starting (and ending) at the object specified by StartHandle.
+ * The UserFunction is called whenever an object of type
+ * Device is found. If the user function returns
+ * a non-zero value, the search is terminated immediately and this
+ * value is returned to the caller.
+ *
+ * This is a wrapper for WalkNamespace, but the callback performs
+ * additional filtering. Please see AcpiGetDeviceCallback.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetDevices (
+ char *HID,
+ ACPI_WALK_CALLBACK UserFunction,
+ void *Context,
+ void **ReturnValue)
+{
+ ACPI_STATUS Status;
+ ACPI_GET_DEVICES_INFO Info;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetDevices);
+
+
+ /* Parameter validation */
+
+ if (!UserFunction)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * We're going to call their callback from OUR callback, so we need
+ * to know what it is, and their context parameter.
+ */
+ Info.Hid = HID;
+ Info.Context = Context;
+ Info.UserFunction = UserFunction;
+
+ /*
+ * Lock the namespace around the walk.
+ * The namespace will be unlocked/locked around each call
+ * to the user function - since this function
+ * must be allowed to make Acpi calls itself.
+ */
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiNsWalkNamespace (ACPI_TYPE_DEVICE, ACPI_ROOT_OBJECT,
+ ACPI_UINT32_MAX, ACPI_NS_WALK_UNLOCK,
+ AcpiNsGetDeviceCallback, &Info, ReturnValue);
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetDevices)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiAttachData
+ *
+ * PARAMETERS: ObjHandle - Namespace node
+ * Handler - Handler for this attachment
+ * Data - Pointer to data to be attached
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Attach arbitrary data and handler to a namespace node.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiAttachData (
+ ACPI_HANDLE ObjHandle,
+ ACPI_OBJECT_HANDLER Handler,
+ void *Data)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ /* Parameter validation */
+
+ if (!ObjHandle ||
+ !Handler ||
+ !Data)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Convert and validate the handle */
+
+ Node = AcpiNsMapHandleToNode (ObjHandle);
+ if (!Node)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ Status = AcpiNsAttachData (Node, Handler, Data);
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiAttachData)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDetachData
+ *
+ * PARAMETERS: ObjHandle - Namespace node handle
+ * Handler - Handler used in call to AcpiAttachData
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Remove data that was previously attached to a node.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDetachData (
+ ACPI_HANDLE ObjHandle,
+ ACPI_OBJECT_HANDLER Handler)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ /* Parameter validation */
+
+ if (!ObjHandle ||
+ !Handler)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Convert and validate the handle */
+
+ Node = AcpiNsMapHandleToNode (ObjHandle);
+ if (!Node)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ Status = AcpiNsDetachData (Node, Handler);
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiDetachData)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetData
+ *
+ * PARAMETERS: ObjHandle - Namespace node
+ * Handler - Handler used in call to AttachData
+ * Data - Where the data is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Retrieve data that was previously attached to a namespace node.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetData (
+ ACPI_HANDLE ObjHandle,
+ ACPI_OBJECT_HANDLER Handler,
+ void **Data)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ /* Parameter validation */
+
+ if (!ObjHandle ||
+ !Handler ||
+ !Data)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Convert and validate the handle */
+
+ Node = AcpiNsMapHandleToNode (ObjHandle);
+ if (!Node)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ Status = AcpiNsGetAttachedData (Node, Handler, Data);
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetData)
+
+
diff --git a/sys/contrib/dev/acpica/nsxfname.c b/sys/contrib/dev/acpica/nsxfname.c
new file mode 100644
index 0000000..c19f2a9
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsxfname.c
@@ -0,0 +1,474 @@
+/******************************************************************************
+ *
+ * Module Name: nsxfname - Public interfaces to the ACPI subsystem
+ * ACPI Namespace oriented interfaces
+ * $Revision: 1.112 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __NSXFNAME_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsxfname")
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiGetHandle
+ *
+ * PARAMETERS: Parent - Object to search under (search scope).
+ * Pathname - Pointer to an asciiz string containing the
+ * name
+ * RetHandle - Where the return handle is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This routine will search for a caller specified name in the
+ * name space. The caller can restrict the search region by
+ * specifying a non NULL parent. The parent value is itself a
+ * namespace handle.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetHandle (
+ ACPI_HANDLE Parent,
+ ACPI_STRING Pathname,
+ ACPI_HANDLE *RetHandle)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node = NULL;
+ ACPI_NAMESPACE_NODE *PrefixNode = NULL;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Parameter Validation */
+
+ if (!RetHandle || !Pathname)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Convert a parent handle to a prefix node */
+
+ if (Parent)
+ {
+ PrefixNode = AcpiNsMapHandleToNode (Parent);
+ if (!PrefixNode)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+ }
+
+ /*
+ * Valid cases are:
+ * 1) Fully qualified pathname
+ * 2) Parent + Relative pathname
+ *
+ * Error for <null Parent + relative path>
+ */
+ if (AcpiNsValidRootPrefix (Pathname[0]))
+ {
+ /* Pathname is fully qualified (starts with '\') */
+
+ /* Special case for root-only, since we can't search for it */
+
+ if (!ACPI_STRCMP (Pathname, ACPI_NS_ROOT_PATH))
+ {
+ *RetHandle = AcpiNsConvertEntryToHandle (AcpiGbl_RootNode);
+ return (AE_OK);
+ }
+ }
+ else if (!PrefixNode)
+ {
+ /* Relative path with null prefix is disallowed */
+
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Find the Node and convert to a handle */
+
+ Status = AcpiNsGetNode (PrefixNode, Pathname, ACPI_NS_NO_UPSEARCH, &Node);
+ if (ACPI_SUCCESS (Status))
+ {
+ *RetHandle = AcpiNsConvertEntryToHandle (Node);
+ }
+
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetHandle)
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiGetName
+ *
+ * PARAMETERS: Handle - Handle to be converted to a pathname
+ * NameType - Full pathname or single segment
+ * Buffer - Buffer for returned path
+ *
+ * RETURN: Pointer to a string containing the fully qualified Name.
+ *
+ * DESCRIPTION: This routine returns the fully qualified name associated with
+ * the Handle parameter. This and the AcpiPathnameToHandle are
+ * complementary functions.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetName (
+ ACPI_HANDLE Handle,
+ UINT32 NameType,
+ ACPI_BUFFER *Buffer)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ /* Parameter validation */
+
+ if (NameType > ACPI_NAME_TYPE_MAX)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtValidateBuffer (Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ if (NameType == ACPI_FULL_PATHNAME)
+ {
+ /* Get the full pathname (From the namespace root) */
+
+ Status = AcpiNsHandleToPathname (Handle, Buffer);
+ return (Status);
+ }
+
+ /*
+ * Wants the single segment ACPI name.
+ * Validate handle and convert to a namespace Node
+ */
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Node = AcpiNsMapHandleToNode (Handle);
+ if (!Node)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Validate/Allocate/Clear caller buffer */
+
+ Status = AcpiUtInitializeBuffer (Buffer, ACPI_PATH_SEGMENT_LENGTH);
+ if (ACPI_FAILURE (Status))
+ {
+ goto UnlockAndExit;
+ }
+
+ /* Just copy the ACPI name from the Node and zero terminate it */
+
+ ACPI_STRNCPY (Buffer->Pointer, AcpiUtGetNodeName (Node),
+ ACPI_NAME_SIZE);
+ ((char *) Buffer->Pointer) [ACPI_NAME_SIZE] = 0;
+ Status = AE_OK;
+
+
+UnlockAndExit:
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetName)
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiGetObjectInfo
+ *
+ * PARAMETERS: Handle - Object Handle
+ * Buffer - Where the info is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Returns information about an object as gleaned from the
+ * namespace node and possibly by running several standard
+ * control methods (Such as in the case of a device.)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetObjectInfo (
+ ACPI_HANDLE Handle,
+ ACPI_BUFFER *Buffer)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_DEVICE_INFO *Info;
+ ACPI_DEVICE_INFO *ReturnInfo;
+ ACPI_COMPATIBLE_ID_LIST *CidList = NULL;
+ ACPI_SIZE Size;
+
+
+ /* Parameter validation */
+
+ if (!Handle || !Buffer)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtValidateBuffer (Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_DEVICE_INFO));
+ if (!Info)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ Node = AcpiNsMapHandleToNode (Handle);
+ if (!Node)
+ {
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ goto Cleanup;
+ }
+
+ /* Init return structure */
+
+ Size = sizeof (ACPI_DEVICE_INFO);
+
+ Info->Type = Node->Type;
+ Info->Name = Node->Name.Integer;
+ Info->Valid = 0;
+
+ Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /* If not a device, we are all done */
+
+ if (Info->Type == ACPI_TYPE_DEVICE)
+ {
+ /*
+ * Get extra info for ACPI Devices objects only:
+ * Run the Device _HID, _UID, _CID, _STA, _ADR and _SxD methods.
+ *
+ * Note: none of these methods are required, so they may or may
+ * not be present for this device. The Info->Valid bitfield is used
+ * to indicate which methods were found and ran successfully.
+ */
+
+ /* Execute the Device._HID method */
+
+ Status = AcpiUtExecute_HID (Node, &Info->HardwareId);
+ if (ACPI_SUCCESS (Status))
+ {
+ Info->Valid |= ACPI_VALID_HID;
+ }
+
+ /* Execute the Device._UID method */
+
+ Status = AcpiUtExecute_UID (Node, &Info->UniqueId);
+ if (ACPI_SUCCESS (Status))
+ {
+ Info->Valid |= ACPI_VALID_UID;
+ }
+
+ /* Execute the Device._CID method */
+
+ Status = AcpiUtExecute_CID (Node, &CidList);
+ if (ACPI_SUCCESS (Status))
+ {
+ Size += CidList->Size;
+ Info->Valid |= ACPI_VALID_CID;
+ }
+
+ /* Execute the Device._STA method */
+
+ Status = AcpiUtExecute_STA (Node, &Info->CurrentStatus);
+ if (ACPI_SUCCESS (Status))
+ {
+ Info->Valid |= ACPI_VALID_STA;
+ }
+
+ /* Execute the Device._ADR method */
+
+ Status = AcpiUtEvaluateNumericObject (METHOD_NAME__ADR, Node,
+ &Info->Address);
+ if (ACPI_SUCCESS (Status))
+ {
+ Info->Valid |= ACPI_VALID_ADR;
+ }
+
+ /* Execute the Device._SxD methods */
+
+ Status = AcpiUtExecute_Sxds (Node, Info->HighestDstates);
+ if (ACPI_SUCCESS (Status))
+ {
+ Info->Valid |= ACPI_VALID_SXDS;
+ }
+ }
+
+ /* Validate/Allocate/Clear caller buffer */
+
+ Status = AcpiUtInitializeBuffer (Buffer, Size);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /* Populate the return buffer */
+
+ ReturnInfo = Buffer->Pointer;
+ ACPI_MEMCPY (ReturnInfo, Info, sizeof (ACPI_DEVICE_INFO));
+
+ if (CidList)
+ {
+ ACPI_MEMCPY (&ReturnInfo->CompatibilityId, CidList, CidList->Size);
+ }
+
+
+Cleanup:
+ ACPI_FREE (Info);
+ if (CidList)
+ {
+ ACPI_FREE (CidList);
+ }
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetObjectInfo)
+
diff --git a/sys/contrib/dev/acpica/nsxfobj.c b/sys/contrib/dev/acpica/nsxfobj.c
new file mode 100644
index 0000000..3277379
--- /dev/null
+++ b/sys/contrib/dev/acpica/nsxfobj.c
@@ -0,0 +1,356 @@
+/*******************************************************************************
+ *
+ * Module Name: nsxfobj - Public interfaces to the ACPI subsystem
+ * ACPI Object oriented interfaces
+ * $Revision: 1.122 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __NSXFOBJ_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_NAMESPACE
+ ACPI_MODULE_NAME ("nsxfobj")
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetType
+ *
+ * PARAMETERS: Handle - Handle of object whose type is desired
+ * RetType - Where the type will be placed
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This routine returns the type associatd with a particular handle
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetType (
+ ACPI_HANDLE Handle,
+ ACPI_OBJECT_TYPE *RetType)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ /* Parameter Validation */
+
+ if (!RetType)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Special case for the predefined Root Node
+ * (return type ANY)
+ */
+ if (Handle == ACPI_ROOT_OBJECT)
+ {
+ *RetType = ACPI_TYPE_ANY;
+ return (AE_OK);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Convert and validate the handle */
+
+ Node = AcpiNsMapHandleToNode (Handle);
+ if (!Node)
+ {
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return (AE_BAD_PARAMETER);
+ }
+
+ *RetType = Node->Type;
+
+
+ Status = AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetType)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetParent
+ *
+ * PARAMETERS: Handle - Handle of object whose parent is desired
+ * RetHandle - Where the parent handle will be placed
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Returns a handle to the parent of the object represented by
+ * Handle.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetParent (
+ ACPI_HANDLE Handle,
+ ACPI_HANDLE *RetHandle)
+{
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+
+
+ if (!RetHandle)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Special case for the predefined Root Node (no parent) */
+
+ if (Handle == ACPI_ROOT_OBJECT)
+ {
+ return (AE_NULL_ENTRY);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Convert and validate the handle */
+
+ Node = AcpiNsMapHandleToNode (Handle);
+ if (!Node)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+
+ /* Get the parent entry */
+
+ *RetHandle =
+ AcpiNsConvertEntryToHandle (AcpiNsGetParentNode (Node));
+
+ /* Return exception if parent is null */
+
+ if (!AcpiNsGetParentNode (Node))
+ {
+ Status = AE_NULL_ENTRY;
+ }
+
+
+UnlockAndExit:
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetParent)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetNextObject
+ *
+ * PARAMETERS: Type - Type of object to be searched for
+ * Parent - Parent object whose children we are getting
+ * LastChild - Previous child that was found.
+ * The NEXT child will be returned
+ * RetHandle - Where handle to the next object is placed
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Return the next peer object within the namespace. If Handle is
+ * valid, Scope is ignored. Otherwise, the first object within
+ * Scope is returned.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetNextObject (
+ ACPI_OBJECT_TYPE Type,
+ ACPI_HANDLE Parent,
+ ACPI_HANDLE Child,
+ ACPI_HANDLE *RetHandle)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_NAMESPACE_NODE *ParentNode = NULL;
+ ACPI_NAMESPACE_NODE *ChildNode = NULL;
+
+
+ /* Parameter validation */
+
+ if (Type > ACPI_TYPE_EXTERNAL_MAX)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* If null handle, use the parent */
+
+ if (!Child)
+ {
+ /* Start search at the beginning of the specified scope */
+
+ ParentNode = AcpiNsMapHandleToNode (Parent);
+ if (!ParentNode)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+ }
+ else
+ {
+ /* Non-null handle, ignore the parent */
+ /* Convert and validate the handle */
+
+ ChildNode = AcpiNsMapHandleToNode (Child);
+ if (!ChildNode)
+ {
+ Status = AE_BAD_PARAMETER;
+ goto UnlockAndExit;
+ }
+ }
+
+ /* Internal function does the real work */
+
+ Node = AcpiNsGetNextNode (Type, ParentNode, ChildNode);
+ if (!Node)
+ {
+ Status = AE_NOT_FOUND;
+ goto UnlockAndExit;
+ }
+
+ if (RetHandle)
+ {
+ *RetHandle = AcpiNsConvertEntryToHandle (Node);
+ }
+
+
+UnlockAndExit:
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetNextObject)
+
diff --git a/sys/contrib/dev/acpica/osunixxf.c b/sys/contrib/dev/acpica/osunixxf.c
new file mode 100644
index 0000000..8fc21fc
--- /dev/null
+++ b/sys/contrib/dev/acpica/osunixxf.c
@@ -0,0 +1,1155 @@
+/******************************************************************************
+ *
+ * Module Name: osunixxf - UNIX OSL interfaces
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+/*
+ * These interfaces are required in order to compile the ASL compiler under
+ * Linux.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stdarg.h>
+#include <unistd.h>
+#include <sys/time.h>
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acdebug.h>
+
+#define _COMPONENT ACPI_OS_SERVICES
+ ACPI_MODULE_NAME ("osunixxf")
+
+
+extern FILE *AcpiGbl_DebugFile;
+FILE *AcpiGbl_OutputFile;
+
+ACPI_PHYSICAL_ADDRESS
+AeLocalGetRootPointer (
+ void);
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsInitialize, AcpiOsTerminate
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Init and terminate. Nothing to do.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsInitialize (void)
+{
+ AcpiGbl_OutputFile = stdout;
+
+ return AE_OK;
+}
+
+
+ACPI_STATUS
+AcpiOsTerminate (void)
+{
+ return AE_OK;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsGetRootPointer
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: RSDP physical address
+ *
+ * DESCRIPTION: Gets the root pointer (RSDP)
+ *
+ *****************************************************************************/
+
+ACPI_PHYSICAL_ADDRESS
+AcpiOsGetRootPointer (
+ void)
+{
+
+ return (AeLocalGetRootPointer ());
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsPredefinedOverride
+ *
+ * PARAMETERS: InitVal - Initial value of the predefined object
+ * NewVal - The new value for the object
+ *
+ * RETURN: Status, pointer to value. Null pointer returned if not
+ * overriding.
+ *
+ * DESCRIPTION: Allow the OS to override predefined names
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsPredefinedOverride (
+ const ACPI_PREDEFINED_NAMES *InitVal,
+ ACPI_STRING *NewVal)
+{
+
+ if (!InitVal || !NewVal)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ *NewVal = NULL;
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsTableOverride
+ *
+ * PARAMETERS: ExistingTable - Header of current table (probably firmware)
+ * NewTable - Where an entire new table is returned.
+ *
+ * RETURN: Status, pointer to new table. Null pointer returned if no
+ * table is available to override
+ *
+ * DESCRIPTION: Return a different version of a table if one is available
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsTableOverride (
+ ACPI_TABLE_HEADER *ExistingTable,
+ ACPI_TABLE_HEADER **NewTable)
+{
+
+ if (!ExistingTable || !NewTable)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ *NewTable = NULL;
+
+#ifdef ACPI_EXEC_APP
+
+ /* This code exercises the table override mechanism in the core */
+
+ if (ACPI_COMPARE_NAME (ExistingTable->Signature, ACPI_SIG_DSDT))
+ {
+ /* override DSDT with itself */
+
+ *NewTable = AcpiGbl_DbTablePtr;
+ }
+ return (AE_OK);
+#else
+ return AE_NO_ACPI_TABLES;
+#endif
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsReadable
+ *
+ * PARAMETERS: Pointer - Area to be verified
+ * Length - Size of area
+ *
+ * RETURN: TRUE if readable for entire length
+ *
+ * DESCRIPTION: Verify that a pointer is valid for reading
+ *
+ *****************************************************************************/
+
+BOOLEAN
+AcpiOsReadable (
+ void *Pointer,
+ ACPI_SIZE Length)
+{
+
+ return (TRUE);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsWritable
+ *
+ * PARAMETERS: Pointer - Area to be verified
+ * Length - Size of area
+ *
+ * RETURN: TRUE if writable for entire length
+ *
+ * DESCRIPTION: Verify that a pointer is valid for writing
+ *
+ *****************************************************************************/
+
+BOOLEAN
+AcpiOsWritable (
+ void *Pointer,
+ ACPI_SIZE Length)
+{
+
+ return (TRUE);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsRedirectOutput
+ *
+ * PARAMETERS: Destination - An open file handle/pointer
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Causes redirect of AcpiOsPrintf and AcpiOsVprintf
+ *
+ *****************************************************************************/
+
+void
+AcpiOsRedirectOutput (
+ void *Destination)
+{
+
+ AcpiGbl_OutputFile = Destination;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsPrintf
+ *
+ * PARAMETERS: fmt, ... Standard printf format
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Formatted output
+ *
+ *****************************************************************************/
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiOsPrintf (
+ const char *Fmt,
+ ...)
+{
+ va_list Args;
+
+
+ va_start (Args, Fmt);
+
+ AcpiOsVprintf (Fmt, Args);
+
+ va_end (Args);
+ return;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsVprintf
+ *
+ * PARAMETERS: fmt Standard printf format
+ * args Argument list
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Formatted output with argument list pointer
+ *
+ *****************************************************************************/
+
+void
+AcpiOsVprintf (
+ const char *Fmt,
+ va_list Args)
+{
+ INT32 Count = 0;
+ UINT8 Flags;
+
+
+ Flags = AcpiGbl_DbOutputFlags;
+ if (Flags & ACPI_DB_REDIRECTABLE_OUTPUT)
+ {
+ /* Output is directable to either a file (if open) or the console */
+
+ if (AcpiGbl_DebugFile)
+ {
+ /* Output file is open, send the output there */
+
+ Count = vfprintf (AcpiGbl_DebugFile, Fmt, Args);
+ }
+ else
+ {
+ /* No redirection, send output to console (once only!) */
+
+ Flags |= ACPI_DB_CONSOLE_OUTPUT;
+ }
+ }
+
+ if (Flags & ACPI_DB_CONSOLE_OUTPUT)
+ {
+ Count = vfprintf (AcpiGbl_OutputFile, Fmt, Args);
+ }
+
+ return;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsGetLine
+ *
+ * PARAMETERS: fmt Standard printf format
+ * args Argument list
+ *
+ * RETURN: Actual bytes read
+ *
+ * DESCRIPTION: Formatted input with argument list pointer
+ *
+ *****************************************************************************/
+
+UINT32
+AcpiOsGetLine (
+ char *Buffer)
+{
+ UINT8 Temp;
+ UINT32 i;
+
+
+ for (i = 0; ; i++)
+ {
+ scanf ("%1c", &Temp);
+ if (!Temp || Temp == '\n')
+ {
+ break;
+ }
+
+ Buffer [i] = Temp;
+ }
+
+ /* Null terminate the buffer */
+
+ Buffer [i] = 0;
+
+ /* Return the number of bytes in the string */
+
+ return (i);
+}
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsMapMemory
+ *
+ * PARAMETERS: where Physical address of memory to be mapped
+ * length How much memory to map
+ *
+ * RETURN: Pointer to mapped memory. Null on error.
+ *
+ * DESCRIPTION: Map physical memory into caller's address space
+ *
+ *****************************************************************************/
+
+void *
+AcpiOsMapMemory (
+ ACPI_PHYSICAL_ADDRESS where,
+ ACPI_SIZE length)
+{
+
+ return (ACPI_TO_POINTER ((ACPI_NATIVE_UINT) where));
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsUnmapMemory
+ *
+ * PARAMETERS: where Logical address of memory to be unmapped
+ * length How much memory to unmap
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Delete a previously created mapping. Where and Length must
+ * correspond to a previous mapping exactly.
+ *
+ *****************************************************************************/
+
+void
+AcpiOsUnmapMemory (
+ void *where,
+ ACPI_SIZE length)
+{
+
+ return;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsAllocate
+ *
+ * PARAMETERS: Size Amount to allocate, in bytes
+ *
+ * RETURN: Pointer to the new allocation. Null on error.
+ *
+ * DESCRIPTION: Allocate memory. Algorithm is dependent on the OS.
+ *
+ *****************************************************************************/
+
+void *
+AcpiOsAllocate (
+ ACPI_SIZE size)
+{
+ void *Mem;
+
+
+ Mem = (void *) malloc ((size_t) size);
+
+ return Mem;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsFree
+ *
+ * PARAMETERS: mem Pointer to previously allocated memory
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Free memory allocated via AcpiOsAllocate
+ *
+ *****************************************************************************/
+
+void
+AcpiOsFree (
+ void *mem)
+{
+
+
+ free (mem);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsCreateSemaphore
+ *
+ * PARAMETERS: InitialUnits - Units to be assigned to the new semaphore
+ * OutHandle - Where a handle will be returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create an OS semaphore
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsCreateSemaphore (
+ UINT32 MaxUnits,
+ UINT32 InitialUnits,
+ ACPI_HANDLE *OutHandle)
+{
+
+
+ *OutHandle = (ACPI_HANDLE) 1;
+ return AE_OK;
+}
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsDeleteSemaphore
+ *
+ * PARAMETERS: Handle - Handle returned by AcpiOsCreateSemaphore
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Delete an OS semaphore
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsDeleteSemaphore (
+ ACPI_HANDLE Handle)
+{
+
+ if (!Handle)
+ {
+ return AE_BAD_PARAMETER;
+ }
+
+ return AE_OK;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsWaitSemaphore
+ *
+ * PARAMETERS: Handle - Handle returned by AcpiOsCreateSemaphore
+ * Units - How many units to wait for
+ * Timeout - How long to wait
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Wait for units
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsWaitSemaphore (
+ ACPI_HANDLE Handle,
+ UINT32 Units,
+ UINT16 Timeout)
+{
+
+
+ return AE_OK;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsSignalSemaphore
+ *
+ * PARAMETERS: Handle - Handle returned by AcpiOsCreateSemaphore
+ * Units - Number of units to send
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Send units
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsSignalSemaphore (
+ ACPI_HANDLE Handle,
+ UINT32 Units)
+{
+
+
+ return AE_OK;
+}
+
+
+ACPI_STATUS
+AcpiOsCreateLock (
+ ACPI_SPINLOCK *OutHandle)
+{
+
+ return (AcpiOsCreateSemaphore (1, 1, OutHandle));
+}
+
+void
+AcpiOsDeleteLock (
+ ACPI_SPINLOCK Handle)
+{
+ AcpiOsDeleteSemaphore (Handle);
+}
+
+
+ACPI_CPU_FLAGS
+AcpiOsAcquireLock (
+ ACPI_HANDLE Handle)
+{
+ AcpiOsWaitSemaphore (Handle, 1, 0xFFFF);
+ return (0);
+}
+
+
+void
+AcpiOsReleaseLock (
+ ACPI_SPINLOCK Handle,
+ ACPI_CPU_FLAGS Flags)
+{
+ AcpiOsSignalSemaphore (Handle, 1);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsInstallInterruptHandler
+ *
+ * PARAMETERS: InterruptNumber Level handler should respond to.
+ * Isr Address of the ACPI interrupt handler
+ * ExceptPtr Where status is returned
+ *
+ * RETURN: Handle to the newly installed handler.
+ *
+ * DESCRIPTION: Install an interrupt handler. Used to install the ACPI
+ * OS-independent handler.
+ *
+ *****************************************************************************/
+
+UINT32
+AcpiOsInstallInterruptHandler (
+ UINT32 InterruptNumber,
+ ACPI_OSD_HANDLER ServiceRoutine,
+ void *Context)
+{
+
+
+ return AE_OK;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsRemoveInterruptHandler
+ *
+ * PARAMETERS: Handle Returned when handler was installed
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Uninstalls an interrupt handler.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsRemoveInterruptHandler (
+ UINT32 InterruptNumber,
+ ACPI_OSD_HANDLER ServiceRoutine)
+{
+
+ return AE_OK;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsExecute
+ *
+ * PARAMETERS: Type - Type of execution
+ * Function - Address of the function to execute
+ * Context - Passed as a parameter to the function
+ *
+ * RETURN: Status.
+ *
+ * DESCRIPTION: Execute a new thread
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsExecute (
+ ACPI_EXECUTE_TYPE Type,
+ ACPI_OSD_EXEC_CALLBACK Function,
+ void *Context)
+{
+
+// _beginthread (Function, (unsigned) 0, Context);
+ return 0;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsBreakpoint
+ *
+ * PARAMETERS: Msg Message to print
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Print a message and break to the debugger.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsBreakpoint (
+ char *Msg)
+{
+
+ if (Msg)
+ {
+ AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Msg);
+ }
+ else
+ {
+ AcpiOsPrintf ("At AcpiOsBreakpoint ****\n");
+ }
+
+ return AE_OK;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsStall
+ *
+ * PARAMETERS: microseconds To sleep
+ *
+ * RETURN: Blocks until sleep is completed.
+ *
+ * DESCRIPTION: Sleep at microsecond granularity
+ *
+ *****************************************************************************/
+
+void
+AcpiOsStall (
+ UINT32 microseconds)
+{
+
+ if (microseconds)
+ {
+ usleep (microseconds);
+ }
+ return;
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsSleep
+ *
+ * PARAMETERS: milliseconds To sleep
+ *
+ * RETURN: Blocks until sleep is completed.
+ *
+ * DESCRIPTION: Sleep at millisecond granularity
+ *
+ *****************************************************************************/
+
+void
+AcpiOsSleep (
+ ACPI_INTEGER milliseconds)
+{
+
+ sleep (milliseconds / 1000); /* Sleep for whole seconds */
+
+ /*
+ * Arg to usleep() must be less than 1,000,000 (1 second)
+ */
+ usleep ((milliseconds % 1000) * 1000); /* Sleep for remaining usecs */
+
+ return;
+}
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsGetTimer
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Current time in 100 nanosecond units
+ *
+ * DESCRIPTION: Get the current system time
+ *
+ *****************************************************************************/
+
+UINT64
+AcpiOsGetTimer (void)
+{
+ struct timeval time;
+
+ gettimeofday(&time, NULL);
+
+ /* Seconds * 10^7 = 100ns(10^-7), Microseconds(10^-6) * 10^1 = 100ns */
+
+ return (((UINT64) time.tv_sec * 10000000) + ((UINT64) time.tv_usec * 10));
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsValidateInterface
+ *
+ * PARAMETERS: Interface - Requested interface to be validated
+ *
+ * RETURN: AE_OK if interface is supported, AE_SUPPORT otherwise
+ *
+ * DESCRIPTION: Match an interface string to the interfaces supported by the
+ * host. Strings originate from an AML call to the _OSI method.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsValidateInterface (
+ char *Interface)
+{
+
+ return (AE_SUPPORT);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsValidateAddress
+ *
+ * PARAMETERS: SpaceId - ACPI space ID
+ * Address - Physical address
+ * Length - Address length
+ *
+ * RETURN: AE_OK if Address/Length is valid for the SpaceId. Otherwise,
+ * should return AE_AML_ILLEGAL_ADDRESS.
+ *
+ * DESCRIPTION: Validate a system address via the host OS. Used to validate
+ * the addresses accessed by AML operation regions.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsValidateAddress (
+ UINT8 SpaceId,
+ ACPI_PHYSICAL_ADDRESS Address,
+ ACPI_SIZE Length)
+{
+
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsReadPciConfiguration
+ *
+ * PARAMETERS: PciId Seg/Bus/Dev
+ * Register Device Register
+ * Value Buffer where value is placed
+ * Width Number of bits
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Read data from PCI configuration space
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsReadPciConfiguration (
+ ACPI_PCI_ID *PciId,
+ UINT32 Register,
+ void *Value,
+ UINT32 Width)
+{
+
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsWritePciConfiguration
+ *
+ * PARAMETERS: PciId Seg/Bus/Dev
+ * Register Device Register
+ * Value Value to be written
+ * Width Number of bits
+ *
+ * RETURN: Status.
+ *
+ * DESCRIPTION: Write data to PCI configuration space
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsWritePciConfiguration (
+ ACPI_PCI_ID *PciId,
+ UINT32 Register,
+ ACPI_INTEGER Value,
+ UINT32 Width)
+{
+
+ return (AE_OK);
+}
+
+/* TEMPORARY STUB FUNCTION */
+void
+AcpiOsDerivePciId(
+ ACPI_HANDLE rhandle,
+ ACPI_HANDLE chandle,
+ ACPI_PCI_ID **PciId)
+{
+
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsReadPort
+ *
+ * PARAMETERS: Address Address of I/O port/register to read
+ * Value Where value is placed
+ * Width Number of bits
+ *
+ * RETURN: Value read from port
+ *
+ * DESCRIPTION: Read data from an I/O port or register
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsReadPort (
+ ACPI_IO_ADDRESS Address,
+ UINT32 *Value,
+ UINT32 Width)
+{
+
+ switch (Width)
+ {
+ case 8:
+ *Value = 0xFF;
+ break;
+
+ case 16:
+ *Value = 0xFFFF;
+ break;
+
+ case 32:
+ *Value = 0xFFFFFFFF;
+ break;
+ }
+
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsWritePort
+ *
+ * PARAMETERS: Address Address of I/O port/register to write
+ * Value Value to write
+ * Width Number of bits
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Write data to an I/O port or register
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsWritePort (
+ ACPI_IO_ADDRESS Address,
+ UINT32 Value,
+ UINT32 Width)
+{
+
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsReadMemory
+ *
+ * PARAMETERS: Address Physical Memory Address to read
+ * Value Where value is placed
+ * Width Number of bits
+ *
+ * RETURN: Value read from physical memory address
+ *
+ * DESCRIPTION: Read data from a physical memory address
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsReadMemory (
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 *Value,
+ UINT32 Width)
+{
+
+ switch (Width)
+ {
+ case 8:
+ case 16:
+ case 32:
+ *Value = 0;
+ break;
+
+ default:
+ return (AE_BAD_PARAMETER);
+ break;
+ }
+ return (AE_OK);
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsWriteMemory
+ *
+ * PARAMETERS: Address Physical Memory Address to write
+ * Value Value to write
+ * Width Number of bits
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Write data to a physical memory address
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsWriteMemory (
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT32 Value,
+ UINT32 Width)
+{
+
+ return (AE_OK);
+}
+
+
+ACPI_THREAD_ID
+AcpiOsGetThreadId(void)
+{
+ return getpid();
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiOsSignal
+ *
+ * PARAMETERS: Function ACPI CA signal function code
+ * Info Pointer to function-dependent structure
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Miscellaneous functions
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiOsSignal (
+ UINT32 Function,
+ void *Info)
+{
+
+ switch (Function)
+ {
+ case ACPI_SIGNAL_FATAL:
+ break;
+
+ case ACPI_SIGNAL_BREAKPOINT:
+
+ if (Info)
+ {
+ AcpiOsPrintf ("AcpiOsBreakpoint: %s ****\n", Info);
+ }
+ else
+ {
+ AcpiOsPrintf ("At AcpiOsBreakpoint ****\n");
+ }
+
+ break;
+ }
+
+
+ return (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/psargs.c b/sys/contrib/dev/acpica/psargs.c
new file mode 100644
index 0000000..3c39919
--- /dev/null
+++ b/sys/contrib/dev/acpica/psargs.c
@@ -0,0 +1,869 @@
+/******************************************************************************
+ *
+ * Module Name: psargs - Parse AML opcode arguments
+ * $Revision: 1.92 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __PSARGS_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdispat.h>
+
+#define _COMPONENT ACPI_PARSER
+ ACPI_MODULE_NAME ("psargs")
+
+/* Local prototypes */
+
+static UINT32
+AcpiPsGetNextPackageLength (
+ ACPI_PARSE_STATE *ParserState);
+
+static ACPI_PARSE_OBJECT *
+AcpiPsGetNextField (
+ ACPI_PARSE_STATE *ParserState);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetNextPackageLength
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ *
+ * RETURN: Decoded package length. On completion, the AML pointer points
+ * past the length byte or bytes.
+ *
+ * DESCRIPTION: Decode and return a package length field.
+ * Note: Largest package length is 28 bits, from ACPI specification
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiPsGetNextPackageLength (
+ ACPI_PARSE_STATE *ParserState)
+{
+ UINT8 *Aml = ParserState->Aml;
+ UINT32 PackageLength = 0;
+ ACPI_NATIVE_UINT ByteCount;
+ UINT8 ByteZeroMask = 0x3F; /* Default [0:5] */
+
+
+ ACPI_FUNCTION_TRACE (PsGetNextPackageLength);
+
+
+ /*
+ * Byte 0 bits [6:7] contain the number of additional bytes
+ * used to encode the package length, either 0,1,2, or 3
+ */
+ ByteCount = (Aml[0] >> 6);
+ ParserState->Aml += (ByteCount + 1);
+
+ /* Get bytes 3, 2, 1 as needed */
+
+ while (ByteCount)
+ {
+ /*
+ * Final bit positions for the package length bytes:
+ * Byte3->[20:27]
+ * Byte2->[12:19]
+ * Byte1->[04:11]
+ * Byte0->[00:03]
+ */
+ PackageLength |= (Aml[ByteCount] << ((ByteCount << 3) - 4));
+
+ ByteZeroMask = 0x0F; /* Use bits [0:3] of byte 0 */
+ ByteCount--;
+ }
+
+ /* Byte 0 is a special case, either bits [0:3] or [0:5] are used */
+
+ PackageLength |= (Aml[0] & ByteZeroMask);
+ return_UINT32 (PackageLength);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetNextPackageEnd
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ *
+ * RETURN: Pointer to end-of-package +1
+ *
+ * DESCRIPTION: Get next package length and return a pointer past the end of
+ * the package. Consumes the package length field
+ *
+ ******************************************************************************/
+
+UINT8 *
+AcpiPsGetNextPackageEnd (
+ ACPI_PARSE_STATE *ParserState)
+{
+ UINT8 *Start = ParserState->Aml;
+ UINT32 PackageLength;
+
+
+ ACPI_FUNCTION_TRACE (PsGetNextPackageEnd);
+
+
+ /* Function below updates ParserState->Aml */
+
+ PackageLength = AcpiPsGetNextPackageLength (ParserState);
+
+ return_PTR (Start + PackageLength); /* end of package */
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetNextNamestring
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ *
+ * RETURN: Pointer to the start of the name string (pointer points into
+ * the AML.
+ *
+ * DESCRIPTION: Get next raw namestring within the AML stream. Handles all name
+ * prefix characters. Set parser state to point past the string.
+ * (Name is consumed from the AML.)
+ *
+ ******************************************************************************/
+
+char *
+AcpiPsGetNextNamestring (
+ ACPI_PARSE_STATE *ParserState)
+{
+ UINT8 *Start = ParserState->Aml;
+ UINT8 *End = ParserState->Aml;
+
+
+ ACPI_FUNCTION_TRACE (PsGetNextNamestring);
+
+
+ /* Point past any namestring prefix characters (backslash or carat) */
+
+ while (AcpiPsIsPrefixChar (*End))
+ {
+ End++;
+ }
+
+ /* Decode the path prefix character */
+
+ switch (*End)
+ {
+ case 0:
+
+ /* NullName */
+
+ if (End == Start)
+ {
+ Start = NULL;
+ }
+ End++;
+ break;
+
+ case AML_DUAL_NAME_PREFIX:
+
+ /* Two name segments */
+
+ End += 1 + (2 * ACPI_NAME_SIZE);
+ break;
+
+ case AML_MULTI_NAME_PREFIX_OP:
+
+ /* Multiple name segments, 4 chars each, count in next byte */
+
+ End += 2 + (*(End + 1) * ACPI_NAME_SIZE);
+ break;
+
+ default:
+
+ /* Single name segment */
+
+ End += ACPI_NAME_SIZE;
+ break;
+ }
+
+ ParserState->Aml = End;
+ return_PTR ((char *) Start);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetNextNamepath
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ * Arg - Where the namepath will be stored
+ * ArgCount - If the namepath points to a control method
+ * the method's argument is returned here.
+ * PossibleMethodCall - Whether the namepath can possibly be the
+ * start of a method call
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get next name (if method call, return # of required args).
+ * Names are looked up in the internal namespace to determine
+ * if the name represents a control method. If a method
+ * is found, the number of arguments to the method is returned.
+ * This information is critical for parsing to continue correctly.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiPsGetNextNamepath (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_STATE *ParserState,
+ ACPI_PARSE_OBJECT *Arg,
+ BOOLEAN PossibleMethodCall)
+{
+ char *Path;
+ ACPI_PARSE_OBJECT *NameOp;
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *MethodDesc;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_GENERIC_STATE ScopeInfo;
+
+
+ ACPI_FUNCTION_TRACE (PsGetNextNamepath);
+
+
+ Path = AcpiPsGetNextNamestring (ParserState);
+ AcpiPsInitOp (Arg, AML_INT_NAMEPATH_OP);
+
+ /* Null path case is allowed, just exit */
+
+ if (!Path)
+ {
+ Arg->Common.Value.Name = Path;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Setup search scope info */
+
+ ScopeInfo.Scope.Node = NULL;
+ Node = ParserState->StartNode;
+ if (Node)
+ {
+ ScopeInfo.Scope.Node = Node;
+ }
+
+ /*
+ * Lookup the name in the internal namespace. We don't want to add
+ * anything new to the namespace here, however, so we use MODE_EXECUTE.
+ * Allow searching of the parent tree, but don't open a new scope -
+ * we just want to lookup the object (must be mode EXECUTE to perform
+ * the upsearch)
+ */
+ Status = AcpiNsLookup (&ScopeInfo, Path, ACPI_TYPE_ANY, ACPI_IMODE_EXECUTE,
+ ACPI_NS_SEARCH_PARENT | ACPI_NS_DONT_OPEN_SCOPE, NULL, &Node);
+
+ /*
+ * If this name is a control method invocation, we must
+ * setup the method call
+ */
+ if (ACPI_SUCCESS (Status) &&
+ PossibleMethodCall &&
+ (Node->Type == ACPI_TYPE_METHOD))
+ {
+ /* This name is actually a control method invocation */
+
+ MethodDesc = AcpiNsGetAttachedObject (Node);
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "Control Method - %p Desc %p Path=%p\n", Node, MethodDesc, Path));
+
+ NameOp = AcpiPsAllocOp (AML_INT_NAMEPATH_OP);
+ if (!NameOp)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Change Arg into a METHOD CALL and attach name to it */
+
+ AcpiPsInitOp (Arg, AML_INT_METHODCALL_OP);
+ NameOp->Common.Value.Name = Path;
+
+ /* Point METHODCALL/NAME to the METHOD Node */
+
+ NameOp->Common.Node = Node;
+ AcpiPsAppendArg (Arg, NameOp);
+
+ if (!MethodDesc)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Control Method %p has no attached object",
+ Node));
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "Control Method - %p Args %X\n",
+ Node, MethodDesc->Method.ParamCount));
+
+ /* Get the number of arguments to expect */
+
+ WalkState->ArgCount = MethodDesc->Method.ParamCount;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Special handling if the name was not found during the lookup -
+ * some NotFound cases are allowed
+ */
+ if (Status == AE_NOT_FOUND)
+ {
+ /* 1) NotFound is ok during load pass 1/2 (allow forward references) */
+
+ if ((WalkState->ParseFlags & ACPI_PARSE_MODE_MASK) !=
+ ACPI_PARSE_EXECUTE)
+ {
+ Status = AE_OK;
+ }
+
+ /* 2) NotFound during a CondRefOf(x) is ok by definition */
+
+ else if (WalkState->Op->Common.AmlOpcode == AML_COND_REF_OF_OP)
+ {
+ Status = AE_OK;
+ }
+
+ /*
+ * 3) NotFound while building a Package is ok at this point, we
+ * may flag as an error later if slack mode is not enabled.
+ * (Some ASL code depends on allowing this behavior)
+ */
+ else if ((Arg->Common.Parent) &&
+ ((Arg->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+ (Arg->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP)))
+ {
+ Status = AE_OK;
+ }
+ }
+
+ /* Final exception check (may have been changed from code above) */
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_ERROR_NAMESPACE (Path, Status);
+
+ if ((WalkState->ParseFlags & ACPI_PARSE_MODE_MASK) ==
+ ACPI_PARSE_EXECUTE)
+ {
+ /* Report a control method execution error */
+
+ Status = AcpiDsMethodError (Status, WalkState);
+ }
+ }
+
+ /* Save the namepath */
+
+ Arg->Common.Value.Name = Path;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetNextSimpleArg
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ * ArgType - The argument type (AML_*_ARG)
+ * Arg - Where the argument is returned
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Get the next simple argument (constant, string, or namestring)
+ *
+ ******************************************************************************/
+
+void
+AcpiPsGetNextSimpleArg (
+ ACPI_PARSE_STATE *ParserState,
+ UINT32 ArgType,
+ ACPI_PARSE_OBJECT *Arg)
+{
+ UINT32 Length;
+ UINT16 Opcode;
+ UINT8 *Aml = ParserState->Aml;
+
+
+ ACPI_FUNCTION_TRACE_U32 (PsGetNextSimpleArg, ArgType);
+
+
+ switch (ArgType)
+ {
+ case ARGP_BYTEDATA:
+
+ /* Get 1 byte from the AML stream */
+
+ Opcode = AML_BYTE_OP;
+ Arg->Common.Value.Integer = (ACPI_INTEGER) *Aml;
+ Length = 1;
+ break;
+
+
+ case ARGP_WORDDATA:
+
+ /* Get 2 bytes from the AML stream */
+
+ Opcode = AML_WORD_OP;
+ ACPI_MOVE_16_TO_64 (&Arg->Common.Value.Integer, Aml);
+ Length = 2;
+ break;
+
+
+ case ARGP_DWORDDATA:
+
+ /* Get 4 bytes from the AML stream */
+
+ Opcode = AML_DWORD_OP;
+ ACPI_MOVE_32_TO_64 (&Arg->Common.Value.Integer, Aml);
+ Length = 4;
+ break;
+
+
+ case ARGP_QWORDDATA:
+
+ /* Get 8 bytes from the AML stream */
+
+ Opcode = AML_QWORD_OP;
+ ACPI_MOVE_64_TO_64 (&Arg->Common.Value.Integer, Aml);
+ Length = 8;
+ break;
+
+
+ case ARGP_CHARLIST:
+
+ /* Get a pointer to the string, point past the string */
+
+ Opcode = AML_STRING_OP;
+ Arg->Common.Value.String = ACPI_CAST_PTR (char, Aml);
+
+ /* Find the null terminator */
+
+ Length = 0;
+ while (Aml[Length])
+ {
+ Length++;
+ }
+ Length++;
+ break;
+
+
+ case ARGP_NAME:
+ case ARGP_NAMESTRING:
+
+ AcpiPsInitOp (Arg, AML_INT_NAMEPATH_OP);
+ Arg->Common.Value.Name = AcpiPsGetNextNamestring (ParserState);
+ return_VOID;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Invalid ArgType %X", ArgType));
+ return_VOID;
+ }
+
+ AcpiPsInitOp (Arg, Opcode);
+ ParserState->Aml += Length;
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetNextField
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ *
+ * RETURN: A newly allocated FIELD op
+ *
+ * DESCRIPTION: Get next field (NamedField, ReservedField, or AccessField)
+ *
+ ******************************************************************************/
+
+static ACPI_PARSE_OBJECT *
+AcpiPsGetNextField (
+ ACPI_PARSE_STATE *ParserState)
+{
+ UINT32 AmlOffset = (UINT32)
+ ACPI_PTR_DIFF (ParserState->Aml,
+ ParserState->AmlStart);
+ ACPI_PARSE_OBJECT *Field;
+ UINT16 Opcode;
+ UINT32 Name;
+
+
+ ACPI_FUNCTION_TRACE (PsGetNextField);
+
+
+ /* Determine field type */
+
+ switch (ACPI_GET8 (ParserState->Aml))
+ {
+ default:
+
+ Opcode = AML_INT_NAMEDFIELD_OP;
+ break;
+
+ case 0x00:
+
+ Opcode = AML_INT_RESERVEDFIELD_OP;
+ ParserState->Aml++;
+ break;
+
+ case 0x01:
+
+ Opcode = AML_INT_ACCESSFIELD_OP;
+ ParserState->Aml++;
+ break;
+ }
+
+ /* Allocate a new field op */
+
+ Field = AcpiPsAllocOp (Opcode);
+ if (!Field)
+ {
+ return_PTR (NULL);
+ }
+
+ Field->Common.AmlOffset = AmlOffset;
+
+ /* Decode the field type */
+
+ switch (Opcode)
+ {
+ case AML_INT_NAMEDFIELD_OP:
+
+ /* Get the 4-character name */
+
+ ACPI_MOVE_32_TO_32 (&Name, ParserState->Aml);
+ AcpiPsSetName (Field, Name);
+ ParserState->Aml += ACPI_NAME_SIZE;
+
+ /* Get the length which is encoded as a package length */
+
+ Field->Common.Value.Size = AcpiPsGetNextPackageLength (ParserState);
+ break;
+
+
+ case AML_INT_RESERVEDFIELD_OP:
+
+ /* Get the length which is encoded as a package length */
+
+ Field->Common.Value.Size = AcpiPsGetNextPackageLength (ParserState);
+ break;
+
+
+ case AML_INT_ACCESSFIELD_OP:
+
+ /*
+ * Get AccessType and AccessAttrib and merge into the field Op
+ * AccessType is first operand, AccessAttribute is second
+ */
+ Field->Common.Value.Integer = (((UINT32) ACPI_GET8 (ParserState->Aml) << 8));
+ ParserState->Aml++;
+ Field->Common.Value.Integer |= ACPI_GET8 (ParserState->Aml);
+ ParserState->Aml++;
+ break;
+
+ default:
+
+ /* Opcode was set in previous switch */
+ break;
+ }
+
+ return_PTR (Field);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetNextArg
+ *
+ * PARAMETERS: WalkState - Current state
+ * ParserState - Current parser state object
+ * ArgType - The argument type (AML_*_ARG)
+ * ReturnArg - Where the next arg is returned
+ *
+ * RETURN: Status, and an op object containing the next argument.
+ *
+ * DESCRIPTION: Get next argument (including complex list arguments that require
+ * pushing the parser stack)
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiPsGetNextArg (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_STATE *ParserState,
+ UINT32 ArgType,
+ ACPI_PARSE_OBJECT **ReturnArg)
+{
+ ACPI_PARSE_OBJECT *Arg = NULL;
+ ACPI_PARSE_OBJECT *Prev = NULL;
+ ACPI_PARSE_OBJECT *Field;
+ UINT32 Subop;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsGetNextArg, ParserState);
+
+
+ switch (ArgType)
+ {
+ case ARGP_BYTEDATA:
+ case ARGP_WORDDATA:
+ case ARGP_DWORDDATA:
+ case ARGP_CHARLIST:
+ case ARGP_NAME:
+ case ARGP_NAMESTRING:
+
+ /* Constants, strings, and namestrings are all the same size */
+
+ Arg = AcpiPsAllocOp (AML_BYTE_OP);
+ if (!Arg)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+ AcpiPsGetNextSimpleArg (ParserState, ArgType, Arg);
+ break;
+
+
+ case ARGP_PKGLENGTH:
+
+ /* Package length, nothing returned */
+
+ ParserState->PkgEnd = AcpiPsGetNextPackageEnd (ParserState);
+ break;
+
+
+ case ARGP_FIELDLIST:
+
+ if (ParserState->Aml < ParserState->PkgEnd)
+ {
+ /* Non-empty list */
+
+ while (ParserState->Aml < ParserState->PkgEnd)
+ {
+ Field = AcpiPsGetNextField (ParserState);
+ if (!Field)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ if (Prev)
+ {
+ Prev->Common.Next = Field;
+ }
+ else
+ {
+ Arg = Field;
+ }
+ Prev = Field;
+ }
+
+ /* Skip to End of byte data */
+
+ ParserState->Aml = ParserState->PkgEnd;
+ }
+ break;
+
+
+ case ARGP_BYTELIST:
+
+ if (ParserState->Aml < ParserState->PkgEnd)
+ {
+ /* Non-empty list */
+
+ Arg = AcpiPsAllocOp (AML_INT_BYTELIST_OP);
+ if (!Arg)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Fill in bytelist data */
+
+ Arg->Common.Value.Size = (UINT32)
+ ACPI_PTR_DIFF (ParserState->PkgEnd, ParserState->Aml);
+ Arg->Named.Data = ParserState->Aml;
+
+ /* Skip to End of byte data */
+
+ ParserState->Aml = ParserState->PkgEnd;
+ }
+ break;
+
+
+ case ARGP_TARGET:
+ case ARGP_SUPERNAME:
+ case ARGP_SIMPLENAME:
+
+ Subop = AcpiPsPeekOpcode (ParserState);
+ if (Subop == 0 ||
+ AcpiPsIsLeadingChar (Subop) ||
+ AcpiPsIsPrefixChar (Subop))
+ {
+ /* NullName or NameString */
+
+ Arg = AcpiPsAllocOp (AML_INT_NAMEPATH_OP);
+ if (!Arg)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Status = AcpiPsGetNextNamepath (WalkState, ParserState, Arg, 0);
+ }
+ else
+ {
+ /* Single complex argument, nothing returned */
+
+ WalkState->ArgCount = 1;
+ }
+ break;
+
+
+ case ARGP_DATAOBJ:
+ case ARGP_TERMARG:
+
+ /* Single complex argument, nothing returned */
+
+ WalkState->ArgCount = 1;
+ break;
+
+
+ case ARGP_DATAOBJLIST:
+ case ARGP_TERMLIST:
+ case ARGP_OBJLIST:
+
+ if (ParserState->Aml < ParserState->PkgEnd)
+ {
+ /* Non-empty list of variable arguments, nothing returned */
+
+ WalkState->ArgCount = ACPI_VAR_ARGS;
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Invalid ArgType: %X", ArgType));
+ Status = AE_AML_OPERAND_TYPE;
+ break;
+ }
+
+ *ReturnArg = Arg;
+ return_ACPI_STATUS (Status);
+}
diff --git a/sys/contrib/dev/acpica/psloop.c b/sys/contrib/dev/acpica/psloop.c
new file mode 100644
index 0000000..6c6ce47
--- /dev/null
+++ b/sys/contrib/dev/acpica/psloop.c
@@ -0,0 +1,1186 @@
+/******************************************************************************
+ *
+ * Module Name: psloop - Main AML parse loop
+ * $Revision: 1.16 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+/*
+ * Parse the AML and build an operation tree as most interpreters, (such as
+ * Perl) do. Parsing is done by hand rather than with a YACC generated parser
+ * to tightly constrain stack and dynamic memory usage. Parsing is kept
+ * flexible and the code fairly compact by parsing based on a list of AML
+ * opcode templates in AmlOpInfo[].
+ */
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+#define _COMPONENT ACPI_PARSER
+ ACPI_MODULE_NAME ("psloop")
+
+static UINT32 AcpiGbl_Depth = 0;
+
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiPsGetAmlOpcode (
+ ACPI_WALK_STATE *WalkState);
+
+static ACPI_STATUS
+AcpiPsBuildNamedOp (
+ ACPI_WALK_STATE *WalkState,
+ UINT8 *AmlOpStart,
+ ACPI_PARSE_OBJECT *UnnamedOp,
+ ACPI_PARSE_OBJECT **Op);
+
+static ACPI_STATUS
+AcpiPsCreateOp (
+ ACPI_WALK_STATE *WalkState,
+ UINT8 *AmlOpStart,
+ ACPI_PARSE_OBJECT **NewOp);
+
+static ACPI_STATUS
+AcpiPsGetArguments (
+ ACPI_WALK_STATE *WalkState,
+ UINT8 *AmlOpStart,
+ ACPI_PARSE_OBJECT *Op);
+
+static ACPI_STATUS
+AcpiPsCompleteOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT **Op,
+ ACPI_STATUS Status);
+
+static ACPI_STATUS
+AcpiPsCompleteFinalOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_STATUS Status);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetAmlOpcode
+ *
+ * PARAMETERS: WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Extract the next AML opcode from the input stream.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiPsGetAmlOpcode (
+ ACPI_WALK_STATE *WalkState)
+{
+
+ ACPI_FUNCTION_TRACE_PTR (PsGetAmlOpcode, WalkState);
+
+
+ WalkState->AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->ParserState.Aml,
+ WalkState->ParserState.AmlStart);
+ WalkState->Opcode = AcpiPsPeekOpcode (&(WalkState->ParserState));
+
+ /*
+ * First cut to determine what we have found:
+ * 1) A valid AML opcode
+ * 2) A name string
+ * 3) An unknown/invalid opcode
+ */
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode);
+
+ switch (WalkState->OpInfo->Class)
+ {
+ case AML_CLASS_ASCII:
+ case AML_CLASS_PREFIX:
+ /*
+ * Starts with a valid prefix or ASCII char, this is a name
+ * string. Convert the bare name string to a namepath.
+ */
+ WalkState->Opcode = AML_INT_NAMEPATH_OP;
+ WalkState->ArgTypes = ARGP_NAMESTRING;
+ break;
+
+ case AML_CLASS_UNKNOWN:
+
+ /* The opcode is unrecognized. Just skip unknown opcodes */
+
+ ACPI_ERROR ((AE_INFO,
+ "Found unknown opcode %X at AML address %p offset %X, ignoring",
+ WalkState->Opcode, WalkState->ParserState.Aml, WalkState->AmlOffset));
+
+ ACPI_DUMP_BUFFER (WalkState->ParserState.Aml, 128);
+
+ /* Assume one-byte bad opcode */
+
+ WalkState->ParserState.Aml++;
+ return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
+
+ default:
+
+ /* Found opcode info, this is a normal opcode */
+
+ WalkState->ParserState.Aml += AcpiPsGetOpcodeSize (WalkState->Opcode);
+ WalkState->ArgTypes = WalkState->OpInfo->ParseArgs;
+ break;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsBuildNamedOp
+ *
+ * PARAMETERS: WalkState - Current state
+ * AmlOpStart - Begin of named Op in AML
+ * UnnamedOp - Early Op (not a named Op)
+ * Op - Returned Op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Parse a named Op
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiPsBuildNamedOp (
+ ACPI_WALK_STATE *WalkState,
+ UINT8 *AmlOpStart,
+ ACPI_PARSE_OBJECT *UnnamedOp,
+ ACPI_PARSE_OBJECT **Op)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_PARSE_OBJECT *Arg = NULL;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsBuildNamedOp, WalkState);
+
+
+ UnnamedOp->Common.Value.Arg = NULL;
+ UnnamedOp->Common.ArgListLength = 0;
+ UnnamedOp->Common.AmlOpcode = WalkState->Opcode;
+
+ /*
+ * Get and append arguments until we find the node that contains
+ * the name (the type ARGP_NAME).
+ */
+ while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) &&
+ (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) != ARGP_NAME))
+ {
+ Status = AcpiPsGetNextArg (WalkState, &(WalkState->ParserState),
+ GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), &Arg);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ AcpiPsAppendArg (UnnamedOp, Arg);
+ INCREMENT_ARG_LIST (WalkState->ArgTypes);
+ }
+
+ /*
+ * Make sure that we found a NAME and didn't run out of arguments
+ */
+ if (!GET_CURRENT_ARG_TYPE (WalkState->ArgTypes))
+ {
+ return_ACPI_STATUS (AE_AML_NO_OPERAND);
+ }
+
+ /* We know that this arg is a name, move to next arg */
+
+ INCREMENT_ARG_LIST (WalkState->ArgTypes);
+
+ /*
+ * Find the object. This will either insert the object into
+ * the namespace or simply look it up
+ */
+ WalkState->Op = NULL;
+
+ Status = WalkState->DescendingCallback (WalkState, Op);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "During name lookup/catalog"));
+ return_ACPI_STATUS (Status);
+ }
+
+ if (!*Op)
+ {
+ return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
+ }
+
+ Status = AcpiPsNextParseState (WalkState, *Op, Status);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_CTRL_PENDING)
+ {
+ return_ACPI_STATUS (AE_CTRL_PARSE_PENDING);
+ }
+ return_ACPI_STATUS (Status);
+ }
+
+ AcpiPsAppendArg (*Op, UnnamedOp->Common.Value.Arg);
+ AcpiGbl_Depth++;
+
+ if ((*Op)->Common.AmlOpcode == AML_REGION_OP)
+ {
+ /*
+ * Defer final parsing of an OperationRegion body, because we don't
+ * have enough info in the first pass to parse it correctly (i.e.,
+ * there may be method calls within the TermArg elements of the body.)
+ *
+ * However, we must continue parsing because the opregion is not a
+ * standalone package -- we don't know where the end is at this point.
+ *
+ * (Length is unknown until parse of the body complete)
+ */
+ (*Op)->Named.Data = AmlOpStart;
+ (*Op)->Named.Length = 0;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsCreateOp
+ *
+ * PARAMETERS: WalkState - Current state
+ * AmlOpStart - Op start in AML
+ * NewOp - Returned Op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get Op from AML
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiPsCreateOp (
+ ACPI_WALK_STATE *WalkState,
+ UINT8 *AmlOpStart,
+ ACPI_PARSE_OBJECT **NewOp)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_PARSE_OBJECT *NamedOp = NULL;
+ ACPI_PARSE_OBJECT *ParentScope;
+ UINT8 ArgumentCount;
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsCreateOp, WalkState);
+
+
+ Status = AcpiPsGetAmlOpcode (WalkState);
+ if (Status == AE_CTRL_PARSE_CONTINUE)
+ {
+ return_ACPI_STATUS (AE_CTRL_PARSE_CONTINUE);
+ }
+
+ /* Create Op structure and append to parent's argument list */
+
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (WalkState->Opcode);
+ Op = AcpiPsAllocOp (WalkState->Opcode);
+ if (!Op)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ if (WalkState->OpInfo->Flags & AML_NAMED)
+ {
+ Status = AcpiPsBuildNamedOp (WalkState, AmlOpStart, Op, &NamedOp);
+ AcpiPsFreeOp (Op);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ *NewOp = NamedOp;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Not a named opcode, just allocate Op and append to parent */
+
+ if (WalkState->OpInfo->Flags & AML_CREATE)
+ {
+ /*
+ * Backup to beginning of CreateXXXfield declaration
+ * BodyLength is unknown until we parse the body
+ */
+ Op->Named.Data = AmlOpStart;
+ Op->Named.Length = 0;
+ }
+
+ ParentScope = AcpiPsGetParentScope (&(WalkState->ParserState));
+ AcpiPsAppendArg (ParentScope, Op);
+
+ if (ParentScope)
+ {
+ OpInfo = AcpiPsGetOpcodeInfo (ParentScope->Common.AmlOpcode);
+ if (OpInfo->Flags & AML_HAS_TARGET)
+ {
+ ArgumentCount = AcpiPsGetArgumentCount (OpInfo->Type);
+ if (ParentScope->Common.ArgListLength > ArgumentCount)
+ {
+ Op->Common.Flags |= ACPI_PARSEOP_TARGET;
+ }
+ }
+ else if (ParentScope->Common.AmlOpcode == AML_INCREMENT_OP)
+ {
+ Op->Common.Flags |= ACPI_PARSEOP_TARGET;
+ }
+ }
+
+ if (WalkState->DescendingCallback != NULL)
+ {
+ /*
+ * Find the object. This will either insert the object into
+ * the namespace or simply look it up
+ */
+ WalkState->Op = *NewOp = Op;
+
+ Status = WalkState->DescendingCallback (WalkState, &Op);
+ Status = AcpiPsNextParseState (WalkState, Op, Status);
+ if (Status == AE_CTRL_PENDING)
+ {
+ Status = AE_CTRL_PARSE_PENDING;
+ }
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetArguments
+ *
+ * PARAMETERS: WalkState - Current state
+ * AmlOpStart - Op start in AML
+ * Op - Current Op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get arguments for passed Op.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiPsGetArguments (
+ ACPI_WALK_STATE *WalkState,
+ UINT8 *AmlOpStart,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_PARSE_OBJECT *Arg = NULL;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsGetArguments, WalkState);
+
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_BYTE_OP: /* AML_BYTEDATA_ARG */
+ case AML_WORD_OP: /* AML_WORDDATA_ARG */
+ case AML_DWORD_OP: /* AML_DWORDATA_ARG */
+ case AML_QWORD_OP: /* AML_QWORDATA_ARG */
+ case AML_STRING_OP: /* AML_ASCIICHARLIST_ARG */
+
+ /* Fill in constant or string argument directly */
+
+ AcpiPsGetNextSimpleArg (&(WalkState->ParserState),
+ GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), Op);
+ break;
+
+ case AML_INT_NAMEPATH_OP: /* AML_NAMESTRING_ARG */
+
+ Status = AcpiPsGetNextNamepath (WalkState, &(WalkState->ParserState), Op, 1);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ WalkState->ArgTypes = 0;
+ break;
+
+ default:
+ /*
+ * Op is not a constant or string, append each argument to the Op
+ */
+ while (GET_CURRENT_ARG_TYPE (WalkState->ArgTypes) && !WalkState->ArgCount)
+ {
+ WalkState->AmlOffset = (UINT32) ACPI_PTR_DIFF (WalkState->ParserState.Aml,
+ WalkState->ParserState.AmlStart);
+
+ Status = AcpiPsGetNextArg (WalkState, &(WalkState->ParserState),
+ GET_CURRENT_ARG_TYPE (WalkState->ArgTypes), &Arg);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (Arg)
+ {
+ Arg->Common.AmlOffset = WalkState->AmlOffset;
+ AcpiPsAppendArg (Op, Arg);
+ }
+
+ INCREMENT_ARG_LIST (WalkState->ArgTypes);
+ }
+
+
+ /* Special processing for certain opcodes */
+
+ /* TBD (remove): Temporary mechanism to disable this code if needed */
+
+#ifdef ACPI_ENABLE_MODULE_LEVEL_CODE
+
+ if ((WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS1) &&
+ ((WalkState->ParseFlags & ACPI_PARSE_DISASSEMBLE) == 0))
+ {
+ /*
+ * We want to skip If/Else/While constructs during Pass1 because we
+ * want to actually conditionally execute the code during Pass2.
+ *
+ * Except for disassembly, where we always want to walk the
+ * If/Else/While packages
+ */
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_IF_OP:
+ case AML_ELSE_OP:
+ case AML_WHILE_OP:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "Pass1: Skipping an If/Else/While body\n"));
+
+ /* Skip body of if/else/while in pass 1 */
+
+ WalkState->ParserState.Aml = WalkState->ParserState.PkgEnd;
+ WalkState->ArgCount = 0;
+ break;
+
+ default:
+ break;
+ }
+ }
+#endif
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_METHOD_OP:
+ /*
+ * Skip parsing of control method because we don't have enough
+ * info in the first pass to parse it correctly.
+ *
+ * Save the length and address of the body
+ */
+ Op->Named.Data = WalkState->ParserState.Aml;
+ Op->Named.Length = (UINT32)
+ (WalkState->ParserState.PkgEnd - WalkState->ParserState.Aml);
+
+ /* Skip body of method */
+
+ WalkState->ParserState.Aml = WalkState->ParserState.PkgEnd;
+ WalkState->ArgCount = 0;
+ break;
+
+ case AML_BUFFER_OP:
+ case AML_PACKAGE_OP:
+ case AML_VAR_PACKAGE_OP:
+
+ if ((Op->Common.Parent) &&
+ (Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&
+ (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2))
+ {
+ /*
+ * Skip parsing of Buffers and Packages because we don't have
+ * enough info in the first pass to parse them correctly.
+ */
+ Op->Named.Data = AmlOpStart;
+ Op->Named.Length = (UINT32)
+ (WalkState->ParserState.PkgEnd - AmlOpStart);
+
+ /* Skip body */
+
+ WalkState->ParserState.Aml = WalkState->ParserState.PkgEnd;
+ WalkState->ArgCount = 0;
+ }
+ break;
+
+ case AML_WHILE_OP:
+
+ if (WalkState->ControlState)
+ {
+ WalkState->ControlState->Control.PackageEnd =
+ WalkState->ParserState.PkgEnd;
+ }
+ break;
+
+ default:
+
+ /* No action for all other opcodes */
+ break;
+ }
+
+ break;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsCompleteOp
+ *
+ * PARAMETERS: WalkState - Current state
+ * Op - Returned Op
+ * Status - Parse status before complete Op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Complete Op
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiPsCompleteOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT **Op,
+ ACPI_STATUS Status)
+{
+ ACPI_STATUS Status2;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsCompleteOp, WalkState);
+
+
+ /*
+ * Finished one argument of the containing scope
+ */
+ WalkState->ParserState.Scope->ParseScope.ArgCount--;
+
+ /* Close this Op (will result in parse subtree deletion) */
+
+ Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
+ if (ACPI_FAILURE (Status2))
+ {
+ return_ACPI_STATUS (Status2);
+ }
+
+ *Op = NULL;
+
+ switch (Status)
+ {
+ case AE_OK:
+ break;
+
+
+ case AE_CTRL_TRANSFER:
+
+ /* We are about to transfer to a called method */
+
+ WalkState->PrevOp = NULL;
+ WalkState->PrevArgTypes = WalkState->ArgTypes;
+ return_ACPI_STATUS (Status);
+
+
+ case AE_CTRL_END:
+
+ AcpiPsPopScope (&(WalkState->ParserState), Op,
+ &WalkState->ArgTypes, &WalkState->ArgCount);
+
+ if (*Op)
+ {
+ WalkState->Op = *Op;
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode);
+ WalkState->Opcode = (*Op)->Common.AmlOpcode;
+
+ Status = WalkState->AscendingCallback (WalkState);
+ Status = AcpiPsNextParseState (WalkState, *Op, Status);
+
+ Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
+ if (ACPI_FAILURE (Status2))
+ {
+ return_ACPI_STATUS (Status2);
+ }
+ }
+
+ Status = AE_OK;
+ break;
+
+
+ case AE_CTRL_BREAK:
+ case AE_CTRL_CONTINUE:
+
+ /* Pop off scopes until we find the While */
+
+ while (!(*Op) || ((*Op)->Common.AmlOpcode != AML_WHILE_OP))
+ {
+ AcpiPsPopScope (&(WalkState->ParserState), Op,
+ &WalkState->ArgTypes, &WalkState->ArgCount);
+ }
+
+ /* Close this iteration of the While loop */
+
+ WalkState->Op = *Op;
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo ((*Op)->Common.AmlOpcode);
+ WalkState->Opcode = (*Op)->Common.AmlOpcode;
+
+ Status = WalkState->AscendingCallback (WalkState);
+ Status = AcpiPsNextParseState (WalkState, *Op, Status);
+
+ Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
+ if (ACPI_FAILURE (Status2))
+ {
+ return_ACPI_STATUS (Status2);
+ }
+
+ Status = AE_OK;
+ break;
+
+
+ case AE_CTRL_TERMINATE:
+
+ /* Clean up */
+ do
+ {
+ if (*Op)
+ {
+ Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
+ if (ACPI_FAILURE (Status2))
+ {
+ return_ACPI_STATUS (Status2);
+ }
+
+ AcpiUtDeleteGenericState (
+ AcpiUtPopGenericState (&WalkState->ControlState));
+ }
+
+ AcpiPsPopScope (&(WalkState->ParserState), Op,
+ &WalkState->ArgTypes, &WalkState->ArgCount);
+
+ } while (*Op);
+
+ return_ACPI_STATUS (AE_OK);
+
+
+ default: /* All other non-AE_OK status */
+
+ do
+ {
+ if (*Op)
+ {
+ Status2 = AcpiPsCompleteThisOp (WalkState, *Op);
+ if (ACPI_FAILURE (Status2))
+ {
+ return_ACPI_STATUS (Status2);
+ }
+ }
+
+ AcpiPsPopScope (&(WalkState->ParserState), Op,
+ &WalkState->ArgTypes, &WalkState->ArgCount);
+
+ } while (*Op);
+
+
+#if 0
+ /*
+ * TBD: Cleanup parse ops on error
+ */
+ if (*Op == NULL)
+ {
+ AcpiPsPopScope (ParserState, Op,
+ &WalkState->ArgTypes, &WalkState->ArgCount);
+ }
+#endif
+ WalkState->PrevOp = NULL;
+ WalkState->PrevArgTypes = WalkState->ArgTypes;
+ return_ACPI_STATUS (Status);
+ }
+
+ /* This scope complete? */
+
+ if (AcpiPsHasCompletedScope (&(WalkState->ParserState)))
+ {
+ AcpiPsPopScope (&(WalkState->ParserState), Op,
+ &WalkState->ArgTypes, &WalkState->ArgCount);
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", *Op));
+ }
+ else
+ {
+ *Op = NULL;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsCompleteFinalOp
+ *
+ * PARAMETERS: WalkState - Current state
+ * Op - Current Op
+ * Status - Current parse status before complete last
+ * Op
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Complete last Op.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiPsCompleteFinalOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_STATUS Status)
+{
+ ACPI_STATUS Status2;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsCompleteFinalOp, WalkState);
+
+
+ /*
+ * Complete the last Op (if not completed), and clear the scope stack.
+ * It is easily possible to end an AML "package" with an unbounded number
+ * of open scopes (such as when several ASL blocks are closed with
+ * sequential closing braces). We want to terminate each one cleanly.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "AML package complete at Op %p\n", Op));
+ do
+ {
+ if (Op)
+ {
+ if (WalkState->AscendingCallback != NULL)
+ {
+ WalkState->Op = Op;
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ WalkState->Opcode = Op->Common.AmlOpcode;
+
+ Status = WalkState->AscendingCallback (WalkState);
+ Status = AcpiPsNextParseState (WalkState, Op, Status);
+ if (Status == AE_CTRL_PENDING)
+ {
+ Status = AcpiPsCompleteOp (WalkState, &Op, AE_OK);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ if (Status == AE_CTRL_TERMINATE)
+ {
+ Status = AE_OK;
+
+ /* Clean up */
+ do
+ {
+ if (Op)
+ {
+ Status2 = AcpiPsCompleteThisOp (WalkState, Op);
+ if (ACPI_FAILURE (Status2))
+ {
+ return_ACPI_STATUS (Status2);
+ }
+ }
+
+ AcpiPsPopScope (&(WalkState->ParserState), &Op,
+ &WalkState->ArgTypes, &WalkState->ArgCount);
+
+ } while (Op);
+
+ return_ACPI_STATUS (Status);
+ }
+
+ else if (ACPI_FAILURE (Status))
+ {
+ /* First error is most important */
+
+ (void) AcpiPsCompleteThisOp (WalkState, Op);
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ Status2 = AcpiPsCompleteThisOp (WalkState, Op);
+ if (ACPI_FAILURE (Status2))
+ {
+ return_ACPI_STATUS (Status2);
+ }
+ }
+
+ AcpiPsPopScope (&(WalkState->ParserState), &Op, &WalkState->ArgTypes,
+ &WalkState->ArgCount);
+
+ } while (Op);
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsParseLoop
+ *
+ * PARAMETERS: WalkState - Current state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Parse AML (pointed to by the current parser state) and return
+ * a tree of ops.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiPsParseLoop (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_PARSE_OBJECT *Op = NULL; /* current op */
+ ACPI_PARSE_STATE *ParserState;
+ UINT8 *AmlOpStart = NULL;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsParseLoop, WalkState);
+
+
+ if (WalkState->DescendingCallback == NULL)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ ParserState = &WalkState->ParserState;
+ WalkState->ArgTypes = 0;
+
+#if (!defined (ACPI_NO_METHOD_EXECUTION) && !defined (ACPI_CONSTANT_EVAL_ONLY))
+
+ if (WalkState->WalkType & ACPI_WALK_METHOD_RESTART)
+ {
+ /* We are restarting a preempted control method */
+
+ if (AcpiPsHasCompletedScope (ParserState))
+ {
+ /*
+ * We must check if a predicate to an IF or WHILE statement
+ * was just completed
+ */
+ if ((ParserState->Scope->ParseScope.Op) &&
+ ((ParserState->Scope->ParseScope.Op->Common.AmlOpcode == AML_IF_OP) ||
+ (ParserState->Scope->ParseScope.Op->Common.AmlOpcode == AML_WHILE_OP)) &&
+ (WalkState->ControlState) &&
+ (WalkState->ControlState->Common.State ==
+ ACPI_CONTROL_PREDICATE_EXECUTING))
+ {
+ /*
+ * A predicate was just completed, get the value of the
+ * predicate and branch based on that value
+ */
+ WalkState->Op = NULL;
+ Status = AcpiDsGetPredicateValue (WalkState, ACPI_TO_POINTER (TRUE));
+ if (ACPI_FAILURE (Status) &&
+ ((Status & AE_CODE_MASK) != AE_CODE_CONTROL))
+ {
+ if (Status == AE_AML_NO_RETURN_VALUE)
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Invoked method did not return a value"));
+
+ }
+
+ ACPI_EXCEPTION ((AE_INFO, Status, "GetPredicate Failed"));
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiPsNextParseState (WalkState, Op, Status);
+ }
+
+ AcpiPsPopScope (ParserState, &Op,
+ &WalkState->ArgTypes, &WalkState->ArgCount);
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Popped scope, Op=%p\n", Op));
+ }
+ else if (WalkState->PrevOp)
+ {
+ /* We were in the middle of an op */
+
+ Op = WalkState->PrevOp;
+ WalkState->ArgTypes = WalkState->PrevArgTypes;
+ }
+ }
+#endif
+
+ /* Iterative parsing loop, while there is more AML to process: */
+
+ while ((ParserState->Aml < ParserState->AmlEnd) || (Op))
+ {
+ AmlOpStart = ParserState->Aml;
+ if (!Op)
+ {
+ Status = AcpiPsCreateOp (WalkState, AmlOpStart, &Op);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_CTRL_PARSE_CONTINUE)
+ {
+ continue;
+ }
+
+ if (Status == AE_CTRL_PARSE_PENDING)
+ {
+ Status = AE_OK;
+ }
+
+ Status = AcpiPsCompleteOp (WalkState, &Op, Status);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ continue;
+ }
+
+ Op->Common.AmlOffset = WalkState->AmlOffset;
+
+ if (WalkState->OpInfo)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "Opcode %4.4X [%s] Op %p Aml %p AmlOffset %5.5X\n",
+ (UINT32) Op->Common.AmlOpcode, WalkState->OpInfo->Name,
+ Op, ParserState->Aml, Op->Common.AmlOffset));
+ }
+ }
+
+
+ /*
+ * Start ArgCount at zero because we don't know if there are
+ * any args yet
+ */
+ WalkState->ArgCount = 0;
+
+ /* Are there any arguments that must be processed? */
+
+ if (WalkState->ArgTypes)
+ {
+ /* Get arguments */
+
+ Status = AcpiPsGetArguments (WalkState, AmlOpStart, Op);
+ if (ACPI_FAILURE (Status))
+ {
+ Status = AcpiPsCompleteOp (WalkState, &Op, Status);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ continue;
+ }
+ }
+
+ /* Check for arguments that need to be processed */
+
+ if (WalkState->ArgCount)
+ {
+ /*
+ * There are arguments (complex ones), push Op and
+ * prepare for argument
+ */
+ Status = AcpiPsPushScope (ParserState, Op,
+ WalkState->ArgTypes, WalkState->ArgCount);
+ if (ACPI_FAILURE (Status))
+ {
+ Status = AcpiPsCompleteOp (WalkState, &Op, Status);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ continue;
+ }
+
+ Op = NULL;
+ continue;
+ }
+
+ /*
+ * All arguments have been processed -- Op is complete,
+ * prepare for next
+ */
+ WalkState->OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ if (WalkState->OpInfo->Flags & AML_NAMED)
+ {
+ if (AcpiGbl_Depth)
+ {
+ AcpiGbl_Depth--;
+ }
+
+ if (Op->Common.AmlOpcode == AML_REGION_OP)
+ {
+ /*
+ * Skip parsing of control method or opregion body,
+ * because we don't have enough info in the first pass
+ * to parse them correctly.
+ *
+ * Completed parsing an OpRegion declaration, we now
+ * know the length.
+ */
+ Op->Named.Length = (UINT32) (ParserState->Aml - Op->Named.Data);
+ }
+ }
+
+ if (WalkState->OpInfo->Flags & AML_CREATE)
+ {
+ /*
+ * Backup to beginning of CreateXXXfield declaration (1 for
+ * Opcode)
+ *
+ * BodyLength is unknown until we parse the body
+ */
+ Op->Named.Length = (UINT32) (ParserState->Aml - Op->Named.Data);
+ }
+
+ /* This op complete, notify the dispatcher */
+
+ if (WalkState->AscendingCallback != NULL)
+ {
+ WalkState->Op = Op;
+ WalkState->Opcode = Op->Common.AmlOpcode;
+
+ Status = WalkState->AscendingCallback (WalkState);
+ Status = AcpiPsNextParseState (WalkState, Op, Status);
+ if (Status == AE_CTRL_PENDING)
+ {
+ Status = AE_OK;
+ }
+ }
+
+ Status = AcpiPsCompleteOp (WalkState, &Op, Status);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ } /* while ParserState->Aml */
+
+ Status = AcpiPsCompleteFinalOp (WalkState, Op, Status);
+ return_ACPI_STATUS (Status);
+}
+
diff --git a/sys/contrib/dev/acpica/psopcode.c b/sys/contrib/dev/acpica/psopcode.c
new file mode 100644
index 0000000..fad6d39
--- /dev/null
+++ b/sys/contrib/dev/acpica/psopcode.c
@@ -0,0 +1,589 @@
+/******************************************************************************
+ *
+ * Module Name: psopcode - Parser/Interpreter opcode information table
+ * $Revision: 1.99 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acopcode.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_PARSER
+ ACPI_MODULE_NAME ("psopcode")
+
+
+const UINT8 AcpiGbl_ArgumentCount[] = {0,1,1,1,1,2,2,2,2,3,3,6};
+
+
+/*******************************************************************************
+ *
+ * NAME: AcpiGbl_AmlOpInfo
+ *
+ * DESCRIPTION: Opcode table. Each entry contains <opcode, type, name, operands>
+ * The name is a simple ascii string, the operand specifier is an
+ * ascii string with one letter per operand. The letter specifies
+ * the operand type.
+ *
+ ******************************************************************************/
+
+/*
+ * Summary of opcode types/flags
+ *
+
+ Opcodes that have associated namespace objects (AML_NSOBJECT flag)
+
+ AML_SCOPE_OP
+ AML_DEVICE_OP
+ AML_THERMAL_ZONE_OP
+ AML_METHOD_OP
+ AML_POWER_RES_OP
+ AML_PROCESSOR_OP
+ AML_FIELD_OP
+ AML_INDEX_FIELD_OP
+ AML_BANK_FIELD_OP
+ AML_NAME_OP
+ AML_ALIAS_OP
+ AML_MUTEX_OP
+ AML_EVENT_OP
+ AML_REGION_OP
+ AML_CREATE_FIELD_OP
+ AML_CREATE_BIT_FIELD_OP
+ AML_CREATE_BYTE_FIELD_OP
+ AML_CREATE_WORD_FIELD_OP
+ AML_CREATE_DWORD_FIELD_OP
+ AML_CREATE_QWORD_FIELD_OP
+ AML_INT_NAMEDFIELD_OP
+ AML_INT_METHODCALL_OP
+ AML_INT_NAMEPATH_OP
+
+ Opcodes that are "namespace" opcodes (AML_NSOPCODE flag)
+
+ AML_SCOPE_OP
+ AML_DEVICE_OP
+ AML_THERMAL_ZONE_OP
+ AML_METHOD_OP
+ AML_POWER_RES_OP
+ AML_PROCESSOR_OP
+ AML_FIELD_OP
+ AML_INDEX_FIELD_OP
+ AML_BANK_FIELD_OP
+ AML_NAME_OP
+ AML_ALIAS_OP
+ AML_MUTEX_OP
+ AML_EVENT_OP
+ AML_REGION_OP
+ AML_INT_NAMEDFIELD_OP
+
+ Opcodes that have an associated namespace node (AML_NSNODE flag)
+
+ AML_SCOPE_OP
+ AML_DEVICE_OP
+ AML_THERMAL_ZONE_OP
+ AML_METHOD_OP
+ AML_POWER_RES_OP
+ AML_PROCESSOR_OP
+ AML_NAME_OP
+ AML_ALIAS_OP
+ AML_MUTEX_OP
+ AML_EVENT_OP
+ AML_REGION_OP
+ AML_CREATE_FIELD_OP
+ AML_CREATE_BIT_FIELD_OP
+ AML_CREATE_BYTE_FIELD_OP
+ AML_CREATE_WORD_FIELD_OP
+ AML_CREATE_DWORD_FIELD_OP
+ AML_CREATE_QWORD_FIELD_OP
+ AML_INT_NAMEDFIELD_OP
+ AML_INT_METHODCALL_OP
+ AML_INT_NAMEPATH_OP
+
+ Opcodes that define named ACPI objects (AML_NAMED flag)
+
+ AML_SCOPE_OP
+ AML_DEVICE_OP
+ AML_THERMAL_ZONE_OP
+ AML_METHOD_OP
+ AML_POWER_RES_OP
+ AML_PROCESSOR_OP
+ AML_NAME_OP
+ AML_ALIAS_OP
+ AML_MUTEX_OP
+ AML_EVENT_OP
+ AML_REGION_OP
+ AML_INT_NAMEDFIELD_OP
+
+ Opcodes that contain executable AML as part of the definition that
+ must be deferred until needed
+
+ AML_METHOD_OP
+ AML_VAR_PACKAGE_OP
+ AML_CREATE_FIELD_OP
+ AML_CREATE_BIT_FIELD_OP
+ AML_CREATE_BYTE_FIELD_OP
+ AML_CREATE_WORD_FIELD_OP
+ AML_CREATE_DWORD_FIELD_OP
+ AML_CREATE_QWORD_FIELD_OP
+ AML_REGION_OP
+ AML_BUFFER_OP
+
+ Field opcodes
+
+ AML_CREATE_FIELD_OP
+ AML_FIELD_OP
+ AML_INDEX_FIELD_OP
+ AML_BANK_FIELD_OP
+
+ Field "Create" opcodes
+
+ AML_CREATE_FIELD_OP
+ AML_CREATE_BIT_FIELD_OP
+ AML_CREATE_BYTE_FIELD_OP
+ AML_CREATE_WORD_FIELD_OP
+ AML_CREATE_DWORD_FIELD_OP
+ AML_CREATE_QWORD_FIELD_OP
+
+ ******************************************************************************/
+
+
+/*
+ * Master Opcode information table. A summary of everything we know about each
+ * opcode, all in one place.
+ */
+const ACPI_OPCODE_INFO AcpiGbl_AmlOpInfo[AML_NUM_OPCODES] =
+{
+/*! [Begin] no source code translation */
+/* 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, 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 | AML_NO_OPERAND_RESOLVE),
+/* 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),
+/* 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 | AML_NO_OPERAND_RESOLVE),
+/* 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_NUMERIC | 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_NUMERIC | 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, 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, 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, ACPI_TYPE_ANY, AML_CLASS_NAMED_OBJECT, AML_TYPE_NAMED_NO_OBJ, AML_HAS_ARGS | AML_NSOBJECT | AML_NSOPCODE | AML_NSNODE),
+
+/* ACPI 3.0 opcodes */
+
+/* 7E */ ACPI_OP ("Timer", ARGP_TIMER_OP, ARGI_TIMER_OP, ACPI_TYPE_ANY, AML_CLASS_EXECUTE, AML_TYPE_EXEC_0A_0T_1R, AML_FLAGS_EXEC_0A_0T_1R)
+
+/*! [End] no source code translation !*/
+};
+
+/*
+ * This table is directly indexed by the opcodes, and returns an
+ * index into the table above
+ */
+static const UINT8 AcpiGbl_ShortOpIndex[256] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+/* 0x00 */ 0x00, 0x01, _UNK, _UNK, _UNK, _UNK, 0x02, _UNK,
+/* 0x08 */ 0x03, _UNK, 0x04, 0x05, 0x06, 0x07, 0x6E, _UNK,
+/* 0x10 */ 0x08, 0x09, 0x0a, 0x6F, 0x0b, _UNK, _UNK, _UNK,
+/* 0x18 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x20 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x28 */ _UNK, _UNK, _UNK, _UNK, _UNK, 0x63, _PFX, _PFX,
+/* 0x30 */ 0x67, 0x66, 0x68, 0x65, 0x69, 0x64, 0x6A, 0x7D,
+/* 0x38 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x40 */ _UNK, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
+/* 0x48 */ _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
+/* 0x50 */ _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC, _ASC,
+/* 0x58 */ _ASC, _ASC, _ASC, _UNK, _PFX, _UNK, _PFX, _ASC,
+/* 0x60 */ 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13,
+/* 0x68 */ 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1a, _UNK,
+/* 0x70 */ 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20, 0x21, 0x22,
+/* 0x78 */ 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a,
+/* 0x80 */ 0x2b, 0x2c, 0x2d, 0x2e, 0x70, 0x71, 0x2f, 0x30,
+/* 0x88 */ 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x72,
+/* 0x90 */ 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x73, 0x74,
+/* 0x98 */ 0x75, 0x76, _UNK, _UNK, 0x77, 0x78, 0x79, 0x7A,
+/* 0xA0 */ 0x3e, 0x3f, 0x40, 0x41, 0x42, 0x43, 0x60, 0x61,
+/* 0xA8 */ 0x62, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0xB0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0xB8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0xC0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0xC8 */ _UNK, _UNK, _UNK, _UNK, 0x44, _UNK, _UNK, _UNK,
+/* 0xD0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0xD8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0xE0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0xE8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0xF0 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0xF8 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x45,
+};
+
+/*
+ * This table is indexed by the second opcode of the extended opcode
+ * pair. It returns an index into the opcode table (AcpiGbl_AmlOpInfo)
+ */
+static const UINT8 AcpiGbl_LongOpIndex[NUM_EXTENDED_OPCODE] =
+{
+/* 0 1 2 3 4 5 6 7 */
+/* 8 9 A B C D E F */
+/* 0x00 */ _UNK, 0x46, 0x47, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x08 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x10 */ _UNK, _UNK, 0x48, 0x49, _UNK, _UNK, _UNK, _UNK,
+/* 0x18 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, 0x7B,
+/* 0x20 */ 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f, 0x50, 0x51,
+/* 0x28 */ 0x52, 0x53, 0x54, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x30 */ 0x55, 0x56, 0x57, 0x7e, _UNK, _UNK, _UNK, _UNK,
+/* 0x38 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x40 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x48 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x50 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x58 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x60 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x68 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x70 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x78 */ _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK, _UNK,
+/* 0x80 */ 0x58, 0x59, 0x5a, 0x5b, 0x5c, 0x5d, 0x5e, 0x5f,
+/* 0x88 */ 0x7C,
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetOpcodeInfo
+ *
+ * PARAMETERS: Opcode - The AML opcode
+ *
+ * RETURN: A pointer to the info about the opcode.
+ *
+ * DESCRIPTION: Find AML opcode description based on the opcode.
+ * NOTE: This procedure must ALWAYS return a valid pointer!
+ *
+ ******************************************************************************/
+
+const ACPI_OPCODE_INFO *
+AcpiPsGetOpcodeInfo (
+ UINT16 Opcode)
+{
+ ACPI_FUNCTION_NAME (PsGetOpcodeInfo);
+
+
+ /*
+ * Detect normal 8-bit opcode or extended 16-bit opcode
+ */
+ if (!(Opcode & 0xFF00))
+ {
+ /* Simple (8-bit) opcode: 0-255, can't index beyond table */
+
+ return (&AcpiGbl_AmlOpInfo [AcpiGbl_ShortOpIndex [(UINT8) Opcode]]);
+ }
+
+ if (((Opcode & 0xFF00) == AML_EXTENDED_OPCODE) &&
+ (((UINT8) Opcode) <= MAX_EXTENDED_OPCODE))
+ {
+ /* Valid extended (16-bit) opcode */
+
+ return (&AcpiGbl_AmlOpInfo [AcpiGbl_LongOpIndex [(UINT8) Opcode]]);
+ }
+
+ /* Unknown AML opcode */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Unknown AML opcode [%4.4X]\n", Opcode));
+
+ return (&AcpiGbl_AmlOpInfo [_UNK]);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetOpcodeName
+ *
+ * PARAMETERS: Opcode - The AML opcode
+ *
+ * RETURN: A pointer to the name of the opcode (ASCII String)
+ * Note: Never returns NULL.
+ *
+ * DESCRIPTION: Translate an opcode into a human-readable string
+ *
+ ******************************************************************************/
+
+char *
+AcpiPsGetOpcodeName (
+ UINT16 Opcode)
+{
+#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUG_OUTPUT)
+
+ const ACPI_OPCODE_INFO *Op;
+
+
+ Op = AcpiPsGetOpcodeInfo (Opcode);
+
+ /* Always guaranteed to return a valid pointer */
+
+ return (Op->Name);
+
+#else
+ return ("OpcodeName unavailable");
+
+#endif
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetArgumentCount
+ *
+ * PARAMETERS: OpType - Type associated with the AML opcode
+ *
+ * RETURN: Argument count
+ *
+ * DESCRIPTION: Obtain the number of expected arguments for an AML opcode
+ *
+ ******************************************************************************/
+
+UINT8
+AcpiPsGetArgumentCount (
+ UINT32 OpType)
+{
+
+ if (OpType <= AML_TYPE_EXEC_6A_0T_1R)
+ {
+ return (AcpiGbl_ArgumentCount[OpType]);
+ }
+
+ return (0);
+}
diff --git a/sys/contrib/dev/acpica/psparse.c b/sys/contrib/dev/acpica/psparse.c
new file mode 100644
index 0000000..e0afab8
--- /dev/null
+++ b/sys/contrib/dev/acpica/psparse.c
@@ -0,0 +1,765 @@
+/******************************************************************************
+ *
+ * Module Name: psparse - Parser top level AML parse routines
+ * $Revision: 1.171 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+/*
+ * Parse the AML and build an operation tree as most interpreters,
+ * like Perl, do. Parsing is done by hand rather than with a YACC
+ * generated parser to tightly constrain stack and dynamic memory
+ * usage. At the same time, parsing is kept flexible and the code
+ * fairly compact by parsing based on a list of AML opcode
+ * templates in AmlOpInfo[]
+ */
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+#define _COMPONENT ACPI_PARSER
+ ACPI_MODULE_NAME ("psparse")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetOpcodeSize
+ *
+ * PARAMETERS: Opcode - An AML opcode
+ *
+ * RETURN: Size of the opcode, in bytes (1 or 2)
+ *
+ * DESCRIPTION: Get the size of the current opcode.
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiPsGetOpcodeSize (
+ UINT32 Opcode)
+{
+
+ /* Extended (2-byte) opcode if > 255 */
+
+ if (Opcode > 0x00FF)
+ {
+ return (2);
+ }
+
+ /* Otherwise, just a single byte opcode */
+
+ return (1);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsPeekOpcode
+ *
+ * PARAMETERS: ParserState - A parser state object
+ *
+ * RETURN: Next AML opcode
+ *
+ * DESCRIPTION: Get next AML opcode (without incrementing AML pointer)
+ *
+ ******************************************************************************/
+
+UINT16
+AcpiPsPeekOpcode (
+ ACPI_PARSE_STATE *ParserState)
+{
+ UINT8 *Aml;
+ UINT16 Opcode;
+
+
+ Aml = ParserState->Aml;
+ Opcode = (UINT16) ACPI_GET8 (Aml);
+
+ if (Opcode == AML_EXTENDED_OP_PREFIX)
+ {
+ /* Extended opcode, get the second opcode byte */
+
+ Aml++;
+ Opcode = (UINT16) ((Opcode << 8) | ACPI_GET8 (Aml));
+ }
+
+ return (Opcode);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsCompleteThisOp
+ *
+ * PARAMETERS: WalkState - Current State
+ * Op - Op to complete
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Perform any cleanup at the completion of an Op.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiPsCompleteThisOp (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Prev;
+ ACPI_PARSE_OBJECT *Next;
+ const ACPI_OPCODE_INFO *ParentInfo;
+ ACPI_PARSE_OBJECT *ReplacementOp = NULL;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsCompleteThisOp, Op);
+
+
+ /* Check for null Op, can happen if AML code is corrupt */
+
+ if (!Op)
+ {
+ return_ACPI_STATUS (AE_OK); /* OK for now */
+ }
+
+ /* Delete this op and the subtree below it if asked to */
+
+ if (((WalkState->ParseFlags & ACPI_PARSE_TREE_MASK) != ACPI_PARSE_DELETE_TREE) ||
+ (WalkState->OpInfo->Class == AML_CLASS_ARGUMENT))
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Make sure that we only delete this subtree */
+
+ if (Op->Common.Parent)
+ {
+ Prev = Op->Common.Parent->Common.Value.Arg;
+ if (!Prev)
+ {
+ /* Nothing more to do */
+
+ goto Cleanup;
+ }
+
+ /*
+ * Check if we need to replace the operator and its subtree
+ * with a return value op (placeholder op)
+ */
+ ParentInfo = AcpiPsGetOpcodeInfo (Op->Common.Parent->Common.AmlOpcode);
+
+ switch (ParentInfo->Class)
+ {
+ case AML_CLASS_CONTROL:
+ break;
+
+ case AML_CLASS_CREATE:
+
+ /*
+ * These opcodes contain TermArg operands. The current
+ * op must be replaced by a placeholder return op
+ */
+ ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
+ if (!ReplacementOp)
+ {
+ goto AllocateError;
+ }
+ break;
+
+ case AML_CLASS_NAMED_OBJECT:
+
+ /*
+ * These opcodes contain TermArg operands. The current
+ * op must be replaced by a placeholder return op
+ */
+ if ((Op->Common.Parent->Common.AmlOpcode == AML_REGION_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_DATA_REGION_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_BUFFER_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_PACKAGE_OP) ||
+ (Op->Common.Parent->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
+ {
+ ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
+ if (!ReplacementOp)
+ {
+ goto AllocateError;
+ }
+ }
+ else if ((Op->Common.Parent->Common.AmlOpcode == AML_NAME_OP) &&
+ (WalkState->PassNumber <= ACPI_IMODE_LOAD_PASS2))
+ {
+ if ((Op->Common.AmlOpcode == AML_BUFFER_OP) ||
+ (Op->Common.AmlOpcode == AML_PACKAGE_OP) ||
+ (Op->Common.AmlOpcode == AML_VAR_PACKAGE_OP))
+ {
+ ReplacementOp = AcpiPsAllocOp (Op->Common.AmlOpcode);
+ if (!ReplacementOp)
+ {
+ goto AllocateError;
+ }
+
+ ReplacementOp->Named.Data = Op->Named.Data;
+ ReplacementOp->Named.Length = Op->Named.Length;
+ }
+ }
+ break;
+
+ default:
+
+ ReplacementOp = AcpiPsAllocOp (AML_INT_RETURN_VALUE_OP);
+ if (!ReplacementOp)
+ {
+ goto AllocateError;
+ }
+ }
+
+ /* We must unlink this op from the parent tree */
+
+ if (Prev == Op)
+ {
+ /* This op is the first in the list */
+
+ if (ReplacementOp)
+ {
+ ReplacementOp->Common.Parent = Op->Common.Parent;
+ ReplacementOp->Common.Value.Arg = NULL;
+ ReplacementOp->Common.Node = Op->Common.Node;
+ Op->Common.Parent->Common.Value.Arg = ReplacementOp;
+ ReplacementOp->Common.Next = Op->Common.Next;
+ }
+ else
+ {
+ Op->Common.Parent->Common.Value.Arg = Op->Common.Next;
+ }
+ }
+
+ /* Search the parent list */
+
+ else while (Prev)
+ {
+ /* Traverse all siblings in the parent's argument list */
+
+ Next = Prev->Common.Next;
+ if (Next == Op)
+ {
+ if (ReplacementOp)
+ {
+ ReplacementOp->Common.Parent = Op->Common.Parent;
+ ReplacementOp->Common.Value.Arg = NULL;
+ ReplacementOp->Common.Node = Op->Common.Node;
+ Prev->Common.Next = ReplacementOp;
+ ReplacementOp->Common.Next = Op->Common.Next;
+ Next = NULL;
+ }
+ else
+ {
+ Prev->Common.Next = Op->Common.Next;
+ Next = NULL;
+ }
+ }
+ Prev = Next;
+ }
+ }
+
+
+Cleanup:
+
+ /* Now we can actually delete the subtree rooted at Op */
+
+ AcpiPsDeleteParseTree (Op);
+ return_ACPI_STATUS (AE_OK);
+
+
+AllocateError:
+
+ /* Always delete the subtree, even on error */
+
+ AcpiPsDeleteParseTree (Op);
+ return_ACPI_STATUS (AE_NO_MEMORY);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsNextParseState
+ *
+ * PARAMETERS: WalkState - Current state
+ * Op - Current parse op
+ * CallbackStatus - Status from previous operation
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Update the parser state based upon the return exception from
+ * the parser callback.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiPsNextParseState (
+ ACPI_WALK_STATE *WalkState,
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_STATUS CallbackStatus)
+{
+ ACPI_PARSE_STATE *ParserState = &WalkState->ParserState;
+ ACPI_STATUS Status = AE_CTRL_PENDING;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsNextParseState, Op);
+
+
+ switch (CallbackStatus)
+ {
+ case AE_CTRL_TERMINATE:
+ /*
+ * A control method was terminated via a RETURN statement.
+ * The walk of this method is complete.
+ */
+ ParserState->Aml = ParserState->AmlEnd;
+ Status = AE_CTRL_TERMINATE;
+ break;
+
+
+ case AE_CTRL_BREAK:
+
+ ParserState->Aml = WalkState->AmlLastWhile;
+ WalkState->ControlState->Common.Value = FALSE;
+ Status = AE_CTRL_BREAK;
+ break;
+
+
+ case AE_CTRL_CONTINUE:
+
+ ParserState->Aml = WalkState->AmlLastWhile;
+ Status = AE_CTRL_CONTINUE;
+ break;
+
+
+ case AE_CTRL_PENDING:
+
+ ParserState->Aml = WalkState->AmlLastWhile;
+ break;
+
+#if 0
+ case AE_CTRL_SKIP:
+
+ ParserState->Aml = ParserState->Scope->ParseScope.PkgEnd;
+ Status = AE_OK;
+ break;
+#endif
+
+ case AE_CTRL_TRUE:
+ /*
+ * Predicate of an IF was true, and we are at the matching ELSE.
+ * Just close out this package
+ */
+ ParserState->Aml = AcpiPsGetNextPackageEnd (ParserState);
+ Status = AE_CTRL_PENDING;
+ break;
+
+
+ case AE_CTRL_FALSE:
+ /*
+ * Either an IF/WHILE Predicate was false or we encountered a BREAK
+ * opcode. In both cases, we do not execute the rest of the
+ * package; We simply close out the parent (finishing the walk of
+ * this branch of the tree) and continue execution at the parent
+ * level.
+ */
+ ParserState->Aml = ParserState->Scope->ParseScope.PkgEnd;
+
+ /* In the case of a BREAK, just force a predicate (if any) to FALSE */
+
+ WalkState->ControlState->Common.Value = FALSE;
+ Status = AE_CTRL_END;
+ break;
+
+
+ case AE_CTRL_TRANSFER:
+
+ /* A method call (invocation) -- transfer control */
+
+ Status = AE_CTRL_TRANSFER;
+ WalkState->PrevOp = Op;
+ WalkState->MethodCallOp = Op;
+ WalkState->MethodCallNode = (Op->Common.Value.Arg)->Common.Node;
+
+ /* Will return value (if any) be used by the caller? */
+
+ WalkState->ReturnUsed = AcpiDsIsResultUsed (Op, WalkState);
+ break;
+
+
+ default:
+
+ Status = CallbackStatus;
+ if ((CallbackStatus & AE_CODE_MASK) == AE_CODE_CONTROL)
+ {
+ Status = AE_OK;
+ }
+ break;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsParseAml
+ *
+ * PARAMETERS: WalkState - Current state
+ *
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Parse raw AML and return a tree of ops
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiPsParseAml (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_THREAD_STATE *Thread;
+ ACPI_THREAD_STATE *PrevWalkList = AcpiGbl_CurrentWalkList;
+ ACPI_WALK_STATE *PreviousWalkState;
+
+
+ ACPI_FUNCTION_TRACE (PsParseAml);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "Entered with WalkState=%p Aml=%p size=%X\n",
+ WalkState, WalkState->ParserState.Aml,
+ WalkState->ParserState.AmlSize));
+
+
+ /* Create and initialize a new thread state */
+
+ Thread = AcpiUtCreateThreadState ();
+ if (!Thread)
+ {
+ AcpiDsDeleteWalkState (WalkState);
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ WalkState->Thread = Thread;
+
+ /*
+ * If executing a method, the starting SyncLevel is this method's
+ * SyncLevel
+ */
+ if (WalkState->MethodDesc)
+ {
+ WalkState->Thread->CurrentSyncLevel = WalkState->MethodDesc->Method.SyncLevel;
+ }
+
+ AcpiDsPushWalkState (WalkState, Thread);
+
+ /*
+ * This global allows the AML debugger to get a handle to the currently
+ * executing control method.
+ */
+ AcpiGbl_CurrentWalkList = Thread;
+
+ /*
+ * Execute the walk loop as long as there is a valid Walk State. This
+ * handles nested control method invocations without recursion.
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "State=%p\n", WalkState));
+
+ Status = AE_OK;
+ while (WalkState)
+ {
+ if (ACPI_SUCCESS (Status))
+ {
+ /*
+ * The ParseLoop executes AML until the method terminates
+ * or calls another method.
+ */
+ Status = AcpiPsParseLoop (WalkState);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "Completed one call to walk loop, %s State=%p\n",
+ AcpiFormatException (Status), WalkState));
+
+ if (Status == AE_CTRL_TRANSFER)
+ {
+ /*
+ * A method call was detected.
+ * Transfer control to the called control method
+ */
+ Status = AcpiDsCallControlMethod (Thread, WalkState, NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ Status = AcpiDsMethodError (Status, WalkState);
+ }
+
+ /*
+ * If the transfer to the new method method call worked, a new walk
+ * state was created -- get it
+ */
+ WalkState = AcpiDsGetCurrentWalkState (Thread);
+ continue;
+ }
+ else if (Status == AE_CTRL_TERMINATE)
+ {
+ Status = AE_OK;
+ }
+ else if ((Status != AE_OK) && (WalkState->MethodDesc))
+ {
+ /* Either the method parse or actual execution failed */
+
+ ACPI_ERROR_METHOD ("Method parse/execution failed",
+ WalkState->MethodNode, NULL, Status);
+
+ /* Check for possible multi-thread reentrancy problem */
+
+ if ((Status == AE_ALREADY_EXISTS) &&
+ (!WalkState->MethodDesc->Method.Mutex))
+ {
+ ACPI_INFO ((AE_INFO, "Marking method %4.4s as Serialized",
+ WalkState->MethodNode->Name.Ascii));
+
+ /*
+ * Method tried to create an object twice. The probable cause is
+ * that the method cannot handle reentrancy.
+ *
+ * The method is marked NotSerialized, but it tried to create
+ * a named object, causing the second thread entrance to fail.
+ * Workaround this problem by marking the method permanently
+ * as Serialized.
+ */
+ WalkState->MethodDesc->Method.MethodFlags |= AML_METHOD_SERIALIZED;
+ WalkState->MethodDesc->Method.SyncLevel = 0;
+ }
+ }
+
+ /* We are done with this walk, move on to the parent if any */
+
+ WalkState = AcpiDsPopWalkState (Thread);
+
+ /* Reset the current scope to the beginning of scope stack */
+
+ AcpiDsScopeStackClear (WalkState);
+
+ /*
+ * If we just returned from the execution of a control method or if we
+ * encountered an error during the method parse phase, there's lots of
+ * cleanup to do
+ */
+ if (((WalkState->ParseFlags & ACPI_PARSE_MODE_MASK) == ACPI_PARSE_EXECUTE) ||
+ (ACPI_FAILURE (Status)))
+ {
+ AcpiDsTerminateControlMethod (WalkState->MethodDesc, WalkState);
+ }
+
+ /* Delete this walk state and all linked control states */
+
+ AcpiPsCleanupScope (&WalkState->ParserState);
+ PreviousWalkState = WalkState;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "ReturnValue=%p, ImplicitValue=%p State=%p\n",
+ WalkState->ReturnDesc, WalkState->ImplicitReturnObj, WalkState));
+
+ /* Check if we have restarted a preempted walk */
+
+ WalkState = AcpiDsGetCurrentWalkState (Thread);
+ if (WalkState)
+ {
+ if (ACPI_SUCCESS (Status))
+ {
+ /*
+ * There is another walk state, restart it.
+ * If the method return value is not used by the parent,
+ * The object is deleted
+ */
+ if (!PreviousWalkState->ReturnDesc)
+ {
+ Status = AcpiDsRestartControlMethod (WalkState,
+ PreviousWalkState->ImplicitReturnObj);
+ }
+ else
+ {
+ /*
+ * We have a valid return value, delete any implicit
+ * return value.
+ */
+ AcpiDsClearImplicitReturn (PreviousWalkState);
+
+ Status = AcpiDsRestartControlMethod (WalkState,
+ PreviousWalkState->ReturnDesc);
+ }
+ if (ACPI_SUCCESS (Status))
+ {
+ WalkState->WalkType |= ACPI_WALK_METHOD_RESTART;
+ }
+ }
+ else
+ {
+ /* On error, delete any return object */
+
+ AcpiUtRemoveReference (PreviousWalkState->ReturnDesc);
+ }
+ }
+
+ /*
+ * Just completed a 1st-level method, save the final internal return
+ * value (if any)
+ */
+ else if (PreviousWalkState->CallerReturnDesc)
+ {
+ if (PreviousWalkState->ImplicitReturnObj)
+ {
+ *(PreviousWalkState->CallerReturnDesc) =
+ PreviousWalkState->ImplicitReturnObj;
+ }
+ else
+ {
+ /* NULL if no return value */
+
+ *(PreviousWalkState->CallerReturnDesc) =
+ PreviousWalkState->ReturnDesc;
+ }
+ }
+ else
+ {
+ if (PreviousWalkState->ReturnDesc)
+ {
+ /* Caller doesn't want it, must delete it */
+
+ AcpiUtRemoveReference (PreviousWalkState->ReturnDesc);
+ }
+ if (PreviousWalkState->ImplicitReturnObj)
+ {
+ /* Caller doesn't want it, must delete it */
+
+ AcpiUtRemoveReference (PreviousWalkState->ImplicitReturnObj);
+ }
+ }
+
+ AcpiDsDeleteWalkState (PreviousWalkState);
+ }
+
+ /* Normal exit */
+
+ AcpiExReleaseAllMutexes (Thread);
+ AcpiUtDeleteGenericState (ACPI_CAST_PTR (ACPI_GENERIC_STATE, Thread));
+ AcpiGbl_CurrentWalkList = PrevWalkList;
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/psscope.c b/sys/contrib/dev/acpica/psscope.c
new file mode 100644
index 0000000..ea0a613
--- /dev/null
+++ b/sys/contrib/dev/acpica/psscope.c
@@ -0,0 +1,374 @@
+/******************************************************************************
+ *
+ * Module Name: psscope - Parser scope stack management routines
+ * $Revision: 1.47 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+
+#define _COMPONENT ACPI_PARSER
+ ACPI_MODULE_NAME ("psscope")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetParentScope
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ *
+ * RETURN: Pointer to an Op object
+ *
+ * DESCRIPTION: Get parent of current op being parsed
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+AcpiPsGetParentScope (
+ ACPI_PARSE_STATE *ParserState)
+{
+
+ return (ParserState->Scope->ParseScope.Op);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsHasCompletedScope
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ *
+ * RETURN: Boolean, TRUE = scope completed.
+ *
+ * DESCRIPTION: Is parsing of current argument complete? Determined by
+ * 1) AML pointer is at or beyond the end of the scope
+ * 2) The scope argument count has reached zero.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiPsHasCompletedScope (
+ ACPI_PARSE_STATE *ParserState)
+{
+
+ return ((BOOLEAN)
+ ((ParserState->Aml >= ParserState->Scope->ParseScope.ArgEnd ||
+ !ParserState->Scope->ParseScope.ArgCount)));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsInitScope
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ * Root - the Root Node of this new scope
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Allocate and init a new scope object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiPsInitScope (
+ ACPI_PARSE_STATE *ParserState,
+ ACPI_PARSE_OBJECT *RootOp)
+{
+ ACPI_GENERIC_STATE *Scope;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsInitScope, RootOp);
+
+
+ Scope = AcpiUtCreateGenericState ();
+ if (!Scope)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Scope->Common.DescriptorType = ACPI_DESC_TYPE_STATE_RPSCOPE;
+ Scope->ParseScope.Op = RootOp;
+ Scope->ParseScope.ArgCount = ACPI_VAR_ARGS;
+ Scope->ParseScope.ArgEnd = ParserState->AmlEnd;
+ Scope->ParseScope.PkgEnd = ParserState->AmlEnd;
+
+ ParserState->Scope = Scope;
+ ParserState->StartOp = RootOp;
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsPushScope
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ * Op - Current op to be pushed
+ * RemainingArgs - List of args remaining
+ * ArgCount - Fixed or variable number of args
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Push current op to begin parsing its argument
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiPsPushScope (
+ ACPI_PARSE_STATE *ParserState,
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 RemainingArgs,
+ UINT32 ArgCount)
+{
+ ACPI_GENERIC_STATE *Scope;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsPushScope, Op);
+
+
+ Scope = AcpiUtCreateGenericState ();
+ if (!Scope)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Scope->Common.DescriptorType = ACPI_DESC_TYPE_STATE_PSCOPE;
+ Scope->ParseScope.Op = Op;
+ Scope->ParseScope.ArgList = RemainingArgs;
+ Scope->ParseScope.ArgCount = ArgCount;
+ Scope->ParseScope.PkgEnd = ParserState->PkgEnd;
+
+ /* Push onto scope stack */
+
+ AcpiUtPushGenericState (&ParserState->Scope, Scope);
+
+ if (ArgCount == ACPI_VAR_ARGS)
+ {
+ /* Multiple arguments */
+
+ Scope->ParseScope.ArgEnd = ParserState->PkgEnd;
+ }
+ else
+ {
+ /* Single argument */
+
+ Scope->ParseScope.ArgEnd = ACPI_TO_POINTER (ACPI_MAX_PTR);
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsPopScope
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ * Op - Where the popped op is returned
+ * ArgList - Where the popped "next argument" is
+ * returned
+ * ArgCount - Count of objects in ArgList
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Return to parsing a previous op
+ *
+ ******************************************************************************/
+
+void
+AcpiPsPopScope (
+ ACPI_PARSE_STATE *ParserState,
+ ACPI_PARSE_OBJECT **Op,
+ UINT32 *ArgList,
+ UINT32 *ArgCount)
+{
+ ACPI_GENERIC_STATE *Scope = ParserState->Scope;
+
+
+ ACPI_FUNCTION_TRACE (PsPopScope);
+
+
+ /* Only pop the scope if there is in fact a next scope */
+
+ if (Scope->Common.Next)
+ {
+ Scope = AcpiUtPopGenericState (&ParserState->Scope);
+
+ /* Return to parsing previous op */
+
+ *Op = Scope->ParseScope.Op;
+ *ArgList = Scope->ParseScope.ArgList;
+ *ArgCount = Scope->ParseScope.ArgCount;
+ ParserState->PkgEnd = Scope->ParseScope.PkgEnd;
+
+ /* All done with this scope state structure */
+
+ AcpiUtDeleteGenericState (Scope);
+ }
+ else
+ {
+ /* Empty parse stack, prepare to fetch next opcode */
+
+ *Op = NULL;
+ *ArgList = 0;
+ *ArgCount = 0;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "Popped Op %p Args %X\n", *Op, *ArgCount));
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsCleanupScope
+ *
+ * PARAMETERS: ParserState - Current parser state object
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Destroy available list, remaining stack levels, and return
+ * root scope
+ *
+ ******************************************************************************/
+
+void
+AcpiPsCleanupScope (
+ ACPI_PARSE_STATE *ParserState)
+{
+ ACPI_GENERIC_STATE *Scope;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsCleanupScope, ParserState);
+
+
+ if (!ParserState)
+ {
+ return_VOID;
+ }
+
+ /* Delete anything on the scope stack */
+
+ while (ParserState->Scope)
+ {
+ Scope = AcpiUtPopGenericState (&ParserState->Scope);
+ AcpiUtDeleteGenericState (Scope);
+ }
+
+ return_VOID;
+}
+
diff --git a/sys/contrib/dev/acpica/pstree.c b/sys/contrib/dev/acpica/pstree.c
new file mode 100644
index 0000000..f6f0170
--- /dev/null
+++ b/sys/contrib/dev/acpica/pstree.c
@@ -0,0 +1,427 @@
+/******************************************************************************
+ *
+ * Module Name: pstree - Parser op tree manipulation/traversal/search
+ * $Revision: 1.51 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __PSTREE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+#define _COMPONENT ACPI_PARSER
+ ACPI_MODULE_NAME ("pstree")
+
+/* Local prototypes */
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+ACPI_PARSE_OBJECT *
+AcpiPsGetChild (
+ ACPI_PARSE_OBJECT *op);
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetArg
+ *
+ * PARAMETERS: Op - Get an argument for this op
+ * Argn - Nth argument to get
+ *
+ * RETURN: The argument (as an Op object). NULL if argument does not exist
+ *
+ * DESCRIPTION: Get the specified op's argument.
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+AcpiPsGetArg (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 Argn)
+{
+ ACPI_PARSE_OBJECT *Arg = NULL;
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Get the info structure for this opcode */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ if (OpInfo->Class == AML_CLASS_UNKNOWN)
+ {
+ /* Invalid opcode or ASCII character */
+
+ return (NULL);
+ }
+
+ /* Check if this opcode requires argument sub-objects */
+
+ if (!(OpInfo->Flags & AML_HAS_ARGS))
+ {
+ /* Has no linked argument objects */
+
+ return (NULL);
+ }
+
+ /* Get the requested argument object */
+
+ Arg = Op->Common.Value.Arg;
+ while (Arg && Argn)
+ {
+ Argn--;
+ Arg = Arg->Common.Next;
+ }
+
+ return (Arg);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsAppendArg
+ *
+ * PARAMETERS: Op - Append an argument to this Op.
+ * Arg - Argument Op to append
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Append an argument to an op's argument list (a NULL arg is OK)
+ *
+ ******************************************************************************/
+
+void
+AcpiPsAppendArg (
+ ACPI_PARSE_OBJECT *Op,
+ ACPI_PARSE_OBJECT *Arg)
+{
+ ACPI_PARSE_OBJECT *PrevArg;
+ const ACPI_OPCODE_INFO *OpInfo;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!Op)
+ {
+ return;
+ }
+
+ /* Get the info structure for this opcode */
+
+ OpInfo = AcpiPsGetOpcodeInfo (Op->Common.AmlOpcode);
+ if (OpInfo->Class == AML_CLASS_UNKNOWN)
+ {
+ /* Invalid opcode */
+
+ ACPI_ERROR ((AE_INFO, "Invalid AML Opcode: 0x%2.2X",
+ Op->Common.AmlOpcode));
+ return;
+ }
+
+ /* Check if this opcode requires argument sub-objects */
+
+ if (!(OpInfo->Flags & AML_HAS_ARGS))
+ {
+ /* Has no linked argument objects */
+
+ return;
+ }
+
+ /* Append the argument to the linked argument list */
+
+ if (Op->Common.Value.Arg)
+ {
+ /* Append to existing argument list */
+
+ PrevArg = Op->Common.Value.Arg;
+ while (PrevArg->Common.Next)
+ {
+ PrevArg = PrevArg->Common.Next;
+ }
+ PrevArg->Common.Next = Arg;
+ }
+ else
+ {
+ /* No argument list, this will be the first argument */
+
+ Op->Common.Value.Arg = Arg;
+ }
+
+ /* Set the parent in this arg and any args linked after it */
+
+ while (Arg)
+ {
+ Arg->Common.Parent = Op;
+ Arg = Arg->Common.Next;
+
+ Op->Common.ArgListLength++;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetDepthNext
+ *
+ * PARAMETERS: Origin - Root of subtree to search
+ * Op - Last (previous) Op that was found
+ *
+ * RETURN: Next Op found in the search.
+ *
+ * DESCRIPTION: Get next op in tree (walking the tree in depth-first order)
+ * Return NULL when reaching "origin" or when walking up from root
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+AcpiPsGetDepthNext (
+ ACPI_PARSE_OBJECT *Origin,
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Next = NULL;
+ ACPI_PARSE_OBJECT *Parent;
+ ACPI_PARSE_OBJECT *Arg;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!Op)
+ {
+ return (NULL);
+ }
+
+ /* Look for an argument or child */
+
+ Next = AcpiPsGetArg (Op, 0);
+ if (Next)
+ {
+ return (Next);
+ }
+
+ /* Look for a sibling */
+
+ Next = Op->Common.Next;
+ if (Next)
+ {
+ return (Next);
+ }
+
+ /* Look for a sibling of parent */
+
+ Parent = Op->Common.Parent;
+
+ while (Parent)
+ {
+ Arg = AcpiPsGetArg (Parent, 0);
+ while (Arg && (Arg != Origin) && (Arg != Op))
+ {
+ Arg = Arg->Common.Next;
+ }
+
+ if (Arg == Origin)
+ {
+ /* Reached parent of origin, end search */
+
+ return (NULL);
+ }
+
+ if (Parent->Common.Next)
+ {
+ /* Found sibling of parent */
+
+ return (Parent->Common.Next);
+ }
+
+ Op = Parent;
+ Parent = Parent->Common.Parent;
+ }
+
+ return (Next);
+}
+
+
+#ifdef ACPI_OBSOLETE_FUNCTIONS
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsGetChild
+ *
+ * PARAMETERS: Op - Get the child of this Op
+ *
+ * RETURN: Child Op, Null if none is found.
+ *
+ * DESCRIPTION: Get op's children or NULL if none
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+AcpiPsGetChild (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_PARSE_OBJECT *Child = NULL;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ switch (Op->Common.AmlOpcode)
+ {
+ case AML_SCOPE_OP:
+ case AML_ELSE_OP:
+ case AML_DEVICE_OP:
+ case AML_THERMAL_ZONE_OP:
+ case AML_INT_METHODCALL_OP:
+
+ Child = AcpiPsGetArg (Op, 0);
+ break;
+
+
+ case AML_BUFFER_OP:
+ case AML_PACKAGE_OP:
+ case AML_METHOD_OP:
+ case AML_IF_OP:
+ case AML_WHILE_OP:
+ case AML_FIELD_OP:
+
+ Child = AcpiPsGetArg (Op, 1);
+ break;
+
+
+ case AML_POWER_RES_OP:
+ case AML_INDEX_FIELD_OP:
+
+ Child = AcpiPsGetArg (Op, 2);
+ break;
+
+
+ case AML_PROCESSOR_OP:
+ case AML_BANK_FIELD_OP:
+
+ Child = AcpiPsGetArg (Op, 3);
+ break;
+
+
+ default:
+ /* All others have no children */
+ break;
+ }
+
+ return (Child);
+}
+#endif
+
+
diff --git a/sys/contrib/dev/acpica/psutils.c b/sys/contrib/dev/acpica/psutils.c
new file mode 100644
index 0000000..e8c8cf0
--- /dev/null
+++ b/sys/contrib/dev/acpica/psutils.c
@@ -0,0 +1,362 @@
+/******************************************************************************
+ *
+ * Module Name: psutils - Parser miscellaneous utilities (Parser only)
+ * $Revision: 1.70 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+#define _COMPONENT ACPI_PARSER
+ ACPI_MODULE_NAME ("psutils")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsCreateScopeOp
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: A new Scope object, null on failure
+ *
+ * DESCRIPTION: Create a Scope and associated namepath op with the root name
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT *
+AcpiPsCreateScopeOp (
+ void)
+{
+ ACPI_PARSE_OBJECT *ScopeOp;
+
+
+ ScopeOp = AcpiPsAllocOp (AML_SCOPE_OP);
+ if (!ScopeOp)
+ {
+ return (NULL);
+ }
+
+ ScopeOp->Named.Name = ACPI_ROOT_NAME;
+ return (ScopeOp);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsInitOp
+ *
+ * PARAMETERS: Op - A newly allocated Op object
+ * Opcode - Opcode to store in the Op
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Initialize a parse (Op) object
+ *
+ ******************************************************************************/
+
+void
+AcpiPsInitOp (
+ ACPI_PARSE_OBJECT *Op,
+ UINT16 Opcode)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ Op->Common.DescriptorType = ACPI_DESC_TYPE_PARSER;
+ Op->Common.AmlOpcode = Opcode;
+
+ ACPI_DISASM_ONLY_MEMBERS (ACPI_STRNCPY (Op->Common.AmlOpName,
+ (AcpiPsGetOpcodeInfo (Opcode))->Name,
+ sizeof (Op->Common.AmlOpName)));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsAllocOp
+ *
+ * PARAMETERS: Opcode - Opcode that will be stored in the new Op
+ *
+ * RETURN: Pointer to the new Op, null on failure
+ *
+ * DESCRIPTION: Allocate an acpi_op, choose op type (and thus size) based on
+ * opcode. A cache of opcodes is available for the pure
+ * GENERIC_OP, since this is by far the most commonly used.
+ *
+ ******************************************************************************/
+
+ACPI_PARSE_OBJECT*
+AcpiPsAllocOp (
+ UINT16 Opcode)
+{
+ ACPI_PARSE_OBJECT *Op;
+ const ACPI_OPCODE_INFO *OpInfo;
+ UINT8 Flags = ACPI_PARSEOP_GENERIC;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ OpInfo = AcpiPsGetOpcodeInfo (Opcode);
+
+ /* Determine type of ParseOp required */
+
+ if (OpInfo->Flags & AML_DEFER)
+ {
+ Flags = ACPI_PARSEOP_DEFERRED;
+ }
+ else if (OpInfo->Flags & AML_NAMED)
+ {
+ Flags = ACPI_PARSEOP_NAMED;
+ }
+ else if (Opcode == AML_INT_BYTELIST_OP)
+ {
+ Flags = ACPI_PARSEOP_BYTELIST;
+ }
+
+ /* Allocate the minimum required size object */
+
+ if (Flags == ACPI_PARSEOP_GENERIC)
+ {
+ /* The generic op (default) is by far the most common (16 to 1) */
+
+ Op = AcpiOsAcquireObject (AcpiGbl_PsNodeCache);
+ }
+ else
+ {
+ /* Extended parseop */
+
+ Op = AcpiOsAcquireObject (AcpiGbl_PsNodeExtCache);
+ }
+
+ /* Initialize the Op */
+
+ if (Op)
+ {
+ AcpiPsInitOp (Op, Opcode);
+ Op->Common.Flags = Flags;
+ }
+
+ return (Op);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsFreeOp
+ *
+ * PARAMETERS: Op - Op to be freed
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Free an Op object. Either put it on the GENERIC_OP cache list
+ * or actually free it.
+ *
+ ******************************************************************************/
+
+void
+AcpiPsFreeOp (
+ ACPI_PARSE_OBJECT *Op)
+{
+ ACPI_FUNCTION_NAME (PsFreeOp);
+
+
+ if (Op->Common.AmlOpcode == AML_INT_RETURN_VALUE_OP)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Free retval op: %p\n", Op));
+ }
+
+ if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
+ {
+ (void) AcpiOsReleaseObject (AcpiGbl_PsNodeCache, Op);
+ }
+ else
+ {
+ (void) AcpiOsReleaseObject (AcpiGbl_PsNodeExtCache, Op);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: Utility functions
+ *
+ * DESCRIPTION: Low level character and object functions
+ *
+ ******************************************************************************/
+
+
+/*
+ * Is "c" a namestring lead character?
+ */
+BOOLEAN
+AcpiPsIsLeadingChar (
+ UINT32 c)
+{
+ return ((BOOLEAN) (c == '_' || (c >= 'A' && c <= 'Z')));
+}
+
+
+/*
+ * Is "c" a namestring prefix character?
+ */
+BOOLEAN
+AcpiPsIsPrefixChar (
+ UINT32 c)
+{
+ return ((BOOLEAN) (c == '\\' || c == '^'));
+}
+
+
+/*
+ * Get op's name (4-byte name segment) or 0 if unnamed
+ */
+UINT32
+AcpiPsGetName (
+ ACPI_PARSE_OBJECT *Op)
+{
+
+ /* The "generic" object has no name associated with it */
+
+ if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
+ {
+ return (0);
+ }
+
+ /* Only the "Extended" parse objects have a name */
+
+ return (Op->Named.Name);
+}
+
+
+/*
+ * Set op's name
+ */
+void
+AcpiPsSetName (
+ ACPI_PARSE_OBJECT *Op,
+ UINT32 name)
+{
+
+ /* The "generic" object has no name associated with it */
+
+ if (Op->Common.Flags & ACPI_PARSEOP_GENERIC)
+ {
+ return;
+ }
+
+ Op->Named.Name = name;
+}
+
diff --git a/sys/contrib/dev/acpica/pswalk.c b/sys/contrib/dev/acpica/pswalk.c
new file mode 100644
index 0000000..af4099f
--- /dev/null
+++ b/sys/contrib/dev/acpica/pswalk.c
@@ -0,0 +1,193 @@
+/******************************************************************************
+ *
+ * Module Name: pswalk - Parser routines to walk parsed op tree(s)
+ * $Revision: 1.78 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+
+#define _COMPONENT ACPI_PARSER
+ ACPI_MODULE_NAME ("pswalk")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsDeleteParseTree
+ *
+ * PARAMETERS: SubtreeRoot - Root of tree (or subtree) to delete
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Delete a portion of or an entire parse tree.
+ *
+ ******************************************************************************/
+
+void
+AcpiPsDeleteParseTree (
+ ACPI_PARSE_OBJECT *SubtreeRoot)
+{
+ ACPI_PARSE_OBJECT *Op = SubtreeRoot;
+ ACPI_PARSE_OBJECT *Next = NULL;
+ ACPI_PARSE_OBJECT *Parent = NULL;
+
+
+ ACPI_FUNCTION_TRACE_PTR (PsDeleteParseTree, SubtreeRoot);
+
+
+ /* Visit all nodes in the subtree */
+
+ while (Op)
+ {
+ /* Check if we are not ascending */
+
+ if (Op != Parent)
+ {
+ /* Look for an argument or child of the current op */
+
+ Next = AcpiPsGetArg (Op, 0);
+ if (Next)
+ {
+ /* Still going downward in tree (Op is not completed yet) */
+
+ Op = Next;
+ continue;
+ }
+ }
+
+ /* No more children, this Op is complete. */
+
+ Next = Op->Common.Next;
+ Parent = Op->Common.Parent;
+
+ AcpiPsFreeOp (Op);
+
+ /* If we are back to the starting point, the walk is complete. */
+
+ if (Op == SubtreeRoot)
+ {
+ return_VOID;
+ }
+ if (Next)
+ {
+ Op = Next;
+ }
+ else
+ {
+ Op = Parent;
+ }
+ }
+
+ return_VOID;
+}
diff --git a/sys/contrib/dev/acpica/psxface.c b/sys/contrib/dev/acpica/psxface.c
new file mode 100644
index 0000000..b1ff8e8
--- /dev/null
+++ b/sys/contrib/dev/acpica/psxface.c
@@ -0,0 +1,473 @@
+/******************************************************************************
+ *
+ * Module Name: psxface - Parser external interfaces
+ * $Revision: 1.93 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __PSXFACE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acparser.h>
+#include <contrib/dev/acpica/acdispat.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+
+#define _COMPONENT ACPI_PARSER
+ ACPI_MODULE_NAME ("psxface")
+
+/* Local Prototypes */
+
+static void
+AcpiPsStartTrace (
+ ACPI_EVALUATE_INFO *Info);
+
+static void
+AcpiPsStopTrace (
+ ACPI_EVALUATE_INFO *Info);
+
+static void
+AcpiPsUpdateParameterList (
+ ACPI_EVALUATE_INFO *Info,
+ UINT16 Action);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiDebugTrace
+ *
+ * PARAMETERS: MethodName - Valid ACPI name string
+ * DebugLevel - Optional level mask. 0 to use default
+ * DebugLayer - Optional layer mask. 0 to use default
+ * Flags - bit 1: one shot(1) or persistent(0)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: External interface to enable debug tracing during control
+ * method execution
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiDebugTrace (
+ char *Name,
+ UINT32 DebugLevel,
+ UINT32 DebugLayer,
+ UINT32 Flags)
+{
+ ACPI_STATUS Status;
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* TBDs: Validate name, allow full path or just nameseg */
+
+ AcpiGbl_TraceMethodName = *ACPI_CAST_PTR (UINT32, Name);
+ AcpiGbl_TraceFlags = Flags;
+
+ if (DebugLevel)
+ {
+ AcpiGbl_TraceDbgLevel = DebugLevel;
+ }
+ if (DebugLayer)
+ {
+ AcpiGbl_TraceDbgLayer = DebugLayer;
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsStartTrace
+ *
+ * PARAMETERS: Info - Method info struct
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Start control method execution trace
+ *
+ ******************************************************************************/
+
+static void
+AcpiPsStartTrace (
+ ACPI_EVALUATE_INFO *Info)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ if ((!AcpiGbl_TraceMethodName) ||
+ (AcpiGbl_TraceMethodName != Info->ResolvedNode->Name.Integer))
+ {
+ goto Exit;
+ }
+
+ AcpiGbl_OriginalDbgLevel = AcpiDbgLevel;
+ AcpiGbl_OriginalDbgLayer = AcpiDbgLayer;
+
+ AcpiDbgLevel = 0x00FFFFFF;
+ AcpiDbgLayer = ACPI_UINT32_MAX;
+
+ if (AcpiGbl_TraceDbgLevel)
+ {
+ AcpiDbgLevel = AcpiGbl_TraceDbgLevel;
+ }
+ if (AcpiGbl_TraceDbgLayer)
+ {
+ AcpiDbgLayer = AcpiGbl_TraceDbgLayer;
+ }
+
+
+Exit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsStopTrace
+ *
+ * PARAMETERS: Info - Method info struct
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Stop control method execution trace
+ *
+ ******************************************************************************/
+
+static void
+AcpiPsStopTrace (
+ ACPI_EVALUATE_INFO *Info)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_NAMESPACE);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ if ((!AcpiGbl_TraceMethodName) ||
+ (AcpiGbl_TraceMethodName != Info->ResolvedNode->Name.Integer))
+ {
+ goto Exit;
+ }
+
+ /* Disable further tracing if type is one-shot */
+
+ if (AcpiGbl_TraceFlags & 1)
+ {
+ AcpiGbl_TraceMethodName = 0;
+ AcpiGbl_TraceDbgLevel = 0;
+ AcpiGbl_TraceDbgLayer = 0;
+ }
+
+ AcpiDbgLevel = AcpiGbl_OriginalDbgLevel;
+ AcpiDbgLayer = AcpiGbl_OriginalDbgLayer;
+
+Exit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_NAMESPACE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsExecuteMethod
+ *
+ * PARAMETERS: Info - Method info block, contains:
+ * Node - Method Node to execute
+ * ObjDesc - Method object
+ * Parameters - List of parameters to pass to the method,
+ * terminated by NULL. Params itself may be
+ * NULL if no parameters are being passed.
+ * ReturnObject - Where to put method's return value (if
+ * any). If NULL, no value is returned.
+ * ParameterType - Type of Parameter list
+ * ReturnObject - Where to put method's return value (if
+ * any). If NULL, no value is returned.
+ * PassNumber - Parse or execute pass
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Execute a control method
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiPsExecuteMethod (
+ ACPI_EVALUATE_INFO *Info)
+{
+ ACPI_STATUS Status;
+ ACPI_PARSE_OBJECT *Op;
+ ACPI_WALK_STATE *WalkState;
+
+
+ ACPI_FUNCTION_TRACE (PsExecuteMethod);
+
+
+ /* Validate the Info and method Node */
+
+ if (!Info || !Info->ResolvedNode)
+ {
+ return_ACPI_STATUS (AE_NULL_ENTRY);
+ }
+
+ /* Init for new method, wait on concurrency semaphore */
+
+ Status = AcpiDsBeginMethodExecution (Info->ResolvedNode, Info->ObjDesc, NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * The caller "owns" the parameters, so give each one an extra reference
+ */
+ AcpiPsUpdateParameterList (Info, REF_INCREMENT);
+
+ /* Begin tracing if requested */
+
+ AcpiPsStartTrace (Info);
+
+ /*
+ * Execute the method. Performs parse simultaneously
+ */
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE,
+ "**** Begin Method Parse/Execute [%4.4s] **** Node=%p Obj=%p\n",
+ Info->ResolvedNode->Name.Ascii, Info->ResolvedNode, Info->ObjDesc));
+
+ /* Create and init a Root Node */
+
+ Op = AcpiPsCreateScopeOp ();
+ if (!Op)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ /* Create and initialize a new walk state */
+
+ Info->PassNumber = ACPI_IMODE_EXECUTE;
+ WalkState = AcpiDsCreateWalkState (
+ Info->ObjDesc->Method.OwnerId, NULL, NULL, NULL);
+ if (!WalkState)
+ {
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ Status = AcpiDsInitAmlWalk (WalkState, Op, Info->ResolvedNode,
+ Info->ObjDesc->Method.AmlStart,
+ Info->ObjDesc->Method.AmlLength, Info, Info->PassNumber);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiDsDeleteWalkState (WalkState);
+ goto Cleanup;
+ }
+
+ /* Parse the AML */
+
+ Status = AcpiPsParseAml (WalkState);
+
+ /* WalkState was deleted by ParseAml */
+
+Cleanup:
+ AcpiPsDeleteParseTree (Op);
+
+ /* End optional tracing */
+
+ AcpiPsStopTrace (Info);
+
+ /* Take away the extra reference that we gave the parameters above */
+
+ AcpiPsUpdateParameterList (Info, REF_DECREMENT);
+
+ /* Exit now if error above */
+
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * If the method has returned an object, signal this to the caller with
+ * a control exception code
+ */
+ if (Info->ReturnObject)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_PARSE, "Method returned ObjDesc=%p\n",
+ Info->ReturnObject));
+ ACPI_DUMP_STACK_ENTRY (Info->ReturnObject);
+
+ Status = AE_CTRL_RETURN_VALUE;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiPsUpdateParameterList
+ *
+ * PARAMETERS: Info - See ACPI_EVALUATE_INFO
+ * (Used: ParameterType and Parameters)
+ * Action - Add or Remove reference
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Update reference count on all method parameter objects
+ *
+ ******************************************************************************/
+
+static void
+AcpiPsUpdateParameterList (
+ ACPI_EVALUATE_INFO *Info,
+ UINT16 Action)
+{
+ ACPI_NATIVE_UINT i;
+
+
+ if ((Info->ParameterType == ACPI_PARAM_ARGS) &&
+ (Info->Parameters))
+ {
+ /* Update reference count for each parameter */
+
+ for (i = 0; Info->Parameters[i]; i++)
+ {
+ /* Ignore errors, just do them all */
+
+ (void) AcpiUtUpdateObjectReference (Info->Parameters[i], Action);
+ }
+ }
+}
+
+
diff --git a/sys/contrib/dev/acpica/rsaddr.c b/sys/contrib/dev/acpica/rsaddr.c
new file mode 100644
index 0000000..6a11937
--- /dev/null
+++ b/sys/contrib/dev/acpica/rsaddr.c
@@ -0,0 +1,479 @@
+/*******************************************************************************
+ *
+ * Module Name: rsaddr - Address resource descriptors (16/32/64)
+ * $Revision: 1.50 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __RSADDR_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rsaddr")
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertAddress16 - All WORD (16-bit) address resources
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertAddress16[5] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS16,
+ ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS16),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertAddress16)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS16,
+ sizeof (AML_RESOURCE_ADDRESS16),
+ 0},
+
+ /* Resource Type, General Flags, and Type-Specific Flags */
+
+ {ACPI_RSC_ADDRESS, 0, 0, 0},
+
+ /*
+ * These fields are contiguous in both the source and destination:
+ * Address Granularity
+ * Address Range Minimum
+ * Address Range Maximum
+ * Address Translation Offset
+ * Address Length
+ */
+ {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.Address16.Granularity),
+ AML_OFFSET (Address16.Granularity),
+ 5},
+
+ /* Optional ResourceSource (Index and String) */
+
+ {ACPI_RSC_SOURCE, ACPI_RS_OFFSET (Data.Address16.ResourceSource),
+ 0,
+ sizeof (AML_RESOURCE_ADDRESS16)}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertAddress32 - All DWORD (32-bit) address resources
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertAddress32[5] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS32,
+ ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS32),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertAddress32)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS32,
+ sizeof (AML_RESOURCE_ADDRESS32),
+ 0},
+
+ /* Resource Type, General Flags, and Type-Specific Flags */
+
+ {ACPI_RSC_ADDRESS, 0, 0, 0},
+
+ /*
+ * These fields are contiguous in both the source and destination:
+ * Address Granularity
+ * Address Range Minimum
+ * Address Range Maximum
+ * Address Translation Offset
+ * Address Length
+ */
+ {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.Address32.Granularity),
+ AML_OFFSET (Address32.Granularity),
+ 5},
+
+ /* Optional ResourceSource (Index and String) */
+
+ {ACPI_RSC_SOURCE, ACPI_RS_OFFSET (Data.Address32.ResourceSource),
+ 0,
+ sizeof (AML_RESOURCE_ADDRESS32)}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertAddress64 - All QWORD (64-bit) address resources
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertAddress64[5] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_ADDRESS64,
+ ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS64),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertAddress64)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_ADDRESS64,
+ sizeof (AML_RESOURCE_ADDRESS64),
+ 0},
+
+ /* Resource Type, General Flags, and Type-Specific Flags */
+
+ {ACPI_RSC_ADDRESS, 0, 0, 0},
+
+ /*
+ * These fields are contiguous in both the source and destination:
+ * Address Granularity
+ * Address Range Minimum
+ * Address Range Maximum
+ * Address Translation Offset
+ * Address Length
+ */
+ {ACPI_RSC_MOVE64, ACPI_RS_OFFSET (Data.Address64.Granularity),
+ AML_OFFSET (Address64.Granularity),
+ 5},
+
+ /* Optional ResourceSource (Index and String) */
+
+ {ACPI_RSC_SOURCE, ACPI_RS_OFFSET (Data.Address64.ResourceSource),
+ 0,
+ sizeof (AML_RESOURCE_ADDRESS64)}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertExtAddress64 - All Extended (64-bit) address resources
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertExtAddress64[5] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64,
+ ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_ADDRESS64),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertExtAddress64)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64,
+ sizeof (AML_RESOURCE_EXTENDED_ADDRESS64),
+ 0},
+
+ /* Resource Type, General Flags, and Type-Specific Flags */
+
+ {ACPI_RSC_ADDRESS, 0, 0, 0},
+
+ /* Revision ID */
+
+ {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.ExtAddress64.RevisionID),
+ AML_OFFSET (ExtAddress64.RevisionID),
+ 1},
+ /*
+ * These fields are contiguous in both the source and destination:
+ * Address Granularity
+ * Address Range Minimum
+ * Address Range Maximum
+ * Address Translation Offset
+ * Address Length
+ * Type-Specific Attribute
+ */
+ {ACPI_RSC_MOVE64, ACPI_RS_OFFSET (Data.ExtAddress64.Granularity),
+ AML_OFFSET (ExtAddress64.Granularity),
+ 6}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertGeneralFlags - Flags common to all address descriptors
+ *
+ ******************************************************************************/
+
+static ACPI_RSCONVERT_INFO AcpiRsConvertGeneralFlags[6] =
+{
+ {ACPI_RSC_FLAGINIT, 0, AML_OFFSET (Address.Flags),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertGeneralFlags)},
+
+ /* Resource Type (Memory, Io, BusNumber, etc.) */
+
+ {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Address.ResourceType),
+ AML_OFFSET (Address.ResourceType),
+ 1},
+
+ /* General Flags - Consume, Decode, MinFixed, MaxFixed */
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.ProducerConsumer),
+ AML_OFFSET (Address.Flags),
+ 0},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Decode),
+ AML_OFFSET (Address.Flags),
+ 1},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.MinAddressFixed),
+ AML_OFFSET (Address.Flags),
+ 2},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.MaxAddressFixed),
+ AML_OFFSET (Address.Flags),
+ 3}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertMemFlags - Flags common to Memory address descriptors
+ *
+ ******************************************************************************/
+
+static ACPI_RSCONVERT_INFO AcpiRsConvertMemFlags[5] =
+{
+ {ACPI_RSC_FLAGINIT, 0, AML_OFFSET (Address.SpecificFlags),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertMemFlags)},
+
+ /* Memory-specific flags */
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.WriteProtect),
+ AML_OFFSET (Address.SpecificFlags),
+ 0},
+
+ {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.Caching),
+ AML_OFFSET (Address.SpecificFlags),
+ 1},
+
+ {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.RangeType),
+ AML_OFFSET (Address.SpecificFlags),
+ 3},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Mem.Translation),
+ AML_OFFSET (Address.SpecificFlags),
+ 5}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertIoFlags - Flags common to I/O address descriptors
+ *
+ ******************************************************************************/
+
+static ACPI_RSCONVERT_INFO AcpiRsConvertIoFlags[4] =
+{
+ {ACPI_RSC_FLAGINIT, 0, AML_OFFSET (Address.SpecificFlags),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertIoFlags)},
+
+ /* I/O-specific flags */
+
+ {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Io.RangeType),
+ AML_OFFSET (Address.SpecificFlags),
+ 0},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Io.Translation),
+ AML_OFFSET (Address.SpecificFlags),
+ 4},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Address.Info.Io.TranslationType),
+ AML_OFFSET (Address.SpecificFlags),
+ 5}
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsGetAddressCommon
+ *
+ * PARAMETERS: Resource - Pointer to the internal resource struct
+ * Aml - Pointer to the AML resource descriptor
+ *
+ * RETURN: TRUE if the ResourceType field is OK, FALSE otherwise
+ *
+ * DESCRIPTION: Convert common flag fields from a raw AML resource descriptor
+ * to an internal resource descriptor
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiRsGetAddressCommon (
+ ACPI_RESOURCE *Resource,
+ AML_RESOURCE *Aml)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Validate the Resource Type */
+
+ if ((Aml->Address.ResourceType > 2) && (Aml->Address.ResourceType < 0xC0))
+ {
+ return (FALSE);
+ }
+
+ /* Get the Resource Type and General Flags */
+
+ (void) AcpiRsConvertAmlToResource (Resource, Aml, AcpiRsConvertGeneralFlags);
+
+ /* Get the Type-Specific Flags (Memory and I/O descriptors only) */
+
+ if (Resource->Data.Address.ResourceType == ACPI_MEMORY_RANGE)
+ {
+ (void) AcpiRsConvertAmlToResource (Resource, Aml, AcpiRsConvertMemFlags);
+ }
+ else if (Resource->Data.Address.ResourceType == ACPI_IO_RANGE)
+ {
+ (void) AcpiRsConvertAmlToResource (Resource, Aml, AcpiRsConvertIoFlags);
+ }
+ else
+ {
+ /* Generic resource type, just grab the TypeSpecific byte */
+
+ Resource->Data.Address.Info.TypeSpecific = Aml->Address.SpecificFlags;
+ }
+
+ return (TRUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsSetAddressCommon
+ *
+ * PARAMETERS: Aml - Pointer to the AML resource descriptor
+ * Resource - Pointer to the internal resource struct
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Convert common flag fields from a resource descriptor to an
+ * AML descriptor
+ *
+ ******************************************************************************/
+
+void
+AcpiRsSetAddressCommon (
+ AML_RESOURCE *Aml,
+ ACPI_RESOURCE *Resource)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Set the Resource Type and General Flags */
+
+ (void) AcpiRsConvertResourceToAml (Resource, Aml, AcpiRsConvertGeneralFlags);
+
+ /* Set the Type-Specific Flags (Memory and I/O descriptors only) */
+
+ if (Resource->Data.Address.ResourceType == ACPI_MEMORY_RANGE)
+ {
+ (void) AcpiRsConvertResourceToAml (Resource, Aml, AcpiRsConvertMemFlags);
+ }
+ else if (Resource->Data.Address.ResourceType == ACPI_IO_RANGE)
+ {
+ (void) AcpiRsConvertResourceToAml (Resource, Aml, AcpiRsConvertIoFlags);
+ }
+ else
+ {
+ /* Generic resource type, just copy the TypeSpecific byte */
+
+ Aml->Address.SpecificFlags = Resource->Data.Address.Info.TypeSpecific;
+ }
+}
+
+
diff --git a/sys/contrib/dev/acpica/rscalc.c b/sys/contrib/dev/acpica/rscalc.c
new file mode 100644
index 0000000..d04568a
--- /dev/null
+++ b/sys/contrib/dev/acpica/rscalc.c
@@ -0,0 +1,715 @@
+/*******************************************************************************
+ *
+ * Module Name: rscalc - Calculate stream and list lengths
+ * $Revision: 1.80 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __RSCALC_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rscalc")
+
+
+/* Local prototypes */
+
+static UINT8
+AcpiRsCountSetBits (
+ UINT16 BitField);
+
+static ACPI_RS_LENGTH
+AcpiRsStructOptionLength (
+ ACPI_RESOURCE_SOURCE *ResourceSource);
+
+static UINT32
+AcpiRsStreamOptionLength (
+ UINT32 ResourceLength,
+ UINT32 MinimumTotalLength);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsCountSetBits
+ *
+ * PARAMETERS: BitField - Field in which to count bits
+ *
+ * RETURN: Number of bits set within the field
+ *
+ * DESCRIPTION: Count the number of bits set in a resource field. Used for
+ * (Short descriptor) interrupt and DMA lists.
+ *
+ ******************************************************************************/
+
+static UINT8
+AcpiRsCountSetBits (
+ UINT16 BitField)
+{
+ UINT8 BitsSet;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ for (BitsSet = 0; BitField; BitsSet++)
+ {
+ /* Zero the least significant bit that is set */
+
+ BitField &= (BitField - 1);
+ }
+
+ return (BitsSet);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsStructOptionLength
+ *
+ * PARAMETERS: ResourceSource - Pointer to optional descriptor field
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Common code to handle optional ResourceSourceIndex and
+ * ResourceSource fields in some Large descriptors. Used during
+ * list-to-stream conversion
+ *
+ ******************************************************************************/
+
+static ACPI_RS_LENGTH
+AcpiRsStructOptionLength (
+ ACPI_RESOURCE_SOURCE *ResourceSource)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * If the ResourceSource string is valid, return the size of the string
+ * (StringLength includes the NULL terminator) plus the size of the
+ * ResourceSourceIndex (1).
+ */
+ if (ResourceSource->StringPtr)
+ {
+ return ((ACPI_RS_LENGTH) (ResourceSource->StringLength + 1));
+ }
+
+ return (0);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsStreamOptionLength
+ *
+ * PARAMETERS: ResourceLength - Length from the resource header
+ * MinimumTotalLength - Minimum length of this resource, before
+ * any optional fields. Includes header size
+ *
+ * RETURN: Length of optional string (0 if no string present)
+ *
+ * DESCRIPTION: Common code to handle optional ResourceSourceIndex and
+ * ResourceSource fields in some Large descriptors. Used during
+ * stream-to-list conversion
+ *
+ ******************************************************************************/
+
+static UINT32
+AcpiRsStreamOptionLength (
+ UINT32 ResourceLength,
+ UINT32 MinimumAmlResourceLength)
+{
+ UINT32 StringLength = 0;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * The ResourceSourceIndex and ResourceSource are optional elements of some
+ * Large-type resource descriptors.
+ */
+
+ /*
+ * If the length of the actual resource descriptor is greater than the ACPI
+ * spec-defined minimum length, it means that a ResourceSourceIndex exists
+ * and is followed by a (required) null terminated string. The string length
+ * (including the null terminator) is the resource length minus the minimum
+ * length, minus one byte for the ResourceSourceIndex itself.
+ */
+ if (ResourceLength > MinimumAmlResourceLength)
+ {
+ /* Compute the length of the optional string */
+
+ StringLength = ResourceLength - MinimumAmlResourceLength - 1;
+ }
+
+ /*
+ * Round the length up to a multiple of the native word in order to
+ * guarantee that the entire resource descriptor is native word aligned
+ */
+ return ((UINT32) ACPI_ROUND_UP_TO_NATIVE_WORD (StringLength));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsGetAmlLength
+ *
+ * PARAMETERS: Resource - Pointer to the resource linked list
+ * SizeNeeded - Where the required size is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Takes a linked list of internal resource descriptors and
+ * calculates the size buffer needed to hold the corresponding
+ * external resource byte stream.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsGetAmlLength (
+ ACPI_RESOURCE *Resource,
+ ACPI_SIZE *SizeNeeded)
+{
+ ACPI_SIZE AmlSizeNeeded = 0;
+ ACPI_RS_LENGTH TotalSize;
+
+
+ ACPI_FUNCTION_TRACE (RsGetAmlLength);
+
+
+ /* Traverse entire list of internal resource descriptors */
+
+ while (Resource)
+ {
+ /* Validate the descriptor type */
+
+ if (Resource->Type > ACPI_RESOURCE_TYPE_MAX)
+ {
+ return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
+ }
+
+ /* Get the base size of the (external stream) resource descriptor */
+
+ TotalSize = AcpiGbl_AmlResourceSizes [Resource->Type];
+
+ /*
+ * Augment the base size for descriptors with optional and/or
+ * variable-length fields
+ */
+ switch (Resource->Type)
+ {
+ case ACPI_RESOURCE_TYPE_VENDOR:
+ /*
+ * Vendor Defined Resource:
+ * For a Vendor Specific resource, if the Length is between 1 and 7
+ * it will be created as a Small Resource data type, otherwise it
+ * is a Large Resource data type.
+ */
+ if (Resource->Data.Vendor.ByteLength > 7)
+ {
+ /* Base size of a Large resource descriptor */
+
+ TotalSize = sizeof (AML_RESOURCE_LARGE_HEADER);
+ }
+
+ /* Add the size of the vendor-specific data */
+
+ TotalSize = (ACPI_RS_LENGTH)
+ (TotalSize + Resource->Data.Vendor.ByteLength);
+ break;
+
+
+ case ACPI_RESOURCE_TYPE_END_TAG:
+ /*
+ * End Tag:
+ * We are done -- return the accumulated total size.
+ */
+ *SizeNeeded = AmlSizeNeeded + TotalSize;
+
+ /* Normal exit */
+
+ return_ACPI_STATUS (AE_OK);
+
+
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
+ /*
+ * 16-Bit Address Resource:
+ * Add the size of the optional ResourceSource info
+ */
+ TotalSize = (ACPI_RS_LENGTH)
+ (TotalSize + AcpiRsStructOptionLength (
+ &Resource->Data.Address16.ResourceSource));
+ break;
+
+
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
+ /*
+ * 32-Bit Address Resource:
+ * Add the size of the optional ResourceSource info
+ */
+ TotalSize = (ACPI_RS_LENGTH)
+ (TotalSize + AcpiRsStructOptionLength (
+ &Resource->Data.Address32.ResourceSource));
+ break;
+
+
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+ /*
+ * 64-Bit Address Resource:
+ * Add the size of the optional ResourceSource info
+ */
+ TotalSize = (ACPI_RS_LENGTH)
+ (TotalSize + AcpiRsStructOptionLength (
+ &Resource->Data.Address64.ResourceSource));
+ break;
+
+
+ case ACPI_RESOURCE_TYPE_EXTENDED_IRQ:
+ /*
+ * Extended IRQ Resource:
+ * Add the size of each additional optional interrupt beyond the
+ * required 1 (4 bytes for each UINT32 interrupt number)
+ */
+ TotalSize = (ACPI_RS_LENGTH)
+ (TotalSize +
+ ((Resource->Data.ExtendedIrq.InterruptCount - 1) * 4) +
+
+ /* Add the size of the optional ResourceSource info */
+
+ AcpiRsStructOptionLength (
+ &Resource->Data.ExtendedIrq.ResourceSource));
+ break;
+
+
+ default:
+ break;
+ }
+
+ /* Update the total */
+
+ AmlSizeNeeded += TotalSize;
+
+ /* Point to the next object */
+
+ Resource = ACPI_ADD_PTR (ACPI_RESOURCE, Resource, Resource->Length);
+ }
+
+ /* Did not find an EndTag resource descriptor */
+
+ return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsGetListLength
+ *
+ * PARAMETERS: AmlBuffer - Pointer to the resource byte stream
+ * AmlBufferLength - Size of AmlBuffer
+ * SizeNeeded - Where the size needed is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Takes an external resource byte stream and calculates the size
+ * buffer needed to hold the corresponding internal resource
+ * descriptor linked list.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsGetListLength (
+ UINT8 *AmlBuffer,
+ UINT32 AmlBufferLength,
+ ACPI_SIZE *SizeNeeded)
+{
+ ACPI_STATUS Status;
+ UINT8 *EndAml;
+ UINT8 *Buffer;
+ UINT32 BufferSize;
+ UINT16 Temp16;
+ UINT16 ResourceLength;
+ UINT32 ExtraStructBytes;
+ UINT8 ResourceIndex;
+ UINT8 MinimumAmlResourceLength;
+
+
+ ACPI_FUNCTION_TRACE (RsGetListLength);
+
+
+ *SizeNeeded = 0;
+ EndAml = AmlBuffer + AmlBufferLength;
+
+ /* Walk the list of AML resource descriptors */
+
+ while (AmlBuffer < EndAml)
+ {
+ /* Validate the Resource Type and Resource Length */
+
+ Status = AcpiUtValidateResource (AmlBuffer, &ResourceIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Get the resource length and base (minimum) AML size */
+
+ ResourceLength = AcpiUtGetResourceLength (AmlBuffer);
+ MinimumAmlResourceLength = AcpiGbl_ResourceAmlSizes[ResourceIndex];
+
+ /*
+ * Augment the size for descriptors with optional
+ * and/or variable length fields
+ */
+ ExtraStructBytes = 0;
+ Buffer = AmlBuffer + AcpiUtGetResourceHeaderLength (AmlBuffer);
+
+ switch (AcpiUtGetResourceType (AmlBuffer))
+ {
+ case ACPI_RESOURCE_NAME_IRQ:
+ /*
+ * IRQ Resource:
+ * Get the number of bits set in the 16-bit IRQ mask
+ */
+ ACPI_MOVE_16_TO_16 (&Temp16, Buffer);
+ ExtraStructBytes = AcpiRsCountSetBits (Temp16);
+ break;
+
+
+ case ACPI_RESOURCE_NAME_DMA:
+ /*
+ * DMA Resource:
+ * Get the number of bits set in the 8-bit DMA mask
+ */
+ ExtraStructBytes = AcpiRsCountSetBits (*Buffer);
+ break;
+
+
+ case ACPI_RESOURCE_NAME_VENDOR_SMALL:
+ case ACPI_RESOURCE_NAME_VENDOR_LARGE:
+ /*
+ * Vendor Resource:
+ * Get the number of vendor data bytes
+ */
+ ExtraStructBytes = ResourceLength;
+ break;
+
+
+ case ACPI_RESOURCE_NAME_END_TAG:
+ /*
+ * End Tag:
+ * This is the normal exit, add size of EndTag
+ */
+ *SizeNeeded += ACPI_RS_SIZE_MIN;
+ return_ACPI_STATUS (AE_OK);
+
+
+ case ACPI_RESOURCE_NAME_ADDRESS32:
+ case ACPI_RESOURCE_NAME_ADDRESS16:
+ case ACPI_RESOURCE_NAME_ADDRESS64:
+ /*
+ * Address Resource:
+ * Add the size of the optional ResourceSource
+ */
+ ExtraStructBytes = AcpiRsStreamOptionLength (
+ ResourceLength, MinimumAmlResourceLength);
+ break;
+
+
+ case ACPI_RESOURCE_NAME_EXTENDED_IRQ:
+ /*
+ * Extended IRQ Resource:
+ * Using the InterruptTableLength, add 4 bytes for each additional
+ * interrupt. Note: at least one interrupt is required and is
+ * included in the minimum descriptor size (reason for the -1)
+ */
+ ExtraStructBytes = (Buffer[1] - 1) * sizeof (UINT32);
+
+ /* Add the size of the optional ResourceSource */
+
+ ExtraStructBytes += AcpiRsStreamOptionLength (
+ ResourceLength - ExtraStructBytes, MinimumAmlResourceLength);
+ break;
+
+
+ default:
+ break;
+ }
+
+ /*
+ * Update the required buffer size for the internal descriptor structs
+ *
+ * Important: Round the size up for the appropriate alignment. This
+ * is a requirement on IA64.
+ */
+ BufferSize = AcpiGbl_ResourceStructSizes[ResourceIndex] +
+ ExtraStructBytes;
+ BufferSize = (UINT32) ACPI_ROUND_UP_TO_NATIVE_WORD (BufferSize);
+
+ *SizeNeeded += BufferSize;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_RESOURCES,
+ "Type %.2X, AmlLength %.2X InternalLength %.2X\n",
+ AcpiUtGetResourceType (AmlBuffer),
+ AcpiUtGetDescriptorLength (AmlBuffer), BufferSize));
+
+ /*
+ * Point to the next resource within the AML stream using the length
+ * contained in the resource descriptor header
+ */
+ AmlBuffer += AcpiUtGetDescriptorLength (AmlBuffer);
+ }
+
+ /* Did not find an EndTag resource descriptor */
+
+ return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsGetPciRoutingTableLength
+ *
+ * PARAMETERS: PackageObject - Pointer to the package object
+ * BufferSizeNeeded - UINT32 pointer of the size buffer
+ * needed to properly return the
+ * parsed data
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Given a package representing a PCI routing table, this
+ * calculates the size of the corresponding linked list of
+ * descriptions.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsGetPciRoutingTableLength (
+ ACPI_OPERAND_OBJECT *PackageObject,
+ ACPI_SIZE *BufferSizeNeeded)
+{
+ UINT32 NumberOfElements;
+ ACPI_SIZE TempSizeNeeded = 0;
+ ACPI_OPERAND_OBJECT **TopObjectList;
+ UINT32 Index;
+ ACPI_OPERAND_OBJECT *PackageElement;
+ ACPI_OPERAND_OBJECT **SubObjectList;
+ BOOLEAN NameFound;
+ UINT32 TableIndex;
+
+
+ ACPI_FUNCTION_TRACE (RsGetPciRoutingTableLength);
+
+
+ NumberOfElements = PackageObject->Package.Count;
+
+ /*
+ * Calculate the size of the return buffer.
+ * The base size is the number of elements * the sizes of the
+ * structures. Additional space for the strings is added below.
+ * The minus one is to subtract the size of the UINT8 Source[1]
+ * member because it is added below.
+ *
+ * But each PRT_ENTRY structure has a pointer to a string and
+ * the size of that string must be found.
+ */
+ TopObjectList = PackageObject->Package.Elements;
+
+ for (Index = 0; Index < NumberOfElements; Index++)
+ {
+ /* Dereference the sub-package */
+
+ PackageElement = *TopObjectList;
+
+ /*
+ * The SubObjectList will now point to an array of the
+ * four IRQ elements: Address, Pin, Source and SourceIndex
+ */
+ SubObjectList = PackageElement->Package.Elements;
+
+ /* Scan the IrqTableElements for the Source Name String */
+
+ NameFound = FALSE;
+
+ for (TableIndex = 0; TableIndex < 4 && !NameFound; TableIndex++)
+ {
+ if (*SubObjectList && /* Null object allowed */
+
+ ((ACPI_TYPE_STRING ==
+ ACPI_GET_OBJECT_TYPE (*SubObjectList)) ||
+
+ ((ACPI_TYPE_LOCAL_REFERENCE ==
+ ACPI_GET_OBJECT_TYPE (*SubObjectList)) &&
+
+ ((*SubObjectList)->Reference.Opcode ==
+ AML_INT_NAMEPATH_OP))))
+ {
+ NameFound = TRUE;
+ }
+ else
+ {
+ /* Look at the next element */
+
+ SubObjectList++;
+ }
+ }
+
+ TempSizeNeeded += (sizeof (ACPI_PCI_ROUTING_TABLE) - 4);
+
+ /* Was a String type found? */
+
+ if (NameFound)
+ {
+ if (ACPI_GET_OBJECT_TYPE (*SubObjectList) == ACPI_TYPE_STRING)
+ {
+ /*
+ * The length String.Length field does not include the
+ * terminating NULL, add 1
+ */
+ TempSizeNeeded += ((ACPI_SIZE)
+ (*SubObjectList)->String.Length + 1);
+ }
+ else
+ {
+ TempSizeNeeded += AcpiNsGetPathnameLength (
+ (*SubObjectList)->Reference.Node);
+ }
+ }
+ else
+ {
+ /*
+ * If no name was found, then this is a NULL, which is
+ * translated as a UINT32 zero.
+ */
+ TempSizeNeeded += sizeof (UINT32);
+ }
+
+ /* Round up the size since each element must be aligned */
+
+ TempSizeNeeded = ACPI_ROUND_UP_TO_64BIT (TempSizeNeeded);
+
+ /* Point to the next ACPI_OPERAND_OBJECT */
+
+ TopObjectList++;
+ }
+
+ /*
+ * Add an extra element to the end of the list, essentially a
+ * NULL terminator
+ */
+ *BufferSizeNeeded = TempSizeNeeded + sizeof (ACPI_PCI_ROUTING_TABLE);
+ return_ACPI_STATUS (AE_OK);
+}
diff --git a/sys/contrib/dev/acpica/rscreate.c b/sys/contrib/dev/acpica/rscreate.c
new file mode 100644
index 0000000..6b986ea
--- /dev/null
+++ b/sys/contrib/dev/acpica/rscreate.c
@@ -0,0 +1,526 @@
+/*******************************************************************************
+ *
+ * Module Name: rscreate - Create resource lists/tables
+ * $Revision: 1.78 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __RSCREATE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+#include <contrib/dev/acpica/amlcode.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rscreate")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsCreateResourceList
+ *
+ * PARAMETERS: AmlBuffer - Pointer to the resource byte stream
+ * OutputBuffer - Pointer to the user's buffer
+ *
+ * RETURN: Status: AE_OK if okay, else a valid ACPI_STATUS code
+ * If OutputBuffer is not large enough, OutputBufferLength
+ * indicates how large OutputBuffer should be, else it
+ * indicates how may UINT8 elements of OutputBuffer are valid.
+ *
+ * DESCRIPTION: Takes the byte stream returned from a _CRS, _PRS control method
+ * execution and parses the stream to create a linked list
+ * of device resources.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsCreateResourceList (
+ ACPI_OPERAND_OBJECT *AmlBuffer,
+ ACPI_BUFFER *OutputBuffer)
+{
+
+ ACPI_STATUS Status;
+ UINT8 *AmlStart;
+ ACPI_SIZE ListSizeNeeded = 0;
+ UINT32 AmlBufferLength;
+ void *Resource;
+
+
+ ACPI_FUNCTION_TRACE (RsCreateResourceList);
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AmlBuffer = %p\n",
+ AmlBuffer));
+
+ /* Params already validated, so we don't re-validate here */
+
+ AmlBufferLength = AmlBuffer->Buffer.Length;
+ AmlStart = AmlBuffer->Buffer.Pointer;
+
+ /*
+ * Pass the AmlBuffer into a module that can calculate
+ * the buffer size needed for the linked list
+ */
+ Status = AcpiRsGetListLength (AmlStart, AmlBufferLength,
+ &ListSizeNeeded);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "Status=%X ListSizeNeeded=%X\n",
+ Status, (UINT32) ListSizeNeeded));
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Validate/Allocate/Clear caller buffer */
+
+ Status = AcpiUtInitializeBuffer (OutputBuffer, ListSizeNeeded);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Do the conversion */
+
+ Resource = OutputBuffer->Pointer;
+ Status = AcpiUtWalkAmlResources (AmlStart, AmlBufferLength,
+ AcpiRsConvertAmlToResources, &Resource);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer %p Length %X\n",
+ OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsCreatePciRoutingTable
+ *
+ * PARAMETERS: PackageObject - Pointer to an ACPI_OPERAND_OBJECT
+ * package
+ * OutputBuffer - Pointer to the user's buffer
+ *
+ * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code.
+ * If the OutputBuffer is too small, the error will be
+ * AE_BUFFER_OVERFLOW and OutputBuffer->Length will point
+ * to the size buffer needed.
+ *
+ * DESCRIPTION: Takes the ACPI_OPERAND_OBJECT package and creates a
+ * linked list of PCI interrupt descriptions
+ *
+ * NOTE: It is the caller's responsibility to ensure that the start of the
+ * output buffer is aligned properly (if necessary).
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsCreatePciRoutingTable (
+ ACPI_OPERAND_OBJECT *PackageObject,
+ ACPI_BUFFER *OutputBuffer)
+{
+ UINT8 *Buffer;
+ ACPI_OPERAND_OBJECT **TopObjectList;
+ ACPI_OPERAND_OBJECT **SubObjectList;
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_SIZE BufferSizeNeeded = 0;
+ UINT32 NumberOfElements;
+ UINT32 Index;
+ ACPI_PCI_ROUTING_TABLE *UserPrt;
+ ACPI_NAMESPACE_NODE *Node;
+ ACPI_STATUS Status;
+ ACPI_BUFFER PathBuffer;
+
+
+ ACPI_FUNCTION_TRACE (RsCreatePciRoutingTable);
+
+
+ /* Params already validated, so we don't re-validate here */
+
+ /* Get the required buffer length */
+
+ Status = AcpiRsGetPciRoutingTableLength (PackageObject,
+ &BufferSizeNeeded);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "BufferSizeNeeded = %X\n",
+ (UINT32) BufferSizeNeeded));
+
+ /* Validate/Allocate/Clear caller buffer */
+
+ Status = AcpiUtInitializeBuffer (OutputBuffer, BufferSizeNeeded);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Loop through the ACPI_INTERNAL_OBJECTS - Each object
+ * should be a package that in turn contains an
+ * ACPI_INTEGER Address, a UINT8 Pin, a Name and a UINT8 SourceIndex.
+ */
+ TopObjectList = PackageObject->Package.Elements;
+ NumberOfElements = PackageObject->Package.Count;
+ Buffer = OutputBuffer->Pointer;
+ UserPrt = ACPI_CAST_PTR (ACPI_PCI_ROUTING_TABLE, Buffer);
+
+ for (Index = 0; Index < NumberOfElements; Index++)
+ {
+ /*
+ * Point UserPrt past this current structure
+ *
+ * NOTE: On the first iteration, UserPrt->Length will
+ * be zero because we cleared the return buffer earlier
+ */
+ Buffer += UserPrt->Length;
+ UserPrt = ACPI_CAST_PTR (ACPI_PCI_ROUTING_TABLE, Buffer);
+
+ /*
+ * Fill in the Length field with the information we have at this point.
+ * The minus four is to subtract the size of the UINT8 Source[4] member
+ * because it is added below.
+ */
+ UserPrt->Length = (sizeof (ACPI_PCI_ROUTING_TABLE) - 4);
+
+ /* Each element of the top-level package must also be a package */
+
+ if (ACPI_GET_OBJECT_TYPE (*TopObjectList) != ACPI_TYPE_PACKAGE)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "(PRT[%X]) Need sub-package, found %s",
+ Index, AcpiUtGetObjectTypeName (*TopObjectList)));
+ return_ACPI_STATUS (AE_AML_OPERAND_TYPE);
+ }
+
+ /* Each sub-package must be of length 4 */
+
+ if ((*TopObjectList)->Package.Count != 4)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "(PRT[%X]) Need package of length 4, found length %d",
+ Index, (*TopObjectList)->Package.Count));
+ return_ACPI_STATUS (AE_AML_PACKAGE_LIMIT);
+ }
+
+ /*
+ * Dereference the sub-package.
+ * The SubObjectList will now point to an array of the four IRQ
+ * elements: [Address, Pin, Source, SourceIndex]
+ */
+ SubObjectList = (*TopObjectList)->Package.Elements;
+
+ /* 1) First subobject: Dereference the PRT.Address */
+
+ ObjDesc = SubObjectList[0];
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
+ {
+ UserPrt->Address = ObjDesc->Integer.Value;
+ }
+ else
+ {
+ ACPI_ERROR ((AE_INFO,
+ "(PRT[%X].Address) Need Integer, found %s",
+ Index, AcpiUtGetObjectTypeName (ObjDesc)));
+ return_ACPI_STATUS (AE_BAD_DATA);
+ }
+
+ /* 2) Second subobject: Dereference the PRT.Pin */
+
+ ObjDesc = SubObjectList[1];
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
+ {
+ UserPrt->Pin = (UINT32) ObjDesc->Integer.Value;
+ }
+ else
+ {
+ ACPI_ERROR ((AE_INFO,
+ "(PRT[%X].Pin) Need Integer, found %s",
+ Index, AcpiUtGetObjectTypeName (ObjDesc)));
+ return_ACPI_STATUS (AE_BAD_DATA);
+ }
+
+ /*
+ * 3) Third subobject: Dereference the PRT.SourceName
+ * The name may be unresolved (slack mode), so allow a null object
+ */
+ ObjDesc = SubObjectList[2];
+ if (ObjDesc)
+ {
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ if (ObjDesc->Reference.Opcode != AML_INT_NAMEPATH_OP)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "(PRT[%X].Source) Need name, found reference op %X",
+ Index, ObjDesc->Reference.Opcode));
+ return_ACPI_STATUS (AE_BAD_DATA);
+ }
+
+ Node = ObjDesc->Reference.Node;
+
+ /* Use *remaining* length of the buffer as max for pathname */
+
+ PathBuffer.Length = OutputBuffer->Length -
+ (UINT32) ((UINT8 *) UserPrt->Source -
+ (UINT8 *) OutputBuffer->Pointer);
+ PathBuffer.Pointer = UserPrt->Source;
+
+ Status = AcpiNsHandleToPathname ((ACPI_HANDLE) Node, &PathBuffer);
+
+ /* +1 to include null terminator */
+
+ UserPrt->Length += (UINT32) ACPI_STRLEN (UserPrt->Source) + 1;
+ break;
+
+
+ case ACPI_TYPE_STRING:
+
+ ACPI_STRCPY (UserPrt->Source, ObjDesc->String.Pointer);
+
+ /*
+ * Add to the Length field the length of the string
+ * (add 1 for terminator)
+ */
+ UserPrt->Length += ObjDesc->String.Length + 1;
+ break;
+
+
+ case ACPI_TYPE_INTEGER:
+ /*
+ * If this is a number, then the Source Name is NULL, since the
+ * entire buffer was zeroed out, we can leave this alone.
+ *
+ * Add to the Length field the length of the UINT32 NULL
+ */
+ UserPrt->Length += sizeof (UINT32);
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO,
+ "(PRT[%X].Source) Need Ref/String/Integer, found %s",
+ Index, AcpiUtGetObjectTypeName (ObjDesc)));
+ return_ACPI_STATUS (AE_BAD_DATA);
+ }
+ }
+
+ /* Now align the current length */
+
+ UserPrt->Length = (UINT32) ACPI_ROUND_UP_TO_64BIT (UserPrt->Length);
+
+ /* 4) Fourth subobject: Dereference the PRT.SourceIndex */
+
+ ObjDesc = SubObjectList[3];
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
+ {
+ UserPrt->SourceIndex = (UINT32) ObjDesc->Integer.Value;
+ }
+ else
+ {
+ ACPI_ERROR ((AE_INFO,
+ "(PRT[%X].SourceIndex) Need Integer, found %s",
+ Index, AcpiUtGetObjectTypeName (ObjDesc)));
+ return_ACPI_STATUS (AE_BAD_DATA);
+ }
+
+ /* Point to the next ACPI_OPERAND_OBJECT in the top level package */
+
+ TopObjectList++;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer %p Length %X\n",
+ OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsCreateAmlResources
+ *
+ * PARAMETERS: LinkedListBuffer - Pointer to the resource linked list
+ * OutputBuffer - Pointer to the user's buffer
+ *
+ * RETURN: Status AE_OK if okay, else a valid ACPI_STATUS code.
+ * If the OutputBuffer is too small, the error will be
+ * AE_BUFFER_OVERFLOW and OutputBuffer->Length will point
+ * to the size buffer needed.
+ *
+ * DESCRIPTION: Takes the linked list of device resources and
+ * creates a bytestream to be used as input for the
+ * _SRS control method.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsCreateAmlResources (
+ ACPI_RESOURCE *LinkedListBuffer,
+ ACPI_BUFFER *OutputBuffer)
+{
+ ACPI_STATUS Status;
+ ACPI_SIZE AmlSizeNeeded = 0;
+
+
+ ACPI_FUNCTION_TRACE (RsCreateAmlResources);
+
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "LinkedListBuffer = %p\n",
+ LinkedListBuffer));
+
+ /*
+ * Params already validated, so we don't re-validate here
+ *
+ * Pass the LinkedListBuffer into a module that calculates
+ * the buffer size needed for the byte stream.
+ */
+ Status = AcpiRsGetAmlLength (LinkedListBuffer,
+ &AmlSizeNeeded);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "AmlSizeNeeded=%X, %s\n",
+ (UINT32) AmlSizeNeeded, AcpiFormatException (Status)));
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Validate/Allocate/Clear caller buffer */
+
+ Status = AcpiUtInitializeBuffer (OutputBuffer, AmlSizeNeeded);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Do the conversion */
+
+ Status = AcpiRsConvertResourcesToAml (LinkedListBuffer, AmlSizeNeeded,
+ OutputBuffer->Pointer);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "OutputBuffer %p Length %X\n",
+ OutputBuffer->Pointer, (UINT32) OutputBuffer->Length));
+ return_ACPI_STATUS (AE_OK);
+}
+
diff --git a/sys/contrib/dev/acpica/rsdump.c b/sys/contrib/dev/acpica/rsdump.c
new file mode 100644
index 0000000..eec3df9
--- /dev/null
+++ b/sys/contrib/dev/acpica/rsdump.c
@@ -0,0 +1,870 @@
+/*******************************************************************************
+ *
+ * Module Name: rsdump - Functions to display the resource structures.
+ * $Revision: 1.62 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __RSDUMP_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rsdump")
+
+
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+
+/* Local prototypes */
+
+static void
+AcpiRsOutString (
+ char *Title,
+ char *Value);
+
+static void
+AcpiRsOutInteger8 (
+ char *Title,
+ UINT8 Value);
+
+static void
+AcpiRsOutInteger16 (
+ char *Title,
+ UINT16 Value);
+
+static void
+AcpiRsOutInteger32 (
+ char *Title,
+ UINT32 Value);
+
+static void
+AcpiRsOutInteger64 (
+ char *Title,
+ UINT64 Value);
+
+static void
+AcpiRsOutTitle (
+ char *Title);
+
+static void
+AcpiRsDumpByteList (
+ UINT16 Length,
+ UINT8 *Data);
+
+static void
+AcpiRsDumpDwordList (
+ UINT8 Length,
+ UINT32 *Data);
+
+static void
+AcpiRsDumpShortByteList (
+ UINT8 Length,
+ UINT8 *Data);
+
+static void
+AcpiRsDumpResourceSource (
+ ACPI_RESOURCE_SOURCE *ResourceSource);
+
+static void
+AcpiRsDumpAddressCommon (
+ ACPI_RESOURCE_DATA *Resource);
+
+static void
+AcpiRsDumpDescriptor (
+ void *Resource,
+ ACPI_RSDUMP_INFO *Table);
+
+
+#define ACPI_RSD_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_RESOURCE_DATA,f)
+#define ACPI_PRT_OFFSET(f) (UINT8) ACPI_OFFSET (ACPI_PCI_ROUTING_TABLE,f)
+#define ACPI_RSD_TABLE_SIZE(name) (sizeof(name) / sizeof (ACPI_RSDUMP_INFO))
+
+
+/*******************************************************************************
+ *
+ * Resource Descriptor info tables
+ *
+ * Note: The first table entry must be a Title or Literal and must contain
+ * the table length (number of table entries)
+ *
+ ******************************************************************************/
+
+ACPI_RSDUMP_INFO AcpiRsDumpIrq[6] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpIrq), "IRQ", NULL},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Irq.Triggering), "Triggering", AcpiGbl_HeDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Irq.Polarity), "Polarity", AcpiGbl_LlDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Irq.Sharable), "Sharing", AcpiGbl_ShrDecode},
+ {ACPI_RSD_UINT8 , ACPI_RSD_OFFSET (Irq.InterruptCount), "Interrupt Count", NULL},
+ {ACPI_RSD_SHORTLIST,ACPI_RSD_OFFSET (Irq.Interrupts[0]), "Interrupt List", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpDma[6] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpDma), "DMA", NULL},
+ {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Dma.Type), "Speed", AcpiGbl_TypDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Dma.BusMaster), "Mastering", AcpiGbl_BmDecode},
+ {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Dma.Transfer), "Transfer Type", AcpiGbl_SizDecode},
+ {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (Dma.ChannelCount), "Channel Count", NULL},
+ {ACPI_RSD_SHORTLIST,ACPI_RSD_OFFSET (Dma.Channels[0]), "Channel List", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpStartDpf[3] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpStartDpf), "Start-Dependent-Functions",NULL},
+ {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (StartDpf.CompatibilityPriority), "Compatibility Priority", AcpiGbl_ConfigDecode},
+ {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (StartDpf.PerformanceRobustness), "Performance/Robustness", AcpiGbl_ConfigDecode}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpEndDpf[1] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpEndDpf), "End-Dependent-Functions", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpIo[6] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpIo), "I/O", NULL},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Io.IoDecode), "Address Decoding", AcpiGbl_IoDecode},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Io.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Io.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (Io.Alignment), "Alignment", NULL},
+ {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (Io.AddressLength), "Address Length", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpFixedIo[3] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedIo), "Fixed I/O", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (FixedIo.Address), "Address", NULL},
+ {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (FixedIo.AddressLength), "Address Length", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpVendor[3] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpVendor), "Vendor Specific", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Vendor.ByteLength), "Length", NULL},
+ {ACPI_RSD_LONGLIST, ACPI_RSD_OFFSET (Vendor.ByteData[0]), "Vendor Data", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpEndTag[1] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpEndTag), "EndTag", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpMemory24[6] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemory24), "24-Bit Memory Range", NULL},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Memory24.WriteProtect), "Write Protect", AcpiGbl_RwDecode},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Memory24.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Memory24.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Memory24.Alignment), "Alignment", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Memory24.AddressLength), "Address Length", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpMemory32[6] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemory32), "32-Bit Memory Range", NULL},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Memory32.WriteProtect), "Write Protect", AcpiGbl_RwDecode},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Memory32.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Memory32.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Memory32.Alignment), "Alignment", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Memory32.AddressLength), "Address Length", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpFixedMemory32[4] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpFixedMemory32), "32-Bit Fixed Memory Range",NULL},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (FixedMemory32.WriteProtect), "Write Protect", AcpiGbl_RwDecode},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (FixedMemory32.Address), "Address", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (FixedMemory32.AddressLength), "Address Length", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpAddress16[8] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress16), "16-Bit WORD Address Space",NULL},
+ {ACPI_RSD_ADDRESS, 0, NULL, NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Granularity), "Granularity", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.TranslationOffset), "Translation Offset", NULL},
+ {ACPI_RSD_UINT16, ACPI_RSD_OFFSET (Address16.AddressLength), "Address Length", NULL},
+ {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (Address16.ResourceSource), NULL, NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpAddress32[8] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress32), "32-Bit DWORD Address Space", NULL},
+ {ACPI_RSD_ADDRESS, 0, NULL, NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Granularity), "Granularity", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.TranslationOffset), "Translation Offset", NULL},
+ {ACPI_RSD_UINT32, ACPI_RSD_OFFSET (Address32.AddressLength), "Address Length", NULL},
+ {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (Address32.ResourceSource), NULL, NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpAddress64[8] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpAddress64), "64-Bit QWORD Address Space", NULL},
+ {ACPI_RSD_ADDRESS, 0, NULL, NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Granularity), "Granularity", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.TranslationOffset), "Translation Offset", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (Address64.AddressLength), "Address Length", NULL},
+ {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (Address64.ResourceSource), NULL, NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpExtAddress64[8] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpExtAddress64), "64-Bit Extended Address Space", NULL},
+ {ACPI_RSD_ADDRESS, 0, NULL, NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Granularity), "Granularity", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Minimum), "Address Minimum", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.Maximum), "Address Maximum", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.TranslationOffset), "Translation Offset", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.AddressLength), "Address Length", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (ExtAddress64.TypeSpecific), "Type-Specific Attribute", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpExtIrq[8] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpExtIrq), "Extended IRQ", NULL},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.ProducerConsumer), "Type", AcpiGbl_ConsumeDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Triggering), "Triggering", AcpiGbl_HeDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Polarity), "Polarity", AcpiGbl_LlDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (ExtendedIrq.Sharable), "Sharing", AcpiGbl_ShrDecode},
+ {ACPI_RSD_SOURCE, ACPI_RSD_OFFSET (ExtendedIrq.ResourceSource), NULL, NULL},
+ {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (ExtendedIrq.InterruptCount), "Interrupt Count", NULL},
+ {ACPI_RSD_DWORDLIST,ACPI_RSD_OFFSET (ExtendedIrq.Interrupts[0]), "Interrupt List", NULL}
+};
+
+ACPI_RSDUMP_INFO AcpiRsDumpGenericReg[6] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpGenericReg), "Generic Register", NULL},
+ {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (GenericReg.SpaceId), "Space ID", NULL},
+ {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (GenericReg.BitWidth), "Bit Width", NULL},
+ {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (GenericReg.BitOffset), "Bit Offset", NULL},
+ {ACPI_RSD_UINT8, ACPI_RSD_OFFSET (GenericReg.AccessSize), "Access Size", NULL},
+ {ACPI_RSD_UINT64, ACPI_RSD_OFFSET (GenericReg.Address), "Address", NULL}
+};
+
+
+/*
+ * Tables used for common address descriptor flag fields
+ */
+static ACPI_RSDUMP_INFO AcpiRsDumpGeneralFlags[5] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpGeneralFlags), NULL, NULL},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.ProducerConsumer), "Consumer/Producer", AcpiGbl_ConsumeDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Decode), "Address Decode", AcpiGbl_DecDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.MinAddressFixed), "Min Relocatability", AcpiGbl_MinDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.MaxAddressFixed), "Max Relocatability", AcpiGbl_MaxDecode}
+};
+
+static ACPI_RSDUMP_INFO AcpiRsDumpMemoryFlags[5] =
+{
+ {ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE (AcpiRsDumpMemoryFlags), "Resource Type", (void *) "Memory Range"},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.WriteProtect), "Write Protect", AcpiGbl_RwDecode},
+ {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.Caching), "Caching", AcpiGbl_MemDecode},
+ {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.RangeType), "Range Type", AcpiGbl_MtpDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Mem.Translation), "Translation", AcpiGbl_TtpDecode}
+};
+
+static ACPI_RSDUMP_INFO AcpiRsDumpIoFlags[4] =
+{
+ {ACPI_RSD_LITERAL, ACPI_RSD_TABLE_SIZE (AcpiRsDumpIoFlags), "Resource Type", (void *) "I/O Range"},
+ {ACPI_RSD_2BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.RangeType), "Range Type", AcpiGbl_RngDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.Translation), "Translation", AcpiGbl_TtpDecode},
+ {ACPI_RSD_1BITFLAG, ACPI_RSD_OFFSET (Address.Info.Io.TranslationType), "Translation Type", AcpiGbl_TrsDecode}
+};
+
+
+/*
+ * Table used to dump _PRT contents
+ */
+static ACPI_RSDUMP_INFO AcpiRsDumpPrt[5] =
+{
+ {ACPI_RSD_TITLE, ACPI_RSD_TABLE_SIZE (AcpiRsDumpPrt), NULL, NULL},
+ {ACPI_RSD_UINT64, ACPI_PRT_OFFSET (Address), "Address", NULL},
+ {ACPI_RSD_UINT32, ACPI_PRT_OFFSET (Pin), "Pin", NULL},
+ {ACPI_RSD_STRING, ACPI_PRT_OFFSET (Source[0]), "Source", NULL},
+ {ACPI_RSD_UINT32, ACPI_PRT_OFFSET (SourceIndex), "Source Index", NULL}
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsDumpDescriptor
+ *
+ * PARAMETERS: Resource
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION:
+ *
+ ******************************************************************************/
+
+static void
+AcpiRsDumpDescriptor (
+ void *Resource,
+ ACPI_RSDUMP_INFO *Table)
+{
+ UINT8 *Target = NULL;
+ UINT8 *PreviousTarget;
+ char *Name;
+ UINT8 Count;
+
+
+ /* First table entry must contain the table length (# of table entries) */
+
+ Count = Table->Offset;
+
+ while (Count)
+ {
+ PreviousTarget = Target;
+ Target = ACPI_ADD_PTR (UINT8, Resource, Table->Offset);
+ Name = Table->Name;
+
+ switch (Table->Opcode)
+ {
+ case ACPI_RSD_TITLE:
+ /*
+ * Optional resource title
+ */
+ if (Table->Name)
+ {
+ AcpiOsPrintf ("%s Resource\n", Name);
+ }
+ break;
+
+ /* Strings */
+
+ case ACPI_RSD_LITERAL:
+ AcpiRsOutString (Name, ACPI_CAST_PTR (char, Table->Pointer));
+ break;
+
+ case ACPI_RSD_STRING:
+ AcpiRsOutString (Name, ACPI_CAST_PTR (char, Target));
+ break;
+
+ /* Data items, 8/16/32/64 bit */
+
+ case ACPI_RSD_UINT8:
+ AcpiRsOutInteger8 (Name, ACPI_GET8 (Target));
+ break;
+
+ case ACPI_RSD_UINT16:
+ AcpiRsOutInteger16 (Name, ACPI_GET16 (Target));
+ break;
+
+ case ACPI_RSD_UINT32:
+ AcpiRsOutInteger32 (Name, ACPI_GET32 (Target));
+ break;
+
+ case ACPI_RSD_UINT64:
+ AcpiRsOutInteger64 (Name, ACPI_GET64 (Target));
+ break;
+
+ /* Flags: 1-bit and 2-bit flags supported */
+
+ case ACPI_RSD_1BITFLAG:
+ AcpiRsOutString (Name, ACPI_CAST_PTR (char,
+ Table->Pointer [*Target & 0x01]));
+ break;
+
+ case ACPI_RSD_2BITFLAG:
+ AcpiRsOutString (Name, ACPI_CAST_PTR (char,
+ Table->Pointer [*Target & 0x03]));
+ break;
+
+ case ACPI_RSD_SHORTLIST:
+ /*
+ * Short byte list (single line output) for DMA and IRQ resources
+ * Note: The list length is obtained from the previous table entry
+ */
+ if (PreviousTarget)
+ {
+ AcpiRsOutTitle (Name);
+ AcpiRsDumpShortByteList (*PreviousTarget, Target);
+ }
+ break;
+
+ case ACPI_RSD_LONGLIST:
+ /*
+ * Long byte list for Vendor resource data
+ * Note: The list length is obtained from the previous table entry
+ */
+ if (PreviousTarget)
+ {
+ AcpiRsDumpByteList (ACPI_GET16 (PreviousTarget), Target);
+ }
+ break;
+
+ case ACPI_RSD_DWORDLIST:
+ /*
+ * Dword list for Extended Interrupt resources
+ * Note: The list length is obtained from the previous table entry
+ */
+ if (PreviousTarget)
+ {
+ AcpiRsDumpDwordList (*PreviousTarget,
+ ACPI_CAST_PTR (UINT32, Target));
+ }
+ break;
+
+ case ACPI_RSD_ADDRESS:
+ /*
+ * Common flags for all Address resources
+ */
+ AcpiRsDumpAddressCommon (ACPI_CAST_PTR (ACPI_RESOURCE_DATA, Target));
+ break;
+
+ case ACPI_RSD_SOURCE:
+ /*
+ * Optional ResourceSource for Address resources
+ */
+ AcpiRsDumpResourceSource (ACPI_CAST_PTR (ACPI_RESOURCE_SOURCE, Target));
+ break;
+
+ default:
+ AcpiOsPrintf ("**** Invalid table opcode [%X] ****\n",
+ Table->Opcode);
+ return;
+ }
+
+ Table++;
+ Count--;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsDumpResourceSource
+ *
+ * PARAMETERS: ResourceSource - Pointer to a Resource Source struct
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Common routine for dumping the optional ResourceSource and the
+ * corresponding ResourceSourceIndex.
+ *
+ ******************************************************************************/
+
+static void
+AcpiRsDumpResourceSource (
+ ACPI_RESOURCE_SOURCE *ResourceSource)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (ResourceSource->Index == 0xFF)
+ {
+ return;
+ }
+
+ AcpiRsOutInteger8 ("Resource Source Index",
+ ResourceSource->Index);
+
+ AcpiRsOutString ("Resource Source",
+ ResourceSource->StringPtr ?
+ ResourceSource->StringPtr : "[Not Specified]");
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsDumpAddressCommon
+ *
+ * PARAMETERS: Resource - Pointer to an internal resource descriptor
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump the fields that are common to all Address resource
+ * descriptors
+ *
+ ******************************************************************************/
+
+static void
+AcpiRsDumpAddressCommon (
+ ACPI_RESOURCE_DATA *Resource)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Decode the type-specific flags */
+
+ switch (Resource->Address.ResourceType)
+ {
+ case ACPI_MEMORY_RANGE:
+
+ AcpiRsDumpDescriptor (Resource, AcpiRsDumpMemoryFlags);
+ break;
+
+ case ACPI_IO_RANGE:
+
+ AcpiRsDumpDescriptor (Resource, AcpiRsDumpIoFlags);
+ break;
+
+ case ACPI_BUS_NUMBER_RANGE:
+
+ AcpiRsOutString ("Resource Type", "Bus Number Range");
+ break;
+
+ default:
+
+ AcpiRsOutInteger8 ("Resource Type",
+ (UINT8) Resource->Address.ResourceType);
+ break;
+ }
+
+ /* Decode the general flags */
+
+ AcpiRsDumpDescriptor (Resource, AcpiRsDumpGeneralFlags);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsDumpResourceList
+ *
+ * PARAMETERS: ResourceList - Pointer to a resource descriptor list
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dispatches the structure to the correct dump routine.
+ *
+ ******************************************************************************/
+
+void
+AcpiRsDumpResourceList (
+ ACPI_RESOURCE *ResourceList)
+{
+ UINT32 Count = 0;
+ UINT32 Type;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!(AcpiDbgLevel & ACPI_LV_RESOURCES) || !( _COMPONENT & AcpiDbgLayer))
+ {
+ return;
+ }
+
+ /* Walk list and dump all resource descriptors (END_TAG terminates) */
+
+ do
+ {
+ AcpiOsPrintf ("\n[%02X] ", Count);
+ Count++;
+
+ /* Validate Type before dispatch */
+
+ Type = ResourceList->Type;
+ if (Type > ACPI_RESOURCE_TYPE_MAX)
+ {
+ AcpiOsPrintf (
+ "Invalid descriptor type (%X) in resource list\n",
+ ResourceList->Type);
+ return;
+ }
+
+ /* Dump the resource descriptor */
+
+ AcpiRsDumpDescriptor (&ResourceList->Data,
+ AcpiGbl_DumpResourceDispatch[Type]);
+
+ /* Point to the next resource structure */
+
+ ResourceList = ACPI_ADD_PTR (ACPI_RESOURCE, ResourceList,
+ ResourceList->Length);
+
+ /* Exit when END_TAG descriptor is reached */
+
+ } while (Type != ACPI_RESOURCE_TYPE_END_TAG);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsDumpIrqList
+ *
+ * PARAMETERS: RouteTable - Pointer to the routing table to dump.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print IRQ routing table
+ *
+ ******************************************************************************/
+
+void
+AcpiRsDumpIrqList (
+ UINT8 *RouteTable)
+{
+ ACPI_PCI_ROUTING_TABLE *PrtElement;
+ UINT8 Count;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!(AcpiDbgLevel & ACPI_LV_RESOURCES) || !( _COMPONENT & AcpiDbgLayer))
+ {
+ return;
+ }
+
+ PrtElement = ACPI_CAST_PTR (ACPI_PCI_ROUTING_TABLE, RouteTable);
+
+ /* Dump all table elements, Exit on zero length element */
+
+ for (Count = 0; PrtElement->Length; Count++)
+ {
+ AcpiOsPrintf ("\n[%02X] PCI IRQ Routing Table Package\n", Count);
+ AcpiRsDumpDescriptor (PrtElement, AcpiRsDumpPrt);
+
+ PrtElement = ACPI_ADD_PTR (ACPI_PCI_ROUTING_TABLE,
+ PrtElement, PrtElement->Length);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsOut*
+ *
+ * PARAMETERS: Title - Name of the resource field
+ * Value - Value of the resource field
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Miscellaneous helper functions to consistently format the
+ * output of the resource dump routines
+ *
+ ******************************************************************************/
+
+static void
+AcpiRsOutString (
+ char *Title,
+ char *Value)
+{
+ AcpiOsPrintf ("%27s : %s", Title, Value);
+ if (!*Value)
+ {
+ AcpiOsPrintf ("[NULL NAMESTRING]");
+ }
+ AcpiOsPrintf ("\n");
+}
+
+static void
+AcpiRsOutInteger8 (
+ char *Title,
+ UINT8 Value)
+{
+ AcpiOsPrintf ("%27s : %2.2X\n", Title, Value);
+}
+
+static void
+AcpiRsOutInteger16 (
+ char *Title,
+ UINT16 Value)
+{
+ AcpiOsPrintf ("%27s : %4.4X\n", Title, Value);
+}
+
+static void
+AcpiRsOutInteger32 (
+ char *Title,
+ UINT32 Value)
+{
+ AcpiOsPrintf ("%27s : %8.8X\n", Title, Value);
+}
+
+static void
+AcpiRsOutInteger64 (
+ char *Title,
+ UINT64 Value)
+{
+ AcpiOsPrintf ("%27s : %8.8X%8.8X\n", Title,
+ ACPI_FORMAT_UINT64 (Value));
+}
+
+static void
+AcpiRsOutTitle (
+ char *Title)
+{
+ AcpiOsPrintf ("%27s : ", Title);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsDump*List
+ *
+ * PARAMETERS: Length - Number of elements in the list
+ * Data - Start of the list
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Miscellaneous functions to dump lists of raw data
+ *
+ ******************************************************************************/
+
+static void
+AcpiRsDumpByteList (
+ UINT16 Length,
+ UINT8 *Data)
+{
+ UINT8 i;
+
+
+ for (i = 0; i < Length; i++)
+ {
+ AcpiOsPrintf ("%25s%2.2X : %2.2X\n",
+ "Byte", i, Data[i]);
+ }
+}
+
+static void
+AcpiRsDumpShortByteList (
+ UINT8 Length,
+ UINT8 *Data)
+{
+ UINT8 i;
+
+
+ for (i = 0; i < Length; i++)
+ {
+ AcpiOsPrintf ("%X ", Data[i]);
+ }
+ AcpiOsPrintf ("\n");
+}
+
+static void
+AcpiRsDumpDwordList (
+ UINT8 Length,
+ UINT32 *Data)
+{
+ UINT8 i;
+
+
+ for (i = 0; i < Length; i++)
+ {
+ AcpiOsPrintf ("%25s%2.2X : %8.8X\n",
+ "Dword", i, Data[i]);
+ }
+}
+
+#endif
+
diff --git a/sys/contrib/dev/acpica/rsinfo.c b/sys/contrib/dev/acpica/rsinfo.c
new file mode 100644
index 0000000..f5c1e0b
--- /dev/null
+++ b/sys/contrib/dev/acpica/rsinfo.c
@@ -0,0 +1,290 @@
+/*******************************************************************************
+ *
+ * Module Name: rsinfo - Dispatch and Info tables
+ * $Revision: 1.8 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __RSINFO_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rsinfo")
+
+/*
+ * Resource dispatch and information tables. Any new resource types (either
+ * Large or Small) must be reflected in each of these tables, so they are here
+ * in one place.
+ *
+ * The tables for Large descriptors are indexed by bits 6:0 of the AML
+ * descriptor type byte. The tables for Small descriptors are indexed by
+ * bits 6:3 of the descriptor byte. The tables for internal resource
+ * descriptors are indexed by the ACPI_RESOURCE_TYPE field.
+ */
+
+
+/* Dispatch table for resource-to-AML (Set Resource) conversion functions */
+
+ACPI_RSCONVERT_INFO *AcpiGbl_SetResourceDispatch[] =
+{
+ AcpiRsSetIrq, /* 0x00, ACPI_RESOURCE_TYPE_IRQ */
+ AcpiRsConvertDma, /* 0x01, ACPI_RESOURCE_TYPE_DMA */
+ AcpiRsSetStartDpf, /* 0x02, ACPI_RESOURCE_TYPE_START_DEPENDENT */
+ AcpiRsConvertEndDpf, /* 0x03, ACPI_RESOURCE_TYPE_END_DEPENDENT */
+ AcpiRsConvertIo, /* 0x04, ACPI_RESOURCE_TYPE_IO */
+ AcpiRsConvertFixedIo, /* 0x05, ACPI_RESOURCE_TYPE_FIXED_IO */
+ AcpiRsSetVendor, /* 0x06, ACPI_RESOURCE_TYPE_VENDOR */
+ AcpiRsConvertEndTag, /* 0x07, ACPI_RESOURCE_TYPE_END_TAG */
+ AcpiRsConvertMemory24, /* 0x08, ACPI_RESOURCE_TYPE_MEMORY24 */
+ AcpiRsConvertMemory32, /* 0x09, ACPI_RESOURCE_TYPE_MEMORY32 */
+ AcpiRsConvertFixedMemory32, /* 0x0A, ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */
+ AcpiRsConvertAddress16, /* 0x0B, ACPI_RESOURCE_TYPE_ADDRESS16 */
+ AcpiRsConvertAddress32, /* 0x0C, ACPI_RESOURCE_TYPE_ADDRESS32 */
+ AcpiRsConvertAddress64, /* 0x0D, ACPI_RESOURCE_TYPE_ADDRESS64 */
+ AcpiRsConvertExtAddress64, /* 0x0E, ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
+ AcpiRsConvertExtIrq, /* 0x0F, ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
+ AcpiRsConvertGenericReg /* 0x10, ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
+};
+
+/* Dispatch tables for AML-to-resource (Get Resource) conversion functions */
+
+ACPI_RSCONVERT_INFO *AcpiGbl_GetResourceDispatch[] =
+{
+ /* Small descriptors */
+
+ NULL, /* 0x00, Reserved */
+ NULL, /* 0x01, Reserved */
+ NULL, /* 0x02, Reserved */
+ NULL, /* 0x03, Reserved */
+ AcpiRsGetIrq, /* 0x04, ACPI_RESOURCE_NAME_IRQ */
+ AcpiRsConvertDma, /* 0x05, ACPI_RESOURCE_NAME_DMA */
+ AcpiRsGetStartDpf, /* 0x06, ACPI_RESOURCE_NAME_START_DEPENDENT */
+ AcpiRsConvertEndDpf, /* 0x07, ACPI_RESOURCE_NAME_END_DEPENDENT */
+ AcpiRsConvertIo, /* 0x08, ACPI_RESOURCE_NAME_IO */
+ AcpiRsConvertFixedIo, /* 0x09, ACPI_RESOURCE_NAME_FIXED_IO */
+ NULL, /* 0x0A, Reserved */
+ NULL, /* 0x0B, Reserved */
+ NULL, /* 0x0C, Reserved */
+ NULL, /* 0x0D, Reserved */
+ AcpiRsGetVendorSmall, /* 0x0E, ACPI_RESOURCE_NAME_VENDOR_SMALL */
+ AcpiRsConvertEndTag, /* 0x0F, ACPI_RESOURCE_NAME_END_TAG */
+
+ /* Large descriptors */
+
+ NULL, /* 0x00, Reserved */
+ AcpiRsConvertMemory24, /* 0x01, ACPI_RESOURCE_NAME_MEMORY24 */
+ AcpiRsConvertGenericReg, /* 0x02, ACPI_RESOURCE_NAME_GENERIC_REGISTER */
+ NULL, /* 0x03, Reserved */
+ AcpiRsGetVendorLarge, /* 0x04, ACPI_RESOURCE_NAME_VENDOR_LARGE */
+ AcpiRsConvertMemory32, /* 0x05, ACPI_RESOURCE_NAME_MEMORY32 */
+ AcpiRsConvertFixedMemory32, /* 0x06, ACPI_RESOURCE_NAME_FIXED_MEMORY32 */
+ AcpiRsConvertAddress32, /* 0x07, ACPI_RESOURCE_NAME_ADDRESS32 */
+ AcpiRsConvertAddress16, /* 0x08, ACPI_RESOURCE_NAME_ADDRESS16 */
+ AcpiRsConvertExtIrq, /* 0x09, ACPI_RESOURCE_NAME_EXTENDED_IRQ */
+ AcpiRsConvertAddress64, /* 0x0A, ACPI_RESOURCE_NAME_ADDRESS64 */
+ AcpiRsConvertExtAddress64 /* 0x0B, ACPI_RESOURCE_NAME_EXTENDED_ADDRESS64 */
+};
+
+
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+
+/* Dispatch table for resource dump functions */
+
+ACPI_RSDUMP_INFO *AcpiGbl_DumpResourceDispatch[] =
+{
+ AcpiRsDumpIrq, /* ACPI_RESOURCE_TYPE_IRQ */
+ AcpiRsDumpDma, /* ACPI_RESOURCE_TYPE_DMA */
+ AcpiRsDumpStartDpf, /* ACPI_RESOURCE_TYPE_START_DEPENDENT */
+ AcpiRsDumpEndDpf, /* ACPI_RESOURCE_TYPE_END_DEPENDENT */
+ AcpiRsDumpIo, /* ACPI_RESOURCE_TYPE_IO */
+ AcpiRsDumpFixedIo, /* ACPI_RESOURCE_TYPE_FIXED_IO */
+ AcpiRsDumpVendor, /* ACPI_RESOURCE_TYPE_VENDOR */
+ AcpiRsDumpEndTag, /* ACPI_RESOURCE_TYPE_END_TAG */
+ AcpiRsDumpMemory24, /* ACPI_RESOURCE_TYPE_MEMORY24 */
+ AcpiRsDumpMemory32, /* ACPI_RESOURCE_TYPE_MEMORY32 */
+ AcpiRsDumpFixedMemory32, /* ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */
+ AcpiRsDumpAddress16, /* ACPI_RESOURCE_TYPE_ADDRESS16 */
+ AcpiRsDumpAddress32, /* ACPI_RESOURCE_TYPE_ADDRESS32 */
+ AcpiRsDumpAddress64, /* ACPI_RESOURCE_TYPE_ADDRESS64 */
+ AcpiRsDumpExtAddress64, /* ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
+ AcpiRsDumpExtIrq, /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
+ AcpiRsDumpGenericReg, /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
+};
+#endif
+
+
+/*
+ * Base sizes for external AML resource descriptors, indexed by internal type.
+ * Includes size of the descriptor header (1 byte for small descriptors,
+ * 3 bytes for large descriptors)
+ */
+const UINT8 AcpiGbl_AmlResourceSizes[] =
+{
+ sizeof (AML_RESOURCE_IRQ), /* ACPI_RESOURCE_TYPE_IRQ (optional Byte 3 always created) */
+ sizeof (AML_RESOURCE_DMA), /* ACPI_RESOURCE_TYPE_DMA */
+ sizeof (AML_RESOURCE_START_DEPENDENT), /* ACPI_RESOURCE_TYPE_START_DEPENDENT (optional Byte 1 always created) */
+ sizeof (AML_RESOURCE_END_DEPENDENT), /* ACPI_RESOURCE_TYPE_END_DEPENDENT */
+ sizeof (AML_RESOURCE_IO), /* ACPI_RESOURCE_TYPE_IO */
+ sizeof (AML_RESOURCE_FIXED_IO), /* ACPI_RESOURCE_TYPE_FIXED_IO */
+ sizeof (AML_RESOURCE_VENDOR_SMALL), /* ACPI_RESOURCE_TYPE_VENDOR */
+ sizeof (AML_RESOURCE_END_TAG), /* ACPI_RESOURCE_TYPE_END_TAG */
+ sizeof (AML_RESOURCE_MEMORY24), /* ACPI_RESOURCE_TYPE_MEMORY24 */
+ sizeof (AML_RESOURCE_MEMORY32), /* ACPI_RESOURCE_TYPE_MEMORY32 */
+ sizeof (AML_RESOURCE_FIXED_MEMORY32), /* ACPI_RESOURCE_TYPE_FIXED_MEMORY32 */
+ sizeof (AML_RESOURCE_ADDRESS16), /* ACPI_RESOURCE_TYPE_ADDRESS16 */
+ sizeof (AML_RESOURCE_ADDRESS32), /* ACPI_RESOURCE_TYPE_ADDRESS32 */
+ sizeof (AML_RESOURCE_ADDRESS64), /* ACPI_RESOURCE_TYPE_ADDRESS64 */
+ sizeof (AML_RESOURCE_EXTENDED_ADDRESS64),/*ACPI_RESOURCE_TYPE_EXTENDED_ADDRESS64 */
+ sizeof (AML_RESOURCE_EXTENDED_IRQ), /* ACPI_RESOURCE_TYPE_EXTENDED_IRQ */
+ sizeof (AML_RESOURCE_GENERIC_REGISTER) /* ACPI_RESOURCE_TYPE_GENERIC_REGISTER */
+};
+
+
+const UINT8 AcpiGbl_ResourceStructSizes[] =
+{
+ /* Small descriptors */
+
+ 0,
+ 0,
+ 0,
+ 0,
+ ACPI_RS_SIZE (ACPI_RESOURCE_IRQ),
+ ACPI_RS_SIZE (ACPI_RESOURCE_DMA),
+ ACPI_RS_SIZE (ACPI_RESOURCE_START_DEPENDENT),
+ ACPI_RS_SIZE_MIN,
+ ACPI_RS_SIZE (ACPI_RESOURCE_IO),
+ ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_IO),
+ 0,
+ 0,
+ 0,
+ 0,
+ ACPI_RS_SIZE (ACPI_RESOURCE_VENDOR),
+ ACPI_RS_SIZE_MIN,
+
+ /* Large descriptors */
+
+ 0,
+ ACPI_RS_SIZE (ACPI_RESOURCE_MEMORY24),
+ ACPI_RS_SIZE (ACPI_RESOURCE_GENERIC_REGISTER),
+ 0,
+ ACPI_RS_SIZE (ACPI_RESOURCE_VENDOR),
+ ACPI_RS_SIZE (ACPI_RESOURCE_MEMORY32),
+ ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_MEMORY32),
+ ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS32),
+ ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS16),
+ ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_IRQ),
+ ACPI_RS_SIZE (ACPI_RESOURCE_ADDRESS64),
+ ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_ADDRESS64)
+};
+
diff --git a/sys/contrib/dev/acpica/rsio.c b/sys/contrib/dev/acpica/rsio.c
new file mode 100644
index 0000000..5222979
--- /dev/null
+++ b/sys/contrib/dev/acpica/rsio.c
@@ -0,0 +1,341 @@
+/*******************************************************************************
+ *
+ * Module Name: rsio - IO and DMA resource descriptors
+ * $Revision: 1.35 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __RSIO_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rsio")
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertIo
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertIo[5] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IO,
+ ACPI_RS_SIZE (ACPI_RESOURCE_IO),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertIo)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IO,
+ sizeof (AML_RESOURCE_IO),
+ 0},
+
+ /* Decode flag */
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Io.IoDecode),
+ AML_OFFSET (Io.Flags),
+ 0},
+ /*
+ * These fields are contiguous in both the source and destination:
+ * Address Alignment
+ * Length
+ * Minimum Base Address
+ * Maximum Base Address
+ */
+ {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Io.Alignment),
+ AML_OFFSET (Io.Alignment),
+ 2},
+
+ {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.Io.Minimum),
+ AML_OFFSET (Io.Minimum),
+ 2}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertFixedIo
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertFixedIo[4] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_IO,
+ ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_IO),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertFixedIo)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_IO,
+ sizeof (AML_RESOURCE_FIXED_IO),
+ 0},
+ /*
+ * These fields are contiguous in both the source and destination:
+ * Base Address
+ * Length
+ */
+ {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.FixedIo.AddressLength),
+ AML_OFFSET (FixedIo.AddressLength),
+ 1},
+
+ {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.FixedIo.Address),
+ AML_OFFSET (FixedIo.Address),
+ 1}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertGenericReg
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertGenericReg[4] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_GENERIC_REGISTER,
+ ACPI_RS_SIZE (ACPI_RESOURCE_GENERIC_REGISTER),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertGenericReg)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_GENERIC_REGISTER,
+ sizeof (AML_RESOURCE_GENERIC_REGISTER),
+ 0},
+ /*
+ * These fields are contiguous in both the source and destination:
+ * Address Space ID
+ * Register Bit Width
+ * Register Bit Offset
+ * Access Size
+ */
+ {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.GenericReg.SpaceId),
+ AML_OFFSET (GenericReg.AddressSpaceId),
+ 4},
+
+ /* Get the Register Address */
+
+ {ACPI_RSC_MOVE64, ACPI_RS_OFFSET (Data.GenericReg.Address),
+ AML_OFFSET (GenericReg.Address),
+ 1}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertEndDpf
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertEndDpf[2] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_DEPENDENT,
+ ACPI_RS_SIZE_MIN,
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertEndDpf)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_DEPENDENT,
+ sizeof (AML_RESOURCE_END_DEPENDENT),
+ 0}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertEndTag
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertEndTag[2] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_END_TAG,
+ ACPI_RS_SIZE_MIN,
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertEndTag)},
+
+ /*
+ * Note: The checksum field is set to zero, meaning that the resource
+ * data is treated as if the checksum operation succeeded.
+ * (ACPI Spec 1.0b Section 6.4.2.8)
+ */
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_END_TAG,
+ sizeof (AML_RESOURCE_END_TAG),
+ 0}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsGetStartDpf
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsGetStartDpf[5] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_START_DEPENDENT,
+ ACPI_RS_SIZE (ACPI_RESOURCE_START_DEPENDENT),
+ ACPI_RSC_TABLE_SIZE (AcpiRsGetStartDpf)},
+
+ /* Defaults for Compatibility and Performance priorities */
+
+ {ACPI_RSC_SET8, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
+ ACPI_ACCEPTABLE_CONFIGURATION,
+ 2},
+
+ /* All done if there is no flag byte present in the descriptor */
+
+ {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 1},
+
+ /* Flag byte is present, get the flags */
+
+ {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
+ AML_OFFSET (StartDpf.Flags),
+ 0},
+
+ {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
+ AML_OFFSET (StartDpf.Flags),
+ 2}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsSetStartDpf
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsSetStartDpf[6] =
+{
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_START_DEPENDENT,
+ sizeof (AML_RESOURCE_START_DEPENDENT),
+ ACPI_RSC_TABLE_SIZE (AcpiRsSetStartDpf)},
+
+ /* Set the default flag values */
+
+ {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
+ AML_OFFSET (StartDpf.Flags),
+ 0},
+
+ {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
+ AML_OFFSET (StartDpf.Flags),
+ 2},
+ /*
+ * All done if flags byte is necessary -- if either priority value
+ * is not ACPI_ACCEPTABLE_CONFIGURATION
+ */
+ {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
+ ACPI_RS_OFFSET (Data.StartDpf.CompatibilityPriority),
+ ACPI_ACCEPTABLE_CONFIGURATION},
+
+ {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
+ ACPI_RS_OFFSET (Data.StartDpf.PerformanceRobustness),
+ ACPI_ACCEPTABLE_CONFIGURATION},
+
+ /* Flag byte is not necessary */
+
+ {ACPI_RSC_LENGTH, 0, 0, sizeof (AML_RESOURCE_START_DEPENDENT_NOPRIO)}
+};
+
+
diff --git a/sys/contrib/dev/acpica/rsirq.c b/sys/contrib/dev/acpica/rsirq.c
new file mode 100644
index 0000000..abf72c6
--- /dev/null
+++ b/sys/contrib/dev/acpica/rsirq.c
@@ -0,0 +1,313 @@
+/*******************************************************************************
+ *
+ * Module Name: rsirq - IRQ resource descriptors
+ * $Revision: 1.50 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __RSIRQ_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rsirq")
+
+
+/*******************************************************************************
+ *
+ * AcpiRsGetIrq
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsGetIrq[7] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_IRQ,
+ ACPI_RS_SIZE (ACPI_RESOURCE_IRQ),
+ ACPI_RSC_TABLE_SIZE (AcpiRsGetIrq)},
+
+ /* Get the IRQ mask (bytes 1:2) */
+
+ {ACPI_RSC_BITMASK16,ACPI_RS_OFFSET (Data.Irq.Interrupts[0]),
+ AML_OFFSET (Irq.IrqMask),
+ ACPI_RS_OFFSET (Data.Irq.InterruptCount)},
+
+ /* Set default flags (others are zero) */
+
+ {ACPI_RSC_SET8, ACPI_RS_OFFSET (Data.Irq.Triggering),
+ ACPI_EDGE_SENSITIVE,
+ 1},
+
+ /* All done if no flag byte present in descriptor */
+
+ {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_AML_LENGTH, 0, 3},
+
+ /* Get flags: Triggering[0], Polarity[3], Sharing[4] */
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Triggering),
+ AML_OFFSET (Irq.Flags),
+ 0},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Polarity),
+ AML_OFFSET (Irq.Flags),
+ 3},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Sharable),
+ AML_OFFSET (Irq.Flags),
+ 4}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsSetIrq
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsSetIrq[9] =
+{
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_IRQ,
+ sizeof (AML_RESOURCE_IRQ),
+ ACPI_RSC_TABLE_SIZE (AcpiRsSetIrq)},
+
+ /* Convert interrupt list to 16-bit IRQ bitmask */
+
+ {ACPI_RSC_BITMASK16,ACPI_RS_OFFSET (Data.Irq.Interrupts[0]),
+ AML_OFFSET (Irq.IrqMask),
+ ACPI_RS_OFFSET (Data.Irq.InterruptCount)},
+
+ /* Set the flags byte by default */
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Triggering),
+ AML_OFFSET (Irq.Flags),
+ 0},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Polarity),
+ AML_OFFSET (Irq.Flags),
+ 3},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Irq.Sharable),
+ AML_OFFSET (Irq.Flags),
+ 4},
+ /*
+ * Check if the flags byte is necessary. Not needed if the flags are:
+ * ACPI_EDGE_SENSITIVE, ACPI_ACTIVE_HIGH, ACPI_EXCLUSIVE
+ */
+ {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
+ ACPI_RS_OFFSET (Data.Irq.Triggering),
+ ACPI_EDGE_SENSITIVE},
+
+ {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
+ ACPI_RS_OFFSET (Data.Irq.Polarity),
+ ACPI_ACTIVE_HIGH},
+
+ {ACPI_RSC_EXIT_NE, ACPI_RSC_COMPARE_VALUE,
+ ACPI_RS_OFFSET (Data.Irq.Sharable),
+ ACPI_EXCLUSIVE},
+
+ /* IrqNoFlags() descriptor can be used */
+
+ {ACPI_RSC_LENGTH, 0, 0, sizeof (AML_RESOURCE_IRQ_NOFLAGS)}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertExtIrq
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertExtIrq[9] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_EXTENDED_IRQ,
+ ACPI_RS_SIZE (ACPI_RESOURCE_EXTENDED_IRQ),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertExtIrq)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_EXTENDED_IRQ,
+ sizeof (AML_RESOURCE_EXTENDED_IRQ),
+ 0},
+
+ /* Flag bits */
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.ProducerConsumer),
+ AML_OFFSET (ExtendedIrq.Flags),
+ 0},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.Triggering),
+ AML_OFFSET (ExtendedIrq.Flags),
+ 1},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.Polarity),
+ AML_OFFSET (ExtendedIrq.Flags),
+ 2},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.ExtendedIrq.Sharable),
+ AML_OFFSET (ExtendedIrq.Flags),
+ 3},
+
+ /* IRQ Table length (Byte4) */
+
+ {ACPI_RSC_COUNT, ACPI_RS_OFFSET (Data.ExtendedIrq.InterruptCount),
+ AML_OFFSET (ExtendedIrq.InterruptCount),
+ sizeof (UINT32)},
+
+ /* Copy every IRQ in the table, each is 32 bits */
+
+ {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.ExtendedIrq.Interrupts[0]),
+ AML_OFFSET (ExtendedIrq.Interrupts[0]),
+ 0},
+
+ /* Optional ResourceSource (Index and String) */
+
+ {ACPI_RSC_SOURCEX, ACPI_RS_OFFSET (Data.ExtendedIrq.ResourceSource),
+ ACPI_RS_OFFSET (Data.ExtendedIrq.Interrupts[0]),
+ sizeof (AML_RESOURCE_EXTENDED_IRQ)}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertDma
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertDma[6] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_DMA,
+ ACPI_RS_SIZE (ACPI_RESOURCE_DMA),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertDma)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_DMA,
+ sizeof (AML_RESOURCE_DMA),
+ 0},
+
+ /* Flags: transfer preference, bus mastering, channel speed */
+
+ {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Dma.Transfer),
+ AML_OFFSET (Dma.Flags),
+ 0},
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Dma.BusMaster),
+ AML_OFFSET (Dma.Flags),
+ 2},
+
+ {ACPI_RSC_2BITFLAG, ACPI_RS_OFFSET (Data.Dma.Type),
+ AML_OFFSET (Dma.Flags),
+ 5},
+
+ /* DMA channel mask bits */
+
+ {ACPI_RSC_BITMASK, ACPI_RS_OFFSET (Data.Dma.Channels[0]),
+ AML_OFFSET (Dma.DmaChannelMask),
+ ACPI_RS_OFFSET (Data.Dma.ChannelCount)}
+};
+
diff --git a/sys/contrib/dev/acpica/rslist.c b/sys/contrib/dev/acpica/rslist.c
new file mode 100644
index 0000000..37a0764
--- /dev/null
+++ b/sys/contrib/dev/acpica/rslist.c
@@ -0,0 +1,286 @@
+/*******************************************************************************
+ *
+ * Module Name: rslist - Linked list utilities
+ * $Revision: 1.62 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __RSLIST_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rslist")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsConvertAmlToResources
+ *
+ * PARAMETERS: ACPI_WALK_AML_CALLBACK
+ * ResourcePtr - Pointer to the buffer that will
+ * contain the output structures
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert an AML resource to an internal representation of the
+ * resource that is aligned and easier to access.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsConvertAmlToResources (
+ UINT8 *Aml,
+ UINT32 Length,
+ UINT32 Offset,
+ UINT8 ResourceIndex,
+ void *Context)
+{
+ ACPI_RESOURCE **ResourcePtr = ACPI_CAST_INDIRECT_PTR (
+ ACPI_RESOURCE, Context);
+ ACPI_RESOURCE *Resource;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (RsConvertAmlToResources);
+
+
+ /*
+ * Check that the input buffer and all subsequent pointers into it
+ * are aligned on a native word boundary. Most important on IA64
+ */
+ Resource = *ResourcePtr;
+ if (ACPI_IS_MISALIGNED (Resource))
+ {
+ ACPI_WARNING ((AE_INFO,
+ "Misaligned resource pointer %p", Resource));
+ }
+
+ /* Convert the AML byte stream resource to a local resource struct */
+
+ Status = AcpiRsConvertAmlToResource (
+ Resource, ACPI_CAST_PTR (AML_RESOURCE, Aml),
+ AcpiGbl_GetResourceDispatch[ResourceIndex]);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not convert AML resource (Type %X)", *Aml));
+ return_ACPI_STATUS (Status);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_RESOURCES,
+ "Type %.2X, AmlLength %.2X InternalLength %.2X\n",
+ AcpiUtGetResourceType (Aml), Length,
+ Resource->Length));
+
+ /* Point to the next structure in the output buffer */
+
+ *ResourcePtr = ACPI_ADD_PTR (void, Resource, Resource->Length);
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsConvertResourcesToAml
+ *
+ * PARAMETERS: Resource - Pointer to the resource linked list
+ * AmlSizeNeeded - Calculated size of the byte stream
+ * needed from calling AcpiRsGetAmlLength()
+ * The size of the OutputBuffer is
+ * guaranteed to be >= AmlSizeNeeded
+ * OutputBuffer - Pointer to the buffer that will
+ * contain the byte stream
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Takes the resource linked list and parses it, creating a
+ * byte stream of resources in the caller's output buffer
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsConvertResourcesToAml (
+ ACPI_RESOURCE *Resource,
+ ACPI_SIZE AmlSizeNeeded,
+ UINT8 *OutputBuffer)
+{
+ UINT8 *Aml = OutputBuffer;
+ UINT8 *EndAml = OutputBuffer + AmlSizeNeeded;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (RsConvertResourcesToAml);
+
+
+ /* Walk the resource descriptor list, convert each descriptor */
+
+ while (Aml < EndAml)
+ {
+ /* Validate the (internal) Resource Type */
+
+ if (Resource->Type > ACPI_RESOURCE_TYPE_MAX)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Invalid descriptor type (%X) in resource list",
+ Resource->Type));
+ return_ACPI_STATUS (AE_BAD_DATA);
+ }
+
+ /* Perform the conversion */
+
+ Status = AcpiRsConvertResourceToAml (Resource,
+ ACPI_CAST_PTR (AML_RESOURCE, Aml),
+ AcpiGbl_SetResourceDispatch[Resource->Type]);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not convert resource (type %X) to AML",
+ Resource->Type));
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Perform final sanity check on the new AML resource descriptor */
+
+ Status = AcpiUtValidateResource (
+ ACPI_CAST_PTR (AML_RESOURCE, Aml), NULL);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Check for end-of-list, normal exit */
+
+ if (Resource->Type == ACPI_RESOURCE_TYPE_END_TAG)
+ {
+ /* An End Tag indicates the end of the input Resource Template */
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Extract the total length of the new descriptor and set the
+ * Aml to point to the next (output) resource descriptor
+ */
+ Aml += AcpiUtGetDescriptorLength (Aml);
+
+ /* Point to the next input resource descriptor */
+
+ Resource = ACPI_ADD_PTR (ACPI_RESOURCE, Resource, Resource->Length);
+ }
+
+ /* Completed buffer, but did not find an EndTag resource descriptor */
+
+ return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
+}
+
diff --git a/sys/contrib/dev/acpica/rsmemory.c b/sys/contrib/dev/acpica/rsmemory.c
new file mode 100644
index 0000000..e4ab62d
--- /dev/null
+++ b/sys/contrib/dev/acpica/rsmemory.c
@@ -0,0 +1,323 @@
+/*******************************************************************************
+ *
+ * Module Name: rsmem24 - Memory resource descriptors
+ * $Revision: 1.34 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __RSMEMORY_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rsmemory")
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertMemory24
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertMemory24[4] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY24,
+ ACPI_RS_SIZE (ACPI_RESOURCE_MEMORY24),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertMemory24)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY24,
+ sizeof (AML_RESOURCE_MEMORY24),
+ 0},
+
+ /* Read/Write bit */
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Memory24.WriteProtect),
+ AML_OFFSET (Memory24.Flags),
+ 0},
+ /*
+ * These fields are contiguous in both the source and destination:
+ * Minimum Base Address
+ * Maximum Base Address
+ * Address Base Alignment
+ * Range Length
+ */
+ {ACPI_RSC_MOVE16, ACPI_RS_OFFSET (Data.Memory24.Minimum),
+ AML_OFFSET (Memory24.Minimum),
+ 4}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertMemory32
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertMemory32[4] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_MEMORY32,
+ ACPI_RS_SIZE (ACPI_RESOURCE_MEMORY32),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertMemory32)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_MEMORY32,
+ sizeof (AML_RESOURCE_MEMORY32),
+ 0},
+
+ /* Read/Write bit */
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.Memory32.WriteProtect),
+ AML_OFFSET (Memory32.Flags),
+ 0},
+ /*
+ * These fields are contiguous in both the source and destination:
+ * Minimum Base Address
+ * Maximum Base Address
+ * Address Base Alignment
+ * Range Length
+ */
+ {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.Memory32.Minimum),
+ AML_OFFSET (Memory32.Minimum),
+ 4}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsConvertFixedMemory32
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsConvertFixedMemory32[4] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_FIXED_MEMORY32,
+ ACPI_RS_SIZE (ACPI_RESOURCE_FIXED_MEMORY32),
+ ACPI_RSC_TABLE_SIZE (AcpiRsConvertFixedMemory32)},
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_FIXED_MEMORY32,
+ sizeof (AML_RESOURCE_FIXED_MEMORY32),
+ 0},
+
+ /* Read/Write bit */
+
+ {ACPI_RSC_1BITFLAG, ACPI_RS_OFFSET (Data.FixedMemory32.WriteProtect),
+ AML_OFFSET (FixedMemory32.Flags),
+ 0},
+ /*
+ * These fields are contiguous in both the source and destination:
+ * Base Address
+ * Range Length
+ */
+ {ACPI_RSC_MOVE32, ACPI_RS_OFFSET (Data.FixedMemory32.Address),
+ AML_OFFSET (FixedMemory32.Address),
+ 2}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsGetVendorSmall
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsGetVendorSmall[3] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR,
+ ACPI_RS_SIZE (ACPI_RESOURCE_VENDOR),
+ ACPI_RSC_TABLE_SIZE (AcpiRsGetVendorSmall)},
+
+ /* Length of the vendor data (byte count) */
+
+ {ACPI_RSC_COUNT16, ACPI_RS_OFFSET (Data.Vendor.ByteLength),
+ 0,
+ sizeof (UINT8)},
+
+ /* Vendor data */
+
+ {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Vendor.ByteData[0]),
+ sizeof (AML_RESOURCE_SMALL_HEADER),
+ 0}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsGetVendorLarge
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsGetVendorLarge[3] =
+{
+ {ACPI_RSC_INITGET, ACPI_RESOURCE_TYPE_VENDOR,
+ ACPI_RS_SIZE (ACPI_RESOURCE_VENDOR),
+ ACPI_RSC_TABLE_SIZE (AcpiRsGetVendorLarge)},
+
+ /* Length of the vendor data (byte count) */
+
+ {ACPI_RSC_COUNT16, ACPI_RS_OFFSET (Data.Vendor.ByteLength),
+ 0,
+ sizeof (UINT8)},
+
+ /* Vendor data */
+
+ {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Vendor.ByteData[0]),
+ sizeof (AML_RESOURCE_LARGE_HEADER),
+ 0}
+};
+
+
+/*******************************************************************************
+ *
+ * AcpiRsSetVendor
+ *
+ ******************************************************************************/
+
+ACPI_RSCONVERT_INFO AcpiRsSetVendor[7] =
+{
+ /* Default is a small vendor descriptor */
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_SMALL,
+ sizeof (AML_RESOURCE_SMALL_HEADER),
+ ACPI_RSC_TABLE_SIZE (AcpiRsSetVendor)},
+
+ /* Get the length and copy the data */
+
+ {ACPI_RSC_COUNT16, ACPI_RS_OFFSET (Data.Vendor.ByteLength),
+ 0,
+ 0},
+
+ {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Vendor.ByteData[0]),
+ sizeof (AML_RESOURCE_SMALL_HEADER),
+ 0},
+
+ /*
+ * All done if the Vendor byte length is 7 or less, meaning that it will
+ * fit within a small descriptor
+ */
+ {ACPI_RSC_EXIT_LE, 0, 0, 7},
+
+ /* Must create a large vendor descriptor */
+
+ {ACPI_RSC_INITSET, ACPI_RESOURCE_NAME_VENDOR_LARGE,
+ sizeof (AML_RESOURCE_LARGE_HEADER),
+ 0},
+
+ {ACPI_RSC_COUNT16, ACPI_RS_OFFSET (Data.Vendor.ByteLength),
+ 0,
+ 0},
+
+ {ACPI_RSC_MOVE8, ACPI_RS_OFFSET (Data.Vendor.ByteData[0]),
+ sizeof (AML_RESOURCE_LARGE_HEADER),
+ 0}
+};
+
+
diff --git a/sys/contrib/dev/acpica/rsmisc.c b/sys/contrib/dev/acpica/rsmisc.c
new file mode 100644
index 0000000..6150bde
--- /dev/null
+++ b/sys/contrib/dev/acpica/rsmisc.c
@@ -0,0 +1,671 @@
+/*******************************************************************************
+ *
+ * Module Name: rsmisc - Miscellaneous resource descriptors
+ * $Revision: 1.46 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __RSMISC_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rsmisc")
+
+
+#define INIT_RESOURCE_TYPE(i) i->ResourceOffset
+#define INIT_RESOURCE_LENGTH(i) i->AmlOffset
+#define INIT_TABLE_LENGTH(i) i->Value
+
+#define COMPARE_OPCODE(i) i->ResourceOffset
+#define COMPARE_TARGET(i) i->AmlOffset
+#define COMPARE_VALUE(i) i->Value
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsConvertAmlToResource
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Aml - Where the AML descriptor is returned
+ * Info - Pointer to appropriate conversion table
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert an external AML resource descriptor to the corresponding
+ * internal resource descriptor
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsConvertAmlToResource (
+ ACPI_RESOURCE *Resource,
+ AML_RESOURCE *Aml,
+ ACPI_RSCONVERT_INFO *Info)
+{
+ ACPI_RS_LENGTH AmlResourceLength;
+ void *Source;
+ void *Destination;
+ char *Target;
+ UINT8 Count;
+ UINT8 FlagsMode = FALSE;
+ UINT16 ItemCount = 0;
+ UINT16 Temp16 = 0;
+
+
+ ACPI_FUNCTION_TRACE (RsConvertAmlToResource);
+
+
+ if (((ACPI_NATIVE_UINT) Resource) & 0x3)
+ {
+ /* Each internal resource struct is expected to be 32-bit aligned */
+
+ ACPI_WARNING ((AE_INFO,
+ "Misaligned resource pointer (get): %p Type %2.2X Len %X",
+ Resource, Resource->Type, Resource->Length));
+ }
+
+ /* Extract the resource Length field (does not include header length) */
+
+ AmlResourceLength = AcpiUtGetResourceLength (Aml);
+
+ /*
+ * First table entry must be ACPI_RSC_INITxxx and must contain the
+ * table length (# of table entries)
+ */
+ Count = INIT_TABLE_LENGTH (Info);
+
+ while (Count)
+ {
+ /*
+ * Source is the external AML byte stream buffer,
+ * destination is the internal resource descriptor
+ */
+ Source = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
+ Destination = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
+
+ switch (Info->Opcode)
+ {
+ case ACPI_RSC_INITGET:
+ /*
+ * Get the resource type and the initial (minimum) length
+ */
+ ACPI_MEMSET (Resource, 0, INIT_RESOURCE_LENGTH (Info));
+ Resource->Type = INIT_RESOURCE_TYPE (Info);
+ Resource->Length = INIT_RESOURCE_LENGTH (Info);
+ break;
+
+
+ case ACPI_RSC_INITSET:
+ break;
+
+
+ case ACPI_RSC_FLAGINIT:
+
+ FlagsMode = TRUE;
+ break;
+
+
+ case ACPI_RSC_1BITFLAG:
+ /*
+ * Mask and shift the flag bit
+ */
+ ACPI_SET8 (Destination) = (UINT8)
+ ((ACPI_GET8 (Source) >> Info->Value) & 0x01);
+ break;
+
+
+ case ACPI_RSC_2BITFLAG:
+ /*
+ * Mask and shift the flag bits
+ */
+ ACPI_SET8 (Destination) = (UINT8)
+ ((ACPI_GET8 (Source) >> Info->Value) & 0x03);
+ break;
+
+
+ case ACPI_RSC_COUNT:
+
+ ItemCount = ACPI_GET8 (Source);
+ ACPI_SET8 (Destination) = (UINT8) ItemCount;
+
+ Resource->Length = Resource->Length +
+ (Info->Value * (ItemCount - 1));
+ break;
+
+
+ case ACPI_RSC_COUNT16:
+
+ ItemCount = AmlResourceLength;
+ ACPI_SET16 (Destination) = ItemCount;
+
+ Resource->Length = Resource->Length +
+ (Info->Value * (ItemCount - 1));
+ break;
+
+
+ case ACPI_RSC_LENGTH:
+
+ Resource->Length = Resource->Length + Info->Value;
+ break;
+
+
+ case ACPI_RSC_MOVE8:
+ case ACPI_RSC_MOVE16:
+ case ACPI_RSC_MOVE32:
+ case ACPI_RSC_MOVE64:
+ /*
+ * Raw data move. Use the Info value field unless ItemCount has
+ * been previously initialized via a COUNT opcode
+ */
+ if (Info->Value)
+ {
+ ItemCount = Info->Value;
+ }
+ AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
+ break;
+
+
+ case ACPI_RSC_SET8:
+
+ ACPI_MEMSET (Destination, Info->AmlOffset, Info->Value);
+ break;
+
+
+ case ACPI_RSC_DATA8:
+
+ Target = ACPI_ADD_PTR (char, Resource, Info->Value);
+ ACPI_MEMCPY (Destination, Source, ACPI_GET16 (Target));
+ break;
+
+
+ case ACPI_RSC_ADDRESS:
+ /*
+ * Common handler for address descriptor flags
+ */
+ if (!AcpiRsGetAddressCommon (Resource, Aml))
+ {
+ return_ACPI_STATUS (AE_AML_INVALID_RESOURCE_TYPE);
+ }
+ break;
+
+
+ case ACPI_RSC_SOURCE:
+ /*
+ * Optional ResourceSource (Index and String)
+ */
+ Resource->Length +=
+ AcpiRsGetResourceSource (AmlResourceLength, Info->Value,
+ Destination, Aml, NULL);
+ break;
+
+
+ case ACPI_RSC_SOURCEX:
+ /*
+ * Optional ResourceSource (Index and String). This is the more
+ * complicated case used by the Interrupt() macro
+ */
+ Target = ACPI_ADD_PTR (char, Resource, Info->AmlOffset + (ItemCount * 4));
+
+ Resource->Length +=
+ AcpiRsGetResourceSource (AmlResourceLength,
+ (ACPI_RS_LENGTH) (((ItemCount - 1) * sizeof (UINT32)) + Info->Value),
+ Destination, Aml, Target);
+ break;
+
+
+ case ACPI_RSC_BITMASK:
+ /*
+ * 8-bit encoded bitmask (DMA macro)
+ */
+ ItemCount = AcpiRsDecodeBitmask (ACPI_GET8 (Source), Destination);
+ if (ItemCount)
+ {
+ Resource->Length += (ItemCount - 1);
+ }
+
+ Target = ACPI_ADD_PTR (char, Resource, Info->Value);
+ ACPI_SET8 (Target) = (UINT8) ItemCount;
+ break;
+
+
+ case ACPI_RSC_BITMASK16:
+ /*
+ * 16-bit encoded bitmask (IRQ macro)
+ */
+ ACPI_MOVE_16_TO_16 (&Temp16, Source);
+
+ ItemCount = AcpiRsDecodeBitmask (Temp16, Destination);
+ if (ItemCount)
+ {
+ Resource->Length += (ItemCount - 1);
+ }
+
+ Target = ACPI_ADD_PTR (char, Resource, Info->Value);
+ ACPI_SET8 (Target) = (UINT8) ItemCount;
+ break;
+
+
+ case ACPI_RSC_EXIT_NE:
+ /*
+ * Control - Exit conversion if not equal
+ */
+ switch (Info->ResourceOffset)
+ {
+ case ACPI_RSC_COMPARE_AML_LENGTH:
+ if (AmlResourceLength != Info->Value)
+ {
+ goto Exit;
+ }
+ break;
+
+ case ACPI_RSC_COMPARE_VALUE:
+ if (ACPI_GET8 (Source) != Info->Value)
+ {
+ goto Exit;
+ }
+ break;
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Count--;
+ Info++;
+ }
+
+Exit:
+ if (!FlagsMode)
+ {
+ /* Round the resource struct length up to the next boundary (32 or 64) */
+
+ Resource->Length = (UINT32) ACPI_ROUND_UP_TO_NATIVE_WORD (Resource->Length);
+ }
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsConvertResourceToAml
+ *
+ * PARAMETERS: Resource - Pointer to the resource descriptor
+ * Aml - Where the AML descriptor is returned
+ * Info - Pointer to appropriate conversion table
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Convert an internal resource descriptor to the corresponding
+ * external AML resource descriptor.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsConvertResourceToAml (
+ ACPI_RESOURCE *Resource,
+ AML_RESOURCE *Aml,
+ ACPI_RSCONVERT_INFO *Info)
+{
+ void *Source = NULL;
+ void *Destination;
+ ACPI_RSDESC_SIZE AmlLength = 0;
+ UINT8 Count;
+ UINT16 Temp16 = 0;
+ UINT16 ItemCount = 0;
+
+
+ ACPI_FUNCTION_TRACE (RsConvertResourceToAml);
+
+
+ /*
+ * First table entry must be ACPI_RSC_INITxxx and must contain the
+ * table length (# of table entries)
+ */
+ Count = INIT_TABLE_LENGTH (Info);
+
+ while (Count)
+ {
+ /*
+ * Source is the internal resource descriptor,
+ * destination is the external AML byte stream buffer
+ */
+ Source = ACPI_ADD_PTR (void, Resource, Info->ResourceOffset);
+ Destination = ACPI_ADD_PTR (void, Aml, Info->AmlOffset);
+
+ switch (Info->Opcode)
+ {
+ case ACPI_RSC_INITSET:
+
+ ACPI_MEMSET (Aml, 0, INIT_RESOURCE_LENGTH (Info));
+ AmlLength = INIT_RESOURCE_LENGTH (Info);
+ AcpiRsSetResourceHeader (INIT_RESOURCE_TYPE (Info), AmlLength, Aml);
+ break;
+
+
+ case ACPI_RSC_INITGET:
+ break;
+
+
+ case ACPI_RSC_FLAGINIT:
+ /*
+ * Clear the flag byte
+ */
+ ACPI_SET8 (Destination) = 0;
+ break;
+
+
+ case ACPI_RSC_1BITFLAG:
+ /*
+ * Mask and shift the flag bit
+ */
+ ACPI_SET8 (Destination) |= (UINT8)
+ ((ACPI_GET8 (Source) & 0x01) << Info->Value);
+ break;
+
+
+ case ACPI_RSC_2BITFLAG:
+ /*
+ * Mask and shift the flag bits
+ */
+ ACPI_SET8 (Destination) |= (UINT8)
+ ((ACPI_GET8 (Source) & 0x03) << Info->Value);
+ break;
+
+
+ case ACPI_RSC_COUNT:
+
+ ItemCount = ACPI_GET8 (Source);
+ ACPI_SET8 (Destination) = (UINT8) ItemCount;
+
+ AmlLength = (UINT16) (AmlLength + (Info->Value * (ItemCount - 1)));
+ break;
+
+
+ case ACPI_RSC_COUNT16:
+
+ ItemCount = ACPI_GET16 (Source);
+ AmlLength = (UINT16) (AmlLength + ItemCount);
+ AcpiRsSetResourceLength (AmlLength, Aml);
+ break;
+
+
+ case ACPI_RSC_LENGTH:
+
+ AcpiRsSetResourceLength (Info->Value, Aml);
+ break;
+
+
+ case ACPI_RSC_MOVE8:
+ case ACPI_RSC_MOVE16:
+ case ACPI_RSC_MOVE32:
+ case ACPI_RSC_MOVE64:
+
+ if (Info->Value)
+ {
+ ItemCount = Info->Value;
+ }
+ AcpiRsMoveData (Destination, Source, ItemCount, Info->Opcode);
+ break;
+
+
+ case ACPI_RSC_ADDRESS:
+
+ /* Set the Resource Type, General Flags, and Type-Specific Flags */
+
+ AcpiRsSetAddressCommon (Aml, Resource);
+ break;
+
+
+ case ACPI_RSC_SOURCEX:
+ /*
+ * Optional ResourceSource (Index and String)
+ */
+ AmlLength = AcpiRsSetResourceSource (
+ Aml, (ACPI_RS_LENGTH) AmlLength, Source);
+ AcpiRsSetResourceLength (AmlLength, Aml);
+ break;
+
+
+ case ACPI_RSC_SOURCE:
+ /*
+ * Optional ResourceSource (Index and String). This is the more
+ * complicated case used by the Interrupt() macro
+ */
+ AmlLength = AcpiRsSetResourceSource (Aml, Info->Value, Source);
+ AcpiRsSetResourceLength (AmlLength, Aml);
+ break;
+
+
+ case ACPI_RSC_BITMASK:
+ /*
+ * 8-bit encoded bitmask (DMA macro)
+ */
+ ACPI_SET8 (Destination) = (UINT8)
+ AcpiRsEncodeBitmask (Source,
+ *ACPI_ADD_PTR (UINT8, Resource, Info->Value));
+ break;
+
+
+ case ACPI_RSC_BITMASK16:
+ /*
+ * 16-bit encoded bitmask (IRQ macro)
+ */
+ Temp16 = AcpiRsEncodeBitmask (Source,
+ *ACPI_ADD_PTR (UINT8, Resource, Info->Value));
+ ACPI_MOVE_16_TO_16 (Destination, &Temp16);
+ break;
+
+
+ case ACPI_RSC_EXIT_LE:
+ /*
+ * Control - Exit conversion if less than or equal
+ */
+ if (ItemCount <= Info->Value)
+ {
+ goto Exit;
+ }
+ break;
+
+
+ case ACPI_RSC_EXIT_NE:
+ /*
+ * Control - Exit conversion if not equal
+ */
+ switch (COMPARE_OPCODE (Info))
+ {
+ case ACPI_RSC_COMPARE_VALUE:
+
+ if (*ACPI_ADD_PTR (UINT8, Resource,
+ COMPARE_TARGET (Info)) != COMPARE_VALUE (Info))
+ {
+ goto Exit;
+ }
+ break;
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Invalid conversion sub-opcode"));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Invalid conversion opcode"));
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Count--;
+ Info++;
+ }
+
+Exit:
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+#if 0
+/* Previous resource validations */
+
+ if (Aml->ExtAddress64.RevisionID != AML_RESOURCE_EXTENDED_ADDRESS_REVISION)
+ {
+ return_ACPI_STATUS (AE_SUPPORT);
+ }
+
+ if (Resource->Data.StartDpf.PerformanceRobustness >= 3)
+ {
+ return_ACPI_STATUS (AE_AML_BAD_RESOURCE_VALUE);
+ }
+
+ if (((Aml->Irq.Flags & 0x09) == 0x00) ||
+ ((Aml->Irq.Flags & 0x09) == 0x09))
+ {
+ /*
+ * Only [ActiveHigh, EdgeSensitive] or [ActiveLow, LevelSensitive]
+ * polarity/trigger interrupts are allowed (ACPI spec, section
+ * "IRQ Format"), so 0x00 and 0x09 are illegal.
+ */
+ ACPI_ERROR ((AE_INFO,
+ "Invalid interrupt polarity/trigger in resource list, %X",
+ Aml->Irq.Flags));
+ return_ACPI_STATUS (AE_BAD_DATA);
+ }
+
+ Resource->Data.ExtendedIrq.InterruptCount = Temp8;
+ if (Temp8 < 1)
+ {
+ /* Must have at least one IRQ */
+
+ return_ACPI_STATUS (AE_AML_BAD_RESOURCE_LENGTH);
+ }
+
+ if (Resource->Data.Dma.Transfer == 0x03)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Invalid DMA.Transfer preference (3)"));
+ return_ACPI_STATUS (AE_BAD_DATA);
+ }
+#endif
+
+
diff --git a/sys/contrib/dev/acpica/rsutils.c b/sys/contrib/dev/acpica/rsutils.c
new file mode 100644
index 0000000..369eb86
--- /dev/null
+++ b/sys/contrib/dev/acpica/rsutils.c
@@ -0,0 +1,875 @@
+/*******************************************************************************
+ *
+ * Module Name: rsutils - Utilities for the resource manager
+ * $Revision: 1.67 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __RSUTILS_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acresrc.h>
+
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rsutils")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsDecodeBitmask
+ *
+ * PARAMETERS: Mask - Bitmask to decode
+ * List - Where the converted list is returned
+ *
+ * RETURN: Count of bits set (length of list)
+ *
+ * DESCRIPTION: Convert a bit mask into a list of values
+ *
+ ******************************************************************************/
+
+UINT8
+AcpiRsDecodeBitmask (
+ UINT16 Mask,
+ UINT8 *List)
+{
+ ACPI_NATIVE_UINT i;
+ UINT8 BitCount;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Decode the mask bits */
+
+ for (i = 0, BitCount = 0; Mask; i++)
+ {
+ if (Mask & 0x0001)
+ {
+ List[BitCount] = (UINT8) i;
+ BitCount++;
+ }
+
+ Mask >>= 1;
+ }
+
+ return (BitCount);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsEncodeBitmask
+ *
+ * PARAMETERS: List - List of values to encode
+ * Count - Length of list
+ *
+ * RETURN: Encoded bitmask
+ *
+ * DESCRIPTION: Convert a list of values to an encoded bitmask
+ *
+ ******************************************************************************/
+
+UINT16
+AcpiRsEncodeBitmask (
+ UINT8 *List,
+ UINT8 Count)
+{
+ ACPI_NATIVE_UINT i;
+ UINT16 Mask;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Encode the list into a single bitmask */
+
+ for (i = 0, Mask = 0; i < Count; i++)
+ {
+ Mask |= (0x0001 << List[i]);
+ }
+
+ return (Mask);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsMoveData
+ *
+ * PARAMETERS: Destination - Pointer to the destination descriptor
+ * Source - Pointer to the source descriptor
+ * ItemCount - How many items to move
+ * MoveType - Byte width
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Move multiple data items from one descriptor to another. Handles
+ * alignment issues and endian issues if necessary, as configured
+ * via the ACPI_MOVE_* macros. (This is why a memcpy is not used)
+ *
+ ******************************************************************************/
+
+void
+AcpiRsMoveData (
+ void *Destination,
+ void *Source,
+ UINT16 ItemCount,
+ UINT8 MoveType)
+{
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* One move per item */
+
+ for (i = 0; i < ItemCount; i++)
+ {
+ switch (MoveType)
+ {
+ /*
+ * For the 8-bit case, we can perform the move all at once
+ * since there are no alignment or endian issues
+ */
+ case ACPI_RSC_MOVE8:
+ ACPI_MEMCPY (Destination, Source, ItemCount);
+ return;
+
+ /*
+ * 16-, 32-, and 64-bit cases must use the move macros that perform
+ * endian conversion and/or accomodate hardware that cannot perform
+ * misaligned memory transfers
+ */
+ case ACPI_RSC_MOVE16:
+ ACPI_MOVE_16_TO_16 (&ACPI_CAST_PTR (UINT16, Destination)[i],
+ &ACPI_CAST_PTR (UINT16, Source)[i]);
+ break;
+
+ case ACPI_RSC_MOVE32:
+ ACPI_MOVE_32_TO_32 (&ACPI_CAST_PTR (UINT32, Destination)[i],
+ &ACPI_CAST_PTR (UINT32, Source)[i]);
+ break;
+
+ case ACPI_RSC_MOVE64:
+ ACPI_MOVE_64_TO_64 (&ACPI_CAST_PTR (UINT64, Destination)[i],
+ &ACPI_CAST_PTR (UINT64, Source)[i]);
+ break;
+
+ default:
+ return;
+ }
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsSetResourceLength
+ *
+ * PARAMETERS: TotalLength - Length of the AML descriptor, including
+ * the header and length fields.
+ * Aml - Pointer to the raw AML descriptor
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Set the ResourceLength field of an AML
+ * resource descriptor, both Large and Small descriptors are
+ * supported automatically. Note: Descriptor Type field must
+ * be valid.
+ *
+ ******************************************************************************/
+
+void
+AcpiRsSetResourceLength (
+ ACPI_RSDESC_SIZE TotalLength,
+ AML_RESOURCE *Aml)
+{
+ ACPI_RS_LENGTH ResourceLength;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Length is the total descriptor length minus the header length */
+
+ ResourceLength = (ACPI_RS_LENGTH)
+ (TotalLength - AcpiUtGetResourceHeaderLength (Aml));
+
+ /* Length is stored differently for large and small descriptors */
+
+ if (Aml->SmallHeader.DescriptorType & ACPI_RESOURCE_NAME_LARGE)
+ {
+ /* Large descriptor -- bytes 1-2 contain the 16-bit length */
+
+ ACPI_MOVE_16_TO_16 (&Aml->LargeHeader.ResourceLength, &ResourceLength);
+ }
+ else
+ {
+ /* Small descriptor -- bits 2:0 of byte 0 contain the length */
+
+ Aml->SmallHeader.DescriptorType = (UINT8)
+
+ /* Clear any existing length, preserving descriptor type bits */
+
+ ((Aml->SmallHeader.DescriptorType & ~ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK)
+
+ | ResourceLength);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsSetResourceHeader
+ *
+ * PARAMETERS: DescriptorType - Byte to be inserted as the type
+ * TotalLength - Length of the AML descriptor, including
+ * the header and length fields.
+ * Aml - Pointer to the raw AML descriptor
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Set the DescriptorType and ResourceLength fields of an AML
+ * resource descriptor, both Large and Small descriptors are
+ * supported automatically
+ *
+ ******************************************************************************/
+
+void
+AcpiRsSetResourceHeader (
+ UINT8 DescriptorType,
+ ACPI_RSDESC_SIZE TotalLength,
+ AML_RESOURCE *Aml)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Set the Resource Type */
+
+ Aml->SmallHeader.DescriptorType = DescriptorType;
+
+ /* Set the Resource Length */
+
+ AcpiRsSetResourceLength (TotalLength, Aml);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsStrcpy
+ *
+ * PARAMETERS: Destination - Pointer to the destination string
+ * Source - Pointer to the source string
+ *
+ * RETURN: String length, including NULL terminator
+ *
+ * DESCRIPTION: Local string copy that returns the string length, saving a
+ * strcpy followed by a strlen.
+ *
+ ******************************************************************************/
+
+static UINT16
+AcpiRsStrcpy (
+ char *Destination,
+ char *Source)
+{
+ UINT16 i;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ for (i = 0; Source[i]; i++)
+ {
+ Destination[i] = Source[i];
+ }
+
+ Destination[i] = 0;
+
+ /* Return string length including the NULL terminator */
+
+ return ((UINT16) (i + 1));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsGetResourceSource
+ *
+ * PARAMETERS: ResourceLength - Length field of the descriptor
+ * MinimumLength - Minimum length of the descriptor (minus
+ * any optional fields)
+ * ResourceSource - Where the ResourceSource is returned
+ * Aml - Pointer to the raw AML descriptor
+ * StringPtr - (optional) where to store the actual
+ * ResourceSource string
+ *
+ * RETURN: Length of the string plus NULL terminator, rounded up to native
+ * word boundary
+ *
+ * DESCRIPTION: Copy the optional ResourceSource data from a raw AML descriptor
+ * to an internal resource descriptor
+ *
+ ******************************************************************************/
+
+ACPI_RS_LENGTH
+AcpiRsGetResourceSource (
+ ACPI_RS_LENGTH ResourceLength,
+ ACPI_RS_LENGTH MinimumLength,
+ ACPI_RESOURCE_SOURCE *ResourceSource,
+ AML_RESOURCE *Aml,
+ char *StringPtr)
+{
+ ACPI_RSDESC_SIZE TotalLength;
+ UINT8 *AmlResourceSource;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ TotalLength = ResourceLength + sizeof (AML_RESOURCE_LARGE_HEADER);
+ AmlResourceSource = ACPI_ADD_PTR (UINT8, Aml, MinimumLength);
+
+ /*
+ * ResourceSource is present if the length of the descriptor is longer than
+ * the minimum length.
+ *
+ * Note: Some resource descriptors will have an additional null, so
+ * we add 1 to the minimum length.
+ */
+ if (TotalLength > (ACPI_RSDESC_SIZE) (MinimumLength + 1))
+ {
+ /* Get the ResourceSourceIndex */
+
+ ResourceSource->Index = AmlResourceSource[0];
+
+ ResourceSource->StringPtr = StringPtr;
+ if (!StringPtr)
+ {
+ /*
+ * String destination pointer is not specified; Set the String
+ * pointer to the end of the current ResourceSource structure.
+ */
+ ResourceSource->StringPtr = ACPI_ADD_PTR (char, ResourceSource,
+ sizeof (ACPI_RESOURCE_SOURCE));
+ }
+
+ /*
+ * In order for the Resource length to be a multiple of the native
+ * word, calculate the length of the string (+1 for NULL terminator)
+ * and expand to the next word multiple.
+ *
+ * Zero the entire area of the buffer.
+ */
+ TotalLength = (UINT32) ACPI_STRLEN (
+ ACPI_CAST_PTR (char, &AmlResourceSource[1])) + 1;
+ TotalLength = (UINT32) ACPI_ROUND_UP_TO_NATIVE_WORD (TotalLength);
+
+ ACPI_MEMSET (ResourceSource->StringPtr, 0, TotalLength);
+
+ /* Copy the ResourceSource string to the destination */
+
+ ResourceSource->StringLength = AcpiRsStrcpy (ResourceSource->StringPtr,
+ ACPI_CAST_PTR (char, &AmlResourceSource[1]));
+
+ return ((ACPI_RS_LENGTH) TotalLength);
+ }
+
+ /* ResourceSource is not present */
+
+ ResourceSource->Index = 0;
+ ResourceSource->StringLength = 0;
+ ResourceSource->StringPtr = NULL;
+ return (0);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsSetResourceSource
+ *
+ * PARAMETERS: Aml - Pointer to the raw AML descriptor
+ * MinimumLength - Minimum length of the descriptor (minus
+ * any optional fields)
+ * ResourceSource - Internal ResourceSource
+
+ *
+ * RETURN: Total length of the AML descriptor
+ *
+ * DESCRIPTION: Convert an optional ResourceSource from internal format to a
+ * raw AML resource descriptor
+ *
+ ******************************************************************************/
+
+ACPI_RSDESC_SIZE
+AcpiRsSetResourceSource (
+ AML_RESOURCE *Aml,
+ ACPI_RS_LENGTH MinimumLength,
+ ACPI_RESOURCE_SOURCE *ResourceSource)
+{
+ UINT8 *AmlResourceSource;
+ ACPI_RSDESC_SIZE DescriptorLength;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ DescriptorLength = MinimumLength;
+
+ /* Non-zero string length indicates presence of a ResourceSource */
+
+ if (ResourceSource->StringLength)
+ {
+ /* Point to the end of the AML descriptor */
+
+ AmlResourceSource = ACPI_ADD_PTR (UINT8, Aml, MinimumLength);
+
+ /* Copy the ResourceSourceIndex */
+
+ AmlResourceSource[0] = (UINT8) ResourceSource->Index;
+
+ /* Copy the ResourceSource string */
+
+ ACPI_STRCPY (ACPI_CAST_PTR (char, &AmlResourceSource[1]),
+ ResourceSource->StringPtr);
+
+ /*
+ * Add the length of the string (+ 1 for null terminator) to the
+ * final descriptor length
+ */
+ DescriptorLength += ((ACPI_RSDESC_SIZE) ResourceSource->StringLength + 1);
+ }
+
+ /* Return the new total length of the AML descriptor */
+
+ return (DescriptorLength);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsGetPrtMethodData
+ *
+ * PARAMETERS: Node - Device node
+ * RetBuffer - Pointer to a buffer structure for the
+ * results
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to get the _PRT value of an object
+ * contained in an object specified by the handle passed in
+ *
+ * If the function fails an appropriate status will be returned
+ * and the contents of the callers buffer is undefined.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsGetPrtMethodData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_BUFFER *RetBuffer)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (RsGetPrtMethodData);
+
+
+ /* Parameters guaranteed valid by caller */
+
+ /* Execute the method, no parameters */
+
+ Status = AcpiUtEvaluateObject (Node, METHOD_NAME__PRT,
+ ACPI_BTYPE_PACKAGE, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Create a resource linked list from the byte stream buffer that comes
+ * back from the _CRS method execution.
+ */
+ Status = AcpiRsCreatePciRoutingTable (ObjDesc, RetBuffer);
+
+ /* On exit, we must delete the object returned by EvaluateObject */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsGetCrsMethodData
+ *
+ * PARAMETERS: Node - Device node
+ * RetBuffer - Pointer to a buffer structure for the
+ * results
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to get the _CRS value of an object
+ * contained in an object specified by the handle passed in
+ *
+ * If the function fails an appropriate status will be returned
+ * and the contents of the callers buffer is undefined.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsGetCrsMethodData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_BUFFER *RetBuffer)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (RsGetCrsMethodData);
+
+
+ /* Parameters guaranteed valid by caller */
+
+ /* Execute the method, no parameters */
+
+ Status = AcpiUtEvaluateObject (Node, METHOD_NAME__CRS,
+ ACPI_BTYPE_BUFFER, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Make the call to create a resource linked list from the
+ * byte stream buffer that comes back from the _CRS method
+ * execution.
+ */
+ Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer);
+
+ /* On exit, we must delete the object returned by evaluateObject */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsGetPrsMethodData
+ *
+ * PARAMETERS: Node - Device node
+ * RetBuffer - Pointer to a buffer structure for the
+ * results
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to get the _PRS value of an object
+ * contained in an object specified by the handle passed in
+ *
+ * If the function fails an appropriate status will be returned
+ * and the contents of the callers buffer is undefined.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsGetPrsMethodData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_BUFFER *RetBuffer)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (RsGetPrsMethodData);
+
+
+ /* Parameters guaranteed valid by caller */
+
+ /* Execute the method, no parameters */
+
+ Status = AcpiUtEvaluateObject (Node, METHOD_NAME__PRS,
+ ACPI_BTYPE_BUFFER, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Make the call to create a resource linked list from the
+ * byte stream buffer that comes back from the _CRS method
+ * execution.
+ */
+ Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer);
+
+ /* On exit, we must delete the object returned by evaluateObject */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsGetMethodData
+ *
+ * PARAMETERS: Handle - Handle to the containing object
+ * Path - Path to method, relative to Handle
+ * RetBuffer - Pointer to a buffer structure for the
+ * results
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to get the _CRS or _PRS value of an
+ * object contained in an object specified by the handle passed in
+ *
+ * If the function fails an appropriate status will be returned
+ * and the contents of the callers buffer is undefined.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsGetMethodData (
+ ACPI_HANDLE Handle,
+ char *Path,
+ ACPI_BUFFER *RetBuffer)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (RsGetMethodData);
+
+
+ /* Parameters guaranteed valid by caller */
+
+ /* Execute the method, no parameters */
+
+ Status = AcpiUtEvaluateObject (Handle, Path, ACPI_BTYPE_BUFFER, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Make the call to create a resource linked list from the
+ * byte stream buffer that comes back from the method
+ * execution.
+ */
+ Status = AcpiRsCreateResourceList (ObjDesc, RetBuffer);
+
+ /* On exit, we must delete the object returned by EvaluateObject */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsSetSrsMethodData
+ *
+ * PARAMETERS: Node - Device node
+ * InBuffer - Pointer to a buffer structure of the
+ * parameter
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to set the _SRS of an object contained
+ * in an object specified by the handle passed in
+ *
+ * If the function fails an appropriate status will be returned
+ * and the contents of the callers buffer is undefined.
+ *
+ * Note: Parameters guaranteed valid by caller
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiRsSetSrsMethodData (
+ ACPI_NAMESPACE_NODE *Node,
+ ACPI_BUFFER *InBuffer)
+{
+ ACPI_EVALUATE_INFO *Info;
+ ACPI_OPERAND_OBJECT *Args[2];
+ ACPI_STATUS Status;
+ ACPI_BUFFER Buffer;
+
+
+ ACPI_FUNCTION_TRACE (RsSetSrsMethodData);
+
+
+ /* Allocate and initialize the evaluation information block */
+
+ Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
+ if (!Info)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Info->PrefixNode = Node;
+ Info->Pathname = METHOD_NAME__SRS;
+ Info->Parameters = Args;
+ Info->ParameterType = ACPI_PARAM_ARGS;
+ Info->Flags = ACPI_IGNORE_RETURN_VALUE;
+
+ /*
+ * The InBuffer parameter will point to a linked list of
+ * resource parameters. It needs to be formatted into a
+ * byte stream to be sent in as an input parameter to _SRS
+ *
+ * Convert the linked list into a byte stream
+ */
+ Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ Status = AcpiRsCreateAmlResources (InBuffer->Pointer, &Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Cleanup;
+ }
+
+ /* Create and initialize the method parameter object */
+
+ Args[0] = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER);
+ if (!Args[0])
+ {
+ /*
+ * Must free the buffer allocated above (otherwise it is freed
+ * later)
+ */
+ ACPI_FREE (Buffer.Pointer);
+ Status = AE_NO_MEMORY;
+ goto Cleanup;
+ }
+
+ Args[0]->Buffer.Length = (UINT32) Buffer.Length;
+ Args[0]->Buffer.Pointer = Buffer.Pointer;
+ Args[0]->Common.Flags = AOPOBJ_DATA_VALID;
+ Args[1] = NULL;
+
+ /* Execute the method, no return value is expected */
+
+ Status = AcpiNsEvaluate (Info);
+
+ /* Clean up and return the status from AcpiNsEvaluate */
+
+ AcpiUtRemoveReference (Args[0]);
+
+Cleanup:
+ ACPI_FREE (Info);
+ return_ACPI_STATUS (Status);
+}
+
diff --git a/sys/contrib/dev/acpica/rsxface.c b/sys/contrib/dev/acpica/rsxface.c
new file mode 100644
index 0000000..a27331e
--- /dev/null
+++ b/sys/contrib/dev/acpica/rsxface.c
@@ -0,0 +1,713 @@
+/*******************************************************************************
+ *
+ * Module Name: rsxface - Public interfaces to the resource manager
+ * $Revision: 1.48 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __RSXFACE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acresrc.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+#define _COMPONENT ACPI_RESOURCES
+ ACPI_MODULE_NAME ("rsxface")
+
+/* Local macros for 16,32-bit to 64-bit conversion */
+
+#define ACPI_COPY_FIELD(Out, In, Field) ((Out)->Field = (In)->Field)
+#define ACPI_COPY_ADDRESS(Out, In) \
+ ACPI_COPY_FIELD(Out, In, ResourceType); \
+ ACPI_COPY_FIELD(Out, In, ProducerConsumer); \
+ ACPI_COPY_FIELD(Out, In, Decode); \
+ ACPI_COPY_FIELD(Out, In, MinAddressFixed); \
+ ACPI_COPY_FIELD(Out, In, MaxAddressFixed); \
+ ACPI_COPY_FIELD(Out, In, Info); \
+ ACPI_COPY_FIELD(Out, In, Granularity); \
+ ACPI_COPY_FIELD(Out, In, Minimum); \
+ ACPI_COPY_FIELD(Out, In, Maximum); \
+ ACPI_COPY_FIELD(Out, In, TranslationOffset); \
+ ACPI_COPY_FIELD(Out, In, AddressLength); \
+ ACPI_COPY_FIELD(Out, In, ResourceSource);
+
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiRsMatchVendorResource (
+ ACPI_RESOURCE *Resource,
+ void *Context);
+
+static ACPI_STATUS
+AcpiRsValidateParameters (
+ ACPI_HANDLE DeviceHandle,
+ ACPI_BUFFER *Buffer,
+ ACPI_NAMESPACE_NODE **ReturnNode);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsValidateParameters
+ *
+ * PARAMETERS: DeviceHandle - Handle to a device
+ * Buffer - Pointer to a data buffer
+ * ReturnNode - Pointer to where the device node is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Common parameter validation for resource interfaces
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiRsValidateParameters (
+ ACPI_HANDLE DeviceHandle,
+ ACPI_BUFFER *Buffer,
+ ACPI_NAMESPACE_NODE **ReturnNode)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ACPI_FUNCTION_TRACE (RsValidateParameters);
+
+
+ /*
+ * Must have a valid handle to an ACPI device
+ */
+ if (!DeviceHandle)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ Node = AcpiNsMapHandleToNode (DeviceHandle);
+ if (!Node)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if (Node->Type != ACPI_TYPE_DEVICE)
+ {
+ return_ACPI_STATUS (AE_TYPE);
+ }
+
+ /*
+ * Validate the user buffer object
+ *
+ * if there is a non-zero buffer length we also need a valid pointer in
+ * the buffer. If it's a zero buffer length, we'll be returning the
+ * needed buffer size (later), so keep going.
+ */
+ Status = AcpiUtValidateBuffer (Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ *ReturnNode = Node;
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetIrqRoutingTable
+ *
+ * PARAMETERS: DeviceHandle - Handle to the Bus device we are querying
+ * RetBuffer - Pointer to a buffer to receive the
+ * current resources for the device
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to get the IRQ routing table for a
+ * specific bus. The caller must first acquire a handle for the
+ * desired bus. The routine table is placed in the buffer pointed
+ * to by the RetBuffer variable parameter.
+ *
+ * If the function fails an appropriate status will be returned
+ * and the value of RetBuffer is undefined.
+ *
+ * This function attempts to execute the _PRT method contained in
+ * the object indicated by the passed DeviceHandle.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetIrqRoutingTable (
+ ACPI_HANDLE DeviceHandle,
+ ACPI_BUFFER *RetBuffer)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetIrqRoutingTable);
+
+
+ /* Validate parameters then dispatch to internal routine */
+
+ Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiRsGetPrtMethodData (Node, RetBuffer);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetIrqRoutingTable)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetCurrentResources
+ *
+ * PARAMETERS: DeviceHandle - Handle to the device object for the
+ * device we are querying
+ * RetBuffer - Pointer to a buffer to receive the
+ * current resources for the device
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to get the current resources for a
+ * specific device. The caller must first acquire a handle for
+ * the desired device. The resource data is placed in the buffer
+ * pointed to by the RetBuffer variable parameter.
+ *
+ * If the function fails an appropriate status will be returned
+ * and the value of RetBuffer is undefined.
+ *
+ * This function attempts to execute the _CRS method contained in
+ * the object indicated by the passed DeviceHandle.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetCurrentResources (
+ ACPI_HANDLE DeviceHandle,
+ ACPI_BUFFER *RetBuffer)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetCurrentResources);
+
+
+ /* Validate parameters then dispatch to internal routine */
+
+ Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiRsGetCrsMethodData (Node, RetBuffer);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetCurrentResources)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetPossibleResources
+ *
+ * PARAMETERS: DeviceHandle - Handle to the device object for the
+ * device we are querying
+ * RetBuffer - Pointer to a buffer to receive the
+ * resources for the device
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to get a list of the possible resources
+ * for a specific device. The caller must first acquire a handle
+ * for the desired device. The resource data is placed in the
+ * buffer pointed to by the RetBuffer variable.
+ *
+ * If the function fails an appropriate status will be returned
+ * and the value of RetBuffer is undefined.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetPossibleResources (
+ ACPI_HANDLE DeviceHandle,
+ ACPI_BUFFER *RetBuffer)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetPossibleResources);
+
+
+ /* Validate parameters then dispatch to internal routine */
+
+ Status = AcpiRsValidateParameters (DeviceHandle, RetBuffer, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiRsGetPrsMethodData (Node, RetBuffer);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetPossibleResources)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiSetCurrentResources
+ *
+ * PARAMETERS: DeviceHandle - Handle to the device object for the
+ * device we are setting resources
+ * InBuffer - Pointer to a buffer containing the
+ * resources to be set for the device
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to set the current resources for a
+ * specific device. The caller must first acquire a handle for
+ * the desired device. The resource data is passed to the routine
+ * the buffer pointed to by the InBuffer variable.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiSetCurrentResources (
+ ACPI_HANDLE DeviceHandle,
+ ACPI_BUFFER *InBuffer)
+{
+ ACPI_STATUS Status;
+ ACPI_NAMESPACE_NODE *Node;
+
+
+ ACPI_FUNCTION_TRACE (AcpiSetCurrentResources);
+
+
+ /* Validate the buffer, don't allow zero length */
+
+ if ((!InBuffer) ||
+ (!InBuffer->Pointer) ||
+ (!InBuffer->Length))
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Validate parameters then dispatch to internal routine */
+
+ Status = AcpiRsValidateParameters (DeviceHandle, InBuffer, &Node);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiRsSetSrsMethodData (Node, InBuffer);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiSetCurrentResources)
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiResourceToAddress64
+ *
+ * PARAMETERS: Resource - Pointer to a resource
+ * Out - Pointer to the users's return buffer
+ * (a struct acpi_resource_address64)
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: If the resource is an address16, address32, or address64,
+ * copy it to the address64 return buffer. This saves the
+ * caller from having to duplicate code for different-sized
+ * addresses.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiResourceToAddress64 (
+ ACPI_RESOURCE *Resource,
+ ACPI_RESOURCE_ADDRESS64 *Out)
+{
+ ACPI_RESOURCE_ADDRESS16 *Address16;
+ ACPI_RESOURCE_ADDRESS32 *Address32;
+
+
+ if (!Resource || !Out)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Convert 16 or 32 address descriptor to 64 */
+
+ switch (Resource->Type)
+ {
+ case ACPI_RESOURCE_TYPE_ADDRESS16:
+
+ Address16 = (ACPI_RESOURCE_ADDRESS16 *) &Resource->Data;
+ ACPI_COPY_ADDRESS (Out, Address16);
+ break;
+
+ case ACPI_RESOURCE_TYPE_ADDRESS32:
+
+ Address32 = (ACPI_RESOURCE_ADDRESS32 *) &Resource->Data;
+ ACPI_COPY_ADDRESS (Out, Address32);
+ break;
+
+ case ACPI_RESOURCE_TYPE_ADDRESS64:
+
+ /* Simple copy for 64 bit source */
+
+ ACPI_MEMCPY (Out, &Resource->Data, sizeof (ACPI_RESOURCE_ADDRESS64));
+ break;
+
+ default:
+ return (AE_BAD_PARAMETER);
+ }
+
+ return (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiResourceToAddress64)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetVendorResource
+ *
+ * PARAMETERS: DeviceHandle - Handle for the parent device object
+ * Name - Method name for the parent resource
+ * (METHOD_NAME__CRS or METHOD_NAME__PRS)
+ * Uuid - Pointer to the UUID to be matched.
+ * includes both subtype and 16-byte UUID
+ * RetBuffer - Where the vendor resource is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Walk a resource template for the specified evice to find a
+ * vendor-defined resource that matches the supplied UUID and
+ * UUID subtype. Returns a ACPI_RESOURCE of type Vendor.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetVendorResource (
+ ACPI_HANDLE DeviceHandle,
+ char *Name,
+ ACPI_VENDOR_UUID *Uuid,
+ ACPI_BUFFER *RetBuffer)
+{
+ ACPI_VENDOR_WALK_INFO Info;
+ ACPI_STATUS Status;
+
+
+ /* Other parameters are validated by AcpiWalkResources */
+
+ if (!Uuid || !RetBuffer)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ Info.Uuid = Uuid;
+ Info.Buffer = RetBuffer;
+ Info.Status = AE_NOT_EXIST;
+
+ /* Walk the _CRS or _PRS resource list for this device */
+
+ Status = AcpiWalkResources (DeviceHandle, Name, AcpiRsMatchVendorResource,
+ &Info);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ return (Info.Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetVendorResource)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiRsMatchVendorResource
+ *
+ * PARAMETERS: ACPI_WALK_RESOURCE_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Match a vendor resource via the ACPI 3.0 UUID
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiRsMatchVendorResource (
+ ACPI_RESOURCE *Resource,
+ void *Context)
+{
+ ACPI_VENDOR_WALK_INFO *Info = Context;
+ ACPI_RESOURCE_VENDOR_TYPED *Vendor;
+ ACPI_BUFFER *Buffer;
+ ACPI_STATUS Status;
+
+
+ /* Ignore all descriptors except Vendor */
+
+ if (Resource->Type != ACPI_RESOURCE_TYPE_VENDOR)
+ {
+ return (AE_OK);
+ }
+
+ Vendor = &Resource->Data.VendorTyped;
+
+ /*
+ * For a valid match, these conditions must hold:
+ *
+ * 1) Length of descriptor data must be at least as long as a UUID struct
+ * 2) The UUID subtypes must match
+ * 3) The UUID data must match
+ */
+ if ((Vendor->ByteLength < (ACPI_UUID_LENGTH + 1)) ||
+ (Vendor->UuidSubtype != Info->Uuid->Subtype) ||
+ (ACPI_MEMCMP (Vendor->Uuid, Info->Uuid->Data, ACPI_UUID_LENGTH)))
+ {
+ return (AE_OK);
+ }
+
+ /* Validate/Allocate/Clear caller buffer */
+
+ Buffer = Info->Buffer;
+ Status = AcpiUtInitializeBuffer (Buffer, Resource->Length);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Found the correct resource, copy and return it */
+
+ ACPI_MEMCPY (Buffer->Pointer, Resource, Resource->Length);
+ Buffer->Length = Resource->Length;
+
+ /* Found the desired descriptor, terminate resource walk */
+
+ Info->Status = AE_OK;
+ return (AE_CTRL_TERMINATE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiWalkResources
+ *
+ * PARAMETERS: DeviceHandle - Handle to the device object for the
+ * device we are querying
+ * Name - Method name of the resources we want
+ * (METHOD_NAME__CRS or METHOD_NAME__PRS)
+ * UserFunction - Called for each resource
+ * Context - Passed to UserFunction
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Retrieves the current or possible resource list for the
+ * specified device. The UserFunction is called once for
+ * each resource in the list.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiWalkResources (
+ ACPI_HANDLE DeviceHandle,
+ char *Name,
+ ACPI_WALK_RESOURCE_CALLBACK UserFunction,
+ void *Context)
+{
+ ACPI_STATUS Status;
+ ACPI_BUFFER Buffer;
+ ACPI_RESOURCE *Resource;
+ ACPI_RESOURCE *ResourceEnd;
+
+
+ ACPI_FUNCTION_TRACE (AcpiWalkResources);
+
+
+ /* Parameter validation */
+
+ if (!DeviceHandle || !UserFunction || !Name ||
+ (!ACPI_COMPARE_NAME (Name, METHOD_NAME__CRS) &&
+ !ACPI_COMPARE_NAME (Name, METHOD_NAME__PRS)))
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ /* Get the _CRS or _PRS resource list */
+
+ Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ Status = AcpiRsGetMethodData (DeviceHandle, Name, &Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Buffer now contains the resource list */
+
+ Resource = ACPI_CAST_PTR (ACPI_RESOURCE, Buffer.Pointer);
+ ResourceEnd = ACPI_ADD_PTR (ACPI_RESOURCE, Buffer.Pointer, Buffer.Length);
+
+ /* Walk the resource list until the EndTag is found (or buffer end) */
+
+ while (Resource < ResourceEnd)
+ {
+ /* Sanity check the resource */
+
+ if (Resource->Type > ACPI_RESOURCE_TYPE_MAX)
+ {
+ Status = AE_AML_INVALID_RESOURCE_TYPE;
+ break;
+ }
+
+ /* Invoke the user function, abort on any error returned */
+
+ Status = UserFunction (Resource, Context);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_CTRL_TERMINATE)
+ {
+ /* This is an OK termination by the user function */
+
+ Status = AE_OK;
+ }
+ break;
+ }
+
+ /* EndTag indicates end-of-list */
+
+ if (Resource->Type == ACPI_RESOURCE_TYPE_END_TAG)
+ {
+ break;
+ }
+
+ /* Get the next resource descriptor */
+
+ Resource = ACPI_ADD_PTR (ACPI_RESOURCE, Resource, Resource->Length);
+ }
+
+ ACPI_FREE (Buffer.Pointer);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiWalkResources)
diff --git a/sys/contrib/dev/acpica/tbfadt.c b/sys/contrib/dev/acpica/tbfadt.c
new file mode 100644
index 0000000..554e464
--- /dev/null
+++ b/sys/contrib/dev/acpica/tbfadt.c
@@ -0,0 +1,520 @@
+/******************************************************************************
+ *
+ * Module Name: tbfadt - FADT table utilities
+ * $Revision: 1.5 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __TBFADT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/actables.h>
+
+#define _COMPONENT ACPI_TABLES
+ ACPI_MODULE_NAME ("tbfadt")
+
+/* Local prototypes */
+
+static void inline
+AcpiTbInitGenericAddress (
+ ACPI_GENERIC_ADDRESS *GenericAddress,
+ UINT8 BitWidth,
+ UINT64 Address);
+
+static void
+AcpiTbConvertFadt (
+ void);
+
+static void
+AcpiTbValidateFadt (
+ void);
+
+
+/* Table for conversion of FADT to common internal format and FADT validation */
+
+typedef struct acpi_fadt_info
+{
+ char *Name;
+ UINT8 Target;
+ UINT8 Source;
+ UINT8 Length;
+ UINT8 Type;
+
+} ACPI_FADT_INFO;
+
+#define ACPI_FADT_REQUIRED 1
+#define ACPI_FADT_SEPARATE_LENGTH 2
+
+static ACPI_FADT_INFO FadtInfoTable[] =
+{
+ {"Pm1aEventBlock", ACPI_FADT_OFFSET (XPm1aEventBlock),
+ ACPI_FADT_OFFSET (Pm1aEventBlock),
+ ACPI_FADT_OFFSET (Pm1EventLength), ACPI_FADT_REQUIRED},
+
+ {"Pm1bEventBlock", ACPI_FADT_OFFSET (XPm1bEventBlock),
+ ACPI_FADT_OFFSET (Pm1bEventBlock),
+ ACPI_FADT_OFFSET (Pm1EventLength), 0},
+
+ {"Pm1aControlBlock", ACPI_FADT_OFFSET (XPm1aControlBlock),
+ ACPI_FADT_OFFSET (Pm1aControlBlock),
+ ACPI_FADT_OFFSET (Pm1ControlLength), ACPI_FADT_REQUIRED},
+
+ {"Pm1bControlBlock", ACPI_FADT_OFFSET (XPm1bControlBlock),
+ ACPI_FADT_OFFSET (Pm1bControlBlock),
+ ACPI_FADT_OFFSET (Pm1ControlLength), 0},
+
+ {"Pm2ControlBlock", ACPI_FADT_OFFSET (XPm2ControlBlock),
+ ACPI_FADT_OFFSET (Pm2ControlBlock),
+ ACPI_FADT_OFFSET (Pm2ControlLength), ACPI_FADT_SEPARATE_LENGTH},
+
+ {"PmTimerBlock", ACPI_FADT_OFFSET (XPmTimerBlock),
+ ACPI_FADT_OFFSET (PmTimerBlock),
+ ACPI_FADT_OFFSET (PmTimerLength), ACPI_FADT_REQUIRED},
+
+ {"Gpe0Block", ACPI_FADT_OFFSET (XGpe0Block),
+ ACPI_FADT_OFFSET (Gpe0Block),
+ ACPI_FADT_OFFSET (Gpe0BlockLength), ACPI_FADT_SEPARATE_LENGTH},
+
+ {"Gpe1Block", ACPI_FADT_OFFSET (XGpe1Block),
+ ACPI_FADT_OFFSET (Gpe1Block),
+ ACPI_FADT_OFFSET (Gpe1BlockLength), ACPI_FADT_SEPARATE_LENGTH}
+};
+
+#define ACPI_FADT_INFO_ENTRIES (sizeof (FadtInfoTable) / sizeof (ACPI_FADT_INFO))
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbInitGenericAddress
+ *
+ * PARAMETERS: GenericAddress - GAS struct to be initialized
+ * BitWidth - Width of this register
+ * Address - Address of the register
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Initialize a Generic Address Structure (GAS)
+ * See the ACPI specification for a full description and
+ * definition of this structure.
+ *
+ ******************************************************************************/
+
+static void inline
+AcpiTbInitGenericAddress (
+ ACPI_GENERIC_ADDRESS *GenericAddress,
+ UINT8 BitWidth,
+ UINT64 Address)
+{
+
+ /*
+ * The 64-bit Address field is non-aligned in the byte packed
+ * GAS struct.
+ */
+ ACPI_MOVE_64_TO_64 (&GenericAddress->Address, &Address);
+
+ /* All other fields are byte-wide */
+
+ GenericAddress->SpaceId = ACPI_ADR_SPACE_SYSTEM_IO;
+ GenericAddress->BitWidth = BitWidth;
+ GenericAddress->BitOffset = 0;
+ GenericAddress->AccessWidth = 0;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbParseFadt
+ *
+ * PARAMETERS: TableIndex - Index for the FADT
+ * Flags - Flags
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Initialize the FADT, DSDT and FACS tables
+ * (FADT contains the addresses of the DSDT and FACS)
+ *
+ ******************************************************************************/
+
+void
+AcpiTbParseFadt (
+ ACPI_NATIVE_UINT TableIndex,
+ UINT8 Flags)
+{
+ UINT32 Length;
+ ACPI_TABLE_HEADER *Table;
+
+
+ /*
+ * The FADT has multiple versions with different lengths,
+ * and it contains pointers to both the DSDT and FACS tables.
+ *
+ * Get a local copy of the FADT and convert it to a common format
+ * Map entire FADT, assumed to be smaller than one page.
+ */
+ Length = AcpiGbl_RootTableList.Tables[TableIndex].Length;
+
+ Table = AcpiOsMapMemory (
+ AcpiGbl_RootTableList.Tables[TableIndex].Address, Length);
+ if (!Table)
+ {
+ return;
+ }
+
+ /*
+ * Validate the FADT checksum before we copy the table. Ignore
+ * checksum error as we want to try to get the DSDT and FACS.
+ */
+ (void) AcpiTbVerifyChecksum (Table, Length);
+
+ /* Obtain a local copy of the FADT in common ACPI 2.0+ format */
+
+ AcpiTbCreateLocalFadt (Table, Length);
+
+ /* All done with the real FADT, unmap it */
+
+ AcpiOsUnmapMemory (Table, Length);
+
+ /* Obtain the DSDT and FACS tables via their addresses within the FADT */
+
+ AcpiTbInstallTable ((ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.XDsdt,
+ Flags, ACPI_SIG_DSDT, ACPI_TABLE_INDEX_DSDT);
+
+ AcpiTbInstallTable ((ACPI_PHYSICAL_ADDRESS) AcpiGbl_FADT.XFacs,
+ Flags, ACPI_SIG_FACS, ACPI_TABLE_INDEX_FACS);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbCreateLocalFadt
+ *
+ * PARAMETERS: Table - Pointer to BIOS FADT
+ * Length - Length of the table
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Get a local copy of the FADT and convert it to a common format.
+ * Performs validation on some important FADT fields.
+ *
+ ******************************************************************************/
+
+void
+AcpiTbCreateLocalFadt (
+ ACPI_TABLE_HEADER *Table,
+ UINT32 Length)
+{
+
+ /*
+ * Check if the FADT is larger than what we know about (ACPI 2.0 version).
+ * Truncate the table, but make some noise.
+ */
+ if (Length > sizeof (ACPI_TABLE_FADT))
+ {
+ ACPI_WARNING ((AE_INFO,
+ "FADT (revision %u) is longer than ACPI 2.0 version, truncating length 0x%X to 0x%zX",
+ Table->Revision, Length, sizeof (ACPI_TABLE_FADT)));
+ }
+
+ /* Copy the entire FADT locally. Zero first for TbConvertFadt */
+
+ ACPI_MEMSET (&AcpiGbl_FADT, 0, sizeof (ACPI_TABLE_FADT));
+
+ ACPI_MEMCPY (&AcpiGbl_FADT, Table,
+ ACPI_MIN (Length, sizeof (ACPI_TABLE_FADT)));
+
+ /*
+ * 1) Convert the local copy of the FADT to the common internal format
+ * 2) Validate some of the important values within the FADT
+ */
+ AcpiTbConvertFadt ();
+ AcpiTbValidateFadt ();
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbConvertFadt
+ *
+ * PARAMETERS: None, uses AcpiGbl_FADT
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Converts all versions of the FADT to a common internal format.
+ * -> Expand all 32-bit addresses to 64-bit.
+ *
+ * NOTE: AcpiGbl_FADT must be of size (ACPI_TABLE_FADT),
+ * and must contain a copy of the actual FADT.
+ *
+ * ACPICA will use the "X" fields of the FADT for all addresses.
+ *
+ * "X" fields are optional extensions to the original V1.0 fields. Even if
+ * they are present in the structure, they can be optionally not used by
+ * setting them to zero. Therefore, we must selectively expand V1.0 fields
+ * if the corresponding X field is zero.
+ *
+ * For ACPI 1.0 FADTs, all address fields are expanded to the corresponding
+ * "X" fields.
+ *
+ * For ACPI 2.0 FADTs, any "X" fields that are NULL are filled in by
+ * expanding the corresponding ACPI 1.0 field.
+ *
+ ******************************************************************************/
+
+static void
+AcpiTbConvertFadt (
+ void)
+{
+ UINT8 Pm1RegisterLength;
+ ACPI_GENERIC_ADDRESS *Target;
+ ACPI_NATIVE_UINT i;
+
+
+ /* Update the local FADT table header length */
+
+ AcpiGbl_FADT.Header.Length = sizeof (ACPI_TABLE_FADT);
+
+ /* Expand the 32-bit FACS and DSDT addresses to 64-bit as necessary */
+
+ if (!AcpiGbl_FADT.XFacs)
+ {
+ AcpiGbl_FADT.XFacs = (UINT64) AcpiGbl_FADT.Facs;
+ }
+
+ if (!AcpiGbl_FADT.XDsdt)
+ {
+ AcpiGbl_FADT.XDsdt = (UINT64) AcpiGbl_FADT.Dsdt;
+ }
+
+ /*
+ * Expand the 32-bit V1.0 addresses to the 64-bit "X" generic address
+ * structures as necessary.
+ */
+ for (i = 0; i < ACPI_FADT_INFO_ENTRIES; i++)
+ {
+ Target = ACPI_ADD_PTR (
+ ACPI_GENERIC_ADDRESS, &AcpiGbl_FADT, FadtInfoTable[i].Target);
+
+ /* Expand only if the X target is null */
+
+ if (!Target->Address)
+ {
+ AcpiTbInitGenericAddress (Target,
+ *ACPI_ADD_PTR (UINT8, &AcpiGbl_FADT, FadtInfoTable[i].Length),
+ (UINT64) *ACPI_ADD_PTR (UINT32, &AcpiGbl_FADT, FadtInfoTable[i].Source));
+ }
+ }
+
+ /*
+ * Calculate separate GAS structs for the PM1 Enable registers.
+ * These addresses do not appear (directly) in the FADT, so it is
+ * useful to calculate them once, here.
+ *
+ * The PM event blocks are split into two register blocks, first is the
+ * PM Status Register block, followed immediately by the PM Enable Register
+ * block. Each is of length (Pm1EventLength/2)
+ */
+ Pm1RegisterLength = (UINT8) ACPI_DIV_2 (AcpiGbl_FADT.Pm1EventLength);
+
+ /* The PM1A register block is required */
+
+ AcpiTbInitGenericAddress (&AcpiGbl_XPm1aEnable, Pm1RegisterLength,
+ (AcpiGbl_FADT.XPm1aEventBlock.Address + Pm1RegisterLength));
+
+ /* The PM1B register block is optional, ignore if not present */
+
+ if (AcpiGbl_FADT.XPm1bEventBlock.Address)
+ {
+ AcpiTbInitGenericAddress (&AcpiGbl_XPm1bEnable, Pm1RegisterLength,
+ (AcpiGbl_FADT.XPm1bEventBlock.Address + Pm1RegisterLength));
+ }
+}
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiTbValidateFadt
+ *
+ * PARAMETERS: Table - Pointer to the FADT to be validated
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Validate various important fields within the FADT. If a problem
+ * is found, issue a message, but no status is returned.
+ * Used by both the table manager and the disassembler.
+ *
+ * Possible additional checks:
+ * (AcpiGbl_FADT.Pm1EventLength >= 4)
+ * (AcpiGbl_FADT.Pm1ControlLength >= 2)
+ * (AcpiGbl_FADT.PmTimerLength >= 4)
+ * Gpe block lengths must be multiple of 2
+ *
+ ******************************************************************************/
+
+static void
+AcpiTbValidateFadt (
+ void)
+{
+ UINT32 *Address32;
+ ACPI_GENERIC_ADDRESS *Address64;
+ UINT8 Length;
+ ACPI_NATIVE_UINT i;
+
+
+ /* Examine all of the 64-bit extended address fields (X fields) */
+
+ for (i = 0; i < ACPI_FADT_INFO_ENTRIES; i++)
+ {
+ /* Generate pointers to the 32-bit and 64-bit addresses and get the length */
+
+ Address64 = ACPI_ADD_PTR (ACPI_GENERIC_ADDRESS, &AcpiGbl_FADT, FadtInfoTable[i].Target);
+ Address32 = ACPI_ADD_PTR (UINT32, &AcpiGbl_FADT, FadtInfoTable[i].Source);
+ Length = *ACPI_ADD_PTR (UINT8, &AcpiGbl_FADT, FadtInfoTable[i].Length);
+
+ if (FadtInfoTable[i].Type & ACPI_FADT_REQUIRED)
+ {
+ /*
+ * Field is required (PM1aEvent, PM1aControl, PmTimer).
+ * Both the address and length must be non-zero.
+ */
+ if (!Address64->Address || !Length)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Required field \"%s\" has zero address and/or length: %8.8X%8.8X/%X",
+ FadtInfoTable[i].Name, ACPI_FORMAT_UINT64 (Address64->Address), Length));
+ }
+ }
+ else if (FadtInfoTable[i].Type & ACPI_FADT_SEPARATE_LENGTH)
+ {
+ /*
+ * Field is optional (PM2Control, GPE0, GPE1) AND has its own
+ * length field. If present, both the address and length must be valid.
+ */
+ if ((Address64->Address && !Length) || (!Address64->Address && Length))
+ {
+ ACPI_WARNING ((AE_INFO,
+ "Optional field \"%s\" has zero address or length: %8.8X%8.8X/%X",
+ FadtInfoTable[i].Name, ACPI_FORMAT_UINT64 (Address64->Address), Length));
+ }
+ }
+
+ /* If both 32- and 64-bit addresses are valid (non-zero), they must match */
+
+ if (Address64->Address && *Address32 &&
+ (Address64->Address != (UINT64) *Address32))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "32/64X address mismatch in \"%s\": [%8.8X] [%8.8X%8.8X], using 64X",
+ FadtInfoTable[i].Name, *Address32, ACPI_FORMAT_UINT64 (Address64->Address)));
+ }
+ }
+}
+
diff --git a/sys/contrib/dev/acpica/tbfind.c b/sys/contrib/dev/acpica/tbfind.c
new file mode 100644
index 0000000..be09293
--- /dev/null
+++ b/sys/contrib/dev/acpica/tbfind.c
@@ -0,0 +1,205 @@
+/******************************************************************************
+ *
+ * Module Name: tbfind - find table
+ * $Revision: 1.3 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __TBFIND_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/actables.h>
+
+#define _COMPONENT ACPI_TABLES
+ ACPI_MODULE_NAME ("tbfind")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbFindTable
+ *
+ * PARAMETERS: Signature - String with ACPI table signature
+ * OemId - String with the table OEM ID
+ * OemTableId - String with the OEM Table ID
+ * TableIndex - Where the table index is returned
+ *
+ * RETURN: Status and table index
+ *
+ * DESCRIPTION: Find an ACPI table (in the RSDT/XSDT) that matches the
+ * Signature, OEM ID and OEM Table ID. Returns an index that can
+ * be used to get the table header or entire table.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiTbFindTable (
+ char *Signature,
+ char *OemId,
+ char *OemTableId,
+ ACPI_NATIVE_UINT *TableIndex)
+{
+ ACPI_NATIVE_UINT i;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (TbFindTable);
+
+
+ for (i = 0; i < AcpiGbl_RootTableList.Count; ++i)
+ {
+ if (ACPI_MEMCMP (&(AcpiGbl_RootTableList.Tables[i].Signature),
+ Signature, ACPI_NAME_SIZE))
+ {
+ /* Not the requested table */
+
+ continue;
+ }
+
+ /* Table with matching signature has been found */
+
+ if (!AcpiGbl_RootTableList.Tables[i].Pointer)
+ {
+ /* Table is not currently mapped, map it */
+
+ Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[i]);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (!AcpiGbl_RootTableList.Tables[i].Pointer)
+ {
+ continue;
+ }
+ }
+
+ /* Check for table match on all IDs */
+
+ if (!ACPI_MEMCMP (AcpiGbl_RootTableList.Tables[i].Pointer->Signature,
+ Signature, ACPI_NAME_SIZE) &&
+ (!OemId[0] ||
+ !ACPI_MEMCMP (AcpiGbl_RootTableList.Tables[i].Pointer->OemId,
+ OemId, ACPI_OEM_ID_SIZE)) &&
+ (!OemTableId[0] ||
+ !ACPI_MEMCMP (AcpiGbl_RootTableList.Tables[i].Pointer->OemTableId,
+ OemTableId, ACPI_OEM_TABLE_ID_SIZE)))
+ {
+ *TableIndex = i;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_TABLES, "Found table [%4.4s]\n",
+ Signature));
+ return_ACPI_STATUS (AE_OK);
+ }
+ }
+
+ return_ACPI_STATUS (AE_NOT_FOUND);
+}
diff --git a/sys/contrib/dev/acpica/tbinstal.c b/sys/contrib/dev/acpica/tbinstal.c
new file mode 100644
index 0000000..fa71702
--- /dev/null
+++ b/sys/contrib/dev/acpica/tbinstal.c
@@ -0,0 +1,684 @@
+/******************************************************************************
+ *
+ * Module Name: tbinstal - ACPI table installation and removal
+ * $Revision: 1.91 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __TBINSTAL_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/actables.h>
+
+
+#define _COMPONENT ACPI_TABLES
+ ACPI_MODULE_NAME ("tbinstal")
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiTbVerifyTable
+ *
+ * PARAMETERS: TableDesc - table
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: this function is called to verify and map table
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiTbVerifyTable (
+ ACPI_TABLE_DESC *TableDesc)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (TbVerifyTable);
+
+
+ /* Map the table if necessary */
+
+ if (!TableDesc->Pointer)
+ {
+ if ((TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK) ==
+ ACPI_TABLE_ORIGIN_MAPPED)
+ {
+ TableDesc->Pointer = AcpiOsMapMemory (TableDesc->Address, TableDesc->Length);
+ }
+
+ if (!TableDesc->Pointer)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+ }
+
+ /* FACS is the odd table, has no standard ACPI header and no checksum */
+
+ if (!ACPI_COMPARE_NAME (&TableDesc->Signature, ACPI_SIG_FACS))
+ {
+ /* Always calculate checksum, ignore bad checksum if requested */
+
+ Status = AcpiTbVerifyChecksum (TableDesc->Pointer, TableDesc->Length);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbAddTable
+ *
+ * PARAMETERS: TableDesc - Table descriptor
+ * TableIndex - Where the table index is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to add the ACPI table
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiTbAddTable (
+ ACPI_TABLE_DESC *TableDesc,
+ ACPI_NATIVE_UINT *TableIndex)
+{
+ ACPI_NATIVE_UINT i;
+ ACPI_NATIVE_UINT Length;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (TbAddTable);
+
+
+ if (!TableDesc->Pointer)
+ {
+ Status = AcpiTbVerifyTable (TableDesc);
+ if (ACPI_FAILURE (Status) || !TableDesc->Pointer)
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* The table must be either an SSDT or a PSDT */
+
+ if ((!ACPI_COMPARE_NAME (TableDesc->Pointer->Signature, ACPI_SIG_PSDT)) &&
+ (!ACPI_COMPARE_NAME (TableDesc->Pointer->Signature, ACPI_SIG_SSDT)))
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Table has invalid signature [%4.4s], must be SSDT or PSDT",
+ TableDesc->Pointer->Signature));
+ return_ACPI_STATUS (AE_BAD_SIGNATURE);
+ }
+
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+
+ /* Check if table is already registered */
+
+ for (i = 0; i < AcpiGbl_RootTableList.Count; ++i)
+ {
+ if (!AcpiGbl_RootTableList.Tables[i].Pointer)
+ {
+ Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[i]);
+ if (ACPI_FAILURE (Status) || !AcpiGbl_RootTableList.Tables[i].Pointer)
+ {
+ continue;
+ }
+ }
+
+ Length = ACPI_MIN (TableDesc->Length,
+ AcpiGbl_RootTableList.Tables[i].Length);
+ if (ACPI_MEMCMP (TableDesc->Pointer,
+ AcpiGbl_RootTableList.Tables[i].Pointer, Length))
+ {
+ continue;
+ }
+
+ /* Table is already registered */
+
+ AcpiTbDeleteTable (TableDesc);
+ *TableIndex = i;
+ goto Release;
+ }
+
+ /*
+ * Add the table to the global table list
+ */
+ Status = AcpiTbStoreTable (TableDesc->Address, TableDesc->Pointer,
+ TableDesc->Length, TableDesc->Flags, TableIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ goto Release;
+ }
+
+ AcpiTbPrintTableHeader (TableDesc->Address, TableDesc->Pointer);
+
+Release:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbResizeRootTableList
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Expand the size of global table array
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiTbResizeRootTableList (
+ void)
+{
+ ACPI_TABLE_DESC *Tables;
+
+
+ ACPI_FUNCTION_TRACE (TbResizeRootTableList);
+
+
+ /* AllowResize flag is a parameter to AcpiInitializeTables */
+
+ if (!(AcpiGbl_RootTableList.Flags & ACPI_ROOT_ALLOW_RESIZE))
+ {
+ ACPI_ERROR ((AE_INFO, "Resize of Root Table Array is not allowed"));
+ return_ACPI_STATUS (AE_SUPPORT);
+ }
+
+ /* Increase the Table Array size */
+
+ Tables = ACPI_ALLOCATE_ZEROED (
+ (AcpiGbl_RootTableList.Size + ACPI_ROOT_TABLE_SIZE_INCREMENT)
+ * sizeof (ACPI_TABLE_DESC));
+ if (!Tables)
+ {
+ ACPI_ERROR ((AE_INFO, "Could not allocate new root table array"));
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Copy and free the previous table array */
+
+ if (AcpiGbl_RootTableList.Tables)
+ {
+ ACPI_MEMCPY (Tables, AcpiGbl_RootTableList.Tables,
+ AcpiGbl_RootTableList.Size * sizeof (ACPI_TABLE_DESC));
+
+ if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
+ {
+ ACPI_FREE (AcpiGbl_RootTableList.Tables);
+ }
+ }
+
+ AcpiGbl_RootTableList.Tables = Tables;
+ AcpiGbl_RootTableList.Size += ACPI_ROOT_TABLE_SIZE_INCREMENT;
+ AcpiGbl_RootTableList.Flags |= (UINT8) ACPI_ROOT_ORIGIN_ALLOCATED;
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbStoreTable
+ *
+ * PARAMETERS: Address - Table address
+ * Table - Table header
+ * Length - Table length
+ * Flags - flags
+ *
+ * RETURN: Status and table index.
+ *
+ * DESCRIPTION: Add an ACPI table to the global table list
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiTbStoreTable (
+ ACPI_PHYSICAL_ADDRESS Address,
+ ACPI_TABLE_HEADER *Table,
+ UINT32 Length,
+ UINT8 Flags,
+ ACPI_NATIVE_UINT *TableIndex)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ /* Ensure that there is room for the table in the Root Table List */
+
+ if (AcpiGbl_RootTableList.Count >= AcpiGbl_RootTableList.Size)
+ {
+ Status = AcpiTbResizeRootTableList();
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+
+ /* Initialize added table */
+
+ AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Address = Address;
+ AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Pointer = Table;
+ AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Length = Length;
+ AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].OwnerId = 0;
+ AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Flags = Flags;
+
+ ACPI_MOVE_32_TO_32 (
+ &(AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Signature),
+ Table->Signature);
+
+ *TableIndex = AcpiGbl_RootTableList.Count;
+ AcpiGbl_RootTableList.Count++;
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbDeleteTable
+ *
+ * PARAMETERS: TableIndex - Table index
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Delete one internal ACPI table
+ *
+ ******************************************************************************/
+
+void
+AcpiTbDeleteTable (
+ ACPI_TABLE_DESC *TableDesc)
+{
+
+ /* Table must be mapped or allocated */
+
+ if (!TableDesc->Pointer)
+ {
+ return;
+ }
+
+ switch (TableDesc->Flags & ACPI_TABLE_ORIGIN_MASK)
+ {
+ case ACPI_TABLE_ORIGIN_MAPPED:
+ AcpiOsUnmapMemory (TableDesc->Pointer, TableDesc->Length);
+ break;
+
+ case ACPI_TABLE_ORIGIN_ALLOCATED:
+ ACPI_FREE (TableDesc->Pointer);
+ break;
+
+ default:
+ break;
+ }
+
+ TableDesc->Pointer = NULL;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbTerminate
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Delete all internal ACPI tables
+ *
+ ******************************************************************************/
+
+void
+AcpiTbTerminate (
+ void)
+{
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_TRACE (TbTerminate);
+
+
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+
+ /* Delete the individual tables */
+
+ for (i = 0; i < AcpiGbl_RootTableList.Count; i++)
+ {
+ AcpiTbDeleteTable (&AcpiGbl_RootTableList.Tables[i]);
+ }
+
+ /*
+ * Delete the root table array if allocated locally. Array cannot be
+ * mapped, so we don't need to check for that flag.
+ */
+ if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
+ {
+ ACPI_FREE (AcpiGbl_RootTableList.Tables);
+ }
+
+ AcpiGbl_RootTableList.Tables = NULL;
+ AcpiGbl_RootTableList.Flags = 0;
+ AcpiGbl_RootTableList.Count = 0;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "ACPI Tables freed\n"));
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbDeleteNamespaceByOwner
+ *
+ * PARAMETERS: TableIndex - Table index
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Delete all namespace objects created when this table was loaded.
+ *
+ ******************************************************************************/
+
+void
+AcpiTbDeleteNamespaceByOwner (
+ ACPI_NATIVE_UINT TableIndex)
+{
+ ACPI_OWNER_ID OwnerId;
+
+
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+ if (TableIndex < AcpiGbl_RootTableList.Count)
+ {
+ OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
+ }
+ else
+ {
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ return;
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ AcpiNsDeleteNamespaceByOwner (OwnerId);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbAllocateOwnerId
+ *
+ * PARAMETERS: TableIndex - Table index
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Allocates OwnerId in TableDesc
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiTbAllocateOwnerId (
+ ACPI_NATIVE_UINT TableIndex)
+{
+ ACPI_STATUS Status = AE_BAD_PARAMETER;
+
+
+ ACPI_FUNCTION_TRACE (TbAllocateOwnerId);
+
+
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+ if (TableIndex < AcpiGbl_RootTableList.Count)
+ {
+ Status = AcpiUtAllocateOwnerId
+ (&(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbReleaseOwnerId
+ *
+ * PARAMETERS: TableIndex - Table index
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Releases OwnerId in TableDesc
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiTbReleaseOwnerId (
+ ACPI_NATIVE_UINT TableIndex)
+{
+ ACPI_STATUS Status = AE_BAD_PARAMETER;
+
+
+ ACPI_FUNCTION_TRACE (TbReleaseOwnerId);
+
+
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+ if (TableIndex < AcpiGbl_RootTableList.Count)
+ {
+ AcpiUtReleaseOwnerId (&(AcpiGbl_RootTableList.Tables[TableIndex].OwnerId));
+ Status = AE_OK;
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbGetOwnerId
+ *
+ * PARAMETERS: TableIndex - Table index
+ * OwnerId - Where the table OwnerId is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: returns OwnerId for the ACPI table
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiTbGetOwnerId (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_OWNER_ID *OwnerId)
+{
+ ACPI_STATUS Status = AE_BAD_PARAMETER;
+
+
+ ACPI_FUNCTION_TRACE (TbGetOwnerId);
+
+
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+ if (TableIndex < AcpiGbl_RootTableList.Count)
+ {
+ *OwnerId = AcpiGbl_RootTableList.Tables[TableIndex].OwnerId;
+ Status = AE_OK;
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbIsTableLoaded
+ *
+ * PARAMETERS: TableIndex - Table index
+ *
+ * RETURN: Table Loaded Flag
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiTbIsTableLoaded (
+ ACPI_NATIVE_UINT TableIndex)
+{
+ BOOLEAN IsLoaded = FALSE;
+
+
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+ if (TableIndex < AcpiGbl_RootTableList.Count)
+ {
+ IsLoaded = (BOOLEAN)
+ (AcpiGbl_RootTableList.Tables[TableIndex].Flags & ACPI_TABLE_IS_LOADED);
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ return (IsLoaded);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbSetTableLoadedFlag
+ *
+ * PARAMETERS: TableIndex - Table index
+ * IsLoaded - TRUE if table is loaded, FALSE otherwise
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Sets the table loaded flag to either TRUE or FALSE.
+ *
+ ******************************************************************************/
+
+void
+AcpiTbSetTableLoadedFlag (
+ ACPI_NATIVE_UINT TableIndex,
+ BOOLEAN IsLoaded)
+{
+
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+ if (TableIndex < AcpiGbl_RootTableList.Count)
+ {
+ if (IsLoaded)
+ {
+ AcpiGbl_RootTableList.Tables[TableIndex].Flags |= ACPI_TABLE_IS_LOADED;
+ }
+ else
+ {
+ AcpiGbl_RootTableList.Tables[TableIndex].Flags &= ~ACPI_TABLE_IS_LOADED;
+ }
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+}
+
diff --git a/sys/contrib/dev/acpica/tbutils.c b/sys/contrib/dev/acpica/tbutils.c
new file mode 100644
index 0000000..5b64e20
--- /dev/null
+++ b/sys/contrib/dev/acpica/tbutils.c
@@ -0,0 +1,594 @@
+/******************************************************************************
+ *
+ * Module Name: tbutils - table utilities
+ * $Revision: 1.88 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __TBUTILS_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/actables.h>
+
+#define _COMPONENT ACPI_TABLES
+ ACPI_MODULE_NAME ("tbutils")
+
+/* Local prototypes */
+
+static ACPI_PHYSICAL_ADDRESS
+AcpiTbGetRootTableEntry (
+ UINT8 *TableEntry,
+ ACPI_NATIVE_UINT TableEntrySize);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbTablesLoaded
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: TRUE if required ACPI tables are loaded
+ *
+ * DESCRIPTION: Determine if the minimum required ACPI tables are present
+ * (FADT, FACS, DSDT)
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiTbTablesLoaded (
+ void)
+{
+
+ if (AcpiGbl_RootTableList.Count >= 3)
+ {
+ return (TRUE);
+ }
+
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbPrintTableHeader
+ *
+ * PARAMETERS: Address - Table physical address
+ * Header - Table header
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print an ACPI table header. Special cases for FACS and RSDP.
+ *
+ ******************************************************************************/
+
+void
+AcpiTbPrintTableHeader (
+ ACPI_PHYSICAL_ADDRESS Address,
+ ACPI_TABLE_HEADER *Header)
+{
+
+ if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_FACS))
+ {
+ /* FACS only has signature and length fields of common table header */
+
+ ACPI_INFO ((AE_INFO, "%4.4s @ 0x%p/0x%04X",
+ Header->Signature, ACPI_CAST_PTR (void, Address), Header->Length));
+ }
+ else if (ACPI_COMPARE_NAME (Header->Signature, ACPI_SIG_RSDP))
+ {
+ /* RSDP has no common fields */
+
+ ACPI_INFO ((AE_INFO, "RSDP @ 0x%p/0x%04X (v%3.3d %6.6s)",
+ ACPI_CAST_PTR (void, Address),
+ (ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision > 0) ?
+ ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Length : 20,
+ ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->Revision,
+ ACPI_CAST_PTR (ACPI_TABLE_RSDP, Header)->OemId));
+ }
+ else
+ {
+ /* Standard ACPI table with full common header */
+
+ ACPI_INFO ((AE_INFO,
+ "%4.4s @ 0x%p/0x%04X (v%3.3d %6.6s %8.8s 0x%08X %4.4s 0x%08X)",
+ Header->Signature, ACPI_CAST_PTR (void, Address),
+ Header->Length, Header->Revision, Header->OemId,
+ Header->OemTableId, Header->OemRevision, Header->AslCompilerId,
+ Header->AslCompilerRevision));
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbValidateChecksum
+ *
+ * PARAMETERS: Table - ACPI table to verify
+ * Length - Length of entire table
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Verifies that the table checksums to zero. Optionally returns
+ * exception on bad checksum.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiTbVerifyChecksum (
+ ACPI_TABLE_HEADER *Table,
+ UINT32 Length)
+{
+ UINT8 Checksum;
+
+
+ /* Compute the checksum on the table */
+
+ Checksum = AcpiTbChecksum (ACPI_CAST_PTR (UINT8, Table), Length);
+
+ /* Checksum ok? (should be zero) */
+
+ if (Checksum)
+ {
+ ACPI_WARNING ((AE_INFO,
+ "Incorrect checksum in table [%4.4s] - %2.2X, should be %2.2X",
+ Table->Signature, Table->Checksum, (UINT8) (Table->Checksum - Checksum)));
+
+#if (ACPI_CHECKSUM_ABORT)
+ return (AE_BAD_CHECKSUM);
+#endif
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbChecksum
+ *
+ * PARAMETERS: Buffer - Pointer to memory region to be checked
+ * Length - Length of this memory region
+ *
+ * RETURN: Checksum (UINT8)
+ *
+ * DESCRIPTION: Calculates circular checksum of memory region.
+ *
+ ******************************************************************************/
+
+UINT8
+AcpiTbChecksum (
+ UINT8 *Buffer,
+ ACPI_NATIVE_UINT Length)
+{
+ UINT8 Sum = 0;
+ UINT8 *End = Buffer + Length;
+
+
+ while (Buffer < End)
+ {
+ Sum = (UINT8) (Sum + *(Buffer++));
+ }
+
+ return Sum;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbInstallTable
+ *
+ * PARAMETERS: Address - Physical address of DSDT or FACS
+ * Flags - Flags
+ * Signature - Table signature, NULL if no need to
+ * match
+ * TableIndex - Index into root table array
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Install an ACPI table into the global data structure.
+ *
+ ******************************************************************************/
+
+void
+AcpiTbInstallTable (
+ ACPI_PHYSICAL_ADDRESS Address,
+ UINT8 Flags,
+ char *Signature,
+ ACPI_NATIVE_UINT TableIndex)
+{
+ ACPI_TABLE_HEADER *Table;
+
+
+ if (!Address)
+ {
+ ACPI_ERROR ((AE_INFO, "Null physical address for ACPI table [%s]",
+ Signature));
+ return;
+ }
+
+ /* Map just the table header */
+
+ Table = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));
+ if (!Table)
+ {
+ return;
+ }
+
+ /* If a particular signature is expected, signature must match */
+
+ if (Signature &&
+ !ACPI_COMPARE_NAME (Table->Signature, Signature))
+ {
+ ACPI_ERROR ((AE_INFO, "Invalid signature 0x%X for ACPI table [%s]",
+ *ACPI_CAST_PTR (UINT32, Table->Signature), Signature));
+ goto UnmapAndExit;
+ }
+
+ /* Initialize the table entry */
+
+ AcpiGbl_RootTableList.Tables[TableIndex].Address = Address;
+ AcpiGbl_RootTableList.Tables[TableIndex].Length = Table->Length;
+ AcpiGbl_RootTableList.Tables[TableIndex].Flags = Flags;
+
+ ACPI_MOVE_32_TO_32 (
+ &(AcpiGbl_RootTableList.Tables[TableIndex].Signature),
+ Table->Signature);
+
+ AcpiTbPrintTableHeader (Address, Table);
+
+ if (TableIndex == ACPI_TABLE_INDEX_DSDT)
+ {
+ /* Global integer width is based upon revision of the DSDT */
+
+ AcpiUtSetIntegerWidth (Table->Revision);
+ }
+
+UnmapAndExit:
+ AcpiOsUnmapMemory (Table, sizeof (ACPI_TABLE_HEADER));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbGetRootTableEntry
+ *
+ * PARAMETERS: TableEntry - Pointer to the RSDT/XSDT table entry
+ * TableEntrySize - sizeof 32 or 64 (RSDT or XSDT)
+ *
+ * RETURN: Physical address extracted from the root table
+ *
+ * DESCRIPTION: Get one root table entry. Handles 32-bit and 64-bit cases on
+ * both 32-bit and 64-bit platforms
+ *
+ * NOTE: ACPI_PHYSICAL_ADDRESS is 32-bit on 32-bit platforms, 64-bit on
+ * 64-bit platforms.
+ *
+ ******************************************************************************/
+
+static ACPI_PHYSICAL_ADDRESS
+AcpiTbGetRootTableEntry (
+ UINT8 *TableEntry,
+ ACPI_NATIVE_UINT TableEntrySize)
+{
+ UINT64 Address64;
+
+
+ /*
+ * Get the table physical address (32-bit for RSDT, 64-bit for XSDT):
+ * Note: Addresses are 32-bit aligned (not 64) in both RSDT and XSDT
+ */
+ if (TableEntrySize == sizeof (UINT32))
+ {
+ /*
+ * 32-bit platform, RSDT: Return 32-bit table entry
+ * 64-bit platform, RSDT: Expand 32-bit to 64-bit and return
+ */
+ return ((ACPI_PHYSICAL_ADDRESS) (*ACPI_CAST_PTR (UINT32, TableEntry)));
+ }
+ else
+ {
+ /*
+ * 32-bit platform, XSDT: Truncate 64-bit to 32-bit and return
+ * 64-bit platform, XSDT: Move (unaligned) 64-bit to local, return 64-bit
+ */
+ ACPI_MOVE_64_TO_64 (&Address64, TableEntry);
+
+#if ACPI_MACHINE_WIDTH == 32
+ if (Address64 > ACPI_UINT32_MAX)
+ {
+ /* Will truncate 64-bit address to 32 bits, issue warning */
+
+ ACPI_WARNING ((AE_INFO,
+ "64-bit Physical Address in XSDT is too large (%8.8X%8.8X), truncating",
+ ACPI_FORMAT_UINT64 (Address64)));
+ }
+#endif
+ return ((ACPI_PHYSICAL_ADDRESS) (Address64));
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbParseRootTable
+ *
+ * PARAMETERS: Rsdp - Pointer to the RSDP
+ * Flags - Flags
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to parse the Root System Description
+ * Table (RSDT or XSDT)
+ *
+ * NOTE: Tables are mapped (not copied) for efficiency. The FACS must
+ * be mapped and cannot be copied because it contains the actual
+ * memory location of the ACPI Global Lock.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiTbParseRootTable (
+ ACPI_PHYSICAL_ADDRESS RsdpAddress,
+ UINT8 Flags)
+{
+ ACPI_TABLE_RSDP *Rsdp;
+ ACPI_NATIVE_UINT TableEntrySize;
+ ACPI_NATIVE_UINT i;
+ UINT32 TableCount;
+ ACPI_TABLE_HEADER *Table;
+ ACPI_PHYSICAL_ADDRESS Address;
+ UINT32 Length;
+ UINT8 *TableEntry;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (TbParseRootTable);
+
+
+ /*
+ * Map the entire RSDP and extract the address of the RSDT or XSDT
+ */
+ Rsdp = AcpiOsMapMemory (RsdpAddress, sizeof (ACPI_TABLE_RSDP));
+ if (!Rsdp)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ AcpiTbPrintTableHeader (RsdpAddress, ACPI_CAST_PTR (ACPI_TABLE_HEADER, Rsdp));
+
+ /* Differentiate between RSDT and XSDT root tables */
+
+ if (Rsdp->Revision > 1 && Rsdp->XsdtPhysicalAddress)
+ {
+ /*
+ * Root table is an XSDT (64-bit physical addresses). We must use the
+ * XSDT if the revision is > 1 and the XSDT pointer is present, as per
+ * the ACPI specification.
+ */
+ Address = (ACPI_PHYSICAL_ADDRESS) Rsdp->XsdtPhysicalAddress;
+ TableEntrySize = sizeof (UINT64);
+ }
+ else
+ {
+ /* Root table is an RSDT (32-bit physical addresses) */
+
+ Address = (ACPI_PHYSICAL_ADDRESS) Rsdp->RsdtPhysicalAddress;
+ TableEntrySize = sizeof (UINT32);
+ }
+
+ /*
+ * It is not possible to map more than one entry in some environments,
+ * so unmap the RSDP here before mapping other tables
+ */
+ AcpiOsUnmapMemory (Rsdp, sizeof (ACPI_TABLE_RSDP));
+
+
+ /* Map the RSDT/XSDT table header to get the full table length */
+
+ Table = AcpiOsMapMemory (Address, sizeof (ACPI_TABLE_HEADER));
+ if (!Table)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ AcpiTbPrintTableHeader (Address, Table);
+
+ /* Get the length of the full table, verify length and map entire table */
+
+ Length = Table->Length;
+ AcpiOsUnmapMemory (Table, sizeof (ACPI_TABLE_HEADER));
+
+ if (Length < sizeof (ACPI_TABLE_HEADER))
+ {
+ ACPI_ERROR ((AE_INFO, "Invalid length 0x%X in RSDT/XSDT", Length));
+ return_ACPI_STATUS (AE_INVALID_TABLE_LENGTH);
+ }
+
+ Table = AcpiOsMapMemory (Address, Length);
+ if (!Table)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Validate the root table checksum */
+
+ Status = AcpiTbVerifyChecksum (Table, Length);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsUnmapMemory (Table, Length);
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Calculate the number of tables described in the root table */
+
+ TableCount = (UINT32) ((Table->Length - sizeof (ACPI_TABLE_HEADER)) / TableEntrySize);
+
+ /*
+ * First two entries in the table array are reserved for the DSDT and FACS,
+ * which are not actually present in the RSDT/XSDT - they come from the FADT
+ */
+ TableEntry = ACPI_CAST_PTR (UINT8, Table) + sizeof (ACPI_TABLE_HEADER);
+ AcpiGbl_RootTableList.Count = 2;
+
+ /*
+ * Initialize the root table array from the RSDT/XSDT
+ */
+ for (i = 0; i < TableCount; i++)
+ {
+ if (AcpiGbl_RootTableList.Count >= AcpiGbl_RootTableList.Size)
+ {
+ /* There is no more room in the root table array, attempt resize */
+
+ Status = AcpiTbResizeRootTableList ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_WARNING ((AE_INFO, "Truncating %u table entries!",
+ (unsigned) (AcpiGbl_RootTableList.Size - AcpiGbl_RootTableList.Count)));
+ break;
+ }
+ }
+
+ /* Get the table physical address (32-bit for RSDT, 64-bit for XSDT) */
+
+ AcpiGbl_RootTableList.Tables[AcpiGbl_RootTableList.Count].Address =
+ AcpiTbGetRootTableEntry (TableEntry, TableEntrySize);
+
+ TableEntry += TableEntrySize;
+ AcpiGbl_RootTableList.Count++;
+ }
+
+ /*
+ * It is not possible to map more than one entry in some environments,
+ * so unmap the root table here before mapping other tables
+ */
+ AcpiOsUnmapMemory (Table, Length);
+
+ /*
+ * Complete the initialization of the root table array by examining
+ * the header of each table
+ */
+ for (i = 2; i < AcpiGbl_RootTableList.Count; i++)
+ {
+ AcpiTbInstallTable (AcpiGbl_RootTableList.Tables[i].Address,
+ Flags, NULL, i);
+
+ /* Special case for FADT - get the DSDT and FACS */
+
+ if (ACPI_COMPARE_NAME (
+ &AcpiGbl_RootTableList.Tables[i].Signature, ACPI_SIG_FADT))
+ {
+ AcpiTbParseFadt (i, Flags);
+ }
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
diff --git a/sys/contrib/dev/acpica/tbxface.c b/sys/contrib/dev/acpica/tbxface.c
new file mode 100644
index 0000000..a7a27c6
--- /dev/null
+++ b/sys/contrib/dev/acpica/tbxface.c
@@ -0,0 +1,674 @@
+/******************************************************************************
+ *
+ * Module Name: tbxface - Public interfaces to the ACPI subsystem
+ * ACPI table oriented interfaces
+ * $Revision: 1.86 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __TBXFACE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/actables.h>
+
+#define _COMPONENT ACPI_TABLES
+ ACPI_MODULE_NAME ("tbxface")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiTbLoadNamespace (
+ void);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiAllocateRootTable
+ *
+ * PARAMETERS: InitialTableCount - Size of InitialTableArray, in number of
+ * ACPI_TABLE_DESC structures
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Allocate a root table array. Used by iASL compiler and
+ * AcpiInitializeTables.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiAllocateRootTable (
+ UINT32 InitialTableCount)
+{
+
+ AcpiGbl_RootTableList.Size = InitialTableCount;
+ AcpiGbl_RootTableList.Flags = ACPI_ROOT_ALLOW_RESIZE;
+
+ return (AcpiTbResizeRootTableList ());
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiInitializeTables
+ *
+ * PARAMETERS: InitialTableArray - Pointer to an array of pre-allocated
+ * ACPI_TABLE_DESC structures. If NULL, the
+ * array is dynamically allocated.
+ * InitialTableCount - Size of InitialTableArray, in number of
+ * ACPI_TABLE_DESC structures
+ * AllowRealloc - Flag to tell Table Manager if resize of
+ * pre-allocated array is allowed. Ignored
+ * if InitialTableArray is NULL.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initialize the table manager, get the RSDP and RSDT/XSDT.
+ *
+ * NOTE: Allows static allocation of the initial table array in order
+ * to avoid the use of dynamic memory in confined environments
+ * such as the kernel boot sequence where it may not be available.
+ *
+ * If the host OS memory managers are initialized, use NULL for
+ * InitialTableArray, and the table will be dynamically allocated.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiInitializeTables (
+ ACPI_TABLE_DESC *InitialTableArray,
+ UINT32 InitialTableCount,
+ BOOLEAN AllowResize)
+{
+ ACPI_PHYSICAL_ADDRESS RsdpAddress;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiInitializeTables);
+
+
+ /*
+ * Set up the Root Table Array
+ * Allocate the table array if requested
+ */
+ if (!InitialTableArray)
+ {
+ Status = AcpiAllocateRootTable (InitialTableCount);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+ else
+ {
+ /* Root Table Array has been statically allocated by the host */
+
+ ACPI_MEMSET (InitialTableArray, 0,
+ InitialTableCount * sizeof (ACPI_TABLE_DESC));
+
+ AcpiGbl_RootTableList.Tables = InitialTableArray;
+ AcpiGbl_RootTableList.Size = InitialTableCount;
+ AcpiGbl_RootTableList.Flags = ACPI_ROOT_ORIGIN_UNKNOWN;
+ if (AllowResize)
+ {
+ AcpiGbl_RootTableList.Flags |= ACPI_ROOT_ALLOW_RESIZE;
+ }
+ }
+
+ /* Get the address of the RSDP */
+
+ RsdpAddress = AcpiOsGetRootPointer ();
+ if (!RsdpAddress)
+ {
+ return_ACPI_STATUS (AE_NOT_FOUND);
+ }
+
+ /*
+ * Get the root table (RSDT or XSDT) and extract all entries to the local
+ * Root Table Array. This array contains the information of the RSDT/XSDT
+ * in a common, more useable format.
+ */
+ Status = AcpiTbParseRootTable (RsdpAddress, ACPI_TABLE_ORIGIN_MAPPED);
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInitializeTables)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiReallocateRootTable
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Reallocate Root Table List into dynamic memory. Copies the
+ * root list from the previously provided scratch area. Should
+ * be called once dynamic memory allocation is available in the
+ * kernel
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiReallocateRootTable (
+ void)
+{
+ ACPI_TABLE_DESC *Tables;
+ ACPI_SIZE NewSize;
+
+
+ ACPI_FUNCTION_TRACE (AcpiReallocateRootTable);
+
+
+ /*
+ * Only reallocate the root table if the host provided a static buffer
+ * for the table array in the call to AcpiInitializeTables.
+ */
+ if (AcpiGbl_RootTableList.Flags & ACPI_ROOT_ORIGIN_ALLOCATED)
+ {
+ return_ACPI_STATUS (AE_SUPPORT);
+ }
+
+ NewSize = (AcpiGbl_RootTableList.Count + ACPI_ROOT_TABLE_SIZE_INCREMENT) *
+ sizeof (ACPI_TABLE_DESC);
+
+ /* Create new array and copy the old array */
+
+ Tables = ACPI_ALLOCATE_ZEROED (NewSize);
+ if (!Tables)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ ACPI_MEMCPY (Tables, AcpiGbl_RootTableList.Tables, NewSize);
+
+ AcpiGbl_RootTableList.Size = AcpiGbl_RootTableList.Count;
+ AcpiGbl_RootTableList.Tables = Tables;
+ AcpiGbl_RootTableList.Flags =
+ ACPI_ROOT_ORIGIN_ALLOCATED | ACPI_ROOT_ALLOW_RESIZE;
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiReallocateRootTable)
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiGetTableHeader
+ *
+ * PARAMETERS: Signature - ACPI signature of needed table
+ * Instance - Which instance (for SSDTs)
+ * OutTableHeader - The pointer to the table header to fill
+ *
+ * RETURN: Status and pointer to mapped table header
+ *
+ * DESCRIPTION: Finds an ACPI table header.
+ *
+ * NOTE: Caller is responsible in unmapping the header with
+ * AcpiOsUnmapMemory
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiGetTableHeader (
+ char *Signature,
+ ACPI_NATIVE_UINT Instance,
+ ACPI_TABLE_HEADER *OutTableHeader)
+{
+ ACPI_NATIVE_UINT i;
+ ACPI_NATIVE_UINT j;
+ ACPI_TABLE_HEADER *Header;
+
+
+ /* Parameter validation */
+
+ if (!Signature || !OutTableHeader)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Walk the root table list
+ */
+ for (i = 0, j = 0; i < AcpiGbl_RootTableList.Count; i++)
+ {
+ if (!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
+ Signature))
+ {
+ continue;
+ }
+
+ if (++j < Instance)
+ {
+ continue;
+ }
+
+ if (!AcpiGbl_RootTableList.Tables[i].Pointer)
+ {
+ if ((AcpiGbl_RootTableList.Tables[i].Flags & ACPI_TABLE_ORIGIN_MASK) ==
+ ACPI_TABLE_ORIGIN_MAPPED)
+ {
+ Header = AcpiOsMapMemory (AcpiGbl_RootTableList.Tables[i].Address,
+ sizeof (ACPI_TABLE_HEADER));
+ if (!Header)
+ {
+ return AE_NO_MEMORY;
+ }
+
+ ACPI_MEMCPY (OutTableHeader, Header, sizeof(ACPI_TABLE_HEADER));
+ AcpiOsUnmapMemory (Header, sizeof(ACPI_TABLE_HEADER));
+ }
+
+ else
+ {
+ return AE_NOT_FOUND;
+ }
+ }
+
+ else
+ {
+ ACPI_MEMCPY (OutTableHeader, AcpiGbl_RootTableList.Tables[i].Pointer,
+ sizeof(ACPI_TABLE_HEADER));
+ }
+
+ return (AE_OK);
+ }
+
+ return (AE_NOT_FOUND);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetTableHeader)
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiGetTable
+ *
+ * PARAMETERS: Signature - ACPI signature of needed table
+ * Instance - Which instance (for SSDTs)
+ * OutTable - Where the pointer to the table is returned
+ *
+ * RETURN: Status and pointer to table
+ *
+ * DESCRIPTION: Finds and verifies an ACPI table.
+ *
+ *****************************************************************************/
+
+ACPI_STATUS
+AcpiGetTable (
+ char *Signature,
+ ACPI_NATIVE_UINT Instance,
+ ACPI_TABLE_HEADER **OutTable)
+{
+ ACPI_NATIVE_UINT i;
+ ACPI_NATIVE_UINT j;
+ ACPI_STATUS Status;
+
+
+ /* Parameter validation */
+
+ if (!Signature || !OutTable)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Walk the root table list
+ */
+ for (i = 0, j = 0; i < AcpiGbl_RootTableList.Count; i++)
+ {
+ if (!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
+ Signature))
+ {
+ continue;
+ }
+
+ if (++j < Instance)
+ {
+ continue;
+ }
+
+ Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[i]);
+ if (ACPI_SUCCESS (Status))
+ {
+ *OutTable = AcpiGbl_RootTableList.Tables[i].Pointer;
+ }
+
+ return (Status);
+ }
+
+ return (AE_NOT_FOUND);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetTable)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetTableByIndex
+ *
+ * PARAMETERS: TableIndex - Table index
+ * Table - Where the pointer to the table is returned
+ *
+ * RETURN: Status and pointer to the table
+ *
+ * DESCRIPTION: Obtain a table by an index into the global table list.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetTableByIndex (
+ ACPI_NATIVE_UINT TableIndex,
+ ACPI_TABLE_HEADER **Table)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetTableByIndex);
+
+
+ /* Parameter validation */
+
+ if (!Table)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+
+ /* Validate index */
+
+ if (TableIndex >= AcpiGbl_RootTableList.Count)
+ {
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if (!AcpiGbl_RootTableList.Tables[TableIndex].Pointer)
+ {
+ /* Table is not mapped, map it */
+
+ Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[TableIndex]);
+ if (ACPI_FAILURE (Status))
+ {
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ *Table = AcpiGbl_RootTableList.Tables[TableIndex].Pointer;
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetTableByIndex)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbLoadNamespace
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Load the namespace from the DSDT and all SSDTs/PSDTs found in
+ * the RSDT/XSDT.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiTbLoadNamespace (
+ void)
+{
+ ACPI_STATUS Status;
+ ACPI_TABLE_HEADER *Table;
+ ACPI_NATIVE_UINT i;
+ BOOLEAN DsdtOverriden;
+
+
+ ACPI_FUNCTION_TRACE (TbLoadNamespace);
+
+
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+
+ /*
+ * Load the namespace. The DSDT is required, but any SSDT and PSDT tables
+ * are optional.
+ */
+ if (!AcpiGbl_RootTableList.Count ||
+ !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Signature),
+ ACPI_SIG_DSDT) ||
+ ACPI_FAILURE (AcpiTbVerifyTable(&AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT])))
+ {
+ Status = AE_NO_ACPI_TABLES;
+ goto UnlockAndExit;
+ }
+
+ /*
+ * Find DSDT table
+ */
+ DsdtOverriden = FALSE;
+ Status = AcpiOsTableOverride (
+ AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Pointer, &Table);
+ if (ACPI_SUCCESS (Status) && Table)
+ {
+ /*
+ * DSDT table has been found
+ */
+ AcpiTbDeleteTable (&AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT]);
+ AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Pointer = Table;
+ AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Length = Table->Length;
+ AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT].Flags = ACPI_TABLE_ORIGIN_UNKNOWN;
+ DsdtOverriden = TRUE;
+
+ ACPI_INFO ((AE_INFO, "Table DSDT replaced by host OS"));
+ AcpiTbPrintTableHeader (0, Table);
+ }
+
+ Status = AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[ACPI_TABLE_INDEX_DSDT]);
+ if (ACPI_FAILURE (Status))
+ {
+ /* A valid DSDT is required */
+
+ Status = AE_NO_ACPI_TABLES;
+ goto UnlockAndExit;
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+
+ /*
+ * Load and parse tables.
+ */
+ Status = AcpiNsLoadTable (ACPI_TABLE_INDEX_DSDT, AcpiGbl_RootNode);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Load any SSDT or PSDT tables. Note: Loop leaves tables locked
+ */
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+ for (i = 2; i < AcpiGbl_RootTableList.Count; ++i)
+ {
+ if ((!ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
+ ACPI_SIG_SSDT) &&
+ !ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
+ ACPI_SIG_PSDT)) ||
+ ACPI_FAILURE (AcpiTbVerifyTable (&AcpiGbl_RootTableList.Tables[i])))
+ {
+ continue;
+ }
+
+ /* Delete SSDT when DSDT is overriden */
+
+ if (ACPI_COMPARE_NAME (&(AcpiGbl_RootTableList.Tables[i].Signature),
+ ACPI_SIG_SSDT) && DsdtOverriden)
+ {
+ AcpiTbDeleteTable (&AcpiGbl_RootTableList.Tables[i]);
+ continue;
+ }
+
+ /* Ignore errors while loading tables, get as many as possible */
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ (void) AcpiNsLoadTable (i, AcpiGbl_RootNode);
+ (void) AcpiUtAcquireMutex (ACPI_MTX_TABLES);
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INIT, "ACPI Tables successfully acquired\n"));
+
+UnlockAndExit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_TABLES);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiLoadTables
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Load the ACPI tables from the RSDT/XSDT
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiLoadTables (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiLoadTables);
+
+
+ /*
+ * Load the namespace from the tables
+ */
+ Status = AcpiTbLoadNamespace ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "While loading namespace from ACPI tables"));
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiLoadTables)
+
diff --git a/sys/contrib/dev/acpica/tbxfroot.c b/sys/contrib/dev/acpica/tbxfroot.c
new file mode 100644
index 0000000..afc30ad
--- /dev/null
+++ b/sys/contrib/dev/acpica/tbxfroot.c
@@ -0,0 +1,370 @@
+/******************************************************************************
+ *
+ * Module Name: tbxfroot - Find the root ACPI table (RSDT)
+ * $Revision: 1.105 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __TBXFROOT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/actables.h>
+
+
+#define _COMPONENT ACPI_TABLES
+ ACPI_MODULE_NAME ("tbxfroot")
+
+/* Local prototypes */
+
+static UINT8 *
+AcpiTbScanMemoryForRsdp (
+ UINT8 *StartAddress,
+ UINT32 Length);
+
+static ACPI_STATUS
+AcpiTbValidateRsdp (
+ ACPI_TABLE_RSDP *Rsdp);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbValidateRsdp
+ *
+ * PARAMETERS: Rsdp - Pointer to unvalidated RSDP
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Validate the RSDP (ptr)
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiTbValidateRsdp (
+ ACPI_TABLE_RSDP *Rsdp)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * The signature and checksum must both be correct
+ *
+ * Note: Sometimes there exists more than one RSDP in memory; the valid
+ * RSDP has a valid checksum, all others have an invalid checksum.
+ */
+ if (ACPI_STRNCMP ((char *) Rsdp, ACPI_SIG_RSDP, sizeof (ACPI_SIG_RSDP)-1) != 0)
+ {
+ /* Nope, BAD Signature */
+
+ return (AE_BAD_SIGNATURE);
+ }
+
+ /* Check the standard checksum */
+
+ if (AcpiTbChecksum ((UINT8 *) Rsdp, ACPI_RSDP_CHECKSUM_LENGTH) != 0)
+ {
+ return (AE_BAD_CHECKSUM);
+ }
+
+ /* Check extended checksum if table version >= 2 */
+
+ if ((Rsdp->Revision >= 2) &&
+ (AcpiTbChecksum ((UINT8 *) Rsdp, ACPI_RSDP_XCHECKSUM_LENGTH) != 0))
+ {
+ return (AE_BAD_CHECKSUM);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbFindRsdp
+ *
+ * PARAMETERS: TableAddress - Where the table pointer is returned
+ *
+ * RETURN: Status, RSDP physical address
+ *
+ * DESCRIPTION: Search lower 1Mbyte of memory for the root system descriptor
+ * pointer structure. If it is found, set *RSDP to point to it.
+ *
+ * NOTE1: The RSDP must be either in the first 1K of the Extended
+ * BIOS Data Area or between E0000 and FFFFF (From ACPI Spec.)
+ * Only a 32-bit physical address is necessary.
+ *
+ * NOTE2: This function is always available, regardless of the
+ * initialization state of the rest of ACPI.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiFindRootPointer (
+ ACPI_NATIVE_UINT *TableAddress)
+{
+ UINT8 *TablePtr;
+ UINT8 *MemRover;
+ UINT32 PhysicalAddress;
+
+
+ ACPI_FUNCTION_TRACE (AcpiFindRootPointer);
+
+
+ /* 1a) Get the location of the Extended BIOS Data Area (EBDA) */
+
+ TablePtr = AcpiOsMapMemory (
+ (ACPI_PHYSICAL_ADDRESS) ACPI_EBDA_PTR_LOCATION,
+ ACPI_EBDA_PTR_LENGTH);
+ if (!TablePtr)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not map memory at %8.8X for length %X",
+ ACPI_EBDA_PTR_LOCATION, ACPI_EBDA_PTR_LENGTH));
+
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ ACPI_MOVE_16_TO_32 (&PhysicalAddress, TablePtr);
+
+ /* Convert segment part to physical address */
+
+ PhysicalAddress <<= 4;
+ AcpiOsUnmapMemory (TablePtr, ACPI_EBDA_PTR_LENGTH);
+
+ /* EBDA present? */
+
+ if (PhysicalAddress > 0x400)
+ {
+ /*
+ * 1b) Search EBDA paragraphs (EBDA is required to be a
+ * minimum of 1K length)
+ */
+ TablePtr = AcpiOsMapMemory (
+ (ACPI_NATIVE_UINT) PhysicalAddress,
+ ACPI_EBDA_WINDOW_SIZE);
+ if (!TablePtr)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not map memory at %8.8X for length %X",
+ PhysicalAddress, ACPI_EBDA_WINDOW_SIZE));
+
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_EBDA_WINDOW_SIZE);
+ AcpiOsUnmapMemory (TablePtr, ACPI_EBDA_WINDOW_SIZE);
+
+ if (MemRover)
+ {
+ /* Return the physical address */
+
+ PhysicalAddress += (UINT32) ACPI_PTR_DIFF (MemRover, TablePtr);
+
+ *TableAddress = PhysicalAddress;
+ return_ACPI_STATUS (AE_OK);
+ }
+ }
+
+ /*
+ * 2) Search upper memory: 16-byte boundaries in E0000h-FFFFFh
+ */
+ TablePtr = AcpiOsMapMemory (
+ (ACPI_PHYSICAL_ADDRESS) ACPI_HI_RSDP_WINDOW_BASE,
+ ACPI_HI_RSDP_WINDOW_SIZE);
+
+ if (!TablePtr)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Could not map memory at %8.8X for length %X",
+ ACPI_HI_RSDP_WINDOW_BASE, ACPI_HI_RSDP_WINDOW_SIZE));
+
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ MemRover = AcpiTbScanMemoryForRsdp (TablePtr, ACPI_HI_RSDP_WINDOW_SIZE);
+ AcpiOsUnmapMemory (TablePtr, ACPI_HI_RSDP_WINDOW_SIZE);
+
+ if (MemRover)
+ {
+ /* Return the physical address */
+
+ PhysicalAddress = (UINT32)
+ (ACPI_HI_RSDP_WINDOW_BASE + ACPI_PTR_DIFF (MemRover, TablePtr));
+
+ *TableAddress = PhysicalAddress;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* A valid RSDP was not found */
+
+ ACPI_ERROR ((AE_INFO, "A valid RSDP was not found"));
+ return_ACPI_STATUS (AE_NOT_FOUND);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiFindRootPointer)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTbScanMemoryForRsdp
+ *
+ * PARAMETERS: StartAddress - Starting pointer for search
+ * Length - Maximum length to search
+ *
+ * RETURN: Pointer to the RSDP if found, otherwise NULL.
+ *
+ * DESCRIPTION: Search a block of memory for the RSDP signature
+ *
+ ******************************************************************************/
+
+static UINT8 *
+AcpiTbScanMemoryForRsdp (
+ UINT8 *StartAddress,
+ UINT32 Length)
+{
+ ACPI_STATUS Status;
+ UINT8 *MemRover;
+ UINT8 *EndAddress;
+
+
+ ACPI_FUNCTION_TRACE (TbScanMemoryForRsdp);
+
+
+ EndAddress = StartAddress + Length;
+
+ /* Search from given start address for the requested length */
+
+ for (MemRover = StartAddress; MemRover < EndAddress;
+ MemRover += ACPI_RSDP_SCAN_STEP)
+ {
+ /* The RSDP signature and checksum must both be correct */
+
+ Status = AcpiTbValidateRsdp (ACPI_CAST_PTR (ACPI_TABLE_RSDP, MemRover));
+ if (ACPI_SUCCESS (Status))
+ {
+ /* Sig and checksum valid, we have found a real RSDP */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "RSDP located at physical address %p\n", MemRover));
+ return_PTR (MemRover);
+ }
+
+ /* No sig match or bad checksum, keep searching */
+ }
+
+ /* Searched entire block, no RSDP was found */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Searched entire block from %p, valid RSDP was not found\n",
+ StartAddress));
+ return_PTR (NULL);
+}
+
diff --git a/sys/contrib/dev/acpica/utalloc.c b/sys/contrib/dev/acpica/utalloc.c
new file mode 100644
index 0000000..d1528e3
--- /dev/null
+++ b/sys/contrib/dev/acpica/utalloc.c
@@ -0,0 +1,482 @@
+/******************************************************************************
+ *
+ * Module Name: utalloc - local memory allocation routines
+ * $Revision: 1.164 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __UTALLOC_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acdebug.h>
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utalloc")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateCaches
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create all local caches
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtCreateCaches (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ /* Object Caches, for frequently used objects */
+
+ Status = AcpiOsCreateCache ("Acpi-Namespace", sizeof (ACPI_NAMESPACE_NODE),
+ ACPI_MAX_NAMESPACE_CACHE_DEPTH, &AcpiGbl_NamespaceCache);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Status = AcpiOsCreateCache ("Acpi-State", sizeof (ACPI_GENERIC_STATE),
+ ACPI_MAX_STATE_CACHE_DEPTH, &AcpiGbl_StateCache);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Status = AcpiOsCreateCache ("Acpi-Parse", sizeof (ACPI_PARSE_OBJ_COMMON),
+ ACPI_MAX_PARSE_CACHE_DEPTH, &AcpiGbl_PsNodeCache);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Status = AcpiOsCreateCache ("Acpi-ParseExt", sizeof (ACPI_PARSE_OBJ_NAMED),
+ ACPI_MAX_EXTPARSE_CACHE_DEPTH, &AcpiGbl_PsNodeExtCache);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Status = AcpiOsCreateCache ("Acpi-Operand", sizeof (ACPI_OPERAND_OBJECT),
+ ACPI_MAX_OBJECT_CACHE_DEPTH, &AcpiGbl_OperandCache);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+
+ /* Memory allocation lists */
+
+ Status = AcpiUtCreateList ("Acpi-Global", 0,
+ &AcpiGbl_GlobalList);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Status = AcpiUtCreateList ("Acpi-Namespace", sizeof (ACPI_NAMESPACE_NODE),
+ &AcpiGbl_NsNodeList);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+#endif
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDeleteCaches
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Purge and delete all local caches
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtDeleteCaches (
+ void)
+{
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+ char Buffer[7];
+
+ if (AcpiGbl_DisplayFinalMemStats)
+ {
+ ACPI_STRCPY (Buffer, "MEMORY");
+ AcpiDbDisplayStatistics (Buffer);
+ }
+#endif
+
+ (void) AcpiOsDeleteCache (AcpiGbl_NamespaceCache);
+ AcpiGbl_NamespaceCache = NULL;
+
+ (void) AcpiOsDeleteCache (AcpiGbl_StateCache);
+ AcpiGbl_StateCache = NULL;
+
+ (void) AcpiOsDeleteCache (AcpiGbl_OperandCache);
+ AcpiGbl_OperandCache = NULL;
+
+ (void) AcpiOsDeleteCache (AcpiGbl_PsNodeCache);
+ AcpiGbl_PsNodeCache = NULL;
+
+ (void) AcpiOsDeleteCache (AcpiGbl_PsNodeExtCache);
+ AcpiGbl_PsNodeExtCache = NULL;
+
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+
+ /* Debug only - display leftover memory allocation, if any */
+
+ AcpiUtDumpAllocations (ACPI_UINT32_MAX, NULL);
+
+ /* Free memory lists */
+
+ AcpiOsFree (AcpiGbl_GlobalList);
+ AcpiGbl_GlobalList = NULL;
+
+ AcpiOsFree (AcpiGbl_NsNodeList);
+ AcpiGbl_NsNodeList = NULL;
+#endif
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtValidateBuffer
+ *
+ * PARAMETERS: Buffer - Buffer descriptor to be validated
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Perform parameter validation checks on an ACPI_BUFFER
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtValidateBuffer (
+ ACPI_BUFFER *Buffer)
+{
+
+ /* Obviously, the structure pointer must be valid */
+
+ if (!Buffer)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Special semantics for the length */
+
+ if ((Buffer->Length == ACPI_NO_BUFFER) ||
+ (Buffer->Length == ACPI_ALLOCATE_BUFFER) ||
+ (Buffer->Length == ACPI_ALLOCATE_LOCAL_BUFFER))
+ {
+ return (AE_OK);
+ }
+
+ /* Length is valid, the buffer pointer must be also */
+
+ if (!Buffer->Pointer)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtInitializeBuffer
+ *
+ * PARAMETERS: Buffer - Buffer to be validated
+ * RequiredLength - Length needed
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Validate that the buffer is of the required length or
+ * allocate a new buffer. Returned buffer is always zeroed.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtInitializeBuffer (
+ ACPI_BUFFER *Buffer,
+ ACPI_SIZE RequiredLength)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ switch (Buffer->Length)
+ {
+ case ACPI_NO_BUFFER:
+
+ /* Set the exception and returned the required length */
+
+ Status = AE_BUFFER_OVERFLOW;
+ break;
+
+
+ case ACPI_ALLOCATE_BUFFER:
+
+ /* Allocate a new buffer */
+
+ Buffer->Pointer = AcpiOsAllocate (RequiredLength);
+ if (!Buffer->Pointer)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ /* Clear the buffer */
+
+ ACPI_MEMSET (Buffer->Pointer, 0, RequiredLength);
+ break;
+
+
+ case ACPI_ALLOCATE_LOCAL_BUFFER:
+
+ /* Allocate a new buffer with local interface to allow tracking */
+
+ Buffer->Pointer = ACPI_ALLOCATE_ZEROED (RequiredLength);
+ if (!Buffer->Pointer)
+ {
+ return (AE_NO_MEMORY);
+ }
+ break;
+
+
+ default:
+
+ /* Existing buffer: Validate the size of the buffer */
+
+ if (Buffer->Length < RequiredLength)
+ {
+ Status = AE_BUFFER_OVERFLOW;
+ break;
+ }
+
+ /* Clear the buffer */
+
+ ACPI_MEMSET (Buffer->Pointer, 0, RequiredLength);
+ break;
+ }
+
+ Buffer->Length = RequiredLength;
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtAllocate
+ *
+ * PARAMETERS: Size - Size of the allocation
+ * Component - Component type of caller
+ * Module - Source file name of caller
+ * Line - Line number of caller
+ *
+ * RETURN: Address of the allocated memory on success, NULL on failure.
+ *
+ * DESCRIPTION: Subsystem equivalent of malloc.
+ *
+ ******************************************************************************/
+
+void *
+AcpiUtAllocate (
+ ACPI_SIZE Size,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line)
+{
+ void *Allocation;
+
+
+ ACPI_FUNCTION_TRACE_U32 (UtAllocate, Size);
+
+
+ /* Check for an inadvertent size of zero bytes */
+
+ if (!Size)
+ {
+ ACPI_WARNING ((Module, Line,
+ "Attempt to allocate zero bytes, allocating 1 byte"));
+ Size = 1;
+ }
+
+ Allocation = AcpiOsAllocate (Size);
+ if (!Allocation)
+ {
+ /* Report allocation error */
+
+ ACPI_WARNING ((Module, Line,
+ "Could not allocate size %X", (UINT32) Size));
+
+ return_PTR (NULL);
+ }
+
+ return_PTR (Allocation);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtAllocateZeroed
+ *
+ * PARAMETERS: Size - Size of the allocation
+ * Component - Component type of caller
+ * Module - Source file name of caller
+ * Line - Line number of caller
+ *
+ * RETURN: Address of the allocated memory on success, NULL on failure.
+ *
+ * DESCRIPTION: Subsystem equivalent of calloc. Allocate and zero memory.
+ *
+ ******************************************************************************/
+
+void *
+AcpiUtAllocateZeroed (
+ ACPI_SIZE Size,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line)
+{
+ void *Allocation;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ Allocation = AcpiUtAllocate (Size, Component, Module, Line);
+ if (Allocation)
+ {
+ /* Clear the memory block */
+
+ ACPI_MEMSET (Allocation, 0, Size);
+ }
+
+ return (Allocation);
+}
+
diff --git a/sys/contrib/dev/acpica/utcache.c b/sys/contrib/dev/acpica/utcache.c
new file mode 100644
index 0000000..56e88b3
--- /dev/null
+++ b/sys/contrib/dev/acpica/utcache.c
@@ -0,0 +1,425 @@
+/******************************************************************************
+ *
+ * Module Name: utcache - local cache allocation routines
+ * $Revision: 1.8 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __UTCACHE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utcache")
+
+
+#ifdef ACPI_USE_LOCAL_CACHE
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiOsCreateCache
+ *
+ * PARAMETERS: CacheName - Ascii name for the cache
+ * ObjectSize - Size of each cached object
+ * MaxDepth - Maximum depth of the cache (in objects)
+ * ReturnCache - Where the new cache object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a cache object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiOsCreateCache (
+ char *CacheName,
+ UINT16 ObjectSize,
+ UINT16 MaxDepth,
+ ACPI_MEMORY_LIST **ReturnCache)
+{
+ ACPI_MEMORY_LIST *Cache;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!CacheName || !ReturnCache || (ObjectSize < 16))
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Create the cache object */
+
+ Cache = AcpiOsAllocate (sizeof (ACPI_MEMORY_LIST));
+ if (!Cache)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ /* Populate the cache object and return it */
+
+ ACPI_MEMSET (Cache, 0, sizeof (ACPI_MEMORY_LIST));
+ Cache->LinkOffset = 8;
+ Cache->ListName = CacheName;
+ Cache->ObjectSize = ObjectSize;
+ Cache->MaxDepth = MaxDepth;
+
+ *ReturnCache = Cache;
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiOsPurgeCache
+ *
+ * PARAMETERS: Cache - Handle to cache object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Free all objects within the requested cache.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiOsPurgeCache (
+ ACPI_MEMORY_LIST *Cache)
+{
+ char *Next;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!Cache)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* Walk the list of objects in this cache */
+
+ while (Cache->ListHead)
+ {
+ /* Delete and unlink one cached state object */
+
+ Next = *(ACPI_CAST_INDIRECT_PTR (char,
+ &(((char *) Cache->ListHead)[Cache->LinkOffset])));
+ ACPI_FREE (Cache->ListHead);
+
+ Cache->ListHead = Next;
+ Cache->CurrentDepth--;
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiOsDeleteCache
+ *
+ * PARAMETERS: Cache - Handle to cache object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Free all objects within the requested cache and delete the
+ * cache object.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiOsDeleteCache (
+ ACPI_MEMORY_LIST *Cache)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Purge all objects in the cache */
+
+ Status = AcpiOsPurgeCache (Cache);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Now we can delete the cache object */
+
+ AcpiOsFree (Cache);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiOsReleaseObject
+ *
+ * PARAMETERS: Cache - Handle to cache object
+ * Object - The object to be released
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Release an object to the specified cache. If cache is full,
+ * the object is deleted.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiOsReleaseObject (
+ ACPI_MEMORY_LIST *Cache,
+ void *Object)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!Cache || !Object)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /* If cache is full, just free this object */
+
+ if (Cache->CurrentDepth >= Cache->MaxDepth)
+ {
+ ACPI_FREE (Object);
+ ACPI_MEM_TRACKING (Cache->TotalFreed++);
+ }
+
+ /* Otherwise put this object back into the cache */
+
+ else
+ {
+ Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ /* Mark the object as cached */
+
+ ACPI_MEMSET (Object, 0xCA, Cache->ObjectSize);
+ ACPI_SET_DESCRIPTOR_TYPE (Object, ACPI_DESC_TYPE_CACHED);
+
+ /* Put the object at the head of the cache list */
+
+ * (ACPI_CAST_INDIRECT_PTR (char,
+ &(((char *) Object)[Cache->LinkOffset]))) = Cache->ListHead;
+ Cache->ListHead = Object;
+ Cache->CurrentDepth++;
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES);
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiOsAcquireObject
+ *
+ * PARAMETERS: Cache - Handle to cache object
+ *
+ * RETURN: the acquired object. NULL on error
+ *
+ * DESCRIPTION: Get an object from the specified cache. If cache is empty,
+ * the object is allocated.
+ *
+ ******************************************************************************/
+
+void *
+AcpiOsAcquireObject (
+ ACPI_MEMORY_LIST *Cache)
+{
+ ACPI_STATUS Status;
+ void *Object;
+
+
+ ACPI_FUNCTION_NAME (OsAcquireObject);
+
+
+ if (!Cache)
+ {
+ return (NULL);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
+ if (ACPI_FAILURE (Status))
+ {
+ return (NULL);
+ }
+
+ ACPI_MEM_TRACKING (Cache->Requests++);
+
+ /* Check the cache first */
+
+ if (Cache->ListHead)
+ {
+ /* There is an object available, use it */
+
+ Object = Cache->ListHead;
+ Cache->ListHead = *(ACPI_CAST_INDIRECT_PTR (char,
+ &(((char *) Object)[Cache->LinkOffset])));
+
+ Cache->CurrentDepth--;
+
+ ACPI_MEM_TRACKING (Cache->Hits++);
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "Object %p from %s cache\n", Object, Cache->ListName));
+
+ Status = AcpiUtReleaseMutex (ACPI_MTX_CACHES);
+ if (ACPI_FAILURE (Status))
+ {
+ return (NULL);
+ }
+
+ /* Clear (zero) the previously used Object */
+
+ ACPI_MEMSET (Object, 0, Cache->ObjectSize);
+ }
+ else
+ {
+ /* The cache is empty, create a new object */
+
+ ACPI_MEM_TRACKING (Cache->TotalAllocated++);
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+ if ((Cache->TotalAllocated - Cache->TotalFreed) > Cache->MaxOccupied)
+ {
+ Cache->MaxOccupied = Cache->TotalAllocated - Cache->TotalFreed;
+ }
+#endif
+
+ /* Avoid deadlock with ACPI_ALLOCATE_ZEROED */
+
+ Status = AcpiUtReleaseMutex (ACPI_MTX_CACHES);
+ if (ACPI_FAILURE (Status))
+ {
+ return (NULL);
+ }
+
+ Object = ACPI_ALLOCATE_ZEROED (Cache->ObjectSize);
+ if (!Object)
+ {
+ return (NULL);
+ }
+ }
+
+ return (Object);
+}
+#endif /* ACPI_USE_LOCAL_CACHE */
+
+
diff --git a/sys/contrib/dev/acpica/utclib.c b/sys/contrib/dev/acpica/utclib.c
new file mode 100644
index 0000000..77e0d0e
--- /dev/null
+++ b/sys/contrib/dev/acpica/utclib.c
@@ -0,0 +1,961 @@
+/******************************************************************************
+ *
+ * Module Name: cmclib - Local implementation of C library functions
+ * $Revision: 1.60 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __CMCLIB_C__
+
+#include <contrib/dev/acpica/acpi.h>
+
+/*
+ * These implementations of standard C Library routines can optionally be
+ * used if a C library is not available. In general, they are less efficient
+ * than an inline or assembly implementation
+ */
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("cmclib")
+
+
+#ifndef ACPI_USE_SYSTEM_CLIBRARY
+
+#define NEGATIVE 1
+#define POSITIVE 0
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtMemcmp (memcmp)
+ *
+ * PARAMETERS: Buffer1 - First Buffer
+ * Buffer2 - Second Buffer
+ * Count - Maximum # of bytes to compare
+ *
+ * RETURN: Index where Buffers mismatched, or 0 if Buffers matched
+ *
+ * DESCRIPTION: Compare two Buffers, with a maximum length
+ *
+ ******************************************************************************/
+
+int
+AcpiUtMemcmp (
+ const char *Buffer1,
+ const char *Buffer2,
+ ACPI_SIZE Count)
+{
+
+ for ( ; Count-- && (*Buffer1 == *Buffer2); Buffer1++, Buffer2++)
+ {
+ }
+
+ return ((Count == ACPI_SIZE_MAX) ? 0 : ((unsigned char) *Buffer1 -
+ (unsigned char) *Buffer2));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtMemcpy (memcpy)
+ *
+ * PARAMETERS: Dest - Target of the copy
+ * Src - Source buffer to copy
+ * Count - Number of bytes to copy
+ *
+ * RETURN: Dest
+ *
+ * DESCRIPTION: Copy arbitrary bytes of memory
+ *
+ ******************************************************************************/
+
+void *
+AcpiUtMemcpy (
+ void *Dest,
+ const void *Src,
+ ACPI_SIZE Count)
+{
+ char *New = (char *) Dest;
+ char *Old = (char *) Src;
+
+
+ while (Count)
+ {
+ *New = *Old;
+ New++;
+ Old++;
+ Count--;
+ }
+
+ return (Dest);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtMemset (memset)
+ *
+ * PARAMETERS: Dest - Buffer to set
+ * Value - Value to set each byte of memory
+ * Count - Number of bytes to set
+ *
+ * RETURN: Dest
+ *
+ * DESCRIPTION: Initialize a buffer to a known value.
+ *
+ ******************************************************************************/
+
+void *
+AcpiUtMemset (
+ void *Dest,
+ ACPI_NATIVE_UINT Value,
+ ACPI_SIZE Count)
+{
+ char *New = (char *) Dest;
+
+
+ while (Count)
+ {
+ *New = (char) Value;
+ New++;
+ Count--;
+ }
+
+ return (Dest);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrlen (strlen)
+ *
+ * PARAMETERS: String - Null terminated string
+ *
+ * RETURN: Length
+ *
+ * DESCRIPTION: Returns the length of the input string
+ *
+ ******************************************************************************/
+
+
+ACPI_SIZE
+AcpiUtStrlen (
+ const char *String)
+{
+ UINT32 Length = 0;
+
+
+ /* Count the string until a null is encountered */
+
+ while (*String)
+ {
+ Length++;
+ String++;
+ }
+
+ return (Length);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrcpy (strcpy)
+ *
+ * PARAMETERS: DstString - Target of the copy
+ * SrcString - The source string to copy
+ *
+ * RETURN: DstString
+ *
+ * DESCRIPTION: Copy a null terminated string
+ *
+ ******************************************************************************/
+
+char *
+AcpiUtStrcpy (
+ char *DstString,
+ const char *SrcString)
+{
+ char *String = DstString;
+
+
+ /* Move bytes brute force */
+
+ while (*SrcString)
+ {
+ *String = *SrcString;
+
+ String++;
+ SrcString++;
+ }
+
+ /* Null terminate */
+
+ *String = 0;
+ return (DstString);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrncpy (strncpy)
+ *
+ * PARAMETERS: DstString - Target of the copy
+ * SrcString - The source string to copy
+ * Count - Maximum # of bytes to copy
+ *
+ * RETURN: DstString
+ *
+ * DESCRIPTION: Copy a null terminated string, with a maximum length
+ *
+ ******************************************************************************/
+
+char *
+AcpiUtStrncpy (
+ char *DstString,
+ const char *SrcString,
+ ACPI_SIZE Count)
+{
+ char *String = DstString;
+
+
+ /* Copy the string */
+
+ for (String = DstString;
+ Count && (Count--, (*String++ = *SrcString++)); )
+ {;}
+
+ /* Pad with nulls if necessary */
+
+ while (Count--)
+ {
+ *String = 0;
+ String++;
+ }
+
+ /* Return original pointer */
+
+ return (DstString);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrcmp (strcmp)
+ *
+ * PARAMETERS: String1 - First string
+ * String2 - Second string
+ *
+ * RETURN: Index where strings mismatched, or 0 if strings matched
+ *
+ * DESCRIPTION: Compare two null terminated strings
+ *
+ ******************************************************************************/
+
+int
+AcpiUtStrcmp (
+ const char *String1,
+ const char *String2)
+{
+
+
+ for ( ; (*String1 == *String2); String2++)
+ {
+ if (!*String1++)
+ {
+ return (0);
+ }
+ }
+
+ return ((unsigned char) *String1 - (unsigned char) *String2);
+}
+
+
+#ifdef ACPI_FUTURE_IMPLEMENTATION
+/* Not used at this time */
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrchr (strchr)
+ *
+ * PARAMETERS: String - Search string
+ * ch - character to search for
+ *
+ * RETURN: Ptr to char or NULL if not found
+ *
+ * DESCRIPTION: Search a string for a character
+ *
+ ******************************************************************************/
+
+char *
+AcpiUtStrchr (
+ const char *String,
+ int ch)
+{
+
+
+ for ( ; (*String); String++)
+ {
+ if ((*String) == (char) ch)
+ {
+ return ((char *) String);
+ }
+ }
+
+ return (NULL);
+}
+#endif
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrncmp (strncmp)
+ *
+ * PARAMETERS: String1 - First string
+ * String2 - Second string
+ * Count - Maximum # of bytes to compare
+ *
+ * RETURN: Index where strings mismatched, or 0 if strings matched
+ *
+ * DESCRIPTION: Compare two null terminated strings, with a maximum length
+ *
+ ******************************************************************************/
+
+int
+AcpiUtStrncmp (
+ const char *String1,
+ const char *String2,
+ ACPI_SIZE Count)
+{
+
+
+ for ( ; Count-- && (*String1 == *String2); String2++)
+ {
+ if (!*String1++)
+ {
+ return (0);
+ }
+ }
+
+ return ((Count == ACPI_SIZE_MAX) ? 0 : ((unsigned char) *String1 -
+ (unsigned char) *String2));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrcat (Strcat)
+ *
+ * PARAMETERS: DstString - Target of the copy
+ * SrcString - The source string to copy
+ *
+ * RETURN: DstString
+ *
+ * DESCRIPTION: Append a null terminated string to a null terminated string
+ *
+ ******************************************************************************/
+
+char *
+AcpiUtStrcat (
+ char *DstString,
+ const char *SrcString)
+{
+ char *String;
+
+
+ /* Find end of the destination string */
+
+ for (String = DstString; *String++; )
+ { ; }
+
+ /* Concatenate the string */
+
+ for (--String; (*String++ = *SrcString++); )
+ { ; }
+
+ return (DstString);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrncat (strncat)
+ *
+ * PARAMETERS: DstString - Target of the copy
+ * SrcString - The source string to copy
+ * Count - Maximum # of bytes to copy
+ *
+ * RETURN: DstString
+ *
+ * DESCRIPTION: Append a null terminated string to a null terminated string,
+ * with a maximum count.
+ *
+ ******************************************************************************/
+
+char *
+AcpiUtStrncat (
+ char *DstString,
+ const char *SrcString,
+ ACPI_SIZE Count)
+{
+ char *String;
+
+
+ if (Count)
+ {
+ /* Find end of the destination string */
+
+ for (String = DstString; *String++; )
+ { ; }
+
+ /* Concatenate the string */
+
+ for (--String; (*String++ = *SrcString++) && --Count; )
+ { ; }
+
+ /* Null terminate if necessary */
+
+ if (!Count)
+ {
+ *String = 0;
+ }
+ }
+
+ return (DstString);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrstr (strstr)
+ *
+ * PARAMETERS: String1 - Target string
+ * String2 - Substring to search for
+ *
+ * RETURN: Where substring match starts, Null if no match found
+ *
+ * DESCRIPTION: Checks if String2 occurs in String1. This is not really a
+ * full implementation of strstr, only sufficient for command
+ * matching
+ *
+ ******************************************************************************/
+
+char *
+AcpiUtStrstr (
+ char *String1,
+ char *String2)
+{
+ char *String;
+
+
+ if (AcpiUtStrlen (String2) > AcpiUtStrlen (String1))
+ {
+ return (NULL);
+ }
+
+ /* Walk entire string, comparing the letters */
+
+ for (String = String1; *String2; )
+ {
+ if (*String2 != *String)
+ {
+ return (NULL);
+ }
+
+ String2++;
+ String++;
+ }
+
+ return (String1);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrtoul (strtoul)
+ *
+ * PARAMETERS: String - Null terminated string
+ * Terminater - Where a pointer to the terminating byte is
+ * returned
+ * Base - Radix of the string
+ *
+ * RETURN: Converted value
+ *
+ * DESCRIPTION: Convert a string into a 32-bit unsigned value.
+ * Note: use AcpiUtStrtoul64 for 64-bit integers.
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiUtStrtoul (
+ const char *String,
+ char **Terminator,
+ UINT32 Base)
+{
+ UINT32 converted = 0;
+ UINT32 index;
+ UINT32 sign;
+ const char *StringStart;
+ UINT32 ReturnValue = 0;
+ ACPI_STATUS Status = AE_OK;
+
+
+ /*
+ * Save the value of the pointer to the buffer's first
+ * character, save the current errno value, and then
+ * skip over any white space in the buffer:
+ */
+ StringStart = String;
+ while (ACPI_IS_SPACE (*String) || *String == '\t')
+ {
+ ++String;
+ }
+
+ /*
+ * The buffer may contain an optional plus or minus sign.
+ * If it does, then skip over it but remember what is was:
+ */
+ if (*String == '-')
+ {
+ sign = NEGATIVE;
+ ++String;
+ }
+ else if (*String == '+')
+ {
+ ++String;
+ sign = POSITIVE;
+ }
+ else
+ {
+ sign = POSITIVE;
+ }
+
+ /*
+ * If the input parameter Base is zero, then we need to
+ * determine if it is octal, decimal, or hexadecimal:
+ */
+ if (Base == 0)
+ {
+ if (*String == '0')
+ {
+ if (AcpiUtToLower (*(++String)) == 'x')
+ {
+ Base = 16;
+ ++String;
+ }
+ else
+ {
+ Base = 8;
+ }
+ }
+ else
+ {
+ Base = 10;
+ }
+ }
+ else if (Base < 2 || Base > 36)
+ {
+ /*
+ * The specified Base parameter is not in the domain of
+ * this function:
+ */
+ goto done;
+ }
+
+ /*
+ * For octal and hexadecimal bases, skip over the leading
+ * 0 or 0x, if they are present.
+ */
+ if (Base == 8 && *String == '0')
+ {
+ String++;
+ }
+
+ if (Base == 16 &&
+ *String == '0' &&
+ AcpiUtToLower (*(++String)) == 'x')
+ {
+ String++;
+ }
+
+ /*
+ * Main loop: convert the string to an unsigned long:
+ */
+ while (*String)
+ {
+ if (ACPI_IS_DIGIT (*String))
+ {
+ index = (UINT32) ((UINT8) *String - '0');
+ }
+ else
+ {
+ index = (UINT32) AcpiUtToUpper (*String);
+ if (ACPI_IS_UPPER (index))
+ {
+ index = index - 'A' + 10;
+ }
+ else
+ {
+ goto done;
+ }
+ }
+
+ if (index >= Base)
+ {
+ goto done;
+ }
+
+ /*
+ * Check to see if value is out of range:
+ */
+
+ if (ReturnValue > ((ACPI_UINT32_MAX - (UINT32) index) /
+ (UINT32) Base))
+ {
+ Status = AE_ERROR;
+ ReturnValue = 0; /* reset */
+ }
+ else
+ {
+ ReturnValue *= Base;
+ ReturnValue += index;
+ converted = 1;
+ }
+
+ ++String;
+ }
+
+done:
+ /*
+ * If appropriate, update the caller's pointer to the next
+ * unconverted character in the buffer.
+ */
+ if (Terminator)
+ {
+ if (converted == 0 && ReturnValue == 0 && String != NULL)
+ {
+ *Terminator = (char *) StringStart;
+ }
+ else
+ {
+ *Terminator = (char *) String;
+ }
+ }
+
+ if (Status == AE_ERROR)
+ {
+ ReturnValue = ACPI_UINT32_MAX;
+ }
+
+ /*
+ * If a minus sign was present, then "the conversion is negated":
+ */
+ if (sign == NEGATIVE)
+ {
+ ReturnValue = (ACPI_UINT32_MAX - ReturnValue) + 1;
+ }
+
+ return (ReturnValue);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtToUpper (TOUPPER)
+ *
+ * PARAMETERS: c - Character to convert
+ *
+ * RETURN: Converted character as an int
+ *
+ * DESCRIPTION: Convert character to uppercase
+ *
+ ******************************************************************************/
+
+int
+AcpiUtToUpper (
+ int c)
+{
+
+ return (ACPI_IS_LOWER(c) ? ((c)-0x20) : (c));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtToLower (TOLOWER)
+ *
+ * PARAMETERS: c - Character to convert
+ *
+ * RETURN: Converted character as an int
+ *
+ * DESCRIPTION: Convert character to lowercase
+ *
+ ******************************************************************************/
+
+int
+AcpiUtToLower (
+ int c)
+{
+
+ return (ACPI_IS_UPPER(c) ? ((c)+0x20) : (c));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: is* functions
+ *
+ * DESCRIPTION: is* functions use the ctype table below
+ *
+ ******************************************************************************/
+
+const UINT8 _acpi_ctype[257] = {
+ _ACPI_CN, /* 0x0 0. */
+ _ACPI_CN, /* 0x1 1. */
+ _ACPI_CN, /* 0x2 2. */
+ _ACPI_CN, /* 0x3 3. */
+ _ACPI_CN, /* 0x4 4. */
+ _ACPI_CN, /* 0x5 5. */
+ _ACPI_CN, /* 0x6 6. */
+ _ACPI_CN, /* 0x7 7. */
+ _ACPI_CN, /* 0x8 8. */
+ _ACPI_CN|_ACPI_SP, /* 0x9 9. */
+ _ACPI_CN|_ACPI_SP, /* 0xA 10. */
+ _ACPI_CN|_ACPI_SP, /* 0xB 11. */
+ _ACPI_CN|_ACPI_SP, /* 0xC 12. */
+ _ACPI_CN|_ACPI_SP, /* 0xD 13. */
+ _ACPI_CN, /* 0xE 14. */
+ _ACPI_CN, /* 0xF 15. */
+ _ACPI_CN, /* 0x10 16. */
+ _ACPI_CN, /* 0x11 17. */
+ _ACPI_CN, /* 0x12 18. */
+ _ACPI_CN, /* 0x13 19. */
+ _ACPI_CN, /* 0x14 20. */
+ _ACPI_CN, /* 0x15 21. */
+ _ACPI_CN, /* 0x16 22. */
+ _ACPI_CN, /* 0x17 23. */
+ _ACPI_CN, /* 0x18 24. */
+ _ACPI_CN, /* 0x19 25. */
+ _ACPI_CN, /* 0x1A 26. */
+ _ACPI_CN, /* 0x1B 27. */
+ _ACPI_CN, /* 0x1C 28. */
+ _ACPI_CN, /* 0x1D 29. */
+ _ACPI_CN, /* 0x1E 30. */
+ _ACPI_CN, /* 0x1F 31. */
+ _ACPI_XS|_ACPI_SP, /* 0x20 32. ' ' */
+ _ACPI_PU, /* 0x21 33. '!' */
+ _ACPI_PU, /* 0x22 34. '"' */
+ _ACPI_PU, /* 0x23 35. '#' */
+ _ACPI_PU, /* 0x24 36. '$' */
+ _ACPI_PU, /* 0x25 37. '%' */
+ _ACPI_PU, /* 0x26 38. '&' */
+ _ACPI_PU, /* 0x27 39. ''' */
+ _ACPI_PU, /* 0x28 40. '(' */
+ _ACPI_PU, /* 0x29 41. ')' */
+ _ACPI_PU, /* 0x2A 42. '*' */
+ _ACPI_PU, /* 0x2B 43. '+' */
+ _ACPI_PU, /* 0x2C 44. ',' */
+ _ACPI_PU, /* 0x2D 45. '-' */
+ _ACPI_PU, /* 0x2E 46. '.' */
+ _ACPI_PU, /* 0x2F 47. '/' */
+ _ACPI_XD|_ACPI_DI, /* 0x30 48. '0' */
+ _ACPI_XD|_ACPI_DI, /* 0x31 49. '1' */
+ _ACPI_XD|_ACPI_DI, /* 0x32 50. '2' */
+ _ACPI_XD|_ACPI_DI, /* 0x33 51. '3' */
+ _ACPI_XD|_ACPI_DI, /* 0x34 52. '4' */
+ _ACPI_XD|_ACPI_DI, /* 0x35 53. '5' */
+ _ACPI_XD|_ACPI_DI, /* 0x36 54. '6' */
+ _ACPI_XD|_ACPI_DI, /* 0x37 55. '7' */
+ _ACPI_XD|_ACPI_DI, /* 0x38 56. '8' */
+ _ACPI_XD|_ACPI_DI, /* 0x39 57. '9' */
+ _ACPI_PU, /* 0x3A 58. ':' */
+ _ACPI_PU, /* 0x3B 59. ';' */
+ _ACPI_PU, /* 0x3C 60. '<' */
+ _ACPI_PU, /* 0x3D 61. '=' */
+ _ACPI_PU, /* 0x3E 62. '>' */
+ _ACPI_PU, /* 0x3F 63. '?' */
+ _ACPI_PU, /* 0x40 64. '@' */
+ _ACPI_XD|_ACPI_UP, /* 0x41 65. 'A' */
+ _ACPI_XD|_ACPI_UP, /* 0x42 66. 'B' */
+ _ACPI_XD|_ACPI_UP, /* 0x43 67. 'C' */
+ _ACPI_XD|_ACPI_UP, /* 0x44 68. 'D' */
+ _ACPI_XD|_ACPI_UP, /* 0x45 69. 'E' */
+ _ACPI_XD|_ACPI_UP, /* 0x46 70. 'F' */
+ _ACPI_UP, /* 0x47 71. 'G' */
+ _ACPI_UP, /* 0x48 72. 'H' */
+ _ACPI_UP, /* 0x49 73. 'I' */
+ _ACPI_UP, /* 0x4A 74. 'J' */
+ _ACPI_UP, /* 0x4B 75. 'K' */
+ _ACPI_UP, /* 0x4C 76. 'L' */
+ _ACPI_UP, /* 0x4D 77. 'M' */
+ _ACPI_UP, /* 0x4E 78. 'N' */
+ _ACPI_UP, /* 0x4F 79. 'O' */
+ _ACPI_UP, /* 0x50 80. 'P' */
+ _ACPI_UP, /* 0x51 81. 'Q' */
+ _ACPI_UP, /* 0x52 82. 'R' */
+ _ACPI_UP, /* 0x53 83. 'S' */
+ _ACPI_UP, /* 0x54 84. 'T' */
+ _ACPI_UP, /* 0x55 85. 'U' */
+ _ACPI_UP, /* 0x56 86. 'V' */
+ _ACPI_UP, /* 0x57 87. 'W' */
+ _ACPI_UP, /* 0x58 88. 'X' */
+ _ACPI_UP, /* 0x59 89. 'Y' */
+ _ACPI_UP, /* 0x5A 90. 'Z' */
+ _ACPI_PU, /* 0x5B 91. '[' */
+ _ACPI_PU, /* 0x5C 92. '\' */
+ _ACPI_PU, /* 0x5D 93. ']' */
+ _ACPI_PU, /* 0x5E 94. '^' */
+ _ACPI_PU, /* 0x5F 95. '_' */
+ _ACPI_PU, /* 0x60 96. '`' */
+ _ACPI_XD|_ACPI_LO, /* 0x61 97. 'a' */
+ _ACPI_XD|_ACPI_LO, /* 0x62 98. 'b' */
+ _ACPI_XD|_ACPI_LO, /* 0x63 99. 'c' */
+ _ACPI_XD|_ACPI_LO, /* 0x64 100. 'd' */
+ _ACPI_XD|_ACPI_LO, /* 0x65 101. 'e' */
+ _ACPI_XD|_ACPI_LO, /* 0x66 102. 'f' */
+ _ACPI_LO, /* 0x67 103. 'g' */
+ _ACPI_LO, /* 0x68 104. 'h' */
+ _ACPI_LO, /* 0x69 105. 'i' */
+ _ACPI_LO, /* 0x6A 106. 'j' */
+ _ACPI_LO, /* 0x6B 107. 'k' */
+ _ACPI_LO, /* 0x6C 108. 'l' */
+ _ACPI_LO, /* 0x6D 109. 'm' */
+ _ACPI_LO, /* 0x6E 110. 'n' */
+ _ACPI_LO, /* 0x6F 111. 'o' */
+ _ACPI_LO, /* 0x70 112. 'p' */
+ _ACPI_LO, /* 0x71 113. 'q' */
+ _ACPI_LO, /* 0x72 114. 'r' */
+ _ACPI_LO, /* 0x73 115. 's' */
+ _ACPI_LO, /* 0x74 116. 't' */
+ _ACPI_LO, /* 0x75 117. 'u' */
+ _ACPI_LO, /* 0x76 118. 'v' */
+ _ACPI_LO, /* 0x77 119. 'w' */
+ _ACPI_LO, /* 0x78 120. 'x' */
+ _ACPI_LO, /* 0x79 121. 'y' */
+ _ACPI_LO, /* 0x7A 122. 'z' */
+ _ACPI_PU, /* 0x7B 123. '{' */
+ _ACPI_PU, /* 0x7C 124. '|' */
+ _ACPI_PU, /* 0x7D 125. '}' */
+ _ACPI_PU, /* 0x7E 126. '~' */
+ _ACPI_CN, /* 0x7F 127. */
+
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x80 to 0x8F */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0x90 to 0x9F */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xA0 to 0xAF */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xB0 to 0xBF */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xC0 to 0xCF */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xD0 to 0xDF */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, /* 0xE0 to 0xEF */
+ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 /* 0xF0 to 0x100 */
+};
+
+
+#endif /* ACPI_USE_SYSTEM_CLIBRARY */
+
diff --git a/sys/contrib/dev/acpica/utcopy.c b/sys/contrib/dev/acpica/utcopy.c
new file mode 100644
index 0000000..2d4072c
--- /dev/null
+++ b/sys/contrib/dev/acpica/utcopy.c
@@ -0,0 +1,1091 @@
+/******************************************************************************
+ *
+ * Module Name: utcopy - Internal to external object translation utilities
+ * $Revision: 1.130 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __UTCOPY_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utcopy")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiUtCopyIsimpleToEsimple (
+ ACPI_OPERAND_OBJECT *InternalObject,
+ ACPI_OBJECT *ExternalObject,
+ UINT8 *DataSpace,
+ ACPI_SIZE *BufferSpaceUsed);
+
+static ACPI_STATUS
+AcpiUtCopyIelementToIelement (
+ UINT8 ObjectType,
+ ACPI_OPERAND_OBJECT *SourceObject,
+ ACPI_GENERIC_STATE *State,
+ void *Context);
+
+static ACPI_STATUS
+AcpiUtCopyIpackageToEpackage (
+ ACPI_OPERAND_OBJECT *InternalObject,
+ UINT8 *Buffer,
+ ACPI_SIZE *SpaceUsed);
+
+static ACPI_STATUS
+AcpiUtCopyEsimpleToIsimple(
+ ACPI_OBJECT *UserObj,
+ ACPI_OPERAND_OBJECT **ReturnObj);
+
+static ACPI_STATUS
+AcpiUtCopySimpleObject (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *DestDesc);
+
+static ACPI_STATUS
+AcpiUtCopyIelementToEelement (
+ UINT8 ObjectType,
+ ACPI_OPERAND_OBJECT *SourceObject,
+ ACPI_GENERIC_STATE *State,
+ void *Context);
+
+static ACPI_STATUS
+AcpiUtCopyIpackageToIpackage (
+ ACPI_OPERAND_OBJECT *SourceObj,
+ ACPI_OPERAND_OBJECT *DestObj,
+ ACPI_WALK_STATE *WalkState);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyIsimpleToEsimple
+ *
+ * PARAMETERS: InternalObject - Source object to be copied
+ * ExternalObject - Where to return the copied object
+ * DataSpace - Where object data is returned (such as
+ * buffer and string data)
+ * BufferSpaceUsed - Length of DataSpace that was used
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to copy a simple internal object to
+ * an external object.
+ *
+ * The DataSpace buffer is assumed to have sufficient space for
+ * the object.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtCopyIsimpleToEsimple (
+ ACPI_OPERAND_OBJECT *InternalObject,
+ ACPI_OBJECT *ExternalObject,
+ UINT8 *DataSpace,
+ ACPI_SIZE *BufferSpaceUsed)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (UtCopyIsimpleToEsimple);
+
+
+ *BufferSpaceUsed = 0;
+
+ /*
+ * Check for NULL object case (could be an uninitialized
+ * package element)
+ */
+ if (!InternalObject)
+ {
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Always clear the external object */
+
+ ACPI_MEMSET (ExternalObject, 0, sizeof (ACPI_OBJECT));
+
+ /*
+ * In general, the external object will be the same type as
+ * the internal object
+ */
+ ExternalObject->Type = ACPI_GET_OBJECT_TYPE (InternalObject);
+
+ /* However, only a limited number of external types are supported */
+
+ switch (ACPI_GET_OBJECT_TYPE (InternalObject))
+ {
+ case ACPI_TYPE_STRING:
+
+ ExternalObject->String.Pointer = (char *) DataSpace;
+ ExternalObject->String.Length = InternalObject->String.Length;
+ *BufferSpaceUsed = ACPI_ROUND_UP_TO_NATIVE_WORD (
+ (ACPI_SIZE) InternalObject->String.Length + 1);
+
+ ACPI_MEMCPY ((void *) DataSpace,
+ (void *) InternalObject->String.Pointer,
+ (ACPI_SIZE) InternalObject->String.Length + 1);
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ ExternalObject->Buffer.Pointer = DataSpace;
+ ExternalObject->Buffer.Length = InternalObject->Buffer.Length;
+ *BufferSpaceUsed = ACPI_ROUND_UP_TO_NATIVE_WORD (
+ InternalObject->String.Length);
+
+ ACPI_MEMCPY ((void *) DataSpace,
+ (void *) InternalObject->Buffer.Pointer,
+ InternalObject->Buffer.Length);
+ break;
+
+
+ case ACPI_TYPE_INTEGER:
+
+ ExternalObject->Integer.Value = InternalObject->Integer.Value;
+ break;
+
+
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ /*
+ * This is an object reference. Attempt to dereference it.
+ */
+ switch (InternalObject->Reference.Opcode)
+ {
+ case AML_INT_NAMEPATH_OP:
+
+ /* For namepath, return the object handle ("reference") */
+
+ default:
+ /*
+ * Use the object type of "Any" to indicate a reference
+ * to object containing a handle to an ACPI named object.
+ */
+ ExternalObject->Type = ACPI_TYPE_ANY;
+ ExternalObject->Reference.Handle = InternalObject->Reference.Node;
+ break;
+ }
+ break;
+
+
+ case ACPI_TYPE_PROCESSOR:
+
+ ExternalObject->Processor.ProcId = InternalObject->Processor.ProcId;
+ ExternalObject->Processor.PblkAddress = InternalObject->Processor.Address;
+ ExternalObject->Processor.PblkLength = InternalObject->Processor.Length;
+ break;
+
+
+ case ACPI_TYPE_POWER:
+
+ ExternalObject->PowerResource.SystemLevel =
+ InternalObject->PowerResource.SystemLevel;
+
+ ExternalObject->PowerResource.ResourceOrder =
+ InternalObject->PowerResource.ResourceOrder;
+ break;
+
+
+ default:
+ /*
+ * There is no corresponding external object type
+ */
+ return_ACPI_STATUS (AE_SUPPORT);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyIelementToEelement
+ *
+ * PARAMETERS: ACPI_PKG_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Copy one package element to another package element
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtCopyIelementToEelement (
+ UINT8 ObjectType,
+ ACPI_OPERAND_OBJECT *SourceObject,
+ ACPI_GENERIC_STATE *State,
+ void *Context)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_PKG_INFO *Info = (ACPI_PKG_INFO *) Context;
+ ACPI_SIZE ObjectSpace;
+ UINT32 ThisIndex;
+ ACPI_OBJECT *TargetObject;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ ThisIndex = State->Pkg.Index;
+ TargetObject = (ACPI_OBJECT *)
+ &((ACPI_OBJECT *)(State->Pkg.DestObject))->Package.Elements[ThisIndex];
+
+ switch (ObjectType)
+ {
+ case ACPI_COPY_TYPE_SIMPLE:
+
+ /*
+ * This is a simple or null object
+ */
+ Status = AcpiUtCopyIsimpleToEsimple (SourceObject,
+ TargetObject, Info->FreeSpace, &ObjectSpace);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ break;
+
+
+ case ACPI_COPY_TYPE_PACKAGE:
+
+ /*
+ * Build the package object
+ */
+ TargetObject->Type = ACPI_TYPE_PACKAGE;
+ TargetObject->Package.Count = SourceObject->Package.Count;
+ TargetObject->Package.Elements =
+ ACPI_CAST_PTR (ACPI_OBJECT, Info->FreeSpace);
+
+ /*
+ * Pass the new package object back to the package walk routine
+ */
+ State->Pkg.ThisTargetObj = TargetObject;
+
+ /*
+ * Save space for the array of objects (Package elements)
+ * update the buffer length counter
+ */
+ ObjectSpace = ACPI_ROUND_UP_TO_NATIVE_WORD (
+ (ACPI_SIZE) TargetObject->Package.Count *
+ sizeof (ACPI_OBJECT));
+ break;
+
+
+ default:
+ return (AE_BAD_PARAMETER);
+ }
+
+ Info->FreeSpace += ObjectSpace;
+ Info->Length += ObjectSpace;
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyIpackageToEpackage
+ *
+ * PARAMETERS: InternalObject - Pointer to the object we are returning
+ * Buffer - Where the object is returned
+ * SpaceUsed - Where the object length is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to place a package object in a user
+ * buffer. A package object by definition contains other objects.
+ *
+ * The buffer is assumed to have sufficient space for the object.
+ * The caller must have verified the buffer length needed using the
+ * AcpiUtGetObjectSize function before calling this function.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtCopyIpackageToEpackage (
+ ACPI_OPERAND_OBJECT *InternalObject,
+ UINT8 *Buffer,
+ ACPI_SIZE *SpaceUsed)
+{
+ ACPI_OBJECT *ExternalObject;
+ ACPI_STATUS Status;
+ ACPI_PKG_INFO Info;
+
+
+ ACPI_FUNCTION_TRACE (UtCopyIpackageToEpackage);
+
+
+ /*
+ * First package at head of the buffer
+ */
+ ExternalObject = ACPI_CAST_PTR (ACPI_OBJECT, Buffer);
+
+ /*
+ * Free space begins right after the first package
+ */
+ Info.Length = ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));
+ Info.FreeSpace = Buffer + ACPI_ROUND_UP_TO_NATIVE_WORD (
+ sizeof (ACPI_OBJECT));
+ Info.ObjectSpace = 0;
+ Info.NumPackages = 1;
+
+ ExternalObject->Type = ACPI_GET_OBJECT_TYPE (InternalObject);
+ ExternalObject->Package.Count = InternalObject->Package.Count;
+ ExternalObject->Package.Elements = ACPI_CAST_PTR (ACPI_OBJECT,
+ Info.FreeSpace);
+
+ /*
+ * Leave room for an array of ACPI_OBJECTS in the buffer
+ * and move the free space past it
+ */
+ Info.Length += (ACPI_SIZE) ExternalObject->Package.Count *
+ ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));
+ Info.FreeSpace += ExternalObject->Package.Count *
+ ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT));
+
+ Status = AcpiUtWalkPackageTree (InternalObject, ExternalObject,
+ AcpiUtCopyIelementToEelement, &Info);
+
+ *SpaceUsed = Info.Length;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyIobjectToEobject
+ *
+ * PARAMETERS: InternalObject - The internal object to be converted
+ * BufferPtr - Where the object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to build an API object to be returned to
+ * the caller.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtCopyIobjectToEobject (
+ ACPI_OPERAND_OBJECT *InternalObject,
+ ACPI_BUFFER *RetBuffer)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (UtCopyIobjectToEobject);
+
+
+ if (ACPI_GET_OBJECT_TYPE (InternalObject) == ACPI_TYPE_PACKAGE)
+ {
+ /*
+ * Package object: Copy all subobjects (including
+ * nested packages)
+ */
+ Status = AcpiUtCopyIpackageToEpackage (InternalObject,
+ RetBuffer->Pointer, &RetBuffer->Length);
+ }
+ else
+ {
+ /*
+ * Build a simple object (no nested objects)
+ */
+ Status = AcpiUtCopyIsimpleToEsimple (InternalObject,
+ ACPI_CAST_PTR (ACPI_OBJECT, RetBuffer->Pointer),
+ ACPI_ADD_PTR (UINT8, RetBuffer->Pointer,
+ ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT))),
+ &RetBuffer->Length);
+ /*
+ * build simple does not include the object size in the length
+ * so we add it in here
+ */
+ RetBuffer->Length += sizeof (ACPI_OBJECT);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyEsimpleToIsimple
+ *
+ * PARAMETERS: ExternalObject - The external object to be converted
+ * RetInternalObject - Where the internal object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function copies an external object to an internal one.
+ * NOTE: Pointers can be copied, we don't need to copy data.
+ * (The pointers have to be valid in our address space no matter
+ * what we do with them!)
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtCopyEsimpleToIsimple (
+ ACPI_OBJECT *ExternalObject,
+ ACPI_OPERAND_OBJECT **RetInternalObject)
+{
+ ACPI_OPERAND_OBJECT *InternalObject;
+
+
+ ACPI_FUNCTION_TRACE (UtCopyEsimpleToIsimple);
+
+
+ /*
+ * Simple types supported are: String, Buffer, Integer
+ */
+ switch (ExternalObject->Type)
+ {
+ case ACPI_TYPE_STRING:
+ case ACPI_TYPE_BUFFER:
+ case ACPI_TYPE_INTEGER:
+
+ InternalObject = AcpiUtCreateInternalObject (
+ (UINT8) ExternalObject->Type);
+ if (!InternalObject)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+ break;
+
+ default:
+ /* All other types are not supported */
+
+ return_ACPI_STATUS (AE_SUPPORT);
+ }
+
+
+ /* Must COPY string and buffer contents */
+
+ switch (ExternalObject->Type)
+ {
+ case ACPI_TYPE_STRING:
+
+ InternalObject->String.Pointer =
+ ACPI_ALLOCATE_ZEROED ((ACPI_SIZE) ExternalObject->String.Length + 1);
+ if (!InternalObject->String.Pointer)
+ {
+ goto ErrorExit;
+ }
+
+ ACPI_MEMCPY (InternalObject->String.Pointer,
+ ExternalObject->String.Pointer,
+ ExternalObject->String.Length);
+
+ InternalObject->String.Length = ExternalObject->String.Length;
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ InternalObject->Buffer.Pointer =
+ ACPI_ALLOCATE_ZEROED (ExternalObject->Buffer.Length);
+ if (!InternalObject->Buffer.Pointer)
+ {
+ goto ErrorExit;
+ }
+
+ ACPI_MEMCPY (InternalObject->Buffer.Pointer,
+ ExternalObject->Buffer.Pointer,
+ ExternalObject->Buffer.Length);
+
+ InternalObject->Buffer.Length = ExternalObject->Buffer.Length;
+ break;
+
+
+ case ACPI_TYPE_INTEGER:
+
+ InternalObject->Integer.Value = ExternalObject->Integer.Value;
+ break;
+
+ default:
+ /* Other types can't get here */
+ break;
+ }
+
+ *RetInternalObject = InternalObject;
+ return_ACPI_STATUS (AE_OK);
+
+
+ErrorExit:
+ AcpiUtRemoveReference (InternalObject);
+ return_ACPI_STATUS (AE_NO_MEMORY);
+}
+
+
+#ifdef ACPI_FUTURE_IMPLEMENTATION
+/* Code to convert packages that are parameters to control methods */
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyEpackageToIpackage
+ *
+ * PARAMETERS: *InternalObject - Pointer to the object we are returning
+ * *Buffer - Where the object is returned
+ * *SpaceUsed - Where the length of the object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to place a package object in a user
+ * buffer. A package object by definition contains other objects.
+ *
+ * The buffer is assumed to have sufficient space for the object.
+ * The caller must have verified the buffer length needed using the
+ * AcpiUtGetObjectSize function before calling this function.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtCopyEpackageToIpackage (
+ ACPI_OPERAND_OBJECT *InternalObject,
+ UINT8 *Buffer,
+ UINT32 *SpaceUsed)
+{
+ UINT8 *FreeSpace;
+ ACPI_OBJECT *ExternalObject;
+ UINT32 Length = 0;
+ UINT32 ThisIndex;
+ UINT32 ObjectSpace = 0;
+ ACPI_OPERAND_OBJECT *ThisInternalObj;
+ ACPI_OBJECT *ThisExternalObj;
+
+
+ ACPI_FUNCTION_TRACE (UtCopyEpackageToIpackage);
+
+
+ /*
+ * First package at head of the buffer
+ */
+ ExternalObject = (ACPI_OBJECT *)Buffer;
+
+ /*
+ * Free space begins right after the first package
+ */
+ FreeSpace = Buffer + sizeof(ACPI_OBJECT);
+
+
+ ExternalObject->Type = ACPI_GET_OBJECT_TYPE (InternalObject);
+ ExternalObject->Package.Count = InternalObject->Package.Count;
+ ExternalObject->Package.Elements = (ACPI_OBJECT *)FreeSpace;
+
+ /*
+ * Build an array of ACPI_OBJECTS in the buffer
+ * and move the free space past it
+ */
+ FreeSpace += ExternalObject->Package.Count * sizeof(ACPI_OBJECT);
+
+
+ /* Call WalkPackage */
+
+}
+
+#endif /* Future implementation */
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyEobjectToIobject
+ *
+ * PARAMETERS: *InternalObject - The external object to be converted
+ * *BufferPtr - Where the internal object is returned
+ *
+ * RETURN: Status - the status of the call
+ *
+ * DESCRIPTION: Converts an external object to an internal object.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtCopyEobjectToIobject (
+ ACPI_OBJECT *ExternalObject,
+ ACPI_OPERAND_OBJECT **InternalObject)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (UtCopyEobjectToIobject);
+
+
+ if (ExternalObject->Type == ACPI_TYPE_PACKAGE)
+ {
+ /*
+ * Packages as external input to control methods are not supported,
+ */
+ ACPI_ERROR ((AE_INFO,
+ "Packages as parameters not implemented!"));
+
+ return_ACPI_STATUS (AE_NOT_IMPLEMENTED);
+ }
+
+ else
+ {
+ /*
+ * Build a simple object (no nested objects)
+ */
+ Status = AcpiUtCopyEsimpleToIsimple (ExternalObject, InternalObject);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopySimpleObject
+ *
+ * PARAMETERS: SourceDesc - The internal object to be copied
+ * DestDesc - New target object
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Simple copy of one internal object to another. Reference count
+ * of the destination object is preserved.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtCopySimpleObject (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT *DestDesc)
+{
+ UINT16 ReferenceCount;
+ ACPI_OPERAND_OBJECT *NextObject;
+
+
+ /* Save fields from destination that we don't want to overwrite */
+
+ ReferenceCount = DestDesc->Common.ReferenceCount;
+ NextObject = DestDesc->Common.NextObject;
+
+ /* Copy the entire source object over the destination object*/
+
+ ACPI_MEMCPY ((char *) DestDesc, (char *) SourceDesc,
+ sizeof (ACPI_OPERAND_OBJECT));
+
+ /* Restore the saved fields */
+
+ DestDesc->Common.ReferenceCount = ReferenceCount;
+ DestDesc->Common.NextObject = NextObject;
+
+ /* New object is not static, regardless of source */
+
+ DestDesc->Common.Flags &= ~AOPOBJ_STATIC_POINTER;
+
+ /* Handle the objects with extra data */
+
+ switch (ACPI_GET_OBJECT_TYPE (DestDesc))
+ {
+ case ACPI_TYPE_BUFFER:
+ /*
+ * Allocate and copy the actual buffer if and only if:
+ * 1) There is a valid buffer pointer
+ * 2) The buffer has a length > 0
+ */
+ if ((SourceDesc->Buffer.Pointer) &&
+ (SourceDesc->Buffer.Length))
+ {
+ DestDesc->Buffer.Pointer =
+ ACPI_ALLOCATE (SourceDesc->Buffer.Length);
+ if (!DestDesc->Buffer.Pointer)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ /* Copy the actual buffer data */
+
+ ACPI_MEMCPY (DestDesc->Buffer.Pointer,
+ SourceDesc->Buffer.Pointer,
+ SourceDesc->Buffer.Length);
+ }
+ break;
+
+ case ACPI_TYPE_STRING:
+ /*
+ * Allocate and copy the actual string if and only if:
+ * 1) There is a valid string pointer
+ * (Pointer to a NULL string is allowed)
+ */
+ if (SourceDesc->String.Pointer)
+ {
+ DestDesc->String.Pointer =
+ ACPI_ALLOCATE ((ACPI_SIZE) SourceDesc->String.Length + 1);
+ if (!DestDesc->String.Pointer)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ /* Copy the actual string data */
+
+ ACPI_MEMCPY (DestDesc->String.Pointer, SourceDesc->String.Pointer,
+ (ACPI_SIZE) SourceDesc->String.Length + 1);
+ }
+ break;
+
+ case ACPI_TYPE_LOCAL_REFERENCE:
+ /*
+ * We copied the reference object, so we now must add a reference
+ * to the object pointed to by the reference
+ */
+ AcpiUtAddReference (SourceDesc->Reference.Object);
+ break;
+
+ case ACPI_TYPE_REGION:
+ /*
+ * We copied the Region Handler, so we now must add a reference
+ */
+ if (DestDesc->Region.Handler)
+ {
+ AcpiUtAddReference (DestDesc->Region.Handler);
+ }
+ break;
+
+ default:
+ /* Nothing to do for other simple objects */
+ break;
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyIelementToIelement
+ *
+ * PARAMETERS: ACPI_PKG_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Copy one package element to another package element
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtCopyIelementToIelement (
+ UINT8 ObjectType,
+ ACPI_OPERAND_OBJECT *SourceObject,
+ ACPI_GENERIC_STATE *State,
+ void *Context)
+{
+ ACPI_STATUS Status = AE_OK;
+ UINT32 ThisIndex;
+ ACPI_OPERAND_OBJECT **ThisTargetPtr;
+ ACPI_OPERAND_OBJECT *TargetObject;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ ThisIndex = State->Pkg.Index;
+ ThisTargetPtr = (ACPI_OPERAND_OBJECT **)
+ &State->Pkg.DestObject->Package.Elements[ThisIndex];
+
+ switch (ObjectType)
+ {
+ case ACPI_COPY_TYPE_SIMPLE:
+
+ /* A null source object indicates a (legal) null package element */
+
+ if (SourceObject)
+ {
+ /*
+ * This is a simple object, just copy it
+ */
+ TargetObject = AcpiUtCreateInternalObject (
+ ACPI_GET_OBJECT_TYPE (SourceObject));
+ if (!TargetObject)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ Status = AcpiUtCopySimpleObject (SourceObject, TargetObject);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+
+ *ThisTargetPtr = TargetObject;
+ }
+ else
+ {
+ /* Pass through a null element */
+
+ *ThisTargetPtr = NULL;
+ }
+ break;
+
+
+ case ACPI_COPY_TYPE_PACKAGE:
+
+ /*
+ * This object is a package - go down another nesting level
+ * Create and build the package object
+ */
+ TargetObject = AcpiUtCreateInternalObject (ACPI_TYPE_PACKAGE);
+ if (!TargetObject)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ TargetObject->Package.Count = SourceObject->Package.Count;
+ TargetObject->Common.Flags = SourceObject->Common.Flags;
+
+ /*
+ * Create the object array
+ */
+ TargetObject->Package.Elements = ACPI_ALLOCATE_ZEROED (
+ ((ACPI_SIZE) SourceObject->Package.Count + 1) * sizeof (void *));
+ if (!TargetObject->Package.Elements)
+ {
+ Status = AE_NO_MEMORY;
+ goto ErrorExit;
+ }
+
+ /*
+ * Pass the new package object back to the package walk routine
+ */
+ State->Pkg.ThisTargetObj = TargetObject;
+
+ /*
+ * Store the object pointer in the parent package object
+ */
+ *ThisTargetPtr = TargetObject;
+ break;
+
+
+ default:
+ return (AE_BAD_PARAMETER);
+ }
+
+ return (Status);
+
+ErrorExit:
+ AcpiUtRemoveReference (TargetObject);
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyIpackageToIpackage
+ *
+ * PARAMETERS: *SourceObj - Pointer to the source package object
+ * *DestObj - Where the internal object is returned
+ *
+ * RETURN: Status - the status of the call
+ *
+ * DESCRIPTION: This function is called to copy an internal package object
+ * into another internal package object.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtCopyIpackageToIpackage (
+ ACPI_OPERAND_OBJECT *SourceObj,
+ ACPI_OPERAND_OBJECT *DestObj,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (UtCopyIpackageToIpackage);
+
+
+ DestObj->Common.Type = ACPI_GET_OBJECT_TYPE (SourceObj);
+ DestObj->Common.Flags = SourceObj->Common.Flags;
+ DestObj->Package.Count = SourceObj->Package.Count;
+
+ /*
+ * Create the object array and walk the source package tree
+ */
+ DestObj->Package.Elements = ACPI_ALLOCATE_ZEROED (
+ ((ACPI_SIZE) SourceObj->Package.Count + 1) *
+ sizeof (void *));
+ if (!DestObj->Package.Elements)
+ {
+ ACPI_ERROR ((AE_INFO, "Package allocation failure"));
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /*
+ * Copy the package element-by-element by walking the package "tree".
+ * This handles nested packages of arbitrary depth.
+ */
+ Status = AcpiUtWalkPackageTree (SourceObj, DestObj,
+ AcpiUtCopyIelementToIelement, WalkState);
+ if (ACPI_FAILURE (Status))
+ {
+ /* On failure, delete the destination package object */
+
+ AcpiUtRemoveReference (DestObj);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyIobjectToIobject
+ *
+ * PARAMETERS: WalkState - Current walk state
+ * SourceDesc - The internal object to be copied
+ * DestDesc - Where the copied object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Copy an internal object to a new internal object
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtCopyIobjectToIobject (
+ ACPI_OPERAND_OBJECT *SourceDesc,
+ ACPI_OPERAND_OBJECT **DestDesc,
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (UtCopyIobjectToIobject);
+
+
+ /* Create the top level object */
+
+ *DestDesc = AcpiUtCreateInternalObject (ACPI_GET_OBJECT_TYPE (SourceDesc));
+ if (!*DestDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Copy the object and possible subobjects */
+
+ if (ACPI_GET_OBJECT_TYPE (SourceDesc) == ACPI_TYPE_PACKAGE)
+ {
+ Status = AcpiUtCopyIpackageToIpackage (SourceDesc, *DestDesc,
+ WalkState);
+ }
+ else
+ {
+ Status = AcpiUtCopySimpleObject (SourceDesc, *DestDesc);
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/utdebug.c b/sys/contrib/dev/acpica/utdebug.c
new file mode 100644
index 0000000..59b91d7
--- /dev/null
+++ b/sys/contrib/dev/acpica/utdebug.c
@@ -0,0 +1,807 @@
+/******************************************************************************
+ *
+ * Module Name: utdebug - Debug print routines
+ * $Revision: 1.133 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __UTDEBUG_C__
+
+#include <contrib/dev/acpica/acpi.h>
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utdebug")
+
+
+#ifdef ACPI_DEBUG_OUTPUT
+
+static UINT32 AcpiGbl_PrevThreadId = 0xFFFFFFFF;
+static char *AcpiGbl_FnEntryStr = "----Entry";
+static char *AcpiGbl_FnExitStr = "----Exit-";
+
+/* Local prototypes */
+
+static const char *
+AcpiUtTrimFunctionName (
+ const char *FunctionName);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtInitStackPtrTrace
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Save the current CPU stack pointer at subsystem startup
+ *
+ ******************************************************************************/
+
+void
+AcpiUtInitStackPtrTrace (
+ void)
+{
+ UINT32 CurrentSp;
+
+
+ AcpiGbl_EntryStackPointer = ACPI_PTR_DIFF (&CurrentSp, NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtTrackStackPtr
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Save the current CPU stack pointer
+ *
+ ******************************************************************************/
+
+void
+AcpiUtTrackStackPtr (
+ void)
+{
+ ACPI_SIZE CurrentSp;
+
+
+ CurrentSp = ACPI_PTR_DIFF (&CurrentSp, NULL);
+
+ if (CurrentSp < AcpiGbl_LowestStackPointer)
+ {
+ AcpiGbl_LowestStackPointer = CurrentSp;
+ }
+
+ if (AcpiGbl_NestingLevel > AcpiGbl_DeepestNesting)
+ {
+ AcpiGbl_DeepestNesting = AcpiGbl_NestingLevel;
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtTrimFunctionName
+ *
+ * PARAMETERS: FunctionName - Ascii string containing a procedure name
+ *
+ * RETURN: Updated pointer to the function name
+ *
+ * DESCRIPTION: Remove the "Acpi" prefix from the function name, if present.
+ * This allows compiler macros such as __FUNCTION__ to be used
+ * with no change to the debug output.
+ *
+ ******************************************************************************/
+
+static const char *
+AcpiUtTrimFunctionName (
+ const char *FunctionName)
+{
+
+ /* All Function names are longer than 4 chars, check is safe */
+
+ if (*(ACPI_CAST_PTR (UINT32, FunctionName)) == ACPI_PREFIX_MIXED)
+ {
+ /* This is the case where the original source has not been modified */
+
+ return (FunctionName + 4);
+ }
+
+ if (*(ACPI_CAST_PTR (UINT32, FunctionName)) == ACPI_PREFIX_LOWER)
+ {
+ /* This is the case where the source has been 'linuxized' */
+
+ return (FunctionName + 5);
+ }
+
+ return (FunctionName);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDebugPrint
+ *
+ * PARAMETERS: RequestedDebugLevel - Requested debug print level
+ * LineNumber - Caller's line number (for error output)
+ * FunctionName - Caller's procedure name
+ * ModuleName - Caller's module name
+ * ComponentId - Caller's component ID
+ * Format - Printf format field
+ * ... - Optional printf arguments
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print error message with prefix consisting of the module name,
+ * line number, and component ID.
+ *
+ ******************************************************************************/
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtDebugPrint (
+ UINT32 RequestedDebugLevel,
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ char *Format,
+ ...)
+{
+ ACPI_THREAD_ID ThreadId;
+ va_list args;
+
+
+ /*
+ * Stay silent if the debug level or component ID is disabled
+ */
+ if (!(RequestedDebugLevel & AcpiDbgLevel) ||
+ !(ComponentId & AcpiDbgLayer))
+ {
+ return;
+ }
+
+ /*
+ * Thread tracking and context switch notification
+ */
+ ThreadId = AcpiOsGetThreadId ();
+ if (ThreadId != AcpiGbl_PrevThreadId)
+ {
+ if (ACPI_LV_THREADS & AcpiDbgLevel)
+ {
+ AcpiOsPrintf (
+ "\n**** Context Switch from TID %X to TID %X ****\n\n",
+ AcpiGbl_PrevThreadId, ThreadId);
+ }
+
+ AcpiGbl_PrevThreadId = ThreadId;
+ }
+
+ /*
+ * Display the module name, current line number, thread ID (if requested),
+ * current procedure nesting level, and the current procedure name
+ */
+ AcpiOsPrintf ("%8s-%04ld ", ModuleName, LineNumber);
+
+ if (ACPI_LV_THREADS & AcpiDbgLevel)
+ {
+ AcpiOsPrintf ("[%04lX] ", ThreadId);
+ }
+
+ AcpiOsPrintf ("[%02ld] %-22.22s: ",
+ AcpiGbl_NestingLevel, AcpiUtTrimFunctionName (FunctionName));
+
+ va_start (args, Format);
+ AcpiOsVprintf (Format, args);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiUtDebugPrint)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDebugPrintRaw
+ *
+ * PARAMETERS: RequestedDebugLevel - Requested debug print level
+ * LineNumber - Caller's line number
+ * FunctionName - Caller's procedure name
+ * ModuleName - Caller's module name
+ * ComponentId - Caller's component ID
+ * Format - Printf format field
+ * ... - Optional printf arguments
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print message with no headers. Has same interface as
+ * DebugPrint so that the same macros can be used.
+ *
+ ******************************************************************************/
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtDebugPrintRaw (
+ UINT32 RequestedDebugLevel,
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ char *Format,
+ ...)
+{
+ va_list args;
+
+
+ if (!(RequestedDebugLevel & AcpiDbgLevel) ||
+ !(ComponentId & AcpiDbgLayer))
+ {
+ return;
+ }
+
+ va_start (args, Format);
+ AcpiOsVprintf (Format, args);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiUtDebugPrintRaw)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtTrace
+ *
+ * PARAMETERS: LineNumber - Caller's line number
+ * FunctionName - Caller's procedure name
+ * ModuleName - Caller's module name
+ * ComponentId - Caller's component ID
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
+ * set in DebugLevel
+ *
+ ******************************************************************************/
+
+void
+AcpiUtTrace (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId)
+{
+
+ AcpiGbl_NestingLevel++;
+ AcpiUtTrackStackPtr ();
+
+ AcpiUtDebugPrint (ACPI_LV_FUNCTIONS,
+ LineNumber, FunctionName, ModuleName, ComponentId,
+ "%s\n", AcpiGbl_FnEntryStr);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiUtTrace)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtTracePtr
+ *
+ * PARAMETERS: LineNumber - Caller's line number
+ * FunctionName - Caller's procedure name
+ * ModuleName - Caller's module name
+ * ComponentId - Caller's component ID
+ * Pointer - Pointer to display
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
+ * set in DebugLevel
+ *
+ ******************************************************************************/
+
+void
+AcpiUtTracePtr (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ void *Pointer)
+{
+ AcpiGbl_NestingLevel++;
+ AcpiUtTrackStackPtr ();
+
+ AcpiUtDebugPrint (ACPI_LV_FUNCTIONS,
+ LineNumber, FunctionName, ModuleName, ComponentId,
+ "%s %p\n", AcpiGbl_FnEntryStr, Pointer);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtTraceStr
+ *
+ * PARAMETERS: LineNumber - Caller's line number
+ * FunctionName - Caller's procedure name
+ * ModuleName - Caller's module name
+ * ComponentId - Caller's component ID
+ * String - Additional string to display
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
+ * set in DebugLevel
+ *
+ ******************************************************************************/
+
+void
+AcpiUtTraceStr (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ char *String)
+{
+
+ AcpiGbl_NestingLevel++;
+ AcpiUtTrackStackPtr ();
+
+ AcpiUtDebugPrint (ACPI_LV_FUNCTIONS,
+ LineNumber, FunctionName, ModuleName, ComponentId,
+ "%s %s\n", AcpiGbl_FnEntryStr, String);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtTraceU32
+ *
+ * PARAMETERS: LineNumber - Caller's line number
+ * FunctionName - Caller's procedure name
+ * ModuleName - Caller's module name
+ * ComponentId - Caller's component ID
+ * Integer - Integer to display
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Function entry trace. Prints only if TRACE_FUNCTIONS bit is
+ * set in DebugLevel
+ *
+ ******************************************************************************/
+
+void
+AcpiUtTraceU32 (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ UINT32 Integer)
+{
+
+ AcpiGbl_NestingLevel++;
+ AcpiUtTrackStackPtr ();
+
+ AcpiUtDebugPrint (ACPI_LV_FUNCTIONS,
+ LineNumber, FunctionName, ModuleName, ComponentId,
+ "%s %08X\n", AcpiGbl_FnEntryStr, Integer);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtExit
+ *
+ * PARAMETERS: LineNumber - Caller's line number
+ * FunctionName - Caller's procedure name
+ * ModuleName - Caller's module name
+ * ComponentId - Caller's component ID
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
+ * set in DebugLevel
+ *
+ ******************************************************************************/
+
+void
+AcpiUtExit (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId)
+{
+
+ AcpiUtDebugPrint (ACPI_LV_FUNCTIONS,
+ LineNumber, FunctionName, ModuleName, ComponentId,
+ "%s\n", AcpiGbl_FnExitStr);
+
+ AcpiGbl_NestingLevel--;
+}
+
+ACPI_EXPORT_SYMBOL (AcpiUtExit)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStatusExit
+ *
+ * PARAMETERS: LineNumber - Caller's line number
+ * FunctionName - Caller's procedure name
+ * ModuleName - Caller's module name
+ * ComponentId - Caller's component ID
+ * Status - Exit status code
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
+ * set in DebugLevel. Prints exit status also.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtStatusExit (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ ACPI_STATUS Status)
+{
+
+ if (ACPI_SUCCESS (Status))
+ {
+ AcpiUtDebugPrint (ACPI_LV_FUNCTIONS,
+ LineNumber, FunctionName, ModuleName, ComponentId,
+ "%s %s\n", AcpiGbl_FnExitStr,
+ AcpiFormatException (Status));
+ }
+ else
+ {
+ AcpiUtDebugPrint (ACPI_LV_FUNCTIONS,
+ LineNumber, FunctionName, ModuleName, ComponentId,
+ "%s ****Exception****: %s\n", AcpiGbl_FnExitStr,
+ AcpiFormatException (Status));
+ }
+
+ AcpiGbl_NestingLevel--;
+}
+
+ACPI_EXPORT_SYMBOL (AcpiUtStatusExit)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtValueExit
+ *
+ * PARAMETERS: LineNumber - Caller's line number
+ * FunctionName - Caller's procedure name
+ * ModuleName - Caller's module name
+ * ComponentId - Caller's component ID
+ * Value - Value to be printed with exit msg
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
+ * set in DebugLevel. Prints exit value also.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtValueExit (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ ACPI_INTEGER Value)
+{
+
+ AcpiUtDebugPrint (ACPI_LV_FUNCTIONS,
+ LineNumber, FunctionName, ModuleName, ComponentId,
+ "%s %8.8X%8.8X\n", AcpiGbl_FnExitStr,
+ ACPI_FORMAT_UINT64 (Value));
+
+ AcpiGbl_NestingLevel--;
+}
+
+ACPI_EXPORT_SYMBOL (AcpiUtValueExit)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtPtrExit
+ *
+ * PARAMETERS: LineNumber - Caller's line number
+ * FunctionName - Caller's procedure name
+ * ModuleName - Caller's module name
+ * ComponentId - Caller's component ID
+ * Ptr - Pointer to display
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Function exit trace. Prints only if TRACE_FUNCTIONS bit is
+ * set in DebugLevel. Prints exit value also.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtPtrExit (
+ UINT32 LineNumber,
+ const char *FunctionName,
+ char *ModuleName,
+ UINT32 ComponentId,
+ UINT8 *Ptr)
+{
+
+ AcpiUtDebugPrint (ACPI_LV_FUNCTIONS,
+ LineNumber, FunctionName, ModuleName, ComponentId,
+ "%s %p\n", AcpiGbl_FnExitStr, Ptr);
+
+ AcpiGbl_NestingLevel--;
+}
+
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDumpBuffer
+ *
+ * PARAMETERS: Buffer - Buffer to dump
+ * Count - Amount to dump, in bytes
+ * Display - BYTE, WORD, DWORD, or QWORD display
+ * ComponentID - Caller's component ID
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Generic dump buffer in both hex and ascii.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtDumpBuffer2 (
+ UINT8 *Buffer,
+ UINT32 Count,
+ UINT32 Display)
+{
+ ACPI_NATIVE_UINT i = 0;
+ ACPI_NATIVE_UINT j;
+ UINT32 Temp32;
+ UINT8 BufChar;
+
+
+ if ((Count < 4) || (Count & 0x01))
+ {
+ Display = DB_BYTE_DISPLAY;
+ }
+
+ /* Nasty little dump buffer routine! */
+
+ while (i < Count)
+ {
+ /* Print current offset */
+
+ AcpiOsPrintf ("%6.4X: ", (UINT32) i);
+
+ /* Print 16 hex chars */
+
+ for (j = 0; j < 16;)
+ {
+ if (i + j >= Count)
+ {
+ /* Dump fill spaces */
+
+ AcpiOsPrintf ("%*s", ((Display * 2) + 1), " ");
+ j += (ACPI_NATIVE_UINT) Display;
+ continue;
+ }
+
+ switch (Display)
+ {
+ case DB_BYTE_DISPLAY:
+ default: /* Default is BYTE display */
+
+ AcpiOsPrintf ("%02X ", Buffer[i + j]);
+ break;
+
+
+ case DB_WORD_DISPLAY:
+
+ ACPI_MOVE_16_TO_32 (&Temp32, &Buffer[i + j]);
+ AcpiOsPrintf ("%04X ", Temp32);
+ break;
+
+
+ case DB_DWORD_DISPLAY:
+
+ ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[i + j]);
+ AcpiOsPrintf ("%08X ", Temp32);
+ break;
+
+
+ case DB_QWORD_DISPLAY:
+
+ ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[i + j]);
+ AcpiOsPrintf ("%08X", Temp32);
+
+ ACPI_MOVE_32_TO_32 (&Temp32, &Buffer[i + j + 4]);
+ AcpiOsPrintf ("%08X ", Temp32);
+ break;
+ }
+
+ j += (ACPI_NATIVE_UINT) Display;
+ }
+
+ /*
+ * Print the ASCII equivalent characters but watch out for the bad
+ * unprintable ones (printable chars are 0x20 through 0x7E)
+ */
+ AcpiOsPrintf (" ");
+ for (j = 0; j < 16; j++)
+ {
+ if (i + j >= Count)
+ {
+ AcpiOsPrintf ("\n");
+ return;
+ }
+
+ BufChar = Buffer[i + j];
+ if (ACPI_IS_PRINT (BufChar))
+ {
+ AcpiOsPrintf ("%c", BufChar);
+ }
+ else
+ {
+ AcpiOsPrintf (".");
+ }
+ }
+
+ /* Done with that line. */
+
+ AcpiOsPrintf ("\n");
+ i += 16;
+ }
+
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDumpBuffer
+ *
+ * PARAMETERS: Buffer - Buffer to dump
+ * Count - Amount to dump, in bytes
+ * Display - BYTE, WORD, DWORD, or QWORD display
+ * ComponentID - Caller's component ID
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Generic dump buffer in both hex and ascii.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtDumpBuffer (
+ UINT8 *Buffer,
+ UINT32 Count,
+ UINT32 Display,
+ UINT32 ComponentId)
+{
+
+ /* Only dump the buffer if tracing is enabled */
+
+ if (!((ACPI_LV_TABLES & AcpiDbgLevel) &&
+ (ComponentId & AcpiDbgLayer)))
+ {
+ return;
+ }
+
+ AcpiUtDumpBuffer2 (Buffer, Count, Display);
+}
+
+
diff --git a/sys/contrib/dev/acpica/utdelete.c b/sys/contrib/dev/acpica/utdelete.c
new file mode 100644
index 0000000..e78796e
--- /dev/null
+++ b/sys/contrib/dev/acpica/utdelete.c
@@ -0,0 +1,775 @@
+/*******************************************************************************
+ *
+ * Module Name: utdelete - object deletion and reference count utilities
+ * $Revision: 1.123 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __UTDELETE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acinterp.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utdelete")
+
+/* Local prototypes */
+
+static void
+AcpiUtDeleteInternalObj (
+ ACPI_OPERAND_OBJECT *Object);
+
+static void
+AcpiUtUpdateRefCount (
+ ACPI_OPERAND_OBJECT *Object,
+ UINT32 Action);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDeleteInternalObj
+ *
+ * PARAMETERS: Object - Object to be deleted
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Low level object deletion, after reference counts have been
+ * updated (All reference counts, including sub-objects!)
+ *
+ ******************************************************************************/
+
+static void
+AcpiUtDeleteInternalObj (
+ ACPI_OPERAND_OBJECT *Object)
+{
+ void *ObjPointer = NULL;
+ ACPI_OPERAND_OBJECT *HandlerDesc;
+ ACPI_OPERAND_OBJECT *SecondDesc;
+ ACPI_OPERAND_OBJECT *NextDesc;
+
+
+ ACPI_FUNCTION_TRACE_PTR (UtDeleteInternalObj, Object);
+
+
+ if (!Object)
+ {
+ return_VOID;
+ }
+
+ /*
+ * Must delete or free any pointers within the object that are not
+ * actual ACPI objects (for example, a raw buffer pointer).
+ */
+ switch (ACPI_GET_OBJECT_TYPE (Object))
+ {
+ case ACPI_TYPE_STRING:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** String %p, ptr %p\n",
+ Object, Object->String.Pointer));
+
+ /* Free the actual string buffer */
+
+ if (!(Object->Common.Flags & AOPOBJ_STATIC_POINTER))
+ {
+ /* But only if it is NOT a pointer into an ACPI table */
+
+ ObjPointer = Object->String.Pointer;
+ }
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "**** Buffer %p, ptr %p\n",
+ Object, Object->Buffer.Pointer));
+
+ /* Free the actual buffer */
+
+ if (!(Object->Common.Flags & AOPOBJ_STATIC_POINTER))
+ {
+ /* But only if it is NOT a pointer into an ACPI table */
+
+ ObjPointer = Object->Buffer.Pointer;
+ }
+ break;
+
+
+ case ACPI_TYPE_PACKAGE:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, " **** Package of count %X\n",
+ Object->Package.Count));
+
+ /*
+ * Elements of the package are not handled here, they are deleted
+ * separately
+ */
+
+ /* Free the (variable length) element pointer array */
+
+ ObjPointer = Object->Package.Elements;
+ break;
+
+
+ case ACPI_TYPE_DEVICE:
+
+ if (Object->Device.GpeBlock)
+ {
+ (void) AcpiEvDeleteGpeBlock (Object->Device.GpeBlock);
+ }
+
+ /* Walk the handler list for this device */
+
+ HandlerDesc = Object->Device.Handler;
+ while (HandlerDesc)
+ {
+ NextDesc = HandlerDesc->AddressSpace.Next;
+ AcpiUtRemoveReference (HandlerDesc);
+ HandlerDesc = NextDesc;
+ }
+ break;
+
+
+ case ACPI_TYPE_MUTEX:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "***** Mutex %p, OS Mutex %p\n",
+ Object, Object->Mutex.OsMutex));
+
+ if (Object == AcpiGbl_GlobalLockMutex)
+ {
+ /* Global Lock has extra semaphore */
+
+ (void) AcpiOsDeleteSemaphore (AcpiGbl_GlobalLockSemaphore);
+ AcpiGbl_GlobalLockSemaphore = NULL;
+
+ AcpiOsDeleteMutex (Object->Mutex.OsMutex);
+ AcpiGbl_GlobalLockMutex = NULL;
+ }
+ else
+ {
+ AcpiExUnlinkMutex (Object);
+ AcpiOsDeleteMutex (Object->Mutex.OsMutex);
+ }
+ break;
+
+
+ case ACPI_TYPE_EVENT:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "***** Event %p, OS Semaphore %p\n",
+ Object, Object->Event.OsSemaphore));
+
+ (void) AcpiOsDeleteSemaphore (Object->Event.OsSemaphore);
+ Object->Event.OsSemaphore = NULL;
+ break;
+
+
+ case ACPI_TYPE_METHOD:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "***** Method %p\n", Object));
+
+ /* Delete the method mutex if it exists */
+
+ if (Object->Method.Mutex)
+ {
+ AcpiOsDeleteMutex (Object->Method.Mutex->Mutex.OsMutex);
+ AcpiUtDeleteObjectDesc (Object->Method.Mutex);
+ Object->Method.Mutex = NULL;
+ }
+ break;
+
+
+ case ACPI_TYPE_REGION:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "***** Region %p\n", Object));
+
+ SecondDesc = AcpiNsGetSecondaryObject (Object);
+ if (SecondDesc)
+ {
+ /*
+ * Free the RegionContext if and only if the handler is one of the
+ * default handlers -- and therefore, we created the context object
+ * locally, it was not created by an external caller.
+ */
+ HandlerDesc = Object->Region.Handler;
+ if (HandlerDesc)
+ {
+ if (HandlerDesc->AddressSpace.HandlerFlags &
+ ACPI_ADDR_HANDLER_DEFAULT_INSTALLED)
+ {
+ /* Deactivate region and free region context */
+
+ if (HandlerDesc->AddressSpace.Setup)
+ {
+ (void) HandlerDesc->AddressSpace.Setup (Object,
+ ACPI_REGION_DEACTIVATE,
+ HandlerDesc->AddressSpace.Context,
+ &SecondDesc->Extra.RegionContext);
+ }
+ }
+
+ AcpiUtRemoveReference (HandlerDesc);
+ }
+
+ /* Now we can free the Extra object */
+
+ AcpiUtDeleteObjectDesc (SecondDesc);
+ }
+ break;
+
+
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "***** Buffer Field %p\n", Object));
+
+ SecondDesc = AcpiNsGetSecondaryObject (Object);
+ if (SecondDesc)
+ {
+ AcpiUtDeleteObjectDesc (SecondDesc);
+ }
+ break;
+
+
+ default:
+ break;
+ }
+
+ /* Free any allocated memory (pointer within the object) found above */
+
+ if (ObjPointer)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Deleting Object Subptr %p\n",
+ ObjPointer));
+ ACPI_FREE (ObjPointer);
+ }
+
+ /* Now the object can be safely deleted */
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Deleting Object %p [%s]\n",
+ Object, AcpiUtGetObjectTypeName (Object)));
+
+ AcpiUtDeleteObjectDesc (Object);
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDeleteInternalObjectList
+ *
+ * PARAMETERS: ObjList - Pointer to the list to be deleted
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: This function deletes an internal object list, including both
+ * simple objects and package objects
+ *
+ ******************************************************************************/
+
+void
+AcpiUtDeleteInternalObjectList (
+ ACPI_OPERAND_OBJECT **ObjList)
+{
+ ACPI_OPERAND_OBJECT **InternalObj;
+
+
+ ACPI_FUNCTION_TRACE (UtDeleteInternalObjectList);
+
+
+ /* Walk the null-terminated internal list */
+
+ for (InternalObj = ObjList; *InternalObj; InternalObj++)
+ {
+ AcpiUtRemoveReference (*InternalObj);
+ }
+
+ /* Free the combined parameter pointer list and object array */
+
+ ACPI_FREE (ObjList);
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtUpdateRefCount
+ *
+ * PARAMETERS: Object - Object whose ref count is to be updated
+ * Action - What to do
+ *
+ * RETURN: New ref count
+ *
+ * DESCRIPTION: Modify the ref count and return it.
+ *
+ ******************************************************************************/
+
+static void
+AcpiUtUpdateRefCount (
+ ACPI_OPERAND_OBJECT *Object,
+ UINT32 Action)
+{
+ UINT16 Count;
+ UINT16 NewCount;
+
+
+ ACPI_FUNCTION_NAME (UtUpdateRefCount);
+
+
+ if (!Object)
+ {
+ return;
+ }
+
+ Count = Object->Common.ReferenceCount;
+ NewCount = Count;
+
+ /*
+ * Perform the reference count action (increment, decrement, force delete)
+ */
+ switch (Action)
+ {
+ case REF_INCREMENT:
+
+ NewCount++;
+ Object->Common.ReferenceCount = NewCount;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "Obj %p Refs=%X, [Incremented]\n",
+ Object, NewCount));
+ break;
+
+ case REF_DECREMENT:
+
+ if (Count < 1)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "Obj %p Refs=%X, can't decrement! (Set to 0)\n",
+ Object, NewCount));
+
+ NewCount = 0;
+ }
+ else
+ {
+ NewCount--;
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "Obj %p Refs=%X, [Decremented]\n",
+ Object, NewCount));
+ }
+
+ if (ACPI_GET_OBJECT_TYPE (Object) == ACPI_TYPE_METHOD)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "Method Obj %p Refs=%X, [Decremented]\n", Object, NewCount));
+ }
+
+ Object->Common.ReferenceCount = NewCount;
+ if (NewCount == 0)
+ {
+ AcpiUtDeleteInternalObj (Object);
+ }
+ break;
+
+ case REF_FORCE_DELETE:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "Obj %p Refs=%X, Force delete! (Set to 0)\n", Object, Count));
+
+ NewCount = 0;
+ Object->Common.ReferenceCount = NewCount;
+ AcpiUtDeleteInternalObj (Object);
+ break;
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unknown action (%X)", Action));
+ break;
+ }
+
+ /*
+ * Sanity check the reference count, for debug purposes only.
+ * (A deleted object will have a huge reference count)
+ */
+ if (Count > ACPI_MAX_REFERENCE_COUNT)
+ {
+ ACPI_WARNING ((AE_INFO,
+ "Large Reference Count (%X) in object %p", Count, Object));
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtUpdateObjectReference
+ *
+ * PARAMETERS: Object - Increment ref count for this object
+ * and all sub-objects
+ * Action - Either REF_INCREMENT or REF_DECREMENT or
+ * REF_FORCE_DELETE
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Increment the object reference count
+ *
+ * Object references are incremented when:
+ * 1) An object is attached to a Node (namespace object)
+ * 2) An object is copied (all subobjects must be incremented)
+ *
+ * Object references are decremented when:
+ * 1) An object is detached from an Node
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtUpdateObjectReference (
+ ACPI_OPERAND_OBJECT *Object,
+ UINT16 Action)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_GENERIC_STATE *StateList = NULL;
+ ACPI_OPERAND_OBJECT *NextObject = NULL;
+ ACPI_GENERIC_STATE *State;
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_TRACE_PTR (UtUpdateObjectReference, Object);
+
+
+ while (Object)
+ {
+ /* Make sure that this isn't a namespace handle */
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "Object %p is NS handle\n", Object));
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * All sub-objects must have their reference count incremented also.
+ * Different object types have different subobjects.
+ */
+ switch (ACPI_GET_OBJECT_TYPE (Object))
+ {
+ case ACPI_TYPE_DEVICE:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_POWER:
+ case ACPI_TYPE_THERMAL:
+
+ /* Update the notify objects for these types (if present) */
+
+ AcpiUtUpdateRefCount (Object->CommonNotify.SystemNotify, Action);
+ AcpiUtUpdateRefCount (Object->CommonNotify.DeviceNotify, Action);
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+ /*
+ * We must update all the sub-objects of the package,
+ * each of whom may have their own sub-objects.
+ */
+ for (i = 0; i < Object->Package.Count; i++)
+ {
+ /*
+ * Push each element onto the stack for later processing.
+ * Note: There can be null elements within the package,
+ * these are simply ignored
+ */
+ Status = AcpiUtCreateUpdateStateAndPush (
+ Object->Package.Elements[i], Action, &StateList);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+ }
+ break;
+
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ NextObject = Object->BufferField.BufferObj;
+ break;
+
+ case ACPI_TYPE_LOCAL_REGION_FIELD:
+
+ NextObject = Object->Field.RegionObj;
+ break;
+
+ case ACPI_TYPE_LOCAL_BANK_FIELD:
+
+ NextObject = Object->BankField.BankObj;
+ Status = AcpiUtCreateUpdateStateAndPush (
+ Object->BankField.RegionObj, Action, &StateList);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+ break;
+
+ case ACPI_TYPE_LOCAL_INDEX_FIELD:
+
+ NextObject = Object->IndexField.IndexObj;
+ Status = AcpiUtCreateUpdateStateAndPush (
+ Object->IndexField.DataObj, Action, &StateList);
+ if (ACPI_FAILURE (Status))
+ {
+ goto ErrorExit;
+ }
+ break;
+
+ case ACPI_TYPE_LOCAL_REFERENCE:
+ /*
+ * The target of an Index (a package, string, or buffer) must track
+ * changes to the ref count of the index.
+ */
+ if (Object->Reference.Opcode == AML_INDEX_OP)
+ {
+ NextObject = Object->Reference.Object;
+ }
+ break;
+
+ case ACPI_TYPE_REGION:
+ default:
+ break; /* No subobjects for all other types */
+ }
+
+ /*
+ * Now we can update the count in the main object. This can only
+ * happen after we update the sub-objects in case this causes the
+ * main object to be deleted.
+ */
+ AcpiUtUpdateRefCount (Object, Action);
+ Object = NULL;
+
+ /* Move on to the next object to be updated */
+
+ if (NextObject)
+ {
+ Object = NextObject;
+ NextObject = NULL;
+ }
+ else if (StateList)
+ {
+ State = AcpiUtPopGenericState (&StateList);
+ Object = State->Update.Object;
+ AcpiUtDeleteGenericState (State);
+ }
+ }
+
+ return_ACPI_STATUS (AE_OK);
+
+ErrorExit:
+
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Could not update object reference count"));
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtAddReference
+ *
+ * PARAMETERS: Object - Object whose reference count is to be
+ * incremented
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Add one reference to an ACPI object
+ *
+ ******************************************************************************/
+
+void
+AcpiUtAddReference (
+ ACPI_OPERAND_OBJECT *Object)
+{
+
+ ACPI_FUNCTION_TRACE_PTR (UtAddReference, Object);
+
+
+ /* Ensure that we have a valid object */
+
+ if (!AcpiUtValidInternalObject (Object))
+ {
+ return_VOID;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "Obj %p Current Refs=%X [To Be Incremented]\n",
+ Object, Object->Common.ReferenceCount));
+
+ /* Increment the reference count */
+
+ (void) AcpiUtUpdateObjectReference (Object, REF_INCREMENT);
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtRemoveReference
+ *
+ * PARAMETERS: Object - Object whose ref count will be decremented
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Decrement the reference count of an ACPI internal object
+ *
+ ******************************************************************************/
+
+void
+AcpiUtRemoveReference (
+ ACPI_OPERAND_OBJECT *Object)
+{
+
+ ACPI_FUNCTION_TRACE_PTR (UtRemoveReference, Object);
+
+
+ /*
+ * Allow a NULL pointer to be passed in, just ignore it. This saves
+ * each caller from having to check. Also, ignore NS nodes.
+ *
+ */
+ if (!Object ||
+ (ACPI_GET_DESCRIPTOR_TYPE (Object) == ACPI_DESC_TYPE_NAMED))
+
+ {
+ return_VOID;
+ }
+
+ /* Ensure that we have a valid object */
+
+ if (!AcpiUtValidInternalObject (Object))
+ {
+ return_VOID;
+ }
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS,
+ "Obj %p Current Refs=%X [To Be Decremented]\n",
+ Object, Object->Common.ReferenceCount));
+
+ /*
+ * Decrement the reference count, and only actually delete the object
+ * if the reference count becomes 0. (Must also decrement the ref count
+ * of all subobjects!)
+ */
+ (void) AcpiUtUpdateObjectReference (Object, REF_DECREMENT);
+ return_VOID;
+}
+
+
diff --git a/sys/contrib/dev/acpica/uteval.c b/sys/contrib/dev/acpica/uteval.c
new file mode 100644
index 0000000..5e16abb
--- /dev/null
+++ b/sys/contrib/dev/acpica/uteval.c
@@ -0,0 +1,880 @@
+/******************************************************************************
+ *
+ * Module Name: uteval - Object evaluation
+ * $Revision: 1.71 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __UTEVAL_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acinterp.h>
+
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("uteval")
+
+/* Local prototypes */
+
+static void
+AcpiUtCopyIdString (
+ char *Destination,
+ char *Source,
+ ACPI_SIZE MaxLength);
+
+static ACPI_STATUS
+AcpiUtTranslateOneCid (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_COMPATIBLE_ID *OneCid);
+
+
+/*
+ * Strings supported by the _OSI predefined (internal) method.
+ */
+static const char *AcpiInterfacesSupported[] =
+{
+ /* Operating System Vendor Strings */
+
+ "Linux",
+ "Windows 2000",
+ "Windows 2001",
+ "Windows 2001 SP0",
+ "Windows 2001 SP1",
+ "Windows 2001 SP2",
+ "Windows 2001 SP3",
+ "Windows 2001 SP4",
+ "Windows 2001.1",
+ "Windows 2001.1 SP1", /* Added 03/2006 */
+ "Windows 2006", /* Added 03/2006 */
+
+ /* Feature Group Strings */
+
+ "Extended Address Space Descriptor"
+
+ /*
+ * All "optional" feature group strings (features that are implemented
+ * by the host) should be implemented in the host version of
+ * AcpiOsValidateInterface and should not be added here.
+ */
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtOsiImplementation
+ *
+ * PARAMETERS: WalkState - Current walk state
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Implementation of the _OSI predefined control method
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtOsiImplementation (
+ ACPI_WALK_STATE *WalkState)
+{
+ ACPI_STATUS Status;
+ ACPI_OPERAND_OBJECT *StringDesc;
+ ACPI_OPERAND_OBJECT *ReturnDesc;
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_TRACE (UtOsiImplementation);
+
+
+ /* Validate the string input argument */
+
+ StringDesc = WalkState->Arguments[0].Object;
+ if (!StringDesc || (StringDesc->Common.Type != ACPI_TYPE_STRING))
+ {
+ return_ACPI_STATUS (AE_TYPE);
+ }
+
+ /* Create a return object */
+
+ ReturnDesc = AcpiUtCreateInternalObject (ACPI_TYPE_INTEGER);
+ if (!ReturnDesc)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Default return value is SUPPORTED */
+
+ ReturnDesc->Integer.Value = ACPI_UINT32_MAX;
+ WalkState->ReturnDesc = ReturnDesc;
+
+ /* Compare input string to static table of supported interfaces */
+
+ for (i = 0; i < ACPI_ARRAY_LENGTH (AcpiInterfacesSupported); i++)
+ {
+ if (!ACPI_STRCMP (StringDesc->String.Pointer, AcpiInterfacesSupported[i]))
+ {
+ /* The interface is supported */
+
+ return_ACPI_STATUS (AE_CTRL_TERMINATE);
+ }
+ }
+
+ /*
+ * Did not match the string in the static table, call the host OSL to
+ * check for a match with one of the optional strings (such as
+ * "Module Device", "3.0 Thermal Model", etc.)
+ */
+ Status = AcpiOsValidateInterface (StringDesc->String.Pointer);
+ if (ACPI_SUCCESS (Status))
+ {
+ /* The interface is supported */
+
+ return_ACPI_STATUS (AE_CTRL_TERMINATE);
+ }
+
+ /* The interface is not supported */
+
+ ReturnDesc->Integer.Value = 0;
+ return_ACPI_STATUS (AE_CTRL_TERMINATE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtEvaluateObject
+ *
+ * PARAMETERS: PrefixNode - Starting node
+ * Path - Path to object from starting node
+ * ExpectedReturnTypes - Bitmap of allowed return types
+ * ReturnDesc - Where a return value is stored
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Evaluates a namespace object and verifies the type of the
+ * return object. Common code that simplifies accessing objects
+ * that have required return objects of fixed types.
+ *
+ * NOTE: Internal function, no parameter validation
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtEvaluateObject (
+ ACPI_NAMESPACE_NODE *PrefixNode,
+ char *Path,
+ UINT32 ExpectedReturnBtypes,
+ ACPI_OPERAND_OBJECT **ReturnDesc)
+{
+ ACPI_EVALUATE_INFO *Info;
+ ACPI_STATUS Status;
+ UINT32 ReturnBtype;
+
+
+ ACPI_FUNCTION_TRACE (UtEvaluateObject);
+
+
+ /* Allocate the evaluation information block */
+
+ Info = ACPI_ALLOCATE_ZEROED (sizeof (ACPI_EVALUATE_INFO));
+ if (!Info)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ Info->PrefixNode = PrefixNode;
+ Info->Pathname = Path;
+ Info->ParameterType = ACPI_PARAM_ARGS;
+
+ /* Evaluate the object/method */
+
+ Status = AcpiNsEvaluate (Info);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status == AE_NOT_FOUND)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[%4.4s.%s] was not found\n",
+ AcpiUtGetNodeName (PrefixNode), Path));
+ }
+ else
+ {
+ ACPI_ERROR_METHOD ("Method execution failed",
+ PrefixNode, Path, Status);
+ }
+
+ goto Cleanup;
+ }
+
+ /* Did we get a return object? */
+
+ if (!Info->ReturnObject)
+ {
+ if (ExpectedReturnBtypes)
+ {
+ ACPI_ERROR_METHOD ("No object was returned from",
+ PrefixNode, Path, AE_NOT_EXIST);
+
+ Status = AE_NOT_EXIST;
+ }
+
+ goto Cleanup;
+ }
+
+ /* Map the return object type to the bitmapped type */
+
+ switch (ACPI_GET_OBJECT_TYPE (Info->ReturnObject))
+ {
+ case ACPI_TYPE_INTEGER:
+ ReturnBtype = ACPI_BTYPE_INTEGER;
+ break;
+
+ case ACPI_TYPE_BUFFER:
+ ReturnBtype = ACPI_BTYPE_BUFFER;
+ break;
+
+ case ACPI_TYPE_STRING:
+ ReturnBtype = ACPI_BTYPE_STRING;
+ break;
+
+ case ACPI_TYPE_PACKAGE:
+ ReturnBtype = ACPI_BTYPE_PACKAGE;
+ break;
+
+ default:
+ ReturnBtype = 0;
+ break;
+ }
+
+ if ((AcpiGbl_EnableInterpreterSlack) &&
+ (!ExpectedReturnBtypes))
+ {
+ /*
+ * We received a return object, but one was not expected. This can
+ * happen frequently if the "implicit return" feature is enabled.
+ * Just delete the return object and return AE_OK.
+ */
+ AcpiUtRemoveReference (Info->ReturnObject);
+ goto Cleanup;
+ }
+
+ /* Is the return object one of the expected types? */
+
+ if (!(ExpectedReturnBtypes & ReturnBtype))
+ {
+ ACPI_ERROR_METHOD ("Return object type is incorrect",
+ PrefixNode, Path, AE_TYPE);
+
+ ACPI_ERROR ((AE_INFO,
+ "Type returned from %s was incorrect: %s, expected Btypes: %X",
+ Path, AcpiUtGetObjectTypeName (Info->ReturnObject),
+ ExpectedReturnBtypes));
+
+ /* On error exit, we must delete the return object */
+
+ AcpiUtRemoveReference (Info->ReturnObject);
+ Status = AE_TYPE;
+ goto Cleanup;
+ }
+
+ /* Object type is OK, return it */
+
+ *ReturnDesc = Info->ReturnObject;
+
+Cleanup:
+ ACPI_FREE (Info);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtEvaluateNumericObject
+ *
+ * PARAMETERS: ObjectName - Object name to be evaluated
+ * DeviceNode - Node for the device
+ * Address - Where the value is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Evaluates a numeric namespace object for a selected device
+ * and stores result in *Address.
+ *
+ * NOTE: Internal function, no parameter validation
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtEvaluateNumericObject (
+ char *ObjectName,
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ ACPI_INTEGER *Address)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (UtEvaluateNumericObject);
+
+
+ Status = AcpiUtEvaluateObject (DeviceNode, ObjectName,
+ ACPI_BTYPE_INTEGER, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Get the returned Integer */
+
+ *Address = ObjDesc->Integer.Value;
+
+ /* On exit, we must delete the return object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCopyIdString
+ *
+ * PARAMETERS: Destination - Where to copy the string
+ * Source - Source string
+ * MaxLength - Length of the destination buffer
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Copies an ID string for the _HID, _CID, and _UID methods.
+ * Performs removal of a leading asterisk if present -- workaround
+ * for a known issue on a bunch of machines.
+ *
+ ******************************************************************************/
+
+static void
+AcpiUtCopyIdString (
+ char *Destination,
+ char *Source,
+ ACPI_SIZE MaxLength)
+{
+
+ /*
+ * Workaround for ID strings that have a leading asterisk. This construct
+ * is not allowed by the ACPI specification (ID strings must be
+ * alphanumeric), but enough existing machines have this embedded in their
+ * ID strings that the following code is useful.
+ */
+ if (*Source == '*')
+ {
+ Source++;
+ }
+
+ /* Do the actual copy */
+
+ ACPI_STRNCPY (Destination, Source, MaxLength);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtExecute_HID
+ *
+ * PARAMETERS: DeviceNode - Node for the device
+ * Hid - Where the HID is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Executes the _HID control method that returns the hardware
+ * ID of the device.
+ *
+ * NOTE: Internal function, no parameter validation
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtExecute_HID (
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ ACPI_DEVICE_ID *Hid)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (UtExecute_HID);
+
+
+ Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__HID,
+ ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
+ {
+ /* Convert the Numeric HID to string */
+
+ AcpiExEisaIdToString ((UINT32) ObjDesc->Integer.Value, Hid->Value);
+ }
+ else
+ {
+ /* Copy the String HID from the returned object */
+
+ AcpiUtCopyIdString (Hid->Value, ObjDesc->String.Pointer,
+ sizeof (Hid->Value));
+ }
+
+ /* On exit, we must delete the return object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtTranslateOneCid
+ *
+ * PARAMETERS: ObjDesc - _CID object, must be integer or string
+ * OneCid - Where the CID string is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Return a numeric or string _CID value as a string.
+ * (Compatible ID)
+ *
+ * NOTE: Assumes a maximum _CID string length of
+ * ACPI_MAX_CID_LENGTH.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtTranslateOneCid (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ ACPI_COMPATIBLE_ID *OneCid)
+{
+
+
+ switch (ACPI_GET_OBJECT_TYPE (ObjDesc))
+ {
+ case ACPI_TYPE_INTEGER:
+
+ /* Convert the Numeric CID to string */
+
+ AcpiExEisaIdToString ((UINT32) ObjDesc->Integer.Value, OneCid->Value);
+ return (AE_OK);
+
+ case ACPI_TYPE_STRING:
+
+ if (ObjDesc->String.Length > ACPI_MAX_CID_LENGTH)
+ {
+ return (AE_AML_STRING_LIMIT);
+ }
+
+ /* Copy the String CID from the returned object */
+
+ AcpiUtCopyIdString (OneCid->Value, ObjDesc->String.Pointer,
+ ACPI_MAX_CID_LENGTH);
+ return (AE_OK);
+
+ default:
+
+ return (AE_TYPE);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtExecute_CID
+ *
+ * PARAMETERS: DeviceNode - Node for the device
+ * ReturnCidList - Where the CID list is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Executes the _CID control method that returns one or more
+ * compatible hardware IDs for the device.
+ *
+ * NOTE: Internal function, no parameter validation
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtExecute_CID (
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ ACPI_COMPATIBLE_ID_LIST **ReturnCidList)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+ UINT32 Count;
+ UINT32 Size;
+ ACPI_COMPATIBLE_ID_LIST *CidList;
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_TRACE (UtExecute_CID);
+
+
+ /* Evaluate the _CID method for this device */
+
+ Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__CID,
+ ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING | ACPI_BTYPE_PACKAGE,
+ &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Get the number of _CIDs returned */
+
+ Count = 1;
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_PACKAGE)
+ {
+ Count = ObjDesc->Package.Count;
+ }
+
+ /* Allocate a worst-case buffer for the _CIDs */
+
+ Size = (((Count - 1) * sizeof (ACPI_COMPATIBLE_ID)) +
+ sizeof (ACPI_COMPATIBLE_ID_LIST));
+
+ CidList = ACPI_ALLOCATE_ZEROED ((ACPI_SIZE) Size);
+ if (!CidList)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ /* Init CID list */
+
+ CidList->Count = Count;
+ CidList->Size = Size;
+
+ /*
+ * A _CID can return either a single compatible ID or a package of
+ * compatible IDs. Each compatible ID can be one of the following:
+ * 1) Integer (32 bit compressed EISA ID) or
+ * 2) String (PCI ID format, e.g. "PCI\VEN_vvvv&DEV_dddd&SUBSYS_ssssssss")
+ */
+
+ /* The _CID object can be either a single CID or a package (list) of CIDs */
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_PACKAGE)
+ {
+ /* Translate each package element */
+
+ for (i = 0; i < Count; i++)
+ {
+ Status = AcpiUtTranslateOneCid (ObjDesc->Package.Elements[i],
+ &CidList->Id[i]);
+ if (ACPI_FAILURE (Status))
+ {
+ break;
+ }
+ }
+ }
+ else
+ {
+ /* Only one CID, translate to a string */
+
+ Status = AcpiUtTranslateOneCid (ObjDesc, CidList->Id);
+ }
+
+ /* Cleanup on error */
+
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_FREE (CidList);
+ }
+ else
+ {
+ *ReturnCidList = CidList;
+ }
+
+ /* On exit, we must delete the _CID return object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtExecute_UID
+ *
+ * PARAMETERS: DeviceNode - Node for the device
+ * Uid - Where the UID is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Executes the _UID control method that returns the hardware
+ * ID of the device.
+ *
+ * NOTE: Internal function, no parameter validation
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtExecute_UID (
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ ACPI_DEVICE_ID *Uid)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (UtExecute_UID);
+
+
+ Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__UID,
+ ACPI_BTYPE_INTEGER | ACPI_BTYPE_STRING, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ if (ACPI_GET_OBJECT_TYPE (ObjDesc) == ACPI_TYPE_INTEGER)
+ {
+ /* Convert the Numeric UID to string */
+
+ AcpiExUnsignedIntegerToString (ObjDesc->Integer.Value, Uid->Value);
+ }
+ else
+ {
+ /* Copy the String UID from the returned object */
+
+ AcpiUtCopyIdString (Uid->Value, ObjDesc->String.Pointer,
+ sizeof (Uid->Value));
+ }
+
+ /* On exit, we must delete the return object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtExecute_STA
+ *
+ * PARAMETERS: DeviceNode - Node for the device
+ * Flags - Where the status flags are returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Executes _STA for selected device and stores results in
+ * *Flags.
+ *
+ * NOTE: Internal function, no parameter validation
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtExecute_STA (
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ UINT32 *Flags)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (UtExecute_STA);
+
+
+ Status = AcpiUtEvaluateObject (DeviceNode, METHOD_NAME__STA,
+ ACPI_BTYPE_INTEGER, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ if (AE_NOT_FOUND == Status)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "_STA on %4.4s was not found, assuming device is present\n",
+ AcpiUtGetNodeName (DeviceNode)));
+
+ *Flags = ACPI_UINT32_MAX;
+ Status = AE_OK;
+ }
+
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Extract the status flags */
+
+ *Flags = (UINT32) ObjDesc->Integer.Value;
+
+ /* On exit, we must delete the return object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtExecute_Sxds
+ *
+ * PARAMETERS: DeviceNode - Node for the device
+ * Flags - Where the status flags are returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Executes _STA for selected device and stores results in
+ * *Flags.
+ *
+ * NOTE: Internal function, no parameter validation
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtExecute_Sxds (
+ ACPI_NAMESPACE_NODE *DeviceNode,
+ UINT8 *Highest)
+{
+ ACPI_OPERAND_OBJECT *ObjDesc;
+ ACPI_STATUS Status;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE (UtExecute_Sxds);
+
+
+ for (i = 0; i < 4; i++)
+ {
+ Highest[i] = 0xFF;
+ Status = AcpiUtEvaluateObject (DeviceNode,
+ ACPI_CAST_PTR (char, AcpiGbl_HighestDstateNames[i]),
+ ACPI_BTYPE_INTEGER, &ObjDesc);
+ if (ACPI_FAILURE (Status))
+ {
+ if (Status != AE_NOT_FOUND)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "%s on Device %4.4s, %s\n",
+ ACPI_CAST_PTR (char, AcpiGbl_HighestDstateNames[i]),
+ AcpiUtGetNodeName (DeviceNode),
+ AcpiFormatException (Status)));
+
+ return_ACPI_STATUS (Status);
+ }
+ }
+ else
+ {
+ /* Extract the Dstate value */
+
+ Highest[i] = (UINT8) ObjDesc->Integer.Value;
+
+ /* Delete the return object */
+
+ AcpiUtRemoveReference (ObjDesc);
+ }
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
diff --git a/sys/contrib/dev/acpica/utglobal.c b/sys/contrib/dev/acpica/utglobal.c
new file mode 100644
index 0000000..b83d288
--- /dev/null
+++ b/sys/contrib/dev/acpica/utglobal.c
@@ -0,0 +1,842 @@
+/******************************************************************************
+ *
+ * Module Name: utglobal - Global variables for the ACPI subsystem
+ * $Revision: 1.249 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __UTGLOBAL_C__
+#define DEFINE_ACPI_GLOBALS
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+ACPI_EXPORT_SYMBOL (AcpiGbl_FADT)
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utglobal")
+
+
+/*******************************************************************************
+ *
+ * Static global variable initialization.
+ *
+ ******************************************************************************/
+
+/*
+ * We want the debug switches statically initialized so they
+ * are already set when the debugger is entered.
+ */
+
+/* Debug switch - level and trace mask */
+
+#ifdef ACPI_DEBUG_OUTPUT
+UINT32 AcpiDbgLevel = ACPI_DEBUG_DEFAULT;
+#else
+UINT32 AcpiDbgLevel = ACPI_NORMAL_DEFAULT;
+#endif
+
+/* Debug switch - layer (component) mask */
+
+UINT32 AcpiDbgLayer = ACPI_COMPONENT_DEFAULT;
+UINT32 AcpiGbl_NestingLevel = 0;
+
+/* Debugger globals */
+
+BOOLEAN AcpiGbl_DbTerminateThreads = FALSE;
+BOOLEAN AcpiGbl_AbortMethod = FALSE;
+BOOLEAN AcpiGbl_MethodExecuting = FALSE;
+
+/* System flags */
+
+UINT32 AcpiGbl_StartupFlags = 0;
+
+/* System starts uninitialized */
+
+BOOLEAN AcpiGbl_Shutdown = TRUE;
+
+const char *AcpiGbl_SleepStateNames[ACPI_S_STATE_COUNT] =
+{
+ "\\_S0_",
+ "\\_S1_",
+ "\\_S2_",
+ "\\_S3_",
+ "\\_S4_",
+ "\\_S5_"
+};
+
+const char *AcpiGbl_HighestDstateNames[4] =
+{
+ "_S1D",
+ "_S2D",
+ "_S3D",
+ "_S4D"
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiFormatException
+ *
+ * PARAMETERS: Status - The ACPI_STATUS code to be formatted
+ *
+ * RETURN: A string containing the exception text. A valid pointer is
+ * always returned.
+ *
+ * DESCRIPTION: This function translates an ACPI exception into an ASCII string
+ * It is here instead of utxface.c so it is always present.
+ *
+ ******************************************************************************/
+
+const char *
+AcpiFormatException (
+ ACPI_STATUS Status)
+{
+ const char *Exception = NULL;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ Exception = AcpiUtValidateException (Status);
+ if (!Exception)
+ {
+ /* Exception code was not recognized */
+
+ ACPI_ERROR ((AE_INFO,
+ "Unknown exception code: 0x%8.8X", Status));
+
+ Exception = "UNKNOWN_STATUS_CODE";
+ }
+
+ return (ACPI_CAST_PTR (const char, Exception));
+}
+
+ACPI_EXPORT_SYMBOL (AcpiFormatException)
+
+
+/*******************************************************************************
+ *
+ * Namespace globals
+ *
+ ******************************************************************************/
+
+/*
+ * Predefined ACPI Names (Built-in to the Interpreter)
+ *
+ * NOTES:
+ * 1) _SB_ is defined to be a device to allow \_SB_._INI to be run
+ * during the initialization sequence.
+ * 2) _TZ_ is defined to be a thermal zone in order to allow ASL code to
+ * perform a Notify() operation on it.
+ */
+const ACPI_PREDEFINED_NAMES AcpiGbl_PreDefinedNames[] =
+{
+ {"_GPE", ACPI_TYPE_LOCAL_SCOPE, NULL},
+ {"_PR_", ACPI_TYPE_LOCAL_SCOPE, NULL},
+ {"_SB_", ACPI_TYPE_DEVICE, NULL},
+ {"_SI_", ACPI_TYPE_LOCAL_SCOPE, NULL},
+ {"_TZ_", ACPI_TYPE_THERMAL, NULL},
+ {"_REV", ACPI_TYPE_INTEGER, (char *) ACPI_CA_SUPPORT_LEVEL},
+ {"_OS_", ACPI_TYPE_STRING, ACPI_OS_NAME},
+ {"_GL_", ACPI_TYPE_MUTEX, (char *) 1},
+
+#if !defined (ACPI_NO_METHOD_EXECUTION) || defined (ACPI_CONSTANT_EVAL_ONLY)
+ {"_OSI", ACPI_TYPE_METHOD, (char *) 1},
+#endif
+
+ /* Table terminator */
+
+ {NULL, ACPI_TYPE_ANY, NULL}
+};
+
+/*
+ * Properties of the ACPI Object Types, both internal and external.
+ * The table is indexed by values of ACPI_OBJECT_TYPE
+ */
+const UINT8 AcpiGbl_NsProperties[] =
+{
+ ACPI_NS_NORMAL, /* 00 Any */
+ ACPI_NS_NORMAL, /* 01 Number */
+ ACPI_NS_NORMAL, /* 02 String */
+ ACPI_NS_NORMAL, /* 03 Buffer */
+ ACPI_NS_NORMAL, /* 04 Package */
+ ACPI_NS_NORMAL, /* 05 FieldUnit */
+ ACPI_NS_NEWSCOPE, /* 06 Device */
+ ACPI_NS_NORMAL, /* 07 Event */
+ ACPI_NS_NEWSCOPE, /* 08 Method */
+ ACPI_NS_NORMAL, /* 09 Mutex */
+ ACPI_NS_NORMAL, /* 10 Region */
+ ACPI_NS_NEWSCOPE, /* 11 Power */
+ ACPI_NS_NEWSCOPE, /* 12 Processor */
+ ACPI_NS_NEWSCOPE, /* 13 Thermal */
+ ACPI_NS_NORMAL, /* 14 BufferField */
+ ACPI_NS_NORMAL, /* 15 DdbHandle */
+ ACPI_NS_NORMAL, /* 16 Debug Object */
+ ACPI_NS_NORMAL, /* 17 DefField */
+ ACPI_NS_NORMAL, /* 18 BankField */
+ ACPI_NS_NORMAL, /* 19 IndexField */
+ ACPI_NS_NORMAL, /* 20 Reference */
+ ACPI_NS_NORMAL, /* 21 Alias */
+ ACPI_NS_NORMAL, /* 22 MethodAlias */
+ ACPI_NS_NORMAL, /* 23 Notify */
+ ACPI_NS_NORMAL, /* 24 Address Handler */
+ ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL, /* 25 Resource Desc */
+ ACPI_NS_NEWSCOPE | ACPI_NS_LOCAL, /* 26 Resource Field */
+ ACPI_NS_NEWSCOPE, /* 27 Scope */
+ ACPI_NS_NORMAL, /* 28 Extra */
+ ACPI_NS_NORMAL, /* 29 Data */
+ ACPI_NS_NORMAL /* 30 Invalid */
+};
+
+
+/* Hex to ASCII conversion table */
+
+static const char AcpiGbl_HexToAscii[] =
+{
+ '0','1','2','3','4','5','6','7',
+ '8','9','A','B','C','D','E','F'
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtHexToAsciiChar
+ *
+ * PARAMETERS: Integer - Contains the hex digit
+ * Position - bit position of the digit within the
+ * integer (multiple of 4)
+ *
+ * RETURN: The converted Ascii character
+ *
+ * DESCRIPTION: Convert a hex digit to an Ascii character
+ *
+ ******************************************************************************/
+
+char
+AcpiUtHexToAsciiChar (
+ ACPI_INTEGER Integer,
+ UINT32 Position)
+{
+
+ return (AcpiGbl_HexToAscii[(Integer >> Position) & 0xF]);
+}
+
+
+/******************************************************************************
+ *
+ * Event and Hardware globals
+ *
+ ******************************************************************************/
+
+ACPI_BIT_REGISTER_INFO AcpiGbl_BitRegisterInfo[ACPI_NUM_BITREG] =
+{
+ /* Name Parent Register Register Bit Position Register Bit Mask */
+
+ /* ACPI_BITREG_TIMER_STATUS */ {ACPI_REGISTER_PM1_STATUS, ACPI_BITPOSITION_TIMER_STATUS, ACPI_BITMASK_TIMER_STATUS},
+ /* ACPI_BITREG_BUS_MASTER_STATUS */ {ACPI_REGISTER_PM1_STATUS, ACPI_BITPOSITION_BUS_MASTER_STATUS, ACPI_BITMASK_BUS_MASTER_STATUS},
+ /* ACPI_BITREG_GLOBAL_LOCK_STATUS */ {ACPI_REGISTER_PM1_STATUS, ACPI_BITPOSITION_GLOBAL_LOCK_STATUS, ACPI_BITMASK_GLOBAL_LOCK_STATUS},
+ /* ACPI_BITREG_POWER_BUTTON_STATUS */ {ACPI_REGISTER_PM1_STATUS, ACPI_BITPOSITION_POWER_BUTTON_STATUS, ACPI_BITMASK_POWER_BUTTON_STATUS},
+ /* ACPI_BITREG_SLEEP_BUTTON_STATUS */ {ACPI_REGISTER_PM1_STATUS, ACPI_BITPOSITION_SLEEP_BUTTON_STATUS, ACPI_BITMASK_SLEEP_BUTTON_STATUS},
+ /* ACPI_BITREG_RT_CLOCK_STATUS */ {ACPI_REGISTER_PM1_STATUS, ACPI_BITPOSITION_RT_CLOCK_STATUS, ACPI_BITMASK_RT_CLOCK_STATUS},
+ /* ACPI_BITREG_WAKE_STATUS */ {ACPI_REGISTER_PM1_STATUS, ACPI_BITPOSITION_WAKE_STATUS, ACPI_BITMASK_WAKE_STATUS},
+ /* ACPI_BITREG_PCIEXP_WAKE_STATUS */ {ACPI_REGISTER_PM1_STATUS, ACPI_BITPOSITION_PCIEXP_WAKE_STATUS, ACPI_BITMASK_PCIEXP_WAKE_STATUS},
+
+ /* ACPI_BITREG_TIMER_ENABLE */ {ACPI_REGISTER_PM1_ENABLE, ACPI_BITPOSITION_TIMER_ENABLE, ACPI_BITMASK_TIMER_ENABLE},
+ /* ACPI_BITREG_GLOBAL_LOCK_ENABLE */ {ACPI_REGISTER_PM1_ENABLE, ACPI_BITPOSITION_GLOBAL_LOCK_ENABLE, ACPI_BITMASK_GLOBAL_LOCK_ENABLE},
+ /* ACPI_BITREG_POWER_BUTTON_ENABLE */ {ACPI_REGISTER_PM1_ENABLE, ACPI_BITPOSITION_POWER_BUTTON_ENABLE, ACPI_BITMASK_POWER_BUTTON_ENABLE},
+ /* ACPI_BITREG_SLEEP_BUTTON_ENABLE */ {ACPI_REGISTER_PM1_ENABLE, ACPI_BITPOSITION_SLEEP_BUTTON_ENABLE, ACPI_BITMASK_SLEEP_BUTTON_ENABLE},
+ /* ACPI_BITREG_RT_CLOCK_ENABLE */ {ACPI_REGISTER_PM1_ENABLE, ACPI_BITPOSITION_RT_CLOCK_ENABLE, ACPI_BITMASK_RT_CLOCK_ENABLE},
+ /* ACPI_BITREG_WAKE_ENABLE */ {ACPI_REGISTER_PM1_ENABLE, 0, 0},
+ /* ACPI_BITREG_PCIEXP_WAKE_DISABLE */ {ACPI_REGISTER_PM1_ENABLE, ACPI_BITPOSITION_PCIEXP_WAKE_DISABLE, ACPI_BITMASK_PCIEXP_WAKE_DISABLE},
+
+ /* ACPI_BITREG_SCI_ENABLE */ {ACPI_REGISTER_PM1_CONTROL, ACPI_BITPOSITION_SCI_ENABLE, ACPI_BITMASK_SCI_ENABLE},
+ /* ACPI_BITREG_BUS_MASTER_RLD */ {ACPI_REGISTER_PM1_CONTROL, ACPI_BITPOSITION_BUS_MASTER_RLD, ACPI_BITMASK_BUS_MASTER_RLD},
+ /* ACPI_BITREG_GLOBAL_LOCK_RELEASE */ {ACPI_REGISTER_PM1_CONTROL, ACPI_BITPOSITION_GLOBAL_LOCK_RELEASE, ACPI_BITMASK_GLOBAL_LOCK_RELEASE},
+ /* ACPI_BITREG_SLEEP_TYPE_A */ {ACPI_REGISTER_PM1_CONTROL, ACPI_BITPOSITION_SLEEP_TYPE_X, ACPI_BITMASK_SLEEP_TYPE_X},
+ /* ACPI_BITREG_SLEEP_TYPE_B */ {ACPI_REGISTER_PM1_CONTROL, ACPI_BITPOSITION_SLEEP_TYPE_X, ACPI_BITMASK_SLEEP_TYPE_X},
+ /* ACPI_BITREG_SLEEP_ENABLE */ {ACPI_REGISTER_PM1_CONTROL, ACPI_BITPOSITION_SLEEP_ENABLE, ACPI_BITMASK_SLEEP_ENABLE},
+
+ /* ACPI_BITREG_ARB_DIS */ {ACPI_REGISTER_PM2_CONTROL, ACPI_BITPOSITION_ARB_DISABLE, ACPI_BITMASK_ARB_DISABLE}
+};
+
+
+ACPI_FIXED_EVENT_INFO AcpiGbl_FixedEventInfo[ACPI_NUM_FIXED_EVENTS] =
+{
+ /* ACPI_EVENT_PMTIMER */ {ACPI_BITREG_TIMER_STATUS, ACPI_BITREG_TIMER_ENABLE, ACPI_BITMASK_TIMER_STATUS, ACPI_BITMASK_TIMER_ENABLE},
+ /* ACPI_EVENT_GLOBAL */ {ACPI_BITREG_GLOBAL_LOCK_STATUS, ACPI_BITREG_GLOBAL_LOCK_ENABLE, ACPI_BITMASK_GLOBAL_LOCK_STATUS, ACPI_BITMASK_GLOBAL_LOCK_ENABLE},
+ /* ACPI_EVENT_POWER_BUTTON */ {ACPI_BITREG_POWER_BUTTON_STATUS, ACPI_BITREG_POWER_BUTTON_ENABLE, ACPI_BITMASK_POWER_BUTTON_STATUS, ACPI_BITMASK_POWER_BUTTON_ENABLE},
+ /* ACPI_EVENT_SLEEP_BUTTON */ {ACPI_BITREG_SLEEP_BUTTON_STATUS, ACPI_BITREG_SLEEP_BUTTON_ENABLE, ACPI_BITMASK_SLEEP_BUTTON_STATUS, ACPI_BITMASK_SLEEP_BUTTON_ENABLE},
+ /* ACPI_EVENT_RTC */ {ACPI_BITREG_RT_CLOCK_STATUS, ACPI_BITREG_RT_CLOCK_ENABLE, ACPI_BITMASK_RT_CLOCK_STATUS, ACPI_BITMASK_RT_CLOCK_ENABLE},
+};
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetRegionName
+ *
+ * PARAMETERS: None.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Translate a Space ID into a name string (Debug only)
+ *
+ ******************************************************************************/
+
+/* Region type decoding */
+
+const char *AcpiGbl_RegionTypes[ACPI_NUM_PREDEFINED_REGIONS] =
+{
+ "SystemMemory",
+ "SystemIO",
+ "PCI_Config",
+ "EmbeddedControl",
+ "SMBus",
+ "CMOS",
+ "PCIBARTarget",
+ "DataTable"
+};
+
+
+char *
+AcpiUtGetRegionName (
+ UINT8 SpaceId)
+{
+
+ if (SpaceId >= ACPI_USER_REGION_BEGIN)
+ {
+ return ("UserDefinedRegion");
+ }
+ else if (SpaceId >= ACPI_NUM_PREDEFINED_REGIONS)
+ {
+ return ("InvalidSpaceId");
+ }
+
+ return (ACPI_CAST_PTR (char, AcpiGbl_RegionTypes[SpaceId]));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetEventName
+ *
+ * PARAMETERS: None.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Translate a Event ID into a name string (Debug only)
+ *
+ ******************************************************************************/
+
+/* Event type decoding */
+
+static const char *AcpiGbl_EventTypes[ACPI_NUM_FIXED_EVENTS] =
+{
+ "PM_Timer",
+ "GlobalLock",
+ "PowerButton",
+ "SleepButton",
+ "RealTimeClock",
+};
+
+
+char *
+AcpiUtGetEventName (
+ UINT32 EventId)
+{
+
+ if (EventId > ACPI_EVENT_MAX)
+ {
+ return ("InvalidEventID");
+ }
+
+ return (ACPI_CAST_PTR (char, AcpiGbl_EventTypes[EventId]));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetTypeName
+ *
+ * PARAMETERS: None.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Translate a Type ID into a name string (Debug only)
+ *
+ ******************************************************************************/
+
+/*
+ * Elements of AcpiGbl_NsTypeNames below must match
+ * one-to-one with values of ACPI_OBJECT_TYPE
+ *
+ * The type ACPI_TYPE_ANY (Untyped) is used as a "don't care" when searching;
+ * when stored in a table it really means that we have thus far seen no
+ * evidence to indicate what type is actually going to be stored for this entry.
+ */
+static const char AcpiGbl_BadType[] = "UNDEFINED";
+
+/* Printable names of the ACPI object types */
+
+static const char *AcpiGbl_NsTypeNames[] =
+{
+ /* 00 */ "Untyped",
+ /* 01 */ "Integer",
+ /* 02 */ "String",
+ /* 03 */ "Buffer",
+ /* 04 */ "Package",
+ /* 05 */ "FieldUnit",
+ /* 06 */ "Device",
+ /* 07 */ "Event",
+ /* 08 */ "Method",
+ /* 09 */ "Mutex",
+ /* 10 */ "Region",
+ /* 11 */ "Power",
+ /* 12 */ "Processor",
+ /* 13 */ "Thermal",
+ /* 14 */ "BufferField",
+ /* 15 */ "DdbHandle",
+ /* 16 */ "DebugObject",
+ /* 17 */ "RegionField",
+ /* 18 */ "BankField",
+ /* 19 */ "IndexField",
+ /* 20 */ "Reference",
+ /* 21 */ "Alias",
+ /* 22 */ "MethodAlias",
+ /* 23 */ "Notify",
+ /* 24 */ "AddrHandler",
+ /* 25 */ "ResourceDesc",
+ /* 26 */ "ResourceFld",
+ /* 27 */ "Scope",
+ /* 28 */ "Extra",
+ /* 29 */ "Data",
+ /* 30 */ "Invalid"
+};
+
+
+char *
+AcpiUtGetTypeName (
+ ACPI_OBJECT_TYPE Type)
+{
+
+ if (Type > ACPI_TYPE_INVALID)
+ {
+ return (ACPI_CAST_PTR (char, AcpiGbl_BadType));
+ }
+
+ return (ACPI_CAST_PTR (char, AcpiGbl_NsTypeNames[Type]));
+}
+
+
+char *
+AcpiUtGetObjectTypeName (
+ ACPI_OPERAND_OBJECT *ObjDesc)
+{
+
+ if (!ObjDesc)
+ {
+ return ("[NULL Object Descriptor]");
+ }
+
+ return (AcpiUtGetTypeName (ACPI_GET_OBJECT_TYPE (ObjDesc)));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetNodeName
+ *
+ * PARAMETERS: Object - A namespace node
+ *
+ * RETURN: Pointer to a string
+ *
+ * DESCRIPTION: Validate the node and return the node's ACPI name.
+ *
+ ******************************************************************************/
+
+char *
+AcpiUtGetNodeName (
+ void *Object)
+{
+ ACPI_NAMESPACE_NODE *Node = (ACPI_NAMESPACE_NODE *) Object;
+
+
+ /* Must return a string of exactly 4 characters == ACPI_NAME_SIZE */
+
+ if (!Object)
+ {
+ return ("NULL");
+ }
+
+ /* Check for Root node */
+
+ if ((Object == ACPI_ROOT_OBJECT) ||
+ (Object == AcpiGbl_RootNode))
+ {
+ return ("\"\\\" ");
+ }
+
+ /* Descriptor must be a namespace node */
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Node) != ACPI_DESC_TYPE_NAMED)
+ {
+ return ("####");
+ }
+
+ /* Name must be a valid ACPI name */
+
+ if (!AcpiUtValidAcpiName (Node->Name.Integer))
+ {
+ Node->Name.Integer = AcpiUtRepairName (Node->Name.Ascii);
+ }
+
+ /* Return the name */
+
+ return (Node->Name.Ascii);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetDescriptorName
+ *
+ * PARAMETERS: Object - An ACPI object
+ *
+ * RETURN: Pointer to a string
+ *
+ * DESCRIPTION: Validate object and return the descriptor type
+ *
+ ******************************************************************************/
+
+/* Printable names of object descriptor types */
+
+static const char *AcpiGbl_DescTypeNames[] =
+{
+ /* 00 */ "Invalid",
+ /* 01 */ "Cached",
+ /* 02 */ "State-Generic",
+ /* 03 */ "State-Update",
+ /* 04 */ "State-Package",
+ /* 05 */ "State-Control",
+ /* 06 */ "State-RootParseScope",
+ /* 07 */ "State-ParseScope",
+ /* 08 */ "State-WalkScope",
+ /* 09 */ "State-Result",
+ /* 10 */ "State-Notify",
+ /* 11 */ "State-Thread",
+ /* 12 */ "Walk",
+ /* 13 */ "Parser",
+ /* 14 */ "Operand",
+ /* 15 */ "Node"
+};
+
+
+char *
+AcpiUtGetDescriptorName (
+ void *Object)
+{
+
+ if (!Object)
+ {
+ return ("NULL OBJECT");
+ }
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Object) > ACPI_DESC_TYPE_MAX)
+ {
+ return (ACPI_CAST_PTR (char, AcpiGbl_BadType));
+ }
+
+ return (ACPI_CAST_PTR (char,
+ AcpiGbl_DescTypeNames[ACPI_GET_DESCRIPTOR_TYPE (Object)]));
+
+}
+
+
+#if defined(ACPI_DEBUG_OUTPUT) || defined(ACPI_DEBUGGER)
+/*
+ * Strings and procedures used for debug only
+ */
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetMutexName
+ *
+ * PARAMETERS: MutexId - The predefined ID for this mutex.
+ *
+ * RETURN: String containing the name of the mutex. Always returns a valid
+ * pointer.
+ *
+ * DESCRIPTION: Translate a mutex ID into a name string (Debug only)
+ *
+ ******************************************************************************/
+
+char *
+AcpiUtGetMutexName (
+ UINT32 MutexId)
+{
+
+ if (MutexId > ACPI_MAX_MUTEX)
+ {
+ return ("Invalid Mutex ID");
+ }
+
+ return (AcpiGbl_MutexNames[MutexId]);
+}
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtValidObjectType
+ *
+ * PARAMETERS: Type - Object type to be validated
+ *
+ * RETURN: TRUE if valid object type, FALSE otherwise
+ *
+ * DESCRIPTION: Validate an object type
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiUtValidObjectType (
+ ACPI_OBJECT_TYPE Type)
+{
+
+ if (Type > ACPI_TYPE_LOCAL_MAX)
+ {
+ /* Note: Assumes all TYPEs are contiguous (external/local) */
+
+ return (FALSE);
+ }
+
+ return (TRUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtInitGlobals
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Init library globals. All globals that require specific
+ * initialization should be initialized here!
+ *
+ ******************************************************************************/
+
+void
+AcpiUtInitGlobals (
+ void)
+{
+ ACPI_STATUS Status;
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE (UtInitGlobals);
+
+
+ /* Create all memory caches */
+
+ Status = AcpiUtCreateCaches ();
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ /* Mutex locked flags */
+
+ for (i = 0; i < ACPI_NUM_MUTEX; i++)
+ {
+ AcpiGbl_MutexInfo[i].Mutex = NULL;
+ AcpiGbl_MutexInfo[i].ThreadId = ACPI_MUTEX_NOT_ACQUIRED;
+ AcpiGbl_MutexInfo[i].UseCount = 0;
+ }
+
+ for (i = 0; i < ACPI_NUM_OWNERID_MASKS; i++)
+ {
+ AcpiGbl_OwnerIdMask[i] = 0;
+ }
+ AcpiGbl_OwnerIdMask[ACPI_NUM_OWNERID_MASKS - 1] = 0x80000000; /* Last ID is never valid */
+
+ /* GPE support */
+
+ AcpiGpeCount = 0;
+ AcpiGbl_GpeXruptListHead = NULL;
+ AcpiGbl_GpeFadtBlocks[0] = NULL;
+ AcpiGbl_GpeFadtBlocks[1] = NULL;
+
+ /* Global notify handlers */
+
+ AcpiGbl_SystemNotify.Handler = NULL;
+ AcpiGbl_DeviceNotify.Handler = NULL;
+ AcpiGbl_ExceptionHandler = NULL;
+ AcpiGbl_InitHandler = NULL;
+
+ /* Global Lock support */
+
+ AcpiGbl_GlobalLockSemaphore = NULL;
+ AcpiGbl_GlobalLockMutex = NULL;
+ AcpiGbl_GlobalLockAcquired = FALSE;
+ AcpiGbl_GlobalLockHandle = 0;
+
+ /* Miscellaneous variables */
+
+ AcpiGbl_CmSingleStep = FALSE;
+ AcpiGbl_DbTerminateThreads = FALSE;
+ AcpiGbl_Shutdown = FALSE;
+ AcpiGbl_NsLookupCount = 0;
+ AcpiGbl_PsFindCount = 0;
+ AcpiGbl_AcpiHardwarePresent = TRUE;
+ AcpiGbl_LastOwnerIdIndex = 0;
+ AcpiGbl_NextOwnerIdOffset = 0;
+ AcpiGbl_TraceMethodName = 0;
+ AcpiGbl_TraceDbgLevel = 0;
+ AcpiGbl_TraceDbgLayer = 0;
+ AcpiGbl_DebuggerConfiguration = DEBUGGER_THREADING;
+ AcpiGbl_DbOutputFlags = ACPI_DB_CONSOLE_OUTPUT;
+
+ /* Hardware oriented */
+
+ AcpiGbl_EventsInitialized = FALSE;
+ AcpiGbl_SystemAwakeAndRunning = TRUE;
+
+ /* Namespace */
+
+ AcpiGbl_RootNode = NULL;
+ AcpiGbl_RootNodeStruct.Name.Integer = ACPI_ROOT_NAME;
+ AcpiGbl_RootNodeStruct.DescriptorType = ACPI_DESC_TYPE_NAMED;
+ AcpiGbl_RootNodeStruct.Type = ACPI_TYPE_DEVICE;
+ AcpiGbl_RootNodeStruct.Child = NULL;
+ AcpiGbl_RootNodeStruct.Peer = NULL;
+ AcpiGbl_RootNodeStruct.Object = NULL;
+ AcpiGbl_RootNodeStruct.Flags = ANOBJ_END_OF_PEER_LIST;
+
+
+#ifdef ACPI_DEBUG_OUTPUT
+ AcpiGbl_LowestStackPointer = ACPI_SIZE_MAX;
+#endif
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+ AcpiGbl_DisplayFinalMemStats = FALSE;
+#endif
+
+ return_VOID;
+}
+
+/* Public globals */
+
+ACPI_EXPORT_SYMBOL (AcpiDbgLevel)
+ACPI_EXPORT_SYMBOL (AcpiDbgLayer)
+ACPI_EXPORT_SYMBOL (AcpiGpeCount)
+
+
diff --git a/sys/contrib/dev/acpica/utinit.c b/sys/contrib/dev/acpica/utinit.c
new file mode 100644
index 0000000..b16d542
--- /dev/null
+++ b/sys/contrib/dev/acpica/utinit.c
@@ -0,0 +1,241 @@
+/******************************************************************************
+ *
+ * Module Name: utinit - Common ACPI subsystem initialization
+ * $Revision: 1.135 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __UTINIT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/actables.h>
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utinit")
+
+/* Local prototypes */
+
+static void AcpiUtTerminate (
+ void);
+
+
+/******************************************************************************
+ *
+ * FUNCTION: AcpiUtTerminate
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Free global memory
+ *
+ ******************************************************************************/
+
+static void
+AcpiUtTerminate (
+ void)
+{
+ ACPI_GPE_BLOCK_INFO *GpeBlock;
+ ACPI_GPE_BLOCK_INFO *NextGpeBlock;
+ ACPI_GPE_XRUPT_INFO *GpeXruptInfo;
+ ACPI_GPE_XRUPT_INFO *NextGpeXruptInfo;
+
+
+ ACPI_FUNCTION_TRACE (UtTerminate);
+
+
+ /* Free global GPE blocks and related info structures */
+
+ GpeXruptInfo = AcpiGbl_GpeXruptListHead;
+ while (GpeXruptInfo)
+ {
+ GpeBlock = GpeXruptInfo->GpeBlockListHead;
+ while (GpeBlock)
+ {
+ NextGpeBlock = GpeBlock->Next;
+ ACPI_FREE (GpeBlock->EventInfo);
+ ACPI_FREE (GpeBlock->RegisterInfo);
+ ACPI_FREE (GpeBlock);
+
+ GpeBlock = NextGpeBlock;
+ }
+ NextGpeXruptInfo = GpeXruptInfo->Next;
+ ACPI_FREE (GpeXruptInfo);
+ GpeXruptInfo = NextGpeXruptInfo;
+ }
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtSubsystemShutdown
+ *
+ * PARAMETERS: none
+ *
+ * RETURN: none
+ *
+ * DESCRIPTION: Shutdown the various subsystems. Don't delete the mutex
+ * objects here -- because the AML debugger may be still running.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtSubsystemShutdown (
+ void)
+{
+
+ ACPI_FUNCTION_TRACE (UtSubsystemShutdown);
+
+ /* Just exit if subsystem is already shutdown */
+
+ if (AcpiGbl_Shutdown)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "ACPI Subsystem is already terminated"));
+ return_VOID;
+ }
+
+ /* Subsystem appears active, go ahead and shut it down */
+
+ AcpiGbl_Shutdown = TRUE;
+ AcpiGbl_StartupFlags = 0;
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "Shutting down ACPI Subsystem\n"));
+
+ /* Close the AcpiEvent Handling */
+
+ AcpiEvTerminate ();
+
+ /* Close the Namespace */
+
+ AcpiNsTerminate ();
+
+ /* Delete the ACPI tables */
+
+ AcpiTbTerminate ();
+
+ /* Close the globals */
+
+ AcpiUtTerminate ();
+
+ /* Purge the local caches */
+
+ (void) AcpiUtDeleteCaches ();
+ return_VOID;
+}
+
+
diff --git a/sys/contrib/dev/acpica/utmath.c b/sys/contrib/dev/acpica/utmath.c
new file mode 100644
index 0000000..f6dad73
--- /dev/null
+++ b/sys/contrib/dev/acpica/utmath.c
@@ -0,0 +1,431 @@
+/*******************************************************************************
+ *
+ * Module Name: utmath - Integer math support routines
+ * $Revision: 1.22 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __UTMATH_C__
+
+#include <contrib/dev/acpica/acpi.h>
+
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utmath")
+
+/*
+ * Support for double-precision integer divide. This code is included here
+ * in order to support kernel environments where the double-precision math
+ * library is not available.
+ */
+
+#ifndef ACPI_USE_NATIVE_DIVIDE
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtShortDivide
+ *
+ * PARAMETERS: Dividend - 64-bit dividend
+ * Divisor - 32-bit divisor
+ * OutQuotient - Pointer to where the quotient is returned
+ * OutRemainder - Pointer to where the remainder is returned
+ *
+ * RETURN: Status (Checks for divide-by-zero)
+ *
+ * DESCRIPTION: Perform a short (maximum 64 bits divided by 32 bits)
+ * divide and modulo. The result is a 64-bit quotient and a
+ * 32-bit remainder.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortDivide (
+ ACPI_INTEGER Dividend,
+ UINT32 Divisor,
+ ACPI_INTEGER *OutQuotient,
+ UINT32 *OutRemainder)
+{
+ UINT64_OVERLAY DividendOvl;
+ UINT64_OVERLAY Quotient;
+ UINT32 Remainder32;
+
+
+ ACPI_FUNCTION_TRACE (UtShortDivide);
+
+
+ /* Always check for a zero divisor */
+
+ if (Divisor == 0)
+ {
+ ACPI_ERROR ((AE_INFO, "Divide by zero"));
+ return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
+ }
+
+ DividendOvl.Full = Dividend;
+
+ /*
+ * The quotient is 64 bits, the remainder is always 32 bits,
+ * and is generated by the second divide.
+ */
+ ACPI_DIV_64_BY_32 (0, DividendOvl.Part.Hi, Divisor,
+ Quotient.Part.Hi, Remainder32);
+ ACPI_DIV_64_BY_32 (Remainder32, DividendOvl.Part.Lo, Divisor,
+ Quotient.Part.Lo, Remainder32);
+
+ /* Return only what was requested */
+
+ if (OutQuotient)
+ {
+ *OutQuotient = Quotient.Full;
+ }
+ if (OutRemainder)
+ {
+ *OutRemainder = Remainder32;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDivide
+ *
+ * PARAMETERS: InDividend - Dividend
+ * InDivisor - Divisor
+ * OutQuotient - Pointer to where the quotient is returned
+ * OutRemainder - Pointer to where the remainder is returned
+ *
+ * RETURN: Status (Checks for divide-by-zero)
+ *
+ * DESCRIPTION: Perform a divide and modulo.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtDivide (
+ ACPI_INTEGER InDividend,
+ ACPI_INTEGER InDivisor,
+ ACPI_INTEGER *OutQuotient,
+ ACPI_INTEGER *OutRemainder)
+{
+ UINT64_OVERLAY Dividend;
+ UINT64_OVERLAY Divisor;
+ UINT64_OVERLAY Quotient;
+ UINT64_OVERLAY Remainder;
+ UINT64_OVERLAY NormalizedDividend;
+ UINT64_OVERLAY NormalizedDivisor;
+ UINT32 Partial1;
+ UINT64_OVERLAY Partial2;
+ UINT64_OVERLAY Partial3;
+
+
+ ACPI_FUNCTION_TRACE (UtDivide);
+
+
+ /* Always check for a zero divisor */
+
+ if (InDivisor == 0)
+ {
+ ACPI_ERROR ((AE_INFO, "Divide by zero"));
+ return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
+ }
+
+ Divisor.Full = InDivisor;
+ Dividend.Full = InDividend;
+ if (Divisor.Part.Hi == 0)
+ {
+ /*
+ * 1) Simplest case is where the divisor is 32 bits, we can
+ * just do two divides
+ */
+ Remainder.Part.Hi = 0;
+
+ /*
+ * The quotient is 64 bits, the remainder is always 32 bits,
+ * and is generated by the second divide.
+ */
+ ACPI_DIV_64_BY_32 (0, Dividend.Part.Hi, Divisor.Part.Lo,
+ Quotient.Part.Hi, Partial1);
+ ACPI_DIV_64_BY_32 (Partial1, Dividend.Part.Lo, Divisor.Part.Lo,
+ Quotient.Part.Lo, Remainder.Part.Lo);
+ }
+
+ else
+ {
+ /*
+ * 2) The general case where the divisor is a full 64 bits
+ * is more difficult
+ */
+ Quotient.Part.Hi = 0;
+ NormalizedDividend = Dividend;
+ NormalizedDivisor = Divisor;
+
+ /* Normalize the operands (shift until the divisor is < 32 bits) */
+
+ do
+ {
+ ACPI_SHIFT_RIGHT_64 (NormalizedDivisor.Part.Hi,
+ NormalizedDivisor.Part.Lo);
+ ACPI_SHIFT_RIGHT_64 (NormalizedDividend.Part.Hi,
+ NormalizedDividend.Part.Lo);
+
+ } while (NormalizedDivisor.Part.Hi != 0);
+
+ /* Partial divide */
+
+ ACPI_DIV_64_BY_32 (NormalizedDividend.Part.Hi,
+ NormalizedDividend.Part.Lo,
+ NormalizedDivisor.Part.Lo,
+ Quotient.Part.Lo, Partial1);
+
+ /*
+ * The quotient is always 32 bits, and simply requires adjustment.
+ * The 64-bit remainder must be generated.
+ */
+ Partial1 = Quotient.Part.Lo * Divisor.Part.Hi;
+ Partial2.Full = (ACPI_INTEGER) Quotient.Part.Lo * Divisor.Part.Lo;
+ Partial3.Full = (ACPI_INTEGER) Partial2.Part.Hi + Partial1;
+
+ Remainder.Part.Hi = Partial3.Part.Lo;
+ Remainder.Part.Lo = Partial2.Part.Lo;
+
+ if (Partial3.Part.Hi == 0)
+ {
+ if (Partial3.Part.Lo >= Dividend.Part.Hi)
+ {
+ if (Partial3.Part.Lo == Dividend.Part.Hi)
+ {
+ if (Partial2.Part.Lo > Dividend.Part.Lo)
+ {
+ Quotient.Part.Lo--;
+ Remainder.Full -= Divisor.Full;
+ }
+ }
+ else
+ {
+ Quotient.Part.Lo--;
+ Remainder.Full -= Divisor.Full;
+ }
+ }
+
+ Remainder.Full = Remainder.Full - Dividend.Full;
+ Remainder.Part.Hi = (UINT32) -((INT32) Remainder.Part.Hi);
+ Remainder.Part.Lo = (UINT32) -((INT32) Remainder.Part.Lo);
+
+ if (Remainder.Part.Lo)
+ {
+ Remainder.Part.Hi--;
+ }
+ }
+ }
+
+ /* Return only what was requested */
+
+ if (OutQuotient)
+ {
+ *OutQuotient = Quotient.Full;
+ }
+ if (OutRemainder)
+ {
+ *OutRemainder = Remainder.Full;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+#else
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtShortDivide, AcpiUtDivide
+ *
+ * PARAMETERS: See function headers above
+ *
+ * DESCRIPTION: Native versions of the UtDivide functions. Use these if either
+ * 1) The target is a 64-bit platform and therefore 64-bit
+ * integer math is supported directly by the machine.
+ * 2) The target is a 32-bit or 16-bit platform, and the
+ * double-precision integer math library is available to
+ * perform the divide.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtShortDivide (
+ ACPI_INTEGER InDividend,
+ UINT32 Divisor,
+ ACPI_INTEGER *OutQuotient,
+ UINT32 *OutRemainder)
+{
+
+ ACPI_FUNCTION_TRACE (UtShortDivide);
+
+
+ /* Always check for a zero divisor */
+
+ if (Divisor == 0)
+ {
+ ACPI_ERROR ((AE_INFO, "Divide by zero"));
+ return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
+ }
+
+ /* Return only what was requested */
+
+ if (OutQuotient)
+ {
+ *OutQuotient = InDividend / Divisor;
+ }
+ if (OutRemainder)
+ {
+ *OutRemainder = (UINT32) InDividend % Divisor;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_STATUS
+AcpiUtDivide (
+ ACPI_INTEGER InDividend,
+ ACPI_INTEGER InDivisor,
+ ACPI_INTEGER *OutQuotient,
+ ACPI_INTEGER *OutRemainder)
+{
+ ACPI_FUNCTION_TRACE (UtDivide);
+
+
+ /* Always check for a zero divisor */
+
+ if (InDivisor == 0)
+ {
+ ACPI_ERROR ((AE_INFO, "Divide by zero"));
+ return_ACPI_STATUS (AE_AML_DIVIDE_BY_ZERO);
+ }
+
+
+ /* Return only what was requested */
+
+ if (OutQuotient)
+ {
+ *OutQuotient = InDividend / InDivisor;
+ }
+ if (OutRemainder)
+ {
+ *OutRemainder = InDividend % InDivisor;
+ }
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+#endif
+
+
diff --git a/sys/contrib/dev/acpica/utmisc.c b/sys/contrib/dev/acpica/utmisc.c
new file mode 100644
index 0000000..f1585da5
--- /dev/null
+++ b/sys/contrib/dev/acpica/utmisc.c
@@ -0,0 +1,1314 @@
+/*******************************************************************************
+ *
+ * Module Name: utmisc - common utility procedures
+ * $Revision: 1.151 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __UTMISC_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utmisc")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtValidateException
+ *
+ * PARAMETERS: Status - The ACPI_STATUS code to be formatted
+ *
+ * RETURN: A string containing the exception text. NULL if exception is
+ * not valid.
+ *
+ * DESCRIPTION: This function validates and translates an ACPI exception into
+ * an ASCII string.
+ *
+ ******************************************************************************/
+
+const char *
+AcpiUtValidateException (
+ ACPI_STATUS Status)
+{
+ ACPI_STATUS SubStatus;
+ const char *Exception = NULL;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * Status is composed of two parts, a "type" and an actual code
+ */
+ SubStatus = (Status & ~AE_CODE_MASK);
+
+ switch (Status & AE_CODE_MASK)
+ {
+ case AE_CODE_ENVIRONMENTAL:
+
+ if (SubStatus <= AE_CODE_ENV_MAX)
+ {
+ Exception = AcpiGbl_ExceptionNames_Env [SubStatus];
+ }
+ break;
+
+ case AE_CODE_PROGRAMMER:
+
+ if (SubStatus <= AE_CODE_PGM_MAX)
+ {
+ Exception = AcpiGbl_ExceptionNames_Pgm [SubStatus -1];
+ }
+ break;
+
+ case AE_CODE_ACPI_TABLES:
+
+ if (SubStatus <= AE_CODE_TBL_MAX)
+ {
+ Exception = AcpiGbl_ExceptionNames_Tbl [SubStatus -1];
+ }
+ break;
+
+ case AE_CODE_AML:
+
+ if (SubStatus <= AE_CODE_AML_MAX)
+ {
+ Exception = AcpiGbl_ExceptionNames_Aml [SubStatus -1];
+ }
+ break;
+
+ case AE_CODE_CONTROL:
+
+ if (SubStatus <= AE_CODE_CTRL_MAX)
+ {
+ Exception = AcpiGbl_ExceptionNames_Ctrl [SubStatus -1];
+ }
+ break;
+
+ default:
+ break;
+ }
+
+ return (ACPI_CAST_PTR (const char, Exception));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtIsAmlTable
+ *
+ * PARAMETERS: Table - An ACPI table
+ *
+ * RETURN: TRUE if table contains executable AML; FALSE otherwise
+ *
+ * DESCRIPTION: Check ACPI Signature for a table that contains AML code.
+ * Currently, these are DSDT,SSDT,PSDT. All other table types are
+ * data tables that do not contain AML code.
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiUtIsAmlTable (
+ ACPI_TABLE_HEADER *Table)
+{
+
+ /* These are the only tables that contain executable AML */
+
+ if (ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_DSDT) ||
+ ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_PSDT) ||
+ ACPI_COMPARE_NAME (Table->Signature, ACPI_SIG_SSDT))
+ {
+ return (TRUE);
+ }
+
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtAllocateOwnerId
+ *
+ * PARAMETERS: OwnerId - Where the new owner ID is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Allocate a table or method owner ID. The owner ID is used to
+ * track objects created by the table or method, to be deleted
+ * when the method exits or the table is unloaded.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtAllocateOwnerId (
+ ACPI_OWNER_ID *OwnerId)
+{
+ ACPI_NATIVE_UINT i;
+ ACPI_NATIVE_UINT j;
+ ACPI_NATIVE_UINT k;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (UtAllocateOwnerId);
+
+
+ /* Guard against multiple allocations of ID to the same location */
+
+ if (*OwnerId)
+ {
+ ACPI_ERROR ((AE_INFO, "Owner ID [%2.2X] already exists", *OwnerId));
+ return_ACPI_STATUS (AE_ALREADY_EXISTS);
+ }
+
+ /* Mutex for the global ID mask */
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Find a free owner ID, cycle through all possible IDs on repeated
+ * allocations. (ACPI_NUM_OWNERID_MASKS + 1) because first index may have
+ * to be scanned twice.
+ */
+ for (i = 0, j = AcpiGbl_LastOwnerIdIndex;
+ i < (ACPI_NUM_OWNERID_MASKS + 1);
+ i++, j++)
+ {
+ if (j >= ACPI_NUM_OWNERID_MASKS)
+ {
+ j = 0; /* Wraparound to start of mask array */
+ }
+
+ for (k = AcpiGbl_NextOwnerIdOffset; k < 32; k++)
+ {
+ if (AcpiGbl_OwnerIdMask[j] == ACPI_UINT32_MAX)
+ {
+ /* There are no free IDs in this mask */
+
+ break;
+ }
+
+ if (!(AcpiGbl_OwnerIdMask[j] & (1 << k)))
+ {
+ /*
+ * Found a free ID. The actual ID is the bit index plus one,
+ * making zero an invalid Owner ID. Save this as the last ID
+ * allocated and update the global ID mask.
+ */
+ AcpiGbl_OwnerIdMask[j] |= (1 << k);
+
+ AcpiGbl_LastOwnerIdIndex = (UINT8) j;
+ AcpiGbl_NextOwnerIdOffset = (UINT8) (k + 1);
+
+ /*
+ * Construct encoded ID from the index and bit position
+ *
+ * Note: Last [j].k (bit 255) is never used and is marked
+ * permanently allocated (prevents +1 overflow)
+ */
+ *OwnerId = (ACPI_OWNER_ID) ((k + 1) + ACPI_MUL_32 (j));
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_VALUES,
+ "Allocated OwnerId: %2.2X\n", (unsigned int) *OwnerId));
+ goto Exit;
+ }
+ }
+
+ AcpiGbl_NextOwnerIdOffset = 0;
+ }
+
+ /*
+ * All OwnerIds have been allocated. This typically should
+ * not happen since the IDs are reused after deallocation. The IDs are
+ * allocated upon table load (one per table) and method execution, and
+ * they are released when a table is unloaded or a method completes
+ * execution.
+ *
+ * If this error happens, there may be very deep nesting of invoked control
+ * methods, or there may be a bug where the IDs are not released.
+ */
+ Status = AE_OWNER_ID_LIMIT;
+ ACPI_ERROR ((AE_INFO,
+ "Could not allocate new OwnerId (255 max), AE_OWNER_ID_LIMIT"));
+
+Exit:
+ (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtReleaseOwnerId
+ *
+ * PARAMETERS: OwnerIdPtr - Pointer to a previously allocated OwnerID
+ *
+ * RETURN: None. No error is returned because we are either exiting a
+ * control method or unloading a table. Either way, we would
+ * ignore any error anyway.
+ *
+ * DESCRIPTION: Release a table or method owner ID. Valid IDs are 1 - 255
+ *
+ ******************************************************************************/
+
+void
+AcpiUtReleaseOwnerId (
+ ACPI_OWNER_ID *OwnerIdPtr)
+{
+ ACPI_OWNER_ID OwnerId = *OwnerIdPtr;
+ ACPI_STATUS Status;
+ ACPI_NATIVE_UINT Index;
+ UINT32 Bit;
+
+
+ ACPI_FUNCTION_TRACE_U32 (UtReleaseOwnerId, OwnerId);
+
+
+ /* Always clear the input OwnerId (zero is an invalid ID) */
+
+ *OwnerIdPtr = 0;
+
+ /* Zero is not a valid OwnerID */
+
+ if (OwnerId == 0)
+ {
+ ACPI_ERROR ((AE_INFO, "Invalid OwnerId: %2.2X", OwnerId));
+ return_VOID;
+ }
+
+ /* Mutex for the global ID mask */
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_CACHES);
+ if (ACPI_FAILURE (Status))
+ {
+ return_VOID;
+ }
+
+ /* Normalize the ID to zero */
+
+ OwnerId--;
+
+ /* Decode ID to index/offset pair */
+
+ Index = ACPI_DIV_32 (OwnerId);
+ Bit = 1 << ACPI_MOD_32 (OwnerId);
+
+ /* Free the owner ID only if it is valid */
+
+ if (AcpiGbl_OwnerIdMask[Index] & Bit)
+ {
+ AcpiGbl_OwnerIdMask[Index] ^= Bit;
+ }
+ else
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Release of non-allocated OwnerId: %2.2X", OwnerId + 1));
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_CACHES);
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrupr (strupr)
+ *
+ * PARAMETERS: SrcString - The source string to convert
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Convert string to uppercase
+ *
+ * NOTE: This is not a POSIX function, so it appears here, not in utclib.c
+ *
+ ******************************************************************************/
+
+void
+AcpiUtStrupr (
+ char *SrcString)
+{
+ char *String;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if (!SrcString)
+ {
+ return;
+ }
+
+ /* Walk entire string, uppercasing the letters */
+
+ for (String = SrcString; *String; String++)
+ {
+ *String = (char) ACPI_TOUPPER (*String);
+ }
+
+ return;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtPrintString
+ *
+ * PARAMETERS: String - Null terminated ASCII string
+ * MaxLength - Maximum output length
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Dump an ASCII string with support for ACPI-defined escape
+ * sequences.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtPrintString (
+ char *String,
+ UINT8 MaxLength)
+{
+ UINT32 i;
+
+
+ if (!String)
+ {
+ AcpiOsPrintf ("<\"NULL STRING PTR\">");
+ return;
+ }
+
+ AcpiOsPrintf ("\"");
+ for (i = 0; String[i] && (i < MaxLength); i++)
+ {
+ /* Escape sequences */
+
+ switch (String[i])
+ {
+ case 0x07:
+ AcpiOsPrintf ("\\a"); /* BELL */
+ break;
+
+ case 0x08:
+ AcpiOsPrintf ("\\b"); /* BACKSPACE */
+ break;
+
+ case 0x0C:
+ AcpiOsPrintf ("\\f"); /* FORMFEED */
+ break;
+
+ case 0x0A:
+ AcpiOsPrintf ("\\n"); /* LINEFEED */
+ break;
+
+ case 0x0D:
+ AcpiOsPrintf ("\\r"); /* CARRIAGE RETURN*/
+ break;
+
+ case 0x09:
+ AcpiOsPrintf ("\\t"); /* HORIZONTAL TAB */
+ break;
+
+ case 0x0B:
+ AcpiOsPrintf ("\\v"); /* VERTICAL TAB */
+ break;
+
+ case '\'': /* Single Quote */
+ case '\"': /* Double Quote */
+ case '\\': /* Backslash */
+ AcpiOsPrintf ("\\%c", (int) String[i]);
+ break;
+
+ default:
+
+ /* Check for printable character or hex escape */
+
+ if (ACPI_IS_PRINT (String[i]))
+ {
+ /* This is a normal character */
+
+ AcpiOsPrintf ("%c", (int) String[i]);
+ }
+ else
+ {
+ /* All others will be Hex escapes */
+
+ AcpiOsPrintf ("\\x%2.2X", (INT32) String[i]);
+ }
+ break;
+ }
+ }
+ AcpiOsPrintf ("\"");
+
+ if (i == MaxLength && String[i])
+ {
+ AcpiOsPrintf ("...");
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDwordByteSwap
+ *
+ * PARAMETERS: Value - Value to be converted
+ *
+ * RETURN: UINT32 integer with bytes swapped
+ *
+ * DESCRIPTION: Convert a 32-bit value to big-endian (swap the bytes)
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiUtDwordByteSwap (
+ UINT32 Value)
+{
+ union
+ {
+ UINT32 Value;
+ UINT8 Bytes[4];
+ } Out;
+ union
+ {
+ UINT32 Value;
+ UINT8 Bytes[4];
+ } In;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ In.Value = Value;
+
+ Out.Bytes[0] = In.Bytes[3];
+ Out.Bytes[1] = In.Bytes[2];
+ Out.Bytes[2] = In.Bytes[1];
+ Out.Bytes[3] = In.Bytes[0];
+
+ return (Out.Value);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtSetIntegerWidth
+ *
+ * PARAMETERS: Revision From DSDT header
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Set the global integer bit width based upon the revision
+ * of the DSDT. For Revision 1 and 0, Integers are 32 bits.
+ * For Revision 2 and above, Integers are 64 bits. Yes, this
+ * makes a difference.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtSetIntegerWidth (
+ UINT8 Revision)
+{
+
+ if (Revision < 2)
+ {
+ /* 32-bit case */
+
+ AcpiGbl_IntegerBitWidth = 32;
+ AcpiGbl_IntegerNybbleWidth = 8;
+ AcpiGbl_IntegerByteWidth = 4;
+ }
+ else
+ {
+ /* 64-bit case (ACPI 2.0+) */
+
+ AcpiGbl_IntegerBitWidth = 64;
+ AcpiGbl_IntegerNybbleWidth = 16;
+ AcpiGbl_IntegerByteWidth = 8;
+ }
+}
+
+
+#ifdef ACPI_DEBUG_OUTPUT
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDisplayInitPathname
+ *
+ * PARAMETERS: Type - Object type of the node
+ * ObjHandle - Handle whose pathname will be displayed
+ * Path - Additional path string to be appended.
+ * (NULL if no extra path)
+ *
+ * RETURN: ACPI_STATUS
+ *
+ * DESCRIPTION: Display full pathname of an object, DEBUG ONLY
+ *
+ ******************************************************************************/
+
+void
+AcpiUtDisplayInitPathname (
+ UINT8 Type,
+ ACPI_NAMESPACE_NODE *ObjHandle,
+ char *Path)
+{
+ ACPI_STATUS Status;
+ ACPI_BUFFER Buffer;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Only print the path if the appropriate debug level is enabled */
+
+ if (!(AcpiDbgLevel & ACPI_LV_INIT_NAMES))
+ {
+ return;
+ }
+
+ /* Get the full pathname to the node */
+
+ Buffer.Length = ACPI_ALLOCATE_LOCAL_BUFFER;
+ Status = AcpiNsHandleToPathname (ObjHandle, &Buffer);
+ if (ACPI_FAILURE (Status))
+ {
+ return;
+ }
+
+ /* Print what we're doing */
+
+ switch (Type)
+ {
+ case ACPI_TYPE_METHOD:
+ AcpiOsPrintf ("Executing ");
+ break;
+
+ default:
+ AcpiOsPrintf ("Initializing ");
+ break;
+ }
+
+ /* Print the object type and pathname */
+
+ AcpiOsPrintf ("%-12s %s",
+ AcpiUtGetTypeName (Type), (char *) Buffer.Pointer);
+
+ /* Extra path is used to append names like _STA, _INI, etc. */
+
+ if (Path)
+ {
+ AcpiOsPrintf (".%s", Path);
+ }
+ AcpiOsPrintf ("\n");
+
+ ACPI_FREE (Buffer.Pointer);
+}
+#endif
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtValidAcpiChar
+ *
+ * PARAMETERS: Char - The character to be examined
+ * Position - Byte position (0-3)
+ *
+ * RETURN: TRUE if the character is valid, FALSE otherwise
+ *
+ * DESCRIPTION: Check for a valid ACPI character. Must be one of:
+ * 1) Upper case alpha
+ * 2) numeric
+ * 3) underscore
+ *
+ * We allow a '!' as the last character because of the ASF! table
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiUtValidAcpiChar (
+ char Character,
+ ACPI_NATIVE_UINT Position)
+{
+
+ if (!((Character >= 'A' && Character <= 'Z') ||
+ (Character >= '0' && Character <= '9') ||
+ (Character == '_')))
+ {
+ /* Allow a '!' in the last position */
+
+ if (Character == '!' && Position == 3)
+ {
+ return (TRUE);
+ }
+
+ return (FALSE);
+ }
+
+ return (TRUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtValidAcpiName
+ *
+ * PARAMETERS: Name - The name to be examined
+ *
+ * RETURN: TRUE if the name is valid, FALSE otherwise
+ *
+ * DESCRIPTION: Check for a valid ACPI name. Each character must be one of:
+ * 1) Upper case alpha
+ * 2) numeric
+ * 3) underscore
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiUtValidAcpiName (
+ UINT32 Name)
+{
+ ACPI_NATIVE_UINT i;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ for (i = 0; i < ACPI_NAME_SIZE; i++)
+ {
+ if (!AcpiUtValidAcpiChar ((ACPI_CAST_PTR (char, &Name))[i], i))
+ {
+ return (FALSE);
+ }
+ }
+
+ return (TRUE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtRepairName
+ *
+ * PARAMETERS: Name - The ACPI name to be repaired
+ *
+ * RETURN: Repaired version of the name
+ *
+ * DESCRIPTION: Repair an ACPI name: Change invalid characters to '*' and
+ * return the new name.
+ *
+ ******************************************************************************/
+
+ACPI_NAME
+AcpiUtRepairName (
+ char *Name)
+{
+ ACPI_NATIVE_UINT i;
+ char NewName[ACPI_NAME_SIZE];
+
+
+ for (i = 0; i < ACPI_NAME_SIZE; i++)
+ {
+ NewName[i] = Name[i];
+
+ /*
+ * Replace a bad character with something printable, yet technically
+ * still invalid. This prevents any collisions with existing "good"
+ * names in the namespace.
+ */
+ if (!AcpiUtValidAcpiChar (Name[i], i))
+ {
+ NewName[i] = '*';
+ }
+ }
+
+ return (*(UINT32 *) NewName);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtStrtoul64
+ *
+ * PARAMETERS: String - Null terminated string
+ * Base - Radix of the string: 16 or ACPI_ANY_BASE;
+ * ACPI_ANY_BASE means 'in behalf of ToInteger'
+ * RetInteger - Where the converted integer is returned
+ *
+ * RETURN: Status and Converted value
+ *
+ * DESCRIPTION: Convert a string into an unsigned value. Performs either a
+ * 32-bit or 64-bit conversion, depending on the current mode
+ * of the interpreter.
+ * NOTE: Does not support Octal strings, not needed.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtStrtoul64 (
+ char *String,
+ UINT32 Base,
+ ACPI_INTEGER *RetInteger)
+{
+ UINT32 ThisDigit = 0;
+ ACPI_INTEGER ReturnValue = 0;
+ ACPI_INTEGER Quotient;
+ ACPI_INTEGER Dividend;
+ UINT32 ToIntegerOp = (Base == ACPI_ANY_BASE);
+ UINT32 Mode32 = (AcpiGbl_IntegerByteWidth == 4);
+ UINT8 ValidDigits = 0;
+ UINT8 SignOf0x = 0;
+ UINT8 Term = 0;
+
+
+ ACPI_FUNCTION_TRACE_STR (UtStroul64, String);
+
+
+ switch (Base)
+ {
+ case ACPI_ANY_BASE:
+ case 16:
+ break;
+
+ default:
+ /* Invalid Base */
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if (!String)
+ {
+ goto ErrorExit;
+ }
+
+ /* Skip over any white space in the buffer */
+
+ while ((*String) && (ACPI_IS_SPACE (*String) || *String == '\t'))
+ {
+ String++;
+ }
+
+ if (ToIntegerOp)
+ {
+ /*
+ * Base equal to ACPI_ANY_BASE means 'ToInteger operation case'.
+ * We need to determine if it is decimal or hexadecimal.
+ */
+ if ((*String == '0') && (ACPI_TOLOWER (*(String + 1)) == 'x'))
+ {
+ SignOf0x = 1;
+ Base = 16;
+
+ /* Skip over the leading '0x' */
+ String += 2;
+ }
+ else
+ {
+ Base = 10;
+ }
+ }
+
+ /* Any string left? Check that '0x' is not followed by white space. */
+
+ if (!(*String) || ACPI_IS_SPACE (*String) || *String == '\t')
+ {
+ if (ToIntegerOp)
+ {
+ goto ErrorExit;
+ }
+ else
+ {
+ goto AllDone;
+ }
+ }
+
+ /*
+ * Perform a 32-bit or 64-bit conversion, depending upon the current
+ * execution mode of the interpreter
+ */
+ Dividend = (Mode32) ? ACPI_UINT32_MAX : ACPI_UINT64_MAX;
+
+ /* Main loop: convert the string to a 32- or 64-bit integer */
+
+ while (*String)
+ {
+ if (ACPI_IS_DIGIT (*String))
+ {
+ /* Convert ASCII 0-9 to Decimal value */
+
+ ThisDigit = ((UINT8) *String) - '0';
+ }
+ else if (Base == 10)
+ {
+ /* Digit is out of range; possible in ToInteger case only */
+
+ Term = 1;
+ }
+ else
+ {
+ ThisDigit = (UINT8) ACPI_TOUPPER (*String);
+ if (ACPI_IS_XDIGIT ((char) ThisDigit))
+ {
+ /* Convert ASCII Hex char to value */
+
+ ThisDigit = ThisDigit - 'A' + 10;
+ }
+ else
+ {
+ Term = 1;
+ }
+ }
+
+ if (Term)
+ {
+ if (ToIntegerOp)
+ {
+ goto ErrorExit;
+ }
+ else
+ {
+ break;
+ }
+ }
+ else if ((ValidDigits == 0) && (ThisDigit == 0) && !SignOf0x)
+ {
+ /* Skip zeros */
+ String++;
+ continue;
+ }
+
+ ValidDigits++;
+
+ if (SignOf0x && ((ValidDigits > 16) || ((ValidDigits > 8) && Mode32)))
+ {
+ /*
+ * This is ToInteger operation case.
+ * No any restrictions for string-to-integer conversion,
+ * see ACPI spec.
+ */
+ goto ErrorExit;
+ }
+
+ /* Divide the digit into the correct position */
+
+ (void) AcpiUtShortDivide ((Dividend - (ACPI_INTEGER) ThisDigit),
+ Base, &Quotient, NULL);
+
+ if (ReturnValue > Quotient)
+ {
+ if (ToIntegerOp)
+ {
+ goto ErrorExit;
+ }
+ else
+ {
+ break;
+ }
+ }
+
+ ReturnValue *= Base;
+ ReturnValue += ThisDigit;
+ String++;
+ }
+
+ /* All done, normal exit */
+
+AllDone:
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "Converted value: %8.8X%8.8X\n",
+ ACPI_FORMAT_UINT64 (ReturnValue)));
+
+ *RetInteger = ReturnValue;
+ return_ACPI_STATUS (AE_OK);
+
+
+ErrorExit:
+ /* Base was set/validated above */
+
+ if (Base == 10)
+ {
+ return_ACPI_STATUS (AE_BAD_DECIMAL_CONSTANT);
+ }
+ else
+ {
+ return_ACPI_STATUS (AE_BAD_HEX_CONSTANT);
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateUpdateStateAndPush
+ *
+ * PARAMETERS: Object - Object to be added to the new state
+ * Action - Increment/Decrement
+ * StateList - List the state will be added to
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new state and push it
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtCreateUpdateStateAndPush (
+ ACPI_OPERAND_OBJECT *Object,
+ UINT16 Action,
+ ACPI_GENERIC_STATE **StateList)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Ignore null objects; these are expected */
+
+ if (!Object)
+ {
+ return (AE_OK);
+ }
+
+ State = AcpiUtCreateUpdateState (Object, Action);
+ if (!State)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ AcpiUtPushGenericState (StateList, State);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtWalkPackageTree
+ *
+ * PARAMETERS: SourceObject - The package to walk
+ * TargetObject - Target object (if package is being copied)
+ * WalkCallback - Called once for each package element
+ * Context - Passed to the callback function
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Walk through a package
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtWalkPackageTree (
+ ACPI_OPERAND_OBJECT *SourceObject,
+ void *TargetObject,
+ ACPI_PKG_CALLBACK WalkCallback,
+ void *Context)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_GENERIC_STATE *StateList = NULL;
+ ACPI_GENERIC_STATE *State;
+ UINT32 ThisIndex;
+ ACPI_OPERAND_OBJECT *ThisSourceObj;
+
+
+ ACPI_FUNCTION_TRACE (UtWalkPackageTree);
+
+
+ State = AcpiUtCreatePkgState (SourceObject, TargetObject, 0);
+ if (!State)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+
+ while (State)
+ {
+ /* Get one element of the package */
+
+ ThisIndex = State->Pkg.Index;
+ ThisSourceObj = (ACPI_OPERAND_OBJECT *)
+ State->Pkg.SourceObject->Package.Elements[ThisIndex];
+
+ /*
+ * Check for:
+ * 1) An uninitialized package element. It is completely
+ * legal to declare a package and leave it uninitialized
+ * 2) Not an internal object - can be a namespace node instead
+ * 3) Any type other than a package. Packages are handled in else
+ * case below.
+ */
+ if ((!ThisSourceObj) ||
+ (ACPI_GET_DESCRIPTOR_TYPE (ThisSourceObj) != ACPI_DESC_TYPE_OPERAND) ||
+ (ACPI_GET_OBJECT_TYPE (ThisSourceObj) != ACPI_TYPE_PACKAGE))
+ {
+ Status = WalkCallback (ACPI_COPY_TYPE_SIMPLE, ThisSourceObj,
+ State, Context);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ State->Pkg.Index++;
+ while (State->Pkg.Index >= State->Pkg.SourceObject->Package.Count)
+ {
+ /*
+ * We've handled all of the objects at this level, This means
+ * that we have just completed a package. That package may
+ * have contained one or more packages itself.
+ *
+ * Delete this state and pop the previous state (package).
+ */
+ AcpiUtDeleteGenericState (State);
+ State = AcpiUtPopGenericState (&StateList);
+
+ /* Finished when there are no more states */
+
+ if (!State)
+ {
+ /*
+ * We have handled all of the objects in the top level
+ * package just add the length of the package objects
+ * and exit
+ */
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /*
+ * Go back up a level and move the index past the just
+ * completed package object.
+ */
+ State->Pkg.Index++;
+ }
+ }
+ else
+ {
+ /* This is a subobject of type package */
+
+ Status = WalkCallback (ACPI_COPY_TYPE_PACKAGE, ThisSourceObj,
+ State, Context);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Push the current state and create a new one
+ * The callback above returned a new target package object.
+ */
+ AcpiUtPushGenericState (&StateList, State);
+ State = AcpiUtCreatePkgState (ThisSourceObj,
+ State->Pkg.ThisTargetObj, 0);
+ if (!State)
+ {
+ return_ACPI_STATUS (AE_NO_MEMORY);
+ }
+ }
+ }
+
+ /* We should never get here */
+
+ return_ACPI_STATUS (AE_AML_INTERNAL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtError, AcpiUtWarning, AcpiUtInfo
+ *
+ * PARAMETERS: ModuleName - Caller's module name (for error output)
+ * LineNumber - Caller's line number (for error output)
+ * Format - Printf format string + additional args
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print message with module/line/version info
+ *
+ ******************************************************************************/
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtError (
+ char *ModuleName,
+ UINT32 LineNumber,
+ char *Format,
+ ...)
+{
+ va_list args;
+
+
+ AcpiOsPrintf ("ACPI Error (%s-%04d): ", ModuleName, LineNumber);
+
+ va_start (args, Format);
+ AcpiOsVprintf (Format, args);
+ AcpiOsPrintf (" [%X]\n", ACPI_CA_VERSION);
+}
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtException (
+ char *ModuleName,
+ UINT32 LineNumber,
+ ACPI_STATUS Status,
+ char *Format,
+ ...)
+{
+ va_list args;
+
+
+ AcpiOsPrintf ("ACPI Exception (%s-%04d): %s, ", ModuleName, LineNumber,
+ AcpiFormatException (Status));
+
+ va_start (args, Format);
+ AcpiOsVprintf (Format, args);
+ AcpiOsPrintf (" [%X]\n", ACPI_CA_VERSION);
+}
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtWarning (
+ char *ModuleName,
+ UINT32 LineNumber,
+ char *Format,
+ ...)
+{
+ va_list args;
+
+
+ AcpiOsPrintf ("ACPI Warning (%s-%04d): ", ModuleName, LineNumber);
+
+ va_start (args, Format);
+ AcpiOsVprintf (Format, args);
+ AcpiOsPrintf (" [%X]\n", ACPI_CA_VERSION);
+}
+
+void ACPI_INTERNAL_VAR_XFACE
+AcpiUtInfo (
+ char *ModuleName,
+ UINT32 LineNumber,
+ char *Format,
+ ...)
+{
+ va_list args;
+
+#ifdef _KERNEL
+ /* Temporarily hide too verbose printfs. */
+ if (!bootverbose)
+ return;
+#endif
+
+ /*
+ * Removed ModuleName, LineNumber, and acpica version, not needed
+ * for info output
+ */
+ AcpiOsPrintf ("ACPI: ");
+
+ va_start (args, Format);
+ AcpiOsVprintf (Format, args);
+ AcpiOsPrintf ("\n");
+}
+
diff --git a/sys/contrib/dev/acpica/utmutex.c b/sys/contrib/dev/acpica/utmutex.c
new file mode 100644
index 0000000..701d269
--- /dev/null
+++ b/sys/contrib/dev/acpica/utmutex.c
@@ -0,0 +1,464 @@
+/*******************************************************************************
+ *
+ * Module Name: utmutex - local mutex support
+ * $Revision: 1.12 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __UTMUTEX_C__
+
+#include <contrib/dev/acpica/acpi.h>
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utmutex")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiUtCreateMutex (
+ ACPI_MUTEX_HANDLE MutexId);
+
+static ACPI_STATUS
+AcpiUtDeleteMutex (
+ ACPI_MUTEX_HANDLE MutexId);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtMutexInitialize
+ *
+ * PARAMETERS: None.
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create the system mutex objects.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtMutexInitialize (
+ void)
+{
+ UINT32 i;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (UtMutexInitialize);
+
+
+ /*
+ * Create each of the predefined mutex objects
+ */
+ for (i = 0; i < ACPI_NUM_MUTEX; i++)
+ {
+ Status = AcpiUtCreateMutex (i);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /* Create the spinlocks for use at interrupt level */
+
+ Status = AcpiOsCreateLock (&AcpiGbl_GpeLock);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ Status = AcpiOsCreateLock (&AcpiGbl_HardwareLock);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtMutexTerminate
+ *
+ * PARAMETERS: None.
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Delete all of the system mutex objects.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtMutexTerminate (
+ void)
+{
+ UINT32 i;
+
+
+ ACPI_FUNCTION_TRACE (UtMutexTerminate);
+
+
+ /*
+ * Delete each predefined mutex object
+ */
+ for (i = 0; i < ACPI_NUM_MUTEX; i++)
+ {
+ (void) AcpiUtDeleteMutex (i);
+ }
+
+ /* Delete the spinlocks */
+
+ AcpiOsDeleteLock (AcpiGbl_GpeLock);
+ AcpiOsDeleteLock (AcpiGbl_HardwareLock);
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateMutex
+ *
+ * PARAMETERS: MutexID - ID of the mutex to be created
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a mutex object.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtCreateMutex (
+ ACPI_MUTEX_HANDLE MutexId)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE_U32 (UtCreateMutex, MutexId);
+
+
+ if (MutexId > ACPI_MAX_MUTEX)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ if (!AcpiGbl_MutexInfo[MutexId].Mutex)
+ {
+ Status = AcpiOsCreateMutex (&AcpiGbl_MutexInfo[MutexId].Mutex);
+ AcpiGbl_MutexInfo[MutexId].ThreadId = ACPI_MUTEX_NOT_ACQUIRED;
+ AcpiGbl_MutexInfo[MutexId].UseCount = 0;
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDeleteMutex
+ *
+ * PARAMETERS: MutexID - ID of the mutex to be deleted
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Delete a mutex object.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtDeleteMutex (
+ ACPI_MUTEX_HANDLE MutexId)
+{
+
+ ACPI_FUNCTION_TRACE_U32 (UtDeleteMutex, MutexId);
+
+
+ if (MutexId > ACPI_MAX_MUTEX)
+ {
+ return_ACPI_STATUS (AE_BAD_PARAMETER);
+ }
+
+ AcpiOsDeleteMutex (AcpiGbl_MutexInfo[MutexId].Mutex);
+
+ AcpiGbl_MutexInfo[MutexId].Mutex = NULL;
+ AcpiGbl_MutexInfo[MutexId].ThreadId = ACPI_MUTEX_NOT_ACQUIRED;
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtAcquireMutex
+ *
+ * PARAMETERS: MutexID - ID of the mutex to be acquired
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Acquire a mutex object.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtAcquireMutex (
+ ACPI_MUTEX_HANDLE MutexId)
+{
+ ACPI_STATUS Status;
+ ACPI_THREAD_ID ThisThreadId;
+
+
+ ACPI_FUNCTION_NAME (UtAcquireMutex);
+
+
+ if (MutexId > ACPI_MAX_MUTEX)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ ThisThreadId = AcpiOsGetThreadId ();
+
+#ifdef ACPI_MUTEX_DEBUG
+ {
+ UINT32 i;
+ /*
+ * Mutex debug code, for internal debugging only.
+ *
+ * Deadlock prevention. Check if this thread owns any mutexes of value
+ * greater than or equal to this one. If so, the thread has violated
+ * the mutex ordering rule. This indicates a coding error somewhere in
+ * the ACPI subsystem code.
+ */
+ for (i = MutexId; i < ACPI_MAX_MUTEX; i++)
+ {
+ if (AcpiGbl_MutexInfo[i].ThreadId == ThisThreadId)
+ {
+ if (i == MutexId)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Mutex [%s] already acquired by this thread [%X]",
+ AcpiUtGetMutexName (MutexId), ThisThreadId));
+
+ return (AE_ALREADY_ACQUIRED);
+ }
+
+ ACPI_ERROR ((AE_INFO,
+ "Invalid acquire order: Thread %X owns [%s], wants [%s]",
+ ThisThreadId, AcpiUtGetMutexName (i),
+ AcpiUtGetMutexName (MutexId)));
+
+ return (AE_ACQUIRE_DEADLOCK);
+ }
+ }
+ }
+#endif
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX,
+ "Thread %X attempting to acquire Mutex [%s]\n",
+ ThisThreadId, AcpiUtGetMutexName (MutexId)));
+
+ Status = AcpiOsAcquireMutex (AcpiGbl_MutexInfo[MutexId].Mutex,
+ ACPI_WAIT_FOREVER);
+ if (ACPI_SUCCESS (Status))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX, "Thread %X acquired Mutex [%s]\n",
+ ThisThreadId, AcpiUtGetMutexName (MutexId)));
+
+ AcpiGbl_MutexInfo[MutexId].UseCount++;
+ AcpiGbl_MutexInfo[MutexId].ThreadId = ThisThreadId;
+ }
+ else
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status,
+ "Thread %X could not acquire Mutex [%X]", ThisThreadId, MutexId));
+ }
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtReleaseMutex
+ *
+ * PARAMETERS: MutexID - ID of the mutex to be released
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Release a mutex object.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtReleaseMutex (
+ ACPI_MUTEX_HANDLE MutexId)
+{
+ ACPI_THREAD_ID ThisThreadId;
+
+
+ ACPI_FUNCTION_NAME (UtReleaseMutex);
+
+
+ ThisThreadId = AcpiOsGetThreadId ();
+ ACPI_DEBUG_PRINT ((ACPI_DB_MUTEX,
+ "Thread %X releasing Mutex [%s]\n", ThisThreadId,
+ AcpiUtGetMutexName (MutexId)));
+
+ if (MutexId > ACPI_MAX_MUTEX)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ /*
+ * Mutex must be acquired in order to release it!
+ */
+ if (AcpiGbl_MutexInfo[MutexId].ThreadId == ACPI_MUTEX_NOT_ACQUIRED)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "Mutex [%X] is not acquired, cannot release", MutexId));
+
+ return (AE_NOT_ACQUIRED);
+ }
+
+#ifdef ACPI_MUTEX_DEBUG
+ {
+ UINT32 i;
+ /*
+ * Mutex debug code, for internal debugging only.
+ *
+ * Deadlock prevention. Check if this thread owns any mutexes of value
+ * greater than this one. If so, the thread has violated the mutex
+ * ordering rule. This indicates a coding error somewhere in
+ * the ACPI subsystem code.
+ */
+ for (i = MutexId; i < ACPI_MAX_MUTEX; i++)
+ {
+ if (AcpiGbl_MutexInfo[i].ThreadId == ThisThreadId)
+ {
+ if (i == MutexId)
+ {
+ continue;
+ }
+
+ ACPI_ERROR ((AE_INFO,
+ "Invalid release order: owns [%s], releasing [%s]",
+ AcpiUtGetMutexName (i), AcpiUtGetMutexName (MutexId)));
+
+ return (AE_RELEASE_DEADLOCK);
+ }
+ }
+ }
+#endif
+
+ /* Mark unlocked FIRST */
+
+ AcpiGbl_MutexInfo[MutexId].ThreadId = ACPI_MUTEX_NOT_ACQUIRED;
+
+ AcpiOsReleaseMutex (AcpiGbl_MutexInfo[MutexId].Mutex);
+ return (AE_OK);
+}
+
+
diff --git a/sys/contrib/dev/acpica/utobject.c b/sys/contrib/dev/acpica/utobject.c
new file mode 100644
index 0000000..5b0c3f3
--- /dev/null
+++ b/sys/contrib/dev/acpica/utobject.c
@@ -0,0 +1,764 @@
+/******************************************************************************
+ *
+ * Module Name: utobject - ACPI object create/delete/size/cache routines
+ * $Revision: 1.104 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+#define __UTOBJECT_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/amlcode.h>
+
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utobject")
+
+/* Local prototypes */
+
+static ACPI_STATUS
+AcpiUtGetSimpleObjectSize (
+ ACPI_OPERAND_OBJECT *Obj,
+ ACPI_SIZE *ObjLength);
+
+static ACPI_STATUS
+AcpiUtGetPackageObjectSize (
+ ACPI_OPERAND_OBJECT *Obj,
+ ACPI_SIZE *ObjLength);
+
+static ACPI_STATUS
+AcpiUtGetElementLength (
+ UINT8 ObjectType,
+ ACPI_OPERAND_OBJECT *SourceObject,
+ ACPI_GENERIC_STATE *State,
+ void *Context);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateInternalObjectDbg
+ *
+ * PARAMETERS: ModuleName - Source file name of caller
+ * LineNumber - Line number of caller
+ * ComponentId - Component type of caller
+ * Type - ACPI Type of the new object
+ *
+ * RETURN: A new internal object, null on failure
+ *
+ * DESCRIPTION: Create and initialize a new internal object.
+ *
+ * NOTE: We always allocate the worst-case object descriptor because
+ * these objects are cached, and we want them to be
+ * one-size-satisifies-any-request. This in itself may not be
+ * the most memory efficient, but the efficiency of the object
+ * cache should more than make up for this!
+ *
+ ******************************************************************************/
+
+ACPI_OPERAND_OBJECT *
+AcpiUtCreateInternalObjectDbg (
+ char *ModuleName,
+ UINT32 LineNumber,
+ UINT32 ComponentId,
+ ACPI_OBJECT_TYPE Type)
+{
+ ACPI_OPERAND_OBJECT *Object;
+ ACPI_OPERAND_OBJECT *SecondObject;
+
+
+ ACPI_FUNCTION_TRACE_STR (UtCreateInternalObjectDbg,
+ AcpiUtGetTypeName (Type));
+
+
+ /* Allocate the raw object descriptor */
+
+ Object = AcpiUtAllocateObjectDescDbg (ModuleName, LineNumber, ComponentId);
+ if (!Object)
+ {
+ return_PTR (NULL);
+ }
+
+ switch (Type)
+ {
+ case ACPI_TYPE_REGION:
+ case ACPI_TYPE_BUFFER_FIELD:
+
+ /* These types require a secondary object */
+
+ SecondObject = AcpiUtAllocateObjectDescDbg (ModuleName,
+ LineNumber, ComponentId);
+ if (!SecondObject)
+ {
+ AcpiUtDeleteObjectDesc (Object);
+ return_PTR (NULL);
+ }
+
+ SecondObject->Common.Type = ACPI_TYPE_LOCAL_EXTRA;
+ SecondObject->Common.ReferenceCount = 1;
+
+ /* Link the second object to the first */
+
+ Object->Common.NextObject = SecondObject;
+ break;
+
+ default:
+ /* All others have no secondary object */
+ break;
+ }
+
+ /* Save the object type in the object descriptor */
+
+ Object->Common.Type = (UINT8) Type;
+
+ /* Init the reference count */
+
+ Object->Common.ReferenceCount = 1;
+
+ /* Any per-type initialization should go here */
+
+ return_PTR (Object);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateBufferObject
+ *
+ * PARAMETERS: BufferSize - Size of buffer to be created
+ *
+ * RETURN: Pointer to a new Buffer object, null on failure
+ *
+ * DESCRIPTION: Create a fully initialized buffer object
+ *
+ ******************************************************************************/
+
+ACPI_OPERAND_OBJECT *
+AcpiUtCreateBufferObject (
+ ACPI_SIZE BufferSize)
+{
+ ACPI_OPERAND_OBJECT *BufferDesc;
+ UINT8 *Buffer = NULL;
+
+
+ ACPI_FUNCTION_TRACE_U32 (UtCreateBufferObject, BufferSize);
+
+
+ /* Create a new Buffer object */
+
+ BufferDesc = AcpiUtCreateInternalObject (ACPI_TYPE_BUFFER);
+ if (!BufferDesc)
+ {
+ return_PTR (NULL);
+ }
+
+ /* Create an actual buffer only if size > 0 */
+
+ if (BufferSize > 0)
+ {
+ /* Allocate the actual buffer */
+
+ Buffer = ACPI_ALLOCATE_ZEROED (BufferSize);
+ if (!Buffer)
+ {
+ ACPI_ERROR ((AE_INFO, "Could not allocate size %X",
+ (UINT32) BufferSize));
+ AcpiUtRemoveReference (BufferDesc);
+ return_PTR (NULL);
+ }
+ }
+
+ /* Complete buffer object initialization */
+
+ BufferDesc->Buffer.Flags |= AOPOBJ_DATA_VALID;
+ BufferDesc->Buffer.Pointer = Buffer;
+ BufferDesc->Buffer.Length = (UINT32) BufferSize;
+
+ /* Return the new buffer descriptor */
+
+ return_PTR (BufferDesc);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateStringObject
+ *
+ * PARAMETERS: StringSize - Size of string to be created. Does not
+ * include NULL terminator, this is added
+ * automatically.
+ *
+ * RETURN: Pointer to a new String object
+ *
+ * DESCRIPTION: Create a fully initialized string object
+ *
+ ******************************************************************************/
+
+ACPI_OPERAND_OBJECT *
+AcpiUtCreateStringObject (
+ ACPI_SIZE StringSize)
+{
+ ACPI_OPERAND_OBJECT *StringDesc;
+ char *String;
+
+
+ ACPI_FUNCTION_TRACE_U32 (UtCreateStringObject, StringSize);
+
+
+ /* Create a new String object */
+
+ StringDesc = AcpiUtCreateInternalObject (ACPI_TYPE_STRING);
+ if (!StringDesc)
+ {
+ return_PTR (NULL);
+ }
+
+ /*
+ * Allocate the actual string buffer -- (Size + 1) for NULL terminator.
+ * NOTE: Zero-length strings are NULL terminated
+ */
+ String = ACPI_ALLOCATE_ZEROED (StringSize + 1);
+ if (!String)
+ {
+ ACPI_ERROR ((AE_INFO, "Could not allocate size %X",
+ (UINT32) StringSize));
+ AcpiUtRemoveReference (StringDesc);
+ return_PTR (NULL);
+ }
+
+ /* Complete string object initialization */
+
+ StringDesc->String.Pointer = String;
+ StringDesc->String.Length = (UINT32) StringSize;
+
+ /* Return the new string descriptor */
+
+ return_PTR (StringDesc);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtValidInternalObject
+ *
+ * PARAMETERS: Object - Object to be validated
+ *
+ * RETURN: TRUE if object is valid, FALSE otherwise
+ *
+ * DESCRIPTION: Validate a pointer to be an ACPI_OPERAND_OBJECT
+ *
+ ******************************************************************************/
+
+BOOLEAN
+AcpiUtValidInternalObject (
+ void *Object)
+{
+
+ ACPI_FUNCTION_NAME (UtValidInternalObject);
+
+
+ /* Check for a null pointer */
+
+ if (!Object)
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO, "**** Null Object Ptr\n"));
+ return (FALSE);
+ }
+
+ /* Check the descriptor type field */
+
+ switch (ACPI_GET_DESCRIPTOR_TYPE (Object))
+ {
+ case ACPI_DESC_TYPE_OPERAND:
+
+ /* The object appears to be a valid ACPI_OPERAND_OBJECT */
+
+ return (TRUE);
+
+ default:
+ ACPI_DEBUG_PRINT ((ACPI_DB_INFO,
+ "%p is not not an ACPI operand obj [%s]\n",
+ Object, AcpiUtGetDescriptorName (Object)));
+ break;
+ }
+
+ return (FALSE);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtAllocateObjectDescDbg
+ *
+ * PARAMETERS: ModuleName - Caller's module name (for error output)
+ * LineNumber - Caller's line number (for error output)
+ * ComponentId - Caller's component ID (for error output)
+ *
+ * RETURN: Pointer to newly allocated object descriptor. Null on error
+ *
+ * DESCRIPTION: Allocate a new object descriptor. Gracefully handle
+ * error conditions.
+ *
+ ******************************************************************************/
+
+void *
+AcpiUtAllocateObjectDescDbg (
+ char *ModuleName,
+ UINT32 LineNumber,
+ UINT32 ComponentId)
+{
+ ACPI_OPERAND_OBJECT *Object;
+
+
+ ACPI_FUNCTION_TRACE (UtAllocateObjectDescDbg);
+
+
+ Object = AcpiOsAcquireObject (AcpiGbl_OperandCache);
+ if (!Object)
+ {
+ ACPI_ERROR ((ModuleName, LineNumber,
+ "Could not allocate an object descriptor"));
+
+ return_PTR (NULL);
+ }
+
+ /* Mark the descriptor type */
+
+ ACPI_SET_DESCRIPTOR_TYPE (Object, ACPI_DESC_TYPE_OPERAND);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p Size %X\n",
+ Object, (UINT32) sizeof (ACPI_OPERAND_OBJECT)));
+
+ return_PTR (Object);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDeleteObjectDesc
+ *
+ * PARAMETERS: Object - An Acpi internal object to be deleted
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Free an ACPI object descriptor or add it to the object cache
+ *
+ ******************************************************************************/
+
+void
+AcpiUtDeleteObjectDesc (
+ ACPI_OPERAND_OBJECT *Object)
+{
+ ACPI_FUNCTION_TRACE_PTR (UtDeleteObjectDesc, Object);
+
+
+ /* Object must be an ACPI_OPERAND_OBJECT */
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (Object) != ACPI_DESC_TYPE_OPERAND)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "%p is not an ACPI Operand object [%s]", Object,
+ AcpiUtGetDescriptorName (Object)));
+ return_VOID;
+ }
+
+ (void) AcpiOsReleaseObject (AcpiGbl_OperandCache, Object);
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetSimpleObjectSize
+ *
+ * PARAMETERS: InternalObject - An ACPI operand object
+ * ObjLength - Where the length is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to determine the space required to
+ * contain a simple object for return to an external user.
+ *
+ * The length includes the object structure plus any additional
+ * needed space.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtGetSimpleObjectSize (
+ ACPI_OPERAND_OBJECT *InternalObject,
+ ACPI_SIZE *ObjLength)
+{
+ ACPI_SIZE Length;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE_PTR (UtGetSimpleObjectSize, InternalObject);
+
+
+ /*
+ * Handle a null object (Could be a uninitialized package
+ * element -- which is legal)
+ */
+ if (!InternalObject)
+ {
+ *ObjLength = 0;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Start with the length of the Acpi object */
+
+ Length = sizeof (ACPI_OBJECT);
+
+ if (ACPI_GET_DESCRIPTOR_TYPE (InternalObject) == ACPI_DESC_TYPE_NAMED)
+ {
+ /* Object is a named object (reference), just return the length */
+
+ *ObjLength = ACPI_ROUND_UP_TO_NATIVE_WORD (Length);
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * The final length depends on the object type
+ * Strings and Buffers are packed right up against the parent object and
+ * must be accessed bytewise or there may be alignment problems on
+ * certain processors
+ */
+ switch (ACPI_GET_OBJECT_TYPE (InternalObject))
+ {
+ case ACPI_TYPE_STRING:
+
+ Length += (ACPI_SIZE) InternalObject->String.Length + 1;
+ break;
+
+
+ case ACPI_TYPE_BUFFER:
+
+ Length += (ACPI_SIZE) InternalObject->Buffer.Length;
+ break;
+
+
+ case ACPI_TYPE_INTEGER:
+ case ACPI_TYPE_PROCESSOR:
+ case ACPI_TYPE_POWER:
+
+ /*
+ * No extra data for these types
+ */
+ break;
+
+
+ case ACPI_TYPE_LOCAL_REFERENCE:
+
+ switch (InternalObject->Reference.Opcode)
+ {
+ case AML_INT_NAMEPATH_OP:
+
+ /*
+ * Get the actual length of the full pathname to this object.
+ * The reference will be converted to the pathname to the object
+ */
+ Length += ACPI_ROUND_UP_TO_NATIVE_WORD (
+ AcpiNsGetPathnameLength (InternalObject->Reference.Node));
+ break;
+
+ default:
+
+ /*
+ * No other reference opcodes are supported.
+ * Notably, Locals and Args are not supported, but this may be
+ * required eventually.
+ */
+ ACPI_ERROR ((AE_INFO,
+ "Unsupported Reference opcode=%X in object %p",
+ InternalObject->Reference.Opcode, InternalObject));
+ Status = AE_TYPE;
+ break;
+ }
+ break;
+
+
+ default:
+
+ ACPI_ERROR ((AE_INFO, "Unsupported type=%X in object %p",
+ ACPI_GET_OBJECT_TYPE (InternalObject), InternalObject));
+ Status = AE_TYPE;
+ break;
+ }
+
+ /*
+ * Account for the space required by the object rounded up to the next
+ * multiple of the machine word size. This keeps each object aligned
+ * on a machine word boundary. (preventing alignment faults on some
+ * machines.)
+ */
+ *ObjLength = ACPI_ROUND_UP_TO_NATIVE_WORD (Length);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetElementLength
+ *
+ * PARAMETERS: ACPI_PKG_CALLBACK
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Get the length of one package element.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtGetElementLength (
+ UINT8 ObjectType,
+ ACPI_OPERAND_OBJECT *SourceObject,
+ ACPI_GENERIC_STATE *State,
+ void *Context)
+{
+ ACPI_STATUS Status = AE_OK;
+ ACPI_PKG_INFO *Info = (ACPI_PKG_INFO *) Context;
+ ACPI_SIZE ObjectSpace;
+
+
+ switch (ObjectType)
+ {
+ case ACPI_COPY_TYPE_SIMPLE:
+
+ /*
+ * Simple object - just get the size (Null object/entry is handled
+ * here also) and sum it into the running package length
+ */
+ Status = AcpiUtGetSimpleObjectSize (SourceObject, &ObjectSpace);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+
+ Info->Length += ObjectSpace;
+ break;
+
+
+ case ACPI_COPY_TYPE_PACKAGE:
+
+ /* Package object - nothing much to do here, let the walk handle it */
+
+ Info->NumPackages++;
+ State->Pkg.ThisTargetObj = NULL;
+ break;
+
+
+ default:
+
+ /* No other types allowed */
+
+ return (AE_BAD_PARAMETER);
+ }
+
+ return (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetPackageObjectSize
+ *
+ * PARAMETERS: InternalObject - An ACPI internal object
+ * ObjLength - Where the length is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to determine the space required to
+ * contain a package object for return to an external user.
+ *
+ * This is moderately complex since a package contains other
+ * objects including packages.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtGetPackageObjectSize (
+ ACPI_OPERAND_OBJECT *InternalObject,
+ ACPI_SIZE *ObjLength)
+{
+ ACPI_STATUS Status;
+ ACPI_PKG_INFO Info;
+
+
+ ACPI_FUNCTION_TRACE_PTR (UtGetPackageObjectSize, InternalObject);
+
+
+ Info.Length = 0;
+ Info.ObjectSpace = 0;
+ Info.NumPackages = 1;
+
+ Status = AcpiUtWalkPackageTree (InternalObject, NULL,
+ AcpiUtGetElementLength, &Info);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * We have handled all of the objects in all levels of the package.
+ * just add the length of the package objects themselves.
+ * Round up to the next machine word.
+ */
+ Info.Length += ACPI_ROUND_UP_TO_NATIVE_WORD (sizeof (ACPI_OBJECT)) *
+ (ACPI_SIZE) Info.NumPackages;
+
+ /* Return the total package length */
+
+ *ObjLength = Info.Length;
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetObjectSize
+ *
+ * PARAMETERS: InternalObject - An ACPI internal object
+ * ObjLength - Where the length will be returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: This function is called to determine the space required to
+ * contain an object for return to an API user.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtGetObjectSize (
+ ACPI_OPERAND_OBJECT *InternalObject,
+ ACPI_SIZE *ObjLength)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ if ((ACPI_GET_DESCRIPTOR_TYPE (InternalObject) == ACPI_DESC_TYPE_OPERAND) &&
+ (ACPI_GET_OBJECT_TYPE (InternalObject) == ACPI_TYPE_PACKAGE))
+ {
+ Status = AcpiUtGetPackageObjectSize (InternalObject, ObjLength);
+ }
+ else
+ {
+ Status = AcpiUtGetSimpleObjectSize (InternalObject, ObjLength);
+ }
+
+ return (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/utresrc.c b/sys/contrib/dev/acpica/utresrc.c
new file mode 100644
index 0000000..530f782
--- /dev/null
+++ b/sys/contrib/dev/acpica/utresrc.c
@@ -0,0 +1,772 @@
+/*******************************************************************************
+ *
+ * Module Name: utresrc - Resource managment utilities
+ * $Revision: 1.14 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __UTRESRC_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/amlresrc.h>
+
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utresrc")
+
+
+#if defined(ACPI_DISASSEMBLER) || defined (ACPI_DEBUGGER)
+
+/*
+ * Strings used to decode resource descriptors.
+ * Used by both the disasssembler and the debugger resource dump routines
+ */
+const char *AcpiGbl_BmDecode[] =
+{
+ "NotBusMaster",
+ "BusMaster"
+};
+
+const char *AcpiGbl_ConfigDecode[] =
+{
+ "0 - Good Configuration",
+ "1 - Acceptable Configuration",
+ "2 - Suboptimal Configuration",
+ "3 - ***Invalid Configuration***",
+};
+
+const char *AcpiGbl_ConsumeDecode[] =
+{
+ "ResourceProducer",
+ "ResourceConsumer"
+};
+
+const char *AcpiGbl_DecDecode[] =
+{
+ "PosDecode",
+ "SubDecode"
+};
+
+const char *AcpiGbl_HeDecode[] =
+{
+ "Level",
+ "Edge"
+};
+
+const char *AcpiGbl_IoDecode[] =
+{
+ "Decode10",
+ "Decode16"
+};
+
+const char *AcpiGbl_LlDecode[] =
+{
+ "ActiveHigh",
+ "ActiveLow"
+};
+
+const char *AcpiGbl_MaxDecode[] =
+{
+ "MaxNotFixed",
+ "MaxFixed"
+};
+
+const char *AcpiGbl_MemDecode[] =
+{
+ "NonCacheable",
+ "Cacheable",
+ "WriteCombining",
+ "Prefetchable"
+};
+
+const char *AcpiGbl_MinDecode[] =
+{
+ "MinNotFixed",
+ "MinFixed"
+};
+
+const char *AcpiGbl_MtpDecode[] =
+{
+ "AddressRangeMemory",
+ "AddressRangeReserved",
+ "AddressRangeACPI",
+ "AddressRangeNVS"
+};
+
+const char *AcpiGbl_RngDecode[] =
+{
+ "InvalidRanges",
+ "NonISAOnlyRanges",
+ "ISAOnlyRanges",
+ "EntireRange"
+};
+
+const char *AcpiGbl_RwDecode[] =
+{
+ "ReadOnly",
+ "ReadWrite"
+};
+
+const char *AcpiGbl_ShrDecode[] =
+{
+ "Exclusive",
+ "Shared"
+};
+
+const char *AcpiGbl_SizDecode[] =
+{
+ "Transfer8",
+ "Transfer8_16",
+ "Transfer16",
+ "InvalidSize"
+};
+
+const char *AcpiGbl_TrsDecode[] =
+{
+ "DenseTranslation",
+ "SparseTranslation"
+};
+
+const char *AcpiGbl_TtpDecode[] =
+{
+ "TypeStatic",
+ "TypeTranslation"
+};
+
+const char *AcpiGbl_TypDecode[] =
+{
+ "Compatibility",
+ "TypeA",
+ "TypeB",
+ "TypeF"
+};
+
+#endif
+
+
+/*
+ * Base sizes of the raw AML resource descriptors, indexed by resource type.
+ * Zero indicates a reserved (and therefore invalid) resource type.
+ */
+const UINT8 AcpiGbl_ResourceAmlSizes[] =
+{
+ /* Small descriptors */
+
+ 0,
+ 0,
+ 0,
+ 0,
+ ACPI_AML_SIZE_SMALL (AML_RESOURCE_IRQ),
+ ACPI_AML_SIZE_SMALL (AML_RESOURCE_DMA),
+ ACPI_AML_SIZE_SMALL (AML_RESOURCE_START_DEPENDENT),
+ ACPI_AML_SIZE_SMALL (AML_RESOURCE_END_DEPENDENT),
+ ACPI_AML_SIZE_SMALL (AML_RESOURCE_IO),
+ ACPI_AML_SIZE_SMALL (AML_RESOURCE_FIXED_IO),
+ 0,
+ 0,
+ 0,
+ 0,
+ ACPI_AML_SIZE_SMALL (AML_RESOURCE_VENDOR_SMALL),
+ ACPI_AML_SIZE_SMALL (AML_RESOURCE_END_TAG),
+
+ /* Large descriptors */
+
+ 0,
+ ACPI_AML_SIZE_LARGE (AML_RESOURCE_MEMORY24),
+ ACPI_AML_SIZE_LARGE (AML_RESOURCE_GENERIC_REGISTER),
+ 0,
+ ACPI_AML_SIZE_LARGE (AML_RESOURCE_VENDOR_LARGE),
+ ACPI_AML_SIZE_LARGE (AML_RESOURCE_MEMORY32),
+ ACPI_AML_SIZE_LARGE (AML_RESOURCE_FIXED_MEMORY32),
+ ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS32),
+ ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS16),
+ ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_IRQ),
+ ACPI_AML_SIZE_LARGE (AML_RESOURCE_ADDRESS64),
+ ACPI_AML_SIZE_LARGE (AML_RESOURCE_EXTENDED_ADDRESS64)
+};
+
+
+/*
+ * Resource types, used to validate the resource length field.
+ * The length of fixed-length types must match exactly, variable
+ * lengths must meet the minimum required length, etc.
+ * Zero indicates a reserved (and therefore invalid) resource type.
+ */
+static const UINT8 AcpiGbl_ResourceTypes[] =
+{
+ /* Small descriptors */
+
+ 0,
+ 0,
+ 0,
+ 0,
+ ACPI_SMALL_VARIABLE_LENGTH,
+ ACPI_FIXED_LENGTH,
+ ACPI_SMALL_VARIABLE_LENGTH,
+ ACPI_FIXED_LENGTH,
+ ACPI_FIXED_LENGTH,
+ ACPI_FIXED_LENGTH,
+ 0,
+ 0,
+ 0,
+ 0,
+ ACPI_VARIABLE_LENGTH,
+ ACPI_FIXED_LENGTH,
+
+ /* Large descriptors */
+
+ 0,
+ ACPI_FIXED_LENGTH,
+ ACPI_FIXED_LENGTH,
+ 0,
+ ACPI_VARIABLE_LENGTH,
+ ACPI_FIXED_LENGTH,
+ ACPI_FIXED_LENGTH,
+ ACPI_VARIABLE_LENGTH,
+ ACPI_VARIABLE_LENGTH,
+ ACPI_VARIABLE_LENGTH,
+ ACPI_VARIABLE_LENGTH,
+ ACPI_FIXED_LENGTH
+};
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtWalkAmlResources
+ *
+ * PARAMETERS: Aml - Pointer to the raw AML resource template
+ * AmlLength - Length of the entire template
+ * UserFunction - Called once for each descriptor found. If
+ * NULL, a pointer to the EndTag is returned
+ * Context - Passed to UserFunction
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Walk a raw AML resource list(buffer). User function called
+ * once for each resource found.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtWalkAmlResources (
+ UINT8 *Aml,
+ ACPI_SIZE AmlLength,
+ ACPI_WALK_AML_CALLBACK UserFunction,
+ void *Context)
+{
+ ACPI_STATUS Status;
+ UINT8 *EndAml;
+ UINT8 ResourceIndex;
+ UINT32 Length;
+ UINT32 Offset = 0;
+
+
+ ACPI_FUNCTION_TRACE (UtWalkAmlResources);
+
+
+ /* The absolute minimum resource template is one EndTag descriptor */
+
+ if (AmlLength < sizeof (AML_RESOURCE_END_TAG))
+ {
+ return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
+ }
+
+ /* Point to the end of the resource template buffer */
+
+ EndAml = Aml + AmlLength;
+
+ /* Walk the byte list, abort on any invalid descriptor type or length */
+
+ while (Aml < EndAml)
+ {
+ /* Validate the Resource Type and Resource Length */
+
+ Status = AcpiUtValidateResource (Aml, &ResourceIndex);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Get the length of this descriptor */
+
+ Length = AcpiUtGetDescriptorLength (Aml);
+
+ /* Invoke the user function */
+
+ if (UserFunction)
+ {
+ Status = UserFunction (Aml, Length, Offset, ResourceIndex, Context);
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+
+ /* An EndTag descriptor terminates this resource template */
+
+ if (AcpiUtGetResourceType (Aml) == ACPI_RESOURCE_NAME_END_TAG)
+ {
+ /*
+ * There must be at least one more byte in the buffer for
+ * the 2nd byte of the EndTag
+ */
+ if ((Aml + 1) >= EndAml)
+ {
+ return_ACPI_STATUS (AE_AML_NO_RESOURCE_END_TAG);
+ }
+
+ /* Return the pointer to the EndTag if requested */
+
+ if (!UserFunction)
+ {
+ *(void **) Context = Aml;
+ }
+
+ /* Normal exit */
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ Aml += Length;
+ Offset += Length;
+ }
+
+ /* Did not find an EndTag descriptor */
+
+ return (AE_AML_NO_RESOURCE_END_TAG);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtValidateResource
+ *
+ * PARAMETERS: Aml - Pointer to the raw AML resource descriptor
+ * ReturnIndex - Where the resource index is returned. NULL
+ * if the index is not required.
+ *
+ * RETURN: Status, and optionally the Index into the global resource tables
+ *
+ * DESCRIPTION: Validate an AML resource descriptor by checking the Resource
+ * Type and Resource Length. Returns an index into the global
+ * resource information/dispatch tables for later use.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtValidateResource (
+ void *Aml,
+ UINT8 *ReturnIndex)
+{
+ UINT8 ResourceType;
+ UINT8 ResourceIndex;
+ ACPI_RS_LENGTH ResourceLength;
+ ACPI_RS_LENGTH MinimumResourceLength;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * 1) Validate the ResourceType field (Byte 0)
+ */
+ ResourceType = ACPI_GET8 (Aml);
+
+ /*
+ * Byte 0 contains the descriptor name (Resource Type)
+ * Examine the large/small bit in the resource header
+ */
+ if (ResourceType & ACPI_RESOURCE_NAME_LARGE)
+ {
+ /* Verify the large resource type (name) against the max */
+
+ if (ResourceType > ACPI_RESOURCE_NAME_LARGE_MAX)
+ {
+ return (AE_AML_INVALID_RESOURCE_TYPE);
+ }
+
+ /*
+ * Large Resource Type -- bits 6:0 contain the name
+ * Translate range 0x80-0x8B to index range 0x10-0x1B
+ */
+ ResourceIndex = (UINT8) (ResourceType - 0x70);
+ }
+ else
+ {
+ /*
+ * Small Resource Type -- bits 6:3 contain the name
+ * Shift range to index range 0x00-0x0F
+ */
+ ResourceIndex = (UINT8)
+ ((ResourceType & ACPI_RESOURCE_NAME_SMALL_MASK) >> 3);
+ }
+
+ /* Check validity of the resource type, zero indicates name is invalid */
+
+ if (!AcpiGbl_ResourceTypes[ResourceIndex])
+ {
+ return (AE_AML_INVALID_RESOURCE_TYPE);
+ }
+
+
+ /*
+ * 2) Validate the ResourceLength field. This ensures that the length
+ * is at least reasonable, and guarantees that it is non-zero.
+ */
+ ResourceLength = AcpiUtGetResourceLength (Aml);
+ MinimumResourceLength = AcpiGbl_ResourceAmlSizes[ResourceIndex];
+
+ /* Validate based upon the type of resource - fixed length or variable */
+
+ switch (AcpiGbl_ResourceTypes[ResourceIndex])
+ {
+ case ACPI_FIXED_LENGTH:
+
+ /* Fixed length resource, length must match exactly */
+
+ if (ResourceLength != MinimumResourceLength)
+ {
+ return (AE_AML_BAD_RESOURCE_LENGTH);
+ }
+ break;
+
+ case ACPI_VARIABLE_LENGTH:
+
+ /* Variable length resource, length must be at least the minimum */
+
+ if (ResourceLength < MinimumResourceLength)
+ {
+ return (AE_AML_BAD_RESOURCE_LENGTH);
+ }
+ break;
+
+ case ACPI_SMALL_VARIABLE_LENGTH:
+
+ /* Small variable length resource, length can be (Min) or (Min-1) */
+
+ if ((ResourceLength > MinimumResourceLength) ||
+ (ResourceLength < (MinimumResourceLength - 1)))
+ {
+ return (AE_AML_BAD_RESOURCE_LENGTH);
+ }
+ break;
+
+ default:
+
+ /* Shouldn't happen (because of validation earlier), but be sure */
+
+ return (AE_AML_INVALID_RESOURCE_TYPE);
+ }
+
+ /* Optionally return the resource table index */
+
+ if (ReturnIndex)
+ {
+ *ReturnIndex = ResourceIndex;
+ }
+
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetResourceType
+ *
+ * PARAMETERS: Aml - Pointer to the raw AML resource descriptor
+ *
+ * RETURN: The Resource Type with no extraneous bits (except the
+ * Large/Small descriptor bit -- this is left alone)
+ *
+ * DESCRIPTION: Extract the Resource Type/Name from the first byte of
+ * a resource descriptor.
+ *
+ ******************************************************************************/
+
+UINT8
+AcpiUtGetResourceType (
+ void *Aml)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * Byte 0 contains the descriptor name (Resource Type)
+ * Examine the large/small bit in the resource header
+ */
+ if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
+ {
+ /* Large Resource Type -- bits 6:0 contain the name */
+
+ return (ACPI_GET8 (Aml));
+ }
+ else
+ {
+ /* Small Resource Type -- bits 6:3 contain the name */
+
+ return ((UINT8) (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_SMALL_MASK));
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetResourceLength
+ *
+ * PARAMETERS: Aml - Pointer to the raw AML resource descriptor
+ *
+ * RETURN: Byte Length
+ *
+ * DESCRIPTION: Get the "Resource Length" of a raw AML descriptor. By
+ * definition, this does not include the size of the descriptor
+ * header or the length field itself.
+ *
+ ******************************************************************************/
+
+UINT16
+AcpiUtGetResourceLength (
+ void *Aml)
+{
+ ACPI_RS_LENGTH ResourceLength;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * Byte 0 contains the descriptor name (Resource Type)
+ * Examine the large/small bit in the resource header
+ */
+ if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
+ {
+ /* Large Resource type -- bytes 1-2 contain the 16-bit length */
+
+ ACPI_MOVE_16_TO_16 (&ResourceLength, ACPI_ADD_PTR (UINT8, Aml, 1));
+
+ }
+ else
+ {
+ /* Small Resource type -- bits 2:0 of byte 0 contain the length */
+
+ ResourceLength = (UINT16) (ACPI_GET8 (Aml) &
+ ACPI_RESOURCE_NAME_SMALL_LENGTH_MASK);
+ }
+
+ return (ResourceLength);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetResourceHeaderLength
+ *
+ * PARAMETERS: Aml - Pointer to the raw AML resource descriptor
+ *
+ * RETURN: Length of the AML header (depends on large/small descriptor)
+ *
+ * DESCRIPTION: Get the length of the header for this resource.
+ *
+ ******************************************************************************/
+
+UINT8
+AcpiUtGetResourceHeaderLength (
+ void *Aml)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /* Examine the large/small bit in the resource header */
+
+ if (ACPI_GET8 (Aml) & ACPI_RESOURCE_NAME_LARGE)
+ {
+ return (sizeof (AML_RESOURCE_LARGE_HEADER));
+ }
+ else
+ {
+ return (sizeof (AML_RESOURCE_SMALL_HEADER));
+ }
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetDescriptorLength
+ *
+ * PARAMETERS: Aml - Pointer to the raw AML resource descriptor
+ *
+ * RETURN: Byte length
+ *
+ * DESCRIPTION: Get the total byte length of a raw AML descriptor, including the
+ * length of the descriptor header and the length field itself.
+ * Used to walk descriptor lists.
+ *
+ ******************************************************************************/
+
+UINT32
+AcpiUtGetDescriptorLength (
+ void *Aml)
+{
+ ACPI_FUNCTION_ENTRY ();
+
+
+ /*
+ * Get the Resource Length (does not include header length) and add
+ * the header length (depends on if this is a small or large resource)
+ */
+ return (AcpiUtGetResourceLength (Aml) +
+ AcpiUtGetResourceHeaderLength (Aml));
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtGetResourceEndTag
+ *
+ * PARAMETERS: ObjDesc - The resource template buffer object
+ * EndTag - Where the pointer to the EndTag is returned
+ *
+ * RETURN: Status, pointer to the end tag
+ *
+ * DESCRIPTION: Find the EndTag resource descriptor in an AML resource template
+ * Note: allows a buffer length of zero.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtGetResourceEndTag (
+ ACPI_OPERAND_OBJECT *ObjDesc,
+ UINT8 **EndTag)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (UtGetResourceEndTag);
+
+
+ /* Allow a buffer length of zero */
+
+ if (!ObjDesc->Buffer.Length)
+ {
+ *EndTag = ObjDesc->Buffer.Pointer;
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ /* Validate the template and get a pointer to the EndTag */
+
+ Status = AcpiUtWalkAmlResources (ObjDesc->Buffer.Pointer,
+ ObjDesc->Buffer.Length, NULL, EndTag);
+
+ return_ACPI_STATUS (Status);
+}
+
+
diff --git a/sys/contrib/dev/acpica/utstate.c b/sys/contrib/dev/acpica/utstate.c
new file mode 100644
index 0000000..a58257b
--- /dev/null
+++ b/sys/contrib/dev/acpica/utstate.c
@@ -0,0 +1,470 @@
+/*******************************************************************************
+ *
+ * Module Name: utstate - state object support procedures
+ * $Revision: 1.8 $
+ *
+ ******************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __UTSTATE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utstate")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreatePkgStateAndPush
+ *
+ * PARAMETERS: Object - Object to be added to the new state
+ * Action - Increment/Decrement
+ * StateList - List the state will be added to
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a new state and push it
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtCreatePkgStateAndPush (
+ void *InternalObject,
+ void *ExternalObject,
+ UINT16 Index,
+ ACPI_GENERIC_STATE **StateList)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ State = AcpiUtCreatePkgState (InternalObject, ExternalObject, Index);
+ if (!State)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ AcpiUtPushGenericState (StateList, State);
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtPushGenericState
+ *
+ * PARAMETERS: ListHead - Head of the state stack
+ * State - State object to push
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Push a state object onto a state stack
+ *
+ ******************************************************************************/
+
+void
+AcpiUtPushGenericState (
+ ACPI_GENERIC_STATE **ListHead,
+ ACPI_GENERIC_STATE *State)
+{
+ ACPI_FUNCTION_TRACE (UtPushGenericState);
+
+
+ /* Push the state object onto the front of the list (stack) */
+
+ State->Common.Next = *ListHead;
+ *ListHead = State;
+
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtPopGenericState
+ *
+ * PARAMETERS: ListHead - Head of the state stack
+ *
+ * RETURN: The popped state object
+ *
+ * DESCRIPTION: Pop a state object from a state stack
+ *
+ ******************************************************************************/
+
+ACPI_GENERIC_STATE *
+AcpiUtPopGenericState (
+ ACPI_GENERIC_STATE **ListHead)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_TRACE (UtPopGenericState);
+
+
+ /* Remove the state object at the head of the list (stack) */
+
+ State = *ListHead;
+ if (State)
+ {
+ /* Update the list head */
+
+ *ListHead = State->Common.Next;
+ }
+
+ return_PTR (State);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateGenericState
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: The new state object. NULL on failure.
+ *
+ * DESCRIPTION: Create a generic state object. Attempt to obtain one from
+ * the global state cache; If none available, create a new one.
+ *
+ ******************************************************************************/
+
+ACPI_GENERIC_STATE *
+AcpiUtCreateGenericState (
+ void)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ State = AcpiOsAcquireObject (AcpiGbl_StateCache);
+ if (State)
+ {
+ /* Initialize */
+ State->Common.DescriptorType = ACPI_DESC_TYPE_STATE;
+ }
+
+ return (State);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateThreadState
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: New Thread State. NULL on failure
+ *
+ * DESCRIPTION: Create a "Thread State" - a flavor of the generic state used
+ * to track per-thread info during method execution
+ *
+ ******************************************************************************/
+
+ACPI_THREAD_STATE *
+AcpiUtCreateThreadState (
+ void)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_TRACE (UtCreateThreadState);
+
+
+ /* Create the generic state object */
+
+ State = AcpiUtCreateGenericState ();
+ if (!State)
+ {
+ return_PTR (NULL);
+ }
+
+ /* Init fields specific to the update struct */
+
+ State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_THREAD;
+ State->Thread.ThreadId = AcpiOsGetThreadId ();
+
+ /* Check for invalid thread ID - zero is very bad, it will break things */
+
+ if (!State->Thread.ThreadId)
+ {
+ ACPI_ERROR ((AE_INFO, "Invalid zero ID from AcpiOsGetThreadId"));
+ State->Thread.ThreadId = 1;
+ }
+
+ return_PTR ((ACPI_THREAD_STATE *) State);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateUpdateState
+ *
+ * PARAMETERS: Object - Initial Object to be installed in the state
+ * Action - Update action to be performed
+ *
+ * RETURN: New state object, null on failure
+ *
+ * DESCRIPTION: Create an "Update State" - a flavor of the generic state used
+ * to update reference counts and delete complex objects such
+ * as packages.
+ *
+ ******************************************************************************/
+
+ACPI_GENERIC_STATE *
+AcpiUtCreateUpdateState (
+ ACPI_OPERAND_OBJECT *Object,
+ UINT16 Action)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_TRACE_PTR (UtCreateUpdateState, Object);
+
+
+ /* Create the generic state object */
+
+ State = AcpiUtCreateGenericState ();
+ if (!State)
+ {
+ return_PTR (NULL);
+ }
+
+ /* Init fields specific to the update struct */
+
+ State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_UPDATE;
+ State->Update.Object = Object;
+ State->Update.Value = Action;
+
+ return_PTR (State);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreatePkgState
+ *
+ * PARAMETERS: Object - Initial Object to be installed in the state
+ * Action - Update action to be performed
+ *
+ * RETURN: New state object, null on failure
+ *
+ * DESCRIPTION: Create a "Package State"
+ *
+ ******************************************************************************/
+
+ACPI_GENERIC_STATE *
+AcpiUtCreatePkgState (
+ void *InternalObject,
+ void *ExternalObject,
+ UINT16 Index)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_TRACE_PTR (UtCreatePkgState, InternalObject);
+
+
+ /* Create the generic state object */
+
+ State = AcpiUtCreateGenericState ();
+ if (!State)
+ {
+ return_PTR (NULL);
+ }
+
+ /* Init fields specific to the update struct */
+
+ State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_PACKAGE;
+ State->Pkg.SourceObject = (ACPI_OPERAND_OBJECT *) InternalObject;
+ State->Pkg.DestObject = ExternalObject;
+ State->Pkg.Index= Index;
+ State->Pkg.NumPackages = 1;
+
+ return_PTR (State);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateControlState
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: New state object, null on failure
+ *
+ * DESCRIPTION: Create a "Control State" - a flavor of the generic state used
+ * to support nested IF/WHILE constructs in the AML.
+ *
+ ******************************************************************************/
+
+ACPI_GENERIC_STATE *
+AcpiUtCreateControlState (
+ void)
+{
+ ACPI_GENERIC_STATE *State;
+
+
+ ACPI_FUNCTION_TRACE (UtCreateControlState);
+
+
+ /* Create the generic state object */
+
+ State = AcpiUtCreateGenericState ();
+ if (!State)
+ {
+ return_PTR (NULL);
+ }
+
+ /* Init fields specific to the control struct */
+
+ State->Common.DescriptorType = ACPI_DESC_TYPE_STATE_CONTROL;
+ State->Common.State = ACPI_CONTROL_CONDITIONAL_EXECUTING;
+
+ return_PTR (State);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDeleteGenericState
+ *
+ * PARAMETERS: State - The state object to be deleted
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Release a state object to the state cache. NULL state objects
+ * are ignored.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtDeleteGenericState (
+ ACPI_GENERIC_STATE *State)
+{
+ ACPI_FUNCTION_TRACE (UtDeleteGenericState);
+
+
+ /* Ignore null state */
+
+ if (State)
+ {
+ (void) AcpiOsReleaseObject (AcpiGbl_StateCache, State);
+ }
+ return_VOID;
+}
+
+
diff --git a/sys/contrib/dev/acpica/uttrack.c b/sys/contrib/dev/acpica/uttrack.c
new file mode 100644
index 0000000..5c2ae93
--- /dev/null
+++ b/sys/contrib/dev/acpica/uttrack.c
@@ -0,0 +1,726 @@
+/******************************************************************************
+ *
+ * Module Name: uttrack - Memory allocation tracking routines (debug only)
+ * $Revision: 1.5 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+/*
+ * These procedures are used for tracking memory leaks in the subsystem, and
+ * they get compiled out when the ACPI_DBG_TRACK_ALLOCATIONS is not set.
+ *
+ * Each memory allocation is tracked via a doubly linked list. Each
+ * element contains the caller's component, module name, function name, and
+ * line number. AcpiUtAllocate and AcpiUtAllocateZeroed call
+ * AcpiUtTrackAllocation to add an element to the list; deletion
+ * occurs in the body of AcpiUtFree.
+ */
+
+#define __UTTRACK_C__
+
+#include <contrib/dev/acpica/acpi.h>
+
+#ifdef ACPI_DBG_TRACK_ALLOCATIONS
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("uttrack")
+
+/* Local prototypes */
+
+static ACPI_DEBUG_MEM_BLOCK *
+AcpiUtFindAllocation (
+ void *Allocation);
+
+static ACPI_STATUS
+AcpiUtTrackAllocation (
+ ACPI_DEBUG_MEM_BLOCK *Address,
+ ACPI_SIZE Size,
+ UINT8 AllocType,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line);
+
+static ACPI_STATUS
+AcpiUtRemoveAllocation (
+ ACPI_DEBUG_MEM_BLOCK *Address,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line);
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtCreateList
+ *
+ * PARAMETERS: CacheName - Ascii name for the cache
+ * ObjectSize - Size of each cached object
+ * ReturnCache - Where the new cache object is returned
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Create a local memory list for tracking purposed
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiUtCreateList (
+ char *ListName,
+ UINT16 ObjectSize,
+ ACPI_MEMORY_LIST **ReturnCache)
+{
+ ACPI_MEMORY_LIST *Cache;
+
+
+ Cache = AcpiOsAllocate (sizeof (ACPI_MEMORY_LIST));
+ if (!Cache)
+ {
+ return (AE_NO_MEMORY);
+ }
+
+ ACPI_MEMSET (Cache, 0, sizeof (ACPI_MEMORY_LIST));
+
+ Cache->ListName = ListName;
+ Cache->ObjectSize = ObjectSize;
+
+ *ReturnCache = Cache;
+ return (AE_OK);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtAllocateAndTrack
+ *
+ * PARAMETERS: Size - Size of the allocation
+ * Component - Component type of caller
+ * Module - Source file name of caller
+ * Line - Line number of caller
+ *
+ * RETURN: Address of the allocated memory on success, NULL on failure.
+ *
+ * DESCRIPTION: The subsystem's equivalent of malloc.
+ *
+ ******************************************************************************/
+
+void *
+AcpiUtAllocateAndTrack (
+ ACPI_SIZE Size,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line)
+{
+ ACPI_DEBUG_MEM_BLOCK *Allocation;
+ ACPI_STATUS Status;
+
+
+ Allocation = AcpiUtAllocate (Size + sizeof (ACPI_DEBUG_MEM_HEADER),
+ Component, Module, Line);
+ if (!Allocation)
+ {
+ return (NULL);
+ }
+
+ Status = AcpiUtTrackAllocation (Allocation, Size,
+ ACPI_MEM_MALLOC, Component, Module, Line);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsFree (Allocation);
+ return (NULL);
+ }
+
+ AcpiGbl_GlobalList->TotalAllocated++;
+ AcpiGbl_GlobalList->TotalSize += (UINT32) Size;
+ AcpiGbl_GlobalList->CurrentTotalSize += (UINT32) Size;
+ if (AcpiGbl_GlobalList->CurrentTotalSize > AcpiGbl_GlobalList->MaxOccupied)
+ {
+ AcpiGbl_GlobalList->MaxOccupied = AcpiGbl_GlobalList->CurrentTotalSize;
+ }
+
+ return ((void *) &Allocation->UserSpace);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtAllocateZeroedAndTrack
+ *
+ * PARAMETERS: Size - Size of the allocation
+ * Component - Component type of caller
+ * Module - Source file name of caller
+ * Line - Line number of caller
+ *
+ * RETURN: Address of the allocated memory on success, NULL on failure.
+ *
+ * DESCRIPTION: Subsystem equivalent of calloc.
+ *
+ ******************************************************************************/
+
+void *
+AcpiUtAllocateZeroedAndTrack (
+ ACPI_SIZE Size,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line)
+{
+ ACPI_DEBUG_MEM_BLOCK *Allocation;
+ ACPI_STATUS Status;
+
+
+ Allocation = AcpiUtAllocateZeroed (Size + sizeof (ACPI_DEBUG_MEM_HEADER),
+ Component, Module, Line);
+ if (!Allocation)
+ {
+ /* Report allocation error */
+
+ ACPI_ERROR ((Module, Line,
+ "Could not allocate size %X", (UINT32) Size));
+ return (NULL);
+ }
+
+ Status = AcpiUtTrackAllocation (Allocation, Size,
+ ACPI_MEM_CALLOC, Component, Module, Line);
+ if (ACPI_FAILURE (Status))
+ {
+ AcpiOsFree (Allocation);
+ return (NULL);
+ }
+
+ AcpiGbl_GlobalList->TotalAllocated++;
+ AcpiGbl_GlobalList->TotalSize += (UINT32) Size;
+ AcpiGbl_GlobalList->CurrentTotalSize += (UINT32) Size;
+ if (AcpiGbl_GlobalList->CurrentTotalSize > AcpiGbl_GlobalList->MaxOccupied)
+ {
+ AcpiGbl_GlobalList->MaxOccupied = AcpiGbl_GlobalList->CurrentTotalSize;
+ }
+
+ return ((void *) &Allocation->UserSpace);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtFreeAndTrack
+ *
+ * PARAMETERS: Allocation - Address of the memory to deallocate
+ * Component - Component type of caller
+ * Module - Source file name of caller
+ * Line - Line number of caller
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Frees the memory at Allocation
+ *
+ ******************************************************************************/
+
+void
+AcpiUtFreeAndTrack (
+ void *Allocation,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line)
+{
+ ACPI_DEBUG_MEM_BLOCK *DebugBlock;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE_PTR (UtFree, Allocation);
+
+
+ if (NULL == Allocation)
+ {
+ ACPI_ERROR ((Module, Line,
+ "Attempt to delete a NULL address"));
+
+ return_VOID;
+ }
+
+ DebugBlock = ACPI_CAST_PTR (ACPI_DEBUG_MEM_BLOCK,
+ (((char *) Allocation) - sizeof (ACPI_DEBUG_MEM_HEADER)));
+
+ AcpiGbl_GlobalList->TotalFreed++;
+ AcpiGbl_GlobalList->CurrentTotalSize -= DebugBlock->Size;
+
+ Status = AcpiUtRemoveAllocation (DebugBlock,
+ Component, Module, Line);
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "Could not free memory"));
+ }
+
+ AcpiOsFree (DebugBlock);
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "%p freed\n", Allocation));
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtFindAllocation
+ *
+ * PARAMETERS: Allocation - Address of allocated memory
+ *
+ * RETURN: A list element if found; NULL otherwise.
+ *
+ * DESCRIPTION: Searches for an element in the global allocation tracking list.
+ *
+ ******************************************************************************/
+
+static ACPI_DEBUG_MEM_BLOCK *
+AcpiUtFindAllocation (
+ void *Allocation)
+{
+ ACPI_DEBUG_MEM_BLOCK *Element;
+
+
+ ACPI_FUNCTION_ENTRY ();
+
+
+ Element = AcpiGbl_GlobalList->ListHead;
+
+ /* Search for the address. */
+
+ while (Element)
+ {
+ if (Element == Allocation)
+ {
+ return (Element);
+ }
+
+ Element = Element->Next;
+ }
+
+ return (NULL);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtTrackAllocation
+ *
+ * PARAMETERS: Allocation - Address of allocated memory
+ * Size - Size of the allocation
+ * AllocType - MEM_MALLOC or MEM_CALLOC
+ * Component - Component type of caller
+ * Module - Source file name of caller
+ * Line - Line number of caller
+ *
+ * RETURN: None.
+ *
+ * DESCRIPTION: Inserts an element into the global allocation tracking list.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtTrackAllocation (
+ ACPI_DEBUG_MEM_BLOCK *Allocation,
+ ACPI_SIZE Size,
+ UINT8 AllocType,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line)
+{
+ ACPI_MEMORY_LIST *MemList;
+ ACPI_DEBUG_MEM_BLOCK *Element;
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE_PTR (UtTrackAllocation, Allocation);
+
+
+ MemList = AcpiGbl_GlobalList;
+ Status = AcpiUtAcquireMutex (ACPI_MTX_MEMORY);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Search list for this address to make sure it is not already on the list.
+ * This will catch several kinds of problems.
+ */
+ Element = AcpiUtFindAllocation (Allocation);
+ if (Element)
+ {
+ ACPI_ERROR ((AE_INFO,
+ "UtTrackAllocation: Allocation already present in list! (%p)",
+ Allocation));
+
+ ACPI_ERROR ((AE_INFO, "Element %p Address %p",
+ Element, Allocation));
+
+ goto UnlockAndExit;
+ }
+
+ /* Fill in the instance data. */
+
+ Allocation->Size = (UINT32) Size;
+ Allocation->AllocType = AllocType;
+ Allocation->Component = Component;
+ Allocation->Line = Line;
+
+ ACPI_STRNCPY (Allocation->Module, Module, ACPI_MAX_MODULE_NAME);
+ Allocation->Module[ACPI_MAX_MODULE_NAME-1] = 0;
+
+ /* Insert at list head */
+
+ if (MemList->ListHead)
+ {
+ ((ACPI_DEBUG_MEM_BLOCK *)(MemList->ListHead))->Previous = Allocation;
+ }
+
+ Allocation->Next = MemList->ListHead;
+ Allocation->Previous = NULL;
+
+ MemList->ListHead = Allocation;
+
+
+UnlockAndExit:
+ Status = AcpiUtReleaseMutex (ACPI_MTX_MEMORY);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtRemoveAllocation
+ *
+ * PARAMETERS: Allocation - Address of allocated memory
+ * Component - Component type of caller
+ * Module - Source file name of caller
+ * Line - Line number of caller
+ *
+ * RETURN:
+ *
+ * DESCRIPTION: Deletes an element from the global allocation tracking list.
+ *
+ ******************************************************************************/
+
+static ACPI_STATUS
+AcpiUtRemoveAllocation (
+ ACPI_DEBUG_MEM_BLOCK *Allocation,
+ UINT32 Component,
+ char *Module,
+ UINT32 Line)
+{
+ ACPI_MEMORY_LIST *MemList;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (UtRemoveAllocation);
+
+
+ MemList = AcpiGbl_GlobalList;
+ if (NULL == MemList->ListHead)
+ {
+ /* No allocations! */
+
+ ACPI_ERROR ((Module, Line,
+ "Empty allocation list, nothing to free!"));
+
+ return_ACPI_STATUS (AE_OK);
+ }
+
+ Status = AcpiUtAcquireMutex (ACPI_MTX_MEMORY);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Unlink */
+
+ if (Allocation->Previous)
+ {
+ (Allocation->Previous)->Next = Allocation->Next;
+ }
+ else
+ {
+ MemList->ListHead = Allocation->Next;
+ }
+
+ if (Allocation->Next)
+ {
+ (Allocation->Next)->Previous = Allocation->Previous;
+ }
+
+ /* Mark the segment as deleted */
+
+ ACPI_MEMSET (&Allocation->UserSpace, 0xEA, Allocation->Size);
+
+ ACPI_DEBUG_PRINT ((ACPI_DB_ALLOCATIONS, "Freeing size 0%X\n",
+ Allocation->Size));
+
+ Status = AcpiUtReleaseMutex (ACPI_MTX_MEMORY);
+ return_ACPI_STATUS (Status);
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDumpAllocationInfo
+ *
+ * PARAMETERS:
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print some info about the outstanding allocations.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtDumpAllocationInfo (
+ void)
+{
+/*
+ ACPI_MEMORY_LIST *MemList;
+*/
+
+ ACPI_FUNCTION_TRACE (UtDumpAllocationInfo);
+
+/*
+ ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
+ ("%30s: %4d (%3d Kb)\n", "Current allocations",
+ MemList->CurrentCount,
+ ROUND_UP_TO_1K (MemList->CurrentSize)));
+
+ ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
+ ("%30s: %4d (%3d Kb)\n", "Max concurrent allocations",
+ MemList->MaxConcurrentCount,
+ ROUND_UP_TO_1K (MemList->MaxConcurrentSize)));
+
+
+ ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
+ ("%30s: %4d (%3d Kb)\n", "Total (all) internal objects",
+ RunningObjectCount,
+ ROUND_UP_TO_1K (RunningObjectSize)));
+
+ ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
+ ("%30s: %4d (%3d Kb)\n", "Total (all) allocations",
+ RunningAllocCount,
+ ROUND_UP_TO_1K (RunningAllocSize)));
+
+
+ ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
+ ("%30s: %4d (%3d Kb)\n", "Current Nodes",
+ AcpiGbl_CurrentNodeCount,
+ ROUND_UP_TO_1K (AcpiGbl_CurrentNodeSize)));
+
+ ACPI_DEBUG_PRINT (TRACE_ALLOCATIONS | TRACE_TABLES,
+ ("%30s: %4d (%3d Kb)\n", "Max Nodes",
+ AcpiGbl_MaxConcurrentNodeCount,
+ ROUND_UP_TO_1K ((AcpiGbl_MaxConcurrentNodeCount *
+ sizeof (ACPI_NAMESPACE_NODE)))));
+*/
+ return_VOID;
+}
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiUtDumpAllocations
+ *
+ * PARAMETERS: Component - Component(s) to dump info for.
+ * Module - Module to dump info for. NULL means all.
+ *
+ * RETURN: None
+ *
+ * DESCRIPTION: Print a list of all outstanding allocations.
+ *
+ ******************************************************************************/
+
+void
+AcpiUtDumpAllocations (
+ UINT32 Component,
+ char *Module)
+{
+ ACPI_DEBUG_MEM_BLOCK *Element;
+ ACPI_DESCRIPTOR *Descriptor;
+ UINT32 NumOutstanding = 0;
+
+
+ ACPI_FUNCTION_TRACE (UtDumpAllocations);
+
+
+ /*
+ * Walk the allocation list.
+ */
+ if (ACPI_FAILURE (AcpiUtAcquireMutex (ACPI_MTX_MEMORY)))
+ {
+ return;
+ }
+
+ Element = AcpiGbl_GlobalList->ListHead;
+ while (Element)
+ {
+ if ((Element->Component & Component) &&
+ ((Module == NULL) || (0 == ACPI_STRCMP (Module, Element->Module))))
+ {
+ /* Ignore allocated objects that are in a cache */
+
+ Descriptor = ACPI_CAST_PTR (ACPI_DESCRIPTOR, &Element->UserSpace);
+ if (ACPI_GET_DESCRIPTOR_TYPE (Descriptor) != ACPI_DESC_TYPE_CACHED)
+ {
+ AcpiOsPrintf ("%p Len %04X %9.9s-%d [%s] ",
+ Descriptor, Element->Size, Element->Module,
+ Element->Line, AcpiUtGetDescriptorName (Descriptor));
+
+ /* Most of the elements will be Operand objects. */
+
+ switch (ACPI_GET_DESCRIPTOR_TYPE (Descriptor))
+ {
+ case ACPI_DESC_TYPE_OPERAND:
+ AcpiOsPrintf ("%12.12s R%hd",
+ AcpiUtGetTypeName (Descriptor->Object.Common.Type),
+ Descriptor->Object.Common.ReferenceCount);
+ break;
+
+ case ACPI_DESC_TYPE_PARSER:
+ AcpiOsPrintf ("AmlOpcode %04hX",
+ Descriptor->Op.Asl.AmlOpcode);
+ break;
+
+ case ACPI_DESC_TYPE_NAMED:
+ AcpiOsPrintf ("%4.4s",
+ AcpiUtGetNodeName (&Descriptor->Node));
+ break;
+
+ default:
+ break;
+ }
+
+ AcpiOsPrintf ( "\n");
+ NumOutstanding++;
+ }
+ }
+ Element = Element->Next;
+ }
+
+ (void) AcpiUtReleaseMutex (ACPI_MTX_MEMORY);
+
+ /* Print summary */
+
+ if (!NumOutstanding)
+ {
+ ACPI_INFO ((AE_INFO,
+ "No outstanding allocations"));
+ }
+ else
+ {
+ ACPI_ERROR ((AE_INFO,
+ "%d(%X) Outstanding allocations",
+ NumOutstanding, NumOutstanding));
+ }
+
+ return_VOID;
+}
+
+#endif /* ACPI_DBG_TRACK_ALLOCATIONS */
+
diff --git a/sys/contrib/dev/acpica/utxface.c b/sys/contrib/dev/acpica/utxface.c
new file mode 100644
index 0000000..83c420e
--- /dev/null
+++ b/sys/contrib/dev/acpica/utxface.c
@@ -0,0 +1,638 @@
+/******************************************************************************
+ *
+ * Module Name: utxface - External interfaces for "global" ACPI functions
+ * $Revision: 1.125 $
+ *
+ *****************************************************************************/
+
+/******************************************************************************
+ *
+ * 1. Copyright Notice
+ *
+ * Some or all of this work - Copyright (c) 1999 - 2007, Intel Corp.
+ * All rights reserved.
+ *
+ * 2. License
+ *
+ * 2.1. This is your license from Intel Corp. under its intellectual property
+ * rights. You may have additional license terms from the party that provided
+ * you this software, covering your right to use that party's intellectual
+ * property rights.
+ *
+ * 2.2. Intel grants, free of charge, to any person ("Licensee") obtaining a
+ * copy of the source code appearing in this file ("Covered Code") an
+ * irrevocable, perpetual, worldwide license under Intel's copyrights in the
+ * base code distributed originally by Intel ("Original Intel Code") to copy,
+ * make derivatives, distribute, use and display any portion of the Covered
+ * Code in any form, with the right to sublicense such rights; and
+ *
+ * 2.3. Intel grants Licensee a non-exclusive and non-transferable patent
+ * license (with the right to sublicense), under only those claims of Intel
+ * patents that are infringed by the Original Intel Code, to make, use, sell,
+ * offer to sell, and import the Covered Code and derivative works thereof
+ * solely to the minimum extent necessary to exercise the above copyright
+ * license, and in no event shall the patent license extend to any additions
+ * to or modifications of the Original Intel Code. No other license or right
+ * is granted directly or by implication, estoppel or otherwise;
+ *
+ * The above copyright and patent license is granted only if the following
+ * conditions are met:
+ *
+ * 3. Conditions
+ *
+ * 3.1. Redistribution of Source with Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification with rights to further distribute source must include
+ * the above Copyright Notice, the above License, this list of Conditions,
+ * and the following Disclaimer and Export Compliance provision. In addition,
+ * Licensee must cause all Covered Code to which Licensee contributes to
+ * contain a file documenting the changes Licensee made to create that Covered
+ * Code and the date of any change. Licensee must include in that file the
+ * documentation of any changes made by any predecessor Licensee. Licensee
+ * must include a prominent statement that the modification is derived,
+ * directly or indirectly, from Original Intel Code.
+ *
+ * 3.2. Redistribution of Source with no Rights to Further Distribute Source.
+ * Redistribution of source code of any substantial portion of the Covered
+ * Code or modification without rights to further distribute source must
+ * include the following Disclaimer and Export Compliance provision in the
+ * documentation and/or other materials provided with distribution. In
+ * addition, Licensee may not authorize further sublicense of source of any
+ * portion of the Covered Code, and must include terms to the effect that the
+ * license from Licensee to its licensee is limited to the intellectual
+ * property embodied in the software Licensee provides to its licensee, and
+ * not to intellectual property embodied in modifications its licensee may
+ * make.
+ *
+ * 3.3. Redistribution of Executable. Redistribution in executable form of any
+ * substantial portion of the Covered Code or modification must reproduce the
+ * above Copyright Notice, and the following Disclaimer and Export Compliance
+ * provision in the documentation and/or other materials provided with the
+ * distribution.
+ *
+ * 3.4. Intel retains all right, title, and interest in and to the Original
+ * Intel Code.
+ *
+ * 3.5. Neither the name Intel nor any other trademark owned or controlled by
+ * Intel shall be used in advertising or otherwise to promote the sale, use or
+ * other dealings in products derived from or relating to the Covered Code
+ * without prior written authorization from Intel.
+ *
+ * 4. Disclaimer and Export Compliance
+ *
+ * 4.1. INTEL MAKES NO WARRANTY OF ANY KIND REGARDING ANY SOFTWARE PROVIDED
+ * HERE. ANY SOFTWARE ORIGINATING FROM INTEL OR DERIVED FROM INTEL SOFTWARE
+ * IS PROVIDED "AS IS," AND INTEL WILL NOT PROVIDE ANY SUPPORT, ASSISTANCE,
+ * INSTALLATION, TRAINING OR OTHER SERVICES. INTEL WILL NOT PROVIDE ANY
+ * UPDATES, ENHANCEMENTS OR EXTENSIONS. INTEL SPECIFICALLY DISCLAIMS ANY
+ * IMPLIED WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT AND FITNESS FOR A
+ * PARTICULAR PURPOSE.
+ *
+ * 4.2. IN NO EVENT SHALL INTEL HAVE ANY LIABILITY TO LICENSEE, ITS LICENSEES
+ * OR ANY OTHER THIRD PARTY, FOR ANY LOST PROFITS, LOST DATA, LOSS OF USE OR
+ * COSTS OF PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES, OR FOR ANY INDIRECT,
+ * SPECIAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THIS AGREEMENT, UNDER ANY
+ * CAUSE OF ACTION OR THEORY OF LIABILITY, AND IRRESPECTIVE OF WHETHER INTEL
+ * HAS ADVANCE NOTICE OF THE POSSIBILITY OF SUCH DAMAGES. THESE LIMITATIONS
+ * SHALL APPLY NOTWITHSTANDING THE FAILURE OF THE ESSENTIAL PURPOSE OF ANY
+ * LIMITED REMEDY.
+ *
+ * 4.3. Licensee shall not export, either directly or indirectly, any of this
+ * software or system incorporating such software without first obtaining any
+ * required license or other approval from the U. S. Department of Commerce or
+ * any other agency or department of the United States Government. In the
+ * event Licensee exports any such software from the United States or
+ * re-exports any such software from a foreign destination, Licensee shall
+ * ensure that the distribution and export/re-export of the software is in
+ * compliance with all laws, regulations, orders, or other restrictions of the
+ * U.S. Export Administration Regulations. Licensee agrees that neither it nor
+ * any of its subsidiaries will export/re-export any technical data, process,
+ * software, or service, directly or indirectly, to any country for which the
+ * United States government or any agency thereof requires an export license,
+ * other governmental approval, or letter of assurance, without first obtaining
+ * such license, approval or letter.
+ *
+ *****************************************************************************/
+
+
+#define __UTXFACE_C__
+
+#include <contrib/dev/acpica/acpi.h>
+#include <contrib/dev/acpica/acevents.h>
+#include <contrib/dev/acpica/acnamesp.h>
+#include <contrib/dev/acpica/acdebug.h>
+
+#define _COMPONENT ACPI_UTILITIES
+ ACPI_MODULE_NAME ("utxface")
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiInitializeSubsystem
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Initializes all global variables. This is the first function
+ * called, so any early initialization belongs here.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiInitializeSubsystem (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiInitializeSubsystem);
+
+
+ AcpiGbl_StartupFlags = ACPI_SUBSYSTEM_INITIALIZE;
+ ACPI_DEBUG_EXEC (AcpiUtInitStackPtrTrace ());
+
+ /* Initialize the OS-Dependent layer */
+
+ Status = AcpiOsInitialize ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "During OSL initialization"));
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Initialize all globals used by the subsystem */
+
+ AcpiUtInitGlobals ();
+
+ /* Create the default mutex objects */
+
+ Status = AcpiUtMutexInitialize ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "During Global Mutex creation"));
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Initialize the namespace manager and
+ * the root of the namespace tree
+ */
+ Status = AcpiNsRootInitialize ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_EXCEPTION ((AE_INFO, Status, "During Namespace initialization"));
+ return_ACPI_STATUS (Status);
+ }
+
+ /* If configured, initialize the AML debugger */
+
+ ACPI_DEBUGGER_EXEC (Status = AcpiDbInitialize ());
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInitializeSubsystem)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiEnableSubsystem
+ *
+ * PARAMETERS: Flags - Init/enable Options
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Completes the subsystem initialization including hardware.
+ * Puts system into ACPI mode if it isn't already.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiEnableSubsystem (
+ UINT32 Flags)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (AcpiEnableSubsystem);
+
+
+ /* Enable ACPI mode */
+
+ if (!(Flags & ACPI_NO_ACPI_ENABLE))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC, "[Init] Going into ACPI mode\n"));
+
+ AcpiGbl_OriginalMode = AcpiHwGetMode();
+
+ Status = AcpiEnable ();
+ if (ACPI_FAILURE (Status))
+ {
+ ACPI_WARNING ((AE_INFO, "AcpiEnable failed"));
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * Install the default OpRegion handlers. These are installed unless
+ * other handlers have already been installed via the
+ * InstallAddressSpaceHandler interface.
+ */
+ if (!(Flags & ACPI_NO_ADDRESS_SPACE_INIT))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "[Init] Installing default address space handlers\n"));
+
+ Status = AcpiEvInstallRegionHandlers ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * Initialize ACPI Event handling (Fixed and General Purpose)
+ *
+ * Note1: We must have the hardware and events initialized before we can
+ * execute any control methods safely. Any control method can require
+ * ACPI hardware support, so the hardware must be fully initialized before
+ * any method execution!
+ *
+ * Note2: Fixed events are initialized and enabled here. GPEs are
+ * initialized, but cannot be enabled until after the hardware is
+ * completely initialized (SCI and GlobalLock activated)
+ */
+ if (!(Flags & ACPI_NO_EVENT_INIT))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "[Init] Initializing ACPI events\n"));
+
+ Status = AcpiEvInitializeEvents ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * Install the SCI handler and Global Lock handler. This completes the
+ * hardware initialization.
+ */
+ if (!(Flags & ACPI_NO_HANDLER_INIT))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "[Init] Installing SCI/GL handlers\n"));
+
+ Status = AcpiEvInstallXruptHandlers ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * Complete the GPE initialization for the GPE blocks defined in the FADT
+ * (GPE block 0 and 1).
+ *
+ * Note1: This is where the _PRW methods are executed for the GPEs. These
+ * methods can only be executed after the SCI and Global Lock handlers are
+ * installed and initialized.
+ *
+ * Note2: Currently, there seems to be no need to run the _REG methods
+ * before execution of the _PRW methods and enabling of the GPEs.
+ */
+ if (!(Flags & ACPI_NO_EVENT_INIT))
+ {
+ Status = AcpiEvInstallFadtGpes ();
+ if (ACPI_FAILURE (Status))
+ {
+ return (Status);
+ }
+ }
+
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiEnableSubsystem)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiInitializeObjects
+ *
+ * PARAMETERS: Flags - Init/enable Options
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Completes namespace initialization by initializing device
+ * objects and executing AML code for Regions, buffers, etc.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiInitializeObjects (
+ UINT32 Flags)
+{
+ ACPI_STATUS Status = AE_OK;
+
+
+ ACPI_FUNCTION_TRACE (AcpiInitializeObjects);
+
+
+ /*
+ * Run all _REG methods
+ *
+ * Note: Any objects accessed by the _REG methods will be automatically
+ * initialized, even if they contain executable AML (see the call to
+ * AcpiNsInitializeObjects below).
+ */
+ if (!(Flags & ACPI_NO_ADDRESS_SPACE_INIT))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "[Init] Executing _REG OpRegion methods\n"));
+
+ Status = AcpiEvInitializeOpRegions ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * Initialize the objects that remain uninitialized. This runs the
+ * executable AML that may be part of the declaration of these objects:
+ * OperationRegions, BufferFields, Buffers, and Packages.
+ */
+ if (!(Flags & ACPI_NO_OBJECT_INIT))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "[Init] Completing Initialization of ACPI Objects\n"));
+
+ Status = AcpiNsInitializeObjects ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * Initialize all device objects in the namespace. This runs the device
+ * _STA and _INI methods.
+ */
+ if (!(Flags & ACPI_NO_DEVICE_INIT))
+ {
+ ACPI_DEBUG_PRINT ((ACPI_DB_EXEC,
+ "[Init] Initializing ACPI Devices\n"));
+
+ Status = AcpiNsInitializeDevices ();
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+ }
+
+ /*
+ * Empty the caches (delete the cached objects) on the assumption that
+ * the table load filled them up more than they will be at runtime --
+ * thus wasting non-paged memory.
+ */
+ Status = AcpiPurgeCachedObjects ();
+
+ AcpiGbl_StartupFlags |= ACPI_INITIALIZED_OK;
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInitializeObjects)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiTerminate
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Shutdown the ACPI subsystem. Release all resources.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiTerminate (
+ void)
+{
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiTerminate);
+
+
+ /* Terminate the AML Debugger if present */
+
+ ACPI_DEBUGGER_EXEC(AcpiGbl_DbTerminateThreads = TRUE);
+
+ /* Shutdown and free all resources */
+
+ AcpiUtSubsystemShutdown ();
+
+
+ /* Free the mutex objects */
+
+ AcpiUtMutexTerminate ();
+
+
+#ifdef ACPI_DEBUGGER
+
+ /* Shut down the debugger */
+
+ AcpiDbTerminate ();
+#endif
+
+ /* Now we can shutdown the OS-dependent layer */
+
+ Status = AcpiOsTerminate ();
+ return_ACPI_STATUS (Status);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiTerminate)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiSubsystemStatus
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status of the ACPI subsystem
+ *
+ * DESCRIPTION: Other drivers that use the ACPI subsystem should call this
+ * before making any other calls, to ensure the subsystem
+ * initialized successfully.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiSubsystemStatus (
+ void)
+{
+
+ if (AcpiGbl_StartupFlags & ACPI_INITIALIZED_OK)
+ {
+ return (AE_OK);
+ }
+ else
+ {
+ return (AE_ERROR);
+ }
+}
+
+ACPI_EXPORT_SYMBOL (AcpiSubsystemStatus)
+
+
+/*******************************************************************************
+ *
+ * FUNCTION: AcpiGetSystemInfo
+ *
+ * PARAMETERS: OutBuffer - A buffer to receive the resources for the
+ * device
+ *
+ * RETURN: Status - the status of the call
+ *
+ * DESCRIPTION: This function is called to get information about the current
+ * state of the ACPI subsystem. It will return system information
+ * in the OutBuffer.
+ *
+ * If the function fails an appropriate status will be returned
+ * and the value of OutBuffer is undefined.
+ *
+ ******************************************************************************/
+
+ACPI_STATUS
+AcpiGetSystemInfo (
+ ACPI_BUFFER *OutBuffer)
+{
+ ACPI_SYSTEM_INFO *InfoPtr;
+ ACPI_STATUS Status;
+
+
+ ACPI_FUNCTION_TRACE (AcpiGetSystemInfo);
+
+
+ /* Parameter validation */
+
+ Status = AcpiUtValidateBuffer (OutBuffer);
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /* Validate/Allocate/Clear caller buffer */
+
+ Status = AcpiUtInitializeBuffer (OutBuffer, sizeof (ACPI_SYSTEM_INFO));
+ if (ACPI_FAILURE (Status))
+ {
+ return_ACPI_STATUS (Status);
+ }
+
+ /*
+ * Populate the return buffer
+ */
+ InfoPtr = (ACPI_SYSTEM_INFO *) OutBuffer->Pointer;
+
+ InfoPtr->AcpiCaVersion = ACPI_CA_VERSION;
+
+ /* System flags (ACPI capabilities) */
+
+ InfoPtr->Flags = ACPI_SYS_MODE_ACPI;
+
+ /* Timer resolution - 24 or 32 bits */
+
+ if (AcpiGbl_FADT.Flags & ACPI_FADT_32BIT_TIMER)
+ {
+ InfoPtr->TimerResolution = 24;
+ }
+ else
+ {
+ InfoPtr->TimerResolution = 32;
+ }
+
+ /* Clear the reserved fields */
+
+ InfoPtr->Reserved1 = 0;
+ InfoPtr->Reserved2 = 0;
+
+ /* Current debug levels */
+
+ InfoPtr->DebugLayer = AcpiDbgLayer;
+ InfoPtr->DebugLevel = AcpiDbgLevel;
+
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiGetSystemInfo)
+
+
+/*****************************************************************************
+ *
+ * FUNCTION: AcpiInstallInitializationHandler
+ *
+ * PARAMETERS: Handler - Callback procedure
+ * Function - Not (currently) used, see below
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Install an initialization handler
+ *
+ * TBD: When a second function is added, must save the Function also.
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+AcpiInstallInitializationHandler (
+ ACPI_INIT_HANDLER Handler,
+ UINT32 Function)
+{
+
+ if (!Handler)
+ {
+ return (AE_BAD_PARAMETER);
+ }
+
+ if (AcpiGbl_InitHandler)
+ {
+ return (AE_ALREADY_EXISTS);
+ }
+
+ AcpiGbl_InitHandler = Handler;
+ return AE_OK;
+}
+
+ACPI_EXPORT_SYMBOL (AcpiInstallInitializationHandler)
+
+
+/*****************************************************************************
+ *
+ * FUNCTION: AcpiPurgeCachedObjects
+ *
+ * PARAMETERS: None
+ *
+ * RETURN: Status
+ *
+ * DESCRIPTION: Empty all caches (delete the cached objects)
+ *
+ ****************************************************************************/
+
+ACPI_STATUS
+AcpiPurgeCachedObjects (
+ void)
+{
+ ACPI_FUNCTION_TRACE (AcpiPurgeCachedObjects);
+
+ (void) AcpiOsPurgeCache (AcpiGbl_StateCache);
+ (void) AcpiOsPurgeCache (AcpiGbl_OperandCache);
+ (void) AcpiOsPurgeCache (AcpiGbl_PsNodeCache);
+ (void) AcpiOsPurgeCache (AcpiGbl_PsNodeExtCache);
+ return_ACPI_STATUS (AE_OK);
+}
+
+ACPI_EXPORT_SYMBOL (AcpiPurgeCachedObjects)
diff --git a/sys/contrib/dev/ath/COPYRIGHT b/sys/contrib/dev/ath/COPYRIGHT
new file mode 100644
index 0000000..3e2752f
--- /dev/null
+++ b/sys/contrib/dev/ath/COPYRIGHT
@@ -0,0 +1,42 @@
+All files contained in this distribution are covered by the following
+copyright unless explicitly identified otherwise. Note that this
+copyright does _NOT_ contain a "or GPL" clause and does _NOT_ permit
+redistribution with changes.
+
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/COPYRIGHT#1 $
+ */
diff --git a/sys/contrib/dev/ath/README b/sys/contrib/dev/ath/README
new file mode 100644
index 0000000..5d3b7f5
--- /dev/null
+++ b/sys/contrib/dev/ath/README
@@ -0,0 +1,73 @@
+$Id: //depot/sw/branches/sam_hal/README#2 $
+
+
+Atheros Hardware Access Layer (HAL)
+===================================
+
+* Copyright (c) 2002-2006 Sam Leffler.
+* Copyright (c) 2002-2006 Atheros Communications, Inc.
+* All rights reserved.
+
+Read the file COPYRIGHT for the complete copyright.
+
+This code manages much of the chip-specific operation of the Atheros
+driver. The HAL is provided in a binary-only form in order to
+comply with local regulatory agency rules. In the United States
+the FCC requires that a radio transmitter only be operated at power
+levels and on frequency channels for which it is approved. The FCC
+requires that a software-defined radio cannot be configured by a
+user to operate outside the approved power levels and frequency
+channels. This makes it difficult to open-source code that enforces
+limits on the power levels, frequency channels and other parameters
+of the radio transmitter. See
+
+http://ftp.fcc.gov/Bureaus/Engineering_Technology/Orders/2001/fcc01264.pdf
+
+for the specific FCC regulation. Because the module is provided
+in a binary-only form it is marked "Proprietary" on Linux; this
+means when you load it you will see messages that your system is
+now "tainted".
+
+If you wish to use this driver on a platform for which an ath_hal
+module is not already provided please contact the author. Note that
+this is only necessary for new _architectures_; the HAL is not tied to
+any specific version of your operating system.
+
+
+Atheros Hardware
+================
+There are many generations of Atheros 802.11 wireless devices that
+are typically referred to by their programming model:
+
+5210 supports 11a only
+5211 supports both 11a and 11b
+5212 supports 11a, 11b, and 11g
+
+These parts have been incorporated in a variety of retail products
+including cardbus cards and mini-pci cards. In addition many laptop
+vendors use Atheros mini-pci cards for their builtin wireless
+support.
+
+The Atheors PCI vendor id is 0x168c. The file ah_devid.h lists most
+known PCI device id's but is not exhaustive. Some vendors program
+their own vendor and/or device id's to aid in BIOS-locking mini-pci
+cards in laptops.
+
+Atheros SoC Hardware
+====================
+In addition to the cardbus/pci devices Atheros makes System on Chip
+(SoC) parts that integrate a MIPS cpu core and one or more MAC and
+radio parts. Binary support for these parts is necessarily built
+for the embedded MIPS processor where the code is to be run.
+
+Caveats
+=======
+The binary hal builds provided here include no floating point and
+are operating system-independent. However due to toolchain
+peculiarities the .o files may be wrongly rejected by development
+tools. If that happens it may be possible to patch the file header
+so that the native toolchain will accept the files. In particular
+this has been observed for various Linux MIPS installations for the
+SoC parts. If you have issues consult the associated .inc file in
+the public directory; it explains exactly how the binary file was
+created (e.g. toolchain and compilation options).
diff --git a/sys/contrib/dev/ath/ah.h b/sys/contrib/dev/ath/ah.h
new file mode 100644
index 0000000..411acbe
--- /dev/null
+++ b/sys/contrib/dev/ath/ah.h
@@ -0,0 +1,879 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/ah.h#19 $
+ */
+
+#ifndef _ATH_AH_H_
+#define _ATH_AH_H_
+/*
+ * Atheros Hardware Access Layer
+ *
+ * Clients of the HAL call ath_hal_attach to obtain a reference to an ath_hal
+ * structure for use with the device. Hardware-related operations that
+ * follow must call back into the HAL through interface, supplying the
+ * reference as the first parameter.
+ */
+
+/*
+ * Bus i/o type definitions. We define a platform-independent
+ * set of types that are mapped to platform-dependent data for
+ * register read/write operations. We use types that are large
+ * enough to hold a pointer; smaller data should fit and only
+ * require type coercion to work. Larger data can be stored
+ * elsewhere and a reference passed for the bus tag and/or handle.
+ */
+typedef void* HAL_SOFTC; /* pointer to driver/OS state */
+typedef void* HAL_BUS_TAG; /* opaque bus i/o id tag */
+typedef void* HAL_BUS_HANDLE; /* opaque bus i/o handle */
+
+#include "ah_osdep.h"
+
+/*
+ * __ahdecl is analogous to _cdecl; it defines the calling
+ * convention used within the HAL. For most systems this
+ * can just default to be empty and the compiler will (should)
+ * use _cdecl. For systems where _cdecl is not compatible this
+ * must be defined. See linux/ah_osdep.h for an example.
+ */
+#ifndef __ahdecl
+#define __ahdecl
+#endif
+
+/*
+ * Status codes that may be returned by the HAL. Note that
+ * interfaces that return a status code set it only when an
+ * error occurs--i.e. you cannot check it for success.
+ */
+typedef enum {
+ HAL_OK = 0, /* No error */
+ HAL_ENXIO = 1, /* No hardware present */
+ HAL_ENOMEM = 2, /* Memory allocation failed */
+ HAL_EIO = 3, /* Hardware didn't respond as expected */
+ HAL_EEMAGIC = 4, /* EEPROM magic number invalid */
+ HAL_EEVERSION = 5, /* EEPROM version invalid */
+ HAL_EELOCKED = 6, /* EEPROM unreadable */
+ HAL_EEBADSUM = 7, /* EEPROM checksum invalid */
+ HAL_EEREAD = 8, /* EEPROM read problem */
+ HAL_EEBADMAC = 9, /* EEPROM mac address invalid */
+ HAL_EESIZE = 10, /* EEPROM size not supported */
+ HAL_EEWRITE = 11, /* Attempt to change write-locked EEPROM */
+ HAL_EINVAL = 12, /* Invalid parameter to function */
+ HAL_ENOTSUPP = 13, /* Hardware revision not supported */
+ HAL_ESELFTEST = 14, /* Hardware self-test failed */
+ HAL_EINPROGRESS = 15, /* Operation incomplete */
+} HAL_STATUS;
+
+typedef enum {
+ AH_FALSE = 0, /* NB: lots of code assumes false is zero */
+ AH_TRUE = 1,
+} HAL_BOOL;
+
+typedef enum {
+ HAL_CAP_REG_DMN = 0, /* current regulatory domain */
+ HAL_CAP_CIPHER = 1, /* hardware supports cipher */
+ HAL_CAP_TKIP_MIC = 2, /* handle TKIP MIC in hardware */
+ HAL_CAP_TKIP_SPLIT = 3, /* hardware TKIP uses split keys */
+ HAL_CAP_PHYCOUNTERS = 4, /* hardware PHY error counters */
+ HAL_CAP_DIVERSITY = 5, /* hardware supports fast diversity */
+ HAL_CAP_KEYCACHE_SIZE = 6, /* number of entries in key cache */
+ HAL_CAP_NUM_TXQUEUES = 7, /* number of hardware xmit queues */
+ HAL_CAP_VEOL = 9, /* hardware supports virtual EOL */
+ HAL_CAP_PSPOLL = 10, /* hardware has working PS-Poll support */
+ HAL_CAP_DIAG = 11, /* hardware diagnostic support */
+ HAL_CAP_COMPRESSION = 12, /* hardware supports compression */
+ HAL_CAP_BURST = 13, /* hardware supports packet bursting */
+ HAL_CAP_FASTFRAME = 14, /* hardware supoprts fast frames */
+ HAL_CAP_TXPOW = 15, /* global tx power limit */
+ HAL_CAP_TPC = 16, /* per-packet tx power control */
+ HAL_CAP_PHYDIAG = 17, /* hardware phy error diagnostic */
+ HAL_CAP_BSSIDMASK = 18, /* hardware supports bssid mask */
+ HAL_CAP_MCAST_KEYSRCH = 19, /* hardware has multicast key search */
+ HAL_CAP_TSF_ADJUST = 20, /* hardware has beacon tsf adjust */
+ HAL_CAP_XR = 21, /* hardware has XR support */
+ HAL_CAP_WME_TKIPMIC = 22, /* hardware can support TKIP MIC when WMM is turned on */
+ HAL_CAP_CHAN_HALFRATE = 23, /* hardware can support half rate channels */
+ HAL_CAP_CHAN_QUARTERRATE = 24, /* hardware can support quarter rate channels */
+ HAL_CAP_RFSILENT = 25, /* hardware has rfsilent support */
+ HAL_CAP_TPC_ACK = 26, /* ack txpower with per-packet tpc */
+ HAL_CAP_TPC_CTS = 27, /* cts txpower with per-packet tpc */
+ HAL_CAP_11D = 28, /* 11d beacon support for changing cc */
+ HAL_CAP_INTMIT = 29, /* interference mitigation */
+ HAL_CAP_RXORN_FATAL = 30, /* HAL_INT_RXORN treated as fatal */
+ HAL_CAP_RXTSTAMP_PREC = 34, /* rx desc tstamp precision (bits) */
+} HAL_CAPABILITY_TYPE;
+
+/*
+ * "States" for setting the LED. These correspond to
+ * the possible 802.11 operational states and there may
+ * be a many-to-one mapping between these states and the
+ * actual hardware state for the LED's (i.e. the hardware
+ * may have fewer states).
+ */
+typedef enum {
+ HAL_LED_INIT = 0,
+ HAL_LED_SCAN = 1,
+ HAL_LED_AUTH = 2,
+ HAL_LED_ASSOC = 3,
+ HAL_LED_RUN = 4
+} HAL_LED_STATE;
+
+/*
+ * Transmit queue types/numbers. These are used to tag
+ * each transmit queue in the hardware and to identify a set
+ * of transmit queues for operations such as start/stop dma.
+ */
+typedef enum {
+ HAL_TX_QUEUE_INACTIVE = 0, /* queue is inactive/unused */
+ HAL_TX_QUEUE_DATA = 1, /* data xmit q's */
+ HAL_TX_QUEUE_BEACON = 2, /* beacon xmit q */
+ HAL_TX_QUEUE_CAB = 3, /* "crap after beacon" xmit q */
+ HAL_TX_QUEUE_UAPSD = 4, /* u-apsd power save xmit q */
+} HAL_TX_QUEUE;
+
+#define HAL_NUM_TX_QUEUES 10 /* max possible # of queues */
+
+/*
+ * Transmit queue subtype. These map directly to
+ * WME Access Categories (except for UPSD). Refer
+ * to Table 5 of the WME spec.
+ */
+typedef enum {
+ HAL_WME_AC_BK = 0, /* background access category */
+ HAL_WME_AC_BE = 1, /* best effort access category*/
+ HAL_WME_AC_VI = 2, /* video access category */
+ HAL_WME_AC_VO = 3, /* voice access category */
+ HAL_WME_UPSD = 4, /* uplink power save */
+ HAL_XR_DATA = 5, /* uplink power save */
+} HAL_TX_QUEUE_SUBTYPE;
+
+/*
+ * Transmit queue flags that control various
+ * operational parameters.
+ */
+typedef enum {
+ /*
+ * Per queue interrupt enables. When set the associated
+ * interrupt may be delivered for packets sent through
+ * the queue. Without these enabled no interrupts will
+ * be delivered for transmits through the queue.
+ */
+ HAL_TXQ_TXOKINT_ENABLE = 0x0001, /* enable TXOK interrupt */
+ HAL_TXQ_TXERRINT_ENABLE = 0x0001, /* enable TXERR interrupt */
+ HAL_TXQ_TXDESCINT_ENABLE = 0x0002, /* enable TXDESC interrupt */
+ HAL_TXQ_TXEOLINT_ENABLE = 0x0004, /* enable TXEOL interrupt */
+ HAL_TXQ_TXURNINT_ENABLE = 0x0008, /* enable TXURN interrupt */
+ /*
+ * Enable hardware compression for packets sent through
+ * the queue. The compression buffer must be setup and
+ * packets must have a key entry marked in the tx descriptor.
+ */
+ HAL_TXQ_COMPRESSION_ENABLE = 0x0010, /* enable h/w compression */
+ /*
+ * Disable queue when veol is hit or ready time expires.
+ * By default the queue is disabled only on reaching the
+ * physical end of queue (i.e. a null link ptr in the
+ * descriptor chain).
+ */
+ HAL_TXQ_RDYTIME_EXP_POLICY_ENABLE = 0x0020,
+ /*
+ * Schedule frames on delivery of a DBA (DMA Beacon Alert)
+ * event. Frames will be transmitted only when this timer
+ * fires, e.g to transmit a beacon in ap or adhoc modes.
+ */
+ HAL_TXQ_DBA_GATED = 0x0040, /* schedule based on DBA */
+ /*
+ * Each transmit queue has a counter that is incremented
+ * each time the queue is enabled and decremented when
+ * the list of frames to transmit is traversed (or when
+ * the ready time for the queue expires). This counter
+ * must be non-zero for frames to be scheduled for
+ * transmission. The following controls disable bumping
+ * this counter under certain conditions. Typically this
+ * is used to gate frames based on the contents of another
+ * queue (e.g. CAB traffic may only follow a beacon frame).
+ * These are meaningful only when frames are scheduled
+ * with a non-ASAP policy (e.g. DBA-gated).
+ */
+ HAL_TXQ_CBR_DIS_QEMPTY = 0x0080, /* disable on this q empty */
+ HAL_TXQ_CBR_DIS_BEMPTY = 0x0100, /* disable on beacon q empty */
+
+ /*
+ * Fragment burst backoff policy. Normally the no backoff
+ * is done after a successful transmission, the next fragment
+ * is sent at SIFS. If this flag is set backoff is done
+ * after each fragment, regardless whether it was ack'd or
+ * not, after the backoff count reaches zero a normal channel
+ * access procedure is done before the next transmit (i.e.
+ * wait AIFS instead of SIFS).
+ */
+ HAL_TXQ_FRAG_BURST_BACKOFF_ENABLE = 0x00800000,
+ /*
+ * Disable post-tx backoff following each frame.
+ */
+ HAL_TXQ_BACKOFF_DISABLE = 0x00010000, /* disable post backoff */
+ /*
+ * DCU arbiter lockout control. This controls how
+ * lower priority tx queues are handled with respect to
+ * to a specific queue when multiple queues have frames
+ * to send. No lockout means lower priority queues arbitrate
+ * concurrently with this queue. Intra-frame lockout
+ * means lower priority queues are locked out until the
+ * current frame transmits (e.g. including backoffs and bursting).
+ * Global lockout means nothing lower can arbitrary so
+ * long as there is traffic activity on this queue (frames,
+ * backoff, etc).
+ */
+ HAL_TXQ_ARB_LOCKOUT_INTRA = 0x00020000, /* intra-frame lockout */
+ HAL_TXQ_ARB_LOCKOUT_GLOBAL = 0x00040000, /* full lockout s */
+
+ HAL_TXQ_IGNORE_VIRTCOL = 0x00080000, /* ignore virt collisions */
+ HAL_TXQ_SEQNUM_INC_DIS = 0x00100000, /* disable seqnum increment */
+} HAL_TX_QUEUE_FLAGS;
+
+typedef struct {
+ u_int32_t tqi_ver; /* hal TXQ version */
+ HAL_TX_QUEUE_SUBTYPE tqi_subtype; /* subtype if applicable */
+ HAL_TX_QUEUE_FLAGS tqi_qflags; /* flags (see above) */
+ u_int32_t tqi_priority; /* (not used) */
+ u_int32_t tqi_aifs; /* aifs */
+ u_int32_t tqi_cwmin; /* cwMin */
+ u_int32_t tqi_cwmax; /* cwMax */
+ u_int16_t tqi_shretry; /* rts retry limit */
+ u_int16_t tqi_lgretry; /* long retry limit (not used)*/
+ u_int32_t tqi_cbrPeriod; /* CBR period (us) */
+ u_int32_t tqi_cbrOverflowLimit; /* threshold for CBROVF int */
+ u_int32_t tqi_burstTime; /* max burst duration (us) */
+ u_int32_t tqi_readyTime; /* frame schedule time (us) */
+ u_int32_t tqi_compBuf; /* comp buffer phys addr */
+} HAL_TXQ_INFO;
+
+#define HAL_TQI_NONVAL 0xffff
+
+/* token to use for aifs, cwmin, cwmax */
+#define HAL_TXQ_USEDEFAULT ((u_int32_t) -1)
+
+/* compression definitions */
+#define HAL_COMP_BUF_MAX_SIZE 9216 /* 9K */
+#define HAL_COMP_BUF_ALIGN_SIZE 512
+
+/*
+ * Transmit packet types. This belongs in ah_desc.h, but
+ * is here so we can give a proper type to various parameters
+ * (and not require everyone include the file).
+ *
+ * NB: These values are intentionally assigned for
+ * direct use when setting up h/w descriptors.
+ */
+typedef enum {
+ HAL_PKT_TYPE_NORMAL = 0,
+ HAL_PKT_TYPE_ATIM = 1,
+ HAL_PKT_TYPE_PSPOLL = 2,
+ HAL_PKT_TYPE_BEACON = 3,
+ HAL_PKT_TYPE_PROBE_RESP = 4,
+ HAL_PKT_TYPE_CHIRP = 5,
+ HAL_PKT_TYPE_GRP_POLL = 6,
+} HAL_PKT_TYPE;
+
+/* Rx Filter Frame Types */
+typedef enum {
+ HAL_RX_FILTER_UCAST = 0x00000001, /* Allow unicast frames */
+ HAL_RX_FILTER_MCAST = 0x00000002, /* Allow multicast frames */
+ HAL_RX_FILTER_BCAST = 0x00000004, /* Allow broadcast frames */
+ HAL_RX_FILTER_CONTROL = 0x00000008, /* Allow control frames */
+ HAL_RX_FILTER_BEACON = 0x00000010, /* Allow beacon frames */
+ HAL_RX_FILTER_PROM = 0x00000020, /* Promiscuous mode */
+ HAL_RX_FILTER_XRPOLL = 0x00000040, /* Allow XR poll frmae */
+ HAL_RX_FILTER_PROBEREQ = 0x00000080, /* Allow probe request frames */
+ HAL_RX_FILTER_PHYERR = 0x00000100, /* Allow phy errors */
+ HAL_RX_FILTER_PHYRADAR = 0x00000200, /* Allow phy radar errors*/
+} HAL_RX_FILTER;
+
+typedef enum {
+ HAL_PM_AWAKE = 0,
+ HAL_PM_FULL_SLEEP = 1,
+ HAL_PM_NETWORK_SLEEP = 2,
+ HAL_PM_UNDEFINED = 3
+} HAL_POWER_MODE;
+
+/*
+ * NOTE WELL:
+ * These are mapped to take advantage of the common locations for many of
+ * the bits on all of the currently supported MAC chips. This is to make
+ * the ISR as efficient as possible, while still abstracting HW differences.
+ * When new hardware breaks this commonality this enumerated type, as well
+ * as the HAL functions using it, must be modified. All values are directly
+ * mapped unless commented otherwise.
+ */
+typedef enum {
+ HAL_INT_RX = 0x00000001, /* Non-common mapping */
+ HAL_INT_RXDESC = 0x00000002,
+ HAL_INT_RXNOFRM = 0x00000008,
+ HAL_INT_RXEOL = 0x00000010,
+ HAL_INT_RXORN = 0x00000020,
+ HAL_INT_TX = 0x00000040, /* Non-common mapping */
+ HAL_INT_TXDESC = 0x00000080,
+ HAL_INT_TXURN = 0x00000800,
+ HAL_INT_MIB = 0x00001000,
+ HAL_INT_RXPHY = 0x00004000,
+ HAL_INT_RXKCM = 0x00008000,
+ HAL_INT_SWBA = 0x00010000,
+ HAL_INT_BMISS = 0x00040000,
+ HAL_INT_BNR = 0x00100000, /* Non-common mapping */
+ HAL_INT_TIM = 0x00200000, /* Non-common mapping */
+ HAL_INT_DTIM = 0x00400000, /* Non-common mapping */
+ HAL_INT_DTIMSYNC= 0x00800000, /* Non-common mapping */
+ HAL_INT_GPIO = 0x01000000,
+ HAL_INT_CABEND = 0x02000000, /* Non-common mapping */
+ HAL_INT_FATAL = 0x40000000, /* Non-common mapping */
+#define HAL_INT_GLOBAL 0x80000000 /* Set/clear IER */
+ HAL_INT_BMISC = HAL_INT_TIM
+ | HAL_INT_DTIM
+ | HAL_INT_DTIMSYNC
+ | HAL_INT_CABEND,
+
+ /* Interrupt bits that map directly to ISR/IMR bits */
+ HAL_INT_COMMON = HAL_INT_RXNOFRM
+ | HAL_INT_RXDESC
+ | HAL_INT_RXEOL
+ | HAL_INT_RXORN
+ | HAL_INT_TXURN
+ | HAL_INT_TXDESC
+ | HAL_INT_MIB
+ | HAL_INT_RXPHY
+ | HAL_INT_RXKCM
+ | HAL_INT_SWBA
+ | HAL_INT_BMISS
+ | HAL_INT_GPIO,
+} HAL_INT;
+
+typedef enum {
+ HAL_RFGAIN_INACTIVE = 0,
+ HAL_RFGAIN_READ_REQUESTED = 1,
+ HAL_RFGAIN_NEED_CHANGE = 2
+} HAL_RFGAIN;
+
+/*
+ * Channels are specified by frequency.
+ */
+typedef struct {
+ u_int16_t channel; /* setting in Mhz */
+ u_int16_t channelFlags; /* see below */
+ u_int8_t privFlags;
+ int8_t maxRegTxPower; /* max regulatory tx power in dBm */
+ int8_t maxTxPower; /* max true tx power in 0.5 dBm */
+ int8_t minTxPower; /* min true tx power in 0.5 dBm */
+} HAL_CHANNEL;
+
+/* channelFlags */
+#define CHANNEL_CW_INT 0x0002 /* CW interference detected on channel */
+#define CHANNEL_TURBO 0x0010 /* Turbo Channel */
+#define CHANNEL_CCK 0x0020 /* CCK channel */
+#define CHANNEL_OFDM 0x0040 /* OFDM channel */
+#define CHANNEL_2GHZ 0x0080 /* 2 GHz spectrum channel. */
+#define CHANNEL_5GHZ 0x0100 /* 5 GHz spectrum channel */
+#define CHANNEL_PASSIVE 0x0200 /* Only passive scan allowed in the channel */
+#define CHANNEL_DYN 0x0400 /* dynamic CCK-OFDM channel */
+#define CHANNEL_XR 0x0800 /* XR channel */
+#define CHANNEL_STURBO 0x2000 /* Static turbo, no 11a-only usage */
+#define CHANNEL_HALF 0x4000 /* Half rate channel */
+#define CHANNEL_QUARTER 0x8000 /* Quarter rate channel */
+
+/* privFlags */
+#define CHANNEL_INTERFERENCE 0x01 /* Software use: channel interference
+ used for as AR as well as RADAR
+ interference detection */
+#define CHANNEL_DFS 0x02 /* DFS required on channel */
+#define CHANNEL_4MS_LIMIT 0x04 /* 4msec packet limit on this channel */
+#define CHANNEL_DFS_CLEAR 0x08 /* if channel has been checked for DFS */
+
+#define CHANNEL_A (CHANNEL_5GHZ|CHANNEL_OFDM)
+#define CHANNEL_B (CHANNEL_2GHZ|CHANNEL_CCK)
+#define CHANNEL_PUREG (CHANNEL_2GHZ|CHANNEL_OFDM)
+#ifdef notdef
+#define CHANNEL_G (CHANNEL_2GHZ|CHANNEL_DYN)
+#else
+#define CHANNEL_G (CHANNEL_2GHZ|CHANNEL_OFDM)
+#endif
+#define CHANNEL_T (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
+#define CHANNEL_ST (CHANNEL_T|CHANNEL_STURBO)
+#define CHANNEL_108G (CHANNEL_2GHZ|CHANNEL_OFDM|CHANNEL_TURBO)
+#define CHANNEL_108A CHANNEL_T
+#define CHANNEL_X (CHANNEL_5GHZ|CHANNEL_OFDM|CHANNEL_XR)
+#define CHANNEL_ALL \
+ (CHANNEL_OFDM|CHANNEL_CCK| CHANNEL_2GHZ | CHANNEL_5GHZ | CHANNEL_TURBO)
+#define CHANNEL_ALL_NOTURBO (CHANNEL_ALL &~ CHANNEL_TURBO)
+
+#define HAL_ANTENNA_MIN_MODE 0
+#define HAL_ANTENNA_FIXED_A 1
+#define HAL_ANTENNA_FIXED_B 2
+#define HAL_ANTENNA_MAX_MODE 3
+
+typedef struct {
+ u_int32_t ackrcv_bad;
+ u_int32_t rts_bad;
+ u_int32_t rts_good;
+ u_int32_t fcs_bad;
+ u_int32_t beacons;
+} HAL_MIB_STATS;
+
+typedef u_int16_t HAL_CTRY_CODE; /* country code */
+typedef u_int16_t HAL_REG_DOMAIN; /* regulatory domain code */
+
+enum {
+ CTRY_DEBUG = 0x1ff, /* debug country code */
+ CTRY_DEFAULT = 0 /* default country code */
+};
+
+enum {
+ HAL_MODE_11A = 0x001, /* 11a channels */
+ HAL_MODE_TURBO = 0x002, /* 11a turbo-only channels */
+ HAL_MODE_11B = 0x004, /* 11b channels */
+ HAL_MODE_PUREG = 0x008, /* 11g channels (OFDM only) */
+#ifdef notdef
+ HAL_MODE_11G = 0x010, /* 11g channels (OFDM/CCK) */
+#else
+ HAL_MODE_11G = 0x008, /* XXX historical */
+#endif
+ HAL_MODE_108G = 0x020, /* 11a+Turbo channels */
+ HAL_MODE_108A = 0x040, /* 11g+Turbo channels */
+ HAL_MODE_XR = 0x100, /* XR channels */
+ HAL_MODE_11A_HALF_RATE = 0x200, /* 11A half rate channels */
+ HAL_MODE_11A_QUARTER_RATE = 0x400, /* 11A quarter rate channels */
+ HAL_MODE_ALL = 0xfff
+};
+
+typedef struct {
+ int rateCount; /* NB: for proper padding */
+ u_int8_t rateCodeToIndex[32]; /* back mapping */
+ struct {
+ u_int8_t valid; /* valid for rate control use */
+ u_int8_t phy; /* CCK/OFDM/XR */
+ u_int16_t rateKbps; /* transfer rate in kbs */
+ u_int8_t rateCode; /* rate for h/w descriptors */
+ u_int8_t shortPreamble; /* mask for enabling short
+ * preamble in CCK rate code */
+ u_int8_t dot11Rate; /* value for supported rates
+ * info element of MLME */
+ u_int8_t controlRate; /* index of next lower basic
+ * rate; used for dur. calcs */
+ u_int16_t lpAckDuration; /* long preamble ACK duration */
+ u_int16_t spAckDuration; /* short preamble ACK duration*/
+ } info[32];
+} HAL_RATE_TABLE;
+
+typedef struct {
+ u_int rs_count; /* number of valid entries */
+ u_int8_t rs_rates[32]; /* rates */
+} HAL_RATE_SET;
+
+/*
+ * Antenna switch control. By default antenna selection
+ * enables multiple (2) antenna use. To force use of the
+ * A or B antenna only specify a fixed setting. Fixing
+ * the antenna will also disable any diversity support.
+ */
+typedef enum {
+ HAL_ANT_VARIABLE = 0, /* variable by programming */
+ HAL_ANT_FIXED_A = 1, /* fixed antenna A */
+ HAL_ANT_FIXED_B = 2, /* fixed antenna B */
+} HAL_ANT_SETTING;
+
+typedef enum {
+ HAL_M_STA = 1, /* infrastructure station */
+ HAL_M_IBSS = 0, /* IBSS (adhoc) station */
+ HAL_M_HOSTAP = 6, /* Software Access Point */
+ HAL_M_MONITOR = 8 /* Monitor mode */
+} HAL_OPMODE;
+
+typedef struct {
+ u_int8_t kv_type; /* one of HAL_CIPHER */
+ u_int8_t kv_pad;
+ u_int16_t kv_len; /* length in bits */
+ u_int8_t kv_val[16]; /* enough for 128-bit keys */
+ u_int8_t kv_mic[8]; /* TKIP MIC key */
+ u_int8_t kv_txmic[8]; /* TKIP TX MIC key (optional) */
+} HAL_KEYVAL;
+
+typedef enum {
+ HAL_CIPHER_WEP = 0,
+ HAL_CIPHER_AES_OCB = 1,
+ HAL_CIPHER_AES_CCM = 2,
+ HAL_CIPHER_CKIP = 3,
+ HAL_CIPHER_TKIP = 4,
+ HAL_CIPHER_CLR = 5, /* no encryption */
+
+ HAL_CIPHER_MIC = 127 /* TKIP-MIC, not a cipher */
+} HAL_CIPHER;
+
+enum {
+ HAL_SLOT_TIME_6 = 6, /* NB: for turbo mode */
+ HAL_SLOT_TIME_9 = 9,
+ HAL_SLOT_TIME_20 = 20,
+};
+
+/*
+ * Per-station beacon timer state. Note that the specified
+ * beacon interval (given in TU's) can also include flags
+ * to force a TSF reset and to enable the beacon xmit logic.
+ * If bs_cfpmaxduration is non-zero the hardware is setup to
+ * coexist with a PCF-capable AP.
+ */
+typedef struct {
+ u_int32_t bs_nexttbtt; /* next beacon in TU */
+ u_int32_t bs_nextdtim; /* next DTIM in TU */
+ u_int32_t bs_intval; /* beacon interval+flags */
+#define HAL_BEACON_PERIOD 0x0000ffff /* beacon interval period */
+#define HAL_BEACON_ENA 0x00800000 /* beacon xmit enable */
+#define HAL_BEACON_RESET_TSF 0x01000000 /* clear TSF */
+ u_int32_t bs_dtimperiod;
+ u_int16_t bs_cfpperiod; /* CFP period in TU */
+ u_int16_t bs_cfpmaxduration; /* max CFP duration in TU */
+ u_int32_t bs_cfpnext; /* next CFP in TU */
+ u_int16_t bs_timoffset; /* byte offset to TIM bitmap */
+ u_int16_t bs_bmissthreshold; /* beacon miss threshold */
+ u_int32_t bs_sleepduration; /* max sleep duration */
+} HAL_BEACON_STATE;
+
+/*
+ * Like HAL_BEACON_STATE but for non-station mode setup.
+ * NB: see above flag definitions
+ */
+typedef struct {
+ u_int32_t bt_intval; /* beacon interval+flags */
+ u_int32_t bt_nexttbtt; /* next beacon in TU */
+ u_int32_t bt_nextatim; /* next ATIM in TU */
+ u_int32_t bt_nextdba; /* next DBA in 1/8th TU */
+ u_int32_t bt_nextswba; /* next SWBA in 1/8th TU */
+} HAL_BEACON_TIMERS;
+
+/*
+ * Per-node statistics maintained by the driver for use in
+ * optimizing signal quality and other operational aspects.
+ */
+typedef struct {
+ u_int32_t ns_avgbrssi; /* average beacon rssi */
+ u_int32_t ns_avgrssi; /* average data rssi */
+ u_int32_t ns_avgtxrssi; /* average tx rssi */
+} HAL_NODE_STATS;
+
+#define HAL_RSSI_EP_MULTIPLIER (1<<7) /* pow2 to optimize out * and / */
+
+struct ath_desc;
+struct ath_tx_status;
+struct ath_rx_status;
+
+/*
+ * Hardware Access Layer (HAL) API.
+ *
+ * Clients of the HAL call ath_hal_attach to obtain a reference to an
+ * ath_hal structure for use with the device. Hardware-related operations
+ * that follow must call back into the HAL through interface, supplying
+ * the reference as the first parameter. Note that before using the
+ * reference returned by ath_hal_attach the caller should verify the
+ * ABI version number.
+ */
+struct ath_hal {
+ u_int32_t ah_magic; /* consistency check magic number */
+ u_int32_t ah_abi; /* HAL ABI version */
+#define HAL_ABI_VERSION 0x06102600 /* YYMMDDnn */
+ u_int16_t ah_devid; /* PCI device ID */
+ u_int16_t ah_subvendorid; /* PCI subvendor ID */
+ HAL_SOFTC ah_sc; /* back pointer to driver/os state */
+ HAL_BUS_TAG ah_st; /* params for register r+w */
+ HAL_BUS_HANDLE ah_sh;
+ HAL_CTRY_CODE ah_countryCode;
+
+ u_int32_t ah_macVersion; /* MAC version id */
+ u_int16_t ah_macRev; /* MAC revision */
+ u_int16_t ah_phyRev; /* PHY revision */
+ /* NB: when only one radio is present the rev is in 5Ghz */
+ u_int16_t ah_analog5GhzRev;/* 5GHz radio revision */
+ u_int16_t ah_analog2GhzRev;/* 2GHz radio revision */
+
+ const HAL_RATE_TABLE *__ahdecl(*ah_getRateTable)(struct ath_hal *,
+ u_int mode);
+ void __ahdecl(*ah_detach)(struct ath_hal*);
+
+ /* Reset functions */
+ HAL_BOOL __ahdecl(*ah_reset)(struct ath_hal *, HAL_OPMODE,
+ HAL_CHANNEL *, HAL_BOOL bChannelChange,
+ HAL_STATUS *status);
+ HAL_BOOL __ahdecl(*ah_phyDisable)(struct ath_hal *);
+ HAL_BOOL __ahdecl(*ah_disable)(struct ath_hal *);
+ void __ahdecl(*ah_setPCUConfig)(struct ath_hal *);
+ HAL_BOOL __ahdecl(*ah_perCalibration)(struct ath_hal*, HAL_CHANNEL *, HAL_BOOL *);
+ HAL_BOOL __ahdecl(*ah_setTxPowerLimit)(struct ath_hal *, u_int32_t);
+
+ /* DFS support */
+ HAL_BOOL __ahdecl(*ah_radarWait)(struct ath_hal *, HAL_CHANNEL *);
+
+ /* Transmit functions */
+ HAL_BOOL __ahdecl(*ah_updateTxTrigLevel)(struct ath_hal*,
+ HAL_BOOL incTrigLevel);
+ int __ahdecl(*ah_setupTxQueue)(struct ath_hal *, HAL_TX_QUEUE,
+ const HAL_TXQ_INFO *qInfo);
+ HAL_BOOL __ahdecl(*ah_setTxQueueProps)(struct ath_hal *, int q,
+ const HAL_TXQ_INFO *qInfo);
+ HAL_BOOL __ahdecl(*ah_getTxQueueProps)(struct ath_hal *, int q,
+ HAL_TXQ_INFO *qInfo);
+ HAL_BOOL __ahdecl(*ah_releaseTxQueue)(struct ath_hal *ah, u_int q);
+ HAL_BOOL __ahdecl(*ah_resetTxQueue)(struct ath_hal *ah, u_int q);
+ u_int32_t __ahdecl(*ah_getTxDP)(struct ath_hal*, u_int);
+ HAL_BOOL __ahdecl(*ah_setTxDP)(struct ath_hal*, u_int, u_int32_t txdp);
+ u_int32_t __ahdecl(*ah_numTxPending)(struct ath_hal *, u_int q);
+ HAL_BOOL __ahdecl(*ah_startTxDma)(struct ath_hal*, u_int);
+ HAL_BOOL __ahdecl(*ah_stopTxDma)(struct ath_hal*, u_int);
+ HAL_BOOL __ahdecl(*ah_setupTxDesc)(struct ath_hal *, struct ath_desc *,
+ u_int pktLen, u_int hdrLen,
+ HAL_PKT_TYPE type, u_int txPower,
+ u_int txRate0, u_int txTries0,
+ u_int keyIx, u_int antMode, u_int flags,
+ u_int rtsctsRate, u_int rtsctsDuration,
+ u_int compicvLen, u_int compivLen,
+ u_int comp);
+ HAL_BOOL __ahdecl(*ah_setupXTxDesc)(struct ath_hal *, struct ath_desc*,
+ u_int txRate1, u_int txTries1,
+ u_int txRate2, u_int txTries2,
+ u_int txRate3, u_int txTries3);
+ HAL_BOOL __ahdecl(*ah_fillTxDesc)(struct ath_hal *, struct ath_desc *,
+ u_int segLen, HAL_BOOL firstSeg,
+ HAL_BOOL lastSeg, const struct ath_desc *);
+ HAL_STATUS __ahdecl(*ah_procTxDesc)(struct ath_hal *,
+ struct ath_desc *, struct ath_tx_status *);
+ void __ahdecl(*ah_getTxIntrQueue)(struct ath_hal *, u_int32_t *);
+ void __ahdecl(*ah_reqTxIntrDesc)(struct ath_hal *, struct ath_desc*);
+
+ /* Receive Functions */
+ u_int32_t __ahdecl(*ah_getRxDP)(struct ath_hal*);
+ void __ahdecl(*ah_setRxDP)(struct ath_hal*, u_int32_t rxdp);
+ void __ahdecl(*ah_enableReceive)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_stopDmaReceive)(struct ath_hal*);
+ void __ahdecl(*ah_startPcuReceive)(struct ath_hal*);
+ void __ahdecl(*ah_stopPcuReceive)(struct ath_hal*);
+ void __ahdecl(*ah_setMulticastFilter)(struct ath_hal*,
+ u_int32_t filter0, u_int32_t filter1);
+ HAL_BOOL __ahdecl(*ah_setMulticastFilterIndex)(struct ath_hal*,
+ u_int32_t index);
+ HAL_BOOL __ahdecl(*ah_clrMulticastFilterIndex)(struct ath_hal*,
+ u_int32_t index);
+ u_int32_t __ahdecl(*ah_getRxFilter)(struct ath_hal*);
+ void __ahdecl(*ah_setRxFilter)(struct ath_hal*, u_int32_t);
+ HAL_BOOL __ahdecl(*ah_setupRxDesc)(struct ath_hal *, struct ath_desc *,
+ u_int32_t size, u_int flags);
+ HAL_STATUS __ahdecl(*ah_procRxDesc)(struct ath_hal *,
+ struct ath_desc *, u_int32_t phyAddr,
+ struct ath_desc *next, u_int64_t tsf,
+ struct ath_rx_status *);
+ void __ahdecl(*ah_rxMonitor)(struct ath_hal *,
+ const HAL_NODE_STATS *, HAL_CHANNEL *);
+ void __ahdecl(*ah_procMibEvent)(struct ath_hal *,
+ const HAL_NODE_STATS *);
+
+ /* Misc Functions */
+ HAL_STATUS __ahdecl(*ah_getCapability)(struct ath_hal *,
+ HAL_CAPABILITY_TYPE, u_int32_t capability,
+ u_int32_t *result);
+ HAL_BOOL __ahdecl(*ah_setCapability)(struct ath_hal *,
+ HAL_CAPABILITY_TYPE, u_int32_t capability,
+ u_int32_t setting, HAL_STATUS *);
+ HAL_BOOL __ahdecl(*ah_getDiagState)(struct ath_hal *, int request,
+ const void *args, u_int32_t argsize,
+ void **result, u_int32_t *resultsize);
+ void __ahdecl(*ah_getMacAddress)(struct ath_hal *, u_int8_t *);
+ HAL_BOOL __ahdecl(*ah_setMacAddress)(struct ath_hal *, const u_int8_t*);
+ void __ahdecl(*ah_getBssIdMask)(struct ath_hal *, u_int8_t *);
+ HAL_BOOL __ahdecl(*ah_setBssIdMask)(struct ath_hal *, const u_int8_t*);
+ HAL_BOOL __ahdecl(*ah_setRegulatoryDomain)(struct ath_hal*,
+ u_int16_t, HAL_STATUS *);
+ void __ahdecl(*ah_setLedState)(struct ath_hal*, HAL_LED_STATE);
+ void __ahdecl(*ah_writeAssocid)(struct ath_hal*,
+ const u_int8_t *bssid, u_int16_t assocId);
+ HAL_BOOL __ahdecl(*ah_gpioCfgOutput)(struct ath_hal *, u_int32_t gpio);
+ HAL_BOOL __ahdecl(*ah_gpioCfgInput)(struct ath_hal *, u_int32_t gpio);
+ u_int32_t __ahdecl(*ah_gpioGet)(struct ath_hal *, u_int32_t gpio);
+ HAL_BOOL __ahdecl(*ah_gpioSet)(struct ath_hal *,
+ u_int32_t gpio, u_int32_t val);
+ void __ahdecl(*ah_gpioSetIntr)(struct ath_hal*, u_int, u_int32_t);
+ u_int32_t __ahdecl(*ah_getTsf32)(struct ath_hal*);
+ u_int64_t __ahdecl(*ah_getTsf64)(struct ath_hal*);
+ void __ahdecl(*ah_resetTsf)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_detectCardPresent)(struct ath_hal*);
+ void __ahdecl(*ah_updateMibCounters)(struct ath_hal*,
+ HAL_MIB_STATS*);
+ HAL_RFGAIN __ahdecl(*ah_getRfGain)(struct ath_hal*);
+ u_int __ahdecl(*ah_getDefAntenna)(struct ath_hal*);
+ void __ahdecl(*ah_setDefAntenna)(struct ath_hal*, u_int);
+ HAL_ANT_SETTING __ahdecl(*ah_getAntennaSwitch)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_setAntennaSwitch)(struct ath_hal*,
+ HAL_ANT_SETTING);
+ HAL_BOOL __ahdecl(*ah_setSlotTime)(struct ath_hal*, u_int);
+ u_int __ahdecl(*ah_getSlotTime)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_setAckTimeout)(struct ath_hal*, u_int);
+ u_int __ahdecl(*ah_getAckTimeout)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_setAckCTSRate)(struct ath_hal*, u_int);
+ u_int __ahdecl(*ah_getAckCTSRate)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_setCTSTimeout)(struct ath_hal*, u_int);
+ u_int __ahdecl(*ah_getCTSTimeout)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_setDecompMask)(struct ath_hal*, u_int16_t, int);
+ void __ahdecl(*ah_setCoverageClass)(struct ath_hal*, u_int8_t, int);
+
+ /* Key Cache Functions */
+ u_int32_t __ahdecl(*ah_getKeyCacheSize)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_resetKeyCacheEntry)(struct ath_hal*, u_int16_t);
+ HAL_BOOL __ahdecl(*ah_isKeyCacheEntryValid)(struct ath_hal *,
+ u_int16_t);
+ HAL_BOOL __ahdecl(*ah_setKeyCacheEntry)(struct ath_hal*,
+ u_int16_t, const HAL_KEYVAL *,
+ const u_int8_t *, int);
+ HAL_BOOL __ahdecl(*ah_setKeyCacheEntryMac)(struct ath_hal*,
+ u_int16_t, const u_int8_t *);
+
+ /* Power Management Functions */
+ HAL_BOOL __ahdecl(*ah_setPowerMode)(struct ath_hal*,
+ HAL_POWER_MODE mode, int setChip);
+ HAL_POWER_MODE __ahdecl(*ah_getPowerMode)(struct ath_hal*);
+ int16_t __ahdecl(*ah_getChanNoise)(struct ath_hal *, HAL_CHANNEL *);
+
+
+ /* Beacon Management Functions */
+ void __ahdecl(*ah_setBeaconTimers)(struct ath_hal*,
+ const HAL_BEACON_TIMERS *);
+ /* NB: deprecated, use ah_setBeaconTimers instead */
+ void __ahdecl(*ah_beaconInit)(struct ath_hal *,
+ u_int32_t nexttbtt, u_int32_t intval);
+ void __ahdecl(*ah_setStationBeaconTimers)(struct ath_hal*,
+ const HAL_BEACON_STATE *);
+ void __ahdecl(*ah_resetStationBeaconTimers)(struct ath_hal*);
+
+ /* Interrupt functions */
+ HAL_BOOL __ahdecl(*ah_isInterruptPending)(struct ath_hal*);
+ HAL_BOOL __ahdecl(*ah_getPendingInterrupts)(struct ath_hal*, HAL_INT*);
+ HAL_INT __ahdecl(*ah_getInterrupts)(struct ath_hal*);
+ HAL_INT __ahdecl(*ah_setInterrupts)(struct ath_hal*, HAL_INT);
+};
+
+/*
+ * Check the PCI vendor ID and device ID against Atheros' values
+ * and return a printable description for any Atheros hardware.
+ * AH_NULL is returned if the ID's do not describe Atheros hardware.
+ */
+extern const char *__ahdecl ath_hal_probe(u_int16_t vendorid, u_int16_t devid);
+
+/*
+ * Attach the HAL for use with the specified device. The device is
+ * defined by the PCI device ID. The caller provides an opaque pointer
+ * to an upper-layer data structure (HAL_SOFTC) that is stored in the
+ * HAL state block for later use. Hardware register accesses are done
+ * using the specified bus tag and handle. On successful return a
+ * reference to a state block is returned that must be supplied in all
+ * subsequent HAL calls. Storage associated with this reference is
+ * dynamically allocated and must be freed by calling the ah_detach
+ * method when the client is done. If the attach operation fails a
+ * null (AH_NULL) reference will be returned and a status code will
+ * be returned if the status parameter is non-zero.
+ */
+extern struct ath_hal * __ahdecl ath_hal_attach(u_int16_t devid, HAL_SOFTC,
+ HAL_BUS_TAG, HAL_BUS_HANDLE, HAL_STATUS* status);
+
+/*
+ * Set the Vendor ID for Vendor SKU's which can modify the
+ * channel properties returned by ath_hal_init_channels.
+ * Return AH_TRUE if set succeeds
+ */
+
+extern HAL_BOOL __ahdecl ath_hal_setvendor(struct ath_hal *, u_int32_t );
+
+/*
+ * Return a list of channels available for use with the hardware.
+ * The list is based on what the hardware is capable of, the specified
+ * country code, the modeSelect mask, and whether or not outdoor
+ * channels are to be permitted.
+ *
+ * The channel list is returned in the supplied array. maxchans
+ * defines the maximum size of this array. nchans contains the actual
+ * number of channels returned. If a problem occurred or there were
+ * no channels that met the criteria then AH_FALSE is returned.
+ */
+extern HAL_BOOL __ahdecl ath_hal_init_channels(struct ath_hal *,
+ HAL_CHANNEL *chans, u_int maxchans, u_int *nchans,
+ u_int8_t *regclassids, u_int maxregids, u_int *nregids,
+ HAL_CTRY_CODE cc, u_int16_t modeSelect,
+ HAL_BOOL enableOutdoor, HAL_BOOL enableExtendedChannels);
+
+/*
+ * Calibrate noise floor data following a channel scan or similar.
+ * This must be called prior retrieving noise floor data.
+ */
+extern void __ahdecl ath_hal_process_noisefloor(struct ath_hal *ah);
+
+/*
+ * Return bit mask of wireless modes supported by the hardware.
+ */
+extern u_int __ahdecl ath_hal_getwirelessmodes(struct ath_hal*, HAL_CTRY_CODE);
+
+/*
+ * Return rate table for specified mode (11a, 11b, 11g, etc).
+ */
+extern const HAL_RATE_TABLE * __ahdecl ath_hal_getratetable(struct ath_hal *,
+ u_int mode);
+
+/*
+ * Calculate the transmit duration of a frame.
+ */
+extern u_int16_t __ahdecl ath_hal_computetxtime(struct ath_hal *,
+ const HAL_RATE_TABLE *rates, u_int32_t frameLen,
+ u_int16_t rateix, HAL_BOOL shortPreamble);
+
+/*
+ * Return if device is public safety.
+ */
+extern HAL_BOOL __ahdecl ath_hal_ispublicsafetysku(struct ath_hal *);
+
+/*
+ * Convert between IEEE channel number and channel frequency
+ * using the specified channel flags; e.g. CHANNEL_2GHZ.
+ */
+extern int __ahdecl ath_hal_mhz2ieee(struct ath_hal *, u_int mhz, u_int flags);
+
+/*
+ * Return a version string for the HAL release.
+ */
+extern char ath_hal_version[];
+/*
+ * Return a NULL-terminated array of build/configuration options.
+ */
+extern const char* ath_hal_buildopts[];
+#endif /* _ATH_AH_H_ */
diff --git a/sys/contrib/dev/ath/ah_desc.h b/sys/contrib/dev/ath/ah_desc.h
new file mode 100644
index 0000000..36e097c
--- /dev/null
+++ b/sys/contrib/dev/ath/ah_desc.h
@@ -0,0 +1,181 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/ah_desc.h#5 $
+ */
+
+#ifndef _DEV_ATH_DESC_H
+#define _DEV_ATH_DESC_H
+
+/*
+ * Transmit descriptor status. This structure is filled
+ * in only after the tx descriptor process method finds a
+ * ``done'' descriptor; at which point it returns something
+ * other than HAL_EINPROGRESS.
+ *
+ * Note that ts_antenna may not be valid for all h/w. It
+ * should be used only if non-zero.
+ */
+struct ath_tx_status {
+ u_int16_t ts_seqnum; /* h/w assigned sequence number */
+ u_int16_t ts_tstamp; /* h/w assigned timestamp */
+ u_int8_t ts_status; /* frame status, 0 => xmit ok */
+ u_int8_t ts_rate; /* h/w transmit rate index */
+#define HAL_TXSTAT_ALTRATE 0x80 /* alternate xmit rate used */
+ int8_t ts_rssi; /* tx ack RSSI */
+ u_int8_t ts_shortretry; /* # short retries */
+ u_int8_t ts_longretry; /* # long retries */
+ u_int8_t ts_virtcol; /* virtual collision count */
+ u_int8_t ts_antenna; /* antenna information */
+ u_int8_t ts_finaltsi; /* final transmit series index */
+};
+
+#define HAL_TXERR_XRETRY 0x01 /* excessive retries */
+#define HAL_TXERR_FILT 0x02 /* blocked by tx filtering */
+#define HAL_TXERR_FIFO 0x04 /* fifo underrun */
+
+/*
+ * Receive descriptor status. This structure is filled
+ * in only after the rx descriptor process method finds a
+ * ``done'' descriptor; at which point it returns something
+ * other than HAL_EINPROGRESS.
+ *
+ * If rx_status is zero, then the frame was received ok;
+ * otherwise the error information is indicated and rs_phyerr
+ * contains a phy error code if HAL_RXERR_PHY is set. In general
+ * the frame contents is undefined when an error occurred thought
+ * for some errors (e.g. a decryption error), it may be meaningful.
+ *
+ * Note that the receive timestamp is expanded using the TSF to
+ * 15 bits (regardless of what the h/w provides directly).
+ *
+ * rx_rssi is in units of dbm above the noise floor. This value
+ * is measured during the preamble and PLCP; i.e. with the initial
+ * 4us of detection. The noise floor is typically a consistent
+ * -96dBm absolute power in a 20MHz channel.
+ */
+struct ath_rx_status {
+ u_int16_t rs_datalen; /* rx frame length */
+ u_int16_t rs_tstamp; /* h/w assigned timestamp */
+ u_int8_t rs_status; /* rx status, 0 => recv ok */
+ u_int8_t rs_phyerr; /* phy error code */
+ int8_t rs_rssi; /* rx frame RSSI */
+ u_int8_t rs_keyix; /* key cache index */
+ u_int8_t rs_rate; /* h/w receive rate index */
+ u_int8_t rs_antenna; /* antenna information */
+ u_int8_t rs_more; /* more descriptors follow */
+};
+
+#define HAL_RXERR_CRC 0x01 /* CRC error on frame */
+#define HAL_RXERR_PHY 0x02 /* PHY error, rs_phyerr is valid */
+#define HAL_RXERR_FIFO 0x04 /* fifo overrun */
+#define HAL_RXERR_DECRYPT 0x08 /* non-Michael decrypt error */
+#define HAL_RXERR_MIC 0x10 /* Michael MIC decrypt error */
+
+enum {
+ HAL_PHYERR_UNDERRUN = 0, /* Transmit underrun */
+ HAL_PHYERR_TIMING = 1, /* Timing error */
+ HAL_PHYERR_PARITY = 2, /* Illegal parity */
+ HAL_PHYERR_RATE = 3, /* Illegal rate */
+ HAL_PHYERR_LENGTH = 4, /* Illegal length */
+ HAL_PHYERR_RADAR = 5, /* Radar detect */
+ HAL_PHYERR_SERVICE = 6, /* Illegal service */
+ HAL_PHYERR_TOR = 7, /* Transmit override receive */
+ /* NB: these are specific to the 5212 */
+ HAL_PHYERR_OFDM_TIMING = 17, /* */
+ HAL_PHYERR_OFDM_SIGNAL_PARITY = 18, /* */
+ HAL_PHYERR_OFDM_RATE_ILLEGAL = 19, /* */
+ HAL_PHYERR_OFDM_LENGTH_ILLEGAL = 20, /* */
+ HAL_PHYERR_OFDM_POWER_DROP = 21, /* */
+ HAL_PHYERR_OFDM_SERVICE = 22, /* */
+ HAL_PHYERR_OFDM_RESTART = 23, /* */
+ HAL_PHYERR_CCK_TIMING = 25, /* */
+ HAL_PHYERR_CCK_HEADER_CRC = 26, /* */
+ HAL_PHYERR_CCK_RATE_ILLEGAL = 27, /* */
+ HAL_PHYERR_CCK_SERVICE = 30, /* */
+ HAL_PHYERR_CCK_RESTART = 31, /* */
+};
+
+/* value found in rs_keyix to mark invalid entries */
+#define HAL_RXKEYIX_INVALID ((u_int8_t) -1)
+/* value used to specify no encryption key for xmit */
+#define HAL_TXKEYIX_INVALID ((u_int) -1)
+
+/* XXX rs_antenna definitions */
+
+/*
+ * Definitions for the software frame/packet descriptors used by
+ * the Atheros HAL. This definition obscures hardware-specific
+ * details from the driver. Drivers are expected to fillin the
+ * portions of a descriptor that are not opaque then use HAL calls
+ * to complete the work. Status for completed frames is returned
+ * in a device-independent format.
+ */
+struct ath_desc {
+ /*
+ * The following definitions are passed directly
+ * the hardware and managed by the HAL. Drivers
+ * should not touch those elements marked opaque.
+ */
+ u_int32_t ds_link; /* phys address of next descriptor */
+ u_int32_t ds_data; /* phys address of data buffer */
+ u_int32_t ds_ctl0; /* opaque DMA control 0 */
+ u_int32_t ds_ctl1; /* opaque DMA control 1 */
+ u_int32_t ds_hw[4]; /* opaque h/w region */
+};
+
+struct ath_desc_status {
+ union {
+ struct ath_tx_status tx;/* xmit status */
+ struct ath_rx_status rx;/* recv status */
+ } ds_us;
+};
+
+#define ds_txstat ds_us.tx
+#define ds_rxstat ds_us.rx
+
+/* flags passed to tx descriptor setup methods */
+#define HAL_TXDESC_CLRDMASK 0x0001 /* clear destination filter mask */
+#define HAL_TXDESC_NOACK 0x0002 /* don't wait for ACK */
+#define HAL_TXDESC_RTSENA 0x0004 /* enable RTS */
+#define HAL_TXDESC_CTSENA 0x0008 /* enable CTS */
+#define HAL_TXDESC_INTREQ 0x0010 /* enable per-descriptor interrupt */
+#define HAL_TXDESC_VEOL 0x0020 /* mark virtual EOL */
+/* NB: this only affects frame, not any RTS/CTS */
+#define HAL_TXDESC_DURENA 0x0040 /* enable h/w write of duration field */
+
+/* flags passed to rx descriptor setup methods */
+#define HAL_RXDESC_INTREQ 0x0020 /* enable per-descriptor interrupt */
+#endif /* _DEV_ATH_DESC_H */
diff --git a/sys/contrib/dev/ath/ah_devid.h b/sys/contrib/dev/ath/ah_devid.h
new file mode 100644
index 0000000..c4bd28c
--- /dev/null
+++ b/sys/contrib/dev/ath/ah_devid.h
@@ -0,0 +1,99 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/ah_devid.h#2 $
+ */
+
+#ifndef _DEV_ATH_DEVID_H_
+#define _DEV_ATH_DEVID_H_
+
+#define ATHEROS_VENDOR_ID 0x168c /* Atheros PCI vendor ID */
+/*
+ * NB: all Atheros-based devices should have a PCI vendor ID
+ * of 0x168c, but some vendors, in their infinite wisdom
+ * do not follow this so we must handle them specially.
+ */
+#define ATHEROS_3COM_VENDOR_ID 0xa727 /* 3Com 3CRPAG175 vendor ID */
+#define ATHEROS_3COM2_VENDOR_ID 0x10b7 /* 3Com 3CRDAG675 vendor ID */
+
+/* AR5210 (for reference) */
+#define AR5210_DEFAULT 0x1107 /* No eeprom HW default */
+#define AR5210_PROD 0x0007 /* Final device ID */
+#define AR5210_AP 0x0207 /* Early AP11s */
+
+/* AR5211 */
+#define AR5211_DEFAULT 0x1112 /* No eeprom HW default */
+#define AR5311_DEVID 0x0011 /* Final ar5311 devid */
+#define AR5211_DEVID 0x0012 /* Final ar5211 devid */
+#define AR5211_LEGACY 0xff12 /* Original emulation board */
+#define AR5211_FPGA11B 0xf11b /* 11b emulation board */
+
+/* AR5212 */
+#define AR5212_DEFAULT 0x1113 /* No eeprom HW default */
+#define AR5212_DEVID 0x0013 /* Final ar5212 devid */
+#define AR5212_FPGA 0xf013 /* Emulation board */
+#define AR5212_DEVID_IBM 0x1014 /* IBM minipci ID */
+#define AR5212_AR5312_REV2 0x0052 /* AR5312 WMAC (AP31) */
+#define AR5212_AR5312_REV7 0x0057 /* AR5312 WMAC (AP30-040) */
+#define AR5212_AR2313_REV8 0x0058 /* AR2313 WMAC (AP43-030) */
+#define AR5212_AR2315_REV6 0x0086 /* AR2315 WMAC (AP51-Light) */
+#define AR5212_AR2315_REV7 0x0087 /* AR2315 WMAC (AP51-Full) */
+#define AR5212_AR2317_REV1 0x0091 /* AR2317 WMAC (AP61) */
+
+/* AR5212 compatible devid's also attach to 5212 */
+#define AR5212_DEVID_0014 0x0014
+#define AR5212_DEVID_0015 0x0015
+#define AR5212_DEVID_0016 0x0016
+#define AR5212_DEVID_0017 0x0017
+#define AR5212_DEVID_0018 0x0018
+#define AR5212_DEVID_0019 0x0019
+#define AR5212_AR2413 0x001a /* AR2413 aka Griffin-lite */
+#define AR5212_AR5413 0x001b /* Eagle */
+#define AR5212_AR5424 0x001c /* Condor (PCI express) */
+#define AR5212_DEVID_FF19 0xff19 /* XXX PCI express */
+
+/* AR5213 */
+#define AR5213_SREV_1_0 0x0055
+#define AR5213_SREV_REG 0x4020
+
+/* AR5416 */
+#define AR5416_DEVID_EMU_PCI 0xff1d /* PCI Owl Emulation*/
+#define AR5416_DEVID_EMU_PCIE 0xff1c /* PCIe Owl Emulation*/
+#define AR5416_DEVID 0x0023 /* PCI (MB/CB) */
+#define AR5418_DEVID 0x0024 /* PCI Express (XB) */
+
+#define AR_SUBVENDOR_ID_NOG 0x0e11 /* No 11G subvendor ID */
+#define AR_SUBVENDOR_ID_NEW_A 0x7065 /* Update device to new RD */
+#endif /* _DEV_ATH_DEVID_H */
diff --git a/sys/contrib/dev/ath/ah_soc.h b/sys/contrib/dev/ath/ah_soc.h
new file mode 100644
index 0000000..0852bd3
--- /dev/null
+++ b/sys/contrib/dev/ath/ah_soc.h
@@ -0,0 +1,110 @@
+/*-
+ * Copyright (c) 2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/ah_soc.h#3 $
+ */
+#ifndef _ATH_AH_SOC_H_
+#define _ATH_AH_SOC_H_
+/*
+ * Atheros System on Chip (SoC) public definitions.
+ */
+
+/*
+ * This is board-specific data that is stored in a "known"
+ * location in flash. To find the start of this data search
+ * back from the (aliased) end of flash by 0x1000 bytes at a
+ * time until you find the string "5311", which marks the
+ * start of Board Configuration. Typically one gives up if
+ * more than 500KB is searched.
+ */
+struct ar531x_boarddata {
+ u_int32_t magic; /* board data is valid */
+#define AR531X_BD_MAGIC 0x35333131 /* "5311", for all 531x platforms */
+ u_int16_t cksum; /* checksum (starting with BD_REV 2) */
+ u_int16_t rev; /* revision of this struct */
+#define BD_REV 4
+ char boardName[64]; /* Name of board */
+ u_int16_t major; /* Board major number */
+ u_int16_t minor; /* Board minor number */
+ u_int32_t config; /* Board configuration */
+#define BD_ENET0 0x00000001 /* ENET0 is stuffed */
+#define BD_ENET1 0x00000002 /* ENET1 is stuffed */
+#define BD_UART1 0x00000004 /* UART1 is stuffed */
+#define BD_UART0 0x00000008 /* UART0 is stuffed (dma) */
+#define BD_RSTFACTORY 0x00000010 /* Reset factory defaults stuffed */
+#define BD_SYSLED 0x00000020 /* System LED stuffed */
+#define BD_EXTUARTCLK 0x00000040 /* External UART clock */
+#define BD_CPUFREQ 0x00000080 /* cpu freq is valid in nvram */
+#define BD_SYSFREQ 0x00000100 /* sys freq is set in nvram */
+#define BD_WLAN0 0x00000200 /* Enable WLAN0 */
+#define BD_MEMCAP 0x00000400 /* CAP SDRAM @ memCap for testing */
+#define BD_DISWATCHDOG 0x00000800 /* disable system watchdog */
+#define BD_WLAN1 0x00001000 /* Enable WLAN1 (ar5212) */
+#define BD_ISCASPER 0x00002000 /* FLAG for AR2312 */
+#define BD_WLAN0_2G_EN 0x00004000 /* FLAG for radio0_2G */
+#define BD_WLAN0_5G_EN 0x00008000 /* FLAG for radio0_2G */
+#define BD_WLAN1_2G_EN 0x00020000 /* FLAG for radio0_2G */
+#define BD_WLAN1_5G_EN 0x00040000 /* FLAG for radio0_2G */
+ u_int16_t resetConfigGpio; /* Reset factory GPIO pin */
+ u_int16_t sysLedGpio; /* System LED GPIO pin */
+
+ u_int32_t cpuFreq; /* CPU core frequency in Hz */
+ u_int32_t sysFreq; /* System frequency in Hz */
+ u_int32_t cntFreq; /* Calculated C0_COUNT frequency */
+
+ u_int8_t wlan0Mac[6];
+ u_int8_t enet0Mac[6];
+ u_int8_t enet1Mac[6];
+
+ u_int16_t pciId; /* Pseudo PCIID for common code */
+ u_int16_t memCap; /* cap bank1 in MB */
+
+ /* version 3 */
+ u_int8_t wlan1Mac[6]; /* (ar5212) */
+};
+
+/*
+ * Board support data. The driver is required to locate
+ * and fill-in this information before passing a reference to
+ * this structure as the HAL_BUS_TAG parameter supplied to
+ * ath_hal_attach.
+ */
+struct ar531x_config {
+ const struct ar531x_boarddata *board; /* board config data */
+ const char *radio; /* radio config data */
+ int unit; /* unit number [0, 1] */
+ void *tag; /* bus space tag */
+};
+#endif /* _ATH_AH_SOC_H_ */
diff --git a/sys/contrib/dev/ath/public/alpha-elf.hal.o.uu b/sys/contrib/dev/ath/public/alpha-elf.hal.o.uu
new file mode 100644
index 0000000..6c4cf21
--- /dev/null
+++ b/sys/contrib/dev/ath/public/alpha-elf.hal.o.uu
@@ -0,0 +1,10150 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/COPYRIGHT#1 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@(!`0````````````$`)I`!`````````````````````````.CP`P``
+M`````````$```````$``#@`+````NR<``+TC$`#P0Z(5"T(``#TD```!($\`
+M0/2A'0M"&@`@Y*%]`T(,`"#DH5D#0D4`(.2A70)"!0`@Y*$Y`D(X`"#DH?4`
+M0C,`(/1!`.##H74"0CP`(/0^`.##H54*0C,`(/2A70I"!0`@Y**5`T(``#TD
+M```!(#<`0/0U`.##H?4*0BH`(/0R`.##^>XP("$`(.0-`"#\HC420@``/20`
+M``$@+`!`]*$]$D($`"#D>O\P(*$W($`F`"#D'P#@P^SO,"`@`"#D(@#@P^WN
+M,"`=`"#D`P`@_.[N,"`1`"#D'`#@PP$`/R03\"$@H04!0@``720```(@%P`@
+M]`$`/R0;\2$@H04!0@``720```(@$0`@]`\`X,,``#TD```!(`&`^FL``#TD
+M```!(`&`^FL``#TD```!(`&`^FL``#TD```!(`&`^FL``#TD```!(`&`^FL`
+M!/]'`8#Z:P``NR<``+TC\/_>(P``7K>,%E\@H@4"0@$`/R0GIR$@H04!0@($
+M040#`$#T2>\P(``$_T<"`"#T$`3Q1YO_7],``%ZG$`#>(P&`^FL``+LG``"]
+M(_#_WB,``%ZW`@#P0_G](B`S`"#D#``@_*%=0D`%`"#DH3E"0"D`(.2A]4!`
+M+``@]#``X,.A=4)`'P`@].;_(B"A5R!`&@#@P^WN(B`:`"#D"0`@_/GN(B`A
+M`"#D`P`@_.SO(B`3`"#D(@#@P^[N(B`6`"#D'P#@PP$`?R0;\6,@H05#0!$`
+M(/2A#4-`!0`@Y`$`/R03\"$@H05!0`8`(/04`.##`0`_)!G_(2"A!4%`$``@
+MY!,`'R(``'VG`$!;:P``NB<``+TC#0#@PP``?:<`0%MK``"Z)P``O2,(`.##
+M``!]IP!`6VL``+HG``"](P,`X,,`!/]'`0`_(```-+`(``#D>`,@H`@`(+!\
+M`R"@+``@L(`#(*`P`""PA`,@H#0`(+```%ZG$`#>(P&`^FN(`S"R`0`?(`&`
+M^FL``+LG``"](]#_WB,``%ZW"``^M1``7K48`'ZU(`">M2@`OK4-!/!'#`3Q
+M1PL$\D<)!/]'*O9A2A`$[4<1!.Q'``!]IP!`6VL``+HG``"](P``"T0@]@%(
+MH`4*0`$`/R`)``#T"@`?(@``?:<`0%MK``"Z)P``O2,),"!!&?PI(.W_/^P!
+M!/]'``3A1P``7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WB,!@/IK`P3_1S'V
+M(4H$!/%'``3_1PH`(.8!!`!``C``1@$$(D0``.%#(?8!2I`V($@#,&!`(?9A
+M2*$#)$#V_S_T`8#Z:P``NR<``+TC805S0D$$,4`F`$$L)@`A(,,"04@`!/]'
+MJ0!@Y&$%<T)!!#%`)0!!+"4`(2#"`$%(H55`0!P`(/2A74!``@`@Y`8`0.2<
+M`.##H75`0&<`(/2AE4!`?``@])<`X,/``)\@!@"`YF$%<T)!!#%`*0!!+"D`
+M(2#"`$%(Q!1,1$$20$)8!"%`6`080U@$&$-8$@!#&0#C0P``?:<`0/MJ&P1D
+M0P!084.%`.##Z!-0I!P`0.0$`$(@_O\B+$$/(DB!%R9(%P`@^"*78$A!!D)`
+M80<B0$$&(4!!!B)`000A0$$$(D!!!B)`804A0&$'(4!!!")`804B0)G6)$A!
+MUD)"`0#A0Q@$.4`X,0!#&0#Y0P``?:<`0/MJ(9=@2P`0,D!G`.##Z!-0I!L`
+M0.0"`"(L`@!"(,$"(DB!UB%(%@`@X$(68$!!!D)`80<B0$$&(4!!!B)`000A
+M0$$$(D!!!B)`804A0&$'(4!!!")`804B0)G6)$A!UD)"`0#A0Q@$.4`X,0!#
+M&0#Y0P``?:<`0/MJ019I0RL`X,-"%&!`009"0&$'(D!!!B%`008B0$$$(4!!
+M!")`008B0&$%(4!A!R%`000B0&$%(D"9UB1(0=9"0@$`X4,8!#E`.#$`0QD`
+M^4,``'VG`$#[:D&49$,5`.##0A9@0$$&0D!A!R)`008A0$$&(D!!!"%`000B
+M0$$&(D!A!2%`80<A0$$$(D!A!2)`F=8D2$'60D(!`.%#&`0Y0#@Q`$,9`/E#
+M``!]IP!`^VI!U&)#``#A0QT`X,-"%&!`009"0&$'(D!!!B%`008B0$$$(4!!
+M!")`008B0&$%(4!A!R%`000B0&$%(D"9UB1(0=9"0@$`X4,8!#E`.#$`0QD`
+M^4,``'VG`$#[:D(08$/G`S\@H0=A0`.P5T`"D$M```3C1X`$(D0!`.##``3_
+M1R!V`$@!@/IK`@`Q+`(`42#!`B)(`1`D1`(`'R`;`"#T`@`Q+`(`42#!`B)(
+M`1`Z1*$5.$`#`!\@%``@]`(`,2P"`%$@P0(B2`$0.D2A%3I`!``?(`T`(/0"
+M`#$L`@!1(,$"(D@!$")$`0`?(`<`(/0"`#$L`@!1(,$"(D@`"%\@`0`B1`4`
+M'R"`%"!$`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M0H$\4<)!/)'`1!0
+M1@<`(.1,]C$@#@`?('H`(.2S"3\@H0<A0AH`(/1<`.##@19!2A$`(.```'VG
+M`$!;:P``NB<``+TC!```Y`($ZD>S["H@H1<F0"D`(/1``3\@`0`A1:$#X4.(
+M$U\@H@="00$`(D1(`"#T5P#@PTSV,2`.`!\@8``@Y+,)/R"A!R%"#P`@Y)GV
+M*B`!`.%#0@0A0$(&04!"!$)`8@5!0$($04`CUT%((P5B0$,$84!C!V%`@S=D
+M2('W(T@@!6%`3@#@PX<3/R"A!R%"/P`@Y```?:<`0%MK``"Z)P``O2,G``#D
+M`@3J1[/L*B"A%R9`(P`@Y$$$2D$$`"%`(O9!2$$$0D!!!B)`000A0&$%(D!!
+M!")`804B0",7(D@!!"-`000B0(%6)$A!!"%`(05!02%1($`#`"#T__\D)`T_
+M(2`"`.##__\D)`@_(2`A]B%(0@0A0$(&04!"!$)`8@5!0$($04!B!4%`(Q="
+M2`($0T!"!$%`@%9$2```X$,?`.##)!,_(*$'04$"`"#T8/`J(`\`X,,P]BH@
+M(?8A2$($(4!"!D%`0@1"0&(%04!"!$%`8@5!0",70D@"!$-`0@1!0(*61$@/
+M``(@#`#@PWCL*B`A]B%(0@0A0$(&04!"!$)`8@5!0$($04!B!4%`(Q="2`($
+M0T!"!$%`@%9$2```7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/P_]XC``!>
+MMP@`/K4)!/%'Z!,PIF$%*4%A!2E````A0`@`(.9&_U_3(/8!2```/20``"$@
+M``0!0```("S!`"!(```I3```7J<(`#ZE$`#>(P&`^FL``+LG``"](_#_WB,`
+M`%ZW"``^M0D$\4?H$S"F"P`@YC+_7],@]@%(```])```(2``!`%````@+Q@`
+MZ4/9`"!+``!]IP!`^VH+`.##(?8A26(%(4!B!T)`8@5!0&(%04!"!D)`(_=!
+M2",%8D!#!F%`8P5A0)N69$@`!/M'``!>IP@`/J40`-XC`8#Z:P``NR<``+TC
+MP/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M3``WK4.!/!'#`3Q1P0`,:`!
+M\#]$1P`@]`T$_T?__Y\@`P2-000`0RP$`",@0@!!2&$!@4@!!")$!``C/`TP
+MH$&A_:-!]O\_]`T$_T<``"R@.``@[&D%K4%)!"Q!(`!)(0@`JBPH`"D@Q0"A
+M2`L`:BTK`,D@`P2%000`0RP$`",@0@!!2&$!H4D!!")$!``C/`D`2BPI`"D@
+MP0!!2`$$H40!\#]$`02!000`02P$`&$@0@!#2&0!HTD$!()$!`"!/,L`9DD0
+M!.Y'$03L1PX`7R(3!.M'%`3_1R?^7],,`"HL+`!)($$"(DA@!P)(``0!1`P`
+M"CP0!.Y'$03L1PX`7R(3!.M'`0"?(AO^7],.`"HL+@`I(4$"*4A@!PE(``0!
+M1`X`"CP-,*!!```LH*$-+4#(_S_D``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE
+M,`#>I4``WB,!@/IK``"[)P``O2.0`U`@,?8A2J%7)$)B`"#D```])```(2!!
+M!"%"```AH`$$H4-<`.%KN`,PH`<`X,,``"*@P7`@2`$P($0`."!$`8#Z:P@`
+M(J#!4B!((78@2```,[``!/]'`8#Z:P@`(J#Z___#```BH($V(D@G`.##```B
+MH,%2($@`!/]'@+(A1`&`^FL``"*@`9`@1`(`X,,``"*@`1`A1*$#X4,`!/]'
+M@+0A1`&`^FL``"*@`1`B1/G__\.H`S"@Y?__PS+V04JA-4!"!P`@]``$_T<S
+M`$#FH55`0@<`(/2A=4!"!P`@]"<`X,.L`S"@(1<F2($7)DC7___#K`,PH-/_
+M_\.P`S"@T___PP``(J"!5B)(``3_1\"R(40!@/IK```BH(%V(DCZ___#```B
+MH($6(4CW___#```BH(&V(DCT___#```BH('6(DCQ___#,O9!2J$U0$('`"#T
+M`P!`YJ%50$(&`"#T!P#@PP``(J"!]B)(Y___PP04,*#)___#`!0PH+/__\,-
+M`!\@`8#Z:R`4,*##___#%``BH*[__\,,`!\@`8#Z:S'V(4JA-2-"#@`@]*$W
+M(T(#`"#DH?4A0@0`(/0;`.##H=4C0A<`(/08`.##H75`0A8`(.2AEV!"%``@
+MY+`#<+((`.##,O9!2J$U0$(#`"#TH55`0@4`(/0,`.##H0/S0P04,+`!`!\@
+M`8#Z:P`44*`BEE]((79@2@$$(D0`%#"P^/__PR`4<++V___#`@"`Y@P`/R``
+M`#2P``3_1P&`^FL``+LG``"]([#_WB,``%ZW"``^M1``7K48`'ZU(`">M2@`
+MOK4P`-ZU.`#^M0T$\$=``#ZV2`!>M@H$\T<+!/)'#P3_1Z'W8$(A`"#T`P#?
+M(4``7J1!!.)!``!!+,D"04@"`$$L`@`A(,("04@A%R))`00B1```*[`$`&LA
+M*I%`02SV04@0!.U'$03I1P``?:<`0%MK``"Z)P``O2,```NP!`!K(0F0($$J
+MD4!!(O8A2:('3$`A]D%)H0/!00(`043P_U_T#S#@0:'W0$'@_S_D2``^I"`!
+M84$``%ZG"``^I1``7J48`'ZE(`">I2@`OJ4P`-ZE.`#^I5``WB,!@/IK``"[
+M)P``O2/P_]XC``!>MP@`/K4)!/5'H;4A0@T`(/2AO2%"`@`@Y`8`(.8B`.##
+MH;4C0@T`(/2AU2-"$``@]!T`X,-X`S`@```TM!``/R`)`.##``!UHA$$\D<`
+M`%2FJ?]?TP``";`1`.##"!0P(```-+08`#\@```IL`P`X,,&`&#V!``_(```
+M-;```%2DM`,PH```(K`%`.##H95@0@`$_T<%`"#D```RH+0#,+`!`!\@`0#@
+MPP`$_T<``%ZG"``^I1``WB,!@/IK!``QH``$_T=X`"#D```RH```,;`$`#*@
+M"``QL`@`,J`,`#&P#``RH!``,;`0`#*@(O8A2/__/R"!%B1(H05!0`0`(/2A
+M\U]`@O0_1`$$XD<!`.##`@`_(!0`,;`4`#*@)/8A2/__/R"!%B1(H06!0!(`
+M(/0`!%\@HP."0`$`/R`8`#&PP@1D1`,$XD<!`#\@H0,B0`L`(.0!`%\@`01"
+M0`$T($0"!.%'(?8A2*$#(T#Z_S_T&`!1L`(`X,,4`#*@&``QL!@`,J`D]B%(
+M__\_(($6)$BA!8%`$@`@]``$7R"C`X)``0`_(!P`,;#"!&1$`P3B1P$`/R"A
+M`R)`"P`@Y`$`7R`!!$)``30@1`($X4<A]B%(H0,C0/K_/_0<`%&P`@#@P_\#
+M/R`<`#&P'``RH"-V($@(`&#DH?-A0"``4:`BEE](#P"?(,0$(T0!!.1'`00B
+M1`,`X,,@`#&@(98_2`%4(40@`#&P'``RH,)2($@(`$#DH?-!0(+T(40@`#&@
+M(78^2&)30$@"!$%$(`!1L`4`X,,@`%&@(G9>2`H`/R0!!$%$(``QL"``,J`D
+M`#&P)``RH"@`,;`H`#*@+``QL"P`,J`P`#&P!``RH*&5($`%`"#D!``QH"+V
+M(4BA-4!``0`@Y#@`4;`!`!\@`8#Z:P0`,J``!/]')``@Y`P`,J`(`#&P```R
+MH```,;`(`#*@!``QL`P`,J`(`#&P$``RH`P`,;`4`#*@$``QL!@`,J`4`#&P
+M'``RH!@`,;`@`#*@'`!1H"*67T@A=B!(`00B1!P`,;`@`%*@(78^2"*604@"
+M!$%$'`!1L"0`,J`@`#&P*``RH"0`,;`L`#*@*``QL#``,J`L`#&P`0`?(`&`
+M^FL``+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"@3P1PL$\4<``'VG`$!;
+M:P``NB<``+TC"03@1P`$_T<>`"#E%``IH($7(D@4`"#T$`3J1Q$$ZT?Z_%_3
+M(/8!2``$`$```#TD```A(`L$`4!H`VJG$`3J1Q$$Z4<`0%MK``"Z)P``O2,`
+M`"LLP0(K2``$`4`@%P9(@!<&2`<`X,,4`"F@P5(@2!@`2:#"$D!(`00B0"$7
+M)DB`%R9(``!>IP@`/J40`%ZE&`!^I2``WB,!@/IK``"[)P``O2.0_]XC``!>
+MMP@`/K40`%ZU&`!^M2``GK4H`+ZU,`#>M3@`_K4,!/!'4`#^MT``_K=8`/ZW
+M2`#^MPL$_T?@$S"@4P`@Y"'78$D-!(%!X`--(10`*J$A%R1)@1<F2$8`(/@0
+M!.Q'$03J1[_\7],/`.!#(?;A20$$(4```%TD``!"(`X$(D#)4B!)``!N+&``
+M?K3!`FY("00A06@#;*<0!.Q'$03J1P!`6VL``+HG``"](P`$"4`@%P9(@!<&
+M2.`#+:#!<"!(%``@X%@`7J2A"0)`*0`@Y%@`'K1H`VRG$`3L1Q$$ZD<`0%MK
+M``"Z)P``O2,4`"J@P5(@2``$`4!@`'ZDP0)N2"$%($`A%R9(@1<F2$@`/K08
+M`.##4`!>I*$)`D`5`"#D4``>M"GVX4D)!"E!``!])```8R`)!"-!:`-LIQ`$
+M[$<1!.I'`$!;:P``NB<``+TC%``JH,%2($@`!`%````I+,$"*4@A!2!`(1<F
+M2($7)DA``#ZT"S!@0>`3+*`A]B%((O9A2:$'(D"M_S_D"P3_1P`!OR$AUV!)
+M"02!0>`#22$4`"J@@1<B2!,`(/AH`VRG$`3L1Q$$ZD<`0%MK``"Z)P``O2/@
+M`RF@P5(@2`$`+41(`'ZD`@0#0$``?J0`!`-`P`0B1!@`*J`AEC]((G8`2`($
+M0408`$JP"S!@0:']9T'D_S_T``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE,`#>
+MI3@`_J5P`-XC`8#Z:P``NR<``+TC```PH"%V($@!,%\@H0<B0```720``*(@
+M`@`@]```/20``*$@`P3_1V0`GR`"!&-``@1%0```(BS!`B)(`@`R3"$%@4`!
+M`#%,`@!!0$$$0D!A!2)`000A0$$&(D!A!R)`008A0&$%(D!A!R%`80<B0$$&
+M(D!A!R%``00A0`$$(D"!MR1(@O=#2"(%(D```#,L00(S2&(#4T@"!$%$``!3
+M/`(`<R(#,&!`H5UA0-__/_0!@/IKH?4_0O\`'R`2`"#T``!0H")V0$@",#\@
+MH@=!0$$$,4+`$B$@('8@2`D`0.2AUR="0@0Q0B(50B`@=D!(!``@Y$$$,4(!
+M!"%`[!,A("!V($@``.!#`8#Z:Z'U/T+_`!\@"@`@]```,*`A=B!(`C!?(*$'
+M(D!@"5$@('9`2`(`(/3\"#$@('8@2```X$,!@/IK``"[)P``O2/`_]XC``!>
+MMP@`/K40`%ZU&`!^M2``GK4H`+ZU"03P1PT$\4<``#&@(78@2/\_7R"A!R)`
+M!P`@]"P`,:#!4B!(!``@Y!0`,:#!4B!(`0!?(-X`(.0``"V@(78@2`(P7R"A
+M!R)`+0`@]%`!7R$,!/]'=`$MH,%2($B^`"#D$03J1P$`*B`J=B!($0#Q0R@#
+M::<0!.E',`!>(@!`6VL``+HG``"](P($_T?(``#D`P2,00,$;4!@`:,@,``^
+M+#``7B#!`B)(@18A2`(`12QB`8,@0@)$2&$#)$@!!")$`@`E/#``/BPP`%X@
+MP0(B2`(`1"QD`6,@0@)#2&$!(T@!!")$`@`D/`Q0@$%T`2V@P5(@2*$-+$#9
+M_S_DE@#@PP$!7R$H`VFG$`3I1P`!/R(P`%XB`$!;:P``NB<``+TC`@3_1Z(`
+M`.0P`'XL,``^(,0"84B"-H%(8`$MH"%V/DAB4T!(`@1!1&`!3;"$5H!(,`!>
+M(,,"8D@CMV!(`1!L1`3PCT1A4R!(`00D1&0!+;`1!.I'`0`J("IV($@1`/%#
+M*`-IIQ`$Z4<2!.)'`$!;:P``NB<``+TC`@3_1X0``.0P`'XL,``^(,0"84B%
+M=H%(9`%-H,%20$@!!*%$(G9>2&%3($@!!")$9`$ML(26@$@P`%X@PP)B2$,6
+M8$`!$&]$!/"/1&%3($@!!"1$:`$ML!$$ZD<!`"H@*G8@2!$`\4,H`VFG$`3I
+M1Q($XD<`0%MK``"Z)P``O2,"!/]'9```Y#``?BPP`#X@Q`)A2(6V@4AH`4V@
+MP5)`2`$$H40B=EY(85,@2`$$(D1H`2VPA-:`2#``7B##`F)(`P1C0`'0;T0$
+M\(]$85,@2`$$)$1L`2VP$03J1P$`*B`J=B!($0#Q0R@#::<0!.E'$@3B1P!`
+M6VL``+HG``"](P($_T=$``#D,`">+#``/B##`H%(A?9A2&P!3:#!4D!(`02A
+M1")V7DAA4R!(`00B1&P!+;""%F%(@S9@2`'P;T0"\$]$85,@2`$$(D1P`2VP
+M,`!>(,0"@D@DUX!(`A"(1'0!+:`AEC]((G9`2`($041T`4VP$03J1R@#::<0
+M!.E',`!>(@!`6VL``+HG``"](P($_T<@``#D,``^+#``7B#!`B)(@58A2'0!
+M3:`!!")$(I9?2"%V($@!!")$=`$ML`P$_T=T`2V@P5(@2!$`(.0)!(Q!"00M
+M06`!:2$"`$LM8@$I(=$"24D0!.U'\?Y?TTH"24E@!PE(``0*1`(`"SP,,(!!
+M=`$MH,%2($BA#2Q`[_\_Y`$`7R``!.)'``!>IP@`/J40`%ZE&`!^I2``GJ4H
+M`+ZE0`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"03R1Q0`
+M42P4`#$@R@)!2`L$\4=P!4I!<`<00@$$2D$#`"$@@58@2!`$`4)0%`!"``!]
+MIP!`6VL``+HG``"](P$$_T=5``#D```)M`$$2D$#`"$@@58@2$$$($`0`"FT
+M"``IH"&6/T@!!$%%"``IL`<$_T=(`$#E!`#_(@,`WR((`.I#``"II`0$YT`%
+M!(5`$`!)I&$%YT!A!R%`000B0`0$BT```$0LPP)$2```02Q"`D%(8P-A2`,$
+M8D0``&$\```D+,(")$@``"4L00(E2&(#14@"!$%$``!%/`4$_T=A!>=`80<A
+M0$84($`0`$FD`@3"0$0$I4!$%(!``@2"0`0`0B```&(L0P)B2&$#HD@!!"-$
+M```B/!``*:0!!,%`!`2!0`8`A"```"0L00(D2```)#P%,*!`H7V@0.O_/_00
+M`(FD8@7G0&('0D!"%$!`!`1$0`8`9"P&`"0@0P)A2&$#X4H!!"-$!@`D/!``
+M*:0"!$%`0@!B+$(`(B!#`F%(80/!2@$$(T1"`"(\!S#@0*$)Z$"[_S_T`0`_
+M(``$X4<``%ZG"``^I1``7J48`'ZE(`#>(P&`^FOP_]XC%@!1+!8`,2#$`D%(
+M"``RH"%V/DAD4X!(!`2!1`@`DK"MWG\@``!>H"*67TAA$V!(`01!1"%V/DAC
+M4V!(`P0C1```?K`&!/]'!03_1\12@$B!!X5(#``@X*$]P$``!/]'9`$@Y`$$
+MYD<&,,!``00A0`$$/D```&$L0P)A2&(#H4@"!$-$``!!/`4PH$"A?:!`[_\_
+M]!0`,2P4`'$@"`!2H"*67TC!`B-(`00B1`@`,K`A=B!(``3_1TX!(.0'!/]'
+M"``RH"%V($A)`2#D`0`?):W>""$$`-\B`P#_(F,%YT!$!&=`!`2$0`0$)$(8
+M`,0@$`"RI&,'8T!#%&!`!01E0```)BS"`B9(```E+$$")4AB`T5(`@1!1```
+M13P0`#*D`P1A0!(`)BPJ`(0@P0(D2`(`0RP"`(,@0@)$2&$#)$@!!")$`@`C
+M/`4$_T=A!>=`80<A0$,4($`0`%*D`@1B0$$$I4!!!")`!@`A(```02Q"`D%(
+M``!!/`4PH$"A?:!`]?\_]```7J#!4D!(H04H0%T`(.0E=D!(9`7G0&0'A$!!
+M!*5`!`2!0!``,J1$!(%`!`"D(`(`12P&`"0@0@)!2&$#P4H!!")$`@`E/`(`
+M1BP"`"8@P0)!2`0`12P(`&0@0@)#2&$#(T@!!")$!``E/,$"(T@&`&8L!@!&
+M(,("8D@!!")`!@!%+`H`9"!"`D-(80,C2`$$(D0&`"4\P0(C2`H`9BP*`$8@
+MP@)B2`$$(D`(`$4L#`!D($("0TAA`R-(`00B1`@`)3S!`B-(#@!F+`X`1B#"
+M`F)(`00B0`H`12P.`&0@0@)#2&$#(T@!!")$"@`E/`0`1BP$`"8@P0)!2`P`
+M12P0`&0@0@)#2&$#(T@!!")$#``E/`@`1BP(`"8@P0)!2`X`12P2`&0@0@)#
+M2&$#(T@!!")$#@`E/`P`1BP,`"8@P0)!2!``12P4`&0@0@)#2&$#(T@!!")$
+M$``E/!``1BP0`"8@P0)!2!(`12P6`(0@0@)$2&$#)$@!!")$$@`E/+4`X,,0
+M`%*D9`7G0&0'A$!$%(!``@2"0```/J`A=B!(000A0$$$(D`(`"$@`@!F+`(`
+M1B##`F)(``!!+$("04AC`V%(`P1B1```83P0`%*D`@2"0```/J#!4B!(000A
+M0$$$(D`(`"$@``!A+$,"84@4`%\@8@-!2`($0T0``$$\$`!2I`($@D```#Z@
+MP5(@2$$$(4!!!")`"@`A(```82Q#`F%((P!?(&(#04@"!$-$``!!/!``4J0"
+M!()````^H,%2($A!!"%`000B0`P`(2```&$L0P)A2#\`7R!B`T%(`@1#1```
+M03P``#Z@)78@2$$$I4!%!"1`$``RI`4$H4`$`*4@`@!%+`(`)2!"`D%(80/!
+M2@$$(D0"`"4\!`!%+`0`)2#!`D%(!@!F+`8`1B#"`F)(`00B0`8`12P&`&4@
+M0@)#2&$#(T@!!")$!@`E/,$"(T@*`&8L"@!&(,("8D@!!")`"`!%+`@`92!"
+M`D-(80,C2`$$(D0(`"4\P0(C2`X`9BP.`$8@P@)B2`$$(D`*`$4L"@!E($("
+M0TAA`R-(`00B1`H`)3P$`$8L!``F(,$"04@,`$4L#`!E($("0TAA`R-(`00B
+M1`P`)3P(`$8L"``F(,$"04@.`$4L#@!E($("0TAA`R-(`00B1`X`)3P,`$8L
+M#``F(,$"04@0`$4L$`!E($("0TAA`R-(`00B1!``)3P0`$8L$``F(,$"04@2
+M`$4L$@!E($("0TAA`R-(`00B1!(`)3P``#Z@Q5(@2$$$I4!%!"1`$``RI`4$
+MH4`$`*4@`@!%+`(`)2!"`D%(80/A2@$$(D0"`"4\%`!&+!0`)B#!`D%(#`!%
+M+`P`92!"`D-(80,C2`$$(D0,`"4\%@!&+!8`)B#!`D%(#@!%+`X`92!"`D-(
+M80,C2`$$(D0.`"4\&`!&+!@`)B#!`D%($`!%+!``92!"`D-(80,C2`$$(D00
+M`"4\!S#@0`@`,J`A=B!(H0TG0+O^/^0!`!\@$`#>(P&`^FL``+LG``"](W#^
+MWB,``%ZW"``^M1``7K48`'ZU(`">M2@`OK4P`-ZU"@3P1PT$\4=0`7\A#@3_
+M1PP$_T>A-<!!/0`@]*$]P$$"`"#D!`#`Y6\`X,.A5<!!4@`@]&P`X,,4`"V@
+MP5(@2+4!(.2A/8%!:0`@Y!$$ZT<+,&!!*`-JIQ`$ZD=``%XB`$!;:P``NB<`
+M`+TC`03_1ZT!`.1``#XN0`!>(,$"(DH!\#]$6@`@Y`D$[$<,,(!!"00I00D$
+M(D$(`"DAT0(B2A'P/T80!.U'M/Q?TP``*2Q!`BE(8`<)2``$`40```D\0``^
+M+$``?B#!`B-(D18A2$<`(.8)!.Q'##"`00D$*4$)!"-!"``I(1`$[4>C_%_3
+M```I+$$"*4A@!PE(``0!1```"3RA/8%!T/\_]#@`X,,8`"V@P5(@2'\!(.0)
+M!/]'`00I00$$+4!4`6$L5`%!(,$"8DBA]3]`#``@]`$$[$<,,(!!`00A0$``
+MGB`!!"1`"``A(,,"8D@``$$L0@)!2&,#84@#!&)$``!A/`DP($&A72!!ZO\_
+M]!T`X,,<`"V@(78@2&0!(.0)!/]'`00I00$$+4!.`6$L3@%!(,$"8DBA]3]`
+M#``@]`$$[$<,,(!!`00A0$``GB`!!"1`"``A(,,"8D@``$$L0@)!2&,#84@#
+M!&)$``!A/`DP($&A72!!ZO\_]`(`X,,!!/]'3@'@PV@`'B(<`3\B``!]IP!`
+M6VL``+HG``"](WP`7BQ\`#X@0@)!2&$#@4D!!")$?``^/`D$_T<A`8#M`P0I
+M04``/B`#!&%`*`"#(`@`8R```",LP@(C2```)"Q!`B1(8@-$2`($040``$0\
+M804I04$$*4`!!"%`0`!>(`$$(D`X`($@``!#+,("0T@(`&0L0``A($,"84AB
+M`T%(`@1#1`@`1#P1!.M'"S!@02@#:J<0!.I'0`!>(@!`6VL``+HG``"](P$$
+M_T<<`0#D9`4I040$B4`$!(1`0`!^(`0$@T`X`*0@0``^+,("(T@"\%]$P0(C
+M2`$0,$2A`^%#(1<A2"$%04`,`$4L1`!D($("0TAA`R-(`00B1`P`)3Q``#XL
+M0`!>(,$"(DB"%B%(@?8A2"$7(4@A!4%`$`!%+$@`A"!"`D1(80,D2`$$(D00
+M`"4\$03K1PLP8$$H`VJG$`3J1T``7B(`0%MK``"Z)P``O2,!!/]'\0``Y&,%
+M*4%#!&E``P1C0$``GB`#!&1`.`"C($``/BS"`B1(`O!?1,$")$@!$#!$H0/A
+M0R$7(4@A!4%`%`!%+$P`@R!"`D1(80,D2`$$(D04`"4\2`"#($``/BQ``%X@
+MP0(B2((6(4B!]B%((1<A2"$%04`(`$0L4`!C($("0TAA`R-(`00B1`@`)#P1
+M!.M'"S!@02@#:J<0!.I'0`!>(@!`6VL``+HG``"](P$$_T?%``#D8P4I04,$
+M:4`#!&-`0`">(`,$9$`X`*,@0``^+,$")$@!\"-$#@!%+$8`@R!"`D1(80,D
+M2`$$(D0.`"4\0``^+$``7B#!`B)(@;8@2`'P(T02`$4L2@"#($("1$AA`R1(
+M`00B1!(`)3Q``#XL0`">(,$")$B!5B%(`?`C1!8`12Q.`&,@0@)#2&$#(T@!
+M!")$%@`E/!$$ZT<+,&!!*`-JIQ`$ZD<2!.1'`$!;:P``NB<``+TC`03_1Y8`
+M`.1C!2E!0P1I0`,$8T!``#X@`P1A0$@`HR!``#XL0`">(,(")$@"\%]$P0(D
+M2`$0,$2A`^%#(1<A2"$%04`,`$4L5`"#($("1$AA`R1(`00B1`P`)3Q``#XL
+M0`!>(,$"(DB"%B%(@?8A2"$7(4@A!4%`#@!%+%8`8R!"`D-(80,C2`$$(D0.
+M`"4\$03K1PLP8$$H`VJG$`3J1T``7B(`0%MK``"Z)P``O2,!!/]':@``Y&$%
+M*4%!!"E``00A0$``?B`%!"-`2`"%($``/BS"`B-(`O!?1,$"(T@!$#!$H0/A
+M0R$7(4@A!4%`$`!$+%@`92!"`D-(80,C2`$$(D00`"0\```MH"%V($@"0%\@
+MH0<B0!4`(/0(`$0L4``E(,$"04@*`$0L4@!E($("0TAA`R-(`00B1`H`)#PX
+M`(4@0``^+$``7B#!`B)(@18A2`'P)T0*`$0L0@!E($("0TAA`R-(`00B1!D`
+MX,-B!2E!0@1)0`($0D!``'X@`@1#0$@`HB!``#XLP0(C2(,6(4B!]B%((1<A
+M2"$%84`*`&4L4@""($,"9$AA`R1(`00C1`H`)3PX`((@"@!D+$(`0B!#`F)(
+M`0`_(&$#(D@!!"-$"@`D/`DP($&A"2Q!W_X_]`$$SD$!!"U`:`!!+&@`(2#!
+M`D%(?@!>+'X`?B!"`D-(80,C2`$$(D1^`#X\<@7.05(&34)H#5(B$`3J1V@`
+M/B)'_%_3`03_1PP``.1R!<Y!4@9-0F@-4B(0!.I':``^(K+\7],!!/]'!```
+MY`XPP$&A7<!!._X_]`$`/R``!.%'``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE
+M,`#>I9`!WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU"@3Q1PD$_T=A
+M!2E!008J0&@-`:8%``#F:`WAMP``?:<`0%MK``"Z)P``O2,),"!!H5T@0?3_
+M/_0``%ZG"``^I1``7J4@`-XC`8#Z:Q0`4"P4`#`@0@)!2&$'(4H!!")$%``P
+M/!8`4"P6`#`@Q`)!2`,P@$0"4(!$H@/B0Z$#XT,!`"$@PP1!1`&0@$2A`^%#
+M`@`@Y`$`(R`C=B!(`1"!1*$#X4,"`"#D`0`C("-V($@%!/]'(``@Y@8$XT<"
+M!*5``0120```82P"!%!`Q`)A2```8BQ#`F)(80."2`$$(T0``"(\806E0$$$
+M)4!A!25``00A0`$$,$`8`&$@``!#+$("0TAD`X-(!`2"1```@SP:`"$@``!A
+M+$,"84AB`\%(`@1#1```03P!`"4@)78@2*$#L4#A_S_T`8#Z:P``NR<``+TC
+M@/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M3``WK4X`/ZU#`3P1PT$\4=H
+M`%ZV<`!^M@X$]$</!/5'*W9@2@H$_T=2`(#F$03K1P$`*R`K=B!($0#Q0R@#
+M;*<0!.Q'0`!>(@!`6VL``+HG``"](P$$_T=-`P#D0``^+D``7B#!`B)*`?`_
+M1$$`(.0+`.#U"03J1P$`*B`J=B!("00I00D$(D$(`"DAT0(B2A'P/T80!.U'
+MAOI?TPP`X,,)!.I'`0`J("IV($@)!"E!0`!^(`D$(T$(`"DA0``^+-$"(T@1
+M\#]&$`3M1X_Z7],``"DL00(I2&`'"4@`!`%$```)/$``/BQ``%X@P0(B2)$6
+M(4@?`"#F"0#@]0D$ZD<!`"H@*G8@2`D$*4$)!")!"``I(1`$[4=F^E_3#`#@
+MPPD$ZD<!`"H@*G8@2`D$*4%``'X@"00C00@`*2%``#XNT0(C2I$6(4H0!.U'
+M;_I?TP``*2Q!`BE(8`<)2``$`40```D\(?9!22+VP4FA`R)`KO\_]&@`'J81
+M!.I'2`!>(EK_7],A]L%)@38@2'``7J0!!$%`*W8@2`H$_T=H`'ZD%``C+!0`
+M0R#!`B)(]P(@Y&$%2D%!!"I`804J0`$$(4!H`%ZD`01!0!@`(2$"`$DL&@`A
+M(,("04AW`$#D$03K1P$`*R`K=B!($0#Q0R@#;*<0!.Q'0`!>(@!`6VL``+HG
+M``"](P$$_T?A`@#D0``^+$``?B#!`B-(`?`C1`P`22P,`&D@0@)#2&$#(T@!
+M!")$#``I/$``/BQ``%X@P0(B2(&V($@!\"]$!`!)+`0`:2!"`D-(80,C2`$$
+M(D0$`"D\0``^+$``?B#!`B-(@98A2#P`22P\`&D@0@)#2&$#(T@!!")$/``I
+M/!$$ZT<!`"L@*W8@2!$`\4,H`VRG$`3L1T``7B(`0%MK``"Z)P``O2,!!/]'
+MM@(`Y$``/BQ``%X@P0(B2`'P)T04`$DL%`!I($("0TAA`R-(`00B1!0`*3Q`
+M`#XL0`!^(,$"(TB!UB!(`?`A1$0`22Q$`&D@0@)#2&$#(T@!!")$1``I/$``
+M/BQ``%X@P0(B2(%6(4@<`$DL'`!I($("0TAA`R-(`00B1!P`*3P1!.M'`0`K
+M("MV($@1`/%#*`-LIQ`$[$=``%XB`$!;:P``NB<``+TC`03_1XL"`.1``#XL
+M0`!^(,$"(T@!\"%$3`!)+$P`:2!"`D-(80,C2`$$(D1,`"D\0``^+$``7B#!
+M`B)(@98@2`'P)T0D`$DL)`!I($("0TAA`R-(`00B1"0`*3P"`"DL`@!)(,$"
+M(DBA-R!`DP`@]$``/BQ``'X@P0(C2(%6(4@!\"-$#@!)+`X`:2!"`D-(80,C
+M2`$$(D0.`"D\0``^+$``7B#!`B)(@?8A2`8`22P&`&D@0@)#2&$#(T@!!")$
+M!@`I/!$$ZT<!`"L@*W8@2!$`\4,H`VRG$`3L1T``7B(`0%MK``"Z)P``O2,!
+M!/]'4`(`Y$``7BQ``'X@P@)#2`+P1T0"!$)`!@")+`8`:2#!`H-(`01!1$0"
+M@TAA`R-(`00D1`8`*3Q``#XL0`!>(,$"(DB!UB!(`?`A1#X`22P^`&D@0@)#
+M2&$#(T@!!")$/@`I/$``/BQ``'X@P0(C2(%6(4@6`$DL%@!I($("0TAA`R-(
+M`00B1!8`*3P1!.M'`0`K("MV($@1`/%#*`-LIQ`$[$=``%XB`$!;:P``NB<`
+M`+TC`03_1R("`.1``#XL0`!>(,$"(D@!\"%$1@!)+$8`:2!"`D-(80,C2`$$
+M(D1&`"D\0``^+$``?B#!`B-(@98@2`'P)T0>`$DL'@!I($("0TAA`R-(`00B
+M1!X`*3Q``#XL0`!>(,$"(DB!5B%(`?`A1$X`22Q.`&D@0@)#2&$#(T@!!")$
+M3@`I/$``/BQ``'X@P0(C2('6(4@F`$DL)@!I($("0TAA`R-(`00B1"8`*3P1
+M!.M'`0`K("MV($@1`/%#*`-LIQ`$[$=``%XB`$!;:P``NB<``+TC`03_1^P!
+M`.1``%XL0``^(,("04@"\$%$0A1`0"8`B2PF`&D@P0*#2`$$041$`H-(80,C
+M2`$$)$0F`"D\,P#@PP(`*2P"`$D@P0(B2*$U($`N`"#D0``^+$``7B#!`B)(
+M@58A2`'P(414`$DL5`!I($("0TAA`R-(`00B1%0`*3Q``#XL0`!^(,$"(TB!
+MUB%(+`!)+"P`:2!"`D-(80,C2`$$(D0L`"D\$03K1P$`*R`K=B!($0#Q0R@#
+M;*<0!.Q'0`!>(@!`6VL``+HG``"](P$$_T>X`0#D0`!>+$``/B#"`D%(`O!!
+M1$(40$`L`(DL+`!I(,$"@T@!!$%$1`*#2&$#(T@!!"1$+``I/`(`*2P"`$D@
+MP0(B2*%7($![`"#T0``^+$``7B#!`B)(@98@2`'P(T00`$DL$`!I($("0TAA
+M`R-(`00B1!``*3Q``#XL0`!^(,$"(TB!-B%("`!)+`@`:2!"`D-(80,C2`$$
+M(D0(`"D\$03K1P$`*R`K=B!($0#Q0R@#;*<0!.Q'0`!>(@!`6VL``+HG``"]
+M(P$$_T>%`0#D0``^+$``7B#!`B)(`?`A1$``22Q``&D@0@)#2&$#(T@!!")$
+M0``I/$``/BQ``'X@P0(C2(&6($@!\"=$&`!)+!@`:2!"`D-(80,C2`$$(D08
+M`"D\0``^+$``7B#!`B)(@58A2`'P(41(`$DL2`!I($("0TAA`R-(`00B1$@`
+M*3Q``#XL0`!^(,$"(TB!UB%((`!)+"``:2!"`D-(80,C2`$$(D0@`"D\$03K
+M1P$`*R`K=B!($0#Q0R@#;*<0!.Q'0`!>(@!`6VL``+HG``"](P$$_T=/`0#D
+M0`!>+$``/B#"`D%(`O!!1$(40$`@`(DL(`!I(,$"@T@!!$%$1`*#2&$#(T@!
+M!"1$(``I/$``/BQ``%X@P0(B2(&6($@!\"%$4`!)+%``:2!"`D-(80,C2`$$
+M(D10`"D\0``^+$``?B#!`B-(@18A2`'P)T0H`$DL*`!I($("0TAA`R-(`00B
+M1"@`*3P;`.##`@`I+`(`22#!`B)(H54@0!8`(.1``#XL0`!>(,$"(DB!EB!(
+M`?`A1%8`22Q6`&D@0@)#2&$#(T@!!")$5@`I/$``/BQ``'X@P0(C2($6(4@!
+M\"=$+@!)+"X`:2!"`D-(80,C2`$$(D0N`"D\`@`I+`(`22#!`B)(H7<@0,\`
+M(/1``#XL0`!>(,$"(DB!UB%($@!)+!(`:2!"`D-(80,C2`$$(D02`"D\$03K
+M1P$`*R`K=B!($0#Q0R@#;*<0!.Q'0`!>(@!`6VL``+HG``"](P$$_T?U``#D
+M0`!>+$``?B#"`D-(`O!`1$(40$`2`(DL$@!I(,$"@T@!!$%$1`*#2&$#(T@!
+M!"1$$@`I/$``/BQ``%X@P0(B2(%V($@!\"]$"@!)+`H`:2!"`D-(80,C2`$$
+M(D0*`"D\0``^+$``?B#!`B-(@58A2`'P(41"`$DL0@!I($("0TAA`R-(`00B
+M1$(`*3Q``#XL0`!>(,$"(DB!UB%(&@!)+!H`:2!"`D-(80,C2`$$(D0:`"D\
+M$03K1P$`*R`K=B!($0#Q0R@#;*<0!.Q'0`!>(@!`6VL``+HG``"](P$$_T>\
+M``#D0`!>+$``?B#"`D-(`O!!1$(40$`:`(DL&@!I(,$"@T@!!$%$1`*#2&$#
+M(T@!!"1$&@`I/$``/BQ``%X@P0(B2(&6($@!\"%$2@!)+$H`:2!"`D-(80,C
+M2`$$(D1*`"D\0``^+$``?B#!`B-(@18A2`'P)T0B`$DL(@!I($("0TAA`R-(
+M`00B1"(`*3Q``#XL0`!>(,$"(DB!UB%(4@!)+%(`:2!"`D-(80,C2`$$(D12
+M`"D\$03K1P$`*R`K=B!($0#Q0R@#;*<0!.Q'0`!>(@!`6VL``+HG``"](P$$
+M_T>#``#D0`!>+$``?B#"`D-(`G!`1$(40$!2`(DL4@!I(,$"@T@!!$%$1`*#
+M2&$#(T@!!"1$4@`I/$``/BQ``%X@P0(B2(%6($@!\"=$*@!)+"H`:2!"`D-(
+M80,C2`$$(D0J`"D\0``^+$``?B#!`B-(@18A2`'P(41:`$DL6@!I($("0TAA
+M`R-(`00B1%H`*3Q``#XL0`!>(,$"(DB!EB%(,@!)+#(`:2!"`D-(80,C2`$$
+M(D0R`"D\$03K1P$`*R`K=B!($0#Q0R@#;*<0!.Q'0`!>(@!`6VL``+HG``"]
+M(P$$_T=*``#D0`!>+$``?B#"`D-(`G!`1"*70$@R`(DL,@!I(,$"@T@!!$%$
+M1`*#2&$#(T@!!"1$,@`I/#,`X,,"`"DL`@!)(,$"(DBA=2!`+@`@Y$``/BQ`
+M`%X@P0(B2('6(4A8`$DL6`!I($("0TAA`R-(`00B1%@`*3P1!.M'`0`K("MV
+M($@1`/%#*`-LIQ`$[$=``%XB`$!;:P``NB<``+TC`03_1R$``.1``%XL0`!^
+M(,("0T@"<$!$0A1`0%@`B2Q8`&D@P0*#2`$$041$`H-(80,C2`$$)$18`"D\
+M0``^+$``7B#!`B)(@58@2`'P)T0P`$DL,`!I($("0TAA`R-(`00B1#``*3P!
+M`"H@*G8@2&@`?J04`",L%`!#(,$"(DBA!RI`"?T_Y`$`/R``!.%'``!>IP@`
+M/J40`%ZE&`!^I2``GJ4H`+ZE,`#>I3@`_J6``-XC`8#Z:Q0`42P4`#$@P0)!
+M2!0`4"P4`'`@0@)#2&$#(T@!!")$%``P/!8`4"P6`#`@Q`)!2`,P@$0"4(!$
+MH@/B0Z$#XT,!`"$@PP1!1`&0@$2A`^%#`@`@Y`$`(R`C=B!(`1"!1*$#X4,"
+M`"#D`0`C("-V($@(!/]'%``Q+!0`42#!`B)(40`@Y!D$XT<6`.1#!`#_(@4`
+MGR,8!.)'`@0(00$$44```&$L`@100,0"84@``&(L0P)B2&$#@D@!!"-$```B
+M/&$%"$%!!"A`804H0`$$(4`!!#!`&`!A(```0RQ"`D-(9`.#2`0$@D0``(,\
+M'``A(```82Q#`F%(8@,A2P($0T0``$$\!P3_1P0$_T=A!0A!000H0&$%*$`&
+M!"%`806$0$$&)D`%!#!`'@!E(```0RQ"`D-(80>#2`$$(D0``",\@0?$2@\`
+M(.`@`&4@```C+$$"(TAB`^-*`@1!1```0SP!`"<@)W8@2*$UX$`,`"#D0@)#
+M2&$#@TL!!")$```C/`<`X,-A!81`008F0`$$,$`@`"$@``!!+$("04@``$$\
+M`0`D("1V($BA=X!`V_\_]`$`*"`H=B!(%``Q+,$".$BA!RA`M/\_Y`&`^FOP
+M_]XCK=Y_(```/J`AEC](8A-@2`($(D0B=EY(85-@2`$$040``#ZP!`!>H"*6
+M7TAA$V!(`01!1"%V/DAC4V!(`P0C1`0`?K`5!/]'%@!2+!8`,B`7!/]'`P"_
+M(,0"04@B!;=`@0>"2`H`(.`!!/5'%3"@0B'V(4@!!"%``00^0```82Q#`F%(
+M8@-!2`($0T0``$$\`0`W(#=V($BA=^!"[_\_]!0`42P4`#$@P0)!2!0`4BP4
+M`'(@0@)#2&$#(T@!!")$%``R/!D$_T?!`B-(;0`@Y&$%.4-!!#E`804Y0`$$
+M(4`"!"%"&``"(P$$,D`8`"$@``!8+,,"6$@``$$L0@)!2&,#84@#!&)$``!A
+M/!<$_T=5`*#F804Y0T$$.4!A!3E```0A0#SVH4H%!/="`02^0```02S"`D%(
+M8@5"0$(&0$`"!%)`'@#B(`4$N$`.`&4@_O\C+$$/(TB!%R9(010@0`X`9RPL
+M`((@0P)D2&$#)$@!!"-$#@`G/`0`I2```"4LP0(E2`0`9RPB`((@0P)D2&$#
+M)$@!!"-$!``G/`$`'R$"`"<L(`!"(,$"(DBA-R!`*``@]`(`QR($!`A!!`2'
+M0`X`I"`,`,0@0P0700,$8T`#!'A`-@!#(/[_(BQ!#R)(@1<F2`$$(4```$8L
+MP@)&2`($(D```"4L00(E2&(#14@"!$%$``!%/`0`I"`"`(0@#`!C(```)"S!
+M`B1(``!#+,("0T@!!")```!%+$("14AA`R5(`00B1```)3P!`"@@*'8@2`(`
+M)RS!`C9(H0<H0-G_/^0!`#<@-W8@2"'VX4JA`SQ`L/\_]`$`.2`Y=B!(%``R
+M+!0`4B#!`B)(H0<Y0)/_/^0!`!\@$`#>(P&`^FL``+LG``"]([#_WB,``%ZW
+M"``^M1``7K48`'ZU(`">M2@`OK4P`-ZU#03P1PH$\4<``#TD```A(```82P'
+M`$$L!/`@1,,&84A"#T%(@A2`1`,$8D1``'ZT#@3_1Q0$'R(``'VG`$!;:P``
+MNB<``+TC"03@1Z$``.30`"J@+'8@2!0`*J#!4B!(-``@Y!`$X$<4!#\B``!]
+MIP!`6VL``+HG``"](V@`*J`6`$DL%@!I($("0TAA`R-(`00B1!8`*3P0!.U'
+M$03J1Q($Z4<3!.Q'"@"?(A4$_T<[^U_3@0``Y&@-:B%H`"J@%@!++'X-:B!"
+M`D-(80,C2`$$(D06`"L\$`3K1Q$$Z4>E_E_3$`3M1Q$$Z4<2!.M'%/]?TW$`
+M`.0:`"DL&@!)(,$"(D@!!"%`0`!>(`$$(D#^_R$@``!!+,,"04@4`"DL%`!)
+M(,$"(D@!`"-,`00L0`RP($`8`"J@P5(@2#8`(.00!.E'%`0_(@``?:<`0%MK
+M``"Z)P``O2-H`"J@P5(@2!8`22P6`&D@0@)#2&$#(T@!!")$%@`I/!`$[4<1
+M!.I'$@3I1Q,$[$<$`)\B`0"_(@/[7]-)``#D?!%J(6@`*J#!4B!(%@!++)(1
+M:B!"`D-(80,C2`$$(D06`"L\$`3K1Q$$Z4=L_E_3$`3M1Q$$Z4<2!.M'V_Y?
+MTS@``.0:`"DL&@!)(,$"(D@!!"%`0`!>(`$$(D#^_R$@``!!+,,"04@4`"DL
+M%`!)(,$"(D@!`"-,`00L0`Q0($`<`"J@(78@2"4`(.00!.E'%`0_(@``?:<`
+M0%MK``"Z)P``O2-L`"J@%@!)+!8`:2!"`D-(80,C2`$$(D06`"D\$`3M1Q$$
+MZD<2!.E'$P3L1P0`GR("`+\BR_I?TQ$``.20%6HA;``JH!8`2RRF%6H@0@)#
+M2&$#(T@!!")$%@`K/!`$ZT<1!.E'-?Y?TQ`$[4<1!.E'$@3K1Z3^7],!``#D
+M`0#?(04`(.40!.E'``!]IP!`6VL``+HG``"](P`$[D<``%ZG"``^I1``7J48
+M`'ZE(`">I2@`OJ4P`-ZE4`#>(P&`^FL``+LG``"]([#_WB,``%ZW"``^M1``
+M7K48`'ZU(`">M2@`OK4P`-ZU.`#^M0L$\$<,!/%'```QH"%V($C_/U\@H0<B
+M0`8`(/0L`#&@P5(@2*$U($`"`"#D7_A?TPP`X,,``"R@(78@2/]/7R"A!R)`
+M"0`@]"P`+*#!4B!(H54@0`4`(.00!.M'$03L1Q7_7],!!.!'1P'@PPT$_T<`
+M`"R@(78@2`(P7R"A!R)`4`%?(?[00B#*!")$H36@00T`(/2A/:!!`@`@Y`0`
+MH.4=`.##H56@01$`(/0:`.##"K!`070!+*#/4B!(>`$L(6(!+"`2`.##&``L
+MH,%2($@I`2#D"O!&08`#+*`O=B!(/@0L(8@#3"!(`%ZT#`#@PQP`+*`A=B!(
+M'P$@Y`K02$&``RR@+W8@2*(#+"&"`RP@2``^M`(`X,,!!/]'&@'@PPX$_T<4
+M`>#E`03.04@`7J0!!")```!!+,("04@``"DL00(I2&(#24@"!$%$``!)/!$$
+MZD<*,$!!*`-KIQ`$ZT=``%XB`$!;:P``NB<``+TC`03_1P0!`.1``#XL0`!>
+M(,$"(DB!5B%(!`!)+`0`:2!"`D-(80,C2`$$(D0$`"D\0``^+$``7B#!`B)(
+M@98@2`'P)T0"`$DL`@!I($("0TAA`R-(`00B1`(`*3Q``#XL0`!>(,$"(DA!
+M%"!``9`G1!X`22P>`&D@0@)#2&$#(T@!!")$'@`I/!$$ZD<*,$!!*`-KIQ`$
+MZT=``%XB`$!;:P``NB<``+TC`03_1]H``.1``%XL0``^(,("04B"UD%('@")
+M+!X`:2#!`H-(`01!1$0"@TAA`R-(`00D1!X`*3Q``#XL0`!>(,$"(DB!%B%(
+M`?`G1"``22P@`&D@0@)#2&$#(T@!!")$(``I/$``/BQ``%X@P0(B2(%6($@!
+M\"=$(@!)+"(`:2!"`D-(80,C2`$$(D0B`"D\0``^+$``7B#!`B)((9<@2`$0
+M)D0D`$DL)`!I($("0TAA`R-(`00B1"0`*3P1!.I'"C!`02@#:Z<0!.M'0`!>
+M(@!`6VL``+HG``"](P$$_T>C``#D0`!>+$``/B#"`D%(@I9!2"0`B2PD`&D@
+MP0*#2`$$041$`H-(80,C2`$$)$0D`"D\0``^+$``7B#!`B)(@=8@2`'P)T0F
+M`$DL)@!I($("0TAA`R-(`00B1"8`*3Q``#XL0`!>(,$"(D@!\"=$*`!)+"@`
+M:2!"`D-(80,C2`$$(D0H`"D\$03J1PHP0$$H`VNG$`3K1T``7B(`0%MK``"Z
+M)P``O2,!!/]'>```Y$``/BQ``%X@P0(B2(%6(4@J`$DL*@!I($("0TAA`R-(
+M`00B1"H`*3Q``#XL0`!>(,$"(DB!EB!(`?`G1"P`22PL`&D@0@)#2&$#(T@!
+M!")$+``I/$``/BQ``%X@P0(B2$$4($`!D"=$+@!)+"X`:2!"`D-(80,C2`$$
+M(D0N`"D\$03J1PHP0$$H`VNG$`3K1T``7B(`0%MK``"Z)P``O2,!!/]'3@``
+MY$``7BQ``#X@P@)!2(+604@N`(DL+@!I(,$"@T@!!$%$1`*#2&$#(T@!!"1$
+M+@`I/$``/BQ``%X@P0(B2($6(4@!\"=$,`!)+#``:2!"`D-(80,C2`$$(D0P
+M`"D\0``^+$``7B#!`B)(@58@2`'P)T0R`$DL,@!I($("0TAA`R-(`00B1#(`
+M*3P"`"DN`@`I(-$"(4H$`$DN!``I(-("04H(`&DB$`3L1^;S7],$!/]'!@`I
+M+`8`22`%!.)'P0(B2!0`(.0"!(1``@1)0!X`8B`@`$(@_O\B+$$/(DB!%R9(
+M000A0$$$(4`"!"%````C+$$"(TAB`T-(`@1!1```0SP$,(!`!@`I+,$")4BA
+M#21`[/\_Y#0`*2$.,,!!`0#O0Z$)P4'L_C_T#3"@0:%=H$&[_C_T`0`_(``$
+MX4<``%ZG"``^I1``7J48`'ZE(`">I2@`OJ4P`-ZE.`#^I5``WB,!@/IK``"[
+M)P``O2.@_]XC``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU,`#>M3@`_K4/!/!'
+M#`3Q1U``_K<``"R@(78@2/\_7R"A!R)`!``@]"0`+*`A=B!(+;$J0`<`X,,`
+M`"R@(78@2`(P7R"A!R)`4`&_(?[00B#-!")$4`!^I*$U8$`-`"#TH3U@0`<`
+M(.0-L*I!"``_(%@`/K3<!&PAV@3,(1@`8.05`.##4`!>I*%50$`)`"#T$0#@
+MPQ@`+*#!4B!(#;"L00(`?R!8`'ZT3@5L(4P%S"$'`.##'``LH"%V($@-,*U!
+M`P!?(%@`7K0N!6PA+`7,(0,`(/3&`.##`03_1\H`X,,``"XL00(N2```+CQ(
+M`/ZW6`!^I+X`8.01!.U'#3"@02@#;Z<0!.]'0`!>(@!`6VL``+HG``"](P$$
+M_T>Z``#D```LH"%V($@",%\@H0<B0`4`(/1``#XL0`!^(,$"(TB!%B%(!`#@
+MPT``/BQ``%X@P0(B2($V(4@(`$LL"`!K($("0TAA`R-(`00B1`@`*SP(`$LM
+M"``K(=$"24F5`"#F4`!^I`8`8/00!.Q'>/-?TT$"24E@!PE(``0!1`@`X,,(
+M`$LM"``K(=$"24D0!.Q'A?-?TTH"24E@!PE(``0*1`@`"SP``"R@(78@2`(P
+M7R"A!R)`$0`@]$``/BQ``'X@P0(C2(%6($@!\"=$!@!++`8`:R!"`D-(80,C
+M2`$$(D0&`"L\0``^+$``7B#!`B)((9<@2`$0)D00`.##0``^+$``?B#!`B-(
+M@78@2`'P)T0&`$LL!@!K($("0TAA`R-(`00B1`8`*SQ``#XL0`!>(,$"(DA!
+M%B!``1`G1`0`2RP$`&L@0@)#2&$#(T@!!")$!``K/!$$[4<-,*!!*`-OIQ`$
+M[T=``%XB`$!;:P``NB<``+TC`03_1UL``.0``"R@(78@2`(P?R"A!R-`(0`@
+M]$``7BQ``#X@P@)!2(*604@$`(LL!`!K(,$"@T@!!$%$1`*#2&$#(T@!!"1$
+M!``K/$``/BQ``%X@P0(B2('6($@!\"=$`@!++`(`:R!"`D-(80,C2`$$(D0"
+M`"L\0``^+$``?B#!`B-(`?`G1```2RQ"`DM(80,K2`$$(D0``"L\(0#@PT``
+M7BQ``#X@P@)!2(*V04@$`(LL!`!K(,$"@T@!!$%$1`*#2&$#(T@!!"1$!``K
+M/$``/BQ``%X@P0(B2('V($@!\"=$`@!++`(`:R!"`D-(80,C2`$$(D0"`"L\
+M0``^+$``?B#!`B-(@38@2`+P)T0``"LL00(K2&(#2T@"!$%$``!+/```3BS!
+M`DY(`0`A($("3DAA`RY(`00B1```+CP*`&LA2``^I`$P($!(`#ZT6`!>I*$)
+M(D!"_S_T4`!^I`,P8$!0`'ZTH5U@0`3_/_0!`#\@``3A1P``7J<(`#ZE$`!>
+MI1@`?J4@`)ZE*`"^I3``WJ4X`/ZE8`#>(P&`^FL``+LG``"](Z#_WB,``%ZW
+M"``^M1``7K48`'ZU(`">M2@`OK4P`-ZU.`#^M0X$\$</!/%'9`6Q(0``,:`A
+M=B!(_S]?(*$'(D`%`"#T)``QH"%V($@:`"$@#`#A0P<`X,,``#&@(78@2`(P
+M7R"A!R)`OP&?(0$`(.1O`9\A2`#^MP0!+Z`A=B!(A0$@Y$@`7J0!!$)``00O
+M0`8!02P&`2$@P@)!2`D`0/0``"^@(78@2`(P7R"A!R)``Q"!00+P@$$,!.-'
+MS`0B1&P!X,,``"^@(78@2`(P7R"A!R)`3@`@]`L$_T<1!.Q'##"`02@#;J<0
+M!.Y'0`!>(@!`6VL``+HG``"](P$$_T=F`0#D0P9M04``GBQ``%X@P0*"2((6
+M(4@``",L00(C2&(#0T@"!$%$``!#/`@`8R!``#X@P@*!2```(RQ!`B-(8@%#
+M2`($040``$,\"U!@0:']8$'A_S_T"P3_1Q$$[$<,,(!!*`-NIQ`$[D=``%XB
+M`$!;:P``NB<``+TC`03_1T8!`.1#!FU!0`#>+$``7B#%`L)(@1:A2`'P)T0"
+M`$,L`@"#($("1$AA`R1(`00B1`(`(SR%UJ%(!3"@1`0`H[`(`(,@0`!>(,$"
+MPD@!\"=$`@!$+`H`8R!"`D-(80,C2`$$(D0"`"0\0``^+$``7B#!`B)(`1`H
+M1*$#X4,$`"2P"U!@0:']8$'4_S_T]`#@PQ$$[$<,,(!!*`-NIQ`$[D=``%XB
+M`$!;:P``NB<``+TC`03_1QD!`.1``)XL0``^(,,"@4@``$V@(I9?2($V84@!
+M!")$```ML(-68$@(`"V@(98_2`/P;T0#!&%$"`!ML$``7B#$`H)()+>`2`(0
+MC$00`"V@(98_2")V0$@"!$%$$`!-L!$$[$<,,(!!*`-NIQ`$[D=``%XB`$!;
+M:P``NB<``+TC`03_1_@``.1``)XL0``^(,,"@4B!=F%($`!-H`$$(D0BEE](
+M(78@2`$$(D00`"VP@Y9@2!@`+:`AEC](`_!O1`,$8408`&VP0`!>(,0"@DA$
+M%H!``A"/1"``+:`AEC]((G9`2`($040@`$VP$03L1PPP@$$H`VZG$`3N1T``
+M7B(`0%MK``"Z)P``O2,!!/]'U0``Y$``GBQ``#X@PP*!2(&V84@@`$V@`00B
+M1"*67T@A=B!(`00B1"``+;"#UF!(*``MH"&6/T@#\&]$`P1A1"@`;;!``%X@
+MQ`*"2`0$A$`"T(]$,``MH"&6/T@B=D!(`@1!1#``3;`1!.Q'##"`02@#;J<0
+M!.Y'0`!>(@!`6VL``+HG``"](P$$_T>R``#D0`">+$``/B##`H%(@?9A2#``
+M3:`!!")$(I9?2"%V($@!!")$,``ML((684@X`"V@(98_2`+P3T0"!$%$.`!-
+ML(-68$@"\&=$```MH"%V/DAB4T!(`@1!1```3;!``%X@Q`*"2"27@$@"$(9$
+M"``MH"%V/DAB4T!(`@1!1`@`3;`1!.Q'##"`02@#;J<0!.Y'0`!>(@!`6VL`
+M`+HG``"](P$$_T>(``#D0`"^+$``/B##`J%(A)9A2`@`3:#!4D!(`02!1")V
+M7DAA4R!(`00B1`@`+;"#UF!(`O!G1!``+:`A=CY(8E-`2`($0400`$VP0`!>
+M(,$"HD@!\"=$&`!-H")V7DAA4R!(`00B1!@`+;`1!.Q'##"`02@#;J<0!.Y'
+M0`!>(@!`6VL``+HG``"](P$$_T=D``#D0`">+$``/B##`H%(@E9A2"``+:`A
+M=CY(8E-`2`($040@`$VP@Y9@2`+P9T0H`"V@(78^2&)30$@"!$%$*`!-L$``
+M7B#$`H)(1!2`0`*0AT0P`"V@(78^2&)30$@"!$%$,`!-L!$$[$<,,(!!*`-N
+MIQ`$[D=``%XB`$!;:P``NB<``+TC`03_1T$``.1``'XL0``^(,,"84B$UF%(
+M,`!-H,%20$@!!(%$(G9>2&%3($@!!")$,``ML(,684@"\&=$.``MH"%V/DAB
+M4T!(`@1!1#@`3;`+!/]'2`!>I`$$0D`!!"]```%!(%``7K0&`2$@6``^M$H&
+M;4$``"J@%P`@Y%``7J0&`"(L6`!>I,$"(D@!\"!$HA4@0*%U($`"!$%$!0!`
+MY```*BW1`BI)$`3O1SWQ7],%`.##2@9M00``*BW1`BI)$`3O1TWQ7]-)`BI)
+M8`<*2``$"40```H\"S!@0:']8$'C_S_T0`"M(4@`/J0!,"!`2``^M`0!+Z`A
+M=B!(2`!>I*$-(D![_C_D`0`_(``$X4<``%ZG"``^I1``7J48`'ZE(`">I2@`
+MOJ4P`-ZE.`#^I6``WB,!@/IK``"[)P``O2.P_]XC``!>MP@`/K40`%ZU&`!^
+MM2``GK4H`+ZU,`#>M3@`_K4,!/!'"P3Q1R@`4:`B=EY(#P`_)`$$040H`#&P
+M+``QH"&6/T@!]"%$+``QL```,:`A=B!(`C!?(*$'(D`&`"#T```])```X2$$
+M`3&@(98_2`$4)$0%`.##```])```X2$$`3&@(98_2`$4(D0$`2NP```OHB@#
+M;*<0!.Q'0`!>(@!`6VL``+HG``"](T@`_K<,!@#D0``^+$``7B#$`B)(@O:!
+M2`0`*Z`A=CY(8E-`2`($040$`$NP@=:!2`(P($0(`"N@(78^2&-30$@#!&%$
+M"`!KL()V@4B!EH!(`?`O1`+P0$1A4R!(`00B1`P`*[```"N@(78@2/\_7R"A
+M!R)`!0`@]`$0@42A`^%#(I9_2`$$(D0#`.##"``KH"&6/T@!-"!$"``KL$``
+MGBQ``#X@PP*!2`*08$2B`^)#'``KH"&6/T@"!$%$'`!+L`-08$2C`^-#&``K
+MH"%V/D@C%V)(`P1A1!@`:[!``%X@P0*"2`$P($04`$N@(G9>2&%3($@!!")$
+M%``KL`0`3Z$1!.I'"C!`02@#;*<0!.Q'0`!>(@!`6VL``+HG``"](T@`_K?$
+M!0#D0`!^+$``GB#!`F1(@18A2!P`2Z`B=E](85$@2`$$(D3"`F1((?8^2&)Q
+M0$@"!$%$'`!+L```*Z`A=B!(_S]?(*$'(D!2`"#T$03J1PHP0$$H`VRG$`3L
+M1Q($Y$<`0%MK``"Z)P``O2-(`/ZWJ`4`Y$``GBQ``#X@PP*!2(+684@L`"N@
+M(78^2&)30$@"!$%$+`!+L(&V84@!,"!$R``KL(.684@#,&!$S`!KL$``7B##
+M`H)(,`!+H"*67TC_#S\@`0`C1`$$(D0P`"NP$03J1PHP0$$H`VRG$`3L1T``
+M7B(`0%MK``"Z)P``O2-(`/ZWAP4`Y$``?BQ``#X@Q`)A2"0`2Z`BEE](_P\_
+M(`$`)$0!!")$)``KL(/6@4@",&!$(``KH"'V/DAB<4!(`@1!1"``2[```"N@
+M(78@2/]/7R"A!R)`$@`@]`I00$$H`VRG$`3L1Q$$ZD=``%XB`$!;:P``NB<`
+M`+TC2`#^MV@%`.1``#XL0`!^(,$"(TC0`$N@(I9?2(&6($@!!")$T``KL`T$
+M_T=!!*]!"`!!H1$$ZD<*,$!!*`-LIQ`$[$=``%XB`$!;:P``NB<``+TC2`#^
+MMU,%`.0$!*U!!`2+0#``I"!``#XL0`!>(,$"(DB!%B%(`?`O1`(`12PR`&0@
+M0@)#2&$#(T@!!")$`@`E/$``/BQ``'X@P0(C2(%6($@!\"=$"`!%+#@`9"!"
+M`D-(80,C2`$$(D0(`"4\<`!D($``/BQ``%X@P0(B2"&7($@!$"9$!`!#+'0`
+MA"!"`D1(80,D2`$$(D0$`",\$03J1PHP0$$H`VRG$`3L1T``7B(`0%MK``"Z
+M)P``O2-(`/ZW)`4`Y`4$K4$%!*M`<`#%($``7BQ``'X@P@)#2(*604@$`(8L
+M=`!E(,$"@T@!!$%$1`*#2&$#(T@!!"1$!``F/'8`A2!``#XL0`!>(,$"(DB!
+MUB!(`?`G1`0`1"QZ`&4@0@)#2&$#(T@!!")$!``D/'P`92!``#XL0`">(,$"
+M)$@!\"=$!`!#+(``I2!"`D5(80,E2`$$(D0$`",\$03J1PHP0$$H`VRG$`3L
+M1Q($Y$<`0%MK``"Z)P``O2-(`/ZW]`0`Y`0$K4$$!(M`@@"D($``/BQ``%X@
+MP0(B2(%6(4@$`$4LA@!D($("0TAA`R-(`00B1`0`)3R(`*0@0``^+$``?B#!
+M`B-(@98@2`'P)T0$`$4LC`!D($("0TAA`R-(`00B1`0`)3R.`&0@0``^+$``
+M7B#!`B)(010@0`&0)T0$`$,LD@"$($("1$AA`R1(`00B1`0`(SP1!.I'"C!`
+M02@#;*<0!.Q'0`!>(@!`6VL``+HG``"](T@`_K?%!`#D!02M004$JT".`,4@
+M0`!>+$``?B#"`D-(@M9!2`0`ABR2`&4@P0*#2`$$041$`H-(80,C2`$$)$0$
+M`"8\E`"%($``/BQ``%X@P0(B2($6(4@!\"=$!`!$+)@`92!"`D-(80,C2`$$
+M(D0$`"0\F@"%($``/BQ``'X@P0(C2(%6($@!\"=$!`!$+)X`92!"`D-(80,C
+M2`$$(D0$`"0\H`!E($``/BQ``)X@P0(D2"&7($@!$"9$!`!#+*0`I2!"`D5(
+M80,E2`$$(D0$`",\$03J1PHP0$$H`VRG$`3L1Q($Y$<`0%MK``"Z)P``O2-(
+M`/ZWB`0`Y`4$K4$%!*M`H`#%($``7BQ``#X@P@)!2(*604@$`(8LI`!E(,$"
+M@T@!!$%$1`*#2&$#(T@!!"1$!``F/*8`A2!``#XL0`!>(,$"(DB!UB!(`?`G
+M1`0`1"RJ`&4@0@)#2&$#(T@!!")$!``D/*P`92!``#XL0`">(,$")$@!\"=$
+M!`!#++``I2!"`D5(80,E2`$$(D0$`",\$03J1PHP0$$H`VRG$`3L1Q($Y$<`
+M0%MK``"Z)P``O2-(`/ZW6`0`Y`,$JT%0`(,@0``^+$``7B#!`B)(@18A2`8`
+M1"Q6`&,@0@!#2&$!(T@!!")$!@`D/*$UH$$:`"#TH3V@00(`(.0$`*#E40#@
+MPZ%5H$$?`"#T*`#@PT``?BQ``)X@P0)D2(*V($B!5B!(`?`@1`+P0$1A4R!(
+M`00B1/``*[##`F1(`P1C0`+08$3L`"N@(98_2")V0$@"!$%$[`!+L!4`X,-`
+M`#XL0`!^(,("(TB"ED!(P0(C2`'P($0"\$!$85,@2`$$(D3T`"NP"@#@PT``
+M/BQ``)X@P@(D2(*60$C!`B1(`?`@1`+P0$1A4R!(`00B1/@`*[`E`*#U$03J
+M1PHP0$$H`VRG$`3L1T``7B(`0%MK``"Z)P``O2-(`/ZW$`0`Y$``GBQ``#X@
+MPP*!2(+V84CL`"N@`@1!1(&684@!\"!$(G9`2&%3($@!!")$[``KL((V84B!
+MUF!(`?`@1`+P0$1A4R!(`00B1.@`*["#=F!(0`!>(,$"@D@!\"!$`_!@1&%3
+M($@!!"-$Y``KL!$$ZD<*,$!!*`-LIQ`$[$=``%XB`$!;:P``NB<``+TC2`#^
+MM^L#`.0#!*U!`P1K0#``HR!``#XL0`">(,$")$B!%B%(#@!%+#X`@R!"`D1(
+M80,D2`$$(D0.`"4\0`"#($``/BQ``%X@P0(B2`0`1"Q$`&,@0@)#2&$!(T@!
+M!")$!``D/!$$ZD<*,$!!*`-LIQ`$[$=``%XB`$!;:P``NB<``+TC2`#^M\H#
+M`.0#!*U!`P1K0$``HR!``#XL0`">(,$")$B!%B%("@!%+$H`@R!"`D1(80,D
+M2`$$(D0*`"4\4`!C($``/BQ``)X@P@(D2```(RQ!`B-(8@%#2`($040``$,\
+M$03J1PHP0$$H`VRG$`3L1Q($Y$<`0%MK``"Z)P``O2-(`/ZWJ@,`Y`,$JT%0
+M`(,@0``^+$``7B#!`B)(@18A2`D`1"Q9`&,@0@!#2&$!(T@!!")$"0`D/`($
+MK4$"!$M`4`"B($``/BQ``)X@PP(D2`P`)2Q<`((@00(D2&(!9$@"!$%$#`!%
+M/,$"1$@!$#!$"``@Y,$"1$@!^#]$`0`A("$!X4-"`D1(80,D2`$$(D0,`"4\
+M$03J1PHP0$$H`VRG$`3L1T``7B(`0%MK``"Z)P``O2-(`/ZW?0,`Y`0$K4$$
+M!(M`8`"D($``/BQ``%X@P0(B2(&V($@"`$4L8@!D($("0TAA`2-(`00B1`(`
+M)3Q``#XL0`!^(,$"(TB!-B!(`?`A1`@`12QH`&0@0@)#2&$#(T@!!")$"``E
+M/$``/BQ``%X@P0(B2`$P($0.`$4L;@"$($("1$AA`R1(`00B1`X`)3P``"N@
+M(78@2/\_7R"A!R)`&0`@]`,`H.6A5:!!#``@]!4`X,-``#XL0`!^(,$"(TB!
+MMB%(`C`@1"0`*Z`A=CY(8E-`2`($040D`$NP"@#@PT``/BQ``)X@P0(D2(&V
+M(4@","!$*``KH"&6/T@B=D!(`@1!1"@`2[```"N@(78@2`(P7R"A!R)`3@`@
+M]!$$ZD<*,$!!*`-LIQ`$[$=``%XB`$!;:P``NB<``+TC2`#^MRX#`.0"!*U!
+M`@1+0+``@B!``#XL0`!^(,$"(TB!UB!(`?`O1`8`9"RV`$(@0P)B2&$#(D@!
+M!"-$!@`D/*$UH$$'`"#TH3V@00(`(.0H`*#E,`#@PZ%5H$$2`"#T+0#@PT``
+M?BQ``)X@P0)D2`'P($3\`$N@(I9?2"%V($@!!")$_``KL,,"9$B#=F!(``$K
+MH"&6/T@#\&!$`P1A1``!:[`<`.##0`!^+$``7B#!`F)(`?`@1/P`2Z`B=EY(
+M85,@2`$$(D3\`"NP0`">(,,"9$B#=F!(`O!@1``!*Z`A=CY(8E-`2`($040`
+M`4NP"0#@PT``/BQ``%X@P0(B2`'P)T00`$N@(G9>2&%3($@!!")$$``KL```
+M*Z`A=B!(`S!?(*$'(D!4`"#T`@2M00($2T"P`((@0``^+$``?B#!`B-(@;8A
+M2`P`9"R\`$(@0P)B2&$#(D@!!"-$#``D/!$$ZD<*,$!!*`-LIQ`$[$=``%XB
+M`$!;:P``NB<``+TC2`#^M\X"`.0#!*U!`P1K0+``HR!``%XL0`">(,("1$A"
+M%D!``A!'1`P`A2R\`&,@P0*#2`$$041$`H-(80,C2`$$)$0,`"4\H56@01,`
+M(.1``#XL0`!>(,,"(DB"=F!((``KH"%V/TAB44!(`@1!1"``2[```"N@(78@
+M2`5`7R"A!R)`!0`@]"P`2Z`BEE](@79A2`$$(D0L`"NP)@"@]0``*Z`A=B!(
+M_S]?(*$'(D`A`"#T0`!^+$``GB##`F1(@19A2`+P)T1$`2N@(78^2&)30$@"
+M!$%$1`%+L(-V8$@"\&-$2`$KH"%V/DAB4T!(`@1!1$@!2[`/`.##`@2M00($
+M2T"P`((@#`!D++P`0B!#`F)("@`_(&$#(D@!!"-$#``D/"``2Z`B=E](#P`_
+M)`$$040@`"NP```KH"%V($C_/U\@H0<B0(L!(/2A-:!!!P`@]*$]H$$"`"#D
+M(@&@Y84!X,.A5:!!0``@]((!X,,1!.I'"C!`02@#;*<0!.Q'0`!>(@!`6VL`
+M`+HG``"](T@`_K=J`@#D0``^+4``/B#1`B%)$?`_1A`$ZT=9[5_35`$KH"&6
+M/T@.!`%$5`'+L4``7B#)`B))B18A21`$ZT<1!.E'3^U?TR%VWDD@%P)(``0!
+M1%0!"[`1!.I'*`-LIQ`$[$=``%XB`$!;:P``NB<``+TC2`#^MTT"`.1``#XM
+M0`!^(-$"(TD1\#]&$`3K1SSM7]-8`2N@(98_2``$`418`0NP```KH"%V($@`
+M0%\@H0<B0$P!(/1``)X@P0(D28$6(4C$`$N@(I9?2`'P)T0!!")$Q``KL$,!
+MX,,1!.I'"C!`02@#;*<0!.Q'0`!>(@!`6VL``+HG``"](T@`_K<K`@#D0``^
+M+4``/B#1`B%)$?`_1A`$ZT<:[5_33`$KH"%V/D@@%P)(``0!1$P!"[!``%X@
+MR0(B28D6(4D0!.M'$03I1P_M7]-0`2N@(98_2``$`410`0NP$03J1PHP0$$H
+M`VRG$`3L1T``7B(`0%MK``"Z)P``O2-(`/ZW#`(`Y$``?BQ``)X@P0)D2`'P
+M+T00`$N@(I9?2"%V($@!!")$$``KL,,"9$B#]F!(%``KH"&6/T@#\&=$`P1A
+M1!0`:[`1!.I'"C!`02@#;*<0!.Q'$@3D1P!`6VL``+HG``"](T@`_K?R`0#D
+M0``^+4``/B#1`B%)$?`_1A`$ZT?A[%_34`$KH"%V/D@@%P)(``0!1%`!"[``
+M`"N@(78@2`!`7R"A!R)`"0`@]$``7B#!`B))@18A2`+P)T3$`"N@(78^2&)3
+M0$@"!$%$Q`!+L!$$ZD<*,$!!*`-LIQ`$[$=``%XB`$!;:P``NB<``+TC2`#^
+MM\\!`.1``'XL0`">(,$"9$B!MB!(2`%+H"*67T@!\"=$`00B1$@!*[#!`F1(
+M`?`C1$P!2Z`BEE]((78@2`$$(D1,`2NP```KH"%V($@!0%\@H0<B0,@`(/01
+M!.I'"C!`02@#;*<0!.Q'$@3D1P!`6VL``+HG``"](T@`_K>P`0#D0`!^+$``
+M/B#"`F%(*``KH"%V/DAB44!(`@1!1"@`2[```"N@(78@2/]/7R"A!R)`L0`@
+M]$``7B##`F)(@19A2`+P+T34`"N@(78^2&)30$@"!$%$U`!+L(+V84C8`"N@
+M(78^2&)30$@"!$%$V`!+L!$$ZD<*,$!!*`-LIQ`$[$=``%XB`$!;:P``NB<`
+M`+TC2`#^MXH!`.1``)XL0`!^(,("@T@"\$-$`@1"0-@`:Z#!4F!(`01!1"-V
+M?DAA4R!(`00C1-@`*[!``#X@Q`*!2(&V@$@"\"=$X``KH"%V/DAB4T!(`@1!
+M1.``2[""=H%(W``KH"&V/TAB,4!(`@1!1-P`2[`1!.I'*`-LIQ`$[$=``%XB
+M`$!;:P``NB<``+TC2`#^MV8!`.1``)XL0`!^(,("@T@BMT!(W`!KH,$P8$@!
+M!$%$([9_2&$Q($@!!"-$0`!>(,0"@DB"=H!((?8^2&)Q0$AB`.##```KH"%V
+M($@`0%\@H0<B0%\`(/01!.I'"C!`02@#;*<0!.Q'0`!>(@!`6VL``+HG``"]
+M(T@`_K='`0#D0`!^+$``GB#!`F1(`?`G1,``2Z`B=EY(85,@2`$$(D3``"NP
+M```KH"%V($C_3U\@H0<B0$<`(/3#`F1(@M9@2-0`*Z`AEC](`O!/1`($0434
+M`$NPV``KH"&6/TB#MF%(`P1A1-@`:[`1!.I'"C!`02@#;*<0!.Q'$@3D1P!`
+M6VL``+HG``"](T@`_K<C`0#D0`!^+$``7B#!`F)(`?`@1$$6($#8`$N@`00B
+M1"*67T@A=B!(`00B1-@`*[!``)X@PP)D2()V8$C@`"N@(98_2`+P1T0"!$%$
+MX`!+L-P`*Z`!\3]$@S9A2`,$843<`&NP$03J1R@#;*<0!.Q'$@3D1P!`6VL`
+M`+HG``"](T@`_K<"`0#D0`!^+$``7B#!`F)((?<@2-P`2Z`!!")$`O%?1`'P
+M/T0!!")$0`">(,,"9$B"-F!((78_2&)10$@"!$%$W`!+L`TPH$&A7:!!D/L_
+M]```*Z`A=B!(`C!?(*$'(D`U`"#D*`-LIQ`$[$?L`#\B0`!>(@!`6VL``+HG
+M``"](T@`_K?A``#D0`!^+$``7B#!`F)(`?`@1/P`2Z`BEE]((78@2`$$(D3\
+M`"NP0`">(,,"9$B#=F!(``$KH"&6/T@#\&!$`P1A1``!:[`H`VRG$`3L1^T`
+M/R(2!.1'`$!;:P``NB<``+TC2`#^M\<``.1``'XL0`!>(,$"8D@!\"!$_`!+
+MH")V7DAA4R!(`00B1/P`*[!``)X@PP)D2(-V8$@"\&!$``$KH"%V/DAB4T!(
+M`@1!1``!2[!@`2N@(98_2`&4($1@`2NP`0`_)`$T($1<`2NP6`$KH"%V/DA8
+M`2NP%`!/H0T$_T<$`2N@(78@2"8`(.01!.I'"C!`02@#;*<0!.Q'0`!>(@!`
+M6VL``+HG``"](T@`_K><``#D`P2M00,$:T```:,@0``^+$``7B#!`B)(@18A
+M2`8`12P&`8,@0@)$2&$#)$@!!")$!@`E/`(!@R!``#XL0`!>(,$"(D@&`$0L
+M"`%C($("0TAA`2-(`00B1`8`)#P-4*!!!`$KH"%V($BA#2U`VO\_Y```*Z`A
+M=B!(`E!?(*$'(D`M`"#T#03_1R@#;*<0!.Q'$03J1T``7B(`0%MK``"Z)P``
+MO2-(`/ZW<0``Y$,$JT&``X,@0``^+$``7B#!`B)(#@!$+(X#8R!"`D-(80,C
+M2`$$(D0.`"0\$;!`02@#;*<0!.Q'0`!>(@!`6VL``+HG``"](T@`_K==``#D
+M0P2K08(#@R!``#XL0`!>(,$"(D@.`$0LD`-C($("0TAA`R-(`00B1`X`)#P*
+M,$!!#3"@0:&=H$'4_S_T```KH"%V($@",%\@H0<B0`L`(.0!`'\D__]?("/1
+M9D!A4T!(`01A1%P`*[!@`"N@(98_2&(30$@"!")$8`!+L```*Z`A=B!(`C!?
+M(*$'(D`'`"#D'``_)`'T(41$`"NP2``KH"&6/T@!E"-$2``KL```*Z`A=B!(
+M_S]?(*$'(D`$`"#T*`-LIQ`$[$?*`#\B`P#@PR@#;*<0!.Q'SP`_(D``7B(`
+M0%MK``"Z)P``O2-(`/ZW(```Y!@`*Z`AEC](0`!>+$``GB##`D1(`P1A1!@`
+M:[`4`(N@P5*`2!0`(/0``"N@(78@2/\_7R"A!R)`!P`@](%V84@!,"!$(G:>
+M2&%3($@!!")$%``KL`@`X,,8`"N@(78@2(+V(4@4`"N@(78^2&)30$@"!$%$
+M%`!+L`$`/R!(`#ZT2``>I```7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WJ4X
+M`/ZE4`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4)!/!'"@3Q1[+Y
+M7],!!/]'$P``Y!`$Z4<1!.I'[.I?TP$$_T<.``#D$`3I1Q$$ZD=F]5_3`03_
+M1PD``.00!.E'$03J1]GV7],!!/]'!```Y!`$Z4<1!.I'ZO=?TP$$X$<`!.%'
+M``!>IP@`/J40`%ZE(`#>(P&`^FL``+LG``"](_#_WB,``%ZW```QH"%V($C_
+M/U\@H0<B0`4`(/0L`#&@P5(@2*$U($`!`"#DF>]?TP``7J<0`-XC`8#Z:P``
+M<*`A=F!(``"1H")V@$BA!2)`"0`@Y,%28$@@=B!(`0!?)/#!0B`#``)$P5*`
+M2`$`(D0@!6%`!0#@PP``,*`@=B!(```QH"%V($@@!0%```#@0P&`^FNX`S"@
+M`0`?)/^_`"````%$('8`2`&`^FL"!/]'00900```(:0`!/]'!``@]`(P0$"A
+M/4!`^?\_]`$`'R`!@/IK``"[)P``O2/P_]XC``!>M^O_7]."]@%(`P3_1P``
+M/20``($@#P!`X/]_/R````%$```])```@2!!!&-`000D0```02S"`D%(H@5`
+M0`$`/R`/`$#T`S!@0*%7<$#V_S_T"@#@PR&W8$@!!"1```!!+,("04BB!4!`
+M`0`_(`0`0/0#,&!`H5=I0/;_/_0!!/]'``3A1P``7J<0`-XC`8#Z:P``NR<`
+M`+TC\/_>(P``7K<(`#ZU"03Q1P$`'R`B`"#FO_]?TP0$X$>"]@%(__\_)/]_
+M(2`!``%$`0#A0Z`%(4$9`$#P_P$_(*$%@4"B%8!``00B1`$`'R`3`"#T`P3_
+M1P``/20``*$@001C0$($)4```"(LP0(B2*$%*4`&`"#D`@`B+`(`0B#!`B)(
+MH04D0`$`'R`$`"#T`S!@0*%7<$#Q_S_T``3_1P``7J<(`#ZE$`#>(P&`^FL`
+M`+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"@3Q1PL$\D<@`W"G`$!;:P``
+MNB<``+TC"0#@0P%0*$4#`"#D"``JH`)1*$6)!")$`1`D10,`(.0,`"J@`A$D
+M18D$(D0!$"%%`P`@Y`0`*J`"$2%%B00B1`0`(.$@``LB@/]?TP$Q($7)!`%$
+M``3I1P``7J<(`#ZE$`!>I1@`?J4@`-XC`8#Z:P``NR<``+TC8/_>(P``7K<(
+M`#ZU$`!>M1@`?K4*!/!'"P3_1Q`$\4<W`$#3"03@1PP``.00!.I'$03@1P$`
+M7R9__U(B(`!^(IH`0-,%``#D$`3J1Q$$Z4<@`%XBP?]?TPL`X$,`!.M'``!>
+MIP@`/J40`%ZE&`!^I:``WB,!@/IK``"[)P``O2/P_]XC``!>MP@`/K4)!/!'
+M2O]?TP``X$.A50)`"@`@]*%=`D`"`"#D"0``Y`T`X,,!_B`@!@`@Y`$`/R1*
+M@R$@H04!0`<`(.0!`!\@!@#@P[@#*:#!4B!(MOPA(`$`'R`!`"#D``3_1P``
+M7J<(`#ZE$`#>(P&`^FL``+LG``"](P,$_T<``#TD``"!($($8T!"!$1````B
+M+,$"(DBA!3!```3B1P0`(/0#,&!`H5=P0/;_/_0`!/]'`8#Z:P``NR<``+TC
+MX/_>(P``7K<(`#ZU$`!>M1G_7],*!.!'@?8!2`8`(.#_?S\A"0`)1!`$Z4?C
+M_U_3`03I1Q,``/0#!/]'```])```@2`AMV!(`@0D0```(BS!`B)(H04J0`8`
+M(.08`"(L&`!"(,,"(D@!!.-'!0!@]$L`?R`#,&!`H5=I0/'_/_0!!/]'``3A
+M1P``7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/P_]XC``!>MP0$\4<"!/]'
+M```])```82`A]T!($00C0```,2S!`C%(H04P0`D`(.0&`(#D$`3D1X``7R(`
+M`'VG`$!;:P``NB<``+TC`0`?(`0`X,,",$!`H1=&0.[_/_0`!/]'``!>IQ``
+MWB,!@/IK``"[)P``O2,`!/]'#@``Y@,$_T<``#TD``"!("&W8$@!!"1```!!
+M+,("04BB!5!``0`?(`0`0/0#,&!`H5=I0/;_/_0`!/]'`8#Z:P``NR<``+TC
+ML/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M3``WK4X`/ZU0``>M@L$\4<,
+M!/)'#03S1P\$_T<.!/]'2`#^MP``,:`A=B!(#@`@]+#^7],)!.!'(1<&2`H`
+M(.@*`.!#$`3J1Q$$_T>T_U_3`P``]!`$ZD?/_U_3`@``Y!`$Z4<"`.##```K
+MH-!2($@A5@!*2@`@]`0$_T<`!/]'```])```82`AMX!(`@0C0```(BS!`B)(
+MH04P0`(`(.0.!.)'`0`?(`0P@$"A5XE`HA4`0`$`(D3S_S_T`03_1TD``.0!
+M$)!%!``@]```+J#04B!("``NH"_V(4@!$)!%!``@Y`0`+J`P=B!(#``NH"_V
+M(4@$!/]'``3_1P``/20``*$@00:$0$,$)4```",LP0(C2*$%,$`)`"#D0``^
+MI(@#0:`B]D%(!``CH"'V(4BB!4%``@!`Y$@`?K0!`!\@!#"`0*$W@$"B%0!`
+M`0`B1.S_/_02``#D`1"010<`(/1(`%ZD"``BH"'V(4@/`.%%#``BH"'V(4@/
+M!.%%`1"010<`(.1(`%ZD$``BH"'V(4@/`.%%%``BH"'V(4@/!.%%$03M1U[_
+M7],``.!#`03_1PT``.00`"VD$`!.I`$`(D00`"VT```KH,%2($@A5B!(H14@
+M0*(#[T,!`")$`0`@Y!@`[;$!`#\@``3A1P``7J<(`#ZE$`!>I1@`?J4@`)ZE
+M*`"^I3``WJ4X`/ZE4`#>(P&`^FN!]P=*@58G2`$$`4*!UR!((M<@2#`!`D(!
+M`!\@(`<02$$&,4```"&D```!1*`#X$,!@/IK&P!@YB'V(4H$!.%'`P3_1PH`
+M(.0!!`-"``!!+,(`04BA!5-`$@`@]`0`0.0#,&!`(?9A2*$#)$#V_S_T(?9A
+M2"+V(4JA!2)`"0`@]`,$`T(``$,L0@!#2&$'8TH!!")$```C/```,J`!`"$@
+M```RL`&`^FL``+LG``"](_#]WB,``%ZW"``^M1``7K48`'ZU(`">M2@`OK4P
+M`-ZU.`#^M0H$\$</!/%'#03R1X@!?K:0`9ZVF`&^MA@"/J`I=B!((`(^H"%V
+M($B@`3ZT*`*>H3`"/J"H`3ZT6!M?(+@!7K3@`]`A"P3_1P+^7],!!/]']0$`
+MY!`$ZD?._E_3N`,JH"%V/D@@%P)(``0!1+@#"K#`4@!(#```]!`$ZD<1!.E'
+M'/Y?TP$$_T?G`0#D_S\_(`(`(46X`RJ@(78^2&)30$@"!$%$N`-*L!`$ZD?'
+M`T#3N`,*HM!2`$JE_E_3"03@1P$$_T?8`0#D$`3J1Q$$X$<!`%\F?_]2(D``
+M?B('_U_3`03_1]`!`.00!.I'$03I1X``7R+``'XB`/]?TP$$_T?)`0#D2``^
+MI`&P($3+-"!$2``^I`%0($3+5"!$O`,JH"'V(4@B]F%)H04B0`$`(/2\`VJQ
+M$`3J1Q$$Z4=``%XB&OY?TP``X$.P`1ZT`P"`]1``*:`A=B!(N`$^M`P$_T>A
+M%ZA!C10H1)`#*J2"MB)(`C!`1-@!7K2!UB)(`3`@1-`!/K0``#TD```A(1@`
+M*2"A`R%!10$@Y```22S!`DE(H`%^I`$`840Z`2#DP0))2+`!GJ0!`"1$(?8A
+M2#4!(.0"`"DN`@`I(-$"(4H8`VJG$`3J1T(!7B)``7XB`$!;:P``NB<``+TC
+M*@$`Y```*2S"`BE(H95`0"8`(/2AG4!`!0`@Y*$U0$`8`"#TH55`0`L`(/0?
+M`>##H15$0#,`(/2A'41``P`@Y*$504`D`"#T&`'@PZ$52$`U`"#T%0'@PT``
+M/B#H`3ZT<`!>(.`!7K0``#TD```A(/@!/K1``#Z@P5`@2`%T($0S`.##0`!^
+M(.@!?K1@`)X@X`&>M```/20``"$@^`$^M$``/J#!4"!(*@#@P\``/B#H`3ZT
+M$`%>(.`!7K0``#TD```A(/@!/K3``#Z@P5`@2`$T($0>`.##P`!^(.@!?K0@
+M`9X@X`&>M```/20``"$@^`$^M,``/J#!4"!(`50@1!,`X,/``#X@Z`$^M#`!
+M7B#@`5ZT```])```(2#X`3ZTP``^H`@`X,-``'X@Z`%^M(``GB#@`9ZT```]
+M)```(2#X`3ZT0``^H,%0($@!E"!$`?`_1,@!/K3@`1ZF-_U?T](``/3``?ZW
+MP`$>IN`!/J;T_E_3R```Y,`!7J0AMT!(^`%^I`$$84#P`3ZT&`!AHA/P?T:0
+M`1ZFF`$^IA`"7J;U_E_3\`&>I```)*`K=B!(P5(@2*$#*T"W`"#TJ`$^I*$5
+M($```CZT0`%>H,%20$BA!RM`IP`@Y"%V0$BA`RM`I``@]/`!7J0$`&*@PE!@
+M2*%504#8`9ZD`0$D1)T`(/2AM4!`T`%>I`$!(D29`"#TP7!@2`$$*T"!-B!(
+MN`%^I`)084"A#2)`D@`@Y"'V@4DB]J%)H0,B0*(`(.3P`9ZD$``DI('V)T@`
+M`EZD`0!!1(@`(/3H`7ZD&``CH`$0,$0#`"#DC`,JH*'5($"!`"#T2`$>(D``
+M/R(``'VG`$!;:P``NB<``+TC`@!)+`(`*2#!`D%(8U,@2`,$8T5(`7ZP\`&>
+MI`0`)*#"4"!(H;5`0`H`(/2A54%`$``@Y,%28$@`0%\@`01!1")V?DAA4R!(
+M`00B1$@!/K`(`.##2`$^H,)2($@`@'\@`@1B1"%V/DAB4T!(`@1!1$@!7K#P
+M`3ZD!`!!H$P!/J`AMC](8C%`2`($041,`5ZP\`%>I`0`(J#","!(8`$^H"%V
+M/TAB44!(`@1!1&`!7K#H`7ZD&``CH&0!/K#(`9ZD:`&>L/`!7J00`"*D$`!#
+MI`$`(D0%`"#D2`$^H,)2($@``G\@`@1B1`0`X,-(`3Z@PE(@2/_]?R`"`&)$
+M(78^2&)30$@"!$%$2`%>L/`!?J0(`".DZ`&>I`@`1*0!`")$!``@Y$P!/J`!
+M\3]$`50@1`(`X,-,`3Z@`?$_1$P!/K#P`5ZD"``BI.@!?J0(`$.D`0`B1`%0
+M($0&`"#D3`%>H`$4040"\5]$`?`_1`$$(D1,`3ZPZ`&>I!@`)*`!$"A$!@`@
+MY$P!7J`!E$!$`O%?1`'P/T0!!")$3`$^L`$$[$<,,(!!(=<@2`$$+D!(`5ZD
+M``!!M%`!7J0(`$&T6`%>I!``0;1@`5ZD&`!!M&@!7J0@`$&T<`%>I"@`0;1X
+M`5ZD,`!!M(`!7J0X`$&T\`%>I`0`(J#!<"!(`00K0"MV($@``"*@P5(@2*$#
+M*T!,_S_DP`%^I`,P8$#``7ZTH?UO0"__/_0$`"DA```])```(2`8`"$@H0,A
+M0;O^/_14`(#E(?:!2:$7*$",%"A$$0#L0Q`$[D=``%\B``!]I@P!0-/@$XJQ
+M!@3_1R@`@.U%!L]`)-?`2`0$CD```"0LP@(D2```)2Q!`B5(8@-%2`($040`
+M`$4\`@!$+`(`)"#!`D%(`@!%+`(`92!"`D-(80,C2`$$(D0"`"4\!`!$+`0`
+M)"#!`$%(!`!%+`0`92!"`$-(80$C2`$$(D0$`"4\!0`D+`4`A"#!`"1(!0!%
+M+`4`92!"`$-(80$C2`$$(D0%`"4\!C#`0*$)S$#8_S_T$@#L0V`#:J<0!.I'
+M$03O1P!`6VL``+HG``"](P8$_T<8`(#M)-?`2`0$CD!%!L]`!@!%+`8`)2#!
+M`$%(!@!$+`8`9"!"`$-(80$C2`$$(D0&`"0\!P`E+`<`I2#!`"5(!P!$+`<`
+M9"!"`$-(80$C2`$$(D0'`"0\!C#`0*$)S$#H_S_TB`&>I```A+&X`RJ@PE(@
+M2"@`*J`AEC]((G9`2`($040H`$JPH0/L0P`$X4<``%ZG"``^I1``7J48`'ZE
+M(`">I2@`OJ4P`-ZE.`#^I1`"WB,!@/IK`@!1+`(`,2#&`D%(`0!_)/#!8R`&
+M`,-$Z!.0I`P`@.0``*2@(G:@2```,2S!`C%(H@5!0`8`0.3!4J!((G8@2`$`
+M0T0!`.%#H04F0!4`(/3@`[`@X!,0HB(``.8``/$L`0#?)O#!UB((!/9'@3<`
+M2B'7($@$!*%`P@+Q2```9*`A=F!((0%!0!$`(/3!4F!((G8@2`$`5D0!`.%#
+MH04F0`<`(.0$`"2@`P`@X`%00$0`!/]'#``@]``$Y$<!@/IK```DH,%2($@!
+M`"A$(0'!0`(`(.Q``*0@,#$`0I`W`$KB_Q_V``3_1P&`^FL``+LG``"](_#_
+MWB,``%ZW"``^M0D$\D>^_U_3`03_1P@``.08`""@(1<E2($7)T@!!"%`(04A
+M02$7)TB!%R=(@1@@1``$X4<``%ZG"``^I1``WB,!@/IK``"[)P``O2/@_]XC
+M``!>MP@`/K40`%ZU&`!^M0D$\$<*!/%'_P!_(;@#,*#!4B!()@`@](_[7],`
+M$!Y$H!4,0`0``/00!.E'BOM?TV?^`"`>``#T`@`J+`(`2B#!`B)(`1`T1*$5
+M-$#A`'\A)P`@]`(`*BP"`$H@P0(B2`$0.D2A%3A`X@!_(2``(/0"`"HL`@!*
+M(,$"(D@!$#I$H14Z0.0`?R$9`"#T`@`J+`(`2B#!`B)(4`%?(`(`042P_D(@
+MXP!_(<L47$00`.##$`3I1Q$$ZD=Y_U_3#```Y"``8*$"`"HL`@!*(,$"(D@!
+M$#A$H14X0`4`(.0!\&%%H34@0`(`(.0!\6%%"U0@1``$ZT<``%ZG"``^I1``
+M7J48`'ZE(`#>(P&`^FL``+LG``"](_#_WB,``%ZW8/]?TP$$_T<#``#D'``@
+MH`&0($2A`^%#``3A1P``7J<0`-XC`8#Z:P``NR<``+TCL/_>(P``7K<(`#ZU
+M$`!>M1@`?K4@`)ZU*`"^M3``WK4X`/ZU#03R1T``?K8,!/!'(?9!2@X$`4+_
+M_S$@#P#A0R'V(4@J`"#D(?9!2D@`/K0*!.Y'H0?,01\`(/0K]J%)*05+01`$
+MZ4<1!.I'0`!^IP!`6VL``+HG``"](Q8``.P$!.I'!0#M0P``22S#`$E(```D
+M+,$`)$A"`$E(80$I2`$$(D0``"D\`0`I(0``)"Q!`"1(8P=D2`,$840``&0\
+M`0"$("4QH$#O_[_T*@5+0:$'3$'B_S_D2``^I`X$P4'__R\@#P#A0R'V(4C8
+M_S_T``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE,`#>I3@`_J50`-XC`8#Z:P``
+MNR<``+TCT/_>(P``7K<(`#ZU$`!>M0D$\$<H`W"GP0`_(B(`7B(`0%MK``"Z
+M)P``O2,!!/]'(```Y"``/J#!4B!(_S]?(*$'(D#*`#\BT?0Y1"@#::<0!.E'
+M(`!>(@!`6VL``+HG``"](P$$_T<2``#D(@`^+"(`7B#!`B)(_S]?(*$'(D`&
+M`"#T(``^+"``7B#!`B)(@7<A2`$P($0$`.##(``^+"(`7B!!#R)(@?8G2/03
+M*;#T$RF@``3A1P``7J<(`#ZE$`!>I3``WB,!@/IK``"[)P``O2/P_]XC``!>
+MMP@`/K4)!/!'P?I?TP``X$.A%0E`(@`@]*$="4`(`"#DH3T(0`0`(.2A&0A`
+M'``@Y!,``.0=`.##H74(0`X`X,,!`#\DC8$A(*$-`4`'`"#D`0`_)(B!(2"A
+M"0%`$``@Y+;_(""A5R!``P#@PP$`/R2/@2$@H04!0`P`(.0(`.##N`,IH,)2
+M($AX_B(@!P`@Z'/^(B`"`"#L<?XB(`,`(/00!.E'G_]?TP$`X,,`!/]'``!>
+MIP@`/J40`-XC`8#Z:P``NR<``+TCT/_>(P``7K<(`#ZU$`!>M1@`?K4+!/!'
+M"03Q1PH$\$<H`W"GP0`_(B``7B(`0%MK``"Z)P``O2,J``#D!`3_1P``/20`
+M`*$@806$0`$$(4`#!"5````C+,$"(TBA!2E`'0`@Y"``7BP@`#X@P@)!2`)0
+M/R"B!T%`!`!`Y`(`0R```"(LP0(B2`8`X,-A!81``00A0`$$)4`$`"$@``!!
+M+,$"04BX`TJ@(I9?2"%V($@!!")$N`,JL!`$ZT=$^U_3N`,JH"%V/D@@%P)(
+M``0!1+@#"K`#`.##!#"`0*&W@4#9_S_T``!>IP@`/J40`%ZE&`!^I3``WB,!
+M@/IK``"[)P``O2/0_]XC``!>MP@`/K40`%ZU&`!^M0L$\$<)!/%'"@3P1R@#
+M<*?!`#\B(`!>(@!`6VL``+HG``"](RH``.0$!/]'```])```H2!A!81``00A
+M0`,$)4```",LP0(C2*$%*4`=`"#D(`!>+"``/B#"`D%(`E`_(*('04`$`$#D
+M`@!#(```(BS!`B)(!@#@PV$%A$`!!"%``00E0`0`(2```$$LP0)!2+@#2J`B
+MEE]((78@2`$$(D2X`RJP$`3K1P/[7].X`RJ@(78^2"`7`D@`!`%$N`,*L`,`
+MX,,$,(!`H=>`0-G_/_0``%ZG"``^I1``7J48`'ZE,`#>(P&`^FL``+LG``"]
+M(^#_WB,``%ZW"``^M1``7K4)!/!'1/]?TPP``.24`RF@"@`@X+@#*:`Q=B!(
+M`P`@YA`$Z4=P_U_3!`#@P[@#*:+14B!*$`3I1ZS_7],``%ZG"``^I1``7J4@
+M`-XC`8#Z:P``NR<``+TC,/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M3``
+MWK4X`/ZU#@3P1PL$\4<,!/)'#03S1\@`GK;`%1\B``!]IP!`6VL``+HG``"]
+M(PH$X$<"`#\A[@(`Y`\$X$<0!.!'```])@``,2(H%%\B``!]IP!`6VL``+HG
+M``"](Q``:K48`(JU(`"JM7@#RK&L`RJ@(98_2`&4)T2L`RJPL`/JLP,`/R#L
+M%"JPK!7JLP`'/R"P%2JP__\_(+05*K"X%2JPO!4JL!`$ZD<1!/]'``!]IP!`
+M6VL``+HG``"](P,`/R'+`@#D`0`_('P#*K`0!.I'($`_(@``?:<`0%MK``"Z
+M)P``O2.``RJ@(98_2`#P'T0`!`%$@`,*L!`$ZD<!`#\F&)@Q(@``?:<`0%MK
+M``"Z)P``O2.``RJ@(78^2"`7`D@`!`%$@`,*L(0#*J`A=CY(A`,JL!`$ZD<!
+M`#\FT)@Q(A8<7R(``'VG`$!;:P``NB<``+TC"P3_1P$`/R6`F"DA$`3O1Q$$
+MZ4<!`%\F``!]IP!`6VL``+HG``"](PLP8$&A=V!!]O\_]!`$[T<!`#\F`)PQ
+M(@``?:<`0%MK``"Z)P``O2,@]@%(@)8#2!`$X$<$`#\B``!]IP!`6VL``+HG
+M``"](P$`0""$`R^@(98_2")V0$@"!$%$A`-/L!`$[T<00#\B``!]IP!`6VL`
+M`+HG``"](PP`X$,2-(!%$`3O1Q!`/R(``'VG`$!;:P``NB<``+TC$`3O1ST`
+M/R+``%XB``!]IP!`6VL``+HG``"](P@`/R%G`@#DP``^H"%V($A;I2$@!``_
+M(6("(/00!.]'/P`_(L``7B(``'VG`$!;:P``NB<``+TC"``_(5D"`.0H%"J@
+M(78^2,``7J`B%T)(`@1!1"@42K`0!.]'P0`_(L``7B(``'VG`$!;:P``NB<`
+M`+TC"``_(4H"`.3``#Z@(78@2"@42J`BEE](@98A2`$$(D0H%"JP`?`A1*$U
+M($`%`#\A/P(@Y`D$_T<+!/]'$1!X02'V84D!!"%`0`!>(!($04`0!.]'``!]
+MIP!`6VL``+HG``"](S$"`.0A]F%)`00A0$``7B`!!")```!!+,("04@""$E$
+M"0#B0PLP8$&A]V=!ZO\_]"+V(4D!`#\D__\A(*(%04`'`#\A(0)`Y!`$[T>_
+M`#\BP`!>(@``?:<`0%MK``"Z)P``O2,(`#\A&`(`Y,``7BS``#X@P@)!2+@#
+M+Z`AEC](`O!?1`($042X`T^P+!1JH".6?TA$`%XL1``^(,("04@"!$-$+!1*
+ML$8`?BQ&`#X@P0)A2")V7DAA4R!(`00B1"P4*K!(`'X@2``^+,("(T@P%"J@
+M`?$_1`+P7T0"!$%$,!1*L$@`/BS!`B-((K9?2"%6($@!!")$,!0JL$H`?B!*
+M`%XLP@)#2"'V/DAB<4!(`@1!1#`42K!*`#XLP0(C2($6(4@B=E](85$@2`$$
+M(D0P%"JP3`!^($P`/BS!`B-(@18A2#042J`B=E](85$@2`$$(D0T%"JP3`!>
+M+,,"0T@A]CY(8W%@2`,$840T%&JP3@">($X`/BS!`B1(.!1*H`+Q7T2!%B%(
+M`00B1#@4*K!.`%XLP@)$2"&V/TAB,4!(`@1!1#@42K!0`)X@4``^+,(")$@"
+M,$!$`_%_1`+P7T0"!$-$-!1*L%``/BS!`B1(@38@2`'P($0BME](83$@2`$$
+M(D0T%"JP```]I&@#+[0+!/]'"0#_("'V84EF!R%`1@3!0`8$1D$Z%*8@(_;A
+M2`,$8T!``#X@`P1A0```(RS!`B-(@E8A2```)2Q!`"5(8@%%2`($040``$4\
+M```C+,$"(TB!EB!(`?`G1`L`12Q%%(8@0@!$2&$!)$@!!")$"P`E/```0RS"
+M`D-(0A1`0`*01T0!`(<@)/:!2`0$A$!``#X@!`2!0```)"S!`B1(@=8A2`$$
+M040!`$4L.Q1F($(`0TAA`2-(`00B1`$`)3P``"0LP0(D2($6(4@!\"=$#`!%
+M+$849B!"`$-(80$C2`$$(D0,`"4\```D+,$")$B!5B!(`?`G1`(`12P\%&8@
+M0@!#2&$!(T@!!")$`@`E/```1"S"`D1((I=`2`(01D0"`&<@(_9A2`,$8T!`
+M`#X@`P1A0```(RS!`B-(@98A2`$$040-`$4L1Q2&($(`1$AA`21(`00B1`T`
+M)3P``",LP0(C2('6($@!\"=$`P!%+#T4AB!"`$1(80$D2`$$(D0#`"4\```C
+M+,$"(T@!\"=$#@!%+$@49B!"`$-(80$C2`$$(D0.`"4\`P!G("/V84@#!&-`
+M0`!>(`,$8D```",LP0(C2(%6(4@$`$4L/A2&($(`1$AA`21(`00B1`0`)3P`
+M`",LP0(C2(&6($@!\"=$#P!%+$D4AB!"`$1(80$D2`$$(D0/`"4\``!#+,("
+M0TA"%$!``I!'1`0`AR`D]H%(!`2$0$``/B`$!(%````D+,$")$B!UB%(`01!
+M1`4`12P_%&8@0@!#2&$!(T@!!")$!0`E/```)"S!`B1(@18A2`'P)T00`$4L
+M2A1F($(`0TAA`2-(`00B1!``)3P``"0LP0(D2(%6($@!\"=$!@!%+$`49B!"
+M`$-(80$C2`$$(D0&`"4\``!$+,("1$@BET!(`A!&1`4`9R`C]F%(`P1C0$``
+M/B`#!&%````C+,$"(TB!EB%(`01!1!$`12Q+%(8@0@!$2&$!)$@!!")$$0`E
+M/```(RS!`B-(@=8@2`'P)T0'`$4L012&($(`1$AA`21(`00B1`<`)3P``",L
+MP0(C2`'P)T02`$4L3!1F($(`0TAA`2-(`00B1!(`)3P&`&<@(_9A2`,$8T!`
+M`%X@`P1B0```(RS!`B-(@58A2`@`12Q"%(8@0@!$2&$!)$@!!")$"``E/```
+M(RS!`B-(@98@2`'P)T03`$4L312&($(`1$AA`21(`00B1!,`)3P``$,LP@)#
+M2$(40$`"D$=$!P"'("3V@4@$!(1`0``^(`0$@4```"0LP0(D2('6(4@!!$%$
+M"0!%+$,49B!"`$-(80$C2`$$(D0)`"4\```D+,$")$B!%B%(`?`G1!0`12Q.
+M%&8@0@!#2&$!(T@!!")$%``E/```)"S!`B1(@58@2`'P)T0*`$4L1!1F($(`
+M0TAA`2-(`00B1`H`)3P``$0LP@)$2"*70$@"$$9$"`!G("/V84@#!&-`0``^
+M(`,$84```",LP0(C2(&6(4@!!$%$%0!%+$\4AB!"`$1(80$D2`$$(D05`"4\
+M```C+,$"(TB!UB!(`?`G1!8`12Q0%(8@0@!$2&$!)$@!!")$%@`E/```(RS!
+M`B-(`?`G1!<`12Q1%&8@0@!#2&$!(T@!!")$%P`E/`D`9R`C]F%(`P1C0$``
+M7B`#!&)````C+,$"(TB!5B%(&`!%+%(4AB!"`$1(80$D2`$$(D08`"4\```C
+M+,$"(TB!EB!(`?`G1!D`12Q3%(8@0@!$2&$!)$@!!")$&0`E/```0RS"`D-(
+M0A1`0`*01T0*`&<@(_9A2`,$8T!``#X@`P1A0```(RS!`B-(@=8A2`$$040:
+M`$4L5!2&($(`1$AA`21(`00B1!H`)3P``",LP0(C2($6(4@!\"=$&P!%+%44
+MAB!"`$1(80$D2`$$(D0;`"4\```C+,$"(TB!5B!(`?`G1!P`12Q6%,8@0@!&
+M2&$!)D@!!")$'``E/`LP8$$'<.%`H9=@08O^/_00!.]'=P!`TPD$_T<+!/]'
+M'P#?(<``OB$Q`<M!$`3O1\``7B(``'VG`$!;:P``NB<``+TC+P``Y,``7BS!
+M`DU("0`A000$:T$A]H%(`00J0,`4H2#"`DU(@A9!2`L`92S+%"$@0P!A2&(!
+M04@"!$-$"P!%/`$`A"`D]H%(!`2*0,`49"#``#XLP0(M2`L`0RS+%(0@0@!$
+M2&$!)$@!!")$"P`C/`LP8$&A5V!!VO\_]"'V(4FC%2!``P!?)/W_0B"A!2)`
+M`P1A1`D`/R$,`&#T$`3O1Q!`/R(2!.Q'``!]IP!`6VL``+HG``"](P`$[T<4
+M`.##"``_(0@`X,,(`#\A$`3O1Q!`/R(2!.Q'``!]IP!`6VL``+HG``"](P4`
+M0.40!.I'``!]IP!`6VL``+HG``"](\@`7J0!`$#D```BL0`$_T<``%ZG"``^
+MI1``7J48`'ZE(`">I2@`OJ4P`-ZE.`#^I=``WB,!@/IK``"[)P``O2/P_]XC
+M``!>MP``?:<`0%MK``"Z)P``O2,``%ZG$`#>(P&`^FN1%B%*``3_1PT`(.(`
+M`%(L0@)22``4/R!A`S)(`00B1```,CP``%,L0@)32#85/R!A`S-(`00B1```
+M,SP!`!\@`8#Z:P$`'R`!@/IKD`-P(`0`(Z`!-"!$!``CL#85/R0`%"$@#``C
+ML)`#4*`"5$!$__\_)/__(2`"`$%$D`-0L$``/R0!="!$"``CL)`#4*#@_S\D
+M__\A(`(`043`_S\D__\A(`(`0420`U"P-!0PH`'P/T0(`"#D`!0PH"&6/T@`
+M%#"P`0`_(`04,+"``#\D`01!1)`#,+`/`#\@%``CL`$`/R`@%#"P`0`?(`&`
+M^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4*!/!'"03Q1P0`4:(!`#\F+(`Q
+M(@``?:<`0%MK``"Z)P``O2,,`$FB$`3J1P$`/R8P@#$B``!]IP!`6VL``+HG
+M``"](Q``2:(0!.I'`0`_)C2`,2(``'VG`$!;:P``NB<``+TC"`!)HA`$ZD<!
+M`#\F.(`Q(@``?:<`0%MK``"Z)P``O2,``$FB$`3J1P$`/R8D@#$B``!]IP!`
+M6VL``+HG``"](P``7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/0_]XC``!>
+MMQ0`/K*,`S"@H34@0`P`(/0``#VD```AH"$%(4)!%B!`'``^L```/:0``"&@
+M(04A0D$6($`@`#ZP&``^L@4`X,/__S\@'``^L"``/K`!`#\@&``^L($!/R3_
+M_R$@`0!!1A``/K`0`#XBK_]?TP``7J<P`-XC`8#Z:P``NR<``+TC\/_>(P``
+M7K<(`#ZU"03P1P$`/R8L@#$B$@3_1P``?:<`0%MK``"Z)P``O2,0!.E'`0`_
+M)@2`,2(``'VG`$!;:P``NB<``+TC``#@0Q``/R0`!`%$4/\A)/__(2````%$
+M$`3I1P$`/R8$@#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.E'`0`_)B2`,2(!
+M`%\F__]2(@``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``WB,!@/IK``"[)P``
+MO2/@_]XC``!>MP@`/K40`%ZU&`!^M0D$\$<*!/%'"P3P1Q``,:#!4B!(+``@
+MY`$`/R8$@#$B``!]IP!`6VL``+HG``"](X#_/R3__R$@```!1"``/R0`!`%$
+M``#@0Q`$Z4<!`#\F!(`Q(A($X$<``'VG`$!;:P``NB<``+TC$`!*HC)V0$H0
+M!.E'`0`_)BB`,2(``'VG`$!;:P``NB<``+TC$`!*HM)20$H0!.E'`0`_)DB`
+M,2(``'VG`$!;:P``NB<``+TC%`!*HE(20$(0!.E'`0`_)C2`,2(.`.##`0`_
+M)@2`,2(``'VG`$!;:P``NB<``+TC8/\_)/__(2````%$``#@0Q`$Z4<!`#\F
+M!(`Q(A($X$<``'VG`$!;:P``NB<``+TC``!*HA`$Z4<!`#\F+(`Q(@``?:<`
+M0%MK``"Z)P``O2,0!.E'`0`_)B2`,2(``'VG`$!;:P``NB<``+TC@/\_)```
+M`40(`"J@(78@2``$`40``.!#$@3@1Q@`2J`A=D!(!@`@Y"%V0$@$`"$@(1<B
+M2'\`7R0!`")$$@0!1!(`\D,0!.E'`0`_)B2`,2(``'VG`$!;:P``NB<``+TC
+M@`,IH"%V($BA=R!`&P`@]!@`:J#!4F!()'8@2`'P@$06`"#DL!4KH/_X7R`!
+M`")$!0#A0\-28$BC]V!`(1>!2``'7R`!`")$`02A1`(`8/0`!S\@`02A1+`5
+M*[`2`.%#$`3I1P$`/R88@#$B``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`!>
+MI1@`?J4@`-XC`8#Z:P``NR<``+TC\/_>(P``7K<(0#\B``!]IP!`6VL``+HG
+M``"](Z`#X$,``%ZG$`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K48
+M`'ZU"P3P1PD$\4<<`#\B``!]IP!`6VL``+HG``"](P``X$,B]@%(__\_(($6
+M)$BB!4%``P!`Y```Z;,`!/]''0#@P]04*Z`!``%$!@%?)+K80B`"`")$``!)
+ML'``/R0@`"$@`0`!1`,`(.0`0#\D`01!1```*;`!L`!$`P`@Y```*:`!-"!$
+M```IL,`%/R`!``%$`P`@Y```*:`!%"A$```IL```*:"!UB-(`0`@X`@4"[`!
+M`!\@``!>IP@`/J40`%ZE&`!^I2``WB,!@/IKU!00H`&`^FL``+LG``"](]#_
+MWB,``%ZW"``^M1``7K48`'ZU(`">M0L$\$<)!/%'"@3P1]04D*$!`.Q#!@`@
+M^"0`/R(2!/]'``!]IP!`6VL``+HG``"](Q(`Z4,&`3\DNM@A(!(`048!M$!&
+MD@(A10$0*$4.`"#DV!0JH`(42$;2!")$W!0JH`(`(.0``3\@$@1!1N`4*J`"
+M%%!&T@0B1.04*J`"`"#D``0_(!($0480!.M'(``_(@``?:<`0%MK``"Z)P``
+MO2/4%"JQ`0#I0P<`(/@0!.M')``_(@$`7R(``'VG`$!;:P``NB<``+TC``3L
+M1P``7J<(`#ZE$`!>I1@`?J4@`)ZE,`#>(P&`^FM``!\@`8#Z:P``NR<``+TC
+M\/_>(P``7K>A]R="#0`@Y#&W($H!`#$F')`Q(@``?:<`0%MK``"Z)P``O2,`
+M`.!#`0`_)`"`(2````%$`0`_(`$``/0!!/]'``3A1P``7J<0`-XC`8#Z:P``
+MNR<``+TCX/_>(P``7K<(`#ZU$`!>M0H$\$>A]R="``3_1T(`(.0IMR!*`0`I
+M)@"0,2(2!/]'``!]IP!`6VL``+HG``"](P$`*28$D#$B$`3J1Q($_T<``'VG
+M`$!;:P``NB<``+TC`0`I)@B0,2(0!.I'$@3_1P``?:<`0%MK``"Z)P``O2,!
+M`"DF#)`Q(A`$ZD<2!/]'``!]IP!`6VL``+HG``"](P$`*280D#$B$`3J1Q($
+M_T<``'VG`$!;:P``NB<``+TC`0`I)A20,2(0!.I'$@3_1P``?:<`0%MK``"Z
+M)P``O2,!`"DF&)`Q(A`$ZD<2!/]'``!]IP!`6VL``+HG``"](P$`*24<D"DA
+M$`3J1Q$$Z4<2!/]'``!]IP!`6VL``+HG``"](P$`'R```%ZG"``^I1``7J4@
+M`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`?K4+!/!'H?<G0@`$
+M_T<Y`"#D"@3_1P($_T<A`$#F!0!R+`4`,B##`&%((Q=A2`0`,BP$`%(@P0`B
+M2`$$(T0*`.%#`P!R+`,`,B##`&%((Q=C2`(`,BP"`%(@P0`B2"$7(D@#!&%$
+M`0`R+`$`4B#!`")((1<A2`,$840``#(LP0`R2`$$(T0A]B%(@C8@2`$P0$4A
+M]R-(`01!1`(`X4.*-D!)*;<@2@$`*288D#$B$`3K1Q($XD<``'VG`$!;:P``
+MNB<``+TC`0`I)1R0*2$!`%\F`(!2(A($4D40!.M'$03I1P``?:<`0%MK``"Z
+M)P``O2,!`!\@``!>IP@`/J40`%ZE&`!^I2``WB,!@/IK``"[)P``O2.P_]XC
+M``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU,`#>M3@`_K4.!/!'#P3Q1P,$\D=`
+M`'ZVJZH_)*JJ@2`!`(#V!`3_1Z'WYT$`!/]'I``@Y```(RS!`"-(``3_1Z``
+M(/0"`",L`@!#(,$"(DBAER!```3_1YH`(/0"`",L`@!#(,$"(DBAMR!`2`#^
+MMP<`(/0"`",L`@!#(,$"(DBAMR%``0!?(()T($1(`%ZT!`!#+@0`(R#2`$%*
+M!0`C+`4`0R#!`")((1<A2!($048&`",L!@!#(,$`(D@A%R)($@1!1@<`(RP'
+M`$,@P0`B2"$7(T@2!$%&$@A$1A(`\D,(`$,L"``C(,T`04@)`",L"0!#(,$`
+M(D@A%R%(#00M1"UVH$D-"*1%+7:@20H`@RT*`",@S`"!20L`(RP+`$,@P0`B
+M2"$7(4@,!(%%#``C+`P`0R#!`")((1<B2`P$@44-`",L#0!#(,$`(D@A%R-(
+M#`2!10P(A$4,`.Q##@!#+`X`(R#+`$%(#P`C+`\`0R#!`")((1<A2`L$*T0K
+M=F!)"PAD12MV8$D0`",M$``C(,D`(4D1`",L$0!#(,$`(D@A%R%("00A11(`
+M(RP2`$,@P0`B2"$7(D@)!"%%$P`C+!,`0R#!`")((1<C2`D$(44)""1%"0#I
+M0P(`(RP"`$,@P0(B2*&W(4`"\#]%R00B1"JWX$D!`"HF`)`Q(A`$[D<``'VG
+M`$!;:P``NB<``+TC`0`J)@20,2(0!.Y'$@3M1P``?:<`0%MK``"Z)P``O2,!
+M`"HF")`Q(A`$[D<2!.Q'``!]IP!`6VL``+HG``"](P$`*B8,D#$B$`3N1Q($
+MZT<``'VG`$!;:P``NB<``+TC`0`J)A"0,2(0!.Y'$@3I1P``?:<`0%MK``"Z
+M)P``O2,!`$HE%)!*(1`$[D<1!.I'2`!>I@``?:<`0%MK``"Z)P``O2,0!.Y'
+M$03O1T``7J;^_E_3``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE,`#>I3@`_J50
+M`-XC`8#Z:P``NR<``+TC\/_>(P``7K?+%#`@$`3Q1Q$$X4<&`%\B``!]IP!`
+M6VL``+HG``"](P``7J<0`-XC`8#Z:P``NR<``+TC\/_>(P``7K?+%!`B!@!?
+M(@``?:<`0%MK``"Z)P``O2,!`!\@``!>IQ``WB,!@/IK``"[)P``O2/P_]XC
+M``!>MQ`$\4<``#TF```Q(@8`7R(``'VG`$!;:P``NB<``+TC``!>IQ``WB,!
+M@/IK``3_1P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4*!/!'"03R1U$4
+M($(`8#$B$0#Q0P``?:<`0%MK``"Z)P``O2,0!.I'`&P_(@,`7R("`'\B``!]
+MIP!`6VL``+HG``"](P$$_T<,``#D$`3J1P!H/R(``'VG`$!;:P``NB<``+TC
+M```I+$$"*4A@`PE(``0!1```"3P!`#\@``3A1P``7J<(`#ZE$`!>I2``WB,!
+M@/IKN`,PH"%V($BA!3%`#`!?(`4`(/0H%#"@P5(@2`$0,$2B`^%#0G9`0`$`
+M0.8``%*P``3_1P&`^FL!`!\@`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>
+MM1@`?K4+!/!'`!0PH2EV($D*D"-%"5`@1:D#Z4.*5D!)$03J1P``?:<`0%MK
+M``"Z)P``O2,@]@%(H`4)0!`$ZT<1!.I'$@3@1P``?:<`0%MK``"Z)P``O2,`
+M`%ZG"``^I1``7J48`'ZE(`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``
+M7K4*!/!'"03Q1Q1`/R(``'VG`$!;:P``NB<``+TC"00I00,`7R(R!TE*$@$2
+M1`(`/R`A!RE($@1!1A(`\D,0!.I'%$`_(@``?:<`0%MK``"Z)P``O2,!`!\@
+M``!>IP@`/J40`%ZE(`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4*
+M!/!'"03Q1Q1`/R(``'VG`$!;:P``NB<``+TC"00I00,`7R(R!TE*$@$21!(`
+M\D,0!.I'%$`_(@``?:<`0%MK``"Z)P``O2,!`!\@``!>IP@`/J40`%ZE(`#>
+M(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"P3P1PH$\4<)!/)'
+M&$`_(@``?:<`0%MK``"Z)P``O2,2`.!#`0`_("$'*D@!`4%&"3`@12D'*DD!
+M!"E$$@#A0Q`$ZT<80#\B``!]IP!`6VL``+HG``"](P$`'R```%ZG"``^I1``
+M7J48`'ZE(`#>(P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$\4>AMR!"__\?
+M(`@`(.0<0#\B``!]IP!`6VL``+HG``"](P#P!42`!@E(`#``1```7J<(`#ZE
+M$`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"P3P1PD$\4<*
+M!/)'%$`_(@``?:<`0%MK``"Z)P``O2,2`.!#(Y<A20D$*4$#`#\@(0<I2`$$
+M840"`%\D`(!"(`$$(D0!`4%&$@#A0P,$0T8!`#\D`(`A(`,$8402`.-#`@!`
+MY0$`/R02!$%&$`3K1Q1`/R(``'VG`$!;:P``NB<``+TCU!0KH``!/R81!"%&
+M$`3K1P``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``7J48`'ZE(`#>(P&`^FL`
+M`+LG``"](^#_WB,``%ZW"``^M1``7K4*!/!'"03Q1Q!`/R(``'VG`$!;:P``
+MNB<``+TC$@#@0R'V(4D#`"#DH94@0`,`(/0%`.##$A%,1@4`X,,!$41&$A0H
+M1`(`X,,!%$1&$A$H1!`$ZD<00#\B``!]IP!`6VL``+HG``"](P``7J<(`#ZE
+M$`!>I2``WB,!@/IK``"[)P``O2/P_]XC``!>MP$`/R8$@#$B``!]IP!`6VL`
+M`+HG``"](X#V`D@!`#\@@5(`1``$X4<``%ZG$`#>(P&`^FL``+LG``"](^#_
+MWB,``%ZW"``^M1``7K4*!/!'"03Q1P$`/R8$@#$B``!]IP!`6VL``+HG``"]
+M(P``X$.!]@)(`@`@X*%5($$!`.##H34@00D`(/2``%\F$@021!`$ZD<!`#\F
+M!(`Q(@``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``7J4@`-XC`8#Z:P`$_T<!
+M@/IKH!4@0@&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4*!/!'"03R1_`4
+M$"(&`%\B``!]IP!`6VL``+HG``"](_`4*J`2\#]$(E8@2!($0D8BEB!($@1"
+M1B$6(4@2!$%&$@#R0Q`$ZD<!`#\F"(`Q(@``?:<`0%MK``"Z)P``O2/T%$JB
+M_S\_(`$`(44A%R)(,G9`2A($0480!.I'`0`_)@R`,2(``'VG`$!;:P``NB<`
+M`+TC"@`@]1`$ZD<!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2,0`#\D``0!1`H`
+MX,,0!.I'`0`_)@2`,2(``'VG`$!;:P``NB<``+TC\/\_)/__(2````%$``#@
+M0Q`$ZD<!`#\F!(`Q(A($X$<``'VG`$!;:P``NB<``+TC``!>IP@`/J40`%ZE
+M(`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"03P1P$`/R9L
+M@#$B``!]IP!`6VL``+HG``"](PL`X$,0!.E'`0`_)G"`,2(``'VG`$!;:P``
+MNB<``+TC"@#@0Q`$Z4<!`#\F;(`Q(@``?:<`0%MK``"Z)P``O2,``.!#(?8!
+M2"+V84FA`R)``C!`0<H$(D0A%T1)(/8!2`$$($0`!.%'``!>IP@`/J40`%ZE
+M&`!^I2``WB,!@/IK``"[)P``O2/P_]XC``!>MP$`/R9L@#$B``!]IP!`6VL`
+M`+HG``"](P``7J<0`-XC`8#Z:P``NR<``+TC\/_>(P``7K<(`#ZU"03P1P$`
+M/R8D@#$B``!]IP!`6VL``+HG``"](P``X$,``3\D``0!1!`$Z4<!`#\F)(`Q
+M(A($X$<``'VG`$!;:P``NB<``+TC``!>IP@`/J40`-XC`8#Z:P``NR<``+TC
+MX/_>(P``7K<(`#ZU$`!>M1@`?K4+!/!'`0`_)F28,2(``'VG`$!;:P``NB<`
+M`+TC(/8!2(EV`DC_`1\@"0`@18$6(4D#`"#D`0@@10$`(2`I`>%#$`3K1P$`
+M/R9P@#$B``!]IP!`6VL``+HG``"](PH$X$<0!.M'`0`_)FR`,2(``'VG`$!;
+M:P``NB<``+TC``A`10`("40``.!#``!>IP@`/J40`%ZE&`!^I2``WB,!@/IK
+M``"[)P``O2/P_]XC``!>MP@`/K6``S"@*78@2"!`/R(``'VG`$!;:P``NB<`
+M`+TC(?8A20#P'T2@!2!```!>IP@`/J40`-XC`8#Z:P``NR<``+TCX/_>(P``
+M7K<(`#ZU$`!>M0H$\$<)!/%'`0`_)IB`,2(``'VG`$!;:P``NB<``+TC```I
+MH`$$($```"FP$`3J1P$`/R:4@#$B``!]IP!`6VL``+HG``"](P0`*:`!!"!`
+M!``IL!`$ZD<!`#\FG(`Q(@``?:<`0%MK``"Z)P``O2,,`"F@`00@0`P`*;`0
+M!.I'`0`_)I"`,2(``'VG`$!;:P``NB<``+TC"``IH`$$($`(`"FP$`3J1P$`
+M/R:@@#$B``!]IP!`6VL``+HG``"](Q``*:`!!"!`$``IL```7J<(`#ZE$`!>
+MI2``WB,!@/IK``"[)P``O2/0_]XC``!>MP@`/K40`%ZU&`!^M2``GK4*!/!'
+M"P3Q1PP$\$<I]B%*H1<A00D`(/0!`#\F__\Q(@``?:<`0%MK``"Z)P``O2,@
+M]@%(H`<@000``/3__S\@M!4LL``$_T<0`.##$`3J1Q$$ZT<``'VG`$!;:P``
+MNB<``+TC$`3J1P$`/R80@#$B$@3@1P``?:<`0%MK``"Z)P``O2.T%6JQ`0`?
+M(```7J<(`#ZE$`!>I1@`?J4@`)ZE,`#>(P&`^FL``+LG``"](_#_WB,``%ZW
+M"``^M0D$\$<!`#\F$(`Q(@``?:<`0%MK``"Z)P``O2,@=@!($`3I1Q$$X$<`
+M`'VG`$!;:P``NB<``+TC``!>IP@`/J40`-XC`8#Z:P``NR<``+TCT/_>(P``
+M7K<(`#ZU$`!>M1@`?K4@`)ZU"03P1PH$\4?_'S\B``!]IP!`6VL``+HG``"]
+M(R'V04D@]@%(H0<@0`0`(/3__S\@N!4IL``$_T<<`.##$`3I1P$`/R84@#$B
+M``!]IP!`6VL``+HG``"](P#@/R`+``%$$`3I1Q$$ZD<``'VG`$!;:P``NB<`
+M`+TC_Q\_(````40`!&!%$@#@0Q`$Z4<!`#\F%(`Q(@``?:<`0%MK``"Z)P``
+MO2.X%4FQ`0`?(```7J<(`#ZE$`!>I1@`?J4@`)ZE,`#>(P&`^FL``+LG``"]
+M(_#_WB,``%ZW"``^M0D$\$<!`#\F%(`Q(@``?:<`0%MK``"Z)P``O2/_'S\@
+M```!1!`$Z4<1!.!'``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`#>(P&`^FNL
+M%1"@@!<#2``X`$0`,`!$`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`
+M?K4*!/!'"P3P1Q4`(.8!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2,`_S\E__\I
+M(0``"40``.!#$`3J1P$`/R8$@#$B$@3@1P``?:<`0%MK``"Z)P``O2.L%2J@
+M`0`I1!,`X,,!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2,``3\E``0)1```X$,0
+M!.I'`0`_)@2`,2(2!.!'``!]IP!`6VL``+HG``"](ZP5*J`!!"E$K!4KL`$`
+M'R```%ZG"``^I1``7J48`'ZE(`#>(P&`^FL``+LG``"](]#_WB,``%ZW"``^
+MM1``7K48`'ZU(`">M0D$\$<*!/%'_Q\_(@``?:<`0%MK``"Z)P``O2,A]D%)
+M(/8!2*$'($`$`"#T__\_(+P5*;``!/]''@#@PQ`$Z4<!`#\F%(`Q(@``?:<`
+M0%MK``"Z)P``O2,!X#\D__\A(`L``400!.E'$03J1P``?:<`0%MK``"Z)P``
+MO2,@%P)(_Q\_)````40`!&!%$@#@0Q`$Z4<!`#\F%(`Q(@``?:<`0%MK``"Z
+M)P``O2.\%4FQ`0`?(```7J<(`#ZE$`!>I1@`?J4@`)ZE,`#>(P&`^FL``+LG
+M``"](_#_WB,``%ZW"``^M0D$\$<!`#\F%(`Q(@``?:<`0%MK``"Z)P``O2,@
+M=P1(@'8&2!`$Z4<1!.!'``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`#>(P&`
+M^FL!`!\@`8#Z:P&`^FL`!/]'`8#Z:P&`^FL!@/IK``"[)P``O2/P_]XC``!>
+MMZ$U($(`!/]'P+1!1@0`(/0``'VG`$!;:P``NB<``+TC``!>IQ``WB,!@/IK
+M``"[)P``O2/P_]XC``!>MR+V(4JA=4%`!``@]*'50T``!/]'$``@]`L`X,,!
+MT&!&J`,PL!(`X4,!`#\F:(`Q(@``?:<`0%MK``"Z)P``O2,!`!\@!`#@PP``
+M?:<`0%MK``"Z)P``O2,``%ZG$`#>(P&`^FL``+LG``"](_#_WB,``%ZW``!]
+MIP!`6VL``+HG``"](P``7J<0`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU
+M$`!>M0H$\$<)!/%'`0`_)@2`,2(``'VG`$!;:P``NB<``+TC!``_)``$`40`
+M`.!#$`3J1P$`/R8$@#$B$@3@1P``?:<`0%MK``"Z)P``O2,1`"#E$`3J1P1`
+M/R(``'VG`$!;:P``NB<``+TC_?\_)/__(2````%$``#@0Q`$ZD<$0#\B$@3@
+M1P``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``7J4@`-XC`8#Z:P``NR<``+TC
+MT/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU"03P1SP`(.8$0#\B``!]IP!`6VL`
+M`+HG``"](_W_/R3__R$@```!1```X$,0!.E'!$`_(A($X$<``'VG`$!;:P``
+MNB<``+TCT`<?(@``?:<`0%MK``"Z)P``O2,*`%\A`0"?)?W_?R4K,6!!$`3I
+M1Q!`/R(``'VG`$!;:P``NB<``+TC``#@0P``#$07``#DR``?(@``?:<`0%MK
+M``"Z)P``O2,0!.E'!$`_(@``?:<`0%MK``"Z)P``O2,```M$``#@0Q`$Z4<$
+M0#\B$@3@1P``?:<`0%MK``"Z)P``O2,J,4!!X?]?]0$`X,,"`$#U``3_1Q0`
+MX,,0!.E'`0`_)@2`,2(``'VG`$!;:P``NB<``+TC_/\_)/__(2````%$``#@
+M0Q`$Z4<!`#\F!(`Q(A($X$<``'VG`$!;:P``NB<``+TC`0`?(```7J<(`#ZE
+M$`!>I1@`?J4@`)ZE,`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4*
+M!/!'"03Q1P$`/R8$@#$B``!]IP!`6VL``+HG``"](P0`/R0`!`%$``#@0Q`$
+MZD<!`#\F!(`Q(A($X$<``'VG`$!;:P``NB<``+TC$0`@Y1`$ZD<$0#\B``!]
+MIP!`6VL``+HG``"](_W_/R3__R$@```!1```X$,0!.I'!$`_(A($X$<``'VG
+M`$!;:P``NB<``+TC``!>IP@`/J40`%ZE(`#>(P&`^FL``+LG``"](^#_WB,`
+M`%ZW"``^M1``7K48`'ZU"03Q1Q$$\D<*!/!'`0!_(2+V(4FA-4!`!P`@]`,`
+M0.2A54!`!@`@]`<`X,->_U_3"P#@0P8`X,.\_U_3!`#@PRG_7],"`.##``3_
+M1P(`X,/L%"JQ``#K0P``7J<(`#ZE$`!>I1@`?J4@`-XC`8#Z:P``NR<``+TC
+M\/_>(P``7K<$0#\B``!]IP!`6VL``+HG``"](X`6`D@`<`!$``!>IQ``WB,!
+M@/IK``"[)P``O2/P_]XC``!>MP@`/K4B]B%*H35`0`4`(/2B54!````])```
+M(2$&`$#T`P#@PP``/20``"$A`@#@PP`$_T<&`.##$03I1P``?:<`0%MK``"Z
+M)P``O2,`!.E'``!>IP@`/J40`-XC`8#Z:P``NR<``+TC\/_>(P``7K<,`#\B
+M``!]IP!`6VL``+HG``"](P``7J<0`-XC`8#Z:P``NR<``+TC\/_>(P``7K<2
+M!/%'#``_(@``?:<`0%MK``"Z)P``O2,``%ZG$`#>(P&`^FL``+LG``"](_#_
+MWB,``%ZW"``_(@0`7R(``'VG`$!;:P``NB<``+TC``!>IQ``WB,!@/IK``"[
+M)P``O2/@_]XC``!>MP@`/K40`%ZU"@3P1P@`/R(@`%\B``!]IP!`6VL``+HG
+M``"](PD$_T<0!.I'"``_(@``?:<`0%MK``"Z)P``O2,`D`!$`0`_(`D``.0*
+M`!\B``!]IP!`6VL``+HG``"](PDP($$9_"D@[_\_[`$$_T<`!.%'``!>IP@`
+M/J40`%ZE(`#>(P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$\$<!`#\F:(`Q
+M(@``?:<`0%MK``"Z)P``O2,`$0A$``#@0Q`$Z4<!`#\F:(`Q(A($X$<``'VG
+M`$!;:P``NB<``+TC``!>IP@`/J40`-XC`8#Z:P``NR<``+TC\/_>(P``7K<(
+M`#ZU"03P1P$`/R9H@#$B``!]IP!`6VL``+HG``"](P`4"$0``.!#$`3I1P$`
+M/R9H@#$B$@3@1P``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``WB,!@/IK``"[
+M)P``O2/@_]XC``!>MP@`/K40`%ZU"03P1P$$\4<*!/)'`0`_)E"`,2(2!.%'
+M``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F5(`Q(A($ZD<``'VG`$!;:P``NB<`
+M`+TC``!>IP@`/J40`%ZE(`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``
+M7K4*!/!'"03Q1Z'W)T(`!/]')0`@Y*'W(T(0`"#T`0`_)E2`,2(``'VG`$!;
+M:P``NB<``+TC``#@0^#_*2`!`%\B,@=!2A(!$D02`/)#$`3J1P$`/R94@#$B
+M#@#@PP$`/R90@#$B``!]IP!`6VL``+HG``"](P``X$,!`%\B,@=)2A(!$D02
+M`/)#$`3J1P$`/R90@#$B``!]IP!`6VL``+HG``"](P$`'R```%ZG"``^I1``
+M7J4@`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M0H$\$<)!/%'H?<G
+M0@`$_T<D`"#DH?<C0@\`(/0!`#\F5(`Q(@``?:<`0%MK``"Z)P``O2/@_TD@
+M`0`_("$'(D@`!`%$``#@0Q`$ZD<!`#\F5(`Q(@T`X,,!`#\F4(`Q(@``?:<`
+M0%MK``"Z)P``O2,!`#\@(0<I2``$`40``.!#$`3J1P$`/R90@#$B$@3@1P``
+M?:<`0%MK``"Z)P``O2,!`!\@``!>IP@`/J40`%ZE(`#>(P&`^FL``+LG``"]
+M(_#_WB,``%ZW`0`_)DR`,2(``'VG`$!;:P``NB<``+TC``!>IQ``WB,!@/IK
+M``"[)P``O2/P_]XC``!>MQ($\4>!-B%*`P`@X/_]/R`!`"%&$A0D1`$`/R9,
+M@#$B``!]IP!`6VL``+HG``"](P``7J<0`-XC`8#Z:PL`<2P(`)$L"``Q(`($
+M_T?B#$%(0PQA2$0$@4@#!&)$"P!Q/`@`D3S_#S\@`0!!1@\`<2P,`%$L#`"1
+M(.4,)$AA!21(0PQD2$($1$@#!&5$`@1!1`\`<3P,`%$\#P`Q+,($1$A!#21(
+M`@1!1"+V04@R]D%*H@520``$_T<F`$#D`1!D1A``(.0,`+$L#P"1+`P`<2#!
+M!*-(0@V#2`$$(D0`(%\@`00B1.(,(TAA!2-(1`R#2$4$HT@$!()$!02A1`\`
+MD3P,`+$\!03_1Q<`42P4`'$L%``Q(.0,H4A"#$%(0P1A2`($1$07`%$\%`!Q
+M/!,`42P0`'$L$``Q(.4,H4A"#$%(0P1A2`($1403`%$\$`!Q/`$`'R`!@/IK
+M``"[)P``O2/0_]XC``!>MP@`/K40`%ZU&`!^M2``GK4,!/!'"P3R1PH$]4<)
+M!/%'%`!1+!<`,2P4`'$@P@1#2$$-(T@"!$%$#P`_(-P`0.`4`#,L%P!3+!0`
+M<R#!!"-(0@U#2`$$(D0*`"#P#``_(@``?:<`0%MK``"Z)P``O2,@]@%((?9A
+M2:`%`4`/`#\@RP``]!``22P3`"DL$`!I(,($0TA!#2-(`01!1/\/7R`!`$%$
+M``!*+$("2DAA`RI(`00B1```*CP4`$DL%P`I+!0`:2#"!$-(00TC2`($040`
+M$#\D`(`A(`(`040B]D%(B_9!2!`$[$<!`#\F;(`Q(@``?:<`0%MK``"Z)P``
+MO2,@UP1(@!8&2/\?/R`!``%$H0,K0`0`(.0`X"`@(78@2`L$844"`.##`01@
+M10L`X4/_?S\@`0!A10(`2BP"`&H@0@)#2&$#(T@!!")$`@`J/`0`BBP$`*H@
+M1`"%2`0`BCP4`$DL%P`I+!0`:2#"!$-(00TC2`($040!4$!$/``@]`&00$0&
+M`"#DP0"%2`$T($1"`(5(80$E2`$$(D0<`.##%``I+!<`22P4`&D@P00C2$(-
+M0T@!!")$`1`B1`4`(.0$`&HL!`!*(,$`8D@!%"%$#`#@PQ0`*2P7`$DL%`!I
+M(,$$(TA"#4-(`00B1`$0(40)`"#D!`!J+`0`2B#!`&)(`90@1$,`8DAA`2)(
+M`00C1`0`*CP6`.##!`!J+`0`2B#!`&)(`50@1$,`8DAA`2)(`00C1`0`*CP4
+M`"DL%P!)+!0`:2#!!"-(0@U#2`$$(D0!$#Q$@;8@2`4`2BP%`&H@0@!#2&$!
+M(T@!!")$!0`J/!``*2P3`$DL$`!I(,$$(TA"#4-(`00B1(%V(D@&`$HL!@!J
+M($(`0TAA`2-(`00B1`8`*CP4`$DL%P`I+!0`:2#"!$-(00TC2`($042!%D%(
+M"0`@X($V04@!\"=$!P!*+`<`:B!"`$-(80$C2`$$(D0'`"H\!P#@PP<`*BP'
+M`&H@00`C2/__7R!B`4-(`@1!1`<`2CP0`$DL$P`I+!``B2#"!$1(00TD2`($
+M040(`#\D`(`A(`(`042!]D%("`!*+`@`:B!"`$-(80$C2`$$(D0(`"H\$``I
+M+!,`22S!!"1(0@U$2`$$(D2!UB%(`3`@1`D`2BP)`&H@0@!#2&$!(T@!!")$
+M"0`J/!``*2P3`$DLP00D2$(-1$@!!")$@98A2`$P($0*`$HL"@!J($(`0TAA
+M`2-(`00B1`H`*CP!!/]'``3A1P``7J<(`#ZE$`!>I1@`?J4@`)ZE,`#>(P&`
+M^FL``+LG``"](Z#_WB,``%ZW"``^M1``7K48`'ZU(`">M2@`OK4P`-ZU.`#^
+MM0H$\$=``#ZV#03R1T@`?K90`)ZV#P3P1P(`,BP"`%(@P0(B2($6(4@,`%\@
+MS@(@X!$$\D<``'VG`$!;:P``NB<``+TC6``>M`P`7R#&`@#D0``^I"+V(4BA
+MU4!`!P`@]*'70$`"`"#DH3=`0`$`X,.A%4%`#`!?(+L"(.00!.I'$$`_(@``
+M?:<`0%MK``"Z)P``O2,)$`Q$$`3J1Q$$[4<``'VG`$!;:P``NB<``+TC`P!?
+M(*P"`.3(%$^BTG!`2LP43Z!A,4!($@1!1L$P0$@A%R)($@1!1L)00$@B%T-(
+M$@1"1A(`\D,0!.I'`0`_)@"`,2(``'VG`$!;:P``NB<``+TCS!1/HM)P0$K0
+M%"^@83$@2!($0480!.I'`0`_)@2`,2(``'VG`$!;:P``NB<``+TC0`!>I!$`
+MXD,0!.I'F@)`TT``?J0B]F%(H35`0`H`(/0%`$#DH=5`0!(`(/2A%4%`$``@
+M]!T`X,,0!.I'*``_(@$`7R(#`.##$`3J1R@`/R(2!/]'``!]IP!`6VL``+HG
+M``"](Q`$ZD<00#\B)!!?(@H`X,,0!.I'*``_(A($_T<``'VG`$!;:P``NB<`
+M`+TC$`3J1Q!`/R)`$%\B``!]IP!`6VL``+HG``"](Q`$ZD<00#\B``!]IP!`
+M6VL``+HG``"](P`$"40``.!#$`3J1Q!`/R(2!.!'``!]IP!`6VL``+HG``"]
+M(_`4+Z`2\#]$(E8@2!($0D8BEB!($@1"1B$6(4@2!$%&$@#R0Q`$ZD<!`#\F
+M"(`Q(@``?:<`0%MK``"Z)P``O2/T%$^B,G9`2A`$ZD<!`#\F#(`Q(@``?:<`
+M0%MK``"Z)P``O2,0!.I'$03_1Q($_T<``'VG`$!;:P``NB<``+TC$`3J1P0`
+M/R(2!/]'``!]IP!`6VL``+HG``"](Q`$ZD<,`#\B$@3_1P``?:<`0%MK``"Z
+M)P``O2,0!.I''``_(@``?:<`0%MK``"Z)P``O2,0!.I'(``_(A($_T<``'VG
+M`$!;:P``NB<``+TC$`3J1R0`/R(2!/]'``!]IP!`6VL``+HG``"](]04[[,0
+M!.I'+``_(@``?:<`0%MK``"Z)P``O2,0!.I',``_(@4`7R(``'VG`$!;:P``
+MNB<``+TC$`3J1S0`/R(%`%\B``!]IP!`6VL``+HG``"](Q`$ZD=$`#\B"`!?
+M(@``?:<`0%MK``"Z)P``O2,0!.I'2``_(@@`7R(``'VG`$!;:P``NB<``+TC
+M$`3J1U``/R(2!/]'``!]IP!`6VL``+HG``"](Q`$ZD=,`#\B$@3_1P``?:<`
+M0%MK``"Z)P``O2,0!.I'#$`_(A($_T<``'VG`$!;:P``NB<``+TC$`3J1T``
+M/R(2!/]'``!]IP!`6VL``+HG``"]([`53Z(0!.I'`0`_)AB`,2(``'VG`$!;
+M:P``NB<``+TC$`3J1P$`/R9(@#$B$@3_1P``?:<`0%MK``"Z)P``O2,0!.I'
+M$03_1P``?:<`0%MK``"Z)P``O2,0!.I'`0`_)E"`,2(2!/]'``!]IP!`6VL`
+M`+HG``"](Q`$ZD<!`#\F5(`Q(A($_T<``'VG`$!;:P``NB<``+TC$`3J1P$`
+M/R98@#$B$@3_1P``?:<`0%MK``"Z)P``O2,0!.I'`0`_)ER`,2(2!/]'``!]
+MIP!`6VL``+HG``"](Q`$ZD<!`#\F8(`Q(@$`7R(``'VG`$!;:P``NB<``+TC
+M$`3J1P$`/R9D@#$B`0!?(@``?:<`0%MK``"Z)P``O2,0!.I'`0`_)FB`,2(2
+M!/]'``!]IP!`6VL``+HG``"](Q`$ZD<!`#\F*(`Q(A($_T<``'VG`$!;:P``
+MNB<``+TC$`3J1P$`/R8L@#$B$@3_1P``?:<`0%MK``"Z)P``O2,0!.I'`0`_
+M)FR`,2(2!/]'``!]IP!`6VL``+HG``"](Q`$ZD<!`#\F,(`Q(O__7R(``'VG
+M`$!;:P``NB<``+TC$`3J1P$`/R8T@#$B__]?(@``?:<`0%MK``"Z)P``O2,0
+M!.I'`0`_)CB`,2(!`%\B``!]IP!`6VL``+HG``"](PD$_T<``#TD``"!(4@`
+M/J0K]B%(_P_?(4$&+$$``"&B!`!@Y0"`,2`A]B%(H0<N0`<`(/1!!BQ!!`!!
+MHA`$ZD<``'VG`$!;:P``NB<``+TC"3`@0:'7-$'O_S_T$`3J1Q$$[4<``'VG
+M`$!;:P``NB<``+TC`P!?(#4!`.00!.I'`0`_)BB8,2(``'VG`$!;:P``NB<`
+M`+TC(+8?2#`4+Z`A5B!(``0!1```X$,0!.I'`0`_)BB8,2(2!.!'``!]IP!`
+M6VL``+HG``"](S`4;Z#!4&!((A<C2"$7(D@"!$%$TG!@2!+P7T8A%T%*`@1!
+M1!($0D82`/)#$`3J1P$`/R8TF#$B``!]IP!`6VL``+HG``"](Q`$ZD<!`#\F
+M1)@Q(@``?:<`0%MK``"Z)P``O2-_P#\@```!1"P4+Z`A=B!(@38@2(`_7R`!
+M`")$``0!1```X$,0!.I'`0`_)D28,2(2!.!'``!]IP!`6VL``+HG``"](Q`$
+MZD<!`#\F2)@Q(@``?:<`0%MK``"Z)P``O2/\_S\D_P\A(````40L%"^@(78@
+M2"%7(4@$`%\D`/!"(`$`(D0`!`%$``#@0Q`$ZD<!`#\F2)@Q(A($X$<``'VG
+M`$!;:P``NB<``+TC$`3J1P$`/R9DF#$B``!]IP!`6VL``+HG``"](_C_/R3_
+M#R$@```!1#`4+Z`!\#]$(9<A2`@`7R0`\$(@`0`B1``$`40``.!#$`3J1P$`
+M/R9DF#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.I'`0`_)A"9,2(``'VG`$!;
+M:P``NB<``+TC`'$`1"P4+Z`!<"!$``0!1```X$,0!.I'`0`_)A"9,2(2!.!'
+M``!]IP!`6VL``+HG``"](Q`$ZD=8`#ZFG`9`TP,`7R"J``#D2`!>I!H`0.18
+M`'ZD!`!#H`%00$0%`"#T`=!?1`+Q7T0!\#]$`00B1`0`([!8`%ZD```BH,%2
+M($@"`$TL`@!M($("0TAA`R-(`00B1`(`+3Q8`'ZD!``CH`0`32P$`&T@0@!#
+M2&$!(T@!!")$!``M/!`$ZD<!`#\F')@Q(@$`7R(``'VG`$!;:P``NB<``+TC
+MZ`,?(@``?:<`0%MK``"Z)P``O2,0!.I'`0`_)F"8,2(``'VG`$!;:P``NB<`
+M`+TC`#0`1```X$,0!.I'`0`_)F"8,2(2!.!'``!]IP!`6VL``+HG``"](Q`$
+MZD<!`#\F8)@Q(@$`7R(3!/]'``!]IP!`6VL``+HG``"](Q`$ZD=8`#ZF``!]
+MIP!`6VL``+HG``"](PD$_T<*``#T`@!M+`(`32#!`F)(`50@1$,"8DAA`R)(
+M`00C1`(`+3P#`%\@50#@PQ$`Z4,0!.I'``!]IP!`6VL``+HG``"](PDP($&A
+M72!!]_\_]`04*J`%`"#D$`3J1P``?:<`0%MK``"Z)P``O2,0!.I'`0`_)B2`
+M,2(``'VG`$!;:P``NB<``+TC@/X_)/__(2````%$``#@0Q`$ZD<!`#\F)(`Q
+M(A($X$<``'VG`$!;:P``NB<``+TCM!5/H"+V04C__S\@@18D2*(%04`&`$#T
+MM!4OHA`$ZD<``'VG`$!;:P``NB<``+TCN!5/H"+V04C__S\@@18D2*(%04`&
+M`$#TN!4OHA`$ZD<``'VG`$!;:P``NB<``+TCO!5/H"+V04C__S\@@18D2*(%
+M04`&`$#TO!4OHA`$ZD<``'VG`$!;:P``NB<``+TCJ`,JH`@`(.02`.%#$`3J
+M1P$`/R9H@#$B``!]IP!`6VL``+HG``"](T``/J2,`RJP`0`?(`4`X,-0`'ZD
+M```CH`$`(.0``$.P``3_1P``7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WJ4X
+M`/ZE8`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"P3P1PD$
+M\4<!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2,@=@!(H34@01$`(/2A/2!!`@`@
+MY`H`(.4=`.##H=4@00,`(/2A%2%!#0`@]!@`X,.L%4NB$@021%$`/R0+`.##
+MK!5+HA($$D12`#\D!P#@PZP52Z(2!!)$%``_)`,`X,.L%4NB$@021!``/R02
+M!$%&$@#R0Q`$ZT<!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``
+M7J48`'ZE(`#>(P&`^FL``+LG``"](_#_WB,``%ZWC`,PHL/_7],``%ZG$`#>
+M(P&`^FL``+LG``"](_#_WB,``%ZW"``_(@H`7R+5`4#3``!>IQ``WB,!@/IK
+M``"[)P``O2/P_]XC``!>MP@`/K4)!/!'$03_1P$`7R(``'VG`$!;:P``NB<`
+M`+TC`03_1Q4``.00!.E'#P`_(B!.7R+``4#3`03_1P\``.3H`Q\B``!]IP!`
+M6VL``+HG``"](Q`$Z4<?`#\B($Y?(K4!0-,T"!\B``!]IP!`6VL``+HG``"]
+M(P$`/R``!.%'``!>IP@`/J40`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU
+M$`!>M0H$\$<)!/%'$03_1P$`7R(``'VG`$!;:P``NB<``+TC`03_1S,``.02
+M!/]'!0`@Y0(`*2P"`$D@P0(B2`$0(D32-"!$$@#R0Q`$ZD<!`#\F!)@Q(@``
+M?:<`0%MK``"Z)P``O2,0!.I'#P`_(B!.7R*'`4#3`03_1QX``.3H`Q\B``!]
+MIP!`6VL``+HG``"](Q`$ZD<?`#\B($Y?(GP!0-,!!/]'$P``Y#0('R(``'VG
+M`$!;:P``NB<``+TC$`3J1Q$$_T<!`%\B``!]IP!`6VL``+HG``"](P$$_T<%
+M``#D$`3J1Q$$_T<*`%\B:`%`TP$$X$<`!.%'``!>IP@`/J40`%ZE(`#>(P&`
+M^FL``+LG``"]([#_WB,``%ZW"``^M1``7K48`'ZU(`">M2@`OK4P`-ZU.`#^
+MM0H$\$<,!/%'0`!>M@``?:<`0%MK``"Z)P``O2,+!.!'`03_1S\!`.00!.I'
+M`0`_)FB`,2(``'VG`$!;:P``NB<``+TC`!0,1```X$,0!.I'`0`_)FB`,2(2
+M!.!'``!]IP!`6VL``+HG``"](Q`$ZD<!`#\F)(`Q(@``?:<`0%MK``"Z)P``
+MO2,-`.!#@/]?)O__4B(2`+)%$`3J1P$`/R8D@#$B``!]IP!`6VL``+HG``"]
+M(Z`/'R(``'VG`$!;:P``NB<``+TC$`3J1P$`/R8(F#$B``!]IP!`6VL``+HG
+M``"](P`(/R0`!`%$``#@0Q`$ZD<!`#\F")@Q(A($X$<``'VG`$!;:P``NB<`
+M`+TC"@`?(@``?:<`0%MK``"Z)P``O2,0!.I'$03K1\T$0-,!!/]'^P``Y.@#
+M'R(``'VG`$!;:P``NB<``+TC$`3J1P$`/R8(F#$B``!]IP!`6VL``+HG``"]
+M(P#X/R3__R$@2``^M````40``.!#$`3J1P$`/R8(F#$B$@3@1P``?:<`0%MK
+M``"Z)P``O2,0!.I'`0`_)EB8,2(``'VG`$!;:P``NB<``+TC"0#@0Q`$ZD<!
+M`#\F7)@Q(@``?:<`0%MK``"Z)P``O2,/`.!#$`3J1P$`/R9HF#$B``!]IP!`
+M6VL``+HG``"](PX`X$,$_%\F__]2(A(`,D7\`S\D$@1!1A`$ZD<!`#\F6)@Q
+M(@``?:<`0%MK``"Z)P``O2/`_U\F?P!2(A(`\D5``#\D@,`A(!($0480!.I'
+M`0`_)ER8,2(``'VG`$!;:P``NB<``+TC_O]?)A\`4B(2`-)%@!$_(!($0480
+M!.I'`0`_)FB8,2(``'VG`$!;:P``NB<``+TC%``?(@``?:<`0%MK``"Z)P``
+MO2,0!.I'`0`_)@B8,2(``'VG`$!;:P``NB<``+TC``@_)``$`40``.!#$`3J
+M1P$`/R8(F#$B$@3@1P``?:<`0%MK``"Z)P``O2,*`!\B``!]IP!`6VL``+HG
+M``"](Q`$ZD<!`#\FU)@Q(B$`7R(``'VG`$!;:P``NB<``+TC$`3J1P$`/R8(
+MF#$B``!]IP!`6VL``+HG``"](T@`7J0```)$``#@0Q`$ZD<!`#\F")@Q(A($
+MX$<``'VG`$!;:P``NB<``+TCZ`,?(@``?:<`0%MK``"Z)P``O2,0!.I'`0`_
+M)F"8,2(``'VG`$!;:P``NB<``+TC`#0`1```X$,0!.I'`0`_)F"8,2(2!.!'
+M``!]IP!`6VL``+HG``"](Q`$ZD<!`#\F8)@Q(@$`7R(3!/]'``!]IP!`6VL`
+M`+HG``"](Q`$ZD<!`#\F6)@Q(A($Z4<``'VG`$!;:P``NB<``+TC$`3J1P$`
+M/R9<F#$B$@3O1P``?:<`0%MK``"Z)P``O2,0!.I'`0`_)FB8,2(2!.Y'``!]
+MIP!`6VL``+HG``"](Q`$ZD<1!.M'``!]IP!`6VL``+HG``"](Q0``/2($Q\B
+M``!]IP!`6VL``+HG``"](Q`$ZD<1!.M'``!]IP!`6VL``+HG``"](P@``/0"
+M`&PL`@!,(,$"8D@!5"!$0P)B2&$#(D@!!"-$`@`L/!`$ZD<!`#\F:(`Q(@``
+M?:<`0%MK``"Z)P``O2,`$0Q$``#@0Q`$ZD<!`#\F:(`Q(A($X$<``'VG`$!;
+M:P``NB<``+TC$`3J1P$`/R8D@#$B$@3M1P``?:<`0%MK``"Z)P``O2,!`#\@
+M0`!>I```(K`!`#\@``3A1P``7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WJ4X
+M`/ZE4`#>(P&`^FL``+LG``"](]#_WB,``%ZW"``^M1``7K48`'ZU"P3P1PD$
+M\4<*!/)'__\_(,$$,48@`#ZP`$`_(A($Z4<``'VG`$!;:P``NB<``+TC"@#J
+M0Q`$ZD<``'VG`$!;:P``NB<``+TC"?`A12``/J`!\"%$(``^L!(`X4,0!.M'
+M`$`_(A,$Z4<``'VG`$!;:P``NB<``+TC"@#@0PF0($4'`"#U$`3K1Q0`/R(2
+M!/]'``!]IP!`6VL``+HG``"](P`$ZD<``%ZG"``^I1``7J48`'ZE,`#>(P&`
+M^FL%!/]'"@"?(`$`\B`!!(1``P`A(`'P/T2A!4%"!P`@Y`$$)$(``&$LP@!A
+M2*+U1T#``&%(00!`Y"H`X,,!!(1``P`A(`'P/T2A!2=`H@GD0P$`(D0E`"#D
+M!@0D0@``1BS!`$9(H?4G0!X`(/0A,8!`!00A0@``92S!`&5(H?4G0!@`(/3"
+M`$9(PP!E2"(%0T!"!$)`0@1"0&('0D`"!$)`YP-"("+V04A!!D)`80<B0$$&
+M(4!!!B)`000A0$$$(D!!!B)`804A0&$'(4!!!")`804B0('6)$@!!"-``/`_
+M1`&`^FL!`+\@!P#@PP8`H.0!!"1"``!A+,(`84BB]4=`P`!A2`T`0.0D,8!`
+MO_^?^`0$_T<!!"1"``!A+,(`84BB]4=`P`!A2`0`0.0$,(!`H5V!0/?_/_0!
+M`!\@`8#Z:P``NR<``+TC__]_(`8$XT<%!/]'!`0E0@``)"S"`"1(H?5'0`X`
+M(/2A!5)`)``@]```1"S"`$1(H@-20,,$140``"0LP0`D2*$',D`$`"#T!@3E
+M1P$`(R`$`"#T&`#@PP4PH$"A7:%`ZO\_]`H`7R"B"45`__\_(*$%84`"`$%$
+M/P`?($<`0/2A7:%`%P`@]`$$8T`#`$$@```S+$$`,TAB`5-(`@1!1```4SP!
+M!"-""P`A(```02S``$%(`8#Z:P$$I4`#`$$@```S+$$`,TAB`5-(`@1!1```
+M4SP+`$0@```B+,``(D@!@/IK`01F0`,`02```#,L00`S2&(!4T@"!$%$``!3
+M/`,$(T(``$,LP@!#2#@%0D)8!!A#6`080U@$&$,!!"9"```A+]D`(4M8$@!#
+M.0$B0P``?:<`0/MJ"P`A(```02S"`$%("P!C(```@RS!`(-((@5!0`(`8D_G
+M`T(@(O9!2$$&0D!A!R)`008A0$$&(D!!!"%`000B0$$&(D!A!2%`80<A0$$$
+M(D!A!2)`F]8D2,$`@T@!!&%#`/`_1`&`^FNA=R="/`!?(,($,42L`S"@(98_
+M2")V0$@"!$%$K`-0L`$`'R`!@/IK``"[)P``O2.P_]XC``!>MP@`/K40`%ZU
+M&`!^M2``GK4H`+ZU,`#>M3@`_K4.!/!'#`3R1P8$\$<L%#"@@98B2`'P($0/
+M`%(L#P!R($(`0TAA`2-(`00B1`\`,CPL%#"@@18B2`'P($00`%(L$`!R($(`
+M0TAA`2-(`00B1!``,CP``#$LP0(Q2,[K(2`A=B!(H=<R0``$_T=6`2#D!`3_
+M1[@#L*`A]H%(`00F0#8482PV%"$@(G:@2,,`84BB!4-``P!`]`0P@$"A=X!`
+M]?\_]*&5@$``!/]'1@$@]```<2S#`G%(SNMC(`,`XT-!!&-`008C0$$$(4!A
+M!2-`000C0"+7(4@B!4%`0@1#0&('0T""5T1(@_=C2"(%0T"A=T%`(S%`0(($
+M(T0B]D%(001"0&$%(D!!!B%`804B0&$%(D!A!2)`804B0&$%(D!A!2)`804B
+M0&$%(D!A!2)`804B0&$%(D!A!2)`@38D2&('(4!"!$%`#03"0#H4K2$D]H%(
+M!`2D01D`A"```"0LP0`D2`X`3"P.`&P@0@!#2&$!(T@!!")$#@`L/!8`;2P6
+M`"T@PP!A2```)"S!`"1(H@-A0,$$0T0)`$PL"0!L(4(`2TAA`2M(`00B1`D`
+M+#P7`&TL%P`M(,,`84@``"0LP0`D2*(#84#!!$-$"`!,+`@`3"%"`$I(80$J
+M2`$$(D0(`"P\&`!M+!@`+2##`&%(```D+,$`)$BB`V%`P01#1`<`3"P'`"PA
+M0@!)2&$!*4@!!")$!P`L/```1"[2`$1*$`3N1Q$$[4=``'XB]_Y?TP\$X$<)
+M`$PNT@!+2A`$[D<1!.U'00!^(O#^7],+!.!'"`!,+M(`2DH0!.Y'$03M1T(`
+M?B+I_E_3"@3@1P<`3"[2`$E*$`3N1Q$$[4=#`'XBXOY?T[`#+J`A]B%(A@`@
+MY`($(4```#TD```A(`($04```"(LQ`(B2$``?BQ``%X@P0!B2`,`1""A"2)`
+M!0`@Y$``/B!"`&%(`P`_($``?B`%`.##0`!>+$``?B#!`$-((04D0$(`0TAA
+M`2-(`00B1$``/CQ``%XN0``^(-(`04H0!.Y'$03M1V[^7],.`"PL#@!,($$`
+M(DA@!P)(``0!1`X`##S```)(1``^(1`$[D<1!.U'$@3@1Q,$Z4>S_E_3#P3@
+M1T``7BQ``'X@P@!#2$$`GBQ!`+X@PP"%2*$#0T`2!.-'T@0B1$0`A4AR`45*
+M$@1$1D$`7C[2`$5*$`3N1Q$$[4=/_E_3"0`L+`D`3"!!`")(8`<"2``$`40)
+M``P\P``"2!`$[D<1!.U'$@3@1Q,$Z4>5_E_3"P3@1T``7BQ``#X@P@!!2$(`
+MGBQ"`+X@PP"%2*$#0T`2!.-'T@0B1$0`A4AR`45*$@1$1D(`7C[2`$5*$`3N
+M1Q$$[4<Q_E_3"``L+`@`3"!!`")(8`<"2``$`40(``P\P``"2!`$[D<1!.U'
+M$@3@1Q,$Z4=W_E_3"@3@1T``7BQ``'X@P@!#2$,`GBQ#`+X@PP"%2*$#0T`2
+M!.-'T@0B1$0`A4AR`45*$@1$1D,`7C[2`$5*$`3N1Q$$[4<3_E_3!P`L+`<`
+M3"!!`")(8`<"2``$`40'``P\P``"2!`$[D<1!.U'$@3@1Q,$Z4=9_E_30``^
+M+$``7B#!`")(K`-.H")V7D@A-R)(`00B1*P#+K`.`$PL#@`L(,,`04@*`$PL
+M"@`L($(`04AA`6%(`00B1`H`+#P+`$PL"P`L($(`04AA`6%(`00B1`L`+#P,
+M`$PL#``L($(`04AA`6%(`00B1`P`+#P-`"PL#0!,($$`(DAC`6)(`P1A1`T`
+M;#PB!>!!```L+$$`+$AB`4Q(`@1!1```3#PA!>I!`0!,+`$`;"!"`$-(80$C
+M2`$$(D0!`"P\(07K00(`3"P"`&P@0@!#2&$!(T@!!")$`@`L/`8`+"P&`$P@
+M00`B2`8`+#P%`"PL!0!,($$`(D@%`"P\!``L+`0`3"!!`")(!``L/`,`+"P#
+M`$P@00`B2`,`+#P!`!\@``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE,`#>I3@`
+M_J50`-XC`8#Z:P``NR<``+TC</_>(P``7K<(`#ZU$`!>M1@`?K4+!/!'"03Q
+M1T``'B(``#TF```Q(D0`7R(``'VG`$!;:P``NB<``+TC(``>(@``/28``#$B
+M$0!?(@``?:<`0%MK``"Z)P``O2,0!.M'$03I1R``7B)>_E_3`@3_1QP!`.0O
+M`%XL+P`^(,$`04C__R$@`?`_1*&7($`"!/]'%`$@Y#``7BPP`#X@P0!!2/__
+M(2`!\#]$H9<@0`($_T<,`2#D"@3_1R``/B`)!"I````)+M``"4H%`#\B``!]
+MIP!`6VL``+HG``"](P``*2Q!`"E(8`$)2``$`40```D\`0`J("IV($BAUT!!
+M[O\_]`<`7R$@`%X@"01*0```"2[0``E*!@`_(@``?:<`0%MK``"Z)P``O2,`
+M`"DL00`I2&`!"4@`!`%$```)/`$`*B`J=B!(H==!0>[_/_0A`)X@(0!>+,(`
+M1$@BMT!(`A!<1"``/BP@`'X@P0`C2`'P(T0"!$%$0``^H`$$(D1``#ZP(P"^
+M(",`7BS"`$5((O=`2`(04$0B`#XL(@!^(,$`(TA!%"!``9`O1`($040A`#XL
+MP0`D2(%V($@!<"!$`@1!1$0`/J`!!")$1``^L"0`GB`D`%XLP@!$2"*70$@"
+M$%Y$(P`^+,$`)4B!-B!(`?`A1`($041(`#Z@`00B1$@`/K`F`+X@)@!>+,(`
+M14@BUT!(`A!81"4`/BPE`'X@P0`C2`$$(4`!T"=$`@1!1"0`/BS!`"1(`1`B
+M1*$#X4,"!$%$3``^H`$$(D1,`#ZP)P">("<`7BS"`$1(0A9`0`(07T0F`#XL
+MP0`E2(%6($@!\"!$`@1!1%``/J`!!")$4``^L"D`OB`I`%XLP@!%2"+W0$@"
+M$%!$*``^+"@`?B#!`"-(`00A0`'0+T0"!$%$)P`^+,$`)$@!$"1$H0/A0P($
+M0414`#Z@`00B1%0`/K`J`'X@*@!>+,(`0T@BMT!(`A!<1"D`/BS!`"5(@38@
+M2`'P(T0"!$%$6``^H`$$(D18`#ZP*P">("L`7BS"`$1(0A9`0`(07T0J`#XL
+MP0`C2(%V($@!\"!$`@1!1%P`/J`!!")$7``^L"P`7BPL`#X@P@!!2`($0D`"
+MT$]$*P`^+,$`)$@!$"1$H0/A0P($041@`#Z@`00B1&``/K`M`'X@+0`^+,$`
+M(T@AMR!(`1`\1&0`7J`"!$%$9`!>L"X`GB`N`%XLP@!$2$(60$`"$%]$+0`^
+M+,$`(TB!=B!(`?`@1`($041H`#Z@`00B1&@`/K`N`#XLP0`D2`$0)$2A`^%#
+M;`!>H`($041L`%ZP+P`^(2\`'B[0``E*`P`_(@``?:<`0%MK``"Z)P``O2,@
+M]P!(`!`01&``/J`!!"!$8``^L"\`'B[0``E*`P`_(@``?:<`0%MK``"Z)P``
+MO2.`-@!(`'``1&0`/J`!!"!$9``^L#``'BXP`#X@T``!2@,`/R(``'VG`$!;
+M:P``NB<``+TC0!0`0`"0`T1D`#Z@`00@1&0`/K`*!/]'`0`_)9R8*2%!%$!!
+M(`!>(`$$(D`@`$&B$`3K1Q$$Z4<``'VG`$!;:P``NB<``+TC`0`J("IV($BA
+M]T%!\O\_]$$40$$@`'X@`00C0"``0:(0!.M'`0`_)M28,2(``'VG`$!;:P``
+MNB<``+TC`0!?(``$XD<``%ZG"``^I1``7J48`'ZED`#>(P&`^FL``+LG``"]
+M(^#_WB,``%ZW"``^M1``7K4)!/!'"@3Q1P``4:`B=D!(`.Q"(`(`XD-!!$)`
+M008B0$$$(4!A!2)`000B0##7(4@P!0%"4`0"0G`'`D*05P1*@O=#2#`%`D(%
+M`#\B``!]IP!`6VL``+HG``"](Q(`X$,!!%)"`30H1!(`X4,0!.E'`0`_)IR8
+M,2(``'VG`$!;:P``NB<``+TC$`3I1P$`/R;`F#$B$@3_1P``?:<`0%MK``"Z
+M)P``O2/H$TFU`0`?(```7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/P_]XC
+M``!>MP$`/R9DF#$B``!]IP!`6VL``+HG``"](R#V`4B`=@)(_P%?(````D2!
+M%@%(!0`@Y`$(`D0!`"$@(0'A0R$7)DB`%R9(``!>IQ``WB,!@/IK``"[)P``
+MO2/0_]XC``!>MP@`/K40`%ZU&`!^M2``GK4*!/!'#`3Q1P$`/R9@F#$B``!]
+MIP!`6VL``+HG``"](P!4`$0``.!#$`3J1P$`/R9@F#$B$@3@1P``?:<`0%MK
+M``"Z)P``O2,0!.I'`0`_)F"8,2("`%\B$P3_1P``?:<`0%MK``"Z)P``O2,!
+M!/]'&P``Y`D$_T>X_W\AZ`,?(@``?:<`0%MK``"Z)P``O2,0!.I'O/]?TPDP
+M($&AG2)!H@E@00$`(D3T_S_T2``@(`4`(.P4`"R@(78^2!0`++`!!/]'!@#@
+MPQ0`3*`B=EY((1<"2`$$(D04`"RP`0`_(``$X4<``%ZG"``^I1``7J48`'ZE
+M(`">I3``WB,!@/IK``3_1P&`^FL`!/]'`8#Z:P``NR<``+TC\/_>(P``7K>A
+M72!"``3_1P@`(.1Q!3%"400Q0E$$,$+X%#$B``!]IP!`6VL``+HG``"](P``
+M7J<0`-XC`8#Z:P``NR<``+TC\/_>(P``7K<#!/)'H5T@0@`$_T<)`"#D<@4Q
+M0E($4D)2!%!"^!12(A$$XT<``'VG`$!;:P``NB<``+TC``!>IQ``WB,!@/IK
+M``"[)P``O2/0_]XC``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU"P3P1PH$\4<-
+M!/)'(O8A2J%50$`(`"#TH5=`0`,`(.2A-4!`"``@]`D`X,.A=4!``P`@]`8`
+MX,,"`)\A!@#@PP$`GR$$`.###`3_1P(`X,/__Q\@'@#@PV$%C$%!!"%`200P
+M0/@4*2$$`"F@__\?(!<`(/00!.E'/``_(@``?:<`0%MK``"Z)P``O2,$`$FQ
+M"@"@]0L`/R`,`"FP`@`_(!0`*;#__S\@&``IL`H`/R0!5"%$(``IL`0`X,,0
+M!.M'$03L1Q($[4>@_U_3``3L1P``7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``
+MWB,!@/IKH5<@0@`$_T<<`"#D(?8A2F$%(4!!!"%`0@0P0/@40B`$`"*@``3_
+M1Q0`(.0$`.*S`0!?("('44@"!>)'V!0PH`$`(D38%#"PW!0PH`$`(D3<%#"P
+MX!0PH`$`(D3@%#"PY!0PH`$`(D3D%#"PZ!0PH`$`(D3H%#"P`0`?(`&`^FL`
+M`+LG``"](]#_WB,``%ZW"``^M1``7K48`'ZU(`">M0D$\$<,!/%'"@3P1^@3
+M4*2A5R!"``3_1P`!(.0A]B%*804A0$$$(4!+!#!`^!1K(00`*Z``!/]'^``@
+MY`0`*Z"A-2!``0`?(/0`(.0``"*@@98B2$D`(.`!`#\F$(`Q(N`!7R(``'VG
+M`$!;:P``NB<``+TC$`3I1P$`/R84@#$B``A?)@`(4B(``'VG`$!;:P``NB<`
+M`+TC$`3I1P$`/R8@@#$BW@%?)L^/4B(``'VG`$!;:P``NB<``+TC%`!+HG(%
+M4D)2!%)",A="2@\`4B;@`3\@$@1!1A(`\D,0!.E'`0`_)D"`,2(``'VG`$!;
+M:P``NB<``+TC$`3I1P$`/R9$@#$BK@5?)L`#4B(``'VG`$!;:P``NB<``+TC
+M$`3I1P$`/R9$F#$B``!]IP!`6VL``+HG``"](P#Q#T0`%`=$``#@0Q`$Z4<!
+M`#\F1)@Q(A($X$<``'VG`$!;:P``NB<``+TC$`3I1P$`/R8$F#$B`&]?)B,@
+M4B)*`.##`0`_)A"`,2)H`5\B``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F%(`Q
+M(@`$7R8`!%(B``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F((`Q(MX!7R:GCU(B
+M``!]IP!`6VL``+HG``"](Q0`*Z!R!2%`<@5!0E($04)2%D!",`)2(C)W04HP
+M`C\@$@1!1A(`\D,0!.E'`0`_)D"`,2(``'VG`$!;:P``NB<``+TC$`3I1P$`
+M/R9$@#$BUP1?)I@#4B(``'VG`$!;:P``NB<``+TC$`3I1P$`/R9$F#$B``!]
+MIP!`6VL``+HG``"](P#Q#T0`E`-$``#@0Q`$Z4<!`#\F1)@Q(A($X$<``'VG
+M`$!;:P``NB<``+TC$`3I1P$`/R8$F#$B`&]?)B`04B(``'VG`$!;:P``NB<`
+M`+TC&`!+H"+V04C__S\@@18D2*(%04`/`%\B`0!`]!@`2Z(RET)*(`!+H(&6
+M04@!$#Y$$@1!1@+P0402!$)&"``_)``@(2`2!$%&$@#R0Q`$Z4<!`#\F'(`Q
+M(@``?:<`0%MK``"Z)P``O2,,`"N@!0`@X`$`7R`B!TQ(V!0JH`$$(D0$`.##
+M`0`_("$'+$C8%$J@`0%!1-@4*K`,`"N@!0`@X`$`7R`B!TQ(W!0JH`$$(D0$
+M`.##`0`_("$'+$C<%$J@`0%!1-P4*K`,`"N@`5`@1`4`(.0!`%\@(@=,2.`4
+M*J`!!")$!`#@PP$`/R`A!RQ(X!1*H`$!043@%"JP#``KH`&0($0%`"#D`0!?
+M("('3$CD%"J@`00B1`0`X,,!`#\@(0<L2.042J`!`4%$Y!0JL`P`*Z`!$"%$
+M!0`@Y`$`7R`B!TQ(Z!0JH`$$(D0$`.##`0`_("$'+$CH%$J@`0%!1.@4*K`!
+M`!\@``!>IP@`/J40`%ZE&`!^I2``GJ4P`-XC`8#Z:P``NR<``+TC\/_>(P``
+M7K<Q]B%*<04Q0E$$,4)1!#!"_!0QH"'V(4@(`"#DH34@0`8`(.01!/]'``!]
+MIP!`6VL``+HG``"](P$`X,/__Q\@``!>IQ``WB,!@/IK``"[)P``O2/P_]XC
+M``!>MS'V(4IQ!3%"400Q0E$$,$+\%#&@(O8A2*$U0$`$`"#T!P!`Y*%W0$`%
+M`"#D`@#@PQ$$_T<$`.##!``_(@(`X,,`!/]'!0#@PP``?:<`0%MK``"Z)P``
+MO2,!`!\@``!>IQ``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU&`!^
+MM0H$\$<)!/%'``!]IP!`6VL``+HG``"](PL`X$,`@#\F$0%Q11`$ZD<``'VG
+M`$!;:P``NB<``+TC$`3J1P$`/R9D@#$B``!]IP!`6VL``+HG``"](Q(`X$,&
+M`"#E)0`_("$%,D`A]B%(@38@2!(`04(+`.##H3=`0C(Q0$((`"#D$`3J1Q$$
+MZT<``'VG`$!;:P``NB<``+TC``3_1PX`X,,0!.I'`0`_)F2`,2(``'VG`$!;
+M:P``NB<``+TC$`3J1Q$$ZT<``'VG`$!;:P``NB<``+TC`0`?(```7J<(`#ZE
+M$`!>I1@`?J4@`-XC`8#Z:P``NR<``+TC\/_>(P``7K<(`#ZU"03P1S'V(4IQ
+M!3%"400Q0E$$,$+\%#&@(O8A2*$U0$`&`"#T%0!`Y*%50$`0`"#TH75`0`0`
+M(/00`.##"``_(@$`7R(/`.##"``_(@(`7R(``'VG`$!;:P``NB<``+TC$`3I
+M1R@`/R(.`%\B!0#@PR@`/R(*`%\B`@#@PP`$_T<%`.##``!]IP!`6VL``+HG
+M``"](P$`'R```%ZG"``^I1``WB,!@/IK``"[)P``O2/P_]XC``!>MS'V(4IQ
+M!3%"400Q0E$$,$+\%#&@(?8A2`H`(.2A-2!`"``@Y!0`/R(``'VG`$!;:P``
+MNB<``+TC@'8!2`#P`40!`.##``3_1P``7J<0`-XC`8#Z:P``NR<``+TCX/_>
+M(P``7K<(`#ZU$`!>M1@`?K4)!/!',?8A2G$%,4)1!#%"400P0OP4,:`B]B%(
+MH35`0`0`(/0M`$#DH55`0",`(/0J`.##"``_(@@`7R(``'VG`$!;:P``NB<`
+M`+TC"@3_1P!X?R$0!.E'%``_(@``?:<`0%MK``"Z)P``O2,```M$"```Y`H`
+M'R(``'VG`$!;:P``NB<``+TC"C!`01G\*B#P_S_L$`3I1P@`/R(2!/]'``!]
+MIP!`6VL``+HG``"](^<#/R"@#4%!"0#@PRP`/R($`%\B$P3_1P``?:<`0%MK
+M``"Z)P``O2,!`.##``3_1P``7J<(`#ZE$`!>I1@`?J4@`-XC`8#Z:P``GJ`0
+M`!ZA&`#>H"``_J`P`-ZB_?\T(*$W($``#+\D`@`@]"%7@TH%`.%#_P]?(`(`
+M0D8A5X)(`@1!1".784H$`#\D`/`A(`,`840"!$-$`@1%1`(`XD,``3\D!`1!
+M1`$`X/`$`.)#`A#B1``@/R0#!(%$`0!`]`,`Y$,``C\D@13`1`$$840+`%$L
+M"`!Q+`@`T2#D#"9(804F2$(,1DA#!&9(`@1$1`,$840+`%$\"`!Q/"+V`4G_
+M_S\@@18D2*(%04`?`$#T)+<!20@`/R0`X"$@!`"!1`\`42P,`'$L#``Q(.4,
+M@4AD!8%(0@Q!2$,$84@"!$5$`P1D1`\`43P,`'$\"`"1+`L`<2S!!(9(0@UF
+M2`$$(D0`0%\D`00B1.(,)DAA!29(0PQF2$0$AD@#!&)$!`2!1`L`<3P(`)$\
+M"@#@PP\`<2P,`)$L#``Q(`($_T?B#$%(0PQA2$0$@4@#!&)$#P!Q/`P`D3P!
+MD.!$(0`@Y`@`L2P+`)$L"`!Q(,$$HTA"#8-(`00B1$``7R0!!")$X@PC2&$%
+M(TA$#(-(102C2`0$@D0%!*%$"P"1/`@`L3P,`+$L#P"1+`P`<2#"!*-(00V#
+M2`($043X_S\D`0#!1@($043A#$-(8@5#2$0,@TA%!*-(!`2!1`4$HD0/`)$\
+M#`"Q/`$`'R`!@/IK``3_1P&`^FL(`+$L"P"1+`@`<2#!!*-(0@V#2`$$(D0`
+M(%\D`00B1.(,(TAA!2-(1`R#2$4$HT@$!()$!02A1`L`D3P(`+$\`8#Z:Q0`
+M8.8,`+$L#P"1+`P`<2#!!*-(0@V#2`$$(D0!`.%#`!!?(,(4@$8!!#)$`00B
+M1.(,(TAA!2-(1`R#2$4$HT@$!()$!02A1`\`D3P,`+$\-0#@PQT`@.8(`%4L
+M"P`U+`@`=2#"!$-(00TC2`($040+`'$L"`"1+`@`,2#E#$%(8@5!2$,,84A$
+M!(%(`P1E1`0$@D0+`'$\"`"1/`\`42P,`'$L#``Q(.0,04IE!4%*0@Q!2$,$
+M84@"!$1$`P1E1`\`43P,`'$\%P#@PPL`<2P(`)$L"``Q(`($_T?B#$%(0PQA
+M2$0$@4@#!&)$"P!Q/`@`D3P`$%\@`@1"1@\`<2P,`)$L#``Q(.4,04AB!4%(
+M0PQA2$0$@4@#!&5$!`2"1`\`<3P,`)$\!03_1Q<`42P4`'$L%``Q(.0,H4A"
+M#$%(0P1A2`($1$07`%$\%`!Q/!,`42P0`'$L$``Q(.4,H4A"#$%(0P1A2`($
+M1403`%$\$`!Q/`$`'R`!@/IK%`!1+!<`,2P4`'$@P@1#2$$-(T@"!$%$#P`?
+M((X`0.`4`%$L%P`Q+!0`<2#"!$-(00TC2`$$043^'U\@`0!!1```4BQ"`E)(
+M80,R2`$$(D0``#(\$``Q+!,`42P0`)$@P00D2$(-1$@!!")$@18B2`(`4BP"
+M`'(@0@)#2&$#(T@!!")$`@`R/`0`<BP$`+(@0P!E2`0`<CP0`%$L$P`Q+,($
+M1$A!#21(`01!1"@`(/`!4"!$!@`@Y,$`94@!-"!$0@!E2&$!)4@!!")$!``R
+M/!``,2P3`%$L$`!Q(,$$(TA"#4-(`00B1`$0(40(`"#D!`!R+`0`4B#!`&)(
+M`50@1$,`8DAA`2)(`00C1`0`,CP0`#$L$P!1+!``<2#!!"-(0@U#2`$$(D0!
+MD"!$"``@Y`0`<BP$`%(@P0!B2`&4($1#`&)(80$B2`$$(T0$`#(\"``Q+`L`
+M42P(`'$@P00C2$(-0T@!!")$@58B2`'P(40%`%(L!0!R($(`0TAA`2-(`00B
+M1`4`,CP4`%$L%P`Q+!0`<2#"!$-(00TC2`($040@`#\D`.`A(`(`042!MD%(
+M!@!2+`8`<B!"`$-(80$C2`$$(D0&`#(\$``Q+!,`42P0`)$@P00D2$(-1$@!
+M!")$@18A2`'P(40'`%(L!P!R($(`0TAA`2-(`00B1`<`,CP0`#$L$P!1+,$$
+M)$A"#41(`00B1`$0/D2!EB!("`!2+`@`<B!"`$-(80$C2`$$(D0(`#(\"@`R
+M+`H`4B!!`")("@`R/`L`,BP+`%(@00`B2`L`,CP`!/]'`8#Z:P&`^FL$`'$L
+M!`!1(,$`8D@!%"%$0P!B2&$!(D@!!"-$!``Q/``$_T<!@/IK``"[)P``O2/@
+M_]XC``!>MP@`/K40`%ZU&`!^M0L$\$<!`#\FT)@Q(A8<7R(``'VG`$!;:P``
+MNB<``+TC"03_1P$`7R6`F$HA$`3K1Q$$ZD<!`%\F``!]IP!`6VL``+HG``"]
+M(PDP($&A_2!!]O\_]!`$ZT<!`#\F`)PQ(@``?:<`0%MK``"Z)P``O2/0<`!(
+M@I8`2@'P`48AER!($`1!1`@`/R(``'VG`$!;:P``NB<``+TC``!>IP@`/J40
+M`%ZE&`!^I2``WB,!@/IK``"[)P``O2.P_]XC``!>MP@`/K40`%ZU&`!^M2``
+MGK4H`+ZU,`#>M3@`_K4/!/!'"P3Q1PP$\D<-!/-'2`">MK@P'R(``'VG`$!;
+M:P``NB<``+TC"03@1P(`7R&;`0#D#@3@1Q`$X$<``#TF```Q(B@47R(``'VG
+M`$!;:P``NB<``+TC$`!IM1@`B;4@`*FU>`/IL:P#*:`AEC](`?0G1*P#*;"P
+M`^FS<##ILXPPZ;,`!S\@E#`IL/__/R"8,"FPG#`IL*`P*;`0!.E'$03_1P``
+M?:<`0%MK``"Z)P``O2,#`%\A>0$`Y'@#2:`B=D!(`0`_)!OQ(2"B!4%`%0!`
+MY!`$Z4<!`#\F`*(Q(A($_T<``'VG`$!;:P``NB<``+TC$`3I1P$`/R9\F#$B
+M&0!?(@``?:<`0%MK``"Z)P``O2/H`Q\B``!]IP!`6VL``+HG``"](Q`$[D<@
+M0#\B``!]IP!`6VL``+HG``"](P#P'T2#E@!(?`-NL`+P`42``RZ@(98_2")V
+M0$@"!$%$@`-.L/[_8R"C5V!`#0!?(4L!8.00!.Y'`0`_)AB8,2(``'VG`$!;
+M:P``NB<``+TC@`,NH"%V/D@@%P)(``0!1(`##K`0!.Y'9P%`TPX`7R$[`0#D
+M?`,NH*%W($`0!.Y'`0`_)@"8,2('`%\B!``@Y!`$[D<!`#\F`)@Q(D<`7R(`
+M`'VG`$!;:P``NB<``+TCT`<?(@``?:<`0%MK``"Z)P``O2,0!.Y'0?]?TX0#
+M+J`AEC](('8`2``$`42$`PZP`!`>1*`5`D`-`%\A'`$`Y!`$[D?!`#\B0`!>
+M(@``?:<`0%MK``"Z)P``O2,(`%\A$P$`Y$``/BQ``%X@P0(B2/\O7R"A!R)`
+M!0!?(0P!(/0H%"F@(98_2$``7BQ``'X@P@)#2`($040H%$FP$`3N1Q!`/R(`
+M`'VG`$!;:P``NB<``+TC`!`#1*`5`D`*`%\A^P``Y!`$[D<_`#\B0`!>(@``
+M?:<`0%MK``"Z)P``O2,(`%\A\@``Y$``/BQ``'X@P@(C2"@4*:`A=CY(8E-`
+M2`($040H%$FP"P3_1PH$_T<_`Y\A$1!801`$[D=``%XB``!]IP!`6VL``+HG
+M``"](]X``.1``#XL0`!>(,$"(D@!""M$"P#A0PHP0$$A]D%)H0<L0.__/_0B
+M]F%)`0`_)/__(2"B!4%`!P!?(=``0.2<%2F@(78^2`H`7R0"!")$G!5)L*@7
+M*:`AEC](`70@1*@7*;`*!/]'"P"?("+V04EA!4)`000B0$$$*4"0%6$@%@!#
+M+*85(2!"`D%(80.!2`$$(D06`",\"C!`0:$W04'R_S_T"@3_1P``/20``.$B
+M"P#?(B?V04D$!.=`!02)0*`7Q2`$!)=````$+<$"!$D0`$8LL!=E($("0TAA
+M`R-(`00B1!``)CS!`@1)"@!&+*H7I2!"`D5(80,E2`$$(D0*`"8\807G0$$$
+M)T!!!"E`4!B!(!P`9"QL&$$@0P)B2&(#PDH"!$-$'`!$/,`782`0`$,LT!<A
+M($("04AA`\%*`00B1!``(SP*,$!!H5=`0=C_/_0H%"DB$`3N1P``?:<`0%MK
+M``"Z)P``O2,(`%\A@P``Y'P#+J"A=R!`*P`@]$`4*:#!4B!(*``@Y!`$[D<!
+M`#\F`)@Q(@=`7R(``'VG`$!;:P``NB<``+TCT`<?(@``?:<`0%MK``"Z)P``
+MO2,0!.Y'BOY?TX0#+J`A=CY((!<"2``$`42$`PZP$`3N1P$`/R8`F#$B!P!?
+M(@``?:<`0%MK``"Z)P``O2/0!Q\B``!]IP!`6VL``+HG``"](X0#+J#!4B!(
+M`1`^1*$5)$`-`%\A5@`@Y`,`X,-`%"F@(78^2$`4*;`0!.Y'OP`_(D``7B(`
+M`'VG`$!;:P``NB<``+TC"`!?(4D``.0L%$F@(I9?2$``/BQ``'X@P0(C2`$$
+M(D0L%"FPN`-.H"*67T@A=B!(`00B1+@#+K```#VD:`,NM!`$[D?[`$#3$`3N
+M1P``?:<`0%MK``"Z)P``O2,+!/]'"@3_1Q\`GR$Q`8I!$`3N1T``7B(``'VG
+M`$!;:P``NB<``+TC*```Y$``7BQ``'X@P0)#2`L`84$$!$I!(?:!2`$$*4#P
+M+2$@P@)#2(,604@``$$L0@!!2&,!84@#!&)$``!A/`$`A"`D]H%(!`2)0/`M
+MA"!``#XL0`!^(,("(T@``"0L00`D2&(!1$@"!$%$``!$/`HP0$&A5T!!VO\_
+M]"'V84FC%2!``P!?)/W_0B"A!2)``P1A1`D`7R$`!.Y'#`!@Y`$`X,,(`%\A
+M!0`@Y1`$Z4<``'VG`$!;:P``NB<``+TC2``^I`$`(.0``$&Q``3_1P``7J<(
+M`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WJ4X`/ZE4`#>(P&`^FL``+LG``"](_#_
+MWB,``%ZW"``^M0D$\$<H%#`B``!]IP!`6VL``+HG``"](Q`$Z4<``'VG`$!;
+M:P``NB<``+TC``!>IP@`/J40`-XC`8#Z:P``NR<``+TCH/_>(P``7K<(`#ZU
+M$`!>M1@`?K4@`)ZU*`"^M0P$\$<``#TD``!!H```(2`$`"&@,`!>L#0`/K``
+M`#TD``"!H```(2`$`$&@"`!AH`P`(:!0`)ZP5`!>L%@`?K!<`#ZP#03_1TD4
+MH$$P`#X@"00A00``::$0!.Q'$03K1P``?:<`0%MK``"Z)P``O2,0``FP"@3_
+M1R$70DD!!$%%"0#A0Q`$[$<1!.M'$@3I1P``?:<`0%MK``"Z)P``O2,0!.Q'
+M$03K1P``?:<`0%MK``"Z)P``O2,@]@%((?8A2:`%`4`"!/]',```Y`HP0$&A
+M_5]!Z/\_]`H$_T=!%$!!,`!>(`$$(D`@`"&A$`3L1Q$$ZT<2!.E'``!]IP!`
+M6VL``+HG``"](Q`$[$<1!.M'``!]IP!`6VL``+HG``"](R'V(4D@]@%(H04@
+M0`($_T<6`"#D"C!`0:%]0$'G_S_T012@03``7B`!!")````AHA``0:(0!.Q'
+M``!]IP!`6VL``+HG``"](PTPH$&A/:!!M?\_]&0`'R(``'VG`$!;:P``NB<`
+M`+TC`0!?(``$XD<``%ZG"``^I1``7J48`'ZE(`">I2@`OJ5@`-XC`8#Z:X$6
+M(4H*`"#@``!2+$("4D@X$S\@80,R2`$$(D0``#(\``!3+$("4TC4%S\@#@#@
+MPP$0,$81`"#D0!0PH,%2($@.`"#D``!2+$("4D@("3\@80,R2`$$(D0``#(\
+M``!3+$("4TBL"C\@80,S2`$$(D0``#,\`0`?(`&`^FL`!/]'`8#Z:P$`'R`!
+M@/IK``"[)P``O2/`_]XC``!>MP@`/K40`%ZU&`!^M2``GK4,!/!'"@3P1PL$
+M\$>0`S`AN`,PH"%V($BA-2!`!@`@Y!``/R(P`%XB``!]IP!`6VL``+HG``"]
+M(P0`Z;,\%"J@P5(@2`<`(.0!`#\@!``IL"P4*J#!4B!(`@`@]`,`/R`$`"FP
+M0!0JH,%2($@#`"#D!``IH`&4($0$`"FPK`H_)`@)(2`0`"FPU!<_)#@3(2`,
+M`"FP``!)H`)T0$0!`#\D`@1!1`$`(20"!$%$?@`A)`%4(40(`"FPX/\_)/__
+M(2`"`$%$P/\_)/__(2`"`$%$``!)L#`4*J#!4B!(#@`@Y``42R(0!.Q'#P`_
+M(@``?:<`0%MK``"Z)P``O2,&``#D`0`_(`04*[```"F@@`!?)`$$(D0``"FP
+M#0`_(!0`*;`!`#\@(!0KL`$`'R```%ZG"``^I1``7J48`'ZE(`">I4``WB,!
+M@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU"@3P1PD$\4<$`%&B`0`_)BB`
+M,2(``'VG`$!;:P``NB<``+TC#`!)HA`$ZD<!`#\F+(`Q(@``?:<`0%MK``"Z
+M)P``O2,0`$FB$`3J1P$`/R8P@#$B``!]IP!`6VL``+HG``"](P@`2:(0!.I'
+M`0`_)C2`,2(``'VG`$!;:P``NB<``+TC``!)HA`$ZD<!`#\F((`Q(@``?:<`
+M0%MK``"Z)P``O2,``%ZG"``^I1``7J4@`-XC`8#Z:P``NR<``+TCT/_>(P``
+M7K<4`#ZRC`,PH"+V(4BA-4!`!0`@]`H`0.2AU4!`"``@]*$504`0`"#D`0`_
+M)"$Q($`<`#ZP"``_)"$Q($`)`.##```]I```(:`A!2%"018@0!P`/K```#VD
+M```AH"$%(4)!%B!`(``^L`$`,2`8`#ZP@0$_)/__(2`!`$%&$``^L!``/B*H
+M_U_3``!>IS``WB,!@/IK``"[)P``O2/P_]XC``!>MP@`/K4)!/!'`0`_)BB`
+M,2(2!/]'``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F!(`Q(@``?:<`0%MK``"Z
+M)P``O2,``.!#!``_)``$`43,_R$D__\A(````400!.E'`0`_)@2`,2(2!.!'
+M``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F((`Q(@$`7R;__U(B``!]IP!`6VL`
+M`+HG``"](P``7J<(`#ZE$`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``
+M7K48`'ZU"03P1PH$\4<+!/!'$``QH,%2($@I`"#D`0`_)@2`,2(``'VG`$!;
+M:P``NB<``+TC$``_)``$`40``.!#$`3I1P$`/R8$@#$B$@3@1P``?:<`0%MK
+M``"Z)P``O2,0`$JB,G9`2A`$Z4<!`#\F)(`Q(@``?:<`0%MK``"Z)P``O2,0
+M`$JBTE)`2A`$Z4<!`#\F.(`Q(@``?:<`0%MK``"Z)P``O2,4`$JB4A)`0A`$
+MZ4<!`#\F,(`Q(@X`X,,!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2/P_S\D__\A
+M(````40``.!#$`3I1P$`/R8$@#$B$@3@1P``?:<`0%MK``"Z)P``O2,``$JB
+M$`3I1P$`/R8H@#$B``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F((`Q(@``?:<`
+M0%MK``"Z)P``O2.`_S\D```!1`@`*J`A=B!(``0!1```X$,2!.!'&`!*H"%V
+M0$@&`"#D(79`2`0`(2`A%R)(?P!?)`$`(D02!`%$$@#R0Q`$Z4<!`#\F((`Q
+M(@``?:<`0%MK``"Z)P``O2.4,$N@(K9?2!@`*J#!4B!(83$@2`($0424,$NP
+M$@#B0Q`$Z4<!`#\F&(`Q(@``?:<`0%MK``"Z)P``O2,0!.E'!$`_(@``?:<`
+M0%MK``"Z)P``O2,@EA]('``JH&$7(T`A=B!(``0!1```X$,0!.E'!$`_(A($
+MX$<``'VG`$!;:P``NB<``+TC``!>IP@`/J40`%ZE&`!^I2``WB,!@/IK``"[
+M)P``O2/P_]XC``!>MPA`/R(``'VG`$!;:P``NB<``+TCH`/@0P``7J<0`-XC
+M`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M0H$\$<)!/%'P``_(@``?:<`
+M0%MK``"Z)P``O2,``.!#(O8!2/__/R"!%B1(H@5!0`,`0.0``.FS``3_1T0`
+MX,,&`3\DNM@A(`(``40``$FP@78"2`,`(.``0#\D`01!1```*;`!L`!$`P`@
+MY```*:`!-"!$```IL,`%/R`!``%$`P`@Y```*:`!%"A$```IL`$0!$0&`"#D
+M(!0JH`0`(.0``"F@`$!?)`$$(D0``"FP```IH('6(T@D`"#@"!0*L!`$ZD?$
+M`#\B``!]IP!`6VL``+HG``"](PP4"K`0!.I'R``_(@``?:<`0%MK``"Z)P``
+MO2,0%`JP$`3J1\P`/R(``'VG`$!;:P``NB<``+TC%!0*L!`$ZD?0`#\B``!]
+MIP!`6VL``+HG``"](Q@4"K`0!.I'U``_(@``?:<`0%MK``"Z)P``O2,<%`JP
+M`0`?(```7J<(`#ZE$`!>I2``WB,!@/IK_"T0H`&`^FL``+LG``"](]#_WB,`
+M`%ZW"``^M1``7K48`'ZU(`">M0L$\$<)!/%'"@3P1_PMD*$!`.Q##``@^"0`
+M/R(2!/]'``!]IP!`6VL``+HG``"](Q`$ZT<D`#\B``!]IP!`6VL``+HG``"]
+M(Q(`Z4,&`3\DNM@A(!(`048!$"A%#@`@Y``N*J`"%$A&T@0B1`0N*J`"`"#D
+M``$_(!($048(+BJ@`A101M($(D0,+BJ@`@`@Y``$/R`2!$%&`?1`1I("(46!
+MUB-)`@`@X`@`/R02!$%&$`3K1Z``/R(``'VG`$!;:P``NB<``+TC_"TJL0$`
+MZ4,'`"#X$`3K1R0`/R(!`%\B``!]IP!`6VL``+HG``"](P`$[$<``%ZG"``^
+MI1``7J48`'ZE(`">I3``WB,!@/IK@``?(`&`^FL``+LG``"](_#_WB,``%ZW
+MH?<O0@T`(.0QMR!*`0`Q)AR(,2(``'VG`$!;:P``NB<``+TC``#@0P$`/R0`
+M@"$@```!1`$`/R`!``#T`03_1P`$X4<``%ZG$`#>(P&`^FL``+LG``"](^#_
+MWB,``%ZW"``^M1``7K4*!/!'H?<O0@`$_T="`"#D*;<@2@$`*28`B#$B$@3_
+M1P``?:<`0%MK``"Z)P``O2,!`"DF!(@Q(A`$ZD<2!/]'``!]IP!`6VL``+HG
+M``"](P$`*28(B#$B$`3J1Q($_T<``'VG`$!;:P``NB<``+TC`0`I)@R(,2(0
+M!.I'$@3_1P``?:<`0%MK``"Z)P``O2,!`"DF$(@Q(A`$ZD<2!/]'``!]IP!`
+M6VL``+HG``"](P$`*284B#$B$`3J1Q($_T<``'VG`$!;:P``NB<``+TC`0`I
+M)AB(,2(0!.I'$@3_1P``?:<`0%MK``"Z)P``O2,!`"DE'(@I(1`$ZD<1!.E'
+M$@3_1P``?:<`0%MK``"Z)P``O2,!`!\@``!>IP@`/J40`%ZE(`#>(P&`^FL`
+M`+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"P3P1Z'W+T(`!/]'.0`@Y`H$
+M_T<"!/]'(0!`Y@4`<BP%`#(@PP!A2",784@$`#(L!`!2(,$`(D@!!"-$"@#A
+M0P,`<BP#`#(@PP!A2",78T@"`#(L`@!2(,$`(D@A%R)(`P1A1`$`,BP!`%(@
+MP0`B2"$7(4@#!&%$```R+,$`,D@!!"-$(?8A2((V($@!,$!%(?<C2`$$040"
+M`.%#BC9`22FW($H!`"DF&(@Q(A`$ZT<2!.)'``!]IP!`6VL``+HG``"](P$`
+M*24<B"DA`0!?)@"`4B(2!%)%$`3K1Q$$Z4<``'VG`$!;:P``NB<``+TC`0`?
+M(```7J<(`#ZE$`!>I1@`?J4@`-XC`8#Z:P``NR<``+TCL/_>(P``7K<(`#ZU
+M$`!>M1@`?K4@`)ZU*`"^M3``WK4X`/ZU#@3P1P\$\4<#!/)'0`!^MJNJ/R2J
+MJH$@`0"`]@0$_T>A]^]!``3_1[,`(.0``",LP@`C2*$U0$`'`"#TH3U`0`(`
+M(.0&`$#D'`#@PZ&U0$`7`"#T&0#@PP4`/R`5`.##`@`C+`(`0R#!`B)(H9<@
+M0``$_T>@`"#T`@`C+`(`0R#!`B)(H;<@0$@`_K<-`"#T`@`C+`(`0R#!`B)(
+MH;<A0`$`7R""="!$2`!>M`4`X,,'`#\@2``^M`(`X,,`!/]'C0#@PP0`0RX$
+M`",@T@!!2@4`(RP%`$,@P0`B2"$7(4@2!$%&!@`C+`8`0R#!`")((1<B2!($
+M048'`",L!P!#(,$`(D@A%R-($@1!1A((1$82`/)#"`!#+`@`(R#-`$%("0`C
+M+`D`0R#!`")((1<A2`T$+40M=J!)#0BD12UVH$D*`(,M"@`C(,P`@4D+`",L
+M"P!#(,$`(D@A%R%(#`2!10P`(RP,`$,@P0`B2"$7(D@,!(%%#0`C+`T`0R#!
+M`")((1<C2`P$@44,"(1%#`#L0PX`0RP.`",@RP!!2`\`(RP/`$,@P0`B2"$7
+M(4@+!"M$*W9@20L(9$4K=F!)$``C+1``(R#)`"%)$0`C+!$`0R#!`")((1<A
+M2`D$(442`",L$@!#(,$`(D@A%R)("00A11,`(RP3`$,@P0`B2"$7(T@)!"%%
+M"0@D10D`Z4,"`",L`@!#(,$"(DBAMR%``O`_1<D$(D0JM^!)`0`J)@"(,2(0
+M!.Y'``!]IP!`6VL``+HG``"](P$`*B8$B#$B$`3N1Q($[4<``'VG`$!;:P``
+MNB<``+TC`0`J)@B(,2(0!.Y'$@3L1P``?:<`0%MK``"Z)P``O2,!`"HF#(@Q
+M(A`$[D<2!.M'``!]IP!`6VL``+HG``"](P$`*B80B#$B$`3N1Q($Z4<``'VG
+M`$!;:P``NB<``+TC`0!*)12(2B$0!.Y'$03J1T@`7J8``'VG`$!;:P``NB<`
+M`+TC$`3N1Q$$[T=``%ZF[_Y?TP``7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``
+MWJ4X`/ZE4`#>(P&`^FL``+LG``"](_#_WB,``%ZW\"TP(!`$\4<1!.%'!@!?
+M(@``?:<`0%MK``"Z)P``O2,``%ZG$`#>(P&`^FL``+LG``"](_#_WB,``%ZW
+M\"T0(@8`7R(``'VG`$!;:P``NB<``+TC`0`?(```7J<0`-XC`8#Z:P``NR<`
+M`+TC\/_>(P``7K<0!/%'```])@``,2(&`%\B``!]IP!`6VL``+HG``"](P``
+M7J<0`-XC`8#Z:P`$_T<!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU"03P
+M1P$$\4<*!/)'`&`_(A($X4<``'VG`$!;:P``NB<``+TC$`3I1PA@/R(!`%\B
+M``!]IP!`6VL``+HG``"](Q`$Z4<,8#\B`P!?(@(`?R(``'VG`$!;:P``NB<`
+M`+TC`03_1PP``.00!.E'!&`_(@``?:<`0%MK``"Z)P``O2,``"HL00(J2&`#
+M"D@`!`%$```*/`$`/R``!.%'``!>IP@`/J40`%ZE(`#>(P&`^FNX`S"@(78@
+M2*$%,4`,`%\@!0`@]"@4,*#!4B!(`1`P1*(#X4-"=D!``0!`Y@``4K``!/]'
+M`8#Z:P`$_T<\%#"@P5(@2`0`(.0L%#"@P5(@2$,`'R#`-"!$0!0PH,%2($@"
+ME`!$P`0B1`&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"P3P1P`4
+M,*$I=B!)"I`C10E0($6I`^E#BE9`21$$ZD<``'VG`$!;:P``NB<``+TC$`3K
+M1P$`/R8`F#$B``!]IP!`6VL``+HG``"](P`@/R``!`%$``#@0Q`$ZT<!`#\F
+M`)@Q(A($X$<``'VG`$!;:P``NB<``+TC$`3K1Q$$ZD<``'VG`$!;:P``NB<`
+M`+TC(/8!2*`%"4``.`!$$`3K1Q$$ZD<2!.!'``!]IP!`6VL``+HG``"](P``
+M7J<(`#ZE$`!>I1@`?J4@`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>
+MM0H$\$<)!/%'%$`_(@``?:<`0%MK``"Z)P``O2,)!"E!`P`_("$'*4@`!`%$
+M``#@0Q`$ZD<40#\B$@3@1P``?:<`0%MK``"Z)P``O2,!`!\@``!>IP@`/J40
+M`%ZE(`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4*!/!'"03Q1Q1`
+M/R(``'VG`$!;:P``NB<``+TC$@#@0PD$*4$#`#\@(0<I2`$!0482`.%#$`3J
+M1Q1`/R(``'VG`$!;:P``NB<``+TC`0`?(```7J<(`#ZE$`!>I2``WB,!@/IK
+M``"[)P``O2/@_]XC``!>MP@`/K40`%ZU&`!^M0L$\$<*!/%'"03R1QA`/R(`
+M`'VG`$!;:P``NB<``+TC$@#@0P$`/R`A!RI(`0%!1@DP($4I!RI)`00I1!(`
+MX4,0!.M'&$`_(@``?:<`0%MK``"Z)P``O2,!`!\@``!>IP@`/J40`%ZE&`!^
+MI2``WB,!@/IK``"[)P``O2/P_]XC``!>MP@`/K4)!/%'H;<@0O__'R`(`"#D
+M'$`_(@``?:<`0%MK``"Z)P``O2,`\`5$@`8)2``P`$0``%ZG"``^I1``WB,!
+M@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU"@3P1PD$\D<40#\B``!]IP!`
+M6VL``+HG``"](_[_/R3\?R$@```!1!(`X$,!`#\D`(`A(!($048"`"#E`0`_
+M)!($0480!.I'%$`_(@``?:<`0%MK``"Z)P``O2/\+2J@``$_)A$$(480!.I'
+M``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/@
+M_]XC``!>MP@`/K40`%ZU"@3P1PD$\4<00#\B``!]IP!`6VL``+HG``"](_+_
+M/R2?_R$@```!1`GP($4``#TD```A($D$(4$``"F@``0!1```X$,0!.I'$$`_
+M(A($X$<``'VG`$!;:P``NB<``+TC``!>IP@`/J40`%ZE(`#>(P&`^FL``+LG
+M``"](^#_WB,``%ZW"``^M1``7K4)!/!'"@3R1_8M$"(&`%\B``!]IP!`6VL`
+M`+HG``"](_0M*:#24"!(P7`@2&$Q($@2!$%&^"TIH&)1($@2!$)&P3`@2"$7
+M(T@2!$%&$@#R0Q`$Z4<!`#\F"(`Q(@``?:<`0%MK``"Z)P``O2/X+2F@TE`@
+M2,)P($AB,4!(_S\_(`H`044J%T))$@1"1A($2D80!.E'`0`_)@R`,2(``'VG
+M`$!;:P``NB<``+TC``!>IP@`/J40`%ZE(`#>(P&`^FL``+LG``"](^#_WB,`
+M`%ZW"``^M1``7K48`'ZU"03P1P$`/R9,@#$B``!]IP!`6VL``+HG``"](PL`
+MX$,0!.E'`0`_)E"`,2(``'VG`$!;:P``NB<``+TC"@#@0Q`$Z4<!`#\F3(`Q
+M(@``?:<`0%MK``"Z)P``O2,``.!#(?8!2"+V84FA`R)``C!`0<H$(D0A%T1)
+M(/8!2`$$($0`!.%'``!>IP@`/J40`%ZE&`!^I2``WB,!@/IK``"[)P``O2/P
+M_]XC``!>MP$`/R9,@#$B``!]IP!`6VL``+HG``"](P``7J<0`-XC`8#Z:P``
+MNR<``+TC\/_>(P``7K<(`#ZU"03P1P$`/R8@@#$B``!]IP!`6VL``+HG``"]
+M(P``X$,``3\D``0!1!`$Z4<!`#\F((`Q(A($X$<``'VG`$!;:P``NB<``+TC
+M``!>IP@`/J40`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`?K4+
+M!/!'`0`_)F28,2(``'VG`$!;:P``NB<``+TC(/8!2(EV`DC_`1\@"0`@18$6
+M(4D#`"#D`0@@10$`(2`I`>%#$`3K1P$`/R90@#$B``!]IP!`6VL``+HG``"]
+M(PH$X$<0!.M'`0`_)DR`,2(``'VG`$!;:P``NB<``+TC``A`10`("40``.!#
+M``!>IP@`/J40`%ZE&`!^I2``WB,!@/IK``"[)P``O2/P_]XC``!>MP@`/K4)
+M!/!'($`_(@``?:<`0%MK``"Z)P``O2,`\!]$$/`!1`($_T=\`RF@(?8A2("6
+M`$BA!2!`!``@Y(`#*:`A=B!(H04P0,(T($0``.)#``!>IP@`/J40`-XC`8#Z
+M:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M0H$\$<)!/%'`0`_)I"`,2(``'VG
+M`$!;:P``NB<``+TC```IH`$$($```"FP$`3J1P$`/R:,@#$B``!]IP!`6VL`
+M`+HG``"](P0`*:`!!"!`!``IL!`$ZD<!`#\FE(`Q(@``?:<`0%MK``"Z)P``
+MO2,,`"F@`00@0`P`*;`0!.I'`0`_)HB`,2(``'VG`$!;:P``NB<``+TC"``I
+MH`$$($`(`"FP$`3J1P$`/R:8@#$B``!]IP!`6VL``+HG``"](Q``*:`!!"!`
+M$``IL```7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/0_]XC``!>MP@`/K40
+M`%ZU&`!^M2``GK4+!/!'"03Q1PP$\$<J]B%*H1=!00D`(/0!`#\F__\Q(@``
+M?:<`0%MK``"Z)P``O2,@]@%(H`=`00,``/28,"RQ``3_1P\`X,,0!.M'$03I
+M1P``?:<`0%MK``"Z)P``O2,0!.M'<!`_(A($X$<``'VG`$!;:P``NB<``+TC
+MF#`KL0$`'R```%ZG"``^I1``7J48`'ZE(`">I3``WB,!@/IK``"[)P``O2/P
+M_]XC``!>MP@`/K4)!/!'<!`_(@``?:<`0%MK``"Z)P``O2,@=@!($`3I1Q$$
+MX$<``'VG`$!;:P``NB<``+TC``!>IP@`/J40`-XC`8#Z:P``NR<``+TCT/_>
+M(P``7K<(`#ZU$`!>M1@`?K4@`)ZU"03P1PH$\4?_'S\B``!]IP!`6VL``+HG
+M``"](R'V04D@]@%(H0<@0`0`(/3__S\@G#`IL``$_T<<`.##$`3I1P$`/R84
+M@#$B``!]IP!`6VL``+HG``"](P#@/R`+``%$$`3I1Q$$ZD<``'VG`$!;:P``
+MNB<``+TC_Q\_(````40`!&!%$@#@0Q`$Z4<!`#\F%(`Q(@``?:<`0%MK``"Z
+M)P``O2.<,$FQ`0`?(```7J<(`#ZE$`!>I1@`?J4@`)ZE,`#>(P&`^FL``+LG
+M``"](_#_WB,``%ZW"``^M0D$\$<!`#\F%(`Q(@``?:<`0%MK``"Z)P``O2/_
+M'S\@```!1!`$Z4<1!.!'``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`#>(P&`
+M^FN,,!"@@!<#2``X`$0`,`!$`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>
+MM1@`?K4*!/!'"P3P1Q4`(.8!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2,`_S\E
+M__\I(0``"40``.!#$`3J1P$`/R8$@#$B$@3@1P``?:<`0%MK``"Z)P``O2.,
+M,"J@`0`I1!,`X,,!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2,``3\E``0)1```
+MX$,0!.I'`0`_)@2`,2(2!.!'``!]IP!`6VL``+HG``"](XPP*J`!!"E$C#`K
+ML`$`'R```%ZG"``^I1``7J48`'ZE(`#>(P&`^FL``+LG``"](]#_WB,``%ZW
+M"``^M1``7K48`'ZU(`">M0D$\$<*!/%'_Q\_(@``?:<`0%MK``"Z)P``O2,A
+M]D%)(/8!2*$'($`$`"#T__\_(*`P*;``!/]''@#@PQ`$Z4<!`#\F%(`Q(@``
+M?:<`0%MK``"Z)P``O2,!X#\D__\A(`L``400!.E'$03J1P``?:<`0%MK``"Z
+M)P``O2,@%P)(_Q\_)````40`!&!%$@#@0Q`$Z4<!`#\F%(`Q(@``?:<`0%MK
+M``"Z)P``O2.@,$FQ`0`?(```7J<(`#ZE$`!>I1@`?J4@`)ZE,`#>(P&`^FL`
+M`+LG``"](_#_WB,``%ZW"``^M0D$\$<!`#\F%(`Q(@``?:<`0%MK``"Z)P``
+MO2,@=P1(@'8&2!`$Z4<1!.!'``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`#>
+M(P&`^FL!`!\@`8#Z:P&`^FL`!/]'`8#Z:P&`^FL!@/IK``"[)P``O2/P_]XC
+M``!>MP$`/R8<G#$B``!]IP!`6VL``+HG``"](P#P'T0``%ZG$`#>(P&`^FL`
+M`+LG``"](_#_WB,``%ZW`0`_)EB`,2(``'VG`$!;:P``NB<``+TC`/``1```
+M7J<0`-XC`8#Z:P``NR<``+TC\/_>(P``7K<2\"!&`0`_)EB`,2(``'VG`$!;
+M:P``NB<``+TC``!>IQ``WB,!@/IK<#`0H`&`^FL``+LG``"](_#_WB,``%ZW
+MZ!-0I@,`0/9P,#"R`0`?(`0`X,,``'VG`$!;:P``NB<``+TC``!>IQ``WB,!
+M@/IK``"[)P``O2/P_]XC``!>MZ$U($((`"#D,O9!2J$W0$(#`"#TH;5`0@T`
+M'R`&`"#D``3_1P0`X,,``'VG`$!;:P``NB<``+TC``!>IQ``WB,!@/IK``"[
+M)P``O2/P_]XC``!>MZ%U(4(+`"#D`=!@1J@#,+`2`.%#`0`_)DB`,2(``'VG
+M`$!;:P``NB<``+TC`0`?(`0`X,,``'VG`$!;:P``NB<``+TC``!>IQ``WB,!
+M@/IK``"[)P``O2/P_]XC``!>MP``?:<`0%MK``"Z)P``O2.@`^!#``!>IQ``
+MWB,!@/IK``"[)P``O2/0_]XC``!>MP@`/K40`%ZU&`!^M2``GK4)!/!'/``@
+MY@1`/R(``'VG`$!;:P``NB<``+TC_?\_)/__(2````%$``#@0Q`$Z4<$0#\B
+M$@3@1P``?:<`0%MK``"Z)P``O2,*`!\B``!]IP!`6VL``+HG``"](PH`7R$!
+M`)\E_?]_)2LQ8$$0!.E'$$`_(@``?:<`0%MK``"Z)P``O2,``.!#```,1!<`
+M`.3(`!\B``!]IP!`6VL``+HG``"](Q`$Z4<$0#\B``!]IP!`6VL``+HG``"]
+M(P``"T0``.!#$`3I1P1`/R(2!.!'``!]IP!`6VL``+HG``"](RHQ0$'A_U_U
+M`0#@PP(`0/4`!/]'%`#@PQ`$Z4<!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2/\
+M_S\D__\A(````40``.!#$`3I1P$`/R8$@#$B$@3@1P``?:<`0%MK``"Z)P``
+MO2,!`!\@``!>IP@`/J40`%ZE&`!^I2``GJ4P`-XC`8#Z:P``NR<``+TCX/_>
+M(P``7K<(`#ZU$`!>M0H$\$<)!/%'`0`_)@2`,2(``'VG`$!;:P``NB<``+TC
+M!``_)``$`40``.!#$`3J1P$`/R8$@#$B$@3@1P``?:<`0%MK``"Z)P``O2,1
+M`"#E$`3J1P1`/R(``'VG`$!;:P``NB<``+TC_?\_)/__(2````%$``#@0Q`$
+MZD<$0#\B$@3@1P``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``7J4@`-XC`8#Z
+M:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M0H$\$<)!/%'`0`_)@2`,2(``'VG
+M`$!;:P``NB<``+TC!``_)``$`40``.!#$`3J1P$`/R8$@#$B$@3@1P``?:<`
+M0%MK``"Z)P``O2,1`"#E$`3J1P1`/R(``'VG`$!;:P``NB<``+TC_?\_)/__
+M(2````%$``#@0Q`$ZD<$0#\B$@3@1P``?:<`0%MK``"Z)P``O2,``%ZG"``^
+MI1``7J4@`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`?K4)!/%'
+M$03R1PH$\$<!`'\A(O8A2:$U0$`'`"#T`P!`Y*%50$`&`"#T!P#@PR[_7],+
+M`.!#!@#@PXS_7],$`.##NO]?TP(`X,,`!/]'`@#@PVPP*K$``.M#``!>IP@`
+M/J40`%ZE&`!^I2``WB,!@/IK``"[)P``O2/P_]XC``!>MP1`/R(``'VG`$!;
+M:P``NB<``+TC@!8"2`!P`$0``%ZG$`#>(P&`^FL``+LG``"](_#_WB,``%ZW
+M"``^M3'V(4JA52!"#@`@]*%7($(#`"#DH34@0@0`(/0,`.##H94@0@0`(/0)
+M`.##```])```(2$(`.##```])```(2$%`.##```])```(2$"`.##``3_1P8`
+MX,,1!.E'``!]IP!`6VL``+HG``"](P`$Z4<``%ZG"``^I1``WB,!@/IK``"[
+M)P``O2/P_]XC``!>MPP`/R(``'VG`$!;:P``NB<``+TC``!>IQ``WB,!@/IK
+M``"[)P``O2/P_]XC``!>MQ($\4<,`#\B``!]IP!`6VL``+HG``"](P``7J<0
+M`-XC`8#Z:P``NR<``+TC\/_>(P``7K<(`#\B!`!?(@``?:<`0%MK``"Z)P``
+MO2,``%ZG$`#>(P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$\$<(`#\B(`!?
+M(@``?:<`0%MK``"Z)P``O2,0!.E'"``_(@0`7R(3!/]'``!]IP!`6VL``+HG
+M``"](Z`#X$,``%ZG"``^I1``WB,!@/IK``"[)P``O2/P_]XC``!>MP@`/K4)
+M!/!'`0`_)DB`,2(``'VG`$!;:P``NB<``+TC`!$$1```X$,0!.E'`0`_)DB`
+M,2(2!.!'``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`#>(P&`^FL``+LG``"]
+M(_#_WB,``%ZW"``^M0D$\$<!`#\F2(`Q(@``?:<`0%MK``"Z)P``O2,`%`1$
+M``#@0Q`$Z4<!`#\F2(`Q(A($X$<``'VG`$!;:P``NB<``+TC``!>IP@`/J40
+M`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M0D$\$<!!/%'"@3R1P$`
+M/R9`@#$B$@3A1P``?:<`0%MK``"Z)P``O2,0!.E'`0`_)D2`,2(2!.I'``!]
+MIP!`6VL``+HG``"](P``7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/@_]XC
+M``!>MP@`/K40`%ZU"@3P1PD$\4>A]R="``3_1R4`(.2A]R-"$``@]`$`/R9$
+M@#$B``!]IP!`6VL``+HG``"](P``X$/@_RD@`0!?(C('04H2`1)$$@#R0Q`$
+MZD<!`#\F1(`Q(@X`X,,!`#\F0(`Q(@``?:<`0%MK``"Z)P``O2,``.!#`0!?
+M(C('24H2`1)$$@#R0Q`$ZD<!`#\F0(`Q(@``?:<`0%MK``"Z)P``O2,!`!\@
+M``!>IP@`/J40`%ZE(`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4*
+M!/!'"03Q1Z'W)T(`!/]')``@Y*'W(T(/`"#T`0`_)D2`,2(``'VG`$!;:P``
+MNB<``+TCX/])(`$`/R`A!R)(``0!1```X$,0!.I'`0`_)D2`,2(-`.##`0`_
+M)D"`,2(``'VG`$!;:P``NB<``+TC`0`_("$'*4@`!`%$``#@0Q`$ZD<!`#\F
+M0(`Q(A($X$<``'VG`$!;:P``NB<``+TC`0`?(```7J<(`#ZE$`!>I2``WB,!
+M@/IK``"[)P``O2/P_]XC``!>MP$`/R8\@#$B``!]IP!`6VL``+HG``"](P``
+M7J<0`-XC`8#Z:P``NR<``+TC\/_>(P``7K<2!/%'`0`_)CR`,2(``'VG`$!;
+M:P``NB<``+TC``!>IQ``WB,!@/IK"P!Q+`@`D2P(`#$@`@3_1^(,04A##&%(
+M1`2!2`,$8D0+`'$\"`"1//\//R`!`$%&#P!Q+`P`42P,`)$@Y0PD2&$%)$A#
+M#&1(0@1$2`,$940"!$%$#P!Q/`P`43P/`#$LP@1$2$$-)$@"!$%$(O9!2#+V
+M04JB!5)```3_1R8`0.0!$&1&$``@Y`P`L2P/`)$L#`!Q(,$$HTA"#8-(`00B
+M1``@7R`!!")$X@PC2&$%(TA$#(-(102C2`0$@D0%!*%$#P"1/`P`L3P%!/]'
+M%P!1+!0`<2P4`#$@Y`RA2$(,04A#!&%(`@1$1!<`43P4`'$\$P!1+!``<2P0
+M`#$@Y0RA2$(,04A#!&%(`@1%1!,`43P0`'$\`0`?(`&`^FL``+LG``"](^#_
+MWB,``%ZW"``^M1``7K48`'ZU"P3R1PD$]4<*!/%'%`!1+!<`,2P4`'$@P@1#
+M2$$-(T@"!$%$#P!_(+@`0.`4`#,L%P!3+!0`<R#!!"-(0@U#2`$$(D0*`"#P
+M#``_(@``?:<`0%MK``"Z)P``O2,@]@%((?9A2:`%`4`/`'\@IP``]!``2BP3
+M`"HL$`!J(,($0TA!#2-(`01!1/\/7R`!`$%$``!)+$("24AA`RE(`00B1```
+M*3P4`$HL%P`J+!0`BB#"!$1(00TD2`($040`$#\D`(`A(`(`042!]D%(`@!)
+M+`(`:2!"`D-(80,C2`$$(D0"`"D\!`!I+`0`J2!#`&5(!`!I/!0`2BP7`"HL
+MP@1$2$$-)$@"!$%$`5!`1"\`(/0!D$!$!@`@Y,$`94@!-"!$0@!E2&$!)4@!
+M!")$#P#@PQ0`*BP7`$HL%`!J(,$$(TA"#4-(`00B1`$0(D0)`"#D!`!I+`0`
+M22#!`&)(`10A1$,`8DAA`2)(`00C1`0`*3P6`.##!`!I+`0`22#!`&)(`50@
+M1$,`8DAA`2)(`00C1`0`*3P4`"HL%P!*+!0`:B#!!"-(0@U#2`$$(D0!$#Q$
+M@;8@2`4`22P%`&D@0@!#2&$!(T@!!")$!0`I/!``*BP3`$HL$`!J(,$$(TA"
+M#4-(`00B1(%V(D@&`$DL!@!I($(`0TAA`2-(`00B1`8`*3P4`$HL%P`J+!0`
+M:B#"!$-(00TC2`($042!%D%("0`@X($V04@!\"=$!P!)+`<`:2!"`$-(80$C
+M2`$$(D0'`"D\!P#@PP<`*2P'`&D@00`C2/__7R!B`4-(`@1!1`<`23P0`$HL
+M$P`J+!``BB#"!$1(00TD2`($040(`#\D`(`A(`(`042!]D%("`!)+`@`:2!"
+M`$-(80$C2`$$(D0(`"D\$``J+!,`2BS!!"1(0@U$2`$$(D2!=B-(`?`@1`D`
+M22P)`&D@0@!#2&$!(T@!!")$"0`I/!``*BP3`$HLP00D2$(-1$@!!")$@98A
+M2`$P($0*`$DL"@!I($(`0TAA`2-(`00B1`H`*3P#!/]'``3C1P``7J<(`#ZE
+M$`!>I1@`?J4@`-XC`8#Z:P``NR<``+TC,/_>(P``7K<(`#ZU$`!>M1@`?K4@
+M`)ZU*`"^M3``WK4X`/ZU"P3P1W``/K8,!/)'>`!^MH``GK8/!/!'#@3_1PT$
+M_T>P`/ZWN`#^MP(`,BP"`%(@P@(B2($604@"`"#@`1!01`4`X,,"`#(L`@!2
+M(,$"(D@!&#!$`1`P1*$#X4,A`"#T`@`L+`(`3"#"`B)(`1!$1`(`(.0!$$A$
+M!0#@PP(`+"P"`$P@P0(B2`$8*$0!$"A$H0/A0Q,`(/00!.M'$03L1P``?:<`
+M0%MK``"Z)P``O2.8`!ZT#`!?()D#`.1P`#ZD(O8A2*'50$`(`"#TH==`0`(`
+M(.2A-T!``0#@PZ$504`"`"#T#`!?((T#X,-X`%ZD20!`Y!`$ZT<!`#\F3(`Q
+M(@``?:<`0%MK``"Z)P``O2,``.!#L``>M!`$ZT<!`#\F4(`Q(@``?:<`0%MK
+M``"Z)P``O2,``.!#N``>M'P#*Z"A=R!`"@3_1P@`(/00!.M'0!$_(@``?:<`
+M0%MK``"Z)P``O2-``!ZP$`#@PRGV04E)%"!!0`!^(`D$(T%1%$!!0!$Q(A$`
+M\4,0!.M'``!]IP!`6VL``+HG``"](P``";`*,$!!H3=!0?#_/_28`#ZD!`!!
+MH`%00$0&`"#T`=!?1`+Q7T0!\#]$`00B1)@`7J0$`"*PF`!^I```(Z#!4B!(
+M`@!,+`(`;"!"`D-(80,C2`$$(D0"`"P\F`!>I`0`(J`$`$PL!`!L($(`0TAA
+M`2-(`00B1`0`+#P0!.M'`0`_)EB`,2(``'VG`$!;:P``NB<``+TC``#@0P,$
+MX$>#-`!$P`!^M!`$ZT<!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2,``C\D```!
+M1*@`'K00!.M'$$`_(@``?:<`0%MK``"Z)P``O2,``.!#_@`_)&``(2`"``%$
+MH`!>M!`$ZT<40#\B``!]IP!`6VL``+HG``"](P``X$.(`!ZT$`3K1QA`/R(`
+M`'VG`$!;:P``NB<``+TC``#@0Y``'K0"`"PN`@`L(-$"(4H0!.M'``!]IP!`
+M6VL``+HG``"](P,`7R`(`P#D`@`L+`(`3"#!`B)(\`%?(`(`042A%5A`$0`@
+M]*$=6$`#`"#DH1540`L`(/0.`.##P/XB(`,`(.2P_B(@`P`@Y`D`X,,!`-\A
+M`0#@PP(`WR$!`+\A!`#@PP,`WR$!`.##!`#?(0(`OR%\`RN@H7<@0!`$ZT<!
+M`#\F`)@Q(@<`7R($`"#D$`3K1P$`/R8`F#$B1P!?(@``?:<`0%MK``"Z)P``
+MO2-\`RN@H7<@0$8`(/0"`"PL`@!,(,,"(D@!$'!$+P`@Y"@4+Z`A=B!(`#!?
+M(*$'(D`J`"#T`1!D1`4`(.0D%2^@*78@2"@5+Z`J=B!(!`#@PR05+Z#)4B!(
+M*!4OH,I2($@0!.E'`P`_(@``?:<`0%MK``"Z)P``O2,)`.!#$`3J1P,`/R(`
+M`'VG`$!;:P``NB<``+TC``!])```8R!#!*-!+`%#H`(16$0AUR!)`1`X1`($
+M040L`4.P.`%#H`+Q040!D"!%H0/A0P`$`$``T`%$`00@1`($040X`4.P"@3_
+M1P``/20``"$A(?9!26$%(4!"!"E````BH@$$+4!!!"E```!!HA`$ZT<``'VG
+M`$!;:P``NB<``+TC"C!`0:%W0T'Q_S_T$`3K1Q$$[$?R!4#3"@3_1P``/20`
+M`"$A(?9!24$$(4!"!"E````BH@$$+D!!!"E```!!HA`$ZT<``'VG`$!;:P``
+MNB<``+TC"C!`0:%71$'Q_S_T"@3_1P``/20``"$A(?9!26$%(4!"!"E````B
+MH@$$+4!!!"E```!!HA`$ZT<``'VG`$!;:P``NB<``+TC"C!`0:'W1T'Q_S_T
+M"@3_1P``/20``*$A>`!^I"GV84C_#]\A(?9!24$&+4```"&B!``@Y0"`,2`A
+M]B%(H0<N0`@`(/0A]D%)008M0`0`0:(0!.M'``!]IP!`6VL``+HG``"](PHP
+M0$&A5U5![?\_]'P#*Z"A=R!`-0`@Y!`$ZT<!`#\F'(`Q(@``?:<`0%MK``"Z
+M)P``O2,``.!#$`!?)O__4B(2`!)$T`$_)!($0480!.M'`0`_)AR`,2(``'VG
+M`$!;:P``NB<``+TC$`3K1UP`/R(2!/]'``!]IP!`6VL``+HG``"](Q`$ZT<!
+M`#\F>)@Q(@@`7R(``'VG`$!;:P``NB<``+TC$`3K1P$`/R9(@#$B``!]IP!`
+M6VL``+HG``"](P`$/R``!`%$``#@0Q`$ZT<!`#\F2(`Q(A($X$<``'VG`$!;
+M:P``NB<``+TC>``^I"P`(.00!.M'`0`_)DR`,2*P`%ZF``!]IP!`6VL``+HG
+M``"](Q`$ZT<!`#\F4(`Q(K@`7J8``'VG`$!;:P``NB<``+TC?`,KH*%W($`*
+M!/]'"``@]$``7J(0!.M'0!$_(@``?:<`0%MK``"Z)P``O2,0`.##411`04`1
+M,2(1`/%#(?9!24$4($!``%X@`00B0```0:(0!.M'``!]IP!`6VL``+HG``"]
+M(PHP0$&A-T%!\/\_]/`M+Z`2\#]$(E8@2!($0D8BEB!($@1"1B$6(4@2!$%&
+M$@#R0Q`$ZT<!`#\F`(`Q(@``?:<`0%MK``"Z)P``O2/T+4^B,G9`2J@`?J02
+M!$-&$`3K1P$`/R8$@#$B``!]IP!`6VL``+HG``"](W``/J01`.%#$`3K1SH.
+M0-,0!.M'$$`_(@``?:<`0%MK``"Z)P``O2.@`%ZD``0"1```X$,0!.M'$$`_
+M(A($X$<``'VG`$!;:P``NB<``+TC$`3K1Q1`/R*(`%ZF``!]IP!`6VL``+HG
+M``"](Q`$ZT<80#\BD`!>I@``?:<`0%MK``"Z)P``O2,0!.M'`0`_)EB`,2+`
+M`%ZF``!]IP!`6VL``+HG``"](_0M+Z#24"!(P7`@2&$Q($@2!$%&^"TOH&)1
+M($@2!$)&P3`@2"$7(T@2!$%&$@#R0Q`$ZT<!`#\F"(`Q(@``?:<`0%MK``"Z
+M)P``O2/X+2^@TE`@2,%P($AA,2!($@1!1A`$ZT<!`#\F#(`Q(@``?:<`0%MK
+M``"Z)P``O2.4,$^B$`3K1P$`/R88@#$B``!]IP!`6VL``+HG``"](Q`$ZT>`
+M`#\B__]?(@``?:<`0%MK``"Z)P``O2-\`RN@H94@0!0`(.2``RN@(78@2*$W
+M($`0`"#D$`3K1Q0`/R(``'VG`$!;:P``NB<``+TC``0_(``$`40``.!#$`3K
+M1Q0`/R(2!.!'``!]IP!`6VL``+HG``"](Q`$ZT<1!.Q'``!]IP!`6VL``+HG
+M``"](P,`7R!>`0#D<`!^I*'58$`:`"#TM`,KH`%P($07`"#D$`3K1P$`/R9$
+MF3$B``!]IP!`6VL``+HG``"](P#@/R3__R$@```!1+0#*Z`!,"!$(;<C2``$
+M`40``.!#$`3K1P$`/R9$F3$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.M'$03L
+M1_@%0-,0!.M'F``^IOD"0-,#`%\@.0$`Y'@#2Z`B=D!(`0`_)!OQ(2"B!4%`
+M#0!`Y`(`+"P"`$P@P0(B2`$0,$0(`"#D$`3K1P$`/R8(V#$B`@5?(@``?:<`
+M0%MK``"Z)P``O2,0!.M'`0`_)AR8,2(!`%\B``!]IP!`6VL``+HG``"](Q`$
+MZT<!`#\F%)DQ(@``?:<`0%MK``"Z)P``O2/_/S\@```!1`(`+"P"`$P@P0(B
+M2`$0)$0,`"#D010`0&(%(4!B!T)`8@5!0&(%04!"!D)`(_=!2",%8D!#!F%`
+M8P5A0(*69$@+`.##(?8!2$($(4!"!D%`0@1"0&(%04!"!$%`8@5!0",70D@"
+M!$-`0@1!0()V1$AD``(B``!]IP!`6VL``+HG``"](Q`$ZT<!`#\F8)@Q(@``
+M?:<`0%MK``"Z)P``O2,`-`!$``#@0Q`$ZT<!`#\F8)@Q(A($X$<``'VG`$!;
+M:P``NB<``+TC$`3K1P$`/R9@F#$B`0!?(A,$_T<``'VG`$!;:P``NB<``+TC
+M$`3K1Y@`/J8``'VG`$!;:P``NB<``+TC#0``]`(`3"P"`&P@P0)#2`$0)$0&
+M`"#TP0)#2`%4($1"`D-(80,C2`$$(D0"`"P\`P!?(,8`X,-T,"^@"P`@Y!`$
+MZT<!`#\F()DQ(@(`7R8`\%(B``!]IP!`6VL``+HG``"](P$`/R!X,"^P"03_
+M1P$`7R%1%"!!`!`Q(A$`\4,R!TE)$@#R0Q`$ZT<``'VG`$!;:P``NB<``+TC
+M"3`@0:$](4'S_S_T"03_1Q$`Z4,0!.M'``!]IP!`6VL``+HG``"](PDP($&A
+M/2%!]_\_]!`$ZT>D`#\B`0!?)@$`4B(``'VG`$!;:P``NB<``+TC$`3K1Z@`
+M/R(!`%\B``!]IP!`6VL``+HG``"](Q`$ZT>L`#\B`0!?(@``?:<`0%MK``"Z
+M)P``O2,0!.M'L!`_(@``?:<`0%MK``"Z)P``O2,0!.M'L!`_(A($X$<``'VG
+M`$!;:P``NB<``+TC$`3K1Z``/R((`%\F90E2(@``?:<`0%MK``"Z)P``O2,(
+M`#\D90DA(/PM+[`0!.M'K``_(@``?:<`0%MK``"Z)P``O2,'`#\D``0!1```
+MX$,0!.M'K``_(A($X$<``'VG`$!;:P``NB<``+TC<`!>I*'50$`3`"#D$`3K
+M1Z``/R(``'VG`$!;:P``NB<``+TC`!`_(0`$"40``.!#$`3K1Z``/R(2!.!'
+M``!]IP!`6VL``+HG``"](_PM+Z`!!"E$_"TOL`04*Z`%`"#D$`3K1P``?:<`
+M0%MK``"Z)P``O2,0!.M'`0`_)B"`,2(``'VG`$!;:P``NB<``+TC@/X_)/__
+M(2````%$``#@0Q`$ZT<!`#\F((`Q(A($X$<``'VG`$!;:P``NB<``+TCF#!/
+MH"+V04C__S\@@18D2*(%04`&`$#TF#`OHA`$ZT<``'VG`$!;:P``NB<``+TC
+MG#!/H"+V04C__S\@@18D2*(%04`&`$#TG#`OHA`$ZT<``'VG`$!;:P``NB<`
+M`+TCH#!/H"+V04C__S\@@18D2*(%04`&`$#TH#`OHA`$ZT<``'VG`$!;:P``
+MNB<``+TCJ`,KH`@`(.02`.%#$`3K1P$`/R9(@#$B``!]IP!`6VL``+HG``"]
+M(W``?J2,`VNP`0`?(`4`X,.``'ZD```CH`$`(.0``$.P``3_1P``7J<(`#ZE
+M$`!>I1@`?J4@`)ZE*`"^I3``WJ4X`/ZET`#>(P&`^FL``+LG``"](_#_WB,`
+M`%ZW`@`_(G`!0-,``%ZG$`#>(P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$
+M\$<1!/]'`0!?(@``?:<`0%MK``"Z)P``O2,!!/]'"P``Y!`$Z4<3`#\B7`%`
+MTP$$_T<&``#D-`@?(@``?:<`0%MK``"Z)P``O2,!`#\@``3A1P``7J<(`#ZE
+M$`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4)!/!'"@3Q1Q$$_T<!
+M`%\B``!]IP!`6VL``+HG``"](P$$_T>.``#D\`$_(`(`046A%5A`+@`@]*$=
+M6$`%`"#DH1540`P`(/2A%59`"@`@]&P`X,/`_B(@0P`@Y`,`(/RA%5I`(@`@
+M]&8`X,.P_B(@/0`@Y&,`X,,0!.E'`0`_)@28,2(2!/]'``!]IP!`6VL``+HG
+M``"](Q`$Z4<!`#\F`*(Q(@,`7R(``'VG`$!;:P``NB<``+TC$`3I1P$`/R9\
+MF#$B&0!?(@``?:<`0%MK``"Z)P``O2,L`1\B``!]IP!`6VL``+HG``"](T4`
+MX,,0!.E'`0`_)@28,2(2!/]'``!]IP!`6VL``+HG``"](W@#*:`A=B!(H54B
+M0#D`(.00!.E'`0`_)GR8,2(8`%\B``!]IP!`6VL``+HG``"](RP!'R(``'VG
+M`$!;:P``NB<``+TC$`3I1P$`/R8`HC$B`@!?(B,`X,,!$$)%$`3I1P$`/R8$
+MF#$B`P!?(@0`(/00!.E'`0`_)@28,2(2!/]'``!]IP!`6VL``+HG``"](W@#
+M*:`A=B!(H54B0!4`(.00!.E'`0`_)GR8,2(8`%\B``!]IP!`6VL``+HG``"]
+M(RP!'R(``'VG`$!;:P``NB<``+TC$`3I1P$`/R8`HC$B$@3_1P``?:<`0%MK
+M``"Z)P``O2,0!.E'$P`_(L4`0-,!!/]'$@``Y#0('R(``'VG`$!;:P``NB<`
+M`+TC$`3I1Q$$_T<!`%\B``!]IP!`6VL``+HG``"](P$$_T<$``#D$`3I1Q$$
+M_T>R`$#3`03@1P`$X4<``%ZG"``^I1``7J4@`-XC`8#Z:P``NR<``+TCL/_>
+M(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M3``WK4X`/ZU"03P1PL$\4=``%ZV
+M#`3P1P``?:<`0%MK``"Z)P``O2,*!.!'``3_1XD`0.5X,"F@3``@Y!`$Z4<!
+M`#\F()DQ(@``?:<`0%MK``"Z)P``O2,!`-\E```.1$(``/1X,.FS$`3I1Q"<
+M+B(``'VG`$!;:P``NB<``+TC``#@0T@`'K00!.E'%)PN(@``?:<`0%MK``"Z
+M)P``O2,-`.!#$`3I1QB<+B(``'VG`$!;:P``NB<``+TC!`#@0T@`7J0A]D%(
+M@38@2"#VH4F"-@!(`00B0)GV($B#U@!(H0/Y0Z(#XT,!`")$'P`@Y#@!Y$,9
+M`/E#``!]IP!`^VH/\&='2``^I!@`X4,9!.-'``!]IP!`^VHM$6A##?"C11`$
+MZ4<@F2XB``!]IP!`6VL``+HG``"](R&WX$D`!`%$``0-1``(/R``!`%$``#@
+M0Q`$Z4<@F2XB$@3@1P``?:<`0%MK``"Z)P``O2,0!.E'$03J1W$!0-,0``#T
+M`@!K+`(`2R#!`F)(`50@1$,"8DAA`R)(`00C1`(`*SP``$J@P5)`2`%1($0B
+M=EY(85,@2`$$(D0``"JP'@#@PQ`$Z4<1!.I'``!]IP!`6VL``+HG``"](QD`
+M`/2($Q\B``!]IP!`6VL``+HG``"](Q`$Z4<1!.I'``!]IP!`6VL``+HG``"]
+M(PT``/0"`$LL`@!K(,$"0T@!$"1$!@`@],$"0T@!5"!$0@)#2&$#(T@!!")$
+M`@`K/``$_T<'`.##$`3I1_@)0--X,"R@H14@0$``?J<``#NP`0`?(```7J<(
+M`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WJ4X`/ZE4`#>(P&`^FL``+LG``"](]#_
+MWB,``%ZW"``^M1``7K48`'ZU"@3P1PD$\4?__S\@P00Q1B``/K`,`#\B``!]
+MIP!`6VL``+HG``"](Q`$ZD<`0#\B$@3I1P``?:<`0%MK``"Z)P``O2,/`!\B
+M``!]IP!`6VL``+HG``"](PEP($4@`#Z@`7`@1"``/K`2`.%#$`3J1P!`/R(3
+M!.E'``!]IP!`6VL``+HG``"](PL`X$,'`"#Q$`3J1Q0`/R(2!/]'``!]IP!`
+M6VL``+HG``"](P`$ZT<``%ZG"``^I1``7J48`'ZE,`#>(P&`^FL``+LG``"]
+M(]#_WB,``%ZW"``^M1``7K48`'ZU(`">M0L$\$<*!/%'``!1HC%V0$K24D!*
+M``!]IP!`6VL``+HG``"](R`7!DB"%P9(```JH('V(D@,!/]'``3B1Q0`(.!I
+M!4)````])```(2#D`"$@200A000`":((`#\B``!]IP!`6VL``+HG``"](P#P
+M'T0@MP!(```IH"&7($@`!`%$#`#@0P@`*:`A%R9(@!<F2*$=$D`!`"#D"0``
+MX#`1`T`(`#\B``!]IP!`6VL``+HG``"](PGP'T0!`%\@"P#@PS`1`T"!]@=*
+M$`0!0I`W`$H(`#\B``!]IP!`6VL``+HG``"](PGP'T0"!/]'010@00($0D`!
+M!")$`01?(`$$(D0)`.%#$O"?13(704H!\#]%$@1!1A`$ZT<!`#\FG)@Q(@``
+M?:<`0%MK``"Z)P``O2,A]B%),E:`2<$P($@2!$%&$`3K1P$`/R;0F#$B``!]
+MIP!`6VL``+HG``"](^@32[4!`!\@``!>IP@`/J40`%ZE&`!^I2``GJ4P`-XC
+M`8#Z:P``NR<``+TC\/_>(P``7K<!`#\F9)@Q(@``?:<`0%MK``"Z)P``O2,@
+M]@%(@'8"2/\!7R````)$@18!2`4`(.0!"`)$`0`A("$!X4,A%R9(@!<F2```
+M7J<0`-XC`8#Z:P``NR<``+TCT/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU"P3P
+M1PH$\4<)!/)'`0`_)F28,2(``'VG`$!;:P``NB<``+TC`/`_(````40A-T%)
+M``Y?(`$`(D0`!`%$_P$_(`D`(44`!`E$``#@0Q`$ZT<!`#\F9)@Q(A($X$<`
+M`'VG`$!;:P``NB<``+TC$`3K1P$`/R9@F#$B``!]IP!`6VL``+HG``"](P!4
+M`$0``.!#$`3K1P$`/R9@F#$B$@3@1P``?:<`0%MK``"Z)P``O2,X`)\A`@!`
+MY6$'2D$L-R%("03_1P$`7R5@F$HA$`3K1Q$$ZD<``'VG`$!;:P``NB<``+TC
+M`%``1`@``.00!.Q'``!]IP!`6VL``+HG``"](PDP($&A?2=!\/\_]*%])T$`
+M!/]'`P`@Y!`$ZT>:_U_3``#@0P``7J<(`#ZE$`!>I1@`?J4@`)ZE,`#>(P&`
+M^FL``#&@P5(@2.`!7R`"`")$H1580`P`(/2A'5A``P`@Y*$55$`%`"#T#P#@
+MP\#^(B`-`"#TA!10H`0`X,.$%#"@PE(@2`$`X,.(%%"@```R+$$",DAB`U)(
+M`@1!1```4CP!`!\@`8#Z:P`$_T<!@/IK``"[)P``O2/0_]XC``!>MP@`/K40
+M`%ZU"03P1PH$\4<@`%XBVO]?TP$$_T<@``#D$`3I1P$`/R9@F#$B``!]IP!`
+M6VL``+HG``"](Q`$Z4=A_U_3(``^+"(`7B!!#R)(@1<F2*$)($`'`"#D``!*
+MH,%20$@!5"!$(G9>2&%3($@!!")$```JL!0`2J`B=EY((1<"2`$$(D04`"JP
+M(``^+"(`7B!!#R)(@1<F2*$-`4``!.%'``!>IP@`/J40`%ZE,`#>(P&`^FL`
+M`+LG``"](\#_WB,``%ZW"``^M1``7K48`'ZU(`">M2@`OK4)!/!'"@3Q1WP#
+M,*"A=R!`)P`@Y```?:<`0%MK``"Z)P``O2,B``#D$`3I1Q$$ZD<P`%XBF_]?
+MTP($_T<N``#D"P3_1P``/20``*$A,@">(0$$;4$``"$NT0`A2A`$Z4<2!/]'
+M.?]?TS``/BQ!#RQ(@1<F2*$)($`#`"#D%``JH"%V/D@$`.##%`!*H")V7D@A
+M%P)(`00B1!0`*K`+,&!!H5=@0:)W8$$3`"#DZ/__PQ`$Z4<!`#\F8)@Q(@``
+M?:<`0%MK``"Z)P``O2,`5`!$``#@0Q`$Z4<!`#\F8)@Q(A($X$<``'VG`$!;
+M:P``NB<``+TC`0!?(``$XD<``%ZG"``^I1``7J48`'ZE(`">I2@`OJ5``-XC
+M`8#Z:P``NR<``+TC!`3_1P``?20``&,@``!1H`4$XD<B=D!(```C+,$"(TBB
+M!T%`"`!`Y`8$XT<$,(!`0P2&0")VH$@``",LP0(C2*('04#Y_U_T```])```
+M(2!!!(%`!``A(/[_02Q"#T%(@A=&2&`%0D!@!P!`0`0"0$`$`D!`!`)`0`0"
+M0$`$`D`A%P)(``0!0``$`D"`%@1(@O=#2"`%`D`@%P9(@!<&2`&`^FL``+LG
+M``"](Z#_WB,``%ZW"``^M1``7K48`'ZU(`">M2@`OK4P`-ZU.`#^M0\$\$<-
+M!/!'`@`Q+`(`42#!`B)(`1`P1*P#X4,!`(PA`@`Q+,$"(DC@`5\@`@!!1*$5
+M6$!=`"#TH1U80`,`(.2A%51`3P`@]&0`X,/`_B(@8@`@]```,2S!`C%(7_`A
+M("%V($CJ!%\@H0<B0`(`(.0,%3"@#P#@PP``,2S!`C%(=.LA("%V($BA]SU`
+M`@`@Y!`5,*`2`.##```Q+,$",4B$ZB$@(78@2*$7/$`$`"#D%!4PH")V($A(
+M`%ZT"@#@PP``,2S!`C%(7!9?(*$'(D!0`/ZW2`#^MP4`(/08%3"@(W8@2$@`
+M?K3!4B!(4``^M)`4+:`K=B!(E!0MH,%2($A``#ZTKA4@0```?20``&,@0P2#
+M03P`0Z``\#\D__\A(`(`042$%2V@(78@2"&7(T@"!$%$/`!#L$@`0Z``_#\D
+M__\A(`(`042$%2V@P5(@2"%V($@A5R-(`@1!1$@`0[#\`$.@`A%!1(`5+:#!
+M4B!((78@2$$6($`"!$%$_`!#L!@`X,,<%3"@(G8@2$@`7K3!4B!(4``^M)`4
+M,*#+4B!(F!0PH"%V($@)`.##(!4PH"-V($A(`'ZTP5(@2%``/K24%#"@*W8@
+M2)@4,*#!4B!(0``^M*X5($`"`.##``3_1UT`X,,``%TE``!*(4H$BD&$`"JA
+M"1$X10L`ZT,0!.M'!``_(@``?:<`0%MK``"Z)P``O2,@]P!((=?`20`$`40`
+M$!A$"00@180`*K&0`"JA"?$@11`$ZT<$`#\B``!]IP!`6VL``+HG``"](X`V
+M`$@`\`!$"00@19``*K$)$3!%2``^I`L`X4,0!.M'`P`_(@``?:<`0%MK``"Z
+M)P``O2,@]P!(`!`01`D$($60`"JQG``JH0EQ($40!.M'`P`_(@``?:<`0%MK
+M``"Z)P``O2.`-@!(`'``1`D$($6<`"JQ"9$C15``7J00`.)#`P`_(@``?:<`
+M0%MK``"Z)P``O2-`%`!``)`#1`D$($6<`"JQS`!*H`(1041``'ZD019@0`$0
+M(40"!$%$S`!*L`D$_T<``#TD``!!(6$%*4%"!"I````BH@$$+$!!!"I```!!
+MHA`$[T<``'VG`$!;:P``NB<``+TC"3`@0:$7(T'R_S_TA##MLP$`'R```%ZG
+M"``^I1``7J48`'ZE(`">I2@`OJ4P`-ZE.`#^I6``WB,!@/IK``"[)P``O2/@
+M_]XC``!>MP@`/K40`%ZU"@3P1P<$\$<"`#(L`@!2(L$",DC@`5\@`@!!1*$5
+M6$`+`"#TH1U80`,`(.2A%51`!0`@]$0`X,/`_B(@!`3_1P0`(.1``.##`0"?
+M(`$`X,,"`)\@!`2$0`0$AT"B%$0LHA1D(,("0TBH%"0LJ!2D(,$")4@AUR!(
+M`@1!1`P`(RRN%&0@P0(C2"&7(4@"!$%$#``E++04Q"#!`B9((5<B2`($040,
+M`",LNA2D(,$")4@A%R-(`@1!1!(`XD,,`&8LP!1$(,,"8D@,`"4LQA2D(,$"
+M)4@AUR!(`P1A1`P`(BS,%,0@P0(F2"&7(4@#!&%$#``E+-(41"#!`B)((5<B
+M2`,$840,`"8LV!2$(,$")$@A%R-(`P1A1`D`XT,B]B%*H35`0`0`(/0)`$#D
+MH55`0`,`(/0$`.##"0#R0P0`X,,2`.E#`@#@PP`$_T<1`.##<#`GLA`$ZD<!
+M`#\F8)DQ(@``?:<`0%MK``"Z)P``O2,0!.I'`0`_)F29,2(2!.E'``!]IP!`
+M6VL``+HG``"](P$`'R```%ZG"``^I1``7J4@`-XC`8#Z:P``NR<``+TCP/_>
+M(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M3``WK4X`/ZU#`3P1PT$\4<.!/!'
+M`@`Q+`(`42#!`B)(X`%?(`(`042A%5A`'P`@]*$=6$`#`"#DH1540!D`(/0<
+M`.##P/XB(!H`(/0/!/]'`0`_)D29,2(``'VG`$!;:P``NB<``+TC`!$'1(@5
+M+*!!%B!``1`G1``$`40``.!#$`3L1P$`/R9$F3$B$@3@1P``?:<`0%MK``"Z
+M)P``O2,&`.##`0#_(00`X,,"`/\A`@#@PP`$_T<+`>##?`,LH*%W($`.`"#D
+M$`3L1P$`/R80F3$B``!]IP!`6VL``+HG``"](P!T`$0``.!#$`3L1P$`/R80
+MF3$B$@3@1R@`X,,0!.Q'`0`_)A"9,2(``'VG`$!;:P``NB<``+TC!OP_(```
+M`40)!.]!"00N09P4*2R<%$D@P0(B2"&7($@`!`%$`#0`1```X$,0!.Q'`0`_
+M)A"9,2(2!.!'``!]IP!`6VL``+HG``"](W`P+J(0!.Q'$@3M1RO_7].$%$DN
+MA!0I(=("24K_`3\@$@!!1@$`(2`2!$%&$`3L1P$`/R9HF3$B``!]IP!`6VL`
+M`+HG``"](Q`$[$<!`#\F1)@Q(@``?:<`0%MK``"Z)P``O2-_P#\@```!1`D$
+M[T$)!"Y!4!1I(0H`*RQ:%$D@P0(B2"'W($B`/U\@`0`B1``$`40``.!#$`3L
+M1P$`/R9$F#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.Q'`0`_)DB8,2(``'VG
+M`$!;:P``NB<``+TC_/\_)/\/(2````%$$`!++&`422'"`DI((I=!2`0`/R0`
+M\"$@`@!!1``$`D0``.!#$`3L1P$`/R9(F#$B$@3@1P``?:<`0%MK``"Z)P``
+MO2,0!.Q'`0`_)E"8,2(``'VG`$!;:P``NB<``+TC()8?2`,$[D&"%$,@__\B
+M+$$/(DB!%R=(83$@2``$`41_%&,@__\C+$$/(TB!%B=(``0!1```X$,0!.Q'
+M`0`_)E"8,2(2!.!'``!]IP!`6VL``+HG``"](Q(`*BQR%$D@P0(B2"(7(T@A
+M%R)(`@1!1'@422YX%"D@T@)!2B$704H"!$%$$@1"1A(`\D,0!.Q'`0`_)C28
+M,2(``'VG`$!;:P``NB<``+TC$`3L1P$`/R8HF#$B``!]IP!`6VL``+HG``"]
+M(R"V'T@6`"LL9A1)(,$"(D@A%R%(``0!1```X$,0!.Q'`0`_)BB8,2(2!.!'
+M``!]IP!`6VL``+HG``"](Q`$[$<!`#\F9)@Q(@``?:<`0%MK``"Z)P``O2/X
+M_S\D_P\A(````40,`$HL;!0I(<("24@BET%("``_)`#P(2`"`$%$``0"1```
+MX$,0!.Q'`0`_)F28,2(2!.!'``!]IP!`6VL``+HG``"](P(`/R$H%"Z@(78@
+M2`(P7R"A!R)`"P`@Y'@#+*#!4B!(WN\A(!8`(/0"`"TL`@!-(,$"(D@!$"A$
+M$0`@Y`@`/R$/`.##```M+,$"+4@!\"-$HP/A0_;_(2`,`%\@H0-!0`,`840&
+M`&#D`03O00$$+D#>%$$LWA0A(,("04@)`")!$`3L1P$`/R8DF3$B``!]IP!`
+M6VL``+HG``"](P#1'T0!!"E!`?`^1``$`40``.!#$`3L1P$`/R8DF3$B$@3@
+M1P``?:<`0%MK``"Z)P``O2,!`!\@``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE
+M,`#>I3@`_J5``-XC`8#Z:P``NR<``+TC\/_>(P``7K<2!/%'H=<G0C\`7R#"
+M!#%$K`,PH"&6/T@B=D!(`@1!1*P#4+`!`#\F/)DQ(@``?:<`0%MK``"Z)P``
+MO2,!`!\@``!>IQ``WB,!@/IK``"[)P``O2.@_]XC``!>MP@`/K40`%ZU&`!^
+MM2``GK4H`+ZU,`#>M0L$\$<*!/%'"03P1P(`,2P"`%$@P0(B2.`!7R`"`$%$
+MH1580!8`(/2A'5A``P`@Y*$55$`@`"#T+0#@P\#^(B`K`"#TG!4PH,)2($A(
+M`#Z@(98_2")V0$@"!$%$2`!>L(H5,"!``#ZTH!4P(%``/K0`&3"@S5(@2`09
+MD"$B`.##J!=0H$@`/J`AEC]((G9`2`($041(`%ZPJA<P($``/K3*%S`@4``^
+MM%09,*`M=B!(5AF0(10`X,.H%U"@2``^H"&6/T@B=D!(`@1!1$@`7K"P%S`@
+M0``^M&88,"!0`#ZT=!DPH"UV($AV&9`A!@#@PP`$_T<J`.##(=>`2`$$(4&,
+M&<$A'P#@PP``2B[2`DI*$`3K1T``/B(L`$#3#@3_1Q`$ZT<1!.I'``!]IP!`
+M6VL``+HG``"](P``X$,$!/]'+!4IH"%V($@.`"#D(/8!2"P5J:`!!(1``00I
+M0"X582PN%4$@P0)B2`(`(.2A!2!`X?\_]`0P@$`A=J!(H0TD0/3_/^03!.U'
+M$`3K1Q$$[D<2!.Q'%`3J1YX!0-,!`!\@``!>IP@`/J40`%ZE&`!^I2``GJ4H
+M`+ZE,`#>I6``WB,!@/IK``"[)P``O2.@_]XC``!>MP@`/K40`%ZU&`!^M2``
+MGK4H`+ZU,`#>M3@`_K5``!ZV#@3Q1P\$\D=(`/ZW/P`_(%``/K0``#TE```)
+M(@@!/R(``'VG`$!;:P``NB<``+TC```=)@``$"*``#\B``!]IP!`6VL``+HG
+M``"](P``*2&(`(DA`0!?(0L$_T<#!&M!``!=)```0B`#!&)```!#+$("0TAA
+M!T-)`00B1```(SP!`"H@*G8@2`$`*R`K=B!(H?='0?'_/_0``'TD``!C(`8`
+M0RP&`*,@0@)%2&$'94D!!")$!@`C/`(`0RP"`(,@0@)$2`$`/R!A`R1(`00B
+M1`(`(SP$`$,L!`"#($("1$@_`#\@80,D2`$$(D0$`",\"P3_1P8`(RS!`B5(
+M%P`@Y`T$XT<*!.5'`01K00D$+$```)TD``"$(`$$)$```"$NT0(A2A`$[T<2
+M!.Y'\P)`TP``*2Q!`BE(8`,)2``$`40```D\`0`K("MV($@&`"TLP0(J2*$'
+M*T#K_S_D`@!,(/[_(BQ!#R)(AA<F2```/20``"$@!@!A+`8`(2##`F%(`@1C
+M0`($3$#^_R(L00\B2(<7)D@+!/]'+`!@Y```/20``,$B!@`6(0$$:T$!!"Q`
+M`@`A(/[_02Q"#T%(@A=&2*$-1D`"`"#D!@3B1T@`?K4&`#8LP0(H2"$%*T#_
+M_R$@*G8@2!D`0.4!!$I!!`0L0/[_I"#^_T0L0@]$2((71D@"`&0@_O\C+$$/
+M(TB!%R9(H@U!0`<`0/0``"0LP@(D2```)2Q!`B5(8@-%2`($040``$4\`0`K
+M("MV($@&`#8LP0(H2*$'*T#7_S_D"P3_1P``/20``"$@!@!!+`8`(2#"`D%(
+M%0!`Y```/20``"$@!@!A+```/20``"$@!@"!(`$$:T$!!"Q``@`A(/[_02Q"
+M#T%(@A=&2*$-1T`"`"#T!P3B1U``?K4!`"L@*W8@2,$"9$BA!RM`\?\_Y`(P
+MPT!!!$)`804B0$$$(4!!!B)`80<B0$$&(4!A!2)`80<A0&$'(D!!!B)`80<A
+M0`$$(4`!!")`@9<D2(+W0T@A!2)`000A0$$$(4`A-R9(B1<F2`L$_T<*!/]'
+M000I06$%*4!!!"%`008I0&$'*4!!!B%`804I0&$'(4!A!RE`008I0&$'(4`!
+M!"%``00I0(&7)$B"]R-)(04B0`0P($```#TD``"A(`T`X,,"!.M'`0`K("MV
+M($@"!$)``@1%0```8BQ#`F)(2`#>I&$#PD@!!"-$```B/`$`*B`J=B!(`0#J
+M0Z$))$#P_S_T"@3_1P``/20``"$@!@!!+`8`(2#"`D%(`@1"0`($3$#^_R(L
+M00\B2($7)DBA#2E`50`@]```/20``,$A!@"N(0``/20``.$A,@`I("$7)DB)
+M%R9(!@".+`(`X,,!`"H@*G8@2,("C4@"!$)``@1,0/[_(BQ!#R)(@1<F2*$-
+M*4`.`"#T`P1*00,$;$`"`",@_O]!+$(/04B"%T9((@4B000`8R#^_R,L00\C
+M2($7)D@A!2%!`@!!3.C_7_PP=B!)`@1*00$$3$```"$NT0(A2@(`(2```$$N
+MT@)!2@``/20``"$@`@1!0```(BS!`B)($P0A0#-V8$H"`$(@```B+,$"(D@4
+M!"%`-':`2A4$_T?``D#3`0`@("%V($@"!&M!`P1/0((V($@``",L00(C2&(#
+M0T@"!$%$``!#/,$"0TA0`)ZDH0<D0`0`(/1"`D-(80.#2`$$(D0``",\`0`K
+M("MV($@&`$XLP@)-2`($0D`"!$Q`_O\B+$$/(DB!%R9(H0TI0+#_/^2A]V=!
+M$``@Y```/20``($@`01K00$$)$#^_V$@``!#+,,"0T@``$$L0@)!2&,#84@#
+M!&)$``!A/`$`*R`K=B!(H?=G0?+_/_0!`#\E@*$I(0H$_T<``#TD``!A(4($
+M2T$"`"(@``!!+M("04HR%T%*$O1?1G)30$H``"(LP0(B2"$7(4@!]#]$(78@
+M2!($0482`/)#0``>IA$$Z4<``'VG`$!;:P``NB<``+TC"9`@00$`*B`J=B!(
+MH?=#0>?_/_0``%ZG"``^I1``7J48`'ZE(`">I2@`OJ4P`-ZE.`#^I6``WB,!
+M@/IK``"[)P``O2-0_]XC``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU,`#>M3@`
+M_K58`!ZV#P3Q1PL$\D<.!/-'"@3T1V``'K9H`/ZW<`#^MW@`_K>``/ZW/P`_
+M((@`/K28`/ZW```])```H2$&`%0@__\B+$$/(DB!%R=(`00A0"%V($B0`#ZT
+M`@`T+`(`5"#!`B)(@18A2`8`(.!$%#"@(1<E2($7)T@%`.##>``^M88`X,-@
+M`%ZD1!0BH($7(T@2`.%#6``>IA$$ZD<``'VG`$!;:P``NB<``+TC(!<'2(`7
+M!TB@`!ZT/P#@Y0D$_T="!B]!``!B+,$"8D@.`"#D`00I04``GB`!!"1`"``A
+M(,,"8D@``$$L0@)!2&,#84@#!&)$``!A/`$`*2`I=B!(H?<@0>[_/_0,!.E'
+M```*+M`""DI(`#XB$@3I1T``?B)"`)XB0P)`TPD$_T<.`(#E0`">+`$$*4%`
+M`+X@`00E0`@`(2##`H5(``!!+,("04BC!6)`!`!@]`$`*2`I=B!(H0,L0?/_
+M/_1``#XL0`!>(,,"(DA"`%X@0@`^+,$"(DBA!6%`!``@Y```*BS!`BI(H05A
+M0`,`(/1!!B]!!``AH`4`(.1!!B]!`@!!+`(`(2#!`D%(B``^M`D$_T<3`,#E
+M`P0I04``GB`#!&1`"`!C($$$*4$!!"%``00K0`@`02P(`"$@P@)!2```(RQ!
+M`B-(8@-#2`($040``$,\`0`I("EV($BA`RY![?\_]```"B[0`@I*2``^(A($
+M[D=``'XB0@">(@,"0-,)!/]'&P#`Y4``GBQ"`+X@`@0I04``/B`"!$%`"`!"
+M(,,"@4@``"(LP0(B2*,%84!H`%ZDP@1I1&@`7K0#!"E!0``^(`,$84`(`&,@
+M0@!>+,("14@``",LP0(C2*(%04!\_U_T`0`I("EV($BA`RY!Y_\_]`D$_T<"
+M`"HL`@!*(,$"(D@!$"A$"0`@Y*&7($$0`"#TH;4@01T`(/2AU2!!*@`@]*'U
+M($%%`"#D-@#@PR+V(4FA]T!`00`@Y```/20``"$@001!0```(:`!!*%#``#A
+M:V@`7J1!!$)``00A0`$$*T`&`$$L!@`A(,$"04AP`#ZT>`!^I$$$8T`!!"%`
+M`00K0`8`02P&`"$@*@#@PV@`GJ1!!(1``00A0`$$*T`$`$$L!``A(,$"04AP
+M`#ZT>`"^I$$$I4`!!"%``00K0`0`02P$`"$@&P#@PV@`7J1!!$)``00A0`$$
+M*T`"`$$L`@`A(,$"04AP`#ZT>`!^I$$$8T`!!"%``00K0`(`02P"`"$@#`#@
+MPV@`GJ1!!(1``00A0`$$*T```$$LP0)!2'``/K1X`+ZD002E0`$$(4`!!"M`
+M``!!+,$"04B``#ZT```*+M`""DI``#XN0``^(-$"(4I"`#X@0@!>+M("04IP
+M`'ZF@`">IA4$_T=8`4#3B`!>I*$#0$""!"!$('9`2`(`*BP"`$H@P0(B2`$0
+M(D0*`"#D8`!^I"@4(Z`A=B!(`#!?(*$'(D`$`"#T-!0CH,%2($BB`R!`P`1!
+M1`,$*4$#!&U`D`"^I*``/J0D!:%``@#@0Z$)@D#"!"1$```C+$$"(TAB`T-(
+M`@1!1```0SP4`"#U6`!^I+`#0Z`B]D%(`@1"0```/20``"$@`@1!0```8BS#
+M`F)(`P1C0```+2S!`BU((04C0"$7)DB!%R9(F``^M*$]($"8`)ZDQ#0@1)@`
+MGK0"!"E!`@1-0```8BS$`F)(F`"^I*$)I$"%!"1$0P)B2&$#HD@!!"-$```B
+M/`$`*2`I=B!(H?<@05[_/_0``"TLP0(M2&``7J2(,"*P"C#@1RG70TD&`$TL
+M!@`M(,("04@"\$=$(A=#2`($(D4LUT))`@1,1`0`;2P$`"T@P0)A2`'P)T0A
+M%R)(`@1!1"O704D"!$M$`@!M+`(`+2#!`F%(`?`G1"$7(4@"!$%$*M=`20($
+M2D0``"TLT@(M2!+P1T82!$)&$@#R0U@`'J8!`#\F-)DQ(@``?:<`0%MK``"Z
+M)P``O2,.`$TL#@`M(,$"04@!\"=$(1<C2`D$(44)!"Q%#`!-+`P`+2#!`D%(
+M`?`G1"$7(D@)!"%%"00K10H`32P*`"T@P0)!2`'P)T0A%R%("00A10D$*D4(
+M`$TL"``M(-("04@2\$=&$@1)1A(`\D-8`!ZF`0`_)CB9,2(``'VG`$!;:P``
+MNB<``+TC```M+M$"+4I8`!ZF.?Q?TP``+2S"`BU(6`!^I*P#(Z`A=CY(8E-`
+M2`($042L`T.P``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE,`#>I3@`_J6P`-XC
+M`8#Z:P``NR<``+TCH/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M3``WK4X
+M`/ZU#03P1PX$\4</!/)'0`!^(G$`0-,$``#D0``^+$``7B#``B)(8@#@PP@`
+M3Z(R=D!*$`3M1P``+Z9"`'XB1`">(L4`0--"`#XN0@`^(-$"(4I&`%XA2`!^
+M(1`$[D<2!.]'$P3J1Q0$ZT<6`4#31``^+D0`7B#1`B)*$`3N1Q($[T=*`'XB
+M3`">(@X!0--"`!XN0@`^(-`"`4I&`#XNT0(J2DX`GB$2!.]'$P3L1TH`0--"
+M`!XN0@!>(-`"`DI(`#XNT0(K2E``/B$2!.]'$P3I1T$`0--&`#XNT0(J2D@`
+M7B[2`DM*3@!^+M,";$I0`)XNU`*)2A`$[D<5!/]'9P!`TPH$X$=$`!XN1``^
+M(-`"`4I*`#XN2@!>(-$"(DH2!.]'$P3L1RP`0--$`!XN1``^(-`"`4I,`#XN
+M3`!>(-$"(DH2!.]'$P3I1R,`0--*`#XN2@`^(-$"(4I,`%XN3`!>(-("0DI.
+M`'XNTP)L2E``GB[4`HE*$`3N1Q4$_T='`$#30@`^+D(`/B#1`B%*1`!>+D0`
+M7B#2`D)*$`3M1Q,$ZD<4!.!'%03_1SP`0-,``.!#``!>IP@`/J40`%ZE&`!^
+MI2``GJ4H`+ZE,`#>I3@`_J5@`-XC`8#Z:Q``DJ0&!/]'"``RH"%V($@H`"#D
+M```D+,$")$BA!3!`'0`@Y`@`9"`%!/]'!@`D+`8`1"#!`B)(%P`@Y```(RS!
+M`B-(H04Q0`P`(.0!!*5``00D0!X`(2```$$LP@)!2```,RQ!`C-(8@-32`($
+M040``%,\`0`?(`&`^FL"`&,@`0`E("5V($@&`"0LP0(B2*$')4#I_S_D-`"$
+M(`$`)B`F=B!("``RH"%V($BA!R9`V/\_Y``$_T<!@/IK``"[)P``O2-D`%\@
+M`0!T3@`$_T<J`"#DPC2@1J$%44(A`"#T.`410E@$&$-8!!A#6!0`0SD%44(`
+M`'VG`$#[:CL79DN0%V9+`P``^@($\T=!!'-"!`#@PZ&=#$((`"#T`@3T1T$$
+ME$)!!"%`010@0"!V($@2`*#V``3B1P&`^FL8`!1.9``_("$%,$`!`#-,&``!
+M0QD`XD,``'VG`$#[:B!V8$L!@/IK``3S1P0`H.9!!'-"000A0$$4($`@=B!(
+M`8#Z:P$$4D(!!#%`_O\A(```02S#`D%(4`000E`$$$)0%`!"``"1+,$"D4A!
+M!"%`000A0&%5(4`B]@%*(?8A2*(#04`)`$#DP@*12```,RQ!`C-(8@-32`($
+M040``%,\```Q+,(",4@9`.##001C0$$$(4`B]@%*050A0*('04`<`$#T``!3
+M+$("4TAA`W-(`00B1```,SP``#0L00(T2&,#=$@#!&%$``!T/`&`^FO"`D-(
+M```S+$$",TAB`U-(`@1!1```4SP``",LP@(C2```-"Q!`C1(8@-42`($040`
+M`%0\`8#Z:P``(BS"`B)(\/__PP0$_T<:`$#F)?8!2A(`\D,!!(1``P0Q0```
+M0RS!`D-(000A0$$$(4!A!3!`"0`A("'V(4BA5R)`X/\_]`($XT<"`&,@```C
+M+,$"(TA!!"%`000A0&%5(4`A]B%(H0.A0.3_/_0$,(!`H0F20.C_/_0!@/IK
+M``"[)P``O2/P_]XC``!>MQ``4J0#!/]'"``RH`0$X4<A=B!("0`@Y```(BS!
+M`B)(H04Q0`4`(/0T`$(@`S!@0"%V@$BA#2-`]_\_Y`@`(B(&`$(N!@`B(-("
+M04J/_U_3``!>IQ``WB,!@/IK``"[)P``O2/0+7`@``!=)```0B`$`"*@T"TP
+ML"'V(4AA!R%`"`!"($$$(D`8`".T`0`_(!0`([`4`#\@#``CL",`/R`0`".P
+M`8#Z:^@3,*0``"&@@;8B2`<`(.`"!/]''`!_($``GR!R`+\@#`#QLW<`/R`'
+M`.##`@3_1S(`?R`$!/]',@"_(!0`/R`,`#&P(P`_(!``,;`$`#&@``3_1S'V
+M(4@B]D%(H@,B0J$#<4`!!")$!0`@Y"+V@4BB`R)"H0.Q0`$$(D3`-"!$``#@
+M0P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$\$>(,%"B,C=!2@!^/R`2`$%&
+M`0`_)`"`(2`2!$%&$@#R0P$`/R8PF3$B``!]IP!`6VL``+HG``"](P$`/R"$
+M,"FP``!>IP@`/J40`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`
+M?K4)!/!'T"U0(10`*J``!/]')``@Y(0P,*"A-2!`(``@Y`$`/R8PF3$B``!]
+MIP!`6VL``+HG``"](P``X$,!`#\D`(`A(`$``405`"#T(?8!2($V(T@$`"JP
+MA##ILQ`$Z4<1!.I'H_]?TPT``/00!.E'$03J1Q$`0-,)``#D$`3I1Q$$ZD<=
+M`$#3!0``[!`$Z4<1!.I'DP!`TP(`/R"$,"FPA#`)H```7J<(`#ZE$`!>I1@`
+M?J4@`-XC`8#Z:P`$_T<$`#&@(O8A2`P`,:`A]B%(H0=!0`0`(/00`#&@(?8A
+M2*$#04`!`"#T`0`?(```X$,!@/IK``"[)P``O2,4`#&@__\?('8`(.0``#&@
+M(_8A2&('8T```#TD```A(`@`(2!"!$%`&`!1M`0`4:`B]D%($``QH"'V(4BB
+M`T%`*`!`]/__'R!F`&#D!`!1H`@`4;`B]D%($``QH`,$X4<A]B%(H@-!0!P`
+M0/0``#&@`@3A1QD`(.0``#TD``#!(@@`%B$G]F%(___"(```T;`E]L%(8P>E
+M0$,48$`!!'9`&`"1I!``0:`(`"2@(@5!0`($0D`(`#&@(04B0`@`,;`#!&A`
+M&`!QM"'V(4BA`R=``@`@]`($YD?K_[_T`0`?(`&`^FL$`%&@(O9!2`P`,:`A
+M]B%(H@=!0``$_T<Y`$#D```])```(:#__R$@``!1H"+V04@A]B%(H@5!0/[_
+M`"`P`$#T!`!1H`@`4;`B]D%(#``QH`0$X4<A]B%(H@=!0"<`0.0``#TD``!!
+MH/__0B```#&@`P3A1R'V(4@B]D%(H0,B0!X`(.0``#TD``#A(@@`UR(H]H%(
+M```])```(:#__R$@)_8A2`$`PR```-&P)?;!2&,'I4!#%&!``01W0!@`D:00
+M`$&@"``DH"(%04`"!$)`"``QH"$%(D`(`#&P`P1V0!@`<;0A]B%(H0<H0`,`
+M(.0#!.9'H0.G0.K_/_0"`!\@`8#Z:Q0`,:`@`"#D&`!QI```0RR(%3"@(98_
+M2,("0T@"!$%$B!50L!@`,:0"`$$L`@`A(,("04B$%3"@(78^2&)30$@"!$%$
+MA!50L!@`,:0$`&$L!``A("*67TC#`F%(`P1B1(05<+`8`#&D!@!!+`8`(2#"
+M`D%(@!4PH"%V/DAB4T!(`@1!1(`54+`!@/IK``"[)P``O2/@_]XC``!>MP@`
+M/K40`%ZU&`!^M0L$\$<)!/%'"@3P1P$`/R8$@#$B``!]IP!`6VL``+HG``"]
+M(R!V`$BA-2!!$0`@]*$]($$"`"#D"@`@Y1D`X,.AU2!!`P`@]*$5(4$)`"#T
+M%`#@PXPP2Z(2!!)$@0`_)`<`X,.,,$NB$@021$(`/R0#`.##C#!*HA($$D0@
+M`#\D$@1!1A(`\D,0!.M'`0`_)@2`,2(``'VG`$!;:P``NB<``+TC``!>IP@`
+M/J40`%ZE&`!^I2``WB,!@/IK``"[)P``O2/P_]XC``!>MXP#,*+&_U_3``!>
+MIQ``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU&`!^M0H$\$<)!/%'
+M``!]IP!`6VL``+HG``"](PL`X$,`@#\F$0%Q11`$ZD<``'VG`$!;:P``NB<`
+M`+TC$`3J1S``/R(``'VG`$!;:P``NB<``+TC``#@0X&6`$@"\"=$!@`@Y24`
+M/R`A!2)`(?8A2($V($@"`$%`"P#@PZ$W0$`B,4!`"``@Y!`$ZD<1!.M'``!]
+MIP!`6VL``+HG``"](P`$_T<4`.###_Q?(A(`$D0AET!(\`-?(`$`(D02!$%&
+M$@#R0Q`$ZD<P`#\B``!]IP!`6VL``+HG``"](Q`$ZD<1!.M'``!]IP!`6VL`
+M`+HG``"](P$`'R```%ZG"``^I1``7J48`'ZE(`#>(P&`^FL``+LG``"](_#_
+MWB,``%ZWH3TA0@`$_T<(`"#D<04Q0E$$,4)1!#!"%"XQ(@``?:<`0%MK``"Z
+M)P``O2,``%ZG$`#>(P&`^FL``+LG``"](_#_WB,``%ZW`P3R1Z$](4(`!/]'
+M"0`@Y'(%,4)2!%)"4@100A0N4B(1!.-'``!]IP!`6VL``+HG``"](P``7J<0
+M`-XC`8#Z:P``NR<``+TCT/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M0L$
+M\$<*!/%'#03R1R+V(4JA54!`"``@]*%70$`#`"#DH35`0`@`(/0,`.##H75`
+M0`,`(/0)`.##"0"?(0D`X,,(`)\A!P#@PPP$_T<8+C"@``3_1R,`(/0"`.##
+M__\?("``X,-A!8Q!000A0$D$,$`4+BDA!``IH/__'R`9`"#T$`3I1SP`/R(`
+M`'VG`$!;:P``NB<``+TC!`!)L0P`H/4+`#\@#``IL`(`/R`4`"FP__\_(!@`
+M*;#_`S\@'``IL`H`/R0!5"%$(``IL`0`X,,0!.M'$03L1Q($[4>;_U_3``3L
+M1P``7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WB,!@/IK``"[)P``O2/@_]XC
+M``!>MP@`/K40`%ZU&`!^M0D$\$<`+E"B_P-_(1(`2T8(+C"@(1<B2/\#7R4!
+M`"I$$@1!1J0`/R(``'VG`$!;:P``NB<``+TC!"Y)HA(`2T8,+BF@(1<B2`$`
+M*D02!$%&$`3I1Z@`/R(``'VG`$!;:P``NB<``+TC$`3I1ZP`/R(``'VG`$!;
+M:P``NB<``+TC`/P_(````400+BF@`0`K1``$`40``.!#$`3I1ZP`/R(2!.!'
+M``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`!>I1@`?J4@`-XC`8#Z:P``NR<`
+M`+TC\/_>(P``7K>A-R%"``3_1QX`(.0A]B%*804A0$$$(4!$!#!`%"Z$(`0`
+M)*``!/]'%@`@Y`0`Y+,!`%\@(@=12`(%XD<`+C"@`0`B1``N,+`$+C"@`0`B
+M1`0N,+`(+C"@`0`B1`@N,+`,+C"@`0`B1`PN,+`0+C"@`0`B1!`N,+`1!.1'
+MI/]?TP$`'R```%ZG$`#>(P&`^FL``+LG``"](\#_WB,``%ZW"``^M1``7K48
+M`'ZU(`">M2@`OK4P`-ZU#`3P1PT$\4<.!/!'Z!-PI*$W(4(`!/]'CP$@Y"'V
+M(4IA!2%`000A0$L$,$`4+FLA!``KH`$`'R"'`2#D&`!+H"+V04C__S\@@18D
+M2*(%04`4`$#D!@!@Y```(Z#!4B!(`1`T1*$5-$`?`'\@`0`@]`\`?R`!`%\@
+M(?9A2`,$X4>A`T%`"``@Y`$$0D`!-"!$`@#A0R'V04BA`R-`^O\_]`$`X,,8
+M`$N@212@04`0*2(1`/%#_P-?(A(`4D0<`$N@(E=!2!``/R0`_"$@`@!!1!($
+M0D84`"N@(9<B2/`/7R0!`")$$@1!1A(`\D,0!.Q'``!]IP!`6VL``+HG``"]
+M(X`0*2(1`/%#(``KH)*6(4@2$%Y&`?`A1!($048(`#\D`"`A(!($0480!.Q'
+M``!]IP!`6VL``+HG``"](\`)*2(1`/%#$`3L1P`(7R(``'VG`$!;:P``NB<`
+M`+TC?`,LH*%W($`(`"#D`!$I(A$`\4,0!.Q'``%?)@``?:<`0%MK``"Z)P``
+MO2,D`$NB(@!`YDD4H$'`""DB$0#Q0S+V0$HH`"N@(1<C2!($0482`/)#$`3L
+M1P``?:<`0%MK``"Z)P``O2/`"2DA"0#I0Q`$[$<1!.E'``!]IP!`6VL``+HG
+M``"](P`T`$0``.!#*``KH``!7R""%"!$``0"1!`$[$<1!.E'$@3@1P``?:<`
+M0%MK``"Z)P``O2,P`$NB"P!`YE$4H$$`"3$B$0#Q0S+V0$H``3\D$@1!1A`$
+M[$<``'VG`$!;:P``NB<``+TC+``KH",`(.1)%*!!P!`I(A$`\4,0`%\F__]2
+M(A(`,D00`#\D$@1!1A(`\D,0!.Q'``!]IP!`6VL``+HG``"](PP`*Z`!$"1$
+M$@`@Y,`)*2$)`.E#$`3L1Q$$Z4<``'VG`$!;:P``NB<``+TC``(_(``$`40`
+M`.!#$`3L1Q$$Z4<2!.!'``!]IP!`6VL``+HG``"](PP`*Z"!%B)($P`@X$D4
+MH$$`$2DA"0#I0Q`$[$<1!.E'``!]IP!`6VL``+HG``"](R``/R0`!`%$``#@
+M0Q`$[$<1!.E'$@3@1P``?:<`0%MK``"Z)P``O2,,`"N@@?8B2!,`(.!)%*!!
+M`!$I(0D`Z4,0!.Q'$03I1P``?:<`0%MK``"Z)P``O2,``C\@``0!1```X$,0
+M!.Q'$03I1Q($X$<``'VG`$!;:P``NB<``+TC!``KH"+V(4BA54!``P`@]*%U
+M0$`<`"#T4P#@PTD4H$'`"2DA"0#I0Q`$[$<1!.E'``!]IP!`6VL``+HG``"]
+M(P!4%$0``.!#$`3L1Q$$Z4<2!.!'``!]IP!`6VL``+HG``"](WP#+*"A=R!`
+M)0%_)"4`7R2#!")$`03C1U$4H$$`$3$B,0#@PTH4H$'`"2HA"0#I0Q`$[$<1
+M!.E'``!]IP!`6VL``+HG``"](V("/R``!`%$``#@0Q`$[$<1!.E'$@3@1P``
+M?:<`0%MK``"Z)P``O2,``#VD``!!H```/:0``"&@(@5!0)`P+J`A!2)```!=
+MI```0J`A!2)`(5<A2`$`X4,`"4HA"@#J0P`!7R82!#)$$`3L1Q$$ZD<``'VG
+M`$!;:P``NB<``+TC?`,LH*%W($`$`7\D!`!?)(,$(D0!!.-'412@0<`),2(1
+M`/%#$`3L1Q($X4<``'VG`$!;:P``NB<``+TC.``KH!,`(.!)%*!!`!$I(0D`
+MZ4,0!.Q'$03I1P``?:<`0%MK``"Z)P``O2,D`#\D``0!1```X$,0!.Q'$03I
+M1Q($X$<``'VG`$!;:P``NB<``+TC#``KH`4`(.`!`%\@(@=-2``N+J`!!")$
+M!`#@PP$`/R`A!RU(`"Y.H`$!040`+BZP#``KH`4`(.`!`%\@(@=-2`0N+J`!
+M!")$!`#@PP$`/R`A!RU(!"Y.H`$!040$+BZP#``KH`%0($0%`"#D`0!?("('
+M34@(+BZ@`00B1`0`X,,!`#\@(0<M2`@N3J`!`4%$""XNL`P`*Z`!D"!$!0`@
+MY`$`7R`B!TU(#"XNH`$$(D0$`.##`0`_("$'+4@,+DZ@`0%!1`PN+K`,`"N@
+M`1`A1`4`(.0!`%\@(@=-2!`N+J`!!")$!`#@PP$`/R`A!RU($"Y.H`$!0400
+M+BZP$`3L1Q$$ZT<!_E_3`0`?(```7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``
+MWJ5``-XC`8#Z:P``NR<``+TC\/_>(P``7K=1%"!"``@Q(A$`\4,``'VG`$!;
+M:P``NB<``+TC``!>IQ``WB,!@/IK``"[)P``O2/P_]XC``!>MU$4($(`"#$B
+M$0#Q0P``?:<`0%MK``"Z)P``O2,!`!\@``!>IQ``WB,!@/IK``"[)P``O2/P
+M_]XC``!>MP$`7R(R!U%*$@#R0T`(/R(``'VG`$!;:P``NB<``+TC`0`?(```
+M7J<0`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`?K4+!/!'"@3Q
+M1U$4($(`"C$B$0#Q0P``?:<`0%MK``"Z)P``O2,)<`!$"P`@]1`$ZT=`"#\B
+M``!]IP!`6VL``+HG``"](P$`/R`A!RI(```!1"#V`4C)-`!$``3I1P``7J<(
+M`#ZE$`!>I1@`?J4@`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`
+M?K4+!/!'"@3Q1P$`7R(R!U%*$@#R0X`(/R(``'VG`$!;:P``NB<``+TC"03_
+M1Q`$ZT<1!.I'R?]?TP@``.0*`!\B``!]IP!`6VL``+HG``"](PDP($'QV"D@
+M]/\_[!`$ZT>`"#\B$@3_1P``?:<`0%MK``"Z)P``O2,/)Q\@H`T@00``7J<(
+M`#ZE$`!>I1@`?J4@`-XC`8#Z:P``7J`0`!ZA&`!^H"``OJ#_#S\@$@!!1B)7
+M0D@2!$)&(S=C2!($0T82`/)#``$_)`0$048!`*#P!`#R0P(0HD0`(#\D`P2!
+M1`$`0/0#`.1#`I"@1$``/R0$!&%$`0!`]`0`XT,!$*1$H0/A0R'W(D@!!(%$
+M"P!1+`@`<2P(`/$@Y`PG2&$%)TA"#$=(0P1G2`($1$0#!&%$"P!1/`@`<3PB
+M5X-*`@#B0P%0H$2A`^%#(?<B2`($040/`#$L#`#1+`P`L2#C#$5(8@5%2$$,
+M)4A&!,5(`00C1`8$PD0/`#$\#`#1/"+V`4G__S\@@18D2*(%04`@`$#T#P"1
+M+,($Q4A!#85(`@1!1".W`4D0`#\D`.`A(`,`840"!$-$XPQ%2&(%14A$#(5(
+M003%2`0$@T0!!")$#P"1/`P`,3P(`)$L"P!Q+,$$ATA"#6=(`00B1`!`7R0!
+M!")$X@PG2&$%)TA##&=(1`2'2`,$8D0$!(%$"P!Q/`@`D3P!`!\@`8#Z:P`$
+M_T<!@/IK"`"Q+`L`D2P(`'$@P02C2$(-@T@!!")$`"!?)`$$(D3B#"-(804C
+M2$0,@TA%!*-(!`2"1`4$H40+`)$\"`"Q/`&`^FL4`&#F#`"Q+`\`D2P,`'$@
+MP02C2$(-@T@!!")$`0#A0P`07R#"%(!&`00R1`$$(D3B#"-(804C2$0,@TA%
+M!*-(!`2"1`4$H40/`)$\#`"Q/#4`X,,=`(#F"`!5+`L`-2P(`'4@P@1#2$$-
+M(T@"!$%$"P!Q+`@`D2P(`#$@Y0Q!2&(%04A##&%(1`2!2`,$940$!()$"P!Q
+M/`@`D3P/`%$L#`!Q+`P`,2#D#$%*905!2D(,04A#!&%(`@1$1`,$940/`%$\
+M#`!Q/!<`X,,+`'$L"`"1+`@`,2`"!/]'X@Q!2$,,84A$!(%(`P1B1`L`<3P(
+M`)$\`!!?(`($0D8/`'$L#`"1+`P`,2#E#$%(8@5!2$,,84A$!(%(`P1E1`0$
+M@D0/`'$\#`"1/`4$_T<7`%$L%`!Q+!0`,2#D#*%(0@Q!2$,$84@"!$1$%P!1
+M/!0`<3P3`%$L$`!Q+!``,2#E#*%(0@Q!2$,$84@"!$5$$P!1/!``<3P!`!\@
+M`8#Z:Q0`42P7`#$L%`!Q(,($0TA!#2-(`@1!1`\`'R"N`$#@%``Q+!<`42P4
+M`'$@P00C2$(-0T@!!")$(7<F2(*6)D@``#(L00(R2&(#4D@"!$%$``!2/!``
+M,2P3`%$L$`"1(,$$)$A"#41(`00B1($6(D@"`%(L`@!R($("0TAA`R-(`00B
+M1`(`,CP$`'(L!`"R($,`94@$`'(\$`!1+!,`,2S"!$1(00TD2`$$040H`"#P
+M`5`@1`8`(.3!`&5(`30@1$(`94AA`25(`00B1`0`,CP0`#$L$P!1+!``<2#!
+M!"-(0@U#2`$$(D0!$"%$"``@Y`0`<BP$`%(@P0!B2`%4($1#`&)(80$B2`$$
+M(T0$`#(\$``Q+!,`42P0`'$@P00C2$(-0T@!!")$`9`@1`@`(.0$`'(L!`!2
+M(,$`8D@!E"!$0P!B2&$!(D@!!"-$!``R/`@`,2P+`%$L"`!Q(,$$(TA"#4-(
+M`00B1(%6(D@!\"%$!0!2+`4`<B!"`$-(80$C2`$$(D0%`#(\%`!1+!<`,2P4
+M`'$@P@1#2$$-(T@"!$%$(``_)`#@(2`"`$%$@;9!2`8`4BP&`'(@0@!#2&$!
+M(T@!!")$!@`R/!``,2P3`%$L$`"1(,$$)$A"#41(`00B1($6(4@!\"%$!P!2
+M+`<`LB!"`$5(80$E2`$$(D0'`#(\$``Q+!,`42S!!"1(0@U$2`$$(D0!$#Y$
+M@98@2`@`4BP(`'(@0@!#2&$!(T@!!")$"``R/!``42P3`#$LP@1$2$$-)$@"
+M!$%$`0`_)`#P(2`"`$%$@99!2`D`4BP)`'(@0@!#2&$!(T@!!")$"0`R/`H`
+M,BP*`%(@00`B2`H`,CP+`#(L"P!2($$`(D@+`#(\!P!2+,$`14@%`"#D`0`A
+M($(`14AA`25(`00B1`<`,CP(`%(L"`!R(,$`0T@%`"#D`0`A($(`0TAA`2-(
+M`00B1`@`,CP`!/]'`8#Z:P&`^FN`,%"@`11!1`+Q7T0!\#]$`00B1(`P,+`$
+M`%$L!`!Q(,$`0T@!%"%$0@!#2&$!(T@!!")$!``Q/'PP,*#"4B!(```Q+$$"
+M,4AB`U%(`@1!1```43R`,%"@!``Q+$$`(TAB`4-(`@1!1`0`43R`,#"@P3`@
+M2`4`42P%`'$@0@!#2&$!(T@!!")$!0`Q/``$_T<!@/IK``"[)P``O2/P_]XC
+M``!>MP@`/K4)!/!'@$`_(DF27R8`_%(B``!]IP!`6VL``+HG``"](Q`$Z4>`
+M0#\BDB1?)B1)4B(``'VG`$!;:P``NB<``+TC$`3I1X!`/R(`*%\F.0!2(@``
+M?:<`0%MK``"Z)P``O2,0!.E'@$`_(A937R8D"%(B``!]IP!`6VL``+HG``"]
+M(Q`$Z4>`0#\BF.5?)GD%4B(``'VG`$!;:P``NB<``+TC$`3I1X!`/R(>`%\F
+M_^]2(@``?:<`0%MK``"Z)P``O2,0!.E'@$`_(JL:7R9`OE(B``!]IP!`6VL`
+M`+HG``"](Q`$Z4>`0#\B$+Y?)E154B(``'VG`$!;:P``NB<``+TC$`3I1X!`
+M/R(.`%\F!S!2(@``?:<`0%MK``"Z)P``O2,0!.E'A$`_(A($_T<``'VG`$!;
+M:P``NB<``+TC``!>IP@`/J40`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU
+M$`!>M1@`?K4+!/!'`0`_)M"8,2(6'%\B``!]IP!`6VL``+HG``"](PD$_T<!
+M`%\E@)A*(1`$ZT<1!.I'`0!?)@``?:<`0%MK``"Z)P``O2,),"!!H?T@0?;_
+M/_00!.M'`0`_)@"<,2(``'VG`$!;:P``NB<``+TCT'``2(*6`$H!\`%&(9<@
+M2!`$040(`#\B``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`!>I1@`?J4@`-XC
+M`8#Z:P``NR<``+TC</_>(P``7K<&!/!'```])```H:```"$@!`!!H`@`8:`,
+M`(&@$``AH!``OK`4`%ZP&`!^L!P`GK`@`#ZP```])```H:```"$@!`!!H`@`
+M8:`,`(&@$``AH#``OK`T`%ZP.`!^L#P`GK!``#ZP```])```H:```"$@!`!!
+MH`@`8:`,`(&@$``AH%``OK!4`%ZP6`!^L%P`GK!@`#ZP```])```H:```"$@
+M!`!!H`@`8:`,`(&@$``AH'``OK!T`%ZP>`!^L'P`GK"``#ZP!`3_1T$4@$`#
+M!"9`$`!>(`$$(D```$&@*$A#L"``0:`\2$.P0`!!H%!(0[!@`"&@9$@CL`0P
+M@$"AG8!`\?\_]`$`/R(``'VG`$!;:P``NB<``+TC``!>IY``WB,!@/IK,O9!
+M2A$$,4(1!#)"$00Q0A$$,$*V%Q$LMA<Q(L`"$4@!@/IK``"[)P``O2/0_]XC
+M``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU"03P1PT$\4<*!/)'"P3S1PP$]$<`
+M`#TF```Q(B@47R(``'VG`$!;:P``NB<``+TC$`!)M1@`:;4@`(FU>`.IL:P#
+M*:`AEC](`?0G1*P#*;"P`^FSK#'IL[`QZ;,`"#\DO#$IL($'/R#$,2FPS#'I
+MLS\`/R0_/R$@T#$IL&0`/R#4,2FP`@`_(-@Q*;#__S\@\#$IL/0Q*;#X,2FP
+M!"X)(@``/28``#$B!@!?(@``?:<`0%MK``"Z)P``O2/\,2F@`?$_1/PQ*;``
+M`%ZG"``^I1``7J48`'ZE(`">I2@`OJ4P`-XC`8#Z:P``NR<``+TC!`3_1P``
+M/20``*$@806$0`,$)4```",LP0`C2*$%,$`+`"#D`0!#(```(BS!`")(H0<Q
+M0`8`(.0"`$,@```B+,$`(DBA`S%``0`?(`0`(.0$,(!`H7>`0.S_/_0`!/]'
+M`8#Z:P``NR<``+TCL/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M3``WK4)
+M!/!'"@3Q1PL$\D<,!/-'#@3T1ZA('R(``'VG`$!;:P``NB<``+TC#03@1P(`
+M/R!F`@#D$`3@1Q$$Z4<2!.I'$P3K1Q0$[$<5!.Y'AO]?TPD$[4<0!.U'$03_
+M1P$`7R(``'VG`$!;:P``NB<``+TC&0``Y!`$[4<@0#\B``!]IP!`6VL``+HG
+M``"](P#P'T20E@!(?`,-LA'P`42``RV@(98_2#%V($H1!"%&@`,MLA'P(4:O
+M_U_3K0$`Y!`$[4<1!/]'``!]IP!`6VL``+HG``"](P(``/0#`#\@,@+@PQ`$
+M[4<!`#\F&)@Q(@``?:<`0%MK``"Z)P``O2.``RV@(78^2"`7`D@`!`%$@`,-
+ML'P#+:`B]B%(H35!0`4`(/2A54%`!0`@Y"%V`$BA=R!``@`@Y!`$Z4=J_E_3
+M$`3I1P``?:<`0%MK``"Z)P``O2,.`#\@%`(`Y'P#*:"AER!`$``@]!`$Z4<0
+M0#\B``!]IP!`6VL``+HG``"](P`0/R``!`%$``#@0Q`$Z4<00#\B$@3@1P``
+M?:<`0%MK``"Z)P``O2,0!.E'`0`_)@"8,2('`%\B``!]IP!`6VL``+HG``"]
+M(Q`$Z4>>_E_3A`,IH"&6/T@@=@!(``0!1(0#";``$!Y$H14&0#4`(/2A'09`
+M!``@Y*$5`D`Q`"#TH14$0`<`X,.A%0Q`+0`@]*$=#$`"`"#DH14*0`$`X,.A
+M%11`)P`@](0#::`A=F!()``@]'P#*:"AM2!`"``@Y(`#2:0B]D%(0P`_)`D`
+M(2"B!4%`(99_2`'4*$08`$#T?`,IH"'V(4BB]2!`H74A0`($040$`$#DA`,I
+MH"&6/T@!-"I$#@#@PWP#*:`A]B%(HE4A0`<`0/2A-2%`!0`@]`@`0.2``RF@
+M(78@2*%W($`$`"#DA`,IH"&6/T@!5"Q$A`,IL'P#*:`A]B%(HE4A0!``0/2A
+M-2%`#@`@]`0`0.2``RF@(78@2*%W($`)`"#TA`,IH")V($@!$%Y$T/\A(*'W
+M)T`#`"#D`?!!1*&=($`8`2#T$`3I1\$`/R)``%XB``!]IP!`6VL``+HG``"]
+M(YT!`.1``#XL0`!>(,$"(D@!,%\@H0<B0`(`(.0%`#\@E@'@PR@43:`BEE](
+M0``^+$``?B#!`B-(`00B1"@4+;`0!.E'$$`_(@``?:<`0%MK``"Z)P``O2,`
+M$`-$@'8`2*%5`$`.`"#TH74`0`H`(/1\`RF@(O8A2*$U04`(`"#TH55!0`0`
+M(.2``RF@(78@2*%W($`"`"#T"@`_('<!X,,0!.E'/P`_(D``7B(``'VG`$!;
+M:P``NB<``+TC;@$`Y$``/BQ``'X@P@(C2"@4+:`A=CY(8E-`2`($040H%$VP
+M$`3I1QP`/R(2!.-'``!]IP!`6VL``+HG``"](UX!`.1``%XL0`!^(,$"0TA`
+M`W\A#P`@Y`'Q(40KER%($`3I1QL`/R(2!.-'``!]IP!`6VL``+HG``"](T\!
+M`.1``#XL0`!>(,$"(D@!!"M$*Q$X0`H$_T<,!/]'$@!@Y2OV84D1$%A!$`3I
+M1T``7B(``'VG`$!;:P``NB<``+TC/@$`Y$``/BQ``'X@P0(C2`$(+$0,`.%#
+M"C!`02'V04FA`RM`[_\_]"+V@4D!`#\D__\A(*(%04`'`#\@,`%`Y)P5+:`A
+M=CY("@!?)`($(D2<%4VPJ!<MH"&6/T@!="!$J!<ML`H$_T<+`)\@(O9!26$%
+M0D!!!")`000M0)`582`6`$,LIA4A($("04AA`X%(`00B1!8`(SP*,$!!H3=!
+M0?+_/_0*!/]'```])```P2(``#TD``#A(@L`'R$G]D%)!`3G0`4$C4"@%\4@
+M`@260```(BS!`B)($`!&++`792!"`D-(80,C2`$$(D00`"8\!`270```)"S!
+M`B1("@!&+*H7I2!"`D5(80,E2`$$(D0*`"8\807G0$$$)T!!!"U`4!B!(!P`
+M9"QL&$$@0P)B2&(#`DD"!$-$'`!$/,`782`0`$,LT!<A($("04AA`P%)`00B
+M1!``(SP*,$!!H5=`0=;_/_0H%"TB$`3I1P``?:<`0%MK``"Z)P``O2/?``#D
+M*!0MH"%V($@"4%\@H0<B0"``(.1\`RF@(?8A2*)5(4`'`$#TH34A0`4`(/09
+M`$#D@`,IH"%V($BA=R!`%0`@Y+@73:`BEE](:`8_(`$$042X%RVPO!=-H"*6
+M7TBP!#\@`01!1+P7+;``@'\@P!=-H"*67TAA$V!(`01!1,`7+;"T%RV@(78^
+M2&-38$@#!"-$M!=ML$`4+:#!4B!(+``@Y(0#*:`!$#Y$H14B0"@`(.00!.E'
+M`0`_)@"8,2('0%\B``!]IP!`6VL``+HG``"](]`''R(``'VG`$!;:P``NB<`
+M`+TC$`3I1TS]7].$`RF@(78^2"`7`D@`!`%$A`,)L!`$Z4<!`#\F`)@Q(@<`
+M7R(``'VG`$!;:P``NB<``+TCT`<?(@``?:<`0%MK``"Z)P``O2.$`RF@P5(@
+M2`$0/D2A%21``@`@]`T`/R",`.##$`3I1[\`/R)``%XB``!]IP!`6VL``+HG
+M``"](X,``.0L%$V@(I9?2$``/BQ``'X@P0(C2`$$(D0L%"VPN`-)H"*67T@A
+M=B!(`00B1+@#*;`0!.E'``!]IP!`6VL``+HG``"](W$``.1\`RF@(?8A2*)5
+M(4`'`$#TH34A0`4`(/0+`$#D@`,IH"%V($BA=R!`!P`@Y!`$Z4=$`#XB``!]
+MIP!`6VL``+HG``"](Q\`X,-\`RF@(?8A2*+U($"A=2%``@1!1`<`0.00!.E'
+M1``^(@``?:<`0%MK``"Z)P``O2,2`.##A`,IH`$0/D30_R$@H?<G0`<`(.00
+M!.E'1``^(@``?:<`0%MK``"Z)P``O2,&`.##$`3I1T0`/B(``'VG`$!;:P``
+MNB<``+TC``#@0T```.2P+BVD:`,IM!`$Z4<``'VG`$!;:P``NB<``+TC#`3_
+M1PH$_T<?`'\A,0%J01`$Z4=``%XB``!]IP!`6VL``+HG``"](RP``.1``%XL
+M0`!^(,$"0T@,`(%!!`1*02'V@4@!!"U`\"VA(,("0TB"%D%("`!E+/@M(2!#
+M`&%(8@%!2`($0T0(`$4\`0"$("3V@4@$!(U`\"UD($``/BQ``%X@P0(B2`@`
+M0RSX+80@0@!$2&$!)$@!!")$"``C/`HP0$&A5T!!V/\_]"'V@4FC%2!``P!?
+M)/W_0B"A!2)``P1A1`D`/R`%`&#T$`3I1]W\7],`!.E'#`#@PP@`/R!$`#ZP
+M!0"@Y1`$[4<``'VG`$!;:P``NB<``+TC`@#`Y40`/J```"ZP``3_1P``7J<(
+M`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WJ50`-XC`8#Z:P``NR<``+TC\/_>(P``
+M7K<(`#ZU"03P1P``?:<`0%MK``"Z)P``O2-X+FFG!`!@YQ`$Z4<`0%MK``"Z
+M)P``O2,0!.E'``!]IP!`6VL``+HG``"](Q`$Z4<!`#\B`0!?(@``?:<`0%MK
+M``"Z)P``O2,H%"DB$`3I1P``?:<`0%MK``"Z)P``O2,0!.E'``!]IP!`6VL`
+M`+HG``"](P``7J<(`#ZE$`#>(P&`^FL``+LG``"](Z#_WB,``%ZW"``^M1``
+M7K48`'ZU(`">M2@`OK4,!/!'```])```0:```"$@!``AH#``7K`T`#ZP```]
+M)```@:```"$@!`!!H`@`8:`,`"&@4`">L%0`7K!8`'ZP7``^L`T$_T=)%*!!
+M,``^(`D$(4$``&FA$`3L1Q$$ZT<``'VG`$!;:P``NB<``+TC$``)L`H$_T<A
+M%T))`01!10D`X4,0!.Q'$03K1Q($Z4<``'VG`$!;:P``NB<``+TC$`3L1Q$$
+MZT<``'VG`$!;:P``NB<``+TC(/8!2"'V(4F@!0%``@3_1S```.0*,$!!H?U?
+M0>C_/_0*!/]'011`03``7B`!!")`(``AH1`$[$<1!.M'$@3I1P``?:<`0%MK
+M``"Z)P``O2,0!.Q'$03K1P``?:<`0%MK``"Z)P``O2,A]B%)(/8!2*$%($`"
+M!/]'%@`@Y`HP0$&A?4!!Y_\_]$$4H$$P`%X@`00B0```(:(0`$&B$`3L1P``
+M?:<`0%MK``"Z)P``O2,-,*!!H3V@0;7_/_1D`!\B``!]IP!`6VL``+HG``"]
+M(P$`7R``!.)'``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE8`#>(P&`^FN!%B%*
+M"@`@X```4BQ"`E)(,Q,_(&$#,D@!!")$```R/```4RQ"`E-(U!<_(`X`X,,!
+M$#!&$0`@Y$`4,*0AEB=(#@`@Y```4BQ"`E)("`D_(&$#,D@!!")$```R/```
+M4RQ"`E-(K`H_(&$#,T@!!")$```S/`$`'R`!@/IK``3_1P&`^FL``+LG``"]
+M(\#_WB,``%ZW"``^M1``7K48`'ZU(`">M0H$\$<,!/!'"P3P1Y`#,"$P`#XL
+M,`!>($$"(D@P`#X\*!0PH"%V($@`4%\@H0<B0`@`(/0H`W"GR0`_(C``7B(`
+M0%MK``"Z)P``O2,!!/]';@$`Y(0#*J`!$#Y$H14H0`,`(.0\%"R@(78^2#P4
+M++`P`%XL,`!^(,$"0T@5`"#T?`,JH*'U($`2`"#D@`,JH"%V($BA%2%`#@`@
+MY$("0T@%`#\@80,C2`$$(D0P`#X\+!1,H")V7D@!`#\D`01!1"P4++`P%"R@
+M(98_2`$T($0P%"RPC`,KH*'5($`6`"#T>`,KH,%2($B;CR$@$@`@]+@#2Z"<
+M_R(@(78@2*$W($`&`"#DP1)`2`4`(2`BEE]((78@2`$$(D0&`.##N`-+H"%V
+M0$BA-2A``P`@Y"&67T@!="A$N`,KL`0`Z;,\%"R@P5(@2`<`(.0!`#\@!``I
+ML"P4+*#!4B!(`@`@]`,`/R`$`"FP0!0LH,%2($@#`"#D!``IH`&4($0$`"FP
+M1!0LH"%V($@,`"#D>`,KH,%2($CO\2$@"``@Y`0`*:`"%"%$!`!)L#`4+*`A
+M=B!(`@`@]`$41$0$`"FP$`!)H"*67T@("3\@`01!1!``*;"$`RJ@`1`^1-#_
+M(2"A]R=`$0`@]'P#*J`A]B%(HO4@0*%U(4`"!$%$"P!`]'P#*J`A]B%(HE4A
+M0`<`0/2A-2%`!0`@]`@`0.2``RJ@(78@2*%W($`$`"#D$`!)H")V7DC$"3\D
+M`P#@PQ``2:`B=EY(K`H_)`$$0400`"FPU!<_)#,3(2`,`"FP``!)H/^_/R`"
+M`$%$`0`_)`"`(2`"!$%$``!)L`,$_T<P`#XL,`!>(,$"(D@!4"!$"P`@]'P#
+M*J`B]B%(H;=`0`8`(.2AM4!`!0`@Y(`#*J`A=B!(H7<@0`$`(/0!`'\@`S!@
+M1".W84@``$F@_]\_(`(`040"!$-$`!PA(`(`040!#"$@`@1!1#``/BPP`'X@
+MP0(C2($W($@!."!$`3`@1"$W(4C__7\@`@!#1`($040``$FP?`,JH*'7($`#
+M`"#T`!`_(`$$040#`.##```IH/_O7R`!`")$```IL```*:`!="!$```IL(`#
+M*Z`A=B!(H3<@0`,`(.1\`RJ@H74A0"0`(.0$!/]',``^+#``7B#!`B)(`P`@
+M\`0`*:`!,"%$Q#0@1`0P@$1$%(!```!)H`*1040P`'XL,``^(,,"84@!`.-#
+M@7<@2`$X($0!,"!$018@0`($1$0"!$%$``!)L`($_T<#D&!$`P!@]`0`*:`!
+M,"%$PC0@1`(P0$0BET!(```IH`$1(D0!!")$`10T1```*;```"F@`1$H1```
+M*;`#!/]'\!0LH`(`(.3T%"R@`0`@]`$`?R`#,&!$(Q=A2```*:#__E\@`0`B
+M1`$$(T0!`%\D`00B1`$`0B0!!")$`@!")`$$(D0$`$(D`00B1```*;!\`RN@
+MH;4@0`0`(.2``RN@(78@2*$5(4`#`"#T?`,KH*&W($`$`"#T```IH!``7R0!
+M!")$```IL#``/BPP`%X@P0(B2/`!7R`!`$%$!0`@Y`@`2:`BEE](@98@2`$$
+M(D0#`.##"``IH"&6/T@!5"%$"``IL#``7BPP`'X@P@)#2`$`/R0`\"$@`@!!
+M1`(`XD,)`$#D@I=!2`$`/R`B!R)("``IH"%V/DAB4T!(`@1!1`@`2;`%`.##
+M"`!)H")V7DB``#\D`01!1`@`*;"$`RJ@`1`^1-#_(2"A]R=`!@`@Y```*:`@
+M`%\D`00B1"``0B0!!")$!P#@PP``*:#@_U\D__]"(`$`(D3`_U\D__]"(`$`
+M(D0``"FP,!0LH,%2($@.`"#D`!1+(B@#:J<0!.I'#P`_(@!`6VL``+HG``"]
+M(P8``.0!`#\@!!0KL```*:"``%\D`00B1```*;!\`RJ@(?8A2**7($`@%$NP
+M`P3_1Z&U($`$`"#D@`,JH"%V($BA-2%``P`@]'P#*J"AMR!``0`@]`$`?R`#
+M,&!$(Q=C2```2:``_S\D__\A(`(`040"!$-$``!)L`\`/R`4`"FP`0`_(``$
+MX4<``%ZG"``^I1``7J48`'ZE(`">I4``WB,!@/IK``"[)P``O2/@_]XC``!>
+MMQ``/B(``'VG`$!;:P``NB<``+TC`0`?(```7J<@`-XC`8#Z:P``NR<``+TC
+ML34@0@``/:0!`"#V```]I,@`,+0!@/IK``"[)P``O2/0_]XC``!>MP@`/K40
+M`%ZU&`!^M0D$\$<*!/%'!`!1H@$`/R8H@#$B``!]IP!`6VL``+HG``"](PP`
+M2J(0!.E'`0`_)BR`,2(``'VG`$!;:P``NB<``+TC$`!*HA`$Z4<!`#\F,(`Q
+M(@``?:<`0%MK``"Z)P``O2,(`$JB$`3I1P$`/R8T@#$B``!]IP!`6VL``+HG
+M``"](P``*J```7\E`0`K1!``(.00!.E'(``^(@``?:<`0%MK``"Z)P``O2/H
+M$RFD*`#AMQ`$Z4<!`#\F((`Q(A($ZT<``'VG`$!;:P``NB<``+TC``!*HA`$
+MZ4<!`#\F((`Q(@``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``7J48`'ZE,`#>
+M(P&`^FL``+LG``"](]#_WB,``%ZW%``^LHP#,*`B]B%(H35`0`4`(/0*`$#D
+MH=5`0`@`(/2A%4%`$``@Y`$`/R0A,2!`'``^L`@`/R0A,2!`"0#@PP``/:0`
+M`"&@(04A0D$6($`<`#ZP```]I```(:`A!2%"018@0"``/K`!`#$@&``^L($!
+M/R3__R$@`0!!1A``/K`0`#XBDO]?TP``7J<P`-XC`8#Z:P``NR<``+TC\/_>
+M(P``7K<(`#ZU"03P1P$`/R8H@#$B$@3_1P``?:<`0%MK``"Z)P``O2,0!.E'
+M`0`_)@2`,2(``'VG`$!;:P``NB<``+TC``#@0P0`/R0`!`%$S/\A)/__(2``
+M``%$$`3I1P$`/R8$@#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.E'`0`_)B"`
+M,2(!`%\F__]2(@``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``WB,!@/IK``"[
+M)P``O2/0_]XC``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU"P3P1PD$\4<*!/!'
+M$``QH,%2($@I`"#D`0`_)@2`,2(``'VG`$!;:P``NB<``+TC$``_)``$`40`
+M`.!#$`3K1P$`/R8$@#$B$@3@1P``?:<`0%MK``"Z)P``O2,0`$FB,G9`2A`$
+MZT<!`#\F)(`Q(@``?:<`0%MK``"Z)P``O2,0`$FBTE)`2A`$ZT<!`#\F.(`Q
+M(@``?:<`0%MK``"Z)P``O2,4`$FB4A)`0A`$ZT<!`#\F,(`Q(@X`X,,!`#\F
+M!(`Q(@``?:<`0%MK``"Z)P``O2/P_S\D__\A(````40``.!#$`3K1P$`/R8$
+M@#$B$@3@1P``?:<`0%MK``"Z)P``O2,``$FB$`3K1P$`/R8H@#$B``!]IP!`
+M6VL``+HG``"](Q`$ZT<!`#\F((`Q(@``?:<`0%MK``"Z)P``O2.`_S\D```!
+M1`@`*:`A=B!(``0!1```X$,2!.!'&`!)H"%V0$@&`"#D(79`2`0`(2`A%R)(
+M?P!?)`$`(D02!`%$$@#R0Q`$ZT<!`#\F((`Q(@``?:<`0%MK``"Z)P``O2/$
+M,4J@(K9?2!@`*:#!4B!(83$@2`($043$,4JP$@#B0Q`$ZT<!`#\F&(`Q(@``
+M?:<`0%MK``"Z)P``O2,(`$FA*G9`21P`*:`A]B%(H0<J0`$`(/0<`$FA#`")
+MH1P`*:`A]B%((O:!2:$'(D`!`"#T'`")H2'V04DB]H%)H04B0`(`(.0$`*FA
+M`0#@PP``J:$$`$FB<A=#0@@`/R7__RDA$@!)1A@*/R02!$%&$@#R0Q`$ZT<!
+M`#\FU(`Q(@``?:<`0%MK``"Z)P``O2-R%Z-!$@!)1@`*/R02!$%&$@#R0Q`$
+MZT<!`#\FV(`Q(@``?:<`0%MK``"Z)P``O2,R=D!)(1>"21($0482`/)#$`3K
+M1P$`/R;<@#$B``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`!>I1@`?J4@`)ZE
+M*`"^I3``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU"03P1P$$\4<*
+M!/)'`&`_(A($X4<``'VG`$!;:P``NB<``+TC$`3I1PA@/R(!`%\B``!]IP!`
+M6VL``+HG``"](Q`$Z4<,8#\B`P!?(@(`?R(``'VG`$!;:P``NB<``+TC`03_
+M1PP``.00!.E'!&`_(@``?:<`0%MK``"Z)P``O2,``"HL00(J2&`#"D@`!`%$
+M```*/`$`/R``!.%'``!>IP@`/J40`%ZE(`#>(P&`^FL``+LG``"](^#_WB,`
+M`%ZW"``^M1``7K4*!/!'"03Q1Q1`/R(``'VG`$!;:P``NB<``+TC"00I00,`
+M/R`A!RE(``0!1```X$,0!.I'%$`_(A($X$<``'VG`$!;:P``NB<``+TC`0`?
+M(```7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU
+M"@3P1PD$\4<40#\B``!]IP!`6VL``+HG``"](PD$*4$#`%\B,@=)2A(!$D02
+M`/)#$`3J1Q1`/R(``'VG`$!;:P``NB<``+TC`0`?(```7J<(`#ZE$`!>I2``
+MWB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU&`!^M0L$\$<*!/%'"03R
+M1QA`/R(``'VG`$!;:P``NB<``+TC$@#@0P$`/R`A!RI(`0%!1@DP($4I!RI)
+M`00I1!(`X4,0!.M'&$`_(@``?:<`0%MK``"Z)P``O2,!`!\@``!>IP@`/J40
+M`%ZE&`!^I2``WB,!@/IK``"[)P``O2/P_]XC``!>MP@`/K4)!/%'H;<@0O__
+M'R`(`"#D'$`_(@``?:<`0%MK``"Z)P``O2,`\`5$@`8)2``P`$0``%ZG"``^
+MI1``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU&`!^M0L$\$<)!/%'
+M"@3R1Q1`/R(``'VG`$!;:P``NB<``+TC$@#@0P($*4$#`#\@(0<B2`(`7R0`
+M\$(@`00B1`$!0482`.%#*9<A20D$248!`#\D`(`A(`D$(442`.E#`P!`Y0$`
+M/R02!$%&`0#@PQ(`\D,0!.M'%$`_(@``?:<`0%MK``"Z)P``O2,,+BN@``$_
+M)A$$(480!.M'``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`!>I1@`?J4@`-XC
+M`8#Z:P``NR<``+TC\/_>(P``7K<(0#\B``!]IP!`6VL``+HG``"](Z`U`$``
+M`%ZG$`#>(P&`^FL``+LG``"](\#_WB,``%ZW"``^M1``7K48`'ZU(`">M2@`
+MOK4P`-ZU.`#^M0P$\$<-!/%'#@3_1P\$\$>``#\B``!]IP!`6VL``+HG``"]
+M(X#V`D@6``#@$`3L1XP`/R(``'VG`$!;:P``NB<``+TC``#@0X$6`T@!`"#@
+M(`#.)8&V`T@"`"#@0``_)`X$P46!5@-(`@`@X(``/R0.!,%%``(_)`(``40!
+M!,%%S@1!1!`$[$?``#\B``!]IP!`6VL``+HG``"](PL`X$,B]F%)__\_(($6
+M)$BB!4%``P!`Y```[;,`!/]'9`#@PP8!/R2ZV"$@`@!A10``3;"!=F))`P`@
+MX`!`/R0!!$%$```ML`&P8$4#`"#D```MH`$T($0``"VPP`4_(`$`844A`"#D
+M```MH`$4*$0``"VP$`3L1\0`/R(``'VG`$!;:P``NB<``+TC``#@0_\#/R$"
+M``E$I$@OH`$$(D3_`U\E```*1(`6`D@!!"!$I$@OL!`$[$?(`#\B``!]IP!`
+M6VL``+HG``"](P``X$,)``E$I$@OH`$$*40```I$@!8"2`$$($2D2"^P`1!D
+M108`(.0@%"R@!``@Y```+:``0%\D`00B1```+;```"V@`00N1```+;"!UB-(
+M)``@X`@4;+$0!.Q'Q``_(@``?:<`0%MK``"Z)P``O2,,%`RP$`3L1\@`/R(`
+M`'VG`$!;:P``NB<``+TC$!0,L!`$[$?,`#\B``!]IP!`6VL``+HG``"](Q04
+M#+`0!.Q'T``_(@``?:<`0%MK``"Z)P``O2,8%`RP$`3L1]0`/R(``'VG`$!;
+M:P``NB<``+TC'!0,L`$`'R```%ZG"``^I1``7J48`'ZE(`">I2@`OJ4P`-ZE
+M.`#^I4``WB,!@/IK#"X0H`&`^FL``+LG``"](]#_WB,``%ZW"``^M1``7K48
+M`'ZU(`">M2@`OK4*!/!'"03Q1PP$\$<,+K"A`0#M0PP`(/@D`#\B$@3_1P``
+M?:<`0%MK``"Z)P``O2,0!.I')``_(@``?:<`0%MK``"Z)P``O2,2`.E#!@$_
+M)+K8(2`2`$%&"P3_1P$0*$4.`"#DO"XLH`(42$;2!")$P"XLH`(`(.0``3\@
+M$@1!1L0N+*`"%%!&T@0B1,@N+*`"`"#D``0_(!($048!]$!&D@(A1>`"/R0!
+M`"%%$@`@Y(``/R02!$%&@;8B20(`(.```3\D"P1A18'6(DD"`"#@`"`_)`L$
+M846!]B))`@`@X``$/R0+!&%%``(_)`(`(44!!&%%RP1!1('6(TD"`"#@"``_
+M)!($0480!.I'H``_(@``?:<`0%MK``"Z)P``O2,0!.I'K``_(@``?:<`0%MK
+M``"Z)P``O2,`23\D__\A(````40`!`M$``#@0Q`$ZD>L`#\B$@3@1P``?:<`
+M0%MK``"Z)P``O2,,+BRQ`0#I0P<`(/@0!.I')``_(@$`7R(``'VG`$!;:P``
+MNB<``+TC``3M1P``7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WB,!@/IKF`,0
+MH,!2`$@!@/IK``"[)P``O2/P_]XC``!>MY@#,*#!4B!(H0<Q0`T`(/0QMR!*
+M`0`Q)AR(,2(``'VG`$!;:P``NB<``+TC``#@0P$`/R0`@"$@```!1`$`/R`!
+M``#T`03_1P`$X4<``%ZG$`#>(P&`^FL``+LG``"]([#_WB,``%ZW"``^M1``
+M7K48`'ZU(`">M2@`OK4P`-ZU.`#^M0L$\$<,!/%'F`,PH,%2($BA!S%```3_
+M1W<`(/0IMR!*`0!))12(2B$1!.I'``!]IP!`6VL``+HG``"](P``X$-``!ZT
+M`0`_)`"((2!(`#ZT$00A01`$ZT<2!/]'``!]IP!`6VL``+HG``"](P$`_R4$
+MB.\A$00O01`$ZT<2!/]'``!]IP!`6VL``+HG``"](P$`WR4(B,XA$00N01`$
+MZT<2!/]'``!]IP!`6VL``+HG``"](P$`OR4,B*TA$00M01`$ZT<2!/]'``!]
+MIP!`6VL``+HG``"](P$`*280B#$B$`3K1Q($_T<``'VG`$!;:P``NB<``+TC
+M$`3K1Q$$ZD<'`%\B``!]IP!`6VL``+HG``"](P$`*288B#$B$`3K1Q($_T<`
+M`'VG`$!;:P``NB<``+TC`0`I)1R(*2$0!.M'$03I1Q($_T<``'VG`$!;:P``
+MNB<``+TC0``^I*"5($`D``#DO#$KH(%V(T@A`"#@0``L(2EV($DIMR!)2``^
+MI!$$(4$0!.M'$@3_1P``?:<`0%MK``"Z)P``O2,1!"]!$`3K1Q($_T<``'VG
+M`$!;:P``NB<``+TC$00N01`$ZT<2!/]'``!]IP!`6VL``+HG``"](PD$+4$0
+M!.M'$03I1Q($_T<``'VG`$!;:P``NB<``+TC`0`?(```7J<(`#ZE$`!>I1@`
+M?J4@`)ZE*`"^I3``WJ4X`/ZE4`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^
+MM1``7K48`'ZU"@3P1Y@#,*#!4B!(H0<Q0``$_T<Y`"#T"P3_1P($_T<A`$#F
+M!0!R+`4`,B##`&%((Q=A2`0`,BP$`%(@P0`B2`$$(T0+`.%#`P!R+`,`,B##
+M`&%((Q=C2`(`,BP"`%(@P0`B2"$7(D@#!&%$`0`R+`$`4B#!`")((1<A2`,$
+M840``#(LP0`R2`$$(T0A]B%(@C8@2`$P8$4A]R-(`01!1`(`X4.+-F!)*;<@
+M2@$`*288B#$B$`3J1Q($XD<``'VG`$!;:P``NB<``+TC`0`I)1R(*2$!`%\F
+M`(!2(A($<D40!.I'$03I1P``?:<`0%MK``"Z)P``O2,!`!\@``!>IP@`/J40
+M`%ZE&`!^I2``WB,!@/IK``"[)P``O2.`_]XC``!>MP@`/K40`%ZU&`!^M2``
+MGK4H`+ZU,`#>M3@`_K4,!/!'#03Q1PH$\D</!/-'0``>MI`#<""KJC\DJJJ!
+M(`$`@/8$!/]'"``CH,%2($BA!RU```3_1[0!(/0``"HLP@`J2*&W0$`Q`"#D
+M```])```(2!!!$%````AH`$$H4,4`.%K!0`_("<`X,,``".@@;8A2``$_T<&
+M`%\@'P`@\*(!X,,$`#\@8``^M+PQ+*"!=B-((``@X`@`(Z#!4B!(0`!-(*$-
+M(D``!/]'EP$@]!D`X,,"`"HL`@!*(,$"(DBAER!```3_1Y`!(/0"`"HL`@!*
+M(,$"(DBAMR!`8`#^MPT`(/0"`"HL`@!*(,$"(DBAMR%``0!?(()T($1@`%ZT
+M!0#@PP<`/R!@`#ZT`@#@PP`$_T=]`>##!`!J+`0`*B##`&%(!0`J+`4`2B#!
+M`")((1<A2`,$840&`"HL!@!*(,$`(D@A%R)(`P1A1`<`*BP'`$H@P0`B2"$7
+M(T@#!&%$`PAD1`,`XT-(`'ZT"`!*+`@`*B#!`$%("0!*+`D`:B#"`$-((A=!
+M2`$$040A=B!(`0@D1"%V($A0`#ZT"@!J+`H`*B##`&%("P`J+`L`2B#!`")(
+M(1<A2`,$840,`"HL#`!*(,$`(D@A%R)(`P1A1`T`*BP-`$H@P0`B2"$7(T@#
+M!&%$`PAD1`,`XT-8`'ZT#@!*+`X`*B#!`$%(#P!*+`\`:B#"`$-((A=!2`$$
+M040A=B!(`0@D1"YV($@0`&HL$``J(,,`84@1`"HL$0!*(,$`(D@A%R%(`P1A
+M1!(`*BP2`$H@P0`B2"$7(D@#!&%$$P`J+!,`2B#!`")((1<C2`,$840#"&1$
+M"P#C0P(`*BP"`$H@P0(B2*&W(4`"\']%RP0B1&``7J2AE4!`Z``@Y+PQ+*"!
+M=B-(Y0`@X$``+2`A=B!(:``^M"FWH$D!`"DF`(@Q(D@`/J02!>%'$`3L1P``
+M?:<`0%MK``"Z)P``O2,!`"DF!(@Q(E``7J02!>)'$`3L1P``?:<`0%MK``"Z
+M)P``O2,!`"DF"(@Q(A`$[$=8`%ZF``!]IP!`6VL``+HG``"](P$`*28,B#$B
+M$`3L1Q($[D<``'VG`$!;:P``NB<``+TC`0`I)A"(,2(0!.Q'$@3K1P``?:<`
+M0%MK``"Z)P``O2,!`"DE%(@I(1`$[$<1!.E'8`!>I@``?:<`0%MK``"Z)P``
+MO2,0!.Q'$03M1Q($[T?)_E_3%`!J+!0`*B##`&%(%0`J+!4`2B#!`")((1<A
+M2`,$8406`"HL%@!*(,$`(D@A%R)(`P1A1!<`*BP7`$H@P0`B2"$7(T@#!&%$
+M$@#C0Q@`:BP8`"H@PP!A2!D`*BP9`$H@P0`B2"$7(4@#!&%$&@`J+!H`2B#!
+M`")((1<B2`,$840;`"HL&P!*(,$`(D@A%R-(`P1A1`X`XT-``%ZDP#$BH`&0
+M($0/!/]'>`#^MW``_K<G`"#D'@!*+!X`*B##`$%('P`J+!\`2B#!`")((1<A
+M2`,$(T0C=F!(<`!^M!P`2BP<`"H@PP!!2!T`*BP=`$H@P0`B2"$7(4@#!"-$
+M(W9@2'@`?K0@`&HL(``J(,,`84@A`"HL(0!*(,$`(D@A%R%(`P1A1"(`*BPB
+M`$H@P0`B2"$7(D@#!&%$(P`J+",`2B#!`")((1<C2`,$840/`.-#:``^I"FW
+M($@!`%\E`(A*(1$$*D$0!.Q'``!]IP!`6VL``+HG``"](P$`?R4$B&LA$00K
+M01`$[$=P`%ZF``!]IP!`6VL``+HG``"](P$`*28(B#$B$`3L1Q($[D<``'VG
+M`$!;:P``NB<``+TC`0`I)@R(,2(0!.Q'>`!>I@``?:<`0%MK``"Z)P``O2,!
+M`"DF$(@Q(A`$[$<2!.]'``!]IP!`6VL``+HG``"](P$`*284B#$B$`3L1P<`
+M7R(``'VG`$!;:P``NB<``+TC`0`I)AB(,2(0!.Q'$@3_1P``?:<`0%MK``"Z
+M)P``O2,!`"DE'(@I(1`$[$<1!.E'$@3_1P``?:<`0%MK``"Z)P``O2,IMZ!)
+M"@0J01`$[$<1!.I'2`!>I@``?:<`0%MK``"Z)P``O2,)!"M!$`3L1Q$$Z4=0
+M`%ZF``!]IP!`6VL``+HG``"](S8`X,,IMZ!)`0`I)@"(,2(0!.Q'2`!>I@``
+M?:<`0%MK``"Z)P``O2,!`"DF!(@Q(A`$[$=0`%ZF``!]IP!`6VL``+HG``"]
+M(P$`*28(B#$B$`3L1U@`7J8``'VG`$!;:P``NB<``+TC`0`I)@R(,2(0!.Q'
+M$@3N1P``?:<`0%MK``"Z)P``O2,!`"DF$(@Q(A`$[$<2!.M'``!]IP!`6VL`
+M`+HG``"](P$`*244B"DA$`3L1Q$$Z4=@`%ZF``!]IP!`6VL``+HG``"](Q`$
+M[$<1!.U'$@3O1^G]7],!`!\@``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE,`#>
+MI3@`_J6``-XC`8#Z:P``NR<``+TC\/_>(P``7K?X+3`@$`3Q1Q$$X4<&`%\B
+M``!]IP!`6VL``+HG``"](P``7J<0`-XC`8#Z:P``NR<``+TC\/_>(P``7K?X
+M+1`B!@!?(@``?:<`0%MK``"Z)P``O2,!`!\@``!>IQ``WB,!@/IK``"[)P``
+MO2/P_]XC``!>MP0N,"`0!/%'$03A1P8`7R(``'VG`$!;:P``NB<``+TC``!>
+MIQ``WB,!@/IK``"[)P``O2/P_]XC``!>MP@`/K4)!/!'!"X0(@8`7R(``'VG
+M`$!;:P``NB<``+TC!"XIH!+P/T0B5B!($@1"1B*6($@2!$)&(18A2!($0482
+M`/)#$`3I1P$`/R;@@#$B``!]IP!`6VL``+HG``"](P@N2:(R=D!*$`3I1P$`
+M/R;D@#$B``!]IP!`6VL``+HG``"](P$`'R```%ZG"``^I1``WB,!@/IKN`,P
+MH"%V($BA!3%`#`!?(`4`(/0H%#"@P5(@2`$0,$2B`^%#0G9`0`$`0.8``%*P
+M``3_1P&`^FL#!/!'``3_1SP4,*#!4B!(!``@Y"P4,*#!4B!(0P`?(,`T($1`
+M%#"@P5(@2`*4`$3`!")$1!0PH"%V($@*`"#D>`,CH,%2($CO\2$@!@`@Y``4
+M`40P%#"@(78@2`(`(/0!%`1$``#A0P&`^FL``+LG``"](]#_WB,``%ZW"``^
+MM1``7K48`'ZU(`">M0H$\$<`%#"A*78@20N0(T6+5F!)"5`@1:D#Z4,,`.M#
+M0`-PIQ$$[$<`0%MK``"Z)P``O2,0!.I'`0`_)@"8,2(``'VG`$!;:P``NB<`
+M`+TC`"`_(``$`40``.!#$`3J1P$`/R8`F#$B$@3@1P``?:<`0%MK``"Z)P``
+MO2-(`VJG$`3J1Q$$[$<`0%MK``"Z)P``O2,@]@%(H`4)0+(5($&2!`E$$@#R
+M0U@#:J<0!.I'$03L1P!`6VL``+HG``"](P``7J<(`#ZE$`!>I1@`?J4@`)ZE
+M,`#>(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4*!/!'"03Q1Q!`/R(`
+M`'VG`$!;:P``NB<``+TC\O\_))__(2````%$"?`@10``/20``"$@200A00``
+M*:``!`%$``#@0Q`$ZD<00#\B$@3@1P``?:<`0%MK``"Z)P``O2,``%ZG"``^
+MI1``7J4@`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M0D$\$<*!/)'
+M_BT0(@8`7R(``'VG`$!;:P``NB<``+TC_"TIH-)0($C!<"!(83$@2!($048`
+M+BF@8E$@2!($0D;!,"!((1<C2!($0482`/)#$`3I1P$`/R8(@#$B``!]IP!`
+M6VL``+HG``"](P`N*:#24"!(PG`@2&(Q0$C_/S\@"@!!12H70DD2!$)&$@1*
+M1A`$Z4<!`#\F#(`Q(@``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``7J4@`-XC
+M`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`?K4)!/!'`0`_)DR`,2(`
+M`'VG`$!;:P``NB<``+TC"P#@0Q`$Z4<!`#\F4(`Q(@``?:<`0%MK``"Z)P``
+MO2,*`.!#$`3I1P$`/R9,@#$B``!]IP!`6VL``+HG``"](P``X$,A]@%((O9A
+M2:$#(D`",$!!R@0B1"$71$D@]@%(`00@1``$X4<``%ZG"``^I1``7J48`'ZE
+M(`#>(P&`^FL``+LG``"](_#_WB,``%ZW`0`_)DR`,2(``'VG`$!;:P``NB<`
+M`+TC``!>IQ``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU"03P1P$`
+M/R8@@#$B``!]IP!`6VL``+HG``"](P``X$,``3\D"@0!1!`$Z4<!`#\F((`Q
+M(A($ZD<``'VG`$!;:P``NB<``+TC$`3I1P$`/R8@@#$B$@3J1P``?:<`0%MK
+M``"Z)P``O2,``%ZG"``^I1``7J4@`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(
+M`#ZU$`!>M0D$\$?H$S"D+P`@Y```(:"!MB)(+``@X`H$_T<#!/]'```QH`\`
+M(.0!`.%#)/8A2`$$(T($`$$L!``A(,(`04B!]D!(`P`@Y`+P3T2A!T)!R@0B
+M1`,P8$`A]F%(H0>!0//_/^00!.E'`0`_)@2`,2(``'VG`$!;:P``NB<``+TC
+M``#@0P8`0.6!-D!)`?`_1*%7($```E\F$@021`,`(/0`_E\F__]2(A(`$D00
+M!.E'`0`_)@2`,2(``'VG`$!;:P``NB<``+TC``!>IP@`/J40`%ZE(`#>(P&`
+M^FL``+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"P3P1P$`/R9DF#$B``!]
+MIP!`6VL``+HG``"](R#V`4B)=@)(_P$?(`D`($6!%B%)`P`@Y`$(($4!`"$@
+M*0'A0Q`$ZT<!`#\F4(`Q(@``?:<`0%MK``"Z)P``O2,*!.!'$`3K1P$`/R9,
+M@#$B``!]IP!`6VL``+HG``"](P`(0$4`"`E$``#@0P``7J<(`#ZE$`!>I1@`
+M?J4@`-XC`8#Z:P``NR<``+TC\/_>(P``7K<(`#ZU"03P1R!`/R(``'VG`$!;
+M:P``NB<``+TC`/`?1!#P`40"!/]'?`,IH"'V(4B`E@!(H04@0`0`(.2``RF@
+M(78@2*$%,$#"-"!$``#B0P``7J<(`#ZE$`#>(P&`^FL``+LG``"](^#_WB,`
+M`%ZW"``^M1``7K4*!/!'"03Q1P$`/R:0@#$B``!]IP!`6VL``+HG``"](P``
+M*:`!!"!````IL!`$ZD<!`#\FC(`Q(@``?:<`0%MK``"Z)P``O2,$`"F@`00@
+M0`0`*;`0!.I'`0`_)I2`,2(``'VG`$!;:P``NB<``+TC#``IH`$$($`,`"FP
+M$`3J1P$`/R:(@#$B``!]IP!`6VL``+HG``"](P@`*:`!!"!`"``IL!`$ZD<!
+M`#\FF(`Q(@``?:<`0%MK``"Z)P``O2,0`"F@`00@0!``*;```%ZG"``^I1``
+M7J4@`-XC`8#Z:P$`'R`!@/IK``"[)P``O2/P_]XC``!>MP$`/R8<G#$B``!]
+MIP!`6VL``+HG``"](P#P'T0``%ZG$`#>(P&`^FL``+LG``"](_#_WB,``%ZW
+M`0`_)EB`,2(``'VG`$!;:P``NB<``+TC`/``1```7J<0`-XC`8#Z:P``NR<`
+M`+TC\/_>(P``7K<2\"!&`0`_)EB`,2(``'VG`$!;:P``NB<``+TC``!>IQ``
+MWB,!@/IKK#$0H`&`^FL``+LG``"](_#_WB,``%ZWZ!-0I@,`0/:L,3"R`0`?
+M(`0`X,,``'VG`$!;:P``NB<``+TC``!>IQ``WB,!@/IK`0`?(`&`^FL``+LG
+M``"](]#_WB,``%ZW"``^M1``7K48`'ZU(`">M0H$\$<+!/%'#`3P1RGV(4JA
+MMR!!"0`@]`$`/R;__S$B``!]IP!`6VL``+HG``"](R#V`4B@!R!!!```]/__
+M/R#P,2RP``3_1P\`X,,0!.I'$03K1P``?:<`0%MK``"Z)P``O2,0!.I'<!`_
+M(A($X$<``'VG`$!;:P``NB<``+TC\#%JL0$`'R```%ZG"``^I1``7J48`'ZE
+M(`">I3``WB,!@/IK``"[)P``O2/P_]XC``!>MP@`/K4)!/!'<!`_(@``?:<`
+M0%MK``"Z)P``O2,@=@!($`3I1Q$$X$<``'VG`$!;:P``NB<``+TC``!>IP@`
+M/J40`-XC`8#Z:P``NR<``+TCT/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU"03P
+M1PH$\4?_/S\B``!]IP!`6VL``+HG``"](R'V04D@]@%(H0<@0`0`(/3__S\@
+M]#$IL``$_T<<`.##$`3I1P$`/R84@#$B``!]IP!`6VL``+HG``"](P#`/R`+
+M``%$$`3I1Q$$ZD<``'VG`$!;:P``NB<``+TC_S\_(````40`!&!%$@#@0Q`$
+MZ4<!`#\F%(`Q(@``?:<`0%MK``"Z)P``O2/T,4FQ`0`?(```7J<(`#ZE$`!>
+MI1@`?J4@`)ZE,`#>(P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$\$<!`#\F
+M%(`Q(@``?:<`0%MK``"Z)P``O2/_/S\@```!1!`$Z4<1!.!'``!]IP!`6VL`
+M`+HG``"](P``7J<(`#ZE$`#>(P&`^FN\,1"@@!<#2``X`$0`,`!$`8#Z:P``
+MNR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`?K4*!/!'"P3P1Q4`(.8!`#\F!(`Q
+M(@``?:<`0%MK``"Z)P``O2,`_S\E__\I(0``"40``.!#$`3J1P$`/R8$@#$B
+M$@3@1P``?:<`0%MK``"Z)P``O2.\,2J@`0`I1!,`X,,!`#\F!(`Q(@``?:<`
+M0%MK``"Z)P``O2,``3\E``0)1```X$,0!.I'`0`_)@2`,2(2!.!'``!]IP!`
+M6VL``+HG``"]([PQ*J`!!"E$O#$KL`$`'R```%ZG"``^I1``7J48`'ZE(`#>
+M(P&`^FL``+LG``"](]#_WB,``%ZW"``^M1``7K48`'ZU(`">M0D$\$<*!/%'
+M_S\_(@``?:<`0%MK``"Z)P``O2,A]D%)(/8!2*$'($`$`"#T__\_(/@Q*;``
+M!/]''@#@PQ`$Z4<!`#\F%(`Q(@``?:<`0%MK``"Z)P``O2,!P#\D__\A(`L`
+M`400!.E'$03J1P``?:<`0%MK``"Z)P``O2,@%P)(_S\_)````40`!&!%$@#@
+M0Q`$Z4<!`#\F%(`Q(@``?:<`0%MK``"Z)P``O2/X,4FQ`0`?(```7J<(`#ZE
+M$`!>I1@`?J4@`)ZE,`#>(P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$\$<!
+M`#\F%(`Q(@``?:<`0%MK``"Z)P``O2,@5P1(@%8&2!`$Z4<1!.!'``!]IP!`
+M6VL``+HG``"](P``7J<(`#ZE$`#>(P&`^FL``+LG``"](]#_WB,``%ZW"``^
+MM1``7K48`'ZU(`">M0D$\$<*!/%'"P3R1Z'W+T(,`!\@%@`@Y!(`\4,`!#\B
+M``!]IP!`6VL``+HG``"]([(#ZT,0!.E'!`0_(@``?:<`0%MK``"Z)P``O2,!
+M!$E!(#%A(`@`0RPH,2$@0@!!2&$!84D!!")$"``C/``$_T<``%ZG"``^I1``
+M7J48`'ZE(`">I3``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU&`!^
+MM0H$\$<)!/%'\!,PH`'Q/T0!!"%&\!,PL$\`0.8!\#]$30`@Y.@3,*0"`$$L
+M`@`A(,("04A``3\@`0`B1,#^(2!%`"#T`0`_(@``?:<`0%MK``"Z)P``O2,`
+M`.!#Z!,JI`(`02P"`"$@P@)!2(+604@)`$#@(?8!2($V($@!`"%-804A0`0!
+M02`2`.)#`00A0*P-(2`4`.##Z!-*I`0`0B#^_R(L00\B2($7)D@(`"#X(?8!
+M2(%6($@!`"%-804A0!)0.D`!!"%`2`TA(`8`X,,!`"!-804A0&@!02`2`.)#
+M`00A0&`.(2`+`.%#"0`@36D%*4'H`RDA_S\_(`D`(440!.I'<!`_(@``?:<`
+M0%MK``"Z)P``O2,0!.I'L!`_(A($ZT<``'VG`$!;:P``NB<``+TC,A<B21($
+M2480!.I'`0`_)A2`,2(``'VG`$!;:P``NB<``+TC``!>IP@`/J40`%ZE&`!^
+MI2``WB,!@/IK``"[)P``O2/P_]XC``!>MXP#,*(``'VG`$!;:P``NB<``+TC
+M``!>IQ``WB,!@/IKL=4@0@`$_T<'`"#V2!0PH,%P($@#`"#DV#$PH*$W($#`
+M-"!$``#@0P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$\$?N_U_3JP``Y!`$
+MZ4<!`#\F<)@Q(A\`7R(``'VG`$!;:P``NB<``+TCA`-)HA(07D;0_U(BLO='
+M0K(50$)2E$)"$`3I1P$`/R;XF3$B``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F
+M'(`Q(@``?:<`0%MK``"Z)P``O2-_P#\@```!1``4$$0``.!#$`3I1P$`/R8<
+M@#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.E'`0`_)@2!,2(]`%\B``!]IP!`
+M6VL``+HG``"](Q`$Z4<00#\B``!]IP!`6VL``+HG``"](P!4`$0``.!#$`3I
+M1Q!`/R(2!.!'``!]IP!`6VL``+HG``"](WP#*:`A]B%(HO4@0*%U(4`"!$%$
+M"P!`]'P#*:`A]B%(HE4A0`<`0/2A-2%`!0`@]"\`0.2``RF@(78@2*%W($`K
+M`"#D$`3I1P$`/R9TF#$B)@!?(@``?:<`0%MK``"Z)P``O2,0!.E'`0`_)GB8
+M,2(-`%\B``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F\)DQ(@<`7R(``'VG`$!;
+M:P``NB<``+TC$`3I1P$`/R;TF3$B/P!?(@``?:<`0%MK``"Z)P``O2,0!.E'
+M$$`_(@``?:<`0%MK``"Z)P``O2,`_3\D__\A(````40``C\D*@#@PQ`$Z4<!
+M`#\F=)@Q(@H`7R(``'VG`$!;:P``NB<``+TC$`3I1P$`/R9XF#$B#`!?(@``
+M?:<`0%MK``"Z)P``O2,0!.E'`0`_)O"9,2(#`%\B``!]IP!`6VL``+HG``"]
+M(Q`$Z4<!`#\F])DQ(B``7R(``'VG`$!;:P``NB<``+TC$`3I1Q!`/R(``'VG
+M`$!;:P``NB<``+TC`/T_)/__(2````%$``,_)``$`40``.!#$`3I1Q!`/R(2
+M!.!';`#@PQ`$Z4<00#\B``!]IP!`6VL``+HG``"](P#]/R3__R$@```!1```
+MX$,0!.E'$$`_(A($X$<``'VG`$!;:P``NB<``+TC$`3I1Q!`/R(``'VG`$!;
+M:P``NB<``+TC`%$`1```X$,0!.E'$$`_(A($X$<``'VG`$!;:P``NB<``+TC
+M$`3I1P$`/R9PF#$B'P!?(@``?:<`0%MK``"Z)P``O2,0!.E'`0`_)G28,2)_
+M`%\B``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F>)@Q(@X`7R(``'VG`$!;:P``
+MNB<``+TC$`3I1P$`/R;PF3$B#`!?(@``?:<`0%MK``"Z)P``O2,0!.E'`0`_
+M)O29,2+_`%\B``!]IP!`6VL``+HG``"](X0#2:(2$%Y&T/]2(K+W1T*R%4!"
+M4M1!0A`$Z4<!`#\F^)DQ(@``?:<`0%MK``"Z)P``O2,0!.E'`0`_)AR`,2(`
+M`'VG`$!;:P``NB<``+TC?\`_(````40``.!#A`,IH`$0/D30_R$@H?<G0(`3
+M7R`2!`)$`@`@](`//R`2!`%$$@#R0Q`$Z4<!`#\F'(`Q(@``?:<`0%MK``"Z
+M)P``O2,``%ZG"``^I1``WB,!@/IK``"[)P``O2/P_]XC``!>MP@`/K4)!/!'
+MQ_Y?TW@``.00!.E'$$`_(@``?:<`0%MK``"Z)P``O2,`_3\D__\A(````40`
+M`.!#$`3I1Q!`/R(2!.!'``!]IP!`6VL``+HG``"](Q`$Z4<00#\B``!]IP!`
+M6VL``+HG``"](P!1`$0``.!#$`3I1Q!`/R(2!.!'``!]IP!`6VL``+HG``"]
+M(Q`$Z4<!`#\F!($Q(@$`7R(``'VG`$!;:P``NB<``+TC$`3I1P$`/R8<@#$B
+M``!]IP!`6VL``+HG``"](W_`/R````%$``#@0X0#*:`!$#Y$T/\A(*'W)T"`
+M$U\@$@0"1`(`(/2`#S\@$@0!1!(`\D,0!.E'`0`_)AR`,2(``'VG`$!;:P``
+MNB<``+TC$`3I1P$`/R9PF#$B'P!?(@``?:<`0%MK``"Z)P``O2,0!.E'`0`_
+M)G28,2)_`%\B``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F>)@Q(@X`7R(``'VG
+M`$!;:P``NB<``+TC$`3I1P$`/R;PF3$B#`!?(@``?:<`0%MK``"Z)P``O2,0
+M!.E'`0`_)O29,2+_`%\B``!]IP!`6VL``+HG``"](X0#2:(2$%Y&T/]2(K+W
+M1T*R%4!"4I1"0A`$Z4<!`#\F^)DQ(@``?:<`0%MK``"Z)P``O2,``%ZG"``^
+MI1``WB,!@/IK``"[)P``O2,$!/]'``!])```8R```%&@!03B1R)V0$@``",L
+MP0(C2*('04`(`$#D!@3C1P0P@$!#!(9`(G:@2```(RS!`B-(H@=!0/G_7_0`
+M`#TD```A($$$@4`$`"$@_O\!+$`/`4B`%P9(`8#Z:P``NR<``+TCX/_>(P``
+M7K<(`#ZU$`!>M0D$\D<*!/-'!`3P1Y`#<"`B]B%*H;=#0*P`(.0``#TD```A
+M($$$04```"&@`02A0Z8`X6LR]D%*H55`0@D`(/2A4T!"GP`@]*&30$((`"#T
+MH;=`0IL`(/2A]4]"F0`@]`,`X,,``".@@;8A2%P`X,,-`!\@FP#@PR'V04H`
+M!/]'F``@Y*$U($`#`"#DO#$PH(%W(TAJ`.##(?8A20,`(.2A-2!`!``@]%,`
+MX,,``".@@98A2&,`X,/`,22@`)`@1*`#X$.'`.##?`,PH"+V(4BAMT!`"``@
+MY*&U0$`$`"#D@`,PH"%V($BA]R!``@`@Y`T`'R`!`.##``3_1P``X$-X`.##
+M(?9!2@`$_T=U`"#DH34@0#@`(.0!`#\F"*(Q(@``?:<`0%MK``"Z)P``O2.`
+MMP%(`#@`1``P`$1I`.##J`,PH%X`X,,A]D%*``3_1V0`(.2A-2!`6@`@Y,PQ
+M,*`*`.##(?9!2@,`(.2A-2!`!``@]`<`X,,\%#"@P5(@2`(`X,-`%#"D(98G
+M2*`5($!4`.##`0`?(%(`X,,A]D%*``3_1T\`(.2A-2!`$@`@Y+PQ,*`!!>%'
+M(?8A2(#V(TA(`.##(?9!2@,`(.2A-2!`!@`@]`@`X,,``".@@98B2``$_T?`
+MLB%$/@#@P\`Q,*"!=R!($@#@PPP`'R`Y`.##T#$PH`(`X,/0,3"@@18A2`'P
+M)T0J`.##(O9!2J$U0$`&`"#T``3_1RX`0.2AUT!`#``?("L`(.0$`.##$#(P
+MH`$X($0`,"!$)@#@PP``?:<`0%MK``"Z)P``O2,"!.!'`0`?(!\`0.0R]B%)
+MH==`0A0`(.0``#TD```A($$$04(``"&@`02A0PX`X6L(`"*@`P#@PPP`(J`%
+M`.###``BH,$P($@&`.##"``BH,%P($@!\#]$`@#@PP@`(J#!4"!(```JL``$
+M_T<&`.##$@3I1Q,$ZD<``'VG`$!;:P``NB<``+TC``!>IP@`/J40`%ZE(`#>
+M(P&`^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4*!/!'"03S1P0$\$>0`W`@
+M(O8A2J&W0T!Z`"#D```])```(2!!!$%````AH`$$H4-T`.%K`P!@YKPQ,*``
+M"%\D-@#@P[PQ4*``^#\D__\A(`(`042\,5"P:`#@PP``(Z"!EB%(``3_1VP`
+M(.`#`&#FP#$PH`&1($0"`.##P#$PH`&4($3`,22PP#%$HA`$ZD<!`#\F(($Q
+M(@``?:<`0%MK``"Z)P``O2-4`.##`0`_)@BB,2(``'VG`$!;:P``NB<``+TC
+M$@#@0P,`(.4`(#\@$@1!1@(`X,/_WS\@$@!!1A`$ZD<!`#\F"*(Q(NK__\.H
+M`VJR$@#S0P$`/R9(@#$BY?__PZ$#\T/,,3"P.P#@PP0`8.:\,3"@`(!?)`$$
+M(D0#`.##O#%0H`"`/R0!`4%$O#$DL#$`X,/L,3"@(1<F2($7)D@)`&%"H?<G
+M08GT)T2A52-"!0`@Y-`Q,*`!!"%%`?`G1-`Q,+`'`.##T#%0H``_/R`"`$%$
+M`0`A18$6(4@"!$%$T#%0L-`Q1*(0!.I'`0`_)NB`,2*____#,O9!2J'70$(`
+M!/]''``@Y```/20``"$@001!0@``(:(2`/-#``!]IP!`6VL``+HG``"](Q(`
+MX,,``".@@98B2`D`(.`#`&#FP#$PH`$4(40"`.##P#$PH`$1(43`,22P`0`?
+M(`8`X,,0!.I'$P3I1P``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``7J4@`-XC
+M`8#Z:P``NR<``+TC\/_>(P``7K<``'VG`$!;:P``NB<``+TCH`/@0P``7J<0
+M`-XC`8#Z:P``NR<``+TCT/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU"03P1SP`
+M(.8$0#\B``!]IP!`6VL``+HG``"](_W_/R3__R$@```!1```X$,0!.E'!$`_
+M(A($X$<``'VG`$!;:P``NB<``+TC"@`?(@``?:<`0%MK``"Z)P``O2,H`%\A
+M`0"?)?W_?R4K,6!!$`3I1Q!`/R(``'VG`$!;:P``NB<``+TC``#@0P``#$07
+M``#D,@`?(@``?:<`0%MK``"Z)P``O2,0!.E'!$`_(@``?:<`0%MK``"Z)P``
+MO2,```M$``#@0Q`$Z4<$0#\B$@3@1P``?:<`0%MK``"Z)P``O2,J,4!!X?]?
+M]0$`X,,"`$#U``3_1Q0`X,,0!.E'`0`_)@2`,2(``'VG`$!;:P``NB<``+TC
+M_/\_)/__(2````%$``#@0Q`$Z4<!`#\F!(`Q(A($X$<``'VG`$!;:P``NB<`
+M`+TC`0`?(```7J<(`#ZE$`!>I1@`?J4@`)ZE,`#>(P&`^FL``+LG``"](^#_
+MWB,``%ZW"``^M1``7K4*!/!'"03Q1P$`/R8$@#$B``!]IP!`6VL``+HG``"]
+M(P0`/R0`!`%$``#@0Q`$ZD<!`#\F!(`Q(A($X$<``'VG`$!;:P``NB<``+TC
+M$P`@Y1`$ZD<$0#\B``!]IP!`6VL``+HG``"](_W_/R3__R$@```!1`$`/R0`
+M!`%$``#@0Q`$ZD<$0#\B$@3@1P``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``
+M7J4@`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M0H$\$<)!/%'`0`_
+M)@2`,2(``'VG`$!;:P``NB<``+TC!``_)``$`40``.!#$`3J1P$`/R8$@#$B
+M$@3@1P``?:<`0%MK``"Z)P``O2,3`"#E$`3J1P1`/R(``'VG`$!;:P``NB<`
+M`+TC_?\_)/__(2````%$`@`_)``$`40``.!#$`3J1P1`/R(2!.!'``!]IP!`
+M6VL``+HG``"](P``7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/@_]XC``!>
+MMP@`/K40`%ZU&`!^M0D$\4<1!/)'"@3P1P$`?R$B]B%)H35`0`<`(/0#`$#D
+MH55`0`8`(/0'`.##*O]?TPL`X$,&`.##B/]?TP0`X,.X_U_3`@#@PP`$_T<"
+M`.##J#$JL0``ZT,``%ZG"``^I1``7J48`'ZE(`#>(P&`^FL``+LG``"](_#_
+MWB,``%ZW!$`_(@``?:<`0%MK``"Z)P``O2.`%@)(`'``1```7J<0`-XC`8#Z
+M:P``NR<``+TC\/_>(P``7K<(`#ZU,?8A2J$5(4(W`"#TH1<A0@H`(.2A52!"
+M-@`@]*%7($(#`"#DH34@0A<`(/0W`.##H94@0BD`(/0T`.##`/]1(```/20`
+M`"$A,@!`Y``!/R"A!R%"`P`@Y*$5)$(H`"#T*@#@PP#^42```#TD```A(2@`
+M0.0`_%$@```])```(2$D`$#D(0#@PP``/20``"$AZ!-0I!\`0.0"`"(L`@!"
+M(,$"(DB!UB%(`P`@X```/20``"$A%P#@P^@34*0$`$(@_O\B+$$/(DB!%R9(
+M$0`@^```/20``"$A#@#@PP``/20``"$A"P#@PP``/20``"$A"`#@PP``/20`
+M`"$A!0#@PP``/20``"$A`@#@PP`$_T<&`.##$03I1P``?:<`0%MK``"Z)P``
+MO2,`!.E'``!>IP@`/J40`-XC`8#Z:P``NR<``+TC\/_>(P``7K<,`#\B``!]
+MIP!`6VL``+HG``"](P``7J<0`-XC`8#Z:P``NR<``+TC\/_>(P``7K<2!/%'
+M#``_(@``?:<`0%MK``"Z)P``O2,``%ZG$`#>(P&`^FL``+LG``"](_#_WB,`
+M`%ZW"``_(@0`7R(``'VG`$!;:P``NB<``+TC``!>IQ``WB,!@/IK``"[)P``
+MO2/P_]XC``!>MP@`/K4)!/!'"``_(B``7R(``'VG`$!;:P``NB<``+TC$`3I
+M1P@`/R($`%\B$P3_1P``?:<`0%MK``"Z)P``O2.@`^!#``!>IP@`/J40`-XC
+M`8#Z:P``NR<``+TC\/_>(P``7K<(`#ZU"03P1P$`/R9(@#$B``!]IP!`6VL`
+M`+HG``"](P`1!$0``.!#$`3I1P$`/R9(@#$B$@3@1P``?:<`0%MK``"Z)P``
+MO2,0!.E'``!]IP!`6VL``+HG``"](Q`$Z4<!`#\B``!]IP!`6VL``+HG``"]
+M(P``7J<(`#ZE$`#>(P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$\$<!`#\F
+M2(`Q(@``?:<`0%MK``"Z)P``O2,`%`1$``#@0Q`$Z4<!`#\F2(`Q(A($X$<`
+M`'VG`$!;:P``NB<``+TC$`3I1P``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``
+MWB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU"03P1P$$\4<*!/)'`0`_
+M)D"`,2(2!.%'``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F1(`Q(A($ZD<``'VG
+M`$!;:P``NB<``+TC``!>IP@`/J40`%ZE(`#>(P&`^FL``+LG``"](^#_WB,`
+M`%ZW"``^M1``7K4*!/!'"03Q1Z'W)T(`!/]')0`@Y*'W(T(0`"#T`0`_)D2`
+M,2(``'VG`$!;:P``NB<``+TC``#@0^#_*2`!`%\B,@=!2A(!$D02`/)#$`3J
+M1P$`/R9$@#$B#@#@PP$`/R9`@#$B``!]IP!`6VL``+HG``"](P``X$,!`%\B
+M,@=)2A(!$D02`/)#$`3J1P$`/R9`@#$B``!]IP!`6VL``+HG``"](P$`'R``
+M`%ZG"``^I1``7J4@`-XC`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M0H$
+M\$<)!/%'H?<G0@`$_T<D`"#DH?<C0@\`(/0!`#\F1(`Q(@``?:<`0%MK``"Z
+M)P``O2/@_TD@`0`_("$'(D@`!`%$``#@0Q`$ZD<!`#\F1(`Q(@T`X,,!`#\F
+M0(`Q(@``?:<`0%MK``"Z)P``O2,!`#\@(0<I2``$`40``.!#$`3J1P$`/R9`
+M@#$B$@3@1P``?:<`0%MK``"Z)P``O2,!`!\@``!>IP@`/J40`%ZE(`#>(P&`
+M^FL``+LG``"](^#_WB,``%ZW"``^M1``7K4)!/!'`0`_)CR`,2(``'VG`$!;
+M:P``NB<``+TC"@#@0Q`$Z4<!`#\F#($Q(@``?:<`0%MK``"Z)P``O2,``.!#
+M`1`$1`(`(.0``C\@"@1!10("/R0!``%$`@`@Y``!/R`*!$%%``3J1P``7J<(
+M`#ZE$`!>I2``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU&`!^M0L$
+M\$<)!/%'$O`_1@$`/R8\@#$B``!]IP!`6VL``+HG``"](X&6($D*$"1$B18A
+M20(`(.$"`C\D"@1!11`$ZT<!`#\F#($Q(A($ZD<``'VG`$!;:P``NB<``+TC
+M"`!`Y1`$ZT<T`#\B``!]IP!`6VL``+HG``"](P`4`D0'`.##$`3K1S0`/R(`
+M`'VG`$!;:P``NB<``+TC`!$"1```X$,0!.M'-``_(A($X$<``'VG`$!;:P``
+MNB<``+TC``!>IP@`/J40`%ZE&`!^I2``WB,!@/IK"P!Q+`@`D2P(`#$@`@3_
+M1^(,04A##&%(1`2!2`,$8D0+`'$\"`"1//\//R`2`$%&#P`Q+`P`T2P,`+$@
+MX@Q%2G(%14I!#"5(1@3%2`$$(D0&!-)$#P`Q/`P`T3P3$&1&#@!@Y@\`<2S!
+M!,5(0@UE2`$$(D0`(%\@`00B1.0,)4AA!25(0PQE2$($Q4@#!&1$`@1!1`\`
+M<3P,`%$\!03_1Q<`42P4`'$L%``Q(.0,H4A"#$%(0P1A2`($1$07`%$\%`!Q
+M/!,`42P0`'$L$``Q(.4,H4A"#$%(0P1A2`($1403`%$\$`!Q/`$`'R`!@/IK
+M``"[)P``O2/0_]XC``!>MP@`/K40`%ZU&`!^M2``GK4,!/!'"P3R1PH$]4<)
+M!/%'%`!1+!<`,2P4`'$@P@1#2$$-(T@"!$%$#P!_(-\`0.`4`#,L%P!3+!0`
+M<R#!!"-(0@U#2`$$(D0*`"#P#``_(@``?:<`0%MK``"Z)P``O2,@]@%((?9A
+M2:`%`4`/`'\@S@``]!``22P3`"DL$`")(,($1$A!#21(`01!1/\/7R`!`$%$
+M``!*+$("2DAA`RI(`00B1```*CP4`"DL%P!)+!0`:2#!!"-(0@U#2`$$(D0A
+M-R1(@38F2`(`2BP"`&H@0@)#2&$#(T@!!")$`@`J/`0`*BP$`$H@00`B2`0`
+M*CP0`$DL$P`I+,($1$A!#21(`@1!1(*60D@&`"HL!@"*($$`)$AC`41(`P1A
+M1`8`:CP'`$H@__\B+$$/(DB!%R=(@``A(`(`(/1!`&1(!@`J/!0`22P7`"DL
+M%`!I(,($0TA!#2-(`@1!1($604@+`"#@`0`_)`#^(2`!`$%$@38A2`<`2BP'
+M`&H@0@!#2&$!(T@!!")$!P`J/`<`X,,'`"HL!P!J($$`(TC__U\@8@%#2`($
+M040'`$H\$`!)+!,`*2P0`(D@P@1$2$$-)$@"!$%$$``_)`"`(2`"`$%$@?9!
+M2`@`2BP(`&H@0@!#2&$!(T@!!")$"``J/!``*2P3`$DLP00D2$(-1$@!!")$
+M`/!?)`$`(D0A]B%(@98C2`D`2BP)`&H@0@!#2&$!(T@!!")$"0`J/!``*2P3
+M`$DLP00D2$(-1$@!!")$@98A2`$P($0*`$HL"@!J($(`0TAA`2-(`00B1`H`
+M*CP4`$DL%P`I+!0`:2#"!$-(00TC2`($040!4$!$3``@]`&00$0%`"#D!`!J
+M+`0`2B#!`&)(`30@1$$`X,,4`"DL%P!)+!0`B2#!!"1(0@U$2`$$(D0!$")$
+M(``@Y`0`:BP$`$H@P0!B2`%4($1#`&)(80$B2`$$(T0$`"H\%`!)+!<`*2S"
+M!$1(00TD2`($043",$!(!0!J+`4`*B!#`&%(80=!2`$$(T0%`"H\%#(LH**U
+M0$"A%2!``@$B1"0`0.00!.Q'$03J1P``?:<`0%MK``"Z)P``O2,=`.##%``I
+M+!<`22P4`&D@P00C2$(-0T@!!")$`1`A1`4`(.0$`&HL!`!*(,$`8D@!%"%$
+M#`#@PQ0`*2P7`$DL%`!I(,$$(TA"#4-(`00B1`$0)$0(`"#D!`!J+`0`2B#!
+M`&)(`10B1$,`8DAA`2)(`00C1`0`*CP#!/]'``3C1P``7J<(`#ZE$`!>I1@`
+M?J4@`)ZE,`#>(P&`^FL``+LG``"](T#_WB,``%ZW"``^M1``7K48`'ZU(`">
+MM2@`OK4P`-ZU.`#^M0L$\$=0`#ZV"@3R1U@`?K9@`)ZV>``>M@\$_T<"`#(L
+M`@!2(,("(DB!%D%(`@`@X`$04$0%`.##`@`R+`(`4B#!`B)(`1@P1`$0,$2A
+M`^%#X0`@]`(`*BP"`$H@P@(B2`$01$0"`"#D`1!(1`4`X,,"`"HL`@!*(,$"
+M(D@!&"A$`1`H1*$#X4/3`"#T$`3K1Q$$_T<!`%\B``!]IP!`6VL``+HG``"]
+M(P$$_T>:!0#D$`3K1Q$$ZD<``'VG`$!;:P``NB<``+TC@``>M`P`7R",!0#D
+M4``^I"+V(4BAU4!`!@`@]*'70$`"`"#DH3=`0`$`X,.A%4%`MP`@Y(@`_K=8
+M`%ZD%`!`Y!`$ZT=`$3\B``!]IP!`6VL``+HG``"](P``X$.(`!ZT$`3K1X``
+M/J8``'VG`$!;:P``NB<``+TC$`3K1Q$$_T<``'VG`$!;:P``NB<``+TC?`,K
+MH"'V(4BB]2!`H74A0`($040+`$#T?`,KH"'V(4BB52%`!P!`]*$U(4`%`"#T
+M(0!`Y(`#*Z`A=B!(H7<@0!T`(.18`'ZD&P!@Y.@3:Z09`&#D``!*+,("2D@`
+M`",LP0(C2*(%04`3`$#T`@`J+`(`2B#!`B)(\`&?(`(`0RP"`&,@P@)#2`$`
+M@40$`()$H04D0`@`(.00!.M'$03J1P``?:<`0%MK``"Z)P``O2,!`#\@0@4`
+M]!`$ZT<!`#\F6(`Q(@``?:<`0%MK``"Z)P``O2,``.!#!`3@1X0T`$20`)ZT
+M$`3K1P$`/R8$@#$B``!]IP!`6VL``+HG``"](R`"/R0```%$H``>M!`$ZT<0
+M0#\B``!]IP!`6VL``+HG``"](P``X$/^`#\D8``A(`(``428`%ZT$`3K1Q1`
+M/R(``'VG`$!;:P``NB<``+TC``#@0V@`'K00!.M'&$`_(@``?:<`0%MK``"Z
+M)P``O2,``.!#<``>M!`$ZT=0`#ZF``!]IP!`6VL``+HG``"](Q`$ZT<``'VG
+M`$!;:P``NB<``+TC$`3K1Q$$ZD<``'VG`$!;:P``NB<``+TC`P!?(/H$`.0"
+M`"HL`@!*(,$"(DCP`5\@`@!!1,#^(B`5`"#D"@`@_*$56$`;`"#TH1U80`,`
+M(.2A%51`%0`@]"``X,.A%5I`&0`@]!T`X,-`]R(@$0`@Y`(`(/RP_B(@`P#@
+MP\#V(B`#`"#DL/8B(`0`(.03`.##`0!_(*@`?K0.`.##`@"?(*@`GK0!`#\@
+M!0#@PP,`7R`&`.##!`"?(*@`GK0"`#\@L``^M`<`X,,%`%\@J`!>M`(`?R"P
+M`'ZT`@#@PPP`7R#)!.##$`3K1P$`/R8`F#$B!P!?(@``?:<`0%MK``"Z)P``
+MO2,)!/]'```])```H2&H`)ZD+/:!2&$%*4%"!BU````BH@$$(4`!!"Q`000M
+M0```0:(0!.M'``!]IP!`6VL``+HG``"](P$`+R`/`.%#`?`G1`4`(/0!`!\B
+M``!]IP!`6VL``+HG``"](PDP($&A%R-!Z/\_]`D$_T=8`#ZD+?8A2/__WR7@
+M?\XA__^?)2Q_C"$``%TD``!"($$&(D$``"&B"@"@Y0$$+D(A]B%(&`!_(*$#
+M84`#!"Q"(_9A2`@`7R"B`T-``0`B1!(`(.0``)TD``"$($$&)$$$`$&B$`3K
+M1P``?:<`0%MK``"Z)P``O2,!`"\@#P#A0P'P)T0%`"#T`0`?(@``?:<`0%MK
+M``"Z)P``O2,),"!!H7<X0=S_/_1X`#ZD@"YAIQ`$ZT>H`#ZFL`!>IA,$[T<`
+M0%MK``"Z)P``O2,"`"HL`@!*(,$"(DB!UB%(!0`@\`0`2B#^_R(L00\B2($7
+M)D@&`"#X$`3K1Q$$ZD<``'VG`$!;:P``NB<``+TC@`,KH,%2($BA-RA`?``@
+M]!`$ZT<!`#\F+)@Q(@,`7R8"H%(B``!]IP!`6VL``+HG``"](P``*BS!`BI(
+M3/8A(!4`(/1X`%ZD2!1BH,-08$A4%"*@(78@2",!84!!!&-`008C0$$$(4!A
+M!2-`000C0"+7(4@B!4%`0@1#0&('0T""-T1(@_=C2"(%0T`B%T9(@Q=&2`X`
+MX,-X`'ZD2!0CH,%0($A"!"%`0@9!0$($0D!B!4%`0@1!0"/704@C!6)`0P1A
+M0&,'84`C]V%(@Q=F2`(`*BP"`$H@P0(B2`$0.D2A%3A`$`3K1P$`/R9,F3$B
+M$@3_1P\`(.1X`)ZD2!1$HM)00$HR!?)#,M=`2L`//R`2`$%&(07C0R%7(DC\
+M`%\D`0`B1!($0480!.M'`0`_)DR9,2(``'VG`$!;:P``NB<``+TC$`3K1P$`
+M/R8HHC$B``!]IP!`6VL``+HG``"](__]/R````%$``#@0Q`$ZT<!`#\F**(Q
+M(A($X$<``'VG`$!;:P``NB<``+TC$`3K1P$`/R8HHC$B``!]IP!`6VL``+HG
+M``"](_[_/R3_`R$@```!1``(/R``!`%$``#@0Q`$ZT<!`#\F**(Q(A($X$<`
+M`'VG`$!;:P``NB<``+TC$`3K1P$`/R9@@#$B#P!?(@``?:<`0%MK``"Z)P``
+MO2.``RN@P5(@2*%7*$`(`"#T$`3K1P$`/R94HC$B$@3_1P``?:<`0%MK``"Z
+M)P``O2,0!.M'`0`_)GB8,2(.`%\B``!]IP!`6VL``+HG``"](WP#*Z`A]B%(
+MHE4A0`<`0/2A-2%`!0`@]!X`0.2``RN@(78@2*%W($`:`"#D``!*+,("2DB>
+M"3\@H05!0*,)?R"B!4-``00B1`DX($00!.M'`0`_)DRB,2(``'VG`$!;:P``
+MNB<``+TC(/8!2*`%"4`(``#T$`3K1P$`/R9,HC$B$@3I1P``?:<`0%MK``"Z
+M)P``O2,0!.M'@``^ID``7B(``'VG`$!;:P``NB<``+TC`P!?()X#`.10`%ZD
+MH=5`0`<`(/2T`RN@!0`@Y!`$ZT<``'VG`$!;:P``NB<``+TCJ`!>IG@`?J28
+M+F.G$`3K1X``/J9``'XB`$!;:P``NB<``+TC`P!?((D#`.0"`"HL`@!*(,$"
+M(D@!$"A$(P`@Y'P#*Z`A]B%(HE4A0`T`0/2A-2%`"P`@]`0`0.2``RN@(78@
+M2*%W($`&`"#T>`">I"@4)*`A=B!(`E!?(*$'(D`,`"#T`@`J+`(`2B#!`B)(
+M`1`T1*$5-$`&`"#T$`3K1X``/J8``'VG`$!;:P``NB<``+TC$`3K1Q$$ZD<`
+M`'VG`$!;:P``NB<``+TC$`3K1X``/J8``'VG`$!;:P``NB<``+TC`P!?(%D#
+M`.18`#ZD!P`@Y!`$ZT=`$3\BB`!>I@``?:<`0%MK``"Z)P``O2-X`%ZD^"TB
+MH!+P/T0B5B!($@1"1B*6($@2!$)&(18A2!($0482`/)#$`3K1P$`/R8`@#$B
+M``!]IP!`6VL``+HG``"](W@`?J3\+2.@$O`_1"%6($@2!#)$,G9`2J``GJ02
+M!$1&O#$CH!($04:``#\D$@1!1A(`\D,0!.M'`0`_)@2`,2(``'VG`$!;:P``
+MNB<``+TC4``^I!$`X4,0!.M'``!]IP!`6VL``+HG``"](W@`7J0$+B*@$O`_
+M1")6($@2!$)&(I8@2!($0D8A%B%($@1!1A(`\D,0!.M'`0`_)N"`,2(``'VG
+M`$!;:P``NB<``+TC>`!^I`@N0Z(R=D!*$`3K1P$`/R;D@#$B``!]IP!`6VL`
+M`+HG``"](Q`$ZT<00#\B``!]IP!`6VL``+HG``"](Y@`GJ0`!`1$``#@0Q`$
+MZT<00#\B$@3@1P``?:<`0%MK``"Z)P``O2,0!.M'%$`_(F@`7J8``'VG`$!;
+M:P``NB<``+TC$`3K1QA`/R)P`%ZF``!]IP!`6VL``+HG``"](Q`$ZT<!`#\F
+M6(`Q(I``7J8``'VG`$!;:P``NB<``+TC>`!>I/PM(J#24"!(P7`@2&$Q($@2
+M!$%&`"XBH&)1($@2!$)&P3`@2"$7(T@2!$%&$@#R0Q`$ZT<!`#\F"(`Q(@``
+M?:<`0%MK``"Z)P``O2-X`'ZD`"XCH-)0($C!<"!(83$@2!($0480!.M'`0`_
+M)@R`,2(``'VG`$!;:P``NB<``+TC>`">I,0Q1*(0!.M'`0`_)AB`,2(``'VG
+M`$!;:P``NB<``+TC$`3K1X``/R+__U\B``!]IP!`6VL``+HG``"](Q`$ZT>`
+M`#ZF``!]IP!`6VL``+HG``"](P,`7R"J`@#D\!,KHA'P/T80!.M'`0!?(@``
+M?:<`0%MK``"Z)P``O2,0!.M'$03J1P``?:<`0%MK``"Z)P``O2.$`RN@`1`^
+M1-#_(2"A]R=`)0`@Y.@3:Z0"`",L`@!#(,$"(DB!UB%(!0`@\`0`0R#^_R(L
+M00\B2($7)D@:`"#XZ!,KI`(`(2T"`"$@R0(A20!`/R`)`"%%J14@00P`*2$0
+M!.M'`0`_)B28,2(``'VG`$!;:P``NB<``+TC`/$!1`D$($4)`.E#$`3K1P$`
+M/R8DF#$B$@3I1P``?:<`0%MK``"Z)P``O2,0!.M'`0`_)A29,2(``'VG`$!;
+M:P``NB<``+TC_S\_(`D``40"`"HL`@!*(,$"(D@!$"1$#``@Y$$4($%B!2%`
+M8@="0&(%04!B!4%`0@9"0"/W04@C!6)`0P9A0&,%84")EF1("P#@PR'V(4E"
+M!"%`0@9!0$($0D!B!4%`0@1!0&(%04`C%T)(`@1#0$($04")=D1($`3K1P$`
+M/R8<F#$B`0!?(@``?:<`0%MK``"Z)P``O2/H$RND`@!!+`(`(2#"`D%(@M9!
+M2!`$*4$0D`Q""0!`\.@32Z0$`$(@_O\B+$$/(DB!%R9(4)0L01``\$,!`"#H
+M$)`L00``?:<`0%MK``"Z)P``O2,0!.M'`0`_)@B8,2(``'VG`$!;:P``NB<`
+M`+TC#0#@0Q`$ZT<!`#\F")@Q(@`X7R(``'VG`$!;:P``NB<``+TC"03_1P$`
+MGR4DG(PA!0#@P\@`'R(``'VG`$!;:P``NB<``+TC`03I1PDP($&A?2)`"``@
+MY!`$ZT<1!.Q'``!]IP!`6VL``+HG``"](P`0`D3O_Q_T$`3K1P$`/R8(F#$B
+M$@3M1P``?:<`0%MK``"Z)P``O2,0!.M'`0`_)F"8,2(``'VG`$!;:P``NB<`
+M`+TC`'0`1```X$,0!.M'`0`_)F"8,2(2!.!'``!]IP!`6VL``+HG``"](P(`
+M*BP"`$H@P0(B2`$0-$2A%31`+P`@]'@`7J2P,2*@H54@0"L`(/00!.M'`0`_
+M)B"9,2(``'VG`$!;:P``NB<``+TC__\_)/\/(2````%$`0`_)`#P(2``!`%$
+M``#@0Q`$ZT<!`#\F()DQ(A($X$<``'VG`$!;:P``NB<``+TC$`3K1P$`/R8@
+MF3$B``!]IP!`6VL``+HG``"](P$`/R8`!!%$``#@0Q`$ZT<@F3$B$@3@1P``
+M?:<`0%MK``"Z)P``O2,!`#\@>`!^I+`Q([`"`.##>`">I+`QY+,0!.M'``!]
+MIP!`6VL``+HG``"](PD$_T<!`)\A410@00`0,2(1`/%#,@>)21(`\D,0!.M'
+M``!]IP!`6VL``+HG``"](PDP($&A/2%!\_\_]'@`/J2D2.&S"03_1Y@#*Z`A
+M=B!("P`@Y!$`Z4,0!.M'``!]IP!`6VL``+HG``"](PDP($&8`RN@(78@2*$-
+M*4#U_S_D"`!?)&4)0B!X`'ZD#"Y#L%``GJ2AU8!``P`@Y``0/R`!!$%$#"XC
+ML'@`/J0,+D&B$`3K1Z``/R(``'VG`$!;:P``NB<``+TC$`3K1ZP`/R(``'VG
+M`$!;:P``NB<``+TC!P`_)``$`40``.!#$`3K1ZP`/R(2!.!'``!]IP!`6VL`
+M`+HG``"](P04*Z`%`"#D$`3K1P``?:<`0%MK``"Z)P``O2,0!.M'`0`_)F"8
+M,2(!`%\B$P3_1P``?:<`0%MK``"Z)P``O2,0!.M'4``^I@``?:<`0%MK``"Z
+M)P``O2,0!.M'`0`_)B"`,2(``'VG`$!;:P``NB<``+TC@/X_)/__(2````%$
+M``#@0Q`$ZT<!`#\F((`Q(A($X$<``'VG`$!;:P``NB<``+TC?`,KH"+V(4BA
+MMT!`!@`@Y*&U0$`5`"#D@`,KH"%V($BA]R!`$0`@]!`$ZT<!`#\F&($Q(@$`
+M7R:J`%(B``!]IP!`6VL``+HG``"](Q`$ZT<!`#\F'($Q(A`R7R(``'VG`$!;
+M:P``NB<``+TC$`3K1P$`/R8(@3$B4@!?(@``?:<`0%MK``"Z)P``O2,"`"HL
+M`@!*(,$"(DB!%B%(!0`@X'@`7J1$%"*@(1<E2($7)T@#`.##>`!^I$04(Z"!
+M%R-($@#A0Q`$ZT<1!.I'``!]IP!`6VL``+HG``"](R`7!TB&%P=(>`">I-`Q
+M1*(2\$=&[#&$H"(7ADB"%T9((@5"0H``/J0$`&&@(1=E2($7)T@A]B%((O9!
+M2*$#(D`%`"#D(A=E2((71T@A%X9(@1<F2!(`04"``%ZD!`!BH"$79DB!%R=(
+M`00A0"$%)D`B]D%*(?8A2*('04`)`$#T(A=F2((71T@"!$)`(@5&0'@`?J3L
+M,2.@(1<F2($7)D@2`$%`>`">I-`Q)*"!%B%(`_`G1.PQI*`B%Z9(@A=&2"(%
+M8D"``#ZD!`"!H"$7A4B!%R=((?8A2"+V04BA`R)`!0`@Y"(7A4B"%T=((1>F
+M2($7)D@#`$%`@`!>I`0`@J`A%X9(@1<G2`$$(4`A!29`(O9A2"'V(4BB!T%`
+M"0!`]"(7ADB"%T=(`@1"0"(%1D!X`'ZD[#$CH"$7)DB!%R9(`P!!0'@`GJ30
+M,22@@18B2`#P)T3L,:2@(A>F2((71D@B!0)`@``^I`0`@:`A%X5(@1<G2"'V
+M(4@B]D%(H0,B0`4`(.0B%X5(@A='2"$7IDB!%R9(``!!0(``7J0$`(*@(1>&
+M2($7)T@!!"%`(04F0"+V`4@A]B%(H@=!0`D`0/0B%X9(@A='2`($0D`B!49`
+M>`">I.PQ)*`A%R9(@1<F2```04"A]T="DO0G1*'W9T"#]"=$H?<'0(#T)T02
+M\$=&(1=A2``_7R`!`")$$@1!1B$7`D@_`%\D`0`B1!($0480!.M'`0`_)NB`
+M,2(``'VG`$!;:P``NB<``+TC>`!>I,`Q(J`(`"#D$@#A0Q`$ZT<!`#\F(($Q
+M(@``?:<`0%MK``"Z)P``O2-X`'ZD\#%#H"+V04C__S\@@18D2*(%04`&`$#T
+M\#$CHA`$ZT<``'VG`$!;:P``NB<``+TC>`">I/0Q1*`B]D%(__\_(($6)$BB
+M!4%`!@!`]/0Q)*(0!.M'``!]IP!`6VL``+HG``"](W@`/J3X,4&@(O9!2/__
+M/R"!%B1(H@5!0`<`0/1X`%ZD^#$BHA`$ZT<``'VG`$!;:P``NB<``+TCJ`,K
+MH`@`(.02`.%#$`3K1P$`/R9(@#$B``!]IP!`6VL``+HG``"](U``?J2,`VNP
+M6`">I$(`@.2``#ZD!`!!H`%00$0&`"#T`=!?1`+Q7T0!\#]$`00B1(``7J0$
+M`"*P@`!^I```(Z#!4B!(`@!*+`(`:B!"`D-(80,C2`$$(D0"`"H\@`">I`0`
+M)*`$`$HL!`!J($(`0TAA`2-(`00B1`0`*CP$`"2@P3`@2`4`2BP%`&H@0@!#
+M2&$!(T@!!")$!0`J/`0`)*#!4"!(!@!*+`8`:B!"`$-(80$C2`$$(D0&`"H\
+M!``DH,%P($@'`$HL!P!J($(`0TAA`2-(`00B1`<`*CSH$RND,`#AM^@3*Z40
+M!.M'``!]IP!`6VL``+HG``"](R@`";00!.M'`0`_(@``?:<`0%MK``"Z)P``
+MO2,!`#\@!0#@PV``?J0``".@`0`@Y```0[`!!/]'``3A1P``7J<(`#ZE$`!>
+MI1@`?J4@`)ZE*`"^I3``WJ4X`/ZEP`#>(P&`^FL``+LG``"](^#_WB,``%ZW
+M"``^M1``7K4*!/!'M`,PH0%P($45`"#D`0`_)D29,2(``'VG`$!;:P``NB<`
+M`+TC`.`_)/__(2````%$`3`@12&W(T@`!`%$``#@0Q`$ZD<!`#\F1)DQ(A($
+MX$<``'VG`$!;:P``NB<``+TC`9`A11T`(.0!D"!$H0/A0PD`(/00!.I'`0`_
+M)M"`,2(``'VG`$!;:P``NB<``+TC`)$#1`@`X,,0!.I'`0`_)M"`,2(``'VG
+M`$!;:P``NB<``+TC`)0#1```X$,0!.I'`0`_)M"`,2(2!.!'``!]IP!`6VL`
+M`+HG``"](P``7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/P_]XC``!>MY`N
+M<*<`0%MK``"Z)P``O2.@`^!#``!>IQ``WB,!@/IK``"[)P``O2.P_]XC``!>
+MMP@`/K40`%ZU&`!^M2``GK4H`+ZU,`#>M0L$\$<,!/%'`0!?(0X$\$<``'VG
+M`$!;:P``NB<``+TC#03@1PD$_T>8`RN@(78@2`T`(.00!.M'$03I1P``?:<`
+M0%MK``"Z)P``O2,)``#T"3`@09@#*Z`A=B!((O8A2:$'(D#S_S_D`@3_1](`
+M0.4"`.##"@3_1_O__\,0!.M'`0`_)GR9,2(!`%\B``!]IP!`6VL``+HG``"]
+M(PD$_T<!`%\E()Q*(1`$ZT<1!.I'``!]IP!`6VL``+HG``"](P@``/0%`!\B
+M``!]IP!`6VL``+HG``"](PDP($&A=RQ!\?\_]*%W+$$"!/]'L@`@Y!`$ZT<1
+M!.U'K?]?TP($_T>M``#D$`3K1P$`/R84F3$B``!]IP!`6VL``+HG``"](_\_
+M/R````%$```MH(&V(D@,`"#@010`0&(%(4!B!T)`8@5!0&(%04!"!D)`(_=!
+M2",%8D!#!F%`8P5A0(*69$@*`.##0@0`0$(&0$!"!$)`8@5`0$($0$!B!4!`
+M(Q="2`($0T!"!$!`@G9$2&0``B(``'VG`$!;:P``NB<``+TC$`3K1Q$$[4=`
+M`%XB``!]IP!`6VL``+HG``"](P($_T=]``#D$`3K1P$`/R9\F3$B$@3_1P``
+M?:<`0%MK``"Z)P``O2,``"V@@=8B2"(`(.!\`RN@(?8A2*)5(4`,`$#TH34A
+M0`H`(/0$`$#D@`,KH"%V($BA=R!`!0`@]"@4+J`A=B!(`E!?(*$'(D`,`"#T
+M`@`L+`(`3"#!`B)(`1`T1*$5-$`&`"#T$`3K1Q$$[4<``'VG`$!;:P``NB<`
+M`+TC$`3K1Q$$[$<``'VG`$!;:P``NB<``+TC$`3K1P$`/R9@F#$B``!]IP!`
+M6VL``+HG``"](P!4`$0``.!#$`3K1P$`/R9@F#$B$@3@1P``?:<`0%MK``"Z
+M)P``O2,$`$V@`5!`1`4`(/0!T%]$`O%?1`'P/T0!!")$!``ML```+:#!4B!(
+M`@!,+`(`;"!"`D-(80,C2`$$(D0"`"P\!``MH`0`3"P$`&P@0@!#2&$!(T@!
+M!")$!``L/`0`+:#!,"!(!0!,+`4`;"!"`$-(80$C2`$$(D0%`"P\!``MH,%0
+M($@&`$PL!@!L($(`0TAA`2-(`00B1`8`+#P$`"V@P7`@2`<`3"P'`&P@0@!#
+M2&$!(T@!!")$!P`L/.@3*Z0P`.&WZ!,KI1`$ZT<``'VG`$!;:P``NB<``+TC
+M*``)M!`$ZT<!`#\B``!]IP!`6VL``+HG``"](P$`7R``!.)'``!>IP@`/J40
+M`%ZE&`!^I2``GJ4H`+ZE,`#>I5``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`
+M/K40`%ZU"@3P1PD$\4<!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2/]_S\D(3$@
+M0````40``.!#H34@02\`(/2A/2!!`@`@Y!<`(.4T`.##H=4@00,`(/2A%2%!
+M)P`@]"\`X,,!$%\F$@021!`$ZD<!`#\F!(`Q(@``?:<`0%MK``"Z)P``O2,0
+M!.I'%``_(@``?:<`0%MK``"Z)P``O2,`$01$$`#@PP(07R82!!)$$`3J1P$`
+M/R8$@#$B``!]IP!`6VL``+HG``"](Q`$ZD<4`#\B``!]IP!`6VL``+HG``"]
+M(P`4!$0``.!#$`3J1Q0`/R(2!.!'!0#@PP`07R82!!)$$`3J1P$`/R8$@#$B
+M``!]IP!`6VL``+HG``"](P``7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/P
+M_]XC``!>MP(`/R)C`D#3``!>IQ``WB,!@/IK``"[)P``O2/P_]XC``!>MP@`
+M/K4)!/!'$03_1P$`7R(``'VG`$!;:P``NB<``+TC`03_1P0``.00!.E'$P`_
+M(D\"0-,!!.!'``3A1P``7J<(`#ZE$`#>(P&`^FL``+LG``"](\#_WB,``%ZW
+M"``^M1``7K48`'ZU(`">M2@`OK4P`-ZU"@3P1PD$\4<3`#\B.P)`TP$$_T?1
+M``#D$`3J1Q$$_T<!`%\B``!]IP!`6VL``+HG``"](P$$_T?(``#D$`3J1Q$$
+M_T<M`D#3`03_1\,``.3!`"#E?`,JH"'V(4BB52%`!P!`]*$U(4`%`"#T#P!`
+MY(`#*J`A=B!(H7<@0`L`(.0(`-\A`@`I+`(`22#"`B)(`1!$1!D`(/0!$%I$
+MH14X0`0`OR$Y`"#D%`#@PX0#*J`!$#Y$T/\A(*'W)T`&`"#T?`,JH"'V(4BB
+M]2!`H74A0`($0407`$#D"`#?(0(`*2P"`$D@P@(B2`$01$0#`"#T`1!:1*$5
+M.$`"`"#DZP"_(2(`X,,"`"DL`@!)(,$"(DB!UB%(Z@&_(1P`(/`$`$D@_O\B
+M+$$/(DCJ`K\AS5@]1!8`X,,.!/]'`@`I+`(`22#"`B)(`1!$1`,`(/0!$%I$
+MH14X0`(`(.2K`+\A"P#@PP(`*2P"`$D@P0(B2('6(4BJ`;\A!0`@\`0`22#^
+M_R(L00\B2*H"OR'-6#5$`@`I+`(`22#"`B)(`1!(1`<`(.0!$$1$`P`@]`$0
+M6D2A%3A``@`@Y`Z4P$4(`.##`@`I+`(`22#!`B)(`1`H1`,`[D,"-,!%#@3C
+M1XX$(D0"`"DL`@!)(,$"(DB!%B%(`P#N0P)4P$4.!.-'S@(B1`(`*2P"`$D@
+MP0(B2`$0(D0#`)\AC!0@1!`$ZD<!`#\F?)@Q(@``?:<`0%MK``"Z)P``O2,+
+M`.!#`@!)+`(`*2#"`D%(`1!$1`,`(/0!$%I$H14X0"$`(.00!.I'`0`_)@28
+M,2(2!.Q'``!]IP!`6VL``+HG``"](Q`$ZD<!`#\F`*(Q(A($[D<``'VG`$!;
+M:P``NB<``+TC(?9A2:$%+4`N`"#T$`3J1P$`/R9\F#$B$@3M1P``?:<`0%MK
+M``"Z)P``O2,L`1\B``!]IP!`6VL``+HG``"](R``X,,A]F%)H04M0`T`(/00
+M!.I'`0`_)GR8,2(2!.U'``!]IP!`6VL``+HG``"](RP!'R(``'VG`$!;:P``
+MNB<``+TC$`3J1P$`/R8$F#$B$@3L1P``?:<`0%MK``"Z)P``O2,0!.I'`0`_
+M)@"B,2(2!.Y'``!]IP!`6VL``+HG``"](P$`/R``!.%'``!>IP@`/J40`%ZE
+M&`!^I2``GJ4H`+ZE,`#>I4``WB,!@/IK``"[)P``O2.0_]XC``!>MP@`/K40
+M`%ZU&`!^M2``GK4H`+ZU,`#>M3@`_K4+!/!'#03Q1PD$\D<.!/!'``#RLP``
+M?:<`0%MK``"Z)P``O2,,!.!'``3_1SL!@.6P,2N@(?8A2*)5($"A%2!``@1!
+M1`(`0.0!`#\@```IL+`Q+J`J]B%(H35`0:\`(.00!.M'`0`_)B"9,2(``'VG
+M`$!;:P``NB<``+TC@!8"2*8``/"P,>ZS``!)L0\$_T<!`#\D$)PA($@`/K0!
+M`#\G%)PY(U``/K<!`'\G&)Q[(U@`?K?P8R$@()DA(&``/K00!.M'2``^I@``
+M?:<`0%MK``"Z)P``O2,)`.!#$`3K1U``/J8``'VG`$!;:P``NB<``+TC"@#@
+M0Q`$ZT=8`#ZF``!]IP!`6VL``+HG``"](P``X$-``!ZTH0/I0Z(#ZD,!`")$
+M$P`@]!`$ZT=@`#ZF``!]IP!`6VL``+HG``"](P$`/R<`!!E$``#@0Q`$ZT=@
+M`#ZF$@3@1P``?:<`0%MK``"Z)P``O2,/,.!!H3WA0=/_/_0A]B%)@38@2"/V
+M04F"-F!(`00B0)GV($B#]F!(H@/Y0P$`/R"A"2-``@!!1)(`0.1``'ZG.`'[
+M0S@7!TN8%P=+``!]IP!`^VH*!/M'(`!;(*']8T.*]"-$X/\_((H(0408`.E#
+M&03C1P``?:<`0/MJ*1%P0Q``22"A_2%!B?0A1/#_?R.)"%M$$`3K1P$`/R8@
+MF3$B``!]IP!`6VL``+HG``"](Q_X/R````%$(;=`2>`'7R`!`")$``0!1```
+MX$,0!.M'`0`_)B"9,2(2!.!'``!]IP!`6VL``+HG``"](Q`$ZT<!`#\F()DQ
+M(@``?:<`0%MK``"Z)P``O2,`\0-$`?`C10`$`40``.!#$`3K1P$`/R8@F3$B
+M$@3@1P``?:<`0%MK``"Z)P``O2,0!.M'`0`_)B"9,2(``'VG`$!;:P``NB<`
+M`+TC``@_(``$`40``.!#$`3K1P$`/R8@F3$B$@3@1P``?:<`0%MK``"Z)P``
+MO2,"`#\@L#$NL`$`/R`0`"RP%``LH`'Q/T0"\%]%`@1!1"*V7TAA,2!)`00B
+M1!0`++`T`.##`@`M+`(`32#!`B)(`1`T1*$5-$`N`"#TL#$NH*%5($`K`"#D
+M$``LH"D`(/00!.M'`0`_)B"9,2(``'VG`$!;:P``NB<``+TC__\_)/\/(2``
+M``%$`0`_)`#P(2``!`%$``#@0Q`$ZT<!`#\F()DQ(A($X$<``'VG`$!;:P``
+MNB<``+TC$`3K1P$`/R8@F3$B``!]IP!`6VL``+HG``"](P$`/R8`!!%$``#@
+M0Q`$ZT<@F3$B$@3@1P``?:<`0%MK``"Z)P``O2,!`#\@L#$NL!`$ZT<1!.Q'
+M``!]IP!`6VL``+HG``"](P``+*"!-B)(,P`@\!`$ZT<!`#\F8)@Q(@``?:<`
+M0%MK``"Z)P``O2,`5`!$``#@0Q`$ZT<!`#\F8)@Q(A($X$<``'VG`$!;:P``
+MNB<``+TC`@!-+`(`+2#"`D%(@19!2`<`(/"$`RN@`1`^1-#_(2"A]R=`)P`@
+MY`$02$0E`"#D?`,KH"'V(4BB]2!`HA5`0*%U(4"A%2!``@!!1!T`0.1\`RN@
+M(?8A2*)5(4`9`$#TH34A0!<`(/0$`$#D@`,KH"%V($BA=R!`$@`@]!`$ZT>\
+M#4#3#P#@PP(`;2P"`$T@P0)B2`%4($1#`F)(80,B2`$$(T0"`"T\``!,H,%2
+M0$@!42!$(G9>2&%3($@!!")$```LL`$`'R```%ZG"``^I1``7J48`'ZE(`">
+MI2@`OJ4P`-ZE.`#^I7``WB,!@/IK``"[)P``O2/0_]XC``!>MP@`/K40`%ZU
+M&`!^M0H$\$<)!/%'__\_(,$$,48@`#ZP?`,PH"+V(4BA-4%`!@`@]*%504`%
+M`"#D@`,PH"%V($BA=R!``0`@Y`D1(D40!.I'#``_(@``?:<`0%MK``"Z)P``
+MO2,0!.I'`$`_(A($Z4<``'VG`$!;:P``NB<``+TC#P`?(@``?:<`0%MK``"Z
+M)P``O2,@`#Z@`7`@1"``/K`)<"!%$@#A0Q`$ZD<`0#\B$P3I1P``?:<`0%MK
+M``"Z)P``O2,+`.!#%0`@\1`$ZD<4`#\B$@3_1P``?:<`0%MK``"Z)P``O2,0
+M!.I'$03_1P$`7R(``'VG`$!;:P``NB<``+TC!@``Y!`$ZD?``#\B``!]IP!`
+M6VL``+HG``"](P`$ZT<``%ZG"``^I1``7J48`'ZE,`#>(P&`^FL``+LG``"]
+M(_#_WB,``%ZW`0`_)F28,2(``'VG`$!;:P``NB<``+TC(/8!2(!V`DC_`5\@
+M```"1($6`4@%`"#D`0@"1`$`(2`A`>%#(1<F2(`7)D@``%ZG$`#>(P&`^FL`
+M`#&@P5(@2.`!7R`"`")$H1580`P`(/2A'5A``P`@Y*$55$`%`"#T#P#@P\#^
+M(B`-`"#TA!10H`0`X,.$%#"@PE(@2`$`X,.(%%"@```R+$$",DAB`U)(`@1!
+M1```4CP!`!\@`8#Z:P`$_T<!@/IK``"[)P``O2/0_]XC``!>MP@`/K40`%ZU
+M&`!^M0H$\$<+!/%'`0`_)F"8,2(``'VG`$!;:P``NB<``+TC`%``1`D$_T<;
+M``#T$`3J1[K_7],)!.!'$`3J1Q$$ZT<@`%XBR_]?TPT``.0@`#XL(@!>($$/
+M(DB!%R9(H0DI0`@`(.0``$N@P5)`2`%4($0B=EY(85,@2`$$(D0``"NP"03_
+M1Q0`2Z`B=EY((1<B20$$(D04`"NP``#I0P``7J<(`#ZE$`!>I1@`?J4P`-XC
+M`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`?K4*!/!'"P3P1Y`#,*0!
+MD"!$H0/A0T``(.0@!#\B`0!?(@``?:<`0%MK``"Z)P``O2,0!.I'``8_(A($
+M_T<``'VG`$!;:P``NB<``+TC$`3J1P`&/R(``'VG`$!;:P``NB<``+TC`!0!
+M1```X$,0!.I'``8_(A($X$<``'VG`$!;:P``NB<``+TC$`3J1P0&/R(0`%\F
+M`0)2(@``?:<`0%MK``"Z)P``O2,0!.I'(`8_(A($_T<``'VG`$!;:P``NB<`
+M`+TC"03_1Q(`Z4,0!.I'``0_(@``?:<`0%MK``"Z)P``O2,!!"M!*#%!+B@Q
+M(2#2`$%*$`3J1P0$/R(``'VG`$!;:P``NB<``+TC"3`@0:']+T'L_S_T``!>
+MIP@`/J40`%ZE&`!^I2``WB,!@/IK``"[)P``O2/P_]XC``!>MP`$_T?__U(B
+M,O9!2H5V0$H2\$!&`0#Q0P8$_T<>`"#L`0#_(%,68$($!$%"(_:!2*$384"#
+M%"%$`P#C0R$'XTC__R$@(@?R2/__0B`!"")$(0<S2"+VH4A"!%!```!"H`$`
+M(D0A]B%(@08S2"'V(4B!!C)((0<F2`$$`40``.%#(P5R0`8`PT`A$8%`$@3_
+M1P4PH$#D_S_\$`3@1P``?:<`0%MK``"Z)P``O2,``.!#``!>IQ``WB,!@/IK
+M``"[)P``O2/0_]XC``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU"03P1PT$\4<,
+M!/!'```RH,%2($C@`5\@`@`B1*$56$`+`"#TH1U80`,`(.2A%51`!0`@]$0`
+MX,/`_B(@!`3_1P0`(.1``.##`0"?(`$`X,,"`)\@!`2$0`0$C$"B%$0LHA1D
+M(,("0TBH%"0LJ!2D(,$")4@AUR!(`@1!1`P`(RRN%&0@P0(C2"&7(4@"!$%$
+M#``E++04Q"#!`B9((5<B2`($040,`",LNA2D(,$")4@A%R-(`@1!1`L`XD,,
+M`&8LP!1$(,,"8D@,`"4LQA2D(,$")4@AUR!(`P1A1`P`(BS,%,0@P0(F2"&7
+M(4@#!&%$#``E+-(41"#!`B)((5<B2`,$840,`"8LV!2$(,$")$@A%R-(`P1A
+M1`H`XT,B]J%)H35`0`0`(/0)`$#DH55`0`,`(/0$`.##"@#K0P0`X,,+`.I#
+M`@#@PP`$_T<R`.##(?9!22+V84FA!2)`"@`@Y!`$Z4<!`#\F"*(Q(@``?:<`
+M0%MK``"Z)P``O2/_WS\@```!1`D`X,,0!.E'`0`_)@BB,2(``'VG`$!;:P``
+MNB<``+TC`"`_(``$`40``.!#$`3I1P$`/R8(HC$B$@3@1P``?:<`0%MK``"Z
+M)P``O2.L,:RQ$`3I1P$`/R9@F3$B$@3K1P``?:<`0%MK``"Z)P``O2,0!.E'
+M`0`_)F29,2(2!.I'``!]IP!`6VL``+HG``"](P$`'R```%ZG"``^I1``7J48
+M`'ZE(`">I2@`OJ4P`-XC`8#Z:P``NR<``+TC?`,PH"'V(4BB52%`$P!`]*$U
+M(4`1`"#T!`!`Y(`#,*`A=B!(H7<@0`P`(/1\`S"@(?8A2*+U($"A=2%``@1!
+M1`8`0/2$`S"@`1`^1-#_(2"A]R=`(``_(P$`(.0H`#\C```1+]@"$4L9`/E#
+M``!]IP!`^VJ@`_M#]O][(PP`/R"[`SM````;1`&`^FL``+LG``"](Z#_WB,`
+M`%ZW"``^M1``7K48`'ZU(`">M2@`OK4P`-ZU.`#^M0L$\$<.!/%'#`3P1P``
+M,:#!4B!((78@2`T0,$2M`^U#\`%?(`(`043`_B(@%``@Y`H`(/RA%5A`1@`@
+M]*$=6$`#`"#DH1540#\`(/1$`.##H15:0#\`(/1!`.##0/<B(#P`(.0"`"#\
+ML/XB(`,`X,/`]B(@`@`@Y+#V(B`X`"#T0`#^MX0#*Z`!$#Y$T/\A(*'W)T`T
+M`"#T?`,KH"'V(4BB]2!`HA5`0*%U(4"A%2!``@!!1"P`0.1\`RN@(?8A2*)5
+M(4`H`$#TH34A0"8`(/0$`$#D@`,KH"%V($BA=R!`(0`@]!`$ZT<!`#\F1)DQ
+M(@``?:<`0%MK``"Z)P``O2,`$0=$\"U,I`(`0B#^_R(L00\B2(&W)4@!$"=$
+M``0!1```X$,0!.M'`0`_)D29,2(2!.!'``!]IP!`6VL``+HG``"](P@`X,,!
+M`#\@0``^M`4`X,,"`%\@0`!>M`(`X,,`!/]'LP'@PQ`$ZT<!`#\F$)DQ(@``
+M?:<`0%MK``"Z)P``O2,&_#\@```!1$``/J0)!"%`"00L09P4*2R<%$D@P0(B
+M2"&7($@`!`%$`#0`1```X$,0!.M'`0`_)A"9,2(2!.!'``!]IP!`6VL``+HG
+M``"](ZPQ+*(0!.M'$@3N1\+^7].$%$DNA!0I(=("24K_`3\@$@!!1@$`(2`2
+M!$%&$`3K1P$`/R9HF3$B``!]IP!`6VL``+HG``"](R@4+*`A=B!(_T]?(*$'
+M(D`;`"#T```NH(&6(D@8`"#@!`2M000$C$#P%*0@#`!%+/P4)"#)`D%(`@2L
+M00458B#__R,L00\C2(H7)T@'%4(@__\B+$$/(DB/%R=($`!%+``5)"#"`D%(
+M2`!>M`@`(2P(%80@Q`(D2%``GK0;`.##0`!>I`$$0D`!!"Q`6A1!+%H4(2#)
+M`D%(0``^I`($+$!_%$(@__\B+$$/(DB*%R=(`@2L08(40B#__R(L00\B2(\7
+M)T@!!*U!`00L0&`482Q@%$$@P@)B2$@`7K3J%$$LZA0A(,$"04A0`#ZT$`3K
+M1P$`/R9$F#$B``!]IP!`6VL``+HG``"](W_`/R````%$(?<@28`_7R`!`")$
+M``0!1```X$,0!.M'`0`_)D28,2(2!.!'``!]IP!`6VL``+HG``"](Q`$ZT<!
+M`#\F4)@Q(@``?:<`0%MK``"Z)P``O2,`\1]$`?!?10`$`40``.!#$`3K1P$`
+M/R90F#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.M'`0`_)E"8,2(``'VG`$!;
+M:P``NB<``+TC(+8?2&$QX$D`!`%$``#@0Q`$ZT<!`#\F4)@Q(A($X$<``'VG
+M`$!;:P``NB<``+TC$`3K1P$`/R9(F#$B``!]IP!`6VL``+HG``"](_S_/R3_
+M#R$@```!1$@`/J0BER%(!``_)`#P(2`"`$%$``0"1```X$,0!.M'`0`_)DB8
+M,2(2!.!'``!]IP!`6VL``+HG``"](T``7J0)!$)`"00L06`422$2`"HL<A1)
+M(,$"(D@B%R-((1<B2`($041X%$DN>!0I(-("04HA%T%*`@1!1!($0D82`/)#
+M$`3K1P$`/R8TF#$B``!]IP!`6VL``+HG``"](Q`$ZT<!`#\F*)@Q(@``?:<`
+M0%MK``"Z)P``O2,@MA](9A0I+&8422#!`B)((1<A2``$`40``.!#$`3K1P$`
+M/R8HF#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.M'`0`_)F28,2(``'VG`$!;
+M:P``NB<``+TC^/\_)/\/(2````%$#`!*+&P4*2'"`DE((I=!2`@`/R0`\"$@
+M`@!!1``$`D0``.!#$`3K1P$`/R9DF#$B$@3@1P``?:<`0%MK``"Z)P``O2,"
+M`#\A*!0LH"%V($@",%\@H0<B0`D`(.1X`RN@P5(@2-[O(2`0`"#T```NH('6
+M(D@-`"#@"``_(0L`X,,0!.M'$03N1V#^7],'``#D0`!>I`$$0D`!!"Q`WA1!
+M+-X4(2#"`D%("0`B01`$ZT<!`#\F))DQ(@``?:<`0%MK``"Z)P``O2,`T1]$
+M`00I00'0/T0`!`%$``#@0Q`$ZT<!`#\F))DQ(A($X$<``'VG`$!;:P``NB<`
+M`+TC$``NH`8`(.04`"Z@(A<G2(D71T@A%R9(BA<G2`D`X,,!!*U!`00L0&`5
+M@2`.`&0L;A5!(,D"8D@2`$0L<A4A(,H"04@0!.M'`0`_)B"9,2(``'VG`$!;
+M:P``NB<``+TC'_@_(````40AMR!)X`=?(`$`(D0`!`%$``#@0Q`$ZT<!`#\F
+M()DQ(A($X$<``'VG`$!;:P``NB<``+TC$`3K1P$`/R8@F3$B``!]IP!`6VL`
+M`+HG``"](P#Q`T0!\$-%``0!1```X$,0!.M'`0`_)B"9,2(2!.!'``!]IP!`
+M6VL``+HG``"](Q`$ZT<!`#\F()DQ(@``?:<`0%MK``"Z)P``O2,`"#\@``0!
+M1```X$,0!.M'`0`_)B"9,2(2!.!'``!]IP!`6VL``+HG``"](R@4+*`B=B!(
+M`$`_(*$'04`@`"#T```NH,%2($@!$#I$H14Z0`,`(.3_3S\@H0=!0!@`(/00
+M!.M'`0`_)@RB,2(``'VG`$!;:P``NB<``+TC!/\_)/__(2````%$4`!>I"%7
+M0DC\`%\D`0`B1``$`40``.!#$`3K1P$`/R8,HC$B$@3@1P``?:<`0%MK``"Z
+M)P``O2,H%"R@(78@2`!07R"A!R)`"``@]!`$ZT<!`#\FX)DQ(A($_T<``'VG
+M`$!;:P``NB<``+TC`0`?(```7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WJ4X
+M`/ZE8`#>(P&`^FL``+LG``"](V#_WB,``%ZW"``^M1``7K48`'ZU(`">M2@`
+MOK4P`-ZU.`#^M0P$\$</!/%'0`#^MU``_K=8`/ZW@`#^MX@`_K>0`/ZW```]
+M)```(2```&$L!P!!+`3P($3#!F%(0@]!2((4@$0#!&)$8`!^M```/20``"$@
+M``!A+`,`02S#!&%(0@U!2`,$8D0$`($L!``A('``?K!T`%Z@(I9?2,0"@4@$
+M!()$=`">L```4:#!4D!("A`P1*H#ZD,B=D!(001"0`$$(4`HIB$@+G8@2`0`
+M0/5!!$)``00A0)A`(2`N=B!(.``OH"%V($@+!.%'*``@]`(`X,,+!.!'(`#@
+MPP$`?R4`@&LA```OH,%2($@!$")$K@!?((+T*D0)!/]'+0'"00$`PD&8`#ZT
+M$0#I0W`#;*<0!.Q'$@3J1P!`6VL``+HG``"](P"`("`,`"#D_S]_(````T0"
+M`.!#H0VB00,`(.28`#ZGH0DB0^+_/^0!`"D@*78@2*&7($'K_S_T.`!/H"*6
+M7T@A=F!)`00B1#@`+[``@"L@L0`@]!`$[$<!`#\F()DQ(@``?:<`0%MK``"Z
+M)P``O2.`U@-(00(`X!`$[$<!`#\F#)DQ(@``?:<`0%MK``"Z)P``O2,@]@!(
+M$`3L1P$`/R8,F3$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.Q'`0`_)B"9,2(`
+M`'VG`$!;:P``NB<``+TC`)`_)"$Q($````%$$@#@0Q`$[$<!`#\F#)DQ(@``
+M?:<`0%MK``"Z)P``O2,0!.Q'`0`_)J"9,2(2!/]'``!]IP!`6VL``+HG``"]
+M(Q`$[$<!`#\F@)DQ(A($_T<``'VG`$!;:P``NB<``+TC$`3L1P$`/R:$F3$B
+M``!]IP!`6VL``+HG``"](_#_/R4```E$``#@0Q`$[$<!`#\FA)DQ(A($X$<`
+M`'VG`$!;:P``NB<``+TC$`3L1P$`/R:8F3$B$@3_1P``?:<`0%MK``"Z)P``
+MO2,0!.Q'`0`_)IR9,2(``'VG`$!;:P``NB<``+TC```)1```X$,0!.Q'`0`_
+M)IR9,2(2!.!'``!]IP!`6VL``+HG``"](Q`$[$<!`#\F`)DQ(A($_T<``'VG
+M`$!;:P``NB<``+TC$`3L1P$`/R8$F3$B$@3_1P``?:<`0%MK``"Z)P``O2,0
+M!.Q'`0`_)@B9,2(2!/]'``!]IP!`6VL``+HG``"](Q`$[$<!`#\F#)DQ(@``
+M?:<`0%MK``"Z)P``O2,`P#\A```)1```X$,0!.Q'`0`_)@R9,2(2!.!'``!]
+MIP!`6VL``+HG``"](Q`$[$<!`#\FB)DQ(A($_T<``'VG`$!;:P``NB<``+TC
+M$`3L1P$`/R:,F3$B$@3_1P``?:<`0%MK``"Z)P``O2,0!.Q'`0`_)I"9,2(2
+M!/]'``!]IP!`6VL``+HG``"](Q`$[$<!`#\FE)DQ(@``?:<`0%MK``"Z)P``
+MO2,```E$D`'@PR,!;D$``"^@P5(@2/`!7R`"`")$H15:0$L`(/2A'5I``P`@
+MY*$56$`=`"#T70#@P\#^(B`#`"#DL/XB($(`(.18`.##(C=B2`(`XD-!!$)`
+M804B0$$$(4!!!B)`80<B0$$&(4!A!2)`80<A0&$'(D!!!B)`80<A0`$$(4`!
+M!")`@7<D2(+W0T@A!2)`B``^M(%7(4B0`#ZT-0Q?($``X,,B%V%(`@#B0V$%
+M0D!!!")`000B0$$$(4!A!2)`000B0&$%(D!A!2)`804B0&$%(4!A!2)`804A
+M0$$$(D!!!")`@3<D2(+W0T@A!2)`D``^M"(W8D@"`.)#001"0&$%(D!!!"%`
+M008B0&$'(D!!!B%`804B0&$'(4!A!R)`008B0&$'(4`!!"%``00B0(%W)$B"
+M]T-((04B0(@`/K0U##\C@``^MQ<`X,,B%V)(`@#B0T$$0D!A!2)`000A0$$&
+M(D!A!R)`008A0&$%(D!A!R%`80<B0$$&(D!A!R%``00A0`$$(D"!=R1(@O=#
+M2"$%(D"(`#ZT@5<A2)``/K1J&%\@@`!>M%@$8T!8!!A#6`080SCW`$L8`/A#
+M@``^IP``?:<`0/MJ`?!A1P0`7R!@`/X@`@`@]`,`7R!P`/X@"03_1U<`0.2$
+MEV!+I9V#0`$`'R$&`.)#&P&@Y`$$B4`#,"-`H1=D0`L`(.2A/6-`(@<#200`
+M(/2A76-`#0`@]/__0R`B!P))0``^H`$$(D1``#ZP!P#@P]__0R"A=T)`!``@
+MY"('`DE$`#Z@`00B1$0`/K`!`",@H?<A0`L`(.0!!"E!`00G0```02S"`D%(
+M`01C0`(`(2`B!T%(4``^H`$$(D10`#ZP*0#@P_'_(R"A]R%`"P`@Y`$$*4$!
+M!"=```!!+,("04@!!&-`XO\A("('04A4`#Z@`00B1%0`/K`;`.##X?\C(*'W
+M(4`+`"#D`00I00$$)T```$$LP@)!2`$$8T#"_R$@(@=!2%@`/J`!!")$6``^
+ML`T`X,/1_R,@H=<@0`H`(.0!!"E!`00G0```02S"`D%(`01C0*+_(2`B!T%(
+M7``^H`$$(D1<`#ZP`0`I("EV($@!`.E#H0DF0*W_/_00!.Q'`0`_)@R9,2(`
+M`'VG`$!;:P``NB<``+TC`/\_)``$`40``.!#$`3L1P$`/R8,F3$B$@3@1P``
+M?:<`0%MK``"Z)P``O2,0!.Q'`0`_)B"9,2(``'VG`$!;:P``NB<``+TC$@#@
+M0P!P/R02!$%&$`3L1P$`/R8@F3$B``!]IP!`6VL``+HG``"](Y``/J0RER)(
+M\#\_)!(`0480`#\E__\I(8@`7J0!`$E$$@1!1@!`/R02!$%&$@#R0Q`$[$<!
+M`#\FH)DQ(@``?:<`0%MK``"Z)P``O2-``%ZB$`3L1P$`/R:`F3$B``!]IP!`
+M6VL``+HG``"](Q`$[$<!`#\FA)DQ(@``?:<`0%MK``"Z)P``O2/P_U\E```*
+M1$0`/J`!`"E$``0!1```X$,0!.Q'`0`_)H29,2(2!.!'``!]IP!`6VL``+HG
+M``"](T``7J(0!.Q'`0`_)IB9,2(``'VG`$!;:P``NB<``+TC$`3L1P$`/R:<
+MF3$B``!]IP!`6VL``+HG``"](P``"D1$`#Z@`0`I1``$`40``.!#$`3L1P$`
+M/R:<F3$B$@3@1P``?:<`0%MK``"Z)P``O2-0`%ZB$`3L1P$`/R8`F3$B``!]
+MIP!`6VL``+HG``"](U0`7J(0!.Q'`0`_)@29,2(``'VG`$!;:P``NB<``+TC
+M6`!>HA`$[$<!`#\F")DQ(@``?:<`0%MK``"Z)P``O2,0!.Q'`0`_)@R9,2(`
+M`'VG`$!;:P``NB<``+TC`,`_(0``"43_/U\A7``^H`$`*D0`!`%$``#@0Q`$
+M[$<!`#\F#)DQ(A($X$<``'VG`$!;:P``NB<``+TC4`!>HA`$[$<!`#\FB)DQ
+M(@``?:<`0%MK``"Z)P``O2-4`%ZB$`3L1P$`/R:,F3$B``!]IP!`6VL``+HG
+M``"](U@`7J(0!.Q'`0`_)I"9,2(``'VG`$!;:P``NB<``+TC$`3L1P$`/R:4
+MF3$B``!]IP!`6VL``+HG``"](P``"41<`#Z@`0`J1``$`40``.!#$`3L1P$`
+M/R:4F3$B$@3@1P``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``7J48`'ZE(`">
+MI2@`OJ4P`-ZE.`#^I:``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU
+M&`!^M0L$\$<`9!\G`@`Q+`(`42#!`B)(`1`B1*$#X4,X!P%+`@`Q+,$"(DB!
+MUB%(`@`@X)@V`$L%`.##!``Q(/[_02Q"#T%(@58`2Y@(040``#$OV0(Q2P``
+M?:<`0/MJ'P!?(8$&:DL"`"#P__]*(?S_7_4F`#\@*@4J0!<`/R`A!2I``0`_
+M(2D'(4D)`.E#"01I0Q@`/R`A!2I`B08A2?#_2B$0!.M'`0`_)A28,2(``'VG
+M`$!;:P``NB<``+TC`@`_)/__(2````%$*3<B20`$"40``.!#$`3K1P$`/R84
+MF#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.M'`0`_)A28,2(``'VG`$!;:P``
+MNB<``+TC_O\_)/\?(2````%$*K=!20(`/R0`X"$@"@!!10`$"D0``.!#$`3K
+M1P$`/R84F#$B$@3@1P``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``7J48`'ZE
+M(`#>(P&`^FL``+LG``"](^#_WB,``%ZWH=<G0C\`7R#"!#%$K`,PH"&6/T@B
+M=D!(`@1!1*P#4+#H$S"F$`!>(@``?:<`0%MK``"Z)P``O2,``%ZG(`#>(P&`
+M^FL``+LG``"]([#_WB,0`%ZW&``^M2``7K4H`'ZU,`">M0H$\$<,!/%'"03R
+M1PL$\$>`2#"B>$@0I@``?:<`0%MK``"Z)P``O2.$2`HB(``_(@``?:<`0%MK
+M``"Z)P``O2.L`RJ@(1<F2($7)DBB^2=`/P!_(M,$040^`#\@H0DS0*(58$(!
+M!")$$@3_1PH`(.2P`RJ@(?8A2`$$(4```%TD``!"(`$$(D`"`"$@_O]!+$(/
+M04B2%T9(0@`^(```/K00!.I'$03L1P$`GR)``+XB]@!`TP$$_T?J``#DH"YK
+MIQ`$ZD=``#XB0@!>(A,$[$<4!.E'`$!;:P``NB<``+TC`03_1]\``.1\`RJ@
+M(?8A2*+U($"B%4!`H74A0*$5($`"`$%$$@!`Y'P#*J`A]B%(HE4A0`X`0/2A
+M-2%`#``@]`0`0.2``RJ@(78@2*%W($`'`"#TH$A+H,%20$@$`"$@(G9>2&%3
+M($@!!")$H$@KL`D$_T<_`-\@`00I00$$*T"`2*$@!`!E+(1(@2#"`F1([#$K
+MH,$2($@"!$%`0P)D2&(#1$@"!$-$!`!%/,$"1$BA]R=`!``@]$("1$AA`\1(
+M`00B1`0`)3P),"!!H?<A0>G_/_14%$N@P5)`2*$W($!)`"#D@`,JH,%2($BA
+M-RA`*0`@Y```+*+!4B!*`1`Z1*$5.$`D`"#D(78@2DSV(2`1`"#T2!1KH,-0
+M8$@A=D!((P%A0$$$8T!!!B-`000A0&$%(T!!!"-`(M<A2"(%04!"!$-`8@=#
+M0((W1$B#]V-((05#0`P`X,-(%&N@PU!@2$$$8T!!!B-`000A0&$%(T!!!"-`
+M(M<A2"(%04!"!$-`8@=#0($V1$@A=B!($0#A0Q`$ZD<=`T#3"03_1P$`GR6`
+MH8PA0A0@01$`3$!X2"ND`@1!0`(`(B```$$NT@)!2C(704H2]%]&<E-`2@``
+M(BS!`B)((1<A2`'T/T0A=B!($@1!1A(`\D,0!.I'``!]IP!`6VL``+HG``"]
+M(PDP($&A_2-!Y_\_](A(*Z#24B!($O!'1C(70TH!\"=$(1<B2!($04:$2$N@
+MP5)`2`'P)T0A%R%($@1!1@+P1T02!$)&$`3J1P$`/R8TF3$B``!]IP!`6VL`
+M`+HG``"](Y!(*Z#24B!($O!'1C(70TH!\"=$(1<B2!($04:,2$N@P5)`2`'P
+M)T0A%R%($@1!1@+P1T02!$)&$`3J1P$`/R8XF3$B``!]IP!`6VL``+HG``"]
+M(YA(2Z(2\$=&,A=#2I1(2Z`_`#\D`0!!1!($04:@2"N@P5(@2`'P)T0A%R%(
+M$@1!1@+P1T02!$)&$`3J1P$`/R8THC$B``!]IP!`6VL``+HG``"](Z!(2Z(2
+M\$=&,A=#2IQ(2Z`_`#\D`0!!1!($048"\$=$(A=!2!($0D:82"N@P5(@2`'P
+M)T02!$%&$`3J1P$`/R8XHC$B``!]IP!`6VL``+HG``"](\PQ*Z`_`%\BTO0O
+M1!`$ZD<!`#\F/)DQ(@``?:<`0%MK``"Z)P``O2,!`#\@``3A1Q``7J<8`#ZE
+M(`!>I2@`?J4P`)ZE4`#>(P&`^FL``+LG``"](U#_WB,``%ZW"``^M1``7K48
+M`'ZU(`">M2@`OK4P`-ZU.`#^M6``'K8,!/%':`!>MG``?K9X`)ZV@`"^M@L$
+M\$>$2+`A/P`_((@`/K20`#ZTH`#^MP8`42#__R(L00\B2($7)T@!!"%`(78@
+M2)@`/K2P`'ZD``!#+$("0TC!_S\@80,C2`$$(D0``",\@`">I```1"Q"`D1(
+M/P`_(&$#)$@!!")$```D/```?:<`0%MK``"Z)P``O2,*\!]$"03_1V``7J0L
+M%2*@(78@2"8`(.0N=D!)#P#J0P$07T6A%3Q`J``^M`$$*4$!!"M`+A5A+"X5
+M02#!`F)(%@`@Y*$%+D`%`"#TP0)B2`'P($0!%#Q$H07A00\`(.0AUR!)`01A
+M08P9(2(```PNT`(,2NH"0-.(`'ZDH0,#0,,$($0A=F!(B``^M*@`GJ0"`(#T
+MB``>M`4`X,,),"!!+!4KH"%V($BA#2E`W_\_Y`(`+"P"`$P@P0(B2`$0.D2A
+M%3A`*P`@Y`'Q0$4*-"!$"03_1RP5*Z`A=B!()P`@Y"YV0$D/`.I#`1!?1:H5
+M/$`!!"E!`00K0"X582PN%4$@P0)B2!4`(.2A!2Y`!0`@],$"8D@!\"!$`10\
+M1*$%X4$.`"#D(=<@20$$84&,&2$B```,+M`"#$JY`D#3D`!>I*$#`D#"!"!$
+M(79`2)``/K0"`$#UD``>M`@`X,,),"!!+!4KH"%V($BA#2E`X/\_Y`(`X,.(
+M`'ZDD`!^M`(`+"P"`$P@P0(B2($6(4@$`"#@1!0KH"$7)4B!%R=(`@#@PT04
+M*Z"!%R-($@#A0V``'J81!.Q'``!]IP!`6VL``+HG``"](R`7!TB)%P=(`@!,
+M+`(`+"#"`D%(`1!(1-@`(.0!$%!$!``@Y%892R)4&6NB,W9@2@,`X,,$&4LB
+M`!EKHM-28$I@`!ZF$03L1T``GB($`T#3F`">I"$%B4"(`%ZD`P#B0Z()(T"!
+M!$-$(1<F2(`7)D@"`"PL`@!,(,$"(D@!$")$'0`@Y"@4*Z`A=B!(`#!?(*$'
+M(D`'`"#T-!0KH,%2($@#`.!#H@DC0($$0T0A%R9(@!<F2"@4*Z`A=B!(_S]?
+M(*$'(D`,`"#T`@`L+`(`3"#!`B)(`1`P1`<`(.0X%"N@(78@2`,`X$.B"2-`
+M@01#1"$7)DB`%R9(1@`^+$8`7B#!`B)(`P#@0Z()(T"!!$-$(1<F2($7)DB@
+M`#ZT:`!^I`$$8T"@`)ZD(06!0"$7)DB`%R9(@!@`1'``7J2A"4!`P`0B1'@`
+M?J1V`&#D"`!-+`@`+2!"`D%(80,!2`$$(D0(`"T\!@!-+`8`+2!"`D%(80,!
+M2`$$(D0&`"T\!`!-+`0`+2!"`D%(80,!2`$$(D0$`"T\`@!-+`(`+2!"`D%(
+M80,!2`$$(D0"`"T\```M+$$"+4AC`PU(`P1A1```;3P$!.!'1``^+$0`7B#!
+M`B)(PP)M2*(#(T"!!$-$"@!-+`H`;2!"`D-(80,C2`$$(D0*`"T\0@!^+$(`
+M/B##`F%(```M+,$"+4BB`V%`P01#1`P`32P,`&T@0@)#2&$#(T@!!")$#``M
+M/$``7BQ``#X@P@)!2```+2S!`BU(HP-!0(($840.`&TL#@`M($,"84AA!T%(
+M`00C1`X`+3PB%T9(A1=&2"@4*Z`A=B!(_S]?(*$'(D`<`"#T`@`L+`(`3"#!
+M`B)(`1`P1`,`(.0\%"N@(78@2`(`X,,X%"N@P5(@2*$-($`#!.!'"@`@Y`(`
+M+"P"`$P@P0(B2`$0,$0#`"#D/!0KH,,2($@"`.##.!0KH,-2($@>`$TL'@`M
+M($("04AA`V%(!@#@PP``+2S!`BU('@!-+!X`;2!"`D-(80,C2`$$(D0>`"T\
+ML`!^I`(`0R#^_R(L00\B2($7)DCH,2NP"0#@PP0$X$=``#XL0`!>(,$"(D@#
+M`.!#H@DC0($$0T0A%R9(A1<F2(``?J0``$,L0@)#2&$#HT@!!")$```C/+``
+M/J0``$$L0@)!2&$#@4@!!")$L`!>I```(CP"`"PL`@!,(,("(D@!$$1$`P`@
+M]`$06D2A%3A`C``@Y'892R)T&6NB,W9@2F``'J81!.Q'4`">(BH"0-.8`'ZD
+M(05I0)``GJ0#`.1#H@DC0($$0T0A%R9(5@!^+%8`7B##`F)(@1<F2*()84#!
+M!$-$:`">I`($A$`A!2)`(1<F2(`7)DB`&`!$<`!>I*$)0$#`!")$>`">I$4`
+M@.0%`.!#H0EE0(,$)40!!.-'$`!-+!``;2!"`D-(80,C2`$$(D00`"T\5``^
+M+%0`7B#!`B)(H@DE0($$1402`$TL$@"-($("1$AC`R1(`P1B1!(`;3PA%R9(
+MAA<F2,$"9$@4`$TL%`!M($("0TAA`R-(`00B1!0`+3Q2`#XL4@!>(,$"(DBB
+M"25`@01%1!8`32P6`&T@0@)#2&$#(T@!!")$%@`M/,$"(T@8`$TL&`!M($("
+M0TAA`R-(`00B1!@`+3Q0`#XL4`!>(,$"(DBB"25`@01%1!H`32P:`(T@0@)$
+M2&,#)$@#!&)$&@!M/"$7)DB`%R9(P0)D2!P`32P<`&T@0@)#2&$#(T@!!")$
+M'``M/`\`X,-4`#XL5`!>(,$"(D@#`.!#H@DC0($$0T0A%R9(AA<F2%``/BQ0
+M`%X@P0(B2*()(T"!!$-$(1<F2(`7)DB``#ZD`@!!(/[_(BQ!#R)(@1<F2*$-
+M($`&`"#T@`!^I```0RQ"`D-(80,#2`$$(D0``",\L`">I`(`1"#^_R(L00\B
+M2($7)DBA"29`!0`@Y```1"Q"`D1(80/$2`$$(D0``"0\>``^I`P`(.2P`%ZD
+M`@`B(/[_02Q"#T%(@A=&2+@Q2[!@`'ZDK`,CH"%V/D@B%T)(`@1!1*P#0[`!
+M`!\@``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE,`#>I3@`_J6P`-XC`8#Z:P``
+MNR<``+TCH/_>(Q``7K<8`#ZU(`!>M2@`?K4P`)ZU.`"^M4``WK5(`/ZU"P3P
+M1P\$\4<.!/)'J"YPIP!`6VL``+HG``"](P$$_T=,``#DK`,KH"$7)DB!%R9(
+MHODG0#\`OR'-!$%$/@`_(*$)+4"B%:!!`00B1%@`_K<+`"#DL`,KH"'V(4@!
+M!"%```!=)```0B`!!")``@`A(/[_02Q"#T%(@A=&2%@`7K0*!/]',@#`Y5(`
+MGB$A]D%)208O0```GK40!.M'$03I1U@`7J83!.U'%`3_1U``OB*=_5_3`03_
+M1R8``.0&`*DL!@!I(,(`HT@B%T=(4@">+%0`WB!!#X9(@1<F2((71TBA"2)`
+M!0`@Y,$"C$A"`*-(80$C2`$$(D0&`"D\!P"I+`<`:2#"`*-((A='2%``GBQ!
+M#XQ(@1<F2((71TBA"2)`!@`@Y%``7B#!`H)(0@"C2&$!(T@!!")$!P`I/`HP
+M0$$A]D%)(O;!2:$#(D#/_S_T`0`_(``$X4<0`%ZG&``^I2``7J4H`'ZE,`">
+MI3@`OJ5``-ZE2`#^I6``WB,!@/IK``"[)P``O2/`_]XC``!>MP@`/K40`%ZU
+M&`!^M0L$\4<)!/!'4!0PH(H7(DB$2#`B(``>(B``7R(``'VG`$!;:P``NB<`
+M`+TC"`#?(C\`/R,!!-9"(`!>(`$$(D```&$LP@)A2"(%2D!#`F%(8@-!2`($
+M0T0``$$\!`3_1Q@$_T<7!-9"(``^(`<$X4("``<A_O\H+$$/*$B!%R9(`P`@
+M^```)RQ!`B=(```G/*$5@4`"`"#D#P"?("D`X,,@`%X@!@3B0@(`)B#^_T$L
+M0@]!2`$$A$`!!"E`A$BA+(1(82""%T9(P0*C2*(%04`!`"0@)'8@2!H`0.3!
+M`J-("``@]```1BS!`D9(`0`A($("1DAA`R9(`00B1```)CP-`.##H5<&0P0`
+M(/0``$<LP0)'2`$`(2`#`.##``!'+,$"1TC__R$@0@)'2&$#)T@!!")$```G
+M/`0$_T<!`#@@.'8@2*'W@4#*_S_T`0360B``7B`#!")``@!#(/[_(BQ!#R)(
+M@1<F2*'])T`%`"#T``!#+$("0TAA`R-+`00B1```(SP!!-9"`00I0(1(82R$
+M2"$@PP)A2",!:T"#&&!$`0360B``7B`!!")``@`A(/[_02Q"#T%(@A=&2'A(
+M*:0"!$)``@1!0`,$8T`#!&%````C+,,"(T@``"(L00(B2&,#8D@#!&%$``!B
+M/`$`-B`V=B!(H=?!0H[_/_0(`-\B`0360@,$*4"`2(,@(`!>(`$$(D```$$L
+MP0)!2`0`1"R$2&,@0@)#2&$#(T@!!")$!``D/`$`-B`V=B!(H=?!0N__/_0`
+M`%ZG"``^I1``7J48`'ZE0`#>(P&`^FL``+LG``"]([#_WB,``%ZW"``^M1``
+M7K48`'ZU(`">M0P$\$<)!/%'$@3_1T0&24(``$0LP0)$2`P`(.0#!%)",``^
+M(`,$84#"`D1(```C+$$"(TAB`T-(`@1!1```0SP2,$!"H?U`0O#_/_0*!/)'
+M,G9`2D``?B$0!.Q',``^(A,$ZT="`)XB``!]IP!`6VL``+HG``"](Q($_T<4
+M`$#M0`!>+`0$XD?"`DM(,``^+#``?B#!`B-(H@5!0`P`0/1``+X@$C!`0J$)
+M2D((`"#D`0120C``7B`!!")`PP*%2```02S"`D%(HP5B0/7_?^1``%XL0``^
+M(,,"04A"`#XL0@!>(,$"(DBA!6%``@`@Y*$%;$`$`"#T009)0@0`(:`_`!\@
+M!``@Y$$&24("`$$L`@`A(,`"04@``%ZG"``^I1``7J48`'ZE(`">I5``WB,!
+M@/IK``"[)P``O2,!`'1.``3_1R8`(.2A!5%"``3S1R,`(/0X!1%"6`080U@$
+M&$-8%`!#.0510@``?:<`0/MJ.Q=F2Y`79DL9``#JH9T,0@`$]$<6`"#D`@`4
+M3F0`/R`A!3!``0`S3`(`04!!!$)`804B0$$$(4!!!B)`80<B0$$&(4!A!2)`
+M80<A0&$'(D!!!B)`80<A0`$$(4`!!")`@;<D2(+W0T@A!2)`('8@2`&`^FL`
+M`+LG``"](Z#_WB,``%ZW"``^M1``7K48`'ZU(`">M2@`OK4P`-ZU.`#^M0X$
+M\4</!/)'"03S1PT$]$<!`/-#!03A1P0$_T<1`"#D`P2$0$``/B`#!&%`002$
+M0`$$(4`!!"]`"`!!+`@`(2#"`D%(```C+$$"(TAB`T-(`@1!1```0SP$,(!`
+MH0F%0.__/_0```XNT`(.2D``/B(2!.E'4`!^(E(`GB(``'VG`$!;:P``NB<`
+M`+TC!@3_1P0$_T<6!/]'&0`@Y5``OBQ0`!XA4@#^(!(`Z4,"!(1`0``^(`($
+M04##`JA(```B+,$"(DBC!6%`(7:`2,8$840#!.)'4@!>+,("1T@``",LP0(C
+M2*(%04`"`$#D-G:`2`,`X,,$,(!`H0F20.O_/_0```XNT`(.2E``GBU0`#X@
+MS`*!25(`?BU2`#X@RP)A24H$QD`*!$I!"@1/008`:BX&`"H@TP)A2DD$UD()
+M!"E!"00O008`B2X&`"D@U`*!2A$$[$<2!.M'=/]?TP8`+2P&`$T@00(B2&`'
+M`D@`!`%$!@`-/```#B[0`@Y*!`!J+@0`*B#3`F%*!`")+@0`*2#4`H%*$03L
+M1Q($ZT=C_U_3!``M+`0`32!!`B)(8`<"2``$`40$``T\```.+M`"#DH"`&HN
+M`@`J(-,"84H"`(DN`@`I(-0"@4H1!.Q'$@3K1U+_7],"`"TL`@!-($$"(DA@
+M!P)(``0!1`(`#3P```XNT`(.2@``:B[3`FI*``")+M0"B4H1!.Q'$@3K1T/_
+M7],``"TL00(M2&`'#4@`!`%$```-/```7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^
+MI3``WJ4X`/ZE8`#>(P&`^FM0!!!"4`000E`4`$(2!%)"!`0R0@``<2S!`G%(
+M000A0$$$(4!A52%`(O8!2B'V(4BB`T%`PP)Q2`L`0/3^_V0L_O^D(,$"94A!
+M!"%`000A0$%4(4`B]@%*(?8A2*('04`>`$#TPP)E2```5"Q"`E1(80-T2`$$
+M(D0``#0\```S+$$",TAC`W-(`P1A1```<SP!@/IK```Q+,,",4CR___#```Q
+M+,(",4@``#,L00(S2&(#4T@"!$%$``!3/`(`,2S"`B-(```T+$$"-$AB`U1(
+M`@1!1```5#P!@/IKH0,D0AH`(.0E%P9*,/8!2@(`,2#^_T$L0@]!2((71DA"
+M!$)`0@1"0($7IDAB!4%`"0!"("+V04BB5T)`WO]?]`(`,2P"`'$@P0(C2$$$
+M(4!!!"%`854A0"'V(4BA`P%"V/\_]!$$XT>A`V1`Z/\_]`&`^FL``+LG``"]
+M(]`M<""$`S"@`1`^1-#_(2"A]R=`#P`@Y```720``$(@!``BH-`M,+`A]B%(
+M008A0`@`0B!!!")`(``CM`$`/R`8`".P%``_(`P`([!5`#\@#@#@PP``720`
+M`$(@!``BH```([`A]B%(008A0`@`0B!!!")`(``CM`$`/R`8`".P%``_(`P`
+M([`C`#\@$``CL`&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$\4>$`S"@`1`^
+M1-#_(2"A]R=`%``@Y(@N<*<'`#\B`$!;:P``NB<``+TC$`3@1P$`/R(D`%\B
+M$P3_1ZSS7],'!/]':P"_(`8$_T=K`)\@(#$`0"$``/13`+\@4P"?(#<`/R`<
+M`.##B"YPIP<`/R(`0%MK``"Z)P``O2,0!.!'!@`_(B4`7R(3!/]'F/-?TP``
+MX$,'!/]'H?4'0`*0`$`R`+\@A00B1,'_("!``-\@A@0G1`10QD"B]0=`%``G
+M(($$1T0,`"FP``3B1_'_1"`%`"0@P00"1!``*;`$`"F@``3_1S'V(4@B]N%(
+MH@,B0B'VH4BA`S%``@1!1`8`0.0B]L%(H@,B0B'V@4BA`S%``@1!1,`T0$0`
+M`.!#``!>IP@`/J40`-XC`8#Z:P``NR<``+TC\/_>(P``7K<(`#ZU"03P1^PQ
+M4*(R%T9*DA=&2N@Q,*`2`$%",C=!2@!^/R`2`$%&`0`_)`"`(2`2!$%&$@#R
+M0P$`/R8PF3$B``!]IP!`6VL``+HG``"](P$`/R"T,2FP``!>IP@`/J40`-XC
+M`8#Z:P``NR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`?K4)!/!'"P3P1]`M4"$8
+M`"J@``3_1T0`(.2T,3"@H34@0$``(.0!`#\F,)DQ(@``?:<`0%MK``"Z)P``
+MO2,``.!#`0`_)`"`(2`!``%$-0`@]"'V`4B"-B-(!`!*L('V`D@!<"!$H54@
+M0`L`(.2``RF@P5(@2*$W*$`$`"#T4!0IH,%2($@!!")``@#@PP0`*J`%`"$@
+M!``JL(0#*Z`!$#Y$T/\A(*'W)T`,`"#D$`3K1Z@`0-,$`(J@(?:!2!0`:J`B
+M]F%(H0,B0`,`(/0A!8-`!``JL`$`X,,$`.JSM#'ILQ`$ZT<1!.I'4O]?TPT`
+M`/00!.M'$03J1Q$`0-,)``#D$`3K1Q$$ZD<=`$#3!0``[`(`/R"T,2FP`0`_
+M(,@Q*;"P,>FSM#$)H```7J<(`#ZE$`!>I1@`?J4@`-XC`8#Z:P`$_T<$`#&@
+M(O8A2`P`,:`A]B%(H0=!0`0`(/00`#&@(?8A2*$#04`!`"#T`0`?(```X$,!
+M@/IK``"[)P``O2.$`S"@`1`^1-#_(2"A]R=```!=)```XB`"`"#T```])```
+MX2```#&@(_8A2$$&8T!!!"=`"``A("``,;0$`%&@(O9!2!``,:`A]B%(H@-!
+M0"0`0/3__Q\@6P!@Y`0`4:`(`%&P(O9!2!``,:`#!.%'(?8A2*(#04`8`$#T
+M```QH`($X4<5`"#D)O9A2/__HB```+&P)/:A2$,&A$!#!&=`(``QI!@`0Z`0
+M`"&@(@5!0`($0D`(`#&@(04B0`@`,;`(`&,@(`!QM"'V(4BA`R9``@`@]`($
+MY4?L_Y_T`0`?(`&`^FL$`%&@(O9!2`P`,:`A]B%(H@=!0``$_T<R`$#D```G
+MH/__(2```%&@(O9!2"'V(4BB!4%`_O\`("H`0/0$`%&@"`!1L"+V04@,`#&@
+M!`3A1R'V(4BB!T%`(0!`Y```1Z#__T(@```QH`,$X4<A]B%((O9!2*$#(D`9
+M`"#D)O:!2`$`@R```)&P)?:!2$,&I4!#!&=`(``QI!@`0Z`0`"&@(@5!0`($
+M0D`(`#&@(04B0`@`,;`(`&,@(`!QM"'V(4BA!R9`!@`@Y```)Z#__R$@`P3D
+M1R'V(4BA`Z%`Z/\_]`(`'R`!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU
+M&`!^M0H$\$?0+7`A%`#KLX@N<*<'`#\B`$!;:P``NB<``+TC$`3@1P$`/R(D
+M`%\B$P3_1V7R7].@-0!`(P``Y"``*Z0"`"$@_O\A+4D/(4F)%R9)B"YJIQ`$
+MZD<'`#\B`$!;:P``NB<``+TC$`3@1P0`/R(@`%\B$P3_1U/R7],``.!#*?8A
+M2:$U($$(`"#T!0`@Y:%5($$'`"#TH74@00@`(/0)`.##%`#KLP<`X,,4``NP
+M!0#@PP$$`$#[_R$@`0#@PP$$`$`4`"NP``!>IP@`/J40`%ZE&`!^I2``WB,!
+M@/IK``"[)P``O2/0_]XC``!>MP@`/K40`%ZU&`!^M2``GK4+!/!'"@3R1PD$
+M\T<,!/1'$`3Q1Q$$\D<``'VG`$!;:P``NB<``+TC``#@0___*2$I]B%)AG8@
+M20GP($4*`.I#'P!`[0$`_R!4%H!!"``?(04$*D$!`.5#HADA0($4040A!^%(
+M__\A("('Z4C__T(@`0@B1"$'-$@!`.%#)/;!2$0$BT```&2@`P%A1"('"4@B
+M!U1(`@!!1`,$8D0``&2P*A&A0"(%"4$A]@%(@08B2```X4,)!/]'!C#`0.3_
+M7_T``%ZG"``^I1``7J48`'ZE(`">I3``WB,!@/IK``"[)P``O2.P_]XC``!>
+MMP@`/K40`%ZU&`!^M2``GK4H`+ZU,`#>M3@`_K4-!/!'#P3Q1P(`,2P"`%$@
+MP0(B2('6(4@"`"#@``(_(@T`X,,$`%$@_O\B+$$/(DB!%R9(`@`@^``$/R(&
+M`.##`@`Q+`(`42#!`B)(`1`B1``!/R+15"!$``!]IP!`6VL``+HG``"](PL$
+MX$<,!/]'```@H"``(.P!`-\E`(?.(6D%C$%)!"M!(`!)(0L`:BXK`"D@TP!A
+M2A`$[4<1!.M'#@!?(A0$_T<``'VG`$!;:P``NB<``+TC``#@0P@`*BXH`"DA
+MT0`I2E$$+D(1`/%#$`3M1Q($X$<``'VG`$!;:P``NB<``+TC##"`00``*Z"A
+M#2Q`XO\_Y`(`+RP"`$\@P0(B2`$0(D1)`"#T$`3M1P@`/R(``'VG`$!;:P``
+MNB<``+TC"P3@1PP$_T<``""@/P`@[`$`/R0`AR$@0``^L&$%C$%)!"M`(`!)
+M(0@`*BPH`$D@P0`B2$``7J!!!")`#@#A0P4`*BPE`$D@P0`B2"L`(/0+`&HN
+M*P#I(=,`;TH0!.U'$03K1PX`7R(4!/]'``!]IP!`6VL``+HG``"](P``X$,0
+M!.U'$03N1Q($X$<``'VG`$!;:P``NB<``+TC"0!J+"D`22#!`&)(%``@Y$$$
+M+D`.`.%#"P!J+M,`;TH0!.U'$03K1PX`7R(!`)\B``!]IP!`6VL``+HG``"]
+M(P``X$,0!.U'$03N1Q($X$<``'VG`$!;:P``NB<``+TC##"`00``*Z"A#2Q`
+MQ/\_Y```7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WJ4X`/ZE4`#>(P&`^FL`
+M`+LG``"](]#_WB,``%ZW"``^M1``7K48`'ZU(`">M0H$\$<)!/%'`0`_)AR`
+M,2(``'VG`$!;:P``NB<``+TC@#\_(````40"`"DL`@`I(<$"*4B!UB%(!P`@
+MX`0!?R&`'U\D&P`_)!,`7R*L#3\A%`"?(08`X,/2`'\A@!]?)#8`/R0)`%\B
+M2`T_(0H`GR$2!$!&$@1!1A($0D80!.I'`0`_)AR`,2(``'VG`$!;:P``NB<`
+M`+TC$`3J1W`0/R(2!.M'``!]IP!`6VL``+HG``"](Q`$ZD>P$#\B$@3I1P``
+M?:<`0%MK``"Z)P``O2,0!.I'\!`_(@``?:<`0%MK``"Z)P``O2/P_S\D_P,A
+M(````40A5X%)``0!1```X$,0!.I'\!`_(A($X$<``'VG`$!;:P``NB<``+TC
+M``!>IP@`/J40`%ZE&`!^I2``GJ4P`-XC`8#Z:P``NR<``+TCT/_>(P``7K<(
+M`#ZU$`!>M1@`?K4@`)ZU*`"^M0P$\$<)!/%'#"XPH`"`/R81`3%$``!]IP!`
+M6VL``+HG``"](PT`X$,0!.Q',``_(@``?:<`0%MK``"Z)P``O2,``.!#@98`
+M2`OP)T0*`.M#!@`@Y24`/R`A!2M`(?8A2($V($@*`$%!`P#@PZ$W8$$B,4!!
+MB@0B1"'V04FA!2M`#0`@]`_\7R(2`!)$(9=`2?`#7R`!`")$$@1!1A(`\D,0
+M!.Q',``_(@``?:<`0%MK``"Z)P``O2,0!.Q'$03M1P``?:<`0%MK``"Z)P``
+MO2,@]D%)H`4+0``X`$0``%ZG"``^I1``7J48`'ZE(`">I2@`OJ4P`-XC`8#Z
+M:P``NR<``+TC\/_>(P``7K>8`S"@(78@2*$-,4``!/]'"``@]'$%,4)1!#%"
+M400P0M`N,2(``'VG`$!;:P``NB<``+TC``!>IQ``WB,!@/IK``"[)P``O2/P
+M_]XC``!>MP,$\D>8`S"@(78@2*$-,4``!/]'"0`@]'(%,4)2!%)"4@100M`N
+M4B(1!.-'``!]IP!`6VL``+HG``"](P``7J<0`-XC`8#Z:P``NR<``+TCP/_>
+M(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M3``WK4+!/!'#03Q1PP$\D>0`W`@
+M"P#?(2+V(4JA54!`"@`@]*%70$`#`"#DH35`0!L`(/0N`.##H75`0`D`(/2A
+ME4!`#@`@]"D`X,,(`".@(78@2"HQ($`%`#\DP``A(`4`X,,(`".@(78@2"I1
+M($`%`#\DP`$A(`X$P44>`.##"``CH"%V($@J<2!`805*04$$(4!!!#!`U"XA
+MH!$`X,,*!/]'"``CH`($X4<A=B!("0`@Y&$%2D%!!"%`000P0-0N(:`$`"#D
+M"C!`02%V0$BA#2I`]_\_Y`@`(Z`A=B!(H04J0/__'R`E`"#T`@#@P___'R`B
+M`.##805*04$$(4!)!#!`T"XI(00`*:#__Q\@&P`@]!`$Z4<\`#\B``!]IP!`
+M6VL``+HG``"](P0`J;$,`(#U#`#)L0(`/R`4`"FP__\_(!@`*;#_`S\@'``I
+ML`H`/R0!5"%$(``IL#0`Z;,&`.##,``LH#0`*;`0!.M'$03J1Q($[$=P_U_3
+M``3J1P``7J<(`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WJ5``-XC`8#Z:P``NR<`
+M`+TCX/_>(P``7K<(`#ZU$`!>M1@`?K4)!/!'O"Y0HO\#?R$2`$M&Q"XPH"$7
+M(DC_`U\E`0`J1!($04:D`#\B``!]IP!`6VL``+HG``"](\`N2:(2`$M&R"XI
+MH"$7(D@!`"I$$@1!1A`$Z4>H`#\B``!]IP!`6VL``+HG``"](Q`$Z4>L`#\B
+M``!]IP!`6VL``+HG``"](P#\/R````%$S"XIH`$`*T0`!`%$``#@0Q`$Z4>L
+M`#\B$@3@1P``?:<`0%MK``"Z)P``O2,``%ZG"``^I1``7J48`'ZE(`#>(P&`
+M^FL``+LG``"](_#_WB,``%ZWF`,PH"%V($@B]B%*H0<B0``$_T<>`"#T(?8A
+M2F$%(4!!!"%`1`0P0-`NA"`$`"2@``3_1Q8`(.0$`.2S`0!?("('44@"!>)'
+MO"XPH`$`(D2\+C"PP"XPH`$`(D3`+C"PQ"XPH`$`(D3$+C"PR"XPH`$`(D3(
+M+C"PS"XPH`$`(D3,+C"P$03D1Z'_7],!`!\@``!>IQ``WB,!@/IK``"[)P``
+MO2.P_]XC``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU,`#>M3@`_K4+!/!'#`3Q
+M1PT$\$?H$W"DF`,PH"%V($@B]B%*H0<B0``$_T=M`2#T(?8A2F$%(4!!!"%`
+M2@0P0-`N2B$$`"J@`0`?(&4!(.08`$J@(O9!2/__/R"!%B1(H@5!0!0`0.0&
+M`&#D```CH,%2($@!$#1$H14T0!\`?R`!`"#T#P!_(`$`7R`A]F%(`P3A1Z$#
+M04`(`"#D`01"0`$T($0"`.%#(?9!2*$#(T#Z_S_T`0#@PQ@`2J!)%(!!0!`I
+M(A$`\4/_`U\B$@!21!P`2J`B5T%($``_)`#\(2`"`$%$$@1"1A0`*J`AER)(
+M\`]?)`$`(D02!$%&$@#R0Q`$ZT<``'VG`$!;:P``NB<``+TC@!`I(A$`\4,@
+M`"J@DI8A2!(07D8!\"%$$@1!1@@`/R0`("$@$@1!1A`$ZT<``'VG`$!;:P``
+MNB<``+TC``@_($``/K0``?\A)`!*HA$`0.;`""DB$0#Q0S+V0$HH`"J@(1<C
+M2!($0482`/)#$`3K1P``?:<`0%MK``"Z)P``O2,H`"J@`0E?(`$(?R""!"-$
+M0`!>M#``2J(+`$#F412`00`),2(1`/%#,O9`2@`!/R02!$%&$`3K1P``?:<`
+M0%MK``"Z)P``O2-1%(!!P!`Q(A$`\4,L`$JB$``_)/__(2`2`$%&+``JH!``
+M7R2"%"!$$@1"1A`$ZT<``'VG`$!;:P``NB<``+TC,``JH`<`(.0,`"J@`1`D
+M1`0`(.0``C\@0`!^I`,$841``'ZT#``JH`$0*$0$`"#D0`!>I`&Q040!5"!$
+M0``^M$``?J0!\&%$$P`@Y`P`*J"!%B%(`@`@X`$4:$0"`.##0`!>I`$12$0!
+M`.%#0``^M`P`*J`!$#!$`P`@Y$``?J0!%&1$`@#@PT``7J0!$41$`0#A0T``
+M/K0,`"J@@18B2`(`(.`@`#\D#P3A10P`*J"!]B)(`@`@X``"/R`/!.%%#``J
+MH`0`7R0!`")$`@`@Y`\$XD4%`.###`!*H`(`/R0"`$%$`03A1<\$040,`"J@
+M@78B2`(`(.``0#\@#P3A10P`2J`0`#\D`@!!1`$$X47/!$%$!``JH"+V(4BA
+M54!``P`@]*%U0$`'`"#T)`#@PT``?J0!5'1$`0#A0T``/K0E`#\D'0#@PT``
+M7J0!5$Q$`0#A0T``/K0P`"J@%@`@]```/:0``$&@```]I```(:`B!4%`U#%-
+MHC(%0D(``#VD```AH#(%04(R5T%*$@#R0U$4@$$`"3$B$0#Q0P`!/R02!$%&
+M$`3K1P``?:<`0%MK``"Z)P``O2,$`#\D#P3A13@`*J`"`"#@)``_)`\$X45)
+M%(!!P`DI(`X`X4,0!.M'$03N1T``7J8``'VG`$!;:P``NB<``+TC`!$I(0D`
+MZ4,0!.M'$03I1Q($[T<``'VG`$!;:P``NB<``+TC-``JH"8`(.02!(Q!$A!*
+M0A`$ZT<`"S\B``!]IP!`6VL``+HG``"](S0`2J(0!.M'!`L_(@``?:<`0%MK
+M``"Z)P``O2,0!.M'"`L_(@D`7R(``'VG`$!;:P``NB<``+TC$`3K1Q$$[D<`
+M`'VG`$!;:P``NB<``+TC`!`_(``$`40``.!#$`3K1Q$$[D<2!.!'``!]IP!`
+M6VL``+HG``"](PP`*J`%`"#@`0!?("('3$B\+BV@`00B1`0`X,,!`#\@(0<L
+M2+PN3:`!`4%$O"XML`P`*J`%`"#@`0!?("('3$C`+BV@`00B1`0`X,,!`#\@
+M(0<L2,`N3:`!`4%$P"XML`P`*J`!4"!$!0`@Y`$`7R`B!TQ(Q"XMH`$$(D0$
+M`.##`0`_("$'+$C$+DV@`0%!1,0N+;`,`"J@`9`@1`4`(.0!`%\@(@=,2,@N
+M+:`!!")$!`#@PP$`/R`A!RQ(R"Y-H`$!043(+BVP#``JH`$0(40%`"#D`0!?
+M("('3$C,+BV@`00B1`0`X,,!`#\@(0<L2,PN3:`!`4%$S"XML!`$ZT<1!.I'
+M'/Y?TP$`'R```%ZG"``^I1``7J48`'ZE(`">I2@`OJ4P`-ZE.`#^I5``WB,!
+M@/IK``"[)P``O2/P_]XC``!>MU$4($(`"#$B$0#Q0P``?:<`0%MK``"Z)P``
+MO2,``%ZG$`#>(P&`^FL``+LG``"](_#_WB,``%ZW410@0@`(,2(1`/%#``!]
+MIP!`6VL``+HG``"](P$`'R```%ZG$`#>(P&`^FL``+LG``"](_#_WB,``%ZW
+M`0!?(C('44H2`/)#0`@_(@``?:<`0%MK``"Z)P``O2,!`!\@``!>IQ``WB,!
+M@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU&`!^M0L$\$<*!/%'410@0@`*
+M,2(1`/%#``!]IP!`6VL``+HG``"](PEP`$0+`"#U$`3K1T`(/R(``'VG`$!;
+M:P``NB<``+TC`0`_("$'*D@```%$(/8!2,DT`$0`!.E'``!>IP@`/J40`%ZE
+M&`!^I2``WB,!@/IK``"[)P``O2.P_]XC``!>MP@`/K40`%ZU&`!^M2``GK4H
+M`+ZU,`#>M3@`_K4*!/!'"P3Q1P$`7R(R!U%*$@#R0X`(/R(``'VG`$!;:P``
+MNB<``+TCZ`/?(1`$ZD<1!.M'Q?]?TP<``.1D`!\B``!]IP!`6VL``+HG``"]
+M(RXQP$'U_]_U$`3J1Q$$ZT>Z_U_3C@``Y'P#*J`A]B%(HO4@0*%U(4`"!$%$
+M"P!`]'P#*J`A]B%(HE4A0`<`0/2A-2%`!0`@]($`0.2``RJ@(78@2*%W($!]
+M`"#D#`3_1P$`OR5,@*TA`0`_)`"!(2!``#ZT"@`_)&0`(2!(`#ZT`0#_)?R`
+M[R$0!.I'$03M1P``?:<`0%MK``"Z)P``O2,)`.!#$`3J1T``/J9(`%ZF``!]
+MIP!`6VL``+HG``"](R#V(4F)5@%(,G8@20$`/R02!$%&$`3J1Q$$[T<``'VG
+M`$!;:P``NB<``+TC$`3J1Q$$[4<``'VG`$!;:P``NB<``+TC(/8!2(!6`4B@
+M!0E``P``]`PP@$&A-X!!VO\_]!`$ZD<!`#\F2(`Q(@``?:<`0%MK``"Z)P``
+MO2-``#\D``0!1```X$,0!.I'`0`_)DB`,2(2!.!'``!]IP!`6VL``+HG``"]
+M(\@`'R(``'VG`$!;:P``NB<``+TC$`3J1P$`/R;\@#$B``!]IP!`6VL``+HG
+M``"](___/R3__R$@```!1```X$,0!.I'`0`_)OR`,2(2!.!'``!]IP!`6VL`
+M`+HG``"](V0`/R$)`.##__\I(`D`X4,A]B%("0`@Y`H`'R(``'VG`$!;:P``
+MNB<``+TC$`3J1Q$$ZT<__U_3\_\?]!`$ZD<!`#\F2(`Q(@``?:<`0%MK``"Z
+M)P``O2/`_S\D__\A(````40``.!#$`3J1P$`/R9(@#$B$@3@1P``?:<`0%MK
+M``"Z)P``O2,0!.I'@`@_(A($_T<``'VG`$!;:P``NB<``+TCH`/N0P``7J<(
+M`#ZE$`!>I1@`?J4@`)ZE*`"^I3``WJ4X`/ZE4`#>(P&`^FL``/ZB"``>HQ``
+M/J,8`'Z@(``>H2@`GJ,P`'ZB.`#>H$``WJ)(`+Z@[#$PH"$7)DB!%R9(%0"A
+M0J'WIT*5]"=$_P\_(!(`048U%Z)*$@151A(`\D,"$`1%@``_)`0$048!`$#T
+M!`#R0R(W8T@`'C\D`P!!1`$$@T0``5\D`00B1`(`X4,"``#Q`02#1`(`X4,!
+M$`)%H0/A0R&W(T@!!$%$"P!1+`@`<2P(`/$@Y`PG2&$%)TA"#$=(0P1G2`($
+M1$0#!&%$"P!1/`@`<3PBEX)*(3>C2`$$(D0CM\-()'?#2@)0`$6B`^)#(A=#
+M2`$$(T0!!"1$`0#A0P$$(D0/`%$L#`!Q+`P`T2#D#"9(804F2$(,1DA#!&9(
+M`@1$1`,$840/`%$\#`!Q/"(7`DL/`#\D`@!!1`$0"$6A`^%#(?<A2`($0403
+M`'$L$`"1+!``,2#E#$%(8@5!2$,,84A$!(%(`P1E1`0$@D03`'$\$`"1/!<`
+M42P4`'$L%``Q(.0,X4IE!>%*0@Q!2$,$84@"!$1$`P1E1!<`43P4`'$\(O8A
+M2___/R"!%B1(H@5!0"$`0/0,`+$L#P"1+,($IDA!#89(`@1!1".W(4L0`#\D
+M`.`A(`,`840"!$-$X0Q&2&(%1DA$#(9(102F2`0$@40%!*)$#P"1/`P`L3P(
+M`)$L"P!Q+,$$ATA"#6=(`00B1`!`7R0!!")$X@PG2&$%)TA##&=(1`2'2`,$
+M8D0$!(%$"P!Q/`@`D3P!D`%%/P`@Y`%_/R0`_R$@@0<\2``$_T<[`"#@"`!Q
+M+`L`,2P(`%$@PP1B2$$-(D@#!&%$`1`!10"`7R2"%"!$`9``1:$#X4,AUR)(
+M`@1!1`,$8D0+`%$L"`"1+`@`,2#E#&%(8P5A2$(,04A$!(%(`@1%1`0$@T0+
+M`%$\"`"1/!``L2P3`)$L$`!Q(,($HTA!#8-(`@1!1/]_/R`!`&%&`@1!1.$,
+M0TAB!4-(1`R#2$4$HT@$!(%$!02B1!,`D3P0`+$\%`"Q+!<`D2P4`'$@P02C
+M2$(-@T@!!")$(I>"2P$$(D3B#"-(804C2$0,@TA%!*-(!`2"1`4$H407`)$\
+M%`"Q/`$`'R`!@/IK```>H0@`_J`E`&#F$`#1+!,`L2P0`)$@P@3$2$$-I$@"
+M!$%$(9=B2O``?R0!`"-$`@1!1`$`/R0`@"$@`@1!1.$,1$AB!41(10RD2$8$
+MQ$@%!*%$!@3"1!,`L3P0`-$\%`"Q+!<`D2P4`'$@P02C2$(-@T@!!")$(K=`
+M2@$$(D3B#"-(804C2$0,@TA%!*-(!`2"1`4$H407`)$\%`"Q/"4`H.80`-$L
+M$P"Q+!``D2#"!,1(00VD2`($040A%Z-*``]_)`$`(T0"!$%$`0`_)`"`(2`"
+M!$%$X0Q$2&(%1$A%#*1(1@3$2`4$H40&!,)$$P"Q/!``T3P4`+$L%P"1+!0`
+M<2#!!*-(0@V#2`$$(D0B5X%*`00B1.(,(TAA!2-(1`R#2$4$HT@$!()$!02A
+M1!<`D3P4`+$\(P#@Y!``L2P3`)$L$`!Q(,($HTA!#8-(`@1!1"&7XT@"!$%$
+M`0`_)`"`(2`"!$%$X0Q#2&(%0TA$#(-(102C2`0$@40%!*)$$P"1/!``L3P4
+M`+$L%P"1+!0`<2#!!*-(0@V#2`$$(D0B]P%)`00B1.(,(TAA!2-(1`R#2$4$
+MHT@$!()$!02A1!<`D3P4`+$\`0`?(`&`^FL(`+$L"P"1+`@`<2#!!*-(0@V#
+M2`$$(D0`(%\D`00B1.(,(TAA!2-(1`R#2$4$HT@$!()$!02A1`L`D3P(`+$\
+M`8#Z:Q0`8.8,`+$L#P"1+`P`<2#!!*-(0@V#2`$$(D0!`.%#`!!?(,(4@$8!
+M!#)$`00B1.(,(TAA!2-(1`R#2$4$HT@$!()$!02A1`\`D3P,`+$\8@#@PS@`
+M@.8+`'$L"`"1+`@`,2`"!/]'X@Q!2$,,84A$!(%(`P1B1`L`<3P(`)$\#P!1
+M+`P`<2P,`#$@Y`Q!2F4%04I"#$%(0P1A2`($1$0#!&5$#P!1/`P`<3P0`%4L
+M$P`U+!``=2#"!$-(00TC2`($0403`'$L$`"1+!``,2#E#$%(8@5!2$,,84A$
+M!(%(`P1E1`0$@D03`'$\$`"1/!0`52P7`#4L%`!U(,($0TA!#2-(`@1!1!<`
+M<2P4`)$L%``Q(.4,04AB!4%(0PQA2$0$@4@#!&5$!`2"1!<`<3P4`)$\*0#@
+MPP8$_T<+`%$L"`!Q+`@`,2#D#,%(0@Q!2$,$84@"!$1$"P!1/`@`<3P`$%\@
+M`@1"1@\`<2P,`)$L#``Q(.4,04AB!4%(0PQA2$0$@4@#!&5$!`2"1`\`<3P,
+M`)$\$P!1+!``<2P0`#$@Y`S!2$(,04A#!&%(`@1$1!,`43P0`'$\%P!1+!0`
+M<2P4`#$@Y@S!2$(,04A#!&%(`@1&1!<`43P4`'$\!03_1Q\`42P<`'$L'``Q
+M(.0,H4A"#$%(0P1A2`($1$0?`%$\'`!Q/!L`42P8`'$L&``Q(.4,H4A"#$%(
+M0P1A2`($140;`%$\&`!Q/`$`'R`!@/IK'`!1+!\`,2P<`'$@P@1#2$$-(T@"
+M!$%$#P`?(!D!0.`<`#$L'P!1+!P`<2#!!"-(0@U#2`$$(D0A=R9(@I8F2```
+M,BQ!`C)(8@-22`($040``%(\&``Q+!L`42P8`)$@P00D2$(-1$@!!")$@18B
+M2`(`4BP"`'(@0@)#2&$#(T@!!")$`@`R/`0`<BP$`+(@0P!E2`0`<CP8`%$L
+M&P`Q+,($1$A!#21(`01!1"@`(/`!4"!$!@`@Y,$`94@!-"!$0@!E2&$!)4@!
+M!")$!``R/!@`,2P;`%$L&`!Q(,$$(TA"#4-(`00B1`$0(40(`"#D!`!R+`0`
+M4B#!`&)(`50@1$,`8DAA`2)(`00C1`0`,CP8`#$L&P!1+!@`<2#!!"-(0@U#
+M2`$$(D0!D"!$"``@Y`0`<BP$`%(@P0!B2`&4($1#`&)(80$B2`$$(T0$`#(\
+M'``Q+!\`42P<`'$@P00C2$(-0T@!!")$@;8B2`%P($0+`%(L"P!R($(`0TAA
+M`2-(`00B1`L`,CS"`"-(H35`0!$`(/2A/4!``@`@Y`8`0.0P`.##H55`0!,`
+M(/2A=4!`&P`@]"L`X,,4`%$L%P`Q+!0`<2#"!$-(00TC2`$$040!\"-$'0#@
+MPQ0`,2P7`%$L%`!Q(,$$(TA"#4-(`00B1(&V($@'`.##%``Q+!<`42P4`'$@
+MP00C2$(-0T@!!")$@58A2`'P(T0!]2]$"P#@PQ0`42P7`#$L%`!Q(,($0TA!
+M#2-(`@1!1!``/R0`@"$@`@!!1(+V04@!]4]$!0!2+`4`<B!"`$-(80$C2`$$
+M(D0%`#(\'`!1+!\`,2P<`'$@P@1#2$$-(T@"!$%$(``_)`#@(2`"`$%$@;9!
+M2`8`4BP&`'(@0@!#2&$!(T@!!")$!@`R/!@`,2P;`%$L&`"1(,$$)$A"#41(
+M`00B1`$0/D2!EB!(!P!2+`<`<B!"`$-(80$C2`$$(D0'`#(\&``Q+!L`42S!
+M!"1(0@U$2`$$(D2!%B%(`?`A1`@`4BP(`'(@0@!#2&$!(T@!!")$"``R/`L`
+M4BP+`#(@P@!!2*%50$`7`"#TH5U`0`,`(.2A-4!`(P`@]#(`X,.A=4!`,``@
+MY!``42P3`#$L$`!Q(,($0TA!#2-(`@1!1((60T@"\$%$"`"2+`@`<B#!`(-(
+M`01!0$0`@TAA`2-(`00D1`@`,CP0`%$L$P`Q+!``<2#"!$-(00TC2`($042"
+MED)(`O!!1`@`DBP(`'(@P0"#2`$$04!$`(-(80$C2`$$)$0(`#(\$`!1+!,`
+M,2P0`'$@P@1#2$$-(T@"!$%$@A9"2`+P040(`)(L"`!R(,$`@T@!!$%`1`"#
+M2&$!(T@!!"1$"``R/!@`42P;`#$L&`!Q(,($0TA!#2-(`@1!1`$`/R0`\"$@
+M`@!!1(&604@)`%(L"0!R($(`0TAA`2-(`00B1`D`,CP<`#$L'P!1+!P`<2#!
+M!"-(0@U#2`$$(D2!%B-(`@!?(,(R($0!!.)'"@!2+`H`<B!"`$-(80$C2`$$
+M(D0*`#(\``3_1P&`^FL``#&@I$A0H`$`(D0``#&PI$A0H`$!042D2#"P`8#Z
+M:P``NR<``+TC\/_>(P``7K<(`#ZU"03P1TPN,"(``'VG`$!;:P``NB<``+TC
+M$`3I1P$`/R8D@3$B$@3_1P``?:<`0%MK``"Z)P``O2,0!.E'`0`_)BB!,2(2
+M!/]'``!]IP!`6VL``+HG``"](Q`$Z4=``#\B$@3_1P``?:<`0%MK``"Z)P``
+MO2,0!.E'`0`_)C"!,2("`%\F``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F.($Q
+M(@`"7R8``'VG`$!;:P``NB<``+TC``!>IP@`/J40`-XC`8#Z:P``NR<``+TC
+M\/_>(P``7K<(`#ZU"03P1T``/R(&`%\B``!]IP!`6VL``+HG``"](TPN*2(0
+M!.E'``!]IP!`6VL``+HG``"](Q`$Z4<!`#\F)($Q(A($_T<``'VG`$!;:P``
+MNB<``+TC$`3I1P$`/R8H@3$B$@3_1P``?:<`0%MK``"Z)P``O2,``%ZG"``^
+MI1``WB,!@/IK!`3_1V$%A$!A!21`008P0"@R02PH,B$@P@)!2```,:`A=B!(
+MH@5!0``$Y$<B`$#T806$0&$%)$!%!C!`(#+%(`@`1BPH,F4@P0)#2!8`(/0`
+M`#&@0@)#2&$#(T@!!")$"``F/```,:#!4B!("@!&+"HR92!"`D-(80,C2`$$
+M(D0*`"8\!``QH`P`1BPL,F4@0@!#2&$!(T@!!")$#``F/``$Y$<!@/IK!#"`
+M0*'WAT#4_S_T``3_1P&`^FL@,A"D`8#Z:P``NR<``+TC\/_>(P``7K<(`#ZU
+M"03P1TPN,"(``'VG`$!;:P``NB<``+TC$"X)(```7J<(`#ZE$`#>(P&`^FL`
+M`+LG``"](^#_WB,``%ZW"``^M1``7K48`'ZU"@3P1PL$\4<)!/!'D`,PI($6
+M(T@!,"!$%#(PL"@R$"(`%C\B``!]IP!`6VL``+HG``"](P8$_T<'`+\B`@`?
+M(/0!GR/(`/\@9``_(R@`'R,'`/\BP`#?)@S^UB+``!\E*!$907P#*J"AUR!`
+M"0`@Y&$%QD!A!29`008I0"`R82`0`$,L,#(A($(`04AA`:%*"`#@PV$%QD!A
+M!29`008I0"`R82`0`$,L,#(A($(`04AA`0%(`00B1!``(SQA!<9`804F0$4&
+M*4`P,H4@#`"$LQ``Y+`4`.2P0#(E(`@`(;,0``&S#`#ALB`R92`4`",L-#)%
+M($$`(D@4`",\%0`C+#4R12!!`")(%0`C/!``(RS!`"1($@!#+#(RA2!"`$1(
+M80$D2`$$(D02`",\$P`C+#,R12!!`")($P`C/!0R*:`#`"#D8#(E(`P`P;(0
+M``&Q!C#`0*'WQT#"_S_T%#(IH!(`(.1L,DFB$`3J1P$`/R8L@3$B``!]IP!`
+M6VL``+HG``"](W`R2:(0!.I'`0`_)C2!,2(``'VG`$!;:P``NB<``+TC$`3J
+M1_/^7]-D`#\@&#(IL`,`8.40,BF@`30@1`(`X,,0,BF@`3$@1!`R*;```%ZG
+M"``^I1``7J48`'ZE(`#>(P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$\$<4
+M,C"@$0`@Y!'_7],0!.E'`0`_)BR!,2(2!/]'``!]IP!`6VL``+HG``"](Q`$
+MZ4<!`#\F-($Q(A($_T<``'VG`$!;:P``NB<``+TC``!>IP@`/J40`-XC`8#Z
+M:P``NR<``+TC8/_>(P``7K<(`#ZU$`!>M1@`?K4@`)ZU*`"^M3``WK4+!/!'
+M#`3P1R`RL*4Q]B%*H=<@0@`$_T=:`B#D```])```(2!!!"%"```AH`$$H4-3
+M`N%K#@3R1Z&70$(`!/]'4`(@Y`$`/R90F#$B``!]IP!`6VL``+HG``"](Q#P
+M/R3__R$@```!1"KVP4E)!$M!*$@IH"&7(DCP#U\D`0`B1``$`40``.!#$`3K
+M1P$`/R90F#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.M'`0`_)ER8,2(``'VG
+M`$!;:P``NB<``+TC?X`_(````4102"F@(?<@2(!_7R`!`")$``0!1```X$,0
+M!.M'`0`_)ER8,2(2!.!'``!]IP!`6VL``+HG``"](Q`$ZT<!`#\F7)@Q(@``
+M?:<`0%MK``"Z)P``O2/`_S\D_W\A(````40\2$F@(O=!2$``/R0`@"$@`@!!
+M1``$`D0``.!#$`3K1P$`/R9<F#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.M'
+M`0`_)EB8,2(``'VG`$!;:P``NB<``+TC!/P_)/__(2````%$9$@IH"%7(DC\
+M`U\D`0`B1``$`40``.!#$`3K1P$`/R98F#$B$@3@1P``?:<`0%MK``"Z)P``
+MO2,(`"V@P3`@2*$#*D`$`"#D$"XKH`$`(2`0+BNP"`#@PP@`+:#!,"!((O;!
+M2:$'(D`#`"#T%"XKH`$`(2`4+BNP"`!-H"*V7TAA,<!)C@'@PP``/20``$&@
+M```A(`0`(:!``%ZP1``^L```/20``$&@```A(`0`(:!0`%ZP5``^L```/20`
+M`$&@```A(`0`(:!@`%ZP9``^L```/20``$&@```A(`0`(:!P`%ZP=``^L```
+M/20``$&@```A(`0`(:"``%ZPA``^L```/20``$&@```A(`0`(:"0`%ZPE``^
+ML*X#\D,!`#\F;)@Q(@``?:<`0%MK``"Z)P``O2/@_S\D_S\A(````40J]L%)
+M211`04``/B`)!"%!``!)H"+704@@`#\D`,`A(`(`040`!`)$``#@0Q`$ZT<!
+M`#\F;)@Q(A($X$<``'VG`$!;:P``NB<``+TC$`3K1P$`/R9LF#$B``!]IP!`
+M6VL``+HG``"](R#P/R3__R$@```!1!``*:`AMR)(X`]?)`$`(D0`!`%$``#@
+M0Q`$ZT<!`#\F;)@Q(A($X$<``'VG`$!;:P``NB<``+TC$`3K1P$`/R9HF#$B
+M``!]IP!`6VL``+HG``"](P+_/R3__R$@```!1"``*:`A-R)(_@!?)`$`(D0`
+M!`%$``#@0Q`$ZT<!`#\F:)@Q(A($X$<``'VG`$!;:P``NB<``+TC$`3K1P$`
+M/R9HF#$B``!]IP!`6VL``+HG``"](P"!/R3__R$@```!1#``*:`A%R-(`']?
+M)`$`(D0`!`%$``#@0Q`$ZT<!`#\F:)@Q(A($X$<``'VG`$!;:P``NB<``+TC
+M$`3K1P$`/R9HF#$B``!]IP!`6VL``+HG``"](P#Q`T1``"F@`?`C1``$`40`
+M`.!#$`3K1P$`/R9HF#$B$@3@1P``?:<`0%MK``"Z)P``O2,0!.M'`0`_)FR8
+M,2(``'VG`$!;:P``NB<``+TC_\`_(````410`"F@(1<A2``_7R`!`")$``0!
+M1```X$,0!.M'`0`_)FR8,2(2!.!'``!]IP!`6VL``+HG``"](PD`0.40!.M'
+M`0`_)FR8,2(``'VG`$!;:P``NB<``+TC`#0`1`@`X,,0!.M'`0`_)FR8,2(`
+M`'VG`$!;:P``NB<``+TC`#$`1```X$,0!.M'`0`_)FR8,2(2!.!'``!]IP!`
+M6VL``+HG``"](R/VP4D,`"V@`CA@1`'P/T2B!4%`!0%`]`0`8.0@+BR@`0`A
+M("`N++`#`.##)"XLH`$`(2`D+BRP#`!-H`+Q7T2A%<!!+0#@PP``/20``$&@
+M```A(`0`(:!``%ZP1``^L*H#\D,!`#\F"*(Q(@``?:<`0%MK``"Z)P``O2,`
+M\0=$*?9!24$4($%``%X@`00B0```(:`!\"=$``0!1```X$,0!.M'`0`_)@BB
+M,2(2!.!'``!]IP!`6VL``+HG``"](PP`+:#!,"!(H04I0-<`(/0$`"#E*"XK
+MH`$`(2`H+BNP`P#@PRPN*Z`!`"$@+"XKL`P`3:`BME]((1=!20$$(D0,`"VP
+MR0#@PP``/20``&&@```A(`0`0:`(`"&@0`!^L$0`7K!(`#ZP"@3R1Z%70$(`
+M!/]'O@`@Y`$`/R98F#$B``!]IP!`6VL``+HG``"](_S_/R3_#R$@```!1"GV
+M04E!%"!!0`!>(`$$(D```$&@(I=!2`0`/R0`\"$@`@!!1``$`D0``.!#$`3K
+M1P$`/R98F#$B$@3@1P``?:<`0%MK``"Z)P``O2,(`"V@P7`@2*$#*4`$`"#D
+M,"XKH`$`(2`P+BNP"`#@PP@`+:#!<"!((O9!2:$'(D`#`"#T-"XKH`$`(2`T
+M+BNP"`!-H"+V7D@A%T-)00#@PP``/20```&A```A(`0`0:`(`&&@#`"!H!``
+MH:`4`,&@&`#AH!P`(:!``!ZQ1`!>L$@`?K!,`)ZP4`"^L%0`WK!8`/ZP7``^
+ML`H$\D>A]T!"``3_1W@`(.0!`#\F))DQ(@``?:<`0%MK``"Z)P``O2,`T1]$
+M*?9!24$4($%``%X@`00B0```(:`!!"%``=`_1``$`40``.!#$`3K1P$`/R8D
+MF3$B$@3@1P``?:<`0%MK``"Z)P``O2,(`"V@P5`@2*$#*4`$`"#D&"XKH`$`
+M(2`8+BNP"`#@PP@`+:#!4"!((O9!2:$'(D`#`"#T'"XKH`$`(2`<+BNP"`!-
+MH")V7TAA44!)`00B1`@`+;!)`.##$P!`]A`R,*`!42!$$#(PL+_]7],0!.M'
+M``!]IP!`6VL``+HG``"](__^/R````%$``#@0Q`$ZT<1!.!'``!]IP!`6VL`
+M`+HG``"](S4`X,,0,C"@`5`@1#(`(/04,C"@(``@Y```?:<`0%MK``"Z)P``
+MO2/__C\@```!1```X$,0!.M'$03@1P``?:<`0%MK``"Z)P``O2-L,DNB$`3K
+M1P$`/R8L@3$B``!]IP!`6VL``+HG``"](W`R2Z(0!.M'`0`_)C2!,2(``'VG
+M`$!;:P``NB<``+TC$`3K1V[\7],-`.##``!]IP!`6VL``+HG``"](P`!/R``
+M!`%$``#@0Q`$ZT<1!.!'``!]IP!`6VL``+HG``"](Q`R+*`!5"!$$#(LL`$`
+M'R```%ZG"``^I1``7J48`'ZE(`">I2@`OJ4P`-ZEH`#>(P&`^FL``+LG``"]
+M(^#_WB,``%ZW"``^M1``7K48`'ZU"@3P1PL$\$<@,C"E$`#ILQ0R,*`Y`"#D
+M%``IH,``7R2A!R)``@`@]$0`Z;,$`.##%`!)H,``/R0A!2)`1``IL!P`*:!`
+M_R$D`@`@[$@`Z;,$`.##'`!)H,``/R0A!2)`2``IL$0`2:(0!.I'`0`_)BR!
+M,2(``'VG`$!;:P``NB<``+TC2`!)HA`$ZD<!`#\F-($Q(@``?:<`0%MK``"Z
+M)P``O2,0!.I'`0`_)C"!,2("`%\F``!]IP!`6VL``+HG``"](Q`$ZD<!`#\F
+M.($Q(@`"7R8``'VG`$!;:P``NB<``+TC3"XK(A`$ZD<``'VG`$!;:P``NB<`
+M`+TC/`#ILT``Z;,``%ZG"``^I1``7J48`'ZE(`#>(P&`^FL``+LG``"](^#_
+MWB,``%ZW"``^M1``7K4)!/!'Z!,PIA`R,*`!<"!$H74@0%,`(.0@,E"E"`!*
+MHL$P0$JA=R!`!``@Y-(P0$H!`%(B`0`_(DD`X,,(`$JBP5!`2@+P7T:A`R)`
+M!``@Y-)00$H!`%(B!0`_(D``X,-@+C"@`O`O1*+W1T!_`"$@(?8A2(/V($@#
+M`$#D8"XPH"'V(4B#]B!(*``JH*$)(T`*`"#D#``JH`'P/T01`"#T$`3I1P(`
+M/R(2!/]'#OU?TQ`$Z4<%`#\B*`#@PR0`*J"A"2-`$``@Y`P`*J`!\#]$!``@
+MY!`$Z4<"`#\B`0!?(@']7],(`$JBP7!`2J$W($#2<$!*`0!2(A`$Z4<$`#\B
+M%P`@]!<`X,,0!.E'``!]IP!`6VL``+HG``"](_[_`"`@]@%(H#<`0`X``.0,
+M`"J@`?`_1`0`(/00!.E'`@`_(A($_T?H_%_3"``JH,%P($@$`"#D$`3I1P0`
+M/R(2!/]'X?Q?TP``7J<(`#ZE$`!>I2``WB,!@/IK``"[)P``O2/@_]XC``!>
+MMP@`/K40`%ZU"03P1^@3,*80,C"@`7`@1*%U($`O`"#D(#)0I0@`2J+!,$!*
+MH7<@0`0`(.32,$!*`0!2(@$`/R(E`.##8"XPH`+P+T2B]T=`?P`A("'V(4B#
+M]B!(`P!`Y&`N,*`A]B%(@_8@2"0`*J"A"2-`"0`@Y`@`2J+!<$!*H3<@0-)P
+M0$H!`%(B$`3I1P0`/R(0`"#T$`#@PQ`$Z4<``'VG`$!;:P``NB<``+TC_O\`
+M("#V`4B@-P!`!P``Y`@`*J#!<"!(!``@Y!`$Z4<$`#\B$@3_1Z'\7],``%ZG
+M"``^I1``7J4@`-XC`8#Z:P``NR<``+TCT/_>(P``7K<(`#ZU$`!>M1@`?K4@
+M`)ZU"03P1PP$\4<+!/!'Z!,PIJ[[7]-A!0!`804@0$H&*4`H,DHA(#))M8P#
+M*:"A-2!``P`@Y!`R*:`!5"!$`@#@PQ`R*:`!42!$$#(IL(P#*:"A-2!`*``@
+M]$`N*Z`!`"$@0"XKL!`$Z4<!`#\B$@3_1W?\7],0!.E'!0`_(A($_T=S_%_3
+M$`3I1P0`/R(2!/]';_Q?TQ`$Z4<"`#\B$@3_1VO\7],0!.E'`P`_(A($_T=G
+M_%_3$`3I1P``?:<`0%MK``"Z)P``O2,``3\@``0!1```X$,0!.E'$03@1P``
+M?:<`0%MK``"Z)P``O2,0!.E'R_Y?TV<`X,,0,BF@`7`@1*%U($!C`"#D&@"`
+MY0@`2J+2,$!*$`3I1P$`/R),_%_3"`!*HM)00$H0!.E'!0`_(D?\7],,`$JB
+M$O!?1K(50$(0!.E'`@`_(D'\7],,`$JBTC!`2A`$Z4<#`#\B//Q?TP@`2J+2
+M<$!*$`3I1P0`/R(4`.##$`3I1P$`/R($`%\B,_Q?TP@`2J(2\%]&$`3I1P4`
+M/R(N_%_3$`3I1P(`/R(!`%\B*OQ?TQ`$Z4<#`#\B`0!?(B;\7],0!.E'!``_
+M(@(`7R(B_%_3%#(KH"$`(.00!.E'``!]IP!`6VL``+HG``"](__^/R````%$
+M``#@0Q`$Z4<1!.!'``!]IP!`6VL``+HG``"](Q`$Z4>$_E_3$`3I1P$`/R8P
+M@3$B`@!?)@``?:<`0%MK``"Z)P``O2,0!.E'`0`_)CB!,2(``E\F``!]IP!`
+M6VL``+HG``"](Q``X,,0!.E'<?Y?TQ`$Z4<``'VG`$!;:P``NB<``+TC``$_
+M(``$`40``.!#$`3I1Q$$X$<``'VG`$!;:P``NB<``+TC``!>IP@`/J40`%ZE
+M&`!^I2``GJ4P`-XC`8#Z:P``NR<``+TCT/_>(P``7K<(`#ZU$`!>M1@`?K4@
+M`)ZU"@3P1PD$\4<+!/!'`0`_)B2!,2(2!/]'``!]IP!`6VL``+HG``"](Q`$
+MZD<!`#\F*($Q(A($_T<``'VG`$!;:P``NB<``+TC3"XJ(A`$ZD<``'VG`$!;
+M:P``NB<``+TC```IH`0`2:`(`&F@8"XJL&0N2K!H+FJP$`3J1P$`/R8L@3$B
+M``!]IP!`6VL``+HG``"](PP`X$,0!.I'`0`_)C2!,2(``'VG`$!;:P``NB<`
+M`+TC``#@0\``7R0!`()%0/\A)`,`(.0!``)$0/\A)",`(/0@,BNE1`!IH",!
+M@T$\`$F@(@5B0#@N*Z`!!")`."XKL#P`:;!(`&F@(P$#0$``2:`B!6)`/"XK
+MH`$$(D`\+BNP0`!IL#P`2:`B]D%(%``IH"'V(4BB!T%``@!`]!`$ZD=4_E_3
+M0`!)H"+V04@<`"F@(?8A2*('04`"`$#T$`3J1[#^7],0!.I'_/U?TP``7J<(
+M`#ZE$`!>I1@`?J4@`)ZE,`#>(P&`^FL``+LG``"](_#_WB,``%ZW"``^M0D$
+M\$<@,G"D!0`Q+`4`42#!`")(H34B0`X`(.0\`".@`0`A(#P`([`X+C"@`0`A
+M(#@N,+`\`$.@(O9!2!0`(Z`A]B%(H@=!0!8`0/0J_E_3$@#@PP4`,2P%`%$@
+MP0`B2*$U(T`/`"#D0``CH`$`(2!``".P/"XPH`$`(2`\+C"P0`!#H"+V04@<
+M`".@(?8A2*('04`#`$#T>_Y?TQ`$Z4?'_5_3``!>IP@`/J40`-XC`8#Z:P``
+MNR<``+TC\/_>(P``7K<@,I"D8"XPH`+P+T2B]T=`?P`A("'V(4B#]B!(`P!`
+MY&`N,*`A]B%(@_8@2"@`)*"A"2-`#0`@]"0`)*"A"2-`!0`@Y`P`)*`!\#]$
+M`@`_(@$`7R(/`"#T"`!$HL%P0$HR,2!`!``_(@H`(/0(`$2BP5!`2C(Q($`%
+M`#\B!0`@]`@`1*+!,$!*`P`@Y#(Q($`!`#\B)?M?TP``7J<0`-XC`8#Z:P``
+MNR<``+TCX/_>(P``7K<(`#ZU$`!>M1@`?K4)!/!'`0`_)NR`,2(``'VG`$!;
+M:P``NB<``+TC"P#@0Q`$Z4<!`#\F\(`Q(@``?:<`0%MK``"Z)P``O2,*`.!#
+M$`3I1P$`/R;X@#$B``!]IP!`6VL``+HG``"](P``X$,@,HFD.``DH"+V(4@#
+M`$#D(?8!2*$'04`%`"#T`@3_1T0N*:`!`"$@1"XIL!@`X,,X`$2@(@$"0#0`
+M9*`C`4-!,``DH"$!84$B!4-`(@%!0&$%0D!!!"%`000B0$$$(4!!!"%`000B
+M0&$%(D!!!")`80<B0$$&(D!!!B)`000B0$$&(D"!UR5(@O=#2"(%(D`X``2P
+M,`!DL30`1+$`!.)'``!>IP@`/J40`%ZE&`!^I2``WB,!@/IK``"[)P``O2/0
+M_]XC``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU"@3P1PP$\$<@,G"E```QH`0`
+M4:`(`'&@8"XPL&0N4+!H+G"PT`!@Y:'_7],)!.!'!0``^$@N*J`!`"$@2"XJ
+ML!`$ZD<N_5_3$``KH`$$*4`0`"NP%#(LH%L`(.1,+BPB$`3J1P``?:<`0%MK
+M``"Z)P``O2,0!.I'`0`_)BR!,2(``'VG`$!;:P``NB<``+TC"0#@0Q`$ZD<!
+M`#\F-($Q(@``?:<`0%MK``"Z)P``O2,-`.!#1``KH"'V(4@B]B%)H0<B0`4`
+M(.1(`"N@(?8A2"+VH4FA!R)`*P`@]$0`*Z`A]B%((O8A2:$'(D`0`"#T1`!+
+MHA`$ZD<!`#\F+($Q(@``?:<`0%MK``"Z)P``O2,0!.I'`0`_)C"!,2("`%\F
+M``!]IP!`6VL``+HG``"](T@`*Z`A]B%((O:A2:$'(D")`"#T2`!+HA`$ZD<!
+M`#\F-($Q(@``?:<`0%MK``"Z)P``O2,0!.I'`0`_)CB!,2(``E\F``!]IP!`
+M6VL``+HG``"](W@`X,-$`&N@(P$C03P`2Z`B!6)`."XLH`$$(D`X+BRP/`!K
+ML$@`:Z`C`:-!0`!+H"(%8D`\+BR@`00B0#PN++!``&NP$#(JH`%P($2A=2!`
+M9``@Y!@R+*!!!"%`$`!KH"+V84@A]B%(H@=!0"D`0/08`"N@`0!A3"'V(4A"
+M!B%`8@=!0$(&0D!"!D%`0@1"0$($04!"!D%`8@5"0&('0D!"!$%`8@5!0#P`
+M*Z`A]B%(@M9$2*$'(D!(`"#D(``KH`$`84PA]B%(0@8A0&('04!"!D)`0@9!
+M0$($0D!"!$%`0@9!0&(%0D!B!T)`0@1!0&(%04!``"N@(?8A2(+61$BA!R)`
+M-0`@Y!`$ZD?:_E_3,@#@PQ``:Z`B]F%(&#(LH"'V(4BB!T%`+@!`]!0`*Z`!
+M`&%,(?8A2$(&(4!B!T%`0@9"0$(&04!"!$)`0@1!0$(&04!B!4)`8@="0$($
+M04!B!4%`/``KH"'V(4B"UD1(H0<B0`,`(/00!.I'S?Q?TQ8`X,,0`$N@'``K
+MH`(`04PB]D%(009"0&$'(D!!!B%`008B0$$$(4!!!")`008B0&$%(4!A!R%`
+M000B0&$%(D!``$N@(O9!2('6)$BB!T%`!`!`]!`$ZD<:_5_3$`3J1V;\7],`
+M`%ZG"``^I1``7J48`'ZE(`">I2@`OJ4P`-XC`8#Z:^@34*0``"(LP@(B2```
+M,2Q!`C%(8@-12`($040``%$\Z!.0I`0`9"P$`$0@P0!B2`$4(41#`&)(80$B
+M2`$$(T0$`"0\!`!1+`0`D2#!`$1(`10A1$(`1$AA`21(`00B1`0`,3SH$S"D
+M`@!!+`(`(2#!`D%(`@!1+`(`<2!"`D-(80,C2`$$(D0"`#$\Z!,PI`0`02P$
+M`"$@P@!!2`0`,2Q!`"1(8@%$2`($040$`%$\Z!,PI`4`02P%`"$@P0!!2`4`
+M42P%`'$@0@!#2&$!(T@!!")$!0`Q/``$_T<!@/IK``"[)P``O2/`_]XC``!>
+MMP@`/K40`%ZU&`!^M2``GK4H`+ZU,`#>M0L$\$<.!/)'"@3S1PD$_T<``#TD
+M``"A(2SV(4IA!2E!0@8M0```(J(!!"%``00L0$$$+4```$&B$`3K1P``?:<`
+M0%MK``"Z)P``O2,!`"H@"@#A0P'P)T0%`"#T`0`?(@``?:<`0%MK``"Z)P``
+MO2,),"!!H;<A0>C_/_0)!/]'```])```@2%!!BQ!```AH@0`0:(0!.M'``!]
+MIP!`6VL``+HG``"](P$`*B`*`.%#`?`G1`4`(/0!`!\B``!]IP!`6VL``+HG
+M``"](PDP($&A]RA![/\_]`D$_T<``#TD``"A(2SVP4EA!2E!0@0M0```(J(!
+M!"Q`000M0```0:(0!.M'``!]IP!`6VL``+HG``"](P$`*B`*`.%#`?`G1`4`
+M(/0!`!\B``!]IP!`6VL``+HG``"](PDP($&A]R=!Z?\_]```7J<(`#ZE$`!>
+MI1@`?J4@`)ZE*`"^I3``WJ5``-XC`8#Z:P``NR<``+TCT/_>(P``7K<(`#ZU
+M$`!>M1@`?K4@`)ZU"@3P1PL$\4<``%&B,79`2M)20$H``'VG`$!;:P``NB<`
+M`+TC(!<&2(`7!D@``"N@@?8B2`D$X$<,!/]'*0`@X&D%`$```#TD```A(.0`
+M(2!)!"%!!``)H@@`/R(``'VG`$!;:P``NB<``+TC`/`?1""W`$@``"F@(9<@
+M2``$`40,`.!#"``IH"$7)DB)%R9($`3J1P$`/R8$HC$B``!]IP!`6VL``+HG
+M``"](P``X$,``"N@(78@2$SV(2`2%`)$`0`@Y!(1`D00!.I'`0`_)@2B,2(`
+M`'VG`$!;:P``NB<``+TCH1TR00$`(.0)`"#A,!$C00@`/R(``'VG`$!;:P``
+MNB<``+TC"?`?1`$`7R`+`.##,!$C08'V!TH0!`%"D#<`2@@`/R(``'VG`$!;
+M:P``NB<``+TC"?`?1`($_T=!%"!!`@1"0`$$(D0!!%\@`00B1`D`X4,2\)]%
+M,A=!2@'P/T42!$%&$`3J1P$`/R:<F#$B``!]IP!`6VL``+HG``"](R'V(4DR
+M5H!)P3`@2!($0480!.I'`0`_)M"8,2(``'VG`$!;:P``NB<``+TCZ!-JM0$`
+M'R```%ZG"``^I1``7J48`'ZE(`">I3``WB,!@/IK``"[)P``O2/@,1"D,?8A
+M2J'W($(0`"#D```])```(2!!!"%"```AH`$$H4,*`.%K1```(`&`^FM(```@
+M`8#Z:TP``"`!@/IK4```(`&`^FN4```@`8#Z:P`$_T<!@/IK``"[)P``O2-`
+M_]XC``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU,`#>M3@`_K4+!/!'#P3Q1PT$
+M\D<.!/!'#`3_1P``,:#!4B!(\`%?(`(`(D2A%5A`30`@]*$=6$`#`"#DH154
+M0#4`(/1<`.##P/XB(`(`(.2P_B(@6``@]```+Z!?\"$@(78@2.H$7R"A!R)`
+M`@`@Y`P5+J`-`.##```OH'3K(2`A=B!(H?<]0`(`(.00%2Z@$0#@PP``+Z"$
+MZB$@(78@2*$7/$`$`"#D%!4NH")V($BP`%ZT"@#@PP``+Z`A=B!(7!9?(*$'
+M(D"X`/ZWL`#^MP4`(/08%2Z@)'8@2+``GK3!4B!(N``^M`H$_T<1!/]'D!0N
+MH"%V($B0`#ZTE!0NH,%2($B8`#ZTH14@0*``/K3D%"Z@)@#@PQP5,*`B=B!(
+ML`!>M,%2($BX`#ZT)!4PH#%V($@H%3"@*G8@2)`4,*#!4B!(D``^M)@4,*`A
+M=B!(F``^M*05($"@`)ZTY!0PH,%2($@6`.##(!4PH")V($BP`%ZTP5(@2+@`
+M/K0D%3"@T5(@2"@5,*#*4B!(E!0PH"%V($B0`#ZTF!0PH,%2($B8`#ZTI!4@
+M0*``GK3H%#"@(78@2`(`X,,`!/]'6`'@PZ@`/K0)!/]'```])```82!!%"!!
+M0`">(`($)$`A!2E``00A0`$$+4!!!"-````AH```(K`),"!!H1<B0?3_/_0`
+M`"^@@?8B2!$`(.`0!.1'`P!?(G<`?R(4!/]'``!]IP!`6VL``+HG``"](T``
+M'B(1!.I'`P!?(GH`?R(4!/]'``!]IP!`6VL``+HG``"](PD$_T<``#TD``!!
+M(4(4($$A!4E`008J0```(:)``#X@`@1!0```0J(0!.M'``!]IP!`6VL``+HG
+M``"](P$`+"`,`.%#`?`G1`4`(/0!`!\B``!]IP!`6VL``+HG``"](PDP($&A
+M%R)!Z/\_]`D$_T<``#TD``!!(4$&*D$``"&B!`!!HA`$ZT<``'VG`$!;:P``
+MNB<``+TC`0`L(`P`X4,!\"=$!0`@]`$`'R(``'VG`$!;:P``NB<``+TC"3`@
+M0>W_/^4)!/]'```])```02%A!2E!0@8J0```(J(!!"%``00M0$$$*D```$&B
+M$`3K1P``?:<`0%MK``"Z)P``O2,!`"P@#`#A0P'P)T0%`"#T`0`?(@``?:<`
+M0%MK``"Z)P``O2,),"!!Z?\_Y0D$_T<``#TD``!!(6$%*4%"!BI````BH@$$
+M(4`!!"U`000J0```0:(0!.M'``!]IP!`6VL``+HG``"](P$`+"`,`.%#`?`G
+M1`4`(/0!`!\B``!]IP!`6VL``+HG``"](PDP($'I_S_E"03_1P``/20``&$@
+M010@04``GB`"!"1`(04I0`$$(4`!!"U`000C0```(:```"*P"3`@0:$7(D'T
+M_S_T```OH,%2($A``5\@`0`B1,#^(2`4`"#TA!4NHC%V($H0!.1'`0!?(C,`
+M?R(#`)\B``!]IP!`6VL``+HG``"](X05+J+14B!*0``>(@$`7R(M`'\B`P"?
+M(@``?:<`0%MK``"Z)P``O2.@`#ZD$0#A0T``'B(!`%\B7P!_(A0$_T<``'VG
+M`$!;:P``NB<``+TCD`!>I!$`XD-``!XB!`!?(F``?R(4!/]'``!]IP!`6VL`
+M`+HG``"]([``GJ01`.1#0``>(@,`7R)H`'\B%`3_1P``?:<`0%MK``"Z)P``
+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
+M(D0"!,Y!`00B1`$07R`!!")$"@#A0Q+P7T40!.Q'`0`_)IR8,2(``'VG`$!;
+M:P``NB<``+TC(?9!28H6(4@2\$]%$`3L1P$`/R;8F#$B``!]IP!`6VL``+HG
+M``"](^@3;+4!`!\@``!>IP@`/J40`%ZE&`!^I2``GJ4H`+ZE,`#>I4``WB,!
+M@/IK``"[)P``O2/`_]XC``!>MP@`/K40`%ZU&`!^M2``GK4H`+ZU,`#>M3@`
+M_K4-!/!'"P3R1PX$\$<,!/]'X#%0I0``,:#!4B!(\`%?(`(`(D2A%5A`"@`@
+M]*$=6$`#`"#DH1540`0`(/0'`.##H15:0`,`(/0$`.##'!4PH`0`X,,@%2Z@
+M`@#@PP`$_T?3`.##,78@2,]2($@#!/]'```])```@2!!!&I`0@9D0`0`0J``
+M`$&P`S!@0/K_?^0#!/]'```])```@2!!%&!``@0J0"$%(T`!!"%``00K0$$$
+M)$```"&@!``BL`,P8$#V_W_D`P3_1P``/20``($@011@0`($*D`A!2-``00A
+M0`$$*T!!!"1````AH`@`(K`#,&!`]O]_Y`,$_T<``#TD``"!($$48$`"!"I`
+M(04C0`$$(4`!!"M`000D0```(:`,`"*P`S!@0*%78T#U_S_T#``J(1$`\4,0
+M!.E'`P!?(J@`?R(4!/]'``!]IP!`6VL``+HG``"](Q$`[T,0!.E'`P!?(J4`
+M?R(4!/]'``!]IP!`6VL``+HG``"](P,$_T<``#TD``"!($$48$`"!"I`(04C
+M0`$$(4`!!"M`000D0```(:!X`"*P`S!@0*%78$#U_S_T"03_1P``/20``&$A
+M008K00``(:)!!"I!``!!HA`$[4<``'VG`$!;:P``NB<``+TC`0`L(`P`X4,!
+M\"=$!0`@]`$`'R(``'VG`$!;:P``NB<``+TC"3`@0>S_/^4)!/]'```])```
+M82%"%"!!(05)0$$&*T```"&B`@1*0`0`0J(0!.U'``!]IP!`6VL``+HG``"]
+M(P$`+"`,`.%#`?`G1`4`(/0!`!\B``!]IP!`6VL``+HG``"](PDP($'J_S_E
+M"03_1P``/20``&$A0A0@02$%24!!!BM````AH@($2D`(`$*B$`3M1P``?:<`
+M0%MK``"Z)P``O2,!`"P@#`#A0P'P)T0%`"#T`0`?(@``?:<`0%MK``"Z)P``
+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
+MOJ4P`-ZE.`#^I5``WB,!@/IK``"[)P``O2/@_]XC``!>MP@`/K40`%ZU"@3Q
+M1PD$\$>L`!\B``!]IP!`6VL``+HG``"](^`Q";00``#D``$_((!(*;```1\B
+M``!]IP!`6VL``+HG``"](WA(";0'``#D``8?(@``?:<`0%MK``"Z)P``O2-P
+M+@FT!```]`(`/R```"JP``3_1Q$`X,,``#VD>"XIM```/:2`+BFT```]I(@N
+M*;0``#VDD"XIM```/:28+BFT```]I*`N*;0``#VDJ"XIM```/:2P+BFT`0`?
+M(```7J<(`#ZE$`!>I2``WB,!@/IK````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````H/^C_Y[_H/^C_Z#_```%
+M``H`%``>`#(`1@!5`%H`7P!D````"@`4`!X`*``R`#P`1@!0`%H`9`#"````
+MQ````,4```#0````V@```.0```#"````PP```-0```#R````#0$``"@!```"
+M`%`A`0!``00`H``(`,``(`#0`$``4`$`````)`&8&0`F$`8`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````)@``$<````(F`````````R8``"FCH0)$)@```#@,CT4
+MF```:P<``!R8````````()@````"`@(DF```#@X``"B8```!`@(*+)@``/QO
+M`P`PF````````#28```.#@``.)@```<````\F`````$"`$"8`````&.)1)@`
+M`)P6<A-(F```,[88`$R8```\88024)@``."XZ`U4F```64@'`%B8``"ZOH!^
+M7)@``%YF.C%@F```"!T``&28````S@$`:)@``)!!FD!PF```#P```'28``"`
+M````>)@```0`````F0````````29````````")D````````,F0````"``!"9
+M```#`````)L````````$FP``(`````B;```0````#)L``#`````0FP``"```
+M`!2;```H````&)L``"@````<FP``!````"";```D````))L``!0````HFP``
+M-````"R;```,````,)L``"P````TFP```@```#B;```B````/)L``!(```!`
+MFP``,@```$2;```*````2)L``"H```!,FP```0```%";```A````5)L``!$`
+M``!8FP``,0```%R;```)````8)L``"D```!DFP``!0```&B;```E````;)L`
+M`!4```!PFP``-0```'2;```-````>)L``"T```!\FP```P```(";```C````
+MA)L``!,```"(FP``,P```(R;```+````D)L``"L```"4FP``!P```)B;```G
+M````G)L``!<```"@FP``-P```*2;```/````J)L``"\```"LFP``+P```+";
+M```O````M)L``"\```"XFP``+P```+R;```O````P)L``"\```#$FP``+P``
+M`,B;```O````S)L``"\```#0FP``+P```-2;```O````V)L``"\```#<FP``
+M+P```.";```O````Y)L``"\```#HFP``+P```.R;```O````\)L``"\```#T
+MFP``+P```/B;```O````_)L``"\`````F@``'0````2:``!=````")H``)T`
+M```,F@``W0```!":```=`0``%)H``"$````8F@``80```!R:``"A````()H`
+M`.$````DF@``,0```"B:``!Q````+)H``+$````PF@``'````#2:``!<````
+M.)H``"D````\F@``:0```$":``"I````1)H``"````!(F@``&0```$R:``!9
+M````4)H``)D```!4F@``,````%B:```%````7)H``"4```!@F@``90```&2:
+M``"E````:)H``"@```!LF@``:````'":```?````=)H``!X```!XF@``&```
+M`'R:``!8````@)H``)@```"$F@```P```(B:```$````C)H``$0```"0F@``
+MA````)2:```3````F)H``!(```"<F@``4@```*":``"2````I)H``-(```"H
+MF@``*P```*R:```J````L)H``&H```"TF@``J@```+B:```;````O)H``!H`
+M``#`F@``6@```,2:``":````R)H``-H```#,F@``!@```-":```&````U)H`
+M``8```#8F@``!@```-R:```&````X)H```8```#DF@``!@```.B:```&````
+M[)H```8```#PF@``!@```/2:```&````^)H```8```#\F@``!@```-28```@
+M````S)@```0```#(F```!@$&`)R8``!M````P)@```````#0F```%`````D)
+M```````"`@8&!@8&!@("`````P`&``D`/```````````````````````````
+M`````/````#,````````````````````"N(````@```*`@```1@```$```!`
+M&`0```4$5QD`)A`&````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````%55556JJJJJ9F9F
+M9IF9F9D`````(````"````!`````0```````!@````8````&`#`````5````
+M%0```!T````5````0!````_\+P`/_"\`'_PO``_\+P!$$```#_PO``_\+P`?
+M_"\`#_PO`$@0```/_"\`#_PO`!_\+P`/_"\`3!````_\+P`/_"\`'_PO``_\
+M+P!0$```#_PO``_\+P`?_"\`#_PO`%00```/_"\`#_PO`!_\+P`/_"\`6!``
+M``_\+P`/_"\`'_PO``_\+P!<$```#_PO``_\+P`?_"\`#_PO`&`0```/_"\`
+M#_PO`!_\+P`/_"\`9!````_\+P`/_"\`'_PO``_\+P!P$```:`$``.`!``"X
+M`0``:`$``#`0```P`@``X`$``+`````P`@``L!```)@-``"`$0``2!\``)@-
+M``#P$```X*```&A``0"`6```X*```!2`````!``$``@`"``P`"``!``$'(``
+M`*>/C0[/CXT.E8]@`:>/C0X$F`````````,``````````````""8`````@("
+M``("`@`"`0(``@("))@```X.```.#@``!P<```X.```HF````0`""@$``@H`
+M``$%`0`""C28```.#@``#@X```X.```.#@``.)@```<````'````"P````L`
+M``!$F```G!9R$Z46<A.H%G(3G!9R$TB8``!GNA@`9[H8`&FZ&`!INA@`4)@`
+M`."T*`S@M"@,X+0H#."T*`Q8F```+@V`?BX-@'XN#<!^+@V`?ER8``!>73<Q
+M7ETW,5Y=.C%>73<Q8)@``!"]```0O0``.+T``!"]``!DF````,X!``#.`0``
+MS@$``,X!`!29```0)P``$"<``'P5```0)P``&)D``)`!``"0`0``A````)`!
+M``!$F0``(!#@;R`0X&\@">!O(!#@;X"A``#_%/\%_Q3_!?\4_P7_&?\%U)@`
+M`!`````4````$````!`````,`````````"@```"<G(2$+````'Q\?'PT````
+M!0```$``````````1`````@```!(````"````$P````0````4`````````!4
+M````'P`````(````````!`@````````("`````````P(````````$`@`````
+M```4"````````!@(````````'`@````````@"````````"0(````````,!(`
+M```````$@`````````B`````````#(`````````8@````````"2`````````
+M*(```#`````L@```__\'`#"```#___\!-(```#$````X@````````#R`````
+M````0(````````!$@````@```$B`````````5(````````!8@`````````B8
+M````````#)@``).0A"T0F````.`R?128``!K#P``')@````````LF```_F\"
+M`#"8````````/)@````!`@!`F```>@%J($R8```\88025)@``%D(``!HF```
+MD$&:0&R8``"!L`P%<)@```\```!TF```@````'B8```,`````)D````````$
+MF0````````B9````````#)D`````@``0F0```0```!R9```J"0``()D`````
+M```DF0``!8H%`"B9```!````+)D````````PF0```````#29````````.)D`
+M```````\F0``/P```$"9```$````2)D```````!,F0```````%"9````````
+M5)D``$SQ4%U8F0``&````%R9``".:DL`A*$``/\%_P:(H0``_P?_!XRA``#_
+M"/\(D*$``/\)_PF4H0``_PK_"IBA``#_"_\+G*$``/\,_PR@H0``_PW_#:2A
+M``#_#O\/J*$``/\2_Q*LH0``_Q/_%+"A``#_%?\6M*$``/\7_QFXH0``_QK_
+M&[RA``#_'?\>P*$``/\@_R/$H0``_R7_)\BA``#_*?\LS*$``/\O_S'0H0``
+M_S3_-]2A``#_.O\ZV*$``/\Z_SK<H0``_SK_.N"A``#_.O\ZY*$``/\Z_SKH
+MH0``_SK_.NRA``#_.O\Z\*$``/\Z_SKTH0``_SK_.OBA``#_.O\Z_*$``/\Z
+M_SH`FP````````2;```@````")L``!`````,FP``,````!";```(````%)L`
+M`"@````8FP``!````!R;```D````()L``!0````DFP``-````"B;```,````
+M+)L``"P````PFP```@```#2;```B````.)L``!(````\FP``,@```$";```*
+M````1)L``"H```!(FP``!@```$R;```F````4)L``!8```!4FP``-@```%B;
+M```.````7)L``"X```!@FP```0```&2;```A````:)L``!$```!LFP``,0``
+M`'";```)````=)L``"D```!XFP``!0```'R;```E````@)L``!4```"$FP``
+M-0```(B;```-````C)L``"T```"0FP```P```)2;```C````F)L``!,```"<
+MFP``,P```*";```+````I)L``"L```"HFP``*P```*R;```K````L)L``"L`
+M``"TFP``*P```+B;```K````O)L``"L```#`FP``*P```,2;```K````R)L`
+M`"L```#,FP``*P```-";```K````U)L``"L```#8FP``*P```-R;```K````
+MX)L``"L```#DFP``*P```.B;```K````[)L``"L```#PFP``*P```/2;```K
+M````^)L```(```#\FP``%@```-28```@````V)@``&@08```F@``J0$`````
+M```$F@``Z0$``$`````(F@``*0```(`````,F@``:0```%`!```0F@``F0$`
+M`)`!```4F@``V0$``-`!```8F@``&0```!`````<F@``60```$0````@F@``
+MF0```(0````DF@``I0$``$@!```HF@``Y0$``(@!```LF@``)0```,@!```P
+MF@``R`$``!0````TF@``"````$(````XF@``2````((````\F@``B````'@!
+M``!`F@``F`$``+@!``!$F@``V`$``/@!``!(F@``&````!(```!,F@``6```
+M`%(```!0F@``F````)(```!4F@``I`$``'P!``!8F@``Y`$``+P!``!<F@``
+M)````/P!``!@F@``9`````H```!DF@``I````$H```!HF@``Y````(H```!L
+MF@``"@$``%H!``!PF@``2@$``)H!``!TF@``B@$``-H!``!XF@``R@$```X`
+M``!\F@``"@```$X```"`F@``2@```(X```"$F@``B@```%X!``"(F@``N@$`
+M`)X!``",F@``^@$``-X!``"0F@``.@````D```"4F@``>@```$D```"8F@``
+MA@$``(D```"<F@``Q@$``'D!``"@F@``!@```+D!``"DF@``1@```/D!``"H
+MF@``A@```#D```"LF@``Q@```'D```"PF@``Q@```+D```"TF@``Q@```+T!
+M``"XF@``Q@```/T!``"\F@``Q@```#T```#`F@``Q@```'T```#$F@``Q@``
+M`+T```#(F@``Q@```/T```#,F@``Q@```/T```#0F@``Q@```/T```#4F@``
+MQ@```/T```#8F@``Q@```/T```#<F@``Q@```/T```#@F@``Q@```/T```#D
+MF@``Q@```/T```#HF@``Q@```/T```#LF@``Q@```/T```#PF@``Q@```/T`
+M``#TF@``Q@```/T```#XF@``Q@```/T```#\F@``Q@```/T````!````1@``
+M`&`````!````1@```&$````!````1@```&(````!````1@```&,````!````
+M1@```&0````!````1@```&4````!````1@```&8````!````1@```&<````!
+M````1@```&@````!````1@```&D````!````1@```&H````!````1@```&L`
+M```!````1@```&P````!````1@```'0````!````1@```'0````!````1@``
+M`'0````!````1@```'0````!````1@```'0````!````1@```'0````!````
+M1@```'0````!````1@```'0````!````1@```'4````!````1@```'8````!
+M````1@```'<````!````1@```'@````!````1@```'D````!````1@```'H`
+M```!````1@```'L````!````1@```'P````!````1@```'T````!````1@``
+M`'X````!````1@```'\````!````1@```(`````!````1````'P````!````
+M1@```(@````!````1@```(P````!````1@```)`````!````1@```)0````!
+M````1@```)@````!````1@```)P````!````1@```*`````!````1@```*0`
+M```!````1@```*@````!````1@```*P````!````1@```+`````!````1@``
+M`+0```">%@L`8A8*`#H6"0`<%@@`ZA4'`)H5!0!*%00``Q4"`%D4``````$`
+M```#``8`"0`_```````````````````````````````````````````````)
+M````!`````0``0`!``$`!@```$9'.``````````````````$`````0`!``0`
+M``!&1S<``````````````````P`!``$``0`#````1D<V````````````````
+M``0```````$``0```$9'-0`````````````````$``$``0````````!&1S0`
+M````````````````!`````$```#^____1D<S``````````````````,``0`!
+M````_?___T9',@`````````````````$`````````/S___]&1S$`````````
+M`````````@`!``$```#Z____1D<P````````````````````````````````
+M```````````````````````4$%09`"80!@``````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``#)____R?___\G____)____PO____+____R____\O____+____T____P/__
+M_\#____`____P/___[K___^R____LO___[+___^R____L/___P4"#P<"#PH`
+M#PD`#U55556JJJJJ9F9F9IF9F9D`````````````````````````````````
+M`````````"`````@````0````$````````8````&````!@">%@L`8A8*`#H6
+M"0`<%@@`ZA4'`)H5!0!*%00``Q4"`%D4``"X"P$`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````!@````$````"`````P````0````%````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````0!````_\+P`/_"\`'_PO``_\+P`/_"\`1!````_\
+M+P`/_"\`'_PO``_\+P`/_"\`2!````_\+P`/_"\`'_PO``_\+P`/_"\`3!``
+M``_\+P`/_"\`'_PO``_\+P`/_"\`4!````_\+P`/_"\`'_PO``_\+P`/_"\`
+M5!````_\+P`/_"\`'_PO``_\+P`/_"\`6!````_\+P`/_"\`'_PO``_\+P`/
+M_"\`7!````_\+P`/_"\`'_PO``_\+P`/_"\`8!````_\+P`/_"\`'_PO``_\
+M+P`/_"\`9!````_\+P`/_"\`'_PO``_\+P`/_"\`,!```#`"``#@`0``L```
+M`&`!``#@`0``<!```&@!``#@`0``N`$``(P!``#@`0``L!```&`.``"`$0``
+M'!\``#@^``"`$0``\!```."@``!H0`$`@%@``."P``!H0`$`%(```.@#Z`/@
+M!N`&(`0@!$`(0`C@!N`&!)@````````#```````````````#````()@````"
+M`@(``@("``(!`@`"`@(``@("))@```X.```.#@``!P<```X.```.#@``1)@`
+M`!P6<A,E''(3(A=R$Z(6<A,E''(38)@``!"=```0G0``&)T``!B=```0G0``
+M9)@```#.`0``S@$``,X!``#.`0``S@$`:)@``)!!FD"009I`D$&:0)!!FD"0
+M09I`&)D``+@!``"X`0``A`````@!``"X`0``))D```6*!1`%B@40!8H%$`6*
+M!1`%B@40,*(```````````````````@!````````#``````````T````!0``
+M`$``````````1`````@```!(````"````$P````0````4`````````!4````
+M'P`````(````````!`@````````("`````````P(````````$`@````````4
+M"````````!@(````````'`@````````@"````````"0(````````<!(`````
+M```X$````````'@0````````N!````````#X$````````#@1````````>!$`
+M``````"X$0```````/@1````````.!(```````!X$@```````+@2````````
+M^!(````````X$P```````'@3````````N!,```````#X$P```````#@4````
+M````>!0```````"X%````````/@4````````.!4```````!X%0```````+@5
+M````````^!4````````X%@```````'@6````````N!8```````#X%@``````
+M`#@7````````>!<```````"X%P```````/@7````````/!````````!\$```
+M`````+P0````````_!`````````\$0```````'P1````````O!$```````#\
+M$0```````#P2````````?!(```````"\$@```````/P2````````/!,`````
+M``!\$P```````+P3````````_!,````````\%````````'P4````````!(``
+M```````(@`````````R`````````((`````````D@````````"B````P````
+M+(```/__!P`P@```____`32````Q````.(`````````\@````````$B`````
+M````5(````````!8@````````%R```"/QP\`P(```!HP@BK$@```X`'<!<B`
+M```0)T`?S(``````]`'0@```'!X``-2```"JJ@(`V(```%55``+<@```````
+M`."```#_____Y(```/__``#H@````````.R`````````\(````````#T@```
+M`````/B`````````_(```(@`````AP````````2'``",````"(<``.0````,
+MAP``U0(``!"'````````%(<````````8AP``H````!R'``#)`0``((<``"P`
+M```DAP``+````"B'```P````+(<``#P````PAP``+````#2'```L````.(<`
+M`#`````\AP``/````$"'````````1(<```````!(AP```````$R'````````
+M4(<```````!4AP```````%B'````````7(<```````!@AP``U0```&2'``#?
+M````:(<```(!``!LAP``.@$``'"'``!U````=(<``'\```!XAP``H@```'R'
+M`````````($```(``0`$@0```0````B!``#`````#($````````0@0``:`$`
+M`!2!````````P(<````!`@/$AP``!`4&!\B'```("0H+S(<```P-#@_0AP``
+M$!$2$]2'```4%187V(<``!@9&AO<AP``'!T>'^"'`````0(#Y(<```0%!@?H
+MAP``"`D*"^R'```,#0X/\(<``!`1$A/TAP``%!46%_B'```8&1H;_(<``!P=
+M'A\,F```&8Z$K1"8````X"A]%)@``&N?"IP<F````````$"8``!Z`6H@5)@`
+M`%D(````F0````````29````````")D````````,F0````"``!"9```!````
+M')D``(`,```@F0`````0!2B9```!````+)D```0````TF0``(B`?'CB9```-
+M#`L*/)D``#\```!(F0``$K*`DE29``"(X5!=7)D``(YJ2P!HF0``S@,``'"9
+M```5M2\9>)D```$```!\F0```````!"B```S8X``%*(``!!L$``8H@``8$"<
+M`""B``#&,(@!)*(````$```LH@```````#2B```@("`@.*(``"`@("!`H@``
+M(`I).$2B``"V>P``2*(``/P__P\`FP```````"B;```,````.)L``!(```!D
+MFP``(0```(R;```M````G)L``#,```````,`!@`)`#\````#``8`"0`_``D`
+M```$````!``!``$``0````````````8```!&1S@`````````````````!```
+M``$``0````````````0```!&1S<``````````````````P`!``$``0``````
+M``````,```!&1S8`````````````````!````````0````````````$```!&
+M1S4`````````````````!``!``$```````````````````!&1S0`````````
+M````````!`````$``````````````/[___]&1S,``````````````````P`!
+M``$``````````````/W___]&1S(`````````````````!```````````````
+M`````/S___]&1S$``````````````````@`!``$``````````````/K___]&
+M1S``````````````````````````````````````````````````````````
+M````````"`````$````#````````````````````!@```$9'-P``````````
+M```````"`````````````````````````$9'-@`````````````````!````
+M````````````````_?___T9'-0``````````````````````````````````
+M````^O___T9'-`````````````````````$``0``````````````^/___T9'
+M,P````````````````````$``0````$``0``````]O___T9',@``````````
+M``````````$````!``$``0``````\____T9',0````````````````````$`
+M```!``$````!````\/___T9',```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````!`````@````"````!`````8````(````"@``
+M``P````.````$``````````````````````````````````````````P````
+M%8```!6````5@```%8```!6````<@```IX^-$L\/B`F5#^`$JP_@$L\/B`DH
+MF````0`""@$``@H``0$%`0`""@$``@HTF```#@X```X.```.#@``#@X```X.
+M```XF```!P````<````+````"P````L```!(F```6MH8`%K:&`!IRA@`:<H8
+M`&G*&`!0F```X+3H#>"TZ`W@M.@-X+3H#>"TZ`U8F```+@V`?BX-@'XN3>A^
+M+DWH?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F8W,5YA-S%LF```@;`,!8&P#`6!
+ML`P%@+`,!8"P#`44F0``$"<``!`G``!\%0``^"H``!`G``!$F0``(!"X]R`0
+MN/<@#;CW(!"X]R`0N/<,H@``:D$L9&I!+&1J04!D:D%`9&I!0&0<H@``"H"#
+M&`J`@Q@*@',8"H"#&`J`@Q@P$@````````B8````````+)@``/XO`@`\F```
+M``$"`$R8```\8802,)D``(-(``!`F0``!````%B9``#_````=)D```````#X
+MF0``&`````2B````````"*(``(AG/M`HH@``M0$``#RB``"OB<@3!)L``"``
+M```(FP``$`````R;```P````$)L```@````4FP``*````!B;```$````')L`
+M`"0````@FP``%````"2;```T````+)L``"P````PFP```@```#2;```B````
+M/)L``#(```!`FP``"@```$2;```J````2)L```8```!,FP``)@```%";```6
+M````5)L``#8```!8FP``#@```%R;```N````8)L```$```!HFP``$0```&R;
+M```Q````<)L```D```!TFP``*0```'B;```%````?)L``"4```"`FP``%0``
+M`(2;```U````B)L```T```"0FP```P```)2;```C````F)L``!,```"@FP``
+M"P```*2;```K````J)L``"L```"LFP``*P```+";```K````M)L``"L```"X
+MFP``*P```+R;```K````P)L``"L```#$FP``*P```,B;```K````S)L``"L`
+M``#0FP``*P```-2;```K````V)L``"L```#<FP``*P```.";```K````Y)L`
+M`"L```#HFP``*P```.R;```K````\)L``"L```#TFP``*P```/B;```"````
+M_)L``!8```"<F`````````````````````````````"<F```````````````
+M``````````````"<F`````````````````````````````"<F```````````
+M``````````````````"<F`````````````````````````````"<F```````
+M``````````````````````"<F`````````````````````````````"<F```
+M``````````````````````````"<F`````````````````````````````"<
+MF`````````````````````````````"<F```````````````````````````
+M``"<F``````X````.````#@````X````.`"<F```````````````````````
+M``````"<F`````````````````````````````"<F`````````````#`````
+M@````(````"<F```^0`$`/D`!`#_``0`_0`$`/T`!`#4F``````````````$
+M````!`````0`````F@``J0$````````$F@``Z0$``$`````(F@``*0```(``
+M```,F@``:0```%`!```0F@``F0$``)`!```4F@``V0$``-`!```8F@``&0``
+M`!`````<F@``60```$0````@F@``F0```(0````DF@``I0$``$@!```HF@``
+MY0$``(@!```LF@``)0```,@!```PF@``R`$``!0````TF@``"````$(````X
+MF@``2````((````\F@``B````'@!``!`F@``F`$``+@!``!$F@``V`$``/@!
+M``!(F@``&````!(```!,F@``6````%(```!0F@``F````)(```!4F@``I`$`
+M`'P!``!8F@``Y`$``+P!``!<F@``)````/P!``!@F@``9`````H```!DF@``
+MI````$H```!HF@``Y````(H```!LF@``"@$``%H!``!PF@``2@$``)H!``!T
+MF@``B@$``-H!``!XF@``R@$```X```!\F@``"@```$X```"`F@``2@```(X`
+M``"$F@``B@```%X!``"(F@``N@$``)X!``",F@``^@$``-X!``"0F@``.@``
+M``D```"4F@``>@```$D```"8F@``A@$``(D```"<F@``Q@$``'D!``"@F@``
+M!@```+D!``"DF@``1@```/D!``"HF@``A@```#D```"LF@``Q@```'D```"P
+MF@``Q@```+D```"TF@``Q@```+T!``"XF@``Q@```/T!``"\F@``Q@```#T`
+M``#`F@``Q@```'T```#$F@``Q@```+T```#(F@``Q@```/T```#,F@``Q@``
+M`/T```#0F@``Q@```/T```#4F@``Q@```/T```#8F@``Q@```/T```#<F@``
+MQ@```/T```#@F@``Q@```/T```#DF@``Q@```/T```#HF@``Q@```/T```#L
+MF@``Q@```/T```#PF@``Q@```/T```#TF@``Q@```/T```#XF@``Q@```/T`
+M``#\F@``Q@```/T```#4F```$````!0````0````$````!0```#8F```:!!@
+M`&@08`!H$&``:!!@`&@08`"<F`````````````````````````````"<F```
+M``````````````````````````"<F`````````````````````````````"<
+MF`````````````````````````````"<F```````````````````````````
+M``"<F```````$````!`````0````$````!"<F```````!`````0````$````
+M!`````2<F`````````````````````````````"<F```````````````````
+M``````````"<F`````````````````````````````"<F```````````````
+M```*``````````"<F```P``X`(``.`#``#@"P``X`,``.`"<F```!@`"``8`
+M`@`&````!@`"``8``@"<F```B0```(D```")````B0```(D```"<F```H```
+M`*````"@````H````*````"<F```!P`$``<`!``'``0`!P`$``<`!`#4F```
+M&@```!H````:````&@```!H```"<F```0````$@```!`````0````$````"<
+MF```$````!`````0````$````!````"<F```"`````@````(````"`````@`
+M``"<F```3P```$\```!/````3P```$\```"<F```\0```/$```!A````\0``
+M`/$```"<F```3Y```$^0``!,D```3Y```$^0``"<F```6A(``%H2``":$@``
+M6A(``%H2``#,F```#@````X````/````#@````X````!````1@```&`````!
+M````1@```&$````!````1@```&(````!````1@```&,````!````1@```&0`
+M```!````1@```&4````!````1@```&8````!````1@```&<````!````1@``
+M`&@````!````1@```&D````!````1@```&H````!````1@```&L````!````
+M1@```&P````!````1@```'0````!````1@```'0````!````1@```'0````!
+M````1@```'0````!````1@```'0````!````1@```'0````!````1@```'0`
+M```!````1@```'0````!````1@```'4````!````1@```'8````!````1@``
+M`'<````!````1@```'@````!````1@```'D````!````1@```'H````!````
+M1@```'L````!````1@```'P````!````1@```'T````!````1@```'X````!
+M````1@```'\````!````1@```(`````!````1````'P````!````1@```(@`
+M```!````1@```(P````!````1@```)`````!````1@```)0````!````1@``
+M`)@````!````1@```)P````!````1@```*`````!````1@```*0````!````
+M1@```*@````!````1@```*P````!````1@```+`````!````1@```+0`````
+M`````````````````````````````````````````)X6!@!B%@0`.A8#`!P6
+M`@#J%0$`FA4``$H5```#%0$`610#`+@+!0``````,````!6````5@```%8``
+M`!6````5@```'(```*>3C1+/$X@)E1/@!*L3X!+/$X@)*)@```$``@H!``(*
+M``$"!0$``@H!``(*-)@```X.```.#@``#@X```X.```.#@``.)@```<````'
+M````"P````L````+````2)@``&W:&`!MVA@`=<H8`'7*&`!URA@`4)@``."T
+MZ`W@M.@-X+3H#>"TZ`W@M.@-6)@``"X-@'XN#8!^+@WH?BX-Z'XN#8!^7)@`
+M`%YF-S%>9C<Q7F8W,5YF-S%>9C<Q;)@``(&P#`6!L`P%@;`,!8&P#`6!L`P%
+M%)D``-`'``#0!P``3`0``)@(``#0!P``1)D``"`0N/<@$+CW$`VX]Q`0N/<0
+M$+CW!*(`````````````"`````@````(````"*(``(AGOM:(9[[6B&<^T(AG
+M/M"(9S[0#*(``$`!+&1``2QD8,%"9&#!0F1@P4)D'*(```J`@Q@*@(,8"H!S
+M&`J`@Q@*@(,8,!(````````(F````````"R8``#^+P(`/)@````!`@!,F```
+M/&&$$C"9``""2```0)D```0```!8F0``_P```'29````````**(``+4!```\
+MH@``KXG($P2;```!````")L```(````,FP```P```!";```$````%)L```4`
+M```8FP``"````!R;```)````()L```H````DFP``"P```"R;```-````,)L`
+M`!`````TFP``$0```#R;```3````0)L``!0```!$FP``%0```$B;```8````
+M3)L``!D```!0FP``&@```%2;```;````6)L``!P```!<FP``'0```&";```@
+M````:)L``"(```!LFP``(P```'";```D````=)L``"4```!XFP``*````'R;
+M```I````@)L``"H```"$FP``*P```(B;```L````D)L``#````"4FP``,0``
+M`)B;```R````H)L``#0```"DFP``-0```*B;```U````K)L``#4```"PFP``
+M-0```+2;```U````N)L``#4```"\FP``-0```,";```U````Q)L``#4```#(
+MFP``-0```,R;```U````T)L``#4```#4FP``-0```-B;```U````W)L``#4`
+M``#@FP``-0```.2;```U````Z)L``#4```#LFP``-0```/";```U````])L`
+M`#4```#XFP``$````/R;```:`````)H```<````'````!)H``$<```!'````
+M")H``(<```"'````#)H``*`!``"@`0``$)H``.`!``#@`0``%)H``"`````@
+M````&)H``&````!@````')H``*$!``"A`0``()H``.$!``#A`0``))H``"$`
+M```A````*)H``&$```!A````+)H``&(!``!B`0``,)H``*(!``"B`0``-)H`
+M`.(!``#B`0``.)H``"(````B````/)H``&(```!B````0)H``&,!``!C`0``
+M1)H``*,!``"C`0``2)H``.,!``#C`0``3)H``",````C````4)H``&,```!C
+M````5)H``(0!``"$`0``6)H``,0!``#$`0``7)H```0````$````8)H``.H!
+M```+````9)H``"H```!+````:)H``&H```"+````;)H``*H```"L`0``<)H`
+M`*L!``#L`0``=)H``.L!```L````>)H``"L````2````?)H``&L```!2````
+M@)H``*L```"2````A)H``*P!``"3`0``B)H``.P!``#3`0``C)H``"P````3
+M````D)H``#H```!3````E)H``'H```"3````F)H``+H```"4`0``G)H``+L!
+M``#4`0``H)H``/L!```4````I)H``#L````Z````J)H``'L```!Z````K)H`
+M`+L```"Z````L)H``+P!``"[`0``M)H``/P!``#[`0``N)H``#P````[````
+MO)H``'P```![````P)H``+P```"[````Q)H``/P```"\`0``R)H``/P```#\
+M`0``S)H``/P````\````T)H``/P```!\````U)H``/P```"\````V)H``/P`
+M``#\````W)H``/P```#\````X)H``/P```#\````Y)H``/P```#\````Z)H`
+M`/P```#\````[)H``/P```#\````\)H``/P```#\````])H``/P```#\````
+M^)H``/P```#\````_)H``/P```#\````T)@```@$!@,(!`<#"`0&`P@$!@,(
+M!`<#W)@``,`@H`#`(*``P"#@`,`@X`#`(.``G)@```````\````/````#P``
+M``\````/G)@`````````````````````````````G)@`````@````(````"`
+M````@````(``G)@`````*@```"H````J````*@```"H`G)@``````0````$`
+M```!`````0````$`G)@`````````````````````````````G)@`````&```
+M`!@````8````&````!@`G)@`````8````&````!N````;@```&X`G)@`````
+MQP```,<```#'````QP```,<`G)@`````2P```$L```!+````2P```$L`G)@`
+M````2`0``$@$``!(!```2`0``$@$G)@`````3````$P```!,````3````$P`
+MG)@`````Y````.0```#D````Y````.0`G)@`````````````````````````
+M````G)@`````_````/P```#\````_````/P`G)@`````_P```/\```#_````
+M_P```/\`G)@`````/P0``#\$```_!```/P0``#\$G)@`````#`````P````,
+M````#`````P`G)@`````&0(``!D"```9`@``&0(``!D"G)@`````)````"0`
+M```D````)````"0`G)@`````M````+0```"T````M````+0`G)@`````F0``
+M`)D```"9````F0```)D`G)@`````4````%````!0````4````%``G)@`````
+M*@```"H````J````*@```"H`G)@`````$@```!(````2````$@```!(`G)@`
+M````,L```#+````RP```,L```#+`G)@`````=`$``'0!``!T`0``=`$``'0!
+MG)@`````$0```!$````1````$0```!$`G)@`````*(8``"B&```HA@``*(8`
+M`"B&G)@`````A#$``(0Q``"$,0``A#$``(0QG)@``(``\@"``/(`@`#R`(``
+M\@"``/(`G)@``!D`)P`9`"<`&0`G`!D`)P`9`"<`G)@```,````#`````P``
+M``,````#````G)@`````````````````````````````G)@``+(```"R````
+ML@```+(```"R````G)@``(0@L`"$(+``A""P`(0@L`"$(+``G)@``*0E00"D
+M)4$`I"5!`*0E00"D)4$`G)@``""2$0`@DA$`()(1`""2$0`@DA$`G)@```!(
+M&@``2!H``$@:``!(&@``2!H`V)@``#`""P`P`@L`,`(+`#`""P`P`@L`G)@`
+M`)0```"4````E````)0```"4````G)@``)$```"1````D0```)$```"1````
+MG)@``!(````2````$@```!(````2````G)@``(````"`````@````(````"`
+M````G)@``-D```#9````V0```-D```#9````G)@``&````!@````8````&``
+M``!@````G)@``/````#P````\````/````#P````G)@``*(```"B````H@``
+M`*(```"B````G)@``%(```!2````4@```%(```!2````G)@``-0```#4````
+MU````-0```#4````G)@``,P4``#,%```S!0``,P4``#,%```G)@``(P$``",
+M!```C`0``(P$``",!```Q)@```,````#`````P````,````#````````````
+M```````````````````````````````````P````%0```!4````5````%0``
+M`!4````<@```IY.-$L\3B`F5$^`$JQ/@$L\3B`DHF````0`""@$``@H```(%
+M`0`""@$``@HTF`````X````.````#@````X````.```XF````@````(````*
+M````"@````H```!(F```;=H8`&W:&`!D:AH`9&H:`&1J&@!0F```X+3H#>"T
+MZ`W:L.@-VK"8#-JPZ`U8F```+@V`?BX-@'XN#>A^+@W(?BX-@'Y<F```7F8W
+M,5YF-S%>9C<Q7F`Y,5YF-S%LF```@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``
+MT`<``-`'``!,!```F`@``-`'``!$F0```!"X]P`0N/<`#;CW`!"X]P`0N/<$
+MH@`````````````````````````````(H@``B&>^UHAGOM:(9S[0B&<^T(AG
+M/M`,H@``0`$L`$`!+`!`P4(`0,%"`$#!0@`<H@``"H"#&`J`@Q@*@&,8"H"#
+M&`J`@Q@P$@``X`,``&"````/````&($````````<@0```````""!````````
+M)($````````H@0```````"R!````````,($````````T@0```````#B!````
+M````/($```````!`@0``J```@$2!````````")@````````LF````*```#R8
+M````!"``3)@``#PCA!)PF```'P```'28``"`````>)@```X```!8F0``_P``
+M`("9````````A)D`````@`*@F0```````."9````````Y)D``*JJJJKHF0``
+M>&1&/.R9``"J````\)D```P```#TF0``_P```/B9```4````**(``+4)```\
+MH@``KXG(DTRB```!````4*(```"@``!4H@```````%BB``"`4\<,7*(```$/
+M#P]@H@```0]I7V2B```1BD$`:*(```````!LH@``:L$P#'"B```@"((`=*(`
+M`*I\&P!XH@``SCGG''RB``#.`1<%`*,``````1@$HP```B8#,`BC```&/@=(
+M#*,```I,"U80HP``#V`:9!2C```;;D]X&*,``%I\CX8<HP``6X;/CB"C```/
+MET^=)*,``(^ASZ4HHP``'Z]?M2RC``"?N=^],*,``#_'?\TTHP``O]'_U3BC
+M````````/*,```````!`HP```````$2C````````2*,``/___S],HP``____
+M/U"C``#___\_5*,``/__`P!8HP``'ZJH>5RC```/0FP&8*,```<B*`]DHP``
+MA19@%VBC```$$8`?;*,```,,H#=PHP``@PC$/W2C```#",!7>*,``((&V%]\
+MHP``@@3@?X"C``"Z>SQ_A*,``/!_,/,$FP```0````B;```"````#)L```,`
+M```0FP``!````!2;```%````&)L```@````<FP``"0```"";```*````))L`
+M``L````LFP``#0```#";```0````-)L``!$````\FP``$P```$";```4````
+M1)L``!4```!(FP``&````$R;```9````4)L``!H```!4FP``&P```%B;```<
+M````7)L``!T```!@FP``(````&B;```B````;)L``",```!PFP``)````'2;
+M```E````>)L``"@```!\FP``*0```(";```J````A)L``"L```"(FP``+```
+M`)";```P````E)L``#$```"8FP``,@```*";```T````I)L``#4```"HFP``
+M-0```*R;```U````L)L``#4```"TFP``-0```+B;```U````O)L``#4```#`
+MFP``-0```,2;```U````R)L``#4```#,FP``-0```-";```U````U)L``#4`
+M``#8FP``-0```-R;```U````X)L``#4```#DFP``-0```.B;```U````[)L`
+M`#4```#PFP``-0```/2;```U````^)L``!````#\FP``&@````":````````
+M``````2:````````0`````B:````````@`````R:````````@0$``!":````
+M````P0$``!2:`````````0```!B:````````00```!R:````````@0```"":
+M````````:`$``"2:````````J`$``"B:````````Z`$``"R:````````*```
+M`#":````````:````#2:````````B0$``#B:````````R0$``#R:````````
+M"0```$":````````20```$2:````````B0```$B:````````D`$``$R:````
+M````T`$``%":````````$````%2:````````4````%B:````````D````%R:
+M````````D0$``&":````````T0$``&2:````````$0```&B:````````40``
+M`&R:````````D0```'":````````>`$``'2:````````N`$``'B:````````
+M^`$``'R:````````.````(":````````>````(2:````````F0$``(B:````
+M````V0$``(R:````````&0```)":````````60```)2:````````F0```)B:
+M````````V0```)R:````````^0```*":````````^0```*2:````````^0``
+M`*B:````````^0```*R:````````^0```+":````````^0```+2:````````
+M^0```+B:````````^0```+R:````````^0```,":````````^0```,2:````
+M````^0```,B:````````^0```,R:````````^0```-":````````^0```-2:
+M````````^0```-B:````````^0```-R:````````^0```.":````````^0``
+M`.2:````````^0```.B:````````^0```.R:````````^0```/":````````
+M^0```/2:````````^0```/B:````````^0```/R:````````^0```-"8```(
+M%``""!0!`@@4``((%``""!0!`MR8``#`(*``P""@`,`@X`#`(.``P"#@`)R8
+M``````#P````\````/````#P````\)R8````````````````````````````
+M`)R8```````#`````P````,````#`````YR8````````````````````````
+M`````)R8`````````````````````````````)R8````````````````````
+M`````````)R8`````````````````````````````)R8````````````````
+M`````````````)R8`````$!```!`0```0$```$!```!`0)R8``````5E```%
+M90``!64```5E```%99R8`````````````````````````````)R8````````
+M`````````````````````)R8`````$(```!"````0@```$(```!"`)R8````
+M`+4```"U````M0```+4```"U`)R8``````,````#`````P````,````#`)R8
+M`````/<```#W````]P```/<```#W`)R8`````)T```"=````G0```)T```"=
+M`)R8`````"(````B````(@```"(````B`)R8`````"($```B!```(@0``"($
+M```B!)R8```8`",`&``C`!@`(P`8`",`&``C`)R8`````"@````H`&``*`!@
+M`"@`8``H`)R8``#``%``P`!0`,,`4`##`%``PP!0`)R8``!_``0`?P`$`'\`
+M!`!_``0`?P`$`)R8``!8!```6`0``%@$``!8!```6`0``)R8````````````
+M`````````````````)R8````P````,````#`````P````,```-B8```P`D``
+M,`)``#`"0``P`D``,`)``)R8````9````&0```!D````9````&0``)R8````
+M"`````@````(````"`````@``,R8```.````#@````X````.````#@``````
+M````````````````````````````````````````,````!4````5````%0``
+M`!4````5````'(```*>3C1+/$X@)E1/@!*L3X!+/$X@)*)@```$``@H!``(*
+M``$"!0$``@H!``(*-)@```X.```.#@``#@X```X.```.#@``.)@```<````'
+M````"P````L````+````2)@``&'Z&`!A^A@`8QH:`&,:&@!C&AH`4)@``."T
+MF`S@M)@,VK"8#-JPF`S:L)@,6)@``"X-R'XN#<A^+@W(?BX-R'XN#<A^7)@`
+M`%Y@.3%>8#DQ7F`Y,5Y@.3%>8#DQ;)@``(&P#`6!L`P%@;`,!8&P#`6!L`P%
+M%)D``-`'``#0!P``3`0``)@(``#0!P``1)D````0N/<`$+CW``VX]P`0N/<`
+M$+CW!*(`````````````````````````````"*(``(AGOM:(9[[6B&<^T(AG
+M/M"(9S[0#*(``.#!+@#@P2X`(,$J`"#!*@`@P2H`'*(```J`@Q@*@(,8"H!C
+M&`J`@Q@*@(,8`*,``````1@```$8```!&````1@```$8!*,```(F`S`")@,P
+M`B8#,`(F`S`")@,P"*,```8^!T@&/@=(!CX'2`8^!T@&/@=(#*,```I,"U8*
+M3`M6"DP+5@I,"U8*3`M6$*,```]@&F0/8!ID#V`:9`]@&F0/8!ID%*,``!MN
+M3W@;;D]X&VY/>!MN3W@;;D]X&*,``%I\CX9:?(^&6GR/AEI\CX9:?(^&'*,`
+M`%N&SY!;AL^06X;/CEN&SXY;AL^.(*,```^73YT/ET^=#Y=/FP^73YL/ET^;
+M)*,``(^CSZ>/H\^GCY_/HX^?SZ./G\^C**,``!^O7[4?KU^U'Z]?LQ^O7[,?
+MKU^S+*,``)^YW[V?N=^]G[G?NY^YW[N?N=^[,*,``#_%?\L_Q7_+/\=_RS_'
+M?\L_QW_+-*,``+_1_]6_T?_5O]'_T[_1_]._T?_3,!(``.`#``!H0```$```
+M`&"````/````G(````````"@@````````!B!````````'($````````@@0``
+M`````"2!````````*($````````L@0```````#"!````````-($````````X
+M@0```````#R!````````0($``/D#`(!$@0````````B8````````+)@```"@
+M```\F`````0@`$R8```\(X02<)@``!\```!TF```@````'B8```.````6)D`
+M`/\?"`"`F0```````(29`````(`"H)D```````#@F0```````.29``"JJJJJ
+MZ)D``'AD1CSLF0``J@```/"9```,````])D``/\```#XF0``%````"BB``"U
+M"0``/*(``*^)R)-,H@```0```%"B````H```5*(```````!8H@``@%/'#%RB
+M```!#P\/8*(```$/:5]DH@``$8I!`&BB````````;*(``&K!,`QPH@``(`B"
+M`'2B``"J?!L(>*(``,XYYQQ\H@``S@$7!3BC````````/*,```````!`HP``
+M`````$2C````````2*,``/___S],HP``____/U"C``#___\_5*,``/__`P!8
+MHP``'ZJH>5RC```/0FP&8*,```<B*`]DHP``A19@%VBC```$$8`?;*,```,,
+MH#=PHP``@PC$/W2C```#",!7>*,``((&V%]\HP``@@3@?X"C``"Z>SQ_A*,`
+M`/!_,/,$FP```0````B;```"````#)L```,````0FP``!````!2;```%````
+M&)L```@````<FP``"0```"";```*````))L```L````LFP``#0```#";```0
+M````-)L``!$````\FP``$P```$";```4````1)L``!4```!(FP``&````$R;
+M```9````4)L``!H```!4FP``&P```%B;```<````7)L``!T```!@FP``(```
+M`&B;```B````;)L``",```!PFP``)````'2;```E````>)L``"@```!\FP``
+M*0```(";```J````A)L``"L```"(FP``+````)";```P````E)L``#$```"8
+MFP``,@```*";```T````I)L``#4```"HFP``-0```*R;```U````L)L``#4`
+M``"TFP``-0```+B;```U````O)L``#4```#`FP``-0```,2;```U````R)L`
+M`#4```#,FP``-0```-";```U````U)L``#4```#8FP``-0```-R;```U````
+MX)L``#4```#DFP``-0```.B;```U````[)L``#4```#PFP``-0```/2;```U
+M````^)L``!````#\FP``&@````":``````````````2:``!`````0`````B:
+M``"`````@`````R:``"A`0``80$``!":``#A`0``H0$``!2:```A````X0$`
+M`!B:``!A````(0```!R:``"(`0``80```"":``#(`0``B`$``"2:```(````
+MR`$``"B:``!(````"````"R:``"(````2````#":``"I`0``B````#2:``#I
+M`0``:0$``#B:```I````J0$``#R:``!I````Z0$``$":``#0`0``*0```$2:
+M```0````:0```$B:``!0````D`$``$R:``"0````T`$``%":``"Q`0``$```
+M`%2:``#Q`0``4````%B:```Q````D````%R:``!Q````<0$``&":``"X`0``
+ML0$``&2:``#X`0``\0$``&B:```X````,0```&R:``!X````<0```'":``"9
+M`0``F`$``'2:``#9`0``V`$``'B:```9````&````'R:``!9````6````(":
+M``"9````F````(2:``#9````>0$``(B:``#Y````N0$``(R:``#Y````^0$`
+M`)":``#Y````.0```)2:``#Y````>0```)B:``#Y````N0```)R:``#Y````
+M^0```*":``#Y````^0```*2:``#Y````^0```*B:``#Y````^0```*R:``#Y
+M````^0```+":``#Y````^0```+2:``#Y````^0```+B:``#Y````^0```+R:
+M``#Y````^0```,":``#Y````^0```,2:``#Y````^0```,B:``#Y````^0``
+M`,R:``#Y````^0```-":``#Y````^0```-2:``#Y````^0```-B:``#Y````
+M^0```-R:``#Y````^0```.":``#Y````^0```.2:``#Y````^0```.B:``#Y
+M````^0```.R:``#Y````^0```/":``#Y````^0```/2:``#Y````^0```/B:
+M``#Y````^0```/R:``#Y````^0```-"8```(````"`````@````(````"```
+M`-R8``#``*``P`"@`,``X`#``.``P`#@`)R8```````S````,P```#,````S
+M````,YR8```````!`````0````$````!`````9R8````````````````````
+M`````````)R8`````````````````````````````)R8````````````````
+M`````````````)R8```````?````'P```!\````?````'YR8````````````
+M`````````````````)R8`````+@```"X````N````+@```"X`)R8`````+<`
+M``"W````MP```+<```"W`)R8`````(0```"$````A````(0```"$`)R8````
+M`)@```"8````F````)@```"8`)R8`````,````#`````P````,````#``)R8
+M`````/\```#_````_P```/\```#_`)R8`````/\```#_````_P```/\```#_
+M`)R8`````/\```#_````_P```/\```#_`)R8`````/\```#_````_P```/\`
+M``#_`)R8`````-<```#7````UP```-<```#7`)R8`````&$```!A````80``
+M`&$```!A`)R8`````/X```#^````_@```/X```#^`)R8`````-X```#>````
+MW@```-X```#>`)R8`````'\```!_````?P```'\```!_`)R8`````#T$```]
+M!```/00``#T$```]!)R8`````'<```!W````=P```'<```!W`)R8`````$0`
+M``!$````1````$0```!$`)R8`````)@```"8````F````)@```"8`)R8``"`
+M`!``@``0`(``$`"``!``@``0`)R8```TP`4`-,`%`#3`!0`TP`4`-,`%`)R8
+M``#P`#$`\``Q`/``,0#P`#$`\``Q`)R8```?`0P`'P$,`!\!#``?`0P`'P$,
+M`)R8``!``%$`0`!1`$``40!``%$`0`!1`)R8``#:`%``V@!0`-H`4`#:`%``
+MV@!0`)R8`````````````````````````````)R8``!$0```1$```$1```!$
+M0```1$```)R8`````````````````````````````)R8``#`8```P&```,!@
+M``#`8```P&```)R8````+````"P````V````-@```"P``,B8```#!````P0`
+M``,$```#!````P0``)R8````9````&0```!D````9````&0``)R8````"```
+M``@````(````"`````@``,R8```.````#@````X````.````#@``````````
+M````````````````````````````````````05(U,C$P`$%2-3(Q,0!!4C4R
+M,3(`4D8U,3$Q`%)&-3$Q,@!21C(T,3,`4D8U-#$S`%)%1T]04U]&54Y#`$%T
+M:&5R;W,@,C,Q,R!7:5-O0P!!=&AE<F]S(#4T,C0O,C0R-`!!=&AE<F]S(#(S
+M,3<@5VE3;T,`071H97)O<R`U,C$R("A&4$=!*0!!=&AE<F]S(#4R,3$@*$90
+M1T$I`$%T:&5R;W,@-3(Q,`!!=&AE<F]S(#4R,3$`071H97)O<R`U,S$R(%=I
+M4V]#`$%T:&5R;W,@,C,Q-2!7:5-O0P!!=&AE<F]S(#4R,3(````P+CDN,C`N
+M,P``````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````#_`?\!````
+M`````````/________]_```````````#`)@!F0$`````````````________
+M_W\```````````<`F`$P"P````````````#_________?P``````````"`"8
+M`3`,`````````````/________]_```````````@`"`!$`H`````````````
+M_________W\``````````"$`(`&9`0````````````#_________?P``````
+M````(@`@`3`,`````````````/________]_```````````Z`&`!$`H`````
+M````````_________W\``````````#L`8`&9`0````````````#_________
+M?P``````````$@!E`1`*```#`````````/________]_```````````W`#`!
+MF0$```,`````````_________W\``````````#4`,`*9`0```P````````#_
+M________?P``````````-@`P`YD!```#`````````/________]_````````
+M```P`#`$F0$```,`````````_________W\``````````#D`,`69`0```P``
+M``````#_________?P``````````-``P!ID!```#`````````/________]_
+M```````````R`#`#F0$```,`````````_________W\``````````#$`,`.9
+M`0````````````#_________?P``````````$0`0`9D!`````````````/__
+M______]_```````````0`!`!$`H`````````````_________W\`````````
+M`%(`4`&9`0````````````#_________?P``````````10!0`ID!````````
+M`````/________]_``````````!'`%`#F0$`````````````_________W\`
+M`````````$(`4`29`0````````````#_________?P``````````6`!0!9D!
+M`````````````/________]_``````````!;`%`&F0$`````````````____
+M_____W\``````````%T`4`B9`0````````````#_________?P``````````
+M7@!0"9D!`````````````/________]_``````````!0`%`#$`H`````````
+M````_________W\``````````%4`4`$P#`````````````#_________?P``
+M````````5@!0`C`,`````````````/________]_``````````!)`%`"4`T`
+M````````````_________W\``````````$``0`%`"@``1@````0````H````
+M`````(@!````````00!``4`*``!'````!````&@`````````B0$```````!(
+M`$`!$`H``$8````$````"`````````"*`0```````$H`0`%`"@``1@````0`
+M```(&````````(P!````````2P!``4`*``!&````!`````A@````````C0$`
+M``````!,`$`!4`H``$8````$````"`````````"/`0```````$,`0`)`"@``
+M1P````0```!P`````````(L!````````\`!``T`*``!&````!````"``````
+M``````````````"``$`#0`H``$<````$````8`````````"G#P```````/$`
+M0`-`"@``1@````0`````&```````````````````@0!``T`*``!&````!```
+M``!@````````J`\```````""`$`#4`H``$8````$``````````````"I#P``
+M`````/(`0`,0"@``1@````0`````````````````````````@P!`!$`*``!'
+M````!````&"`````````J@\```````#T`$`$0`H``$8````$`````)@`````
+M`````````````(0`0`1`"@``1@````0`````X````````*L/````````A0!`
+M!%`*``!&````!`````"`````````K`\```````#U`$`$$`H``$8````$````
+M`(```````````````````(8`0`5`"@``1P````0```!@@````````*T/````
+M````AP!`!4`*``!&````!`````#@````````K@\```````"(`$`%4`H``$8`
+M```$`````(````````"O#P```````(D`0`9`"@``1P````0```!H````````
+M`+`/````````B@!`!D`*``!&````!`````A@````````L0\```````"+`$`&
+M4`H``$8````$````"`````````"R#P```````(P`0`=`"@``1P````0```!H
+M@````````+,/````````C0!`!T`*``!&````!`````C@````````M`\`````
+M``".`$`'4`H``$8````$````"(````````"U#P```````(\`0`A`"@``1P``
+M``0```!H@````````+8/````````D`!`"$`*``!&````!`````C@````````
+MMP\```````"1`$`(4`H``$8````$````"(````````"X#P```````/8`0`E`
+M"@``1P````0```!@@```````````````````]P!`"T`*``!'````!````&"`
+M``````````````````!@`&``8```````````````_________W\`````````
+M`&$`80!A`````P````````#_________?P``````````8@!B`&(````"````
+M`````/________]_``````````!C`&,`8P``````````````_________W\`
+M`````````&0`9`!D`````P````````#_________?P``````````90!E`&4`
+M```#`````````/________]_``````````!F`&8`9@``````````````____
+M_____W\``````````&<`9P!G``````````````#_________?P``````````
+M:`!H`&@``````````````/________]_``````````!I`&D`:0````,`````
+M````_________W\``````````&H`:@!J`````P````````#_________?P``
+M````````90````$```#_____@````/____\`````2E```+0/````````:@``
+M``$```#_____@````/____\`````2E```+0/````````_P$```$````!````
+M`0```%@;`````!```0````$````!````6!L```@``P`!``````````$```!8
+M&P``#``#``$``````````0```%@;```@`$<`````````````````6!L``#,`
+M,``!``````````$```!8&P``)``A``$````!`````0```%@;```H`#<``0``
+M```````!````6!L``!\`,``!`````0````$```!8&P``,`!;``$`````````
+M`0```%@;``!P``,``0`````````!````6!L``#@`-P`!``````````$```!8
+M&P``5`!5``$````!`````0```%@;``!$`%4``0````$````!````6!L``$P`
+M.P`!``````````````!8&P``8`!2``$````!`````0```%@;``!D`#0``0``
+M```````!````6!L``'P`(``!`````0````$```!8&P``F`!;``$````!````
+M`0```%@;``"<`%(``0````$````!````6!L``*H`$``!``````````$```!8
+M&P``O``#``$``````````0```%@;``"_`#8``0`````````!````6!L``,0`
+M-P`!`````0````$```!8&P``RP`W``$``````````0```%@;``#0`#<``0``
+M```````!````6!L``-8`$``!`````0````$```!8&P``V@`#````````````
+M`````%@;```R`S8``0`````````!````6!L``-X``P`!``````````$```!8
+M&P``Z0`W``$``````````0```%@;``#V`#<``0`````````!````6!L``/H`
+M-P`!``````````$```!8&P``_P`V``$``````````0```%@;```,`3```0``
+M``$````!````6!L``!0!-P`!``````````$```!8&P``+`$W``$`````````
+M`0```%@;``!``1```0````$````!````6!L``%0!`P`!``````````$```!8
+M&P``6`$A``$````!`````0```%@;``!<`3<``0`````````!````6!L``&`!
+M-P`!``````````$```!8&P``9`%;``$``````````0```%@;``!H`5(``0``
+M```````!````6!L``&P!4@`!`````0````$```!8&P``=`$W``$`````````
+M`0```%@;``!X`0,``0`````````!````6!L``'P!-P`!``````````$```!8
+M&P``B`%```$``````````````%@;``")`4$``0``````````````6!L``(H!
+M2``!``````````````!8&P``BP%#``$``````````````%@;``",`4H``0``
+M````````````6!L``(T!2P`!``````````````!8&P``CP%,``$`````````
+M`````%@;``"G#X```0``````````````6!L``*@/@0`!``````````````!8
+M&P``J0^"``$``````````````%@;``"J#X,``0``````````````6!L``*L/
+MA``!``````````````!8&P``K`^%``$``````````````%@;``"M#X8``0``
+M````````````6!L``*X/AP`!``````````````!8&P``KP^(``$`````````
+M`````%@;``"P#XD``0``````````````6!L``+$/B@`!``````````````!8
+M&P``L@^+``$``````````````%@;``"S#XP``0``````````````6!L``+0/
+MC0`!``````````````!8&P``M0^.``$``````````````%@;``"V#X\``0``
+M````````````6!L``+</D``!``````````````!8&P``N`^1``$`````````
+M`````%@;``"0`4(``0`````````!````6!L``(X!`P`!``````````$```!8
+M&P``F`%%``$````!`````0```%@;``":`44``0``````````````6!L``)L!
+M10`!``````````````!8&P``G`%>``$``````````````%@;``">`0,``0``
+M```````!````6!L``*P!-P`!``````````$```!8&P``I@$#``$`````````
+M`0```%@;``"V`3<``0`````````!````6!L``+@!-P`!``````````$```!8
+M&P``N@$W``$``````````0```%@;``"^`2$``0````$````!````6!L``"<#
+M`P`!``````````$```!8&P``R@%=``$``````````````%@;``#6`3<``0``
+M```````!````6!L``.0!$``!`````0````$```!8&P``[`$P``$````!````
+M`0```%@;``#X`0,``0`````````!````6!L``!`"-P`!``````````$```!8
+M&P``*@(B``$``````````0```%@;``!"`C<``0`````````!````6!L````"
+M6P`!``````````$```!8&P``2@(#``$``````````0```%@;``!/`A```0``
+M``$````!````6!L``%P"4@`!``````````$```!8&P``8`([``$````!````
+M`0```%@;``!H`C<``0`````````!````6!L``&P"-P`!``````````$```!8
+M&P``=@(0``$````!`````0```%@;``!Z`@,``0`````````!````6!L``(("
+M`P`!``````````$```!8&P``@P(#``$``````````0```%@;``"J`B$``0``
+M```````!````6!L``+X"6P`!`````0````$```!8&P``OP(W``$`````````
+M`0```%@;``#!`C<``0`````````!````6!L``,8".P`!``````````$```!8
+M&P``U`(W``$``````````0```%@;``#P`C<``0`````````!````6!L``/0"
+M-P`!``````````$```!8&P``^`(#``$``````````0```%@;``">`%```0``
+M``$````!````6!L``/P"`P`!``````````$```!8&P``#`,P``$`````````
+M`0```%@;```4`S8``0`````````!````6!L``!@#-@`!``````````$```!8
+M&P``)`,#``$``````````0```%@;```0`P,``0`````````!````6!L``#H#
+M-P`!``````````$```!8&P``2`,0``$````!`````0```,$6``!*`Q(``0``
+M``$````!````6!L``%H#$0`!``````````$```!8&P``7`,Z``$````!````
+M`0```%@;``!>`U8``0`````````!````6!L``,`"`P`!``````````$```!8
+M&P``=P,#``$``````````0```%@;``#,`@,``0`````````!````6!L`````
+M```S$ST3%P`*!0``````````$``````````0`````````$<341,7``H%````
+M```````0`````````!``````````.!-T$Q<`%!0``````````!``````````
+M!P````````!.$WL3&P8%!0```````````0```````````````````%$3>1,>
+M!@H%```````````!````````````````````5A-T$R$&%`4```````````$`
+M``````````````````"K$[`3%P`*!0``````````$``````````,````````
+M`+`3V!,7`!04```````````0``````````(`````````OQ._$Q<`"@4`````
+M`````!``````````#```````````%'@4!084%```````````````````````
+M`````````#(4;A07`!04```````````8``````````$`````````,A1N%!0`
+M%!0``````````!@``````````0`````````\%'@4#P`4%```````````!0``
+M`````````````````#P4>!01!A04```````````!``````````$`````````
+M/!1X%!(`%!0```````````4````````````````````\%'@4%``4%```````
+M````!0```````````````````#P4>!07`!04```````````%````````````
+M````````/!1X%!<&%!0```````````$````````````````````\%,@4%`84
+M%`(`````````!````````````````````'@4H!07`!04`0`````````%````
+M````````````````C!2@%!<`%!0#``````````4```````````````````",
+M%,@4$@`4%`,`````````!0```````````````````(P4R!04`!04!P``````
+M```%@```````````````````C!3(%!0&%!0#``````````$``````````@``
+M``````",%,@4%P84%`,``````````0`````````"`````````(P4R!07!A04
+M`P`````````!````````````````````C!3(%!X`%!0`````````````````
+M``````````````",%$06!084%`,``````````````````````````````*`4
+MR!01!A04`P`````````!````````````````````?!7T%1X&%!0"````````
+M``0```````````````````!\%406%`84%`,``````````0`````````$````
+M`````'P51!8;`!04`P`````````%````````````````````?!5$%AX`%!0#
+M``````````4```````````````````!\%406%P`4%`<``````````8``````
+M`````````````'$6K187`!04````````````````````````````````<1:M
+M%AX&%!0```````````````````````````````!Q%JT6'@84%`(`````````
+M!````````````````````'$6P18%!A04````````````````````````````
+M````<1;!%A$`%!0```````````````````````````````!Q%L$6%``4%```
+M`````````````````````````````'$6P18>`!04````````````````````
+M````````````<1;!%AX&%!0``````````````````````P````````!Q%L$6
+M'@84%````````````````````````````````#@3=!,>`!04````````````
+M!```````````````````L!/8$QX`%!0````````````$````````````````
+M```R%&X4'@`4%`,```````````0``````````````````#P4>!0>`!04`P``
+M````````!```````````````````C!3(%!X`%!0#```````````$````````
+M``````````!Q%L$6'@`4%`````````````0``````````````````'P51!8>
+M`!04`P``````````!```````````````````C!3(%!X`%!0`````````````
+M```````````````````\%'@4'@`4%```````````````````````````````
+M`,$6P18>`!04````````````!```````````````````"A1:%`4&*"@`````
+M``````````````````````````""%-(4!08H*`$`````````````````````
+M`````````/H4<A4%!B@H````````````````````````````````FA42%@4&
+M*"@!```````````````````````````````>%$84!08H*```````````````
+M`````````````````&X4OA0%!B@H`0``````````````````````````````
+MYA1>%04&*"@```````````````````````````````"&%286!08H*`$`````
+M`````````````````````````%`4>!01!B@H````````````````````````
+M````````4!1X%!<&*"@```````````````````````````````!:%%H4$08H
+M*````````````````````````````````%H46A07`"@H````````````````
+M````````````````H!2@%!<&*"@!``````````(```````````````````"@
+M%*`4%`8H*`$``````````@```````````````````((4@A01`"@H`0``````
+M```"````````````````````JA2J%!0`*"@!``````````(`````````````
+M``````""%*H4%``H*`$``````````@```````````````````((4JA07!B@H
+M`0`````````"````````````````````I!4<%A0&*"@!``````````(`````
+M``````````````"`%J@6%``H*````````````````````````````````(`6
+MJ!8>!B@H````````````````````````````````A1:M%AX&*"@`````````
+M``````````````````````!:%((4#P`H*`,```````````0`````````````
+M`````*H4JA02`"@H`P``````````!```````````````````I!4<%A0`*"@#
+M```````````$``````````````````"`%J@6%``H*`````````````0`````
+M``````````````@)1`D%!A0%````````````````````````````````"`E$
+M"10`%`4```````````````````````````````!L":@)!084!0``````````
+M`````````````````````&P)J`D4`!0%```````````@````````````````
+M````;`FH"1X`%`4```````````````````````````````!L"9X)&P84!0``
+M`````````````````````````````&P)G@D4`!0%```````````@````````
+M````````````@`F*"10`%`4```````````````````````````````"9":@)
+M%``4!0```````````````````````````````*,)J`D4`!0%```````````@
+M(```````````````````M`FT"04&%`4`````````````````````````````
+M``"T";0)%``4!0``````````("@``````````````````-`)K`H%!A0%````
+M````````````````````````````"`E$"10`%`4`````````````````````
+M``````````!L"6P)%``4!0```````````````````````````````'$)@`D4
+M`!0%````````````````````````````````A0F*"10`%`4`````````````
+M``````````````````"/"9D)%``4!0``````````````````````````````
+M`)X)G@D4`!0%````````````````````````````````HPFC"10`%`4`````
+M```````$``````"```````````"C":,)%``4!0```````````````````(``
+M`````````*@)J`D4`!0%````````````!```````@```````````J`FH"10`
+M%`4```````````````````"```````````"T";0)%``4!0````````````0`
+M`````(```````````+0)M`D4`!0%````````````````````@```````````
+M"`E$"04&%`4````````````````````````````````("40)%``4!0``````
+M`````````````````````````&P)J`D%!A0%````````````````````````
+M````````;`FH"10`%`4``````````$````````````````````!L":@)'@`4
+M!0```````````````````````````````&P)G@D;!A0%````````````````
+M````````````````;`F>"10`%`4``````````$````````````````````"`
+M"8H)%``4!0```````````````````````````````)D)J`D4`!0%````````
+M````````````````````````T`FL"@4&%`4`````````````````````````
+M``````"C":@)%``4!0``````````("````````````````````@)1`D4`!0%
+M````````````````````````````````;`EL"10`%`4`````````````````
+M``````````````!Q"8`)%``4!0```````````````````````````````(4)
+MB@D4`!0%````````````````````````````````CPF9"10`%`4`````````
+M``````````````````````">"9X)%``4!0``````````````````````````
+M`````*,)HPD4`!0%````````````!```````@```````````HPFC"10`%`4`
+M``````````````````"```````````"H":@)%``4!0````````````0`````
+M`(```````````*@)J`D4`!0%````````````````````@```````````"`E$
+M"04&*"@```````````````````````````````"%"84)!08H*```````````
+M`````````````````````(4)A0D4!B@H````````````````````````````
+M````A0F%"1(&*"@````````````$``````````````````#0":P*!08H*```
+M`````````````````````````````/\!$````````0``````````````````
+M``````````````(`""```````````````/\`````````````````````$20`
+M````````````````!10```````````````````4"```````````````````3
+M````````````````````4`$0````````````````````````````````````
+M``````````$`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````!0`A`````````````````````````````````````````````$
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`%`#$```````````````````````````````````````````$`@`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````4`00````
+M````````````````````````````````````@```@```````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!0!1``````````````
+M``````````````````````````````!`````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````%`&,````````@`````````#````
+M`````````````````(!``(`````````````````("0``````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````4`@P`````````````````````````````P``
+M```````````$``$`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````!0"3````````(`````````!``````````#````````````
+M!"`0````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````#`!,````````@`````````$``````````,```````````!`@```"```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````,`(P
+M```````"``````````0``````````P``````````0```````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````P`S````````(`
+M````````!``````````#````````````0`````@`````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````#`$,````````@`````````$
+M``````````,``````````$`@````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````,`4P```````"``````````0`````````
+M`P``````````$```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````P!C````````(`````````!``````````#````````
+M````$0`!````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````!`!$````````````````````````````````````````"```0`"
+M```````````````$$@``````````````````$2``````````````````````
+M````````````````````````````````````````````````````````````
+M(`$0``````````````````````````````````````````("``0`````````
+M```````````````````````````2(```````````````````````````````
+M``````````````````````````````````````````````````!@`1``````
+M``$``````````P`````````````````````@@$```@``````````````Q!``
+M`````````````````"$$````````````````````````````````````````
+M`````````````````````````````````````````&4!$````````0``````
+M```#````````````````````.```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````0`%```````````````````@`````
+M`````@``````````!```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````!``D``````````````````$``````````"````
+M`````,<%````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````$`#0```````````````````@`````````(``````````(``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````0`1````````$``````````"``````````@``````````@$``````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````!`!4``
+M``````0``````````(`````````"``````````"`0``"````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````$`&0```````````
+M```````(``````````(``````````(@`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````0`=````````$``````````B`
+M`````````@``````````A$``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````!`"$````````0`````````"(`````````"
+M``````````"$0``"````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````$`)0```````````````````@`````````(`````````
+MQX$`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````0`M````````$``````````"``````````@````````#'@4``````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!0
+M#?\`````````````````````````````````````````````````````````
+M``````````````````````````````````````````````H`````````````
+M```````*`````````````````````````````````````````#`*_P``````
+M``````````"```````````,`````````````````````````````````````
+M``````````````````````````````````````$````````````````````!
+M```````````````````$````````````````````,`LP````````````````
+M```!`````````P``````````````````````````````````````````````
+M``````````````````````````"`````````````````````@```````````
+M``````````0````````````````````P##````````````````````(`````
+M```#````````````````````````````````````````````````````````
+M`````````````````!`````````````````````0````````````````````
+M!````````````````````!`*$```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````(````````````````````"`````````````````````$````````
+M````````````0`I``````````````````&!X`````````@``````````````
+M``````````````````````````````````````````````````````````!`
+M"@``````````````````0`0```````````````````0`````````````````
+M``!0"D``````````````````````````````````````````````````````
+M``````````````````````````````````````````````````@`````````
+M```````````(````````````````````!````````````````````)D!,```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````"```````````````````
+M``@````````````````````$````````````````````8`#_```````#````
+M```````$````````"````````````````.`#``````````````#``@``````
+M````````````````````````````````P*\``````````````````/`+````
+M``````````````@```````````````````!F`/\```````,```````````0`
+M```````(````````````````X`,``````````````,`"````````````````
+M``````````````````````#`!P``````````````````\`$`````````````
+M````"````````````````````&<`_P```````P``````````!`````````@`
+M``````````````#@`P``````````````P`(`````````````````````````
+M`````````````,`O``````````````````#P"P`````````````````(````
+M````````````````:`#_```````#```````````$````````"```````````
+M`````.`#``````````````#``@``````````````````````````````````
+M````P%<``````````````````/`5``````````````````@`````````````
+M``````!A`/\```````,```````````0````````0````````````````X`,`
+M``````````````````````````````````````````````````````#`KP``
+M````````````````\`L`````````````````"````````````````````&(`
+M_P```````P``````````!````````!````````````````#@`P``````````
+M````P`(``````````````````````````````````````,"O````````````
+M``````#P"P`````````````````(````````````````````8P#_```````#
+M```````````$````````"````````````````.`!``````````````#``@``
+M````````````````````````````````````P"\``````````````````/`+
+M``````````````````@```````````````````!D`/\```````,`````````
+M``0````````0```````````````(`!P``````````````,`"````````````
+M``````````````````````````#`!P``````````````````\`$`````````
+M````````"````````````````````&4`_P```````P``````````!```````
+M`!````````````````"$"```````````````````````````````````````
+M`````````````````,!7``````````````````#P%0`````````````````(
+M````````````````````:0#_```````#```````````$````````$```````
+M`````````,`#``````````````#``@``````````````````````````````
+M````````P`<``````````````````/`!``````````````````@`````````
+M``````````!J`/\```````,```````````0````````0````````````````
+MP`,```````````````````````````````````````````````````````#`
+M+P``````````````````\`L`````````````````"```````````````````
+M`)@!_P``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````0`#P`/,`
+MB('P`/,`00"``(,`B8&``(,`2`#R`/4`BH'R`/4`0P#V`/<`BX'V`/<`2@#Q
+M`/0`C('Q`/0`2P"!`(0`C8&!`(0`3`""`(4`CX&"`(4`B`'P`/,`B0&``(,`
+MB@'R`/4`BP'V`/<`C`'Q`/0`C0&!`(0`CP&"`(4````(````````````````
+M```````````````````````````````!`G`7"P",```````!`B@C#P`2````
+M```!`N`N"@"8`@`````!`E!&#@`D`@`````!`L!="0"P!``````!`J",#0!(
+M!``````!`H"["`!@!``````!`O#2#`!L!```````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```(```````````````````````````````````````````````!`W`7"P",
+M```````!`R@C#P`2```````!`^`N"@"8`@`````!`U!&#@`D`@`````!`\!=
+M"0"P!``````!`Z",#0!(!``````!`X"["`!@!``````!`_#2#`!L!```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````(````````````````````````````````````
+M```````````!`G`7"P",```````!`B@C#P`2```````!`N`N"@"8`@`````!
+M`E!&#@`D`@`````!`L!="0"P!``````!`J",#0!(!``````!`H"["`!@!```
+M```!`O#2#`!L!```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````(````````````````
+M```````````````````````````````!`W`7"P",```````!`R@C#P`2````
+M```!`^`N"@"8`@`````!`U!&#@`D`@`````!`\!="0"P!``````!`Z",#0!(
+M!``````!`X"["`!@!``````!`_#2#`!L!```````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```$```````````````````````````````````````````````!`.@#"P""
+M```````!`-`'"@2$`0`````!`'P5"02+`0`````!`/@J"`26`0``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````$H@`````````````(H@``1D8^4$9&/E`,H@``
+M;$&`9&Q!@&00H@```Z"9`0.@F0$4H@``$-9,!!#63`08H@``0`"`$T``@!,<
+MH@``8`#@&V``X!L@H@``"H!3#`J`4PPDH@``.]\4`#O?%``HH@``M0$``+4!
+M```LH@``(````"````"<F`````````````"<F`````````````"<F```````
+M``````"<F`````````````"<F`````````````"<F`````````````"<F```
+M``````````"<F`````````````"<F`````````````"<F`````````````"<
+MF`````````````"<F``````X````.`"<F`````````````"<F```````````
+M``"<F`````````````"<F```^0`$`/D`!`#4F`````````0```"<F```````
+M``````"<F`````````````"<F`````````````"<F`````````````"<F```
+M``````````"<F```````$````!"<F```````!`````2<F`````````````"<
+MF`````````````"<F`````````````"<F`````````````J<F```@``X`(``
+M.`*<F```!@`"``8```"<F```D@```)(```"<F```H````*````"<F```!P`$
+M``<`!`#4F```&@```!H```"<F```2````$@```"<F```$````!````"<F```
+M"`````@```"<F```#P````\```"<F```\@```&(```"<F```3Y```$R0``"<
+MF```6A(``)H2``#,F```#@````\````(````````````````````````````
+M```````````````````!`G`7"P",```````!`B@C#P`2```````!`N`N"@"8
+M`@`````!`E!&#@`D`@`````!`L!="0"P!``````!`J",#0!(!``````!`H"[
+M"`!@!``````!`O#2#`!L!```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````(````````
+M```````````````````````````````````````!`K@+"P"&```````!`I01
+M#P`)```````!`G`7"@",`@`````!`B@C#@`2`@`````!`N`N"0"8!``````!
+M`E!&#0`D!``````!`L!="``P!``````!`GAI#``V!```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````(```````````````````````````````````````````````!
+M`MP%"P"#```````!`LH(#P`$```````!`K@+"@"&`@`````!`I01#@`)`@``
+M```!`G`7"0",!``````!`B@C#0`2!``````!`N`N"``8!``````!`KPT#``;
+M!```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````'````````````````````````````
+M```````````````````!`W`7"P",```````!`^`N"@"8`@`````!`U!&#@`D
+M`@`````!`\!="0"P`P`````!`Z",#0!(`P`````!`X"["`!@`P`````!`_#2
+M#`!L`P``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````(````````
+M```````````````````````````````````````!`W`7"P",```````!`R@C
+M#P`2```````!`^`N"@"8`@`````!`U!&#@`D`@`````!`\!="0"P!``````!
+M`Z",#0!(!``````!`X"["`!@!``````!`_#2#`!L!```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````$```````````````````````````````````````````````!
+M`.@#&P""```````!`-`'&@2$`0`````!`'P5&02+`0`````!`/@J&`26`0``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````,````````````````````````````
+M```````````````````!`.@#&P""```````!`-`'&@2$`0`````!`'P5&02+
+M`@`````!`/@J&`26`P```````G`7"P`,!````````B@C#P`2!``````!`N`N
+M"@`8!@`````!`E!&#@`D!@`````!`L!="0`P"``````!`J",#0!("``````!
+M`H"["`!@"``````!`O#2#`!L"```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````-````````
+M```````````````````````````````````````!!/H``P"!`&0"9`(!!/0!
+M!P"!`,D!R0$!!.@#`@""`>0`Y``!!-`'!@"$`J``H``!!+@+`0"&`XP`C``!
+M`G`7"P",!#P`/``!`B@C#P`2!#P`/``!`N`N"@"8!C``,``!`E!&#@`D!C``
+M,``!`L!="0`P""P`+``!`J",#0!(""P`+``!`H"["`!@""P`+``!`O#2#`!L
+M""P`+```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````H4!8L6"@```0`!@`)``P`SP```,H```#_______\``&P)CPFT
+M"0```(```""8``#_______\``@<```!L"8\)M`D("6P)M`G_______\```"`
+M```@F````0`"``(``0`!``(``0```'\````R````?P```"@```!_````30``
+M`'\```!`````'P```!`````_````,`````@````&````U)@``"````#4F```
+M(````-28```@````U)@``"``````1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5L82YT
+M97AT`"YR96QA+G)O9&%T80`N<F]D871A+G-T<C$N,0`N<F5L82YD871A`"YS
+M9&%T80`N8G-S`"YC;VUM96YT````````````````````````````````````
+M```````````````````````````````````````````````````````````@
+M`````0````8```````````````````!``````````/P"`P``````````````
+M```$````````````````````&P````0`````````````````````````*"T$
+M``````#PEP(```````P````!````"``````````8`````````"L````!````
+M`@```````````````````$`#`P``````G)(```````````````````@`````
+M```````````````F````!``````````````````````````8Q08```````@K
+M````````#`````,````(`````````!@`````````,P````$````R````````
+M````````````W)4#``````#J`````````````````````0`````````!````
+M`````$<````!`````P```````````````````,B6`P``````4%4`````````
+M``````````@```````````````````!"````!```````````````````````
+M```@\`8``````,``````````#`````8````(`````````!@`````````30``
+M``$````#```0````````````````&.P#``````#`````````````````````
+M!````````````````````%0````(`````P```````````````````-CL`P``
+M````F`$```````````````````(```````````````````!9`````0``````
+M``````````````````#8[`,``````*@#```````````````````!````````
+M````````````$0````,`````````````````````````@/`#``````!B````
+M`````````````````0````````````````````$````"````````````````
+M`````````&CT`P``````N"8````````-````"`````@`````````&```````
+M```)`````P`````````````````````````@&P0```````<2````````````
+M```````!````````````````````````````````````````````````````
+M``````,``0````````````````````````````,``P``````````````````
+M``````````,`!0````````````````````````````,`!@``````````````
+M``````````````,`"`````````````````````````````,`"0``````````
+M``````````````````,`"@```````````````````````0```!*(`0#\_P``
+M`````*0`````````#````!*``0`\X@````````@`````````%P```!*(`0",
+MS0$``````$@"````````(@```!*(`0`TJ@```````.@`````````+0```!*(
+M`0!<^`$```````@$````````.````!*``0"\?P$``````)0`````````0P``
+M`!*(`0!(#`(``````%P"````````3@```!*(`0"\DP```````%P"````````
+M60```!*(`0"@>`(``````)P!````````9````!$`!@"`/0```````*0!````
+M````;P```!*(`0"\U@$``````'P`````````>@```!*(`0!,F````````&``
+M````````A0```!*(`0"0?0```````"@!````````D````!$`!@`<30``````
+M`*0!````````FP```!*``0`TPP$``````"P`````````I@```!*(`0`DNP$`
+M`````#@`````````L0```!*``0#8I@$```````P`````````O````!*``0#<
+M?`$``````-P"````````QP```!*(`0`8D`$``````-0!````````T@```!*`
+M`0!H#0```````*``````````W0```!*(`0``:`$``````-@`````````Z```
+M`!*(`0!X10$``````$`!````````\P```!*(`0!P&0$``````.@`````````
+M_@```!*(`0#T(0$``````#``````````"0$``!*(`0#(Z````````%P`````
+M````%`$``!*(`0`,R@$``````'``````````'P$``!*``0`4>P$```````@`
+M````````*@$``!*(`0`@H@$``````#0`````````-0$``!*(`0!D_`$`````
+M`$0!````````0`$``!*(`0"X"0```````(P`````````2P$``!*(`0#4@P$`
+M``````P!````````5@$``!*``0"@!@$```````@`````````80$``!*``0!T
+M7`(``````#`"````````;`$``!*``0#<[@````````@`````````=P$``!*(
+M`0`D(@$``````#0`````````@@$``!*(`0`T$P```````#@"````````G0$`
+M`!$`!@`P2````````*0!````````J`$``!*(`0`XO0$``````.@`````````
+MLP$``!*(`0"HZ@```````+P`````````O@$``!*``0"8`P```````$``````
+M````R0$``!*(`0!,8P(``````-@`````````U`$``!``````````````````
+M````````]0$``!*(`0`,HP```````)0```````````(``!*(`0!XP0$`````
+M`(P!````````"P(``!*(`0#,P`$``````*P`````````%@(``!*(`0"(;`$`
+M`````"@!````````(0(``!*(`0#,IP```````$P`````````+`(``!*(`0!T
+M$0$``````*@`````````-P(``!*(`0!8&@$``````/``````````0@(``!*(
+M`0#X;0$``````%``````````30(``!*(`0`T#0$``````#P`````````6`(`
+M`!*(`0"4O@$``````.@`````````8P(``!*``0`H[P```````'P!````````
+M;@(``!``````````````````````````=@(``!*(`0!0H0```````)``````
+M````@0(``!``````````````````````````B0(``!*(`0",X@```````%``
+M````````E`(``!*(`0#8L@$``````*@`````````GP(``!*(`0`('0$`````
+M`&``````````J@(``!*(`0`@O@$``````&``````````M0(``!*(`0`<O`$`
+M`````,0`````````P`(``!*(`0"P@0$``````,P`````````RP(``!*(`0#,
+M_0$``````%P`````````U@(``!*``0!$F`````````@`````````X0(``!*(
+M`0!\OP$``````/``````````[`(``!*(`0`DA````````&@,````````]P(`
+M`!*(`0!T'`$``````$```````````@,``!*(`0"$M@$``````+@`````````
+M#0,``!*(`0#L`@```````*P`````````&`,``!*(`0#@O`$``````%@`````
+M````(P,``!*(`0`X/@(``````%P!````````+@,``!*(`0#HGP$``````'@`
+M````````.0,``!*(`0`P"@(``````$P!````````1`,``!*(`0"DI@``````
+M`&P`````````3P,``!*(`0`(!P$``````$0!````````6@,``!*(`0"L#@$`
+M`````.P`````````90,``!*(`0"TX````````&``````````<`,``!*(`0!T
+M1P(``````"`!````````>P,``!*(`0!0RP```````'P%````````A@,``!*`
+M`0#<K0````````0`````````D0,``!*(`0"42`(``````%``````````G`,`
+M`!*(`0!PY````````%@$````````IP,``!*(`0"H`0```````#@!````````
+MM@,``!*(`0",)`(``````*0$````````P0,``!*(`0#<TP$``````%`!````
+M````S`,``!*(`0#\&P$``````#@`````````UP,``!*(`0"80P(``````(0"
+M````````X@,``!*(`0#\QP$``````!`"````````[0,``!*(`0!<U0$`````
+M`#0`````````^`,``!*``0#@`@````````P``````````P0``!*(`0`X%`$`
+M`````#0`````````#@0``!*(`0!(;@$``````"@!````````&00``!*(`0"P
+M;0$``````$@`````````)`0``!*(`0!0.@$``````'@`````````+P0``!*(
+M`0",D````````"P`````````.@0``!*(`0`0IP```````+P`````````100`
+M`!*(`0#8`P```````,P"````````6P0``!*(`0"0"`(``````&``````````
+M9@0``!*``0"D\````````%P"````````<00``!*(`0#8J0```````%P`````
+M````?`0``!*(`0"X`P$``````#0`````````AP0``!*(`0"H_0$``````"0`
+M````````D@0``!*(`0`$4@$``````%P`````````G00``!*(`0#(J@$`````
+M`&`'````````J`0``!*``0#XI`$```````@`````````LP0``!*(`0#PF0``
+M`````"@!````````O@0``!*(`0"@``$``````+P`````````R00``!*(`0#$
+M9P(``````'0`````````U`0``!*(`0!,IP$``````$P"````````WP0``!*`
+M`0"\&P$```````0`````````Z@0``!*(`0`TH@```````-@`````````]00`
+M`!*(`0!D;`$``````"0```````````4``!*(`0!,A0$``````"`*````````
+M"P4``!*(`0"<0@(``````/P`````````%@4``!*``0`<NP$```````@`````
+M````(04``!*(`0#\#`$``````#@`````````+`4``!*(`0"`V`$``````-``
+M````````-P4``!*``0`TX@````````@`````````0@4``!*``0`@5P(`````
+M`$`#````````304``!*``0!$)@$``````!P!````````6`4``!*(`0#,GP``
+M`````(@`````````8P4``!*(`0!LP`$``````&``````````;@4``!*(`0!L
+MCP$``````*P`````````>04``!*(`0#4=P$``````#P`````````A`4``!*(
+M`0`D9`(``````)@`````````CP4``!``````````````````````````G`4`
+M`!*``0#PXP```````(``````````IP4``!*``0"0MP```````!P!````````
+ML@4``!*``0`P7`(``````$0`````````O04``!*``0!X90(```````@`````
+M````R`4``!*(`0`$N`$``````/0`````````TP4``!*(`0`L!P```````#`"
+M````````Y`4``!*(`0"83`(``````#`&````````[P4``!*(`0`8J```````
+M`/@`````````^@4``!*(`0#(ZP```````!0!````````!08``!*``0"P&P$`
+M``````0`````````$`8``!*(`0!<NP$``````#@`````````&P8``!*(`0`\
+M>@(``````,@`````````)@8``!*(`0!`M@```````-``````````,08``!*(
+M`0`0F0$``````"@!````````/`8``!*(`0"H!@$``````&``````````1P8`
+M`!*(`0!8/0$``````*0"````````4@8``!*(`0`4X0```````"`!````````
+M708``!*(`0#`%P(``````/`*````````:`8``!*``0#4V@$``````/``````
+M````<P8``!*(`0#4SP$``````#``````````?@8``!*(`0!@)P$``````$0#
+M````````B08``!*(`0!@PP$``````)P$````````E`8``!*(`0#\%@$`````
+M`,``````````GP8``!*(`0#$&P$``````#@`````````J@8``!*(`0!\R@$`
+M`````!`#````````M08``!*(`0`\20(``````,@!````````P`8``!*(`0`X
+M:`(``````-`)````````RP8``!*(`0"T'`$``````%0`````````U@8``!*`
+M`0`$\P```````"@`````````X08``!*``0`TEP````````@`````````[`8`
+M`!*(`0!<`0$``````%P"````````]P8``!*(`0`@M0$``````(P`````````
+M`@<``!*(`0"4K@```````"P`````````#0<``!*(`0#LWP(``````.0`````
+M````&`<``!*``0#0K0````````0`````````(P<``!*``0#,NP$```````@`
+M````````+@<``!*(`0"TN0$``````'``````````.0<``!$`!@!D4```````
+M`*0!````````1`<``!*(`0#@>`$``````+0`````````3P<``!*``0"8@`(`
+M`````.``````````6@<``!*(`0"0JP```````.@`````````90<``!*(`0!8
+M(@$``````#0`````````<`<``!*(`0"LN````````.`#````````>P<``!*(
+M`0`L^`$``````#``````````A@<``!*(`0!DL@$``````#@`````````D0<`
+M`!*(`0"LM0$``````-@`````````G`<``!*(`0#`90(```````0"````````
+MIP<``!*(`0!DR0```````"@`````````L@<``!*(`0`HLP```````#0`````
+M````O0<``!*(`0"`I````````#@!````````R`<``!*(`0!$MP```````$P`
+M````````TP<``!*(`0`DM`$``````/P`````````W@<``!*(`0#4`0(`````
+M`'`%````````Z0<``!*(`0`,5`(``````!0#````````]`<``!$`!@#(0```
+M`````*0!````````_P<``!*(`0`8FP```````!`#````````"@@``!*(`0#`
+M;@```````(``````````%0@``!*(`0!$X@```````$@`````````(`@``!*(
+M`0`0MP```````#0`````````*P@``!``````````````````````````2P@`
+M`!*(`0",O````````-`+````````5@@``!``````````````````````````
+M70@``!$`!@````````````D`````````;0@``!*(`0"D#@(``````)0`````
+M````>`@``!``````````````````````````@`@``!*(`0"8#P$``````'P`
+M````````BP@``!*(`0`8`@,``````.0`````````E@@``!*``0#LD0$`````
+M`(0`````````H0@``!*(`0!PMP$``````)0`````````K`@``!*``0#@K0``
+M``````0`````````MP@``!*(`0!@"0(``````-``````````P@@``!*``0"T
+M&P$```````@`````````S0@``!*(`0`H(0$``````#@`````````V`@``!*(
+M`0!,"`$``````"@!````````XP@``!*(`0#4NP$``````$``````````[@@`
+M`!``````````````````````````_0@``!*(`0"0$`$``````)``````````
+M"`D``!$`!@#`3@```````*0!````````$PD``!*(`0"DTP$``````#@`````
+M````'@D``!*(`0#<F@$``````+P`````````*0D``!*(`0"X1@$``````*P`
+M````````-`D``!*(`0!`R0```````"0`````````/PD``!*(`0`4&`$`````
+M`.@`````````2@D``!*(`0``I0$``````-@!````````50D``!$`!@#420``
+M`````*0!````````8`D``!*(`0`$PP$``````#``````````:PD``!*(`0"`
+M$P$``````+@`````````=@D``!*(`0#DV0$``````/``````````@0D``!*(
+M`0#0=0(``````-`"````````C`D``!*(`0!T"0$``````$P#````````EPD`
+M`!*(`0"0M````````&@`````````H@D``!*``0!`#@$``````#@`````````
+MK0D``!*(`0`02P$``````,`!````````N`D``!*``0",U````````"@`````
+M````PPD``!*(`0"LUP$``````-0`````````S@D``!$`!@!X2P```````*0!
+M````````V0D``!*(`0`4$`$``````'P`````````Y`D``!*(`0"H$@$`````
+M`-@`````````[PD``!*(`0"XI0```````+@`````````^@D``!*(`0``4P(`
+M`````#P`````````!0H``!``````````````````````````%`H``!*``0`<
+M>P$``````$0`````````'PH``!*(`0"<L@$``````#P`````````*@H``!*(
+M`0!DG@```````#@`````````-0H``!*``0"`O@$``````!0`````````0`H`
+M`!*``0"H&P$```````@`````````2PH``!*``0"XLP$``````&P`````````
+M5@H``!$`!@!L0@```````*0!````````80H``!*(`0#8)0$``````#0`````
+M````;`H``!*(`0#L`P$``````'P!````````=PH``!*(`0!<`0```````$P`
+M````````A0H``!$`!@`D/P```````*0!````````D`H``!*(`0`()0$`````
+M`-``````````FPH``!*``0!H!0$```````@`````````I@H``!$`!@`0````
+M`````$@`````````N`H``!*(`0"@HP```````$0`````````PPH``!*``0!X
+MI`````````@`````````S@H``!*(`0#DI@$``````&@`````````V0H``!*(
+M`0#$L0```````(P`````````Y`H``!*(`0#L?`(``````*P#````````[PH`
+M`!*(`0!0L@```````#@`````````^@H``!*``0!<&0$``````!0`````````
+M!0L``!*(`0`HU@$``````)0`````````$`L``!*``0!,?````````.P`````
+M````&PL``!*(`0#(4@(``````#@`````````)@L``!*(`0`T)`$``````-0`
+M````````,0L``!*(`0!(&P$``````&``````````/`L``!*(`0#$U0$`````
+M`&0`````````1PL``!*(`0`0>`$``````$``````````4@L``!*(`0#D2`(`
+M`````%@`````````70L``!*(`0#\&`$``````&``````````:`L``!*(`0"P
+M(@(``````(@!````````<PL``!*(`0!P!0$``````#`!````````?@L``!*`
+M`0!@>P$``````'P!````````B0L``!$`!@`01````````*0!````````E`L`
+M`!*(`0`HM````````&@`````````GPL``!*(`0"`90(``````$``````````
+MJ@L``!*(`0!,E@```````.@`````````M0L``!*(`0"(L@```````'``````
+M````P`L``!*(`0#X<`$``````*0&````````RPL``!*(`0`@K@```````'0`
+M````````U@L``!*``0!\JP```````!0`````````X0L``!*(`0"8FP$`````
+M``P#````````[`L``!*(`0`<1@(``````%@!````````]PL``!*(`0`,)@$`
+M`````#@``````````@P``!*(`0`X?0```````%@`````````#0P``!*(`0!$
+MH0$``````-P`````````&`P``!*``0#$$0```````*``````````(PP``!*(
+M`0#`"P```````*@!````````+@P``!*(`0!LGP$``````'P`````````.0P`
+M`!*(`0!XK````````/``````````1`P``!*(`0#XL@```````#``````````
+M3PP``!*(`0#D.P(``````)P`````````6@P``!*(`0#8H````````'@`````
+M````90P``!*(`0`X)`(``````%0`````````<`P``!*(`0!H:P```````$0`
+M````````>PP``!*``0"D!@```````(@`````````A@P``!*``0"`LP$`````
+M`#@`````````D0P``!``````````````````````````H0P``!*(`0!@4@$`
+M`````.P!````````K`P``!*(`0`8E@```````#0`````````MPP``!*``0!@
+M6@(``````-`!````````P@P``!*(`0#@H0```````%0`````````S0P``!*(
+M`0"8J0$``````#`!````````V`P``!*(`0`$%@$``````/@`````````XPP`
+M`!*``0"4>0$``````(`!````````[@P``!``````````````````````````
+M#@T``!*(`0!$"@```````'P!````````&0T``!*(`0#@G@```````*P`````
+M````)`T``!*``0",GP```````#@`````````+PT``!*``0!X#@$``````#0`
+M````````.@T``!*(`0"LF````````$0!````````10T``!*(`0`<$@$`````
+M`(P`````````4`T``!*(`0!PD@$``````$P&````````6PT``!*(`0`T'`$`
+M`````#@`````````9@T``!*(`0#$VP$``````.P#````````<0T``!*``0#(
+MK0````````@`````````?`T``!*(`0`HG@```````#P`````````APT``!*`
+M`0!PI`````````@`````````D@T``!``````````````````````````H`T`
+M`!*(`0#`#`$``````#P`````````JPT``!*(`0`(#P```````,P`````````
+MM@T``!*(`0#DK0```````#P`````````P0T``!*(`0#`(P$``````'0`````
+M````S`T``!*(`0!H'0$``````#``````````UPT``!*(`0`LR@```````"0!
+M````````X@T``!*(`0#XM````````'0`````````[0T``!*(`0#DHP``````
+M`(P`````````^`T``!*(`0`HL@$``````#P``````````PX``!*(`0"0U0$`
+M`````#0`````````#@X``!*(`0`@]P$```````P!````````&0X``!*(`0`@
+M$0$``````%0`````````)`X``!*(`0#PH`$``````%0`````````+PX``!*(
+M`0`X#P(``````(@(````````.@X``!*(`0!PI@```````#0`````````10X`
+M`!*(`0!@(0$``````)0`````````4`X``!*(`0!L%`$``````&P`````````
+M6PX``!*``0#<[``````````"````````9@X``!*(`0!X#0$``````,@`````
+M````<0X``!*``0#`&P$```````0`````````?`X``!*(`0#<X@```````!0!
+M````````APX``!$`!@`(4@```````*0!````````D@X``!*``0#8G@``````
+M``@`````````G0X``!*``0!P#0$```````@`````````J`X``!*(`0``DP``
+M`````+P`````````LPX``!*(`0`\EP````````@!````````O@X``!*(`0!@
+MH`$``````)``````````R0X``!*(`0!D$@```````-``````````U`X``!*`
+M`0`L8P(``````"``````````WPX``!*``0`4O`$```````@`````````Z@X`
+M`!*(`0"4%0$``````'``````````]0X``!*``0"4.@(``````%`!````````
+M``\``!*(`0"<(`$``````(P`````````"P\``!*(`0"D*@$``````(@/````
+M````%@\``!$`!@"L4P```````*0!````````(0\``!*(`0#PF`$``````"``
+M````````+`\``!*(`0!4H````````(0`````````-P\``!*(`0!<"0``````
+M`%P`````````0@\``!*(`0"<G@```````#P`````````30\``!*``0"D7@(`
+M`````(@$````````6`\``!*(`0#L2P(``````*P`````````8P\``!*(`0!<
+MLP```````#0`````````;@\``!*(`0"\%P$``````%@`````````>0\``!*(
+M`0`LU0$``````#``````````A`\``!*(`0"0LP```````)@`````````CP\`
+M`!*(`0"HD0```````-``````````F@\``!*(`0`<JP```````&``````````
+MI0\``!*(`0`4^P```````%``````````L`\``!*``0#4#P```````/`!````
+M````NP\``!*``0"X?P$```````0`````````Q@\``!*(`0`DZ0```````'@`
+M````````T0\``!*(`0#P(@$``````&@`````````W`\``!*``0#4K0``````
+M``@`````````YP\``!*(`0!8<`$``````*``````````\@\``!*(`0`XUP$`
+M`````'0`````````_0\``!*(`0"XEP(``````,@`````````"!```!*(`0!H
+MK0```````&``````````$Q```!*(`0"X?@```````#@`````````'A```!*(
+M`0#,<P```````(`(````````-!```!*(`0!0V0$``````)0`````````/Q``
+M`!*(`0!LM0```````-0`````````2A```!*(`0"PWP$``````'`7````````
+M51```!*(`0!4H@$``````*0"````````8!```!*(`0!0>`$``````)``````
+M````:Q```!*(`0!8(P$``````&@`````````=A```!*(`0"<Z0````````P!
+M````````@1```!*(`0#8:@```````)``````````C!```!*``0#D[@``````
+M`$0`````````EQ```!*(`0",R0```````*``````````HA```!*(`0",(@$`
+M`````&0`````````K1```!*(`0`L.@$``````"0`````````N!```!*(`0!X
+MD@```````(@`````````PQ```!*``0``\P````````0`````````SA```!*(
+M`0`0J0```````,@`````````V1```!*(`0#$9@$``````$P`````````Y!``
+M`!*(`0`8TP$``````(P`````````[Q```!*(`0`DN@$``````/@`````````
+M^A```!*(`0#8%`$``````+P`````````!1$``!*(`0#X\P```````!P'````
+M````$!$``!*(`0#0V@````````@%````````&Q$``!*(`0"4NP$``````#@`
+M````````)A$``!*(`0"<=P$``````#@`````````,1$``!*(`0`4OP(`````
+M`-``````````/!$``!*(`0#XN`$``````+P`````````1Q$``!*(`0"DG@$`
+M`````,@`````````4A$``!*(`0`H_@$``````*P#````````71$``!*(`0`\
+M4P(``````$``````````:!$``!``````````````````````````>A$``!*(
+M`0`L_P```````-``````````A1$``!*(`0`XF@$``````*0`````````D!$`
+M`!``````````````````````````H1$``!*``0#$GP````````@`````````
+MK!$``!*``0!L'`$```````@`````````MQ$``!*(`0!DZP```````&0`````
+M````PA$``!*(`0`\MP$``````#0`````````S1$``!*(`0#D,0(``````*P!
+M````````V!$``!*(`0#(.@$``````)`"````````XQ$``!*(`0!`;@``````
+M`(``````````_!$``!*(`0!\4P(``````)```````````'IZ,#`U8C4X-#8`
+M>GHP,#)D8C$Q8P!Z>C`R9&)F.#<U`'IZ,#)D8F(Q8C(`>GHP,F1B,C`U,P!Z
+M>C`P,F1B830R`'IZ,&9B8C%E,V8`>GHP8C<Y96$Y-`!Z>C`U8CAC-C5A`'IZ
+M,#`U8C0P860`>GHP-6(Y-#)E9`!Z>C!D.&1C-C)C`'IZ,#`Q.68T-S``>GHP
+M,F1D.30R9`!Z>C`R9&)E-S-D`'IZ,#`U8C8Y,F(`>GHP8C9D,C,R-0!Z>C`P
+M-6(X-3-D`'IZ,#`Q-F0Y,F4`>GHP8V9B,3@W-0!Z>C`P,F1B,S%C`'IZ,#)D
+M86)B86,`>GHP,F1B8S@U,0!Z>C`P,&(V8S8X`'IZ,#`P8C9B9C@`>GHP,&(V
+M8V8U90!Z>C`Q-F4Q9&9D`'IZ,&(V9C4P8C@`>GHP-F4P831F90!Z>C`P-C=D
+M,F(Q`'IZ,#`R9&)C-C$`>GHP8C9C83,R-0!Z>C`P-6(V8V9D`'IZ,#$V93!D
+M9F0`>GHP,#!B-F8V.`!A=&A?:&%L7W!R;V-E<W-?;F]I<V5F;&]O<@!Z>C`P
+M-6(T.&%D`'IZ,#)D8F8Q8C(`>GHP,#5B.#AC8@!Z>C`S,V5C.&)F`'IZ,&1B
+M-#(U8S4`871H7VAA;%]D;6%?8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP,&(V
+M9C$V,0!Z>C`V93`P8CAA`'IZ,#)D8F9C,60`>GHP9&,T93,Y,`!Z>C!D869E
+M9#@V`'IZ,#!B-F4R-V$`>GHP,F1B8F%B,@!Z>C!B-F0Q969F`'IZ,#$V9#DP
+M9&0`>GHP,F1B93@U,0!Z>C`P-6(V-&9D`%]?9&EV<74`>GHP,#!B-F0U,@!?
+M7W)E;6QU`'IZ,&(V8SEE9F8`>GHP,39E,#!D9`!Z>C`R9&)D.#<U`'IZ,#)D
+M8C,Q8C(`>GHP,&(W,#DR,P!Z>C`P8C9D-#4P`'IZ,#`P8C9D,60`>GHP8C9C
+M,C,R-0!Z>C`R9&)D86(R`'IZ,#`P-6(V,S(`>GHP-F1E9&0Y,P!Z>C`P,39D
+M834P`'IZ,#`P-C=D,S(`>GHP,&(V9#DR,P!Z>C`P,F1B-3%C`'IZ,#$V9&-B
+M9F4`>GHP,&(W,#$T-0!Z>C`P,39D9C)C`'IZ,&(W9F%D,V4`>GHP,39D.3DR
+M,`!Z>C`R9&(Q8F%C`'IZ,&1C-F4S.3``>GHP-6(W,#%E,`!Z>C`P,&(V8C$P
+M`'IZ,&(W,#EE9F8`>GHP,39D9C@Y8@!A=&A?:&%L7V%T=&%C:`!Z>C`V93!F
+M8S!D`'IZ,#$V9&%B,F0`>GHP,F1B,3,U9`!Z>C!E,#0V.#1B`'IZ,#$V93(Y
+M,60`>GHP,#!B-F9E.`!Z>C`P8V9B,V4P`'IZ,#`Q-F0Y-#@`>GHP,39E,C`Y
+M8@!Z>C!B-S`Q969F`'IZ,#`P8C9C.60`>GHP,#`U8C5A,@!Z>C`R9&(Q-S!A
+M`&%T:%]H86Q?8V]M<'5T971X=&EM90!Z>C`R9&(U8F%C`'IZ,#`U8C@Q,V0`
+M>GHP,&(V8SDR,P!Z>C!B-F(U,&(X`'IZ,#`U8C=F.60`>GHP8C<P,60P,@!Z
+M>C`V9&9F-#1A`'IZ,#)D8C4W-C,`>GHP-F5E868V,`!Z>C!E,#`W8V$Q`'IZ
+M,#`R9&%F-C(`>GHP8C@S860S90!Z>C`P,&(V8CDP`'IZ,#$V9#EE9F$`>GHP
+M,39D93`U,0!Z>C`P,#5B-F(R`'IZ,#5B-V8Q,30`>GHP-&%E,#,Q9@!Z>C`R
+M9&)D9&9D`'IZ,#`U-#=F960`>GHP,&(V8F8U90!Z>C`P8C<Q-S=D`'IZ,#!B
+M-S!F,V0`>GHP,39D.#DR,`!Z>C`R9&(Q86(R`'IZ,#`P-6(V,C(`>GHP,#!B
+M-F8W.`!Z>C!B-CEB,#=C`&%T:%]H86Q?9G)E90!Z>C`U8C<Y8C%B`'IZ,#!B
+M-S`W,V0`>GHP,F1B96)B9`!Z>C!B-64S,34R`'IZ,#$V9&9B9C$`871H7VAA
+M;%]M:'HR:65E90!Z>C`Q-F4Q.#EB`'IZ,&1C,F$U8S4`>GHP,#)D8S8P8@!Z
+M>C`V9&8P8CAA`'IZ,#)D8C,S-60`>GHP8C9C-3-A-`!Z>C!F-31D,6(P`'IZ
+M,&(V9F0S-C,`>GHP9#ED8S8R8P!Z>C`U8C<T,64P`'IZ,#)D83EB86,`>GHP
+M9&,R,60S80!Z>C`P8C<Q-S-D`'IZ,#$V9#ED-#$`>GHP,#5B.#1F9`!Z>C`P
+M-6(X86)D`'IZ,#!B-S`Q,C,`>GHP,#5B-C4R8@!Z>C`R9&(S.#<U`'IZ,#$V
+M93,P.6(`>GHP,#5B-C!B,@!Z>C`R9&(Q.#<U`'IZ,#`R9&(X-#(`>GHP,F1B
+M,3<V,P!Z>C!B-V1E83DT`'IZ,#!B-S`Q-C$`>GHP,39D-V0T,0!Z>C`P,39C
+M9#,R`'IZ,#9D93!B.&$`>GHP-F0Y9&0Y,P!Z>C!D8C-E9#@V`'IZ,#`U8C0X
+M960`>GHP,#)D8S@P8@!Z>C`P,F1B8S0R`'IZ,#)D8F$X-3$`>GHP,F1B,S-E
+M9`!Z>C`P-6(X,&9D`'IZ,#`U8C=F,F4`>GHP,F1B9F1F9`!Z>C`Q-F4V-#AA
+M`'IZ,#`R9&%F9C(`>GHP,#5B-S<Y9`!Z>C`P,&(V964X`'IZ,#$V930T.&$`
+M>GHP,&(V9C9B8P!Z>C`Q-F1A.3(P`'IZ,#5B-S@Q93``>GHP,#)D8V$P8@!Z
+M>C`P-6(T-&%D`'IZ,#9D9&8T-&$`>GHP9F%C,&,Y8@!Z>C!B-F8Y969F`'IZ
+M,#!B-F,V8F,`871H7VAA;%]A9&1I=&EO;F%L7W-W8F%?8F%C:V]F9@!Z>C`P
+M,#)D8CDR`%]?9&EV;`!A=&A?:&%L7W9E<G-I;VX`>GHP,F1B86,R90!?7V1I
+M=FQU`'IZ,#)D8C<Y864`>GHP,#$V934S,@!Z>C!B-F-F,#`Y`'IZ,#`Q-F4Q
+M,F,`>GHP,#$V9#EE-`!Z>C`P,#)D865A`'IZ,#`U8C5C8C(`>GHP,39D83(U
+M,0!Z>C`V9C9A9C8P`'IZ,#9D9F1D.3,`871H7VAA;%]M86QL;V,`>GHP,#!B
+M-F1D,@!Z>C`R9&0Y,F%D`'IZ,#$V9&(R-3$`>GHP93$P-V-A,0!Z>C`P8C9C
+M-S5E`'IZ,#$V9&0P-3$`>GHP,F1B9#%B,@!Z>C`R9&,Q-S8S`'IZ,&(V.3!D
+M-F0`>GHP,39D9C`U,0!Z>C`P,39D.34P`'IZ,#!B-S`V8F,`>GHP,#$V9#@W
+M,@!Z>C`V9&5F-#1A`'IZ,#5B.&,R960`>GHP-F9B.30W8@!Z>C!E8F(Q93-F
+M`'IZ,&(V9CED,#(`>GHP9#$T9#%B,`!Z>C!B-#@P,S%E`'IZ,#$V9&)B9F4`
+M>GHP,39E-30X80!Z>C`P,39D.#4P`'IZ,#`P8C9F9C@`871H7VAA;%]M96UC
+M<'D`>GHP,F1B8V)B9`!Z>C`Q-F1A,&1D`'IZ,#)D8F)D9F0`>GHP,F1B,C@U
+M,0!Z>C`R9&)D8S%D`'IZ,#9D8C!C9C(`>GHP,39E8CEA9`!Z>C`P8C9C96)C
+M`'IZ,&0Y-#@T83$`871H7VAA;%]P<F]B90!Z>C`Q-F5A.6%D`'IZ,&9D-&0Q
+M8C``>GHP,F1B,S<V,P!A=&A?:&%L7V)U:6QD;W!T<P!Z>C`R9&%F,S5D`'IZ
+M,#9D9&1D.3,`>GHP9&%D8S8R8P!Z>C`Q-F1F,C4Q`'IZ,#`P8C9C,3``>GHP
+M,39D.3(U,0!Z>C`R9&(P.#4Q`'IZ,&(W,C%A960`>GHP-C=C9F-A90!Z>C`P
+M,&(V8V8X`'IZ,&,Y-&0Q8C``>GHP,F1A9F%B,@!Z>C`U8CDR865D`'IZ,#`U
+M8CAC8V(`>GHP8C9D.65F9@!Z>C`R9&(Q,6(R`'IZ,#)D8F9F8C$`>GHP,F1B
+M9C<V,P!Z>C`P-6(V.&9D`'IZ,#`U8C0T960`>GHP8C<Q,6%E9`!Z>C!B-64S
+M,38P`'IZ,&0X-#@T83$`>GHP,39D.&(R9`!Z>C`Q-F4P.#EB`'IZ,#)D8F(X
+M-S4`>GHP,F1A93@U,0!Z>C!B.#%E83DT`'IZ,#$V9&5C,68`>GHP,&(V9F5B
+M8P!Z>C!E.#DT.3`W`'IZ,#!B-F5A-V$`>GHP,S-E.&9B9@!Z>C!C9F$U.#<U
+M`'IZ,#)D8CDY864`>GHP,F1B.6%B,@!Z>C`P,&(V8F4X`'IZ,&1E-C@S-V8`
+M>GHP,39D86)F90!Z>C!B-S`Y9#`R`'IZ,#8W9#(U93(`>GHP,3EF,V$P,0!Z
+M>C`W,#,Y-#=B`&%T:%]H86Q?;65M>F5R;P!Z>C`V9&9F8S!D`'IZ,&(V-S4P
+M8C@`>GHP,39E,F1F9`!Z>C`P,&(V9#(R`'IZ,#9F96%F-C``>GHP9&,T835C
+M-0!Z>C`P8C<P9C=D`&%T:%]H86Q?<W=?8F5A8V]N7W)E<W!O;G-E7W1I;64`
+M>GHP.68V-&(V80!Z>C`P-6(V-3=A`'IZ,#9F,SDT-V(`>GHP-F1A,&-F,@!Z
+M>C!B-V)A9#-E`'IZ,#!B-F8Y-C$`>GHP8C8Y-S-B8P!Z>C`R9&)D,S5D`'IZ
+M,#`U8C@X9F0`>GHP,F1B8F,Q9`!Z>C`R9&%F9&9D`'IZ,#9D-V1D.3,`871H
+M7VAA;%]D96QA>0!Z>C`R9&(Q9&9D`'IZ,#8W9#)F-#$`>GHP,F1A9C@W-0!Z
+M>C!B-V5D939D`'IZ,#$V9#AD-#$`>GHP,#)D864Y,@!Z>C!B-V%D939D`'IZ
+M,#)D8F(S-60`>GHP,F1B,V1F9`!Z>C`R9&(U,V5D`'IZ,#$V9&-E864`>GHP
+M,#!B-F1A,@!Z>C`P,&(V93(R`'IZ,#5B.#`P-#$`>GHP,#$V9#@T.`!Z>C`Q
+M-F0Y8C)D`'IZ,#`Q-F4P,F,`>GHP,&(W,#<W9`!Z>C`P-6(V.3=A`'IZ,#`Q
+M-F1A930`>GHP,39E,3`Y8@!Z>C`P-6(T83)D`'IZ,#$V9&4P9&0`>GHP,39D
+M9C!D9`!Z>C!D9C`W8V$Q`'IZ,#)D8F0W-C,`>GHP,#!B-F4U,@!Z>C`V-V0P
+M8S0W`'IZ,#5B-F,V9&(`>GHP8S,Q-65B-0!Z>C!D8C%E9#@V`'IZ,#9D-#`V
+M93``>GHP,39E,#(U,0!Z>C`P,#)D8F(R`'IZ,#`R9&0X-F0`>GHP,#$V93$T
+M9`!Z>C`R9&(U.6%E`'IZ,#`V-V0R,C$`>GHP,39D.#!D9`!Z>C`P-6(X.3-D
+M`'IZ,#5B.#%B,6(`>GHP,F1B,3-E9`!Z>C`P8C9D,3(S`'IZ,#`P8C9C93@`
+M>GHP-6(X86%E9`!Z>C!B-F5D,S8S`'IZ,#)D868Q8C(`>GHP,#`U8C5E,@!Z
+M>C`S,V5B9F)F`'IZ,#5B-C@V9&(`>GHP,#!B-F5F.`!Z>C!B-S$Y865D`'IZ
+M,#`U8C4X8C(`>GHP-6(W9&(Q8@!Z>C!B.#)D939D`'IZ,#`Q-F0W,S(`>GHP
+M,F1A9&%B,@!Z>C!F-#5E-F4S`&%T:%]H86Q?:6YI=%]C:&%N;F5L<P!Z>C`P
+M8C9D-F)C`'IZ,&,Q-&0Q8C``>GHP,#`R9&)D,@!Z>C!D830X-&$Q`'IZ,#$V
+M93!B.#<`>GHP-6(Y,#)E9`!Z>C!D8S)E,SDP`'IZ,&$V,&0Q-#4`>GHP,F1B
+M86)B9`!Z>C`P,&(V8S%D`'IZ,#5B.&5A960`>GHP,#5B-V(Y9`!Z>C`P-6(U
+M-#0V`'IZ,#5B-C0V9&(`>GHP,&(V9CDR,P!Z>C!D9#8X,S=F`'IZ,#$V93$R
+M-3$`>GHP9&,V835C-0!Z>C`R9&(S-S!A`'IZ,#`P-6(V-S(`>GHP-F1E9F,P
+M9`!Z>C`R9&)F,S5D`'IZ,#`P8C9C-S@`>GHP,#$V9#@S,@!Z>C`R9&(U-S!A
+M`'IZ,#`U8C9D-V$`>GHP,#)D8C(Y,@!Z>C`P-6(Y,&-B`&%T:%]H86Q?<F5G
+M7W=R:71E`'IZ,&(V9C4S-C,`>GHP,#5B-6,T-@!A=&A?:&%L7W)E9U]R96%D
+M`'IZ,#9D.3!C9C(`>GHP-F0X9&0Y,P!Z>C`Q-F1F8C@W`'IZ,#`Q-F1A-#@`
+M>GHP8C8V,S%A.`!Z>C`P,F1B,#DR`&%T:%]H86Q?9V5T=VER96QE<W-M;V1E
+M<P!Z>C`Q-F4Q8C@W``````````````8````!````!``````````0````````
+M`!$````#````/0`````````4`````````!(````#````/0````````!P````
+M`````!$````#````4`````````!T`````````!(````#````4`````````"<
+M`````````!$````#````8@````````"@`````````!(````#````8@``````
+M``#P`````````!$````#````=0````````#T`````````!(````#````=0``
+M```````(`0```````!$````#````B0`````````,`0```````!(````#````
+MB0`````````8`0```````!$````#````G0`````````<`0```````!(````#
+M````G0`````````D`0```````!$````#````J@`````````H`0```````!(`
+M```#````J@`````````P`0```````!$````#````MP`````````T`0``````
+M`!(````#````MP`````````\`0```````!$````#````R@````````!``0``
+M`````!(````#````R@````````!(`0```````!$````#````W0````````!,
+M`0```````!(````#````W0````````!<`0````````8````!````!```````
+M``"H`0````````8````!````!`````````!H`@````````0```!X````````
+M``````!L`@````````4````!`````P````````!P`@````````8````!````
+M!`````````!\`@````````0```"(`0````````````"``@````````4````!
+M`````P````````"$`@````````8````!````!`````````"0`@````````0`
+M``!)``````````````"4`@````````4````!`````P````````"8`@``````
+M``8````!````!`````````#L`@````````8````!````!``````````L`P``
+M``````0```"4`0`````````````P`P````````4````!`````P`````````T
+M`P````````8````!````!`````````!4`P````````0````Y`0``````````
+M``!8`P````````4````!`````P````````!8`P````````@````Y`0``````
+M``````!<`P````````8````!````!`````````#8`P````````8````!````
+M!`````````!T!`````````0```#&``````````````!X!`````````4````!
+M`````P````````!X!`````````@```#&``````````````#L!`````````0`
+M``#&``````````````#P!`````````4````!`````P````````#P!```````
+M``@```#&``````````````!D!0````````0```#&``````````````!H!0``
+M``````4````!`````P````````!H!0````````@```#&``````````````"\
+M!0````````0```#&``````````````#`!0````````4````!`````P``````
+M``#`!0````````@```#&```````````````4!@````````0```#&````````
+M```````8!@````````4````!`````P`````````8!@````````@```#&````
+M``````````!P!@````````0```#&``````````````!T!@````````4````!
+M`````P````````!T!@````````@```#&```````````````L!P````````8`
+M```!````!`````````!X!P````````0```"^``````````````!\!P``````
+M``4````!`````P````````"`!P````````8````!````!``````````<"```
+M``````0```"^```````````````@"`````````4````!`````P`````````D
+M"`````````8````!````!`````````!<"0````````8````!````!```````
+M``"0"0```````!$````%``````````````"4"0```````!(````%````````
+M``````"X"0````````8````!````!`````````#@"0```````!$````%````
+M``````````#D"0```````!(````%``````````````#X"0````````0```#&
+M``````````````#\"0````````4````!`````P````````#\"0````````@`
+M``#&``````````````!$"@````````8````!````!`````````#`"P``````
+M``8````!````!`````````#8"P```````!$````"``````````````#<"P``
+M`````!(````"```````````````(#@````````8````!````!`````````"4
+M#@````````0```"4`0````````````"8#@````````4````!`````P``````
+M``"<#@````````8````!````!``````````(#P````````8````!````!```
+M``````!D$@````````8````!````!`````````"($@````````0````!`0``
+M``````````",$@````````4````!`````P````````"0$@````````8````!
+M````!`````````#$$@```````!$````"````C`````````#($@```````!(`
+M```"````C`````````#@$@````````8````!````!``````````T$P``````
+M``8````!````!`````````"T$P```````!$````"````C`````````"X$P``
+M`````!(````"````C`````````#D$P````````8````!````!``````````D
+M%`````````8````!````!`````````!L%````````!$````"````C```````
+M``!P%````````!(````"````C`````````"(%`````````8````!````!```
+M``````#\%`````````8````!````!`````````!L%0````````8````!````
+M!`````````"$%0```````!$````"````F`````````"(%0```````!(````"
+M````F`````````"0%0```````!$````"````K@````````"4%0```````!(`
+M```"````K@````````"X%@````````8````!````!`````````!<%P``````
+M``8````!````!`````````#T%P````````8````!````!`````````!L&```
+M``````8````!````!`````````#L&`````````8````!````!`````````!L
+M&0````````8````!````!`````````#\&0````````8````!````!```````
+M``"P&@````````8````!````!`````````#\&@````````0```#1````````
+M````````&P````````4````!`````P`````````$&P````````8````!````
+M!`````````"$(@````````8````!````!``````````0(P````````8````!
+M````!`````````"D)`````````0````D`0````````````"H)`````````4`
+M```!`````P````````"H)`````````@````D`0````````````"L)```````
+M``8````!````!`````````!4)0````````8````!````!```````````)@``
+M``````8````!````!`````````"P)@````````8````!````!`````````!L
+M)P````````8````!````!``````````<*`````````8````!````!```````
+M``#\*0````````8````!````!``````````P*@````````0```"%````````
+M```````T*@````````4````!`````P`````````T*@````````@```"%````
+M```````````X*@````````8````!````!`````````!0*P````````8````!
+M````!`````````#`*P````````8````!````!`````````!P+0````````8`
+M```!````!``````````<+@````````8````!````!`````````#(+@``````
+M``8````!````!`````````"T+P````````8````!````!`````````!L,```
+M``````8````!````!`````````!$,0````````8````!````!``````````4
+M,@````````8````!````!`````````#@,@````````8````!````!```````
+M``"X,P````````8````!````!``````````@-0````````8````!````!```
+M```````$-@````````8````!````!`````````#H-@````````8````!````
+M!`````````#,-P````````8````!````!`````````!P.`````````8````!
+M````!`````````"0/0````````8````!````!`````````#`/0```````!$`
+M```%````"`````````#$/0```````!(````%````"`````````#P/0``````
+M``0```#1``````````````#T/0````````4````!`````P````````#X/0``
+M``````8````!````!``````````D/@````````0````D`0`````````````H
+M/@````````4````!`````P`````````H/@````````@````D`0``````````
+M```L/@````````8````!````!```````````/P````````0````D`0``````
+M```````$/P````````4````!`````P`````````$/P````````@````D`0``
+M```````````(/P````````8````!````!`````````#D/P````````0````D
+M`0````````````#H/P````````4````!`````P````````#H/P````````@`
+M```D`0````````````#L/P````````8````!````!`````````!\0```````
+M``0```"%``````````````"`0`````````4````!`````P````````"`0```
+M``````@```"%``````````````"$0`````````8````!````!`````````"T
+M0`````````8````!````!`````````!(0@````````8````!````!```````
+M``#P0@````````8````!````!`````````#,0P````````8````!````!```
+M``````!X1`````````8````!````!``````````@10````````8````!````
+M!`````````"41@````````8````!````!`````````#(1P````````8````!
+M````!`````````!$20````````8````!````!`````````#L2@````````8`
+M```!````!`````````#H2P````````8````!````!`````````!H3```````
+M``8````!````!``````````<30````````8````!````!`````````"@30``
+M``````8````!````!``````````L3@````````8````!````!`````````"X
+M3@````````8````!````!`````````!@3P````````8````!````!```````
+M``#P3P````````8````!````!`````````!\4`````````8````!````!```
+M``````"\40````````8````!````!``````````H4@```````!$````"````
+MW``````````L4@```````!(````"````W`````````!`4@```````!$````"
+M````Q`````````!$4@```````!(````"````Q`````````!L4@````````8`
+M```!````!`````````",4P````````8````!````!`````````#\4P``````
+M``8````!````!`````````"`5`````````8````!````!`````````#\5```
+M``````8````!````!`````````!050````````8````!````!``````````,
+M5@````````8````!````!`````````#,5@````````8````!````!```````
+M``"(5P````````8````!````!`````````!\6`````````8````!````!```
+M```````\60````````8````!````!`````````!<6@````````8````!````
+M!`````````#P6@````````8````!````!`````````!T6P````````8````!
+M````!`````````#T6P````````8````!````!`````````"H7`````````8`
+M```!````!`````````#D70````````8````!````!`````````!D7P``````
+M``8````!````!`````````#T8`````````8````!````!`````````!H80``
+M``````8````!````!`````````#P80````````8````!````!`````````!L
+M8@````````8````!````!`````````#48@````````8````!````!```````
+M``!@8P````````8````!````!`````````#<8P````````8````!````!```
+M``````!T9`````````8````!````!``````````$90````````8````!````
+M!`````````"`90````````8````!````!``````````09@````````8````!
+M````!`````````"49@````````8````!````!``````````89P````````8`
+M```!````!`````````"`9P````````8````!````!``````````L:```````
+M``8````!````!`````````#8:`````````8````!````!``````````H:0``
+M``````8````!````!``````````<:@````````8````!````!`````````#8
+M:@````````8````!````!`````````!H:P````````8````!````!```````
+M``!$;`````````8````!````!`````````!@;````````!$````$````6```
+M``````!D;````````!(````$````6`````````!T;````````!$````$````
+M``H```````!X;````````!(````$``````H```````#D;`````````8````!
+M````!`````````!$;0```````!$````$``````H```````!(;0```````!(`
+M```$``````H```````"<;0````````8````!````!`````````#(;0``````
+M``8````!````!`````````!`;@````````8````!````!`````````#`;@``
+M``````8````!````!`````````!`;P````````8````!````!`````````!,
+M;P```````!$````$``````H```````!0;P```````!(````$``````H`````
+M``"$;P````````8````!````!`````````#(;P```````!$````$````6```
+M``````#,;P```````!(````$````6``````````H<`````````8````!````
+M!`````````!`<````````!$````$````@"0```````!$<````````!(````$
+M````@"0```````!L<`````````0```#J``````````````!P<`````````4`
+M```!`````P````````!T<`````````8````!````!`````````"@<```````
+M``8````!````!`````````"T<````````!$````$````6`````````"X<```
+M`````!(````$````6`````````#L<`````````8````!````!`````````"0
+M<0```````!$````$````6`````````"4<0```````!(````$````6```````
+M```,<@```````!$````$````N`D````````0<@```````!(````$````N`D`
+M``````#,<P````````8````!````!`````````!\=0```````!$````"````
+M]`````````"`=0```````!(````"````]`````````#8=0````````8````!
+M````!`````````!(=@```````!$````$````X!H```````!,=@```````!(`
+M```$````X!H```````!T=@```````!$````$````0!0```````!X=@``````
+M`!(````$````0!0```````"<=@```````!$````$````(!X```````"@=@``
+M`````!(````$````(!X```````#(=@```````!$````$````0"$```````#,
+M=@```````!(````$````0"$```````#T=@```````!$````$````X",`````
+M``#X=@```````!(````$````X",````````8=P```````!$````$````X!H`
+M```````<=P```````!(````$````X!H```````!8>`````````0````D`0``
+M``````````!<>`````````4````!`````P````````!<>`````````@````D
+M`0````````````!@>`````````8````!````!`````````"0>@```````!$`
+M```"````]`````````"4>@```````!(````"````]`````````#`>@``````
+M``0````!````K&L```````"(>P````````8````!````!``````````X?0``
+M``````8````!````!`````````"0?0````````8````!````!`````````"X
+M?@````````8````!````!`````````#P?@````````8````!````!```````
+M``!L?P````````8````!````!``````````0@`````````8````!````!```
+M```````\@`````````8````!````!`````````!T@`````````8````!````
+M!`````````#D@`````````8````!````!`````````"T@0````````8````!
+M````!`````````#L@0````````8````!````!`````````#\@0```````!$`
+M```$`````#T`````````@@```````!(````$`````#T```````"X@@``````
+M``8````!````!`````````#P@@````````8````!````!```````````@P``
+M`````!$````$````5#T````````$@P```````!(````$````5#T```````"\
+M@P````````8````!````!``````````DA`````````8````!````!```````
+M``!HA`````````0```#1``````````````!LA`````````4````!`````P``
+M``````!PA`````````8````!````!`````````",A````````!$````"````
+M$`$```````"0A````````!(````"````$`$```````"8A`````````0```#J
+M``````````````"<A`````````4````!`````P````````"@A`````````8`
+M```!````!`````````#XA`````````0````_`0````````````#\A```````
+M``4````!`````P``````````A0````````8````!````!``````````@A0``
+M``````0```"4`0`````````````DA0````````4````!`````P`````````H
+MA0````````8````!````!`````````!0A0````````0```"4`0``````````
+M``!4A0````````4````!`````P````````!8A0````````8````!````!```
+M``````"0A0````````0```"1`0````````````"4A0````````4````!````
+M`P````````"4A0````````@```"1`0````````````"8A0````````8````!
+M````!`````````"XA0````````0```"1`0````````````"\A0````````4`
+M```!`````P````````"\A0````````@```"1`0````````````#`A0``````
+M``8````!````!`````````#@A0````````0```"4`0````````````#DA0``
+M``````4````!`````P````````#HA0````````8````!````!```````````
+MA@````````0````O```````````````$A@````````4````!`````P``````
+M```(A@````````8````!````!``````````PA@````````0```"4`0``````
+M```````TA@````````4````!`````P`````````XA@````````8````!````
+M!`````````!0A@````````0```"1`0````````````!4A@````````4````!
+M`````P````````!4A@````````@```"1`0````````````!8A@````````8`
+M```!````!`````````!LA@````````0````N`0````````````!PA@``````
+M``4````!`````P````````!TA@````````8````!````!`````````"DA@``
+M``````0````N`0````````````"HA@````````4````!`````P````````"L
+MA@````````8````!````!`````````#@A@````````0````N`0``````````
+M``#DA@````````4````!`````P````````#HA@````````8````!````!```
+M``````!$AP````````0````N`0````````````!(AP````````4````!````
+M`P````````!,AP````````8````!````!`````````"HAP````````0````N
+M`0````````````"LAP````````4````!`````P````````"PAP````````8`
+M```!````!``````````\B0````````0```!]``````````````!$CP``````
+M``0````N`0````````````!(CP````````4````!`````P````````!,CP``
+M``````8````!````!`````````#\CP````````0```"1`0``````````````
+MD`````````4````!`````P``````````D`````````@```"1`0``````````
+M```$D`````````8````!````!``````````LD`````````0```"1`0``````
+M```````PD`````````4````!`````P`````````PD`````````@```"1`0``
+M```````````TD`````````8````!````!`````````!$D`````````0```"%
+M``````````````!(D`````````4````!`````P````````!(D`````````@`
+M``"%``````````````!,D`````````8````!````!`````````",D```````
+M``8````!````!`````````"<D`````````0```"%``````````````"@D```
+M``````4````!`````P````````"@D`````````@```"%``````````````"D
+MD`````````8````!````!`````````"HD0````````8````!````!```````
+M``#4D0````````0```"1`0````````````#8D0````````4````!`````P``
+M``````#8D0````````@```"1`0````````````#<D0````````8````!````
+M!`````````#TD0````````0```"1`0````````````#XD0````````4````!
+M`````P````````#XD0````````@```"1`0````````````#\D0````````8`
+M```!````!``````````4D@````````0```"1`0`````````````8D@``````
+M``4````!`````P`````````8D@````````@```"1`0`````````````<D@``
+M``````8````!````!``````````TD@````````0```"1`0`````````````X
+MD@````````4````!`````P`````````XD@````````@```"1`0``````````
+M```\D@````````8````!````!`````````!4D@````````0```"1`0``````
+M``````!8D@````````4````!`````P````````!8D@````````@```"1`0``
+M``````````!<D@````````8````!````!`````````!XD@````````8````!
+M````!`````````"8D@````````0````Q``````````````"LD@````````0`
+M```L`0``````````````DP````````8````!````!``````````DDP``````
+M``0```"1`0`````````````HDP````````4````!`````P`````````HDP``
+M``````@```"1`0`````````````LDP````````8````!````!`````````!`
+MDP````````0```"4`0````````````!$DP````````4````!`````P``````
+M``!(DP````````8````!````!`````````!XDP````````0```"1`0``````
+M``````!\DP````````4````!`````P````````!\DP````````@```"1`0``
+M``````````"`DP````````8````!````!`````````"<DP````````0```"1
+M`0````````````"@DP````````4````!`````P````````"@DP````````@`
+M``"1`0````````````"DDP````````8````!````!`````````"\DP``````
+M``8````!````!`````````#XDP````````0```"4`0````````````#\DP``
+M``````4````!`````P``````````E`````````8````!````!``````````P
+ME`````````0```"1`0`````````````TE`````````4````!`````P``````
+M```TE`````````@```"1`0`````````````XE`````````8````!````!```
+M``````!4E`````````0```"1`0````````````!8E`````````4````!````
+M`P````````!8E`````````@```"1`0````````````!<E`````````8````!
+M````!`````````!XE`````````0```"1`0````````````!\E`````````4`
+M```!`````P````````!\E`````````@```"1`0````````````"`E```````
+M``8````!````!`````````"HE`````````0```"4`0````````````"LE```
+M``````4````!`````P````````"PE`````````8````!````!`````````#8
+ME`````````0```"1`0````````````#<E`````````4````!`````P``````
+M``#<E`````````@```"1`0````````````#@E`````````8````!````!```
+M``````#XE`````````0```"1`0````````````#\E`````````4````!````
+M`P````````#\E`````````@```"1`0``````````````E0````````8````!
+M````!``````````4E0````````0```"4`0`````````````8E0````````4`
+M```!`````P`````````<E0````````8````!````!`````````!TE0``````
+M``0```"1`0````````````!XE0````````4````!`````P````````!XE0``
+M``````@```"1`0````````````!\E0````````8````!````!`````````#P
+ME0````````0```"1`0````````````#TE0````````4````!`````P``````
+M``#TE0````````@```"1`0````````````#XE0````````8````!````!```
+M```````8E@````````8````!````!``````````LE@````````0```"4`0``
+M```````````PE@````````4````!`````P`````````TE@````````8````!
+M````!`````````!,E@````````8````!````!`````````!TE@````````0`
+M``"4`0````````````!XE@````````4````!`````P````````!\E@``````
+M``8````!````!``````````\EP````````8````!````!`````````!\EP``
+M``````0```"1`0````````````"`EP````````4````!`````P````````"`
+MEP````````@```"1`0````````````"$EP````````8````!````!```````
+M``#LEP````````0```"1`0````````````#PEP````````4````!`````P``
+M``````#PEP````````@```"1`0````````````#TEP````````8````!````
+M!``````````4F`````````0```"1`0`````````````8F`````````4````!
+M`````P`````````8F`````````@```"1`0`````````````<F`````````8`
+M```!````!`````````!,F`````````8````!````!`````````!PF```````
+M``0```"4`0````````````!TF`````````4````!`````P````````!XF```
+M``````8````!````!`````````"LF`````````8````!````!`````````#D
+MF`````````0```"1`0````````````#HF`````````4````!`````P``````
+M``#HF`````````@```"1`0````````````#LF`````````8````!````!```
+M```````$F0````````0```"1`0`````````````(F0````````4````!````
+M`P`````````(F0````````@```"1`0`````````````,F0````````8````!
+M````!``````````DF0````````0```"1`0`````````````HF0````````4`
+M```!`````P`````````HF0````````@```"1`0`````````````LF0``````
+M``8````!````!`````````!$F0````````0```"1`0````````````!(F0``
+M``````4````!`````P````````!(F0````````@```"1`0````````````!,
+MF0````````8````!````!`````````!DF0````````0```"1`0``````````
+M``!HF0````````4````!`````P````````!HF0````````@```"1`0``````
+M``````!LF0````````8````!````!`````````"$F0````````0```"1`0``
+M``````````"(F0````````4````!`````P````````"(F0````````@```"1
+M`0````````````",F0````````8````!````!`````````"DF0````````0`
+M``"1`0````````````"HF0````````4````!`````P````````"HF0``````
+M``@```"1`0````````````"LF0````````8````!````!`````````#(F0``
+M``````0```"1`0````````````#,F0````````4````!`````P````````#,
+MF0````````@```"1`0````````````#0F0````````8````!````!```````
+M``#PF0````````8````!````!`````````#`F@````````0```"1`0``````
+M``````#$F@````````4````!`````P````````#$F@````````@```"1`0``
+M``````````#(F@````````8````!````!`````````#LF@````````0```"1
+M`0````````````#PF@````````4````!`````P````````#PF@````````@`
+M``"1`0````````````#TF@````````8````!````!``````````8FP``````
+M``8````!````!``````````\G0````````0```"1`0````````````!`G0``
+M``````4````!`````P````````!`G0````````@```"1`0````````````!$
+MG0````````8````!````!`````````!<G0````````0```"1`0``````````
+M``!@G0````````4````!`````P````````!@G0````````@```"1`0``````
+M``````!DG0````````8````!````!`````````!\G0````````0```"1`0``
+M``````````"`G0````````4````!`````P````````"`G0````````@```"1
+M`0````````````"$G0````````8````!````!`````````"<G0````````0`
+M``"1`0````````````"@G0````````4````!`````P````````"@G0``````
+M``@```"1`0````````````"DG0````````8````!````!`````````"\G0``
+M``````0```"1`0````````````#`G0````````4````!`````P````````#`
+MG0````````@```"1`0````````````#$G0````````8````!````!```````
+M``#@G0````````0```"1`0````````````#DG0````````4````!`````P``
+M``````#DG0````````@```"1`0````````````#HG0````````8````!````
+M!``````````HG@````````8````!````!`````````!(G@````````0```#J
+M``````````````!,G@````````4````!`````P````````!0G@````````8`
+M```!````!`````````!DG@````````8````!````!`````````!\G@``````
+M``0```#J``````````````"`G@````````4````!`````P````````"$G@``
+M``````8````!````!`````````"<G@````````8````!````!`````````"P
+MG@```````!$````%````&`````````"TG@```````!(````%````&```````
+M``"\G@````````0```#J``````````````#`G@````````4````!`````P``
+M``````#$G@````````8````!````!`````````#@G@````````8````!````
+M!``````````,GP````````0```"4`0`````````````0GP````````4````!
+M`````P`````````4GP````````8````!````!``````````LGP````````0`
+M``!,```````````````PGP````````4````!`````P`````````TGP``````
+M``8````!````!`````````!,GP````````0```"4`0````````````!0GP``
+M``````4````!`````P````````!4GP````````8````!````!`````````#,
+MGP````````8````!````!``````````(H`````````0````H`0``````````
+M```,H`````````4````!`````P`````````0H`````````8````!````!```
+M```````LH`````````0```!V```````````````PH`````````4````!````
+M`P`````````PH`````````@```!V```````````````TH`````````8````!
+M````!`````````!4H`````````8````!````!`````````!XH`````````0`
+M``"4`0````````````!\H`````````4````!`````P````````"`H```````
+M``8````!````!`````````"PH`````````0```"1`0````````````"TH```
+M``````4````!`````P````````"TH`````````@```"1`0````````````"X
+MH`````````8````!````!`````````#8H`````````8````!````!```````
+M``#\H`````````0```"4`0``````````````H0````````4````!`````P``
+M```````$H0````````8````!````!``````````HH0````````0```"1`0``
+M```````````LH0````````4````!`````P`````````LH0````````@```"1
+M`0`````````````PH0````````8````!````!`````````!0H0````````8`
+M```!````!`````````!\H0````````0```"4`0````````````"`H0``````
+M``4````!`````P````````"$H0````````8````!````!`````````"TH0``
+M``````0```"1`0````````````"XH0````````4````!`````P````````"X
+MH0````````@```"1`0````````````"\H0````````8````!````!```````
+M``#@H0````````8````!````!``````````(H@````````0```"4`0``````
+M```````,H@````````4````!`````P`````````0H@````````8````!````
+M!``````````TH@````````8````!````!`````````!@H@````````0```"4
+M`0````````````!DH@````````4````!`````P````````!HH@````````8`
+M```!````!`````````#$H@````````0```"1`0````````````#(H@``````
+M``4````!`````P````````#(H@````````@```"1`0````````````#,H@``
+M``````8````!````!`````````#DH@````````0```!3`0````````````#H
+MH@````````4````!`````P````````#LH@````````8````!````!```````
+M```,HP````````8````!````!``````````PHP````````0```"4`0``````
+M```````THP````````4````!`````P`````````XHP````````8````!````
+M!`````````!\HP````````0```"1`0````````````"`HP````````4````!
+M`````P````````"`HP````````@```"1`0````````````"$HP````````8`
+M```!````!`````````"@HP````````8````!````!`````````"XHP``````
+M``0```"4`0````````````"\HP````````4````!`````P````````#`HP``
+M``````8````!````!`````````#DHP````````8````!````!``````````,
+MI`````````0```"4`0`````````````0I`````````4````!`````P``````
+M```4I`````````8````!````!`````````!,I`````````0```"1`0``````
+M``````!0I`````````4````!`````P````````!0I`````````@```"1`0``
+M``````````!4I`````````8````!````!`````````"`I`````````8````!
+M````!`````````"HI`````````0```#J``````````````"LI`````````4`
+M```!`````P````````"PI`````````8````!````!`````````#HI```````
+M``0```"1`0````````````#LI`````````4````!`````P````````#LI```
+M``````@```"1`0````````````#PI`````````8````!````!``````````<
+MI0````````0```"1`0`````````````@I0````````4````!`````P``````
+M```@I0````````@```"1`0`````````````DI0````````8````!````!```
+M```````\I0````````0```"4`0````````````!`I0````````4````!````
+M`P````````!$I0````````8````!````!`````````!DI0````````0```"4
+M`0````````````!HI0````````4````!`````P````````!LI0````````8`
+M```!````!`````````"4I0````````0```"1`0````````````"8I0``````
+M``4````!`````P````````"8I0````````@```"1`0````````````"<I0``
+M``````8````!````!`````````"XI0````````8````!````!`````````#@
+MI0````````0```"4`0````````````#DI0````````4````!`````P``````
+M``#HI0````````8````!````!```````````I@````````0```"4`0``````
+M```````$I@````````4````!`````P`````````(I@````````8````!````
+M!``````````@I@````````0```"4`0`````````````DI@````````4````!
+M`````P`````````HI@````````8````!````!`````````!PI@````````8`
+M```!````!`````````"(I@````````0```"4`0````````````",I@``````
+M``4````!`````P````````"0I@````````8````!````!`````````"DI@``
+M``````8````!````!`````````#$I@````````0```"4`0````````````#(
+MI@````````4````!`````P````````#,I@````````8````!````!```````
+M``#PI@````````0```"1`0````````````#TI@````````4````!`````P``
+M``````#TI@````````@```"1`0````````````#XI@````````8````!````
+M!``````````0IP````````8````!````!``````````XIP````````0```"4
+M`0`````````````\IP````````4````!`````P````````!`IP````````8`
+M```!````!`````````!XIP````````0```"4`0````````````!\IP``````
+M``4````!`````P````````"`IP````````8````!````!`````````"8IP``
+M``````0```"4`0````````````"<IP````````4````!`````P````````"@
+MIP````````8````!````!`````````#,IP````````8````!````!```````
+M``#LIP````````0```"4`0````````````#PIP````````4````!`````P``
+M``````#TIP````````8````!````!``````````8J`````````8````!````
+M!`````````!`J`````````0```"4`0````````````!$J`````````4````!
+M`````P````````!(J`````````8````!````!`````````!HJ`````````0`
+M``"4`0````````````!LJ`````````4````!`````P````````!PJ```````
+M``8````!````!`````````"0J`````````0```"4`0````````````"4J```
+M``````4````!`````P````````"8J`````````8````!````!`````````"X
+MJ`````````0```"4`0````````````"\J`````````4````!`````P``````
+M``#`J`````````8````!````!`````````#@J`````````0```"4`0``````
+M``````#DJ`````````4````!`````P````````#HJ`````````8````!````
+M!``````````0J0````````8````!````!`````````!0J0````````0````E
+M``````````````!4J0````````4````!`````P````````!8J0````````8`
+M```!````!`````````"$J0````````0```!?`0````````````"(J0``````
+M``4````!`````P````````",J0````````8````!````!`````````"DJ0``
+M``````0```"1`0````````````"HJ0````````4````!`````P````````"H
+MJ0````````@```"1`0````````````"LJ0````````8````!````!```````
+M``#8J0````````8````!````!`````````#XJ0````````0```"4`0``````
+M``````#\J0````````4````!`````P``````````J@````````8````!````
+M!``````````4J@````````0````E```````````````8J@````````4````!
+M`````P`````````<J@````````8````!````!``````````TJ@````````8`
+M```!````!`````````!@J@````````0````E``````````````!DJ@``````
+M``4````!`````P````````!HJ@````````8````!````!`````````"<J@``
+M``````0```"4`0````````````"@J@````````4````!`````P````````"D
+MJ@````````8````!````!`````````"\J@````````0```!?`0``````````
+M``#`J@````````4````!`````P````````#$J@````````8````!````!```
+M``````#HJ@````````0```"1`0````````````#LJ@````````4````!````
+M`P````````#LJ@````````@```"1`0````````````#PJ@````````8````!
+M````!``````````<JP````````8````!````!``````````\JP````````0`
+M``"4`0````````````!`JP````````4````!`````P````````!$JP``````
+M``8````!````!`````````!<JP````````0````E``````````````!@JP``
+M``````4````!`````P````````!DJP````````8````!````!`````````"0
+MJP````````8````!````!`````````#`JP````````0```"4`0``````````
+M``#$JP````````4````!`````P````````#(JP````````8````!````!```
+M``````#PJP````````0```"1`0````````````#TJP````````4````!````
+M`P````````#TJP````````@```"1`0````````````#XJP````````8````!
+M````!``````````4K`````````0```"4`0`````````````8K`````````4`
+M```!`````P`````````<K`````````8````!````!`````````!`K```````
+M``0```"1`0````````````!$K`````````4````!`````P````````!$K```
+M``````@```"1`0````````````!(K`````````8````!````!`````````!X
+MK`````````8````!````!`````````"DK`````````0````E````````````
+M``"HK`````````4````!`````P````````"LK`````````8````!````!```
+M``````#@K`````````0```"4`0````````````#DK`````````4````!````
+M`P````````#HK`````````8````!````!``````````$K0````````0```!?
+M`0`````````````(K0````````4````!`````P`````````,K0````````8`
+M```!````!``````````TK0````````0```"1`0`````````````XK0``````
+M``4````!`````P`````````XK0````````@```"1`0`````````````\K0``
+M``````8````!````!`````````!HK0````````8````!````!`````````"(
+MK0````````0```"4`0````````````",K0````````4````!`````P``````
+M``"0K0````````8````!````!`````````"HK0````````0````E````````
+M``````"LK0````````4````!`````P````````"PK0````````8````!````
+M!`````````#DK0````````8````!````!``````````$K@````````0````:
+M`0`````````````(K@````````4````!`````P`````````,K@````````8`
+M```!````!``````````@K@````````8````!````!`````````!@K@``````
+M``0```"1`0````````````!DK@````````4````!`````P````````!DK@``
+M``````@```"1`0````````````!HK@````````8````!````!`````````!X
+MK@````````0````;``````````````!\K@````````4````!`````P``````
+M``"`K@````````8````!````!`````````"4K@````````8````!````!```
+M``````"DK@````````0````[`0````````````"HK@````````4````!````
+M`P````````"LK@````````8````!````!`````````#`K@````````8````!
+M````!`````````#HK@````````0```"4`0````````````#LK@````````4`
+M```!`````P````````#PK@````````8````!````!``````````4KP``````
+M``0```"1`0`````````````8KP````````4````!`````P`````````8KP``
+M``````@```"1`0`````````````<KP````````8````!````!``````````P
+MKP````````0```"4`0`````````````TKP````````4````!`````P``````
+M```XKP````````8````!````!`````````!<KP````````0```"1`0``````
+M``````!@KP````````4````!`````P````````!@KP````````@```"1`0``
+M``````````!DKP````````8````!````!`````````"`KP````````8````!
+M````!`````````"LKP````````0```"4`0````````````"PKP````````4`
+M```!`````P````````"TKP````````8````!````!`````````#8KP``````
+M``0```"1`0````````````#<KP````````4````!`````P````````#<KP``
+M``````@```"1`0````````````#@KP````````8````!````!`````````#L
+MKP````````0````Y`0````````````#PKP````````4````!`````P``````
+M``#PKP````````@````Y`0````````````#TKP````````8````!````!```
+M```````4L`````````0```"4`0`````````````8L`````````4````!````
+M`P`````````<L`````````8````!````!``````````TL`````````0````Y
+M`0`````````````XL`````````4````!`````P`````````XL`````````@`
+M```Y`0`````````````\L`````````8````!````!`````````!,L```````
+M``0```"4`0````````````!0L`````````4````!`````P````````!4L```
+M``````8````!````!`````````!PL`````````0```"1`0````````````!T
+ML`````````4````!`````P````````!TL`````````@```"1`0``````````
+M``!XL`````````8````!````!`````````"DL`````````0```"4`0``````
+M``````"HL`````````4````!`````P````````"LL`````````8````!````
+M!`````````#4L`````````0```"1`0````````````#8L`````````4````!
+M`````P````````#8L`````````@```"1`0````````````#<L`````````8`
+M```!````!``````````$L0````````8````!````!``````````LL0``````
+M``0```"4`0`````````````PL0````````4````!`````P`````````TL0``
+M``````8````!````!`````````!8L0````````0```"1`0````````````!<
+ML0````````4````!`````P````````!<L0````````@```"1`0``````````
+M``!@L0````````8````!````!`````````!TL0````````0```"4`0``````
+M``````!XL0````````4````!`````P````````!\L0````````8````!````
+M!`````````"@L0````````0```"1`0````````````"DL0````````4````!
+M`````P````````"DL0````````@```"1`0````````````"HL0````````8`
+M```!````!`````````#$L0````````8````!````!`````````!0L@``````
+M``8````!````!`````````!DL@````````0```"4`0````````````!HL@``
+M``````4````!`````P````````!LL@````````8````!````!`````````"(
+ML@````````8````!````!`````````"LL@```````!$```#U````````````
+M``"PL@```````!(```#U``````````````"\L@```````!$````1````````
+M``````#`L@```````!(````1``````````````#4L@````````0````M`0``
+M``````````#8L@````````4````!`````P````````#8L@````````@````M
+M`0````````````#<L@````````8````!````!`````````#XL@````````8`
+M```!````!``````````,LP````````0```"4`0`````````````0LP``````
+M``4````!`````P`````````4LP````````8````!````!``````````HLP``
+M``````8````!````!`````````!`LP````````0```"1`0````````````!$
+MLP````````4````!`````P````````!$LP````````@```"1`0``````````
+M``!(LP````````8````!````!`````````!<LP````````8````!````!```
+M``````!TLP````````0```"1`0````````````!XLP````````4````!````
+M`P````````!XLP````````@```"1`0````````````!\LP````````8````!
+M````!`````````"0LP````````8````!````!`````````"TLP````````0`
+M``"1`0````````````"XLP````````4````!`````P````````"XLP``````
+M``@```"1`0````````````"\LP````````8````!````!`````````#0LP``
+M``````0```"4`0````````````#4LP````````4````!`````P````````#8
+MLP````````8````!````!`````````#PLP````````0````Y`0``````````
+M``#TLP````````4````!`````P````````#TLP````````@````Y`0``````
+M``````#XLP````````8````!````!``````````HM`````````8````!````
+M!`````````!(M`````````0```"4`0````````````!,M`````````4````!
+M`````P````````!0M`````````8````!````!`````````!PM`````````0`
+M``"1`0````````````!TM`````````4````!`````P````````!TM```````
+M``@```"1`0````````````!XM`````````8````!````!`````````"0M```
+M``````8````!````!`````````"PM`````````0```"4`0````````````"T
+MM`````````4````!`````P````````"XM`````````8````!````!```````
+M``#8M`````````0```"1`0````````````#<M`````````4````!`````P``
+M``````#<M`````````@```"1`0````````````#@M`````````8````!````
+M!`````````#XM`````````8````!````!``````````HM0````````0```"1
+M`0`````````````LM0````````4````!`````P`````````LM0````````@`
+M``"1`0`````````````PM0````````8````!````!`````````!(M0``````
+M``0```"1`0````````````!,M0````````4````!`````P````````!,M0``
+M``````@```"1`0````````````!0M0````````8````!````!`````````!L
+MM0````````8````!````!`````````"HM0````````0```"4`0``````````
+M``"LM0````````4````!`````P````````"PM0````````8````!````!```
+M``````#HM0````````0```"4`0````````````#LM0````````4````!````
+M`P````````#PM0````````8````!````!``````````8M@````````0```"1
+M`0`````````````<M@````````4````!`````P`````````<M@````````@`
+M``"1`0`````````````@M@````````8````!````!`````````!`M@``````
+M``8````!````!`````````!\M@````````0```"4`0````````````"`M@``
+M``````4````!`````P````````"$M@````````8````!````!`````````"X
+MM@````````0```"4`0````````````"\M@````````4````!`````P``````
+M``#`M@````````8````!````!`````````#HM@````````0```"1`0``````
+M``````#LM@````````4````!`````P````````#LM@````````@```"1`0``
+M``````````#PM@````````8````!````!``````````0MP````````8````!
+M````!``````````HMP````````0```"4`0`````````````LMP````````4`
+M```!`````P`````````PMP````````8````!````!`````````!$MP``````
+M``8````!````!`````````!TMP````````0```"1`0````````````!XMP``
+M``````4````!`````P````````!XMP````````@```"1`0````````````!\
+MMP````````8````!````!`````````"LN`````````8````!````!```````
+M```<N0````````0```"4`0`````````````@N0````````4````!`````P``
+M```````DN0````````8````!````!`````````"LN0````````0```"4`0``
+M``````````"PN0````````4````!`````P````````"TN0````````8````!
+M````!`````````",O`````````8````!````!`````````#LO`````````0`
+M```!`0````````````#PO`````````4````!`````P````````#TO```````
+M``8````!````!``````````\O0````````0```"4`0````````````!`O0``
+M``````4````!`````P````````!$O0````````8````!````!`````````!8
+MO0````````0````_`0````````````!<O0````````4````!`````P``````
+M``!@O0````````8````!````!`````````"LO0````````0```"1`0``````
+M``````"PO0````````4````!`````P````````"PO0````````@```"1`0``
+M``````````"TO0````````8````!````!`````````#<O0````````0```"1
+M`0````````````#@O0````````4````!`````P````````#@O0````````@`
+M``"1`0````````````#DO0````````8````!````!`````````!`O@``````
+M``0```"1`0````````````!$O@````````4````!`````P````````!$O@``
+M``````@```"1`0````````````!(O@````````8````!````!`````````!L
+MO@````````0```"1`0````````````!PO@````````4````!`````P``````
+M``!PO@````````@```"1`0````````````!TO@````````8````!````!```
+M``````"(O@````````0```"1`0````````````",O@````````4````!````
+M`P````````",O@````````@```"1`0````````````"0O@````````8````!
+M````!`````````"@O@````````0```"4`0````````````"DO@````````4`
+M```!`````P````````"HO@````````8````!````!`````````#$O@``````
+M``0```"1`0````````````#(O@````````4````!`````P````````#(O@``
+M``````@```"1`0````````````#,O@````````8````!````!``````````$
+MOP````````0```"1`0`````````````(OP````````4````!`````P``````
+M```(OP````````@```"1`0`````````````,OP````````8````!````!```
+M```````HOP````````0```"1`0`````````````LOP````````4````!````
+M`P`````````LOP````````@```"1`0`````````````POP````````8````!
+M````!`````````!$OP````````0```"1`0````````````!(OP````````4`
+M```!`````P````````!(OP````````@```"1`0````````````!,OP``````
+M``8````!````!`````````!@OP````````0```"1`0````````````!DOP``
+M``````4````!`````P````````!DOP````````@```"1`0````````````!H
+MOP````````8````!````!`````````!\OP````````0```"1`0``````````
+M``"`OP````````4````!`````P````````"`OP````````@```"1`0``````
+M``````"$OP````````8````!````!`````````"4OP````````0```"4`0``
+M``````````"8OP````````4````!`````P````````"<OP````````8````!
+M````!`````````"POP````````0```"1`0````````````"TOP````````4`
+M```!`````P````````"TOP````````@```"1`0````````````"XOP``````
+M``8````!````!`````````#,OP````````0```"1`0````````````#0OP``
+M``````4````!`````P````````#0OP````````@```"1`0````````````#4
+MOP````````8````!````!`````````#HOP````````0```"4`0``````````
+M``#LOP````````4````!`````P````````#POP````````8````!````!```
+M```````$P`````````0```"1`0`````````````(P`````````4````!````
+M`P`````````(P`````````@```"1`0`````````````,P`````````8````!
+M````!``````````@P`````````0```"1`0`````````````DP`````````4`
+M```!`````P`````````DP`````````@```"1`0`````````````HP```````
+M``8````!````!``````````\P`````````0```"1`0````````````!`P```
+M``````4````!`````P````````!`P`````````@```"1`0````````````!$
+MP`````````8````!````!`````````!8P`````````0```"1`0``````````
+M``!<P`````````4````!`````P````````!<P`````````@```"1`0``````
+M``````!@P`````````8````!````!`````````!TP`````````0```"1`0``
+M``````````!XP`````````4````!`````P````````!XP`````````@```"1
+M`0````````````!\P`````````8````!````!`````````"0P`````````0`
+M``"1`0````````````"4P`````````4````!`````P````````"4P```````
+M``@```"1`0````````````"8P`````````8````!````!`````````"LP```
+M``````0```"1`0````````````"PP`````````4````!`````P````````"P
+MP`````````@```"1`0````````````"TP`````````8````!````!```````
+M``#(P`````````0```"1`0````````````#,P`````````4````!`````P``
+M``````#,P`````````@```"1`0````````````#0P`````````8````!````
+M!`````````#HP`````````0```"1`0````````````#LP`````````4````!
+M`````P````````#LP`````````@```"1`0````````````#PP`````````8`
+M```!````!``````````(P0````````0```"1`0`````````````,P0``````
+M``4````!`````P`````````,P0````````@```"1`0`````````````0P0``
+M``````8````!````!``````````@P0````````0```"X```````````````D
+MP0````````4````!`````P`````````DP0````````@```"X````````````
+M```HP0````````8````!````!`````````!`P0````````0```"1`0``````
+M``````!$P0````````4````!`````P````````!$P0````````@```"1`0``
+M``````````!(P0````````8````!````!`````````!@P0````````0```"1
+M`0````````````!DP0````````4````!`````P````````!DP0````````@`
+M``"1`0````````````!HP0````````8````!````!`````````"`P0``````
+M``0```"1`0````````````"$P0````````4````!`````P````````"$P0``
+M``````@```"1`0````````````"(P0````````8````!````!`````````"@
+MP0````````0```"1`0````````````"DP0````````4````!`````P``````
+M``"DP0````````@```"1`0````````````"HP0````````8````!````!```
+M``````#`P0````````0```"1`0````````````#$P0````````4````!````
+M`P````````#$P0````````@```"1`0````````````#(P0````````8````!
+M````!`````````#@P0````````0```"1`0````````````#DP0````````4`
+M```!`````P````````#DP0````````@```"1`0````````````#HP0``````
+M``8````!````!```````````P@````````0```"1`0`````````````$P@``
+M``````4````!`````P`````````$P@````````@```"1`0`````````````(
+MP@````````8````!````!``````````@P@````````0```"1`0``````````
+M```DP@````````4````!`````P`````````DP@````````@```"1`0``````
+M```````HP@````````8````!````!`````````!`P@````````0```"1`0``
+M``````````!$P@````````4````!`````P````````!$P@````````@```"1
+M`0````````````!(P@````````8````!````!`````````!@P@````````0`
+M``"1`0````````````!DP@````````4````!`````P````````!DP@``````
+M``@```"1`0````````````!HP@````````8````!````!`````````"`P@``
+M``````0```"1`0````````````"$P@````````4````!`````P````````"$
+MP@````````@```"1`0````````````"(P@````````8````!````!```````
+M``"@P@````````0```"1`0````````````"DP@````````4````!`````P``
+M``````"DP@````````@```"1`0````````````"HP@````````8````!````
+M!`````````#`P@````````0```"1`0````````````#$P@````````4````!
+M`````P````````#$P@````````@```"1`0````````````#(P@````````8`
+M```!````!`````````#4P@```````!$````"````.!4```````#8P@``````
+M`!(````"````.!4````````0PP````````0```"1`0`````````````4PP``
+M``````4````!`````P`````````4PP````````@```"1`0`````````````8
+MPP````````8````!````!``````````TPP````````0```")`0``````````
+M```XPP````````4````!`````P`````````\PP````````8````!````!```
+M``````!8PP````````0```"4`0````````````!<PP````````4````!````
+M`P````````!@PP````````8````!````!`````````",PP````````0```"1
+M`0````````````"0PP````````4````!`````P````````"0PP````````@`
+M``"1`0````````````"4PP````````8````!````!`````````#4PP``````
+M``0```"1`0````````````#8PP````````4````!`````P````````#8PP``
+M``````@```"1`0````````````#<PP````````8````!````!`````````#P
+MPP````````0```"4`0````````````#TPP````````4````!`````P``````
+M``#XPP````````8````!````!``````````TQ`````````0```"1`0``````
+M```````XQ`````````4````!`````P`````````XQ`````````@```"1`0``
+M```````````\Q`````````8````!````!`````````!0Q`````````0```"4
+M`0````````````!4Q`````````4````!`````P````````!8Q`````````8`
+M```!````!`````````"<Q`````````0```"1`0````````````"@Q```````
+M``4````!`````P````````"@Q`````````@```"1`0````````````"DQ```
+M``````8````!````!`````````"XQ`````````0```"4`0````````````"\
+MQ`````````4````!`````P````````#`Q`````````8````!````!```````
+M```$Q0````````0```"1`0`````````````(Q0````````4````!`````P``
+M```````(Q0````````@```"1`0`````````````,Q0````````8````!````
+M!``````````@Q0````````0```"4`0`````````````DQ0````````4````!
+M`````P`````````HQ0````````8````!````!`````````!4Q0````````0`
+M``"1`0````````````!8Q0````````4````!`````P````````!8Q0``````
+M``@```"1`0````````````!<Q0````````8````!````!`````````#XQ0``
+M``````0```"1`0````````````#\Q0````````4````!`````P````````#\
+MQ0````````@```"1`0``````````````Q@````````8````!````!```````
+M```,Q@````````0````Y`0`````````````0Q@````````4````!`````P``
+M```````0Q@````````@````Y`0`````````````4Q@````````8````!````
+M!``````````HQ@````````0```"4`0`````````````LQ@````````4````!
+M`````P`````````PQ@````````8````!````!`````````!0Q@````````0`
+M``"1`0````````````!4Q@````````4````!`````P````````!4Q@``````
+M``@```"1`0````````````!8Q@````````8````!````!`````````!TQ@``
+M``````0```!,``````````````!XQ@````````4````!`````P````````!\
+MQ@````````8````!````!`````````",Q@````````0```"6````````````
+M``"0Q@````````4````!`````P````````"4Q@````````8````!````!```
+M``````#4Q@````````0```!9``````````````#8Q@````````4````!````
+M`P````````#<Q@````````8````!````!`````````#\Q@````````0```"`
+M````````````````QP````````4````!`````P``````````QP````````@`
+M``"````````````````$QP````````8````!````!``````````8QP``````
+M``0```"4`0`````````````<QP````````4````!`````P`````````@QP``
+M``````8````!````!`````````!(QP````````0```"1`0````````````!,
+MQP````````4````!`````P````````!,QP````````@```"1`0``````````
+M``!0QP````````8````!````!`````````!XQP````````0```"#`0``````
+M``````!\QP````````4````!`````P````````"`QP````````8````!````
+M!`````````"HQP````````0````+``````````````"LQP````````4````!
+M`````P````````"PQP````````8````!````!`````````#8QP````````0`
+M```<`0````````````#<QP````````4````!`````P````````#@QP``````
+M``8````!````!```````````R`````````0```"1`0`````````````$R```
+M``````4````!`````P`````````$R`````````@```"1`0`````````````(
+MR`````````8````!````!`````````!<R`````````8````!````!```````
+M``"(R`````````0```"4`0````````````",R`````````4````!`````P``
+M``````"0R`````````8````!````!``````````8R0````````0```"1`0``
+M```````````<R0````````4````!`````P`````````<R0````````@```"1
+M`0`````````````@R0````````8````!````!`````````!`R0````````8`
+M```!````!`````````!DR0````````8````!````!`````````",R0``````
+M``8````!````!`````````"LR0````````0```#\``````````````"PR0``
+M``````4````!`````P````````"TR0````````8````!````!`````````#@
+MR0````````0````Y`0````````````#DR0````````4````!`````P``````
+M``#DR0````````@````Y`0````````````#HR0````````8````!````!```
+M```````$R@````````0````Y`0`````````````(R@````````4````!````
+M`P`````````(R@````````@````Y`0`````````````,R@````````8````!
+M````!``````````LR@````````8````!````!`````````!4R@````````0`
+M``#\``````````````!8R@````````4````!`````P````````!<R@``````
+M``8````!````!`````````"8R@````````0```"1`0````````````"<R@``
+M``````4````!`````P````````"<R@````````@```"1`0````````````"@
+MR@````````8````!````!`````````#$R@````````0````Y`0``````````
+M``#(R@````````4````!`````P````````#(R@````````@````Y`0``````
+M``````#,R@````````8````!````!`````````#PR@````````0````Y`0``
+M``````````#TR@````````4````!`````P````````#TR@````````@````Y
+M`0````````````#XR@````````8````!````!``````````,RP````````0`
+M``#\```````````````0RP````````4````!`````P`````````4RP``````
+M``8````!````!`````````!0RP````````8````!````!`````````"(RP``
+M``````0````!`0````````````",RP````````4````!`````P````````"0
+MRP````````8````!````!`````````"PRP````````0```"4`0``````````
+M``"TRP````````4````!`````P````````"XRP````````8````!````!```
+M``````#8RP````````0```"1`0````````````#<RP````````4````!````
+M`P````````#<RP````````@```"1`0````````````#@RP````````8````!
+M````!`````````#TRP````````0```"4`0````````````#XRP````````4`
+M```!`````P````````#\RP````````8````!````!``````````@S```````
+M``0```"1`0`````````````DS`````````4````!`````P`````````DS```
+M``````@```"1`0`````````````HS`````````8````!````!``````````T
+MS`````````0````Y`0`````````````XS`````````4````!`````P``````
+M```XS`````````@````Y`0`````````````\S`````````8````!````!```
+M``````!0S`````````0```"4`0````````````!4S`````````4````!````
+M`P````````!8S`````````8````!````!`````````!\S`````````0```"1
+M`0````````````"`S`````````4````!`````P````````"`S`````````@`
+M``"1`0````````````"$S`````````8````!````!`````````"0S```````
+M``0````Y`0````````````"4S`````````4````!`````P````````"4S```
+M``````@````Y`0````````````"8S`````````8````!````!`````````"X
+MS`````````0````Y`0````````````"\S`````````4````!`````P``````
+M``"\S`````````@````Y`0````````````#`S`````````8````!````!```
+M``````#4S`````````0```"4`0````````````#8S`````````4````!````
+M`P````````#<S`````````8````!````!``````````(S0````````0```"1
+M`0`````````````,S0````````4````!`````P`````````,S0````````@`
+M``"1`0`````````````0S0````````8````!````!``````````DS0``````
+M``0```"4`0`````````````HS0````````4````!`````P`````````LS0``
+M``````8````!````!`````````!$S0````````0```"4`0````````````!(
+MS0````````4````!`````P````````!,S0````````8````!````!```````
+M``!DS0````````0```"4`0````````````!HS0````````4````!`````P``
+M``````!LS0````````8````!````!`````````"8S0````````0```"1`0``
+M``````````"<S0````````4````!`````P````````"<S0````````@```"1
+M`0````````````"@S0````````8````!````!`````````#,S0````````0`
+M``"1`0````````````#0S0````````4````!`````P````````#0S0``````
+M``@```"1`0````````````#4S0````````8````!````!`````````#\S0``
+M``````0```"1`0``````````````S@````````4````!`````P``````````
+MS@````````@```"1`0`````````````$S@````````8````!````!```````
+M```0S@````````0````Y`0`````````````4S@````````4````!`````P``
+M```````4S@````````@````Y`0`````````````8S@````````8````!````
+M!``````````LS@````````0```"4`0`````````````PS@````````4````!
+M`````P`````````TS@````````8````!````!`````````!8S@````````0`
+M``"1`0````````````!<S@````````4````!`````P````````!<S@``````
+M``@```"1`0````````````!@S@````````8````!````!`````````!LS@``
+M``````0````Y`0````````````!PS@````````4````!`````P````````!P
+MS@````````@````Y`0````````````!TS@````````8````!````!```````
+M``",S@````````0```"1`0````````````"0S@````````4````!`````P``
+M``````"0S@````````@```"1`0````````````"4S@````````8````!````
+M!`````````"HS@````````0```"4`0````````````"LS@````````4````!
+M`````P````````"PS@````````8````!````!`````````#4S@````````0`
+M``"1`0````````````#8S@````````4````!`````P````````#8S@``````
+M``@```"1`0````````````#<S@````````8````!````!`````````#HS@``
+M``````0````Y`0````````````#LS@````````4````!`````P````````#L
+MS@````````@````Y`0````````````#PS@````````8````!````!```````
+M```$SP````````0```"4`0`````````````(SP````````4````!`````P``
+M```````,SP````````8````!````!``````````LSP````````0```"1`0``
+M```````````PSP````````4````!`````P`````````PSP````````@```"1
+M`0`````````````TSP````````8````!````!`````````!0SP````````0`
+M``!,``````````````!4SP````````4````!`````P````````!8SP``````
+M``8````!````!`````````!PSP````````0```"1`0````````````!TSP``
+M``````4````!`````P````````!TSP````````@```"1`0````````````!X
+MSP````````8````!````!`````````"0SP````````0```"1`0``````````
+M``"4SP````````4````!`````P````````"4SP````````@```"1`0``````
+M``````"8SP````````8````!````!`````````"PSP````````0```"1`0``
+M``````````"TSP````````4````!`````P````````"TSP````````@```"1
+M`0````````````"XSP````````8````!````!`````````#(SP````````0`
+M``"6``````````````#,SP````````4````!`````P````````#0SP``````
+M``8````!````!`````````#@SP````````0````Y`0````````````#DSP``
+M``````4````!`````P````````#DSP````````@````Y`0````````````#H
+MSP````````8````!````!`````````#XSP````````0```"6````````````
+M``#\SP````````4````!`````P``````````T`````````8````!````!```
+M```````XT`````````0```"4`0`````````````\T`````````4````!````
+M`P````````!`T`````````8````!````!`````````!@T`````````0```"1
+M`0````````````!DT`````````4````!`````P````````!DT`````````@`
+M``"1`0````````````!HT`````````8````!````!`````````"`T```````
+M``0```"1`0````````````"$T`````````4````!`````P````````"$T```
+M``````@```"1`0````````````"(T`````````8````!````!`````````#,
+MT`````````8````!````!``````````(T0````````0```"1`0``````````
+M```,T0````````4````!`````P`````````,T0````````@```"1`0``````
+M```````0T0````````8````!````!``````````@T0````````0````Y`0``
+M```````````DT0````````4````!`````P`````````DT0````````@````Y
+M`0`````````````HT0````````8````!````!`````````!0T0````````0`
+M``!,``````````````!4T0````````4````!`````P````````!8T0``````
+M``8````!````!`````````!XT0````````0```"1`0````````````!\T0``
+M``````4````!`````P````````!\T0````````@```"1`0````````````"`
+MT0````````8````!````!`````````#DT@````````8````!````!```````
+M```<U`````````0```##```````````````@U`````````4````!`````P``
+M```````@U`````````@```##``````````````"TU`````````8````!````
+M!`````````!TUP```````!$````"````@AH```````!XUP```````!(````"
+M````@AH```````#0V@````````8````!````!`````````#XV@```````!$`
+M```"````C!H```````#\V@```````!(````"````C!H````````$VP``````
+M``0```#J```````````````(VP````````4````!`````P`````````,VP``
+M``````8````!````!``````````8VP```````!$````"````<!H````````<
+MVP```````!(````"````<!H````````DVP````````0```#J````````````
+M```HVP````````4````!`````P`````````LVP````````8````!````!```
+M``````"DVP````````0````O``````````````"HVP````````4````!````
+M`P````````"LVP````````8````!````!`````````#PVP````````0````O
+M``````````````#TVP````````4````!`````P````````#XVP````````8`
+M```!````!`````````#`W@````````0````O``````````````#$W@``````
+M``4````!`````P````````#(W@````````8````!````!`````````#PW@``
+M``````0````O``````````````#TW@````````4````!`````P````````#X
+MW@````````8````!````!``````````DWP````````0````O````````````
+M```HWP````````4````!`````P`````````LWP````````8````!````!```
+M``````!LWP````````0```"1`0````````````!PWP````````4````!````
+M`P````````!PWP````````@```"1`0````````````!TWP````````8````!
+M````!`````````"HWP````````0```"1`0````````````"LWP````````4`
+M```!`````P````````"LWP````````@```"1`0````````````"PWP``````
+M``8````!````!`````````#8WP````````8````!````!``````````\X```
+M``````0````O``````````````!`X`````````4````!`````P````````!$
+MX`````````8````!````!`````````!HX`````````0```"1`0``````````
+M``!LX`````````4````!`````P````````!LX`````````@```"1`0``````
+M``````!PX`````````8````!````!`````````"(X`````````0```"1`0``
+M``````````",X`````````4````!`````P````````",X`````````@```"1
+M`0````````````"0X`````````8````!````!`````````"TX`````````8`
+M```!````!`````````#,X`````````0```"4`0````````````#0X```````
+M``4````!`````P````````#4X`````````8````!````!``````````4X0``
+M``````8````!````!`````````!$X0````````0```"4`0````````````!(
+MX0````````4````!`````P````````!,X0````````8````!````!```````
+M``!LX0````````0```"1`0````````````!PX0````````4````!`````P``
+M``````!PX0````````@```"1`0````````````!TX0````````8````!````
+M!`````````"0X0````````0```!,``````````````"4X0````````4````!
+M`````P````````"8X0````````8````!````!`````````"TX0````````0`
+M```Y`0````````````"XX0````````4````!`````P````````"XX0``````
+M``@````Y`0````````````"\X0````````8````!````!`````````!$X@``
+M``````8````!````!`````````!PX@````````0```!J`0````````````!T
+MX@````````4````!`````P````````!XX@````````8````!````!```````
+M``",X@````````8````!````!`````````#`X@````````0````9`0``````
+M``````#$X@````````4````!`````P````````#(X@````````8````!````
+M!`````````#<X@````````8````!````!`````````!\XP````````0````D
+M`0````````````"`XP````````4````!`````P````````"`XP````````@`
+M```D`0````````````"$XP````````8````!````!`````````!PY```````
+M``8````!````!`````````#TY`````````0```"1`0````````````#XY```
+M``````4````!`````P````````#XY`````````@```"1`0````````````#\
+MY`````````8````!````!``````````8Y0````````0```"1`0``````````
+M```<Y0````````4````!`````P`````````<Y0````````@```"1`0``````
+M```````@Y0````````8````!````!``````````\Y0````````0```"1`0``
+M``````````!`Y0````````4````!`````P````````!`Y0````````@```"1
+M`0````````````!$Y0````````8````!````!`````````!XY0````````0`
+M``"1`0````````````!\Y0````````4````!`````P````````!\Y0``````
+M``@```"1`0````````````"`Y0````````8````!````!`````````"<Y0``
+M``````0```"1`0````````````"@Y0````````4````!`````P````````"@
+MY0````````@```"1`0````````````"DY0````````8````!````!```````
+M``"XY0````````0```"4`0````````````"\Y0````````4````!`````P``
+M``````#`Y0````````8````!````!`````````#DY0````````0```"1`0``
+M``````````#HY0````````4````!`````P````````#HY0````````@```"1
+M`0````````````#LY0````````8````!````!``````````8Y@````````0`
+M``"1`0`````````````<Y@````````4````!`````P`````````<Y@``````
+M``@```"1`0`````````````@Y@````````8````!````!``````````\Y@``
+M``````0```"1`0````````````!`Y@````````4````!`````P````````!`
+MY@````````@```"1`0````````````!$Y@````````8````!````!```````
+M``!@Y@````````0```"1`0````````````!DY@````````4````!`````P``
+M``````!DY@````````@```"1`0````````````!HY@````````8````!````
+M!`````````"DY@````````0```"1`0````````````"HY@````````4````!
+M`````P````````"HY@````````@```"1`0````````````"LY@````````8`
+M```!````!`````````#(Y@````````0```"1`0````````````#,Y@``````
+M``4````!`````P````````#,Y@````````@```"1`0````````````#0Y@``
+M``````8````!````!`````````#DY@````````0```"4`0````````````#H
+MY@````````4````!`````P````````#LY@````````8````!````!```````
+M```0YP````````0```"1`0`````````````4YP````````4````!`````P``
+M```````4YP````````@```"1`0`````````````8YP````````8````!````
+M!``````````TYP````````0```"1`0`````````````XYP````````4````!
+M`````P`````````XYP````````@```"1`0`````````````\YP````````8`
+M```!````!`````````"<YP````````0```"1`0````````````"@YP``````
+M``4````!`````P````````"@YP````````@```"1`0````````````"DYP``
+M``````8````!````!`````````#(Z`````````8````!````!```````````
+MZ0````````0```"4`0`````````````$Z0````````4````!`````P``````
+M```(Z0````````8````!````!``````````DZ0````````8````!````!```
+M``````!\Z0````````0```"1`0````````````"`Z0````````4````!````
+M`P````````"`Z0````````@```"1`0````````````"$Z0````````8````!
+M````!`````````"<Z0````````8````!````!`````````#`Z0````````0`
+M``"C``````````````#$Z0````````4````!`````P````````#(Z0``````
+M``8````!````!`````````#@Z0````````0```!3`0````````````#DZ0``
+M``````4````!`````P````````#HZ0````````8````!````!`````````#\
+MZ0````````0```"4`0``````````````Z@````````4````!`````P``````
+M```$Z@````````8````!````!`````````!`Z@````````0```!3`0``````
+M``````!$Z@````````4````!`````P````````!(Z@````````8````!````
+M!`````````!DZ@````````0```"1`0````````````!HZ@````````4````!
+M`````P````````!HZ@````````@```"1`0````````````!LZ@````````8`
+M```!````!`````````!\Z@````````0```!3`0````````````"`Z@``````
+M``4````!`````P````````"$Z@````````8````!````!`````````"HZ@``
+M``````8````!````!``````````,ZP````````0```"1`0`````````````0
+MZP````````4````!`````P`````````0ZP````````@```"1`0``````````
+M```4ZP````````8````!````!`````````!`ZP````````0```"1`0``````
+M``````!$ZP````````4````!`````P````````!$ZP````````@```"1`0``
+M``````````!(ZP````````8````!````!`````````!DZP````````8````!
+M````!`````````"<ZP````````0```"4`0````````````"@ZP````````4`
+M```!`````P````````"DZP````````8````!````!`````````#(ZP``````
+M``8````!````!``````````@[`````````0```"1`0`````````````D[```
+M``````4````!`````P`````````D[`````````@```"1`0`````````````H
+M[`````````8````!````!`````````!`[`````````0```"4`0``````````
+M``!$[`````````4````!`````P````````!([`````````8````!````!```
+M``````!<[`````````0````Y`0````````````!@[`````````4````!````
+M`P````````!@[`````````@````Y`0````````````!D[`````````8````!
+M````!`````````"$[`````````0```"1`0````````````"([`````````4`
+M```!`````P````````"([`````````@```"1`0````````````",[```````
+M``8````!````!`````````"L[`````````0```!,``````````````"P[```
+M``````4````!`````P````````"T[`````````8````!````!``````````L
+M\P````````8````!````!`````````!8\P````````0```"1`0``````````
+M``!<\P````````4````!`````P````````!<\P````````@```"1`0``````
+M``````!@\P````````8````!````!`````````"`\P````````0```"1`0``
+M``````````"$\P````````4````!`````P````````"$\P````````@```"1
+M`0````````````"(\P````````8````!````!`````````"H\P````````0`
+M``"4`0````````````"L\P````````4````!`````P````````"P\P``````
+M``8````!````!`````````#0\P````````0````O``````````````#4\P``
+M``````4````!`````P````````#8\P````````8````!````!`````````#X
+M\P````````8````!````!``````````\]`````````0```#1````````````
+M``!`]`````````4````!`````P````````!$]`````````8````!````!```
+M``````!@]````````!$````"````T!H```````!D]````````!(````"````
+MT!H```````!L]`````````0```#J``````````````!P]`````````4````!
+M`````P````````!T]`````````8````!````!`````````#(]`````````0`
+M``":`0````````````#,]`````````4````!`````P````````#0]```````
+M``8````!````!``````````(]0````````0```"1`0`````````````,]0``
+M``````4````!`````P`````````,]0````````@```"1`0`````````````0
+M]0````````8````!````!``````````H]0````````0```"1`0``````````
+M```L]0````````4````!`````P`````````L]0````````@```"1`0``````
+M```````P]0````````8````!````!``````````\]0````````0````Y`0``
+M``````````!`]0````````4````!`````P````````!`]0````````@````Y
+M`0````````````!$]0````````8````!````!`````````!4]0````````0`
+M``"4`0````````````!8]0````````4````!`````P````````!<]0``````
+M``8````!````!`````````"D]0````````0```"4`0````````````"H]0``
+M``````4````!`````P````````"L]0````````8````!````!``````````$
+M]@````````0```"1`0`````````````(]@````````4````!`````P``````
+M```(]@````````@```"1`0`````````````,]@````````8````!````!```
+M```````8]@````````0````Y`0`````````````<]@````````4````!````
+M`P`````````<]@````````@````Y`0`````````````@]@````````8````!
+M````!`````````!@]@````````0```!,`0````````````!D]@````````4`
+M```!`````P````````!H]@````````8````!````!`````````"X]@``````
+M``0```"4`0````````````"\]@````````4````!`````P````````#`]@``
+M``````8````!````!`````````#D]@````````0```!,`0````````````#H
+M]@````````4````!`````P````````#L]@````````8````!````!```````
+M```T]P````````0```!,`0`````````````X]P````````4````!`````P``
+M```````\]P````````8````!````!`````````#L]P```````!$````%````
+M(`````````#P]P```````!(````%````(`````````"@^`````````0```!\
+M`0````````````"D^`````````4````!`````P````````"H^`````````8`
+M```!````!`````````#@^`````````0```"1`0````````````#D^```````
+M``4````!`````P````````#D^`````````@```"1`0````````````#H^```
+M``````8````!````!`````````#T^`````````0````Y`0````````````#X
+M^`````````4````!`````P````````#X^`````````@````Y`0``````````
+M``#\^`````````8````!````!``````````P^0````````0```"1`0``````
+M```````T^0````````4````!`````P`````````T^0````````@```"1`0``
+M```````````X^0````````8````!````!`````````!$^0````````0````Y
+M`0````````````!(^0````````4````!`````P````````!(^0````````@`
+M```Y`0````````````!,^0````````8````!````!`````````"(^0``````
+M``0```!,`0````````````",^0````````4````!`````P````````"0^0``
+M``````8````!````!`````````#0^0````````0```#6``````````````#D
+M^0````````0```"$`0````````````#H^0````````4````!`````P``````
+M``#H^0````````@```"$`0````````````#L^0````````8````!````!```
+M```````,^@````````0```!,`0`````````````0^@````````4````!````
+M`P`````````4^@````````8````!````!`````````#,^@````````0```!I
+M`0````````````#0^@````````4````!`````P````````#0^@````````@`
+M``!I`0````````````#4^@````````8````!````!``````````4^P``````
+M``8````!````!``````````P^P````````0````A`0`````````````T^P``
+M``````4````!`````P`````````T^P````````@````A`0`````````````X
+M^P````````8````!````!`````````!$^P````````0```"%````````````
+M``!(^P````````4````!`````P````````!(^P````````@```"%````````
+M``````!,^P````````8````!````!`````````!D^P````````8````!````
+M!`````````",^P```````!$````%````*`````````"0^P```````!(````%
+M````*`````````"4^P```````!(````%````*`````````"D^P```````!$`
+M```"````^"X```````"H^P```````!(````"````^"X```````"L^P``````
+M`!(````"````^"X```````#H^P````````0```"4`0````````````#L^P``
+M``````4````!`````P````````#P^P````````8````!````!``````````8
+M_`````````0```"1`0`````````````<_`````````4````!`````P``````
+M```<_`````````@```"1`0`````````````@_`````````8````!````!```
+M```````P_`````````0```"4`0`````````````T_`````````4````!````
+M`P`````````X_`````````8````!````!`````````"`_`````````0```"1
+M`0````````````"$_`````````4````!`````P````````"$_`````````@`
+M``"1`0````````````"(_`````````8````!````!`````````"8_```````
+M``0```"4`0````````````"<_`````````4````!`````P````````"@_```
+M``````8````!````!`````````#@_`````````0```"1`0````````````#D
+M_`````````4````!`````P````````#D_`````````@```"1`0``````````
+M``#H_`````````8````!````!```````````_0````````0````Y`0``````
+M```````$_0````````4````!`````P`````````$_0````````@````Y`0``
+M```````````(_0````````8````!````!`````````#$_0````````8````!
+M````!``````````,_@````````0```#A```````````````0_@````````4`
+M```!`````P`````````4_@````````8````!````!`````````#0_@``````
+M``0```!,`0````````````#4_@````````4````!`````P````````#8_@``
+M``````8````!````!``````````L_P````````8````!````!`````````!8
+M_P````````0```"1`0````````````!<_P````````4````!`````P``````
+M``!<_P````````@```"1`0````````````!@_P````````8````!````!```
+M``````!X_P````````0```"1`0````````````!\_P````````4````!````
+M`P````````!\_P````````@```"1`0````````````"`_P````````8````!
+M````!`````````"8_P````````0```"1`0````````````"<_P````````4`
+M```!`````P````````"<_P````````@```"1`0````````````"@_P``````
+M``8````!````!`````````"X_P````````0```"1`0````````````"\_P``
+M``````4````!`````P````````"\_P````````@```"1`0````````````#`
+M_P````````8````!````!`````````#8_P````````0```"1`0``````````
+M``#<_P````````4````!`````P````````#<_P````````@```"1`0``````
+M``````#@_P````````8````!````!`````````#\_P````````8````!````
+M!`````````!,``$```````0````Q``````````````!@``$```````0````L
+M`0````````````"@``$```````8````!````!`````````#$``$```````0`
+M``"1`0````````````#(``$```````4````!`````P````````#(``$`````
+M``@```"1`0````````````#,``$```````8````!````!`````````#@``$`
+M``````0```"4`0````````````#D``$```````4````!`````P````````#H
+M``$```````8````!````!``````````8`0$```````0```"1`0``````````
+M```<`0$```````4````!`````P`````````<`0$```````@```"1`0``````
+M```````@`0$```````8````!````!``````````\`0$```````0```"1`0``
+M``````````!``0$```````4````!`````P````````!``0$```````@```"1
+M`0````````````!$`0$```````8````!````!`````````!<`0$```````8`
+M```!````!`````````"8`0$```````0```"4`0````````````"<`0$`````
+M``4````!`````P````````"@`0$```````8````!````!`````````#$`0$`
+M``````0```"1`0````````````#(`0$```````4````!`````P````````#(
+M`0$```````@```"1`0````````````#,`0$```````8````!````!```````
+M``#H`0$```````0```"1`0````````````#L`0$```````4````!`````P``
+M``````#L`0$```````@```"1`0````````````#P`0$```````8````!````
+M!``````````,`@$```````0```"1`0`````````````0`@$```````4````!
+M`````P`````````0`@$```````@```"1`0`````````````4`@$```````8`
+M```!````!``````````\`@$```````0```"4`0````````````!``@$`````
+M``4````!`````P````````!$`@$```````8````!````!`````````!L`@$`
+M``````0```"1`0````````````!P`@$```````4````!`````P````````!P
+M`@$```````@```"1`0````````````!T`@$```````8````!````!```````
+M``",`@$```````0```"1`0````````````"0`@$```````4````!`````P``
+M``````"0`@$```````@```"1`0````````````"4`@$```````8````!````
+M!`````````"H`@$```````0```"4`0````````````"L`@$```````4````!
+M`````P````````"P`@$```````8````!````!``````````(`P$```````0`
+M``"1`0`````````````,`P$```````4````!`````P`````````,`P$`````
+M``@```"1`0`````````````0`P$```````8````!````!`````````!$`P$`
+M``````0```"1`0````````````!(`P$```````4````!`````P````````!(
+M`P$```````@```"1`0````````````!,`P$```````8````!````!```````
+M``!<`P$```````0```"4`0````````````!@`P$```````4````!`````P``
+M``````!D`P$```````8````!````!`````````"0`P$```````0```"1`0``
+M``````````"4`P$```````4````!`````P````````"4`P$```````@```"1
+M`0````````````"8`P$```````8````!````!`````````"X`P$```````8`
+M```!````!`````````#,`P$```````0```"4`0````````````#0`P$`````
+M``4````!`````P````````#4`P$```````8````!````!`````````#L`P$`
+M``````8````!````!``````````0!`$```````0```"4`0`````````````4
+M!`$```````4````!`````P`````````8!`$```````8````!````!```````
+M``#,!`$```````0```"4`0````````````#0!`$```````4````!`````P``
+M``````#4!`$```````8````!````!`````````#H!`$```````0```"4`0``
+M``````````#L!`$```````4````!`````P````````#P!`$```````8````!
+M````!``````````$!0$```````0```"4`0`````````````(!0$```````4`
+M```!`````P`````````,!0$```````8````!````!``````````@!0$`````
+M``0```"4`0`````````````D!0$```````4````!`````P`````````H!0$`
+M``````8````!````!``````````\!0$```````0```"4`0````````````!`
+M!0$```````4````!`````P````````!$!0$```````8````!````!```````
+M``!P!0$```````8````!````!`````````"P!0$```````0```"1`0``````
+M``````"T!0$```````4````!`````P````````"T!0$```````@```"1`0``
+M``````````"X!0$```````8````!````!`````````#(!0$```````0```"4
+M`0````````````#,!0$```````4````!`````P````````#0!0$```````8`
+M```!````!`````````!(!@$```````0```"1`0````````````!,!@$`````
+M``4````!`````P````````!,!@$```````@```"1`0````````````!0!@$`
+M``````8````!````!`````````!P!@$```````0```"1`0````````````!T
+M!@$```````4````!`````P````````!T!@$```````@```"1`0``````````
+M``!X!@$```````8````!````!`````````"H!@$```````8````!````!```
+M``````#,!@$```````0```"4`0````````````#0!@$```````4````!````
+M`P````````#4!@$```````8````!````!``````````(!P$```````8````!
+M````!`````````!`!P$```````0```"1`0````````````!$!P$```````4`
+M```!`````P````````!$!P$```````@```"1`0````````````!(!P$`````
+M``8````!````!`````````!@!P$```````0```"1`0````````````!D!P$`
+M``````4````!`````P````````!D!P$```````@```"1`0````````````!H
+M!P$```````8````!````!`````````"`!P$```````0```"1`0``````````
+M``"$!P$```````4````!`````P````````"$!P$```````@```"1`0``````
+M``````"(!P$```````8````!````!`````````"@!P$```````0```"1`0``
+M``````````"D!P$```````4````!`````P````````"D!P$```````@```"1
+M`0````````````"H!P$```````8````!````!`````````#`!P$```````0`
+M``"1`0````````````#$!P$```````4````!`````P````````#$!P$`````
+M``@```"1`0````````````#(!P$```````8````!````!`````````#@!P$`
+M``````0```"1`0````````````#D!P$```````4````!`````P````````#D
+M!P$```````@```"1`0````````````#H!P$```````8````!````!```````
+M````"`$```````0```"1`0`````````````$"`$```````4````!`````P``
+M```````$"`$```````@```"1`0`````````````("`$```````8````!````
+M!``````````D"`$```````0```"1`0`````````````H"`$```````4````!
+M`````P`````````H"`$```````@```"1`0`````````````L"`$```````8`
+M```!````!`````````!,"`$```````8````!````!``````````<"0$`````
+M``0```"1`0`````````````@"0$```````4````!`````P`````````@"0$`
+M``````@```"1`0`````````````D"0$```````8````!````!`````````!(
+M"0$```````0```"1`0````````````!,"0$```````4````!`````P``````
+M``!,"0$```````@```"1`0````````````!0"0$```````8````!````!```
+M``````!T"0$```````8````!````!`````````#4"P$```````0```"1`0``
+M``````````#8"P$```````4````!`````P````````#8"P$```````@```"1
+M`0````````````#<"P$```````8````!````!`````````#T"P$```````0`
+M``"1`0````````````#X"P$```````4````!`````P````````#X"P$`````
+M``@```"1`0````````````#\"P$```````8````!````!``````````4#`$`
+M``````0```"1`0`````````````8#`$```````4````!`````P`````````8
+M#`$```````@```"1`0`````````````<#`$```````8````!````!```````
+M```T#`$```````0```"1`0`````````````X#`$```````4````!`````P``
+M```````X#`$```````@```"1`0`````````````\#`$```````8````!````
+M!`````````!4#`$```````0```"1`0````````````!8#`$```````4````!
+M`````P````````!8#`$```````@```"1`0````````````!<#`$```````8`
+M```!````!`````````!X#`$```````0```"1`0````````````!\#`$`````
+M``4````!`````P````````!\#`$```````@```"1`0````````````"`#`$`
+M``````8````!````!`````````#`#`$```````8````!````!`````````#@
+M#`$```````0```#J``````````````#D#`$```````4````!`````P``````
+M``#H#`$```````8````!````!`````````#\#`$```````8````!````!```
+M```````4#0$```````0```#J```````````````8#0$```````4````!````
+M`P`````````<#0$```````8````!````!``````````T#0$```````8````!
+M````!`````````!(#0$``````!$````%````,`````````!,#0$``````!(`
+M```%````,`````````!4#0$```````0```#J``````````````!8#0$`````
+M``4````!`````P````````!<#0$```````8````!````!`````````!X#0$`
+M``````8````!````!`````````"D#0$```````0```"1`0````````````"H
+M#0$```````4````!`````P````````"H#0$```````@```"1`0``````````
+M``"L#0$```````8````!````!`````````#`#0$```````0```"1`0``````
+M``````#$#0$```````4````!`````P````````#$#0$```````@```"1`0``
+M``````````#(#0$```````8````!````!`````````#@#0$```````0```!,
+M``````````````#D#0$```````4````!`````P````````#H#0$```````8`
+M```!````!```````````#@$```````0```"4`0`````````````$#@$`````
+M``4````!`````P`````````(#@$```````8````!````!`````````"L#@$`
+M``````8````!````!`````````#H#@$```````0```#F``````````````#L
+M#@$```````4````!`````P````````#P#@$```````8````!````!```````
+M```$#P$```````0```"4`0`````````````(#P$```````4````!`````P``
+M```````,#P$```````8````!````!``````````P#P$```````0```"1`0``
+M```````````T#P$```````4````!`````P`````````T#P$```````@```"1
+M`0`````````````X#P$```````8````!````!`````````!(#P$```````0`
+M``!%`0````````````!,#P$```````4````!`````P````````!0#P$`````
+M``8````!````!`````````!P#P$```````0````W``````````````!T#P$`
+M``````4````!`````P````````!T#P$```````@````W``````````````!X
+M#P$```````8````!````!`````````"8#P$```````8````!````!```````
+M``"\#P$```````0```"4`0````````````#`#P$```````4````!`````P``
+M``````#$#P$```````8````!````!`````````#L#P$```````0```"1`0``
+M``````````#P#P$```````4````!`````P````````#P#P$```````@```"1
+M`0````````````#T#P$```````8````!````!``````````4$`$```````8`
+M```!````!``````````X$`$```````0```"4`0`````````````\$`$`````
+M``4````!`````P````````!`$`$```````8````!````!`````````!H$`$`
+M``````0```"1`0````````````!L$`$```````4````!`````P````````!L
+M$`$```````@```"1`0````````````!P$`$```````8````!````!```````
+M``"0$`$```````8````!````!`````````"\$`$```````0```"4`0``````
+M``````#`$`$```````4````!`````P````````#$$`$```````8````!````
+M!`````````#T$`$```````0```"1`0````````````#X$`$```````4````!
+M`````P````````#X$`$```````@```"1`0````````````#\$`$```````8`
+M```!````!``````````@$0$```````8````!````!`````````!($0$`````
+M``0```"4`0````````````!,$0$```````4````!`````P````````!0$0$`
+M``````8````!````!`````````!T$0$```````8````!````!`````````"8
+M$0$```````0```"4`0````````````"<$0$```````4````!`````P``````
+M``"@$0$```````8````!````!`````````#8$0$```````0```"1`0``````
+M``````#<$0$```````4````!`````P````````#<$0$```````@```"1`0``
+M``````````#@$0$```````8````!````!`````````#X$0$```````0````*
+M`0````````````#\$0$```````4````!`````P``````````$@$```````8`
+M```!````!``````````<$@$```````8````!````!`````````!`$@$`````
+M``0```"4`0````````````!$$@$```````4````!`````P````````!($@$`
+M``````8````!````!`````````!@$@$``````!$````"````""\```````!D
+M$@$``````!(````"````""\```````"$$@$```````0```"1`0``````````
+M``"($@$```````4````!`````P````````"($@$```````@```"1`0``````
+M``````",$@$```````8````!````!`````````"H$@$```````8````!````
+M!`````````#0$@$```````0```#J``````````````#4$@$```````4````!
+M`````P````````#8$@$```````8````!````!``````````<$P$```````0`
+M``"1`0`````````````@$P$```````4````!`````P`````````@$P$`````
+M``@```"1`0`````````````D$P$```````8````!````!`````````!<$P$`
+M``````0```"1`0````````````!@$P$```````4````!`````P````````!@
+M$P$```````@```"1`0````````````!D$P$```````8````!````!```````
+M``"`$P$```````8````!````!`````````"H$P$```````0```"4`0``````
+M``````"L$P$```````4````!`````P````````"P$P$```````8````!````
+M!`````````#($P$```````0```"4`0````````````#,$P$```````4````!
+M`````P````````#0$P$```````8````!````!`````````#H$P$```````0`
+M``"4`0````````````#L$P$```````4````!`````P````````#P$P$`````
+M``8````!````!``````````X%`$```````8````!````!`````````!0%`$`
+M``````0```"4`0````````````!4%`$```````4````!`````P````````!8
+M%`$```````8````!````!`````````!L%`$```````8````!````!```````
+M``",%`$```````0```"4`0````````````"0%`$```````4````!`````P``
+M``````"4%`$```````8````!````!`````````"X%`$```````0```"1`0``
+M``````````"\%`$```````4````!`````P````````"\%`$```````@```"1
+M`0````````````#`%`$```````8````!````!`````````#8%`$```````8`
+M```!````!```````````%0$```````0```"4`0`````````````$%0$`````
+M``4````!`````P`````````(%0$```````8````!````!`````````!`%0$`
+M``````0```"4`0````````````!$%0$```````4````!`````P````````!(
+M%0$```````8````!````!`````````!@%0$```````0```"4`0``````````
+M``!D%0$```````4````!`````P````````!H%0$```````8````!````!```
+M``````"4%0$```````8````!````!`````````"P%0$```````0```"4`0``
+M``````````"T%0$```````4````!`````P````````"X%0$```````8````!
+M````!``````````$%@$```````8````!````!``````````L%@$```````0`
+M``"4`0`````````````P%@$```````4````!`````P`````````T%@$`````
+M``8````!````!`````````!4%@$```````0```"4`0````````````!8%@$`
+M``````4````!`````P````````!<%@$```````8````!````!`````````!\
+M%@$```````0```"4`0````````````"`%@$```````4````!`````P``````
+M``"$%@$```````8````!````!`````````"D%@$```````0```"4`0``````
+M``````"H%@$```````4````!`````P````````"L%@$```````8````!````
+M!`````````#,%@$```````0```"4`0````````````#0%@$```````4````!
+M`````P````````#4%@$```````8````!````!`````````#\%@$```````8`
+M```!````!``````````\%P$```````0````E``````````````!`%P$`````
+M``4````!`````P````````!$%P$```````8````!````!`````````!L%P$`
+M``````0```!?`0````````````!P%P$```````4````!`````P````````!T
+M%P$```````8````!````!`````````"(%P$```````0```"1`0``````````
+M``",%P$```````4````!`````P````````",%P$```````@```"1`0``````
+M``````"0%P$```````8````!````!`````````"\%P$```````8````!````
+M!`````````#8%P$```````0```"4`0````````````#<%P$```````4````!
+M`````P````````#@%P$```````8````!````!`````````#T%P$```````0`
+M```E``````````````#X%P$```````4````!`````P````````#\%P$`````
+M``8````!````!``````````4&`$```````8````!````!`````````!`&`$`
+M``````0````E``````````````!$&`$```````4````!`````P````````!(
+M&`$```````8````!````!`````````!\&`$```````0```"4`0``````````
+M``"`&`$```````4````!`````P````````"$&`$```````8````!````!```
+M``````"<&`$```````0```!?`0````````````"@&`$```````4````!````
+M`P````````"D&`$```````8````!````!`````````#(&`$```````0```"1
+M`0````````````#,&`$```````4````!`````P````````#,&`$```````@`
+M``"1`0````````````#0&`$```````8````!````!`````````#\&`$`````
+M``8````!````!``````````<&0$```````0```"4`0`````````````@&0$`
+M``````4````!`````P`````````D&0$```````8````!````!``````````\
+M&0$```````0````E``````````````!`&0$```````4````!`````P``````
+M``!$&0$```````8````!````!`````````!P&0$```````8````!````!```
+M``````"@&0$```````0```"4`0````````````"D&0$```````4````!````
+M`P````````"H&0$```````8````!````!`````````#0&0$```````0```"1
+M`0````````````#4&0$```````4````!`````P````````#4&0$```````@`
+M``"1`0````````````#8&0$```````8````!````!`````````#T&0$`````
+M``0```"4`0````````````#X&0$```````4````!`````P````````#\&0$`
+M``````8````!````!``````````@&@$```````0```"1`0`````````````D
+M&@$```````4````!`````P`````````D&@$```````@```"1`0``````````
+M```H&@$```````8````!````!`````````!8&@$```````8````!````!```
+M``````"$&@$```````0````E``````````````"(&@$```````4````!````
+M`P````````",&@$```````8````!````!`````````#`&@$```````0```"4
+M`0````````````#$&@$```````4````!`````P````````#(&@$```````8`
+M```!````!`````````#D&@$```````0```!?`0````````````#H&@$`````
+M``4````!`````P````````#L&@$```````8````!````!``````````4&P$`
+M``````0```"1`0`````````````8&P$```````4````!`````P`````````8
+M&P$```````@```"1`0`````````````<&P$```````8````!````!```````
+M``!(&P$```````8````!````!`````````!H&P$```````0```"4`0``````
+M``````!L&P$```````4````!`````P````````!P&P$```````8````!````
+M!`````````"(&P$```````0````E``````````````",&P$```````4````!
+M`````P````````"0&P$```````8````!````!`````````#$&P$```````8`
+M```!````!`````````#<&P$```````0```"4`0````````````#@&P$`````
+M``4````!`````P````````#D&P$```````8````!````!`````````#\&P$`
+M``````8````!````!``````````4'`$```````0```"4`0`````````````8
+M'`$```````4````!`````P`````````<'`$```````8````!````!```````
+M```T'`$```````8````!````!`````````!0'`$```````0```"1`0``````
+M``````!4'`$```````4````!`````P````````!4'`$```````@```"1`0``
+M``````````!8'`$```````8````!````!`````````!T'`$```````8````!
+M````!`````````"8'`$```````0```#B``````````````"<'`$```````4`
+M```!`````P````````"@'`$```````8````!````!`````````"T'`$`````
+M``8````!````!`````````#L'`$```````0````:`0````````````#P'`$`
+M``````4````!`````P````````#T'`$```````8````!````!``````````(
+M'0$```````8````!````!``````````T'0$```````0```"1`0``````````
+M```X'0$```````4````!`````P`````````X'0$```````@```"1`0``````
+M```````\'0$```````8````!````!`````````!,'0$```````0````;````
+M``````````!0'0$```````4````!`````P````````!4'0$```````8````!
+M````!`````````!H'0$```````8````!````!`````````!X'0$```````0`
+M```[`0````````````!\'0$```````4````!`````P````````"`'0$`````
+M``8````!````!`````````"8'0$```````8````!````!`````````#$'0$`
+M``````0```"4`0````````````#('0$```````4````!`````P````````#,
+M'0$```````8````!````!`````````#P'0$```````0```"1`0``````````
+M``#T'0$```````4````!`````P````````#T'0$```````@```"1`0``````
+M``````#X'0$```````8````!````!``````````$'@$```````0````Y`0``
+M```````````('@$```````4````!`````P`````````('@$```````@````Y
+M`0`````````````,'@$```````8````!````!``````````L'@$```````0`
+M``"4`0`````````````P'@$```````4````!`````P`````````T'@$`````
+M``8````!````!`````````!,'@$```````0````Y`0````````````!0'@$`
+M``````4````!`````P````````!0'@$```````@````Y`0````````````!4
+M'@$```````8````!````!`````````!D'@$```````0```"4`0``````````
+M``!H'@$```````4````!`````P````````!L'@$```````8````!````!```
+M``````"('@$```````0```"1`0````````````",'@$```````4````!````
+M`P````````",'@$```````@```"1`0````````````"0'@$```````8````!
+M````!`````````"\'@$```````0```"4`0````````````#`'@$```````4`
+M```!`````P````````#$'@$```````8````!````!`````````#L'@$`````
+M``0```"1`0````````````#P'@$```````4````!`````P````````#P'@$`
+M``````@```"1`0````````````#T'@$```````8````!````!``````````<
+M'P$```````8````!````!`````````!$'P$```````0```"4`0``````````
+M``!('P$```````4````!`````P````````!,'P$```````8````!````!```
+M``````!P'P$```````0```"1`0````````````!T'P$```````4````!````
+M`P````````!T'P$```````@```"1`0````````````!X'P$```````8````!
+M````!`````````",'P$```````0```"4`0````````````"0'P$```````4`
+M```!`````P````````"4'P$```````8````!````!`````````"X'P$`````
+M``0```"1`0````````````"\'P$```````4````!`````P````````"\'P$`
+M``````@```"1`0````````````#`'P$```````8````!````!`````````#<
+M'P$```````8````!````!``````````$(`$```````0```"4`0``````````
+M```((`$```````4````!`````P`````````,(`$```````8````!````!```
+M```````P(`$```````0```"1`0`````````````T(`$```````4````!````
+M`P`````````T(`$```````@```"1`0`````````````X(`$```````8````!
+M````!`````````!,(`$```````0```"4`0````````````!0(`$```````4`
+M```!`````P````````!4(`$```````8````!````!`````````!X(`$`````
+M``0```"1`0````````````!\(`$```````4````!`````P````````!\(`$`
+M``````@```"1`0````````````"`(`$```````8````!````!`````````"<
+M(`$```````8````!````!``````````H(0$```````8````!````!```````
+M```\(0$```````0```"4`0````````````!`(0$```````4````!`````P``
+M``````!$(0$```````8````!````!`````````!@(0$```````8````!````
+M!`````````"@(0$``````!$```"\``````````````"D(0$``````!(```"\
+M``````````````"L(0$``````!$````,`0````````````"P(0$``````!(`
+M```,`0````````````"X(0$``````!$```#Q``````````````"\(0$`````
+M`!(```#Q``````````````#0(0$```````0````M`0````````````#4(0$`
+M``````4````!`````P````````#4(0$```````@````M`0````````````#8
+M(0$```````8````!````!`````````#T(0$```````8````!````!```````
+M```((@$```````0```"4`0`````````````,(@$```````4````!`````P``
+M```````0(@$```````8````!````!``````````D(@$```````8````!````
+M!``````````\(@$```````0```"1`0````````````!`(@$```````4````!
+M`````P````````!`(@$```````@```"1`0````````````!$(@$```````8`
+M```!````!`````````!8(@$```````8````!````!`````````!P(@$`````
+M``0```"1`0````````````!T(@$```````4````!`````P````````!T(@$`
+M``````@```"1`0````````````!X(@$```````8````!````!`````````",
+M(@$```````8````!````!`````````"L(@$```````0```"1`0``````````
+M``"P(@$```````4````!`````P````````"P(@$```````@```"1`0``````
+M``````"T(@$```````8````!````!`````````#,(@$```````0```!,````
+M``````````#0(@$```````4````!`````P````````#4(@$```````8````!
+M````!`````````#P(@$```````8````!````!``````````0(P$```````0`
+M``"4`0`````````````4(P$```````4````!`````P`````````8(P$`````
+M``8````!````!``````````X(P$```````0```"1`0`````````````\(P$`
+M``````4````!`````P`````````\(P$```````@```"1`0````````````!`
+M(P$```````8````!````!`````````!8(P$```````8````!````!```````
+M``!X(P$```````0```"4`0````````````!\(P$```````4````!`````P``
+M``````"`(P$```````8````!````!`````````"@(P$```````0```"1`0``
+M``````````"D(P$```````4````!`````P````````"D(P$```````@```"1
+M`0````````````"H(P$```````8````!````!`````````#`(P$```````8`
+M```!````!`````````#P(P$```````0```"1`0````````````#T(P$`````
+M``4````!`````P````````#T(P$```````@```"1`0````````````#X(P$`
+M``````8````!````!``````````0)`$```````0```"1`0`````````````4
+M)`$```````4````!`````P`````````4)`$```````@```"1`0``````````
+M```8)`$```````8````!````!``````````T)`$```````8````!````!```
+M``````!P)`$```````0```"4`0````````````!T)`$```````4````!````
+M`P````````!X)`$```````8````!````!`````````"P)`$```````0```"4
+M`0````````````"T)`$```````4````!`````P````````"X)`$```````8`
+M```!````!`````````#@)`$```````0```"1`0````````````#D)`$`````
+M``4````!`````P````````#D)`$```````@```"1`0````````````#H)`$`
+M``````8````!````!``````````()0$```````8````!````!`````````!$
+M)0$```````0```"4`0````````````!()0$```````4````!`````P``````
+M``!,)0$```````8````!````!`````````"`)0$```````0```"4`0``````
+M``````"$)0$```````4````!`````P````````"()0$```````8````!````
+M!`````````"P)0$```````0```"1`0````````````"T)0$```````4````!
+M`````P````````"T)0$```````@```"1`0````````````"X)0$```````8`
+M```!````!`````````#8)0$```````8````!````!`````````#P)0$`````
+M``0```"4`0````````````#T)0$```````4````!`````P````````#X)0$`
+M``````8````!````!``````````,)@$```````8````!````!``````````H
+M)@$```````0```"1`0`````````````L)@$```````4````!`````P``````
+M```L)@$```````@```"1`0`````````````P)@$```````8````!````!```
+M``````!@)P$```````8````!````!`````````#()P$```````0```"4`0``
+M``````````#,)P$```````4````!`````P````````#0)P$```````8````!
+M````!`````````"D*@$```````8````!````!`````````!P*P$```````0`
+M```!`0````````````!T*P$```````4````!`````P````````!X*P$`````
+M``8````!````!`````````#0*P$```````0```"4`0````````````#4*P$`
+M``````4````!`````P````````#8*P$```````8````!````!`````````#T
+M*P$```````0```"4`0````````````#X*P$```````4````!`````P``````
+M``#\*P$```````8````!````!``````````D+`$```````0```"4`0``````
+M```````H+`$```````4````!`````P`````````L+`$```````8````!````
+M!`````````!<+`$```````0```"4`0````````````!@+`$```````4````!
+M`````P````````!D+`$```````8````!````!`````````#T+`$```````0`
+M``"4`0````````````#X+`$```````4````!`````P````````#\+`$`````
+M``8````!````!``````````@+0$```````0```"4`0`````````````D+0$`
+M``````4````!`````P`````````H+0$```````8````!````!`````````!$
+M+0$```````0```"4`0````````````!(+0$```````4````!`````P``````
+M``!,+0$```````8````!````!`````````!P+0$```````0```"4`0``````
+M``````!T+0$```````4````!`````P````````!X+0$```````8````!````
+M!`````````"0+0$```````0```"4`0````````````"4+0$```````4````!
+M`````P````````"8+0$```````8````!````!`````````"X+0$```````0`
+M``":`0````````````"\+0$```````4````!`````P````````#`+0$`````
+M``8````!````!`````````!D+@$```````0```"1`0````````````!H+@$`
+M``````4````!`````P````````!H+@$```````@```"1`0````````````!L
+M+@$```````8````!````!`````````#<+@$```````0````O````````````
+M``#@+@$```````4````!`````P````````#D+@$```````8````!````!```
+M``````#X+@$```````0````O``````````````#\+@$```````4````!````
+M`P``````````+P$```````8````!````!``````````(+P$``````!$````$
+M````M$4````````,+P$``````!(````$````M$4```````!4+P$``````!$`
+M```$````M$4```````!8+P$``````!(````$````M$4```````!\+P$`````
+M``0```"1`0````````````"`+P$```````4````!`````P````````"`+P$`
+M``````@```"1`0````````````"$+P$```````8````!````!`````````"H
+M+P$``````!$````"````*"\```````"L+P$``````!(````"````*"\`````
+M``#0+P$```````0```"1`0````````````#4+P$```````4````!`````P``
+M``````#4+P$```````@```"1`0````````````#8+P$```````8````!````
+M!`````````#P+P$``````!$````"````/#<```````#T+P$``````!(````"
+M````/#<````````8,`$```````0```"1`0`````````````<,`$```````4`
+M```!`````P`````````<,`$```````@```"1`0`````````````@,`$`````
+M``8````!````!``````````X,`$``````!$````"````Y#$````````\,`$`
+M`````!(````"````Y#$```````!\,`$```````0```"1`0````````````"`
+M,`$```````4````!`````P````````"`,`$```````@```"1`0``````````
+M``"$,`$```````8````!````!`````````"P,`$```````0```"4`0``````
+M``````"T,`$```````4````!`````P````````"X,`$```````8````!````
+M!`````````#D,`$```````0```"1`0````````````#H,`$```````4````!
+M`````P````````#H,`$```````@```"1`0````````````#L,`$```````8`
+M```!````!```````````,0$```````0```"1`0`````````````$,0$`````
+M``4````!`````P`````````$,0$```````@```"1`0`````````````(,0$`
+M``````8````!````!``````````@,0$```````0```"1`0`````````````D
+M,0$```````4````!`````P`````````D,0$```````@```"1`0``````````
+M```H,0$```````8````!````!``````````\,0$```````0```"4`0``````
+M``````!`,0$```````4````!`````P````````!$,0$```````8````!````
+M!`````````!H,0$```````0```"1`0````````````!L,0$```````4````!
+M`````P````````!L,0$```````@```"1`0````````````!P,0$```````8`
+M```!````!`````````"0,0$```````0```"1`0````````````"4,0$`````
+M``4````!`````P````````"4,0$```````@```"1`0````````````"8,0$`
+M``````8````!````!`````````"P,0$```````0```"1`0````````````"T
+M,0$```````4````!`````P````````"T,0$```````@```"1`0``````````
+M``"X,0$```````8````!````!`````````#<,0$```````0```"1`0``````
+M``````#@,0$```````4````!`````P````````#@,0$```````@```"1`0``
+M``````````#D,0$```````8````!````!``````````4,@$```````0```"1
+M`0`````````````8,@$```````4````!`````P`````````8,@$```````@`
+M``"1`0`````````````<,@$```````8````!````!`````````!@,@$`````
+M``0```"1`0````````````!D,@$```````4````!`````P````````!D,@$`
+M``````@```"1`0````````````!H,@$```````8````!````!`````````",
+M,@$```````0```"1`0````````````"0,@$```````4````!`````P``````
+M``"0,@$```````@```"1`0````````````"4,@$```````8````!````!```
+M``````"T,@$```````0```"4`0````````````"X,@$```````4````!````
+M`P````````"\,@$```````8````!````!`````````#<,@$```````0```"1
+M`0````````````#@,@$```````4````!`````P````````#@,@$```````@`
+M``"1`0````````````#D,@$```````8````!````!`````````#X,@$`````
+M``0```"1`0````````````#\,@$```````4````!`````P````````#\,@$`
+M``````@```"1`0``````````````,P$```````8````!````!``````````4
+M,P$```````0```"1`0`````````````8,P$```````4````!`````P``````
+M```8,P$```````@```"1`0`````````````<,P$```````8````!````!```
+M```````T,P$```````0```"1`0`````````````X,P$```````4````!````
+M`P`````````X,P$```````@```"1`0`````````````\,P$```````8````!
+M````!`````````"`,P$```````0```"1`0````````````"$,P$```````4`
+M```!`````P````````"$,P$```````@```"1`0````````````"(,P$`````
+M``8````!````!`````````"P,P$```````0```"1`0````````````"T,P$`
+M``````4````!`````P````````"T,P$```````@```"1`0````````````"X
+M,P$```````8````!````!`````````#0,P$```````0```"1`0``````````
+M``#4,P$```````4````!`````P````````#4,P$```````@```"1`0``````
+M``````#8,P$```````8````!````!`````````#L,P$```````0```"1`0``
+M``````````#P,P$```````4````!`````P````````#P,P$```````@```"1
+M`0````````````#T,P$```````8````!````!``````````@-`$```````0`
+M``"4`0`````````````D-`$```````4````!`````P`````````H-`$`````
+M``8````!````!`````````!(-`$```````0```"1`0````````````!,-`$`
+M``````4````!`````P````````!,-`$```````@```"1`0````````````!0
+M-`$```````8````!````!`````````!@-`$```````0````E`0``````````
+M``!D-`$```````4````!`````P````````!H-`$```````8````!````!```
+M``````"<-`$```````0```"4`0````````````"@-`$```````4````!````
+M`P````````"D-`$```````8````!````!`````````#<-`$```````0```"1
+M`0````````````#@-`$```````4````!`````P````````#@-`$```````@`
+M``"1`0````````````#D-`$```````8````!````!`````````!(-0$`````
+M``0```"1`0````````````!,-0$```````4````!`````P````````!,-0$`
+M``````@```"1`0````````````!0-0$```````8````!````!`````````!H
+M-0$```````0```"1`0````````````!L-0$```````4````!`````P``````
+M``!L-0$```````@```"1`0````````````!P-0$```````8````!````!```
+M``````"$-0$```````0```"4`0````````````"(-0$```````4````!````
+M`P````````",-0$```````8````!````!``````````0-@$```````0````Y
+M`0`````````````4-@$```````4````!`````P`````````4-@$```````@`
+M```Y`0`````````````8-@$```````8````!````!``````````L-@$`````
+M``0```"4`0`````````````P-@$```````4````!`````P`````````T-@$`
+M``````8````!````!`````````!4-@$```````0```"1`0````````````!8
+M-@$```````4````!`````P````````!8-@$```````@```"1`0``````````
+M``!<-@$```````8````!````!`````````!X-@$```````0```!,````````
+M``````!\-@$```````4````!`````P````````"`-@$```````8````!````
+M!`````````"0-@$```````0````=``````````````"4-@$```````4````!
+M`````P````````"8-@$```````8````!````!`````````#T-@$```````0`
+M``"1`0````````````#X-@$```````4````!`````P````````#X-@$`````
+M``@```"1`0````````````#\-@$```````8````!````!``````````L-P$`
+M``````0```"1`0`````````````P-P$```````4````!`````P`````````P
+M-P$```````@```"1`0`````````````T-P$```````8````!````!```````
+M``!4-P$```````0````1`0````````````!8-P$```````4````!`````P``
+M``````!<-P$```````8````!````!`````````"`-P$```````0```"1`0``
+M``````````"$-P$```````4````!`````P````````"$-P$```````@```"1
+M`0````````````"(-P$```````8````!````!`````````"<-P$```````0`
+M``"1`0````````````"@-P$```````4````!`````P````````"@-P$`````
+M``@```"1`0````````````"D-P$```````8````!````!`````````"X-P$`
+M``````0```"1`0````````````"\-P$```````4````!`````P````````"\
+M-P$```````@```"1`0````````````#`-P$```````8````!````!```````
+M``#0-P$```````0```"4`0````````````#4-P$```````4````!`````P``
+M``````#8-P$```````8````!````!`````````#L-P$```````0```"1`0``
+M``````````#P-P$```````4````!`````P````````#P-P$```````@```"1
+M`0````````````#T-P$```````8````!````!``````````,.`$```````0`
+M``"1`0`````````````0.`$```````4````!`````P`````````0.`$`````
+M``@```"1`0`````````````4.`$```````8````!````!``````````P.`$`
+M``````0```"4`0`````````````T.`$```````4````!`````P`````````X
+M.`$```````8````!````!`````````!8.`$```````0```"1`0``````````
+M``!<.`$```````4````!`````P````````!<.`$```````@```"1`0``````
+M``````!@.`$```````8````!````!`````````!\.`$```````0```"4`0``
+M``````````"`.`$```````4````!`````P````````"$.`$```````8````!
+M````!`````````"D.`$```````0```"1`0````````````"H.`$```````4`
+M```!`````P````````"H.`$```````@```"1`0````````````"L.`$`````
+M``8````!````!`````````#,.`$```````0```!3``````````````#0.`$`
+M``````4````!`````P````````#0.`$```````@```!3``````````````#4
+M.`$```````8````!````!`````````#H.`$```````0```"4`0``````````
+M``#L.`$```````4````!`````P````````#P.`$```````8````!````!```
+M```````8.0$```````0```"1`0`````````````<.0$```````4````!````
+M`P`````````<.0$```````@```"1`0`````````````@.0$```````8````!
+M````!`````````!(.0$```````0```"<``````````````!,.0$```````4`
+M```!`````P````````!0.0$```````8````!````!`````````!X.0$`````
+M``0```#8``````````````!\.0$```````4````!`````P````````"`.0$`
+M``````8````!````!`````````"H.0$```````0````X``````````````"L
+M.0$```````4````!`````P````````"P.0$```````8````!````!```````
+M``#0.0$```````0```"1`0````````````#4.0$```````4````!`````P``
+M``````#4.0$```````@```"1`0````````````#8.0$```````8````!````
+M!``````````L.@$```````8````!````!`````````!0.@$```````8````!
+M````!`````````!P.@$```````0```!:`0````````````!T.@$```````4`
+M```!`````P````````!X.@$```````8````!````!`````````"@.@$`````
+M``0````Y`0````````````"D.@$```````4````!`````P````````"D.@$`
+M``````@````Y`0````````````"H.@$```````8````!````!`````````#(
+M.@$```````8````!````!`````````#P.@$```````0```!:`0``````````
+M``#T.@$```````4````!`````P````````#X.@$```````8````!````!```
+M``````!H.P$```````0```"1`0````````````!L.P$```````4````!````
+M`P````````!L.P$```````@```"1`0````````````!P.P$```````8````!
+M````!`````````"(.P$```````0```"1`0````````````",.P$```````4`
+M```!`````P````````",.P$```````@```"1`0````````````"0.P$`````
+M``8````!````!`````````"H.P$```````0```"1`0````````````"L.P$`
+M``````4````!`````P````````"L.P$```````@```"1`0````````````"P
+M.P$```````8````!````!`````````"\.P$```````0````Y`0``````````
+M``#`.P$```````4````!`````P````````#`.P$```````@````Y`0``````
+M``````#$.P$```````8````!````!`````````#@.P$```````0```"1`0``
+M``````````#D.P$```````4````!`````P````````#D.P$```````@```"1
+M`0````````````#H.P$```````8````!````!``````````0/`$```````0`
+M``"1`0`````````````4/`$```````4````!`````P`````````4/`$`````
+M``@```"1`0`````````````8/`$```````8````!````!``````````D/`$`
+M``````0````Y`0`````````````H/`$```````4````!`````P`````````H
+M/`$```````@````Y`0`````````````L/`$```````8````!````!```````
+M``!P/`$```````0```"1`0````````````!T/`$```````4````!`````P``
+M``````!T/`$```````@```"1`0````````````!X/`$```````8````!````
+M!`````````"@/`$```````0```"1`0````````````"D/`$```````4````!
+M`````P````````"D/`$```````@```"1`0````````````"H/`$```````8`
+M```!````!`````````"T/`$```````0````Y`0````````````"X/`$`````
+M``4````!`````P````````"X/`$```````@````Y`0````````````"\/`$`
+M``````8````!````!`````````#4/`$```````0```"1`0````````````#8
+M/`$```````4````!`````P````````#8/`$```````@```"1`0``````````
+M``#</`$```````8````!````!`````````#\/`$```````0````Y`0``````
+M````````/0$```````4````!`````P``````````/0$```````@````Y`0``
+M```````````$/0$```````8````!````!``````````8/0$```````0```!:
+M`0`````````````</0$```````4````!`````P`````````@/0$```````8`
+M```!````!`````````!8/0$```````8````!````!`````````"4/0$`````
+M``0````!`0````````````"8/0$```````4````!`````P````````"</0$`
+M``````8````!````!`````````#$/0$```````0```"4`0````````````#(
+M/0$```````4````!`````P````````#,/0$```````8````!````!```````
+M``#L/0$```````0```"4`0````````````#P/0$```````4````!`````P``
+M``````#T/0$```````8````!````!``````````,/@$```````0```"4`0``
+M```````````0/@$```````4````!`````P`````````4/@$```````8````!
+M````!``````````H/@$```````0```"4`0`````````````L/@$```````4`
+M```!`````P`````````P/@$```````8````!````!`````````!T/@$`````
+M``0```##``````````````!X/@$```````4````!`````P````````!X/@$`
+M``````@```##``````````````",/@$```````0```##``````````````"0
+M/@$```````4````!`````P````````"0/@$```````@```##````````````
+M``"D/@$```````0```"4`0````````````"H/@$```````4````!`````P``
+M``````"L/@$```````8````!````!`````````#8/@$```````0```"1`0``
+M``````````#</@$```````4````!`````P````````#</@$```````@```"1
+M`0````````````#@/@$```````8````!````!`````````!`/P$```````0`
+M```=``````````````!$/P$```````4````!`````P````````!(/P$`````
+M``8````!````!`````````!8/P$```````0````Y`0````````````!</P$`
+M``````4````!`````P````````!</P$```````@````Y`0````````````!@
+M/P$```````8````!````!`````````!P/P$```````0````=````````````
+M``!T/P$```````4````!`````P````````!X/P$```````8````!````!```
+M``````#\/P$```````8````!````!``````````P0`$```````0```"4`0``
+M```````````T0`$```````4````!`````P`````````X0`$```````8````!
+M````!`````````!,0`$```````0```"1`0````````````!00`$```````4`
+M```!`````P````````!00`$```````@```"1`0````````````!40`$`````
+M``8````!````!`````````!@0`$```````0````Y`0````````````!D0`$`
+M``````4````!`````P````````!D0`$```````@````Y`0````````````!H
+M0`$```````8````!````!`````````"00`$```````0```!,````````````
+M``"40`$```````4````!`````P````````"80`$```````8````!````!```
+M``````"T0`$```````0```"1`0````````````"X0`$```````4````!````
+M`P````````"X0`$```````@```"1`0````````````"\0`$```````8````!
+M````!`````````#@0`$```````8````!````!``````````400$```````0`
+M``"+```````````````800$```````4````!`````P`````````<00$`````
+M``8````!````!`````````!$00$``````!$````"````/#H```````!(00$`
+M`````!(````"````/#H```````!<00$```````0````O``````````````!@
+M00$```````4````!`````P````````!D00$```````8````!````!```````
+M``"D00$```````0````O``````````````"H00$```````4````!`````P``
+M``````"L00$```````8````!````!`````````#400$```````0````O````
+M``````````#800$```````4````!`````P````````#<00$```````8````!
+M````!``````````@0@$```````0```"1`0`````````````D0@$```````4`
+M```!`````P`````````D0@$```````@```"1`0`````````````H0@$`````
+M``8````!````!`````````!,0@$```````0```"1`0````````````!00@$`
+M``````4````!`````P````````!00@$```````@```"1`0````````````!4
+M0@$```````8````!````!`````````"`0@$```````8````!````!```````
+M``"80@$```````0```"4`0````````````"<0@$```````4````!`````P``
+M``````"@0@$```````8````!````!`````````#@0@$```````8````!````
+M!``````````40P$```````0```"4`0`````````````80P$```````4````!
+M`````P`````````<0P$```````8````!````!`````````!<0P$```````0`
+M``"1`0````````````!@0P$```````4````!`````P````````!@0P$`````
+M``@```"1`0````````````!D0P$```````8````!````!`````````!X0P$`
+M``````0```"4`0````````````!\0P$```````4````!`````P````````"`
+M0P$```````8````!````!`````````"@0P$```````0```"1`0``````````
+M``"D0P$```````4````!`````P````````"D0P$```````@```"1`0``````
+M``````"H0P$```````8````!````!`````````#40P$```````0```"4`0``
+M``````````#80P$```````4````!`````P````````#<0P$```````8````!
+M````!`````````#P0P$```````0````Y`0````````````#T0P$```````4`
+M```!`````P````````#T0P$```````@````Y`0````````````#X0P$`````
+M``8````!````!`````````"P1`$```````8````!````!`````````#L1`$`
+M``````0```"4`0````````````#P1`$```````4````!`````P````````#T
+M1`$```````8````!````!`````````!X10$```````8````!````!```````
+M``"P10$```````0```!S`0````````````"T10$```````4````!`````P``
+M``````"X10$```````8````!````!`````````#@10$``````!$````%````
+M-@````````#D10$``````!(````%````-@````````!81@$```````0```"4
+M`0````````````!<1@$```````4````!`````P````````!@1@$```````8`
+M```!````!`````````"`1@$```````0```"1`0````````````"$1@$`````
+M``4````!`````P````````"$1@$```````@```"1`0````````````"(1@$`
+M``````8````!````!`````````"X1@$```````8````!````!`````````#$
+M1@$``````!$````"````9#P```````#(1@$``````!(````"````9#P`````
+M```(1P$``````!$````"````9#P````````,1P$``````!(````"````9#P`
+M``````!D1P$```````8````!````!`````````"82`$``````!$````$````
+M!$<```````"<2`$``````!(````$````!$<```````!T20$``````!$````$
+M````!$<```````!X20$``````!(````$````!$<```````"420$```````0`
+M```O``````````````"820$```````4````!`````P````````"<20$`````
+M``8````!````!`````````#,20$```````0````O``````````````#020$`
+M``````4````!`````P````````#420$```````8````!````!```````````
+M2@$```````0````O```````````````$2@$```````4````!`````P``````
+M```(2@$```````8````!````!``````````P2@$```````0````O````````
+M```````T2@$```````4````!`````P`````````X2@$```````8````!````
+M!`````````!@2@$```````0````O``````````````!D2@$```````4````!
+M`````P````````!H2@$```````8````!````!`````````"@2@$``````!$`
+M```$````!$<```````"D2@$``````!(````$````!$<```````#$2@$`````
+M``0```"1`0````````````#(2@$```````4````!`````P````````#(2@$`
+M``````@```"1`0````````````#,2@$```````8````!````!``````````0
+M2P$```````8````!````!`````````"(3`$```````0```"1`0``````````
+M``",3`$```````4````!`````P````````",3`$```````@```"1`0``````
+M``````"03`$```````8````!````!`````````"H3`$```````0```"1`0``
+M``````````"L3`$```````4````!`````P````````"L3`$```````@```"1
+M`0````````````"P3`$```````8````!````!`````````#03`$```````8`
+M```!````!`````````!,30$```````0```"4`0````````````!030$`````
+M``4````!`````P````````!430$```````8````!````!`````````"$30$`
+M``````0```"1`0````````````"(30$```````4````!`````P````````"(
+M30$```````@```"1`0````````````",30$```````8````!````!```````
+M``#(30$```````0```"4`0````````````#,30$```````4````!`````P``
+M``````#030$```````8````!````!```````````3@$```````0```"4`0``
+M```````````$3@$```````4````!`````P`````````(3@$```````8````!
+M````!`````````!,3@$```````0```"1`0````````````!03@$```````4`
+M```!`````P````````!03@$```````@```"1`0````````````!43@$`````
+M``8````!````!`````````"43@$```````0```"1`0````````````"83@$`
+M``````4````!`````P````````"83@$```````@```"1`0````````````"<
+M3@$```````8````!````!`````````"P3@$```````0```"4`0``````````
+M``"T3@$```````4````!`````P````````"X3@$```````8````!````!```
+M```````$3P$```````0```"1`0`````````````(3P$```````4````!````
+M`P`````````(3P$```````@```"1`0`````````````,3P$```````8````!
+M````!``````````@3P$```````0```"4`0`````````````D3P$```````4`
+M```!`````P`````````H3P$```````8````!````!`````````!P3P$`````
+M``0```"1`0````````````!T3P$```````4````!`````P````````!T3P$`
+M``````@```"1`0````````````!X3P$```````8````!````!`````````",
+M3P$```````0```"4`0````````````"03P$```````4````!`````P``````
+M``"43P$```````8````!````!`````````#D3P$```````0```"1`0``````
+M``````#H3P$```````4````!`````P````````#H3P$```````@```"1`0``
+M``````````#L3P$```````8````!````!``````````T4`$```````0```"1
+M`0`````````````X4`$```````4````!`````P`````````X4`$```````@`
+M``"1`0`````````````\4`$```````8````!````!`````````!04`$`````
+M``0```"4`0````````````!44`$```````4````!`````P````````!84`$`
+M``````8````!````!`````````",4`$```````0```"1`0````````````"0
+M4`$```````4````!`````P````````"04`$```````@```"1`0``````````
+M``"44`$```````8````!````!`````````"H4`$```````0```"4`0``````
+M``````"L4`$```````4````!`````P````````"P4`$```````8````!````
+M!`````````#X4`$```````0```"1`0````````````#\4`$```````4````!
+M`````P````````#\4`$```````@```"1`0``````````````40$```````8`
+M```!````!`````````"440$```````0```"4`0````````````"840$`````
+M``4````!`````P````````"<40$```````8````!````!`````````#(40$`
+M``````0```"1`0````````````#,40$```````4````!`````P````````#,
+M40$```````@```"1`0````````````#040$```````8````!````!```````
+M```$4@$```````8````!````!`````````!`4@$```````0```"1`0``````
+M``````!$4@$```````4````!`````P````````!$4@$```````@```"1`0``
+M``````````!(4@$```````8````!````!`````````!@4@$```````8````!
+M````!`````````"P4P$```````0````4``````````````"T4P$```````4`
+M```!`````P````````"X4P$```````8````!````!`````````!,5`$`````
+M``8````!````!`````````"05`$``````!$````&``````````````"45`$`
+M`````!(````&``````````````"<5`$```````0````D`0````````````"@
+M5`$```````4````!`````P````````"@5`$```````@````D`0``````````
+M``"D5`$```````8````!````!`````````"L5`$``````!$````&````"`$`
+M``````"P5`$``````!(````&````"`$```````"X5`$```````0````D`0``
+M``````````"\5`$```````4````!`````P````````"\5`$```````@````D
+M`0````````````#`5`$```````8````!````!`````````#(5`$``````!(`
+M```&``````````````#<5`$``````!$````&````"`````````#@5`$`````
+M`!(````&````"``````````450$``````!$````&```````````````850$`
+M`````!(````&``````````````",50$``````!$````&````"`````````"0
+M50$``````!(````&````"`````````#H50$``````!$````&````````````
+M``#L50$``````!(````&```````````````85@$``````!$````&````````
+M```````<5@$``````!(````&``````````````#,5@$``````!$````&````
+M``````````#05@$``````!(````&``````````````#D5@$``````!$````&
+M``````````````#H5@$``````!(````&``````````````#P5@$``````!$`
+M```&``````````````#T5@$``````!(````&``````````````#85P$`````
+M`!$````&````"`$```````#<5P$``````!(````&````"`$````````H6`$`
+M`````!$````&```````````````L6`$``````!(````&``````````````!8
+M6`$``````!$````&``````````````!<6`$``````!(````&````````````
+M``!D6`$``````!$````&````"`$```````!H6`$``````!(````&````"`$`
+M````````60$``````!$````&````"``````````$60$``````!(````&````
+M"`````````"T60$``````!$````&````"`$```````"X60$``````!(````&
+M````"`$`````````6@$``````!$````&````"`$````````$6@$``````!(`
+M```&````"`$```````!(6@$```````0```"1`0````````````!,6@$`````
+M``4````!`````P````````!,6@$```````@```"1`0````````````!06@$`
+M``````8````!````!`````````"46@$```````8````!````!`````````#T
+M6@$``````!$````&````B`$```````#X6@$``````!(````&````B`$`````
+M``!<6P$```````0````7`0````````````!@6P$```````4````!`````P``
+M``````!D6P$```````8````!````!`````````"D70$``````!$````"````
+MF#P```````"H70$``````!(````"````F#P```````!L7P$``````!$````"
+M````C#P```````!P7P$``````!(````"````C#P```````"`8`$```````0`
+M``"1`0````````````"$8`$```````4````!`````P````````"$8`$`````
+M``@```"1`0````````````"(8`$```````8````!````!``````````(80$`
+M``````0```"1`0`````````````,80$```````4````!`````P`````````,
+M80$```````@```"1`0`````````````080$```````8````!````!```````
+M``!P80$```````8````!````!``````````P9`$```````8````!````!```
+M``````!H9`$```````0```##``````````````!L9`$```````4````!````
+M`P````````!L9`$```````@```##``````````````#(9`$```````0```##
+M``````````````#,9`$```````4````!`````P````````#,9`$```````@`
+M``##``````````````!89@$```````8````!````!`````````#$9@$`````
+M``8````!````!`````````#09@$``````!$````"````N#P```````#49@$`
+M`````!(````"````N#P```````"89P$```````8````!````!`````````#8
+M9P$```````0```"1`0````````````#<9P$```````4````!`````P``````
+M``#<9P$```````@```"1`0````````````#@9P$```````8````!````!```
+M````````:`$```````8````!````!`````````!$:`$```````0```"4`0``
+M``````````!(:`$```````4````!`````P````````!,:`$```````8````!
+M````!``````````0:0$```````8````!````!``````````P:0$``````!$`
+M```"````N#P````````T:0$``````!(````"````N#P```````"0:0$`````
+M`!$````"````N#P```````"4:0$``````!(````"````N#P````````8:@$`
+M`````!$````"````N#P````````<:@$``````!(````"````N#P```````!<
+M:@$``````!$````"````N#P```````!@:@$``````!(````"````N#P`````
+M``"`:@$``````!$````"````N#P```````"$:@$``````!(````"````N#P`
+M``````"0:@$``````!$````"````N#P```````"4:@$``````!(````"````
+MN#P```````",:P$```````8````!````!`````````"\:P$```````0```"4
+M`0````````````#`:P$```````4````!`````P````````#$:P$```````8`
+M```!````!``````````\;`$```````0```"1`0````````````!`;`$`````
+M``4````!`````P````````!`;`$```````@```"1`0````````````!$;`$`
+M``````8````!````!`````````!D;`$```````8````!````!`````````"(
+M;`$```````8````!````!`````````"L;`$```````0```#W````````````
+M``"P;`$```````4````!`````P````````"T;`$```````8````!````!```
+M``````#,;`$```````0````*`0````````````#0;`$```````4````!````
+M`P````````#4;`$```````8````!````!`````````#D;`$```````0```"4
+M`0````````````#H;`$```````4````!`````P````````#L;`$```````8`
+M```!````!``````````P;0$```````0````*`0`````````````T;0$`````
+M``4````!`````P`````````X;0$```````8````!````!`````````!L;0$`
+M``````0```"1`0````````````!P;0$```````4````!`````P````````!P
+M;0$```````@```"1`0````````````!T;0$```````8````!````!```````
+M``"$;0$```````0````*`0````````````"(;0$```````4````!`````P``
+M``````",;0$```````8````!````!`````````"P;0$```````8````!````
+M!`````````#<;0$```````0```!J`0````````````#@;0$```````4````!
+M`````P````````#D;0$```````8````!````!`````````#X;0$```````8`
+M```!````!``````````L;@$```````0````9`0`````````````P;@$`````
+M``4````!`````P`````````T;@$```````8````!````!`````````!(;@$`
+M``````8````!````!`````````#T;@$```````0````D`0````````````#X
+M;@$```````4````!`````P````````#X;@$```````@````D`0``````````
+M``#\;@$```````8````!````!`````````!P;P$```````8````!````!```
+M``````"T;P$```````0```"1`0````````````"X;P$```````4````!````
+M`P````````"X;P$```````@```"1`0````````````"\;P$```````8````!
+M````!`````````#D;P$```````0```"1`0````````````#H;P$```````4`
+M```!`````P````````#H;P$```````@```"1`0````````````#L;P$`````
+M``8````!````!`````````#\;P$```````0```"4`0``````````````<`$`
+M``````4````!`````P`````````$<`$```````8````!````!``````````P
+M<`$```````0```"1`0`````````````T<`$```````4````!`````P``````
+M```T<`$```````@```"1`0`````````````X<`$```````8````!````!```
+M``````!8<`$```````8````!````!`````````#X<`$```````8````!````
+M!``````````0<@$```````0```"1`0`````````````4<@$```````4````!
+M`````P`````````4<@$```````@```"1`0`````````````8<@$```````8`
+M```!````!`````````!,<@$```````0```"1`0````````````!0<@$`````
+M``4````!`````P````````!0<@$```````@```"1`0````````````!4<@$`
+M``````8````!````!`````````!L<@$```````0```"1`0````````````!P
+M<@$```````4````!`````P````````!P<@$```````@```"1`0``````````
+M``!T<@$```````8````!````!`````````"8<@$```````0```"1`0``````
+M``````"<<@$```````4````!`````P````````"<<@$```````@```"1`0``
+M``````````"@<@$```````8````!````!`````````#4<@$```````0```"1
+M`0````````````#8<@$```````4````!`````P````````#8<@$```````@`
+M``"1`0````````````#<<@$```````8````!````!`````````#T<@$`````
+M``0```"4`0````````````#X<@$```````4````!`````P````````#\<@$`
+M``````8````!````!``````````H<P$```````0```"1`0`````````````L
+M<P$```````4````!`````P`````````L<P$```````@```"1`0``````````
+M```P<P$```````8````!````!`````````!<<P$```````0```"1`0``````
+M``````!@<P$```````4````!`````P````````!@<P$```````@```"1`0``
+M``````````!D<P$```````8````!````!`````````"<<P$```````0```"1
+M`0````````````"@<P$```````4````!`````P````````"@<P$```````@`
+M``"1`0````````````"D<P$```````8````!````!`````````#(<P$`````
+M``0```"4`0````````````#,<P$```````4````!`````P````````#0<P$`
+M``````8````!````!`````````#P<P$```````0```"1`0````````````#T
+M<P$```````4````!`````P````````#T<P$```````@```"1`0``````````
+M``#X<P$```````8````!````!``````````@=`$```````0```"4`0``````
+M```````D=`$```````4````!`````P`````````H=`$```````8````!````
+M!`````````!(=`$```````0```"1`0````````````!,=`$```````4````!
+M`````P````````!,=`$```````@```"1`0````````````!0=`$```````8`
+M```!````!`````````!X=`$```````0```"4`0````````````!\=`$`````
+M``4````!`````P````````"`=`$```````8````!````!`````````"@=`$`
+M``````0```"1`0````````````"D=`$```````4````!`````P````````"D
+M=`$```````@```"1`0````````````"H=`$```````8````!````!```````
+M``#@=`$```````0```"4`0````````````#D=`$```````4````!`````P``
+M``````#H=`$```````8````!````!``````````$=0$```````0```"1`0``
+M```````````(=0$```````4````!`````P`````````(=0$```````@```"1
+M`0`````````````,=0$```````8````!````!`````````!,=0$```````0`
+M``"4`0````````````!0=0$```````4````!`````P````````!4=0$`````
+M``8````!````!`````````!T=0$```````0```"1`0````````````!X=0$`
+M``````4````!`````P````````!X=0$```````@```"1`0````````````!\
+M=0$```````8````!````!`````````"$=0$```````0````L`0``````````
+M``",=0$```````0````Q``````````````"@=0$```````0```#!````````
+M``````#,=0$```````0```"1`0````````````#0=0$```````4````!````
+M`P````````#0=0$```````@```"1`0````````````#4=0$```````8````!
+M````!``````````(=@$```````0```"1`0`````````````,=@$```````4`
+M```!`````P`````````,=@$```````@```"1`0`````````````0=@$`````
+M``8````!````!``````````T=@$```````0```"4`0`````````````X=@$`
+M``````4````!`````P`````````\=@$```````8````!````!`````````!<
+M=@$```````0```"1`0````````````!@=@$```````4````!`````P``````
+M``!@=@$```````@```"1`0````````````!D=@$```````8````!````!```
+M``````"<=P$```````8````!````!`````````"X=P$```````0```"4`0``
+M``````````"\=P$```````4````!`````P````````#`=P$```````8````!
+M````!`````````#4=P$```````8````!````!`````````#P=P$```````0`
+M``"1`0````````````#T=P$```````4````!`````P````````#T=P$`````
+M``@```"1`0````````````#X=P$```````8````!````!``````````0>`$`
+M``````8````!````!``````````P>`$```````0```"1`0`````````````T
+M>`$```````4````!`````P`````````T>`$```````@```"1`0``````````
+M```X>`$```````8````!````!`````````!0>`$```````8````!````!```
+M``````"`>`$```````0```"4`0````````````"$>`$```````4````!````
+M`P````````"(>`$```````8````!````!`````````"@>`$```````0```"4
+M`0````````````"D>`$```````4````!`````P````````"H>`$```````8`
+M```!````!`````````#@>`$```````8````!````!``````````4>0$`````
+M``0```"1`0`````````````8>0$```````4````!`````P`````````8>0$`
+M``````@```"1`0`````````````<>0$```````8````!````!``````````\
+M>0$```````0````Y`0````````````!`>0$```````4````!`````P``````
+M``!`>0$```````@````Y`0````````````!$>0$```````8````!````!```
+M``````!D>0$```````0```"1`0````````````!H>0$```````4````!````
+M`P````````!H>0$```````@```"1`0````````````!L>0$```````8````!
+M````!`````````!0@`$```````8````!````!`````````!T@`$```````0`
+M``"1`0````````````!X@`$```````4````!`````P````````!X@`$`````
+M``@```"1`0````````````!\@`$```````8````!````!`````````"4@`$`
+M``````0```"1`0````````````"8@`$```````4````!`````P````````"8
+M@`$```````@```"1`0````````````"<@`$```````8````!````!```````
+M``"T@`$```````0```"1`0````````````"X@`$```````4````!`````P``
+M``````"X@`$```````@```"1`0````````````"\@`$```````8````!````
+M!`````````#4@`$```````0```"1`0````````````#8@`$```````4````!
+M`````P````````#8@`$```````@```"1`0````````````#<@`$```````8`
+M```!````!`````````#T@`$```````0```"1`0````````````#X@`$`````
+M``4````!`````P````````#X@`$```````@```"1`0````````````#\@`$`
+M``````8````!````!``````````4@0$```````0```"1`0`````````````8
+M@0$```````4````!`````P`````````8@0$```````@```"1`0``````````
+M```<@0$```````8````!````!``````````T@0$```````0```"1`0``````
+M```````X@0$```````4````!`````P`````````X@0$```````@```"1`0``
+M```````````\@0$```````8````!````!`````````!4@0$```````0```"1
+M`0````````````!8@0$```````4````!`````P````````!8@0$```````@`
+M``"1`0````````````!<@0$```````8````!````!`````````!T@0$`````
+M``0```"1`0````````````!X@0$```````4````!`````P````````!X@0$`
+M``````@```"1`0````````````!\@0$```````8````!````!`````````"0
+M@0$```````0```"1`0````````````"4@0$```````4````!`````P``````
+M``"4@0$```````@```"1`0````````````"8@0$```````8````!````!```
+M``````"P@0$```````8````!````!`````````#<@0$```````0```"1`0``
+M``````````#@@0$```````4````!`````P````````#@@0$```````@```"1
+M`0````````````#D@0$```````8````!````!``````````$@@$```````0`
+M``"1`0`````````````(@@$```````4````!`````P`````````(@@$`````
+M``@```"1`0`````````````,@@$```````8````!````!``````````L@@$`
+M``````0```"4`0`````````````P@@$```````4````!`````P`````````T
+M@@$```````8````!````!`````````!4@@$```````0````O````````````
+M``!8@@$```````4````!`````P````````!<@@$```````8````!````!```
+M``````!\@@$```````8````!````!`````````"0@@$``````!$````"````
+M`%(```````"4@@$``````!(````"`````%(```````"8@@$``````!(````"
+M`````%(```````#`@@$``````!$````"````%%(```````#$@@$``````!(`
+M```"````%%(```````#(@@$``````!(````"````%%(```````#P@@$`````
+M`!$````"````*%(```````#T@@$``````!(````"````*%(```````#X@@$`
+M`````!(````"````*%(````````@@P$``````!$````"````/%(````````D
+M@P$``````!(````"````/%(````````H@P$``````!(````"````/%(`````
+M``"4@P$```````0```"T``````````````"8@P$```````4````!`````P``
+M``````"8@P$```````@```"T``````````````"<@P$```````8````!````
+M!`````````#4@P$```````8````!````!``````````,A`$``````!$````"
+M````V#T````````0A`$``````!(````"````V#T````````8A`$```````0`
+M``#J```````````````<A`$```````4````!`````P`````````@A`$`````
+M``8````!````!`````````"8A`$``````!$````%````2`````````"<A`$`
+M`````!(````%````2`````````"DA`$```````0```#J``````````````"H
+MA`$```````4````!`````P````````"LA`$```````8````!````!```````
+M``#@A`$```````8````!````!`````````#LA`$``````!$````"````4%(`
+M``````#PA`$``````!(````"````4%(```````!,A0$```````8````!````
+M!`````````",A0$```````0```#1``````````````"0A0$```````4````!
+M`````P````````"4A0$```````8````!````!`````````#4A0$```````0`
+M``"%`0````````````#8A0$```````4````!`````P````````#<A0$`````
+M``8````!````!`````````#PA0$```````0```"4`0````````````#TA0$`
+M``````4````!`````P````````#XA0$```````8````!````!``````````X
+MA@$```````0```"/`0`````````````\A@$```````4````!`````P``````
+M``!`A@$```````8````!````!`````````!@A@$```````0```"4`0``````
+M``````!DA@$```````4````!`````P````````!HA@$```````8````!````
+M!`````````"TA@$```````0````:``````````````"XA@$```````4````!
+M`````P````````"\A@$```````8````!````!`````````#@A@$```````0`
+M``"4`0````````````#DA@$```````4````!`````P````````#HA@$`````
+M``8````!````!``````````(AP$```````0```"1`0`````````````,AP$`
+M``````4````!`````P`````````,AP$```````@```"1`0`````````````0
+MAP$```````8````!````!``````````HAP$```````0```"1`0``````````
+M```LAP$```````4````!`````P`````````LAP$```````@```"1`0``````
+M```````PAP$```````8````!````!`````````"0B`$```````0```".`0``
+M``````````"4B`$```````4````!`````P````````"8B`$```````8````!
+M````!`````````#HB`$```````0```"4`0````````````#LB`$```````4`
+M```!`````P````````#PB`$```````8````!````!`````````!,B0$`````
+M``0```".`0````````````!0B0$```````4````!`````P````````!4B0$`
+M``````8````!````!`````````",B0$```````0```".`0````````````"0
+MB0$```````4````!`````P````````"4B0$```````8````!````!```````
+M``#(B0$```````0```".`0````````````#,B0$```````4````!`````P``
+M``````#0B0$```````8````!````!``````````,B@$```````0```".`0``
+M```````````0B@$```````4````!`````P`````````4B@$```````8````!
+M````!`````````#$B@$``````!$````%````/`````````#(B@$``````!(`
+M```%````/`````````#,B@$``````!$````%````0@````````#0B@$`````
+M`!(````%````0@````````"(BP$```````0```!\`0````````````",BP$`
+M``````4````!`````P````````"0BP$```````8````!````!`````````!<
+MC`$```````0```"1`0````````````!@C`$```````4````!`````P``````
+M``!@C`$```````@```"1`0````````````!DC`$```````8````!````!```
+M``````!PC`$```````0````Y`0````````````!TC`$```````4````!````
+M`P````````!TC`$```````@````Y`0````````````!XC`$```````8````!
+M````!`````````"LC`$```````0```"1`0````````````"PC`$```````4`
+M```!`````P````````"PC`$```````@```"1`0````````````"TC`$`````
+M``8````!````!`````````#`C`$```````0````Y`0````````````#$C`$`
+M``````4````!`````P````````#$C`$```````@````Y`0````````````#(
+MC`$```````8````!````!`````````#XC`$```````0```".`0``````````
+M``#\C`$```````4````!`````P``````````C0$```````8````!````!```
+M``````!`C0$```````0````S`0````````````!$C0$```````4````!````
+M`P````````!(C0$```````8````!````!`````````"(C0$```````0```#(
+M``````````````",C0$```````4````!`````P````````"0C0$```````8`
+M```!````!`````````"\C0$```````0```"G``````````````#`C0$`````
+M``4````!`````P````````#$C0$```````8````!````!`````````#LC0$`
+M``````0```",`0````````````#PC0$```````4````!`````P````````#T
+MC0$```````8````!````!``````````(C@$```````0```!Q`0``````````
+M```,C@$```````4````!`````P`````````0C@$```````8````!````!```
+M```````LC@$```````0````>`0`````````````PC@$```````4````!````
+M`P`````````PC@$```````@````>`0`````````````TC@$```````8````!
+M````!`````````!4C@$```````0```".`0````````````!8C@$```````4`
+M```!`````P````````!<C@$```````8````!````!``````````HCP$`````
+M``0```""```````````````LCP$```````4````!`````P`````````LCP$`
+M``````@```""```````````````PCP$```````8````!````!`````````!L
+MCP$```````8````!````!`````````"$CP$```````0```!S````````````
+M``"(CP$```````4````!`````P````````"(CP$```````@```!S````````
+M``````",CP$```````8````!````!`````````"DCP$```````8````!````
+M!`````````"PCP$```````0```!&``````````````"TCP$```````4````!
+M`````P````````"XCP$```````8````!````!`````````#,CP$```````0`
+M``"%`0````````````#0CP$```````4````!`````P````````#4CP$`````
+M``8````!````!`````````#DCP$```````0````A`0````````````#HCP$`
+M``````4````!`````P````````#HCP$```````@````A`0````````````#L
+MCP$```````8````!````!`````````#XCP$```````0```"%````````````
+M``#\CP$```````4````!`````P````````#\CP$```````@```"%````````
+M````````D`$```````8````!````!``````````8D`$```````8````!````
+M!`````````!`D`$``````!$````%````4`````````!$D`$``````!(````%
+M````4`````````!(D`$``````!(````%````4`````````!8D`$``````!$`
+M```"````7%(```````!<D`$``````!(````"````7%(```````!@D`$`````
+M`!(````"````7%(```````"<D`$```````0```"4`0````````````"@D`$`
+M``````4````!`````P````````"DD`$```````8````!````!`````````#,
+MD`$```````0```"1`0````````````#0D`$```````4````!`````P``````
+M``#0D`$```````@```"1`0````````````#4D`$```````8````!````!```
+M``````#DD`$```````0```"4`0````````````#HD`$```````4````!````
+M`P````````#LD`$```````8````!````!``````````TD0$```````0```"1
+M`0`````````````XD0$```````4````!`````P`````````XD0$```````@`
+M``"1`0`````````````\D0$```````8````!````!`````````!,D0$`````
+M``0```"4`0````````````!0D0$```````4````!`````P````````!4D0$`
+M``````8````!````!`````````"4D0$```````0```"1`0````````````"8
+MD0$```````4````!`````P````````"8D0$```````@```"1`0``````````
+M``"<D0$```````8````!````!`````````"TD0$```````0````Y`0``````
+M``````"XD0$```````4````!`````P````````"XD0$```````@````Y`0``
+M``````````"\D0$```````8````!````!`````````!PD@$```````8````!
+M````!`````````#4D@$```````8````!````!``````````0F`$```````8`
+M```!````!`````````"\F`$```````8````!````!`````````#0F`$`````
+M``0```"M``````````````#4F`$```````4````!`````P````````#8F`$`
+M``````8````!````!`````````#PF`$```````8````!````!`````````#\
+MF`$```````0```"0`0`````````````$F0$```````0````!````O)@!````
+M```0F0$```````8````!````!`````````!`F0$```````0```"1`0``````
+M``````!$F0$```````4````!`````P````````!$F0$```````@```"1`0``
+M``````````!(F0$```````8````!````!`````````!@F0$```````0```"1
+M`0````````````!DF0$```````4````!`````P````````!DF0$```````@`
+M``"1`0````````````!HF0$```````8````!````!`````````"`F0$`````
+M``0```"1`0````````````"$F0$```````4````!`````P````````"$F0$`
+M``````@```"1`0````````````"(F0$```````8````!````!`````````"@
+MF0$```````0```"1`0````````````"DF0$```````4````!`````P``````
+M``"DF0$```````@```"1`0````````````"HF0$```````8````!````!```
+M``````#(F0$```````0```"M``````````````#,F0$```````4````!````
+M`P````````#0F0$```````8````!````!`````````#PF0$```````0```"1
+M`0````````````#TF0$```````4````!`````P````````#TF0$```````@`
+M``"1`0````````````#XF0$```````8````!````!``````````0F@$`````
+M``0```"1`0`````````````4F@$```````4````!`````P`````````4F@$`
+M``````@```"1`0`````````````8F@$```````8````!````!``````````X
+MF@$```````8````!````!`````````"(F@$```````0````Q````````````
+M``"<F@$```````0````L`0````````````#<F@$```````8````!````!```
+M````````FP$```````0```"1`0`````````````$FP$```````4````!````
+M`P`````````$FP$```````@```"1`0`````````````(FP$```````8````!
+M````!``````````<FP$```````0```"4`0`````````````@FP$```````4`
+M```!`````P`````````DFP$```````8````!````!`````````!4FP$`````
+M``0```"1`0````````````!8FP$```````4````!`````P````````!8FP$`
+M``````@```"1`0````````````!<FP$```````8````!````!`````````!X
+MFP$```````0```"1`0````````````!\FP$```````4````!`````P``````
+M``!\FP$```````@```"1`0````````````"`FP$```````8````!````!```
+M``````"8FP$```````8````!````!`````````#<FP$```````0```"4`0``
+M``````````#@FP$```````4````!`````P````````#DFP$```````8````!
+M````!``````````(G`$```````0```"1`0`````````````,G`$```````4`
+M```!`````P`````````,G`$```````@```"1`0`````````````0G`$`````
+M``8````!````!``````````LG`$```````0```"1`0`````````````PG`$`
+M``````4````!`````P`````````PG`$```````@```"1`0`````````````T
+MG`$```````8````!````!`````````!0G`$```````0```"1`0``````````
+M``!4G`$```````4````!`````P````````!4G`$```````@```"1`0``````
+M``````!8G`$```````8````!````!`````````"`G`$```````0```"4`0``
+M``````````"$G`$```````4````!`````P````````"(G`$```````8````!
+M````!`````````"PG`$```````0```"1`0````````````"TG`$```````4`
+M```!`````P````````"TG`$```````@```"1`0````````````"XG`$`````
+M``8````!````!`````````#0G`$```````0```"1`0````````````#4G`$`
+M``````4````!`````P````````#4G`$```````@```"1`0````````````#8
+MG`$```````8````!````!`````````#LG`$```````0```"4`0``````````
+M``#PG`$```````4````!`````P````````#TG`$```````8````!````!```
+M``````!,G0$```````0```"1`0````````````!0G0$```````4````!````
+M`P````````!0G0$```````@```"1`0````````````!4G0$```````8````!
+M````!`````````"(G0$```````0```"1`0````````````",G0$```````4`
+M```!`````P````````",G0$```````@```"1`0````````````"0G0$`````
+M``8````!````!``````````8G@$```````0```"1`0`````````````<G@$`
+M``````4````!`````P`````````<G@$```````@```"1`0`````````````@
+MG@$```````8````!````!`````````!(G@$```````0```"1`0``````````
+M``!,G@$```````4````!`````P````````!,G@$```````@```"1`0``````
+M``````!0G@$```````8````!````!`````````!TG@$```````0```"1`0``
+M``````````!XG@$```````4````!`````P````````!XG@$```````@```"1
+M`0````````````!\G@$```````8````!````!`````````"DG@$```````8`
+M```!````!`````````#0G@$```````0```"1`0````````````#4G@$`````
+M``4````!`````P````````#4G@$```````@```"1`0````````````#8G@$`
+M``````8````!````!`````````#LG@$```````0```"1`0````````````#P
+MG@$```````4````!`````P````````#PG@$```````@```"1`0``````````
+M``#TG@$```````8````!````!``````````,GP$```````0```!,````````
+M```````0GP$```````4````!`````P`````````4GP$```````8````!````
+M!``````````LGP$```````0```"4`0`````````````PGP$```````4````!
+M`````P`````````TGP$```````8````!````!`````````!LGP$```````8`
+M```!````!`````````"0GP$```````0```"4`0````````````"4GP$`````
+M``4````!`````P````````"8GP$```````8````!````!`````````#`GP$`
+M``````0```"1`0````````````#$GP$```````4````!`````P````````#$
+MGP$```````@```"1`0````````````#(GP$```````8````!````!```````
+M``#HGP$```````8````!````!``````````,H`$```````0```"4`0``````
+M```````0H`$```````4````!`````P`````````4H`$```````8````!````
+M!``````````XH`$```````0```"1`0`````````````\H`$```````4````!
+M`````P`````````\H`$```````@```"1`0````````````!`H`$```````8`
+M```!````!`````````!@H`$```````8````!````!`````````",H`$`````
+M``0```"4`0````````````"0H`$```````4````!`````P````````"4H`$`
+M``````8````!````!`````````#$H`$```````0```"1`0````````````#(
+MH`$```````4````!`````P````````#(H`$```````@```"1`0``````````
+M``#,H`$```````8````!````!`````````#PH`$```````8````!````!```
+M```````8H0$```````0```"4`0`````````````<H0$```````4````!````
+M`P`````````@H0$```````8````!````!`````````!$H0$```````8````!
+M````!`````````!PH0$```````0```"4`0````````````!TH0$```````4`
+M```!`````P````````!XH0$```````8````!````!`````````#8H0$`````
+M``0```"1`0````````````#<H0$```````4````!`````P````````#<H0$`
+M``````@```"1`0````````````#@H0$```````8````!````!`````````#X
+MH0$```````0```#9``````````````#\H0$```````4````!`````P``````
+M````H@$```````8````!````!``````````@H@$```````8````!````!```
+M```````TH@$```````0```"4`0`````````````XH@$```````4````!````
+M`P`````````\H@$```````8````!````!`````````!4H@$```````8````!
+M````!`````````"4H@$```````0```"4`0````````````"8H@$```````4`
+M```!`````P````````"<H@$```````8````!````!`````````"TH@$`````
+M``0```"4`0````````````"XH@$```````4````!`````P````````"\H@$`
+M``````8````!````!``````````,HP$```````0```"4`0`````````````0
+MHP$```````4````!`````P`````````4HP$```````8````!````!```````
+M``"8HP$```````0```"4`0````````````"<HP$```````4````!`````P``
+M``````"@HP$```````8````!````!`````````#8HP$```````0```"4`0``
+M``````````#<HP$```````4````!`````P````````#@HP$```````8````!
+M````!`````````!(I`$```````0```"4`0````````````!,I`$```````4`
+M```!`````P````````!0I`$```````8````!````!`````````!DI`$`````
+M``0```"4`0````````````!HI`$```````4````!`````P````````!LI`$`
+M``````8````!````!`````````"`I`$```````0```"4`0````````````"$
+MI`$```````4````!`````P````````"(I`$```````8````!````!```````
+M``"<I`$```````0```"4`0````````````"@I`$```````4````!`````P``
+M``````"DI`$```````8````!````!`````````"XI`$```````0```"4`0``
+M``````````"\I`$```````4````!`````P````````#`I`$```````8````!
+M````!```````````I0$```````8````!````!`````````!$I0$```````0`
+M``"1`0````````````!(I0$```````4````!`````P````````!(I0$`````
+M``@```"1`0````````````!,I0$```````8````!````!`````````!<I0$`
+M``````0```"4`0````````````!@I0$```````4````!`````P````````!D
+MI0$```````8````!````!``````````TI@$```````0```"1`0``````````
+M```XI@$```````4````!`````P`````````XI@$```````@```"1`0``````
+M```````\I@$```````8````!````!`````````!,I@$```````0```"4`0``
+M``````````!0I@$```````4````!`````P````````!4I@$```````8````!
+M````!`````````!\I@$```````0```"1`0````````````"`I@$```````4`
+M```!`````P````````"`I@$```````@```"1`0````````````"$I@$`````
+M``8````!````!`````````"DI@$```````0```"1`0````````````"HI@$`
+M``````4````!`````P````````"HI@$```````@```"1`0````````````"L
+MI@$```````8````!````!`````````#DI@$```````8````!````!```````
+M```0IP$```````0```"4`0`````````````4IP$```````4````!`````P``
+M```````8IP$```````8````!````!`````````!,IP$```````8````!````
+M!`````````"DIP$```````0```"4`0````````````"HIP$```````4````!
+M`````P````````"LIP$```````8````!````!`````````#4IP$```````0`
+M``"1`0````````````#8IP$```````4````!`````P````````#8IP$`````
+M``@```"1`0````````````#<IP$```````8````!````!`````````#XIP$`
+M``````0```"1`0````````````#\IP$```````4````!`````P````````#\
+MIP$```````@```"1`0``````````````J`$```````8````!````!```````
+M```<J`$```````0```"1`0`````````````@J`$```````4````!`````P``
+M```````@J`$```````@```"1`0`````````````DJ`$```````8````!````
+M!`````````!`J`$```````0```"1`0````````````!$J`$```````4````!
+M`````P````````!$J`$```````@```"1`0````````````!(J`$```````8`
+M```!````!`````````!@J`$```````0```"1`0````````````!DJ`$`````
+M``4````!`````P````````!DJ`$```````@```"1`0````````````!HJ`$`
+M``````8````!````!`````````!\J`$```````0```"1`0````````````"`
+MJ`$```````4````!`````P````````"`J`$```````@```"1`0``````````
+M``"$J`$```````8````!````!`````````"<J`$```````0```"1`0``````
+M``````"@J`$```````4````!`````P````````"@J`$```````@```"1`0``
+M``````````"DJ`$```````8````!````!`````````#`J`$```````0```"1
+M`0````````````#$J`$```````4````!`````P````````#$J`$```````@`
+M``"1`0````````````#(J`$```````8````!````!``````````$J0$`````
+M``0```"1`0`````````````(J0$```````4````!`````P`````````(J0$`
+M``````@```"1`0`````````````,J0$```````8````!````!``````````@
+MJ0$```````0```"1`0`````````````DJ0$```````4````!`````P``````
+M```DJ0$```````@```"1`0`````````````HJ0$```````8````!````!```
+M```````\J0$```````0```"1`0````````````!`J0$```````4````!````
+M`P````````!`J0$```````@```"1`0````````````!$J0$```````8````!
+M````!`````````!<J0$```````0```"1`0````````````!@J0$```````4`
+M```!`````P````````!@J0$```````@```"1`0````````````!DJ0$`````
+M``8````!````!`````````"8J0$```````8````!````!`````````!PJ@$`
+M``````0```"1`0````````````!TJ@$```````4````!`````P````````!T
+MJ@$```````@```"1`0````````````!XJ@$```````8````!````!```````
+M``"<J@$```````0```"1`0````````````"@J@$```````4````!`````P``
+M``````"@J@$```````@```"1`0````````````"DJ@$```````8````!````
+M!`````````#(J@$```````8````!````!`````````!`JP$``````!$````"
+M````<%(```````!$JP$``````!(````"````<%(```````"TK0$```````0`
+M``"1`0````````````"XK0$```````4````!`````P````````"XK0$`````
+M``@```"1`0````````````"\K0$```````8````!````!`````````#8K0$`
+M``````0```"1`0````````````#<K0$```````4````!`````P````````#<
+MK0$```````@```"1`0````````````#@K0$```````8````!````!```````
+M``#XK0$```````0```"1`0````````````#\K0$```````4````!`````P``
+M``````#\K0$```````@```"1`0``````````````K@$```````8````!````
+M!``````````8K@$```````0```"1`0`````````````<K@$```````4````!
+M`````P`````````<K@$```````@```"1`0`````````````@K@$```````8`
+M```!````!``````````XK@$```````0```"1`0`````````````\K@$`````
+M``4````!`````P`````````\K@$```````@```"1`0````````````!`K@$`
+M``````8````!````!`````````!<K@$```````0```"1`0````````````!@
+MK@$```````4````!`````P````````!@K@$```````@```"1`0``````````
+M``!DK@$```````8````!````!`````````#DKP$```````0```"1`0``````
+M``````#HKP$```````4````!`````P````````#HKP$```````@```"1`0``
+M``````````#LKP$```````8````!````!``````````(L`$```````0```"1
+M`0`````````````,L`$```````4````!`````P`````````,L`$```````@`
+M``"1`0`````````````0L`$```````8````!````!``````````HL`$`````
+M``0```"1`0`````````````LL`$```````4````!`````P`````````LL`$`
+M``````@```"1`0`````````````PL`$```````8````!````!`````````!(
+ML`$```````0```"1`0````````````!,L`$```````4````!`````P``````
+M``!,L`$```````@```"1`0````````````!0L`$```````8````!````!```
+M``````!HL`$```````0```"1`0````````````!LL`$```````4````!````
+M`P````````!LL`$```````@```"1`0````````````!PL`$```````8````!
+M````!`````````"(L`$```````0```"1`0````````````",L`$```````4`
+M```!`````P````````",L`$```````@```"1`0````````````"0L`$`````
+M``8````!````!`````````"HL`$```````0```"1`0````````````"LL`$`
+M``````4````!`````P````````"LL`$```````@```"1`0````````````"P
+ML`$```````8````!````!`````````#,L`$```````0```"1`0``````````
+M``#0L`$```````4````!`````P````````#0L`$```````@```"1`0``````
+M``````#4L`$```````8````!````!`````````#PL`$```````0```"1`0``
+M``````````#TL`$```````4````!`````P````````#TL`$```````@```"1
+M`0````````````#XL`$```````8````!````!``````````0L0$```````0`
+M``"1`0`````````````4L0$```````4````!`````P`````````4L0$`````
+M``@```"1`0`````````````8L0$```````8````!````!``````````XL0$`
+M``````0```"1`0`````````````\L0$```````4````!`````P`````````\
+ML0$```````@```"1`0````````````!`L0$```````8````!````!```````
+M``!8L0$```````0```"1`0````````````!<L0$```````4````!`````P``
+M``````!<L0$```````@```"1`0````````````!@L0$```````8````!````
+M!`````````!XL0$```````0```"1`0````````````!\L0$```````4````!
+M`````P````````!\L0$```````@```"1`0````````````"`L0$```````8`
+M```!````!`````````"8L0$```````0```"1`0````````````"<L0$`````
+M``4````!`````P````````"<L0$```````@```"1`0````````````"@L0$`
+M``````8````!````!`````````"XL0$```````0```"1`0````````````"\
+ML0$```````4````!`````P````````"\L0$```````@```"1`0``````````
+M``#`L0$```````8````!````!`````````#<L0$```````0```"1`0``````
+M``````#@L0$```````4````!`````P````````#@L0$```````@```"1`0``
+M``````````#DL0$```````8````!````!``````````HL@$```````8````!
+M````!`````````!(L@$```````0```#J``````````````!,L@$```````4`
+M```!`````P````````!0L@$```````8````!````!`````````!DL@$`````
+M``8````!````!`````````!\L@$```````0```#J``````````````"`L@$`
+M``````4````!`````P````````"$L@$```````8````!````!`````````"<
+ML@$```````8````!````!`````````"\L@$```````0```#J````````````
+M``#`L@$```````4````!`````P````````#$L@$```````8````!````!```
+M``````#8L@$```````8````!````!`````````#XL@$```````0```#J````
+M``````````#\L@$```````4````!`````P``````````LP$```````8````!
+M````!``````````XLP$```````0```"1`0`````````````\LP$```````4`
+M```!`````P`````````\LP$```````@```"1`0````````````!`LP$`````
+M``8````!````!`````````!<LP$```````0```"1`0````````````!@LP$`
+M``````4````!`````P````````!@LP$```````@```"1`0````````````!D
+MLP$```````8````!````!``````````DM`$```````8````!````!```````
+M``!PM`$```````8````!````!`````````"$M`$```````0```"4`0``````
+M``````"(M`$```````4````!`````P````````",M`$```````8````!````
+M!`````````"PM`$```````0```"1`0````````````"TM`$```````4````!
+M`````P````````"TM`$```````@```"1`0````````````"XM`$```````8`
+M```!````!`````````#0M`$```````8````!````!`````````#\M`$`````
+M``8````!````!``````````@M0$```````8````!````!`````````!$M0$`
+M``````0```"4`0````````````!(M0$```````4````!`````P````````!,
+MM0$```````8````!````!`````````!DM0$``````!$````"````B%(`````
+M``!HM0$``````!(````"````B%(```````"(M0$```````0```"1`0``````
+M``````",M0$```````4````!`````P````````",M0$```````@```"1`0``
+M``````````"0M0$```````8````!````!`````````"LM0$```````8````!
+M````!`````````#4M0$```````0```#J``````````````#8M0$```````4`
+M```!`````P````````#<M0$```````8````!````!``````````@M@$`````
+M``0```"1`0`````````````DM@$```````4````!`````P`````````DM@$`
+M``````@```"1`0`````````````HM@$```````8````!````!`````````!@
+MM@$```````0```"1`0````````````!DM@$```````4````!`````P``````
+M``!DM@$```````@```"1`0````````````!HM@$```````8````!````!```
+M``````"$M@$```````8````!````!`````````"LM@$```````0```"4`0``
+M``````````"PM@$```````4````!`````P````````"TM@$```````8````!
+M````!`````````#,M@$```````0```"4`0````````````#0M@$```````4`
+M```!`````P````````#4M@$```````8````!````!`````````#LM@$`````
+M``0```"4`0````````````#PM@$```````4````!`````P````````#TM@$`
+M``````8````!````!``````````\MP$```````8````!````!`````````!4
+MMP$```````0```"4`0````````````!8MP$```````4````!`````P``````
+M``!<MP$```````8````!````!`````````!PMP$```````8````!````!```
+M``````"4MP$```````0```"4`0````````````"8MP$```````4````!````
+M`P````````"<MP$```````8````!````!`````````#`MP$```````0```"1
+M`0````````````#$MP$```````4````!`````P````````#$MP$```````@`
+M``"1`0````````````#(MP$```````8````!````!`````````#@MP$`````
+M``0```"1`0````````````#DMP$```````4````!`````P````````#DMP$`
+M``````@```"1`0````````````#HMP$```````8````!````!``````````$
+MN`$```````8````!````!`````````",N`$```````0```"4`0``````````
+M``"0N`$```````4````!`````P````````"4N`$```````8````!````!```
+M``````#4N`$```````0```"1`0````````````#8N`$```````4````!````
+M`P````````#8N`$```````@```"1`0````````````#<N`$```````8````!
+M````!`````````#XN`$```````8````!````!``````````@N0$```````0`
+M``"4`0`````````````DN0$```````4````!`````P`````````HN0$`````
+M``8````!````!`````````!@N0$```````0```"4`0````````````!DN0$`
+M``````4````!`````P````````!HN0$```````8````!````!`````````"`
+MN0$```````0```"4`0````````````"$N0$```````4````!`````P``````
+M``"(N0$```````8````!````!`````````"TN0$```````8````!````!```
+M``````#0N0$```````0```"4`0````````````#4N0$```````4````!````
+M`P````````#8N0$```````8````!````!``````````DN@$```````8````!
+M````!`````````!,N@$```````0```"4`0````````````!0N@$```````4`
+M```!`````P````````!4N@$```````8````!````!`````````!TN@$`````
+M``0```"4`0````````````!XN@$```````4````!`````P````````!\N@$`
+M``````8````!````!`````````"<N@$```````0```"4`0````````````"@
+MN@$```````4````!`````P````````"DN@$```````8````!````!```````
+M``#$N@$```````0```"4`0````````````#(N@$```````4````!`````P``
+M``````#,N@$```````8````!````!`````````#LN@$```````0```"4`0``
+M``````````#PN@$```````4````!`````P````````#TN@$```````8````!
+M````!``````````DNP$```````8````!````!``````````\NP$```````0`
+M``"4`0````````````!`NP$```````4````!`````P````````!$NP$`````
+M``8````!````!`````````!<NP$```````8````!````!`````````!TNP$`
+M``````0```"4`0````````````!XNP$```````4````!`````P````````!\
+MNP$```````8````!````!`````````"4NP$```````8````!````!```````
+M``"PNP$```````0```"1`0````````````"TNP$```````4````!`````P``
+M``````"TNP$```````@```"1`0````````````"XNP$```````8````!````
+M!`````````#4NP$```````8````!````!`````````#XNP$```````0````.
+M``````````````#\NP$```````4````!`````P``````````O`$```````8`
+M```!````!``````````<O`$```````8````!````!`````````!<O`$`````
+M``0````E``````````````!@O`$```````4````!`````P````````!DO`$`
+M``````8````!````!`````````"0O`$```````0```!?`0````````````"4
+MO`$```````4````!`````P````````"8O`$```````8````!````!```````
+M``"LO`$```````0```"1`0````````````"PO`$```````4````!`````P``
+M``````"PO`$```````@```"1`0````````````"TO`$```````8````!````
+M!`````````#@O`$```````8````!````!`````````#\O`$```````0```"4
+M`0``````````````O0$```````4````!`````P`````````$O0$```````8`
+M```!````!``````````8O0$```````0````E```````````````<O0$`````
+M``4````!`````P`````````@O0$```````8````!````!``````````XO0$`
+M``````8````!````!`````````!DO0$```````0````E``````````````!H
+MO0$```````4````!`````P````````!LO0$```````8````!````!```````
+M``"@O0$```````0```"4`0````````````"DO0$```````4````!`````P``
+M``````"HO0$```````8````!````!`````````#`O0$```````0```!?`0``
+M``````````#$O0$```````4````!`````P````````#(O0$```````8````!
+M````!`````````#LO0$```````0```"1`0````````````#PO0$```````4`
+M```!`````P````````#PO0$```````@```"1`0````````````#TO0$`````
+M``8````!````!``````````@O@$```````8````!````!`````````!`O@$`
+M``````0```"4`0````````````!$O@$```````4````!`````P````````!(
+MO@$```````8````!````!`````````!@O@$```````0````E````````````
+M``!DO@$```````4````!`````P````````!HO@$```````8````!````!```
+M``````"4O@$```````8````!````!`````````#$O@$```````0```"4`0``
+M``````````#(O@$```````4````!`````P````````#,O@$```````8````!
+M````!`````````#TO@$```````0```"1`0````````````#XO@$```````4`
+M```!`````P````````#XO@$```````@```"1`0````````````#\O@$`````
+M``8````!````!``````````8OP$```````0```"4`0`````````````<OP$`
+M``````4````!`````P`````````@OP$```````8````!````!`````````!$
+MOP$```````0```"1`0````````````!(OP$```````4````!`````P``````
+M``!(OP$```````@```"1`0````````````!,OP$```````8````!````!```
+M``````!\OP$```````8````!````!`````````"HOP$```````0````E````
+M``````````"LOP$```````4````!`````P````````"POP$```````8````!
+M````!`````````#DOP$```````0```"4`0````````````#HOP$```````4`
+M```!`````P````````#LOP$```````8````!````!``````````(P`$`````
+M``0```!?`0`````````````,P`$```````4````!`````P`````````0P`$`
+M``````8````!````!``````````XP`$```````0```"1`0`````````````\
+MP`$```````4````!`````P`````````\P`$```````@```"1`0``````````
+M``!`P`$```````8````!````!`````````!LP`$```````8````!````!```
+M``````",P`$```````0```"4`0````````````"0P`$```````4````!````
+M`P````````"4P`$```````8````!````!`````````"LP`$```````0````E
+M``````````````"PP`$```````4````!`````P````````"TP`$```````8`
+M```!````!`````````#,P`$```````8````!````!``````````,P0$`````
+M``0```"1`0`````````````0P0$```````4````!`````P`````````0P0$`
+M``````@```"1`0`````````````4P0$```````8````!````!``````````H
+MP0$```````0```"1`0`````````````LP0$```````4````!`````P``````
+M```LP0$```````@```"1`0`````````````PP0$```````8````!````!```
+M``````!XP0$```````8````!````!`````````#<P0$```````0```!?`0``
+M``````````#@P0$```````4````!`````P````````#DP0$```````8````!
+M````!`````````"<P@$```````0```"1`0````````````"@P@$```````4`
+M```!`````P````````"@P@$```````@```"1`0````````````"DP@$`````
+M``8````!````!`````````"XP@$```````0```"1`0````````````"\P@$`
+M``````4````!`````P````````"\P@$```````@```"1`0````````````#`
+MP@$```````8````!````!`````````#<P@$```````0```"1`0``````````
+M``#@P@$```````4````!`````P````````#@P@$```````@```"1`0``````
+M``````#DP@$```````8````!````!``````````$PP$```````8````!````
+M!``````````8PP$```````0````D```````````````<PP$```````4````!
+M`````P`````````<PP$```````@````D```````````````@PP$```````8`
+M```!````!`````````!@PP$```````8````!````!`````````"0PP$`````
+M``0```"1`0````````````"4PP$```````4````!`````P````````"4PP$`
+M``````@```"1`0````````````"8PP$```````8````!````!`````````#$
+MPP$```````0```"1`0````````````#(PP$```````4````!`````P``````
+M``#(PP$```````@```"1`0````````````#,PP$```````8````!````!```
+M``````#@PP$```````0```"4`0````````````#DPP$```````4````!````
+M`P````````#HPP$```````8````!````!``````````0Q`$```````0```"1
+M`0`````````````4Q`$```````4````!`````P`````````4Q`$```````@`
+M``"1`0`````````````8Q`$```````8````!````!``````````PQ`$`````
+M``0```"1`0`````````````TQ`$```````4````!`````P`````````TQ`$`
+M``````@```"1`0`````````````XQ`$```````8````!````!`````````!(
+MQ`$```````0```"4`0````````````!,Q`$```````4````!`````P``````
+M``!0Q`$```````8````!````!`````````!LQ`$```````0```"1`0``````
+M``````!PQ`$```````4````!`````P````````!PQ`$```````@```"1`0``
+M``````````!TQ`$```````8````!````!`````````#0Q`$```````0```"1
+M`0````````````#4Q`$```````4````!`````P````````#4Q`$```````@`
+M``"1`0````````````#8Q`$```````8````!````!`````````#PQ`$`````
+M``0```"1`0````````````#TQ`$```````4````!`````P````````#TQ`$`
+M``````@```"1`0````````````#XQ`$```````8````!````!``````````0
+MQ0$```````0```"1`0`````````````4Q0$```````4````!`````P``````
+M```4Q0$```````@```"1`0`````````````8Q0$```````8````!````!```
+M```````PQ0$```````0```"1`0`````````````TQ0$```````4````!````
+M`P`````````TQ0$```````@```"1`0`````````````XQ0$```````8````!
+M````!`````````!(Q0$```````0```"4`0````````````!,Q0$```````4`
+M```!`````P````````!0Q0$```````8````!````!`````````!\Q0$`````
+M``0```"1`0````````````"`Q0$```````4````!`````P````````"`Q0$`
+M``````@```"1`0````````````"$Q0$```````8````!````!`````````"<
+MQ0$```````0```"1`0````````````"@Q0$```````4````!`````P``````
+M``"@Q0$```````@```"1`0````````````"DQ0$```````8````!````!```
+M``````"\Q0$```````0```"1`0````````````#`Q0$```````4````!````
+M`P````````#`Q0$```````@```"1`0````````````#$Q0$```````8````!
+M````!`````````#<Q0$```````0```"1`0````````````#@Q0$```````4`
+M```!`````P````````#@Q0$```````@```"1`0````````````#DQ0$`````
+M``8````!````!`````````#TQ0$```````0```"4`0````````````#XQ0$`
+M``````4````!`````P````````#\Q0$```````8````!````!``````````T
+MQ@$```````0```"4`0`````````````XQ@$```````4````!`````P``````
+M```\Q@$```````8````!````!`````````!@Q@$```````0```"1`0``````
+M``````!DQ@$```````4````!`````P````````!DQ@$```````@```"1`0``
+M``````````!HQ@$```````8````!````!`````````!XQ@$```````0```"4
+M`0````````````!\Q@$```````4````!`````P````````"`Q@$```````8`
+M```!````!`````````"<Q@$```````0```"1`0````````````"@Q@$`````
+M``4````!`````P````````"@Q@$```````@```"1`0````````````"DQ@$`
+M``````8````!````!`````````"\Q@$```````0```"1`0````````````#`
+MQ@$```````4````!`````P````````#`Q@$```````@```"1`0``````````
+M``#$Q@$```````8````!````!`````````#<Q@$```````0```"1`0``````
+M``````#@Q@$```````4````!`````P````````#@Q@$```````@```"1`0``
+M``````````#DQ@$```````8````!````!`````````#\Q@$```````0```"1
+M`0``````````````QP$```````4````!`````P``````````QP$```````@`
+M``"1`0`````````````$QP$```````8````!````!``````````<QP$`````
+M``0```"1`0`````````````@QP$```````4````!`````P`````````@QP$`
+M``````@```"1`0`````````````DQP$```````8````!````!``````````\
+MQP$```````0```"1`0````````````!`QP$```````4````!`````P``````
+M``!`QP$```````@```"1`0````````````!$QP$```````8````!````!```
+M``````!PQP$```````0```"1`0````````````!TQP$```````4````!````
+M`P````````!TQP$```````@```"1`0````````````!XQP$```````8````!
+M````!`````````",QP$```````0```"4`0````````````"0QP$```````4`
+M```!`````P````````"4QP$```````8````!````!`````````#<QP$`````
+M``0```"1`0````````````#@QP$```````4````!`````P````````#@QP$`
+M``````@```"1`0````````````#DQP$```````8````!````!`````````#\
+MQP$```````8````!````!``````````DR`$```````0```"4`0``````````
+M```HR`$```````4````!`````P`````````LR`$```````8````!````!```
+M``````!0R`$```````0```"1`0````````````!4R`$```````4````!````
+M`P````````!4R`$```````@```"1`0````````````!8R`$```````8````!
+M````!`````````!HR`$```````0```"4`0````````````!LR`$```````4`
+M```!`````P````````!PR`$```````8````!````!`````````",R`$`````
+M``0```"1`0````````````"0R`$```````4````!`````P````````"0R`$`
+M``````@```"1`0````````````"4R`$```````8````!````!`````````"L
+MR`$```````0```"1`0````````````"PR`$```````4````!`````P``````
+M``"PR`$```````@```"1`0````````````"TR`$```````8````!````!```
+M``````#(R`$```````0```"4`0````````````#,R`$```````4````!````
+M`P````````#0R`$```````8````!````!``````````8R0$```````0```"1
+M`0`````````````<R0$```````4````!`````P`````````<R0$```````@`
+M``"1`0`````````````@R0$```````8````!````!``````````XR0$`````
+M``0```"1`0`````````````\R0$```````4````!`````P`````````\R0$`
+M``````@```"1`0````````````!`R0$```````8````!````!`````````!8
+MR0$```````0```"1`0````````````!<R0$```````4````!`````P``````
+M``!<R0$```````@```"1`0````````````!@R0$```````8````!````!```
+M``````!XR0$```````0```"1`0````````````!\R0$```````4````!````
+M`P````````!\R0$```````@```"1`0````````````"`R0$```````8````!
+M````!`````````"8R0$```````0```"1`0````````````"<R0$```````4`
+M```!`````P````````"<R0$```````@```"1`0````````````"@R0$`````
+M``8````!````!`````````"XR0$```````0```"1`0````````````"\R0$`
+M``````4````!`````P````````"\R0$```````@```"1`0````````````#`
+MR0$```````8````!````!`````````#LR0$```````0```"1`0``````````
+M``#PR0$```````4````!`````P````````#PR0$```````@```"1`0``````
+M``````#TR0$```````8````!````!``````````,R@$```````8````!````
+M!``````````8R@$``````!$````"````J%(````````<R@$``````!(````"
+M````J%(```````!<R@$``````!$````"````J%(```````!@R@$``````!(`
+M```"````J%(```````!\R@$```````8````!````!`````````"PR@$`````
+M`!$````"````U%(```````"TR@$``````!(````"````U%(```````"TRP$`
+M``````0```"4`0````````````"XRP$```````4````!`````P````````"\
+MRP$```````8````!````!`````````#@S`$```````0```")````````````
+M``#DS`$```````4````!`````P````````#HS`$```````8````!````!```
+M```````(S0$``````!$````"````3%,````````,S0$``````!(````"````
+M3%,```````!HS0$```````0````:`0````````````!LS0$```````4````!
+M`````P````````!PS0$```````8````!````!`````````",S0$```````8`
+M```!````!`````````#`S0$``````!$````"````A%,```````#$S0$`````
+M`!(````"````A%,````````\S@$```````0```"1`0````````````!`S@$`
+M``````4````!`````P````````!`S@$```````@```"1`0````````````!$
+MS@$```````8````!````!`````````!8S@$```````0```"4`0``````````
+M``!<S@$```````4````!`````P````````!@S@$```````8````!````!```
+M``````!0SP$``````!$````"````:%,```````!4SP$``````!(````"````
+M:%,```````!DSP$```````0```"@``````````````!HSP$```````4````!
+M`````P````````!LSP$```````8````!````!`````````"PSP$```````0`
+M```;``````````````"TSP$```````4````!`````P````````"XSP$`````
+M``8````!````!`````````#4SP$```````8````!````!`````````#DSP$`
+M``````0````[`0````````````#HSP$```````4````!`````P````````#L
+MSP$```````8````!````!``````````$T`$```````8````!````!```````
+M```PT`$```````0```"4`0`````````````TT`$```````4````!`````P``
+M```````XT`$```````8````!````!`````````!<T`$```````0```"1`0``
+M``````````!@T`$```````4````!`````P````````!@T`$```````@```"1
+M`0````````````!DT`$```````8````!````!`````````!PT`$```````0`
+M```Y`0````````````!TT`$```````4````!`````P````````!TT`$`````
+M``@````Y`0````````````!XT`$```````8````!````!`````````"8T`$`
+M``````0```"4`0````````````"<T`$```````4````!`````P````````"@
+MT`$```````8````!````!`````````"XT`$```````0````Y`0``````````
+M``"\T`$```````4````!`````P````````"\T`$```````@````Y`0``````
+M``````#`T`$```````8````!````!`````````#0T`$```````0```"4`0``
+M``````````#4T`$```````4````!`````P````````#8T`$```````8````!
+M````!`````````#TT`$```````0```"1`0````````````#XT`$```````4`
+M```!`````P````````#XT`$```````@```"1`0````````````#\T`$`````
+M``8````!````!``````````HT0$```````0```"4`0`````````````LT0$`
+M``````4````!`````P`````````PT0$```````8````!````!`````````!8
+MT0$```````0```"1`0````````````!<T0$```````4````!`````P``````
+M``!<T0$```````@```"1`0````````````!@T0$```````8````!````!```
+M``````"(T0$```````8````!````!`````````"PT0$```````0```"4`0``
+M``````````"TT0$```````4````!`````P````````"XT0$```````8````!
+M````!`````````#<T0$```````0```"1`0````````````#@T0$```````4`
+M```!`````P````````#@T0$```````@```"1`0````````````#DT0$`````
+M``8````!````!`````````#XT0$```````0```"4`0````````````#\T0$`
+M``````4````!`````P``````````T@$```````8````!````!``````````L
+MT@$```````0```"1`0`````````````PT@$```````4````!`````P``````
+M```PT@$```````@```"1`0`````````````TT@$```````8````!````!```
+M``````!0T@$```````8````!````!`````````!XT@$```````0```"4`0``
+M``````````!\T@$```````4````!`````P````````"`T@$```````8````!
+M````!`````````"DT@$```````0```"1`0````````````"HT@$```````4`
+M```!`````P````````"HT@$```````@```"1`0````````````"LT@$`````
+M``8````!````!`````````#`T@$```````0```"4`0````````````#$T@$`
+M``````4````!`````P````````#(T@$```````8````!````!`````````#T
+MT@$```````0```"1`0````````````#XT@$```````4````!`````P``````
+M``#XT@$```````@```"1`0````````````#\T@$```````8````!````!```
+M```````8TP$```````8````!````!`````````"DTP$```````8````!````
+M!`````````"XTP$```````0```"4`0````````````"\TP$```````4````!
+M`````P````````#`TP$```````8````!````!`````````#<TP$```````8`
+M```!````!``````````PU`$``````!$```!<`0`````````````TU`$`````
+M`!(```!<`0````````````!8U`$``````!$```#:``````````````!<U`$`
+M`````!(```#:``````````````!HU`$``````!$```#E``````````````!L
+MU`$``````!(```#E``````````````!XU`$``````!$````L````````````
+M``!\U`$``````!(````L``````````````"<U`$``````!$```#:````````
+M``````"@U`$``````!(```#:``````````````#`U`$``````!$```#E````
+M``````````#$U`$``````!(```#E``````````````#,U`$``````!$```"K
+M``````````````#0U`$``````!(```"K``````````````#8U`$``````!$`
+M``!/`0````````````#<U`$``````!(```!/`0````````````#DU`$`````
+M`!$```#3``````````````#HU`$``````!(```#3``````````````#PU`$`
+M`````!$````5``````````````#TU`$``````!(````5```````````````(
+MU0$```````0````M`0`````````````,U0$```````4````!`````P``````
+M```,U0$```````@````M`0`````````````0U0$```````8````!````!```
+M```````LU0$```````8````!````!`````````!`U0$```````0```"4`0``
+M``````````!$U0$```````4````!`````P````````!(U0$```````8````!
+M````!`````````!<U0$```````8````!````!`````````!TU0$```````0`
+M``"1`0````````````!XU0$```````4````!`````P````````!XU0$`````
+M``@```"1`0````````````!\U0$```````8````!````!`````````"0U0$`
+M``````8````!````!`````````"HU0$```````0```"1`0````````````"L
+MU0$```````4````!`````P````````"LU0$```````@```"1`0``````````
+M``"PU0$```````8````!````!`````````#$U0$```````8````!````!```
+M``````#DU0$```````0```"1`0````````````#HU0$```````4````!````
+M`P````````#HU0$```````@```"1`0````````````#LU0$```````8````!
+M````!``````````$U@$```````0```!,```````````````(U@$```````4`
+M```!`````P`````````,U@$```````8````!````!``````````HU@$`````
+M``8````!````!`````````!(U@$```````0```"4`0````````````!,U@$`
+M``````4````!`````P````````!0U@$```````8````!````!`````````!P
+MU@$```````0```"1`0````````````!TU@$```````4````!`````P``````
+M``!TU@$```````@```"1`0````````````!XU@$```````8````!````!```
+M``````"$U@$```````0````P``````````````"(U@$```````4````!````
+M`P````````"(U@$```````@````P``````````````",U@$```````8````!
+M````!`````````"<U@$```````0```#>``````````````"@U@$```````4`
+M```!`````P````````"@U@$```````@```#>``````````````"DU@$`````
+M``8````!````!`````````"\U@$```````8````!````!`````````#<U@$`
+M``````0```"4`0````````````#@U@$```````4````!`````P````````#D
+MU@$```````8````!````!``````````$UP$```````0```"1`0``````````
+M```(UP$```````4````!`````P`````````(UP$```````@```"1`0``````
+M```````,UP$```````8````!````!``````````8UP$```````0```"$````
+M```````````<UP$```````4````!`````P`````````<UP$```````@```"$
+M```````````````@UP$```````8````!````!``````````XUP$```````8`
+M```!````!`````````!HUP$```````0```"1`0````````````!LUP$`````
+M``4````!`````P````````!LUP$```````@```"1`0````````````!PUP$`
+M``````8````!````!`````````"(UP$```````0```"1`0````````````",
+MUP$```````4````!`````P````````",UP$```````@```"1`0``````````
+M``"0UP$```````8````!````!`````````"LUP$```````8````!````!```
+M``````#HUP$```````0```"4`0````````````#LUP$```````4````!````
+M`P````````#PUP$```````8````!````!``````````HV`$```````0```"4
+M`0`````````````LV`$```````4````!`````P`````````PV`$```````8`
+M```!````!`````````!8V`$```````0```"1`0````````````!<V`$`````
+M``4````!`````P````````!<V`$```````@```"1`0````````````!@V`$`
+M``````8````!````!`````````"`V`$```````8````!````!`````````"\
+MV`$```````0```"4`0````````````#`V`$```````4````!`````P``````
+M``#$V`$```````8````!````!`````````#XV`$```````0```"4`0``````
+M``````#\V`$```````4````!`````P``````````V0$```````8````!````
+M!``````````HV0$```````0```"1`0`````````````LV0$```````4````!
+M`````P`````````LV0$```````@```"1`0`````````````PV0$```````8`
+M```!````!`````````!0V0$```````8````!````!`````````!TV0$`````
+M``0```"4`0````````````!XV0$```````4````!`````P````````!\V0$`
+M``````8````!````!`````````"4V0$```````0```"4`0````````````"8
+MV0$```````4````!`````P````````"<V0$```````8````!````!```````
+M``#DV0$```````8````!````!``````````4V@$```````0```"1`0``````
+M```````8V@$```````4````!`````P`````````8V@$```````@```"1`0``
+M```````````<V@$```````8````!````!`````````!,V@$```````0```"1
+M`0````````````!0V@$```````4````!`````P````````!0V@$```````@`
+M``"1`0````````````!4V@$```````8````!````!`````````!HV@$`````
+M``0```"4`0````````````!LV@$```````4````!`````P````````!PV@$`
+M``````8````!````!`````````"(V@$```````0```"4`0````````````",
+MV@$```````4````!`````P````````"0V@$```````8````!````!```````
+M``"LV@$```````0```"1`0````````````"PV@$```````4````!`````P``
+M``````"PV@$```````@```"1`0````````````"TV@$```````8````!````
+M!`````````#$VP$```````8````!````!``````````TW`$```````0```"4
+M`0`````````````XW`$```````4````!`````P`````````\W`$```````8`
+M```!````!``````````$WP$```````0```"1```````````````(WP$`````
+M``4````!`````P`````````(WP$```````@```"1```````````````,WP$`
+M``````8````!````!`````````"PWP$```````8````!````!`````````!T
+MX`$```````0```"%`0````````````!XX`$```````4````!`````P``````
+M``!\X`$```````8````!````!`````````"4X`$```````0````!`0``````
+M``````"8X`$```````4````!`````P````````"<X`$```````8````!````
+M!`````````#LX`$```````0```"4`0````````````#PX`$```````4````!
+M`````P````````#TX`$```````8````!````!``````````,X0$```````0`
+M``#,```````````````0X0$```````4````!`````P`````````4X0$`````
+M``8````!````!``````````DX0$```````0```#>```````````````HX0$`
+M``````4````!`````P`````````HX0$```````@```#>```````````````L
+MX0$```````8````!````!`````````#4X0$```````0````,````````````
+M``#8X0$```````4````!`````P````````#<X0$```````8````!````!```
+M``````#XX0$```````0```"4`0````````````#\X0$```````4````!````
+M`P``````````X@$```````8````!````!``````````DX@$```````0```"4
+M`0`````````````HX@$```````4````!`````P`````````LX@$```````8`
+M```!````!`````````!(X@$```````0```"4`0````````````!,X@$`````
+M``4````!`````P````````!0X@$```````8````!````!`````````!TX@$`
+M``````0```"4`0````````````!XX@$```````4````!`````P````````!\
+MX@$```````8````!````!`````````"4X@$```````0```"4`0``````````
+M``"8X@$```````4````!`````P````````"<X@$```````8````!````!```
+M``````"TX@$```````0```!?``````````````"XX@$```````4````!````
+M`P````````"XX@$```````@```!?``````````````"\X@$```````8````!
+M````!`````````#(X@$```````0```!.``````````````#,X@$```````4`
+M```!`````P````````#0X@$```````8````!````!`````````#@X@$`````
+M``0```"/`0````````````#DX@$```````4````!`````P````````#HX@$`
+M``````8````!````!`````````#,XP$```````0```"1`0````````````#0
+MXP$```````4````!`````P````````#0XP$```````@```"1`0``````````
+M``#4XP$```````8````!````!`````````#@XP$``````!$````"````_%,`
+M``````#DXP$``````!(````"````_%,````````0Y`$```````0```"1`0``
+M```````````4Y`$```````4````!`````P`````````4Y`$```````@```"1
+M`0`````````````8Y`$```````8````!````!``````````TY`$```````0`
+M```Y`0`````````````XY`$```````4````!`````P`````````XY`$`````
+M``@````Y`0`````````````\Y`$```````8````!````!`````````!LY`$`
+M`````!$````"````5%8```````!PY`$``````!(````"````5%8```````"H
+MY`$``````!$````"````5%8```````"LY`$``````!(````"````5%8`````
+M``"\Y`$```````0```"1`0````````````#`Y`$```````4````!`````P``
+M``````#`Y`$```````@```"1`0````````````#$Y`$```````8````!````
+M!`````````#@Y`$```````0````Y`0````````````#DY`$```````4````!
+M`````P````````#DY`$```````@````Y`0````````````#HY`$```````8`
+M```!````!``````````8Y0$```````8````!````!`````````!0Y0$`````
+M``0````5`0````````````!4Y0$```````4````!`````P````````!4Y0$`
+M``````@````5`0````````````!8Y0$```````8````!````!`````````"$
+MY0$```````0```"1`0````````````"(Y0$```````4````!`````P``````
+M``"(Y0$```````@```"1`0````````````",Y0$```````8````!````!```
+M``````"4Y@$```````0```"1`0````````````"8Y@$```````4````!````
+M`P````````"8Y@$```````@```"1`0````````````"<Y@$```````8````!
+M````!`````````"PY@$```````0```"4`0````````````"TY@$```````4`
+M```!`````P````````"XY@$```````8````!````!`````````#<Y@$`````
+M``0```"1`0````````````#@Y@$```````4````!`````P````````#@Y@$`
+M``````@```"1`0````````````#DY@$```````8````!````!`````````#X
+MY@$```````0```"4`0````````````#\Y@$```````4````!`````P``````
+M````YP$```````8````!````!``````````PYP$```````0```"1`0``````
+M```````TYP$```````4````!`````P`````````TYP$```````@```"1`0``
+M```````````XYP$```````8````!````!`````````!0YP$```````0```"1
+M`0````````````!4YP$```````4````!`````P````````!4YP$```````@`
+M``"1`0````````````!8YP$```````8````!````!`````````"`YP$`````
+M``0```"1`0````````````"$YP$```````4````!`````P````````"$YP$`
+M``````@```"1`0````````````"(YP$```````8````!````!`````````"@
+MYP$```````0```"1`0````````````"DYP$```````4````!`````P``````
+M``"DYP$```````@```"1`0````````````"HYP$```````8````!````!```
+M```````(Z`$```````0```"4`0`````````````,Z`$```````4````!````
+M`P`````````0Z`$```````8````!````!``````````TZ`$```````0```"1
+M`0`````````````XZ`$```````4````!`````P`````````XZ`$```````@`
+M``"1`0`````````````\Z`$```````8````!````!`````````!0Z`$`````
+M``0```!;``````````````!4Z`$```````4````!`````P````````!8Z`$`
+M``````8````!````!`````````"`Z`$```````0```!$`0````````````"$
+MZ`$```````4````!`````P````````"$Z`$```````@```!$`0``````````
+M``"(Z`$```````8````!````!`````````"LZ`$```````8````!````!```
+M```````TZ0$```````0```"7```````````````XZ0$```````4````!````
+M`P`````````XZ0$```````@```"7```````````````\Z0$```````8````!
+M````!`````````!,Z0$```````0````)`0````````````!0Z0$```````4`
+M```!`````P````````!0Z0$```````@````)`0````````````!4Z0$`````
+M``8````!````!`````````!DZ0$```````0```!'`0````````````!HZ0$`
+M``````4````!`````P````````!LZ0$```````8````!````!`````````"0
+MZ0$```````0```"1`0````````````"4Z0$```````4````!`````P``````
+M``"4Z0$```````@```"1`0````````````"8Z0$```````8````!````!```
+M``````#4Z0$```````0```"1`0````````````#8Z0$```````4````!````
+M`P````````#8Z0$```````@```"1`0````````````#<Z0$```````8````!
+M````!``````````DZ@$```````0```"1`0`````````````HZ@$```````4`
+M```!`````P`````````HZ@$```````@```"1`0`````````````LZ@$`````
+M``8````!````!`````````!`Z@$```````0````D``````````````!$Z@$`
+M``````4````!`````P````````!$Z@$```````@````D``````````````!(
+MZ@$```````8````!````!`````````"$Z@$```````0```"1`0``````````
+M``"(Z@$```````4````!`````P````````"(Z@$```````@```"1`0``````
+M``````",Z@$```````8````!````!`````````"LZ@$```````0```"1`0``
+M``````````"PZ@$```````4````!`````P````````"PZ@$```````@```"1
+M`0````````````"TZ@$```````8````!````!`````````#$Z@$```````0`
+M``"4`0````````````#(Z@$```````4````!`````P````````#,Z@$`````
+M``8````!````!`````````#LZ@$```````0```"1`0````````````#PZ@$`
+M``````4````!`````P````````#PZ@$```````@```"1`0````````````#T
+MZ@$```````8````!````!``````````(ZP$```````0```"1`0``````````
+M```,ZP$```````4````!`````P`````````,ZP$```````@```"1`0``````
+M```````0ZP$```````8````!````!``````````DZP$```````0```"1`0``
+M```````````HZP$```````4````!`````P`````````HZP$```````@```"1
+M`0`````````````LZP$```````8````!````!`````````!$ZP$```````0`
+M``"1`0````````````!(ZP$```````4````!`````P````````!(ZP$`````
+M``@```"1`0````````````!,ZP$```````8````!````!`````````"4ZP$`
+M``````0```"1`0````````````"8ZP$```````4````!`````P````````"8
+MZP$```````@```"1`0````````````"<ZP$```````8````!````!```````
+M``#(ZP$```````0```"1`0````````````#,ZP$```````4````!`````P``
+M``````#,ZP$```````@```"1`0````````````#0ZP$```````8````!````
+M!`````````#LZP$```````0```"1`0````````````#PZP$```````4````!
+M`````P````````#PZP$```````@```"1`0````````````#TZP$```````8`
+M```!````!``````````([`$```````0```"1`0`````````````,[`$`````
+M``4````!`````P`````````,[`$```````@```"1`0`````````````0[`$`
+M``````8````!````!``````````@[`$```````0```"Q```````````````D
+M[`$```````4````!`````P`````````H[`$```````8````!````!```````
+M``!([`$```````0````S``````````````!,[`$```````4````!`````P``
+M``````!,[`$```````@````S``````````````!0[`$```````8````!````
+M!`````````!@[`$```````0```!>``````````````!D[`$```````4````!
+M`````P````````!D[`$```````@```!>``````````````!H[`$```````8`
+M```!````!`````````#<[`$```````0```"4`0````````````#@[`$`````
+M``4````!`````P````````#D[`$```````8````!````!``````````([0$`
+M``````0```"1`0`````````````,[0$```````4````!`````P`````````,
+M[0$```````@```"1`0`````````````0[0$```````8````!````!```````
+M```D[0$```````0```"4`0`````````````H[0$```````4````!`````P``
+M```````L[0$```````8````!````!`````````"\[0$```````0```"1`0``
+M``````````#`[0$```````4````!`````P````````#`[0$```````@```"1
+M`0````````````#$[0$```````8````!````!``````````0[@$```````0`
+M```Y`0`````````````4[@$```````4````!`````P`````````4[@$`````
+M``@````Y`0`````````````8[@$```````8````!````!``````````L[@$`
+M``````0```"4`0`````````````P[@$```````4````!`````P`````````T
+M[@$```````8````!````!`````````!0[@$```````0```"1`0``````````
+M``!4[@$```````4````!`````P````````!4[@$```````@```"1`0``````
+M``````!8[@$```````8````!````!`````````!T[@$```````0````Y`0``
+M``````````!X[@$```````4````!`````P````````!X[@$```````@````Y
+M`0````````````!\[@$```````8````!````!`````````"<[@$```````0`
+M``"4`0````````````"@[@$```````4````!`````P````````"D[@$`````
+M``8````!````!`````````#$[@$```````0```"1`0````````````#([@$`
+M``````4````!`````P````````#([@$```````@```"1`0````````````#,
+M[@$```````8````!````!`````````#@[@$```````0```"4`0``````````
+M``#D[@$```````4````!`````P````````#H[@$```````8````!````!```
+M```````([P$```````0```"1`0`````````````,[P$```````4````!````
+M`P`````````,[P$```````@```"1`0`````````````0[P$```````8````!
+M````!`````````!,[P$```````0```"4`0````````````!0[P$```````4`
+M```!`````P````````!4[P$```````8````!````!`````````"([P$`````
+M``0```"1`0````````````",[P$```````4````!`````P````````",[P$`
+M``````@```"1`0````````````"0[P$```````8````!````!`````````"D
+M[P$```````0```"4`0````````````"H[P$```````4````!`````P``````
+M``"L[P$```````8````!````!`````````#,[P$```````0```"1`0``````
+M``````#0[P$```````4````!`````P````````#0[P$```````@```"1`0``
+M``````````#4[P$```````8````!````!`````````#X[P$```````0```!0
+M``````````````#\[P$```````4````!`````P````````#\[P$```````@`
+M``!0````````````````\`$```````8````!````!``````````H\`$`````
+M``0```"1`0`````````````L\`$```````4````!`````P`````````L\`$`
+M``````@```"1`0`````````````P\`$```````8````!````!`````````!D
+M\`$```````0```",``````````````!H\`$```````4````!`````P``````
+M``!L\`$```````8````!````!`````````#`\`$```````0```"1`0``````
+M``````#$\`$```````4````!`````P````````#$\`$```````@```"1`0``
+M``````````#(\`$```````8````!````!`````````#8\`$```````0```"4
+M`0````````````#<\`$```````4````!`````P````````#@\`$```````8`
+M```!````!```````````\0$```````0```"1`0`````````````$\0$`````
+M``4````!`````P`````````$\0$```````@```"1`0`````````````(\0$`
+M``````8````!````!``````````<\0$```````0```"Y```````````````@
+M\0$```````4````!`````P`````````@\0$```````@```"Y````````````
+M```D\0$```````8````!````!`````````!`\0$```````0```!,````````
+M``````!$\0$```````4````!`````P````````!(\0$```````8````!````
+M!`````````!8\0$```````0```";``````````````!<\0$```````4````!
+M`````P````````!<\0$```````@```";``````````````!@\0$```````8`
+M```!````!`````````!T\0$```````0```"4`0````````````!X\0$`````
+M``4````!`````P````````!\\0$```````8````!````!`````````"D\0$`
+M``````0```"1`0````````````"H\0$```````4````!`````P````````"H
+M\0$```````@```"1`0````````````"L\0$```````8````!````!```````
+M``#P\0$```````0```"1`0````````````#T\0$```````4````!`````P``
+M``````#T\0$```````@```"1`0````````````#X\0$```````8````!````
+M!``````````0\@$```````0```"1`0`````````````4\@$```````4````!
+M`````P`````````4\@$```````@```"1`0`````````````8\@$```````8`
+M```!````!``````````P\@$```````0```"1`0`````````````T\@$`````
+M``4````!`````P`````````T\@$```````@```"1`0`````````````X\@$`
+M``````8````!````!`````````"`\@$```````0````7`0````````````"$
+M\@$```````4````!`````P````````"(\@$```````8````!````!```````
+M``"\]`$```````0```"1`0````````````#`]`$```````4````!`````P``
+M``````#`]`$```````@```"1`0````````````#$]`$```````8````!````
+M!`````````#H]`$```````0```"1`0````````````#L]`$```````4````!
+M`````P````````#L]`$```````@```"1`0````````````#P]`$```````8`
+M```!````!``````````<]0$```````0```!$```````````````@]0$`````
+M``4````!`````P`````````D]0$```````8````!````!`````````!0]0$`
+M``````0````M``````````````!4]0$```````4````!`````P````````!8
+M]0$```````8````!````!`````````"(]0$```````0```!(````````````
+M``",]0$```````4````!`````P````````"0]0$```````8````!````!```
+M``````"P]0$```````0```"1`0````````````"T]0$```````4````!````
+M`P````````"T]0$```````@```"1`0````````````"X]0$```````8````!
+M````!`````````"L]@$```````0```!+``````````````"P]@$```````4`
+M```!`````P````````"T]@$```````8````!````!`````````#(]@$`````
+M``0```!=`0````````````#,]@$```````4````!`````P````````#,]@$`
+M``````@```!=`0````````````#0]@$```````8````!````!``````````@
+M]P$```````8````!````!`````````!0]P$```````0```"4`0``````````
+M``!4]P$```````4````!`````P````````!8]P$```````8````!````!```
+M``````",]P$```````0```"1`0````````````"0]P$```````4````!````
+M`P````````"0]P$```````@```"1`0````````````"4]P$```````8````!
+M````!`````````"\]P$```````0```"4`0````````````#`]P$```````4`
+M```!`````P````````#$]P$```````8````!````!`````````#@]P$`````
+M``0```"4`0````````````#D]P$```````4````!`````P````````#H]P$`
+M``````8````!````!``````````(^`$```````0```"1`0`````````````,
+M^`$```````4````!`````P`````````,^`$```````@```"1`0``````````
+M```0^`$```````8````!````!``````````L^`$```````8````!````!```
+M``````!$^`$```````8````!````!`````````!<^`$```````8````!````
+M!`````````"4^`$```````0````!`0````````````"8^`$```````4````!
+M`````P````````"<^`$```````8````!````!`````````#`^`$```````0`
+M``"<`0````````````#$^`$```````4````!`````P````````#(^`$`````
+M``8````!````!``````````0^0$```````0```"1`0`````````````4^0$`
+M``````4````!`````P`````````4^0$```````@```"1`0`````````````8
+M^0$```````8````!````!``````````T^0$```````0```"4`0``````````
+M```X^0$```````4````!`````P`````````\^0$```````8````!````!```
+M``````!,^0$```````0````Y`0````````````!0^0$```````4````!````
+M`P````````!0^0$```````@````Y`0````````````!4^0$```````8````!
+M````!`````````"4^0$```````0```"4`0````````````"8^0$```````4`
+M```!`````P````````"<^0$```````8````!````!``````````4^@$`````
+M``0````Y`0`````````````8^@$```````4````!`````P`````````8^@$`
+M``````@````Y`0`````````````<^@$```````8````!````!``````````P
+M^@$```````0```!;```````````````T^@$```````4````!`````P``````
+M```X^@$```````8````!````!`````````!8^@$```````0```"1`0``````
+M``````!<^@$```````4````!`````P````````!<^@$```````@```"1`0``
+M``````````!@^@$```````8````!````!`````````#4^@$```````0```"7
+M``````````````#8^@$```````4````!`````P````````#8^@$```````@`
+M``"7``````````````#<^@$```````8````!````!`````````#L^@$`````
+M``0````)`0````````````#P^@$```````4````!`````P````````#P^@$`
+M``````@````)`0````````````#T^@$```````8````!````!``````````(
+M^P$```````0```"4`0`````````````,^P$```````4````!`````P``````
+M```0^P$```````8````!````!``````````P^P$```````0```"1`0``````
+M```````T^P$```````4````!`````P`````````T^P$```````@```"1`0``
+M```````````X^P$```````8````!````!``````````,_`$```````0```!+
+M```````````````0_`$```````4````!`````P`````````4_`$```````8`
+M```!````!``````````H_`$```````0```!=`0`````````````L_`$`````
+M``4````!`````P`````````L_`$```````@```!=`0`````````````P_`$`
+M``````8````!````!`````````!D_`$```````8````!````!`````````",
+M_`$```````0```"4`0````````````"0_`$```````4````!`````P``````
+M``"4_`$```````8````!````!`````````#L_`$```````0```"1`0``````
+M``````#P_`$```````4````!`````P````````#P_`$```````@```"1`0``
+M``````````#T_`$```````8````!````!``````````$_0$```````0```"4
+M`0`````````````(_0$```````4````!`````P`````````,_0$```````8`
+M```!````!``````````P_0$```````0```"1`0`````````````T_0$`````
+M``4````!`````P`````````T_0$```````@```"1`0`````````````X_0$`
+M``````8````!````!`````````!(_0$```````0```"4`0````````````!,
+M_0$```````4````!`````P````````!0_0$```````8````!````!```````
+M``"$_0$```````0```"1`0````````````"(_0$```````4````!`````P``
+M``````"(_0$```````@```"1`0````````````",_0$```````8````!````
+M!`````````"H_0$```````8````!````!`````````#,_0$```````8````!
+M````!`````````#L_0$```````0```"%`0````````````#P_0$```````4`
+M```!`````P````````#T_0$```````8````!````!``````````H_@$`````
+M``8````!````!`````````!T_@$```````0```"%`0````````````!X_@$`
+M``````4````!`````P````````!\_@$```````8````!````!`````````!P
+M``(```````0```"4`0````````````!T``(```````4````!`````P``````
+M``!X``(```````8````!````!`````````"T``(```````0```"1`0``````
+M``````"X``(```````4````!`````P````````"X``(```````@```"1`0``
+M``````````"\``(```````8````!````!`````````#4``(```````0```"1
+M`0````````````#8``(```````4````!`````P````````#8``(```````@`
+M``"1`0````````````#<``(```````8````!````!````````````0(`````
+M``0```"1`0`````````````$`0(```````4````!`````P`````````$`0(`
+M``````@```"1`0`````````````(`0(```````8````!````!``````````4
+M`0(```````0````Y`0`````````````8`0(```````4````!`````P``````
+M```8`0(```````@````Y`0`````````````<`0(```````8````!````!```
+M``````!$`0(```````0```"1`0````````````!(`0(```````4````!````
+M`P````````!(`0(```````@```"1`0````````````!,`0(```````8````!
+M````!`````````!8`0(```````0````Y`0````````````!<`0(```````4`
+M```!`````P````````!<`0(```````@````Y`0````````````!@`0(`````
+M``8````!````!`````````!X`0(```````0```"1`0````````````!\`0(`
+M``````4````!`````P````````!\`0(```````@```"1`0````````````"`
+M`0(```````8````!````!`````````"8`0(```````0```"1`0``````````
+M``"<`0(```````4````!`````P````````"<`0(```````@```"1`0``````
+M``````"@`0(```````8````!````!`````````#4`0(```````8````!````
+M!``````````4`@(```````0````!`0`````````````8`@(```````4````!
+M`````P`````````<`@(```````8````!````!`````````!L`@(```````0`
+M``"4`0````````````!P`@(```````4````!`````P````````!T`@(`````
+M``8````!````!`````````#(`@(```````0```"4`0````````````#,`@(`
+M``````4````!`````P````````#0`@(```````8````!````!`````````#D
+M`@(```````0```"4`0````````````#H`@(```````4````!`````P``````
+M``#L`@(```````8````!````!````````````P(```````0```"4`0``````
+M```````$`P(```````4````!`````P`````````(`P(```````8````!````
+M!``````````P`P(```````0```"4`0`````````````T`P(```````4````!
+M`````P`````````X`P(```````8````!````!`````````!8`P(```````0`
+M``"1`0````````````!<`P(```````4````!`````P````````!<`P(`````
+M``@```"1`0````````````!@`P(```````8````!````!`````````"T`P(`
+M``````0```##``````````````"X`P(```````4````!`````P````````"X
+M`P(```````@```##``````````````#<`P(```````0```#&````````````
+M``#@`P(```````4````!`````P````````#@`P(```````@```#&````````
+M```````(!`(```````0```"4`0`````````````,!`(```````4````!````
+M`P`````````0!`(```````8````!````!`````````!$!`(```````0```"1
+M`0````````````!(!`(```````4````!`````P````````!(!`(```````@`
+M``"1`0````````````!,!`(```````8````!````!`````````!@!`(`````
+M``0```"4`0````````````!D!`(```````4````!`````P````````!H!`(`
+M``````8````!````!`````````"0!`(```````0```"1`0````````````"4
+M!`(```````4````!`````P````````"4!`(```````@```"1`0``````````
+M``"8!`(```````8````!````!`````````"L!`(```````0```"4`0``````
+M``````"P!`(```````4````!`````P````````"T!`(```````8````!````
+M!`````````#8!`(```````0```"1`0````````````#<!`(```````4````!
+M`````P````````#<!`(```````@```"1`0````````````#@!`(```````8`
+M```!````!`````````!4!0(```````0```"4`0````````````!8!0(`````
+M``4````!`````P````````!<!0(```````8````!````!`````````"0!0(`
+M``````0```"1`0````````````"4!0(```````4````!`````P````````"4
+M!0(```````@```"1`0````````````"8!0(```````8````!````!```````
+M``"L!0(```````0```"4`0````````````"P!0(```````4````!`````P``
+M``````"T!0(```````8````!````!`````````#4!0(```````0```"1`0``
+M``````````#8!0(```````4````!`````P````````#8!0(```````@```"1
+M`0````````````#<!0(```````8````!````!`````````#T!0(```````0`
+M``#,``````````````#X!0(```````4````!`````P````````#\!0(`````
+M``8````!````!``````````<!@(```````0```"4`0`````````````@!@(`
+M``````4````!`````P`````````D!@(```````8````!````!`````````!$
+M!@(```````0```"1`0````````````!(!@(```````4````!`````P``````
+M``!(!@(```````@```"1`0````````````!,!@(```````8````!````!```
+M``````!$!P(```````8````!````!`````````"H!P(```````0```"4`0``
+M``````````"L!P(```````4````!`````P````````"P!P(```````8````!
+M````!`````````#$!P(```````0```"1`0````````````#(!P(```````4`
+M```!`````P````````#(!P(```````@```"1`0````````````#,!P(`````
+M``8````!````!`````````#8!P(```````0````Y`0````````````#<!P(`
+M``````4````!`````P````````#<!P(```````@````Y`0````````````#@
+M!P(```````8````!````!``````````("`(```````0```!,````````````
+M```,"`(```````4````!`````P`````````0"`(```````8````!````!```
+M```````L"`(```````0```"1`0`````````````P"`(```````4````!````
+M`P`````````P"`(```````@```"1`0`````````````T"`(```````8````!
+M````!`````````!("`(```````0```"%`0````````````!,"`(```````4`
+M```!`````P````````!0"`(```````8````!````!`````````!D"`(`````
+M``0```"4`0````````````!H"`(```````4````!`````P````````!L"`(`
+M``````8````!````!`````````"0"`(```````8````!````!`````````"H
+M"`(```````0```"4`0````````````"L"`(```````4````!`````P``````
+M``"P"`(```````8````!````!`````````!@"0(```````8````!````!```
+M``````","0(```````0```"4`0````````````"0"0(```````4````!````
+M`P````````"4"0(```````8````!````!``````````P"@(```````8````!
+M````!`````````!L"@(```````0```"1`0````````````!P"@(```````4`
+M```!`````P````````!P"@(```````@```"1`0````````````!T"@(`````
+M``8````!````!`````````"("@(```````0```"1`0````````````","@(`
+M``````4````!`````P````````","@(```````@```"1`0````````````"0
+M"@(```````8````!````!`````````"@"@(```````0```"4`0``````````
+M``"D"@(```````4````!`````P````````"H"@(```````8````!````!```
+M``````#$"@(```````0```"1`0````````````#("@(```````4````!````
+M`P````````#("@(```````@```"1`0````````````#,"@(```````8````!
+M````!`````````#D"@(```````0```"1`0````````````#H"@(```````4`
+M```!`````P````````#H"@(```````@```"1`0````````````#L"@(`````
+M``8````!````!```````````"P(```````0```"1`0`````````````$"P(`
+M``````4````!`````P`````````$"P(```````@```"1`0`````````````(
+M"P(```````8````!````!``````````@"P(```````0```"1`0``````````
+M```D"P(```````4````!`````P`````````D"P(```````@```"1`0``````
+M```````H"P(```````8````!````!`````````!("P(```````0```"1`0``
+M``````````!,"P(```````4````!`````P````````!,"P(```````@```"1
+M`0````````````!0"P(```````8````!````!`````````!\"P(```````8`
+M```!````!``````````H#`(```````0````O```````````````L#`(`````
+M``4````!`````P`````````P#`(```````8````!````!`````````!(#`(`
+M``````8````!````!`````````#8#0(```````0```"4`0````````````#<
+M#0(```````4````!`````P````````#@#0(```````8````!````!```````
+M````#@(```````0```"4`0`````````````$#@(```````4````!`````P``
+M```````(#@(```````8````!````!``````````L#@(```````0```"1`0``
+M```````````P#@(```````4````!`````P`````````P#@(```````@```"1
+M`0`````````````T#@(```````8````!````!`````````!0#@(```````0`
+M``"1`0````````````!4#@(```````4````!`````P````````!4#@(`````
+M``@```"1`0````````````!8#@(```````8````!````!`````````!P#@(`
+M``````0```"1`0````````````!T#@(```````4````!`````P````````!T
+M#@(```````@```"1`0````````````!X#@(```````8````!````!```````
+M``"D#@(```````8````!````!``````````8#P(```````0````_````````
+M```````<#P(```````4````!`````P`````````<#P(```````@````_````
+M```````````X#P(```````8````!````!`````````!4$`(```````0```"4
+M`0````````````!8$`(```````4````!`````P````````!<$`(```````8`
+M```!````!`````````"8$`(```````0```"1`0````````````"<$`(`````
+M``4````!`````P````````"<$`(```````@```"1`0````````````"@$`(`
+M``````8````!````!`````````#8$`(```````0```"4`0````````````#<
+M$`(```````4````!`````P````````#@$`(```````8````!````!```````
+M```H$0(```````0```"1`0`````````````L$0(```````4````!`````P``
+M```````L$0(```````@```"1`0`````````````P$0(```````8````!````
+M!`````````!P$0(```````0```"1`0````````````!T$0(```````4````!
+M`````P````````!T$0(```````@```"1`0````````````!X$0(```````8`
+M```!````!`````````!X$@(```````0```"4`0````````````!\$@(`````
+M``4````!`````P````````"`$@(```````8````!````!`````````"T$@(`
+M``````0```"1`0````````````"X$@(```````4````!`````P````````"X
+M$@(```````@```"1`0````````````"\$@(```````8````!````!```````
+M``#0$@(```````0```"4`0````````````#4$@(```````4````!`````P``
+M``````#8$@(```````8````!````!```````````$P(```````0```"1`0``
+M```````````$$P(```````4````!`````P`````````$$P(```````@```"1
+M`0`````````````($P(```````8````!````!``````````<$P(```````0`
+M``"4`0`````````````@$P(```````4````!`````P`````````D$P(`````
+M``8````!````!`````````!,$P(```````0```"1`0````````````!0$P(`
+M``````4````!`````P````````!0$P(```````@```"1`0````````````!4
+M$P(```````8````!````!`````````!H$P(```````0```"4`0``````````
+M``!L$P(```````4````!`````P````````!P$P(```````8````!````!```
+M``````"P$P(```````0```"1`0````````````"T$P(```````4````!````
+M`P````````"T$P(```````@```"1`0````````````"X$P(```````8````!
+M````!``````````0%`(```````0```"1`0`````````````4%`(```````4`
+M```!`````P`````````4%`(```````@```"1`0`````````````8%`(`````
+M``8````!````!``````````L%`(```````0```"4`0`````````````P%`(`
+M``````4````!`````P`````````T%`(```````8````!````!`````````!H
+M%`(```````0```"1`0````````````!L%`(```````4````!`````P``````
+M``!L%`(```````@```"1`0````````````!P%`(```````8````!````!```
+M``````"$%`(```````0```"4`0````````````"(%`(```````4````!````
+M`P````````",%`(```````8````!````!`````````#4%`(```````0```"1
+M`0````````````#8%`(```````4````!`````P````````#8%`(```````@`
+M``"1`0````````````#<%`(```````8````!````!`````````!8%0(`````
+M``0```"4`0````````````!<%0(```````4````!`````P````````!@%0(`
+M``````8````!````!`````````",%0(```````0```"1`0````````````"0
+M%0(```````4````!`````P````````"0%0(```````@```"1`0``````````
+M``"4%0(```````8````!````!`````````#L%0(```````0```"4`0``````
+M``````#P%0(```````4````!`````P````````#T%0(```````8````!````
+M!``````````H%@(```````0```"1`0`````````````L%@(```````4````!
+M`````P`````````L%@(```````@```"1`0`````````````P%@(```````8`
+M```!````!`````````!$%@(```````0```"4`0````````````!(%@(`````
+M``4````!`````P````````!,%@(```````8````!````!`````````!T%@(`
+M``````0```"1`0````````````!X%@(```````4````!`````P````````!X
+M%@(```````@```"1`0````````````!\%@(```````8````!````!```````
+M``"0%@(```````0```"4`0````````````"4%@(```````4````!`````P``
+M``````"8%@(```````8````!````!`````````"\%@(```````0```"1`0``
+M``````````#`%@(```````4````!`````P````````#`%@(```````@```"1
+M`0````````````#$%@(```````8````!````!``````````,%P(```````0`
+M``"4`0`````````````0%P(```````4````!`````P`````````4%P(`````
+M``8````!````!`````````!0%P(```````0```"1`0````````````!4%P(`
+M``````4````!`````P````````!4%P(```````@```"1`0````````````!8
+M%P(```````8````!````!`````````"$%P(```````0```"1`0``````````
+M``"(%P(```````4````!`````P````````"(%P(```````@```"1`0``````
+M``````",%P(```````8````!````!`````````#`%P(```````8````!````
+M!``````````,&`(``````!$````%````6``````````0&`(``````!(````%
+M````6``````````T&`(``````!$````%````8``````````X&`(``````!(`
+M```%````8``````````$&0(```````8````!````!`````````!L&0(`````
+M``0```"4`0````````````!P&0(```````4````!`````P````````!T&0(`
+M``````8````!````!`````````"0&0(```````0```"4`0````````````"4
+M&0(```````4````!`````P````````"8&0(```````8````!````!```````
+M``"T&0(```````0```"1`0````````````"X&0(```````4````!`````P``
+M``````"X&0(```````@```"1`0````````````"\&0(```````8````!````
+M!`````````#0&0(```````0```"4`0````````````#4&0(```````4````!
+M`````P````````#8&0(```````8````!````!`````````#\&0(```````0`
+M``"1`0``````````````&@(```````4````!`````P``````````&@(`````
+M``@```"1`0`````````````$&@(```````8````!````!``````````<&@(`
+M``````0```"1`0`````````````@&@(```````4````!`````P`````````@
+M&@(```````@```"1`0`````````````D&@(```````8````!````!```````
+M```\&@(```````0```"1`0````````````!`&@(```````4````!`````P``
+M``````!`&@(```````@```"1`0````````````!$&@(```````8````!````
+M!`````````!8&@(```````0```"4`0````````````!<&@(```````4````!
+M`````P````````!@&@(```````8````!````!`````````"$&@(```````0`
+M``"1`0````````````"(&@(```````4````!`````P````````"(&@(`````
+M``@```"1`0````````````",&@(```````8````!````!`````````"D&@(`
+M``````0```"1`0````````````"H&@(```````4````!`````P````````"H
+M&@(```````@```"1`0````````````"L&@(```````8````!````!```````
+M``#`&@(```````0```"4`0````````````#$&@(```````4````!`````P``
+M``````#(&@(```````8````!````!`````````#H&@(```````0```"1`0``
+M``````````#L&@(```````4````!`````P````````#L&@(```````@```"1
+M`0````````````#P&@(```````8````!````!``````````(&P(```````0`
+M``"1`0`````````````,&P(```````4````!`````P`````````,&P(`````
+M``@```"1`0`````````````0&P(```````8````!````!``````````H&P(`
+M``````0```"1`0`````````````L&P(```````4````!`````P`````````L
+M&P(```````@```"1`0`````````````P&P(```````8````!````!```````
+M``!(&P(```````0```"1`0````````````!,&P(```````4````!`````P``
+M``````!,&P(```````@```"1`0````````````!0&P(```````8````!````
+M!`````````!D&P(```````0```"4`0````````````!H&P(```````4````!
+M`````P````````!L&P(```````8````!````!`````````"0&P(```````0`
+M``"1`0````````````"4&P(```````4````!`````P````````"4&P(`````
+M``@```"1`0````````````"8&P(```````8````!````!`````````"P&P(`
+M``````0```"1`0````````````"T&P(```````4````!`````P````````"T
+M&P(```````@```"1`0````````````"X&P(```````8````!````!```````
+M``#0&P(```````0```"1`0````````````#4&P(```````4````!`````P``
+M``````#4&P(```````@```"1`0````````````#8&P(```````8````!````
+M!`````````#P&P(```````0```"1`0````````````#T&P(```````4````!
+M`````P````````#T&P(```````@```"1`0````````````#X&P(```````8`
+M```!````!``````````,'`(```````0```"4`0`````````````0'`(`````
+M``4````!`````P`````````4'`(```````8````!````!`````````#@'0(`
+M``````0```##``````````````#D'0(```````4````!`````P````````#D
+M'0(```````@```##``````````````!P'P(```````0```"4`0``````````
+M``!T'P(```````4````!`````P````````!X'P(```````8````!````!```
+M``````"<'P(```````0```"1`0````````````"@'P(```````4````!````
+M`P````````"@'P(```````@```"1`0````````````"D'P(```````8````!
+M````!`````````"X'P(```````0```"4`0````````````"\'P(```````4`
+M```!`````P````````#`'P(```````8````!````!`````````#@'P(`````
+M``0```"1`0````````````#D'P(```````4````!`````P````````#D'P(`
+M``````@```"1`0````````````#H'P(```````8````!````!``````````L
+M(`(```````0```"1`0`````````````P(`(```````4````!`````P``````
+M```P(`(```````@```"1`0`````````````T(`(```````8````!````!```
+M``````!,(`(```````0```"1`0````````````!0(`(```````4````!````
+M`P````````!0(`(```````@```"1`0````````````!4(`(```````8````!
+M````!`````````!H(`(```````0```"4`0````````````!L(`(```````4`
+M```!`````P````````!P(`(```````8````!````!`````````"@(`(`````
+M``0```"1`0````````````"D(`(```````4````!`````P````````"D(`(`
+M``````@```"1`0````````````"H(`(```````8````!````!`````````#`
+M(`(```````0```"1`0````````````#$(`(```````4````!`````P``````
+M``#$(`(```````@```"1`0````````````#((`(```````8````!````!```
+M``````#<(`(```````0```"4`0````````````#@(`(```````4````!````
+M`P````````#D(`(```````8````!````!``````````0(0(```````0```"1
+M`0`````````````4(0(```````4````!`````P`````````4(0(```````@`
+M``"1`0`````````````8(0(```````8````!````!``````````P(0(`````
+M``0```"1`0`````````````T(0(```````4````!`````P`````````T(0(`
+M``````@```"1`0`````````````X(0(```````8````!````!`````````!0
+M(0(```````0```"1`0````````````!4(0(```````4````!`````P``````
+M``!4(0(```````@```"1`0````````````!8(0(```````8````!````!```
+M``````!P(0(```````0```"1`0````````````!T(0(```````4````!````
+M`P````````!T(0(```````@```"1`0````````````!X(0(```````8````!
+M````!`````````",(0(```````0```"4`0````````````"0(0(```````4`
+M```!`````P````````"4(0(```````8````!````!`````````#((0(`````
+M``0```"1`0````````````#,(0(```````4````!`````P````````#,(0(`
+M``````@```"1`0````````````#0(0(```````8````!````!`````````#H
+M(0(```````0```"1`0````````````#L(0(```````4````!`````P``````
+M``#L(0(```````@```"1`0````````````#P(0(```````8````!````!```
+M```````((@(```````0```"1`0`````````````,(@(```````4````!````
+M`P`````````,(@(```````@```"1`0`````````````0(@(```````8````!
+M````!``````````H(@(```````0```"1`0`````````````L(@(```````4`
+M```!`````P`````````L(@(```````@```"1`0`````````````P(@(`````
+M``8````!````!`````````!$(@(```````0```"4`0````````````!((@(`
+M``````4````!`````P````````!,(@(```````8````!````!`````````!X
+M(@(```````0```"1`0````````````!\(@(```````4````!`````P``````
+M``!\(@(```````@```"1`0````````````"`(@(```````8````!````!```
+M``````"P(@(```````8````!````!``````````@(P(```````0````]````
+M```````````D(P(```````4````!`````P`````````D(P(```````@````]
+M``````````````!X(P(```````0```"4`0````````````!\(P(```````4`
+M```!`````P````````"`(P(```````8````!````!`````````"P(P(`````
+M``0```"1`0````````````"T(P(```````4````!`````P````````"T(P(`
+M``````@```"1`0````````````"X(P(```````8````!````!`````````#,
+M(P(```````0```"4`0````````````#0(P(```````4````!`````P``````
+M``#4(P(```````8````!````!``````````0)`(```````0```"1`0``````
+M```````4)`(```````4````!`````P`````````4)`(```````@```"1`0``
+M```````````8)`(```````8````!````!``````````X)`(```````8````!
+M````!`````````!P)`(```````0```!;``````````````!T)`(```````4`
+M```!`````P````````!X)`(```````8````!````!`````````",)`(`````
+M``8````!````!`````````#$)`(```````0````D`0````````````#()`(`
+M``````4````!`````P````````#()`(```````@````D`0````````````#,
+M)`(```````8````!````!`````````#<)`(```````0````D`0``````````
+M``#@)`(```````4````!`````P````````#@)`(```````@````D`0``````
+M``````#D)`(```````8````!````!``````````H)0(``````!$````"````
+M=%P````````L)0(``````!(````"````=%P```````"$)0(```````8````!
+M````!`````````!X)P(```````0```"1`0````````````!\)P(```````4`
+M```!`````P````````!\)P(```````@```"1`0````````````"`)P(`````
+M``8````!````!`````````#8)P(```````0```"1`0````````````#<)P(`
+M``````4````!`````P````````#<)P(```````@```"1`0````````````#@
+M)P(```````8````!````!``````````L*`(```````0```"1`0``````````
+M```P*`(```````4````!`````P`````````P*`(```````@```"1`0``````
+M```````T*`(```````8````!````!`````````"`*`(```````0```"1`0``
+M``````````"$*`(```````4````!`````P````````"$*`(```````@```"1
+M`0````````````"(*`(```````8````!````!`````````#4*`(```````0`
+M``"1`0````````````#8*`(```````4````!`````P````````#8*`(`````
+M``@```"1`0````````````#<*`(```````8````!````!`````````#\*`(`
+M``````0```"1`0``````````````*0(```````4````!`````P``````````
+M*0(```````@```"1`0`````````````$*0(```````8````!````!```````
+M```P*0(```````8````!````!`````````#@*0(```````0````4````````
+M``````#D*0(```````4````!`````P````````#H*0(```````8````!````
+M!`````````"D*P(```````0````7`0````````````"H*P(```````4````!
+M`````P````````"L*P(```````8````!````!`````````#D,0(```````8`
+M```!````!``````````D,@(```````8````!````!`````````!P,@(`````
+M`!$````"````?EP```````!T,@(``````!(````"````?EP```````"0,P(`
+M``````8````!````!`````````#(,P(```````0```#J``````````````#,
+M,P(```````4````!`````P````````#0,P(```````8````!````!```````
+M```(-@(```````8````!````!`````````"0-@(```````0```!9`0``````
+M``````"4-@(```````4````!`````P````````"4-@(```````@```!9`0``
+M``````````"8-@(```````8````!````!`````````!<-P(```````8````!
+M````!`````````"0-P(```````0```##``````````````"4-P(```````4`
+M```!`````P````````"4-P(```````@```##```````````````,.`(`````
+M``8````!````!`````````"T.`(```````0```!9`0````````````"X.`(`
+M``````4````!`````P````````"X.`(```````@```!9`0````````````"\
+M.`(```````8````!````!`````````#D.P(```````8````!````!```````
+M```$/`(``````!$````"````^%T````````(/`(``````!(````"````^%T`
+M``````!`/`(``````!$````"````B%P```````!$/`(``````!(````"````
+MB%P```````"`/`(```````8````!````!`````````"X/`(```````8````!
+M````!``````````(/0(```````8````!````!`````````#`/0(```````8`
+M```!````!``````````0/@(```````0```"1`0`````````````4/@(`````
+M``4````!`````P`````````4/@(```````@```"1`0`````````````8/@(`
+M``````8````!````!``````````X/@(```````8````!````!`````````"`
+M/@(```````0```"4`0````````````"$/@(```````4````!`````P``````
+M``"(/@(```````8````!````!`````````#,/P(```````8````!````!```
+M``````#D/P(``````!$````"````^%T```````#H/P(``````!(````"````
+M^%T```````#P/P(``````!$````"````B%P```````#T/P(``````!(````"
+M````B%P```````"@00(```````8````!````!`````````#400(```````8`
+M```!````!``````````<0@(```````8````!````!`````````"<0@(`````
+M``8````!````!`````````#40@(```````0````O``````````````#80@(`
+M``````4````!`````P````````#<0@(```````8````!````!`````````"8
+M0P(```````8````!````!``````````<1`(```````0```!<````````````
+M```@1`(```````4````!`````P`````````D1`(```````8````!````!```
+M``````!L1`(```````0```!H``````````````!P1`(```````4````!````
+M`P````````!T1`(```````8````!````!`````````"<1`(```````0```"1
+M`0````````````"@1`(```````4````!`````P````````"@1`(```````@`
+M``"1`0````````````"D1`(```````8````!````!`````````#81`(`````
+M``0```!<``````````````#<1`(```````4````!`````P````````#@1`(`
+M``````8````!````!`````````!410(```````0```!H``````````````!8
+M10(```````4````!`````P````````!<10(```````8````!````!```````
+M``!T10(```````0```"1`0````````````!X10(```````4````!`````P``
+M``````!X10(```````@```"1`0````````````!\10(```````8````!````
+M!`````````"T10(```````0```!H``````````````"X10(```````4````!
+M`````P````````"\10(```````8````!````!`````````#410(```````0`
+M``"1`0````````````#810(```````4````!`````P````````#810(`````
+M``@```"1`0````````````#<10(```````8````!````!``````````<1@(`
+M``````8````!````!`````````!,1@(```````0```"4`0````````````!0
+M1@(```````4````!`````P````````!41@(```````8````!````!```````
+M``#$1@(```````0```"1`0````````````#(1@(```````4````!`````P``
+M``````#(1@(```````@```"1`0````````````#,1@(```````8````!````
+M!`````````#@1@(```````0```"1`0````````````#D1@(```````4````!
+M`````P````````#D1@(```````@```"1`0````````````#H1@(```````8`
+M```!````!`````````#\1@(```````0```"1`0``````````````1P(`````
+M``4````!`````P``````````1P(```````@```"1`0`````````````$1P(`
+M``````8````!````!``````````41P(```````0```"4`0`````````````8
+M1P(```````4````!`````P`````````<1P(```````8````!````!```````
+M``!(1P(```````0```"1`0````````````!,1P(```````4````!`````P``
+M``````!,1P(```````@```"1`0````````````!01P(```````8````!````
+M!`````````!T1P(```````8````!````!`````````"L1P(```````0```#9
+M``````````````"P1P(```````4````!`````P````````"T1P(```````8`
+M```!````!`````````#(1P(```````0```"4`0````````````#,1P(`````
+M``4````!`````P````````#01P(```````8````!````!`````````!`2`(`
+M``````0```"1`0````````````!$2`(```````4````!`````P````````!$
+M2`(```````@```"1`0````````````!(2`(```````8````!````!```````
+M``!82`(```````0```#9``````````````!<2`(```````4````!`````P``
+M``````!@2`(```````8````!````!`````````"42`(```````8````!````
+M!`````````#(2`(```````0```!J`0````````````#,2`(```````4````!
+M`````P````````#02`(```````8````!````!`````````#D2`(```````8`
+M```!````!``````````@20(```````0````9`0`````````````D20(`````
+M``4````!`````P`````````H20(```````8````!````!``````````\20(`
+M``````8````!````!`````````!\2@(```````0````D`0````````````"`
+M2@(```````4````!`````P````````"`2@(```````@````D`0``````````
+M``"$2@(```````8````!````!``````````$2P(```````8````!````!```
+M``````!(2P(```````0```"1`0````````````!,2P(```````4````!````
+M`P````````!,2P(```````@```"1`0````````````!02P(```````8````!
+M````!`````````!X2P(```````0```"1`0````````````!\2P(```````4`
+M```!`````P````````!\2P(```````@```"1`0````````````"`2P(`````
+M``8````!````!`````````"02P(```````0```"4`0````````````"42P(`
+M``````4````!`````P````````"82P(```````8````!````!`````````#$
+M2P(```````0```"1`0````````````#(2P(```````4````!`````P``````
+M``#(2P(```````@```"1`0````````````#,2P(```````8````!````!```
+M``````#L2P(```````8````!````!`````````"83`(```````8````!````
+M!`````````#`30(```````0```"1`0````````````#$30(```````4````!
+M`````P````````#$30(```````@```"1`0````````````#(30(```````8`
+M```!````!`````````#\30(```````0```"1`0``````````````3@(`````
+M``4````!`````P``````````3@(```````@```"1`0`````````````$3@(`
+M``````8````!````!`````````!`3@(```````0```"1`0````````````!$
+M3@(```````4````!`````P````````!$3@(```````@```"1`0``````````
+M``!(3@(```````8````!````!`````````"(3@(```````0```"1`0``````
+M``````",3@(```````4````!`````P````````",3@(```````@```"1`0``
+M``````````"03@(```````8````!````!`````````#(3@(```````0```"1
+M`0````````````#,3@(```````4````!`````P````````#,3@(```````@`
+M``"1`0````````````#03@(```````8````!````!``````````X4`(`````
+M``0````L`0````````````!`4`(```````0````Q``````````````!44`(`
+M``````0```#!``````````````"`4`(```````0```"1`0````````````"$
+M4`(```````4````!`````P````````"$4`(```````@```"1`0``````````
+M``"(4`(```````8````!````!`````````#`4`(```````0```"1`0``````
+M``````#$4`(```````4````!`````P````````#$4`(```````@```"1`0``
+M``````````#(4`(```````8````!````!`````````#D4`(```````0```"1
+M`0````````````#H4`(```````4````!`````P````````#H4`(```````@`
+M``"1`0````````````#L4`(```````8````!````!``````````,40(`````
+M``0```"1`0`````````````040(```````4````!`````P`````````040(`
+M``````@```"1`0`````````````440(```````8````!````!``````````H
+M40(```````0```"1`0`````````````L40(```````4````!`````P``````
+M```L40(```````@```"1`0`````````````P40(```````8````!````!```
+M``````!$40(```````0```"1`0````````````!(40(```````4````!````
+M`P````````!(40(```````@```"1`0````````````!,40(```````8````!
+M````!`````````!<40(```````0```"4`0````````````!@40(```````4`
+M```!`````P````````!D40(```````8````!````!`````````"$40(`````
+M``0```"1`0````````````"(40(```````4````!`````P````````"(40(`
+M``````@```"1`0````````````",40(```````8````!````!`````````#(
+M4@(```````8````!````!`````````#D4@(```````0```"4`0``````````
+M``#H4@(```````4````!`````P````````#L4@(```````8````!````!```
+M````````4P(```````8````!````!``````````<4P(```````0```"1`0``
+M```````````@4P(```````4````!`````P`````````@4P(```````@```"1
+M`0`````````````D4P(```````8````!````!``````````\4P(```````8`
+M```!````!`````````!<4P(```````0```"1`0````````````!@4P(`````
+M``4````!`````P````````!@4P(```````@```"1`0````````````!D4P(`
+M``````8````!````!`````````!\4P(```````8````!````!`````````"L
+M4P(```````0```"4`0````````````"P4P(```````4````!`````P``````
+M``"T4P(```````8````!````!`````````#,4P(```````0```"4`0``````
+M``````#04P(```````4````!`````P````````#44P(```````8````!````
+M!``````````,5`(```````8````!````!`````````!05`(```````0```"1
+M`0````````````!45`(```````4````!`````P````````!45`(```````@`
+M``"1`0````````````!85`(```````8````!````!`````````!X5`(`````
+M``0````Y`0````````````!\5`(```````4````!`````P````````!\5`(`
+M``````@````Y`0````````````"`5`(```````8````!````!``````````8
+M50(```````0```"4`0`````````````<50(```````4````!`````P``````
+M```@50(```````8````!````!``````````X50(```````0```"1`0``````
+M```````\50(```````4````!`````P`````````\50(```````@```"1`0``
+M``````````!`50(```````8````!````!`````````!D50(```````0```"1
+M`0````````````!H50(```````4````!`````P````````!H50(```````@`
+M``"1`0````````````!L50(```````8````!````!`````````!\50(`````
+M``0```"4`0````````````"`50(```````4````!`````P````````"$50(`
+M``````8````!````!`````````"T50(```````0```"4`0````````````"X
+M50(```````4````!`````P````````"\50(```````8````!````!```````
+M``#@50(```````0```"1`0````````````#D50(```````4````!`````P``
+M``````#D50(```````@```"1`0````````````#H50(```````8````!````
+M!`````````#T50(```````0````Y`0````````````#X50(```````4````!
+M`````P````````#X50(```````@````Y`0````````````#\50(```````8`
+M```!````!``````````05@(```````0```"4`0`````````````45@(`````
+M``4````!`````P`````````85@(```````8````!````!`````````!`5@(`
+M``````0```"1`0````````````!$5@(```````4````!`````P````````!$
+M5@(```````@```"1`0````````````!(5@(```````8````!````!```````
+M``!L5@(```````0````Y`0````````````!P5@(```````4````!`````P``
+M``````!P5@(```````@````Y`0````````````!T5@(```````8````!````
+M!`````````"85@(```````0```"4`0````````````"<5@(```````4````!
+M`````P````````"@5@(```````8````!````!`````````#(5@(```````0`
+M``"1`0````````````#,5@(```````4````!`````P````````#,5@(`````
+M``@```"1`0````````````#05@(```````8````!````!`````````#D5@(`
+M``````0```"1`0````````````#H5@(```````4````!`````P````````#H
+M5@(```````@```"1`0````````````#L5@(```````8````!````!```````
+M``!,8P(```````8````!````!`````````!H8P(```````0```"&`0``````
+M``````!L8P(```````4````!`````P````````!L8P(```````@```"&`0``
+M``````````!P8P(```````8````!````!`````````"(8P(```````0```"1
+M`0````````````",8P(```````4````!`````P````````",8P(```````@`
+M``"1`0````````````"08P(```````8````!````!`````````"H8P(`````
+M``0```"1`0````````````"L8P(```````4````!`````P````````"L8P(`
+M``````@```"1`0````````````"P8P(```````8````!````!`````````#$
+M8P(```````0```"1`0````````````#(8P(```````4````!`````P``````
+M``#(8P(```````@```"1`0````````````#,8P(```````8````!````!```
+M``````#D8P(```````0```"1`0````````````#H8P(```````4````!````
+M`P````````#H8P(```````@```"1`0````````````#L8P(```````8````!
+M````!``````````$9`(```````0```"1`0`````````````(9`(```````4`
+M```!`````P`````````(9`(```````@```"1`0`````````````,9`(`````
+M``8````!````!``````````D9`(```````8````!````!`````````!$9`(`
+M``````0```"1`0````````````!(9`(```````4````!`````P````````!(
+M9`(```````@```"1`0````````````!,9`(```````8````!````!```````
+M``!<9`(```````0```"&`0````````````!@9`(```````4````!`````P``
+M``````!@9`(```````@```"&`0````````````!D9`(```````8````!````
+M!`````````!\9`(```````0```"1`0````````````"`9`(```````4````!
+M`````P````````"`9`(```````@```"1`0````````````"$9`(```````8`
+M```!````!`````````"<9`(```````0```"1`0````````````"@9`(`````
+M``4````!`````P````````"@9`(```````@```"1`0````````````"D9`(`
+M``````8````!````!`````````"`90(```````8````!````!`````````"<
+M90(```````0```"&`0````````````"@90(```````4````!`````P``````
+M``"@90(```````@```"&`0````````````"D90(```````8````!````!```
+M``````#`90(```````8````!````!```````````9@(```````0````D`0``
+M```````````$9@(```````4````!`````P`````````$9@(```````@````D
+M`0`````````````(9@(```````8````!````!`````````!09P(```````0`
+M``"1`0````````````!49P(```````4````!`````P````````!49P(`````
+M``@```"1`0````````````!89P(```````8````!````!`````````!P9P(`
+M``````0```"1`0````````````!T9P(```````4````!`````P````````!T
+M9P(```````@```"1`0````````````!X9P(```````8````!````!```````
+M``#$9P(```````8````!````!`````````#X9P(```````0```"1`0``````
+M``````#\9P(```````4````!`````P````````#\9P(```````@```"1`0``
+M````````````:`(```````8````!````!``````````8:`(```````0```"1
+M`0`````````````<:`(```````4````!`````P`````````<:`(```````@`
+M``"1`0`````````````@:`(```````8````!````!``````````X:`(`````
+M``8````!````!`````````!\:`(``````!$````"````E%\```````"`:`(`
+M`````!(````"````E%\```````"L:`(```````0```"4`0````````````"P
+M:`(```````4````!`````P````````"T:`(```````8````!````!```````
+M``#X:`(```````0```"1`0````````````#\:`(```````4````!`````P``
+M``````#\:`(```````@```"1`0``````````````:0(```````8````!````
+M!``````````4:0(```````0```"4`0`````````````8:0(```````4````!
+M`````P`````````<:0(```````8````!````!`````````!4:0(```````0`
+M``"1`0````````````!8:0(```````4````!`````P````````!8:0(`````
+M``@```"1`0````````````!<:0(```````8````!````!`````````!P:0(`
+M``````0```"4`0````````````!T:0(```````4````!`````P````````!X
+M:0(```````8````!````!`````````"X:0(```````0```"1`0``````````
+M``"\:0(```````4````!`````P````````"\:0(```````@```"1`0``````
+M``````#`:0(```````8````!````!`````````#4:0(```````0```"4`0``
+M``````````#8:0(```````4````!`````P````````#<:0(```````8````!
+M````!``````````8:@(```````0```"1`0`````````````<:@(```````4`
+M```!`````P`````````<:@(```````@```"1`0`````````````@:@(`````
+M``8````!````!`````````!X:@(``````!$````%````:`````````!\:@(`
+M`````!(````%````:`````````"`:@(``````!(````%````:`````````"0
+M:@(``````!$````%````<`````````"4:@(``````!(````%````<```````
+M``"8:@(``````!(````%````<`````````"H:@(``````!$````%````>```
+M``````"L:@(``````!(````%````>`````````"P:@(``````!(````%````
+M>`````````#`:@(``````!$````%````@`````````#$:@(``````!(````%
+M````@`````````#(:@(``````!(````%````@`````````#8:@(``````!$`
+M```%````B`````````#<:@(``````!(````%````B`````````#@:@(`````
+M`!(````%````B`````````#P:@(``````!$````%````D`````````#T:@(`
+M`````!(````%````D`````````#X:@(``````!(````%````D``````````4
+M:P(```````0```"4`0`````````````8:P(```````4````!`````P``````
+M```<:P(```````8````!````!`````````!L:P(```````0```"1`0``````
+M``````!P:P(```````4````!`````P````````!P:P(```````@```"1`0``
+M``````````!T:P(```````8````!````!`````````"(:P(```````0```"4
+M`0````````````",:P(```````4````!`````P````````"0:P(```````8`
+M```!````!`````````#,:P(```````0```"1`0````````````#0:P(`````
+M``4````!`````P````````#0:P(```````@```"1`0````````````#4:P(`
+M``````8````!````!`````````#H:P(```````0```"4`0````````````#L
+M:P(```````4````!`````P````````#P:P(```````8````!````!```````
+M```L;`(```````0```"1`0`````````````P;`(```````4````!`````P``
+M```````P;`(```````@```"1`0`````````````T;`(```````8````!````
+M!`````````!(;`(```````0```"4`0````````````!,;`(```````4````!
+M`````P````````!0;`(```````8````!````!`````````",;`(```````0`
+M``"1`0````````````"0;`(```````4````!`````P````````"0;`(`````
+M``@```"1`0````````````"4;`(```````8````!````!`````````"H;`(`
+M``````0```"4`0````````````"L;`(```````4````!`````P````````"P
+M;`(```````8````!````!`````````#<;`(```````0```"1`0``````````
+M``#@;`(```````4````!`````P````````#@;`(```````@```"1`0``````
+M``````#D;`(```````8````!````!`````````#X;`(```````0```"4`0``
+M``````````#\;`(```````4````!`````P``````````;0(```````8````!
+M````!``````````X;0(```````0```"1`0`````````````\;0(```````4`
+M```!`````P`````````\;0(```````@```"1`0````````````!`;0(`````
+M``8````!````!`````````!8;0(```````0```"4`0````````````!<;0(`
+M``````4````!`````P````````!@;0(```````8````!````!`````````!\
+M;0(```````0```"4`0````````````"`;0(```````4````!`````P``````
+M``"$;0(```````8````!````!`````````"D;0(```````0```"1`0``````
+M``````"H;0(```````4````!`````P````````"H;0(```````@```"1`0``
+M``````````"L;0(```````8````!````!`````````#\;0(``````!$````%
+M````F```````````;@(``````!(````%````F``````````$;@(``````!(`
+M```%````F``````````@;@(```````0```"4`0`````````````D;@(`````
+M``4````!`````P`````````H;@(```````8````!````!`````````!D;@(`
+M``````0```"1`0````````````!H;@(```````4````!`````P````````!H
+M;@(```````@```"1`0````````````!L;@(```````8````!````!```````
+M``"\;@(``````!$````"````:%\```````#`;@(``````!(````"````:%\`
+M``````#$;@(``````!(````"````:%\```````#T;@(```````0```"4`0``
+M``````````#X;@(```````4````!`````P````````#\;@(```````8````!
+M````!`````````!,;P(```````0```"1`0````````````!0;P(```````4`
+M```!`````P````````!0;P(```````@```"1`0````````````!4;P(`````
+M``8````!````!`````````"L;P(``````!$````"````=%\```````"P;P(`
+M`````!(````"````=%\```````"T;P(``````!(````"````=%\````````,
+M<`(```````0```"4`0`````````````0<`(```````4````!`````P``````
+M```4<`(```````8````!````!`````````!4<`(```````0```"1`0``````
+M``````!8<`(```````4````!`````P````````!8<`(```````@```"1`0``
+M``````````!<<`(```````8````!````!`````````#4<`(```````0```!U
+M`0````````````#8<`(```````4````!`````P````````#<<`(```````8`
+M```!````!`````````#X<`(```````0```#=``````````````#\<`(`````
+M``4````!`````P````````#\<`(```````@```#=````````````````<0(`
+M``````8````!````!``````````@<0(```````0```!U`0`````````````D
+M<0(```````4````!`````P`````````H<0(```````8````!````!```````
+M``!$<0(```````0```#=``````````````!(<0(```````4````!`````P``
+M``````!(<0(```````@```#=``````````````!,<0(```````8````!````
+M!`````````!D<0(```````0```"1`0````````````!H<0(```````4````!
+M`````P````````!H<0(```````@```"1`0````````````!L<0(```````8`
+M```!````!`````````"$<0(```````0```"1`0````````````"(<0(`````
+M``4````!`````P````````"(<0(```````@```"1`0````````````",<0(`
+M``````8````!````!`````````"@<0(```````0```!U`0````````````"D
+M<0(```````4````!`````P````````"H<0(```````8````!````!```````
+M``#$<0(```````0```#=``````````````#(<0(```````4````!`````P``
+M``````#(<0(```````@```#=``````````````#,<0(```````8````!````
+M!``````````(<@(```````8````!````!`````````"8<@(```````0```"1
+M`0````````````"<<@(```````4````!`````P````````"<<@(```````@`
+M``"1`0````````````"@<@(```````8````!````!`````````"X<@(`````
+M``0```"1`0````````````"\<@(```````4````!`````P````````"\<@(`
+M``````@```"1`0````````````#`<@(```````8````!````!`````````#8
+M<@(```````0```"1`0````````````#<<@(```````4````!`````P``````
+M``#<<@(```````@```"1`0````````````#@<@(```````8````!````!```
+M``````#X<@(```````0```"1`0````````````#\<@(```````4````!````
+M`P````````#\<@(```````@```"1`0``````````````<P(```````8````!
+M````!``````````0<P(```````0```"&`0`````````````4<P(```````4`
+M```!`````P`````````4<P(```````@```"&`0`````````````8<P(`````
+M``8````!````!`````````!`<P(```````8````!````!`````````!D=`(`
+M``````0````B`0````````````!H=`(```````4````!`````P````````!L
+M=`(```````8````!````!`````````#0=`(```````8````!````!```````
+M``"`=0(```````0````B`0````````````"$=0(```````4````!`````P``
+M``````"(=0(```````8````!````!`````````#0=0(```````8````!````
+M!`````````"H=@(```````0```!U`0````````````"L=@(```````4````!
+M`````P````````"P=@(```````8````!````!`````````#,=@(```````0`
+M``#=``````````````#0=@(```````4````!`````P````````#0=@(`````
+M``@```#=``````````````#4=@(```````8````!````!`````````#$=P(`
+M``````0```!U`0````````````#(=P(```````4````!`````P````````#,
+M=P(```````8````!````!`````````#H=P(```````0```#=````````````
+M``#L=P(```````4````!`````P````````#L=P(```````@```#=````````
+M``````#P=P(```````8````!````!``````````0>`(```````0```"1`0``
+M```````````4>`(```````4````!`````P`````````4>`(```````@```"1
+M`0`````````````8>`(```````8````!````!``````````P>`(```````0`
+M``"1`0`````````````T>`(```````4````!`````P`````````T>`(`````
+M``@```"1`0`````````````X>`(```````8````!````!`````````!0>`(`
+M``````0```!U`0````````````!4>`(```````4````!`````P````````!8
+M>`(```````8````!````!`````````!T>`(```````0```#=````````````
+M``!X>`(```````4````!`````P````````!X>`(```````@```#=````````
+M``````!\>`(```````8````!````!`````````"@>`(```````8````!````
+M!`````````#8>`(```````0```"1`0````````````#<>`(```````4````!
+M`````P````````#<>`(```````@```"1`0````````````#@>`(```````8`
+M```!````!`````````#X>`(```````0```"1`0````````````#\>`(`````
+M``4````!`````P````````#\>`(```````@```"1`0``````````````>0(`
+M``````8````!````!``````````0>0(```````0```"&`0`````````````4
+M>0(```````4````!`````P`````````4>0(```````@```"&`0``````````
+M```8>0(```````8````!````!`````````!$>0(```````0```"4`0``````
+M``````!(>0(```````4````!`````P````````!,>0(```````8````!````
+M!`````````!D>0(```````0```"4`0````````````!H>0(```````4````!
+M`````P````````!L>0(```````8````!````!``````````\>@(```````8`
+M```!````!``````````$>P(```````8````!````!`````````"X>P(`````
+M``8````!````!`````````#@>P(```````0```"4`0````````````#D>P(`
+M``````4````!`````P````````#H>P(```````8````!````!```````````
+M?`(```````0```"4`0`````````````$?`(```````4````!`````P``````
+M```(?`(```````8````!````!``````````@?`(```````0```"4`0``````
+M```````D?`(```````4````!`````P`````````H?`(```````8````!````
+M!`````````#L?`(```````8````!````!`````````!T?0(```````0```"&
+M`0````````````!X?0(```````4````!`````P````````!X?0(```````@`
+M``"&`0````````````!\?0(```````8````!````!`````````"0?0(`````
+M``0```"4`0````````````"4?0(```````4````!`````P````````"8?0(`
+M``````8````!````!`````````"P?0(```````0```"4`0````````````"T
+M?0(```````4````!`````P````````"X?0(```````8````!````!```````
+M```0?@(```````0```"1`0`````````````4?@(```````4````!`````P``
+M```````4?@(```````@```"1`0`````````````8?@(```````8````!````
+M!``````````P?@(```````0```"1`0`````````````T?@(```````4````!
+M`````P`````````T?@(```````@```"1`0`````````````X?@(```````8`
+M```!````!`````````!D?@(```````0```"1`0````````````!H?@(`````
+M``4````!`````P````````!H?@(```````@```"1`0````````````!L?@(`
+M``````8````!````!`````````"$?@(```````0```"1`0````````````"(
+M?@(```````4````!`````P````````"(?@(```````@```"1`0``````````
+M``",?@(```````8````!````!`````````!X@0(```````8````!````!```
+M``````"P@0(``````!$````"````L%\```````"T@0(``````!(````"````
+ML%\```````#<@0(```````0```"1`0````````````#@@0(```````4````!
+M`````P````````#@@0(```````@```"1`0````````````#D@0(```````8`
+M```!````!```````````@@(```````0````Y`0`````````````$@@(`````
+M``4````!`````P`````````$@@(```````@````Y`0`````````````(@@(`
+M``````8````!````!``````````@@@(``````!$````"`````&$````````D
+M@@(``````!(````"`````&$````````X@@(```````0```"1`0``````````
+M```\@@(```````4````!`````P`````````\@@(```````@```"1`0``````
+M``````!`@@(```````8````!````!`````````!<@@(```````0````Y`0``
+M``````````!@@@(```````4````!`````P````````!@@@(```````@````Y
+M`0````````````!D@@(```````8````!````!`````````!\@@(``````!$`
+M```"````V&0```````"`@@(``````!(````"````V&0```````"D@@(`````
+M``0```"1`0````````````"H@@(```````4````!`````P````````"H@@(`
+M``````@```"1`0````````````"L@@(```````8````!````!`````````#(
+M@@(```````0````Y`0````````````#,@@(```````4````!`````P``````
+M``#,@@(```````@````Y`0````````````#0@@(```````8````!````!```
+M```````(@P(```````8````!````!``````````\@P(```````0```"+````
+M``````````!`@P(```````4````!`````P````````!$@P(```````8````!
+M````!`````````!L@P(``````!$````"````8&H```````!P@P(``````!(`
+M```"````8&H```````"$@P(```````0````O``````````````"(@P(`````
+M``4````!`````P````````",@P(```````8````!````!`````````#$@P(`
+M``````0```"4`0````````````#(@P(```````4````!`````P````````#,
+M@P(```````8````!````!`````````#\@P(```````0```"1`0``````````
+M````A`(```````4````!`````P``````````A`(```````@```"1`0``````
+M```````$A`(```````8````!````!``````````@A`(```````0````O````
+M```````````DA`(```````4````!`````P`````````HA`(```````8````!
+M````!`````````!0A`(```````0````O``````````````!4A`(```````4`
+M```!`````P````````!8A`(```````8````!````!`````````"<A`(`````
+M``0```"1`0````````````"@A`(```````4````!`````P````````"@A`(`
+M``````@```"1`0````````````"DA`(```````8````!````!`````````#(
+MA`(```````0```"1`0````````````#,A`(```````4````!`````P``````
+M``#,A`(```````@```"1`0````````````#0A`(```````8````!````!```
+M``````#\A`(```````8````!````!``````````4A0(``````!$````"````
+MB&P````````8A0(``````!(````"````B&P```````!<A0(```````8````!
+M````!`````````!(AP(``````!$````"````0&,```````!,AP(``````!(`
+M```"````0&,```````"<AP(```````0```!Y``````````````"@AP(`````
+M``4````!`````P````````"@AP(```````@```!Y``````````````"DAP(`
+M``````8````!````!`````````#`AP(```````0```!Y``````````````#$
+MAP(```````4````!`````P````````#$AP(```````@```!Y````````````
+M``#(AP(```````8````!````!`````````#4AP(``````!$````"````0&,`
+M``````#8AP(``````!(````"````0&,```````#\AP(```````0```"1`0``
+M````````````B`(```````4````!`````P``````````B`(```````@```"1
+M`0`````````````$B`(```````8````!````!``````````@B`(```````0`
+M```Y`0`````````````DB`(```````4````!`````P`````````DB`(`````
+M``@````Y`0`````````````HB`(```````8````!````!`````````!`B`(`
+M`````!$````%````H`````````!$B`(``````!(````%````H`````````!8
+MB`(```````0```"1`0````````````!<B`(```````4````!`````P``````
+M``!<B`(```````@```"1`0````````````!@B`(```````8````!````!```
+M``````!\B`(```````0````Y`0````````````"`B`(```````4````!````
+M`P````````"`B`(```````@````Y`0````````````"$B`(```````8````!
+M````!`````````"8B`(``````!$````"````V&<```````"<B`(``````!(`
+M```"````V&<```````#`B`(```````0```"1`0````````````#$B`(`````
+M``4````!`````P````````#$B`(```````@```"1`0````````````#(B`(`
+M``````8````!````!`````````#DB`(```````0````Y`0````````````#H
+MB`(```````4````!`````P````````#HB`(```````@````Y`0``````````
+M``#LB`(```````8````!````!```````````B0(``````!$````"````\&<`
+M```````$B0(``````!(````"````\&<````````HB0(```````0```"1`0``
+M```````````LB0(```````4````!`````P`````````LB0(```````@```"1
+M`0`````````````PB0(```````8````!````!`````````!,B0(```````0`
+M```Y`0````````````!0B0(```````4````!`````P````````!0B0(`````
+M``@````Y`0````````````!4B0(```````8````!````!`````````!HB0(`
+M`````!$````"````"&@```````!LB0(``````!(````"````"&@```````#0
+MB0(```````0```!Y``````````````#4B0(```````4````!`````P``````
+M``#4B0(```````@```!Y``````````````#8B0(```````8````!````!```
+M``````#XB0(```````0```!Y``````````````#\B0(```````4````!````
+M`P````````#\B0(```````@```!Y````````````````B@(```````8````!
+M````!``````````@B@(```````0```!Y```````````````DB@(```````4`
+M```!`````P`````````DB@(```````@```!Y```````````````HB@(`````
+M``8````!````!`````````!(B@(```````0```!Y``````````````!,B@(`
+M``````4````!`````P````````!,B@(```````@```!Y``````````````!0
+MB@(```````8````!````!`````````!PB@(```````0```!Y````````````
+M``!TB@(```````4````!`````P````````!TB@(```````@```!Y````````
+M``````!XB@(```````8````!````!`````````"8B@(```````0```!Y````
+M``````````"<B@(```````4````!`````P````````"<B@(```````@```!Y
+M``````````````"@B@(```````8````!````!`````````"LB@(``````!$`
+M```"````"&@```````"PB@(``````!(````"````"&@```````#4B@(`````
+M``0```"1`0````````````#8B@(```````4````!`````P````````#8B@(`
+M``````@```"1`0````````````#<B@(```````8````!````!`````````#X
+MB@(```````0````Y`0````````````#\B@(```````4````!`````P``````
+M``#\B@(```````@````Y`0``````````````BP(```````8````!````!```
+M```````8BP(``````!$````"````H&D````````<BP(``````!(````"````
+MH&D```````!HBP(```````0```!Y``````````````!LBP(```````4````!
+M`````P````````!LBP(```````@```!Y``````````````!PBP(```````8`
+M```!````!`````````"0BP(```````0```!Y``````````````"4BP(`````
+M``4````!`````P````````"4BP(```````@```!Y``````````````"8BP(`
+M``````8````!````!`````````#4BP(```````0```!Y``````````````#8
+MBP(```````4````!`````P````````#8BP(```````@```!Y````````````
+M``#<BP(```````8````!````!`````````#XBP(```````0```!Y````````
+M``````#\BP(```````4````!`````P````````#\BP(```````@```!Y````
+M````````````C`(```````8````!````!``````````<C`(```````0```!Y
+M```````````````@C`(```````4````!`````P`````````@C`(```````@`
+M``!Y```````````````DC`(```````8````!````!``````````PC`(`````
+M`!$````"````H&D````````TC`(``````!(````"````H&D```````!8C`(`
+M``````0```"1`0````````````!<C`(```````4````!`````P````````!<
+MC`(```````@```"1`0````````````!@C`(```````8````!````!```````
+M``!\C`(```````0````Y`0````````````"`C`(```````4````!`````P``
+M``````"`C`(```````@````Y`0````````````"$C`(```````8````!````
+M!`````````#(C`(```````8````!````!`````````#\C`(```````0```##
+M````````````````C0(```````4````!`````P``````````C0(```````@`
+M``##``````````````!XC0(```````8````!````!`````````"8C@(`````
+M``0````D`0````````````"<C@(```````4````!`````P````````"<C@(`
+M``````@````D`0````````````"@C@(```````8````!````!`````````"P
+MDP(```````8````!````!``````````<E`(```````0```!9`0``````````
+M```@E`(```````4````!`````P`````````@E`(```````@```!9`0``````
+M```````DE`(```````8````!````!`````````!HE@(```````8````!````
+M!`````````#$E@(```````0```!9`0````````````#(E@(```````4````!
+M`````P````````#(E@(```````@```!9`0````````````#,E@(```````8`
+M```!````!`````````#@E@(```````8````!````!```````````EP(`````
+M``0```"%```````````````$EP(```````4````!`````P`````````$EP(`
+M``````@```"%```````````````(EP(```````8````!````!``````````<
+MEP(```````0```"%```````````````@EP(```````4````!`````P``````
+M```@EP(```````@```"%```````````````DEP(```````8````!````!```
+M``````!(EP(```````8````!````!`````````!4EP(``````!$````"````
+MJ&P```````!8EP(``````!(````"````J&P```````"8EP(``````!$````"
+M````J&P```````"<EP(``````!(````"````J&P```````"XEP(```````8`
+M```!````!`````````#<EP(```````0```#1``````````````#@EP(`````
+M``4````!`````P````````#DEP(```````8````!````!```````````F`(`
+M``````0```#1```````````````$F`(```````4````!`````P`````````(
+MF`(```````8````!````!``````````HF`(```````0````!````X)8"````
+M```PF`(```````0````!````>($"```````XF`(```````0````!````_(0"
+M``````!`F`(```````0````!````"(,"``````!(F`(```````0````!````
+M7(4"``````!0F`(```````0````!````>(T"``````!8F`(```````0````!
+M````0)<"``````!@F`(```````0````!````2)<"``````"`F`(```````8`
+M```!````!`````````"XF`(``````!$````"````U&P```````"\F`(`````
+M`!(````"````U&P```````#DF`(```````0```"1`0````````````#HF`(`
+M``````4````!`````P````````#HF`(```````@```"1`0````````````#L
+MF`(```````8````!````!``````````(F0(```````0````Y`0``````````
+M```,F0(```````4````!`````P`````````,F0(```````@````Y`0``````
+M```````0F0(```````8````!````!``````````HF0(``````!$````"````
+M5&X````````LF0(``````!(````"````5&X```````!`F0(```````0```"1
+M`0````````````!$F0(```````4````!`````P````````!$F0(```````@`
+M``"1`0````````````!(F0(```````8````!````!`````````!DF0(`````
+M``0````Y`0````````````!HF0(```````4````!`````P````````!HF0(`
+M``````@````Y`0````````````!LF0(```````8````!````!`````````"$
+MF0(``````!$````"````?'````````"(F0(``````!(````"````?'``````
+M``"LF0(```````0```"1`0````````````"PF0(```````4````!`````P``
+M``````"PF0(```````@```"1`0````````````"TF0(```````8````!````
+M!`````````#0F0(```````0````Y`0````````````#4F0(```````4````!
+M`````P````````#4F0(```````@````Y`0````````````#8F0(```````8`
+M```!````!``````````0F@(```````8````!````!`````````"$FP(`````
+M``0````O``````````````"(FP(```````4````!`````P````````",FP(`
+M``````8````!````!`````````"DFP(```````0```"4`0````````````"H
+MFP(```````4````!`````P````````"LFP(```````8````!````!```````
+M``#<FP(```````0```"1`0````````````#@FP(```````4````!`````P``
+M``````#@FP(```````@```"1`0````````````#DFP(```````8````!````
+M!`````````"LG`(```````0````O``````````````"PG`(```````4````!
+M`````P````````"TG`(```````8````!````!`````````!@G0(```````0`
+M```O``````````````!DG0(```````4````!`````P````````!HG0(`````
+M``8````!````!``````````$G@(```````0````O```````````````(G@(`
+M``````4````!`````P`````````,G@(```````8````!````!`````````"D
+MG@(```````0````O``````````````"HG@(```````4````!`````P``````
+M``"LG@(```````8````!````!`````````#`G@(```````0````O````````
+M``````#$G@(```````4````!`````P````````#(G@(```````8````!````
+M!``````````$GP(```````0```"1`0`````````````(GP(```````4````!
+M`````P`````````(GP(```````@```"1`0`````````````,GP(```````8`
+M```!````!``````````LGP(```````0```"1`0`````````````PGP(`````
+M``4````!`````P`````````PGP(```````@```"1`0`````````````TGP(`
+M``````8````!````!`````````!HGP(```````8````!````!`````````"`
+MGP(``````!$````"````I'@```````"$GP(``````!(````"````I'@`````
+M``#`GP(```````8````!````!`````````!PH0(``````!$````%````J```
+M``````!TH0(``````!(````%````J`````````"4H0(``````!$````"````
+M?',```````"8H0(``````!(````"````?',```````#(H0(``````!$````"
+M````E',```````#,H0(``````!(````"````E',```````#\H0(``````!$`
+M```"````K',`````````H@(``````!(````"````K',```````!(H@(`````
+M``0```!Y``````````````!,H@(```````4````!`````P````````!,H@(`
+M``````@```!Y``````````````!0H@(```````8````!````!`````````!P
+MH@(```````0```!Y``````````````!TH@(```````4````!`````P``````
+M``!TH@(```````@```!Y``````````````!XH@(```````8````!````!```
+M``````"<H@(```````0```!Y``````````````"@H@(```````4````!````
+M`P````````"@H@(```````@```!Y``````````````"DH@(```````8````!
+M````!`````````#DH@(```````0```!Y``````````````#HH@(```````4`
+M```!`````P````````#HH@(```````@```!Y``````````````#LH@(`````
+M``8````!````!``````````<HP(```````0```!Y```````````````@HP(`
+M``````4````!`````P`````````@HP(```````@```!Y```````````````D
+MHP(```````8````!````!`````````!4HP(```````0```!Y````````````
+M``!8HP(```````4````!`````P````````!8HP(```````@```!Y````````
+M``````!<HP(```````8````!````!`````````",HP(```````0```!Y````
+M``````````"0HP(```````4````!`````P````````"0HP(```````@```!Y
+M``````````````"4HP(```````8````!````!`````````#$HP(```````0`
+M``!Y``````````````#(HP(```````4````!`````P````````#(HP(`````
+M``@```!Y``````````````#,HP(```````8````!````!`````````#\HP(`
+M``````0```!Y````````````````I`(```````4````!`````P``````````
+MI`(```````@```!Y```````````````$I`(```````8````!````!```````
+M```XI`(```````0```!Y```````````````\I`(```````4````!`````P``
+M```````\I`(```````@```!Y``````````````!`I`(```````8````!````
+M!`````````!\I`(```````0```!Y``````````````"`I`(```````4````!
+M`````P````````"`I`(```````@```!Y``````````````"$I`(```````8`
+M```!````!`````````"DI`(```````0```!Y``````````````"HI`(`````
+M``4````!`````P````````"HI`(```````@```!Y``````````````"LI`(`
+M``````8````!````!``````````$I0(```````0```!Y```````````````(
+MI0(```````4````!`````P`````````(I0(```````@```!Y````````````
+M```,I0(```````8````!````!``````````HI0(```````0```!Y````````
+M```````LI0(```````4````!`````P`````````LI0(```````@```!Y````
+M```````````PI0(```````8````!````!`````````!,I0(```````0```!Y
+M``````````````!0I0(```````4````!`````P````````!0I0(```````@`
+M``!Y``````````````!4I0(```````8````!````!`````````!PI0(`````
+M``0```!Y``````````````!TI0(```````4````!`````P````````!TI0(`
+M``````@```!Y``````````````!XI0(```````8````!````!`````````"H
+MI0(```````0```!Y``````````````"LI0(```````4````!`````P``````
+M``"LI0(```````@```!Y``````````````"PI0(```````8````!````!```
+M``````#,I0(```````0```!Y``````````````#0I0(```````4````!````
+M`P````````#0I0(```````@```!Y``````````````#4I0(```````8````!
+M````!`````````#PI0(```````0```!Y``````````````#TI0(```````4`
+M```!`````P````````#TI0(```````@```!Y``````````````#XI0(`````
+M``8````!````!``````````4I@(```````0```!Y```````````````8I@(`
+M``````4````!`````P`````````8I@(```````@```!Y```````````````<
+MI@(```````8````!````!``````````XI@(```````0```!Y````````````
+M```\I@(```````4````!`````P`````````\I@(```````@```!Y````````
+M``````!`I@(```````8````!````!`````````!,I@(``````!$````"````
+M;'<```````!0I@(``````!(````"````;'<```````"XI@(```````0```!Y
+M``````````````"\I@(```````4````!`````P````````"\I@(```````@`
+M``!Y``````````````#`I@(```````8````!````!`````````#@I@(`````
+M``0```!Y``````````````#DI@(```````4````!`````P````````#DI@(`
+M``````@```!Y``````````````#HI@(```````8````!````!``````````X
+MIP(```````0```!Y```````````````\IP(```````4````!`````P``````
+M```\IP(```````@```!Y``````````````!`IP(```````8````!````!```
+M``````!<IP(```````0```!Y``````````````!@IP(```````4````!````
+M`P````````!@IP(```````@```!Y``````````````!DIP(```````8````!
+M````!`````````!PIP(``````!$````%````J`````````!TIP(``````!(`
+M```%````J`````````",IP(```````0```"1`0````````````"0IP(`````
+M``4````!`````P````````"0IP(```````@```"1`0````````````"4IP(`
+M``````8````!````!`````````"PIP(```````0````Y`0````````````"T
+MIP(```````4````!`````P````````"TIP(```````@````Y`0``````````
+M``"XIP(```````8````!````!`````````#,IP(``````!$````"````?',`
+M``````#0IP(``````!(````"````?',```````#PIP(```````0```"1`0``
+M``````````#TIP(```````4````!`````P````````#TIP(```````@```"1
+M`0````````````#XIP(```````8````!````!``````````4J`(```````0`
+M```Y`0`````````````8J`(```````4````!`````P`````````8J`(`````
+M``@````Y`0`````````````<J`(```````8````!````!``````````PJ`(`
+M`````!$````"````E',````````TJ`(``````!(````"````E',```````!4
+MJ`(```````0```"1`0````````````!8J`(```````4````!`````P``````
+M``!8J`(```````@```"1`0````````````!<J`(```````8````!````!```
+M``````!XJ`(```````0````Y`0````````````!\J`(```````4````!````
+M`P````````!\J`(```````@````Y`0````````````"`J`(```````8````!
+M````!`````````"4J`(``````!$````"````K',```````"8J`(``````!(`
+M```"````K',```````"XJ`(```````0```"1`0````````````"\J`(`````
+M``4````!`````P````````"\J`(```````@```"1`0````````````#`J`(`
+M``````8````!````!`````````#<J`(```````0````Y`0````````````#@
+MJ`(```````4````!`````P````````#@J`(```````@````Y`0``````````
+M``#DJ`(```````8````!````!`````````#\J`(``````!$````"````;'<`
+M````````J0(``````!(````"````;'<````````@J0(```````0```"1`0``
+M```````````DJ0(```````4````!`````P`````````DJ0(```````@```"1
+M`0`````````````HJ0(```````8````!````!`````````!$J0(```````0`
+M```Y`0````````````!(J0(```````4````!`````P````````!(J0(`````
+M``@````Y`0````````````!,J0(```````8````!````!`````````"0J0(`
+M``````8````!````!`````````!`K`(```````0```#J``````````````!$
+MK`(```````4````!`````P````````!(K`(```````8````!````!```````
+M``!@K`(```````0```#J``````````````!DK`(```````4````!`````P``
+M``````!HK`(```````8````!````!`````````#@K`(```````0```#J````
+M``````````#DK`(```````4````!`````P````````#HK`(```````8````!
+M````!```````````K0(```````0```#J```````````````$K0(```````4`
+M```!`````P`````````(K0(```````8````!````!`````````!4K0(`````
+M``0```#J``````````````!8K0(```````4````!`````P````````!<K0(`
+M``````8````!````!`````````"4K0(```````0```#J``````````````"8
+MK0(```````4````!`````P````````"<K0(```````8````!````!```````
+M``"TK0(```````0```#J``````````````"XK0(```````4````!`````P``
+M``````"\K0(```````8````!````!``````````(K@(```````0```#J````
+M```````````,K@(```````4````!`````P`````````0K@(```````8````!
+M````!`````````"4LP(```````8````!````!`````````#`LP(```````0`
+M``##``````````````#$LP(```````4````!`````P````````#$LP(`````
+M``@```##``````````````"(M`(```````8````!````!`````````"HN0(`
+M``````8````!````!`````````#(N0(```````0```"%``````````````#,
+MN0(```````4````!`````P````````#,N0(```````@```"%````````````
+M``#0N0(```````8````!````!`````````#DN0(```````0```"%````````
+M``````#HN0(```````4````!`````P````````#HN0(```````@```"%````
+M``````````#LN0(```````8````!````!`````````#LN@(```````8````!
+M````!`````````#\O`(```````0```##````````````````O0(```````4`
+M```!`````P``````````O0(```````@```##``````````````!PO0(`````
+M``0```##``````````````!TO0(```````4````!`````P````````!TO0(`
+M``````@```##```````````````HO@(```````8````!````!``````````4
+MOP(```````8````!````!``````````XOP(```````0```#1````````````
+M```\OP(```````4````!`````P````````!`OP(```````8````!````!```
+M``````!<OP(```````0```#1``````````````!@OP(```````4````!````
+M`P````````!DOP(```````8````!````!`````````",OP(```````0````!
+M````J+D"``````"4OP(```````0````!````@)@"``````"<OP(```````0`
+M```!````:)\"``````"DOP(```````0````!````$)H"``````"LOP(`````
+M``0````!````P)\"``````"TOP(```````0````!````D*D"``````"\OP(`
+M``````0````!````*+X"``````#$OP(```````0````A``````````````#D
+MOP(```````8````!````!``````````<P`(``````!$````"````Q'@`````
+M```@P`(``````!(````"````Q'@```````!(P`(```````0```"1`0``````
+M``````!,P`(```````4````!`````P````````!,P`(```````@```"1`0``
+M``````````!0P`(```````8````!````!`````````!LP`(```````0````Y
+M`0````````````!PP`(```````4````!`````P````````!PP`(```````@`
+M```Y`0````````````!TP`(```````8````!````!`````````",P`(`````
+M`!$````"````1'H```````"0P`(``````!(````"````1'H```````"DP`(`
+M``````0```"1`0````````````"HP`(```````4````!`````P````````"H
+MP`(```````@```"1`0````````````"LP`(```````8````!````!```````
+M``#(P`(```````0````Y`0````````````#,P`(```````4````!`````P``
+M``````#,P`(```````@````Y`0````````````#0P`(```````8````!````
+M!`````````#HP`(``````!$````"````G'X```````#LP`(``````!(````"
+M````G'X````````0P0(```````0```"1`0`````````````4P0(```````4`
+M```!`````P`````````4P0(```````@```"1`0`````````````8P0(`````
+M``8````!````!``````````TP0(```````0````Y`0`````````````XP0(`
+M``````4````!`````P`````````XP0(```````@````Y`0`````````````\
+MP0(```````8````!````!`````````!TP0(```````8````!````!```````
+M``#HP@(```````0````O``````````````#LP@(```````4````!`````P``
+M``````#PP@(```````8````!````!``````````(PP(```````0```"4`0``
+M```````````,PP(```````4````!`````P`````````0PP(```````8````!
+M````!`````````!`PP(```````0```"1`0````````````!$PP(```````4`
+M```!`````P````````!$PP(```````@```"1`0````````````!(PP(`````
+M``8````!````!``````````0Q`(```````0````O```````````````4Q`(`
+M``````4````!`````P`````````8Q`(```````8````!````!`````````#$
+MQ`(```````0````O``````````````#(Q`(```````4````!`````P``````
+M``#,Q`(```````8````!````!`````````!HQ0(```````0````O````````
+M``````!LQ0(```````4````!`````P````````!PQ0(```````8````!````
+M!``````````(Q@(```````0````O```````````````,Q@(```````4````!
+M`````P`````````0Q@(```````8````!````!``````````DQ@(```````0`
+M```O```````````````HQ@(```````4````!`````P`````````LQ@(`````
+M``8````!````!`````````!HQ@(```````0```"1`0````````````!LQ@(`
+M``````4````!`````P````````!LQ@(```````@```"1`0````````````!P
+MQ@(```````8````!````!`````````"0Q@(```````0```"1`0``````````
+M``"4Q@(```````4````!`````P````````"4Q@(```````@```"1`0``````
+M``````"8Q@(```````8````!````!`````````#,Q@(```````8````!````
+M!`````````!HQP(``````!$````%````L`````````!LQP(``````!(````%
+M````L`````````",QP(``````!$````"````G($```````"0QP(``````!(`
+M```"````G($```````#`QP(``````!$````"````M($```````#$QP(`````
+M`!(````"````M($```````#TQP(``````!$````"````S($```````#XQP(`
+M`````!(````"````S($```````!`R`(```````0```!Y``````````````!$
+MR`(```````4````!`````P````````!$R`(```````@```!Y````````````
+M``!(R`(```````8````!````!`````````!DR`(```````0```!Y````````
+M``````!HR`(```````4````!`````P````````!HR`(```````@```!Y````
+M``````````!LR`(```````8````!````!`````````!XR`(``````!$````"
+M````5(0```````!\R`(``````!(````"````5(0```````"PR`(``````!$`
+M```%````L`````````"TR`(``````!(````%````L`````````#,R`(`````
+M``0```"1`0````````````#0R`(```````4````!`````P````````#0R`(`
+M``````@```"1`0````````````#4R`(```````8````!````!`````````#P
+MR`(```````0````Y`0````````````#TR`(```````4````!`````P``````
+M``#TR`(```````@````Y`0````````````#XR`(```````8````!````!```
+M```````,R0(``````!$````"````G($````````0R0(``````!(````"````
+MG($````````PR0(```````0```"1`0`````````````TR0(```````4````!
+M`````P`````````TR0(```````@```"1`0`````````````XR0(```````8`
+M```!````!`````````!4R0(```````0````Y`0````````````!8R0(`````
+M``4````!`````P````````!8R0(```````@````Y`0````````````!<R0(`
+M``````8````!````!`````````!PR0(``````!$````"````M($```````!T
+MR0(``````!(````"````M($```````"4R0(```````0```"1`0``````````
+M``"8R0(```````4````!`````P````````"8R0(```````@```"1`0``````
+M``````"<R0(```````8````!````!`````````"XR0(```````0````Y`0``
+M``````````"\R0(```````4````!`````P````````"\R0(```````@````Y
+M`0````````````#`R0(```````8````!````!`````````#4R0(``````!$`
+M```"````S($```````#8R0(``````!(````"````S($```````#XR0(`````
+M``0```"1`0````````````#\R0(```````4````!`````P````````#\R0(`
+M``````@```"1`0``````````````R@(```````8````!````!``````````<
+MR@(```````0````Y`0`````````````@R@(```````4````!`````P``````
+M```@R@(```````@````Y`0`````````````DR@(```````8````!````!```
+M```````\R@(``````!$````"````5(0```````!`R@(``````!(````"````
+M5(0```````!@R@(```````0```"1`0````````````!DR@(```````4````!
+M`````P````````!DR@(```````@```"1`0````````````!HR@(```````8`
+M```!````!`````````"$R@(```````0````Y`0````````````"(R@(`````
+M``4````!`````P````````"(R@(```````@````Y`0````````````",R@(`
+M``````8````!````!`````````#0R@(```````8````!````!`````````#H
+MR@(``````!$````"````G(0```````#LR@(``````!(````"````G(0`````
+M``#<RP(```````8````!````!`````````!HS0(```````0```##````````
+M``````!LS0(```````4````!`````P````````!LS0(```````@```##````
+M``````````#LS0(```````8````!````!``````````8S@(```````0```##
+M```````````````<S@(```````4````!`````P`````````<S@(```````@`
+M``##```````````````LS@(```````8````!````!`````````!TUP(`````
+M``8````!````!`````````#\UP(```````0```"4`0``````````````V`(`
+M``````4````!`````P`````````$V`(```````8````!````!`````````!$
+MV`(```````0```"4`0````````````!(V`(```````4````!`````P``````
+M``!,V`(```````8````!````!`````````"8V`(```````0```"1`0``````
+M``````"<V`(```````4````!`````P````````"<V`(```````@```"1`0``
+M``````````"@V`(```````8````!````!`````````!\V0(```````0```"1
+M`0````````````"`V0(```````4````!`````P````````"`V0(```````@`
+M``"1`0````````````"$V0(```````8````!````!``````````@V@(`````
+M``0```"1`0`````````````DV@(```````4````!`````P`````````DV@(`
+M``````@```"1`0`````````````HV@(```````8````!````!`````````!<
+MV@(```````8````!````!`````````!\V@(```````0```"%````````````
+M``"`V@(```````4````!`````P````````"`V@(```````@```"%````````
+M``````"$V@(```````8````!````!`````````"8V@(```````0```"%````
+M``````````"<V@(```````4````!`````P````````"<V@(```````@```"%
+M``````````````"@V@(```````8````!````!`````````"TV@(```````0`
+M``"%``````````````"XV@(```````4````!`````P````````"XV@(`````
+M``@```"%``````````````"\V@(```````8````!````!`````````"4VP(`
+M``````8````!````!`````````#$W0(```````0```##``````````````#(
+MW0(```````4````!`````P````````#(W0(```````@```##````````````
+M```\W@(```````0```##``````````````!`W@(```````4````!`````P``
+M``````!`W@(```````@```##````````````````WP(```````8````!````
+M!`````````#LWP(```````8````!````!``````````0X`(```````0```#1
+M```````````````4X`(```````4````!`````P`````````8X`(```````8`
+M```!````!``````````TX`(```````0```#1```````````````XX`(`````
+M``4````!`````P`````````\X`(```````8````!````!`````````!0X`(`
+M``````0```#1``````````````!4X`(```````4````!`````P````````!8
+MX`(```````8````!````!`````````!XX`(```````0````!````7-H"````
+M``"`X`(```````0````!````Y+\"``````"(X`(```````0````!````T,H"
+M``````"0X`(```````0````!````=,$"``````"8X`(```````0````!````
+MS,8"``````"@X`(```````0````!````=-<"``````"HX`(```````0````!
+M`````-\"``````"PX`(```````0````A``````````````#0X`(```````8`
+M```!````!``````````(X0(``````!$````"````O(0````````,X0(`````
+M`!(````"````O(0````````TX0(```````0```"1`0`````````````XX0(`
+M``````4````!`````P`````````XX0(```````@```"1`0`````````````\
+MX0(```````8````!````!`````````!8X0(```````0````Y`0``````````
+M``!<X0(```````4````!`````P````````!<X0(```````@````Y`0``````
+M``````!@X0(```````8````!````!`````````!XX0(``````!$````"````
+MC(<```````!\X0(``````!(````"````C(<```````"0X0(```````0```"1
+M`0````````````"4X0(```````4````!`````P````````"4X0(```````@`
+M``"1`0````````````"8X0(```````8````!````!`````````"TX0(`````
+M``0````Y`0````````````"XX0(```````4````!`````P````````"XX0(`
+M``````@````Y`0````````````"\X0(```````8````!````!`````````#4
+MX0(``````!$````"````C(L```````#8X0(``````!(````"````C(L`````
+M``#\X0(```````0```"1`0``````````````X@(```````4````!`````P``
+M````````X@(```````@```"1`0`````````````$X@(```````8````!````
+M!``````````@X@(```````0````Y`0`````````````DX@(```````4````!
+M`````P`````````DX@(```````@````Y`0`````````````HX@(```````8`
+M```!````!`````````!@X@(```````8````!````!`````````#4XP(`````
+M``0````O``````````````#8XP(```````4````!`````P````````#<XP(`
+M``````8````!````!`````````#TXP(```````0```"4`0````````````#X
+MXP(```````4````!`````P````````#\XP(```````8````!````!```````
+M```LY`(```````0```"1`0`````````````PY`(```````4````!`````P``
+M```````PY`(```````@```"1`0`````````````TY`(```````8````!````
+M!`````````#\Y`(```````0````O````````````````Y0(```````4````!
+M`````P`````````$Y0(```````8````!````!`````````"\Y@(```````0`
+M```O``````````````#`Y@(```````4````!`````P````````#$Y@(`````
+M``8````!````!`````````#8Y@(```````0````O``````````````#<Y@(`
+M``````4````!`````P````````#@Y@(```````8````!````!``````````<
+MYP(```````0```"1`0`````````````@YP(```````4````!`````P``````
+M```@YP(```````@```"1`0`````````````DYP(```````8````!````!```
+M``````!$YP(```````0```"1`0````````````!(YP(```````4````!````
+M`P````````!(YP(```````@```"1`0````````````!,YP(```````8````!
+M````!`````````"`YP(```````8````!````!`````````"XZ`(``````!$`
+M```%````N`````````"\Z`(``````!(````%````N`````````#<Z`(`````
+M`!$````"````C(X```````#@Z`(``````!(````"````C(X````````0Z0(`
+M`````!$````"````I(X````````4Z0(``````!(````"````I(X```````!$
+MZ0(``````!$````"````O(X```````!(Z0(``````!(````"````O(X`````
+M``"<Z0(```````0```!Y``````````````"@Z0(```````4````!`````P``
+M``````"@Z0(```````@```!Y``````````````"DZ0(```````8````!````
+M!`````````#`Z0(```````0```!Y``````````````#$Z0(```````4````!
+M`````P````````#$Z0(```````@```!Y``````````````#(Z0(```````8`
+M```!````!`````````#DZ0(```````0```!Y``````````````#HZ0(`````
+M``4````!`````P````````#HZ0(```````@```!Y``````````````#LZ0(`
+M``````8````!````!``````````DZ@(```````0````O```````````````H
+MZ@(```````4````!`````P`````````LZ@(```````8````!````!```````
+M``!DZ@(```````0```!Y``````````````!HZ@(```````4````!`````P``
+M``````!HZ@(```````@```!Y``````````````!LZ@(```````8````!````
+M!`````````",Z@(```````0```!Y``````````````"0Z@(```````4````!
+M`````P````````"0Z@(```````@```!Y``````````````"4Z@(```````8`
+M```!````!`````````"@Z@(``````!$````"````-)(```````"DZ@(`````
+M`!(````"````-)(```````#8Z@(``````!$````%````N`````````#<Z@(`
+M`````!(````%````N`````````#TZ@(```````0```"1`0````````````#X
+MZ@(```````4````!`````P````````#XZ@(```````@```"1`0``````````
+M``#\Z@(```````8````!````!``````````8ZP(```````0````Y`0``````
+M```````<ZP(```````4````!`````P`````````<ZP(```````@````Y`0``
+M```````````@ZP(```````8````!````!``````````TZP(``````!$````"
+M````C(X````````XZP(``````!(````"````C(X```````!8ZP(```````0`
+M``"1`0````````````!<ZP(```````4````!`````P````````!<ZP(`````
+M``@```"1`0````````````!@ZP(```````8````!````!`````````!\ZP(`
+M``````0````Y`0````````````"`ZP(```````4````!`````P````````"`
+MZP(```````@````Y`0````````````"$ZP(```````8````!````!```````
+M``"8ZP(``````!$````"````I(X```````"<ZP(``````!(````"````I(X`
+M``````"\ZP(```````0```"1`0````````````#`ZP(```````4````!````
+M`P````````#`ZP(```````@```"1`0````````````#$ZP(```````8````!
+M````!`````````#@ZP(```````0````Y`0````````````#DZP(```````4`
+M```!`````P````````#DZP(```````@````Y`0````````````#HZP(`````
+M``8````!````!`````````#\ZP(``````!$````"````O(X`````````[`(`
+M`````!(````"````O(X````````@[`(```````0```"1`0`````````````D
+M[`(```````4````!`````P`````````D[`(```````@```"1`0``````````
+M```H[`(```````8````!````!`````````!$[`(```````0````Y`0``````
+M``````!([`(```````4````!`````P````````!([`(```````@````Y`0``
+M``````````!,[`(```````8````!````!`````````!D[`(``````!$````"
+M````-)(```````!H[`(``````!(````"````-)(```````"([`(```````0`
+M``"1`0````````````",[`(```````4````!`````P````````",[`(`````
+M``@```"1`0````````````"0[`(```````8````!````!`````````"L[`(`
+M``````0````Y`0````````````"P[`(```````4````!`````P````````"P
+M[`(```````@````Y`0````````````"T[`(```````8````!````!```````
+M``#X[`(```````8````!````!``````````0[0(``````!$````"````?)(`
+M```````4[0(``````!(````"````?)(````````$[@(```````8````!````
+M!`````````"0[P(```````0```##``````````````"4[P(```````4````!
+M`````P````````"4[P(```````@```##```````````````4\`(```````8`
+M```!````!`````````!`\`(```````0```##``````````````!$\`(`````
+M``4````!`````P````````!$\`(```````@```##``````````````!4\`(`
+M``````8````!````!`````````"<^0(```````8````!````!``````````H
+M^@(```````0```"4`0`````````````L^@(```````4````!`````P``````
+M```P^@(```````8````!````!`````````!P^@(```````0```"4`0``````
+M``````!T^@(```````4````!`````P````````!X^@(```````8````!````
+M!`````````#$^@(```````0```"1`0````````````#(^@(```````4````!
+M`````P````````#(^@(```````@```"1`0````````````#,^@(```````8`
+M```!````!`````````"H^P(```````0```"1`0````````````"L^P(`````
+M``4````!`````P````````"L^P(```````@```"1`0````````````"P^P(`
+M``````8````!````!`````````!,_`(```````0```"1`0````````````!0
+M_`(```````4````!`````P````````!0_`(```````@```"1`0``````````
+M``!4_`(```````8````!````!`````````"(_`(```````8````!````!```
+M``````"H_`(```````0```"%``````````````"L_`(```````4````!````
+M`P````````"L_`(```````@```"%``````````````"P_`(```````8````!
+M````!`````````#$_`(```````0```"%``````````````#(_`(```````4`
+M```!`````P````````#(_`(```````@```"%``````````````#,_`(`````
+M``8````!````!`````````#@_`(```````0```"%``````````````#D_`(`
+M``````4````!`````P````````#D_`(```````@```"%``````````````#H
+M_`(```````8````!````!`````````#`_0(```````8````!````!```````
+M``#P_P(```````0```##``````````````#T_P(```````4````!`````P``
+M``````#T_P(```````@```##``````````````!H``,```````0```##````
+M``````````!L``,```````4````!`````P````````!L``,```````@```##
+M```````````````L`0,```````8````!````!``````````8`@,```````8`
+M```!````!``````````\`@,```````0```#1``````````````!``@,`````
+M``4````!`````P````````!$`@,```````8````!````!`````````!@`@,`
+M``````0```#1``````````````!D`@,```````4````!`````P````````!H
+M`@,```````8````!````!`````````!\`@,```````0```#1````````````
+M``"``@,```````4````!`````P````````"$`@,```````8````!````!```
+M``````"D`@,```````0````!````B/P"``````"L`@,```````0````!````
+MT.`"``````"T`@,```````0````!````^.P"``````"\`@,```````0````!
+M````8.("``````#$`@,```````0````!````@.<"``````#,`@,```````0`
+M```!````G/D"``````#4`@,```````0````!````+`$#``````#<`@,`````
+M``0````A``````````````````````````,````!````\`L````````$````
+M``````,````!````2`T````````(``````````,````!````2`T````````,
+M``````````,````!````2`T````````0``````````,````!````^`L`````
+M```4``````````,````!````2`T````````8``````````,````!````#`P`
+M```````<``````````,````!````)`P````````@``````````,````!````
+M8`T````````D``````````,````!````+`P````````H``````````,````!
+M````.`P````````L``````````,````!````?`P````````P``````````,`
+M```!````3`P````````T``````````,````!````6`P````````X````````
+M``,````!````<`P````````\``````````,````!````A`P```````!`````
+M``````,````!````8`T```````!$``````````,````!````8`T```````!(
+M``````````,````!````S`P```````!,``````````,````!````X`P`````
+M``!0``````````,````!````2`T```````!4``````````,````!````[`P`
+M``````!8``````````,````!````2`T```````!<``````````,````!````
+M^`P```````!@``````````,````!````!`T```````!D``````````,````!
+M````$`T```````!H``````````,````!````8`T```````!L``````````,`
+M```!````8`T```````!P``````````,````!````2`T```````!T````````
+M``,````!````8`T```````!X``````````,````!````4`T```````!\````
+M``````,````!````8`T```````"```````````,````!````8`T```````"$
+M``````````,````!````8`T```````"(``````````,````!````6`T`````
+M``!(`0````````(````0`0````````````!0`0````````(```!F````````
+M``````!8`0````````(```#"``````````````!@`0````````(```"U````
+M``````````!H`0````````(```!^`0````````````!P`0````````(```#7
+M``````````````!X`0````````(```!6``````````````"``0````````(`
+M``#C``````````````"(`0````````(```"B``````````````"0`0``````
+M``(```![`0````````````"8`0````````(```!.`0````````````"@`0``
+M``````(```"_``````````````"H`0````````(```!```````````````"P
+M`0````````(```"&``````````````"X`0````````(```!9````````````
+M``#``0````````(````@``````````````#(`0````````(```!L`0``````
+M``````#0`0````````(```"7`0````````````#8`0````````(````N````
+M``````````#@`0````````(```".``````````````#H`0````````(```!+
+M`0````````````#P`0````````(````I``````````````#X`0````````(`
+M```\`````````````````@````````(```!J```````````````(`@``````
+M``(```""`0`````````````0`@````````(```!]`0`````````````8`@``
+M``````(````=`0`````````````@`@````````(```"V```````````````H
+M`@````````(```!C`0`````````````P`@````````(```!F`0``````````
+M```X`@````````(````-`0````````````!``@````````(```#@````````
+M``````!(`@````````(```!``0````````````!0`@````````(```"2````
+M``````````!8`@````````(```!V`0````````````!@`@````````(```#`
+M``````````````!H`@````````(```"X``````````````!P`@````````(`
+M``"'``````````````!X`@````````(```"P``````````````"``@``````
+M``(```!7``````````````"(`@````````(```#+``````````````"0`@``
+M``````(````\`0````````````"8`@````````(````2`0````````````"@
+M`@````````(```"F``````````````"H`@````````(````W`0``````````
+M``"P`@````````(```#M``````````````"X`@````````(```!@`0``````
+M``````#``@````````(```!0`0````````````#(`@````````(````O`0``
+M``````````#0`@````````(````R``````````````#8`@````````(```"W
+M``````````````#@`@````````(```!>`0````````````#H`@````````(`
+M```?`0````````````#P`@````````(````H`0````````````#X`@``````
+M``(````^`````````````````P````````(```!V```````````````(`P``
+M``````(```!(`0`````````````0`P````````(```#H```````````````8
+M`P````````(```!1```````````````@`P````````(````V````````````
+M```H`P````````(```"-```````````````P`P````````(````)````````
+M```````X`P````````(```#Y``````````````!``P````````(```!!`0``
+M``````````!(`P````````(````X`0````````````!0`P````````(```#Z
+M``````````````!8`P````````(```"#`0````````````!@`P````````(`
+M``!K``````````````!H`P````````(````+``````````````!P`P``````
+M``(```!H`0````````````!X`P````````(```"N``````````````"``P``
+M``````(````3`0````````````"(`P````````(````<`0````````````"0
+M`P````````(```!R`0````````````"8`P````````(````V`0``````````
+M``"@`P````````(```"H``````````````"H`P````````(```!'````````
+M``````"P`P````````(````Q`0````````````"X`P````````(````3````
+M``````````#``P````````(```"]``````````````#(`P````````(```!Q
+M``````````````#0`P````````(```#\``````````````#8`P````````(`
+M``#^``````````````#@`P````````(```!5`0````````````#H`P``````
+M``(```!G`0````````````#P`P````````(```"!`0````````````#X`P``
+M``````(````/````````````````!`````````(```!2`0`````````````(
+M!`````````(````F`0`````````````0!`````````(````/`0``````````
+M```8!`````````(```"C```````````````@!`````````(```!3`0``````
+M```````H!`````````(````!````N)`````````P!`````````(```"5`0``
+M```````````X!`````````(````N`0````````````!(!`````````(```!>
+M`0````````````!0!`````````(````?`0````````````!8!`````````(`
+M```H`0````````````!@!`````````(````^``````````````!H!```````
+M``(```!V``````````````!P!`````````(````!````_)`````````(&P``
+M``````(```!)`0`````````````0&P````````(```!I`0`````````````8
+M&P````````(```!;`0`````````````@&P````````(```"``0``````````
+M```H&P````````(```!E```````````````P&P````````(```!W````````
+M```````X&P````````(```"5``````````````!`&P````````(```!N````
+M``````````!(&P````````(````-``````````````!0&P````````(````U
+M``````````````!8&P````````(```!C``````````````!@&P````````(`
+M``!D``````````````!H&P````````(````Y``````````````!P&P``````
+M``(```!O`0````````````!X&P````````(````1`0````````````"`&P``
+M``````(```"+`0````````````"(&P````````(```"#``````````````"0
+M&P````````(```!Y`0````````````"8&P````````(````&`0``````````
+M``"@&P````````(```"L``````````````"H&P````````(````K`0``````
+M``````"P&P````````(````B``````````````"X&P````````(````+`0``
+M``````````#`&P````````(````9``````````````#(&P````````(```!K
+M`0````````````#0&P````````(```#K``````````````#8&P````````(`
+M```?``````````````#@&P````````(````J``````````````#H&P``````
+M``(```"O``````````````#P&P````````(```!_`0````````````#X&P``
+M``````(```!M`0``````````````'`````````(```!Z`0`````````````(
+M'`````````(````]`0`````````````0'`````````(```#V````````````
+M```8'`````````(````#`0`````````````@'`````````(```#R````````
+M```````H'`````````(````6`0`````````````P'`````````(```!_````
+M```````````X'`````````(```":``````````````!`'`````````(```!U
+M``````````````!('`````````(```!-`0````````````!0'`````````(`
+M``"A``````````````!8'`````````(```!"``````````````!@'```````
+M``(````^`0````````````!H'`````````(````Z`0````````````!P'```
+M``````(```![``````````````!X'`````````(````Z``````````````"`
+M'`````````(```!1`0````````````"('`````````(```#A````````````
+M``"0'`````````(````R`0````````````"8'`````````(```#G````````
+M``````"@'`````````(```#'``````````````"H'`````````(```#F````
+M``````````"P'`````````(```!%`0````````````"X'`````````(```#2
+M``````````````#`'`````````(````W``````````````#('`````````(`
+M``!B``````````````#0'`````````(```#<``````````````#8'```````
+M``(```!*`0````````````#@'`````````(```!8`0````````````#H'```
+M``````(````J`0````````````#P'`````````(````<``````````````#X
+M'`````````(```!=````````````````'0````````(````T`0``````````
+M```('0````````(```"6`0`````````````0'0````````(```!*````````
+M```````8'0````````(```"<```````````````@'0````````(```!D`0``
+M```````````H'0````````(```#8```````````````P'0````````(````(
+M`0`````````````X'0````````(````>``````````````!`'0````````(`
+M``#_``````````````!('0````````(````X``````````````!0'0``````
+M``(````$`0````````````!8'0````````(```#O``````````````!@'0``
+M``````(```"/``````````````!H'0````````(````G``````````````!P
+M'0````````(```!2``````````````!X'0````````(```"4````````````
+M``"`'0````````(```#?``````````````"('0````````(```#/````````
+M``````"0'0````````(```!:`0````````````"8'0````````(```#.````
+M``````````"@'0````````(```!5`0````````````"H'0````````(```"2
+M`0````````````"P'0````````(````(``````````````"X'0````````(`
+M``"D``````````````#`'0````````(```!R``````````````#('0``````
+M``(```!L``````````````#0'0````````(```#S``````````````#8'0``
+M``````(```#W``````````````#@'0````````(````*`0````````````#H
+M'0````````(````!````./T```````#P'0````````(````P`0``````````
+M``#X'0````````(```!,`0`````````````('@````````(```#'````````
+M```````0'@````````(```#F```````````````8'@````````(```!%`0``
+M```````````@'@````````(```#2```````````````H'@````````(````W
+M```````````````P'@````````(````!````O/T```````"8/`````````,`
+M```!````O%T!``````"</`````````,````!````O%T!``````"@/```````
+M``,````!````^%T!``````"D/`````````,````!````^%T!``````"H/```
+M``````,````!````-%X!``````"L/`````````,````!````-%X!``````"P
+M/`````````,````!````<%X!``````"T/`````````,````!````<%X!````
+M```0/@````````(```!<```````````````8/@````````(```""````````
+M```````@/@````````(```!W`0`````````````H/@````````(```!M````
+M```````````P/@````````(```!&```````````````X/@````````(```#;
+M``````````````!`/@````````(```"Z``````````````!(/@````````(`
+M```@`0````````````!0/@````````(```"M``````````````!8/@``````
+M``(```!5``````````````!@/@````````(```"?``````````````!H/@``
+M``````(```!8``````````````!P/@````````(````'`0````````````!X
+M/@````````(```!B`0````````````"`/@````````(```",````````````
+M``"(/@````````(````"`0````````````"0/@````````(```#I````````
+M``````"8/@````````(```"<`0````````````"@/@````````(```"0`0``
+M``````````"H/@````````(```"[``````````````"P/@````````(```!^
+M``````````````"X/@````````(````G`0````````````#`/@````````(`
+M```H``````````````#(/@````````(```!A`0````````````#0/@``````
+M``(```!6`0````````````#8/@````````(```"(``````````````#@/@``
+M``````(```!E`0````````````#H/@````````(```!@``````````````#P
+M/@````````(```!#`0````````````#X/@````````(````%`0``````````
+M````/P````````(``````0`````````````(/P````````(````2````````
+M```````0/P````````(```!P`0`````````````8/P````````(```!\````
+M```````````@/P````````(```#D```````````````H/P````````(```!U
+M`0`````````````P/P````````(```#=```````````````X/P````````(`
+M``"8``````````````!`/P````````(````U`0````````````!(/P``````
+M``(```#]``````````````!0/P````````(````0``````````````!8/P``
+M``````(```">``````````````!@/P````````(````*``````````````!H
+M/P````````(```"9``````````````!P/P````````(```!"`0``````````
+M``!X/P````````(```"R``````````````"`/P````````(```#L````````
+M``````"(/P````````(```!!``````````````"0/P````````(````C`0``
+M``````````"8/P````````(```"E``````````````"@/P````````(```"S
+M``````````````"H/P````````(````;`0````````````"P/P````````(`
+M``!/``````````````"X/P````````(```!&`0````````````#`/P``````
+M``(```!4`0````````````#(/P````````(````8`0````````````#0/P``
+M``````(```"8`0````````````#8/P````````(```!+``````````````#@
+M/P````````(```#*``````````````#H/P````````(```"J````````````
+M``#P/P````````(```"&`0````````````#X/P````````(```!.````````
+M````````0`````````(```"0```````````````(0`````````(```"*`0``
+M```````````00`````````(```"I```````````````80`````````(```#0
+M```````````````@0`````````(```!$```````````````H0`````````(`
+M``!-```````````````P0`````````(````M```````````````X0```````
+M``(```!#``````````````!`0`````````(````[``````````````!(0```
+M``````(```#N``````````````!00`````````(```!(``````````````!8
+M0`````````(```"!``````````````!@0`````````(````T````````````
+M``!H0`````````(````S``````````````!P0`````````(````8````````
+M``````!X0`````````(```!T``````````````"`0`````````(```#[````
+M``````````"(0`````````(```!O``````````````"00`````````(````I
+M`0````````````"80`````````(```"%`0````````````"@0`````````(`
+M``#4``````````````"H0`````````(```!5`0````````````"P0```````
+M``(```"3``````````````"X0`````````(```"3`0````````````#`0```
+M``````(````4`0````````````#(0`````````(```#5``````````````#0
+M0`````````(````C``````````````#80`````````(```!X`0``````````
+M``#@0`````````(```!P``````````````#H0`````````(```#9````````
+M``````#P0`````````(```#)``````````````#X0`````````(```#P````
+M````````````00````````(```".`0`````````````000````````(````;
+M`0`````````````800````````(```!/```````````````@00````````(`
+M``!&`0`````````````H00````````(```!4`0`````````````P00``````
+M``(````8`0`````````````X00````````(```"9`0````````````!(00``
+M``````(````!````L(,!``````!P4@````````,````!````J*L!``````!T
+M4@````````,````!````6*L!``````!X4@````````,````!````8*L!````
+M``!\4@````````,````!````!*P!``````"`4@````````,````!````>*L!
+M``````"$4@````````,````!````^*L!``````#44@````````,````!````
+M8,T!``````#84@````````,````!````R,H!``````#<4@````````,````!
+M````#,L!``````#@4@````````,````!````+,L!``````#D4@````````,`
+M```!````8,T!``````#H4@````````,````!````F,L!``````#L4@``````
+M``,````!````8,T!``````#P4@````````,````!````8,T!``````#T4@``
+M``````,````!````8,T!``````#X4@````````,````!````8,T!``````#\
+M4@````````,````!````8,T!````````4P````````,````!````U,L!````
+M```$4P````````,````!````8,T!```````(4P````````,````!````8,T!
+M```````,4P````````,````!````8,T!```````04P````````,````!````
+M8,T!```````44P````````,````!````W,L!```````84P````````,````!
+M````^,L!```````<4P````````,````!````8,T!```````@4P````````,`
+M```!````,,P!```````D4P````````,````!````6,P!```````H4P``````
+M``,````!````8,T!```````L4P````````,````!````7,L!```````P4P``
+M``````,````!````8,T!```````T4P````````,````!````8,T!```````X
+M4P````````,````!````8,T!```````\4P````````,````!````E,P!````
+M``!`4P````````,````!````G,P!``````!$4P````````,````!````8,T!
+M``````!(4P````````,````!````K,P!``````!,4P````````,````!````
+M6,T!``````!04P````````,````!````6,T!``````!44P````````,````!
+M````(,T!``````!84P````````,````!````*,T!``````!<4P````````,`
+M```!````,,T!``````!@4P````````,````!````/,T!``````!D4P``````
+M``,````!````3,T!``````"$4P````````,````!````J,\!``````"(4P``
+M``````,````!````J,\!``````",4P````````,````!````V,T!``````"0
+M4P````````,````!`````,X!``````"44P````````,````!````J,\!````
+M``"84P````````,````!````4,X!``````"<4P````````,````!````J,\!
+M``````"@4P````````,````!````J,\!``````"D4P````````,````!````
+MJ,\!``````"H4P````````,````!````J,\!``````"L4P````````,````!
+M````J,\!``````"P4P````````,````!````E,X!``````"T4P````````,`
+M```!````J,\!``````"X4P````````,````!````J,\!``````"\4P``````
+M``,````!````J,\!``````#`4P````````,````!````J,\!``````#$4P``
+M``````,````!````J,X!``````#(4P````````,````!````J,\!``````#,
+M4P````````,````!````J,\!``````#04P````````,````!````M,X!````
+M``#44P````````,````!````>,\!``````#84P````````,````!````J,\!
+M``````#<4P````````,````!````J,\!``````#@4P````````,````!````
+MJ,\!``````#D4P````````,````!````J,\!``````#H4P````````,````!
+M````J,\!``````#L4P````````,````!````W,X!``````#P4P````````,`
+M```!````W,X!``````#T4P````````,````!````J,\!``````#X4P``````
+M``,````!````0,\!``````"47P````````,````!````X'$"``````"87P``
+M``````,````!````E&@"``````"<7P````````,````!````>&H"``````"@
+M7P````````,````!````_&T"``````"D7P````````,````!````O&X"````
+M``"H7P````````,````!````K&\"``````"L7P````````,````!````O'`"
+M``````"(;`````````,````!````6(4"``````",;`````````,````!````
+M+(4"``````"0;`````````,````!````-(4"``````"4;`````````,````!
+M````/(4"``````"8;`````````,````!````5(4"``````"<;`````````,`
+M```!````5(4"``````"@;`````````,````!````1(4"``````"D;```````
+M``,````!````3(4"``````"D>`````````,````!````N)\"``````"H>```
+M``````,````!````O)\"``````"L>`````````,````!````F)\"``````"P
+M>`````````,````!````H)\"``````"T>`````````,````!````N)\"````
+M``"X>`````````,````!````N)\"``````"\>`````````,````!````J)\"
+M``````#`>`````````,````!````L)\"``````"<A`````````,````!````
+M(,L"``````"@A`````````,````!````),L"``````"DA`````````,````!
+M`````,L"``````"HA`````````,````!````",L"``````"LA`````````,`
+M```!````(,L"``````"PA`````````,````!````(,L"``````"TA```````
+M``,````!````$,L"``````"XA`````````,````!````&,L"``````!\D@``
+M``````,````!````2.T"``````"`D@````````,````!````3.T"``````"$
+MD@````````,````!````*.T"``````"(D@````````,````!````,.T"````
+M``",D@````````,````!````2.T"``````"0D@````````,````!````2.T"
+M``````"4D@````````,````!````..T"``````"8D@````````,````!````
+M0.T"```````0``````````(````#```````````````8``````````(````#
+M````!P`````````@``````````(````#````#@`````````H``````````(`
+M```#````%0`````````P``````````(````#````'``````````X````````
+M``(````#````(P````````!```````````(````#````*@````````!(````
+4``````(````#````,0``````````
+`
+end
diff --git a/sys/contrib/dev/ath/public/alpha-elf.inc b/sys/contrib/dev/ath/public/alpha-elf.inc
new file mode 100644
index 0000000..ff6c017
--- /dev/null
+++ b/sys/contrib/dev/ath/public/alpha-elf.inc
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/linuxsrc/src/802_11/madwifi/hal/main/public/x86_64-elf.inc#19 $
+#
+
+#
+# Compilation configuration for building big-endian Alpha w/ elf.
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=alpha-elf-linux
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/alpha-elf-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+#
+# NB: this should come from inttypes.h but can't until we cleanp
+# the definition of va_list on linux
+#
+COPTS+= -DAH_WORDSIZE=64
diff --git a/sys/contrib/dev/ath/public/alpha-elf.opt_ah.h b/sys/contrib/dev/ath/public/alpha-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/alpha-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/ap30.hal.o.uu b/sys/contrib/dev/ath/public/ap30.hal.o.uu
new file mode 100644
index 0000000..13f7a90
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap30.hal.o.uu
@@ -0,0 +1,3662 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/COPYRIGHT#1 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`0`````````````!``@````!`````````````C+,8``0`0`T````
+M```H`!$`#N#_/_P```````````````````````!__P`````PA/__)`,`6#P"
+M```0@P!A)$(`A"B"`%D00``E)`(1!RB"`!P00``3)`(`4BB"`!H00`!5/`(`
+M`"B"`!,00``))`(`$RB"`!$00`!)/`(``"0"``<0@@!"``````/@``@``!`E
+M$((`1P`````#X``(```0)1""`$$\`@``*((`4Q!```8D`P`</`(``!"#`$$D
+M0@"8`^``"```$"4D`@!7$((`-0`````#X``(```0)1""`"P\`@``*((1"!!`
+M`!0D`P"1/`(``!"#`#(D0@!P*((`DA!```HD`A`4*((`B!!``"P``!`E*((`
+MAA1``"@`````/`(```/@``@D0@!<$((`(``````#X``(```0)20"$1,0@@`<
+M/`(``"B"$1000``&-`/P$R0"$1(0@@`/``````/@``@``!`E/`(``!"#`!0D
+M0@`T-`/Q&SP"```0@P`0)$(`(`/@``@``!`E/`(```/@``@D0@``/`(```/@
+M``@D0@`0/`(```/@``@D0@!(/`(```/@``@D0@"L```0)0/@``@`````)[W_
+MZ*^_`!`PA/__.(,6C"QC``$X@J<G+$(``0!B&"448``$,*7__R0#$+<4@P`%
+M```0)3P"```D0@```$#X"0"@("6/OP`0`^``"">]`!@GO?_@K[\`&#"$__\H
+M@@"($$``&H^H`#`H@@"&$$``*CP"```H@@`=$$``""0"`%(H@@`:$$``*20"
+M`!,0@@`H```8)1```"TD`@`!$((`'2B"`%(40``H```8)2B"`%D00``F)`(`
+M`2B"`%<40``B/`(``!```!4D0@``)`(1$Q""`!<H@A$4$$``"#0"\!,D`@"1
+M$((`"R0"$!00@@`/```8)1```!4D`@`!$((`##0"_QD0@@`)```8)1````\D
+M`@`!/`(``"1"````0/@)KZ@`$!````H`0!@E)`0`$SP"```D0@```$#X":^H
+M`!`0```#`$`8)20"``&M`@``$&``$`!@$"648@'(I&(`")1B`<JD8@`*C&(!
+MS*QB`!R48@'0I&(`()1B`=*D8@`BE&(!U*1B`"248@'6I&(`)@!@$"6/OP`8
+M`^``"">]`""LA0'8`^``""0"``$GO?^PK[\`2*^W`$2OM@!`K[4`/*^T`#BO
+MLP`TK[(`,*^Q`"ROL``H`("H)0"@D"4`P*`E`."8)0``B"4F0L``+%80`">P
+M`"`\`@``)%<``!+``!0`````CJ(`%`!2$"&,0@``KZ(`().C`""2`@`!``(2
+M``!B&"62`@`"``(4``!B&"62`@`#``(6``!B&"4`=!@D$',`#R0"``$0```'
+M`````(ZB`!0`4A`AC$(```*"$"004P`')`(``0+@^`DD!``*)C$``2HB`^@4
+M0/_@```0)8^_`$B/MP!$C[8`0(^U`#R/M``XC[,`-(^R`#"/L0`LC[``*`/@
+M``@GO0!0```P)1"@``@``!@E``,00#"#``$`0Q@E),8``0#%$"L40/_Z``0@
+M0@/@``@`8!`ECZD`$##G__\`!Q!``$<0(0`"$(``11`AE$@`)A$``(P``!`E
+M``<00`!'$"$``A"``$40(9!#`"4D`@`"$&(`(BAB``,00``%)`(``Q!@``H`
+M`!`E`^``"#!"__\08@!9``@0P"0"``008@!F/`,08A```'8``!`E$2``""0$
+M`,``!Q!``$<0(0`"$(``11`AD$,`*20"`&``0R`+``8PP"0"`^APPA`"`$@`
+M&P``$!(5```"```````'``T`@A`A$```8B1"``J,@A(T$$``+`````"40@`"
+M,$*``!!``!$`"!$`/`,08C1C3=,`0P`9```0$``"(8(`!C#``,00(21"`!4`
+M1``;```0$A2```(```````<`#0`"$0`0``!+)$(`D(R$$C00@``6``@0@)2"
+M``(P0D``$$``$3P#$&(`"!#`-&--TP!#`!D``!`0``(A@@`&,,``Q!`A)$(`
+M%0!$`!L``!`2%(```@``````!P`-``(0P!```#0D0@!(``@0@#P#$&(T8TW3
+M`$,`&0``$!```B&"``8PP`#$$"$D0@`5`$0`&P``$!(4@``"```````'``T`
+M`A"`$```(R1"`"0\`Q!B-&--TP!#`!D``!`0``(A@@`&,,``Q!`A)$(`%0!$
+M`!L``!`2%(```@``````!P`-``(0@!```!,D0@`6``@0@#1C3=,`0P`9```0
+M$``"(8(`!C#``,00(21"`!4`1``;```0$A2```(```````<`#0`"$(`M!`/H
+M)$,`O21"`%P`9!`+,$+__P/@``@`````E*,``C!C`"`48``3)`(``I2C``(P
+M8P#0)`0`P!!D``XD`@`#E*,``C!C`-`D!`#0$&0`"20"``24HP`",&,`$!1@
+M``4D`@`!E*,``C!C"``D`@`%``,0"@/@``@`````)[W_X*^_`!BOL0`4K[``
+M$`"`."4`P(@E,B(`@!!```D`H(`E)`,)M!(#`(8D`@`.+@()M!!``'PF`_:9
+M$```/SP"9F8R(@$`$$``-#P"```D0@```$#X"0#@("400``A,B(!0"8"[+,L
+M0@`Q$$``'3(B`4``$!"``%`0(0`".$`\!,S,-(3,S0($`!D``!`0``(0@@`"
+M&(``8A@A)@7__CP"__\T0C\-`.(P(0#$`!D``"`0$&4`"0`$,((\`O__-$(_
+M"`#B,"$\`LS,-$+,S0#"`!D``!`0``(P@A```%D`P!`E+@03B0`"(`HF`O!@
+M/`/,S#1CS,T`0P`9```0$!2``%```A"")@+L>`!#`!D``!`0$```2P`"$((D
+M`PFT$@,`2"0"``XN`@FT$$``"BX#$X@F`_:9/`)F9C1"9F<`8@`8```0$``"
+M$$,``Q_#$```/`!#$",F`NQX/`3,S#2$S,T`1``9```0$!!@`#4``A""/`(`
+M`"1"````0/@)`.`@)1!``"$N`Q,E)@+LLRQ"`#$00``>)@+P8``0$(``4!`A
+M``(X0#P$S,PTA,S-`@0`&0``$!```A""``(8@`!B&"$F!?_^/`+__S1"/PT`
+MXC`A`,0`&0``(!`090`)``0P@CP"__\T0C\(`.(P(3P"S,PT0LS-`,(`&0``
+M$!```C""$```#P#`$"4F`O!@/`3,S#2$S,T`1``9```0$!!@``@``A"")@+V
+M,#P#S,PT8\S-`$,`&0``$!```A$")$(`#X^_`!B/L0`4C[``$`/@``@GO0`@
+M)[W_Z*^_`!2OL``0`*"`)8R%$C00H``*/`(``"1"````0/@)`````#P#```D
+M8P"\`$,0(9!"```0```$<@(0`CP"``"00@"^<@(0`H^_`!2/L``0`^``"">]
+M`!@GO?_HK[\`%*^P`!``H(`EC(42-!"@``\\`@``)$(```!`^`D`````/`,`
+M`"1C`+P`0Q`AD$,```(#`!L``!`2%&```@``````!P`-$```"8^_`!0\`@``
+MD$,`O@(#`!L``!`2%&```@``````!P`-C[\`%(^P`!`#X``()[T`&">]_\"O
+MOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`*"8)9)B
+M``040``U`("P)0``D"4F8P`$)`0`_P!R$"&@1```)E(``2I"`"`40/_\`'(0
+M(8YB```80``I``"0)29T``0\`@``)%4``"0>``$F=P`&`!*`0`(2@"$`$("`
+M)@,`(`)C&"&09``(D'$`"P*$$"&@4@``D&(`"0!$$"4"@A`AH%(``*^@`!`"
+MP"`E`F`H)20&``X"H/@)`B`X)280`"@"D!@AI&(``*^^`!`"P"`E`F`H)20&
+M``X"H/@)`B`X)0+P@"&F`@``)E(``8YB```"0A`J%$#_WP`2@$"/OP`\C[X`
+M.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`LH@`C
+M$$``EB2(`>`\`@``)$(`R``%&(``8A@AC&(```!```@`````E((""*SB```#
+MX``(```0)0/@``@D`@`-`^``""0"``V-`@````(1PCA"``$#X``(,$(``0/@
+M``@D`@`-`^``""0"``V5`@`*K.(```/@``@``!`EE0(`"*SB```#X``(```0
+M)8T#```P8T``)`(`#0/@``@``Q`+C0,``#!C@``D`@`-`^``"``#$`J-`P``
+M/`(@``!B&"0D`@`-`^``"``#$`N-`P``/`(0``!B&"0D`@`-`^``"``#$`N-
+M`P``/`((``!B&"0D`@`-`^``"``#$`N,@@'XK.(```/@``@``!`E)`(``1#"
+M``L`````$,``4@``$"4D`@`"$,(`"@`````D`@`#$,(`"P`````#X``()`(`
+M#82"`?RLX@```^``"```$"64@@'^K.(```/@``@``!`EC(("`*SB```#X``(
+M```0)8T#```P8R``)`(`#0/@``@``Q`+C0,``#!C$``D`@`-`^``"``#$`L#
+MX``()`(`#8T#```\`@"``&(8)"0"``T#X``(``,0"XT#```P8P0`)`(`#0/@
+M``@``Q`+C0,``#!C`@`D`@`-`^``"``#$`LD`@`!$,(`#``````0P``&)`(`
+M#20"``(0P@`+``````/@``@D`@`-C0,``#!C`0`#X``(``,0"XR#$DPD`@`-
+M`^``"``#$`N4@A)(K.(```/@``@``!`E`^``""0"``V,@Q)H)`(`#0/@``@`
+M`Q`+C0(`%*SB```#X``(```0)20"``P#X``(`````"0"`!D0H@`3CZ,`$"RB
+M`!H00``&)`(`'B0"``\0H@`')`(``Q```!P`````$*(`%P`````0```8````
+M`!3"`!8LX@`%$$``%"0"``$#X``(K(<"`"0"``$0P@`&``<0*R0"``(0P@`&
+M`````!````H`````K((23`/@``@D`@`!I(<22`/@``@D`@`!K(<2:`/@``@D
+M`@`!$&```P`````D`@`,K&(```/@``@``!`E)[W_Z`#`2"4LX@`(%$``+0``
+M:"4GJ@`0``T0@`!%$"&42```E$P``@`(%```3!`EK2(``"4I``0DY__\`2!8
+M)24"P``L0A``$$``$"4I``2,@@`4`$@0(8Q"``"OH@`0DZ,`$)%"``$``A(`
+M`&(8)9%"``(``A0``&(8)9%"``,``A8`$```!`!B$"6,@@`4`$@0(8Q"``"M
+M8@``)0@`!"3G__P!B!@K+.(`!#A"``$``Q`+%$#_X2SB``@00/_6):T``0$F
+M$",#X``()[T`&">]_^BOOP`4K[``$(^C`"@D`@`-$*(`%H^P`"PHH@`.$$``
+M!0`````0H``+`````!```"L``!`E)`(`'1"B`!4D@A)0)`(`'A"B`!<``!`E
+M$```)(^_`!0D@@'(K&(``"0"`!"N`@``$```'20"``$\`@``)$(.O`#`*"6,
+M9@```$#X"8X'``"N`@``$```%"0"``&L8@``)`(`&*X"```0```/)`(``13@
+M``<`````)`(`!*X"``",8P``C(("!!````:L8@``)`,`!!3C``0``!`EC,(`
+M`*R"`@0D`@`!C[\`%(^P`!`#X``()[T`&(RC``008`!G```0)8S"``"LH@``
+MC,(`!*RB``B,P@`(K*(`#(S"``RLH@`0C,0`$"0"__\0@@`%+(,!`"0"`/\`
+M@Q`+$````ZRB`!0D`@`"K*(`%(S#`!0D`O__$&(`$@!@("4L@P0!)`($``!#
+M(`HD`@`!K*(`&`!$$"L00``,`````(RB`!@``A!`-$(``:RB`!@`1!`K%$#_
+M^@`````0```$C,,`&(S"`!2LH@`8C,,`&"0"__\08@`2`&`@)2R#!`$D`@0`
+M`$,@"B0"``&LH@`<`$00*Q!```P`````C*(`'``"$$`T0@`!K*(`'`!$$"L4
+M0/_Z`````!````24P@`<)`(#_ZRB`!R4P@`<$$``""0"``J4PP`<+&(`$!1`
+M``(`````)`,`#Q````*DHP`@I*(`()3"`!X00``()`(`"I3#`!XL8@`0%$``
+M`@`````D`P`/$````J2C`"*DH@`BC,(`(*RB`"2,P@`DK*(`*(S"`"BLH@`L
+MC,(`+*RB`#",PP`$)`(`!!1B``4D`@`!C*,`!!1B``(`````K*,`.`/@``@`
+M````C,,`!!!@`!X``!`EC,(`#*RB``B,P@``K*(``(S"``BLH@`$C,(`#*RB
+M``B,P@`0K*(`#(S"`!2LH@`0C,(`&*RB`!2,P@`<K*(`&)3"`""DH@`<E,(`
+M(J2B`!Z,P@`DK*(`((S"`"BLH@`DC,(`+*RB`"B,P@`PK*(`+"0"``$#X``(
+M`````">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)3P"```D0@```$#X"0"@@"4`
+M0(@E$B``'(^_`!R&(@`6%$``$SP"```D0@```D`@)0!`^`D"`"@E`$"`)8Y"
+M`<`"0"`E`$#X"0(@*"4\`P``)&,!5``0@$`"`X`AE@,```!B&"$``QP`$```
+M!@`#%`.6(@`6EB,`&`!#$"$``A0```(4`X^_`!R/L@`8C[$`%(^P`!`#X``(
+M)[T`(">]_\"OOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!RO
+ML``8`("@)0``\"6OH``0``"X):^@`!2.@A(P$$``0```D"4\`@``)%8!5``2
+M$8`"@H`AA@("1@1!`#0F$0(P`H`@)3P#```D8P```&#X"0(@*"4`0*@ECH(!
+MP`*`("4`0/@)`B`H)0`5&$``=A@AE@0"1I1S````DR`A`$00(0`"%````AP#
+ME@(",C!"`0`00``.`'<0*A!``!P"@"`E`&"X)8Z"`<``0/@)`B`H)98#`D8`
+M8A@A`F,8(P`#'````QP#$```$:^C`!0`?A`J$$``#@*`("4`8/`ECH(!P`!`
+M^`D"("@E`!4@0`"6("&6(P`6`&(8(92"````0Q`C``(4```"%`.OH@`0)E(`
+M`8Z"$C`"0A`K%$#_Q0`2$8```)`E`!(1@`*"@"&&`@)&!$$`#B81`C".@@'`
+M`H`@)0!`^`D"("@EE@,",C!C`0"/I0`4`$4@(8^E`!``11`A.&,```"#$`NF
+M(@`8)E(``2I"`$`40/_KC[\`/(^^`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R
+M`""/L0`<C[``&`/@``@GO0!`````````````````,*7__S#&__^4@@``+$(P
+M`CP#```40``#)&@!D#P"```D2`&H```@)20*`&0\"5'K-2F%'P`$$$``2!`A
+ME$(```%"&",`90`8<$8`````$!(`20`8```8$``#&4,``A?#`&(8(Z3C```D
+MA``!*((`"Q1`__`DYP`"`^``"``````PI?__)`,`_Q"C`!,D`@#_E(,``"QC
+M,`,`!1"``$40(21"$L`08``,,$+__RRC`#\`!1"``$40(21"%2(08``&,$+_
+M_P`%$(``11`A``(00"1"$^PP0O__`^``"``````PI?__)`,`_Q"C``DD`@#_
+ME((``"Q",`,DHPE@%$```S!C__\DH@C\,$/__P!@$"4#X``(`````">]_]"O
+MOP`LK[0`**^S`"2OL@`@K[$`'*^P`!@`H)`EED(``"Q"0``40``'`("@)99"
+M`"X00``$`````)9#`!808`".)`(``99"```L0C`#%$``'203`0$D$P%0ED(!
+M=A!``'0``(@E)E```@)@*"4F8@`!,%/__XZ"`:`"@"`E`$#X"2>F`!`00`!\
+M`!$80`!P("&7H@`0``(2`J2"`6``@!@EDZ(`$:1B`6(F,0`"ED(!=@(B$"H4
+M0/_M`F`H)1```%R60@%VCH(!H`*`("4D!0$``$#X"2>F`!`00`!G`H`@)9>B
+M`!```AI"ID,!8@`"$((P0@!_ID(!9)>B`!```A%`,$(`?Z9"`68"8"@E)F(`
+M`3!3__^.@@&@`$#X"2>F`!`00`!5EZ,`$``#(L*60@%F`$00):9"`68``QD"
+M,&,`?Z9#`6B7H@`0``(0P#!"`'^F0@%J`F`H)29B``$P4___CH(!H`*`("4`
+M0/@))Z8`$!!``$&7HP`0``,C0I9"`6H`1!`EID(!:@`#&8(P8P!_ID,!;)>B
+M`!```A!`,$(`?Z9"`6X"8"@E)F(``3!3__^.@@&@`H`@)0!`^`DGI@`0$$``
+M+9>C`!```R/"ED(!;@!$$"6F0@%N``,2`C!"`'^F0@%P``,80C!C`'^F0P%R
+MEZ(`$``"$8`P0@!_ID(!=(Z"`:`"@"`E`F`H)0!`^`DGI@`0$$``&)>C`!``
+M`QJ"ED(!=`!#$"6F0@%TED(!=A!``!```(@E)E,``CP"```D5!7``!&`0"80
+M`6`"<(`A`D`@)0*`^`F6!0``I@(``"8Q``&60@%V`B(0*A1`__8`$8!`)`(`
+M`8^_`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@GO0`P)[W_X*^_`!ROL@`8
+MK[$`%*^P`!``P(`EE+$`%`"@D"4D!``5`!$00"1"``,``A""<B08`@!B("$\
+M`@``)$(```!`^`D`!""``$`8)1!@`#2/OP`<K@,````1$$`D0@`#``(0@@`"
+M$(``8A`AK@(`"*81``02(``H```P)20'`%0D"0`$)`@``XX$````!A!``$0@
+M(8X#``APQR@"`*,8(0!2$"&40@``I&(``*2"`````"`E<,<H`HX"``@`HA`A
+M``08@`!D&"$``QB``$,0(:1$``2.`@`(`*(0(0!#$"&D0``&)(0``2B"``04
+M0/_R<,<8`HX"``@`8A`AI$D`!HX"``@`8A@A),8``0#1$"H40/_=I&@`0B0"
+M``&/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_X`*!@)96"`!:DP@`&-`+>
+MK:>B``"GH@`"```@)93%``8``#@E`.40!S!"``$80``'*(,``A!@`*(``!`E
+M``000`.B$"&D1P``)(0``23G``$HX@`$%$#_\P````"5@@`4I,(`!#!#__\0
+M8`"5```0)93"``000`"1``!()20*`%0D"P`$)`4`&G$E$`(`3"@A)*@`&(S#
+M``AQ*B`"`(,8(92B`!BD8@``C,(`"`""("&4H@`JI((``@``."5Q*B`"C,(`
+M"`""$"$`!QB``&<8(0`#&(``0Q`AI$``!B3G``$HX@`$%$#_]I>C``(T`MZM
+M%&(`'G$J*`*7IP````<@@`"'("$`!""`<2H0`@!$("&,P@`(`((@(:2+``:5
+M`@`"I((`")4#``8`0Q`AI((`"I4#``H`0Q`AI((`#)4#``X`0Q`AI((`#I4"
+M``2D@@`0E0(`"*2"`!*5`@`,I((`%)4"`!`0``!0I((`%HS$``@`I"`AEZ,`
+M```#$(``0Q`A``(0@`""("&5`@`"I((`"(S$``@`I"`AEZ,``@`#$(``0Q`A
+M``(0@`""("$D`@`4I((`"(S$``@`I"`AEZ,``@`#$(``0Q`A``(0@`!$$"$D
+M`P`CI$,`"HS$``@`I"`AEZ,``@`#$(``0Q`A``(0@`!$$"$D`P`_I$,`#)>G
+M````!Q"``$<0(0`"$(``HB`AC,(`"`""("$DA``$I(L``I2"``25`P`&`$,0
+M(:2"``:5`P`*`$,0(:2"``B5`P`.`$,0(:2"``J5`@`$I((`#)4"``BD@@`.
+ME0(`#*2"`!"5`@`0I((`$I>G``(`!Q"``$<0(0`"$(``HB`AC,(`"`""("$D
+MA``$)`(``Z2"``*5`@`4I((`#)4"`!:D@@`.E0(`&*2"`!`E*0`!E,(`!`$B
+M$"H40/]T)`4`&B0"``$#X``()[T`"">]_HBOOP%TK[X!<*^W`6ROM@%HK[4!
+M9*^T`6"OLP%<K[(!6*^Q`52OL`%0`("@):^E`7PD$P%0KZ`!3"0"``&/HP%,
+M$&(`,0``D"4H8@`"$$``!20"``(08``'CZ,!?!```1T``!`E$&(`/X^C`7P0
+M``!3```0)91B`!800`$0*D(`"A!``%$GI``H/!4```)@*"4F<P`!CH(!H`*`
+M("4`0/@))Z8!2!!``0N3I0%)$*``12:Q%<`"(/@)CZ0!?``2&$`GL``0`@,8
+M(:1B``"7H@%(``(J`A"@`#LF4@`!`B#X"8^D`7P`$AA``@,8(:1B```F4@`!
+M*D(`"A1`_^0GI``H$```,CP"``"/HP%\E&(`&A!``.HD90`$``"`)20&`/\G
+MI``0`!`00"1"`5``HA@AE&(``!!&``4`$A!``((0(91C``"D0P``)E(``280
+M``$J`@`#%$#_]``0$$`0```:)Z0`*)1B`!P00`#4)&4`!@``@"4D!@#_)Z0`
+M$``0$$`D0@%(`*(8(91B```01@`%`!(00`""$"&48P``I$,``"92``$F$``!
+M*@(``Q1`__0`$!!`$```!">D`"@0``#&C[\!=">D`"@\`@``)$(```!`^`DD
+M!0$<I[(`/!I``)@``(`E)[8`*"05`!HGO@`L)[<`+B>Q`"H`$!!``L(@(2>C
+M`!``8A@AE&(``*2"``!R%1`"`%8@(91B``"D@@`8`F`H)29S``&.@@&@`H`@
+M)0!`^`DGI@%($$``IG(5(`(`GB@ADZ,!29>B`4@``A!`,$(!``!B&".DHP`8
+M`)8@(9>B`4@``AH"``(3P@`"$@``8A@CI(,`(`)@*"4F<P`!CH(!H`*`("4`
+M0/@))Z8!2!!``)!R%2`"`)XH(9.C`4F7H@%(``(00#!"`0``8A@CI*,`(`"6
+M("&7H@%(``(:`@`"$\(``A(``&(8(Z2#`"@"8"@E)G,``8Z"`:`"@"`E`$#X
+M"2>F`4@00`!Z<A48`@!W("&7H@%(,$(`'Z2"`!@D8P`@`B,@(9>B`4@``A%"
+M,$(`'Z2"```"XQ@AEZ(!2``"$H(P0@`?I&(```)@*"4F<P`!CH(!H`*`("4`
+M0/@))Z8!2!!``&-R%2`")(0`*`/$*"&3HP%)EZ(!2``"$$`P0@$``&(8(Z2C
+M```"Y"`AEZ(!2``"&@(``A/"``(2``!B&".D@P```F`H)29S``&.@@&@`H`@
+M)0!`^`DGI@%($$``3'(5*`(GI@`H`*8@(9.C`4F7H@%(``(00#!"`0``8A@C
+MI(,`,(^C`7R48@``+$)``Q1```QR%2`")*(`*`(B&"$`PA`AE$(``*1B````
+ML1@AEZ(!2``"$@(P0@`_$```"Z1B`!@`D2@AEZ(!2``"&@(``A/"``(2``!B
+M&".DHP`H`*`@)20"``&D@@`8)A```0(2$"H40/]P`!`00(^B`4P``C!`CZ,!
+M?`##$"&40@!HIZ(`/H^B`4P`PC`A``8P@`!F,"$"@"`E)Z4`*#P#```D8QCT
+M`&#X"23&#6000``4CZ,!?(^B`4P``C!``,(P(0`&,(``9C`A`H`@)2>E`"@\
+M`P``)&,:*`!@^`DDQ@UD$$``"(^_`72/H@%,)$(``:^B`4PH0@`#%$#^VR0"
+M``&/OP%TC[X!<(^W`6R/M@%HC[4!9(^T`6"/LP%<C[(!6(^Q`52/L`%0`^``
+M"">]`7@GO?_@K[\`'*^R`!BOL0`4K[``$`"@D"4``(`E/`(``"11````$!!`
+M`%`0(0`"$(`"0A`AC$0-9!"```,``````B#X":Q`#60F$``!*@(``Q1`__2/
+MOP`<C[(`&(^Q`!2/L``0`^``"">]`"``@$@E,*7__Z4E`!25)``6``!`)3""
+M``$D`P`!.$(```!B0`L`!!!",$(``1!```(E`@`!,$C__P`$$((P0@`!$$``
+M`B4"``$P2/__``00PC!"``$00``")0(``3!(__\0H``3```X)20+`&8E*@`"
+M``<80`!F$"&41````2,8(:1D``!PZQ`")$(`&`$B&"&D9````4(0(:1(```D
+MX@`!,$?__P#E$"L40/_R``<80`/@``@`````)[W_J*^_`%2OO@!0K[<`3*^V
+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
+M__^4H@`4$$``.```."4D#@!F)9``!"6-``8EB@`()!D`!"08``$D#P`%``<8
+M0`"C$"&41````8,8(:1D``!P[A`")$(`&`&"&"&D9````@(0(:1+`````$`E
+M```@)7#N,`(`!!!``$00(0`"$,``1A`A)$,`&`&C$"&D1````(D0!S!"``$0
+M0``'`4,8(24"``$P2/__%1@`":1Y```0```'I&\````$$$``1!`A``(0P`!&
+M$"$`2A`AI$``&"2"``$P1/__+((`!!1`_^8`!!!`).(``3!'__^4H@`4`.(0
+M*Q1`_](`!QA`C[````/@``@GO0`()[W_Z*^S`!2OL@`0K[$`#*^P``@`H)`E
+M`,"()30"WJVGH@``IZ(``J>B``2GH@`&``#()98D`!8``&@E)`4``P"M&",`
+M9!`',$(``1!```0`&1!``Z(0(:1#```G.0`!):(``3!-__\MH@`$%$#_]0"M
+M&".60@`4IB(`%#!"__\00`!(``!P)203`&9QTQ`"`D(8(21X`!@`41`AE&,`
+M&*1#`!@3(``Y``!H)20"`&9QPH`")P\`!``-($`#I!`AE$(````"&$``8A@A
+M``,8P`(#&"$`<1@A`(\0(81"``@``A"`I&(`+`'D("&4@@``I&(`(B0(``&4
+M8@`@`0(0*Q!``!TD;``>)8L`!B<*``0EB0`$``@H0`"K."$`X#`E``@@@`"-
+M("$`!"!``(H0(81#`#```QA`E,(`!@!#$"&DX@`(`24P(0"I*"$`BB`AE*/_
+M_I2"``@`8A@AI,,``"4"``$P2/__E8(``@$"$"L40/_I``@H0"6B``$P3?__
+M`;D0*Q1`_\T`#2!`)<(``3!.__^6(@`4`<(0*Q1`_[QQTQ`")`(``8^S`!2/
+ML@`0C[$`#(^P``@#X``()[T`&">]_\"OOP`XK[4`-*^T`#"OLP`LK[(`**^Q
+M`"2OL``@`("@)0"@F"4D`@`$IZ(`&"0"``:GH@`:)`(`":>B`!PD`@`,IZ(`
+M'@``J"4\`@``)$(```!`^`DD!`04`$"`)1(``(H"H!`EEF(`%A!``"R6<@#0
+M/`(``"1"```"`"`E`$#X"20%!!268@!HI@(`%B0"``JOH@`0KZ``%#P"```D
+M0B,@`H`@)0)@*"4"`#`E`$#X"0)`."400`!N`````"9Q#6268@!HIF(->CP"
+M```D0BG4`B`@)0!`^`D"`"@E/`(``"1"*S`"@"`E`@`H)0!`^`D"(#`E$$``
+M7@````"6`@`:``(00`!=$"&40P`6E@(`%'!#(`(`DI`A)E(`!99B`!H00``L
+M/`(``"1"```"`"`E`$#X"20%!!268@!JI@(`%B0"``2OH@`0)`(``:^B`!0\
+M`@``)$(C(`*`("4"8"@E`@`P)0!`^`D"0#@E$$``0``````F<1%XEF(`:J9B
+M$8X\`@``)$(IU`(@("4`0/@)`@`H)3P"```D0BLP`H`@)0(`*"4`0/@)`B`P
+M)1!``#``````E@(`&@`"$$``71`AE$,`%I8"`!1P0R`"`)*0(292``*68@`<
+M$$``)#P"```D0@```@`@)0!`^`DD!004EF(`;*8"`!8D`@`$KZ(`$"0"``*O
+MH@`4/`(``"1"(R`"@"`E`F`H)0(`,"4`0/@)`D`X)1!``!(`````)G$5C)9B
+M`&RF8A6B/`(``"1"*=0"("`E`$#X"0(`*"4\`@``)$(K,`*`("4"`"@E`$#X
+M"0(@,"400``"`````"05``$2```$/`(``"1"````0/@)`@`@)0*@$"6/OP`X
+MC[4`-(^T`#"/LP`LC[(`*(^Q`"2/L``@`^``"">]`$`GO?_`K[\`/*^^`#BO
+MMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"@D"660@``+$)``!1`
+M``H`@)@EED,`+B0"``$48@`&/`(``"1"'/0`0/@)`````!```+Z/OP`\ED(`
+M`"Q"4``40``+``"X)99#`"XD`@`"%&(`!SP"```D0BSP`F`@)0!`^`D"0"@E
+M$```L(^_`#R60P``+&,P`R0$`0`D`@%0`$"()20"``$2X@`0`(.("RKB``(0
+M0``%)`(``A+@``<F,0`%$```H```$"42X@`.```0)1```)V/OP`\EE4!=B90
+M`7@0```.)E8!8I9"`!H00`"1)C$`-Y95`X`F4`0^$```!R96`XB60@`<$$``
+MBB8Q`$:650.`)E`#HB96`X(2H`"%``"@)3P"```D7A5``!000`!6$"&40@``
+MI@(```(@*"4F,0`!CF(!H`)@("4`0/@))Z8`$!!``'R/OP`\EZ(`$``"$H*F
+M`@`$EZ(`$``"$0(P0@`_I@(``I>B`!```A"`,$(`/Z8"`!X"("@E)C$``8YB
+M`:`"8"`E`$#X"2>F`!`00`!HEZ,`$``#&X*6`@`>`$,0):8"`!Z7H@`0``(2
+M`C!"`#^F`@`@EZ(`$``"$((P0@`_I@(`(I>B`!```A$`,$(`/Z8"`"0"("@E
+M)C$``8YB`:`"8"`E`$#X"2>F`!`00`!0EZ,`$``#&P*6`@`D`$,0):8"`"27
+MH@`0``(1@C!"`#^F`@`FEZ(`$#!"`#^F`@`H`B`H)28Q``&.8@&@`F`@)0!`
+M^`DGI@`0$$``/H^_`#R7H@`0``(2@J8"`"J7H@`0``(1`C!"`#^F`@`LEZ(`
+M$``"$(`P0@`_I@(`+@(@*"4F,0`!CF(!H`)@("4`0/@))Z8`$!!``"J7HP`0
+M``,;@I8"`"X`0Q`EI@(`+I>B`!```A(",$(`/Z8"`#"7H@`0``(0@C!"`#^F
+M`@`R`D`@)98%``*6!@`$`\#X"28'``B6`@`&$$``#@``("4F!0`&)`8`,@`$
+M$$`D0@`8`*(0(81#``!P9A@"I$,``"2$``&6`@`&`((0*A1`__<`!!!`)I0`
+M`0*5$"H40/]_)A``-";W``$JX@`#%$#_4R0"``&/OP`\C[X`.(^W`#2/M@`P
+MC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?_`K[\`/*^^`#BO
+MMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"`N"4`H)`E``"H)99"
+M```L0D``%$``!"0$`0"60@`D$```!B11_ZN60@``+$(P`R0#`5``8(@E`(*(
+M"R0"``$2H@`.*J(``A!```@D`@`")C$`5206``@F4`3<$J``%B93!-H0``!Z
+M```0)1*B``L``!`E$```=X^_`#R60@`:$$``;P`````F,0!E)!8``B90!4X0
+M```()E,%3)9"`!P00`!G`````"8Q`&DD%@`#)E`%+B93!2RF8```$L``8```
+MH"4\`@``)%X6(`(@*"4F,0`!CN(!H`+@("4`0/@))Z8`$!!``%N/OP`\ED(`
+M`"Q",`,40``$EZ(`$``"$@(0```#I@(`"``"$D*F`@`(E@4`"!"@`$8`````
+M%J``!P)`("4\`P``)&,5P`!@^`D"0"`E$```!*8"``@#P/@)E@4`"*8"``B6
+M0@``+$(P`Q1```F7H@`0``(0@C!"`#^F`@`&EZ(`$``"$0`P0@`_$```"*8"
+M``0``A#",$(`/Z8"``:7H@`0``(0P#!"`#^F`@`$`B`H)28Q``&.X@&@`N`@
+M)0!`^`DGI@`0$$``*8^_`#R60@``+$(P`Q1```V7HP`0``,;`I8"``0`0Q`E
+MI@(`!)>B`!```A&",$(`/Z8"``*7H@`0,$(`/Q````VF`@````,;0I8"``0`
+M0Q`EI@(`!)>B`!```A'",$(`/Z8"``*7H@`0``(00C!"`#^F`@``EF(``"1"
+M``&F8@``)I0``0*6$"H40/^D)A``"B:U``$JH@`#%$#_<"0"``&/OP`\C[X`
+M.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?_`
+MK[\`/*^^`#BOMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"`H"4`
+MH/`EE\(``"Q"0``40``$)]$%9)?2`"00```')E(`&I?"```L0C`#)`0!;R0#
+M`;\`8)`E`(*0"Y?"`0000`#JKZ``%(^C`!0``Q!``%X0(91"`0840``()D0`
+M")?"```L0C`#)D,`!P"`D"4`8I`+$```U28Q`$"7P@``+$(P`Q1``"\"0"@E
+M``"8)292``&.@@&@`H`@)0!`^`DGI@`0$$``T@`3&,``<1@AEZ(`$``"$@*D
+M8@``DZ(`$:1B``@F<P`"*F(`"!1`__`"0"@E``"8)0)`*"4F4@`!CH(!H`*`
+M("4`0/@))Z8`$!!``+\`$R#``)$@(9>C`!```Q(",$(`/Z2"``(``Q.",$(`
+M`:R"``27H@`0,$(`/Z2"``H``QF",&,``29S``(J8@`(%$#_Z*R#``P0``"`
+M``"8)292``&.@@&@`H`@)0!`^`DGI@`0$$``I0*`("67H@`0``(:0J8C````
+M`A"",$(`?Z8B``B7H@`0``(10#!"`'^F(@`0`D`H)292``&.@@&@`$#X"2>F
+M`!`00`"4EZ,`$``#(L*6(@`0`$00):8B`!```QD",&,`?Z8C`!B7H@`0``(0
+MP#!"`'^F(@`@`D`H)292``&.@@&@`H`@)0!`^`DGI@`0$$``@9>C`!```R-"
+MEB(`(`!$$"6F(@`@``,9@C!C`'^F(P`HEZ(`$``"$$`P0@!_IB(`,`)`*"4F
+M4@`!CH(!H`*`("4`0/@))Z8`$!!``&Z7HP`0``,CPI8B`#``1!`EIB(`,``#
+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
+M*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``BL`%!A``'4@(9>B`!```A("I((`
+M.`!S&"&3H@`1I&(`0`(`*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``AP`%!A`
+M`'$@(9>B`!```A("I((`2@"`&"63H@`1I&(`4`(`*"4F$``!CD(!H`)`("4`
+M0/@))Z8`$!!``@T"D1@AEZ(`$``"$@*@8@!9`!000"1"`%@"8B`ADZ,`$3!B
+M`(`00``#I(,``#1B_P"D@@```@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`!
+M^0`4($``D2@AEZ,`$``#$4(P0@#_I*(`8B2$`&@")!`A``,80C!C``^D0P``
+M`J0@(9>B`!`P0@`!I((``)8B```L0D``%$``#@`````2@``%EZ(`$!*7``<`
+M````$```"98B`````A-",$(``1````2F(@`F``(30C!"``&F(@`HEB(``"Q"
+M,`,40``M`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`!SY>C`!``%!!``%40
+M(0`#&8(P8P!_I$,`L"0"``$2@@`+*H(``A!```4`````$H``%P`````0```9
+MEB(``!*7``L`````$```%98B``"7H@`0,$(`!Z8B`/R7H@`0``(0PC!"``<0
+M```,IB(!`)>B`!`P0@`'IB(`_I>B`!```A#",$(`!Q````2F(@$"EZ(`$#!"
+M`#^F(@`2EB(``"Q",`040``L`!000``4&$``<Q@AEZ(`$``"$T*D8@"X`@`H
+M)280``&.0@&@`D`@)0!`^`DGI@`0$$`!F0`4($`DA`"X`F0@(9>C`!```QC`
+M,&,`.)2"````0Q`E%I<`":2"``"7HP`0``,0PJ(B`"*6(@``+$)`!A1```(`
+M`Q+"IB(`+!:``!$`````EB(``"Q"0``40`#QEZ,`$``#$@(P0@`_IB(!1@`#
+M&,(P8P`?$```!J8C`4H`4Q`A)`,`"J1#`+@D`@`/HB(`(I8B```L0D``%$``
+MX20"``$2@@`+*H(``A!```4`````$H``H0`````0``#:)I0``1*7`"4"`"@E
+M$```UB:4``$"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`%>`B`@)0+`^`F3
+MI0`1IB(!5)>E`!`"("`E`L#X"0`%*@*F(@%6CD(!H`)`("4"`"@E`$#X"2>F
+M`!`00`%/`B`@)0+`^`F3I0`1IB(!6)8B```L0D`!%$``MY>B`!```A(",$(`
+M/Q```+.F(@#$)A```8Y"`:`"0"`E`$#X"2>F`!`00`$]`B`@)0+`^`F3I0`1
+MIB(!3I>E`!`"("`E`L#X"0`%*@*F(@%0`@`H)280``&.0@&@`D`@)0!`^`DG
+MI@`0$$`!+0(`*"67H@`0,$(`?Z8B`!"7H@`0``(1PC!"`#^F(@`4)A```8Y"
+M`:`"0"`E`$#X"2>F`!`00`$?`B`@)0+`^`F3I0`1IB(!4I8B```L0D`!%$``
+M!0(`*"67H@`0``(2`C!"`#^F(@#&)A```8Y"`:`"0"`E`$#X"2>F`!`00`$.
+MC[\`/)>B`!```A%",$(`/Z8B`4B7H@`0,$(`'Z8B`4R6(@``+$)``A1``'$"
+M`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`#\C[\`/).B`!&F(@`JEB(``"Q"
+M4``40`!DEZ,`$``#$@(P0@!_IB(`U@`#&\*F(P#:`@`H)280``&.0@&@`D`@
+M)0!`^`DGI@`0$$``Z)>C`!`P8P`?``,80)8B`-H`0Q`EIB(`VI>C`!```Q%"
+M,$(`/Z8B`.(``QK"HB,`W8Y"`:`"0"`E`@`H)0!`^`DGI@`0$$``UX^_`#R3
+MH@`1,$(`!P`"$4"2(P#=`&(8):(C`-V7H@`0``(0PA```#NB(@#?EB(``"Q"
+M0`$40``W`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$``PH^_`#R7H@`0,$(`
+M/Z8B`,*6(@``+$)0`!1``"F7HP`0``,1@C!"`'^F(@#4``,;0J8C`-@"`"@E
+M)A```8Y"`:`"0"`E`$#X"2>F`!`00`"MEZ,`$#!C``<``QC`EB(`V`!#$"6F
+M(@#8EZ,`$``#$,(P0@`_IB(`X``#&D*B(P#<CD(!H`)`("4"`"@E`$#X"2>F
+M`!`00`"<C[\`/).B`!$P0@`!``(1P)(C`-P`8A@EHB,`W)>B`!```A!"HB(`
+MWB:4``$J@@`#%$#]F``4$("6(@``+$(P`Q!``!TD`@`$CD(!H`)`("4D!0#L
+M`$#X"2>F`!`00`"#`D`@)9>B`!`P0@`'IB(`_)>B`!```A#",$(`!Z8B`0".
+M0@&@)`4`[0!`^`DGI@`0$$``=X^_`#R7H@`0,$(`!Z8B`/Z7H@`0``(0PC!"
+M``>F(@$")`(`!*8B`6`D`@`!IB(!7J8B`5RF(`%:C]``%)8B`0000``6``"@
+M)28S``8"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`!<`!080`!S("&7H@`0
+M``(2`J2"`0``@!@EDZ(`$:1B`0(FE``"EB(!!`*"$"H40/_N`@`H)98B```L
+M0E`#%$``&P```````*`E)C,`!HY"`:`"0"`E`@`H)0!`^`DGI@`0$$``0Y>C
+M`!``%!"``%,0(:1#`XB.0@&@`D`@)28%``4`0/@))Z8`$!!``#F7HP`0`!00
+M@`!3$"&D0P.*)I0``2J"``440/_I)A```98B```L0C`#$$``"B0"_\JF(@!<
+M)`+__Z8B`%ZF(@!@)`(`#Z8B`$0D`@`<IB(`1J8B`$B6(@``+$)``!1```D"
+M0"`ECD(!H"0%`,H`0/@))Z8`$!1```F/OP`\$```&X^^`#B.0@&@)`4`SP!`
+M^`DGI@`0$$``%(^_`#R7H@`0IB(`&)8B`!840``.)`(``98B```L0D``%$``
+M!@````"6(@`8``(2PC!"``$0```$IB(`%I8B`!@``A/"IB(`%B0"``&/OP`\
+MC[X`.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`G
+MO?_@K[\`&*^Q`!2OL``0`("`)3P"```D0CH<`$#X"0"@B"400``7`@`@)3P"
+M```D0A98`$#X"0(@*"400``1`@`@)3P"```D0B^@`$#X"0(@*"400``+`@`@
+M)3P"```D0C,D`$#X"0(@*"400``%`@`@)3P"```D0C70`$#X"0(@*"6/OP`8
+MC[$`%(^P`!`#X``()[T`(">]_^BOOP`0`*`8)91B```L0D``%$``"8^_`!"4
+M8P`N)`(``11B``4\`@``)$(A_`!`^`D`````C[\`$`/@``@GO0`8````````
+M````````E(,``)2B```48@`'`````)2"``(P1,'PE*(``C!"P?`0```#`((@
+M(Y2$````@B`C`^``"`"`$"64@@((`^``"#!"O_\``"@E``40P`!$$"&,0P``
+MC$(`!`!B&"448``&```0)22E``$HH@`"%$#_]@`````D`@`!`^``"``````G
+MO?_HK[\`$#P"```D0DEH`$#X"0``````0"@E,**``!!``!$``"`E,*5__SP"
+M```D1AJ8``00@`!$$"$``A"``$80(91#```090`3)`(``22$``$L@@"#%$#_
+M]@`````0```-```0)3P"```D1A$X``010`!&$"&40P``$&4`!B0"``$DA``!
+M+((`2Q1`__D`!!%````0)8^_`!`#X``()[T`&">]_^BOOP`4K[``$#"P__\2
+M```E)`(``3P"```D0DEH`$#X"0``````0"@E,*.``#P"__\T0G__`*(0)`("
+M$"848``9+$(``3BB`?\L0@`!+*,``0!#$"440``3)`(``0``("4\`@``)$8:
+MF``$$(``1!`A``(0@`!&&"&48@``%@(`!`````"48P`"$&4`!B0"``$DA``!
+M+((`@Q1`__0`!!"````0)8^_`!2/L``0`^``"">]`!@GO?_@K[\`'*^R`!BO
+ML0`4K[``$`"@B"6,@@&<`$#X"0#`D"4`0(`E,@(`0A!```<R`@`@CB(`"!1`
+M``0R`@`@)`+_O0("@"0R`@`@$$``!S("``B.(@`,%$``!#("``@D`O_?`@*`
+M)#("``@00``',@(``8XB``040``$,@(``20"__<"`H`D,@(``1!```<\`@``
+M)$))=`!`^`DF1``@$$```B0"__X"`H`D`@`0)8^_`!R/L@`8C[$`%(^P`!`#
+MX``()[T`(">]_V"OOP"<K[(`F*^Q`)2OL`"0`("0)0``B"4\`@``)$),Z`!`
+M^`DPI/__`$"`)1(```\\`@``)$).?`)`("4"`"@E-`;_?P!`^`DGIP`0$$``
+M!SP"```D0DL,`D`@)0(`*"4`0/@))Z8`$`!`B"4"(!`EC[\`G(^R`)B/L0"4
+MC[``D`/@``@GO0"@)[W_Z*^_`!2OL``0/`(``"1"26@`0/@)`("`)0!`&"4D
+M`@`2$&(`%"0"``$H8@`3$$``!0`````08``*```0)1````Z/OP`4)`(!_Q!B
+M``4T`H-*%&(`!R0"``$0```'C[\`%)8$`@HD`P-*$(,``B0"``$``!`EC[\`
+M%(^P`!`#X``()[T`&#"$__\``"@E/`(``"1&&I@`!1"``$40(0`"$(``1A`A
+ME$,``!!D``4`````)*4``2RB`(,40/_V```0)0/@``@`````)[W_X*^_`!BO
+ML0`4/`(``"1"26@`0/@)K[``$`!`B"4R(H``$$``!S(P?_\\`@``)$),Z`!`
+M^`D"`"`E%$``$@(`$"4``"`E/`(``"1%$3@`!!E``&40(91"```440`%`&40
+M(91#`!@48``'`&`0)20$`$LDA``!+((`2Q1`__4`!!E````0)8^_`!B/L0`4
+MC[``$`/@``@GO0`@)[W_Z*^_`!``H#@E```8)3P"```D1B38/`(``"1(````
+M`Q'``$8H(92B```41``()&,``1#@``0D8___`.`@)0$`^`DD!@"`$```!20"
+M``$L8@`Q%$#_\P`#$<```!`EC[\`$`/@``@GO0`8```H)3P"```4@``#)$81
+M.`/@``@``!`E``410`!&$"&40P``$&0`!B0"``$DI0`!+*(`2Q1`__@`````
+M```0)0/@``@`````)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`DK[0`(*^S`!RO
+ML@`8K[$`%*^P`!``@/`E`*"H)0#@L"4PU___``"`)0``B"4``)@EEJ(``!1`
+M`!L``*`E/`(``"1"26@`0/@)``````!`D"4R0H``%$``$3P"```D0DW(`D`@
+M)0!`^`D``"@E%$``#@)`("4\`@``)$).-`!`^`D"0"`E$$```P`````0```&
+M`D`@)1````26I``"$````I:D``*6I``",(+_`!1``$<\`@`````P)0``."4\
+M`@``)$41.``&$4``11@AE&(``!1$``,``````&"8)20'``$DQ@`!+,(`2RSC
+M``$`0Q`D%$#_]0`&$4`0X`!)```0)3+B`(`40``$``"`)99D``(0```#CG$`
+M")9D``2.<0`,```P)0``."4\`@``)$D`7#P"```D2`!@``80P`!&$"$``AB`
+M`&DH(92B```41``'`&@0(8_#`=B,0@``%&(``P``````H*`E)`<``23&``$L
+MP@`"+.,``0!#$"040/_O``80P!#@`!`RX@"`%$``"```$"6.@P`(`@*`)`(C
+MB"2.@P`,`@*`)1````<"(X@ECH,`$`("@"0"(X@DCH,`%`("@"4"(X@E/`(`
+M`"1"3<@`0/@)`L`H)1!``!*/OP`TCL(`$([#`!2.9``0CF4`%`!$$"0`91@D
+MKL(`$*[#`!26H@`",$+_``(P&"4L0@`!``,0"A!```,D`@`!KM$`&(^_`#2/
+MO@`PC[<`+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`.``$
+M-\,`!C:"`(8P(0`&,8,`!A&``((@(R0"```D`P`!``0^@`3A``0``````(-`
+M!!````<``$@E$.``!`""0`0`!#@C`.,X!@$'0"4`@T@$`0`0)0$@&"4`!C#`
+M`,4P(8S$``",Q0`$`$00)`!E&"0`8A`E`^``"``"$"LPYP#_$.``%P"`&"40
+MH``/```@)9!B```01P`2`````!!```H`````)(0``0"%$"L00``&`&00(9!"
+M```01P`)`````!1`__@`````$(4`!0!D$"&@1P``C,(``"1"``&LP@```^``
+M"``````GO?Y@K[\!G*^^`9BOMP&4K[8!D*^U`8ROM`&(K[,!A*^R`8"OL0%\
+MK[`!>`"`\"6OI0&DKZ8!J*^G`:R/L@'$E[`!OI>B`<*OH@%8)`,;6*^C`6`G
+MQ0(PKZ4!9#P"```D0DFP`$#X"0``B"400`&@C[\!G#P"```D0DTL`$#X"0/`
+M("6GP@(*,$+__Q1```L\`@``/`(``"1"2E0#P"`E`$#X"0(`*"400`&1C[\!
+MG#("/_^GP@(*/`(``"1"7[``0/@)`\`@)3P"```D0DSH`$#X"9?$`@H`0(`E
+M$@`!@P/`("4\`@``)$).?`(`*"4T!O]_`$#X"2>G`!`00`%[`\`@)3P"```D
+M0DY\`@`H)20&`(``0/@))Z<`D!!``72/OP&<CZ0`&(^E`!PD`@``)`,`!0""
+M$"0`HQ@D`&(0)20&``$`PH@+)`(``"0#``(`@B`D`*,H)`"D("4D`@`"`$2(
+M"X_"`@P2(@`"/`(``*_1`@PD0DL,`\`@)0(`*"4`0/@))Z8`$!9```.OH@%<
+MEA``$*^P`6"/I@&H+,,`020"`$``0S`*KZ8!J(_"`>```CJ",.<``:^G`6P`
+M`A)",$(``:^B`6@\`@``)%<"`#P"```D0@(8`N(0*Q!``0@``*@EEN(``(^H
+M`5@`2!`D$$``_`````"6X@``CZ,!7`!#$"000`#W)Z8!$(_"`9@#P"`EEN4`
+M`@!`^`DGIP$2$$``\"0"``26XP``$&(`)2AB``400``()`(`("0"``$08@`9
+M)`0``A!D`!`\!0``$```Y2;W``008@`I*&(`(1!```8D`@!`)`(`"!!B`!T\
+M`@``$```W";W``008@`H/`8``!```-@F]P`$)[(`$">T`$`DI0=8KZ4!<))"
+M``(0```E-%,``R>R`!`GM``P/`(``"1""IBOH@%P$```'I)3``(GL@"0)[0`
+MX#P"```D0@0XKZ(!<))"``(0```6-%,``2>R`)`GM`#P)$(!F*^B`7"20@`"
+M$```#S13``(GL@"0)[0!`#P"```D0@#XKZ(!<))"``(0```'-%,`!">R`!`G
+MM`!0),8'6*^F`7"20@`"-%,`!#P'```DYTET`.#X"0*`("440`"F````````
+ML"4"P"`E/`@``"4(4.0!`/@)`H`H)1!``)H`%A%`CZ,!<`!B@"&/I`&PCZ4!
+MM(^F`;@\"```)0A18`$`^`F2!P`8EA$``)8"``(`41`K%$``C)>B`1`"(A`K
+M%$``@I>B`1(`41`K%$``?X^E`6R2!``&.(,`"BRB``$``Q`+%$``>8^F`6@X
+M@P`%+,(``0`#$`L40`!TCZ<!8)(#``<"(Q@A``,80R3B``H`0Q`J%$``;8^H
+M`:@"J!`K$$``?(^E`<B.`@`0C@,`%``"'\(LI``!`(,@)!2``&,``!`ECD(`
+M&#!"`(`00``$)`(`!H_#`=P08@!<`````">D`1@\!@``),8```#`^`DD!0!`
+MI[$!&);D``*GI`$:D@,`!B0"``408@`%)`(`"A1B``8T@D``$```!*>B`1J7
+MH@$:-$*``*>B`1J2`@`$HZ(!'9("``6CH@$RCD(`&*^B`32OLP$XC@(`$(X#
+M`!2.1``0CD4`%`!$$"0`91@D`&(0)1!```27H@$:-$("`!````.GH@$:,$+]
+M_Z>B`1J.`@`(C@,`#(Y$``B.10`,`$00)`!E&"0`8A`E$$```R0'``(0```"
+MHZ<!'*.@`1R.`@`(C@,`#(Y$``B.10`,`$00)`!E&"0D!```)`4``@!$$"0`
+M91@D`&(0)1!```.3H@$<-$(`"*.B`1R.0@`8,$(`0!!```0`````DZ(!'#1"
+M``2CH@$<`!41@(^H`60`2!`A)Z,!&">D`5B,90``C&8`!(QG``B,:``,K$4`
+M`*Q&``2L1P`(K$@`#"1C`!`49/_V)$(`$":U``&2`@`'`B(0(3!1__^6`@`"
+M`%$0*Q!`_W:7H@$0)M8``2K"`(`40/]=`````";W``0\`@``/`(``"1"`A@"
+MXA`K%$#^^@`````2H``U+J,`020"`$``0Z@*/`(``"1"6X2/I`%D`J`H)20&
+M`$`\!P```$#X"23G23"OU1(P&J``$P``*"4`!2#`CZ(!I`""("$`!1F`CZ8!
+M9`!F&"&48@``I((``)1B``*D@@`"D&(`!*""``208@`%H((`!22E``$`M1`J
+M%$#_\``%(,"/P@&\`\`@)8^E`:0`0/@)`J`P)1J@``\``"@E``4A@(^G`60`
+MAR`A``48P(^H`:0`:!@AD&(`!J""``:08@`'H((`!R2E``$`M1`J%$#_]``%
+M(8"/H@&LK%4``)?"`@JGP@`8`!40*X^_`9R/O@&8C[<!E(^V`9"/M0&,C[0!
+MB(^S`82/L@&`C[$!?(^P`7@#X``()[T!H)2B``*,AA(T$,``$3!(P?"4PP``
+ME*(``!1B``XDAP(PE,,``C!BP?`42``*`````)#"``0P0@`!$$```S!C``(4
+M8``E```0)0/@``@`P!`E)(<",(R$$C`0@``?```0)92E````!!!#``(1@`#B
+M,"&4P@```*(0(Q1``!``````E,,``C!BP?`42``)`````)#"``0P0@`!$$``
+M`S!C``(48``-```0)0/@``@`P!`EE,(``C!"P?`!`A`C&$```P`````DQP!`
+M)(3__P`$($,4@/_D```0)0/@``@`````)[W_Z*^_`!2OL``0/`(``"1"````
+M0/@)`,"`)1!```D`````@$(`&@`"$$`"`A`C``(6```"%@,H0P``$````@`#
+M$`L``!`EC[\`%(^P`!`#X``()[T`&">]_]BOOP`@K[,`'*^R`!BOL0`4K[``
+M$`"`B"4`H)@EEB(""A1``"4D$`#_/`(``"1226@"0/@)`````#!"`/`D`P!@
+M$$,`!@`````"0/@)`B`@)20#`9D40P`9/`(``)9B``(P0@"@)`,`H!!#`"8D
+M$`#AEF(``C!"`-`D`P#`$$,`(200`.*68@`",$(`T"0#`-`00P`<)!``Y)9B
+M``(P0@%0)`0`X"0#`.,X0@%0`&"`)1```!0`@H`+/`(``"1"```"("`E`$#X
+M"0)@*"400``-)`,`P(Q0`""68@`",$(`P!1#``D"`!`E,@,`#R0"``$48@`%
+M`@`0)20"__`"`H`D-A```@(`$"6/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@G
+MO0`H)[W_Z*^_`!`\`@``)$(```!`^`D``````$`8)1!@``0``!`EC&(`'``"
+M$((P0@`!C[\`$`/@``@GO0`8)[W_T*^_`"ROM@`HK[4`)*^T`""OLP`<K[(`
+M&*^Q`!2OL``0`,"@)0#@L"4`@*@E)+/__Q)@`!L"M)`A`K(0*Q!``!4"0(@E
+M`C2`(P(`("4"P/@)`B`H)1A```\``````B`@)0*`*"62`P``D((``*("```F
+M$``!H(,``"2E__\4H/_Y)(0``0(TB","L1`K%$#_[0`````F<___%F#_YP)4
+MD"&/OP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`P)[W_
+MV*^_`""OL0`<K[``&`"`@"4"`(@EC@(!H"0%`,$`0/@))Z8`$!!``!:7HP`0
+M+&-``"0&`,\D!0#*CB(!H`(@("4`PR@+`$#X"2>F`!(00``-C[\`()>B`!`L
+M0D``%$``!9>B`!(``A+",$(``1````.N`A(\``(3PJX"$CR.`A(\C[\`((^Q
+M`!R/L``8`^``"">]`"@GO?_HK[\`%*^P`!`\`@``)$)):`!`^`D`@(`E`$`8
+M)20"`$@08@`P/`(``"AB`$D00``/-`*!C2AB`$(00``()`(`0RAB`$`00``G
+M/`(``!!@`!H``!`E$```*H^_`!008@`@`````!```"4``!`E`$,0*A1```TT
+M`H&/-`*!B`!B$"H00``8/`(``"AB`$T00``;```0)2AB`$H40``7/`(``!``
+M`!$D0EQ0%&(`$SP"```0```-)$)<4)8#`@HH8@&(%$``#@``$"4H8@&.%$``
+M!3P"```D`@&/%&(`!P`````\`@``)$)<4`!`^`D"`"`E$````X^_`!0``!`E
+MC[\`%(^P`!`#X``()[T`&">]_]BOOP`DK[(`(*^Q`!ROL``8`("0)3"Q__\"
+M0(`EC@(!H"0%`,$`0/@))Z8`$!!``"0\`@`````@)21%`*0\`@``)$8`ICP"
+M```D1P"H/`(``"1(32P`!!!``$00(0`"&$``91`AE$(``!11`!(DA``!)(3_
+M_Y>B`!`L0E`#$$```P!F$"$0```&E$(````$$$``1!`A``(00`!'$"&40@``
+MI@(""`$`^`D"0"`E$```!*8"`@HL@@`.%$#_YP`$$$"/OP`DC[(`((^Q`!R/
+ML``8`^``"">]`"@GO?_8K[\`)*^R`""OL0`<K[``&`"`D"4PL?__`D"`)8X"
+M`:`D!0#!`$#X"2>F`!`00``D/`(`````("4D10`P/`(``"1&`#(\`@``)$<`
+M-#P"```D2$TL``000`!$$"$``AA``&40(91"```440`2)(0``22$__^7H@`0
+M+$)0`Q!```,`9A`A$```!I1"````!!!``$00(0`"$$``1Q`AE$(``*8"`@@!
+M`/@)`D`@)1````2F`@(*+((`!Q1`_^<`!!!`C[\`)(^R`""/L0`<C[``&`/@
+M``@GO0`H)[W_X*^_`!BOL0`4K[``$`"`@"4\`@``)$)<Z`!`^`D"`(@E$$``
+M$X^_`!B.`@'D,$(``1!```\`````E@4""!"@``8\`@``)$)=^`!`^`D"`"`E
+M$```!X^_`!@\`@``)$)>U`(`("4`0/@)EB4""H^_`!B/L0`4C[``$`/@``@G
+MO0`@````````````````)[W_R#P"DD@T0OP`KZ(`$).C`!`GI0`0D*(``0`"
+M$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``8A@EC((`%*Q#0(`\`B22-$))
+M)*^B`!23HP`4)Z4`%)"B``$``A(``&(8)9"B``(``A0``&(8)9"B``,``A8`
+M`&(8)8R"`!2L0T"`/`(H`#1"`#FOH@`8DZ,`&">E`!B0H@`!``(2``!B&"60
+MH@`"``(4``!B&"60H@`#``(6``!B&"6,@@`4K$-`@#P"4Q8T0@@DKZ(`').C
+M`!PGI0`<D*(``0`"$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``8A@EC((`
+M%*Q#0(`\`N68-$(%>:^B`""3HP`@)Z4`()"B``$``A(``&(8)9"B``(``A0`
+M`&(8)9"B``,``A8``&(8)8R"`!2L0T"`/`(`'31"[_^OH@`DDZ,`)">E`"20
+MH@`!``(2``!B&"60H@`"``(4``!B&"60H@`#``(6``!B&"6,@@`4K$-`@#P"
+M&JHT0KY`KZ(`*).C`"@GI0`HD*(``0`"$@``8A@ED*(``@`"%```8A@ED*(`
+M`P`"%@``8A@EC((`%*Q#0(`\`KX0-$)55*^B`"R3HP`L)Z4`+)"B``$``A(`
+M`&(8)9"B``(``A0``&(8)9"B``,``A8``&(8)8R"`!2L0T"`/`(`#C1",`>O
+MH@`PDZ,`,">E`#"0H@`!``(2``!B&"60H@`"``(4``!B&"60H@`#``(6``!B
+M&"6,@@`4K$-`@*^@`#23HP`T)Z4`-)"B``$``A(``&(8)9"B``(``A0``&(8
+M)9"B``,``A8``&(8)8R"`!2L0T"$`^``"">]`#@GO?_8K[\`((R"`!0T`X``
+M`$,0(20#'!:L0QC0```8)30&@``\!0`!C((`%`!&$"&L11B`)&,``2AB``@4
+M0/_Z`````(R"`!0T`X```$,0(8Q$'```!"8"``09`C"$``\`!"$`/`(``"1"
+M````9"`E`$#X"20%``B/OP`@`^``"">]`"@GO?^(K[\`<`"`8"4!@#@E)`+_
+MR:^B`!"OH@`4KZ(`&*^B`!PD`O_"KZ(`("0"__*OH@`HKZ(`+*^B`#"OH@`T
+M)`+_]*^B`#@D`O_`KZ(`0*^B`$2OH@!(KZ(`3"0"_[JOH@!0)`+_LJ^B`%BO
+MH@!<KZ(`8*^B`&0D`O^PKZ(`:```*"4GJP`0).8`!">J`"@GJ0!`)Z@`6``%
+M&(``9R`A`6,0(8Q"``"L@D8H`&8@(0%#$"&,0@``K()&.`!G("$!(Q`AC$(`
+M`*R"1E``9B`A`0,8(8QB``"L@D9@)*4``2BB``440/_L/`(``"1"```!@"`E
+M`$#X"20%``&/OP!P`^``"">]`'@`!2A``*8H(0`%*$``I"@A`^``")2B%?XG
+MO?_0K[\`**^U`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`@"4`P)`E`."8)8^T
+M`$`PM?__/!$``"8Q```\!0``)*4"(`(@^`DD!A)PKA(`#*X3`!"N%``4IA4!
+MR*8``<HD`@`_I@(!_*X``@"N`"^\K@`OP#P""`"N`B_,)`('@:X"+]2N`"_<
+M/`(`/S1"/S^N`B_@)`(`9*X"+^0D`@`"K@(OZ"0"__^N`B_XK@(O_*X",``F
+M!"P\/`4``"2E%*`"(/@))`8`!J(`,`2/OP`HC[4`)(^T`""/LP`<C[(`&(^Q
+M`!2/L``0`^``"">]`#`PA`#_,*4`_P``,"4\`@``)$D4J#P"```D2!2I/`(`
+M`"1'%*H`!A!``$88(0!I$"&00@``%$0`"0!H$"&00@```*(0*Q1```4`9Q`A
+MD$,```!E&"L08``%)`(``23&``$LP@`$%$#_[P``$"4#X``(`````">]_X"O
+MOP!\K[8`>*^U`'2OM`!PK[,`;*^R`&BOL0!DK[``8`"@D"4`P)@E`."()8^V
+M`)`PD/__/`(``"1"````0/@))`1&J`!`H"46@``$`@`H)20#``(0``(GKL,`
+M`*^Q`!"OM@`4/`(``"1"```"@"`E`D`P)0!`^`D"8#@E`H"8)3P"```D0@``
+M`H`@)0``*"4`0/@))`8``11```,D`@`#$``""Z^B`%R.8@`4C$)`(*^B`$R3
+MHP!,)Z0`3)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)3!D
+M`/\`!!$"KF(!S#!C``^F8P'0/`(``"1"95B29`'/`$#X"9)E`=$40``$/`(`
+M`"0"``T0``'NKZ(`7"1"```"8"`E`$#X"0``*"440``$-`.``"0"``,0``'E
+MKZ(`7(YB`!0`0Q`AC$(8&*9B`=*.8P',)`(`"1!B``<D`@`*%&(`"CP"``"6
+M8@'0+$(`!!!```8\`@``/`(``"1"8$``0/@)`F`@)3P"```D0@```$#X"0)@
+M("440``#)`(`#A```<NOH@!<CF(!S"Q"``440``>`````(YB`!2,0D`0KZ(`
+M4).C`%`GI`!0D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+M-&,0`*^C`%23HP!4)Z0`5)""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8)8YB`!2L0T`0CF(`%#0#@```0Q`A)`,`!ZQ#&``\`@``)$(```!`
+M^`D"8"`EIF(!U#!#`/`D`@`P$&(`.2AB`#$00``()`(`8"0"`!`08@`T)`(`
+M(!!B`#(`````$```#99B`=008@`N*&(`81!```8D`@"@)`(`4!!B`"D`````
+M$```!)9B`=008@`E`````)9B`=040``B)`(`!8YC`<P48@`'/`(`"8YC`=`T
+M0@!#%&(``R0"`$80```9IF(!U(YB`<PX0P`'+&,``3A"``LL0@`!`&(8)1!@
+M``,D`@!1$```#Z9B`=2.8P',)`0`"A!D``DD`@`)$&(`""0"`&(49``,)`(`
+M"99B`=`L0@`$$$``!20"``HD`@!BIF(!U(YC`<PD`@`*$&(`%R0"``F.8P',
+M$&(`%"0"``H48@`%`````)9B`=`L0@`$%$``#SP"``"68P'4,&(`\"1"_]`L
+M0@!`$$``"3P"```P8@`/+$(`!1!```4\`@``)`(`#1```4JOH@!</`(``"1"
+M```"8"`E)`4`P0!`^`DGI@!(%$``!)>B`$@D`@`($``!/Z^B`%PL0C`"$$``
+M!)>B`$@D`@`%$``!.:^B`%RF@A)PCF(`%(Q"0!"OH@!8DZ(`6#!$`!@`!"#"
+M)`(``A""`!(D`@`#%((`!"0"``DD`@`*$``!*J^B`%R.8P',$&(`"B0"``H4
+M8@`&`````)9B`=`L0@`$%$``!3P"```D`@`*$``!'J^B`%P\`@``)$(```)@
+M("4D!0`_`$#X"2>F`$@40``$EZ(`2"0"``@0``$3KZ(`7*:"$G(\`@``)$(`
+M``)@("4D!0`<`$#X"2>F`$@40``$EZ(`2"0"``@0``$'KZ(`7!!``!&7H@!(
+M,%'_\``1BP`\`@``)$(```)@("4D!0`;`$#X"2>F`$@40``$EZ(`2"0"``@0
+M``#XKZ(`7`(BB"40```")C'_0"01`T```(`E$B``#@``D"4\`@``)%4```)@
+M("4F!0#``J#X"2>F`$@00`#GEZ(`2`)"D"8F$``!`A$0*Q1`__<"8"`E-`+_
+M_Q)"``,D`@`'$```WZ^B`%PD`@`*IH(3YB0"``.F@A7P``"`)20$`#0FA@`&
+M)`,`"W($*`(`IA`AI$,3Z"80``$N`@`*%$#_^W($*`(``(`E/`(``"1+%)`F
+MB``"/`(``"1*%)@D"0`T)H<`#"0%``LFA@`(`!`80`!T("$`:Q`AE$(``*2"
+M%?@`:"`A`&H8(91B``"D@A7P<@D8`@!G$"&D11:H`&88(280``$N`@`#%$#_
+M\*1E%A`\`@``)$(```)@("4`0/@))H42<!1```,D`@`($```K*^B`%R6@A)P
+M+$)0`Q!``!,D!``*CF,!S!!D``DD`@`)$&(`""0"!F@49``,`````)9B`=`L
+M0@`$$$``"``````D`@9HIH(6`"0"!+"F@A8$-`*``*:"%@BF@A7^EH(2BA!`
+M`",D`P`0EF(!U#!"`/`40P`@/`(``(YB`!0T`X```$,0(20#0`>L0Q@`/`(`
+M`"1"````0/@))`0'T#P"```D0@```$#X"0)@("6F8@'6CF(`%#0#@```0Q`A
+M)`,`!ZQ#&``\`@``)$(```!`^`DD!`?0EF(!UC!"`/`D`P`@$$,``R0"``T0
+M``!QKZ(`7#P"```D0@```F`@)20%`+\`0/@))Z8`2!1```27H@!()`(`"!``
+M`&:OH@!<IH(2=*9B`@@\`@``)$(```!`^`D"8"`E%$```R0"``@0``!<KZ(`
+M7(YC`<PD!``*$&0`"@``*"4D`@`)$&(`""0"``T49``(`````)9B`=`L0@`$
+M$$``!``````D`@`-$```&:^B`%R.8@',.$,`!RQC``$X0@`++$(``0!B&"40
+M8``#)`(`#1````^OH@!<EF(!U#!"`/`D0O_0+$(`0!!```,\`@``$````R1"
+M```\`@``)$(```)@("4`0/@))Z4`7`!`*"40H``R`````(Z"+,2N8@'`/`(`
+M`"1"````0/@)`F`@)0``D"4``(`E)!4`'SP"```D40```F`@)0*P*","(/@)
+M)Z8`2!!``!R7H@!(`D*0(0`0&$``="`A``(2`J""+#``@!@EDZ(`2:!B+#$F
+M$``!+@(``Q1`_^\N0P`!/`(``C1"__T"0A`F+$(``0!B&"408``$/`(``"0"
+M``D0```+KZ(`7"1"8T@`0/@)`F`@)1````\"8!`E)`(`"!````.OH@!<)`(`
+M"*^B`%P2@``$/`(``"1"````0/@)`H`@)1+```*/H@!<KL(`````$"6/OP!\
+MC[8`>(^U`'2/M`!PC[,`;(^R`&B/L0!DC[``8`/@``@GO0"`)[W_Z*^_`!2O
+ML``0/`(``"1"````0/@)`("`)8X"+*@00``#``````!`^`D"`"`E/`(``"1"
+M````0/@)`@`@)3P"```D0@```@`@)20%``$`0/@))`8``3P"```D0@```@`@
+M)0!`^`DF!1)P/`(``"1"````0/@)`@`@)8^_`!2/L``0`^``"">]`!@GO?^@
+MK[\`6`"`4"4T`H``KZ(`$#0"F""OH@`4/`)5531"556OH@`@/`*JJC1"JJJO
+MH@`D/`)F9C1"9F:OH@`H/`*9F31"F9FOH@`L``!@)2>X`!`GKP`8)ZX`0">M
+M`%0`#!B``P,0(8Q$```D@L``+$(0`!!``"(!XR@AC4(`%`!$$"&,0@``KZ(`
+M0).C`$"1P@`!``(2``!B&"61P@`"``(4``!B&"61P@`#``(6`!```!8`8A`E
+MC$(``*^B`%23I`!4D:(``0`"$@``@B`ED:(``@`"%```@B`ED:(``P`"%@``
+M@B`EC4(`%(QC````0Q`AK$0``!```'\EC``!C4(`%`!$$"&,0@``K*(`````
+M0"4D@L``+$D0`">G`$@GI@!$``@4`!4@`!4`2"@EC4(`%`!$$"&L10``$2``
+M'P````"-0@`4`$00(8Q"``"OH@!(DZ,`2)#B``$``A(``&(8)9#B``(``A0`
+M`&(8)9#B``,``A8`$```$P!B&"6OI0!$DZ,`1)#"``$``A(``&(8)9#"``(`
+M`A0``&(8)9#"``,``A8``&(8)8U"`!0`1!`A$`#_X:Q#``"-0@`4`$00(8Q#
+M```490!3```0)24(``$I`@$`%$#_TP`(%````$`E)ZL`("2"P``L21``)Z<`
+M4">F`$P`"!"``6(0(14@`!6,10``C4(`%`!$$"&L10``$2``'P````"-0@`4
+M`$00(8Q"``"OH@!0DZ,`4)#B``$``A(``&(8)9#B``(``A0``&(8)9#B``,`
+M`A8`$```$P!B&"6OI0!,DZ,`3)#"``$``A(``&(8)9#"``(``A0``&(8)9#"
+M``,``A8``&(8)8U"`!0`1!`A$`#_X:Q#``"-0@`4`$00(8Q#```4HP`=```0
+M)24(``$I`@`$%$#_T@`($(``#""``P08(8QB```D0L``+$(0`!1`_WH!Y!`A
+M`(`8)0,#$"&-1``4C$(```""("$!XQ@AC&(``*R"```EC``!*8(``A1`_UD`
+M#!B`/`(``"1"````0/@))`0`9"0"``&/OP!8`^``"">]`&`PI?__,*(!`!!`
+M``8D`A,SI,(``"0"%]2DX@```^``""0"``$PH@"`$$``#0````"4@A**%$``
+M!20""0B4@A*,$$``!P`````D`@D(I,(``"0""JRDX@```^``""0"``$#X``(
+M```0)2>]_]"OOP`HK[,`)*^R`""OL0`<K[``&`"`D"4"0)@E`D"():>@`!"6
+M0A)P+$)0`11```<F4`'@CD(!H"0%`,D`0/@))Z8`$!!``3Z/OP`HED(!U#!"
+M`/`D`P!`%$,``Y>B`!"F8!*&EZ(`$!1```LD`@`'CD,!S!1B``@D`@`(ED,!
+MT!1B``4D`@`%IZ(`$"0"``&F8A)VIF(2>(XC`=PD`@`&$&(`$"0"<&66(P'*
+M%&(`#0````"6(P(()&+_G"Q"``(00``$)`(`021B``40```%IB("")8C`@@4
+M8@`")`(`0Z8B`@BN```$EF(2AA!```8D`@`!K@(`!)9B$G840``")`(``ZX"
+M``268A**$$``!`````".`@`$-$(`!*X"``268A*,$$``#"0"#A&6(P'*$&(`
+M"B0""0B.`P`$-&(`"*X"``268A)X%$``!"0""0@T8@`HK@(`!"0""0BF`@`0
+MED(!U#!"`/`D0O_0+$(`0!1``!4D`@G$CD0!S#B#``<L8P`!.((`"RQ"``$`
+M8A@E%&``#20""<0D`P`*$(,`"20"``D0@@`()`()Q!2#``@D`@JLED(!T"Q"
+M``000``$)`(*K"0""<00```"I@(`$J8"`!(D`A,SI@(`#"0"%]2F`@`.C@(`
+M`#P#__TT8___`$,0)#P#``$`0Q`EK@(``)>B`!`P0@`"%$``#```("6.0P',
+M+&(`!A!```<D`@`%%&(`!P`$%("60@'0+$(`!!1```,`!!2`)`0``0`$%(".
+M!````$00)CP#``0`0Q`D`((@)CP"_]\T0O__`((@)#P"`!``@B`EEZ(`$``"
+M$$(X0@`!,$(``0`"%8``1!`F/`,`0`!#$"0`@B`FK@0``(Y"`<PL0@`'%$``
+M!3P#__<\`@`(`((0)1````6N`@``C@(``#1C__\`0Q`DK@(``(X"```\`X``
+M`$,0)3P#0```0Q`EK@(``)8B`=`L0@`"$$``!9>B`!".0P',)`(`"Q1B`"F7
+MH@`0,$(``11```0``!@EC@(`!#!"``D``A@K``,70(X$````1!`F/`,@``!#
+M$"0`@B`FEZ(`$``"$,(X0@`!,$(``0`"%P``1!`F/`,0``!#$"0`@B`FK@0`
+M`)>B`!`P0@`$%$``!```&"6.`@`$,$(`"0`"&"L``Q[`C@(```!B&"8\!`@`
+M`&08)`!#$"8\`P0``$,0)3P#`0``0Q`EK@(``(X"```\`_W_-&/__P!#$"2N
+M`@``CF(3.!!```0``!@ECF(3/!1```,``Q7`)`,``0`#%<".`P```$,0)CP$
+M`(``1!`D`&(8)C1C\`"N`P``CB,!S"0"``448@`$)`(`")8C`=`08@`%````
+M`(XB`<PL0@`&%$``!9>B`!".`@``-$((`*X"``"7H@`0,$(!\!!```,``A$"
+M$````Z8"``@D`@`*I@(`")>B`!`P0O``$$``!0`"&P(D`@`!`&(0!!````.F
+M`@`*)`(`@*8"``J60@'4,$(`\"1"_]`L0@!`$$``!20#^_^.`@``-$(&`!``
+M``:N`@``C@(```!#$"0D`_W_`$,0)*X"``"68A)Z$$``"P)`("6.0@&@)`4`
+M#P!`^`DF)A)($$``!20"``&N(A),C@(``#1"`0"N`@``CD(!S"Q"``6N(A)H
+MCD,!S"0"``448@`%```@)99#`=`D`@`)$&(`!0````".0@',+$(`!A1```,`
+M!!'`)`0``0`$$<".`P```$,0)C!"`(``8A@FK@,``"0"``^N`@`4)`(``8^_
+M`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`#`GO?_@K[\`&#P"```D0@```$#X
+M"2>E`!`D`@`!C[\`&`/@``@GO0`@)`(``12B``4\`@``/`(``"1"```#X``(
+MK((`<"1">&`#X``(K((`<">]_\"OOP`\K[(`.*^Q`#2OL``P`("`)0"@B"6.
+M`@`4-`.```!#$"&.(P`$K$,`*(X"`!0T`X```$,0(8XC``RL0P`LC@(`%#0#
+M@```0Q`ACB,`$*Q#`#".`@`4-`.```!#$"&.(P`(K$,`-(XB```\$@$``%(0
+M)!!```T\`@``)$(```!`^`DGI0`0C@(2-```("4``"@EK$0`**Q%`"R.`@`4
+M-`.```!#$"&L4@`@C@(`%#0#@```0Q`ACB,``*Q#`""/OP`\C[(`.(^Q`#2/
+ML``P`^``"">]`$`GO?_0K[\`**^E`!2,@P'<)`(``1!B``DT`O__$&``#3P"
+M```D`@`&$&(`"20"``@48@`2)*(``30"__^OH@`</`(`!S1"__\0```+KZ(`
+M(#P"``",0@```*(0(P`"$,"OH@`</`(``(Q"````HA`C``(0P*^B`"`DH@`!
+MKZ(`&#P"`8`T0O__`,(0)*^B`!`\`@``)$(```!`^`DGI0`0C[\`*`/@``@G
+MO0`P)[W_\(R"`!0T`X```$,0(:Q``"B,A0`4-`*```"B*"&,H@`$/`,`!`!#
+M$"4\`__/-&/__P!#$"2LH@`$C((`%#0#@```0Q`A-`/__ZQ#`"`#X``()[T`
+M$">]__``@$`EE*(`$A!``!H!`#@EC00`%#0"@```@B`AC((`!#P#`!``0Q`E
+MK((`!(T"`!0T`X```$,0(92C`!"L0P`DC0(`%#0#@```0Q`AE*,`$JQ#`#B-
+M`P`4-`*```!B&"&,H@`4``(0P*QB`#`0```*C0(`%(T$`!0T`H```((@(8R"
+M``0\`__O-&/__P!#$"2L@@`$C0(`%#0#@```0Q`AC*,``*Q#`"B-`P`4-`*`
+M``!B,"&,P@`@/`/_@`!#$"24HP`*`$,@)92B`!@00``%)$(`!``"%``\`P!_
+M`$,0)`""("6LQ``@C.0OU#P"__\T0@#_`((@))2B`!H``A(`,$+_``""("6L
+MY"_4C0(`%#0#@```0Q`AK$0`&)2G``J,HP`<`.,0*SA"````8C@+C*8`#`##
+M$"LX0@```&(P"Q3F``,`````$````HRI``2,J0``C*(`!(T$`!0T`X```(,@
+M(21"__T``A#`/`,`!S1C__\`0Q`D/`,*&`!#$"6L@@#4C00`%#0"@```@B`A
+M)2+__0`"$,`\`P`'-&/__P!#$"0\`PH``$,0):R"`-B-!``4-`*```""("$P
+MXO__``8<``!#$"6L@@#<`^``"">]`!```````````">]_]"OOP`HK[$`)*^P
+M`"``@(`E`,"()8X"`!2L16``C@,`%"0"``&L8F`(/`(``"1"```D!6`,)`8`
+M`P!`^`DD!P`"$$``!H^_`"B.`@`4C$)@!*8B```D`@`!C[\`*(^Q`"2/L``@
+M`^``"">]`#`GO?_(C(8`%(S"0!2OH@`PDZ,`,">D`#"0@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"4`!2A`)`(``P"B$`0`8A@EKZ,`-).C
+M`#0GI``TD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EK,-`
+M%"0"``$#X``()[T`.">]_\B,A@`4C,)`%*^B`#"3HP`P)Z0`,)""``$``A(`
+M`&(8)9""``(``A0``&(8)9""``,``A8``&(8)0`%*$`D`@`#`*(0!``"$"<`
+M8A@DKZ,`-).C`#0GI``TD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"
+M%@``8A@EK,-`%"0"``$#X``()[T`.">]_^B,AP`4C.)`&*^B`!"3HP`0)Z0`
+M$)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)20"``$`HA`$
+M``(0)P!B&"0PQ@`!`*8P!`!F&"6OHP`4DZ,`%">D`!20@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6LXT`8)`(``0/@``@GO0`8+*(`!A!`
+M``DGO?_HC((`%(Q"0!ROH@`0DZ(`$#!"`"\`HA`&$````C!"``$D`O__`^``
+M"">]`!@GO?_0K[\`*`"`."6,X@`4C$)`%*^B`""3HP`@)Z0`()""``$``A(`
+M`&(8)9""``(``A0``&(8)9""``,``A8``&(@)0`%$$`D`P`#`$,8!#P"``$T
+M0O```$,0)P""("0`!2L``(4@)1#```,TA(``/`(``0""("6OI``DDZ,`)">D
+M`"20@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6,X@`4K$-`
+M%(SC+$0\!0$`/`(``"1"````X"`E`$#X"0!E*"6/OP`H`^``"">]`#``````
+M```````````GO?_HC((`%(Q"0`BOH@`0DZ(`$">D`!"0@P`!``,:``!#$"60
+M@P`"``,<``!#$"60@P`#``,>``!#$"4X0@`!+$(``0/@``@GO0`8`(!`)0"@
+M."4``$@E`0!0)8T#`!2,9@"`/`(`@`#"$"000``6`````(QD`(P\`@$``((0
+M)#P#`"`X0@```&)("SP"(```@A`D$$```CP"`$`!(D@E/`($``""$"000``"
+M/`(`@`$B2"4\`P(``(,0)`$C&"4X0@```&)("XT"`!2,1@#`)`+__Q3"``,`
+M`!`E`^``"*S@```\`@$%-$+8N@#"&"0\`@`(`,(0)!!```2LXP``/`)```!B
+M$"6LX@``,,(`!1!```4PP@7`C.(``#1"``&LX@``,,(%P!!``!<PP@`@C.(`
+M`#1"`$"LX@``C0(`%(Q#`,0P9`/_C4)&H`""("4\!0/_`&48)``#'`(`9!@E
+MK4-&H(T"`!2,0@#(,$0#_P"#("4`11`D``(4`@!$$"6M0D:@,,(`(!!```<`
+M````C0(2:!!```0\`T``C.(```!#$"6LX@``C.(```$B$"6LX@``/`-```!#
+M$"000``-`````*T&$E"-`P`4C&(`Q*T"$E2,8@#(K0(26(QB`,RM`A)<C&(`
+MT*T"$F",8@#4K0(29`/@``@D`@`!`^``"(R"+$0GO?_P`(!`)8T)+$0%(0`%
+M`0`X)8T"`!2L0``DC0(`%(Q"`"0\`@$%-$+8N@"B("0PH@!`$$``#0``,"6,
+MXRS,-((`0`!#(`N,XRS0-((!``!#(`N,XRS4-((`@`!#(`N,XRS8-(($``!#
+M(`LPHP`!-((`!P!#(`L\`@+@`*(0)!!``!8\`@"``((@)3P"`"``HA`D$$``
+M`CP"`0``PC`E/`(`0`"B$"000``"/`(@``#","4\`@"``*(0)!!```(\`@0`
+M`,(P)3P#`@``HQ`D`,,8)3A"````8C`+/`)```"B$"000``"/`(`"`""("6-
+M`@`4K$0`H(T$`!2,@@"L/`-(_S1C__\`0Q`D`$80):R"`*P$H0`$K.4L1(T#
+M`!0D`@`!K&(`)`$@$"4#X``()[T`$````````````^``")2"`>HPH___E((!
+MZ@!B$"L00``@)[W_Z``#*4`DHD@<+$(0`!!``!,``QE`C((`%`"B$"$T`X@<
+M`$,0(8Q"``"OH@`0DZ,`$">D`!"0@@`!``(2``!B&"60@@`"``(4``!B&"60
+M@@`#``(6`!````8`8A`EC((`%`!B&"$T`H@<`&(8(8QB```P0X``%&```B0"
+M``$``!`E`^``"">]`!@GO?^X`(`X)3"E__^4XP'J`*,8*Q!@`84``!`E``49
+M0"1B2!0L0A``$$``[`````",X@`4`&(0(30#B!0`0Q`AC$(``*^B`!"3HP`0
+M)Z0`$)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8`$```WP!B0"6O
+MH``4DZ0`%)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8SB
+M`!0`PA`A-`.(``!#$"&L1```$```V0`%,4"OH``8DZ0`&)!B``$``A(``((@
+M)9!B``(``A0``((@)9!B``,``A8``((@)8SB`!0`PA`A-`.(!`!#$"&L1```
+M$```T@`%,4"OH``<DZ0`')!B``$``A(``((@)9!B``(``A0``((@)9!B``,`
+M`A8``((@)8SB`!0`PA`A-`.("`!#$"&L1```$```RP`%,4"OH``@DZ0`()!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8SB`!0`PA`A-`.(
+M#`!#$"&L1```$```Q``%,4"OH``DDZ0`))!B``$``A(``((@)9!B``(``A0`
+M`((@)9!B``,``A8``((@)8SB`!0`PA`A-`.($`!#$"&L1```$```O0`%,4"O
+MH@`HDZ0`*">C`"B08@`!``(2``""("608@`"``(4``""("608@`#``(6``""
+M("6,X@`4`,(0(30#B!0`0Q`AK$0``!```+8`!3%`KZ``+).D`"R08@`!``(2
+M``""("608@`"``(4``""("608@`#``(6``""("6,X@`4`,(0(30#B!@`0Q`A
+MK$0``!```*\`!3%`KZ``,).D`#"08@`!``(2``""("608@`"``(4``""("60
+M8@`#``(6``""("6,X@`4`,(0(30#B!P`0Q`AK$0``!```*@D`@`$KZ``-).D
+M`#208@`!``(2``""("608@`"``(4``""("608@`#``(6``""("6,X@`4`,(0
+M(30#B```0Q`AK$0``!```*H`!3%`KZ``.).D`#B08@`!``(2``""("608@`"
+M``(4``""("608@`#``(6``""("6,X@`4`,(0(30#B`0`0Q`AK$0``!```*,`
+M!3%`KZ``/).D`#R08@`!``(2``""("608@`"``(4``""("608@`#``(6``""
+M("6,X@`4`,(0(30#B`@`0Q`AK$0``!```)P`!3%`KZ``0).D`$"08@`!``(2
+M``""("608@`"``(4``""("608@`#``(6``""("6,X@`4`,(0(30#B`P`0Q`A
+MK$0``!```)4D`@`!C.(`%`!B&"$T`H@4`&(8(8QH````!3%`),)(`"Q"$``4
+M0/\>)Z,`%(SB`!0`P!@E`&(8(30"B```8A@AK&`````%,4`DPD@$+$(0`!1`
+M_R4GHP`8C.(`%`#`&"4`8A@A-`*(!`!B&"&L8`````4Q0"3"2`@L0A``%$#_
+M+">C`!R,X@`4`,`8)0!B&"$T`H@(`&(8(:Q@````!3%`),)(#"Q"$``40/\S
+M)Z,`((SB`!0`P!@E`&(8(30"B`P`8A@AK&`````%,4`DPD@0+$(0`!1`_SHG
+MHP`DC.(`%`#`&"4`8A@A-`*($`!B&"&L8`````4Q0"3"2!0L0A``%$#_020"
+M``>,XP`4`,`0)0!#$"$T`X@4`$,0(20#``>L0P````4Q0"3"2!@L0A``%$#_
+M2">C`"R,X@`4`,`8)0!B&"$T`H@8`&(8(:Q@````!3%`),)('"Q"$``40/]/
+M)Z,`,(SB`!0`P!@E`&(8(30"B!P`8A@AK&```"0"``05`@`T)`(``8SB+\P\
+M`P@``$,0)!!``"XDH@!`,$7__P`%,4`DPD@`+$(0`!1`_TTGHP`TC.(`%`#`
+M&"4`8A@A-`*(``!B&"&L8`````4Q0"3"2`0L0A``%$#_5">C`#B,X@`4`,`8
+M)0!B&"$T`H@$`&(8(:Q@````!3%`),)(""Q"$``40/];)Z,`/(SB`!0`P!@E
+M`&(8(30"B`@`8A@AK&`````%,4`DPD@,+$(0`!1`_V(GHP!`C.(`%`#`&"4`
+M8A@A-`*(#`!B&"&L8```)`(``0/@``@GO0!()[W_Z`"`0"4PI?__E0,!Z@"C
+M&"L08`!5```0)1#``#D`````D,<`!0`'.@"0P@`$`.(X)9#$``,`!"8`D,(`
+M`@`"%```@B`ED,(``0`"$@``@B`ED,(```""("4`!"!"``<7P`""("40```H
+M``<X0J^D`!"3I``0D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`EC0(`%`#"$"$T`X@8`$,0(:Q$```0```B``4Q0*^B`!23I``4)Z,`%)!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8T"`!0`PA`A-`.(
+M'`!#$"&L1```$```&R0"``$``#@E```@)0`%,4`DPD@8+$(0`!1`_]4GHP`0
+MC0(`%`#`&"4`8A@A-`*(&`!B&"&L9`````4Q0"3"2!PL0A``%$#_W#3B@`"-
+M`P`4`,`0)0!#$"$T`X@<`$,0(33C@`"L0P``)`(``0/@``@GO0`8)[W_:*^_
+M`)2OM@"0K[4`C*^T`(BOLP"$K[(`@*^Q`'ROL`!X`("0)0#`@"4`X#`ECZ,`
+MJ#"Q__\"0+`E)D0!X#P"JJHT0JJJ`$!()0`#2`J60P'J`B,8*Q!@`RP``!`E
+MD@,``"QB``800`,H```0)3P"```D0A3```,8@`!B&"&,8@```$``"``````0
+M``"5)`L`!8R#```\`@`$`&(8)!!@`QH``!`E$```CB0+``:.0B_,/`,(``!#
+M$"000`"))`L`!"8B`$"4@P`*`$,0*A1``(0``!`E$``##8^_`)26`P`"+&,`
+M!11@`P@``!`EE@(``BQ"``840`!Z``!8)98"``(L0@`.)`0``R0#``$`8%@E
+M$```<P""6`H0``!Q)`L`!Q```OD``!`EKZ(`().D`"`GHP`@D&(``0`"$@``
+M@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$B$"$T`X@``$,0(:Q$
+M```0``"B`!%)0*^B`"23I``D)Z,`))!B``$``A(``((@)9!B``(``A0``((@
+M)9!B``,``A8``((@)8Y"`!0!(A`A-`.(!`!#$"&L1```$```FP`124"OJ``H
+MDZ0`*)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0!
+M(A`A-`.("`!#$"&L1```$```E``104"OJ@`LDZ0`+)!B``$``A(``((@)9!B
+M``(``A0``((@)9!B``,``A8``((@)8Y"`!0!`A`A-`.(#`!#$"&L1```$```
+MC0`104"OI0`PDZ0`,)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8`
+M`((@)8Y"`!0!`A`A-`.($`!#$"&L1```$```A@`1*4"OJP`TDZ0`-)!B``$`
+M`A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0`HA`A-`.(%`!#
+M$"&L1```$```?SP"``"2%``$D@(`!0`"$@`"@J`ED@(`!@`"%``"@J`ED@(`
+M!P`"%@`"@J`E`HF@)I(#``B2`@`)``(2``!BJ"4"J:@F,K7__Y((``J2`@`+
+M``(2``$"0"62`@`,``(4``$"0"62`@`-``(6``$"0"4!"4`FD@,`#I("``\`
+M`A(``&)0)0%)4":2!0`0D@(`$0`"$@``HB@ED@(`$@`"%```HB@ED@(`$P`"
+M%@``HB@E`*DH)I8"``(L0@`.,*,`_P!B*`LD`@`$%6("$#%*__^.0B_,/`,(
+M``!#$"000`(+)B(`0#!3__\`$4E`)2)(`"Q"$``40/]5`!00)XY#`!0!(!`E
+M`$,0(30#B```0Q`A`!08)ZQ#````$4E`)2)(!"Q"$``40/]<`!40)XY#`!0!
+M(!`E`$,0(30#B`0`0Q`A`!48)ZQ#````$4E`)2)(""Q"$``40/]C)Z,`*(Y"
+M`!0!(!@E`&(8(30"B`@`8A@AK&@````104`E`D@,+$(0`!1`_VHGHP`LCD(`
+M%`$`&"4`8A@A-`*(#`!B&"&L:@```!%!0"4"2!`L0A``%$#_<2>C`#".0@`4
+M`0`8)0!B&"$T`H@0`&(8(:QE````$2E`)*)(%"Q"$``40/]X)Z,`-(Y"`!0`
+MH!@E`&(8(30"B!0`8A@AK&L``#P"```D0@```D`@)0!`^`D"("@ED@0`%)("
+M`!4``A(``((@)9("`!8``A0``((@)9("`!<``A8``((@)9(%`!B2`@`9``(2
+M``"B*"62`@`:``(4``"B*"62`@`;``(6``"B*"6.PB_0,$(`!!!``34`````
+MD@,`'I("`!\``A(``&)`)9(#`!R2`@`=``(2``!B2"62!@`@D@(`(0`"$@``
+MPC`ED@(`(@`"%```PC`ED@(`(P`"%@`0``$E`,(P):^D`#B3I``XD&(``0`"
+M$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`#B$"$T`X@``$,0
+M(:Q$```0``$?`!,Y0*^H`#R3I``\D&(``0`"$@``@B`ED&(``@`"%```@B`E
+MD&(``P`"%@``@B`ECD(`%`#B$"$T`X@$`$,0(:Q$```0``$8`!,Y0*^E`$"3
+MI`!`D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`#B
+M$"$T`X@(`$,0(:Q$```0``$1`!,I0*^I`$23I`!$D&(``0`"$@``@B`ED&(`
+M`@`"%```@B`ED&(``P`"%@``@B`ECD(`%`"B$"$T`X@,`$,0(:Q$```0``$*
+M`!,I0*^F`$B3I`!(D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`ECD(`%`"B$"$T`X@0`$,0(:Q$```0``$#`!,I0*^B`$R3I`!,)Z,`3)!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0`HA`A-`.(
+M%`!#$"&L1```$```_``3*4"OH`!0DZ0`4)!B``$``A(``((@)9!B``(``A0`
+M`((@)9!B``,``A8``((@)8Y"`!0`HA`A-`.(&`!#$"&L1```$```]0`3*4"O
+MH`!4DZ0`5)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"
+M`!0`HA`A-`.('`!#$"&L1```$```[@`1*4"OM`!8DZ0`6)!B``$``A(``((@
+M)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0`HA`A-`.(``!#$"&L1```
+M$```YP`1*4"OM0!<DZ0`7)!B``$``A(``((@)9!B``(``A0``((@)9!B``,`
+M`A8``((@)8Y"`!0`HA`A-`.(!`!#$"&L1```$``!*20"``&OM`!@DZ0`8)!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0!(A`A-`.(
+M``!#$"&L1```$```VP`124"OM0!DDZ0`9)!B``$``A(``((@)9!B``(``A0`
+M`((@)9!B``,``A8``((@)8Y"`!0!(A`A-`.(!`!#$"&L1```$```U``124"O
+MJ`!HDZ0`:)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"
+M`!0!(A`A-`.("`!#$"&L1```$```S0`104"OJ@!LDZ0`;)!B``$``A(``((@
+M)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0!`A`A-`.(#`!#$"&L1```
+M$```Q@`104"OI0!PDZ0`<)!B``$``A(``((@)9!B``(``A0``((@)9!B``,`
+M`A8``((@)8Y"`!0!`A`A-`.($`!#$"&L1```$```OP`1*4"OJP!TDZ0`=)!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0`HA`A-`.(
+M%`!#$"&L1```$```N#P"`````#`E``!()0``0"4`$SE`).)(`"Q"$``40/[8
+M)Z,`.(Y"`!0`X!@E`&(8(30"B```8A@AK&0````3.4`DXD@$+$(0`!1`_M\G
+MHP`\CD(`%`#@&"4`8A@A-`*(!`!B&"&L:````!,Y0"3B2`@L0A``%$#^YB>C
+M`$".0@`4`.`8)0!B&"$T`H@(`&(8(:QE````$RE`)*)(#"Q"$``40/[M)Z,`
+M1(Y"`!0`H!@E`&(8(30"B`P`8A@AK&D````3*4`DHD@0+$(0`!1`_O0GHP!(
+MCD(`%`"@&"4`8A@A-`*($`!B&"&L9@```!,I0"2B2!0L0A``%$#^^R0"``>.
+M0P`4`*`0)0!#$"$T`X@4`$,0(20#``>L0P```!,I0"2B2!@L0A``%$#_`B>C
+M`%".0@`4`*`8)0!B&"$T`H@8`&(8(:Q@````$RE`)*)('"Q"$``40/\))Z,`
+M5(Y"`!0`H!@E`&(8(30"B!P`8A@AK&`````1*4`DHD@`+$(0`!1`_Q`GHP!8
+MCD(`%`"@&"4`8A@A-`*(``!B&"&L=````!$I0"2B2`0L0A``%$#_%R>C`%R.
+M0@`4`*`8)0!B&"$T`H@$`&(8(:QU```0``!))`(``0`124`E(D@`+$(0`!1`
+M_QPGHP!@CD(`%`$@&"4`8A@A-`*(``!B&"&L=````!%)0"4B2`0L0A``%$#_
+M(R>C`&2.0@`4`2`8)0!B&"$T`H@$`&(8(:QU````$4E`)2)(""Q"$``40/\J
+M)Z,`:(Y"`!0!(!@E`&(8(30"B`@`8A@AK&@````104`E`D@,+$(0`!1`_S$G
+MHP!LCD(`%`$`&"4`8A@A-`*(#`!B&"&L:@```!%!0"4"2!`L0A``%$#_.">C
+M`'".0@`4`0`8)0!B&"$T`H@0`&(8(:QE````$2E`)*)(%"Q"$``40/\_)Z,`
+M=(Y"`!0`H!@E`&(8(30"B!0`8A@AK&L``#P"```D0@```D`@)0!`^`D"("@E
+M)`(``8^_`)2/M@"0C[4`C(^T`(B/LP"$C[(`@(^Q`'R/L`!X`^``"">]`)@G
+MO?_HK[\`$"2#+#`\`@``)$(```"@("4`8"@E`$#X"20&``:/OP`0`^``"">]
+M`!@GO?_HK[\`$#P"```D0@``)(0L,`!`^`DD!@`&)`(``8^_`!`#X``()[T`
+M&">]_^BOOP`0)(,L/#P"```D0@```*`@)0!@*"4`0/@))`8`!H^_`!`#X``(
+M)[T`&">]_]"OOP`HK[$`)*^P`"``@(@E`B"`)3P"```D0@``)@0L/`!`^`DD
+M!@`&C@0`%#0"@```@B`AD@,L/)("+#T``A(``&(8)9("+#X``A0``&(8)9("
+M+#\``A8``&(8):R#`.".)``4-`*```""("&2`RQ`D@(L00`"$@``8A@EK(,`
+MY"0"``&/OP`HC[$`)(^P`"`#X``()[T`,#"E__^4@@(($$4`!B0#``R4@A)R
+M,$(`@"0$``,D`P`+`((8"A#```(`````K,,```/@``@``!`E`(`P)92"$H80
+M0``%```H)20%``&4@Q)V)`(`0P!#*`J4@A**-*,`!`!B*`N4@A*,$$``"0``
+M``"4PP'*)`(.$1!B``4`````-*4`")2#$G@TH@`@`$,H"@/@``@`H!`E)[W_
+MT*^_`"ROL@`HK[$`)*^P`"``@(@EEC`22#(2`!P`$I"",A```@`0@"N.(@&L
+M`$#X"0)`*"6.(P`4-`*```!B&"&,8A@`-$(@`*QB&`".(@&P`B`@)0!`^`D"
+M0"@E+@8``0!0$"8"`C`+CB(!N`(@("4`0/@)`D`H)8^_`"R/L@`HC[$`)(^P
+M`"`#X``()[T`,">]_\B,A@`4C,)`$*^B`#"3HP`P)Z0`,)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8``&(8)3P"__$T0O^?`&(8)#P"```D0A3@
+M,*4`!P`%*(``HB@AC*(```!B&"6OHP`TDZ,`-">D`#20@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6LPT`0`^``"">]`#@GO?_0K[\`+*^R
+M`"BOL0`DK[``(`"`D"4PT?__`D"`)3P"```D0@``)@0L-@!`^`DD!@`&C@0`
+M%#0"@```@B`AD@,L-I("+#<``A(``&(8)9("+#@``A0``&(8)9("+#D``A8`
+M`&(8):R#``B.1``4-`*```""("&2`RPZD@(L.P`"$@``8A@E,C$__P`1C```
+M<1@EK(,`#(^_`"R/L@`HC[$`)(^P`"`#X``()[T`,(R$`!0T`H```((@(8R&
+M`$R,@@!0C(0`3`"&,"L`1A`A`$`8)0``$"4``Q`````8)0"`*"4``"`E`$00
+M)0/@``@`91@EC((`%#0#@```0Q`AC$(`3`/@``@`````)[W_\(R#`!0T`H``
+M`&(8(8QE`"`\`@$``*(0):QB`"",@P`4-`*```!B&"$\`@$``*(H):QE`"`#
+MX``()[T`$(R"$C000``I)[W_\)1"``(P0@`@$$``)0``."6,H@``$$``#@``
+M,"4DJ``$`$`H)0$'$"&00P``,&(`@!!```,P8P!_`&80*P!B,`HDYP`!`.40
+M*Q1`__<!!Q`AC(,`%#0"@```8A@AC&4`!!#```@`!A!",$(`_RQ"``,00``$
+M/`("``"B$"40```(K&(`!(R#`!0T`H```&(8(3P"_?\T0O__`*(0)*QB``0#
+MX``()[T`$(R"`!0T`X```$,0(8Q"&&0``BS",*4!_S"B`0`00``#`````#BE
+M`?\`!2@GC(,`%#0"@```8A@AC&(`4(QC`$P`0Q`F`^``"`!%$"8GO?_H`(`P
+M)8S"`!2,0D`@KZ(`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@E
+MD((``P`"%@``8A@E,&0`_P`$(0(P8P`/C,(!S!1$``0``"@EE,(!T`!#$"8L
+M10`!`*`0)0/@``@GO0`8C(,`%#0&@```9A@AC*(``(QC`)``0Q`AK*(``(R"
+M`!0`1A`AC*,`!(Q"`(P`8A@AK*,`!(R"`!0`1A`AC*,`#(Q"`)0`8A@AK*,`
+M#(R"`!0`1A`AC*,`"(Q"`(@`8A@AK*,`"(R"`!0`1A`AC*,`$(Q"`)@`8A@A
+M`^``"*RC`!`#X``()`(``8R"`!0T`X```$,0(8Q"'!P#X``(,$(`_XR"`!0T
+M`X```$,0(8Q"`%@#X``(,$(`!R>]__",@@`4-`.```!#$"$PI0`'K$4`6`/@
+M``@GO0`0`^``"(R"+[PGO?_HK[\`$(R&$C04P``#)`(``1````6LA2^\/`(`
+M`"1"````0/@)`````(^_`!`#X``()[T`&`/@``@D`@`!)[W_T*^_`"ROL@`H
+MK[$`)*^P`"``@(@E`*"`)2X"``840``(`B"0)3P"```D0@```$#X"30%__\`
+M4!`K$$``!0(@("4D`O__KD(O^!````D``!`E/`(``"1"````0/@)`@`H)8XC
+M`!2L8A!PKE`O^"0"``&/OP`LC[(`*(^Q`"2/L``@`^``"">]`#`GO?_HK[\`
+M$(R"`!2,11!P/`(``"1"````0/@),*7__X^_`!`#X``()[T`&">]_]"OOP`L
+MK[(`**^Q`"2OL``@`("`)0"@B"4"`)`E/`(``"1"````0/@))`4__P!1$"L0
+M0``%`@`@)20"__^N0B_\$```$```$"4\`@``)$(```!`^`D"("@EC@4`%#0#
+M@```HR@AC*,`%"0$P```9!@D,$(__P!B&"6LHP`4KE$O_"0"``&/OP`LC[(`
+M*(^Q`"2/L``@`^``"">]`#`GO?_HK[\`$(R"`!0T`X```$,0(8Q%`!0\`@``
+M)$(```!`^`DPI3__C[\`$`/@``@GO0`8D((OS#A"``$#X``(,$(``2>]__`0
+MH``-`(`P)8S$`!0T`H```((@(8R"``0\`_[_-&/__P!#$"2L@@`$C,(OS`!#
+M$"00```+K,(OS(R$`!0T`H```((@(8R"``0\`P$``$,0):R"``2,PB_,`$,0
+M):S"+\PD`@`!`^``"">]`!`GO?_0K[\`+*^R`"BOL0`DK[``(`"`@"4`H(@E
+M`@"0)3P"```D0@```$#X"20%/_\`41`K$$``!0(`("4D`O__KD(P`!```!,`
+M`!`E/`(``"1"````0/@)`B`H)8X%`!0T`X```*,H(8RD`!0\`\``-&/__P"#
+M("0``A0`/`,__P!#$"0`@B`EK*0`%*Y1,``D`@`!C[\`+(^R`"B/L0`DC[``
+M(`/@``@GO0`P)[W_Z*^_`!",@@`4-`.```!#$"&,10`4``4L`CP"```D0@``
+M`$#X"3"E/_^/OP`0`^``"">]`!@GO?_P,*7__P"`."4LHP"`$&``"20"``R,
+M@@`4K$4$`(R#`!0`!A`KK&($!`"G$"&@1B\X```0)0/@``@GO0`0)[W_T*^_
+M`"BOL0`DK[``(`"`B"4PL`#_$,``0*(P$C@R`@#_$$``/20#`4".(A(TE$(`
+M`C!"`4`40P`X/`(``"1"````0/@))`4``0!`*"6.(A(TE$(``C!"0``00``*
+M``480G(#(`(`!!!``((@(22$`01R`S`"`$80(0`"$$`0```7)$8-K(XB$C24
+M0@`",$*``!!```H`!1B"<@,@`@`$$$``@B`A)(0`TG(#,`(`1A`A``(00!``
+M``DD1@U(<@4@`@`$$$``@B`A)(0!:'(%,`(`1A`A``(00"1&#F!R!1@"``,0
+M0`!B&"$D8P/H,&,__XXB`!2L1!!PCB(`%*Q&$+".)``4-`*```""("$``Q0`
+M`$,0):R"`!2/OP`HC[$`)(^P`"`#X``()[T`,">]_^BOOP`0/`(``"1"````
+M0/@)C(4!W(^_`!`#X``()[T`&`"`,"4D`P`&$*,`!P``$"60PA*3$$```P``
+M("6,PB_H+$0``@"`$"4#X``(`````">]_Y"OOP!LK[``:#P"```D0@```$#X
+M"0"`@"400`"M-`.``(X"`!0`0Q`A)`,`'ZQ#&'".!0`4-`*```"B*"&6`@'4
+M,$(`\"1"_]`L0@!`)`,`&"0$`!0`@A@+K*,9^(X$`!0T`H```((@(8R"`!PD
+M`\!_`$,0)#1"`("L@@`<C@(`%#0#@```0Q`A)`,`/:Q#`02.!0`4C*)`$*^B
+M`$"3HP!`)Z0`0)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8
+M)31C``*OHP!$DZ,`1">D`$20@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#
+M``(6``!B&"6LHT`0C@0!S#B#``<L8P`!.((`"RQ"``$`8A@E%&``#``````D
+M`P`*$(,`"20"``D0@@`'`````!2#`#``````E@(!T"Q"``000``L`````(X"
+M`!0T`X```$,0(20#`":L0QATC@(`%#0#@```0Q`A)`,`#:Q#&'B.`@`4-`.`
+M``!#$"$D`P`'K$,9\(X"`!0T`X```$,0(20#`#^L0QGTC@4`%(RB0!"OH@!(
+MDZ,`2">D`$B0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"4\
+M`OS_-$+__P!B&"0\`@(``&(8):^C`$R3HP!,$```*R>D`$R.`@`4-`.```!#
+M$"$D`P`*K$,8=(X"`!0T`X```$,0(20#``RL0QAXC@(`%#0#@```0Q`A)`,`
+M`ZQ#&?".`@`4-`.```!#$"$D`P`@K$,9](X%`!2,HD`0KZ(`4).C`%`GI`!0
+MD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E/`+\_S1"__\`
+M8A@D/`(#``!B&"6OHP!4DZ,`5">D`%20@@`!``(2``!B&"60@@`"``(4``!B
+M&"60@@`#``(6``!B&"6LHT`0$```;X^_`&R.!0`4C*)`$*^B`%B3HP!8)Z0`
+M6)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)3P"_/\T0O__
+M`&(8)*^C`%R3HP!<)Z0`7)""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8):RC0!".!0`4C*)`$*^B`&"3HP!@)Z0`8)""``$``A(``&(8)9""
+M``(``A0``&(8)9""``,``A8``&(8)20"__T`8A@DKZ,`9).C`&0GI`!DD((`
+M`0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EK*-`$(X"`!0T`X``
+M`$,0(20#`!^L0QAPC@(`%#0#@```0Q`A)`,`?ZQ#&'2.`@`4-`.```!#$"$D
+M`P`.K$,8>(X"`!0T`X```$,0(20#``RL0QGPC@(`%#0#@```0Q`A)`,`_ZQ#
+M&?2.!0`4-`*```"B*"&6`@'4,$(`\"1"_]`L0@!`)`,`$B0$``X`@A@+K*,9
+M^(X%`!0T`H```*(H(8RC`!PD`L!_`&(8))8"`=0P0@#P)$+_T"Q"`$`T9!.`
+M-&,/@`""&`NLHP`<C[\`;(^P`&@#X``()[T`<">]_ZBOOP!4K[``4#P"```D
+M0@```$#X"0"`@"400`!TC[\`5(X%`!2,HD`0KZ(`0).C`$`GI`!`D((``0`"
+M$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E/`+\_S1"__\`8A@DKZ,`
+M1).C`$0GI`!$D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+MK*-`$(X%`!2,HD`0KZ(`2).C`$@GI`!(D((``0`"$@``8A@ED((``@`"%```
+M8A@ED((``P`"%@``8A@E)`+__0!B&"2OHP!,DZ,`3">D`$R0@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"6LHT`0C@(`%#0#@```0Q`A)`,`
+M`:Q#`02.!0`4-`*```"B*"&,HP`<)`+`?P!B&"26`@'4,$(`\"1"_]`L0@!`
+M-&03@#1C#X``@A@+K*,`'(X"`!0T`X```$,0(20#`!^L0QAPC@(`%#0#@```
+M0Q`A)`,`?ZQ#&'2.`@`4-`.```!#$"$D`P`.K$,8>(X"`!0T`X```$,0(20#
+M``RL0QGPC@(`%#0#@```0Q`A)`,`_ZQ#&?2.!0`4-`*```"B*"&6`@'4,$(`
+M\"1"_]`L0@!`)`,`&"0$`!0`@A@+K*,9^(^_`%2/L`!0`^``"">]`%@\`@``
+ME*,``)1"%0``0Q`K%$``"P``("4\`@``)$,5`)2E```DA``!``00@`!#$"&4
+M0@```$40*Q!`__H`````/`(``"1"%0``!!B``$,0(0/@``B$0@`")[W_X*^_
+M`!BOL0`4K[``$`#`@"4`X(@E`(`P)22C__\L8@`=$$``QB2'`>`\`@``)$(5
+M,``#&(``8A@AC&(```!```@`````)`(``A("``\\`@`$+@(``A1``+X``!`E
+M+@(`!!1``+LD`@`-+@(`!A1``+@``!`E)`(`?Q("``@`````$```LR0"``V,
+MXP```&(8)"0"``T0``"N``,0"Q```*P``!`E$@``J@``$"4D`@`!%@(`!@``
+M``",PB_,``(6PCA"``$0``"B,$(``1(```8`````)`(``1("``<`````$```
+MFR0"``R,X@````(4PA```)<P0@`!C,(OT``"$((0``"3,$(``8R#`<PL8@`&
+M$$``CP``$"4D`@`%%&(`C"0"``V4@@'0+$(`"!!```,`````$```AB0"``T0
+M``"$```0)1(``((``!`E)`,``18#`'\D`@`,C((`%#0#@```0Q`AC$(B"``"
+M$T(X0@`!$```=S!"``&,@@'XKB(``!```',``!`E$@``<0``$"4D`P`!%@,`
+M;X^_`!B,PB_<$```;"Q"``$2```&`````"0"``$2`@`&C[\`&!```&:/L0`4
+ME,(2AA```&$L0@`!E,(2C!1``%X``!`EE,,2BA!@`%LD`@`!$```60``$"42
+M``!7```0)20#``$6`P!4)`(`#(S"+\P``A?"$```4#A"``$2```&)`(`#20"
+M``$2`@`'`````!```$DD`@`,C.,``#!C"``0``!%``,0"XS"+]```A#".$(`
+M`1```$`P0@`!C,(OX#!"`#^N(@``$```.P``$"6,PB_@,$(_```"$@*N(@``
+M$```-0``$"4D`@`!$@(`"``````2```P```0)2X#``<08``M)`(`#!````4\
+M`@``C,(P&#A"``$0```G,$(``21"````0/@)``````!`("40@``A)`(``28#
+M__XL8@`%$$``'0``$"4\`@``)$(5J``#&(``8A@AC&(```!```@`````D((`
+M"1````RN(@``D((`#!````FN(@``D((`#1````:N(@``D((`"Q````.N(@``
+MD((`"JXB```0```&```0)3P"```D0@```@`P)0!`^`D"(#@EC[\`&(^Q`!2/
+ML``0`^``"">]`"`GO?_0K[\`*`"`0"4DH__^+&(`'!!``(DDB0'@/`(``"1"
+M%=@``QB``&(8(8QB````0``(`````!#@``4\`P@`C0(OS`!#$"40```&K0(O
+MS(T"+\P\`_?_-&/__P!#$"2M`B_,$```>R0"``&-(P``/`(`"`!B&"008`!V
+M```0)1#@``4D`__[C0(OT`!#$"00```$K0(OT(T"+]`T0@`$K0(OT(R"`!0T
+M`X```$,0(8T#+]"L0P$@$```9B0"``&,@@`4-`.```!#$"&,12(($.```P``
+M```0```#-*4@`"0"W_\`HB@DC((`%#0#@```0Q`AK$4B"!```%8D`@`!K(<!
+M^(R"`!0T`X```$,0(:Q'`$@0``!/)`(``0`'$"NM`B_<$```2R0"``$0X``%
+M/`.``(T"+\P`0Q`E$```!JT"+\R-`B_,/`-__S1C__\`0Q`DK0(OS!```#XD
+M`@`!A0(O]`#B."$LXP!`)`(`/P!#.`HD`@`:%*(`!@````"-`B_@`.(0)3!"
+M`#\0```'K0(OX(T#+^`P8S\`,.(_```"$@(`0Q`EK0(OX(R"`!0T`X```$,0
+M(8T#+^"L0P#H$```)"0"``$LP@`'$$``(0``$"4\`@``)$(5O``&&(``8A@A
+M/`(``"1"``",90```$#X"0#@,"40```7C[\`*(TB```P0@@`$$``#``````0
+MX``%)`/_]XT"+]`T0@`($```!*T"+]"-`B_0`$,0)*T"+]`0```')`(``8^B
+M`$"OH@`0/`(``"1"````0/@)`````(^_`"@#X``()[T`,">]_^"OOP`8CZ(`
+M,(^C`#2OH@`0/`(``"1"````0/@)KZ,`%``"$"N/OP`8`^``"">]`"``````
+M)[W_B*^_`'2OM@!PK[4`;*^T`&BOLP!DK[(`8*^Q`%ROL`!8$*``70"`H"6.
+MA0`4C*)`!*^B`$"3HP!`)Z0`0)""``$``A(``&(8)9""``(``A0``&(8)9""
+M``,``A8``&(8)3P"__PT0O__`&(8)*^C`$23HP!$)Z0`1)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8``&(8):RC0`0\`@``)$(```!`^`DD!``*
+M)!,`*">R`$@\%@`!/`(``"15```GL0!,)[``4(Z"`!2,0D`0KZ(`2).C`$B2
+M0@`!``(2``!B&"620@`"``(4``!B&"620@`#``(6``!B&"4`=A@D$&``(@``
+M```"H/@))`0`,HZ$`!2,@D`$KZ(`3).C`$R2(@`!``(2``!B&"62(@`"``(4
+M``!B&"62(@`#``(6``!B&"4\`O_\-$+__P!B&"2OHP!0DZ,`4)("``$``A(`
+M`&(8)9("``(``A0``&(8)9("``,``A8``&(8):R#0`0F<___%F#_T``````2
+M8``*```0)8Z$`!0T`H```((@(8R"``0\`__[-&/__P!#$"2L@@`$)`(``8^_
+M`'2/M@!PC[4`;(^T`&B/LP!DC[(`8(^Q`%R/L`!8`^``"">]`'@GO?_(`(`P
+M)8S$`!0T`H```((@(8R"``0\`P`$`$,0):R"``00H``A`````(S%`!2,HD`$
+MKZ(`,).C`#`GI``PD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``
+M8A@E/`+__#1"__\`8A@D/`(``0!B&"6OHP`TDZ,`-">D`#20@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"6LHT`$`^``"">]`#@GO?_(`(`P
+M)8S$`!0T`H```((@(8R"``0\`P`$`$,0):R"``00H``A`````(S%`!2,HD`$
+MKZ(`,).C`#`GI``PD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``
+M8A@E/`+__#1"__\`8A@D/`(``@!B&"6OHP`TDZ,`-">D`#20@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"6LHT`$`^``"">]`#@GO?_@K[\`
+M'*^R`!BOL0`4K[``$`"@B"4`P"@E)!```1(P``T`@)`E$B``!CP"``$D`@`"
+M$B(`#@``$"40```3C[\`'"1"L.``0/@)`````!````L`0(`E/`(``21"LL@`
+M0/@)`````!````:N42^X/`(``21"LWP`0/@)`````*Y1+[@"`!`EC[\`'(^R
+M`!B/L0`4C[``$`/@``@GO0`@)[W_Z(R"`!2,0D`$KZ(`$).B`!`GI``0D(,`
+M`0`#&@``0Q`ED(,``@`#'```0Q`E``(4`C!"``,#X``()[T`&">]_^BOOP`4
+M)`(`"!"B`#:OL``0+*(`"1!```\D`@$`)`(``A"B`#,LH@`#$$``!B0"``0D
+M`@`!$*(`%@``$"40``!`C[\`%!"B`"0``!`E$```/(^_`!00H@`L+*(!`1!`
+M``8D`@(`)`(`(!"B`"0``!`E$```,X^_`!00H@`F)`($`!"B`"<``!`E$```
+M+8^_`!0\`@``)%```(R"$C000``B`````)1"``(P0D``$$```SP"```0```<
+M)%```(R"$C240@`",$*``!!``!<\`@``$```%210```\`@``$```$B10```\
+M`@``$```#R10```\`@``$```#"10```\`@``$```"210```\`@``$```!B10
+M```\`@``$````R10```\`@``)%```#P"```D0@```$#X"0(`*"4"`!`EC[\`
+M%(^P`!`#X``()[T`&(R"`!2,0@`,`^``"``````GO?_PC((`%*Q%``P#X``(
+M)[T`$">]__",@P`4)`(`!*QB``@#X``()[T`$">]_]BOOP`@C(,`%"0"`""L
+M8@`(/`(``"1"```D!0`()`8`!`!`^`D``#@E``(0*X^_`"`#X``()[T`*">]
+M_]BOOP`DK[``(`"`@"6.!``4-`*```""("&,@@!()`/_WP!#$"2L@@!(/`(`
+M`"1"````0/@)`@`@)3P"```D0@```@`@)0!`^`DD!0`!C[\`)(^P`"`#X``(
+M)[T`*">]_]BOOP`@C(,`%#0"@```8A@AC&(`2#1"`""L8@!(/`(``"1"````
+M0/@)`````(^_`"`#X``()[T`*">]__",@@`4-`.```!#$"&L10!`C((`%`!#
+M$"&L1@!$`^``"">]`!`GO?_P+*,`0!!@`!@``!`E+*(`(!1```PT`H``C(,`
+M%`!B&"&,9@!$)*3_X"0"``$`@A`$``(0)P#"$"2L8@!$$```"B0"``&,@P`4
+M`&(8(8QF`$`D`@`!`*(0!``"$"<`PA`DK&(`0"0"``$#X``()[T`$">]__`L
+MHP!`$&``%@``$"4LH@`@%$``"S0"@`",@P`4`&(8(8QF`$0DI/_@)`(``0""
+M$`0`PA`EK&(`1!````DD`@`!C(,`%`!B&"&,9@!`)`(``0"B$`0`PA`EK&(`
+M0"0"``$#X``()[T`$(R"`!0T`X```$,0(8Q#`#R,1`$,,(4`(#1B`@``11@+
+M/`("`@""("0T8@$``^``"`!D$`HGO?_PC((`%#0#@```0Q`A,*,`_ZQ#`#PP
+MHP(`)`(`(```,"4PI0$`$*```P!#,`L\`@("`,(P)8R"`!0T`X```$,0(:Q&
+M`0P0P``&`````(R#`!2,8@`T-$(`$!````:L8@`TC((`%(Q#`#0D!/_O`&08
+M)*Q#`#0#X``()[T`$*B@``BXH``+,,8/_ZBF``RXI@`/,.<`(!#@``8`````
+MB*(`#)BB``\T0B``J*(`#+BB``^HH``4N*``%XBB`!28H@`7J*(`$+BB`!,#
+MX``()`(``2>]_^BOOP`0CZ@`,(BC`!28HP`7,&,``1!@`'$D`@`/B.(`%)CB
+M`!<P0@`!%$``!0````",@@`4C$,`#!!F`&@D`@`/B*(`$)BB`!,P0@__I0(`
+M`(BB`!28H@`7``(4`C!"?_^E`@`"H0``!(BB`!"8H@`3``(5`C!"`/^A`@`&
+M``(6```"%@,D`_^`%$,``@````"A```&B*(`%)BB`!<P0@$`$$``!R0"`/^(
+MH@`4F*(`%S!"_@```A)"$````J$"``>A`@`'B*(`$)BB`!,``A/",$(`'Z$"
+M``B(H@`0F*(`$P`"%P*A`@`)B*(`$)BB`!,``A,",$(``:$"``J(H@`4F*(`
+M%S!"``(40``T```0)8BB`!28H@`7,$(`!!!```4`````D0(`!#1"``$0```J
+MH0(`!(BB`!28H@`7,$(`$!!``!0`````D0(`!#1"``*A`@`$B*(`%)BB`!<P
+M0O\```(2`J$"``6,@S`<.$(`!0`"$"L``Q`+$$``%SP"```D0@```$#X"0$`
+M*"40```3```0)8BB`!28H@`7,$(`"!!```4`````D0(`!#1"``@0```)H0(`
+M!(BB`!28H@`7,$(`(!!```4``!`ED0(`!#1"`!"A`@`$```0)8^_`!`#X``(
+M)[T`&">]_TBOOP"TK[X`L*^W`*ROM@"HK[4`I*^T`*"OLP"<K[(`F*^Q`)2O
+ML`"0`("():^E`+P`P/`EKZ<`Q`(@H"67P@`"``(1PC!#``&7P@`",$(!`!!`
+M``4``+`E%&`$<B0#``P0```(E\(``I?"``(``A'".$(``3!"``$40`1J)`,`
+M#)?"``(``A&",$,``9?"``(P0@`@$$``!0`````48`1A)`,`#!````@\`@``
+ME\(``@`"$8(X0@`!,$(``11`!%DD`P`,/`(``"1"```"("`E```H)0!`^`DD
+M!@`!$$`$5@(@("4\`@``)$(```!`^`D#P"@E`$"H)1*@!$HD`P`,)`(`!H^C
+M`+P08@`++&(`!Q!```8D`@`(+&(``A!`!$$D`P`,$```!8^E`,2/I`"\%(($
+M/"0#``R/I0#$$*``$`````".(@`4C$(10*^B`'@\`@``)$(```(@("4`0/@)
+M`J`H)3P"```D0@```B`@)0!`^`D``"@E$````XXD`<ROH`!XCB0!S#B#``<L
+M8P`!.((`"RQ"``$`8A@E%&``#(^F`,0D`P`*$(,`"20"``D0@@`'`````!2#
+M`!H`````EB(!T"Q"``000``6`````!#``!0`````CB02-!"``!$`````E\,`
+M`)2"```08@`-`````)?#``*4@@`",&,!\#!"`?`48@`'/`(``"1"```"("`E
+M`$#X"0/`*"440`0&)`(``8XE`!0T`H```*(0(8Q#`%BOHP!\)`,``8^D`'P`
+M@#`E`&8@"J^D`'R,0P`$/`("(`!B&"2OHP"$C*)`$*^B`$B3HP!()Z0`2)""
+M``$``A(``&(8)9""``(``A0``&(8)3P"`/XT0@!@`&(8)*^C`(",HD`4KZ(`
+M3).C`$PGI`!,D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+MKZ,`<(RB0!BOH@!0DZ,`4">D`%"0@@`!``(2``!B&"60@@`"``(4``!B&"60
+M@@`#``(6``!B&"6OHP!T/`(``"1"```"("`E`$#X"8^E`+P\`@``)$(```!`
+M^`D"("`E/`(``"1"```"("`E`$#X"0/`*"400`.Y)`,``Y?"``(P0P'P)`(!
+M0!!B`"`H8@%!$$``#R0"",`D`@#`$&(`)BAB`,$00``&)`(`T"0"`*`08@`=
+M)`,`#!```ZF/I0#($&(`(20#``P0``.ECZ4`R!!B`!DH8@C!$$``!B0""4`D
+M`@%0$&(`#"0#``P0``.<CZ4`R!!B``4D`@E0$&(`!B0#``P0``.6CZ4`R"07
+M``$0```0K[<`B"07``(D`@`!$```#*^B`(@D%P`#)`,``A````BOHP"()!<`
+M!"0$``(0```$KZ0`B"07``4D!0`"KZ4`B(XB`!0T`X```$,0(20#``>L0Q@`
+M``"`)3P"```D4Q90)[(`5``0$$``4!@A``,0P`!3$"&,1```)(+``"Q"$``0
+M0``6`!`00``#$$``5Q`A``(0@`!3$"&,0@``KZ(`5).C`%220@`!``(2``!B
+M&"620@`"``(4``!B&"620@`#``(6``!B&"6.(@`4`$00(:Q#```0```.)M8`
+M`0!0$"$``AC``',8(8XD`!2,8P```(,@(0`"$$``5Q`A``(0@`!3$"&,0@``
+MK((``";6``$RP@`_%$``!#P&```DQ@```,#X"20$``$F$``!+@(`&11`_\T`
+M$!!```"`)3P"```D4QBH)[(`6``0$,``4Q`AC$0``(^B`,000``,/`7__S2E
+M?^``A1@A+&,`&3P"__\T0G\L`((0(2Q"``DX0@`!``,0"Q!``"0`````)(+`
+M`"Q"$``00``4`!`8P``0$,``4Q`AC$(`!*^B`%B3HP!8DD(``0`"$@``8A@E
+MDD(``@`"%```8A@EDD(``P`"%@``8A@ECB(`%`!$$"&L0P``$```!R;6``&.
+M(@`4`$00(0!S&"&,8P`$K$,``";6``$RP@`_%$``!#P&```DQ@```,#X"20$
+M``$F$``!+@(`Q!1`_\H`$!#`CH(LK`(@("4"X"@ECZ8`B`!`^`D"P#@EE\(`
+M`C!"P``00``%/`(``"1"```"("`E`$#X"0/`*"66(@'2+$(`0A1``$DT`X``
+MCB(`%`!#$"$\`P`"-&.@`JQ#&"R7PP``)`()M!1B``X\`V9FDH(2DI:#$IP`
+M0Q`C/`-F9C1C9F<`0P`8```8$``#&$,``A?#`&(8(P`#'``0```'``,D`Y*"
+M$I(T8V9G`$,`&```$!```A/```(D`Y?"``(P0@#0)`,`P!1#`!`T`X``CB4`
+M%#0"@```HB@ADH(2D@`"$",``A&`,$(/P``$&",``QR`/`0`_`!D&"0`0Q`E
+MK*(93!````6.)``4CB(`%`!#$"&L0!E,CB0`%#0"@```@B`AC((B*"0#_?\`
+M0Q`DK((B*(XD`!0T`H```((@(8R"(B@\`__^-&,#_P!#$"0T0@@`K((B*(XB
+M`!0T`X```$,0(20#``^L0P!@EB(!TBQ"`$,40``$-`.``(XB`!0`0Q`AK$`B
+M5(XB`!0T`X```$,0(20#``ZL0QAXCB,!S"0$``H09``))`(`"1!B``<`````
+M%&0`$SP"``"6(@'0+$(`!!!```\\`@``E\,``#AB"9XX8PFC``(0*P``("4`
+M0R`+CB,`%#0"@```8A@AC&(B3!!$``,\`@``K&0B3#P"```D0@```B`@)0*@
+M*"4`0/@))Z8`$!!``H(D`P`#)`(`!H^C`+P08@`'`````(XB`@000``$/`(`
+M`"1"````0/@)`B`@)8Z"++@"("`E`J`H)3+F__\`0/@))Z<`$!!``G`D`P`#
+ME\(``C!"`$`00``>)`0`"HXC`<P09``-)`(`"1!B``L`````%&0`!0````"6
+M(@'0+$(`!!1```4`````EH(2<"Q"4`,40``+/`(``)?"``(P0@"@)`,`H!!#
+M``4\`@``)$(```(@("4`0/@)`J`H)3P"```D0@```B`@)0!`^`D#P"@E/`(`
+M`"1"```"("`E`$#X"0*@*"400`)()`,``X^D`,00@``$`````(XB`!2/I0!X
+MK$410(XD`!0T`H```((@(9*#+#"2@BPQ``(2``!B&"62@BPR``(4``!B&"62
+M@BPS``(6``!B&"6L@P``CB0`%#0"@```@B`ADH,L-)*"+#4``A(``&(8)8^F
+M`(0`9A@ECH(OS`!B&"4\`@"``&(8):R#``0\`@``)$(```(@("4`0/@)CZ4`
+MO(XD`!0T`H```((@(9*#+#R2@BP]``(2``!B&"62@BP^``(4``!B&"62@BP_
+M``(6``!B&"6L@P#@CB0`%#0"@```@B`ADH,L0)*"+$$``A(``&(8):R#`.2.
+M)0`4C*)`$*^B`%R3HP!<)Z0`7)""``$``A(``&(8)9""``(``A0``&(8)9""
+M``,``A8``&(8)8^B`(``8A@EKZ,`8).C`&`GI`!@D((``0`"$@``8A@ED((`
+M`@`"%```8A@ED((``P`"%@``8A@EK*-`$(^C`'"OHP!DDZ,`9">D`&20@@`!
+M``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6.(@`4K$-`%(^D`'2O
+MI`!HDZ,`:">D`&B0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B
+M&"6.(@`4K$-`&(XB`!0T`X```$,0(8^E`'RL10!8CB0`%#0"@```@B`ADH,L
+M-I*"+#<``A(``&(8)9*"+#@``A0``&(8)9*"+#D``A8``&(8):R#``B.)``4
+M-`*```""("&2@RPZDH(L.P`"$@``8A@EK(,`#(XB`!0T`X```$,0(8Z#+]2L
+M0P`8CB,`%"0"__^L8@"`/`(``"1"```"("`E`$#X"0*@*"400`&F)`,``SP"
+M```D0@```B`@)9(E$C@`0/@))`8``3P"```D0@```B`@)0!`^`D#P"@EEB(!
+MU#!"`/`D0O_0+$(`0!!``!(`````CB,2-(QB```P0L``$$``#20'``V49@`"
+M,,9``"0%``R.)``4-`*```""("&,@A@D)`/_\`!#$"0`YB@*`$40):R"&"2.
+M(@`4-`.```!#$"&,0AD4,$0__Y?"``(P0@`@$$``!P`$$(`\`[HN-&.+HP!#
+M`!D``!`0$```!@`"(0(\`LS,-$+,S0""`!D``!`0``(@PHXB`!0T`X```$,0
+M(20#``&L0Q@<CB(2-)1"``(P0D``$$``!SP"````!"!`)$(```!`^`DDA`!D
+M$```$(XB`!2.(A(TE$(``C!"@``00``'/`(````$((`D0@```$#X"22$`&00
+M```%CB(`%"1"````0/@))(0`9(XB`!0T`X```$,0(8Q6&`@D`S@`K$,8""00
+M``&.(@`4-`.```!#$"&,0APD,$(`$!!```\\`@``)%,``#02@``"8/@))`0`
+MR`(`$"4H0@`4$$``!R80``&.(@`4`%(0(8Q"'"0P0@`0%$#_]0````".(@`4
+M-`.```!#$"&L5A@(CB,`%#0"@```8A@AC&(88#1"``.L8AA@E\(``C!"`*`D
+M`P"@$$,`$R0"``*.@R_`$&(`$#0"@`".(P`4`&(8(8QB&2`T0O``K&(9((XD
+M`!0T`H```((@(8R"&2`\`P`!`$,0):R"&2`D`@`!$````JZ"+\"N@"_`/`(`
+M`"1"````0/@)`B`@)0``@"4D!@`!)Z4`;``0((`D@M``+$(0`!!``!(`$!"`
+M`@80!*^B`&R3HP!LD*(``0`"$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``
+M8A@ECB(`%`!$$"&L0Q``$```!B80``&.(P`4`&(8(0(&$`2L8A``)A```2H"
+M``H40/_D`!`@@*Z`1J"6(@'H$$``"P``@"4\`@``)%(```(@("4"0/@)`@`H
+M)280``&6(@'H`@(0*A1`__H"("`E/`(`"#1""66N@BQ$)`(`!H^C`+P48@`#
+M/`(`"#1"&66N@BQ$CB,`%(Z"+$2L8@"@CB0`%(R"`*P\`P`'`$,0):R"`*R.
+M(A),$$``!#P"```D0@```$#X"0(@("4\`@``)$(```(@("4T!9A@)`8``0!`
+M^`D``#@E/`(``"1"```"("`E`$#X"8^E`+R.)``4-`*```""("&,@@`@/`/^
+M?S1C__\`0Q`DK((`((XC`<PL8@`&$$``!R0"``448@`0`````)8B`=`L0@`(
+M%$``#`````".(@`4-`.```!#$"$\`P`!-&,`JJQ#`1B.(@`4-`.```!#$"$D
+M`S(0K$,!'(XB`!0T`X```$,0(20#`%*L0P$(E\(``C!"`0`00``#`````!``
+M``*"AA*.@H82CSP"```D0@```B`@)0!`^`D#P"@E``(6```"1@..@B_@,$<`
+M/X:$+_0`Y!@C@J(`!@!#&"L`1!`A.&,```!#.`N"H@`%``(00`!(&",`9Q`K
+M$$```@"`$"4`8C@ACH(OX#!&/P``!C("AH0O]`#$&"."H@`&`$,8*P!$$"$X
+M8P```$,P"X*B``4``A!``$@8(P!F$"L00``"`(`0)0!B,"&6A2_@,*4`/X:$
+M+_0`I!@C@J(`!@!#&"L`1!`A.&,```!#*`N"H@`%``(00`!(&",`91`K$$``
+M!"SB`$``@!`E`&(H(2SB`$`D`P`_`&(X"BS"`$``8C`*+*(`0`!B*`HPY``_
+M``82`#!"/P``@B`E``44`#P#`#\`0Q`D`((@)8XB`!0T`X```$,0(:Q$`.B.
+MA"_0$(``!`````".(@`4`$,0(:Q$`2".A2_X)`+__Q"B``0\`@``)$(```!`
+M^`D"("`ECH4O_"0"__\0H@`$/`(``"1"````0/@)`B`@)8Z%,``D`O__$*(`
+M!#P"```D0@```$#X"0(@("6.)`'X$(``!#0#@`".(@`4`$,0(:Q$`$B/I`"\
+MKB0!W(^E`,00H``H)`(``9*C``0P8@`"%$```C!B`/ZBH@`$EJ(``J?"``*2
+MH@`$H\(`!)*B``6CP@`%DJ(`!J/"``:2H@`'H\(`!XXB$C0``"`E```H):Q$
+M`#"L10`T/`(``"1"````0/@)`B`@)8XD$C2L@@`HK(,`+#P"```D0@```B`@
+M)0!`^`DD!0`!$```!B0"``&/I0#(C*(``!!```(``!`EK*,``(^_`+2/O@"P
+MC[<`K(^V`*B/M0"DC[0`H(^S`)R/L@"8C[$`E(^P`)`#X``()[T`N`"`,"6,
+MQ0($,*(``Q!```PGO?_PC,0`%#0"@```@B`AC(,91#P"W_\T0O__`&(8)#"B
+M``$``A=``&(8):R#&40PH@`,$$``$0`"$((P0@`!%$``"30#@`",Q``4-`*`
+M``""("&,@@#0)`/_XP!#$"00```&K((`T(S"`!0`0Q`AC$,`T#1C`!RL0P#0
+M`^``"">]`!`GO?_HK[\`$(R"++0`0/@)```````"$"N/OP`0`^``"">]`!@G
+MO?^XK[\`1*^V`$"OM0`\K[0`.*^S`#2OL@`PK[$`+*^P`"@`@(@E`*"H)204
+M``$\`@``)$(```!`^`D"(+`E`$"0)0``@"4\`@``)%,``)8B`>@"`A`K$$``
+M!@(@("4"8/@)`@`H)1!`__DF$``!``"@)1*``(T``!`ECB(`%#0#@```0Q`A
+M)`,``:Q#&7P``(`ECB(`%#0#@```0Q`AC$(<(!1```\N`@!D/`(``"14```T
+M$X```H#X"20$``4F$``!+@(`9!!``'@``!`ECB(`%`!3$"&,0AP@$$#_]BX"
+M`&000`!Q```0)3P"```D0@```B`@)0!`^`D"0"@E$$``:C0#@`".(@`4`$,0
+M(8Q"&10P13__ED0``C"$`"``!1"`/`.Z+C1CBZ,`0P`9```0$!2```8``AD"
+M/`+,S#1"S,T`H@`9```0$``"&,(\`@``)$(```!`^`DD9`!D/`(``"1"```"
+M("`E`D`H)0!`^`DGI@`0$$``3#0#@`".(@`4`$,0(:Q`&7R60@`",$(`0!!`
+M`!XD!``*CB,!S!!D``TD`@`)$&(`"P`````49``%`````)8B`=`L0@`$%$``
+M!0````"6PA)P+$)0`Q1```L\`@``EJ(``C!"`*`D`P"@$$,`!3P"```D0@``
+M`B`@)0!`^`D"0"@E/`(``"1"```"("`E`$#X"0*@*"6.(P`4-`*```!B&"&,
+M8AA@-$(``JQB&&"20P`$,&(``A1```(P8@#^HD(`!)9"``*FH@`"DD(`!**B
+M``220@`%HJ(`!9)"``:BH@`&DD(`!Z*B``>.(A(T```@)0``*"6L1``PK$4`
+M-#P"```D0@```$#X"0(@("6.)!(TK((`**R#`"P\`@``)$(```(@("4`0/@)
+M)`4``20"``&/OP!$C[8`0(^U`#R/M``XC[,`-(^R`#"/L0`LC[``*`/@``@G
+MO0!()[W_\(R"`!0T`X```$,0(8Q&``0\`O_\-$+__P#","0D`@`!$*(`(RBB
+M``(00``%)`(`!A"@`!4T`H``$```(P`````0H@`%)`(`"!"B`!D`````$```
+M'0````",@P`4-`*```!B&"$\`A`!`,(0):QB``2,A``4C((`%"0#_]\`0Q`D
+M$```$:R"`!2,@P`4`&(8(3P"$`(`PA`EK&(`!(R#`!2,8@`4-$(`(!````>L
+M8@`4C(,`%#0"@```8A@A/`(0``#"$"6L8@`$`^``"">]`!`GO?_HK[\`$#P"
+M``$D0MC8`$#X"20%``*/OP`0`^``"">]`!@GO?_HK[\`%*^P`!``@(`E/`(`
+M`"1"`````"@E`$#X"20&``$00``%`@`@)3P"``$D0MC8`$#X"20%`!./OP`4
+MC[``$`/@``@GO0`8)[W_T*^_`"ROL@`HK[$`)*^P`"``@(@E`*"`)3P"``$D
+M0MC8`$#X"20%`!,00`"@```H)3P"```D0@```B`@)0!`^`DD!@`!$$``FH^_
+M`"P\`@`!)$+8V`(@("4`0/@)```H)1!``)./OP`L$@``D20"``&.(P',)`0`
+M"A!D``DD`@`)$&(`!P`````49``/`````)8B`=`L0@`$$$``"P````"6`P`"
+M,&(`(!1```4D$@`(,&,`T"0"`,`48@`X)`0`!!```#8D!`#KEB(!U#!"`/`D
+M0O_0+$(`0!1```D`````CB(!S#A#``<L8P`!.$(`"RQ"``$`8A@E$&``%0``
+M``"6`P`",&(`(!1```4D$@`(,&,`T"0"`,`48@`#`````!```!XD!`#KE@(`
+M`C!"0``40``:)`0!ZI8"``(P0H``)`0`ZB0#`NH0```4`&(@"Y8#``(P8@`@
+M%$``!0``D"4P8P#0)`(`P!1B``,`````$```"B0$`*N6`@`",$)``!1```8D
+M!`&JE@(``C!"@``D!`"J)`,"J@!B(`N6`P`",&(`0!!```@P8@`@%$``!#!C
+M`-`D`@#`%&(``P`````0```%-E(`!)8"``(P0@!`-D,``0!BD`J6!0`",*,!
+M`#9"``(`0Y`*,*,`$"0"``,`0(`E``.`"HXB`!0T`X```$,0(8Q&&'PPH@`@
+M%$``!#"C`-`D`@#`%&(`$P````".(@`4-`.```!#$"&L4!@$CB(`%`!#$"&L
+M4B(`$,0`&R0"``&.(@`4`$,0(:Q$&'P\`@``)$(```!`^`DD!`$L$```$B0"
+M``$0Q``(-`.``(XB`!0`0Q`AK$08?#P"```D0@```$#X"20$`2R.(@`4-`.`
+M``!#$"&L4!@$CB(`%`!#$"&L4B(`)`(``8^_`"R/L@`HC[$`)(^P`"`#X``(
+M)[T`,">]_\BOOP`TK[0`,*^S`"ROL@`HK[$`)*^P`"``@(@E`*"@)0#`D"4"
+M()@E/`(``"1"````0/@)KD````!`@"42``#!C[\`-(YC+\`X8@`"+$(``2QC
+M``$`0Q`E$$```B0"``&N0@``CF0OP"0"``$4@@!A-`.``(XB`!0`0Q`AC$(9
+M(#P#``$`0Q`D%$``6@``,"6N8"_`KD0``#0)@``\"``!CB(`%`!)&"&,91P0
+MC&0<%(QG'!@`!!`K``40"A1```@`````C&(9(`!($"6L8AD@),8``2C"``H4
+M0/_Q```````%,@(`!!("`,(P(0`$0<(I`@`".$(``0`&$`H00`!7``<0(P`"
+M%@```CX#`.8`&@``$!(4P``"```````'``T`0#@E*./_X"CD`"`D`@`?`$0X
+M"B0"_^`X8P```$,X"P"H`!L``"@2%0```@``````!P`-)*7_@"BC__`HI``0
+M)`(`#P!$*`HD`O_P.&,```!#*`N.)``4-`*```""("&,@QD@)`+X'P!B&"0`
+M!Q%`,$('X`!B&"6L@QD@CB0`%#0"@```@B`AC((9("0#_^``0Q`D,*,`'P!#
+M$"6L@AD@CB,`%#0"@```8A@AC&(9(#1""`"L8AD@)`(``JYB+\`D`@`!K@(`
+M$*('`!00```;H@4`%9:"``(P0@"@)`,`H!!#`!8D`@`"CF,OP!1B`!0\`@``
+MC@(`$!1``!$\`@``CB,`%#0"@```8A@AC&(9(#1"\`"L8AD@CB0`%#0"@```
+M@B`AC((9(#P#``$`0Q`EK((9("0"``&N8B_`/`(``"1"```"("`E`$#X"0(`
+M*"66`@`",$(``A1``"HT`H``CB,`%`!B&"&,8AA@-$(``JQB&&"6A0`",*(!
+M`!1```H`````EB(!U#!"`/`D0O_0+$(`0!!``"(D`@`!,*(`0!!``!\D`@`!
+MCB0!S#B#``<X@@`+``(0*P`#$`H00``7)`,`"A"#`!4D`@`)$((`%"0"``$4
+M@P`&/`(``98B`=`L0@`$%$``#B0"``$\`@`!)$(`Z`!`^`D"("`E$```""0"
+M``&6@@`"-$(``J:"``*6`@`",$+__:8"``(D`@`!C[\`-(^T`#"/LP`LC[(`
+M*(^Q`"2/L``@`^``"">]`#@GO?_(K[\`-*^R`#"OL0`LK[``*`"`B"4`H(`E
+M%@```Z^P`"0D`O__KZ(`)(XC`<PD`@`)$&(`!R0"``H48@`'`````)8B`=`L
+M0@`$$$```P`````D`O_O`@*`)(XE`!2,H@`,K[``().C`"`GI``@D((``0`"
+M$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EK*-``#P"```D0@```$#X
+M"20$``^/H@`D,$(``Z^B`"0R$``#/`(``"1"```"("`E)`5``(^F`"0`0/@)
+M`@`X)0!`D"4R`@`!%$``&P)`$"4D`@`4KZ(`)(XE`!23HP`D)Z0`))""``$`
+M`A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC`!0\`@``)$(```(@
+M("4``"@E`$#X"20&``$00``$`D`0)8XB`!2,0@#``D`0)8^_`#2/L@`PC[$`
+M+(^P`"@#X``()[T`.(R"`!0T`X```$,0(8Q"&&0``A3",$,!_S!B`0`00``#
+M`````#AB`?\``A@G`^``"`!@$"64H@`",$,!X"0"`,`08@`1`````"AB`,$0
+M0``&)`(!0"0"`*`08@`(``````/@``@``!`E%&(`"@````"4@A+,$```":3"
+M``"4@A+.$```!J3"``"4@A+0$````Z3"```#X``(```0)20"``$#X``(````
+M`">]_]BOOP`DK[(`(*^Q`!ROL``8`("()0"@D"6.(@`4-`.```!#$"&,0AA@
+M,$(``A1``!@``(`E/`(``"1"````0/@)``````!`@"4\`@`!)$+:<`(@("4"
+M0"@E`$#X"2>F`!`00``)AZ(`$`!0$"H00``'`````)9"``(T0@`"ID(``A``
+M``(``(`E``"`):90`!8"`!`EC[\`)(^R`""/L0`<C[``&`/@``@GO0`H)[W_
+M\(R"`>`\`R```$,0)!!``!L`@#`EC(,`%"0"``&L8@0@C,(`%*Q`!@",PP`4
+MC&(&`#1"``BL8@8`C,,`%#P"`!`T0@(!K&(&!(S"`!2L0`8@```H)8S"`!2L
+M100`C,,`%`"D$"&00B\XK&($!"2E``$HH@"`%$#_]P`````#X``()[T`$">]
+M_^BOOP`0`(!P)0``8"4DR?__``E(PB3&__\PQ@`'`*!`)1B@`!P``%`E)`T`
+M""0+``$`!SC``,@@(2R"``D!HB`*`(L0!"1"__\`RQ@$)&/__P!#$"8`XA`$
+M``D8@`!N&"&,8P```$,0)`#B$`8`PA`&`4(0!`&"8"4`AB`C`410(0$&$"$D
+M2/_X```P)1T`_^DE*0`!/`(``"1"````0/@)`8`@)8^_`!`#X``()[T`&">]
+M__``@$`EE,(``C!#`>`D`@#`$&(`#P$`2"4H8@#!$$``!B0"`4`D`@"@$&(`
+M!P``$"40``!1`````!1B`$\``!`E$```!```&"40```")`,``20#``(``QA`
+M)20`!`!D$"&41Q+FE$(2[``"$8``XC@E`&00(91"$O(``A,``.(X)0!D$"&4
+M0A+X``(4@`#B."4`9!`AE$(2_@`"%@``XC@E`&00(91&$P240A,*``(1@`#"
+M,"4`9!`AE$(3$``"$P``PC`E`&00(91"$Q8``A2``,(P)0!D&"&48A,<``(6
+M``#","4D`@`!$*(`!P`````0H``()`(``A"B``4``!`E$```'0`````0```"
+M`.`P)0#`."44QP`*-`.``(T$`!0T`H```((@(8R"(@@D`]__`$,0)*R"(@@0
+M```'K24OO(T"`!0`0Q`AC$,B"#1C(`"L0R((K24OO(T"`!0T`X```$,0(:Q'
+M&6"-`@`4`$,0(:Q&&60D`@`!`^``"">]`!",@P',)`8`"A!F`!@`````)`(`
+M"1!B`!4`````%&8`!0````"4@@'0+$(`!!1``!`D!@`HC((!S#A#``<L8P`!
+M.$(`"RQ"``$`8A@E%&``""0&`"B4@@'4,$(`\"1"_]`L0@!`$$```B0&`"`D
+M!@`HE*(```!&`!L``!@0%,```@``````!P`-)&+_]BQ"``TX0@`!`^``"``#
+M$`HGO?_`K[\`/*^V`#BOM0`TK[0`,*^S`"ROL@`HK[$`)*^P`"``@)`E`*"@
+M)9:"``(``A'",%4``9:"``(P0P'P)`(!0!!B`!\"0(`E*&(!01!```\D`@C`
+M)`(`P!!B`$`H8@#!$$``!B0"`-`D`@"@$&(`.0``$"40``$\C[\`/!!B`#<`
+M`!`E$``!.(^_`#P08@`S*&((P1!```8D`@E`)`(!4!!B``<``!`E$``!+X^_
+M`#P08@`#)`()4!1B`2H``!`EED(!U#!"`/`D0O_0+$(`0!1``",``)@ECD0!
+MS#B#``<X@@`+``(0*P`#$`H00``<)`,`"A"#`!HD`@`)$((`&``````4@P`%
+M`````)9"`=`L0@`$%$``$@````".1``4-`*```""("&,@QE$)`+_QP!B&"2.
+M`BPLA$(````"$,`P0@`X`&(8):R#&400```%CD0`%!````(D$P`!)!,``HY$
+M`!0T`H```((@(8R#&1`D`OP&`&(8)``3$$``4!`AE$(2Y``"$0``8A@E-&,`
+M`:R#&1`\`@``)$(```)`("6.!2^\`$#X"0*`,"6.0P`4-`*```!B&"$`$Q!`
+M`%`0(91"$LPP0@'_-$("`*QB&6B6`A)P+$)0`!1``!8`$Q!`EH(``C!"`!`0
+M0``1`!4@0"2"$T`F`P`$`&(0(91%```FHA-(`&(8(8!F```"`A`A@$<`!B2"
+M$T@"`A`AE$@``"2$$U`"!"`A$```$926````$Q!`)@0``@!$$"&411*@`G`0
+M(8!&$L8FHA+(`@(0(8!'``$`%1A`)&(2J`("$"&42```)&,3,`"#("&4E@``
+MCD0`%#0"@```@B`AC(,81"0"P'\`8A@D``41P#!"/X``8A@EK(,81(Y$`!0T
+M`H```((@(8R"&%`D`_\``$,0)###`/\`0Q`EK((84(Y$`!0T`H```((@(8R#
+M&%`\`O__-$(`_P!B&"0`!Q(`,$+_``!B&"6L@QA0CD4`%#0"@```HB@AC*08
+M2#P"__PT0@__`((@)``($P`\`P`#-&/P``!#$"0`@B`EK*082(Y%`!0T`H``
+M`*(H(0`3($``D!`AE$(2N@`"'@```A0``&(8)0"0("&4A!+```02``!B&"4`
+M9!@EK*,8-(Y$`!0T`H```((@(8R#&"@\`O__-$(`_P!B&"0`$Q!``%`0(91"
+M$JX``A(``&(8):R#&"B.10`4-`*```"B*"&,I!AD/`+_^#1"#_\`@B`D`!,0
+M0`!0$"&40A*T``(3`#P#``<T8_```$,0)`""("6LI!ADE@(2<"Q",`,00``+
+M)!$``I9#`<HD`A`B%&(`$0````"6@@`",$(`0!!```T`````$```"R01``@\
+M`@``)$(```)`("4`0/@)`H`H)1!```0`$Q!``%`0(91"$R8"(H@ACD0`%#0"
+M@```@B`AC(,9)"0"_P$`8A@D`!$00#!"`/X`8A@EK(,9)(Z"`!`00``$`!48
+M0(*%`!00```'@H8`%21B$[`"`A`AE$4`!B1C$[@"`Q@AE&8``HY$`!0T`H``
+M`((@(8R#&2`D`O@?`&(8)``%$4`P0@?@`&(8):R#&2".1``4-`*```""("&,
+M@AD@)`/_X`!#$"0PPP`?`$,0):R"&2".0P`4-`*```!B&"&,8AD@-$((`*QB
+M&2"6!!)P+()``11``!,D`P#0EH(``C!"`-`40P`#+()0`!1```T`````CD4`
+M%#0"@```HB@AC*0B##P"_P,T0O__`((@)``6%(`\`P#\`$,0)`""("6LI"(,
+ME@(2<"Q"4`$40``&)`(``8Y"`!0T`X```$,0(:Q`&>`D`@`!C[\`/(^V`#B/
+MM0`TC[0`,(^S`"R/L@`HC[$`)(^P`"`#X``()[T`0">]_XBOOP!TK[X`<*^W
+M`&ROM@!HK[4`9*^T`&"OLP!<K[(`6*^Q`%2OL`!0`("0)0"@\"6OH``0KZ``
+M%*^@`!BOH``<KZ``(*^@`"2OH`!(``"X):^@`$PD`P`!IZ,`*"0"``*GH@`J
+MIZ(`+*>C`"ZGHP`PIZ(`,J>C`#27P@`"``(1PC!4``$2@``'E\,````#$(``
+M0Q`A``(00"1"IB@0```(,$+__P`#$(``0Q`A``(00#P#__\T8T"8`$,0(3!"
+M__\`0)@EE\(`.!1``!\`0(@E-!&``"0"`%>7PP`",&,`$"0$`*XX8P```(,0
+M"P``@"4"8K`C$````@)BJ"$P4/__+@(`!1!```\"0"`ECD(!Q`(`*"4`0/@)
+M`H`P)30#@``00P`(,$,__P!V$"H40/_S)@(``0*C$"H40/_P)@(``0!@B"6G
+MT0`X-`*``!8B`%(`````CD(`%`!1("&,@AD@/`-```!#$"000`%I`````(R"
+M&0P\`P#_-&/__P!#$"2L@AD,CD,`%#0"@```8A@AC&09(#P"C_\T0O__`((@
+M)*QD&0R.0@`4-`.```!#$"&L0!F@CD(`%`!#$"&L0!F`CD0`%#0"@```@B`A
+MC((9A#P#__``0Q`DK((9A(Y"`!0T`X```$,0(:Q`&9B.1``4-`*```""("&,
+M@AF</`/_\`!#$"2L@AF<CD(`%#0#@```0Q`AK$`9`(Y"`!0`0Q`AK$`9!(Y"
+M`!0`0Q`AK$`9"(Y$`!0T`H```((@(8R"&0PD`\```$,0)*R"&0R.0@`4-`.`
+M``!#$"&L0!F(CD(`%`!#$"&L0!F,CD(`%`!#$"&L0!F0CD0`%#0"@```@B`A
+MC((9E"0#P```0Q`DK((9E!```2"/OP!TE\(``C!%`?`D`@#0$*(`,`(S(",H
+MH@#1$$``!B0"`4`D`@#`$*(`%B0"`^@0```V<((8`A"B``4D`@%0$*(`)"0"
+M`^@0```P<((8`@`$O$`\`E'K-$*%'P+B`!@``!`0``(0PP`7'\,`0[@C`!<2
+M@Z^B`$PD`PPU$```(:^C`$@`!"H`/`()3S1"()4`H@`8```0$``"$$,`!1_#
+M`$,0(Z^B`$P`!+Q`/`)1ZS1"A1\"X@`8```0$``"$,,`%Q_#`$.X(R0"##40
+M```-KZ(`2``$O``\`E'K-$*%'P+B`!@``!`0``(0PP`7'\,`0[@C`!<2@Z^B
+M`$PD`QAJKZ,`2"0"`^AP@A@"``,9`(^D`$@`9``:```0$A2```(```````<`
+M#0!`&"4P8@`/)`@`!!1```,GI0`H)`@``R>E`#`1``!:``"`)0`#,0,HR0`=
+M)`<``1$@`,@`T!`A)$0`&2R"`"$00``1)(/_WRB"`!H00``&*((`&P"'$`2/
+MHP`0`$,0)1```!"OH@`0%$``#R2"``$D@O__`$<0!(^C`!``0Q`E$```"*^B
+M`!`L8@`4$$``!B2"``$`9Q`$CZ,`%`!#$"6OH@`4)((``2Q"`!`00``+)(+_
+M\0`0$$``11`AE$,````$$$`D0@`"`$,8!(^B`!@`8A@E$```)Z^C`!@L0@`0
+M$$``"R2"_^$`$!!``$40(91#````!!!`)$+_X@!#&`2/H@`<`&(8)1```!JO
+MHP`<+$(`$!!```LD@O_1`!`00`!%$"&40P````000"1"_\(`0Q@$CZ(`(`!B
+M&"40```-KZ,`("Q"``<00``+)@(``0`0$$``11`AE$,````$$$`D0O^B`$,8
+M!(^B`"0`8A@EKZ,`)"8"``$P4/__`@@0*A1`_ZL`````CD0`%#0"@```@B`A
+MC((9##P#`/\T8___`$,0)#P#_P``0Q`EK((9#(Y#`!0T`H```&(8(8QD&2`\
+M`G```((@):QD&2".1``4-`*```""("&/I0!,``4=`#P"/_``8A@D/`(`#S1"
+M__\"XA`D`&(8)3P"0```8A@EK(,9H(Y"`!0T`X```$,0(8^C`!"L0QF`CD4`
+M%#0"@```HB@AC*09A#P"__``@B`DCZ(`%#P#``\T8___`$,0)`""("6LI!F$
+MCD(`%#0#@```0Q`ACZ,`$*Q#&9B.10`4-`*```"B*"&,I!F</`+_\`""("2/
+MH@`4/`,`#S1C__\`0Q`D`((@):RD&9R.0@`4-`.```!#$"&/HP`8K$,9`(Y"
+M`!0T`X```$,0(8^C`!RL0QD$CD(`%#0#@```0Q`ACZ,`(*Q#&0B.1``4-`*`
+M``""("&,@QD,)`+```!B&"2/H@`D,$(__P!B&"6L@QD,CD(`%#0#@```0Q`A
+MCZ,`&*Q#&8B.0@`4-`.```!#$"&/HP`<K$,9C(Y"`!0T`X```$,0(8^C`""L
+M0QF0CD0`%#0"@```@B`AC(,9E"0"P```8A@DCZ(`)#!"/_\`8A@EK(,9E(^_
+M`'2/O@!PC[<`;(^V`&B/M0!DC[0`8(^S`%R/L@!8C[$`5(^P`%`#X``()[T`
+M>`"`."4\!&0`E*(``C!"`!`\`\@`.$(```!B(`N4H@`",$)``!!```,GO?_P
+M$```!0`$($*4H@`",$*````$&((`8B`+E*(```""`!L``!@2%$```@``````
+M!P`-`&`@)02```<D!@`?),;__Q#```0`Q!`&,$(``1!`__L`````)`(`)@!&
+M,",D`@`7`$80(R0#``$`0Q@$`(,8(20"`!@`1A`C`$,8!B3&__",Y0`4-`*`
+M``"B*"&,HA@4/`0``32$__\`1!`D``,<0`!#$"6LHA@4C.0`%#0"@```@B`A
+MC(,8%#P"__XT0A__`&(8)``&,T`\`@`!-$+@``#","0`9A@EK(,8%`/@``@G
+MO0`0)[W_X*^_`!@`@#`E+*,`0"0"`#\`0R@*I,4!_#P"```D0@``C,42-`!`
+M^`DGI@`0C[\`&`/@``@GO0`@)[W_J*^_`%2OM`!0K[,`3*^R`$BOL0!$K[``
+M0`"`D"4`H)@E`,"@)0)`B"4\$```)A```(XD1G@"`/@)CB5&?"8D1H`"`/@)
+M)`4`((8B`?PH0@!`%$```I8C`?PD`P`_``,4```"/`,HXP`_.&,``3#B__\L
+M0@`!`&(8)1!@``<\`P``)&,>R(Y"`@```A!``$,0(1````*$1@`````P)20"
+M``&OH@`0)Z(`(*^B`!0GH@`BKZ(`&#P"``$D0O%P`D`@)0!`^`D"8"@E$$``
+MW`)`("6OM``0CB(LO">E`"`GI@`B`$#X"0)@."400`#5C[\`5(Y$`<PX@P`'
+M.((`"P`"$"L``Q`*$$``#B0#``H0@P`,)`(`"1""``L``#`E%(,`!0````"6
+M0@'0+$(`!!1```8D!0`_EB)&GB1"``2F(D:>```P)20%`#\`!A!`)$)&@`(B
+M("&4@@``EB,O]`!#$"&D@@``,$+__RQ"`$`40``"`````*2%```DQ@`!+,(`
+M$!1`__(`!A!`EB(2GBQ"``(00`!9`````)9"`=(L0@!"$$``'B0#`,"68@`"
+M,$(`T!1#`!HD`@FTEF,``!1B``T\`V9FDB(2DI8C$IP`0Q`C/`-F9C1C9F<`
+M0P`8```8$``#&$,``A?#`&(8(Q````<P9?__DB(2DC1C9F<`0P`8```0$``"
+M$$,P1?__/`(``21"^2@`0/@)`D`@)0``,"4GIP`X-`BA@``&((`D@F&`+$(0
+M`!!``!T`````CB)&>`""$"&40P`"``,:`#1C`/\``QP`E$(````"$@`T0@#_
+M,$+__P!B&"6OHP`XDZ,`.)#B``$``A(``&(8)9#B``(``A0``&(8)9#B``,`
+M`A8``&(8)8Y"`!0`1!`A`$@0(:Q#```0```1),8``8Y%`!0`I"@A`*@H(8XB
+M1G@`@B`AE(,``@`#&@`T8P#_``,<`)2"`````A(`-$(`_S!"__\`8A@EK*,`
+M`"3&``$HP@`@%$#_S@`&((".1``4-`*```""("&6(T:&,&,`/P`#'@"6(D:$
+M,$(`/P`"%```8A@EEB)&@C!"`#\``A(``&(8)98B1H`P0@`_`&(8):R#&32.
+M1``4-`*```""("&6(T:.,&,`/P`#'@"6(D:,,$(`/P`"%```8A@EEB)&BC!"
+M`#\``A(``&(8)98B1H@P0@`_`&(8):R#&3B.1``4-`*```""("&6(T:4,&,`
+M/P`#'@"6(D:2,$(`/P`"%```8A@EEB)&GC!"`#\``A(``&(8)98B1I`P0@`_
+M`&(8):R#(C2.1``4-`*```""("&6(T:<,&,`/P`#'@"6(D::,$(`/P`"%```
+M8A@EEB)&F#!"`#\``A(``&(8)98B1I8P0@`_`&(8):R#(CB.1``4-`*```""
+M("&.)2_<)`(`/R0#`'\`91`+K((9/"0"``&/OP!4C[0`4(^S`$R/L@!(C[$`
+M1(^P`$`#X``()[T`6">]_Y"OOP!LK[X`:*^W`&2OM@!@K[4`7*^T`%BOLP!4
+MK[(`4*^Q`$ROL`!(KZ0`<`"@H"4`!C0```8T`Z^F`#@`!SP```<\`Z^G`#P`
+M@(@E)C-&@"0>`#^"@@`%``(00#!"__^OH@!`)`+_P8^C`(BD8@``CZ(`A*1>
+M```\`@``)$(```!`^`DD%0`_,%(`_P``@"6/HP!PE&(3=!!``">OH`!$)C<`
+M!C)6`/@`$!!`)$(3<`+B$"&40P``$&``&C)$__\09``&`!`I@)1"```P0@`'
+M-$(`X!2"`!,``````B4H(9:$```\`P`!)&/ZS`!@^`DDI1?4)`0`X!;$``@`
+M0!@E,&+__P*B$"L00``"``````*@&"40```#,'7__Q````8`0*@E)A```98B
+M$W0"`A`J%$#_W@`0$$"6@@`",$(`T"0#`,`40P`M,D(`^#12``&6(A-T$$``
+M*@``@"4F-P`&,E8`^``0$$`D0A-P`N(0(91#```08``:,D3__Q!D``8`$"F`
+ME$(``#!"``<T0@#@%((`$P`````")2@AEH0``#P#``$D8_K,`&#X"22E%]0D
+M!`#@%L0`"`!`&"4P8O__`\(0*Q!```(``````\`8)1````,P?O__$```"0!`
+M\"4F$``!EB(3=`("$"H40/_=`````!````.6@@`"`J#P)9:"``(P0@$`$$``
+M`P`````0```"@B82CH(F$H\\`@``)$(``(^D`'``0/@)`H`H)0`"%@```H8#
+MEH,``C!B`$`00`"8,&(`@!!```LGH@`8EB<7G*^B`!`\`@`!)$+\E(^D`'`"
+M@"@E`$#X"28F%YX0```*CZ4`0)8G%TJOH@`0/`(``21"_)2/I`!P`H`H)0!`
+M^`DF)A=,CZ4`0`"P$","HA@J`J,0"P`"%````C0#EH(``C!"`!`00``8EZ(`
+M'I8B$G`L0C`!%$``!@````"6(A)^`,(8*@##$`L``A0```(T`Y8B$G`L0D``
+M%$``"Y>B`!Z6@@`",$(`@!!```>7H@`>EB(2@`#"&"H`PQ`+``(4```"-`.7
+MH@`>`,(8*@##$`L``A0```(4`Z^B`$2/HP`X``,00(^D`$0`@A`C``(4```"
+M-`,`!A`G``(7PP`",`J/I0`\`,40*A!```(`H!@E`,`8)0`#%````C0#CZ(`
+M@!!``$`PPO__IF8`"*9F``:F9@`$IF8``J9F``"7I``<,(/__P!#$"L00``"
+M`,`H)0#`("6F9``*EZ0`&C"#__^68@```$,0*Q!```(`````EF0``*9D``R7
+MI``8,(/__Y9B````0Q`K$$```@````"69```IF0`#@`$%````AP#EB(2<"Q"
+M0``40``8`````):"``(P0@"`$$``!P#`("66(A*$`,(0*A!```<`P!`E$```
+M$*9B`!Z6(A*"`((0*A1```@`P!`EEH(``C!"`(`00``#`````!````*6(A*$
+MEB(2@A````.F8@`>EF(``*9B`!Z/I`"(A((``!````>N(B_P`,`H)9>B`!@`
+MPA@J`,,0"P`"%````AP#CZ(`A*1#``"/HP"(I&4``):#``(P8@`@%$``!#!C
+M`-`D`@#`%&(`4X^D`("6)Q>\)Z(`**^B`!`\`@`!)$+\E(^D`'`"@"@E`$#X
+M"28F%[Z/I`!``)`0(P/"&"H#PQ`+``(4```"-`.7H@`N`,(8*@##$`N/I``X
+M``080`!#$",``A0```(T`P`&$"<``A?#``(P"H^E`#P`Q1`J$$```@"@&"4`
+MP!@E``,4```"-`./H@"`$$``&)>B`"X`PA@J`,,0"Z9B`!"7H@`L`,(8*@##
+M$`NF8@`2``(<```#)`.F8@`4EZ(`*@#"&"H`PQ`+IF(`%J9B`!B7H@`H`,(8
+M*@##$`NF8@`:``(<```#'`,0```+IF(`')>B`"P`PA@J`,,0"P`"%````B0#
+MEZ(`*`#"&"H`PQ`+``(4```"'`./I0"$A*(```!B$"H00``"`````*2C``"/
+MHP"(A&(```!$$"H00``"`````*1D``"/I`"`$(``!H^E`(B$H@``KB(OR)8B
+M+\J/HP!PI&(!_B0"``&/OP!LC[X`:(^W`&2/M@!@C[4`7(^T`%B/LP!4C[(`
+M4(^Q`$R/L`!(`^``"">]`'`GO?^PK[\`3*^^`$BOMP!$K[8`0*^U`#ROM``X
+MK[,`-*^R`#"OL0`LK[``*`"`H"6OI0!4CH(LP`!`^`D`P+@E$$``/(^_`$R&
+M@@'\*$(`0!1```*6@P'\)`,`/P`#%````IP#*F,`/SAC``$R8O__+$(``0!B
+M&"408``'/`,``"1C'M2.@@(```(00`!#$"$0```"A%(`````D"42X``C``"(
+M)2>V`"`GM0`B/`(``21>\7``$1#`CZ,`5`!B@"&OH``0K[8`%*^U`!@"@"`E
+M`@`H)0)`,"4#P/@)`F`X)1!``!2/OP!,AZ(`(H(#``8`0Q`J$$``!(>B`""3
+MH@`CH@(`!H>B`"""`P`'`$,0*A!```*3H@`AH@(`!R8Q``$"-Q`K%$#_Y``1
+M$,`D`@`!C[\`3(^^`$B/MP!$C[8`0(^U`#R/M``XC[,`-(^R`#"/L0`LC[``
+M*`/@``@GO0!0)[W_P*^_`#ROL@`XK[$`-*^P`#``H)`E`("`)881$IH\`@``
+M)$(``">D`!`F!4:``$#X"20&`"`D"0`()ZH`$"0-``@D#@`_``D80`%#&"&4
+M8@```%$0(Z1B`````#@E``!8)0`)8$``8#`EA,(```1!``(`````I,```!3M
+M``,!3"@A$```&B0'``^4J```A*0````'$$``4!`AE$-&@"3B``$4@P`2,$?_
+M_Q2```0M8@`S)0(``1````JDH@``%$``!0````"4P@``)$(``1````2DP@``
+ME,(``"1"__^DP@`````X)25B``$P2___+.(`$!1`_]T`"1!``4(8(81B```H
+M0@!`%$```@`)($"D;@```)`0(91"1H``4A`C*$,````#$`L!1"`AA(,``(X$
+M1G@``QA``&08(0`"$$``1!`AE$(``*1B```E(@`!,$G__RTB``\40/^\``D8
+M0"0)``@GI``0``D00`!0&"$`@A`AE$(``*1B1H`E(@`!,$G__RTB``\40/_W
+MC[\`/(^R`#B/L0`TC[``,`/@``@GO0!`)[W_P*^_`#ROL@`XK[$`-*^P`#``
+MH(@E,)+__Y8B```00``1```P)2>D`!@`!AA``(,8(0`&$,``41`AE$(``*1B
+M```DQ@`!*,(`"!!```<`P(`E``80P`!1$"&40@``%$#_\P`&&$``P(`E)Z(`
+M*J^B`!`\`@``)$(```)`("4GI0`8,,;__P!`^`DGIP`H&@``#@``,"67HP`H
+MEZ(`&!!B``R7H@`J)Z0`&"3&``$`T!`J$$``!0`&$$``@A`AE$(``!1B__D`
+M````EZ,`*)>B`"H48@`#``80P!!R``8``````%$0(8Q"``000``$)`,`/P`&
+M$,``41`AE$,``@!@$"6/OP`\C[(`.(^Q`#2/L``P`^``"">]`$`PA/__,*7_
+M_S#&__\PY___EZ@`$G#H&`(08``B```0)1#%`!XD`P!D`(40(W!#$`(`Q1@C
+M`$,`&@``$!(48``"```````'``T``A0```(D`P2``!,`X!@E*((`91!``!`!
+M`!@E)`(`9`!$$",`1P`8<(@`````&!(\`E'K-$*%'P!B`!@``!`0``(10P`#
+M'\,`0Q`C$````C!#__\`X!@E`&`0)0/@``@`````)[W_N*^_`$2OM`!`K[,`
+M/*^R`#BOL0`TK[``,`"@F"4`P)`EC[0`6##P__\2```.```@)2>E`!@`!!A`
+M`*,8(0`$$(``1!`A``(00`!2$"&40@`(I&(``"2$``$`D!`J%$#_]@`$&$"6
+M9```)Z(`*J^B`!`\`@``)$(``">E`!@"`#`E`$#X"2>G`"@``$@E```X)0``
+M("4GI0`8EZ@`*)>F`"H`D!`J$$``#``$$$``HA`AE$(``#"#__\!`A`F`&(X
+M"@`$$$``HA`AE$(``!3"__0DA``!`&!()99D``"7I0`HEZ8`*@`'B(`")X@A
+M`!&(0`(RB"&6)P`&``F`@`()@"$`$(!``A*`(98"``8\$@`!)E+[Z`)`^`FO
+MH@`0IH(`!I9D``"7I0`HEZ8`*I8G``26`@`$`D#X":^B`!"F@@`$EF0``)>E
+M`"B7I@`JEB<``I8"``("0/@)KZ(`$*:"``*69```EZ4`*)>F`"J6)P``E@(`
+M``)`^`FOH@`0IH(``(^_`$2/M`!`C[,`/(^R`#B/L0`TC[``,`/@``@GO0!(
+MCZH`$##&__\PA/__)`,`9'"#(`(`!C!`E*(``'!#$`(D0O_V`((0*Q!```4`
+MIC`AE*(``*5"```#X``(I.(``)3"__XD`P!D<$,0`B1"``H`1!`K$$``#0"F
+M$"N4PO_^I4(```/@``BDX@``I4,```/@``BDXP``E*(``*3B``"4H@`"`^``
+M"*5"```00``4``04`"0(`&0``DP#A*(``'!($`(`21`C)$(`"2Q"`!,40/_N
+ME*,``)2B``)P2!`")$+_]@""$"L40/_K`````"2E``(`IA`K%$#_\``````#
+MX``(``````"`,"64P@'4,$(`\"1"_]`L0@!`$$``$B3%+!`\!```)(0@4(R#
+M``2LPRP0``,0P`!#$"$``A"`)(0`"`!$$"&LPBPL)`(``:S"+"@D`@`4K,(L
+M'"0"`%4#X``(K,(L(#P$```DA![@C(,`!*RC`````Q#``$,0(0`"$(`DA``(
+M`$00(:RB`!PD`@`!K*(`&"0"`!2LH@`,)`(`(P/@``BLH@`0)[W_Z*^_`!2O
+ML``0`(`8)91B`=0P0@#P)$+_T"Q"`$`00``6`*"`)8QB++``0/@))`4`!SP#
+M``$D8]P<`$`@)20%``$D!@`D`&#X"0``."4``$@E)`@`:P``,"4D`P`!%$,`
+M(B0'`&LD"`!3)`<`4R0"`#<0```=K@(`$(QB++``8"`E`$#X"20%``<\`P`!
+M)&/<'`!`("4D!0`&)`8`)0!@^`D``#@E``!()21$``0D`P`R.$(`/P!@0"4`
+M@D`+)`,`0`!@,"4``C`*),<`,B0#`!0``A@+K@,`#"3$`",DPP`W`((8"JX#
+M`!".!0`$`*D0*P$%&"L`0Q`E$$``!```("4`IA@K`.40*P!B("4`@!`EC[\`
+M%(^P`!`#X``()[T`&">]__"$@B_TC(,O\`!#$"&,A0`4-`.```"C*"$``A)`
+M,$)^`#1"@`"LHADP)`(``:R"+\0#X``()[T`$">]_^"OOP`<K[(`&*^Q`!2O
+ML``0`("()0(@D"4F,"P0CB,L*!!@`$4``!`ECB,OQ"0"``$48@!`-`.``(Y"
+M`!0`0Q`AC$,9,#!B@``40``Z``,F0@`#%<(P0@`#)`,``A1#``RN!``$ED(!
+MTBQ"`$(40``%`````)8B$IH`1!`A$```!*X"``2.`@`$)$(`!:X"``260@'4
+M,$(`\"1"_]`L0@!`$$``##P"``$D0@18`$#X"0)`("6.!``$C@,`%`"#$"L4
+M0``#`(,0(Q````*N`@`$K@``!*X@+\0\`@`!)$+_Q`)`("4`0/@)`@`H)11`
+M`!$\`@`!)$(">`)`("4`0/@)`@`H)1!```L\`@`!)$("J`)`("4`0/@)`@`H
+M)1A```4D`@`"KB(OQ"0"``&N(B_8KB`OP(XB+\2/OP`<C[(`&(^Q`!2/L``0
+M`^``"">]`"",HP`$C*(`#`!#$"L00``%```@)8RB`!``8A`K%$```@`````D
+M!``!`^``"`"`$"4`H#@EE((!U#!"`/`D0O_0+$(`0#P#```40``#)&@@4#P"
+M```D2![@C.0````$$,``1!`A``(0@`$"$"$D0@`(K.(`'(SB``2,XP`0`$,0
+M*Q1``"0`````$(``4R0"__^,X@`$K.(`"(SC`!``0Q`K%$``&@!@2"6,X@``
+M$$``%P````",X@``)$;__ZSF````!B#``(8@(0`$((``B!`AC.4`'(Q#`!B,
+MH@`0`&(8(P`#&$",X@`(`$,0(ZSB``@!!"`A)(0`"`!)$"L40``#K.0`'!3`
+M_^L``````^``""0"``&,X@`$C.,`#`!B&"L48``M```0)8T#```D8___C.0`
+M`!"#`"@D`O_^C.,`!*SC``B,X@`,`$!()0!#$"L40``A)`(``HT#```D8___
+MC.(```!`("4`0Q`K$$``&B0"``(DA@`!K.8````&(,``AB`A``0@@`"($"&,
+MY0`<C$,`&(RB`!``8A@C``,80(SB``@`0Q`CK.(`"`$$("$DA``(`2(0*Q1`
+M``:LY``<C0(``"1"__\`PA`K%$#_Z0#`("4D`@`"`^``"``````GO?_8K[\`
+M)*^T`""OLP`<K[(`&*^Q`!2OL``0`("()28R+!"N("PDCB(LL`!`^`DD!0`'
+M/`,``21TW!P`0"`E)`4``20&`"0"@/@)```X)0!`F"4D`@`!%F(`(8^_`"2.
+M(BPLA%```(XB++`"("`E`$#X"20%``<`0"`E)`4`!"0&`"`"@/@)```X)1(3
+M``L`0!@E$@``!R0"``(2`@`))`(``Q("``N/OP`D$```#8^T`"`0```)KD``
+M%!````>N0P`4``,00"1"__L0```#KD(`%``#$$"N0@`4C[\`)(^T`""/LP`<
+MC[(`&(^Q`!2/L``0`^``"">]`"@GO?_@K[\`'*^R`!BOL0`4K[``$`"`D"4`
+MP(@E`."`)3P"```D0@```*`@)0!`^`D"("@E`$`X)28&__\`!C#")A#__QH@
+M`!\R$``')`H`""0)``&/H@`P``)`P`(1&"$H8@`)`4(8"@!I&`0D8___`@D0
+M!"1"__\`8A@F`0,8!``&*(``LB@A``,@)XRB````@B`D`@<0!`$"$`0`0Q`D
+M`$00):RB```",!`A)%'_^`%0$",`1S@&``"`)1X@_^<DQ@`!C[\`'(^R`!B/
+ML0`4C[``$`/@``@GO0`@)[W_H*^_`%BOMP!4K[8`4*^U`$ROM`!(K[,`1*^R
+M`$"OL0`\K[``.`"@N"66X@`",$)``!!```<`@)@E/`(``"1"````0/@))`4"
+M`!```!0`0)`EEN(``C!"@``00``'/`(``"1"```"8"`E`$#X"20%!``0```*
+M`$"0)9;C``(P8P`0)`8!`"0%``(D0@```F`@)0!`^`D`PR@*`$"0)8Y"```8
+M0``]``"()3P"```D5@``)[0`*#05AP``$1!``%$0(0`"$(`D0@`@`D*`(9("
+M``@``A"`)$)'`"Q"$``00``9`F`@)9('``NOH``0`D`H)0+`^`DD!@`.KZ(`
+M*).D`"B2@@`!``(2``""("62@@`"``(4``""("62@@`#``(6``""("62`P`(
+M``,8@(YB`!0`0Q`A`%40(:Q$```0```2)C$``0`1@$`"$8`A`!"`@"80`"`"
+M4(`AD@<`"Z^@`!`"0"@E`L#X"20&``Z2!``(``0@@(YC`!0`9!@A`'48(:QB
+M```F,0`!CD(```(B$"H40/_*`!$00);B``(P0@`0%$``<X^_`%@\`@``)$(`
+M``)@("4`0/@))`4`"`!`D"6.0@``&$``:0``B"4\`@``)%8``">U`"PD%P`!
+M)[0`,``1$$``41`A``(0@"1"`"`"0A@AD&(`"``"((`T`H<``(*`(9!B``44
+M0`!3)()'`"Q"$``00``6`F`@)9!G``NOH``0`D`H)0+`^`DD!@`.KZ(`+).C
+M`"R2H@`!``(2``!B&"62H@`"``(4``!B&"62H@`#``(6``!B&"6.8@`4`%`0
+M(:Q#```0```.`!$00``1$$``41`A``(0@`!2$"&01P`KKZ``$`)`*"4"P/@)
+M)`8`#HYC`!0`<!@AK&(````1$$``41`A``(0@"1"`"`"0A@AD&(`"1!``"<`
+M`A"``@*`(28"P``L0A``$$``%@)@("609P`+K[<`$`)`*"4"P/@))`8`#J^B
+M`#"3HP`PDH(``0`"$@``8A@EDH(``@`"%```8A@EDH(``P`"%@``8A@ECF(`
+M%`!0$"&L0P``$```#B8Q``$`$1!``%$0(0`"$(``4A`AD$<`*Z^W`!`"0"@E
+M`L#X"20&``Z.8P`4`'`8(:QB```F,0`!CD(```(B$"H40/^?`!$00(^_`%B/
+MMP!4C[8`4(^U`$R/M`!(C[,`1(^R`$"/L0`\C[``.`/@``@GO0!@)[W_\(R"
+M`!0T`X```$,0(8Q"`!PP1S^`E*(``C!"0``00``')`H!!#P+'X`\!@`;)`4`
+M$R0(#:P0```')`D`%"0*`-(\"Q^`/`8`-B0%``DD"`U()`D`"HR#`!0T`H``
+M`&(8(0"G$"4`1A`E`$L0):QB`!R,@@`4K$H0<(R"`!2L2!"PC(0`%(R"$/`\
+M`__P-&,#_P!#$"0`"1J``$,0):R"$/`#X``()[T`$```````````)[W_R*^_
+M`#"OLP`LK[(`**^Q`"2OL``@`("8)0"@@"6.8RQ$/`5__S2E__\\`@``)$(`
+M``!`^`D`92@D`$`H)8YB`!2,1@`P,-$#\``1B0("()`E+B(``BQ"``$2```%
+M`D*0(R0"`"4`41`C``(00@(BD"$240`')`/\#XYD`!0`PQ@D`!(1`#!"`_``
+M8A@EK(,`,#P"```D0@```$#X"0)@("4"41`F``(0*X^_`#"/LP`LC[(`*(^Q
+M`"2/L``@`^``"">]`#@GO?_HK[\`$`"@."4`@$`EE(,!Z`#C&"H08``)```0
+M)0`'*0``IR@C``4H@`$%*"$\`@``)$(```!`^`DDI2S@C[\`$`/@``@GO0`8
+M)[W_Z*^_`!``P$`E`(`X)92#`>@`HQ@J$&``"@``$"4`!3$``,4P(P`&,(``
+MYC`A/`(``"1"```!`"@E`$#X"23&+."/OP`0`^``"">]`!@GO?_0K[\`**^U
+M`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`H"4`H)`E`,"H)2:#`>`D`@`"$D(`
+M$"03``LN0@`#$$``!B0"``,D`@`!$D(`("0"__\0``!:C[\`*!)"``P\`@`%
+M)`(`!!)"``XD`O__$```4X^_`"B4<0`()C'__SP"``4T0@#`$```*`)BF"64
+M<0`()C'__C1"`<`0```C`F*8)91Q``@F,?_]`!$1``!1$",``A"``$00(8Q"
+M+.000``:`````!```#PD`O__E&(`"!!``!$``(@EC((LY!!```T`````E&8`
+M""2%``0F,0`!`B80*A!```<`$1$``%$0(P`"$(``11`AC$(LX!1`__<`````
+ME&(`"!8B``,`````$```)20"__\`$1$``%$0(P`"$(``@H`A)A`LX(X#``04
+M8``=)`+__SP"```D0@```@`@)0!`^`DD!0`\%J``#:X2``2N$P`,)`(``JX"
+M`!0D`O__K@(`&"0"`_^N`@`<)`(`"J8"`""F`@`B$```":X``#2.H@`PK@(`
+M-#P"```D0@```H`@)0(@*"4`0/@)`J`P)0(@$"6/OP`HC[4`)(^T`""/LP`<
+MC[(`&(^Q`!2/L``0`^``"">]`#`GO?_P`(`X)8R&`!2,A2S,,*4#_XR"+-0`
+M`A0`/`,#_P!#$"0`HB@EK,4`I(SF`!2,A2S0,*4#_XR"+-@``A0``$,0)`"B
+M*"6LQ0"HC.4`%(RC`*PD`OP``&(8)(R"+-PP0@/_`&(8):RC`*P#X``()[T`
+M$">]_^BOOP`0`*`X)0"`,"64@P'H`.,8*Q!@`"```!`E``<1``!'$",``A"`
+M`,(H(22E+.",HP`$$&``&```$"6LH``$)`,``0#C&`0``Q@GC,(LS`!B$"2L
+MPBS,C,(LT`!B$"2LPBS0C,(LU`!B$"2LPBS4C,(LV`!B$"2LPBS8C,(LW`!B
+M&"0\`@`!)$(-Q`!`^`FLPRS<)`(``8^_`!`#X``()[T`&">]_XBOOP!P`(!8
+M)0"@4"4!8$@EC602-)5C`>@!0Q@K$&`"00``$"4`"A$``$H0(P`"$(`!(C`A
+M),8LX(S#``008`(Y)`(``8S#`!@D`O__%&(`C``````0@`!^)`,`H)2"``(P
+M0@"@%$,`>B0#`!\0``!Z)`0``3"$`_^,P@`<``(2@#1C_```0Q`D`((@)8S"
+M`!0``A4`/`,/\`!#$"0`@B`EKZ0`0).C`$`GI`!`D((``0`"$@``8A@ED((`
+M`@`"%```8A@ED((``P`"%@``8A@EC6(`%`!%$"&L0Q!`$```?@`**("4PP`B
+M``,9`#!C`/"4P@`@,$(`#P!B&"4\`@`(-$(@``!B&"6OHP!$DZ,`1)""``$`
+M`A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)8UB`!0`11`AK$,0@!``
+M`'<D!0@`-&/__P"#&"2,P@`H``(6``!B&"6OHP!(DZ,`2">D`$B0@@`!``(2
+M``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6-8@`4`$@0(:Q#",`0``!U
+M)`+_\#1"__\`8A`D/`,!``!#$"6OH@!,DZ,`3">D`$R0@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6-8@`4`$@0(:Q#"0`0``!W``I`@(S"
+M`"PT8___`$,8)``"$"L``A4``$,0):^B`%"3HP!0)Z0`4)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8``&(8)8UB`!0`2!`AK$,0P!```&^,P@`P
+M)`,`#R0$``$`@Q`K$$``"@`**(``!!!`-$0``0"#$"L40/_]``000!````,`
+M"BB`C,0`&``**(`DHM!`+$(0`!1`_W@\`P`/`*`0)8UE`!0`HB@A,(0#_XS"
+M`!P``A*`-&/\``!#$"0`@B`EC,(`%``"%0`\`P_P`$,0)`""("6LI!!```HH
+M@"2BT(`L0A``%$#_@">D`$0`H!`EC60`%`""("&4PP`B``,9`#!C`/"4P@`@
+M,$(`#P!B&"4\`@`(-$(@``!B&"6L@Q"`)`4(`(S$`"00@``7)`<!```*0(`E
+M`LC`+$(0`!1`_X,\`P#_`0`0)8UD`!0`@B`AC,,`)#P"`/\T0O__`&(8)(S"
+M`"@``A8``&(8):R#",`D`O_P`*(H)#2E``&,PP`H-*(!``!#*`N,PP`P$&``
+M#P`*0(`E`LD`+$(0`!1`_X$\`@#_`0`0)8UD`!0`@B`A`&`0)3P#`/\T8___
+M`$,0)#P#`0``0Q`EK(()```*0(`E`M#`+$(0`!1`_X<\`P`/`0`0)8UD`!0`
+M@B`AC,(`+#1C__\`0Q@D``(0*P`"%0``0Q`EK((0P(S"`#`00``$-*,"`(S"
+M``PP0@`@`&(H"XS"``PP0@!`$$```R0"__``HB@D-*4``C"B``\00``/````
+M`(S"``PP0@$`$$```R0"_[\0```"-*4`0`"B*"2,P@`,,$(`@!!```,D`O_?
+M$````C2E`"``HB@DC,(`##P#``$`0Q`D$$```CP"`"``XC@EC,(`##P#`(``
+M0Q@D-.0"``"#.`L\`P`$`$,0)!!```,\`@`"$```!@#C."6,PP`,`&(8)`#B
+M$"4X8P```$,X"XS$``P\`@`(`((0)#3C0```8C@+/`(`$`""("0`XA`E.(0`
+M``!$.`N,PP`$)`(``A!B``4D`@`#$&(`7``````0``!UC,(`.#2E`*(\`@`E
+M$```<`#B."4\`@$``((0):^B`%23HP!4)Z0`5)""``$``A(``&(8)9""``(`
+M`A0``&(8)9""``,``A8``&(8)8UB`!0`2!`AK$,)`!```%P\`@`$KZ4`6).C
+M`%B0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6-8@`4`$@0
+M(:Q#"<`0``!<``HH@*^G`%R3HP!<D((``0`"$@``8A@ED((``@`"%```8A@E
+MD((``P`"%@``8A@EC6(`%`!%$"&L0Q$`$```58S"`#2-8@`4`&(0(8Q""<"O
+MH@!@DZ,`8">D`&"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B
+M&"4T8Q``KZ,`9).C`&0GI`!DD((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@``8A@EC60`%``*$(``1!`AK$,)P!```&",P@`,C,(`,!1``!8TI0!B
+M/`(``#P#``",0@``C&,```!#$".-(R_D`&(@(SP"``",0@```((@(P`*0(`E
+M`LD`+$(0`!1`_YH`!"*``0`0)8UC`!0`8A@A/`(!``""$"6L8@D`/`(`!`#B
+M."6,P@`X,$(``1!```(\`@`D`.(X)0`*0(`E`LG`+$(0`!1`_YLGI`!8`0`8
+M)8UB`!0`0Q`AK$4)P``**(`DHM$`+$(0`!1`_Z(GI`!<`*`8)8UB`!0`0Q`A
+MK$<1`(S"`#000``K``H00(UC`!0D0@!0K&(+`(UC`!2,P@`TK&(+!(UC`!0D
+M`@`)K&(+"``*&(`D8LG`+$(0`!1`_YT`````C6,`%``*$(``0Q@A)$+)P"Q"
+M$``00``0)&4)P(QB"<"OH@!HDZ,`:">D`&B0@@`!``(2``!B&"60@@`"``(4
+M``!B&"60@@`#``(6``!B&"40```&-&(0`(UB`!0`"AB``&(8(8QB"<`T0A``
+MK*(``(S"``PP0@`!$$``!B0"``$!0A`$C2,LS`!#$"40```&K2(LS`%"$`0`
+M`A`GC2,LS`!#$"2M(BS,C,(`##!"``$00``&)`(``0%"$`2-(RS0`$,0)1``
+M``:M(BS0`4(0!``"$">-(RS0`$,0)*TB+-",P@`,,$(``A!```8D`@`!`4(0
+M!(TC+-0`0Q`E$```!JTB+-0!0A`$``(0)XTC+-0`0Q`DK2(LU(S"``PP0@`$
+M$$``!B0"``$!0A`$C2,LV`!#$"40```&K2(LV`%"$`0``A`GC2,LV`!#$"2M
+M(BS8C,(`##!"``@00``&)`(``0%"$`2-(RS<`$,0)1````:M(BS<`4(0!``"
+M$">-(RS<`$,0)*TB+-P\`@`!)$(-Q`%@("4`0/@)`,`H)20"``&/OP!P`^``
+M"">]`'@`@!@E``4@@"2"R``L0A``$$``$2>]_^B,8@`4`$00(8Q""`"OH@`0
+MDZ,`$">D`!"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6`!````4`
+M8A`E``40@(QC`!0`8A@AC&((``/@``@GO0`8)[W_Z``%.(`DXL@`+$(0`!!`
+M`!(`@$`EKZ8`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@``8A@EC0(`%`!'$"&L0P@`$```!B0"``$`!1B`C0(`%`!#$"&L1@@`
+M)`(``0/@``@GO0`8)[W_\(R#`!0D`@`!`*(0!*QB"$`D`@`!`^``"">]`!``
+M!1B`)&+*`"Q"$``00``()[W_Z(R"`!0`0Q`AC$(*`*^B`!"3H@`0$```!C!"
+M``,`!1"`C(,`%`!B&"&,8@H`,$(``Q1```8D`P`!C((`%`"C&`2,0@A``&(8
+M)``#$"L#X``()[T`&">]_\"OOP`XK[4`-*^T`#"OLP`LK[(`**^Q`"2OL``@
+M`("()0"@J"6.(P`4)`(``0*B$`2L8@B`)!,#Z#P"```D4@``/`(``!````0D
+M4````@#X"20$`&0F<___$F``!0(@("4"0/@)`J`H)11`__@`````/`(``"1"
+M```"("`E`$#X"0*@*"400`!7`````(XD`<PX@P`'+&,``3B"``LL0@`!`&(8
+M)11@``P``#`E)`,`"A"#``DD`@`)$((`!P`````4@P!(`````)8B`=`L0@`$
+M$$``1``````T!8``/`@`"C4(`&0\!P`!CB(`%`!%$"&,1`!,K$@!`(XC`!0`
+M91@A``02@C!"__\`1Q`EK&(`_(XB`!0`11`AC$(`3``"$H(`!"*"$$0`!0``
+M```DQ@`!+,(``A1`_^P`````CB0`%#0"@```@B`AC((`2#P#`$``0Q`EK((`
+M2#P"```D0@```$#X"20$`,B.)``4-`*```""("&,@@#\/`/__C1C__\`0Q`D
+MK((`_"00`&0\`@``)%0``#P"```0```#)%(```)`^`DD!``*`B`@)0*`^`D"
+MH"@E$$```R80__\6`/_X`````(XD`!0T`H```((@(8R"`$@\`_^_-&/__P!#
+M$"2L@@!(CB(`%*Q`"(``$Q`KC[\`.(^U`#2/M``PC[,`+(^R`"B/L0`DC[``
+M(`/@``@GO0!`CZ(`%(^J`""/IP`DCZD`*(^K`"R$@R_T`$,0(2Q$`$`D`P`_
+M`&00"C#&#_\``A0``,(P)0`)$4(P0@`!``(5P`!&$"4`!SY`/`,>``#C."0`
+M1Q@E,2(``1!```,`H$`E/`(!``!B&"4`"1$",$(``0`"%T``0Q`EJ0(`"+D"
+M``N/HP`0``,=`(^F`#P`!C9`CZ4`-``%+T"/I``X``0FP``)$$(P0@`!``(6
+M``!F&"4`91@E`&08)0!#$"6I`@`,N0(`#X^C`!P``QP`/`(`#P!B&"0`"1)`
+M,$*```!#$"6I`@`0N0(`$X^B`!BI`@`4N0(`%R0"__\10@`/``H30(D$``R9
+M!``//`,`#S1CX```0Q`D`((@):D$``RY!``/B0(`")D"``L\`T```$,0):D"
+M``BY`@`+,2(`#!!``!\\`W\`-&/_``%C&`<P8P`!$&``&P``$"4Q(@`(/`2`
+M```"(`J)`P`(F0,`"P`)$((P0@`!``(5@`!D&"4`0Q`EJ0(`"+D"``N)`P`0
+MF0,`$X^B`#`P0G__`&(8):D#`!"Y`P`3B0(`%)D"`!<`"QT``$,0):D"`!2Y
+M`@`7)`(``0/@``@`````CZ@`%!#@`!"/J0`<B*,`$)BC`!,`!Q4`/`0`\`!$
+M$"0`8A@E-&.``*BC`!"XHP`3B*(`%)BB`!<`!AE``$,0):BB`!2XH@`7$0``
+M$``(%@"(HP`0F*,`$SP$#P``1!`D`&(8)31C@`"HHP`0N*,`$XBC`!28HP`7
+MCZ(`$``"$H``8A@EJ*,`%+BC`!<1(``.``D?`(BB`!"8H@`3`$,0)31"@`"H
+MH@`0N*(`$XBC`!28HP`7CZ(`&``"$\``8A@EJ*,`%+BC`!<#X``()`(``2>]
+M_^@\`B``KZ(`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@``8A@EB*(`")BB``L`0Q`EJ*(`"+BB``L#X``()[T`&">]_]B/H@`X
+M$.``"X^H`#R(HP`,F*,`#RQ"``$``A,``&88)0!#$"6HH@`,N*(`#Q```#(`
+M````$$``)B>D`""HH``(N*``"ZBF``RXI@`/B0(`$)D"`!.OH@`@DZ,`()""
+M``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):BC`!"XHP`3B0(`
+M%)D"`!>OH@`DDZ,`)">D`"20@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#
+M``(6``!B&"6HHP`4N*,`%Q````L````````8):BC``BXHP`+-,(0`*BB``RX
+MH@`/J*,`$+BC`!.HHP`4N*,`%ZB@`!RXH``?B*(`')BB`!^HH@`8N*(`&R0"
+M``$#X``()[T`*">]_V``H#@E)`(``:^B`("3I`"`)Z,`@)!B``$``A(``((@
+M)9!B``(``A0``((@)9!B``,``A8``((@)8CC`!R8XP`?`&08)!!@`/0D`@`/
+MC*(`!*^B`(23HP"$)Z0`A)""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8):RC``2,H@`(KZ(`B).C`(@GI`"(D((``0`"$@``8A@ED((``@`"
+M%```8A@ED((``P`"%@``8A@EK*,`"(RB``ROH@",DZ,`C">D`(R0@@`!``(2
+M``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6LHP`,C*(`$*^B`)"3HP"0
+M)Z0`D)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC`!",
+MH@`4KZ(`E).C`)0GI`"4D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"
+M%@``8A@EK*,`%(RB`!BOH@"8DZ,`F">D`)B0@@`!``(2``!B&"60@@`"``(4
+M``!B&"60@@`#``(6``!B&"6LHP`8C*(`'*^B`)R3HP"<)Z0`G)""``$``A(`
+M`&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC`!R(X@`<F.(`'S!"'_X`
+M`A!"I,(``(CB`!B8X@`;``(4`J3"``*@P``$B.(`&)CB`!LP0@`!%$``%P``
+M``"(X@`8F.(`&S!"``(00``")`(``:#"``2(X@`8F.(`&S!"``@00``$````
+M`)#"``0T0@`"H,(`!(CB`!B8X@`;,$(`!!!```0`````D,(`!#1"``2@P@`$
+MB.(`')CB`!\``A5",$(``Z#"``LP0P#_)`(``1!B`!(H8@`"$$``!20"``(0
+M8``)`````!```"``````$&(`$20"``,08@`6`````!```!H`````B.(`%)CB
+M`!<P0@`?$```%:#"``6(X@`4F.(`%S!"`^```A%"-$(`@!````Z@P@`%B.(`
+M%)CB`!<P0GP```(2@C1"`(`0```'H,(`!8CB`!28X@`7``(3PC!"`!\T0@"`
+MH,(`!8CB`!R8X@`?``(30J#"``:(X@`8F.(`&S!"`/```A$"H,(`!XCB`!B8
+MX@`;,$(/```"$@*@P@`(D,,`"R0"``(08@`1*&(``Q!```8D`@`#)`(``1!B
+M`!,`````$```&``````48@`6`````(CC`!"8XP`3``,>`C!C``^0P@`(`$,0
+M(:#"``B(XP`0F.,`$P`#'0(P8P`/D,(`"`!#$"&@P@`(B.,`$)CC`!,``QP"
+M,&,`#Y#"``@`0Q`AH,(`"(CB`!B8X@`;,$+P```"$P*@P@`)B.,`')CC`!\\
+M`@$``&(8)"QC``$D`@`"`$,0(Z#"``H``!`E`^``"">]`*",H@``C(-&H`!#
+M$"2LH@````(0)XR#1J``0Q`D`^``"*R"1J`GO?_8K[\`)*^P`"``@(`E/`(`
+M`"1"````0/@))@4LA(X"`!0T`X```$,0(:Q``22.`@`4`$,0(:Q``2B.`@`4
+MK$``0(X"`!0`0Q`A/`,``JQ#`3".`@`4-`.```!#$"$\`P(`K$,!.(^_`"2/
+ML``@`^``"">]`"@GO?_8K[\`)*^P`"``@(`EC@,`%"0"``:L8@!`/`(``"1"
+M````0/@))@4LA(X"`!0T`X```$,0(:Q``22.`@`4`$,0(:Q``2B/OP`DC[``
+M(`/@``@GO0`H`(`X)0``,"4D"`!8<,@8`@!G$"&41#`HE*,``!"#`!0`P!`E
+M<,@0`B1","@`XA@AE&(``!1```HDQ@`!),;__Y2B``"D8@``E*(``J1B``*0
+MH@`$H&(`!`/@``@`P!`E+,(`0!1`_^IPR!@"```0)0/@``@``````^``"(R"
+M,"0GO?_HK[\`%*^P`!``@(`E/`(``"1"````0/@))@4LA"8"+$B/OP`4C[``
+M$`/@``@GO0`8)[W_T*^_`"ROL@`HK[$`)*^P`"``@(@E`*"0)0(@@"62`@'C
+M``(1PJX",!P\`@``)$(``"8$,"@`0/@))`46````,"4D!P!8)!@`!R0/``(D
+M#@'T)`@`R"0-`&0D#``H)`L`!SP*`+\U2OX,/`D`OS4I_SB.(@',+$(`!Q!`
+M``1PQQ@"`'`0(1````.@6#`P`'`0(:!/,#!PQR`")@4`!`"%$"&L3C`X)(,P
+M0`(#$"&L2````*,8(:QH```D@S!(`@,0(:Q-````D!`AK$PP4`"C&"&L:P``
+M)((P,`("$"&@0``$H$``!9!#``"@0P`"H$```XX",!P00``$`(40(:Q*,&@`
+MD!`AK$DP<"3&``$LP@!`%$#_UP````".`C`<$$``#C0#@`".(@`4`$,0(8X#
+M,&RL0P$LCB(`%#0#@```0Q`AC@,P<*Q#`30\`@``)$(```!`^`D"("`E)`(`
+M9!)```6N`C`@C@(P&#1"``$0```%K@(P&(X",!@D`__^`$,0)*X",!B/OP`L
+MC[(`*(^Q`"2/L``@`^``"">]`#`GO?_8K[\`)*^P`"``@(`EC@(P'!!```L\
+M`@``)$(```!`^`D`````C@(`%#0#@```0Q`AK$`!+(X"`!0`0Q`AK$`!-(^_
+M`"2/L``@`^``"">]`"@GO?^@K[\`6*^Q`%2OL`!0`("()0(@@"4LH@`'$$`!
+MJ(X(,"0\`@``)$(AX``%&(``8A@AC&(```!```@``````,`X)2S#``408`&@
+M```0)8XE`!0T`H```*(H(8RD&%`\`O`/-$+__P""("0`!Q"``%`0(8Q"1B@`
+M`A4`/`,/\`!#$"0`@B`EK*084(XD`!0T`H```((@(8R#&%PD`H!_`&(8)``'
+M$(``4!`AC$)&4``"$<`P0G^``&(8):R#&%R.)0`4-`*```"B*"&,I!A</`+_
+MP#1"?_\`@B`D``<0@`!0$"&,0D8\``(3P#P#`#\T8X```$,0)`""("6LI!A<
+MCB4`%#0"@```HB@AC*086#P"_`,T0O__`((@)``'$(``4!`AC$)&9``"%(`\
+M`P/\`$,0)`""("6LI!A8D0(`"0!'$"L00``%`````(X"+$@D0@`!$```"*X"
+M+$B1`@`)`.(0*Q!```0`````C@(L3"1"``&N`BQ,$``!4Z$'``DD`P!_KZ,`
+M$"0"`#*OH@`4KZ,`&"0"`"BOH@`<KZ,`("0"`$VOH@`DKZ,`*"0"`$"OH@`L
+M)`(`'Z^B`#`D`@`0KZ(`-"0"`#^OH@`X)`(`,*^B`#P`!C`KCB4`%#0"@```
+MHB@AC*08;#P"_^`T0C__`((@)``&&(`GH@`0`$,0(8Q"`````A.`/`,`'S1C
+MP```0Q`D`((@):RD&&R.)0`4-`*```"B*"&,I!AL/`+P'S1"__\`@B`D``88
+M@">B`!@`0Q`AC$(````"%4`\`P_@`$,0)`""("6LI!ALCB4`%#0"@```HB@A
+MC*08:#P"_P$T0O__`((@)``&&(`GH@`@`$,0(8Q"`````A1`/`,`_@!#$"0`
+M@B`EK*08:(XE`!0T`H```*(H(8RD&&@\`H#_-$+__P""("0`!AB`)Z(`*`!#
+M$"&,0@````(6`#P#?P``0Q`D`((@):RD&&B.)0`4-`*```"B*"&,HQAH)`+_
+MX`!B&"0`!B"`)Z(`,`!$$"&,0@``,$(`'P!B&"6LHQAHCB4`%#0"@```HB@A
+MC*,8;"0"P/\`8A@D)Z(`.`!$$"&,0@````(2`#!"/P``8A@EK*,8;!#```DT
+M`H``CB(`%#0#@```0Q`AC$,8;#1C``&L0QAL$```""S#``&.)``4`((@(8R"
+M&&PD`__^`$,0)*R"&&PLPP`!D0(`#!!B`,\D`@`!$,``!0````".`BQ8)$(`
+M`1````2N`BQ8C@(L7"1"``&N`BQ<+,(``1```,*A`@`,)`(`"*^B`!`D`@`&
+MKZ(`%``&,"N.)0`4-`*```"B*"&,HR(()`+_P`!B&"0`!B"`)Z(`$`!$$"&,
+M0@``,$(`/P!B&"6LHR((D0(`#1#"`*XD`@`!$,``!0````".`BQ@)$(``1``
+M``2N`BQ@C@(L9"1"``&N`BQD$```HJ$&``VOH``0)`(`!*^B`!0D`@`(KZ(`
+M&`#`."4LPP`#$&``F@``$"6.)0`4-`*```"B*"&,I!A8/`+__#1"#_\`@B`D
+M``<0@`.B$"&,0@`0``(3`#P#``,T8_```$,0)`""("6LI!A8D0(`"P!'$"L0
+M0``%`````(X"+&@D0@`!$```"*X"+&B1`@`+`.(0*Q!```0`````C@(L;"1"
+M``&N`BQL$```>*$'``L\`@``)$,AP(Q"(<"OH@`0C&(`!*^B`!2,8@`(KZ(`
+M&(QB``ROH@`<C&(`$*^B`"",8@`4KZ(`)(QB`!BOH@`HC&(`'*^B`"P`P"@E
+M+,,`"!!@`&,``!`ECB0`%#0"@```@B`AC(,9)"0"_P$`8A@D``40@`.B$"&,
+M0@`0``(00#!"`/X`8A@EK(,9))$"``H`11`K$$``!0````".`BQ0)$(``1``
+M``BN`BQ0D0(`"@"B$"L00``$`````(X"+%0D0@`!K@(L5!```$2A!0`*%,``
+M%"0#__V.`C`8`$,0)*X",!@\`@``)$(```!`^`D"("`E/`(``"1"````0/@)
+M`B`@)20%_O\\`P``)&,```(@("4`8/@)`$4H)!```#`D`@`!C@(P&#!"``(4
+M0``L)`(``8X",!P00``:/`(``"1"````0/@)`B`@)20%_O\\`P``)&,```(@
+M("4`8/@)`$4H)(XB`!0T`X```$,0(8X#,&RL0P$LCB(`%#0#@```0Q`AC@,P
+M<*Q#`30\`@``)$(```!`^`D"("`E$```"HX",!@D0@```$#X"0(@("4\`P``
+M)&,```(@("4`8/@)-$4!`(X",!@T0@`"$````ZX",!@0```"```0)20"``&/
+MOP!8C[$`5(^P`%`#X``()[T`8">]_]BOOP`DK[``((R0,"2N```0C((P'!!`
+M`"L`@"@EC@,`%#P"`,``0Q`K$$```SP"`,`0```#K@``1`!#$".N`@!$C@,`
+M'#P"`,``0Q`J$$```SP"`,`0```#K@``2`!#$".N`@!(C((`%#0#@```0Q`A
+MC@,`1*Q#`2R,@@`4-`.```!#$"&.`P!(K$,!-(R"`!0T`X```$,0(3P#``*L
+M0P$PC((`%#0#@```0Q`A/`,"`*Q#`3@\`@``)$(```!`^`DDI2R$K@``/*X`
+M`$"/OP`DC[``(`/@``@GO0`H)[W_X*^_`!BOL0`4K[``$`"`B"4"(#@ECB(P
+M&#!"``,D`P`#%$,`8(XE$C2.,#`DD@8`"2S"``000``'/`(``"1"```D!0`!
+M`$#X"23&``$0``!6C[\`&)(&``J2`@`(`,(0*Q!```@\`@``)$(```(@("4D
+M!0`%`$#X"23&``$0``!*C[\`&(SC+)@P8@!_+$(`0"1C`'\00``#``,9PHSB
+M+)@``AG"C@(`*`!#$"H00``/`````)("``P40``8`B`@)3P0```F$```)`4`
+M`@(`^`D``#`E`B`@)20%``4"`/@)```P)1```#"/OP`8C@(`)`!#$"H00``4
+M/`(``)("``P00``&/`(``"1"```"("`E)`4``@!`^`DD!@`!D@8`"RS"``(0
+M0``?/`(``"1"```"("`E)`4`!`!`^`DDQ@`!$```&8^_`!@D0@```$#X"0(@
+M("4D0O_^+$(``A!``!*/OP`8D@(`#!1```8\`@``)$(```(@("4D!0`"`$#X
+M"0``,"62`@`+$$``!CP"```D0@```B`@)20%``0`0/@)```P)8^_`!B/L0`4
+MC[``$`/@``@GO0`@)[W_X*^_`!BOL0`4K[``$`"`B"4"(#@ECB(P&#!"``,D
+M`P`#%$,`,HXE$C2.,#`DD@8`"2S"``000``'/`(``"1"```D!0`!`$#X"23&
+M``$0```HC[\`&(SC+)@P8@!_+$(`0"1C`'\00``#``,9PHSB+)@``AG"C@(`
+M)`!#$"H00``,/`(``)(&``LLP@`"$$``%SP"```D0@```B`@)20%``0`0/@)
+M),8``1```!&/OP`8)$(```!`^`D"("`E)$+__BQ"``(00``*C[\`&)("``L0
+M0``'/`(``"1"```"("`E)`4`!`!`^`D``#`EC[\`&(^Q`!2/L``0`^``"">]
+M`"`GO?_(K[\`,*^S`"ROL@`HK[$`)*^P`"``@(@E`*"`)0(@F"4\`@`!)$(D
+MP`!`^`F.)1(T)`,`6'!#(`(`D9`A)E(P**XR,"2.(P'<)`(``11B``4D`__]
+MCB(P&#1"``(0```$KB(P&(YB,!@`0Q`DKF(P&(XC`=PD`@`!$&(`*`(@("6.
+M8BQX)$(``:YB+'@\$```)A```"0%``$"`/@)```P)0(@("4D!0`%`@#X"0``
+M,"4"("`E)`4`!`(`^`D``#`E`B`@)20%``("`/@)```P)0(@("4D!0`#`@#X
+M"0``,"4\`@``)$(```!`^`D"("`E/`,``"1C```"("`E`&#X"31%`0`\`@`!
+M)$(N2`!`^`D"("`E$```7X^_`#".(C`8,$(``R0#``,40P!:C[\`,!(``!D\
+M$```)A````(@("4D!0`!`@#X"9)&``D"("`E)`4`!0(`^`F21@`*DD8`#`(@
+M("4D!0`"`@#X"2S&``$"("`E)`4``P(`^`F21@`-`B`@)20%``0"`/@)DD8`
+M"Q```!>.8C`<)A````(@("4D!0`!`@#X"20&``0"("`E)`4`!0(`^`F21@`(
+M`B`@)20%``("`/@))`8``0(@("4D!0`#`@#X"20&``$"("`E)`4`!`(`^`DD
+M!@`"CF(P'!!``!H\`@``)$(```!`^`D"("`E)`7^_SP#```D8P```B`@)0!@
+M^`D`12@D/`(``21"+D@`0/@)`B`@)8XB`!0T`X```$,0(3P#``*L0P$PCB(`
+M%#0#@```0Q`A/`,"`*Q#`3@0```/C[\`,#P"``$D0BY(`$#X"0(@("4\`@``
+M)$(```!`^`D"("`E/`,``"1C```"("`E`&#X"31%`0"/OP`PC[,`+(^R`"B/
+ML0`DC[``(`/@``@GO0`X)[W_T*^_`"ROL@`HK[$`)*^P`"``@)`E`*"`)0)`
+MB"6.0@`4-`.```!#$"&L0`$DCD(`%`!#$"&L0`$H/`(``"1"````0/@))B4L
+MA(X"``"N(BR8C@(`!*XB+)R.`@`(KB(LH(Y"`!0T`X```$,0(8Q%`2R,1@$T
+M/`,`P`"C$"000P`#`,,0)!1#`"B/OP`LCC`P)(X$`$0`I"`CC@(`/`""$"..
+M(RQP`$,0(:XB+'"N!``\C@0`2`#$("..`@!``((0(XXC+'0`0Q`AKB(L=*X$
+M`$".`P`\C@(`%`!#$"L00``$/`(``21"+R@`0/@)`D`@)8X#`$".`@`<`$,0
+M*Q!```8\`@`!/`(``21",.0`0/@)`D`@)3P"``$D0BY(`$#X"0)`("6/OP`L
+MC[(`*(^Q`"2/L``@`^``"">]`#`GO?_HK[\`%*^P`!``@(`E`@`X)9"C``4D
+M`@`1%&(`%8X&,"2,P@`\)$(``:S"`#R.`BQP)$(``:X"+'",PP`\C,(`%`!#
+M$"L00``?/`(``21"+R@`0/@)`````#P"``$D0BY(`$#X"0(`("40```7C[\`
+M%"0"`!D48@`4C[\`%(S"`$`D0@`!K,(`0(SB+'0D0@`!K.(L=(S#`$",P@`<
+M`$,0*Q!```D\`@`!)$(PY`!`^`D"`"`E/`(``21"+D@`0/@)`@`@)8^_`!2/
+ML``0`^``"">]`!@GO?_HK[\`$`"`*"6,AC`DC(,LF#!B`'\L0@!`)&,`?Q!`
+M``,``QG"C*(LF``"&<*,P@`H`$,0*A1``!<`````C,(`)`!#$"H00``*````
+M`)#"``P00``'/`(``"1"```D!0`"`$#X"20&``$0```:C[\`$)##``L08``'
+M/`(``"1"```D!0`$`$#X"21F__\0```1C[\`$)##``H08``'/`(``"1"```D
+M!0`%`$#X"21F__\0```(C[\`$)#&``D0P``$)$(``"0%``$`0/@)),;__X^_
+M`!`#X``()[T`&(R"`!0T`X```$,0(8Q'`.R,2`#PC$8`^(R%,"2,H@`X$$``
+M!```&"4`PA`K$$``!0````",@BQ\)$(``1```!"L@BQ\C*0`.`#$(".,HP`T
+M`0,8(XRB`#``XA`C`(,8(P!B&",\`E]3-$(Y*0!B`!@``!`0``(3@P`#'\,`
+M0Q@CK*8`.*RG`#"LJ``T`^``"`!@$"4GO?_(K[\`,*^S`"ROL@`HK[$`)*^P
+M`"``@)`E`D"()8Y0,"2,H@``KD(LF(RB``2N0BR<C*(`"!(``*"N0BR@/`(`
+M`21"-Y``0/@)``````!`F"4&80`(`````(Y"+(`D0@`!KD(L@#P"``$D0BY(
+M`$#X"0)`("6.`@`0`F(0(:X"`!".(C`<$$``.SP"```D0@```D`@)0!`^`DF
+M)2R$CD(`%#0#@```0Q`AC$,!+(Q%`32.`@!$`&(0*Q1```<`````C@(`2`"B
+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
+M`"H40``$EZ(`*B0"``@0``#*KZ(`.!!```L\`@``)$(```(@("4D!0`;`$#X
+M"2>F`"H40``$/`(``"0"``@0``"^KZ(`."1"```"("`E)`4`/P!`^`DGI@`H
+M%$``!)>B`"@D`@`($```M*^B`#BF0A)R``"8)0``@"4\`@``)%0```(@("4F
+M!0#``H#X"2>F`"@00`"GEZ(`*`)BF"8F$``!+@(#0!1`__<"("`E-`+__Q)B
+M``,D`@`'$```GZ^B`#@D`@`*ID(3YB0"``.F0A7P``"`)20$`#0F1@`&)`,`
+M"W($*`(`IA`AI$,3Z"80``$N`@`*%$#_^W($*`(``(`E/`(``"1+(@`F2``"
+M/`(``"1*(@@D"0`T)D<`#"0%``LF1@`(`!`80`!R("$`:Q`AE$(``*2"%?@`
+M:"`A`&H8(91B``"D@A7P<@D8`@!G$"&D11:H`&88(280``$N`@`#%$#_\*1E
+M%A`\`@``)$(```(@("4`0/@))D42<!1```,D`@`($```;*^B`#B60A**$$``
+M(R0#`!"6(@'4,$(`\!1#`"`\`@``CB(`%#0#@```0Q`A)`-`!ZQ#&``\`@``
+M)$(```!`^`DD!`?0/`(``"1"````0/@)`B`@):8B`=:.(@`4-`.```!#$"$D
+M`P`'K$,8`#P"```D0@```$#X"20$!]"6(@'6,$(`\"0#`"`00P`#)`(`#1``
+M`$>OH@`X/`(``"1"```"("`E)`4`OP!`^`DGI@`H%$``!)>B`"@D`@`($```
+M/*^B`#BF0A)TIB(""#P"```D0@```$#X"0(@("440``$)`(`"R0"``@0```Q
+MKZ(`.(XC`<P48@`$```@)20"``T0```/KZ(`.)8B`=0P0@#P)$+_T"Q"`$`0
+M0``#/`(``!````,D0@``/`(``"1"```"("`E`$#X"2>E`#@`0"`E$(``&P``
+M``".0BS$KB(!P#P"```D0@```$#X"0(@("4\`@`!)$)#>`!`^`D"("`E%$``
+M!#P"``$D`@`)$```#*^B`#@D0CM@`$#X"0(@("6.0C`8)`/__0!#$"2N0C`8
+M$```#`(@$"4D`@`(KZ(`.!)```0\`@``)$(```!`^`D"0"`E$J```H^B`#BN
+MH@`````0)8^_`%B/M0!4C[0`4(^S`$R/L@!(C[$`1(^P`$`#X``()[T`8">]
+M_^BOOP`0C((`$(Q#``@08``&C$4``"0"``$08@`%```0)1````N/OP`0$```
+M`B2E`&`DI0!V/`(``"1"```DA"PP`$#X"20&``8D`@`!C[\`$`/@``@GO0`8
+M`````````````````^``""0"``$``````````(R"`!",1P`$```@)0`%*$``
+MQ!@A`.40(9!"``"@8@``)(0``2B"``(40/_Y)*4``0/@``@D`@`!````````
+M````@$`E/`*\`#1"(`"-!``4`$0P(R3"P`@L0A``$$``)">]_\``!1!`)`4`
+M`P!%*`0`AA`AC$(`"*^B`#"3HP`P)Z0`,)""``$``A(``&(8)9""``(``A0`
+M`&(8)9""``,``A8``&(8)0!E&"6OHP`TDZ,`-">D`#20@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6-`@`4`$80(:Q#``@0```C)`(``8T"
+M`!0`1B`A``480"0"``,`8A`$``(X)P!`*"4DPL`(+$(0`!!``!$DB0`(C((`
+M"*^B`#B3HP`X)Z0`.)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8`
+M`&(8)0!G&"00```&`&40)8T"`!0`1A`AC$(`"`#B$"0`11`EK2(``"0"``$#
+MX``()[T`0`"`."4\`KP`-$(@`(SD`!0`1#`C),+`""Q"$``00``E)[W_P``%
+M$$`D!0`#`$4H!``%*"<`AA`AC$(`"*^B`#"3HP`P)Z0`,)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8``&(8)0!E&"2OHP`TDZ,`-">D`#20@@`!
+M``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6,X@`4`$80(:Q#``@0
+M```A)`(``8SB`!0`1B`A``480"0"``,`8A`$``(H)R3"P`@L0A``$$``$"2(
+M``B,@@`(KZ(`.).C`#@GI``XD((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@``8A@E$```!@!E$"2,X@`4`$80(8Q"``@`HA`D-$(``*T"```D`@`!
+M`^``"">]`$``@$`E/`*\`#1"(`"-`P`4`$,X(R3BP``L0A``$$``(">]_^@`
+M9Q`AC$(``*^B`!"3HP`0)Z0`$)""``$``A(``&(8)9""``(``A0``&(8)9""
+M``,``A8`$```%`!B&"6OHP`4DZ,`%)""``$``A(``&(8)9""``(``A0``&(8
+M)9""``,``A8``&(8)8T"`!0`1Q`AK$,``!```!,D`@`!C0(`%`!'$"&,0P``
+M)`(``0"B$`0``A`G`&(8)##"``$`HA`$`&(8)23BP``L0A``%$#_XR>D`!2-
+M`@`4`$<0(:Q#```D`@`!`^``"">]`!@GO?_H`(`X)3P"O``T0B``C.8`%`!&
+M(",LHP`&$&``&20"__\D@L`$+$(0`!!```\`Q!`AC$(`!*^B`!"3HP`0)Z0`
+M$)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8`$```!`!B$"6,X@`4
+M`$00(8Q"``0P0@`O`*(0!C!"``$#X``()[T`&">]_]"OOP`H`(!`)3P"O``T
+M0B``C0,`%`!#.",DXL`(+$(0`!!``"``9Q`AC$(`"*^B`""3HP`@)Z0`()""
+M``$``A(``&(8)9""``(``A0``&(8)9""``,``A8`$```%0!B("6OI``DDZ,`
+M)">D`"20@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6-`@`4
+M`$<0(:Q#``@0```9C0,L1(T"`!0`1Q`AC$0`"``%$$`D`P`#`$,8!#P"``$T
+M0O```$,0)P""("0`!1,``((@)1#```,TA(``/`(``0""("4DXL`(+$(0`!1`
+M_]P`````C0(`%`!'$"&L1``(C0,L1#P%`0`\`@``)$(```$`("4`0/@)`&4H
+M)8^_`"@#X``()[T`,````````````````#P"O``T0C``C(4`%`!%,".,@P',
+M)`(`"Q!B`!\GO?_H),+`L"Q"$``00``4`````(RB`+`D`_X#`$,0)#1"``*O
+MH@`0DZ,`$">D`!"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B
+M&"4`IA`A$```"*Q#`+",@@`4`$8@(8Q"`+`D`_X#`$,0)#1"``*L@@"P`^``
+M"">]`!@`@#`E/`*[_S1"\)",PP`4`$,0(RQ"$``00``')[W_Z#P"O``T0C"0
+MC$(``*^B`!`0```%DZ(`$#P"O``T0C"0C$(``#!"`/\``AD",$0`#XS"`<P4
+M0P`$```H)93"`=``1!`F+$4``0"@$"4#X``()[T`&">]_]BOOP`DK[``(#P"
+M```D0@```$#X"0"`@"400``S-`.``(X"`!0`0Q`A)`,`'ZQ#&'".`@`4-`.`
+M``!#$"$D`P`-K$,8=(X"`!0T`X```$,0(20#``RL0QAXC@(`%#0#@```0Q`A
+M)`,``ZQ#&?".`@`4-`.```!#$"$D`P`%K$,9](X%`!0T`H```*(H(98"`=0P
+M0@#P)$+_T"Q"`$`D`P`8)`0`%`""&`NLHQGXC@0`%#0"@```@B`AC((`'"0#
+MP'\`0Q`D-$(`@*R"`!R.`@`4-`.```!#$"$D`P`]K$,!!!```"J/OP`DC@(`
+M%`!#$"$D`P`?K$,8<(X"`!0T`X```$,0(20#`'^L0QATC@(`%#0#@```0Q`A
+M)`,`!*Q#&'B.`@`4-`.```!#$"$D`P`.K$,8>(X"`!0T`X```$,0(20#``RL
+M0QGPC@(`%#0#@```0Q`A)`,`_ZQ#&?2.!0`4-`*```"B*"&6`@'4,$(`\"1"
+M_]`L0@!`)`,`&"0$`!0`@A@+K*,9^(^_`"2/L``@`^``"">]`"@GO?_8K[\`
+M)*^P`"`\`@``)$(```!`^`D`@(`E$$``,30#@`".`@`4`$,0(20#``&L0P$$
+MC@0`%#0"@```@B`AC((`'"0#P'\`0Q`D-$(/@*R"`!R.`@`4-`.```!#$"$D
+M`P`?K$,8<(X"`!0T`X```$,0(20#`'^L0QATC@(`%#0#@```0Q`A)`,`!*Q#
+M&'B.`@`4-`.```!#$"$D`P`,K$,9\(X"`!0T`X```$,0(20#`/^L0QGTC@4`
+M%#0"@```HB@AE@(!U#!"`/`D0O_0+$(`0"0#`!@D!``4`((8"ZRC&?B/OP`D
+MC[``(`/@``@GO0`H`````````````````^``""0"``$#X``(``````/@``@`
+M````)[W_X*^_`!ROL@`8K[$`%*^P`!``H(@E`,`H)200``$2,``-`("0)1(@
+M``8\`@`!)`(``A(B``X``!`E$```$X^_`!PD0DT0`$#X"0`````0```+`$"`
+M)3P"``$D0DT8`$#X"0`````0```&KE$ON#P"``$D0DT@`$#X"0````"N42^X
+M`@`0)8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(`/@``@``!`E`^``"```$"4`
+M`````````">]_VBOOP"4K[X`D*^W`(ROM@"(K[4`A*^T`("OLP!\K[(`>*^Q
+M`'2OL`!P`("():^E`)P`P+`EKZ<`I`(@H"66P@`"``(1PC!#``&6P@`",$(!
+M`!!```4``*@E%&`#\B0#``P0```(EL(``I;"``(``A'".$(``3!"``$40`/J
+M)`,`#);"``(``A&",$,``9;"``(P0@`@$$``!0`````48`/A)`,`#!````@\
+M`@``EL(``@`"$8(X0@`!,$(``11``]DD`P`,/`(``"1"```"("`E`$#X"0+`
+M*"4`0/`E$\`#T20#``PD`@`&CZ,`G!!B``LL8@`'$$``!B0"``@L8@`"$$`#
+MR"0#``P0```%CZ4`I(^D`)P4@@/#)`,`#(^E`*00H``+`````(XB`!2,0A%`
+MKZ(`6#P"```D0@```B`@)0!`^`D#P"@E$````XXD`<ROH`!8CB0!S#B#``<L
+M8P`!.((`"RQ"``$`8A@E%&``#(^F`*0D`P`*$(,`"20"``D0@@`'`````!2#
+M`!H`````EB(!T"Q"``000``6`````!#``!0`````CB02-!"``!$`````EL,`
+M`)2"```08@`-`````);#``*4@@`",&,!\#!"`?`48@`'/`(``"1"```"("`E
+M`$#X"0+`*"440`.2)`(``8XD`!0T`H```((0(8Q#`%BOHP!<)`,``8^E`%P`
+MH#`E`&8H"J^E`%R,0P`$/`("(`!B&"2OHP!@C(,`L#P"`/XT0@!@`&(8)*^C
+M`&@\`@``)$(```(@("4`0/@)CZ4`G#P"```D0@```$#X"0(@("4\`@``)$(`
+M``(@("4`0/@)`L`H)1!``VHD`P`#EL(``C!#`?`D`@%`$&(`("AB`4$00``/
+M)`((P"0"`,`08@`F*&(`P1!```8D`@#0)`(`H!!B`!TD`P`,$``#6H^E`*@0
+M8@`A)`,`#!```U:/I0"H$&(`&2AB",$00``&)`()0"0"`5`08@`,)`,`#!``
+M`TV/I0"H$&(`!20""5`08@`&)`,`#!```T>/I0"H)!<``1```!"OMP!D)!<`
+M`B0"``$0```,KZ(`9"07``,D`P`"$```"*^C`&0D%P`$)`0``A````2OI`!D
+M)!<`!20%``*OI0!DCB(`%#0#@```0Q`A)`,`!ZQ#&````(`E/`(``"13(A`G
+ML@!(`!`00`!0&"$``Q#``%,0(8Q$```D@L``+$(0`!!``!8`$!!```,00`!7
+M$"$``A"``%,0(8Q"``"OH@!(DZ,`2))"``$``A(``&(8)9)"``(``A0``&(8
+M)9)"``,``A8``&(8)8XB`!0`1!`AK$,``!````XFM0`!`%`0(0`"&,``<Q@A
+MCB0`%(QC````@R`A``(00`!7$"$``A"``%,0(8Q"``"L@@``)K4``3*B`#\4
+M0``$/`8``"3&````P/@))`0``280``$N`@`9%$#_S0`0$$```(`E/`(``"13
+M)&@GL@!,`!`0P`!3$"&,1```CZ(`I!!```P\!?__-*5_X`"%&"$L8P`9/`+_
+M_S1"?RP`@A`A+$(`"3A"``$``Q`+$$``)``````D@L``+$(0`!!``!0`$!C`
+M`!`0P`!3$"&,0@`$KZ(`3).C`$R20@`!``(2``!B&"620@`"``(4``!B&"62
+M0@`#``(6``!B&"6.(@`4`$00(:Q#```0```')K4``8XB`!0`1!`A`',8(8QC
+M``2L0P``)K4``3*B`#\40``$/`8``"3&````P/@))`0``280``$N`@#$%$#_
+MR@`0$,".@BRL`B`@)0+@*"6/I@!D`$#X"0*@."66P@`",$+``!!```4\`@``
+M)$(```(@("4`0/@)`L`H)98B`=(L0@!"%$``230#@`".(@`4`$,0(3P#``(T
+M8Z`"K$,8+);#```D`@FT%&(`#CP#9F:2@A*2EH,2G`!#$",\`V9F-&-F9P!#
+M`!@``!@0``,80P`"%\,`8A@C``,<`!````<``R0#DH(2DC1C9F<`0P`8```0
+M$``"$\```B0#EL(``C!"`-`D`P#`%$,`$#0#@`".)0`4-`*```"B*"&2@A*2
+M``(0(P`"$8`P0@_```08(P`#'(`\!`#\`&08)`!#$"6LHAE,$```!8XD`!2.
+M(@`4`$,0(:Q`&4R.)``4-`*```""("&,@B(H)`/]_P!#$"2L@B(HCB0`%#0"
+M@```@B`AC((B*#P#__XT8P/_`$,0)#1""`"L@B(HCB(`%#0#@```0Q`A)`,`
+M#ZQ#`&"6(@'2+$(`0Q1```0T`X``CB(`%`!#$"&L0")4CB,!S"0"``448@`[
+M`````)8B`=`X0P`"+&,``3A"``<L0@`!`&(8)1!@`#,T`X``CB(`%`!#$"$D
+M`Q8BK$,9;);"``(P0@"`$$``"C0"@`".)``4`((@(8R"&$@\`_^#-&/__P!#
+M$"0\`P`\`$,0):R"&$B6P@`",$(`H"0#`*`40P`*-`*``(XD`!0`@B`AC((B
+M'#P#_@<T8___`$,0)#P#`&``0Q`EK((B'(XB`!0T`X```$,0(20#``2L0QAX
+MEL(``C!"`?`D`P%`%$,`#S0"@`".)``4`((@(8R"&$0D`_^``$,0)#1"`""L
+M@AA$$```!SP"``".(@`4-`.```!#$"$D`P`.K$,8>#P"```D0@```B`@)0/`
+M*"4`0/@))Z8`$!!``@XD`P`#)`(`!H^C`)P08@`'`````(XB`@000``$/`(`
+M`"1"````0/@)`B`@)8Z"++@"("`E`\`H)3+F__\`0/@))Z<`$!!``?PD`P`#
+MEL(``C!"`$`00``>)`0`"HXC`<P09``-)`(`"1!B``L`````%&0`!0````"6
+M(@'0+$(`!!1```4`````EH(2<"Q"4`,40``+/`(``);"``(P0@"@)`,`H!!#
+M``4\`@``)$(```(@("4`0/@)`\`H)3P"```D0@```B`@)0!`^`D"P"@E/`(`
+M`"1"```"("`E`$#X"0/`*"400`'4)`,``X^D`*00@``$`````(XB`!2/I0!8
+MK$410(XD`!0T`H```((@(9*#+#"2@BPQ``(2``!B&"62@BPR``(4``!B&"62
+M@BPS``(6``!B&"6L@P``CB0`%#0"@```@B`ADH,L-)*"+#4``A(``&(8)8^F
+M`&``9A@ECH(OS`!B&"4\`@"``&(8):R#``0\`@``)$(```(@("4`0/@)CZ4`
+MG(XD`!0T`H```((@(9*#+#R2@BP]``(2``!B&"62@BP^``(4``!B&"62@BP_
+M``(6``!B&"6L@P#@CB0`%#0"@```@B`ADH,L0)*"+$$``A(``&(8):R#`.2.
+M)0`4C*)`$*^B`%"3HP!0)Z0`4)""``$``A(``&(8)9""``(``A0``&(8)9""
+M``,``A8``&(8)8^B`&@`8A@EK*,`L(XB`!0T`X```$,0(8^C`%RL0P!8CB0`
+M%#0"@```@B`ADH,L-I*"+#<``A(``&(8)9*"+#@``A0``&(8)9*"+#D``A8`
+M`&(8):R#``B.)``4-`*```""("&2@RPZDH(L.P`"$@``8A@EK(,`#(XB`!0T
+M`X```$,0(8Z#+]2L0P`8CB,`%"0"__^L8@"`/`(``"1"```"("`E`$#X"0/`
+M*"400`%<)`,``SP"```D0@```B`@)9(E$C@`0/@))`8``3P"```D0@```B`@
+M)0!`^`D"P"@EEB(!U#!"`/`D0O_0+$(`0!!``!(`````CB,2-(QB```P0L``
+M$$``#20'``V49@`",,9``"0%``R.)``4-`*```""("&,@A@D)`/_\`!#$"0`
+MYB@*`$40):R"&"2.(P',)`(`!11B``P`````EB(!T#A#``(L8P`!.$(`!RQ"
+M``$`8A@E$&``!#0#@`".(@`4`$,0(8Q"&'B.(@`4-`.```!#$"&,0AD4,$0_
+M_Y;"``(P0@`@$$``!P`$$(`\`[HN-&.+HP!#`!D``!`0$```!@`"(0(\`LS,
+M-$+,S0""`!D``!`0``(@PHXB`!0T`X```$,0(20#``&L0Q@<CB(2-)1"``(P
+M0D``$$``!SP"````!"!`)$(```!`^`DDA`!D$```$(XB`!2.(A(TE$(``C!"
+M@``00``'/`(````$((`D0@```$#X"22$`&00```%CB(`%"1"````0/@))(0`
+M9(XB`!0T`X```$,0(8Q5&`@D`S@`K$,8""00``&.(@`4-`.```!#$"&,0APD
+M,$(`$!!```\\`@``)%,``#02@``"8/@))`0`R`(`$"4H0@`4$$``!R80``&.
+M(@`4`%(0(8Q"'"0P0@`0%$#_]0````".(@`4-`.```!#$"&L51@(CB,`%#0"
+M@```8A@AC&(88#1"``.L8AA@EL(``C!"`*`D`P"@$$,`$R0"``*.@R_`$&(`
+M$#0"@`".(P`4`&(8(8QB&2`T0O``K&(9((XD`!0T`H```((@(8R"&2`\`P`!
+M`$,0):R"&2`D`@`!$````JZ"+\"N@"_`/`(``"1"````0/@)`B`@)0``@"4D
+M!@`!)Z4`5``0((`D@M``+$(0`!!``!(`$!"``@80!*^B`%23HP!4D*(``0`"
+M$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``8A@ECB(`%`!$$"&L0Q``$```
+M!B80``&.(P`4`&(8(0(&$`2L8A``)A```2H"``H40/_D`!`@@*Z`1J"6(@'H
+M$$``"P``@"4\`@``)%(```(@("4"0/@)`@`H)280``&6(@'H`@(0*A1`__H"
+M("`E/`(`"#1""66N@BQ$)`(`!H^C`)P48@`#/`(`"#1"&66N@BQ$CB,`%(Z"
+M+$2L8@"@CB0`%(R"`*P\`P`'`$,0):R"`*R.(A),$$``!#P"```D0@```$#X
+M"0(@("4\`@``)$(```(@("4T!9A@)`8``0!`^`D``#@E/`(``"1"```"("`E
+M`$#X"8^E`)R.)``4-`*```""("&,@@`@/`/^?S1C__\`0Q`DK((`((XC`<PL
+M8@`&$$``!R0"``448@`0`````)8B`=`L0@`(%$``#`````".(@`4-`.```!#
+M$"$\`P`!-&,`JJQ#`1B.(@`4-`.```!#$"$D`S(0K$,!'(XB`!0T`X```$,0
+M(20#`%*L0P$(CH0OT!"```0T`X``CB(`%`!#$"&L1`$@CH4O^"0"__\0H@`$
+M/`(``"1"````0/@)`B`@)8Z%+_PD`O__$*(`!#P"```D0@```$#X"0(@("6.
+MA3``)`+__Q"B``0\`@``)$(```!`^`D"("`ECB0!^!"```0T`X``CB(`%`!#
+M$"&L1`!(CZ0`G*XD`=R/I0"D$*``(B0"``&3PP`$,&(``A1```(P8@#^H\(`
+M!)?"``*FP@`"D\(`!*+"``2.(A(T```@)0``*"6L1``PK$4`-#P"```D0@``
+M`$#X"0(@("6.)!(TK((`**R#`"P\`@``)$(```(@("4`0/@))`4``1````8D
+M`@`!CZ4`J(RB```00``"```0):RC``"/OP"4C[X`D(^W`(R/M@"(C[4`A(^T
+M`("/LP!\C[(`>(^Q`'2/L`!P`^``"">]`)@GO?_HK[\`$#P"``$D0F$L`$#X
+M"20%``*/OP`0`^``"">]`!@GO?_HK[\`%*^P`!``@(`E/`(``"1"`````"@E
+M`$#X"20&``$00``%`@`@)3P"``$D0F$L`$#X"20%``./OP`4C[``$`/@``@G
+MO0`8)[W_T*^_`"ROL@`HK[$`)*^P`"``@)`E`*"`)3P"``$D0F$L`$#X"20%
+M``,00`"*```H)3P"```D0@```D`@)0!`^`DD!@`!$$``A(^_`"P\`@`!)$)A
+M+`)`("4`0/@)```H)1!``'V/OP`L$@``>R0"``&60@'4,$(`\"1"_]`L0@!`
+M%$``"0````".0@',.$,`!RQC``$X0@`++$(``0!B&"408``5`````)8#``(P
+M8@`@%$``!201``@P8P#0)`(`P!1B``,`````$```'B0$%-:6`@`",$)``!1`
+M`!HD!!74E@(``C!"@``D!!34)`,6U!```!0`8B`+E@,``C!B`"`40``%``"(
+M)3!C`-`D`@#`%&(``P`````0```*)`0`JY8"``(P0D``%$``!B0$`:J6`@`"
+M,$*``"0$`*HD`P*J`&(@"Y8#``(P8@!`$$``"#!B`"`40``$,&,`T"0"`,`4
+M8@`#`````!````4V,0`$E@(``C!"`$`V(P`!`&*("I8%``(PHP$`-B(``@!#
+MB`HPHP`0)`(``P!`@"4``X`*CD(`%#0#@```0Q`AC$88?#"B`"`40``$,*,`
+MT"0"`,`48@`3`````(Y"`!0T`X```$,0(:Q0&`2.0@`4`$,0(:Q1(@`0Q``;
+M)`(``8Y"`!0`0Q`AK$08?#P"```D0@```$#X"20$`2P0```2)`(``1#$``@T
+M`X``CD(`%`!#$"&L1!A\/`(``"1"````0/@))`0!+(Y"`!0T`X```$,0(:Q0
+M&`2.0@`4`$,0(:Q1(@`D`@`!C[\`+(^R`"B/L0`DC[``(`/@``@GO0`P)[W_
+MT*^_`"BOL0`DK[``(`"`B"4`H!@E`&"`)20%__\\`@``)$(```!`^`D`8R@+
+M`$`@)1"```F/OP`H,@(``11```8`@!`E)`,`!(XB`!2L0P`4`(`0)8^_`"B/
+ML0`DC[``(`/@``@GO0`P)[W_H*^_`%ROL@!8K[$`5*^P`%``@(@ECB(`$(Q#
+M``@0H`"0```0)1!@``4D`@`!$&(`!@``$"40``"+C[\`7"0&0`00```$)`<@
+M`#P&``0TQ@(`/`<``CP"N_\T0O`@CB,`%`!#$",L0A``$$``$0#FD"<\`KP`
+M-$(P((Q"``"OH@!`DZ,`0">D`$"0@@`!``(2``!B&"60@@`"``(4``!B&"60
+M@@`#``(6`!````0`8H`E/`*\`#1","",4```)`(``A2B`!,`YA`E$```$P(&
+M@"6OL`!$DZ,`1)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8
+M)3P"O``T0C`@K$,``!````X\`KO_`A*`)`("@"4\`KO_-$+P((XC`!0`0Q`C
+M+$(0`!1`_^@GI`!$/`*\`#1",""L4```/`*[_S1"\"".(P`4`$,0(RQ"$``0
+M0``%/`*\`#1","",0@``$```!#P"```T0C`@C$(``#P"```D0@```$#X"20$
+M`&0\`KO_-$+P((XC`!0`0Q`C+$(0`!!``!8"$H`D/`*\`#1","",0@``$```
+M%3P"N_^OL`!(DZ,`2)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8`
+M`&(8)3P"O``T0C`@K$,``!````\\`KO_/`*\`#1","",0@``/`*[_S1"\"".
+M(P`4`$,0(RQ"$``40/_G)Z0`2#P"O``T0C`@K%```#P"N_\T0O`@CB,`%`!#
+M$",L0A``$$``!3P"O``T0C`@C$(``!````0D`@`!-$(P((Q"```D`@`!C[\`
+M7(^R`%B/L0!4C[``4`/@``@GO0!@````````````````)[W_J*^_`%"OMP!,
+MK[8`2*^U`$2OM`!`K[,`/*^R`#BOL0`TK[``,`"`H"4`H*@E`,"P)0#@@"4`
+M`(@E/`(``"13*I`GL@`@/`(``"17````$1!``%$8(0`#$,``4Q`AC$0``"2"
+MP``L0A``$$``%@`1$$```Q!``%40(0`"$(``4Q`AC$(``*^B`""3HP`@DD(`
+M`0`"$@``8A@EDD(``@`"%```8A@EDD(``P`"%@``8A@ECH(`%`!$$"&L0P``
+M$```#B80``$`41`A``(8P`!S&"&.A``4C&,```"#("$``A!``%40(0`"$(``
+M4Q`AC$(``*R"```F$``!,@(`/Q1```,``````N#X"20$``$F,0`!+B(`#A1`
+M_\X`$1!```"()3P"```D4RO@)[(`)#P"```D50```!$8P`!S$"&,1```)(+`
+M`"Q"$``00``2`',0(8Q"``2OH@`DDZ,`)))"``$``A(``&(8)9)"``(``A0`
+M`&(8)9)"``,``A8``&(8)8Z"`!0`1!`AK$,``!````@F$``!CH0`%(Q"````
+M@B`A`',8(8QB``2L@@``)A```3("`#\40``#``````*@^`DD!``!)C$``2XB
+M`$@40/_:`!$8P```B"4\`@``)%,ON">R`"@\`@``)%4````1$$``41@A``,0
+M@`!3$"&,1```)(+``"Q"$``00``5`!$00`!V$"$``A"``%,0(8Q"``"OH@`H
+MDZ,`*))"``$``A(``&(8)9)"``(``A0``&(8)9)"``,``A8``&(8)8Z"`!0`
+M1!`AK$,``!````TF$``!`%$0(0`"&(``<Q@ACH0`%(QC````@R`A`%80(0`"
+M$(``4Q`AC$(``*R"```F$``!,@(`/Q1```,``````J#X"20$``$F,0`!+B(`
+M0!1`_\^/OP!0C[<`3(^V`$B/M0!$C[0`0(^S`#R/L@`XC[$`-(^P`#`#X``(
+M)[T`6">]_\BOOP`PK[,`+*^R`"BOL0`DK[``(`"`F"4`H)`E/`(``"1"``"6
+M10```$#X"99&``(``A0```(D`Y9"``(P0@"`$$``)0`$@$`"!(`A`!"`@#P"
+M```D0C8L`@*`(3P"```D0@``C@0`!`!`^`DD!0`(,%$`_P`1B4".`@````(1
+M``(BB"6&!``(CF,`%#0"@```8B@AC*8B!)9#```D`@FT%&(`!0`````TP@`0
+MK*(B!!````LH@@"1CF,`%#0"@```8A@A)`+_[P#"$"2L8B($$````RB"`)$`
+M`(@E*((`D1!```0\`@``,((``1!```@\`@``)$(``"2$_^@`0/@))`4`"#!%
+M`/\0```+)`(``22$_^@`!!?"`((@(3P"```D0@````0@0P!`^`DD!0`(,$4`
+M_P``$"4`!2B```(00`"B*"4TI00!CF0`%#0"@```@B`A,B(`_P`"$@`PHP#_
+M`$,0):R"&)P`!2H"CF0`%#0"@```@B`A,B+_`#"C`/\`0Q`EK((8T*YR$C0D
+M`@`!C[\`,(^S`"R/L@`HC[$`)(^P`"`#X``()[T`."RB``@00``4C(0O[#P"
+M```D0C=P``48@`!B&"&,8@```$``"``````#X``(`(`0)0/@``@D@@!$`^``
+M""2"`$@#X``()((`3`/@``@D@@!0`^``""2"`)0#X``(```0)2>]_SBOOP#$
+MK[X`P*^W`+ROM@"XK[4`M*^T`+"OLP"LK[(`J*^Q`*2OL`"@`("X):^E`,PP
+MU?__`N"8)92B``(P0P'P)`(`P!!B`$H``*`E*&(`P1!```8D`@%`)`(`H!!B
+M`#8``!`E$``"+X^_`,008@`#)`(!4!1B`BH``!`ECZ,`S)1B```D0O!?+$($
+MZQ!```4`````EGX35)9B$U80```;KZ(`F)1B```D0NMT+$(`\!!```6/HP#,
+MEGX36)9B$UH0```2KZ(`F)1B```D0NJ$+$(`X1!```6/HP#,EGX37)9B$UX0
+M```)KZ(`F)1B```L0A9=KZ``F!1```0``/`EEGX38)9B$V*OH@"8``"()0``
+M*"668Q+8KZ,`B)9B$MZOH@",+$,``:^C`)"68A,L$```'*^B`)26?A-DEF,3
+M9J^C`)B691-LEG$3<)9B$MJOH@"(EF,2X*^C`(PL8@`!KZ(`D)9C$RX0```.
+MKZ,`E)9^$VB68A-JKZ(`F)9E$VZ6<1-REF,2W*^C`(B68A+BKZ(`C"Q#``&O
+MHP"0EF(3,*^B`)0``(`E)Z0`&#P"```D1BX@`!`8@`"#&"$`$!!``%`0(0`"
+M$$``51`A``(0@`!&$"&,0@``K&(``"80``$N`@`1%$#_]``0&("/HP#,E&(`
+M`C!"`(`00``-/!```*^@`!`F$```)Z0`&"0&``,"`/@))`<`=Z^@`!`GI``8
+M`B`H)20&``,"`/@))`<`>@``@"4\`@``)%8N(">R`!@GL0!P`!`00`!0$"$`
+M`A#``%80(8Q$```D@L``+$(0`!!``!0`$!!``!`0@`)"$"&,0@``KZ(`<).C
+M`'"2(@`!``(2``!B&"62(@`"``(4``!B&"62(@`#``(6``!B&"6.X@`4`$00
+M(:Q#```0```,)I0``0!0$"$``A#``%80(8[C`!2,0@```&(8(0`0$(`"0A`A
+MC$(``*QB```FE``!,H(`/Q1```0\`@``)$(```!`^`DD!``!)A```2X"`!$4
+M0/_1`!`00```@"4\`@``)%(RN">Q`'0\`@``)%8````0&,``<A`AC$0``"2"
+MP``L0A``$$``$@!R$"&,0@`$KZ(`=).C`'22(@`!``(2``!B&"62(@`"``(4
+M``!B&"62(@`#``(6``!B&"6.X@`4`$00(:Q#```0```()I0``8[D`!2,0@``
+M`((@(0!R&"&,8@`$K((``":4``$R@@`_%$```P`````"P/@))`0``280``$2
+M`/_:/`(`````@"4D4C+`)[$`>#P"```D5@```!`00`!0&"$``Q#``%(0(8Q$
+M```D@L``+$(0`!!``!8`$!!```,00`!5$"$``A"``%(0(8Q"``"OH@!XDZ,`
+M>)(B``$``A(``&(8)9(B``(``A0``&(8)9(B``,``A8``&(8)8[B`!0`1!`A
+MK$,``!````XFE``!`%`0(0`"&,``<A@ACN0`%(QC````@R`A``(00`!5$"$`
+M`A"``%(0(8Q"``"L@@``)I0``3*"`#\40``#``````+`^`DD!``!)A```1(`
+M_\X\`@````"`)212,M@GL0!\/`(``"16````$!!``%`8(0`#$,``4A`AC$0`
+M`"2"P``L0A``$$``%@`0$$```Q!``%40(0`"$(``4A`AC$(``*^B`'R3HP!\
+MDB(``0`"$@``8A@EDB(``@`"%```8A@EDB(``P`"%@``8A@ECN(`%`!$$"&L
+M0P``$```#B:4``$`4!`A``(8P`!R&"&.Y``4C&,```"#("$``A!``%40(0`"
+M$(``4A`AC$(``*R"```FE``!,H(`/Q1```,``````L#X"20$``$F$``!$@#_
+MSB>D`!@``(`E/`(``"1%,O``$!B``(,8(0`0$$``4!`A``(00`!5$"$``A"`
+M`$40(8Q"``"L8@``)A```2X"`!$40/_T`!`8@(^C`,R48@`",$(!0"0#`4`4
+M0P`/)!$``Y9E$\ROL0`0/!```"80```GI``8)`8``0(`^`DD!P`SEF43SJ^Q
+M`!`GI``8)`8``0(`^`DD!P`MKZ``$#P0```F$```)Z0`&(^E`)`D!@`!`@#X
+M"20'`%^OH``0)Z0`&(^E`(@D!@`$`@#X"20'`&"OH``0)Z0`&`/`*"4D!@`#
+M`@#X"20'`&BOH``0)Z0`&(^E`)@D!@`#`@#X"20'`&L``(`E/`(``"16,O`G
+ML@`8)[$`@#P"```D7@```!`00`!0$"$``A#``%80(8Q$```D@L``+$(0`!!`
+M`!0`$!!``!`0@`)"$"&,0@``KZ(`@).C`("2(@`!``(2``!B&"62(@`"``(4
+M``!B&"62(@`#``(6``!B&"6.X@`4`$00(:Q#```0```,)I0``0!0$"$``A#`
+M`%80(8[C`!2,0@```&(8(0`0$(`"0A`AC$(``*QB```FE``!,H(`/Q1```,`
+M`````\#X"20$``$F$``!+@(`$11`_](`$!!```"`)2>D`!@\`@``)$4TB``0
+M&(``@Q@A`!`00`!0$"$``A!``%40(0`"$(``11`AC$(``*QB```F$``!+@(`
+M"!1`__,\`@``KZ``$"11```GI``8CZ4`E"0&``8"(/@))`<`':^@`!`GI``8
+MCZ4`C"0&``$"(/@))`<`!(^C`,R,8@``,$+``!!``!<D$``?E&(``C!"0``D
+M`P`0`&*`"Z^@`!`GI``8)`4`'R0&``4"(/@))`<`$Z^@`!`GI``8`@`H)20&
+M``4"(/@))`<`&*^@`!`GI``8)`4``R0&``("(/@))`<`,0``@"4\`@``)%4T
+MB">R`!@GL0"$/`(``"16````$!!``%`0(0`"$,``51`AC$0``"2"P``L0A``
+M$$``%``0$$``$!"``D(0(8Q"``"OH@"$DZ,`A)(B``$``A(``&(8)9(B``(`
+M`A0``&(8)9(B``,``A8``&(8)8[B`!0`1!`AK$,``!````PFE``!`%`0(0`"
+M$,``51`ACN,`%(Q"````8A@A`!`0@`)"$"&,0@``K&(``":4``$R@@`_%$``
+M`P`````"P/@))`0``280``$N`@`(%$#_T@`0$$"N8"_$)`(``8^_`,2/O@#`
+MC[<`O(^V`+B/M0"TC[0`L(^S`*R/L@"HC[$`I(^P`*`#X``()[T`R#"$__\P
+MI?__,,;__S#G__^7J``2<.@8`A!@`"(``!`E$,4`'B0#`&0`A1`C<$,0`@#%
+M&",`0P`:```0$A1@``(```````<`#0`"%````B0#!(``$P#@&"4H@@!E$$``
+M$`$`&"4D`@!D`$00(P!'`!APB``````8$CP"4>LT0H4?`&(`&```$!```A%#
+M``,?PP!#$",0```",$/__P#@&"4`8!`E`^``"``````GO?Z@K[\!7*^^`5BO
+MMP%4K[8!4*^U`4ROM`%(K[,!1*^R`4"OL0$\K[`!.`#@N"4`@*`E)`(`/Z^B
+M`3"6X@`",$,!\"0"`-`08@`D``#P)2AB`-$00``()`(!4"0"`*`08@`7)`(`
+MP!!B`!P``!`E$``!`H^_`5P08@`**&(!41!```8D`@E`)`(!0!!B``4``!`E
+M$```^8^_`5P48@#V```0)9:"$^:GH@$D)H(3TJ^B`2`F@A/H$```#J^B`2B6
+M@A7PIZ(!)":"%?BOH@$@)H(6KA````>OH@$HEH(5\*>B`20F@A7RKZ(!(":"
+M%A*OH@$H)[4!(#P"```D0@``)Z0`&`!`^`DD!0$()[8`(">S`*`D$@`!``"(
+M)0`1$$``5A`AI%(``"92``$J0@!`%$#_^B8Q``&GL0`>)`(``:>B`!HD`@`_
+MIZ(`'#(B__\00``0``"()3P"``$D4G>X`!&`0`(6$"&6Y```E$4```)`^`D"
+MH#`E`A.`(:8"```F,0`!EZ(`'@(B$"H40/_U`!&`0(9D``"7H@`>``(00`)B
+M$"&$1__^$```"0``B"4"8B@AA*/__H2B````0Q`J$$```I2F``"DIO_^)C$`
+M`9>B`!X"(A`J$$``#Y>B`!X`$1!``%,0(81#````@Q`J%$```Y>B`!X`8"`E
+M,C[__P!1$",D0O__,%+__Q9`_^@`$A!`EZ(`'A!```\``(@E`$`H)0`1$$``
+M4Q`AA$,```#C$"H00``$``````!@."4R(___KZ,!,"8Q``$")1`J%$#_]0`1
+M$$`DA``9/`-1ZS1CA1\`@P`8```0$``"$0,`!"?#`$00(R0$`#)P1!`"``(4
+M```"A`,``)`E`@,`&```&!```QD#``(7PP!B&",D8P`!&&``$```B"4``!`0
+M``(1`P`0'\,`0Q`C)$0``0(@&"4F(@`!,%'__XZ"1G@``QA``&(8(292``$"
+M1!`J%$#_]Z1^``"7H@`>`$`@)0`"$$`"8A`AA$+__@("$"HN(P!``$,0)!!`
+M`$P``)`E/`(``215<F0F`@`R``(4```"A`,`@!`E``(00`)B$"&$0O_^`@(0
+M*A!``!H`$AA``!(00`!3$"&$0P```@,8(X1"``("`A`C<&(8`AA@`!$`$AA`
+M``000`)B$"&$0O_^`@(@*A"```HF4@`!`!(00`!3$"&$0P```@,8(X1"``("
+M`A`C<&(8`AQ@__8``````!(80`!S$"&410``E$8``@!V&"&49P````<X0)1B
+M``(``A!`,$+__Z^B`!`R!/__`J#X"3#G__\D0@`!,$+__XZ#1G@`$2!``(,8
+M(0`"$$*D8@``CH)&>`""("&4@@``CZ,!,`!B$"L00``")B(``:2#```P4?__
+MEZ0`'@`$$$`"8A`AA$+__@("$"HN(P!``$,0)!1`_[DF`@`R+B(`0!!```L`
+M````CH-&>``1$$``0Q`AE$/__J1#```F(@`!,%'__RXB`$`40/_W`````*:`
+M+_0D`@`!C[\!7(^^`5B/MP%4C[8!4(^U`4R/M`%(C[,!1(^R`4"/L0$\C[`!
+M.`/@``@GO0%@)[W_J*^_`%"OMP!,K[8`2*^U`$2OM`!`K[,`/*^R`#BOL0`T
+MK[``,`#`J"4PE___,+;__SP"``$D0GE8`N`@)0+`*"4`0/@))Z<`&!1``$F7
+MH@`8EJ8`!">B`!ROH@`0/`(``"1"```"X"`ECJ4```!`^`DGIP`:EZ4`&B>B
+M`""OH@`0/!```280>>0"P"`E`J`P)0(`^`DGIP`>EZ4`'">B`"2OH@`0`L`@
+M)0*@,"4"`/@))Z<`(B>S`"8\$``!)A!Y6)>D`!J7I0`>`J`P)0(`^`D"8#@E
+M)[(`*)>D`!J7I0`@`J`P)0(`^`D"0#@EEZ4`'I>F`""7IP`FEZ(`**^B`!`\
+M$0`!)C%R9`(@^`D"P"`E`$"@)9>D`!R7I0`B`J`P)0(`^`D"8#@EEZ0`')>E
+M`"0"H#`E`@#X"0)`."67I0`BEZ8`))>G`":7H@`HKZ(`$`(@^`D"P"`EEZ4`
+M&I>F`!ROH@`0`N`@)0(@^`D"@#@EC[\`4(^W`$R/M@!(C[4`1(^T`$"/LP`\
+MC[(`.(^Q`#2/L``P`^``"">]`%@PA/__,*7__XS(``B4P@`$$$``'```4"65
+M`@``%$0`%``````E"0`(E0(`!A!``!```!@E)0L`!I4B```410`()&,``21C
+M__\``Q!``$L0(91"`!BDX@```^``""0"``&5`@`&`&(0*A1`__,E*0`")4H`
+M`93"``0!0A`J%$#_YB4(`#0#X``(```0)2>]_^"OOP`8,(3__S"H__^,Q0`(
+ME,(`!!!```P``!@EE*(``!!(``D`````E,8`!"1C``$`9A`J$$``!"2E`#24
+MH@``%$C_^@````"4I@`&CZ(`,*^B`!`\`@``)$(```!`^`DDI0`(C[\`&`/@
+M``@GO0`@)[W_Z*^_`!2OL``0`("`)8X$1G@0@``%/`(``"1"````0/@)````
+M`*X`1GB.!"_L$(``!3P"```D0@```$#X"0````"N`"_LC[\`%(^P`!`#X``(
+M)[T`&`/@``@D`@`!/`(``)2C``"40C>0`$,0*Q1```L``"`E/`(``"1#-Y"4
+MI0``)(0``0`$$(``0Q`AE$(```!%$"L00/_Z`````#P"```D0C>0``08@`!#
+M$"$#X``(A$(``B>]_^"OOP`8K[$`%*^P`!``H(@E`("`)3P"```D0@```$#X
+M"20$`+0`0!@E%&``!*X#+^PD`P`"$```)JXC```D`@"`K@)&?#P"```D0@``
+M`$#X"20$`(``0!@E%&``!*X#1G@D`P`"$```&JXC```\`@`!)$)Z6*X"+*@\
+M`@`!)$)D(*X"+*P\`@`!)$)HL*X"++`\`@`!)$)G`*X"++0\`@`!)$)I$*X"
+M++@\`@`!)$)S$*X"++P\`@`!)$)ZL*X"+,`\`@`!)$)ZN*X"+,0D`@`!C[\`
+M&(^Q`!2/L``0`^``"">]`"```````````">]_ZBOOP!0K[<`3*^V`$BOM0!$
+MK[0`0*^S`#ROL@`XK[$`-*^P`#``@*`E`*"H)0#`L"4`X(`E``"()3P"```D
+M4S?`)[(`(#P"```D5P```!$00`!1&"$``Q#``%,0(8Q$```D@L``+$(0`!!`
+M`!8`$1!```,00`!5$"$``A"``%,0(8Q"``"OH@`@DZ,`())"``$``A(``&(8
+M)9)"``(``A0``&(8)9)"``,``A8``&(8)8Z"`!0`1!`AK$,``!````XF$``!
+M`%$0(0`"&,``<Q@ACH0`%(QC````@R`A``(00`!5$"$``A"``%,0(8Q"``"L
+M@@``)A```3("`#\40``#``````+@^`DD!``!)C$``2XB`!`40/_.`!$00```
+MB"4\`@``)%,Y0">R`"0\`@``)%4````1&,``<Q`AC$0``"2"P``L0A``$$``
+M$@!S$"&,0@`$KZ(`)).C`"220@`!``(2``!B&"620@`"``(4``!B&"620@`#
+M``(6``!B&"6.@@`4`$00(:Q#```0```()A```8Z$`!2,0@```((@(0!S&"&,
+M8@`$K((``"80``$R`@`_%$```P`````"H/@))`0``28Q``$N(@!%%$#_V@`1
+M&,```(@E/`(``"13.V@GL@`H/`(``"15````$1!``%$8(0`#$(``4Q`AC$0`
+M`"2"P``L0A``$$``%0`1$$``=A`A``(0@`!3$"&,0@``KZ(`*).C`"B20@`!
+M``(2``!B&"620@`"``(4``!B&"620@`#``(6``!B&"6.@@`4`$00(:Q#```0
+M```-)A```0!1$"$``AB``',8(8Z$`!2,8P```(,@(0!6$"$``A"``%,0(8Q"
+M``"L@@``)A```3("`#\40``#``````*@^`DD!``!)C$``2XB`$`40/_/C[\`
+M4(^W`$R/M@!(C[4`1(^T`$"/LP`\C[(`.(^Q`#2/L``P`^``"">]`%@GO?_(
+MK[\`-*^T`#"OLP`LK[(`**^Q`"2OL``@`("8)0"@D"4``*`EED4``"RB$L`0
+M0`!"``"`)22D]W`\!V9F-.=F9P"'`!@``!@0``,80P`$%\,`8A@C``,0@`!#
+M$"$4@@`))*3W4``%$$`D4>[@`B<`&```$!```A"#`!$?PQ```!0`0X@C/`9F
+M9C3&9F<`A@`8```8$``#&$,`!!?#`&(8(P`#$(``0Q`A%((`N@``$"4`!1!`
+M)%'NH`(F`!@``!`0``(0@P`1'\,`0X@C)!0``0`1B(`\`@``)$(``#(D`/\`
+M0/@))`4`"`!`B"6.8P`4-`*```!B("&,A2($ED,``"0"";048@`%-`*``#2B
+M`!"L@B($$```C0`1,0".8P`4`&(8(20"_^\`HA`DK&(B!!```(8`$3$`ED0`
+M`#P"S,PT0LS-`((`&0``$!```A""``(8@`!B&"$`@Q@C,&/__R0"``(48@`=
+M+((5/!!``!L\$```ED,``"1C__XP8___``,0@`!#$"$``A!`/`/__S1C1(``
+M0Q`A/`11ZS2$A1\`1``8```@$``$(,,``A?#`((@(R80```DA``!`@#X"20%
+M``@`0(@E```@)0(`^`DD!0`"$```7`!`@"4\`\S,-&/,S0"#`!D``!@0``,9
+M`@`#$(``0Q`A``(0@`""$",P0O__%$``%2R"%``40``3)(+M0#P$9F8TA&9G
+M`$0`&```(!``!"##``(7PP""(",\$```)A`````$((`"`/@))`4`"`!`B"4D
+M!``#`@#X"20%``(0```\`$"`)99$```\`\S,-&/,S0"#`!D``!@0``,8P@`#
+M$(``0Q`A``(00`""$",P0O__%$``$R2"[4`\!&9F-(1F9P!$`!@``"`0``0@
+M@P`"%\,`@B`C/!```"80````!"!``@#X"20%``@`0(@E)`0``@(`^`DD!0`"
+M$```'0!`@"4\`\S,-&/,S0"#`!D``!@0``,8@@`#$(``0Q`A`((0(S!"__\4
+M0``E```0)22$[4`\`F9F-$)F9P""`!@``!`0``(00P`$)\,\$```)A````!$
+M(","`/@))`4`"`!`B"4D!``!`@#X"20%``(`0(`E`!$Q```0$(``PC`E`!00
+M0`#","4TQA`!CF(`%#0#@```0Q`A,,,`_ZQ#&)P`!C("CF(`%#0#@```0Q`A
+M,,,`?ZQ#&-BN<A(T)`(``8^_`#2/M``PC[,`+(^R`"B/L0`DC[``(`/@``@G
+MO0`X)*/__RQB``<00``2C(0O[#P"```D0D.8``,8@`!B&"&,8@```$``"```
+M```#X``(`(`0)0/@``@D@@`$`^``""2"``@#X``()((`#`/@``@D@@"L`^``
+M"```$"4GO?^(K[\`=*^^`'"OMP!LK[8`:*^U`&2OM`!@K[,`7*^R`%BOL0!4
+MK[``4`"`N"6OI0!\`."`)3#5__\"X*`EKZ``0*^@`$2OH`!(KZ``3(Z3+^PF
+MGBP0E*(``C!#`?`D`@#0$&(`20``L"4H8@#1$$``""0"`5`D`@"@$&(`.R0"
+M`,`08@!!```0)1```H*/OP!T$&(`"BAB`5$00``&)`((`"0"`4`08@`%```0
+M)1```GF/OP!T%&("=@``$"6/HP!\E&(``"1"\%\L0@3K$$``!@````"6@A-4
+MKZ(`0):#$U80```=KZ,`1)1B```D0NMT+$(`\!!```:/HP!\EH(36*^B`$"6
+M@Q-:$```$Z^C`$248@``)$+JA"Q"`.$00``&CZ,`?):"$UROH@!`EH,37A``
+M``FOHP!$E&(``"Q"%ET40``%`````):"$V"OH@!`EH,38J^C`$26A1+>EH(3
+M+!````^OH@`\EH,3;*^C`$B6@A-PKZ(`3):%$N"6@Q,N$```!Z^C`#R6@A-N
+MKZ(`2*^B`$R6A1+BEH,3,*^C`#P``"`E/`(``"1&/F@`!!"``F(0(0`$&,``
+M9A@AC&,`!"2$``$0@/_YK$,`````("4F9@`$/`(``"1'/G``!!"``,(0(0`$
+M&$``9!@A``,80`!U&"$``QB``&<8(8QC```DA``!$(#_]:Q#`````"`E/`(`
+M`"1&/H@`!!"``%,0(0`$&$``9!@A``,80`!U&"$``QB``&88(8QC```DA``!
+M$(#_]:Q#``@``"`E)F8`!#P"```D1SZ@``08@`!F&"$`!!!``$00(0`"$$``
+M51`A``(0@`!'$"&,0@``K&(`""2$``$L@@`H%$#_\R9Q``ROH``0/`(``"12
+M```"("`E)`8``0)`^`DD!P$NE@4``*^@`!`"("`E)`8``@)`^`DD!P$.E@4`
+M`J^@`!`"("`E)`8``@)`^`DD!P$!CZ,`?)1B``(P0@!`$$``+"00``./P@`<
+MA$4``J^P`!`"("`E)`8``0)`^`DD!P"HC\(`'(1%``2OL``0`B`@)20&``$"
+M0/@))`<`J8_"`!R$10`&K[``$`(@("4D!@`!`D#X"20'`*J/P@`<A$4`"*^P
+M`!`"("`E)`8``0)`^`DD!P"NC\(`'(1%``JOL``0`B`@)20&``$"0/@))`<`
+MKX_"`!R$10`,K[``$`(@("4D!@`!`D#X"20'`+"/HP!\E&(``C!"`(`00``1
+M)G$`#*^@`!`\$```)A````(@("6/I0!()`8``P(`^`DD!P$?KZ``$`(@("6/
+MI0!,)`8``P(`^`DD!P$B$```$);B`=2OH``0/!```"80```"("`ECZ4`0"0&
+M``,"`/@))`<!%Z^@`!`"("`ECZ4`1"0&``,"`/@))`<!&I;B`=0P0@#P)$+_
+MT"Q"`$`00``I`````);D`=0X@P`U+&,``3B"`$4L0@`!`&(8)11@``8F<@`,
+M)`(`1A""``,D`@`V%((`'``````D$0`"K[$`$#P0```F$````D`@)20%``(D
+M!@`"`@#X"20'`%JOL0`0`D`@)20%``(D!@`"`@#X"20'`%ROL0`0`D`@)20%
+M``(D!@`"`@#X"20'`%ZOL0`0`D`@)20%``(D!@`!`@#X"20'`/Z6X@'2+$(`
+M0A1``"4``"`E)G(`#"0"``&OH@`0/!```"80```"0"`E)`4``20&``$"`/@)
+M)`<!&201``.OL0`0`D`@)20%``$D!@`"`@#X"20'``&OL0`0`D`@)20%``$D
+M!@`"`@#X"20'``.OL0`0`D`@)20%``$D!@`!`@#X"20'`(NOL0`0`D`@)20%
+M``$D!@`!`@#X"20'`(P``"`E)F4`!#P"```D1D)@``08@`!E&"$`!!!``$00
+M(0`"$$``51`A``(0@`!&$"&,0@``K&(`J"2$``$L@@`-%$#_]``$&("/HP!\
+ME&(``C!"`$`00``))F0`K(_"`!R$10``KZ``$#P"```D0@``)`8``@!`^`DD
+M!P`E)G$`K*^@`!`\`@``)%(```(@("6/I0`\)`8`!@)`^`DD!P`.CZ,`?(QB
+M```P0L``$$``$200``^48@`",$)``"0#``@`8H`+KZ``$`(@("4D!0`/)`8`
+M!`)`^`DD!P`ZKZ``$`(@("4"`"@E)`8`!`)`^`DD!P!&``"`)3P"```D4CYH
+M)[$`*#P"```D50```!`0P`!2$"&,1```)(+``"Q"$``00``4`!`0P``0$(`"
+M8A`AC$(``*^B`"B3HP`HDB(``0`"$@``8A@EDB(``@`"%```8A@EDB(``P`"
+M%@``8A@ECN(`%`!$$"&L0P``$```"B;6``$`4A`ACN,`%(Q"````8A@A`!`0
+M@`)B$"&,0@``K&(``";6``$RP@`_%$```P`````"H/@))`0``280``$2`/_6
+M/`(`````@"4D53YP)G(`!">Q`"P\`@``)%X````0$$``4!`A``(0P`!5$"&,
+M1```)(+``"Q"$``00``4`!`00``0$(`"0A`AC$(``*^B`"R3HP`LDB(``0`"
+M$@``8A@EDB(``@`"%```8A@EDB(``P`"%@``8A@ECN(`%`!$$"&L0P``$```
+M#";6``$`4!`A``(0P`!5$"&.XP`4C$(```!B&"$`$!"``D(0(8Q"``"L8@``
+M)M8``3+"`#\40``#``````/`^`DD!``!)A```1(`_](\`@````"`)212/H@G
+ML0`P/`(``"15````$!!``%`0(0`"$,``4A`AC$0``"2"P``L0A``$$``%``0
+M$$``$!"``%,0(8Q"``BOH@`PDZ,`,)(B``$``A(``&(8)9(B``(``A0``&(8
+M)9(B``,``A8``&(8)8[B`!0`1!`AK$,``!````PFU@`!`%`0(0`"$,``4A`A
+MCN,`%(Q"````8A@A`!`0@`!3$"&,0@`(K&(``";6``$RP@`_%$```P`````"
+MH/@))`0``280``$2`/_2/`(`````@"4D53Z@)G(`!">Q`#0\`@``)%X````0
+M$$``4!`A``(0P`!5$"&,1```)(+``"Q"$``00``4`!`00``0$(``4A`AC$(`
+M"*^B`#23HP`TDB(``0`"$@``8A@EDB(``@`"%```8A@EDB(``P`"%@``8A@E
+MCN(`%`!$$"&L0P``$```#";6``$`4!`A``(0P`!5$"&.XP`4C$(```!B&"$`
+M$!"``%(0(8Q"``BL8@``)M8``3+"`#\40``#``````/`^`DD!``!)A```2X"
+M`"@40/_2`!`00```@"4\`@``)%5"8"9R``0GL0`X/`(``"13````$!!``%`0
+M(0`"$,``51`AC$0``"2"P``L0A``$$``%``0$$``$!"``%(0(8Q"`*BOH@`X
+MDZ,`.)(B``$``A(``&(8)9(B``(``A0``&(8)9(B``,``A8``&(8)8[B`!0`
+M1!`AK$,``!````PFU@`!`%`0(0`"$,``51`ACN,`%(Q"````8A@A`!`0@`!2
+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
+M'\(`8A@A``,80X^B!#RD0P``$```$)>B`1XD0I>0)Z0`((^C`^0`0/@)C&5&
+M>)>C`]"/I`1(I(,``*2#``(``A_"`&(8(0`#&$./H@0\I$,``)>B`)X``A0`
+M``(<`P`"%\(`8A@A``,80X^D`^RD@P``CZ($0*1#``"/I`1`E(,``"0"`#\`
+M0Q`CCZ,#Y*1B+_0D`@`!C[\$-(^^!#"/MP0LC[8$*(^U!"2/M`0@C[,$'(^R
+M!!B/L004C[`$$`/@``@GO00X,(/__S"E__\PQO__``<\```')`,0Q0`/AZ<`
+M$@!E$",`PQ@C`&0`&'!'`````!`2`,48(P!#`!H``!`2%&```@``````!P`-
+M``(4``/@``@``A0#`^``"`"`$"4PQO__,(3__P`&$$``HD`AE*(```""$"L0
+M0``$CZD`$*T@```#X``(K.```)4"__X`@A`K%$``#@"@&"4DPO__K2(```/@
+M``BLX@````(00ZTB```#X``(K.(````"$$.LX@``)$(``0/@``BM(@```&@0
+M*Q!```P`````E&(``!!$__(`91`CE&(``@""$"L40/_R`&40(R1C``(`:!`K
+M%$#_]@`````#X``(`````">]_\"OOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BO
+MLP`DK[(`(*^Q`!ROL``8`*"@)0#`L"6/M0!0,(3__P`'/```!Y0#``"8)201
+M``$L@P`"%&``.0``$"4``(`E))?__SP"``(D7I4<`!$00`!4$"&40@```%`0
+M*Q!```D`$R!``C<0*A!```<`E!`A)F(``3!3__\F(@`!,%'__P`3($``E!`A
+ME$4````1&$``=!`AE$8```"6("&$AP```'88(81B``"OH@`0`\#X"0(`("4`
+M$!A``'48(:1B`````A0```(4`P!2$"H40``.)@(``2X"`$`00``+)@(``0(`
+M$"4F`P`!,'#__P`"$$``51`AI%(``"X"`$`40/_Y`@`0)28"``$P4/__+@(`
+M0!1`_\\`$1!`)`(``8^_`#R/O@`XC[<`-(^V`#"/M0`LC[0`*(^S`"2/L@`@
+MC[$`'(^P`!@#X``()[T`0`"`0"65`@!^A00`?H4#````@R`C*(0`?R1"_X(`
+M`A0`$(```@`"3`.%"0``A08`?B3"__\`0#@E`$80*A!```TD!``_)(+__P`"
+M%````B0#``000`!($"&$0P```.,8*@`$$"<``A?"`&(8)!1@__4``````(`8
+M)20'`#\D8O__`$`@)1````0P0O__``(<`R1D__\P@O__+$(`/Q!```8``Q!`
+M`$@0(81"````1A`J$$#_]@`$%``48``.``<00`3@`!<!(!`E``<00`!%$"&4
+M0P`"I$,``"3B__\``A0```(\`P3A__@!(!`E$```#```````11`AI$,``"3"
+M__X``A0```(T`R3B__\``A0```(\`P3A_]D``````2`0)0/@``@``````(!8
+M)20,`$"58@!^A60`?H2C````@R`C*(0`?R1"_X(``A0`$(```@`";`.$K0``
+MA6D`?B4B__\`0$`E`$D0*A!```TD!``_)(+__P`"%````B0#``000`!+$"&$
+M0P```0,8*@`$$"<``A?"`&(8)!1@__8D@O__E*(`?J3B````@$`E)`H`/P%@
+M("6$X@```$D0*A!```4Q`O__+$(``0`,$`H00``'````````8"4`H"`E$```
+M`R0(`#\``A0```)$`QD```@Q`O__``@00`!$$"&$0@```$D0*A!`__<E`O__
+M,0+__RQ"``$`#!`+$$``#@`*$$`%0``7`:`0)0`*$$``1A`AE$,``J1#```E
+M0O__``(4```"5`,%0?_X`:`0)1````P``````$80(0&(&"6D0P``)2+__@`"
+M%````DP#)4+__P`"%````E0#!4'_S@&@$"4#X``(`````">]_^BOOP`4K[``
+M$`"`@"6.!$9X$(``!3P"```D0@```$#X"0````"N`$9XC@0O[!"```4\`@``
+M)$(```!`^`D`````K@`O[(^_`!2/L``0`^``"">]`!B$I``$```P)20'``$D
+MJ``$``<0@`!'$"$``A"``0(8(91B````1!`J$$```P``````X#`EA&0``"3G
+M``$HX@`$%$#_]``'$(``!AB``&88(0`#&(`DH@`(`&(@(82(``@`0Q`AA$D`
+M`"0'``$`!A"``$80(0`"&$`DI0`(`&<0(0`",$``Q1`AA$0`"`"($"H00``#
+M`*80(0"`0"6$20``).<``2CB``040/_T``D00`$"$",``A0``^``"``"%`,G
+MO?_0K[\`+*^V`"BOM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@*@E`*"@)0#@
+ML"6DP```EH(``C!"`4`D`P%`%$,`!`*@*"6.J1_<$```%):D']B6@@`",$(`
+MT#A#`,`L8P`!.$(`T"Q"``$`8A@E$&``!`````",J1_T$```")2D'_"6@P`"
+M,&,`H"0$`*`49`"$)`(``8RI'^B4I!_D&(``@```$"66@P``E2(```!B$"L4
+M0``5`````"0"`%1P@B@"`*D0(91"_ZP`0Q`K$$``&```."4D!0!4<(40`@!)
+M*"&4HO^NI,(``#P"``(D0IIP`J`@)0!`^`DDI?^LIL(``!```&<D`@`!E2(`
+M`J3"```\`@`")$*:<`*@("4`0/@)`2`H):;"```0``!=)`(``1"``!,``"@E
+MEH,``)4B````0Q`K$$``#R0"`%0D"`!4`*`X)22E``$`I!`J$$``"20"`%1P
+MJ!@"`&D0(9:#``"40@```$,0*Q1`__4`````)`(`5'"B&`(`:4`AE1(``'#B
+M&`(`:9@AEF<```)'D",:0``N`````(4"``*&9``"`$00(Y:#````9Q@C`)(`
+M&'!#`````!`2`%(`&@``$!(60``"```````'``T``A8```(6`Z3"```\$0`"
+M)C&:<`*@("4"(/@)`0`H)0!`@"4"H"`E`B#X"0)@*"4"`H`C`J`@)0(@^`D"
+M8"@EEH,``)9D````9!@C`%(`&'(#`````(`2`A(`&@``@!(60``"```````'
+M``T`$(8``!"&`Z;0```0```2)`(``20"`%1PHA@"`&DH(9:#``"4H@``%&(`
+M"@````"4H@`"I,(``#P"``(D0IIP`$#X"0*@("6FP@``$````B0"``$``!`E
+MC[\`+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`,">]_\BO
+MOP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"`L"4`H*@E`,"0)203
+M``$20``5``"()3P"``(D5)LP`!$0P`*B@"$"P"`E`@`H)2>F`!`"@/@))Z<`
+M$A!```63H@`1H@(`!I.B`!,0```"H@(`!P``F"4F,0`!`C(0*Q1`__``$1#`
+M`F`0)8^_`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`#@G
+MO?_@K[\`&*^Q`!2OL``0`*"()0"`@"4\`@``)$(```!`^`DD!`#@`$`8)11@
+M``2N`R_L)`,``A```"BN(P``)`(`@*X"1GP\`@``)$(```!`^`DD!`"``$`8
+M)11@``2N`T9X)`,``A```!RN(P``)`(`0*X"1GP\`@`")$*:&*X"+*@\`@`!
+M)$)\`*X"+*P\`@`")$*"F*X"++`\`@`!)$)^X*X"++0\`@`")$*"]*X"++@\
+M`@`")$*-N*X"++P\`@`")$*=_*X"+,`\`@``)$(``*X"+,0D`@`!C[\`&(^Q
+M`!2/L``0`^``"">]`"````````````````!!=&AE<F]S(#4R,3``````071H
+M97)O<R`U,C$Q`````$%T:&5R;W,@-3(Q,2`H1E!'02D`071H97)O<R`U,C$R
+M("A&4$=!*0!!=&AE<F]S(#4S,3(@5VE3;T,``$%T:&5R;W,@,C,Q-2!7:5-O
+M0P``071H97)O<R`R,S$W(%=I4V]#``!!=&AE<F]S(#(S,3,@5VE3;T,``$%T
+M:&5R;W,@-30R-"\R-#(T````071H97)O<R`U,C$R`````"A0%BQ8*```````
+M````"\@```O8```+V```"^````OH```,!```#`P```P<```.````#"P```Q`
+M```,G```#%0```QL```,A```#*P```X````.````#1````TD```-.```#4``
+M``O\```-6```#6P```V````.````#@````W8```.````#>````X````.````
+M#@````WP_Z#_H_^>_Z#_H_^@05(U,C$R``!!4C4S,3(``%)&-3$Q,0``4D8U
+M,3$R``!46%]$15-#7U-705``````````!0`*`!0`'@`R`$8`50!:`%\`9```
+M````"@`4`!X`*``R`#P`1@!0`%H`9```````P@```,0```#%````T````-H`
+M``#D````P@```,,```#4````\@```0T```$H````SP```,H````````````"
+M(5```0%```0`H``(`,``(`#0`$`!4```````````&500%`80)@``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````&10````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````EL"8\)M```"0@);`FT``#_____
+M__\```4"#P<"#PH`#PD`#P``````````````````C!P``(O(``"+T```C&``
+M`(OL``",6````````````````````"`````@````0````$``!@````8````&
+M```6G@`+%F(`"A8Z``D6'``(%>H`!Q6:``452@`$%0,``A19```+N``!````
+M`````````*LH``"KB```J[```*X@``"L*```KB```*X@``"N(```KB```*X@
+M``"L7```KB```*X@``"N(```KB```*QL``"LC```KB```*S4``"L^```KB``
+M`*OL``"N(```KB```*X@``"M.```K4P``*X@``"M9````````*W@``"M[```
+MK?@``*X$``"N$``````````&`````0````(````#````!`````4``*Z```"N
+MM```L(0``*\(``"PA```L(0``+"$``"PA```L(0``*](``"PA```L(0``+"$
+M``"PA```KV0``+"$``"PA```KW0``+!(``"PA```L(0``+"$``"PA```L(0`
+M`*^H``"OJ```L(0``+`0`````````````!!``"_\#P`O_`\`+_P?`"_\#P`O
+M_`\``!!$`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!(`"_\#P`O_`\`+_P?`"_\
+M#P`O_`\``!!,`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!0`"_\#P`O_`\`+_P?
+M`"_\#P`O_`\``!!4`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!8`"_\#P`O_`\`
+M+_P?`"_\#P`O_`\``!!<`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!@`"_\#P`O
+M_`\`+_P?`"_\#P`O_`\``!!D`"_\#P`O_`\`+_P?`"_\#P`O_`\``!`P```"
+M,````>````"P```!8````>```!!P```!:````>````&X```!C````>```!"P
+M```.8```$8```!\<```^.```$8```!#P``"@X``!0&@``%B```"PX``!0&@`
+M`(`4`^@#Z`;@!N`$(`0@"$`(0`;@!N```)@$``````````,`````````````
+M``,``)@@`@("``("`@`"`0(``@("``("`@```)@D```.#@``#@X```<'```.
+M#@``#@X``)A$$W(6'!-R'"43<A<B$W(6HA-R'"4``)A@``"=$```G1```)T8
+M``"=&```G1```)AD``'.```!S@```<X```'.```!S@```)AH0)I!D$":09!`
+MFD&00)I!D$":09```)D8```!N````;@```"$```!"````;@``)DD$`6*!1`%
+MB@40!8H%$`6*!1`%B@4``*(P```````````````````!"``````````,````
+M`````#0````%````0`````````!$````"````$@````(````3````!````!0
+M`````````%0````?```(``````````@$````````"`@````````(#```````
+M``@0````````"!0````````(&`````````@<````````""`````````()```
+M`````!)P````````$#@````````0>````````!"X````````$/@````````1
+M.````````!%X````````$;@````````1^````````!(X````````$G@`````
+M```2N````````!+X````````$S@````````3>````````!.X````````$_@`
+M```````4.````````!1X````````%+@````````4^````````!4X````````
+M%7@````````5N````````!7X````````%C@````````6>````````!:X````
+M````%O@````````7.````````!=X````````%[@````````7^````````!`\
+M````````$'P````````0O````````!#\````````$3P````````1?```````
+M`!&\````````$?P````````2/````````!)\````````$KP````````2_```
+M`````!,\````````$WP````````3O````````!/\````````%#P````````4
+M?````````(`$````````@`@```````"`#````````(`@````````@"0`````
+M``"`*````#```(`L``?__P``@#`!____``"`-````#$``(`X````````@#P`
+M``````"`2````````(!4````````@%@```````"`7``/QX\``(#`*H(P&@``
+M@,0%W`'@``"`R!]`)Q```(#,`?0`````@-```!X<``"`U``"JJH``(#8`@!5
+M50``@-P```````"`X/____\``(#D``#__P``@.@```````"`[````````(#P
+M````````@/0```````"`^````````(#\````B```AP````````"'!````(P`
+M`(<(````Y```APP```+5``"'$````````(<4````````AQ@```"@``"''```
+M`<D``(<@````+```AR0````L``"'*````#```(<L````/```AS`````L``"'
+M-````"P``(<X````,```ASP````\``"'0````````(=$````````AT@`````
+M``"'3````````(=0````````AU0```````"'6````````(=<````````AV``
+M``#5``"'9````-\``(=H```!`@``AVP```$Z``"'<````'4``(=T````?P``
+MAW@```"B``"'?````````($```$``@``@00````!``"!"````,```($,````
+M````@1````%H``"!%````````(?``P(!````A\0'!@4$``"'R`L*"0@``(?,
+M#PX-#```A]`3$A$0``"'U!<6%10``(?8&QH9&```A]P?'AT<``"'X`,"`0``
+M`(?D!P8%!```A^@+"@D(``"'[`\.#0P``(?P$Q(1$```A_07%A44``"'^!L:
+M&1@``(?\'QX='```F`RMA(X9``"8$'THX````)@4G`J?:P``F!P```````"8
+M0"!J`7H``)A4```(60``F0````````"9!````````)D(````````F0P`@```
+M``"9$`````$``)D<```,@```F2`%$`````"9*`````$``)DL````!```F30>
+M'R`B``"9.`H+#`T``)D\````/P``F4B2@+(2``"95%U0X8@``)E<`$MJC@``
+MF6@```/.``"9<!DOM14``)EX`````0``F7P```````"B$`"`8S,``*(4`!!L
+M$```HA@`G$!@``"B(`&(,,8``*(D```$````HBP```````"B-"`@("```*(X
+M("`@(```HD`X20H@``"B1```>[8``*)(#_\__```FP````````";*`````P`
+M`)LX````$@``FV0````A``";C````"T``)N<````,P````,`!@`)`#\`````
+M``,`!@`)`#\```````D````$``0``0`!``$```````````````9&1S@`````
+M``````````````0````!``$```````````````1&1S<`````````````````
+M``,``0`!``$```````````````-&1S8```````````````````0```````$`
+M``````````````%&1S4```````````````````0``0`!````````````````
+M``!&1S0```````````````````0````!`````````````/____Y&1S,`````
+M``````````````,``0`!`````````````/____U&1S(`````````````````
+M``0``````````````````/____Q&1S$```````````````````(``0`!````
+M`````````/____I&1S``````````````````````````````````````````
+M````````````````````````````"`````$``P``````````````````````
+M!D9'-P```````````````````@```````````````````````$9'-@``````
+M`````````````0``````````````````_____49'-0``````````````````
+M````````````````````____^D9'-``````````````````````!``$`````
+M````````____^$9',P`````````````````````!``$````!``$`````____
+M]D9',@`````````````````````!`````0`!``$`````____\T9',0``````
+M```````````````!`````0`!`````0``____\$9',```````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````"````!`````8````(````
+M"@````P````.````$``!+C```2>H``$HZ``!*RP``2NL``$L5``!+20`````
+M"6P)CPFT```)"`EL";0`````$$``+_P/`"_\#P`O_!\`+_P/`"_\#P``$$0`
+M+_P/`"_\#P`O_!\`+_P/`"_\#P``$$@`+_P/`"_\#P`O_!\`+_P/`"_\#P``
+M$$P`+_P/`"_\#P`O_!\`+_P/`"_\#P``$%``+_P/`"_\#P`O_!\`+_P/`"_\
+M#P``$%0`+_P/`"_\#P`O_!\`+_P/`"_\#P``$%@`+_P/`"_\#P`O_!\`+_P/
+M`"_\#P``$%P`+_P/`"_\#P`O_!\`+_P/`"_\#P``$&``+_P/`"_\#P`O_!\`
+M+_P/`"_\#P``$&0`+_P/`"_\#P`O_!\`+_P/`"_\#P``$#````(P```!X```
+M`+````%@```!X```$'````%H```!X````;@```&,```!X```$+````Y@```1
+M@```'QP``#XX```1@```$/```*#@``%`:```6(```+#@``%`:```@!0#Z`/H
+M!N`&X`0@!"`(0`A`!N`&X```F`0``````````P```````````````P``F"`"
+M`@(``@("``(!`@`"`@(``@("````F"0```X.```.#@``!P<```X.```.#@``
+MF$03<A8<$W(<)1-R%R(3<A:B$W(<)0``F&```)T0``"=$```G1@``)T8``"=
+M$```F&0``<X```'.```!S@```<X```'.````F&A`FD&00)I!D$":09!`FD&0
+M0)I!D```F1@```&X```!N````(0```$(```!N```F200!8H%$`6*!1`%B@40
+M!8H%$`6*!0``HC````````````````````$(``````````P`````````-```
+M``4```!``````````$0````(````2`````@```!,````$````%``````````
+M5````!\```@`````````"`0````````("`````````@,````````"!``````
+M```(%`````````@8````````"!P````````((`````````@D````````$G``
+M```````0.````````!!X````````$+@````````0^````````!$X````````
+M$7@````````1N````````!'X````````$C@````````2>````````!*X````
+M````$O@````````3.````````!-X````````$[@````````3^````````!0X
+M````````%'@````````4N````````!3X````````%3@````````5>```````
+M`!6X````````%?@````````6.````````!9X````````%K@````````6^```
+M`````!<X````````%W@````````7N````````!?X````````$#P````````0
+M?````````!"\````````$/P````````1/````````!%\````````$;P`````
+M```1_````````!(\````````$GP````````2O````````!+\````````$SP`
+M```````3?````````!.\````````$_P````````4/````````!1\````````
+M@`0```````"`"````````(`,````````@"````````"`)````````(`H````
+M,```@"P`!___``"`,`'___\``(`T````,0``@#@```````"`/````````(!(
+M````````@%0```````"`6````````(!<``_'CP``@,`J@C`:``"`Q`7<`>``
+M`(#('T`G$```@,P!]`````"`T```'AP``(#4``*JJ@``@-@"`%55``"`W```
+M`````(#@_____P``@.0``/__``"`Z````````(#L````````@/````````"`
+M]````````(#X````````@/P```"(``"'`````````(<$````C```AP@```#D
+M``"'#````M4``(<0````````AQ0```````"'&````*```(<<```!R0``AR``
+M```L``"')````"P``(<H````,```ARP````\``"',````"P``(<T````+```
+MAS@````P``"'/````#P``(=`````````AT0```````"'2````````(=,````
+M````AU````````"'5````````(=8````````AUP```````"'8````-4``(=D
+M````WP``AV@```$"``"';````3H``(=P````=0``AW0```!_``"'>````*(`
+M`(=\````````@0```0`"``"!!`````$``($(````P```@0P```````"!$```
+M`6@``($4````````A\`#`@$```"'Q`<&!00``(?("PH)"```A\P/#@T,``"'
+MT!,2$1```(?4%Q85%```A]@;&AD8``"'W!\>'1P``(?@`P(!````A^0'!@4$
+M``"'Z`L*"0@``(?L#PX-#```A_`3$A$0``"']!<6%10``(?X&QH9&```A_P?
+M'AT<``"8#*V$CAD``)@0?2C@````F!2<"I]K``"8'````````)A`(&H!>@``
+MF%0```A9``"9`````````)D$````````F0@```````"9#`"``````)D0````
+M`0``F1P```R```"9(`40`````)DH`````0``F2P````$``"9-!X?("(``)DX
+M"@L,#0``F3P````_``"92)*`LA(``)E475#AB```F5P`2VJ.``"9:````\X`
+M`)EP&2^U%0``F7@````!``"9?````````*(0`(!C,P``HA0`$&P0``"B&`"<
+M0&```*(@`8@PQ@``HB0```0```"B+````````*(T("`@(```HC@@("`@``"B
+M0#A)"B```*)$``![M@``HD@/_S_\``";`````````)LH````#```FS@````2
+M``";9````"$``)N,````+0``FYP````S```````````````P``"`%0``@!4`
+M`(`5``"`%0``@!4``(`<$HV/IPF(#\\$X`^5$N`/JPF(#\\``)@H"@(``0H"
+M``$%`0$`"@(``0H"``$``)@T```.#@``#@X```X.```.#@``#@X``)@X````
+M!P````<````+````"P````L``)A(`!C:6@`8VEH`&,II`!C*:0`8RFD``)A0
+M#>BTX`WHM.`-Z+3@#>BTX`WHM.```)A8?H`-+GZ`#2Y^Z$TN?NA-+GZ`#2X`
+M`)A<,3=F7C$W9EXQ-V9>,3=F7C$W85X``)AL!0RP@04,L($%#+"!!0RP@`4,
+ML(```)D4```G$```)Q```!5\```J^```)Q```)E$][@0(/>X$"#WN`T@][@0
+M(/>X$"```*(,9"Q!:F0L06ID0$%J9$!!:F1`06H``*(<&(.`"AB#@`H8<X`*
+M&(.`"AB#@`H``!(P````````F`@```````"8+``"+_X``)@\``(!````F$P2
+MA&$\``"9,```2(,``)E`````!```F5@```#_``"9=````````)GX````&```
+MH@0```````"B"-`^9X@``*(H```!M0``HCP3R(FO``";!````"```)L(````
+M$```FPP````P``";$`````@``)L4````*```FQ@````$``";'````"0``)L@
+M````%```FR0````T``";+````"P``)LP`````@``FS0````B``";/````#(`
+M`)M`````"@``FT0````J``";2`````8``)M,````)@``FU`````6``";5```
+M`#8``)M8````#@``FUP````N``";8`````$``)MH````$0``FVP````Q``";
+M<`````D``)MT````*0``FW@````%``";?````"4``)N`````%0``FX0````U
+M``";B`````T``)N0`````P``FY0````C``";F````!,``)N@````"P``FZ0`
+M```K``";J````"L``)NL````*P``F[`````K``";M````"L``)NX````*P``
+MF[P````K``";P````"L``)O$````*P``F\@````K``";S````"L``)O0````
+M*P``F]0````K``";V````"L``)O<````*P``F^`````K``";Y````"L``)OH
+M````*P``F^P````K``";\````"L``)OT````*P``F_@````"``";_````!8`
+M`)B<`````````````````````````````)B<````````````````````````
+M`````)B<`````````````````````````````)B<````````````````````
+M`````````)B<`````````````````````````````)B<````````````````
+M`````````````)B<`````````````````````````````)B<````````````
+M`````````````````)B<`````````````````````````````)B<````````
+M`````````````````````)B<`````````````````````````````)B<`#@`
+M```X````.````#@````X`````)B<`````````````````````````````)B<
+M`````````````````````````````)B<``````````````#`````@````(``
+M`)B<``0`^0`$`/D`!`#_``0`_0`$`/T``)C4```````````````$````!```
+M``0``)H````!J0```````)H$```!Z0```$```)H(````*0```(```)H,````
+M:0```5```)H0```!F0```9```)H4```!V0```=```)H8````&0```!```)H<
+M````60```$0``)H@````F0```(0``)HD```!I0```4@``)HH```!Y0```8@`
+M`)HL````)0```<@``)HP```!R````!0``)HT````"````$(``)HX````2```
+M`((``)H\````B````7@``)I````!F````;@``)I$```!V````?@``)I(````
+M&````!(``)I,````6````%(``)I0````F````)(``)I4```!I````7P``)I8
+M```!Y````;P``)I<````)````?P``)I@````9`````H``)ID````I````$H`
+M`)IH````Y````(H``)IL```!"@```5H``)IP```!2@```9H``)IT```!B@``
+M`=H``)IX```!R@````X``)I\````"@```$X``)J`````2@```(X``)J$````
+MB@```5X``)J(```!N@```9X``)J,```!^@```=X``)J0````.@````D``)J4
+M````>@```$D``)J8```!A@```(D``)J<```!Q@```7D``)J@````!@```;D`
+M`)JD````1@```?D``)JH````A@```#D``)JL````Q@```'D``)JP````Q@``
+M`+D``)JT````Q@```;T``)JX````Q@```?T``)J\````Q@```#T``)K`````
+MQ@```'T``)K$````Q@```+T``)K(````Q@```/T``)K,````Q@```/T``)K0
+M````Q@```/T``)K4````Q@```/T``)K8````Q@```/T``)K<````Q@```/T`
+M`)K@````Q@```/T``)KD````Q@```/T``)KH````Q@```/T``)KL````Q@``
+M`/T``)KP````Q@```/T``)KT````Q@```/T``)KX````Q@```/T``)K\````
+MQ@```/T``)C4````(```F-0````0````%````!`````0````%```F-@`8!!H
+M`&`0:`!@$&@`8!!H`&`0:```F)P`````````````````````````````F)P`
+M````````````````````````````F)P`````````````````````````````
+MF)P`````````````````````````````F)P`````````````````````````
+M````F)P0````$````!`````0````$```````F)P$````!`````0````$````
+M!```````F)P`````````````````````````````F)P`````````````````
+M````````````F)P`````````````````````````````F)P```````````H`
+M````````````````F)P`.`#``#@`@`(X`,``.`#``#@`P```F)P``@`&``(`
+M!@````8``@`&``(`!@``F)P```")````B0```(D```")````B0``F)P```"@
+M````H````*````"@````H```F)P`!``'``0`!P`$``<`!``'``0`!P``F-0`
+M```:````&@```!H````:````&@``F)P```!`````2````$````!`````0```
+MF)P````0````$````!`````0````$```F)P````(````"`````@````(````
+M"```F)P```!/````3P```$\```!/````3P``F)P```#Q````\0```&$```#Q
+M````\0``F)P``)!/``"03P``D$P``)!/``"03P``F)P``!):```26@``$IH`
+M`!):```26@``F,P````.````#@````\````.````#@````$```!&`&``````
+M``$```!&`&$```````$```!&`&(```````$```!&`&,```````$```!&`&0`
+M``````$```!&`&4```````$```!&`&8```````$```!&`&<```````$```!&
+M`&@```````$```!&`&D```````$```!&`&H```````$```!&`&L```````$`
+M``!&`&P```````$```!&`'0```````$```!&`'0```````$```!&`'0`````
+M``$```!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'0`
+M``````$```!&`'0```````$```!&`'4```````$```!&`'8```````$```!&
+M`'<```````$```!&`'@```````$```!&`'D```````$```!&`'H```````$`
+M``!&`'L```````$```!&`'P```````$```!&`'T```````$```!&`'X`````
+M``$```!&`'\```````$```!&`(````````$```!$`'P```````$```!&`(@`
+M``````$```!&`(P```````$```!&`)````````$```!&`)0```````$```!&
+M`)@```````$```!&`)P```````$```!&`*````````$```!&`*0```````$`
+M``!&`*@```````$```!&`*P```````$```!&`+````````$```!&`+0````!
+M:-@``6C@``%HZ``!:/```6D(``%I"``!:/@``6D`%IX`!A9B``06.@`#%AP`
+M`A7J``$5F@``%4H``!4#``$460`#"[@`!0``````````````,```@!4``(`5
+M``"`%0``@!4``(`5``"`'!*-DZ<)B!//!.`3E1+@$ZL)B!//``"8*`H"``$*
+M`@`!!0(!``H"``$*`@`!``"8-```#@X```X.```.#@``#@X```X.``"8.```
+M``<````'````"P````L````+``"82``8VFT`&-IM`!C*=0`8RG4`&,IU``"8
+M4`WHM.`-Z+3@#>BTX`WHM.`-Z+3@``"86'Z`#2Y^@`TN?N@-+G[H#2Y^@`TN
+M``"87#$W9EXQ-V9>,3=F7C$W9EXQ-V9>``"8;`4,L($%#+"!!0RP@04,L($%
+M#+"!``"9%```!]````?0```$3```")@```?0``"91/>X$"#WN!`@][@-$/>X
+M$!#WN!`0``"B!```````````````"`````@````(``"B"-:^9XC6OF>(T#YG
+MB-`^9XC0/F>(``"B#&0L`4!D+`%`9$+!8&1"P6!D0L%@``"B'!B#@`H8@X`*
+M&'.`"AB#@`H8@X`*```2,````````)@(````````F"P``B_^``"8/``"`0``
+M`)A,$H1A/```F3```$B"``"90`````0``)E8````_P``F70```````"B*```
+M`;4``*(\$\B)KP``FP0````!``";"`````(``)L,`````P``FQ`````$``";
+M%`````4``)L8````"```FQP````)``";(`````H``)LD````"P``FRP````-
+M``";,````!```)LT````$0``FSP````3``";0````!0``)M$````%0``FT@`
+M```8``";3````!D``)M0````&@``FU0````;``";6````!P``)M<````'0``
+MFV`````@``";:````"(``)ML````(P``FW`````D``";=````"4``)MX````
+M*```FWP````I``";@````"H``)N$````*P``FX@````L``";D````#```)N4
+M````,0``FY@````R``";H````#0``)ND````-0``FZ@````U``";K````#4`
+M`)NP````-0``F[0````U``";N````#4``)N\````-0``F\`````U``";Q```
+M`#4``)O(````-0``F\P````U``";T````#4``)O4````-0``F]@````U``";
+MW````#4``)O@````-0``F^0````U``";Z````#4``)OL````-0``F_`````U
+M``";]````#4``)OX````$```F_P````:``":``````<````'``":!````$<`
+M``!'``":"````(<```"'``":#````:````&@``":$````>````'@``":%```
+M`"`````@``":&````&````!@``":'````:$```&A``":(````>$```'A``":
+M)````"$````A``":*````&$```!A``":+````6(```%B``":,````:(```&B
+M``":-````>(```'B``":.````"(````B``":/````&(```!B``":0````6,`
+M``%C``":1````:,```&C``":2````>,```'C``":3````",````C``":4```
+M`&,```!C``":5````80```&$``":6````<0```'$``":7`````0````$``":
+M8````>H````+``":9````"H```!+``"::````&H```"+``":;````*H```&L
+M``":<````:L```'L``":=````>L````L``":>````"L````2``":?````&L`
+M``!2``":@````*L```"2``":A````:P```&3``":B````>P```'3``":C```
+M`"P````3``":D````#H```!3``":E````'H```"3``":F````+H```&4``":
+MG````;L```'4``":H````?L````4``":I````#L````Z``":J````'L```!Z
+M``":K````+L```"Z``":L````;P```&[``":M````?P```'[``":N````#P`
+M```[``":O````'P```![``":P````+P```"[``":Q````/P```&\``":R```
+M`/P```'\``":S````/P````\``":T````/P```!\``":U````/P```"\``":
+MV````/P```#\``":W````/P```#\``":X````/P```#\``":Y````/P```#\
+M``":Z````/P```#\``":[````/P```#\``":\````/P```#\``":]````/P`
+M``#\``":^````/P```#\``":_````/P```#\``"8U````"```)C0`P8$"`,'
+M!`@#!@0(`P8$"`,'!`@``)C<`*`@P`"@(,``X"#``.`@P`#@(,```)B<#P``
+M``\````/````#P````\``````)B<`````````````````````````````)B<
+M`(````"`````@````(````"``````)B<`"H````J````*@```"H````J````
+M`)B<``$````!`````0````$````!`````)B<````````````````````````
+M`````)B<`!@````8````&````!@````8`````)B<`&````!@````;@```&X`
+M``!N`````)B<`,<```#'````QP```,<```#'`````)B<`$L```!+````2P``
+M`$L```!+`````)B<!$@```1(```$2```!$@```1(`````)B<`$P```!,````
+M3````$P```!,`````)B<`.0```#D````Y````.0```#D`````)B<````````
+M`````````````````````)B<`/P```#\````_````/P```#\`````)B<`/\`
+M``#_````_P```/\```#_`````)B<!#\```0_```$/P``!#\```0_`````)B<
+M``P````,````#`````P````,`````)B<`AD```(9```"&0```AD```(9````
+M`)B<`"0````D````)````"0````D`````)B<`+0```"T````M````+0```"T
+M`````)B<`)D```"9````F0```)D```"9`````)B<`%````!0````4````%``
+M``!0`````)B<`"H````J````*@```"H````J`````)B<`!(````2````$@``
+M`!(````2`````)B<P#(``,`R``#`,@``P#(``,`R`````)B<`70```%T```!
+M=````70```%T`````)B<`!$````1````$0```!$````1`````)B<AB@``(8H
+M``"&*```AB@``(8H`````)B<,80``#&$```QA```,80``#&$`````)B<`/(`
+M@`#R`(``\@"``/(`@`#R`(```)B<`"<`&0`G`!D`)P`9`"<`&0`G`!D``)B<
+M`````P````,````#`````P````,``)B<````````````````````````````
+M`)B<````L@```+(```"R````L@```+(``)B<`+`@A`"P((0`L""$`+`@A`"P
+M((0``)B<`$$EI`!!):0`026D`$$EI`!!):0``)B<`!&2(``1DB``$9(@`!&2
+M(``1DB```)B<`!I(```:2```&D@``!I(```:2````)C8``L",``+`C``"P(P
+M``L",``+`C```)B<````E````)0```"4````E````)0``)B<````D0```)$`
+M``"1````D0```)$``)B<````$@```!(````2````$@```!(``)B<````@```
+M`(````"`````@````(```)B<````V0```-D```#9````V0```-D``)B<````
+M8````&````!@````8````&```)B<````\````/````#P````\````/```)B<
+M````H@```*(```"B````H@```*(``)B<````4@```%(```!2````4@```%(`
+M`)B<````U````-0```#4````U````-0``)B<```4S```%,P``!3,```4S```
+M%,P``)B<```$C```!(P```2,```$C```!(P``)C$`````P````,````#````
+M`P````,``8+$``&"S``!@M0``8+L``&"[``!@MP``8+D````````````````
+M,"XY+C(P+C,````````!8````6@```%P```!>````8``````````````````
+M`````8@`\`#S`8D`@`"#`8H`\@#U`8L`]@#W`8P`\0#T`8T`@0"$`8\`@@"%
+M````90```````?____\```"`_____P````!*4```#[0`````````:@``````
+M`?____\```"`_____P````!*4```#[0`````````0`#P`/.!B`#P`/,`00"`
+M`(.!B0"``(,`2`#R`/6!B@#R`/4`0P#V`/>!BP#V`/<`2@#Q`/2!C`#Q`/0`
+M2P"!`(2!C0"!`(0`3`""`(6!CP""`(4)"`E$!08H*```````````````````
+M``````````````F%"84%!B@H````````````````````````````````"84)
+MA10&*"@````````````````````````````````)A0F%$@8H*```````````
+M````````!`````````````G0"JP%!B@H````````````````````````````
+M````"0@)1`4&%`4````````````````````````````````)"`E$%``4!0``
+M``````````````````````````````EL":@%!A0%````````````````````
+M````````````"6P)J!0`%`4```````````````````!````````````);`FH
+M'@`4!0````````````````````````````````EL"9X;!A0%````````````
+M````````````````````"6P)GA0`%`4```````````````````!`````````
+M```)@`F*%``4!0````````````````````````````````F9":@4`!0%````
+M````````````````````````````"=`*K`4&%`4`````````````````````
+M```````````)HPFH%``4!0``````````````````("````````````D("404
+M`!0%````````````````````````````````"6P);!0`%`4`````````````
+M```````````````````)<0F`%``4!0``````````````````````````````
+M``F%"8H4`!0%````````````````````````````````"8\)F10`%`4`````
+M```````````````````````````)G@F>%``4!0``````````````````````
+M``````````FC":,4`!0%``````````"````````$````````````":,)HQ0`
+M%`4``````````(`````````````````````)J`FH%``4!0``````````@```
+M````!`````````````FH":@4`!0%``````````"`````````````````````
+M"0@)1`4&%`4````````````````````````````````)"`E$%``4!0``````
+M``````````````````````````EL":@%!A0%````````````````````````
+M````````"6P)J!0`%`4````````````````````@```````````);`FH'@`4
+M!0````````````````````````````````EL"9X;!A0%````````````````
+M````````````````"6P)GA0`%`4````````````````````@```````````)
+M@`F*%``4!0````````````````````````````````F9":@4`!0%````````
+M````````````````````````":,)J!0`%`4``````````````````"`@````
+M```````)M`FT!084!0````````````````````````````````FT";04`!0%
+M```````````````````H(```````````"=`*K`4&%`4`````````````````
+M```````````````)"`E$%``4!0````````````````````````````````EL
+M"6P4`!0%````````````````````````````````"7$)@!0`%`4`````````
+M```````````````````````)A0F*%``4!0``````````````````````````
+M``````F/"9D4`!0%````````````````````````````````"9X)GA0`%`4`
+M```````````````````````````````)HPFC%``4!0``````````@```````
+M!`````````````FC":,4`!0%``````````"`````````````````````":@)
+MJ!0`%`4``````````(````````0````````````)J`FH%``4!0``````````
+M@`````````````````````FT";04`!0%``````````"````````$````````
+M````";0)M!0`%`4``````````(`````````````````````4"A1:!08H*```
+M`````````````````````````````!2"%-(%!B@H``````````$`````````
+M````````````%/H5<@4&*"@````````````````````````````````5FA82
+M!08H*``````````!`````````````````````!0>%$8%!B@H````````````
+M````````````````````%&X4O@4&*"@``````````0``````````````````
+M```4YA5>!08H*````````````````````````````````!6&%B8%!B@H````
+M``````$`````````````````````%%`4>!$&*"@`````````````````````
+M```````````44!1X%P8H*````````````````````````````````!1:%%H1
+M!B@H````````````````````````````````%%H46A<`*"@`````````````
+M```````````````````4H!2@%P8H*``````````!``````````(`````````
+M`!2@%*`4!B@H``````````$``````````@``````````%((4@A$`*"@`````
+M`````0`````````"```````````4JA2J%``H*``````````!``````````(`
+M`````````!2"%*H4`"@H``````````$``````````@``````````%((4JA<&
+M*"@``````````0`````````"```````````5I!8<%`8H*``````````!````
+M``````(``````````!:`%J@4`"@H````````````````````````````````
+M%H`6J!X&*"@````````````````````````````````6A1:M'@8H*```````
+M`````````````````````````!1:%((/`"@H``````````,````````$````
+M````````%*H4JA(`*"@``````````P````````0````````````5I!8<%``H
+M*``````````#````````!````````````!:`%J@4`"@H````````````````
+M```$````````````$S,3/1<`"@4````````````````````0$``````````3
+M1Q-1%P`*!0```````````````````!`0`````````!,X$W07`!04````````
+M````````````$`<`````````$TX3>QL&!04````````````````````!````
+M```````341-Y'@8*!0````````````````````$``````````!-6$W0A!A0%
+M`````````````````````0``````````$ZL3L!<`"@4`````````````````
+M```0#``````````3L!/8%P`4%````````````````````!`"`````````!._
+M$[\7``H%````````````````````$`P`````````%``4>`4&%!0`````````
+M```````````````````````4,A1N%P`4%````````````````````!@!````
+M`````!0R%&X4`!04````````````````````&`$`````````%#P4>`\`%!0`
+M```````````````````%```````````4/!1X$084%```````````````````
+M``$!`````````!0\%'@2`!04````````````````````!0``````````%#P4
+M>!0`%!0````````````````````%```````````4/!1X%P`4%```````````
+M``````````4``````````!0\%'@7!A04`````````````````````0``````
+M````%#P4R!0&%!0``````````@`````````$```````````4>!2@%P`4%```
+M```````!``````````4``````````!2,%*`7`!04``````````,`````````
+M!0``````````%(P4R!(`%!0``````````P`````````%```````````4C!3(
+M%``4%``````````'````````@`4``````````!2,%,@4!A04``````````,`
+M`````````0(`````````%(P4R!<&%!0``````````P`````````!`@``````
+M```4C!3(%P84%``````````#``````````$``````````!2,%,@>`!04````
+M````````````````````````````%(P61`4&%!0``````````P``````````
+M```````````4H!3($084%``````````#``````````$``````````!5\%?0>
+M!A04``````````(`````````!```````````%7P61!0&%!0``````````P``
+M```````!!``````````5?!9$&P`4%``````````#``````````4`````````
+M`!5\%D0>`!04``````````,`````````!0``````````%7P61!<`%!0`````
+M````!P```````(`!```````````6<1:M%P`4%```````````````````````
+M`````````!9Q%JT>!A04````````````````````````````````%G$6K1X&
+M%!0``````````@`````````$```````````6<1;!!084%```````````````
+M`````````````````!9Q%L$1`!04````````````````````````````````
+M%G$6P10`%!0````````````````````````````````6<1;!'@`4%```````
+M`````````````````````````!9Q%L$>!A04``````````````````````,`
+M````````%G$6P1X&%!0````````````````````````````````3.!-T'@`4
+M%```````````````````!````````````!.P$]@>`!04````````````````
+M```$````````````%#(4;AX`%!0``````````P````````0````````````4
+M/!1X'@`4%``````````#````````!````````````!2,%,@>`!04````````
+M``,````````$````````````%G$6P1X`%!0```````````````````0`````
+M```````5?!9$'@`4%``````````#````````!````````````!2,%,@>`!04
+M````````````````````````````````%#P4>!X`%!0`````````````````
+M```````````````6P1;!'@`4%```````````````````!```````````````
+M`?\!_P````````````!__________P````````````,!F`&9````````````
+M`'__________````````````!P&8"S``````````````?_________\`````
+M```````(`9@,,`````````````!__________P```````````"`!(`H0````
+M`````````'__________````````````(0$@`9D`````````````?_______
+M__\````````````B`2`,,`````````````!__________P```````````#H!
+M8`H0`````````````'__________````````````.P%@`9D`````````````
+M?_________\````````````2`64*$````````P````!__________P``````
+M`````#<!,`&9```````#`````'__________````````````-0(P`9D`````
+M``,`````?_________\````````````V`S`!F0```````P````!_________
+M_P```````````#`$,`&9```````#`````'__________````````````.04P
+M`9D```````,`````?_________\````````````T!C`!F0```````P````!_
+M_________P```````````#(#,`&9```````#`````'__________````````
+M````,0,P`9D`````````````?_________\````````````1`1`!F0``````
+M``````!__________P```````````!`!$`H0`````````````'__________
+M````````````4@%0`9D`````````````?_________\```````````!%`E`!
+MF0````````````!__________P```````````$<#4`&9`````````````'__
+M________````````````0@10`9D`````````````?_________\`````````
+M``!8!5`!F0````````````!__________P```````````%L&4`&9````````
+M`````'__________````````````70A0`9D`````````````?_________\`
+M``````````!>"5`!F0````````````!__________P```````````%`#4`H0
+M`````````````'__________````````````50%0##``````````````?___
+M______\```````````!6`E`,,`````````````!__________P``````````
+M`$D"4`U0`````````````'__________````````````0`%`"D```````$8`
+M```$`````````"@!B`````````!!`4`*0```````1P````0`````````:`&)
+M`````````$@!0`H0``````!&````!``````````(`8H`````````2@%`"D``
+M`````$8````$````````&`@!C`````````!+`4`*0```````1@````0`````
+M``!@"`&-`````````$P!0`I0``````!&````!``````````(`8\`````````
+M0P)`"D```````$<````$`````````'`!BP````````#P`T`*0```````1@``
+M``0`````````(````````````(`#0`I```````!'````!`````````!@#Z<`
+M````````\0-`"D```````$8````$````````&`````````````"!`T`*0```
+M````1@````0```````!@``^H`````````((#0`I0``````!&````!```````
+M````#ZD`````````\@-`"A```````$8````$``````````````````````"#
+M!$`*0```````1P````0```````"`8`^J`````````/0$0`I```````!&````
+M!````````)@`````````````A`1`"D```````$8````$````````X``/JP``
+M``````"%!$`*4```````1@````0```````"```^L`````````/4$0`H0````
+M``!&````!````````(``````````````A@5`"D```````$<````$````````
+M@&`/K0````````"'!4`*0```````1@````0```````#@``^N`````````(@%
+M0`I0``````!&````!````````(``#Z\`````````B09`"D```````$<````$
+M`````````&@/L`````````"*!D`*0```````1@````0```````!@"`^Q````
+M`````(L&0`I0``````!&````!``````````(#[(`````````C`=`"D``````
+M`$<````$````````@&@/LP````````"-!T`*0```````1@````0```````#@
+M"`^T`````````(X'0`I0``````!&````!````````(`(#[4`````````CPA`
+M"D```````$<````$````````@&@/M@````````"0"$`*0```````1@````0`
+M``````#@"`^W`````````)$(0`I0``````!&````!````````(`(#[@`````
+M````]@E`"D```````$<````$````````@&````````````#W"T`*0```````
+M1P````0```````"`8````````````&``8`!@`````````````'__________
+M````````````80!A`&$```````,`````?_________\```````````!B`&(`
+M8@```````@````!__________P```````````&,`8P!C`````````````'__
+M________````````````9`!D`&0```````,`````?_________\`````````
+M``!E`&4`90```````P````!__________P```````````&8`9@!F````````
+M`````'__________````````````9P!G`&<`````````````?_________\`
+M``````````!H`&@`:`````````````!__________P```````````&D`:0!I
+M```````#`````'__________````````````:@!J`&H```````,`````?___
+M______\```````````'_```````!`````0````$;6```````$`````$````!
+M`````1M8````"``#`````0`````````!&U@````,``,````!``````````$;
+M6````"``1P```````````````!M8````,P`P`````0`````````!&U@````D
+M`"$````!`````0````$;6````"@`-P````$``````````1M8````'P`P````
+M`0````$````!&U@````P`%L````!``````````$;6````'```P````$`````
+M`````1M8````.``W`````0`````````!&U@```!4`%4````!`````0````$;
+M6````$0`50````$````!`````1M8````3``[`````0``````````&U@```!@
+M`%(````!`````0````$;6````&0`-`````$``````````1M8````?``@````
+M`0````$````!&U@```"8`%L````!`````0````$;6````)P`4@````$````!
+M`````1M8````J@`0`````0`````````!&U@```"\``,````!``````````$;
+M6````+\`-@````$``````````1M8````Q``W`````0````$````!&U@```#+
+M`#<````!``````````$;6````-``-P````$``````````1M8````U@`0````
+M`0````$````!&U@```#:``,````````````````;6````S(`-@````$`````
+M`````1M8````W@`#`````0`````````!&U@```#I`#<````!``````````$;
+M6````/8`-P````$``````````1M8````^@`W`````0`````````!&U@```#_
+M`#8````!``````````$;6````0P`,`````$````!`````1M8```!%``W````
+M`0`````````!&U@```$L`#<````!``````````$;6````4``$`````$````!
+M`````1M8```!5``#`````0`````````!&U@```%8`"$````!`````0````$;
+M6````5P`-P````$``````````1M8```!8``W`````0`````````!&U@```%D
+M`%L````!``````````$;6````6@`4@````$``````````1M8```!;`!2````
+M`0````$````!&U@```%T`#<````!``````````$;6````7@``P````$`````
+M`````1M8```!?``W`````0`````````!&U@```&(`$`````!```````````;
+M6````8D`00````$``````````!M8```!B@!(`````0``````````&U@```&+
+M`$,````!```````````;6````8P`2@````$``````````!M8```!C0!+````
+M`0``````````&U@```&/`$P````!```````````;6```#Z<`@`````$`````
+M`````!M8```/J`"!`````0``````````&U@```^I`((````!```````````;
+M6```#ZH`@P````$``````````!M8```/JP"$`````0``````````&U@```^L
+M`(4````!```````````;6```#ZT`A@````$``````````!M8```/K@"'````
+M`0``````````&U@```^O`(@````!```````````;6```#[``B0````$`````
+M`````!M8```/L0"*`````0``````````&U@```^R`(L````!```````````;
+M6```#[,`C`````$``````````!M8```/M`"-`````0``````````&U@```^U
+M`(X````!```````````;6```#[8`CP````$``````````!M8```/MP"0````
+M`0``````````&U@```^X`)$````!```````````;6````9``0@````$`````
+M`````1M8```!C@`#`````0`````````!&U@```&8`$4````!`````0````$;
+M6````9H`10````$``````````!M8```!FP!%`````0``````````&U@```&<
+M`%X````!```````````;6````9X``P````$``````````1M8```!K``W````
+M`0`````````!&U@```&F``,````!``````````$;6````;8`-P````$`````
+M`````1M8```!N``W`````0`````````!&U@```&Z`#<````!``````````$;
+M6````;X`(0````$````!`````1M8```#)P`#`````0`````````!&U@```'*
+M`%T````!```````````;6````=8`-P````$``````````1M8```!Y``0````
+M`0````$````!&U@```'L`#`````!`````0````$;6````?@``P````$`````
+M`````1M8```"$``W`````0`````````!&U@```(J`"(````!``````````$;
+M6````D(`-P````$``````````1M8```"``!;`````0`````````!&U@```)*
+M``,````!``````````$;6````D\`$`````$````!`````1M8```"7`!2````
+M`0`````````!&U@```)@`#L````!`````0````$;6````F@`-P````$`````
+M`````1M8```";``W`````0`````````!&U@```)V`!`````!`````0````$;
+M6````GH``P````$``````````1M8```"@@`#`````0`````````!&U@```*#
+M``,````!``````````$;6````JH`(0````$``````````1M8```"O@!;````
+M`0````$````!&U@```*_`#<````!``````````$;6````L$`-P````$`````
+M`````1M8```"Q@`[`````0`````````!&U@```+4`#<````!``````````$;
+M6````O``-P````$``````````1M8```"]``W`````0`````````!&U@```+X
+M``,````!``````````$;6````)X`4`````$````!`````1M8```"_``#````
+M`0`````````!&U@```,,`#`````!``````````$;6````Q0`-@````$`````
+M`````1M8```#&``V`````0`````````!&U@```,D``,````!``````````$;
+M6````Q```P````$``````````1M8```#.@`W`````0`````````!&U@```-(
+M`!`````!`````0````$6P0```TH`$@````$````!`````1M8```#6@`1````
+M`0`````````!&U@```-<`#H````!`````0````$;6````UX`5@````$`````
+M`````1M8```"P``#`````0`````````!&U@```-W``,````!``````````$;
+M6````LP``P````$``````````1M8`````````?\0`````````````````0``
+M```````````````````````@"``"`````````````````````/\`````````
+M````````)!$````````````````````4!0```````````````````@4`````
+M```````````````3```````````!4!``````````````````````````````
+M`````````````0``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````)0$```````````````````````````````````````
+M````!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````U`0```````````````````````````````````````````($```
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````$
+M4!```````````````````````````````````````````(```(``````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````50$```````
+M````````````````````````````````````0```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````!E`P````````````````
+M`@`````````#``````````````"``$"````````````````````)"```````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````(4#``````````````````````````
+M```````#`````````0`$````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````E0,`````````````````(`````````!`````,`
+M````````$"`$````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````3`P`````````````````@`````````$`````P``````"```
+M@$``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```",#`````````````````"``````````0````#`````````````$``````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````,P,```
+M``````````````(`````````!`````,```````@```!`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````!#`P````````````
+M`````@`````````$`````P```````````"!`````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````%,#`````````````````"````
+M``````0````#`````````````!``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````8P,`````````````````(`````````!```
+M``,``````````0`1````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````1`0````````````````````````````````````````
+M``(``0`@```````````````````2!```````````````````(!$`````````
+M````````````````````````````````````````````````````````````
+M```````!(!``````````````````````````````````````````!``"`@``
+M```````````````````````````````````````@$@``````````````````
+M``````````````````````````````````````````````````````````%@
+M$`````````````````$``````````P`````````````"`$"`(```````````
+M````````$,0```````````````````0A````````````````````````````
+M`````````````````````````````````````````````````640````````
+M`````````0`````````#````````````````````.```````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````!0$``````````````````
+M``````````@````"``````````````0`````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````)`0```````````````````````````
+M$`````(`````````````!<<`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````T!``````````````````````````(```````@``
+M``````````"`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````$0$`````````````````$````````@``````"````````````
+M0(``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``5`0`````````````````0```````"```````(``````````@!`@```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````!D!`````
+M```````````````````````(`````@````````````"(````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````'0$``````````````
+M```$````````@`@````"````````````0(0`````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````A`0`````````````````0`````
+M``"`"`````(``````````@!`A```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````"4!``````````````````````````(``````
+M`@````````````"!QP``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````+0$`````````````````$````````@``````"````````
+M````0(''````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````U0_P``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``H````````````````````*````````````````````````````````"C#_
+M``````````````````````````"``````P``````````````````````````
+M```````````````````````````````````````````````````!````````
+M`````````````0`````````````````````$```````````+,#``````````
+M`````````````````0`````#````````````````````````````````````
+M``````````````````````````````````````````"`````````````````
+M````@`````````````````````0```````````PP,```````````````````
+M```````"``````,`````````````````````````````````````````````
+M`````````````````````````````````!`````````````````````0````
+M````````````````!```````````"A`0````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````(````````````````````"``````````````
+M```````$```````````*0$``````````````````````````>&`````"````
+M````````````````````````````````````````````````````````````
+M``````````````I````````````````````$0`````````````````````0`
+M``````````I00```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````@````````````````````(````````````````````!```````````
+M`9DP````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````"```
+M``````````````````@````````````````````$````````````8/\`````
+M```````````#````````!``````(```````#X```````````````````````
+M`L``````````````````````````````````````````K\``````````````
+M``````OP``````````````````````@```````````!F_P``````````````
+M``,````````$``````@```````/@```````````````````````"P```````
+M```````````````````````````````````'P````````````````````?``
+M````````````````````"````````````&?_`````````````````P``````
+M``0`````"````````^````````````````````````+`````````````````
+M`````````````````````````"_````````````````````+\```````````
+M```````````(````````````:/\````````````````#````````!``````(
+M```````#X````````````````````````L``````````````````````````
+M````````````````5\```````````````````!7P````````````````````
+M``@```````````!A_P````````````````,````````$`````!````````/@
+M````````````````````````````````````````````````````````````
+M``````"OP```````````````````"_``````````````````````"```````
+M`````&+_`````````````````P````````0`````$````````^``````````
+M``````````````+``````````````````````````````````````````*_`
+M```````````````````+\``````````````````````(````````````8_\`
+M```````````````#````````!``````(```````!X```````````````````
+M`````L``````````````````````````````````````````+\``````````
+M``````````OP``````````````````````@```````````!D_P``````````
+M``````,````````$`````!```````!P`"``````````````````````"P```
+M```````````````````````````````````````'P```````````````````
+M`?``````````````````````"````````````&7_`````````````````P``
+M``````0`````$```````"(0`````````````````````````````````````
+M`````````````````````````````%?````````````````````5\```````
+M```````````````(````````````:?\````````````````#````````!```
+M```0```````#P````````````````````````L``````````````````````
+M````````````````````!\````````````````````'P````````````````
+M``````@```````````!J_P````````````````,````````$`````!``````
+M``/`````````````````````````````````````````````````````````
+M```````````OP```````````````````"_``````````````````````"```
+M`````````9C_````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````T```````````````````````````````````````````$$
+M`/H#`($``F0"9`$$`?0'`($``<D!R0$$`^@"`((!`.0`Y`$$!]`&`(0"`*``
+MH`$$"[@!`(8#`(P`C`$"%W`+`(P$`#P`/`$"(R@/`!($`#P`/`$"+N`*`)@&
+M`#``,`$"1E`.`"0&`#``,`$"7<`)`#`(`"P`+`$"C*`-`$@(`"P`+`$"NX`(
+M`&`(`"P`+`$"TO`,`&P(`"P`+```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````P`````````````````````````
+M``````````````````$``^@;`((```````$`!]`:!(0!``````$`%7P9!(L"
+M``````$`*O@8!)8#```````"%W`+``P$```````"(R@/`!($``````$"+N`*
+M`!@&``````$"1E`.`"0&``````$"7<`)`#`(``````$"C*`-`$@(``````$"
+MNX`(`&`(``````$"TO`,`&P(````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````0`````
+M``````````````````````````````````````$``^@;`((```````$`!]`:
+M!(0!``````$`%7P9!(L!``````$`*O@8!)8!````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````@```````````````````````````````````````````$#
+M%W`+`(P```````$#(R@/`!(```````$#+N`*`)@"``````$#1E`.`"0"````
+M``$#7<`)`+`$``````$#C*`-`$@$``````$#NX`(`&`$``````$#TO`,`&P$
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````<`````````````````````````
+M``````````````````$#%W`+`(P```````$#+N`*`)@"``````$#1E`.`"0"
+M``````$#7<`)`+`#``````$#C*`-`$@#``````$#NX`(`&`#``````$#TO`,
+M`&P#````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````@`````
+M``````````````````````````````````````$"!=P+`(,```````$"",H/
+M``0```````$""[@*`(8"``````$"$90.``D"``````$"%W`)`(P$``````$"
+M(R@-`!($``````$"+N`(`!@$``````$"-+P,`!L$````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````@```````````````````````````````````````````$"
+M"[@+`(8```````$"$90/``D```````$"%W`*`(P"``````$"(R@.`!("````
+M``$"+N`)`)@$``````$"1E`-`"0$``````$"7<`(`#`$``````$":7@,`#8$
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````@`````````````````````````
+M``````````````````$"%W`+`(P```````$"(R@/`!(```````$"+N`*`)@"
+M``````$"1E`.`"0"``````$"7<`)`+`$``````$"C*`-`$@$``````$"NX`(
+M`&`$``````$"TO`,`&P$````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````@`````
+M`````3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P
+M,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`
+M```````(``````````$P,2XP,0````````@``````````3`Q+C`Q````````
+M"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`````
+M`````3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P
+M,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`
+M```````(``````````$P,2XP,0````````@``````````3`Q+C`Q````````
+M"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`````
+M`````3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P
+M,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`
+M```````(``````````$P,2XP,0````````@``````````3`Q+C`Q````````
+M"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`````
+M`````3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P
+M,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`
+M```````(``````````$P,2XP,0````````@``````````3`Q+C`Q````````
+M"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`````
+M`````3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P
+M,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`
+M```````(``````````$P,2XP,0````````@``````````3`Q+C`Q````````
+M"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`````
+M`````3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P
+M,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`
+M```````(``````````$P,2XP,0````````@``````````3`Q+C`Q`````"YS
+M>6UT86(`+G-T<G1A8@`N<VAS=')T86(`+G)E9VEN9F\`+G)E;&$N=&5X=``N
+M<F5L+G1E>'0`+G)E;&$N<F]D871A`"YR96PN<F]D871A`"YR96QA+F1A=&$`
+M+G)E;"YD871A`"YD871A,0`N8G-S`"YN;W1E````````````````````````
+M```````````````````````````````````````;<```!@````(`````````
+M-````!@```````````````0````8````*0````$````&`````````%```9^P
+M```````````````0`````````"\````)`````````````DQ0```HT`````\`
+M```"````!`````@````D````!`````````````)U(``````````/`````@``
+M``0````,````/@````$````"```````!H````$/````````````````0````
+M`````$8````)`````````````G4@```'&`````\````%````!`````@````Y
+M````!`````````````)\.``````````/````!0````0````,````5P````$`
+M```#```````!X\```$J````````````````0`````````%T````)````````
+M`````GPX````*`````\````(````!`````@```!2````!`````````````)\
+M8``````````/````"`````0````,````9P````$````#```````"+D``````
+M```````````````0`````````&X````(`````P```````BY`````````````
+M````````$`````````!S````!P````````````(N0```!!``````````````
+M``$`````````$0````,````````````",E````!Y```````````````!````
+M``````$````"`````````````C5T```-8````!`````(````!````!`````)
+M`````P````````````)"U```"7H```````````````$`````````````````
+M``````````````````````````,```(````````````````#```%````````
+M`````````P``"`````````````````,```$````````````````#```+````
+M`````````````P``#`````````````````,```T````!``"N2````F`2```"
+M````#```SI0```+4$@```@```!<``-S0```!A!(```(````B``$TF````4`2
+M```"````+0``MS@````\$@```@```#@``%H@```!*!(```(```!#``!#\```
+M`:01```(````3@``H\0````P$@```@```%D``)ZH````&!(```(```!D``""
+M\`````@2```"````;P``;W@```,D$@```@```'H```X,````L!(```(```"%
+M``%#\````#@2```"````D```JH@```!8$@```@```)L``'^P````3!(```(`
+M``"F``#1:````-02```"````L0``">0```"`$@```@```+P``&1H````\!(`
+M``(```#'``$>B````2`2```"````T@``$V0```'0$@```@```.T``$C<```!
+MI!$```@```#X``"?^````*`2```"```!`P``!$@````P$@```@```0X``2/P
+M````>!(```(```$9```````````0```````!.@``HG````$P$@```@```44`
+M`*(P````0!(```(```%0``%*=````9P2```"```!6P``H-P```!P$@```@``
+M`68``)C\````G!(```(```%Q``"@F````#02```"```!?```GT````",$@``
+M`@```8<``&+$````A!(```(```&2``#28````$P2```"```!G0``H4P```"L
+M$@```@```:@``)P4````1!(```(```&S```#2````0`2```"```!O@``G\P`
+M```L$@```@```<D``0$D```!5!(```(```'4``!];````)`2```"```!WP``
+MVY0```"($@```@```>H``0J`````R!(```(```'U``$+2````$P2```"```"
+M`````>P```%0$@```@```@\``.T0```$8!(```(```(:``"U$````5`2```"
+M```")0`!!C````.<$@```@```C```*B,```!_!(```(```([``"V<````!02
+M```"```"1@```SP````,$@```@```E$```1X```"6!(```(```)G``#:/```
+M`#02```"```"<@``TCP````D$@```@```GT``(L\```--!(```(```*(``"!
+MK`````@2```"```"DP`!1#````%`$@```@```IX``2<4````5!(```(```*I
+M``%>3````"02```"```"M```@Y0```8T$@```@```K\``4:L````\!(```(`
+M``+*``!ES```"2`2```"```"U0`!!50```#<$@```@```N```)Z@````"!(`
+M``(```+K``"X$````&P2```"```"]@`!&YP```'($@```@```P$``5Z\```"
+M<!(```(```,,``"A^````#@2```"```#%P``;NP```",$@```@```R(``21H
+M````6!(```(```,M```````````2```````#.@`!'C0```!4$@```@```T4`
+M`24X````"!(```(```-0``"<L````+02```"```#6P``!S````)8$@```@``
+M`VP``0[@```)-!(```(```-W``">P````!@2```"```#@@`!-=@```#8$@``
+M`@```XT``'BP````W!(```(```.8``#D@```!T02```"```#HP``N3````!4
+M$@```@```ZX``+"H````-!(```(```.Y``"C]```!)@2```"```#Q```JN``
+M``-H$@```@```\\``0OD```!X!(```(```/:``$G:```!N`2```"```#Y0``
+MFL0```"@$@```@```_```)[X````"!(```(```/[``%AF````GP2```"```$
+M!@``G;````!P$@```@``!!$``$"H```!I!$```@```0<``$[`````%02```"
+M```$)P``SG`````D$@```@``!#(``)B@````+!(```(```0]``";9````+`2
+M```"```$2``!)70```&@$@```@``!%,``)HP````E!(```(```1>``#5=```
+M`V02```"```$:0`!&80```(8$@```@``!'0``4@H```!+!(```(```1_``!,
+M8````(@2```"```$B@``````````$```````!*H`````````"1$```@```2Z
+M``#>5````)P2```"```$Q0``<IP```!H$@```@``!-```)QP````0!(```(`
+M``3;``#:Y````+`2```"```$Y@``GP`````X$@```@``!/$``````````!(`
+M``````4```!"3````:01```(```%"P``M-````!`$@```@``!18``'HX````
+M6!(```(```4A``"!M````302```"```%+```1S@```&D$0``"```!3<``*.@
+M````)!(```(```5"``"XL````(`2```"```%30`!,>@```*P$@```@``!5@`
+M`+><````=!(```(```5C``!%E````:01```(```%;@`!&(0```!X$@```@``
+M!7D``````````!(```````6(``"8S````#`2```"```%DP``H,P````0$@``
+M`@``!9X``)G0````8!(```(```6I```!G````%`2```"```%MP````P````8
+M$0``"```!<D``(+X````G!(```(```74``$X)````M@2```"```%WP``MM@`
+M``!@$@```@``!>H``%CH````X!(```(```7U``$8%````'`2```"```&````
+MMIP````\$@```@``!@L``0N4````4!(```(```86``#KQ````1`2```"```&
+M(0`!)4`````T$@```@``!BP``'J0```!V!(```(```8W``$)S````*P2```"
+M```&0@``6<@```!8$@```@``!DT``'[,````V!(```(```98```2*````(@2
+M```"```&8P``"Z````)L$@```@``!FX``'S@````C!(```(```9Y``$\>```
+M!P`2```"```&A```_R````"D$@```@``!H\``.S4````/!(```(```::``!(
+MX````$02```"```&I0``!M````!@$@```@``!K```)F8````.!(```(```:[
+M```````````2```````&RP`!17````$\$@```@``!M8``1UD````T!(```(`
+M``;A``")R````702```"```&[```````````$```````!PP```ID```!/!(`
+M``(```<7``!S!```!5P2```"```'(@``N80```'L$@```@``!RT`````````
+M`!(```````<[``%)8````*`2```"```'1@`!3<@````($@```@``!U$```^,
+M````\!(```(```=<``"8<````#`2```"```'9P``MH0````8$@```@``!W(`
+M`,W<````E!(```(```=]``!^E````#@2```"```'B```WO````60$@```@``
+M!Y,``4W@```0;!(```(```>>```_!````:01```(```'J0``??P```"8$@``
+M`@``![0``!*P````M!(```(```>_``%*`````'02```"```'R@`!(\P````D
+M$@```@``!]4``)\X````"!(```(```?@``#^.````.@2```"```'ZP``/6``
+M``&D$0``"```!_8``'B(````*!(```(```@!```)B````%P2```"```(#``!
+M'Z@```0D$@```@``"!<``0XX````J!(```(```@B``"V8````!`2```"```(
+M+0`!0^`````($@```@``"#@``!!\```!K!(```(```A#``"W=````"@2```"
+M```(3@`!>Q````#H$@```@``"%D``%M(````/!(```(```AD``!1S```!QP2
+M```"```(>@``N'P````T$@```@``"(4``4><````C!(```(```B0``"[<```
+M$FP2```"```(FP``?_P```&P$@```@``"*8``$A(````F!(```(```BQ``"T
+M,````*`2```"```(O```GB````"`$@```@``",<``4P0````]!(```(```C2
+M``">V````"`2```"```(W0`!GK0```#P$@```@``".@``4TH````H!(```(`
+M``CS``"=9````$P2```"```(_@``?'````!P$@```@``"0D``-*L```"R!(`
+M``(```D4``$8_````"`2```"```)'P`!3=`````($@```@``"2H``'F,````
+MK!(```(```DU``%><````$P2```"```)0```G%@````8$@```@``"4L``/?(
+M```!8!(```(```E6``!+U````(P2```"```);P`!&1P```!H$@```@!Z>C`R
+M9&)F.#<U`'IZ,#)D8C(P-3,`>GHP9F)B,64S9@!Z>C`U8CAC-C5A`'IZ,#5B
+M.30R960`>GHP,#$Y9C0W,`!Z>C`R9&0Y-#)D`'IZ,#)D8F4W,V0`>GHP,#5B
+M-CDR8@!Z>C!B-F0R,S(U`'IZ,#`Q-F0Y,F4`>GHP8V9B,3@W-0!Z>C`P-6(W
+M9#=A`'IZ,#!B-F-F-64`>GHP8C9F-3!B.`!Z>C`V93!A-&9E`'IZ,#`V-V0R
+M8C$`>GHP,#)D8F,V,0!Z>C`P-6(V8V9D`&%T:%]H86Q?<')O8V5S<U]N;VES
+M969L;V]R`'IZ,#`U8C0X860`>GHP,F1B9C%B,@!Z>C`S,V5C.&)F`'IZ,&1B
+M-#(U8S4`871H7VAA;%]D;6%?8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP-F4P
+M,&(X80!Z>C`R9&)F8S%D`'IZ,#`U8CEA8F0`>GHP,F1B93@U,0!Z>C`Q-F4P
+M,&1D`'IZ,#)D8C,Q8C(`>GHP,&(W,#DR,P!Z>C`P8C9D-#4P`'IZ,#`P8C9D
+M,60`>GHP,F1B9&%B,@!Z>C`P,39D834P`'IZ,#`P-C=D,S(`>GHP,&(V9#DR
+M,P!Z>C`P,F1B-3%C`'IZ,#$V9&-B9F4`>GHP,&(W,#$T-0!Z>C!D8S9E,SDP
+M`'IZ,&(W,#EE9F8`871H7VAA;%]A='1A8V@`>GHP-F4P9F,P9`!Z>C`Q-F1A
+M8C)D`'IZ,&4P-#8X-&(`>GHP,39E,CDQ9`!Z>C`P,&(V9F4X`'IZ,#!C9F(S
+M93``871H7VAA;%]C;VUP=71E='AT:6UE`'IZ,#)D8C5B86,`>GHP,#5B-V8Y
+M9`!Z>C`V9&9F-#1A`'IZ,#)D8C4W-C,`>GHP,F1C,3EA90!Z>C`P,F1A9C8R
+M`'IZ,#`U8CAF.60`>GHP8C@S860S90!Z>C`P,&(W,#4R`'IZ,#`P-6(V8C(`
+M>GHP-6(W9C$Q-`!Z>C`T864P,S%F`'IZ,#`U-#=F960`>GHP,&(W,3<W9`!Z
+M>C`P,F1B83DR`'IZ,#)D8C%A8C(`>GHP,#`U8C8R,@!Z>C!B-CEB,#=C`&%T
+M:%]H86Q?9G)E90!Z>C`R9&)E8F)D`'IZ,&(U93,Q-3(`>GHP,39D9F)F,0!A
+M=&A?:&%L7VUH>C)I965E`'IZ,#$V93$X.6(`>GHP,F1B,S,U9`!Z>C!B-F,U
+M,V$T`'IZ,&(V9F0S-C,`>GHP9&,R,60S80!Z>C`P8C<Q-S-D`'IZ,#$V9#ED
+M-#$`>GHP,#5B.&%B9`!Z>C`R9&(S.#<U`'IZ,#$V93,P.6(`>GHP,#5B-C!B
+M,@!Z>C`P8C<P,38Q`'IZ,#9D.61D.3,`>GHP,#$V9&4W,@!Z>C!D8C-E9#@V
+M`'IZ,#`U8C0X960`>GHP,#)D8F,T,@!Z>C`P-6(W9C)E`'IZ,#)D8F9D9F0`
+M>GHP,39E-C0X80!Z>C`P,F1A9F8R`'IZ,#$V9&$Y,C``>GHP-6(W.#%E,`!Z
+M>C`P,F1C83!B`'IZ,#!B-S!A-V$`>GHP9F%C,&,Y8@!A=&A?:&%L7V%D9&ET
+M:6]N86Q?<W=B85]B86-K;V9F`&%T:%]H86Q?=F5R<VEO;@!Z>C`R9&)A8S)E
+M`'IZ,&(V8V8P,#D`>GHP,#$V93$R8P!Z>C`P,#)D865A`'IZ,#9D9F1D.3,`
+M871H7VAA;%]M86QL;V,`>GHP,F1D.3)A9`!Z>C`Q-F1B,C4Q`'IZ,&4Q,#=C
+M83$`>GHP,F1C,3<V,P!Z>C!B-CDP9#9D`'IZ,#$V9&8P-3$`>GHP,&(W,#9B
+M8P!Z>C`P,39D.#<R`'IZ,&0Q-&0Q8C``>GHP8C0X,#,Q90!Z>C`P,&(V9F8X
+M`&%T:%]H86Q?;65M8W!Y`'IZ,#$V9&$P9&0`>GHP,F1B,C@U,0!Z>C`V9&(P
+M8V8R`&%T:%]H86Q?<')O8F4`871H7VAA;%]B=6EL9&]P=',`>GHP9&%D8S8R
+M8P!Z>C`P,&(V8S$P`'IZ,&(W,C%A960`>GHP-C=C9F-A90!Z>C`P,&(V8V8X
+M`'IZ,#5B.3)A960`>GHP8C9D.65F9@!Z>C`R9&)F9F(Q`'IZ,&(U93,Q-C``
+M>GHP8C@Q96$Y-`!Z>C`Q-F1E8S%F`'IZ,&4X.30Y,#<`>GHP,&(V96$W80!Z
+M>C`S,V4X9F)F`'IZ,&-F834X-S4`>GHP,F1B.3EA90!Z>C`P,#5B-V(R`'IZ
+M,&1E-C@S-V8`>GHP8C<P.60P,@!Z>C`V-V0R-64R`'IZ,#$Y9C-A,#$`>GHP
+M-S`S.30W8@!A=&A?:&%L7VUE;7IE<F\`>GHP,39E,&)F90!Z>C`Q-F4R9&9D
+M`'IZ,#9F96%F-C``871H7VAA;%]S=U]B96%C;VY?<F5S<&]N<V5?=&EM90!Z
+M>C`Y9C8T8C9A`'IZ,&(V.3<S8F,`>GHP,#5B.#AF9`!A=&A?:&%L7V1E;&%Y
+M`'IZ,#!B-S(Q-C$`>GHP,39D9C(U,0!Z>C`V-V0R9C0Q`'IZ,#)D8C-D9F0`
+M>GHP,F1B-3-E9`!Z>C`Q-F1C96%E`'IZ,#`P8C9E,C(`>GHP-6(X,#`T,0!Z
+M>C`P,#)D8S4R`'IZ,#`U8C1A,F0`>GHP,#!B-F4U,@!Z>C`V-V0P8S0W`'IZ
+M,&1B8F5D.#8`>GHP-6(V8S9D8@!Z>C!C,S$U96(U`'IZ,#9D-#`V93``>GHP
+M,#)D9#@V9`!Z>C`P,39E,31D`'IZ,#`V-V0R,C$`>GHP,#5B.#DS9`!Z>C`U
+M8C@Q8C%B`'IZ,#`P8C9C93@`>GHP8C=F-3!B.`!Z>C`S,V5B9F)F`'IZ,&(X
+M,F1E-F0`>GHP,#$V9#<S,@!Z>C!F-#5E-F4S`&%T:%]H86Q?:6YI=%]C:&%N
+M;F5L<P!Z>C`P8C9D-F)C`'IZ,#`P8C<P,C(`>GHP,#`R9&)D,@!Z>C!D830X
+M-&$Q`'IZ,&$V,&0Q-#4`>GHP,39E,3(U,0!Z>C!D8S9A-6,U`'IZ,#$V938Y
+M,60`>GHP,F1B9C,U9`!Z>C`P,39D.#,R`'IZ,#$V934R-3$`>GHP,F1B-3<P
+M80!Z>C`P-6(V9#=A`'IZ,#`R9&(R.3(`>GHP,#5B.3!C8@!Z>C`U8C=C8F0U
+M`'IZ,#`U8C5C-#8`>GHP,#!B-F8Q9`!Z>C`P,39D830X`'IZ,&(V-C,Q83@`
+M871H7VAA;%]G971W:7)E;&5S<VUO9&5S`'IZ,#$V93%B.#<````````(```"
+M!0```!````(&````B````@4```"0```"!@```,0```(%````S````@8```#T
+M```"!0```/P```(&```!/````@4```%$```"!@```4P```(%```!5````@8`
+M``%@```"!0```+0```(%```!:````@8```%L```"!0```$P```(%```!=```
+M`@8```%X```"!0```'@```(%```!@````@8```&$```"!0```1@```(%````
+M-````@4```&,```"!@```=````$%```!U````08```)<``"5!0```@P``)4%
+M```"9```E08```*P``"5!0```K0``)4&```"S```1`4```+0``!$!@```Y``
+M`*,%```#E```HP8```=\``!K!0``!X```&L&```(I```:P4```BH``!K!@``
+M":```)D%```)I```F08```FP```"!0``";0```(&```)R````@4```G,```"
+M!@``"?P``)D%```*````F08```H,```"!0``"A````(&```*.````@4```H\
+M```"!@``"M0``#H%```*V```.@8```NL```"!0``"[````(&```/_````04`
+M`!`````!!@``$L@``(@%```2S```B`8``!+L``"9!0``$O```)D&```3%```
+M`@4``!,8```"!@``$[````(%```3M````@8``!/0``"9!0``$]0``)D&```5
+M4````@4``!58```"!@``%5P```(%```58````@8``!B8```!!0``&)P```$&
+M```9+```<P4``!DP``!S!@``'8````$%```=J````08``![```";!0``'?P`
+M`)L%```>Q```FP8``"%H```!!0``(6P```$&```AG````04``"&@```!!@``
+M(A@``$T%```B'```308``"-P```!!0``(W0```$&```C?````04``".````!
+M!@``)$0```$%```CK````04``"1(```!!@``+3P``',%```M0```<P8``"UD
+M``";!0``+6@``)L&```MC````04``"V0```!!@``+;P```$%```MP````08`
+M`"W0```!!0``+=0```$&```N&```FP4``"X<``";!@``+D0```$%```N2```
+M`08``"YT```!!0``+G@```$&```NB````04``"Z,```!!@``+M```)L%```N
+MU```FP8``"[\```!!0``+P````$&```O+````04``"\P```!!@``+T````$%
+M```O1````08``"]H``!-!0``+VP``$T&```O[````04``"_P```!!@``,"``
+M``$%```P)````08``##4```!!0``,-@```$&```T%````04``#08```!!@``
+M-'0```$%```T>````08``#E,```!!0``.5````$&```Y5````04``#E8```!
+M!@``.F@```(%```Z;````@8``#I\```"!0``.H````(&```\-````04``#PX
+M```!!@``2%P```$%``!(8````08``$AT```!!0``2'@```$&``!(C````04`
+M`$B0```!!@``2*0```$%``!(J````08``$B\```!!0``2,````$&``!)"```
+M`04``$D,```!!@``2;@```$%``!)O````08``$G<```#!0``2>````,&``!*
+M&````P4``$H<```#!@``2FP```$%``!*<````08``$JX```#!0``2KP```,&
+M``!+G````04``$N@```!!@``2_````$%``!+]````08``$P(```!!0``3`P`
+M``$&``!,*````04``$PL```!!@``3&P```$%``!,<````08``$SP```#!0``
+M3/0```,&``!-.````04``$T\```!!@``35@```$%``!-7````08``$UT```#
+M!0``37@```,&``!-V````P4``$W<```#!@``3>```'\%``!-Y```?P8``$XX
+M```#!0``3D````,&``!.T````04``$[4```!!@``3T0```$%``!.[````04`
+M`$[P```!!@``3P@```$%``!/#````08``$]0```#!0``3U0```,&``!/O```
+M`P4``$_````#!@``3\0```,%``!/R````P8``%!<```!!0``4&````$&``!2
+M*````04``%(L```!!@``4D````$%``!21````08``%)@```!!0``4F0```$&
+M``!2A````04``%)<```!!0``4H@```$&``!2E````04``%*8```!!@``4K``
+M``$%``!2M````08``%+0```!!0``4M0```$&``!3.````04``%-````!!@``
+M4Y0```(%``!3F````@8``%.<```"!0``5[0```(%``!3H````@8``%1,```#
+M!0``5&````,&``!4?````P4``%2````#!@``5)@```,%``!4G````P8``%0\
+M```#!0``5+@```,&``!4U````P4``%38```#!@``5!@```,%``!4]````P8`
+M`%4$```!!0``50@```$&``!5)````04``%4H```!!@``55````$%``!55```
+M`08``%8<``";!0``5B```)L&``!7N````@4``%>\```"!@``5]P```$%``!7
+MX````08``%?P```!!0``5_@```$&``!:?```B`4``%G4``"(!0``6=@``(@&
+M``!:3````04``%I0```!!@``6MP``(@%``!:X```B`8``%M0``"(!0``6U0`
+M`(@&``!<]````04``%SX```!!@``7;P```$%``!=B````04``%UP```!!0``
+M730```$%``!=$````04``%V0```!!@``79@```$%``!=H````08``%W,```!
+M!0``7=````$&``!>+````P4``%XT```#!@``7C@```,%``!>/````P8``%Y`
+M```#!0``7D0```,&``!>2````04``%Y,```!!@``7P@```,%``!?$````P8`
+M`%\4```#!0``7Q@```,&``!?'````P4``%\@```#!@``7R0```$%``!?*```
+M`08``%_$```!!0``7\@```$&``!?]````04``%_X```!!@``8`P```$%``!@
+M$````08``&,H```>!0``8RP``!X&``!D,```9@4``&0T``!F!@``9)P``'\%
+M``!DH```?P8``&2D```"!0``9*@```(&``!E(````@4``&4D```"!@``960`
+M``(%``!E:````@8``&5L```"!0``97````(&``!E=````@4``&5X```"!@``
+M9@0``',%``!F"```<P8``&8T```9!0``9C@``!D&``!F4```Q04``&94``#%
+M!@``9L0```$%``!FR````08``&;<``#-!0``9NP``,T&``!G2````04``&=,
+M```!!@``9U@``!(%``!G1```$@4``&<T```2!0``9UP``!(&``!H$```*`4`
+M`&@4```H!@``;&0``,P%``!J'```S`4``&E\``#,!0``:6P``,P%``!I7```
+MS`4``&E$``#,!0``:8```,P&``!J+```S`4``&HP``#,!@``:EP``,P%``!J
+M8```S`8``&J8``#,!0``:IP``,P&``!JX```S`4``&KD``#,!@``:V@```(%
+M``!K;````@8``&MT```"!0``:W@```(&``!KT```Q`4``&O4``#$!@``;'P`
+M`*,%``!L@```HP8``&R,```H!0``;)```"@&``!LM```HP4``&RX``"C!@``
+M;.```,P%``!LY```S`8``&T4``"A!0``;1@``*$&``!ML```R04``&VX``#)
+M!@``;;P``+T%``!MP```O08``&WD``"6!0``;>@``)8&``!N````S`4``&X$
+M``#,!@``;F@```$%``!N>````08``&ZD``!+!0``;J@``$L&``!N^```0`4`
+M`&[\``!`!@``;QP``"D%``!O(```*08``&\L``#%!0``;S```,4&``!O1```
+MF`4``&](``"8!@``;U@``$T%``!O7```308``')\``"C!0``<H```*,&``!X
+M:```8@4``'AL``!B!@``>)0``,X%``!XF```S@8``'B0```!!0``>*0```$&
+M``!Y+```8@4``'DP``!B!@``>=P``"`%``!YK```(`4``'G@```@!@``>?``
+M`)\%``!Y]```GP8``'H<``!5!0``>B```%4&``!\G```+`4``'R@```L!@``
+M?X0``'<%``!_B```=P8``(NL```"!0``B[````(&``"55```G@4``)`4``">
+M!0``CAP``)X%``"0&```G@8``)@P``">!0``F#0``)X&``"8?```?P4``)B`
+M``!_!@``F*@``'\%``"8K```?P8``)C8``!_!0``F-P``'\&``"9%```?P4`
+M`)D8``!_!@``FPP```(%``";$````@8``)N$``!_!0``FX@``'\&``"?'```
+M"@4``)\@```*!@``GV@``!@%``"?;```&`8``)^4``"V!0``GY@``+8&``"?
+MW```&`4``)_@```8!@``H!@``!@%``"@'```&`8``*!$``"V!0``H$@``+8&
+M``"@L```&`4``*"T```8!@``H6P``!@%``"A<```&`8``*&8``"V!0``H9P`
+M`+8&``"B%```&`4``*(8```8!@``HJP``+8%``"BL```M@8``*.H```7!0``
+MHZP``!<&``"D````#P4``*0$```/!@``J)@```\%``"HG```#P8``*J(```"
+M!0``JI````(&``"JH````@4``*JD```"!@``JL@```(%``"JS````@8``*L,
+M```"!0``JQ````(&``"MB```3P4``*V<``!/!@``K<0```(%``"MR````@8`
+M`*X@``"3!0``KB0``),&``"N9````@4``*YH```"!@``L!P```(%``"P(```
+M`@8``+`L``!<!0``L#```%P&``"PC```$P4``+"0```3!@``L+P``*8%``"P
+MP```I@8``+&$``"C!0``L8@``*,&``"QH```HP4``+&D``"C!@``M%P```$%
+M``"T=````08``+2(```!!0``M(P```$&``"TH````04``+2D```!!@``M:0`
+M`!P%``"UJ```'`8``+8H``!X!0``M<P``'@&``"UX```?04``+7H``!]!@``
+MM>P``&$%``"U]```808``+7X``"M!0``M@```*T&``"V!```=`4``+8,``!T
+M!@``MA````X%``"V&```#@8``+8<``"T!0``MB0``+0&``"UQ```>`4``+8P
+M``!X!@``MC0``'T%``"V.```?08``+8\``"@!0``MD```*`&``"VL```+`4`
+M`+:T```L!@``MP0``!\%``"W"```'P8``+<4``![!0``MQ@``'L&``"W6```
+M3`4``+=<``!,!@``NP0``%0%``"["```5`8``+PX``#%!0``O!P``,4%``"\
+M/```Q08``+Q8``"(!0``O%P``(@&``#7E```<04``->(``!Q!0``O,0``'$%
+M``"\R```<08``+S8``![!0``O-P``'L&``"]?```"04``+V````)!@``OG@`
+M`#<%``"^?```-P8``+Z,```N!0``OI```"X&``"^G```S04``+Z@``#-!@``
+MOZ@```(%``"_K````@8``,!H``"C!0``P&P``*,&``#`C````@4``,"0```"
+M!@``P5@``*,%``#!7```HP8``,&<``"/!0``P:```(\&``##=```-`4``,-L
+M```T!0``PSP``#0%``##+```-`4``,-X```T!@``PZP``*D%``##L```J08`
+M`,0X``!6!0``Q#P``%8&``#0:```C`4``,1,``",!0``Q"0``(P%``#$4```
+MC`8``,1@``"K!0``Q&0``*L&``#%!```%P4``,4(```7!@``QN@``&,%``#&
+M[```8P8``,<$```A!0``QP@``"$&``#''```-@4``,<@```V!@``R````*,%
+M``#("```HP8``,@L``"C!0``R#0``*,&``#(2```HP8``,B(``"C!0``R(P`
+M`*,&``#)3```,`4``,E0```P!@``R?```%(%``#)]```4@8``,ID``!G!0``
+MRF@``&<&``#*=```+`4``,IX```L!@``RI```%D%``#*E```608``,M(``"0
+M!0``RTP``)`&``#,G```)P4``,R@```G!@``S+@``!T%``#,O```'08``,S4
+M```J!0``S-@``"H&``#-8```*P4``,UD```K!@``S7P``+4%``#-@```M08`
+M`,[$``"(!0``SL@``(@&``#.W```U04``,[@``#5!@``ST```*,%``#/1```
+MHP8``,^```!C!0``SX0``&,&``#/Y```HP4``,_H``"C!@``S_0``#0%``#/
+M^```-`8``-!\``!6!0``T(```%8&``#0D```C`4``-"4``",!@``T0P``"L%
+M``#1$```*P8``-$H``"U!0``T2P``+4&``#21````04``-)(```!!@``TG``
+M`,4%``#2=```Q08``-*,```!!0``TI````$&``#2R````04``-+,```!!@``
+MTN```,4%``#2Y```Q08``-+\```!!0``TP````$&``#5````HP4``-4$``"C
+M!@``U2P``*,%``#5,```HP8``-6@``"(!0``U:0``(@&``#7U```<04``-?8
+M``!Q!@``V(0```$%``#8<````04``-B(```!!@``V7```*,%``#9=```HP8`
+M`-F0```L!0``V90``"P&``#9^```Q04``-G\``#%!@``VQP``#L%``#;(```
+M.P8``-LP```!!0``VS0```$&``#<M```'@4``-RX```>!@``X(@```H%``#@
+MC```"@8``.+X``!N!0``XOP``&X&``#L\```-`4``.ST```T!@``[3P``)L%
+M``#M0```FP8``.V0```"!0``[90```(&``#MR````04``.W,```!!@``[R``
+M``$%``#O)````08``/'L```-!0``\?````T&``#R6````04``/)<```!!@``
+M\Q0```$%``#S&````08``/.0``"0!0``\Y0``)`&``#SS````04``//0```!
+M!@``\_0```$%``#S^````08``/8\```!!0``]D````$&``#X1````@4``/A(
+M```"!@``^'0```$%``#X>````08``/E(``!_!0``^4P``'\&``#[0```LP4`
+M`/M$``"S!@``_0@``+,%``#]#```LP8``/VD```!!0``_:@```$&``#_/```
+M`@4``/]````"!@``_X````(%``#_A````@8``/_X```!!0``__P```$&``$`
+M4````04``0!4```!!@`!`<P```$%``$!T````08``0(````!!0`!`@0```$&
+M``$"&````04``0(<```!!@`!`C````$%``$"-````08``0*\```"!0`!`L0`
+M``(&``$"R````@4``0+,```"!@`!!(P```$%``$$D````08``05T```>!0`!
+M!7@``!X&``$&;```-04``09P```U!@`!!I```#4%``$&E```-08``0:\```U
+M!@`!!MP``#H%``$&X```.@8``0?<```U!0`!!^```#4&``$(````.@4``0@$
+M```Z!@`!"JP``'<%``$*L```=P8``0L4``!W!0`!"Q@``'<&``$+>```NP4`
+M`0M\``"[!@`!"\0``)(%``$+R```D@8``0TP``";!0`!#30``)L&``$-A```
+M,@4``0V(```R!@`!#L````$%``$.Q````08``15L``"?!0`!%70``)\&``$5
+M<```(`4``15X```@!@`!%8@``&P%``$5C```;`8``1?P```!!0`!%_0```$&
+M``$9P```U04``1G$``#5!@`!&QP``*,%``$9T```HP8``1GX``#5!0`!&?P`
+M`-4&``$:X```HP4``1KD``"C!@`!&Q0``-4%``$;&```U08``1G(``"C!0`!
+M&R0``*,&``$D````Q@4``20$``#&!@`!)(0``,8%``$DB```Q@8``250``#&
+M!0`!)50``,8&``$EH```FP4``26D``";!@`!)L```!\%``$FQ```'P8``2<L
+M``!,!0`!)S```$P&``$GC````@4``2>0```"!@`!+%0```(%``$L6````@8`
+M`2Q<```"!@`!+3@``$`%``$M/```0`8``2U(``#`!0`!+4P``,`&``$M7```
+M>@4``2U@``!Z!@`!+9```,`%``$ME```P`8``2VD``!Z!0`!+:@``'H&``$M
+MX```'P4``2WD```?!@`!+?@``,`&``$N!```>@4``2X(``!Z!@`!+P```,8%
+M``$O!```Q@8``2]D``!<!0`!+V@``%P&``$OD```7`4``2^4``!<!@`!+^P`
+M`%P%``$O\```7`8``3`P``!<!0`!,#0``%P&``$P5```7`4``3!8``!<!@`!
+M,6@``)D%``$P=```F08``3"8``!<!0`!,)P``%P&``$PN```7`4``3"\``!<
+M!@`!,2```%P%``$Q)```7`8``3%X``!<!0`!,7P``%P&``$P)```F04``3&8
+M``"9!@`!,;P``%P%``$QP```7`8``3(,```!!0`!,A````$&``$R>```7`4`
+M`3)\``!<!@`!,LP``,`%``$RT```P`8``3+<``!Z!0`!,N```'H&``$Z*```
+M`04``3GP```!!0`!-9P```$%``$R\````04``3+T```!!@`!,R```%P%``$S
+M)```7`8``3.$``!<!@`!,^```,`%``$SY```P`8``3/T``!Z!0`!,_@``'H&
+M``$T"````04``30,```!!@`!-$@```$%``$T3````08``318``#`!0`!-%P`
+M`,`&``$T:```>@4``31L``!Z!@`!--0``,8%``$TV```Q@8``35\```!!0`!
+M-8````$&``$UH````04``36D```!!@`!-;````$%``$UM````08``38D```!
+M!0`!-B@```$&``$V-````04``38X```!!@`!-H````$%``$VA````08``3:0
+M```!!0`!-I0```$&``$W"```7`4``3<,``!<!@`!-RP``%P%``$W,```7`8`
+M`3=0``!<!0`!-U0``%P&``$W=```7`8``3AD```!!0`!.&@```$&``$XC```
+M`04``3B0```!!@`!.+```,8%``$XM```Q@8``3H4```!!0`!.A@```$&``$Z
+M:````04``3IL```!!@`!.G@```$%``$Z?````08``3K````!!0`!.L0```$&
+M``$ZT````04``3K4```!!@`!/%@``&8%``$\7```9@8``3RL``!S!0`!/+``
+M`',&``$\W```&04``3S@```9!@`!//@``*P%``$\_```K`8``3T$``!!!0`!
+M/0@``$$&``$]$```I`4``3T4``"D!@`!/1P``)P%``$](```G`8``3TH```_
+M!0`!/2P``#\&``$]-```P04``3TX``#!!@`!/4```$,%``$]1```0P8``3U,
+M``!J!0`!/5```&H&``$]6```L`4``3U<``"P!@`!/60``,H%``$]:```R@8`
+M`3UP``"E!0`!/70``*4&``$]?```N@4``3V```"Z!@`!0"P``!0%``$_8```
+M%`4``3V(```4!0`!/8P``!0&``$]J```204``3VL``!)!@`!/P@``!(%``$_
+M#```$@8``3\\```H!0`!/T```"@&``$_F```%`4``3^<```4!@`!/^```!0%
+M``$_Y```%`8``4`0```4!0`!0!0``!0&``%!G```%`4``4`\```4!@`!0'``
+M`!0%``%`=```%`8``4#X```"!0`!0/P```(&``%!!````@4``4$(```"!@`!
+M06```,0%``%!9```Q`8``4&T``"C!0`!0;@``*,&``%!Q```*`4``4'(```H
+M!@`!0>P``*,%``%!\```HP8``4(8```4!0`!0AP``!0&``%"3```H04``4)0
+M``"A!@`!0IP``,D%``%"I```R08``4*H``"]!0`!0JP``+T&``%"T```E@4`
+M`4+4``"6!@`!0N````$%``%"Y````08``4+T```!!0`!0P0```$&``%#-```
+M2P4``4,X``!+!@`!0[```'\%``%#M```?P8``4DT``!W!0`!23@``'<&``%*
+M@```#P4``4J$```/!@`!3!P```\%``%,(```#P8``4U4```!!0`!36P```$&
+M``%-@````04``4V$```!!@`!39@```$%``%-G````08``4ZH``"(!0`!3HP`
+M`(@%``%.K```B`8``4\8``!Q!0`!3QP``'$&``%/O```"04``4_````)!@`!
+M4"0``,<%``%0*```QP8``5`X```N!0`!4#P``"X&``%02```204``5!,``!)
+M!@`!450```(%``%16````@8``5(4``"C!0`!4A@``*,&``%2.````@4``5(\
+M```"!@`!4P0``*,%``%3"```HP8``5-(``"/!0`!4TP``(\&``%5M```-`4`
+M`56<```T!0`!5;@``#0&``%5[```J04``57P``"I!@`!5G@``%8%``%6?```
+M5@8``5:,``",!0`!5F0``(P%``%6D```C`8``5:@``"K!0`!5J0``*L&``%7
+M1```%P4``5=(```7!@`!6(```&,%``%8A```8P8``5B<```A!0`!6*```"$&
+M``%8M```-@4``5BX```V!@`!6=0``*,%``%9W```HP8``5H```"C!0`!6@@`
+M`*,&``%C!```HP4``5H<``"C!@`!6EP``*,%``%:8```HP8``5L@```P!0`!
+M6R0``#`&``%;Q```4@4``5O(``!2!@`!7#@``&<%``%</```9P8``5Q(```L
+M!0`!7$P``"P&``%<9```(P4``5QH```C!@`!720``"<%``%=*```)P8``5U`
+M```=!0`!740``!T&``%=7```*@4``5U@```J!@`!7=```"L%``%=U```*P8`
+M`5WL``"U!0`!7?```+4&``%>5````04``5Y8```!!@`!7H```,H%``%>A```
+MR@8``5Z<```!!0`!7J````$&``%>V````04``5[<```!!@`!7O```,H%``%>
+M]```R@8``5\,```!!0`!7Q````$&``%@N```HP4``6"\``"C!@`!8.0``*,%
+M``%@Z```HP8``6%,``!?!0`!85```%\&``%C$```HP4``6,4``"C!@`!9%P`
+M``(%``%D8````@8``61H``"C!0`!9&P``*,&``%E1````@4``65(```"!@`!
+M95```*,%``%E5```HP8``67\```"!0`!9@````(&``%F"```HP4``68,``"C
+M!@`!9R```%$%``%G)```408``6=4```"!0`!9U@```(&``%GZ```'@4``6=@
+M```>!0`!9V0``!X&``%G]```'@4``6?X```>!@`!:"```!X%``%H)```'@8`
+M`6B\```"!0`!:,````(&``%JP````@4``6K$```"!@`!:Q```$4%``%K&```
+M108``6M(```"!0`!:TP```(&``%K_```HP4``6P```"C!@`!;"````(%``%L
+M)````@8``6PL``"C!0`!;#```*,&``%LS````@4``6S4```"!@`!;-P``*,%
+M``%LX```HP8``6VL```"!0`!;;0```(&``%MO```HP4``6W```"C!@`!;I0`
+M``(%``%NF````@8``6[T``!%!0`!;O@``$4&``%O*```104``6\L``!%!@`!
+M;Y````(%``%OE````@8``6^@``"C!0`!;Z0``*,&``%P<````@4``7!T```"
+M!@`!<*P``$4%``%PM```108``7%4```"!0`!<5@```(&``%Q9```HP4``7%H
+M``"C!@`!=`@``)L%``%T#```FP8``71H```!!0`!=&P```$&``%V(````04`
+M`78D```!!@`!=^P```$%``%W\````08``7@8``"S!0`!>!P``+,&``%X/```
+M`04``7A````!!@`!>'0```$%``%X>````08``7B\```!!0`!>,````$&``%Z
+M/```LP4``7I```"S!@`!>G```$T%``%Z=```308``7J,``!-!0`!>I```$T&
+M``%ZN````@4``7K````"!@`!>M````(%``%ZU````@8``7KX```"!0`!>OP`
+M``(&``%[*```<P4``7LL``!S!@`!>U@``',%``%[7```<P8``7N````!!0`!
+M>X0```$&``%[C````04``7N0```!!@`!>Y@```$%``%[G````08``7ND```!
+M!0`!>Z@```$&``%[L````04``7NT```!!@`!>[P```$%``%[P````08``7O(
+M```!!0`!>\P```$&``%[U````04``7O8```!!@`!?#P```(%``%\0````@8`
+M`7Q(``"C!0`!?$P``*,&``%])````@4``7TH```"!@`!?3```*,%``%]-```
+MHP8``7W<```"!0`!?>````(&``%]Z```HP4``7WL``"C!@`!?[@``!X%``%_
+MO```'@8``8!4```>!0`!@)@``!X&``&!%```'@4``8$8```>!@`!@9```!X%
+M``&!E```'@8``8($```>!0`!@@@``!X&``&"J````@4``8*L```"!@`!A)P`
+M``(%``&$H````@8``83,```"!0`!A-````(&``&%"````@4``84,```"!@`!
+MA4@```(%``&%3````@8``86,``!%!0`!A9```$4&``&&J```104``8:L``!%
+M!@`!AN@``$4%``&&[```108``8=P``!%!0`!AW0``$4&``&'\```104``8?T
+M``!%!@`!B'@```(%``&(?````@8``8C8``!%!0`!B-P``$4&``&(]```104`
+M`8CX``!%!@`!B6@```(%``&);````@8``8ET``"C!0`!B7@``*,&``&*)```
+M`@4``8HL```"!@`!BC@``*,%``&*/```HP8``8KX```"!0`!BP````(&``&+
+M"```HP4``8L,``"C!@`!B\@```(%``&+T````@8``8O<``"C!0`!B^```*,&
+M``&,J````@4``8RL```"!@`!C+@``*,%``&,O```HP8``8_````!!0`!C\0`
+M``$&``&/\```?P4``8_T``!_!@`!D(````$%``&0A````08``9$$```!!0`!
+MD0@```$&``&1A````04``9&(```!!@`!D@P```$%``&2$````08``9)D```!
+M!0`!DF@```$&``&2V````04``9+<```!!@`!DX0```$%``&3B````08``90L
+M```!!0`!E#````$&``&4'````04``91P```!!@`!EH@```$%``&6C````08`
+M`9HP``!-!0`!FC0``$T&``&:3```304``9I0``!-!@`!G!P```$%``&<(```
+M`08``9Q$```!!0`!G$@```$&``&='````04``9T@```!!@`!G;0```$%``&=
+MN````08``9XX```!!0`!GCP```$&``&>S```<P4``9[0``!S!@`!GOP``',%
+M``&?````<P8``9\L```!!0`!GS````$&``&?.````04``9\\```!!@`!GT0`
+M``$%``&?2````08``9]0```!!0`!GU0```$&``&?7````04``9]@```!!@`!
+MGV@```$%``&?;````08``9]T```!!0`!GW@```$&``&?@```%04``9^$```5
+M!@```,@```$"````S````0(```#0```!`@```-0```$"````V````0(```#<
+M```!`@```.````$"````Y````0(```#H```!`@```.P```$"````\````0(`
+M``#T```!`@```/@```$"````_````0(```$````!`@```00```$"```!"```
+M`0(```$,```!`@```1````$"```!%````0(```$8```!`@```1P```$"```!
+M(````0(```$D```!`@```2@```$"```!+````0(```$P```!`@```30```$"
+M```!.````0(```$\```!`@```4````$"```!1````0(```%(```!`@```4P`
+M``$"```!4````0(```)(```U`@```DP``$L"```"4```P@(```)4```\`@``
+M`E@``"D"```"7```>0(```)@``!H`@```F0``)<"```":```8@(```)L```Q
+M`@```G```%L"```"=```,@(```)X``"+`@```GP``+@"```"@```4@(```*$
+M``")`@```H@``'X"```"C```U0(```*0``#.`@```I0``&D"```"F```2`(`
+M``*<``"=`@```J```!H"```"I```MP(```*H``"Q`@```JP``$X"```"L```
+MN0(```*T```X`@```K@``*@"```"O```B@(```+```"'`@```L0```P"```"
+MR```O`(```+,``!'`@```M```'P"```"U```P`(```+8``!Z`@```MP``%<"
+M```"X```H@(```+D``"&`@```N@```L"```"[```6@(```+P```(`@```O0`
+M`%@"```"^```IP(```+\``!D`@```P```(`"```#!```)0(```,(``":`@``
+M`PP``%T"```#$```90(```,4``"4`@```Q@``"\"```#'```J@(```,@``"N
+M`@```R0``)$"```#*```T@(```,L```K`@```S```'`"```#-```8`(```,X
+M``#&`@```SP``"X"```#0```4P(```-$``#(`@```T@``%X"```#3```<@(`
+M``-0```G`@```U0``"T"```#6```'0(```-<```F`@```V```"0"```#9```
+M@0(```-H```J`@```VP``$H"```#<```(@(```-T```A`@```W@``!$"```#
+M?```0@(```.```"%`@```X0``#T"```#B```G@(```.,``#%`@```Y```'4"
+M```#E```KP(```.8``!5`@```YP``-`"```#H```C@(```.D``!V`@```Z@`
+M`!8"```#K```PP(```.P```^`@```[0``'<"```#N```;P(```.\``""`@``
+M`\```,P"```#R```E`(```/,```O`@```]```*H"```#U```K@(```/8``"1
+M`@```]P``-,"```#Y````0(``!3````!`@``%,0```$"```4R````0(``!3,
+M```!`@``%-````$"```4U````0(``!4P```!`@``%30```$"```5.````0(`
+M`!4\```!`@``%4````$"```51````0(``!5(```!`@``%4P```$"```54```
+M`0(``!54```!`@``%5@```$"```57````0(``!5@```!`@``%60```$"```5
+M:````0(``!5L```!`@``%7````$"```5=````0(``!5X```!`@``%7P```$"
+M```5@````0(``!6$```!`@``%8@```$"```5C````0(``!60```!`@``%90`
+M``$"```5F````0(``!6<```!`@``%:````$"```5J````0(``!6L```!`@``
+M%;````$"```5M````0(``!6X```!`@``%=@```$"```5W````0(``!7@```!
+M`@``%>0```$"```5Z````0(``!7L```!`@``%?````$"```5]````0(``!7X
+M```!`@``%?P```$"```6`````0(``!8$```!`@``%@@```$"```6#````0(`
+M`!80```!`@``%A0```$"```6&````0(``!8<```!`@``%B````$"```6)```
+M`0(``!8H```!`@``%BP```$"```6,````0(``!8T```!`@``%C@```$"```6
+M/````0(``!9````!`@``%D0```$"```AX````0(``"'D```!`@``(>@```$"
+M```A[````0(``"'P```!`@``(?0```$"```A^````0(``#=P```!`@``-W0`
+M``$"```W>````0(``#=\```!`@``-X````$"```WA````0(``#>(```!`@``
+M-XP```$"``!#F````0(``$.<```!`@``0Z````$"``!#I````0(``$.H```!
+M`@``0ZP```$"``!#L````0(````,```"`@```!````("````%````@(````8
+,```"`@```!P```("
+`
+end
diff --git a/sys/contrib/dev/ath/public/ap30.inc b/sys/contrib/dev/ath/public/ap30.inc
new file mode 100644
index 0000000..76675f2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap30.inc
@@ -0,0 +1,69 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/mipsisa32-be-elf.inc#1 $
+#
+
+#
+# Configuration for building big-endian MIPS2 for the AP30 SoC
+# using the 5.01 linux-mips.org toolchain (manually moved to
+# /pub/gnu from /pub/gnu/local where rpm --prefix=/pub/gnu
+# bogusly installs them).
+#
+
+#
+# http://www.linux-mips.org/toolchain.html
+#
+# /pub/gnu/bin/mips-linux-gcc -v
+# Reading specs from /pub/gnu/bin/../lib/gcc-lib/mips-linux/2.96-mips3264-000710/specs
+# gcc version 2.96-mips3264-000710
+# /pub/gnu/bin/mips-linux-as -v
+# GNU assembler version 2.12.90.0.7 (mips-linux) using BFD version 2.12.90.0.7 20020423
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/mips-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -G 0 -EB -mno-abicalls -fno-pic -mips32 -Wa,--trap \
+ -fno-strict-aliasing -fno-common -fomit-frame-pointer -mlong-calls
diff --git a/sys/contrib/dev/ath/public/ap30.opt_ah.h b/sys/contrib/dev/ath/public/ap30.opt_ah.h
new file mode 100644
index 0000000..b6afe1f
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap30.opt_ah.h
@@ -0,0 +1,5 @@
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_AR5312 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_NEED_DESC_SWAP 1
diff --git a/sys/contrib/dev/ath/public/ap43.hal.o.uu b/sys/contrib/dev/ath/public/ap43.hal.o.uu
new file mode 100644
index 0000000..5f6d913
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap43.hal.o.uu
@@ -0,0 +1,3648 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/COPYRIGHT#1 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`0`````````````!``@````!`````````````C!<8``0`0`T````
+M```H`!$`#N#_/_P```````````````````````!__P`````PA/__)`,`6#P"
+M```0@P!A)$(`A"B"`%D00``E)`(1!RB"`!P00``3)`(`4BB"`!H00`!5/`(`
+M`"B"`!,00``))`(`$RB"`!$00`!)/`(``"0"``<0@@!"``````/@``@``!`E
+M$((`1P`````#X``(```0)1""`$$\`@``*((`4Q!```8D`P`</`(``!"#`$$D
+M0@"8`^``"```$"4D`@!7$((`-0`````#X``(```0)1""`"P\`@``*((1"!!`
+M`!0D`P"1/`(``!"#`#(D0@!P*((`DA!```HD`A`4*((`B!!``"P``!`E*((`
+MAA1``"@`````/`(```/@``@D0@!<$((`(``````#X``(```0)20"$1,0@@`<
+M/`(``"B"$1000``&-`/P$R0"$1(0@@`/``````/@``@``!`E/`(``!"#`!0D
+M0@`T-`/Q&SP"```0@P`0)$(`(`/@``@``!`E/`(```/@``@D0@``/`(```/@
+M``@D0@`0/`(```/@``@D0@!(/`(```/@``@D0@"L```0)0/@``@`````)[W_
+MZ*^_`!`PA/__.(,6C"QC``$X@J<G+$(``0!B&"448``$,*7__R0#$+<4@P`%
+M```0)3P"```D0@```$#X"0"@("6/OP`0`^``"">]`!@GO?_@K[\`&#"$__\H
+M@@"($$``&H^H`#`H@@"&$$``*CP"```H@@`=$$``""0"`%(H@@`:$$``*20"
+M`!,0@@`H```8)1```"TD`@`!$((`'2B"`%(40``H```8)2B"`%D00``F)`(`
+M`2B"`%<40``B/`(``!```!4D0@``)`(1$Q""`!<H@A$4$$``"#0"\!,D`@"1
+M$((`"R0"$!00@@`/```8)1```!4D`@`!$((`##0"_QD0@@`)```8)1````\D
+M`@`!/`(``"1"````0/@)KZ@`$!````H`0!@E)`0`$SP"```D0@```$#X":^H
+M`!`0```#`$`8)20"``&M`@``$&``$`!@$"648@'(I&(`")1B`<JD8@`*C&(!
+MS*QB`!R48@'0I&(`()1B`=*D8@`BE&(!U*1B`"248@'6I&(`)@!@$"6/OP`8
+M`^``"">]`""LA0'8`^``""0"``$GO?^PK[\`2*^W`$2OM@!`K[4`/*^T`#BO
+MLP`TK[(`,*^Q`"ROL``H`("H)0"@D"4`P*`E`."8)0``B"4F0L``+%80`">P
+M`"`\`@``)%<``!+``!0`````CJ(`%`!2$"&,0@``KZ(`().C`""2`@`!``(2
+M``!B&"62`@`"``(4``!B&"62`@`#``(6``!B&"4`=!@D$',`#R0"``$0```'
+M`````(ZB`!0`4A`AC$(```*"$"004P`')`(``0+@^`DD!``*)C$``2HB`^@4
+M0/_@```0)8^_`$B/MP!$C[8`0(^U`#R/M``XC[,`-(^R`#"/L0`LC[``*`/@
+M``@GO0!0```P)1"@``@``!@E``,00#"#``$`0Q@E),8``0#%$"L40/_Z``0@
+M0@/@``@`8!`ECZD`$##G__\`!Q!``$<0(0`"$(``11`AE$@`)A$``(P``!`E
+M``<00`!'$"$``A"``$40(9!#`"4D`@`"$&(`(BAB``,00``%)`(``Q!@``H`
+M`!`E`^``"#!"__\08@!9``@0P"0"``008@!F/`,08A```'8``!`E$2``""0$
+M`,``!Q!``$<0(0`"$(``11`AD$,`*20"`&``0R`+``8PP"0"`^APPA`"`$@`
+M&P``$!(5```"```````'``T`@A`A$```8B1"``J,@A(T$$``+`````"40@`"
+M,$*``!!``!$`"!$`/`,08C1C3=,`0P`9```0$``"(8(`!C#``,00(21"`!4`
+M1``;```0$A2```(```````<`#0`"$0`0``!+)$(`D(R$$C00@``6``@0@)2"
+M``(P0D``$$``$3P#$&(`"!#`-&--TP!#`!D``!`0``(A@@`&,,``Q!`A)$(`
+M%0!$`!L``!`2%(```@``````!P`-``(0P!```#0D0@!(``@0@#P#$&(T8TW3
+M`$,`&0``$!```B&"``8PP`#$$"$D0@`5`$0`&P``$!(4@``"```````'``T`
+M`A"`$```(R1"`"0\`Q!B-&--TP!#`!D``!`0``(A@@`&,,``Q!`A)$(`%0!$
+M`!L``!`2%(```@``````!P`-``(0@!```!,D0@`6``@0@#1C3=,`0P`9```0
+M$``"(8(`!C#``,00(21"`!4`1``;```0$A2```(```````<`#0`"$(`M!`/H
+M)$,`O21"`%P`9!`+,$+__P/@``@`````E*,``C!C`"`48``3)`(``I2C``(P
+M8P#0)`0`P!!D``XD`@`#E*,``C!C`-`D!`#0$&0`"20"``24HP`",&,`$!1@
+M``4D`@`!E*,``C!C"``D`@`%``,0"@/@``@`````)[W_X*^_`!BOL0`4K[``
+M$`"`."4`P(@E,B(`@!!```D`H(`E)`,)M!(#`(8D`@`.+@()M!!``'PF`_:9
+M$```/SP"9F8R(@$`$$``-#P"```D0@```$#X"0#@("400``A,B(!0"8"[+,L
+M0@`Q$$``'3(B`4``$!"``%`0(0`".$`\!,S,-(3,S0($`!D``!`0``(0@@`"
+M&(``8A@A)@7__CP"__\T0C\-`.(P(0#$`!D``"`0$&4`"0`$,((\`O__-$(_
+M"`#B,"$\`LS,-$+,S0#"`!D``!`0``(P@A```%D`P!`E+@03B0`"(`HF`O!@
+M/`/,S#1CS,T`0P`9```0$!2``%```A"")@+L>`!#`!D``!`0$```2P`"$((D
+M`PFT$@,`2"0"``XN`@FT$$``"BX#$X@F`_:9/`)F9C1"9F<`8@`8```0$``"
+M$$,``Q_#$```/`!#$",F`NQX/`3,S#2$S,T`1``9```0$!!@`#4``A""/`(`
+M`"1"````0/@)`.`@)1!``"$N`Q,E)@+LLRQ"`#$00``>)@+P8``0$(``4!`A
+M``(X0#P$S,PTA,S-`@0`&0``$!```A""``(8@`!B&"$F!?_^/`+__S1"/PT`
+MXC`A`,0`&0``(!`090`)``0P@CP"__\T0C\(`.(P(3P"S,PT0LS-`,(`&0``
+M$!```C""$```#P#`$"4F`O!@/`3,S#2$S,T`1``9```0$!!@``@``A"")@+V
+M,#P#S,PT8\S-`$,`&0``$!```A$")$(`#X^_`!B/L0`4C[``$`/@``@GO0`@
+M)[W_Z*^_`!2OL``0`*"`)8R%$C00H``*/`(``"1"````0/@)`````#P#```D
+M8P"\`$,0(9!"```0```$<@(0`CP"``"00@"^<@(0`H^_`!2/L``0`^``"">]
+M`!@GO?_HK[\`%*^P`!``H(`EC(42-!"@``\\`@``)$(```!`^`D`````/`,`
+M`"1C`+P`0Q`AD$,```(#`!L``!`2%&```@``````!P`-$```"8^_`!0\`@``
+MD$,`O@(#`!L``!`2%&```@``````!P`-C[\`%(^P`!`#X``()[T`&">]_\"O
+MOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`*"8)9)B
+M``040``U`("P)0``D"4F8P`$)`0`_P!R$"&@1```)E(``2I"`"`40/_\`'(0
+M(8YB```80``I``"0)29T``0\`@``)%4``"0>``$F=P`&`!*`0`(2@"$`$("`
+M)@,`(`)C&"&09``(D'$`"P*$$"&@4@``D&(`"0!$$"4"@A`AH%(``*^@`!`"
+MP"`E`F`H)20&``X"H/@)`B`X)280`"@"D!@AI&(``*^^`!`"P"`E`F`H)20&
+M``X"H/@)`B`X)0+P@"&F`@``)E(``8YB```"0A`J%$#_WP`2@$"/OP`\C[X`
+M.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`LH@`C
+M$$``EB2(`>`\`@``)$(`R``%&(``8A@AC&(```!```@`````E((""*SB```#
+MX``(```0)0/@``@D`@`-`^``""0"``V-`@````(1PCA"``$#X``(,$(``0/@
+M``@D`@`-`^``""0"``V5`@`*K.(```/@``@``!`EE0(`"*SB```#X``(```0
+M)8T#```P8T``)`(`#0/@``@``Q`+C0,``#!C@``D`@`-`^``"``#$`J-`P``
+M/`(@``!B&"0D`@`-`^``"``#$`N-`P``/`(0``!B&"0D`@`-`^``"``#$`N-
+M`P``/`((``!B&"0D`@`-`^``"``#$`N,@@'XK.(```/@``@``!`E)`(``1#"
+M``L`````$,``4@``$"4D`@`"$,(`"@`````D`@`#$,(`"P`````#X``()`(`
+M#82"`?RLX@```^``"```$"64@@'^K.(```/@``@``!`EC(("`*SB```#X``(
+M```0)8T#```P8R``)`(`#0/@``@``Q`+C0,``#!C$``D`@`-`^``"``#$`L#
+MX``()`(`#8T#```\`@"``&(8)"0"``T#X``(``,0"XT#```P8P0`)`(`#0/@
+M``@``Q`+C0,``#!C`@`D`@`-`^``"``#$`LD`@`!$,(`#``````0P``&)`(`
+M#20"``(0P@`+``````/@``@D`@`-C0,``#!C`0`#X``(``,0"XR#$DPD`@`-
+M`^``"``#$`N4@A)(K.(```/@``@``!`E`^``""0"``V,@Q)H)`(`#0/@``@`
+M`Q`+C0(`%*SB```#X``(```0)20"``P#X``(`````"0"`!D0H@`3CZ,`$"RB
+M`!H00``&)`(`'B0"``\0H@`')`(``Q```!P`````$*(`%P`````0```8````
+M`!3"`!8LX@`%$$``%"0"``$#X``(K(<"`"0"``$0P@`&``<0*R0"``(0P@`&
+M`````!````H`````K((23`/@``@D`@`!I(<22`/@``@D`@`!K(<2:`/@``@D
+M`@`!$&```P`````D`@`,K&(```/@``@``!`E)[W_Z`#`2"4LX@`(%$``+0``
+M:"4GJ@`0``T0@`!%$"&42```E$P``@`(%```3!`EK2(``"4I``0DY__\`2!8
+M)24"P``L0A``$$``$"4I``2,@@`4`$@0(8Q"``"OH@`0DZ,`$)%"``$``A(`
+M`&(8)9%"``(``A0``&(8)9%"``,``A8`$```!`!B$"6,@@`4`$@0(8Q"``"M
+M8@``)0@`!"3G__P!B!@K+.(`!#A"``$``Q`+%$#_X2SB``@00/_6):T``0$F
+M$",#X``()[T`&">]_^BOOP`4K[``$(^C`"@D`@`-$*(`%H^P`"PHH@`.$$``
+M!0`````0H``+`````!```"L``!`E)`(`'1"B`!4D@A)0)`(`'A"B`!<``!`E
+M$```)(^_`!0D@@'(K&(``"0"`!"N`@``$```'20"``$\`@``)$(.O`#`*"6,
+M9@```$#X"8X'``"N`@``$```%"0"``&L8@``)`(`&*X"```0```/)`(``13@
+M``<`````)`(`!*X"``",8P``C(("!!````:L8@``)`,`!!3C``0``!`EC,(`
+M`*R"`@0D`@`!C[\`%(^P`!`#X``()[T`&(RC``008`!G```0)8S"``"LH@``
+MC,(`!*RB``B,P@`(K*(`#(S"``RLH@`0C,0`$"0"__\0@@`%+(,!`"0"`/\`
+M@Q`+$````ZRB`!0D`@`"K*(`%(S#`!0D`O__$&(`$@!@("4L@P0!)`($``!#
+M(`HD`@`!K*(`&`!$$"L00``,`````(RB`!@``A!`-$(``:RB`!@`1!`K%$#_
+M^@`````0```$C,,`&(S"`!2LH@`8C,,`&"0"__\08@`2`&`@)2R#!`$D`@0`
+M`$,@"B0"``&LH@`<`$00*Q!```P`````C*(`'``"$$`T0@`!K*(`'`!$$"L4
+M0/_Z`````!````24P@`<)`(#_ZRB`!R4P@`<$$``""0"``J4PP`<+&(`$!1`
+M``(`````)`,`#Q````*DHP`@I*(`()3"`!X00``()`(`"I3#`!XL8@`0%$``
+M`@`````D`P`/$````J2C`"*DH@`BC,(`(*RB`"2,P@`DK*(`*(S"`"BLH@`L
+MC,(`+*RB`#",PP`$)`(`!!1B``4D`@`!C*,`!!1B``(`````K*,`.`/@``@`
+M````C,,`!!!@`!X``!`EC,(`#*RB``B,P@``K*(``(S"``BLH@`$C,(`#*RB
+M``B,P@`0K*(`#(S"`!2LH@`0C,(`&*RB`!2,P@`<K*(`&)3"`""DH@`<E,(`
+M(J2B`!Z,P@`DK*(`((S"`"BLH@`DC,(`+*RB`"B,P@`PK*(`+"0"``$#X``(
+M`````">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)3P"```D0@```$#X"0"@@"4`
+M0(@E$B``'(^_`!R&(@`6%$``$SP"```D0@```D`@)0!`^`D"`"@E`$"`)8Y"
+M`<`"0"`E`$#X"0(@*"4\`P``)&,!5``0@$`"`X`AE@,```!B&"$``QP`$```
+M!@`#%`.6(@`6EB,`&`!#$"$``A0```(4`X^_`!R/L@`8C[$`%(^P`!`#X``(
+M)[T`(">]_\"OOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!RO
+ML``8`("@)0``\"6OH``0``"X):^@`!2.@A(P$$``0```D"4\`@``)%8!5``2
+M$8`"@H`AA@("1@1!`#0F$0(P`H`@)3P#```D8P```&#X"0(@*"4`0*@ECH(!
+MP`*`("4`0/@)`B`H)0`5&$``=A@AE@0"1I1S````DR`A`$00(0`"%````AP#
+ME@(",C!"`0`00``.`'<0*A!``!P"@"`E`&"X)8Z"`<``0/@)`B`H)98#`D8`
+M8A@A`F,8(P`#'````QP#$```$:^C`!0`?A`J$$``#@*`("4`8/`ECH(!P`!`
+M^`D"("@E`!4@0`"6("&6(P`6`&(8(92"````0Q`C``(4```"%`.OH@`0)E(`
+M`8Z"$C`"0A`K%$#_Q0`2$8```)`E`!(1@`*"@"&&`@)&!$$`#B81`C".@@'`
+M`H`@)0!`^`D"("@EE@,",C!C`0"/I0`4`$4@(8^E`!``11`A.&,```"#$`NF
+M(@`8)E(``2I"`$`40/_KC[\`/(^^`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R
+M`""/L0`<C[``&`/@``@GO0!`````````````````,*7__S#&__^4@@``+$(P
+M`CP#```40``#)&@!@#P"```D2`&8```@)20*`&0\"5'K-2F%'P`$$$``2!`A
+ME$(```%"&",`90`8<$8`````$!(`20`8```8$``#&4,``A?#`&(8(Z3C```D
+MA``!*((`"Q1`__`DYP`"`^``"``````PI?__)`,`_Q"C`!,D`@#_E(,``"QC
+M,`,`!1"``$40(21"$L`08``,,$+__RRC`#\`!1"``$40(21"%2(08``&,$+_
+M_P`%$(``11`A``(00"1"$^PP0O__`^``"``````PI?__)`,`_Q"C``DD`@#_
+ME((``"Q",`,DHPE@%$```S!C__\DH@C\,$/__P!@$"4#X``(`````">]_]"O
+MOP`LK[0`**^S`"2OL@`@K[$`'*^P`!@`H)`EED(``"Q"0``40``'`("@)99"
+M`"X00``$`````)9#`!808`".)`(``99"```L0C`#%$``'203`0$D$P%0ED(!
+M=A!``'0``(@E)E```@)@*"4F8@`!,%/__XZ"`:`"@"`E`$#X"2>F`!`00`!\
+M`!$80`!P("&7H@`0``(2`J2"`6``@!@EDZ(`$:1B`6(F,0`"ED(!=@(B$"H4
+M0/_M`F`H)1```%R60@%VCH(!H`*`("4D!0$``$#X"2>F`!`00`!G`H`@)9>B
+M`!```AI"ID,!8@`"$((P0@!_ID(!9)>B`!```A%`,$(`?Z9"`68"8"@E)F(`
+M`3!3__^.@@&@`$#X"2>F`!`00`!5EZ,`$``#(L*60@%F`$00):9"`68``QD"
+M,&,`?Z9#`6B7H@`0``(0P#!"`'^F0@%J`F`H)29B``$P4___CH(!H`*`("4`
+M0/@))Z8`$!!``$&7HP`0``,C0I9"`6H`1!`EID(!:@`#&8(P8P!_ID,!;)>B
+M`!```A!`,$(`?Z9"`6X"8"@E)F(``3!3__^.@@&@`H`@)0!`^`DGI@`0$$``
+M+9>C`!```R/"ED(!;@!$$"6F0@%N``,2`C!"`'^F0@%P``,80C!C`'^F0P%R
+MEZ(`$``"$8`P0@!_ID(!=(Z"`:`"@"`E`F`H)0!`^`DGI@`0$$``&)>C`!``
+M`QJ"ED(!=`!#$"6F0@%TED(!=A!``!```(@E)E,``CP"```D5!7``!&`0"80
+M`6`"<(`A`D`@)0*`^`F6!0``I@(``"8Q``&60@%V`B(0*A1`__8`$8!`)`(`
+M`8^_`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@GO0`P)[W_X*^_`!ROL@`8
+MK[$`%*^P`!``P(`EE+$`%`"@D"4D!``5`!$00"1"``,``A""<B08`@!B("$\
+M`@``)$(```!`^`D`!""``$`8)1!@`#2/OP`<K@,````1$$`D0@`#``(0@@`"
+M$(``8A`AK@(`"*81``02(``H```P)20'`%0D"0`$)`@``XX$````!A!``$0@
+M(8X#``APQR@"`*,8(0!2$"&40@``I&(``*2"`````"`E<,<H`HX"``@`HA`A
+M``08@`!D&"$``QB``$,0(:1$``2.`@`(`*(0(0!#$"&D0``&)(0``2B"``04
+M0/_R<,<8`HX"``@`8A`AI$D`!HX"``@`8A@A),8``0#1$"H40/_=I&@`0B0"
+M``&/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_X`*!@)96"`!:DP@`&-`+>
+MK:>B``"GH@`"```@)93%``8``#@E`.40!S!"``$80``'*(,``A!@`*(``!`E
+M``000`.B$"&D1P``)(0``23G``$HX@`$%$#_\P````"5@@`4I,(`!#!#__\0
+M8`"5```0)93"``000`"1``!()20*`%0D"P`$)`4`&G$E$`(`3"@A)*@`&(S#
+M``AQ*B`"`(,8(92B`!BD8@``C,(`"`""("&4H@`JI((``@``."5Q*B`"C,(`
+M"`""$"$`!QB``&<8(0`#&(``0Q`AI$``!B3G``$HX@`$%$#_]I>C``(T`MZM
+M%&(`'G$J*`*7IP````<@@`"'("$`!""`<2H0`@!$("&,P@`(`((@(:2+``:5
+M`@`"I((`")4#``8`0Q`AI((`"I4#``H`0Q`AI((`#)4#``X`0Q`AI((`#I4"
+M``2D@@`0E0(`"*2"`!*5`@`,I((`%)4"`!`0``!0I((`%HS$``@`I"`AEZ,`
+M```#$(``0Q`A``(0@`""("&5`@`"I((`"(S$``@`I"`AEZ,``@`#$(``0Q`A
+M``(0@`""("$D`@`4I((`"(S$``@`I"`AEZ,``@`#$(``0Q`A``(0@`!$$"$D
+M`P`CI$,`"HS$``@`I"`AEZ,``@`#$(``0Q`A``(0@`!$$"$D`P`_I$,`#)>G
+M````!Q"``$<0(0`"$(``HB`AC,(`"`""("$DA``$I(L``I2"``25`P`&`$,0
+M(:2"``:5`P`*`$,0(:2"``B5`P`.`$,0(:2"``J5`@`$I((`#)4"``BD@@`.
+ME0(`#*2"`!"5`@`0I((`$I>G``(`!Q"``$<0(0`"$(``HB`AC,(`"`""("$D
+MA``$)`(``Z2"``*5`@`4I((`#)4"`!:D@@`.E0(`&*2"`!`E*0`!E,(`!`$B
+M$"H40/]T)`4`&B0"``$#X``()[T`"">]_HBOOP%TK[X!<*^W`6ROM@%HK[4!
+M9*^T`6"OLP%<K[(!6*^Q`52OL`%0`("@):^E`7PD$P%0KZ`!3"0"``&/HP%,
+M$&(`,0``D"4H8@`"$$``!20"``(08``'CZ,!?!```1T``!`E$&(`/X^C`7P0
+M``!3```0)91B`!800`$0*D(`"A!``%$GI``H/!4```)@*"4F<P`!CH(!H`*`
+M("4`0/@))Z8!2!!``0N3I0%)$*``12:Q%<`"(/@)CZ0!?``2&$`GL``0`@,8
+M(:1B``"7H@%(``(J`A"@`#LF4@`!`B#X"8^D`7P`$AA``@,8(:1B```F4@`!
+M*D(`"A1`_^0GI``H$```,CP"``"/HP%\E&(`&A!``.HD90`$``"`)20&`/\G
+MI``0`!`00"1"`5``HA@AE&(``!!&``4`$A!``((0(91C``"D0P``)E(``280
+M``$J`@`#%$#_]``0$$`0```:)Z0`*)1B`!P00`#4)&4`!@``@"4D!@#_)Z0`
+M$``0$$`D0@%(`*(8(91B```01@`%`!(00`""$"&48P``I$,``"92``$F$``!
+M*@(``Q1`__0`$!!`$```!">D`"@0``#&C[\!=">D`"@\`@``)$(```!`^`DD
+M!0$<I[(`/!I``)@``(`E)[8`*"05`!HGO@`L)[<`+B>Q`"H`$!!``L(@(2>C
+M`!``8A@AE&(``*2"``!R%1`"`%8@(91B``"D@@`8`F`H)29S``&.@@&@`H`@
+M)0!`^`DGI@%($$``IG(5(`(`GB@ADZ,!29>B`4@``A!`,$(!``!B&".DHP`8
+M`)8@(9>B`4@``AH"``(3P@`"$@``8A@CI(,`(`)@*"4F<P`!CH(!H`*`("4`
+M0/@))Z8!2!!``)!R%2`"`)XH(9.C`4F7H@%(``(00#!"`0``8A@CI*,`(`"6
+M("&7H@%(``(:`@`"$\(``A(``&(8(Z2#`"@"8"@E)G,``8Z"`:`"@"`E`$#X
+M"2>F`4@00`!Z<A48`@!W("&7H@%(,$(`'Z2"`!@D8P`@`B,@(9>B`4@``A%"
+M,$(`'Z2"```"XQ@AEZ(!2``"$H(P0@`?I&(```)@*"4F<P`!CH(!H`*`("4`
+M0/@))Z8!2!!``&-R%2`")(0`*`/$*"&3HP%)EZ(!2``"$$`P0@$``&(8(Z2C
+M```"Y"`AEZ(!2``"&@(``A/"``(2``!B&".D@P```F`H)29S``&.@@&@`H`@
+M)0!`^`DGI@%($$``3'(5*`(GI@`H`*8@(9.C`4F7H@%(``(00#!"`0``8A@C
+MI(,`,(^C`7R48@``+$)``Q1```QR%2`")*(`*`(B&"$`PA`AE$(``*1B````
+ML1@AEZ(!2``"$@(P0@`_$```"Z1B`!@`D2@AEZ(!2``"&@(``A/"``(2``!B
+M&".DHP`H`*`@)20"``&D@@`8)A```0(2$"H40/]P`!`00(^B`4P``C!`CZ,!
+M?`##$"&40@!HIZ(`/H^B`4P`PC`A``8P@`!F,"$"@"`E)Z4`*#P#```D8QCT
+M`&#X"23&#6000``4CZ,!?(^B`4P``C!``,(P(0`&,(``9C`A`H`@)2>E`"@\
+M`P``)&,:*`!@^`DDQ@UD$$``"(^_`72/H@%,)$(``:^B`4PH0@`#%$#^VR0"
+M``&/OP%TC[X!<(^W`6R/M@%HC[4!9(^T`6"/LP%<C[(!6(^Q`52/L`%0`^``
+M"">]`7@GO?_@K[\`'*^R`!BOL0`4K[``$`"@D"4``(`E/`(``"11````$!!`
+M`%`0(0`"$(`"0A`AC$0-9!"```,``````B#X":Q`#60F$``!*@(``Q1`__2/
+MOP`<C[(`&(^Q`!2/L``0`^``"">]`"``@$@E,*7__Z4E`!25)``6``!`)3""
+M``$D`P`!.$(```!B0`L`!!!",$(``1!```(E`@`!,$C__P`$$((P0@`!$$``
+M`B4"``$P2/__``00PC!"``$00``")0(``3!(__\0H``3```X)20+`&8E*@`"
+M``<80`!F$"&41````2,8(:1D``!PZQ`")$(`&`$B&"&D9````4(0(:1(```D
+MX@`!,$?__P#E$"L40/_R``<80`/@``@`````)[W_J*^_`%2OO@!0K[<`3*^V
+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
+M__^4H@`4$$``.```."4D#@!F)9``!"6-``8EB@`()!D`!"08``$D#P`%``<8
+M0`"C$"&41````8,8(:1D``!P[A`")$(`&`&"&"&D9````@(0(:1+`````$`E
+M```@)7#N,`(`!!!``$00(0`"$,``1A`A)$,`&`&C$"&D1````(D0!S!"``$0
+M0``'`4,8(24"``$P2/__%1@`":1Y```0```'I&\````$$$``1!`A``(0P`!&
+M$"$`2A`AI$``&"2"``$P1/__+((`!!1`_^8`!!!`).(``3!'__^4H@`4`.(0
+M*Q1`_](`!QA`C[````/@``@GO0`()[W_Z*^S`!2OL@`0K[$`#*^P``@`H)`E
+M`,"()30"WJVGH@``IZ(``J>B``2GH@`&``#()98D`!8``&@E)`4``P"M&",`
+M9!`',$(``1!```0`&1!``Z(0(:1#```G.0`!):(``3!-__\MH@`$%$#_]0"M
+M&".60@`4IB(`%#!"__\00`!(``!P)203`&9QTQ`"`D(8(21X`!@`41`AE&,`
+M&*1#`!@3(``Y``!H)20"`&9QPH`")P\`!``-($`#I!`AE$(````"&$``8A@A
+M``,8P`(#&"$`<1@A`(\0(81"``@``A"`I&(`+`'D("&4@@``I&(`(B0(``&4
+M8@`@`0(0*Q!``!TD;``>)8L`!B<*``0EB0`$``@H0`"K."$`X#`E``@@@`"-
+M("$`!"!``(H0(81#`#```QA`E,(`!@!#$"&DX@`(`24P(0"I*"$`BB`AE*/_
+M_I2"``@`8A@AI,,``"4"``$P2/__E8(``@$"$"L40/_I``@H0"6B``$P3?__
+M`;D0*Q1`_\T`#2!`)<(``3!.__^6(@`4`<(0*Q1`_[QQTQ`")`(``8^S`!2/
+ML@`0C[$`#(^P``@#X``()[T`&">]_\"OOP`XK[4`-*^T`#"OLP`LK[(`**^Q
+M`"2OL``@`("@)0"@F"4D`@`$IZ(`&"0"``:GH@`:)`(`":>B`!PD`@`,IZ(`
+M'@``J"4\`@``)$(```!`^`DD!`04`$"`)1(``(H"H!`EEF(`%A!``"R6<@#0
+M/`(``"1"```"`"`E`$#X"20%!!268@!HI@(`%B0"``JOH@`0KZ``%#P"```D
+M0B,@`H`@)0)@*"4"`#`E`$#X"0)`."400`!N`````"9Q#6268@!HIF(->CP"
+M```D0BG4`B`@)0!`^`D"`"@E/`(``"1"*S`"@"`E`@`H)0!`^`D"(#`E$$``
+M7@````"6`@`:``(00`!=$"&40P`6E@(`%'!#(`(`DI`A)E(`!99B`!H00``L
+M/`(``"1"```"`"`E`$#X"20%!!268@!JI@(`%B0"``2OH@`0)`(``:^B`!0\
+M`@``)$(C(`*`("4"8"@E`@`P)0!`^`D"0#@E$$``0``````F<1%XEF(`:J9B
+M$8X\`@``)$(IU`(@("4`0/@)`@`H)3P"```D0BLP`H`@)0(`*"4`0/@)`B`P
+M)1!``#``````E@(`&@`"$$``71`AE$,`%I8"`!1P0R`"`)*0(292``*68@`<
+M$$``)#P"```D0@```@`@)0!`^`DD!004EF(`;*8"`!8D`@`$KZ(`$"0"``*O
+MH@`4/`(``"1"(R`"@"`E`F`H)0(`,"4`0/@)`D`X)1!``!(`````)G$5C)9B
+M`&RF8A6B/`(``"1"*=0"("`E`$#X"0(`*"4\`@``)$(K,`*`("4"`"@E`$#X
+M"0(@,"400``"`````"05``$2```$/`(``"1"````0/@)`@`@)0*@$"6/OP`X
+MC[4`-(^T`#"/LP`LC[(`*(^Q`"2/L``@`^``"">]`$`GO?_`K[\`/*^^`#BO
+MMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"@D"660@``+$)``!1`
+M``H`@)@EED,`+B0"``$48@`&/`(``"1"'/0`0/@)`````!```+Z/OP`\ED(`
+M`"Q"4``40``+``"X)99#`"XD`@`"%&(`!SP"```D0BSP`F`@)0!`^`D"0"@E
+M$```L(^_`#R60P``+&,P`R0$`0`D`@%0`$"()20"``$2X@`0`(.("RKB``(0
+M0``%)`(``A+@``<F,0`%$```H```$"42X@`.```0)1```)V/OP`\EE4!=B90
+M`7@0```.)E8!8I9"`!H00`"1)C$`-Y95`X`F4`0^$```!R96`XB60@`<$$``
+MBB8Q`$:650.`)E`#HB96`X(2H`"%``"@)3P"```D7A5``!000`!6$"&40@``
+MI@(```(@*"4F,0`!CF(!H`)@("4`0/@))Z8`$!!``'R/OP`\EZ(`$``"$H*F
+M`@`$EZ(`$``"$0(P0@`_I@(``I>B`!```A"`,$(`/Z8"`!X"("@E)C$``8YB
+M`:`"8"`E`$#X"2>F`!`00`!HEZ,`$``#&X*6`@`>`$,0):8"`!Z7H@`0``(2
+M`C!"`#^F`@`@EZ(`$``"$((P0@`_I@(`(I>B`!```A$`,$(`/Z8"`"0"("@E
+M)C$``8YB`:`"8"`E`$#X"2>F`!`00`!0EZ,`$``#&P*6`@`D`$,0):8"`"27
+MH@`0``(1@C!"`#^F`@`FEZ(`$#!"`#^F`@`H`B`H)28Q``&.8@&@`F`@)0!`
+M^`DGI@`0$$``/H^_`#R7H@`0``(2@J8"`"J7H@`0``(1`C!"`#^F`@`LEZ(`
+M$``"$(`P0@`_I@(`+@(@*"4F,0`!CF(!H`)@("4`0/@))Z8`$!!``"J7HP`0
+M``,;@I8"`"X`0Q`EI@(`+I>B`!```A(",$(`/Z8"`#"7H@`0``(0@C!"`#^F
+M`@`R`D`@)98%``*6!@`$`\#X"28'``B6`@`&$$``#@``("4F!0`&)`8`,@`$
+M$$`D0@`8`*(0(81#``!P9A@"I$,``"2$``&6`@`&`((0*A1`__<`!!!`)I0`
+M`0*5$"H40/]_)A``-";W``$JX@`#%$#_4R0"``&/OP`\C[X`.(^W`#2/M@`P
+MC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?_`K[\`/*^^`#BO
+MMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"`N"4`H)`E``"H)99"
+M```L0D``%$``!"0$`0"60@`D$```!B11_ZN60@``+$(P`R0#`5``8(@E`(*(
+M"R0"``$2H@`.*J(``A!```@D`@`")C$`5206``@F4`3<$J``%B93!-H0``!Z
+M```0)1*B``L``!`E$```=X^_`#R60@`:$$``;P`````F,0!E)!8``B90!4X0
+M```()E,%3)9"`!P00`!G`````"8Q`&DD%@`#)E`%+B93!2RF8```$L``8```
+MH"4\`@``)%X6(`(@*"4F,0`!CN(!H`+@("4`0/@))Z8`$!!``%N/OP`\ED(`
+M`"Q",`,40``$EZ(`$``"$@(0```#I@(`"``"$D*F`@`(E@4`"!"@`$8`````
+M%J``!P)`("4\`P``)&,5P`!@^`D"0"`E$```!*8"``@#P/@)E@4`"*8"``B6
+M0@``+$(P`Q1```F7H@`0``(0@C!"`#^F`@`&EZ(`$``"$0`P0@`_$```"*8"
+M``0``A#",$(`/Z8"``:7H@`0``(0P#!"`#^F`@`$`B`H)28Q``&.X@&@`N`@
+M)0!`^`DGI@`0$$``*8^_`#R60@``+$(P`Q1```V7HP`0``,;`I8"``0`0Q`E
+MI@(`!)>B`!```A&",$(`/Z8"``*7H@`0,$(`/Q````VF`@````,;0I8"``0`
+M0Q`EI@(`!)>B`!```A'",$(`/Z8"``*7H@`0``(00C!"`#^F`@``EF(``"1"
+M``&F8@``)I0``0*6$"H40/^D)A``"B:U``$JH@`#%$#_<"0"``&/OP`\C[X`
+M.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?_`
+MK[\`/*^^`#BOMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"`H"4`
+MH/`EE\(``"Q"0``40``$)]$%9)?2`"00```')E(`&I?"```L0C`#)`0!;R0#
+M`;\`8)`E`(*0"Y?"`0000`#JKZ``%(^C`!0``Q!``%X0(91"`0840``()D0`
+M")?"```L0C`#)D,`!P"`D"4`8I`+$```U28Q`$"7P@``+$(P`Q1``"\"0"@E
+M``"8)292``&.@@&@`H`@)0!`^`DGI@`0$$``T@`3&,``<1@AEZ(`$``"$@*D
+M8@``DZ(`$:1B``@F<P`"*F(`"!1`__`"0"@E``"8)0)`*"4F4@`!CH(!H`*`
+M("4`0/@))Z8`$!!``+\`$R#``)$@(9>C`!```Q(",$(`/Z2"``(``Q.",$(`
+M`:R"``27H@`0,$(`/Z2"``H``QF",&,``29S``(J8@`(%$#_Z*R#``P0``"`
+M``"8)292``&.@@&@`H`@)0!`^`DGI@`0$$``I0*`("67H@`0``(:0J8C````
+M`A"",$(`?Z8B``B7H@`0``(10#!"`'^F(@`0`D`H)292``&.@@&@`$#X"2>F
+M`!`00`"4EZ,`$``#(L*6(@`0`$00):8B`!```QD",&,`?Z8C`!B7H@`0``(0
+MP#!"`'^F(@`@`D`H)292``&.@@&@`H`@)0!`^`DGI@`0$$``@9>C`!```R-"
+MEB(`(`!$$"6F(@`@``,9@C!C`'^F(P`HEZ(`$``"$$`P0@!_IB(`,`)`*"4F
+M4@`!CH(!H`*`("4`0/@))Z8`$!!``&Z7HP`0``,CPI8B`#``1!`EIB(`,``#
+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
+M*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``BL`%!A``'4@(9>B`!```A("I((`
+M.`!S&"&3H@`1I&(`0`(`*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``AP`%!A`
+M`'$@(9>B`!```A("I((`2@"`&"63H@`1I&(`4`(`*"4F$``!CD(!H`)`("4`
+M0/@))Z8`$!!``@T"D1@AEZ(`$``"$@*@8@!9`!000"1"`%@"8B`ADZ,`$3!B
+M`(`00``#I(,``#1B_P"D@@```@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`!
+M^0`4($``D2@AEZ,`$``#$4(P0@#_I*(`8B2$`&@")!`A``,80C!C``^D0P``
+M`J0@(9>B`!`P0@`!I((``)8B```L0D``%$``#@`````2@``%EZ(`$!*7``<`
+M````$```"98B`````A-",$(``1````2F(@`F``(30C!"``&F(@`HEB(``"Q"
+M,`,40``M`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`!SY>C`!``%!!``%40
+M(0`#&8(P8P!_I$,`L"0"``$2@@`+*H(``A!```4`````$H``%P`````0```9
+MEB(``!*7``L`````$```%98B``"7H@`0,$(`!Z8B`/R7H@`0``(0PC!"``<0
+M```,IB(!`)>B`!`P0@`'IB(`_I>B`!```A#",$(`!Q````2F(@$"EZ(`$#!"
+M`#^F(@`2EB(``"Q",`040``L`!000``4&$``<Q@AEZ(`$``"$T*D8@"X`@`H
+M)280``&.0@&@`D`@)0!`^`DGI@`0$$`!F0`4($`DA`"X`F0@(9>C`!```QC`
+M,&,`.)2"````0Q`E%I<`":2"``"7HP`0``,0PJ(B`"*6(@``+$)`!A1```(`
+M`Q+"IB(`+!:``!$`````EB(``"Q"0``40`#QEZ,`$``#$@(P0@`_IB(!1@`#
+M&,(P8P`?$```!J8C`4H`4Q`A)`,`"J1#`+@D`@`/HB(`(I8B```L0D``%$``
+MX20"``$2@@`+*H(``A!```4`````$H``H0`````0``#:)I0``1*7`"4"`"@E
+M$```UB:4``$"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`%>`B`@)0+`^`F3
+MI0`1IB(!5)>E`!`"("`E`L#X"0`%*@*F(@%6CD(!H`)`("4"`"@E`$#X"2>F
+M`!`00`%/`B`@)0+`^`F3I0`1IB(!6)8B```L0D`!%$``MY>B`!```A(",$(`
+M/Q```+.F(@#$)A```8Y"`:`"0"`E`$#X"2>F`!`00`$]`B`@)0+`^`F3I0`1
+MIB(!3I>E`!`"("`E`L#X"0`%*@*F(@%0`@`H)280``&.0@&@`D`@)0!`^`DG
+MI@`0$$`!+0(`*"67H@`0,$(`?Z8B`!"7H@`0``(1PC!"`#^F(@`4)A```8Y"
+M`:`"0"`E`$#X"2>F`!`00`$?`B`@)0+`^`F3I0`1IB(!4I8B```L0D`!%$``
+M!0(`*"67H@`0``(2`C!"`#^F(@#&)A```8Y"`:`"0"`E`$#X"2>F`!`00`$.
+MC[\`/)>B`!```A%",$(`/Z8B`4B7H@`0,$(`'Z8B`4R6(@``+$)``A1``'$"
+M`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`#\C[\`/).B`!&F(@`JEB(``"Q"
+M4``40`!DEZ,`$``#$@(P0@!_IB(`U@`#&\*F(P#:`@`H)280``&.0@&@`D`@
+M)0!`^`DGI@`0$$``Z)>C`!`P8P`?``,80)8B`-H`0Q`EIB(`VI>C`!```Q%"
+M,$(`/Z8B`.(``QK"HB,`W8Y"`:`"0"`E`@`H)0!`^`DGI@`0$$``UX^_`#R3
+MH@`1,$(`!P`"$4"2(P#=`&(8):(C`-V7H@`0``(0PA```#NB(@#?EB(``"Q"
+M0`$40``W`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$``PH^_`#R7H@`0,$(`
+M/Z8B`,*6(@``+$)0`!1``"F7HP`0``,1@C!"`'^F(@#4``,;0J8C`-@"`"@E
+M)A```8Y"`:`"0"`E`$#X"2>F`!`00`"MEZ,`$#!C``<``QC`EB(`V`!#$"6F
+M(@#8EZ,`$``#$,(P0@`_IB(`X``#&D*B(P#<CD(!H`)`("4"`"@E`$#X"2>F
+M`!`00`"<C[\`/).B`!$P0@`!``(1P)(C`-P`8A@EHB,`W)>B`!```A!"HB(`
+MWB:4``$J@@`#%$#]F``4$("6(@``+$(P`Q!``!TD`@`$CD(!H`)`("4D!0#L
+M`$#X"2>F`!`00`"#`D`@)9>B`!`P0@`'IB(`_)>B`!```A#",$(`!Z8B`0".
+M0@&@)`4`[0!`^`DGI@`0$$``=X^_`#R7H@`0,$(`!Z8B`/Z7H@`0``(0PC!"
+M``>F(@$")`(`!*8B`6`D`@`!IB(!7J8B`5RF(`%:C]``%)8B`0000``6``"@
+M)28S``8"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`!<`!080`!S("&7H@`0
+M``(2`J2"`0``@!@EDZ(`$:1B`0(FE``"EB(!!`*"$"H40/_N`@`H)98B```L
+M0E`#%$``&P```````*`E)C,`!HY"`:`"0"`E`@`H)0!`^`DGI@`0$$``0Y>C
+M`!``%!"``%,0(:1#`XB.0@&@`D`@)28%``4`0/@))Z8`$!!``#F7HP`0`!00
+M@`!3$"&D0P.*)I0``2J"``440/_I)A```98B```L0C`#$$``"B0"_\JF(@!<
+M)`+__Z8B`%ZF(@!@)`(`#Z8B`$0D`@`<IB(`1J8B`$B6(@``+$)``!1```D"
+M0"`ECD(!H"0%`,H`0/@))Z8`$!1```F/OP`\$```&X^^`#B.0@&@)`4`SP!`
+M^`DGI@`0$$``%(^_`#R7H@`0IB(`&)8B`!840``.)`(``98B```L0D``%$``
+M!@````"6(@`8``(2PC!"``$0```$IB(`%I8B`!@``A/"IB(`%B0"``&/OP`\
+MC[X`.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`G
+MO?_@K[\`&*^Q`!2OL``0`("`)3P"```D0CH<`$#X"0"@B"400``7`@`@)3P"
+M```D0A98`$#X"0(@*"400``1`@`@)3P"```D0B^@`$#X"0(@*"400``+`@`@
+M)3P"```D0C,D`$#X"0(@*"400``%`@`@)3P"```D0C70`$#X"0(@*"6/OP`8
+MC[$`%(^P`!`#X``()[T`(">]_^BOOP`0`*`8)91B```L0D``%$``"8^_`!"4
+M8P`N)`(``11B``4\`@``)$(A_`!`^`D`````C[\`$`/@``@GO0`8````````
+M````````E(,``)2B```48@`'`````)2"``(P1,'PE*(``C!"P?`0```#`((@
+M(Y2$````@B`C`^``"`"`$"64@@((`^``"#!"O_\``"@E``40P`!$$"&,0P``
+MC$(`!`!B&"448``&```0)22E``$HH@`"%$#_]@`````D`@`!`^``"``````G
+MO?_HK[\`$#P"```D0DEH`$#X"0``````0"@E,**``!!``!$``"`E,*5__SP"
+M```D1AJ(``00@`!$$"$``A"``$80(91#```090`3)`(``22$``$L@@"#%$#_
+M]@`````0```-```0)3P"```D1A$H``010`!&$"&40P``$&4`!B0"``$DA``!
+M+((`2Q1`__D`!!%````0)8^_`!`#X``()[T`&">]_^BOOP`4K[``$#"P__\2
+M```E)`(``3P"```D0DEH`$#X"0``````0"@E,*.``#P"__\T0G__`*(0)`("
+M$"848``9+$(``3BB`?\L0@`!+*,``0!#$"440``3)`(``0``("4\`@``)$8:
+MB``$$(``1!`A``(0@`!&&"&48@``%@(`!`````"48P`"$&4`!B0"``$DA``!
+M+((`@Q1`__0`!!"````0)8^_`!2/L``0`^``"">]`!@GO?_@K[\`'*^R`!BO
+ML0`4K[``$`"@B"6,@@&<`$#X"0#`D"4`0(`E,@(`0A!```<R`@`@CB(`"!1`
+M``0R`@`@)`+_O0("@"0R`@`@$$``!S("``B.(@`,%$``!#("``@D`O_?`@*`
+M)#("``@00``',@(``8XB``040``$,@(``20"__<"`H`D,@(``1!```<\`@``
+M)$))=`!`^`DF1``@$$```B0"__X"`H`D`@`0)8^_`!R/L@`8C[$`%(^P`!`#
+MX``()[T`(">]_V"OOP"<K[(`F*^Q`)2OL`"0`("0)0``B"4\`@``)$),Z`!`
+M^`DPI/__`$"`)1(```\\`@``)$).?`)`("4"`"@E-`;_?P!`^`DGIP`0$$``
+M!SP"```D0DL,`D`@)0(`*"4`0/@))Z8`$`!`B"4"(!`EC[\`G(^R`)B/L0"4
+MC[``D`/@``@GO0"@)[W_Z*^_`!2OL``0/`(``"1"26@`0/@)`("`)0!`&"4D
+M`@`2$&(`%"0"``$H8@`3$$``!0`````08``*```0)1````Z/OP`4)`(!_Q!B
+M``4T`H-*%&(`!R0"``$0```'C[\`%)8$`@HD`P-*$(,``B0"``$``!`EC[\`
+M%(^P`!`#X``()[T`&#"$__\``"@E/`(``"1&&H@`!1"``$40(0`"$(``1A`A
+ME$,``!!D``4`````)*4``2RB`(,40/_V```0)0/@``@`````)[W_X*^_`!BO
+ML0`4/`(``"1"26@`0/@)K[``$`!`B"4R(H``$$``!S(P?_\\`@``)$),Z`!`
+M^`D"`"`E%$``$@(`$"4``"`E/`(``"1%$2@`!!E``&40(91"```440`%`&40
+M(91#`!@48``'`&`0)20$`$LDA``!+((`2Q1`__4`!!E````0)8^_`!B/L0`4
+MC[``$`/@``@GO0`@)[W_Z*^_`!``H#@E```8)3P"```D1B3(/`(``"1(````
+M`Q'``$8H(92B```41``()&,``1#@``0D8___`.`@)0$`^`DD!@"`$```!20"
+M``$L8@`Q%$#_\P`#$<```!`EC[\`$`/@``@GO0`8```H)3P"```4@``#)$81
+M*`/@``@``!`E``410`!&$"&40P``$&0`!B0"``$DI0`!+*(`2Q1`__@`````
+M```0)0/@``@`````)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`DK[0`(*^S`!RO
+ML@`8K[$`%*^P`!``@/`E`*"H)0#@L"4PU___``"`)0``B"4``)@EEJ(``!1`
+M`!L``*`E/`(``"1"26@`0/@)``````!`D"4R0H``%$``$3P"```D0DW(`D`@
+M)0!`^`D``"@E%$``#@)`("4\`@``)$).-`!`^`D"0"`E$$```P`````0```&
+M`D`@)1````26I``"$````I:D``*6I``",(+_`!1``$<\`@`````P)0``."4\
+M`@``)$41*``&$4``11@AE&(``!1$``,``````&"8)20'``$DQ@`!+,(`2RSC
+M``$`0Q`D%$#_]0`&$4`0X`!)```0)3+B`(`40``$``"`)99D``(0```#CG$`
+M")9D``2.<0`,```P)0``."4\`@``)$D`3#P"```D2`!0``80P`!&$"$``AB`
+M`&DH(92B```41``'`&@0(8_#`=B,0@``%&(``P``````H*`E)`<``23&``$L
+MP@`"+.,``0!#$"040/_O``80P!#@`!`RX@"`%$``"```$"6.@P`(`@*`)`(C
+MB"2.@P`,`@*`)1````<"(X@ECH,`$`("@"0"(X@DCH,`%`("@"4"(X@E/`(`
+M`"1"3<@`0/@)`L`H)1!``!*/OP`TCL(`$([#`!2.9``0CF4`%`!$$"0`91@D
+MKL(`$*[#`!26H@`",$+_``(P&"4L0@`!``,0"A!```,D`@`!KM$`&(^_`#2/
+MO@`PC[<`+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`.``$
+M-\,`!C:"`(8P(0`&,8,`!A&``((@(R0"```D`P`!``0^@`3A``0``````(-`
+M!!````<``$@E$.``!`""0`0`!#@C`.,X!@$'0"4`@T@$`0`0)0$@&"4`!C#`
+M`,4P(8S$``",Q0`$`$00)`!E&"0`8A`E`^``"``"$"LPYP#_$.``%P"`&"40
+MH``/```@)9!B```01P`2`````!!```H`````)(0``0"%$"L00``&`&00(9!"
+M```01P`)`````!1`__@`````$(4`!0!D$"&@1P``C,(``"1"``&LP@```^``
+M"``````GO?Y@K[\!G*^^`9BOMP&4K[8!D*^U`8ROM`&(K[,!A*^R`8"OL0%\
+MK[`!>`"`\"6OI0&DKZ8!J*^G`:R/L@'$E[`!OI>B`<*OH@%8)`,;6*^C`6`G
+MQ0(PKZ4!9#P"```D0DFP`$#X"0``B"400`&@C[\!G#P"```D0DTL`$#X"0/`
+M("6GP@(*,$+__Q1```L\`@``/`(``"1"2E0#P"`E`$#X"0(`*"400`&1C[\!
+MG#("/_^GP@(*/`(``"1"7[``0/@)`\`@)3P"```D0DSH`$#X"9?$`@H`0(`E
+M$@`!@P/`("4\`@``)$).?`(`*"4T!O]_`$#X"2>G`!`00`%[`\`@)3P"```D
+M0DY\`@`H)20&`(``0/@))Z<`D!!``72/OP&<CZ0`&(^E`!PD`@``)`,`!0""
+M$"0`HQ@D`&(0)20&``$`PH@+)`(``"0#``(`@B`D`*,H)`"D("4D`@`"`$2(
+M"X_"`@P2(@`"/`(``*_1`@PD0DL,`\`@)0(`*"4`0/@))Z8`$!9```.OH@%<
+MEA``$*^P`6"/I@&H+,,`020"`$``0S`*KZ8!J(_"`>```CJ",.<``:^G`6P`
+M`A)",$(``:^B`6@\`@``)%<!\#P"```D0@((`N(0*Q!``0@``*@EEN(``(^H
+M`5@`2!`D$$``_`````"6X@``CZ,!7`!#$"000`#W)Z8!$(_"`9@#P"`EEN4`
+M`@!`^`DGIP$2$$``\"0"``26XP``$&(`)2AB``400``()`(`("0"``$08@`9
+M)`0``A!D`!`\!0``$```Y2;W``008@`I*&(`(1!```8D`@!`)`(`"!!B`!T\
+M`@``$```W";W``008@`H/`8``!```-@F]P`$)[(`$">T`$`DI0=(KZ4!<))"
+M``(0```E-%,``R>R`!`GM``P/`(``"1""HBOH@%P$```'I)3``(GL@"0)[0`
+MX#P"```D0@0HKZ(!<))"``(0```6-%,``2>R`)`GM`#P)$(!B*^B`7"20@`"
+M$```#S13``(GL@"0)[0!`#P"```D0@#HKZ(!<))"``(0```'-%,`!">R`!`G
+MM`!0),8'2*^F`7"20@`"-%,`!#P'```DYTET`.#X"0*`("440`"F````````
+ML"4"P"`E/`@``"4(4.0!`/@)`H`H)1!``)H`%A%`CZ,!<`!B@"&/I`&PCZ4!
+MM(^F`;@\"```)0A18`$`^`F2!P`8EA$``)8"``(`41`K%$``C)>B`1`"(A`K
+M%$``@I>B`1(`41`K%$``?X^E`6R2!``&.(,`"BRB``$``Q`+%$``>8^F`6@X
+M@P`%+,(``0`#$`L40`!TCZ<!8)(#``<"(Q@A``,80R3B``H`0Q`J%$``;8^H
+M`:@"J!`K$$``?(^E`<B.`@`0C@,`%``"'\(LI``!`(,@)!2``&,``!`ECD(`
+M&#!"`(`00``$)`(`!H_#`=P08@!<`````">D`1@\!@``),8```#`^`DD!0!`
+MI[$!&);D``*GI`$:D@,`!B0"``408@`%)`(`"A1B``8T@D``$```!*>B`1J7
+MH@$:-$*``*>B`1J2`@`$HZ(!'9("``6CH@$RCD(`&*^B`32OLP$XC@(`$(X#
+M`!2.1``0CD4`%`!$$"0`91@D`&(0)1!```27H@$:-$("`!````.GH@$:,$+]
+M_Z>B`1J.`@`(C@,`#(Y$``B.10`,`$00)`!E&"0`8A`E$$```R0'``(0```"
+MHZ<!'*.@`1R.`@`(C@,`#(Y$``B.10`,`$00)`!E&"0D!```)`4``@!$$"0`
+M91@D`&(0)1!```.3H@$<-$(`"*.B`1R.0@`8,$(`0!!```0`````DZ(!'#1"
+M``2CH@$<`!41@(^H`60`2!`A)Z,!&">D`5B,90``C&8`!(QG``B,:``,K$4`
+M`*Q&``2L1P`(K$@`#"1C`!`49/_V)$(`$":U``&2`@`'`B(0(3!1__^6`@`"
+M`%$0*Q!`_W:7H@$0)M8``2K"`(`40/]=`````";W``0\`@``/`(``"1"`@@"
+MXA`K%$#^^@`````2H``U+J,`020"`$``0Z@*/`(``"1"6X2/I`%D`J`H)20&
+M`$`\!P```$#X"23G23"OU1(P&J``$P``*"4`!2#`CZ(!I`""("$`!1F`CZ8!
+M9`!F&"&48@``I((``)1B``*D@@`"D&(`!*""``208@`%H((`!22E``$`M1`J
+M%$#_\``%(,"/P@&\`\`@)8^E`:0`0/@)`J`P)1J@``\``"@E``4A@(^G`60`
+MAR`A``48P(^H`:0`:!@AD&(`!J""``:08@`'H((`!R2E``$`M1`J%$#_]``%
+M(8"/H@&LK%4``)?"`@JGP@`8`!40*X^_`9R/O@&8C[<!E(^V`9"/M0&,C[0!
+MB(^S`82/L@&`C[$!?(^P`7@#X``()[T!H)2B``*,AA(T$,``$3!(P?"4PP``
+ME*(``!1B``XDAP(PE,,``C!BP?`42``*`````)#"``0P0@`!$$```S!C``(4
+M8``E```0)0/@``@`P!`E)(<",(R$$C`0@``?```0)92E````!!!#``(1@`#B
+M,"&4P@```*(0(Q1``!``````E,,``C!BP?`42``)`````)#"``0P0@`!$$``
+M`S!C``(48``-```0)0/@``@`P!`EE,(``C!"P?`!`A`C&$```P`````DQP!`
+M)(3__P`$($,4@/_D```0)0/@``@`````)[W_Z*^_`!2OL``0/`(``"1"````
+M0/@)`,"`)1!```D`````@$(`&@`"$$`"`A`C``(6```"%@,H0P``$````@`#
+M$`L``!`EC[\`%(^P`!`#X``()[T`&">]_]BOOP`@K[,`'*^R`!BOL0`4K[``
+M$`"`B"4`H)@EEB(""A1``"4D$`#_/`(``"1226@"0/@)`````#!"`/`D`P!@
+M$$,`!@`````"0/@)`B`@)20#`9D40P`9/`(``)9B``(P0@"@)`,`H!!#`"8D
+M$`#AEF(``C!"`-`D`P#`$$,`(200`.*68@`",$(`T"0#`-`00P`<)!``Y)9B
+M``(P0@%0)`0`X"0#`.,X0@%0`&"`)1```!0`@H`+/`(``"1"```"("`E`$#X
+M"0)@*"400``-)`,`P(Q0`""68@`",$(`P!1#``D"`!`E,@,`#R0"``$48@`%
+M`@`0)20"__`"`H`D-A```@(`$"6/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@G
+MO0`H)[W_Z*^_`!`\`@``)$(```!`^`D``````$`8)1!@``0``!`EC&(`'``"
+M$((P0@`!C[\`$`/@``@GO0`8)[W_T*^_`"ROM@`HK[4`)*^T`""OLP`<K[(`
+M&*^Q`!2OL``0`,"@)0#@L"4`@*@E)+/__Q)@`!L"M)`A`K(0*Q!``!4"0(@E
+M`C2`(P(`("4"P/@)`B`H)1A```\``````B`@)0*`*"62`P``D((``*("```F
+M$``!H(,``"2E__\4H/_Y)(0``0(TB","L1`K%$#_[0`````F<___%F#_YP)4
+MD"&/OP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`P)[W_
+MV*^_`""OL0`<K[``&`"`@"4"`(@EC@(!H"0%`,$`0/@))Z8`$!!``!:7HP`0
+M+&-``"0&`,\D!0#*CB(!H`(@("4`PR@+`$#X"2>F`!(00``-C[\`()>B`!`L
+M0D``%$``!9>B`!(``A+",$(``1````.N`A(\``(3PJX"$CR.`A(\C[\`((^Q
+M`!R/L``8`^``"">]`"@GO?_HK[\`%*^P`!`\`@``)$)):`!`^`D`@(`E`$`8
+M)20"`$@08@`P/`(``"AB`$D00``/-`*!C2AB`$(00``()`(`0RAB`$`00``G
+M/`(``!!@`!H``!`E$```*H^_`!008@`@`````!```"4``!`E`$,0*A1```TT
+M`H&/-`*!B`!B$"H00``8/`(``"AB`$T00``;```0)2AB`$H40``7/`(``!``
+M`!$D0EQ0%&(`$SP"```0```-)$)<4)8#`@HH8@&(%$``#@``$"4H8@&.%$``
+M!3P"```D`@&/%&(`!P`````\`@``)$)<4`!`^`D"`"`E$````X^_`!0``!`E
+MC[\`%(^P`!`#X``()[T`&">]_]BOOP`DK[(`(*^Q`!ROL``8`("0)3"Q__\"
+M0(`EC@(!H"0%`,$`0/@))Z8`$!!``"0\`@`````@)21%`)0\`@``)$8`ECP"
+M```D1P"8/`(``"1(32P`!!!``$00(0`"&$``91`AE$(``!11`!(DA``!)(3_
+M_Y>B`!`L0E`#$$```P!F$"$0```&E$(````$$$``1!`A``(00`!'$"&40@``
+MI@(""`$`^`D"0"`E$```!*8"`@HL@@`.%$#_YP`$$$"/OP`DC[(`((^Q`!R/
+ML``8`^``"">]`"@GO?_8K[\`)*^R`""OL0`<K[``&`"`D"4PL?__`D"`)8X"
+M`:`D!0#!`$#X"2>F`!`00``D/`(`````("4D10`@/`(``"1&`"(\`@``)$<`
+M)#P"```D2$TL``000`!$$"$``AA``&40(91"```440`2)(0``22$__^7H@`0
+M+$)0`Q!```,`9A`A$```!I1"````!!!``$00(0`"$$``1Q`AE$(``*8"`@@!
+M`/@)`D`@)1````2F`@(*+((`!Q1`_^<`!!!`C[\`)(^R`""/L0`<C[``&`/@
+M``@GO0`H)[W_X*^_`!BOL0`4K[``$`"`@"4\`@``)$)<Z`!`^`D"`(@E$$``
+M$X^_`!B.`@'D,$(``1!```\`````E@4""!"@``8\`@``)$)=^`!`^`D"`"`E
+M$```!X^_`!@\`@``)$)>U`(`("4`0/@)EB4""H^_`!B/L0`4C[``$`/@``@G
+MO0`@````````````````)[W_R#P"DD@T0OP`KZ(`$).C`!`GI0`0D*(``0`"
+M$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``8A@EC((`%*Q#0(`\`B22-$))
+M)*^B`!23HP`4)Z4`%)"B``$``A(``&(8)9"B``(``A0``&(8)9"B``,``A8`
+M`&(8)8R"`!2L0T"`/`(H`#1"`#FOH@`8DZ,`&">E`!B0H@`!``(2``!B&"60
+MH@`"``(4``!B&"60H@`#``(6``!B&"6,@@`4K$-`@#P"4Q8T0@@DKZ(`').C
+M`!PGI0`<D*(``0`"$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``8A@EC((`
+M%*Q#0(`\`N68-$(%>:^B`""3HP`@)Z4`()"B``$``A(``&(8)9"B``(``A0`
+M`&(8)9"B``,``A8``&(8)8R"`!2L0T"`/`(`'31"[_^OH@`DDZ,`)">E`"20
+MH@`!``(2``!B&"60H@`"``(4``!B&"60H@`#``(6``!B&"6,@@`4K$-`@#P"
+M&JHT0KY`KZ(`*).C`"@GI0`HD*(``0`"$@``8A@ED*(``@`"%```8A@ED*(`
+M`P`"%@``8A@EC((`%*Q#0(`\`KX0-$)55*^B`"R3HP`L)Z4`+)"B``$``A(`
+M`&(8)9"B``(``A0``&(8)9"B``,``A8``&(8)8R"`!2L0T"`/`(`#C1",`>O
+MH@`PDZ,`,">E`#"0H@`!``(2``!B&"60H@`"``(4``!B&"60H@`#``(6``!B
+M&"6,@@`4K$-`@*^@`#23HP`T)Z4`-)"B``$``A(``&(8)9"B``(``A0``&(8
+M)9"B``,``A8``&(8)8R"`!2L0T"$`^``"">]`#@GO?_8K[\`((R"`!0T`X``
+M`$,0(20#'!:L0QC0```8)30&@``\!0`!C((`%`!&$"&L11B`)&,``2AB``@4
+M0/_Z`````(R"`!0T`X```$,0(8Q$'```!"8"``09`C"$``\`!"$`/`(``"1"
+M````9"`E`$#X"20%``B/OP`@`^``"">]`"@GO?^(K[\`<`"`8"4!@#@E)`+_
+MR:^B`!"OH@`4KZ(`&*^B`!PD`O_"KZ(`("0"__*OH@`HKZ(`+*^B`#"OH@`T
+M)`+_]*^B`#@D`O_`KZ(`0*^B`$2OH@!(KZ(`3"0"_[JOH@!0)`+_LJ^B`%BO
+MH@!<KZ(`8*^B`&0D`O^PKZ(`:```*"4GJP`0).8`!">J`"@GJ0!`)Z@`6``%
+M&(``9R`A`6,0(8Q"``"L@D8H`&8@(0%#$"&,0@``K()&.`!G("$!(Q`AC$(`
+M`*R"1E``9B`A`0,8(8QB``"L@D9@)*4``2BB``440/_L/`(``"1"```!@"`E
+M`$#X"20%``&/OP!P`^``"">]`'@`!2A``*8H(0`%*$``I"@A`^``")2B%?XG
+MO?_0K[\`**^U`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`@"4`P)`E`."8)8^T
+M`$`PM?__/!$``"8Q```\!0``)*4"$`(@^`DD!A)PKA(`#*X3`!"N%``4IA4!
+MR*8``<HD`@`_I@(!_*X``@"N`"^\K@`OP#P""`"N`B_,)`('@:X"+]2N`"_<
+M/`(`/S1"/S^N`B_@)`(`9*X"+^0D`@`"K@(OZ"0"__^N`B_XK@(O_*X",``F
+M!"P\/`4``"2E%)`"(/@))`8`!J(`,`2/OP`HC[4`)(^T`""/LP`<C[(`&(^Q
+M`!2/L``0`^``"">]`#`PA`#_,*4`_P``,"4\`@``)$D4F#P"```D2!29/`(`
+M`"1'%)H`!A!``$88(0!I$"&00@``%$0`"0!H$"&00@```*(0*Q1```4`9Q`A
+MD$,```!E&"L08``%)`(``23&``$LP@`$%$#_[P``$"4#X``(`````">]_X"O
+MOP!\K[8`>*^U`'2OM`!PK[,`;*^R`&BOL0!DK[``8`"@D"4`P)@E`."()8^V
+M`)`PD/__/`(``"1"````0/@))`1&J`!`H"46@``$`@`H)20#``(0``(GKL,`
+M`*^Q`!"OM@`4/`(``"1"```"@"`E`D`P)0!`^`D"8#@E`H"8)3P"```D0@``
+M`H`@)0``*"4`0/@))`8``11```,D`@`#$``""Z^B`%R.8@`4C$)`(*^B`$R3
+MHP!,)Z0`3)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)3!D
+M`/\`!!$"KF(!S#!C``^F8P'0/`(``"1"95B29`'/`$#X"9)E`=$40``$/`(`
+M`"0"``T0``'NKZ(`7"1"```"8"`E`$#X"0``*"440``$-`.``"0"``,0``'E
+MKZ(`7(YB`!0`0Q`AC$(8&*9B`=*.8P',)`(`"1!B``<D`@`*%&(`"CP"``"6
+M8@'0+$(`!!!```8\`@``/`(``"1"8$``0/@)`F`@)3P"```D0@```$#X"0)@
+M("440``#)`(`#A```<NOH@!<CF(!S"Q"``440``>`````(YB`!2,0D`0KZ(`
+M4).C`%`GI`!0D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+M-&,0`*^C`%23HP!4)Z0`5)""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8)8YB`!2L0T`0CF(`%#0#@```0Q`A)`,`!ZQ#&``\`@``)$(```!`
+M^`D"8"`EIF(!U#!#`/`D`@`P$&(`.2AB`#$00``()`(`8"0"`!`08@`T)`(`
+M(!!B`#(`````$```#99B`=008@`N*&(`81!```8D`@"@)`(`4!!B`"D`````
+M$```!)9B`=008@`E`````)9B`=040``B)`(`!8YC`<P48@`'/`(`"8YC`=`T
+M0@!#%&(``R0"`$80```9IF(!U(YB`<PX0P`'+&,``3A"``LL0@`!`&(8)1!@
+M``,D`@!1$```#Z9B`=2.8P',)`0`"A!D``DD`@`)$&(`""0"`&(49``,)`(`
+M"99B`=`L0@`$$$``!20"``HD`@!BIF(!U(YC`<PD`@`*$&(`%R0"``F.8P',
+M$&(`%"0"``H48@`%`````)9B`=`L0@`$%$``#SP"``"68P'4,&(`\"1"_]`L
+M0@!`$$``"3P"```P8@`/+$(`!1!```4\`@``)`(`#1```4JOH@!</`(``"1"
+M```"8"`E)`4`P0!`^`DGI@!(%$``!)>B`$@D`@`($``!/Z^B`%PL0C`"$$``
+M!)>B`$@D`@`%$``!.:^B`%RF@A)PCF(`%(Q"0!"OH@!8DZ(`6#!$`!@`!"#"
+M)`(``A""`!(D`@`#%((`!"0"``DD`@`*$``!*J^B`%R.8P',$&(`"B0"``H4
+M8@`&`````)9B`=`L0@`$%$``!3P"```D`@`*$``!'J^B`%P\`@``)$(```)@
+M("4D!0`_`$#X"2>F`$@40``$EZ(`2"0"``@0``$3KZ(`7*:"$G(\`@``)$(`
+M``)@("4D!0`<`$#X"2>F`$@40``$EZ(`2"0"``@0``$'KZ(`7!!``!&7H@!(
+M,%'_\``1BP`\`@``)$(```)@("4D!0`;`$#X"2>F`$@40``$EZ(`2"0"``@0
+M``#XKZ(`7`(BB"40```")C'_0"01`T```(`E$B``#@``D"4\`@``)%4```)@
+M("4F!0#``J#X"2>F`$@00`#GEZ(`2`)"D"8F$``!`A$0*Q1`__<"8"`E-`+_
+M_Q)"``,D`@`'$```WZ^B`%PD`@`*IH(3YB0"``.F@A7P``"`)20$`#0FA@`&
+M)`,`"W($*`(`IA`AI$,3Z"80``$N`@`*%$#_^W($*`(``(`E/`(``"1+%(`F
+MB``"/`(``"1*%(@D"0`T)H<`#"0%``LFA@`(`!`80`!T("$`:Q`AE$(``*2"
+M%?@`:"`A`&H8(91B``"D@A7P<@D8`@!G$"&D11:H`&88(280``$N`@`#%$#_
+M\*1E%A`\`@``)$(```)@("4`0/@))H42<!1```,D`@`($```K*^B`%R6@A)P
+M+$)0`Q!``!,D!``*CF,!S!!D``DD`@`)$&(`""0"!F@49``,`````)9B`=`L
+M0@`$$$``"``````D`@9HIH(6`"0"!+"F@A8$-`*``*:"%@BF@A7^EH(2BA!`
+M`",D`P`0EF(!U#!"`/`40P`@/`(``(YB`!0T`X```$,0(20#0`>L0Q@`/`(`
+M`"1"````0/@))`0'T#P"```D0@```$#X"0)@("6F8@'6CF(`%#0#@```0Q`A
+M)`,`!ZQ#&``\`@``)$(```!`^`DD!`?0EF(!UC!"`/`D`P`@$$,``R0"``T0
+M``!QKZ(`7#P"```D0@```F`@)20%`+\`0/@))Z8`2!1```27H@!()`(`"!``
+M`&:OH@!<IH(2=*9B`@@\`@``)$(```!`^`D"8"`E%$```R0"``@0``!<KZ(`
+M7(YC`<PD!``*$&0`"@``*"4D`@`)$&(`""0"``T49``(`````)9B`=`L0@`$
+M$$``!``````D`@`-$```&:^B`%R.8@',.$,`!RQC``$X0@`++$(``0!B&"40
+M8``#)`(`#1````^OH@!<EF(!U#!"`/`D0O_0+$(`0!!```,\`@``$````R1"
+M```\`@``)$(```)@("4`0/@))Z4`7`!`*"40H``R`````(Z"+,2N8@'`/`(`
+M`"1"````0/@)`F`@)0``D"4``(`E)!4`'SP"```D40```F`@)0*P*","(/@)
+M)Z8`2!!``!R7H@!(`D*0(0`0&$``="`A``(2`J""+#``@!@EDZ(`2:!B+#$F
+M$``!+@(``Q1`_^\N0P`!/`(``C1"__T"0A`F+$(``0!B&"408``$/`(``"0"
+M``D0```+KZ(`7"1"8T@`0/@)`F`@)1````\"8!`E)`(`"!````.OH@!<)`(`
+M"*^B`%P2@``$/`(``"1"````0/@)`H`@)1+```*/H@!<KL(`````$"6/OP!\
+MC[8`>(^U`'2/M`!PC[,`;(^R`&B/L0!DC[``8`/@``@GO0"`)[W_Z*^_`!2O
+ML``0/`(``"1"````0/@)`("`)8X"+*@00``#``````!`^`D"`"`E/`(``"1"
+M````0/@)`@`@)3P"```D0@```@`@)20%``$`0/@))`8``3P"```D0@```@`@
+M)0!`^`DF!1)P/`(``"1"````0/@)`@`@)8^_`!2/L``0`^``"">]`!@GO?^@
+MK[\`6`"`4"4T`H``KZ(`$#0"F""OH@`4/`)5531"556OH@`@/`*JJC1"JJJO
+MH@`D/`)F9C1"9F:OH@`H/`*9F31"F9FOH@`L``!@)2>X`!`GKP`8)ZX`0">M
+M`%0`#!B``P,0(8Q$```D@L``+$(0`!!``"(!XR@AC4(`%`!$$"&,0@``KZ(`
+M0).C`$"1P@`!``(2``!B&"61P@`"``(4``!B&"61P@`#``(6`!```!8`8A`E
+MC$(``*^B`%23I`!4D:(``0`"$@``@B`ED:(``@`"%```@B`ED:(``P`"%@``
+M@B`EC4(`%(QC````0Q`AK$0``!```'\EC``!C4(`%`!$$"&,0@``K*(`````
+M0"4D@L``+$D0`">G`$@GI@!$``@4`!4@`!4`2"@EC4(`%`!$$"&L10``$2``
+M'P````"-0@`4`$00(8Q"``"OH@!(DZ,`2)#B``$``A(``&(8)9#B``(``A0`
+M`&(8)9#B``,``A8`$```$P!B&"6OI0!$DZ,`1)#"``$``A(``&(8)9#"``(`
+M`A0``&(8)9#"``,``A8``&(8)8U"`!0`1!`A$`#_X:Q#``"-0@`4`$00(8Q#
+M```490!3```0)24(``$I`@$`%$#_TP`(%````$`E)ZL`("2"P``L21``)Z<`
+M4">F`$P`"!"``6(0(14@`!6,10``C4(`%`!$$"&L10``$2``'P````"-0@`4
+M`$00(8Q"``"OH@!0DZ,`4)#B``$``A(``&(8)9#B``(``A0``&(8)9#B``,`
+M`A8`$```$P!B&"6OI0!,DZ,`3)#"``$``A(``&(8)9#"``(``A0``&(8)9#"
+M``,``A8``&(8)8U"`!0`1!`A$`#_X:Q#``"-0@`4`$00(8Q#```4HP`=```0
+M)24(``$I`@`$%$#_T@`($(``#""``P08(8QB```D0L``+$(0`!1`_WH!Y!`A
+M`(`8)0,#$"&-1``4C$(```""("$!XQ@AC&(``*R"```EC``!*8(``A1`_UD`
+M#!B`/`(``"1"````0/@))`0`9"0"``&/OP!8`^``"">]`&`PI?__,*(!`!!`
+M``8D`A,SI,(``"0"%]2DX@```^``""0"``$PH@"`$$``#0````"4@A**%$``
+M!20""0B4@A*,$$``!P`````D`@D(I,(``"0""JRDX@```^``""0"``$#X``(
+M```0)2>]_]"OOP`HK[,`)*^R`""OL0`<K[``&`"`D"4"0)@E`D"():>@`!"6
+M0A)P+$)0`11```<F4`'@CD(!H"0%`,D`0/@))Z8`$!!``3Z/OP`HED(!U#!"
+M`/`D`P!`%$,``Y>B`!"F8!*&EZ(`$!1```LD`@`'CD,!S!1B``@D`@`(ED,!
+MT!1B``4D`@`%IZ(`$"0"``&F8A)VIF(2>(XC`=PD`@`&$&(`$"0"<&66(P'*
+M%&(`#0````"6(P(()&+_G"Q"``(00``$)`(`021B``40```%IB("")8C`@@4
+M8@`")`(`0Z8B`@BN```$EF(2AA!```8D`@`!K@(`!)9B$G840``")`(``ZX"
+M``268A**$$``!`````".`@`$-$(`!*X"``268A*,$$``#"0"#A&6(P'*$&(`
+M"B0""0B.`P`$-&(`"*X"``268A)X%$``!"0""0@T8@`HK@(`!"0""0BF`@`0
+MED(!U#!"`/`D0O_0+$(`0!1``!4D`@G$CD0!S#B#``<L8P`!.((`"RQ"``$`
+M8A@E%&``#20""<0D`P`*$(,`"20"``D0@@`()`()Q!2#``@D`@JLED(!T"Q"
+M``000``$)`(*K"0""<00```"I@(`$J8"`!(D`A,SI@(`#"0"%]2F`@`.C@(`
+M`#P#__TT8___`$,0)#P#``$`0Q`EK@(``)>B`!`P0@`"%$``#```("6.0P',
+M+&(`!A!```<D`@`%%&(`!P`$%("60@'0+$(`!!1```,`!!2`)`0``0`$%(".
+M!````$00)CP#``0`0Q`D`((@)CP"_]\T0O__`((@)#P"`!``@B`EEZ(`$``"
+M$$(X0@`!,$(``0`"%8``1!`F/`,`0`!#$"0`@B`FK@0``(Y"`<PL0@`'%$``
+M!3P#__<\`@`(`((0)1````6N`@``C@(``#1C__\`0Q`DK@(``(X"```\`X``
+M`$,0)3P#0```0Q`EK@(``)8B`=`L0@`"$$``!9>B`!".0P',)`(`"Q1B`"F7
+MH@`0,$(``11```0``!@EC@(`!#!"``D``A@K``,70(X$````1!`F/`,@``!#
+M$"0`@B`FEZ(`$``"$,(X0@`!,$(``0`"%P``1!`F/`,0``!#$"0`@B`FK@0`
+M`)>B`!`P0@`$%$``!```&"6.`@`$,$(`"0`"&"L``Q[`C@(```!B&"8\!`@`
+M`&08)`!#$"8\`P0``$,0)3P#`0``0Q`EK@(``(X"```\`_W_-&/__P!#$"2N
+M`@``CF(3.!!```0``!@ECF(3/!1```,``Q7`)`,``0`#%<".`P```$,0)CP$
+M`(``1!`D`&(8)C1C\`"N`P``CB,!S"0"``448@`$)`(`")8C`=`08@`%````
+M`(XB`<PL0@`&%$``!9>B`!".`@``-$((`*X"``"7H@`0,$(!\!!```,``A$"
+M$````Z8"``@D`@`*I@(`")>B`!`P0O``$$``!0`"&P(D`@`!`&(0!!````.F
+M`@`*)`(`@*8"``J60@'4,$(`\"1"_]`L0@!`$$``!20#^_^.`@``-$(&`!``
+M``:N`@``C@(```!#$"0D`_W_`$,0)*X"``"68A)Z$$``"P)`("6.0@&@)`4`
+M#P!`^`DF)A)($$``!20"``&N(A),C@(``#1"`0"N`@``CD(!S"Q"``6N(A)H
+MCD,!S"0"``448@`%```@)99#`=`D`@`)$&(`!0````".0@',+$(`!A1```,`
+M!!'`)`0``0`$$<".`P```$,0)C!"`(``8A@FK@,``"0"``^N`@`4)`(``8^_
+M`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`#`GO?_@K[\`&#P"```D0@```$#X
+M"2>E`!`D`@`!C[\`&`/@``@GO0`@)`(``12B``4\`@``/`(``"1"```#X``(
+MK((`<"1">&`#X``(K((`<">]_\"OOP`\K[(`.*^Q`#2OL``P`("`)0"@B"6.
+M`@`4-`.```!#$"&.(P`$K$,`*(X"`!0T`X```$,0(8XC``RL0P`LC@(`%#0#
+M@```0Q`ACB,`$*Q#`#".`@`4-`.```!#$"&.(P`(K$,`-(XB```\$@$``%(0
+M)!!```T\`@``)$(```!`^`DGI0`0C@(2-```("4``"@EK$0`**Q%`"R.`@`4
+M-`.```!#$"&L4@`@C@(`%#0#@```0Q`ACB,``*Q#`""/OP`\C[(`.(^Q`#2/
+ML``P`^``"">]`$`GO?_0K[\`**^E`!2,@P'<)`(``1!B``DT`O__$&``#3P"
+M```D`@`&$&(`"20"``@48@`2)*(``30"__^OH@`</`(`!S1"__\0```+KZ(`
+M(#P"``",0@```*(0(P`"$,"OH@`</`(``(Q"````HA`C``(0P*^B`"`DH@`!
+MKZ(`&#P"`8`T0O__`,(0)*^B`!`\`@``)$(```!`^`DGI0`0C[\`*`/@``@G
+MO0`P)[W_\(R"`!0T`X```$,0(:Q``"B,A0`4-`*```"B*"&,H@`$/`,`!`!#
+M$"4\`__/-&/__P!#$"2LH@`$C((`%#0#@```0Q`A-`/__ZQ#`"`#X``()[T`
+M$">]__``@$`EE*(`$A!``!H!`#@EC00`%#0"@```@B`AC((`!#P#`!``0Q`E
+MK((`!(T"`!0T`X```$,0(92C`!"L0P`DC0(`%#0#@```0Q`AE*,`$JQ#`#B-
+M`P`4-`*```!B&"&,H@`4``(0P*QB`#`0```*C0(`%(T$`!0T`H```((@(8R"
+M``0\`__O-&/__P!#$"2L@@`$C0(`%#0#@```0Q`AC*,``*Q#`"B-`P`4-`*`
+M``!B,"&,P@`@/`/_@`!#$"24HP`*`$,@)92B`!@00``%)$(`!``"%``\`P!_
+M`$,0)`""("6LQ``@C.0OU#P"__\T0@#_`((@))2B`!H``A(`,$+_``""("6L
+MY"_4C0(`%#0#@```0Q`AK$0`&)2G``J,HP`<`.,0*SA"````8C@+C*8`#`##
+M$"LX0@```&(P"Q3F``,`````$````HRI``2,J0``C*(`!(T$`!0T`X```(,@
+M(21"__T``A#`/`,`!S1C__\`0Q`D/`,*&`!#$"6L@@#4C00`%#0"@```@B`A
+M)2+__0`"$,`\`P`'-&/__P!#$"0\`PH``$,0):R"`-B-!``4-`*```""("$P
+MXO__``8<``!#$"6L@@#<`^``"">]`!```````````">]_]"OOP`HK[$`)*^P
+M`"``@(`E`,"()8X"`!2L16``C@,`%"0"``&L8F`(/`(``"1"```D!6`,)`8`
+M`P!`^`DD!P`"$$``!H^_`"B.`@`4C$)@!*8B```D`@`!C[\`*(^Q`"2/L``@
+M`^``"">]`#`GO?_(C(8`%(S"0!2OH@`PDZ,`,">D`#"0@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"4`!2A`)`(``P"B$`0`8A@EKZ,`-).C
+M`#0GI``TD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EK,-`
+M%"0"``$#X``()[T`.">]_\B,A@`4C,)`%*^B`#"3HP`P)Z0`,)""``$``A(`
+M`&(8)9""``(``A0``&(8)9""``,``A8``&(8)0`%*$`D`@`#`*(0!``"$"<`
+M8A@DKZ,`-).C`#0GI``TD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"
+M%@``8A@EK,-`%"0"``$#X``()[T`.">]_^B,AP`4C.)`&*^B`!"3HP`0)Z0`
+M$)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)20"``$`HA`$
+M``(0)P!B&"0PQ@`!`*8P!`!F&"6OHP`4DZ,`%">D`!20@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6LXT`8)`(``0/@``@GO0`8+*(`!A!`
+M``DGO?_HC((`%(Q"0!ROH@`0DZ(`$#!"`"\`HA`&$````C!"``$D`O__`^``
+M"">]`!@GO?_0K[\`*`"`."6,X@`4C$)`%*^B`""3HP`@)Z0`()""``$``A(`
+M`&(8)9""``(``A0``&(8)9""``,``A8``&(@)0`%$$`D`P`#`$,8!#P"``$T
+M0O```$,0)P""("0`!2L``(4@)1#```,TA(``/`(``0""("6OI``DDZ,`)">D
+M`"20@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6,X@`4K$-`
+M%(SC+$0\!0$`/`(``"1"````X"`E`$#X"0!E*"6/OP`H`^``"">]`#``````
+M```````````GO?_HC((`%(Q"0`BOH@`0DZ(`$">D`!"0@P`!``,:``!#$"60
+M@P`"``,<``!#$"60@P`#``,>``!#$"4X0@`!+$(``0/@``@GO0`8`(!`)0"@
+M."4``$@E`0!0)8T#`!2,9@"`/`(`@`#"$"000``6`````(QD`(P\`@$``((0
+M)#P#`"`X0@```&)("SP"(```@A`D$$```CP"`$`!(D@E/`($``""$"000``"
+M/`(`@`$B2"4\`P(``(,0)`$C&"4X0@```&)("XT"`!2,1@#`)`+__Q3"``,`
+M`!`E`^``"*S@```\`@$%-$+8N@#"&"0\`@`(`,(0)!!```2LXP``/`)```!B
+M$"6LX@``,,(`!1!```4PP@7`C.(``#1"``&LX@``,,(%P!!``!<PP@`@C.(`
+M`#1"`$"LX@``C0(`%(Q#`,0P9`/_C4)&H`""("4\!0/_`&48)``#'`(`9!@E
+MK4-&H(T"`!2,0@#(,$0#_P"#("4`11`D``(4`@!$$"6M0D:@,,(`(!!```<`
+M````C0(2:!!```0\`T``C.(```!#$"6LX@``C.(```$B$"6LX@``/`-```!#
+M$"000``-`````*T&$E"-`P`4C&(`Q*T"$E2,8@#(K0(26(QB`,RM`A)<C&(`
+MT*T"$F",8@#4K0(29`/@``@D`@`!`^``"(R"+$0GO?_P`(!`)8T)+$0%(0`%
+M`0`X)8T"`!2L0``DC0(`%(Q"`"0\`@$%-$+8N@"B("0PH@!`$$``#0``,"6,
+MXRS,-((`0`!#(`N,XRS0-((!``!#(`N,XRS4-((`@`!#(`N,XRS8-(($``!#
+M(`LPHP`!-((`!P!#(`L\`@+@`*(0)!!``!8\`@"``((@)3P"`"``HA`D$$``
+M`CP"`0``PC`E/`(`0`"B$"000``"/`(@``#","4\`@"``*(0)!!```(\`@0`
+M`,(P)3P#`@``HQ`D`,,8)3A"````8C`+/`)```"B$"000``"/`(`"`""("6-
+M`@`4K$0`H(T$`!2,@@"L/`-(_S1C__\`0Q`D`$80):R"`*P$H0`$K.4L1(T#
+M`!0D`@`!K&(`)`$@$"4#X``()[T`$````````````^``")2"`>HPH___E((!
+MZ@!B$"L00``@)[W_Z``#*4`DHD@<+$(0`!!``!,``QE`C((`%`"B$"$T`X@<
+M`$,0(8Q"``"OH@`0DZ,`$">D`!"0@@`!``(2``!B&"60@@`"``(4``!B&"60
+M@@`#``(6`!````8`8A`EC((`%`!B&"$T`H@<`&(8(8QB```P0X``%&```B0"
+M``$``!`E`^``"">]`!@GO?^X`(`X)3"E__^4XP'J`*,8*Q!@`84``!`E``49
+M0"1B2!0L0A``$$``[`````",X@`4`&(0(30#B!0`0Q`AC$(``*^B`!"3HP`0
+M)Z0`$)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8`$```WP!B0"6O
+MH``4DZ0`%)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8SB
+M`!0`PA`A-`.(``!#$"&L1```$```V0`%,4"OH``8DZ0`&)!B``$``A(``((@
+M)9!B``(``A0``((@)9!B``,``A8``((@)8SB`!0`PA`A-`.(!`!#$"&L1```
+M$```T@`%,4"OH``<DZ0`')!B``$``A(``((@)9!B``(``A0``((@)9!B``,`
+M`A8``((@)8SB`!0`PA`A-`.("`!#$"&L1```$```RP`%,4"OH``@DZ0`()!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8SB`!0`PA`A-`.(
+M#`!#$"&L1```$```Q``%,4"OH``DDZ0`))!B``$``A(``((@)9!B``(``A0`
+M`((@)9!B``,``A8``((@)8SB`!0`PA`A-`.($`!#$"&L1```$```O0`%,4"O
+MH@`HDZ0`*">C`"B08@`!``(2``""("608@`"``(4``""("608@`#``(6``""
+M("6,X@`4`,(0(30#B!0`0Q`AK$0``!```+8`!3%`KZ``+).D`"R08@`!``(2
+M``""("608@`"``(4``""("608@`#``(6``""("6,X@`4`,(0(30#B!@`0Q`A
+MK$0``!```*\`!3%`KZ``,).D`#"08@`!``(2``""("608@`"``(4``""("60
+M8@`#``(6``""("6,X@`4`,(0(30#B!P`0Q`AK$0``!```*@D`@`$KZ``-).D
+M`#208@`!``(2``""("608@`"``(4``""("608@`#``(6``""("6,X@`4`,(0
+M(30#B```0Q`AK$0``!```*H`!3%`KZ``.).D`#B08@`!``(2``""("608@`"
+M``(4``""("608@`#``(6``""("6,X@`4`,(0(30#B`0`0Q`AK$0``!```*,`
+M!3%`KZ``/).D`#R08@`!``(2``""("608@`"``(4``""("608@`#``(6``""
+M("6,X@`4`,(0(30#B`@`0Q`AK$0``!```)P`!3%`KZ``0).D`$"08@`!``(2
+M``""("608@`"``(4``""("608@`#``(6``""("6,X@`4`,(0(30#B`P`0Q`A
+MK$0``!```)4D`@`!C.(`%`!B&"$T`H@4`&(8(8QH````!3%`),)(`"Q"$``4
+M0/\>)Z,`%(SB`!0`P!@E`&(8(30"B```8A@AK&`````%,4`DPD@$+$(0`!1`
+M_R4GHP`8C.(`%`#`&"4`8A@A-`*(!`!B&"&L8`````4Q0"3"2`@L0A``%$#_
+M+">C`!R,X@`4`,`8)0!B&"$T`H@(`&(8(:Q@````!3%`),)(#"Q"$``40/\S
+M)Z,`((SB`!0`P!@E`&(8(30"B`P`8A@AK&`````%,4`DPD@0+$(0`!1`_SHG
+MHP`DC.(`%`#`&"4`8A@A-`*($`!B&"&L8`````4Q0"3"2!0L0A``%$#_020"
+M``>,XP`4`,`0)0!#$"$T`X@4`$,0(20#``>L0P````4Q0"3"2!@L0A``%$#_
+M2">C`"R,X@`4`,`8)0!B&"$T`H@8`&(8(:Q@````!3%`),)('"Q"$``40/]/
+M)Z,`,(SB`!0`P!@E`&(8(30"B!P`8A@AK&```"0"``05`@`T)`(``8SB+\P\
+M`P@``$,0)!!``"XDH@!`,$7__P`%,4`DPD@`+$(0`!1`_TTGHP`TC.(`%`#`
+M&"4`8A@A-`*(``!B&"&L8`````4Q0"3"2`0L0A``%$#_5">C`#B,X@`4`,`8
+M)0!B&"$T`H@$`&(8(:Q@````!3%`),)(""Q"$``40/];)Z,`/(SB`!0`P!@E
+M`&(8(30"B`@`8A@AK&`````%,4`DPD@,+$(0`!1`_V(GHP!`C.(`%`#`&"4`
+M8A@A-`*(#`!B&"&L8```)`(``0/@``@GO0!()[W_Z`"`0"4PI?__E0,!Z@"C
+M&"L08`!5```0)1#``#D`````D,<`!0`'.@"0P@`$`.(X)9#$``,`!"8`D,(`
+M`@`"%```@B`ED,(``0`"$@``@B`ED,(```""("4`!"!"``<7P`""("40```H
+M``<X0J^D`!"3I``0D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`EC0(`%`#"$"$T`X@8`$,0(:Q$```0```B``4Q0*^B`!23I``4)Z,`%)!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8T"`!0`PA`A-`.(
+M'`!#$"&L1```$```&R0"``$``#@E```@)0`%,4`DPD@8+$(0`!1`_]4GHP`0
+MC0(`%`#`&"4`8A@A-`*(&`!B&"&L9`````4Q0"3"2!PL0A``%$#_W#3B@`"-
+M`P`4`,`0)0!#$"$T`X@<`$,0(33C@`"L0P``)`(``0/@``@GO0`8)[W_:*^_
+M`)2OM@"0K[4`C*^T`(BOLP"$K[(`@*^Q`'ROL`!X`("0)0#`@"4`X#`ECZ,`
+MJ#"Q__\"0+`E)D0!X#P"JJHT0JJJ`$!()0`#2`J60P'J`B,8*Q!@`RP``!`E
+MD@,``"QB``800`,H```0)3P"```D0A2P``,8@`!B&"&,8@```$``"``````0
+M``"5)`L`!8R#```\`@`$`&(8)!!@`QH``!`E$```CB0+``:.0B_,/`,(``!#
+M$"000`"))`L`!"8B`$"4@P`*`$,0*A1``(0``!`E$``##8^_`)26`P`"+&,`
+M!11@`P@``!`EE@(``BQ"``840`!Z``!8)98"``(L0@`.)`0``R0#``$`8%@E
+M$```<P""6`H0``!Q)`L`!Q```OD``!`EKZ(`().D`"`GHP`@D&(``0`"$@``
+M@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$B$"$T`X@``$,0(:Q$
+M```0``"B`!%)0*^B`"23I``D)Z,`))!B``$``A(``((@)9!B``(``A0``((@
+M)9!B``,``A8``((@)8Y"`!0!(A`A-`.(!`!#$"&L1```$```FP`124"OJ``H
+MDZ0`*)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0!
+M(A`A-`.("`!#$"&L1```$```E``104"OJ@`LDZ0`+)!B``$``A(``((@)9!B
+M``(``A0``((@)9!B``,``A8``((@)8Y"`!0!`A`A-`.(#`!#$"&L1```$```
+MC0`104"OI0`PDZ0`,)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8`
+M`((@)8Y"`!0!`A`A-`.($`!#$"&L1```$```A@`1*4"OJP`TDZ0`-)!B``$`
+M`A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0`HA`A-`.(%`!#
+M$"&L1```$```?SP"``"2%``$D@(`!0`"$@`"@J`ED@(`!@`"%``"@J`ED@(`
+M!P`"%@`"@J`E`HF@)I(#``B2`@`)``(2``!BJ"4"J:@F,K7__Y((``J2`@`+
+M``(2``$"0"62`@`,``(4``$"0"62`@`-``(6``$"0"4!"4`FD@,`#I("``\`
+M`A(``&)0)0%)4":2!0`0D@(`$0`"$@``HB@ED@(`$@`"%```HB@ED@(`$P`"
+M%@``HB@E`*DH)I8"``(L0@`.,*,`_P!B*`LD`@`$%6("$#%*__^.0B_,/`,(
+M``!#$"000`(+)B(`0#!3__\`$4E`)2)(`"Q"$``40/]5`!00)XY#`!0!(!`E
+M`$,0(30#B```0Q`A`!08)ZQ#````$4E`)2)(!"Q"$``40/]<`!40)XY#`!0!
+M(!`E`$,0(30#B`0`0Q`A`!48)ZQ#````$4E`)2)(""Q"$``40/]C)Z,`*(Y"
+M`!0!(!@E`&(8(30"B`@`8A@AK&@````104`E`D@,+$(0`!1`_VHGHP`LCD(`
+M%`$`&"4`8A@A-`*(#`!B&"&L:@```!%!0"4"2!`L0A``%$#_<2>C`#".0@`4
+M`0`8)0!B&"$T`H@0`&(8(:QE````$2E`)*)(%"Q"$``40/]X)Z,`-(Y"`!0`
+MH!@E`&(8(30"B!0`8A@AK&L``#P"```D0@```D`@)0!`^`D"("@ED@0`%)("
+M`!4``A(``((@)9("`!8``A0``((@)9("`!<``A8``((@)9(%`!B2`@`9``(2
+M``"B*"62`@`:``(4``"B*"62`@`;``(6``"B*"6.PB_0,$(`!!!``34`````
+MD@,`'I("`!\``A(``&)`)9(#`!R2`@`=``(2``!B2"62!@`@D@(`(0`"$@``
+MPC`ED@(`(@`"%```PC`ED@(`(P`"%@`0``$E`,(P):^D`#B3I``XD&(``0`"
+M$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`#B$"$T`X@``$,0
+M(:Q$```0``$?`!,Y0*^H`#R3I``\D&(``0`"$@``@B`ED&(``@`"%```@B`E
+MD&(``P`"%@``@B`ECD(`%`#B$"$T`X@$`$,0(:Q$```0``$8`!,Y0*^E`$"3
+MI`!`D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`#B
+M$"$T`X@(`$,0(:Q$```0``$1`!,I0*^I`$23I`!$D&(``0`"$@``@B`ED&(`
+M`@`"%```@B`ED&(``P`"%@``@B`ECD(`%`"B$"$T`X@,`$,0(:Q$```0``$*
+M`!,I0*^F`$B3I`!(D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`ECD(`%`"B$"$T`X@0`$,0(:Q$```0``$#`!,I0*^B`$R3I`!,)Z,`3)!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0`HA`A-`.(
+M%`!#$"&L1```$```_``3*4"OH`!0DZ0`4)!B``$``A(``((@)9!B``(``A0`
+M`((@)9!B``,``A8``((@)8Y"`!0`HA`A-`.(&`!#$"&L1```$```]0`3*4"O
+MH`!4DZ0`5)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"
+M`!0`HA`A-`.('`!#$"&L1```$```[@`1*4"OM`!8DZ0`6)!B``$``A(``((@
+M)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0`HA`A-`.(``!#$"&L1```
+M$```YP`1*4"OM0!<DZ0`7)!B``$``A(``((@)9!B``(``A0``((@)9!B``,`
+M`A8``((@)8Y"`!0`HA`A-`.(!`!#$"&L1```$``!*20"``&OM`!@DZ0`8)!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0!(A`A-`.(
+M``!#$"&L1```$```VP`124"OM0!DDZ0`9)!B``$``A(``((@)9!B``(``A0`
+M`((@)9!B``,``A8``((@)8Y"`!0!(A`A-`.(!`!#$"&L1```$```U``124"O
+MJ`!HDZ0`:)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"
+M`!0!(A`A-`.("`!#$"&L1```$```S0`104"OJ@!LDZ0`;)!B``$``A(``((@
+M)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0!`A`A-`.(#`!#$"&L1```
+M$```Q@`104"OI0!PDZ0`<)!B``$``A(``((@)9!B``(``A0``((@)9!B``,`
+M`A8``((@)8Y"`!0!`A`A-`.($`!#$"&L1```$```OP`1*4"OJP!TDZ0`=)!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8Y"`!0`HA`A-`.(
+M%`!#$"&L1```$```N#P"`````#`E``!()0``0"4`$SE`).)(`"Q"$``40/[8
+M)Z,`.(Y"`!0`X!@E`&(8(30"B```8A@AK&0````3.4`DXD@$+$(0`!1`_M\G
+MHP`\CD(`%`#@&"4`8A@A-`*(!`!B&"&L:````!,Y0"3B2`@L0A``%$#^YB>C
+M`$".0@`4`.`8)0!B&"$T`H@(`&(8(:QE````$RE`)*)(#"Q"$``40/[M)Z,`
+M1(Y"`!0`H!@E`&(8(30"B`P`8A@AK&D````3*4`DHD@0+$(0`!1`_O0GHP!(
+MCD(`%`"@&"4`8A@A-`*($`!B&"&L9@```!,I0"2B2!0L0A``%$#^^R0"``>.
+M0P`4`*`0)0!#$"$T`X@4`$,0(20#``>L0P```!,I0"2B2!@L0A``%$#_`B>C
+M`%".0@`4`*`8)0!B&"$T`H@8`&(8(:Q@````$RE`)*)('"Q"$``40/\))Z,`
+M5(Y"`!0`H!@E`&(8(30"B!P`8A@AK&`````1*4`DHD@`+$(0`!1`_Q`GHP!8
+MCD(`%`"@&"4`8A@A-`*(``!B&"&L=````!$I0"2B2`0L0A``%$#_%R>C`%R.
+M0@`4`*`8)0!B&"$T`H@$`&(8(:QU```0``!))`(``0`124`E(D@`+$(0`!1`
+M_QPGHP!@CD(`%`$@&"4`8A@A-`*(``!B&"&L=````!%)0"4B2`0L0A``%$#_
+M(R>C`&2.0@`4`2`8)0!B&"$T`H@$`&(8(:QU````$4E`)2)(""Q"$``40/\J
+M)Z,`:(Y"`!0!(!@E`&(8(30"B`@`8A@AK&@````104`E`D@,+$(0`!1`_S$G
+MHP!LCD(`%`$`&"4`8A@A-`*(#`!B&"&L:@```!%!0"4"2!`L0A``%$#_.">C
+M`'".0@`4`0`8)0!B&"$T`H@0`&(8(:QE````$2E`)*)(%"Q"$``40/\_)Z,`
+M=(Y"`!0`H!@E`&(8(30"B!0`8A@AK&L``#P"```D0@```D`@)0!`^`D"("@E
+M)`(``8^_`)2/M@"0C[4`C(^T`(B/LP"$C[(`@(^Q`'R/L`!X`^``"">]`)@G
+MO?_HK[\`$"2#+#`\`@``)$(```"@("4`8"@E`$#X"20&``:/OP`0`^``"">]
+M`!@GO?_HK[\`$#P"```D0@``)(0L,`!`^`DD!@`&)`(``8^_`!`#X``()[T`
+M&">]_^BOOP`0)(,L/#P"```D0@```*`@)0!@*"4`0/@))`8`!H^_`!`#X``(
+M)[T`&">]_]"OOP`HK[$`)*^P`"``@(@E`B"`)3P"```D0@``)@0L/`!`^`DD
+M!@`&C@0`%#0"@```@B`AD@,L/)("+#T``A(``&(8)9("+#X``A0``&(8)9("
+M+#\``A8``&(8):R#`.".)``4-`*```""("&2`RQ`D@(L00`"$@``8A@EK(,`
+MY"0"``&/OP`HC[$`)(^P`"`#X``()[T`,#"E__^4@@(($$4`!B0#``R4@A)R
+M,$(`@"0$``,D`P`+`((8"A#```(`````K,,```/@``@``!`E`(`P)92"$H80
+M0``%```H)20%``&4@Q)V)`(`0P!#*`J4@A**-*,`!`!B*`N4@A*,$$``"0``
+M``"4PP'*)`(.$1!B``4`````-*4`")2#$G@TH@`@`$,H"@/@``@`H!`E)[W_
+MT*^_`"ROL@`HK[$`)*^P`"``@(@EEC`22#(2`!P`$I"",A```@`0@"N.(@&L
+M`$#X"0)`*"6.(P`4-`*```!B&"&,8A@`-$(@`*QB&`".(@&P`B`@)0!`^`D"
+M0"@E+@8``0!0$"8"`C`+CB(!N`(@("4`0/@)`D`H)8^_`"R/L@`HC[$`)(^P
+M`"`#X``()[T`,">]_\B,A@`4C,)`$*^B`#"3HP`P)Z0`,)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8``&(8)3P"__$T0O^?`&(8)#P"```D0A30
+M,*4`!P`%*(``HB@AC*(```!B&"6OHP`TDZ,`-">D`#20@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6LPT`0`^``"">]`#@GO?_0K[\`+*^R
+M`"BOL0`DK[``(`"`D"4PT?__`D"`)3P"```D0@``)@0L-@!`^`DD!@`&C@0`
+M%#0"@```@B`AD@,L-I("+#<``A(``&(8)9("+#@``A0``&(8)9("+#D``A8`
+M`&(8):R#``B.1``4-`*```""("&2`RPZD@(L.P`"$@``8A@E,C$__P`1C```
+M<1@EK(,`#(^_`"R/L@`HC[$`)(^P`"`#X``()[T`,(R$`!0T`H```((@(8R&
+M`$R,@@!0C(0`3`"&,"L`1A`A`$`8)0``$"4``Q`````8)0"`*"4``"`E`$00
+M)0/@``@`91@EC((`%#0#@```0Q`AC$(`3`/@``@`````)[W_\(R#`!0T`H``
+M`&(8(8QE`"`\`@$``*(0):QB`"",@P`4-`*```!B&"$\`@$``*(H):QE`"`#
+MX``()[T`$(R"$C000``I)[W_\)1"``(P0@`@$$``)0``."6,H@``$$``#@``
+M,"4DJ``$`$`H)0$'$"&00P``,&(`@!!```,P8P!_`&80*P!B,`HDYP`!`.40
+M*Q1`__<!!Q`AC(,`%#0"@```8A@AC&4`!!#```@`!A!",$(`_RQ"``,00``$
+M/`("``"B$"40```(K&(`!(R#`!0T`H```&(8(3P"_?\T0O__`*(0)*QB``0#
+MX``()[T`$(R"`!0T`X```$,0(8Q"&&0``BS",*4!_S"B`0`00``#`````#BE
+M`?\`!2@GC(,`%#0"@```8A@AC&(`4(QC`$P`0Q`F`^``"`!%$"8GO?_H`(`P
+M)8S"`!2,0D`@KZ(`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@E
+MD((``P`"%@``8A@E,&0`_P`$(0(P8P`/C,(!S!1$``0``"@EE,(!T`!#$"8L
+M10`!`*`0)0/@``@GO0`8C(,`%#0&@```9A@AC*(``(QC`)``0Q`AK*(``(R"
+M`!0`1A`AC*,`!(Q"`(P`8A@AK*,`!(R"`!0`1A`AC*,`#(Q"`)0`8A@AK*,`
+M#(R"`!0`1A`AC*,`"(Q"`(@`8A@AK*,`"(R"`!0`1A`AC*,`$(Q"`)@`8A@A
+M`^``"*RC`!`#X``()`(``8R"`!0T`X```$,0(8Q"'!P#X``(,$(`_XR"`!0T
+M`X```$,0(8Q"`%@#X``(,$(`!R>]__",@@`4-`.```!#$"$PI0`'K$4`6`/@
+M``@GO0`0`^``"(R"+[PGO?_HK[\`$(R&$C04P``#)`(``1````6LA2^\/`(`
+M`"1"````0/@)`````(^_`!`#X``()[T`&`/@``@D`@`!)[W_T*^_`"ROL@`H
+MK[$`)*^P`"``@(@E`*"`)2X"``840``(`B"0)3P"```D0@```$#X"30%__\`
+M4!`K$$``!0(@("4D`O__KD(O^!````D``!`E/`(``"1"````0/@)`@`H)8XC
+M`!2L8A!PKE`O^"0"``&/OP`LC[(`*(^Q`"2/L``@`^``"">]`#`GO?_HK[\`
+M$(R"`!2,11!P/`(``"1"````0/@),*7__X^_`!`#X``()[T`&">]_]"OOP`L
+MK[(`**^Q`"2OL``@`("`)0"@B"4"`)`E/`(``"1"````0/@))`4__P!1$"L0
+M0``%`@`@)20"__^N0B_\$```$```$"4\`@``)$(```!`^`D"("@EC@4`%#0#
+M@```HR@AC*,`%"0$P```9!@D,$(__P!B&"6LHP`4KE$O_"0"``&/OP`LC[(`
+M*(^Q`"2/L``@`^``"">]`#`GO?_HK[\`$(R"`!0T`X```$,0(8Q%`!0\`@``
+M)$(```!`^`DPI3__C[\`$`/@``@GO0`8D((OS#A"``$#X``(,$(``2>]__`0
+MH``-`(`P)8S$`!0T`H```((@(8R"``0\`_[_-&/__P!#$"2L@@`$C,(OS`!#
+M$"00```+K,(OS(R$`!0T`H```((@(8R"``0\`P$``$,0):R"``2,PB_,`$,0
+M):S"+\PD`@`!`^``"">]`!`GO?_0K[\`+*^R`"BOL0`DK[``(`"`@"4`H(@E
+M`@"0)3P"```D0@```$#X"20%/_\`41`K$$``!0(`("4D`O__KD(P`!```!,`
+M`!`E/`(``"1"````0/@)`B`H)8X%`!0T`X```*,H(8RD`!0\`\``-&/__P"#
+M("0``A0`/`,__P!#$"0`@B`EK*0`%*Y1,``D`@`!C[\`+(^R`"B/L0`DC[``
+M(`/@``@GO0`P)[W_Z*^_`!",@@`4-`.```!#$"&,10`4``4L`CP"```D0@``
+M`$#X"3"E/_^/OP`0`^``"">]`!@GO?_P,*7__P"`."4LHP"`$&``"20"``R,
+M@@`4K$4$`(R#`!0`!A`KK&($!`"G$"&@1B\X```0)0/@``@GO0`0)[W_T*^_
+M`"BOL0`DK[``(`"`B"4PL`#_$,``0*(P$C@R`@#_$$``/20#`4".(A(TE$(`
+M`C!"`4`40P`X/`(``"1"````0/@))`4``0!`*"6.(A(TE$(``C!"0``00``*
+M``480G(#(`(`!!!``((@(22$`01R`S`"`$80(0`"$$`0```7)$8-K(XB$C24
+M0@`",$*``!!```H`!1B"<@,@`@`$$$``@B`A)(0`TG(#,`(`1A`A``(00!``
+M``DD1@U(<@4@`@`$$$``@B`A)(0!:'(%,`(`1A`A``(00"1&#F!R!1@"``,0
+M0`!B&"$D8P/H,&,__XXB`!2L1!!PCB(`%*Q&$+".)``4-`*```""("$``Q0`
+M`$,0):R"`!2/OP`HC[$`)(^P`"`#X``()[T`,">]_^BOOP`0/`(``"1"````
+M0/@)C(4!W(^_`!`#X``()[T`&`"`,"4D`P`&$*,`!P``$"60PA*3$$```P``
+M("6,PB_H+$0``@"`$"4#X``(`````">]_Y"OOP!LK[``:#P"```D0@```$#X
+M"0"`@"400`"M-`.``(X"`!0`0Q`A)`,`'ZQ#&'".!0`4-`*```"B*"&6`@'4
+M,$(`\"1"_]`L0@!`)`,`&"0$`!0`@A@+K*,9^(X$`!0T`H```((@(8R"`!PD
+M`\!_`$,0)#1"`("L@@`<C@(`%#0#@```0Q`A)`,`/:Q#`02.!0`4C*)`$*^B
+M`$"3HP!`)Z0`0)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8
+M)31C``*OHP!$DZ,`1">D`$20@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#
+M``(6``!B&"6LHT`0C@0!S#B#``<L8P`!.((`"RQ"``$`8A@E%&``#``````D
+M`P`*$(,`"20"``D0@@`'`````!2#`#``````E@(!T"Q"``000``L`````(X"
+M`!0T`X```$,0(20#`":L0QATC@(`%#0#@```0Q`A)`,`#:Q#&'B.`@`4-`.`
+M``!#$"$D`P`'K$,9\(X"`!0T`X```$,0(20#`#^L0QGTC@4`%(RB0!"OH@!(
+MDZ,`2">D`$B0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"4\
+M`OS_-$+__P!B&"0\`@(``&(8):^C`$R3HP!,$```*R>D`$R.`@`4-`.```!#
+M$"$D`P`*K$,8=(X"`!0T`X```$,0(20#``RL0QAXC@(`%#0#@```0Q`A)`,`
+M`ZQ#&?".`@`4-`.```!#$"$D`P`@K$,9](X%`!2,HD`0KZ(`4).C`%`GI`!0
+MD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E/`+\_S1"__\`
+M8A@D/`(#``!B&"6OHP!4DZ,`5">D`%20@@`!``(2``!B&"60@@`"``(4``!B
+M&"60@@`#``(6``!B&"6LHT`0$```;X^_`&R.!0`4C*)`$*^B`%B3HP!8)Z0`
+M6)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)3P"_/\T0O__
+M`&(8)*^C`%R3HP!<)Z0`7)""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8):RC0!".!0`4C*)`$*^B`&"3HP!@)Z0`8)""``$``A(``&(8)9""
+M``(``A0``&(8)9""``,``A8``&(8)20"__T`8A@DKZ,`9).C`&0GI`!DD((`
+M`0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EK*-`$(X"`!0T`X``
+M`$,0(20#`!^L0QAPC@(`%#0#@```0Q`A)`,`?ZQ#&'2.`@`4-`.```!#$"$D
+M`P`.K$,8>(X"`!0T`X```$,0(20#``RL0QGPC@(`%#0#@```0Q`A)`,`_ZQ#
+M&?2.!0`4-`*```"B*"&6`@'4,$(`\"1"_]`L0@!`)`,`$B0$``X`@A@+K*,9
+M^(X%`!0T`H```*(H(8RC`!PD`L!_`&(8))8"`=0P0@#P)$+_T"Q"`$`T9!.`
+M-&,/@`""&`NLHP`<C[\`;(^P`&@#X``()[T`<">]_ZBOOP!4K[``4#P"```D
+M0@```$#X"0"`@"400`!TC[\`5(X%`!2,HD`0KZ(`0).C`$`GI`!`D((``0`"
+M$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E/`+\_S1"__\`8A@DKZ,`
+M1).C`$0GI`!$D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+MK*-`$(X%`!2,HD`0KZ(`2).C`$@GI`!(D((``0`"$@``8A@ED((``@`"%```
+M8A@ED((``P`"%@``8A@E)`+__0!B&"2OHP!,DZ,`3">D`$R0@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"6LHT`0C@(`%#0#@```0Q`A)`,`
+M`:Q#`02.!0`4-`*```"B*"&,HP`<)`+`?P!B&"26`@'4,$(`\"1"_]`L0@!`
+M-&03@#1C#X``@A@+K*,`'(X"`!0T`X```$,0(20#`!^L0QAPC@(`%#0#@```
+M0Q`A)`,`?ZQ#&'2.`@`4-`.```!#$"$D`P`.K$,8>(X"`!0T`X```$,0(20#
+M``RL0QGPC@(`%#0#@```0Q`A)`,`_ZQ#&?2.!0`4-`*```"B*"&6`@'4,$(`
+M\"1"_]`L0@!`)`,`&"0$`!0`@A@+K*,9^(^_`%2/L`!0`^``"">]`%@\`@``
+ME*,``)1"%/``0Q`K%$``"P``("4\`@``)$,4\)2E```DA``!``00@`!#$"&4
+M0@```$40*Q!`__H`````/`(``"1"%/``!!B``$,0(0/@``B$0@`")[W_X*^_
+M`!BOL0`4K[``$`#`@"4`X(@E`(`P)22C__\L8@`=$$``QB2'`>`\`@``)$(5
+M(``#&(``8A@AC&(```!```@`````)`(``A("``\\`@`$+@(``A1``+X``!`E
+M+@(`!!1``+LD`@`-+@(`!A1``+@``!`E)`(`?Q("``@`````$```LR0"``V,
+MXP```&(8)"0"``T0``"N``,0"Q```*P``!`E$@``J@``$"4D`@`!%@(`!@``
+M``",PB_,``(6PCA"``$0``"B,$(``1(```8`````)`(``1("``<`````$```
+MFR0"``R,X@````(4PA```)<P0@`!C,(OT``"$((0``"3,$(``8R#`<PL8@`&
+M$$``CP``$"4D`@`%%&(`C"0"``V4@@'0+$(`"!!```,`````$```AB0"``T0
+M``"$```0)1(``((``!`E)`,``18#`'\D`@`,C((`%#0#@```0Q`AC$(B"``"
+M$T(X0@`!$```=S!"``&,@@'XKB(``!```',``!`E$@``<0``$"4D`P`!%@,`
+M;X^_`!B,PB_<$```;"Q"``$2```&`````"0"``$2`@`&C[\`&!```&:/L0`4
+ME,(2AA```&$L0@`!E,(2C!1``%X``!`EE,,2BA!@`%LD`@`!$```60``$"42
+M``!7```0)20#``$6`P!4)`(`#(S"+\P``A?"$```4#A"``$2```&)`(`#20"
+M``$2`@`'`````!```$DD`@`,C.,``#!C"``0``!%``,0"XS"+]```A#".$(`
+M`1```$`P0@`!C,(OX#!"`#^N(@``$```.P``$"6,PB_@,$(_```"$@*N(@``
+M$```-0``$"4D`@`!$@(`"``````2```P```0)2X#``<08``M)`(`#!````4\
+M`@``C,(P&#A"``$0```G,$(``21"````0/@)``````!`("40@``A)`(``28#
+M__XL8@`%$$``'0``$"4\`@``)$(5F``#&(``8A@AC&(```!```@`````D((`
+M"1````RN(@``D((`#!````FN(@``D((`#1````:N(@``D((`"Q````.N(@``
+MD((`"JXB```0```&```0)3P"```D0@```@`P)0!`^`D"(#@EC[\`&(^Q`!2/
+ML``0`^``"">]`"`GO?_0K[\`*`"`0"4DH__^+&(`'!!``(DDB0'@/`(``"1"
+M%<@``QB``&(8(8QB````0``(`````!#@``4\`P@`C0(OS`!#$"40```&K0(O
+MS(T"+\P\`_?_-&/__P!#$"2M`B_,$```>R0"``&-(P``/`(`"`!B&"008`!V
+M```0)1#@``4D`__[C0(OT`!#$"00```$K0(OT(T"+]`T0@`$K0(OT(R"`!0T
+M`X```$,0(8T#+]"L0P$@$```9B0"``&,@@`4-`.```!#$"&,12(($.```P``
+M```0```#-*4@`"0"W_\`HB@DC((`%#0#@```0Q`AK$4B"!```%8D`@`!K(<!
+M^(R"`!0T`X```$,0(:Q'`$@0``!/)`(``0`'$"NM`B_<$```2R0"``$0X``%
+M/`.``(T"+\P`0Q`E$```!JT"+\R-`B_,/`-__S1C__\`0Q`DK0(OS!```#XD
+M`@`!A0(O]`#B."$LXP!`)`(`/P!#.`HD`@`:%*(`!@````"-`B_@`.(0)3!"
+M`#\0```'K0(OX(T#+^`P8S\`,.(_```"$@(`0Q`EK0(OX(R"`!0T`X```$,0
+M(8T#+^"L0P#H$```)"0"``$LP@`'$$``(0``$"4\`@``)$(5K``&&(``8A@A
+M/`(``"1"``",90```$#X"0#@,"40```7C[\`*(TB```P0@@`$$``#``````0
+MX``%)`/_]XT"+]`T0@`($```!*T"+]"-`B_0`$,0)*T"+]`0```')`(``8^B
+M`$"OH@`0/`(``"1"````0/@)`````(^_`"@#X``()[T`,">]_^"OOP`8CZ(`
+M,(^C`#2OH@`0/`(``"1"````0/@)KZ,`%``"$"N/OP`8`^``"">]`"``````
+M)[W_B*^_`'2OM@!PK[4`;*^T`&BOLP!DK[(`8*^Q`%ROL`!8$*``70"`H"6.
+MA0`4C*)`!*^B`$"3HP!`)Z0`0)""``$``A(``&(8)9""``(``A0``&(8)9""
+M``,``A8``&(8)3P"__PT0O__`&(8)*^C`$23HP!$)Z0`1)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8``&(8):RC0`0\`@``)$(```!`^`DD!``*
+M)!,`*">R`$@\%@`!/`(``"15```GL0!,)[``4(Z"`!2,0D`0KZ(`2).C`$B2
+M0@`!``(2``!B&"620@`"``(4``!B&"620@`#``(6``!B&"4`=A@D$&``(@``
+M```"H/@))`0`,HZ$`!2,@D`$KZ(`3).C`$R2(@`!``(2``!B&"62(@`"``(4
+M``!B&"62(@`#``(6``!B&"4\`O_\-$+__P!B&"2OHP!0DZ,`4)("``$``A(`
+M`&(8)9("``(``A0``&(8)9("``,``A8``&(8):R#0`0F<___%F#_T``````2
+M8``*```0)8Z$`!0T`H```((@(8R"``0\`__[-&/__P!#$"2L@@`$)`(``8^_
+M`'2/M@!PC[4`;(^T`&B/LP!DC[(`8(^Q`%R/L`!8`^``"">]`'@GO?_(`(`P
+M)8S$`!0T`H```((@(8R"``0\`P`$`$,0):R"``00H``A`````(S%`!2,HD`$
+MKZ(`,).C`#`GI``PD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``
+M8A@E/`+__#1"__\`8A@D/`(``0!B&"6OHP`TDZ,`-">D`#20@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"6LHT`$`^``"">]`#@GO?_(`(`P
+M)8S$`!0T`H```((@(8R"``0\`P`$`$,0):R"``00H``A`````(S%`!2,HD`$
+MKZ(`,).C`#`GI``PD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``
+M8A@E/`+__#1"__\`8A@D/`(``@!B&"6OHP`TDZ,`-">D`#20@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"6LHT`$`^``"">]`#@GO?_@K[\`
+M'*^R`!BOL0`4K[``$`"@B"4`P"@E)!```1(P``T`@)`E$B``!CP"``$D`@`"
+M$B(`#@``$"40```3C[\`'"1"L.``0/@)`````!````L`0(`E/`(``21"LL@`
+M0/@)`````!````:N42^X/`(``21"LWP`0/@)`````*Y1+[@"`!`EC[\`'(^R
+M`!B/L0`4C[``$`/@``@GO0`@)[W_Z(R"`!2,0D`$KZ(`$).B`!`GI``0D(,`
+M`0`#&@``0Q`ED(,``@`#'```0Q`E``(4`C!"``,#X``()[T`&">]_^BOOP`4
+M)`(`"!"B`#:OL``0+*(`"1!```\D`@$`)`(``A"B`#,LH@`#$$``!B0"``0D
+M`@`!$*(`%@``$"40``!`C[\`%!"B`"0``!`E$```/(^_`!00H@`L+*(!`1!`
+M``8D`@(`)`(`(!"B`"0``!`E$```,X^_`!00H@`F)`($`!"B`"<``!`E$```
+M+8^_`!0\`@``)%```(R"$C000``B`````)1"``(P0D``$$```SP"```0```<
+M)%```(R"$C240@`",$*``!!``!<\`@``$```%210```\`@``$```$B10```\
+M`@``$```#R10```\`@``$```#"10```\`@``$```"210```\`@``$```!B10
+M```\`@``$````R10```\`@``)%```#P"```D0@```$#X"0(`*"4"`!`EC[\`
+M%(^P`!`#X``()[T`&(R"`!2,0@`,`^``"``````GO?_PC((`%*Q%``P#X``(
+M)[T`$">]__",@P`4)`(`!*QB``@#X``()[T`$">]_]BOOP`@C(,`%"0"`""L
+M8@`(/`(``"1"```D!0`()`8`!`!`^`D``#@E``(0*X^_`"`#X``()[T`*">]
+M_]BOOP`DK[``(`"`@"6.!``4-`*```""("&,@@!()`/_WP!#$"2L@@!(/`(`
+M`"1"````0/@)`@`@)3P"```D0@```@`@)0!`^`DD!0`!C[\`)(^P`"`#X``(
+M)[T`*">]_]BOOP`@C(,`%#0"@```8A@AC&(`2#1"`""L8@!(/`(``"1"````
+M0/@)`````(^_`"`#X``()[T`*">]__",@@`4-`.```!#$"&L10!`C((`%`!#
+M$"&L1@!$`^``"">]`!`GO?_P+*,`0!!@`!@``!`E+*(`(!1```PT`H``C(,`
+M%`!B&"&,9@!$)*3_X"0"``$`@A`$``(0)P#"$"2L8@!$$```"B0"``&,@P`4
+M`&(8(8QF`$`D`@`!`*(0!``"$"<`PA`DK&(`0"0"``$#X``()[T`$">]__`L
+MHP!`$&``%@``$"4LH@`@%$``"S0"@`",@P`4`&(8(8QF`$0DI/_@)`(``0""
+M$`0`PA`EK&(`1!````DD`@`!C(,`%`!B&"&,9@!`)`(``0"B$`0`PA`EK&(`
+M0"0"``$#X``()[T`$(R"`!0T`X```$,0(8Q#`#R,1`$,,(4`(#1B`@``11@+
+M/`("`@""("0T8@$``^``"`!D$`HGO?_PC((`%#0#@```0Q`A,*,`_ZQ#`#PP
+MHP(`)`(`(```,"4PI0$`$*```P!#,`L\`@("`,(P)8R"`!0T`X```$,0(:Q&
+M`0P0P``&`````(R#`!2,8@`T-$(`$!````:L8@`TC((`%(Q#`#0D!/_O`&08
+M)*Q#`#0#X``()[T`$*B@``BXH``+,,8/_ZBF``RXI@`/,.<`(!#@``8`````
+MB*(`#)BB``\T0B``J*(`#+BB``^HH``4N*``%XBB`!28H@`7J*(`$+BB`!,#
+MX``()`(``2>]_^BOOP`0CZ@`,(BC`!28HP`7,&,``1!@`'$D`@`/B.(`%)CB
+M`!<P0@`!%$``!0````",@@`4C$,`#!!F`&@D`@`/B*(`$)BB`!,P0@__I0(`
+M`(BB`!28H@`7``(4`C!"?_^E`@`"H0``!(BB`!"8H@`3``(5`C!"`/^A`@`&
+M``(6```"%@,D`_^`%$,``@````"A```&B*(`%)BB`!<P0@$`$$``!R0"`/^(
+MH@`4F*(`%S!"_@```A)"$````J$"``>A`@`'B*(`$)BB`!,``A/",$(`'Z$"
+M``B(H@`0F*(`$P`"%P*A`@`)B*(`$)BB`!,``A,",$(``:$"``J(H@`4F*(`
+M%S!"``(40``T```0)8BB`!28H@`7,$(`!!!```4`````D0(`!#1"``$0```J
+MH0(`!(BB`!28H@`7,$(`$!!``!0`````D0(`!#1"``*A`@`$B*(`%)BB`!<P
+M0O\```(2`J$"``6,@S`<.$(`!0`"$"L``Q`+$$``%SP"```D0@```$#X"0$`
+M*"40```3```0)8BB`!28H@`7,$(`"!!```4`````D0(`!#1"``@0```)H0(`
+M!(BB`!28H@`7,$(`(!!```4``!`ED0(`!#1"`!"A`@`$```0)8^_`!`#X``(
+M)[T`&">]_TBOOP"TK[X`L*^W`*ROM@"HK[4`I*^T`*"OLP"<K[(`F*^Q`)2O
+ML`"0`("():^E`+P`P/`EKZ<`Q`(@H"67P@`"``(1PC!#``&7P@`",$(!`!!`
+M``4``+`E%&`$<B0#``P0```(E\(``I?"``(``A'".$(``3!"``$40`1J)`,`
+M#)?"``(``A&",$,``9?"``(P0@`@$$``!0`````48`1A)`,`#!````@\`@``
+ME\(``@`"$8(X0@`!,$(``11`!%DD`P`,/`(``"1"```"("`E```H)0!`^`DD
+M!@`!$$`$5@(@("4\`@``)$(```!`^`D#P"@E`$"H)1*@!$HD`P`,)`(`!H^C
+M`+P08@`++&(`!Q!```8D`@`(+&(``A!`!$$D`P`,$```!8^E`,2/I`"\%(($
+M/"0#``R/I0#$$*``$`````".(@`4C$(10*^B`'@\`@``)$(```(@("4`0/@)
+M`J`H)3P"```D0@```B`@)0!`^`D``"@E$````XXD`<ROH`!XCB0!S#B#``<L
+M8P`!.((`"RQ"``$`8A@E%&``#(^F`,0D`P`*$(,`"20"``D0@@`'`````!2#
+M`!H`````EB(!T"Q"``000``6`````!#``!0`````CB02-!"``!$`````E\,`
+M`)2"```08@`-`````)?#``*4@@`",&,!\#!"`?`48@`'/`(``"1"```"("`E
+M`$#X"0/`*"440`0&)`(``8XE`!0T`H```*(0(8Q#`%BOHP!\)`,``8^D`'P`
+M@#`E`&8@"J^D`'R,0P`$/`("(`!B&"2OHP"$C*)`$*^B`$B3HP!()Z0`2)""
+M``$``A(``&(8)9""``(``A0``&(8)3P"`/XT0@!@`&(8)*^C`(",HD`4KZ(`
+M3).C`$PGI`!,D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+MKZ,`<(RB0!BOH@!0DZ,`4">D`%"0@@`!``(2``!B&"60@@`"``(4``!B&"60
+M@@`#``(6``!B&"6OHP!T/`(``"1"```"("`E`$#X"8^E`+P\`@``)$(```!`
+M^`D"("`E/`(``"1"```"("`E`$#X"0/`*"400`.Y)`,``Y?"``(P0P'P)`(!
+M0!!B`"`H8@%!$$``#R0"",`D`@#`$&(`)BAB`,$00``&)`(`T"0"`*`08@`=
+M)`,`#!```ZF/I0#($&(`(20#``P0``.ECZ4`R!!B`!DH8@C!$$``!B0""4`D
+M`@%0$&(`#"0#``P0``.<CZ4`R!!B``4D`@E0$&(`!B0#``P0``.6CZ4`R"07
+M``$0```0K[<`B"07``(D`@`!$```#*^B`(@D%P`#)`,``A````BOHP"()!<`
+M!"0$``(0```$KZ0`B"07``4D!0`"KZ4`B(XB`!0T`X```$,0(20#``>L0Q@`
+M``"`)3P"```D4Q9`)[(`5``0$$``4!@A``,0P`!3$"&,1```)(+``"Q"$``0
+M0``6`!`00``#$$``5Q`A``(0@`!3$"&,0@``KZ(`5).C`%220@`!``(2``!B
+M&"620@`"``(4``!B&"620@`#``(6``!B&"6.(@`4`$00(:Q#```0```.)M8`
+M`0!0$"$``AC``',8(8XD`!2,8P```(,@(0`"$$``5Q`A``(0@`!3$"&,0@``
+MK((``";6``$RP@`_%$``!#P&```DQ@```,#X"20$``$F$``!+@(`&11`_\T`
+M$!!```"`)3P"```D4QB8)[(`6``0$,``4Q`AC$0``(^B`,000``,/`7__S2E
+M?^``A1@A+&,`&3P"__\T0G\L`((0(2Q"``DX0@`!``,0"Q!``"0`````)(+`
+M`"Q"$``00``4`!`8P``0$,``4Q`AC$(`!*^B`%B3HP!8DD(``0`"$@``8A@E
+MDD(``@`"%```8A@EDD(``P`"%@``8A@ECB(`%`!$$"&L0P``$```!R;6``&.
+M(@`4`$00(0!S&"&,8P`$K$,``";6``$RP@`_%$``!#P&```DQ@```,#X"20$
+M``$F$``!+@(`Q!1`_\H`$!#`CH(LK`(@("4"X"@ECZ8`B`!`^`D"P#@EE\(`
+M`C!"P``00``%/`(``"1"```"("`E`$#X"0/`*"66(@'2+$(`0A1``$DT`X``
+MCB(`%`!#$"$\`P`"-&.@`JQ#&"R7PP``)`()M!1B``X\`V9FDH(2DI:#$IP`
+M0Q`C/`-F9C1C9F<`0P`8```8$``#&$,``A?#`&(8(P`#'``0```'``,D`Y*"
+M$I(T8V9G`$,`&```$!```A/```(D`Y?"``(P0@#0)`,`P!1#`!`T`X``CB4`
+M%#0"@```HB@ADH(2D@`"$",``A&`,$(/P``$&",``QR`/`0`_`!D&"0`0Q`E
+MK*(93!````6.)``4CB(`%`!#$"&L0!E,CB0`%#0"@```@B`AC((B*"0#_?\`
+M0Q`DK((B*(XD`!0T`H```((@(8R"(B@\`__^-&,#_P!#$"0T0@@`K((B*(XB
+M`!0T`X```$,0(20#``^L0P!@EB(!TBQ"`$,40``$-`.``(XB`!0`0Q`AK$`B
+M5(XB`!0T`X```$,0(20#``ZL0QAXCB,!S"0$``H09``))`(`"1!B``<`````
+M%&0`$SP"``"6(@'0+$(`!!!```\\`@``E\,``#AB"9XX8PFC``(0*P``("4`
+M0R`+CB,`%#0"@```8A@AC&(B3!!$``,\`@``K&0B3#P"```D0@```B`@)0*@
+M*"4`0/@))Z8`$!!``H(D`P`#)`(`!H^C`+P08@`'`````(XB`@000``$/`(`
+M`"1"````0/@)`B`@)8Z"++@"("`E`J`H)3+F__\`0/@))Z<`$!!``G`D`P`#
+ME\(``C!"`$`00``>)`0`"HXC`<P09``-)`(`"1!B``L`````%&0`!0````"6
+M(@'0+$(`!!1```4`````EH(2<"Q"4`,40``+/`(``)?"``(P0@"@)`,`H!!#
+M``4\`@``)$(```(@("4`0/@)`J`H)3P"```D0@```B`@)0!`^`D#P"@E/`(`
+M`"1"```"("`E`$#X"0*@*"400`)()`,``X^D`,00@``$`````(XB`!2/I0!X
+MK$410(XD`!0T`H```((@(9*#+#"2@BPQ``(2``!B&"62@BPR``(4``!B&"62
+M@BPS``(6``!B&"6L@P``CB0`%#0"@```@B`ADH,L-)*"+#4``A(``&(8)8^F
+M`(0`9A@ECH(OS`!B&"4\`@"``&(8):R#``0\`@``)$(```(@("4`0/@)CZ4`
+MO(XD`!0T`H```((@(9*#+#R2@BP]``(2``!B&"62@BP^``(4``!B&"62@BP_
+M``(6``!B&"6L@P#@CB0`%#0"@```@B`ADH,L0)*"+$$``A(``&(8):R#`.2.
+M)0`4C*)`$*^B`%R3HP!<)Z0`7)""``$``A(``&(8)9""``(``A0``&(8)9""
+M``,``A8``&(8)8^B`(``8A@EKZ,`8).C`&`GI`!@D((``0`"$@``8A@ED((`
+M`@`"%```8A@ED((``P`"%@``8A@EK*-`$(^C`'"OHP!DDZ,`9">D`&20@@`!
+M``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6.(@`4K$-`%(^D`'2O
+MI`!HDZ,`:">D`&B0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B
+M&"6.(@`4K$-`&(XB`!0T`X```$,0(8^E`'RL10!8CB0`%#0"@```@B`ADH,L
+M-I*"+#<``A(``&(8)9*"+#@``A0``&(8)9*"+#D``A8``&(8):R#``B.)``4
+M-`*```""("&2@RPZDH(L.P`"$@``8A@EK(,`#(XB`!0T`X```$,0(8Z#+]2L
+M0P`8CB,`%"0"__^L8@"`/`(``"1"```"("`E`$#X"0*@*"400`&F)`,``SP"
+M```D0@```B`@)9(E$C@`0/@))`8``3P"```D0@```B`@)0!`^`D#P"@EEB(!
+MU#!"`/`D0O_0+$(`0!!``!(`````CB,2-(QB```P0L``$$``#20'``V49@`"
+M,,9``"0%``R.)``4-`*```""("&,@A@D)`/_\`!#$"0`YB@*`$40):R"&"2.
+M(@`4-`.```!#$"&,0AD4,$0__Y?"``(P0@`@$$``!P`$$(`\`[HN-&.+HP!#
+M`!D``!`0$```!@`"(0(\`LS,-$+,S0""`!D``!`0``(@PHXB`!0T`X```$,0
+M(20#``&L0Q@<CB(2-)1"``(P0D``$$``!SP"````!"!`)$(```!`^`DDA`!D
+M$```$(XB`!2.(A(TE$(``C!"@``00``'/`(````$((`D0@```$#X"22$`&00
+M```%CB(`%"1"````0/@))(0`9(XB`!0T`X```$,0(8Q6&`@D`S@`K$,8""00
+M``&.(@`4-`.```!#$"&,0APD,$(`$!!```\\`@``)%,``#02@``"8/@))`0`
+MR`(`$"4H0@`4$$``!R80``&.(@`4`%(0(8Q"'"0P0@`0%$#_]0````".(@`4
+M-`.```!#$"&L5A@(CB,`%#0"@```8A@AC&(88#1"``.L8AA@E\(``C!"`*`D
+M`P"@$$,`$R0"``*.@R_`$&(`$#0"@`".(P`4`&(8(8QB&2`T0O``K&(9((XD
+M`!0T`H```((@(8R"&2`\`P`!`$,0):R"&2`D`@`!$````JZ"+\"N@"_`/`(`
+M`"1"````0/@)`B`@)0``@"4D!@`!)Z4`;``0((`D@M``+$(0`!!``!(`$!"`
+M`@80!*^B`&R3HP!LD*(``0`"$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``
+M8A@ECB(`%`!$$"&L0Q``$```!B80``&.(P`4`&(8(0(&$`2L8A``)A```2H"
+M``H40/_D`!`@@*Z`1J"6(@'H$$``"P``@"4\`@``)%(```(@("4"0/@)`@`H
+M)280``&6(@'H`@(0*A1`__H"("`E/`(`"#1""66N@BQ$)`(`!H^C`+P48@`#
+M/`(`"#1"&66N@BQ$CB,`%(Z"+$2L8@"@CB0`%(R"`*P\`P`'`$,0):R"`*R.
+M(A),$$``!#P"```D0@```$#X"0(@("4\`@``)$(```(@("4T!9A@)`8``0!`
+M^`D``#@E/`(``"1"```"("`E`$#X"8^E`+R.)``4-`*```""("&,@@`@/`/^
+M?S1C__\`0Q`DK((`((XC`<PL8@`&$$``!R0"``448@`0`````)8B`=`L0@`(
+M%$``#`````".(@`4-`.```!#$"$\`P`!-&,`JJQ#`1B.(@`4-`.```!#$"$D
+M`S(0K$,!'(XB`!0T`X```$,0(20#`%*L0P$(E\(``C!"`0`00``#`````!``
+M``*"AA*.@H82CSP"```D0@```B`@)0!`^`D#P"@E``(6```"1@..@B_@,$<`
+M/X:$+_0`Y!@C@J(`!@!#&"L`1!`A.&,```!#.`N"H@`%``(00`!(&",`9Q`K
+M$$```@"`$"4`8C@ACH(OX#!&/P``!C("AH0O]`#$&"."H@`&`$,8*P!$$"$X
+M8P```$,P"X*B``4``A!``$@8(P!F$"L00``"`(`0)0!B,"&6A2_@,*4`/X:$
+M+_0`I!@C@J(`!@!#&"L`1!`A.&,```!#*`N"H@`%``(00`!(&",`91`K$$``
+M!"SB`$``@!`E`&(H(2SB`$`D`P`_`&(X"BS"`$``8C`*+*(`0`!B*`HPY``_
+M``82`#!"/P``@B`E``44`#P#`#\`0Q`D`((@)8XB`!0T`X```$,0(:Q$`.B.
+MA"_0$(``!`````".(@`4`$,0(:Q$`2".A2_X)`+__Q"B``0\`@``)$(```!`
+M^`D"("`ECH4O_"0"__\0H@`$/`(``"1"````0/@)`B`@)8Z%,``D`O__$*(`
+M!#P"```D0@```$#X"0(@("6.)`'X$(``!#0#@`".(@`4`$,0(:Q$`$B/I`"\
+MKB0!W(^E`,00H``H)`(``9*C``0P8@`"%$```C!B`/ZBH@`$EJ(``J?"``*2
+MH@`$H\(`!)*B``6CP@`%DJ(`!J/"``:2H@`'H\(`!XXB$C0``"`E```H):Q$
+M`#"L10`T/`(``"1"````0/@)`B`@)8XD$C2L@@`HK(,`+#P"```D0@```B`@
+M)0!`^`DD!0`!$```!B0"``&/I0#(C*(``!!```(``!`EK*,``(^_`+2/O@"P
+MC[<`K(^V`*B/M0"DC[0`H(^S`)R/L@"8C[$`E(^P`)`#X``()[T`N`"`,"6,
+MQ0($,*(``Q!```PGO?_PC,0`%#0"@```@B`AC(,91#P"W_\T0O__`&(8)#"B
+M``$``A=``&(8):R#&40PH@`,$$``$0`"$((P0@`!%$``"30#@`",Q``4-`*`
+M``""("&,@@#0)`/_XP!#$"00```&K((`T(S"`!0`0Q`AC$,`T#1C`!RL0P#0
+M`^``"">]`!`GO?_HK[\`$(R"++0`0/@)```````"$"N/OP`0`^``"">]`!@G
+MO?^XK[\`1*^V`$"OM0`\K[0`.*^S`#2OL@`PK[$`+*^P`"@`@(@E`*"H)204
+M``$\`@``)$(```!`^`D"(+`E`$"0)0``@"4\`@``)%,``)8B`>@"`A`K$$``
+M!@(@("4"8/@)`@`H)1!`__DF$``!``"@)1*``(T``!`ECB(`%#0#@```0Q`A
+M)`,``:Q#&7P``(`ECB(`%#0#@```0Q`AC$(<(!1```\N`@!D/`(``"14```T
+M$X```H#X"20$``4F$``!+@(`9!!``'@``!`ECB(`%`!3$"&,0AP@$$#_]BX"
+M`&000`!Q```0)3P"```D0@```B`@)0!`^`D"0"@E$$``:C0#@`".(@`4`$,0
+M(8Q"&10P13__ED0``C"$`"``!1"`/`.Z+C1CBZ,`0P`9```0$!2```8``AD"
+M/`+,S#1"S,T`H@`9```0$``"&,(\`@``)$(```!`^`DD9`!D/`(``"1"```"
+M("`E`D`H)0!`^`DGI@`0$$``3#0#@`".(@`4`$,0(:Q`&7R60@`",$(`0!!`
+M`!XD!``*CB,!S!!D``TD`@`)$&(`"P`````49``%`````)8B`=`L0@`$%$``
+M!0````"6PA)P+$)0`Q1```L\`@``EJ(``C!"`*`D`P"@$$,`!3P"```D0@``
+M`B`@)0!`^`D"0"@E/`(``"1"```"("`E`$#X"0*@*"6.(P`4-`*```!B&"&,
+M8AA@-$(``JQB&&"20P`$,&(``A1```(P8@#^HD(`!)9"``*FH@`"DD(`!**B
+M``220@`%HJ(`!9)"``:BH@`&DD(`!Z*B``>.(A(T```@)0``*"6L1``PK$4`
+M-#P"```D0@```$#X"0(@("6.)!(TK((`**R#`"P\`@``)$(```(@("4`0/@)
+M)`4``20"``&/OP!$C[8`0(^U`#R/M``XC[,`-(^R`#"/L0`LC[``*`/@``@G
+MO0!()[W_\(R"`!0T`X```$,0(8Q&``0\`O_\-$+__P#","0D`@`!$*(`(RBB
+M``(00``%)`(`!A"@`!4T`H``$```(P`````0H@`%)`(`"!"B`!D`````$```
+M'0````",@P`4-`*```!B&"$\`A`!`,(0):QB``2,A``4C((`%"0#_]\`0Q`D
+M$```$:R"`!2,@P`4`&(8(3P"$`(`PA`EK&(`!(R#`!2,8@`4-$(`(!````>L
+M8@`4C(,`%#0"@```8A@A/`(0``#"$"6L8@`$`^``"">]`!`GO?_HK[\`$#P"
+M``$D0MC8`$#X"20%``*/OP`0`^``"">]`!@GO?_HK[\`%*^P`!``@(`E/`(`
+M`"1"`````"@E`$#X"20&``$00``%`@`@)3P"``$D0MC8`$#X"20%`!./OP`4
+MC[``$`/@``@GO0`8)[W_T*^_`"ROL@`HK[$`)*^P`"``@(@E`*"`)3P"``$D
+M0MC8`$#X"20%`!,00`"@```H)3P"```D0@```B`@)0!`^`DD!@`!$$``FH^_
+M`"P\`@`!)$+8V`(@("4`0/@)```H)1!``)./OP`L$@``D20"``&.(P',)`0`
+M"A!D``DD`@`)$&(`!P`````49``/`````)8B`=`L0@`$$$``"P````"6`P`"
+M,&(`(!1```4D$@`(,&,`T"0"`,`48@`X)`0`!!```#8D!`#KEB(!U#!"`/`D
+M0O_0+$(`0!1```D`````CB(!S#A#``<L8P`!.$(`"RQ"``$`8A@E$&``%0``
+M``"6`P`",&(`(!1```4D$@`(,&,`T"0"`,`48@`#`````!```!XD!`#KE@(`
+M`C!"0``40``:)`0!ZI8"``(P0H``)`0`ZB0#`NH0```4`&(@"Y8#``(P8@`@
+M%$``!0``D"4P8P#0)`(`P!1B``,`````$```"B0$`*N6`@`",$)``!1```8D
+M!`&JE@(``C!"@``D!`"J)`,"J@!B(`N6`P`",&(`0!!```@P8@`@%$``!#!C
+M`-`D`@#`%&(``P`````0```%-E(`!)8"``(P0@!`-D,``0!BD`J6!0`",*,!
+M`#9"``(`0Y`*,*,`$"0"``,`0(`E``.`"HXB`!0T`X```$,0(8Q&&'PPH@`@
+M%$``!#"C`-`D`@#`%&(`$P````".(@`4-`.```!#$"&L4!@$CB(`%`!#$"&L
+M4B(`$,0`&R0"``&.(@`4`$,0(:Q$&'P\`@``)$(```!`^`DD!`$L$```$B0"
+M``$0Q``(-`.``(XB`!0`0Q`AK$08?#P"```D0@```$#X"20$`2R.(@`4-`.`
+M``!#$"&L4!@$CB(`%`!#$"&L4B(`)`(``8^_`"R/L@`HC[$`)(^P`"`#X``(
+M)[T`,">]_\BOOP`TK[0`,*^S`"ROL@`HK[$`)*^P`"``@(@E`*"@)0#`D"4"
+M()@E/`(``"1"````0/@)KD````!`@"42``#!C[\`-(YC+\`X8@`"+$(``2QC
+M``$`0Q`E$$```B0"``&N0@``CF0OP"0"``$4@@!A-`.``(XB`!0`0Q`AC$(9
+M(#P#``$`0Q`D%$``6@``,"6N8"_`KD0``#0)@``\"``!CB(`%`!)&"&,91P0
+MC&0<%(QG'!@`!!`K``40"A1```@`````C&(9(`!($"6L8AD@),8``2C"``H4
+M0/_Q```````%,@(`!!("`,(P(0`$0<(I`@`".$(``0`&$`H00`!7``<0(P`"
+M%@```CX#`.8`&@``$!(4P``"```````'``T`0#@E*./_X"CD`"`D`@`?`$0X
+M"B0"_^`X8P```$,X"P"H`!L``"@2%0```@``````!P`-)*7_@"BC__`HI``0
+M)`(`#P!$*`HD`O_P.&,```!#*`N.)``4-`*```""("&,@QD@)`+X'P!B&"0`
+M!Q%`,$('X`!B&"6L@QD@CB0`%#0"@```@B`AC((9("0#_^``0Q`D,*,`'P!#
+M$"6L@AD@CB,`%#0"@```8A@AC&(9(#1""`"L8AD@)`(``JYB+\`D`@`!K@(`
+M$*('`!00```;H@4`%9:"``(P0@"@)`,`H!!#`!8D`@`"CF,OP!1B`!0\`@``
+MC@(`$!1``!$\`@``CB,`%#0"@```8A@AC&(9(#1"\`"L8AD@CB0`%#0"@```
+M@B`AC((9(#P#``$`0Q`EK((9("0"``&N8B_`/`(``"1"```"("`E`$#X"0(`
+M*"66`@`",$(``A1``"HT`H``CB,`%`!B&"&,8AA@-$(``JQB&&"6A0`",*(!
+M`!1```H`````EB(!U#!"`/`D0O_0+$(`0!!``"(D`@`!,*(`0!!``!\D`@`!
+MCB0!S#B#``<X@@`+``(0*P`#$`H00``7)`,`"A"#`!4D`@`)$((`%"0"``$4
+M@P`&/`(``98B`=`L0@`$%$``#B0"``$\`@`!)$(`\`!`^`D"("`E$```""0"
+M``&6@@`"-$(``J:"``*6`@`",$+__:8"``(D`@`!C[\`-(^T`#"/LP`LC[(`
+M*(^Q`"2/L``@`^``"">]`#@GO?_(K[\`-*^R`#"OL0`LK[``*`"`B"4`H(`E
+M%@```Z^P`"0D`O__KZ(`)(XC`<PD`@`)$&(`!R0"``H48@`'`````)8B`=`L
+M0@`$$$```P`````D`O_O`@*`)(XE`!2,H@`,K[``().C`"`GI``@D((``0`"
+M$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EK*-``#P"```D0@```$#X
+M"20$``^/H@`D,$(``Z^B`"0R$``#/`(``"1"```"("`E)`5``(^F`"0`0/@)
+M`@`X)0!`D"4R`@`!%$``'0)`$"4D`@`4KZ(`)#1"``&OH@`DCB4`%).C`"0G
+MI``DD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EK*,`%#P"
+M```D0@```B`@)0``*"4`0/@))`8``1!```0"0!`ECB(`%(Q"`,`"0!`EC[\`
+M-(^R`#"/L0`LC[``*`/@``@GO0`XC((`%#0#@```0Q`AC$(89``"%,(P0P'_
+M,&(!`!!```,`````.&(!_P`"&"<#X``(`&`0)92B``(P0P'@)`(`P!!B`!$`
+M````*&(`P1!```8D`@%`)`(`H!!B``@``````^``"```$"448@`*`````)2"
+M$LP0```)I,(``)2"$LX0```&I,(``)2"$M`0```#I,(```/@``@``!`E)`(`
+M`0/@``@`````)[W_V*^_`"2OL@`@K[$`'*^P`!@`@(@E`*"0)8XB`!0T`X``
+M`$,0(8Q"&&`P0@`"%$``&```@"4\`@``)$(```!`^`D``````$"`)3P"``$D
+M0MIX`B`@)0)`*"4`0/@))Z8`$!!```F'H@`0`%`0*A!```<`````ED(``C1"
+M``*F0@`"$````@``@"4``(`EIE``%@(`$"6/OP`DC[(`((^Q`!R/L``8`^``
+M"">]`"@GO?_PC((!X#P#(```0Q`D$$``&P"`,"6,@P`4)`(``:QB!"",P@`4
+MK$`&`(S#`!2,8@8`-$(`"*QB!@",PP`4/`(`$#1"`@&L8@8$C,(`%*Q`!B``
+M`"@EC,(`%*Q%!`",PP`4`*00(9!"+SBL8@0$)*4``2BB`(`40/_W``````/@
+M``@GO0`0)[W_Z*^_`!``@'`E``!@)23)__\`"4C"),;__S#&``<`H$`E&*``
+M'```4"4D#0`()`L``0`'.,``R"`A+((`"0&B(`H`BQ`$)$+__P#+&`0D8___
+M`$,0)@#B$`0`"1B``&X8(8QC````0Q`D`.(0!@#"$`8!0A`$`8)@)0"&(",!
+M1%`A`080(21(__@``#`E'0#_Z24I``$\`@``)$(```!`^`D!@"`EC[\`$`/@
+M``@GO0`8)[W_\`"`0"64P@`",$,!X"0"`,`08@`/`0!()2AB`,$00``&)`(!
+M0"0"`*`08@`'```0)1```%$`````%&(`3P``$"40```$```8)1````(D`P`!
+M)`,``@`#&$`E)``$`&00(91'$N:40A+L``(1@`#B."4`9!`AE$(2\@`"$P``
+MXC@E`&00(91"$O@``A2``.(X)0!D$"&40A+^``(6``#B."4`9!`AE$83!)1"
+M$PH``A&``,(P)0!D$"&40A,0``(3``#","4`9!`AE$(3%@`"%(``PC`E`&08
+M(91B$QP``A8``,(P)20"``$0H@`'`````!"@``@D`@`"$*(`!0``$"40```=
+M`````!````(`X#`E`,`X)13'``HT`X``C00`%#0"@```@B`AC((B""0#W_\`
+M0Q`DK((B"!````>M)2^\C0(`%`!#$"&,0R((-&,@`*Q#(@BM)2^\C0(`%#0#
+M@```0Q`AK$<98(T"`!0`0Q`AK$899"0"``$#X``()[T`$(R#`<PD!@`*$&8`
+M&``````D`@`)$&(`%0`````49@`%`````)2"`=`L0@`$%$``$"0&`"B,@@',
+M.$,`!RQC``$X0@`++$(``0!B&"448``()`8`*)2"`=0P0@#P)$+_T"Q"`$`0
+M0``")`8`("0&`"B4H@```$8`&P``&!`4P``"```````'``TD8O_V+$(`#3A"
+M``$#X``(``,0"B>]_\"OOP`\K[8`.*^U`#2OM``PK[,`+*^R`"BOL0`DK[``
+M(`"`D"4`H*`EEH(``@`"$<(P50`!EH(``C!#`?`D`@%`$&(`'P)`@"4H8@%!
+M$$``#R0"",`D`@#`$&(`0"AB`,$00``&)`(`T"0"`*`08@`Y```0)1```3R/
+MOP`\$&(`-P``$"40``$XC[\`/!!B`#,H8@C!$$``!B0""4`D`@%0$&(`!P``
+M$"40``$OC[\`/!!B``,D`@E0%&(!*@``$"660@'4,$(`\"1"_]`L0@!`%$``
+M(P``F"6.1`',.(,`!SB"``L``A`K``,0"A!``!PD`P`*$(,`&B0"``D0@@`8
+M`````!2#``4`````ED(!T"Q"``040``2`````(Y$`!0T`H```((@(8R#&40D
+M`O_'`&(8)(X"+"R$0@````(0P#!"`#@`8A@EK(,91!````6.1``4$````B03
+M``$D$P`"CD0`%#0"@```@B`AC(,9$"0"_`8`8A@D`!,00`!0$"&40A+D``(1
+M``!B&"4T8P`!K(,9$#P"```D0@```D`@)8X%+[P`0/@)`H`P)8Y#`!0T`H``
+M`&(8(0`3$$``4!`AE$(2S#!"`?\T0@(`K&(9:)8"$G`L0E``%$``%@`3$$"6
+M@@`",$(`$!!``!$`%2!`)((30"8#``0`8A`AE$4``":B$T@`8A@A@&8```("
+M$"&`1P`&)((32`("$"&42```)(034`($("$0```1E)8````3$$`F!``"`$00
+M(91%$J`"<!`A@$82QB:B$L@"`A`A@$<``0`5&$`D8A*H`@(0(91(```D8Q,P
+M`(,@(926``".1``4-`*```""("&,@QA$)`+`?P!B&"0`!1'`,$(_@`!B&"6L
+M@QA$CD0`%#0"@```@B`AC((84"0#_P``0Q`D,,,`_P!#$"6L@AA0CD0`%#0"
+M@```@B`AC(,84#P"__\T0@#_`&(8)``'$@`P0O\``&(8):R#&%".10`4-`*`
+M``"B*"&,I!A(/`+__#1"#_\`@B`D``@3`#P#``,T8_```$,0)`""("6LI!A(
+MCD4`%#0"@```HB@A`!,@0`"0$"&40A*Z``(>```"%```8A@E`)`@(92$$L``
+M!!(``&(8)0!D&"6LHQ@TCD0`%#0"@```@B`AC(,8*#P"__\T0@#_`&(8)``3
+M$$``4!`AE$(2K@`"$@``8A@EK(,8*(Y%`!0T`H```*(H(8RD&&0\`O_X-$(/
+M_P""("0`$Q!``%`0(91"$K0``A,`/`,`!S1C\```0Q`D`((@):RD&&26`A)P
+M+$(P`Q!```LD$0`"ED,!RB0"$"(48@`1`````):"``(P0@!`$$``#0`````0
+M```+)!$`"#P"```D0@```D`@)0!`^`D"@"@E$$``!``3$$``4!`AE$(3)@(B
+MB"&.1``4-`*```""("&,@QDD)`+_`0!B&"0`$1!`,$(`_@!B&"6L@QDDCH(`
+M$!!```0`%1A`@H4`%!````>"A@`5)&(3L`("$"&410`&)&,3N`(#&"&49@`"
+MCD0`%#0"@```@B`AC(,9("0"^!\`8A@D``410#!"!^``8A@EK(,9((Y$`!0T
+M`H```((@(8R"&2`D`__@`$,0)###`!\`0Q`EK((9((Y#`!0T`H```&(8(8QB
+M&2`T0@@`K&(9()8$$G`L@D`!%$``$R0#`-"6@@`",$(`T!1#``,L@E``%$``
+M#0````".10`4-`*```"B*"&,I"(,/`+_`S1"__\`@B`D`!84@#P#`/P`0Q`D
+M`((@):RD(@R6`A)P+$)0`11```8D`@`!CD(`%#0#@```0Q`AK$`9X"0"``&/
+MOP`\C[8`.(^U`#2/M``PC[,`+(^R`"B/L0`DC[``(`/@``@GO0!`)[W_B*^_
+M`'2OO@!PK[<`;*^V`&BOM0!DK[0`8*^S`%ROL@!8K[$`5*^P`%``@)`E`*#P
+M):^@`!"OH``4KZ``&*^@`!ROH``@KZ``)*^@`$@``+@EKZ``3"0#``&GHP`H
+M)`(``J>B`"JGH@`LIZ,`+J>C`#"GH@`RIZ,`-)?"``(``A'",%0``1*```>7
+MPP````,0@`!#$"$``A!`)$*F*!````@P0O__``,0@`!#$"$``A!`/`/__S1C
+M0)@`0Q`A,$+__P!`F"67P@`X%$``'P!`B"4T$8``)`(`5Y?#``(P8P`0)`0`
+MKCAC````@Q`+``"`)0)BL",0```"`F*H(3!0__\N`@`%$$``#P)`("6.0@'$
+M`@`H)0!`^`D"@#`E-`.``!!#``@P0S__`'80*A1`__,F`@`!`J,0*A1`__`F
+M`@`!`&"():?1`#@T`H``%B(`4@````".0@`4`%$@(8R"&2`\`T```$,0)!!`
+M`6D`````C((9##P#`/\T8___`$,0)*R"&0R.0P`4-`*```!B&"&,9!D@/`*/
+M_S1"__\`@B`DK&09#(Y"`!0T`X```$,0(:Q`&:".0@`4`$,0(:Q`&8".1``4
+M-`*```""("&,@AF$/`/_\`!#$"2L@AF$CD(`%#0#@```0Q`AK$`9F(Y$`!0T
+M`H```((@(8R"&9P\`__P`$,0)*R"&9R.0@`4-`.```!#$"&L0!D`CD(`%`!#
+M$"&L0!D$CD(`%`!#$"&L0!D(CD0`%#0"@```@B`AC((9#"0#P```0Q`DK((9
+M#(Y"`!0T`X```$,0(:Q`&8B.0@`4`$,0(:Q`&8R.0@`4`$,0(:Q`&9".1``4
+M-`*```""("&,@AF4)`/```!#$"2L@AF4$``!((^_`'27P@`",$4!\"0"`-`0
+MH@`P`C,@(RBB`-$00``&)`(!0"0"`,`0H@`6)`(#Z!```#9P@A@"$*(`!20"
+M`5`0H@`D)`(#Z!```#!P@A@"``2\0#P"4>LT0H4?`N(`&```$!```A##`!<?
+MPP!#N",`%Q*#KZ(`3"0###40```AKZ,`2``$*@`\`@E/-$(@E0"B`!@``!`0
+M``(00P`%'\,`0Q`CKZ(`3``$O$`\`E'K-$*%'P+B`!@``!`0``(0PP`7'\,`
+M0[@C)`(,-1````VOH@!(``2\`#P"4>LT0H4?`N(`&```$!```A##`!<?PP!#
+MN",`%Q*#KZ(`3"0#&&JOHP!()`(#Z'""&`(``QD`CZ0`2`!D`!H``!`2%(``
+M`@``````!P`-`$`8)3!B``\D"``$%$```R>E`"@D"``#)Z4`,!$``%H``(`E
+M``,Q`RC)`!TD!P`!$2``R`#0$"$D1``9+((`(1!``!$D@__?*((`&A!```8H
+M@@`;`(<0!(^C`!``0Q`E$```$*^B`!`40``/)((``22"__\`1Q`$CZ,`$`!#
+M$"40```(KZ(`$"QB`!000``&)((``0!G$`2/HP`4`$,0):^B`!0D@@`!+$(`
+M$!!```LD@O_Q`!`00`!%$"&40P````000"1"``(`0Q@$CZ(`&`!B&"40```G
+MKZ,`&"Q"`!`00``+)(+_X0`0$$``11`AE$,````$$$`D0O_B`$,8!(^B`!P`
+M8A@E$```&J^C`!PL0@`0$$``"R2"_]$`$!!``$40(91#````!!!`)$+_P@!#
+M&`2/H@`@`&(8)1````VOHP`@+$(`!Q!```LF`@`!`!`00`!%$"&40P````00
+M0"1"_Z(`0Q@$CZ(`)`!B&"6OHP`D)@(``3!0__\""!`J%$#_JP````".1``4
+M-`*```""("&,@AD,/`,`_S1C__\`0Q`D/`/_``!#$"6L@AD,CD,`%#0"@```
+M8A@AC&09(#P"<```@B`EK&09((Y$`!0T`H```((@(8^E`$P`!1T`/`(_\`!B
+M&"0\`@`/-$+__P+B$"0`8A@E/`)```!B&"6L@QF@CD(`%#0#@```0Q`ACZ,`
+M$*Q#&8".10`4-`*```"B*"&,I!F$/`+_\`""("2/H@`4/`,`#S1C__\`0Q`D
+M`((@):RD&82.0@`4-`.```!#$"&/HP`0K$,9F(Y%`!0T`H```*(H(8RD&9P\
+M`O_P`((@)(^B`!0\`P`/-&/__P!#$"0`@B`EK*09G(Y"`!0T`X```$,0(8^C
+M`!BL0QD`CD(`%#0#@```0Q`ACZ,`'*Q#&02.0@`4-`.```!#$"&/HP`@K$,9
+M"(Y$`!0T`H```((@(8R#&0PD`L```&(8)(^B`"0P0C__`&(8):R#&0R.0@`4
+M-`.```!#$"&/HP`8K$,9B(Y"`!0T`X```$,0(8^C`!RL0QF,CD(`%#0#@```
+M0Q`ACZ,`(*Q#&9".1``4-`*```""("&,@QF4)`+```!B&"2/H@`D,$(__P!B
+M&"6L@QF4C[\`=(^^`'"/MP!LC[8`:(^U`&2/M`!@C[,`7(^R`%B/L0!4C[``
+M4`/@``@GO0!X`(`X)3P$9`"4H@`",$(`$#P#R``X0@```&(@"Y2B``(P0D``
+M$$```R>]__`0```%``0@0I2B``(P0H````08@@!B(`N4H@```((`&P``&!(4
+M0``"```````'``T`8"`E!(``!R0&`!\DQO__$,``!`#$$`8P0@`!$$#_^P``
+M```D`@`F`$8P(R0"`!<`1A`C)`,``0!#&`0`@Q@A)`(`&`!&$",`0Q@&),;_
+M\(SE`!0T`H```*(H(8RB&!0\!``!-(3__P!$$"0``QQ``$,0):RB&!2,Y``4
+M-`*```""("&,@Q@4/`+__C1"'_\`8A@D``8S0#P"``$T0N```,(P)`!F&"6L
+M@Q@4`^``"">]`!`GO?_@K[\`&`"`,"4LHP!`)`(`/P!#*`JDQ0'\/`(``"1"
+M``",Q1(T`$#X"2>F`!"/OP`8`^``"">]`"`GO?^HK[\`5*^T`%"OLP!,K[(`
+M2*^Q`$2OL`!``("0)0"@F"4`P*`E`D"()3P0```F$```CB1&>`(`^`F.)49\
+M)B1&@`(`^`DD!0`@AB(!_"A"`$`40``"EB,!_"0#`#\``Q0```(\`RCC`#\X
+M8P`!,.+__RQ"``$`8A@E$&``!SP#```D8QZXCD("```"$$``0Q`A$````H1&
+M`````#`E)`(``:^B`!`GH@`@KZ(`%">B`"*OH@`8/`(``21"\7@"0"`E`$#X
+M"0)@*"400`#<`D`@):^T`!".(BR\)Z4`(">F`"(`0/@)`F`X)1!``-6/OP!4
+MCD0!S#B#``<X@@`+``(0*P`#$`H00``.)`,`"A"#``PD`@`)$((`"P``,"44
+M@P`%`````)9"`=`L0@`$%$``!B0%`#^6(D:>)$(`!*8B1IX``#`E)`4`/P`&
+M$$`D0D:``B(@(92"``"6(R_T`$,0(:2"```P0O__+$(`0!1```(`````I(4`
+M`"3&``$LP@`0%$#_\@`&$$"6(A*>+$(``A!``%D`````ED(!TBQ"`$(00``>
+M)`,`P)9B``(P0@#0%$,`&B0"";268P``%&(`#3P#9F:2(A*2EB,2G`!#$",\
+M`V9F-&-F9P!#`!@``!@0``,80P`"%\,`8A@C$```!S!E__^2(A*2-&-F9P!#
+M`!@``!`0``(00S!%__\\`@`!)$+Y,`!`^`D"0"`E```P)2>G`#@T"*&```8@
+M@"2"88`L0A``$$``'0````".(D9X`((0(91#``(``QH`-&,`_P`#'`"40@``
+M``(2`#1"`/\P0O__`&(8):^C`#B3HP`XD.(``0`"$@``8A@ED.(``@`"%```
+M8A@ED.(``P`"%@``8A@ECD(`%`!$$"$`2!`AK$,``!```!$DQ@`!CD4`%`"D
+M*"$`J"@ACB)&>`""("&4@P`"``,:`#1C`/\``QP`E((````"$@`T0@#_,$+_
+M_P!B&"6LHP``),8``2C"`"`40/_.``8@@(Y$`!0T`H```((@(98C1H8P8P`_
+M``,>`)8B1H0P0@`_``(4``!B&"66(D:",$(`/P`"$@``8A@EEB)&@#!"`#\`
+M8A@EK(,9-(Y$`!0T`H```((@(98C1HXP8P`_``,>`)8B1HPP0@`_``(4``!B
+M&"66(D:*,$(`/P`"$@``8A@EEB)&B#!"`#\`8A@EK(,9.(Y$`!0T`H```((@
+M(98C1I0P8P`_``,>`)8B1I(P0@`_``(4``!B&"66(D:>,$(`/P`"$@``8A@E
+MEB)&D#!"`#\`8A@EK(,B-(Y$`!0T`H```((@(98C1IPP8P`_``,>`)8B1IHP
+M0@`_``(4``!B&"66(D:8,$(`/P`"$@``8A@EEB)&EC!"`#\`8A@EK(,B.(Y$
+M`!0T`H```((@(8XE+]PD`@`_)`,`?P!E$`NL@AD\)`(``8^_`%2/M`!0C[,`
+M3(^R`$B/L0!$C[``0`/@``@GO0!8)[W_D*^_`&ROO@!HK[<`9*^V`&"OM0!<
+MK[0`6*^S`%2OL@!0K[$`3*^P`$BOI`!P`*"@)0`&-```!C0#KZ8`.``'/```
+M!SP#KZ<`/`"`B"4F,T:`)!X`/X*"``4``A!`,$+__Z^B`$`D`O_!CZ,`B*1B
+M``"/H@"$I%X``#P"```D0@```$#X"205`#\P4@#_``"`)8^C`'"48A-T$$``
+M)Z^@`$0F-P`&,E8`^``0$$`D0A-P`N(0(91#```08``:,D3__Q!D``8`$"F`
+ME$(``#!"``<T0@#@%((`$P`````")2@AEH0``#P#``$D8_K4`&#X"22E%]0D
+M!`#@%L0`"`!`&"4P8O__`J(0*Q!```(``````J`8)1````,P=?__$```!@!`
+MJ"4F$``!EB(3=`("$"H40/_>`!`00):"``(P0@#0)`,`P!1#`"TR0@#X-%(`
+M`98B$W000``J``"`)28W``8R5@#X`!`00"1"$W`"XA`AE$,``!!@`!HR1/__
+M$&0`!@`0*8"40@``,$(`!S1"`.`4@@`3``````(E*"&6A```/`,``21C^M0`
+M8/@))*47U"0$`.`6Q``(`$`8)3!B__\#PA`K$$```@`````#P!@E$````S!^
+M__\0```)`$#P)280``&6(A-T`@(0*A1`_]T`````$````Y:"``("H/`EEH(`
+M`C!"`0`00``#`````!````*")A*.@B82CSP"```D0@``CZ0`<`!`^`D"@"@E
+M``(6```"A@.6@P`",&(`0!!``)@P8@"`$$``"R>B`!B6)Q><KZ(`$#P"``$D
+M0OR<CZ0`<`*`*"4`0/@))B87GA````J/I0!`EB<72J^B`!`\`@`!)$+\G(^D
+M`'`"@"@E`$#X"28F%TR/I0!``+`0(P*B&"H"HQ`+``(4```"-`.6@@`",$(`
+M$!!``!B7H@`>EB(2<"Q",`$40``&`````)8B$GX`PA@J`,,0"P`"%````C0#
+MEB(2<"Q"0``40``+EZ(`'I:"``(P0@"`$$``!Y>B`!Z6(A*``,(8*@##$`L`
+M`A0```(T`Y>B`!X`PA@J`,,0"P`"%````A0#KZ(`1(^C`#@``Q!`CZ0`1`""
+M$",``A0```(T`P`&$"<``A?#``(P"H^E`#P`Q1`J$$```@"@&"4`P!@E``,4
+M```"-`./H@"`$$``0##"__^F9@`(IF8`!J9F``2F9@`"IF8``)>D`!PP@___
+M`$,0*Q!```(`P"@E`,`@):9D``J7I``:,(/__Y9B````0Q`K$$```@````"6
+M9```IF0`#)>D`!@P@___EF(```!#$"L00``"`````)9D``"F9``.``04```"
+M'`.6(A)P+$)``!1``!@`````EH(``C!"`(`00``'`,`@)98B$H0`PA`J$$``
+M!P#`$"40```0IF(`'I8B$H(`@A`J%$``"`#`$"66@@`",$(`@!!```,`````
+M$````I8B$H26(A*"$````Z9B`!Z68@``IF(`'H^D`(B$@@``$```!ZXB+_``
+MP"@EEZ(`&`#"&"H`PQ`+``(4```"'`./H@"$I$,``(^C`(BD90``EH,``C!B
+M`"`40``$,&,`T"0"`,`48@!3CZ0`@)8G%[PGH@`HKZ(`$#P"``$D0OR<CZ0`
+M<`*`*"4`0/@))B87OH^D`$``D!`C`\(8*@/#$`L``A0```(T`Y>B`"X`PA@J
+M`,,0"X^D`#@`!!A``$,0(P`"%````C0#``80)P`"%\,``C`*CZ4`/`#%$"H0
+M0``"`*`8)0#`&"4``Q0```(T`X^B`(`00``8EZ(`+@#"&"H`PQ`+IF(`$)>B
+M`"P`PA@J`,,0"Z9B`!(``AP```,D`Z9B`!27H@`J`,(8*@##$`NF8@`6IF(`
+M&)>B`"@`PA@J`,,0"Z9B`!H``AP```,<`Q````NF8@`<EZ(`+`#"&"H`PQ`+
+M``(4```")`.7H@`H`,(8*@##$`L``A0```(<`X^E`(2$H@```&(0*A!```(`
+M````I*,``(^C`(B$8@```$00*A!```(`````I&0``(^D`(`0@``&CZ4`B(2B
+M``"N(B_(EB(ORH^C`'"D8@'^)`(``8^_`&R/O@!HC[<`9(^V`&"/M0!<C[0`
+M6(^S`%2/L@!0C[$`3(^P`$@#X``()[T`<">]_["OOP!,K[X`2*^W`$2OM@!`
+MK[4`/*^T`#BOLP`TK[(`,*^Q`"ROL``H`("@):^E`%2.@BS``$#X"0#`N"40
+M0``\C[\`3(:"`?PH0@!`%$```I:#`?PD`P`_``,4```"G`,J8P`_.&,``3)B
+M__\L0@`!`&(8)1!@``<\`P``)&,>Q(Z"`@```A!``$,0(1````*$4@````"0
+M)1+@`",``(@E)[8`(">U`"(\`@`!)%[Q>``1$,"/HP!4`&*`(:^@`!"OM@`4
+MK[4`&`*`("4"`"@E`D`P)0/`^`D"8#@E$$``%(^_`$R'H@`B@@,`!@!#$"H0
+M0``$AZ(`().B`".B`@`&AZ(`(((#``<`0Q`J$$```I.B`"&B`@`')C$``0(W
+M$"L40/_D`!$0P"0"``&/OP!,C[X`2(^W`$2/M@!`C[4`/(^T`#B/LP`TC[(`
+M,(^Q`"R/L``H`^``"">]`%`GO?_`K[\`/*^R`#BOL0`TK[``,`"@D"4`@(`E
+MAA$2FCP"```D0@``)Z0`$"8%1H``0/@))`8`("0)``@GJ@`0)`T`""0.`#\`
+M"1A``4,8(91B````41`CI&(`````."4``%@E``E@0`!@,"6$P@``!$$``@``
+M``"DP```%.T``P%,*"$0```:)`<`#Y2H``"$I`````<00`!0$"&40T:`).(`
+M`12#`!(P1___%(``!"UB`#,E`@`!$```"J2B```40``%`````)3"```D0@`!
+M$```!*3"``"4P@``)$+__Z3"`````#@E)6(``3!+__\LX@`0%$#_W0`)$$`!
+M0A@AA&(``"A"`$`40``"``D@0*1N````D!`AE$)&@`!2$",H0P````,0"P%$
+M("&$@P``C@1&>``#&$``9!@A``(00`!$$"&40@``I&(``"4B``$P2?__+2(`
+M#Q1`_[P`"1A`)`D`"">D`!``"1!``%`8(0""$"&40@``I&)&@"4B``$P2?__
+M+2(`#Q1`__>/OP`\C[(`.(^Q`#2/L``P`^``"">]`$`GO?_`K[\`/*^R`#BO
+ML0`TK[``,`"@B"4PDO__EB(``!!``!$``#`E)Z0`&``&&$``@Q@A``80P`!1
+M$"&40@``I&(``"3&``$HP@`($$``!P#`@"4`!A#``%$0(91"```40/_S``88
+M0`#`@"4GH@`JKZ(`$#P"```D0@```D`@)2>E`!@PQO__`$#X"2>G`"@:```.
+M```P)9>C`"B7H@`8$&(`#)>B`"HGI``8),8``0#0$"H00``%``800`""$"&4
+M0@``%&+_^0````"7HP`HEZ(`*A1B``,`!A#`$'(`!@``````41`AC$(`!!!`
+M``0D`P`_``80P`!1$"&40P`"`&`0)8^_`#R/L@`XC[$`-(^P`#`#X``()[T`
+M0#"$__\PI?__,,;__S#G__^7J``2<.@8`A!@`"(``!`E$,4`'B0#`&0`A1`C
+M<$,0`@#%&",`0P`:```0$A1@``(```````<`#0`"%````B0#!(``$P#@&"4H
+M@@!E$$``$`$`&"4D`@!D`$00(P!'`!APB``````8$CP"4>LT0H4?`&(`&```
+M$!```A%#``,?PP!#$",0```",$/__P#@&"4`8!`E`^``"``````GO?^XK[\`
+M1*^T`$"OLP`\K[(`.*^Q`#2OL``P`*"8)0#`D"6/M`!8,/#__Q(```X``"`E
+M)Z4`&``$&$``HQ@A``00@`!$$"$``A!``%(0(91"``BD8@``)(0``0"0$"H4
+M0/_V``080)9D```GH@`JKZ(`$#P"```D0@``)Z4`&`(`,"4`0/@))Z<`*```
+M2"4``#@E```@)2>E`!B7J``HEZ8`*@"0$"H00``,``000`"B$"&40@``,(/_
+M_P$"$"8`8C@*``000`"B$"&40@``%,+_]"2$``$`8$@EEF0``)>E`"B7I@`J
+M``>(@`(GB"$`$8A``C*((98G``8`"8"``@F`(0`0@$`"$H`AE@(`!CP2``$F
+M4OOP`D#X":^B`!"F@@`&EF0``)>E`"B7I@`JEB<`!)8"``0"0/@)KZ(`$*:"
+M``269```EZ4`*)>F`"J6)P`"E@(``@)`^`FOH@`0IH(``I9D``"7I0`HEZ8`
+M*I8G``"6`@```D#X":^B`!"F@@``C[\`1(^T`$"/LP`\C[(`.(^Q`#2/L``P
+M`^``"">]`$B/J@`0,,;__S"$__\D`P!D<(,@`@`&,$"4H@``<$,0`B1"__8`
+M@A`K$$``!0"F,"&4H@``I4(```/@``BDX@``E,+__B0#`&1P0Q`")$(`"@!$
+M$"L00``-`*80*Y3"__ZE0@```^``"*3B``"E0P```^``"*3C``"4H@``I.(`
+M`)2B``(#X``(I4(``!!``!0`!!0`)`@`9``"3`.$H@``<$@0`@!)$",D0@`)
+M+$(`$Q1`_^Z4HP``E*(``G!($`(D0O_V`((0*Q1`_^L`````)*4``@"F$"L4
+M0/_P``````/@``@``````(`P)93"`=0P0@#P)$+_T"Q"`$`00``2),4L$#P$
+M```DA"!`C(,`!*S#+!```Q#``$,0(0`"$(`DA``(`$00(:S"+"PD`@`!K,(L
+M*"0"`!2LPBP<)`(`50/@``BLPBP@/`0``"2$'M",@P`$K*,````#$,``0Q`A
+M``(0@"2$``@`1!`AK*(`'"0"``&LH@`8)`(`%*RB``PD`@`C`^``"*RB`!`G
+MO?_HK[\`%*^P`!``@!@EE&(!U#!"`/`D0O_0+$(`0!!``!8`H(`EC&(LL`!`
+M^`DD!0`'/`,``21CW"0`0"`E)`4``20&`"0`8/@)```X)0``2"4D"`!K```P
+M)20#``$40P`B)`<`:R0(`%,D!P!3)`(`-Q```!VN`@`0C&(LL`!@("4`0/@)
+M)`4`!SP#``$D8]PD`$`@)20%``8D!@`E`&#X"0``."4``$@E)$0`!"0#`#(X
+M0@`_`&!`)0""0`LD`P!``&`P)0`",`HDQP`R)`,`%``"&`NN`P`,),0`(R3#
+M`#<`@A@*K@,`$(X%``0`J1`K`048*P!#$"400``$```@)0"F&"L`Y1`K`&(@
+M)0"`$"6/OP`4C[``$`/@``@GO0`8)[W_\(2"+_2,@R_P`$,0(8R%`!0T`X``
+M`*,H(0`"$D`P0GX`-$*``*RB&3`D`@`!K((OQ`/@``@GO0`0)[W_X*^_`!RO
+ML@`8K[$`%*^P`!``@(@E`B"0)28P+!".(RPH$&``10``$"6.(R_$)`(``11B
+M`$`T`X``CD(`%`!#$"&,0QDP,&*``!1``#H``R9"``,5PC!"``,D`P`"%$,`
+M#*X$``260@'2+$(`0A1```4`````EB(2F@!$$"$0```$K@(`!(X"``0D0@`%
+MK@(`!)9"`=0P0@#P)$+_T"Q"`$`00``,/`(``21"!&``0/@)`D`@)8X$``2.
+M`P`4`(,0*Q1```,`@Q`C$````JX"``2N```$KB`OQ#P"``$D0O_,`D`@)0!`
+M^`D"`"@E%$``$3P"``$D0@*``D`@)0!`^`D"`"@E$$``"SP"``$D0@*P`D`@
+M)0!`^`D"`"@E&$``!20"``*N(B_$)`(``:XB+]BN("_`CB(OQ(^_`!R/L@`8
+MC[$`%(^P`!`#X``()[T`((RC``2,H@`,`$,0*Q!```4``"`EC*(`$`!B$"L4
+M0``"`````"0$``$#X``(`(`0)0"@."64@@'4,$(`\"1"_]`L0@!`/`,``!1`
+M``,D:"!`/`(``"1('M",Y`````00P`!$$"$``A"``0(0(21"``BLX@`<C.(`
+M!(SC`!``0Q`K%$``)``````0@`!3)`+__XSB``2LX@`(C.,`$`!#$"L40``:
+M`&!()8SB```00``7`````(SB```D1O__K.8````&(,``AB`A``0@@`"($"&,
+MY0`<C$,`&(RB`!``8A@C``,80(SB``@`0Q`CK.(`"`$$("$DA``(`$D0*Q1`
+M``.LY``<%,#_ZP`````#X``()`(``8SB``2,XP`,`&(8*Q1@`"T``!`EC0,`
+M`"1C__^,Y```$(,`*"0"__Z,XP`$K.,`"(SB``P`0$@E`$,0*Q1``"$D`@`"
+MC0,``"1C__^,X@```$`@)0!#$"L00``:)`(``B2&``&LY@````8@P`"&("$`
+M!""``(@0(8SE`!R,0P`8C*(`$`!B&",``QA`C.(`"`!#$".LX@`(`00@(22$
+M``@!(A`K%$``!JSD`!R-`@``)$+__P#"$"L40/_I`,`@)20"``(#X``(````
+M`">]_]BOOP`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@(@E)C(L$*X@+"2.(BRP
+M`$#X"20%``<\`P`!)'3<)`!`("4D!0`!)`8`)`*`^`D``#@E`$"8)20"``$6
+M8@`AC[\`)(XB+"R$4```CB(LL`(@("4`0/@))`4`!P!`("4D!0`$)`8`(`*`
+M^`D``#@E$A,`"P!`&"42```')`(``A("``DD`@`#$@(`"X^_`"00```-C[0`
+M(!````FN0``4$```!ZY#`!0``Q!`)$+_^Q````.N0@`4``,00*Y"`!2/OP`D
+MC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_^"OOP`<K[(`&*^Q`!2O
+ML``0`("0)0#`B"4`X(`E/`(``"1"````H"`E`$#X"0(@*"4`0#@E)@;__P`&
+M,,(F$/__&B``'S(0``<D"@`()`D``8^B`#```D#``A$8(2AB``D!0A@*`&D8
+M!"1C__\""1`$)$+__P!B&"8!`Q@$``8H@`"R*"$``R`GC*(```""("0"!Q`$
+M`0(0!`!#$"0`1!`EK*(```(P$"$D4?_X`5`0(P!'.`8``(`E'B#_YR3&``&/
+MOP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?^@K[\`6*^W`%2OM@!0K[4`3*^T
+M`$BOLP!$K[(`0*^Q`#ROL``X`*"X)9;B``(P0D``$$``!P"`F"4\`@``)$(`
+M``!`^`DD!0(`$```%`!`D"66X@`",$*``!!```<\`@``)$(```)@("4`0/@)
+M)`4$`!````H`0)`EEN,``C!C`!`D!@$`)`4``B1"```"8"`E`$#X"0##*`H`
+M0)`ECD(``!A``#T``(@E/`(``"16```GM``H-!6'```1$$``41`A``(0@"1"
+M`"`"0H`AD@(`"``"$(`D0D<`+$(0`!!``!D"8"`ED@<`"Z^@`!`"0"@E`L#X
+M"20&``ZOH@`HDZ0`*)*"``$``A(``((@)9*"``(``A0``((@)9*"``,``A8`
+M`((@)9(#``@``QB`CF(`%`!#$"$`51`AK$0``!```!(F,0`!`!&`0`(1@"$`
+M$("`)A``(`)0@"&2!P`+KZ``$`)`*"4"P/@))`8`#I($``@`!""`CF,`%`!D
+M&"$`=1@AK&(``"8Q``&.0@```B(0*A1`_\H`$1!`EN(``C!"`!`40`!SC[\`
+M6#P"```D0@```F`@)0!`^`DD!0`(`$"0)8Y"```80`!I``"()3P"```D5@``
+M)[4`+"07``$GM``P`!$00`!1$"$``A"`)$(`(`)"&"&08@`(``(@@#0"AP``
+M@H`AD&(`!11``%,D@D<`+$(0`!!``!8"8"`ED&<`"Z^@`!`"0"@E`L#X"20&
+M``ZOH@`LDZ,`+)*B``$``A(``&(8)9*B``(``A0``&(8)9*B``,``A8``&(8
+M)8YB`!0`4!`AK$,``!````X`$1!``!$00`!1$"$``A"``%(0(9!'`"NOH``0
+M`D`H)0+`^`DD!@`.CF,`%`!P&"&L8@```!$00`!1$"$``A"`)$(`(`)"&"&0
+M8@`)$$``)P`"$(`"`H`A)@+``"Q"$``00``6`F`@)9!G``NOMP`0`D`H)0+`
+M^`DD!@`.KZ(`,).C`#"2@@`!``(2``!B&"62@@`"``(4``!B&"62@@`#``(6
+M``!B&"6.8@`4`%`0(:Q#```0```.)C$``0`1$$``41`A``(0@`!2$"&01P`K
+MK[<`$`)`*"4"P/@))`8`#HYC`!0`<!@AK&(``"8Q``&.0@```B(0*A1`_Y\`
+M$1!`C[\`6(^W`%2/M@!0C[4`3(^T`$B/LP!$C[(`0(^Q`#R/L``X`^``"">]
+M`&`GO?_PC((`%#0#@```0Q`AC$(`'#!'/X"4H@`",$)``!!```<D"@$$/`L?
+M@#P&`!LD!0`3)`@-K!````<D"0`4)`H`TCP+'X`\!@`V)`4`"20(#4@D"0`*
+MC(,`%#0"@```8A@A`*<0)0!&$"4`2Q`EK&(`'(R"`!2L2A!PC((`%*Q($+",
+MA``4C((0\#P#__`T8P/_`$,0)``)&H``0Q`EK((0\`/@``@GO0`0)[W_R*^_
+M`#"OLP`LK[(`**^Q`"2OL``@`("8)0"@@"6.8RQ$/`5__S2E__\\`@``)$(`
+M``!`^`D`92@D`$`H)8YB`!2,1@`P,-$#\``1B0("()`E+B(``BQ"``$2```%
+M`D*0(R0"`"4`41`C``(00@(BD"$240`')`/\#XYD`!0`PQ@D`!(1`#!"`_``
+M8A@EK(,`,#P"```D0@```$#X"0)@("4"41`F``(0*X^_`#"/LP`LC[(`*(^Q
+M`"2/L``@`^``"">]`#@GO?_HK[\`$`"@."4`@$`EE(,!Z`#C&"H08``)```0
+M)0`'*0``IR@C``4H@`$%*"$\`@``)$(```!`^`DDI2S@C[\`$`/@``@GO0`8
+M)[W_Z*^_`!``P$`E`(`X)92#`>@`HQ@J$&``"@``$"4`!3$``,4P(P`&,(``
+MYC`A/`(``"1"```!`"@E`$#X"23&+."/OP`0`^``"">]`!@GO?_0K[\`**^U
+M`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`H"4`H)`E`,"H)2:#`>`D`@`"$D(`
+M$"03``LN0@`#$$``!B0"``,D`@`!$D(`("0"__\0``!:C[\`*!)"``P\`@`%
+M)`(`!!)"``XD`O__$```4X^_`"B4<0`()C'__SP"``4T0@#`$```*`)BF"64
+M<0`()C'__C1"`<`0```C`F*8)91Q``@F,?_]`!$1``!1$",``A"``$00(8Q"
+M+.000``:`````!```#PD`O__E&(`"!!``!$``(@EC((LY!!```T`````E&8`
+M""2%``0F,0`!`B80*A!```<`$1$``%$0(P`"$(``11`AC$(LX!1`__<`````
+ME&(`"!8B``,`````$```)20"__\`$1$``%$0(P`"$(``@H`A)A`LX(X#``04
+M8``=)`+__SP"```D0@```@`@)0!`^`DD!0`\%J``#:X2``2N$P`,)`(``JX"
+M`!0D`O__K@(`&"0"`_^N`@`<)`(`"J8"`""F`@`B$```":X``#2.H@`PK@(`
+M-#P"```D0@```H`@)0(@*"4`0/@)`J`P)0(@$"6/OP`HC[4`)(^T`""/LP`<
+MC[(`&(^Q`!2/L``0`^``"">]`#`GO?_P`(`X)8R&`!2,A2S,,*4#_XR"+-0`
+M`A0`/`,#_P!#$"0`HB@EK,4`I(SF`!2,A2S0,*4#_XR"+-@``A0``$,0)`"B
+M*"6LQ0"HC.4`%(RC`*PD`OP``&(8)(R"+-PP0@/_`&(8):RC`*P#X``()[T`
+M$">]_^BOOP`0`*`X)0"`,"64@P'H`.,8*Q!@`"```!`E``<1``!'$",``A"`
+M`,(H(22E+.",HP`$$&``&```$"6LH``$)`,``0#C&`0``Q@GC,(LS`!B$"2L
+MPBS,C,(LT`!B$"2LPBS0C,(LU`!B$"2LPBS4C,(LV`!B$"2LPBS8C,(LW`!B
+M&"0\`@`!)$(-Q`!`^`FLPRS<)`(``8^_`!`#X``()[T`&">]_XBOOP!P`(!8
+M)0"@4"4!8$@EC602-)5C`>@!0Q@K$&`"00``$"4`"A$``$H0(P`"$(`!(C`A
+M),8LX(S#``008`(Y)`(``8S#`!@D`O__%&(`C``````0@`!^)`,`H)2"``(P
+M0@"@%$,`>B0#`!\0``!Z)`0``3"$`_^,P@`<``(2@#1C_```0Q`D`((@)8S"
+M`!0``A4`/`,/\`!#$"0`@B`EKZ0`0).C`$`GI`!`D((``0`"$@``8A@ED((`
+M`@`"%```8A@ED((``P`"%@``8A@EC6(`%`!%$"&L0Q!`$```?@`**("4PP`B
+M``,9`#!C`/"4P@`@,$(`#P!B&"4\`@`(-$(@``!B&"6OHP!$DZ,`1)""``$`
+M`A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)8UB`!0`11`AK$,0@!``
+M`'<D!0@`-&/__P"#&"2,P@`H``(6``!B&"6OHP!(DZ,`2">D`$B0@@`!``(2
+M``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6-8@`4`$@0(:Q#",`0``!U
+M)`+_\#1"__\`8A`D/`,!``!#$"6OH@!,DZ,`3">D`$R0@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6-8@`4`$@0(:Q#"0`0``!W``I`@(S"
+M`"PT8___`$,8)``"$"L``A4``$,0):^B`%"3HP!0)Z0`4)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8``&(8)8UB`!0`2!`AK$,0P!```&^,P@`P
+M)`,`#R0$``$`@Q`K$$``"@`**(``!!!`-$0``0"#$"L40/_]``000!````,`
+M"BB`C,0`&``**(`DHM!`+$(0`!1`_W@\`P`/`*`0)8UE`!0`HB@A,(0#_XS"
+M`!P``A*`-&/\``!#$"0`@B`EC,(`%``"%0`\`P_P`$,0)`""("6LI!!```HH
+M@"2BT(`L0A``%$#_@">D`$0`H!`EC60`%`""("&4PP`B``,9`#!C`/"4P@`@
+M,$(`#P!B&"4\`@`(-$(@``!B&"6L@Q"`)`4(`(S$`"00@``7)`<!```*0(`E
+M`LC`+$(0`!1`_X,\`P#_`0`0)8UD`!0`@B`AC,,`)#P"`/\T0O__`&(8)(S"
+M`"@``A8``&(8):R#",`D`O_P`*(H)#2E``&,PP`H-*(!``!#*`N,PP`P$&``
+M#P`*0(`E`LD`+$(0`!1`_X$\`@#_`0`0)8UD`!0`@B`A`&`0)3P#`/\T8___
+M`$,0)#P#`0``0Q`EK(()```*0(`E`M#`+$(0`!1`_X<\`P`/`0`0)8UD`!0`
+M@B`AC,(`+#1C__\`0Q@D``(0*P`"%0``0Q`EK((0P(S"`#`00``$-*,"`(S"
+M``PP0@`@`&(H"XS"``PP0@!`$$```R0"__``HB@D-*4``C"B``\00``/````
+M`(S"``PP0@$`$$```R0"_[\0```"-*4`0`"B*"2,P@`,,$(`@!!```,D`O_?
+M$````C2E`"``HB@DC,(`##P#``$`0Q`D$$```CP"`"``XC@EC,(`##P#`(``
+M0Q@D-.0"``"#.`L\`P`$`$,0)!!```,\`@`"$```!@#C."6,PP`,`&(8)`#B
+M$"4X8P```$,X"XS$``P\`@`(`((0)#3C0```8C@+/`(`$`""("0`XA`E.(0`
+M``!$.`N,PP`$)`(``A!B``4D`@`#$&(`7``````0``!UC,(`.#2E`*(\`@`E
+M$```<`#B."4\`@$``((0):^B`%23HP!4)Z0`5)""``$``A(``&(8)9""``(`
+M`A0``&(8)9""``,``A8``&(8)8UB`!0`2!`AK$,)`!```%P\`@`$KZ4`6).C
+M`%B0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6-8@`4`$@0
+M(:Q#"<`0``!<``HH@*^G`%R3HP!<D((``0`"$@``8A@ED((``@`"%```8A@E
+MD((``P`"%@``8A@EC6(`%`!%$"&L0Q$`$```58S"`#2-8@`4`&(0(8Q""<"O
+MH@!@DZ,`8">D`&"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B
+M&"4T8Q``KZ,`9).C`&0GI`!DD((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@``8A@EC60`%``*$(``1!`AK$,)P!```&",P@`,C,(`,!1``!8TI0!B
+M/`(``#P#``",0@``C&,```!#$".-(R_D`&(@(SP"``",0@```((@(P`*0(`E
+M`LD`+$(0`!1`_YH`!"*``0`0)8UC`!0`8A@A/`(!``""$"6L8@D`/`(`!`#B
+M."6,P@`X,$(``1!```(\`@`D`.(X)0`*0(`E`LG`+$(0`!1`_YLGI`!8`0`8
+M)8UB`!0`0Q`AK$4)P``**(`DHM$`+$(0`!1`_Z(GI`!<`*`8)8UB`!0`0Q`A
+MK$<1`(S"`#000``K``H00(UC`!0D0@!0K&(+`(UC`!2,P@`TK&(+!(UC`!0D
+M`@`)K&(+"``*&(`D8LG`+$(0`!1`_YT`````C6,`%``*$(``0Q@A)$+)P"Q"
+M$``00``0)&4)P(QB"<"OH@!HDZ,`:">D`&B0@@`!``(2``!B&"60@@`"``(4
+M``!B&"60@@`#``(6``!B&"40```&-&(0`(UB`!0`"AB``&(8(8QB"<`T0A``
+MK*(``(S"``PP0@`!$$``!B0"``$!0A`$C2,LS`!#$"40```&K2(LS`%"$`0`
+M`A`GC2,LS`!#$"2M(BS,C,(`##!"``$00``&)`(``0%"$`2-(RS0`$,0)1``
+M``:M(BS0`4(0!``"$">-(RS0`$,0)*TB+-",P@`,,$(``A!```8D`@`!`4(0
+M!(TC+-0`0Q`E$```!JTB+-0!0A`$``(0)XTC+-0`0Q`DK2(LU(S"``PP0@`$
+M$$``!B0"``$!0A`$C2,LV`!#$"40```&K2(LV`%"$`0``A`GC2,LV`!#$"2M
+M(BS8C,(`##!"``@00``&)`(``0%"$`2-(RS<`$,0)1````:M(BS<`4(0!``"
+M$">-(RS<`$,0)*TB+-P\`@`!)$(-Q`%@("4`0/@)`,`H)20"``&/OP!P`^``
+M"">]`'@`@!@E``4@@"2"R``L0A``$$``$2>]_^B,8@`4`$00(8Q""`"OH@`0
+MDZ,`$">D`!"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6`!````4`
+M8A`E``40@(QC`!0`8A@AC&((``/@``@GO0`8)[W_Z``%.(`DXL@`+$(0`!!`
+M`!(`@$`EKZ8`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@``8A@EC0(`%`!'$"&L0P@`$```!B0"``$`!1B`C0(`%`!#$"&L1@@`
+M)`(``0/@``@GO0`8)[W_\(R#`!0D`@`!`*(0!*QB"$`D`@`!`^``"">]`!``
+M!1B`)&+*`"Q"$``00``()[W_Z(R"`!0`0Q`AC$(*`*^B`!"3H@`0$```!C!"
+M``,`!1"`C(,`%`!B&"&,8@H`,$(``Q1```8D`P`!C((`%`"C&`2,0@A``&(8
+M)``#$"L#X``()[T`&">]_\"OOP`XK[4`-*^T`#"OLP`LK[(`**^Q`"2OL``@
+M`("()0"@J"6.(P`4)`(``0*B$`2L8@B`)!,#Z#P"```D4@``/`(``!````0D
+M4````@#X"20$`&0F<___$F``!0(@("4"0/@)`J`H)11`__@`````/`(``"1"
+M```"("`E`$#X"0*@*"400`!7`````(XD`<PX@P`'+&,``3B"``LL0@`!`&(8
+M)11@``P``#`E)`,`"A"#``DD`@`)$((`!P`````4@P!(`````)8B`=`L0@`$
+M$$``1``````T!8``/`@`"C4(`&0\!P`!CB(`%`!%$"&,1`!,K$@!`(XC`!0`
+M91@A``02@C!"__\`1Q`EK&(`_(XB`!0`11`AC$(`3``"$H(`!"*"$$0`!0``
+M```DQ@`!+,(``A1`_^P`````CB0`%#0"@```@B`AC((`2#P#`$``0Q`EK((`
+M2#P"```D0@```$#X"20$`,B.)``4-`*```""("&,@@#\/`/__C1C__\`0Q`D
+MK((`_"00`&0\`@``)%0``#P"```0```#)%(```)`^`DD!``*`B`@)0*`^`D"
+MH"@E$$```R80__\6`/_X`````(XD`!0T`H```((@(8R"`$@\`_^_-&/__P!#
+M$"2L@@!(CB(`%*Q`"(``$Q`KC[\`.(^U`#2/M``PC[,`+(^R`"B/L0`DC[``
+M(`/@``@GO0!`CZ(`%(^J`""/IP`DCZD`*(^K`"R$@R_T`$,0(2Q$`$`D`P`_
+M`&00"C#&#_\``A0``,(P)0`)$4(P0@`!``(5P`!&$"4`!SY`/`,>``#C."0`
+M1Q@E,2(``1!```,`H$`E/`(!``!B&"4`"1$",$(``0`"%T``0Q`EJ0(`"+D"
+M``N/HP`0``,=`(^F`#P`!C9`CZ4`-``%+T"/I``X``0FP``)$$(P0@`!``(6
+M``!F&"4`91@E`&08)0!#$"6I`@`,N0(`#X^C`!P``QP`/`(`#P!B&"0`"1)`
+M,$*```!#$"6I`@`0N0(`$X^B`!BI`@`4N0(`%R0"__\10@`/``H30(D$``R9
+M!``//`,`#S1CX```0Q`D`((@):D$``RY!``/B0(`")D"``L\`T```$,0):D"
+M``BY`@`+,2(`#!!``!\\`W\`-&/_``%C&`<P8P`!$&``&P``$"4Q(@`(/`2`
+M```"(`J)`P`(F0,`"P`)$((P0@`!``(5@`!D&"4`0Q`EJ0(`"+D"``N)`P`0
+MF0,`$X^B`#`P0G__`&(8):D#`!"Y`P`3B0(`%)D"`!<`"QT``$,0):D"`!2Y
+M`@`7)`(``0/@``@`````CZ@`%!#@`!"/J0`<B*,`$)BC`!,`!Q4`/`0`\`!$
+M$"0`8A@E-&.``*BC`!"XHP`3B*(`%)BB`!<`!AE``$,0):BB`!2XH@`7$0``
+M$``(%@"(HP`0F*,`$SP$#P``1!`D`&(8)31C@`"HHP`0N*,`$XBC`!28HP`7
+MCZ(`$``"$H``8A@EJ*,`%+BC`!<1(``.``D?`(BB`!"8H@`3`$,0)31"@`"H
+MH@`0N*(`$XBC`!28HP`7CZ(`&``"$\``8A@EJ*,`%+BC`!<#X``()`(``8BB
+M``B8H@`+/`,@``!#$"6HH@`(N*(`"P/@``@`````CZ(`$!#@``N/HP`4B*,`
+M#)BC``\L0@`!``(3``!F&"4`0Q`EJ*(`#+BB``\0```;`````!!```\`````
+MJ*``"+B@``NHI@`,N*8`#XAB`!"88@`3J*(`$+BB`!.(8@`4F&(`%ZBB`!2X
+MH@`7$```"P```````!@EJ*,`"+BC``LTPA``J*(`#+BB``^HHP`0N*,`$ZBC
+M`!2XHP`7J*``'+B@`!^(H@`<F*(`'ZBB`!BXH@`;`^``""0"``&(HP`<F*,`
+M'S!C``$08`"3)`(`#XBB`!R8H@`?,$(?_@`"$$*DP@``B*(`&)BB`!L``A0"
+MI,(``J#```2(H@`8F*(`&S!"``$40``7`````(BB`!B8H@`;,$(``A!```(D
+M`@`!H,(`!(BB`!B8H@`;,$(`"!!```0`````D,(`!#1"``*@P@`$B*(`&)BB
+M`!LP0@`$$$``!`````"0P@`$-$(`!*#"``2(H@`<F*(`'P`"%4(P0@`#H,(`
+M"S!#`/\D`@`!$&(`$BAB``(00``%)`(``A!@``D`````$```(``````08@`1
+M)`(``Q!B`!8`````$```&@````"(H@`4F*(`%S!"`!\0```5H,(`!8BB`!28
+MH@`7,$(#X``"$4(T0@"`$```#J#"``6(H@`4F*(`%S!"?````A*"-$(`@!``
+M``>@P@`%B*(`%)BB`!<``A/",$(`'S1"`("@P@`%B*(`')BB`!\``A-"H,(`
+M!HBB`!B8H@`;,$(`\``"$0*@P@`'B*(`&)BB`!LP0@\```(2`J#"``B0PP`+
+M)`(``A!B`!(`````*&(``Q!```8D`@`#)`(``1!B`!,`````$```&``````4
+M8@`6`````(BC`!"8HP`3``,>`C!C``^0P@`(`$,0(:#"``B(HP`0F*,`$P`#
+M'0(P8P`/D,(`"`!#$"&@P@`(B*,`$)BC`!,``QP",&,`#Y#"``@`0Q`AH,(`
+M"(BB`!B8H@`;,$+P```"$P*@P@`)B*,`')BC`!\\`@$``&(8)"QC``$D`@`"
+M`$,0(Z#"``H``!`E`^``"`````",H@``C(-&H`!#$"2LH@````(0)XR#1J``
+M0Q`D`^``"*R"1J```````````">]_]BOOP`DK[``(`"`@"4\`@``)$(```!`
+M^`DF!2R$C@(`%#0#@```0Q`AK$`!)(X"`!0`0Q`AK$`!*(X"`!2L0`!`C@(`
+M%`!#$"$\`P`"K$,!,(X"`!0T`X```$,0(3P#`@"L0P$XC[\`)(^P`"`#X``(
+M)[T`*">]_]BOOP`DK[``(`"`@"6.`P`4)`(`!JQB`$`\`@``)$(```!`^`DF
+M!2R$C@(`%#0#@```0Q`AK$`!)(X"`!0`0Q`AK$`!*(^_`"2/L``@`^``"">]
+M`"@`@#@E```P)20(`%APR!@"`&<0(91$,"B4HP``$(,`%`#`$"5PR!`")$(P
+M*`#B&"&48@``%$``"B3&``$DQO__E*(``*1B``"4H@`"I&(``I"B``2@8@`$
+M`^``"`#`$"4LP@!`%$#_ZG#(&`(``!`E`^``"``````#X``(C((P)">]_^BO
+MOP`4K[``$`"`@"4\`@``)$(```!`^`DF!2R$)@(L2(^_`!2/L``0`^``"">]
+M`!@GO?_0K[\`+*^R`"BOL0`DK[``(`"`B"4`H)`E`B"`)9("`>,``A'"K@(P
+M'#P"```D0@``)@0P*`!`^`DD!18````P)20'`%@D&``')`\``B0.`?0D"`#(
+M)`T`9"0,`"@D"P`'/`H`OS5*_@P\"0"_-2G_.(XB`<PL0@`'$$``!'#'&`(`
+M<!`A$````Z!8,#``<!`AH$\P,'#'(`(F!0`$`(40(:Q.,#@D@S!``@,0(:Q(
+M````HQ@AK&@``"2#,$@"`Q`AK$T```"0$"&L3#!0`*,8(:QK```D@C`P`@(0
+M(:!```2@0``%D$,``*!#``*@0``#C@(P'!!```0`A1`AK$HP:`"0$"&L23!P
+M),8``2S"`$`40/_7`````(X",!P00``.-`.``(XB`!0`0Q`AC@,P;*Q#`2R.
+M(@`4-`.```!#$"&.`S!PK$,!-#P"```D0@```$#X"0(@("4D`@!D$D``!:X"
+M,"".`C`8-$(``1````6N`C`8C@(P&"0#__X`0Q`DK@(P&(^_`"R/L@`HC[$`
+M)(^P`"`#X``()[T`,">]_]BOOP`DK[``(`"`@"6.`C`<$$``"SP"```D0@``
+M`$#X"0````".`@`4-`.```!#$"&L0`$LC@(`%`!#$"&L0`$TC[\`)(^P`"`#
+MX``()[T`*">]_Z"OOP!8K[$`5*^P`%``@(@E`B"`)2RB``<00`&HC@@P)#P"
+M```D0B'0``48@`!B&"&,8@```$``"```````P#@E+,,`!1!@`:```!`ECB4`
+M%#0"@```HB@AC*084#P"\`\T0O__`((@)``'$(``4!`AC$)&*``"%0`\`P_P
+M`$,0)`""("6LI!A0CB0`%#0"@```@B`AC(,87"0"@'\`8A@D``<0@`!0$"&,
+M0D90``(1P#!"?X``8A@EK(,87(XE`!0T`H```*(H(8RD&%P\`O_`-$)__P""
+M("0`!Q"``%`0(8Q"1CP``A/`/`,`/S1C@```0Q`D`((@):RD&%R.)0`4-`*`
+M``"B*"&,I!A8/`+\`S1"__\`@B`D``<0@`!0$"&,0D9D``(4@#P#`_P`0Q`D
+M`((@):RD&%B1`@`)`$<0*Q!```4`````C@(L2"1"``$0```(K@(L2)$"``D`
+MXA`K$$``!`````".`BQ,)$(``:X"+$P0``%3H0<`"20#`'^OHP`0)`(`,J^B
+M`!2OHP`8)`(`**^B`!ROHP`@)`(`3:^B`"2OHP`H)`(`0*^B`"PD`@`?KZ(`
+M,"0"`!"OH@`T)`(`/Z^B`#@D`@`PKZ(`/``&,"N.)0`4-`*```"B*"&,I!AL
+M/`+_X#1"/_\`@B`D``88@">B`!``0Q`AC$(````"$X`\`P`?-&/```!#$"0`
+M@B`EK*08;(XE`!0T`H```*(H(8RD&&P\`O`?-$+__P""("0`!AB`)Z(`&`!#
+M$"&,0@````(50#P##^``0Q`D`((@):RD&&R.)0`4-`*```"B*"&,I!AH/`+_
+M`31"__\`@B`D``88@">B`"``0Q`AC$(````"%$`\`P#^`$,0)`""("6LI!AH
+MCB4`%#0"@```HB@AC*08:#P"@/\T0O__`((@)``&&(`GH@`H`$,0(8Q"````
+M`A8`/`-_``!#$"0`@B`EK*08:(XE`!0T`H```*(H(8RC&&@D`O_@`&(8)``&
+M((`GH@`P`$00(8Q"```P0@`?`&(8):RC&&B.)0`4-`*```"B*"&,HQAL)`+`
+M_P!B&"0GH@`X`$00(8Q"`````A(`,$(_``!B&"6LHQAL$,``"30"@`".(@`4
+M-`.```!#$"&,0QAL-&,``:Q#&&P0```(+,,``8XD`!0`@B`AC((8;"0#__X`
+M0Q`DK((8;"S#``&1`@`,$&(`SR0"``$0P``%`````(X"+%@D0@`!$```!*X"
+M+%B.`BQ<)$(``:X"+%PLP@`!$```PJ$"``PD`@`(KZ(`$"0"``:OH@`4``8P
+M*XXE`!0T`H```*(H(8RC(@@D`O_``&(8)``&((`GH@`0`$00(8Q"```P0@`_
+M`&(8):RC(@B1`@`-$,(`KB0"``$0P``%`````(X"+&`D0@`!$```!*X"+&".
+M`BQD)$(``:X"+&00``"BH08`#:^@`!`D`@`$KZ(`%"0"``BOH@`8`,`X)2S#
+M``,08`":```0)8XE`!0T`H```*(H(8RD&%@\`O_\-$(/_P""("0`!Q"``Z(0
+M(8Q"`!```A,`/`,``S1C\```0Q`D`((@):RD&%B1`@`+`$<0*Q!```4`````
+MC@(L:"1"``$0```(K@(L:)$"``L`XA`K$$``!`````".`BQL)$(``:X"+&P0
+M``!XH0<`"SP"```D0R&PC$(AL*^B`!",8@`$KZ(`%(QB``BOH@`8C&(`#*^B
+M`!R,8@`0KZ(`((QB`!2OH@`DC&(`&*^B`"B,8@`<KZ(`+`#`*"4LPP`($&``
+M8P``$"6.)``4-`*```""("&,@QDD)`+_`0!B&"0`!1"``Z(0(8Q"`!```A!`
+M,$(`_@!B&"6L@QDDD0(`"@!%$"L00``%`````(X"+%`D0@`!$```"*X"+%"1
+M`@`*`*(0*Q!```0`````C@(L5"1"``&N`BQ4$```1*$%``H4P``4)`/__8X"
+M,!@`0Q`DK@(P&#P"```D0@```$#X"0(@("4\`@``)$(```!`^`D"("`E)`7^
+M_SP#```D8P```B`@)0!@^`D`12@D$```,"0"``&.`C`8,$(``A1``"PD`@`!
+MC@(P'!!``!H\`@``)$(```!`^`D"("`E)`7^_SP#```D8P```B`@)0!@^`D`
+M12@DCB(`%#0#@```0Q`AC@,P;*Q#`2R.(@`4-`.```!#$"&.`S!PK$,!-#P"
+M```D0@```$#X"0(@("40```*C@(P&"1"````0/@)`B`@)3P#```D8P```B`@
+M)0!@^`DT10$`C@(P&#1"``(0```#K@(P&!````(``!`E)`(``8^_`%B/L0!4
+MC[``4`/@``@GO0!@)[W_V*^_`"2OL``@C)`P)*X``!",@C`<$$``*P"`*"6.
+M`P`4/`(`P`!#$"L00``#/`(`P!````.N``!$`$,0(ZX"`$2.`P`</`(`P`!#
+M$"H00``#/`(`P!````.N``!(`$,0(ZX"`$B,@@`4-`.```!#$"&.`P!$K$,!
+M+(R"`!0T`X```$,0(8X#`$BL0P$TC((`%#0#@```0Q`A/`,``JQ#`3",@@`4
+M-`.```!#$"$\`P(`K$,!.#P"```D0@```$#X"22E+(2N```\K@``0(^_`"2/
+ML``@`^``"">]`"@GO?_@K[\`&*^Q`!2OL``0`("()0(@."6.(C`8,$(``R0#
+M``,40P!@CB42-(XP,"22!@`)+,(`!!!```<\`@``)$(``"0%``$`0/@)),8`
+M`1```%:/OP`8D@8`"I("``@`PA`K$$``"#P"```D0@```B`@)20%``4`0/@)
+M),8``1```$J/OP`8C.,LF#!B`'\L0@!`)&,`?Q!```,``QG"C.(LF``"&<*.
+M`@`H`$,0*A!```\`````D@(`#!1``!@"("`E/!```"80```D!0`"`@#X"0``
+M,"4"("`E)`4`!0(`^`D``#`E$```,(^_`!B.`@`D`$,0*A!``!0\`@``D@(`
+M#!!```8\`@``)$(```(@("4D!0`"`$#X"20&``&2!@`++,(``A!``!\\`@``
+M)$(```(@("4D!0`$`$#X"23&``$0```9C[\`&"1"````0/@)`B`@)21"__XL
+M0@`"$$``$H^_`!B2`@`,%$``!CP"```D0@```B`@)20%``(`0/@)```P)9("
+M``L00``&/`(``"1"```"("`E)`4`!`!`^`D``#`EC[\`&(^Q`!2/L``0`^``
+M"">]`"`GO?_@K[\`&*^Q`!2OL``0`("()0(@."6.(C`8,$(``R0#``,40P`R
+MCB42-(XP,"22!@`)+,(`!!!```<\`@``)$(``"0%``$`0/@)),8``1```"B/
+MOP`8C.,LF#!B`'\L0@!`)&,`?Q!```,``QG"C.(LF``"&<*.`@`D`$,0*A!`
+M``P\`@``D@8`"RS"``(00``7/`(``"1"```"("`E)`4`!`!`^`DDQ@`!$```
+M$8^_`!@D0@```$#X"0(@("4D0O_^+$(``A!```J/OP`8D@(`"Q!```<\`@``
+M)$(```(@("4D!0`$`$#X"0``,"6/OP`8C[$`%(^P`!`#X``()[T`(">]_\BO
+MOP`PK[,`+*^R`"BOL0`DK[``(`"`B"4`H(`E`B"8)3P"``$D0B)P`$#X"8XE
+M$C0D`P!8<$,@`@"1D"$F4C`HKC(P)(XC`=PD`@`!%&(`!20#__V.(C`8-$(`
+M`A````2N(C`8CF(P&`!#$"2N8C`8CB,!W"0"``$08@`H`B`@)8YB+'@D0@`!
+MKF(L>#P0```F$```)`4``0(`^`D``#`E`B`@)20%``4"`/@)```P)0(@("4D
+M!0`$`@#X"0``,"4"("`E)`4``@(`^`D``#`E`B`@)20%``,"`/@)```P)3P"
+M```D0@```$#X"0(@("4\`P``)&,```(@("4`8/@)-$4!`#P"``$D0BOX`$#X
+M"0(@("40``!?C[\`,(XB,!@P0@`#)`,``Q1#`%J/OP`P$@``&3P0```F$```
+M`B`@)20%``$"`/@)DD8`"0(@("4D!0`%`@#X"9)&``J21@`,`B`@)20%``("
+M`/@)+,8``0(@("4D!0`#`@#X"9)&``T"("`E)`4`!`(`^`F21@`+$```%XYB
+M,!PF$````B`@)20%``$"`/@))`8`!`(@("4D!0`%`@#X"9)&``@"("`E)`4`
+M`@(`^`DD!@`!`B`@)20%``,"`/@))`8``0(@("4D!0`$`@#X"20&``*.8C`<
+M$$``&CP"```D0@```$#X"0(@("4D!?[_/`,``"1C```"("`E`&#X"0!%*"0\
+M`@`!)$(K^`!`^`D"("`ECB(`%#0#@```0Q`A/`,``JQ#`3".(@`4-`.```!#
+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
+M``440P`%`````)8B`=`L0@`"$$``!P````".(P',)`(`"Q!B``,D`@`-$``!
+M$*^B`#B.(@`4-`.```!#$"&,0A@8IB(!TCP"```D0@```$#X"0(@("440``$
+M-`.``"0"``X0``$"KZ(`.(XB`!0`0Q`A)`,`!ZQ#&``\`@``)$(```!`^`D"
+M("`EIB(!U#!"`/`D0O_0+$(`0!!```\\`@``EB0!U#B#`#4X@@!%``(0*P`#
+M$`H00``')`(`1A""``4D`@`V$((``R0"``T0``#GKZ(`.#P"```D0@```B`@
+M)20%`,$`0/@))Z8`*!1```27H@`H)`(`"!```-ROH@`X+$(P`A!```27H@`H
+M)`(`!1```-:OH@`XID(2<#P"```D0@```B`@)20%`!P`0/@))Z8`*A1```27
+MH@`J)`(`"!```,JOH@`X$$``"SP"```D0@```B`@)20%`!L`0/@))Z8`*A1`
+M``0\`@``)`(`"!```+ZOH@`X)$(```(@("4D!0`_`$#X"2>F`"@40``$EZ(`
+M*"0"``@0``"TKZ(`.*9"$G(``)@E``"`)3P"```D5````B`@)28%`,`"@/@)
+M)Z8`*!!``*>7H@`H`F*8)B80``$N`@-`%$#_]P(@("4T`O__$F(``R0"``<0
+M``"?KZ(`."0"``JF0A/F)`(``Z9"%?```(`E)`0`-"9&``8D`P`+<@0H`@"F
+M$"&D0Q/H)A```2X"``H40/_[<@0H`@``@"4\`@``)$LA\"9(``(\`@``)$HA
+M^"0)`#0F1P`,)`4`"R9&``@`$!A``'(@(0!K$"&40@``I((5^`!H("$`:A@A
+ME&(``*2"%?!R"1@"`&<0(:1%%J@`9A@A)A```2X"``,40/_PI&46$#P"```D
+M0@```B`@)0!`^`DF11)P%$```R0"``@0``!LKZ(`.)9"$HH00``C)`,`$)8B
+M`=0P0@#P%$,`(#P"``".(@`4-`.```!#$"$D`T`'K$,8`#P"```D0@```$#X
+M"20$!]`\`@``)$(```!`^`D"("`EIB(!UHXB`!0T`X```$,0(20#``>L0Q@`
+M/`(``"1"````0/@))`0'T)8B`=8P0@#P)`,`(!!#``,D`@`-$```1Z^B`#@\
+M`@``)$(```(@("4D!0"_`$#X"2>F`"@40``$EZ(`*"0"``@0```\KZ(`.*9"
+M$G2F(@((/`(``"1"````0/@)`B`@)11```0D`@`+)`(`"!```#&OH@`XCB,!
+MS!1B``0``"`E)`(`#1````^OH@`XEB(!U#!"`/`D0O_0+$(`0!!```,\`@``
+M$````R1"```\`@``)$(```(@("4`0/@))Z4`.`!`("40@``;`````(Y"+,2N
+M(@'`/`(``"1"````0/@)`B`@)3P"``$D0D$H`$#X"0(@("440``$/`(``20"
+M``D0```,KZ(`."1".1``0/@)`B`@)8Y",!@D`__]`$,0)*Y",!@0```,`B`0
+M)20"``BOH@`X$D``!#P"```D0@```$#X"0)`("42H``"CZ(`.*ZB`````!`E
+MC[\`6(^U`%2/M`!0C[,`3(^R`$B/L0!$C[``0`/@``@GO0!@)[W_Z*^_`!",
+M@@`0C$,`"!!@``:,10``)`(``1!B``4``!`E$```"X^_`!`0```")*4`8"2E
+M`'8\`@``)$(``"2$+#``0/@))`8`!B0"``&/OP`0`^``"">]`!@`````````
+M```````#X``()`(``0``````````C((`$(Q'``0``"`E``4H0`#$&"$`Y1`A
+MD$(``*!B```DA``!*((``A1`__DDI0`!`^``""0"``$```````````"`0"4\
+M`KP`-$(@`(T$`!0`1#`C),+`""Q"$``00``D)[W_P``%$$`D!0`#`$4H!`"&
+M$"&,0@`(KZ(`,).C`#`GI``PD((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@``8A@E`&48):^C`#23HP`T)Z0`-)""``$``A(``&(8)9""``(``A0`
+M`&(8)9""``,``A8``&(8)8T"`!0`1A`AK$,`"!```",D`@`!C0(`%`!&("$`
+M!1A`)`(``P!B$`0``C@G`$`H)23"P`@L0A``$$``$22)``B,@@`(KZ(`.).C
+M`#@GI``XD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E`&<8
+M)!````8`91`EC0(`%`!&$"&,0@`(`.(0)`!%$"6M(@``)`(``0/@``@GO0!`
+M`(`X)3P"O``T0B``C.0`%`!$,",DPL`(+$(0`!!``"4GO?_```400"0%``,`
+M12@$``4H)P"&$"&,0@`(KZ(`,).C`#`GI``PD((``0`"$@``8A@ED((``@`"
+M%```8A@ED((``P`"%@``8A@E`&48)*^C`#23HP`T)Z0`-)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8``&(8)8SB`!0`1A`AK$,`"!```"$D`@`!
+MC.(`%`!&("$`!1A`)`(``P!B$`0``B@G),+`""Q"$``00``0)(@`"(R"``BO
+MH@`XDZ,`.">D`#B0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B
+M&"40```&`&40)(SB`!0`1A`AC$(`"`"B$"0T0@``K0(``"0"``$#X``()[T`
+M0`"`0"4\`KP`-$(@`(T#`!0`0S@C).+``"Q"$``00``@)[W_Z`!G$"&,0@``
+MKZ(`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@`0
+M```4`&(8):^C`!23HP`4D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"
+M%@``8A@EC0(`%`!'$"&L0P``$```$R0"``&-`@`4`$<0(8Q#```D`@`!`*(0
+M!``"$"<`8A@D,,(``0"B$`0`8A@E).+``"Q"$``40/_C)Z0`%(T"`!0`1Q`A
+MK$,``"0"``$#X``()[T`&">]_^@`@#@E/`*\`#1"(`",Y@`4`$8@(RRC``80
+M8``9)`+__R2"P`0L0A``$$``#P#$$"&,0@`$KZ(`$).C`!`GI``0D((``0`"
+M$@``8A@ED((``@`"%```8A@ED((``P`"%@`0```$`&(0)8SB`!0`1!`AC$(`
+M!#!"`"\`HA`&,$(``0/@``@GO0`8)[W_T*^_`"@`@$`E/`*\`#1"(`"-`P`4
+M`$,X(R3BP`@L0A``$$``(`!G$"&,0@`(KZ(`().C`"`GI``@D((``0`"$@``
+M8A@ED((``@`"%```8A@ED((``P`"%@`0```5`&(@):^D`"23HP`D)Z0`))""
+M``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)8T"`!0`1Q`AK$,`
+M"!```!F-`RQ$C0(`%`!'$"&,1``(``400"0#``,`0Q@$/`(``31"\```0Q`G
+M`((@)``%$P``@B`E$,```S2$@``\`@`!`((@)23BP`@L0A``%$#_W`````"-
+M`@`4`$<0(:Q$``B-`RQ$/`4!`#P"```D0@```0`@)0!`^`D`92@EC[\`*`/@
+M``@GO0`P````````````````/`*\`#1",`",A0`4`$4P(XR#`<PD`@`+$&(`
+M'R>]_^@DPL"P+$(0`!!``!0`````C*(`L"0#_@,`0Q`D-$(``J^B`!"3HP`0
+M)Z0`$)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)0"F$"$0
+M```(K$,`L(R"`!0`1B`AC$(`L"0#_@,`0Q`D-$(``JR"`+`#X``()[T`&`"`
+M,"4\`KO_-$+PD(S#`!0`0Q`C+$(0`!!```<GO?_H/`*\`#1",)",0@``KZ(`
+M$!````63H@`0/`*\`#1",)",0@``,$(`_P`"&0(P1``/C,(!S!1#``0``"@E
+ME,(!T`!$$"8L10`!`*`0)0/@``@GO0`8)[W_V*^_`"2OL``@/`(``"1"````
+M0/@)`("`)1!``#,T`X``C@(`%`!#$"$D`P`?K$,8<(X"`!0T`X```$,0(20#
+M``VL0QATC@(`%#0#@```0Q`A)`,`#*Q#&'B.`@`4-`.```!#$"$D`P`#K$,9
+M\(X"`!0T`X```$,0(20#``6L0QGTC@4`%#0"@```HB@AE@(!U#!"`/`D0O_0
+M+$(`0"0#`!@D!``4`((8"ZRC&?B.!``4-`*```""("&,@@`<)`/`?P!#$"0T
+M0@"`K((`'(X"`!0T`X```$,0(20#`#VL0P$$$```*H^_`"2.`@`4`$,0(20#
+M`!^L0QAPC@(`%#0#@```0Q`A)`,`?ZQ#&'2.`@`4-`.```!#$"$D`P`$K$,8
+M>(X"`!0T`X```$,0(20#``ZL0QAXC@(`%#0#@```0Q`A)`,`#*Q#&?".`@`4
+M-`.```!#$"$D`P#_K$,9](X%`!0T`H```*(H(98"`=0P0@#P)$+_T"Q"`$`D
+M`P`8)`0`%`""&`NLHQGXC[\`)(^P`"`#X``()[T`*">]_]BOOP`DK[``(#P"
+M```D0@```$#X"0"`@"400``Q-`.``(X"`!0`0Q`A)`,``:Q#`02.!``4-`*`
+M``""("&,@@`<)`/`?P!#$"0T0@^`K((`'(X"`!0T`X```$,0(20#`!^L0QAP
+MC@(`%#0#@```0Q`A)`,`?ZQ#&'2.`@`4-`.```!#$"$D`P`$K$,8>(X"`!0T
+M`X```$,0(20#``RL0QGPC@(`%#0#@```0Q`A)`,`_ZQ#&?2.!0`4-`*```"B
+M*"&6`@'4,$(`\"1"_]`L0@!`)`,`&"0$`!0`@A@+K*,9^(^_`"2/L``@`^``
+M"">]`"@````````````````#X``()`(``0/@``@``````^``"``````GO?_@
+MK[\`'*^R`!BOL0`4K[``$`"@B"4`P"@E)!```1(P``T`@)`E$B``!CP"``$D
+M`@`"$B(`#@``$"40```3C[\`'"1"2L``0/@)`````!````L`0(`E/`(``21"
+M2L@`0/@)`````!````:N42^X/`(``21"2M``0/@)`````*Y1+[@"`!`EC[\`
+M'(^R`!B/L0`4C[``$`/@``@GO0`@`^``"```$"4#X``(```0)0``````````
+M)[W_:*^_`)2OO@"0K[<`C*^V`(BOM0"$K[0`@*^S`'ROL@!XK[$`=*^P`'``
+M@(@EKZ4`G`#`L"6OIP"D`B"@)9;"``(``A'",$,``9;"``(P0@$`$$``!0``
+MJ"448`/R)`,`#!````B6P@`"EL(``@`"$<(X0@`!,$(``11``^HD`P`,EL(`
+M`@`"$8(P0P`!EL(``C!"`"`00``%`````!1@`^$D`P`,$```"#P"``"6P@`"
+M``(1@CA"``$P0@`!%$`#V20#``P\`@``)$(```(@("4`0/@)`L`H)0!`\"43
+MP`/1)`,`#"0"``:/HP"<$&(`"RQB``<00``&)`(`""QB``(00`/()`,`#!``
+M``6/I0"DCZ0`G!2"`\,D`P`,CZ4`I!"@``L`````CB(`%(Q"$4"OH@!8/`(`
+M`"1"```"("`E`$#X"0/`*"40```#CB0!S*^@`%B.)`',.(,`!RQC``$X@@`+
+M+$(``0!B&"448``,CZ8`I"0#``H0@P`))`(`"1""``<`````%(,`&@````"6
+M(@'0+$(`!!!``!8`````$,``%`````".)!(T$(``$0````"6PP``E((``!!B
+M``T`````EL,``I2"``(P8P'P,$(!\!1B``<\`@``)$(```(@("4`0/@)`L`H
+M)11``Y(D`@`!CB0`%#0"@```@A`AC$,`6*^C`%PD`P`!CZ4`7`"@,"4`9B@*
+MKZ4`7(Q#``0\`@(@`&(8)*^C`&",@P"P/`(`_C1"`&``8A@DKZ,`:#P"```D
+M0@```B`@)0!`^`F/I0"</`(``"1"````0/@)`B`@)3P"```D0@```B`@)0!`
+M^`D"P"@E$$`#:B0#``.6P@`",$,!\"0"`4`08@`@*&(!01!```\D`@C`)`(`
+MP!!B`"8H8@#!$$``!B0"`-`D`@"@$&(`'20#``P0``-:CZ4`J!!B`"$D`P`,
+M$``#5H^E`*@08@`9*&((P1!```8D`@E`)`(!4!!B``PD`P`,$``#38^E`*@0
+M8@`%)`()4!!B``8D`P`,$``#1X^E`*@D%P`!$```$*^W`&0D%P`")`(``1``
+M``ROH@!D)!<``R0#``(0```(KZ,`9"07``0D!``"$```!*^D`&0D%P`%)`4`
+M`J^E`&2.(@`4-`.```!#$"$D`P`'K$,8````@"4\`@``)%,B`">R`$@`$!!`
+M`%`8(0`#$,``4Q`AC$0``"2"P``L0A``$$``%@`0$$```Q!``%<0(0`"$(``
+M4Q`AC$(``*^B`$B3HP!(DD(``0`"$@``8A@EDD(``@`"%```8A@EDD(``P`"
+M%@``8A@ECB(`%`!$$"&L0P``$```#B:U``$`4!`A``(8P`!S&"&.)``4C&,`
+M``"#("$``A!``%<0(0`"$(``4Q`AC$(``*R"```FM0`!,J(`/Q1```0\!@``
+M),8```#`^`DD!``!)A```2X"`!D40/_-`!`00```@"4\`@``)%,D6">R`$P`
+M$!#``%,0(8Q$``"/H@"D$$``##P%__\TI7_@`(48(2QC`!D\`O__-$)_+`""
+M$"$L0@`).$(``0`#$`L00``D`````"2"P``L0A``$$``%``0&,``$!#``%,0
+M(8Q"``2OH@!,DZ,`3))"``$``A(``&(8)9)"``(``A0``&(8)9)"``,``A8`
+M`&(8)8XB`!0`1!`AK$,``!````<FM0`!CB(`%`!$$"$`<Q@AC&,`!*Q#```F
+MM0`!,J(`/Q1```0\!@``),8```#`^`DD!``!)A```2X"`,040/_*`!`0P(Z"
+M+*P"("`E`N`H)8^F`&0`0/@)`J`X)9;"``(P0L``$$``!3P"```D0@```B`@
+M)0!`^`D"P"@EEB(!TBQ"`$(40`!)-`.``(XB`!0`0Q`A/`,``C1CH`*L0Q@L
+MEL,``"0"";048@`./`-F9I*"$I*6@Q*<`$,0(SP#9F8T8V9G`$,`&```&!``
+M`QA#``(7PP!B&",``QP`$```!P`#)`.2@A*2-&-F9P!#`!@``!`0``(3P``"
+M)`.6P@`",$(`T"0#`,`40P`0-`.``(XE`!0T`H```*(H(9*"$I(``A`C``(1
+M@#!"#\``!!@C``,<@#P$`/P`9!@D`$,0):RB&4P0```%CB0`%(XB`!0`0Q`A
+MK$`93(XD`!0T`H```((@(8R"(B@D`_W_`$,0)*R"(BB.)``4-`*```""("&,
+M@B(H/`/__C1C`_\`0Q`D-$((`*R"(BB.(@`4-`.```!#$"$D`P`/K$,`8)8B
+M`=(L0@!#%$``!#0#@`".(@`4`$,0(:Q`(E2.(P',)`(`!11B`#L`````EB(!
+MT#A#``(L8P`!.$(`!RQ"``$`8A@E$&``,S0#@`".(@`4`$,0(20#%B*L0QEL
+MEL(``C!"`(`00``*-`*``(XD`!0`@B`AC((82#P#_X,T8___`$,0)#P#`#P`
+M0Q`EK((82);"``(P0@"@)`,`H!1#``HT`H``CB0`%`""("&,@B(</`/^!S1C
+M__\`0Q`D/`,`8`!#$"6L@B(<CB(`%#0#@```0Q`A)`,`!*Q#&'B6P@`",$(!
+M\"0#`4`40P`/-`*``(XD`!0`@B`AC((81"0#_X``0Q`D-$(`(*R"&$00```'
+M/`(``(XB`!0T`X```$,0(20#``ZL0QAX/`(``"1"```"("`E`\`H)0!`^`DG
+MI@`0$$`"#B0#``,D`@`&CZ,`G!!B``<`````CB("!!!```0\`@``)$(```!`
+M^`D"("`ECH(LN`(@("4#P"@E,N;__P!`^`DGIP`0$$`!_"0#``.6P@`",$(`
+M0!!``!XD!``*CB,!S!!D``TD`@`)$&(`"P`````49``%`````)8B`=`L0@`$
+M%$``!0````"6@A)P+$)0`Q1```L\`@``EL(``C!"`*`D`P"@$$,`!3P"```D
+M0@```B`@)0!`^`D#P"@E/`(``"1"```"("`E`$#X"0+`*"4\`@``)$(```(@
+M("4`0/@)`\`H)1!``=0D`P`#CZ0`I!"```0`````CB(`%(^E`%BL11%`CB0`
+M%#0"@```@B`ADH,L,)*"+#$``A(``&(8)9*"+#(``A0``&(8)9*"+#,``A8`
+M`&(8):R#``".)``4-`*```""("&2@RPTDH(L-0`"$@``8A@ECZ8`8`!F&"6.
+M@B_,`&(8)3P"`(``8A@EK(,`!#P"```D0@```B`@)0!`^`F/I0"<CB0`%#0"
+M@```@B`ADH,L/)*"+#T``A(``&(8)9*"+#X``A0``&(8)9*"+#\``A8``&(8
+M):R#`.".)``4-`*```""("&2@RQ`DH(L00`"$@``8A@EK(,`Y(XE`!2,HD`0
+MKZ(`4).C`%`GI`!0D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``
+M8A@ECZ(`:`!B&"6LHP"PCB(`%#0#@```0Q`ACZ,`7*Q#`%B.)``4-`*```""
+M("&2@RPVDH(L-P`"$@``8A@EDH(L.``"%```8A@EDH(L.0`"%@``8A@EK(,`
+M"(XD`!0T`H```((@(9*#+#J2@BP[``(2``!B&"6L@P`,CB(`%#0#@```0Q`A
+MCH,OU*Q#`!B.(P`4)`+__ZQB`(`\`@``)$(```(@("4`0/@)`\`H)1!``5PD
+M`P`#/`(``"1"```"("`EDB42.`!`^`DD!@`!/`(``"1"```"("`E`$#X"0+`
+M*"66(@'4,$(`\"1"_]`L0@!`$$``$@````".(Q(TC&(``#!"P``00``-)`<`
+M#91F``(PQD``)`4`#(XD`!0T`H```((@(8R"&"0D`__P`$,0)`#F*`H`11`E
+MK((8)(XC`<PD`@`%%&(`#`````"6(@'0.$,``BQC``$X0@`'+$(``0!B&"40
+M8``$-`.``(XB`!0`0Q`AC$(8>(XB`!0T`X```$,0(8Q"&10P1#__EL(``C!"
+M`"`00``'``00@#P#NBXT8XNC`$,`&0``$!`0```&``(A`CP"S,PT0LS-`((`
+M&0``$!```B#"CB(`%#0#@```0Q`A)`,``:Q#&!R.(A(TE$(``C!"0``00``'
+M/`(````$($`D0@```$#X"22$`&00```0CB(`%(XB$C240@`",$*``!!```<\
+M`@````0@@"1"````0/@))(0`9!````6.(@`4)$(```!`^`DDA`!DCB(`%#0#
+M@```0Q`AC%48""0#.`"L0Q@()!```8XB`!0T`X```$,0(8Q"'"0P0@`0$$``
+M#SP"```D4P``-!*```)@^`DD!`#(`@`0)2A"`!000``')A```8XB`!0`4A`A
+MC$(<)#!"`!`40/_U`````(XB`!0T`X```$,0(:Q5&`B.(P`4-`*```!B&"&,
+M8AA@-$(``ZQB&&"6P@`",$(`H"0#`*`00P`3)`(``HZ#+\`08@`0-`*``(XC
+M`!0`8A@AC&(9(#1"\`"L8AD@CB0`%#0"@```@B`AC((9(#P#``$`0Q`EK((9
+M("0"``$0```"KH(OP*Z`+\`\`@``)$(```!`^`D"("`E``"`)20&``$GI0!4
+M`!`@@"2"T``L0A``$$``$@`0$(`"!A`$KZ(`5).C`%20H@`!``(2``!B&"60
+MH@`"``(4``!B&"60H@`#``(6``!B&"6.(@`4`$00(:Q#$``0```&)A```8XC
+M`!0`8A@A`@80!*QB$``F$``!*@(`"A1`_^0`$""`KH!&H)8B`>@00``+``"`
+M)3P"```D4@```B`@)0)`^`D"`"@E)A```98B`>@"`A`J%$#_^@(@("4\`@`(
+M-$()9:Z"+$0D`@`&CZ,`G!1B``,\`@`(-$(99:Z"+$2.(P`4CH(L1*QB`*".
+M)``4C((`K#P#``<`0Q`EK((`K(XB$DP00``$/`(``"1"````0/@)`B`@)3P"
+M```D0@```B`@)30%F&`D!@`!`$#X"0``."4\`@``)$(```(@("4`0/@)CZ4`
+MG(XD`!0T`H```((@(8R"`"`\`_Y_-&/__P!#$"2L@@`@CB,!S"QB``800``'
+M)`(`!11B`!``````EB(!T"Q"``@40``,`````(XB`!0T`X```$,0(3P#``$T
+M8P"JK$,!&(XB`!0T`X```$,0(20#,A"L0P$<CB(`%#0#@```0Q`A)`,`4JQ#
+M`0B.A"_0$(``!#0#@`".(@`4`$,0(:Q$`2".A2_X)`+__Q"B``0\`@``)$(`
+M``!`^`D"("`ECH4O_"0"__\0H@`$/`(``"1"````0/@)`B`@)8Z%,``D`O__
+M$*(`!#P"```D0@```$#X"0(@("6.)`'X$(``!#0#@`".(@`4`$,0(:Q$`$B/
+MI`"<KB0!W(^E`*00H``B)`(``9/#``0P8@`"%$```C!B`/ZCP@`$E\(``J;"
+M``*3P@`$HL(`!(XB$C0``"`E```H):Q$`#"L10`T/`(``"1"````0/@)`B`@
+M)8XD$C2L@@`HK(,`+#P"```D0@```B`@)0!`^`DD!0`!$```!B0"``&/I0"H
+MC*(``!!```(``!`EK*,``(^_`)2/O@"0C[<`C(^V`(B/M0"$C[0`@(^S`'R/
+ML@!XC[$`=(^P`'`#X``()[T`F">]_^BOOP`0/`(``21"7MP`0/@))`4``H^_
+M`!`#X``()[T`&">]_^BOOP`4K[``$`"`@"4\`@``)$(`````*"4`0/@))`8`
+M`1!```4"`"`E/`(``21"7MP`0/@))`4``X^_`!2/L``0`^``"">]`!@GO?_0
+MK[\`+*^R`"BOL0`DK[``(`"`D"4`H(`E/`(``21"7MP`0/@))`4``Q!``(H`
+M`"@E/`(``"1"```"0"`E`$#X"20&``$00`"$C[\`+#P"``$D0E[<`D`@)0!`
+M^`D``"@E$$``?8^_`"P2``![)`(``99"`=0P0@#P)$+_T"Q"`$`40``)````
+M`(Y"`<PX0P`'+&,``3A"``LL0@`!`&(8)1!@`!4`````E@,``C!B`"`40``%
+M)!$`"#!C`-`D`@#`%&(``P`````0```>)`04UI8"``(P0D``%$``&B0$%=26
+M`@`",$*``"0$%-0D`Q;4$```%`!B(`N6`P`",&(`(!1```4``(@E,&,`T"0"
+M`,`48@`#`````!````HD!`"KE@(``C!"0``40``&)`0!JI8"``(P0H``)`0`
+MJB0#`JH`8B`+E@,``C!B`$`00``(,&(`(!1```0P8P#0)`(`P!1B``,`````
+M$```!38Q``26`@`",$(`0#8C``$`8H@*E@4``C"C`0`V(@`"`$.("C"C`!`D
+M`@`#`$"`)0`#@`J.0@`4-`.```!#$"&,1AA\,*(`(!1```0PHP#0)`(`P!1B
+M`!,`````CD(`%#0#@```0Q`AK%`8!(Y"`!0`0Q`AK%$B`!#$`!LD`@`!CD(`
+M%`!#$"&L1!A\/`(``"1"````0/@))`0!+!```!(D`@`!$,0`"#0#@`".0@`4
+M`$,0(:Q$&'P\`@``)$(```!`^`DD!`$LCD(`%#0#@```0Q`AK%`8!(Y"`!0`
+M0Q`AK%$B`"0"``&/OP`LC[(`*(^Q`"2/L``@`^``"">]`#`GO?_0K[\`**^Q
+M`"2OL``@`("()0"@&"4`8(`E)`7__SP"```D0@```$#X"0!C*`L`0"`E$(``
+M"8^_`"@R`@`!%$``!@"`$"4D`P`%CB(`%*Q#`!0`@!`EC[\`*(^Q`"2/L``@
+M`^``"">]`#`GO?^@K[\`7*^R`%BOL0!4K[``4`"`B"6.(@`0C$,`"!"@`)``
+M`!`E$&``!20"``$08@`&```0)1```(N/OP!<)`9`!!````0D!R``/`8`!#3&
+M`@`\!P`"/`*[_S1"\"".(P`4`$,0(RQ"$``00``1`.:0)SP"O``T0C`@C$(`
+M`*^B`$"3HP!`)Z0`0)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8`
+M$```!`!B@"4\`KP`-$(P((Q0```D`@`"%*(`$P#F$"40```3`@:`):^P`$23
+MHP!$D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E/`*\`#1"
+M,""L0P``$```#CP"N_\"$H`D`@*`)3P"N_\T0O`@CB,`%`!#$",L0A``%$#_
+MZ">D`$0\`KP`-$(P(*Q0```\`KO_-$+P((XC`!0`0Q`C+$(0`!!```4\`KP`
+M-$(P((Q"```0```$/`(``#1","",0@``/`(``"1"````0/@))`0`9#P"N_\T
+M0O`@CB,`%`!#$",L0A``$$``%@(2@"0\`KP`-$(P((Q"```0```5/`*[_Z^P
+M`$B3HP!(D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E/`*\
+M`#1",""L0P``$```#SP"N_\\`KP`-$(P((Q"```\`KO_-$+P((XC`!0`0Q`C
+M+$(0`!1`_^<GI`!(/`*\`#1",""L4```/`*[_S1"\"".(P`4`$,0(RQ"$``0
+M0``%/`*\`#1","",0@``$```!"0"``$T0C`@C$(``"0"``&/OP!<C[(`6(^Q
+M`%2/L`!0`^``"">]`&`````````````````GO?^HK[\`4*^W`$ROM@!(K[4`
+M1*^T`$"OLP`\K[(`.*^Q`#2OL``P`("@)0"@J"4`P+`E`."`)0``B"4\`@``
+M)%,J@">R`"`\`@``)%<````1$$``41@A``,0P`!3$"&,1```)(+``"Q"$``0
+M0``6`!$00``#$$``51`A``(0@`!3$"&,0@``KZ(`().C`""20@`!``(2``!B
+M&"620@`"``(4``!B&"620@`#``(6``!B&"6.@@`4`$00(:Q#```0```.)A``
+M`0!1$"$``AC``',8(8Z$`!2,8P```(,@(0`"$$``51`A``(0@`!3$"&,0@``
+MK((``"80``$R`@`_%$```P`````"X/@))`0``28Q``$N(@`.%$#_S@`1$$``
+M`(@E/`(``"13*]`GL@`D/`(``"15````$1C``',0(8Q$```D@L``+$(0`!!`
+M`!(`<Q`AC$(`!*^B`"23HP`DDD(``0`"$@``8A@EDD(``@`"%```8A@EDD(`
+M`P`"%@``8A@ECH(`%`!$$"&L0P``$```""80``&.A``4C$(```""("$`<Q@A
+MC&(`!*R"```F$``!,@(`/Q1```,``````J#X"20$``$F,0`!+B(`2!1`_]H`
+M$1C```"()3P"```D4R^H)[(`*#P"```D50```!$00`!1&"$``Q"``%,0(8Q$
+M```D@L``+$(0`!!``!4`$1!``'80(0`"$(``4Q`AC$(``*^B`"B3HP`HDD(`
+M`0`"$@``8A@EDD(``@`"%```8A@EDD(``P`"%@``8A@ECH(`%`!$$"&L0P``
+M$```#280``$`41`A``(8@`!S&"&.A``4C&,```"#("$`5A`A``(0@`!3$"&,
+M0@``K((``"80``$R`@`_%$```P`````"H/@))`0``28Q``$N(@!`%$#_SX^_
+M`%"/MP!,C[8`2(^U`$2/M`!`C[,`/(^R`#B/L0`TC[``,`/@``@GO0!8)[W_
+MR*^_`#"OLP`LK[(`**^Q`"2OL``@`("8)0"@D"4\`@``)$(``)9%````0/@)
+MED8``@`"%````B0#ED(``C!"`(`00``E``2`0`($@"$`$("`/`(``"1"-AP"
+M`H`A/`(``"1"``".!``$`$#X"20%``@P40#_`!&)0(X"`````A$``B*()88$
+M``B.8P`4-`*```!B*"&,IB($ED,``"0"";048@`%`````#3"`!"LHB($$```
+M"RB"`)&.8P`4-`*```!B&"$D`O_O`,(0)*QB(@00```#*((`D0``B"4H@@"1
+M$$``!#P"```P@@`!$$``"#P"```D0@``)(3_Z`!`^`DD!0`(,$4`_Q````LD
+M`@`!)(3_Z``$%\(`@B`A/`(``"1"````!"!#`$#X"20%``@P10#_```0)0`%
+M*(```A!``*(H)32E!`&.9``4-`*```""("$R(@#_``(2`#"C`/\`0Q`EK((8
+MG``%*@*.9``4-`*```""("$R(O\`,*,`_P!#$"6L@AC0KG(2-"0"``&/OP`P
+MC[,`+(^R`"B/L0`DC[``(`/@``@GO0`X+*(`"!!``!2,A"_L/`(``"1"-V``
+M!1B``&(8(8QB````0``(``````/@``@`@!`E`^``""2"`$0#X``()((`2`/@
+M``@D@@!,`^``""2"`%`#X``()((`E`/@``@``!`E)[W_.*^_`,2OO@#`K[<`
+MO*^V`+BOM0"TK[0`L*^S`*ROL@"HK[$`I*^P`*``@+@EKZ4`S##5__\"X)@E
+ME*(``C!#`?`D`@#`$&(`2@``H"4H8@#!$$``!B0"`4`D`@"@$&(`-@``$"40
+M``(OC[\`Q!!B``,D`@%0%&("*@``$"6/HP#,E&(``"1"\%\L0@3K$$``!0``
+M``"6?A-4EF(35A```!NOH@"8E&(``"1"ZW0L0@#P$$``!8^C`,R6?A-8EF(3
+M6A```!*OH@"8E&(``"1"ZH0L0@#A$$``!8^C`,R6?A-<EF(37A````FOH@"8
+ME&(``"Q"%EVOH`"8%$``!```\"66?A-@EF(38J^B`)@``(@E```H)99C$MBO
+MHP"(EF(2WJ^B`(PL0P`!KZ,`D)9B$RP0```<KZ(`E)9^$V268Q-FKZ,`F)9E
+M$VR6<1-PEF(2VJ^B`(B68Q+@KZ,`C"QB``&OH@"0EF,3+A````ZOHP"4EGX3
+M:)9B$VJOH@"8EF43;I9Q$W*68Q+<KZ,`B)9B$N*OH@",+$,``:^C`)"68A,P
+MKZ(`E```@"4GI``8/`(``"1&+A``$!B``(,8(0`0$$``4!`A``(00`!5$"$`
+M`A"``$80(8Q"``"L8@``)A```2X"`!$40/_T`!`8@(^C`,R48@`",$(`@!!`
+M``T\$```KZ``$"80```GI``8)`8``P(`^`DD!P!WKZ``$">D`!@"("@E)`8`
+M`P(`^`DD!P!Z``"`)3P"```D5BX0)[(`&">Q`'``$!!``%`0(0`"$,``5A`A
+MC$0``"2"P``L0A``$$``%``0$$``$!"``D(0(8Q"``"OH@!PDZ,`<)(B``$`
+M`A(``&(8)9(B``(``A0``&(8)9(B``,``A8``&(8)8[B`!0`1!`AK$,``!``
+M``PFE``!`%`0(0`"$,``5A`ACN,`%(Q"````8A@A`!`0@`)"$"&,0@``K&(`
+M`":4``$R@@`_%$``!#P"```D0@```$#X"20$``$F$``!+@(`$11`_]$`$!!`
+M``"`)3P"```D4C*H)[$`=#P"```D5@```!`8P`!R$"&,1```)(+``"Q"$``0
+M0``2`'(0(8Q"``2OH@!TDZ,`=)(B``$``A(``&(8)9(B``(``A0``&(8)9(B
+M``,``A8``&(8)8[B`!0`1!`AK$,``!````@FE``!CN0`%(Q"````@B`A`'(8
+M(8QB``2L@@``)I0``3*"`#\40``#``````+`^`DD!``!)A```1(`_]H\`@``
+M``"`)212,K`GL0!X/`(``"16````$!!``%`8(0`#$,``4A`AC$0``"2"P``L
+M0A``$$``%@`0$$```Q!``%40(0`"$(``4A`AC$(``*^B`'B3HP!XDB(``0`"
+M$@``8A@EDB(``@`"%```8A@EDB(``P`"%@``8A@ECN(`%`!$$"&L0P``$```
+M#B:4``$`4!`A``(8P`!R&"&.Y``4C&,```"#("$``A!``%40(0`"$(``4A`A
+MC$(``*R"```FE``!,H(`/Q1```,``````L#X"20$``$F$``!$@#_SCP"````
+M`(`E)%(RR">Q`'P\`@``)%8````0$$``4!@A``,0P`!2$"&,1```)(+``"Q"
+M$``00``6`!`00``#$$``51`A``(0@`!2$"&,0@``KZ(`?).C`'R2(@`!``(2
+M``!B&"62(@`"``(4``!B&"62(@`#``(6``!B&"6.X@`4`$00(:Q#```0```.
+M)I0``0!0$"$``AC``'(8(8[D`!2,8P```(,@(0`"$$``51`A``(0@`!2$"&,
+M0@``K((``":4``$R@@`_%$```P`````"P/@))`0``280``$2`/_.)Z0`&```
+M@"4\`@``)$4RX``0&(``@Q@A`!`00`!0$"$``A!``%40(0`"$(``11`AC$(`
+M`*QB```F$``!+@(`$11`__0`$!B`CZ,`S)1B``(P0@%`)`,!0!1#``\D$0`#
+MEF43S*^Q`!`\$```)A```">D`!@D!@`!`@#X"20'`#.691/.K[$`$">D`!@D
+M!@`!`@#X"20'`"VOH``0/!```"80```GI``8CZ4`D"0&``$"`/@))`<`7Z^@
+M`!`GI``8CZ4`B"0&``0"`/@))`<`8*^@`!`GI``8`\`H)20&``,"`/@))`<`
+M:*^@`!`GI``8CZ4`F"0&``,"`/@))`<`:P``@"4\`@``)%8RX">R`!@GL0"`
+M/`(``"1>````$!!``%`0(0`"$,``5A`AC$0``"2"P``L0A``$$``%``0$$``
+M$!"``D(0(8Q"``"OH@"`DZ,`@)(B``$``A(``&(8)9(B``(``A0``&(8)9(B
+M``,``A8``&(8)8[B`!0`1!`AK$,``!````PFE``!`%`0(0`"$,``5A`ACN,`
+M%(Q"````8A@A`!`0@`)"$"&,0@``K&(``":4``$R@@`_%$```P`````#P/@)
+M)`0``280``$N`@`1%$#_T@`0$$```(`E)Z0`&#P"```D131X`!`8@`"#&"$`
+M$!!``%`0(0`"$$``51`A``(0@`!%$"&,0@``K&(``"80``$N`@`(%$#_\SP"
+M``"OH``0)%$``">D`!B/I0"4)`8`!@(@^`DD!P`=KZ``$">D`!B/I0",)`8`
+M`0(@^`DD!P`$CZ,`S(QB```P0L``$$``%R00`!^48@`",$)``"0#`!``8H`+
+MKZ``$">D`!@D!0`?)`8`!0(@^`DD!P`3KZ``$">D`!@"`"@E)`8`!0(@^`DD
+M!P`8KZ``$">D`!@D!0`#)`8``@(@^`DD!P`Q``"`)3P"```D531X)[(`&">Q
+M`(0\`@``)%8````0$$``4!`A``(0P`!5$"&,1```)(+``"Q"$``00``4`!`0
+M0``0$(`"0A`AC$(``*^B`(23HP"$DB(``0`"$@``8A@EDB(``@`"%```8A@E
+MDB(``P`"%@``8A@ECN(`%`!$$"&L0P``$```#":4``$`4!`A``(0P`!5$"&.
+MXP`4C$(```!B&"$`$!"``D(0(8Q"``"L8@``)I0``3*"`#\40``#``````+`
+M^`DD!``!)A```2X"``@40/_2`!`00*Y@+\0D`@`!C[\`Q(^^`,"/MP"\C[8`
+MN(^U`+2/M`"PC[,`K(^R`*B/L0"DC[``H`/@``@GO0#(,(3__S"E__\PQO__
+M,.?__Y>H`!)PZ!@"$&``(@``$"40Q0`>)`,`9`"%$"-P0Q`"`,48(P!#`!H`
+M`!`2%&```@``````!P`-``(4```")`,$@``3`.`8)2B"`&400``0`0`8)20"
+M`&0`1!`C`$<`&'"(`````!@2/`)1ZS1"A1\`8@`8```0$``"$4,``Q_#`$,0
+M(Q````(P0___`.`8)0!@$"4#X``(`````">]_J"OOP%<K[X!6*^W`52OM@%0
+MK[4!3*^T`4BOLP%$K[(!0*^Q`3ROL`$X`."X)0"`H"4D`@`_KZ(!,);B``(P
+M0P'P)`(`T!!B`"0``/`E*&(`T1!```@D`@%0)`(`H!!B`!<D`@#`$&(`'```
+M$"40``$"C[\!7!!B``HH8@%1$$``!B0""4`D`@%`$&(`!0``$"40``#YC[\!
+M7!1B`/8``!`EEH(3YJ>B`20F@A/2KZ(!(":"$^@0```.KZ(!*):"%?"GH@$D
+M)H(5^*^B`2`F@A:N$```!Z^B`2B6@A7PIZ(!)":"%?*OH@$@)H(6$J^B`2@G
+MM0$@/`(``"1"```GI``8`$#X"20%`0@GM@`@)[,`H"02``$``(@E`!$00`!6
+M$"&D4@``)E(``2I"`$`40/_Z)C$``:>Q`!XD`@`!IZ(`&B0"`#^GH@`<,B+_
+M_Q!``!```(@E/`(``212=6@`$8!``A80(9;D``"410```D#X"0*@,"4"$X`A
+MI@(``"8Q``&7H@`>`B(0*A1`__4`$8!`AF0``)>B`!X``A!``F(0(81'__X0
+M```)``"()0)B*"&$H__^A*(```!#$"H00``"E*8``*2F__XF,0`!EZ(`'@(B
+M$"H00``/EZ(`'@`1$$``4Q`AA$,```"#$"H40``#EZ(`'@!@("4R/O__`%$0
+M(R1"__\P4O__%D#_Z``2$$"7H@`>$$``#P``B"4`0"@E`!$00`!3$"&$0P``
+M`.,0*A!```0``````&`X)3(C__^OHP$P)C$``0(E$"H40/_U`!$00"2$`!D\
+M`U'K-&.%'P"#`!@``!`0``(1`P`$)\,`1!`C)`0`,G!$$`(``A0```*$`P``
+MD"4"`P`8```8$``#&0,``A?#`&(8(R1C``$88``0``"()0``$!```A$#`!`?
+MPP!#$",D1``!`B`8)28B``$P4?__CH)&>``#&$``8A@A)E(``0)$$"H40/_W
+MI'X``)>B`!X`0"`E``(00`)B$"&$0O_^`@(0*BXC`$``0Q`D$$``3```D"4\
+M`@`!)%5P%"8"`#(``A0```*$`P"`$"4``A!``F(0(81"__X"`A`J$$``&@`2
+M&$``$A!``%,0(81#```"`Q@CA$(``@("$"-P8A@"&&``$0`2&$``!!!``F(0
+M(81"__X"`B`J$(``"B92``$`$A!``%,0(81#```"`Q@CA$(``@("$"-P8A@"
+M'&#_]@``````$AA``',0(91%``"41@`"`'88(91G````!SA`E&(``@`"$$`P
+M0O__KZ(`$#($__\"H/@),.?__R1"``$P0O__CH-&>``1($``@Q@A``(00J1B
+M``".@D9X`((@(92"``"/HP$P`&(0*Q!```(F(@`!I(,``#!1__^7I``>``00
+M0`)B$"&$0O_^`@(0*BXC`$``0Q`D%$#_N28"`#(N(@!`$$``"P````".@T9X
+M`!$00`!#$"&40__^I$,``"8B``$P4?__+B(`0!1`__<`````IH`O]"0"``&/
+MOP%<C[X!6(^W`52/M@%0C[4!3(^T`4B/LP%$C[(!0(^Q`3R/L`$X`^``"">]
+M`6`GO?^HK[\`4*^W`$ROM@!(K[4`1*^T`$"OLP`\K[(`.*^Q`#2OL``P`,"H
+M)3"7__\PMO__/`(``21"=P@"X"`E`L`H)0!`^`DGIP`8%$``29>B`!B6I@`$
+M)Z(`'*^B`!`\`@``)$(```+@("6.I0```$#X"2>G`!J7I0`:)Z(`(*^B`!`\
+M$``!)A!WE`+`("4"H#`E`@#X"2>G`!Z7I0`<)Z(`)*^B`!`"P"`E`J`P)0(`
+M^`DGIP`B)[,`)CP0``$F$'<(EZ0`&I>E`!X"H#`E`@#X"0)@."4GL@`HEZ0`
+M&I>E`"`"H#`E`@#X"0)`."67I0`>EZ8`()>G`":7H@`HKZ(`$#P1``$F,7`4
+M`B#X"0+`("4`0*`EEZ0`')>E`"("H#`E`@#X"0)@."67I``<EZ4`)`*@,"4"
+M`/@)`D`X)9>E`"*7I@`DEZ<`)I>B`"BOH@`0`B#X"0+`("67I0`:EZ8`'*^B
+M`!`"X"`E`B#X"0*`."6/OP!0C[<`3(^V`$B/M0!$C[0`0(^S`#R/L@`XC[$`
+M-(^P`#`#X``()[T`6#"$__\PI?__C,@`")3"``000``<``!0)94"```41``4
+M`````"4)``B5`@`&$$``$```&"4E"P`&E2(``!1%``@D8P`!)&/__P`#$$``
+M2Q`AE$(`&*3B```#X``()`(``94"``8`8A`J%$#_\R4I``(E2@`!E,(`!`%"
+M$"H40/_F)0@`-`/@``@``!`E)[W_X*^_`!@PA/__,*C__XS%``B4P@`$$$``
+M#```&"64H@``$$@`"0````"4Q@`$)&,``0!F$"H00``$)*4`-)2B```42/_Z
+M`````)2F``:/H@`PKZ(`$#P"```D0@```$#X"22E``B/OP`8`^``"">]`"`G
+MO?_HK[\`%*^P`!``@(`EC@1&>!"```4\`@``)$(```!`^`D`````K@!&>(X$
+M+^P0@``%/`(``"1"````0/@)`````*X`+^R/OP`4C[``$`/@``@GO0`8`^``
+M""0"``$\`@``E*,``)1"-X``0Q`K%$``"P``("4\`@``)$,W@)2E```DA``!
+M``00@`!#$"&40@```$40*Q!`__H`````/`(``"1"-X``!!B``$,0(0/@``B$
+M0@`")[W_X*^_`!BOL0`4K[``$`"@B"4`@(`E/`(``"1"````0/@))`0`M`!`
+M&"448``$K@,O["0#``(0```FKB,``"0"`("N`D9\/`(``"1"````0/@))`0`
+M@`!`&"448``$K@-&>"0#``(0```:KB,``#P"``$D0G@(K@(LJ#P"``$D0F'0
+MK@(LK#P"``$D0F9@K@(LL#P"``$D0F2PK@(LM#P"``$D0F;`K@(LN#P"``$D
+M0G#`K@(LO#P"``$D0GA@K@(LP#P"``$D0GAHK@(LQ"0"``&/OP`8C[$`%(^P
+M`!`#X``()[T`(```````````)[W_J*^_`%"OMP!,K[8`2*^U`$2OM`!`K[,`
+M/*^R`#BOL0`TK[``,`"`H"4`H*@E`,"P)0#@@"4``(@E/`(``"13-[`GL@`@
+M/`(``"17````$1!``%$8(0`#$,``4Q`AC$0``"2"P``L0A``$$``%@`1$$``
+M`Q!``%40(0`"$(``4Q`AC$(``*^B`""3HP`@DD(``0`"$@``8A@EDD(``@`"
+M%```8A@EDD(``P`"%@``8A@ECH(`%`!$$"&L0P``$```#B80``$`41`A``(8
+MP`!S&"&.A``4C&,```"#("$``A!``%40(0`"$(``4Q`AC$(``*R"```F$``!
+M,@(`/Q1```,``````N#X"20$``$F,0`!+B(`$!1`_\X`$1!```"()3P"```D
+M4SDP)[(`)#P"```D50```!$8P`!S$"&,1```)(+``"Q"$``00``2`',0(8Q"
+M``2OH@`DDZ,`)))"``$``A(``&(8)9)"``(``A0``&(8)9)"``,``A8``&(8
+M)8Z"`!0`1!`AK$,``!````@F$``!CH0`%(Q"````@B`A`',8(8QB``2L@@``
+M)A```3("`#\40``#``````*@^`DD!``!)C$``2XB`$440/_:`!$8P```B"4\
+M`@``)%,[6">R`"@\`@``)%4````1$$``41@A``,0@`!3$"&,1```)(+``"Q"
+M$``00``5`!$00`!V$"$``A"``%,0(8Q"``"OH@`HDZ,`*))"``$``A(``&(8
+M)9)"``(``A0``&(8)9)"``,``A8``&(8)8Z"`!0`1!`AK$,``!````TF$``!
+M`%$0(0`"&(``<Q@ACH0`%(QC````@R`A`%80(0`"$(``4Q`AC$(``*R"```F
+M$``!,@(`/Q1```,``````J#X"20$``$F,0`!+B(`0!1`_\^/OP!0C[<`3(^V
+M`$B/M0!$C[0`0(^S`#R/L@`XC[$`-(^P`#`#X``()[T`6">]_\BOOP`TK[0`
+M,*^S`"ROL@`HK[$`)*^P`"``@)@E`*"0)0``H"6610``+*(2P!!``$(``(`E
+M)*3W<#P'9F8TYV9G`(<`&```&!```QA#``07PP!B&",``Q"``$,0(12"``DD
+MI/=0``400"11[N`")P`8```0$``"$(,`$1_#$```%`!#B",\!F9F-,9F9P"&
+M`!@``!@0``,80P`$%\,`8A@C``,0@`!#$"$4@@"Z```0)0`%$$`D4>Z@`B8`
+M&```$!```A"#`!$?PP!#B",D%``!`!&(@#P"```D0@``,B0`_P!`^`DD!0`(
+M`$"()8YC`!0T`H```&(@(8R%(@260P``)`()M!1B``4T`H``-*(`$*R"(@00
+M``"-`!$Q`(YC`!0`8A@A)`+_[P"B$"2L8B($$```A@`1,0"61```/`+,S#1"
+MS,T`@@`9```0$``"$((``AB``&(8(0"#&",P8___)`(``A1B`!TL@A4\$$``
+M&SP0``"60P``)&/__C!C__\``Q"``$,0(0`"$$`\`___-&-$@`!#$"$\!%'K
+M-(2%'P!$`!@``"`0``0@PP`"%\,`@B`C)A```"2$``$"`/@))`4`"`!`B"4`
+M`"`E`@#X"20%``(0``!<`$"`)3P#S,PT8\S-`(,`&0``&!```QD"``,0@`!#
+M$"$``A"``((0(S!"__\40``5+((4`!1``!,D@NU`/`1F9C2$9F<`1``8```@
+M$``$(,,``A?#`((@(SP0```F$`````0@@`(`^`DD!0`(`$"()20$``,"`/@)
+M)`4``A```#P`0(`EED0``#P#S,PT8\S-`(,`&0``&!```QC"``,0@`!#$"$`
+M`A!``((0(S!"__\40``3)(+M0#P$9F8TA&9G`$0`&```(!``!""#``(7PP""
+M(",\$```)A`````$($`"`/@))`4`"`!`B"4D!``"`@#X"20%``(0```=`$"`
+M)3P#S,PT8\S-`(,`&0``&!```QB"``,0@`!#$"$`@A`C,$+__Q1``"4``!`E
+M)(3M0#P"9F8T0F9G`((`&```$!```A!#``0GPSP0```F$````$0@(P(`^`DD
+M!0`(`$"()20$``$"`/@))`4``@!`@"4`$3$``!`0@`#","4`%!!``,(P)33&
+M$`&.8@`4-`.```!#$"$PPP#_K$,8G``&,@*.8@`4-`.```!#$"$PPP!_K$,8
+MV*YR$C0D`@`!C[\`-(^T`#"/LP`LC[(`*(^Q`"2/L``@`^``"">]`#@DH___
+M+&(`!Q!``!*,A"_L/`(``"1"0X@``QB``&(8(8QB````0``(``````/@``@`
+M@!`E`^``""2"``0#X``()((`"`/@``@D@@`,`^``""2"`*P#X``(```0)2>]
+M_XBOOP!TK[X`<*^W`&ROM@!HK[4`9*^T`&"OLP!<K[(`6*^Q`%2OL`!0`("X
+M):^E`'P`X(`E,-7__P+@H"6OH`!`KZ``1*^@`$BOH`!,CI,O[":>+!"4H@`"
+M,$,!\"0"`-`08@!)``"P)2AB`-$00``()`(!4"0"`*`08@`[)`(`P!!B`$$`
+M`!`E$``"@H^_`'008@`**&(!41!```8D`@@`)`(!0!!B``4``!`E$``">8^_
+M`'048@)V```0)8^C`'R48@``)$+P7RQ"!.L00``&`````):"$U2OH@!`EH,3
+M5A```!VOHP!$E&(``"1"ZW0L0@#P$$``!H^C`'R6@A-8KZ(`0):#$UH0```3
+MKZ,`1)1B```D0NJ$+$(`X1!```:/HP!\EH(37*^B`$"6@Q->$```":^C`$24
+M8@``+$(6711```4`````EH(38*^B`$"6@Q-BKZ,`1):%$MZ6@A,L$```#Z^B
+M`#R6@Q-LKZ,`2):"$W"OH@!,EH42X):#$RX0```'KZ,`/):"$VZOH@!(KZ(`
+M3):%$N*6@Q,PKZ,`/```("4\`@``)$8^6``$$(`"8A`A``08P`!F&"&,8P`$
+M)(0``1"`__FL0P`````@)29F``0\`@``)$<^8``$$(``PA`A``080`!D&"$`
+M`QA``'48(0`#&(``9Q@AC&,``"2$``$0@/_UK$,`````("4\`@``)$8^>``$
+M$(``4Q`A``080`!D&"$``QA``'48(0`#&(``9A@AC&,``"2$``$0@/_UK$,`
+M"```("4F9@`$/`(``"1'/I``!!B``&88(0`$$$``1!`A``(00`!5$"$``A"`
+M`$<0(8Q"``"L8@`()(0``2R"`"@40/_S)G$`#*^@`!`\`@``)%(```(@("4D
+M!@`!`D#X"20'`2Z6!0``KZ``$`(@("4D!@`"`D#X"20'`0Z6!0`"KZ``$`(@
+M("4D!@`"`D#X"20'`0&/HP!\E&(``C!"`$`00``L)!```X_"`!R$10`"K[``
+M$`(@("4D!@`!`D#X"20'`*B/P@`<A$4`!*^P`!`"("`E)`8``0)`^`DD!P"I
+MC\(`'(1%``:OL``0`B`@)20&``$"0/@))`<`JH_"`!R$10`(K[``$`(@("4D
+M!@`!`D#X"20'`*Z/P@`<A$4`"J^P`!`"("`E)`8``0)`^`DD!P"OC\(`'(1%
+M``ROL``0`B`@)20&``$"0/@))`<`L(^C`'R48@`",$(`@!!``!$F<0`,KZ``
+M$#P0```F$````B`@)8^E`$@D!@`#`@#X"20'`1^OH``0`B`@)8^E`$PD!@`#
+M`@#X"20'`2(0```0EN(!U*^@`!`\$```)A````(@("6/I0!`)`8``P(`^`DD
+M!P$7KZ``$`(@("6/I0!$)`8``P(`^`DD!P$:EN(!U#!"`/`D0O_0+$(`0!!`
+M`"D`````EN0!U#B#`#4L8P`!.((`12Q"``$`8A@E%&``!B9R``PD`@!&$((`
+M`R0"`#84@@`<`````"01``*OL0`0/!```"80```"0"`E)`4``B0&``("`/@)
+M)`<`6J^Q`!`"0"`E)`4``B0&``("`/@))`<`7*^Q`!`"0"`E)`4``B0&``("
+M`/@))`<`7J^Q`!`"0"`E)`4``B0&``$"`/@))`<`_I;B`=(L0@!"%$``)0``
+M("4F<@`,)`(``:^B`!`\$```)A````)`("4D!0`!)`8``0(`^`DD!P$9)!$`
+M`Z^Q`!`"0"`E)`4``20&``("`/@))`<``:^Q`!`"0"`E)`4``20&``("`/@)
+M)`<``Z^Q`!`"0"`E)`4``20&``$"`/@))`<`BZ^Q`!`"0"`E)`4``20&``$"
+M`/@))`<`C```("4F90`$/`(``"1&0E``!!B``&48(0`$$$``1!`A``(00`!5
+M$"$``A"``$80(8Q"``"L8@"H)(0``2R"``T40/_T``08@(^C`'R48@`",$(`
+M0!!```DF9`"LC\(`'(1%``"OH``0/`(``"1"```D!@`"`$#X"20'`"4F<0"L
+MKZ``$#P"```D4@```B`@)8^E`#PD!@`&`D#X"20'``Z/HP!\C&(``#!"P``0
+M0``1)!``#Y1B``(P0D``)`,`"`!B@`NOH``0`B`@)20%``\D!@`$`D#X"20'
+M`#JOH``0`B`@)0(`*"4D!@`$`D#X"20'`$8``(`E/`(``"12/E@GL0`H/`(`
+M`"15````$!#``%(0(8Q$```D@L``+$(0`!!``!0`$!#``!`0@`)B$"&,0@``
+MKZ(`*).C`"B2(@`!``(2``!B&"62(@`"``(4``!B&"62(@`#``(6``!B&"6.
+MX@`4`$00(:Q#```0```*)M8``0!2$"&.XP`4C$(```!B&"$`$!"``F(0(8Q"
+M``"L8@``)M8``3+"`#\40``#``````*@^`DD!``!)A```1(`_]8\`@````"`
+M)215/F`F<@`$)[$`+#P"```D7@```!`00`!0$"$``A#``%40(8Q$```D@L``
+M+$(0`!!``!0`$!!``!`0@`)"$"&,0@``KZ(`+).C`"R2(@`!``(2``!B&"62
+M(@`"``(4``!B&"62(@`#``(6``!B&"6.X@`4`$00(:Q#```0```,)M8``0!0
+M$"$``A#``%40(8[C`!2,0@```&(8(0`0$(`"0A`AC$(``*QB```FU@`!,L(`
+M/Q1```,``````\#X"20$``$F$``!$@#_TCP"`````(`E)%(^>">Q`#`\`@``
+M)%4````0$$``4!`A``(0P`!2$"&,1```)(+``"Q"$``00``4`!`00``0$(``
+M4Q`AC$(`"*^B`#"3HP`PDB(``0`"$@``8A@EDB(``@`"%```8A@EDB(``P`"
+M%@``8A@ECN(`%`!$$"&L0P``$```#";6``$`4!`A``(0P`!2$"&.XP`4C$(`
+M``!B&"$`$!"``%,0(8Q"``BL8@``)M8``3+"`#\40``#``````*@^`DD!``!
+M)A```1(`_](\`@````"`)215/I`F<@`$)[$`-#P"```D7@```!`00`!0$"$`
+M`A#``%40(8Q$```D@L``+$(0`!!``!0`$!!``!`0@`!2$"&,0@`(KZ(`-).C
+M`#22(@`!``(2``!B&"62(@`"``(4``!B&"62(@`#``(6``!B&"6.X@`4`$00
+M(:Q#```0```,)M8``0!0$"$``A#``%40(8[C`!2,0@```&(8(0`0$(``4A`A
+MC$(`"*QB```FU@`!,L(`/Q1```,``````\#X"20$``$F$``!+@(`*!1`_](`
+M$!!```"`)3P"```D54)0)G(`!">Q`#@\`@``)%,````0$$``4!`A``(0P`!5
+M$"&,1```)(+``"Q"$``00``4`!`00``0$(``4A`AC$(`J*^B`#B3HP`XDB(`
+M`0`"$@``8A@EDB(``@`"%```8A@EDB(``P`"%@``8A@ECN(`%`!$$"&L0P``
+M$```#";6``$`4!`A``(0P`!5$"&.XP`4C$(```!B&"$`$!"``%(0(8Q"`*BL
+M8@``)M8``3+"`#\40``#``````)@^`DD!``!)A```2X"``T40/_2`!`00*Z`
+M+\0D`@`!C[\`=(^^`'"/MP!LC[8`:(^U`&2/M`!@C[,`7(^R`%B/L0!4C[``
+M4`/@``@GO0!X)[W[R*^_!#2OO@0PK[<$+*^V!"BOM00DK[0$(*^S!!ROL@08
+MK[$$%*^P!!"OI00\KZ8$0*^G!$2OI`/DE((!U#!"`/`D0O_0+$(`0!!``!$D
+M`P`!E(0!U#B#`#4L8P`!.((`12Q"``$`8A@E%&``!R0"``(D`@!&$((``R0"
+M`#84@@`$)`,``20"``(0```"KZ(#Z*^C`^@GI``8KZ0#[(^C!$248@`",$,!
+M\"0"`-`08@`B`````"AB`-$00``))`(!4"0"`*`08@`7CZ0#Y"0"`,`08@`:
+M`````!```94``!`E$&(`"X^D`^0H8@%1$$``!B0""``D`@%`$&(`!B2$']00
+M``&+```0)11B`!&/I`/D)(0?U*^D`_"/HP/D$```#I1B$M@DA!_@KZ0#\(^C
+M`^00```)E&(2VH^D`^0DA!_LKZ0#\(^C`^00```#E&(2W!```7<``!`ECZ0#
+M\)2#``8`0Q@D$&`!<@``$"6/HP1`A&(````"%$```A0#KZ(#^(^D!#R$@@``
+M``(40``"%`.OH@/T-`+>K:>B`]"GH@/2``"X)8^B`_"410`&``"0)2>D`]`"
+M11`',$(``1A```<NXP`"$&`!6@``$"4`%Q!``((0(:12```F]P`!)E(``2Y"
+M``040/_T`D40!X^C!$249```CZ(#\)1&``0GH@/<KZ(`$#P"``(D0I,HCZ,#
+M\(QE````0/@))Z<#X(^^`^"/H@/<`%X0*Q1``'@``+@E)[4!(#P"```D5@``
+M)[0!.">D`U"OI`/\)Z(!4*^B!``D`P!4CZ0#\(R"``ASPR`"`(*8(9>C`](T
+M`MZM%&(`(I>R`]``$H"``A*`(0`0@(`"<!`AE%(`!@!`@"4`$HA``J`@)28%
+M``@"P/@)`B`P)0*`("4F!0`0`L#X"0(@,"6&9P`"CZ(#_*^B`!`"0"`E`J`H
+M)3P#``(D8Y/8`&#X"0*`,"400`$6`!<AP(^B!```1"`A)Z4#4`+`^`DD!@"`
+M$```02;W``$`$H"``A*`(0`0@(`"<!`AE%(`!@!`@"4`$HA``J`@)28%``@"
+MP/@)`B`P)0*`("4F!0`0`L#X"0(@,"6&9P`"CZ,#_*^C`!`"0"`E`J`H)3P#
+M``(D8Y/8`&#X"0*`,"400`#U`!<AP(^B!```1"`ACZ4#_`+`^`DD!@"`E[(#
+MT@`2@(`"$H`A`!"`@`)P$"&44@`&`$"`)0`2B$`"H"`E)@4`"`+`^`D"(#`E
+M`H`@)28%`!`"P/@)`B`P)89G``*/HP/\KZ,`$`)`("4"H"@E/`,``B1CD]@`
+M8/@)`H`P)1!``-4`%R'`)Z("4`!$("$GI0-0`L#X"20&`(`F]P`!)]X``8^B
+M`]P`7A`K$$#_DR0#`%2/I0/@CZ(#\(Q$````!1!``$00(916``"/HP/<``,0
+M0`!$$"&450```&6X(Y>C`](T`MZM%&(`,P``D"4GL0%0`!>A@#P"``(D5Y+,
+M)[,`((^C!$249````!*`0`(P$"&$1P```I(0(0`"$$`"(A`AA$(``*^B`!`"
+MP"@E`N#X"0*@,"4"<(`AI@(``"92``$N0@!`%$#_[X^C!$0\`@`")$*50">D
+M`""/HP/D`$#X"8QE1G@``A_"`&(8(0`#&$./I`0\I(,``)>B`)X``A0```(<
+M`P`"%\(`8A@A``,80X^B`^RD0P``CZ0$0*2#``"7H@/0CZ,$2*1B```0``""
+MI&(``B>T`5``%[F`K[<$!#P"``(D5Y+,)Z0`(*^D!`@GLP)0)[X`H(^B!$24
+M1````!*(0`*1$"&$1P``CZ,$!`!R@"$`$(!``I`0(81"``"OH@`0`L`H)0+@
+M^`D"H#`ECZ0$"`"1&"&D8@``CZ($1)1$```"<1`AA$<```)P@"&&`@``KZ(`
+M$`+`*"4"X/@)`J`P)0/1B"&F(@``)E(``2Y"`$`40/_ACZ($1"0"``*/HP/H
+M%&(`)(>C`1X\`@`")$*6:">D`"`GI0"@CZ,#Y(QF1G@`0/@))Z<#V``"'\(`
+M8A@A``,80X^D!#RD@P``EZ(#V``"%````AP#``(7P@!B&"$``QA#CZ(#[*1#
+M``"7H@">``(4```"'`,``A?"`&(8(0`#&$./I`1`I(,``)>B`]"/HP1(I&(`
+M`)>B`](0```QI&(``H^D`_0`9!`J%$``%3P"``*/I`/X`&00*A1``!$\`@`"
+M)$*50">D`*"/HP/D`$#X"8QE1GB7HP/2CZ0$2*2#``"D@P`"``(?P@!B&"$`
+M`QA#CZ($/*1#```0```0EZ(!'B1"E4`GI``@CZ,#Y`!`^`F,949XEZ,#T(^D
+M!$BD@P``I(,``@`"'\(`8A@A``,80X^B!#RD0P``EZ(`G@`"%````AP#``(7
+MP@!B&"$``QA#CZ0#[*2#``"/H@1`I$,``(^D!$"4@P``)`(`/P!#$"./HP/D
+MI&(O]"0"``&/OP0TC[X$,(^W!"R/M@0HC[4$)(^T!""/LP0<C[($&(^Q!!2/
+ML`00`^``"">]!#@P@___,*7__S#&__\`!SP```<D`Q#%``^'IP`2`&40(P##
+M&",`9``8<$<`````$!(`Q1@C`$,`&@``$!(48``"```````'``T``A0``^``
+M"``"%`,#X``(`(`0)3#&__\PA/__``800`"B0"&4H@```((0*Q!```2/J0`0
+MK2````/@``BLX```E0+__@""$"L40``.`*`8)23"__^M(@```^``"*SB````
+M`A!#K2(```/@``BLX@````(00ZSB```D0@`!`^``"*TB````:!`K$$``#```
+M``"48@``$$3_\@!E$".48@`"`((0*Q1`__(`91`C)&,``@!H$"L40/_V````
+M``/@``@`````)[W_P*^_`#ROO@`XK[<`-*^V`#"OM0`LK[0`**^S`"2OL@`@
+MK[$`'*^P`!@`H*`E`,"P)8^U`%`PA/__``<\```'E`,``)@E)!$``2R#``(4
+M8``Y```0)0``@"4DE___/`(``B1>DLP`$1!``%00(91"````4!`K$$``"0`3
+M($`"-Q`J$$``!P"4$"$F8@`!,%/__R8B``$P4?__`!,@0`"4$"&410```!$8
+M0`!T$"&41@```)8@(82'````=A@AA&(``*^B`!`#P/@)`@`@)0`0&$``=1@A
+MI&(````"%````A0#`%(0*A1```XF`@`!+@(`0!!```LF`@`!`@`0)28#``$P
+M</__``(00`!5$"&D4@``+@(`0!1`__D"`!`E)@(``3!0__\N`@!`%$#_SP`1
+M$$`D`@`!C[\`/(^^`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R`""/L0`<C[``
+M&`/@``@GO0!``(!`)94"`'Z%!`!^A0,```"#(",HA`!_)$+_@@`"%``0@``"
+M``),`X4)``"%!@!^),+__P!`."4`1A`J$$``#20$`#\D@O__``(4```")`,`
+M!!!``$@0(81#````XQ@J``00)P`"%\(`8A@D%&#_]0``````@!@E)`<`/R1B
+M__\`0"`E$```!#!"__\``AP#)&3__S""__\L0@`_$$``!@`#$$``2!`AA$(`
+M``!&$"H00/_V``04`!1@``X`!Q!`!.``%P$@$"4`!Q!``$40(91#``*D0P``
+M).+__P`"%````CP#!.'_^`$@$"40```,``````!%$"&D0P``),+__@`"%```
+M`C0#).+__P`"%````CP#!.'_V0`````!(!`E`^``"```````@%@E)`P`0)5B
+M`'Z%9`!^A*,```"#(",HA`!_)$+_@@`"%``0@``"``)L`X2M``"%:0!^)2+_
+M_P!`0"4`21`J$$``#20$`#\D@O__``(4```")`,`!!!``$L0(81#```!`Q@J
+M``00)P`"%\(`8A@D%&#_]B2"__^4H@!^I.(```"`0"4D"@`_`6`@)83B````
+M21`J$$``!3$"__\L0@`!``P0"A!```<```````!@)0"@("40```#)`@`/P`"
+M%````D0#&0``"#$"__\`"!!``$00(81"````21`J$$#_]R4"__\Q`O__+$(`
+M`0`,$`L00``.``H00`5``!<!H!`E``H00`!&$"&40P`"I$,``"5"__\``A0`
+M``)4`P5!__@!H!`E$```#```````1A`A`8@8):1#```E(O_^``(4```"3`,E
+M0O__``(4```"5`,%0?_.`:`0)0/@``@`````)[W_Z*^_`!2OL``0`("`)8X$
+M1G@0@``%/`(``"1"````0/@)`````*X`1GB.!"_L$(``!3P"```D0@```$#X
+M"0````"N`"_LC[\`%(^P`!`#X``()[T`&(2D``0``#`E)`<``22H``0`!Q"`
+M`$<0(0`"$(`!`A@AE&(```!$$"H00``#``````#@,"6$9```).<``2CB``04
+M0/_T``<0@``&&(``9A@A``,8@"2B``@`8B`AA(@`"`!#$"&$20``)`<``0`&
+M$(``1A`A``(80"2E``@`9Q`A``(P0`#%$"&$1``(`(@0*A!```,`IA`A`(!`
+M)81)```DYP`!*.(`!!1`__0`"1!``0(0(P`"%``#X``(``(4`R>]_]"OOP`L
+MK[8`**^U`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`J"4`H*`E`."P):3```"6
+M@@`",$(!0"0#`4`40P`$`J`H)8ZI']P0```4EJ0?V):"``(P0@#0.$,`P"QC
+M``$X0@#0+$(``0!B&"408``$`````(RI'_00```(E*0?\):#``(P8P"@)`0`
+MH!1D`(0D`@`!C*D?Z)2D'^08@`"````0)9:#``"5(@```&(0*Q1``!4`````
+M)`(`5'""*`(`J1`AE$+_K`!#$"L00``8```X)20%`%1PA1`"`$DH(92B_ZZD
+MP@``/`(``B1"F"`"H"`E`$#X"22E_ZRFP@``$```9R0"``&5(@`"I,(``#P"
+M``(D0I@@`J`@)0!`^`D!("@EIL(``!```%TD`@`!$(``$P``*"66@P``E2(`
+M``!#$"L00``/)`(`5"0(`%0`H#@E)*4``0"D$"H00``))`(`5'"H&`(`:1`A
+MEH,``)1"````0Q`K%$#_]0`````D`@!4<*(8`@!I0"&5$@``<.(8`@!IF"&6
+M9P```D>0(QI``"X`````A0(``H9D``(`1!`CEH,```!G&",`D@`8<$,`````
+M$!(`4@`:```0$A9```(```````<`#0`"%@```A8#I,(``#P1``(F,9@@`J`@
+M)0(@^`D!`"@E`$"`)0*@("4"(/@)`F`H)0("@","H"`E`B#X"0)@*"66@P``
+MEF0```!D&",`4@`8<@,`````@!("$@`:``"`$A9```(```````<`#0`0A@``
+M$(8#IM```!```!(D`@`!)`(`5'"B&`(`:2@AEH,``)2B```48@`*`````)2B
+M``*DP@``/`(``B1"F"``0/@)`J`@):;"```0```")`(``0``$"6/OP`LC[8`
+M*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`P)[W_R*^_`#2OM@`P
+MK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`("P)0"@J"4`P)`E)!,``1)``!4`
+M`(@E/`(``B14F.``$1#``J*`(0+`("4"`"@E)Z8`$`*`^`DGIP`2$$``!9.B
+M`!&B`@`&DZ(`$Q````*B`@`'``"8)28Q``$",A`K%$#_\``1$,`"8!`EC[\`
+M-(^V`#"/M0`LC[0`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`.">]_^"OOP`8
+MK[$`%*^P`!``H(@E`("`)3P"```D0@```$#X"20$`.``0!@E%&``!*X#+^PD
+M`P`"$```**XC```D`@"`K@)&?#P"```D0@```$#X"20$`(``0!@E%&``!*X#
+M1G@D`P`"$```'*XC```D`@!`K@)&?#P"``(D0I?(K@(LJ#P"``$D0GFPK@(L
+MK#P"``(D0H!(K@(LL#P"``$D0GR0K@(LM#P"``(D0H"DK@(LN#P"``(D0HMH
+MK@(LO#P"``(D0INLK@(LP#P"```D0@``K@(LQ"0"``&/OP`8C[$`%(^P`!`#
+MX``()[T`(````````````````$%T:&5R;W,@-3(Q,`````!!=&AE<F]S(#4R
+M,3$`````071H97)O<R`U,C$Q("A&4$=!*0!!=&AE<F]S(#4R,3(@*$901T$I
+M`$%T:&5R;W,@-3,Q,B!7:5-O0P``071H97)O<R`R,S$U(%=I4V]#``!!=&AE
+M<F]S(#(S,3<@5VE3;T,``$%T:&5R;W,@,C,Q,R!7:5-O0P``071H97)O<R`U
+M-#(T+S(T,C0```!!=&AE<F]S(#4R,3(`````*%`6+%@H```````````+R```
+M"]@```O8```+X```"^@```P$```,#```#!P```X````,+```#$````R<```,
+M5```#&P```R$```,K```#@````X````-$```#20```TX```-0```"_P```U8
+M```-;```#8````X````.````#=@```X````-X```#@````X````.````#?#_
+MH/^C_Y[_H/^C_Z!!4C4R,3(``$%2-3,Q,@``4D8U,3$Q``!21C4Q,3(`````
+M``4`"@`4`!X`,@!&`%4`6@!?`&0```````H`%``>`"@`,@`\`$8`4`!:`&0`
+M`````,(```#$````Q0```-````#:````Y````,(```##````U````/(```$-
+M```!*````,\```#*`````````````B%0``$!0``$`*``"`#``"``T`!``5``
+M`````````!E4$!0&$"8`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````!D4```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```);`F/";0```D("6P)M```________```%`@\'`@\*``\)``\`````````
+M`````````(P<``"+R```B]```(Q@``"+[```C%@````````````````````@
+M````(````$````!```8````&````!@``%IX`"Q9B``H6.@`)%AP`"!7J``<5
+MF@`%%4H`!!4#``(460``"[@``0````````````"K*```JX@``*NP``"N(```
+MK"@``*X@``"N(```KB```*X@``"N(```K%P``*X@``"N(```KB```*X@``"L
+M;```K(P``*X@``"LU```K/@``*X@``"K[```KB```*X@``"N(```K3@``*U,
+M``"N(```K60```````"MX```K>P``*WX``"N!```KA``````````!@````$`
+M```"`````P````0````%``"N@```KK0``+"$``"O"```L(0``+"$``"PA```
+ML(0``+"$``"O2```L(0``+"$``"PA```L(0``*]D``"PA```L(0``*]T``"P
+M2```L(0``+"$``"PA```L(0``+"$``"OJ```KZ@``+"$``"P$```````````
+M```00``O_`\`+_P/`"_\'P`O_`\`+_P/```01``O_`\`+_P/`"_\'P`O_`\`
+M+_P/```02``O_`\`+_P/`"_\'P`O_`\`+_P/```03``O_`\`+_P/`"_\'P`O
+M_`\`+_P/```04``O_`\`+_P/`"_\'P`O_`\`+_P/```05``O_`\`+_P/`"_\
+M'P`O_`\`+_P/```06``O_`\`+_P/`"_\'P`O_`\`+_P/```07``O_`\`+_P/
+M`"_\'P`O_`\`+_P/```08``O_`\`+_P/`"_\'P`O_`\`+_P/```09``O_`\`
+M+_P/`"_\'P`O_`\`+_P/```0,````C````'@````L````6````'@```0<```
+M`6@```'@```!N````8P```'@```0L```#F```!&````?'```/C@``!&````0
+M\```H.```4!H``!8@```L.```4!H``"`%`/H`^@&X`;@!"`$(`A`"$`&X`;@
+M``"8!``````````#```````````````#``"8(`("`@`"`@(``@$"``("`@`"
+M`@(```"8)```#@X```X.```'!P``#@X```X.``"81!-R%AP3<APE$W(7(A-R
+M%J(3<APE``"88```G1```)T0``"=&```G1@``)T0``"89``!S@```<X```'.
+M```!S@```<X```"8:$":09!`FD&00)I!D$":09!`FD&0``"9&````;@```&X
+M````A````0@```&X``"9)!`%B@40!8H%$`6*!1`%B@40!8H%``"B,```````
+M`````````````0@`````````#``````````T````!0```$``````````1```
+M``@```!(````"````$P````0````4`````````!4````'P``"``````````(
+M!`````````@(````````"`P````````($`````````@4````````"!@`````
+M```('`````````@@````````""0````````2<````````!`X````````$'@`
+M```````0N````````!#X````````$3@````````1>````````!&X````````
+M$?@````````2.````````!)X````````$K@````````2^````````!,X````
+M````$W@````````3N````````!/X````````%#@````````4>````````!2X
+M````````%/@````````5.````````!5X````````%;@````````5^```````
+M`!8X````````%G@````````6N````````!;X````````%S@````````7>```
+M`````!>X````````%_@````````0/````````!!\````````$+P````````0
+M_````````!$\````````$7P````````1O````````!'\````````$CP`````
+M```2?````````!*\````````$OP````````3/````````!-\````````$[P`
+M```````3_````````!0\````````%'P```````"`!````````(`(````````
+M@`P```````"`(````````(`D````````@"@````P``"`+``'__\``(`P`?__
+M_P``@#0````Q``"`.````````(`\````````@$@```````"`5````````(!8
+M````````@%P`#\>/``"`P"J",!H``(#$!=P!X```@,@?0"<0``"`S`'T````
+M`(#0```>'```@-0``JJJ``"`V`(`554``(#<````````@.#_____``"`Y```
+M__\``(#H````````@.P```````"`\````````(#T````````@/@```````"`
+M_````(@``(<`````````AP0```",``"'"````.0``(<,```"U0``AQ``````
+M``"'%````````(<8````H```AQP```')``"'(````"P``(<D````+```AR@`
+M```P``"'+````#P``(<P````+```AS0````L``"'.````#```(<\````/```
+MAT````````"'1````````(=(````````ATP```````"'4````````(=4````
+M````AU@```````"'7````````(=@````U0``AV0```#?``"':````0(``(=L
+M```!.@``AW````!U``"'=````'\``(=X````H@``AWP```````"!```!``(`
+M`($$`````0``@0@```#```"!#````````($0```!:```@10```````"'P`,"
+M`0```(?$!P8%!```A\@+"@D(``"'S`\.#0P``(?0$Q(1$```A]07%A44``"'
+MV!L:&1@``(?<'QX='```A^`#`@$```"'Y`<&!00``(?H"PH)"```A^P/#@T,
+M``"'\!,2$1```(?T%Q85%```A_@;&AD8``"'_!\>'1P``)@,K82.&0``F!!]
+M*.````"8%)P*GVL``)@<````````F$`@:@%Z``"85```"%D``)D`````````
+MF00```````"9"````````)D,`(``````F1`````!``"9'```#(```)D@!1``
+M````F2@````!``"9+`````0``)DT'A\@(@``F3@*"PP-``"9/````#\``)E(
+MDH"R$@``F51=4.&(``"97`!+:HX``)EH```#S@``F7`9+[45``"9>`````$`
+M`)E\````````HA``@&,S``"B%``0;!```*(8`)Q`8```HB`!B##&``"B)```
+M!````*(L````````HC0@("`@``"B."`@("```*)`.$D*(```HD0``'NV``"B
+M2`__/_P``)L`````````FR@````,``";.````!(``)MD````(0``FXP````M
+M``";G````#,````#``8`"0`_```````#``8`"0`_```````)````!``$``$`
+M`0`!```````````````&1D<X```````````````````$`````0`!````````
+M```````$1D<W```````````````````#``$``0`!```````````````#1D<V
+M```````````````````$```````!```````````````!1D<U````````````
+M```````$``$``0``````````````````1D<T```````````````````$````
+M`0````````````#____^1D<S```````````````````#``$``0``````````
+M``#____]1D<R```````````````````$``````````````````#____\1D<Q
+M```````````````````"``$``0````````````#____Z1D<P````````````
+M``````````````````````````````````````````````````````````@`
+M```!``,```````````````````````9&1S<```````````````````(`````
+M``````````````````!&1S8```````````````````$`````````````````
+M`/____U&1S4``````````````````````````````````````/____I&1S0`
+M`````````````````````0`!`````````````/____A&1S,`````````````
+M`````````0`!`````0`!`````/____9&1S(``````````````````````0``
+M``$``0`!`````/____-&1S$``````````````````````0````$``0````$`
+M`/____!&1S``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````@````0````&````"`````H````,````#@```!```2O@``$E6``!
+M)I@``2C<``$I7``!*@0``2K4``````EL"8\)M```"0@);`FT`````!!``"_\
+M#P`O_`\`+_P?`"_\#P`O_`\``!!$`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!(
+M`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!,`"_\#P`O_`\`+_P?`"_\#P`O_`\`
+M`!!0`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!4`"_\#P`O_`\`+_P?`"_\#P`O
+M_`\``!!8`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!<`"_\#P`O_`\`+_P?`"_\
+M#P`O_`\``!!@`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!D`"_\#P`O_`\`+_P?
+M`"_\#P`O_`\``!`P```",````>````"P```!8````>```!!P```!:````>``
+M``&X```!C````>```!"P```.8```$8```!\<```^.```$8```!#P``"@X``!
+M0&@``%B```"PX``!0&@``(`4`^@#Z`;@!N`$(`0@"$`(0`;@!N```)@$````
+M``````,```````````````,``)@@`@("``("`@`"`0(``@("``("`@```)@D
+M```.#@``#@X```<'```.#@``#@X``)A$$W(6'!-R'"43<A<B$W(6HA-R'"4`
+M`)A@``"=$```G1```)T8``"=&```G1```)AD``'.```!S@```<X```'.```!
+MS@```)AH0)I!D$":09!`FD&00)I!D$":09```)D8```!N````;@```"$```!
+M"````;@``)DD$`6*!1`%B@40!8H%$`6*!1`%B@4``*(P````````````````
+M```!"``````````,`````````#0````%````0`````````!$````"````$@`
+M```(````3````!````!0`````````%0````?```(``````````@$````````
+M"`@````````(#`````````@0````````"!0````````(&`````````@<````
+M````""`````````()````````!)P````````$#@````````0>````````!"X
+M````````$/@````````1.````````!%X````````$;@````````1^```````
+M`!(X````````$G@````````2N````````!+X````````$S@````````3>```
+M`````!.X````````$_@````````4.````````!1X````````%+@````````4
+M^````````!4X````````%7@````````5N````````!7X````````%C@`````
+M```6>````````!:X````````%O@````````7.````````!=X````````%[@`
+M```````7^````````!`\````````$'P````````0O````````!#\````````
+M$3P````````1?````````!&\````````$?P````````2/````````!)\````
+M````$KP````````2_````````!,\````````$WP````````3O````````!/\
+M````````%#P````````4?````````(`$````````@`@```````"`#```````
+M`(`@````````@"0```````"`*````#```(`L``?__P``@#`!____``"`-```
+M`#$``(`X````````@#P```````"`2````````(!4````````@%@```````"`
+M7``/QX\``(#`*H(P&@``@,0%W`'@``"`R!]`)Q```(#,`?0`````@-```!X<
+M``"`U``"JJH``(#8`@!550``@-P```````"`X/____\``(#D``#__P``@.@`
+M``````"`[````````(#P````````@/0```````"`^````````(#\````B```
+MAP````````"'!````(P``(<(````Y```APP```+5``"'$````````(<4````
+M````AQ@```"@``"''````<D``(<@````+```AR0````L``"'*````#```(<L
+M````/```AS`````L``"'-````"P``(<X````,```ASP````\``"'0```````
+M`(=$````````AT@```````"'3````````(=0````````AU0```````"'6```
+M`````(=<````````AV````#5``"'9````-\``(=H```!`@``AVP```$Z``"'
+M<````'4``(=T````?P``AW@```"B``"'?````````($```$``@``@00````!
+M``"!"````,```($,````````@1````%H``"!%````````(?``P(!````A\0'
+M!@4$``"'R`L*"0@``(?,#PX-#```A]`3$A$0``"'U!<6%10``(?8&QH9&```
+MA]P?'AT<``"'X`,"`0```(?D!P8%!```A^@+"@D(``"'[`\.#0P``(?P$Q(1
+M$```A_07%A44``"'^!L:&1@``(?\'QX='```F`RMA(X9``"8$'THX````)@4
+MG`J?:P``F!P```````"80"!J`7H``)A4```(60``F0````````"9!```````
+M`)D(````````F0P`@`````"9$`````$``)D<```,@```F2`%$`````"9*```
+M``$``)DL````!```F30>'R`B``"9.`H+#`T``)D\````/P``F4B2@+(2``"9
+M5%U0X8@``)E<`$MJC@``F6@```/.``"9<!DOM14``)EX`````0``F7P`````
+M``"B$`"`8S,``*(4`!!L$```HA@`G$!@``"B(`&(,,8``*(D```$````HBP`
+M``````"B-"`@("```*(X("`@(```HD`X20H@``"B1```>[8``*)(#_\__```
+MFP````````";*`````P``)LX````$@``FV0````A``";C````"T``)N<````
+M,P``````````````,```@!4``(`5``"`%0``@!4``(`5``"`'!*-CZ<)B`_/
+M!.`/E1+@#ZL)B`_/``"8*`H"``$*`@`!!0$!``H"``$*`@`!``"8-```#@X`
+M``X.```.#@``#@X```X.``"8.`````<````'````"P````L````+``"82``8
+MVEH`&-I:`!C*:0`8RFD`&,II``"84`WHM.`-Z+3@#>BTX`WHM.`-Z+3@``"8
+M6'Z`#2Y^@`TN?NA-+G[H32Y^@`TN``"87#$W9EXQ-V9>,3=F7C$W9EXQ-V%>
+M``"8;`4,L($%#+"!!0RP@04,L(`%#+"```"9%```)Q```"<0```5?```*O@`
+M`"<0``"91/>X$"#WN!`@][@-(/>X$"#WN!`@``"B#&0L06ID+$%J9$!!:F1`
+M06ID0$%J``"B'!B#@`H8@X`*&'.`"AB#@`H8@X`*```2,````````)@(````
+M````F"P``B_^``"8/``"`0```)A,$H1A/```F3```$B#``"90`````0``)E8
+M````_P``F70```````"9^````!@``*($````````H@C0/F>(``"B*````;4`
+M`*(\$\B)KP``FP0````@``";"````!```)L,````,```FQ`````(``";%```
+M`"@``)L8````!```FQP````D``";(````!0``)LD````-```FRP````L``";
+M,`````(``)LT````(@``FSP````R``";0`````H``)M$````*@``FT@````&
+M``";3````"8``)M0````%@``FU0````V``";6`````X``)M<````+@``FV``
+M```!``";:````!$``)ML````,0``FW`````)``";=````"D``)MX````!0``
+MFWP````E``";@````!4``)N$````-0``FX@````-``";D`````,``)N4````
+M(P``FY@````3``";H`````L``)ND````*P``FZ@````K``";K````"L``)NP
+M````*P``F[0````K``";N````"L``)N\````*P``F\`````K``";Q````"L`
+M`)O(````*P``F\P````K``";T````"L``)O4````*P``F]@````K``";W```
+M`"L``)O@````*P``F^0````K``";Z````"L``)OL````*P``F_`````K``";
+M]````"L``)OX`````@``F_P````6``"8G```````````````````````````
+M``"8G`````````````````````````````"8G```````````````````````
+M``````"8G`````````````````````````````"8G```````````````````
+M``````````"8G`````````````````````````````"8G```````````````
+M``````````````"8G`````````````````````````````"8G```````````
+M``````````````````"8G`````````````````````````````"8G```````
+M``````````````````````"8G``X````.````#@````X````.`````"8G```
+M``````````````````````````"8G`````````````````````````````"8
+MG```````````````P````(````"```"8G``$`/D`!`#Y``0`_P`$`/T`!`#]
+M``"8U```````````````!`````0````$``":`````:D```````":!````>D`
+M``!```":"````"D```"```":#````&D```%0``":$````9D```&0``":%```
+M`=D```'0``":&````!D````0``":'````%D```!$``":(````)D```"$``":
+M)````:4```%(``":*````>4```&(``":+````"4```'(``":,````<@````4
+M``":-`````@```!"``":.````$@```""``":/````(@```%X``":0````9@`
+M``&X``":1````=@```'X``":2````!@````2``":3````%@```!2``":4```
+M`)@```"2``":5````:0```%\``":6````>0```&\``":7````"0```'\``":
+M8````&0````*``":9````*0```!*``"::````.0```"*``":;````0H```%:
+M``":<````4H```&:``":=````8H```':``":>````<H````.``":?`````H`
+M``!.``":@````$H```".``":A````(H```%>``":B````;H```&>``":C```
+M`?H```'>``":D````#H````)``":E````'H```!)``":F````88```")``":
+MG````<8```%Y``":H`````8```&Y``":I````$8```'Y``":J````(8````Y
+M``":K````,8```!Y``":L````,8```"Y``":M````,8```&]``":N````,8`
+M``']``":O````,8````]``":P````,8```!]``":Q````,8```"]``":R```
+M`,8```#]``":S````,8```#]``":T````,8```#]``":U````,8```#]``":
+MV````,8```#]``":W````,8```#]``":X````,8```#]``":Y````,8```#]
+M``":Z````,8```#]``":[````,8```#]``":\````,8```#]``":]````,8`
+M``#]``":^````,8```#]``":_````,8```#]``"8U````"```)C4````$```
+M`!0````0````$````!0``)C8`&`0:`!@$&@`8!!H`&`0:`!@$&@``)B<````
+M`````````````````````````)B<`````````````````````````````)B<
+M`````````````````````````````)B<````````````````````````````
+M`)B<`````````````````````````````)B<$````!`````0````$````!``
+M`````)B<!`````0````$````!`````0``````)B<````````````````````
+M`````````)B<`````````````````````````````)B<````````````````
+M`````````````)B<```````````*`````````````````)B<`#@`P``X`(`"
+M.`#``#@`P``X`,```)B<``(`!@`"``8````&``(`!@`"``8``)B<````B0``
+M`(D```")````B0```(D``)B<````H````*````"@````H````*```)B<``0`
+M!P`$``<`!``'``0`!P`$``<``)C4````&@```!H````:````&@```!H``)B<
+M````0````$@```!`````0````$```)B<````$````!`````0````$````!``
+M`)B<````"`````@````(````"`````@``)B<````3P```$\```!/````3P``
+M`$\``)B<````\0```/$```!A````\0```/$``)B<``"03P``D$\``)!,``"0
+M3P``D$\``)B<```26@``$EH``!*:```26@``$EH``)C,````#@````X````/
+M````#@````X````!````1@!@```````!````1@!A```````!````1@!B````
+M```!````1@!C```````!````1@!D```````!````1@!E```````!````1@!F
+M```````!````1@!G```````!````1@!H```````!````1@!I```````!````
+M1@!J```````!````1@!K```````!````1@!L```````!````1@!T```````!
+M````1@!T```````!````1@!T```````!````1@!T```````!````1@!T````
+M```!````1@!T```````!````1@!T```````!````1@!T```````!````1@!U
+M```````!````1@!V```````!````1@!W```````!````1@!X```````!````
+M1@!Y```````!````1@!Z```````!````1@![```````!````1@!\```````!
+M````1@!]```````!````1@!^```````!````1@!_```````!````1@"`````
+M```!````1`!\```````!````1@"(```````!````1@",```````!````1@"0
+M```````!````1@"4```````!````1@"8```````!````1@"<```````!````
+M1@"@```````!````1@"D```````!````1@"H```````!````1@"L```````!
+M````1@"P```````!````1@"T`````6:(``%FD``!9I@``6:@``%FN``!9K@`
+M`6:H``%FL!:>``868@`$%CH``Q8<``(5Z@`!%9H``!5*```5`P`!%%D``PNX
+M``4``````````````#```(`5``"`%0``@!4``(`5``"`%0``@!P2C9.G"8@3
+MSP3@$Y42X!.K"8@3SP``F"@*`@`!"@(``04"`0`*`@`!"@(``0``F#0```X.
+M```.#@``#@X```X.```.#@``F#@````'````!P````L````+````"P``F$@`
+M&-IM`!C:;0`8RG4`&,IU`!C*=0``F%`-Z+3@#>BTX`WHM.`-Z+3@#>BTX```
+MF%A^@`TN?H`-+G[H#2Y^Z`TN?H`-+@``F%PQ-V9>,3=F7C$W9EXQ-V9>,3=F
+M7@``F&P%#+"!!0RP@04,L($%#+"!!0RP@0``F10```?0```'T```!$P```B8
+M```'T```F43WN!`@][@0(/>X#1#WN!`0][@0$```H@0```````````````@`
+M```(````"```H@C6OF>(UKYGB-`^9XC0/F>(T#YGB```H@QD+`%`9"P!0&1"
+MP6!D0L%@9$+!8```HAP8@X`*&(.`"AAS@`H8@X`*&(.`"@``$C````````"8
+M"````````)@L``(O_@``F#P``@$```"83!*$83P``)DP``!(@@``F4`````$
+M``"96````/\``)ET````````HB@```&U``"B/!/(B:\``)L$`````0``FP@`
+M```"``";#`````,``)L0````!```FQ0````%``";&`````@``)L<````"0``
+MFR`````*``";)`````L``)LL````#0``FS`````0``";-````!$``)L\````
+M$P``FT`````4``";1````!4``)M(````&```FTP````9``";4````!H``)M4
+M````&P``FU@````<``";7````!T``)M@````(```FV@````B``";;````",`
+M`)MP````)```FW0````E``";>````"@``)M\````*0``FX`````J``";A```
+M`"L``)N(````+```FY`````P``";E````#$``)N8````,@``FZ`````T``";
+MI````#4``)NH````-0``FZP````U``";L````#4``)NT````-0``F[@````U
+M``";O````#4``)O`````-0``F\0````U``";R````#4``)O,````-0``F]``
+M```U``";U````#4``)O8````-0``F]P````U``";X````#4``)OD````-0``
+MF^@````U``";[````#4``)OP````-0``F_0````U``";^````!```)O\````
+M&@``F@`````'````!P``F@0```!'````1P``F@@```"'````AP``F@P```&@
+M```!H```FA````'@```!X```FA0````@````(```FA@```!@````8```FAP`
+M``&A```!H0``FB````'A```!X0``FB0````A````(0``FB@```!A````80``
+MFBP```%B```!8@``FC````&B```!H@``FC0```'B```!X@``FC@````B````
+M(@``FCP```!B````8@``FD````%C```!8P``FD0```&C```!HP``FD@```'C
+M```!XP``FDP````C````(P``FE````!C````8P``FE0```&$```!A```FE@`
+M``'$```!Q```FEP````$````!```FF````'J````"P``FF0````J````2P``
+MFF@```!J````BP``FFP```"J```!K```FG````&K```![```FG0```'K````
+M+```FG@````K````$@``FGP```!K````4@``FH````"K````D@``FH0```&L
+M```!DP``FH@```'L```!TP``FHP````L````$P``FI`````Z````4P``FI0`
+M``!Z````DP``FI@```"Z```!E```FIP```&[```!U```FJ````'[````%```
+MFJ0````[````.@``FJ@```![````>@``FJP```"[````N@``FK````&\```!
+MNP``FK0```'\```!^P``FK@````\````.P``FKP```!\````>P``FL````"\
+M````NP``FL0```#\```!O```FL@```#\```!_```FLP```#\````/```FM``
+M``#\````?```FM0```#\````O```FM@```#\````_```FMP```#\````_```
+MFN````#\````_```FN0```#\````_```FN@```#\````_```FNP```#\````
+M_```FO````#\````_```FO0```#\````_```FO@```#\````_```FOP```#\
+M````_```F-0````@``"8T`,&!`@#!P0(`P8$"`,&!`@#!P0(``"8W`"@(,``
+MH"#``.`@P`#@(,``X"#```"8G`\````/````#P````\````/``````"8G```
+M``````````````````````````"8G`"`````@````(````"`````@`````"8
+MG``J````*@```"H````J````*@````"8G``!`````0````$````!`````0``
+M``"8G`````````````````````````````"8G``8````&````!@````8````
+M&`````"8G`!@````8````&X```!N````;@````"8G`#'````QP```,<```#'
+M````QP````"8G`!+````2P```$L```!+````2P````"8G`1(```$2```!$@`
+M``1(```$2`````"8G`!,````3````$P```!,````3`````"8G`#D````Y```
+M`.0```#D````Y`````"8G`````````````````````````````"8G`#\````
+M_````/P```#\````_`````"8G`#_````_P```/\```#_````_P````"8G`0_
+M```$/P``!#\```0_```$/P````"8G``,````#`````P````,````#`````"8
+MG`(9```"&0```AD```(9```"&0````"8G``D````)````"0````D````)```
+M``"8G`"T````M````+0```"T````M`````"8G`"9````F0```)D```"9````
+MF0````"8G`!0````4````%````!0````4`````"8G``J````*@```"H````J
+M````*@````"8G``2````$@```!(````2````$@````"8G,`R``#`,@``P#(`
+M`,`R``#`,@````"8G`%T```!=````70```%T```!=`````"8G``1````$0``
+M`!$````1````$0````"8G(8H``"&*```AB@``(8H``"&*`````"8G#&$```Q
+MA```,80``#&$```QA`````"8G`#R`(``\@"``/(`@`#R`(``\@"```"8G``G
+M`!D`)P`9`"<`&0`G`!D`)P`9``"8G`````,````#`````P````,````#``"8
+MG`````````````````````````````"8G````+(```"R````L@```+(```"R
+M``"8G`"P((0`L""$`+`@A`"P((0`L""$``"8G`!!):0`026D`$$EI`!!):0`
+M026D``"8G``1DB``$9(@`!&2(``1DB``$9(@``"8G``:2```&D@``!I(```:
+M2```&D@```"8V``+`C``"P(P``L",``+`C``"P(P``"8G````)0```"4````
+ME````)0```"4``"8G````)$```"1````D0```)$```"1``"8G````!(````2
+M````$@```!(````2``"8G````(````"`````@````(````"```"8G````-D`
+M``#9````V0```-D```#9``"8G````&````!@````8````&````!@``"8G```
+M`/````#P````\````/````#P``"8G````*(```"B````H@```*(```"B``"8
+MG````%(```!2````4@```%(```!2``"8G````-0```#4````U````-0```#4
+M``"8G```%,P``!3,```4S```%,P``!3,``"8G```!(P```2,```$C```!(P`
+M``2,``"8Q`````,````#`````P````,````#``&`=``!@'P``8"$``&`G``!
+M@)P``8",``&`E````````````````#`N.2XR,"XS`````````6````%H```!
+M<````7@``````8@`\`#S`8D`@`"#`8H`\@#U`8L`]@#W`8P`\0#T`8T`@0"$
+M`8\`@@"%````90```````?____\```"`_____P````!*4```#[0`````````
+M:@```````?____\```"`_____P````!*4```#[0`````````0`#P`/.!B`#P
+M`/,`00"``(.!B0"``(,`2`#R`/6!B@#R`/4`0P#V`/>!BP#V`/<`2@#Q`/2!
+MC`#Q`/0`2P"!`(2!C0"!`(0`3`""`(6!CP""`(4)"`E$!08H*```````````
+M``````````````````````F%"84%!B@H````````````````````````````
+M````"84)A10&*"@````````````````````````````````)A0F%$@8H*```
+M````````````````!`````````````G0"JP%!B@H````````````````````
+M````````````"0@)1`4&%`4````````````````````````````````)"`E$
+M%``4!0````````````````````````````````EL":@%!A0%````````````
+M````````````````````"6P)J!0`%`4```````````````````!`````````
+M```);`FH'@`4!0````````````````````````````````EL"9X;!A0%````
+M````````````````````````````"6P)GA0`%`4```````````````````!`
+M```````````)@`F*%``4!0````````````````````````````````F9":@4
+M`!0%````````````````````````````````"=`*K`4&%`4`````````````
+M```````````````````)HPFH%``4!0``````````````````("``````````
+M``D("404`!0%````````````````````````````````"6P);!0`%`4`````
+M```````````````````````````)<0F`%``4!0``````````````````````
+M``````````F%"8H4`!0%````````````````````````````````"8\)F10`
+M%`4````````````````````````````````)G@F>%``4!0``````````````
+M``````````````````FC":,4`!0%``````````"````````$````````````
+M":,)HQ0`%`4``````````(`````````````````````)J`FH%``4!0``````
+M````@```````!`````````````FH":@4`!0%``````````"`````````````
+M````````"0@)1`4&%`4````````````````````````````````)"`E$%``4
+M!0````````````````````````````````EL":@%!A0%````````````````
+M````````````````"6P)J!0`%`4````````````````````@```````````)
+M;`FH'@`4!0````````````````````````````````EL"9X;!A0%````````
+M````````````````````````"6P)GA0`%`4````````````````````@````
+M```````)@`F*%``4!0````````````````````````````````F9":@4`!0%
+M````````````````````````````````":,)J!0`%`4`````````````````
+M`"`@```````````)M`FT!084!0````````````````````````````````FT
+M";04`!0%```````````````````H(```````````"=`*K`4&%`4`````````
+M```````````````````````)"`E$%``4!0``````````````````````````
+M``````EL"6P4`!0%````````````````````````````````"7$)@!0`%`4`
+M```````````````````````````````)A0F*%``4!0``````````````````
+M``````````````F/"9D4`!0%````````````````````````````````"9X)
+MGA0`%`4````````````````````````````````)HPFC%``4!0``````````
+M@```````!`````````````FC":,4`!0%``````````"`````````````````
+M````":@)J!0`%`4``````````(````````0````````````)J`FH%``4!0``
+M````````@`````````````````````FT";04`!0%``````````"````````$
+M````````````";0)M!0`%`4``````````(`````````````````````4"A1:
+M!08H*````````````````````````````````!2"%-(%!B@H``````````$`
+M````````````````````%/H5<@4&*"@`````````````````````````````
+M```5FA82!08H*``````````!`````````````````````!0>%$8%!B@H````
+M````````````````````````````%&X4O@4&*"@``````````0``````````
+M```````````4YA5>!08H*````````````````````````````````!6&%B8%
+M!B@H``````````$`````````````````````%%`4>!$&*"@`````````````
+M```````````````````44!1X%P8H*```````````````````````````````
+M`!1:%%H1!B@H````````````````````````````````%%H46A<`*"@`````
+M```````````````````````````4H!2@%P8H*``````````!``````````(`
+M`````````!2@%*`4!B@H``````````$``````````@``````````%((4@A$`
+M*"@``````````0`````````"```````````4JA2J%``H*``````````!````
+M``````(``````````!2"%*H4`"@H``````````$``````````@``````````
+M%((4JA<&*"@``````````0`````````"```````````5I!8<%`8H*```````
+M```!``````````(``````````!:`%J@4`"@H````````````````````````
+M````````%H`6J!X&*"@````````````````````````````````6A1:M'@8H
+M*````````````````````````````````!1:%((/`"@H``````````,`````
+M```$````````````%*H4JA(`*"@``````````P````````0````````````5
+MI!8<%``H*``````````#````````!````````````!:`%J@4`"@H````````
+M```````````$````````````$S,3/1<`"@4````````````````````0$```
+M```````31Q-1%P`*!0```````````````````!`0`````````!,X$W07`!04
+M````````````````````$`<`````````$TX3>QL&!04`````````````````
+M```!```````````341-Y'@8*!0````````````````````$``````````!-6
+M$W0A!A0%`````````````````````0``````````$ZL3L!<`"@4`````````
+M```````````0#``````````3L!/8%P`4%````````````````````!`"````
+M`````!._$[\7``H%````````````````````$`P`````````%``4>`4&%!0`
+M```````````````````````````````4,A1N%P`4%```````````````````
+M`!@!`````````!0R%&X4`!04````````````````````&`$`````````%#P4
+M>`\`%!0````````````````````%```````````4/!1X$084%```````````
+M``````````$!`````````!0\%'@2`!04````````````````````!0``````
+M````%#P4>!0`%!0````````````````````%```````````4/!1X%P`4%```
+M``````````````````4``````````!0\%'@7!A04````````````````````
+M`0``````````%#P4R!0&%!0``````````@`````````$```````````4>!2@
+M%P`4%``````````!``````````4``````````!2,%*`7`!04``````````,`
+M````````!0``````````%(P4R!(`%!0``````````P`````````%````````
+M```4C!3(%``4%``````````'````````@`4``````````!2,%,@4!A04````
+M``````,``````````0(`````````%(P4R!<&%!0``````````P`````````!
+M`@`````````4C!3(%P84%``````````#``````````$``````````!2,%,@>
+M`!04````````````````````````````````%(P61`4&%!0``````````P``
+M```````````````````4H!3($084%``````````#``````````$`````````
+M`!5\%?0>!A04``````````(`````````!```````````%7P61!0&%!0`````
+M`````P`````````!!``````````5?!9$&P`4%``````````#``````````4`
+M`````````!5\%D0>`!04``````````,`````````!0``````````%7P61!<`
+M%!0`````````!P```````(`!```````````6<1:M%P`4%```````````````
+M`````````````````!9Q%JT>!A04````````````````````````````````
+M%G$6K1X&%!0``````````@`````````$```````````6<1;!!084%```````
+M`````````````````````````!9Q%L$1`!04````````````````````````
+M````````%G$6P10`%!0````````````````````````````````6<1;!'@`4
+M%````````````````````````````````!9Q%L$>!A04````````````````
+M``````,`````````%G$6P1X&%!0````````````````````````````````3
+M.!-T'@`4%```````````````````!````````````!.P$]@>`!04````````
+M```````````$````````````%#(4;AX`%!0``````````P````````0`````
+M```````4/!1X'@`4%``````````#````````!````````````!2,%,@>`!04
+M``````````,````````$````````````%G$6P1X`%!0`````````````````
+M``0````````````5?!9$'@`4%``````````#````````!````````````!2,
+M%,@>`!04````````````````````````````````%#P4>!X`%!0`````````
+M```````````````````````6P1;!'@`4%```````````````````!```````
+M`````````?\!_P````````````!__________P````````````,!F`&9````
+M`````````'__________````````````!P&8"S``````````````?_______
+M__\````````````(`9@,,`````````````!__________P```````````"`!
+M(`H0`````````````'__________````````````(0$@`9D`````````````
+M?_________\````````````B`2`,,`````````````!__________P``````
+M`````#H!8`H0`````````````'__________````````````.P%@`9D`````
+M````````?_________\````````````2`64*$````````P````!_________
+M_P```````````#<!,`&9```````#`````'__________````````````-0(P
+M`9D```````,`````?_________\````````````V`S`!F0```````P````!_
+M_________P```````````#`$,`&9```````#`````'__________````````
+M````.04P`9D```````,`````?_________\````````````T!C`!F0``````
+M`P````!__________P```````````#(#,`&9```````#`````'__________
+M````````````,0,P`9D`````````````?_________\````````````1`1`!
+MF0````````````!__________P```````````!`!$`H0`````````````'__
+M________````````````4@%0`9D`````````````?_________\`````````
+M``!%`E`!F0````````````!__________P```````````$<#4`&9````````
+M`````'__________````````````0@10`9D`````````````?_________\`
+M``````````!8!5`!F0````````````!__________P```````````%L&4`&9
+M`````````````'__________````````````70A0`9D`````````````?___
+M______\```````````!>"5`!F0````````````!__________P``````````
+M`%`#4`H0`````````````'__________````````````50%0##``````````
+M````?_________\```````````!6`E`,,`````````````!__________P``
+M`````````$D"4`U0`````````````'__________````````````0`%`"D``
+M`````$8````$`````````"@!B`````````!!`4`*0```````1P````0`````
+M````:`&)`````````$@!0`H0``````!&````!``````````(`8H`````````
+M2@%`"D```````$8````$````````&`@!C`````````!+`4`*0```````1@``
+M``0```````!@"`&-`````````$P!0`I0``````!&````!``````````(`8\`
+M````````0P)`"D```````$<````$`````````'`!BP````````#P`T`*0```
+M````1@````0`````````(````````````(`#0`I```````!'````!```````
+M``!@#Z<`````````\0-`"D```````$8````$````````&`````````````"!
+M`T`*0```````1@````0```````!@``^H`````````((#0`I0``````!&````
+M!```````````#ZD`````````\@-`"A```````$8````$````````````````
+M``````"#!$`*0```````1P````0```````"`8`^J`````````/0$0`I`````
+M``!&````!````````)@`````````````A`1`"D```````$8````$````````
+MX``/JP````````"%!$`*4```````1@````0```````"```^L`````````/4$
+M0`H0``````!&````!````````(``````````````A@5`"D```````$<````$
+M````````@&`/K0````````"'!4`*0```````1@````0```````#@``^N````
+M`````(@%0`I0``````!&````!````````(``#Z\`````````B09`"D``````
+M`$<````$`````````&@/L`````````"*!D`*0```````1@````0```````!@
+M"`^Q`````````(L&0`I0``````!&````!``````````(#[(`````````C`=`
+M"D```````$<````$````````@&@/LP````````"-!T`*0```````1@````0`
+M``````#@"`^T`````````(X'0`I0``````!&````!````````(`(#[4`````
+M````CPA`"D```````$<````$````````@&@/M@````````"0"$`*0```````
+M1@````0```````#@"`^W`````````)$(0`I0``````!&````!````````(`(
+M#[@`````````]@E`"D```````$<````$````````@&````````````#W"T`*
+M0```````1P````0```````"`8````````````&``8`!@`````````````'__
+M________````````````80!A`&$```````,`````?_________\`````````
+M``!B`&(`8@```````@````!__________P```````````&,`8P!C````````
+M`````'__________````````````9`!D`&0```````,`````?_________\`
+M``````````!E`&4`90```````P````!__________P```````````&8`9@!F
+M`````````````'__________````````````9P!G`&<`````````````?___
+M______\```````````!H`&@`:`````````````!__________P``````````
+M`&D`:0!I```````#`````'__________````````````:@!J`&H```````,`
+M````?_________\```````````'_```````!`````0````$;6```````$```
+M``$````!`````1M8````"``#`````0`````````!&U@````,``,````!````
+M``````$;6````"``1P```````````````!M8````,P`P`````0`````````!
+M&U@````D`"$````!`````0````$;6````"@`-P````$``````````1M8````
+M'P`P`````0````$````!&U@````P`%L````!``````````$;6````'```P``
+M``$``````````1M8````.``W`````0`````````!&U@```!4`%4````!````
+M`0````$;6````$0`50````$````!`````1M8````3``[`````0``````````
+M&U@```!@`%(````!`````0````$;6````&0`-`````$``````````1M8````
+M?``@`````0````$````!&U@```"8`%L````!`````0````$;6````)P`4@``
+M``$````!`````1M8````J@`0`````0`````````!&U@```"\``,````!````
+M``````$;6````+\`-@````$``````````1M8````Q``W`````0````$````!
+M&U@```#+`#<````!``````````$;6````-``-P````$``````````1M8````
+MU@`0`````0````$````!&U@```#:``,````````````````;6````S(`-@``
+M``$``````````1M8````W@`#`````0`````````!&U@```#I`#<````!````
+M``````$;6````/8`-P````$``````````1M8````^@`W`````0`````````!
+M&U@```#_`#8````!``````````$;6````0P`,`````$````!`````1M8```!
+M%``W`````0`````````!&U@```$L`#<````!``````````$;6````4``$```
+M``$````!`````1M8```!5``#`````0`````````!&U@```%8`"$````!````
+M`0````$;6````5P`-P````$``````````1M8```!8``W`````0`````````!
+M&U@```%D`%L````!``````````$;6````6@`4@````$``````````1M8```!
+M;`!2`````0````$````!&U@```%T`#<````!``````````$;6````7@``P``
+M``$``````````1M8```!?``W`````0`````````!&U@```&(`$`````!````
+M```````;6````8D`00````$``````````!M8```!B@!(`````0``````````
+M&U@```&+`$,````!```````````;6````8P`2@````$``````````!M8```!
+MC0!+`````0``````````&U@```&/`$P````!```````````;6```#Z<`@```
+M``$``````````!M8```/J`"!`````0``````````&U@```^I`((````!````
+M```````;6```#ZH`@P````$``````````!M8```/JP"$`````0``````````
+M&U@```^L`(4````!```````````;6```#ZT`A@````$``````````!M8```/
+MK@"'`````0``````````&U@```^O`(@````!```````````;6```#[``B0``
+M``$``````````!M8```/L0"*`````0``````````&U@```^R`(L````!````
+M```````;6```#[,`C`````$``````````!M8```/M`"-`````0``````````
+M&U@```^U`(X````!```````````;6```#[8`CP````$``````````!M8```/
+MMP"0`````0``````````&U@```^X`)$````!```````````;6````9``0@``
+M``$``````````1M8```!C@`#`````0`````````!&U@```&8`$4````!````
+M`0````$;6````9H`10````$``````````!M8```!FP!%`````0``````````
+M&U@```&<`%X````!```````````;6````9X``P````$``````````1M8```!
+MK``W`````0`````````!&U@```&F``,````!``````````$;6````;8`-P``
+M``$``````````1M8```!N``W`````0`````````!&U@```&Z`#<````!````
+M``````$;6````;X`(0````$````!`````1M8```#)P`#`````0`````````!
+M&U@```'*`%T````!```````````;6````=8`-P````$``````````1M8```!
+MY``0`````0````$````!&U@```'L`#`````!`````0````$;6````?@``P``
+M``$``````````1M8```"$``W`````0`````````!&U@```(J`"(````!````
+M``````$;6````D(`-P````$``````````1M8```"``!;`````0`````````!
+M&U@```)*``,````!``````````$;6````D\`$`````$````!`````1M8```"
+M7`!2`````0`````````!&U@```)@`#L````!`````0````$;6````F@`-P``
+M``$``````````1M8```";``W`````0`````````!&U@```)V`!`````!````
+M`0````$;6````GH``P````$``````````1M8```"@@`#`````0`````````!
+M&U@```*#``,````!``````````$;6````JH`(0````$``````````1M8```"
+MO@!;`````0````$````!&U@```*_`#<````!``````````$;6````L$`-P``
+M``$``````````1M8```"Q@`[`````0`````````!&U@```+4`#<````!````
+M``````$;6````O``-P````$``````````1M8```"]``W`````0`````````!
+M&U@```+X``,````!``````````$;6````)X`4`````$````!`````1M8```"
+M_``#`````0`````````!&U@```,,`#`````!``````````$;6````Q0`-@``
+M``$``````````1M8```#&``V`````0`````````!&U@```,D``,````!````
+M``````$;6````Q```P````$``````````1M8```#.@`W`````0`````````!
+M&U@```-(`!`````!`````0````$6P0```TH`$@````$````!`````1M8```#
+M6@`1`````0`````````!&U@```-<`#H````!`````0````$;6````UX`5@``
+M``$``````````1M8```"P``#`````0`````````!&U@```-W``,````!````
+M``````$;6````LP``P````$``````````1M8`````````?\0````````````
+M`````0`````````````````````````@"``"`````````````````````/\`
+M````````````````)!$````````````````````4!0``````````````````
+M`@4````````````````````3```````````!4!``````````````````````
+M`````````````````````0``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````)0$```````````````````````````````
+M````````````!```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````U`0````````````````````````````````````````
+M```($```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````$4!```````````````````````````````````````````(```(``
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````50
+M$```````````````````````````````````````````0```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````!E`P````````
+M`````````@`````````#``````````````"``$"````````````````````)
+M"```````````````````````````````````````````````````````````
+M```````````````````````````````````````(4#``````````````````
+M```````````````#`````````0`$````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````E0,`````````````````(`````````
+M!`````,`````````$"`$````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````3`P`````````````````@`````````$`````P``
+M````"```@$``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````",#`````````````````"``````````0````#````````````
+M`$``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``,P,`````````````````(`````````!`````,```````@```!`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````!#`P````
+M`````````````@`````````$`````P```````````"!`````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````%,#``````````````
+M```"``````````0````#`````````````!``````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````8P,`````````````````(`````
+M````!`````,``````````0`1````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````1`0````````````````````````````````
+M``````````(``0`@```````````````````2!```````````````````(!$`
+M````````````````````````````````````````````````````````````
+M```````````````!(!``````````````````````````````````````````
+M!``"`@`````````````````````````````````````````@$@``````````
+M````````````````````````````````````````````````````````````
+M``````%@$`````````````````$``````````P`````````````"`$"`(```
+M````````````````$,0```````````````````0A````````````````````
+M`````````````````````````````````````````````````````````640
+M`````````````````0`````````#````````````````````.```````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````!0$``````````
+M``````````````````@````"``````````````0`````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````)`0```````````````````
+M````````$`````(`````````````!<<`````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````T!``````````````````````````(``
+M`````@````````````"`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````$0$`````````````````$````````@``````"````
+M````````0(``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````5`0`````````````````0```````"```````(``````````@!`
+M@```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M!D!````````````````````````````(`````@````````````"(````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````'0$``````
+M```````````$````````@`@````"````````````0(0`````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````A`0```````````````
+M``0```````"`"`````(``````````@!`A```````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"4!`````````````````````````
+M`(```````@````````````"!QP``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````+0$`````````````````$````````@``````"
+M````````````0(''````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````U0_P``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````H````````````````````*````````````````````````````
+M````"C#_``````````````````````````"``````P``````````````````
+M```````````````````````````````````````````````````````````!
+M`````````````````````0`````````````````````$```````````+,#``
+M`````````````````````````0`````#````````````````````````````
+M``````````````````````````````````````````````````"`````````
+M````````````@`````````````````````0```````````PP,```````````
+M```````````````"``````,`````````````````````````````````````
+M`````````````````````````````````````````!``````````````````
+M```0````````````````````!```````````"A`0````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````(````````````````````"``````
+M```````````````$```````````*0$``````````````````````````>&``
+M```"````````````````````````````````````````````````````````
+M``````````````````````I````````````````````$0```````````````
+M``````0```````````I00```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````@````````````````````(````````````````````!```
+M`````````9DP````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"`````````````````````@````````````````````$````````````
+M8/\````````````````#````````!``````(```````#X```````````````
+M`````````L``````````````````````````````````````````K\``````
+M``````````````OP``````````````````````@```````````!F_P``````
+M``````````,````````$``````@```````/@```````````````````````"
+MP``````````````````````````````````````````'P```````````````
+M`````?``````````````````````"````````````&?_````````````````
+M`P````````0`````"````````^````````````````````````+`````````
+M`````````````````````````````````"_````````````````````+\```
+M```````````````````(````````````:/\````````````````#````````
+M!``````(```````#X````````````````````````L``````````````````
+M````````````````````````5\```````````````````!7P````````````
+M``````````@```````````!A_P````````````````,````````$`````!``
+M``````/@````````````````````````````````````````````````````
+M``````````````"OP```````````````````"_``````````````````````
+M"````````````&+_`````````````````P````````0`````$````````^``
+M``````````````````````+`````````````````````````````````````
+M`````*_````````````````````+\``````````````````````(````````
+M````8_\````````````````#````````!``````(```````!X```````````
+M`````````````L``````````````````````````````````````````+\``
+M``````````````````OP``````````````````````@```````````!D_P``
+M``````````````,````````$`````!```````!P`"```````````````````
+M```"P``````````````````````````````````````````'P```````````
+M`````````?``````````````````````"````````````&7_````````````
+M`````P````````0`````$```````"(0`````````````````````````````
+M`````````````````````````````````````%?````````````````````5
+M\``````````````````````(````````````:?\````````````````#````
+M````!``````0```````#P````````````````````````L``````````````
+M````````````````````````````!\````````````````````'P````````
+M``````````````@```````````!J_P````````````````,````````$````
+M`!````````/`````````````````````````````````````````````````
+M```````````````````OP```````````````````"_``````````````````
+M````"````````````9C_````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````T`````````````````````````````````````
+M``````$$`/H#`($``F0"9`$$`?0'`($``<D!R0$$`^@"`((!`.0`Y`$$!]`&
+M`(0"`*``H`$$"[@!`(8#`(P`C`$"%W`+`(P$`#P`/`$"(R@/`!($`#P`/`$"
+M+N`*`)@&`#``,`$"1E`.`"0&`#``,`$"7<`)`#`(`"P`+`$"C*`-`$@(`"P`
+M+`$"NX`(`&`(`"P`+`$"TO`,`&P(`"P`+```````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````P`````````````````
+M``````````````````````````$``^@;`((```````$`!]`:!(0!``````$`
+M%7P9!(L"``````$`*O@8!)8#```````"%W`+``P$```````"(R@/`!($````
+M``$"+N`*`!@&``````$"1E`.`"0&``````$"7<`)`#`(``````$"C*`-`$@(
+M``````$"NX`(`&`(``````$"TO`,`&P(````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``0```````````````````````````````````````````$``^@;`((`````
+M``$`!]`:!(0!``````$`%7P9!(L!``````$`*O@8!)8!````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````@`````````````````````````````````````
+M``````$#%W`+`(P```````$#(R@/`!(```````$#+N`*`)@"``````$#1E`.
+M`"0"``````$#7<`)`+`$``````$#C*`-`$@$``````$#NX`(`&`$``````$#
+MTO`,`&P$````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````<`````````````````
+M``````````````````````````$#%W`+`(P```````$#+N`*`)@"``````$#
+M1E`.`"0"``````$#7<`)`+`#``````$#C*`-`$@#``````$#NX`(`&`#````
+M``$#TO`,`&P#````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``@```````````````````````````````````````````$"!=P+`(,`````
+M``$"",H/``0```````$""[@*`(8"``````$"$90.``D"``````$"%W`)`(P$
+M``````$"(R@-`!($``````$"+N`(`!@$``````$"-+P,`!L$````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````@`````````````````````````````````````
+M``````$""[@+`(8```````$"$90/``D```````$"%W`*`(P"``````$"(R@.
+M`!("``````$"+N`)`)@$``````$"1E`-`"0$``````$"7<`(`#`$``````$"
+M:7@,`#8$````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````@`````````````````
+M``````````````````````````$"%W`+`(P```````$"(R@/`!(```````$"
+M+N`*`)@"``````$"1E`.`"0"``````$"7<`)`+`$``````$"C*`-`$@$````
+M``$"NX`(`&`$``````$"TO`,`&P$````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M`````"YS>6UT86(`+G-T<G1A8@`N<VAS=')T86(`+G)E9VEN9F\`+G)E;&$N
+M=&5X=``N<F5L+G1E>'0`+G)E;&$N<F]D871A`"YR96PN<F]D871A`"YR96QA
+M+F1A=&$`+G)E;"YD871A`"YD871A,0`N8G-S`"YN;W1E````````````````
+M```````````````````````````````````````````````;<```!@````(`
+M````````-````!@```````````````0````8````*0````$````&````````
+M`%```9U@```````````````0`````````"\````)`````````````DG@```H
+MT`````\````"````!`````@````D````!`````````````)RL``````````/
+M`````@````0````,````/@````$````"```````!G;```$.P````````````
+M```0`````````$8````)`````````````G*P```'&`````\````%````!```
+M``@````Y````!`````````````)YR``````````/````!0````0````,````
+M5P````$````#```````!X6```$IP```````````````0`````````%T````)
+M`````````````GG(````(`````\````(````!`````@```!2````!```````
+M``````)YZ``````````/````"`````0````,````9P````$````#```````"
+M*]`````````````````````0`````````&X````(`````P```````BO0````
+M````````````````$`````````!S````!P````````````(KT```!!``````
+M``````````$`````````$0````,````````````"+^````!Y````````````
+M```!``````````$````"`````````````C,$```-8````!`````(````!```
+M`!`````)`````P````````````)`9```"7H```````````````$`````````
+M``````````````````````````````````,```(````````````````#```%
+M`````````````````P``"`````````````````,```$````````````````#
+M```+`````````````````P``#`````````````````,```T````!``"N2```
+M`F`2```"````#```SI0```+4$@```@```!<``-S8```!A!(```(````B``$R
+M2````4`2```"````+0``MS@````\$@```@```#@``%H@```!*!(```(```!#
+M``!#X````:01```(````3@``H\0````P$@```@```%D``)ZH````&!(```(`
+M``!D``""\`````@2```"````;P``;W@```,D$@```@```'H```X,````L!(`
+M``(```"%``%!H````#@2```"````D```JH@```!8$@```@```)L``'^P````
+M3!(```(```"F``#1:````-02```"````L0``">0```"`$@```@```+P``&1H
+M````\!(```(```#'``$>5````+P2```"````T@``$V0```'0$@```@```.T`
+M`$C,```!I!$```@```#X``"?^````*`2```"```!`P``!$@````P$@```@``
+M`0X``2&@````>!(```(```$9```````````0```````!.@``HG````$P$@``
+M`@```44``*(P````0!(```(```%0``%()````9P2```"```!6P``H-P```!P
+M$@```@```68``)C\````G!(```(```%Q``"@F````#02```"```!?```GT``
+M``",$@```@```8<``&+$````A!(```(```&2``#28````$P2```"```!G0``
+MH4P```"L$@```@```:@``)P4````1!(```(```&S```#2````0`2```"```!
+MO@``G\P````L$@```@```<D``0$L```!5!(```(```'4``!];````)`2```"
+M```!WP``VYP```"($@```@```>H``0J`````R!(```(```'U``$+2````$P2
+M```"```"`````>P```%0$@```@```@\``.T8```$8!(```(```(:``"U$```
+M`5`2```"```")0`!!C@```.<$@```@```C```*B,```!_!(```(```([``"V
+M<````!02```"```"1@```SP````,$@```@```E$```1X```"6!(```(```)G
+M``#:1````#02```"```"<@``TCP````D$@```@```GT``(L\```--!(```(`
+M``*(``"!K`````@2```"```"DP`!0>````%`$@```@```IX``23$````5!(`
+M``(```*I``%;_````"02```"```"M```@Y0```8T$@```@```K\``41<````
+M\!(```(```+*``!ES```"2`2```"```"U0`!!5P```#<$@```@```N```)Z@
+M````"!(```(```+K``"X$````&P2```"```"]@`!&YP```'($@```@```P$`
+M`5QL```"<!(```(```,,``"A^````#@2```"```#%P``;NP```",$@```@``
+M`R(``2(8````6!(```(```,M```````````2```````#.@`!'C0````@$@``
+M`@```T4``2+H````"!(```(```-0``"<L````+02```"```#6P``!S````)8
+M$@```@```VP``0[@```)-!(```(```-W``">P````!@2```"```#@@`!,X@`
+M``#8$@```@```XT``'BP````W!(```(```.8``#DB```!T02```"```#HP``
+MN3````!4$@```@```ZX``+"H````-!(```(```.Y``"C]```!)@2```"```#
+MQ```JN````-H$@```@```\\``0OD```!X!(```(```/:``$E&```!N`2```"
+M```#Y0``FL0```"@$@```@```_```)[X````"!(```(```/[``%?2````GP2
+M```"```$!@``G;````!P$@```@``!!$``$"8```!I!$```@```0<``$XL```
+M`%02```"```$)P``SG`````D$@```@``!#(``)B@````+!(```(```0]``";
+M9````+`2```"```$2``!(R0```&@$@```@``!%,``)HP````E!(```(```1>
+M``#5=````V02```"```$:0`!&80```(8$@```@``!'0``478```!+!(```(`
+M``1_``!,8````(@2```"```$B@``````````$```````!*H`````````"1$`
+M``@```2Z``#>7````)P2```"```$Q0``<IP```!H$@```@``!-```)QP````
+M0!(```(```3;``#:[````+`2```"```$Y@``GP`````X$@```@``!/$`````
+M`````!(```````4```!"/````:01```(```%"P``M-````!`$@```@``!18`
+M`'HX````6!(```(```4A``"!M````302```"```%+```1R@```&D$0``"```
+M!3<``*.@````)!(```(```5"``"XL````(`2```"```%30`!+Y@```*P$@``
+M`@``!5@``+><````=!(```(```5C``!%A````:01```(```%;@`!&(0```!X
+M$@```@``!7D``````````!(```````6(``"8S````#`2```"```%DP``H,P`
+M```0$@```@``!9X``)G0````8!(```(```6I```!G````%`2```"```%MP``
+M``P````4$0``"```!<D``(+X````G!(```(```74``$UU````M@2```"```%
+MWP``MM@```!@$@```@``!>H``%CH````X!(```(```7U``$8%````'`2```"
+M```&````MIP````\$@```@``!@L``0N4````4!(```(```86``#KS````1`2
+M```"```&(0`!(O`````T$@```@``!BP``'J0```!V!(```(```8W``$)U```
+M`*P2```"```&0@``6<@```!8$@```@``!DT``'[,````V!(```(```98```2
+M*````(@2```"```&8P``"Z````)L$@```@``!FX``'S@````C!(```(```9Y
+M``$Z*```!P`2```"```&A```_R@```"D$@```@``!H\``.S<````/!(```(`
+M``::``!(X````$02```"```&I0``!M````!@$@```@``!K```)F8````.!(`
+M``(```:[```````````2```````&RP`!0R````$\$@```@``!M8``1UD````
+MT!(```(```;A``")R````702```"```&[```````````$```````!PP```ID
+M```!/!(```(```<7``!S!```!5P2```"```'(@``N80```'L$@```@``!RT`
+M`````````!(```````<[``%'$````*`2```"```'1@`!2W@````($@```@``
+M!U$```^,````\!(```(```=<``"8<````#`2```"```'9P``MH0````8$@``
+M`@``!W(``,W<````E!(```(```=]``!^E````#@2```"```'B```WO@```60
+M$@```@``!Y,``4N0```0;!(```(```>>```^]````:01```(```'J0``??P`
+M``"8$@```@``![0``!*P````M!(```(```>_``%'L````'02```"```'R@`!
+M(70````D$@```@``!]4``)\X````"!(```(```?@``#^0````.@2```"```'
+MZP``/5````&D$0``"```!_8``'B(````*!(```(```@!```)B````%P2```"
+M```(#``!'Q````)D$@```@``"!<``0XX````J!(```(```@B``"V8````!`2
+M```"```(+0`!09`````($@```@``"#@``!!\```!K!(```(```A#``"W=```
+M`"@2```"```(3@`!>,````#H$@```@``"%D``%M(````/!(```(```AD``!1
+MS```!QP2```"```(>@``N'P````T$@```@``"(4``45,````C!(```(```B0
+M``"[<```$FP2```"```(FP``?_P```&P$@```@``"*8``$A(````F!(```(`
+M``BQ``"T,````*`2```"```(O```GB````"`$@```@``",<``4G`````]!(`
+M``(```C2``">V````"`2```"```(W0`!G&0```#P$@```@``".@``4K8````
+MH!(```(```CS``"=9````$P2```"```(_@``?'````!P$@```@``"0D``-*L
+M```"R!(```(```D4``$8_````"`2```"```)'P`!2X`````($@```@``"2H`
+M`'F,````K!(```(```DU``%<(````$P2```"```)0```G%@````8$@```@``
+M"4L``/?0```!8!(```(```E6``!+U````(P2```"```);P`!&1P```!H$@``
+M`@!Z>C`R9&)F.#<U`'IZ,#)D8C(P-3,`>GHP9F)B,64S9@!Z>C`U8CAC-C5A
+M`'IZ,#5B.30R960`>GHP,#$Y9C0W,`!Z>C`R9&0Y-#)D`'IZ,#)D8F4W,V0`
+M>GHP,#5B-CDR8@!Z>C!B-F0R,S(U`'IZ,#`Q-F0Y,F4`>GHP8V9B,3@W-0!Z
+M>C`P-6(W9#=A`'IZ,#!B-F-F-64`>GHP8C9F-3!B.`!Z>C`V93!A-&9E`'IZ
+M,#`V-V0R8C$`>GHP,#)D8F,V,0!Z>C`P-6(V8V9D`&%T:%]H86Q?<')O8V5S
+M<U]N;VES969L;V]R`'IZ,#`U8C0X860`>GHP,F1B9C%B,@!Z>C`S,V5C.&)F
+M`'IZ,&1B-#(U8S4`871H7VAA;%]D;6%?8F5A8V]N7W)E<W!O;G-E7W1I;64`
+M>GHP-F4P,&(X80!Z>C`R9&)F8S%D`'IZ,#`U8CEA8F0`>GHP,F1B93@U,0!Z
+M>C`Q-F4P,&1D`'IZ,#)D8C,Q8C(`>GHP,&(W,#DR,P!Z>C`P8C9D-#4P`'IZ
+M,#`P8C9D,60`>GHP,F1B9&%B,@!Z>C`P,39D834P`'IZ,#`P-C=D,S(`>GHP
+M,&(V9#DR,P!Z>C`P,F1B-3%C`'IZ,#$V9&-B9F4`>GHP,&(W,#$T-0!Z>C!D
+M8S9E,SDP`'IZ,&(W,#EE9F8`871H7VAA;%]A='1A8V@`>GHP-F4P9F,P9`!Z
+M>C`Q-F1A8C)D`'IZ,&4P-#8X-&(`>GHP,39E,CDQ9`!Z>C`P,&(V9F4X`'IZ
+M,#!C9F(S93``871H7VAA;%]C;VUP=71E='AT:6UE`'IZ,#)D8C5B86,`>GHP
+M,#5B-V8Y9`!Z>C`V9&9F-#1A`'IZ,#)D8C4W-C,`>GHP,F1C,3EA90!Z>C`P
+M,F1A9C8R`'IZ,#`U8CAF.60`>GHP8C@S860S90!Z>C`P,&(W,#4R`'IZ,#`P
+M-6(V8C(`>GHP-6(W9C$Q-`!Z>C`T864P,S%F`'IZ,#`U-#=F960`>GHP,&(W
+M,3<W9`!Z>C`P,F1B83DR`'IZ,#)D8C%A8C(`>GHP,#`U8C8R,@!Z>C!B-CEB
+M,#=C`&%T:%]H86Q?9G)E90!Z>C`R9&)E8F)D`'IZ,&(U93,Q-3(`>GHP,39D
+M9F)F,0!A=&A?:&%L7VUH>C)I965E`'IZ,#$V93$X.6(`>GHP,F1B,S,U9`!Z
+M>C!B-F,U,V$T`'IZ,&(V9F0S-C,`>GHP9&,R,60S80!Z>C`P8C<Q-S-D`'IZ
+M,#$V9#ED-#$`>GHP,#5B.&%B9`!Z>C`R9&(S.#<U`'IZ,#$V93,P.6(`>GHP
+M,#5B-C!B,@!Z>C`P8C<P,38Q`'IZ,#9D.61D.3,`>GHP,#$V9&4W,@!Z>C!D
+M8C-E9#@V`'IZ,#`U8C0X960`>GHP,#)D8F,T,@!Z>C`P-6(W9C)E`'IZ,#)D
+M8F9D9F0`>GHP,39E-C0X80!Z>C`P,F1A9F8R`'IZ,#$V9&$Y,C``>GHP-6(W
+M.#%E,`!Z>C`P,F1C83!B`'IZ,#!B-S!A-V$`>GHP9F%C,&,Y8@!A=&A?:&%L
+M7V%D9&ET:6]N86Q?<W=B85]B86-K;V9F`&%T:%]H86Q?=F5R<VEO;@!Z>C`R
+M9&)A8S)E`'IZ,&(V8V8P,#D`>GHP,#$V93$R8P!Z>C`P,#)D865A`'IZ,#9D
+M9F1D.3,`871H7VAA;%]M86QL;V,`>GHP,F1D.3)A9`!Z>C`Q-F1B,C4Q`'IZ
+M,&4Q,#=C83$`>GHP,F1C,3<V,P!Z>C!B-CDP9#9D`'IZ,#$V9&8P-3$`>GHP
+M,&(W,#9B8P!Z>C`P,39D.#<R`'IZ,&0Q-&0Q8C``>GHP8C0X,#,Q90!Z>C`P
+M,&(V9F8X`&%T:%]H86Q?;65M8W!Y`'IZ,#$V9&$P9&0`>GHP,F1B,C@U,0!Z
+M>C`V9&(P8V8R`&%T:%]H86Q?<')O8F4`871H7VAA;%]B=6EL9&]P=',`>GHP
+M9&%D8S8R8P!Z>C`P,&(V8S$P`'IZ,&(W,C%A960`>GHP-C=C9F-A90!Z>C`P
+M,&(V8V8X`'IZ,#5B.3)A960`>GHP8C9D.65F9@!Z>C`R9&)F9F(Q`'IZ,&(U
+M93,Q-C``>GHP8C@Q96$Y-`!Z>C`Q-F1E8S%F`'IZ,&4X.30Y,#<`>GHP,&(V
+M96$W80!Z>C`S,V4X9F)F`'IZ,&-F834X-S4`>GHP,F1B.3EA90!Z>C`P,#5B
+M-V(R`'IZ,&1E-C@S-V8`>GHP8C<P.60P,@!Z>C`V-V0R-64R`'IZ,#$Y9C-A
+M,#$`>GHP-S`S.30W8@!A=&A?:&%L7VUE;7IE<F\`>GHP,39E,&)F90!Z>C`Q
+M-F4R9&9D`'IZ,#9F96%F-C``871H7VAA;%]S=U]B96%C;VY?<F5S<&]N<V5?
+M=&EM90!Z>C`Y9C8T8C9A`'IZ,&(V.3<S8F,`>GHP,#5B.#AF9`!A=&A?:&%L
+M7V1E;&%Y`'IZ,#!B-S(Q-C$`>GHP,39D9C(U,0!Z>C`V-V0R9C0Q`'IZ,#)D
+M8C-D9F0`>GHP,F1B-3-E9`!Z>C`Q-F1C96%E`'IZ,#`P8C9E,C(`>GHP-6(X
+M,#`T,0!Z>C`P,#)D8S4R`'IZ,#`U8C1A,F0`>GHP,#!B-F4U,@!Z>C`V-V0P
+M8S0W`'IZ,&1B8F5D.#8`>GHP-6(V8S9D8@!Z>C!C,S$U96(U`'IZ,#9D-#`V
+M93``>GHP,#)D9#@V9`!Z>C`P,39E,31D`'IZ,#`V-V0R,C$`>GHP,#5B.#DS
+M9`!Z>C`U8C@Q8C%B`'IZ,#`P8C9C93@`>GHP8C=F-3!B.`!Z>C`S,V5B9F)F
+M`'IZ,&(X,F1E-F0`>GHP,#$V9#<S,@!Z>C!F-#5E-F4S`&%T:%]H86Q?:6YI
+M=%]C:&%N;F5L<P!Z>C`P8C9D-F)C`'IZ,#`P8C<P,C(`>GHP,#`R9&)D,@!Z
+M>C!D830X-&$Q`'IZ,&$V,&0Q-#4`>GHP,39E,3(U,0!Z>C!D8S9A-6,U`'IZ
+M,#$V938Y,60`>GHP,F1B9C,U9`!Z>C`P,39D.#,R`'IZ,#$V934R-3$`>GHP
+M,F1B-3<P80!Z>C`P-6(V9#=A`'IZ,#`R9&(R.3(`>GHP,#5B.3!C8@!Z>C`U
+M8C=C8F0U`'IZ,#`U8C5C-#8`>GHP,#!B-F8Q9`!Z>C`P,39D830X`'IZ,&(V
+M-C,Q83@`871H7VAA;%]G971W:7)E;&5S<VUO9&5S`'IZ,#$V93%B.#<`````
+M```(```"!0```!````(&````B````@4```"0```"!@```,0```(%````S```
+M`@8```#T```"!0```/P```(&```!/````@4```%$```"!@```4P```(%```!
+M5````@8```%@```"!0```+0```(%```!:````@8```%L```"!0```$P```(%
+M```!=````@8```%X```"!0```'@```(%```!@````@8```&$```"!0```1@`
+M``(%````-````@4```&,```"!@```=````$%```!U````08```)<``"5!0``
+M`@P``)4%```"9```E08```*P``"5!0```K0``)4&```"S```1`4```+0``!$
+M!@```Y```*,%```#E```HP8```=\``!K!0``!X```&L&```(I```:P4```BH
+M``!K!@``":```)D%```)I```F08```FP```"!0``";0```(&```)R````@4`
+M``G,```"!@``"?P``)D%```*````F08```H,```"!0``"A````(&```*.```
+M`@4```H\```"!@``"M0``#H%```*V```.@8```NL```"!0``"[````(&```/
+M_````04``!`````!!@``$L@``(@%```2S```B`8``!+L``"9!0``$O```)D&
+M```3%````@4``!,8```"!@``$[````(%```3M````@8``!/0``"9!0``$]0`
+M`)D&```54````@4``!58```"!@``%5P```(%```58````@8``!B8```!!0``
+M&)P```$&```9+```<P4``!DP``!S!@``'8````$%```=J````08``![```";
+M!0``'?P``)L%```>Q```FP8``"%H```!!0``(6P```$&```AG````04``"&@
+M```!!@``(A@``$T%```B'```308``"-P```!!0``(W0```$&```C?````04`
+M`".````!!@``)$0```$%```CK````04``"1(```!!@``+3P``',%```M0```
+M<P8``"UD``";!0``+6@``)L&```MC````04``"V0```!!@``+;P```$%```M
+MP````08``"W0```!!0``+=0```$&```N&```FP4``"X<``";!@``+D0```$%
+M```N2````08``"YT```!!0``+G@```$&```NB````04``"Z,```!!@``+M``
+M`)L%```NU```FP8``"[\```!!0``+P````$&```O+````04``"\P```!!@``
+M+T````$%```O1````08``"]H``!-!0``+VP``$T&```O[````04``"_P```!
+M!@``,"````$%```P)````08``##4```!!0``,-@```$&```T%````04``#08
+M```!!@``-'0```$%```T>````08``#E,```!!0``.5````$&```Y5````04`
+M`#E8```!!@``.F@```(%```Z;````@8``#I\```"!0``.H````(&```\-```
+M`04``#PX```!!@``2%P```$%``!(8````08``$AT```!!0``2'@```$&``!(
+MC````04``$B0```!!@``2*0```$%``!(J````08``$B\```!!0``2,````$&
+M``!)"````04``$D,```!!@``2;@```$%``!)O````08``$G<```#!0``2>``
+M``,&``!*&````P4``$H<```#!@``2FP```$%``!*<````08``$JX```#!0``
+M2KP```,&``!+G````04``$N@```!!@``2_````$%``!+]````08``$P(```!
+M!0``3`P```$&``!,*````04``$PL```!!@``3&P```$%``!,<````08``$SP
+M```#!0``3/0```,&``!-.````04``$T\```!!@``35@```$%``!-7````08`
+M`$UT```#!0``37@```,&``!-V````P4``$W<```#!@``3>```'\%``!-Y```
+M?P8``$XX```#!0``3D````,&``!.T````04``$[4```!!@``3T0```$%``!.
+M[````04``$[P```!!@``3P@```$%``!/#````08``$]0```#!0``3U0```,&
+M``!/O````P4``$_````#!@``3\0```,%``!/R````P8``%!<```!!0``4&``
+M``$&``!2*````04``%(L```!!@``4D````$%``!21````08``%)@```!!0``
+M4F0```$&``!2A````04``%)<```!!0``4H@```$&``!2E````04``%*8```!
+M!@``4K````$%``!2M````08``%+0```!!0``4M0```$&``!3.````04``%-`
+M```!!@``4Y0```(%``!3F````@8``%.<```"!0``5[0```(%``!3H````@8`
+M`%1,```#!0``5&````,&``!4?````P4``%2````#!@``5)@```,%``!4G```
+M`P8``%0\```#!0``5+@```,&``!4U````P4``%38```#!@``5!@```,%``!4
+M]````P8``%4$```!!0``50@```$&``!5)````04``%4H```!!@``55````$%
+M``!55````08``%8<``";!0``5B```)L&``!7N````@4``%>\```"!@``5]P`
+M``$%``!7X````08``%?P```!!0``5_@```$&``!:?```B`4``%G4``"(!0``
+M6=@``(@&``!:3````04``%I0```!!@``6MP``(@%``!:X```B`8``%M0``"(
+M!0``6U0``(@&``!<]````04``%SX```!!@``7;P```$%``!=B````04``%UP
+M```!!0``730```$%``!=$````04``%V0```!!@``79@```$%``!=H````08`
+M`%W,```!!0``7=````$&``!>+````P4``%XT```#!@``7C@```,%``!>/```
+M`P8``%Y````#!0``7D0```,&``!>2````04``%Y,```!!@``7P@```,%``!?
+M$````P8``%\4```#!0``7Q@```,&``!?'````P4``%\@```#!@``7R0```$%
+M``!?*````08``%_$```!!0``7\@```$&``!?]````04``%_X```!!@``8`P`
+M``$%``!@$````08``&,H```>!0``8RP``!X&``!D,```9@4``&0T``!F!@``
+M9)P``'\%``!DH```?P8``&2D```"!0``9*@```(&``!E(````@4``&4D```"
+M!@``960```(%``!E:````@8``&5L```"!0``97````(&``!E=````@4``&5X
+M```"!@``9@0``',%``!F"```<P8``&8T```9!0``9C@``!D&``!F4```Q04`
+M`&94``#%!@``9L0```$%``!FR````08``&;<``#-!0``9NP``,T&``!G2```
+M`04``&=,```!!@``9U@``!(%``!G1```$@4``&<T```2!0``9UP``!(&``!H
+M$```*`4``&@4```H!@``;&0``,P%``!J'```S`4``&E\``#,!0``:6P``,P%
+M``!I7```S`4``&E$``#,!0``:8```,P&``!J+```S`4``&HP``#,!@``:EP`
+M`,P%``!J8```S`8``&J8``#,!0``:IP``,P&``!JX```S`4``&KD``#,!@``
+M:V@```(%``!K;````@8``&MT```"!0``:W@```(&``!KT```Q`4``&O4``#$
+M!@``;'P``*,%``!L@```HP8``&R,```H!0``;)```"@&``!LM```HP4``&RX
+M``"C!@``;.```,P%``!LY```S`8``&T4``"A!0``;1@``*$&``!ML```R04`
+M`&VX``#)!@``;;P``+T%``!MP```O08``&WD``"6!0``;>@``)8&``!N````
+MS`4``&X$``#,!@``;F@```$%``!N>````08``&ZD``!+!0``;J@``$L&``!N
+M^```0`4``&[\``!`!@``;QP``"D%``!O(```*08``&\L``#%!0``;S```,4&
+M``!O1```F`4``&](``"8!@``;U@``$T%``!O7```308``')\``"C!0``<H``
+M`*,&``!X:```8@4``'AL``!B!@``>)0``,X%``!XF```S@8``'B0```!!0``
+M>*0```$&``!Y+```8@4``'DP``!B!@``>=P``"`%``!YK```(`4``'G@```@
+M!@``>?```)\%``!Y]```GP8``'H<``!5!0``>B```%4&``!\G```+`4``'R@
+M```L!@``?X0``'<%``!_B```=P8``(NL```"!0``B[````(&``"55```G@4`
+M`)`4``">!0``CAP``)X%``"0&```G@8``)@P``">!0``F#0``)X&``"8?```
+M?P4``)B```!_!@``F*@``'\%``"8K```?P8``)C8``!_!0``F-P``'\&``"9
+M%```?P4``)D8``!_!@``FPP```(%``";$````@8``)N$``!_!0``FX@``'\&
+M``"?'```"@4``)\@```*!@``GV@``!@%``"?;```&`8``)^4``"V!0``GY@`
+M`+8&``"?W```&`4``)_@```8!@``H!@``!@%``"@'```&`8``*!$``"V!0``
+MH$@``+8&``"@L```&`4``*"T```8!@``H6P``!@%``"A<```&`8``*&8``"V
+M!0``H9P``+8&``"B%```&`4``*(8```8!@``HJP``+8%``"BL```M@8``*.H
+M```7!0``HZP``!<&``"D````#P4``*0$```/!@``J)@```\%``"HG```#P8`
+M`*J(```"!0``JI````(&``"JH````@4``*JD```"!@``JL@```(%``"JS```
+M`@8``*L,```"!0``JQ````(&``"MB```3P4``*V<``!/!@``K<0```(%``"M
+MR````@8``*X@``"3!0``KB0``),&``"N9````@4``*YH```"!@``L!P```(%
+M``"P(````@8``+`L``!<!0``L#```%P&``"PC```$P4``+"0```3!@``L+P`
+M`*8%``"PP```I@8``+&$``"C!0``L8@``*,&``"QH```HP4``+&D``"C!@``
+MM%P```$%``"T=````08``+2(```!!0``M(P```$&``"TH````04``+2D```!
+M!@``M:0``!P%``"UJ```'`8``+8H``!X!0``M<P``'@&``"UX```?04``+7H
+M``!]!@``M>P``&$%``"U]```808``+7X``"M!0``M@```*T&``"V!```=`4`
+M`+8,``!T!@``MA````X%``"V&```#@8``+8<``"T!0``MB0``+0&``"UQ```
+M>`4``+8P``!X!@``MC0``'T%``"V.```?08``+8\``"@!0``MD```*`&``"V
+ML```+`4``+:T```L!@``MP0``!\%``"W"```'P8``+<4``![!0``MQ@``'L&
+M``"W6```3`4``+=<``!,!@``NP0``%0%``"["```5`8``+PX``#%!0``O!P`
+M`,4%``"\/```Q08``+Q8``"(!0``O%P``(@&``#7E```<04``->(``!Q!0``
+MO,0``'$%``"\R```<08``+S8``![!0``O-P``'L&``"]?```"04``+V````)
+M!@``OG@``#<%``"^?```-P8``+Z,```N!0``OI```"X&``"^G```S04``+Z@
+M``#-!@``OZ@```(%``"_K````@8``,!H``"C!0``P&P``*,&``#`C````@4`
+M`,"0```"!@``P5@``*,%``#!7```HP8``,&<``"/!0``P:```(\&``##=```
+M-`4``,-L```T!0``PSP``#0%``##+```-`4``,-X```T!@``PZP``*D%``##
+ML```J08``,0X``!6!0``Q#P``%8&``#0:```C`4``,1,``",!0``Q"0``(P%
+M``#$4```C`8``,1@``"K!0``Q&0``*L&``#%!```%P4``,4(```7!@``QN@`
+M`&,%``#&[```8P8``,<$```A!0``QP@``"$&``#''```-@4``,<@```V!@``
+MR````*,%``#("```HP8``,@L``"C!0``R#0``*,&``#(2```HP8``,B(``"C
+M!0``R(P``*,&``#)3```,`4``,E0```P!@``R?```%(%``#)]```4@8``,ID
+M``!G!0``RF@``&<&``#*=```+`4``,IX```L!@``RI```%D%``#*E```608`
+M`,M(``"0!0``RTP``)`&``#,G```)P4``,R@```G!@``S+@``!T%``#,O```
+M'08``,S4```J!0``S-@``"H&``#-8```*P4``,UD```K!@``S7P``+4%``#-
+M@```M08``,[$``"(!0``SL@``(@&``#.W```U04``,[@``#5!@``ST```*,%
+M``#/1```HP8``,^```!C!0``SX0``&,&``#/Y```HP4``,_H``"C!@``S_0`
+M`#0%``#/^```-`8``-!\``!6!0``T(```%8&``#0D```C`4``-"4``",!@``
+MT0P``"L%``#1$```*P8``-$H``"U!0``T2P``+4&``#21````04``-)(```!
+M!@``TG```,4%``#2=```Q08``-*,```!!0``TI````$&``#2R````04``-+,
+M```!!@``TN```,4%``#2Y```Q08``-+\```!!0``TP````$&``#5````HP4`
+M`-4$``"C!@``U2P``*,%``#5,```HP8``-6@``"(!0``U:0``(@&``#7U```
+M<04``-?8``!Q!@``V(0```$%``#8<````04``-B(```!!@``V7```*,%``#9
+M=```HP8``-F0```L!0``V90``"P&``#:````Q04``-H$``#%!@``VR0``#L%
+M``#;*```.P8``-LX```!!0``VSP```$&``#<O```'@4``-S````>!@``X)``
+M``H%``#@E```"@8``.,```!N!0``XP0``&X&``#L^```-`4``.S\```T!@``
+M[40``)L%``#M2```FP8``.V8```"!0``[9P```(&``#MT````04``.W4```!
+M!@``[R@```$%``#O+````08``/'T```-!0``\?@```T&``#R8````04``/)D
+M```!!@``\QP```$%``#S(````08``/.8``"0!0``\YP``)`&``#SU````04`
+M`//8```!!@``\_P```$%``#T`````08``/9$```!!0``]D@```$&``#X3```
+M`@4``/A0```"!@``^'P```$%``#X@````08``/E0``!_!0``^50``'\&``#[
+M2```LP4``/M,``"S!@``_1```+,%``#]%```LP8``/VL```!!0``_;````$&
+M``#_1````@4``/](```"!@``_X@```(%``#_C````@8``0`````!!0`!``0`
+M``$&``$`6````04``0!<```!!@`!`=0```$%``$!V````08``0((```!!0`!
+M`@P```$&``$"(````04``0(D```!!@`!`C@```$%``$"/````08``0+$```"
+M!0`!`LP```(&``$"T````@4``0+4```"!@`!!)0```$%``$$F````08``05\
+M```>!0`!!8```!X&``$&=```-04``09X```U!@`!!I@``#4%``$&G```-08`
+M`0;$```U!@`!!N0``#H%``$&Z```.@8``0?D```U!0`!!^@``#4&``$("```
+M.@4``0@,```Z!@`!"JP``'<%``$*L```=P8``0L4``!W!0`!"Q@``'<&``$+
+M>```NP4``0M\``"[!@`!"\0``)(%``$+R```D@8``0TP``";!0`!#30``)L&
+M``$-A```,@4``0V(```R!@`!#L````$%``$.Q````08``15L``"?!0`!%70`
+M`)\&``$5<```(`4``15X```@!@`!%8@``&P%``$5C```;`8``1?P```!!0`!
+M%_0```$&``$9P```U04``1G$``#5!@`!&QP``*,%``$9T```HP8``1GX``#5
+M!0`!&?P``-4&``$:X```HP4``1KD``"C!@`!&Q0``-4%``$;&```U08``1G(
+M``"C!0`!&R0``*,&``$AL```Q@4``2&T``#&!@`!(C0``,8%``$B.```Q@8`
+M`2,```#&!0`!(P0``,8&``$C4```FP4``2-4``";!@`!)'```!\%``$D=```
+M'P8``23<``!,!0`!).```$P&``$E/````@4``25````"!@`!*@0```(%``$J
+M"````@8``2H,```"!@`!*N@``$`%``$J[```0`8``2KX``#`!0`!*OP``,`&
+M``$K#```>@4``2L0``!Z!@`!*T```,`%``$K1```P`8``2M4``!Z!0`!*U@`
+M`'H&``$KD```'P4``2N4```?!@`!*Z@``,`&``$KM```>@4``2NX``!Z!@`!
+M++```,8%``$LM```Q@8``2T4``!<!0`!+1@``%P&``$M0```7`4``2U$``!<
+M!@`!+9P``%P%``$MH```7`8``2W@``!<!0`!+>0``%P&``$N!```7`4``2X(
+M``!<!@`!+Q@``)D%``$N)```F08``2Y(``!<!0`!+DP``%P&``$N:```7`4`
+M`2YL``!<!@`!+M```%P%``$NU```7`8``2\H``!<!0`!+RP``%P&``$MU```
+MF04``2](``"9!@`!+VP``%P%``$O<```7`8``2^\```!!0`!+\````$&``$P
+M*```7`4``3`L``!<!@`!,'P``,`%``$P@```P`8``3",``!Z!0`!,)```'H&
+M``$WV````04``3>@```!!0`!,TP```$%``$PH````04``3"D```!!@`!,-``
+M`%P%``$PU```7`8``3$T``!<!@`!,9```,`%``$QE```P`8``3&D``!Z!0`!
+M,:@``'H&``$QN````04``3&\```!!@`!,?@```$%``$Q_````08``3((``#`
+M!0`!,@P``,`&``$R&```>@4``3(<``!Z!@`!,H0``,8%``$RB```Q@8``3,L
+M```!!0`!,S````$&``$S4````04``3-4```!!@`!,V````$%``$S9````08`
+M`3/4```!!0`!,]@```$&``$SY````04``3/H```!!@`!-#````$%``$T-```
+M`08``31````!!0`!-$0```$&``$TN```7`4``32\``!<!@`!--P``%P%``$T
+MX```7`8``34```!<!0`!-00``%P&``$U)```7`8``384```!!0`!-A@```$&
+M``$V/````04``39````!!@`!-F```,8%``$V9```Q@8``3?$```!!0`!-\@`
+M``$&``$X&````04``3@<```!!@`!."@```$%``$X+````08``3AP```!!0`!
+M.'0```$&``$X@````04``3B$```!!@`!.@@``&8%``$Z#```9@8``3I<``!S
+M!0`!.F```',&``$ZC```&04``3J0```9!@`!.J@``*P%``$ZK```K`8``3JT
+M``!!!0`!.K@``$$&``$ZP```I`4``3K$``"D!@`!.LP``)P%``$ZT```G`8`
+M`3K8```_!0`!.MP``#\&``$ZY```P04``3KH``#!!@`!.O```$,%``$Z]```
+M0P8``3K\``!J!0`!.P```&H&``$["```L`4``3L,``"P!@`!.Q0``,H%``$[
+M&```R@8``3L@``"E!0`!.R0``*4&``$[+```N@4``3LP``"Z!@`!/=P``!0%
+M``$]$```%`4``3LX```4!0`!.SP``!0&``$[6```204``3M<``!)!@`!/+@`
+M`!(%``$\O```$@8``3SL```H!0`!//```"@&``$]2```%`4``3U,```4!@`!
+M/9```!0%``$]E```%`8``3W````4!0`!/<0``!0&``$_3```%`4``3WL```4
+M!@`!/B```!0%``$^)```%`8``3ZH```"!0`!/JP```(&``$^M````@4``3ZX
+M```"!@`!/Q```,0%``$_%```Q`8``3]D``"C!0`!/V@``*,&``$_=```*`4`
+M`3]X```H!@`!/YP``*,%``$_H```HP8``3_(```4!0`!/\P``!0&``$__```
+MH04``4````"A!@`!0$P``,D%``%`5```R08``4!8``"]!0`!0%P``+T&``%`
+M@```E@4``4"$``"6!@`!0)````$%``%`E````08``4"D```!!0`!0+0```$&
+M``%`Y```2P4``4#H``!+!@`!06```'\%``%!9```?P8``4;D``!W!0`!1N@`
+M`'<&``%(,```#P4``4@T```/!@`!2<P```\%``%)T```#P8``4L$```!!0`!
+M2QP```$&``%+,````04``4LT```!!@`!2T@```$%``%+3````08``4Q8``"(
+M!0`!3#P``(@%``%,7```B`8``4S(``!Q!0`!3,P``'$&``%-;```"04``4UP
+M```)!@`!3=0``,<%``%-V```QP8``4WH```N!0`!3>P``"X&``%-^```204`
+M`4W\``!)!@`!3P0```(%``%/"````@8``4_$``"C!0`!3\@``*,&``%/Z```
+M`@4``4_L```"!@`!4+0``*,%``%0N```HP8``5#X``"/!0`!4/P``(\&``%3
+M9```-`4``5-,```T!0`!4V@``#0&``%3G```J04``5.@``"I!@`!5"@``%8%
+M``%4+```5@8``50\``",!0`!5!0``(P%``%40```C`8``510``"K!0`!5%0`
+M`*L&``%4]```%P4``53X```7!@`!5C```&,%``%6-```8P8``59,```A!0`!
+M5E```"$&``%69```-@4``59H```V!@`!5X0``*,%``%7C```HP8``5>P``"C
+M!0`!5[@``*,&``%@M```HP4``5?,``"C!@`!6`P``*,%``%8$```HP8``5C0
+M```P!0`!6-0``#`&``%9=```4@4``5EX``!2!@`!6>@``&<%``%9[```9P8`
+M`5GX```L!0`!6?P``"P&``%:%```(P4``5H8```C!@`!6M0``"<%``%:V```
+M)P8``5KP```=!0`!6O0``!T&``%;#```*@4``5L0```J!@`!6X```"L%``%;
+MA```*P8``5N<``"U!0`!6Z```+4&``%<!````04``5P(```!!@`!7#```,H%
+M``%<-```R@8``5Q,```!!0`!7%````$&``%<B````04``5R,```!!@`!7*``
+M`,H%``%<I```R@8``5R\```!!0`!7,````$&``%>:```HP4``5YL``"C!@`!
+M7I0``*,%``%>F```HP8``5[\``!?!0`!7P```%\&``%@P```HP4``6#$``"C
+M!@`!8@P```(%``%B$````@8``6(8``"C!0`!8AP``*,&``%B]````@4``6+X
+M```"!@`!8P```*,%``%C!```HP8``6.L```"!0`!8[````(&``%CN```HP4`
+M`6.\``"C!@`!9-```%$%``%DU```408``64$```"!0`!90@```(&``%EF```
+M'@4``640```>!0`!910``!X&``%EI```'@4``66H```>!@`!9=```!X%``%E
+MU```'@8``69L```"!0`!9G````(&``%H<````@4``6AT```"!@`!:,```$4%
+M``%HR```108``6CX```"!0`!:/P```(&``%IK```HP4``6FP``"C!@`!:=``
+M``(%``%IU````@8``6G<``"C!0`!:>```*,&``%J?````@4``6J$```"!@`!
+M:HP``*,%``%JD```HP8``6M<```"!0`!:V0```(&``%K;```HP4``6MP``"C
+M!@`!;$0```(%``%L2````@8``6RD``!%!0`!;*@``$4&``%LV```104``6S<
+M``!%!@`!;4````(%``%M1````@8``6U0``"C!0`!;50``*,&``%N(````@4`
+M`6XD```"!@`!;EP``$4%``%N9```108``6\$```"!0`!;P@```(&``%O%```
+MHP4``6\8``"C!@`!<;@``)L%``%QO```FP8``7(8```!!0`!<AP```$&``%S
+MT````04``7/4```!!@`!=9P```$%``%UH````08``77(``"S!0`!=<P``+,&
+M``%U[````04``77P```!!@`!=B0```$%``%V*````08``79L```!!0`!=G``
+M``$&``%W[```LP4``7?P``"S!@`!>"```$T%``%X)```308``7@\``!-!0`!
+M>$```$T&``%X:````@4``7AP```"!@`!>(````(%``%XA````@8``7BH```"
+M!0`!>*P```(&``%XV```<P4``7C<``!S!@`!>0@``',%``%Y#```<P8``7DP
+M```!!0`!>30```$&``%Y/````04``7E````!!@`!>4@```$%``%Y3````08`
+M`7E4```!!0`!>5@```$&``%Y8````04``7ED```!!@`!>6P```$%``%Y<```
+M`08``7EX```!!0`!>7P```$&``%YA````04``7F(```!!@`!>>P```(%``%Y
+M\````@8``7GX``"C!0`!>?P``*,&``%ZU````@4``7K8```"!@`!>N```*,%
+M``%ZY```HP8``7N,```"!0`!>Y````(&``%[F```HP4``7N<``"C!@`!?6@`
+M`!X%``%];```'@8``7X$```>!0`!?D@``!X&``%^Q```'@4``7[(```>!@`!
+M?T```!X%``%_1```'@8``7^T```>!0`!?[@``!X&``&`6````@4``8!<```"
+M!@`!@DP```(%``&"4````@8``8)\```"!0`!@H````(&``&"N````@4``8*\
+M```"!@`!@O@```(%``&"_````@8``8,\``!%!0`!@T```$4&``&$6```104`
+M`81<``!%!@`!A)@``$4%``&$G```108``84@``!%!0`!A20``$4&``&%H```
+M104``86D``!%!@`!AB@```(%``&&+````@8``8:(``!%!0`!AHP``$4&``&&
+MI```104``8:H``!%!@`!AQ@```(%``&''````@8``8<D``"C!0`!AR@``*,&
+M``&'U````@4``8?<```"!@`!A^@``*,%``&'[```HP8``8BH```"!0`!B+``
+M``(&``&(N```HP4``8B\``"C!@`!B7@```(%``&)@````@8``8F,``"C!0`!
+MB9```*,&``&*6````@4``8I<```"!@`!BF@``*,%``&*;```HP8``8UP```!
+M!0`!C70```$&``&-H```?P4``8VD``!_!@`!CC````$%``&.-````08``8ZT
+M```!!0`!CK@```$&``&/-````04``8\X```!!@`!C[P```$%``&/P````08`
+M`9`4```!!0`!D!@```$&``&0B````04``9",```!!@`!D30```$%``&1.```
+M`08``9'<```!!0`!D>````$&``&1S````04``9(@```!!@`!E#@```$%``&4
+M/````08``9?@``!-!0`!E^0``$T&``&7_```304``9@```!-!@`!F<P```$%
+M``&9T````08``9GT```!!0`!F?@```$&``&:S````04``9K0```!!@`!FV0`
+M``$%``&;:````08``9OH```!!0`!F^P```$&``&<?```<P4``9R```!S!@`!
+MG*P``',%``&<L```<P8``9S<```!!0`!G.````$&``&<Z````04``9SL```!
+M!@`!G/0```$%``&<^````08``9T````!!0`!G00```$&``&=#````04``9T0
+M```!!@`!G1@```$%``&='````08``9TD```!!0`!G2@```$&``&=,```%04`
+M`9TT```5!@```,@```$"````S````0(```#0```!`@```-0```$"````V```
+M`0(```#<```!`@```.````$"````Y````0(```#H```!`@```.P```$"````
+M\````0(```#T```!`@```/@```$"````_````0(```$````!`@```00```$"
+M```!"````0(```$,```!`@```1````$"```!%````0(```$8```!`@```1P`
+M``$"```!(````0(```$D```!`@```2@```$"```!+````0(```$P```!`@``
+M`30```$"```!.````0(```$\```!`@```4````$"```!1````0(```%(```!
+M`@```4P```$"```!4````0(```(X```U`@```CP``$L"```"0```P@(```)$
+M```\`@```D@``"D"```"3```>0(```)0``!H`@```E0``)<"```"6```8@(`
+M``)<```Q`@```F```%L"```"9```,@(```)H``"+`@```FP``+@"```"<```
+M4@(```)T``")`@```G@``'X"```"?```U0(```*```#.`@```H0``&D"```"
+MB```2`(```*,``"=`@```I```!H"```"E```MP(```*8``"Q`@```IP``$X"
+M```"H```N0(```*D```X`@```J@``*@"```"K```B@(```*P``"'`@```K0`
+M``P"```"N```O`(```*\``!'`@```L```'P"```"Q```P`(```+(``!Z`@``
+M`LP``%<"```"T```H@(```+4``"&`@```M@```L"```"W```6@(```+@```(
+M`@```N0``%@"```"Z```IP(```+L``!D`@```O```(`"```"]```)0(```+X
+M``":`@```OP``%T"```#````90(```,$``"4`@```P@``"\"```##```J@(`
+M``,0``"N`@```Q0``)$"```#&```T@(```,<```K`@```R```'`"```#)```
+M8`(```,H``#&`@```RP``"X"```#,```4P(```,T``#(`@```S@``%X"```#
+M/```<@(```-````G`@```T0``"T"```#2```'0(```-,```F`@```U```"0"
+M```#5```@0(```-8```J`@```UP``$H"```#8```(@(```-D```A`@```V@`
+M`!$"```#;```0@(```-P``"%`@```W0``#T"```#>```G@(```-\``#%`@``
+M`X```'4"```#A```KP(```.(``!5`@```XP``-`"```#D```C@(```.4``!V
+M`@```Y@``!8"```#G```PP(```.@```^`@```Z0``'<"```#J```;P(```.L
+M``""`@```[```,P"```#N```E`(```.\```O`@```\```*H"```#Q```K@(`
+M``/(``"1`@```\P``-,"```#U````0(``!2P```!`@``%+0```$"```4N```
+M`0(``!2\```!`@``%,````$"```4Q````0(``!4@```!`@``%20```$"```5
+M*````0(``!4L```!`@``%3````$"```5-````0(``!4X```!`@``%3P```$"
+M```50````0(``!5$```!`@``%4@```$"```53````0(``!50```!`@``%50`
+M``$"```56````0(``!5<```!`@``%6````$"```59````0(``!5H```!`@``
+M%6P```$"```5<````0(``!5T```!`@``%7@```$"```5?````0(``!6````!
+M`@``%80```$"```5B````0(``!6,```!`@``%9````$"```5F````0(``!6<
+M```!`@``%:````$"```5I````0(``!6H```!`@``%<@```$"```5S````0(`
+M`!70```!`@``%=0```$"```5V````0(``!7<```!`@``%>````$"```5Y```
+M`0(``!7H```!`@``%>P```$"```5\````0(``!7T```!`@``%?@```$"```5
+M_````0(``!8````!`@``%@0```$"```6"````0(``!8,```!`@``%A````$"
+M```6%````0(``!88```!`@``%AP```$"```6(````0(``!8D```!`@``%B@`
+M``$"```6+````0(``!8P```!`@``%C0```$"```AT````0(``"'4```!`@``
+M(=@```$"```AW````0(``"'@```!`@``(>0```$"```AZ````0(``#=@```!
+M`@``-V0```$"```W:````0(``#=L```!`@``-W````$"```W=````0(``#=X
+M```!`@``-WP```$"``!#B````0(``$.,```!`@``0Y````$"``!#E````0(`
+M`$.8```!`@``0YP```$"``!#H````0(````,```"`@```!````("````%```
+*`@(````8```"`@``
+`
+end
diff --git a/sys/contrib/dev/ath/public/ap43.inc b/sys/contrib/dev/ath/public/ap43.inc
new file mode 100644
index 0000000..83782d1
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap43.inc
@@ -0,0 +1,69 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/mipsisa32-be-elf.inc#1 $
+#
+
+#
+# Configuration for building big-endian MIPS2 for the AP43/AP48 SoC
+# using the 5.01 linux-mips.org toolchain (manually moved to
+# /pub/gnu from /pub/gnu/local where rpm --prefix=/pub/gnu
+# bogusly installs them).
+#
+
+#
+# http://www.linux-mips.org/toolchain.html
+#
+# /pub/gnu/bin/mips-linux-gcc -v
+# Reading specs from /pub/gnu/bin/../lib/gcc-lib/mips-linux/2.96-mips3264-000710/specs
+# gcc version 2.96-mips3264-000710
+# /pub/gnu/bin/mips-linux-as -v
+# GNU assembler version 2.12.90.0.7 (mips-linux) using BFD version 2.12.90.0.7 20020423
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/mips-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -G 0 -EB -mno-abicalls -fno-pic -mips32 -Wa,--trap \
+ -fno-strict-aliasing -fno-common -fomit-frame-pointer -mlong-calls
diff --git a/sys/contrib/dev/ath/public/ap43.opt_ah.h b/sys/contrib/dev/ath/public/ap43.opt_ah.h
new file mode 100644
index 0000000..9ed8787
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap43.opt_ah.h
@@ -0,0 +1,4 @@
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_AR5312 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
diff --git a/sys/contrib/dev/ath/public/ap51.hal.o.uu b/sys/contrib/dev/ath/public/ap51.hal.o.uu
new file mode 100644
index 0000000..50f3b13
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap51.hal.o.uu
@@ -0,0 +1,3404 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/COPYRIGHT#1 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`0`````````````!``@````!`````````````@H\8``0`0`T````
+M```H`!$`#N#_/_P```````````````````````!__P`````PA/__)`,`6#P"
+M```0@P!A)$(`A"B"`%D00``E)`(1!RB"`!P00``3)`(`4BB"`!H00`!5/`(`
+M`"B"`!,00``))`(`$RB"`!$00`!)/`(``"0"``<0@@!"``````/@``@``!`E
+M$((`1P`````#X``(```0)1""`$$\`@``*((`4Q!```8D`P`</`(``!"#`$$D
+M0@"8`^``"```$"4D`@!7$((`-0`````#X``(```0)1""`"P\`@``*((1"!!`
+M`!0D`P"1/`(``!"#`#(D0@!P*((`DA!```HD`A`4*((`B!!``"P``!`E*((`
+MAA1``"@`````/`(```/@``@D0@!<$((`(``````#X``(```0)20"$1,0@@`<
+M/`(``"B"$1000``&-`/P$R0"$1(0@@`/``````/@``@``!`E/`(``!"#`!0D
+M0@`T-`/Q&SP"```0@P`0)$(`(`/@``@``!`E/`(```/@``@D0@``/`(```/@
+M``@D0@`0/`(```/@``@D0@!(/`(```/@``@D0@"L```0)0/@``@`````)[W_
+MZ*^_`!`PA/__.(,6C"QC``$X@J<G+$(``0!B&"448``$,*7__R0#$+<4@P`%
+M```0)3P"```D0@```$#X"0"@("6/OP`0`^``"">]`!@GO?_@K[\`&#"$__\H
+M@@"($$``&H^H`#`H@@"&$$``*CP"```H@@`=$$``""0"`%(H@@`:$$``*20"
+M`!,0@@`H```8)1```"TD`@`!$((`'2B"`%(40``H```8)2B"`%D00``F)`(`
+M`2B"`%<40``B/`(``!```!4D0@``)`(1$Q""`!<H@A$4$$``"#0"\!,D`@"1
+M$((`"R0"$!00@@`/```8)1```!4D`@`!$((`##0"_QD0@@`)```8)1````\D
+M`@`!/`(``"1"````0/@)KZ@`$!````H`0!@E)`0`$SP"```D0@```$#X":^H
+M`!`0```#`$`8)20"``&M`@``$&``$`!@$"648@'(I&(`")1B`<JD8@`*C&(!
+MS*QB`!R48@'0I&(`()1B`=*D8@`BE&(!U*1B`"248@'6I&(`)@!@$"6/OP`8
+M`^``"">]`""LA0'8`^``""0"``$GO?^PK[\`2*^W`$2OM@!`K[4`/*^T`#BO
+MLP`TK[(`,*^Q`"ROL``H`("H)0"@D"4`P*`E`."8)0``B"4F0L``+%80`">P
+M`"`\`@``)%<``!+``!0`````CJ(`%`!2$"&,0@``KZ(`().C`""2`@`!``(2
+M``!B&"62`@`"``(4``!B&"62`@`#``(6``!B&"4`=!@D$',`#R0"``$0```'
+M`````(ZB`!0`4A`AC$(```*"$"004P`')`(``0+@^`DD!``*)C$``2HB`^@4
+M0/_@```0)8^_`$B/MP!$C[8`0(^U`#R/M``XC[,`-(^R`#"/L0`LC[``*`/@
+M``@GO0!0```P)1"@``@``!@E``,00#"#``$`0Q@E),8``0#%$"L40/_Z``0@
+M0@/@``@`8!`ECZD`$##G__\`!Q!``$<0(0`"$(``11`AE$@`)A$``(P``!`E
+M``<00`!'$"$``A"``$40(9!#`"4D`@`"$&(`(BAB``,00``%)`(``Q!@``H`
+M`!`E`^``"#!"__\08@!9``@0P"0"``008@!F/`,08A```'8``!`E$2``""0$
+M`,``!Q!``$<0(0`"$(``11`AD$,`*20"`&``0R`+``8PP"0"`^APPA`"`$@`
+M&P``$!(5```"```````'``T`@A`A$```8B1"``J,@A(T$$``+`````"40@`"
+M,$*``!!``!$`"!$`/`,08C1C3=,`0P`9```0$``"(8(`!C#``,00(21"`!4`
+M1``;```0$A2```(```````<`#0`"$0`0``!+)$(`D(R$$C00@``6``@0@)2"
+M``(P0D``$$``$3P#$&(`"!#`-&--TP!#`!D``!`0``(A@@`&,,``Q!`A)$(`
+M%0!$`!L``!`2%(```@``````!P`-``(0P!```#0D0@!(``@0@#P#$&(T8TW3
+M`$,`&0``$!```B&"``8PP`#$$"$D0@`5`$0`&P``$!(4@``"```````'``T`
+M`A"`$```(R1"`"0\`Q!B-&--TP!#`!D``!`0``(A@@`&,,``Q!`A)$(`%0!$
+M`!L``!`2%(```@``````!P`-``(0@!```!,D0@`6``@0@#1C3=,`0P`9```0
+M$``"(8(`!C#``,00(21"`!4`1``;```0$A2```(```````<`#0`"$(`M!`/H
+M)$,`O21"`%P`9!`+,$+__P/@``@`````E*,``C!C`"`48``3)`(``I2C``(P
+M8P#0)`0`P!!D``XD`@`#E*,``C!C`-`D!`#0$&0`"20"``24HP`",&,`$!1@
+M``4D`@`!E*,``C!C"``D`@`%``,0"@/@``@`````)[W_X*^_`!BOL0`4K[``
+M$`"`."4`P(@E,B(`@!!```D`H(`E)`,)M!(#`(8D`@`.+@()M!!``'PF`_:9
+M$```/SP"9F8R(@$`$$``-#P"```D0@```$#X"0#@("400``A,B(!0"8"[+,L
+M0@`Q$$``'3(B`4``$!"``%`0(0`".$`\!,S,-(3,S0($`!D``!`0``(0@@`"
+M&(``8A@A)@7__CP"__\T0C\-`.(P(0#$`!D``"`0$&4`"0`$,((\`O__-$(_
+M"`#B,"$\`LS,-$+,S0#"`!D``!`0``(P@A```%D`P!`E+@03B0`"(`HF`O!@
+M/`/,S#1CS,T`0P`9```0$!2``%```A"")@+L>`!#`!D``!`0$```2P`"$((D
+M`PFT$@,`2"0"``XN`@FT$$``"BX#$X@F`_:9/`)F9C1"9F<`8@`8```0$``"
+M$$,``Q_#$```/`!#$",F`NQX/`3,S#2$S,T`1``9```0$!!@`#4``A""/`(`
+M`"1"````0/@)`.`@)1!``"$N`Q,E)@+LLRQ"`#$00``>)@+P8``0$(``4!`A
+M``(X0#P$S,PTA,S-`@0`&0``$!```A""``(8@`!B&"$F!?_^/`+__S1"/PT`
+MXC`A`,0`&0``(!`090`)``0P@CP"__\T0C\(`.(P(3P"S,PT0LS-`,(`&0``
+M$!```C""$```#P#`$"4F`O!@/`3,S#2$S,T`1``9```0$!!@``@``A"")@+V
+M,#P#S,PT8\S-`$,`&0``$!```A$")$(`#X^_`!B/L0`4C[``$`/@``@GO0`@
+M)[W_Z*^_`!2OL``0`*"`)8R%$C00H``*/`(``"1"````0/@)`````#P#```D
+M8P"\`$,0(9!"```0```$<@(0`CP"``"00@"^<@(0`H^_`!2/L``0`^``"">]
+M`!@GO?_HK[\`%*^P`!``H(`EC(42-!"@``\\`@``)$(```!`^`D`````/`,`
+M`"1C`+P`0Q`AD$,```(#`!L``!`2%&```@``````!P`-$```"8^_`!0\`@``
+MD$,`O@(#`!L``!`2%&```@``````!P`-C[\`%(^P`!`#X``()[T`&">]_\"O
+MOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`*"8)9)B
+M``040``U`("P)0``D"4F8P`$)`0`_P!R$"&@1```)E(``2I"`"`40/_\`'(0
+M(8YB```80``I``"0)29T``0\`@``)%4``"0>``$F=P`&`!*`0`(2@"$`$("`
+M)@,`(`)C&"&09``(D'$`"P*$$"&@4@``D&(`"0!$$"4"@A`AH%(``*^@`!`"
+MP"`E`F`H)20&``X"H/@)`B`X)280`"@"D!@AI&(``*^^`!`"P"`E`F`H)20&
+M``X"H/@)`B`X)0+P@"&F`@``)E(``8YB```"0A`J%$#_WP`2@$"/OP`\C[X`
+M.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`LH@`C
+M$$``EB2(`>`\`@``)$(`R``%&(``8A@AC&(```!```@`````E((""*SB```#
+MX``(```0)0/@``@D`@`-`^``""0"``V-`@````(1PCA"``$#X``(,$(``0/@
+M``@D`@`-`^``""0"``V5`@`*K.(```/@``@``!`EE0(`"*SB```#X``(```0
+M)8T#```P8T``)`(`#0/@``@``Q`+C0,``#!C@``D`@`-`^``"``#$`J-`P``
+M/`(@``!B&"0D`@`-`^``"``#$`N-`P``/`(0``!B&"0D`@`-`^``"``#$`N-
+M`P``/`((``!B&"0D`@`-`^``"``#$`N,@@'XK.(```/@``@``!`E)`(``1#"
+M``L`````$,``4@``$"4D`@`"$,(`"@`````D`@`#$,(`"P`````#X``()`(`
+M#82"`?RLX@```^``"```$"64@@'^K.(```/@``@``!`EC(("`*SB```#X``(
+M```0)8T#```P8R``)`(`#0/@``@``Q`+C0,``#!C$``D`@`-`^``"``#$`L#
+MX``()`(`#8T#```\`@"``&(8)"0"``T#X``(``,0"XT#```P8P0`)`(`#0/@
+M``@``Q`+C0,``#!C`@`D`@`-`^``"``#$`LD`@`!$,(`#``````0P``&)`(`
+M#20"``(0P@`+``````/@``@D`@`-C0,``#!C`0`#X``(``,0"XR#$DPD`@`-
+M`^``"``#$`N4@A)(K.(```/@``@``!`E`^``""0"``V,@Q)H)`(`#0/@``@`
+M`Q`+C0(`%*SB```#X``(```0)20"``P#X``(`````"0"`!D0H@`3CZ,`$"RB
+M`!H00``&)`(`'B0"``\0H@`')`(``Q```!P`````$*(`%P`````0```8````
+M`!3"`!8LX@`%$$``%"0"``$#X``(K(<"`"0"``$0P@`&``<0*R0"``(0P@`&
+M`````!````H`````K((23`/@``@D`@`!I(<22`/@``@D`@`!K(<2:`/@``@D
+M`@`!$&```P`````D`@`,K&(```/@``@``!`E)[W_Z`#`2"4LX@`(%$``+0``
+M:"4GJ@`0``T0@`!%$"&42```E$P``@`(%```3!`EK2(``"4I``0DY__\`2!8
+M)24"P``L0A``$$``$"4I``2,@@`4`$@0(8Q"``"OH@`0DZ,`$)%"``$``A(`
+M`&(8)9%"``(``A0``&(8)9%"``,``A8`$```!`!B$"6,@@`4`$@0(8Q"``"M
+M8@``)0@`!"3G__P!B!@K+.(`!#A"``$``Q`+%$#_X2SB``@00/_6):T``0$F
+M$",#X``()[T`&">]_^BOOP`4K[``$(^C`"@D`@`-$*(`%H^P`"PHH@`.$$``
+M!0`````0H``+`````!```"L``!`E)`(`'1"B`!4D@A)0)`(`'A"B`!<``!`E
+M$```)(^_`!0D@@'(K&(``"0"`!"N`@``$```'20"``$\`@``)$(.O`#`*"6,
+M9@```$#X"8X'``"N`@``$```%"0"``&L8@``)`(`&*X"```0```/)`(``13@
+M``<`````)`(`!*X"``",8P``C(("!!````:L8@``)`,`!!3C``0``!`EC,(`
+M`*R"`@0D`@`!C[\`%(^P`!`#X``()[T`&(RC``008`!G```0)8S"``"LH@``
+MC,(`!*RB``B,P@`(K*(`#(S"``RLH@`0C,0`$"0"__\0@@`%+(,!`"0"`/\`
+M@Q`+$````ZRB`!0D`@`"K*(`%(S#`!0D`O__$&(`$@!@("4L@P0!)`($``!#
+M(`HD`@`!K*(`&`!$$"L00``,`````(RB`!@``A!`-$(``:RB`!@`1!`K%$#_
+M^@`````0```$C,,`&(S"`!2LH@`8C,,`&"0"__\08@`2`&`@)2R#!`$D`@0`
+M`$,@"B0"``&LH@`<`$00*Q!```P`````C*(`'``"$$`T0@`!K*(`'`!$$"L4
+M0/_Z`````!````24P@`<)`(#_ZRB`!R4P@`<$$``""0"``J4PP`<+&(`$!1`
+M``(`````)`,`#Q````*DHP`@I*(`()3"`!X00``()`(`"I3#`!XL8@`0%$``
+M`@`````D`P`/$````J2C`"*DH@`BC,(`(*RB`"2,P@`DK*(`*(S"`"BLH@`L
+MC,(`+*RB`#",PP`$)`(`!!1B``4D`@`!C*,`!!1B``(`````K*,`.`/@``@`
+M````C,,`!!!@`!X``!`EC,(`#*RB``B,P@``K*(``(S"``BLH@`$C,(`#*RB
+M``B,P@`0K*(`#(S"`!2LH@`0C,(`&*RB`!2,P@`<K*(`&)3"`""DH@`<E,(`
+M(J2B`!Z,P@`DK*(`((S"`"BLH@`DC,(`+*RB`"B,P@`PK*(`+"0"``$#X``(
+M`````">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)3P"```D0@```$#X"0"@@"4`
+M0(@E$B``'(^_`!R&(@`6%$``$SP"```D0@```D`@)0!`^`D"`"@E`$"`)8Y"
+M`<`"0"`E`$#X"0(@*"4\`P``)&,!5``0@$`"`X`AE@,```!B&"$``QP`$```
+M!@`#%`.6(@`6EB,`&`!#$"$``A0```(4`X^_`!R/L@`8C[$`%(^P`!`#X``(
+M)[T`(">]_\"OOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!RO
+ML``8`("@)0``\"6OH``0``"X):^@`!2.@A(P$$``0```D"4\`@``)%8!5``2
+M$8`"@H`AA@("1@1!`#0F$0(P`H`@)3P#```D8P```&#X"0(@*"4`0*@ECH(!
+MP`*`("4`0/@)`B`H)0`5&$``=A@AE@0"1I1S````DR`A`$00(0`"%````AP#
+ME@(",C!"`0`00``.`'<0*A!``!P"@"`E`&"X)8Z"`<``0/@)`B`H)98#`D8`
+M8A@A`F,8(P`#'````QP#$```$:^C`!0`?A`J$$``#@*`("4`8/`ECH(!P`!`
+M^`D"("@E`!4@0`"6("&6(P`6`&(8(92"````0Q`C``(4```"%`.OH@`0)E(`
+M`8Z"$C`"0A`K%$#_Q0`2$8```)`E`!(1@`*"@"&&`@)&!$$`#B81`C".@@'`
+M`H`@)0!`^`D"("@EE@,",C!C`0"/I0`4`$4@(8^E`!``11`A.&,```"#$`NF
+M(@`8)E(``2I"`$`40/_KC[\`/(^^`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R
+M`""/L0`<C[``&`/@``@GO0!`````````````````,*7__S#&__^4@@``+$(P
+M`CP#```40``#)&@!D#P"```D2`&H```@)20*`&0\"5'K-2F%'P`$$$``2!`A
+ME$(```%"&",`90`8<$8`````$!(`20`8```8$``#&4,``A?#`&(8(Z3C```D
+MA``!*((`"Q1`__`DYP`"`^``"``````PI?__)`,`_Q"C`!,D`@#_E(,``"QC
+M,`,`!1"``$40(21"$L`08``,,$+__RRC`#\`!1"``$40(21"%2(08``&,$+_
+M_P`%$(``11`A``(00"1"$^PP0O__`^``"``````PI?__)`,`_Q"C``DD`@#_
+ME((``"Q",`,DHPE@%$```S!C__\DH@C\,$/__P!@$"4#X``(`````">]_]"O
+MOP`LK[0`**^S`"2OL@`@K[$`'*^P`!@`H)`EED(``"Q"0``40``'`("@)99"
+M`"X00``$`````)9#`!808`".)`(``99"```L0C`#%$``'203`0$D$P%0ED(!
+M=A!``'0``(@E)E```@)@*"4F8@`!,%/__XZ"`:`"@"`E`$#X"2>F`!`00`!\
+M`!$80`!P("&7H@`0``(2`J2"`6``@!@EDZ(`$:1B`6(F,0`"ED(!=@(B$"H4
+M0/_M`F`H)1```%R60@%VCH(!H`*`("4D!0$``$#X"2>F`!`00`!G`H`@)9>B
+M`!```AI"ID,!8@`"$((P0@!_ID(!9)>B`!```A%`,$(`?Z9"`68"8"@E)F(`
+M`3!3__^.@@&@`$#X"2>F`!`00`!5EZ,`$``#(L*60@%F`$00):9"`68``QD"
+M,&,`?Z9#`6B7H@`0``(0P#!"`'^F0@%J`F`H)29B``$P4___CH(!H`*`("4`
+M0/@))Z8`$!!``$&7HP`0``,C0I9"`6H`1!`EID(!:@`#&8(P8P!_ID,!;)>B
+M`!```A!`,$(`?Z9"`6X"8"@E)F(``3!3__^.@@&@`H`@)0!`^`DGI@`0$$``
+M+9>C`!```R/"ED(!;@!$$"6F0@%N``,2`C!"`'^F0@%P``,80C!C`'^F0P%R
+MEZ(`$``"$8`P0@!_ID(!=(Z"`:`"@"`E`F`H)0!`^`DGI@`0$$``&)>C`!``
+M`QJ"ED(!=`!#$"6F0@%TED(!=A!``!```(@E)E,``CP"```D5!7``!&`0"80
+M`6`"<(`A`D`@)0*`^`F6!0``I@(``"8Q``&60@%V`B(0*A1`__8`$8!`)`(`
+M`8^_`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@GO0`P)[W_X*^_`!ROL@`8
+MK[$`%*^P`!``P(`EE+$`%`"@D"4D!``5`!$00"1"``,``A""<B08`@!B("$\
+M`@``)$(```!`^`D`!""``$`8)1!@`#2/OP`<K@,````1$$`D0@`#``(0@@`"
+M$(``8A`AK@(`"*81``02(``H```P)20'`%0D"0`$)`@``XX$````!A!``$0@
+M(8X#``APQR@"`*,8(0!2$"&40@``I&(``*2"`````"`E<,<H`HX"``@`HA`A
+M``08@`!D&"$``QB``$,0(:1$``2.`@`(`*(0(0!#$"&D0``&)(0``2B"``04
+M0/_R<,<8`HX"``@`8A`AI$D`!HX"``@`8A@A),8``0#1$"H40/_=I&@`0B0"
+M``&/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_X`*!@)96"`!:DP@`&-`+>
+MK:>B``"GH@`"```@)93%``8``#@E`.40!S!"``$80``'*(,``A!@`*(``!`E
+M``000`.B$"&D1P``)(0``23G``$HX@`$%$#_\P````"5@@`4I,(`!#!#__\0
+M8`"5```0)93"``000`"1``!()20*`%0D"P`$)`4`&G$E$`(`3"@A)*@`&(S#
+M``AQ*B`"`(,8(92B`!BD8@``C,(`"`""("&4H@`JI((``@``."5Q*B`"C,(`
+M"`""$"$`!QB``&<8(0`#&(``0Q`AI$``!B3G``$HX@`$%$#_]I>C``(T`MZM
+M%&(`'G$J*`*7IP````<@@`"'("$`!""`<2H0`@!$("&,P@`(`((@(:2+``:5
+M`@`"I((`")4#``8`0Q`AI((`"I4#``H`0Q`AI((`#)4#``X`0Q`AI((`#I4"
+M``2D@@`0E0(`"*2"`!*5`@`,I((`%)4"`!`0``!0I((`%HS$``@`I"`AEZ,`
+M```#$(``0Q`A``(0@`""("&5`@`"I((`"(S$``@`I"`AEZ,``@`#$(``0Q`A
+M``(0@`""("$D`@`4I((`"(S$``@`I"`AEZ,``@`#$(``0Q`A``(0@`!$$"$D
+M`P`CI$,`"HS$``@`I"`AEZ,``@`#$(``0Q`A``(0@`!$$"$D`P`_I$,`#)>G
+M````!Q"``$<0(0`"$(``HB`AC,(`"`""("$DA``$I(L``I2"``25`P`&`$,0
+M(:2"``:5`P`*`$,0(:2"``B5`P`.`$,0(:2"``J5`@`$I((`#)4"``BD@@`.
+ME0(`#*2"`!"5`@`0I((`$I>G``(`!Q"``$<0(0`"$(``HB`AC,(`"`""("$D
+MA``$)`(``Z2"``*5`@`4I((`#)4"`!:D@@`.E0(`&*2"`!`E*0`!E,(`!`$B
+M$"H40/]T)`4`&B0"``$#X``()[T`"">]_HBOOP%TK[X!<*^W`6ROM@%HK[4!
+M9*^T`6"OLP%<K[(!6*^Q`52OL`%0`("@):^E`7PD$P%0KZ`!3"0"``&/HP%,
+M$&(`,0``D"4H8@`"$$``!20"``(08``'CZ,!?!```1T``!`E$&(`/X^C`7P0
+M``!3```0)91B`!800`$0*D(`"A!``%$GI``H/!4```)@*"4F<P`!CH(!H`*`
+M("4`0/@))Z8!2!!``0N3I0%)$*``12:Q%<`"(/@)CZ0!?``2&$`GL``0`@,8
+M(:1B``"7H@%(``(J`A"@`#LF4@`!`B#X"8^D`7P`$AA``@,8(:1B```F4@`!
+M*D(`"A1`_^0GI``H$```,CP"``"/HP%\E&(`&A!``.HD90`$``"`)20&`/\G
+MI``0`!`00"1"`5``HA@AE&(``!!&``4`$A!``((0(91C``"D0P``)E(``280
+M``$J`@`#%$#_]``0$$`0```:)Z0`*)1B`!P00`#4)&4`!@``@"4D!@#_)Z0`
+M$``0$$`D0@%(`*(8(91B```01@`%`!(00`""$"&48P``I$,``"92``$F$``!
+M*@(``Q1`__0`$!!`$```!">D`"@0``#&C[\!=">D`"@\`@``)$(```!`^`DD
+M!0$<I[(`/!I``)@``(`E)[8`*"05`!HGO@`L)[<`+B>Q`"H`$!!``L(@(2>C
+M`!``8A@AE&(``*2"``!R%1`"`%8@(91B``"D@@`8`F`H)29S``&.@@&@`H`@
+M)0!`^`DGI@%($$``IG(5(`(`GB@ADZ,!29>B`4@``A!`,$(!``!B&".DHP`8
+M`)8@(9>B`4@``AH"``(3P@`"$@``8A@CI(,`(`)@*"4F<P`!CH(!H`*`("4`
+M0/@))Z8!2!!``)!R%2`"`)XH(9.C`4F7H@%(``(00#!"`0``8A@CI*,`(`"6
+M("&7H@%(``(:`@`"$\(``A(``&(8(Z2#`"@"8"@E)G,``8Z"`:`"@"`E`$#X
+M"2>F`4@00`!Z<A48`@!W("&7H@%(,$(`'Z2"`!@D8P`@`B,@(9>B`4@``A%"
+M,$(`'Z2"```"XQ@AEZ(!2``"$H(P0@`?I&(```)@*"4F<P`!CH(!H`*`("4`
+M0/@))Z8!2!!``&-R%2`")(0`*`/$*"&3HP%)EZ(!2``"$$`P0@$``&(8(Z2C
+M```"Y"`AEZ(!2``"&@(``A/"``(2``!B&".D@P```F`H)29S``&.@@&@`H`@
+M)0!`^`DGI@%($$``3'(5*`(GI@`H`*8@(9.C`4F7H@%(``(00#!"`0``8A@C
+MI(,`,(^C`7R48@``+$)``Q1```QR%2`")*(`*`(B&"$`PA`AE$(``*1B````
+ML1@AEZ(!2``"$@(P0@`_$```"Z1B`!@`D2@AEZ(!2``"&@(``A/"``(2``!B
+M&".DHP`H`*`@)20"``&D@@`8)A```0(2$"H40/]P`!`00(^B`4P``C!`CZ,!
+M?`##$"&40@!HIZ(`/H^B`4P`PC`A``8P@`!F,"$"@"`E)Z4`*#P#```D8QCT
+M`&#X"23&#6000``4CZ,!?(^B`4P``C!``,(P(0`&,(``9C`A`H`@)2>E`"@\
+M`P``)&,:*`!@^`DDQ@UD$$``"(^_`72/H@%,)$(``:^B`4PH0@`#%$#^VR0"
+M``&/OP%TC[X!<(^W`6R/M@%HC[4!9(^T`6"/LP%<C[(!6(^Q`52/L`%0`^``
+M"">]`7@GO?_@K[\`'*^R`!BOL0`4K[``$`"@D"4``(`E/`(``"11````$!!`
+M`%`0(0`"$(`"0A`AC$0-9!"```,``````B#X":Q`#60F$``!*@(``Q1`__2/
+MOP`<C[(`&(^Q`!2/L``0`^``"">]`"``@$@E,*7__Z4E`!25)``6``!`)3""
+M``$D`P`!.$(```!B0`L`!!!",$(``1!```(E`@`!,$C__P`$$((P0@`!$$``
+M`B4"``$P2/__``00PC!"``$00``")0(``3!(__\0H``3```X)20+`&8E*@`"
+M``<80`!F$"&41````2,8(:1D``!PZQ`")$(`&`$B&"&D9````4(0(:1(```D
+MX@`!,$?__P#E$"L40/_R``<80`/@``@`````)[W_J*^_`%2OO@!0K[<`3*^V
+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
+M__^4H@`4$$``.```."4D#@!F)9``!"6-``8EB@`()!D`!"08``$D#P`%``<8
+M0`"C$"&41````8,8(:1D``!P[A`")$(`&`&"&"&D9````@(0(:1+`````$`E
+M```@)7#N,`(`!!!``$00(0`"$,``1A`A)$,`&`&C$"&D1````(D0!S!"``$0
+M0``'`4,8(24"``$P2/__%1@`":1Y```0```'I&\````$$$``1!`A``(0P`!&
+M$"$`2A`AI$``&"2"``$P1/__+((`!!1`_^8`!!!`).(``3!'__^4H@`4`.(0
+M*Q1`_](`!QA`C[````/@``@GO0`()[W_Z*^S`!2OL@`0K[$`#*^P``@`H)`E
+M`,"()30"WJVGH@``IZ(``J>B``2GH@`&``#()98D`!8``&@E)`4``P"M&",`
+M9!`',$(``1!```0`&1!``Z(0(:1#```G.0`!):(``3!-__\MH@`$%$#_]0"M
+M&".60@`4IB(`%#!"__\00`!(``!P)203`&9QTQ`"`D(8(21X`!@`41`AE&,`
+M&*1#`!@3(``Y``!H)20"`&9QPH`")P\`!``-($`#I!`AE$(````"&$``8A@A
+M``,8P`(#&"$`<1@A`(\0(81"``@``A"`I&(`+`'D("&4@@``I&(`(B0(``&4
+M8@`@`0(0*Q!``!TD;``>)8L`!B<*``0EB0`$``@H0`"K."$`X#`E``@@@`"-
+M("$`!"!``(H0(81#`#```QA`E,(`!@!#$"&DX@`(`24P(0"I*"$`BB`AE*/_
+M_I2"``@`8A@AI,,``"4"``$P2/__E8(``@$"$"L40/_I``@H0"6B``$P3?__
+M`;D0*Q1`_\T`#2!`)<(``3!.__^6(@`4`<(0*Q1`_[QQTQ`")`(``8^S`!2/
+ML@`0C[$`#(^P``@#X``()[T`&">]_\"OOP`XK[4`-*^T`#"OLP`LK[(`**^Q
+M`"2OL``@`("@)0"@F"4D`@`$IZ(`&"0"``:GH@`:)`(`":>B`!PD`@`,IZ(`
+M'@``J"4\`@``)$(```!`^`DD!`04`$"`)1(``(H"H!`EEF(`%A!``"R6<@#0
+M/`(``"1"```"`"`E`$#X"20%!!268@!HI@(`%B0"``JOH@`0KZ``%#P"```D
+M0B,@`H`@)0)@*"4"`#`E`$#X"0)`."400`!N`````"9Q#6268@!HIF(->CP"
+M```D0BG4`B`@)0!`^`D"`"@E/`(``"1"*S`"@"`E`@`H)0!`^`D"(#`E$$``
+M7@````"6`@`:``(00`!=$"&40P`6E@(`%'!#(`(`DI`A)E(`!99B`!H00``L
+M/`(``"1"```"`"`E`$#X"20%!!268@!JI@(`%B0"``2OH@`0)`(``:^B`!0\
+M`@``)$(C(`*`("4"8"@E`@`P)0!`^`D"0#@E$$``0``````F<1%XEF(`:J9B
+M$8X\`@``)$(IU`(@("4`0/@)`@`H)3P"```D0BLP`H`@)0(`*"4`0/@)`B`P
+M)1!``#``````E@(`&@`"$$``71`AE$,`%I8"`!1P0R`"`)*0(292``*68@`<
+M$$``)#P"```D0@```@`@)0!`^`DD!004EF(`;*8"`!8D`@`$KZ(`$"0"``*O
+MH@`4/`(``"1"(R`"@"`E`F`H)0(`,"4`0/@)`D`X)1!``!(`````)G$5C)9B
+M`&RF8A6B/`(``"1"*=0"("`E`$#X"0(`*"4\`@``)$(K,`*`("4"`"@E`$#X
+M"0(@,"400``"`````"05``$2```$/`(``"1"````0/@)`@`@)0*@$"6/OP`X
+MC[4`-(^T`#"/LP`LC[(`*(^Q`"2/L``@`^``"">]`$`GO?_`K[\`/*^^`#BO
+MMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"@D"660@``+$)``!1`
+M``H`@)@EED,`+B0"``$48@`&/`(``"1"'/0`0/@)`````!```+Z/OP`\ED(`
+M`"Q"4``40``+``"X)99#`"XD`@`"%&(`!SP"```D0BSP`F`@)0!`^`D"0"@E
+M$```L(^_`#R60P``+&,P`R0$`0`D`@%0`$"()20"``$2X@`0`(.("RKB``(0
+M0``%)`(``A+@``<F,0`%$```H```$"42X@`.```0)1```)V/OP`\EE4!=B90
+M`7@0```.)E8!8I9"`!H00`"1)C$`-Y95`X`F4`0^$```!R96`XB60@`<$$``
+MBB8Q`$:650.`)E`#HB96`X(2H`"%``"@)3P"```D7A5``!000`!6$"&40@``
+MI@(```(@*"4F,0`!CF(!H`)@("4`0/@))Z8`$!!``'R/OP`\EZ(`$``"$H*F
+M`@`$EZ(`$``"$0(P0@`_I@(``I>B`!```A"`,$(`/Z8"`!X"("@E)C$``8YB
+M`:`"8"`E`$#X"2>F`!`00`!HEZ,`$``#&X*6`@`>`$,0):8"`!Z7H@`0``(2
+M`C!"`#^F`@`@EZ(`$``"$((P0@`_I@(`(I>B`!```A$`,$(`/Z8"`"0"("@E
+M)C$``8YB`:`"8"`E`$#X"2>F`!`00`!0EZ,`$``#&P*6`@`D`$,0):8"`"27
+MH@`0``(1@C!"`#^F`@`FEZ(`$#!"`#^F`@`H`B`H)28Q``&.8@&@`F`@)0!`
+M^`DGI@`0$$``/H^_`#R7H@`0``(2@J8"`"J7H@`0``(1`C!"`#^F`@`LEZ(`
+M$``"$(`P0@`_I@(`+@(@*"4F,0`!CF(!H`)@("4`0/@))Z8`$!!``"J7HP`0
+M``,;@I8"`"X`0Q`EI@(`+I>B`!```A(",$(`/Z8"`#"7H@`0``(0@C!"`#^F
+M`@`R`D`@)98%``*6!@`$`\#X"28'``B6`@`&$$``#@``("4F!0`&)`8`,@`$
+M$$`D0@`8`*(0(81#``!P9A@"I$,``"2$``&6`@`&`((0*A1`__<`!!!`)I0`
+M`0*5$"H40/]_)A``-";W``$JX@`#%$#_4R0"``&/OP`\C[X`.(^W`#2/M@`P
+MC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?_`K[\`/*^^`#BO
+MMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"`N"4`H)`E``"H)99"
+M```L0D``%$``!"0$`0"60@`D$```!B11_ZN60@``+$(P`R0#`5``8(@E`(*(
+M"R0"``$2H@`.*J(``A!```@D`@`")C$`5206``@F4`3<$J``%B93!-H0``!Z
+M```0)1*B``L``!`E$```=X^_`#R60@`:$$``;P`````F,0!E)!8``B90!4X0
+M```()E,%3)9"`!P00`!G`````"8Q`&DD%@`#)E`%+B93!2RF8```$L``8```
+MH"4\`@``)%X6(`(@*"4F,0`!CN(!H`+@("4`0/@))Z8`$!!``%N/OP`\ED(`
+M`"Q",`,40``$EZ(`$``"$@(0```#I@(`"``"$D*F`@`(E@4`"!"@`$8`````
+M%J``!P)`("4\`P``)&,5P`!@^`D"0"`E$```!*8"``@#P/@)E@4`"*8"``B6
+M0@``+$(P`Q1```F7H@`0``(0@C!"`#^F`@`&EZ(`$``"$0`P0@`_$```"*8"
+M``0``A#",$(`/Z8"``:7H@`0``(0P#!"`#^F`@`$`B`H)28Q``&.X@&@`N`@
+M)0!`^`DGI@`0$$``*8^_`#R60@``+$(P`Q1```V7HP`0``,;`I8"``0`0Q`E
+MI@(`!)>B`!```A&",$(`/Z8"``*7H@`0,$(`/Q````VF`@````,;0I8"``0`
+M0Q`EI@(`!)>B`!```A'",$(`/Z8"``*7H@`0``(00C!"`#^F`@``EF(``"1"
+M``&F8@``)I0``0*6$"H40/^D)A``"B:U``$JH@`#%$#_<"0"``&/OP`\C[X`
+M.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?_`
+MK[\`/*^^`#BOMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"`H"4`
+MH/`EE\(``"Q"0``40``$)]$%9)?2`"00```')E(`&I?"```L0C`#)`0!;R0#
+M`;\`8)`E`(*0"Y?"`0000`#JKZ``%(^C`!0``Q!``%X0(91"`0840``()D0`
+M")?"```L0C`#)D,`!P"`D"4`8I`+$```U28Q`$"7P@``+$(P`Q1``"\"0"@E
+M``"8)292``&.@@&@`H`@)0!`^`DGI@`0$$``T@`3&,``<1@AEZ(`$``"$@*D
+M8@``DZ(`$:1B``@F<P`"*F(`"!1`__`"0"@E``"8)0)`*"4F4@`!CH(!H`*`
+M("4`0/@))Z8`$!!``+\`$R#``)$@(9>C`!```Q(",$(`/Z2"``(``Q.",$(`
+M`:R"``27H@`0,$(`/Z2"``H``QF",&,``29S``(J8@`(%$#_Z*R#``P0``"`
+M``"8)292``&.@@&@`H`@)0!`^`DGI@`0$$``I0*`("67H@`0``(:0J8C````
+M`A"",$(`?Z8B``B7H@`0``(10#!"`'^F(@`0`D`H)292``&.@@&@`$#X"2>F
+M`!`00`"4EZ,`$``#(L*6(@`0`$00):8B`!```QD",&,`?Z8C`!B7H@`0``(0
+MP#!"`'^F(@`@`D`H)292``&.@@&@`H`@)0!`^`DGI@`0$$``@9>C`!```R-"
+MEB(`(`!$$"6F(@`@``,9@C!C`'^F(P`HEZ(`$``"$$`P0@!_IB(`,`)`*"4F
+M4@`!CH(!H`*`("4`0/@))Z8`$!!``&Z7HP`0``,CPI8B`#``1!`EIB(`,``#
+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
+M*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``BL`%!A``'4@(9>B`!```A("I((`
+M.`!S&"&3H@`1I&(`0`(`*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``AP`%!A`
+M`'$@(9>B`!```A("I((`2@"`&"63H@`1I&(`4`(`*"4F$``!CD(!H`)`("4`
+M0/@))Z8`$!!``@T"D1@AEZ(`$``"$@*@8@!9`!000"1"`%@"8B`ADZ,`$3!B
+M`(`00``#I(,``#1B_P"D@@```@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`!
+M^0`4($``D2@AEZ,`$``#$4(P0@#_I*(`8B2$`&@")!`A``,80C!C``^D0P``
+M`J0@(9>B`!`P0@`!I((``)8B```L0D``%$``#@`````2@``%EZ(`$!*7``<`
+M````$```"98B`````A-",$(``1````2F(@`F``(30C!"``&F(@`HEB(``"Q"
+M,`,40``M`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`!SY>C`!``%!!``%40
+M(0`#&8(P8P!_I$,`L"0"``$2@@`+*H(``A!```4`````$H``%P`````0```9
+MEB(``!*7``L`````$```%98B``"7H@`0,$(`!Z8B`/R7H@`0``(0PC!"``<0
+M```,IB(!`)>B`!`P0@`'IB(`_I>B`!```A#",$(`!Q````2F(@$"EZ(`$#!"
+M`#^F(@`2EB(``"Q",`040``L`!000``4&$``<Q@AEZ(`$``"$T*D8@"X`@`H
+M)280``&.0@&@`D`@)0!`^`DGI@`0$$`!F0`4($`DA`"X`F0@(9>C`!```QC`
+M,&,`.)2"````0Q`E%I<`":2"``"7HP`0``,0PJ(B`"*6(@``+$)`!A1```(`
+M`Q+"IB(`+!:``!$`````EB(``"Q"0``40`#QEZ,`$``#$@(P0@`_IB(!1@`#
+M&,(P8P`?$```!J8C`4H`4Q`A)`,`"J1#`+@D`@`/HB(`(I8B```L0D``%$``
+MX20"``$2@@`+*H(``A!```4`````$H``H0`````0``#:)I0``1*7`"4"`"@E
+M$```UB:4``$"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`%>`B`@)0+`^`F3
+MI0`1IB(!5)>E`!`"("`E`L#X"0`%*@*F(@%6CD(!H`)`("4"`"@E`$#X"2>F
+M`!`00`%/`B`@)0+`^`F3I0`1IB(!6)8B```L0D`!%$``MY>B`!```A(",$(`
+M/Q```+.F(@#$)A```8Y"`:`"0"`E`$#X"2>F`!`00`$]`B`@)0+`^`F3I0`1
+MIB(!3I>E`!`"("`E`L#X"0`%*@*F(@%0`@`H)280``&.0@&@`D`@)0!`^`DG
+MI@`0$$`!+0(`*"67H@`0,$(`?Z8B`!"7H@`0``(1PC!"`#^F(@`4)A```8Y"
+M`:`"0"`E`$#X"2>F`!`00`$?`B`@)0+`^`F3I0`1IB(!4I8B```L0D`!%$``
+M!0(`*"67H@`0``(2`C!"`#^F(@#&)A```8Y"`:`"0"`E`$#X"2>F`!`00`$.
+MC[\`/)>B`!```A%",$(`/Z8B`4B7H@`0,$(`'Z8B`4R6(@``+$)``A1``'$"
+M`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`#\C[\`/).B`!&F(@`JEB(``"Q"
+M4``40`!DEZ,`$``#$@(P0@!_IB(`U@`#&\*F(P#:`@`H)280``&.0@&@`D`@
+M)0!`^`DGI@`0$$``Z)>C`!`P8P`?``,80)8B`-H`0Q`EIB(`VI>C`!```Q%"
+M,$(`/Z8B`.(``QK"HB,`W8Y"`:`"0"`E`@`H)0!`^`DGI@`0$$``UX^_`#R3
+MH@`1,$(`!P`"$4"2(P#=`&(8):(C`-V7H@`0``(0PA```#NB(@#?EB(``"Q"
+M0`$40``W`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$``PH^_`#R7H@`0,$(`
+M/Z8B`,*6(@``+$)0`!1``"F7HP`0``,1@C!"`'^F(@#4``,;0J8C`-@"`"@E
+M)A```8Y"`:`"0"`E`$#X"2>F`!`00`"MEZ,`$#!C``<``QC`EB(`V`!#$"6F
+M(@#8EZ,`$``#$,(P0@`_IB(`X``#&D*B(P#<CD(!H`)`("4"`"@E`$#X"2>F
+M`!`00`"<C[\`/).B`!$P0@`!``(1P)(C`-P`8A@EHB,`W)>B`!```A!"HB(`
+MWB:4``$J@@`#%$#]F``4$("6(@``+$(P`Q!``!TD`@`$CD(!H`)`("4D!0#L
+M`$#X"2>F`!`00`"#`D`@)9>B`!`P0@`'IB(`_)>B`!```A#",$(`!Z8B`0".
+M0@&@)`4`[0!`^`DGI@`0$$``=X^_`#R7H@`0,$(`!Z8B`/Z7H@`0``(0PC!"
+M``>F(@$")`(`!*8B`6`D`@`!IB(!7J8B`5RF(`%:C]``%)8B`0000``6``"@
+M)28S``8"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`!<`!080`!S("&7H@`0
+M``(2`J2"`0``@!@EDZ(`$:1B`0(FE``"EB(!!`*"$"H40/_N`@`H)98B```L
+M0E`#%$``&P```````*`E)C,`!HY"`:`"0"`E`@`H)0!`^`DGI@`0$$``0Y>C
+M`!``%!"``%,0(:1#`XB.0@&@`D`@)28%``4`0/@))Z8`$!!``#F7HP`0`!00
+M@`!3$"&D0P.*)I0``2J"``440/_I)A```98B```L0C`#$$``"B0"_\JF(@!<
+M)`+__Z8B`%ZF(@!@)`(`#Z8B`$0D`@`<IB(`1J8B`$B6(@``+$)``!1```D"
+M0"`ECD(!H"0%`,H`0/@))Z8`$!1```F/OP`\$```&X^^`#B.0@&@)`4`SP!`
+M^`DGI@`0$$``%(^_`#R7H@`0IB(`&)8B`!840``.)`(``98B```L0D``%$``
+M!@````"6(@`8``(2PC!"``$0```$IB(`%I8B`!@``A/"IB(`%B0"``&/OP`\
+MC[X`.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`G
+MO?_@K[\`&*^Q`!2OL``0`("`)3P"```D0CH<`$#X"0"@B"400``7`@`@)3P"
+M```D0A98`$#X"0(@*"400``1`@`@)3P"```D0B^@`$#X"0(@*"400``+`@`@
+M)3P"```D0C,D`$#X"0(@*"400``%`@`@)3P"```D0C70`$#X"0(@*"6/OP`8
+MC[$`%(^P`!`#X``()[T`(">]_^BOOP`0`*`8)91B```L0D``%$``"8^_`!"4
+M8P`N)`(``11B``4\`@``)$(A_`!`^`D`````C[\`$`/@``@GO0`8````````
+M````````E(,``)2B```48@`'`````)2"``(P1,'PE*(``C!"P?`0```#`((@
+M(Y2$````@B`C`^``"`"`$"64@@((`^``"#!"O_\``"@E``40P`!$$"&,0P``
+MC$(`!`!B&"448``&```0)22E``$HH@`"%$#_]@`````D`@`!`^``"``````G
+MO?_HK[\`$#P"```D0DEH`$#X"0``````0"@E,**``!!``!$``"`E,*5__SP"
+M```D1AJ(``00@`!$$"$``A"``$80(91#```090`3)`(``22$``$L@@"#%$#_
+M]@`````0```-```0)3P"```D1A$H``010`!&$"&40P``$&4`!B0"``$DA``!
+M+((`2Q1`__D`!!%````0)8^_`!`#X``()[T`&">]_^BOOP`4K[``$#"P__\2
+M```E)`(``3P"```D0DEH`$#X"0``````0"@E,*.``#P"__\T0G__`*(0)`("
+M$"848``9+$(``3BB`?\L0@`!+*,``0!#$"440``3)`(``0``("4\`@``)$8:
+MB``$$(``1!`A``(0@`!&&"&48@``%@(`!`````"48P`"$&4`!B0"``$DA``!
+M+((`@Q1`__0`!!"````0)8^_`!2/L``0`^``"">]`!@GO?_@K[\`'*^R`!BO
+ML0`4K[``$`"@B"6,@@&<`$#X"0#`D"4`0(`E,@(`0A!```<R`@`@CB(`"!1`
+M``0R`@`@)`+_O0("@"0R`@`@$$``!S("``B.(@`,%$``!#("``@D`O_?`@*`
+M)#("``@00``',@(``8XB``040``$,@(``20"__<"`H`D,@(``1!```<\`@``
+M)$))=`!`^`DF1``@$$```B0"__X"`H`D`@`0)8^_`!R/L@`8C[$`%(^P`!`#
+MX``()[T`(">]_V"OOP"<K[(`F*^Q`)2OL`"0`("0)0``B"4\`@``)$),Z`!`
+M^`DPI/__`$"`)1(```\\`@``)$).?`)`("4"`"@E-`;_?P!`^`DGIP`0$$``
+M!SP"```D0DL,`D`@)0(`*"4`0/@))Z8`$`!`B"4"(!`EC[\`G(^R`)B/L0"4
+MC[``D`/@``@GO0"@)[W_Z*^_`!2OL``0/`(``"1"26@`0/@)`("`)0!`&"4D
+M`@`2$&(`%"0"``$H8@`3$$``!0`````08``*```0)1````Z/OP`4)`(!_Q!B
+M``4T`H-*%&(`!R0"``$0```'C[\`%)8$`@HD`P-*$(,``B0"``$``!`EC[\`
+M%(^P`!`#X``()[T`&#"$__\``"@E/`(``"1&&H@`!1"``$40(0`"$(``1A`A
+ME$,``!!D``4`````)*4``2RB`(,40/_V```0)0/@``@`````)[W_X*^_`!BO
+ML0`4/`(``"1"26@`0/@)K[``$`!`B"4R(H``$$``!S(P?_\\`@``)$),Z`!`
+M^`D"`"`E%$``$@(`$"4``"`E/`(``"1%$2@`!!E``&40(91"```440`%`&40
+M(91#`!@48``'`&`0)20$`$LDA``!+((`2Q1`__4`!!E````0)8^_`!B/L0`4
+MC[``$`/@``@GO0`@)[W_Z*^_`!``H#@E```8)3P"```D1B3(/`(``"1(````
+M`Q'``$8H(92B```41``()&,``1#@``0D8___`.`@)0$`^`DD!@"`$```!20"
+M``$L8@`Q%$#_\P`#$<```!`EC[\`$`/@``@GO0`8```H)3P"```4@``#)$81
+M*`/@``@``!`E``410`!&$"&40P``$&0`!B0"``$DI0`!+*(`2Q1`__@`````
+M```0)0/@``@`````)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`DK[0`(*^S`!RO
+ML@`8K[$`%*^P`!``@/`E`*"H)0#@L"4PU___``"`)0``B"4``)@EEJ(``!1`
+M`!L``*`E/`(``"1"26@`0/@)``````!`D"4R0H``%$``$3P"```D0DW(`D`@
+M)0!`^`D``"@E%$``#@)`("4\`@``)$).-`!`^`D"0"`E$$```P`````0```&
+M`D`@)1````26I``"$````I:D``*6I``",(+_`!1``$<\`@`````P)0``."4\
+M`@``)$41*``&$4``11@AE&(``!1$``,``````&"8)20'``$DQ@`!+,(`2RSC
+M``$`0Q`D%$#_]0`&$4`0X`!)```0)3+B`(`40``$``"`)99D``(0```#CG$`
+M")9D``2.<0`,```P)0``."4\`@``)$D`3#P"```D2`!0``80P`!&$"$``AB`
+M`&DH(92B```41``'`&@0(8_#`=B,0@``%&(``P``````H*`E)`<``23&``$L
+MP@`"+.,``0!#$"040/_O``80P!#@`!`RX@"`%$``"```$"6.@P`(`@*`)`(C
+MB"2.@P`,`@*`)1````<"(X@ECH,`$`("@"0"(X@DCH,`%`("@"4"(X@E/`(`
+M`"1"3<@`0/@)`L`H)1!``!*/OP`TCL(`$([#`!2.9``0CF4`%`!$$"0`91@D
+MKL(`$*[#`!26H@`",$+_``(P&"4L0@`!``,0"A!```,D`@`!KM$`&(^_`#2/
+MO@`PC[<`+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`.``$
+M-\,`!C:"`(8P(0`&,8,`!A&``((@(R0"```D`P`!``0^@`3A``0``````(-`
+M!!````<``$@E$.``!`""0`0`!#@C`.,X!@$'0"4`@T@$`0`0)0$@&"4`!C#`
+M`,4P(8S$``",Q0`$`$00)`!E&"0`8A`E`^``"``"$"LPYP#_$.``%P"`&"40
+MH``/```@)9!B```01P`2`````!!```H`````)(0``0"%$"L00``&`&00(9!"
+M```01P`)`````!1`__@`````$(4`!0!D$"&@1P``C,(``"1"``&LP@```^``
+M"``````GO?Y@K[\!G*^^`9BOMP&4K[8!D*^U`8ROM`&(K[,!A*^R`8"OL0%\
+MK[`!>`"`\"6OI0&DKZ8!J*^G`:R/L@'$E[`!OI>B`<*OH@%8)`,;6*^C`6`G
+MQ0(PKZ4!9#P"```D0DFP`$#X"0``B"400`&@C[\!G#P"```D0DTL`$#X"0/`
+M("6GP@(*,$+__Q1```L\`@``/`(``"1"2E0#P"`E`$#X"0(`*"400`&1C[\!
+MG#("/_^GP@(*/`(``"1"7[``0/@)`\`@)3P"```D0DSH`$#X"9?$`@H`0(`E
+M$@`!@P/`("4\`@``)$).?`(`*"4T!O]_`$#X"2>G`!`00`%[`\`@)3P"```D
+M0DY\`@`H)20&`(``0/@))Z<`D!!``72/OP&<CZ0`&(^E`!PD`@``)`,`!0""
+M$"0`HQ@D`&(0)20&``$`PH@+)`(``"0#``(`@B`D`*,H)`"D("4D`@`"`$2(
+M"X_"`@P2(@`"/`(``*_1`@PD0DL,`\`@)0(`*"4`0/@))Z8`$!9```.OH@%<
+MEA``$*^P`6"/I@&H+,,`020"`$``0S`*KZ8!J(_"`>```CJ",.<``:^G`6P`
+M`A)",$(``:^B`6@\`@``)%<"`#P"```D0@(8`N(0*Q!``0@``*@EEN(``(^H
+M`5@`2!`D$$``_`````"6X@``CZ,!7`!#$"000`#W)Z8!$(_"`9@#P"`EEN4`
+M`@!`^`DGIP$2$$``\"0"``26XP``$&(`)2AB``400``()`(`("0"``$08@`9
+M)`0``A!D`!`\!0``$```Y2;W``008@`I*&(`(1!```8D`@!`)`(`"!!B`!T\
+M`@``$```W";W``008@`H/`8``!```-@F]P`$)[(`$">T`$`DI0=(KZ4!<))"
+M``(0```E-%,``R>R`!`GM``P/`(``"1""HBOH@%P$```'I)3``(GL@"0)[0`
+MX#P"```D0@0HKZ(!<))"``(0```6-%,``2>R`)`GM`#P)$(!B*^B`7"20@`"
+M$```#S13``(GL@"0)[0!`#P"```D0@#HKZ(!<))"``(0```'-%,`!">R`!`G
+MM`!0),8'2*^F`7"20@`"-%,`!#P'```DYTET`.#X"0*`("440`"F````````
+ML"4"P"`E/`@``"4(4.0!`/@)`H`H)1!``)H`%A%`CZ,!<`!B@"&/I`&PCZ4!
+MM(^F`;@\"```)0A18`$`^`F2!P`8EA$``)8"``(`41`K%$``C)>B`1`"(A`K
+M%$``@I>B`1(`41`K%$``?X^E`6R2!``&.(,`"BRB``$``Q`+%$``>8^F`6@X
+M@P`%+,(``0`#$`L40`!TCZ<!8)(#``<"(Q@A``,80R3B``H`0Q`J%$``;8^H
+M`:@"J!`K$$``?(^E`<B.`@`0C@,`%``"'\(LI``!`(,@)!2``&,``!`ECD(`
+M&#!"`(`00``$)`(`!H_#`=P08@!<`````">D`1@\!@``),8```#`^`DD!0!`
+MI[$!&);D``*GI`$:D@,`!B0"``408@`%)`(`"A1B``8T@D``$```!*>B`1J7
+MH@$:-$*``*>B`1J2`@`$HZ(!'9("``6CH@$RCD(`&*^B`32OLP$XC@(`$(X#
+M`!2.1``0CD4`%`!$$"0`91@D`&(0)1!```27H@$:-$("`!````.GH@$:,$+]
+M_Z>B`1J.`@`(C@,`#(Y$``B.10`,`$00)`!E&"0`8A`E$$```R0'``(0```"
+MHZ<!'*.@`1R.`@`(C@,`#(Y$``B.10`,`$00)`!E&"0D!```)`4``@!$$"0`
+M91@D`&(0)1!```.3H@$<-$(`"*.B`1R.0@`8,$(`0!!```0`````DZ(!'#1"
+M``2CH@$<`!41@(^H`60`2!`A)Z,!&">D`5B,90``C&8`!(QG``B,:``,K$4`
+M`*Q&``2L1P`(K$@`#"1C`!`49/_V)$(`$":U``&2`@`'`B(0(3!1__^6`@`"
+M`%$0*Q!`_W:7H@$0)M8``2K"`(`40/]=`````";W``0\`@``/`(``"1"`A@"
+MXA`K%$#^^@`````2H``U+J,`020"`$``0Z@*/`(``"1"6X2/I`%D`J`H)20&
+M`$`\!P```$#X"23G23"OU1(P&J``$P``*"4`!2#`CZ(!I`""("$`!1F`CZ8!
+M9`!F&"&48@``I((``)1B``*D@@`"D&(`!*""``208@`%H((`!22E``$`M1`J
+M%$#_\``%(,"/P@&\`\`@)8^E`:0`0/@)`J`P)1J@``\``"@E``4A@(^G`60`
+MAR`A``48P(^H`:0`:!@AD&(`!J""``:08@`'H((`!R2E``$`M1`J%$#_]``%
+M(8"/H@&LK%4``)?"`@JGP@`8`!40*X^_`9R/O@&8C[<!E(^V`9"/M0&,C[0!
+MB(^S`82/L@&`C[$!?(^P`7@#X``()[T!H)2B``*,AA(T$,``$3!(P?"4PP``
+ME*(``!1B``XDAP(PE,,``C!BP?`42``*`````)#"``0P0@`!$$```S!C``(4
+M8``E```0)0/@``@`P!`E)(<",(R$$C`0@``?```0)92E````!!!#``(1@`#B
+M,"&4P@```*(0(Q1``!``````E,,``C!BP?`42``)`````)#"``0P0@`!$$``
+M`S!C``(48``-```0)0/@``@`P!`EE,(``C!"P?`!`A`C&$```P`````DQP!`
+M)(3__P`$($,4@/_D```0)0/@``@`````)[W_Z*^_`!2OL``0/`(``"1"````
+M0/@)`,"`)1!```D`````@$(`&@`"$$`"`A`C``(6```"%@,H0P``$````@`#
+M$`L``!`EC[\`%(^P`!`#X``()[T`&">]_]BOOP`@K[,`'*^R`!BOL0`4K[``
+M$`"`B"4`H)@EEB(""A1``"4D$`#_/`(``"1226@"0/@)`````#!"`/`D`P!@
+M$$,`!@`````"0/@)`B`@)20#`9D40P`9/`(``)9B``(P0@"@)`,`H!!#`"8D
+M$`#AEF(``C!"`-`D`P#`$$,`(200`.*68@`",$(`T"0#`-`00P`<)!``Y)9B
+M``(P0@%0)`0`X"0#`.,X0@%0`&"`)1```!0`@H`+/`(``"1"```"("`E`$#X
+M"0)@*"400``-)`,`P(Q0`""68@`",$(`P!1#``D"`!`E,@,`#R0"``$48@`%
+M`@`0)20"__`"`H`D-A```@(`$"6/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@G
+MO0`H)[W_Z*^_`!`\`@``)$(```!`^`D``````$`8)1!@``0``!`EC&(`'``"
+M$((P0@`!C[\`$`/@``@GO0`8)[W_T*^_`"ROM@`HK[4`)*^T`""OLP`<K[(`
+M&*^Q`!2OL``0`,"@)0#@L"4`@*@E)+/__Q)@`!L"M)`A`K(0*Q!``!4"0(@E
+M`C2`(P(`("4"P/@)`B`H)1A```\``````B`@)0*`*"62`P``D((``*("```F
+M$``!H(,``"2E__\4H/_Y)(0``0(TB","L1`K%$#_[0`````F<___%F#_YP)4
+MD"&/OP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`P)[W_
+MV*^_`""OL0`<K[``&`"`@"4"`(@EC@(!H"0%`,$`0/@))Z8`$!!``!:7HP`0
+M+&-``"0&`,\D!0#*CB(!H`(@("4`PR@+`$#X"2>F`!(00``-C[\`()>B`!`L
+M0D``%$``!9>B`!(``A+",$(``1````.N`A(\``(3PJX"$CR.`A(\C[\`((^Q
+M`!R/L``8`^``"">]`"@GO?_HK[\`%*^P`!`\`@``)$)):`!`^`D`@(`E`$`8
+M)20"`$@08@`P/`(``"AB`$D00``/-`*!C2AB`$(00``()`(`0RAB`$`00``G
+M/`(``!!@`!H``!`E$```*H^_`!008@`@`````!```"4``!`E`$,0*A1```TT
+M`H&/-`*!B`!B$"H00``8/`(``"AB`$T00``;```0)2AB`$H40``7/`(``!``
+M`!$D0EQ0%&(`$SP"```0```-)$)<4)8#`@HH8@&(%$``#@``$"4H8@&.%$``
+M!3P"```D`@&/%&(`!P`````\`@``)$)<4`!`^`D"`"`E$````X^_`!0``!`E
+MC[\`%(^P`!`#X``()[T`&">]_]BOOP`DK[(`(*^Q`!ROL``8`("0)3"Q__\"
+M0(`EC@(!H"0%`,$`0/@))Z8`$!!``"0\`@`````@)21%`)0\`@``)$8`ECP"
+M```D1P"8/`(``"1(32P`!!!``$00(0`"&$``91`AE$(``!11`!(DA``!)(3_
+M_Y>B`!`L0E`#$$```P!F$"$0```&E$(````$$$``1!`A``(00`!'$"&40@``
+MI@(""`$`^`D"0"`E$```!*8"`@HL@@`.%$#_YP`$$$"/OP`DC[(`((^Q`!R/
+ML``8`^``"">]`"@GO?_8K[\`)*^R`""OL0`<K[``&`"`D"4PL?__`D"`)8X"
+M`:`D!0#!`$#X"2>F`!`00``D/`(`````("4D10`@/`(``"1&`"(\`@``)$<`
+M)#P"```D2$TL``000`!$$"$``AA``&40(91"```440`2)(0``22$__^7H@`0
+M+$)0`Q!```,`9A`A$```!I1"````!!!``$00(0`"$$``1Q`AE$(``*8"`@@!
+M`/@)`D`@)1````2F`@(*+((`!Q1`_^<`!!!`C[\`)(^R`""/L0`<C[``&`/@
+M``@GO0`H)[W_X*^_`!BOL0`4K[``$`"`@"4\`@``)$)<Z`!`^`D"`(@E$$``
+M$X^_`!B.`@'D,$(``1!```\`````E@4""!"@``8\`@``)$)=^`!`^`D"`"`E
+M$```!X^_`!@\`@``)$)>U`(`("4`0/@)EB4""H^_`!B/L0`4C[``$`/@``@G
+MO0`@````````````````)[W_R#P"DD@T0OP`KZ(`$).C`!`GI0`0D*(``0`"
+M$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``8A@EC((`%*Q#0(`\`B22-$))
+M)*^B`!23HP`4)Z4`%)"B``$``A(``&(8)9"B``(``A0``&(8)9"B``,``A8`
+M`&(8)8R"`!2L0T"`/`(H`#1"`#FOH@`8DZ,`&">E`!B0H@`!``(2``!B&"60
+MH@`"``(4``!B&"60H@`#``(6``!B&"6,@@`4K$-`@#P"4Q8T0@@DKZ(`').C
+M`!PGI0`<D*(``0`"$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``8A@EC((`
+M%*Q#0(`\`N68-$(%>:^B`""3HP`@)Z4`()"B``$``A(``&(8)9"B``(``A0`
+M`&(8)9"B``,``A8``&(8)8R"`!2L0T"`/`(`'31"[_^OH@`DDZ,`)">E`"20
+MH@`!``(2``!B&"60H@`"``(4``!B&"60H@`#``(6``!B&"6,@@`4K$-`@#P"
+M&JHT0KY`KZ(`*).C`"@GI0`HD*(``0`"$@``8A@ED*(``@`"%```8A@ED*(`
+M`P`"%@``8A@EC((`%*Q#0(`\`KX0-$)55*^B`"R3HP`L)Z4`+)"B``$``A(`
+M`&(8)9"B``(``A0``&(8)9"B``,``A8``&(8)8R"`!2L0T"`/`(`#C1",`>O
+MH@`PDZ,`,">E`#"0H@`!``(2``!B&"60H@`"``(4``!B&"60H@`#``(6``!B
+M&"6,@@`4K$-`@*^@`#23HP`T)Z4`-)"B``$``A(``&(8)9"B``(``A0``&(8
+M)9"B``,``A8``&(8)8R"`!2L0T"$`^``"">]`#@GO?_8K[\`((R"`!0T`X``
+M`$,0(20#'!:L0QC0```8)30&@``\!0`!C((`%`!&$"&L11B`)&,``2AB``@4
+M0/_Z`````(R"`!0T`X```$,0(8Q$'```!"8"``09`C"$``\`!"$`/`(``"1"
+M````9"`E`$#X"20%``B/OP`@`^``"">]`"@GO?^(K[\`<`"`8"4!@#@E)`+_
+MR:^B`!"OH@`4KZ(`&*^B`!PD`O_"KZ(`("0"__*OH@`HKZ(`+*^B`#"OH@`T
+M)`+_]*^B`#@D`O_`KZ(`0*^B`$2OH@!(KZ(`3"0"_[JOH@!0)`+_LJ^B`%BO
+MH@!<KZ(`8*^B`&0D`O^PKZ(`:```*"4GJP`0).8`!">J`"@GJ0!`)Z@`6``%
+M&(``9R`A`6,0(8Q"``"L@D8H`&8@(0%#$"&,0@``K()&.`!G("$!(Q`AC$(`
+M`*R"1E``9B`A`0,8(8QB``"L@D9@)*4``2BB``440/_L/`(``"1"```!@"`E
+M`$#X"20%``&/OP!P`^``"">]`'@`!2A``*8H(0`%*$``I"@A`^``")2B%?XG
+MO?_0K[\`**^U`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`@"4`P)`E`."8)8^T
+M`$`PM?__/!$``"8Q```\!0``)*4"(`(@^`DD!A)PKA(`#*X3`!"N%``4IA4!
+MR*8``<HD`@`_I@(!_*X``@"N`"^\K@`OP#P""`"N`B_,)`('@:X"+]2N`"_<
+M/`(`/S1"/S^N`B_@)`(`9*X"+^0D`@`"K@(OZ"0"__^N`B_XK@(O_*X",``F
+M!"P\/`4``"2E%*`"(/@))`8`!J(`,`2/OP`HC[4`)(^T`""/LP`<C[(`&(^Q
+M`!2/L``0`^``"">]`#`PA`#_,*4`_P``,"4\`@``)$D4J#P"```D2!2I/`(`
+M`"1'%*H`!A!``$88(0!I$"&00@``%$0`"0!H$"&00@```*(0*Q1```4`9Q`A
+MD$,```!E&"L08``%)`(``23&``$LP@`$%$#_[P``$"4#X``(`````">]_X"O
+MOP!\K[8`>*^U`'2OM`!PK[,`;*^R`&BOL0!DK[``8`"@D"4`P)@E`."()8^V
+M`)`PD/__/`(``"1"````0/@))`1&J`!`H"46@``$`@`H)20#``(0``'DKL,`
+M`*^Q`!"OM@`4/`(``"1"```"@"`E`D`P)0!`^`D"8#@E`H"8)3P"```D0@``
+M`H`@)0``*"4`0/@))`8``1!``<LD$``#CF(`%(Q"0""OH@!,DZ,`3">D`$R0
+M@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"4P9`#_``01`JYB
+M`<PP8P`/IF,!T#P"```D0F58DF0!SP!`^`F290'1$$`!L200``T\`@``)$(`
+M``)@("4`0/@)```H)1!``:HD$``#CF(`%#0#@```0Q`AC$(8&*9B`=*.8P',
+M)`(`"1!B``<D`@`*%&(`"CP"``"68@'0+$(`!!!```8\`@``/`(``"1"8$``
+M0/@)`F`@)3P"```D0@```$#X"0)@("400`&1)!``#HYB`<PL0@`%%$``'@``
+M``".8@`4C$)`$*^B`%"3HP!0)Z0`4)""``$``A(``&(8)9""``(``A0``&(8
+M)9""``,``A8``&(8)31C$`"OHP!4DZ,`5">D`%20@@`!``(2``!B&"60@@`"
+M``(4``!B&"60@@`#``(6``!B&"6.8@`4K$-`$(YB`!0T`X```$,0(20#``>L
+M0Q@`/`(``"1"````0/@)`F`@):9B`=0P0P#P)`(`,!!B`#DH8@`Q$$``""0"
+M`&`D`@`0$&(`-"0"`"`08@`R`````!````V68@'4$&(`+BAB`&$00``&)`(`
+MH"0"`%`08@`I`````!````268@'4$&(`)0````"68@'4%$``(B0"``6.8P',
+M%&(`!SP"``F.8P'0-$(`0Q1B``,D`@!&$```&:9B`=2.8@',.$,`!RQC``$X
+M0@`++$(``0!B&"408``#)`(`41````^F8@'4CF,!S"0$``H09``))`(`"1!B
+M``@D`@!B%&0`#"0"``F68@'0+$(`!!!```4D`@`*)`(`8J9B`=2.8P',)`(`
+M"A!B`!0D`@`)CF,!S!!B`!$D`@`*%&(`!0````"68@'0+$(`!!1```P\`@``
+MEF,!U#!B`/`D0O_0+$(`0!!```8\`@``,&(`#RQ"``440`$3)!``#3P"```D
+M0@```F`@)20%`,$`0/@))Z8`2!!``0LD$``(EZ(`2"Q",`(40`$')!``!9>B
+M`$BF@A)PCF(`%(Q"0!"OH@!8DZ(`6#!$`!@`!"#")`(``A""``\D`@`#$((`
+M^B00``J.8P',)`(`"1!B``DD`@`*%&(`]`````"68@'0+$(`!!1```0\`@``
+M$```[@`````\`@``)$(```)@("4D!0`_`$#X"2>F`$@00`#F)!``")>B`$BF
+M@A)R/`(``"1"```"8"`E)`4`'`!`^`DGI@!($$``W)>B`$@00``.EZ(`2#!1
+M__``$8L`/`(``"1"```"8"`E)`4`&P!`^`DGI@!($$``T)>B`$@"(H@E$```
+M`B8Q_T`D$0-```"`)1(@``X``)`E/`(``"15```"8"`E)@4`P`*@^`DGI@!(
+M$$``P)>B`$@"0I`F)A```0(1$"L40/_W`F`@)30"__\60@"Y)!``!R0"``JF
+M@A/F)`(``Z:"%?```(`E)`0`-":&``8D`P`+<@0H`@"F$"&D0Q/H)A```2X"
+M``H40/_[<@0H`@``@"4\`@``)$L4D":(``(\`@``)$H4F"0)`#0FAP`,)`4`
+M"R:&``@`$!A``'0@(0!K$"&40@``I((5^`!H("$`:A@AE&(``*2"%?!R"1@"
+M`&<0(:1%%J@`9A@A)A```2X"``,40/_PI&46$#P"```D0@```F`@)0!`^`DF
+MA1)P$$``B"00``B6@A)P+$)0`Q!``!,D!``*CF,!S!!D``DD`@`)$&(`""0"
+M!F@49``,`````)9B`=`L0@`$$$``"``````D`@9HIH(6`"0"!+"F@A8$-`*`
+M`*:"%@BF@A7^EH(2BA!``"$D`P`0EF(!U#!"`/`40P`>/`(``(YB`!0T`X``
+M`$,0(20#0`>L0Q@`/`(``"1"````0/@))`0'T#P"```D0@```$#X"0)@("6F
+M8@'6CF(`%#0#@```0Q`A)`,`!ZQ#&``\`@``)$(```!`^`DD!`?0EF(!UC!"
+M`/`D`P`@%$,`3R00``T\`@``)$(```)@("4D!0"_`$#X"2>F`$@00`!')!``
+M")>B`$BF@A)TIF(""#P"```D0@```$#X"0)@("400``^)`0`"HYC`<P09``*
+M```H)20"``D08@`()!``#11D``8`````EF(!T"Q"``000``"`````"00``T0
+MH``O`````(Z"+,2N8@'`/`(``"1"````0/@)`F`@)0``D"4``(`E)!4`'SP"
+M```D40```F`@)0*P*","(/@))Z8`2!!``!N7H@!(`D*0(0`0&$``="`A``(2
+M`J""+#``@!@EDZ(`2:!B+#$F$``!+@(``Q1`__`"8"`E+D,``3P"``(T0O_]
+M`D(0)BQ"``$`8A@E%&``"B00``D\`@``)$)C2`!`^`D"8"`E$```#`)@$"40
+M```")!``""00``@2@``$/`(``"1"````0/@)`H`@)1+```(``!`EKM```(^_
+M`'R/M@!XC[4`=(^T`'"/LP!LC[(`:(^Q`&2/L`!@`^``"">]`(`GO?_HK[\`
+M%*^P`!`\`@``)$(```!`^`D`@(`EC@(LJ!!```,``````$#X"0(`("4\`@``
+M)$(```!`^`D"`"`E/`(``"1"```"`"`E)`4``0!`^`DD!@`!/`(``"1"```"
+M`"`E`$#X"28%$G`\`@``)$(```!`^`D"`"`EC[\`%(^P`!`#X``()[T`&">]
+M_Z"OOP!8`(!0)30"@`"OH@`0-`*8(*^B`!0\`E55-$)55:^B`"`\`JJJ-$*J
+MJJ^B`"0\`F9F-$)F9J^B`"@\`IF9-$*9F:^B`"P``&`E)[@`$">O`!@GK@!`
+M)ZT`5``,&(`#`Q`AC$0``"2"P``L0A``$$``(@'C*"&-0@`4`$00(8Q"``"O
+MH@!`DZ,`0)'"``$``A(``&(8)9'"``(``A0``&(8)9'"``,``A8`$```%@!B
+M$"6,0@``KZ(`5).D`%21H@`!``(2``""("61H@`"``(4``""("61H@`#``(6
+M``""("6-0@`4C&,```!#$"&L1```$```?R6,``&-0@`4`$00(8Q"``"LH@``
+M``!`)22"P``L21``)Z<`2">F`$0`"!0`%2``%0!(*"6-0@`4`$00(:Q%```1
+M(``?`````(U"`!0`1!`AC$(``*^B`$B3HP!(D.(``0`"$@``8A@ED.(``@`"
+M%```8A@ED.(``P`"%@`0```3`&(8):^E`$23HP!$D,(``0`"$@``8A@ED,(`
+M`@`"%```8A@ED,(``P`"%@``8A@EC4(`%`!$$"$0`/_AK$,``(U"`!0`1!`A
+MC$,``!1E`%,``!`E)0@``2D"`0`40/_3``@4````0"4GJP`@)(+``"Q)$``G
+MIP!0)Z8`3``($(`!8A`A%2``%8Q%``"-0@`4`$00(:Q%```1(``?`````(U"
+M`!0`1!`AC$(``*^B`%"3HP!0D.(``0`"$@``8A@ED.(``@`"%```8A@ED.(`
+M`P`"%@`0```3`&(8):^E`$R3HP!,D,(``0`"$@``8A@ED,(``@`"%```8A@E
+MD,(``P`"%@``8A@EC4(`%`!$$"$0`/_AK$,``(U"`!0`1!`AC$,``!2C`!T`
+M`!`E)0@``2D"``040/_2``@0@``,((`#!!@AC&(``"1"P``L0A``%$#_>@'D
+M$"$`@!@E`P,0(8U$`!2,0@```((@(0'C&"&,8@``K((``"6,``$I@@`"%$#_
+M60`,&(`\`@``)$(```!`^`DD!`!D)`(``8^_`%@#X``()[T`8#"E__\PH@$`
+M$$``!B0"$S.DP@``)`(7U*3B```#X``()`(``3"B`(`00``-`````)2"$HH4
+M0``%)`()")2"$HP00``'`````"0""0BDP@``)`(*K*3B```#X``()`(``0/@
+M``@``!`E)[W_T*^_`"BOLP`DK[(`(*^Q`!ROL``8`("0)0)`F"4"0(@EIZ``
+M$)9"$G`L0E`!%$``!R90`>".0@&@)`4`R0!`^`DGI@`0$$`!/H^_`"B60@'4
+M,$(`\"0#`$`40P`#EZ(`$*9@$H:7H@`0%$``"R0"``>.0P',%&(`""0"``B6
+M0P'0%&(`!20"``6GH@`0)`(``:9B$G:F8A)XCB,!W"0"``808@`0)`)P998C
+M`<H48@`-`````)8C`@@D8O^<+$(``A!```0D`@!!)&(`!1````6F(@((EB,"
+M"!1B``(D`@!#IB(""*X```268A*&$$``!B0"``&N`@`$EF(2=A1```(D`@`#
+MK@(`!)9B$HH00``$`````(X"``0T0@`$K@(`!)9B$HP00``,)`(.$98C`<H0
+M8@`*)`()"(X#``0T8@`(K@(`!)9B$G@40``$)`()"#1B`"BN`@`$)`()"*8"
+M`!"60@'4,$(`\"1"_]`L0@!`%$``%20""<2.1`',.(,`!RQC``$X@@`++$(`
+M`0!B&"448``-)`()Q"0#``H0@P`))`(`"1""``@D`@G$%(,`""0""JR60@'0
+M+$(`!!!```0D`@JL)`()Q!````*F`@`2I@(`$B0"$S.F`@`,)`(7U*8"``Z.
+M`@``/`/__31C__\`0Q`D/`,``0!#$"6N`@``EZ(`$#!"``(40``,```@)8Y#
+M`<PL8@`&$$``!R0"``448@`'``04@)9"`=`L0@`$%$```P`$%(`D!``!``04
+M@(X$````1!`F/`,`!`!#$"0`@B`F/`+_WS1"__\`@B`D/`(`$`""("67H@`0
+M``(00CA"``$P0@`!``(5@`!$$"8\`P!``$,0)`""(":N!```CD(!S"Q"``<4
+M0``%/`/_]SP"``@`@A`E$```!:X"``".`@``-&/__P!#$"2N`@``C@(``#P#
+M@```0Q`E/`-```!#$"6N`@``EB(!T"Q"``(00``%EZ(`$(Y#`<PD`@`+%&(`
+M*9>B`!`P0@`!%$``!```&"6.`@`$,$(`"0`"&"L``Q=`C@0```!$$"8\`R``
+M`$,0)`""(":7H@`0``(0PCA"``$P0@`!``(7``!$$"8\`Q```$,0)`""(":N
+M!```EZ(`$#!"``040``$```8)8X"``0P0@`)``(8*P`#'L".`@```&(8)CP$
+M"```9!@D`$,0)CP#!```0Q`E/`,!``!#$"6N`@``C@(``#P#_?\T8___`$,0
+M)*X"``".8A,X$$``!```&"6.8A,\%$```P`#%<`D`P`!``,5P(X#````0Q`F
+M/`0`@`!$$"0`8A@F-&/P`*X#``".(P',)`(`!11B``0D`@`(EB,!T!!B``4`
+M````CB(!S"Q"``840``%EZ(`$(X"```T0@@`K@(``)>B`!`P0@'P$$```P`"
+M$0(0```#I@(`""0"``JF`@`(EZ(`$#!"\``00``%``(;`B0"``$`8A`$$```
+M`Z8"``HD`@"`I@(`"I9"`=0P0@#P)$+_T"Q"`$`00``%)`/[_XX"```T0@8`
+M$```!JX"``".`@```$,0)"0#_?\`0Q`DK@(``)9B$GH00``+`D`@)8Y"`:`D
+M!0`/`$#X"28F$D@00``%)`(``:XB$DR.`@``-$(!`*X"``".0@',+$(`!:XB
+M$FB.0P',)`(`!11B``4``"`EED,!T"0"``D08@`%`````(Y"`<PL0@`&%$``
+M`P`$$<`D!``!``01P(X#````0Q`F,$(`@`!B&":N`P``)`(`#ZX"`!0D`@`!
+MC[\`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`,">]_^"OOP`8/`(``"1"````
+M0/@))Z4`$"0"``&/OP`8`^``"">]`"`D`@`!%*(`!3P"```\`@``)$(```/@
+M``BL@@!P)$)W5`/@``BL@@!P````````````````)[W_P*^_`#ROL@`XK[$`
+M-*^P`#``@(`E`*"()8X"`!0T`X```$,0(8XC``2L0P`HC@(`%#0#@```0Q`A
+MCB,`#*Q#`"R.`@`4-`.```!#$"&.(P`0K$,`,(X"`!0T`X```$,0(8XC``BL
+M0P`TCB(``#P2`0``4A`D$$``#3P"```D0@```$#X"2>E`!".`A(T```@)0``
+M*"6L1``HK$4`+(X"`!0T`X```$,0(:Q2`"".`@`4-`.```!#$"&.(P``K$,`
+M((^_`#R/L@`XC[$`-(^P`#`#X``()[T`0">]_]"OOP`HKZ4`%(R#`=PD`@`!
+M$&(`"30"__\08``-/`(``"0"``808@`))`(`"!1B`!(DH@`!-`+__Z^B`!P\
+M`@`'-$+__Q````NOH@`@/`(``(Q"````HA`C``(0P*^B`!P\`@``C$(```"B
+M$",``A#`KZ(`("2B``&OH@`8/`(!@#1"__\`PA`DKZ(`$#P"```D0@```$#X
+M"2>E`!"/OP`H`^``"">]`#`GO?_PC((`%#0#@```0Q`AK$``*(R%`!0T`H``
+M`*(H(8RB``0\`P`$`$,0)3P#_\\T8___`$,0)*RB``2,@@`4-`.```!#$"$T
+M`___K$,`(`/@``@GO0`0)[W_\`"`0"64H@`2$$``&@$`."6-!``4-`*```""
+M("&,@@`$/`,`$`!#$"6L@@`$C0(`%#0#@```0Q`AE*,`$*Q#`"2-`@`4-`.`
+M``!#$"&4HP`2K$,`.(T#`!0T`H```&(8(8RB`!0``A#`K&(`,!````J-`@`4
+MC00`%#0"@```@B`AC((`!#P#_^\T8___`$,0)*R"``2-`@`4-`.```!#$"&,
+MHP``K$,`*(T#`!0T`H```&(P(8S"`"`\`_^``$,0))2C``H`0R`EE*(`&!!`
+M``4D0@`$``(4`#P#`'\`0Q`D`((@):S$`"",Y"_4/`+__S1"`/\`@B`DE*(`
+M&@`"$@`P0O\``((@):SD+]2-`@`4-`.```!#$"&L1``8E*<`"HRC`!P`XQ`K
+M.$(```!B.`N,I@`,`,,0*SA"````8C`+%.8``P`````0```"C*D`!(RI``",
+MH@`$C00`%#0#@```@R`A)$+__0`"$,`\`P`'-&/__P!#$"0\`PH8`$,0):R"
+M`-2-!``4-`*```""("$E(O_]``(0P#P#``<T8___`$,0)#P#"@``0Q`EK((`
+MV(T$`!0T`H```((@(3#B__\`!AP``$,0):R"`-P#X``()[T`$```````````
+M)[W_T*^_`"BOL0`DK[``(`"`@"4`P(@EC@(`%*Q%8`".`P`4)`(``:QB8`@\
+M`@``)$(``"0%8`PD!@`#`$#X"20'``(00``&C[\`*(X"`!2,0F`$IB(``"0"
+M``&/OP`HC[$`)(^P`"`#X``()[T`,">]_\B,A@`4C,)`%*^B`#"3HP`P)Z0`
+M,)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)0`%*$`D`@`#
+M`*(0!`!B&"6OHP`TDZ,`-">D`#20@@`!``(2``!B&"60@@`"``(4``!B&"60
+M@@`#``(6``!B&"6LPT`4)`(``0/@``@GO0`X)[W_R(R&`!2,PD`4KZ(`,).C
+M`#`GI``PD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E``4H
+M0"0"``,`HA`$``(0)P!B&"2OHP`TDZ,`-">D`#20@@`!``(2``!B&"60@@`"
+M``(4``!B&"60@@`#``(6``!B&"6LPT`4)`(``0/@``@GO0`X)[W_Z(R'`!2,
+MXD`8KZ(`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"
+M%@``8A@E)`(``0"B$`0``A`G`&(8)##&``$`IC`$`&88):^C`!23HP`4)Z0`
+M%)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):SC0!@D`@`!
+M`^``"">]`!@LH@`&$$``"2>]_^B,@@`4C$)`'*^B`!"3H@`0,$(`+P"B$`80
+M```",$(``20"__\#X``()[T`&">]_]"OOP`H`(`X)8SB`!2,0D`4KZ(`().C
+M`"`GI``@D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8B`E``40
+M0"0#``,`0Q@$/`(``31"\```0Q`G`((@)``%*P``A2`E$,```S2$@``\`@`!
+M`((@):^D`"23HP`D)Z0`))""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8)8SB`!2L0T`4C.,L1#P%`0`\`@``)$(```#@("4`0/@)`&4H)8^_
+M`"@#X``()[T`,````````````````">]_^B,@@`4C$)`"*^B`!"3H@`0)Z0`
+M$)"#``$``QH``$,0)9"#``(``QP``$,0)9"#``,``QX``$,0)3A"``$L0@`!
+M`^``"">]`!@`@$`E`*`X)0``2"4!`%`EC0,`%(QF`(`\`@"``,(0)!!``!8`
+M````C&0`C#P"`0``@A`D/`,`(#A"````8D@+/`(@``""$"000``"/`(`0`$B
+M2"4\`@0``((0)!!```(\`@"``2)()3P#`@``@Q`D`2,8)3A"````8D@+C0(`
+M%(Q&`,`D`O__%,(``P``$"4#X``(K.```#P"`04T0MBZ`,(8)#P"``@`PA`D
+M$$``!*SC```\`D```&(0):SB```PP@`%$$``!3#"!<",X@``-$(``:SB```P
+MP@7`$$``%S#"`"",X@``-$(`0*SB``"-`@`4C$,`Q#!D`_^-0D:@`((@)3P%
+M`_\`91@D``,<`@!D&"6M0T:@C0(`%(Q"`,@P1`/_`(,@)0!%$"0``A0"`$00
+M):U"1J`PP@`@$$``!P````"-`A)H$$``!#P#0`",X@```$,0):SB``",X@``
+M`2(0):SB```\`T```$,0)!!```T`````K0824(T#`!2,8@#$K0(25(QB`,BM
+M`A)8C&(`S*T"$ER,8@#0K0(28(QB`-2M`A)D`^``""0"``$#X``(C((L1">]
+M__``@$`EC0DL1`4A``4!`#@EC0(`%*Q``"2-`@`4C$(`)#P"`04T0MBZ`*(@
+M)#"B`$`00``-```P)8SC+,PT@@!``$,@"XSC+-`T@@$``$,@"XSC+-0T@@"`
+M`$,@"XSC+-@T@@0``$,@"S"C``$T@@`'`$,@"SP"`N``HA`D$$``%CP"`(``
+M@B`E/`(`(`"B$"000``"/`(!``#","4\`@!``*(0)!!```(\`B```,(P)3P"
+M`(``HA`D$$```CP"!```PC`E/`,"``"C$"0`PQ@E.$(```!B,`L\`D```*(0
+M)!!```(\`@`(`((@)8T"`!2L1`"@C00`%(R"`*P\`TC_-&/__P!#$"0`1A`E
+MK((`K`2A``2LY2Q$C0,`%"0"``&L8@`D`2`0)0/@``@GO0`0```````````#
+MX``(E((!ZC"C__^4@@'J`&(0*Q!``"`GO?_H``,I0"2B2!PL0A``$$``$P`#
+M&4",@@`4`*(0(30#B!P`0Q`AC$(``*^B`!"3HP`0)Z0`$)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8`$```!@!B$"6,@@`4`&(8(30"B!P`8A@A
+MC&(``#!#@``48``")`(``0``$"4#X``()[T`&">]_[@`@#@E,*7__Y3C`>H`
+MHQ@K$&`!A0``$"4`!1E`)&)(%"Q"$``00`#L`````(SB`!0`8A`A-`.(%`!#
+M$"&,0@``KZ(`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@`0``#?`&)`):^@`!23I``4D&(``0`"$@``@B`ED&(``@`"%```@B`E
+MD&(``P`"%@``@B`EC.(`%`#"$"$T`X@``$,0(:Q$```0``#9``4Q0*^@`!B3
+MI``8D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`EC.(`%`#"
+M$"$T`X@$`$,0(:Q$```0``#2``4Q0*^@`!R3I``<D&(``0`"$@``@B`ED&(`
+M`@`"%```@B`ED&(``P`"%@``@B`EC.(`%`#"$"$T`X@(`$,0(:Q$```0``#+
+M``4Q0*^@`""3I``@D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`EC.(`%`#"$"$T`X@,`$,0(:Q$```0``#$``4Q0*^@`"23I``DD&(``0`"
+M$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`EC.(`%`#"$"$T`X@0`$,0
+M(:Q$```0``"]``4Q0*^B`"B3I``H)Z,`*)!B``$``A(``((@)9!B``(``A0`
+M`((@)9!B``,``A8``((@)8SB`!0`PA`A-`.(%`!#$"&L1```$```M@`%,4"O
+MH``LDZ0`+)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8SB
+M`!0`PA`A-`.(&`!#$"&L1```$```KP`%,4"OH``PDZ0`,)!B``$``A(``((@
+M)9!B``(``A0``((@)9!B``,``A8``((@)8SB`!0`PA`A-`.('`!#$"&L1```
+M$```J"0"``2OH``TDZ0`-)!B``$``A(``((@)9!B``(``A0``((@)9!B``,`
+M`A8``((@)8SB`!0`PA`A-`.(``!#$"&L1```$```J@`%,4"OH``XDZ0`.)!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8SB`!0`PA`A-`.(
+M!`!#$"&L1```$```HP`%,4"OH``\DZ0`/)!B``$``A(``((@)9!B``(``A0`
+M`((@)9!B``,``A8``((@)8SB`!0`PA`A-`.("`!#$"&L1```$```G``%,4"O
+MH`!`DZ0`0)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8SB
+M`!0`PA`A-`.(#`!#$"&L1```$```E20"``&,X@`4`&(8(30"B!0`8A@AC&@`
+M```%,4`DPD@`+$(0`!1`_QXGHP`4C.(`%`#`&"4`8A@A-`*(``!B&"&L8```
+M``4Q0"3"2`0L0A``%$#_)2>C`!B,X@`4`,`8)0!B&"$T`H@$`&(8(:Q@````
+M!3%`),)(""Q"$``40/\L)Z,`'(SB`!0`P!@E`&(8(30"B`@`8A@AK&`````%
+M,4`DPD@,+$(0`!1`_S,GHP`@C.(`%`#`&"4`8A@A-`*(#`!B&"&L8`````4Q
+M0"3"2!`L0A``%$#_.B>C`"2,X@`4`,`8)0!B&"$T`H@0`&(8(:Q@````!3%`
+M),)(%"Q"$``40/]!)`(`!XSC`!0`P!`E`$,0(30#B!0`0Q`A)`,`!ZQ#````
+M!3%`),)(&"Q"$``40/]()Z,`+(SB`!0`P!@E`&(8(30"B!@`8A@AK&`````%
+M,4`DPD@<+$(0`!1`_T\GHP`PC.(`%`#`&"4`8A@A-`*('`!B&"&L8```)`(`
+M!!4"`#0D`@`!C.(OS#P#"```0Q`D$$``+B2B`$`P1?__``4Q0"3"2``L0A``
+M%$#_32>C`#2,X@`4`,`8)0!B&"$T`H@``&(8(:Q@````!3%`),)(!"Q"$``4
+M0/]4)Z,`.(SB`!0`P!@E`&(8(30"B`0`8A@AK&`````%,4`DPD@(+$(0`!1`
+M_ULGHP`\C.(`%`#`&"4`8A@A-`*("`!B&"&L8`````4Q0"3"2`PL0A``%$#_
+M8B>C`$",X@`4`,`8)0!B&"$T`H@,`&(8(:Q@```D`@`!`^``"">]`$@GO?_H
+M`(!`)3"E__^5`P'J`*,8*Q!@`%4``!`E$,``.0````"0QP`%``<Z`)#"``0`
+MXC@ED,0``P`$)@"0P@`"``(4``""("60P@`!``(2``""("60P@```((@)0`$
+M($(`!Q?``((@)1```"@`!SA"KZ0`$).D`!"08@`!``(2``""("608@`"``(4
+M``""("608@`#``(6``""("6-`@`4`,(0(30#B!@`0Q`AK$0``!```"(`!3%`
+MKZ(`%).D`!0GHP`4D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`EC0(`%`#"$"$T`X@<`$,0(:Q$```0```;)`(``0``."4``"`E``4Q0"3"
+M2!@L0A``%$#_U2>C`!"-`@`4`,`8)0!B&"$T`H@8`&(8(:QD````!3%`),)(
+M'"Q"$``40/_<-.*``(T#`!0`P!`E`$,0(30#B!P`0Q`A-..``*Q#```D`@`!
+M`^``"">]`!@GO?]HK[\`E*^V`)"OM0",K[0`B*^S`(2OL@"`K[$`?*^P`'@`
+M@)`E`,"`)0#@,"6/HP"H,+'__P)`L"4F1`'@/`*JJC1"JJH`0$@E``-("I9#
+M`>H"(Q@K$&`#+```$"62`P``+&(`!A!``R@``!`E/`(``"1"%,```QB``&(8
+M(8QB````0``(`````!```)4D"P`%C(,``#P"``0`8A@D$&`#&@``$"40``".
+M)`L`!HY"+\P\`P@``$,0)!!``(DD"P`$)B(`0)2#``H`0Q`J%$``A```$"40
+M``,-C[\`E)8#``(L8P`%%&`#"```$"66`@`"+$(`!A1``'H``%@EE@(``BQ"
+M``XD!``#)`,``0!@6"40``!S`()8"A```'$D"P`'$``"^0``$"6OH@`@DZ0`
+M(">C`""08@`!``(2``""("608@`"``(4``""("608@`#``(6``""("6.0@`4
+M`2(0(30#B```0Q`AK$0``!```*(`$4E`KZ(`)).D`"0GHP`DD&(``0`"$@``
+M@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$B$"$T`X@$`$,0(:Q$
+M```0``";`!%)0*^H`"B3I``HD&(``0`"$@``@B`ED&(``@`"%```@B`ED&(`
+M`P`"%@``@B`ECD(`%`$B$"$T`X@(`$,0(:Q$```0``"4`!%!0*^J`"R3I``L
+MD&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$"$"$T
+M`X@,`$,0(:Q$```0``"-`!%!0*^E`#"3I``PD&(``0`"$@``@B`ED&(``@`"
+M%```@B`ED&(``P`"%@``@B`ECD(`%`$"$"$T`X@0`$,0(:Q$```0``"&`!$I
+M0*^K`#23I``TD&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`E
+MCD(`%`"B$"$T`X@4`$,0(:Q$```0``!_/`(``)(4``22`@`%``(2``*"H"62
+M`@`&``(4``*"H"62`@`'``(6``*"H"4"B:`FD@,`")("``D``A(``&*H)0*I
+MJ"8RM?__D@@`"I("``L``A(``0)`)9("``P``A0``0)`)9("``T``A8``0)`
+M)0$)0":2`P`.D@(`#P`"$@``8E`E`4E0)I(%`!"2`@`1``(2``"B*"62`@`2
+M``(4``"B*"62`@`3``(6``"B*"4`J2@FE@(``BQ"``XPHP#_`&(H"R0"``05
+M8@(0,4K__XY"+\P\`P@``$,0)!!``@LF(@!`,%/__P`124`E(D@`+$(0`!1`
+M_U4`%!`GCD,`%`$@$"4`0Q`A-`.(``!#$"$`%!@GK$,````124`E(D@$+$(0
+M`!1`_UP`%1`GCD,`%`$@$"4`0Q`A-`.(!`!#$"$`%1@GK$,````124`E(D@(
+M+$(0`!1`_V,GHP`HCD(`%`$@&"4`8A@A-`*("`!B&"&L:````!%!0"4"2`PL
+M0A``%$#_:B>C`"R.0@`4`0`8)0!B&"$T`H@,`&(8(:QJ````$4%`)0)($"Q"
+M$``40/]Q)Z,`,(Y"`!0!`!@E`&(8(30"B!``8A@AK&4````1*4`DHD@4+$(0
+M`!1`_W@GHP`TCD(`%`"@&"4`8A@A-`*(%`!B&"&L:P``/`(``"1"```"0"`E
+M`$#X"0(@*"62!``4D@(`%0`"$@``@B`ED@(`%@`"%```@B`ED@(`%P`"%@``
+M@B`ED@4`&)("`!D``A(``*(H)9("`!H``A0``*(H)9("`!L``A8``*(H)8["
+M+]`P0@`$$$`!-0````"2`P`>D@(`'P`"$@``8D`ED@,`')("`!T``A(``&)(
+M)9(&`""2`@`A``(2``#","62`@`B``(4``#","62`@`C``(6`!```24`PC`E
+MKZ0`.).D`#B08@`!``(2``""("608@`"``(4``""("608@`#``(6``""("6.
+M0@`4`.(0(30#B```0Q`AK$0``!```1\`$SE`KZ@`/).D`#R08@`!``(2``""
+M("608@`"``(4``""("608@`#``(6``""("6.0@`4`.(0(30#B`0`0Q`AK$0`
+M`!```1@`$SE`KZ4`0).D`$"08@`!``(2``""("608@`"``(4``""("608@`#
+M``(6``""("6.0@`4`.(0(30#B`@`0Q`AK$0``!```1$`$RE`KZD`1).D`$20
+M8@`!``(2``""("608@`"``(4``""("608@`#``(6``""("6.0@`4`*(0(30#
+MB`P`0Q`AK$0``!```0H`$RE`KZ8`2).D`$B08@`!``(2``""("608@`"``(4
+M``""("608@`#``(6``""("6.0@`4`*(0(30#B!``0Q`AK$0``!```0,`$RE`
+MKZ(`3).D`$PGHP!,D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`ECD(`%`"B$"$T`X@4`$,0(:Q$```0``#\`!,I0*^@`%"3I`!0D&(``0`"
+M$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`"B$"$T`X@8`$,0
+M(:Q$```0``#U`!,I0*^@`%23I`!4D&(``0`"$@``@B`ED&(``@`"%```@B`E
+MD&(``P`"%@``@B`ECD(`%`"B$"$T`X@<`$,0(:Q$```0``#N`!$I0*^T`%B3
+MI`!8D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`"B
+M$"$T`X@``$,0(:Q$```0``#G`!$I0*^U`%R3I`!<D&(``0`"$@``@B`ED&(`
+M`@`"%```@B`ED&(``P`"%@``@B`ECD(`%`"B$"$T`X@$`$,0(:Q$```0``$I
+M)`(``:^T`&"3I`!@D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`ECD(`%`$B$"$T`X@``$,0(:Q$```0``#;`!%)0*^U`&23I`!DD&(``0`"
+M$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$B$"$T`X@$`$,0
+M(:Q$```0``#4`!%)0*^H`&B3I`!HD&(``0`"$@``@B`ED&(``@`"%```@B`E
+MD&(``P`"%@``@B`ECD(`%`$B$"$T`X@(`$,0(:Q$```0``#-`!%!0*^J`&R3
+MI`!LD&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$"
+M$"$T`X@,`$,0(:Q$```0``#&`!%!0*^E`'"3I`!PD&(``0`"$@``@B`ED&(`
+M`@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$"$"$T`X@0`$,0(:Q$```0``"_
+M`!$I0*^K`'23I`!TD&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`ECD(`%`"B$"$T`X@4`$,0(:Q$```0``"X/`(`````,"4``$@E``!`)0`3
+M.4`DXD@`+$(0`!1`_M@GHP`XCD(`%`#@&"4`8A@A-`*(``!B&"&L9````!,Y
+M0"3B2`0L0A``%$#^WR>C`#R.0@`4`.`8)0!B&"$T`H@$`&(8(:QH````$SE`
+M).)(""Q"$``40/[F)Z,`0(Y"`!0`X!@E`&(8(30"B`@`8A@AK&4````3*4`D
+MHD@,+$(0`!1`_NTGHP!$CD(`%`"@&"4`8A@A-`*(#`!B&"&L:0```!,I0"2B
+M2!`L0A``%$#^]">C`$B.0@`4`*`8)0!B&"$T`H@0`&(8(:QF````$RE`)*)(
+M%"Q"$``40/[[)`(`!XY#`!0`H!`E`$,0(30#B!0`0Q`A)`,`!ZQ#````$RE`
+M)*)(&"Q"$``40/\")Z,`4(Y"`!0`H!@E`&(8(30"B!@`8A@AK&`````3*4`D
+MHD@<+$(0`!1`_PDGHP!4CD(`%`"@&"4`8A@A-`*('`!B&"&L8````!$I0"2B
+M2``L0A``%$#_$">C`%B.0@`4`*`8)0!B&"$T`H@``&(8(:QT````$2E`)*)(
+M!"Q"$``40/\7)Z,`7(Y"`!0`H!@E`&(8(30"B`0`8A@AK'4``!```$DD`@`!
+M`!%)0"4B2``L0A``%$#_'">C`&".0@`4`2`8)0!B&"$T`H@``&(8(:QT````
+M$4E`)2)(!"Q"$``40/\C)Z,`9(Y"`!0!(!@E`&(8(30"B`0`8A@AK'4````1
+M24`E(D@(+$(0`!1`_RHGHP!HCD(`%`$@&"4`8A@A-`*("`!B&"&L:````!%!
+M0"4"2`PL0A``%$#_,2>C`&R.0@`4`0`8)0!B&"$T`H@,`&(8(:QJ````$4%`
+M)0)($"Q"$``40/\X)Z,`<(Y"`!0!`!@E`&(8(30"B!``8A@AK&4````1*4`D
+MHD@4+$(0`!1`_S\GHP!TCD(`%`"@&"4`8A@A-`*(%`!B&"&L:P``/`(``"1"
+M```"0"`E`$#X"0(@*"4D`@`!C[\`E(^V`)"/M0",C[0`B(^S`(2/L@"`C[$`
+M?(^P`'@#X``()[T`F">]_^BOOP`0)(,L,#P"```D0@```*`@)0!@*"4`0/@)
+M)`8`!H^_`!`#X``()[T`&">]_^BOOP`0/`(``"1"```DA"PP`$#X"20&``8D
+M`@`!C[\`$`/@``@GO0`8)[W_Z*^_`!`D@RP\/`(``"1"````H"`E`&`H)0!`
+M^`DD!@`&C[\`$`/@``@GO0`8)[W_T*^_`"BOL0`DK[``(`"`B"4"((`E/`(`
+M`"1"```F!"P\`$#X"20&``:.!``4-`*```""("&2`RP\D@(L/0`"$@``8A@E
+MD@(L/@`"%```8A@ED@(L/P`"%@``8A@EK(,`X(XD`!0T`H```((@(9(#+$"2
+M`BQ!``(2``!B&"6L@P#D)`(``8^_`"B/L0`DC[``(`/@``@GO0`P,*7__Y2"
+M`@@010`&)`,`#)2"$G(P0@"`)`0``R0#``L`@A@*$,```@````"LPP```^``
+M"```$"4`@#`EE((2AA!```4``"@E)`4``92#$G8D`@!#`$,H"I2"$HHTHP`$
+M`&(H"Y2"$HP00``)`````)3#`<HD`@X1$&(`!0`````TI0`(E(,2>#2B`"``
+M0R@*`^``"`"@$"4GO?_0K[\`+*^R`"BOL0`DK[``(`"`B"66,!)(,A(`'``2
+MD((R$``"`!"`*XXB`:P`0/@)`D`H)8XC`!0T`H```&(8(8QB&``T0B``K&(8
+M`(XB`;`"("`E`$#X"0)`*"4N!@`!`%`0)@(",`N.(@&X`B`@)0!`^`D"0"@E
+MC[\`+(^R`"B/L0`DC[``(`/@``@GO0`P)[W_R(R&`!2,PD`0KZ(`,).C`#`G
+MI``PD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E/`+_\31"
+M_Y\`8A@D/`(``"1"%.`PI0`'``4H@`"B*"&,H@```&(8):^C`#23HP`T)Z0`
+M-)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):S#0!`#X``(
+M)[T`.">]_]"OOP`LK[(`**^Q`"2OL``@`("0)3#1__\"0(`E/`(``"1"```F
+M!"PV`$#X"20&``:.!``4-`*```""("&2`RPVD@(L-P`"$@``8A@ED@(L.``"
+M%```8A@ED@(L.0`"%@``8A@EK(,`"(Y$`!0T`H```((@(9(#+#J2`BP[``(2
+M``!B&"4R,3__`!&,``!Q&"6L@P`,C[\`+(^R`"B/L0`DC[``(`/@``@GO0`P
+MC(0`%#0"@```@B`AC(8`3(R"`%",A`!,`(8P*P!&$"$`0!@E```0)0`#$```
+M`!@E`(`H)0``("4`1!`E`^``"`!E&"6,@@`4-`.```!#$"&,0@!,`^``"```
+M```GO?_PC(,`%#0"@```8A@AC&4`(#P"`0``HA`EK&(`((R#`!0T`H```&(8
+M(3P"`0``HB@EK&4`(`/@``@GO0`0C((2-!!``"DGO?_PE$(``C!"`"`00``E
+M```X)8RB```00``.```P)22H``0`0"@E`0<0(9!#```P8@"`$$```S!C`'\`
+M9A`K`&(P"B3G``$`Y1`K%$#_]P$'$"&,@P`4-`*```!B&"&,90`$$,``"``&
+M$$(P0@#_+$(``Q!```0\`@(``*(0)1````BL8@`$C(,`%#0"@```8A@A/`+]
+M_S1"__\`HA`DK&(`!`/@``@GO0`0C((`%#0#@```0Q`AC$(89``"+,(PI0'_
+M,*(!`!!```,`````.*4!_P`%*">,@P`4-`*```!B&"&,8@!0C&,`3`!#$"8#
+MX``(`$40)B>]_^@`@#`EC,(`%(Q"0""OH@`0DZ,`$">D`!"0@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"4P9`#_``0A`C!C``^,P@',%$0`
+M!```*"64P@'0`$,0)BQ%``$`H!`E`^``"">]`!B,@P`4-`:```!F&"&,H@``
+MC&,`D`!#$"&LH@``C((`%`!&$"&,HP`$C$(`C`!B&"&LHP`$C((`%`!&$"&,
+MHP`,C$(`E`!B&"&LHP`,C((`%`!&$"&,HP`(C$(`B`!B&"&LHP`(C((`%`!&
+M$"&,HP`0C$(`F`!B&"$#X``(K*,`$`/@``@D`@`!C((`%#0#@```0Q`AC$(<
+M'`/@``@P0@#_C((`%#0#@```0Q`AC$(`6`/@``@P0@`')[W_\(R"`!0T`X``
+M`$,0(3"E``>L10!8`^``"">]`!`#X``(C((OO">]_^BOOP`0C(82-!3```,D
+M`@`!$```!:R%+[P\`@``)$(```!`^`D`````C[\`$`/@``@GO0`8`^``""0"
+M``$GO?_0K[\`+*^R`"BOL0`DK[``(`"`B"4`H(`E+@(`!A1```@"()`E/`(`
+M`"1"````0/@)-`7__P!0$"L00``%`B`@)20"__^N0B_X$```"0``$"4\`@``
+M)$(```!`^`D"`"@ECB,`%*QB$'"N4"_X)`(``8^_`"R/L@`HC[$`)(^P`"`#
+MX``()[T`,">]_^BOOP`0C((`%(Q%$'`\`@``)$(```!`^`DPI?__C[\`$`/@
+M``@GO0`8)[W_T*^_`"ROL@`HK[$`)*^P`"``@(`E`*"()0(`D"4\`@``)$(`
+M``!`^`DD!3__`%$0*Q!```4"`"`E)`+__ZY"+_P0```0```0)3P"```D0@``
+M`$#X"0(@*"6.!0`4-`.```"C*"&,HP`4)`3```!D&"0P0C__`&(8):RC`!2N
+M42_\)`(``8^_`"R/L@`HC[$`)(^P`"`#X``()[T`,">]_^BOOP`0C((`%#0#
+M@```0Q`AC$4`%#P"```D0@```$#X"3"E/_^/OP`0`^``"">]`!B0@B_,.$(`
+M`0/@``@P0@`!)[W_\!"@``T`@#`EC,0`%#0"@```@B`AC((`!#P#_O\T8___
+M`$,0)*R"``2,PB_,`$,0)!````NLPB_,C(0`%#0"@```@B`AC((`!#P#`0``
+M0Q`EK((`!(S"+\P`0Q`EK,(OS"0"``$#X``()[T`$">]_]"OOP`LK[(`**^Q
+M`"2OL``@`("`)0"@B"4"`)`E/`(``"1"````0/@))`4__P!1$"L00``%`@`@
+M)20"__^N0C``$```$P``$"4\`@``)$(```!`^`D"("@EC@4`%#0#@```HR@A
+MC*0`%#P#P``T8___`(,@)``"%``\`S__`$,0)`""("6LI``4KE$P`"0"``&/
+MOP`LC[(`*(^Q`"2/L``@`^``"">]`#`GO?_HK[\`$(R"`!0T`X```$,0(8Q%
+M`!0`!2P"/`(``"1"````0/@),*4__X^_`!`#X``()[T`&">]__`PI?__`(`X
+M)2RC`(`08``))`(`#(R"`!2L100`C(,`%``&$"NL8@0$`*<0(:!&+S@``!`E
+M`^``"">]`!`GO?_0K[\`**^Q`"2OL``@`("()3"P`/\0P`!`HC`2.#("`/\0
+M0``])`,!0(XB$C240@`",$(!0!1#`#@\`@``)$(```!`^`DD!0`!`$`H)8XB
+M$C240@`",$)``!!```H`!1A"<@,@`@`$$$``@B`A)(0!!'(#,`(`1A`A``(0
+M0!```!<D1@VLCB(2-)1"``(P0H``$$``"@`%&()R`R`"``000`""("$DA`#2
+M<@,P`@!&$"$``A!`$```"21&#4AR!2`"``000`""("$DA`%H<@4P`@!&$"$`
+M`A!`)$8.8'(%&`(``Q!``&(8(21C`^@P8S__CB(`%*Q$$'".(@`4K$80L(XD
+M`!0T`H```((@(0`#%```0Q`EK((`%(^_`"B/L0`DC[``(`/@``@GO0`P)[W_
+MZ*^_`!`\`@``)$(```!`^`F,A0'<C[\`$`/@``@GO0`8`(`P)20#``80HP`'
+M```0)9#"$I,00``#```@)8S"+^@L1``"`(`0)0/@``@`````)[W_D*^_`&RO
+ML`!H/`(``"1"````0/@)`("`)1!``*TT`X``C@(`%`!#$"$D`P`?K$,8<(X%
+M`!0T`H```*(H(98"`=0P0@#P)$+_T"Q"`$`D`P`8)`0`%`""&`NLHQGXC@0`
+M%#0"@```@B`AC((`'"0#P'\`0Q`D-$(`@*R"`!R.`@`4-`.```!#$"$D`P`]
+MK$,!!(X%`!2,HD`0KZ(`0).C`$`GI`!`D((``0`"$@``8A@ED((``@`"%```
+M8A@ED((``P`"%@``8A@E-&,``J^C`$23HP!$)Z0`1)""``$``A(``&(8)9""
+M``(``A0``&(8)9""``,``A8``&(8):RC0!".!`',.(,`!RQC``$X@@`++$(`
+M`0!B&"448``,`````"0#``H0@P`))`(`"1""``<`````%(,`,`````"6`@'0
+M+$(`!!!``"P`````C@(`%#0#@```0Q`A)`,`)JQ#&'2.`@`4-`.```!#$"$D
+M`P`-K$,8>(X"`!0T`X```$,0(20#``>L0QGPC@(`%#0#@```0Q`A)`,`/ZQ#
+M&?2.!0`4C*)`$*^B`$B3HP!()Z0`2)""``$``A(``&(8)9""``(``A0``&(8
+M)9""``,``A8``&(8)3P"_/\T0O__`&(8)#P"`@``8A@EKZ,`3).C`$P0```K
+M)Z0`3(X"`!0T`X```$,0(20#``JL0QATC@(`%#0#@```0Q`A)`,`#*Q#&'B.
+M`@`4-`.```!#$"$D`P`#K$,9\(X"`!0T`X```$,0(20#`""L0QGTC@4`%(RB
+M0!"OH@!0DZ,`4">D`%"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6
+M``!B&"4\`OS_-$+__P!B&"0\`@,``&(8):^C`%23HP!4)Z0`5)""``$``A(`
+M`&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC0!`0``!OC[\`;(X%`!2,
+MHD`0KZ(`6).C`%@GI`!8D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"
+M%@``8A@E/`+\_S1"__\`8A@DKZ,`7).C`%PGI`!<D((``0`"$@``8A@ED((`
+M`@`"%```8A@ED((``P`"%@``8A@EK*-`$(X%`!2,HD`0KZ(`8).C`&`GI`!@
+MD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E)`+__0!B&"2O
+MHP!DDZ,`9">D`&20@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B
+M&"6LHT`0C@(`%#0#@```0Q`A)`,`'ZQ#&'".`@`4-`.```!#$"$D`P!_K$,8
+M=(X"`!0T`X```$,0(20#``ZL0QAXC@(`%#0#@```0Q`A)`,`#*Q#&?".`@`4
+M-`.```!#$"$D`P#_K$,9](X%`!0T`H```*(H(98"`=0P0@#P)$+_T"Q"`$`D
+M`P`2)`0`#@""&`NLHQGXC@4`%#0"@```HB@AC*,`'"0"P'\`8A@DE@(!U#!"
+M`/`D0O_0+$(`0#1D$X`T8P^``((8"ZRC`!R/OP!LC[``:`/@``@GO0!P)[W_
+MJ*^_`%2OL`!0/`(``"1"````0/@)`("`)1!``'2/OP!4C@4`%(RB0!"OH@!`
+MDZ,`0">D`$"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"4\
+M`OS_-$+__P!B&"2OHP!$DZ,`1">D`$20@@`!``(2``!B&"60@@`"``(4``!B
+M&"60@@`#``(6``!B&"6LHT`0C@4`%(RB0!"OH@!(DZ,`2">D`$B0@@`!``(2
+M``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"4D`O_]`&(8)*^C`$R3HP!,
+M)Z0`3)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC0!".
+M`@`4-`.```!#$"$D`P`!K$,!!(X%`!0T`H```*(H(8RC`!PD`L!_`&(8))8"
+M`=0P0@#P)$+_T"Q"`$`T9!.`-&,/@`""&`NLHP`<C@(`%#0#@```0Q`A)`,`
+M'ZQ#&'".`@`4-`.```!#$"$D`P!_K$,8=(X"`!0T`X```$,0(20#``ZL0QAX
+MC@(`%#0#@```0Q`A)`,`#*Q#&?".`@`4-`.```!#$"$D`P#_K$,9](X%`!0T
+M`H```*(H(98"`=0P0@#P)$+_T"Q"`$`D`P`8)`0`%`""&`NLHQGXC[\`5(^P
+M`%`#X``()[T`6#P"``"4HP``E$(5``!#$"L40``+```@)3P"```D0Q4`E*4`
+M`"2$``$`!!"``$,0(91"````11`K$$#_^@`````\`@``)$(5```$&(``0Q`A
+M`^``"(1"``(GO?_@K[\`&*^Q`!2OL``0`,"`)0#@B"4`@#`E)*/__RQB`!T0
+M0`#&)(<!X#P"```D0A4P``,8@`!B&"&,8@```$``"``````D`@`"$@(`#SP"
+M``0N`@`"%$``O@``$"4N`@`$%$``NR0"``TN`@`&%$``N```$"4D`@!_$@(`
+M"``````0``"S)`(`#8SC````8A@D)`(`#1```*X``Q`+$```K```$"42``"J
+M```0)20"``$6`@`&`````(S"+\P``A;".$(``1```*(P0@`!$@``!@`````D
+M`@`!$@(`!P`````0``";)`(`#(SB`````A3"$```ES!"``&,PB_0``(0@A``
+M`),P0@`!C(,!S"QB``800`"/```0)20"``448@",)`(`#92"`=`L0@`($$``
+M`P`````0``"&)`(`#1```(0``!`E$@``@@``$"4D`P`!%@,`?R0"``R,@@`4
+M-`.```!#$"&,0B((``(30CA"``$0``!W,$(``8R"`?BN(@``$```<P``$"42
+M``!Q```0)20#``$6`P!OC[\`&(S"+]P0``!L+$(``1(```8`````)`(``1("
+M``:/OP`8$```9H^Q`!24PA*&$```82Q"``&4PA*,%$``7@``$"64PQ**$&``
+M6R0"``$0``!9```0)1(``%<``!`E)`,``18#`%0D`@`,C,(OS``"%\(0``!0
+M.$(``1(```8D`@`-)`(``1("``<`````$```220"``R,XP``,&,(`!```$4`
+M`Q`+C,(OT``"$,(X0@`!$```0#!"``&,PB_@,$(`/ZXB```0```[```0)8S"
+M+^`P0C\```(2`JXB```0```U```0)20"``$2`@`(`````!(``#```!`E+@,`
+M!Q!@`"TD`@`,$```!3P"``",PC`8.$(``1```"<P0@`!)$(```!`^`D`````
+M`$`@)1"``"$D`@`!)@/__BQB``400``=```0)3P"```D0A6H``,8@`!B&"&,
+M8@```$``"`````"0@@`)$```#*XB``"0@@`,$```":XB``"0@@`-$```!JXB
+M``"0@@`+$````ZXB``"0@@`*KB(``!````8``!`E/`(``"1"```"`#`E`$#X
+M"0(@."6/OP`8C[$`%(^P`!`#X``()[T`(">]_]"OOP`H`(!`)22C__XL8@`<
+M$$``B22)`>`\`@``)$(5V``#&(``8A@AC&(```!```@`````$.``!3P#"`"-
+M`B_,`$,0)1````:M`B_,C0(OS#P#]_\T8___`$,0)*T"+\P0``![)`(``8TC
+M```\`@`(`&(8)!!@`'8``!`E$.``!20#__N-`B_0`$,0)!````2M`B_0C0(O
+MT#1"``2M`B_0C((`%#0#@```0Q`AC0,OT*Q#`2`0``!F)`(``8R"`!0T`X``
+M`$,0(8Q%(@@0X``#`````!````,TI2``)`+?_P"B*"2,@@`4-`.```!#$"&L
+M12(($```5B0"``&LAP'XC((`%#0#@```0Q`AK$<`2!```$\D`@`!``<0*ZT"
+M+]P0``!+)`(``1#@``4\`X``C0(OS`!#$"40```&K0(OS(T"+\P\`W__-&/_
+M_P!#$"2M`B_,$```/B0"``&%`B_T`.(X(2SC`$`D`@`_`$,X"B0"`!H4H@`&
+M`````(T"+^``XA`E,$(`/Q````>M`B_@C0,OX#!C/P`PXC\```(2`@!#$"6M
+M`B_@C((`%#0#@```0Q`AC0,OX*Q#`.@0```D)`(``2S"``<00``A```0)3P"
+M```D0A6\``88@`!B&"$\`@``)$(``(QE````0/@)`.`P)1```!>/OP`HC2(`
+M`#!""``00``,`````!#@``4D`__WC0(OT#1"``@0```$K0(OT(T"+]``0Q`D
+MK0(OT!````<D`@`!CZ(`0*^B`!`\`@``)$(```!`^`D`````C[\`*`/@``@G
+MO0`P)[W_X*^_`!B/H@`PCZ,`-*^B`!`\`@``)$(```!`^`FOHP`4``(0*X^_
+M`!@#X``()[T`(``````GO?^(K[\`=*^V`'"OM0!LK[0`:*^S`&2OL@!@K[$`
+M7*^P`%@0H`!=`("@)8Z%`!2,HD`$KZ(`0).C`$`GI`!`D((``0`"$@``8A@E
+MD((``@`"%```8A@ED((``P`"%@``8A@E/`+__#1"__\`8A@DKZ,`1).C`$0G
+MI`!$D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EK*-`!#P"
+M```D0@```$#X"20$``HD$P`H)[(`2#P6``$\`@``)%4``">Q`$PGL`!0CH(`
+M%(Q"0!"OH@!(DZ,`2))"``$``A(``&(8)9)"``(``A0``&(8)9)"``,``A8`
+M`&(8)0!V&"008``B``````*@^`DD!``RCH0`%(R"0`2OH@!,DZ,`3)(B``$`
+M`A(``&(8)9(B``(``A0``&(8)9(B``,``A8``&(8)3P"__PT0O__`&(8)*^C
+M`%"3HP!0D@(``0`"$@``8A@ED@(``@`"%```8A@ED@(``P`"%@``8A@EK(-`
+M!"9S__\68/_0`````!)@``H``!`ECH0`%#0"@```@B`AC((`!#P#__LT8___
+M`$,0)*R"``0D`@`!C[\`=(^V`'"/M0!LC[0`:(^S`&2/L@!@C[$`7(^P`%@#
+MX``()[T`>">]_\@`@#`EC,0`%#0"@```@B`AC((`!#P#``0`0Q`EK((`!!"@
+M`"$`````C,4`%(RB0`2OH@`PDZ,`,">D`#"0@@`!``(2``!B&"60@@`"``(4
+M``!B&"60@@`#``(6``!B&"4\`O_\-$+__P!B&"0\`@`!`&(8):^C`#23HP`T
+M)Z0`-)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC0`0#
+MX``()[T`.">]_\@`@#`EC,0`%#0"@```@B`AC((`!#P#``0`0Q`EK((`!!"@
+M`"$`````C,4`%(RB0`2OH@`PDZ,`,">D`#"0@@`!``(2``!B&"60@@`"``(4
+M``!B&"60@@`#``(6``!B&"4\`O_\-$+__P!B&"0\`@`"`&(8):^C`#23HP`T
+M)Z0`-)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC0`0#
+MX``()[T`.">]_^"OOP`<K[(`&*^Q`!2OL``0`*"()0#`*"4D$``!$C``#0"`
+MD"42(``&/`(``20"``(2(@`.```0)1```!./OP`<)$*OX`!`^`D`````$```
+M"P!`@"4\`@`!)$*QR`!`^`D`````$```!JY1+[@\`@`!)$*R?`!`^`D`````
+MKE$ON`(`$"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_HC((`%(Q"0`2O
+MH@`0DZ(`$">D`!"0@P`!``,:``!#$"60@P`"``,<``!#$"4``A0",$(``P/@
+M``@GO0`8)[W_Z*^_`!0D`@`($*(`-J^P`!`LH@`)$$``#R0"`0`D`@`"$*(`
+M,RRB``,00``&)`(`!"0"``$0H@`6```0)1```$"/OP`4$*(`)```$"40```\
+MC[\`%!"B`"PLH@$!$$``!B0"`@`D`@`@$*(`)```$"40```SC[\`%!"B`"8D
+M`@0`$*(`)P``$"40```MC[\`%#P"```D4```C((2-!!``"(`````E$(``C!"
+M0``00``#/`(``!```!PD4```C((2-)1"``(P0H``$$``%SP"```0```5)%``
+M`#P"```0```2)%```#P"```0```/)%```#P"```0```,)%```#P"```0```)
+M)%```#P"```0```&)%```#P"```0```#)%```#P"```D4```/`(``"1"````
+M0/@)`@`H)0(`$"6/OP`4C[``$`/@``@GO0`8C((`%(Q"``P#X``(`````">]
+M__",@@`4K$4`#`/@``@GO0`0)[W_\(R#`!0D`@`$K&(`"`/@``@GO0`0)[W_
+MV*^_`"",@P`4)`(`(*QB``@\`@``)$(``"0%``@D!@`$`$#X"0``."4``A`K
+MC[\`(`/@``@GO0`H)[W_V*^_`"2OL``@`("`)8X$`!0T`H```((@(8R"`$@D
+M`__?`$,0)*R"`$@\`@``)$(```!`^`D"`"`E/`(``"1"```"`"`E`$#X"20%
+M``&/OP`DC[``(`/@``@GO0`H)[W_V*^_`"",@P`4-`*```!B&"&,8@!(-$(`
+M(*QB`$@\`@``)$(```!`^`D`````C[\`(`/@``@GO0`H)[W_\(R"`!0T`X``
+M`$,0(:Q%`$",@@`4`$,0(:Q&`$0#X``()[T`$">]__`LHP!`$&``&```$"4L
+MH@`@%$``##0"@`",@P`4`&(8(8QF`$0DI/_@)`(``0""$`0``A`G`,(0)*QB
+M`$00```*)`(``8R#`!0`8A@AC&8`0"0"``$`HA`$``(0)P#"$"2L8@!`)`(`
+M`0/@``@GO0`0)[W_\"RC`$`08``6```0)2RB`"`40``+-`*``(R#`!0`8A@A
+MC&8`1"2D_^`D`@`!`((0!`#"$"6L8@!$$```"20"``&,@P`4`&(8(8QF`$`D
+M`@`!`*(0!`#"$"6L8@!`)`(``0/@``@GO0`0C((`%#0#@```0Q`AC$,`/(Q$
+M`0PPA0`@-&("``!%&`L\`@("`((@)#1B`0`#X``(`&00"B>]__",@@`4-`.`
+M``!#$"$PHP#_K$,`/#"C`@`D`@`@```P)3"E`0`0H``#`$,P"SP"`@(`PC`E
+MC((`%#0#@```0Q`AK$8!#!#```8`````C(,`%(QB`#0T0@`0$```!JQB`#2,
+M@@`4C$,`-"0$_^\`9!@DK$,`-`/@``@GO0`0J*``"+B@``LPQ@__J*8`#+BF
+M``\PYP`@$.``!@````"(H@`,F*(`#S1"(`"HH@`,N*(`#ZB@`!2XH``7B*(`
+M%)BB`!>HH@`0N*(`$P/@``@D`@`!)[W_Z*^_`!"/J``PB*,`%)BC`!<P8P`!
+M$&``<20"``^(X@`4F.(`%S!"``$40``%`````(R"`!2,0P`,$&8`:"0"``^(
+MH@`0F*(`$S!"#_^E`@``B*(`%)BB`!<``A0",$)__Z4"``*A```$B*(`$)BB
+M`!,``A4",$(`_Z$"``8``A8```(6`R0#_X`40P`"`````*$```:(H@`4F*(`
+M%S!"`0`00``')`(`_XBB`!28H@`7,$+^```"$D(0```"H0(`!Z$"``>(H@`0
+MF*(`$P`"$\(P0@`?H0(`"(BB`!"8H@`3``(7`J$"``F(H@`0F*(`$P`"$P(P
+M0@`!H0(`"HBB`!28H@`7,$(``A1``#0``!`EB*(`%)BB`!<P0@`$$$``!0``
+M``"1`@`$-$(``1```"JA`@`$B*(`%)BB`!<P0@`0$$``%`````"1`@`$-$(`
+M`J$"``2(H@`4F*(`%S!"_P```A("H0(`!8R#,!PX0@`%``(0*P`#$`L00``7
+M/`(``"1"````0/@)`0`H)1```!,``!`EB*(`%)BB`!<P0@`($$``!0````"1
+M`@`$-$(`"!````FA`@`$B*(`%)BB`!<P0@`@$$``!0``$"61`@`$-$(`$*$"
+M``0``!`EC[\`$`/@``@GO0`8)[W_2*^_`+2OO@"PK[<`K*^V`*BOM0"DK[0`
+MH*^S`)ROL@"8K[$`E*^P`)``@(@EKZ4`O`#`\"6OIP#$`B"@)9?"``(``A'"
+M,$,``9?"``(P0@$`$$``!0``L"448`1R)`,`#!````B7P@`"E\(``@`"$<(X
+M0@`!,$(``11`!&HD`P`,E\(``@`"$8(P0P`!E\(``C!"`"`00``%`````!1@
+M!&$D`P`,$```"#P"``"7P@`"``(1@CA"``$P0@`!%$`$620#``P\`@``)$(`
+M``(@("4``"@E`$#X"20&``$00`16`B`@)3P"```D0@```$#X"0/`*"4`0*@E
+M$J`$2B0#``PD`@`&CZ,`O!!B``LL8@`'$$``!B0"``@L8@`"$$`$020#``P0
+M```%CZ4`Q(^D`+P4@@0\)`,`#(^E`,00H``0`````(XB`!2,0A%`KZ(`>#P"
+M```D0@```B`@)0!`^`D"H"@E/`(``"1"```"("`E`$#X"0``*"40```#CB0!
+MS*^@`'B.)`',.(,`!RQC``$X@@`++$(``0!B&"448``,CZ8`Q"0#``H0@P`)
+M)`(`"1""``<`````%(,`&@````"6(@'0+$(`!!!``!8`````$,``%`````".
+M)!(T$(``$0````"7PP``E((``!!B``T`````E\,``I2"``(P8P'P,$(!\!1B
+M``<\`@``)$(```(@("4`0/@)`\`H)11`!`8D`@`!CB4`%#0"@```HA`AC$,`
+M6*^C`'PD`P`!CZ0`?`"`,"4`9B`*KZ0`?(Q#``0\`@(@`&(8)*^C`(2,HD`0
+MKZ(`2).C`$@GI`!(D((``0`"$@``8A@ED((``@`"%```8A@E/`(`_C1"`&``
+M8A@DKZ,`@(RB0!2OH@!,DZ,`3">D`$R0@@`!``(2``!B&"60@@`"``(4``!B
+M&"60@@`#``(6``!B&"6OHP!PC*)`&*^B`%"3HP!0)Z0`4)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8``&(8):^C`'0\`@``)$(```(@("4`0/@)
+MCZ4`O#P"```D0@```$#X"0(@("4\`@``)$(```(@("4`0/@)`\`H)1!``[DD
+M`P`#E\(``C!#`?`D`@%`$&(`("AB`4$00``/)`((P"0"`,`08@`F*&(`P1!`
+M``8D`@#0)`(`H!!B`!TD`P`,$``#J8^E`,@08@`A)`,`#!```Z6/I0#($&(`
+M&2AB",$00``&)`()0"0"`5`08@`,)`,`#!```YR/I0#($&(`!20""5`08@`&
+M)`,`#!```Y:/I0#()!<``1```!"OMP"()!<``B0"``$0```,KZ(`B"07``,D
+M`P`"$```"*^C`(@D%P`$)`0``A````2OI`"()!<`!20%``*OI0"(CB(`%#0#
+M@```0Q`A)`,`!ZQ#&````(`E/`(``"13%E`GL@!4`!`00`!0&"$``Q#``%,0
+M(8Q$```D@L``+$(0`!!``!8`$!!```,00`!7$"$``A"``%,0(8Q"``"OH@!4
+MDZ,`5))"``$``A(``&(8)9)"``(``A0``&(8)9)"``,``A8``&(8)8XB`!0`
+M1!`AK$,``!````XFU@`!`%`0(0`"&,``<Q@ACB0`%(QC````@R`A``(00`!7
+M$"$``A"``%,0(8Q"``"L@@``)M8``3+"`#\40``$/`8``"3&````P/@))`0`
+M`280``$N`@`9%$#_S0`0$$```(`E/`(``"13&*@GL@!8`!`0P`!3$"&,1```
+MCZ(`Q!!```P\!?__-*5_X`"%&"$L8P`9/`+__S1"?RP`@A`A+$(`"3A"``$`
+M`Q`+$$``)``````D@L``+$(0`!!``!0`$!C``!`0P`!3$"&,0@`$KZ(`6).C
+M`%B20@`!``(2``!B&"620@`"``(4``!B&"620@`#``(6``!B&"6.(@`4`$00
+M(:Q#```0```')M8``8XB`!0`1!`A`',8(8QC``2L0P``)M8``3+"`#\40``$
+M/`8``"3&````P/@))`0``280``$N`@#$%$#_R@`0$,".@BRL`B`@)0+@*"6/
+MI@"(`$#X"0+`."67P@`",$+``!!```4\`@``)$(```(@("4`0/@)`\`H)98B
+M`=(L0@!"%$``230#@`".(@`4`$,0(3P#``(T8Z`"K$,8+)?#```D`@FT%&(`
+M#CP#9F:2@A*2EH,2G`!#$",\`V9F-&-F9P!#`!@``!@0``,80P`"%\,`8A@C
+M``,<`!````<``R0#DH(2DC1C9F<`0P`8```0$``"$\```B0#E\(``C!"`-`D
+M`P#`%$,`$#0#@`".)0`4-`*```"B*"&2@A*2``(0(P`"$8`P0@_```08(P`#
+M'(`\!`#\`&08)`!#$"6LHAE,$```!8XD`!2.(@`4`$,0(:Q`&4R.)``4-`*`
+M``""("&,@B(H)`/]_P!#$"2L@B(HCB0`%#0"@```@B`AC((B*#P#__XT8P/_
+M`$,0)#1""`"L@B(HCB(`%#0#@```0Q`A)`,`#ZQ#`&"6(@'2+$(`0Q1```0T
+M`X``CB(`%`!#$"&L0")4CB(`%#0#@```0Q`A)`,`#JQ#&'B.(P',)`0`"A!D
+M``DD`@`)$&(`!P`````49``3/`(``)8B`=`L0@`$$$``#SP"``"7PP``.&()
+MGCAC":,``A`K```@)0!#(`N.(P`4-`*```!B&"&,8B),$$0``SP"``"L9"),
+M/`(``"1"```"("`E`J`H)0!`^`DGI@`0$$`"@B0#``,D`@`&CZ,`O!!B``<`
+M````CB("!!!```0\`@``)$(```!`^`D"("`ECH(LN`(@("4"H"@E,N;__P!`
+M^`DGIP`0$$`"<"0#``.7P@`",$(`0!!``!XD!``*CB,!S!!D``TD`@`)$&(`
+M"P`````49``%`````)8B`=`L0@`$%$``!0````"6@A)P+$)0`Q1```L\`@``
+ME\(``C!"`*`D`P"@$$,`!3P"```D0@```B`@)0!`^`D"H"@E/`(``"1"```"
+M("`E`$#X"0/`*"4\`@``)$(```(@("4`0/@)`J`H)1!``D@D`P`#CZ0`Q!"`
+M``0`````CB(`%(^E`'BL11%`CB0`%#0"@```@B`ADH,L,)*"+#$``A(``&(8
+M)9*"+#(``A0``&(8)9*"+#,``A8``&(8):R#``".)``4-`*```""("&2@RPT
+MDH(L-0`"$@``8A@ECZ8`A`!F&"6.@B_,`&(8)3P"`(``8A@EK(,`!#P"```D
+M0@```B`@)0!`^`F/I0"\CB0`%#0"@```@B`ADH,L/)*"+#T``A(``&(8)9*"
+M+#X``A0``&(8)9*"+#\``A8``&(8):R#`.".)``4-`*```""("&2@RQ`DH(L
+M00`"$@``8A@EK(,`Y(XE`!2,HD`0KZ(`7).C`%PGI`!<D((``0`"$@``8A@E
+MD((``@`"%```8A@ED((``P`"%@``8A@ECZ(`@`!B&"6OHP!@DZ,`8">D`&"0
+M@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6LHT`0CZ,`<*^C
+M`&23HP!D)Z0`9)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8
+M)8XB`!2L0T`4CZ0`=*^D`&B3HP!H)Z0`:)""``$``A(``&(8)9""``(``A0`
+M`&(8)9""``,``A8``&(8)8XB`!2L0T`8CB(`%#0#@```0Q`ACZ4`?*Q%`%B.
+M)``4-`*```""("&2@RPVDH(L-P`"$@``8A@EDH(L.``"%```8A@EDH(L.0`"
+M%@``8A@EK(,`"(XD`!0T`H```((@(9*#+#J2@BP[``(2``!B&"6L@P`,CB(`
+M%#0#@```0Q`ACH,OU*Q#`!B.(P`4)`+__ZQB`(`\`@``)$(```(@("4`0/@)
+M`J`H)1!``:8D`P`#/`(``"1"```"("`EDB42.`!`^`DD!@`!/`(``"1"```"
+M("`E`$#X"0/`*"66(@'4,$(`\"1"_]`L0@!`$$``$@````".(Q(TC&(``#!"
+MP``00``-)`<`#91F``(PQD``)`4`#(XD`!0T`H```((@(8R"&"0D`__P`$,0
+M)`#F*`H`11`EK((8)(XB`!0T`X```$,0(8Q"&10P1#__E\(``C!"`"`00``'
+M``00@#P#NBXT8XNC`$,`&0``$!`0```&``(A`CP"S,PT0LS-`((`&0``$!``
+M`B#"CB(`%#0#@```0Q`A)`,``:Q#&!R.(A(TE$(``C!"0``00``'/`(````$
+M($`D0@```$#X"22$`&00```0CB(`%(XB$C240@`",$*``!!```<\`@````0@
+M@"1"````0/@))(0`9!````6.(@`4)$(```!`^`DDA`!DCB(`%#0#@```0Q`A
+MC%88""0#.`"L0Q@()!```8XB`!0T`X```$,0(8Q"'"0P0@`0$$``#SP"```D
+M4P``-!*```)@^`DD!`#(`@`0)2A"`!000``')A```8XB`!0`4A`AC$(<)#!"
+M`!`40/_U`````(XB`!0T`X```$,0(:Q6&`B.(P`4-`*```!B&"&,8AA@-$(`
+M`ZQB&&"7P@`",$(`H"0#`*`00P`3)`(``HZ#+\`08@`0-`*``(XC`!0`8A@A
+MC&(9(#1"\`"L8AD@CB0`%#0"@```@B`AC((9(#P#``$`0Q`EK((9("0"``$0
+M```"KH(OP*Z`+\`\`@``)$(```!`^`D"("`E``"`)20&``$GI0!L`!`@@"2"
+MT``L0A``$$``$@`0$(`"!A`$KZ(`;).C`&R0H@`!``(2``!B&"60H@`"``(4
+M``!B&"60H@`#``(6``!B&"6.(@`4`$00(:Q#$``0```&)A```8XC`!0`8A@A
+M`@80!*QB$``F$``!*@(`"A1`_^0`$""`KH!&H)8B`>@00``+``"`)3P"```D
+M4@```B`@)0)`^`D"`"@E)A```98B`>@"`A`J%$#_^@(@("4\`@`(-$()9:Z"
+M+$0D`@`&CZ,`O!1B``,\`@`(-$(99:Z"+$2.(P`4CH(L1*QB`*".)``4C((`
+MK#P#``<`0Q`EK((`K(XB$DP00``$/`(``"1"````0/@)`B`@)3P"```D0@``
+M`B`@)30%F&`D!@`!`$#X"0``."4\`@``)$(```(@("4`0/@)CZ4`O(XD`!0T
+M`H```((@(8R"`"`\`_Y_-&/__P!#$"2L@@`@CB,!S"QB``800``')`(`!11B
+M`!``````EB(!T"Q"``@40``,`````(XB`!0T`X```$,0(3P#``$T8P"JK$,!
+M&(XB`!0T`X```$,0(20#,A"L0P$<CB(`%#0#@```0Q`A)`,`4JQ#`0B7P@`"
+M,$(!`!!```,`````$````H*&$HZ"AA*//`(``"1"```"("`E`$#X"0/`*"4`
+M`A8```)&`XZ"+^`P1P`_AH0O]`#D&"."H@`&`$,8*P!$$"$X8P```$,X"X*B
+M``4``A!``$@8(P!G$"L00``"`(`0)0!B."&.@B_@,$8_```&,@*&A"_T`,08
+M(X*B``8`0Q@K`$00(3AC````0S`+@J(`!0`"$$``2!@C`&80*Q!```(`@!`E
+M`&(P(9:%+^`PI0`_AH0O]`"D&"."H@`&`$,8*P!$$"$X8P```$,H"X*B``4`
+M`A!``$@8(P!E$"L00``$+.(`0`"`$"4`8B@A+.(`0"0#`#\`8C@*+,(`0`!B
+M,`HLH@!``&(H"C#D`#\`!A(`,$(_``""("4`!10`/`,`/P!#$"0`@B`ECB(`
+M%#0#@```0Q`AK$0`Z(Z$+]`0@``$`````(XB`!0`0Q`AK$0!((Z%+_@D`O__
+M$*(`!#P"```D0@```$#X"0(@("6.A2_\)`+__Q"B``0\`@``)$(```!`^`D"
+M("`ECH4P`"0"__\0H@`$/`(``"1"````0/@)`B`@)8XD`?@0@``$-`.``(XB
+M`!0`0Q`AK$0`2(^D`+RN)`'<CZ4`Q!"@`"@D`@`!DJ,`!#!B``(40``",&(`
+M_J*B``26H@`"I\(``I*B``2CP@`$DJ(`!:/"``62H@`&H\(`!I*B``>CP@`'
+MCB(2-```("4``"@EK$0`,*Q%`#0\`@``)$(```!`^`D"("`ECB02-*R"`"BL
+M@P`L/`(``"1"```"("`E`$#X"20%``$0```&)`(``8^E`,B,H@``$$```@``
+M$"6LHP``C[\`M(^^`+"/MP"LC[8`J(^U`*2/M`"@C[,`G(^R`)B/L0"4C[``
+MD`/@``@GO0"X`(`P)8S%`@0PH@`#$$``#">]__",Q``4-`*```""("&,@QE$
+M/`+?_S1"__\`8A@D,*(``0`"%T``8A@EK(,91#"B``P00``1``(0@C!"``$4
+M0``)-`.``(S$`!0T`H```((@(8R"`-`D`__C`$,0)!````:L@@#0C,(`%`!#
+M$"&,0P#0-&,`'*Q#`-`#X``()[T`$">]_^BOOP`0C((LM`!`^`D```````(0
+M*X^_`!`#X``()[T`&">]_[BOOP!$K[8`0*^U`#ROM``XK[,`-*^R`#"OL0`L
+MK[``*`"`B"4`H*@E)!0``3P"```D0@```$#X"0(@L"4`0)`E``"`)3P"```D
+M4P``EB(!Z`("$"L00``&`B`@)0)@^`D"`"@E$$#_^280``$``*`E$H``C0``
+M$"6.(@`4-`.```!#$"$D`P`!K$,9?```@"6.(@`4-`.```!#$"&,0AP@%$``
+M#RX"`&0\`@``)%0``#03@``"@/@))`0`!280``$N`@!D$$``>```$"6.(@`4
+M`%,0(8Q"'"`00/_V+@(`9!!``'$``!`E/`(``"1"```"("`E`$#X"0)`*"40
+M0`!J-`.``(XB`!0`0Q`AC$(9%#!%/_^61``",(0`(``%$(`\`[HN-&.+HP!#
+M`!D``!`0%(``!@`"&0(\`LS,-$+,S0"B`!D``!`0``(8PCP"```D0@```$#X
+M"21D`&0\`@``)$(```(@("4"0"@E`$#X"2>F`!`00`!,-`.``(XB`!0`0Q`A
+MK$`9?)9"``(P0@!`$$``'B0$``J.(P',$&0`#20"``D08@`+`````!1D``4`
+M````EB(!T"Q"``040``%`````);"$G`L0E`#%$``"SP"``"6H@`",$(`H"0#
+M`*`00P`%/`(``"1"```"("`E`$#X"0)`*"4\`@``)$(```(@("4`0/@)`J`H
+M)8XC`!0T`H```&(8(8QB&&`T0@`"K&(88))#``0P8@`"%$```C!B`/ZB0@`$
+MED(``J:B``*20@`$HJ(`!))"``6BH@`%DD(`!J*B``:20@`'HJ(`!XXB$C0`
+M`"`E```H):Q$`#"L10`T/`(``"1"````0/@)`B`@)8XD$C2L@@`HK(,`+#P"
+M```D0@```B`@)0!`^`DD!0`!)`(``8^_`$2/M@!`C[4`/(^T`#B/LP`TC[(`
+M,(^Q`"R/L``H`^``"">]`$@GO?_PC((`%#0#@```0Q`AC$8`!#P"__PT0O__
+M`,(P)"0"``$0H@`C**(``A!```4D`@`&$*``%30"@``0```C`````!"B``4D
+M`@`($*(`&0`````0```=`````(R#`!0T`H```&(8(3P"$`$`PA`EK&(`!(R$
+M`!2,@@`4)`/_WP!#$"00```1K((`%(R#`!0`8A@A/`(0`@#"$"6L8@`$C(,`
+M%(QB`!0T0@`@$```!ZQB`!2,@P`4-`*```!B&"$\`A```,(0):QB``0#X``(
+M)[T`$">]_^BOOP`0/`(``21"U]@`0/@))`4``H^_`!`#X``()[T`&">]_^BO
+MOP`4K[``$`"`@"4\`@``)$(`````*"4`0/@))`8``1!```4"`"`E/`(``21"
+MU]@`0/@))`4`$X^_`!2/L``0`^``"">]`!@GO?_0K[\`+*^R`"BOL0`DK[``
+M(`"`B"4`H(`E/`(``21"U]@`0/@))`4`$Q!``*```"@E/`(``"1"```"("`E
+M`$#X"20&``$00`":C[\`+#P"``$D0M?8`B`@)0!`^`D``"@E$$``DX^_`"P2
+M``"1)`(``8XC`<PD!``*$&0`"20"``D08@`'`````!1D``\`````EB(!T"Q"
+M``000``+`````)8#``(P8@`@%$``!202``@P8P#0)`(`P!1B`#@D!``$$```
+M-B0$`.N6(@'4,$(`\"1"_]`L0@!`%$``"0````".(@',.$,`!RQC``$X0@`+
+M+$(``0!B&"408``5`````)8#``(P8@`@%$``!202``@P8P#0)`(`P!1B``,`
+M````$```'B0$`.N6`@`",$)``!1``!HD!`'JE@(``C!"@``D!`#J)`,"ZA``
+M`!0`8B`+E@,``C!B`"`40``%``"0)3!C`-`D`@#`%&(``P`````0```*)`0`
+MJY8"``(P0D``%$``!B0$`:J6`@`",$*``"0$`*HD`P*J`&(@"Y8#``(P8@!`
+M$$``"#!B`"`40``$,&,`T"0"`,`48@`#`````!````4V4@`$E@(``C!"`$`V
+M0P`!`&*0"I8%``(PHP$`-D(``@!#D`HPHP`0)`(``P!`@"4``X`*CB(`%#0#
+M@```0Q`AC$88?#"B`"`40``$,*,`T"0"`,`48@`3`````(XB`!0T`X```$,0
+M(:Q0&`2.(@`4`$,0(:Q2(@`0Q``;)`(``8XB`!0`0Q`AK$08?#P"```D0@``
+M`$#X"20$`2P0```2)`(``1#$``@T`X``CB(`%`!#$"&L1!A\/`(``"1"````
+M0/@))`0!+(XB`!0T`X```$,0(:Q0&`2.(@`4`$,0(:Q2(@`D`@`!C[\`+(^R
+M`"B/L0`DC[``(`/@``@GO0`P)[W_R*^_`#2OM``PK[,`+*^R`"BOL0`DK[``
+M(`"`B"4`H*`E`,"0)0(@F"4\`@``)$(```!`^`FN0````$"`)1(``,&/OP`T
+MCF,OP#AB``(L0@`!+&,``0!#$"400``")`(``:Y"``".9"_`)`(``12"`&$T
+M`X``CB(`%`!#$"&,0AD@/`,``0!#$"040`!:```P):Y@+\"N1```-`F``#P(
+M``&.(@`4`$D8(8QE'!",9!P4C&<<&``$$"L`!1`*%$``"`````",8AD@`$@0
+M):QB&2`DQ@`!*,(`"A1`__$```````4R`@`$$@(`PC`A``1!PBD"``(X0@`!
+M``80"A!``%<`!Q`C``(6```"/@,`Y@`:```0$A3```(```````<`#0!`."4H
+MX__@*.0`("0"`!\`1#@*)`+_X#AC````0S@+`*@`&P``*!(5```"```````'
+M``TDI?^`**/_\"BD`!`D`@`/`$0H"B0"__`X8P```$,H"XXD`!0T`H```((@
+M(8R#&2`D`O@?`&(8)``'$4`P0@?@`&(8):R#&2".)``4-`*```""("&,@AD@
+M)`/_X`!#$"0PHP`?`$,0):R"&2".(P`4-`*```!B&"&,8AD@-$((`*QB&2`D
+M`@`"KF(OP"0"``&N`@`0H@<`%!```!NB!0`5EH(``C!"`*`D`P"@$$,`%B0"
+M``*.8R_`%&(`%#P"``".`@`0%$``$3P"``".(P`4-`*```!B&"&,8AD@-$+P
+M`*QB&2".)``4-`*```""("&,@AD@/`,``0!#$"6L@AD@)`(``:YB+\`\`@``
+M)$(```(@("4`0/@)`@`H)98"``(P0@`"%$``*C0"@`".(P`4`&(8(8QB&&`T
+M0@`"K&(88):%``(PH@$`%$``"@````"6(@'4,$(`\"1"_]`L0@!`$$``(B0"
+M``$PH@!`$$``'R0"``&.)`',.(,`!SB"``L``A`K``,0"A!``!<D`P`*$(,`
+M%20"``D0@@`4)`(``12#``8\`@`!EB(!T"Q"``040``.)`(``3P"``$D0O_H
+M`$#X"0(@("40```()`(``9:"``(T0@`"IH(``I8"``(P0O_]I@(``B0"``&/
+MOP`TC[0`,(^S`"R/L@`HC[$`)(^P`"`#X``()[T`.">]_\BOOP`TK[(`,*^Q
+M`"ROL``H`("()0"@@"46```#K[``)"0"__^OH@`DCB,!S"0"``D08@`')`(`
+M"A1B``<`````EB(!T"Q"``000``#`````"0"_^\"`H`DCB4`%(RB``ROL``@
+MDZ,`(">D`""0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6L
+MHT``/`(``"1"````0/@))`0`#X^B`"0P0@`#KZ(`)#(0``,\`@``)$(```(@
+M("4D!4``CZ8`)`!`^`D"`#@E`$"0)3("``$40``;`D`0)20"`!2OH@`DCB4`
+M%).C`"0GI``DD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+MK*,`%#P"```D0@```B`@)0``*"4`0/@))`8``1!```0"0!`ECB(`%(Q"`,`"
+M0!`EC[\`-(^R`#"/L0`LC[``*`/@``@GO0`XC((`%#0#@```0Q`AC$(89``"
+M%,(P0P'_,&(!`!!```,`````.&(!_P`"&"<#X``(`&`0)92B``(P0P'@)`(`
+MP!!B`!$`````*&(`P1!```8D`@%`)`(`H!!B``@``````^``"```$"448@`*
+M`````)2"$LP0```)I,(``)2"$LX0```&I,(``)2"$M`0```#I,(```/@``@`
+M`!`E)`(``0/@``@`````)[W_V*^_`"2OL@`@K[$`'*^P`!@`@(@E`*"0)8XB
+M`!0T`X```$,0(8Q"&&`P0@`"%$``&```@"4\`@``)$(```!`^`D``````$"`
+M)3P"``$D0MEP`B`@)0)`*"4`0/@))Z8`$!!```F'H@`0`%`0*A!```<`````
+MED(``C1"``*F0@`"$````@``@"4``(`EIE``%@(`$"6/OP`DC[(`((^Q`!R/
+ML``8`^``"">]`"@GO?_PC((!X#P#(```0Q`D$$``&P"`,"6,@P`4)`(``:QB
+M!"",P@`4K$`&`(S#`!2,8@8`-$(`"*QB!@",PP`4/`(`$#1"`@&L8@8$C,(`
+M%*Q`!B```"@EC,(`%*Q%!`",PP`4`*00(9!"+SBL8@0$)*4``2BB`(`40/_W
+M``````/@``@GO0`0)[W_Z*^_`!``@'`E``!@)23)__\`"4C"),;__S#&``<`
+MH$`E&*``'```4"4D#0`()`L``0`'.,``R"`A+((`"0&B(`H`BQ`$)$+__P#+
+M&`0D8___`$,0)@#B$`0`"1B``&X8(8QC````0Q`D`.(0!@#"$`8!0A`$`8)@
+M)0"&(",!1%`A`080(21(__@``#`E'0#_Z24I``$\`@``)$(```!`^`D!@"`E
+MC[\`$`/@``@GO0`8)[W_\`"`0"64P@`",$,!X"0"`,`08@`/`0!()2AB`,$0
+M0``&)`(!0"0"`*`08@`'```0)1```%$`````%&(`3P``$"40```$```8)1``
+M``(D`P`!)`,``@`#&$`E)``$`&00(91'$N:40A+L``(1@`#B."4`9!`AE$(2
+M\@`"$P``XC@E`&00(91"$O@``A2``.(X)0!D$"&40A+^``(6``#B."4`9!`A
+ME$83!)1"$PH``A&``,(P)0!D$"&40A,0``(3``#","4`9!`AE$(3%@`"%(``
+MPC`E`&08(91B$QP``A8``,(P)20"``$0H@`'`````!"@``@D`@`"$*(`!0``
+M$"40```=`````!````(`X#`E`,`X)13'``HT`X``C00`%#0"@```@B`AC((B
+M""0#W_\`0Q`DK((B"!````>M)2^\C0(`%`!#$"&,0R((-&,@`*Q#(@BM)2^\
+MC0(`%#0#@```0Q`AK$<98(T"`!0`0Q`AK$899"0"``$#X``()[T`$(R#`<PD
+M!@`*$&8`&``````D`@`)$&(`%0`````49@`%`````)2"`=`L0@`$%$``$"0&
+M`"B,@@',.$,`!RQC``$X0@`++$(``0!B&"448``()`8`*)2"`=0P0@#P)$+_
+MT"Q"`$`00``")`8`("0&`"B4H@```$8`&P``&!`4P``"```````'``TD8O_V
+M+$(`#3A"``$#X``(``,0"B>]_\"OOP`\K[8`.*^U`#2OM``PK[,`+*^R`"BO
+ML0`DK[``(`"`D"4`H*`EEH(``@`"$<(P50`!EH(``C!#`?`D`@%`$&(`'P)`
+M@"4H8@%!$$``#R0"",`D`@#`$&(`0"AB`,$00``&)`(`T"0"`*`08@`Y```0
+M)1```3R/OP`\$&(`-P``$"40``$XC[\`/!!B`#,H8@C!$$``!B0""4`D`@%0
+M$&(`!P``$"40``$OC[\`/!!B``,D`@E0%&(!*@``$"660@'4,$(`\"1"_]`L
+M0@!`%$``(P``F"6.1`',.(,`!SB"``L``A`K``,0"A!``!PD`P`*$(,`&B0"
+M``D0@@`8`````!2#``4`````ED(!T"Q"``040``2`````(Y$`!0T`H```((@
+M(8R#&40D`O_'`&(8)(X"+"R$0@````(0P#!"`#@`8A@EK(,91!````6.1``4
+M$````B03``$D$P`"CD0`%#0"@```@B`AC(,9$"0"_`8`8A@D`!,00`!0$"&4
+M0A+D``(1``!B&"4T8P`!K(,9$#P"```D0@```D`@)8X%+[P`0/@)`H`P)8Y#
+M`!0T`H```&(8(0`3$$``4!`AE$(2S#!"`?\T0@(`K&(9:)8"$G`L0E``%$``
+M%@`3$$"6@@`",$(`$!!``!$`%2!`)((30"8#``0`8A`AE$4``":B$T@`8A@A
+M@&8```("$"&`1P`&)((32`("$"&42```)(034`($("$0```1E)8````3$$`F
+M!``"`$00(91%$J`"<!`A@$82QB:B$L@"`A`A@$<``0`5&$`D8A*H`@(0(91(
+M```D8Q,P`(,@(926``".1``4-`*```""("&,@QA$)`+`?P!B&"0`!1'`,$(_
+M@`!B&"6L@QA$CD0`%#0"@```@B`AC((84"0#_P``0Q`D,,,`_P!#$"6L@AA0
+MCD0`%#0"@```@B`AC(,84#P"__\T0@#_`&(8)``'$@`P0O\``&(8):R#&%".
+M10`4-`*```"B*"&,I!A(/`+__#1"#_\`@B`D``@3`#P#``,T8_```$,0)`""
+M("6LI!A(CD4`%#0"@```HB@A`!,@0`"0$"&40A*Z``(>```"%```8A@E`)`@
+M(92$$L``!!(``&(8)0!D&"6LHQ@TCD0`%#0"@```@B`AC(,8*#P"__\T0@#_
+M`&(8)``3$$``4!`AE$(2K@`"$@``8A@EK(,8*(Y%`!0T`H```*(H(8RD&&0\
+M`O_X-$(/_P""("0`$Q!``%`0(91"$K0``A,`/`,`!S1C\```0Q`D`((@):RD
+M&&26`A)P+$(P`Q!```LD$0`"ED,!RB0"$"(48@`1`````):"``(P0@!`$$``
+M#0`````0```+)!$`"#P"```D0@```D`@)0!`^`D"@"@E$$``!``3$$``4!`A
+ME$(3)@(BB"&.1``4-`*```""("&,@QDD)`+_`0!B&"0`$1!`,$(`_@!B&"6L
+M@QDDCH(`$!!```0`%1A`@H4`%!````>"A@`5)&(3L`("$"&410`&)&,3N`(#
+M&"&49@`"CD0`%#0"@```@B`AC(,9("0"^!\`8A@D``410#!"!^``8A@EK(,9
+M((Y$`!0T`H```((@(8R"&2`D`__@`$,0)###`!\`0Q`EK((9((Y#`!0T`H``
+M`&(8(8QB&2`T0@@`K&(9()8$$G`L@D`!%$``$R0#`-"6@@`",$(`T!1#``,L
+M@E``%$``#0````".10`4-`*```"B*"&,I"(,/`+_`S1"__\`@B`D`!84@#P#
+M`/P`0Q`D`((@):RD(@R6`A)P+$)0`11```8D`@`!CD(`%#0#@```0Q`AK$`9
+MX"0"``&/OP`\C[8`.(^U`#2/M``PC[,`+(^R`"B/L0`DC[``(`/@``@GO0!`
+M)[W_B*^_`'2OO@!PK[<`;*^V`&BOM0!DK[0`8*^S`%ROL@!8K[$`5*^P`%``
+M@)`E`*#P):^@`!"OH``4KZ``&*^@`!ROH``@KZ``)*^@`$@``+@EKZ``3"0#
+M``&GHP`H)`(``J>B`"JGH@`LIZ,`+J>C`#"GH@`RIZ,`-)?"``(``A'",%0`
+M`1*```>7PP````,0@`!#$"$``A!`)$*F*!````@P0O__``,0@`!#$"$``A!`
+M/`/__S1C0)@`0Q`A,$+__P!`F"67P@`X%$``'P!`B"4T$8``)`(`5Y?#``(P
+M8P`0)`0`KCAC````@Q`+``"`)0)BL",0```"`F*H(3!0__\N`@`%$$``#P)`
+M("6.0@'$`@`H)0!`^`D"@#`E-`.``!!#``@P0S__`'80*A1`__,F`@`!`J,0
+M*A1`__`F`@`!`&"():?1`#@T`H``%B(`4@````".0@`4`%$@(8R"&2`\`T``
+M`$,0)!!``6D`````C((9##P#`/\T8___`$,0)*R"&0R.0P`4-`*```!B&"&,
+M9!D@/`*/_S1"__\`@B`DK&09#(Y"`!0T`X```$,0(:Q`&:".0@`4`$,0(:Q`
+M&8".1``4-`*```""("&,@AF$/`/_\`!#$"2L@AF$CD(`%#0#@```0Q`AK$`9
+MF(Y$`!0T`H```((@(8R"&9P\`__P`$,0)*R"&9R.0@`4-`.```!#$"&L0!D`
+MCD(`%`!#$"&L0!D$CD(`%`!#$"&L0!D(CD0`%#0"@```@B`AC((9#"0#P```
+M0Q`DK((9#(Y"`!0T`X```$,0(:Q`&8B.0@`4`$,0(:Q`&8R.0@`4`$,0(:Q`
+M&9".1``4-`*```""("&,@AF4)`/```!#$"2L@AF4$``!((^_`'27P@`",$4!
+M\"0"`-`0H@`P`C,@(RBB`-$00``&)`(!0"0"`,`0H@`6)`(#Z!```#9P@A@"
+M$*(`!20"`5`0H@`D)`(#Z!```#!P@A@"``2\0#P"4>LT0H4?`N(`&```$!``
+M`A##`!<?PP!#N",`%Q*#KZ(`3"0###40```AKZ,`2``$*@`\`@E/-$(@E0"B
+M`!@``!`0``(00P`%'\,`0Q`CKZ(`3``$O$`\`E'K-$*%'P+B`!@``!`0``(0
+MPP`7'\,`0[@C)`(,-1````VOH@!(``2\`#P"4>LT0H4?`N(`&```$!```A##
+M`!<?PP!#N",`%Q*#KZ(`3"0#&&JOHP!()`(#Z'""&`(``QD`CZ0`2`!D`!H`
+M`!`2%(```@``````!P`-`$`8)3!B``\D"``$%$```R>E`"@D"``#)Z4`,!$`
+M`%H``(`E``,Q`RC)`!TD!P`!$2``R`#0$"$D1``9+((`(1!``!$D@__?*((`
+M&A!```8H@@`;`(<0!(^C`!``0Q`E$```$*^B`!`40``/)((``22"__\`1Q`$
+MCZ,`$`!#$"40```(KZ(`$"QB`!000``&)((``0!G$`2/HP`4`$,0):^B`!0D
+M@@`!+$(`$!!```LD@O_Q`!`00`!%$"&40P````000"1"``(`0Q@$CZ(`&`!B
+M&"40```GKZ,`&"Q"`!`00``+)(+_X0`0$$``11`AE$,````$$$`D0O_B`$,8
+M!(^B`!P`8A@E$```&J^C`!PL0@`0$$``"R2"_]$`$!!``$40(91#````!!!`
+M)$+_P@!#&`2/H@`@`&(8)1````VOHP`@+$(`!Q!```LF`@`!`!`00`!%$"&4
+M0P````000"1"_Z(`0Q@$CZ(`)`!B&"6OHP`D)@(``3!0__\""!`J%$#_JP``
+M``".1``4-`*```""("&,@AD,/`,`_S1C__\`0Q`D/`/_``!#$"6L@AD,CD,`
+M%#0"@```8A@AC&09(#P"<```@B`EK&09((Y$`!0T`H```((@(8^E`$P`!1T`
+M/`(_\`!B&"0\`@`/-$+__P+B$"0`8A@E/`)```!B&"6L@QF@CD(`%#0#@```
+M0Q`ACZ,`$*Q#&8".10`4-`*```"B*"&,I!F$/`+_\`""("2/H@`4/`,`#S1C
+M__\`0Q`D`((@):RD&82.0@`4-`.```!#$"&/HP`0K$,9F(Y%`!0T`H```*(H
+M(8RD&9P\`O_P`((@)(^B`!0\`P`/-&/__P!#$"0`@B`EK*09G(Y"`!0T`X``
+M`$,0(8^C`!BL0QD`CD(`%#0#@```0Q`ACZ,`'*Q#&02.0@`4-`.```!#$"&/
+MHP`@K$,9"(Y$`!0T`H```((@(8R#&0PD`L```&(8)(^B`"0P0C__`&(8):R#
+M&0R.0@`4-`.```!#$"&/HP`8K$,9B(Y"`!0T`X```$,0(8^C`!RL0QF,CD(`
+M%#0#@```0Q`ACZ,`(*Q#&9".1``4-`*```""("&,@QF4)`+```!B&"2/H@`D
+M,$(__P!B&"6L@QF4C[\`=(^^`'"/MP!LC[8`:(^U`&2/M`!@C[,`7(^R`%B/
+ML0!4C[``4`/@``@GO0!X`(`X)3P$9`"4H@`",$(`$#P#R``X0@```&(@"Y2B
+M``(P0D``$$```R>]__`0```%``0@0I2B``(P0H````08@@!B(`N4H@```((`
+M&P``&!(40``"```````'``T`8"`E!(``!R0&`!\DQO__$,``!`#$$`8P0@`!
+M$$#_^P`````D`@`F`$8P(R0"`!<`1A`C)`,``0!#&`0`@Q@A)`(`&`!&$",`
+M0Q@&),;_\(SE`!0T`H```*(H(8RB&!0\!``!-(3__P!$$"0``QQ``$,0):RB
+M&!2,Y``4-`*```""("&,@Q@4/`+__C1"'_\`8A@D``8S0#P"``$T0N```,(P
+M)`!F&"6L@Q@4`^``"">]`!`GO?_@K[\`&`"`,"4LHP!`)`(`/P!#*`JDQ0'\
+M/`(``"1"``",Q1(T`$#X"2>F`!"/OP`8`^``"">]`"`GO?^HK[\`5*^T`%"O
+MLP!,K[(`2*^Q`$2OL`!``("0)0"@F"4`P*`E`D"()3P0```F$```CB1&>`(`
+M^`F.)49\)B1&@`(`^`DD!0`@AB(!_"A"`$`40``"EB,!_"0#`#\``Q0```(\
+M`RCC`#\X8P`!,.+__RQ"``$`8A@E$&``!SP#```D8Q[(CD("```"$$``0Q`A
+M$````H1&`````#`E)`(``:^B`!`GH@`@KZ(`%">B`"*OH@`8/`(``21"\'`"
+M0"`E`$#X"0)@*"400`#<`D`@):^T`!".(BR\)Z4`(">F`"(`0/@)`F`X)1!`
+M`-6/OP!4CD0!S#B#``<X@@`+``(0*P`#$`H00``.)`,`"A"#``PD`@`)$((`
+M"P``,"44@P`%`````)9"`=`L0@`$%$``!B0%`#^6(D:>)$(`!*8B1IX``#`E
+M)`4`/P`&$$`D0D:``B(@(92"``"6(R_T`$,0(:2"```P0O__+$(`0!1```(`
+M````I(4``"3&``$LP@`0%$#_\@`&$$"6(A*>+$(``A!``%D`````ED(!TBQ"
+M`$(00``>)`,`P)9B``(P0@#0%$,`&B0"";268P``%&(`#3P#9F:2(A*2EB,2
+MG`!#$",\`V9F-&-F9P!#`!@``!@0``,80P`"%\,`8A@C$```!S!E__^2(A*2
+M-&-F9P!#`!@``!`0``(00S!%__\\`@`!)$+X*`!`^`D"0"`E```P)2>G`#@T
+M"*&```8@@"2"88`L0A``$$``'0````".(D9X`((0(91#``(``QH`-&,`_P`#
+M'`"40@````(2`#1"`/\P0O__`&(8):^C`#B3HP`XD.(``0`"$@``8A@ED.(`
+M`@`"%```8A@ED.(``P`"%@``8A@ECD(`%`!$$"$`2!`AK$,``!```!$DQ@`!
+MCD4`%`"D*"$`J"@ACB)&>`""("&4@P`"``,:`#1C`/\``QP`E((````"$@`T
+M0@#_,$+__P!B&"6LHP``),8``2C"`"`40/_.``8@@(Y$`!0T`H```((@(98C
+M1H8P8P`_``,>`)8B1H0P0@`_``(4``!B&"66(D:",$(`/P`"$@``8A@EEB)&
+M@#!"`#\`8A@EK(,9-(Y$`!0T`H```((@(98C1HXP8P`_``,>`)8B1HPP0@`_
+M``(4``!B&"66(D:*,$(`/P`"$@``8A@EEB)&B#!"`#\`8A@EK(,9.(Y$`!0T
+M`H```((@(98C1I0P8P`_``,>`)8B1I(P0@`_``(4``!B&"66(D:>,$(`/P`"
+M$@``8A@EEB)&D#!"`#\`8A@EK(,B-(Y$`!0T`H```((@(98C1IPP8P`_``,>
+M`)8B1IHP0@`_``(4``!B&"66(D:8,$(`/P`"$@``8A@EEB)&EC!"`#\`8A@E
+MK(,B.(Y$`!0T`H```((@(8XE+]PD`@`_)`,`?P!E$`NL@AD\)`(``8^_`%2/
+MM`!0C[,`3(^R`$B/L0!$C[``0`/@``@GO0!8)[W_D*^_`&ROO@!HK[<`9*^V
+M`&"OM0!<K[0`6*^S`%2OL@!0K[$`3*^P`$BOI`!P`*"@)0`&-```!C0#KZ8`
+M.``'/```!SP#KZ<`/`"`B"4F,T:`)!X`/X*"``4``A!`,$+__Z^B`$`D`O_!
+MCZ,`B*1B``"/H@"$I%X``#P"```D0@```$#X"205`#\P4@#_``"`)8^C`'"4
+M8A-T$$``)Z^@`$0F-P`&,E8`^``0$$`D0A-P`N(0(91#```08``:,D3__Q!D
+M``8`$"F`E$(``#!"``<T0@#@%((`$P`````")2@AEH0``#P#``$D8_G,`&#X
+M"22E%]0D!`#@%L0`"`!`&"4P8O__`J(0*Q!```(``````J`8)1````,P=?__
+M$```!@!`J"4F$``!EB(3=`("$"H40/_>`!`00):"``(P0@#0)`,`P!1#`"TR
+M0@#X-%(``98B$W000``J``"`)28W``8R5@#X`!`00"1"$W`"XA`AE$,``!!@
+M`!HR1/__$&0`!@`0*8"40@``,$(`!S1"`.`4@@`3``````(E*"&6A```/`,`
+M`21C^<P`8/@))*47U"0$`.`6Q``(`$`8)3!B__\#PA`K$$```@`````#P!@E
+M$````S!^__\0```)`$#P)280``&6(A-T`@(0*A1`_]T`````$````Y:"``("
+MH/`EEH(``C!"`0`00``#`````!````*")A*.@B82CSP"```D0@``CZ0`<`!`
+M^`D"@"@E``(6```"A@.6@P`",&(`0!!``)@P8@"`$$``"R>B`!B6)Q><KZ(`
+M$#P"``$D0ON4CZ0`<`*`*"4`0/@))B87GA````J/I0!`EB<72J^B`!`\`@`!
+M)$+[E(^D`'`"@"@E`$#X"28F%TR/I0!``+`0(P*B&"H"HQ`+``(4```"-`.6
+M@@`",$(`$!!``!B7H@`>EB(2<"Q",`$40``&`````)8B$GX`PA@J`,,0"P`"
+M%````C0#EB(2<"Q"0``40``+EZ(`'I:"``(P0@"`$$``!Y>B`!Z6(A*``,(8
+M*@##$`L``A0```(T`Y>B`!X`PA@J`,,0"P`"%````A0#KZ(`1(^C`#@``Q!`
+MCZ0`1`""$",``A0```(T`P`&$"<``A?#``(P"H^E`#P`Q1`J$$```@"@&"4`
+MP!@E``,4```"-`./H@"`$$``0##"__^F9@`(IF8`!J9F``2F9@`"IF8``)>D
+M`!PP@___`$,0*Q!```(`P"@E`,`@):9D``J7I``:,(/__Y9B````0Q`K$$``
+M`@````"69```IF0`#)>D`!@P@___EF(```!#$"L00``"`````)9D``"F9``.
+M``04```"'`.6(A)P+$)``!1``!@`````EH(``C!"`(`00``'`,`@)98B$H0`
+MPA`J$$``!P#`$"40```0IF(`'I8B$H(`@A`J%$``"`#`$"66@@`",$(`@!!`
+M``,`````$````I8B$H26(A*"$````Z9B`!Z68@``IF(`'H^D`(B$@@``$```
+M!ZXB+_``P"@EEZ(`&`#"&"H`PQ`+``(4```"'`./H@"$I$,``(^C`(BD90``
+MEH,``C!B`"`40``$,&,`T"0"`,`48@!3CZ0`@)8G%[PGH@`HKZ(`$#P"``$D
+M0ON4CZ0`<`*`*"4`0/@))B87OH^D`$``D!`C`\(8*@/#$`L``A0```(T`Y>B
+M`"X`PA@J`,,0"X^D`#@`!!A``$,0(P`"%````C0#``80)P`"%\,``C`*CZ4`
+M/`#%$"H00``"`*`8)0#`&"4``Q0```(T`X^B`(`00``8EZ(`+@#"&"H`PQ`+
+MIF(`$)>B`"P`PA@J`,,0"Z9B`!(``AP```,D`Z9B`!27H@`J`,(8*@##$`NF
+M8@`6IF(`&)>B`"@`PA@J`,,0"Z9B`!H``AP```,<`Q````NF8@`<EZ(`+`#"
+M&"H`PQ`+``(4```")`.7H@`H`,(8*@##$`L``A0```(<`X^E`(2$H@```&(0
+M*A!```(`````I*,``(^C`(B$8@```$00*A!```(`````I&0``(^D`(`0@``&
+MCZ4`B(2B``"N(B_(EB(ORH^C`'"D8@'^)`(``8^_`&R/O@!HC[<`9(^V`&"/
+MM0!<C[0`6(^S`%2/L@!0C[$`3(^P`$@#X``()[T`<">]_["OOP!,K[X`2*^W
+M`$2OM@!`K[4`/*^T`#BOLP`TK[(`,*^Q`"ROL``H`("@):^E`%2.@BS``$#X
+M"0#`N"400``\C[\`3(:"`?PH0@!`%$```I:#`?PD`P`_``,4```"G`,J8P`_
+M.&,``3)B__\L0@`!`&(8)1!@``<\`P``)&,>U(Z"`@```A!``$,0(1````*$
+M4@````"0)1+@`",``(@E)[8`(">U`"(\`@`!)%[P<``1$,"/HP!4`&*`(:^@
+M`!"OM@`4K[4`&`*`("4"`"@E`D`P)0/`^`D"8#@E$$``%(^_`$R'H@`B@@,`
+M!@!#$"H00``$AZ(`().B`".B`@`&AZ(`(((#``<`0Q`J$$```I.B`"&B`@`'
+M)C$``0(W$"L40/_D`!$0P"0"``&/OP!,C[X`2(^W`$2/M@!`C[4`/(^T`#B/
+MLP`TC[(`,(^Q`"R/L``H`^``"">]`%`GO?_`K[\`/*^R`#BOL0`TK[``,`"@
+MD"4`@(`EAA$2FCP"```D0@``)Z0`$"8%1H``0/@))`8`("0)``@GJ@`0)`T`
+M""0.`#\`"1A``4,8(91B````41`CI&(`````."4``%@E``E@0`!@,"6$P@``
+M!$$``@````"DP```%.T``P%,*"$0```:)`<`#Y2H``"$I`````<00`!0$"&4
+M0T:`).(``12#`!(P1___%(``!"UB`#,E`@`!$```"J2B```40``%`````)3"
+M```D0@`!$```!*3"``"4P@``)$+__Z3"`````#@E)6(``3!+__\LX@`0%$#_
+MW0`)$$`!0A@AA&(``"A"`$`40``"``D@0*1N````D!`AE$)&@`!2$",H0P``
+M``,0"P%$("&$@P``C@1&>``#&$``9!@A``(00`!$$"&40@``I&(``"4B``$P
+M2?__+2(`#Q1`_[P`"1A`)`D`"">D`!``"1!``%`8(0""$"&40@``I&)&@"4B
+M``$P2?__+2(`#Q1`__>/OP`\C[(`.(^Q`#2/L``P`^``"">]`$`GO?_`K[\`
+M/*^R`#BOL0`TK[``,`"@B"4PDO__EB(``!!``!$``#`E)Z0`&``&&$``@Q@A
+M``80P`!1$"&40@``I&(``"3&``$HP@`($$``!P#`@"4`!A#``%$0(91"```4
+M0/_S``880`#`@"4GH@`JKZ(`$#P"```D0@```D`@)2>E`!@PQO__`$#X"2>G
+M`"@:```.```P)9>C`"B7H@`8$&(`#)>B`"HGI``8),8``0#0$"H00``%``80
+M0`""$"&40@``%&+_^0````"7HP`HEZ(`*A1B``,`!A#`$'(`!@``````41`A
+MC$(`!!!```0D`P`_``80P`!1$"&40P`"`&`0)8^_`#R/L@`XC[$`-(^P`#`#
+MX``()[T`0#"$__\PI?__,,;__S#G__^7J``2<.@8`A!@`"(``!`E$,4`'B0#
+M`&0`A1`C<$,0`@#%&",`0P`:```0$A1@``(```````<`#0`"%````B0#!(``
+M$P#@&"4H@@!E$$``$`$`&"4D`@!D`$00(P!'`!APB``````8$CP"4>LT0H4?
+M`&(`&```$!```A%#``,?PP!#$",0```",$/__P#@&"4`8!`E`^``"``````G
+MO?^XK[\`1*^T`$"OLP`\K[(`.*^Q`#2OL``P`*"8)0#`D"6/M`!8,/#__Q(`
+M``X``"`E)Z4`&``$&$``HQ@A``00@`!$$"$``A!``%(0(91"``BD8@``)(0`
+M`0"0$"H40/_V``080)9D```GH@`JKZ(`$#P"```D0@``)Z4`&`(`,"4`0/@)
+M)Z<`*```2"4``#@E```@)2>E`!B7J``HEZ8`*@"0$"H00``,``000`"B$"&4
+M0@``,(/__P$"$"8`8C@*``000`"B$"&40@``%,+_]"2$``$`8$@EEF0``)>E
+M`"B7I@`J``>(@`(GB"$`$8A``C*((98G``8`"8"``@F`(0`0@$`"$H`AE@(`
+M!CP2``$F4OKH`D#X":^B`!"F@@`&EF0``)>E`"B7I@`JEB<`!)8"``0"0/@)
+MKZ(`$*:"``269```EZ4`*)>F`"J6)P`"E@(``@)`^`FOH@`0IH(``I9D``"7
+MI0`HEZ8`*I8G``"6`@```D#X":^B`!"F@@``C[\`1(^T`$"/LP`\C[(`.(^Q
+M`#2/L``P`^``"">]`$B/J@`0,,;__S"$__\D`P!D<(,@`@`&,$"4H@``<$,0
+M`B1"__8`@A`K$$``!0"F,"&4H@``I4(```/@``BDX@``E,+__B0#`&1P0Q`"
+M)$(`"@!$$"L00``-`*80*Y3"__ZE0@```^``"*3B``"E0P```^``"*3C``"4
+MH@``I.(``)2B``(#X``(I4(``!!``!0`!!0`)`@`9``"3`.$H@``<$@0`@!)
+M$",D0@`)+$(`$Q1`_^Z4HP``E*(``G!($`(D0O_V`((0*Q1`_^L`````)*4`
+M`@"F$"L40/_P``````/@``@``````(`P)93"`=0P0@#P)$+_T"Q"`$`00``2
+M),4L$#P$```DA"!0C(,`!*S#+!```Q#``$,0(0`"$(`DA``(`$00(:S"+"PD
+M`@`!K,(L*"0"`!2LPBP<)`(`50/@``BLPBP@/`0``"2$'N",@P`$K*,````#
+M$,``0Q`A``(0@"2$``@`1!`AK*(`'"0"``&LH@`8)`(`%*RB``PD`@`C`^``
+M"*RB`!`GO?_HK[\`%*^P`!``@!@EE&(!U#!"`/`D0O_0+$(`0!!``!8`H(`E
+MC&(LL`!`^`DD!0`'/`,``21CVQP`0"`E)`4``20&`"0`8/@)```X)0``2"4D
+M"`!K```P)20#``$40P`B)`<`:R0(`%,D!P!3)`(`-Q```!VN`@`0C&(LL`!@
+M("4`0/@))`4`!SP#``$D8]L<`$`@)20%``8D!@`E`&#X"0``."4``$@E)$0`
+M!"0#`#(X0@`_`&!`)0""0`LD`P!``&`P)0`",`HDQP`R)`,`%``"&`NN`P`,
+M),0`(R3#`#<`@A@*K@,`$(X%``0`J1`K`048*P!#$"400``$```@)0"F&"L`
+MY1`K`&(@)0"`$"6/OP`4C[``$`/@``@GO0`8)[W_\(2"+_2,@R_P`$,0(8R%
+M`!0T`X```*,H(0`"$D`P0GX`-$*``*RB&3`D`@`!K((OQ`/@``@GO0`0)[W_
+MX*^_`!ROL@`8K[$`%*^P`!``@(@E`B"0)28P+!".(RPH$&``10``$"6.(R_$
+M)`(``11B`$`T`X``CD(`%`!#$"&,0QDP,&*``!1``#H``R9"``,5PC!"``,D
+M`P`"%$,`#*X$``260@'2+$(`0A1```4`````EB(2F@!$$"$0```$K@(`!(X"
+M``0D0@`%K@(`!)9"`=0P0@#P)$+_T"Q"`$`00``,/`(``21"`U@`0/@)`D`@
+M)8X$``2.`P`4`(,0*Q1```,`@Q`C$````JX"``2N```$KB`OQ#P"``$D0O[$
+M`D`@)0!`^`D"`"@E%$``$3P"``$D0@%X`D`@)0!`^`D"`"@E$$``"SP"``$D
+M0@&H`D`@)0!`^`D"`"@E&$``!20"``*N(B_$)`(``:XB+]BN("_`CB(OQ(^_
+M`!R/L@`8C[$`%(^P`!`#X``()[T`((RC``2,H@`,`$,0*Q!```4``"`EC*(`
+M$`!B$"L40``"`````"0$``$#X``(`(`0)0"@."64@@'4,$(`\"1"_]`L0@!`
+M/`,``!1```,D:"!0/`(``"1('N",Y`````00P`!$$"$``A"``0(0(21"``BL
+MX@`<C.(`!(SC`!``0Q`K%$``)``````0@`!3)`+__XSB``2LX@`(C.,`$`!#
+M$"L40``:`&!()8SB```00``7`````(SB```D1O__K.8````&(,``AB`A``0@
+M@`"($"&,Y0`<C$,`&(RB`!``8A@C``,80(SB``@`0Q`CK.(`"`$$("$DA``(
+M`$D0*Q1```.LY``<%,#_ZP`````#X``()`(``8SB``2,XP`,`&(8*Q1@`"T`
+M`!`EC0,``"1C__^,Y```$(,`*"0"__Z,XP`$K.,`"(SB``P`0$@E`$,0*Q1`
+M`"$D`@`"C0,``"1C__^,X@```$`@)0!#$"L00``:)`(``B2&``&LY@````8@
+MP`"&("$`!""``(@0(8SE`!R,0P`8C*(`$`!B&",``QA`C.(`"`!#$".LX@`(
+M`00@(22$``@!(A`K%$``!JSD`!R-`@``)$+__P#"$"L40/_I`,`@)20"``(#
+MX``(`````">]_]BOOP`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@(@E)C(L$*X@
+M+"2.(BRP`$#X"20%``<\`P`!)'3;'`!`("4D!0`!)`8`)`*`^`D``#@E`$"8
+M)20"``$68@`AC[\`)(XB+"R$4```CB(LL`(@("4`0/@))`4`!P!`("4D!0`$
+M)`8`(`*`^`D``#@E$A,`"P!`&"42```')`(``A("``DD`@`#$@(`"X^_`"00
+M```-C[0`(!````FN0``4$```!ZY#`!0``Q!`)$+_^Q````.N0@`4``,00*Y"
+M`!2/OP`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_^"OOP`<K[(`
+M&*^Q`!2OL``0`("0)0#`B"4`X(`E/`(``"1"````H"`E`$#X"0(@*"4`0#@E
+M)@;__P`&,,(F$/__&B``'S(0``<D"@`()`D``8^B`#```D#``A$8(2AB``D!
+M0A@*`&D8!"1C__\""1`$)$+__P!B&"8!`Q@$``8H@`"R*"$``R`GC*(```""
+M("0"!Q`$`0(0!`!#$"0`1!`EK*(```(P$"$D4?_X`5`0(P!'.`8``(`E'B#_
+MYR3&``&/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?^@K[\`6*^W`%2OM@!0
+MK[4`3*^T`$BOLP!$K[(`0*^Q`#ROL``X`*"X)9;B``(P0D``$$``!P"`F"4\
+M`@``)$(```!`^`DD!0(`$```%`!`D"66X@`",$*``!!```<\`@``)$(```)@
+M("4`0/@))`4$`!````H`0)`EEN,``C!C`!`D!@$`)`4``B1"```"8"`E`$#X
+M"0##*`H`0)`ECD(``!A``#T``(@E/`(``"16```GM``H-!6'```1$$``41`A
+M``(0@"1"`"`"0H`AD@(`"``"$(`D0D<`+$(0`!!``!D"8"`ED@<`"Z^@`!`"
+M0"@E`L#X"20&``ZOH@`HDZ0`*)*"``$``A(``((@)9*"``(``A0``((@)9*"
+M``,``A8``((@)9(#``@``QB`CF(`%`!#$"$`51`AK$0``!```!(F,0`!`!&`
+M0`(1@"$`$("`)A``(`)0@"&2!P`+KZ``$`)`*"4"P/@))`8`#I($``@`!""`
+MCF,`%`!D&"$`=1@AK&(``"8Q``&.0@```B(0*A1`_\H`$1!`EN(``C!"`!`4
+M0`!SC[\`6#P"```D0@```F`@)0!`^`DD!0`(`$"0)8Y"```80`!I``"()3P"
+M```D5@``)[4`+"07``$GM``P`!$00`!1$"$``A"`)$(`(`)"&"&08@`(``(@
+M@#0"AP``@H`AD&(`!11``%,D@D<`+$(0`!!``!8"8"`ED&<`"Z^@`!`"0"@E
+M`L#X"20&``ZOH@`LDZ,`+)*B``$``A(``&(8)9*B``(``A0``&(8)9*B``,`
+M`A8``&(8)8YB`!0`4!`AK$,``!````X`$1!``!$00`!1$"$``A"``%(0(9!'
+M`"NOH``0`D`H)0+`^`DD!@`.CF,`%`!P&"&L8@```!$00`!1$"$``A"`)$(`
+M(`)"&"&08@`)$$``)P`"$(`"`H`A)@+``"Q"$``00``6`F`@)9!G``NOMP`0
+M`D`H)0+`^`DD!@`.KZ(`,).C`#"2@@`!``(2``!B&"62@@`"``(4``!B&"62
+M@@`#``(6``!B&"6.8@`4`%`0(:Q#```0```.)C$``0`1$$``41`A``(0@`!2
+M$"&01P`KK[<`$`)`*"4"P/@))`8`#HYC`!0`<!@AK&(``"8Q``&.0@```B(0
+M*A1`_Y\`$1!`C[\`6(^W`%2/M@!0C[4`3(^T`$B/LP!$C[(`0(^Q`#R/L``X
+M`^``"">]`&`GO?_PC((`%#0#@```0Q`AC$(`'#!'/X"4H@`",$)``!!```<D
+M"@$$/`L?@#P&`!LD!0`3)`@-K!````<D"0`4)`H`TCP+'X`\!@`V)`4`"20(
+M#4@D"0`*C(,`%#0"@```8A@A`*<0)0!&$"4`2Q`EK&(`'(R"`!2L2A!PC((`
+M%*Q($+",A``4C((0\#P#__`T8P/_`$,0)``)&H``0Q`EK((0\`/@``@GO0`0
+M```````````GO?_(K[\`,*^S`"ROL@`HK[$`)*^P`"``@)@E`*"`)8YC+$0\
+M!7__-*7__SP"```D0@```$#X"0!E*"0`0"@ECF(`%(Q&`#`PT0/P`!&)`@(@
+MD"4N(@`"+$(``1(```4"0I`C)`(`)0!1$",``A!"`B*0(1)1``<D`_P/CF0`
+M%`##&"0`$A$`,$(#\`!B&"6L@P`P/`(``"1"````0/@)`F`@)0)1$"8``A`K
+MC[\`,(^S`"R/L@`HC[$`)(^P`"`#X``()[T`.">]_^BOOP`0`*`X)0"`0"64
+M@P'H`.,8*A!@``D``!`E``<I``"G*",`!2B``04H(3P"```D0@```$#X"22E
+M+."/OP`0`^``"">]`!@GO?_HK[\`$`#`0"4`@#@EE(,!Z`"C&"H08``*```0
+M)0`%,0``Q3`C``8P@`#F,"$\`@``)$(```$`*"4`0/@)),8LX(^_`!`#X``(
+M)[T`&">]_]"OOP`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("@)0"@D"4`
+MP*@E)H,!X"0"``(20@`0)!,`"RY"``,00``&)`(``R0"``$20@`@)`+__Q``
+M`%J/OP`H$D(`##P"``4D`@`$$D(`#B0"__\0``!3C[\`*)1Q``@F,?__/`(`
+M!31"`,`0```H`F*8)91Q``@F,?_^-$(!P!```","8I@EE'$`""8Q__T`$1$`
+M`%$0(P`"$(``1!`AC$(LY!!``!H`````$```/"0"__^48@`($$``$0``B"6,
+M@BSD$$``#0````"49@`()(4`!"8Q``$")A`J$$``!P`1$0``41`C``(0@`!%
+M$"&,0BS@%$#_]P````"48@`(%B(``P`````0```E)`+__P`1$0``41`C``(0
+M@`""@"$F$"S@C@,`!!1@`!TD`O__/`(``"1"```"`"`E`$#X"20%`#P6H``-
+MKA(`!*X3``PD`@`"K@(`%"0"__^N`@`8)`(#_ZX"`!PD`@`*I@(`(*8"`"(0
+M```)K@``-(ZB`#"N`@`T/`(``"1"```"@"`E`B`H)0!`^`D"H#`E`B`0)8^_
+M`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`,">]__``@#@EC(8`
+M%(R%+,PPI0/_C((LU``"%``\`P/_`$,0)`"B*"6LQ0"DC.8`%(R%+-`PI0/_
+MC((LV``"%```0Q`D`*(H):S%`*B,Y0`4C*,`K"0"_```8A@DC((LW#!"`_\`
+M8A@EK*,`K`/@``@GO0`0)[W_Z*^_`!``H#@E`(`P)92#`>@`XQ@K$&``(```
+M$"4`!Q$``$<0(P`"$(``PB@A)*4LX(RC``008``8```0):R@``0D`P`!`.,8
+M!``#&">,PBS,`&(0)*S"+,R,PBS0`&(0)*S"+-",PBS4`&(0)*S"+-2,PBS8
+M`&(0)*S"+-B,PBS<`&(8)#P"``$D0@S$`$#X":S#+-PD`@`!C[\`$`/@``@G
+MO0`8)[W_B*^_`'``@%@E`*!0)0%@2"6-9!(TE6,!Z`%#&"L08`)!```0)0`*
+M$0``2A`C``(0@`$B,"$DQBS@C,,`!!!@`CDD`@`!C,,`&"0"__\48@",````
+M`!"``'XD`P"@E((``C!"`*`40P!Z)`,`'Q```'HD!``!,(0#_XS"`!P``A*`
+M-&/\``!#$"0`@B`EC,(`%``"%0`\`P_P`$,0)`""("6OI`!`DZ,`0">D`$"0
+M@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6-8@`4`$40(:Q#
+M$$`0``!^``HH@)3#`"(``QD`,&,`\)3"`"`P0@`/`&(8)3P"``@T0B```&(8
+M):^C`$23HP!$D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+MC6(`%`!%$"&L0Q"`$```=R0%"``T8___`(,8)(S"`"@``A8``&(8):^C`$B3
+MHP!()Z0`2)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)8UB
+M`!0`2!`AK$,(P!```'4D`O_P-$+__P!B$"0\`P$``$,0):^B`$R3HP!,)Z0`
+M3)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)8UB`!0`2!`A
+MK$,)`!```'<`"D"`C,(`+#1C__\`0Q@D``(0*P`"%0``0Q`EKZ(`4).C`%`G
+MI`!0D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EC6(`%`!(
+M$"&L0Q#`$```;XS"`#`D`P`/)`0``0"#$"L00``*``HH@``$$$`T1``!`(,0
+M*Q1`__T`!!!`$````P`**(",Q``8``HH@"2BT$`L0A``%$#_>#P#``\`H!`E
+MC64`%`"B*"$PA`/_C,(`'``"$H`T8_P``$,0)`""("6,P@`4``(5`#P##_``
+M0Q`D`((@):RD$$``"BB`)*+0@"Q"$``40/^`)Z0`1`"@$"6-9``4`((@(93#
+M`"(``QD`,&,`\)3"`"`P0@`/`&(8)3P"``@T0B```&(8):R#$(`D!0@`C,0`
+M)!"``!<D!P$```I`@"4"R,`L0A``%$#_@SP#`/\!`!`EC60`%`""("&,PP`D
+M/`(`_S1"__\`8A@DC,(`*``"%@``8A@EK(,(P"0"__``HB@D-*4``8S#`"@T
+MH@$``$,H"XS#`#`08``/``I`@"4"R0`L0A``%$#_@3P"`/\!`!`EC60`%`""
+M("$`8!`E/`,`_S1C__\`0Q`D/`,!``!#$"6L@@D```I`@"4"T,`L0A``%$#_
+MASP#``\!`!`EC60`%`""("&,P@`L-&/__P!#&"0``A`K``(5``!#$"6L@A#`
+MC,(`,!!```0THP(`C,(`##!"`"``8B@+C,(`##!"`$`00``#)`+_\`"B*"0T
+MI0`",*(`#Q!```\`````C,(`##!"`0`00``#)`+_OQ````(TI0!``*(H)(S"
+M``PP0@"`$$```R0"_]\0```"-*4`(`"B*"2,P@`,/`,``0!#$"000``"/`(`
+M(`#B."6,P@`,/`,`@`!#&"0TY`(``(,X"SP#``0`0Q`D$$```SP"``(0```&
+M`.,X)8S#``P`8A@D`.(0)3AC````0S@+C,0`##P"``@`@A`D-.-```!B.`L\
+M`@`0`((@)`#B$"4XA````$0X"XS#``0D`@`"$&(`!20"``,08@!<`````!``
+M`'6,P@`X-*4`HCP"`"40``!P`.(X)3P"`0``@A`EKZ(`5).C`%0GI`!4D((`
+M`0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EC6(`%`!($"&L0PD`
+M$```7#P"``2OI0!8DZ,`6)""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8)8UB`!0`2!`AK$,)P!```%P`"BB`KZ<`7).C`%R0@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"6-8@`4`$40(:Q#$0`0``!5C,(`
+M-(UB`!0`8A`AC$()P*^B`&"3HP!@)Z0`8)""``$``A(``&(8)9""``(``A0`
+M`&(8)9""``,``A8``&(8)31C$`"OHP!DDZ,`9">D`&20@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6-9``4``H0@`!$$"&L0PG`$```8(S"
+M``R,P@`P%$``%C2E`&(\`@``/`,``(Q"``",8P```$,0(XTC+^0`8B`C/`(`
+M`(Q"````@B`C``I`@"4"R0`L0A``%$#_F@`$(H`!`!`EC6,`%`!B&"$\`@$`
+M`((0):QB"0`\`@`$`.(X)8S"`#@P0@`!$$```CP"`"0`XC@E``I`@"4"R<`L
+M0A``%$#_FR>D`%@!`!@EC6(`%`!#$"&L10G```HH@"2BT0`L0A``%$#_HB>D
+M`%P`H!@EC6(`%`!#$"&L1Q$`C,(`-!!``"L`"A!`C6,`%"1"`%"L8@L`C6,`
+M%(S"`#2L8@L$C6,`%"0"``FL8@L(``H8@"1BR<`L0A``%$#_G0````"-8P`4
+M``H0@`!#&"$D0LG`+$(0`!!``!`D90G`C&()P*^B`&B3HP!H)Z0`:)""``$`
+M`A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)1````8T8A``C6(`%``*
+M&(``8A@AC&()P#1"$`"LH@``C,(`##!"``$00``&)`(``0%"$`2-(RS,`$,0
+M)1````:M(BS,`4(0!``"$">-(RS,`$,0)*TB+,R,P@`,,$(``1!```8D`@`!
+M`4(0!(TC+-``0Q`E$```!JTB+-`!0A`$``(0)XTC+-``0Q`DK2(LT(S"``PP
+M0@`"$$``!B0"``$!0A`$C2,LU`!#$"40```&K2(LU`%"$`0``A`GC2,LU`!#
+M$"2M(BS4C,(`##!"``000``&)`(``0%"$`2-(RS8`$,0)1````:M(BS8`4(0
+M!``"$">-(RS8`$,0)*TB+-B,P@`,,$(`"!!```8D`@`!`4(0!(TC+-P`0Q`E
+M$```!JTB+-P!0A`$``(0)XTC+-P`0Q`DK2(LW#P"``$D0@S$`6`@)0!`^`D`
+MP"@E)`(``8^_`'`#X``()[T`>`"`&"4`!2"`)(+(`"Q"$``00``1)[W_Z(QB
+M`!0`1!`AC$((`*^B`!"3HP`0)Z0`$)""``$``A(``&(8)9""``(``A0``&(8
+M)9""``,``A8`$```!0!B$"4`!1"`C&,`%`!B&"&,8@@``^``"">]`!@GO?_H
+M``4X@"3BR``L0A``$$``$@"`0"6OI@`0DZ,`$">D`!"0@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6-`@`4`$<0(:Q#"``0```&)`(``0`%
+M&("-`@`4`$,0(:Q&"``D`@`!`^``"">]`!@GO?_PC(,`%"0"``$`HA`$K&((
+M0"0"``$#X``()[T`$``%&(`D8LH`+$(0`!!```@GO?_HC((`%`!#$"&,0@H`
+MKZ(`$).B`!`0```&,$(``P`%$(",@P`4`&(8(8QB"@`P0@`#%$``!B0#``&,
+M@@`4`*,8!(Q""$``8A@D``,0*P/@``@GO0`8)[W_P*^_`#BOM0`TK[0`,*^S
+M`"ROL@`HK[$`)*^P`"``@(@E`*"H)8XC`!0D`@`!`J(0!*QB"(`D$P/H/`(`
+M`"12```\`@``$```!"10```"`/@))`0`9"9S__\28``%`B`@)0)`^`D"H"@E
+M%$#_^``````\`@``)$(```(@("4`0/@)`J`H)1!``%<`````CB0!S#B#``<L
+M8P`!.((`"RQ"``$`8A@E%&``#```,"4D`P`*$(,`"20"``D0@@`'`````!2#
+M`$@`````EB(!T"Q"``000`!$`````#0%@``\"``*-0@`9#P'``&.(@`4`$40
+M(8Q$`$RL2`$`CB,`%`!E&"$`!!*",$+__P!'$"6L8@#\CB(`%`!%$"&,0@!,
+M``(2@@`$(H(01``%`````"3&``$LP@`"%$#_[`````".)``4-`*```""("&,
+M@@!(/`,`0`!#$"6L@@!(/`(``"1"````0/@))`0`R(XD`!0T`H```((@(8R"
+M`/P\`__^-&/__P!#$"2L@@#\)!``9#P"```D5```/`(``!````,D4@```D#X
+M"20$``H"("`E`H#X"0*@*"400``#)A#__Q8`__@`````CB0`%#0"@```@B`A
+MC((`2#P#_[\T8___`$,0)*R"`$B.(@`4K$`(@``3$"N/OP`XC[4`-(^T`#"/
+MLP`LC[(`*(^Q`"2/L``@`^``"">]`$"/H@`4CZH`((^G`"2/J0`HCZL`+(2#
+M+_0`0Q`A+$0`0"0#`#\`9!`*,,8/_P`"%```PC`E``D10C!"``$``A7``$80
+M)0`'/D`\`QX``.,X)`!'&"4Q(@`!$$```P"@0"4\`@$``&(8)0`)$0(P0@`!
+M``(70`!#$"6I`@`(N0(`"X^C`!```QT`CZ8`/``&-D"/I0`T``4O0(^D`#@`
+M!";```D00C!"``$``A8``&88)0!E&"4`9!@E`$,0):D"``RY`@`/CZ,`'``#
+M'``\`@`/`&(8)``)$D`P0H```$,0):D"`!"Y`@`3CZ(`&*D"`!2Y`@`7)`+_
+M_Q%"``\`"A-`B00`#)D$``\\`P`/-&/@``!#$"0`@B`EJ00`#+D$``^)`@`(
+MF0(`"SP#0```0Q`EJ0(`"+D"``LQ(@`,$$``'SP#?P`T8_\``6,8!S!C``$0
+M8``;```0)3$B``@\!(````(@"HD#``B9`P`+``D0@C!"``$``A6``&08)0!#
+M$"6I`@`(N0(`"XD#`!"9`P`3CZ(`,#!"?_\`8A@EJ0,`$+D#`!.)`@`4F0(`
+M%P`+'0``0Q`EJ0(`%+D"`!<D`@`!`^``"`````"/J``4$.``$(^I`!R(HP`0
+MF*,`$P`'%0`\!`#P`$00)`!B&"4T8X``J*,`$+BC`!.(H@`4F*(`%P`&&4``
+M0Q`EJ*(`%+BB`!<1```0``@6`(BC`!"8HP`3/`0/``!$$"0`8A@E-&.``*BC
+M`!"XHP`3B*,`%)BC`!>/H@`0``(2@`!B&"6HHP`4N*,`%Q$@``X`"1\`B*(`
+M$)BB`!,`0Q`E-$*``*BB`!"XH@`3B*,`%)BC`!>/H@`8``(3P`!B&"6HHP`4
+MN*,`%P/@``@D`@`!)[W_Z#P"(`"OH@`0DZ,`$">D`!"0@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6(H@`(F*(`"P!#$"6HH@`(N*(`"P/@
+M``@GO0`8)[W_V(^B`#@0X``+CZ@`/(BC``R8HP`/+$(``0`"$P``9A@E`$,0
+M):BB``RXH@`/$```,@`````00``F)Z0`(*B@``BXH``+J*8`#+BF``^)`@`0
+MF0(`$Z^B`""3HP`@D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``
+M8A@EJ*,`$+BC`!.)`@`4F0(`%Z^B`"23HP`D)Z0`))""``$``A(``&(8)9""
+M``(``A0``&(8)9""``,``A8``&(8):BC`!2XHP`7$```"P```````!@EJ*,`
+M"+BC``LTPA``J*(`#+BB``^HHP`0N*,`$ZBC`!2XHP`7J*``'+B@`!^(H@`<
+MF*(`'ZBB`!BXH@`;)`(``0/@``@GO0`H)[W_8`"@."4D`@`!KZ(`@).D`(`G
+MHP"`D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`EB.,`')CC
+M`!\`9!@D$&``]"0"``^,H@`$KZ(`A).C`(0GI`"$D((``0`"$@``8A@ED((`
+M`@`"%```8A@ED((``P`"%@``8A@EK*,`!(RB``BOH@"(DZ,`B">D`(B0@@`!
+M``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6LHP`(C*(`#*^B`(R3
+MHP",)Z0`C)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC
+M``R,H@`0KZ(`D).C`)`GI`"0D((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@``8A@EK*,`$(RB`!2OH@"4DZ,`E">D`)20@@`!``(2``!B&"60@@`"
+M``(4``!B&"60@@`#``(6``!B&"6LHP`4C*(`&*^B`)B3HP"8)Z0`F)""``$`
+M`A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC`!B,H@`<KZ(`G).C
+M`)PGI`"<D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EK*,`
+M'(CB`!R8X@`?,$(?_@`"$$*DP@``B.(`&)CB`!L``A0"I,(``J#```2(X@`8
+MF.(`&S!"``$40``7`````(CB`!B8X@`;,$(``A!```(D`@`!H,(`!(CB`!B8
+MX@`;,$(`"!!```0`````D,(`!#1"``*@P@`$B.(`&)CB`!LP0@`$$$``!```
+M``"0P@`$-$(`!*#"``2(X@`<F.(`'P`"%4(P0@`#H,(`"S!#`/\D`@`!$&(`
+M$BAB``(00``%)`(``A!@``D`````$```(``````08@`1)`(``Q!B`!8`````
+M$```&@````"(X@`4F.(`%S!"`!\0```5H,(`!8CB`!28X@`7,$(#X``"$4(T
+M0@"`$```#J#"``6(X@`4F.(`%S!"?````A*"-$(`@!````>@P@`%B.(`%)CB
+M`!<``A/",$(`'S1"`("@P@`%B.(`')CB`!\``A-"H,(`!HCB`!B8X@`;,$(`
+M\``"$0*@P@`'B.(`&)CB`!LP0@\```(2`J#"``B0PP`+)`(``A!B`!$H8@`#
+M$$``!B0"``,D`@`!$&(`$P`````0```8`````!1B`!8`````B.,`$)CC`!,`
+M`QX",&,`#Y#"``@`0Q`AH,(`"(CC`!"8XP`3``,=`C!C``^0P@`(`$,0(:#"
+M``B(XP`0F.,`$P`#'`(P8P`/D,(`"`!#$"&@P@`(B.(`&)CB`!LP0O````(3
+M`J#"``F(XP`<F.,`'SP"`0``8A@D+&,``20"``(`0Q`CH,(`"@``$"4#X``(
+M)[T`H(RB``",@T:@`$,0)*RB`````A`GC(-&H`!#$"0#X``(K()&H">]_]BO
+MOP`DK[``(`"`@"4\`@``)$(```!`^`DF!2R$C@(`%#0#@```0Q`AK$`!)(X"
+M`!0`0Q`AK$`!*(X"`!2L0`!`C@(`%`!#$"$\`P`"K$,!,(X"`!0T`X```$,0
+M(3P#`@"L0P$XC[\`)(^P`"`#X``()[T`*">]_]BOOP`DK[``(`"`@"6.`P`4
+M)`(`!JQB`$`\`@``)$(```!`^`DF!2R$C@(`%#0#@```0Q`AK$`!)(X"`!0`
+M0Q`AK$`!*(^_`"2/L``@`^``"">]`"@`@#@E```P)20(`%APR!@"`&<0(91$
+M,"B4HP``$(,`%`#`$"5PR!`")$(P*`#B&"&48@``%$``"B3&``$DQO__E*(`
+M`*1B``"4H@`"I&(``I"B``2@8@`$`^``"`#`$"4LP@!`%$#_ZG#(&`(``!`E
+M`^``"``````#X``(C((P)">]_^BOOP`4K[``$`"`@"4\`@``)$(```!`^`DF
+M!2R$)@(L2(^_`!2/L``0`^``"">]`!@GO?_0K[\`+*^R`"BOL0`DK[``(`"`
+MB"4`H)`E`B"`)9("`>,``A'"K@(P'#P"```D0@``)@0P*`!`^`DD!18````P
+M)20'`%@D&``')`\``B0.`?0D"`#()`T`9"0,`"@D"P`'/`H`OS5*_@P\"0"_
+M-2G_.(XB`<PL0@`'$$``!'#'&`(`<!`A$````Z!8,#``<!`AH$\P,'#'(`(F
+M!0`$`(40(:Q.,#@D@S!``@,0(:Q(````HQ@AK&@``"2#,$@"`Q`AK$T```"0
+M$"&L3#!0`*,8(:QK```D@C`P`@(0(:!```2@0``%D$,``*!#``*@0``#C@(P
+M'!!```0`A1`AK$HP:`"0$"&L23!P),8``2S"`$`40/_7`````(X",!P00``.
+M-`.``(XB`!0`0Q`AC@,P;*Q#`2R.(@`4-`.```!#$"&.`S!PK$,!-#P"```D
+M0@```$#X"0(@("4D`@!D$D``!:X","".`C`8-$(``1````6N`C`8C@(P&"0#
+M__X`0Q`DK@(P&(^_`"R/L@`HC[$`)(^P`"`#X``()[T`,">]_]BOOP`DK[``
+M(`"`@"6.`C`<$$``"SP"```D0@```$#X"0````".`@`4-`.```!#$"&L0`$L
+MC@(`%`!#$"&L0`$TC[\`)(^P`"`#X``()[T`*">]_Z"OOP!8K[$`5*^P`%``
+M@(@E`B"`)2RB``<00`&HC@@P)#P"```D0B'@``48@`!B&"&,8@```$``"```
+M````P#@E+,,`!1!@`:```!`ECB4`%#0"@```HB@AC*084#P"\`\T0O__`((@
+M)``'$(``4!`AC$)&*``"%0`\`P_P`$,0)`""("6LI!A0CB0`%#0"@```@B`A
+MC(,87"0"@'\`8A@D``<0@`!0$"&,0D90``(1P#!"?X``8A@EK(,87(XE`!0T
+M`H```*(H(8RD&%P\`O_`-$)__P""("0`!Q"``%`0(8Q"1CP``A/`/`,`/S1C
+M@```0Q`D`((@):RD&%R.)0`4-`*```"B*"&,I!A8/`+\`S1"__\`@B`D``<0
+M@`!0$"&,0D9D``(4@#P#`_P`0Q`D`((@):RD&%B1`@`)`$<0*Q!```4`````
+MC@(L2"1"``$0```(K@(L2)$"``D`XA`K$$``!`````".`BQ,)$(``:X"+$P0
+M``%3H0<`"20#`'^OHP`0)`(`,J^B`!2OHP`8)`(`**^B`!ROHP`@)`(`3:^B
+M`"2OHP`H)`(`0*^B`"PD`@`?KZ(`,"0"`!"OH@`T)`(`/Z^B`#@D`@`PKZ(`
+M/``&,"N.)0`4-`*```"B*"&,I!AL/`+_X#1"/_\`@B`D``88@">B`!``0Q`A
+MC$(````"$X`\`P`?-&/```!#$"0`@B`EK*08;(XE`!0T`H```*(H(8RD&&P\
+M`O`?-$+__P""("0`!AB`)Z(`&`!#$"&,0@````(50#P##^``0Q`D`((@):RD
+M&&R.)0`4-`*```"B*"&,I!AH/`+_`31"__\`@B`D``88@">B`"``0Q`AC$(`
+M```"%$`\`P#^`$,0)`""("6LI!AHCB4`%#0"@```HB@AC*08:#P"@/\T0O__
+M`((@)``&&(`GH@`H`$,0(8Q"`````A8`/`-_``!#$"0`@B`EK*08:(XE`!0T
+M`H```*(H(8RC&&@D`O_@`&(8)``&((`GH@`P`$00(8Q"```P0@`?`&(8):RC
+M&&B.)0`4-`*```"B*"&,HQAL)`+`_P!B&"0GH@`X`$00(8Q"`````A(`,$(_
+M``!B&"6LHQAL$,``"30"@`".(@`4-`.```!#$"&,0QAL-&,``:Q#&&P0```(
+M+,,``8XD`!0`@B`AC((8;"0#__X`0Q`DK((8;"S#``&1`@`,$&(`SR0"``$0
+MP``%`````(X"+%@D0@`!$```!*X"+%B.`BQ<)$(``:X"+%PLP@`!$```PJ$"
+M``PD`@`(KZ(`$"0"``:OH@`4``8P*XXE`!0T`H```*(H(8RC(@@D`O_``&(8
+M)``&((`GH@`0`$00(8Q"```P0@`_`&(8):RC(@B1`@`-$,(`KB0"``$0P``%
+M`````(X"+&`D0@`!$```!*X"+&".`BQD)$(``:X"+&00``"BH08`#:^@`!`D
+M`@`$KZ(`%"0"``BOH@`8`,`X)2S#``,08`":```0)8XE`!0T`H```*(H(8RD
+M&%@\`O_\-$(/_P""("0`!Q"``Z(0(8Q"`!```A,`/`,``S1C\```0Q`D`((@
+M):RD&%B1`@`+`$<0*Q!```4`````C@(L:"1"``$0```(K@(L:)$"``L`XA`K
+M$$``!`````".`BQL)$(``:X"+&P0``!XH0<`"SP"```D0R'`C$(AP*^B`!",
+M8@`$KZ(`%(QB``BOH@`8C&(`#*^B`!R,8@`0KZ(`((QB`!2OH@`DC&(`&*^B
+M`"B,8@`<KZ(`+`#`*"4LPP`($&``8P``$"6.)``4-`*```""("&,@QDD)`+_
+M`0!B&"0`!1"``Z(0(8Q"`!```A!`,$(`_@!B&"6L@QDDD0(`"@!%$"L00``%
+M`````(X"+%`D0@`!$```"*X"+%"1`@`*`*(0*Q!```0`````C@(L5"1"``&N
+M`BQ4$```1*$%``H4P``4)`/__8X",!@`0Q`DK@(P&#P"```D0@```$#X"0(@
+M("4\`@``)$(```!`^`D"("`E)`7^_SP#```D8P```B`@)0!@^`D`12@D$```
+M,"0"``&.`C`8,$(``A1``"PD`@`!C@(P'!!``!H\`@``)$(```!`^`D"("`E
+M)`7^_SP#```D8P```B`@)0!@^`D`12@DCB(`%#0#@```0Q`AC@,P;*Q#`2R.
+M(@`4-`.```!#$"&.`S!PK$,!-#P"```D0@```$#X"0(@("40```*C@(P&"1"
+M````0/@)`B`@)3P#```D8P```B`@)0!@^`DT10$`C@(P&#1"``(0```#K@(P
+M&!````(``!`E)`(``8^_`%B/L0!4C[``4`/@``@GO0!@)[W_V*^_`"2OL``@
+MC)`P)*X``!",@C`<$$``*P"`*"6.`P`4/`(`P`!#$"L00``#/`(`P!````.N
+M``!$`$,0(ZX"`$2.`P`</`(`P`!#$"H00``#/`(`P!````.N``!(`$,0(ZX"
+M`$B,@@`4-`.```!#$"&.`P!$K$,!+(R"`!0T`X```$,0(8X#`$BL0P$TC((`
+M%#0#@```0Q`A/`,``JQ#`3",@@`4-`.```!#$"$\`P(`K$,!.#P"```D0@``
+M`$#X"22E+(2N```\K@``0(^_`"2/L``@`^``"">]`"@GO?_@K[\`&*^Q`!2O
+ML``0`("()0(@."6.(C`8,$(``R0#``,40P!@CB42-(XP,"22!@`)+,(`!!!`
+M``<\`@``)$(``"0%``$`0/@)),8``1```%:/OP`8D@8`"I("``@`PA`K$$``
+M"#P"```D0@```B`@)20%``4`0/@)),8``1```$J/OP`8C.,LF#!B`'\L0@!`
+M)&,`?Q!```,``QG"C.(LF``"&<*.`@`H`$,0*A!```\`````D@(`#!1``!@"
+M("`E/!```"80```D!0`"`@#X"0``,"4"("`E)`4`!0(`^`D``#`E$```,(^_
+M`!B.`@`D`$,0*A!``!0\`@``D@(`#!!```8\`@``)$(```(@("4D!0`"`$#X
+M"20&``&2!@`++,(``A!``!\\`@``)$(```(@("4D!0`$`$#X"23&``$0```9
+MC[\`&"1"````0/@)`B`@)21"__XL0@`"$$``$H^_`!B2`@`,%$``!CP"```D
+M0@```B`@)20%``(`0/@)```P)9("``L00``&/`(``"1"```"("`E)`4`!`!`
+M^`D``#`EC[\`&(^Q`!2/L``0`^``"">]`"`GO?_@K[\`&*^Q`!2OL``0`("(
+M)0(@."6.(C`8,$(``R0#``,40P`RCB42-(XP,"22!@`)+,(`!!!```<\`@``
+M)$(``"0%``$`0/@)),8``1```"B/OP`8C.,LF#!B`'\L0@!`)&,`?Q!```,`
+M`QG"C.(LF``"&<*.`@`D`$,0*A!```P\`@``D@8`"RS"``(00``7/`(``"1"
+M```"("`E)`4`!`!`^`DDQ@`!$```$8^_`!@D0@```$#X"0(@("4D0O_^+$(`
+M`A!```J/OP`8D@(`"Q!```<\`@``)$(```(@("4D!0`$`$#X"0``,"6/OP`8
+MC[$`%(^P`!`#X``()[T`(">]_\BOOP`PK[,`+*^R`"BOL0`DK[``(`"`B"4`
+MH(`E`B"8)3P"``$D0B/``$#X"8XE$C0D`P!8<$,@`@"1D"$F4C`HKC(P)(XC
+M`=PD`@`!%&(`!20#__V.(C`8-$(``A````2N(C`8CF(P&`!#$"2N8C`8CB,!
+MW"0"``$08@`H`B`@)8YB+'@D0@`!KF(L>#P0```F$```)`4``0(`^`D``#`E
+M`B`@)20%``4"`/@)```P)0(@("4D!0`$`@#X"0``,"4"("`E)`4``@(`^`D`
+M`#`E`B`@)20%``,"`/@)```P)3P"```D0@```$#X"0(@("4\`P``)&,```(@
+M("4`8/@)-$4!`#P"``$D0BU(`$#X"0(@("40``!?C[\`,(XB,!@P0@`#)`,`
+M`Q1#`%J/OP`P$@``&3P0```F$````B`@)20%``$"`/@)DD8`"0(@("4D!0`%
+M`@#X"9)&``J21@`,`B`@)20%``("`/@)+,8``0(@("4D!0`#`@#X"9)&``T"
+M("`E)`4`!`(`^`F21@`+$```%XYB,!PF$````B`@)20%``$"`/@))`8`!`(@
+M("4D!0`%`@#X"9)&``@"("`E)`4``@(`^`DD!@`!`B`@)20%``,"`/@))`8`
+M`0(@("4D!0`$`@#X"20&``*.8C`<$$``&CP"```D0@```$#X"0(@("4D!?[_
+M/`,``"1C```"("`E`&#X"0!%*"0\`@`!)$(M2`!`^`D"("`ECB(`%#0#@```
+M0Q`A/`,``JQ#`3".(@`4-`.```!#$"$\`P(`K$,!.!````^/OP`P/`(``21"
+M+4@`0/@)`B`@)3P"```D0@```$#X"0(@("4\`P``)&,```(@("4`8/@)-$4!
+M`(^_`#"/LP`LC[(`*(^Q`"2/L``@`^``"">]`#@GO?_0K[\`+*^R`"BOL0`D
+MK[``(`"`D"4`H(`E`D"()8Y"`!0T`X```$,0(:Q``22.0@`4`$,0(:Q``2@\
+M`@``)$(```!`^`DF)2R$C@(``*XB+)B.`@`$KB(LG(X"``BN(BR@CD(`%#0#
+M@```0Q`AC$4!+(Q&`30\`P#``*,0)!!#``,`PQ`D%$,`*(^_`"R.,#`DC@0`
+M1`"D("..`@`\`((0(XXC+'``0Q`AKB(L<*X$`#R.!`!(`,0@(XX"`$``@A`C
+MCB,L=`!#$"&N(BQTK@0`0(X#`#R.`@`4`$,0*Q!```0\`@`!)$(N*`!`^`D"
+M0"`EC@,`0(X"`!P`0Q`K$$``!CP"``$\`@`!)$(OY`!`^`D"0"`E/`(``21"
+M+4@`0/@)`D`@)8^_`"R/L@`HC[$`)(^P`"`#X``()[T`,">]_^BOOP`4K[``
+M$`"`@"4"`#@ED*,`!20"`!$48@`5C@8P)(S"`#PD0@`!K,(`/(X"+'`D0@`!
+MK@(L<(S#`#R,P@`4`$,0*Q!``!\\`@`!)$(N*`!`^`D`````/`(``21"+4@`
+M0/@)`@`@)1```!>/OP`4)`(`&11B`!2/OP`4C,(`0"1"``&LP@!`C.(L="1"
+M``&LXBQTC,,`0(S"`!P`0Q`K$$``"3P"``$D0B_D`$#X"0(`("4\`@`!)$(M
+M2`!`^`D"`"`EC[\`%(^P`!`#X``()[T`&">]_^BOOP`0`(`H)8R&,"2,@RR8
+M,&(`?RQ"`$`D8P!_$$```P`#&<*,HBR8``(9PHS"`"@`0Q`J%$``%P````",
+MP@`D`$,0*A!```H`````D,(`#!!```<\`@``)$(``"0%``(`0/@))`8``1``
+M`!J/OP`0D,,`"Q!@``<\`@``)$(``"0%``0`0/@))&;__Q```!&/OP`0D,,`
+M"A!@``<\`@``)$(``"0%``4`0/@))&;__Q````B/OP`0D,8`"1#```0D0@``
+M)`4``0!`^`DDQO__C[\`$`/@``@GO0`8C((`%#0#@```0Q`AC$<`[(Q(`/",
+M1@#XC(4P)(RB`#@00``$```8)0#"$"L00``%`````(R"+'PD0@`!$```$*R"
+M+'R,I``X`,0@(XRC`#0!`Q@CC*(`,`#B$",`@Q@C`&(8(SP"7U,T0CDI`&(`
+M&```$!```A.#``,?PP!#&".LI@`XK*<`,*RH`#0#X``(`&`0)2>]_\BOOP`P
+MK[,`+*^R`"BOL0`DK[``(`"`D"4"0(@ECE`P)(RB``"N0BR8C*(`!*Y"+)R,
+MH@`($@``H*Y"+*`\`@`!)$(VD`!`^`D``````$"8)09A``@`````CD(L@"1"
+M``&N0BR`/`(``21"+4@`0/@)`D`@)8X"`!`"8A`AK@(`$(XB,!P00``[/`(`
+M`"1"```"0"`E`$#X"28E+(2.0@`4-`.```!#$"&,0P$LC$4!-(X"`$0`8A`K
+M%$``!P````".`@!(`*(0*Q!``!H`````$```#(X$`$B.0@`4-`.```!#$"&.
+M`P!$K$,!+(Y"`!0T`X```$,0(3P#``*L0P$PC@0`2`"D$"L00`!K-`.``(Y"
+M`!0`0Q`AK$0!-(Y"`!0`0Q`A/`,"`*Q#`3@0``!CC[\`,(X$`$0`9"`CC@(`
+M/`""$"..(RQP`$,0(:XB+'"N!``\C@0`2`"D("..`@!``((0(XXC+'0`0Q`A
+MKB(L=*X$`$".0C`8,$(``R0#``,40P!.C[\`,(XC,"```Q"``$,0(8X$`!``
+M1!`K$$``&3P%$&*.`@`8<((0`C2E3=,`10`9```0$``"$8*.`P`\`$,0*Q1`
+M`",\`@`!C@(`('""$`(`10`9```0$``"$8*.`P!``$,0*Q1``!D\`@`!)$(U
+ML`!`^`D"0"`E$```%3P"``&.`P`0CB(P(`!#$"L00``JC[\`,(X"`!1P8A`"
+M/`,08C1C3=,`0P`9```0$``"$8*.`P`\`$,0*Q!```H\`@`!)$(N*`!`^`D"
+M0"`E/`(``21"+4@`0/@)`D`@)1```!:/OP`PC@(`$(X#`!QP0Q`"/`,08C1C
+M3=,`0P`9```0$``"$8*.`P!``$,0*Q!```J/OP`P/`(``21"+^0`0/@)`D`@
+M)3P"``$D0BU(`$#X"0)`("6/OP`PC[,`+(^R`"B/L0`DC[``(`/@``@GO0`X
+M`````(R"$C240@``I*(``(R#$C208@`$-$(`"*!B``20H@`$-$(`"*"B``2,
+M@A(TE$(``J2B``*,@A(TD$(`!*"B``2,@A(TD$(`!:"B``4#X``(```0)0``
+M`````````````">]_XBOOP!P`(!@)0&`."4D`O_7KZ(`$*^B`!0D`O_0KZ(`
+M&*^B`!ROH@`@)`+_[J^B`"BOH@`L)`+_\*^B`#`D`O_RKZ(`-"0"__2OH@`X
+M)`+_R*^B`$"OH@!$)`+_Q*^B`$BOH@!,KZ(`4"0"_[BOH@!8KZ(`7"0"_[6O
+MH@!@)`+_LJ^B`&0D`O^PKZ(`:```*"4GJP`0).8`!">J`"@GJ0!`)Z@`6``%
+M&(``9R`A`6,0(8Q"``"L@D8H`&8@(0%#$"&,0@``K()&.`!G("$!(Q`AC$(`
+M`*R"1E``9B`A`0,8(8QB``"L@D9@)*4``2BB``440/_L/`(``"1"```!@"`E
+M`$#X"20%``&/OP!P`^``"">]`'@GO?^@K[\`6*^U`%2OM`!0K[,`3*^R`$BO
+ML0!$K[``0`"@B"4`P*`E`."`)8^U`'`PD___/`(``"1"````0/@))`1&J`!`
+MD"460``$`F`H)20#``(0``&ZKJ,``*^P`!"OM0`4/`(``"1"```"0"`E`B`P
+M)0!`^`D"@#@E`D"()3P"```D0@``KD(`,#P"```D0@``KD(`-#P"```D0@``
+MKD(`[#P'```DYP``KD<`^#P&```DQ@``KD8`]#P%```DI0``KD4`_#P$```D
+MA```KD0!`#P#```D8P``KD,!!#P"```D0@``KD(!%#P"```D0@``KD(!;#P"
+M```D0@``KD(!<#P"```D0@``KD(!B#P"```D0@``KD(!H*Y&`:BN1P&LKD4!
+ML*Y$`;2N0P&X/`(``"1"```"0"`E`$#X"0``*"440``$)F/_>B0"``,0``%R
+MKZ(`/"QC``(Z8@"1+$(``0!B&"408``5/`*P$#1"`"``4!`C+$(0`!!```D`
+M````CB(`%`!0$",\`[`0`$,0(8Q"0""OH@`L$```09.C`"R.(@`4`%`0(SP#
+ML!``0Q`AC$)`(!```#HP0P#_/`*[_S1"\"``4!`C+$(0`!!```<\`[P`CB(`
+M%`!0$",`0Q`AC$(P(!````6OH@`PCB(`%`!0$",`0Q`AC$,P(#P"N_\T0O"`
+M`%`0(RQ"$``00``'/`.\`(XB`!0`4!`C`$,0(8Q",(`0```%KZ(`-(XB`!0`
+M4!`C`$,0(8Q#,(`\`KO_-$+PD`!0$",L0A``$$``#CP#O`".(@`4`%`0(P!#
+M$"&,0C"0KZ(`.).C`#@GH@`XD$(``0`"$@``8A@E``,:`A````<P8P#_CB(`
+M%`!0$",`0Q`AC$(PD``"&@(P8P#_``,1`JXB`<PP8@`/IB(!T(XC`<PD`@`%
+M%&(`!20"``N6(@'0+$(``A!```4D`@`+$&(``R0"``T0``$/KZ(`/(XB`!0T
+M`X```$,0(8Q"&!BF(@'2/`(``"1"````0/@)`B`@)11```0T`X``)`(`#A``
+M`0&OH@`\CB(`%`!#$"$D`P`'K$,8`#P"```D0@```$#X"0(@("6F(@'4,$(`
+M\"1"_]`L0@!`$$``#SP"``"6)`'4.(,`-3B"`$4``A`K``,0"A!```<D`@!&
+M$((`!20"`#80@@`#)`(`#1```.:OH@`\/`(``"1"```"("`E)`4`P0!`^`DG
+MI@`H%$``!)>B`"@D`@`($```VZ^B`#PL0C`"$$``!)>B`"@D`@`%$```U:^B
+M`#RF0A)P/`(``"1"```"("`E)`4`'`!`^`DGI@`J%$``!)>B`"HD`@`($```
+MR:^B`#P00``+/`(``"1"```"("`E)`4`&P!`^`DGI@`J%$``!#P"```D`@`(
+M$```O:^B`#PD0@```B`@)20%`#\`0/@))Z8`*!1```27H@`H)`(`"!```+.O
+MH@`\ID(2<@``F"4``(`E/`(``"14```"("`E)@4`P`*`^`DGI@`H$$``II>B
+M`"@"8I@F)A```2X"`T`40/_W`B`@)30"__\28@`#)`(`!Q```)ZOH@`\)`(`
+M"J9"$^8D`@`#ID(5\```@"4D!``T)D8`!B0#``MR!"@"`*80(:1#$^@F$``!
+M+@(`"A1`__MR!"@"``"`)3P"```D2R(`)D@``CP"```D2B(()`D`-"9'``PD
+M!0`+)D8`"``0&$``<B`A`&L0(91"``"D@A7X`&@@(0!J&"&48@``I((5\'()
+M&`(`9Q`AI$46J`!F&"$F$``!+@(``Q1`__"D9180/`(``"1"```"("`E`$#X
+M"29%$G`40``#)`(`"!```&NOH@`\ED(2BA!``",D`P`0EB(!U#!"`/`40P`@
+M/`(``(XB`!0T`X```$,0(20#0`>L0Q@`/`(``"1"````0/@))`0'T#P"```D
+M0@```$#X"0(@("6F(@'6CB(`%#0#@```0Q`A)`,`!ZQ#&``\`@``)$(```!`
+M^`DD!`?0EB(!UC!"`/`D`P`@$$,``R0"``T0``!&KZ(`/#P"```D0@```B`@
+M)20%`+\`0/@))Z8`*!1```27H@`H)`(`"!```#NOH@`\ID(2=*8B`@@\`@``
+M)$(```!`^`D"("`E%$``!"0"``LD`@`($```,*^B`#R.(P',%&(`"```("4\
+M`@``)$(```(@("4`0/@))Z4`/!````H`0"`EEB(!U#!"`/`D0O_0+$(`0!!`
+M``,D`@`-$````J^B`#ROH@`\$(``&P````".0BS$KB(!P#P"```D0@```$#X
+M"0(@("4\`@`!)$)"W`!`^`D"("`E%$``!#P"``$D`@`)$```#*^B`#PD0CI@
+M`$#X"0(@("6.0C`8)`/__0!#$"2N0C`8$```#`(@$"4D`@`(KZ(`/!)```0\
+M`@``)$(```!`^`D"0"`E$J```H^B`#RNH@`````0)8^_`%B/M0!4C[0`4(^S
+M`$R/L@!(C[$`1(^P`$`#X``()[T`8">]_^BOOP`0C((`$(Q#``@08``&C$4`
+M`"0"``$08@`%```0)1````N/OP`0$````B2E`&`DI0!V/`(``"1"```DA"PP
+M`$#X"20&``8D`@`!C[\`$`/@``@GO0`8```````````#X``()`(``0``````
+M````C((`$(Q'``0``"`E``4H0`#$&"$`Y1`AD$(``*!B```DA``!*((``A1`
+M__DDI0`!`^``""0"``$```````````"`0"4\`KP`-$(@`(T$`!0`1#`C),+`
+M""Q"$``00``D)[W_P``%$$`D!0`#`$4H!`"&$"&,0@`(KZ(`,).C`#`GI``P
+MD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E`&48):^C`#23
+MHP`T)Z0`-)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)8T"
+M`!0`1A`AK$,`"!```",D`@`!C0(`%`!&("$`!1A`)`(``P!B$`0``C@G`$`H
+M)23"P`@L0A``$$``$22)``B,@@`(KZ(`.).C`#@GI``XD((``0`"$@``8A@E
+MD((``@`"%```8A@ED((``P`"%@``8A@E`&<8)!````8`91`EC0(`%`!&$"&,
+M0@`(`.(0)`!%$"6M(@``)`(``0/@``@GO0!``(`X)3P"O``T0B``C.0`%`!$
+M,",DPL`(+$(0`!!``"4GO?_```400"0%``,`12@$``4H)P"&$"&,0@`(KZ(`
+M,).C`#`GI``PD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+M`&48)*^C`#23HP`T)Z0`-)""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8)8SB`!0`1A`AK$,`"!```"$D`@`!C.(`%`!&("$`!1A`)`(``P!B
+M$`0``B@G),+`""Q"$``00``0)(@`"(R"``BOH@`XDZ,`.">D`#B0@@`!``(2
+M``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"40```&`&40)(SB`!0`1A`A
+MC$(`"`"B$"0T0@``K0(``"0"``$#X``()[T`0`"`0"4\`KP`-$(@`(T#`!0`
+M0S@C).+``"Q"$``00``@)[W_Z`!G$"&,0@``KZ(`$).C`!`GI``0D((``0`"
+M$@``8A@ED((``@`"%```8A@ED((``P`"%@`0```4`&(8):^C`!23HP`4D((`
+M`0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EC0(`%`!'$"&L0P``
+M$```$R0"``&-`@`4`$<0(8Q#```D`@`!`*(0!``"$"<`8A@D,,(``0"B$`0`
+M8A@E).+``"Q"$``40/_C)Z0`%(T"`!0`1Q`AK$,``"0"``$#X``()[T`&">]
+M_^@`@#@E/`*\`#1"(`",Y@`4`$8@(RRC``808``9)`+__R2"P`0L0A``$$``
+M#P#$$"&,0@`$KZ(`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@E
+MD((``P`"%@`0```$`&(0)8SB`!0`1!`AC$(`!#!"`"\`HA`&,$(``0/@``@G
+MO0`8)[W_T*^_`"@`@$`E/`*\`#1"(`"-`P`4`$,X(R3BP`@L0A``$$``(`!G
+M$"&,0@`(KZ(`().C`"`GI``@D((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@`0```5`&(@):^D`"23HP`D)Z0`))""``$``A(``&(8)9""``(``A0`
+M`&(8)9""``,``A8``&(8)8T"`!0`1Q`AK$,`"!```!F-`RQ$C0(`%`!'$"&,
+M1``(``400"0#``,`0Q@$/`(``31"\```0Q`G`((@)``%$P``@B`E$,```S2$
+M@``\`@`!`((@)23BP`@L0A``%$#_W`````"-`@`4`$<0(:Q$``B-`RQ$/`4!
+M`#P"```D0@```0`@)0!`^`D`92@EC[\`*`/@``@GO0`P````````````````
+M/`*\`#1",`",A0`4`$4P(XR#`<PD`@`+$&(`'R>]_^@DPL"P+$(0`!!``!0`
+M````C*(`L"0#_@,`0Q`D-$(``J^B`!"3HP`0)Z0`$)""``$``A(``&(8)9""
+M``(``A0``&(8)9""``,``A8``&(8)0"F$"$0```(K$,`L(R"`!0`1B`AC$(`
+ML"0#_@,`0Q`D-$(``JR"`+`#X``()[T`&`"`,"6,PP',)`(`"Q1B`!HGO?_H
+M/`*P$#1"`"",PP`4`$,0(RQ"$``00``&/`*P$#1"0"",0@``KZ(`$!````23
+MH@`0-$)`((Q"```P0@#_``(9`C!$``^,P@',%$,`!```*"64P@'0`$00)BQ%
+M``$0```9`*`0)3P"N_\T0O"0C,,`%`!#$",L0A``$$``!CP"O``T0C"0C$(`
+M`*^B`!00```$DZ(`%#1",)",0@``,$(`_P`"&0(P1``/C,(!S!1#``0``"@E
+ME,(!T`!$$"8L10`!`*`0)0/@``@GO0`8)[W_V*^_`"2OL``@/`(``"1"````
+M0/@)`("`)1!``#,T`X``C@(`%`!#$"$D`P`?K$,8<(X"`!0T`X```$,0(20#
+M``VL0QATC@(`%#0#@```0Q`A)`,`#*Q#&'B.`@`4-`.```!#$"$D`P`#K$,9
+M\(X"`!0T`X```$,0(20#``6L0QGTC@4`%#0"@```HB@AE@(!U#!"`/`D0O_0
+M+$(`0"0#`!@D!``4`((8"ZRC&?B.!``4-`*```""("&,@@`<)`/`?P!#$"0T
+M0@"`K((`'(X"`!0T`X```$,0(20#`#VL0P$$$```*H^_`"2.`@`4`$,0(20#
+M`!^L0QAPC@(`%#0#@```0Q`A)`,`?ZQ#&'2.`@`4-`.```!#$"$D`P`$K$,8
+M>(X"`!0T`X```$,0(20#``ZL0QAXC@(`%#0#@```0Q`A)`,`#*Q#&?".`@`4
+M-`.```!#$"$D`P#_K$,9](X%`!0T`H```*(H(98"`=0P0@#P)$+_T"Q"`$`D
+M`P`8)`0`%`""&`NLHQGXC[\`)(^P`"`#X``()[T`*">]_]BOOP`DK[``(#P"
+M```D0@```$#X"0"`@"400``Q-`.``(X"`!0`0Q`A)`,``:Q#`02.!``4-`*`
+M``""("&,@@`<)`/`?P!#$"0T0@^`K((`'(X"`!0T`X```$,0(20#`!^L0QAP
+MC@(`%#0#@```0Q`A)`,`?ZQ#&'2.`@`4-`.```!#$"$D`P`$K$,8>(X"`!0T
+M`X```$,0(20#``RL0QGPC@(`%#0#@```0Q`A)`,`_ZQ#&?2.!0`4-`*```"B
+M*"&6`@'4,$(`\"1"_]`L0@!`)`,`&"0$`!0`@A@+K*,9^(^_`"2/L``@`^``
+M"">]`"@#X``()`(``0/@``@``````^``"``````GO?_@K[\`'*^R`!BOL0`4
+MK[``$`"@B"4`P"@E)!```1(P``T`@)`E$B``!CP"``$D`@`"$B(`#@``$"40
+M```3C[\`'"1"3-``0/@)`````!````L`0(`E/`(``21"3-@`0/@)`````!``
+M``:N42^X/`(``21"3.``0/@)`````*Y1+[@"`!`EC[\`'(^R`!B/L0`4C[``
+M$`/@``@GO0`@`^``"```$"4#X``(```0)0``````````)[W_D*^_`&ROO@!H
+MK[<`9*^V`&"OM0!<K[0`6*^S`%2OL@!0K[$`3*^P`$@`@(@EKZ4`=`#`L"6O
+MIP!\`B"@)9;"``(``A'",$,``9;"``(P0@$`$$``!0``J"448`/:)`,`#!``
+M``B6P@`"EL(``@`"$<(X0@`!,$(``11``](D`P`,EL(``@`"$8(P0P`!EL(`
+M`C!"`"`00``%`````!1@`\DD`P`,$```"#P"``"6P@`"``(1@CA"``$P0@`!
+M%$`#P20#``P\`@``)$(```(@("4`0/@)`L`H)0!`\"43P`.Y)`,`#"0"``:/
+MHP!T$&(`"RQB``<00``&)`(`""QB``(00`.P)`,`#!````6/I0!\CZ0`=!2"
+M`ZLD`P`,CZ4`?!"@``L`````CB(`%(Q"$4"OH@`T/`(``"1"```"("`E`$#X
+M"0/`*"40```#CB0!S*^@`#2.)`',.(,`!RQC``$X@@`++$(``0!B&"448``-
+MCZ(`?"0#``H0@P`))`(`"1""``B/H@!\%(,`&P````"6(@'0+$(`!!!``!<`
+M````CZ(`?!!``!0`````CB02-!"``!$`````EL,``)2"```08@`-`````);#
+M``*4@@`",&,!\#!"`?`48@`'/`(``"1"```"("`E`$#X"0+`*"440`-Y)`(`
+M`8XC`!0T`H```&(8(8QD`%@D`@`!`$0@"J^D`#B,8P`$/`("(`!B&"2OHP`\
+M/`(``"1"```"("`E`$#X"8^E`'0\`@``)$(```!`^`D"("`E/`(``"1"```"
+M("`E`$#X"0+`*"400`-9)`,``Y;"``(P0P'P)`(!0!!B`"`H8@%!$$``#R0"
+M",`D`@#`$&(`)BAB`,$00``&)`(`T"0"`*`08@`=)`,`#!```TF/I0"`$&(`
+M(20#``P0``-%CZ4`@!!B`!DH8@C!$$``!B0""4`D`@%0$&(`#"0#``P0``,\
+MCZ4`@!!B``4D`@E0$&(`!B0#``P0``,VCZ4`@"07``$0```0K[<`0"07``(D
+M!0`!$```#*^E`$`D%P`#)`(``A````BOH@!`)!<`!"0#``(0```$KZ,`0"07
+M``4D!``"KZ0`0(XB`!0T`X```$,0(20#``>L0Q@```"`)3P"```D4R(0)[(`
+M*``0$$``4!@A``,0P`!3$"&,1```)(+``"Q"$``00``6`!`00``#$$``5Q`A
+M``(0@`!3$"&,0@``KZ(`*).C`"B20@`!``(2``!B&"620@`"``(4``!B&"62
+M0@`#``(6``!B&"6.(@`4`$00(:Q#```0```.)K4``0!0$"$``AC``',8(8XD
+M`!2,8P```(,@(0`"$$``5Q`A``(0@`!3$"&,0@``K((``":U``$RH@`_%$``
+M!#P%```DI0```*#X"20$``$F$``!+@(`&11`_\T`$!!```"`)3P"```D4R1H
+M)[(`+``0$,``4Q`AC$0``(^B`'P00``,/`7__S2E?^``A1@A+&,`&3P"__\T
+M0G\L`((0(2Q"``DX0@`!``,0"Q!``"0`````)(+``"Q"$``00``4`!`8P``0
+M$,``4Q`AC$(`!*^B`"R3HP`LDD(``0`"$@``8A@EDD(``@`"%```8A@EDD(`
+M`P`"%@``8A@ECB(`%`!$$"&L0P``$```!R:U``&.(@`4`$00(0!S&"&,8P`$
+MK$,``":U``$RH@`_%$``!#P"```D0@```$#X"20$``$F$``!+@(`Q!1`_\H`
+M$!#`CH(LK`(@("4"X"@ECZ8`0`!`^`D"H#@EEL(``C!"P``00``%/`(``"1"
+M```"("`E`$#X"0+`*"66(@'2+$(`0A1``$DT`X``CB(`%`!#$"$\`P`"-&.@
+M`JQ#&"R6PP``)`()M!1B``X\`V9FDH(2DI:#$IP`0Q`C/`-F9C1C9F<`0P`8
+M```8$``#&$,``A?#`&(8(P`#'``0```'``,D`Y*"$I(T8V9G`$,`&```$!``
+M`A/```(D`Y;"``(P0@#0)`,`P!1#`!`T`X``CB4`%#0"@```HB@ADH(2D@`"
+M$",``A&`,$(/P``$&",``QR`/`0`_`!D&"0`0Q`EK*(93!````6.)``4CB(`
+M%`!#$"&L0!E,CB0`%#0"@```@B`AC((B*"0#_?\`0Q`DK((B*(XD`!0T`H``
+M`((@(8R"(B@\`__^-&,#_P!#$"0T0@@`K((B*(XB`!0T`X```$,0(20#``^L
+M0P!@EB(!TBQ"`$,40``$-`.``(XB`!0`0Q`AK$`B5(XC`<PD`@`%%&(`.P``
+M``"6(@'0.$,``BQC``$X0@`'+$(``0!B&"408``S-`.``(XB`!0`0Q`A)`,6
+M(JQ#&6R6P@`",$(`@!!```HT`H``CB0`%`""("&,@AA(/`/_@S1C__\`0Q`D
+M/`,`/`!#$"6L@AA(EL(``C!"`*`D`P"@%$,`"C0"@`".)``4`((@(8R"(AP\
+M`_X'-&/__P!#$"0\`P!@`$,0):R"(AR.(@`4-`.```!#$"$D`P`$K$,8>);"
+M``(P0@'P)`,!0!1#``\T`H``CB0`%`""("&,@AA$)`/_@`!#$"0T0@`@K((8
+M1!````<\`@``CB(`%#0#@```0Q`A)`,`#JQ#&'@\`@``)$(```(@("4#P"@E
+M`$#X"2>F`!`00`'])`,``R0"``:/HP!T$&(`!P````".(@($$$``!#P"```D
+M0@```$#X"0(@("6.@BRX`B`@)0/`*"4RYO__`$#X"2>G`!`00`'K)`,``Y;"
+M``(P0@!`$$``'B0$``J.(P',$&0`#20"``D08@`+`````!1D``4`````EB(!
+MT"Q"``040``%`````):"$G`L0E`#%$``"SP"``"6P@`",$(`H"0#`*`00P`%
+M/`(``"1"```"("`E`$#X"0/`*"4\`@``)$(```(@("4`0/@)`L`H)3P"```D
+M0@```B`@)0!`^`D#P"@E$$`!PR0#``./I`!\$(``!`````".(@`4CZ4`-*Q%
+M$4".)``4-`*```""("&2@RPPDH(L,0`"$@``8A@EDH(L,@`"%```8A@EDH(L
+M,P`"%@``8A@EK(,``(XD`!0T`H```((@(9*#+#22@BPU``(2``!B&"6/H@`\
+M`&(8)8Z"+\P`8A@E/`(`@`!B&"6L@P`$/`(``"1"```"("`E`$#X"8^E`'2.
+M)``4-`*```""("&2@RP\DH(L/0`"$@``8A@EDH(L/@`"%```8A@EDH(L/P`"
+M%@``8A@EK(,`X(XD`!0T`H```((@(9*#+$"2@BQ!``(2``!B&"6L@P#DCB(`
+M%#0#@```0Q`ACZ,`.*Q#`%B.)``4-`*```""("&2@RPVDH(L-P`"$@``8A@E
+MDH(L.``"%```8A@EDH(L.0`"%@``8A@EK(,`"(XD`!0T`H```((@(9*#+#J2
+M@BP[``(2``!B&"6L@P`,CB(`%#0#@```0Q`ACH,OU*Q#`!B.(P`4)`+__ZQB
+M`(`\`@``)$(```(@("4`0/@)`\`H)1!``5PD`P`#/`(``"1"```"("`EDB42
+M.`!`^`DD!@`!/`(``"1"```"("`E`$#X"0+`*"66(@'4,$(`\"1"_]`L0@!`
+M$$``$@````".(Q(TC&(``#!"P``00``-)`<`#91F``(PQD``)`4`#(XD`!0T
+M`H```((@(8R"&"0D`__P`$,0)`#F*`H`11`EK((8)(XC`<PD`@`%%&(`#```
+M``"6(@'0.$,``BQC``$X0@`'+$(``0!B&"408``$-`.``(XB`!0`0Q`AC$(8
+M>(XB`!0T`X```$,0(8Q"&10P1#__EL(``C!"`"`00``'``00@#P#NBXT8XNC
+M`$,`&0``$!`0```&``(A`CP"S,PT0LS-`((`&0``$!```B#"CB(`%#0#@```
+M0Q`A)`,``:Q#&!R.(A(TE$(``C!"0``00``'/`(````$($`D0@```$#X"22$
+M`&00```0CB(`%(XB$C240@`",$*``!!```<\`@````0@@"1"````0/@))(0`
+M9!````6.(@`4)$(```!`^`DDA`!DCB(`%#0#@```0Q`AC%48""0#.`"L0Q@(
+M)!```8XB`!0T`X```$,0(8Q"'"0P0@`0$$``#SP"```D4P``-!*```)@^`DD
+M!`#(`@`0)2A"`!000``')A```8XB`!0`4A`AC$(<)#!"`!`40/_U`````(XB
+M`!0T`X```$,0(:Q5&`B.(P`4-`*```!B&"&,8AA@-$(``ZQB&&"6P@`",$(`
+MH"0#`*`00P`3)`(``HZ#+\`08@`0-`*``(XC`!0`8A@AC&(9(#1"\`"L8AD@
+MCB0`%#0"@```@B`AC((9(#P#``$`0Q`EK((9("0"``$0```"KH(OP*Z`+\`\
+M`@``)$(```!`^`D"("`E``"`)20&``$GI0`P`!`@@"2"T``L0A``$$``$@`0
+M$(`"!A`$KZ(`,).C`#"0H@`!``(2``!B&"60H@`"``(4``!B&"60H@`#``(6
+M``!B&"6.(@`4`$00(:Q#$``0```&)A```8XC`!0`8A@A`@80!*QB$``F$``!
+M*@(`"A1`_^0`$""`KH!&H)8B`>@00``+``"`)3P"```D4@```B`@)0)`^`D"
+M`"@E)A```98B`>@"`A`J%$#_^@(@("4\`@`(-$()9:Z"+$0D`@`&CZ,`=!1B
+M``,\`@`(-$(99:Z"+$2.(P`4CH(L1*QB`*".)``4C((`K#P#``<`0Q`EK((`
+MK(XB$DP00``$/`(``"1"````0/@)`B`@)3P"```D0@```B`@)30%F&`D!@`!
+M`$#X"0``."4\`@``)$(```(@("4`0/@)CZ4`=(XD`!0T`H```((@(8R"`"`\
+M`_Y_-&/__P!#$"2L@@`@CB,!S"QB``800``')`(`!11B`!``````EB(!T"Q"
+M``@40``,`````(XB`!0T`X```$,0(3P#``$T8P"JK$,!&(XB`!0T`X```$,0
+M(20#,A"L0P$<CB(`%#0#@```0Q`A)`,`4JQ#`0B.A"_0$(``!#0#@`".(@`4
+M`$,0(:Q$`2".A2_X)`+__Q"B``0\`@``)$(```!`^`D"("`ECH4O_"0"__\0
+MH@`$/`(``"1"````0/@)`B`@)8Z%,``D`O__$*(`!#P"```D0@```$#X"0(@
+M("6.)`'X$(``!#0#@`".(@`4`$,0(:Q$`$B/I`!TKB0!W(^E`'P0H``B)`(`
+M`9/#``0P8@`"%$```C!B`/ZCP@`$E\(``J;"``*3P@`$HL(`!(XB$C0``"`E
+M```H):Q$`#"L10`T/`(``"1"````0/@)`B`@)8XD$C2L@@`HK(,`+#P"```D
+M0@```B`@)0!`^`DD!0`!$```!B0"``&/I0"`C*(``!!```(``!`EK*,``(^_
+M`&R/O@!HC[<`9(^V`&"/M0!<C[0`6(^S`%2/L@!0C[$`3(^P`$@#X``()[T`
+M<">]_^BOOP`0/`(``21"8(P`0/@))`4``H^_`!`#X``()[T`&">]_^BOOP`4
+MK[``$`"`@"4\`@``)$(`````*"4`0/@))`8``1!```4"`"`E/`(``21"8(P`
+M0/@))`4``X^_`!2/L``0`^``"">]`!@GO?_0K[\`+*^R`"BOL0`DK[``(`"`
+MD"4`H(`E/`(``21"8(P`0/@))`4``Q!``(H``"@E/`(``"1"```"0"`E`$#X
+M"20&``$00`"$C[\`+#P"``$D0F",`D`@)0!`^`D``"@E$$``?8^_`"P2``![
+M)`(``99"`=0P0@#P)$+_T"Q"`$`40``)`````(Y"`<PX0P`'+&,``3A"``LL
+M0@`!`&(8)1!@`!4`````E@,``C!B`"`40``%)!$`"#!C`-`D`@#`%&(``P``
+M```0```>)`04UI8"``(P0D``%$``&B0$%=26`@`",$*``"0$%-0D`Q;4$```
+M%`!B(`N6`P`",&(`(!1```4``(@E,&,`T"0"`,`48@`#`````!````HD!`"K
+ME@(``C!"0``40``&)`0!JI8"``(P0H``)`0`JB0#`JH`8B`+E@,``C!B`$`0
+M0``(,&(`(!1```0P8P#0)`(`P!1B``,`````$```!38Q``26`@`",$(`0#8C
+M``$`8H@*E@4``C"C`0`V(@`"`$.("C"C`!`D`@`#`$"`)0`#@`J.0@`4-`.`
+M``!#$"&,1AA\,*(`(!1```0PHP#0)`(`P!1B`!,`````CD(`%#0#@```0Q`A
+MK%`8!(Y"`!0`0Q`AK%$B`!#$`!LD`@`!CD(`%`!#$"&L1!A\/`(``"1"````
+M0/@))`0!+!```!(D`@`!$,0`"#0#@`".0@`4`$,0(:Q$&'P\`@``)$(```!`
+M^`DD!`$LCD(`%#0#@```0Q`AK%`8!(Y"`!0`0Q`AK%$B`"0"``&/OP`LC[(`
+M*(^Q`"2/L``@`^``"">]`#`GO?_0K[\`**^Q`"2OL``@`("()0"@&"4`8(`E
+M)`7__SP"```D0@```$#X"0!C*`L`0"`E$(``"8^_`"@R`@`!%$``!@"`$"4D
+M`P`$CB(`%*Q#`!0`@!`EC[\`*(^Q`"2/L``@`^``"">]`#`GO?^8K[\`9*^R
+M`&"OL0!<K[``6`"`B"6.(@`0C$0`"!"@`2H``!`EEB(!R"1#_WHL8P`".$(`
+MD2Q"``$`8A@E$&``DP`````0@``%)`(``1""``8``!`E$``!'8^_`&0D!@`"
+M$```!"0'``$\!@`$-,8"`#P'``(\`K#_-$+`!(XC`!0`0Q`C+$(0`!!``!$`
+MYI`G/`*Q`#1"``2,0@``KZ(`0).C`$`GI`!`D((``0`"$@``8A@ED((``@`"
+M%```8A@ED((``P`"%@`0```$`&*`)3P"L0`T0@`$C%```"0"``(4H@`3`.80
+M)1```!,"!H`EK[``1).C`$20@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#
+M``(6``!B&"4\`K$`-$(`!*Q#```0```./`*P_P(2@"0"`H`E/`*P_S1"P`2.
+M(P`4`$,0(RQ"$``40/_H)Z0`1#P"L0`T0@`$K%```#P"L/\T0L`$CB,`%`!#
+M$",L0A``$$``!3P"L0`T0@`$C$(``!````0\`@``-$(`!(Q"```\`@``)$(`
+M``!`^`DD!`!D/`*P_S1"P`2.(P`4`$,0(RQ"$``00``6`A*`)#P"L0`T0@`$
+MC$(``!```!4\`K#_K[``2).C`$B0@@`!``(2``!B&"60@@`"``(4``!B&"60
+M@@`#``(6``!B&"4\`K$`-$(`!*Q#```0```//`*P_SP"L0`T0@`$C$(``#P"
+ML/\T0L`$CB,`%`!#$",L0A``%$#_YR>D`$@\`K$`-$(`!*Q0```\`K#_-$+`
+M!(XC`!0`0Q`C+$(0`!!```8`````/`*Q`#1"``2,0@``$```E20"``$\`K$`
+M-$(`!(Q"```0``"0)`(``1"```4D`@`!$((`!@``$"40``"+C[\`9"0&0`00
+M```$)`<@`#P&``0TQ@(`/`<``CP"N_\T0O`@CB,`%`!#$",L0A``$$``$0#F
+MD"<\`KP`-$(P((Q"``"OH@!,DZ,`3">D`$R0@@`!``(2``!B&"60@@`"``(4
+M``!B&"60@@`#``(6`!````0`8H`E/`*\`#1","",4```)`(``A2B`!,`YA`E
+M$```$P(&@"6OL`!0DZ,`4)""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8)3P"O``T0C`@K$,``!````X\`KO_`A*`)`("@"4\`KO_-$+P((XC
+M`!0`0Q`C+$(0`!1`_^@GI`!0/`*\`#1",""L4```/`*[_S1"\"".(P`4`$,0
+M(RQ"$``00``%/`*\`#1","",0@``$```!#P"```T0C`@C$(``#P"```D0@``
+M`$#X"20$`&0\`KO_-$+P((XC`!0`0Q`C+$(0`!!``!8"$H`D/`*\`#1","",
+M0@``$```%3P"N_^OL`!4DZ,`5)""``$``A(``&(8)9""``(``A0``&(8)9""
+M``,``A8``&(8)3P"O``T0C`@K$,``!````\\`KO_/`*\`#1","",0@``/`*[
+M_S1"\"".(P`4`$,0(RQ"$``40/_G)Z0`5#P"O``T0C`@K%```#P"N_\T0O`@
+MCB,`%`!#$",L0A``$$``!3P"O``T0C`@C$(``!````0D`@`!-$(P((Q"```D
+M`@`!C[\`9(^R`&"/L0!<C[``6`/@``@GO0!H`````">]_ZBOOP!4K[X`4*^W
+M`$ROM@!(K[4`1*^T`$"OLP`\K[(`.*^Q`#2OL``P`("@)0"@J"4`P+`E`."`
+M)0*`\"4``(@E/`(``"13*I`GL@`@/`(``"17````$1!``%$8(0`#$,``4Q`A
+MC$0``"2"P``L0A``$$``%@`1$$```Q!``%40(0`"$(``4Q`AC$(``*^B`""3
+MHP`@DD(``0`"$@``8A@EDD(``@`"%```8A@EDD(``P`"%@``8A@ECH(`%`!$
+M$"&L0P``$```#B80``$`41`A``(8P`!S&"&.A``4C&,```"#("$``A!``%40
+M(0`"$(``4Q`AC$(``*R"```F$``!,@(`/Q1```,``````N#X"20$``$F,0`!
+M+B(`$!1`_\X`$1!```"()3P"```D4RP0)[(`)#P"```D50```!$8P`!S$"&,
+M1```)(+``"Q"$``00``2`',0(8Q"``2OH@`DDZ,`)))"``$``A(``&(8)9)"
+M``(``A0``&(8)9)"``,``A8``&(8)8Z"`!0`1!`AK$,``!````@F$``!CH0`
+M%(Q"````@B`A`',8(8QB``2L@@``)A```3("`#\40``#``````*@^`DD!``!
+M)C$``2XB`(L40/_:`!$8P```B"4\`@``)%,P:">R`"@\`@``)%4````1$$``
+M41@A``,0@`!3$"&,1```)(+``"Q"$``00``5`!$00`!V$"$``A"``%,0(8Q"
+M``"OH@`HDZ,`*))"``$``A(``&(8)9)"``(``A0``&(8)9)"``,``A8``&(8
+M)8Z"`!0`1!`AK$,``!````TF$``!`%$0(0`"&(``<Q@ACH0`%(QC````@R`A
+M`%80(0`"$(``4Q`AC$(``*R"```F$``!,@(`/Q1```,``````J#X"20$``$F
+M,0`!+B(`0!1`_]``$1!`C\(OV!1```DT`H``CH0`%`""("&,@B-8)`/__0!#
+M$"2L@B-8$````X^_`%2OP"_8C[\`5(^^`%"/MP!,C[8`2(^U`$2/M`!`C[,`
+M/(^R`#B/L0`TC[``,`/@``@GO0!8)[W_R*^_`#2OM``PK[,`+*^R`"BOL0`D
+MK[``(`"`F"4`H)`E``"@)99%```LHA+`$$``0@``@"4DI/=P/`=F9C3G9F<`
+MAP`8```8$``#&$,`!!?#`&(8(P`#$(``0Q`A%((`"22D]U``!1!`)%'NX`(G
+M`!@``!`0``(0@P`1'\,0```4`$.((SP&9F8TQF9G`(8`&```&!```QA#``07
+MPP!B&",``Q"``$,0(12"`)(``!`E``400"11[J`")@`8```0$``"$(,`$1_#
+M`$.((R04``$`$8B`/`(``"1"```R)`#_`$#X"20%``@`0(@ECF,`%#0"@```
+M8B`AC(4B!)9#```D`@FT%&(`!30"@``TH@`0K((B!!```&4`$3$`CF,`%`!B
+M&"$D`O_O`*(0)*QB(@00``!>`!$Q`)9$```\`\S,-&/,S0"#`!D``!@0``,9
+M`@`#$(``0Q`A``(0@`""$",P0O__%$``%2R"%``40``3)(+M0#P$9F8TA&9G
+M`$0`&```(!``!"##``(7PP""(",\$```)A`````$((`"`/@))`4`"`!`B"4D
+M!``#`@#X"20%``(0```\`$"`)3P#S,PT8\S-`(,`&0``&!```QC"``,0@`!#
+M$"$``A!``((0(S!"__\40``3)(+M0#P$9F8TA&9G`$0`&```(!``!""#``(7
+MPP""(",\$```)A`````$($`"`/@))`4`"`!`B"4D!``"`@#X"20%``(0```>
+M`$"`)99$```\`\S,-&/,S0"#`!D``!@0``,8@@`#$(``0Q`A`((0(S!"__\4
+M0``E```0)22$[4`\`F9F-$)F9P""`!@``!`0``(00P`$)\,\$```)A````!$
+M(","`/@))`4`"`!`B"4D!``!`@#X"20%``(`0(`E`!$Q```0$(``PC`E`!00
+M0`#","4TQA`!CF(`%#0#@```0Q`A,,,`_ZQ#&)P`!C("CF(`%#0#@```0Q`A
+M,,,`?ZQ#&-BN<A(T)`(``8^_`#2/M``PC[,`+(^R`"B/L0`DC[``(`/@``@G
+MO0`X)[W_F*^_`&2OO@!@K[<`7*^V`%BOM0!4K[0`4*^S`$ROL@!(K[$`1*^P
+M`$``@*@E,-/__P*@N"4``*`EE*(``C!#`?`D`@#`$&(`$([R+^PH8@#!$$``
+M!B0"`-`D`@"@$&(`!P``$"40``%MC[\`9!!B``8``!`E$``!:8^_`&26Y1-D
+M$````Y;V$V:6Y1-HEO83:@``("4\`@``)$8S:``$$(`"0A`A``08P`!F&"&,
+M8P`$)(0``1"`__FL0P`````@)29&``0\`@``)$<S<``$$(``PA`A``080`!D
+M&"$``QA``',8(0`#&(``9Q@AC&,``"2$``$0@/_UK$,`````("4\`@``)$8S
+MB``$$(``4A`A``080`!D&"$``QA``',8(0`#&(``9A@AC&,``"2$``$0@/_U
+MK$,`"```("4F1@`$/`(``"1',Z``!!B``&88(0`$$$``1!`A``(00`!3$"$`
+M`A"``$<0(8Q"``"L8@`()(0``2R"`!T40/_S)E$`#*^@`!`\$```)A````(@
+M("4D!@`#`@#X"20'`+*OH``0`B`@)0+`*"4D!@`#`@#X"20'`*\``"`E/`(`
+M`"1%-E@`!!B``'(8(0`$$$``1!`A``(00`!3$"$``A"``$40(8Q"``"L8@"`
+M)(0``2R"``,40/_T``08@```@"4\`@``)%,S:">Q`"@\`@``)%8````0$,``
+M4Q`AC$0``"2"P``L0A``$$``%``0$,``$!"``D(0(8Q"``"OH@`HDZ,`*)(B
+M``$``A(``&(8)9(B``(``A0``&(8)9(B``,``A8``&(8)8ZB`!0`1!`AK$,`
+M`!````HFE``!`%,0(8ZC`!2,0@```&(8(0`0$(`"0A`AC$(``*QB```FE``!
+M,H(`/Q1```,``````L#X"20$``$F$``!$@#_UCP"`````(`E)%8S<"93``0G
+ML0`L/`(``"1>````$!!``%`0(0`"$,``5A`AC$0``"2"P``L0A``$$``%``0
+M$$``$!"``F(0(8Q"``"OH@`LDZ,`+)(B``$``A(``&(8)9(B``(``A0``&(8
+M)9(B``,``A8``&(8)8ZB`!0`1!`AK$,``!````PFE``!`%`0(0`"$,``5A`A
+MCJ,`%(Q"````8A@A`!`0@`)B$"&,0@``K&(``":4``$R@@`_%$```P`````#
+MP/@))`0``280``$2`/_2/`(`````@"4D4S.()[$`,#P"```D5@```!`00`!0
+M$"$``A#``%,0(8Q$```D@L``+$(0`!!``!0`$!!``!`0@`!2$"&,0@`(KZ(`
+M,).C`#"2(@`!``(2``!B&"62(@`"``(4``!B&"62(@`#``(6``!B&"6.H@`4
+M`$00(:Q#```0```,)I0``0!0$"$``A#``%,0(8ZC`!2,0@```&(8(0`0$(``
+M4A`AC$(`"*QB```FE``!,H(`/Q1```,``````L#X"20$``$F$``!$@#_TCP"
+M`````(`E)%8SH"93``0GL0`T/`(``"1>````$!!``%`0(0`"$,``5A`AC$0`
+M`"2"P``L0A``$$``%``0$$``$!"``%,0(8Q"``BOH@`TDZ,`-)(B``$``A(`
+M`&(8)9(B``(``A0``&(8)9(B``,``A8``&(8)8ZB`!0`1!`AK$,``!````PF
+ME``!`%`0(0`"$,``5A`ACJ,`%(Q"````8A@A`!`0@`!3$"&,0@`(K&(``":4
+M``$R@@`_%$```P`````#P/@))`0``280``$N`@`=%$#_T@`0$$```(`E/`(`
+M`"13-E@GL0`X/`(``"16````$!!``%`0(0`"$,``4Q`AC$0``"2"P``L0A``
+M$$``%``0$$``$!"``%(0(8Q"`("OH@`XDZ,`.)(B``$``A(``&(8)9(B``(`
+M`A0``&(8)9(B``,``A8``&(8)8ZB`!0`1!`AK$,``!````PFE``!`%`0(0`"
+M$,``4Q`ACJ,`%(Q"````8A@A`!`0@`!2$"&,0@"`K&(``":4``$R@@`_%$``
+M`P`````"P/@))`0``280``$N`@`#%$#_T@`0$$"NX"_$)`(``8^_`&2/O@!@
+MC[<`7(^V`%B/M0!4C[0`4(^S`$R/L@!(C[$`1(^P`$`#X``()[T`:"2C__\L
+M8@`'$$``$HR$+^P\`@``)$(VH``#&(``8A@AC&(```!```@``````^``"`"`
+M$"4#X``()((`!`/@``@D@@`(`^``""2"``P#X``()((`@`/@``@``!`E``0D
+M`##&__\`!"0#``800`"B0"&4H@```((0*A!```2/J0`0K2````/@``BLX```
+MA0+__@""$"H40``.`*`8)23"__^M(@```^``"*SB`````A!#K2(```/@``BL
+MX@````(00ZSB```D0@`!`^``"*TB````:!`K$$``#`````"$8@``$$3_\@!E
+M$".$8@`"`((0*A1`__(`91`C)&,``@!H$"L40/_V``````/@``@`````)[W_
+MN*^_`$2OO@!`K[<`/*^V`#BOM0`TK[0`,*^S`"ROL@`HK[$`)*^P`""OI`!(
+M`."0)8^T`%B/O@!@``4L```%+`,`!C0```8T`Y>S`%X`!11```*$`P``B"4N
+M8P`"%&``3P``$"4`Q1`C,$+__P!1$"L40`!*)`(``3P"``$D5W+`)G;__P#%
+M$",P5?__)Z(`'*^B`!`"`"`E`D`H)0)@,"4"X/@))Z<`&(^B`!P40``$CZ(`
+M&"0"``&OH@`<CZ(`&!16``2/H@`8)F+__J^B`!B/H@`8``(@0`"2&"&/H@`<
+M``(00`!2$"&$8P``A$(``!1B``,`E!`A$```&91#``"/I``8``0@0`"2$"&$
+M2````@@H(X^B`!P``A!``%08(81G````4A`AA$,```!P,",`E"`AA((```#"
+M`!APIP`````H$@!H&",`HP`:```H$A1@``(```````<`#3"C__^/I`!(``01
+M@`!1$"$``A!``%X0(:1#```F(@`!,%'__R8"``(``A0```*$`P*Q$"L00/^_
+M)Z(`'"0"``&/OP!$C[X`0(^W`#R/M@`XC[4`-(^T`#"/LP`LC[(`*(^Q`"2/
+ML``@`^``"">]`$@P@___,*7__S#&__\`!SP```<D`Q#%``^'IP`2`&40(P##
+M&",`9``8<$<`````$!(`Q1@C`$,`&@``$!(48``"```````'``T``A0``^``
+M"``"%`,#X``(`(`0)2>]^8BOOP9TK[X&<*^W!FROM@9HK[4&9*^T!F"OLP9<
+MK[(&6*^Q!E2OL`90KZ8&@#"E__^OI08X,.?__Z^G!CROH`9```4D`)3&`!0G
+MH@8PKZ(`$#P"``$D0G+```0D`X^E!H``0/@))Z<&-```F"4GH@8@KZ(&1(^C
+M!H`D8P`,KZ,&2">D!BBOI`9,)`(``P!30",`"!!``$@0(0`".,"/HP8T``,0
+M0`!#$"$``AD``$,0(0`"$$``XC`A),4`&(^I!H`!)1`AE%0`"!*``+:/H@9`
+M``(@0(^I!I``B1@ACZD&@`$E$"&40@`&I&(``(^B!D0`1"@ACZ,&2`##$"&4
+M1``@I*0``(^C!C```Q!``$,0(0`"&0``0Q`A``(00`#B$"&/I@9(`$80(0`$
+M)```!"0#E$,`((1"`"``1!`J$$```X^I!D"DHP``CZD&0``)*$"/H@9$`$4@
+M(92"`````A0```(<`P`"%\(`8A@A``,80Z2#``"/HP9,`&4P(0`(($``B"`A
+M``0@@(^C!C0``Q!``$,0(0`"&0``0Q`A`((0(0!4$"$``A!`CZ4&2`!%$"&4
+M10`>I,4``(^C!C```Q!``$,0(0`"&0``0Q`A`((@(0"4("$`!"!`CZD&2`")
+M("$`!2P```4L`X2"`!X`11`J$$```I2#`!ZDPP``CZ(&0``"B$"/HP9,`'&0
+M(99"`````A0```(T`P`"%\(`PC`A``8P0Z9&``"/I`9$`)&((88E``"/H@8T
+M``(X0`#B."$`!Q$``.(X(0`'.$``"(!``@B`(0`0@,``\#@ACZD&@`#I."$D
+MX@`BKZ(`$*^T`!0GH@`@KZ(`&(^D!D`\`P`!)&-S=`!@^`DDYP`LAB4``(9&
+M``"/H@8P``(X0`#B."$`!Q$``.(X(0`'.$``\#@ACZ0&@`#D."$DX@`BKZ(`
+M$*^T`!0GH@(@KZ(`&(^D!D`\"0`!)2ES=`$@^`DDYP`LED,``)8B````8A@C
+M,&/__Q!@`"D``(@ECZ(&0``"\8`GMP`@)[8"(">U!"```AA`)Z(&*`!#H"$G
+MH@8@`$.0(8^B!C0``A!`CZ,&@`!B$"&410``CZ(&,``"$$``8A`AE$8```/1
+M@"$`$(!``O`0(81'```"T!`AA$(``*^B`!`\"0`!)2EU1`$@^`F/I`8X`K"`
+M(:8"```F,0`!EH(``)9#````0Q`C,$+__P(B$"L40/_DCZ(&-(^B!D`D0@`!
+MKZ(&0"9S``$N8@`$%$#_-R0"``.7HP8@CZ(&B*1#`````)@ECZ,&0!!@`)D`
+M`(@E)ZT&*">L!B`GJP0@)`X``8^D!D`D@O__%F(`"0`3&$``$Q!`CZ4&C`!%
+M&"$!HA`AE$(``"1"``00```,I&(``(^F!HP`9B`A`:,0(81"````;!@AA&,`
+M`@!#$"$``A_"`$,0(0`"$$.D@@``$F``"@``("4`$QA`CZD&C`$C$"&41/_^
+M`8,8(81B````@B`CCZ(&/`""(",`$QG``&L0(0%C&"&40@`"E&,```!#$",P
+M0___!($`$P'#&`H`$Q'``Z(0(91'!"!P@R@"`*<0(0`"%````BP#`!$00(^F
+M!I0`1A`A!*```R8Q``$0```"I$4``*1````DA``!!(#_\W"#*`(`$QA``:,0
+M(81)```!@Q`AA$(```$B2"./I0:,`&48(91E``"/I@8\`*8H(0"B*",!(%`E
+M`*H0*P"B4`L`"A0``$`8)0`"%`,`@A`J$$``$0`3$8``$T&`)Z<$(``#-`,`
+M$1A`CZ(&E`!B&"$!!!`A``(00`#B$"&40@``I&(``"2$``$`AA`J%$#_]28Q
+M``$`$Q&``$D0(21#__\``QA``6,8(21"__X``A!``6(0(91C``"40@```&(8
+M(S!C__\!11`K$$``(`'#&`H`!10```(4`P""$"H00``;`!,1@`!)$"$D0O__
+M``(00`.B$"&43P0@)`@`?P`%%````CP#`(H0(W!#*`(`KQ`A``(4```"+`,`
+M$1!`CZD&E`!),"$HH@"`$$```R8Q``$0```"I,4``*3(```DA``!`(<0*A1`
+M__``BA`C)G,``8^C!D`"8Q`K%$#_;0`````N8@`$$$``"RXB`(``$Q!`CZ0&
+MC`!$$"&40__^I$,``"9S``$N8@`$%$#_^0`3$$`N(@"`$$``"X^_!G0`$1!`
+MCZ4&E`!%$"&40__^I$,``"8Q``$N(@"`%$#_^0`1$$"/OP9TC[X&<(^W!FR/
+MM@9HC[4&9(^T!F"/LP9<C[(&6(^Q!E2/L`90`^``"">]!G@GO?^8K[\`8*^U
+M`%ROM`!8K[,`5*^R`%"OL0!,K[``2`"`D"4"0)@ECE1&>)3B``(P0@#0.$,`
+MP"QC``$X0@#0+$(``0!B&"448``')E$G_)3C``(P8P"@)`0`H"9Q(^@49`!I
+M```0)8Y"`!0T$(```%`0(8Q"(FPP50`/E.4``">B`"BOH@`0)Z(`(*^B`!2/
+MH@!XKZ(`&*^T`!P\`@`!)$)UH`)`("4"(#`E`$#X"0*@."6.1``4`)`@(8R#
+M(E@\`O__-$(__P!B&"26(@`<)$+__P`"$X`P0L```&(8):R#(EB'H@`H$$``
+M!)>C`"@``Q`C$````J9B+_2F8"_T-`6B@```."4GI@!```<8P`!T&"&09``!
+MD&(``P`"$@``@B`ED&(`!0`"%```@B`ED&(`!P`"%@``@B`E)*+``"Q"$``0
+M0``1`````*^D`$"3HP!`D,(``0`"$@``8A@ED,(``@`"%```8A@ED,(``P`"
+M%@``8A@ECD(`%`!%$"&L0P``$```!22E``2.0@`4`$40(:Q$```DI0`$).<`
+M`2SB`"`40/_:``<8P(Y%`!0T`H```*(H(9>C`"```QD`,&,#\`*C&"67H@`B
+M``(2@#!"_```8A@EEZ(`)``"%``\!``_`$00)`!B&"67H@`F``(5@#P$#\``
+M1!`D`&(8):RC(FPD`@`!C[\`8(^U`%R/M`!8C[,`5(^R`%"/L0!,C[``2`/@
+M``@GO0!H)[W_Z*^_`!2OL``0`("`)8X$1G@0@``%/`(``"1"````0/@)````
+M`*X`1GB.!"_L$(``!3P"```D0@```$#X"0````"N`"_LC[\`%(^P`!`#X``(
+M)[T`&```("4D!P`#)*8`""2E``P`Y!@C``,00`!#$"$``AC``,,0(91"```0
+M0``%)(0``22$__\`91`A`^``"(1"``@L@@`$%$#_\P#D&",``!`E``(4``/@
+M``@``A0#```P)22G``@DI0`,``800`!&("$`!!#``.(0(91#```08``(),8`
+M`23&__\`!!"``$,0(0`"$$``11`A`^``"(1"``8LP@`$%$#_\```$"4``A0`
+M`^``"``"%`,GO?_(K[\`-*^^`#"OMP`LK[8`**^U`"2OM``@K[,`'*^R`!BO
+ML0`4K[``$`"`J"4`H+`E`,"X)0#@\"4"H#`EIN```);"``(P0@#0.$,`P"QC
+M``$X0@#0+$(``0!B&"448``')J4G_);#``(P8P"@)`0`H"3%(^@49`".```0
+M)92D`!0DL0`8$(``B@``$"66PP``EB(```!B$"L40``-/`(``20"`&9P@B@"
+M`+$0(91"_YH`0Q`K$$``$P``,"4D$`!F<)`0`@!1@"$0``!J)A#_FB1"?T0"
+MH"`E`$#X"0(@*"6FX@``/`(``21"?N@"H"`E`$#X"0(@*"6GP@``$```;"0"
+M``$0@``3```H)9;#``"6(@```$,0*Q!```\D`@!F)`<`9@"@,"4DI0`!`*00
+M*A!```DD`@!F<*<8`@!Q$"&6PP``E$(```!#$"L40/_U`````"0"`&9PHA@"
+M`'&@(9:2``!PPA@"`'&8(99B```"0I`C&D``.`*@("4\$0`!)C%_1`(@^`D"
+M@"@E`$"`)0*@("4"(/@)`F`H)0("@","H"`E`B#X"0)@*"66PP``EF0```!D
+M&",`4@`8<@,`````@!("$@`:``"`$A9```(```````<`#0`0A@``$(8#IO``
+M`#P1``$F,7[H`J`@)0(@^`D"@"@E`$"`)0*@("4"(/@)`F`H)0("@","H"`E
+M`B#X"0)@*"66PP``EF0```!D&",`4@`8<@,`````@!("$@`:``"`$A9```(`
+M``````<`#0`0A@``$(8#I]```!```!<D`@`!)`(`9G"B&`(`<8`AEL,``)8"
+M```48@`/`````#P"``$D0G]$`J`@)0!`^`D"`"@EIN(``#P"``$D0G[H`J`@
+M)0!`^`D"`"@EI\(``!````(D`@`!```0)8^_`#2/O@`PC[<`+(^V`"B/M0`D
+MC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`.">]_\BOOP`TK[8`,*^U`"RO
+MM``HK[,`)*^R`""OL0`<K[``&`"`L"4`H*@E`,"0)203``$20``5``"()3P"
+M``$D5'^@`!$0P`*B@"$"P"`E`@`H)2>F`!`"@/@))Z<`$A!```63H@`1H@(`
+M!I.B`!,0```"H@(`!P``F"4F,0`!`C(0*Q1`__``$1#``F`0)8^_`#2/M@`P
+MC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`#@GO?_@K[\`&*^Q`!2O
+ML``0`*"()0"`@"4\`@``)$(```!`^`DD!`",`$`8)11@``2N`R_L)`,``A``
+M`">N(P``)`(!`*X"1GP\`@``)$(```!`^`DD!`$``$`8)11@``2N`T9X)`,`
+M`A```!NN(P``/`(``21"?I"N`BRH/`(``21"9>"N`BRL/`(``21"<F2N`BRP
+M/`(``21":0"N`BRT/`(``21";!BN`BRX/`(``21"?&2N`BR\/`(``B1"@H2N
+M`BS`/`(``"1"``"N`BS$)`(``:X"+]B/OP`8C[$`%(^P`!`#X``()[T`(```
+M````````071H97)O<R`U,C$P`````$%T:&5R;W,@-3(Q,0````!!=&AE<F]S
+M(#4R,3$@*$901T$I`$%T:&5R;W,@-3(Q,B`H1E!'02D`071H97)O<R`U,S$R
+M(%=I4V]#``!!=&AE<F]S(#(S,34@5VE3;T,``$%T:&5R;W,@,C,Q-R!7:5-O
+M0P``071H97)O<R`R,S$S(%=I4V]#``!!=&AE<F]S(#4T,C0O,C0R-````$%T
+M:&5R;W,@-3(Q,@`````H4!8L6"@```````````O(```+V```"]@```O@```+
+MZ```#`0```P,```,'```#@````PL```,0```#)P```Q4```,;```#(0```RL
+M```.````#@````T0```-)```#3@```U````+_```#5@```UL```-@```#@``
+M``X````-V```#@````W@```.````#@````X````-\/^@_Z/_GO^@_Z/_H$%2
+M-3(Q,@``05(U,S$R``!21C(S,38``%187T1%4T-?4U=!4```````````````
+M``````4`"@`4`!X`,@!&`%4`6@!?`&0```````H`%``>`"@`,@`\`$8`4`!:
+M`&0``````,(```#$````Q0```-````#:````Y````,(```##````U````/(`
+M``$-```!*````,\```#*`````````````B%0``$!0``$`*``"`#``"``T`!`
+M`5```````````!E4$!0&$"8`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````!D4```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````);`F/";0```D("6P)M```________```%`@\'`@\*``\)``\`````
+M`````````````(L<``"*R```BM```(M@``"*[```BU@`````````````````
+M```@````(````$````!```8````&````!@``%IX`"Q9B``H6.@`)%AP`"!7J
+M``<5F@`%%4H`!!4#``(460``"[@``0````````````"J*```JH@``*JP``"M
+M(```JR@``*T@``"M(```K2```*T@``"M(```JUP``*T@``"M(```K2```*T@
+M``"K;```JXP``*T@``"KU```J_@``*T@``"J[```K2```*T@``"M(```K#@`
+M`*Q,``"M(```K&0```````"LX```K.P``*SX``"M!```K1``````````!@``
+M``$````"`````P````0````%``"M@```K;0``*^$``"N"```KX0``*^$``"O
+MA```KX0``*^$``"N2```KX0``*^$``"OA```KX0``*YD``"OA```KX0``*YT
+M``"O2```KX0``*^$``"OA```KX0``*^$``"NJ```KJ@``*^$``"O$```````
+M```````00``O_`\`+_P/`"_\'P`O_`\`+_P/```01``O_`\`+_P/`"_\'P`O
+M_`\`+_P/```02``O_`\`+_P/`"_\'P`O_`\`+_P/```03``O_`\`+_P/`"_\
+M'P`O_`\`+_P/```04``O_`\`+_P/`"_\'P`O_`\`+_P/```05``O_`\`+_P/
+M`"_\'P`O_`\`+_P/```06``O_`\`+_P/`"_\'P`O_`\`+_P/```07``O_`\`
+M+_P/`"_\'P`O_`\`+_P/```08``O_`\`+_P/`"_\'P`O_`\`+_P/```09``O
+M_`\`+_P/`"_\'P`O_`\`+_P/```0,````C````'@````L````6````'@```0
+M<````6@```'@```!N````8P```'@```0L```#F```!&````?'```/C@``!&`
+M```0\```H.```4!H``!8@```L.```4!H``"`%`/H`^@&X`;@!"`$(`A`"$`&
+MX`;@``"8!``````````#```````````````#``"8(`("`@`"`@(``@$"``("
+M`@`"`@(```"8)```#@X```X.```'!P``#@X```X.``"81!-R%AP3<APE$W(7
+M(A-R%J(3<APE``"88```G1```)T0``"=&```G1@``)T0``"89``!S@```<X`
+M``'.```!S@```<X```"8:$":09!`FD&00)I!D$":09!`FD&0``"9&````;@`
+M``&X````A````0@```&X``"9)!`%B@40!8H%$`6*!1`%B@40!8H%``"B,```
+M`````````````````0@`````````#``````````T````!0```$``````````
+M1`````@```!(````"````$P````0````4`````````!4````'P``"```````
+M```(!`````````@(````````"`P````````($`````````@4````````"!@`
+M```````('`````````@@````````""0````````2<````````!`X````````
+M$'@````````0N````````!#X````````$3@````````1>````````!&X````
+M````$?@````````2.````````!)X````````$K@````````2^````````!,X
+M````````$W@````````3N````````!/X````````%#@````````4>```````
+M`!2X````````%/@````````5.````````!5X````````%;@````````5^```
+M`````!8X````````%G@````````6N````````!;X````````%S@````````7
+M>````````!>X````````%_@````````0/````````!!\````````$+P`````
+M```0_````````!$\````````$7P````````1O````````!'\````````$CP`
+M```````2?````````!*\````````$OP````````3/````````!-\````````
+M$[P````````3_````````!0\````````%'P```````"`!````````(`(````
+M````@`P```````"`(````````(`D````````@"@````P``"`+``'__\``(`P
+M`?___P``@#0````Q``"`.````````(`\````````@$@```````"`5```````
+M`(!8````````@%P`#\>/``"`P"J",!H``(#$!=P!X```@,@?0"<0``"`S`'T
+M`````(#0```>'```@-0``JJJ``"`V`(`554``(#<````````@.#_____``"`
+MY```__\``(#H````````@.P```````"`\````````(#T````````@/@`````
+M``"`_````(@``(<`````````AP0```",``"'"````.0``(<,```"U0``AQ``
+M``````"'%````````(<8````H```AQP```')``"'(````"P``(<D````+```
+MAR@````P``"'+````#P``(<P````+```AS0````L``"'.````#```(<\````
+M/```AT````````"'1````````(=(````````ATP```````"'4````````(=4
+M````````AU@```````"'7````````(=@````U0``AV0```#?``"':````0(`
+M`(=L```!.@``AW````!U``"'=````'\``(=X````H@``AWP```````"!```!
+M``(``($$`````0``@0@```#```"!#````````($0```!:```@10```````"'
+MP`,"`0```(?$!P8%!```A\@+"@D(``"'S`\.#0P``(?0$Q(1$```A]07%A44
+M``"'V!L:&1@``(?<'QX='```A^`#`@$```"'Y`<&!00``(?H"PH)"```A^P/
+M#@T,``"'\!,2$1```(?T%Q85%```A_@;&AD8``"'_!\>'1P``)@,K82.&0``
+MF!!]*.````"8%)P*GVL``)@<````````F$`@:@%Z``"85```"%D``)D`````
+M````F00```````"9"````````)D,`(``````F1`````!``"9'```#(```)D@
+M!1``````F2@````!``"9+`````0``)DT'A\@(@``F3@*"PP-``"9/````#\`
+M`)E(DH"R$@``F51=4.&(``"97`!+:HX``)EH```#S@``F7`9+[45``"9>```
+M``$``)E\````````HA``@&,S``"B%``0;!```*(8`)Q`8```HB`!B##&``"B
+M)```!````*(L````````HC0@("`@``"B."`@("```*)`.$D*(```HD0``'NV
+M``"B2`__/_P``)L`````````FR@````,``";.````!(``)MD````(0``FXP`
+M```M``";G````#,````#``8`"0`_```````#``8`"0`_```````)````!``$
+M``$``0`!```````````````&1D<X```````````````````$`````0`!````
+M```````````$1D<W```````````````````#``$``0`!```````````````#
+M1D<V```````````````````$```````!```````````````!1D<U````````
+M```````````$``$``0``````````````````1D<T```````````````````$
+M`````0````````````#____^1D<S```````````````````#``$``0``````
+M``````#____]1D<R```````````````````$``````````````````#____\
+M1D<Q```````````````````"``$``0````````````#____Z1D<P````````
+M````````````````````````````````````````````````````````````
+M``@````!``,```````````````````````9&1S<```````````````````(`
+M``````````````````````!&1S8```````````````````$`````````````
+M`````/____U&1S4``````````````````````````````````````/____I&
+M1S0``````````````````````0`!`````````````/____A&1S,`````````
+M`````````````0`!`````0`!`````/____9&1S(`````````````````````
+M`0````$``0`!`````/____-&1S$``````````````````````0````$``0``
+M``$``/____!&1S``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````@````0````&````"`````H````,````#@```!```2TP``$F
+MJ``!)^@``2HL``$JK``!*U0``2PD``````EL"8\)M```"0@);`FT`````!!`
+M`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!$`"_\#P`O_`\`+_P?`"_\#P`O_`\`
+M`!!(`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!,`"_\#P`O_`\`+_P?`"_\#P`O
+M_`\``!!0`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!4`"_\#P`O_`\`+_P?`"_\
+M#P`O_`\``!!8`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!<`"_\#P`O_`\`+_P?
+M`"_\#P`O_`\``!!@`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!D`"_\#P`O_`\`
+M+_P?`"_\#P`O_`\``!`P```",````>````"P```!8````>```!!P```!:```
+M`>````&X```!C````>```!"P```.8```$8```!\<```^.```$8```!#P``"@
+MX``!0&@``%B```"PX``!0&@``(`4`^@#Z`;@!N`$(`0@"$`(0`;@!N```)@$
+M``````````,```````````````,``)@@`@("``("`@`"`0(``@("``("`@``
+M`)@D```.#@``#@X```<'```.#@``#@X``)A$$W(6'!-R'"43<A<B$W(6HA-R
+M'"4``)A@``"=$```G1```)T8``"=&```G1```)AD``'.```!S@```<X```'.
+M```!S@```)AH0)I!D$":09!`FD&00)I!D$":09```)D8```!N````;@```"$
+M```!"````;@``)DD$`6*!1`%B@40!8H%$`6*!1`%B@4``*(P````````````
+M```````!"``````````,`````````#0````%````0`````````!$````"```
+M`$@````(````3````!````!0`````````%0````?```(``````````@$````
+M````"`@````````(#`````````@0````````"!0````````(&`````````@<
+M````````""`````````()````````!)P````````$#@````````0>```````
+M`!"X````````$/@````````1.````````!%X````````$;@````````1^```
+M`````!(X````````$G@````````2N````````!+X````````$S@````````3
+M>````````!.X````````$_@````````4.````````!1X````````%+@`````
+M```4^````````!4X````````%7@````````5N````````!7X````````%C@`
+M```````6>````````!:X````````%O@````````7.````````!=X````````
+M%[@````````7^````````!`\````````$'P````````0O````````!#\````
+M````$3P````````1?````````!&\````````$?P````````2/````````!)\
+M````````$KP````````2_````````!,\````````$WP````````3O```````
+M`!/\````````%#P````````4?````````(`$````````@`@```````"`#```
+M`````(`@````````@"0```````"`*````#```(`L``?__P``@#`!____``"`
+M-````#$``(`X````````@#P```````"`2````````(!4````````@%@`````
+M``"`7``/QX\``(#`*H(P&@``@,0%W`'@``"`R!]`)Q```(#,`?0`````@-``
+M`!X<``"`U``"JJH``(#8`@!550``@-P```````"`X/____\``(#D``#__P``
+M@.@```````"`[````````(#P````````@/0```````"`^````````(#\````
+MB```AP````````"'!````(P``(<(````Y```APP```+5``"'$````````(<4
+M````````AQ@```"@``"''````<D``(<@````+```AR0````L``"'*````#``
+M`(<L````/```AS`````L``"'-````"P``(<X````,```ASP````\``"'0```
+M`````(=$````````AT@```````"'3````````(=0````````AU0```````"'
+M6````````(=<````````AV````#5``"'9````-\``(=H```!`@``AVP```$Z
+M``"'<````'4``(=T````?P``AW@```"B``"'?````````($```$``@``@00`
+M```!``"!"````,```($,````````@1````%H``"!%````````(?``P(!````
+MA\0'!@4$``"'R`L*"0@``(?,#PX-#```A]`3$A$0``"'U!<6%10``(?8&QH9
+M&```A]P?'AT<``"'X`,"`0```(?D!P8%!```A^@+"@D(``"'[`\.#0P``(?P
+M$Q(1$```A_07%A44``"'^!L:&1@``(?\'QX='```F`RMA(X9``"8$'THX```
+M`)@4G`J?:P``F!P```````"80"!J`7H``)A4```(60``F0````````"9!```
+M`````)D(````````F0P`@`````"9$`````$``)D<```,@```F2`%$`````"9
+M*`````$``)DL````!```F30>'R`B``"9.`H+#`T``)D\````/P``F4B2@+(2
+M``"95%U0X8@``)E<`$MJC@``F6@```/.``"9<!DOM14``)EX`````0``F7P`
+M``````"B$`"`8S,``*(4`!!L$```HA@`G$!@``"B(`&(,,8``*(D```$````
+MHBP```````"B-"`@("```*(X("`@(```HD`X20H@``"B1```>[8``*)(#_\_
+M_```FP````````";*`````P``)LX````$@``FV0````A``";C````"T``)N<
+M````,P``````````````,````!4````5````%0```!4````5``"`'!*-DZ<)
+MB!//!.`3E1+@$ZL)B!//``"8*`H"``$*`@`!!0(```H"``$*`@`!``"8-```
+M#@````X````.````#@````X```"8.`````(````"````"@````H````*``"8
+M2``8VFT`&-IM`!IJ9``::F0`&FID``"84`WHM.`-Z+3@#>BPV@R8L-H-Z+#:
+M``"86'Z`#2Y^@`TN?N@-+G[(#2Y^@`TN``"87#$W9EXQ-V9>,3=F7C$Y8%XQ
+M-V9>``"8;`4,L($%#+"!!0RP@04,L($%#+"!``"9%```!]````?0```$3```
+M")@```?0``"91/>X$`#WN!``][@-`/>X$`#WN!````"B!```````````````
+M``````````````"B"-:^9XC6OF>(T#YGB-`^9XC0/F>(``"B#``L`4``+`%`
+M`$+!0`!"P4``0L%```"B'!B#@`H8@X`*&&.`"AB#@`H8@X`*```2,````^``
+M`(!@````#P``@1@```````"!'````````($@````````@20```````"!*```
+M`````($L````````@3````````"!-````````($X````````@3P```````"!
+M0(```*@``(%$````````F`@``$````"8+```H````)@\`"`$````F$P2A",\
+M``"8<````!\``)AT````@```F'@````.``"96````/\``)F`````````F80"
+M@`````"9H````````)G@````````F>2JJJJJ``"9Z#Q&9'@``)GL````J@``
+MF?`````,``"9]````/\``)GX````%```HB@```FU``"B/)/(B:\``*),````
+M`0``HE```*````"B5````````*)8#,=3@```HEP/#P\!``"B8%]I#P$``*)D
+M`$&*$0``HF@```````"B;`PPP6H``*)P`((((```HG0(&WRJ``"B>!SG.<X`
+M`*)\!1<!S@``HP`8`0````"C!#`#)@(``*,(2`<^!@``HPQ6"TP*``"C$&0:
+M8`\``*,4>$]N&P``HQB&CWQ:``"C'([/AEL``*,@G4^7#P``HR2ESZ&/``"C
+M*+5?KQ\``*,LO=^YGP``HS#-?\<_``"C--7_T;\``*,X````````HSP`````
+M``"C0````````*-$````````HT@_____``"C3#____\``*-0/____P``HU0`
+M`___``"C6'FHJA\``*-<!FQ"#P``HV`/*"('``"C9!=@%H4``*-H'X`1!```
+MHVPWH`P#``"C<#_$"(,``*-T5\`(`P``HWA?V`:"``"C?'_@!((``*.`?SQ[
+MN@``HX3S,'_P``";!`````$``)L(`````@``FPP````#``";$`````0``)L4
+M````!0``FQ@````(``";'`````D``)L@````"@``FR0````+``";+`````T`
+M`)LP````$```FS0````1``";/````!,``)M`````%```FT0````5``";2```
+M`!@``)M,````&0``FU`````:``";5````!L``)M8````'```FUP````=``";
+M8````"```)MH````(@``FVP````C``";<````"0``)MT````)0``FW@````H
+M``";?````"D``)N`````*@``FX0````K``";B````"P``)N0````,```FY0`
+M```Q``";F````#(``)N@````-```FZ0````U``";J````#4``)NL````-0``
+MF[`````U``";M````#4``)NX````-0``F[P````U``";P````#4``)O$````
+M-0``F\@````U``";S````#4``)O0````-0``F]0````U``";V````#4``)O<
+M````-0``F^`````U``";Y````#4``)OH````-0``F^P````U``";\````#4`
+M`)OT````-0``F_@````0``";_````!H``)H``````````````)H$````````
+M`$```)H(`````````(```)H,`````````6$``)H0`````````:$``)H4````
+M`````>$``)H8`````````"$``)H<`````````&$``)H@`````````*$``)HD
+M`````````6@``)HH`````````:@``)HL`````````>@``)HP`````````"@`
+M`)HT`````````&@``)HX`````````*@``)H\`````````8D``)I`````````
+M`<D``)I$``````````D``)I(`````````$D``)I,`````````(D``)I0````
+M`````;```)I4`````````?```)I8`````````#```)I<`````````'```)I@
+M`````````+```)ID`````````;$``)IH`````````?$``)IL`````````#$`
+M`)IP`````````'$``)IT`````````9@``)IX`````````=@``)I\````````
+M`!@``)J``````````%@``)J$`````````)@``)J(`````````9D``)J,````
+M`````=D``)J0`````````!D``)J4`````````%D``)J8`````````)D``)J<
+M`````````-D``)J@`````````/D``)JD`````````/D``)JH`````````/D`
+M`)JL`````````/D``)JP`````````/D``)JT`````````/D``)JX````````
+M`/D``)J\`````````/D``)K``````````/D``)K$`````````/D``)K(````
+M`````/D``)K,`````````/D``)K0`````````/D``)K4`````````/D``)K8
+M`````````/D``)K<`````````/D``)K@`````````/D``)KD`````````/D`
+M`)KH`````````/D``)KL`````````/D``)KP`````````/D``)KT````````
+M`/D``)KX`````````/D``)K\`````````/D``)C4````(```F-`"`!0(`@$4
+M"`(`%`@"`!0(`@$4"```F-P`H"#``*`@P`#@(,``X"#``.`@P```F)P`````
+M````````````````````````F)S`````P````,````#`````P```````F)P/
+M````#P````\````/````#P``````F)P"`````@````(````"`````@``````
+MF)P`````````````````````````````F)P`````````````````````````
+M````F)P`````````````````````````````F)P`````````````````````
+M````````F)SX````^````/@```#X````^```````F)P`````````````````
+M````````````F)R5%0``E14``)45``"5%0``E14`````F)S!````P0```,$`
+M``#!````P0``````F)P`````````````````````````````F)P`"`````@`
+M```(````"`````@`````F)P`U0```-4```#5````U0```-4`````F)P`#@``
+M``X````.````#@````X`````F)P`W````-P```#<````W````-P`````F)P`
+M=P```'<```!W````=P```'<`````F)P`B@```(H```"*````B@```(H`````
+MF)P0B```$(@``!"(```0B```$(@`````F)P`C`!@`(P`8`",`&``C`!@`(P`
+M8```F)P`H````*````"@`(``H`"``*``@```F)P`0````$````!```T`0``-
+M`$``#0``F)P`$00``!$$```1!```$00``!$$````F)P```!@````8````&``
+M``!@````8```F)P````!`````0````$````!`````0``F)P```L````+````
+M"P````L````+````F)P```OH```+Z```"^@```OH```+Z```F,```0````$`
+M```!`````0````$`````F)P``&0```!D````9````&0```!D````F)P```@`
+M```(````"`````@````(````F,P````.````#@````X````.````#@`!<I``
+M`7*8``%RH``!<K@``7*X``%RJ``!<K``````,"XY+C(P+C,````````!8```
+M`6@```%P```!>``````!B`#P`/,!B0"``(,!B@#R`/4!BP#V`/<!C`#Q`/0!
+MC0"!`(0!CP""`(4```!E```````!_____P```(#_____`````$I0```/M```
+M``````!J```````!_____P```(#_____`````$I0```/M`````````!``/``
+M\X&(`/``\P!!`(``@X&)`(``@P!(`/(`]8&*`/(`]0!#`/8`]X&+`/8`]P!*
+M`/$`](&,`/$`]`!+`($`A(&-`($`A`!,`((`A8&/`((`A0D("40%!B@H````
+M````````````````````````````"84)A04&*"@`````````````````````
+M```````````)A0F%%`8H*`````````````````````````````````F%"842
+M!B@H```````````````````$````````````"=`*K`4&*"@`````````````
+M```````````````````)"`E$!084!0``````````````````````````````
+M``D("404`!0%````````````````````````````````"6P)J`4&%`4`````
+M```````````````````````````);`FH%``4!0```````````````````$``
+M``````````EL":@>`!0%````````````````````````````````"6P)GAL&
+M%`4````````````````````````````````);`F>%``4!0``````````````
+M`````$````````````F`"8H4`!0%````````````````````````````````
+M"9D)J!0`%`4````````````````````````````````)T`JL!084!0``````
+M``````````````````````````FC":@4`!0%```````````````````@(```
+M````````"0@)1!0`%`4````````````````````````````````);`EL%``4
+M!0````````````````````````````````EQ"8`4`!0%````````````````
+M````````````````"84)BA0`%`4````````````````````````````````)
+MCPF9%``4!0````````````````````````````````F>"9X4`!0%````````
+M````````````````````````":,)HQ0`%`4``````````(````````0`````
+M```````)HPFC%``4!0``````````@`````````````````````FH":@4`!0%
+M``````````"````````$````````````":@)J!0`%`4``````````(``````
+M```````````````)"`E$!084!0````````````````````````````````D(
+M"404`!0%````````````````````````````````"6P)J`4&%`4`````````
+M```````````````````````);`FH%``4!0```````````````````"``````
+M``````EL":@>`!0%````````````````````````````````"6P)GAL&%`4`
+M```````````````````````````````);`F>%``4!0``````````````````
+M`"````````````F`"8H4`!0%````````````````````````````````"9D)
+MJ!0`%`4````````````````````````````````)HPFH%``4!0``````````
+M````````("````````````FT";0%!A0%````````````````````````````
+M````";0)M!0`%`4``````````````````"@@```````````)T`JL!084!0``
+M``````````````````````````````D("404`!0%````````````````````
+M````````````"6P);!0`%`4````````````````````````````````)<0F`
+M%``4!0````````````````````````````````F%"8H4`!0%````````````
+M````````````````````"8\)F10`%`4`````````````````````````````
+M```)G@F>%``4!0````````````````````````````````FC":,4`!0%````
+M``````"````````$````````````":,)HQ0`%`4``````````(``````````
+M```````````)J`FH%``4!0``````````@```````!`````````````FH":@4
+M`!0%``````````"`````````````````````";0)M!0`%`4``````````(``
+M``````0````````````)M`FT%``4!0``````````@```````````````````
+M`!0*%%H%!B@H````````````````````````````````%((4T@4&*"@`````
+M`````0`````````````````````4^A5R!08H*```````````````````````
+M`````````!6:%A(%!B@H``````````$`````````````````````%!X41@4&
+M*"@````````````````````````````````4;A2^!08H*``````````!````
+M`````````````````!3F%5X%!B@H````````````````````````````````
+M%886)@4&*"@``````````0`````````````````````44!1X$08H*```````
+M`````````````````````````!10%'@7!B@H````````````````````````
+M````````%%H46A$&*"@````````````````````````````````46A1:%P`H
+M*````````````````````````````````!2@%*`7!B@H``````````$`````
+M`````@``````````%*`4H!0&*"@``````````0`````````"```````````4
+M@A2"$0`H*``````````!``````````(``````````!2J%*H4`"@H````````
+M``$``````````@``````````%((4JA0`*"@``````````0`````````"````
+M```````4@A2J%P8H*``````````!``````````(``````````!6D%AP4!B@H
+M``````````$``````````@``````````%H`6J!0`*"@`````````````````
+M```````````````6@!:H'@8H*````````````````````````````````!:%
+M%JT>!B@H````````````````````````````````%%H4@@\`*"@`````````
+M`P````````0````````````4JA2J$@`H*``````````#````````!```````
+M`````!6D%AP4`"@H``````````,````````$````````````%H`6J!0`*"@`
+M``````````````````0````````````3,Q,]%P`*!0``````````````````
+M`!`0`````````!-'$U$7``H%````````````````````$!``````````$S@3
+M=!<`%!0````````````````````0!P`````````33A-[&P8%!0``````````
+M``````````$``````````!-1$WD>!@H%`````````````````````0``````
+M````$U83="$&%`4````````````````````!```````````3JQ.P%P`*!0``
+M`````````````````!`,`````````!.P$]@7`!04````````````````````
+M$`(`````````$[\3OQ<`"@4````````````````````0#``````````4`!1X
+M!084%````````````````````````````````!0R%&X7`!04````````````
+M````````&`$`````````%#(4;A0`%!0````````````````````8`0``````
+M```4/!1X#P`4%`````````````````````4``````````!0\%'@1!A04````
+M`````````````````0$`````````%#P4>!(`%!0````````````````````%
+M```````````4/!1X%``4%`````````````````````4``````````!0\%'@7
+M`!04````````````````````!0``````````%#P4>!<&%!0`````````````
+M```````!```````````4/!3(%`84%``````````"``````````0`````````
+M`!1X%*`7`!04``````````$`````````!0``````````%(P4H!<`%!0`````
+M`````P`````````%```````````4C!3($@`4%``````````#``````````4`
+M`````````!2,%,@4`!04``````````<```````"`!0``````````%(P4R!0&
+M%!0``````````P`````````!`@`````````4C!3(%P84%``````````#````
+M``````$"`````````!2,%,@7!A04``````````,``````````0``````````
+M%(P4R!X`%!0````````````````````````````````4C!9$!084%```````
+M```#`````````````````````!2@%,@1!A04``````````,``````````0``
+M````````%7P5]!X&%!0``````````@`````````$```````````5?!9$%`84
+M%``````````#``````````$$`````````!5\%D0;`!04``````````,`````
+M````!0``````````%7P61!X`%!0``````````P`````````%```````````5
+M?!9$%P`4%``````````'````````@`$``````````!9Q%JT7`!04````````
+M````````````````````````%G$6K1X&%!0`````````````````````````
+M```````6<1:M'@84%``````````"``````````0``````````!9Q%L$%!A04
+M````````````````````````````````%G$6P1$`%!0`````````````````
+M```````````````6<1;!%``4%````````````````````````````````!9Q
+M%L$>`!04````````````````````````````````%G$6P1X&%!0`````````
+M`````````````P`````````6<1;!'@84%```````````````````````````
+M`````!,X$W0>`!04```````````````````$````````````$[`3V!X`%!0`
+M``````````````````0````````````4,A1N'@`4%``````````#````````
+M!````````````!0\%'@>`!04``````````,````````$````````````%(P4
+MR!X`%!0``````````P````````0````````````6<1;!'@`4%```````````
+M````````!````````````!5\%D0>`!04``````````,````````$````````
+M````%(P4R!X`%!0````````````````````````````````4/!1X'@`4%```
+M`````````````````````````````!;!%L$>`!04```````````````````$
+M```````````````!_P'_`````````````'__________`````````````P&8
+M`9D`````````````?_________\````````````'`9@+,`````````````!_
+M_________P````````````@!F`PP`````````````'__________````````
+M````(`$@"A``````````````?_________\````````````A`2`!F0``````
+M``````!__________P```````````"(!(`PP`````````````'__________
+M````````````.@%@"A``````````````?_________\````````````[`6`!
+MF0````````````!__________P```````````!(!90H0```````#`````'__
+M________````````````-P$P`9D```````,`````?_________\`````````
+M```U`C`!F0```````P````!__________P```````````#8#,`&9```````#
+M`````'__________````````````,`0P`9D```````,`````?_________\`
+M```````````Y!3`!F0```````P````!__________P```````````#0&,`&9
+M```````#`````'__________````````````,@,P`9D```````,`````?___
+M______\````````````Q`S`!F0````````````!__________P``````````
+M`!$!$`&9`````````````'__________````````````$`$0"A``````````
+M````?_________\```````````!2`5`!F0````````````!__________P``
+M`````````$4"4`&9`````````````'__________````````````1P-0`9D`
+M````````````?_________\```````````!"!%`!F0````````````!_____
+M_____P```````````%@%4`&9`````````````'__________````````````
+M6P90`9D`````````````?_________\```````````!="%`!F0``````````
+M``!__________P```````````%X)4`&9`````````````'__________````
+M````````4`-0"A``````````````?_________\```````````!5`5`,,```
+M``````````!__________P```````````%8"4`PP`````````````'______
+M____````````````20)0#5``````````````?_________\```````````!`
+M`4`*0```````1@````0`````````*`&(`````````$$!0`I```````!'````
+M!`````````!H`8D`````````2`%`"A```````$8````$``````````@!B@``
+M``````!*`4`*0```````1@````0````````8"`&,`````````$L!0`I`````
+M``!&````!````````&`(`8T`````````3`%`"E```````$8````$````````
+M``@!CP````````!#`D`*0```````1P````0`````````<`&+`````````/`#
+M0`I```````!&````!``````````@````````````@`-`"D```````$<````$
+M`````````&`/IP````````#Q`T`*0```````1@````0````````8````````
+M`````($#0`I```````!&````!````````&``#Z@`````````@@-`"E``````
+M`$8````$```````````/J0````````#R`T`*$```````1@````0`````````
+M`````````````(,$0`I```````!'````!````````(!@#ZH`````````]`1`
+M"D```````$8````$````````F`````````````"$!$`*0```````1@````0`
+M``````#@``^K`````````(4$0`I0``````!&````!````````(``#ZP`````
+M````]01`"A```````$8````$````````@`````````````"&!4`*0```````
+M1P````0```````"`8`^M`````````(<%0`I```````!&````!````````.``
+M#ZX`````````B`5`"E```````$8````$````````@``/KP````````")!D`*
+M0```````1P````0`````````:`^P`````````(H&0`I```````!&````!```
+M`````&`(#[$`````````BP9`"E```````$8````$``````````@/L@``````
+M``",!T`*0```````1P````0```````"`:`^S`````````(T'0`I```````!&
+M````!````````.`(#[0`````````C@=`"E```````$8````$````````@`@/
+MM0````````"/"$`*0```````1P````0```````"`:`^V`````````)`(0`I`
+M``````!&````!````````.`(#[<`````````D0A`"E```````$8````$````
+M````@`@/N`````````#V"4`*0```````1P````0```````"`8```````````
+M`/<+0`I```````!'````!````````(!@````````````8`!@`&``````````
+M````?_________\```````````!A`&$`80```````P````!__________P``
+M`````````&(`8@!B```````"`````'__________````````````8P!C`&,`
+M````````````?_________\```````````!D`&0`9````````P````!_____
+M_____P```````````&4`90!E```````#`````'__________````````````
+M9@!F`&8`````````````?_________\```````````!G`&<`9P``````````
+M``!__________P```````````&@`:`!H`````````````'__________````
+M````````:0!I`&D```````,`````?_________\```````````!J`&H`:@``
+M`````P````!__________P```````````?\```````$````!`````1M8````
+M```0`````0````$````!&U@````(``,````!``````````$;6`````P``P``
+M``$``````````1M8````(`!'````````````````&U@````S`#`````!````
+M``````$;6````"0`(0````$````!`````1M8````*``W`````0`````````!
+M&U@````?`#`````!`````0````$;6````#``6P````$``````````1M8````
+M<``#`````0`````````!&U@````X`#<````!``````````$;6````%0`50``
+M``$````!`````1M8````1`!5`````0````$````!&U@```!,`#L````!````
+M```````;6````&``4@````$````!`````1M8````9``T`````0`````````!
+M&U@```!\`"`````!`````0````$;6````)@`6P````$````!`````1M8````
+MG`!2`````0````$````!&U@```"J`!`````!``````````$;6````+P``P``
+M``$``````````1M8````OP`V`````0`````````!&U@```#$`#<````!````
+M`0````$;6````,L`-P````$``````````1M8````T``W`````0`````````!
+M&U@```#6`!`````!`````0````$;6````-H``P```````````````!M8```#
+M,@`V`````0`````````!&U@```#>``,````!``````````$;6````.D`-P``
+M``$``````````1M8````]@`W`````0`````````!&U@```#Z`#<````!````
+M``````$;6````/\`-@````$``````````1M8```!#``P`````0````$````!
+M&U@```$4`#<````!``````````$;6````2P`-P````$``````````1M8```!
+M0``0`````0````$````!&U@```%4``,````!``````````$;6````5@`(0``
+M``$````!`````1M8```!7``W`````0`````````!&U@```%@`#<````!````
+M``````$;6````60`6P````$``````````1M8```!:`!2`````0`````````!
+M&U@```%L`%(````!`````0````$;6````70`-P````$``````````1M8```!
+M>``#`````0`````````!&U@```%\`#<````!``````````$;6````8@`0```
+M``$``````````!M8```!B0!!`````0``````````&U@```&*`$@````!````
+M```````;6````8L`0P````$``````````!M8```!C`!*`````0``````````
+M&U@```&-`$L````!```````````;6````8\`3`````$``````````!M8```/
+MIP"``````0``````````&U@```^H`($````!```````````;6```#ZD`@@``
+M``$``````````!M8```/J@"#`````0``````````&U@```^K`(0````!````
+M```````;6```#ZP`A0````$``````````!M8```/K0"&`````0``````````
+M&U@```^N`(<````!```````````;6```#Z\`B`````$``````````!M8```/
+ML`")`````0``````````&U@```^Q`(H````!```````````;6```#[(`BP``
+M``$``````````!M8```/LP",`````0``````````&U@```^T`(T````!````
+M```````;6```#[4`C@````$``````````!M8```/M@"/`````0``````````
+M&U@```^W`)`````!```````````;6```#[@`D0````$``````````!M8```!
+MD`!"`````0`````````!&U@```&.``,````!``````````$;6````9@`10``
+M``$````!`````1M8```!F@!%`````0``````````&U@```&;`$4````!````
+M```````;6````9P`7@````$``````````!M8```!G@`#`````0`````````!
+M&U@```&L`#<````!``````````$;6````:8``P````$``````````1M8```!
+MM@`W`````0`````````!&U@```&X`#<````!``````````$;6````;H`-P``
+M``$``````````1M8```!O@`A`````0````$````!&U@```,G``,````!````
+M``````$;6````<H`70````$``````````!M8```!U@`W`````0`````````!
+M&U@```'D`!`````!`````0````$;6````>P`,`````$````!`````1M8```!
+M^``#`````0`````````!&U@```(0`#<````!``````````$;6````BH`(@``
+M``$``````````1M8```"0@`W`````0`````````!&U@```(``%L````!````
+M``````$;6````DH``P````$``````````1M8```"3P`0`````0````$````!
+M&U@```)<`%(````!``````````$;6````F``.P````$````!`````1M8```"
+M:``W`````0`````````!&U@```)L`#<````!``````````$;6````G8`$```
+M``$````!`````1M8```">@`#`````0`````````!&U@```*"``,````!````
+M``````$;6````H,``P````$``````````1M8```"J@`A`````0`````````!
+M&U@```*^`%L````!`````0````$;6````K\`-P````$``````````1M8```"
+MP0`W`````0`````````!&U@```+&`#L````!``````````$;6````M0`-P``
+M``$``````````1M8```"\``W`````0`````````!&U@```+T`#<````!````
+M``````$;6````O@``P````$``````````1M8````G@!0`````0````$````!
+M&U@```+\``,````!``````````$;6````PP`,`````$``````````1M8```#
+M%``V`````0`````````!&U@```,8`#8````!``````````$;6````R0``P``
+M``$``````````1M8```#$``#`````0`````````!&U@```,Z`#<````!````
+M``````$;6````T@`$`````$````!`````1;!```#2@`2`````0````$````!
+M&U@```-:`!$````!``````````$;6````UP`.@````$````!`````1M8```#
+M7@!6`````0`````````!&U@```+```,````!``````````$;6````W<``P``
+M``$``````````1M8```"S``#`````0`````````!&U@````````!_Q``````
+M```````````!`````````````````````````"`(``(`````````````````
+M````_P`````````````````D$0```````````````````!0%````````````
+M```````"!0```````````````````!,```````````%0$```````````````
+M```````````````````````````!````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````E`0````````````````````````
+M```````````````````$````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````#4!``````````````````````````````````
+M``````````@0````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````10$```````````````````````````````````````````
+M@```@```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````!5`0``````````````````````````````````````````!`````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````&4#``
+M```````````````"``````````,``````````````(``0(``````````````
+M``````D(````````````````````````````````````````````````````
+M``````````````````````````````````````````````A0,```````````
+M``````````````````````,````````!``0`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````"5`P`````````````````@``
+M```````$`````P`````````0(`0`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````!,#`````````````````"``````````0`
+M```#```````(``"`0```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````(P,`````````````````(`````````!`````,`````
+M````````0```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````S`P`````````````````@`````````$`````P``````"````$``
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````$
+M,#`````````````````"``````````0````#````````````($``````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````4P,```````
+M``````````(`````````!`````,`````````````$```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````!C`P````````````````
+M`@`````````$`````P`````````!`!$`````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````!$!``````````````````````````
+M`````````````````@`!`"```````````````````!($````````````````
+M```@$0``````````````````````````````````````````````````````
+M``````````````````````$@$```````````````````````````````````
+M```````$``("`````````````````````````````````````````"`2````
+M````````````````````````````````````````````````````````````
+M`````````````6`0`````````````````0`````````#``````````````(`
+M0(`@```````````````````0Q```````````````````!"$`````````````
+M````````````````````````````````````````````````````````````
+M```!91`````````````````!``````````,````````````````````X````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````%`0```
+M````````````````````````"`````(`````````````!```````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````D!`````````````
+M```````````````0`````@`````````````%QP``````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````#0$``````````````````````
+M````@``````"`````````````(``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````1`0`````````````````0```````"`````
+M``(```````````!`@```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````!4!`````````````````!````````(```````@``````
+M```"`$"`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````&0$````````````````````````````@````"`````````````(@`
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````=`
+M0`````````````````0```````"`"`````(```````````!`A```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````"$!`````````
+M````````!````````(`(`````@`````````"`$"$````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````)0$``````````````````
+M````````@``````"`````````````(''````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````M`0`````````````````0```````"`
+M``````(```````````!`@<<`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````#5#_````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````"@````````````````````H`````````````````````
+M```````````*,/\``````````````````````````(`````#````````````
+M````````````````````````````````````````````````````````````
+M``````$````````````````````!``````````````````````0`````````
+M``LP,``````````````````````````!``````,`````````````````````
+M`````````````````````````````````````````````````````````(``
+M``````````````````"`````````````````````!```````````##`P````
+M``````````````````````(``````P``````````````````````````````
+M````````````````````````````````````````````````$```````````
+M`````````!`````````````````````$```````````*$!``````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````@````````````````````
+M(`````````````````````0```````````I`0```````````````````````
+M``!X8`````(`````````````````````````````````````````````````
+M````````````````````````````"D````````````````````1`````````
+M````````````!```````````"E!`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````"`````````````````````@`````````````````
+M```$```````````!F3``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````(````````````````````"`````````````````````0`````
+M``````!@_P````````````````,````````$``````@```````/@````````
+M```````````````"P`````````````````````````````````````````"O
+MP```````````````````"_``````````````````````"````````````&;_
+M`````````````````P````````0`````"````````^``````````````````
+M``````+```````````````````````````````````````````?`````````
+M```````````!\``````````````````````(````````````9_\`````````
+M```````#````````!``````(```````#X````````````````````````L``
+M````````````````````````````````````````+\``````````````````
+M``OP``````````````````````@```````````!H_P````````````````,`
+M```````$``````@```````/@```````````````````````"P```````````
+M``````````````````````````````!7P```````````````````%?``````
+M````````````````"````````````&'_`````````````````P````````0`
+M````$````````^``````````````````````````````````````````````
+M`````````````````````*_````````````````````+\```````````````
+M```````(````````````8O\````````````````#````````!``````0````
+M```#X````````````````````````L``````````````````````````````
+M````````````K\````````````````````OP``````````````````````@`
+M``````````!C_P````````````````,````````$``````@```````'@````
+M```````````````````"P```````````````````````````````````````
+M```OP```````````````````"_``````````````````````"```````````
+M`&3_`````````````````P````````0`````$```````'``(````````````
+M``````````+```````````````````````````````````````````?`````
+M```````````````!\``````````````````````(````````````9?\`````
+M```````````#````````!``````0```````(A```````````````````````
+M````````````````````````````````````````````5\``````````````
+M`````!7P``````````````````````@```````````!I_P``````````````
+M``,````````$`````!````````/````````````````````````"P```````
+M```````````````````````````````````'P````````````````````?``
+M````````````````````"````````````&K_`````````````````P``````
+M``0`````$````````\``````````````````````````````````````````
+M`````````````````````````"_````````````````````+\```````````
+M```````````(```````````!F/\`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````#0``````````````````````````````
+M`````````````00`^@,`@0`"9`)D`00!]`<`@0`!R0')`00#Z`(`@@$`Y`#D
+M`00'T`8`A`(`H`"@`00+N`$`A@,`C`",`0(7<`L`C`0`/``\`0(C*`\`$@0`
+M/``\`0(NX`H`F`8`,``P`0)&4`X`)`8`,``P`0)=P`D`,`@`+``L`0*,H`T`
+M2`@`+``L`0*[@`@`8`@`+``L`0+2\`P`;`@`+``L````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````#```````````
+M`````````````````````````````````0`#Z!L`@@```````0`'T!H$A`$`
+M`````0`5?!D$BP(``````0`J^!@$E@,```````(7<`L`#`0```````(C*`\`
+M$@0``````0(NX`H`&`8``````0)&4`X`)`8``````0)=P`D`,`@``````0*,
+MH`T`2`@``````0*[@`@`8`@``````0+2\`P`;`@`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````!````````````````````````````````````````````0`#Z!L`
+M@@```````0`'T!H$A`$``````0`5?!D$BP$``````0`J^!@$E@$`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````"```````````````````````````````
+M`````````````0,7<`L`C````````0,C*`\`$@```````0,NX`H`F`(`````
+M`0-&4`X`)`(``````0-=P`D`L`0``````0.,H`T`2`0``````0.[@`@`8`0`
+M`````0/2\`P`;`0`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````!P``````````
+M`````````````````````````````````0,7<`L`C````````0,NX`H`F`(`
+M`````0-&4`X`)`(``````0-=P`D`L`,``````0.,H`T`2`,``````0.[@`@`
+M8`,``````0/2\`P`;`,`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````"````````````````````````````````````````````0(%W`L`
+M@P```````0((R@\`!````````0(+N`H`A@(``````0(1E`X`"0(``````0(7
+M<`D`C`0``````0(C*`T`$@0``````0(NX`@`&`0``````0(TO`P`&P0`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````"```````````````````````````````
+M`````````````0(+N`L`A@```````0(1E`\`"0```````0(7<`H`C`(`````
+M`0(C*`X`$@(``````0(NX`D`F`0``````0)&4`T`)`0``````0)=P`@`,`0`
+M`````0)I>`P`-@0`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````"```````````
+M`````````````````````````````````0(7<`L`C````````0(C*`\`$@``
+M`````0(NX`H`F`(``````0)&4`X`)`(``````0)=P`D`L`0``````0*,H`T`
+M2`0``````0*[@`@`8`0``````0+2\`P`;`0`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q
+M````````"``````````!,#$N,#$````````(``````````$P,2XP,0``````
+M``@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(````
+M``````$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!
+M,#$N,#$`````+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5G:6YF;P`N
+M<F5L82YT97AT`"YR96PN=&5X=``N<F5L82YR;V1A=&$`+G)E;"YR;V1A=&$`
+M+G)E;&$N9&%T80`N<F5L+F1A=&$`+F1A=&$Q`"YB<W,`+FYO=&4`````````
+M`````````````````````````````````````````````````````!MP```&
+M`````@`````````T````&```````````````!````!@````I`````0````8`
+M````````4``!A#```````````````!``````````+P````D````````````"
+M(Z0``"2(````#P````(````$````"````"0````$`````````````D@L````
+M``````\````"````!`````P````^`````0````(```````&$@```-L``````
+M`````````!``````````1@````D````````````"2"P```;8````#P````4`
+M```$````"````#D````$`````````````D\$``````````\````%````!```
+M``P```!7`````0````,```````&[0```2G```````````````!``````````
+M70````D````````````"3P0````@````#P````@````$````"````%(````$
+M`````````````D\D``````````\````(````!`````P```!G`````0````,`
+M``````(%L````````````````````!``````````;@````@````#```````"
+M!;`````````````````````0`````````',````'`````````````@6P```$
+M$````````````````0`````````1`````P````````````()P````'D`````
+M``````````$``````````0````(````````````"#.0```U0````$`````@`
+M```$````$`````D````#`````````````AHT```);P```````````````0``
+M`````````````````````````````````````````P```@``````````````
+M``,```4````````````````#```(`````````````````P```0``````````
+M``````,```L````````````````#```,`````````````````P``#0````$`
+M`*U(```"8!(```(````,``#-E````M02```"````%P``V]````&$$@```@``
+M`"(``3.8```!0!(```(````M``"V.````#P2```"````.```6B````$H$@``
+M`@```$,``$/@```!I!$```@```!.``"BQ````#`2```"````60``G:@````8
+M$@```@```&0``('P````"!(```(```!O``!N;````R02```"````>@``#@P`
+M``"P$@```@```(4``4-0````.!(```(```"0``"IB````%@2```"````FP``
+M?K````!,$@```@```*8``-!H````U!(```(```"Q```)Y````(`2```"````
+MO```9&@```#P$@```@```,<``1V(```!(!(```(```#2```39````=`2```"
+M````[0``2,P```&D$0``"````/@``)[X````H!(```(```$#```$2````#`2
+M```"```!#@`!(O````!X$@```@```1D``````````!````````$Z``"A<```
+M`3`2```"```!10``H3````!`$@```@```5```4I````!G!(```(```%;``"?
+MW````'`2```"```!9@``E_P```"<$@```@```7$``)^8````-!(```(```%\
+M``">0````(P2```"```!AP``8L0```"$$@```@```9(``-%@````3!(```(`
+M``&=``"@3````*P2```"```!J```FQ0```!$$@```@```;,```-(```!`!(`
+M``(```&^``">S````"P2```"```!R0`!`"0```%4$@```@```=0``'QL````
+MD!(```(```'?``#:E````(@2```"```!Z@`!"8````#($@```@```?4``0I(
+M````3!(```(```(````![````5`2```"```"#P``[!````1@$@```@```AH`
+M`+00```!4!(```(```(E``$%,````YP2```"```",```IXP```'\$@```@``
+M`CL``+5P````%!(```(```)&```#/`````P2```"```"40``!'@```)8$@``
+M`@```F<``-D\````-!(```(```)R``#1/````"02```"```"?0``BCP```TT
+M$@```@```H@``("L````"!(```(```*3``%#D````4`2```"```"G@`!)A0`
+M``!4$@```@```JD``5VL````)!(```(```*T``""E```!C02```"```"OP`!
+M1@P```#P$@```@```LH``&7,```(%!(```(```+5``$$5````-P2```"```"
+MX```G:`````($@```@```NL``+<0````;!(```(```+V``$:G````<@2```"
+M```#`0`!7AP```)P$@```@```PP``*#X````.!(```(```,7``!MX````(P2
+M```"```#(@`!(V@```!8$@```@```RT``````````!(```````,Z``$=-```
+M`%02```"```#10`!)#@````($@```@```U```)NP````M!(```(```-;```'
+M,````E@2```"```#;``!#>````DT$@```@```W<``)W`````&!(```(```."
+M``$TV````-@2```"```#C0``=[````#<$@```@```Y@``..````'1!(```(`
+M``.C``"X,````%02```"```#K@``KZ@````T$@```@```[D``*+T```$F!(`
+M``(```/$``"IX````V@2```"```#SP`!"N0```'@$@```@```]H``29H```&
+MX!(```(```/E``"9Q````*`2```"```#\```G?@````($@```@```_L``6#X
+M```$Y!(```(```0&``"<L````'`2```"```$$0``0)@```&D$0``"```!!P`
+M`3H`````5!(```(```0G``#-<````"02```"```$,@``EZ`````L$@```@``
+M!#T``)ID````L!(```(```1(``$D=````:`2```"```$4P``F3````"4$@``
+M`@``!%X``-1T```#9!(```(```1I``$8A````A@2```"```$=``!1X@```$L
+M$@```@``!'\``$Q@````B!(```(```2*```````````0```````$J@``````
+M```)$0``"```!+H``-U4````G!(```(```3%``!QD````&@2```"```$T```
+MFW````!`$@```@``!-L``-GD````L!(```(```3F``">`````#@2```"```$
+M\0``````````$@``````!0```$(\```!I!$```@```4+``"ST````$`2```"
+M```%%@``>3@```!8$@```@``!2$``("T```!-!(```(```4L``!'*````:01
+M```(```%-P``HJ`````D$@```@``!4(``+>P````@!(```(```5-``$PZ```
+M`K`2```"```%6```MIP```!T$@```@``!6,``$6$```!I!$```@```5N``$7
+MA````'@2```"```%>0``````````$@``````!8@``)?,````,!(```(```63
+M``"?S````!`2```"```%G@``F-````!@$@```@``!:D```&<````4!(```(`
+M``6W``&#/````.P2```"```%P@````P````4$0``"```!=0``('X````G!(`
+M``(```7?``$W)````M@2```"```%Z@``M=@```!@$@```@``!?4``%CH````
+MX!(```(```8```$7%````'`2```"```&"P``M9P````\$@```@``!A8``0J4
+M````4!(```(```8A``#JQ````1`2```"```&+``!)$`````T$@```@``!C<`
+M`'F0```!V!(```(```9"``$(S````*P2```"```&30``6<@```!8$@```@``
+M!E@``'W,````V!(```(```9C```2*````(@2```"```&;@``"Z````)L$@``
+M`@``!GD``'O@````C!(```(```:$``$[>```!V02```"```&CP``_B````"D
+M$@```@``!IH``.O4````/!(```(```:E``!(X````$02```"```&L```!M``
+M``!@$@```@``!KL``)B8````.!(```(```;&```````````2```````&U@`!
+M1-````$\$@```@``!N$``1QD````T!(```(```;L``"(R````702```"```&
+M]P``````````$```````!Q<```ID```!/!(```(```<B``!Q^```!5P2```"
+M```'+0``N(0```'L$@```@``!S@``````````!(```````=&``%(P````*`2
+M```"```'40`!38@````($@```@``!UP```^,````\!(```(```=G``"7<```
+M`#`2```"```'<@``M80````8$@```@``!WT``,S<````E!(```(```>(``!]
+ME````#@2```"```'DP``W?````60$@```@``!YX``4V@```0#!(```(```>I
+M```^]````:01```(```'M```?/P```"8$@```@``![\``!*P````M!(```(`
+M``?*``%)8````.`2```"```'U0`!(LP````D$@```@``!^```)XX````"!(`
+M``(```?K``#].````.@2```"```']@``/5````&D$0``"```"`$``'=\````
+M*!(```(```@,```)B````%P2```"```(%P`!'J@```0D$@```@``""(``0TX
+M````J!(```(```@M``"U8````!`2```"```(.``!0T`````($@```@``"$,`
+M`!!\```!K!(```(```A.``"V=````"@2```"```(60``6T@````\$@```@``
+M"&0``%',```''!(```(```AZ``"W?````#02```"```(A0`!1OP```",$@``
+M`@``")```+IP```2;!(```(```B;``!^_````;`2```"```(I@``2$@```"8
+M$@```@``"+$``+,P````H!(```(```B\``"=(````(`2```"```(QP`!2]P`
+M``#T$@```@``"-(``)W8````(!(```(```C=``%,Z````*`2```"```(Z```
+MG&0```!,$@```@``"/,``'MP````<!(```(```C^``#1K````L@2```"```)
+M"0`!%_P````@$@```@``"10``4V0````"!(```(```D?``!XC````*P2```"
+M```)*@`!7=````!,$@```@``"34``)M8````&!(```(```E```#VR````6`2
+M```"```)2P``2]0```",$@```@``"60``1@<````:!(```(`>GHP,F1B9C@W
+M-0!Z>C`R9&(R,#4S`'IZ,&9B8C%E,V8`>GHP-6(X8S8U80!Z>C`U8CDT,F5D
+M`'IZ,#`Q.68T-S``>GHP,F1D.30R9`!Z>C`R9&)E-S-D`'IZ,#`U8C8Y,F(`
+M>GHP8C9D,C,R-0!Z>C`P,39D.3)E`'IZ,&-F8C$X-S4`>GHP,#5B-V0W80!Z
+M>C`P8C9C9C5E`'IZ,&(V9C4P8C@`>GHP-F4P831F90!Z>C`P-C=D,F(Q`'IZ
+M,#`R9&)C-C$`>GHP,#5B-F-F9`!A=&A?:&%L7W!R;V-E<W-?;F]I<V5F;&]O
+M<@!Z>C`P-6(T.&%D`'IZ,#)D8F8Q8C(`>GHP,S-E8SAB9@!Z>C!D8C0R-6,U
+M`&%T:%]H86Q?9&UA7V)E86-O;E]R97-P;VYS95]T:6UE`'IZ,#9E,#!B.&$`
+M>GHP,F1B9F,Q9`!Z>C`P-6(Y86)D`'IZ,#)D8F4X-3$`>GHP,39E,#!D9`!Z
+M>C`R9&(S,6(R`'IZ,#!B-S`Y,C,`>GHP,&(V9#0U,`!Z>C`P,&(V9#%D`'IZ
+M,#)D8F1A8C(`>GHP,#$V9&$U,`!Z>C`P,#8W9#,R`'IZ,#!B-F0Y,C,`>GHP
+M,#)D8C4Q8P!Z>C`Q-F1C8F9E`'IZ,#!B-S`Q-#4`>GHP9&,V93,Y,`!Z>C!B
+M-S`Y969F`&%T:%]H86Q?871T86-H`'IZ,#9E,&9C,&0`>GHP,39D86(R9`!Z
+M>C!E,#0V.#1B`'IZ,#$V93(Y,60`>GHP,#!B-F9E.`!Z>C`P8V9B,V4P`&%T
+M:%]H86Q?8V]M<'5T971X=&EM90!Z>C`R9&(U8F%C`'IZ,#`U8C=F.60`>GHP
+M-F1F9C0T80!Z>C`R9&(U-S8S`'IZ,#)D8S$Y864`>GHP,#)D868V,@!Z>C`P
+M-6(X9CED`'IZ,&(X,V%D,V4`>GHP,#!B-S`U,@!Z>C`P,#5B-F(R`'IZ,#5B
+M-V8Q,30`>GHP-&%E,#,Q9@!Z>C`P-30W9F5D`'IZ,#!B-S$W-V0`>GHP,#)D
+M8F$Y,@!Z>C`R9&(Q86(R`'IZ,#`P-6(V,C(`>GHP8C8Y8C`W8P!A=&A?:&%L
+M7V9R964`>GHP,F1B96)B9`!Z>C!B-64S,34R`'IZ,#$V9&9B9C$`871H7VAA
+M;%]M:'HR:65E90!Z>C`Q-F4Q.#EB`'IZ,#)D8C,S-60`>GHP8C9C-3-A-`!Z
+M>C!B-F9D,S8S`'IZ,&1C,C%D,V$`>GHP,&(W,3<S9`!Z>C`Q-F0Y9#0Q`'IZ
+M,#`U8CAA8F0`>GHP,F1B,S@W-0!Z>C`Q-F4S,#EB`'IZ,#`U8C8P8C(`>GHP
+M,&(W,#$V,0!Z>C`V9#ED9#DS`'IZ,#`Q-F1E-S(`>GHP9&(S960X-@!Z>C`P
+M-6(T.&5D`'IZ,#`R9&)C-#(`>GHP,#5B-V8R90!Z>C`R9&)F9&9D`'IZ,#$V
+M938T.&$`>GHP,#)D869F,@!Z>C`Q-F1A.3(P`'IZ,#5B-S@Q93``>GHP,#)D
+M8V$P8@!Z>C`P8C<P83=A`'IZ,&9A8S!C.6(`871H7VAA;%]A9&1I=&EO;F%L
+M7W-W8F%?8F%C:V]F9@!A=&A?:&%L7W9E<G-I;VX`>GHP,F1B86,R90!Z>C!B
+M-F-F,#`Y`'IZ,#`Q-F4Q,F,`>GHP,#`R9&%E80!Z>C`V9&9D9#DS`&%T:%]H
+M86Q?;6%L;&]C`'IZ,#)D9#DR860`>GHP,39D8C(U,0!Z>C!E,3`W8V$Q`'IZ
+M,#)D8S$W-C,`>GHP8C8Y,&0V9`!Z>C`Q-F1F,#4Q`'IZ,#!B-S`V8F,`>GHP
+M,#$V9#@W,@!Z>C!D,31D,6(P`'IZ,&(T.#`S,64`>GHP,#!B-F9F.`!A=&A?
+M:&%L7VUE;6-P>0!Z>C`Q-F1A,&1D`'IZ,#)D8C(X-3$`>GHP-F1B,&-F,@!A
+M=&A?:&%L7W!R;V)E`'IZ,#`Q-F-C,S(`871H7VAA;%]B=6EL9&]P=',`>GHP
+M9&%D8S8R8P!Z>C`P,&(V8S$P`'IZ,&(W,C%A960`>GHP-C=C9F-A90!Z>C`P
+M,&(V8V8X`'IZ,#5B.3)A960`>GHP8C9D.65F9@!Z>C`R9&)F9F(Q`'IZ,&(U
+M93,Q-C``>GHP8C@Q96$Y-`!Z>C`Q-F1E8S%F`'IZ,&4X.30Y,#<`>GHP,&(V
+M96$W80!Z>C`S,V4X9F)F`'IZ,&-F834X-S4`>GHP,F1B.3EA90!Z>C`P,#5B
+M-V(R`'IZ,&1E-C@S-V8`>GHP8C<P.60P,@!Z>C`V-V0R-64R`'IZ,#$Y9C-A
+M,#$`>GHP-S`S.30W8@!A=&A?:&%L7VUE;7IE<F\`>GHP,39E,&)F90!Z>C`Q
+M-F4R9&9D`'IZ,#9F96%F-C``871H7VAA;%]S=U]B96%C;VY?<F5S<&]N<V5?
+M=&EM90!Z>C`Y9C8T8C9A`'IZ,&(V.3<S8F,`>GHP,#5B.#AF9`!A=&A?:&%L
+M7V1E;&%Y`'IZ,#!B-S(Q-C$`>GHP,39D9C(U,0!Z>C`V-V0R9C0Q`'IZ,#)D
+M8C-D9F0`>GHP,F1B-3-E9`!Z>C`Q-F1C96%E`'IZ,#`P8C9E,C(`>GHP-6(X
+M,#`T,0!Z>C`P,#)D8S4R`'IZ,#`U8C1A,F0`>GHP,#!B-F4U,@!Z>C`V-V0P
+M8S0W`'IZ,&1B8F5D.#8`>GHP-6(V8S9D8@!Z>C!C,S$U96(U`'IZ,#9D-#`V
+M93``>GHP,#)D9#@V9`!Z>C`P,39E,31D`'IZ,#`V-V0R,C$`>GHP,#5B.#DS
+M9`!Z>C`U8C@Q8C%B`'IZ,#`P8C9C93@`>GHP8C=F-3!B.`!Z>C`S,V5B9F)F
+M`'IZ,&(X,F1E-F0`>GHP9C0U939E,P!A=&A?:&%L7VEN:71?8VAA;FYE;',`
+M>GHP,&(V9#9B8P!Z>C`P,&(W,#(R`'IZ,#`P,F1B9#(`>GHP9&$T.#1A,0!Z
+M>C!A-C!D,30U`'IZ,#$V93$R-3$`>GHP9&,V835C-0!Z>C`Q-F4V.3%D`'IZ
+M,#)D8F8S-60`>GHP,39E-3(U,0!Z>C`R9&(U-S!A`'IZ,#`U8C9D-V$`>GHP
+M,#)D8C(Y,@!Z>C`P-6(Y,&-B`'IZ,#5B-V-B9#4`>GHP,#5B-6,T-@!Z>C`P
+M,&(V9C%D`'IZ,#`Q-F1A-#@`>GHP8C8V,S%A.`!A=&A?:&%L7V=E='=I<F5L
+M97-S;6]D97,`>GHP,39E,6(X-P``````"````@4````0```"!@```(@```(%
+M````D````@8```#$```"!0```,P```(&````]````@4```#\```"!@```3P`
+M``(%```!1````@8```%,```"!0```50```(&```!8````@4```"T```"!0``
+M`6@```(&```!;````@4```!,```"!0```70```(&```!>````@4```!X```"
+M!0```8````(&```!A````@4```$8```"!0```#0```(%```!C````@8```'0
+M```!!0```=0```$&```"7```E@4```(,``"6!0```F0``)8&```"L```E@4`
+M``*T``"6!@```LP``$0%```"T```1`8```.0``"D!0```Y0``*0&```'?```
+M:P4```>```!K!@``"*0``&L%```(J```:P8```F@``":!0``":0``)H&```)
+ML````@4```FT```"!@``"<@```(%```)S````@8```G\``":!0``"@```)H&
+M```*#````@4```H0```"!@``"C@```(%```*/````@8```K4```Z!0``"M@`
+M`#H&```+K````@4```NP```"!@``#_P```$%```0`````08``!+(``")!0``
+M$LP``(D&```2[```F@4``!+P``":!@``$Q0```(%```3&````@8``!.P```"
+M!0``$[0```(&```3T```F@4``!/4``":!@``%5````(%```56````@8``!5<
+M```"!0``%6````(&```8F````04``!B<```!!@``&2P``',%```9,```<P8`
+M`!V````!!0``':@```$&```>P```G`4``!W\``"<!0``'L0``)P&```A:```
+M`04``"%L```!!@``(9P```$%```AH````08``"(8``!-!0``(AP``$T&```C
+M<````04``"-T```!!@``(WP```$%```C@````08``"1$```!!0``(ZP```$%
+M```D2````08``"T\``!S!0``+4```',&```M9```G`4``"UH``"<!@``+8P`
+M``$%```MD````08``"V\```!!0``+<````$&```MT````04``"W4```!!@``
+M+A@``)P%```N'```G`8``"Y$```!!0``+D@```$&```N=````04``"YX```!
+M!@``+H@```$%```NC````08``"[0``"<!0``+M0``)P&```N_````04``"\`
+M```!!@``+RP```$%```O,````08``"]````!!0``+T0```$&```O:```304`
+M`"]L``!-!@``+^P```$%```O\````08``#`@```!!0``,"0```$&```PU```
+M`04``##8```!!@``-!0```$%```T&````08``#1T```!!0``-'@```$&```Y
+M3````04``#E0```!!@``.50```$%```Y6````08``#IH```"!0``.FP```(&
+M```Z?````@4``#J````"!@``/#0```$%```\.````08``$A<```!!0``2&``
+M``$&``!(=````04``$AX```!!@``2(P```$%``!(D````08``$BD```!!0``
+M2*@```$&``!(O````04``$C````!!@``20@```$%``!)#````08``$FX```!
+M!0``2;P```$&``!)W````P4``$G@```#!@``2A@```,%``!*'````P8``$IL
+M```!!0``2G````$&``!*N````P4``$J\```#!@``2YP```$%``!+H````08`
+M`$OP```!!0``2_0```$&``!,"````04``$P,```!!@``3"@```$%``!,+```
+M`08``$QL```!!0``3'````$&``!,\````P4``$ST```#!@``33@```$%``!-
+M/````08``$U8```!!0``35P```$&``!-=````P4``$UX```#!@``3=@```,%
+M``!-W````P8``$W@``!_!0``3>0``'\&``!..````P4``$Y````#!@``3M``
+M``$%``!.U````08``$]$```!!0``3NP```$%``!.\````08``$\(```!!0``
+M3PP```$&``!/4````P4``$]4```#!@``3[P```,%``!/P````P8``$_$```#
+M!0``3\@```,&``!07````04``%!@```!!@``4B@```$%``!2+````08``%)`
+M```!!0``4D0```$&``!28````04``%)D```!!@``4H0```$%``!27````04`
+M`%*(```!!@``4I0```$%``!2F````08``%*P```!!0``4K0```$&``!2T```
+M`04``%+4```!!@``4S@```$%``!30````08``%.4```"!0``4Y@```(&``!3
+MG````@4``%>T```"!0``4Z````(&``!43````P4``%1@```#!@``5'P```,%
+M``!4@````P8``%28```#!0``5)P```,&``!4/````P4``%2X```#!@``5-0`
+M``,%``!4V````P8``%08```#!0``5/0```,&``!5!````04``%4(```!!@``
+M520```$%``!5*````08``%50```!!0``550```$&``!6'```G`4``%8@``"<
+M!@``5[@```(%``!7O````@8``%?<```!!0``5^````$&``!7\````04``%?X
+M```!!@``6GP``(D%``!9U```B04``%G8``")!@``6DP```$%``!:4````08`
+M`%K<``")!0``6N```(D&``!;4```B04``%M4``")!@``7/0```$%``!<^```
+M`08``%V\```!!0``78@```$%``!=<````04``%TT```!!0``71````$%``!=
+MD````08``%V8```!!0``7:````$&``!=S````04``%W0```!!@``7BP```,%
+M``!>-````P8``%XX```#!0``7CP```,&``!>0````P4``%Y$```#!@``7D@`
+M``$%``!>3````08``%\(```#!0``7Q````,&``!?%````P4``%\8```#!@``
+M7QP```,%``!?(````P8``%\D```!!0``7R@```$&``!?Q````04``%_(```!
+M!@``7_0```$%``!?^````08``&`,```!!0``8!````$&``!C*```'@4``&,L
+M```>!@``9#```&8%``!D-```9@8``&2<``!_!0``9*```'\&``!DI````@4`
+M`&2H```"!@``92````(%``!E)````@8``&5D```"!0``96@```(&``!E;```
+M`@4``&5P```"!@``970```(%``!E>````@8``&8$``!S!0``9@@``',&``!F
+M-```&04``&8X```9!@``9E```,4%``!F5```Q08``&:\```!!0``9L````$&
+M``!FV```S`4``&;<``#,!@``9S````$%``!G-````08``&=````2!0``9RP`
+M`!(%``!G'```$@4``&=$```2!@``9_```"@%``!G]```*`8``&OL``#+!0``
+M:=@``,L%``!I4```RP4``&D\``#+!0``:20``,L%``!I5```RP8``&GD``#+
+M!0``:>@``,L&``!J#```RP4``&H0``#+!@``:CP``,L%``!J0```RP8``&IX
+M``#+!0``:GP``,L&``!J^````@4``&K\```"!@``:P0```(%``!K"````@8`
+M`&M@``#$!0``:V0``,0&``!L!```I`4``&P(``"D!@``;!0``"@%``!L&```
+M*`8``&P\``"D!0``;$```*0&``!L8```RP4``&QD``#+!@``;(P``*(%``!L
+MD```H@8``&SH``"7!0``;.P``)<&``!M!```RP4``&T(``#+!@``;70```$%
+M``!M>````08``&V<``!+!0``;:```$L&``!M[```0`4``&WP``!`!@``;A``
+M`"D%``!N%```*08``&X@``#%!0``;B0``,4&``!N.```F04``&X\``"9!@``
+M;DP``$T%``!N4```308``'%P``"D!0``<70``*0&``!W7```8@4``'=@``!B
+M!@``=X@``,T%``!WC```S08``'>$```!!0``=Y@```$&``!X+```8@4``'@P
+M``!B!@``>-P``"`%``!XK```(`4``'C@```@!@``>/```*`%``!X]```H`8`
+M`'D<``!5!0``>2```%4&``![G```+`4``'N@```L!@``?H0``'<%``!^B```
+M=P8``(JL```"!0``BK````(&``"45```GP4``(\4``"?!0``C1P``)\%``"/
+M&```GP8``)<P``"?!0``ES0``)\&``"7?```?P4``)>```!_!@``EZ@``'\%
+M``"7K```?P8``)?8``!_!0``E]P``'\&``"8%```?P4``)@8``!_!@``F@P`
+M``(%``":$````@8``)J$``!_!0``FH@``'\&``">'```"@4``)X@```*!@``
+MGF@``!@%``">;```&`8``)Z4``"W!0``GI@``+<&``">W```&`4``)[@```8
+M!@``GQ@``!@%``"?'```&`8``)]$``"W!0``GT@``+<&``"?L```&`4``)^T
+M```8!@``H&P``!@%``"@<```&`8``*"8``"W!0``H)P``+<&``"A%```&`4`
+M`*$8```8!@``H:P``+<%``"AL```MP8``**H```7!0``HJP``!<&``"C````
+M#P4``*,$```/!@``IY@```\%``"GG```#P8``*F(```"!0``J9````(&``"I
+MH````@4``*FD```"!@``J<@```(%``"IS````@8``*H,```"!0``JA````(&
+M``"LB```3P4``*R<``!/!@``K,0```(%``"LR````@8``*T@``"4!0``K20`
+M`)0&``"M9````@4``*UH```"!@``KQP```(%``"O(````@8``*\L``!<!0``
+MKS```%P&``"OC```$P4``*^0```3!@``K[P``*<%``"OP```IP8``+"$``"D
+M!0``L(@``*0&``"PH```I`4``+"D``"D!@``LUP```$%``"S=````08``+.(
+M```!!0``LXP```$&``"SH````04``+.D```!!@``M*0``!P%``"TJ```'`8`
+M`+4H``!X!0``M,P``'@&``"TX```?04``+3H``!]!@``M.P``&$%``"T]```
+M808``+3X``"N!0``M0```*X&``"U!```=`4``+4,``!T!@``M1````X%``"U
+M&```#@8``+4<``"U!0``M20``+4&``"TQ```>`4``+4P``!X!@``M30``'T%
+M``"U.```?08``+4\``"A!0``M4```*$&``"UL```+`4``+6T```L!@``M@0`
+M`!\%``"V"```'P8``+84``![!0``MA@``'L&``"V6```3`4``+9<``!,!@``
+MN@0``%0%``"Z"```5`8``+LX``#%!0``NQP``,4%``"[/```Q08``+M8``")
+M!0``NUP``(D&``#6E```<04``-:(``!Q!0``N\0``'$%``"[R```<08``+O8
+M``![!0``N]P``'L&``"\?```"04``+R````)!@``O7@``#<%``"]?```-P8`
+M`+V,```N!0``O9```"X&``"]G```S`4``+V@``#,!@``OJ@```(%``"^K```
+M`@8``+]H``"D!0``OVP``*0&``"_C````@4``+^0```"!@``P%@``*0%``#`
+M7```I`8``,"<``"0!0``P*```)`&``#"=```-`4``,)L```T!0``PCP``#0%
+M``#"+```-`4``,)X```T!@``PJP``*H%``#"L```J@8``,,X``!6!0``PSP`
+M`%8&``#/:```C04``,-,``"-!0``PR0``(T%``##4```C08``,-@``"L!0``
+MPV0``*P&``#$!```%P4``,0(```7!@``Q>@``&,%``#%[```8P8``,8$```A
+M!0``Q@@``"$&``#&'```-@4``,8@```V!@``QP```*0%``#'"```I`8``,<L
+M``"D!0``QS0``*0&``#'2```I`8``,>(``"D!0``QXP``*0&``#(3```,`4`
+M`,A0```P!@``R/```%(%``#(]```4@8``,ED``!G!0``R6@``&<&``#)=```
+M+`4``,EX```L!@``R9```%D%``#)E```608``,I(``"1!0``RDP``)$&``#+
+MG```)P4``,N@```G!@``R[@``!T%``#+O```'08``,O4```J!0``R]@``"H&
+M``#,8```*P4``,QD```K!@``S'P``+8%``#,@```M@8``,W$``")!0``S<@`
+M`(D&``#-W```U`4``,W@``#4!@``SD```*0%``#.1```I`8``,Z```!C!0``
+MSH0``&,&``#.Y```I`4``,[H``"D!@``SO0``#0%``#.^```-`8``,]\``!6
+M!0``SX```%8&``#/D```C04``,^4``"-!@``T`P``"L%``#0$```*P8``-`H
+M``"V!0``T"P``+8&``#11````04``-%(```!!@``T7```,4%``#1=```Q08`
+M`-&,```!!0``T9````$&``#1R````04``-',```!!@``T>```,4%``#1Y```
+MQ08``-'\```!!0``T@````$&``#4````I`4``-0$``"D!@``U"P``*0%``#4
+M,```I`8``-2@``")!0``U*0``(D&``#6U```<04``-;8``!Q!@``UX0```$%
+M``#7<````04``->(```!!@``V'```*0%``#8=```I`8``-B0```L!0``V)0`
+M`"P&``#8^```Q04``-C\``#%!@``VAP``#L%``#:(```.P8``-HP```!!0``
+MVC0```$&``#;M```'@4``-NX```>!@``WX@```H%``#?C```"@8``.'X``!N
+M!0``X?P``&X&``#K\```-`4``.OT```T!@``[#P``)P%``#L0```G`8``.R0
+M```"!0``[)0```(&``#LR````04``.S,```!!@``[B````$%``#N)````08`
+M`/#L```-!0``\/````T&``#Q6````04``/%<```!!@``\A0```$%``#R&```
+M`08``/*0``"1!0``\I0``)$&``#RS````04``/+0```!!@``\O0```$%``#R
+M^````08``/4\```!!0``]4````$&``#W1````@4``/=(```"!@``]W0```$%
+M``#W>````08``/A(``!_!0``^$P``'\&``#Z0```M`4``/I$``"T!@``_`@`
+M`+0%``#\#```M`8``/RD```!!0``_*@```$&``#^/````@4``/Y````"!@``
+M_H````(%``#^A````@8``/[X```!!0``_OP```$&``#_4````04``/]4```!
+M!@`!`,P```$%``$`T````08``0$````!!0`!`00```$&``$!&````04``0$<
+M```!!@`!`3````$%``$!-````08``0&\```"!0`!`<0```(&``$!R````@4`
+M`0',```"!@`!`XP```$%``$#D````08``01T```>!0`!!'@``!X&``$%;```
+M-04``05P```U!@`!!9```#4%``$%E```-08``06\```U!@`!!=P``#H%``$%
+MX```.@8``0;<```U!0`!!N```#4&``$'````.@4``0<$```Z!@`!":P``'<%
+M``$)L```=P8``0H4``!W!0`!"A@``'<&``$*>```O`4``0I\``"\!@`!"L0`
+M`),%``$*R```DP8``0PP``"<!0`!##0``)P&``$,A```,@4``0R(```R!@`!
+M#<````$%``$-Q````08``11L``"@!0`!%'0``*`&``$4<```(`4``11X```@
+M!@`!%(@``&P%``$4C```;`8``1;P```!!0`!%O0```$&``$8P```U`4``1C$
+M``#4!@`!&AP``*0%``$8T```I`8``1CX``#4!0`!&/P``-0&``$9X```I`4`
+M`1GD``"D!@`!&A0``-0%``$:&```U`8``1C(``"D!0`!&B0``*0&``$C````
+MQ@4``2,$``#&!@`!(X0``,8%``$CB```Q@8``210``#&!0`!)%0``,8&``$D
+MH```G`4``22D``"<!@`!)<```!\%``$EQ```'P8``28L``!,!0`!)C```$P&
+M``$FC````@4``2:0```"!@`!*U0```(%``$K6````@8``2M<```"!@`!+#@`
+M`$`%``$L/```0`8``2Q(``#`!0`!+$P``,`&``$L7```>@4``2Q@``!Z!@`!
+M+)```,`%``$LE```P`8``2RD``!Z!0`!+*@``'H&``$LX```'P4``2SD```?
+M!@`!+/@``,`&``$M!```>@4``2T(``!Z!@`!+@```,8%``$N!```Q@8``2YD
+M``!<!0`!+F@``%P&``$ND```7`4``2Z4``!<!@`!+NP``%P%``$N\```7`8`
+M`2\P``!<!0`!+S0``%P&``$O5```7`4``2]8``!<!@`!,&@``)H%``$O=```
+MF@8``2^8``!<!0`!+YP``%P&``$ON```7`4``2^\``!<!@`!,"```%P%``$P
+M)```7`8``3!X``!<!0`!,'P``%P&``$O)```F@4``3"8``":!@`!,+P``%P%
+M``$PP```7`8``3$,```!!0`!,1````$&``$Q>```7`4``3%\``!<!@`!,<P`
+M`,`%``$QT```P`8``3'<``!Z!0`!,>```'H&``$Y*````04``3CP```!!0`!
+M-)P```$%``$Q\````04``3'T```!!@`!,B```%P%``$R)```7`8``3*$``!<
+M!@`!,N```,`%``$RY```P`8``3+T``!Z!0`!,O@``'H&``$S"````04``3,,
+M```!!@`!,T@```$%``$S3````08``3-8``#`!0`!,UP``,`&``$S:```>@4`
+M`3-L``!Z!@`!,]0``,8%``$SV```Q@8``31\```!!0`!-(````$&``$TH```
+M`04``32D```!!@`!-+````$%``$TM````08``34D```!!0`!-2@```$&``$U
+M-````04``34X```!!@`!-8````$%``$UA````08``360```!!0`!-90```$&
+M``$V"```7`4``38,``!<!@`!-BP``%P%``$V,```7`8``390``!<!0`!-E0`
+M`%P&``$V=```7`8``3=D```!!0`!-V@```$&``$WC````04``3>0```!!@`!
+M-[```,8%``$WM```Q@8``3D4```!!0`!.1@```$&``$Y:````04``3EL```!
+M!@`!.7@```$%``$Y?````08``3G````!!0`!.<0```$&``$YT````04``3G4
+M```!!@`!.U@``&8%``$[7```9@8``3NL``!S!0`!.[```',&``$[W```&04`
+M`3O@```9!@`!._@``*T%``$[_```K08``3P$``!!!0`!/`@``$$&``$\$```
+MI04``3P4``"E!@`!/!P``)T%``$\(```G08``3PH```_!0`!/"P``#\&``$\
+M-```P04``3PX``#!!@`!/$```$,%``$\1```0P8``3Q,``!J!0`!/%```&H&
+M``$\6```L04``3Q<``"Q!@`!/&0``,D%``$\:```R08``3QP``"F!0`!/'0`
+M`*8&``$\?```NP4``3R```"[!@`!/Y0``!0%``$^R```%`4``3R(```4!0`!
+M/(P``!0&``$\J```204``3RL``!)!@`!/G```!(%``$^=```$@8``3ZD```H
+M!0`!/J@``"@&``$_````%`4``3\$```4!@`!/T@``!0%``$_3```%`8``3]X
+M```4!0`!/WP``!0&``%!!```%`4``3^D```4!@`!/]@``!0%``$_W```%`8`
+M`4!@```"!0`!0&0```(&``%`;````@4``4!P```"!@`!0,@``,0%``%`S```
+MQ`8``4$<``"D!0`!02```*0&``%!+```*`4``4$P```H!@`!050``*0%``%!
+M6```I`8``4&````4!0`!080``!0&``%!M```H@4``4&X``"B!@`!0>0``(0%
+M``%!Z```A`8``4(T``"7!0`!0C@``)<&``%"1````04``4)(```!!@`!0E@`
+M``$%``%":````08``4*8``!+!0`!0IP``$L&``%#%```?P4``4,8``!_!@`!
+M2)0``'<%``%(F```=P8``4I,```/!0`!2E````\&``%+Z```#P4``4OL```/
+M!@`!310```$%``%-+````08``4U````!!0`!340```$&``%-6````04``4U<
+M```!!@`!3F@``(D%``%.3```B04``4YL``")!@`!3M@``'$%``%.W```<08`
+M`4^````)!0`!3X0```D&``%/R```QP4``4_,``#'!@`!3]P``"X%``%/X```
+M+@8``4_L``!)!0`!3_```$D&``%0^````@4``5#\```"!@`!8H0``*0%``%1
+MN```I`4``5&\``"D!@`!4=P```(%``%1X````@8``5*H``"D!0`!4JP``*0&
+M``%2[```D`4``5+P``"0!@`!55@``#0%``%50```-`4``55<```T!@`!59``
+M`*H%``%5E```J@8``58<``!6!0`!5B```%8&``%6,```C04``58(``"-!0`!
+M5C0``(T&``%61```K`4``59(``"L!@`!5N@``!<%``%6[```%P8``5?@``!C
+M!0`!5^0``&,&``%7_```(04``5@````A!@`!6!0``#8%``%8&```-@8``5DT
+M``"D!0`!63P``*0&``%98```I`4``5EH``"D!@`!9,P``*0%``%9?```I`8`
+M`5F\``"D!0`!6<```*0&``%:@```,`4``5J$```P!@`!6R0``%(%``%;*```
+M4@8``5N8``!G!0`!6YP``&<&``%;J```+`4``5NL```L!@`!6\0``",%``%;
+MR```(P8``5R$```G!0`!7(@``"<&``%<H```'04``5RD```=!@`!7+P``"H%
+M``%<P```*@8``5TP```K!0`!730``"L&``%=3```M@4``5U0``"V!@`!7;0`
+M``$%``%=N````08``5W@``#)!0`!7>0``,D&``%=_````04``5X````!!@`!
+M7C@```$%``%>/````08``5Y0``#)!0`!7E0``,D&``%>;````04``5YP```!
+M!@`!8!@``*0%``%@'```I`8``6!$``"D!0`!8$@``*0&``%@K```7P4``6"P
+M``!?!@`!8I```*0%``%BE```I`8``638``"D!0`!9-P``*0&``%F)````@4`
+M`68H```"!@`!9C```*0%``%F-```I`8``6<,```"!0`!9Q````(&``%G&```
+MI`4``6<<``"D!@`!9\0```(%``%GR````@8``6?0``"D!0`!9]0``*0&``%I
+MV```'@4``6G<```>!@`!:I0``!X%``%JF```'@8``6L,```>!0`!:Q```!X&
+M``%KA```'@4``6N(```>!@`!;+````(%``%LM````@8``6S@```"!0`!;.0`
+M``(&``%M'````@4``6T@```"!@`!;5P```(%``%M8````@8``6V@``!%!0`!
+M;:0``$4&``%MU````@4``6W8```"!@`!;A@```(%``%N'````@8``6XD``"D
+M!0`!;B@``*0&``%NU````@4``6[<```"!@`!;N@``*0%``%N[```I`8``6^H
+M```"!0`!;[````(&``%ON```I`4``6^\``"D!@`!<'@```(%``%P@````@8`
+M`7",``"D!0`!<)```*0&``%Q6````@4``7%<```"!@`!<60``*0%``%Q:```
+MI`8``7)T```"!0`!<G@```(&``%S\````04``7/T```!!@`!=?0```$%``%U
+M^````08``7@@```!!0`!>"0```$&``%X=````04``7AX```!!@`!>00```$%
+M``%Y"````08``7T````!!0`!?00```$&``%^J```304``7ZL``!-!@`!?L0`
+M`$T%``%^R```308``8!````!!0`!@'0```$&``&`B````04``8",```!!@`!
+M@2````$%``&!)````08``8&(```!!0`!@8P```$&``&"&````04``8(<```!
+M!@`!@C````$%``&"-````08``8+````!!0`!@L0```$&``&#5```<P4``8-8
+M``!S!@`!@X0``',%``&#B```<P8``8.L```!!0`!@[````$&``&#N````04`
+M`8.\```!!@`!@\0```$%``&#R````08``8/0```!!0`!@]0```$&``&#W```
+M`04``8/@```!!@`!@^@```$%``&#[````08``8/T```!!0`!@_@```$&``&$
+M````%04``80$```5!@```,@```$"````S````0(```#0```!`@```-0```$"
+M````V````0(```#<```!`@```.````$"````Y````0(```#H```!`@```.P`
+M``$"````\````0(```#T```!`@```/@```$"````_````0(```$````!`@``
+M`00```$"```!"````0(```$,```!`@```1````$"```!%````0(```$8```!
+M`@```1P```$"```!(````0(```$D```!`@```2@```$"```!+````0(```$P
+M```!`@```30```$"```!.````0(```$\```!`@```4````$"```!1````0(`
+M``%(```!`@```4P```$"```!4````0(```)(```U`@```DP``$L"```"4```
+MP@(```)4```\`@```E@``"D"```"7```>0(```)@``!H`@```F0``)@"```"
+M:```8@(```)L```Q`@```G```%L"```"=```,@(```)X``",`@```GP``+D"
+M```"@```4@(```*$``"*`@```H@``'X"```"C```U`(```*0``#-`@```I0`
+M`&D"```"F```2`(```*<``">`@```J```!H"```"I```N`(```*H``"R`@``
+M`JP``$X"```"L```N@(```*T```X`@```K@``*D"```"O```BP(```+```"(
+M`@```L0```P"```"R```O0(```+,``!'`@```M```'P"```"U```P`(```+8
+M``!Z`@```MP``%<"```"X```HP(```+D``"'`@```N@```L"```"[```6@(`
+M``+P```(`@```O0``%@"```"^```J`(```+\``!D`@```P```(`"```#!```
+M)0(```,(``";`@```PP``%T"```#$```90(```,4``"5`@```Q@``"\"```#
+M'```JP(```,@``"O`@```R0``)("```#*```T0(```,L```K`@```S```'`"
+M```#-```8`(```,X``#&`@```SP``"X"```#0```4P(```-$``#(`@```T@`
+M`%X"```#3```<@(```-0```G`@```U0``"T"```#6```'0(```-<```F`@``
+M`V```"0"```#9```@0(```-H```J`@```VP``$H"```#<```(@(```-T```A
+M`@```W@``!$"```#?```0@(```.```"&`@```X0``#T"```#B```GP(```.,
+M``#%`@```Y```'4"```#E```L`(```.8``!5`@```YP``,\"```#H```CP(`
+M``.D``!V`@```Z@``!8"```#K```PP(```.P```^`@```[0``'<"```#N```
+M;P(```.\``""`@```\```,L"```#R```E0(```/,```O`@```]```*L"```#
+MU```KP(```/8``"2`@```]P``-("```#Y````0(``!3````!`@``%,0```$"
+M```4R````0(``!3,```!`@``%-````$"```4U````0(``!4P```!`@``%30`
+M``$"```5.````0(``!4\```!`@``%4````$"```51````0(``!5(```!`@``
+M%4P```$"```54````0(``!54```!`@``%5@```$"```57````0(``!5@```!
+M`@``%60```$"```5:````0(``!5L```!`@``%7````$"```5=````0(``!5X
+M```!`@``%7P```$"```5@````0(``!6$```!`@``%8@```$"```5C````0(`
+M`!60```!`@``%90```$"```5F````0(``!6<```!`@``%:````$"```5J```
+M`0(``!6L```!`@``%;````$"```5M````0(``!6X```!`@``%=@```$"```5
+MW````0(``!7@```!`@``%>0```$"```5Z````0(``!7L```!`@``%?````$"
+M```5]````0(``!7X```!`@``%?P```$"```6`````0(``!8$```!`@``%@@`
+M``$"```6#````0(``!80```!`@``%A0```$"```6&````0(``!8<```!`@``
+M%B````$"```6)````0(``!8H```!`@``%BP```$"```6,````0(``!8T```!
+M`@``%C@```$"```6/````0(``!9````!`@``%D0```$"```AX````0(``"'D
+M```!`@``(>@```$"```A[````0(``"'P```!`@``(?0```$"```A^````0(`
+M`#:@```!`@``-J0```$"```VJ````0(``#:L```!`@``-K````$"```VM```
+J`0(``#:X```!`@````P```("````$````@(````4```"`@```!@```("
+`
+end
diff --git a/sys/contrib/dev/ath/public/ap51.inc b/sys/contrib/dev/ath/public/ap51.inc
new file mode 100644
index 0000000..08781c2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap51.inc
@@ -0,0 +1,69 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/mipsisa32-be-elf.inc#1 $
+#
+
+#
+# Configuration for building big-endian MIPS2 for the AP51 SoC
+# using the 5.01 linux-mips.org toolchain (manually moved to
+# /pub/gnu from /pub/gnu/local where rpm --prefix=/pub/gnu
+# bogusly installs them).
+#
+
+#
+# http://www.linux-mips.org/toolchain.html
+#
+# /pub/gnu/bin/mips-linux-gcc -v
+# Reading specs from /pub/gnu/bin/../lib/gcc-lib/mips-linux/2.96-mips3264-000710/specs
+# gcc version 2.96-mips3264-000710
+# /pub/gnu/bin/mips-linux-as -v
+# GNU assembler version 2.12.90.0.7 (mips-linux) using BFD version 2.12.90.0.7 20020423
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/mips-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -G 0 -EB -mno-abicalls -fno-pic -mips32 -Wa,--trap \
+ -fno-strict-aliasing -fno-common -fomit-frame-pointer -mlong-calls
diff --git a/sys/contrib/dev/ath/public/ap51.opt_ah.h b/sys/contrib/dev/ath/public/ap51.opt_ah.h
new file mode 100644
index 0000000..a40d9b4
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap51.opt_ah.h
@@ -0,0 +1,4 @@
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_AR5312 1
+#define AH_SUPPORT_2316 1
+#define AH_NEED_DESC_SWAP 1
diff --git a/sys/contrib/dev/ath/public/ap61.hal.o.uu b/sys/contrib/dev/ath/public/ap61.hal.o.uu
new file mode 100644
index 0000000..1da82f7
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap61.hal.o.uu
@@ -0,0 +1,3382 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/COPYRIGHT#1 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`0`````````````!``@````!`````````````@9<8``0`0`T````
+M```H`!$`#N#_/_P```````````````````````!__P`````PA/__)`,`6#P"
+M```0@P!A)$(`A"B"`%D00``E)`(1!RB"`!P00``3)`(`4BB"`!H00`!5/`(`
+M`"B"`!,00``))`(`$RB"`!$00`!)/`(``"0"``<0@@!"``````/@``@``!`E
+M$((`1P`````#X``(```0)1""`$$\`@``*((`4Q!```8D`P`</`(``!"#`$$D
+M0@"8`^``"```$"4D`@!7$((`-0`````#X``(```0)1""`"P\`@``*((1"!!`
+M`!0D`P"1/`(``!"#`#(D0@!P*((`DA!```HD`A`4*((`B!!``"P``!`E*((`
+MAA1``"@`````/`(```/@``@D0@!<$((`(``````#X``(```0)20"$1,0@@`<
+M/`(``"B"$1000``&-`/P$R0"$1(0@@`/``````/@``@``!`E/`(``!"#`!0D
+M0@`T-`/Q&SP"```0@P`0)$(`(`/@``@``!`E/`(```/@``@D0@``/`(```/@
+M``@D0@`0/`(```/@``@D0@!(/`(```/@``@D0@"L```0)0/@``@`````)[W_
+MZ*^_`!`PA/__.(,6C"QC``$X@J<G+$(``0!B&"448``$,*7__R0#$+<4@P`%
+M```0)3P"```D0@```$#X"0"@("6/OP`0`^``"">]`!@GO?_@K[\`&#"$__\H
+M@@"($$``&H^H`#`H@@"&$$``*CP"```H@@`=$$``""0"`%(H@@`:$$``*20"
+M`!,0@@`H```8)1```"TD`@`!$((`'2B"`%(40``H```8)2B"`%D00``F)`(`
+M`2B"`%<40``B/`(``!```!4D0@``)`(1$Q""`!<H@A$4$$``"#0"\!,D`@"1
+M$((`"R0"$!00@@`/```8)1```!4D`@`!$((`##0"_QD0@@`)```8)1````\D
+M`@`!/`(``"1"````0/@)KZ@`$!````H`0!@E)`0`$SP"```D0@```$#X":^H
+M`!`0```#`$`8)20"``&M`@``$&``$`!@$"648@'(I&(`")1B`<JD8@`*C&(!
+MS*QB`!R48@'0I&(`()1B`=*D8@`BE&(!U*1B`"248@'6I&(`)@!@$"6/OP`8
+M`^``"">]`""LA0'8`^``""0"``$GO?^PK[\`2*^W`$2OM@!`K[4`/*^T`#BO
+MLP`TK[(`,*^Q`"ROL``H`("H)0"@D"4`P*`E`."8)0``B"4F0L``+%80`">P
+M`"`\`@``)%<``!+``!0`````CJ(`%`!2$"&,0@``KZ(`().C`""2`@`!``(2
+M``!B&"62`@`"``(4``!B&"62`@`#``(6``!B&"4`=!@D$',`#R0"``$0```'
+M`````(ZB`!0`4A`AC$(```*"$"004P`')`(``0+@^`DD!``*)C$``2HB`^@4
+M0/_@```0)8^_`$B/MP!$C[8`0(^U`#R/M``XC[,`-(^R`#"/L0`LC[``*`/@
+M``@GO0!0```P)1"@``@``!@E``,00#"#``$`0Q@E),8``0#%$"L40/_Z``0@
+M0@/@``@`8!`ECZD`$##G__\`!Q!``$<0(0`"$(``11`AE$@`)A$``(P``!`E
+M``<00`!'$"$``A"``$40(9!#`"4D`@`"$&(`(BAB``,00``%)`(``Q!@``H`
+M`!`E`^``"#!"__\08@!9``@0P"0"``008@!F/`,08A```'8``!`E$2``""0$
+M`,``!Q!``$<0(0`"$(``11`AD$,`*20"`&``0R`+``8PP"0"`^APPA`"`$@`
+M&P``$!(5```"```````'``T`@A`A$```8B1"``J,@A(T$$``+`````"40@`"
+M,$*``!!``!$`"!$`/`,08C1C3=,`0P`9```0$``"(8(`!C#``,00(21"`!4`
+M1``;```0$A2```(```````<`#0`"$0`0``!+)$(`D(R$$C00@``6``@0@)2"
+M``(P0D``$$``$3P#$&(`"!#`-&--TP!#`!D``!`0``(A@@`&,,``Q!`A)$(`
+M%0!$`!L``!`2%(```@``````!P`-``(0P!```#0D0@!(``@0@#P#$&(T8TW3
+M`$,`&0``$!```B&"``8PP`#$$"$D0@`5`$0`&P``$!(4@``"```````'``T`
+M`A"`$```(R1"`"0\`Q!B-&--TP!#`!D``!`0``(A@@`&,,``Q!`A)$(`%0!$
+M`!L``!`2%(```@``````!P`-``(0@!```!,D0@`6``@0@#1C3=,`0P`9```0
+M$``"(8(`!C#``,00(21"`!4`1``;```0$A2```(```````<`#0`"$(`M!`/H
+M)$,`O21"`%P`9!`+,$+__P/@``@`````E*,``C!C`"`48``3)`(``I2C``(P
+M8P#0)`0`P!!D``XD`@`#E*,``C!C`-`D!`#0$&0`"20"``24HP`",&,`$!1@
+M``4D`@`!E*,``C!C"``D`@`%``,0"@/@``@`````)[W_X*^_`!BOL0`4K[``
+M$`"`."4`P(@E,B(`@!!```D`H(`E)`,)M!(#`(8D`@`.+@()M!!``'PF`_:9
+M$```/SP"9F8R(@$`$$``-#P"```D0@```$#X"0#@("400``A,B(!0"8"[+,L
+M0@`Q$$``'3(B`4``$!"``%`0(0`".$`\!,S,-(3,S0($`!D``!`0``(0@@`"
+M&(``8A@A)@7__CP"__\T0C\-`.(P(0#$`!D``"`0$&4`"0`$,((\`O__-$(_
+M"`#B,"$\`LS,-$+,S0#"`!D``!`0``(P@A```%D`P!`E+@03B0`"(`HF`O!@
+M/`/,S#1CS,T`0P`9```0$!2``%```A"")@+L>`!#`!D``!`0$```2P`"$((D
+M`PFT$@,`2"0"``XN`@FT$$``"BX#$X@F`_:9/`)F9C1"9F<`8@`8```0$``"
+M$$,``Q_#$```/`!#$",F`NQX/`3,S#2$S,T`1``9```0$!!@`#4``A""/`(`
+M`"1"````0/@)`.`@)1!``"$N`Q,E)@+LLRQ"`#$00``>)@+P8``0$(``4!`A
+M``(X0#P$S,PTA,S-`@0`&0``$!```A""``(8@`!B&"$F!?_^/`+__S1"/PT`
+MXC`A`,0`&0``(!`090`)``0P@CP"__\T0C\(`.(P(3P"S,PT0LS-`,(`&0``
+M$!```C""$```#P#`$"4F`O!@/`3,S#2$S,T`1``9```0$!!@``@``A"")@+V
+M,#P#S,PT8\S-`$,`&0``$!```A$")$(`#X^_`!B/L0`4C[``$`/@``@GO0`@
+M)[W_Z*^_`!2OL``0`*"`)8R%$C00H``*/`(``"1"````0/@)`````#P#```D
+M8P"\`$,0(9!"```0```$<@(0`CP"``"00@"^<@(0`H^_`!2/L``0`^``"">]
+M`!@GO?_HK[\`%*^P`!``H(`EC(42-!"@``\\`@``)$(```!`^`D`````/`,`
+M`"1C`+P`0Q`AD$,```(#`!L``!`2%&```@``````!P`-$```"8^_`!0\`@``
+MD$,`O@(#`!L``!`2%&```@``````!P`-C[\`%(^P`!`#X``()[T`&">]_\"O
+MOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`*"8)9)B
+M``040``U`("P)0``D"4F8P`$)`0`_P!R$"&@1```)E(``2I"`"`40/_\`'(0
+M(8YB```80``I``"0)29T``0\`@``)%4``"0>``$F=P`&`!*`0`(2@"$`$("`
+M)@,`(`)C&"&09``(D'$`"P*$$"&@4@``D&(`"0!$$"4"@A`AH%(``*^@`!`"
+MP"`E`F`H)20&``X"H/@)`B`X)280`"@"D!@AI&(``*^^`!`"P"`E`F`H)20&
+M``X"H/@)`B`X)0+P@"&F`@``)E(``8YB```"0A`J%$#_WP`2@$"/OP`\C[X`
+M.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`LH@`C
+M$$``EB2(`>`\`@``)$(`R``%&(``8A@AC&(```!```@`````E((""*SB```#
+MX``(```0)0/@``@D`@`-`^``""0"``V-`@````(1PCA"``$#X``(,$(``0/@
+M``@D`@`-`^``""0"``V5`@`*K.(```/@``@``!`EE0(`"*SB```#X``(```0
+M)8T#```P8T``)`(`#0/@``@``Q`+C0,``#!C@``D`@`-`^``"``#$`J-`P``
+M/`(@``!B&"0D`@`-`^``"``#$`N-`P``/`(0``!B&"0D`@`-`^``"``#$`N-
+M`P``/`((``!B&"0D`@`-`^``"``#$`N,@@'XK.(```/@``@``!`E)`(``1#"
+M``L`````$,``4@``$"4D`@`"$,(`"@`````D`@`#$,(`"P`````#X``()`(`
+M#82"`?RLX@```^``"```$"64@@'^K.(```/@``@``!`EC(("`*SB```#X``(
+M```0)8T#```P8R``)`(`#0/@``@``Q`+C0,``#!C$``D`@`-`^``"``#$`L#
+MX``()`(`#8T#```\`@"``&(8)"0"``T#X``(``,0"XT#```P8P0`)`(`#0/@
+M``@``Q`+C0,``#!C`@`D`@`-`^``"``#$`LD`@`!$,(`#``````0P``&)`(`
+M#20"``(0P@`+``````/@``@D`@`-C0,``#!C`0`#X``(``,0"XR#$DPD`@`-
+M`^``"``#$`N4@A)(K.(```/@``@``!`E`^``""0"``V,@Q)H)`(`#0/@``@`
+M`Q`+C0(`%*SB```#X``(```0)20"``P#X``(`````"0"`!D0H@`3CZ,`$"RB
+M`!H00``&)`(`'B0"``\0H@`')`(``Q```!P`````$*(`%P`````0```8````
+M`!3"`!8LX@`%$$``%"0"``$#X``(K(<"`"0"``$0P@`&``<0*R0"``(0P@`&
+M`````!````H`````K((23`/@``@D`@`!I(<22`/@``@D`@`!K(<2:`/@``@D
+M`@`!$&```P`````D`@`,K&(```/@``@``!`E)[W_Z`#`2"4LX@`(%$``+0``
+M:"4GJ@`0``T0@`!%$"&42```E$P``@`(%```3!`EK2(``"4I``0DY__\`2!8
+M)24"P``L0A``$$``$"4I``2,@@`4`$@0(8Q"``"OH@`0DZ,`$)%"``$``A(`
+M`&(8)9%"``(``A0``&(8)9%"``,``A8`$```!`!B$"6,@@`4`$@0(8Q"``"M
+M8@``)0@`!"3G__P!B!@K+.(`!#A"``$``Q`+%$#_X2SB``@00/_6):T``0$F
+M$",#X``()[T`&">]_^BOOP`4K[``$(^C`"@D`@`-$*(`%H^P`"PHH@`.$$``
+M!0`````0H``+`````!```"L``!`E)`(`'1"B`!4D@A)0)`(`'A"B`!<``!`E
+M$```)(^_`!0D@@'(K&(``"0"`!"N`@``$```'20"``$\`@``)$(.O`#`*"6,
+M9@```$#X"8X'``"N`@``$```%"0"``&L8@``)`(`&*X"```0```/)`(``13@
+M``<`````)`(`!*X"``",8P``C(("!!````:L8@``)`,`!!3C``0``!`EC,(`
+M`*R"`@0D`@`!C[\`%(^P`!`#X``()[T`&(RC``008`!G```0)8S"``"LH@``
+MC,(`!*RB``B,P@`(K*(`#(S"``RLH@`0C,0`$"0"__\0@@`%+(,!`"0"`/\`
+M@Q`+$````ZRB`!0D`@`"K*(`%(S#`!0D`O__$&(`$@!@("4L@P0!)`($``!#
+M(`HD`@`!K*(`&`!$$"L00``,`````(RB`!@``A!`-$(``:RB`!@`1!`K%$#_
+M^@`````0```$C,,`&(S"`!2LH@`8C,,`&"0"__\08@`2`&`@)2R#!`$D`@0`
+M`$,@"B0"``&LH@`<`$00*Q!```P`````C*(`'``"$$`T0@`!K*(`'`!$$"L4
+M0/_Z`````!````24P@`<)`(#_ZRB`!R4P@`<$$``""0"``J4PP`<+&(`$!1`
+M``(`````)`,`#Q````*DHP`@I*(`()3"`!X00``()`(`"I3#`!XL8@`0%$``
+M`@`````D`P`/$````J2C`"*DH@`BC,(`(*RB`"2,P@`DK*(`*(S"`"BLH@`L
+MC,(`+*RB`#",PP`$)`(`!!1B``4D`@`!C*,`!!1B``(`````K*,`.`/@``@`
+M````C,,`!!!@`!X``!`EC,(`#*RB``B,P@``K*(``(S"``BLH@`$C,(`#*RB
+M``B,P@`0K*(`#(S"`!2LH@`0C,(`&*RB`!2,P@`<K*(`&)3"`""DH@`<E,(`
+M(J2B`!Z,P@`DK*(`((S"`"BLH@`DC,(`+*RB`"B,P@`PK*(`+"0"``$#X``(
+M`````">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)3P"```D0@```$#X"0"@@"4`
+M0(@E$B``'(^_`!R&(@`6%$``$SP"```D0@```D`@)0!`^`D"`"@E`$"`)8Y"
+M`<`"0"`E`$#X"0(@*"4\`P``)&,!5``0@$`"`X`AE@,```!B&"$``QP`$```
+M!@`#%`.6(@`6EB,`&`!#$"$``A0```(4`X^_`!R/L@`8C[$`%(^P`!`#X``(
+M)[T`(">]_\"OOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!RO
+ML``8`("@)0``\"6OH``0``"X):^@`!2.@A(P$$``0```D"4\`@``)%8!5``2
+M$8`"@H`AA@("1@1!`#0F$0(P`H`@)3P#```D8P```&#X"0(@*"4`0*@ECH(!
+MP`*`("4`0/@)`B`H)0`5&$``=A@AE@0"1I1S````DR`A`$00(0`"%````AP#
+ME@(",C!"`0`00``.`'<0*A!``!P"@"`E`&"X)8Z"`<``0/@)`B`H)98#`D8`
+M8A@A`F,8(P`#'````QP#$```$:^C`!0`?A`J$$``#@*`("4`8/`ECH(!P`!`
+M^`D"("@E`!4@0`"6("&6(P`6`&(8(92"````0Q`C``(4```"%`.OH@`0)E(`
+M`8Z"$C`"0A`K%$#_Q0`2$8```)`E`!(1@`*"@"&&`@)&!$$`#B81`C".@@'`
+M`H`@)0!`^`D"("@EE@,",C!C`0"/I0`4`$4@(8^E`!``11`A.&,```"#$`NF
+M(@`8)E(``2I"`$`40/_KC[\`/(^^`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R
+M`""/L0`<C[``&`/@``@GO0!`````````````````,*7__S#&__^4@@``+$(P
+M`CP#```40``#)&@!@#P"```D2`&8```@)20*`&0\"5'K-2F%'P`$$$``2!`A
+ME$(```%"&",`90`8<$8`````$!(`20`8```8$``#&4,``A?#`&(8(Z3C```D
+MA``!*((`"Q1`__`DYP`"`^``"``````PI?__)`,`_Q"C`!,D`@#_E(,``"QC
+M,`,`!1"``$40(21"$L`08``,,$+__RRC`#\`!1"``$40(21"%2(08``&,$+_
+M_P`%$(``11`A``(00"1"$^PP0O__`^``"``````PI?__)`,`_Q"C``DD`@#_
+ME((``"Q",`,DHPE@%$```S!C__\DH@C\,$/__P!@$"4#X``(`````">]_]"O
+MOP`LK[0`**^S`"2OL@`@K[$`'*^P`!@`H)`EED(``"Q"0``40``'`("@)99"
+M`"X00``$`````)9#`!808`".)`(``99"```L0C`#%$``'203`0$D$P%0ED(!
+M=A!``'0``(@E)E```@)@*"4F8@`!,%/__XZ"`:`"@"`E`$#X"2>F`!`00`!\
+M`!$80`!P("&7H@`0``(2`J2"`6``@!@EDZ(`$:1B`6(F,0`"ED(!=@(B$"H4
+M0/_M`F`H)1```%R60@%VCH(!H`*`("4D!0$``$#X"2>F`!`00`!G`H`@)9>B
+M`!```AI"ID,!8@`"$((P0@!_ID(!9)>B`!```A%`,$(`?Z9"`68"8"@E)F(`
+M`3!3__^.@@&@`$#X"2>F`!`00`!5EZ,`$``#(L*60@%F`$00):9"`68``QD"
+M,&,`?Z9#`6B7H@`0``(0P#!"`'^F0@%J`F`H)29B``$P4___CH(!H`*`("4`
+M0/@))Z8`$!!``$&7HP`0``,C0I9"`6H`1!`EID(!:@`#&8(P8P!_ID,!;)>B
+M`!```A!`,$(`?Z9"`6X"8"@E)F(``3!3__^.@@&@`H`@)0!`^`DGI@`0$$``
+M+9>C`!```R/"ED(!;@!$$"6F0@%N``,2`C!"`'^F0@%P``,80C!C`'^F0P%R
+MEZ(`$``"$8`P0@!_ID(!=(Z"`:`"@"`E`F`H)0!`^`DGI@`0$$``&)>C`!``
+M`QJ"ED(!=`!#$"6F0@%TED(!=A!``!```(@E)E,``CP"```D5!7``!&`0"80
+M`6`"<(`A`D`@)0*`^`F6!0``I@(``"8Q``&60@%V`B(0*A1`__8`$8!`)`(`
+M`8^_`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@GO0`P)[W_X*^_`!ROL@`8
+MK[$`%*^P`!``P(`EE+$`%`"@D"4D!``5`!$00"1"``,``A""<B08`@!B("$\
+M`@``)$(```!`^`D`!""``$`8)1!@`#2/OP`<K@,````1$$`D0@`#``(0@@`"
+M$(``8A`AK@(`"*81``02(``H```P)20'`%0D"0`$)`@``XX$````!A!``$0@
+M(8X#``APQR@"`*,8(0!2$"&40@``I&(``*2"`````"`E<,<H`HX"``@`HA`A
+M``08@`!D&"$``QB``$,0(:1$``2.`@`(`*(0(0!#$"&D0``&)(0``2B"``04
+M0/_R<,<8`HX"``@`8A`AI$D`!HX"``@`8A@A),8``0#1$"H40/_=I&@`0B0"
+M``&/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_X`*!@)96"`!:DP@`&-`+>
+MK:>B``"GH@`"```@)93%``8``#@E`.40!S!"``$80``'*(,``A!@`*(``!`E
+M``000`.B$"&D1P``)(0``23G``$HX@`$%$#_\P````"5@@`4I,(`!#!#__\0
+M8`"5```0)93"``000`"1``!()20*`%0D"P`$)`4`&G$E$`(`3"@A)*@`&(S#
+M``AQ*B`"`(,8(92B`!BD8@``C,(`"`""("&4H@`JI((``@``."5Q*B`"C,(`
+M"`""$"$`!QB``&<8(0`#&(``0Q`AI$``!B3G``$HX@`$%$#_]I>C``(T`MZM
+M%&(`'G$J*`*7IP````<@@`"'("$`!""`<2H0`@!$("&,P@`(`((@(:2+``:5
+M`@`"I((`")4#``8`0Q`AI((`"I4#``H`0Q`AI((`#)4#``X`0Q`AI((`#I4"
+M``2D@@`0E0(`"*2"`!*5`@`,I((`%)4"`!`0``!0I((`%HS$``@`I"`AEZ,`
+M```#$(``0Q`A``(0@`""("&5`@`"I((`"(S$``@`I"`AEZ,``@`#$(``0Q`A
+M``(0@`""("$D`@`4I((`"(S$``@`I"`AEZ,``@`#$(``0Q`A``(0@`!$$"$D
+M`P`CI$,`"HS$``@`I"`AEZ,``@`#$(``0Q`A``(0@`!$$"$D`P`_I$,`#)>G
+M````!Q"``$<0(0`"$(``HB`AC,(`"`""("$DA``$I(L``I2"``25`P`&`$,0
+M(:2"``:5`P`*`$,0(:2"``B5`P`.`$,0(:2"``J5`@`$I((`#)4"``BD@@`.
+ME0(`#*2"`!"5`@`0I((`$I>G``(`!Q"``$<0(0`"$(``HB`AC,(`"`""("$D
+MA``$)`(``Z2"``*5`@`4I((`#)4"`!:D@@`.E0(`&*2"`!`E*0`!E,(`!`$B
+M$"H40/]T)`4`&B0"``$#X``()[T`"">]_HBOOP%TK[X!<*^W`6ROM@%HK[4!
+M9*^T`6"OLP%<K[(!6*^Q`52OL`%0`("@):^E`7PD$P%0KZ`!3"0"``&/HP%,
+M$&(`,0``D"4H8@`"$$``!20"``(08``'CZ,!?!```1T``!`E$&(`/X^C`7P0
+M``!3```0)91B`!800`$0*D(`"A!``%$GI``H/!4```)@*"4F<P`!CH(!H`*`
+M("4`0/@))Z8!2!!``0N3I0%)$*``12:Q%<`"(/@)CZ0!?``2&$`GL``0`@,8
+M(:1B``"7H@%(``(J`A"@`#LF4@`!`B#X"8^D`7P`$AA``@,8(:1B```F4@`!
+M*D(`"A1`_^0GI``H$```,CP"``"/HP%\E&(`&A!``.HD90`$``"`)20&`/\G
+MI``0`!`00"1"`5``HA@AE&(``!!&``4`$A!``((0(91C``"D0P``)E(``280
+M``$J`@`#%$#_]``0$$`0```:)Z0`*)1B`!P00`#4)&4`!@``@"4D!@#_)Z0`
+M$``0$$`D0@%(`*(8(91B```01@`%`!(00`""$"&48P``I$,``"92``$F$``!
+M*@(``Q1`__0`$!!`$```!">D`"@0``#&C[\!=">D`"@\`@``)$(```!`^`DD
+M!0$<I[(`/!I``)@``(`E)[8`*"05`!HGO@`L)[<`+B>Q`"H`$!!``L(@(2>C
+M`!``8A@AE&(``*2"``!R%1`"`%8@(91B``"D@@`8`F`H)29S``&.@@&@`H`@
+M)0!`^`DGI@%($$``IG(5(`(`GB@ADZ,!29>B`4@``A!`,$(!``!B&".DHP`8
+M`)8@(9>B`4@``AH"``(3P@`"$@``8A@CI(,`(`)@*"4F<P`!CH(!H`*`("4`
+M0/@))Z8!2!!``)!R%2`"`)XH(9.C`4F7H@%(``(00#!"`0``8A@CI*,`(`"6
+M("&7H@%(``(:`@`"$\(``A(``&(8(Z2#`"@"8"@E)G,``8Z"`:`"@"`E`$#X
+M"2>F`4@00`!Z<A48`@!W("&7H@%(,$(`'Z2"`!@D8P`@`B,@(9>B`4@``A%"
+M,$(`'Z2"```"XQ@AEZ(!2``"$H(P0@`?I&(```)@*"4F<P`!CH(!H`*`("4`
+M0/@))Z8!2!!``&-R%2`")(0`*`/$*"&3HP%)EZ(!2``"$$`P0@$``&(8(Z2C
+M```"Y"`AEZ(!2``"&@(``A/"``(2``!B&".D@P```F`H)29S``&.@@&@`H`@
+M)0!`^`DGI@%($$``3'(5*`(GI@`H`*8@(9.C`4F7H@%(``(00#!"`0``8A@C
+MI(,`,(^C`7R48@``+$)``Q1```QR%2`")*(`*`(B&"$`PA`AE$(``*1B````
+ML1@AEZ(!2``"$@(P0@`_$```"Z1B`!@`D2@AEZ(!2``"&@(``A/"``(2``!B
+M&".DHP`H`*`@)20"``&D@@`8)A```0(2$"H40/]P`!`00(^B`4P``C!`CZ,!
+M?`##$"&40@!HIZ(`/H^B`4P`PC`A``8P@`!F,"$"@"`E)Z4`*#P#```D8QCT
+M`&#X"23&#6000``4CZ,!?(^B`4P``C!``,(P(0`&,(``9C`A`H`@)2>E`"@\
+M`P``)&,:*`!@^`DDQ@UD$$``"(^_`72/H@%,)$(``:^B`4PH0@`#%$#^VR0"
+M``&/OP%TC[X!<(^W`6R/M@%HC[4!9(^T`6"/LP%<C[(!6(^Q`52/L`%0`^``
+M"">]`7@GO?_@K[\`'*^R`!BOL0`4K[``$`"@D"4``(`E/`(``"11````$!!`
+M`%`0(0`"$(`"0A`AC$0-9!"```,``````B#X":Q`#60F$``!*@(``Q1`__2/
+MOP`<C[(`&(^Q`!2/L``0`^``"">]`"``@$@E,*7__Z4E`!25)``6``!`)3""
+M``$D`P`!.$(```!B0`L`!!!",$(``1!```(E`@`!,$C__P`$$((P0@`!$$``
+M`B4"``$P2/__``00PC!"``$00``")0(``3!(__\0H``3```X)20+`&8E*@`"
+M``<80`!F$"&41````2,8(:1D``!PZQ`")$(`&`$B&"&D9````4(0(:1(```D
+MX@`!,$?__P#E$"L40/_R``<80`/@``@`````)[W_J*^_`%2OO@!0K[<`3*^V
+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
+M__^4H@`4$$``.```."4D#@!F)9``!"6-``8EB@`()!D`!"08``$D#P`%``<8
+M0`"C$"&41````8,8(:1D``!P[A`")$(`&`&"&"&D9````@(0(:1+`````$`E
+M```@)7#N,`(`!!!``$00(0`"$,``1A`A)$,`&`&C$"&D1````(D0!S!"``$0
+M0``'`4,8(24"``$P2/__%1@`":1Y```0```'I&\````$$$``1!`A``(0P`!&
+M$"$`2A`AI$``&"2"``$P1/__+((`!!1`_^8`!!!`).(``3!'__^4H@`4`.(0
+M*Q1`_](`!QA`C[````/@``@GO0`()[W_Z*^S`!2OL@`0K[$`#*^P``@`H)`E
+M`,"()30"WJVGH@``IZ(``J>B``2GH@`&``#()98D`!8``&@E)`4``P"M&",`
+M9!`',$(``1!```0`&1!``Z(0(:1#```G.0`!):(``3!-__\MH@`$%$#_]0"M
+M&".60@`4IB(`%#!"__\00`!(``!P)203`&9QTQ`"`D(8(21X`!@`41`AE&,`
+M&*1#`!@3(``Y``!H)20"`&9QPH`")P\`!``-($`#I!`AE$(````"&$``8A@A
+M``,8P`(#&"$`<1@A`(\0(81"``@``A"`I&(`+`'D("&4@@``I&(`(B0(``&4
+M8@`@`0(0*Q!``!TD;``>)8L`!B<*``0EB0`$``@H0`"K."$`X#`E``@@@`"-
+M("$`!"!``(H0(81#`#```QA`E,(`!@!#$"&DX@`(`24P(0"I*"$`BB`AE*/_
+M_I2"``@`8A@AI,,``"4"``$P2/__E8(``@$"$"L40/_I``@H0"6B``$P3?__
+M`;D0*Q1`_\T`#2!`)<(``3!.__^6(@`4`<(0*Q1`_[QQTQ`")`(``8^S`!2/
+ML@`0C[$`#(^P``@#X``()[T`&">]_\"OOP`XK[4`-*^T`#"OLP`LK[(`**^Q
+M`"2OL``@`("@)0"@F"4D`@`$IZ(`&"0"``:GH@`:)`(`":>B`!PD`@`,IZ(`
+M'@``J"4\`@``)$(```!`^`DD!`04`$"`)1(``(H"H!`EEF(`%A!``"R6<@#0
+M/`(``"1"```"`"`E`$#X"20%!!268@!HI@(`%B0"``JOH@`0KZ``%#P"```D
+M0B,@`H`@)0)@*"4"`#`E`$#X"0)`."400`!N`````"9Q#6268@!HIF(->CP"
+M```D0BG4`B`@)0!`^`D"`"@E/`(``"1"*S`"@"`E`@`H)0!`^`D"(#`E$$``
+M7@````"6`@`:``(00`!=$"&40P`6E@(`%'!#(`(`DI`A)E(`!99B`!H00``L
+M/`(``"1"```"`"`E`$#X"20%!!268@!JI@(`%B0"``2OH@`0)`(``:^B`!0\
+M`@``)$(C(`*`("4"8"@E`@`P)0!`^`D"0#@E$$``0``````F<1%XEF(`:J9B
+M$8X\`@``)$(IU`(@("4`0/@)`@`H)3P"```D0BLP`H`@)0(`*"4`0/@)`B`P
+M)1!``#``````E@(`&@`"$$``71`AE$,`%I8"`!1P0R`"`)*0(292``*68@`<
+M$$``)#P"```D0@```@`@)0!`^`DD!004EF(`;*8"`!8D`@`$KZ(`$"0"``*O
+MH@`4/`(``"1"(R`"@"`E`F`H)0(`,"4`0/@)`D`X)1!``!(`````)G$5C)9B
+M`&RF8A6B/`(``"1"*=0"("`E`$#X"0(`*"4\`@``)$(K,`*`("4"`"@E`$#X
+M"0(@,"400``"`````"05``$2```$/`(``"1"````0/@)`@`@)0*@$"6/OP`X
+MC[4`-(^T`#"/LP`LC[(`*(^Q`"2/L``@`^``"">]`$`GO?_`K[\`/*^^`#BO
+MMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"@D"660@``+$)``!1`
+M``H`@)@EED,`+B0"``$48@`&/`(``"1"'/0`0/@)`````!```+Z/OP`\ED(`
+M`"Q"4``40``+``"X)99#`"XD`@`"%&(`!SP"```D0BSP`F`@)0!`^`D"0"@E
+M$```L(^_`#R60P``+&,P`R0$`0`D`@%0`$"()20"``$2X@`0`(.("RKB``(0
+M0``%)`(``A+@``<F,0`%$```H```$"42X@`.```0)1```)V/OP`\EE4!=B90
+M`7@0```.)E8!8I9"`!H00`"1)C$`-Y95`X`F4`0^$```!R96`XB60@`<$$``
+MBB8Q`$:650.`)E`#HB96`X(2H`"%``"@)3P"```D7A5``!000`!6$"&40@``
+MI@(```(@*"4F,0`!CF(!H`)@("4`0/@))Z8`$!!``'R/OP`\EZ(`$``"$H*F
+M`@`$EZ(`$``"$0(P0@`_I@(``I>B`!```A"`,$(`/Z8"`!X"("@E)C$``8YB
+M`:`"8"`E`$#X"2>F`!`00`!HEZ,`$``#&X*6`@`>`$,0):8"`!Z7H@`0``(2
+M`C!"`#^F`@`@EZ(`$``"$((P0@`_I@(`(I>B`!```A$`,$(`/Z8"`"0"("@E
+M)C$``8YB`:`"8"`E`$#X"2>F`!`00`!0EZ,`$``#&P*6`@`D`$,0):8"`"27
+MH@`0``(1@C!"`#^F`@`FEZ(`$#!"`#^F`@`H`B`H)28Q``&.8@&@`F`@)0!`
+M^`DGI@`0$$``/H^_`#R7H@`0``(2@J8"`"J7H@`0``(1`C!"`#^F`@`LEZ(`
+M$``"$(`P0@`_I@(`+@(@*"4F,0`!CF(!H`)@("4`0/@))Z8`$!!``"J7HP`0
+M``,;@I8"`"X`0Q`EI@(`+I>B`!```A(",$(`/Z8"`#"7H@`0``(0@C!"`#^F
+M`@`R`D`@)98%``*6!@`$`\#X"28'``B6`@`&$$``#@``("4F!0`&)`8`,@`$
+M$$`D0@`8`*(0(81#``!P9A@"I$,``"2$``&6`@`&`((0*A1`__<`!!!`)I0`
+M`0*5$"H40/]_)A``-";W``$JX@`#%$#_4R0"``&/OP`\C[X`.(^W`#2/M@`P
+MC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?_`K[\`/*^^`#BO
+MMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"`N"4`H)`E``"H)99"
+M```L0D``%$``!"0$`0"60@`D$```!B11_ZN60@``+$(P`R0#`5``8(@E`(*(
+M"R0"``$2H@`.*J(``A!```@D`@`")C$`5206``@F4`3<$J``%B93!-H0``!Z
+M```0)1*B``L``!`E$```=X^_`#R60@`:$$``;P`````F,0!E)!8``B90!4X0
+M```()E,%3)9"`!P00`!G`````"8Q`&DD%@`#)E`%+B93!2RF8```$L``8```
+MH"4\`@``)%X6(`(@*"4F,0`!CN(!H`+@("4`0/@))Z8`$!!``%N/OP`\ED(`
+M`"Q",`,40``$EZ(`$``"$@(0```#I@(`"``"$D*F`@`(E@4`"!"@`$8`````
+M%J``!P)`("4\`P``)&,5P`!@^`D"0"`E$```!*8"``@#P/@)E@4`"*8"``B6
+M0@``+$(P`Q1```F7H@`0``(0@C!"`#^F`@`&EZ(`$``"$0`P0@`_$```"*8"
+M``0``A#",$(`/Z8"``:7H@`0``(0P#!"`#^F`@`$`B`H)28Q``&.X@&@`N`@
+M)0!`^`DGI@`0$$``*8^_`#R60@``+$(P`Q1```V7HP`0``,;`I8"``0`0Q`E
+MI@(`!)>B`!```A&",$(`/Z8"``*7H@`0,$(`/Q````VF`@````,;0I8"``0`
+M0Q`EI@(`!)>B`!```A'",$(`/Z8"``*7H@`0``(00C!"`#^F`@``EF(``"1"
+M``&F8@``)I0``0*6$"H40/^D)A``"B:U``$JH@`#%$#_<"0"``&/OP`\C[X`
+M.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?_`
+MK[\`/*^^`#BOMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"`H"4`
+MH/`EE\(``"Q"0``40``$)]$%9)?2`"00```')E(`&I?"```L0C`#)`0!;R0#
+M`;\`8)`E`(*0"Y?"`0000`#JKZ``%(^C`!0``Q!``%X0(91"`0840``()D0`
+M")?"```L0C`#)D,`!P"`D"4`8I`+$```U28Q`$"7P@``+$(P`Q1``"\"0"@E
+M``"8)292``&.@@&@`H`@)0!`^`DGI@`0$$``T@`3&,``<1@AEZ(`$``"$@*D
+M8@``DZ(`$:1B``@F<P`"*F(`"!1`__`"0"@E``"8)0)`*"4F4@`!CH(!H`*`
+M("4`0/@))Z8`$!!``+\`$R#``)$@(9>C`!```Q(",$(`/Z2"``(``Q.",$(`
+M`:R"``27H@`0,$(`/Z2"``H``QF",&,``29S``(J8@`(%$#_Z*R#``P0``"`
+M``"8)292``&.@@&@`H`@)0!`^`DGI@`0$$``I0*`("67H@`0``(:0J8C````
+M`A"",$(`?Z8B``B7H@`0``(10#!"`'^F(@`0`D`H)292``&.@@&@`$#X"2>F
+M`!`00`"4EZ,`$``#(L*6(@`0`$00):8B`!```QD",&,`?Z8C`!B7H@`0``(0
+MP#!"`'^F(@`@`D`H)292``&.@@&@`H`@)0!`^`DGI@`0$$``@9>C`!```R-"
+MEB(`(`!$$"6F(@`@``,9@C!C`'^F(P`HEZ(`$``"$$`P0@!_IB(`,`)`*"4F
+M4@`!CH(!H`*`("4`0/@))Z8`$!!``&Z7HP`0``,CPI8B`#``1!`EIB(`,``#
+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
+M*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``BL`%!A``'4@(9>B`!```A("I((`
+M.`!S&"&3H@`1I&(`0`(`*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``AP`%!A`
+M`'$@(9>B`!```A("I((`2@"`&"63H@`1I&(`4`(`*"4F$``!CD(!H`)`("4`
+M0/@))Z8`$!!``@T"D1@AEZ(`$``"$@*@8@!9`!000"1"`%@"8B`ADZ,`$3!B
+M`(`00``#I(,``#1B_P"D@@```@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`!
+M^0`4($``D2@AEZ,`$``#$4(P0@#_I*(`8B2$`&@")!`A``,80C!C``^D0P``
+M`J0@(9>B`!`P0@`!I((``)8B```L0D``%$``#@`````2@``%EZ(`$!*7``<`
+M````$```"98B`````A-",$(``1````2F(@`F``(30C!"``&F(@`HEB(``"Q"
+M,`,40``M`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`!SY>C`!``%!!``%40
+M(0`#&8(P8P!_I$,`L"0"``$2@@`+*H(``A!```4`````$H``%P`````0```9
+MEB(``!*7``L`````$```%98B``"7H@`0,$(`!Z8B`/R7H@`0``(0PC!"``<0
+M```,IB(!`)>B`!`P0@`'IB(`_I>B`!```A#",$(`!Q````2F(@$"EZ(`$#!"
+M`#^F(@`2EB(``"Q",`040``L`!000``4&$``<Q@AEZ(`$``"$T*D8@"X`@`H
+M)280``&.0@&@`D`@)0!`^`DGI@`0$$`!F0`4($`DA`"X`F0@(9>C`!```QC`
+M,&,`.)2"````0Q`E%I<`":2"``"7HP`0``,0PJ(B`"*6(@``+$)`!A1```(`
+M`Q+"IB(`+!:``!$`````EB(``"Q"0``40`#QEZ,`$``#$@(P0@`_IB(!1@`#
+M&,(P8P`?$```!J8C`4H`4Q`A)`,`"J1#`+@D`@`/HB(`(I8B```L0D``%$``
+MX20"``$2@@`+*H(``A!```4`````$H``H0`````0``#:)I0``1*7`"4"`"@E
+M$```UB:4``$"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`%>`B`@)0+`^`F3
+MI0`1IB(!5)>E`!`"("`E`L#X"0`%*@*F(@%6CD(!H`)`("4"`"@E`$#X"2>F
+M`!`00`%/`B`@)0+`^`F3I0`1IB(!6)8B```L0D`!%$``MY>B`!```A(",$(`
+M/Q```+.F(@#$)A```8Y"`:`"0"`E`$#X"2>F`!`00`$]`B`@)0+`^`F3I0`1
+MIB(!3I>E`!`"("`E`L#X"0`%*@*F(@%0`@`H)280``&.0@&@`D`@)0!`^`DG
+MI@`0$$`!+0(`*"67H@`0,$(`?Z8B`!"7H@`0``(1PC!"`#^F(@`4)A```8Y"
+M`:`"0"`E`$#X"2>F`!`00`$?`B`@)0+`^`F3I0`1IB(!4I8B```L0D`!%$``
+M!0(`*"67H@`0``(2`C!"`#^F(@#&)A```8Y"`:`"0"`E`$#X"2>F`!`00`$.
+MC[\`/)>B`!```A%",$(`/Z8B`4B7H@`0,$(`'Z8B`4R6(@``+$)``A1``'$"
+M`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`#\C[\`/).B`!&F(@`JEB(``"Q"
+M4``40`!DEZ,`$``#$@(P0@!_IB(`U@`#&\*F(P#:`@`H)280``&.0@&@`D`@
+M)0!`^`DGI@`0$$``Z)>C`!`P8P`?``,80)8B`-H`0Q`EIB(`VI>C`!```Q%"
+M,$(`/Z8B`.(``QK"HB,`W8Y"`:`"0"`E`@`H)0!`^`DGI@`0$$``UX^_`#R3
+MH@`1,$(`!P`"$4"2(P#=`&(8):(C`-V7H@`0``(0PA```#NB(@#?EB(``"Q"
+M0`$40``W`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$``PH^_`#R7H@`0,$(`
+M/Z8B`,*6(@``+$)0`!1``"F7HP`0``,1@C!"`'^F(@#4``,;0J8C`-@"`"@E
+M)A```8Y"`:`"0"`E`$#X"2>F`!`00`"MEZ,`$#!C``<``QC`EB(`V`!#$"6F
+M(@#8EZ,`$``#$,(P0@`_IB(`X``#&D*B(P#<CD(!H`)`("4"`"@E`$#X"2>F
+M`!`00`"<C[\`/).B`!$P0@`!``(1P)(C`-P`8A@EHB,`W)>B`!```A!"HB(`
+MWB:4``$J@@`#%$#]F``4$("6(@``+$(P`Q!``!TD`@`$CD(!H`)`("4D!0#L
+M`$#X"2>F`!`00`"#`D`@)9>B`!`P0@`'IB(`_)>B`!```A#",$(`!Z8B`0".
+M0@&@)`4`[0!`^`DGI@`0$$``=X^_`#R7H@`0,$(`!Z8B`/Z7H@`0``(0PC!"
+M``>F(@$")`(`!*8B`6`D`@`!IB(!7J8B`5RF(`%:C]``%)8B`0000``6``"@
+M)28S``8"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`!<`!080`!S("&7H@`0
+M``(2`J2"`0``@!@EDZ(`$:1B`0(FE``"EB(!!`*"$"H40/_N`@`H)98B```L
+M0E`#%$``&P```````*`E)C,`!HY"`:`"0"`E`@`H)0!`^`DGI@`0$$``0Y>C
+M`!``%!"``%,0(:1#`XB.0@&@`D`@)28%``4`0/@))Z8`$!!``#F7HP`0`!00
+M@`!3$"&D0P.*)I0``2J"``440/_I)A```98B```L0C`#$$``"B0"_\JF(@!<
+M)`+__Z8B`%ZF(@!@)`(`#Z8B`$0D`@`<IB(`1J8B`$B6(@``+$)``!1```D"
+M0"`ECD(!H"0%`,H`0/@))Z8`$!1```F/OP`\$```&X^^`#B.0@&@)`4`SP!`
+M^`DGI@`0$$``%(^_`#R7H@`0IB(`&)8B`!840``.)`(``98B```L0D``%$``
+M!@````"6(@`8``(2PC!"``$0```$IB(`%I8B`!@``A/"IB(`%B0"``&/OP`\
+MC[X`.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`G
+MO?_@K[\`&*^Q`!2OL``0`("`)3P"```D0CH<`$#X"0"@B"400``7`@`@)3P"
+M```D0A98`$#X"0(@*"400``1`@`@)3P"```D0B^@`$#X"0(@*"400``+`@`@
+M)3P"```D0C,D`$#X"0(@*"400``%`@`@)3P"```D0C70`$#X"0(@*"6/OP`8
+MC[$`%(^P`!`#X``()[T`(">]_^BOOP`0`*`8)91B```L0D``%$``"8^_`!"4
+M8P`N)`(``11B``4\`@``)$(A_`!`^`D`````C[\`$`/@``@GO0`8````````
+M````````E(,``)2B```48@`'`````)2"``(P1,'PE*(``C!"P?`0```#`((@
+M(Y2$````@B`C`^``"`"`$"64@@((`^``"#!"O_\``"@E``40P`!$$"&,0P``
+MC$(`!`!B&"448``&```0)22E``$HH@`"%$#_]@`````D`@`!`^``"``````G
+MO?_HK[\`$#P"```D0DEH`$#X"0``````0"@E,**``!!``!$``"`E,*5__SP"
+M```D1AJ(``00@`!$$"$``A"``$80(91#```090`3)`(``22$``$L@@"#%$#_
+M]@`````0```-```0)3P"```D1A$H``010`!&$"&40P``$&4`!B0"``$DA``!
+M+((`2Q1`__D`!!%````0)8^_`!`#X``()[T`&">]_^BOOP`4K[``$#"P__\2
+M```E)`(``3P"```D0DEH`$#X"0``````0"@E,*.``#P"__\T0G__`*(0)`("
+M$"848``9+$(``3BB`?\L0@`!+*,``0!#$"440``3)`(``0``("4\`@``)$8:
+MB``$$(``1!`A``(0@`!&&"&48@``%@(`!`````"48P`"$&4`!B0"``$DA``!
+M+((`@Q1`__0`!!"````0)8^_`!2/L``0`^``"">]`!@GO?_@K[\`'*^R`!BO
+ML0`4K[``$`"@B"6,@@&<`$#X"0#`D"4`0(`E,@(`0A!```<R`@`@CB(`"!1`
+M``0R`@`@)`+_O0("@"0R`@`@$$``!S("``B.(@`,%$``!#("``@D`O_?`@*`
+M)#("``@00``',@(``8XB``040``$,@(``20"__<"`H`D,@(``1!```<\`@``
+M)$))=`!`^`DF1``@$$```B0"__X"`H`D`@`0)8^_`!R/L@`8C[$`%(^P`!`#
+MX``()[T`(">]_V"OOP"<K[(`F*^Q`)2OL`"0`("0)0``B"4\`@``)$),Z`!`
+M^`DPI/__`$"`)1(```\\`@``)$).?`)`("4"`"@E-`;_?P!`^`DGIP`0$$``
+M!SP"```D0DL,`D`@)0(`*"4`0/@))Z8`$`!`B"4"(!`EC[\`G(^R`)B/L0"4
+MC[``D`/@``@GO0"@)[W_Z*^_`!2OL``0/`(``"1"26@`0/@)`("`)0!`&"4D
+M`@`2$&(`%"0"``$H8@`3$$``!0`````08``*```0)1````Z/OP`4)`(!_Q!B
+M``4T`H-*%&(`!R0"``$0```'C[\`%)8$`@HD`P-*$(,``B0"``$``!`EC[\`
+M%(^P`!`#X``()[T`&#"$__\``"@E/`(``"1&&H@`!1"``$40(0`"$(``1A`A
+ME$,``!!D``4`````)*4``2RB`(,40/_V```0)0/@``@`````)[W_X*^_`!BO
+ML0`4/`(``"1"26@`0/@)K[``$`!`B"4R(H``$$``!S(P?_\\`@``)$),Z`!`
+M^`D"`"`E%$``$@(`$"4``"`E/`(``"1%$2@`!!E``&40(91"```440`%`&40
+M(91#`!@48``'`&`0)20$`$LDA``!+((`2Q1`__4`!!E````0)8^_`!B/L0`4
+MC[``$`/@``@GO0`@)[W_Z*^_`!``H#@E```8)3P"```D1B3(/`(``"1(````
+M`Q'``$8H(92B```41``()&,``1#@``0D8___`.`@)0$`^`DD!@"`$```!20"
+M``$L8@`Q%$#_\P`#$<```!`EC[\`$`/@``@GO0`8```H)3P"```4@``#)$81
+M*`/@``@``!`E``410`!&$"&40P``$&0`!B0"``$DI0`!+*(`2Q1`__@`````
+M```0)0/@``@`````)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`DK[0`(*^S`!RO
+ML@`8K[$`%*^P`!``@/`E`*"H)0#@L"4PU___``"`)0``B"4``)@EEJ(``!1`
+M`!L``*`E/`(``"1"26@`0/@)``````!`D"4R0H``%$``$3P"```D0DW(`D`@
+M)0!`^`D``"@E%$``#@)`("4\`@``)$).-`!`^`D"0"`E$$```P`````0```&
+M`D`@)1````26I``"$````I:D``*6I``",(+_`!1``$<\`@`````P)0``."4\
+M`@``)$41*``&$4``11@AE&(``!1$``,``````&"8)20'``$DQ@`!+,(`2RSC
+M``$`0Q`D%$#_]0`&$4`0X`!)```0)3+B`(`40``$``"`)99D``(0```#CG$`
+M")9D``2.<0`,```P)0``."4\`@``)$D`3#P"```D2`!0``80P`!&$"$``AB`
+M`&DH(92B```41``'`&@0(8_#`=B,0@``%&(``P``````H*`E)`<``23&``$L
+MP@`"+.,``0!#$"040/_O``80P!#@`!`RX@"`%$``"```$"6.@P`(`@*`)`(C
+MB"2.@P`,`@*`)1````<"(X@ECH,`$`("@"0"(X@DCH,`%`("@"4"(X@E/`(`
+M`"1"3<@`0/@)`L`H)1!``!*/OP`TCL(`$([#`!2.9``0CF4`%`!$$"0`91@D
+MKL(`$*[#`!26H@`",$+_``(P&"4L0@`!``,0"A!```,D`@`!KM$`&(^_`#2/
+MO@`PC[<`+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`.``$
+M-\,`!C:"`(8P(0`&,8,`!A&``((@(R0"```D`P`!``0^@`3A``0``````(-`
+M!!````<``$@E$.``!`""0`0`!#@C`.,X!@$'0"4`@T@$`0`0)0$@&"4`!C#`
+M`,4P(8S$``",Q0`$`$00)`!E&"0`8A`E`^``"``"$"LPYP#_$.``%P"`&"40
+MH``/```@)9!B```01P`2`````!!```H`````)(0``0"%$"L00``&`&00(9!"
+M```01P`)`````!1`__@`````$(4`!0!D$"&@1P``C,(``"1"``&LP@```^``
+M"``````GO?Y@K[\!G*^^`9BOMP&4K[8!D*^U`8ROM`&(K[,!A*^R`8"OL0%\
+MK[`!>`"`\"6OI0&DKZ8!J*^G`:R/L@'$E[`!OI>B`<*OH@%8)`,;6*^C`6`G
+MQ0(PKZ4!9#P"```D0DFP`$#X"0``B"400`&@C[\!G#P"```D0DTL`$#X"0/`
+M("6GP@(*,$+__Q1```L\`@``/`(``"1"2E0#P"`E`$#X"0(`*"400`&1C[\!
+MG#("/_^GP@(*/`(``"1"7[``0/@)`\`@)3P"```D0DSH`$#X"9?$`@H`0(`E
+M$@`!@P/`("4\`@``)$).?`(`*"4T!O]_`$#X"2>G`!`00`%[`\`@)3P"```D
+M0DY\`@`H)20&`(``0/@))Z<`D!!``72/OP&<CZ0`&(^E`!PD`@``)`,`!0""
+M$"0`HQ@D`&(0)20&``$`PH@+)`(``"0#``(`@B`D`*,H)`"D("4D`@`"`$2(
+M"X_"`@P2(@`"/`(``*_1`@PD0DL,`\`@)0(`*"4`0/@))Z8`$!9```.OH@%<
+MEA``$*^P`6"/I@&H+,,`020"`$``0S`*KZ8!J(_"`>```CJ",.<``:^G`6P`
+M`A)",$(``:^B`6@\`@``)%<!\#P"```D0@((`N(0*Q!``0@``*@EEN(``(^H
+M`5@`2!`D$$``_`````"6X@``CZ,!7`!#$"000`#W)Z8!$(_"`9@#P"`EEN4`
+M`@!`^`DGIP$2$$``\"0"``26XP``$&(`)2AB``400``()`(`("0"``$08@`9
+M)`0``A!D`!`\!0``$```Y2;W``008@`I*&(`(1!```8D`@!`)`(`"!!B`!T\
+M`@``$```W";W``008@`H/`8``!```-@F]P`$)[(`$">T`$`DI0=(KZ4!<))"
+M``(0```E-%,``R>R`!`GM``P/`(``"1""HBOH@%P$```'I)3``(GL@"0)[0`
+MX#P"```D0@0HKZ(!<))"``(0```6-%,``2>R`)`GM`#P)$(!B*^B`7"20@`"
+M$```#S13``(GL@"0)[0!`#P"```D0@#HKZ(!<))"``(0```'-%,`!">R`!`G
+MM`!0),8'2*^F`7"20@`"-%,`!#P'```DYTET`.#X"0*`("440`"F````````
+ML"4"P"`E/`@``"4(4.0!`/@)`H`H)1!``)H`%A%`CZ,!<`!B@"&/I`&PCZ4!
+MM(^F`;@\"```)0A18`$`^`F2!P`8EA$``)8"``(`41`K%$``C)>B`1`"(A`K
+M%$``@I>B`1(`41`K%$``?X^E`6R2!``&.(,`"BRB``$``Q`+%$``>8^F`6@X
+M@P`%+,(``0`#$`L40`!TCZ<!8)(#``<"(Q@A``,80R3B``H`0Q`J%$``;8^H
+M`:@"J!`K$$``?(^E`<B.`@`0C@,`%``"'\(LI``!`(,@)!2``&,``!`ECD(`
+M&#!"`(`00``$)`(`!H_#`=P08@!<`````">D`1@\!@``),8```#`^`DD!0!`
+MI[$!&);D``*GI`$:D@,`!B0"``408@`%)`(`"A1B``8T@D``$```!*>B`1J7
+MH@$:-$*``*>B`1J2`@`$HZ(!'9("``6CH@$RCD(`&*^B`32OLP$XC@(`$(X#
+M`!2.1``0CD4`%`!$$"0`91@D`&(0)1!```27H@$:-$("`!````.GH@$:,$+]
+M_Z>B`1J.`@`(C@,`#(Y$``B.10`,`$00)`!E&"0`8A`E$$```R0'``(0```"
+MHZ<!'*.@`1R.`@`(C@,`#(Y$``B.10`,`$00)`!E&"0D!```)`4``@!$$"0`
+M91@D`&(0)1!```.3H@$<-$(`"*.B`1R.0@`8,$(`0!!```0`````DZ(!'#1"
+M``2CH@$<`!41@(^H`60`2!`A)Z,!&">D`5B,90``C&8`!(QG``B,:``,K$4`
+M`*Q&``2L1P`(K$@`#"1C`!`49/_V)$(`$":U``&2`@`'`B(0(3!1__^6`@`"
+M`%$0*Q!`_W:7H@$0)M8``2K"`(`40/]=`````";W``0\`@``/`(``"1"`@@"
+MXA`K%$#^^@`````2H``U+J,`020"`$``0Z@*/`(``"1"6X2/I`%D`J`H)20&
+M`$`\!P```$#X"23G23"OU1(P&J``$P``*"4`!2#`CZ(!I`""("$`!1F`CZ8!
+M9`!F&"&48@``I((``)1B``*D@@`"D&(`!*""``208@`%H((`!22E``$`M1`J
+M%$#_\``%(,"/P@&\`\`@)8^E`:0`0/@)`J`P)1J@``\``"@E``4A@(^G`60`
+MAR`A``48P(^H`:0`:!@AD&(`!J""``:08@`'H((`!R2E``$`M1`J%$#_]``%
+M(8"/H@&LK%4``)?"`@JGP@`8`!40*X^_`9R/O@&8C[<!E(^V`9"/M0&,C[0!
+MB(^S`82/L@&`C[$!?(^P`7@#X``()[T!H)2B``*,AA(T$,``$3!(P?"4PP``
+ME*(``!1B``XDAP(PE,,``C!BP?`42``*`````)#"``0P0@`!$$```S!C``(4
+M8``E```0)0/@``@`P!`E)(<",(R$$C`0@``?```0)92E````!!!#``(1@`#B
+M,"&4P@```*(0(Q1``!``````E,,``C!BP?`42``)`````)#"``0P0@`!$$``
+M`S!C``(48``-```0)0/@``@`P!`EE,(``C!"P?`!`A`C&$```P`````DQP!`
+M)(3__P`$($,4@/_D```0)0/@``@`````)[W_Z*^_`!2OL``0/`(``"1"````
+M0/@)`,"`)1!```D`````@$(`&@`"$$`"`A`C``(6```"%@,H0P``$````@`#
+M$`L``!`EC[\`%(^P`!`#X``()[T`&">]_]BOOP`@K[,`'*^R`!BOL0`4K[``
+M$`"`B"4`H)@EEB(""A1``"4D$`#_/`(``"1226@"0/@)`````#!"`/`D`P!@
+M$$,`!@`````"0/@)`B`@)20#`9D40P`9/`(``)9B``(P0@"@)`,`H!!#`"8D
+M$`#AEF(``C!"`-`D`P#`$$,`(200`.*68@`",$(`T"0#`-`00P`<)!``Y)9B
+M``(P0@%0)`0`X"0#`.,X0@%0`&"`)1```!0`@H`+/`(``"1"```"("`E`$#X
+M"0)@*"400``-)`,`P(Q0`""68@`",$(`P!1#``D"`!`E,@,`#R0"``$48@`%
+M`@`0)20"__`"`H`D-A```@(`$"6/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@G
+MO0`H)[W_Z*^_`!`\`@``)$(```!`^`D``````$`8)1!@``0``!`EC&(`'``"
+M$((P0@`!C[\`$`/@``@GO0`8)[W_T*^_`"ROM@`HK[4`)*^T`""OLP`<K[(`
+M&*^Q`!2OL``0`,"@)0#@L"4`@*@E)+/__Q)@`!L"M)`A`K(0*Q!``!4"0(@E
+M`C2`(P(`("4"P/@)`B`H)1A```\``````B`@)0*`*"62`P``D((``*("```F
+M$``!H(,``"2E__\4H/_Y)(0``0(TB","L1`K%$#_[0`````F<___%F#_YP)4
+MD"&/OP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`P)[W_
+MV*^_`""OL0`<K[``&`"`@"4"`(@EC@(!H"0%`,$`0/@))Z8`$!!``!:7HP`0
+M+&-``"0&`,\D!0#*CB(!H`(@("4`PR@+`$#X"2>F`!(00``-C[\`()>B`!`L
+M0D``%$``!9>B`!(``A+",$(``1````.N`A(\``(3PJX"$CR.`A(\C[\`((^Q
+M`!R/L``8`^``"">]`"@GO?_HK[\`%*^P`!`\`@``)$)):`!`^`D`@(`E`$`8
+M)20"`$@08@`P/`(``"AB`$D00``/-`*!C2AB`$(00``()`(`0RAB`$`00``G
+M/`(``!!@`!H``!`E$```*H^_`!008@`@`````!```"4``!`E`$,0*A1```TT
+M`H&/-`*!B`!B$"H00``8/`(``"AB`$T00``;```0)2AB`$H40``7/`(``!``
+M`!$D0EQ0%&(`$SP"```0```-)$)<4)8#`@HH8@&(%$``#@``$"4H8@&.%$``
+M!3P"```D`@&/%&(`!P`````\`@``)$)<4`!`^`D"`"`E$````X^_`!0``!`E
+MC[\`%(^P`!`#X``()[T`&">]_]BOOP`DK[(`(*^Q`!ROL``8`("0)3"Q__\"
+M0(`EC@(!H"0%`,$`0/@))Z8`$!!``"0\`@`````@)21%`)0\`@``)$8`ECP"
+M```D1P"8/`(``"1(32P`!!!``$00(0`"&$``91`AE$(``!11`!(DA``!)(3_
+M_Y>B`!`L0E`#$$```P!F$"$0```&E$(````$$$``1!`A``(00`!'$"&40@``
+MI@(""`$`^`D"0"`E$```!*8"`@HL@@`.%$#_YP`$$$"/OP`DC[(`((^Q`!R/
+ML``8`^``"">]`"@GO?_8K[\`)*^R`""OL0`<K[``&`"`D"4PL?__`D"`)8X"
+M`:`D!0#!`$#X"2>F`!`00``D/`(`````("4D10`@/`(``"1&`"(\`@``)$<`
+M)#P"```D2$TL``000`!$$"$``AA``&40(91"```440`2)(0``22$__^7H@`0
+M+$)0`Q!```,`9A`A$```!I1"````!!!``$00(0`"$$``1Q`AE$(``*8"`@@!
+M`/@)`D`@)1````2F`@(*+((`!Q1`_^<`!!!`C[\`)(^R`""/L0`<C[``&`/@
+M``@GO0`H)[W_X*^_`!BOL0`4K[``$`"`@"4\`@``)$)<Z`!`^`D"`(@E$$``
+M$X^_`!B.`@'D,$(``1!```\`````E@4""!"@``8\`@``)$)=^`!`^`D"`"`E
+M$```!X^_`!@\`@``)$)>U`(`("4`0/@)EB4""H^_`!B/L0`4C[``$`/@``@G
+MO0`@````````````````)[W_R#P"DD@T0OP`KZ(`$).C`!`GI0`0D*(``0`"
+M$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``8A@EC((`%*Q#0(`\`B22-$))
+M)*^B`!23HP`4)Z4`%)"B``$``A(``&(8)9"B``(``A0``&(8)9"B``,``A8`
+M`&(8)8R"`!2L0T"`/`(H`#1"`#FOH@`8DZ,`&">E`!B0H@`!``(2``!B&"60
+MH@`"``(4``!B&"60H@`#``(6``!B&"6,@@`4K$-`@#P"4Q8T0@@DKZ(`').C
+M`!PGI0`<D*(``0`"$@``8A@ED*(``@`"%```8A@ED*(``P`"%@``8A@EC((`
+M%*Q#0(`\`N68-$(%>:^B`""3HP`@)Z4`()"B``$``A(``&(8)9"B``(``A0`
+M`&(8)9"B``,``A8``&(8)8R"`!2L0T"`/`(`'31"[_^OH@`DDZ,`)">E`"20
+MH@`!``(2``!B&"60H@`"``(4``!B&"60H@`#``(6``!B&"6,@@`4K$-`@#P"
+M&JHT0KY`KZ(`*).C`"@GI0`HD*(``0`"$@``8A@ED*(``@`"%```8A@ED*(`
+M`P`"%@``8A@EC((`%*Q#0(`\`KX0-$)55*^B`"R3HP`L)Z4`+)"B``$``A(`
+M`&(8)9"B``(``A0``&(8)9"B``,``A8``&(8)8R"`!2L0T"`/`(`#C1",`>O
+MH@`PDZ,`,">E`#"0H@`!``(2``!B&"60H@`"``(4``!B&"60H@`#``(6``!B
+M&"6,@@`4K$-`@*^@`#23HP`T)Z4`-)"B``$``A(``&(8)9"B``(``A0``&(8
+M)9"B``,``A8``&(8)8R"`!2L0T"$`^``"">]`#@GO?_8K[\`((R"`!0T`X``
+M`$,0(20#'!:L0QC0```8)30&@``\!0`!C((`%`!&$"&L11B`)&,``2AB``@4
+M0/_Z`````(R"`!0T`X```$,0(8Q$'```!"8"``09`C"$``\`!"$`/`(``"1"
+M````9"`E`$#X"20%``B/OP`@`^``"">]`"@GO?^(K[\`<`"`8"4!@#@E)`+_
+MR:^B`!"OH@`4KZ(`&*^B`!PD`O_"KZ(`("0"__*OH@`HKZ(`+*^B`#"OH@`T
+M)`+_]*^B`#@D`O_`KZ(`0*^B`$2OH@!(KZ(`3"0"_[JOH@!0)`+_LJ^B`%BO
+MH@!<KZ(`8*^B`&0D`O^PKZ(`:```*"4GJP`0).8`!">J`"@GJ0!`)Z@`6``%
+M&(``9R`A`6,0(8Q"``"L@D8H`&8@(0%#$"&,0@``K()&.`!G("$!(Q`AC$(`
+M`*R"1E``9B`A`0,8(8QB``"L@D9@)*4``2BB``440/_L/`(``"1"```!@"`E
+M`$#X"20%``&/OP!P`^``"">]`'@`!2A``*8H(0`%*$``I"@A`^``")2B%?XG
+MO?_0K[\`**^U`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`@"4`P)`E`."8)8^T
+M`$`PM?__/!$``"8Q```\!0``)*4"$`(@^`DD!A)PKA(`#*X3`!"N%``4IA4!
+MR*8``<HD`@`_I@(!_*X``@"N`"^\K@`OP#P""`"N`B_,)`('@:X"+]2N`"_<
+M/`(`/S1"/S^N`B_@)`(`9*X"+^0D`@`"K@(OZ"0"__^N`B_XK@(O_*X",``F
+M!"P\/`4``"2E%)`"(/@))`8`!J(`,`2/OP`HC[4`)(^T`""/LP`<C[(`&(^Q
+M`!2/L``0`^``"">]`#`PA`#_,*4`_P``,"4\`@``)$D4F#P"```D2!29/`(`
+M`"1'%)H`!A!``$88(0!I$"&00@``%$0`"0!H$"&00@```*(0*Q1```4`9Q`A
+MD$,```!E&"L08``%)`(``23&``$LP@`$%$#_[P``$"4#X``(`````">]_X"O
+MOP!\K[8`>*^U`'2OM`!PK[,`;*^R`&BOL0!DK[``8`"@D"4`P)@E`."()8^V
+M`)`PD/__/`(``"1"````0/@))`1&J`!`H"46@``$`@`H)20#``(0``'DKL,`
+M`*^Q`!"OM@`4/`(``"1"```"@"`E`D`P)0!`^`D"8#@E`H"8)3P"```D0@``
+M`H`@)0``*"4`0/@))`8``1!``<LD$``#CF(`%(Q"0""OH@!,DZ,`3">D`$R0
+M@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"4P9`#_``01`JYB
+M`<PP8P`/IF,!T#P"```D0F58DF0!SP!`^`F290'1$$`!L200``T\`@``)$(`
+M``)@("4`0/@)```H)1!``:HD$``#CF(`%#0#@```0Q`AC$(8&*9B`=*.8P',
+M)`(`"1!B``<D`@`*%&(`"CP"``"68@'0+$(`!!!```8\`@``/`(``"1"8$``
+M0/@)`F`@)3P"```D0@```$#X"0)@("400`&1)!``#HYB`<PL0@`%%$``'@``
+M``".8@`4C$)`$*^B`%"3HP!0)Z0`4)""``$``A(``&(8)9""``(``A0``&(8
+M)9""``,``A8``&(8)31C$`"OHP!4DZ,`5">D`%20@@`!``(2``!B&"60@@`"
+M``(4``!B&"60@@`#``(6``!B&"6.8@`4K$-`$(YB`!0T`X```$,0(20#``>L
+M0Q@`/`(``"1"````0/@)`F`@):9B`=0P0P#P)`(`,!!B`#DH8@`Q$$``""0"
+M`&`D`@`0$&(`-"0"`"`08@`R`````!````V68@'4$&(`+BAB`&$00``&)`(`
+MH"0"`%`08@`I`````!````268@'4$&(`)0````"68@'4%$``(B0"``6.8P',
+M%&(`!SP"``F.8P'0-$(`0Q1B``,D`@!&$```&:9B`=2.8@',.$,`!RQC``$X
+M0@`++$(``0!B&"408``#)`(`41````^F8@'4CF,!S"0$``H09``))`(`"1!B
+M``@D`@!B%&0`#"0"``F68@'0+$(`!!!```4D`@`*)`(`8J9B`=2.8P',)`(`
+M"A!B`!0D`@`)CF,!S!!B`!$D`@`*%&(`!0````"68@'0+$(`!!1```P\`@``
+MEF,!U#!B`/`D0O_0+$(`0!!```8\`@``,&(`#RQ"``440`$3)!``#3P"```D
+M0@```F`@)20%`,$`0/@))Z8`2!!``0LD$``(EZ(`2"Q",`(40`$')!``!9>B
+M`$BF@A)PCF(`%(Q"0!"OH@!8DZ(`6#!$`!@`!"#")`(``A""``\D`@`#$((`
+M^B00``J.8P',)`(`"1!B``DD`@`*%&(`]`````"68@'0+$(`!!1```0\`@``
+M$```[@`````\`@``)$(```)@("4D!0`_`$#X"2>F`$@00`#F)!``")>B`$BF
+M@A)R/`(``"1"```"8"`E)`4`'`!`^`DGI@!($$``W)>B`$@00``.EZ(`2#!1
+M__``$8L`/`(``"1"```"8"`E)`4`&P!`^`DGI@!($$``T)>B`$@"(H@E$```
+M`B8Q_T`D$0-```"`)1(@``X``)`E/`(``"15```"8"`E)@4`P`*@^`DGI@!(
+M$$``P)>B`$@"0I`F)A```0(1$"L40/_W`F`@)30"__\60@"Y)!``!R0"``JF
+M@A/F)`(``Z:"%?```(`E)`0`-":&``8D`P`+<@0H`@"F$"&D0Q/H)A```2X"
+M``H40/_[<@0H`@``@"4\`@``)$L4@":(``(\`@``)$H4B"0)`#0FAP`,)`4`
+M"R:&``@`$!A``'0@(0!K$"&40@``I((5^`!H("$`:A@AE&(``*2"%?!R"1@"
+M`&<0(:1%%J@`9A@A)A```2X"``,40/_PI&46$#P"```D0@```F`@)0!`^`DF
+MA1)P$$``B"00``B6@A)P+$)0`Q!``!,D!``*CF,!S!!D``DD`@`)$&(`""0"
+M!F@49``,`````)9B`=`L0@`$$$``"``````D`@9HIH(6`"0"!+"F@A8$-`*`
+M`*:"%@BF@A7^EH(2BA!``"$D`P`0EF(!U#!"`/`40P`>/`(``(YB`!0T`X``
+M`$,0(20#0`>L0Q@`/`(``"1"````0/@))`0'T#P"```D0@```$#X"0)@("6F
+M8@'6CF(`%#0#@```0Q`A)`,`!ZQ#&``\`@``)$(```!`^`DD!`?0EF(!UC!"
+M`/`D`P`@%$,`3R00``T\`@``)$(```)@("4D!0"_`$#X"2>F`$@00`!')!``
+M")>B`$BF@A)TIF(""#P"```D0@```$#X"0)@("400``^)`0`"HYC`<P09``*
+M```H)20"``D08@`()!``#11D``8`````EF(!T"Q"``000``"`````"00``T0
+MH``O`````(Z"+,2N8@'`/`(``"1"````0/@)`F`@)0``D"4``(`E)!4`'SP"
+M```D40```F`@)0*P*","(/@))Z8`2!!``!N7H@!(`D*0(0`0&$``="`A``(2
+M`J""+#``@!@EDZ(`2:!B+#$F$``!+@(``Q1`__`"8"`E+D,``3P"``(T0O_]
+M`D(0)BQ"``$`8A@E%&``"B00``D\`@``)$)C2`!`^`D"8"`E$```#`)@$"40
+M```")!``""00``@2@``$/`(``"1"````0/@)`H`@)1+```(``!`EKM```(^_
+M`'R/M@!XC[4`=(^T`'"/LP!LC[(`:(^Q`&2/L`!@`^``"">]`(`GO?_HK[\`
+M%*^P`!`\`@``)$(```!`^`D`@(`EC@(LJ!!```,``````$#X"0(`("4\`@``
+M)$(```!`^`D"`"`E/`(``"1"```"`"`E)`4``0!`^`DD!@`!/`(``"1"```"
+M`"`E`$#X"28%$G`\`@``)$(```!`^`D"`"`EC[\`%(^P`!`#X``()[T`&">]
+M_Z"OOP!8`(!0)30"@`"OH@`0-`*8(*^B`!0\`E55-$)55:^B`"`\`JJJ-$*J
+MJJ^B`"0\`F9F-$)F9J^B`"@\`IF9-$*9F:^B`"P``&`E)[@`$">O`!@GK@!`
+M)ZT`5``,&(`#`Q`AC$0``"2"P``L0A``$$``(@'C*"&-0@`4`$00(8Q"``"O
+MH@!`DZ,`0)'"``$``A(``&(8)9'"``(``A0``&(8)9'"``,``A8`$```%@!B
+M$"6,0@``KZ(`5).D`%21H@`!``(2``""("61H@`"``(4``""("61H@`#``(6
+M``""("6-0@`4C&,```!#$"&L1```$```?R6,``&-0@`4`$00(8Q"``"LH@``
+M``!`)22"P``L21``)Z<`2">F`$0`"!0`%2``%0!(*"6-0@`4`$00(:Q%```1
+M(``?`````(U"`!0`1!`AC$(``*^B`$B3HP!(D.(``0`"$@``8A@ED.(``@`"
+M%```8A@ED.(``P`"%@`0```3`&(8):^E`$23HP!$D,(``0`"$@``8A@ED,(`
+M`@`"%```8A@ED,(``P`"%@``8A@EC4(`%`!$$"$0`/_AK$,``(U"`!0`1!`A
+MC$,``!1E`%,``!`E)0@``2D"`0`40/_3``@4````0"4GJP`@)(+``"Q)$``G
+MIP!0)Z8`3``($(`!8A`A%2``%8Q%``"-0@`4`$00(:Q%```1(``?`````(U"
+M`!0`1!`AC$(``*^B`%"3HP!0D.(``0`"$@``8A@ED.(``@`"%```8A@ED.(`
+M`P`"%@`0```3`&(8):^E`$R3HP!,D,(``0`"$@``8A@ED,(``@`"%```8A@E
+MD,(``P`"%@``8A@EC4(`%`!$$"$0`/_AK$,``(U"`!0`1!`AC$,``!2C`!T`
+M`!`E)0@``2D"``040/_2``@0@``,((`#!!@AC&(``"1"P``L0A``%$#_>@'D
+M$"$`@!@E`P,0(8U$`!2,0@```((@(0'C&"&,8@``K((``"6,``$I@@`"%$#_
+M60`,&(`\`@``)$(```!`^`DD!`!D)`(``8^_`%@#X``()[T`8#"E__\PH@$`
+M$$``!B0"$S.DP@``)`(7U*3B```#X``()`(``3"B`(`00``-`````)2"$HH4
+M0``%)`()")2"$HP00``'`````"0""0BDP@``)`(*K*3B```#X``()`(``0/@
+M``@``!`E)[W_T*^_`"BOLP`DK[(`(*^Q`!ROL``8`("0)0)`F"4"0(@EIZ``
+M$)9"$G`L0E`!%$``!R90`>".0@&@)`4`R0!`^`DGI@`0$$`!/H^_`"B60@'4
+M,$(`\"0#`$`40P`#EZ(`$*9@$H:7H@`0%$``"R0"``>.0P',%&(`""0"``B6
+M0P'0%&(`!20"``6GH@`0)`(``:9B$G:F8A)XCB,!W"0"``808@`0)`)P998C
+M`<H48@`-`````)8C`@@D8O^<+$(``A!```0D`@!!)&(`!1````6F(@((EB,"
+M"!1B``(D`@!#IB(""*X```268A*&$$``!B0"``&N`@`$EF(2=A1```(D`@`#
+MK@(`!)9B$HH00``$`````(X"``0T0@`$K@(`!)9B$HP00``,)`(.$98C`<H0
+M8@`*)`()"(X#``0T8@`(K@(`!)9B$G@40``$)`()"#1B`"BN`@`$)`()"*8"
+M`!"60@'4,$(`\"1"_]`L0@!`%$``%20""<2.1`',.(,`!RQC``$X@@`++$(`
+M`0!B&"448``-)`()Q"0#``H0@P`))`(`"1""``@D`@G$%(,`""0""JR60@'0
+M+$(`!!!```0D`@JL)`()Q!````*F`@`2I@(`$B0"$S.F`@`,)`(7U*8"``Z.
+M`@``/`/__31C__\`0Q`D/`,``0!#$"6N`@``EZ(`$#!"``(40``,```@)8Y#
+M`<PL8@`&$$``!R0"``448@`'``04@)9"`=`L0@`$%$```P`$%(`D!``!``04
+M@(X$````1!`F/`,`!`!#$"0`@B`F/`+_WS1"__\`@B`D/`(`$`""("67H@`0
+M``(00CA"``$P0@`!``(5@`!$$"8\`P!``$,0)`""(":N!```CD(!S"Q"``<4
+M0``%/`/_]SP"``@`@A`E$```!:X"``".`@``-&/__P!#$"2N`@``C@(``#P#
+M@```0Q`E/`-```!#$"6N`@``EB(!T"Q"``(00``%EZ(`$(Y#`<PD`@`+%&(`
+M*9>B`!`P0@`!%$``!```&"6.`@`$,$(`"0`"&"L``Q=`C@0```!$$"8\`R``
+M`$,0)`""(":7H@`0``(0PCA"``$P0@`!``(7``!$$"8\`Q```$,0)`""(":N
+M!```EZ(`$#!"``040``$```8)8X"``0P0@`)``(8*P`#'L".`@```&(8)CP$
+M"```9!@D`$,0)CP#!```0Q`E/`,!``!#$"6N`@``C@(``#P#_?\T8___`$,0
+M)*X"``".8A,X$$``!```&"6.8A,\%$```P`#%<`D`P`!``,5P(X#````0Q`F
+M/`0`@`!$$"0`8A@F-&/P`*X#``".(P',)`(`!11B``0D`@`(EB,!T!!B``4`
+M````CB(!S"Q"``840``%EZ(`$(X"```T0@@`K@(``)>B`!`P0@'P$$```P`"
+M$0(0```#I@(`""0"``JF`@`(EZ(`$#!"\``00``%``(;`B0"``$`8A`$$```
+M`Z8"``HD`@"`I@(`"I9"`=0P0@#P)$+_T"Q"`$`00``%)`/[_XX"```T0@8`
+M$```!JX"``".`@```$,0)"0#_?\`0Q`DK@(``)9B$GH00``+`D`@)8Y"`:`D
+M!0`/`$#X"28F$D@00``%)`(``:XB$DR.`@``-$(!`*X"``".0@',+$(`!:XB
+M$FB.0P',)`(`!11B``4``"`EED,!T"0"``D08@`%`````(Y"`<PL0@`&%$``
+M`P`$$<`D!``!``01P(X#````0Q`F,$(`@`!B&":N`P``)`(`#ZX"`!0D`@`!
+MC[\`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`,">]_^"OOP`8/`(``"1"````
+M0/@))Z4`$"0"``&/OP`8`^``"">]`"`D`@`!%*(`!3P"```\`@``)$(```/@
+M``BL@@!P)$)W5`/@``BL@@!P````````````````)[W_P*^_`#ROL@`XK[$`
+M-*^P`#``@(`E`*"()8X"`!0T`X```$,0(8XC``2L0P`HC@(`%#0#@```0Q`A
+MCB,`#*Q#`"R.`@`4-`.```!#$"&.(P`0K$,`,(X"`!0T`X```$,0(8XC``BL
+M0P`TCB(``#P2`0``4A`D$$``#3P"```D0@```$#X"2>E`!".`A(T```@)0``
+M*"6L1``HK$4`+(X"`!0T`X```$,0(:Q2`"".`@`4-`.```!#$"&.(P``K$,`
+M((^_`#R/L@`XC[$`-(^P`#`#X``()[T`0">]_]"OOP`HKZ4`%(R#`=PD`@`!
+M$&(`"30"__\08``-/`(``"0"``808@`))`(`"!1B`!(DH@`!-`+__Z^B`!P\
+M`@`'-$+__Q````NOH@`@/`(``(Q"````HA`C``(0P*^B`!P\`@``C$(```"B
+M$",``A#`KZ(`("2B``&OH@`8/`(!@#1"__\`PA`DKZ(`$#P"```D0@```$#X
+M"2>E`!"/OP`H`^``"">]`#`GO?_PC((`%#0#@```0Q`AK$``*(R%`!0T`H``
+M`*(H(8RB``0\`P`$`$,0)3P#_\\T8___`$,0)*RB``2,@@`4-`.```!#$"$T
+M`___K$,`(`/@``@GO0`0)[W_\`"`0"64H@`2$$``&@$`."6-!``4-`*```""
+M("&,@@`$/`,`$`!#$"6L@@`$C0(`%#0#@```0Q`AE*,`$*Q#`"2-`@`4-`.`
+M``!#$"&4HP`2K$,`.(T#`!0T`H```&(8(8RB`!0``A#`K&(`,!````J-`@`4
+MC00`%#0"@```@B`AC((`!#P#_^\T8___`$,0)*R"``2-`@`4-`.```!#$"&,
+MHP``K$,`*(T#`!0T`H```&(P(8S"`"`\`_^``$,0))2C``H`0R`EE*(`&!!`
+M``4D0@`$``(4`#P#`'\`0Q`D`((@):S$`"",Y"_4/`+__S1"`/\`@B`DE*(`
+M&@`"$@`P0O\``((@):SD+]2-`@`4-`.```!#$"&L1``8E*<`"HRC`!P`XQ`K
+M.$(```!B.`N,I@`,`,,0*SA"````8C`+%.8``P`````0```"C*D`!(RI``",
+MH@`$C00`%#0#@```@R`A)$+__0`"$,`\`P`'-&/__P!#$"0\`PH8`$,0):R"
+M`-2-!``4-`*```""("$E(O_]``(0P#P#``<T8___`$,0)#P#"@``0Q`EK((`
+MV(T$`!0T`H```((@(3#B__\`!AP``$,0):R"`-P#X``()[T`$```````````
+M)[W_T*^_`"BOL0`DK[``(`"`@"4`P(@EC@(`%*Q%8`".`P`4)`(``:QB8`@\
+M`@``)$(``"0%8`PD!@`#`$#X"20'``(00``&C[\`*(X"`!2,0F`$IB(``"0"
+M``&/OP`HC[$`)(^P`"`#X``()[T`,">]_\B,A@`4C,)`%*^B`#"3HP`P)Z0`
+M,)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)0`%*$`D`@`#
+M`*(0!`!B&"6OHP`TDZ,`-">D`#20@@`!``(2``!B&"60@@`"``(4``!B&"60
+M@@`#``(6``!B&"6LPT`4)`(``0/@``@GO0`X)[W_R(R&`!2,PD`4KZ(`,).C
+M`#`GI``PD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E``4H
+M0"0"``,`HA`$``(0)P!B&"2OHP`TDZ,`-">D`#20@@`!``(2``!B&"60@@`"
+M``(4``!B&"60@@`#``(6``!B&"6LPT`4)`(``0/@``@GO0`X)[W_Z(R'`!2,
+MXD`8KZ(`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"
+M%@``8A@E)`(``0"B$`0``A`G`&(8)##&``$`IC`$`&88):^C`!23HP`4)Z0`
+M%)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):SC0!@D`@`!
+M`^``"">]`!@LH@`&$$``"2>]_^B,@@`4C$)`'*^B`!"3H@`0,$(`+P"B$`80
+M```",$(``20"__\#X``()[T`&">]_]"OOP`H`(`X)8SB`!2,0D`4KZ(`().C
+M`"`GI``@D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8B`E``40
+M0"0#``,`0Q@$/`(``31"\```0Q`G`((@)``%*P``A2`E$,```S2$@``\`@`!
+M`((@):^D`"23HP`D)Z0`))""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8)8SB`!2L0T`4C.,L1#P%`0`\`@``)$(```#@("4`0/@)`&4H)8^_
+M`"@#X``()[T`,````````````````">]_^B,@@`4C$)`"*^B`!"3H@`0)Z0`
+M$)"#``$``QH``$,0)9"#``(``QP``$,0)9"#``,``QX``$,0)3A"``$L0@`!
+M`^``"">]`!@`@$`E`*`X)0``2"4!`%`EC0,`%(QF`(`\`@"``,(0)!!``!8`
+M````C&0`C#P"`0``@A`D/`,`(#A"````8D@+/`(@``""$"000``"/`(`0`$B
+M2"4\`@0``((0)!!```(\`@"``2)()3P#`@``@Q`D`2,8)3A"````8D@+C0(`
+M%(Q&`,`D`O__%,(``P``$"4#X``(K.```#P"`04T0MBZ`,(8)#P"``@`PA`D
+M$$``!*SC```\`D```&(0):SB```PP@`%$$``!3#"!<",X@``-$(``:SB```P
+MP@7`$$``%S#"`"",X@``-$(`0*SB``"-`@`4C$,`Q#!D`_^-0D:@`((@)3P%
+M`_\`91@D``,<`@!D&"6M0T:@C0(`%(Q"`,@P1`/_`(,@)0!%$"0``A0"`$00
+M):U"1J`PP@`@$$``!P````"-`A)H$$``!#P#0`",X@```$,0):SB``",X@``
+M`2(0):SB```\`T```$,0)!!```T`````K0824(T#`!2,8@#$K0(25(QB`,BM
+M`A)8C&(`S*T"$ER,8@#0K0(28(QB`-2M`A)D`^``""0"``$#X``(C((L1">]
+M__``@$`EC0DL1`4A``4!`#@EC0(`%*Q``"2-`@`4C$(`)#P"`04T0MBZ`*(@
+M)#"B`$`00``-```P)8SC+,PT@@!``$,@"XSC+-`T@@$``$,@"XSC+-0T@@"`
+M`$,@"XSC+-@T@@0``$,@"S"C``$T@@`'`$,@"SP"`N``HA`D$$``%CP"`(``
+M@B`E/`(`(`"B$"000``"/`(!``#","4\`@!``*(0)!!```(\`B```,(P)3P"
+M`(``HA`D$$```CP"!```PC`E/`,"``"C$"0`PQ@E.$(```!B,`L\`D```*(0
+M)!!```(\`@`(`((@)8T"`!2L1`"@C00`%(R"`*P\`TC_-&/__P!#$"0`1A`E
+MK((`K`2A``2LY2Q$C0,`%"0"``&L8@`D`2`0)0/@``@GO0`0```````````#
+MX``(E((!ZC"C__^4@@'J`&(0*Q!``"`GO?_H``,I0"2B2!PL0A``$$``$P`#
+M&4",@@`4`*(0(30#B!P`0Q`AC$(``*^B`!"3HP`0)Z0`$)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8`$```!@!B$"6,@@`4`&(8(30"B!P`8A@A
+MC&(``#!#@``48``")`(``0``$"4#X``()[T`&">]_[@`@#@E,*7__Y3C`>H`
+MHQ@K$&`!A0``$"4`!1E`)&)(%"Q"$``00`#L`````(SB`!0`8A`A-`.(%`!#
+M$"&,0@``KZ(`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@`0``#?`&)`):^@`!23I``4D&(``0`"$@``@B`ED&(``@`"%```@B`E
+MD&(``P`"%@``@B`EC.(`%`#"$"$T`X@``$,0(:Q$```0``#9``4Q0*^@`!B3
+MI``8D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`EC.(`%`#"
+M$"$T`X@$`$,0(:Q$```0``#2``4Q0*^@`!R3I``<D&(``0`"$@``@B`ED&(`
+M`@`"%```@B`ED&(``P`"%@``@B`EC.(`%`#"$"$T`X@(`$,0(:Q$```0``#+
+M``4Q0*^@`""3I``@D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`EC.(`%`#"$"$T`X@,`$,0(:Q$```0``#$``4Q0*^@`"23I``DD&(``0`"
+M$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`EC.(`%`#"$"$T`X@0`$,0
+M(:Q$```0``"]``4Q0*^B`"B3I``H)Z,`*)!B``$``A(``((@)9!B``(``A0`
+M`((@)9!B``,``A8``((@)8SB`!0`PA`A-`.(%`!#$"&L1```$```M@`%,4"O
+MH``LDZ0`+)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8SB
+M`!0`PA`A-`.(&`!#$"&L1```$```KP`%,4"OH``PDZ0`,)!B``$``A(``((@
+M)9!B``(``A0``((@)9!B``,``A8``((@)8SB`!0`PA`A-`.('`!#$"&L1```
+M$```J"0"``2OH``TDZ0`-)!B``$``A(``((@)9!B``(``A0``((@)9!B``,`
+M`A8``((@)8SB`!0`PA`A-`.(``!#$"&L1```$```J@`%,4"OH``XDZ0`.)!B
+M``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8SB`!0`PA`A-`.(
+M!`!#$"&L1```$```HP`%,4"OH``\DZ0`/)!B``$``A(``((@)9!B``(``A0`
+M`((@)9!B``,``A8``((@)8SB`!0`PA`A-`.("`!#$"&L1```$```G``%,4"O
+MH`!`DZ0`0)!B``$``A(``((@)9!B``(``A0``((@)9!B``,``A8``((@)8SB
+M`!0`PA`A-`.(#`!#$"&L1```$```E20"``&,X@`4`&(8(30"B!0`8A@AC&@`
+M```%,4`DPD@`+$(0`!1`_QXGHP`4C.(`%`#`&"4`8A@A-`*(``!B&"&L8```
+M``4Q0"3"2`0L0A``%$#_)2>C`!B,X@`4`,`8)0!B&"$T`H@$`&(8(:Q@````
+M!3%`),)(""Q"$``40/\L)Z,`'(SB`!0`P!@E`&(8(30"B`@`8A@AK&`````%
+M,4`DPD@,+$(0`!1`_S,GHP`@C.(`%`#`&"4`8A@A-`*(#`!B&"&L8`````4Q
+M0"3"2!`L0A``%$#_.B>C`"2,X@`4`,`8)0!B&"$T`H@0`&(8(:Q@````!3%`
+M),)(%"Q"$``40/]!)`(`!XSC`!0`P!`E`$,0(30#B!0`0Q`A)`,`!ZQ#````
+M!3%`),)(&"Q"$``40/]()Z,`+(SB`!0`P!@E`&(8(30"B!@`8A@AK&`````%
+M,4`DPD@<+$(0`!1`_T\GHP`PC.(`%`#`&"4`8A@A-`*('`!B&"&L8```)`(`
+M!!4"`#0D`@`!C.(OS#P#"```0Q`D$$``+B2B`$`P1?__``4Q0"3"2``L0A``
+M%$#_32>C`#2,X@`4`,`8)0!B&"$T`H@``&(8(:Q@````!3%`),)(!"Q"$``4
+M0/]4)Z,`.(SB`!0`P!@E`&(8(30"B`0`8A@AK&`````%,4`DPD@(+$(0`!1`
+M_ULGHP`\C.(`%`#`&"4`8A@A-`*("`!B&"&L8`````4Q0"3"2`PL0A``%$#_
+M8B>C`$",X@`4`,`8)0!B&"$T`H@,`&(8(:Q@```D`@`!`^``"">]`$@GO?_H
+M`(!`)3"E__^5`P'J`*,8*Q!@`%4``!`E$,``.0````"0QP`%``<Z`)#"``0`
+MXC@ED,0``P`$)@"0P@`"``(4``""("60P@`!``(2``""("60P@```((@)0`$
+M($(`!Q?``((@)1```"@`!SA"KZ0`$).D`!"08@`!``(2``""("608@`"``(4
+M``""("608@`#``(6``""("6-`@`4`,(0(30#B!@`0Q`AK$0``!```"(`!3%`
+MKZ(`%).D`!0GHP`4D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`EC0(`%`#"$"$T`X@<`$,0(:Q$```0```;)`(``0``."4``"`E``4Q0"3"
+M2!@L0A``%$#_U2>C`!"-`@`4`,`8)0!B&"$T`H@8`&(8(:QD````!3%`),)(
+M'"Q"$``40/_<-.*``(T#`!0`P!`E`$,0(30#B!P`0Q`A-..``*Q#```D`@`!
+M`^``"">]`!@GO?]HK[\`E*^V`)"OM0",K[0`B*^S`(2OL@"`K[$`?*^P`'@`
+M@)`E`,"`)0#@,"6/HP"H,+'__P)`L"4F1`'@/`*JJC1"JJH`0$@E``-("I9#
+M`>H"(Q@K$&`#+```$"62`P``+&(`!A!``R@``!`E/`(``"1"%+```QB``&(8
+M(8QB````0``(`````!```)4D"P`%C(,``#P"``0`8A@D$&`#&@``$"40``".
+M)`L`!HY"+\P\`P@``$,0)!!``(DD"P`$)B(`0)2#``H`0Q`J%$``A```$"40
+M``,-C[\`E)8#``(L8P`%%&`#"```$"66`@`"+$(`!A1``'H``%@EE@(``BQ"
+M``XD!``#)`,``0!@6"40``!S`()8"A```'$D"P`'$``"^0``$"6OH@`@DZ0`
+M(">C`""08@`!``(2``""("608@`"``(4``""("608@`#``(6``""("6.0@`4
+M`2(0(30#B```0Q`AK$0``!```*(`$4E`KZ(`)).D`"0GHP`DD&(``0`"$@``
+M@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$B$"$T`X@$`$,0(:Q$
+M```0``";`!%)0*^H`"B3I``HD&(``0`"$@``@B`ED&(``@`"%```@B`ED&(`
+M`P`"%@``@B`ECD(`%`$B$"$T`X@(`$,0(:Q$```0``"4`!%!0*^J`"R3I``L
+MD&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$"$"$T
+M`X@,`$,0(:Q$```0``"-`!%!0*^E`#"3I``PD&(``0`"$@``@B`ED&(``@`"
+M%```@B`ED&(``P`"%@``@B`ECD(`%`$"$"$T`X@0`$,0(:Q$```0``"&`!$I
+M0*^K`#23I``TD&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`E
+MCD(`%`"B$"$T`X@4`$,0(:Q$```0``!_/`(``)(4``22`@`%``(2``*"H"62
+M`@`&``(4``*"H"62`@`'``(6``*"H"4"B:`FD@,`")("``D``A(``&*H)0*I
+MJ"8RM?__D@@`"I("``L``A(``0)`)9("``P``A0``0)`)9("``T``A8``0)`
+M)0$)0":2`P`.D@(`#P`"$@``8E`E`4E0)I(%`!"2`@`1``(2``"B*"62`@`2
+M``(4``"B*"62`@`3``(6``"B*"4`J2@FE@(``BQ"``XPHP#_`&(H"R0"``05
+M8@(0,4K__XY"+\P\`P@``$,0)!!``@LF(@!`,%/__P`124`E(D@`+$(0`!1`
+M_U4`%!`GCD,`%`$@$"4`0Q`A-`.(``!#$"$`%!@GK$,````124`E(D@$+$(0
+M`!1`_UP`%1`GCD,`%`$@$"4`0Q`A-`.(!`!#$"$`%1@GK$,````124`E(D@(
+M+$(0`!1`_V,GHP`HCD(`%`$@&"4`8A@A-`*("`!B&"&L:````!%!0"4"2`PL
+M0A``%$#_:B>C`"R.0@`4`0`8)0!B&"$T`H@,`&(8(:QJ````$4%`)0)($"Q"
+M$``40/]Q)Z,`,(Y"`!0!`!@E`&(8(30"B!``8A@AK&4````1*4`DHD@4+$(0
+M`!1`_W@GHP`TCD(`%`"@&"4`8A@A-`*(%`!B&"&L:P``/`(``"1"```"0"`E
+M`$#X"0(@*"62!``4D@(`%0`"$@``@B`ED@(`%@`"%```@B`ED@(`%P`"%@``
+M@B`ED@4`&)("`!D``A(``*(H)9("`!H``A0``*(H)9("`!L``A8``*(H)8["
+M+]`P0@`$$$`!-0````"2`P`>D@(`'P`"$@``8D`ED@,`')("`!T``A(``&)(
+M)9(&`""2`@`A``(2``#","62`@`B``(4``#","62`@`C``(6`!```24`PC`E
+MKZ0`.).D`#B08@`!``(2``""("608@`"``(4``""("608@`#``(6``""("6.
+M0@`4`.(0(30#B```0Q`AK$0``!```1\`$SE`KZ@`/).D`#R08@`!``(2``""
+M("608@`"``(4``""("608@`#``(6``""("6.0@`4`.(0(30#B`0`0Q`AK$0`
+M`!```1@`$SE`KZ4`0).D`$"08@`!``(2``""("608@`"``(4``""("608@`#
+M``(6``""("6.0@`4`.(0(30#B`@`0Q`AK$0``!```1$`$RE`KZD`1).D`$20
+M8@`!``(2``""("608@`"``(4``""("608@`#``(6``""("6.0@`4`*(0(30#
+MB`P`0Q`AK$0``!```0H`$RE`KZ8`2).D`$B08@`!``(2``""("608@`"``(4
+M``""("608@`#``(6``""("6.0@`4`*(0(30#B!``0Q`AK$0``!```0,`$RE`
+MKZ(`3).D`$PGHP!,D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`ECD(`%`"B$"$T`X@4`$,0(:Q$```0``#\`!,I0*^@`%"3I`!0D&(``0`"
+M$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`"B$"$T`X@8`$,0
+M(:Q$```0``#U`!,I0*^@`%23I`!4D&(``0`"$@``@B`ED&(``@`"%```@B`E
+MD&(``P`"%@``@B`ECD(`%`"B$"$T`X@<`$,0(:Q$```0``#N`!$I0*^T`%B3
+MI`!8D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`"B
+M$"$T`X@``$,0(:Q$```0``#G`!$I0*^U`%R3I`!<D&(``0`"$@``@B`ED&(`
+M`@`"%```@B`ED&(``P`"%@``@B`ECD(`%`"B$"$T`X@$`$,0(:Q$```0``$I
+M)`(``:^T`&"3I`!@D&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`ECD(`%`$B$"$T`X@``$,0(:Q$```0``#;`!%)0*^U`&23I`!DD&(``0`"
+M$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$B$"$T`X@$`$,0
+M(:Q$```0``#4`!%)0*^H`&B3I`!HD&(``0`"$@``@B`ED&(``@`"%```@B`E
+MD&(``P`"%@``@B`ECD(`%`$B$"$T`X@(`$,0(:Q$```0``#-`!%!0*^J`&R3
+MI`!LD&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$"
+M$"$T`X@,`$,0(:Q$```0``#&`!%!0*^E`'"3I`!PD&(``0`"$@``@B`ED&(`
+M`@`"%```@B`ED&(``P`"%@``@B`ECD(`%`$"$"$T`X@0`$,0(:Q$```0``"_
+M`!$I0*^K`'23I`!TD&(``0`"$@``@B`ED&(``@`"%```@B`ED&(``P`"%@``
+M@B`ECD(`%`"B$"$T`X@4`$,0(:Q$```0``"X/`(`````,"4``$@E``!`)0`3
+M.4`DXD@`+$(0`!1`_M@GHP`XCD(`%`#@&"4`8A@A-`*(``!B&"&L9````!,Y
+M0"3B2`0L0A``%$#^WR>C`#R.0@`4`.`8)0!B&"$T`H@$`&(8(:QH````$SE`
+M).)(""Q"$``40/[F)Z,`0(Y"`!0`X!@E`&(8(30"B`@`8A@AK&4````3*4`D
+MHD@,+$(0`!1`_NTGHP!$CD(`%`"@&"4`8A@A-`*(#`!B&"&L:0```!,I0"2B
+M2!`L0A``%$#^]">C`$B.0@`4`*`8)0!B&"$T`H@0`&(8(:QF````$RE`)*)(
+M%"Q"$``40/[[)`(`!XY#`!0`H!`E`$,0(30#B!0`0Q`A)`,`!ZQ#````$RE`
+M)*)(&"Q"$``40/\")Z,`4(Y"`!0`H!@E`&(8(30"B!@`8A@AK&`````3*4`D
+MHD@<+$(0`!1`_PDGHP!4CD(`%`"@&"4`8A@A-`*('`!B&"&L8````!$I0"2B
+M2``L0A``%$#_$">C`%B.0@`4`*`8)0!B&"$T`H@``&(8(:QT````$2E`)*)(
+M!"Q"$``40/\7)Z,`7(Y"`!0`H!@E`&(8(30"B`0`8A@AK'4``!```$DD`@`!
+M`!%)0"4B2``L0A``%$#_'">C`&".0@`4`2`8)0!B&"$T`H@``&(8(:QT````
+M$4E`)2)(!"Q"$``40/\C)Z,`9(Y"`!0!(!@E`&(8(30"B`0`8A@AK'4````1
+M24`E(D@(+$(0`!1`_RHGHP!HCD(`%`$@&"4`8A@A-`*("`!B&"&L:````!%!
+M0"4"2`PL0A``%$#_,2>C`&R.0@`4`0`8)0!B&"$T`H@,`&(8(:QJ````$4%`
+M)0)($"Q"$``40/\X)Z,`<(Y"`!0!`!@E`&(8(30"B!``8A@AK&4````1*4`D
+MHD@4+$(0`!1`_S\GHP!TCD(`%`"@&"4`8A@A-`*(%`!B&"&L:P``/`(``"1"
+M```"0"`E`$#X"0(@*"4D`@`!C[\`E(^V`)"/M0",C[0`B(^S`(2/L@"`C[$`
+M?(^P`'@#X``()[T`F">]_^BOOP`0)(,L,#P"```D0@```*`@)0!@*"4`0/@)
+M)`8`!H^_`!`#X``()[T`&">]_^BOOP`0/`(``"1"```DA"PP`$#X"20&``8D
+M`@`!C[\`$`/@``@GO0`8)[W_Z*^_`!`D@RP\/`(``"1"````H"`E`&`H)0!`
+M^`DD!@`&C[\`$`/@``@GO0`8)[W_T*^_`"BOL0`DK[``(`"`B"4"((`E/`(`
+M`"1"```F!"P\`$#X"20&``:.!``4-`*```""("&2`RP\D@(L/0`"$@``8A@E
+MD@(L/@`"%```8A@ED@(L/P`"%@``8A@EK(,`X(XD`!0T`H```((@(9(#+$"2
+M`BQ!``(2``!B&"6L@P#D)`(``8^_`"B/L0`DC[``(`/@``@GO0`P,*7__Y2"
+M`@@010`&)`,`#)2"$G(P0@"`)`0``R0#``L`@A@*$,```@````"LPP```^``
+M"```$"4`@#`EE((2AA!```4``"@E)`4``92#$G8D`@!#`$,H"I2"$HHTHP`$
+M`&(H"Y2"$HP00``)`````)3#`<HD`@X1$&(`!0`````TI0`(E(,2>#2B`"``
+M0R@*`^``"`"@$"4GO?_0K[\`+*^R`"BOL0`DK[``(`"`B"66,!)(,A(`'``2
+MD((R$``"`!"`*XXB`:P`0/@)`D`H)8XC`!0T`H```&(8(8QB&``T0B``K&(8
+M`(XB`;`"("`E`$#X"0)`*"4N!@`!`%`0)@(",`N.(@&X`B`@)0!`^`D"0"@E
+MC[\`+(^R`"B/L0`DC[``(`/@``@GO0`P)[W_R(R&`!2,PD`0KZ(`,).C`#`G
+MI``PD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E/`+_\31"
+M_Y\`8A@D/`(``"1"%-`PI0`'``4H@`"B*"&,H@```&(8):^C`#23HP`T)Z0`
+M-)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):S#0!`#X``(
+M)[T`.">]_]"OOP`LK[(`**^Q`"2OL``@`("0)3#1__\"0(`E/`(``"1"```F
+M!"PV`$#X"20&``:.!``4-`*```""("&2`RPVD@(L-P`"$@``8A@ED@(L.``"
+M%```8A@ED@(L.0`"%@``8A@EK(,`"(Y$`!0T`H```((@(9(#+#J2`BP[``(2
+M``!B&"4R,3__`!&,``!Q&"6L@P`,C[\`+(^R`"B/L0`DC[``(`/@``@GO0`P
+MC(0`%#0"@```@B`AC(8`3(R"`%",A`!,`(8P*P!&$"$`0!@E```0)0`#$```
+M`!@E`(`H)0``("4`1!`E`^``"`!E&"6,@@`4-`.```!#$"&,0@!,`^``"```
+M```GO?_PC(,`%#0"@```8A@AC&4`(#P"`0``HA`EK&(`((R#`!0T`H```&(8
+M(3P"`0``HB@EK&4`(`/@``@GO0`0C((2-!!``"DGO?_PE$(``C!"`"`00``E
+M```X)8RB```00``.```P)22H``0`0"@E`0<0(9!#```P8@"`$$```S!C`'\`
+M9A`K`&(P"B3G``$`Y1`K%$#_]P$'$"&,@P`4-`*```!B&"&,90`$$,``"``&
+M$$(P0@#_+$(``Q!```0\`@(``*(0)1````BL8@`$C(,`%#0"@```8A@A/`+]
+M_S1"__\`HA`DK&(`!`/@``@GO0`0C((`%#0#@```0Q`AC$(89``"+,(PI0'_
+M,*(!`!!```,`````.*4!_P`%*">,@P`4-`*```!B&"&,8@!0C&,`3`!#$"8#
+MX``(`$40)B>]_^@`@#`EC,(`%(Q"0""OH@`0DZ,`$">D`!"0@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"4P9`#_``0A`C!C``^,P@',%$0`
+M!```*"64P@'0`$,0)BQ%``$`H!`E`^``"">]`!B,@P`4-`:```!F&"&,H@``
+MC&,`D`!#$"&LH@``C((`%`!&$"&,HP`$C$(`C`!B&"&LHP`$C((`%`!&$"&,
+MHP`,C$(`E`!B&"&LHP`,C((`%`!&$"&,HP`(C$(`B`!B&"&LHP`(C((`%`!&
+M$"&,HP`0C$(`F`!B&"$#X``(K*,`$`/@``@D`@`!C((`%#0#@```0Q`AC$(<
+M'`/@``@P0@#_C((`%#0#@```0Q`AC$(`6`/@``@P0@`')[W_\(R"`!0T`X``
+M`$,0(3"E``>L10!8`^``"">]`!`#X``(C((OO">]_^BOOP`0C(82-!3```,D
+M`@`!$```!:R%+[P\`@``)$(```!`^`D`````C[\`$`/@``@GO0`8`^``""0"
+M``$GO?_0K[\`+*^R`"BOL0`DK[``(`"`B"4`H(`E+@(`!A1```@"()`E/`(`
+M`"1"````0/@)-`7__P!0$"L00``%`B`@)20"__^N0B_X$```"0``$"4\`@``
+M)$(```!`^`D"`"@ECB,`%*QB$'"N4"_X)`(``8^_`"R/L@`HC[$`)(^P`"`#
+MX``()[T`,">]_^BOOP`0C((`%(Q%$'`\`@``)$(```!`^`DPI?__C[\`$`/@
+M``@GO0`8)[W_T*^_`"ROL@`HK[$`)*^P`"``@(`E`*"()0(`D"4\`@``)$(`
+M``!`^`DD!3__`%$0*Q!```4"`"`E)`+__ZY"+_P0```0```0)3P"```D0@``
+M`$#X"0(@*"6.!0`4-`.```"C*"&,HP`4)`3```!D&"0P0C__`&(8):RC`!2N
+M42_\)`(``8^_`"R/L@`HC[$`)(^P`"`#X``()[T`,">]_^BOOP`0C((`%#0#
+M@```0Q`AC$4`%#P"```D0@```$#X"3"E/_^/OP`0`^``"">]`!B0@B_,.$(`
+M`0/@``@P0@`!)[W_\!"@``T`@#`EC,0`%#0"@```@B`AC((`!#P#_O\T8___
+M`$,0)*R"``2,PB_,`$,0)!````NLPB_,C(0`%#0"@```@B`AC((`!#P#`0``
+M0Q`EK((`!(S"+\P`0Q`EK,(OS"0"``$#X``()[T`$">]_]"OOP`LK[(`**^Q
+M`"2OL``@`("`)0"@B"4"`)`E/`(``"1"````0/@))`4__P!1$"L00``%`@`@
+M)20"__^N0C``$```$P``$"4\`@``)$(```!`^`D"("@EC@4`%#0#@```HR@A
+MC*0`%#P#P``T8___`(,@)``"%``\`S__`$,0)`""("6LI``4KE$P`"0"``&/
+MOP`LC[(`*(^Q`"2/L``@`^``"">]`#`GO?_HK[\`$(R"`!0T`X```$,0(8Q%
+M`!0`!2P"/`(``"1"````0/@),*4__X^_`!`#X``()[T`&">]__`PI?__`(`X
+M)2RC`(`08``))`(`#(R"`!2L100`C(,`%``&$"NL8@0$`*<0(:!&+S@``!`E
+M`^``"">]`!`GO?_0K[\`**^Q`"2OL``@`("()3"P`/\0P`!`HC`2.#("`/\0
+M0``])`,!0(XB$C240@`",$(!0!1#`#@\`@``)$(```!`^`DD!0`!`$`H)8XB
+M$C240@`",$)``!!```H`!1A"<@,@`@`$$$``@B`A)(0!!'(#,`(`1A`A``(0
+M0!```!<D1@VLCB(2-)1"``(P0H``$$``"@`%&()R`R`"``000`""("$DA`#2
+M<@,P`@!&$"$``A!`$```"21&#4AR!2`"``000`""("$DA`%H<@4P`@!&$"$`
+M`A!`)$8.8'(%&`(``Q!``&(8(21C`^@P8S__CB(`%*Q$$'".(@`4K$80L(XD
+M`!0T`H```((@(0`#%```0Q`EK((`%(^_`"B/L0`DC[``(`/@``@GO0`P)[W_
+MZ*^_`!`\`@``)$(```!`^`F,A0'<C[\`$`/@``@GO0`8`(`P)20#``80HP`'
+M```0)9#"$I,00``#```@)8S"+^@L1``"`(`0)0/@``@`````)[W_D*^_`&RO
+ML`!H/`(``"1"````0/@)`("`)1!``*TT`X``C@(`%`!#$"$D`P`?K$,8<(X%
+M`!0T`H```*(H(98"`=0P0@#P)$+_T"Q"`$`D`P`8)`0`%`""&`NLHQGXC@0`
+M%#0"@```@B`AC((`'"0#P'\`0Q`D-$(`@*R"`!R.`@`4-`.```!#$"$D`P`]
+MK$,!!(X%`!2,HD`0KZ(`0).C`$`GI`!`D((``0`"$@``8A@ED((``@`"%```
+M8A@ED((``P`"%@``8A@E-&,``J^C`$23HP!$)Z0`1)""``$``A(``&(8)9""
+M``(``A0``&(8)9""``,``A8``&(8):RC0!".!`',.(,`!RQC``$X@@`++$(`
+M`0!B&"448``,`````"0#``H0@P`))`(`"1""``<`````%(,`,`````"6`@'0
+M+$(`!!!``"P`````C@(`%#0#@```0Q`A)`,`)JQ#&'2.`@`4-`.```!#$"$D
+M`P`-K$,8>(X"`!0T`X```$,0(20#``>L0QGPC@(`%#0#@```0Q`A)`,`/ZQ#
+M&?2.!0`4C*)`$*^B`$B3HP!()Z0`2)""``$``A(``&(8)9""``(``A0``&(8
+M)9""``,``A8``&(8)3P"_/\T0O__`&(8)#P"`@``8A@EKZ,`3).C`$P0```K
+M)Z0`3(X"`!0T`X```$,0(20#``JL0QATC@(`%#0#@```0Q`A)`,`#*Q#&'B.
+M`@`4-`.```!#$"$D`P`#K$,9\(X"`!0T`X```$,0(20#`""L0QGTC@4`%(RB
+M0!"OH@!0DZ,`4">D`%"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6
+M``!B&"4\`OS_-$+__P!B&"0\`@,``&(8):^C`%23HP!4)Z0`5)""``$``A(`
+M`&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC0!`0``!OC[\`;(X%`!2,
+MHD`0KZ(`6).C`%@GI`!8D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"
+M%@``8A@E/`+\_S1"__\`8A@DKZ,`7).C`%PGI`!<D((``0`"$@``8A@ED((`
+M`@`"%```8A@ED((``P`"%@``8A@EK*-`$(X%`!2,HD`0KZ(`8).C`&`GI`!@
+MD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E)`+__0!B&"2O
+MHP!DDZ,`9">D`&20@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B
+M&"6LHT`0C@(`%#0#@```0Q`A)`,`'ZQ#&'".`@`4-`.```!#$"$D`P!_K$,8
+M=(X"`!0T`X```$,0(20#``ZL0QAXC@(`%#0#@```0Q`A)`,`#*Q#&?".`@`4
+M-`.```!#$"$D`P#_K$,9](X%`!0T`H```*(H(98"`=0P0@#P)$+_T"Q"`$`D
+M`P`2)`0`#@""&`NLHQGXC@4`%#0"@```HB@AC*,`'"0"P'\`8A@DE@(!U#!"
+M`/`D0O_0+$(`0#1D$X`T8P^``((8"ZRC`!R/OP!LC[``:`/@``@GO0!P)[W_
+MJ*^_`%2OL`!0/`(``"1"````0/@)`("`)1!``'2/OP!4C@4`%(RB0!"OH@!`
+MDZ,`0">D`$"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"4\
+M`OS_-$+__P!B&"2OHP!$DZ,`1">D`$20@@`!``(2``!B&"60@@`"``(4``!B
+M&"60@@`#``(6``!B&"6LHT`0C@4`%(RB0!"OH@!(DZ,`2">D`$B0@@`!``(2
+M``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"4D`O_]`&(8)*^C`$R3HP!,
+M)Z0`3)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC0!".
+M`@`4-`.```!#$"$D`P`!K$,!!(X%`!0T`H```*(H(8RC`!PD`L!_`&(8))8"
+M`=0P0@#P)$+_T"Q"`$`T9!.`-&,/@`""&`NLHP`<C@(`%#0#@```0Q`A)`,`
+M'ZQ#&'".`@`4-`.```!#$"$D`P!_K$,8=(X"`!0T`X```$,0(20#``ZL0QAX
+MC@(`%#0#@```0Q`A)`,`#*Q#&?".`@`4-`.```!#$"$D`P#_K$,9](X%`!0T
+M`H```*(H(98"`=0P0@#P)$+_T"Q"`$`D`P`8)`0`%`""&`NLHQGXC[\`5(^P
+M`%`#X``()[T`6#P"``"4HP``E$(4\`!#$"L40``+```@)3P"```D0Q3PE*4`
+M`"2$``$`!!"``$,0(91"````11`K$$#_^@`````\`@``)$(4\``$&(``0Q`A
+M`^``"(1"``(GO?_@K[\`&*^Q`!2OL``0`,"`)0#@B"4`@#`E)*/__RQB`!T0
+M0`#&)(<!X#P"```D0A4@``,8@`!B&"&,8@```$``"``````D`@`"$@(`#SP"
+M``0N`@`"%$``O@``$"4N`@`$%$``NR0"``TN`@`&%$``N```$"4D`@!_$@(`
+M"``````0``"S)`(`#8SC````8A@D)`(`#1```*X``Q`+$```K```$"42``"J
+M```0)20"``$6`@`&`````(S"+\P``A;".$(``1```*(P0@`!$@``!@`````D
+M`@`!$@(`!P`````0``";)`(`#(SB`````A3"$```ES!"``&,PB_0``(0@A``
+M`),P0@`!C(,!S"QB``800`"/```0)20"``448@",)`(`#92"`=`L0@`($$``
+M`P`````0``"&)`(`#1```(0``!`E$@``@@``$"4D`P`!%@,`?R0"``R,@@`4
+M-`.```!#$"&,0B((``(30CA"``$0``!W,$(``8R"`?BN(@``$```<P``$"42
+M``!Q```0)20#``$6`P!OC[\`&(S"+]P0``!L+$(``1(```8`````)`(``1("
+M``:/OP`8$```9H^Q`!24PA*&$```82Q"``&4PA*,%$``7@``$"64PQ**$&``
+M6R0"``$0``!9```0)1(``%<``!`E)`,``18#`%0D`@`,C,(OS``"%\(0``!0
+M.$(``1(```8D`@`-)`(``1("``<`````$```220"``R,XP``,&,(`!```$4`
+M`Q`+C,(OT``"$,(X0@`!$```0#!"``&,PB_@,$(`/ZXB```0```[```0)8S"
+M+^`P0C\```(2`JXB```0```U```0)20"``$2`@`(`````!(``#```!`E+@,`
+M!Q!@`"TD`@`,$```!3P"``",PC`8.$(``1```"<P0@`!)$(```!`^`D`````
+M`$`@)1"``"$D`@`!)@/__BQB``400``=```0)3P"```D0A68``,8@`!B&"&,
+M8@```$``"`````"0@@`)$```#*XB``"0@@`,$```":XB``"0@@`-$```!JXB
+M``"0@@`+$````ZXB``"0@@`*KB(``!````8``!`E/`(``"1"```"`#`E`$#X
+M"0(@."6/OP`8C[$`%(^P`!`#X``()[T`(">]_]"OOP`H`(!`)22C__XL8@`<
+M$$``B22)`>`\`@``)$(5R``#&(``8A@AC&(```!```@`````$.``!3P#"`"-
+M`B_,`$,0)1````:M`B_,C0(OS#P#]_\T8___`$,0)*T"+\P0``![)`(``8TC
+M```\`@`(`&(8)!!@`'8``!`E$.``!20#__N-`B_0`$,0)!````2M`B_0C0(O
+MT#1"``2M`B_0C((`%#0#@```0Q`AC0,OT*Q#`2`0``!F)`(``8R"`!0T`X``
+M`$,0(8Q%(@@0X``#`````!````,TI2``)`+?_P"B*"2,@@`4-`.```!#$"&L
+M12(($```5B0"``&LAP'XC((`%#0#@```0Q`AK$<`2!```$\D`@`!``<0*ZT"
+M+]P0``!+)`(``1#@``4\`X``C0(OS`!#$"40```&K0(OS(T"+\P\`W__-&/_
+M_P!#$"2M`B_,$```/B0"``&%`B_T`.(X(2SC`$`D`@`_`$,X"B0"`!H4H@`&
+M`````(T"+^``XA`E,$(`/Q````>M`B_@C0,OX#!C/P`PXC\```(2`@!#$"6M
+M`B_@C((`%#0#@```0Q`AC0,OX*Q#`.@0```D)`(``2S"``<00``A```0)3P"
+M```D0A6L``88@`!B&"$\`@``)$(``(QE````0/@)`.`P)1```!>/OP`HC2(`
+M`#!""``00``,`````!#@``4D`__WC0(OT#1"``@0```$K0(OT(T"+]``0Q`D
+MK0(OT!````<D`@`!CZ(`0*^B`!`\`@``)$(```!`^`D`````C[\`*`/@``@G
+MO0`P)[W_X*^_`!B/H@`PCZ,`-*^B`!`\`@``)$(```!`^`FOHP`4``(0*X^_
+M`!@#X``()[T`(``````GO?^(K[\`=*^V`'"OM0!LK[0`:*^S`&2OL@!@K[$`
+M7*^P`%@0H`!=`("@)8Z%`!2,HD`$KZ(`0).C`$`GI`!`D((``0`"$@``8A@E
+MD((``@`"%```8A@ED((``P`"%@``8A@E/`+__#1"__\`8A@DKZ,`1).C`$0G
+MI`!$D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EK*-`!#P"
+M```D0@```$#X"20$``HD$P`H)[(`2#P6``$\`@``)%4``">Q`$PGL`!0CH(`
+M%(Q"0!"OH@!(DZ,`2))"``$``A(``&(8)9)"``(``A0``&(8)9)"``,``A8`
+M`&(8)0!V&"008``B``````*@^`DD!``RCH0`%(R"0`2OH@!,DZ,`3)(B``$`
+M`A(``&(8)9(B``(``A0``&(8)9(B``,``A8``&(8)3P"__PT0O__`&(8)*^C
+M`%"3HP!0D@(``0`"$@``8A@ED@(``@`"%```8A@ED@(``P`"%@``8A@EK(-`
+M!"9S__\68/_0`````!)@``H``!`ECH0`%#0"@```@B`AC((`!#P#__LT8___
+M`$,0)*R"``0D`@`!C[\`=(^V`'"/M0!LC[0`:(^S`&2/L@!@C[$`7(^P`%@#
+MX``()[T`>">]_\@`@#`EC,0`%#0"@```@B`AC((`!#P#``0`0Q`EK((`!!"@
+M`"$`````C,4`%(RB0`2OH@`PDZ,`,">D`#"0@@`!``(2``!B&"60@@`"``(4
+M``!B&"60@@`#``(6``!B&"4\`O_\-$+__P!B&"0\`@`!`&(8):^C`#23HP`T
+M)Z0`-)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC0`0#
+MX``()[T`.">]_\@`@#`EC,0`%#0"@```@B`AC((`!#P#``0`0Q`EK((`!!"@
+M`"$`````C,4`%(RB0`2OH@`PDZ,`,">D`#"0@@`!``(2``!B&"60@@`"``(4
+M``!B&"60@@`#``(6``!B&"4\`O_\-$+__P!B&"0\`@`"`&(8):^C`#23HP`T
+M)Z0`-)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8):RC0`0#
+MX``()[T`.">]_^"OOP`<K[(`&*^Q`!2OL``0`*"()0#`*"4D$``!$C``#0"`
+MD"42(``&/`(``20"``(2(@`.```0)1```!./OP`<)$*OX`!`^`D`````$```
+M"P!`@"4\`@`!)$*QR`!`^`D`````$```!JY1+[@\`@`!)$*R?`!`^`D`````
+MKE$ON`(`$"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_HC((`%(Q"0`2O
+MH@`0DZ(`$">D`!"0@P`!``,:``!#$"60@P`"``,<``!#$"4``A0",$(``P/@
+M``@GO0`8)[W_Z*^_`!0D`@`($*(`-J^P`!`LH@`)$$``#R0"`0`D`@`"$*(`
+M,RRB``,00``&)`(`!"0"``$0H@`6```0)1```$"/OP`4$*(`)```$"40```\
+MC[\`%!"B`"PLH@$!$$``!B0"`@`D`@`@$*(`)```$"40```SC[\`%!"B`"8D
+M`@0`$*(`)P``$"40```MC[\`%#P"```D4```C((2-!!``"(`````E$(``C!"
+M0``00``#/`(``!```!PD4```C((2-)1"``(P0H``$$``%SP"```0```5)%``
+M`#P"```0```2)%```#P"```0```/)%```#P"```0```,)%```#P"```0```)
+M)%```#P"```0```&)%```#P"```0```#)%```#P"```D4```/`(``"1"````
+M0/@)`@`H)0(`$"6/OP`4C[``$`/@``@GO0`8C((`%(Q"``P#X``(`````">]
+M__",@@`4K$4`#`/@``@GO0`0)[W_\(R#`!0D`@`$K&(`"`/@``@GO0`0)[W_
+MV*^_`"",@P`4)`(`(*QB``@\`@``)$(``"0%``@D!@`$`$#X"0``."4``A`K
+MC[\`(`/@``@GO0`H)[W_V*^_`"2OL``@`("`)8X$`!0T`H```((@(8R"`$@D
+M`__?`$,0)*R"`$@\`@``)$(```!`^`D"`"`E/`(``"1"```"`"`E`$#X"20%
+M``&/OP`DC[``(`/@``@GO0`H)[W_V*^_`"",@P`4-`*```!B&"&,8@!(-$(`
+M(*QB`$@\`@``)$(```!`^`D`````C[\`(`/@``@GO0`H)[W_\(R"`!0T`X``
+M`$,0(:Q%`$",@@`4`$,0(:Q&`$0#X``()[T`$">]__`LHP!`$&``&```$"4L
+MH@`@%$``##0"@`",@P`4`&(8(8QF`$0DI/_@)`(``0""$`0``A`G`,(0)*QB
+M`$00```*)`(``8R#`!0`8A@AC&8`0"0"``$`HA`$``(0)P#"$"2L8@!`)`(`
+M`0/@``@GO0`0)[W_\"RC`$`08``6```0)2RB`"`40``+-`*``(R#`!0`8A@A
+MC&8`1"2D_^`D`@`!`((0!`#"$"6L8@!$$```"20"``&,@P`4`&(8(8QF`$`D
+M`@`!`*(0!`#"$"6L8@!`)`(``0/@``@GO0`0C((`%#0#@```0Q`AC$,`/(Q$
+M`0PPA0`@-&("``!%&`L\`@("`((@)#1B`0`#X``(`&00"B>]__",@@`4-`.`
+M``!#$"$PHP#_K$,`/#"C`@`D`@`@```P)3"E`0`0H``#`$,P"SP"`@(`PC`E
+MC((`%#0#@```0Q`AK$8!#!#```8`````C(,`%(QB`#0T0@`0$```!JQB`#2,
+M@@`4C$,`-"0$_^\`9!@DK$,`-`/@``@GO0`0J*``"+B@``LPQ@__J*8`#+BF
+M``\PYP`@$.``!@````"(H@`,F*(`#S1"(`"HH@`,N*(`#ZB@`!2XH``7B*(`
+M%)BB`!>HH@`0N*(`$P/@``@D`@`!)[W_Z*^_`!"/J``PB*,`%)BC`!<P8P`!
+M$&``<20"``^(X@`4F.(`%S!"``$40``%`````(R"`!2,0P`,$&8`:"0"``^(
+MH@`0F*(`$S!"#_^E`@``B*(`%)BB`!<``A0",$)__Z4"``*A```$B*(`$)BB
+M`!,``A4",$(`_Z$"``8``A8```(6`R0#_X`40P`"`````*$```:(H@`4F*(`
+M%S!"`0`00``')`(`_XBB`!28H@`7,$+^```"$D(0```"H0(`!Z$"``>(H@`0
+MF*(`$P`"$\(P0@`?H0(`"(BB`!"8H@`3``(7`J$"``F(H@`0F*(`$P`"$P(P
+M0@`!H0(`"HBB`!28H@`7,$(``A1``#0``!`EB*(`%)BB`!<P0@`$$$``!0``
+M``"1`@`$-$(``1```"JA`@`$B*(`%)BB`!<P0@`0$$``%`````"1`@`$-$(`
+M`J$"``2(H@`4F*(`%S!"_P```A("H0(`!8R#,!PX0@`%``(0*P`#$`L00``7
+M/`(``"1"````0/@)`0`H)1```!,``!`EB*(`%)BB`!<P0@`($$``!0````"1
+M`@`$-$(`"!````FA`@`$B*(`%)BB`!<P0@`@$$``!0``$"61`@`$-$(`$*$"
+M``0``!`EC[\`$`/@``@GO0`8)[W_2*^_`+2OO@"PK[<`K*^V`*BOM0"DK[0`
+MH*^S`)ROL@"8K[$`E*^P`)``@(@EKZ4`O`#`\"6OIP#$`B"@)9?"``(``A'"
+M,$,``9?"``(P0@$`$$``!0``L"448`1R)`,`#!````B7P@`"E\(``@`"$<(X
+M0@`!,$(``11`!&HD`P`,E\(``@`"$8(P0P`!E\(``C!"`"`00``%`````!1@
+M!&$D`P`,$```"#P"``"7P@`"``(1@CA"``$P0@`!%$`$620#``P\`@``)$(`
+M``(@("4``"@E`$#X"20&``$00`16`B`@)3P"```D0@```$#X"0/`*"4`0*@E
+M$J`$2B0#``PD`@`&CZ,`O!!B``LL8@`'$$``!B0"``@L8@`"$$`$020#``P0
+M```%CZ4`Q(^D`+P4@@0\)`,`#(^E`,00H``0`````(XB`!2,0A%`KZ(`>#P"
+M```D0@```B`@)0!`^`D"H"@E/`(``"1"```"("`E`$#X"0``*"40```#CB0!
+MS*^@`'B.)`',.(,`!RQC``$X@@`++$(``0!B&"448``,CZ8`Q"0#``H0@P`)
+M)`(`"1""``<`````%(,`&@````"6(@'0+$(`!!!``!8`````$,``%`````".
+M)!(T$(``$0````"7PP``E((``!!B``T`````E\,``I2"``(P8P'P,$(!\!1B
+M``<\`@``)$(```(@("4`0/@)`\`H)11`!`8D`@`!CB4`%#0"@```HA`AC$,`
+M6*^C`'PD`P`!CZ0`?`"`,"4`9B`*KZ0`?(Q#``0\`@(@`&(8)*^C`(2,HD`0
+MKZ(`2).C`$@GI`!(D((``0`"$@``8A@ED((``@`"%```8A@E/`(`_C1"`&``
+M8A@DKZ,`@(RB0!2OH@!,DZ,`3">D`$R0@@`!``(2``!B&"60@@`"``(4``!B
+M&"60@@`#``(6``!B&"6OHP!PC*)`&*^B`%"3HP!0)Z0`4)""``$``A(``&(8
+M)9""``(``A0``&(8)9""``,``A8``&(8):^C`'0\`@``)$(```(@("4`0/@)
+MCZ4`O#P"```D0@```$#X"0(@("4\`@``)$(```(@("4`0/@)`\`H)1!``[DD
+M`P`#E\(``C!#`?`D`@%`$&(`("AB`4$00``/)`((P"0"`,`08@`F*&(`P1!`
+M``8D`@#0)`(`H!!B`!TD`P`,$``#J8^E`,@08@`A)`,`#!```Z6/I0#($&(`
+M&2AB",$00``&)`()0"0"`5`08@`,)`,`#!```YR/I0#($&(`!20""5`08@`&
+M)`,`#!```Y:/I0#()!<``1```!"OMP"()!<``B0"``$0```,KZ(`B"07``,D
+M`P`"$```"*^C`(@D%P`$)`0``A````2OI`"()!<`!20%``*OI0"(CB(`%#0#
+M@```0Q`A)`,`!ZQ#&````(`E/`(``"13%D`GL@!4`!`00`!0&"$``Q#``%,0
+M(8Q$```D@L``+$(0`!!``!8`$!!```,00`!7$"$``A"``%,0(8Q"``"OH@!4
+MDZ,`5))"``$``A(``&(8)9)"``(``A0``&(8)9)"``,``A8``&(8)8XB`!0`
+M1!`AK$,``!````XFU@`!`%`0(0`"&,``<Q@ACB0`%(QC````@R`A``(00`!7
+M$"$``A"``%,0(8Q"``"L@@``)M8``3+"`#\40``$/`8``"3&````P/@))`0`
+M`280``$N`@`9%$#_S0`0$$```(`E/`(``"13&)@GL@!8`!`0P`!3$"&,1```
+MCZ(`Q!!```P\!?__-*5_X`"%&"$L8P`9/`+__S1"?RP`@A`A+$(`"3A"``$`
+M`Q`+$$``)``````D@L``+$(0`!!``!0`$!C``!`0P`!3$"&,0@`$KZ(`6).C
+M`%B20@`!``(2``!B&"620@`"``(4``!B&"620@`#``(6``!B&"6.(@`4`$00
+M(:Q#```0```')M8``8XB`!0`1!`A`',8(8QC``2L0P``)M8``3+"`#\40``$
+M/`8``"3&````P/@))`0``280``$N`@#$%$#_R@`0$,".@BRL`B`@)0+@*"6/
+MI@"(`$#X"0+`."67P@`",$+``!!```4\`@``)$(```(@("4`0/@)`\`H)98B
+M`=(L0@!"%$``230#@`".(@`4`$,0(3P#``(T8Z`"K$,8+)?#```D`@FT%&(`
+M#CP#9F:2@A*2EH,2G`!#$",\`V9F-&-F9P!#`!@``!@0``,80P`"%\,`8A@C
+M``,<`!````<``R0#DH(2DC1C9F<`0P`8```0$``"$\```B0#E\(``C!"`-`D
+M`P#`%$,`$#0#@`".)0`4-`*```"B*"&2@A*2``(0(P`"$8`P0@_```08(P`#
+M'(`\!`#\`&08)`!#$"6LHAE,$```!8XD`!2.(@`4`$,0(:Q`&4R.)``4-`*`
+M``""("&,@B(H)`/]_P!#$"2L@B(HCB0`%#0"@```@B`AC((B*#P#__XT8P/_
+M`$,0)#1""`"L@B(HCB(`%#0#@```0Q`A)`,`#ZQ#`&"6(@'2+$(`0Q1```0T
+M`X``CB(`%`!#$"&L0")4CB(`%#0#@```0Q`A)`,`#JQ#&'B.(P',)`0`"A!D
+M``DD`@`)$&(`!P`````49``3/`(``)8B`=`L0@`$$$``#SP"``"7PP``.&()
+MGCAC":,``A`K```@)0!#(`N.(P`4-`*```!B&"&,8B),$$0``SP"``"L9"),
+M/`(``"1"```"("`E`J`H)0!`^`DGI@`0$$`"@B0#``,D`@`&CZ,`O!!B``<`
+M````CB("!!!```0\`@``)$(```!`^`D"("`ECH(LN`(@("4"H"@E,N;__P!`
+M^`DGIP`0$$`"<"0#``.7P@`",$(`0!!``!XD!``*CB,!S!!D``TD`@`)$&(`
+M"P`````49``%`````)8B`=`L0@`$%$``!0````"6@A)P+$)0`Q1```L\`@``
+ME\(``C!"`*`D`P"@$$,`!3P"```D0@```B`@)0!`^`D"H"@E/`(``"1"```"
+M("`E`$#X"0/`*"4\`@``)$(```(@("4`0/@)`J`H)1!``D@D`P`#CZ0`Q!"`
+M``0`````CB(`%(^E`'BL11%`CB0`%#0"@```@B`ADH,L,)*"+#$``A(``&(8
+M)9*"+#(``A0``&(8)9*"+#,``A8``&(8):R#``".)``4-`*```""("&2@RPT
+MDH(L-0`"$@``8A@ECZ8`A`!F&"6.@B_,`&(8)3P"`(``8A@EK(,`!#P"```D
+M0@```B`@)0!`^`F/I0"\CB0`%#0"@```@B`ADH,L/)*"+#T``A(``&(8)9*"
+M+#X``A0``&(8)9*"+#\``A8``&(8):R#`.".)``4-`*```""("&2@RQ`DH(L
+M00`"$@``8A@EK(,`Y(XE`!2,HD`0KZ(`7).C`%PGI`!<D((``0`"$@``8A@E
+MD((``@`"%```8A@ED((``P`"%@``8A@ECZ(`@`!B&"6OHP!@DZ,`8">D`&"0
+M@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6LHT`0CZ,`<*^C
+M`&23HP!D)Z0`9)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8
+M)8XB`!2L0T`4CZ0`=*^D`&B3HP!H)Z0`:)""``$``A(``&(8)9""``(``A0`
+M`&(8)9""``,``A8``&(8)8XB`!2L0T`8CB(`%#0#@```0Q`ACZ4`?*Q%`%B.
+M)``4-`*```""("&2@RPVDH(L-P`"$@``8A@EDH(L.``"%```8A@EDH(L.0`"
+M%@``8A@EK(,`"(XD`!0T`H```((@(9*#+#J2@BP[``(2``!B&"6L@P`,CB(`
+M%#0#@```0Q`ACH,OU*Q#`!B.(P`4)`+__ZQB`(`\`@``)$(```(@("4`0/@)
+M`J`H)1!``:8D`P`#/`(``"1"```"("`EDB42.`!`^`DD!@`!/`(``"1"```"
+M("`E`$#X"0/`*"66(@'4,$(`\"1"_]`L0@!`$$``$@````".(Q(TC&(``#!"
+MP``00``-)`<`#91F``(PQD``)`4`#(XD`!0T`H```((@(8R"&"0D`__P`$,0
+M)`#F*`H`11`EK((8)(XB`!0T`X```$,0(8Q"&10P1#__E\(``C!"`"`00``'
+M``00@#P#NBXT8XNC`$,`&0``$!`0```&``(A`CP"S,PT0LS-`((`&0``$!``
+M`B#"CB(`%#0#@```0Q`A)`,``:Q#&!R.(A(TE$(``C!"0``00``'/`(````$
+M($`D0@```$#X"22$`&00```0CB(`%(XB$C240@`",$*``!!```<\`@````0@
+M@"1"````0/@))(0`9!````6.(@`4)$(```!`^`DDA`!DCB(`%#0#@```0Q`A
+MC%88""0#.`"L0Q@()!```8XB`!0T`X```$,0(8Q"'"0P0@`0$$``#SP"```D
+M4P``-!*```)@^`DD!`#(`@`0)2A"`!000``')A```8XB`!0`4A`AC$(<)#!"
+M`!`40/_U`````(XB`!0T`X```$,0(:Q6&`B.(P`4-`*```!B&"&,8AA@-$(`
+M`ZQB&&"7P@`",$(`H"0#`*`00P`3)`(``HZ#+\`08@`0-`*``(XC`!0`8A@A
+MC&(9(#1"\`"L8AD@CB0`%#0"@```@B`AC((9(#P#``$`0Q`EK((9("0"``$0
+M```"KH(OP*Z`+\`\`@``)$(```!`^`D"("`E``"`)20&``$GI0!L`!`@@"2"
+MT``L0A``$$``$@`0$(`"!A`$KZ(`;).C`&R0H@`!``(2``!B&"60H@`"``(4
+M``!B&"60H@`#``(6``!B&"6.(@`4`$00(:Q#$``0```&)A```8XC`!0`8A@A
+M`@80!*QB$``F$``!*@(`"A1`_^0`$""`KH!&H)8B`>@00``+``"`)3P"```D
+M4@```B`@)0)`^`D"`"@E)A```98B`>@"`A`J%$#_^@(@("4\`@`(-$()9:Z"
+M+$0D`@`&CZ,`O!1B``,\`@`(-$(99:Z"+$2.(P`4CH(L1*QB`*".)``4C((`
+MK#P#``<`0Q`EK((`K(XB$DP00``$/`(``"1"````0/@)`B`@)3P"```D0@``
+M`B`@)30%F&`D!@`!`$#X"0``."4\`@``)$(```(@("4`0/@)CZ4`O(XD`!0T
+M`H```((@(8R"`"`\`_Y_-&/__P!#$"2L@@`@CB,!S"QB``800``')`(`!11B
+M`!``````EB(!T"Q"``@40``,`````(XB`!0T`X```$,0(3P#``$T8P"JK$,!
+M&(XB`!0T`X```$,0(20#,A"L0P$<CB(`%#0#@```0Q`A)`,`4JQ#`0B7P@`"
+M,$(!`!!```,`````$````H*&$HZ"AA*//`(``"1"```"("`E`$#X"0/`*"4`
+M`A8```)&`XZ"+^`P1P`_AH0O]`#D&"."H@`&`$,8*P!$$"$X8P```$,X"X*B
+M``4``A!``$@8(P!G$"L00``"`(`0)0!B."&.@B_@,$8_```&,@*&A"_T`,08
+M(X*B``8`0Q@K`$00(3AC````0S`+@J(`!0`"$$``2!@C`&80*Q!```(`@!`E
+M`&(P(9:%+^`PI0`_AH0O]`"D&"."H@`&`$,8*P!$$"$X8P```$,H"X*B``4`
+M`A!``$@8(P!E$"L00``$+.(`0`"`$"4`8B@A+.(`0"0#`#\`8C@*+,(`0`!B
+M,`HLH@!``&(H"C#D`#\`!A(`,$(_``""("4`!10`/`,`/P!#$"0`@B`ECB(`
+M%#0#@```0Q`AK$0`Z(Z$+]`0@``$`````(XB`!0`0Q`AK$0!((Z%+_@D`O__
+M$*(`!#P"```D0@```$#X"0(@("6.A2_\)`+__Q"B``0\`@``)$(```!`^`D"
+M("`ECH4P`"0"__\0H@`$/`(``"1"````0/@)`B`@)8XD`?@0@``$-`.``(XB
+M`!0`0Q`AK$0`2(^D`+RN)`'<CZ4`Q!"@`"@D`@`!DJ,`!#!B``(40``",&(`
+M_J*B``26H@`"I\(``I*B``2CP@`$DJ(`!:/"``62H@`&H\(`!I*B``>CP@`'
+MCB(2-```("4``"@EK$0`,*Q%`#0\`@``)$(```!`^`D"("`ECB02-*R"`"BL
+M@P`L/`(``"1"```"("`E`$#X"20%``$0```&)`(``8^E`,B,H@``$$```@``
+M$"6LHP``C[\`M(^^`+"/MP"LC[8`J(^U`*2/M`"@C[,`G(^R`)B/L0"4C[``
+MD`/@``@GO0"X`(`P)8S%`@0PH@`#$$``#">]__",Q``4-`*```""("&,@QE$
+M/`+?_S1"__\`8A@D,*(``0`"%T``8A@EK(,91#"B``P00``1``(0@C!"``$4
+M0``)-`.``(S$`!0T`H```((@(8R"`-`D`__C`$,0)!````:L@@#0C,(`%`!#
+M$"&,0P#0-&,`'*Q#`-`#X``()[T`$">]_^BOOP`0C((LM`!`^`D```````(0
+M*X^_`!`#X``()[T`&">]_[BOOP!$K[8`0*^U`#ROM``XK[,`-*^R`#"OL0`L
+MK[``*`"`B"4`H*@E)!0``3P"```D0@```$#X"0(@L"4`0)`E``"`)3P"```D
+M4P``EB(!Z`("$"L00``&`B`@)0)@^`D"`"@E$$#_^280``$``*`E$H``C0``
+M$"6.(@`4-`.```!#$"$D`P`!K$,9?```@"6.(@`4-`.```!#$"&,0AP@%$``
+M#RX"`&0\`@``)%0``#03@``"@/@))`0`!280``$N`@!D$$``>```$"6.(@`4
+M`%,0(8Q"'"`00/_V+@(`9!!``'$``!`E/`(``"1"```"("`E`$#X"0)`*"40
+M0`!J-`.``(XB`!0`0Q`AC$(9%#!%/_^61``",(0`(``%$(`\`[HN-&.+HP!#
+M`!D``!`0%(``!@`"&0(\`LS,-$+,S0"B`!D``!`0``(8PCP"```D0@```$#X
+M"21D`&0\`@``)$(```(@("4"0"@E`$#X"2>F`!`00`!,-`.``(XB`!0`0Q`A
+MK$`9?)9"``(P0@!`$$``'B0$``J.(P',$&0`#20"``D08@`+`````!1D``4`
+M````EB(!T"Q"``040``%`````);"$G`L0E`#%$``"SP"``"6H@`",$(`H"0#
+M`*`00P`%/`(``"1"```"("`E`$#X"0)`*"4\`@``)$(```(@("4`0/@)`J`H
+M)8XC`!0T`H```&(8(8QB&&`T0@`"K&(88))#``0P8@`"%$```C!B`/ZB0@`$
+MED(``J:B``*20@`$HJ(`!))"``6BH@`%DD(`!J*B``:20@`'HJ(`!XXB$C0`
+M`"`E```H):Q$`#"L10`T/`(``"1"````0/@)`B`@)8XD$C2L@@`HK(,`+#P"
+M```D0@```B`@)0!`^`DD!0`!)`(``8^_`$2/M@!`C[4`/(^T`#B/LP`TC[(`
+M,(^Q`"R/L``H`^``"">]`$@GO?_PC((`%#0#@```0Q`AC$8`!#P"__PT0O__
+M`,(P)"0"``$0H@`C**(``A!```4D`@`&$*``%30"@``0```C`````!"B``4D
+M`@`($*(`&0`````0```=`````(R#`!0T`H```&(8(3P"$`$`PA`EK&(`!(R$
+M`!2,@@`4)`/_WP!#$"00```1K((`%(R#`!0`8A@A/`(0`@#"$"6L8@`$C(,`
+M%(QB`!0T0@`@$```!ZQB`!2,@P`4-`*```!B&"$\`A```,(0):QB``0#X``(
+M)[T`$">]_^BOOP`0/`(``21"U]@`0/@))`4``H^_`!`#X``()[T`&">]_^BO
+MOP`4K[``$`"`@"4\`@``)$(`````*"4`0/@))`8``1!```4"`"`E/`(``21"
+MU]@`0/@))`4`$X^_`!2/L``0`^``"">]`!@GO?_0K[\`+*^R`"BOL0`DK[``
+M(`"`B"4`H(`E/`(``21"U]@`0/@))`4`$Q!``*```"@E/`(``"1"```"("`E
+M`$#X"20&``$00`":C[\`+#P"``$D0M?8`B`@)0!`^`D``"@E$$``DX^_`"P2
+M``"1)`(``8XC`<PD!``*$&0`"20"``D08@`'`````!1D``\`````EB(!T"Q"
+M``000``+`````)8#``(P8@`@%$``!202``@P8P#0)`(`P!1B`#@D!``$$```
+M-B0$`.N6(@'4,$(`\"1"_]`L0@!`%$``"0````".(@',.$,`!RQC``$X0@`+
+M+$(``0!B&"408``5`````)8#``(P8@`@%$``!202``@P8P#0)`(`P!1B``,`
+M````$```'B0$`.N6`@`",$)``!1``!HD!`'JE@(``C!"@``D!`#J)`,"ZA``
+M`!0`8B`+E@,``C!B`"`40``%``"0)3!C`-`D`@#`%&(``P`````0```*)`0`
+MJY8"``(P0D``%$``!B0$`:J6`@`",$*``"0$`*HD`P*J`&(@"Y8#``(P8@!`
+M$$``"#!B`"`40``$,&,`T"0"`,`48@`#`````!````4V4@`$E@(``C!"`$`V
+M0P`!`&*0"I8%``(PHP$`-D(``@!#D`HPHP`0)`(``P!`@"4``X`*CB(`%#0#
+M@```0Q`AC$88?#"B`"`40``$,*,`T"0"`,`48@`3`````(XB`!0T`X```$,0
+M(:Q0&`2.(@`4`$,0(:Q2(@`0Q``;)`(``8XB`!0`0Q`AK$08?#P"```D0@``
+M`$#X"20$`2P0```2)`(``1#$``@T`X``CB(`%`!#$"&L1!A\/`(``"1"````
+M0/@))`0!+(XB`!0T`X```$,0(:Q0&`2.(@`4`$,0(:Q2(@`D`@`!C[\`+(^R
+M`"B/L0`DC[``(`/@``@GO0`P)[W_R*^_`#2OM``PK[,`+*^R`"BOL0`DK[``
+M(`"`B"4`H*`E`,"0)0(@F"4\`@``)$(```!`^`FN0````$"`)1(``,&/OP`T
+MCF,OP#AB``(L0@`!+&,``0!#$"400``")`(``:Y"``".9"_`)`(``12"`&$T
+M`X``CB(`%`!#$"&,0AD@/`,``0!#$"040`!:```P):Y@+\"N1```-`F``#P(
+M``&.(@`4`$D8(8QE'!",9!P4C&<<&``$$"L`!1`*%$``"`````",8AD@`$@0
+M):QB&2`DQ@`!*,(`"A1`__$```````4R`@`$$@(`PC`A``1!PBD"``(X0@`!
+M``80"A!``%<`!Q`C``(6```"/@,`Y@`:```0$A3```(```````<`#0!`."4H
+MX__@*.0`("0"`!\`1#@*)`+_X#AC````0S@+`*@`&P``*!(5```"```````'
+M``TDI?^`**/_\"BD`!`D`@`/`$0H"B0"__`X8P```$,H"XXD`!0T`H```((@
+M(8R#&2`D`O@?`&(8)``'$4`P0@?@`&(8):R#&2".)``4-`*```""("&,@AD@
+M)`/_X`!#$"0PHP`?`$,0):R"&2".(P`4-`*```!B&"&,8AD@-$((`*QB&2`D
+M`@`"KF(OP"0"``&N`@`0H@<`%!```!NB!0`5EH(``C!"`*`D`P"@$$,`%B0"
+M``*.8R_`%&(`%#P"``".`@`0%$``$3P"``".(P`4-`*```!B&"&,8AD@-$+P
+M`*QB&2".)``4-`*```""("&,@AD@/`,``0!#$"6L@AD@)`(``:YB+\`\`@``
+M)$(```(@("4`0/@)`@`H)98"``(P0@`"%$``*C0"@`".(P`4`&(8(8QB&&`T
+M0@`"K&(88):%``(PH@$`%$``"@````"6(@'4,$(`\"1"_]`L0@!`$$``(B0"
+M``$PH@!`$$``'R0"``&.)`',.(,`!SB"``L``A`K``,0"A!``!<D`P`*$(,`
+M%20"``D0@@`4)`(``12#``8\`@`!EB(!T"Q"``040``.)`(``3P"``$D0O_P
+M`$#X"0(@("40```()`(``9:"``(T0@`"IH(``I8"``(P0O_]I@(``B0"``&/
+MOP`TC[0`,(^S`"R/L@`HC[$`)(^P`"`#X``()[T`.">]_\BOOP`TK[(`,*^Q
+M`"ROL``H`("()0"@@"46```#K[``)"0"__^OH@`DCB,!S"0"``D08@`')`(`
+M"A1B``<`````EB(!T"Q"``000``#`````"0"_^\"`H`DCB4`%(RB``ROL``@
+MDZ,`(">D`""0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6L
+MHT``/`(``"1"````0/@))`0`#X^B`"0P0@`#KZ(`)#(0``,\`@``)$(```(@
+M("4D!4``CZ8`)`!`^`D"`#@E`$"0)3("``$40``=`D`0)20"`!2OH@`D-$(`
+M`:^B`"2.)0`4DZ,`)">D`"20@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#
+M``(6``!B&"6LHP`4/`(``"1"```"("`E```H)0!`^`DD!@`!$$``!`)`$"6.
+M(@`4C$(`P`)`$"6/OP`TC[(`,(^Q`"R/L``H`^``"">]`#B,@@`4-`.```!#
+M$"&,0AAD``(4PC!#`?\P8@$`$$```P`````X8@'_``(8)P/@``@`8!`EE*(`
+M`C!#`>`D`@#`$&(`$0`````H8@#!$$``!B0"`4`D`@"@$&(`"``````#X``(
+M```0)11B``H`````E((2S!````FDP@``E((2SA````:DP@``E((2T!````.D
+MP@```^``"```$"4D`@`!`^``"``````GO?_8K[\`)*^R`""OL0`<K[``&`"`
+MB"4`H)`ECB(`%#0#@```0Q`AC$(88#!"``(40``8``"`)3P"```D0@```$#X
+M"0``````0(`E/`(``21"V7@"("`E`D`H)0!`^`DGI@`0$$``"8>B`!``4!`J
+M$$``!P````"60@`"-$(``J9"``(0```"``"`)0``@"6F4``6`@`0)8^_`"2/
+ML@`@C[$`'(^P`!@#X``()[T`*">]__",@@'@/`,@``!#$"000``;`(`P)8R#
+M`!0D`@`!K&($((S"`!2L0`8`C,,`%(QB!@`T0@`(K&(&`(S#`!0\`@`0-$("
+M`:QB!@2,P@`4K$`&(```*"6,P@`4K$4$`(S#`!0`I!`AD$(O.*QB!`0DI0`!
+M**(`@!1`__<``````^``"">]`!`GO?_HK[\`$`"`<"4``&`E),G__P`)2,(D
+MQO__,,8`!P"@0"48H``<``!0)20-``@D"P`!``<XP`#(("$L@@`)`:(@"@"+
+M$`0D0O__`,L8!"1C__\`0Q`F`.(0!``)&(``;A@AC&,```!#$"0`XA`&`,(0
+M!@%"$`0!@F`E`(8@(P%$4"$!!A`A)$C_^```,"4=`/_I)2D``3P"```D0@``
+M`$#X"0&`("6/OP`0`^``"">]`!@GO?_P`(!`)93"``(P0P'@)`(`P!!B``\!
+M`$@E*&(`P1!```8D`@%`)`(`H!!B``<``!`E$```40`````48@!/```0)1``
+M``0``!@E$````B0#``$D`P`"``,80"4D``0`9!`AE$<2YI1"$NP``A&``.(X
+M)0!D$"&40A+R``(3``#B."4`9!`AE$(2^``"%(``XC@E`&00(91"$OX``A8`
+M`.(X)0!D$"&41A,$E$(3"@`"$8``PC`E`&00(91"$Q```A,``,(P)0!D$"&4
+M0A,6``(4@`#","4`9!@AE&(3'``"%@``PC`E)`(``1"B``<`````$*``""0"
+M``(0H@`%```0)1```!T`````$````@#@,"4`P#@E%,<`"C0#@`"-!``4-`*`
+M``""("&,@B(()`/?_P!#$"2L@B(($```!ZTE+[R-`@`4`$,0(8Q#(@@T8R``
+MK$,B"*TE+[R-`@`4-`.```!#$"&L1QE@C0(`%`!#$"&L1AED)`(``0/@``@G
+MO0`0C(,!S"0&``H09@`8`````"0"``D08@`5`````!1F``4`````E((!T"Q"
+M``040``0)`8`*(R"`<PX0P`'+&,``3A"``LL0@`!`&(8)11@``@D!@`HE((!
+MU#!"`/`D0O_0+$(`0!!```(D!@`@)`8`*)2B````1@`;```8$!3```(`````
+M``<`#21B__8L0@`-.$(``0/@``@``Q`*)[W_P*^_`#ROM@`XK[4`-*^T`#"O
+MLP`LK[(`**^Q`"2OL``@`("0)0"@H"66@@`"``(1PC!5``&6@@`",$,!\"0"
+M`4`08@`?`D"`)2AB`4$00``/)`((P"0"`,`08@!`*&(`P1!```8D`@#0)`(`
+MH!!B`#D``!`E$``!/(^_`#P08@`W```0)1```3B/OP`\$&(`,RAB",$00``&
+M)`()0"0"`5`08@`'```0)1```2^/OP`\$&(``R0""5`48@$J```0)99"`=0P
+M0@#P)$+_T"Q"`$`40``C``"8)8Y$`<PX@P`'.((`"P`"$"L``Q`*$$``'"0#
+M``H0@P`:)`(`"1""`!@`````%(,`!0````"60@'0+$(`!!1``!(`````CD0`
+M%#0"@```@B`AC(,91"0"_\<`8A@DC@(L+(1"`````A#`,$(`.`!B&"6L@QE$
+M$```!8Y$`!00```")!,``203``*.1``4-`*```""("&,@QD0)`+\!@!B&"0`
+M$Q!``%`0(91"$N0``A$``&(8)31C``&L@QD0/`(``"1"```"0"`EC@4OO`!`
+M^`D"@#`ECD,`%#0"@```8A@A`!,00`!0$"&40A+,,$(!_S1"`@"L8AEHE@(2
+M<"Q"4``40``6`!,00):"``(P0@`0$$``$0`5($`D@A-`)@,`!`!B$"&410``
+M)J(32`!B&"&`9@```@(0(8!'``8D@A-(`@(0(91(```DA!-0`@0@(1```!&4
+ME@```!,00"8$``(`1!`AE$42H`)P$"&`1A+&)J(2R`("$"&`1P`!`!480"1B
+M$J@"`A`AE$@``"1C$S``@R`AE)8``(Y$`!0T`H```((@(8R#&$0D`L!_`&(8
+M)``%$<`P0C^``&(8):R#&$2.1``4-`*```""("&,@AA0)`/_``!#$"0PPP#_
+M`$,0):R"&%".1``4-`*```""("&,@QA0/`+__S1"`/\`8A@D``<2`#!"_P``
+M8A@EK(,84(Y%`!0T`H```*(H(8RD&$@\`O_\-$(/_P""("0`"!,`/`,``S1C
+M\```0Q`D`((@):RD&$B.10`4-`*```"B*"$`$R!``)`0(91"$KH``AX```(4
+M``!B&"4`D"`AE(02P``$$@``8A@E`&08):RC&#2.1``4-`*```""("&,@Q@H
+M/`+__S1"`/\`8A@D`!,00`!0$"&40A*N``(2``!B&"6L@Q@HCD4`%#0"@```
+MHB@AC*089#P"__@T0@__`((@)``3$$``4!`AE$(2M``"$P`\`P`'-&/P``!#
+M$"0`@B`EK*089)8"$G`L0C`#$$``"R01``*60P'*)`(0(A1B`!$`````EH(`
+M`C!"`$`00``-`````!````LD$0`(/`(``"1"```"0"`E`$#X"0*`*"400``$
+M`!,00`!0$"&40A,F`B*((8Y$`!0T`H```((@(8R#&20D`O\!`&(8)``1$$`P
+M0@#^`&(8):R#&22.@@`0$$``!``5&$""A0`4$```!X*&`!4D8A.P`@(0(91%
+M``8D8Q.X`@,8(91F``*.1``4-`*```""("&,@QD@)`+X'P!B&"0`!1%`,$('
+MX`!B&"6L@QD@CD0`%#0"@```@B`AC((9("0#_^``0Q`D,,,`'P!#$"6L@AD@
+MCD,`%#0"@```8A@AC&(9(#1""`"L8AD@E@02<"R"0`$40``3)`,`T):"``(P
+M0@#0%$,``RR"4``40``-`````(Y%`!0T`H```*(H(8RD(@P\`O\#-$+__P""
+M("0`%A2`/`,`_`!#$"0`@B`EK*0B#)8"$G`L0E`!%$``!B0"``&.0@`4-`.`
+M``!#$"&L0!G@)`(``8^_`#R/M@`XC[4`-(^T`#"/LP`LC[(`*(^Q`"2/L``@
+M`^``"">]`$`GO?^(K[\`=*^^`'"OMP!LK[8`:*^U`&2OM`!@K[,`7*^R`%BO
+ML0!4K[``4`"`D"4`H/`EKZ``$*^@`!2OH``8KZ``'*^@`""OH``DKZ``2```
+MN"6OH`!,)`,``:>C`"@D`@`"IZ(`*J>B`"RGHP`NIZ,`,*>B`#*GHP`TE\(`
+M`@`"$<(P5``!$H``!Y?#`````Q"``$,0(0`"$$`D0J8H$```"#!"__\``Q"`
+M`$,0(0`"$$`\`___-&-`F`!#$"$P0O__`$"8)9?"`#@40``?`$"()301@``D
+M`@!7E\,``C!C`!`D!`"N.&,```"#$`L``(`E`F*P(Q````("8J@A,%#__RX"
+M``400``/`D`@)8Y"`<0"`"@E`$#X"0*`,"4T`X``$$,`"#!#/_\`=A`J%$#_
+M\R8"``$"HQ`J%$#_\"8"``$`8(@EI]$`.#0"@``6(@!2`````(Y"`!0`42`A
+MC((9(#P#0```0Q`D$$`!:0````",@AD,/`,`_S1C__\`0Q`DK((9#(Y#`!0T
+M`H```&(8(8QD&2`\`H__-$+__P""("2L9!D,CD(`%#0#@```0Q`AK$`9H(Y"
+M`!0`0Q`AK$`9@(Y$`!0T`H```((@(8R"&80\`__P`$,0)*R"&82.0@`4-`.`
+M``!#$"&L0!F8CD0`%#0"@```@B`AC((9G#P#__``0Q`DK((9G(Y"`!0T`X``
+M`$,0(:Q`&0".0@`4`$,0(:Q`&02.0@`4`$,0(:Q`&0B.1``4-`*```""("&,
+M@AD,)`/```!#$"2L@AD,CD(`%#0#@```0Q`AK$`9B(Y"`!0`0Q`AK$`9C(Y"
+M`!0`0Q`AK$`9D(Y$`!0T`H```((@(8R"&90D`\```$,0)*R"&900``$@C[\`
+M=)?"``(P10'P)`(`T!"B`#`",R`C**(`T1!```8D`@%`)`(`P!"B`!8D`@/H
+M$```-G""&`(0H@`%)`(!4!"B`"0D`@/H$```,'""&`(`!+Q`/`)1ZS1"A1\"
+MX@`8```0$``"$,,`%Q_#`$.X(P`7$H.OH@!,)`,,-1```"&OHP!(``0J`#P"
+M"4\T0B"5`*(`&```$!```A!#``4?PP!#$".OH@!,``2\0#P"4>LT0H4?`N(`
+M&```$!```A##`!<?PP!#N",D`@PU$```#:^B`$@`!+P`/`)1ZS1"A1\"X@`8
+M```0$``"$,,`%Q_#`$.X(P`7$H.OH@!,)`,8:J^C`$@D`@/H<((8`@`#&0"/
+MI`!(`&0`&@``$!(4@``"```````'``T`0!@E,&(`#R0(``040``#)Z4`*"0(
+M``,GI0`P$0``6@``@"4``S$#*,D`'20'``$1(`#(`-`0(21$`!DL@@`A$$``
+M$22#_]\H@@`:$$``!BB"`!L`AQ`$CZ,`$`!#$"40```0KZ(`$!1```\D@@`!
+M)(+__P!'$`2/HP`0`$,0)1````BOH@`0+&(`%!!```8D@@`!`&<0!(^C`!0`
+M0Q`EKZ(`%"2"``$L0@`0$$``"R2"__$`$!!``$40(91#````!!!`)$(``@!#
+M&`2/H@`8`&(8)1```">OHP`8+$(`$!!```LD@O_A`!`00`!%$"&40P````00
+M0"1"_^(`0Q@$CZ(`'`!B&"40```:KZ,`'"Q"`!`00``+)(+_T0`0$$``11`A
+ME$,````$$$`D0O_"`$,8!(^B`"``8A@E$```#:^C`"`L0@`'$$``"R8"``$`
+M$!!``$40(91#````!!!`)$+_H@!#&`2/H@`D`&(8):^C`"0F`@`!,%#__P((
+M$"H40/^K`````(Y$`!0T`H```((@(8R"&0P\`P#_-&/__P!#$"0\`_\``$,0
+M):R"&0R.0P`4-`*```!B&"&,9!D@/`)P``""("6L9!D@CD0`%#0"@```@B`A
+MCZ4`3``%'0`\`C_P`&(8)#P"``\T0O__`N(0)`!B&"4\`D```&(8):R#&:".
+M0@`4-`.```!#$"&/HP`0K$,9@(Y%`!0T`H```*(H(8RD&80\`O_P`((@)(^B
+M`!0\`P`/-&/__P!#$"0`@B`EK*09A(Y"`!0T`X```$,0(8^C`!"L0QF8CD4`
+M%#0"@```HB@AC*09G#P"__``@B`DCZ(`%#P#``\T8___`$,0)`""("6LI!F<
+MCD(`%#0#@```0Q`ACZ,`&*Q#&0".0@`4-`.```!#$"&/HP`<K$,9!(Y"`!0T
+M`X```$,0(8^C`""L0QD(CD0`%#0"@```@B`AC(,9#"0"P```8A@DCZ(`)#!"
+M/_\`8A@EK(,9#(Y"`!0T`X```$,0(8^C`!BL0QF(CD(`%#0#@```0Q`ACZ,`
+M'*Q#&8R.0@`4-`.```!#$"&/HP`@K$,9D(Y$`!0T`H```((@(8R#&90D`L``
+M`&(8)(^B`"0P0C__`&(8):R#&92/OP!TC[X`<(^W`&R/M@!HC[4`9(^T`&"/
+MLP!<C[(`6(^Q`%2/L`!0`^``"">]`'@`@#@E/`1D`)2B``(P0@`0/`/(`#A"
+M````8B`+E*(``C!"0``00``#)[W_\!````4`!"!"E*(``C!"@```!!B"`&(@
+M"Y2B````@@`;```8$A1```(```````<`#0!@("4$@``')`8`'R3&__\0P``$
+M`,00!C!"``$00/_[`````"0"`"8`1C`C)`(`%P!&$",D`P`!`$,8!`"#&"$D
+M`@`8`$80(P!#&`8DQO_PC.4`%#0"@```HB@AC*(8%#P$``$TA/__`$00)``#
+M'$``0Q`EK*(8%(SD`!0T`H```((@(8R#&!0\`O_^-$(?_P!B&"0`!C-`/`(`
+M`31"X```PC`D`&88):R#&!0#X``()[T`$">]_^"OOP`8`(`P)2RC`$`D`@`_
+M`$,H"J3%`?P\`@``)$(``(S%$C0`0/@))Z8`$(^_`!@#X``()[T`(">]_ZBO
+MOP!4K[0`4*^S`$ROL@!(K[$`1*^P`$``@)`E`*"8)0#`H"4"0(@E/!```"80
+M``".)$9X`@#X"8XE1GPF)$:``@#X"20%`""&(@'\*$(`0!1```*6(P'\)`,`
+M/P`#%````CP#*.,`/SAC``$PXO__+$(``0!B&"408``'/`,``"1C'KB.0@(`
+M``(00`!#$"$0```"A$8`````,"4D`@`!KZ(`$">B`""OH@`4)Z(`(J^B`!@\
+M`@`!)$+P>`)`("4`0/@)`F`H)1!``-P"0"`EK[0`$(XB++PGI0`@)Z8`(@!`
+M^`D"8#@E$$``U8^_`%2.1`',.(,`!SB"``L``A`K``,0"A!```XD`P`*$(,`
+M#"0"``D0@@`+```P)12#``4`````ED(!T"Q"``040``&)`4`/Y8B1IXD0@`$
+MIB)&G@``,"4D!0`_``800"1"1H`"(B`AE((``)8C+_0`0Q`AI((``#!"__\L
+M0@!`%$```@````"DA0``),8``2S"`!`40/_R``800)8B$IXL0@`"$$``60``
+M``"60@'2+$(`0A!``!XD`P#`EF(``C!"`-`40P`:)`()M)9C```48@`-/`-F
+M9I(B$I*6(Q*<`$,0(SP#9F8T8V9G`$,`&```&!```QA#``(7PP!B&",0```'
+M,&7__Y(B$I(T8V9G`$,`&```$!```A!#,$7__SP"``$D0O@P`$#X"0)`("4`
+M`#`E)Z<`.#0(H8``!B"`)()A@"Q"$``00``=`````(XB1G@`@A`AE$,``@`#
+M&@`T8P#_``,<`)1"`````A(`-$(`_S!"__\`8A@EKZ,`.).C`#B0X@`!``(2
+M``!B&"60X@`"``(4``!B&"60X@`#``(6``!B&"6.0@`4`$00(0!($"&L0P``
+M$```$23&``&.10`4`*0H(0"H*"&.(D9X`((@(92#``(``QH`-&,`_P`#'`"4
+M@@````(2`#1"`/\P0O__`&(8):RC```DQ@`!*,(`(!1`_\X`!B"`CD0`%#0"
+M@```@B`AEB-&AC!C`#\``QX`EB)&A#!"`#\``A0``&(8)98B1H(P0@`_``(2
+M``!B&"66(D:`,$(`/P!B&"6L@QDTCD0`%#0"@```@B`AEB-&CC!C`#\``QX`
+MEB)&C#!"`#\``A0``&(8)98B1HHP0@`_``(2``!B&"66(D:(,$(`/P!B&"6L
+M@QDXCD0`%#0"@```@B`AEB-&E#!C`#\``QX`EB)&DC!"`#\``A0``&(8)98B
+M1IXP0@`_``(2``!B&"66(D:0,$(`/P!B&"6L@R(TCD0`%#0"@```@B`AEB-&
+MG#!C`#\``QX`EB)&FC!"`#\``A0``&(8)98B1I@P0@`_``(2``!B&"66(D:6
+M,$(`/P!B&"6L@R(XCD0`%#0"@```@B`ACB4OW"0"`#\D`P!_`&40"ZR"&3PD
+M`@`!C[\`5(^T`%"/LP!,C[(`2(^Q`$2/L`!``^``"">]`%@GO?^0K[\`;*^^
+M`&BOMP!DK[8`8*^U`%ROM`!8K[,`5*^R`%"OL0!,K[``2*^D`'``H*`E``8T
+M```&-`.OI@`X``<\```'/`.OIP`\`("()28S1H`D'@`_@H(`!0`"$$`P0O__
+MKZ(`0"0"_\&/HP"(I&(``(^B`(2D7@``/`(``"1"````0/@))!4`/S!2`/\`
+M`(`ECZ,`<)1B$W000``GKZ``1"8W``8R5@#X`!`00"1"$W`"XA`AE$,``!!@
+M`!HR1/__$&0`!@`0*8"40@``,$(`!S1"`.`4@@`3``````(E*"&6A```/`,`
+M`21C^=0`8/@))*47U"0$`.`6Q``(`$`8)3!B__\"HA`K$$```@`````"H!@E
+M$````S!U__\0```&`$"H)280``&6(A-T`@(0*A1`_]X`$!!`EH(``C!"`-`D
+M`P#`%$,`+3)"`/@T4@`!EB(3=!!``"H``(`E)C<`!C)6`/@`$!!`)$(3<`+B
+M$"&40P``$&``&C)$__\09``&`!`I@)1"```P0@`'-$(`X!2"`!,``````B4H
+M(9:$```\`P`!)&/YU`!@^`DDI1?4)`0`X!;$``@`0!@E,&+__P/"$"L00``"
+M``````/`&"40```#,'[__Q````D`0/`E)A```98B$W0"`A`J%$#_W0`````0
+M```#EH(``@*@\"66@@`",$(!`!!```,`````$````H(F$HZ")A*//`(``"1"
+M``"/I`!P`$#X"0*`*"4``A8```*&`Y:#``(P8@!`$$``F#!B`(`00``+)Z(`
+M&)8G%YROH@`0/`(``21"^YR/I`!P`H`H)0!`^`DF)A>>$```"H^E`$"6)Q=*
+MKZ(`$#P"``$D0ON<CZ0`<`*`*"4`0/@))B873(^E`$``L!`C`J(8*@*C$`L`
+M`A0```(T`Y:"``(P0@`0$$``&)>B`!Z6(A)P+$(P`11```8`````EB(2?@#"
+M&"H`PQ`+``(4```"-`.6(A)P+$)``!1```N7H@`>EH(``C!"`(`00``'EZ(`
+M'I8B$H``PA@J`,,0"P`"%````C0#EZ(`'@#"&"H`PQ`+``(4```"%`.OH@!$
+MCZ,`.``#$$"/I`!$`((0(P`"%````C0#``80)P`"%\,``C`*CZ4`/`#%$"H0
+M0``"`*`8)0#`&"4``Q0```(T`X^B`(`00`!`,,+__Z9F``BF9@`&IF8`!*9F
+M``*F9@``EZ0`'#"#__\`0Q`K$$```@#`*"4`P"`EIF0`"I>D`!HP@___EF(`
+M``!#$"L00``"`````)9D``"F9``,EZ0`&#"#__^68@```$,0*Q!```(`````
+MEF0``*9D``X`!!0```(<`Y8B$G`L0D``%$``&`````"6@@`",$(`@!!```<`
+MP"`EEB(2A`#"$"H00``'`,`0)1```!"F8@`>EB(2@@""$"H40``(`,`0)9:"
+M``(P0@"`$$```P`````0```"EB(2A)8B$H(0```#IF(`'I9B``"F8@`>CZ0`
+MB(2"```0```'KB(O\`#`*"67H@`8`,(8*@##$`L``A0```(<`X^B`(2D0P``
+MCZ,`B*1E``"6@P`",&(`(!1```0P8P#0)`(`P!1B`%./I`"`EB<7O">B`"BO
+MH@`0/`(``21"^YR/I`!P`H`H)0!`^`DF)A>^CZ0`0`"0$",#PA@J`\,0"P`"
+M%````C0#EZ(`+@#"&"H`PQ`+CZ0`.``$&$``0Q`C``(4```"-`,`!A`G``(7
+MPP`",`J/I0`\`,40*A!```(`H!@E`,`8)0`#%````C0#CZ(`@!!``!B7H@`N
+M`,(8*@##$`NF8@`0EZ(`+`#"&"H`PQ`+IF(`$@`"'````R0#IF(`%)>B`"H`
+MPA@J`,,0"Z9B`!:F8@`8EZ(`*`#"&"H`PQ`+IF(`&@`"'````QP#$```"Z9B
+M`!R7H@`L`,(8*@##$`L``A0```(D`Y>B`"@`PA@J`,,0"P`"%````AP#CZ4`
+MA(2B````8A`J$$```@````"DHP``CZ,`B(1B````1!`J$$```@````"D9```
+MCZ0`@!"```:/I0"(A*(``*XB+\B6(B_*CZ,`<*1B`?XD`@`!C[\`;(^^`&B/
+MMP!DC[8`8(^U`%R/M`!8C[,`5(^R`%"/L0!,C[``2`/@``@GO0!P)[W_L*^_
+M`$ROO@!(K[<`1*^V`$"OM0`\K[0`.*^S`#2OL@`PK[$`+*^P`"@`@*`EKZ4`
+M5(Z"+,``0/@)`,"X)1!``#R/OP!,AH(!_"A"`$`40``"EH,!_"0#`#\``Q0`
+M``*<`RIC`#\X8P`!,F+__RQ"``$`8A@E$&``!SP#```D8Q[$CH("```"$$``
+M0Q`A$````H12`````)`E$N``(P``B"4GM@`@)[4`(CP"``$D7O!X`!$0P(^C
+M`%0`8H`AKZ``$*^V`!2OM0`8`H`@)0(`*"4"0#`E`\#X"0)@."400``4C[\`
+M3(>B`"*"`P`&`$,0*A!```2'H@`@DZ(`(Z("``:'H@`@@@,`!P!#$"H00``"
+MDZ(`(:("``<F,0`!`C<0*Q1`_^0`$1#`)`(``8^_`$R/O@!(C[<`1(^V`$"/
+MM0`\C[0`.(^S`#2/L@`PC[$`+(^P`"@#X``()[T`4">]_\"OOP`\K[(`.*^Q
+M`#2OL``P`*"0)0"`@"6&$1*:/`(``"1"```GI``0)@5&@`!`^`DD!@`@)`D`
+M"">J`!`D#0`()`X`/P`)&$`!0Q@AE&(```!1$".D8@`````X)0``6"4`"6!`
+M`&`P)83"```$00`"`````*3````4[0`#`4PH(1```!HD!P`/E*@``(2D````
+M!Q!``%`0(91#1H`DX@`!%(,`$C!'__\4@``$+6(`,R4"``$0```*I*(``!1`
+M``4`````E,(``"1"``$0```$I,(``)3"```D0O__I,(`````."4E8@`!,$O_
+M_RSB`!`40/_=``D00`%"&"&$8@``*$(`0!1```(`"2!`I&X```"0$"&40D:`
+M`%(0(RA#`````Q`+`40@(82#``".!$9X``,80`!D&"$``A!``$00(91"``"D
+M8@``)2(``3!)__\M(@`/%$#_O``)&$`D"0`()Z0`$``)$$``4!@A`((0(91"
+M``"D8D:`)2(``3!)__\M(@`/%$#_]X^_`#R/L@`XC[$`-(^P`#`#X``()[T`
+M0">]_\"OOP`\K[(`.*^Q`#2OL``P`*"()3"2__^6(@``$$``$0``,"4GI``8
+M``880`"#&"$`!A#``%$0(91"``"D8@``),8``2C"``@00``'`,"`)0`&$,``
+M41`AE$(``!1`__,`!AA``,"`)2>B`"JOH@`0/`(``"1"```"0"`E)Z4`&##&
+M__\`0/@))Z<`*!H```X``#`EEZ,`*)>B`!@08@`,EZ(`*B>D`!@DQ@`!`-`0
+M*A!```4`!A!``((0(91"```48O_Y`````)>C`"B7H@`J%&(``P`&$,`0<@`&
+M``````!1$"&,0@`$$$``!"0#`#\`!A#``%$0(91#``(`8!`EC[\`/(^R`#B/
+ML0`TC[``,`/@``@GO0!`,(3__S"E__\PQO__,.?__Y>H`!)PZ!@"$&``(@``
+M$"40Q0`>)`,`9`"%$"-P0Q`"`,48(P!#`!H``!`2%&```@``````!P`-``(4
+M```")`,$@``3`.`8)2B"`&400``0`0`8)20"`&0`1!`C`$<`&'"(`````!@2
+M/`)1ZS1"A1\`8@`8```0$``"$4,``Q_#`$,0(Q````(P0___`.`8)0!@$"4#
+MX``(`````">]_[BOOP!$K[0`0*^S`#ROL@`XK[$`-*^P`#``H)@E`,"0)8^T
+M`%@P\/__$@``#@``("4GI0`8``080`"C&"$`!!"``$00(0`"$$``4A`AE$(`
+M"*1B```DA``!`)`0*A1`__8`!!A`EF0``">B`"JOH@`0/`(``"1"```GI0`8
+M`@`P)0!`^`DGIP`H``!()0``."4``"`E)Z4`&)>H`"B7I@`J`)`0*A!```P`
+M!!!``*(0(91"```P@___`0(0)@!B.`H`!!!``*(0(91"```4PO_T)(0``0!@
+M2"669```EZ4`*)>F`"H`!XB``B>((0`1B$`",H@AEB<`!@`)@(`""8`A`!"`
+M0`(2@"&6`@`&/!(``292^O`"0/@)KZ(`$*:"``:69```EZ4`*)>F`"J6)P`$
+ME@(`!`)`^`FOH@`0IH(`!)9D``"7I0`HEZ8`*I8G``*6`@`"`D#X":^B`!"F
+M@@`"EF0``)>E`"B7I@`JEB<``)8"```"0/@)KZ(`$*:"``"/OP!$C[0`0(^S
+M`#R/L@`XC[$`-(^P`#`#X``()[T`2(^J`!`PQO__,(3__R0#`&1P@R`"``8P
+M0)2B``!P0Q`")$+_]@""$"L00``%`*8P(92B``"E0@```^``"*3B``"4PO_^
+M)`,`9'!#$`(D0@`*`$00*Q!```T`IA`KE,+__J5"```#X``(I.(``*5#```#
+MX``(I.,``)2B``"DX@``E*(``@/@``BE0@``$$``%``$%``D"`!D``),`X2B
+M``!P2!`"`$D0(R1"``DL0@`3%$#_[I2C``"4H@`"<$@0`B1"__8`@A`K%$#_
+MZP`````DI0`"`*80*Q1`__```````^``"```````@#`EE,(!U#!"`/`D0O_0
+M+$(`0!!``!(DQ2P0/`0``"2$($",@P`$K,,L$``#$,``0Q`A``(0@"2$``@`
+M1!`AK,(L+"0"``&LPBPH)`(`%*S"+!PD`@!5`^``"*S"+"`\!```)(0>T(R#
+M``2LHP````,0P`!#$"$``A"`)(0`"`!$$"&LH@`<)`(``:RB`!@D`@`4K*(`
+M#"0"`",#X``(K*(`$">]_^BOOP`4K[``$`"`&"648@'4,$(`\"1"_]`L0@!`
+M$$``%@"@@"6,8BRP`$#X"20%``<\`P`!)&/;)`!`("4D!0`!)`8`)`!@^`D`
+M`#@E``!()20(`&L``#`E)`,``11#`"(D!P!K)`@`4R0'`%,D`@`W$```':X"
+M`!",8BRP`&`@)0!`^`DD!0`'/`,``21CVR0`0"`E)`4`!B0&`"4`8/@)```X
+M)0``2"4D1``$)`,`,CA"`#\`8$`E`()`"R0#`$``8#`E``(P"B3'`#(D`P`4
+M``(8"ZX#``PDQ``C),,`-P""&`JN`P`0C@4`!`"I$"L!!1@K`$,0)1!```0`
+M`"`E`*88*P#E$"L`8B`E`(`0)8^_`!2/L``0`^``"">]`!@GO?_PA((O](R#
+M+_``0Q`AC(4`%#0#@```HR@A``(20#!"?@`T0H``K*(9,"0"``&L@B_$`^``
+M"">]`!`GO?_@K[\`'*^R`!BOL0`4K[``$`"`B"4"()`E)C`L$(XC+"@08`!%
+M```0)8XC+\0D`@`!%&(`0#0#@`".0@`4`$,0(8Q#&3`P8H``%$``.@`#)D(`
+M`Q7",$(``R0#``(40P`,K@0`!)9"`=(L0@!"%$``!0````"6(A*:`$00(1``
+M``2N`@`$C@(`!"1"``6N`@`$ED(!U#!"`/`D0O_0+$(`0!!```P\`@`!)$(#
+M8`!`^`D"0"`EC@0`!(X#`!0`@Q`K%$```P"#$",0```"K@(`!*X```2N("_$
+M/`(``21"_LP"0"`E`$#X"0(`*"440``1/`(``21"`8`"0"`E`$#X"0(`*"40
+M0``+/`(``21"`;`"0"`E`$#X"0(`*"480``%)`(``JXB+\0D`@`!KB(OV*X@
+M+\".(B_$C[\`'(^R`!B/L0`4C[``$`/@``@GO0`@C*,`!(RB``P`0Q`K$$``
+M!0``("6,H@`0`&(0*Q1```(`````)`0``0/@``@`@!`E`*`X)92"`=0P0@#P
+M)$+_T"Q"`$`\`P``%$```R1H($`\`@``)$@>T(SD````!!#``$00(0`"$(`!
+M`A`A)$(`"*SB`!R,X@`$C.,`$`!#$"L40``D`````!"``%,D`O__C.(`!*SB
+M``B,XP`0`$,0*Q1``!H`8$@EC.(``!!``!<`````C.(``"1&__^LY@````8@
+MP`"&("$`!""``(@0(8SE`!R,0P`8C*(`$`!B&",``QA`C.(`"`!#$".LX@`(
+M`00@(22$``@`21`K%$```ZSD`!P4P/_K``````/@``@D`@`!C.(`!(SC``P`
+M8A@K%&``+0``$"6-`P``)&/__XSD```0@P`H)`+__HSC``2LXP`(C.(`#`!`
+M2"4`0Q`K%$``(20"``*-`P``)&/__XSB````0"`E`$,0*Q!``!HD`@`")(8`
+M`:SF````!B#``(8@(0`$((``B!`AC.4`'(Q#`!B,H@`0`&(8(P`#&$",X@`(
+M`$,0(ZSB``@!!"`A)(0`"`$B$"L40``&K.0`'(T"```D0O__`,(0*Q1`_^D`
+MP"`E)`(``@/@``@`````)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`
+MB"4F,BP0KB`L)(XB++``0/@))`4`!SP#``$D=-LD`$`@)20%``$D!@`D`H#X
+M"0``."4`0)@E)`(``19B`"&/OP`DCB(L+(10``".(BRP`B`@)0!`^`DD!0`'
+M`$`@)20%``0D!@`@`H#X"0``."42$P`+`$`8)1(```<D`@`"$@(`"20"``,2
+M`@`+C[\`)!````V/M``@$```":Y``!00```'KD,`%``#$$`D0O_[$````ZY"
+M`!0``Q!`KD(`%(^_`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_
+MX*^_`!ROL@`8K[$`%*^P`!``@)`E`,"()0#@@"4\`@``)$(```"@("4`0/@)
+M`B`H)0!`."4F!O__``8PPB80__\:(``?,A``!R0*``@D"0`!CZ(`,``"0,`"
+M$1@A*&(`"0%"&`H`:1@$)&/__P()$`0D0O__`&(8)@$#&`0`!BB``+(H(0`#
+M(">,H@```((@)`('$`0!`A`$`$,0)`!$$"6LH@```C`0(211__@!4!`C`$<X
+M!@``@"4>(/_G),8``8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_Z"OOP!8
+MK[<`5*^V`%"OM0!,K[0`2*^S`$2OL@!`K[$`/*^P`#@`H+@EEN(``C!"0``0
+M0``'`("8)3P"```D0@```$#X"20%`@`0```4`$"0)9;B``(P0H``$$``!SP"
+M```D0@```F`@)0!`^`DD!00`$```"@!`D"66XP`",&,`$"0&`0`D!0`")$(`
+M``)@("4`0/@)`,,H"@!`D"6.0@``&$``/0``B"4\`@``)%8``">T`"@T%8<`
+M`!$00`!1$"$``A"`)$(`(`)"@"&2`@`(``(0@"1"1P`L0A``$$``&0)@("62
+M!P`+KZ``$`)`*"4"P/@))`8`#J^B`"B3I``HDH(``0`"$@``@B`EDH(``@`"
+M%```@B`EDH(``P`"%@``@B`ED@,`"``#&(".8@`4`$,0(0!5$"&L1```$```
+M$B8Q``$`$8!``A&`(0`0@(`F$``@`E"`(9('``NOH``0`D`H)0+`^`DD!@`.
+MD@0`"``$((".8P`4`&08(0!U&"&L8@``)C$``8Y"```"(A`J%$#_R@`1$$"6
+MX@`",$(`$!1``'./OP!8/`(``"1"```"8"`E`$#X"20%``@`0)`ECD(``!A`
+M`&D``(@E/`(``"16```GM0`L)!<``2>T`#``$1!``%$0(0`"$(`D0@`@`D(8
+M(9!B``@``B"`-`*'``""@"&08@`%%$``4R2"1P`L0A``$$``%@)@("609P`+
+MKZ``$`)`*"4"P/@))`8`#J^B`"R3HP`LDJ(``0`"$@``8A@EDJ(``@`"%```
+M8A@EDJ(``P`"%@``8A@ECF(`%`!0$"&L0P``$```#@`1$$``$1!``%$0(0`"
+M$(``4A`AD$<`*Z^@`!`"0"@E`L#X"20&``Z.8P`4`'`8(:QB````$1!``%$0
+M(0`"$(`D0@`@`D(8(9!B``D00``G``(0@`("@"$F`L``+$(0`!!``!8"8"`E
+MD&<`"Z^W`!`"0"@E`L#X"20&``ZOH@`PDZ,`,)*"``$``A(``&(8)9*"``(`
+M`A0``&(8)9*"``,``A8``&(8)8YB`!0`4!`AK$,``!````XF,0`!`!$00`!1
+M$"$``A"``%(0(9!'`"NOMP`0`D`H)0+`^`DD!@`.CF,`%`!P&"&L8@``)C$`
+M`8Y"```"(A`J%$#_GP`1$$"/OP!8C[<`5(^V`%"/M0!,C[0`2(^S`$2/L@!`
+MC[$`/(^P`#@#X``()[T`8">]__",@@`4-`.```!#$"&,0@`<,$<_@)2B``(P
+M0D``$$``!R0*`00\"Q^`/`8`&R0%`!,D"`VL$```!R0)`!0D"@#2/`L?@#P&
+M`#8D!0`))`@-2"0)``J,@P`4-`*```!B&"$`IQ`E`$80)0!+$"6L8@`<C((`
+M%*Q*$'",@@`4K$@0L(R$`!2,@A#P/`/_\#1C`_\`0Q`D``D:@`!#$"6L@A#P
+M`^``"">]`!`GO?_(K[\`,*^S`"ROL@`HK[$`)*^P`"``@)@E`*"`)8YC+$0\
+M!7__-*7__SP"```D0@```$#X"0!E*"0`0"@ECF(`%(Q&`#`PT0/P`!&)`@(@
+MD"4N(@`"+$(``1(```4"0I`C)`(`)0!1$",``A!"`B*0(1)1``<D`_P/CF0`
+M%`##&"0`$A$`,$(#\`!B&"6L@P`P/`(``"1"````0/@)`F`@)0)1$"8``A`K
+MC[\`,(^S`"R/L@`HC[$`)(^P`"`#X``()[T`.">]_^BOOP`0`*`X)0"`0"64
+M@P'H`.,8*A!@``D``!`E``<I``"G*",`!2B``04H(3P"```D0@```$#X"22E
+M+."/OP`0`^``"">]`!@GO?_HK[\`$`#`0"4`@#@EE(,!Z`"C&"H08``*```0
+M)0`%,0``Q3`C``8P@`#F,"$\`@``)$(```$`*"4`0/@)),8LX(^_`!`#X``(
+M)[T`&">]_]"OOP`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("@)0"@D"4`
+MP*@E)H,!X"0"``(20@`0)!,`"RY"``,00``&)`(``R0"``$20@`@)`+__Q``
+M`%J/OP`H$D(`##P"``4D`@`$$D(`#B0"__\0``!3C[\`*)1Q``@F,?__/`(`
+M!31"`,`0```H`F*8)91Q``@F,?_^-$(!P!```","8I@EE'$`""8Q__T`$1$`
+M`%$0(P`"$(``1!`AC$(LY!!``!H`````$```/"0"__^48@`($$``$0``B"6,
+M@BSD$$``#0````"49@`()(4`!"8Q``$")A`J$$``!P`1$0``41`C``(0@`!%
+M$"&,0BS@%$#_]P````"48@`(%B(``P`````0```E)`+__P`1$0``41`C``(0
+M@`""@"$F$"S@C@,`!!1@`!TD`O__/`(``"1"```"`"`E`$#X"20%`#P6H``-
+MKA(`!*X3``PD`@`"K@(`%"0"__^N`@`8)`(#_ZX"`!PD`@`*I@(`(*8"`"(0
+M```)K@``-(ZB`#"N`@`T/`(``"1"```"@"`E`B`H)0!`^`D"H#`E`B`0)8^_
+M`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`,">]__``@#@EC(8`
+M%(R%+,PPI0/_C((LU``"%``\`P/_`$,0)`"B*"6LQ0"DC.8`%(R%+-`PI0/_
+MC((LV``"%```0Q`D`*(H):S%`*B,Y0`4C*,`K"0"_```8A@DC((LW#!"`_\`
+M8A@EK*,`K`/@``@GO0`0)[W_Z*^_`!``H#@E`(`P)92#`>@`XQ@K$&``(```
+M$"4`!Q$``$<0(P`"$(``PB@A)*4LX(RC``008``8```0):R@``0D`P`!`.,8
+M!``#&">,PBS,`&(0)*S"+,R,PBS0`&(0)*S"+-",PBS4`&(0)*S"+-2,PBS8
+M`&(0)*S"+-B,PBS<`&(8)#P"``$D0@S$`$#X":S#+-PD`@`!C[\`$`/@``@G
+MO0`8)[W_B*^_`'``@%@E`*!0)0%@2"6-9!(TE6,!Z`%#&"L08`)!```0)0`*
+M$0``2A`C``(0@`$B,"$DQBS@C,,`!!!@`CDD`@`!C,,`&"0"__\48@",````
+M`!"``'XD`P"@E((``C!"`*`40P!Z)`,`'Q```'HD!``!,(0#_XS"`!P``A*`
+M-&/\``!#$"0`@B`EC,(`%``"%0`\`P_P`$,0)`""("6OI`!`DZ,`0">D`$"0
+M@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"6-8@`4`$40(:Q#
+M$$`0``!^``HH@)3#`"(``QD`,&,`\)3"`"`P0@`/`&(8)3P"``@T0B```&(8
+M):^C`$23HP!$D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+MC6(`%`!%$"&L0Q"`$```=R0%"``T8___`(,8)(S"`"@``A8``&(8):^C`$B3
+MHP!()Z0`2)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)8UB
+M`!0`2!`AK$,(P!```'4D`O_P-$+__P!B$"0\`P$``$,0):^B`$R3HP!,)Z0`
+M3)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)8UB`!0`2!`A
+MK$,)`!```'<`"D"`C,(`+#1C__\`0Q@D``(0*P`"%0``0Q`EKZ(`4).C`%`G
+MI`!0D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EC6(`%`!(
+M$"&L0Q#`$```;XS"`#`D`P`/)`0``0"#$"L00``*``HH@``$$$`T1``!`(,0
+M*Q1`__T`!!!`$````P`**(",Q``8``HH@"2BT$`L0A``%$#_>#P#``\`H!`E
+MC64`%`"B*"$PA`/_C,(`'``"$H`T8_P``$,0)`""("6,P@`4``(5`#P##_``
+M0Q`D`((@):RD$$``"BB`)*+0@"Q"$``40/^`)Z0`1`"@$"6-9``4`((@(93#
+M`"(``QD`,&,`\)3"`"`P0@`/`&(8)3P"``@T0B```&(8):R#$(`D!0@`C,0`
+M)!"``!<D!P$```I`@"4"R,`L0A``%$#_@SP#`/\!`!`EC60`%`""("&,PP`D
+M/`(`_S1"__\`8A@DC,(`*``"%@``8A@EK(,(P"0"__``HB@D-*4``8S#`"@T
+MH@$``$,H"XS#`#`08``/``I`@"4"R0`L0A``%$#_@3P"`/\!`!`EC60`%`""
+M("$`8!`E/`,`_S1C__\`0Q`D/`,!``!#$"6L@@D```I`@"4"T,`L0A``%$#_
+MASP#``\!`!`EC60`%`""("&,P@`L-&/__P!#&"0``A`K``(5``!#$"6L@A#`
+MC,(`,!!```0THP(`C,(`##!"`"``8B@+C,(`##!"`$`00``#)`+_\`"B*"0T
+MI0`",*(`#Q!```\`````C,(`##!"`0`00``#)`+_OQ````(TI0!``*(H)(S"
+M``PP0@"`$$```R0"_]\0```"-*4`(`"B*"2,P@`,/`,``0!#$"000``"/`(`
+M(`#B."6,P@`,/`,`@`!#&"0TY`(``(,X"SP#``0`0Q`D$$```SP"``(0```&
+M`.,X)8S#``P`8A@D`.(0)3AC````0S@+C,0`##P"``@`@A`D-.-```!B.`L\
+M`@`0`((@)`#B$"4XA````$0X"XS#``0D`@`"$&(`!20"``,08@!<`````!``
+M`'6,P@`X-*4`HCP"`"40``!P`.(X)3P"`0``@A`EKZ(`5).C`%0GI`!4D((`
+M`0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EC6(`%`!($"&L0PD`
+M$```7#P"``2OI0!8DZ,`6)""``$``A(``&(8)9""``(``A0``&(8)9""``,`
+M`A8``&(8)8UB`!0`2!`AK$,)P!```%P`"BB`KZ<`7).C`%R0@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"6-8@`4`$40(:Q#$0`0``!5C,(`
+M-(UB`!0`8A`AC$()P*^B`&"3HP!@)Z0`8)""``$``A(``&(8)9""``(``A0`
+M`&(8)9""``,``A8``&(8)31C$`"OHP!DDZ,`9">D`&20@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6-9``4``H0@`!$$"&L0PG`$```8(S"
+M``R,P@`P%$``%C2E`&(\`@``/`,``(Q"``",8P```$,0(XTC+^0`8B`C/`(`
+M`(Q"````@B`C``I`@"4"R0`L0A``%$#_F@`$(H`!`!`EC6,`%`!B&"$\`@$`
+M`((0):QB"0`\`@`$`.(X)8S"`#@P0@`!$$```CP"`"0`XC@E``I`@"4"R<`L
+M0A``%$#_FR>D`%@!`!@EC6(`%`!#$"&L10G```HH@"2BT0`L0A``%$#_HB>D
+M`%P`H!@EC6(`%`!#$"&L1Q$`C,(`-!!``"L`"A!`C6,`%"1"`%"L8@L`C6,`
+M%(S"`#2L8@L$C6,`%"0"``FL8@L(``H8@"1BR<`L0A``%$#_G0````"-8P`4
+M``H0@`!#&"$D0LG`+$(0`!!``!`D90G`C&()P*^B`&B3HP!H)Z0`:)""``$`
+M`A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)1````8T8A``C6(`%``*
+M&(``8A@AC&()P#1"$`"LH@``C,(`##!"``$00``&)`(``0%"$`2-(RS,`$,0
+M)1````:M(BS,`4(0!``"$">-(RS,`$,0)*TB+,R,P@`,,$(``1!```8D`@`!
+M`4(0!(TC+-``0Q`E$```!JTB+-`!0A`$``(0)XTC+-``0Q`DK2(LT(S"``PP
+M0@`"$$``!B0"``$!0A`$C2,LU`!#$"40```&K2(LU`%"$`0``A`GC2,LU`!#
+M$"2M(BS4C,(`##!"``000``&)`(``0%"$`2-(RS8`$,0)1````:M(BS8`4(0
+M!``"$">-(RS8`$,0)*TB+-B,P@`,,$(`"!!```8D`@`!`4(0!(TC+-P`0Q`E
+M$```!JTB+-P!0A`$``(0)XTC+-P`0Q`DK2(LW#P"``$D0@S$`6`@)0!`^`D`
+MP"@E)`(``8^_`'`#X``()[T`>`"`&"4`!2"`)(+(`"Q"$``00``1)[W_Z(QB
+M`!0`1!`AC$((`*^B`!"3HP`0)Z0`$)""``$``A(``&(8)9""``(``A0``&(8
+M)9""``,``A8`$```!0!B$"4`!1"`C&,`%`!B&"&,8@@``^``"">]`!@GO?_H
+M``4X@"3BR``L0A``$$``$@"`0"6OI@`0DZ,`$">D`!"0@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6``!B&"6-`@`4`$<0(:Q#"``0```&)`(``0`%
+M&("-`@`4`$,0(:Q&"``D`@`!`^``"">]`!@GO?_PC(,`%"0"``$`HA`$K&((
+M0"0"``$#X``()[T`$``%&(`D8LH`+$(0`!!```@GO?_HC((`%`!#$"&,0@H`
+MKZ(`$).B`!`0```&,$(``P`%$(",@P`4`&(8(8QB"@`P0@`#%$``!B0#``&,
+M@@`4`*,8!(Q""$``8A@D``,0*P/@``@GO0`8)[W_P*^_`#BOM0`TK[0`,*^S
+M`"ROL@`HK[$`)*^P`"``@(@E`*"H)8XC`!0D`@`!`J(0!*QB"(`D$P/H/`(`
+M`"12```\`@``$```!"10```"`/@))`0`9"9S__\28``%`B`@)0)`^`D"H"@E
+M%$#_^``````\`@``)$(```(@("4`0/@)`J`H)1!``%<`````CB0!S#B#``<L
+M8P`!.((`"RQ"``$`8A@E%&``#```,"4D`P`*$(,`"20"``D0@@`'`````!2#
+M`$@`````EB(!T"Q"``000`!$`````#0%@``\"``*-0@`9#P'``&.(@`4`$40
+M(8Q$`$RL2`$`CB,`%`!E&"$`!!*",$+__P!'$"6L8@#\CB(`%`!%$"&,0@!,
+M``(2@@`$(H(01``%`````"3&``$LP@`"%$#_[`````".)``4-`*```""("&,
+M@@!(/`,`0`!#$"6L@@!(/`(``"1"````0/@))`0`R(XD`!0T`H```((@(8R"
+M`/P\`__^-&/__P!#$"2L@@#\)!``9#P"```D5```/`(``!````,D4@```D#X
+M"20$``H"("`E`H#X"0*@*"400``#)A#__Q8`__@`````CB0`%#0"@```@B`A
+MC((`2#P#_[\T8___`$,0)*R"`$B.(@`4K$`(@``3$"N/OP`XC[4`-(^T`#"/
+MLP`LC[(`*(^Q`"2/L``@`^``"">]`$"/H@`4CZH`((^G`"2/J0`HCZL`+(2#
+M+_0`0Q`A+$0`0"0#`#\`9!`*,,8/_P`"%```PC`E``D10C!"``$``A7``$80
+M)0`'/D`\`QX``.,X)`!'&"4Q(@`!$$```P"@0"4\`@$``&(8)0`)$0(P0@`!
+M``(70`!#$"6I`@`(N0(`"X^C`!```QT`CZ8`/``&-D"/I0`T``4O0(^D`#@`
+M!";```D00C!"``$``A8``&88)0!E&"4`9!@E`$,0):D"``RY`@`/CZ,`'``#
+M'``\`@`/`&(8)``)$D`P0H```$,0):D"`!"Y`@`3CZ(`&*D"`!2Y`@`7)`+_
+M_Q%"``\`"A-`B00`#)D$``\\`P`/-&/@``!#$"0`@B`EJ00`#+D$``^)`@`(
+MF0(`"SP#0```0Q`EJ0(`"+D"``LQ(@`,$$``'SP#?P`T8_\``6,8!S!C``$0
+M8``;```0)3$B``@\!(````(@"HD#``B9`P`+``D0@C!"``$``A6``&08)0!#
+M$"6I`@`(N0(`"XD#`!"9`P`3CZ(`,#!"?_\`8A@EJ0,`$+D#`!.)`@`4F0(`
+M%P`+'0``0Q`EJ0(`%+D"`!<D`@`!`^``"`````"/J``4$.``$(^I`!R(HP`0
+MF*,`$P`'%0`\!`#P`$00)`!B&"4T8X``J*,`$+BC`!.(H@`4F*(`%P`&&4``
+M0Q`EJ*(`%+BB`!<1```0``@6`(BC`!"8HP`3/`0/``!$$"0`8A@E-&.``*BC
+M`!"XHP`3B*,`%)BC`!>/H@`0``(2@`!B&"6HHP`4N*,`%Q$@``X`"1\`B*(`
+M$)BB`!,`0Q`E-$*``*BB`!"XH@`3B*,`%)BC`!>/H@`8``(3P`!B&"6HHP`4
+MN*,`%P/@``@D`@`!B*(`")BB``L\`R```$,0):BB``BXH@`+`^``"`````"/
+MH@`0$.``"X^C`!2(HP`,F*,`#RQ"``$``A,``&88)0!#$"6HH@`,N*(`#Q``
+M`!L`````$$``#P````"HH``(N*``"ZBF``RXI@`/B&(`$)AB`!.HH@`0N*(`
+M$XAB`!288@`7J*(`%+BB`!<0```+````````&"6HHP`(N*,`"S3"$`"HH@`,
+MN*(`#ZBC`!"XHP`3J*,`%+BC`!>HH``<N*``'XBB`!R8H@`?J*(`&+BB`!L#
+MX``()`(``8BC`!R8HP`?,&,``1!@`),D`@`/B*(`')BB`!\P0A_^``(00J3"
+M``"(H@`8F*(`&P`"%`*DP@`"H,``!(BB`!B8H@`;,$(``11``!<`````B*(`
+M&)BB`!LP0@`"$$```B0"``&@P@`$B*(`&)BB`!LP0@`($$``!`````"0P@`$
+M-$(``J#"``2(H@`8F*(`&S!"``000``$`````)#"``0T0@`$H,(`!(BB`!R8
+MH@`?``(50C!"``.@P@`+,$,`_R0"``$08@`2*&(``A!```4D`@`"$&``"0``
+M```0```@`````!!B`!$D`@`#$&(`%@`````0```:`````(BB`!28H@`7,$(`
+M'Q```!6@P@`%B*(`%)BB`!<P0@/@``(10C1"`(`0```.H,(`!8BB`!28H@`7
+M,$)\```"$H(T0@"`$```!Z#"``6(H@`4F*(`%P`"$\(P0@`?-$(`@*#"``6(
+MH@`<F*(`'P`"$T*@P@`&B*(`&)BB`!LP0@#P``(1`J#"``>(H@`8F*(`&S!"
+M#P```A("H,(`")##``LD`@`"$&(`$@`````H8@`#$$``!B0"``,D`@`!$&(`
+M$P`````0```8`````!1B`!8`````B*,`$)BC`!,``QX",&,`#Y#"``@`0Q`A
+MH,(`"(BC`!"8HP`3``,=`C!C``^0P@`(`$,0(:#"``B(HP`0F*,`$P`#'`(P
+M8P`/D,(`"`!#$"&@P@`(B*(`&)BB`!LP0O````(3`J#"``F(HP`<F*,`'SP"
+M`0``8A@D+&,``20"``(`0Q`CH,(`"@``$"4#X``(`````(RB``",@T:@`$,0
+M)*RB`````A`GC(-&H`!#$"0#X``(K()&H```````````)[W_V*^_`"2OL``@
+M`("`)3P"```D0@```$#X"28%+(2.`@`4-`.```!#$"&L0`$DC@(`%`!#$"&L
+M0`$HC@(`%*Q``$".`@`4`$,0(3P#``*L0P$PC@(`%#0#@```0Q`A/`,"`*Q#
+M`3B/OP`DC[``(`/@``@GO0`H)[W_V*^_`"2OL``@`("`)8X#`!0D`@`&K&(`
+M0#P"```D0@```$#X"28%+(2.`@`4-`.```!#$"&L0`$DC@(`%`!#$"&L0`$H
+MC[\`)(^P`"`#X``()[T`*`"`."4``#`E)`@`6'#(&`(`9Q`AE$0P*)2C```0
+M@P`4`,`0)7#($`(D0C`H`.(8(91B```40``*),8``23&__^4H@``I&(``)2B
+M``*D8@`"D*(`!*!B``0#X``(`,`0)2S"`$`40/_J<,@8`@``$"4#X``(````
+M``/@``B,@C`D)[W_Z*^_`!2OL``0`("`)3P"```D0@```$#X"28%+(0F`BQ(
+MC[\`%(^P`!`#X``()[T`&">]_]"OOP`LK[(`**^Q`"2OL``@`("()0"@D"4"
+M((`ED@(!XP`"$<*N`C`</`(``"1"```F!#`H`$#X"20%%@```#`E)`<`6"08
+M``<D#P`")`X!]"0(`,@D#0!D)`P`*"0+``<\"@"_-4K^##P)`+\U*?\XCB(!
+MS"Q"``<00``$<,<8`@!P$"$0```#H%@P,`!P$"&@3S`P<,<@`B8%``0`A1`A
+MK$XP."2#,$`"`Q`AK$@```"C&"&L:```)(,P2`(#$"&L30```)`0(:Q,,%``
+MHQ@AK&L``"2",#`"`A`AH$``!*!```600P``H$,``J!```..`C`<$$``!`"%
+M$"&L2C!H`)`0(:Q),'`DQ@`!+,(`0!1`_]<`````C@(P'!!```XT`X``CB(`
+M%`!#$"&.`S!LK$,!+(XB`!0T`X```$,0(8X#,'"L0P$T/`(``"1"````0/@)
+M`B`@)20"`&020``%K@(P((X",!@T0@`!$```!:X",!B.`C`8)`/__@!#$"2N
+M`C`8C[\`+(^R`"B/L0`DC[``(`/@``@GO0`P)[W_V*^_`"2OL``@`("`)8X"
+M,!P00``+/`(``"1"````0/@)`````(X"`!0T`X```$,0(:Q``2R.`@`4`$,0
+M(:Q``32/OP`DC[``(`/@``@GO0`H)[W_H*^_`%BOL0!4K[``4`"`B"4"((`E
+M+*(`!Q!``:B."#`D/`(``"1"(=``!1B``&(8(8QB````0``(``````#`."4L
+MPP`%$&`!H```$"6.)0`4-`*```"B*"&,I!A0/`+P#S1"__\`@B`D``<0@`!0
+M$"&,0D8H``(5`#P##_``0Q`D`((@):RD&%".)``4-`*```""("&,@QA<)`*`
+M?P!B&"0`!Q"``%`0(8Q"1E```A'`,$)_@`!B&"6L@QA<CB4`%#0"@```HB@A
+MC*087#P"_\`T0G__`((@)``'$(``4!`AC$)&/``"$\`\`P`_-&.```!#$"0`
+M@B`EK*087(XE`!0T`H```*(H(8RD&%@\`OP#-$+__P""("0`!Q"``%`0(8Q"
+M1F0``A2`/`,#_`!#$"0`@B`EK*086)$"``D`1Q`K$$``!0````".`BQ()$(`
+M`1````BN`BQ(D0(`"0#B$"L00``$`````(X"+$PD0@`!K@(L3!```5.A!P`)
+M)`,`?Z^C`!`D`@`RKZ(`%*^C`!@D`@`HKZ(`'*^C`"`D`@!-KZ(`)*^C`"@D
+M`@!`KZ(`+"0"`!^OH@`P)`(`$*^B`#0D`@`_KZ(`."0"`#"OH@`\``8P*XXE
+M`!0T`H```*(H(8RD&&P\`O_@-$(__P""("0`!AB`)Z(`$`!#$"&,0@````(3
+M@#P#`!\T8\```$,0)`""("6LI!ALCB4`%#0"@```HB@AC*08;#P"\!\T0O__
+M`((@)``&&(`GH@`8`$,0(8Q"`````A5`/`,/X`!#$"0`@B`EK*08;(XE`!0T
+M`H```*(H(8RD&&@\`O\!-$+__P""("0`!AB`)Z(`(`!#$"&,0@````(40#P#
+M`/X`0Q`D`((@):RD&&B.)0`4-`*```"B*"&,I!AH/`*`_S1"__\`@B`D``88
+M@">B`"@`0Q`AC$(````"%@`\`W\``$,0)`""("6LI!AHCB4`%#0"@```HB@A
+MC*,8:"0"_^``8A@D``8@@">B`#``1!`AC$(``#!"`!\`8A@EK*,8:(XE`!0T
+M`H```*(H(8RC&&PD`L#_`&(8)">B`#@`1!`AC$(````"$@`P0C\``&(8):RC
+M&&P0P``)-`*``(XB`!0T`X```$,0(8Q#&&PT8P`!K$,8;!````@LPP`!CB0`
+M%`""("&,@AAL)`/__@!#$"2L@AAL+,,``9$"``P08@#/)`(``1#```4`````
+MC@(L6"1"``$0```$K@(L6(X"+%PD0@`!K@(L7"S"``$0``#"H0(`#"0"``BO
+MH@`0)`(`!J^B`!0`!C`KCB4`%#0"@```HB@AC*,B""0"_\``8A@D``8@@">B
+M`!``1!`AC$(``#!"`#\`8A@EK*,B")$"``T0P@"N)`(``1#```4`````C@(L
+M8"1"``$0```$K@(L8(X"+&0D0@`!K@(L9!```**A!@`-KZ``$"0"``2OH@`4
+M)`(`"*^B`!@`P#@E+,,``Q!@`)H``!`ECB4`%#0"@```HB@AC*086#P"__PT
+M0@__`((@)``'$(`#HA`AC$(`$``"$P`\`P`#-&/P``!#$"0`@B`EK*086)$"
+M``L`1Q`K$$``!0````".`BQH)$(``1````BN`BQHD0(`"P#B$"L00``$````
+M`(X"+&PD0@`!K@(L;!```'BA!P`+/`(``"1#(;",0B&PKZ(`$(QB``2OH@`4
+MC&(`"*^B`!B,8@`,KZ(`'(QB`!"OH@`@C&(`%*^B`"2,8@`8KZ(`*(QB`!RO
+MH@`L`,`H)2S#``@08`!C```0)8XD`!0T`H```((@(8R#&20D`O\!`&(8)``%
+M$(`#HA`AC$(`$``"$$`P0@#^`&(8):R#&221`@`*`$40*Q!```4`````C@(L
+M4"1"``$0```(K@(L4)$"``H`HA`K$$``!`````".`BQ4)$(``:X"+%00``!$
+MH04`"A3``!0D`__]C@(P&`!#$"2N`C`8/`(``"1"````0/@)`B`@)3P"```D
+M0@```$#X"0(@("4D!?[_/`,``"1C```"("`E`&#X"0!%*"00```P)`(``8X"
+M,!@P0@`"%$``+"0"``&.`C`<$$``&CP"```D0@```$#X"0(@("4D!?[_/`,`
+M`"1C```"("`E`&#X"0!%*"2.(@`4-`.```!#$"&.`S!LK$,!+(XB`!0T`X``
+M`$,0(8X#,'"L0P$T/`(``"1"````0/@)`B`@)1````J.`C`8)$(```!`^`D"
+M("`E/`,``"1C```"("`E`&#X"31%`0".`C`8-$(``A````.N`C`8$````@``
+M$"4D`@`!C[\`6(^Q`%2/L`!0`^``"">]`&`GO?_8K[\`)*^P`"",D#`DK@``
+M$(R",!P00``K`(`H)8X#`!0\`@#``$,0*Q!```,\`@#`$````ZX``$0`0Q`C
+MK@(`1(X#`!P\`@#``$,0*A!```,\`@#`$````ZX``$@`0Q`CK@(`2(R"`!0T
+M`X```$,0(8X#`$2L0P$LC((`%#0#@```0Q`AC@,`2*Q#`32,@@`4-`.```!#
+M$"$\`P`"K$,!,(R"`!0T`X```$,0(3P#`@"L0P$X/`(``"1"````0/@))*4L
+MA*X``#RN``!`C[\`)(^P`"`#X``()[T`*">]_^"OOP`8K[$`%*^P`!``@(@E
+M`B`X)8XB,!@P0@`#)`,``Q1#`&".)1(TCC`P))(&``DLP@`$$$``!SP"```D
+M0@``)`4``0!`^`DDQ@`!$```5H^_`!B2!@`*D@(`"`#"$"L00``(/`(``"1"
+M```"("`E)`4`!0!`^`DDQ@`!$```2H^_`!B,XRR8,&(`?RQ"`$`D8P!_$$``
+M`P`#&<*,XBR8``(9PHX"`"@`0Q`J$$``#P````"2`@`,%$``&`(@("4\$```
+M)A```"0%``("`/@)```P)0(@("4D!0`%`@#X"0``,"40```PC[\`&(X"`"0`
+M0Q`J$$``%#P"``"2`@`,$$``!CP"```D0@```B`@)20%``(`0/@))`8``9(&
+M``LLP@`"$$``'SP"```D0@```B`@)20%``0`0/@)),8``1```!F/OP`8)$(`
+M``!`^`D"("`E)$+__BQ"``(00``2C[\`&)("``P40``&/`(``"1"```"("`E
+M)`4``@!`^`D``#`ED@(`"Q!```8\`@``)$(```(@("4D!0`$`$#X"0``,"6/
+MOP`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`8K[$`%*^P`!``@(@E`B`X)8XB
+M,!@P0@`#)`,``Q1#`#*.)1(TCC`P))(&``DLP@`$$$``!SP"```D0@``)`4`
+M`0!`^`DDQ@`!$```*(^_`!B,XRR8,&(`?RQ"`$`D8P!_$$```P`#&<*,XBR8
+M``(9PHX"`"0`0Q`J$$``##P"``"2!@`++,(``A!``!<\`@``)$(```(@("4D
+M!0`$`$#X"23&``$0```1C[\`&"1"````0/@)`B`@)21"__XL0@`"$$``"H^_
+M`!B2`@`+$$``!SP"```D0@```B`@)20%``0`0/@)```P)8^_`!B/L0`4C[``
+M$`/@``@GO0`@)[W_R*^_`#"OLP`LK[(`**^Q`"2OL``@`("()0"@@"4"()@E
+M/`(``21"(7``0/@)CB42-"0#`%AP0R`"`)&0(292,"BN,C`DCB,!W"0"``$4
+M8@`%)`/__8XB,!@T0@`"$```!*XB,!B.8C`8`$,0)*YB,!B.(P'<)`(``1!B
+M`"@"("`ECF(L>"1"``&N8BQX/!```"80```D!0`!`@#X"0``,"4"("`E)`4`
+M!0(`^`D``#`E`B`@)20%``0"`/@)```P)0(@("4D!0`"`@#X"0``,"4"("`E
+M)`4``P(`^`D``#`E/`(``"1"````0/@)`B`@)3P#```D8P```B`@)0!@^`DT
+M10$`/`(``21"*O@`0/@)`B`@)1```%^/OP`PCB(P&#!"``,D`P`#%$,`6H^_
+M`#`2```9/!```"80```"("`E)`4``0(`^`F21@`)`B`@)20%``4"`/@)DD8`
+M"I)&``P"("`E)`4``@(`^`DLQ@`!`B`@)20%``,"`/@)DD8`#0(@("4D!0`$
+M`@#X"9)&``L0```7CF(P'"80```"("`E)`4``0(`^`DD!@`$`B`@)20%``4"
+M`/@)DD8`"`(@("4D!0`"`@#X"20&``$"("`E)`4``P(`^`DD!@`!`B`@)20%
+M``0"`/@))`8``HYB,!P00``:/`(``"1"````0/@)`B`@)20%_O\\`P``)&,`
+M``(@("4`8/@)`$4H)#P"``$D0BKX`$#X"0(@("6.(@`4-`.```!#$"$\`P`"
+MK$,!,(XB`!0T`X```$,0(3P#`@"L0P$X$```#X^_`#`\`@`!)$(J^`!`^`D"
+M("`E/`(``"1"````0/@)`B`@)3P#```D8P```B`@)0!@^`DT10$`C[\`,(^S
+M`"R/L@`HC[$`)(^P`"`#X``()[T`.">]_]"OOP`LK[(`**^Q`"2OL``@`("0
+M)0"@@"4"0(@ECD(`%#0#@```0Q`AK$`!)(Y"`!0`0Q`AK$`!*#P"```D0@``
+M`$#X"28E+(2.`@``KB(LF(X"``2N(BR<C@(`"*XB+*".0@`4-`.```!#$"&,
+M10$LC$8!-#P#`,``HQ`D$$,``P##$"040P`HC[\`+(XP,"2.!`!$`*0@(XX"
+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
+M("$!`Q@AC&(``*R"1F`DI0`!**(`!11`_^P\`@``)$(```&`("4`0/@))`4`
+M`8^_`'`#X``()[T`>">]_Z"OOP!8K[4`5*^T`%"OLP!,K[(`2*^Q`$2OL`!`
+M`*"()0#`H"4`X(`EC[4`<#"3__\\`@``)$(```!`^`DD!$:H`$"0)19```0"
+M8"@E)`,``A```;JNHP``K[``$*^U`!0\`@``)$(```)`("4"(#`E`$#X"0*`
+M."4"0(@E/`(``"1"``"N0@`P/`(``"1"``"N0@`T/`(``"1"``"N0@#L/`<`
+M`"3G``"N1P#X/`8``"3&``"N1@#T/`4``"2E``"N10#\/`0``"2$``"N1`$`
+M/`,``"1C``"N0P$$/`(``"1"``"N0@$4/`(``"1"``"N0@%L/`(``"1"``"N
+M0@%P/`(``"1"``"N0@&(/`(``"1"``"N0@&@KD8!J*Y'`:RN10&PKD0!M*Y#
+M`;@\`@``)$(```)`("4`0/@)```H)11```0F8_]Z)`(``Q```7*OH@`\+&,`
+M`CIB`)$L0@`!`&(8)1!@`!4\`K`0-$(`(`!0$",L0A``$$``"0````".(@`4
+M`%`0(SP#L!``0Q`AC$)`(*^B`"P0``!!DZ,`+(XB`!0`4!`C/`.P$`!#$"&,
+M0D`@$```.C!#`/\\`KO_-$+P(`!0$",L0A``$$``!SP#O`".(@`4`%`0(P!#
+M$"&,0C`@$```!:^B`#".(@`4`%`0(P!#$"&,0S`@/`*[_S1"\(``4!`C+$(0
+M`!!```<\`[P`CB(`%`!0$",`0Q`AC$(P@!````6OH@`TCB(`%`!0$",`0Q`A
+MC$,P@#P"N_\T0O"0`%`0(RQ"$``00``./`.\`(XB`!0`4!`C`$,0(8Q",)"O
+MH@`XDZ,`.">B`#B00@`!``(2``!B&"4``QH"$```!S!C`/^.(@`4`%`0(P!#
+M$"&,0C"0``(:`C!C`/\``Q$"KB(!S#!B``^F(@'0CB,!S"0"``448@`%)`(`
+M"Y8B`=`L0@`"$$``!20"``L08@`#)`(`#1```0^OH@`\CB(`%#0#@```0Q`A
+MC$(8&*8B`=(\`@``)$(```!`^`D"("`E%$``!#0#@``D`@`.$``!`:^B`#R.
+M(@`4`$,0(20#``>L0Q@`/`(``"1"````0/@)`B`@):8B`=0P0@#P)$+_T"Q"
+M`$`00``//`(``)8D`=0X@P`U.((`10`"$"L``Q`*$$``!R0"`$80@@`%)`(`
+M-A""``,D`@`-$```YJ^B`#P\`@``)$(```(@("4D!0#!`$#X"2>F`"@40``$
+MEZ(`*"0"``@0``#;KZ(`/"Q",`(00``$EZ(`*"0"``40``#5KZ(`/*9"$G`\
+M`@``)$(```(@("4D!0`<`$#X"2>F`"H40``$EZ(`*B0"``@0``#)KZ(`/!!`
+M``L\`@``)$(```(@("4D!0`;`$#X"2>F`"H40``$/`(``"0"``@0``"]KZ(`
+M/"1"```"("`E)`4`/P!`^`DGI@`H%$``!)>B`"@D`@`($```LZ^B`#RF0A)R
+M``"8)0``@"4\`@``)%0```(@("4F!0#``H#X"2>F`"@00`"FEZ(`*`)BF"8F
+M$``!+@(#0!1`__<"("`E-`+__Q)B``,D`@`'$```GJ^B`#PD`@`*ID(3YB0"
+M``.F0A7P``"`)20$`#0F1@`&)`,`"W($*`(`IA`AI$,3Z"80``$N`@`*%$#_
+M^W($*`(``(`E/`(``"1+(?`F2``"/`(``"1*(?@D"0`T)D<`#"0%``LF1@`(
+M`!`80`!R("$`:Q`AE$(``*2"%?@`:"`A`&H8(91B``"D@A7P<@D8`@!G$"&D
+M11:H`&88(280``$N`@`#%$#_\*1E%A`\`@``)$(```(@("4`0/@))D42<!1`
+M``,D`@`($```:Z^B`#R60A**$$``(R0#`!"6(@'4,$(`\!1#`"`\`@``CB(`
+M%#0#@```0Q`A)`-`!ZQ#&``\`@``)$(```!`^`DD!`?0/`(``"1"````0/@)
+M`B`@):8B`=:.(@`4-`.```!#$"$D`P`'K$,8`#P"```D0@```$#X"20$!]"6
+M(@'6,$(`\"0#`"`00P`#)`(`#1```$:OH@`\/`(``"1"```"("`E)`4`OP!`
+M^`DGI@`H%$``!)>B`"@D`@`($```.Z^B`#RF0A)TIB(""#P"```D0@```$#X
+M"0(@("440``$)`(`"R0"``@0```PKZ(`/(XC`<P48@`(```@)3P"```D0@``
+M`B`@)0!`^`DGI0`\$```"@!`("66(@'4,$(`\"1"_]`L0@!`$$```R0"``T0
+M```"KZ(`/*^B`#P0@``;`````(Y"+,2N(@'`/`(``"1"````0/@)`B`@)3P"
+M``$D0D",`$#X"0(@("440``$/`(``20"``D0```,KZ(`/"1".!``0/@)`B`@
+M)8Y",!@D`__]`$,0)*Y",!@0```,`B`0)20"``BOH@`\$D``!#P"```D0@``
+M`$#X"0)`("42H``"CZ(`/*ZB`````!`EC[\`6(^U`%2/M`!0C[,`3(^R`$B/
+ML0!$C[``0`/@``@GO0!@)[W_Z*^_`!",@@`0C$,`"!!@``:,10``)`(``1!B
+M``4``!`E$```"X^_`!`0```")*4`8"2E`'8\`@``)$(``"2$+#``0/@))`8`
+M!B0"``&/OP`0`^``"">]`!@```````````/@``@D`@`!``````````",@@`0
+MC$<`!```("4`!2A``,08(0#E$"&00@``H&(``"2$``$H@@`"%$#_^22E``$#
+MX``()`(``0```````````(!`)3P"O``T0B``C00`%`!$,",DPL`(+$(0`!!`
+M`"0GO?_```400"0%``,`12@$`(80(8Q"``BOH@`PDZ,`,">D`#"0@@`!``(2
+M``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"4`91@EKZ,`-).C`#0GI``T
+MD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@EC0(`%`!&$"&L
+M0P`($```(R0"``&-`@`4`$8@(0`%&$`D`@`#`&(0!``"."<`0"@E),+`""Q"
+M$``00``1)(D`"(R"``BOH@`XDZ,`.">D`#B0@@`!``(2``!B&"60@@`"``(4
+M``!B&"60@@`#``(6``!B&"4`9Q@D$```!@!E$"6-`@`4`$80(8Q"``@`XA`D
+M`$40):TB```D`@`!`^``"">]`$``@#@E/`*\`#1"(`",Y``4`$0P(R3"P`@L
+M0A``$$``)2>]_\``!1!`)`4``P!%*`0`!2@G`(80(8Q"``BOH@`PDZ,`,">D
+M`#"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6``!B&"4`91@DKZ,`
+M-).C`#0GI``TD((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E
+MC.(`%`!&$"&L0P`($```(20"``&,X@`4`$8@(0`%&$`D`@`#`&(0!``"*"<D
+MPL`(+$(0`!!``!`DB``(C((`"*^B`#B3HP`X)Z0`.)""``$``A(``&(8)9""
+M``(``A0``&(8)9""``,``A8``&(8)1````8`91`DC.(`%`!&$"&,0@`(`*(0
+M)#1"``"M`@``)`(``0/@``@GO0!``(!`)3P"O``T0B``C0,`%`!#.",DXL``
+M+$(0`!!``"`GO?_H`&<0(8Q"``"OH@`0DZ,`$">D`!"0@@`!``(2``!B&"60
+M@@`"``(4``!B&"60@@`#``(6`!```!0`8A@EKZ,`%).C`!20@@`!``(2``!B
+M&"60@@`"``(4``!B&"60@@`#``(6``!B&"6-`@`4`$<0(:Q#```0```3)`(`
+M`8T"`!0`1Q`AC$,``"0"``$`HA`$``(0)P!B&"0PP@`!`*(0!`!B&"4DXL``
+M+$(0`!1`_^,GI``4C0(`%`!'$"&L0P``)`(``0/@``@GO0`8)[W_Z`"`."4\
+M`KP`-$(@`(SF`!0`1B`C+*,`!A!@`!DD`O__)(+`!"Q"$``00``/`,00(8Q"
+M``2OH@`0DZ,`$">D`!"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6
+M`!````0`8A`EC.(`%`!$$"&,0@`$,$(`+P"B$`8P0@`!`^``"">]`!@GO?_0
+MK[\`*`"`0"4\`KP`-$(@`(T#`!0`0S@C).+`""Q"$``00``@`&<0(8Q"``BO
+MH@`@DZ,`(">D`""0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6`!``
+M`!4`8B`EKZ0`)).C`"0GI``DD((``0`"$@``8A@ED((``@`"%```8A@ED((`
+M`P`"%@``8A@EC0(`%`!'$"&L0P`($```&8T#+$2-`@`4`$<0(8Q$``@`!1!`
+M)`,``P!#&`0\`@`!-$+P``!#$"<`@B`D``43``""("40P``#-(2``#P"``$`
+M@B`E).+`""Q"$``40/_<`````(T"`!0`1Q`AK$0`"(T#+$0\!0$`/`(``"1"
+M```!`"`E`$#X"0!E*"6/OP`H`^``"">]`#`````````````````\`KP`-$(P
+M`(R%`!0`13`CC(,!S"0"``L08@`?)[W_Z"3"P+`L0A``$$``%`````",H@"P
+M)`/^`P!#$"0T0@`"KZ(`$).C`!`GI``0D((``0`"$@``8A@ED((``@`"%```
+M8A@ED((``P`"%@``8A@E`*80(1````BL0P"PC((`%`!&("&,0@"P)`/^`P!#
+M$"0T0@`"K((`L`/@``@GO0`8`(`P)3P"N_\T0O"0C,,`%`!#$",L0A``$$``
+M!R>]_^@\`KP`-$(PD(Q"``"OH@`0$```!9.B`!`\`KP`-$(PD(Q"```P0@#_
+M``(9`C!$``^,P@',%$,`!```*"64P@'0`$00)BQ%``$`H!`E`^``"">]`!@G
+MO?_8K[\`)*^P`"`\`@``)$(```!`^`D`@(`E$$``,S0#@`".`@`4`$,0(20#
+M`!^L0QAPC@(`%#0#@```0Q`A)`,`#:Q#&'2.`@`4-`.```!#$"$D`P`,K$,8
+M>(X"`!0T`X```$,0(20#``.L0QGPC@(`%#0#@```0Q`A)`,`!:Q#&?2.!0`4
+M-`*```"B*"&6`@'4,$(`\"1"_]`L0@!`)`,`&"0$`!0`@A@+K*,9^(X$`!0T
+M`H```((@(8R"`!PD`\!_`$,0)#1"`("L@@`<C@(`%#0#@```0Q`A)`,`/:Q#
+M`000```JC[\`)(X"`!0`0Q`A)`,`'ZQ#&'".`@`4-`.```!#$"$D`P!_K$,8
+M=(X"`!0T`X```$,0(20#``2L0QAXC@(`%#0#@```0Q`A)`,`#JQ#&'B.`@`4
+M-`.```!#$"$D`P`,K$,9\(X"`!0T`X```$,0(20#`/^L0QGTC@4`%#0"@```
+MHB@AE@(!U#!"`/`D0O_0+$(`0"0#`!@D!``4`((8"ZRC&?B/OP`DC[``(`/@
+M``@GO0`H)[W_V*^_`"2OL``@/`(``"1"````0/@)`("`)1!``#$T`X``C@(`
+M%`!#$"$D`P`!K$,!!(X$`!0T`H```((@(8R"`!PD`\!_`$,0)#1"#X"L@@`<
+MC@(`%#0#@```0Q`A)`,`'ZQ#&'".`@`4-`.```!#$"$D`P!_K$,8=(X"`!0T
+M`X```$,0(20#``2L0QAXC@(`%#0#@```0Q`A)`,`#*Q#&?".`@`4-`.```!#
+M$"$D`P#_K$,9](X%`!0T`H```*(H(98"`=0P0@#P)$+_T"Q"`$`D`P`8)`0`
+M%`""&`NLHQGXC[\`)(^P`"`#X``()[T`*`````````````````/@``@D`@`!
+M`^``"``````#X``(`````">]_^"OOP`<K[(`&*^Q`!2OL``0`*"()0#`*"4D
+M$``!$C``#0"`D"42(``&/`(``20"``(2(@`.```0)1```!./OP`<)$)*(`!`
+M^`D`````$```"P!`@"4\`@`!)$)**`!`^`D`````$```!JY1+[@\`@`!)$)*
+M,`!`^`D`````KE$ON`(`$"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`#X``(
+M```0)0/@``@``!`E```````````GO?^0K[\`;*^^`&BOMP!DK[8`8*^U`%RO
+MM`!8K[,`5*^R`%"OL0!,K[``2`"`B"6OI0!T`,"P):^G`'P"(*`EEL(``@`"
+M$<(P0P`!EL(``C!"`0`00``%``"H)11@`]HD`P`,$```");"``*6P@`"``(1
+MPCA"``$P0@`!%$`#TB0#``R6P@`"``(1@C!#``&6P@`",$(`(!!```4`````
+M%&`#R20#``P0```(/`(``);"``(``A&".$(``3!"``$40`/!)`,`##P"```D
+M0@```B`@)0!`^`D"P"@E`$#P)1/``[DD`P`,)`(`!H^C`'008@`++&(`!Q!`
+M``8D`@`(+&(``A!``[`D`P`,$```!8^E`'R/I`!T%((#JR0#``R/I0!\$*``
+M"P````".(@`4C$(10*^B`#0\`@``)$(```(@("4`0/@)`\`H)1````..)`',
+MKZ``-(XD`<PX@P`'+&,``3B"``LL0@`!`&(8)11@``V/H@!\)`,`"A"#``DD
+M`@`)$((`"(^B`'P4@P`;`````)8B`=`L0@`$$$``%P````"/H@!\$$``%```
+M``".)!(T$(``$0````"6PP``E((``!!B``T`````EL,``I2"``(P8P'P,$(!
+M\!1B``<\`@``)$(```(@("4`0/@)`L`H)11``WDD`@`!CB,`%#0"@```8A@A
+MC&0`6"0"``$`1"`*KZ0`.(QC``0\`@(@`&(8)*^C`#P\`@``)$(```(@("4`
+M0/@)CZ4`=#P"```D0@```$#X"0(@("4\`@``)$(```(@("4`0/@)`L`H)1!`
+M`UDD`P`#EL(``C!#`?`D`@%`$&(`("AB`4$00``/)`((P"0"`,`08@`F*&(`
+MP1!```8D`@#0)`(`H!!B`!TD`P`,$``#28^E`(`08@`A)`,`#!```T6/I0"`
+M$&(`&2AB",$00``&)`()0"0"`5`08@`,)`,`#!```SR/I0"`$&(`!20""5`0
+M8@`&)`,`#!```S:/I0"`)!<``1```!"OMP!`)!<``B0%``$0```,KZ4`0"07
+M``,D`@`"$```"*^B`$`D%P`$)`,``A````2OHP!`)!<`!20$``*OI`!`CB(`
+M%#0#@```0Q`A)`,`!ZQ#&````(`E/`(``"13(@`GL@`H`!`00`!0&"$``Q#`
+M`%,0(8Q$```D@L``+$(0`!!``!8`$!!```,00`!7$"$``A"``%,0(8Q"``"O
+MH@`HDZ,`*))"``$``A(``&(8)9)"``(``A0``&(8)9)"``,``A8``&(8)8XB
+M`!0`1!`AK$,``!````XFM0`!`%`0(0`"&,``<Q@ACB0`%(QC````@R`A``(0
+M0`!7$"$``A"``%,0(8Q"``"L@@``)K4``3*B`#\40``$/`4``"2E````H/@)
+M)`0``280``$N`@`9%$#_S0`0$$```(`E/`(``"13)%@GL@`L`!`0P`!3$"&,
+M1```CZ(`?!!```P\!?__-*5_X`"%&"$L8P`9/`+__S1"?RP`@A`A+$(`"3A"
+M``$``Q`+$$``)``````D@L``+$(0`!!``!0`$!C``!`0P`!3$"&,0@`$KZ(`
+M+).C`"R20@`!``(2``!B&"620@`"``(4``!B&"620@`#``(6``!B&"6.(@`4
+M`$00(:Q#```0```')K4``8XB`!0`1!`A`',8(8QC``2L0P``)K4``3*B`#\4
+M0``$/`(``"1"````0/@))`0``280``$N`@#$%$#_R@`0$,".@BRL`B`@)0+@
+M*"6/I@!``$#X"0*@."66P@`",$+``!!```4\`@``)$(```(@("4`0/@)`L`H
+M)98B`=(L0@!"%$``230#@`".(@`4`$,0(3P#``(T8Z`"K$,8+);#```D`@FT
+M%&(`#CP#9F:2@A*2EH,2G`!#$",\`V9F-&-F9P!#`!@``!@0``,80P`"%\,`
+M8A@C``,<`!````<``R0#DH(2DC1C9F<`0P`8```0$``"$\```B0#EL(``C!"
+M`-`D`P#`%$,`$#0#@`".)0`4-`*```"B*"&2@A*2``(0(P`"$8`P0@_```08
+M(P`#'(`\!`#\`&08)`!#$"6LHAE,$```!8XD`!2.(@`4`$,0(:Q`&4R.)``4
+M-`*```""("&,@B(H)`/]_P!#$"2L@B(HCB0`%#0"@```@B`AC((B*#P#__XT
+M8P/_`$,0)#1""`"L@B(HCB(`%#0#@```0Q`A)`,`#ZQ#`&"6(@'2+$(`0Q1`
+M``0T`X``CB(`%`!#$"&L0")4CB,!S"0"``448@`[`````)8B`=`X0P`"+&,`
+M`3A"``<L0@`!`&(8)1!@`#,T`X``CB(`%`!#$"$D`Q8BK$,9;);"``(P0@"`
+M$$``"C0"@`".)``4`((@(8R"&$@\`_^#-&/__P!#$"0\`P`\`$,0):R"&$B6
+MP@`",$(`H"0#`*`40P`*-`*``(XD`!0`@B`AC((B'#P#_@<T8___`$,0)#P#
+M`&``0Q`EK((B'(XB`!0T`X```$,0(20#``2L0QAXEL(``C!"`?`D`P%`%$,`
+M#S0"@`".)``4`((@(8R"&$0D`_^``$,0)#1"`""L@AA$$```!SP"``".(@`4
+M-`.```!#$"$D`P`.K$,8>#P"```D0@```B`@)0/`*"4`0/@))Z8`$!!``?TD
+M`P`#)`(`!H^C`'008@`'`````(XB`@000``$/`(``"1"````0/@)`B`@)8Z"
+M++@"("`E`\`H)3+F__\`0/@))Z<`$!!``>LD`P`#EL(``C!"`$`00``>)`0`
+M"HXC`<P09``-)`(`"1!B``L`````%&0`!0````"6(@'0+$(`!!1```4`````
+MEH(2<"Q"4`,40``+/`(``);"``(P0@"@)`,`H!!#``4\`@``)$(```(@("4`
+M0/@)`\`H)3P"```D0@```B`@)0!`^`D"P"@E/`(``"1"```"("`E`$#X"0/`
+M*"400`'#)`,``X^D`'P0@``$`````(XB`!2/I0`TK$410(XD`!0T`H```((@
+M(9*#+#"2@BPQ``(2``!B&"62@BPR``(4``!B&"62@BPS``(6``!B&"6L@P``
+MCB0`%#0"@```@B`ADH,L-)*"+#4``A(``&(8)8^B`#P`8A@ECH(OS`!B&"4\
+M`@"``&(8):R#``0\`@``)$(```(@("4`0/@)CZ4`=(XD`!0T`H```((@(9*#
+M+#R2@BP]``(2``!B&"62@BP^``(4``!B&"62@BP_``(6``!B&"6L@P#@CB0`
+M%#0"@```@B`ADH,L0)*"+$$``A(``&(8):R#`.2.(@`4-`.```!#$"&/HP`X
+MK$,`6(XD`!0T`H```((@(9*#+#:2@BPW``(2``!B&"62@BPX``(4``!B&"62
+M@BPY``(6``!B&"6L@P`(CB0`%#0"@```@B`ADH,L.I*"+#L``A(``&(8):R#
+M``R.(@`4-`.```!#$"&.@R_4K$,`&(XC`!0D`O__K&(`@#P"```D0@```B`@
+M)0!`^`D#P"@E$$`!7"0#``,\`@``)$(```(@("62)1(X`$#X"20&``$\`@``
+M)$(```(@("4`0/@)`L`H)98B`=0P0@#P)$+_T"Q"`$`00``2`````(XC$C2,
+M8@``,$+``!!```TD!P`-E&8``C#&0``D!0`,CB0`%#0"@```@B`AC((8)"0#
+M__``0Q`D`.8H"@!%$"6L@A@DCB,!S"0"``448@`,`````)8B`=`X0P`"+&,`
+M`3A"``<L0@`!`&(8)1!@``0T`X``CB(`%`!#$"&,0AAXCB(`%#0#@```0Q`A
+MC$(9%#!$/_^6P@`",$(`(!!```<`!!"`/`.Z+C1CBZ,`0P`9```0$!````8`
+M`B$"/`+,S#1"S,T`@@`9```0$``"(,*.(@`4-`.```!#$"$D`P`!K$,8'(XB
+M$C240@`",$)``!!```<\`@````0@0"1"````0/@))(0`9!```!".(@`4CB(2
+M-)1"``(P0H``$$``!SP"````!""`)$(```!`^`DDA`!D$```!8XB`!0D0@``
+M`$#X"22$`&2.(@`4-`.```!#$"&,51@()`,X`*Q#&`@D$``!CB(`%#0#@```
+M0Q`AC$(<)#!"`!`00``//`(``"13```T$H```F#X"20$`,@"`!`E*$(`%!!`
+M``<F$``!CB(`%`!2$"&,0APD,$(`$!1`__4`````CB(`%#0#@```0Q`AK%48
+M"(XC`!0T`H```&(8(8QB&&`T0@`#K&(88);"``(P0@"@)`,`H!!#`!,D`@`"
+MCH,OP!!B`!`T`H``CB,`%`!B&"&,8AD@-$+P`*QB&2".)``4-`*```""("&,
+M@AD@/`,``0!#$"6L@AD@)`(``1````*N@B_`KH`OP#P"```D0@```$#X"0(@
+M("4``(`E)`8``2>E`#``$""`)(+0`"Q"$``00``2`!`0@`(&$`2OH@`PDZ,`
+M,)"B``$``A(``&(8)9"B``(``A0``&(8)9"B``,``A8``&(8)8XB`!0`1!`A
+MK$,0`!````8F$``!CB,`%`!B&"$"!A`$K&(0`"80``$J`@`*%$#_Y``0(("N
+M@$:@EB(!Z!!```L``(`E/`(``"12```"("`E`D#X"0(`*"4F$``!EB(!Z`("
+M$"H40/_Z`B`@)3P"``@T0@EEKH(L1"0"``:/HP!T%&(``SP"``@T0AEEKH(L
+M1(XC`!2.@BQ$K&(`H(XD`!2,@@"L/`,`!P!#$"6L@@"LCB(23!!```0\`@``
+M)$(```!`^`D"("`E/`(``"1"```"("`E-`688"0&``$`0/@)```X)3P"```D
+M0@```B`@)0!`^`F/I0!TCB0`%#0"@```@B`AC((`(#P#_G\T8___`$,0)*R"
+M`"".(P',+&(`!A!```<D`@`%%&(`$`````"6(@'0+$(`"!1```P`````CB(`
+M%#0#@```0Q`A/`,``31C`*JL0P$8CB(`%#0#@```0Q`A)`,R$*Q#`1R.(@`4
+M-`.```!#$"$D`P!2K$,!"(Z$+]`0@``$-`.``(XB`!0`0Q`AK$0!((Z%+_@D
+M`O__$*(`!#P"```D0@```$#X"0(@("6.A2_\)`+__Q"B``0\`@``)$(```!`
+M^`D"("`ECH4P`"0"__\0H@`$/`(``"1"````0/@)`B`@)8XD`?@0@``$-`.`
+M`(XB`!0`0Q`AK$0`2(^D`'2N)`'<CZ4`?!"@`"(D`@`!D\,`!#!B``(40``"
+M,&(`_J/"``27P@`"IL(``I/"``2BP@`$CB(2-```("4``"@EK$0`,*Q%`#0\
+M`@``)$(```!`^`D"("`ECB02-*R"`"BL@P`L/`(``"1"```"("`E`$#X"20%
+M``$0```&)`(``8^E`(",H@``$$```@``$"6LHP``C[\`;(^^`&B/MP!DC[8`
+M8(^U`%R/M`!8C[,`5(^R`%"/L0!,C[``2`/@``@GO0!P)[W_Z*^_`!`\`@`!
+M)$)=W`!`^`DD!0`"C[\`$`/@``@GO0`8)[W_Z*^_`!2OL``0`("`)3P"```D
+M0@`````H)0!`^`DD!@`!$$``!0(`("4\`@`!)$)=W`!`^`DD!0`#C[\`%(^P
+M`!`#X``()[T`&">]_]"OOP`LK[(`**^Q`"2OL``@`("0)0"@@"4\`@`!)$)=
+MW`!`^`DD!0`#$$``B@``*"4\`@``)$(```)`("4`0/@))`8``1!``(2/OP`L
+M/`(``21"7=P"0"`E`$#X"0``*"400`!]C[\`+!(``'LD`@`!ED(!U#!"`/`D
+M0O_0+$(`0!1```D`````CD(!S#A#``<L8P`!.$(`"RQ"``$`8A@E$&``%0``
+M``"6`P`",&(`(!1```4D$0`(,&,`T"0"`,`48@`#`````!```!XD!!36E@(`
+M`C!"0``40``:)`05U)8"``(P0H``)`04U"0#%M00```4`&(@"Y8#``(P8@`@
+M%$``!0``B"4P8P#0)`(`P!1B``,`````$```"B0$`*N6`@`",$)``!1```8D
+M!`&JE@(``C!"@``D!`"J)`,"J@!B(`N6`P`",&(`0!!```@P8@`@%$``!#!C
+M`-`D`@#`%&(``P`````0```%-C$`!)8"``(P0@!`-B,``0!BB`J6!0`",*,!
+M`#8B``(`0X@*,*,`$"0"``,`0(`E``.`"HY"`!0T`X```$,0(8Q&&'PPH@`@
+M%$``!#"C`-`D`@#`%&(`$P````".0@`4-`.```!#$"&L4!@$CD(`%`!#$"&L
+M42(`$,0`&R0"``&.0@`4`$,0(:Q$&'P\`@``)$(```!`^`DD!`$L$```$B0"
+M``$0Q``(-`.``(Y"`!0`0Q`AK$08?#P"```D0@```$#X"20$`2R.0@`4-`.`
+M``!#$"&L4!@$CD(`%`!#$"&L42(`)`(``8^_`"R/L@`HC[$`)(^P`"`#X``(
+M)[T`,">]_]"OOP`HK[$`)*^P`"``@(@E`*`8)0!@@"4D!?__/`(``"1"````
+M0/@)`&,H"P!`("40@``)C[\`*#("``$40``&`(`0)20#``6.(@`4K$,`%`"`
+M$"6/OP`HC[$`)(^P`"`#X``()[T`,">]_YBOOP!DK[(`8*^Q`%ROL`!8`("(
+M)8XB`!",1``($*`!*@``$"66(@'()$/_>BQC``(X0@"1+$(``0!B&"408`"3
+M`````!"```4D`@`!$((`!@``$"40``$=C[\`9"0&``(0```$)`<``3P&``0T
+MQ@(`/`<``CP"L/\T0L`$CB,`%`!#$",L0A``$$``$0#FD"<\`K$`-$(`!(Q"
+M``"OH@!`DZ,`0">D`$"0@@`!``(2``!B&"60@@`"``(4``!B&"60@@`#``(6
+M`!````0`8H`E/`*Q`#1"``2,4```)`(``A2B`!,`YA`E$```$P(&@"6OL`!$
+MDZ,`1)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)3P"L0`T
+M0@`$K$,``!````X\`K#_`A*`)`("@"4\`K#_-$+`!(XC`!0`0Q`C+$(0`!1`
+M_^@GI`!$/`*Q`#1"``2L4```/`*P_S1"P`2.(P`4`$,0(RQ"$``00``%/`*Q
+M`#1"``2,0@``$```!#P"```T0@`$C$(``#P"```D0@```$#X"20$`&0\`K#_
+M-$+`!(XC`!0`0Q`C+$(0`!!``!8"$H`D/`*Q`#1"``2,0@``$```%3P"L/^O
+ML`!(DZ,`2)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8``&(8)3P"
+ML0`T0@`$K$,``!````\\`K#_/`*Q`#1"``2,0@``/`*P_S1"P`2.(P`4`$,0
+M(RQ"$``40/_G)Z0`2#P"L0`T0@`$K%```#P"L/\T0L`$CB,`%`!#$",L0A``
+M$$``!@`````\`K$`-$(`!(Q"```0``"5)`(``3P"L0`T0@`$C$(``!```)`D
+M`@`!$(``!20"``$0@@`&```0)1```(N/OP!D)`9`!!````0D!R``/`8`!#3&
+M`@`\!P`"/`*[_S1"\"".(P`4`$,0(RQ"$``00``1`.:0)SP"O``T0C`@C$(`
+M`*^B`$R3HP!,)Z0`3)""``$``A(``&(8)9""``(``A0``&(8)9""``,``A8`
+M$```!`!B@"4\`KP`-$(P((Q0```D`@`"%*(`$P#F$"40```3`@:`):^P`%"3
+MHP!0D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E/`*\`#1"
+M,""L0P``$```#CP"N_\"$H`D`@*`)3P"N_\T0O`@CB,`%`!#$",L0A``%$#_
+MZ">D`%`\`KP`-$(P(*Q0```\`KO_-$+P((XC`!0`0Q`C+$(0`!!```4\`KP`
+M-$(P((Q"```0```$/`(``#1","",0@``/`(``"1"````0/@))`0`9#P"N_\T
+M0O`@CB,`%`!#$",L0A``$$``%@(2@"0\`KP`-$(P((Q"```0```5/`*[_Z^P
+M`%23HP!4D((``0`"$@``8A@ED((``@`"%```8A@ED((``P`"%@``8A@E/`*\
+M`#1",""L0P``$```#SP"N_\\`KP`-$(P((Q"```\`KO_-$+P((XC`!0`0Q`C
+M+$(0`!1`_^<GI`!4/`*\`#1",""L4```/`*[_S1"\"".(P`4`$,0(RQ"$``0
+M0``%/`*\`#1","",0@``$```!"0"``$T0C`@C$(``"0"``&/OP!DC[(`8(^Q
+M`%R/L`!8`^``"">]`&@`````)[W_J*^_`%"OMP!,K[8`2*^U`$2OM`!`K[,`
+M/*^R`#BOL0`TK[``,`"`H"4`H*@E`,"P)0#@@"4``(@E/`(``"13*H`GL@`@
+M/`(``"17````$1!``%$8(0`#$,``4Q`AC$0``"2"P``L0A``$$``%@`1$$``
+M`Q!``%40(0`"$(``4Q`AC$(``*^B`""3HP`@DD(``0`"$@``8A@EDD(``@`"
+M%```8A@EDD(``P`"%@``8A@ECH(`%`!$$"&L0P``$```#B80``$`41`A``(8
+MP`!S&"&.A``4C&,```"#("$``A!``%40(0`"$(``4Q`AC$(``*R"```F$``!
+M,@(`/Q1```,``````N#X"20$``$F,0`!+B(`$!1`_\X`$1!```"()3P"```D
+M4RP`)[(`)#P"```D50```!$8P`!S$"&,1```)(+``"Q"$``00``2`',0(8Q"
+M``2OH@`DDZ,`)))"``$``A(``&(8)9)"``(``A0``&(8)9)"``,``A8``&(8
+M)8Z"`!0`1!`AK$,``!````@F$``!CH0`%(Q"````@B`A`',8(8QB``2L@@``
+M)A```3("`#\40``#``````*@^`DD!``!)C$``2XB`((40/_:`!$8P```B"4\
+M`@``)%,P$">R`"@\`@``)%4````1$$``41@A``,0@`!3$"&,1```)(+``"Q"
+M$``00``5`!$00`!V$"$``A"``%,0(8Q"``"OH@`HDZ,`*))"``$``A(``&(8
+M)9)"``(``A0``&(8)9)"``,``A8``&(8)8Z"`!0`1!`AK$,``!````TF$``!
+M`%$0(0`"&(``<Q@ACH0`%(QC````@R`A`%80(0`"$(``4Q`AC$(``*R"```F
+M$``!,@(`/Q1```,``````J#X"20$``$F,0`!+B(`0!1`_\^/OP!0C[<`3(^V
+M`$B/M0!$C[0`0(^S`#R/L@`XC[$`-(^P`#`#X``()[T`6">]_\BOOP`PK[,`
+M+*^R`"BOL0`DK[``(`"`F"4`H)`EED0``"R"$L`00``:``"`)3P"```D0@``
+M)(3W(`!`^`DD!0`(`$"()8YC`!0T`H```&(@(8R%(@260P``)`()M!1B``4T
+M`H``-*(`$*R"(@00``!D`!$9`(YC`!0`8A@A)`+_[P"B$"2L8B($$```70`1
+M&0`\`\S,-&/,S0"#`!D``!@0``,9`@`#$(``0Q`A``(0@`""$",P0O__%$``
+M%2R"%``40``3)(+M0#P$9F8TA&9G`$0`&```(!``!"##``(7PP""(",\$```
+M)A`````$((`"`/@))`4`"`!`B"4D!``#`@#X"20%``(0```\`$"`)3P#S,PT
+M8\S-`(,`&0``&!```QC"``,0@`!#$"$``A!``((0(S!"__\40``3)(+M0#P$
+M9F8TA&9G`$0`&```(!``!""#``(7PP""(",\$```)A`````$($`"`/@))`4`
+M"`!`B"4D!``"`@#X"20%``(0```>`$"`)99$```\`\S,-&/,S0"#`!D``!@0
+M``,8@@`#$(``0Q`A`((0(S!"__\40``F```0)22$[4`\`F9F-$)F9P""`!@`
+M`!`0``(00P`$)\,\$```)A````!$(","`/@))`4`"`!`B"4D!``!`@#X"20%
+M``(`0(`E`!$9```0$(``8A@E```0)0`"$$``8A@E-&,0`8YB`!0T!(```$00
+M(3!D`/^L1!B<``,:`HYB`!0T!(```$00(3!C`'^L0QC8KG(2-"0"``&/OP`P
+MC[,`+(^R`"B/L0`DC[``(`/@``@GO0`X)[W_F*^_`&2OO@!@K[<`7*^V`%BO
+MM0!4K[0`4*^S`$ROL@!(K[$`1*^P`$``@*@E,-/__P*@N"4``*`EE*(``C!#
+M`?`D`@#`$&(`$([R+^PH8@#!$$``!B0"`-`D`@"@$&(`!P``$"40``%OC[\`
+M9!!B``8``!`E$``!:X^_`&26Y1-D$````Y;V$V:6Y1-HEO83:@``("4\`@``
+M)$8S$``$$(`"0A`A``08P`!F&"&,8P`$)(0``1"`__FL0P`````@)29&``0\
+M`@``)$<S&``$$(``PA`A``080`!D&"$``QA``',8(0`#&(``9Q@AC&,``"2$
+M``$0@/_UK$,`````("4\`@``)$8S,``$$(``4A`A``080`!D&"$``QA``',8
+M(0`#&(``9A@AC&,``"2$``$0@/_UK$,`"```("4F1@`$/`(``"1',T@`!!B`
+M`&88(0`$$$``1!`A``(00`!3$"$``A"``$<0(8Q"``"L8@`()(0``2R"`!X4
+M0/_S)E$`#*^@`!`\$```)A````(@("4D!@`#`@#X"20'`,&OH``0`B`@)0+`
+M*"4D!@`#`@#X"20'`+X``"`E)D4`!#P"```D1C88``08@`!E&"$`!!!``$00
+M(0`"$$``4Q`A``(0@`!&$"&,0@``K&(`@"2$``$L@@`#%$#_]``$&(```(`E
+M/`(``"13,Q`GL0`H/`(``"16````$!#``%,0(8Q$```D@L``+$(0`!!``!0`
+M$!#``!`0@`)"$"&,0@``KZ(`*).C`"B2(@`!``(2``!B&"62(@`"``(4``!B
+M&"62(@`#``(6``!B&"6.H@`4`$00(:Q#```0```*)I0``0!3$"&.HP`4C$(`
+M``!B&"$`$!"``D(0(8Q"``"L8@``)I0``3*"`#\40``#``````+`^`DD!``!
+M)A```1(`_]8\`@````"`)216,Q@F4P`$)[$`+#P"```D7@```!`00`!0$"$`
+M`A#``%80(8Q$```D@L``+$(0`!!``!0`$!!``!`0@`)B$"&,0@``KZ(`+).C
+M`"R2(@`!``(2``!B&"62(@`"``(4``!B&"62(@`#``(6``!B&"6.H@`4`$00
+M(:Q#```0```,)I0``0!0$"$``A#``%80(8ZC`!2,0@```&(8(0`0$(`"8A`A
+MC$(``*QB```FE``!,H(`/Q1```,``````\#X"20$``$F$``!$@#_TCP"````
+M`(`E)%,S,">Q`#`\`@``)%8````0$$``4!`A``(0P`!3$"&,1```)(+``"Q"
+M$``00``4`!`00``0$(``4A`AC$(`"*^B`#"3HP`PDB(``0`"$@``8A@EDB(`
+M`@`"%```8A@EDB(``P`"%@``8A@ECJ(`%`!$$"&L0P``$```#":4``$`4!`A
+M``(0P`!3$"&.HP`4C$(```!B&"$`$!"``%(0(8Q"``BL8@``)I0``3*"`#\4
+M0``#``````+`^`DD!``!)A```1(`_](\`@````"`)216,T@F4P`$)[$`-#P"
+M```D7@```!`00`!0$"$``A#``%80(8Q$```D@L``+$(0`!!``!0`$!!``!`0
+M@`!3$"&,0@`(KZ(`-).C`#22(@`!``(2``!B&"62(@`"``(4``!B&"62(@`#
+M``(6``!B&"6.H@`4`$00(:Q#```0```,)I0``0!0$"$``A#``%80(8ZC`!2,
+M0@```&(8(0`0$(``4Q`AC$(`"*QB```FE``!,H(`/Q1```,``````\#X"20$
+M``$F$``!+@(`'A1`_](`$!!```"`)3P"```D4S88)E(`!">Q`#@\`@``)%8`
+M```0$$``4!`A``(0P`!3$"&,1```)(+``"Q"$``00``4`!`00``0$(``4A`A
+MC$(`@*^B`#B3HP`XDB(``0`"$@``8A@EDB(``@`"%```8A@EDB(``P`"%@``
+M8A@ECJ(`%`!$$"&L0P``$```#":4``$`4!`A``(0P`!3$"&.HP`4C$(```!B
+M&"$`$!"``%(0(8Q"`("L8@``)I0``3*"`#\40``#``````+`^`DD!``!)A``
+M`2X"``,40/_2`!`00*[@+\0D`@`!C[\`9(^^`&"/MP!<C[8`6(^U`%2/M`!0
+MC[,`3(^R`$B/L0!$C[``0`/@``@GO0!H)*/__RQB``<00``2C(0O[#P"```D
+M0C9@``,8@`!B&"&,8@```$``"``````#X``(`(`0)0/@``@D@@`$`^``""2"
+M``@#X``()((`#`/@``@D@@"$`^``"```$"4`!"0`,,;__P`$)`,`!A!``*)`
+M(92B````@A`J$$``!(^I`!"M(````^``"*S@``"%`O_^`((0*A1```X`H!@E
+M),+__ZTB```#X``(K.(````"$$.M(@```^``"*SB`````A!#K.(``"1"``$#
+MX``(K2(```!H$"L00``,`````(1B```01/_R`&40(X1B``(`@A`J%$#_\@!E
+M$",D8P`"`&@0*Q1`__8``````^``"``````GO?^XK[\`1*^^`$"OMP`\K[8`
+M.*^U`#2OM``PK[,`+*^R`"BOL0`DK[``(*^D`$@`X)`EC[0`6(^^`&``!2P`
+M``4L`P`&-```!C0#E[,`7@`%%$```H0#``"()2YC``(48`!/```0)0#%$",P
+M0O__`%$0*Q1``$HD`@`!/`(``217;RPF=O__`,40(S!5__\GH@`<KZ(`$`(`
+M("4"0"@E`F`P)0+@^`DGIP`8CZ(`'!1```2/H@`8)`(``:^B`!R/H@`8%%8`
+M!(^B`!@F8O_^KZ(`&(^B`!@``B!``)(8(8^B`!P``A!``%(0(81C``"$0@``
+M%&(``P"4$"$0```9E$,``(^D`!@`!"!``)(0(81(```"""@CCZ(`'``"$$``
+M5!@AA&<```!2$"&$0P```'`P(P"4("&$@@```,(`&'"G`````"@2`&@8(P"C
+M`!H``"@2%&```@``````!P`-,*/__X^D`$@`!!&``%$0(0`"$$``7A`AI$,`
+M`"8B``$P4?__)@(``@`"%````H0#`K$0*Q!`_[\GH@`<)`(``8^_`$2/O@!`
+MC[<`/(^V`#B/M0`TC[0`,(^S`"R/L@`HC[$`)(^P`"`#X``()[T`2#"#__\P
+MI?__,,;__P`'/```!R0#$,4`#X>G`!(`91`C`,,8(P!D`!AP1P`````0$@#%
+M&",`0P`:```0$A1@``(```````<`#0`"%``#X``(``(4`P/@``@`@!`E)[WY
+MB*^_!G2OO@9PK[<&;*^V!FBOM09DK[0&8*^S!EROL@98K[$&5*^P!E"OI@:`
+M,*7__Z^E!C@PY___KZ<&/*^@!D``!20`E,8`%">B!C"OH@`0/`(``21";RP`
+M!"0#CZ4&@`!`^`DGIP8T``"8)2>B!B"OH@9$CZ,&@"1C``ROHP9()Z0&**^D
+M!DPD`@`#`%-`(P`($$``2!`A``(XP(^C!C0``Q!``$,0(0`"&0``0Q`A``(0
+M0`#B,"$DQ0`8CZD&@`$E$"&45``($H``MH^B!D```B!`CZD&D`")&"&/J0:`
+M`240(91"``:D8@``CZ(&1`!$*"&/HP9(`,,0(91$`""DI```CZ,&,``#$$``
+M0Q`A``(9``!#$"$``A!``.(0(8^F!D@`1A`A``0D```$)`.40P`@A$(`(`!$
+M$"H00``#CZD&0*2C``"/J09```DH0(^B!D0`12`AE((````"%````AP#``(7
+MP@!B&"$``QA#I(,``(^C!DP`93`A``@@0`"(("$`!""`CZ,&-``#$$``0Q`A
+M``(9``!#$"$`@A`A`%00(0`"$$"/I09(`$40(91%`!ZDQ0``CZ,&,``#$$``
+M0Q`A``(9``!#$"$`@B`A`)0@(0`$($"/J09(`(D@(0`%+```!2P#A((`'@!%
+M$"H00``"E(,`'J3#``"/H@9```*(0(^C!DP`<9`AED(````"%````C0#``(7
+MP@#","$`!C!#ID8``(^D!D0`D8@AAB4``(^B!C0``CA``.(X(0`'$0``XC@A
+M``<X0``(@$`""(`A`!"`P`#P."&/J0:``.DX(23B`"*OH@`0K[0`%">B`""O
+MH@`8CZ0&0#P#``$D8V_@`&#X"23G`"R&)0``AD8``(^B!C```CA``.(X(0`'
+M$0``XC@A``<X0`#P."&/I`:``.0X(23B`"*OH@`0K[0`%">B`B"OH@`8CZ0&
+M0#P)``$E*6_@`2#X"23G`"R60P``EB(```!B&",P8___$&``*0``B"6/H@9`
+M``+Q@">W`"`GM@(@)[4$(``"&$`GH@8H`$.@(2>B!B``0Y`ACZ(&-``"$$"/
+MHP:``&(0(91%``"/H@8P``(00`!B$"&41@```]&`(0`0@$`"\!`AA$<```+0
+M$"&$0@``KZ(`$#P)``$E*7&P`2#X"8^D!C@"L(`AI@(``"8Q``&6@@``ED,`
+M``!#$",P0O__`B(0*Q1`_^2/H@8TCZ(&0"1"``&OH@9`)G,``2YB``040/\W
+M)`(``Y>C!B"/H@:(I$,`````F"6/HP9`$&``F0``B"4GK08H)ZP&(">K!"`D
+M#@`!CZ0&0"2"__\68@`)`!,80``3$$"/I0:,`$48(0&B$"&40@``)$(`!!``
+M``RD8@``CZ8&C`!F("$!HQ`AA$(```!L&"&$8P`"`$,0(0`"'\(`0Q`A``(0
+M0Z2"```28``*```@)0`3&$"/J0:,`2,0(91$__X!@Q@AA&(```""("./H@8\
+M`((@(P`3&<``:Q`A`6,8(91"``*48P```$,0(S!#__\$@0`3`<,8"@`3$<`#
+MHA`AE$<$('"#*`(`IQ`A``(4```"+`,`$1!`CZ8&E`!&$"$$H``#)C$``1``
+M``*D10``I$```"2$``$$@/_S<(,H`@`3&$`!HQ`AA$D```&#$"&$0@```2)(
+M(X^E!HP`91@AE&4``(^F!CP`IB@A`*(H(P$@4"4`JA`K`*)0"P`*%```0!@E
+M``(4`P""$"H00``1`!,1@``308`GIP0@``,T`P`1&$"/H@:4`&(8(0$$$"$`
+M`A!``.(0(91"``"D8@``)(0``0"&$"H40/_U)C$``0`3$8``21`A)$/__P`#
+M&$`!8Q@A)$+__@`"$$`!8A`AE&,``)1"````8A@C,&/__P%%$"L00``@`<,8
+M"@`%%````A0#`((0*A!``!L`$Q&``$D0(21"__\``A!``Z(0(91/!"`D"`!_
+M``44```"/`,`BA`C<$,H`@"O$"$``A0```(L`P`1$$"/J0:4`$DP(2BB`(`0
+M0``#)C$``1````*DQ0``I,@``"2$``$`AQ`J%$#_\`"*$",F<P`!CZ,&0`)C
+M$"L40/]M`````"YB``000``++B(`@``3$$"/I`:,`$00(91#__ZD0P``)G,`
+M`2YB``040/_Y`!,00"XB`(`00``+C[\&=``1$$"/I0:4`$40(91#__ZD0P``
+M)C$``2XB`(`40/_Y`!$00(^_!G2/O@9PC[<&;(^V!FB/M09DC[0&8(^S!ER/
+ML@98C[$&5(^P!E`#X``()[T&>">]_YBOOP!@K[4`7*^T`%BOLP!4K[(`4*^Q
+M`$ROL`!(`("0)0)`F"6.5$9XE.(``C!"`-`X0P#`+&,``3A"`-`L0@`!`&(8
+M)11@``<F42?\E.,``C!C`*`D!`"@)G$CZ!1D`&D``!`ECD(`%#00@```4!`A
+MC$(B;#!5``^4Y0``)Z(`**^B`!`GH@`@KZ(`%(^B`'BOH@`8K[0`'#P"``$D
+M0G(,`D`@)0(@,"4`0/@)`J`X)8Y$`!0`D"`AC(,B6#P"__\T0C__`&(8))8B
+M`!PD0O__``(3@#!"P```8A@EK(,B6(>B`"@00``$EZ,`*``#$",0```"IF(O
+M]*9@+_0T!:*````X)2>F`$``!QC``'08(9!D``&08@`#``(2``""("608@`%
+M``(4``""("608@`'``(6``""("4DHL``+$(0`!!``!$`````KZ0`0).C`$"0
+MP@`!``(2``!B&"60P@`"``(4``!B&"60P@`#``(6``!B&"6.0@`4`$40(:Q#
+M```0```%)*4`!(Y"`!0`11`AK$0``"2E``0DYP`!+.(`(!1`_]H`!QC`CD4`
+M%#0"@```HB@AEZ,`(``#&0`P8P/P`J,8)9>B`"(``A*`,$+\``!B&"67H@`D
+M``(4`#P$`#\`1!`D`&(8)9>B`"8``A6`/`0/P`!$$"0`8A@EK*,B;"0"``&/
+MOP!@C[4`7(^T`%B/LP!4C[(`4(^Q`$R/L`!(`^``"">]`&@GO?_HK[\`%*^P
+M`!``@(`EC@1&>!"```4\`@``)$(```!`^`D`````K@!&>(X$+^P0@``%/`(`
+M`"1"````0/@)`````*X`+^R/OP`4C[``$`/@``@GO0`8```@)20'``,DI@`(
+M)*4`#`#D&",``Q!``$,0(0`"&,``PQ`AE$(``!!```4DA``!)(3__P!E$"$#
+MX``(A$(`""R"``040/_S`.08(P``$"4``A0``^``"``"%`,``#`E)*<`""2E
+M``P`!A!``$8@(0`$$,``XA`AE$,``!!@``@DQ@`!),;__P`$$(``0Q`A``(0
+M0`!%$"$#X``(A$(`!BS"``040/_P```0)0`"%``#X``(``(4`R>]_\BOOP`T
+MK[X`,*^W`"ROM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("H)0"@L"4`
+MP+@E`.#P)0*@,"6FX```EL(``C!"`-`X0P#`+&,``3A"`-`L0@`!`&(8)11@
+M``<FI2?\EL,``C!C`*`D!`"@),4CZ!1D`(X``!`EE*0`%"2Q`!@0@`"*```0
+M)9;#``"6(@```&(0*Q1```T\`@`!)`(`9G""*`(`L1`AE$+_F@!#$"L00``3
+M```P)200`&9PD!`"`%&`(1```&HF$/^:)$)[L`*@("4`0/@)`B`H):;B```\
+M`@`!)$)[5`*@("4`0/@)`B`H):?"```0``!L)`(``1"``!,``"@EEL,``)8B
+M````0Q`K$$``#R0"`&8D!P!F`*`P)22E``$`I!`J$$``"20"`&9PIQ@"`'$0
+M(9;#``"40@```$,0*Q1`__4`````)`(`9G"B&`(`<:`AEI(``'#"&`(`<9@A
+MEF(```)"D",:0``X`J`@)3P1``$F,7NP`B#X"0*`*"4`0(`E`J`@)0(@^`D"
+M8"@E`@*`(P*@("4"(/@)`F`H)9;#``"69````&08(P!2`!AR`P````"`$@(2
+M`!H``(`2%D```@``````!P`-`!"&```0A@.F\```/!$``28Q>U0"H"`E`B#X
+M"0*`*"4`0(`E`J`@)0(@^`D"8"@E`@*`(P*@("4"(/@)`F`H)9;#``"69```
+M`&08(P!2`!AR`P````"`$@(2`!H``(`2%D```@``````!P`-`!"&```0A@.G
+MT```$```%R0"``$D`@!F<*(8`@!Q@"&6PP``E@(``!1B``\`````/`(``21"
+M>[`"H"`E`$#X"0(`*"6FX@``/`(``21">U0"H"`E`$#X"0(`*"6GP@``$```
+M`B0"``$``!`EC[\`-(^^`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4
+MC[``$`/@``@GO0`X)[W_R*^_`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!RO
+ML``8`("P)0"@J"4`P)`E)!,``1)``!4``(@E/`(``214?`P`$1#``J*`(0+`
+M("4"`"@E)Z8`$`*`^`DGIP`2$$``!9.B`!&B`@`&DZ(`$Q````*B`@`'``"8
+M)28Q``$",A`K%$#_\``1$,`"8!`EC[\`-(^V`#"/M0`LC[0`*(^S`"2/L@`@
+MC[$`'(^P`!@#X``()[T`.">]_^"OOP`8K[$`%*^P`!``H(@E`("`)3P"```D
+M0@```$#X"20$`)``0!@E%&``!*X#+^PD`P`"$```)JXC```D`@$`K@)&?#P"
+M```D0@```$#X"20$`0``0!@E%&``!*X#1G@D`P`"$```&JXC```\`@`!)$)Z
+M_*X"+*@\`@`!)$)C,*X"+*P\`@`!)$)NT*X"++`\`@`!)$)F$*X"++0\`@`!
+M)$)H?*X"++@\`@`!)$)XT*X"++P\`@`!)$)^\*X"+,`\`@``)$(``*X"+,0D
+M`@`!C[\`&(^Q`!2/L``0`^``"">]`"!!=&AE<F]S(#4R,3``````071H97)O
+M<R`U,C$Q`````$%T:&5R;W,@-3(Q,2`H1E!'02D`071H97)O<R`U,C$R("A&
+M4$=!*0!!=&AE<F]S(#4S,3(@5VE3;T,``$%T:&5R;W,@,C,Q-2!7:5-O0P``
+M071H97)O<R`R,S$W(%=I4V]#``!!=&AE<F]S(#(S,3,@5VE3;T,``$%T:&5R
+M;W,@-30R-"\R-#(T````071H97)O<R`U,C$R`````"A0%BQ8*```````````
+M"\@```O8```+V```"^````OH```,!```#`P```P<```.````#"P```Q````,
+MG```#%0```QL```,A```#*P```X````.````#1````TD```-.```#4````O\
+M```-6```#6P```V````.````#@````W8```.````#>````X````.````#@``
+M``WP_Z#_H_^>_Z#_H_^@05(U,C$R``!!4C4S,3(``%)&,C,Q-P``````````
+M```````%``H`%``>`#(`1@!5`%H`7P!D```````*`!0`'@`H`#(`/`!&`%``
+M6@!D``````#"````Q````,4```#0````V@```.0```#"````PP```-0```#R
+M```!#0```2@```#/````R@````````````(A4``!`4``!`"@``@`P``@`-``
+M0`%0```````````95!`4!A`F````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````9%``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````"6P)CPFT```)"`EL";0``/_______P``!0(/!P(/"@`/"0`/````
+M``````````````"+'```BL@``(K0``"+8```BNP``(M8````````````````
+M````(````"````!`````0``&````!@````8``!:>``L68@`*%CH`"18<``@5
+MZ@`'%9H`!15*``05`P`"%%D```NX``$`````````````JB@``*J(``"JL```
+MK2```*LH``"M(```K2```*T@``"M(```K2```*M<``"M(```K2```*T@``"M
+M(```JVP``*N,``"M(```J]0``*OX``"M(```JNP``*T@``"M(```K2```*PX
+M``"L3```K2```*QD````````K.```*SL``"L^```K00``*T0``````````8`
+M```!`````@````,````$````!0``K8```*VT``"OA```K@@``*^$``"OA```
+MKX0``*^$``"OA```KD@``*^$``"OA```KX0``*^$``"N9```KX0``*^$``"N
+M=```KT@``*^$``"OA```KX0``*^$``"OA```KJ@``*ZH``"OA```KQ``````
+M````````$$``+_P/`"_\#P`O_!\`+_P/`"_\#P``$$0`+_P/`"_\#P`O_!\`
+M+_P/`"_\#P``$$@`+_P/`"_\#P`O_!\`+_P/`"_\#P``$$P`+_P/`"_\#P`O
+M_!\`+_P/`"_\#P``$%``+_P/`"_\#P`O_!\`+_P/`"_\#P``$%0`+_P/`"_\
+M#P`O_!\`+_P/`"_\#P``$%@`+_P/`"_\#P`O_!\`+_P/`"_\#P``$%P`+_P/
+M`"_\#P`O_!\`+_P/`"_\#P``$&``+_P/`"_\#P`O_!\`+_P/`"_\#P``$&0`
+M+_P/`"_\#P`O_!\`+_P/`"_\#P``$#````(P```!X````+````%@```!X```
+M$'````%H```!X````;@```&,```!X```$+````Y@```1@```'QP``#XX```1
+M@```$/```*#@``%`:```6(```+#@``%`:```@!0#Z`/H!N`&X`0@!"`(0`A`
+M!N`&X```F`0``````````P```````````````P``F"`"`@(``@("``(!`@`"
+M`@(``@("````F"0```X.```.#@``!P<```X.```.#@``F$03<A8<$W(<)1-R
+M%R(3<A:B$W(<)0``F&```)T0``"=$```G1@``)T8``"=$```F&0``<X```'.
+M```!S@```<X```'.````F&A`FD&00)I!D$":09!`FD&00)I!D```F1@```&X
+M```!N````(0```$(```!N```F200!8H%$`6*!1`%B@40!8H%$`6*!0``HC``
+M``````````````````$(``````````P`````````-`````4```!`````````
+M`$0````(````2`````@```!,````$````%``````````5````!\```@`````
+M````"`0````````("`````````@,````````"!`````````(%`````````@8
+M````````"!P````````((`````````@D````````$G`````````0.```````
+M`!!X````````$+@````````0^````````!$X````````$7@````````1N```
+M`````!'X````````$C@````````2>````````!*X````````$O@````````3
+M.````````!-X````````$[@````````3^````````!0X````````%'@`````
+M```4N````````!3X````````%3@````````5>````````!6X````````%?@`
+M```````6.````````!9X````````%K@````````6^````````!<X````````
+M%W@````````7N````````!?X````````$#P````````0?````````!"\````
+M````$/P````````1/````````!%\````````$;P````````1_````````!(\
+M````````$GP````````2O````````!+\````````$SP````````3?```````
+M`!.\````````$_P````````4/````````!1\````````@`0```````"`"```
+M`````(`,````````@"````````"`)````````(`H````,```@"P`!___``"`
+M,`'___\``(`T````,0``@#@```````"`/````````(!(````````@%0`````
+M``"`6````````(!<``_'CP``@,`J@C`:``"`Q`7<`>```(#('T`G$```@,P!
+M]`````"`T```'AP``(#4``*JJ@``@-@"`%55``"`W````````(#@_____P``
+M@.0``/__``"`Z````````(#L````````@/````````"`]````````(#X````
+M````@/P```"(``"'`````````(<$````C```AP@```#D``"'#````M4``(<0
+M````````AQ0```````"'&````*```(<<```!R0``AR`````L``"')````"P`
+M`(<H````,```ARP````\``"',````"P``(<T````+```AS@````P``"'/```
+M`#P``(=`````````AT0```````"'2````````(=,````````AU````````"'
+M5````````(=8````````AUP```````"'8````-4``(=D````WP``AV@```$"
+M``"';````3H``(=P````=0``AW0```!_``"'>````*(``(=\````````@0``
+M`0`"``"!!`````$``($(````P```@0P```````"!$````6@``($4````````
+MA\`#`@$```"'Q`<&!00``(?("PH)"```A\P/#@T,``"'T!,2$1```(?4%Q85
+M%```A]@;&AD8``"'W!\>'1P``(?@`P(!````A^0'!@4$``"'Z`L*"0@``(?L
+M#PX-#```A_`3$A$0``"']!<6%10``(?X&QH9&```A_P?'AT<``"8#*V$CAD`
+M`)@0?2C@````F!2<"I]K``"8'````````)A`(&H!>@``F%0```A9``"9````
+M`````)D$````````F0@```````"9#`"``````)D0`````0``F1P```R```"9
+M(`40`````)DH`````0``F2P````$``"9-!X?("(``)DX"@L,#0``F3P````_
+M``"92)*`LA(``)E475#AB```F5P`2VJ.``"9:````\X``)EP&2^U%0``F7@`
+M```!``"9?````````*(0`(!C,P``HA0`$&P0``"B&`"<0&```*(@`8@PQ@``
+MHB0```0```"B+````````*(T("`@(```HC@@("`@``"B0#A)"B```*)$``![
+MM@``HD@/_S_\``";`````````)LH````#```FS@````2``";9````"$``)N,
+M````+0``FYP````S`````P`&``D`/P```````P`&``D`/P``````"0````0`
+M!``!``$``0``````````````!D9'.```````````````````!`````$``0``
+M````````````!$9'-P```````````````````P`!``$``0``````````````
+M`T9'-@``````````````````!````````0```````````````49'-0``````
+M````````````!``!``$``````````````````$9'-```````````````````
+M!`````$`````````````_____D9',P```````````````````P`!``$`````
+M````````_____49',@``````````````````!```````````````````____
+M_$9',0```````````````````@`!``$`````````````____^D9',```````
+M````````````````````````````````````````````````````````````
+M```(`````0`#```````````````````````&1D<W```````````````````"
+M````````````````````````1D<V```````````````````!````````````
+M``````#____]1D<U``````````````````````````````````````#____Z
+M1D<T``````````````````````$``0````````````#____X1D<S````````
+M``````````````$``0````$``0````#____V1D<R````````````````````
+M``$````!``$``0````#____S1D<Q``````````````````````$````!``$`
+M```!``#____P1D<P````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````(````$````!@````@````*````#`````X````0``$JX``!
+M)%@``268``$GW``!*%P``2D$``$IU``````);`F/";0```D("6P)M``````0
+M0``O_`\`+_P/`"_\'P`O_`\`+_P/```01``O_`\`+_P/`"_\'P`O_`\`+_P/
+M```02``O_`\`+_P/`"_\'P`O_`\`+_P/```03``O_`\`+_P/`"_\'P`O_`\`
+M+_P/```04``O_`\`+_P/`"_\'P`O_`\`+_P/```05``O_`\`+_P/`"_\'P`O
+M_`\`+_P/```06``O_`\`+_P/`"_\'P`O_`\`+_P/```07``O_`\`+_P/`"_\
+M'P`O_`\`+_P/```08``O_`\`+_P/`"_\'P`O_`\`+_P/```09``O_`\`+_P/
+M`"_\'P`O_`\`+_P/```0,````C````'@````L````6````'@```0<````6@`
+M``'@```!N````8P```'@```0L```#F```!&````?'```/C@``!&````0\```
+MH.```4!H``!8@```L.```4!H``"`%`/H`^@&X`;@!"`$(`A`"$`&X`;@``"8
+M!``````````#```````````````#``"8(`("`@`"`@(``@$"``("`@`"`@(`
+M``"8)```#@X```X.```'!P``#@X```X.``"81!-R%AP3<APE$W(7(A-R%J(3
+M<APE``"88```G1```)T0``"=&```G1@``)T0``"89``!S@```<X```'.```!
+MS@```<X```"8:$":09!`FD&00)I!D$":09!`FD&0``"9&````;@```&X````
+MA````0@```&X``"9)!`%B@40!8H%$`6*!1`%B@40!8H%``"B,```````````
+M`````````0@`````````#``````````T````!0```$``````````1`````@`
+M``!(````"````$P````0````4`````````!4````'P``"``````````(!```
+M``````@(````````"`P````````($`````````@4````````"!@````````(
+M'`````````@@````````""0````````2<````````!`X````````$'@`````
+M```0N````````!#X````````$3@````````1>````````!&X````````$?@`
+M```````2.````````!)X````````$K@````````2^````````!,X````````
+M$W@````````3N````````!/X````````%#@````````4>````````!2X````
+M````%/@````````5.````````!5X````````%;@````````5^````````!8X
+M````````%G@````````6N````````!;X````````%S@````````7>```````
+M`!>X````````%_@````````0/````````!!\````````$+P````````0_```
+M`````!$\````````$7P````````1O````````!'\````````$CP````````2
+M?````````!*\````````$OP````````3/````````!-\````````$[P`````
+M```3_````````!0\````````%'P```````"`!````````(`(````````@`P`
+M``````"`(````````(`D````````@"@````P``"`+``'__\``(`P`?___P``
+M@#0````Q``"`.````````(`\````````@$@```````"`5````````(!8````
+M````@%P`#\>/``"`P"J",!H``(#$!=P!X```@,@?0"<0``"`S`'T`````(#0
+M```>'```@-0``JJJ``"`V`(`554``(#<````````@.#_____``"`Y```__\`
+M`(#H````````@.P```````"`\````````(#T````````@/@```````"`_```
+M`(@``(<`````````AP0```",``"'"````.0``(<,```"U0``AQ````````"'
+M%````````(<8````H```AQP```')``"'(````"P``(<D````+```AR@````P
+M``"'+````#P``(<P````+```AS0````L``"'.````#```(<\````/```AT``
+M``````"'1````````(=(````````ATP```````"'4````````(=4````````
+MAU@```````"'7````````(=@````U0``AV0```#?``"':````0(``(=L```!
+M.@``AW````!U``"'=````'\``(=X````H@``AWP```````"!```!``(``($$
+M`````0``@0@```#```"!#````````($0```!:```@10```````"'P`,"`0``
+M`(?$!P8%!```A\@+"@D(``"'S`\.#0P``(?0$Q(1$```A]07%A44``"'V!L:
+M&1@``(?<'QX='```A^`#`@$```"'Y`<&!00``(?H"PH)"```A^P/#@T,``"'
+M\!,2$1```(?T%Q85%```A_@;&AD8``"'_!\>'1P``)@,K82.&0``F!!]*.``
+M``"8%)P*GVL``)@<````````F$`@:@%Z``"85```"%D``)D`````````F00`
+M``````"9"````````)D,`(``````F1`````!``"9'```#(```)D@!1``````
+MF2@````!``"9+`````0``)DT'A\@(@``F3@*"PP-``"9/````#\``)E(DH"R
+M$@``F51=4.&(``"97`!+:HX``)EH```#S@``F7`9+[45``"9>`````$``)E\
+M````````HA``@&,S``"B%``0;!```*(8`)Q`8```HB`!B##&``"B)```!```
+M`*(L````````HC0@("`@``"B."`@("```*)`.$D*(```HD0``'NV``"B2`__
+M/_P``)L`````````FR@````,``";.````!(``)MD````(0``FXP````M``";
+MG````#,``````````````#`````5````%0```!4````5````%0``@!P2C9.G
+M"8@3SP3@$Y42X!.K"8@3SP``F"@*`@`!"@(``04"```*`@`!"@(``0``F#0`
+M``X````.````#@````X````.````F#@````"`````@````H````*````"@``
+MF$@`&-IM`!C:;0`::F<`&FIG`!IJ9P``F%`-Z+3@#>BTX`WHL-H,F+#:#>BP
+MV@``F%A^@`TN?H`-+G[H#2Y^R`TN?H`-+@``F%PQ-V9>,3=F7C$W9EXQ.6!>
+M,3=F7@``F&P%#+"!!0RP@04,L($%#+"!!0RP@0``F10```?0```'T```!$P`
+M``B8```'T```F43WN!``][@0`/>X#0#WN!``][@0````H@0`````````````
+M````````````````H@C6OF>(UKYGB-`^9XC0/F>(T#YGB```H@P`+`%``"P!
+M0`!"P4``0L%``$+!0```HAP8@X`*&(.`"AAC@`H8@X`*&(.`"@``$C````/@
+M``"`8`````\``($8````````@1P```````"!(````````($D````````@2@`
+M``````"!+````````($P````````@30```````"!.````````($\````````
+M@4"```"H``"!1````````)@(``!`````F"P``*````"8/``@!````)A,$H0C
+M/```F'`````?``"8=````(```)AX````#@``F5@```#_``"9@````````)F$
+M`H``````F:````````"9X`````$``)GDJJJJJ@``F>@\1F1X``"9[````*H`
+M`)GP````#```F?0```#_``"9^````!0``*(H```)M0``HCR3R(FO``"B3```
+M``$``*)0``"@````HE0```````"B6`S'4X```*)<#P\/`0``HF!?:0\!``"B
+M9`!!BA$``*)H````````HFP,,,%J``"B<`""""```*)T"!H\J@``HG@<YSG.
+M``"B?`47`<X``*,`%@$`````HP0L`R0"``"C"$A#/D(``*,,6@]0"P``HQ!L
+M2V)*``"C%'Z+=(H``*,8EL^,RP``HQRC3YT/``"C(*?/I8\``*-(/____P``
+MHTP_____``"C4#____\``*-4``/__P``HUAYJ*H?``"C7`9L0@\``*-@#R@B
+M!P``HV078!:%``"C:!^`$00``*-L-Z`,`P``HW`_Q`B#``"C=%?`"`,``*-X
+M7]@&@@``HWQ_X`2"``"C@'\\>[H``*.$\S!_\```FP0````!``";"`````(`
+M`)L,`````P``FQ`````$``";%`````4``)L8````"```FQP````)``";(```
+M``H``)LD````"P``FRP````-``";,````!```)LT````$0``FSP````3``";
+M0````!0``)M$````%0``FT@````8``";3````!D``)M0````&@``FU0````;
+M``";6````!P``)M<````'0``FV`````@``";:````"(``)ML````(P``FW``
+M```D``";=````"4``)MX````*```FWP````I``";@````"H``)N$````*P``
+MFX@````L``";D````#```)N4````,0``FY@````R``";H````#0``)ND````
+M-0``FZ@````U``";K````#4``)NP````-0``F[0````U``";N````#4``)N\
+M````-0``F\`````U``";Q````#4``)O(````-0``F\P````U``";T````#4`
+M`)O4````-0``F]@````U``";W````#4``)O@````-0``F^0````U``";Z```
+M`#4``)OL````-0``F_`````U``";]````#4``)OX````$```F_P````:``":
+M``````````````":!`````````!```":"`````````"```":#`````````&!
+M``":$`````````'!``":%``````````!``":&`````````!!``":'```````
+M``"!``":(`````````&(``":)`````````'(``":*``````````(``":+```
+M``````!(``":,`````````"(``":-`````````&)``":.`````````')``":
+M/``````````)``":0`````````!)``":1`````````")``":2`````````&0
+M``":3`````````'0``":4``````````0``":5`````````!0``":6```````
+M``"0``":7`````````&1``":8`````````'1``":9``````````1``"::```
+M``````!1``":;`````````"1``":<`````````%X``":=`````````&X``":
+M>`````````'X``":?``````````X``":@`````````!X``":A`````````%Y
+M``":B`````````&Y``":C`````````'Y``":D``````````Y``":E```````
+M``!Y``":F`````````"Y``":G`````````#Y``":H`````````#Y``":I```
+M``````#Y``":J`````````#Y``":K`````````#Y``":L`````````#Y``":
+MM`````````#Y``":N`````````#Y``":O`````````#Y``":P`````````#Y
+M``":Q`````````#Y``":R`````````#Y``":S`````````#Y``":T```````
+M``#Y``":U`````````#Y``":V`````````#Y``":W`````````#Y``":X```
+M``````#Y``":Y`````````#Y``":Z`````````#Y``":[`````````#Y``":
+M\`````````#Y``":]`````````#Y``":^`````````#Y``":_`````````#Y
+M``"8U````"```)C0`@`4"`(!%`@"`!0(`@`4"`(!%`@``)C<`*`@P`"@(,``
+MX"#``.`@P`#@(,```)B<$````!`````0````$````!```````)B<````````
+M`````````````````````)B<`````````````````````````````)B<````
+M`````````````````````````)B<`````````````````````````````)B<
+M`````````````````````````````)B<````````````````````````````
+M`)B<`````````````````````````````)B<````````````````````````
+M`````)B<`````````````````````````````)B<````````````````````
+M`````````)B<`"H````J````*@```"H````J`````)B<````````````````
+M`````````````)B<`````````````````````````````)B<`!`````0````
+M$````!`````0`````)B<``(````"`````@````(````"`````)B<`',```!S
+M````<P```',```!S`````)B<`/@```#X````^````/@```#X`````)B<`.<`
+M``#G````YP```.<```#G`````)B<`!0!```4`0``%`$``!0!```4`0```)B<
+M`)$`0`"1`$``D0!``)$`0`"1`$```)B<``<`&@`'`!H`!P`:``<`&@`'`!H`
+M`)B<`$$```!!````00```$$```!!`````)B<`($```"!````@0!@`($`8`"!
+M`&```)B<``((```""````@@#``((`P`""`,``)B<````````````````````
+M`````````)B<`````````````````````````````)B<```68```%F```!9@
+M```68```%F```)B<```6B```%H@``!:(```6B```%H@``)C$`````0````$`
+M```!`````0````$``)B<``!D````9````&0```!D````9````)B<```(````
+M"`````@````(````"````)C,````#@````X````.````#@````X``6[\``%O
+M!``!;PP``6\D``%O)``!;Q0``6\<`````#`N.2XR,"XS`````````6````%H
+M```!<````````````8@`\`#S`8D`@`"#`8H`\@#U`8L`]@#W`8P`\0#T`8T`
+M@0"$`8\`@@"%````90```````?____\```"`_____P````!*4```#[0`````
+M````:@```````?____\```"`_____P````!*4```#[0`````````0`#P`/.!
+MB`#P`/,`00"``(.!B0"``(,`2`#R`/6!B@#R`/4`0P#V`/>!BP#V`/<`2@#Q
+M`/2!C`#Q`/0`2P"!`(2!C0"!`(0`3`""`(6!CP""`(4)"`E$!08H*```````
+M``````````````````````````F%"84%!B@H````````````````````````
+M````````"84)A10&*"@````````````````````````````````)A0F%$@8H
+M*```````````````````!`````````````G0"JP%!B@H````````````````
+M````````````````"0@)1`4&%`4````````````````````````````````)
+M"`E$%``4!0````````````````````````````````EL":@%!A0%````````
+M````````````````````````"6P)J!0`%`4```````````````````!`````
+M```````);`FH'@`4!0````````````````````````````````EL"9X;!A0%
+M````````````````````````````````"6P)GA0`%`4`````````````````
+M``!````````````)@`F*%``4!0````````````````````````````````F9
+M":@4`!0%````````````````````````````````"=`*K`4&%`4`````````
+M```````````````````````)HPFH%``4!0``````````````````("``````
+M``````D("404`!0%````````````````````````````````"6P);!0`%`4`
+M```````````````````````````````)<0F`%``4!0``````````````````
+M``````````````F%"8H4`!0%````````````````````````````````"8\)
+MF10`%`4````````````````````````````````)G@F>%``4!0``````````
+M``````````````````````FC":,4`!0%``````````"````````$````````
+M````":,)HQ0`%`4``````````(`````````````````````)J`FH%``4!0``
+M````````@```````!`````````````FH":@4`!0%``````````"`````````
+M````````````"0@)1`4&%`4````````````````````````````````)"`E$
+M%``4!0````````````````````````````````EL":@%!A0%````````````
+M````````````````````"6P)J!0`%`4````````````````````@````````
+M```);`FH'@`4!0````````````````````````````````EL"9X;!A0%````
+M````````````````````````````"6P)GA0`%`4````````````````````@
+M```````````)@`F*%``4!0````````````````````````````````F9":@4
+M`!0%````````````````````````````````":,)J!0`%`4`````````````
+M`````"`@```````````)M`FT!084!0``````````````````````````````
+M``FT";04`!0%```````````````````H(```````````"=`*K`4&%`4`````
+M```````````````````````````)"`E$%``4!0``````````````````````
+M``````````EL"6P4`!0%````````````````````````````````"7$)@!0`
+M%`4````````````````````````````````)A0F*%``4!0``````````````
+M``````````````````F/"9D4`!0%````````````````````````````````
+M"9X)GA0`%`4````````````````````````````````)HPFC%``4!0``````
+M````@```````!`````````````FC":,4`!0%``````````"`````````````
+M````````":@)J!0`%`4``````````(````````0````````````)J`FH%``4
+M!0``````````@`````````````````````FT";04`!0%``````````"`````
+M```$````````````";0)M!0`%`4``````````(`````````````````````4
+M"A1:!08H*````````````````````````````````!2"%-(%!B@H````````
+M``$`````````````````````%/H5<@4&*"@`````````````````````````
+M```````5FA82!08H*``````````!`````````````````````!0>%$8%!B@H
+M````````````````````````````````%&X4O@4&*"@``````````0``````
+M```````````````4YA5>!08H*````````````````````````````````!6&
+M%B8%!B@H``````````$`````````````````````%%`4>!$&*"@`````````
+M```````````````````````44!1X%P8H*```````````````````````````
+M`````!1:%%H1!B@H````````````````````````````````%%H46A<`*"@`
+M```````````````````````````````4H!2@%P8H*``````````!````````
+M``(``````````!2@%*`4!B@H``````````$``````````@``````````%((4
+M@A$`*"@``````````0`````````"```````````4JA2J%``H*``````````!
+M``````````(``````````!2"%*H4`"@H``````````$``````````@``````
+M````%((4JA<&*"@``````````0`````````"```````````5I!8<%`8H*```
+M```````!``````````(``````````!:`%J@4`"@H````````````````````
+M````````````%H`6J!X&*"@````````````````````````````````6A1:M
+M'@8H*````````````````````````````````!1:%((/`"@H``````````,`
+M```````$````````````%*H4JA(`*"@``````````P````````0`````````
+M```5I!8<%``H*``````````#````````!````````````!:`%J@4`"@H````
+M```````````````$````````````$S,3/1<`"@4````````````````````0
+M$``````````31Q-1%P`*!0```````````````````!`0`````````!,X$W07
+M`!04````````````````````$`<`````````$TX3>QL&!04`````````````
+M```````!```````````341-Y'@8*!0````````````````````$`````````
+M`!-6$W0A!A0%`````````````````````0``````````$ZL3L!<`"@4`````
+M```````````````0#``````````3L!/8%P`4%````````````````````!`"
+M`````````!._$[\7``H%````````````````````$`P`````````%``4>`4&
+M%!0````````````````````````````````4,A1N%P`4%```````````````
+M`````!@!`````````!0R%&X4`!04````````````````````&`$`````````
+M%#P4>`\`%!0````````````````````%```````````4/!1X$084%```````
+M``````````````$!`````````!0\%'@2`!04````````````````````!0``
+M````````%#P4>!0`%!0````````````````````%```````````4/!1X%P`4
+M%`````````````````````4``````````!0\%'@7!A04````````````````
+M`````0``````````%#P4R!0&%!0``````````@`````````$```````````4
+M>!2@%P`4%``````````!``````````4``````````!2,%*`7`!04````````
+M``,`````````!0``````````%(P4R!(`%!0``````````P`````````%````
+M```````4C!3(%``4%``````````'````````@`4``````````!2,%,@4!A04
+M``````````,``````````0(`````````%(P4R!<&%!0``````````P``````
+M```!`@`````````4C!3(%P84%``````````#``````````$``````````!2,
+M%,@>`!04````````````````````````````````%(P61`4&%!0`````````
+M`P`````````````````````4H!3($084%``````````#``````````$`````
+M`````!5\%?0>!A04``````````(`````````!```````````%7P61!0&%!0`
+M`````````P`````````!!``````````5?!9$&P`4%``````````#````````
+M``4``````````!5\%D0>`!04``````````,`````````!0``````````%7P6
+M1!<`%!0`````````!P```````(`!```````````6<1:M%P`4%```````````
+M`````````````````````!9Q%JT>!A04````````````````````````````
+M````%G$6K1X&%!0``````````@`````````$```````````6<1;!!084%```
+M`````````````````````````````!9Q%L$1`!04````````````````````
+M````````````%G$6P10`%!0````````````````````````````````6<1;!
+M'@`4%````````````````````````````````!9Q%L$>!A04````````````
+M``````````,`````````%G$6P1X&%!0`````````````````````````````
+M```3.!-T'@`4%```````````````````!````````````!.P$]@>`!04````
+M```````````````$````````````%#(4;AX`%!0``````````P````````0`
+M```````````4/!1X'@`4%``````````#````````!````````````!2,%,@>
+M`!04``````````,````````$````````````%G$6P1X`%!0`````````````
+M``````0````````````5?!9$'@`4%``````````#````````!```````````
+M`!2,%,@>`!04````````````````````````````````%#P4>!X`%!0`````
+M```````````````````````````6P1;!'@`4%```````````````````!```
+M`````````````?\!_P````````````!__________P````````````,!F`&9
+M`````````````'__________````````````!P&8"S``````````````?___
+M______\````````````(`9@,,`````````````!__________P``````````
+M`"`!(`H0`````````````'__________````````````(0$@`9D`````````
+M````?_________\````````````B`2`,,`````````````!__________P``
+M`````````#H!8`H0`````````````'__________````````````.P%@`9D`
+M````````````?_________\````````````2`64*$````````P````!_____
+M_____P```````````#<!,`&9```````#`````'__________````````````
+M-0(P`9D```````,`````?_________\````````````V`S`!F0```````P``
+M``!__________P```````````#`$,`&9```````#`````'__________````
+M````````.04P`9D```````,`````?_________\````````````T!C`!F0``
+M`````P````!__________P```````````#(#,`&9```````#`````'______
+M____````````````,0,P`9D`````````````?_________\````````````1
+M`1`!F0````````````!__________P```````````!`!$`H0````````````
+M`'__________````````````4@%0`9D`````````````?_________\`````
+M``````!%`E`!F0````````````!__________P```````````$<#4`&9````
+M`````````'__________````````````0@10`9D`````````````?_______
+M__\```````````!8!5`!F0````````````!__________P```````````%L&
+M4`&9`````````````'__________````````````70A0`9D`````````````
+M?_________\```````````!>"5`!F0````````````!__________P``````
+M`````%`#4`H0`````````````'__________````````````50%0##``````
+M````````?_________\```````````!6`E`,,`````````````!_________
+M_P```````````$D"4`U0`````````````'__________````````````0`%`
+M"D```````$8````$`````````"@!B`````````!!`4`*0```````1P````0`
+M````````:`&)`````````$@!0`H0``````!&````!``````````(`8H`````
+M````2@%`"D```````$8````$````````&`@!C`````````!+`4`*0```````
+M1@````0```````!@"`&-`````````$P!0`I0``````!&````!``````````(
+M`8\`````````0P)`"D```````$<````$`````````'`!BP````````#P`T`*
+M0```````1@````0`````````(````````````(`#0`I```````!'````!```
+M``````!@#Z<`````````\0-`"D```````$8````$````````&```````````
+M``"!`T`*0```````1@````0```````!@``^H`````````((#0`I0``````!&
+M````!```````````#ZD`````````\@-`"A```````$8````$````````````
+M``````````"#!$`*0```````1P````0```````"`8`^J`````````/0$0`I`
+M``````!&````!````````)@`````````````A`1`"D```````$8````$````
+M````X``/JP````````"%!$`*4```````1@````0```````"```^L````````
+M`/4$0`H0``````!&````!````````(``````````````A@5`"D```````$<`
+M```$````````@&`/K0````````"'!4`*0```````1@````0```````#@``^N
+M`````````(@%0`I0``````!&````!````````(``#Z\`````````B09`"D``
+M`````$<````$`````````&@/L`````````"*!D`*0```````1@````0`````
+M``!@"`^Q`````````(L&0`I0``````!&````!``````````(#[(`````````
+MC`=`"D```````$<````$````````@&@/LP````````"-!T`*0```````1@``
+M``0```````#@"`^T`````````(X'0`I0``````!&````!````````(`(#[4`
+M````````CPA`"D```````$<````$````````@&@/M@````````"0"$`*0```
+M````1@````0```````#@"`^W`````````)$(0`I0``````!&````!```````
+M`(`(#[@`````````]@E`"D```````$<````$````````@&````````````#W
+M"T`*0```````1P````0```````"`8````````````&``8`!@````````````
+M`'__________````````````80!A`&$```````,`````?_________\`````
+M``````!B`&(`8@```````@````!__________P```````````&,`8P!C````
+M`````````'__________````````````9`!D`&0```````,`````?_______
+M__\```````````!E`&4`90```````P````!__________P```````````&8`
+M9@!F`````````````'__________````````````9P!G`&<`````````````
+M?_________\```````````!H`&@`:`````````````!__________P``````
+M`````&D`:0!I```````#`````'__________````````````:@!J`&H`````
+M``,`````?_________\```````````'_```````!`````0````$;6```````
+M$`````$````!`````1M8````"``#`````0`````````!&U@````,``,````!
+M``````````$;6````"``1P```````````````!M8````,P`P`````0``````
+M```!&U@````D`"$````!`````0````$;6````"@`-P````$``````````1M8
+M````'P`P`````0````$````!&U@````P`%L````!``````````$;6````'``
+M`P````$``````````1M8````.``W`````0`````````!&U@```!4`%4````!
+M`````0````$;6````$0`50````$````!`````1M8````3``[`````0``````
+M````&U@```!@`%(````!`````0````$;6````&0`-`````$``````````1M8
+M````?``@`````0````$````!&U@```"8`%L````!`````0````$;6````)P`
+M4@````$````!`````1M8````J@`0`````0`````````!&U@```"\``,````!
+M``````````$;6````+\`-@````$``````````1M8````Q``W`````0````$`
+M```!&U@```#+`#<````!``````````$;6````-``-P````$``````````1M8
+M````U@`0`````0````$````!&U@```#:``,````````````````;6````S(`
+M-@````$``````````1M8````W@`#`````0`````````!&U@```#I`#<````!
+M``````````$;6````/8`-P````$``````````1M8````^@`W`````0``````
+M```!&U@```#_`#8````!``````````$;6````0P`,`````$````!`````1M8
+M```!%``W`````0`````````!&U@```$L`#<````!``````````$;6````4``
+M$`````$````!`````1M8```!5``#`````0`````````!&U@```%8`"$````!
+M`````0````$;6````5P`-P````$``````````1M8```!8``W`````0``````
+M```!&U@```%D`%L````!``````````$;6````6@`4@````$``````````1M8
+M```!;`!2`````0````$````!&U@```%T`#<````!``````````$;6````7@`
+M`P````$``````````1M8```!?``W`````0`````````!&U@```&(`$`````!
+M```````````;6````8D`00````$``````````!M8```!B@!(`````0``````
+M````&U@```&+`$,````!```````````;6````8P`2@````$``````````!M8
+M```!C0!+`````0``````````&U@```&/`$P````!```````````;6```#Z<`
+M@`````$``````````!M8```/J`"!`````0``````````&U@```^I`((````!
+M```````````;6```#ZH`@P````$``````````!M8```/JP"$`````0``````
+M````&U@```^L`(4````!```````````;6```#ZT`A@````$``````````!M8
+M```/K@"'`````0``````````&U@```^O`(@````!```````````;6```#[``
+MB0````$``````````!M8```/L0"*`````0``````````&U@```^R`(L````!
+M```````````;6```#[,`C`````$``````````!M8```/M`"-`````0``````
+M````&U@```^U`(X````!```````````;6```#[8`CP````$``````````!M8
+M```/MP"0`````0``````````&U@```^X`)$````!```````````;6````9``
+M0@````$``````````1M8```!C@`#`````0`````````!&U@```&8`$4````!
+M`````0````$;6````9H`10````$``````````!M8```!FP!%`````0``````
+M````&U@```&<`%X````!```````````;6````9X``P````$``````````1M8
+M```!K``W`````0`````````!&U@```&F``,````!``````````$;6````;8`
+M-P````$``````````1M8```!N``W`````0`````````!&U@```&Z`#<````!
+M``````````$;6````;X`(0````$````!`````1M8```#)P`#`````0``````
+M```!&U@```'*`%T````!```````````;6````=8`-P````$``````````1M8
+M```!Y``0`````0````$````!&U@```'L`#`````!`````0````$;6````?@`
+M`P````$``````````1M8```"$``W`````0`````````!&U@```(J`"(````!
+M``````````$;6````D(`-P````$``````````1M8```"``!;`````0``````
+M```!&U@```)*``,````!``````````$;6````D\`$`````$````!`````1M8
+M```"7`!2`````0`````````!&U@```)@`#L````!`````0````$;6````F@`
+M-P````$``````````1M8```";``W`````0`````````!&U@```)V`!`````!
+M`````0````$;6````GH``P````$``````````1M8```"@@`#`````0``````
+M```!&U@```*#``,````!``````````$;6````JH`(0````$``````````1M8
+M```"O@!;`````0````$````!&U@```*_`#<````!``````````$;6````L$`
+M-P````$``````````1M8```"Q@`[`````0`````````!&U@```+4`#<````!
+M``````````$;6````O``-P````$``````````1M8```"]``W`````0``````
+M```!&U@```+X``,````!``````````$;6````)X`4`````$````!`````1M8
+M```"_``#`````0`````````!&U@```,,`#`````!``````````$;6````Q0`
+M-@````$``````````1M8```#&``V`````0`````````!&U@```,D``,````!
+M``````````$;6````Q```P````$``````````1M8```#.@`W`````0``````
+M```!&U@```-(`!`````!`````0````$6P0```TH`$@````$````!`````1M8
+M```#6@`1`````0`````````!&U@```-<`#H````!`````0````$;6````UX`
+M5@````$``````````1M8```"P``#`````0`````````!&U@```-W``,````!
+M``````````$;6````LP``P````$``````````1M8`````````?\0````````
+M`````````0`````````````````````````@"``"````````````````````
+M`/\`````````````````)!$````````````````````4!0``````````````
+M`````@4````````````````````3```````````!4!``````````````````
+M`````````````````````````0``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````)0$```````````````````````````
+M````````````````!```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````U`0````````````````````````````````````
+M```````($```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````$4!```````````````````````````````````````````(``
+M`(``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``50$```````````````````````````````````````````0```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````!E`P````
+M`````````````@`````````#``````````````"``$"`````````````````
+M```)"```````````````````````````````````````````````````````
+M```````````````````````````````````````````(4#``````````````
+M```````````````````#`````````0`$````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````E0,`````````````````(`````
+M````!`````,`````````$"`$````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````3`P`````````````````@`````````$````
+M`P``````"```@$``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````",#`````````````````"``````````0````#````````
+M`````$``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````,P,`````````````````(`````````!`````,```````@```!`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````!#`P
+M`````````````````@`````````$`````P```````````"!`````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````%,#``````````
+M```````"``````````0````#`````````````!``````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````8P,`````````````````(`
+M````````!`````,``````````0`1````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````1`0````````````````````````````
+M``````````````(``0`@```````````````````2!```````````````````
+M(!$`````````````````````````````````````````````````````````
+M```````````````````!(!``````````````````````````````````````
+M````!``"`@`````````````````````````````````````````@$@``````
+M````````````````````````````````````````````````````````````
+M``````````%@$`````````````````$``````````P`````````````"`$"`
+M(```````````````````$,0```````````````````0A````````````````
+M````````````````````````````````````````````````````````````
+M`640`````````````````0`````````#````````````````````.```````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````!0$``````
+M``````````````````````@````"``````````````0`````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````)`0```````````````
+M````````````$`````(`````````````!<<`````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````T!`````````````````````````
+M`(```````@````````````"`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````$0$`````````````````$````````@``````"
+M````````````0(``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````5`0`````````````````0```````"```````(`````````
+M`@!`@```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````!D!````````````````````````````(`````@````````````"(````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````'0$``
+M```````````````$````````@`@````"````````````0(0`````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````A`0```````````
+M``````0```````"`"`````(``````````@!`A```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````"4!`````````````````````
+M`````(```````@````````````"!QP``````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````+0$`````````````````$````````@```
+M```"````````````0(''````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````U0_P``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````H````````````````````*````````````````````````
+M````````"C#_``````````````````````````"``````P``````````````
+M````````````````````````````````````````````````````````````
+M```!`````````````````````0`````````````````````$```````````+
+M,#```````````````````````````0`````#````````````````````````
+M``````````````````````````````````````````````````````"`````
+M````````````````@`````````````````````0```````````PP,```````
+M```````````````````"``````,`````````````````````````````````
+M`````````````````````````````````````````````!``````````````
+M```````0````````````````````!```````````"A`0````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````(````````````````````"``
+M```````````````````$```````````*0$``````````````````````````
+M>&`````"````````````````````````````````````````````````````
+M``````````````````````````I````````````````````$0```````````
+M``````````0```````````I00```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````@````````````````````(````````````````````
+M!````````````9DP````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````"`````````````````````@````````````````````$````````
+M````8/\````````````````#````````!``````(```````#X```````````
+M`````````````L``````````````````````````````````````````K\``
+M``````````````````OP``````````````````````@```````````!F_P``
+M``````````````,````````$``````@```````/@````````````````````
+M```"P``````````````````````````````````````````'P```````````
+M`````````?``````````````````````"````````````&?_````````````
+M`````P````````0`````"````````^````````````````````````+`````
+M`````````````````````````````````````"_````````````````````+
+M\``````````````````````(````````````:/\````````````````#````
+M````!``````(```````#X````````````````````````L``````````````
+M````````````````````````````5\```````````````````!7P````````
+M``````````````@```````````!A_P````````````````,````````$````
+M`!````````/@````````````````````````````````````````````````
+M``````````````````"OP```````````````````"_``````````````````
+M````"````````````&+_`````````````````P````````0`````$```````
+M`^````````````````````````+`````````````````````````````````
+M`````````*_````````````````````+\``````````````````````(````
+M````````8_\````````````````#````````!``````(```````!X```````
+M`````````````````L``````````````````````````````````````````
+M+\````````````````````OP``````````````````````@```````````!D
+M_P````````````````,````````$`````!```````!P`"```````````````
+M```````"P``````````````````````````````````````````'P```````
+M`````````````?``````````````````````"````````````&7_````````
+M`````````P````````0`````$```````"(0`````````````````````````
+M`````````````````````````````````````````%?`````````````````
+M```5\``````````````````````(````````````:?\````````````````#
+M````````!``````0```````#P````````````````````````L``````````
+M````````````````````````````````!\````````````````````'P````
+M``````````````````@```````````!J_P````````````````,````````$
+M`````!````````/`````````````````````````````````````````````
+M```````````````````````OP```````````````````"_``````````````
+M````````"````````````9C_````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````T`````````````````````````````````
+M``````````$$`/H#`($``F0"9`$$`?0'`($``<D!R0$$`^@"`((!`.0`Y`$$
+M!]`&`(0"`*``H`$$"[@!`(8#`(P`C`$"%W`+`(P$`#P`/`$"(R@/`!($`#P`
+M/`$"+N`*`)@&`#``,`$"1E`.`"0&`#``,`$"7<`)`#`(`"P`+`$"C*`-`$@(
+M`"P`+`$"NX`(`&`(`"P`+`$"TO`,`&P(`"P`+```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````P`````````````
+M``````````````````````````````$``^@;`((```````$`!]`:!(0!````
+M``$`%7P9!(L"``````$`*O@8!)8#```````"%W`+``P$```````"(R@/`!($
+M``````$"+N`*`!@&``````$"1E`.`"0&``````$"7<`)`#`(``````$"C*`-
+M`$@(``````$"NX`(`&`(``````$"TO`,`&P(````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````0```````````````````````````````````````````$``^@;`((`
+M``````$`!]`:!(0!``````$`%7P9!(L!``````$`*O@8!)8!````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````@`````````````````````````````````
+M``````````$#%W`+`(P```````$#(R@/`!(```````$#+N`*`)@"``````$#
+M1E`.`"0"``````$#7<`)`+`$``````$#C*`-`$@$``````$#NX`(`&`$````
+M``$#TO`,`&P$````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````<`````````````
+M``````````````````````````````$#%W`+`(P```````$#+N`*`)@"````
+M``$#1E`.`"0"``````$#7<`)`+`#``````$#C*`-`$@#``````$#NX`(`&`#
+M``````$#TO`,`&P#````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````@```````````````````````````````````````````$"!=P+`(,`
+M``````$"",H/``0```````$""[@*`(8"``````$"$90.``D"``````$"%W`)
+M`(P$``````$"(R@-`!($``````$"+N`(`!@$``````$"-+P,`!L$````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````@`````````````````````````````````
+M``````````$""[@+`(8```````$"$90/``D```````$"%W`*`(P"``````$"
+M(R@.`!("``````$"+N`)`)@$``````$"1E`-`"0$``````$"7<`(`#`$````
+M``$":7@,`#8$````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````@`````````````
+M``````````````````````````````$"%W`+`(P```````$"(R@/`!(`````
+M``$"+N`*`)@"``````$"1E`.`"0"``````$"7<`)`+`$``````$"C*`-`$@$
+M``````$"NX`(`&`$``````$"TO`,`&P$````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(
+M``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```````
+M```!,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q
+M+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP,0``
+M``````@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(
+M``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```````
+M```!,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q
+M+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP,0``
+M``````@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(
+M``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```````
+M```!,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q
+M+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP,0``
+M``````@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(
+M``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```````
+M```!,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q
+M+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP,0``
+M``````@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(
+M``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```````
+M```!,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q
+M+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP,0``
+M``````@``````````3`Q+C`Q````````"``````````!,#$N,#$````````(
+M``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```````
+M```!,#$N,#$````````(``````````$P,2XP,0````````@``````````3`Q
+M+C`Q`````"YS>6UT86(`+G-T<G1A8@`N<VAS=')T86(`+G)E9VEN9F\`+G)E
+M;&$N=&5X=``N<F5L+G1E>'0`+G)E;&$N<F]D871A`"YR96PN<F]D871A`"YR
+M96QA+F1A=&$`+G)E;"YD871A`"YD871A,0`N8G-S`"YN;W1E````````````
+M```````````````````````````````````````````````````;<```!@``
+M``(`````````-````!@```````````````0````8````*0````$````&````
+M`````%```8"0```````````````0`````````"\````)`````````````A_$
+M```DB`````\````"````!`````@````D````!`````````````)$3```````
+M```/`````@````0````,````/@````$````"```````!@.```#:`````````
+M```````0`````````$8````)`````````````D1,```&V`````\````%````
+M!`````@````Y````!`````````````)+)``````````/````!0````0````,
+M````5P````$````#```````!MV```$IP```````````````0`````````%T`
+M```)`````````````DLD````&`````\````(````!`````@```!2````!```
+M``````````)+/``````````/````"`````0````,````9P````$````#````
+M```"`=`````````````````````0`````````&X````(`````P```````@'0
+M````````````````````$`````````!S````!P````````````(!T```!!``
+M``````````````$`````````$0````,````````````"!>````!Y````````
+M```````!``````````$````"`````````````@D$```-4````!`````(````
+M!````!`````)`````P````````````(65```"6\```````````````$`````
+M``````````````````````````````````````,```(````````````````#
+M```%`````````````````P``"`````````````````,```$`````````````
+M```#```+`````````````````P``#`````````````````,```T````!``"M
+M2````F`2```"````#```S90```+4$@```@```!<``-O8```!A!(```(````B
+M``$Q2````4`2```"````+0``MC@````\$@```@```#@``%H@```!*!(```(`
+M``!#``!#X````:01```(````3@``HL0````P$@```@```%D``)VH````&!(`
+M``(```!D``"!\`````@2```"````;P``;FP```,D$@```@```'H```X,````
+ML!(```(```"%``%!`````#@2```"````D```J8@```!8$@```@```)L``'ZP
+M````3!(```(```"F``#0:````-02```"````L0``">0```"`$@```@```+P`
+M`&1H````\!(```(```#'``$=5````+P2```"````T@``$V0```'0$@```@``
+M`.T``$C,```!I!$```@```#X``">^````*`2```"```!`P``!$@````P$@``
+M`@```0X``2"@````>!(```(```$9```````````0```````!.@``H7````$P
+M$@```@```44``*$P````0!(```(```%0``%'A````9P2```"```!6P``G]P`
+M``!P$@```@```68``)?\````G!(```(```%Q``"?F````#02```"```!?```
+MGD````",$@```@```8<``&+$````A!(```(```&2``#18````$P2```"```!
+MG0``H$P```"L$@```@```:@``)L4````1!(```(```&S```#2````0`2```"
+M```!O@``GLP````L$@```@```<D``0`L```!5!(```(```'4``!\;````)`2
+M```"```!WP``VIP```"($@```@```>H``0F`````R!(```(```'U``$*2```
+M`$P2```"```"`````>P```%0$@```@```@\``.P8```$8!(```(```(:``"T
+M$````5`2```"```")0`!!3@```.<$@```@```C```*>,```!_!(```(```([
+M``"U<````!02```"```"1@```SP````,$@```@```E$```1X```"6!(```(`
+M``)G``#91````#02```"```"<@``T3P````D$@```@```GT``(H\```--!(`
+M``(```*(``"`K`````@2```"```"DP`!04````%`$@```@```IX``2/$````
+M5!(```(```*I``%:_````"02```"```"M```@I0```8T$@```@```K\``4.\
+M````\!(```(```+*``!ES```"!02```"```"U0`!!%P```#<$@```@```N``
+M`)V@````"!(```(```+K``"W$````&P2```"```"]@`!&IP```'($@```@``
+M`P$``5ML```"<!(```(```,,``"@^````#@2```"```#%P``;>````",$@``
+M`@```R(``2$8````6!(```(```,M```````````2```````#.@`!'30````@
+M$@```@```T4``2'H````"!(```(```-0``";L````+02```"```#6P``!S``
+M``)8$@```@```VP``0W@```)-!(```(```-W``"=P````!@2```"```#@@`!
+M,H@```#8$@```@```XT``'>P````W!(```(```.8``#CB```!T02```"```#
+MHP``N#````!4$@```@```ZX``*^H````-!(```(```.Y``"B]```!)@2```"
+M```#Q```J>````-H$@```@```\\``0KD```!X!(```(```/:``$D&```!N`2
+M```"```#Y0``F<0```"@$@```@```_```)WX````"!(```(```/[``%>2```
+M!.02```"```$!@``G+````!P$@```@``!!$``$"8```!I!$```@```0<``$W
+ML````%02```"```$)P``S7`````D$@```@``!#(``)>@````+!(```(```0]
+M``":9````+`2```"```$2``!(B0```&@$@```@``!%,``)DP````E!(```(`
+M``1>``#4=````V02```"```$:0`!&(0```(8$@```@``!'0``44X```!+!(`
+M``(```1_``!,8````(@2```"```$B@``````````$```````!*H`````````
+M"1$```@```2Z``#=7````)P2```"```$Q0``<9````!H$@```@``!-```)MP
+M````0!(```(```3;``#9[````+`2```"```$Y@``G@`````X$@```@``!/$`
+M`````````!(```````4```!"/````:01```(```%"P``L]````!`$@```@``
+M!18``'DX````6!(```(```4A``"`M````302```"```%+```1R@```&D$0``
+M"```!3<``**@````)!(```(```5"``"WL````(`2```"```%30`!+I@```*P
+M$@```@``!5@``+:<````=!(```(```5C``!%A````:01```(```%;@`!%X0`
+M``!X$@```@``!7D``````````!(```````6(``"7S````#`2```"```%DP``
+MG\P````0$@```@``!9X``)C0````8!(```(```6I```!G````%`2```"```%
+MMP````P````0$0``"```!<D``('X````G!(```(```74``$TU````M@2```"
+M```%WP``M=@```!@$@```@``!>H``%CH````X!(```(```7U``$7%````'`2
+M```"```&````M9P````\$@```@``!@L``0J4````4!(```(```86``#JS```
+M`1`2```"```&(0`!(?`````T$@```@``!BP``'F0```!V!(```(```8W``$(
+MU````*P2```"```&0@``6<@```!8$@```@``!DT``'W,````V!(```(```98
+M```2*````(@2```"```&8P``"Z````)L$@```@``!FX``'O@````C!(```(`
+M``9Y``$Y*```!V02```"```&A```_B@```"D$@```@``!H\``.O<````/!(`
+M``(```::``!(X````$02```"```&I0``!M````!@$@```@``!K```)B8````
+M.!(```(```:[```````````2```````&RP`!0H````$\$@```@``!M8``1QD
+M````T!(```(```;A``"(R````702```"```&[```````````$```````!PP`
+M``ID```!/!(```(```<7``%_J````.@2```"```'(@``<?@```5<$@```@``
+M!RT``+B$```![!(```(```<X```````````2```````'1@`!1G````"@$@``
+M`@``!U$``4K8````"!(```(```=<```/C````/`2```"```'9P``EW`````P
+M$@```@``!W(``+6$````&!(```(```=]``#,W````)02```"```'B```?90`
+M```X$@```@``!Y,``-WX```%D!(```(```>>``%*\```$`P2```"```'J0``
+M/O0```&D$0``"```![0``'S\````F!(```(```>_```2L````+02```"```'
+MR@`!1Q````!T$@```@``!]4``2!T````)!(```(```?@``">.`````@2```"
+M```'ZP``_4````#H$@```@``!_8``#U0```!I!$```@```@!``!W?````"@2
+M```"```(#```"8@```!<$@```@``"!<``1X0```"9!(```(```@B``$-.```
+M`*@2```"```(+0``M6`````0$@```@``"#@``4#P````"!(```(```A#```0
+M?````:P2```"```(3@``MG0````H$@```@``"%D``%M(````/!(```(```AD
+M``!1S```!QP2```"```(>@``MWP````T$@```@``"(4``42L````C!(```(`
+M``B0``"Z<```$FP2```"```(FP``?OP```&P$@```@``"*8``$A(````F!(`
+M``(```BQ``"S,````*`2```"```(O```G2````"`$@```@``",<``4D@````
+M]!(```(```C2``"=V````"`2```"```(W0`!2C@```"@$@```@``".@``)QD
+M````3!(```(```CS``![<````'`2```"```(_@``T:P```+($@```@``"0D`
+M`1?\````(!(```(```D4``%*X`````@2```"```)'P``>(P```"L$@```@``
+M"2H``5L@````3!(```(```DU``";6````!@2```"```)0```]M````%@$@``
+M`@``"4L``$O4````C!(```(```ED``$8'````&@2```"`'IZ,#)D8F8X-S4`
+M>GHP,F1B,C`U,P!Z>C!F8F(Q93-F`'IZ,#5B.&,V-6$`>GHP-6(Y-#)E9`!Z
+M>C`P,3EF-#<P`'IZ,#)D9#DT,F0`>GHP,F1B93<S9`!Z>C`P-6(V.3)B`'IZ
+M,&(V9#(S,C4`>GHP,#$V9#DR90!Z>C!C9F(Q.#<U`'IZ,#`U8C=D-V$`>GHP
+M,&(V8V8U90!Z>C!B-F8U,&(X`'IZ,#9E,&$T9F4`>GHP,#8W9#)B,0!Z>C`P
+M,F1B8S8Q`'IZ,#`U8C9C9F0`871H7VAA;%]P<F]C97-S7VYO:7-E9FQO;W(`
+M>GHP,#5B-#AA9`!Z>C`R9&)F,6(R`'IZ,#,S96,X8F8`>GHP9&(T,C5C-0!A
+M=&A?:&%L7V1M85]B96%C;VY?<F5S<&]N<V5?=&EM90!Z>C`V93`P8CAA`'IZ
+M,#)D8F9C,60`>GHP,#5B.6%B9`!Z>C`R9&)E.#4Q`'IZ,#$V93`P9&0`>GHP
+M,F1B,S%B,@!Z>C`P8C<P.3(S`'IZ,#!B-F0T-3``>GHP,#!B-F0Q9`!Z>C`R
+M9&)D86(R`'IZ,#`Q-F1A-3``>GHP,#`V-V0S,@!Z>C`P8C9D.3(S`'IZ,#`R
+M9&(U,6,`>GHP,39D8V)F90!Z>C`P8C<P,30U`'IZ,&1C-F4S.3``>GHP8C<P
+M.65F9@!A=&A?:&%L7V%T=&%C:`!Z>C`V93!F8S!D`'IZ,#$V9&%B,F0`>GHP
+M93`T-C@T8@!Z>C`Q-F4R.3%D`'IZ,#`P8C9F93@`>GHP,&-F8C-E,`!A=&A?
+M:&%L7V-O;7!U=&5T>'1I;64`>GHP,F1B-6)A8P!Z>C`P-6(W9CED`'IZ,#9D
+M9F8T-&$`>GHP,F1B-3<V,P!Z>C`R9&,Q.6%E`'IZ,#`R9&%F-C(`>GHP,#5B
+M.&8Y9`!Z>C!B.#-A9#-E`'IZ,#`P8C<P-3(`>GHP,#`U8C9B,@!Z>C`U8C=F
+M,3$T`'IZ,#1A93`S,68`>GHP,#4T-V9E9`!Z>C`P8C<Q-S=D`'IZ,#`R9&)A
+M.3(`>GHP,F1B,6%B,@!Z>C`P,#5B-C(R`'IZ,&(V.6(P-V,`871H7VAA;%]F
+M<F5E`'IZ,#)D8F5B8F0`>GHP8C5E,S$U,@!Z>C`Q-F1F8F8Q`&%T:%]H86Q?
+M;6AZ,FEE964`>GHP,39E,3@Y8@!Z>C`R9&(S,S5D`'IZ,&(V8S4S830`>GHP
+M8C9F9#,V,P!Z>C!D8S(Q9#-A`'IZ,#!B-S$W,V0`>GHP,39D.60T,0!Z>C`P
+M-6(X86)D`'IZ,#)D8C,X-S4`>GHP,39E,S`Y8@!Z>C`P-6(V,&(R`'IZ,#!B
+M-S`Q-C$`>GHP-F0Y9&0Y,P!Z>C`P,39D93<R`'IZ,&1B,V5D.#8`>GHP,#5B
+M-#AE9`!Z>C`P,F1B8S0R`'IZ,#`U8C=F,F4`>GHP,F1B9F1F9`!Z>C`Q-F4V
+M-#AA`'IZ,#`R9&%F9C(`>GHP,39D83DR,`!Z>C`U8C<X,64P`'IZ,#`R9&-A
+M,&(`>GHP,&(W,&$W80!Z>C!F86,P8SEB`&%T:%]H86Q?861D:71I;VYA;%]S
+M=V)A7V)A8VMO9F8`871H7VAA;%]V97)S:6]N`'IZ,#)D8F%C,F4`>GHP8C9C
+M9C`P.0!Z>C`P,39E,3)C`'IZ,#`P,F1A96$`>GHP-F1F9&0Y,P!A=&A?:&%L
+M7VUA;&QO8P!Z>C`R9&0Y,F%D`'IZ,#$V9&(R-3$`>GHP93$P-V-A,0!Z>C`R
+M9&,Q-S8S`'IZ,&(V.3!D-F0`>GHP,39D9C`U,0!Z>C`P8C<P-F)C`'IZ,#`Q
+M-F0X-S(`>GHP9#$T9#%B,`!Z>C!B-#@P,S%E`'IZ,#`P8C9F9C@`871H7VAA
+M;%]M96UC<'D`>GHP,39D83!D9`!Z>C`R9&(R.#4Q`'IZ,#9D8C!C9C(`871H
+M7VAA;%]P<F]B90!A=&A?:&%L7V)U:6QD;W!T<P!Z>C!D861C-C)C`'IZ,#`P
+M8C9C,3``>GHP8C<R,6%E9`!Z>C`V-V-F8V%E`'IZ,#`P8C9C9C@`>GHP-6(Y
+M,F%E9`!Z>C!B-F0Y969F`'IZ,#)D8F9F8C$`>GHP8C5E,S$V,`!Z>C!B.#%E
+M83DT`'IZ,#$V9&5C,68`>GHP93@Y-#DP-P!Z>C`P8C9E83=A`'IZ,#,S93AF
+M8F8`>GHP8V9A-3@W-0!Z>C`R9&(Y.6%E`'IZ,#`P-6(W8C(`>GHP9&4V.#,W
+M9@!Z>C!B-S`Y9#`R`'IZ,#8W9#(U93(`>GHP,3EF,V$P,0!Z>C`W,#,Y-#=B
+M`&%T:%]H86Q?;65M>F5R;P!Z>C`Q-F4P8F9E`'IZ,#$V93)D9F0`>GHP-F9E
+M868V,`!A=&A?:&%L7W-W7V)E86-O;E]R97-P;VYS95]T:6UE`'IZ,#EF-C1B
+M-F$`>GHP,#$V8V0S,@!Z>C!B-CDW,V)C`'IZ,#`U8C@X9F0`871H7VAA;%]D
+M96QA>0!Z>C`P8C<R,38Q`'IZ,#$V9&8R-3$`>GHP-C=D,F8T,0!Z>C`R9&(S
+M9&9D`'IZ,#)D8C4S960`>GHP,39D8V5A90!Z>C`P,&(V93(R`'IZ,#5B.#`P
+M-#$`>GHP,#`R9&,U,@!Z>C`P-6(T83)D`'IZ,#`P8C9E-3(`>GHP-C=D,&,T
+M-P!Z>C!D8F)E9#@V`'IZ,#5B-F,V9&(`>GHP8S,Q-65B-0!Z>C`V9#0P-F4P
+M`'IZ,#`R9&0X-F0`>GHP,#$V93$T9`!Z>C`P-C=D,C(Q`'IZ,#`U8C@Y,V0`
+M>GHP-6(X,6(Q8@!Z>C`P,&(V8V4X`'IZ,&(W9C4P8C@`>GHP,S-E8F9B9@!Z
+M>C!B.#)D939D`'IZ,&8T-64V93,`871H7VAA;%]I;FET7V-H86YN96QS`'IZ
+M,#!B-F0V8F,`>GHP,#!B-S`R,@!Z>C`P,#)D8F0R`'IZ,&1A-#@T83$`>GHP
+M838P9#$T-0!Z>C`Q-F4Q,C4Q`'IZ,&1C-F$U8S4`>GHP,39E-CDQ9`!Z>C`R
+M9&)F,S5D`'IZ,#$V934R-3$`>GHP,F1B-3<P80!Z>C`P-6(V9#=A`'IZ,#`R
+M9&(R.3(`>GHP,#5B.3!C8@!Z>C`U8C=C8F0U`'IZ,#`U8C5C-#8`>GHP,#!B
+M-F8Q9`!Z>C`P,39D830X`'IZ,&(V-C,Q83@`871H7VAA;%]G971W:7)E;&5S
+M<VUO9&5S`'IZ,#$V93%B.#<```````@```(%````$````@8```"(```"!0``
+M`)````(&````Q````@4```#,```"!@```/0```(%````_````@8```$\```"
+M!0```40```(&```!3````@4```%4```"!@```6````(%````M````@4```%H
+M```"!@```6P```(%````3````@4```%T```"!@```7@```(%````>````@4`
+M``&````"!@```80```(%```!&````@4````T```"!0```8P```(&```!T```
+M`04```'4```!!@```EP``)4%```"#```E04```)D``"5!@```K```)4%```"
+MM```E08```+,``!$!0```M```$0&```#D```I`4```.4``"D!@``!WP``&L%
+M```'@```:P8```BD``!K!0``"*@``&L&```)H```F04```FD``"9!@``";``
+M``(%```)M````@8```G(```"!0``"<P```(&```)_```F04```H```"9!@``
+M"@P```(%```*$````@8```HX```"!0``"CP```(&```*U```.@4```K8```Z
+M!@``"ZP```(%```+L````@8```_\```!!0``$`````$&```2R```B`4``!+,
+M``"(!@``$NP``)D%```2\```F08``!,4```"!0``$Q@```(&```3L````@4`
+M`!.T```"!@``$]```)D%```3U```F08``!50```"!0``%5@```(&```57```
+M`@4``!5@```"!@``&)@```$%```8G````08``!DL``!S!0``&3```',&```=
+M@````04``!VH```!!@``'L```)L%```=_```FP4``![$``";!@``(6@```$%
+M```A;````08``"&<```!!0``(:````$&```B&```304``"(<``!-!@``(W``
+M``$%```C=````08``"-\```!!0``(X````$&```D1````04``".L```!!0``
+M)$@```$&```M/```<P4``"U```!S!@``+60``)L%```M:```FP8``"V,```!
+M!0``+9````$&```MO````04``"W````!!@``+=````$%```MU````08``"X8
+M``";!0``+AP``)L&```N1````04``"Y(```!!@``+G0```$%```N>````08`
+M`"Z(```!!0``+HP```$&```NT```FP4``"[4``";!@``+OP```$%```O````
+M`08``"\L```!!0``+S````$&```O0````04``"]$```!!@``+V@``$T%```O
+M;```308``"_L```!!0``+_````$&```P(````04``#`D```!!@``,-0```$%
+M```PV````08``#04```!!0``-!@```$&```T=````04``#1X```!!@``.4P`
+M``$%```Y4````08``#E4```!!0``.5@```$&```Z:````@4``#IL```"!@``
+M.GP```(%```Z@````@8``#PT```!!0``/#@```$&``!(7````04``$A@```!
+M!@``2'0```$%``!(>````08``$B,```!!0``2)````$&``!(I````04``$BH
+M```!!@``2+P```$%``!(P````08``$D(```!!0``20P```$&``!)N````04`
+M`$F\```!!@``2=P```,%``!)X````P8``$H8```#!0``2AP```,&``!*;```
+M`04``$IP```!!@``2K@```,%``!*O````P8``$N<```!!0``2Z````$&``!+
+M\````04``$OT```!!@``3`@```$%``!,#````08``$PH```!!0``3"P```$&
+M``!,;````04``$QP```!!@``3/````,%``!,]````P8``$TX```!!0``33P`
+M``$&``!-6````04``$U<```!!@``370```,%``!->````P8``$W8```#!0``
+M3=P```,&``!-X```?P4``$WD``!_!@``3C@```,%``!.0````P8``$[0```!
+M!0``3M0```$&``!/1````04``$[L```!!0``3O````$&``!/"````04``$\,
+M```!!@``3U````,%``!/5````P8``$^\```#!0``3\````,&``!/Q````P4`
+M`$_(```#!@``4%P```$%``!08````08``%(H```!!0``4BP```$&``!20```
+M`04``%)$```!!@``4F````$%``!29````08``%*$```!!0``4EP```$%``!2
+MB````08``%*4```!!0``4I@```$&``!2L````04``%*T```!!@``4M````$%
+M``!2U````08``%,X```!!0``4T````$&``!3E````@4``%.8```"!@``4YP`
+M``(%``!7M````@4``%.@```"!@``5$P```,%``!48````P8``%1\```#!0``
+M5(````,&``!4F````P4``%2<```#!@``5#P```,%``!4N````P8``%34```#
+M!0``5-@```,&``!4&````P4``%3T```#!@``500```$%``!5"````08``%4D
+M```!!0``52@```$&``!54````04``%54```!!@``5AP``)L%``!6(```FP8`
+M`%>X```"!0``5[P```(&``!7W````04``%?@```!!@``5_````$%``!7^```
+M`08``%I\``"(!0``6=0``(@%``!9V```B`8``%I,```!!0``6E````$&``!:
+MW```B`4``%K@``"(!@``6U```(@%``!;5```B`8``%ST```!!0``7/@```$&
+M``!=O````04``%V(```!!0``77````$%``!=-````04``%T0```!!0``79``
+M``$&``!=F````04``%V@```!!@``7<P```$%``!=T````08``%XL```#!0``
+M7C0```,&``!>.````P4``%X\```#!@``7D````,%``!>1````P8``%Y(```!
+M!0``7DP```$&``!?"````P4``%\0```#!@``7Q0```,%``!?&````P8``%\<
+M```#!0``7R````,&``!?)````04``%\H```!!@``7\0```$%``!?R````08`
+M`%_T```!!0``7_@```$&``!@#````04``&`0```!!@``8R@``!X%``!C+```
+M'@8``&0P``!F!0``9#0``&8&``!DG```?P4``&2@``!_!@``9*0```(%``!D
+MJ````@8``&4@```"!0``920```(&``!E9````@4``&5H```"!@``96P```(%
+M``!E<````@8``&5T```"!0``97@```(&``!F!```<P4``&8(``!S!@``9C0`
+M`!D%``!F.```&08``&90``#%!0``9E0``,4&``!FO````04``&;````!!@``
+M9M@``,P%``!FW```S`8``&<P```!!0``9S0```$&``!G0```$@4``&<L```2
+M!0``9QP``!(%``!G1```$@8``&?P```H!0``9_0``"@&``!K[```RP4``&G8
+M``#+!0``:5```,L%``!I/```RP4``&DD``#+!0``:50``,L&``!IY```RP4`
+M`&GH``#+!@``:@P``,L%``!J$```RP8``&H\``#+!0``:D```,L&``!J>```
+MRP4``&I\``#+!@``:O@```(%``!J_````@8``&L$```"!0``:P@```(&``!K
+M8```Q`4``&MD``#$!@``;`0``*0%``!L"```I`8``&P4```H!0``;!@``"@&
+M``!L/```I`4``&Q```"D!@``;&```,L%``!L9```RP8``&R,``"B!0``;)``
+M`*(&``!LZ```E@4``&SL``"6!@``;00``,L%``!M"```RP8``&UT```!!0``
+M;7@```$&``!MG```2P4``&V@``!+!@``;>P``$`%``!M\```0`8``&X0```I
+M!0``;A0``"D&``!N(```Q04``&XD``#%!@``;C@``)@%``!N/```F`8``&Y,
+M``!-!0``;E```$T&``!Q<```I`4``'%T``"D!@``=UP``&(%``!W8```8@8`
+M`'>(``#-!0``=XP``,T&``!WA````04``'>8```!!@``>"P``&(%``!X,```
+M8@8``'C<```@!0``>*P``"`%``!XX```(`8``'CP``"?!0``>/0``)\&``!Y
+M'```504``'D@``!5!@``>YP``"P%``![H```+`8``'Z$``!W!0``?H@``'<&
+M``"*K````@4``(JP```"!@``E%0``)X%``"/%```G@4``(T<``">!0``CQ@`
+M`)X&``"7,```G@4``)<T``">!@``EWP``'\%``"7@```?P8``)>H``!_!0``
+MEZP``'\&``"7V```?P4``)?<``!_!@``F!0``'\%``"8&```?P8``)H,```"
+M!0``FA````(&``":A```?P4``)J(``!_!@``GAP```H%``">(```"@8``)YH
+M```8!0``GFP``!@&``">E```MP4``)Z8``"W!@``GMP``!@%``">X```&`8`
+M`)\8```8!0``GQP``!@&``"?1```MP4``)](``"W!@``G[```!@%``"?M```
+M&`8``*!L```8!0``H'```!@&``"@F```MP4``*"<``"W!@``H10``!@%``"A
+M&```&`8``*&L``"W!0``H;```+<&``"BJ```%P4``**L```7!@``HP````\%
+M``"C!```#P8``*>8```/!0``IYP```\&``"IB````@4``*F0```"!@``J:``
+M``(%``"II````@8``*G(```"!0``J<P```(&``"J#````@4``*H0```"!@``
+MK(@``$\%``"LG```3P8``*S$```"!0``K,@```(&``"M(```DP4``*TD``"3
+M!@``K60```(%``"M:````@8``*\<```"!0``KR````(&``"O+```7`4``*\P
+M``!<!@``KXP``!,%``"OD```$P8``*^\``"G!0``K\```*<&``"PA```I`4`
+M`+"(``"D!@``L*```*0%``"PI```I`8``+-<```!!0``LW0```$&``"SB```
+M`04``+.,```!!@``LZ````$%``"SI````08``+2D```<!0``M*@``!P&``"U
+M*```>`4``+3,``!X!@``M.```'T%``"TZ```?08``+3L``!A!0``M/0``&$&
+M``"T^```K@4``+4```"N!@``M00``'0%``"U#```=`8``+40```.!0``M1@`
+M``X&``"U'```M04``+4D``"U!@``M,0``'@%``"U,```>`8``+4T``!]!0``
+MM3@``'T&``"U/```H`4``+5```"@!@``M;```"P%``"UM```+`8``+8$```?
+M!0``M@@``!\&``"V%```>P4``+88``![!@``ME@``$P%``"V7```3`8``+H$
+M``!4!0``N@@``%0&``"[.```Q04``+L<``#%!0``NSP``,4&``"[6```B`4`
+M`+M<``"(!@``UI0``'$%``#6B```<04``+O$``!Q!0``N\@``'$&``"[V```
+M>P4``+O<``![!@``O'P```D%``"\@```"08``+UX```W!0``O7P``#<&``"]
+MC```+@4``+V0```N!@``O9P``,P%``"]H```S`8``+ZH```"!0``OJP```(&
+M``"_:```I`4``+]L``"D!@``OXP```(%``"_D````@8``,!8``"D!0``P%P`
+M`*0&``#`G```CP4``,"@``"/!@``PG0``#0%``#";```-`4``,(\```T!0``
+MPBP``#0%``#">```-`8``,*L``"J!0``PK```*H&``##.```5@4``,,\``!6
+M!@``SV@``(P%``##3```C`4``,,D``",!0``PU```(P&``##8```K`4``,-D
+M``"L!@``Q`0``!<%``#$"```%P8``,7H``!C!0``Q>P``&,&``#&!```(04`
+M`,8(```A!@``QAP``#8%``#&(```-@8``,<```"D!0``QP@``*0&``#'+```
+MI`4``,<T``"D!@``QT@``*0&``#'B```I`4``,>,``"D!@``R$P``#`%``#(
+M4```,`8``,CP``!2!0``R/0``%(&``#)9```9P4``,EH``!G!@``R70``"P%
+M``#)>```+`8``,F0``!9!0``R90``%D&``#*2```D`4``,I,``"0!@``RYP`
+M`"<%``#+H```)P8``,NX```=!0``R[P``!T&``#+U```*@4``,O8```J!@``
+MS&```"L%``#,9```*P8``,Q\``"V!0``S(```+8&``#-Q```B`4``,W(``"(
+M!@``S=P``-0%``#-X```U`8``,Y```"D!0``SD0``*0&``#.@```8P4``,Z$
+M``!C!@``SN0``*0%``#.Z```I`8``,[T```T!0``SO@``#0&``#/?```5@4`
+M`,^```!6!@``SY```(P%``#/E```C`8``-`,```K!0``T!```"L&``#0*```
+MM@4``-`L``"V!@``T40```$%``#12````08``-%P``#%!0``T70``,4&``#1
+MC````04``-&0```!!@``T<@```$%``#1S````08``-'@``#%!0``T>0``,4&
+M``#1_````04``-(````!!@``U````*0%``#4!```I`8``-0L``"D!0``U#``
+M`*0&``#4H```B`4``-2D``"(!@``UM0``'$%``#6V```<08``->$```!!0``
+MUW````$%``#7B````08``-AP``"D!0``V'0``*0&``#8D```+`4``-B4```L
+M!@``V0```,4%``#9!```Q08``-HD```[!0``VB@``#L&``#:.````04``-H\
+M```!!@``V[P``!X%``#;P```'@8``-^0```*!0``WY0```H&``#B````;@4`
+M`.($``!N!@``Z_@``#0%``#K_```-`8``.Q$``";!0``[$@``)L&``#LF```
+M`@4``.R<```"!@``[-````$%``#LU````08``.XH```!!0``[BP```$&``#P
+M]```#04``/#X```-!@``\6````$%``#Q9````08``/(<```!!0``\B````$&
+M``#RF```D`4``/*<``"0!@``\M0```$%``#RV````08``/+\```!!0``\P``
+M``$&``#U1````04``/5(```!!@``]TP```(%``#W4````@8``/=\```!!0``
+M]X````$&``#X4```?P4``/A4``!_!@``^D@``+0%``#Z3```M`8``/P0``"T
+M!0``_!0``+0&``#\K````04``/RP```!!@``_D0```(%``#^2````@8``/Z(
+M```"!0``_HP```(&``#_`````04``/\$```!!@``_U@```$%``#_7````08`
+M`0#4```!!0`!`-@```$&``$!"````04``0$,```!!@`!`2````$%``$!)```
+M`08``0$X```!!0`!`3P```$&``$!Q````@4``0',```"!@`!`=````(%``$!
+MU````@8``0.4```!!0`!`Y@```$&``$$?```'@4``02````>!@`!!70``#4%
+M``$%>```-08``068```U!0`!!9P``#4&``$%Q```-08``07D```Z!0`!!>@`
+M`#H&``$&Y```-04``0;H```U!@`!!P@``#H%``$'#```.@8``0FL``!W!0`!
+M";```'<&``$*%```=P4``0H8``!W!@`!"G@``+P%``$*?```O`8``0K$``"2
+M!0`!"L@``)(&``$,,```FP4``0PT``";!@`!#(0``#(%``$,B```,@8``0W`
+M```!!0`!#<0```$&``$4;```GP4``11T``"?!@`!%'```"`%``$4>```(`8`
+M`12(``!L!0`!%(P``&P&``$6\````04``1;T```!!@`!&,```-0%``$8Q```
+MU`8``1H<``"D!0`!&-```*0&``$8^```U`4``1C\``#4!@`!&>```*0%``$9
+MY```I`8``1H4``#4!0`!&A@``-0&``$8R```I`4``1HD``"D!@`!(+```,8%
+M``$@M```Q@8``2$T``#&!0`!(3@``,8&``$B````Q@4``2($``#&!@`!(E``
+M`)L%``$B5```FP8``2-P```?!0`!(W0``!\&``$CW```3`4``2/@``!,!@`!
+M)#P```(%``$D0````@8``2D$```"!0`!*0@```(&``$I#````@8``2GH``!`
+M!0`!*>P``$`&``$I^```P`4``2G\``#`!@`!*@P``'H%``$J$```>@8``2I`
+M``#`!0`!*D0``,`&``$J5```>@4``2I8``!Z!@`!*I```!\%``$JE```'P8`
+M`2JH``#`!@`!*K0``'H%``$JN```>@8``2NP``#&!0`!*[0``,8&``$L%```
+M7`4``2P8``!<!@`!+$```%P%``$L1```7`8``2R<``!<!0`!+*```%P&``$L
+MX```7`4``2SD``!<!@`!+00``%P%``$M"```7`8``2X8``"9!0`!+20``)D&
+M``$M2```7`4``2U,``!<!@`!+6@``%P%``$M;```7`8``2W0``!<!0`!+=0`
+M`%P&``$N*```7`4``2XL``!<!@`!+-0``)D%``$N2```F08``2YL``!<!0`!
+M+G```%P&``$NO````04``2[````!!@`!+R@``%P%``$O+```7`8``2]\``#`
+M!0`!+X```,`&``$OC```>@4``2^0``!Z!@`!-M@```$%``$VH````04``3),
+M```!!0`!+Z````$%``$OI````08``2_0``!<!0`!+]0``%P&``$P-```7`8`
+M`3"0``#`!0`!,)0``,`&``$PI```>@4``3"H``!Z!@`!,+@```$%``$PO```
+M`08``3#X```!!0`!,/P```$&``$Q"```P`4``3$,``#`!@`!,1@``'H%``$Q
+M'```>@8``3&$``#&!0`!,8@``,8&``$R+````04``3(P```!!@`!,E````$%
+M``$R5````08``3)@```!!0`!,F0```$&``$RU````04``3+8```!!@`!,N0`
+M``$%``$RZ````08``3,P```!!0`!,S0```$&``$S0````04``3-$```!!@`!
+M,[@``%P%``$SO```7`8``3/<``!<!0`!,^```%P&``$T````7`4``30$``!<
+M!@`!-"0``%P&``$U%````04``348```!!@`!-3P```$%``$U0````08``35@
+M``#&!0`!-60``,8&``$VQ````04``3;(```!!@`!-Q@```$%``$W'````08`
+M`3<H```!!0`!-RP```$&``$W<````04``3=T```!!@`!-X````$%``$WA```
+M`08``3D(``!F!0`!.0P``&8&``$Y7```<P4``3E@``!S!@`!.8P``!D%``$Y
+MD```&08``3FH``"M!0`!.:P``*T&``$YM```004``3FX``!!!@`!.<```*4%
+M``$YQ```I08``3G,``"<!0`!.=```)P&``$YV```/P4``3G<```_!@`!.>0`
+M`,$%``$YZ```P08``3GP``!#!0`!.?0``$,&``$Y_```:@4``3H```!J!@`!
+M.@@``+$%``$Z#```L08``3H4``#)!0`!.A@``,D&``$Z(```I@4``3HD``"F
+M!@`!.BP``+L%``$Z,```NP8``3U$```4!0`!/'@``!0%``$Z.```%`4``3H\
+M```4!@`!.E@``$D%``$Z7```208``3P@```2!0`!/"0``!(&``$\5```*`4`
+M`3Q8```H!@`!/+```!0%``$\M```%`8``3SX```4!0`!//P``!0&``$]*```
+M%`4``3TL```4!@`!/K0``!0%``$]5```%`8``3V(```4!0`!/8P``!0&``$^
+M$````@4``3X4```"!@`!/AP```(%``$^(````@8``3YX``#$!0`!/GP``,0&
+M``$^S```I`4``3[0``"D!@`!/MP``"@%``$^X```*`8``3\$``"D!0`!/P@`
+M`*0&``$_,```%`4``3\T```4!@`!/V0``*(%``$_:```H@8``3^4``"A!0`!
+M/Y@``*$&``$_Y```E@4``3_H``"6!@`!/_0```$%``$_^````08``4`(```!
+M!0`!0!@```$&``%`2```2P4``4!,``!+!@`!0,0``'\%``%`R```?P8``49$
+M``!W!0`!1D@``'<&``%'D```#P4``4>4```/!@`!22P```\%``%),```#P8`
+M`4ID```!!0`!2GP```$&``%*D````04``4J4```!!@`!2J@```$%``%*K```
+M`08``4NX``"(!0`!2YP``(@%``%+O```B`8``4PH``!Q!0`!3"P``'$&``%,
+MT```"04``4S4```)!@`!31@``,<%``%-'```QP8``4TL```N!0`!33```"X&
+M``%-/```204``4U```!)!@`!3D@```(%``%.3````@8``5_4``"D!0`!3P@`
+M`*0%``%/#```I`8``4\L```"!0`!3S````(&``%/^```I`4``4_\``"D!@`!
+M4#P``(\%``%00```CP8``5*H```T!0`!4I```#0%``%2K```-`8``5+@``"J
+M!0`!4N0``*H&``%3;```5@4``5-P``!6!@`!4X```(P%``%36```C`4``5.$
+M``",!@`!4Y0``*P%``%3F```K`8``50X```7!0`!5#P``!<&``%5,```8P4`
+M`54T``!C!@`!54P``"$%``%54```(08``55D```V!0`!56@``#8&``%6A```
+MI`4``5:,``"D!@`!5K```*0%``%6N```I`8``6(<``"D!0`!5LP``*0&``%7
+M#```I`4``5<0``"D!@`!5]```#`%``%7U```,`8``5AT``!2!0`!6'@``%(&
+M``%8Z```9P4``5CL``!G!@`!6/@``"P%``%8_```+`8``5D4```C!0`!61@`
+M`",&``%9U```)P4``5G8```G!@`!6?```!T%``%9]```'08``5H,```J!0`!
+M6A```"H&``%:@```*P4``5J$```K!@`!6IP``+8%``%:H```M@8``5L$```!
+M!0`!6P@```$&``%;,```R04``5LT``#)!@`!6TP```$%``%;4````08``5N(
+M```!!0`!6XP```$&``%;H```R04``5ND``#)!@`!6[P```$%``%;P````08`
+M`5UH``"D!0`!76P``*0&``%=E```I`4``5V8``"D!@`!7?P``%\%``%>````
+M7P8``5_@``"D!0`!7^0``*0&``%B*```I`4``6(L``"D!@`!8VP```(%``%C
+M<````@8``6-X``"D!0`!8WP``*0&``%D5````@4``618```"!@`!9&```*0%
+M``%D9```I`8``64,```"!0`!91````(&``%E&```I`4``64<``"D!@`!9D``
+M`!X%``%F1```'@8``6;X```>!0`!9OP``!X&``%G<```'@4``6=T```>!@`!
+M9^@``!X%``%G[```'@8``6D4```"!0`!:1@```(&``%I1````@4``6E(```"
+M!@`!:8````(%``%IA````@8``6G````"!0`!:<0```(&``%J!```104``6H(
+M``!%!@`!:CP```(%``%J0````@8``6J````"!0`!:H0```(&``%JC```I`4`
+M`6J0``"D!@`!:SP```(%``%K1````@8``6M0``"D!0`!:U0``*0&``%L$```
+M`@4``6P8```"!@`!;"```*0%``%L)```I`8``6S@```"!0`!;.@```(&``%L
+M]```I`4``6SX``"D!@`!;<````(%``%MQ````@8``6W0``"D!0`!;=0``*0&
+M``%NX````@4``6[D```"!@`!<%P```$%``%P8````08``7)@```!!0`!<F0`
+M``$&``%TC````04``720```!!@`!=.````$%``%TY````08``75P```!!0`!
+M=70```$&``%Y;````04``7EP```!!@`!>Q0``$T%``%[&```308``7LP``!-
+M!0`!>S0``$T&``%\K````04``7S@```!!@`!?/0```$%``%\^````08``7V,
+M```!!0`!?9````$&``%]]````04``7WX```!!@`!?H0```$%``%^B````08`
+M`7Z<```!!0`!?J````$&``%_+````04``7\P```!!@`!?\```',%``%_Q```
+M<P8``7_P``!S!0`!?_0``',&``&`&````04``8`<```!!@`!@"0```$%``&`
+M*````08``8`P```!!0`!@#0```$&``&`/````04``8!````!!@`!@$@```$%
+M``&`3````08``8!4```!!0`!@%@```$&``&`8````04``8!D```!!@`!@&P`
+M`!4%``&`<```%08```#(```!`@```,P```$"````T````0(```#4```!`@``
+M`-@```$"````W````0(```#@```!`@```.0```$"````Z````0(```#L```!
+M`@```/````$"````]````0(```#X```!`@```/P```$"```!`````0(```$$
+M```!`@```0@```$"```!#````0(```$0```!`@```10```$"```!&````0(`
+M``$<```!`@```2````$"```!)````0(```$H```!`@```2P```$"```!,```
+M`0(```$T```!`@```3@```$"```!/````0(```%````!`@```40```$"```!
+M2````0(```%,```!`@```5````$"```".```-0(```(\``!+`@```D```,("
+M```"1```/`(```)(```I`@```DP``'D"```"4```:`(```)4``"7`@```E@`
+M`&("```"7```,0(```)@``!;`@```F0``#("```":```BP(```)L``"Y`@``
+M`G```%("```"=```B0(```)X``!^`@```GP``-0"```"@```S0(```*$``!I
+M`@```H@``$@"```"C```G0(```*0```:`@```I0``+@"```"F```L@(```*<
+M``!.`@```J```+H"```"I```.`(```*H``"I`@```JP``(H"```"L```AP(`
+M``*T```,`@```K@``+T"```"O```1P(```+```!\`@```L0``,`"```"R```
+M>@(```+,``!7`@```M```*,"```"U```A@(```+8```+`@```MP``%H"```"
+MX```"`(```+D``!8`@```N@``*@"```"[```9`(```+P``"``@```O0``"4"
+M```"^```F@(```+\``!=`@```P```&4"```#!```E`(```,(```O`@```PP`
+M`*L"```#$```KP(```,4``"1`@```Q@``-$"```#'```*P(```,@``!P`@``
+M`R0``&`"```#*```Q@(```,L```N`@```S```%,"```#-```R`(```,X``!>
+M`@```SP``'("```#0```)P(```-$```M`@```T@``!T"```#3```)@(```-0
+M```D`@```U0``($"```#6```*@(```-<``!*`@```V```"("```#9```(0(`
+M``-H```1`@```VP``$("```#<```A0(```-T```]`@```W@``)X"```#?```
+MQ0(```.```!U`@```X0``+`"```#B```50(```.,``#/`@```Y```(X"```#
+ME```=@(```.8```6`@```YP``,,"```#H```/@(```.D``!W`@```Z@``&\"
+M```#K```@@(```.P``#+`@```[@``)0"```#O```+P(```/```"K`@```\0`
+M`*\"```#R```D0(```/,``#2`@```]0```$"```4L````0(``!2T```!`@``
+M%+@```$"```4O````0(``!3````!`@``%,0```$"```5(````0(``!4D```!
+M`@``%2@```$"```5+````0(``!4P```!`@``%30```$"```5.````0(``!4\
+M```!`@``%4````$"```51````0(``!5(```!`@``%4P```$"```54````0(`
+M`!54```!`@``%5@```$"```57````0(``!5@```!`@``%60```$"```5:```
+M`0(``!5L```!`@``%7````$"```5=````0(``!5X```!`@``%7P```$"```5
+M@````0(``!6$```!`@``%8@```$"```5C````0(``!60```!`@``%9@```$"
+M```5G````0(``!6@```!`@``%:0```$"```5J````0(``!7(```!`@``%<P`
+M``$"```5T````0(``!74```!`@``%=@```$"```5W````0(``!7@```!`@``
+M%>0```$"```5Z````0(``!7L```!`@``%?````$"```5]````0(``!7X```!
+M`@``%?P```$"```6`````0(``!8$```!`@``%@@```$"```6#````0(``!80
+M```!`@``%A0```$"```6&````0(``!8<```!`@``%B````$"```6)````0(`
+M`!8H```!`@``%BP```$"```6,````0(``!8T```!`@``(=````$"```AU```
+M`0(``"'8```!`@``(=P```$"```AX````0(``"'D```!`@``(>@```$"```V
+M8````0(``#9D```!`@``-F@```$"```V;````0(``#9P```!`@``-G0```$"
+@```V>````0(````,```"`@```!````("````%````@(`
+`
+end
diff --git a/sys/contrib/dev/ath/public/ap61.inc b/sys/contrib/dev/ath/public/ap61.inc
new file mode 100644
index 0000000..7e9325c
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap61.inc
@@ -0,0 +1,69 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/mipsisa32-be-elf.inc#1 $
+#
+
+#
+# Configuration for building big-endian MIPS2 for the AP61 SoC
+# using the 5.01 linux-mips.org toolchain (manually moved to
+# /pub/gnu from /pub/gnu/local where rpm --prefix=/pub/gnu
+# bogusly installs them).
+#
+
+#
+# http://www.linux-mips.org/toolchain.html
+#
+# /pub/gnu/bin/mips-linux-gcc -v
+# Reading specs from /pub/gnu/bin/../lib/gcc-lib/mips-linux/2.96-mips3264-000710/specs
+# gcc version 2.96-mips3264-000710
+# /pub/gnu/bin/mips-linux-as -v
+# GNU assembler version 2.12.90.0.7 (mips-linux) using BFD version 2.12.90.0.7 20020423
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/mips-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -G 0 -EB -mno-abicalls -fno-pic -mips32 -Wa,--trap \
+ -fno-strict-aliasing -fno-common -fomit-frame-pointer -mlong-calls
diff --git a/sys/contrib/dev/ath/public/ap61.opt_ah.h b/sys/contrib/dev/ath/public/ap61.opt_ah.h
new file mode 100644
index 0000000..166edb5
--- /dev/null
+++ b/sys/contrib/dev/ath/public/ap61.opt_ah.h
@@ -0,0 +1,3 @@
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_AR5312 1
+#define AH_SUPPORT_2317 1
diff --git a/sys/contrib/dev/ath/public/arm9-le-thumb-elf.hal.o.uu b/sys/contrib/dev/ath/public/arm9-le-thumb-elf.hal.o.uu
new file mode 100644
index 0000000..28e797e
--- /dev/null
+++ b/sys/contrib/dev/ath/public/arm9-le-thumb-elf.hal.o.uu
@@ -0,0 +1,5915 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/arm9-le-thumb-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$!`6$```````````$`*``!``````````````"DH`(```0``#0`````
+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
+M1A-``W-+B)L($T"#<$J($@%+1A-``).+B!L+6D830`":&D-"<XN(FPEB1A-`
+MPW`+>1-`@W/+B)L*$T`#<<N(&PD30,-SRHB2`'-&$T``DPN)FPM"1A-``)H:
+M0T)Q"XD;"F)&$T`#=`N)FP@30(-Q"HD2`4M&$T``DTN)&PM:1A-``)H:0T)T
+M2XF;"6)&$T##<8MZ$T"#=(N)FPH30`-RBXD;"1-`PW2*B9(`<T830`"3RXF;
+M"T)&$T``FAI#0G++B1L*8D830`-URXF;"!-`@W+*B1(!2T830`"3"XH;"UI&
+M$T``FAI#0G4+BIL)8D830(-U"WP30,-U2XJ;"A-``W9+BAL)$T!#=DJ*D@!S
+M1A-``).+BIL+0D830`":&D."=HN*&PIB1A-`PW:+BIL($T`#=P$T"R.:1`0L
+M`-A`YS`<__?^_P`@@$8`)`8A:42*1A\A"1LP'&I&!C+_]_[_`"@?T%-&&HB0
+M1&,`6QD@2!D8$@H*<!])6QA01@*(&G`!-`(LY=E!1@`I`M`:2I!%`=$))#/@
+M,!P#23H<__?^_S`<.^`()"_@$$```*5:``!R$```<!```/__``!T$```=A``
+M`'@0``!Y$```>Q```'H0``!^$```?Q```($0``!\$```?1````````"$$```
+M)!$``"41``#]_P(`""0P'`I).AS_]_[_`"T"T"@<__?^_RN;`"L`T!Q@`"`B
+ML'B\F$:A1JI&LT;PO0``$$````"U__?^_P"]`+48'`D$"0R`(UL`&4``*0K0
+M`TL3@`-+`X`!(`7@````%```-A4````@`+T!('!'$+7P(E(`@1A+:`$D(T-+
+M8`M+BX$+2\N!"W@"(A-#"W"+>*-#"$H*@0A*2H$@(I-#0"*30XMP!DJ#&!MX
+M"N`````4```V%0```P```$````!\$````"L+T`I+PA@(2Q.`"4J#&!Q@BGB`
+M(UM"&D.*<`\C2V$%2\(8`2,38`$@!^``````3!```%`0``!L$```$+W`1C"U
+M!1P,'$IH"TG_]_[_XF@H'`I)__?^_R)I*!P(2?_W_O^B:"@<!TG_]_[_(F@H
+M'`5)__?^_S"]+(```#"````T@```.(```"2````0M86P`9'N)&0``QD;:`$K
+M"]`-2QMHRQK;``.3"TL;:,L:VP`$DP*1!>`!(UM"`Y,$DP$C`I,&2Q-``)-I
+M1O_W_O\%L!"]`````````````/__@`$PM00<#$D`(O_W_O\+32`<*1S_]_[_
+M`AR`(UL#&D,(2QI`(!PI'/_W_O\@'`5)!DK_]_[_,+T``"R````$@```__]?
+M_R2```#__P``\+4%'`X<!QQ+B@`K'-`U3"$<__?^_P(<,TL:0(`CFP,:0R@<
+M(1S_]_[_,HHH'"])__?^_W***!PM2?_W_O]R:=(`*!PK20C@)DPA'/_W_O\"
+M'"E+&D`H'"$<__?^_S)H*!PF2?_W_O\H'"5)__?^_\,-V`4SB00<'$,RBP`J
+M!=`$,A($_B/;`QI`%$,H'!Q)(AS_]_[_Z")2`*L8&X@#*Q_9<8L'(PM``"L:
+MT!5+_!@B:!5+$!P80`<I!M@*`N`CVP`:0`$<$4,#X.`CVP`!'!E#(6`+2KL8
+M&F@H'`M)__?^__"]!(```/__?_\H@```2(```#2```#__U__+(```"2````(
+M$@``__C__QB`````M0-)__?^_P`H`-`!(`"]"$```'"U!AP,'`4<'"'_]_[_
+M`2)20I!"`]$`(R-@`"`JX!9*LQ@;:`(<&D`42QI`(F`42P-``"L#T(`CVP43
+M0R-@!2,#0``K`]`C:`$B$T,C8+@CVP`#0``K`]`C:$`B$T,C8")H@"/;!1I`
+M`"H"T`5*LQ@88`$@<+T``"P1``"ZV`4!(`!P`%00```!2\`8`&AP1RP1``#P
+MM08<#!P%'")(,Q@?:``O!-HP'"0A`"+_]_[_'DLB'!I``2,C0``K`=`%(QI#
+M0"$C'`M``"L<T!A(*Q@;:``K`-`*0Q9):Q@;:``K`M"`(UL`&D,32"L8&V@`
+M*P'0@",:0Q%):Q@;:``K`M"`(]L`&D,P'"`A__?^_P9*JQ@<8``L!-HP'"0A
+M`2+_]_[_.!SPO0``+!$``+K8!0$P$0``-!$``#@1```\$0``0"!P1P"U"00)
+M##\I"]A)`09+R1C_]_[_@",;`AA``"@!T`$@`.``(`"]```<D```,+4%'`D$
+M"0P_*3/83`&0(QL"X1@`(O_W_O\72^$8*!P`(O_W_O\52^$8*!P`(O_W_O\3
+M2^$8*!P`(O_W_O\12^$8*!P`(O_W_O\/2^$8*!P`(O_W_O\-2^$8*!P`(O_W
+M_O\+2^08*!PA'``B__?^_P$@`.``(#"]!)````B0```,D```$)```!20```8
+MD```')```/"U!QP)!`P4_".;`YE"*M@`*A+05GDV`A-Y'D/5>"T&DW@;!!U#
+M4W@;`AU#$W@=0VT(\P<=0W8(`>``)@`E)`3D"@I+X1@X'"H<__?^_PA+Y!B`
+M(QL",AP:0S@<(1S_]_[_`2``X``@\+T``!B0```<D```\+5?1E9&349$1O"T
+M@["`1A`<`I,)!`D4#)L`*P'014P`X``D"P3\(I(#DT(%V`-X`"L"T4.(!"L!
+MV``@<N!#B`4K`=@`(P;@0X@-*P+8`2(!D@'@`R,!DP5Y0WD;`AU#@WD;!!U#
+MPWD;!AU#94`">D-Z&P(:0V)`$P0;#)E&AWK#>AL"'T,#>QL$'T-#>QL&'T-G
+M0()[PWL;`AI#$QQC0!L$&PR:1@9\0WP;`AY#@WP;!!Y#PWP;!AY#9D!#B`TK
+M`=C_(QY`"00*#)-&5`&0(QL"X1A`1BH<__?^_Q9*H1A`1DI&__?^_Q1+X1A`
+M1CH<__?^_Q)*H1A`1E)&__?^_Q!+X1A`1C(<__?^_PY*I!A`1B$<`9K_]_[_
+M0$991@*:__?^_P.P>+R81J%&JD:S1O"]``"JJJJJ!)````B0```,D```$)``
+M`!20````M01*@Q@('!D<!B+_]_[_`+T``"01````M0-+P!@&(O_W_O\!(`"]
+M)!$```"U"!P"208B__?^_P"]`````````"!P1S"U!!P5'(D`P"/;`<D8__?^
+M_]@AR0$@'`,B`B/_]_[_`"@!T0`@!N#0(<D!(!S_]_[_*(`!(#"]$+44'((B
+MD@"#&!N("00)#(M"`=$,(PG@!TJ#&!N(@"(30``K`=`+(P#@`R,`+`#0(V``
+M(!"]``!R$````2!P1_"U!AP,2H,8`"*<7B0$)0P<(QU`K1`D#`(C'$!D$``G
+M*1S_]_[_H$(`T0$G,!PI'#H<__?^__"]3!```'"U!AP,'`E-*1S_]_[_`AQD
+M``,CHT":0P(CHT`:0S`<*1S_]_[_`2!PO0``%$```'"U!AP,'`=-*1S_]_[_
+M`AQD``,CHT":0S`<*1S_]_[_`2!PO11```!PM49&0+2`1@T<%!P)3C$<__?^
+M_P(<`2$+'*M`FD,,0*Q`(D-`1C$<__?^_P$@"+R81G"]&$```!"U#!P%*0C8
+M!4G_]_[_+R,80.!``2,80`'@`2!`0A"]'$```/"U!QP,'!4<$DG_]_[_!APA
+M`V0``R.C0`H<&D/`(UL"&D.60PY#@",;`AY#`"T"T(`C6P(>0S@<!DDR'/_W
+M_O\%2KL8&6B`(UL$&4,X'/_W_O_PO11````L$0``,+4%'`P<#$G_]_[_`AP`
+M+`+0!"P"T`;@8",'X"`CFD-`(QI#`^`@(QI#0".:0R@<`4G_]_[_,+T00```
+M`+4&2?_W_O^`(QL$&$``*`'0`B``X`$@`+T```2````PM00<#1P+2?_W_O^`
+M(QL$`T``*P+0`BT"T0G@`2T'T(`C&P0"'!I#(!P"2?_W_O\PO0``!(`````@
+M<$<`M0`@`"D`T0$@`+UPM08<%`0D%"%*A1@H'`8B__?^_RIX'TES&!MX&P(:
+M0QU)<Q@;>!L$&D,<27,8&W@;!AI#,!P:2?_W_O\92K,8&G@927,8&W@;`AI#
+M)`0D#*,$FP@:0S`<%$G_]_[_`"P)T1-,,!PA'/_W_O\"'(`C6P,:0P?@#DPP
+M'"$<__?^_P(<#$L:0#`<(1S_]_[_<+U($0``21$``$H1``!+$0``"(```$P1
+M``!-$0``#(````2```#__^__\+4$'`Q-*1S_]_[_!AP@'`I)__?^_P<<(!PI
+M'/_W_O^P0@#2`3<`(0`D#1P%0SX<)D,Q'"@<\+UL@```<(````"U`DG_]_[_
+M`+T``&R````PM00<!DTI'/_W_O\"'(`C6P0:0R`<*1S_]_[_,+T``"2```!P
+MM08<"TG_]_[_`P'=#0`K`MH)2UU`[4,P'`A)__?^_P0<,!P&2?_W_O]$0&Q`
+M(!QPO0``9)@``/\!``!P@```;(```#"U`"7H(E(`@Q@<B`1)__?^__\C&$"$
+M0@#1`24H'#"]($```#"U!1P,'!%)__?^_R-HP!@@8"@<#DG_]_[_8VC`&&!@
+M*!P,2?_W_O_C:,`8X&`H'`E)__?^_Z-HP!B@8"@<!TG_]_[_(VG`&"!A,+V8
+M@```E(```)R```"0@```H(```'"U!1P.'`0<""D$V0Q)__?^_X9"!MD+2^(8
+M`2-;0A-@`"`,X"@<,1S_]_[_`APH'`5)__?^_P-*JQ@>8`$@<+W__P``#!(`
+M`!"````0M00<!$G_]_[_`P09#"`<__?^_Q"]```0@```\+5'1H"T!QP-'`8<
+M$TG_]_[_A4(&V1)+^A@!(UM"$V``(!?@#TJ01C@<$1S_]_[_1`MD`S@<*1S_
+M]_[_P`3`#`1#.!Q!1B(<__?^_P1*NQ@=8`$@"+R81O"]``#_'P``$!(``!2`
+M```0M00<!$G_]_[_PP39#"`<__?^_Q"]```4@````TO`&,!X`2.#0Q@<<$<`
+M``02``#PM08<!QP`*0_0$4PA'/_W_O\"'`]-*D`P'"$<__?^_PU+\A@3:"M`
+M#^`)32D<__?^_P(<@"1D!")#,!PI'/_W_O\%2_(8$V@C0Q-@`2#PO02```#_
+M___^!!(``/"U1T:`M`<<#1P&'!1)__?^_X5"!MD32_H8`2-;0A-@`"`9X!!*
+MD$8X'!$<__?^_P0<#DL<0#@<*1S_]_[_``0+2QA`!$,X'$%&(AS_]_[_!$J[
+M&!U@`2`(O)A&\+T``/\?```4$@``%(```/__`.```/\?$+4$'`5)__?^_P$<
+M!$L90`D,(!S_]_[_$+T``!2``````/\?`2!P1W!'P$8`('!'<$?`1G!'P$8`
+MM0$I!=$`*@'0#2`#X``@`>#_]_[_`+T0M8&P'!P+*0+0'BD+T`S@_")2`(,8
+M!B(B0!I@!DG_]_[_`2`&X``@!.`#FP"3(QS_]_[_`;`0O6B````0M8*P!)P`
+ME`6<`93_]_[_`K`0O7"U!AP-'`U,(1S_]_[_`AR`(]L"&D,P'"$<__?^_P`M
+M"]`'3#`<(1S_]_[_`AP%2QI`,!PA'/_W_O]PO02````$0```___\_W"U!1P`
+M*2_0'DPA'/_W_O\"'!U+&D`H'"$<__?^__H@P`#_]_[_"B063B@<%TG_]_[_
+M@"-;`AA``"@1T,@@__?^_R@<,1S_]_[_`AP.2QI`*!PQ'/_W_O\!/``LY=$!
+MX``L`=$`(`S@"4PH'"$<__?^_P(<!TL:0"@<(1S_]_[_`2!PO01```#___S_
+M$$````2```#___O_<+4&'`T<#4PA'/_W_O\"'(`CVP(:0S`<(1S_]_[_`"T+
+MT`=,,!PA'/_W_O\"'`5+&D`P'"$<__?^_W"]!(````1```#___S_<+4,'!$<
+M!1P!)@$L"-`!+`+3`BP'T`G@__?^_P8<!^#_]_[_!.#_]_[_`>``(`/@`DJK
+M&!Q@,!QPO0``1!$```"U!$G_]_[_P".;`AA```P`O0``!$```!"U`2D"T`(I
+M`M`#X`5,`^`%3`'@`"`#X"$<__?^_R`<$+T``````````````+4,(?_W_O\`
+MO<!&`+4*'`PA__?^_P"]`+4((00B__?^_P"]<+4%'`@A("+_]_[_`"0$)B@<
+M""'_]_[_,$``*`'1`2`'X`H@__?^_P$T`DN<0N_=`"!PO><#```PM00<!4TI
+M'/_W_O\"'$`CFD,@'"D<__?^_S"]:(```#"U!!P%32D<__?^_P(<0",:0R`<
+M*1S_]_[_,+UH@```,+4$'`L<%1P$21H<__?^_R`<`TDJ'/_W_O\PO5"```!4
+M@```<+4&'`T</RD!V0`@%^`?*0C9"TPA'/_W_O\J'"`Z`2.30`7@!TPA'/_W
+M_O\!(ZM``AR:0S`<(1S_]_[_`2!PO52```!0@```<+4&'`T</RD!V0`@%^`?
+M*0C9"TPA'/_W_O\J'"`Z`2.30`7@!TPA'/_W_O\!(ZM``AP:0S`<(1S_]_[_
+M`2!PO52```!0@````+4"2?_W_O\`O0``3(````"U"AR`(YL`"T``*P/0!$L:
+M0"`C&D,#2?_W_O\`O0``__W__TR````0M1P<"!P`(PMR2W*+<LMR$P49#0%S
+M&P]#<P`C@W,)#L%S`7M#>QL""T.!>PD$&4/#>QL&"T.30@'0`"`LX"`C(T``
+M*Q/0`GM#>QL"$T.!>PD$&4/">Q(&"D.`(YL!&D,"<Q,*0W,3#(-S$@["<P`C
+M`W5#=8-UPW4"?1,"$T,2!!I#PWT;!A-#`W0:"D)T&@R"=!L.PW0!(!"]P$;P
+MM0<<%1P'G@P<&1PC?0$B$T``*PG0"WT!(A-``"L&T0PA__?^_ZA"`=$/(*/@
+M(GQC?!L"$T,;!1L-,X`B?6-]&P(30Z)]$@0:0^-]&P830QT![0PX'$A)__?^
+M_X,!&`S#!-L,JT(%TD1*@Q@;!!L,'4,`X`5#:P1;#'.``",S<2)]8WT;`A-#
+MHGT2!!I#XWT;!AI#`B,30``K'M$$(Q-``"L!T`$C#^`C?1`B$T``*P+0,WD(
+M(@;@(WT((A-``"L$T#-Y!"(30S-Q!N`S>0(B$T,S<2-]6PES<2)\8WP;`A-#
+MHGP2!!I#XWP;!A-#_R+2!!-`VPRS<2)]8WT;`A-#HGT2!!I#XWT;!AI#@"-;
+M`!-``"L$T/PCVP$30%L*`>`!(UM"\W$C?&)\$@(:0Z-\&P030_`BT@(30-L+
+M,W(B?&-\&P(30Z)\$@0:0^-\&P830YL+`2$+0'-R(GQC?!L"$T.B?!($&D/C
+M?!L&$T,;"PM`LW(`(/"];(````#@___PM5]&5D9-1D1&\+0&'(I&D$:;1@<<
+M4HB`(UL`&D``*@_004;_]_[_@48`*`G04$8&*`C0!B@"V`$H`M@#X`@H`=`,
+M(J?B,!PE2?_W_O\%'&`C'4`P'$%&__?^_P`H`-'NX8`A"0(?2KL8&G@>2#L8
+M&W@;`AI#'4@[&!MX&P0:0QM(.Q@;>!L&&D,P'/_W_O\827L8&G@82#L8&W@;
+M`AI#,!P62?_W_O\P'%%&__?^_U%&`2D*T`$I!-,&*2+0""D@T"K@,!PH(0$B
+M`N`P'"@A`"+_]_[_,!P!20E*&^```!!````D$0``)1$``"81```G$0``*!$`
+M`"D1```$@```)!```#`<*"$`(O_W_O^"(E(!,!S+2?_W_O_*3#`<(1S_]_[_
+M`APJ0S`<(1S_]_[_Q4J[&!IXQ4@[&!MX&P(:0\-)>Q@;>!L$&D/"2#L8&W@;
+M!AI#,!S`2?_W_O^_27L8&GB_2#L8&W@;`AI#,!R]2?_W_O\P'``A`"+_]_[_
+M,!P$(0`B__?^_S`<#"$`(O_W_O\P'!PA__?^_S`<("$`(O_W_O\P'"0A`"+_
+M]_[_KDEZ&``C$V`P'"PA__?^_S`<,"$%(O_W_O\P'#0A!2+_]_[_,!Q$(0@B
+M__?^_S`<2"$((O_W_O\P'%`A`"+_]_[_,!Q,(0`B__?^_S`<FTD`(O_W_O\P
+M'$`A`"+_]_[_F$J[&!IH,!R72?_W_O\P')9)`"+_]_[_,!P`(?_W_O\P')))
+M`"+_]_[_,!R120`B__?^_S`<CTD`(O_W_O\P'(Y)`"+_]_[_,!R,20$B__?^
+M_S`<BTD!(O_W_O\P'(E)`"+_]_[_,!R(20`B__?^_S`<ADD`(O_W_O\P'(5)
+M`"+_]_[_`21D0C`<@DDB'/_W_O\P'(%)(AS_]_[_,!Q_20$B__?^_P`D?DWC
+M`%E96T8`*P30?$@+&'Q*DT(%V>,`6QE::#`<__?^_P$TIBSLV3`<04;_]_[_
+M`"@`T:G@<TPP'"$<__?^_P(<<4L:0'%(.Q@;>!L"&D,P'"$<__?^_VY)>Q@;
+M>!H&&P0:0VQ(.Q@9>`L"&D,*0S`<:4G_]_[_:4PP'"$<__?^_P(<9TL:0&=)
+M?1@IB$D(_B.;`1E`"D,P'"$<__?^_V),,!PA'/_W_O\"'&!+&D`IB(D"_".;
+M`AE`"D,P'"$<__?^_UM,,!PA'/_W_O\"'%E+&D!92#L8&7@)`_XCVP(90`I#
+M,!PA'/_W_O]43#`<(1S_]_[_`AP#(8I#*X@+0!I#,!PA'/_W_O\P'$E&__?^
+M_P`H.=!91@`I$-!*1A-Y`B(30``K!-%(1@-Y`2*30P-Q249+B$)&4X`+>1-Q
+M,!Q`20$B__?^__H@@`#_]_[_/4PP'"$<__?^_P(<`2,:0S`<(1S_]_[_,!PA
+M'`$B`"/_]_[_,!Q)1O_W_O\`*&310$9#B`(B$T-#@`,BJ.`00```2!$``$D1
+M``!*$0``2Q$```B```!,$0``31$```R````L$0``#$````@2```8@```2(``
+M`%"```!4@```6(```%R```!@@```9(```&B````H@```+(```&R````P@```
+M-(```#B``````````(#___\/```HF```_P#__WD0``!Z$```>Q```#28``!$
+MF```?\#__W00``!(F```_P_\_V28``#_#_C_>!```!"9```<F```8)@````D
+M,!PA'/_W_O\!-`(L^-TG2K,8&V@`*P+0,!S_]_[_)$PP'"$<__?^_P(<(DL:
+M0#`<(1S_]_[_($@[&!EH`2)20I%"`M`P'/_W_O\<2#L8&6@!(E)"D4("T#`<
+M__?^_QA(.Q@9:`$B4D*10@+0,!S_]_[__"!``#,8&F@`*@/0,!P12?_W_O_N
+M(4D`<QA21AI@`2`%X`F8`V@`*P#0`F``('B\F$:A1JI&LT;PO0``4!```"2`
+M``#__W_^#!(``!`2```4$@``:(```'"U!1P,'`8<&4G_]_[_`P08#`$L&-`!
+M+`+<`"P,T";@!BP"T`@L%M`AX!)*JQ@;:`(<&D.B(P7@#DJK&!MH`AP:0Z0C
+MVP,-X`I*JQ@;:`(<&D.@(P7@!TJK&!MH`AP:0X`C6P,:0R@<`4G_]_[_<+T$
+M@```!!(```"U[B)2`(,8&6C_]_[_`+T`M0@A"B+_]_[_`+T0M00<`"$!(O_W
+M_O\`*`;0(!P/(0I*__?^_P`H`=$`(`S@^B"``/_W_O\@'!\A!$K_]_[_`TC_
+M]_[_`2`0O0``($X``#0(``!PM04<#!P`(0$B__?^_P`H*=``)@`L!=!CB!`B
+M$T``*P#0`28H'!1),AS_]_[_*!P/(1)*__?^_P`H%-#Z((``__?^_R@<'R$,
+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
+M1BD<$DK_]_[_^B3D`"`<__?^_U!&__?^_^LF=@!61#"`4$8I'`<B__?^_R`<
+M__?^_S.(\"(30"`K#]`-)%K@N!0``!P4``!P$```BA````=````/27H8#4L3
+M@%!&OR%J1@(R__?^_P`H0]`*2KD8:T8",QJ("H""(YL`4T0:@.`B4@!21`5+
+M$V!01@C@````````BA```'00````````__?^_U!&__?^_P`E`"1N1@(V'R$)
+M&U!&:D8",O_W_O\`*!?0,HBM&&,`VQD12!D8$@H*<!!)6Q@RB!IP`30"+.?9
+M`"T"T`U*E4(!T0DD`N!01@K@""0`+P+0.!S_]_[_")L`*P#0'&``(`&P&+R8
+M1J)&\+V,*@``C2H``/W_`@`0M00<`TO!&/_W_O\@'/_W_O\0O7`0``#PM5=&
+M3D9%1N"TB+`''"]+7&@;:`*3`Y0$JBU+$!P9''#)<,#;:--@`"*21@@C:T29
+M1E5&K`!*1J98:T;D&#@<,1S_]_[_(&``)2L$'!PL0S@<,1PB'/_W_O\X'#$<
+M__?^_Z!"%-$!-?\M[MT`)1`C:T281JL`0D:<6#@<,1PB'/_W_O\X'#$<__?^
+M_X1"`=``(!3@`34#+>S=4T::`$Q&$5EK1M)8.!S_]_[_`26J1%9&`2Z]W60@
+M__?^_P$@"+`XO)A&H4:J1O"]``"4````G````#"U%!P='`D$"A0)#(`C6P`9
+M0``I"-`"2R.``DL2X```.!,``-07```3!!L,@"(30``K$=`'2H,8&X@`*PS0
+M`TLC@`-+*X`!(`?@```("0``K`H``(H0````(#"]`2!P1_"U1T:`M(&P@$8%
+M'`8<\")2`(08@B*2`(,8&X@!*P/1$"%J1O_W_O\`(V-@'DJK&!N(`"L(T`$C
+M8V`<2JL8&X@`*P'1`R-C8!E*JQ@;B``K`]!C:`0B$T-C8`U+(X(-2V."#4NC
+M@0U+XX$C>`$G.T,"(A-#(W"C>#M#$T,(2B*!"$IB@2`BDT-`(I-#$N````@)
+M``"L"@``.!,``-07```*````@````(80``!V$```BA```*-P$$JK&!N(`"L/
+MT`Y+\AA`1@\A__?^_P`H!]`+2K,8'V"B>(`C6T(:0Z)P#2-C80=+\A@!(Q-@
+M`2`!L`B\F$;PO0``>A```$P0``!0$```;!```#"U!1P,'$IH"TG_]_[_XF@H
+M'`I)__?^_R)I*!P(2?_W_O^B:"@<!TG_]_[_(F@H'`5)__?^_S"]*(```"R`
+M```P@```-(```""````0M86P`9'N)&0``QD;:`$K!=`!*P?3!BL%T`@K#=$,
+M2P.3#$L(X`Q+&VC+&ML``Y,*2QMHRQK;``232QP"DPA+$T``DVE&__?^_P6P
+M$+T``/__``#__P<```````````#__X`!,+4$'`Q)`"+_]_[_"TT@'"D<__?^
+M_P(<@"/;`AI#"$L:0"`<*1S_]_[_(!P%209*__?^_S"]```H@```!(```/__
+MS_\@@```__\``/"U!1P.'`<<2XH`*QK0,4PA'/_W_O\"'(`C6P,:0R@<(1S_
+M]_[_,HHH'"M)__?^_W***!PI2?_W_O]R:=(`*!PG20C@(TPA'/_W_O\"'"5+
+M&D`H'"$<__?^_S)H*!PB2?_W_O\H'"%)__?^_\,-V`4SB00<'$,RBP`J!=`$
+M,A($_B/;`QI`%$,H'!A)(AS_]_[_%TOX&`)H%DL:0'&+"0+_(QL"&4`*0P)@
+M*!P22?_W_O\23"@<(1S_]_[_`@P2!/-I`SO;!!L,&D,H'"$<__?^__"]!(``
+M`"2````X@```,(```/__[_\H@```((```#`M``#_`/__&(````1`````M0-)
+M__?^_P`H`-`!(`"]"$```#"U!1P,',`A__?^_P$B4D*00@/1`",C8``@6>`M
+M2P(<&D`B8(`C&P,#0``K`]"`(]L%$T,C8`4C`T``*P/0(V@!(A-#(V"X(]L`
+M`T``*P/0(VA`(A-#(V`@(P-``"L)T!U*JQ@;:``K!-`B:(`CVP4:0R)@(FB`
+M(]L%&D``*B;0%DJK&!A@%DOL&"@<Q"'_]_[_(&`32JP8*!S((?_W_O\@8(,C
+M6P'L&"@<S"'_]_[_(&`-2JP8*!S0(?_W_O\@8`I+[!@H'-0A__?^_R!@`2`P
+MO0``NM@%`6P0``!4$```6!```%P0``!D$```:!````%+P!@`:'!'F"H``/"U
+M!AP,'`4<*$@S&!]H`"\(VC`<)"$`(O_W_O\P'"0A__?^_R)+(AP:0$`A(QP+
+M0``K'-`?2"L8&V@`*P#0"D,=26L8&V@`*P+0@"-;`!I#&D@K&!MH`"L!T(`C
+M&D,826L8&V@`*P+0@"/;`!I#`2,C0``K`=`'(QI#@"/;!2-``"L"T(`C&P,:
+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
+M1`$C$V``)`$EH0"`(UL!R1@J'*)`,!S_]_[_`30)+//=`"0P'"$<__?^_P$T
+M"2SXW3`<I"%@2O_W_O\P'*@A`2+_]_[_,!RL(0$B__?^_UI,,!PA'/_W_O\"
+M'#`<(1S_]_[_5DPP'*`A(AS_]_[_5$U51"Q@,!RL(?_W_O\"'.`CVP(:0S`<
+MK"'_]_[_"9D&*0[1,!R@(?_W_O\"'(`D9`$B0S`<H"'_]_[_*V@C0RM@14JS
+M&!MH`"L"T#`<__?^_T),,!PA'/_W_O\"'$!+&D`P'"$<__?^_SY+4T09:`$C
+M6T*90@+0,!S_]_[_.DM31!EH`2)20I%"`M`P'/_W_O\V2U-$&6@!(UM"F4("
+MT#`<__?^__PA20!S&!IH`"H#T#`<+DG_]_[_[B)2`+,8"9D98`$@6^",*@``
+MC2H``(XJ``"/*@``D"H``)$J```$@```$$```!1````80```6(```)(J``"3
+M*@``E"H``)4J```(@```EBH``)<J```,@```,"T``!B```!$F0``____WQOQ
+M```(V````@4``!R8```4F0``8)@``!`M```@F0``%"T```$``0"P$```90D(
+M`)@J``!0$```((```/__?_XT+0``."T``#PM``!(@```'9D+:``K`-`*8``@
+M%+!XO)A&H4:J1K-&\+W`1@"U`B'_]_[_`+W`1A"U!!P`(0$B__?^_P`H!=`@
+M'!,A__?^_P`H`=$`(`/@`DC_]_[_`2`0O0``-`@``#"U!!P)!`T4`"$!(O_W
+M_O\`*'W0*@02#/@C6P`:0,`J*=#`*@3<H"H0T+`J#M!?X*`C6P":0C?0FD("
+MW-`J&M!6X*@C6P":0B[04>`@'#1)`"+_]_[_HB$)`B`<`R+_]_[_(!PO21DB
+M__?^_Y8@0`#_]_[_/.`@'"E)`"+_]_[_Y")2`*,8&X@2*S'1(!PE21@B__?^
+M_Y8@0`#_]_[_HB$)`B`<`B(AX"L$&PP0(A-``"L#T"`<&DD#(@+@(!P820`B
+M__?^_^0B4@"C&!N($BL.T2`<$TD8(O_W_O^6($``__?^_Z(A"0(@'``B__?^
+M_R`<$R'_]_[_`"@)T`I(__?^_R`<`"$!(O_W_O\`*`'1`"`#X"`<`"'_]_[_
+M,+T```28``!\F```-`@``/"U7T961DU&1$;PM(&P!1R(1I%&!QS_]_[_!AP`
+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
+M0#M)9!@AB`D#_B/;`AE`"D,P'"D<__?^_P(E-4J[&!N(-4B#0@[8Y2%)`',8
+M&X@R2I-"&=%`1D.(0"(30``K$]`()1'@048*B!\C$1P90``I"M`+'`H[#"L&
+MV5)&4P#;&2=(&QA;B.T8)DPP'"$<__?^_P(<_B.:0VL`]R$+0!I#,!PA'/_W
+M_O\!(!B\F$:B1O"]1)D``-(1```0F0``!OS__^00```,+0``S!```&B9``!$
+MF```?\#__TB8``#_#_S_J!```%"8``#($```Q!```+@0```TF```*)@``/\`
+M__^L$```9)@``/\/^/^T$```<!````(P```B$```)!$``"29```0M0H</RD`
+MV3\A_B1D``,9&8`"2?_W_O\!(!"]/)D``/"U5T9.1D5&X+2$L`<<#AP$'$J(
+M\"-;`!I`P"H9T,`J`MR@*BC0.^"@(4D`BD(WT39*@Q@:B`&KFH`U34,9`9,T
+M24,8`Y,T2H,8&XB81C-+(^`S34,9&H@!JYJ`,4E#&`&3,4J#&`.3,$U#&1N(
+MF$8O20D8BD8;X"E*@Q@:B`&KFH`L34,9`9,K24,8`Y,K2H,8&XB81J\C6P$;
+M&9I&!^``("W@DP'C&"5-[1BI1A_@,H@X'`&I__?^_P`AB48X'#$<__?^_P`B
+M'DUC&1N(F44.VBD<4P`;&5L86X@`*P'0@T+?T`$R%TUC&1N(FD+QVT-&`)8X
+M'$E&4D;_]_[_`2`$L#B\F$:A1JI&\+WH$0``U!$``.P1``!0%0``5!4``/03
+M``#V$P``&!0``+05``"X%0``_!,``+04``#<%0``^!4``'01``#PM5]&5D9-
+M1D1&\+2$L`.0B482!!<4`"`"D#\ABT8?3(0A20`@'/_W_O\=2(`A__?^_P@B
+M$AF21H@TH$8!)@`E*P3;"U1&'E-R'!($:QP;!!T4%A3\((`#@D+QV0]*U8`,
+M2U.`#$N3@``ETXBK0AW9*P3;"T%&7!@X!%)&F5H`#$I&__?^_R"`:QP;!`-*
+MTH@(X````0```#\``````````````!T4&PR:0N'80T8`)!A??$O:B%,`0T0"
+M.P`GWE\`):I"(]EW3RH$TPM!1EM>@T("W!@<$A0"DON(6QL!.QL$&PP`*Q+0
+M6P!#1)P>`"*A7HQ&&8@`(IM>G$4`W2&`:QP;!/J('10;#)I"W-@`)61+VXBK
+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
+M___]<+4&'`M)__?^_P,!W0T`*P+:"4M=0.U#,!P(2?_W_O\$'#`<!DG_]_[_
+M1$!L0"`<<+T``&28``#_`0``4(```$R````PM00<#$G_]_[__R,80`\C`AP:
+M0``AYB5M`&,9``D;:(-"!M'H($``(Q@;B)-"`-$!(0@<,+T``"!````PM04<
+M#!P12?_W_O\C:,`8(&`H'`Y)__?^_V-HP!A@8"@<#$G_]_[_XVC`&.!@*!P)
+M2?_W_O^C:,`8H&`H'`=)__?^_R-IP!@@83"]D(```(R```"4@```B(```)B`
+M```!('!'`+4#2?_W_O__(QA``+T``!R<````M0-)__?^_P<C&$``O0``6(``
+M``"U"AP'(QI``4G_]_[_`+U8@````4O`&`!H<$<<+@```+4&2H,8&F@`*@31
+M!$J#&!E@`2`!X/_W_O\`O3@0```<+@```2!P1W"U!1P.'`0<!2D$V0Q)__?^
+M_X9"!MD+2^(8`2-;0A-@`"`,X"@<,1S_]_[_`APH'`5)__?^_P-*JQ@>8`$@
+M<+W__P``6"X``'`0```0M00<!$G_]_[_`P09#"`<__?^_Q"]``!P$```\+5'
+M1H"T!QP-'`8<$TG_]_[_A4(&V1)+^A@!(UM"$V``(!?@#TJ01C@<$1S_]_[_
+MA`ND`S@<*1S_]_[_@`2`#`1#.!Q!1B(<__?^_P1*NQ@=8`$@"+R81O"]``#_
+M/P``7"X``!2````0M00<!$G_]_[_@P29#"`<__?^_Q"]```4@````TO`&,!X
+M`2.#0Q@<<$<``"PN``#PM08<!QP`*0_0$4PA'/_W_O\"'`]-*D`P'"$<__?^
+M_PU+\A@3:"M`#^`)32D<__?^_P(<@"1D!")#,!PI'/_W_O\%2_(8$V@C0Q-@
+M`2#PO02```#____^+"X``/"U1T:`M`<<#1P&'!1)__?^_X5"!MD32_H8`2-;
+M0A-@`"`9X!!*D$8X'!$<__?^_P0<#DL<0#@<*1S_]_[_``0+2QA`!$,X'$%&
+M(AS_]_[_!$J[&!U@`2`(O)A&\+T``/\_``!@+@``%(```/__`,```/\_$+4$
+M'`5)__?^_P$<!$L90`D,(!S_]_[_$+T``!2``````/\_\+4$'!8<"00''`T4
+M_B+2`Y%"`=D,(!3@@"')`"H$$@S_]_[_`"(`+@#0`2(@'`5)__?^_RL$&PS;
+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
+M!AI#"F!(X"I+\A@3:%L`6P@38$'@+TJS&``BFU[M&#\M`-D_)1HI!]&Y(YL!
+M^1@+:"M#/R(30`G@N2*2`;D8"FC\(YL!&D`K0!L*$T,+8+DBD@&[&!IH,!P?
+M2;_G!BP'V*,`'4J96#`<*AS_]_[_'.``(!K@@WC;!@`K#]H`+070#DJS&!IH
+M""$*0P3@"TJS&!IH""&*0QI@`2`&X`:;`),P'"(<*QS_]_[_`;#PO>`!```L
+M+@``____]S`N```@@0``"*(``/_?__](@```/"X``%0N``#H@````````!"U
+M@K`$G`"4!9P!E/_W_O\`*`'0`2``X``@`K`0O<!&<+4%'``I+M`>3"$<__?^
+M_P(<'4L:0"@<(1S_]_[_"B#_]_[_*"073B@<&$G_]_[_@"-;`AA``"@1T#(@
+M__?^_R@<,1S_]_[_`AP/2QI`*!PQ'/_W_O\!/``LY=$!X``L`=$`(`S@"DPH
+M'"$<__?^_P(<"$L:0"@<(1S_]_[_`2!PO0``!$```/___/\00```!(```/__
+M^_]PM08<#1P/3"$<__?^_P(<@"/;`AI#,!PA'/_W_O\`+0[0"4PP'"$<__?^
+M_P(<!TL:0(`C6P(:0S`<(1S_]_[_<+T```2````$0```___\_W"U!AP-'`],
+M(1S_]_[_`AR`(]L"&D,P'"$<__?^_P`M#M`)3#`<(1S_]_[_`AP'2QI`@".;
+M`AI#,!PA'/_W_O]PO0``!(````1```#___S_<+4,'!$<!1P!)@$L"-`!+`+3
+M`BP'T`G@__?^_P8<!^#_]_[_!.#_]_[_`>``(`/@`DJK&!Q@,!QPO0``&"X`
+M``"U!$G_]_[_P".;`AA```P`O0``!$```!"U""DST`@I"=@"*3'0`BD"V`$I
+M%=`VX`0I)M`SX(`B4@"10BG0D4("V"`I(]`JX(`CFP"90B+0@"+2`)%"(-`A
+MX!1,%$J#&!MH`"L=T%J(@"/;`1I``"H1T0]*@Q@;:`(BFUX`*Q#:"^`,3`W@
+M#$P+X`Q,">`,3`?@#$P%X`Q,`^`,3`'@`"`#X"$<__?^_R`<$+T`````.!``
+M````````````````````````````````````````M0PA__?^_P"]P$8`M0H<
+M#"'_]_[_`+T`M0@A!"+_]_[_`+T0M00<""$@(O_W_O\@'`@A!"(`(__W_O\`
+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
+M(]L!&D``*F+08`!JX```3)D``"BB``#__?___P/^_V"```!4H@``>)@``)X)
+M``"C"0``3*(``!@K``!P$````E```)`J``"1*@``DBH``),J``"4*@``E2H`
+M`"PN```$@```G"H``)TJ``">*@``GRH``."```"@*@``H2H``.2````00```
+M%$```!A```!8@```EBH``)<J``"8*@``F2H```B```":*@``FRH```R````T
+M+@``&(```#P0```X$```))@``!29```<F```=DEK&!MH`B*;7@`K`=J@``#@
+M(!QD,/_W_O]Q3"@<(1S_]_[_@D;@(I(!*!PA'/_W_O\`)!`G`N#((/_W_O\C
+M'`$T$RL&W"@<9DG_]_[_.$``*/'1*!QB25)&__?^_V),*!PA'/_W_O\"'`,C
+M&D,H'"$<__?^_W.(H"(30*`K(M!:3T=$.V@"*QW064PH'"$<__?^_P(<5TL:
+M0/`C&P(:0R@<(1S_]_[_*!PA'/_W_O\"'(`C6P(:0R@<(1S_]_[_`2,[8`/@
+M24I"1``C$V`H'/_W_O\`)`$GH0"`(UL!R1@Z'*)`*!S_]_[_`30)+//=BB+2
+M`4)$`",38``D]"=_`.L9&XB<0@C:[QDH'"$<__?^_P$T.XB<0O?;-TI"1#=)
+M$6!(1@8H`]&`(UL!"T,38#%+0T0::"@<H"'_]_[_*!RL(?_W_O\"'.`CVP(:
+M0R@<K"'_]_[_*DEK&!MH`"L"T"@<__?^_R@<'TD!(@`C__?^_R@<24;_]_[_
+M(DPH'"$<__?^_P(<($L:0"@<(1S_]_[_YB)2`*L8&V@%*P?8!2L/T>@D9``K
+M&1N(!RL)V2@<%DD72O_W_O\H'!9)%DK_]_[_*!P525(B__?^_W*(@"-;`!I`
+M`"HET!%+).`X$```")@``"2<``!@F```("X``""9``#_#___I"H``&4)"`!0
+M$```((```/__?_X8@0``J@`!`!R!```0,@``"($``(X0``!^2T-$&G@2!A(6
+M*!PQ'/_W_O\`!@`.N2.;`4-$&F@_(QI`E$9V2T-$`"?97U,:!IP&(J)6DT(!
+MV5(8E$8&GP4BNE92``,&&Q;2&I1%!=EL2T-$`"%;7M(8E$:Y(YL!0T0::/PC
+MFP$1'!E`"0ID2T-$`"*<7@L;!I\&(KI6DT(`V1$9!IL%(II64@`#!AL6TAJ1
+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
+M('!'$+4`(`A+'!P*B)1&&XB:0@38`3"#`!M;G$7ZV8,``DJ;&`(BF%X0O2@`
+M``!PM0X<!1P=2\08M"#_]_[_(&``*`O0&DOJ&(`C$V`92^P8@"#_]_[_(&``
+M*`/1`B,S8``@(.`42^H8%$L38!1+ZA@42Q-@%$OJ&!1+$V`42^H8%$L38!1+
+MZA@42Q-@%$OJ&!1+$V`42^H8%$L38!1+ZA@42Q-@`2!PO0``3"X``-Q$``#8
+M1```""L````````,*P```````!`K````````%"L````````8*P```````!PK
+M````````("L````````D*P```````/"U5T9&1L"T!AR(1I)&'!P`)2-/&"-K
+M0]E9!B-K0T-$FP#:63`<__?^_P$T/R,C0``K`M$!(/_W_O\!-0\MZ=D`)1A/
+MZP#;&1EH6F@P'/_W_O\!-#\C(T``*P+1`2#_]_[_`35$+>W9`"4/3PPC:T/9
+M66L`6QE31)L`VEDP'/_W_O\!-#\C(T``*P+1`2#_]_[_`34_+>G9&+R81J)&
+M\+T```````````````#PM5=&1D;`M`<<#AP`(I)&D$8`)0R(8TN<0C_88DJ@
+M&`4A__?^_P`H"-%C`%]*G!@@'`HA__?^_P0<$N`TB%Q+X!@%(?_W_O\`*`#0
+MB.!C`%A*G!@@'`HA__?^_P0<`2.:1J0`_R,<0"`<""'_]_[_!!Q133@<*1S_
+M]_[_,XA/2I-"`]$0(P(<&D,"X!`C`AR:0S@<2$G_]_[_8^`,B"`<!2'_]_[_
+M``2`(YL"F$(5T4-*E$(2V#.(`CL;!!L,"B(8'%!#/TO`&!DA__?^_P$P""'_
+M]_[_!!P`(#S@-(@@'!0A__?^_P`$`"@.T39*E$(+V39+X!@4(?_W_O^```@A
+M__?^_P0<`R`EX#2((!P*(?_W_O\`!``H"]$L2J`8"B'_]_[_0``((?_W_O\$
+M'`(@$>`TB"`<!2'_]_[_``0`*`[1(DO@&`4A__?^_P@A__?^_P0<`2`"(?_W
+M_O^`1@'@`"`;X"4!0D:3`!U#4D93`!U#%TL=0_\C*AP:0#@<%4G_]_[_+0I_
+M(RH<&D`X'!))__?^_Q%*NQ@>8`$@&+R81J)&\+V_$@``</?__^#N__]0]___
+MH.[__P2B``"T"0``.Q4``(!$____$P``0.W__P$0``"<F```V)@``#@0````
+MM0E+P!@`:`<I"]B+``=*FUB?1@0P!N`(,`3@##`"X*PP`.``(`"]3"X```@#
+M``#PM5]&5D9-1D1&\+2(L(!&B48&DQ($$A0'DH)&`"$$D0.1`I$!D:1+0T0>
+M:*-*0D231@`G2T9:B/@C6P`:0-`J<=#0*@3<H"I;T,`J:]!WX*@A20"*0@K0
+MBD($W*`C6P":0@30;."`(0D!BD)HT4I&$XB325L8&P222I-"!MB22U-$`"*9
+M7@21D$LOX$E&"XB/2IL8&P3O(0D$BT(*V(U+4T0`(5I>!)*+2U-$`"%:7@.2
+M'^!*1A.(B$E;&!L$X"(2!)-"!MB&2U-$`"*97@21A$L+X$E&"XB#2I-""MF+
+M(UL!4T0`(IE>!)&`2U-$`"*97@.1?DM31``BF5Z,1GU+(.!]2T-$`"*97@*1
+M>TM#1``BF5X!D8<C6P%#1``BF5Z,1G=+#N!W2U-$`"*97@*1`9%U2U-$`"*9
+M7HQ&<TL!X``@+>)31``BF5X%D0`@<$R#`,(`$AE2:)I1`3``*/?0`"!L20>:
+M$P0<#`8E@P";&0(<:D,2&9(`4EA:8`$P`"CTT``@9$D'FA,$'`P&)8,`FQD"
+M'&I#$AF2`%)8FF`!,``H]-``(%U)!YH3!!P,!B6#`)L9`AQJ0Q(9D@!26-I@
+M`3`G*/39-1P,-6-&&00)#)<C6P``)`"4*!P!(O_W_O\&FA&(AR-;``"4*!P"
+M(O_W_O\&FUF(`)0H'`(B2$O_]_[_249+B$`B$T``*SS06D;3:0(BF5X#)`"4
+M*!P!(J@C__?^_UE&RVD$(IE>`)0H'`$BJ2/_]_[_64;+:08BF5X`E"@<`2*J
+M(__W_O]91LMI""*97@"4*!P!(JXC__?^_UE&RVD*(IE>`)0H'`$BKR/_]_[_
+M64;+:0PBF5X`E"@<`2*P(__W_O])1DN(@"(30``K2=`U'`PU`IH1!`D,`"0`
+ME"@<`R(?2__W_O\!FQD$"0R1(TC@``!,+@``<"H``%_P__\``.H$5!$``%81
+M``!TZ___6!$``%H1``"$ZO__7!$``%X1``!<%@``8A$``-X0```L$0``;!$`
+M`'`1```N$0``;A$``.(0```P$0````````````````````````$!```?`0``
+M-1P,-02:$00)#``D`)0H'`,BG4O_]_[_`YL9!`D,C2-;``"4*!P#(O_W_O_J
+M(UL`0T0:B/`C$T`P.S\K)M@U*@7012H#T$8J`=`V*A[1-1P,-0(D`)0H'`(A
+M`B):(__W_O\`E"@<`B$"(EPC__?^_P"4*!P"(0(B7B/_]_[_`)0H'`(A`2+^
+M(__W_O_I(UL`0T0;B$$K)MDT'`PT`2,`DR`<`2$!(GE+__?^_P,E`)4@'`$A
+M`B(!(__W_O\`E2`<`2$"(@,C__?^_P"5(!P!(0$BBR/_]_[_`)4@'`$A`2*,
+M(__W_O\`(6E-!YH3!!@,!B2+`)L9K#,*'&)#$AB2`%)9&F`!,0PI\]E)1DN(
+M0"(30``K"]`P'*PP6D;3:0`BF5X`(P"3`B(E(__W_O\P'*PP!9L9!`D,`",`
+MDP8B#B/_]_[_249*B(`CVP$:0``J`]$"(HM>`"L<VDM&6HB`(]L!&D``*@+0
+M""&)1@'@#R*11C4<K#4`)`"4*!P/(00B.B/_]_[_`)0H'$E&!")&(__W_O\`
+M)#]-XP!96:,`FEE`1O_W_O\!-S\C.T``*P+1`2#_]_[_`30`+.W0`"0V31@C
+M8T-96:,`FQE::$!&__?^_P$W/R,[0``K`M$!(/_W_O\!-``LZ]``)"Q-&"-C
+M0UE9HP";&9IH0$;_]_[_`3<_(SM``"L"T0$@__?^_P$T`"SKT``D(DT8(V-#
+M65FC`)L9VFA`1O_W_O\!-S\C.T``*P+1`2#_]_[_`30G+.O9`"0331@C8T-9
+M6:,`FQFL,QIH0$;_]_[_`3<_(SM``"L"T0$@__?^_P$T#"SJV0U*4D0`(Q-@
+M`2`(L'B\F$:A1JI&LT;PO0``%P$``!D!````````````````````````````
+M`"0N``#PM5]&5D9-1D1&\+0D3*5$!Y$&D@63!)#J(4D`0Q@:B/`C$T`P.S\K
+M"M@U*@7012H#T$8J`=`V*@+1`B(#D@'@`2,#DP6<8HCX(UL`&D#0*C#0T"H$
+MW*`J&M#`*BK0\.&H)6T`JD(+T*I"!-R@)G8`LD(%T.7A@"```8)"`-#@X029
+M"$J)&(M&!)P'36,9&.`$G@9(-ABS1@29!4J+&!#@*/S___@=``#8$```!!X`
+M`-H0```$FQI,&QF;1@2=&4ZK&1J(6$;#B!-``"L`T;CA!ID`(HM>6P0;%`&3
+M!YP`)6-?6P0;%`*3"JH,2Q.`4X``)K)&`"=81L*(`2$*J!,<.T$+0``K#]U3
+M1@$K`-F8X5L`'U(!)*)$!N```*W>__\0'@``W!````$W`R_GV06=*(A>1C%H
+MLH@(JP"3":O_]_[_`"""1@F9B48(FYE"`-F(X%0C2D9:0UQ&HVC2&)!&;49K
+MC;A.LT(CT2^-%",\'%Q#1$0A'`@QYHAU`+"H*AS_]_[_$#2KJ"$<*AS_]_[_
+M0$8"(4->"ZH`DC`<L*FKJO_W_O\`*`#12^%41N,!:ZA,X&U&+XT4(SP<7$-$
+M1"$<"#'FB'4`L*@J'/_W_O\0-*NH(1PJ'/_W_O]`1@(A0UX+J@"2,!RPJ:NJ
+M__?^_P`H`-$FX51&XP%KJ,`8"ZF`(O_W_O]M1F^-%",\'%Q#1$0A'`@QYHAU
+M`+"H*AS_]_[_$#2KJ"$<*AS_]_[_0$8"(4->"ZH`DC`<L*FKJO_W_O\`*`#1
+M_>!41N,!*ZC`&`NI@"+_]_[_`26J1*E$")N910#8=N<)F%Y&,6A#`%I>D$8(
+MFE,`75ZK1A(:DD8*JUN(<4B#0DS1`"?6(4D`:42)1GL`U:U=&06:$(A$1B$$
+M7D8R!$Q&'%^D1E-&G`'D&60`3D:D7P"4"0P2#&-&__?^_RB``3<_+^/9!)Q@
+M36,9&6C5J/_W_O\`!``4`QP`*`#:0QQ;$`>>,X!92VM$`"`;7@`K`-H!,UL0
+M5DEI1`N`5$MK1``BFUX`*P#:`3-;$`:<(X`*JQN(_YTK@/^><X#'X``G0$8#
+M!!L,F48K!!L,F$9^`-6M=1D%FA"(:ZJS7E%&C`'D&60`HEX`DDE&0D;_]_[_
+M*("UK749!9H0B"NJLUZB7@"2249"1O_W_O\H@`$W/R_=V0.8`B@MT029,TJ+
+M&!IHU:BUJ?6K__?^_P`$`!0#'``H`-I#'%L0!YPC@/6K`"5;7P`K`-H!,UL0
+M*4YN1#.`)TMK1``@&UX`*P#:`3-;$`:9"X`*JA.(_YPC@%.(_YUK@&S@($MK
+M1``FFU\"F(-".]L!F8M".-L$FA=,$QD9:+6H__?^_P`$`!0*JUN(_YTK@/^>
+M<X`#'``H`-I#'%L0!Y@#@!!+:T0`(5M>`"L`V@$S6Q`+2FI$$X`*2VM$`"0;
+M7P`K`-H!,UL0!ITK@#;@`"`]X```K=X``-A$``#2`P``U@,``%(#```$GAU(
+M,Q@9:-6H__?^_P`$"JL;B/^9"X#_FE.``!0`*`#:`3!#$`><(X`42VM$`"5;
+M7P`K`-H!,UL0$4YN1#.`#DMK1``@&UX`*P#:`3-;$`:9"X`&FA.(/R+2&@2<
+M"4UC&1J``2#V(YL`G41XO)A&H4:J1K-&\+W81```T@,``-8#``!4+@``<+4`
+M!`44&P0>%`2;&P08%!($%`P)!`D,C$(,T"L$&PQ:&E!#XQIS0\`881K_]_[_
+M``0`%`#@,!QPO<!&<+4`!`44&P0>%`2;&P08%!($%`P)!`D,C$(,T"L$&PQ:
+M&E!#XQIS0\`881K_]_[_``0`%`#@,!QPO<!&<+4`!`44&P0>%`2;&P08%!($
+M%`P)!`D,C$(,T"L$&PQ:&E!#XQIS0\`881K_]_[_``0`%`#@,!QPO<!&\+4,
+M'!X<!9\2!``$``P5%-(+B1@CB)A"`=(`(PG@BQX;B)A"#M,K!!L,`3L!X!,;
+M6Q`[8#-@$>`3&UL0,V`!,SM@"^`B'(Q""-(3B(-"[M!3B)A"\-,",HI"]M/P
+MO<!&\+5?1E9&349$1O"T@K`.'))&"YF)1@`$&P0?%``BDT8!(YA&`10!D8`B
+M4@*00@'8`"!*X``D048+!!D,2P":6R,$&PR:0@_2`9H3!!L,`3N90@G:6T8!
+M,QL$&Q2;1D-&`3,;!!L4F$8C!!T,648+!-L+FEN41D%&"`3`"X);ED911EM>
+M0%X`D"@<849R1O_W_O]K`$E&6%(`!``4N$(,VS\M"MAB'!($(P3;"TE&7U(4
+M%/PCFP.:0O398QP;!!P4_"&)`XM"MMD!(`*P>+R81J%&JD:S1O"]\+4%'`X<
+M`QQ^,QB(`"%;7@`GZE^;&GXK!=T#''X[&P0;%)Y&`N``(JE>CD8K''XS`"?<
+M7S\B8QZ<1IQ""-U3'AL$&A13`%M?8T4!W0`J]MH1'"`</R1+'AH<&P3X)[\#
+MNT(/V$L`6U^#0@O;$P09%$H>$P3X)[\#NT(#V$L`6U^#0O/:`"D+T0`L$]MC
+M`)L96H@:@&,>&P0<%``L]MH)X&,`F5.#'AL$&!1C'AL$'!0`+-#:<$;PO?"U
+M5T9.1D5&X+0$'(E&D$:>1D`F`QQ^,QB(`"%;7DU&`"?J7YL:?BL%W0,<?CL;
+M!!L4FD8"X``BJ5Z*1B,<?C,`)5A?/R)#'IQ&F$((W5,>&P0:%%,`&U]C10'=
+M`"KVVDM&?C,;B'%&"X`1'#\E<D8`)]-?@T(#V@`I!-$`+@+0`"9,1C\A`"D,
+MW4L`&U^#0@C;2QX;!!D4`"D#W4L`&U^#0O;:`"D-T0`N"]$`+1;;:P!#1%J(
+M&H!K'AL$'10`+?;:#.!J``L<,T-'1M-3@QX;!!@4:QX;!!T4`"W'VE!&.+R8
+M1J%&JD;PO<!&,+4$'`E+Q1@H:``H`]#_]_[_`",K8`9+Y!@@:``H`]#_]_[_
+M`",C8#"]``#81```3"X``/"U"!P$(HQ>`"<!(10E"QQK0QH8DXBC0@+:#QP$
+M(]1>`3$#*?/=%"-[0QL8$"*<7@@BGEX!(0HC/1Q=0VL86P`;&!`GVE^B0@+:
+M%!P((IY>`3$#*?+=<``@&@`$`!3PO?"U7T961DU&1$;PM`8<#1P7')M&`1P`
+M)!2`:HB@(UL`&D"@($``@D($T5I*L1B,:(F(%>!JB-`C&D#`*@'0T"H$T51+
+MR1@,:HF+">!KB*`B$T"@*P#0D^!.2#$83&D)B@`I`-R.X"J((XB:0@;35"-+
+M0QL95#L;B)I"%MDJB".(FD((TF.(.X`P'"$<__?^_UE&"(!TX%0C64,)&50Y
+M2X@[@#`<__?^_UG@`".>1@`@B$(.VBJ(E$8CB)I""=E4(H9&`3"(0@3:`QQ3
+M0QM;G$7VV%0C`AQ:0Q(9DD81B')&6D,3&9E&&XB<1LD:B$8`*3C=4$8"(4)>
+M2T8"(!E>4AHKB&!&&QH8'%!#0T9+0\`804;_]_[_``8`%CB`,!Q11O_W_O\$
+M'"0$)!0P'$E&__?^_P`$`!0D&BN(248*B)L:7$,P'/_W_O\`!``40T9#0^08
+M(!Q!1O_W_O\`!@`66D80@`W@5"-#0QD9*H@+B)I""-%+B#N`,!S_]_[_6T88
+M@`$@`.``('B\F$:A1JI&LT;PO0``^!T``/"U7T961DU&1$;PM(&P@$8/'!8<
+M`2*31@`EM4(9T@(C:T291NI&ZP#\&$!&(1Q*1E-&__?^_P`H!M!*1A.(HW%2
+M1A.(XW$!X``CFT8!-;5"Z=-81@&P>+R81J%&JD:S1O"]P$9PM0X<!1P?2\08
+MX"#_]_[_(&``*`O0'$OJ&(`C$V`;2^P8@"#_]_[_(&``*`/1`B,S8``@).`4
+M2^H80",38!1+ZA@42Q-@%$OJ&!1+$V`42^H8%$L38!1+ZA@42Q-@%$OJ&!1+
+M$V`42^H8%$L38!1+ZA@42Q-@%$OJ&!1+$V`!('"]``!,+@``W$0``-A$```(
+M*P````````PK````````$"L````````4*P```````!@K````````'"L`````
+M```@*P```````"0K````````\+571D9&P+0&'(A&DD8<'``E(T\8(VM#V5D&
+M(VM#0T2;`-I9,!S_]_[_`30_(R-``"L"T0$@__?^_P$U#RWIV0`E&$_K`-L9
+M&6A::#`<__?^_P$T/R,C0``K`M$!(/_W_O\!-8HM[=D`)0]/#"-K0]E9:P!;
+M&5-$FP#:63`<__?^_P$T/R,C0``K`M$!(/_W_O\!-3\MZ=D8O)A&HD;PO0``
+M`````````````/"U5T9&1L"T!QP.'``BDD:01@`E#(AC2YQ"/]AB2J`8!2'_
+M]_[_`"@(T6,`7TJ<&"`<"B'_]_[_!!P2X#2(7$O@&`4A__?^_P`H`-"(X&,`
+M6$J<&"`<"B'_]_[_!!P!(YI&I`#_(QQ`(!P((?_W_O\$'%%-.!PI'/_W_O\S
+MB$]*DT(#T1`C`AP:0P+@$","')I#.!Q(2?_W_O]CX`R((!P%(?_W_O\`!(`C
+MFP*80A710TJ40A+8,X@".QL$&PP*(A@<4$,_2\`8&2'_]_[_`3`((?_W_O\$
+M'``@/.`TB"`<%"'_]_[_``0`*`[1-DJ40@O9-DO@&!0A__?^_X``""'_]_[_
+M!!P#("7@-(@@'`HA__?^_P`$`"@+T2Q*H!@*(?_W_O]```@A__?^_P0<`B`1
+MX#2((!P%(?_W_O\`!``H#M$B2^`8!2'_]_[_""'_]_[_!!P!(`(A__?^_X!&
+M`>``(!O@)0%"1I,`'4-21E,`'4,72QU#_R,J'!I`.!P52?_W_O\M"G\C*AP:
+M0#@<$DG_]_[_$4J[&!Y@`2`8O)A&HD;PO;\2``!P]___X.[__U#W__^@[O__
+M!*(``+0)```[%0``@$3___\3``!`[?__`1```)R8``#8F```.!```/"U7T96
+M1DU&1$;PM(&P@$82!!(4DD:!1@`G@$M#1!YH2HCX(UL`&D#`*@[0P"H"W*`J
+M`]`0X-`J!]`-X'A+0T0`(IE>C$9W2PC@=TM+1``BF5Z,1G5+`>``(-?@2T0`
+M(IE>BT8`('),@P#"`!(94FB:40$P`"CWT``@;DE21A,$'`P&)8,`FQD"'&I#
+M$AF2`%)86F`!,``H]-``(&9)4D83!!P,!B6#`)L9`AQJ0Q(9D@!26)I@`3``
+M*/30`"!?25)&$P0<#`8E@P";&0(<:D,2&9(`4EC:8`$P&BCTV34<##5C1AD$
+M"0P`)`"4*!P#(J@C__?^_UI&$00)#`"4*!P#(J4C__?^_P`A34U21A,$&`P&
+M)(L`FQD*'&)#$AB2`%)9FF<!,0(I]-D`)$!-XP!96:,`FEE`1O_W_O\!-S\C
+M.T``*P+1`2#_]_[_`30`+.W0`"0W31@C8T-96:,`FQE::$!&__?^_P$W/R,[
+M0``K`M$!(/_W_O\!-``LZ]``)"U-&"-C0UE9HP";&9IH0$;_]_[_`3<_(SM`
+M`"L"T0$@__?^_P$T`"SKT``D(TT8(V-#65FC`)L9VFA`1O_W_O\!-S\C.T``
+M*P+1`2#_]_[_`30:+.O9`"0931@C8T-96:,`FQF:;T!&__?^_P$W/R,[0``K
+M`M$!(/_W_O\!-`(LZ]D02DI$`",38`$@`;!XO)A&H4:J1K-&\+T``$PN``!D
+M$0``9A$``&@1``!J$0`````````````````````````````D+@```+4)2\`8
+M`&@'*0O8BP`'2IM8GT8$,`;@"#`$X`PP`N!X,`#@`"``O4PN```H`P``\+4,
+M'!X<!9\`!!($`!05%-(+B1@CB)A"`=H`(PG@BQX;B)A"#MLK!!L,`3L!X!,;
+M6Q`[8#-@$>`3&UL0,V`!,SM@"^`B'(Q""-(3B(-"[M!3B)A"\-L",HI"]M/P
+MO<!&\+4,'!X<!9\`!!($`!05%-(+B1@CB)A"`=H`(PG@BQX;B)A"#MLK!!L,
+M`3L!X!,;6Q`[8#-@$>`3&UL0,V`!,SM@"^`B'(Q""-(3B(-"[M!3B)A"\-L"
+M,HI"]M/PO<!&\+5?1E9&349$1O"TA+`!D!\<#9B!1@D$"102!!`4#IH2!$L$
+M'A0`(YA&%!2B1H`C6P*:0@'8`"!7X$,:1$8B!!L$DT)0TT,:&P0;#)M&4$8"
+M!`*K`),P'#D<$@P#J__W_O\"FP`K`=$!(P*3448+!!D,2AX#FY-"`=&+'@.3
+M`YM8``*;6P#"7]M?FD("T4I&@%X5X`.<9`#E7W$;`IM;`$A&&EH0'$A#V5^*
+M&TM&Y%HC'%-#P!A)&__W_O\`!``41$8B!!(,`9F+`9L86P`/FIA20D8!,A($
+MLQP;!!X4$Q281A(,6D6RV0$@!+!XO)A&H4:J1K-&\+WPM5]&5D9-1D1&\+2-
+ML!<<"00)%`:1&P0;%`63EDE`&`!H@48`(I-&!IBZB@>K`),Y'`BK__?^_P`C
+MFD8#(U1&'!ND1@B;:"9S0Q@B8$900QL8V1DB(\I>ED9+C``K`-&UX%Q&8@`+
+MC!B>DU,+J]08RHTB@`>;:"%+0QL8VQD2!!(4V8TN)IM?FD(`W2&`6$9"``NK
+MTA@`(5->`"L`V@$S6Q`3@%M&6@`)J]48=$8A!`D,-"0(FV-##")@1E!#&QA;
+M&%L`VQF:C2J`!YMC0QL86QA;`-L9$@02%)F-+":;7YI"`-TI@%A&0@`)J](8
+M`"%37@`K`-H!,UL0$X!:1E4`"ZZN&0`C\5X)J^T8`"0J7PB;:"08'&!#&"-D
+M1EQ#H$9`1,`9`QPN,R0P`)!P1@0$)`P!E$A&`I!81O_W_O\`(K%>`"/J7@>8
+M:"-80T!$P!D#'"XS)#``D`&4@""``$A$`I!81O_W_O\KB#*(FQH;!``E`"LI
+MT`:<(P0;#)A&7D:P`4`90`!(1(`AR0!$&`B;6P#96P>;6P#:6P`F@U^`)K8`
+M@!D`)H!?`)!`1O_W_O\@@`$U6$9!``FKRUH+JHI:FQH;!!L,G4+9TP$ABT0!
+M(I)$4T8#*P#8,.<+JQJ(%IL:@``EJD9=10#3T^`L)&Q$H$8%GC,$&PP$DUM&
+M`3N:10G14$9"`"0AB1AL1@M;!#,7GI-3$.!01D,`%YJ9&"0DY!AN1J)?0T0"
+M)!M?TA@`*@#:`3)3$`N`5D8`+@'1`"$)X',`%YE:&`(Z$8A"1IM>R1H$GHD;
+M4$;#`4M$!TP:&8`F]@";&1*(&XC2&A($`"H&T!(4!>````0K```"!````2(`
+M*1S:4$;#`4M$@";V`)P9$P08#`,<2T,BB-(8$@02%&L`&9Z;&0$U`"H`V@-*
+M&H`!,0`I[ML"X````````%!&0P`D(M(8;$827Y9&0$8:7G9&MAJV1A>8'UH$
+MF_\8OQJT1KY"`-F\1F1&(P0;%)E"$-I01H8!@"3D``.3:P!R&%(`2D026QF8
+M&E(!,0$U`YJ10O/;5$:C`7-$6P!+1`9.FAG_((``&Q@2B!N(TAH2!``J!-`2
+M%`/@``#^`P```2)G12'9.P0;%)E"'=I41J,!<T1;`$M$$4Z<&1,$&`QB1HL:
+M`AQ:0R.(FQ@;!!H4:P`9GIL9`35_*@#=!TH:@`$Q.P0;%)E"ZML!(()$VD4`
+MTC+G448#*1#8`^!_````_@,``%)&4P`7G!L9FAX2B!J``2:R1%!&`RCSV7\M
+M"-AK`!F96QB:'A*(&H`!-7\M]MD-L'B\F$:A1JI&LT;PO?"U5T9.1D5&X+2'
+ML`<<'!R!1B9)0Q@;:)I&8HC0(QI`P"H!T-`J`=$A3@C@8XB@(A-`H"L!T1].
+M`>``((O@3D0X'!U)__?^_P`$``P/(P(<&D"01B&($QQL1AHT`)0$J@&2#YH"
+MDE)&`Y(X'#(<__?^_Q)-.!PI'/_W_O\"'!!+&D"SBP$[FP/`(0D""T`:0S@<
+M*1S_]_[_(H@`(6->`"L2T%)"!TM+1!J`$>#81```2"8``"`B``!LH@``6*(`
+M`/\___]4+@``!$I*1`)+$X`#3@`E_R0%X`````!4+@``@*(``.D`440*B")`
+M2X@C0!L"&D.+B"-`&P0:0\N((T`;!AI#.!PQ'/_W_O\$-@$U'RWGV0\C0D8:
+M0`2H`8@)`?PCFP`90`I#08B)`OPC&P(90`I#@8@)!/PCFP,90`I#P8B)!?PC
+M&P490`I#.!P%2?_W_O\!(`>P.+R81J%&JD;PO0``;*(``#"U!!P-2\48*&@`
+M*`/0__?^_P`C*V`*2^48*&@`*`/0__?^_P`C*V`&2^08(&@`*`/0__?^_P`C
+M(V`PO=A$``!,+@``!"L``#"U`"(#)1@DJQIC0U@80XD`*P+0%B/`7@/@`3(#
+M*O/9`"`PO1"U`"`8)`,<8T-;&%J)`"H'T`PC0T.;&%L`6Q@4(IA>`^`!,`,H
+M[MD`(!"]\+5?1E9&349$1O"T@;`''`X<D$:;1@$<`"45@'*(T",:0,`J`=#0
+M*@'194H&X'.(H"(30*`K`-"ZX&)*BQ@='!@U%"*97IN*`"L`T;#@,(@KB)A"
+M"-,+!!L,:")30UL9:#L;B)A"(-DRB"N(FD((TC@<*1S_]_[_0T88@#@<*1R0
+MX`L$&PQH(AP<5$,L&6@\.!PA'/_W_O]"1A"`.!PA'/_W_O];1AB`@.``)`L$
+M&!P`(0`K#]`RB)1&*XB:0@K9`@QH(`P<`3&10@3:"QQ#0UM;G$7VV&@B"QQ3
+M0UL9`),;B)E&(QQ30UL9FD8;B$I&TAJ11@`J1MTX'`"9__?^_P0<)`0D%#@<
+M44;_]_[_``0`%"0:,XA11@J(FQI<0S@<__?^_P`$`!1+1D-#Y!@@'$E&__?^
+M_P`&`!9"1A"`.!P`F?_W_O\$'"0$)!0X'%%&__?^_P`$`!0D&C.(448*B)L:
+M7$,X'/_W_O\`!``42T9#0^08(!Q)1O_W_O\`!@`66D80@!+@:"-+0UP9,H@C
+MB)I"#=$X'"$<__?^_T-&&(`X'"$<__?^_UE&"(`!(`#@`"`!L'B\F$:A1JI&
+MLT;PO4@F```@(@``\+5?1E9&349$1O"T@;"`1@\<%AP!(I-&`"6U0AG2`B-K
+M1)E&ZD;K`/P80$8A'$I&4T;_]_[_`"@&T$I&$XBC<5)&$XCC<0'@`".;1@$U
+MM4+ITUA&`;!XO)A&H4:J1K-&\+W`1G"U#AP%'"%*A!B$(/_W_O\@8``H%-`>
+M2JL8@"!``!A@'$OL&/_W_O\@8``H"-`:2JP8P"#``/_W_O\@8``H`]$"(S-@
+M`"`@X!1+ZA@42Q-@%$OJ&!1+$V`42^H8%$L38!1+ZA@42Q-@%$OJ&!1+$V`4
+M2^H8%$L38!1+ZA@42Q-@%$OJ&!1+$V`!('"]3"X``-Q$``#81```!"L```@K
+M````````#"L````````0*P```````!0K````````&"L````````<*P``````
+M`"`K````````)"L```````#PM5=&1D;`M`8<B$:21AP<`"4C3Q@C:T/9608C
+M:T-#1)L`VEDP'/_W_O\!-#\C(T``*P+1`2#_]_[_`34=+>G9`"483^L`VQD9
+M:%IH,!S_]_[_`30_(R-``"L"T0$@__?^_P$U?RWMV0`E#T\,(VM#V5EK`%L9
+M4T2;`-I9,!S_]_[_`30_(R-``"L"T0$@__?^_P$U/RWIV1B\F$:B1O"]````
+M````````````\+571D9&P+0''`X<`"*21I!&`"4,B%Y+G$(_V%U*H!@%(?_W
+M_O\`*`C18P!:2IP8(!P*(?_W_O\$'!+@-(A72^`8!2'_]_[_`"@`T'[@8P!3
+M2IP8(!P*(?_W_O\$'`$CFD:D`/\C'$`@'`@A__?^_P0<3$TX'"D<__?^_S.(
+M2DJ30@/1$","'!I#`N`0(P(<FD,X'$-)__?^_UG@#(@@'`4A__?^_P`$@".;
+M`IA"%=$^2I1"$M@SB`([&P0;#`HB&!Q00SI+P!@9(?_W_O\!,`@A__?^_P0<
+M`"`RX#2((!P4(?_W_O\`!``H"=$Q2I1"!MDQ2^`8%"'_]_[_@``;X#2((!P*
+M(?_W_O\`!``H!M$I2J`8"B'_]_[_0``,X#2((!P%(?_W_O\`!``H#M$B2^`8
+M!2'_]_[_""'_]_[_!!P!(`(A__?^_X!&`>``(!O@)0%"1I,`'4-21E,`'4,7
+M2QU#_R,J'!I`.!P52?_W_O\M"G\C*AP:0#@<$DG_]_[_$4J[&!Y@`2`8O)A&
+MHD;PO;\2``!P]___X.[__U#W__^@[O__!*(``+0)```[%0``@$3___\3``!`
+M[?__`1```)R8``#8F```.!```/"U7T961DU&1$;PM(.P!1R.1A($$A211H)&
+M`"`"D`&0@$:#1@`G?$M31!YH2HCX(UL`&D#0*F#0T"H$W*`J4=#`*EK09."@
+M(4D`BD(#T*@C6P":0ES1<$8#B'!)6Q@;!&]*DT(*V&]+4T0`(5A>`I!M2U-$
+M`"`:7@&22^!Q1@.(:DJ;&!L$[R``!(-""MAH2U-$`"*97@*19DM31``A6%X!
+MD#?@<D8+B&-(&Q@;!.`A"02+0@;884M31``@&EX"DE]+"N`3B%])BT(CV8LC
+M6P%31``@&EX"DEM+4T0`(IE>`9$7X%E+4T0`(5A>@$982U-$`"`:7I-&#.!6
+M2U-$`"*97HA&5$M31``A6%Z#1@'@`"!4X0`@44R#`,(`$AE2:)I1`3``*/?0
+M`"!-2I1&248+!!P,@P";&08A`AQ*0Q(9D@!A1E)86F`!,``H\M``($1*E$9)
+M1@L$'`R#`)L9!B$"'$I#$AF2`&%&4EB:8`$P`"CRT``@/$J41DE&"P0<#(,`
+MFQD&(0(<2D,2&9(`84926-I@`3`D*/+9<D93B(`B$T``*V30-!P,-$-&&00)
+M#``@@$8`D"`<`R+Q(__W_O]:1A$$"0Q#1@"3(!P#(NXC__?^_P(C`),@'`$A
+M`2(C2__W_O_F($``*Q@;:`DK!]`**U/1Z"%)`&L8&X@#*TW8!B`#(?_W_O\!
+M'#`<##`#(P"3`R*#(S_@3"X``%_P__\``.H$5!$``%81``!TZ___6!$``%H1
+M``"$ZO__7!$``%X1``!<%@``8A$``&01``!F$0``:!$``&H1````````````
+M````````````(P$```PBDAF01@*;&00)#``D`)00'`,B]R/_]_[_`9@!!`D,
+M`)1`1@,B]"/_]_[_`"%+2I1&2$8#!!L,GD8&)(L`FQF@,PH<8D-R1)(`8$82
+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
+M]_[_(&``*`C0&DJL&,`@P`#_]_[_(&``*`/1`B,S8``@(.`42^H8%$L38!1+
+MZA@42Q-@%$OJ&!1+$V`42^H8%$L38!1+ZA@42Q-@%$OJ&!1+$V`42^H8%$L3
+M8!1+ZA@42Q-@`2!PO4PN``#<1```V$0```0K```(*P````````PK````````
+M$"L````````4*P```````!@K````````'"L````````@*P```````"0K````
+M````&````-(```#2````T@```!X```#2````+````#````#>````-````#H`
+M``!2````1````$@```!,````6````-X```#>````A@```(P```#2````D@``
+M`-(```"8````G@```*@```#>````W@```-(```#>````R````-X```#>````
+MW@```-8````$``8`"0`,``"````@F```55555:JJJJIF9F9FF9F9F3H"```Z
+M`@``7`(``%P"``"``@``@`(``+0"``"T`@``R?___\G____)____R?___\+_
+M___R____\O____+____R____]/___\#____`____P/___\#___^Z____LO__
+M_[+___^R____LO___[#___\`@```()@``%55556JJJJJ9F9F9IF9F9E\````
+M2````$P```"F````6````*````"P`0``'````$````!4````L`$``)P```"P
+M`0``L`$``+`!``"P`0``L`$``+@```"P`0``L`$``+`!``"P`0``P@```-0`
+M``"P`0```@$``!@!``"P`0``?````+`!``"P`0``L`$``#X!``!,`0``L`$`
+M`&`!``"H`0``J`$``)0!``"8`0``G`$``*`!``"D`0``6@$``%H!```@````
+M/````%H!``!L````6@$``%H!``!:`0``6@$``%H!``",````6@$``%H!``!:
+M`0``6@$``*````!:`0``6@$``+`````R`0``6@$``%H!``!:`0``6@$``%H!
+M``#2````T@```%H!```:`0```0`"``(``0`!``(``0```'\````R````?P``
+M`"@```!_````30```'\```!`````'P```!`````_````,`````@````&````
+M``````0````(`````@````0````&````"`````H````,````#@```!````#>
+M!```*````/H```"``@``W`(``#H#``!`!```*@```!0````8````'````"@`
+M```H````(````"0````D````)@```!0````8````)````"0````<````(```
+M`"0````F````%````!@````D````)````!P````@````)````"8````4````
+M&````"0````D````'````"````!!4C4R,3```$%2-3(Q,0``05(U,C$R``!2
+M1C4Q,3$``%)&-3$Q,@``4D8R-#$S``!21C4T,3,``%)%1T]04U]&54Y#`$%T
+M:&5R;W,@-3(Q,`````!!=&AE<F]S(#4R,3$`````071H97)O<R`U,C$Q("A&
+M4$=!*0!!=&AE<F]S(#4R,3(@*$901T$I`$%T:&5R;W,@-3,Q,B!7:5-O0P``
+M071H97)O<R`R,S$U(%=I4V]#``!!=&AE<F]S(#(S,3<@5VE3;T,``$%T:&5R
+M;W,@,C,Q,R!7:5-O0P``071H97)O<R`U-#(T+S(T,C0```!!=&AE<F]S(#4R
+M,3(`````*%`6+%@HH/^C_Y[_H/^C_Z#_```%``H`%``>`#(`1@!5`%H`7P!D
+M````"@`4`!X`*``R`#P`1@!0`%H`9````,(```#$````Q0```-````#:````
+MY````,(```##````U````/(````-`0``*`$``,\```#*`````@!0(0$`0`$$
+M`*``"`#``"``T`!``%`!)`&8&0`F$`8`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````#_________
+M______\`F```1P````B8````````#)@``*:.A`D0F````.`R/128``!K!P``
+M')@````````@F`````("`B28```.#@``*)@```$"`@HLF```_&\#`#"8````
+M````-)@```X.```XF```!P```#R8`````0(`0)@`````8XE$F```G!9R$TB8
+M```SMA@`3)@``#QAA!)0F```X+CH#528``!92`<`6)@``+J^@'Y<F```7F8Z
+M,6"8```('0``9)@```#.`0!HF```D$&:0'"8```/````=)@``(````!XF```
+M!`````"9````````!)D````````(F0````````R9`````(``$)D```,`````
+MFP````````2;```@````")L``!`````,FP``,````!";```(````%)L``"@`
+M```8FP``*````!R;```$````()L``"0````DFP``%````"B;```T````+)L`
+M``P````PFP``+````#2;```"````.)L``"(````\FP``$@```$";```R````
+M1)L```H```!(FP``*@```$R;```!````4)L``"$```!4FP``$0```%B;```Q
+M````7)L```D```!@FP``*0```&2;```%````:)L``"4```!LFP``%0```'";
+M```U````=)L```T```!XFP``+0```'R;```#````@)L``",```"$FP``$P``
+M`(B;```S````C)L```L```"0FP``*P```)2;```'````F)L``"<```"<FP``
+M%P```*";```W````I)L```\```"HFP``+P```*R;```O````L)L``"\```"T
+MFP``+P```+B;```O````O)L``"\```#`FP``+P```,2;```O````R)L``"\`
+M``#,FP``+P```-";```O````U)L``"\```#8FP``+P```-R;```O````X)L`
+M`"\```#DFP``+P```.B;```O````[)L``"\```#PFP``+P```/2;```O````
+M^)L``"\```#\FP``+P````":```=````!)H``%T````(F@``G0````R:``#=
+M````$)H``!T!```4F@``(0```!B:``!A````')H``*$````@F@``X0```"2:
+M```Q````*)H``'$````LF@``L0```#":```<````-)H``%P````XF@``*0``
+M`#R:``!I````0)H``*D```!$F@``(````$B:```9````3)H``%D```!0F@``
+MF0```%2:```P````6)H```4```!<F@``)0```&":``!E````9)H``*4```!H
+MF@``*````&R:``!H````<)H``!\```!TF@``'@```'B:```8````?)H``%@`
+M``"`F@``F````(2:```#````B)H```0```",F@``1````)":``"$````E)H`
+M`!,```"8F@``$@```)R:``!2````H)H``)(```"DF@``T@```*B:```K````
+MK)H``"H```"PF@``:@```+2:``"J````N)H``!L```"\F@``&@```,":``!:
+M````Q)H``)H```#(F@``V@```,R:```&````T)H```8```#4F@``!@```-B:
+M```&````W)H```8```#@F@``!@```.2:```&````Z)H```8```#LF@``!@``
+M`/":```&````])H```8```#XF@``!@```/R:```&````U)@``"````#,F```
+M!````,B8```&`08`G)@``&T```#`F````````-"8```4````"0D```````("
+M!@8&!@8&`@(````#``8`"0`\`````P`&``D`/P``````````````````````
+M````````````\````,P````````````````````*X@```"````H"```!&```
+M`0```$`8!```!017&0`F$`8`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!L"8\)M`D````````@
+M````(````$````!````````&````!@````8`,````!4````5````'0```!4`
+M``!`$```#_PO``_\+P`?_"\`#_PO`$00```/_"\`#_PO`!_\+P`/_"\`2!``
+M``_\+P`/_"\`'_PO``_\+P!,$```#_PO``_\+P`?_"\`#_PO`%`0```/_"\`
+M#_PO`!_\+P`/_"\`5!````_\+P`/_"\`'_PO``_\+P!8$```#_PO``_\+P`?
+M_"\`#_PO`%P0```/_"\`#_PO`!_\+P`/_"\`8!````_\+P`/_"\`'_PO``_\
+M+P!D$```#_PO``_\+P`?_"\`#_PO`'`0``!H`0``X`$``+@!``!H`0``,!``
+M`#`"``#@`0``L````#`"``"P$```F`T``(`1``!('P``F`T``/`0``#@H```
+M:$`!`(!8``#@H```%(`````$``0`"``(`#``(``$``0<@```IX^-#L^/C0Z5
+MCV`!IX^-#@28`````````P``````````````()@````"`@(``@("``(!`@`"
+M`@(DF```#@X```X.```'!P``#@X``"B8```!``(*`0`""@```04!``(*-)@`
+M``X.```.#@``#@X```X.```XF```!P````<````+````"P```$28``"<%G(3
+MI19R$Z@6<A.<%G(32)@``&>Z&`!GNA@`:;H8`&FZ&`!0F```X+0H#."T*`S@
+MM"@,X+0H#%B8```N#8!^+@V`?BX-P'XN#8!^7)@``%Y=-S%>73<Q7ETZ,5Y=
+M-S%@F```$+T``!"]```XO0``$+T``&28````S@$``,X!``#.`0``S@$`%)D`
+M`!`G```0)P``?!4``!`G```8F0``D`$``)`!``"$````D`$``$29```@$.!O
+M(!#@;R`)X&\@$.!O@*$``/\4_P7_%/\%_Q3_!?\9_P74F```$````!0````0
+M````$`````P`````````*````)R<A(0L````?'Q\?#0````%````0```````
+M``!$````"````$@````(````3````!````!0`````````%0````?``````@`
+M```````$"`````````@(````````#`@````````0"````````!0(````````
+M&`@````````<"````````"`(````````)`@````````P$@````````2`````
+M````"(`````````,@````````!B`````````)(`````````H@```,````"R`
+M``#__P<`,(```/___P$T@```,0```#B`````````/(````````!`@```````
+M`$2````"````2(````````!4@````````%B`````````")@````````,F```
+MDY"$+1"8````X#)]%)@``&L/```<F````````"R8``#^;P(`,)@````````\
+MF`````$"`$"8``!Z`6H@3)@``#QAA!)4F```60@``&B8``"009I`;)@``(&P
+M#`5PF```#P```'28``"`````>)@```P`````F0````````29````````")D`
+M```````,F0````"``!"9```!````')D``"H)```@F0```````"29```%B@4`
+M*)D```$````LF0```````#"9````````-)D````````XF0```````#R9```_
+M````0)D```0```!(F0```````$R9````````4)D```````!4F0``3/%075B9
+M```8````7)D``(YJ2P"$H0``_P7_!HBA``#_!_\'C*$``/\(_PB0H0``_PG_
+M"92A``#_"O\*F*$``/\+_PN<H0``_PS_#*"A``#_#?\-I*$``/\._P^HH0``
+M_Q+_$JRA``#_$_\4L*$``/\5_Q:TH0``_Q?_&;BA``#_&O\;O*$``/\=_Q[`
+MH0``_R#_(\2A``#_)?\GR*$``/\I_RS,H0``_R__,="A``#_-/\WU*$``/\Z
+M_SK8H0``_SK_.MRA``#_.O\ZX*$``/\Z_SKDH0``_SK_.NBA``#_.O\Z[*$`
+M`/\Z_SKPH0``_SK_.O2A``#_.O\Z^*$``/\Z_SK\H0``_SK_.@";````````
+M!)L``"`````(FP``$`````R;```P````$)L```@````4FP``*````!B;```$
+M````')L``"0````@FP``%````"2;```T````*)L```P````LFP``+````#";
+M```"````-)L``"(````XFP``$@```#R;```R````0)L```H```!$FP``*@``
+M`$B;```&````3)L``"8```!0FP``%@```%2;```V````6)L```X```!<FP``
+M+@```&";```!````9)L``"$```!HFP``$0```&R;```Q````<)L```D```!T
+MFP``*0```'B;```%````?)L``"4```"`FP``%0```(2;```U````B)L```T`
+M``",FP``+0```)";```#````E)L``",```"8FP``$P```)R;```S````H)L`
+M``L```"DFP``*P```*B;```K````K)L``"L```"PFP``*P```+2;```K````
+MN)L``"L```"\FP``*P```,";```K````Q)L``"L```#(FP``*P```,R;```K
+M````T)L``"L```#4FP``*P```-B;```K````W)L``"L```#@FP``*P```.2;
+M```K````Z)L``"L```#LFP``*P```/";```K````])L``"L```#XFP```@``
+M`/R;```6````U)@``"````#8F```:!!@``":``"I`0````````2:``#I`0``
+M0`````B:```I````@`````R:``!I````4`$``!":``"9`0``D`$``!2:``#9
+M`0``T`$``!B:```9````$````!R:``!9````1````"":``"9````A````"2:
+M``"E`0``2`$``"B:``#E`0``B`$``"R:```E````R`$``#":``#(`0``%```
+M`#2:```(````0@```#B:``!(````@@```#R:``"(````>`$``$":``"8`0``
+MN`$``$2:``#8`0``^`$``$B:```8````$@```$R:``!8````4@```%":``"8
+M````D@```%2:``"D`0``?`$``%B:``#D`0``O`$``%R:```D````_`$``&":
+M``!D````"@```&2:``"D````2@```&B:``#D````B@```&R:```*`0``6@$`
+M`'":``!*`0``F@$``'2:``"*`0``V@$``'B:``#*`0``#@```'R:```*````
+M3@```(":``!*````C@```(2:``"*````7@$``(B:``"Z`0``G@$``(R:``#Z
+M`0``W@$``)":```Z````"0```)2:``!Z````20```)B:``"&`0``B0```)R:
+M``#&`0``>0$``*":```&````N0$``*2:``!&````^0$``*B:``"&````.0``
+M`*R:``#&````>0```+":``#&````N0```+2:``#&````O0$``+B:``#&````
+M_0$``+R:``#&````/0```,":``#&````?0```,2:``#&````O0```,B:``#&
+M````_0```,R:``#&````_0```-":``#&````_0```-2:``#&````_0```-B:
+M``#&````_0```-R:``#&````_0```.":``#&````_0```.2:``#&````_0``
+M`.B:``#&````_0```.R:``#&````_0```/":``#&````_0```/2:``#&````
+M_0```/B:``#&````_0```/R:``#&````_0````$```!&````8`````$```!&
+M````80````$```!&````8@````$```!&````8P````$```!&````9`````$`
+M``!&````90````$```!&````9@````$```!&````9P````$```!&````:```
+M``$```!&````:0````$```!&````:@````$```!&````:P````$```!&````
+M;`````$```!&````=`````$```!&````=`````$```!&````=`````$```!&
+M````=`````$```!&````=`````$```!&````=`````$```!&````=`````$`
+M``!&````=`````$```!&````=0````$```!&````=@````$```!&````=P``
+M``$```!&````>`````$```!&````>0````$```!&````>@````$```!&````
+M>P````$```!&````?`````$```!&````?0````$```!&````?@````$```!&
+M````?P````$```!&````@`````$```!$````?`````$```!&````B`````$`
+M``!&````C`````$```!&````D`````$```!&````E`````$```!&````F```
+M``$```!&````G`````$```!&````H`````$```!&````I`````$```!&````
+MJ`````$```!&````K`````$```!&````L`````$```!&````M``````"!P">
+M%@L`8A8*`#H6"0`<%@@`ZA4'`)H5!0!*%00``Q4"`%D4``````$`GA8&`&(6
+M!``Z%@,`'!8"`.H5`0":%0``2A4```,5`0!9%`,`N`L%``````````,`!@`)
+M`#\````)````!`````0``0`!``$`!@```$9'.``````````````````$````
+M`0`!``0```!&1S<``````````````````P`!``$``0`#````1D<V````````
+M``````````0```````$``0```$9'-0`````````````````$``$``0``````
+M``!&1S0`````````````````!`````$```#^____1D<S````````````````
+M``,``0`!````_?___T9',@`````````````````$`````````/S___]&1S$`
+M`````````````````@`!``$```#Z____1D<P````````````````````````
+M```````````````````````````````)````!`````0``0`!``$`````````
+M```&````1D<X``````````````````0````!``$````````````$````1D<W
+M``````````````````,``0`!``$````````````#````1D<V````````````
+M``````0```````$````````````!````1D<U``````````````````0``0`!
+M````````````````````1D<T``````````````````0````!````````````
+M``#^____1D<S``````````````````,``0`!``````````````#]____1D<R
+M``````````````````0```````````````````#\____1D<Q````````````
+M``````(``0`!``````````````#Z____1D<P````````````````````````
+M`````````````````````````````````````````!005!D`)A`&````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````;`F/";0)"`EL";0)________```%`@\`!P(/``H`#P`)``\`
+M`````"`````@````0````$````````8````&````!@">%@L`8A8*`#H6"0`<
+M%@@`ZA4'`)H5!0!*%00``Q4"`%D4``"X"P$````````````&`````0````(`
+M```#````!`````4```!`$```#_PO``_\+P`?_"\`#_PO``_\+P!$$```#_PO
+M``_\+P`?_"\`#_PO``_\+P!($```#_PO``_\+P`?_"\`#_PO``_\+P!,$```
+M#_PO``_\+P`?_"\`#_PO``_\+P!0$```#_PO``_\+P`?_"\`#_PO``_\+P!4
+M$```#_PO``_\+P`?_"\`#_PO``_\+P!8$```#_PO``_\+P`?_"\`#_PO``_\
+M+P!<$```#_PO``_\+P`?_"\`#_PO``_\+P!@$```#_PO``_\+P`?_"\`#_PO
+M``_\+P!D$```#_PO``_\+P`?_"\`#_PO``_\+P`P$```,`(``.`!``"P````
+M8`$``.`!``!P$```:`$``.`!``"X`0``C`$``.`!``"P$```8`X``(`1```<
+M'P``.#X``(`1``#P$```X*```&A``0"`6```X+```&A``0`4@```Z`/H`^`&
+MX`8@!"`$0`A`".`&X`8$F`````````,```````````````,````@F`````("
+M`@`"`@(``@$"``("`@`"`@(DF```#@X```X.```'!P``#@X```X.``!$F```
+M'!9R$R4<<A,B%W(3HA9R$R4<<A-@F```$)T``!"=```8G0``&)T``!"=``!D
+MF````,X!``#.`0``S@$``,X!``#.`0!HF```D$&:0)!!FD"009I`D$&:0)!!
+MFD`8F0``N`$``+@!``"$````"`$``+@!```DF0``!8H%$`6*!1`%B@40!8H%
+M$`6*!1`PH@``````````````````"`$````````,`````````#0````%````
+M0`````````!$````"````$@````(````3````!````!0`````````%0````?
+M``````@````````$"`````````@(````````#`@````````0"````````!0(
+M````````&`@````````<"````````"`(````````)`@```````!P$@``````
+M`#@0````````>!````````"X$````````/@0````````.!$```````!X$0``
+M`````+@1````````^!$````````X$@```````'@2````````N!(```````#X
+M$@```````#@3````````>!,```````"X$P```````/@3````````.!0`````
+M``!X%````````+@4````````^!0````````X%0```````'@5````````N!4`
+M``````#X%0```````#@6````````>!8```````"X%@```````/@6````````
+M.!<```````!X%P```````+@7````````^!<````````\$````````'P0````
+M````O!````````#\$````````#P1````````?!$```````"\$0```````/P1
+M````````/!(```````!\$@```````+P2````````_!(````````\$P``````
+M`'P3````````O!,```````#\$P```````#P4````````?!0````````$@```
+M``````B`````````#(`````````@@````````"2`````````*(```#`````L
+M@```__\'`#"```#___\!-(```#$````X@````````#R`````````2(``````
+M``!4@````````%B`````````7(```(_'#P#`@```&C""*L2```#@`=P%R(``
+M`!`G0!_,@`````#T`="````<'@``U(```*JJ`@#8@```554``MR`````````
+MX(```/_____D@```__\``.B`````````[(````````#P@````````/2`````
+M````^(````````#\@```B`````"'````````!(<``(P````(AP``Y`````R'
+M``#5`@``$(<````````4AP```````!B'``"@````'(<``,D!```@AP``+```
+M`"2'```L````*(<``#`````LAP``/````#"'```L````-(<``"P````XAP``
+M,````#R'```\````0(<```````!$AP```````$B'````````3(<```````!0
+MAP```````%2'````````6(<```````!<AP```````&"'``#5````9(<``-\`
+M``!HAP```@$``&R'```Z`0``<(<``'4```!TAP``?P```'B'``"B````?(<`
+M````````@0```@`!``2!```!````"($``,`````,@0```````!"!``!H`0``
+M%($```````#`AP````$"`\2'```$!08'R(<```@)"@O,AP``#`T.#]"'```0
+M$1(3U(<``!05%A?8AP``&!D:&]R'```<'1X?X(<````!`@/DAP``!`4&!^B'
+M```("0H+[(<```P-#@_PAP``$!$2$_2'```4%187^(<``!@9&AO\AP``'!T>
+M'PR8```9CH2M$)@```#@*'T4F```:Y\*G!R8````````0)@``'H!:B!4F```
+M60@```"9````````!)D````````(F0````````R9`````(``$)D```$````<
+MF0``@`P``""9`````!`%*)D```$````LF0``!````#29```B(!\>.)D```T,
+M"PH\F0``/P```$B9```2LH"25)D``(CA4%U<F0``CFI+`&B9``#.`P``<)D`
+M`!6U+QEXF0```0```'R9````````$*(``#-C@``4H@``$&P0`!BB``!@0)P`
+M(*(``,8PB`$DH@````0``"RB````````-*(``"`@("`XH@``("`@($"B```@
+M"DDX1*(``+9[``!(H@``_#__#P";````````*)L```P````XFP``$@```&2;
+M```A````C)L``"T```"<FP``,P```````P`&``D`/P````@````!`````P``
+M``````````````````8```!&1S<``````````````````@``````````````
+M``````````!&1S8``````````````````0```````````````````/W___]&
+M1S4``````````````````````````````````````/K___]&1S0`````````
+M```````````!``$``````````````/C___]&1S,````````````````````!
+M``$````!``$``````/;___]&1S(````````````````````!`````0`!``$`
+M`````//___]&1S$````````````````````!`````0`!`````0```/#___]&
+M1S``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````,```
+M`!6````5@```%8```!6````5@```'(```*>/C1+/#X@)E0_@!*L/X!+/#X@)
+M*)@```$``@H!``(*``$!!0$``@H!``(*-)@```X.```.#@``#@X```X.```.
+M#@``.)@```<````'````"P````L````+````2)@``%K:&`!:VA@`:<H8`&G*
+M&`!IRA@`4)@``."TZ`W@M.@-X+3H#>"TZ`W@M.@-6)@``"X-@'XN#8!^+DWH
+M?BY-Z'XN#8!^7)@``%YF-S%>9C<Q7F8W,5YF-S%>83<Q;)@``(&P#`6!L`P%
+M@;`,!8"P#`6`L`P%%)D``!`G```0)P``?!4``/@J```0)P``1)D``"`0N/<@
+M$+CW(`VX]R`0N/<@$+CW#*(``&I!+&1J02QD:D%`9&I!0&1J04!D'*(```J`
+M@Q@*@(,8"H!S&`J`@Q@*@(,8,!(````````(F````````"R8``#^+P(`/)@`
+M```!`@!,F```/&&$$C"9``"#2```0)D```0```!8F0``_P```'29````````
+M^)D``!@````$H@````````BB``"(9S[0**(``+4!```\H@``KXG($P2;```@
+M````")L``!`````,FP``,````!";```(````%)L``"@````8FP``!````!R;
+M```D````()L``!0````DFP``-````"R;```L````,)L```(````TFP``(@``
+M`#R;```R````0)L```H```!$FP``*@```$B;```&````3)L``"8```!0FP``
+M%@```%2;```V````6)L```X```!<FP``+@```&";```!````:)L``!$```!L
+MFP``,0```'";```)````=)L``"D```!XFP``!0```'R;```E````@)L``!4`
+M``"$FP``-0```(B;```-````D)L```,```"4FP``(P```)B;```3````H)L`
+M``L```"DFP``*P```*B;```K````K)L``"L```"PFP``*P```+2;```K````
+MN)L``"L```"\FP``*P```,";```K````Q)L``"L```#(FP``*P```,R;```K
+M````T)L``"L```#4FP``*P```-B;```K````W)L``"L```#@FP``*P```.2;
+M```K````Z)L``"L```#LFP``*P```/";```K````])L``"L```#XFP```@``
+M`/R;```6````G)@`````````````````````````````G)@`````````````
+M````````````````G)@`````````````````````````````G)@`````````
+M````````````````````G)@`````````````````````````````G)@`````
+M````````````````````````G)@`````````````````````````````G)@`
+M````````````````````````````G)@`````````````````````````````
+MG)@`````````````````````````````G)@`````````````````````````
+M````G)@`````.````#@````X````.````#@`G)@`````````````````````
+M````````G)@`````````````````````````````G)@`````````````P```
+M`(````"`````G)@``/D`!`#Y``0`_P`$`/T`!`#]``0`U)@`````````````
+M!`````0````$`````)H``*D!````````!)H``.D!``!`````")H``"D```"`
+M````#)H``&D```!0`0``$)H``)D!``"0`0``%)H``-D!``#0`0``&)H``!D`
+M```0````')H``%D```!$````()H``)D```"$````))H``*4!``!(`0``*)H`
+M`.4!``"(`0``+)H``"4```#(`0``,)H``,@!```4````-)H```@```!"````
+M.)H``$@```""````/)H``(@```!X`0``0)H``)@!``"X`0``1)H``-@!``#X
+M`0``2)H``!@````2````3)H``%@```!2````4)H``)@```"2````5)H``*0!
+M``!\`0``6)H``.0!``"\`0``7)H``"0```#\`0``8)H``&0````*````9)H`
+M`*0```!*````:)H``.0```"*````;)H```H!``!:`0``<)H``$H!``":`0``
+M=)H``(H!``#:`0``>)H``,H!```.````?)H```H```!.````@)H``$H```".
+M````A)H``(H```!>`0``B)H``+H!``">`0``C)H``/H!``#>`0``D)H``#H`
+M```)````E)H``'H```!)````F)H``(8!``")````G)H``,8!``!Y`0``H)H`
+M``8```"Y`0``I)H``$8```#Y`0``J)H``(8````Y````K)H``,8```!Y````
+ML)H``,8```"Y````M)H``,8```"]`0``N)H``,8```#]`0``O)H``,8````]
+M````P)H``,8```!]````Q)H``,8```"]````R)H``,8```#]````S)H``,8`
+M``#]````T)H``,8```#]````U)H``,8```#]````V)H``,8```#]````W)H`
+M`,8```#]````X)H``,8```#]````Y)H``,8```#]````Z)H``,8```#]````
+M[)H``,8```#]````\)H``,8```#]````])H``,8```#]````^)H``,8```#]
+M````_)H``,8```#]````U)@``"````#4F```$````!0````0````$````!0`
+M``#8F```:!!@`&@08`!H$&``:!!@`&@08`"<F```````````````````````
+M``````"<F`````````````````````````````"<F```````````````````
+M``````````"<F`````````````````````````````"<F```````````````
+M``````````````"<F```````$````!`````0````$````!"<F```````!```
+M``0````$````!`````2<F`````````````````````````````"<F```````
+M``````````````````````"<F`````````````````````````````"<F```
+M```````````````*``````````"<F```P``X`(``.`#``#@"P``X`,``.`"<
+MF```!@`"``8``@`&````!@`"``8``@"<F```B0```(D```")````B0```(D`
+M``"<F```H````*````"@````H````*````"<F```!P`$``<`!``'``0`!P`$
+M``<`!`#4F```&@```!H````:````&@```!H```"<F```0````$@```!`````
+M0````$````"<F```$````!`````0````$````!````"<F```"`````@````(
+M````"`````@```"<F```3P```$\```!/````3P```$\```"<F```\0```/$`
+M``!A````\0```/$```"<F```3Y```$^0``!,D```3Y```$^0``"<F```6A(`
+M`%H2``":$@``6A(``%H2``#,F```#@````X````/````#@````X````!````
+M1@```&`````!````1@```&$````!````1@```&(````!````1@```&,````!
+M````1@```&0````!````1@```&4````!````1@```&8````!````1@```&<`
+M```!````1@```&@````!````1@```&D````!````1@```&H````!````1@``
+M`&L````!````1@```&P````!````1@```'0````!````1@```'0````!````
+M1@```'0````!````1@```'0````!````1@```'0````!````1@```'0````!
+M````1@```'0````!````1@```'0````!````1@```'4````!````1@```'8`
+M```!````1@```'<````!````1@```'@````!````1@```'D````!````1@``
+M`'H````!````1@```'L````!````1@```'P````!````1@```'T````!````
+M1@```'X````!````1@```'\````!````1@```(`````!````1````'P````!
+M````1@```(@````!````1@```(P````!````1@```)`````!````1@```)0`
+M```!````1@```)@````!````1@```)P````!````1@```*`````!````1@``
+M`*0````!````1@```*@````!````1@```*P````!````1@```+`````!````
+M1@```+0````P````%8```!6````5@```%8```!6````<@```IY.-$L\3B`F5
+M$^`$JQ/@$L\3B`DHF````0`""@$``@H``0(%`0`""@$``@HTF```#@X```X.
+M```.#@``#@X```X.```XF```!P````<````+````"P````L```!(F```;=H8
+M`&W:&`!URA@`=<H8`'7*&`!0F```X+3H#>"TZ`W@M.@-X+3H#>"TZ`U8F```
+M+@V`?BX-@'XN#>A^+@WH?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F8W,5YF-S%L
+MF```@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,!```F`@``-`'
+M``!$F0``(!"X]R`0N/<0#;CW$!"X]Q`0N/<$H@`````````````(````"```
+M``@````(H@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``0`$L9$`!+&1@P4)D
+M8,%"9&#!0F0<H@``"H"#&`J`@Q@*@',8"H"#&`J`@Q@P$@````````B8````
+M````+)@``/XO`@`\F`````$"`$R8```\8802,)D``()(``!`F0``!````%B9
+M``#_````=)D````````HH@``M0$``#RB``"OB<@3!)L```$````(FP```@``
+M``R;```#````$)L```0````4FP``!0```!B;```(````')L```D````@FP``
+M"@```"2;```+````+)L```T````PFP``$````#2;```1````/)L``!,```!`
+MFP``%````$2;```5````2)L``!@```!,FP``&0```%";```:````5)L``!L`
+M``!8FP``'````%R;```=````8)L``"````!HFP``(@```&R;```C````<)L`
+M`"0```!TFP``)0```'B;```H````?)L``"D```"`FP``*@```(2;```K````
+MB)L``"P```"0FP``,````)2;```Q````F)L``#(```"@FP``-````*2;```U
+M````J)L``#4```"LFP``-0```+";```U````M)L``#4```"XFP``-0```+R;
+M```U````P)L``#4```#$FP``-0```,B;```U````S)L``#4```#0FP``-0``
+M`-2;```U````V)L``#4```#<FP``-0```.";```U````Y)L``#4```#HFP``
+M-0```.R;```U````\)L``#4```#TFP``-0```/B;```0````_)L``!H`````
+MF@``!P````<````$F@``1P```$<````(F@``AP```(<````,F@``H`$``*`!
+M```0F@``X`$``.`!```4F@``(````"`````8F@``8````&`````<F@``H0$`
+M`*$!```@F@``X0$``.$!```DF@``(0```"$````HF@``80```&$````LF@``
+M8@$``&(!```PF@``H@$``*(!```TF@``X@$``.(!```XF@``(@```"(````\
+MF@``8@```&(```!`F@``8P$``&,!``!$F@``HP$``*,!``!(F@``XP$``.,!
+M``!,F@``(P```",```!0F@``8P```&,```!4F@``A`$``(0!``!8F@``Q`$`
+M`,0!``!<F@``!`````0```!@F@``Z@$```L```!DF@``*@```$L```!HF@``
+M:@```(L```!LF@``J@```*P!``!PF@``JP$``.P!``!TF@``ZP$``"P```!X
+MF@``*P```!(```!\F@``:P```%(```"`F@``JP```)(```"$F@``K`$``),!
+M``"(F@``[`$``-,!``",F@``+````!,```"0F@``.@```%,```"4F@``>@``
+M`),```"8F@``N@```)0!``"<F@``NP$``-0!``"@F@``^P$``!0```"DF@``
+M.P```#H```"HF@``>P```'H```"LF@``NP```+H```"PF@``O`$``+L!``"T
+MF@``_`$``/L!``"XF@``/````#L```"\F@``?````'L```#`F@``O````+L`
+M``#$F@``_````+P!``#(F@``_````/P!``#,F@``_````#P```#0F@``_```
+M`'P```#4F@``_````+P```#8F@``_````/P```#<F@``_````/P```#@F@``
+M_````/P```#DF@``_````/P```#HF@``_````/P```#LF@``_````/P```#P
+MF@``_````/P```#TF@``_````/P```#XF@``_````/P```#\F@``_````/P`
+M``#4F```(````-"8```(!`8#"`0'`P@$!@,(!`8#"`0'`]R8``#`(*``P""@
+M`,`@X`#`(.``P"#@`)R8```````/````#P````\````/````#YR8````````
+M`````````````````````)R8`````(````"`````@````(````"``)R8````
+M`"H````J````*@```"H````J`)R8``````$````!`````0````$````!`)R8
+M`````````````````````````````)R8`````!@````8````&````!@````8
+M`)R8`````&````!@````;@```&X```!N`)R8`````,<```#'````QP```,<`
+M``#'`)R8`````$L```!+````2P```$L```!+`)R8`````$@$``!(!```2`0`
+M`$@$``!(!)R8`````$P```!,````3````$P```!,`)R8`````.0```#D````
+MY````.0```#D`)R8`````````````````````````````)R8`````/P```#\
+M````_````/P```#\`)R8`````/\```#_````_P```/\```#_`)R8`````#\$
+M```_!```/P0``#\$```_!)R8``````P````,````#`````P````,`)R8````
+M`!D"```9`@``&0(``!D"```9`IR8`````"0````D````)````"0````D`)R8
+M`````+0```"T````M````+0```"T`)R8`````)D```"9````F0```)D```"9
+M`)R8`````%````!0````4````%````!0`)R8`````"H````J````*@```"H`
+M```J`)R8`````!(````2````$@```!(````2`)R8`````#+````RP```,L``
+M`#+````RP)R8`````'0!``!T`0``=`$``'0!``!T`9R8`````!$````1````
+M$0```!$````1`)R8`````"B&```HA@``*(8``"B&```HAIR8`````(0Q``"$
+M,0``A#$``(0Q``"$,9R8``"``/(`@`#R`(``\@"``/(`@`#R`)R8```9`"<`
+M&0`G`!D`)P`9`"<`&0`G`)R8```#`````P````,````#`````P```)R8````
+M`````````````````````````)R8``"R````L@```+(```"R````L@```)R8
+M``"$(+``A""P`(0@L`"$(+``A""P`)R8``"D)4$`I"5!`*0E00"D)4$`I"5!
+M`)R8```@DA$`()(1`""2$0`@DA$`()(1`)R8````2!H``$@:``!(&@``2!H`
+M`$@:`-B8```P`@L`,`(+`#`""P`P`@L`,`(+`)R8``"4````E````)0```"4
+M````E````)R8``"1````D0```)$```"1````D0```)R8```2````$@```!(`
+M```2````$@```)R8``"`````@````(````"`````@````)R8``#9````V0``
+M`-D```#9````V0```)R8``!@````8````&````!@````8````)R8``#P````
+M\````/````#P````\````)R8``"B````H@```*(```"B````H@```)R8``!2
+M````4@```%(```!2````4@```)R8``#4````U````-0```#4````U````)R8
+M``#,%```S!0``,P4``#,%```S!0``)R8``",!```C`0``(P$``",!```C`0`
+M`,28```#`````P````,````#`````P```#`````5````%0```!4````5````
+M%0```!R```"GDXT2SQ.("943X`2K$^`2SQ.("2B8```!``(*`0`""@```@4!
+M``(*`0`""C28````#@````X````.````#@````X``#B8```"`````@````H`
+M```*````"@```$B8``!MVA@`;=H8`&1J&@!D:AH`9&H:`%"8``#@M.@-X+3H
+M#=JPZ`W:L)@,VK#H#5B8```N#8!^+@V`?BX-Z'XN#<A^+@V`?ER8``!>9C<Q
+M7F8W,5YF-S%>8#DQ7F8W,6R8``"!L`P%@;`,!8&P#`6!L`P%@;`,!129``#0
+M!P``T`<``$P$``"8"```T`<``$29````$+CW`!"X]P`-N/<`$+CW`!"X]P2B
+M``````````````````````````````BB``"(9[[6B&>^UHAG/M"(9S[0B&<^
+MT`RB``!``2P`0`$L`$#!0@!`P4(`0,%"`!RB```*@(,8"H"#&`J`8Q@*@(,8
+M"H"#&#`2``#@`P``8(````\````8@0```````!R!````````(($````````D
+M@0```````"B!````````+($````````P@0```````#2!````````.($`````
+M```\@0```````$"!``"H``"`1($````````(F````````"R8````H```/)@`
+M```$(`!,F```/".$$G"8```?````=)@``(````!XF```#@```%B9``#_````
+M@)D```````"$F0````"``J"9````````X)D```````#DF0``JJJJJNB9``!X
+M9$8\[)D``*H```#PF0``#````/29``#_````^)D``!0````HH@``M0D``#RB
+M``"OB<B33*(```$```!0H@```*```%2B````````6*(``(!3QPQ<H@```0\/
+M#V"B```!#VE?9*(``!&*00!HH@```````&RB``!JP3`,<*(``"`(@@!TH@``
+MJGP;`'BB``#..><<?*(``,X!%P4`HP`````!&`2C```")@,P"*,```8^!T@,
+MHP``"DP+5A"C```/8!ID%*,``!MN3W@8HP``6GR/AARC``!;AL^.(*,```^7
+M3YTDHP``CZ'/I2BC```?KU^U+*,``)^YW[TPHP``/\=_S32C``"_T?_5.*,`
+M```````\HP```````$"C````````1*,```````!(HP``____/TRC``#___\_
+M4*,``/___S]4HP``__\#`%BC```?JJAY7*,```]";`9@HP``!R(H#V2C``"%
+M%F`7:*,```01@!]LHP```PR@-W"C``"#",0_=*,```,(P%=XHP``@@;87WRC
+M``""!.!_@*,``+I[/'^$HP``\'\P\P2;```!````")L```(````,FP```P``
+M`!";```$````%)L```4````8FP``"````!R;```)````()L```H````DFP``
+M"P```"R;```-````,)L``!`````TFP``$0```#R;```3````0)L``!0```!$
+MFP``%0```$B;```8````3)L``!D```!0FP``&@```%2;```;````6)L``!P`
+M``!<FP``'0```&";```@````:)L``"(```!LFP``(P```'";```D````=)L`
+M`"4```!XFP``*````'R;```I````@)L``"H```"$FP``*P```(B;```L````
+MD)L``#````"4FP``,0```)B;```R````H)L``#0```"DFP``-0```*B;```U
+M````K)L``#4```"PFP``-0```+2;```U````N)L``#4```"\FP``-0```,";
+M```U````Q)L``#4```#(FP``-0```,R;```U````T)L``#4```#4FP``-0``
+M`-B;```U````W)L``#4```#@FP``-0```.2;```U````Z)L``#4```#LFP``
+M-0```/";```U````])L``#4```#XFP``$````/R;```:`````)H`````````
+M````!)H```````!`````")H```````"`````#)H```````"!`0``$)H`````
+M``#!`0``%)H````````!````&)H```````!!````')H```````"!````()H`
+M``````!H`0``))H```````"H`0``*)H```````#H`0``+)H````````H````
+M,)H```````!H````-)H```````")`0``.)H```````#)`0``/)H````````)
+M````0)H```````!)````1)H```````")````2)H```````"0`0``3)H`````
+M``#0`0``4)H````````0````5)H```````!0````6)H```````"0````7)H`
+M``````"1`0``8)H```````#1`0``9)H````````1````:)H```````!1````
+M;)H```````"1````<)H```````!X`0``=)H```````"X`0``>)H```````#X
+M`0``?)H````````X````@)H```````!X````A)H```````"9`0``B)H`````
+M``#9`0``C)H````````9````D)H```````!9````E)H```````"9````F)H`
+M``````#9````G)H```````#Y````H)H```````#Y````I)H```````#Y````
+MJ)H```````#Y````K)H```````#Y````L)H```````#Y````M)H```````#Y
+M````N)H```````#Y````O)H```````#Y````P)H```````#Y````Q)H`````
+M``#Y````R)H```````#Y````S)H```````#Y````T)H```````#Y````U)H`
+M``````#Y````V)H```````#Y````W)H```````#Y````X)H```````#Y````
+MY)H```````#Y````Z)H```````#Y````[)H```````#Y````\)H```````#Y
+M````])H```````#Y````^)H```````#Y````_)H```````#Y````U)@``"``
+M``#0F```"!0``@@4`0((%``""!0``@@4`0+<F```P""@`,`@H`#`(.``P"#@
+M`,`@X`"<F```````\````/````#P````\````/"<F```````````````````
+M``````````"<F````````P````,````#`````P````.<F```````````````
+M``````````````"<F`````````````````````````````"<F```````````
+M``````````````````"<F`````````````````````````````"<F```````
+M``````````````````````"<F`````!`0```0$```$!```!`0```0$"<F```
+M```%90``!64```5E```%90``!66<F`````````````````````````````"<
+MF`````````````````````````````"<F`````!"````0@```$(```!"````
+M0@"<F`````"U````M0```+4```"U````M0"<F``````#`````P````,````#
+M`````P"<F`````#W````]P```/<```#W````]P"<F`````"=````G0```)T`
+M``"=````G0"<F``````B````(@```"(````B````(@"<F``````B!```(@0`
+M`"($```B!```(@2<F```&``C`!@`(P`8`",`&``C`!@`(P"<F``````H````
+M*`!@`"@`8``H`&``*`"<F```P`!0`,``4`##`%``PP!0`,,`4`"<F```?P`$
+M`'\`!`!_``0`?P`$`'\`!`"<F```6`0``%@$``!8!```6`0``%@$``"<F```
+M``````````````````````````"<F````,````#`````P````,````#```#8
+MF```,`)``#`"0``P`D``,`)``#`"0`"<F````&0```!D````9````&0```!D
+M``"<F`````@````(````"`````@````(``#,F```#@````X````.````#@``
+M``X````P````%0```!4````5````%0```!4````<@```IY.-$L\3B`F5$^`$
+MJQ/@$L\3B`DHF````0`""@$``@H``0(%`0`""@$``@HTF```#@X```X.```.
+M#@``#@X```X.```XF```!P````<````+````"P````L```!(F```8?H8`&'Z
+M&`!C&AH`8QH:`&,:&@!0F```X+28#."TF`S:L)@,VK"8#-JPF`Q8F```+@W(
+M?BX-R'XN#<A^+@W(?BX-R'Y<F```7F`Y,5Y@.3%>8#DQ7F`Y,5Y@.3%LF```
+M@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,!```F`@``-`'``!$
+MF0```!"X]P`0N/<`#;CW`!"X]P`0N/<$H@``````````````````````````
+M```(H@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``X,$N`.#!+@`@P2H`(,$J
+M`"#!*@`<H@``"H"#&`J`@Q@*@&,8"H"#&`J`@Q@`HP`````!&````1@```$8
+M```!&````1@$HP```B8#,`(F`S`")@,P`B8#,`(F`S`(HP``!CX'2`8^!T@&
+M/@=(!CX'2`8^!T@,HP``"DP+5@I,"U8*3`M6"DP+5@I,"U80HP``#V`:9`]@
+M&F0/8!ID#V`:9`]@&F04HP``&VY/>!MN3W@;;D]X&VY/>!MN3W@8HP``6GR/
+MAEI\CX9:?(^&6GR/AEI\CX8<HP``6X;/D%N&SY!;AL^.6X;/CEN&SXX@HP``
+M#Y=/G0^73YT/ET^;#Y=/FP^73YLDHP``CZ//IX^CSZ>/G\^CCY_/HX^?SZ,H
+MHP``'Z]?M1^O7[4?KU^S'Z]?LQ^O7[,LHP``G[G?O9^YW[V?N=^[G[G?NY^Y
+MW[LPHP``/\5_RS_%?\L_QW_+/\=_RS_'?\LTHP``O]'_U;_1_]6_T?_3O]'_
+MT[_1_],P$@``X`,``&A````0````8(````\```"<@````````*"`````````
+M&($````````<@0```````""!````````)($````````H@0```````"R!````
+M````,($````````T@0```````#B!````````/($```````!`@0``^0,`@$2!
+M````````")@````````LF````*```#R8````!"``3)@``#PCA!)PF```'P``
+M`'28``"`````>)@```X```!8F0``_Q\(`("9````````A)D`````@`*@F0``
+M`````."9````````Y)D``*JJJJKHF0``>&1&/.R9``"J````\)D```P```#T
+MF0``_P```/B9```4````**(``+4)```\H@``KXG(DTRB```!````4*(```"@
+M``!4H@```````%BB``"`4\<,7*(```$/#P]@H@```0]I7V2B```1BD$`:*(`
+M``````!LH@``:L$P#'"B```@"((`=*(``*I\&PAXH@``SCGG''RB``#.`1<%
+M.*,````````\HP```````$"C````````1*,```````!(HP``____/TRC``#_
+M__\_4*,``/___S]4HP``__\#`%BC```?JJAY7*,```]";`9@HP``!R(H#V2C
+M``"%%F`7:*,```01@!]LHP```PR@-W"C``"#",0_=*,```,(P%=XHP``@@;8
+M7WRC``""!.!_@*,``+I[/'^$HP``\'\P\P2;```!````")L```(````,FP``
+M`P```!";```$````%)L```4````8FP``"````!R;```)````()L```H````D
+MFP``"P```"R;```-````,)L``!`````TFP``$0```#R;```3````0)L``!0`
+M``!$FP``%0```$B;```8````3)L``!D```!0FP``&@```%2;```;````6)L`
+M`!P```!<FP``'0```&";```@````:)L``"(```!LFP``(P```'";```D````
+M=)L``"4```!XFP``*````'R;```I````@)L``"H```"$FP``*P```(B;```L
+M````D)L``#````"4FP``,0```)B;```R````H)L``#0```"DFP``-0```*B;
+M```U````K)L``#4```"PFP``-0```+2;```U````N)L``#4```"\FP``-0``
+M`,";```U````Q)L``#4```#(FP``-0```,R;```U````T)L``#4```#4FP``
+M-0```-B;```U````W)L``#4```#@FP``-0```.2;```U````Z)L``#4```#L
+MFP``-0```/";```U````])L``#4```#XFP``$````/R;```:`````)H`````
+M````````!)H``$````!`````")H``(````"`````#)H``*$!``!A`0``$)H`
+M`.$!``"A`0``%)H``"$```#A`0``&)H``&$````A````')H``(@!``!A````
+M()H``,@!``"(`0``))H```@```#(`0``*)H``$@````(````+)H``(@```!(
+M````,)H``*D!``"(````-)H``.D!``!I`0``.)H``"D```"I`0``/)H``&D`
+M``#I`0``0)H``-`!```I````1)H``!````!I````2)H``%````"0`0``3)H`
+M`)````#0`0``4)H``+$!```0````5)H``/$!``!0````6)H``#$```"0````
+M7)H``'$```!Q`0``8)H``+@!``"Q`0``9)H``/@!``#Q`0``:)H``#@````Q
+M````;)H``'@```!Q````<)H``)D!``"8`0``=)H``-D!``#8`0``>)H``!D`
+M```8````?)H``%D```!8````@)H``)D```"8````A)H``-D```!Y`0``B)H`
+M`/D```"Y`0``C)H``/D```#Y`0``D)H``/D````Y````E)H``/D```!Y````
+MF)H``/D```"Y````G)H``/D```#Y````H)H``/D```#Y````I)H``/D```#Y
+M````J)H``/D```#Y````K)H``/D```#Y````L)H``/D```#Y````M)H``/D`
+M``#Y````N)H``/D```#Y````O)H``/D```#Y````P)H``/D```#Y````Q)H`
+M`/D```#Y````R)H``/D```#Y````S)H``/D```#Y````T)H``/D```#Y````
+MU)H``/D```#Y````V)H``/D```#Y````W)H``/D```#Y````X)H``/D```#Y
+M````Y)H``/D```#Y````Z)H``/D```#Y````[)H``/D```#Y````\)H``/D`
+M``#Y````])H``/D```#Y````^)H``/D```#Y````_)H``/D```#Y````U)@`
+M`"````#0F```"`````@````(````"`````@```#<F```P`"@`,``H`#``.``
+MP`#@`,``X`"<F```````,P```#,````S````,P```#.<F````````0````$`
+M```!`````0````&<F`````````````````````````````"<F```````````
+M``````````````````"<F`````````````````````````````"<F```````
+M'P```!\````?````'P```!^<F`````````````````````````````"<F```
+M``"X````N````+@```"X````N`"<F`````"W````MP```+<```"W````MP"<
+MF`````"$````A````(0```"$````A`"<F`````"8````F````)@```"8````
+MF`"<F`````#`````P````,````#`````P`"<F`````#_````_P```/\```#_
+M````_P"<F`````#_````_P```/\```#_````_P"<F`````#_````_P```/\`
+M``#_````_P"<F`````#_````_P```/\```#_````_P"<F`````#7````UP``
+M`-<```#7````UP"<F`````!A````80```&$```!A````80"<F`````#^````
+M_@```/X```#^````_@"<F`````#>````W@```-X```#>````W@"<F`````!_
+M````?P```'\```!_````?P"<F``````]!```/00``#T$```]!```/02<F```
+M``!W````=P```'<```!W````=P"<F`````!$````1````$0```!$````1`"<
+MF`````"8````F````)@```"8````F`"<F```@``0`(``$`"``!``@``0`(``
+M$`"<F```-,`%`#3`!0`TP`4`-,`%`#3`!0"<F```\``Q`/``,0#P`#$`\``Q
+M`/``,0"<F```'P$,`!\!#``?`0P`'P$,`!\!#`"<F```0`!1`$``40!``%$`
+M0`!1`$``40"<F```V@!0`-H`4`#:`%``V@!0`-H`4`"<F```````````````
+M``````````````"<F```1$```$1```!$0```1$```$1```"<F```````````
+M``````````````````"<F```P&```,!@``#`8```P&```,!@``"<F````"P`
+M```L````-@```#8````L``#(F````P0```,$```#!````P0```,$``"<F```
+M`&0```!D````9````&0```!D``"<F`````@````(````"`````@````(``#,
+MF```#@````X````.````#@````X````P+CDN,C`N,P``````````"````!``
+M```8````(````"@````P````.````````````/\!_P$`````````````____
+M_____W\``````P"8`9D!`````````````/________]_``````<`F`$P"P``
+M``````````#_________?P`````(`)@!,`P`````````````_________W\`
+M````(``@`1`*`````````````/________]_`````"$`(`&9`0``````````
+M``#_________?P`````B`"`!,`P`````````````_________W\`````.@!@
+M`1`*`````````````/________]_`````#L`8`&9`0````````````#_____
+M____?P`````2`&4!$`H```,`````````_________W\`````-P`P`9D!```#
+M`````````/________]_`````#4`,`*9`0```P````````#_________?P``
+M```V`#`#F0$```,`````````_________W\`````,``P!)D!```#````````
+M`/________]_`````#D`,`69`0```P````````#_________?P`````T`#`&
+MF0$```,`````````_________W\`````,@`P`YD!```#`````````/______
+M__]_`````#$`,`.9`0````````````#_________?P`````1`!`!F0$`````
+M````````_________W\`````$``0`1`*`````````````/________]_````
+M`%(`4`&9`0````````````#_________?P````!%`%`"F0$`````````````
+M_________W\`````1P!0`YD!`````````````/________]_`````$(`4`29
+M`0````````````#_________?P````!8`%`%F0$`````````````________
+M_W\`````6P!0!ID!`````````````/________]_`````%T`4`B9`0``````
+M``````#_________?P````!>`%`)F0$`````````````_________W\`````
+M4`!0`Q`*`````````````/________]_`````%4`4`$P#`````````````#_
+M________?P````!6`%`",`P`````````````_________W\`````20!0`E`-
+M`````````````/________]_`````$``0`%`"@``1@````0````H````````
+M`(@!``!!`$`!0`H``$<````$````:`````````")`0``2`!``1`*``!&````
+M!`````@`````````B@$``$H`0`%`"@``1@````0````(&````````(P!``!+
+M`$`!0`H``$8````$````"&````````"-`0``3`!``5`*``!&````!`````@`
+M````````CP$``$,`0`)`"@``1P````0```!P`````````(L!``#P`$`#0`H`
+M`$8````$````(```````````````@`!``T`*``!'````!````&``````````
+MIP\``/$`0`-`"@``1@````0`````&`````````````"!`$`#0`H``$8````$
+M`````&````````"H#P``@@!``U`*``!&````!```````````````J0\``/(`
+M0`,0"@``1@````0```````````````````"#`$`$0`H``$<````$````8(``
+M``````"J#P``]`!`!$`*``!&````!`````"8`````````````(0`0`1`"@``
+M1@````0`````X````````*L/``"%`$`$4`H``$8````$`````(````````"L
+M#P``]0!`!!`*``!&````!`````"``````````````(8`0`5`"@``1P````0`
+M``!@@````````*T/``"'`$`%0`H``$8````$`````.````````"N#P``B`!`
+M!5`*``!&````!`````"`````````KP\``(D`0`9`"@``1P````0```!H````
+M`````+`/``"*`$`&0`H``$8````$````"&````````"Q#P``BP!`!E`*``!&
+M````!`````@`````````L@\``(P`0`=`"@``1P````0```!H@````````+,/
+M``"-`$`'0`H``$8````$````".````````"T#P``C@!`!U`*``!&````!```
+M``B`````````M0\``(\`0`A`"@``1P````0```!H@````````+8/``"0`$`(
+M0`H``$8````$````".````````"W#P``D0!`"%`*``!&````!`````B`````
+M````N`\``/8`0`E`"@``1P````0```!@@`````````````#W`$`+0`H``$<`
+M```$````8(``````````````8`!@`&```````````````/________]_````
+M`&$`80!A`````P````````#_________?P````!B`&(`8@````(`````````
+M_________W\`````8P!C`&,``````````````/________]_`````&0`9`!D
+M`````P````````#_________?P````!E`&4`90````,`````````________
+M_W\`````9@!F`&8``````````````/________]_`````&<`9P!G````````
+M``````#_________?P````!H`&@`:```````````````_________W\`````
+M:0!I`&D````#`````````/________]_`````&H`:@!J`````P````````#_
+M________?P````!E`````0```/____^`````_____P````!*4```M`\`````
+M````````:@````$```#_____@````/____\`````2E```+0/````````````
+M`/\!```!`````0````$```!8&P`````0``$````!`````0```%@;```(``,`
+M`0`````````!````6!L```P``P`!``````````$```!8&P``(`!'````````
+M`````````%@;```S`#```0`````````!````6!L``"0`(0`!`````0````$`
+M``!8&P``*``W``$``````````0```%@;```?`#```0````$````!````6!L`
+M`#``6P`!``````````$```!8&P``<``#``$``````````0```%@;```X`#<`
+M`0`````````!````6!L``%0`50`!`````0````$```!8&P``1`!5``$````!
+M`````0```%@;``!,`#L``0``````````````6!L``&``4@`!`````0````$`
+M``!8&P``9``T``$``````````0```%@;``!\`"```0````$````!````6!L`
+M`)@`6P`!`````0````$```!8&P``G`!2``$````!`````0```%@;``"J`!``
+M`0`````````!````6!L``+P``P`!``````````$```!8&P``OP`V``$`````
+M`````0```%@;``#$`#<``0````$````!````6!L``,L`-P`!``````````$`
+M``!8&P``T``W``$``````````0```%@;``#6`!```0````$````!````6!L`
+M`-H``P````````````````!8&P``,@,V``$``````````0```%@;``#>``,`
+M`0`````````!````6!L``.D`-P`!``````````$```!8&P``]@`W``$`````
+M`````0```%@;``#Z`#<``0`````````!````6!L``/\`-@`!``````````$`
+M``!8&P``#`$P``$````!`````0```%@;```4`3<``0`````````!````6!L`
+M`"P!-P`!``````````$```!8&P``0`$0``$````!`````0```%@;``!4`0,`
+M`0`````````!````6!L``%@!(0`!`````0````$```!8&P``7`$W``$`````
+M`````0```%@;``!@`3<``0`````````!````6!L``&0!6P`!``````````$`
+M``!8&P``:`%2``$``````````0```%@;``!L`5(``0````$````!````6!L`
+M`'0!-P`!``````````$```!8&P``>`$#``$``````````0```%@;``!\`3<`
+M`0`````````!````6!L``(@!0``!``````````````!8&P``B0%!``$`````
+M`````````%@;``"*`4@``0``````````````6!L``(L!0P`!````````````
+M``!8&P``C`%*``$``````````````%@;``"-`4L``0``````````````6!L`
+M`(\!3``!``````````````!8&P``IP^```$``````````````%@;``"H#X$`
+M`0``````````````6!L``*D/@@`!``````````````!8&P``J@^#``$`````
+M`````````%@;``"K#X0``0``````````````6!L``*P/A0`!````````````
+M``!8&P``K0^&``$``````````````%@;``"N#X<``0``````````````6!L`
+M`*\/B``!``````````````!8&P``L`^)``$``````````````%@;``"Q#XH`
+M`0``````````````6!L``+(/BP`!``````````````!8&P``LP^,``$`````
+M`````````%@;``"T#XT``0``````````````6!L``+4/C@`!````````````
+M``!8&P``M@^/``$``````````````%@;``"W#Y```0``````````````6!L`
+M`+@/D0`!``````````````!8&P``D`%"``$``````````0```%@;``".`0,`
+M`0`````````!````6!L``)@!10`!`````0````$```!8&P``F@%%``$`````
+M`````````%@;``";`44``0``````````````6!L``)P!7@`!````````````
+M``!8&P``G@$#``$``````````0```%@;``"L`3<``0`````````!````6!L`
+M`*8!`P`!``````````$```!8&P``M@$W``$``````````0```%@;``"X`3<`
+M`0`````````!````6!L``+H!-P`!``````````$```!8&P``O@$A``$````!
+M`````0```%@;```G`P,``0`````````!````6!L``,H!70`!````````````
+M``!8&P``U@$W``$``````````0```%@;``#D`1```0````$````!````6!L`
+M`.P!,``!`````0````$```!8&P``^`$#``$``````````0```%@;```0`C<`
+M`0`````````!````6!L``"H"(@`!``````````$```!8&P``0@(W``$`````
+M`````0```%@;`````EL``0`````````!````6!L``$H"`P`!``````````$`
+M``!8&P``3P(0``$````!`````0```%@;``!<`E(``0`````````!````6!L`
+M`&`".P`!`````0````$```!8&P``:`(W``$``````````0```%@;``!L`C<`
+M`0`````````!````6!L``'8"$``!`````0````$```!8&P``>@(#``$`````
+M`````0```%@;``""`@,``0`````````!````6!L``(,"`P`!``````````$`
+M``!8&P``J@(A``$``````````0```%@;``"^`EL``0````$````!````6!L`
+M`+\"-P`!``````````$```!8&P``P0(W``$``````````0```%@;``#&`CL`
+M`0`````````!````6!L``-0"-P`!``````````$```!8&P``\`(W``$`````
+M`````0```%@;``#T`C<``0`````````!````6!L``/@"`P`!``````````$`
+M``!8&P``G@!0``$````!`````0```%@;``#\`@,``0`````````!````6!L`
+M``P#,``!``````````$```!8&P``%`,V``$``````````0```%@;```8`S8`
+M`0`````````!````6!L``"0#`P`!``````````$```!8&P``$`,#``$`````
+M`````0```%@;```Z`S<``0`````````!````6!L``$@#$``!`````0````$`
+M``#!%@``2@,2``$````!`````0```%@;``!:`Q$``0`````````!````6!L`
+M`%P#.@`!`````0````$```!8&P``7@-6``$``````````0```%@;``#``@,`
+M`0`````````!````6!L``'<#`P`!``````````$```!8&P``S`(#``$`````
+M`````0```%@;```S$ST3%P`*!0``````````$``````````0````1Q-1$Q<`
+M"@4``````````!``````````$````#@3=!,7`!04```````````0````````
+M``<```!.$WL3&P8%!0```````````0``````````````41-Y$QX&"@4`````
+M``````$``````````````%83=!,A!A0%```````````!``````````````"K
+M$[`3%P`*!0``````````$``````````,````L!/8$Q<`%!0``````````!``
+M`````````@```+\3OQ,7``H%```````````0``````````P`````%'@4!084
+M%```````````````````````````,A1N%!<`%!0``````````!@`````````
+M`0```#(4;A04`!04```````````8``````````$````\%'@4#P`4%```````
+M````!0``````````````/!1X%!$&%!0```````````$``````````0```#P4
+M>!02`!04```````````%```````````````\%'@4%``4%```````````!0``
+M````````````/!1X%!<`%!0```````````4``````````````#P4>!07!A04
+M```````````!```````````````\%,@4%`84%`(`````````!```````````
+M````>!2@%!<`%!0!``````````4``````````````(P4H!07`!04`P``````
+M```%``````````````",%,@4$@`4%`,`````````!0``````````````C!3(
+M%!0`%!0'``````````6``````````````(P4R!04!A04`P`````````!````
+M``````(```",%,@4%P84%`,``````````0`````````"````C!3(%!<&%!0#
+M``````````$``````````````(P4R!0>`!04````````````````````````
+M``",%$06!084%`,`````````````````````````H!3(%!$&%!0#````````
+M``$``````````````'P5]!4>!A04`@`````````$``````````````!\%406
+M%`84%`,``````````0`````````$````?!5$%AL`%!0#``````````4`````
+M`````````'P51!8>`!04`P`````````%``````````````!\%406%P`4%`<`
+M`````````8``````````````<1:M%A<`%!0`````````````````````````
+M`'$6K18>!A04``````````````````````````!Q%JT6'@84%`(`````````
+M!```````````````<1;!%@4&%!0``````````````````````````'$6P181
+M`!04``````````````````````````!Q%L$6%``4%```````````````````
+M````````<1;!%AX`%!0``````````````````````````'$6P18>!A04````
+M``````````````````,```!Q%L$6'@84%```````````````````````````
+M.!-T$QX`%!0````````````$`````````````+`3V!,>`!04````````````
+M!``````````````R%&X4'@`4%`,```````````0`````````````/!1X%!X`
+M%!0#```````````$`````````````(P4R!0>`!04`P``````````!```````
+M``````!Q%L$6'@`4%`````````````0`````````````?!5$%AX`%!0#````
+M```````$`````````````(P4R!0>`!04```````````````````````````\
+M%'@4'@`4%```````````````````````````P1;!%AX`%!0````````````$
+M``````````````H46A0%!B@H``````````````````````````""%-(4!08H
+M*`$`````````````````````````^A1R%04&*"@`````````````````````
+M`````)H5$A8%!B@H`0`````````````````````````>%$84!08H*```````
+M````````````````````;A2^%`4&*"@!`````````````````````````.84
+M7A4%!B@H``````````````````````````"&%286!08H*`$`````````````
+M````````````4!1X%!$&*"@``````````````````````````%`4>!07!B@H
+M``````````````````````````!:%%H4$08H*```````````````````````
+M````6A1:%!<`*"@``````````````````````````*`4H!07!B@H`0``````
+M```"``````````````"@%*`4%`8H*`$``````````@``````````````@A2"
+M%!$`*"@!``````````(``````````````*H4JA04`"@H`0`````````"````
+M``````````""%*H4%``H*`$``````````@``````````````@A2J%!<&*"@!
+M``````````(``````````````*05'!84!B@H`0`````````"````````````
+M``"`%J@6%``H*```````````````````````````@!:H%AX&*"@`````````
+M`````````````````(46K18>!B@H``````````````````````````!:%((4
+M#P`H*`,```````````0`````````````JA2J%!(`*"@#```````````$````
+M`````````*05'!84`"@H`P``````````!`````````````"`%J@6%``H*```
+M``````````0`````````````"`E$"04&%`4`````````````````````````
+M``@)1`D4`!0%``````````````````````````!L":@)!084!0``````````
+M````````````````;`FH"10`%`4``````````"```````````````&P)J`D>
+M`!0%``````````````````````````!L"9X)&P84!0``````````````````
+M````````;`F>"10`%`4``````````"```````````````(`)B@D4`!0%````
+M``````````````````````"9":@)%``4!0``````````````````````````
+MHPFH"10`%`4``````````"`@`````````````+0)M`D%!A0%````````````
+M``````````````"T";0)%``4!0``````````("@`````````````T`FL"@4&
+M%`4```````````````````````````@)1`D4`!0%````````````````````
+M``````!L"6P)%``4!0``````````````````````````<0F`"10`%`4`````
+M`````````````````````(4)B@D4`!0%``````````````````````````"/
+M"9D)%``4!0``````````````````````````G@F>"10`%`4`````````````
+M`````````````*,)HPD4`!0%````````````!```````@`````"C":,)%``4
+M!0```````````````````(``````J`FH"10`%`4````````````$``````"`
+M`````*@)J`D4`!0%````````````````````@`````"T";0)%``4!0``````
+M``````0``````(``````M`FT"10`%`4```````````````````"```````@)
+M1`D%!A0%```````````````````````````("40)%``4!0``````````````
+M````````````;`FH"04&%`4``````````````````````````&P)J`D4`!0%
+M``````````!```````````````!L":@)'@`4!0``````````````````````
+M````;`F>"1L&%`4``````````````````````````&P)G@D4`!0%````````
+M``!```````````````"`"8H)%``4!0``````````````````````````F0FH
+M"10`%`4``````````````````````````-`)K`H%!A0%````````````````
+M``````````"C":@)%``4!0``````````("``````````````"`E$"10`%`4`
+M`````````````````````````&P);`D4`!0%````````````````````````
+M``!Q"8`)%``4!0``````````````````````````A0F*"10`%`4`````````
+M`````````````````(\)F0D4`!0%``````````````````````````">"9X)
+M%``4!0``````````````````````````HPFC"10`%`4````````````$````
+M``"``````*,)HPD4`!0%````````````````````@`````"H":@)%``4!0``
+M``````````0``````(``````J`FH"10`%`4```````````````````"`````
+M``@)1`D%!B@H``````````````````````````"%"84)!08H*```````````
+M````````````````A0F%"10&*"@``````````````````````````(4)A0D2
+M!B@H````````````!`````````````#0":P*!08H*```````````````````
+M````````_P$0``$```````````````````````````(`""``````````````
+M`/\`````````````````````$20`````````````````!10`````````````
+M``````4"```````````````````3````````````````````4`$0````````
+M```````````````````````````!````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````4`(0````````````````````````````
+M``````0`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````4`,0````````````````````````````````$`@`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````4`00````````
+M`````````````````````(```(``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````4`40````````````````````````````
+M`````$``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````4`8P``(``````````P```````````````(!``(``````````````
+M```("0``````````````````````````````````````````````````````
+M````````````````````````````````````````````````4`@P````````
+M```````````````#````````!``!````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````4`DP``(`````````!``````````#````
+M```$(!``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````,`$P``(`````````!``````````#``````!`@```"```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````,`(P``(`````
+M````!``````````#`````$``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````,`,P``(`````````!``````````#````
+M``!`````"```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````,`0P``(`````````!``````````#`````$`@````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````,`4P``(`````
+M````!``````````#`````!``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````,`8P``(`````````!``````````#````
+M```1``$`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````$`$0`````````````````````````````"```0`"````````````
+M```$$@``````````````````$2``````````````````````````````````
+M````````````````````````````````````````````````(`$0````````
+M```````````````````````"`@`$````````````````````````````````
+M````$B``````````````````````````````````````````````````````
+M````````````````````````````8`$0``$``````````P``````````````
+M`""`0``"``````````````#$$```````````````````(00`````````````
+M````````````````````````````````````````````````````````````
+M````````90$0``$``````````P``````````````.```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`%`````````
+M````"``````````"``````0`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````0`)`````````````$``````````"````
+MQP4`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````0`-``````````````(`````````"`````(``````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`1```0`````
+M`````(`````````"`````(!`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````0`5```0``````````(`````````"````
+M`(!```(`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````0`9`````````````"``````````"`````(@`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`=```0`````
+M````"(`````````"`````(1`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````0`A```0`````````"(`````````"````
+M`(1```(`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````0`E``````````````(`````````"````QX$`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`M```0`````
+M`````(`````````"````QX%`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````4`W_````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"@````````````````````H`````````````````````````````````
+M````````,`K_````````````@``````````#````````````````````````
+M``````````````````````````````````````````````$`````````````
+M```````!```````````````````$````````````````````,`LP````````
+M``````$````````#````````````````````````````````````````````
+M````````````````````````@````````````````````(``````````````
+M```````$````````````````````,`PP``````````````(````````#````
+M````````````````````````````````````````````````````````````
+M````$````````````````````!`````````````````````$````````````
+M````````$`H0````````````````````````````````````````````````
+M````````````````````````````````````````````(```````````````
+M`````"`````````````````````$````````````````````0`I`````````
+M````8'@````````"````````````````````````````````````````````
+M````````````````````````0`H``````````````````$`$````````````
+M```````$````````````````````4`I`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"`````````````````````@````````````````````$````````````
+M````````F0$P````````````````````````````````````````````````
+M````````````````````````````````````````````"```````````````
+M``````@````````````````````$````````````````````8`#_``,`````
+M``````0````````(``````````#@`P``````````````P`(`````````````
+M`````````````````````````,"O``````````````````#P"P``````````
+M```````(````````````````````9@#_``,```````````0````````(````
+M``````#@`P``````````````P`(`````````````````````````````````
+M`````,`'``````````````````#P`0`````````````````(````````````
+M````````9P#_``,```````````0````````(``````````#@`P``````````
+M````P`(``````````````````````````````````````,`O````````````
+M``````#P"P`````````````````(````````````````````:`#_``,`````
+M``````0````````(``````````#@`P``````````````P`(`````````````
+M`````````````````````````,!7``````````````````#P%0``````````
+M```````(````````````````````80#_``,```````````0````````0````
+M``````#@`P``````````````````````````````````````````````````
+M`````,"O``````````````````#P"P`````````````````(````````````
+M````````8@#_``,```````````0````````0``````````#@`P``````````
+M````P`(``````````````````````````````````````,"O````````````
+M``````#P"P`````````````````(````````````````````8P#_``,`````
+M``````0````````(``````````#@`0``````````````P`(`````````````
+M`````````````````````````,`O``````````````````#P"P``````````
+M```````(````````````````````9`#_``,```````````0````````0````
+M``````@`'```````````````P`(`````````````````````````````````
+M`````,`'``````````````````#P`0`````````````````(````````````
+M````````90#_``,```````````0````````0``````````"$"```````````
+M`````````````````````````````````````````````,!7````````````
+M``````#P%0`````````````````(````````````````````:0#_``,`````
+M``````0````````0``````````#``P``````````````P`(`````````````
+M`````````````````````````,`'``````````````````#P`0``````````
+M```````(````````````````````:@#_``,```````````0````````0````
+M``````#``P``````````````````````````````````````````````````
+M`````,`O``````````````````#P"P`````````````````(````````````
+M````````F`'_````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`#P`/,```"(
+M@?``\P```$$`@`"#````B8&``(,```!(`/(`]0```(J!\@#U````0P#V`/<`
+M``"+@?8`]P```$H`\0#T````C('Q`/0```!+`($`A````(V!@0"$````3`""
+M`(4```"/@8(`A0```(@!\`#S````B0&``(,```"*`?(`]0```(L!]@#W````
+MC`'Q`/0```"-`8$`A````(\!@@"%````"```````````````````````````
+M`````````````````````0)P%PL`C````````0(H(P\`$@```````0+@+@H`
+MF`(``````0)01@X`)`(``````0+`70D`L`0``````0*@C`T`2`0``````0*`
+MNP@`8`0``````0+PT@P`;`0`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````"```````
+M`````````````````````````````````````````0-P%PL`C````````0,H
+M(P\`$@```````0/@+@H`F`(``````0-01@X`)`(``````0/`70D`L`0`````
+M`0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`;`0`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````"```````````````````````````````````````````````
+M`0)P%PL`C````````0(H(P\`$@```````0+@+@H`F`(``````0)01@X`)`(`
+M`````0+`70D`L`0``````0*@C`T`2`0``````0*`NP@`8`0``````0+PT@P`
+M;`0`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"```````````````````````````
+M`````````````````````0-P%PL`C````````0,H(P\`$@```````0/@+@H`
+MF`(``````0-01@X`)`(``````0/`70D`L`0``````0.@C`T`2`0``````0.`
+MNP@`8`0``````0/PT@P`;`0`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````!```````
+M`````````````````````````````````````````0#H`PL`@@```````0#0
+M!PH$A`$``````0!\%0D$BP$``````0#X*@@$E@$`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````!*(`````````````"*(``$9&/E!&1CY0#*(``&Q!@&1L08!D
+M$*(```.@F0$#H)D!%*(``!#63`00UDP$&*(``$``@!-``(`3'*(``&``X!M@
+M`.`;(*(```J`4PP*@%,,)*(``#O?%``[WQ0`**(``+4!``"U`0``+*(``"``
+M```@````G)@`````````````G)@`````````````G)@`````````````G)@`
+M````````````G)@`````````````G)@`````````````G)@`````````````
+MG)@`````````````G)@`````````````G)@`````````````G)@`````````
+M````G)@`````.````#@`G)@`````````````G)@`````````````G)@`````
+M````````G)@``/D`!`#Y``0`U)@````````$````G)@`````````````G)@`
+M````````````G)@`````````````G)@`````````````G)@`````````````
+MG)@``````!`````0G)@```````0````$G)@`````````````G)@`````````
+M````G)@`````````````G)@````````````*G)@``(``.`"``#@"G)@```8`
+M`@`&````G)@``)(```"2````G)@``*````"@````G)@```<`!``'``0`U)@`
+M`!H````:````G)@``$@```!(````G)@``!`````0````G)@```@````(````
+MG)@```\````/````G)@``/(```!B````G)@``$^0``!,D```G)@``%H2``":
+M$@``S)@```X````/````"```````````````````````````````````````
+M`````````0)P%PL`C````````0(H(P\`$@```````0+@+@H`F`(``````0)0
+M1@X`)`(``````0+`70D`L`0``````0*@C`T`2`0``````0*`NP@`8`0`````
+M`0+PT@P`;`0`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````"```````````````````
+M`````````````````````````````0*X"PL`A@```````0*4$0\`"0``````
+M`0)P%PH`C`(``````0(H(PX`$@(``````0+@+@D`F`0``````0)01@T`)`0`
+M`````0+`70@`,`0``````0)X:0P`-@0`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M"````````````````````````````````````````````````0+<!0L`@P``
+M`````0+*"`\`!````````0*X"PH`A@(``````0*4$0X`"0(``````0)P%PD`
+MC`0``````0(H(PT`$@0``````0+@+@@`&`0``````0*\-`P`&P0`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````!P``````````````````````````````````````
+M`````````0-P%PL`C````````0/@+@H`F`(``````0-01@X`)`(``````0/`
+M70D`L`,``````0.@C`T`2`,``````0.`NP@`8`,``````0/PT@P`;`,`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````"```````````````````
+M`````````````````````````````0-P%PL`C````````0,H(P\`$@``````
+M`0/@+@H`F`(``````0-01@X`)`(``````0/`70D`L`0``````0.@C`T`2`0`
+M`````0.`NP@`8`0``````0/PT@P`;`0`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M!````````````````````````````````````````````````0#H`QL`@@``
+M`````0#0!QH$A`$``````0!\%1D$BP$``````0#X*A@$E@$`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````#```````````````````````````````````````
+M`````````0#H`QL`@@```````0#0!QH$A`$``````0!\%1D$BP(``````0#X
+M*A@$E@,```````)P%PL`#`0```````(H(P\`$@0``````0+@+@H`&`8`````
+M`0)01@X`)`8``````0+`70D`,`@``````0*@C`T`2`@``````0*`NP@`8`@`
+M`````0+PT@P`;`@`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````#0``````````````````
+M`````````````````````````````03Z``,`@0!D`F0"`03T`0<`@0#)`<D!
+M`03H`P(`@@'D`.0``030!P8`A`*@`*```02X"P$`A@.,`(P``0)P%PL`C`0\
+M`#P``0(H(P\`$@0\`#P``0+@+@H`F`8P`#```0)01@X`)`8P`#```0+`70D`
+M,`@L`"P``0*@C`T`2`@L`"P``0*`NP@`8`@L`"P``0+PT@P`;`@L`"P`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.
+M52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(`
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.
+M52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(`
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.
+M52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(`
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.
+M52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(`
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.
+M52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(`
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.
+M52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(`
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.
+M52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(`
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.
+M52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(`
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.
+M52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(`
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.
+M52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(`
+M`$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``"YS>6UT86(`
+M+G-T<G1A8@`N<VAS=')T86(`+G1E>'0`+G)E;"YT97AT+F%T:%]H86Q?9&5V
+M;F%M90`N<F5L+G1E>'0N871H7VAA;%]P<F]B90`N<F5L+G1E>'0N871H7VAA
+M;%]A='1A8V@`+G1E>'0N871H7VAA;%]S971V96YD;W(`+G)E;"YT97AT+F%T
+M:%]H86Q?=V%I=``N=&5X="YA=&A?:&%L7W)E=F5R<V5":71S`"YR96PN=&5X
+M="YA=&A?:&%L7V-O;7!U=&5T>'1I;64`+G1E>'0N871H7VAA;%]C:&%N,G=M
+M;V1E`"YR96PN=&5X="YA=&A?:&%L7VUH>C)I965E`"YR96PN=&5X="YA=&A?
+M:&%L7VUA8U]C;&MS`"YR96PN=&5X="YA=&A?:&%L7VUA8U]U<V5C`"YR96PN
+M=&5X="YA=&A?:&%L7W-E='5P<F%T971A8FQE`"YR96PN=&5X="YA=&A?:&%L
+M7V=E=&-A<&%B:6QI='D`+G1E>'0N871H7VAA;%]S971C87!A8FEL:71Y`"YR
+M96PN=&5X="YA=&A?:&%L7V=E=')E9V1U;7``+G)E;"YT97AT+F%T:%]H86Q?
+M9V5T9&EA9W-T871E`"YT97AT+F%T:%]H86Q?<V5T5'A14')O<',`+G1E>'0N
+M871H7VAA;%]G9714>%%0<F]P<P`N<F5L+G1E>'0N871H7VAA;%]G971#:&%N
+M3F]I<V4`+G)E;"YT97AT+F%T:%]H86Q?<')O8V5S<U]N;VES969L;V]R`"YR
+M96PN=&5X="YG97108V1A8TEN=&5R8V5P='-&<F]M4&-D86--:6Y-87@`+G1E
+M>'0N9F)I;C)F<F5Q`"YT97AT+F9B:6XR9G)E<5\R<#0`+G)E;"YT97AT+G)E
+M861%97!R;VU&<F5Q4&EE<DEN9F\`+G)E;"YT97AT+F5E<')O;4%L;&]C17AP
+M;E!O=V5R-3$Q,@`N=&5X="YE97!R;VU%>'!A;F10;W=E<C4Q,3(`+G)E;"YT
+M97AT+G)E861%97!R;VU287=0;W=E<D-A;$EN9F\U,3$R`"YR96PN=&5X="YF
+M<F5E165P<F]M4F%W4&]W97)#86Q);F9O-3$Q,@`N=&5X="YA<C(T,3-3971U
+M<$5%4%)/341A=&%S970`+G)E;"YT97AT+F%R,C0Q,U)E861#86Q$871A<V5T
+M`"YT97AT+F%R,C0Q,U-E='5P4F%W1&%T87-E=``N=&5X="YA<C(T,3-%97!R
+M;VU4;U)A=T1A=&%S970`+G)E;"YT97AT+G)E861%97!R;VU287=0;W=E<D-A
+M;$EN9F\R-#$S`"YR96PN=&5X="YR96%D165P<F]M4F%W4&]W97)#86Q);F9O
+M`"YR96PN=&5X="YR96%D165P<F]M5&%R9V5T4&]W97)#86Q);F9O`"YR96PN
+M=&5X="YR96%D165P<F]M0U1,26YF;P`N<F5L+G1E>'0N<F5A9$AE861E<DEN
+M9F\`+G)E;"YT97AT+F%T:%]H86Q?<F5A9$5E<')O;4EN=&]$871A<V5T`"YR
+M96PN=&5X="YA=&A?:&%L7V5E<')O;41E=&%C:``N=&5X="YC:&%N<V]R=``N
+M=&5X="YG971%97!R;VU21``N=&5X="YI<T-H86Y":71-87-K6F5R;P`N<F5L
+M+G1E>'0N:7-%97!R;VU686QI9``N<F5L+G1E>'0N:7-#;W5N=')Y0V]D959A
+M;&ED`"YR96PN=&5X="YA=&A?:&%L7V=E='=M;V1E<VYR96<`+G)E;"YT97AT
+M+F%T:%]H86Q?9V5T=VER96QE<W-M;V1E<P`N<F5L+G1E>'0N871H7VAA;%]I
+M<W!U8FQI8W-A9F5T>7-K=0`N<F5L+G1E>'0N9FEN9$-O=6YT<GD`+G)E;"YT
+M97AT+F=E=$1E9F%U;'1#;W5N=')Y`"YR96PN=&5X="YI<U9A;&ED4F5G1&UN
+M`"YR96PN=&5X="YI<U9A;&ED4F5G1&UN4&%I<@`N<F5L+G1E>'0N9V5T5VU2
+M1``N<F5L+G1E>'0N25-?0DE47U-%5``N=&5X="YA=&A?861D7W)E9V-L87-S
+M:60`+G)E;"YT97AT+F%T:%]H86Q?:6YI=%]C:&%N;F5L<P`N=&5X="YA=&A?
+M:&%L7V-H96-K8VAA;FYE;``N<F5L+G1E>'0N871H7VAA;%]G971A;G1E;FYA
+M<F5D=6-T:6]N`"YR96PN=&5X="YA=&A?:&%L7V=E=&-T;``N<F5L+G1E>'0N
+M871H7VAA;%]G971N9F-H96-K<F5Q=6ER960`+G)E;"YT97AT+F%T:%]H86Q?
+M<V]R=``N<F5L+G1E>'0N871H7VAA;%]J87!A;E]C:&5C:V5E<')O;0`N<F5L
+M+G1E>'0N871H7VAA;%]J87!A;D%M;V1E7W9A;&ED`"YR96PN=&5X="YA=&A?
+M:&%L7VUA<&IA<&%N<VMU`"YR96PN=&5X="YA=&A?:&%L7VUA<&IA<&%N8V-O
+M9&4`+G)E;"YT97AT+F%T:%]H86Q?=7!D871E7W)E9V1O;6%I;@`N<F5L+G1E
+M>'0N87(U,C$P071T86-H`"YR96PN=&5X="YA<C4R,3!$971A8V@`+G1E>'0N
+M87(U,C$P1V5T0VAA;FYE;$5D9V5S`"YT97AT+F%R-3(Q,$=E=$-H:7!0;W=E
+M<DQI;6ET<P`N=&5X="YA<C4R,3!&:6QL0V%P86)I;&ET>4EN9F\`+G)E;"YT
+M97AT+F%R-3(Q,%-E=$)E86-O;E1I;65R<P`N<F5L+G1E>'0N87(U,C$P0F5A
+M8V]N26YI=``N<F5L+G1E>'0N87(U,C$P4F5S9713=&%"96%C;VY4:6UE<G,`
+M+G)E;"YT97AT+F%R-3(Q,%-E=%-T84)E86-O;E1I;65R<P`N<F5L+G1E>'0N
+M87(U,C$P27-);G1E<G)U<'1096YD:6YG`"YR96PN=&5X="YA<C4R,3!'9710
+M96YD:6YG26YT97)R=7!T<P`N=&5X="YA<C4R,3!'971);G1E<G)U<'1S`"YR
+M96PN=&5X="YA<C4R,3!3971);G1E<G)U<'1S`"YT97AT+F%R-3(Q,$=E=$ME
+M>4-A8VAE4VEZ90`N<F5L+G1E>'0N87(U,C$P27-+97E#86-H945N=')Y5F%L
+M:60`+G)E;"YT97AT+F%R-3(Q,%)E<V5T2V5Y0V%C:&5%;G1R>0`N<F5L+G1E
+M>'0N87(U,C$P4V5T2V5Y0V%C:&5%;G1R>4UA8P`N<F5L+G1E>'0N87(U,C$P
+M4V5T2V5Y0V%C:&5%;G1R>0`N<F5L+G1E>'0N87(U,C$P1V5T36%C061D<F5S
+M<P`N<F5L+G1E>'0N87(U,C$P4V5T36%C061D<F5S<P`N<F5L+G1E>'0N87(U
+M,C$P1V5T0G-S261-87-K`"YT97AT+F%R-3(Q,%-E=$)S<TED36%S:P`N<F5L
+M+G1E>'0N87(U,C$P165P<F]M4F5A9``N=&5X="YA<C4R,3!3971296=U;&%T
+M;W)Y1&]M86EN`"YT97AT+F%R-3(Q,$=E=%=I<F5L97-S36]D97,`+G)E;"YT
+M97AT+F%R-3(Q,$5N86)L95)F2VEL;``N<F5L+G1E>'0N87(U,C$P1W!I;T-F
+M9T]U='!U=``N<F5L+G1E>'0N87(U,C$P1W!I;T-F9TEN<'5T`"YR96PN=&5X
+M="YA<C4R,3!'<&EO4V5T`"YR96PN=&5X="YA<C4R,3!'<&EO1V5T`"YR96PN
+M=&5X="YA<C4R,3!'<&EO,%-E=$EN='(`+G)E;"YT97AT+F%R-3(Q,%-E=$QE
+M9%-T871E`"YR96PN=&5X="YA<C4R,3!'971$969!;G1E;FYA`"YR96PN=&5X
+M="YA<C4R,3!3971$969!;G1E;FYA`"YT97AT+F%R-3(Q,$=E=$%N=&5N;F%3
+M=VET8V@`+G1E>'0N87(U,C$P4V5T06YT96YN85-W:71C:``N<F5L+G1E>'0N
+M87(U,C$P5W)I=&5!<W-O8VED`"YR96PN=&5X="YA<C4R,3!'9714<V8V-``N
+M<F5L+G1E>'0N87(U,C$P1V5T5'-F,S(`+G)E;"YT97AT+F%R-3(Q,%)E<V5T
+M5'-F`"YR96PN=&5X="YA<C4R,3!'971286YD;VU3965D`"YR96PN=&5X="YA
+M<C4R,3!$971E8W1#87)D4')E<V5N=``N<F5L+G1E>'0N87(U,C$P57!D871E
+M36EB0V]U;G1E<G,`+G)E;"YT97AT+F%R-3(Q,%-E=%-L;W14:6UE`"YR96PN
+M=&5X="YA<C4R,3!'9713;&]T5&EM90`N<F5L+G1E>'0N87(U,C$P4V5T06-K
+M5&EM96]U=``N<F5L+G1E>'0N87(U,C$P1V5T06-K5&EM96]U=``N=&5X="YA
+M<C4R,3!'971!8VM#5%-2871E`"YR96PN=&5X="YA<C4R,3!3971!8VM#5%-2
+M871E`"YR96PN=&5X="YA<C4R,3!3971#5%-4:6UE;W5T`"YR96PN=&5X="YA
+M<C4R,3!'971#5%-4:6UE;W5T`"YT97AT+F%R-3(Q,%-E=$1E8V]M<$UA<VL`
+M+G1E>'0N87(U,C$P4V5T0V]V97)A9V5#;&%S<P`N=&5X="YA<C4R,3!!;FE#
+M;VYT<F]L`"YT97AT+F%R-3(Q,$%N:5!O;&P`+G1E>'0N87(U,C$P36EB179E
+M;G0`+G)E;"YT97AT+F%R-3(Q,$=E=$-A<&%B:6QI='D`+G)E;"YT97AT+F%R
+M-3(Q,%-E=$-A<&%B:6QI='D`+G)E;"YT97AT+F%R-3(Q,$=E=$1I86=3=&%T
+M90`N<F5L+G1E>'0N87(U,C$P4V5T4&]W97)-;V1E075T;P`N<F5L+G1E>'0N
+M87(U,C$P4V5T4&]W97)-;V1E07=A:V4`+G)E;"YT97AT+F%R-3(Q,%-E=%!O
+M=V5R36]D95-L965P`"YR96PN=&5X="YA<C4R,3!39710;W=E<DUO9&4`+G)E
+M;"YT97AT+F%R-3(Q,$=E=%!O=V5R36]D90`N<F5L+G1E>'0N87(U,C$P1V5T
+M4F%T951A8FQE`"YR96PN=&5X="YA<C4R,3!'9712>$10`"YR96PN=&5X="YA
+M<C4R,3!39712>$10`"YR96PN=&5X="YA<C4R,3!%;F%B;&5296-E:79E`"YR
+M96PN=&5X="YA<C4R,3!3=&]P1&UA4F5C96EV90`N<F5L+G1E>'0N87(U,C$P
+M4W1A<G108W5296-E:79E`"YR96PN=&5X="YA<C4R,3!3=&]P4&-U4F5C96EV
+M90`N<F5L+G1E>'0N87(U,C$P4V5T375L=&EC87-T1FEL=&5R`"YR96PN=&5X
+M="YA<C4R,3!#;')-=6QT:6-A<W1&:6QT97));F1E>``N<F5L+G1E>'0N87(U
+M,C$P4V5T375L=&EC87-T1FEL=&5R26YD97@`+G)E;"YT97AT+F%R-3(Q,$=E
+M=%)X1FEL=&5R`"YR96PN=&5X="YA<C4R,3!39712>$9I;'1E<@`N=&5X="YA
+M<C4R,3!3971U<%)X1&5S8P`N<F5L+G1E>'0N87(U,C$P4')O8U)X1&5S8P`N
+M<F5L+G1E>'0N87(U,C$P4F5S970`+G)E;"YT97AT+F%R-3(Q,%-E=$]P97)A
+M=&EN9TUO9&4`+G)E;"YT97AT+F%R-3(Q,%-E=%!#54-O;F9I9P`N<F5L+G1E
+M>'0N87(U,C$P4&AY1&ES86)L90`N<F5L+G1E>'0N87(U,C$P1&ES86)L90`N
+M<F5L+G1E>'0N87(U,C$P0VAI<%)E<V5T`"YR96PN=&5X="YA<C4R,3!097)#
+M86QI8G)A=&EO;@`N<F5L+G1E>'0N87(U,C$P4V5T4F5S971296<`+G)E;"YT
+M97AT+F=E=%!C9&%C`"YR96PN=&5X="YG971'86EN1@`N=&5X="YA<C4R,3!3
+M9714>%!O=V5R3&EM:70`+G)E;"YT97AT+G-E='5P4&]W97)3971T:6YG<P`N
+M<F5L+G1E>'0N87(U,C$P4V5T5')A;G-M:710;W=E<@`N<F5L+G1E>'0N87(U
+M,C$P4V5T0VAA;FYE;``N<F5L+G1E>'0N87(U,C$P1V5T3F]I<V5&;&]O<@`N
+M<F5L+G1E>'0N87(U,C$P0V%L3F]I<V5&;&]O<@`N=&5X="YA<C4R,3!'971.
+M9D%D:G5S=``N=&5X="YA<C4R,3!'97129F=A:6X`+G)E;"YT97AT+F%R-3(Q
+M,%-E=%1X475E=650<F]P<P`N<F5L+G1E>'0N87(U,C$P1V5T5'A1=65U95!R
+M;W!S`"YR96PN=&5X="YA<C4R,3!3971U<%1X475E=64`+G1E>'0N87(U,C$P
+M4F5L96%S951X475E=64`+G)E;"YT97AT+F%R-3(Q,%)E<V5T5'A1=65U90`N
+M<F5L+G1E>'0N87(U,C$P1V5T5'A$4``N<F5L+G1E>'0N87(U,C$P4V5T5'A$
+M4``N<F5L+G1E>'0N87(U,C$P57!D871E5'A4<FEG3&5V96P`+G)E;"YT97AT
+M+F%R-3(Q,%-T87)T5'A$;6$`+G)E;"YT97AT+F%R-3(Q,$YU;51X4&5N9&EN
+M9P`N<F5L+G1E>'0N87(U,C$P4W1O<%1X1&UA`"YT97AT+F%R-3(Q,%-E='5P
+M5'A$97-C`"YT97AT+F%R-3(Q,%-E='5P6%1X1&5S8P`N=&5X="YA<C4R,3!)
+M;G1R4F5Q5'A$97-C`"YT97AT+F%R-3(Q,$9I;&Q4>$1E<V,`+G1E>'0N87(U
+M,C$P4')O8U1X1&5S8P`N=&5X="YA<C4R,3!'9714>$EN=')1=65U90`N=&5X
+M="YA<C4R,3!2861A<E=A:70`+G)E;"YT97AT+F%R-3(Q,4=E=%)A9&EO4F5V
+M`"YR96PN=&5X="YA<C4R,3%!='1A8V@`+G)E;"YT97AT+F%R-3(Q,41E=&%C
+M:``N<F5L+G1E>'0N87(U,C$Q0VAI<%1E<W0`+G1E>'0N87(U,C$Q1V5T0VAA
+M;FYE;$5D9V5S`"YT97AT+F%R-3(Q,4=E=$-H:7!0;W=E<DQI;6ET<P`N<F5L
+M+G1E>'0N87(U,C$Q1FEL;$-A<&%B:6QI='E);F9O`"YR96PN=&5X="YA<C4R
+M,3%3971"96%C;VY4:6UE<G,`+G)E;"YT97AT+F%R-3(Q,4)E86-O;DEN:70`
+M+G)E;"YT97AT+F%R-3(Q,5)E<V5T4W1A0F5A8V]N5&EM97)S`"YR96PN=&5X
+M="YA<C4R,3%39713=&%"96%C;VY4:6UE<G,`+G)E;"YT97AT+F%R-3(Q,4ES
+M26YT97)R=7!T4&5N9&EN9P`N<F5L+G1E>'0N87(U,C$Q1V5T4&5N9&EN9TEN
+M=&5R<G5P=',`+G1E>'0N87(U,C$Q1V5T26YT97)R=7!T<P`N<F5L+G1E>'0N
+M87(U,C$Q4V5T26YT97)R=7!T<P`N=&5X="YA<C4R,3%'971+97E#86-H95-I
+M>F4`+G)E;"YT97AT+F%R-3(Q,4ES2V5Y0V%C:&5%;G1R>59A;&ED`"YR96PN
+M=&5X="YA<C4R,3%297-E=$ME>4-A8VAE16YT<GD`+G)E;"YT97AT+F%R-3(Q
+M,5-E=$ME>4-A8VAE16YT<GE-86,`+G)E;"YT97AT+F%R-3(Q,5-E=$ME>4-A
+M8VAE16YT<GD`+G)E;"YT97AT+F%R-3(Q,4=E=$UA8T%D9')E<W,`+G)E;"YT
+M97AT+F%R-3(Q,5-E=$UA8T%D9')E<W,`+G)E;"YT97AT+F%R-3(Q,4=E=$)S
+M<TED36%S:P`N=&5X="YA<C4R,3%3971"<W-)9$UA<VL`+G)E;"YT97AT+F%R
+M-3(Q,45E<')O;5)E860`+G1E>'0N87(U,C$Q4V5T4F5G=6QA=&]R>41O;6%I
+M;@`N=&5X="YA<C4R,3%'9717:7)E;&5S<TUO9&5S`"YR96PN=&5X="YA<C4R
+M,3%%;F%B;&529DMI;&P`+G)E;"YT97AT+F%R-3(Q,4=P:6]#9F=/=71P=70`
+M+G)E;"YT97AT+F%R-3(Q,4=P:6]#9F=);G!U=``N<F5L+G1E>'0N87(U,C$Q
+M1W!I;U-E=``N<F5L+G1E>'0N87(U,C$Q1W!I;T=E=``N<F5L+G1E>'0N87(U
+M,C$Q1W!I;U-E=$EN='(`+G)E;"YT97AT+F%R-3(Q,5-E=$QE9%-T871E`"YR
+M96PN=&5X="YA<C4R,3%7<FET94%S<V]C:60`+G)E;"YT97AT+F%R-3(Q,4=E
+M=%1S9C8T`"YR96PN=&5X="YA<C4R,3%'9714<V8S,@`N<F5L+G1E>'0N87(U
+M,C$Q4F5S9714<V8`+G)E;"YT97AT+F%R-3(Q,4=E=%)A;F1O;5-E960`+G)E
+M;"YT97AT+F%R-3(Q,41E=&5C=$-A<F10<F5S96YT`"YR96PN=&5X="YA<C4R
+M,3%5<&1A=&5-:6)#;W5N=&5R<P`N<F5L+G1E>'0N87(U,C$Q4V5T4VQO=%1I
+M;64`+G)E;"YT97AT+F%R-3(Q,4=E=%-L;W14:6UE`"YR96PN=&5X="YA<C4R
+M,3%3971!8VM4:6UE;W5T`"YR96PN=&5X="YA<C4R,3%'971!8VM4:6UE;W5T
+M`"YT97AT+F%R-3(Q,4=E=$%C:T-44U)A=&4`+G)E;"YT97AT+F%R-3(Q,5-E
+M=$%C:T-44U)A=&4`+G)E;"YT97AT+F%R-3(Q,5-E=$-44U1I;65O=70`+G)E
+M;"YT97AT+F%R-3(Q,4=E=$-44U1I;65O=70`+G1E>'0N87(U,C$Q4V5T1&5C
+M;VUP36%S:P`N=&5X="YA<C4R,3%3971#;W9E<F%G94-L87-S`"YT97AT+F%R
+M-3(Q,4%N:4-O;G1R;VP`+G1E>'0N87(U,C$Q06YI4&]L;``N=&5X="YA<C4R
+M,3%-:6)%=F5N=``N<F5L+G1E>'0N87(U,C$Q1V5T0W5R4G-S:0`N<F5L+G1E
+M>'0N87(U,C$Q1V5T1&5F06YT96YN80`N<F5L+G1E>'0N87(U,C$Q4V5T1&5F
+M06YT96YN80`N=&5X="YA<C4R,3%'971!;G1E;FYA4W=I=&-H`"YR96PN=&5X
+M="YA<C4R,3%3971!;G1E;FYA4W=I=&-H`"YR96PN=&5X="YA<C4R,3%'971#
+M87!A8FEL:71Y`"YR96PN=&5X="YA<C4R,3%3971#87!A8FEL:71Y`"YR96PN
+M=&5X="YA<C4R,3%'971$:6%G4W1A=&4`+G)E;"YT97AT+F%R-3(Q,5-E=%!O
+M=V5R36]D94%W86ME`"YR96PN=&5X="YA<C4R,3%39710;W=E<DUO9&53;&5E
+M<``N<F5L+G1E>'0N87(U,C$Q4V5T4&]W97)-;V1E3F5T=V]R:U-L965P`"YR
+M96PN=&5X="YA<C4R,3%39710;W=E<DUO9&4`+G)E;"YT97AT+F%R-3(Q,4=E
+M=%!O=V5R36]D90`N<F5L+G1E>'0N87(U,C$Q1V5T4F%T951A8FQE`"YR96PN
+M=&5X="YA<C4R,3%'9712>$10`"YR96PN=&5X="YA<C4R,3%39712>$10`"YR
+M96PN=&5X="YA<C4R,3%%;F%B;&5296-E:79E`"YR96PN=&5X="YA<C4R,3%3
+M=&]P1&UA4F5C96EV90`N<F5L+G1E>'0N87(U,C$Q4W1A<G108W5296-E:79E
+M`"YR96PN=&5X="YA<C4R,3%3=&]P4&-U4F5C96EV90`N<F5L+G1E>'0N87(U
+M,C$Q4V5T375L=&EC87-T1FEL=&5R`"YR96PN=&5X="YA<C4R,3%#;')-=6QT
+M:6-A<W1&:6QT97));F1E>``N<F5L+G1E>'0N87(U,C$Q4V5T375L=&EC87-T
+M1FEL=&5R26YD97@`+G)E;"YT97AT+F%R-3(Q,4=E=%)X1FEL=&5R`"YR96PN
+M=&5X="YA<C4R,3%39712>$9I;'1E<@`N=&5X="YA<C4R,3%3971U<%)X1&5S
+M8P`N<F5L+G1E>'0N87(U,C$Q4')O8U)X1&5S8P`N<F5L+G1E>'0N87(U,C$Q
+M4F5S970`+G)E;"YT97AT+F%R-3(Q,5!H>41I<V%B;&4`+G)E;"YT97AT+F%R
+M-3(Q,41I<V%B;&4`+G)E;"YT97AT+F%R-3(Q,4-H:7!297-E=``N<F5L+G1E
+M>'0N87(U,C$Q4&5R0V%L:6)R871I;VX`+G)E;"YT97AT+F%R-3(Q,5-E=%)E
+M<V5T4F5G`"YR96PN=&5X="YA<C4R,3%3971#:&%N;F5L`"YR96PN=&5X="YA
+M<C4R,3%'971.;VES949L;V]R`"YR96PN=&5X="YA<C4R,3%2=6Y.;VES949L
+M;V]R`"YT97AT+F=E=$YO:7-E1FQO;W)4:')E<V@`+G)E;"YT97AT+F%R-3(Q
+M,4ES3F9';V]D`"YR96PN=&5X="YA<C4R,3%#86Q.;VES949L;V]R`"YR96PN
+M=&5X="YA<C4R,3%'971.9D%D:G5S=``N<F5L+G1E>'0N87(U,C$Q4V5T4F8V
+M86YD-P`N<F5L+G1E>'0N87(U,C$Q4V5T06YT96YN85-W:71C:$EN=&5R;F%L
+M`"YR96PN=&5X="YA<C4R,3%3971";V%R9%9A;'5E<P`N<F5L+G1E>'0N87(U
+M,C$Q4V5T5'A0;W=E<DQI;6ET`"YR96PN=&5X="YA<C4R,3%39714<F%N<VUI
+M=%!O=V5R`"YR96PN=&5X="YA<C4R,3%39710;W=E<E1A8FQE`"YR96PN=&5X
+M="YA<C4R,3%39712871E5&%B;&4`+G)E;"YT97AT+F%R-3(Q,4=E=%-C86QE
+M9%!O=V5R`"YT97AT+F%R-3(Q,49I;F1686QU94EN3&ES=``N<F5L+G1E>'0N
+M87(U,C$Q1V5T26YT97)P;VQA=&5D5F%L=64`+G1E>'0N87(U,C$Q1V5T3&]W
+M97)5<'!E<E9A;'5E<P`N<F5L+G1E>'0N87(U,C$Q1V5T3&]W97)5<'!E<E!C
+M9&%C<P`N<F5L+G1E>'0N87(U,C$Q26YI=&EA;&EZ94=A:6Y686QU97,`+G1E
+M>'0N87(U,C$Q26YV86QI9$=A:6Y296%D8F%C:P`N<F5L+G1E>'0N87(U,C$Q
+M4F5Q=65S=%)F9V%I;@`N<F5L+G1E>'0N87(U,C$Q1V5T4F9G86EN`"YT97AT
+M+F%R-3(Q,4ES1V%I;D%D:G5S=$YE961E9``N<F5L+G1E>'0N87(U,C$Q061J
+M=7-T1V%I;@`N=&5X="YA<C4R,3%397129F=A:6X`+G)E;"YT97AT+F%R-3(Q
+M,5-E=$]P97)A=&EN9TUO9&4`+G)E;"YT97AT+F%R-3(Q,5-E=%!#54-O;F9I
+M9P`N<F5L+G1E>'0N87(U,C$Q57!D871E5'A4<FEG3&5V96P`+G)E;"YT97AT
+M+F%R-3(Q,5-E=%1X475E=650<F]P<P`N<F5L+G1E>'0N87(U,C$Q1V5T5'A1
+M=65U95!R;W!S`"YR96PN=&5X="YA<C4R,3%3971U<%1X475E=64`+G)E;"YT
+M97AT+G-E=%1X44EN=&5R<G5P=',`+G)E;"YT97AT+F%R-3(Q,5)E;&5A<V54
+M>%%U975E`"YR96PN=&5X="YA<C4R,3%297-E=%1X475E=64`+G)E;"YT97AT
+M+F%R-3(Q,4=E=%1X1%``+G)E;"YT97AT+F%R-3(Q,5-E=%1X1%``+G)E;"YT
+M97AT+F%R-3(Q,5-T87)T5'A$;6$`+G)E;"YT97AT+F%R-3(Q,4YU;51X4&5N
+M9&EN9P`N<F5L+G1E>'0N87(U,C$Q4W1O<%1X1&UA`"YT97AT+F%R-3(Q,5-E
+M='5P5'A$97-C`"YT97AT+F%R-3(Q,5-E='5P6%1X1&5S8P`N=&5X="YA<C4R
+M,3%);G1R4F5Q5'A$97-C`"YT97AT+F%R-3(Q,49I;&Q4>$1E<V,`+G1E>'0N
+M87(U,C$Q4')O8U1X1&5S8P`N=&5X="YA<C4R,3%'9714>$EN=')1=65U90`N
+M=&5X="YA<C4R,3%2861A<E=A:70`+G)E;"YT97AT+F-O;F9I9W5R95!C:650
+M;W=E<E-A=F4`+G)E;"YT97AT+F%R-3(Q,D=E=%)A9&EO4F5V`"YR96PN=&5X
+M="YA<C4R,3)!;FE3971U<``N=&5X="YA<C4R,3)'9713<'5R0VAA;@`N<F5L
+M+G1E>'0N87(U,C$R26YI=%-T871E`"YR96PN=&5X="YA<C4R,3))<TUA8U-U
+M<'!O<G1E9``N<F5L+G1E>'0N87(U,C$R071T86-H`"YR96PN=&5X="YA<C4R
+M,3)$971A8V@`+G)E;"YT97AT+F%R-3(Q,D-H:7!497-T`"YT97AT+F%R-3(Q
+M,D=E=$-H86YN96Q%9&=E<P`N<F5L+G1E>'0N87(U,C$R1FEL;$-A<&%B:6QI
+M='E);F9O`"YR96PN=&5X="YA<C4R,3)$=6UM>5-T87)T5'A$;6$`+G)E;"YT
+M97AT+F%R-3(Q,E1X16YA8FQE`"YR96PN=&5X="YA<C4R,3)3971"96%C;VY4
+M:6UE<G,`+G)E;"YT97AT+F%R-3(Q,D)E86-O;DEN:70`+G)E;"YT97AT+F%R
+M-3(Q,E)E<V5T4W1A0F5A8V]N5&EM97)S`"YR96PN=&5X="YA<C4R,3)39713
+M=&%"96%C;VY4:6UE<G,`+G)E;"YT97AT+F%R-3(Q,D5E<')O;5)E860`+G)E
+M;"YT97AT+F%R-3(Q,D=P:6]#9F=/=71P=70`+G)E;"YT97AT+F%R-3(Q,D=P
+M:6]#9F=);G!U=``N<F5L+G1E>'0N87(U,C$R1W!I;U-E=``N<F5L+G1E>'0N
+M87(U,C$R1W!I;T=E=``N<F5L+G1E>'0N87(U,C$R1W!I;U-E=$EN='(`+G)E
+M;"YT97AT+F%R-3(Q,DES26YT97)R=7!T4&5N9&EN9P`N<F5L+G1E>'0N87(U
+M,C$R1V5T4&5N9&EN9TEN=&5R<G5P=',`+G1E>'0N87(U,C$R1V5T26YT97)R
+M=7!T<P`N<F5L+G1E>'0N87(U,C$R4V5T26YT97)R=7!T<P`N=&5X="YA<C4R
+M,3)'971+97E#86-H95-I>F4`+G)E;"YT97AT+F%R-3(Q,DES2V5Y0V%C:&5%
+M;G1R>59A;&ED`"YR96PN=&5X="YA<C4R,3)297-E=$ME>4-A8VAE16YT<GD`
+M+G)E;"YT97AT+F%R-3(Q,E-E=$ME>4-A8VAE16YT<GE-86,`+G)E;"YT97AT
+M+F%R-3(Q,E-E=$ME>4-A8VAE16YT<GD`+G)E;"YT97AT+F%R-3(Q,D=E=$UA
+M8T%D9')E<W,`+G)E;"YT97AT+F%R-3(Q,E-E=$UA8T%D9')E<W,`+G)E;"YT
+M97AT+F%R-3(Q,D=E=$)S<TED36%S:P`N<F5L+G1E>'0N87(U,C$R4V5T0G-S
+M261-87-K`"YT97AT+F%R-3(Q,E-E=%)E9W5L871O<GE$;VUA:6X`+G1E>'0N
+M87(U,C$R1V5T5VER96QE<W--;V1E<P`N<F5L+G1E>'0N87(U,C$R16YA8FQE
+M4F9+:6QL`"YR96PN=&5X="YA<C4R,3)3971,9613=&%T90`N<F5L+G1E>'0N
+M87(U,C$R5W)I=&5!<W-O8VED`"YR96PN=&5X="YA<C4R,3)'9714<V8V-``N
+M<F5L+G1E>'0N87(U,C$R1V5T5'-F,S(`+G)E;"YT97AT+F%R-3(Q,E)E<V5T
+M5'-F`"YR96PN=&5X="YA<C4R,3)3971"87-I8U)A=&4`+G)E;"YT97AT+F%R
+M-3(Q,D=E=%)A;F1O;5-E960`+G)E;"YT97AT+F%R-3(Q,D1E=&5C=$-A<F10
+M<F5S96YT`"YR96PN=&5X="YA<C4R,3)5<&1A=&5-:6)#;W5N=&5R<P`N=&5X
+M="YA<C4R,3))<TIA<&%N0VAA;FYE;%-P<F5A9%-U<'!O<G1E9``N<F5L+G1E
+M>'0N87(U,C$R1V5T0W5R4G-S:0`N<F5L+G1E>'0N87(U,C$R1V5T1&5F06YT
+M96YN80`N<F5L+G1E>'0N87(U,C$R4V5T1&5F06YT96YN80`N=&5X="YA<C4R
+M,3)'971!;G1E;FYA4W=I=&-H`"YR96PN=&5X="YA<C4R,3)3971!;G1E;FYA
+M4W=I=&-H`"YT97AT+F%R-3(Q,DES4VQE97!!9G1E<D)E86-O;D)R;VME;@`N
+M<F5L+G1E>'0N87(U,C$R4V5T4VQO=%1I;64`+G)E;"YT97AT+F%R-3(Q,D=E
+M=%-L;W14:6UE`"YR96PN=&5X="YA<C4R,3)3971!8VM4:6UE;W5T`"YR96PN
+M=&5X="YA<C4R,3)'971!8VM4:6UE;W5T`"YT97AT+F%R-3(Q,D=E=$%C:T-4
+M4U)A=&4`+G)E;"YT97AT+F%R-3(Q,E-E=$%C:T-44U)A=&4`+G)E;"YT97AT
+M+F%R-3(Q,E-E=$-44U1I;65O=70`+G)E;"YT97AT+F%R-3(Q,D=E=$-44U1I
+M;65O=70`+G)E;"YT97AT+F%R-3(Q,E-E=$1E8V]M<$UA<VL`+G)E;"YT97AT
+M+F%R-3(Q,E-E=$-O=F5R86=E0VQA<W,`+G)E;"YT97AT+F%R-3(Q,E-E=%!#
+M54-O;F9I9P`N=&5X="YA<C4R,3)5<V4S,DM(>F-L;V-K`"YR96PN=&5X="YA
+M<C4R,3)3971U<$-L;V-K`"YR96PN=&5X="YA<C4R,3)297-T;W)E0VQO8VL`
+M+G)E;"YT97AT+F%R-3(Q,D=E=$YF061J=7-T`"YR96PN=&5X="YA<C4R,3)'
+M971#87!A8FEL:71Y`"YR96PN=&5X="YA<C4R,3)3971#87!A8FEL:71Y`"YR
+M96PN=&5X="YA<C4R,3)'971$:6%G4W1A=&4`+G)E;"YT97AT+F%R-3(Q,E-E
+M=%!O=V5R36]D94%W86ME`"YR96PN=&5X="YA<C4R,3)39710;W=E<DUO9&53
+M;&5E<``N<F5L+G1E>'0N87(U,C$R4V5T4&]W97)-;V1E3F5T=V]R:U-L965P
+M`"YR96PN=&5X="YA<C4R,3)39710;W=E<DUO9&4`+G)E;"YT97AT+F%R-3(Q
+M,D=E=%!O=V5R36]D90`N<F5L+G1E>'0N87(U,C$R1V5T4F%T951A8FQE`"YR
+M96PN=&5X="YA<C4R,3)'9712>$10`"YR96PN=&5X="YA<C4R,3)39712>$10
+M`"YR96PN=&5X="YA<C4R,3)%;F%B;&5296-E:79E`"YR96PN=&5X="YA<C4R
+M,3)3=&]P1&UA4F5C96EV90`N<F5L+G1E>'0N87(U,C$R4W1A<G108W5296-E
+M:79E`"YR96PN=&5X="YA<C4R,3)3=&]P4&-U4F5C96EV90`N<F5L+G1E>'0N
+M87(U,C$R4V5T375L=&EC87-T1FEL=&5R`"YR96PN=&5X="YA<C4R,3)#;')-
+M=6QT:6-A<W1&:6QT97));F1E>``N<F5L+G1E>'0N87(U,C$R4V5T375L=&EC
+M87-T1FEL=&5R26YD97@`+G)E;"YT97AT+F%R-3(Q,D=E=%)X1FEL=&5R`"YR
+M96PN=&5X="YA<C4R,3)39712>$9I;'1E<@`N=&5X="YA<C4R,3)3971U<%)X
+M1&5S8P`N<F5L+G1E>'0N87(U,C$R4')O8U)X1&5S8P`N<F5L+G1E>'0N87(U
+M,C$R4F5S970`+G)E;"YT97AT+F%R-3(Q,E-E=#$Q;D-O;7!A=``N<F5L+G1E
+M>'0N87(U,C$R4V5T0VAA;FYE;``N<F5L+G1E>'0N87(U,C$R0VAA;FYE;$-H
+M86YG90`N<F5L+G1E>'0N87(U,C$R4V5T3W!E<F%T:6YG36]D90`N<F5L+G1E
+M>'0N87(U,C$R4&AY1&ES86)L90`N<F5L+G1E>'0N87(U,C$R1&ES86)L90`N
+M<F5L+G1E>'0N87(U,C$R0VAI<%)E<V5T`"YR96PN=&5X="YA<C4R,3)097)#
+M86QI8G)A=&EO;@`N<F5L+G1E>'0N87(U,C$R4V5T4F5S971296<`+G)E;"YT
+M97AT+F%R-3(Q,D=E=$YO:7-E1FQO;W(`+G)E;"YT97AT+F%R-3(Q,D=E=$YF
+M`"YR96PN=&5X="YA<C4R,3)3971#;VUP4F5G<P`N<F5L+G1E>'0N87(U,C$R
+M1V5T4F9&:65L9``N<F5L+G1E>'0N87(U,C$R4V5T06YT96YN85-W:71C:$EN
+M=&5R;F%L`"YR96PN=&5X="YA<C4R,3))<U-P=7)#:&%N;F5L`"YR96PN=&5X
+M="YA<C4R,3)3971";V%R9%9A;'5E<P`N<F5L+G1E>'0N87(U,C$R4V5T4W!U
+M<DUI=&EG871I;VX`+G)E;"YT97AT+F%R-3(Q,E-E=$1E;'1A4VQO<&4`+G)E
+M;"YT97AT+F%R-3(Q,E-E=%1X4&]W97),:6UI=``N<F5L+G1E>'0N87(U,C$R
+M4V5T5')A;G-M:710;W=E<@`N<F5L+G1E>'0N87(U,C$R4V5T4F%T951A8FQE
+M`"YR96PN=&5X="YA<C4R,3)'971#:&EP4&]W97),:6UI=',`+G)E;"YT97AT
+M+F%R-3(Q,D-O<G)E8W1'86EN1&5L=&$`+G)E;"YT97AT+F%R-3(Q,D=E=$UA
+M>$5D9V50;W=E<@`N<F5L+G1E>'0N:6YT97)P;VQA=&4`+G)E;"YT97AT+F%R
+M-3(Q,D=E=%1A<F=E=%!O=V5R<P`N=&5X="YA<C4R,3)'971,;W=E<E5P<&5R
+M5F%L=65S`"YR96PN=&5X="YA<C4R,3));FET:6%L:7IE1V%I;E9A;'5E<P`N
+M<F5L+G1E>'0N87(U,C$R26YV86QI9$=A:6Y296%D8F%C:P`N<F5L+G1E>'0N
+M87(U,C$R4F5Q=65S=%)F9V%I;@`N<F5L+G1E>'0N87(U,C$R1V5T4F9G86EN
+M`"YT97AT+F%R-3(Q,DES1V%I;D%D:G5S=$YE961E9``N<F5L+G1E>'0N87(U
+M,C$R061J=7-T1V%I;@`N<F5L+G1E>'0N87(U,C$R1V5T1V%I;D9#;W)R96-T
+M:6]N`"YR96PN=&5X="YA<C4R,3)-;V1I9GE29D)U9F9E<@`N<F5L+G1E>'0N
+M87(U,C$R4V5T4F%T941U<F%T:6]N5&%B;&4`+G)E;"YT97AT+F%R-3(Q,E-E
+M=$E&4U1I;6EN9P`N<F5L+G1E>'0N87(U,C$R57!D871E5'A4<FEG3&5V96P`
+M+G)E;"YT97AT+F%R-3(Q,E-E=%1X475E=650<F]P<P`N<F5L+G1E>'0N87(U
+M,C$R1V5T5'A1=65U95!R;W!S`"YR96PN=&5X="YA<C4R,3)3971U<%1X475E
+M=64`+G)E;"YT97AT+F%R-3(Q,E)E;&5A<V54>%%U975E`"YR96PN=&5X="YA
+M<C4R,3)297-E=%1X475E=64`+G)E;"YT97AT+F%R-3(Q,D=E=%1X1%``+G)E
+M;"YT97AT+F%R-3(Q,E-E=%1X1%``+G)E;"YT97AT+F%R-3(Q,E-T87)T5'A$
+M;6$`+G)E;"YT97AT+F%R-3(Q,DYU;51X4&5N9&EN9P`N<F5L+G1E>'0N87(U
+M,C$R4W1O<%1X1&UA`"YT97AT+F%R-3(Q,E-E='5P5'A$97-C`"YT97AT+F%R
+M-3(Q,E-E='5P6%1X1&5S8P`N=&5X="YA<C4R,3));G1R4F5Q5'A$97-C`"YT
+M97AT+F%R-3(Q,D9I;&Q4>$1E<V,`+G1E>'0N87(U,C$R4')O8U1X1&5S8P`N
+M=&5X="YA<C4R,3)'9714>$EN=')1=65U90`N<F5L+G1E>'0N87(U,C$R16YA
+M8FQE34E"0V]U;G1E<G,`+G)E;"YT97AT+F%R-3(Q,D1I<V%B;&5-24)#;W5N
+M=&5R<P`N=&5X="YA<C4R,3)'971!;FE#:&%N;F5L26YD97@`+G1E>'0N87(U
+M,C$R06YI1V5T0W5R<F5N=%-T871E`"YR96PN=&5X="YA<C4R,3)!;FE'971#
+M=7)R96YT4W1A=',`+G)E;"YT97AT+F%R-3(Q,D%N:4%T=&%C:``N<F5L+G1E
+M>'0N87(U,C$R06YI1&5T86-H`"YR96PN=&5X="YA<C4R,3)!;FE#;VYT<F]L
+M`"YR96PN=&5X="YA<C4R,3)!;FE297-T87)T`"YR96PN=&5X="YA<C4R,3)!
+M;FE/9F1M17)R5')I9V=E<@`N<F5L+G1E>'0N87(U,C$R06YI0V-K17)R5')I
+M9V=E<@`N<F5L+G1E>'0N87(U,C$R06YI4F5S970`+G)E;"YT97AT+F%R-3(Q
+M,E!R;V-E<W--:6));G1R`"YR96PN=&5X="YA<C4R,3)!;FE0:'E%<G)297!O
+M<G0`+G)E;"YT97AT+F%R-3(Q,D%N:4QO=V5R26UM=6YI='D`+G)E;"YT97AT
+M+F%R-3(Q,D%N:4=E=$QI<W1E;E1I;64`+G)E;"YT97AT+F%R-3(Q,D%N:5!O
+M;&P`+G1E>'0N87(U,C$R4F%D87)786ET`"YR96PN=&5X="YA<C4Q,3%7<FET
+M95)E9W,`+G)E;"YT97AT+F%R-3$Q,5-E=$-H86YN96P`+G)E;"YT97AT+F%R
+M-3$Q,4=E=%)F0F%N:P`N<F5L+G1E>'0N87(U,3$Q4V5T4F9296=S`"YR96PN
+M=&5X="YA<C4Q,3%39710;W=E<E1A8FQE`"YR96PN=&5X="YA<C4R,3)'9713
+M8V%L9610;W=E<@`N=&5X="YA<C4R,3)&:6YD5F%L=65);DQI<W0`+G)E;"YT
+M97AT+F%R-3(Q,D=E=$QO=V5R57!P97)08V1A8W,`+G)E;"YT97AT+F%R-3$Q
+M,41E=&%C:``N=&5X="YA<C4Q,3%'971#:&EP4&]W97),:6UI=',`+G)E;"YT
+M97AT+F%R-3$Q,4=E=$YF061J=7-T`"YR96PN=&5X="YA<C4Q,3%29D%T=&%C
+M:``N<F5L+G1E>'0N87(U,3$R5W)I=&5296=S`"YR96PN=&5X="YA<C4Q,3)3
+M971#:&%N;F5L`"YR96PN=&5X="YA<C4Q,3)'97129D)A;FL`+G)E;"YT97AT
+M+F%R-3$Q,E-E=%)F4F5G<P`N<F5L+G1E>'0N87(U,3$R4V5T4&]W97)486)L
+M90`N<F5L+G1E>'0N:6YT97)P;VQA=&5?<VEG;F5D`"YT97AT+F%R-3(Q,D=E
+M=$QO=V5R57!P97));F1E>``N<F5L+G1E>'0N9V5T1G5L;%!W<E1A8FQE`"YT
+M97AT+F=E=%!M:6Y!;F108V1A8U1A8FQE1G)O;5!O=V5R5&%B;&4`+G1E>'0N
+M9V5T4&UI;D%N9%!C9&%C5&%B;&5&<F]M5'=O4&]W97)486)L97,`+G)E;"YT
+M97AT+F%R-3$Q,D1E=&%C:``N=&5X="YA<C4Q,3)'971-:6Y0;W=E<@`N<F5L
+M+G1E>'0N87(U,3$R1V5T0VAA;FYE;$UA>$UI;E!O=V5R`"YR96PN=&5X="YA
+M<C4Q,3)'971#:&EP4&]W97),:6UI=',`+G)E;"YT97AT+F%R-3$Q,E)F071T
+M86-H`"YR96PN=&5X="YA<C(T,3-7<FET95)E9W,`+G)E;"YT97AT+F%R,C0Q
+M,U-E=$-H86YN96P`+G)E;"YT97AT+F%R,C0Q,U-E=%)F4F5G<P`N<F5L+G1E
+M>'0N87(R-#$S1V5T4F9"86YK`"YT97AT+D=E=$QO=V5R57!P97));F1E>``N
+M<F5L+G1E>'0N87(R-#$S1FEL;%9P9%1A8FQE`"YR96PN=&5X="YA<C(T,3-G
+M971'86EN0F]U;F1A<FEE<T%N9%!D861C<T9O<E!O=V5R<P`N<F5L+G1E>'0N
+M87(R-#$S4V5T4&]W97)486)L90`N<F5L+G1E>'0N87(R-#$S4F9$971A8V@`
+M+G1E>'0N87(R-#$S1V5T36EN4&]W97(`+G1E>'0N87(R-#$S1V5T36%X4&]W
+M97(`+G)E;"YT97AT+F%R,C0Q,T=E=$-H86YN96Q-87A-:6Y0;W=E<@`N<F5L
+M+G1E>'0N87(R-#$S1V5T0VAI<%!O=V5R3&EM:71S`"YR96PN=&5X="YA<C(T
+M,3-29D%T=&%C:``N<F5L+G1E>'0N87(U-#$S5W)I=&5296=S`"YR96PN=&5X
+M="YA<C4T,3-3971#:&%N;F5L`"YR96PN=&5X="YA<C4T,3-397129E)E9W,`
+M+G)E;"YT97AT+F%R-30Q,T=E=%)F0F%N:P`N<F5L+G1E>'0N87(U-#$S1FEL
+M;%9P9%1A8FQE`"YR96PN=&5X="YA<C4T,3-G971'86EN0F]U;F1A<FEE<T%N
+M9%!D861C<T9O<E!O=V5R<P`N<F5L+G1E>'0N87(U-#$S4V5T4&]W97)486)L
+M90`N<F5L+G1E>'0N87(U-#$S4F9$971A8V@`+G1E>'0N87(U-#$S1V5T36EN
+M4&]W97(`+G1E>'0N87(U-#$S1V5T36%X4&]W97(`+G)E;"YT97AT+F%R-30Q
+M,T=E=$-H86YN96Q-87A-:6Y0;W=E<@`N<F5L+G1E>'0N87(U-#$S1V5T0VAI
+M<%!O=V5R3&EM:71S`"YR96PN=&5X="YA<C4T,3-29D%T=&%C:``N<F5L+G)O
+M9&%T80`N<F]D871A+G-T<C$N-``N<F]D871A+D-,3T-+7U)!5$4`+G)O9&%T
+M82Y.3TE315]&3$]/4@`N<F]D871A+FEN=&5R8V5P=',S+C``+G)O9&%T82YI
+M;G1E<F-E<'1S,U\R+C$`+G)O9&%T82YH96%D97)/9F9S970S7S`N,@`N<F]D
+M871A+FAE861E<D]F9G-E=#-?,RXS`"YR;V1A=&$N<F5G0V%P3V9F<V5T4')E
+M-%\P+C0`+G)O9&%T82YR96=#87!/9F9S9710;W-T-%\P+C4`+G)O9&%T82YM
+M;V1E<P`N<F5L+G)O9&%T82YA<C4R,3!H86P`+G)O9&%T82YO;F5S+C``+G)O
+M9&%T82YA<C5K,#`P-U]I;FET`"YR;V1A=&$N87(U:S`P,#=?<'=R4V5T=&EN
+M9W,`+G)O9&%T82YT<&-38V%L95)E9'5C=&EO;E1A8FQE+C``+G)O9&%T82YP
+M=W)?<F5G<U]S=&%R="XQ`"YR96PN<F]D871A+F%R-3(Q,6AA;``N<F]D871A
+M+F-H86YN96QS,E\T`"YR;V1A=&$N;&5D8FET<RXQ`"YR;V1A=&$N87(U,C$Q
+M36]D97,`+G)O9&%T82YA<C4R,3%#;VUM;VX`+G)O9&%T82YA<C4R,3%"0E]2
+M9D=A:6X`+G)O9&%T82YC:&%N,D=(>D1A=&$`+G)O9&%T82YR=6YT:6UE+C``
+M+G)O9&%T82YA9&IU<W0U,3$Q+C$`+G)O9&%T82YT<&-38V%L95)E9'5C=&EO
+M;E1A8FQE+C4`+G)O9&%T82YG86EN3&%D9&5R`"YR96PN<F]D871A+F%R-3(Q
+M,FAA;``N<F]D871A+F-H86YN96QS,3%B`"YR;V1A=&$N8VAA;FYE;',Q,6<`
+M+G)O9&%T82YD969B<W-I9&UA<VLN,``N<F]D871A+FUA8W,N,0`N<F]D871A
+M+FQE9&)I=',N,``N<F]D871A+F%D:G5S=$1E9BXQ`"YR;V1A=&$N8VUD<RXR
+M`"YR;V1A=&$N87(U,C$R36]D97,`+G)O9&%T82YA<C4R,3)#;VUM;VX`+G)O
+M9&%T82YT<&-38V%L95)E9'5C=&EO;E1A8FQE+C$`+G)O9&%T82YG86EN3&%D
+M9&5R-3$Q,@`N<F]D871A+F%R-3(Q,DUO9&5S7S4Q,3$`+G)O9&%T82YA<C4R
+M,3)#;VUM;VY?-3$Q,0`N<F]D871A+F%R-3(Q,D)A;FLP7S4Q,3$`+G)O9&%T
+M82YA<C4R,3)"0E]29D=A:6Y?-3$Q,0`N<F]D871A+F%R-3(Q,D)A;FLQ7S4Q
+M,3$`+G)O9&%T82YA<C4R,3)"86YK,E\U,3$Q`"YR;V1A=&$N87(U,C$R0F%N
+M:S-?-3$Q,0`N<F]D871A+F%R-3(Q,D)A;FLV7S4Q,3$`+G)O9&%T82YA<C4R
+M,3)"86YK-U\U,3$Q`"YR;V1A=&$N8VAA;C)'2'I$871A+C``+G)O9&%T82YA
+M<C4R,3)-;V1E<U\U,3$R`"YR;V1A=&$N87(U,C$R0V]M;6]N7S4Q,3(`+G)O
+M9&%T82YA<C4R,3)"0E]29D=A:6Y?-3$Q,@`N<F]D871A+F%R-3(Q,D)A;FLQ
+M7S4Q,3(`+G)O9&%T82YA<C4R,3)"86YK,E\U,3$R`"YR;V1A=&$N87(U,C$R
+M0F%N:S-?-3$Q,@`N<F]D871A+F%R-3(Q,D)A;FLV7S4Q,3(`+G)O9&%T82YA
+M<C4R,3)"86YK-U\U,3$R`"YR;V1A=&$N87(U,C$R36]D97-?,C0Q,P`N<F]D
+M871A+F%R-3(Q,D-O;6UO;E\R-#$S`"YR;V1A=&$N87(U,C$R0D)?4F9'86EN
+M7S(T,3,`+G)O9&%T82YA<C4R,3)"86YK,5\R-#$S`"YR;V1A=&$N87(U,C$R
+M0F%N:S)?,C0Q,P`N<F]D871A+F%R-3(Q,D)A;FLS7S(T,3,`+G)O9&%T82YA
+M<C4R,3)"86YK-E\R-#$S`"YR;V1A=&$N87(U,C$R0F%N:S=?,C0Q,P`N<F]D
+M871A+F%R-3(Q,DUO9&5S7S4T,3,`+G)O9&%T82YA<C4R,3)#;VUM;VY?-30Q
+M,P`N<F]D871A+F%R-3(Q,D)"7U)F1V%I;E\U-#$S`"YR;V1A=&$N87(U,C$R
+M0F%N:S%?-30Q,P`N<F]D871A+F%R-3(Q,D)A;FLR7S4T,3,`+G)O9&%T82YA
+M<C4R,3)"86YK,U\U-#$S`"YR;V1A=&$N87(U,C$R0F%N:S9?-30Q,P`N<F]D
+M871A+F%R-3(Q,D)A;FLW7S4T,3,`+F1A=&$`+F1A=&$N871H7VAA;%]V97)S
+M:6]N`"YR96PN9&%T82YA=&A?:&%L7V)U:6QD;W!T<P`N9&%T82YR96=$;VUA
+M:6Y086ER<P`N9&%T82YR96=$;VUA:6Y696YD;W)086ER<P`N9&%T82YA;&Q#
+M;W5N=')I97,`+F1A=&$N<F5G1&UN-4=H>D9R97$`+F1A=&$N<F5G1&UN-4=H
+M>E1U<F)O1G)E<0`N9&%T82YR96=$;6XR1VAZ1G)E<0`N9&%T82YR96=$;6XR
+M1VAZ,3%G1G)E<0`N9&%T82YR96=$;6XR1VAZ,3%G5'5R8F]&<F5Q`"YD871A
+M+G)E9T1O;6%I;G,`+F1A=&$N:E]S:W5M87``+F1A=&$N:E]C;W5N=')Y;6%P
+M`"YD871A+F%R-3(Q,%\Q,6%?=&%B;&4`+F1A=&$N87(U,C$P7W1U<F)O7W1A
+M8FQE`"YD871A+F%R-3(Q,5\Q,6%?=&%B;&4`+F1A=&$N87(U,C$Q7W1U<F)O
+M7W1A8FQE`"YD871A+F%R-3(Q,5\Q,6)?=&%B;&4`+F1A=&$N87(U,C$Q36]D
+M93)?-``N9&%T82YA<C4R,3%29C9N-P`N9&%T82YA<C4R,3)?,3%A7W1A8FQE
+M`"YD871A+F%R-3(Q,E\Q,6%?:&%L9E]T86)L90`N9&%T82YA<C4R,3)?,3%A
+M7W%U87)T97)?=&%B;&4`+F1A=&$N87(U,C$R7W1U<F)O9U]T86)L90`N9&%T
+M82YA<C4R,3)?='5R8F]A7W1A8FQE`"YD871A+F%R-3(Q,E\Q,6)?=&%B;&4`
+M+F1A=&$N87(U,C$R7S$Q9U]T86)L90`N9&%T82YA<C4R,3)?>')?=&%B;&4`
+M+F)S<P`N8G-S+G!C9&%C4W1R=6-T+C(`+F)S<RYP8V1A8U1A8FQE+C,`+F)S
+M<RYR871E<T%R<F%Y+C0`+F-O;6UE;G0`````````````````````````````
+M````````````````````````````&P````$````&`````````#0`````````
+M```````````!`````````"4````!````!@`````````T````\```````````
+M````!``````````A````"0``````````````>*T#`%`````Q!````@````0`
+M```(````/P````$````&`````````"0!```X```````````````$````````
+M`#L````)``````````````#(K0,`"````#$$```$````!`````@```!7````
+M`0````8`````````7`$```P!``````````````0`````````4P````D`````
+M`````````-"M`P`8````,00```8````$````"````&P````!````!@``````
+M``!H`@``#```````````````!`````````"(`````0````8`````````=`(`
+M`#P```````````````0`````````A`````D``````````````.BM`P`0````
+M,00```D````$````"````)L````!````!@````````"P`@``)```````````
+M````!`````````"Y`````0````8`````````U`(``$@!``````````````0`
+M````````M0````D``````````````/BM`P!8````,00```P````$````"```
+M`-4````!````!@`````````<!```4```````````````!`````````#R````
+M`0````8`````````;`0``/````````````````0`````````[@````D`````
+M`````````%"N`P`P````,00```\````$````"`````T!```!````!@``````
+M``!<!0``*```````````````!``````````)`0``"0``````````````@*X#
+M`!`````Q!```$0````0````(````*`$```$````&`````````(0%```L````
+M```````````$`````````"0!```)``````````````"0K@,`&````#$$```3
+M````!`````@```!#`0```0````8`````````L`4``(P```````````````0`
+M````````/P$```D``````````````*BN`P`0````,00``!4````$````"```
+M`&0!```!````!@`````````\!@``]```````````````!`````````!@`0``
+M"0``````````````N*X#``@````Q!```%P````0````(````@`$```$````&
+M`````````#`'``!L```````````````$`````````*`!```!````!@``````
+M``"<!P``8```````````````!`````````"<`0``"0``````````````P*X#
+M``@````Q!```&@````0````(````O0$```$````&`````````/P'``!T````
+M```````````$`````````+D!```)``````````````#(K@,`"````#$$```<
+M````!`````@```#8`0```0````8`````````<`@``/@```````````````0`
+M````````\@$```$````&`````````&@)``!(```````````````$````````
+M`!`"```!````!@````````"P"0``5```````````````!``````````,`@``
+M"0``````````````T*X#`"`````Q!```(`````0````(````+P(```$````&
+M``````````0*```P`0`````````````$`````````"L"```)````````````
+M``#PK@,`,````#$$```B````!`````@```!4`@```0````8`````````-`L`
+M`&````````````````0`````````4`(```D``````````````""O`P`8````
+M,00``"0````$````"````'P"```!````!@````````"4"P``6```````````
+M````!`````````",`@```0````8`````````[`L``#0```````````````0`
+M````````I`(```$````&`````````"`,``!0`@`````````````$````````
+M`*`"```)```````````````XKP,`.````#$$```H````!`````@```#%`@``
+M`0````8`````````<`X``,P```````````````0`````````P0(```D`````
+M`````````'"O`P`(````,00``"H````$````"````.0"```!````!@``````
+M```\#P``U`$`````````````!``````````$`P```0````8`````````$!$`
+M`$@#``````````````0```````````,```D``````````````'BO`P!8````
+M,00``"T````$````"````"P#```!````!@````````!8%```+```````````
+M````!``````````H`P``"0``````````````T*\#``@````Q!```+P````0`
+M```(````4`,```$````&`````````(04``"(```````````````$````````
+M`',#```!````!@`````````,%0``1`4`````````````!`````````!O`P``
+M"0``````````````V*\#`*`````Q!```,@````0````(````C@,```$````&
+M`````````%`:```D`0`````````````$`````````*H#```!````!@``````
+M``!T&P``2`$`````````````!`````````#-`P```0````8`````````O!P`
+M`(@!``````````````0`````````R0,```D``````````````'BP`P"`````
+M,00``#8````$````"````/4#```!````!@````````!$'@``8`(`````````
+M````!`````````#Q`P``"0``````````````^+`#`$`````Q!```.`````0`
+M```(````&00```$````&`````````*0@``#0`0`````````````$````````
+M`!4$```)```````````````XL0,`(````#$$```Z````!`````@```!`!```
+M`0````8`````````="(``/P"``````````````0`````````/`0```D`````
+M`````````%BQ`P!8````,00``#P````$````"````%P$```!````!@``````
+M``!P)0``V`L`````````````!`````````!8!```"0``````````````L+$#
+M`-@!```Q!```/@````0````(````=00```$````&`````````$@Q``!`````
+M```````````$`````````'$$```)``````````````"(LP,`*````#$$``!`
+M````!`````@```"=!````0````8`````````B#$``!P```````````````0`
+M````````F00```D``````````````+"S`P`(````,00``$(````$````"```
+M`+@$```!````!@````````"D,0``)```````````````!`````````#'!```
+M`0````8`````````R#$``!0```````````````0`````````V00```$````&
+M`````````-PQ```@```````````````$`````````/4$```!````!@``````
+M``#\,0``8```````````````!`````````#Q!```"0``````````````N+,#
+M`!@````Q!```1P````0````(````#04```$````&`````````%PR``!L````
+M```````````$``````````D%```)``````````````#0LP,`$````#$$``!)
+M````!`````@````J!0```0````8`````````R#(``&@```````````````0`
+M````````)@4```D``````````````."S`P`0````,00``$L````$````"```
+M`$H%```!````!@`````````P,P``0```````````````!`````````!&!0``
+M"0``````````````\+,#`!@````Q!```30````0````(````;04```$````&
+M`````````'`S``!,```````````````$`````````&D%```)````````````
+M```(M`,`"````#$$``!/````!`````@```"1!0```0````8`````````O#,`
+M`"@```````````````0`````````C04```D``````````````!"T`P`(````
+M,00``%$````$````"````*<%```!````!@````````#D,P``5```````````
+M````!`````````"C!0``"0``````````````&+0#`!@````Q!```4P````0`
+M```(````PP4```$````&`````````#@T```T```````````````$````````
+M`+\%```)```````````````PM`,`$````#$$``!5````!`````@```#;!0``
+M`0````8`````````;#0``"P```````````````0`````````UP4```D`````
+M`````````$"T`P`(````,00``%<````$````"````/<%```!````!@``````
+M``"8-```S`$`````````````!`````````#S!0``"0``````````````2+0#
+M`#`````Q!```60````0````(````"08```$````&`````````&0V```X````
+M```````````$``````````4&```)``````````````!XM`,`"````#$$``!;
+M````!`````@````:!@```0````8`````````G#8``#0```````````````0`
+M````````-P8```$````&`````````-`V``#H!``````````````$````````
+M`#,&```)``````````````"`M`,`P````#$$``!>````!`````@```!3!@``
+M`0````8`````````N#L``*0```````````````0`````````<@8```$````&
+M`````````%P\```@```````````````$`````````&X&```)````````````
+M``!`M0,`"````#$$``!A````!`````@```"8!@```0````8`````````?#P`
+M`*````````````````0`````````E`8```D``````````````$BU`P`0````
+M,00``&,````$````"````+$&```!````!@`````````</0``'```````````
+M````!`````````"M!@``"0``````````````6+4#``@````Q!```90````0`
+M```(````U@8```$````&`````````#@]``!H```````````````$````````
+M`-(&```)``````````````!@M0,`"````#$$``!G````!`````@```#M!@``
+M`0````8`````````H#T``)````````````````0`````````Z08```D`````
+M`````````&BU`P`0````,00``&D````$````"````!$'```!````!@``````
+M```P/@``A```````````````!``````````-!P``"0``````````````>+4#
+M`!`````Q!```:P````0````(````-`<```$````&`````````+0^``!X````
+M```````````$`````````#`'```)``````````````"(M0,`&````#$$``!M
+M````!`````@```!2!P```0````8`````````+#\``'@```````````````0`
+M````````3@<```D``````````````*"U`P`8````,00``&\````$````"```
+M`'('```!````!@````````"D/P``1```````````````!`````````!N!P``
+M"0``````````````N+4#`!@````Q!```<0````0````(````E0<```$````&
+M`````````.@_``!`!0`````````````$`````````)$'```)````````````
+M``#0M0,`N````#$$``!S````!`````@```"L!P```0````8`````````*$4`
+M``@```````````````0`````````J`<```D``````````````(BV`P`(````
+M,00``'4````$````"````+\'```!````!@`````````P10``+```````````
+M````!`````````#;!P```0````8`````````7$4```0```````````````0`
+M````````^@<```$````&`````````&!%``"4```````````````$````````
+M`!T(```!````!@````````#T10``3```````````````!``````````9"```
+M"0``````````````D+8#`"@````Q!```>@````0````(````/0@```$````&
+M`````````$!&``!4```````````````$`````````#D(```)````````````
+M``"XM@,`&````#$$``!\````!`````@```!8"````0````8`````````E$8`
+M`$P```````````````0`````````5`@```D``````````````-"V`P`@````
+M,00``'X````$````"````'T(```!````!@````````#@1@``$`$`````````
+M````!`````````!Y"```"0``````````````\+8#`%`````Q!```@`````0`
+M```(````H`@```$````&`````````/!'```4```````````````$````````
+M`)P(```)``````````````!`MP,`"````#$$``""````!`````@```##"```
+M`0````8`````````!$@``(@```````````````0`````````OP@```D`````
+M`````````$BW`P`(````,00``(0````$````"````.0(```!````!@``````
+M``",2```#```````````````!``````````""0```0````8`````````F$@`
+M`*P```````````````0`````````_@@```D``````````````%"W`P`8````
+M,00``(<````$````"````!P)```!````!@````````!$20``!```````````
+M````!``````````\"0```0````8`````````2$D``"P```````````````0`
+M````````.`D```D``````````````&BW`P`(````,00``(H````$````"```
+M`&$)```!````!@````````!T20``E```````````````!`````````!="0``
+M"0``````````````<+<#`$`````Q!```C`````0````(````A`D```$````&
+M``````````A*``!T```````````````$`````````(`)```)````````````
+M``"PMP,`$````#$$``".````!`````@```"H"0```0````8`````````?$H`
+M`$P!``````````````0`````````I`D```D``````````````,"W`P`X````
+M,00``)`````$````"````,D)```!````!@````````#(2P``&```````````
+M````!`````````#%"0``"0``````````````^+<#``@````Q!```D@````0`
+M```(````YPD```$````&`````````.!+```4```````````````$````````
+M`.,)```)````````````````N`,`"````#$$``"4````!`````@````%"@``
+M`0````8`````````]$L``!0```````````````0``````````0H```D`````
+M``````````BX`P`0````,00``)8````$````"````!X*```!````!@``````
+M```(3```!```````````````!``````````["@```0````8`````````#$P`
+M`#@```````````````0`````````-PH```D``````````````!BX`P`8````
+M,00``)D````$````"````%(*```!````!@````````!$3```/```````````
+M````!`````````!R"@```0````8`````````@$P```0```````````````0`
+M````````DPH```$````&`````````(1,```\```````````````$````````
+M`(\*```)```````````````PN`,`$````#$$``"=````!`````@```"P"@``
+M`0````8`````````P$P``#````````````````0`````````K`H```D`````
+M`````````$"X`P`0````,00``)\````$````"````,X*```!````!@``````
+M``#P3```*```````````````!`````````#*"@``"0``````````````4+@#
+M`!`````Q!```H0````0````(````ZPH```$````&`````````!A-```X````
+M```````````$`````````.<*```)``````````````!@N`,`$````#$$``"C
+M````!`````@````#"P```0````8`````````4$T``"0```````````````0`
+M````````_PH```D``````````````'"X`P`(````,00``*4````$````"```
+M`!L+```!````!@````````!T30``7```````````````!``````````7"P``
+M"0``````````````>+@#`!@````Q!```IP````0````(````.`L```$````&
+M`````````-!-```\```````````````$`````````#0+```)````````````
+M``"0N`,`$````#$$``"I````!`````@```!4"P```0````8`````````#$X`
+M`"````````````````0`````````4`L```D``````````````*"X`P`(````
+M,00``*L````$````"````'(+```!````!@`````````L3@``.```````````
+M````!`````````!N"P``"0``````````````J+@#`!`````Q!```K0````0`
+M```(````C`L```$````&`````````&1.```$```````````````$````````
+M`*D+```!````!@````````!H3@``#```````````````!`````````#*"P``
+M`0````8`````````=$X``+@```````````````0`````````Q@L```D`````
+M`````````+BX`P`P````,00``+$````$````"````.<+```!````!@``````
+M```L3P``0```````````````!`````````#C"P``"0``````````````Z+@#
+M`!@````Q!```LP````0````(``````P```$````&`````````&Q/```0````
+M```````````$`````````/P+```)````````````````N0,`"````#$$``"U
+M````!`````@````9#````0````8`````````?$\``"0```````````````0`
+M````````%0P```D```````````````BY`P`0````,00``+<````$````"```
+M`#(,```!````!@````````"@3P``1```````````````!``````````N#```
+M"0``````````````&+D#`!@````Q!```N0````0````(````4`P```$````&
+M`````````.1/```D```````````````$`````````$P,```)````````````
+M```PN0,`"````#$$``"[````!`````@```!R#````0````8`````````"%``
+M`&````````````````0`````````;@P```D``````````````#BY`P`H````
+M,00``+T````$````"````)0,```!````!@````````!H4```3```````````
+M````!`````````"0#```"0``````````````8+D#`!@````Q!```OP````0`
+M```(````L`P```$````&`````````+10```<```````````````$````````
+M`*P,```)``````````````!XN0,`$````#$$``#!````!`````@```#,#```
+M`0````8`````````T%```&@```````````````0`````````R`P```D`````
+M`````````(BY`P`@````,00``,,````$````"````.H,```!````!@``````
+M```X40``'```````````````!`````````#F#```"0``````````````J+D#
+M`!`````Q!```Q0````0````(````!`T```$````&`````````%11```4````
+M```````````$`````````"(-```!````!@````````!H40``7```````````
+M````!``````````>#0``"0``````````````N+D#`"`````Q!```R`````0`
+M```(````0`T```$````&`````````,11``!T```````````````$````````
+M`#P-```)``````````````#8N0,`(````#$$``#*````!`````@```!>#0``
+M`0````8`````````.%(``"0```````````````0`````````6@T```D`````
+M`````````/BY`P`0````,00``,P````$````"````'@-```!````!@``````
+M``!<4@``!```````````````!`````````"2#0```0````8`````````8%(`
+M``0```````````````0`````````KPT```$````&`````````&12```$````
+M```````````$`````````,8-```!````!@````````!H4@``!```````````
+M````!`````````#:#0```0````8`````````;%(```0```````````````0`
+M````````\PT```$````&`````````'!2```8```````````````$````````
+M`.\-```)```````````````(N@,`"````#$$``#3````!`````@````1#@``
+M`0````8`````````B%(``#P```````````````0`````````#0X```D`````
+M`````````!"Z`P`0````,00``-4````$````"````"\.```!````!@``````
+M``#$4@``%```````````````!``````````K#@``"0``````````````(+H#
+M``@````Q!```UP````0````(````3`X```$````&`````````-A2``!(````
+M```````````$`````````$@.```)```````````````HN@,`(````#$$``#9
+M````!`````@```!M#@```0````8`````````(%,``)@```````````````0`
+M````````:0X```D``````````````$BZ`P!(````,00``-L````$````"```
+M`(\.```!````!@````````"X4P``2```````````````!`````````"+#@``
+M"0``````````````D+H#`"`````Q!```W0````0````(````L0X```$````&
+M``````````!4``!````````````````$`````````*T.```)````````````
+M``"PN@,`&````#$$``#?````!`````@```#.#@```0````8`````````0%0`
+M`!@```````````````0`````````R@X```D``````````````,BZ`P`(````
+M,00``.$````$````"````.L.```!````!@````````!85```+```````````
+M````!`````````#G#@``"0``````````````T+H#`!@````Q!```XP````0`
+M```(````"`\```$````&`````````(14```,```````````````$````````
+M``0/```)``````````````#HN@,`"````#$$``#E````!`````@````@#P``
+M`0````8`````````D%0```P```````````````0`````````'`\```D`````
+M`````````/"Z`P`(````,00``.<````$````"````#@/```!````!@``````
+M``"<5```#```````````````!``````````T#P``"0``````````````^+H#
+M``@````Q!```Z0````0````(````5@\```$````&`````````*A4```X````
+M```````````$`````````%(/```)````````````````NP,`&````#$$``#K
+M````!`````@```!U#P```0````8`````````X%0``"````````````````0`
+M````````<0\```D``````````````!B[`P`0````,00``.T````$````"```
+M`)4/```!````!@``````````50``(```````````````!`````````"1#P``
+M"0``````````````*+L#`!`````Q!```[P````0````(````M`\```$````&
+M`````````"!5```D```````````````$`````````+`/```)````````````
+M```XNP,`$````#$$``#Q````!`````@```#7#P```0````8`````````1%4`
+M`$@```````````````0`````````TP\```D``````````````$B[`P`8````
+M,00``/,````$````"````/\/```!````!@````````",50``2```````````
+M````!`````````#[#P``"0``````````````8+L#`!@````Q!```]0````0`
+M```(````)Q````$````&`````````-15```0```````````````$````````
+M`",0```)``````````````!XNP,`"````#$$``#W````!`````@```!#$```
+M`0````8`````````Y%4``"@```````````````0`````````/Q````D`````
+M`````````("[`P`(````,00``/D````$````"````%L0```!````!@``````
+M```,5@``G```````````````!`````````!W$````0````8`````````J%8`
+M`(`!``````````````0`````````<Q````D``````````````(B[`P`0````
+M,00``/P````$````"````)(0```!````!@`````````H6```S`4`````````
+M````!`````````".$```"0``````````````F+L#`$@"```Q!```_@````0`
+M```(````J!````$````&`````````/1=``!X```````````````$````````
+M`*00```)``````````````#@O0,`$````#$$`````0``!`````@```#)$```
+M`0````8`````````;%X``!````````````````0`````````Q1````D`````
+M`````````/"]`P`(````,00```(!```$````"````.80```!````!@``````
+M``!\7@``#```````````````!`````````#B$```"0``````````````^+T#
+M``@````Q!```!`$```0````(`````1$```$````&`````````(A>``!(````
+M```````````$`````````/T0```)````````````````O@,`*````#$$```&
+M`0``!`````@````9$0```0````8`````````T%X``(0```````````````0`
+M````````%1$```D``````````````"B^`P!`````,00```@!```$````"```
+M`#,1```!````!@````````!47P``,`(`````````````!``````````O$0``
+M"0``````````````:+X#`#@!```Q!```"@$```0````(````4A$```$````&
+M`````````(1A``!8```````````````$`````````$X1```)````````````
+M``"@OP,`(````#$$```,`0``!`````@```!N$0```0````8`````````W&$`
+M`(P```````````````0`````````:A$```D``````````````,"_`P`(````
+M,00```X!```$````"````($1```!````!@````````!H8@``I```````````
+M````!`````````!]$0``"0``````````````R+\#`!`````Q!```$`$```0`
+M```(````D!$```$````&``````````QC```4```````````````$````````
+M`+`1```!````!@`````````@8P``4`(`````````````!`````````"L$0``
+M"0``````````````V+\#`'@````Q!```$P$```0````(````S1$```$````&
+M`````````'!E``!$`@`````````````$`````````,D1```)````````````
+M``!0P`,`8````#$$```5`0``!`````@```#N$0```0````8`````````M&<`
+M`$P```````````````0`````````ZA$```D``````````````+#``P`@````
+M,00``!<!```$````"`````D2```!````!@``````````:```(```````````
+M````!``````````%$@``"0``````````````T,`#``@````Q!```&0$```0`
+M```(````)Q(```$````&`````````"!H``!P```````````````$````````
+M`",2```)``````````````#8P`,`*````#$$```;`0``!`````@```!!$@``
+M`0````8`````````D&@```0```````````````0`````````61(```$````&
+M`````````)1H```$```````````````$`````````',2```!````!@``````
+M``"8:```)```````````````!`````````!O$@``"0```````````````,$#
+M``@````Q!```'P$```0````(````DQ(```$````&`````````+QH```H````
+M```````````$`````````(\2```)```````````````(P0,`"````#$$```A
+M`0``!`````@```"S$@```0````8`````````Y&@``(@```````````````0`
+M````````KQ(```D``````````````!#!`P`0````,00``",!```$````"```
+M`,P2```!````!@````````!L:0``=```````````````!`````````#K$@``
+M`0````8`````````X&D``'`"``````````````0`````````YQ(```D`````
+M`````````"#!`P"`````,00``"8!```$````"`````@3```!````!@``````
+M``!0;```*```````````````!``````````$$P``"0``````````````H,$#
+M``@````Q!```*`$```0````(````(!,```$````&`````````'AL```T````
+M```````````$`````````!P3```)``````````````"HP0,`"````#$$```J
+M`0``!`````@````X$P```0````8`````````K&P``%P```````````````0`
+M````````-!,```D``````````````+#!`P`P````,00``"P!```$````"```
+M`%H3```!````!@`````````(;0``4```````````````!`````````!6$P``
+M"0``````````````X,$#`!`````Q!```+@$```0````(````=1,```$````&
+M`````````%AM```P```````````````$`````````'$3```)````````````
+M``#PP0,`"````#$$```P`0``!`````@```"2$P```0````8`````````B&T`
+M`'@```````````````0`````````CA,```D``````````````/C!`P`H````
+M,00``#(!```$````"````*@3```!````!@``````````;@``*`$`````````
+M````!`````````#`$P```0````8`````````*&\```0```````````````0`
+M````````V1,```$````&`````````"QO```L```````````````$````````
+M`/,3```!````!@````````!8;P``O```````````````!``````````*%```
+M`0````8`````````%'```-P```````````````0`````````(10```$````&
+M`````````/!P```$```````````````$`````````#P4```!````!@``````
+M``#T<```#```````````````!`````````!6%````0````8``````````'$`
+M`$P```````````````0`````````4A0```D``````````````"#"`P`@````
+M,00``#L!```$````"````'(4```!````!@````````!,<0``!`0`````````
+M````!`````````!N%```"0``````````````0,(#`/`````Q!```/0$```0`
+M```(````B10```$````&`````````%!U```8```````````````$````````
+M`(44```)```````````````PPP,`$````#$$```_`0``!`````@```"@%```
+M`0````8`````````:'4``-0```````````````0`````````G!0```D`````
+M`````````$##`P!(````,00``$$!```$````"````+44```!````!@``````
+M```\=@``7```````````````!`````````#1%````0````8`````````F'8`
+M``0```````````````0`````````]!0```$````&`````````)QV```(`0``
+M```````````$`````````/`4```)``````````````"(PP,`$````#$$``!%
+M`0``!`````@````7%0```0````8`````````I'<``$P```````````````0`
+M````````$Q4```D``````````````)C#`P`H````,00``$<!```$````"```
+M`#<5```!````!@````````#P=P``9```````````````!``````````S%0``
+M"0``````````````P,,#`!@````Q!```20$```0````(````4A4```$````&
+M`````````%1X``!,```````````````$`````````$X5```)````````````
+M``#8PP,`(````#$$``!+`0``!`````@```!W%0```0````8`````````H'@`
+M```!``````````````0`````````<Q4```D``````````````/C#`P!@````
+M,00``$T!```$````"````)H5```!````!@````````"@>0``%```````````
+M````!`````````"6%0``"0``````````````6,0#``@````Q!```3P$```0`
+M```(````O14```$````&`````````+1Y``#P```````````````$````````
+M`+D5```)``````````````!@Q`,`,````#$$``!1`0``!`````@```#>%0``
+M`0````8`````````I'H```P```````````````0`````````_!4```$````&
+M`````````+!Z``#$```````````````$`````````/@5```)````````````
+M``"0Q`,`(````#$$``!4`0``!`````@````6%@```0````8`````````='L`
+M``0```````````````0`````````-A8```$````&`````````'A[```L````
+M```````````$`````````#(6```)``````````````"PQ`,`"````#$$``!7
+M`0``!`````@```!;%@```0````8`````````I'L``)0```````````````0`
+M````````5Q8```D``````````````+C$`P!`````,00``%D!```$````"```
+M`'X6```!````!@`````````X?```=```````````````!`````````!Z%@``
+M"0``````````````^,0#`!`````Q!```6P$```0````(````HA8```$````&
+M`````````*Q\``!D`0`````````````$`````````)X6```)````````````
+M```(Q0,`.````#$$``!=`0``!`````@```##%@```0````8`````````$'X`
+M`!@```````````````0`````````OQ8```D``````````````$#%`P`(````
+M,00``%\!```$````"````.$6```!````!@`````````H?@``%```````````
+M````!`````````#=%@``"0``````````````2,4#``@````Q!```80$```0`
+M```(````_Q8```$````&`````````#Q^```4```````````````$````````
+M`/L6```)``````````````!0Q0,`$````#$$``!C`0``!`````@````8%P``
+M`0````8`````````4'X```0```````````````0`````````-1<```$````&
+M`````````%1^``!,```````````````$`````````#$7```)````````````
+M``!@Q0,`(````#$$``!F`0``!`````@```!,%P```0````8`````````H'X`
+M`#P```````````````0`````````;!<```$````&`````````-Q^```\````
+M```````````$`````````(T7```!````!@`````````8?P``8```````````
+M````!`````````")%P``"0``````````````@,4#`"@````Q!```:@$```0`
+M```(````JA<```$````&`````````'A_```H```````````````$````````
+M`*87```)``````````````"HQ0,`$````#$$``!L`0``!`````@```#(%P``
+M`0````8`````````H'\``"@```````````````0`````````Q!<```D`````
+M`````````+C%`P`0````,00``&X!```$````"````.47```!````!@``````
+M``#(?P``.```````````````!`````````#A%P``"0``````````````R,4#
+M`!`````Q!```<`$```0````(````_1<```$````&``````````"````D````
+M```````````$`````````/D7```)``````````````#8Q0,`"````#$$``!R
+M`0``!`````@````5&````0````8`````````)(```$P```````````````0`
+M````````$1@```D``````````````.#%`P`8````,00``'0!```$````"```
+M`#$8```!````!@````````!P@```.```````````````!``````````M&```
+M"0``````````````^,4#`!@````Q!```=@$```0````(````31@```$````&
+M`````````*B```!\```````````````$`````````$D8```)````````````
+M```0Q@,`&````#$$``!X`0``!`````@```!J&````0````8`````````)($`
+M`$````````````````0`````````9A@```D``````````````"C&`P`8````
+M,00``'H!```$````"````(,8```!````!@````````!D@0``$```````````
+M````!`````````!_&```"0``````````````0,8#``@````Q!```?`$```0`
+M```(````G!@```$````&`````````'2!```D```````````````$````````
+M`)@8```)``````````````!(Q@,`$````#$$``!^`0``!`````@```"U&```
+M`0````8`````````F($``$0```````````````0`````````L1@```D`````
+M`````````%C&`P`8````,00``(`!```$````"````-,8```!````!@``````
+M``#<@0``/```````````````!`````````#/&```"0``````````````<,8#
+M``@````Q!```@@$```0````(````]1@```$````&`````````!B"``!@````
+M```````````$`````````/$8```)``````````````!XQ@,`*````#$$``"$
+M`0``!`````@````7&0```0````8`````````>((``$@```````````````0`
+M````````$QD```D``````````````*#&`P`8````,00``(8!```$````"```
+M`#,9```!````!@````````#`@@``'```````````````!``````````O&0``
+M"0``````````````N,8#`!`````Q!```B`$```0````(````3QD```$````&
+M`````````-R"``!H```````````````$`````````$L9```)````````````
+M``#(Q@,`(````#$$``"*`0``!`````@```!M&0```0````8`````````1(,`
+M`!P```````````````0`````````:1D```D``````````````.C&`P`0````
+M,00``(P!```$````"````(<9```!````!@````````!@@P``%```````````
+M````!`````````"E&0```0````8`````````=(,``%P```````````````0`
+M````````H1D```D``````````````/C&`P`@````,00``(\!```$````"```
+M`,,9```!````!@````````#0@P``=```````````````!`````````"_&0``
+M"0``````````````&,<#`"`````Q!```D0$```0````(````X1D```$````&
+M`````````$2$```D```````````````$`````````-T9```)````````````
+M```XQP,`$````#$$``"3`0``!`````@```#[&0```0````8`````````:(0`
+M``0```````````````0`````````%1H```$````&`````````&R$```$````
+M```````````$`````````#(:```!````!@````````!PA```!```````````
+M````!`````````!)&@```0````8`````````=(0```0```````````````0`
+M````````71H```$````&`````````'B$```$```````````````$````````
+M`'8:```!````!@````````!\A```%```````````````!`````````!R&@``
+M"0``````````````2,<#``@````Q!```F@$```0````(````D1H```$````&
+M`````````)"$```4```````````````$`````````(T:```)````````````
+M``!0QP,`"````#$$``"<`0``!`````@```"O&@```0````8`````````I(0`
+M`!0```````````````0`````````JQH```D``````````````%C'`P`(````
+M,00``)X!```$````"````,D:```!````!@````````"XA```#```````````
+M````!`````````#J&@```0````8`````````Q(0``"0```````````````0`
+M````````YAH```D``````````````&#'`P`(````,00``*$!```$````"```
+M``L;```!````!@````````#HA```'```````````````!``````````'&P``
+M"0``````````````:,<#``@````Q!```HP$```0````(````*1L```$````&
+M``````````2%```T```````````````$`````````"4;```)````````````
+M``!PQP,`$````#$$``"E`0``!`````@```!'&P```0````8`````````.(4`
+M`"````````````````0`````````0QL```D``````````````(#'`P`(````
+M,00``*<!```$````"````&0;```!````!@````````!8A0``F```````````
+M````!`````````!@&P``"0``````````````B,<#`$@````Q!```J0$```0`
+M```(````AAL```$````&`````````/"%``!(```````````````$````````
+M`((;```)``````````````#0QP,`(````#$$``"K`0``!`````@```"H&P``
+M`0````8`````````.(8``$@```````````````0`````````I!L```D`````
+M`````````/#'`P`@````,00``*T!```$````"````-$;```!````!@``````
+M``"`A@``0```````````````!`````````#-&P``"0``````````````$,@#
+M`!@````Q!```KP$```0````(````[AL```$````&`````````,"&```8````
+M```````````$`````````.H;```)```````````````HR`,`"````#$$``"Q
+M`0``!`````@````+'````0````8`````````V(8``#P```````````````0`
+M````````!QP```D``````````````##(`P`@````,00``+,!```$````"```
+M`"@<```!````!@`````````4AP``#```````````````!``````````D'```
+M"0``````````````4,@#``@````Q!```M0$```0````(````0!P```$````&
+M`````````""'```,```````````````$`````````#P<```)````````````
+M``!8R`,`"````#$$``"W`0``!`````@```!8'````0````8`````````+(<`
+M``P```````````````0`````````5!P```D``````````````&#(`P`(````
+M,00``+D!```$````"````'8<```!````!@`````````XAP``)```````````
+M````!`````````!R'```"0``````````````:,@#`!`````Q!```NP$```0`
+M```(````E1P```$````&`````````%R'```@```````````````$````````
+M`)$<```)``````````````!XR`,`$````#$$``"]`0``!`````@```"U'```
+M`0````8`````````?(<``"````````````````0`````````L1P```D`````
+M`````````(C(`P`0````,00``+\!```$````"````-0<```!````!@``````
+M``"<AP``)```````````````!`````````#0'```"0``````````````F,@#
+M`!`````Q!```P0$```0````(````]QP```$````&`````````,"'``!(````
+M```````````$`````````/,<```)``````````````"HR`,`&````#$$``##
+M`0``!`````@````?'0```0````8`````````"(@``$@```````````````0`
+M````````&QT```D``````````````,#(`P`8````,00``,4!```$````"```
+M`$<=```!````!@````````!0B```$```````````````!`````````!#'0``
+M"0``````````````V,@#``@````Q!```QP$```0````(````8QT```$````&
+M`````````&"(```0```````````````$`````````%\=```)````````````
+M``#@R`,`"````#$$``#)`0``!`````@```!['0```0````8`````````<(@`
+M`)P```````````````0`````````EQT```$````&``````````R)```T`0``
+M```````````$`````````),=```)``````````````#HR`,`"````#$$``#,
+M`0``!`````@```"R'0```0````8`````````0(H``!`(``````````````0`
+M````````KAT```D``````````````/#(`P"(`@``,00``,X!```$````"```
+M`,@=```!````!@````````!0D@``#```````````````!`````````#$'0``
+M"0``````````````>,L#``@````Q!```T`$```0````(````XQT```$````&
+M`````````%R2```P```````````````$`````````-\=```)````````````
+M``"`RP,`&````#$$``#2`0``!`````@```#['0```0````8`````````C)(`
+M`"P!``````````````0`````````]QT```D``````````````)C+`P"`````
+M,00``-0!```$````"````!4>```!````!@````````"XDP``1`$`````````
+M````!``````````1'@``"0``````````````&,P#`'`````Q!```U@$```0`
+M```(````-!X```$````&`````````/R4``!8```````````````$````````
+M`#`>```)``````````````"(S`,`*````#$$``#8`0``!`````@```!0'@``
+M`0````8`````````5)4``.@```````````````0`````````3!X```D`````
+M`````````+#,`P`X````,00``-H!```$````"````&L>```!````!@``````
+M```\E@``(```````````````!`````````!G'@``"0``````````````Z,P#
+M``@````Q!```W`$```0````(````B1X```$````&`````````%R6``"4````
+M```````````$`````````(4>```)``````````````#PS`,`.````#$$``#>
+M`0``!`````@```"C'@```0````8`````````\)8``)````````````````0`
+M````````P1X```$````&`````````("7``!<```````````````$````````
+M`+T>```)```````````````HS0,`&````#$$``#A`0``!`````@```#:'@``
+M`0````8`````````W)<``)````````````````0`````````UAX```D`````
+M`````````$#-`P`P````,00``.,!```$````"````/@>```!````!@``````
+M``!LF```.```````````````!`````````#T'@``"0``````````````<,T#
+M`!`````Q!```Y0$```0````(````%!\```$````&`````````*28```,`P``
+M```````````$`````````!`?```)``````````````"`S0,`.````#$$``#G
+M`0``!`````@````O'P```0````8`````````L)L``/@```````````````0`
+M````````*Q\```D``````````````+C-`P`0````,00``.D!```$````"```
+M`%@?```!````!@````````"HG```P`(`````````````!`````````!4'P``
+M"0``````````````R,T#`*`````Q!```ZP$```0````(````=Q\```$````&
+M`````````&B?```@```````````````$`````````',?```)````````````
+M``!HS@,`"````#$$``#M`0``!`````@```"7'P```0````8`````````B)\`
+M`$@!``````````````0`````````DQ\```D``````````````'#.`P`8````
+M,00``.\!```$````"````+@?```!````!@````````#0H```M`(`````````
+M````!`````````"T'P``"0``````````````B,X#`%@````Q!```\0$```0`
+M```(````UA\```$````&`````````(2C``!D!``````````````$````````
+M`-(?```)``````````````#@S@,`4````#$$``#S`0``!`````@```#S'P``
+M`0````8`````````Z*<``"0!``````````````0`````````[Q\```D`````
+M`````````##/`P!8````,00``/4!```$````"`````X@```!````!@``````
+M```,J0``?```````````````!``````````N(````0````8`````````B*D`
+M`+P```````````````0`````````*B````D``````````````(C/`P`0````
+M,00``/@!```$````"````$\@```!````!@````````!$J@``A```````````
+M````!`````````!S(````0````8`````````R*H``$0```````````````0`
+M````````;R````D``````````````)C/`P`(````,00``/L!```$````"```
+M`)<@```!````!@`````````,JP``+```````````````!`````````"3(```
+M"0``````````````H,\#``@````Q!```_0$```0````(````N"````$````&
+M`````````#BK``!,```````````````$`````````-P@```!````!@``````
+M``"$JP``-```````````````!`````````#8(```"0``````````````J,\#
+M``@````Q!`````(```0````(````^B````$````&`````````+BK``!\````
+M```````````$`````````/8@```)``````````````"PSP,`*````#$$```"
+M`@``!`````@````0(0```0````8`````````-*P``!@```````````````0`
+M````````,R$```$````&`````````$RL``#@```````````````$````````
+M`"\A```)``````````````#8SP,`$````#$$```%`@``!`````@```!*(0``
+M`0````8`````````+*T``$0```````````````0`````````9"$```$````&
+M`````````'"M``!L```````````````$`````````&`A```)````````````
+M``#HSP,`$````#$$```(`@``!`````@```"%(0```0````8`````````W*T`
+M`!````````````````0`````````@2$```D``````````````/C/`P`(````
+M,00```H"```$````"````*(A```!````!@````````#LK0``=```````````
+M````!`````````">(0``"0```````````````-`#`#`````Q!```#`(```0`
+M```(````Q"$```$````&`````````&"N```D```````````````$````````
+M`,`A```)```````````````PT`,`"````#$$```.`@``!`````@```#D(0``
+M`0````8`````````A*X``"@```````````````0`````````X"$```D`````
+M`````````#C0`P`(````,00``!`"```$````"`````0B```!````!@``````
+M``"LK@``I```````````````!```````````(@``"0``````````````0-`#
+M`!`````Q!```$@(```0````(````(2(```$````&`````````%"O``#X````
+M```````````$`````````!TB```)``````````````!0T`,`0````#$$```4
+M`@``!`````@````\(@```0````8`````````2+```(````````````````0`
+M````````."(```D``````````````)#0`P`(````,00``!8"```$````"```
+M`%LB```!````!@````````#(L```T`,`````````````!`````````!7(@``
+M"0``````````````F-`#`-@````Q!```&`(```0````(````>"(```$````&
+M`````````)BT```0```````````````$`````````'0B```)````````````
+M``!PT0,`"````#$$```:`@``!`````@```"0(@```0````8`````````J+0`
+M`!0```````````````0`````````C"(```D``````````````'C1`P`(````
+M,00``!P"```$````"````*@B```!````!@````````"\M```%```````````
+M````!`````````"D(@``"0``````````````@-$#``@````Q!```'@(```0`
+M```(````PR(```$````&`````````-"T```X```````````````$````````
+M`+\B```)``````````````"(T0,`$````#$$```@`@``!`````@```#@(@``
+M`0````8`````````"+4``$P```````````````0`````````W"(```D`````
+M`````````)C1`P`@````,00``"("```$````"````/8B```!````!@``````
+M``!4M0``^```````````````!``````````.(P```0````8`````````3+8`
+M``0```````````````0`````````)R,```$````&`````````%"V```L````
+M```````````$`````````$$C```!````!@````````!\M@``O```````````
+M````!`````````!8(P```0````8`````````.+<``/0```````````````0`
+M````````;R,```$````&`````````"RX```$```````````````$````````
+M`(HC```!````!@`````````PN```.```````````````!`````````"D(P``
+M`0````8`````````:+@``)0```````````````0`````````H",```D`````
+M`````````+C1`P!0````,00``"L"```$````"````,4C```!````!@``````
+M``#\N```3```````````````!`````````#!(P``"0``````````````"-(#
+M`"`````Q!```+0(```0````(````X2,```$````&`````````$BY``"8````
+M```````````$`````````-TC```)```````````````HT@,`*````#$$```O
+M`@``!`````@```#V(P```0````8`````````X+D``!0```````````````0`
+M````````$B0```$````&`````````/2Y```$`0`````````````$````````
+M``XD```)``````````````!0T@,`(````#$$```R`@``!`````@````L)```
+M`0````8`````````^+H``#@```````````````0`````````*"0```D`````
+M`````````'#2`P`(````,00``#0"```$````"````$LD```!````!@``````
+M```PNP``T`4`````````````!`````````!')```"0``````````````>-(#
+M`"@!```Q!```-@(```0````(````8B0```$````&``````````#!``!$````
+M```````````$`````````%XD```)``````````````"@TP,`,````#$$```X
+M`@``!`````@```!Y)````0````8`````````1,$``-0```````````````0`
+M````````=20```D``````````````-#3`P!(````,00``#H"```$````"```
+M`(XD```!````!@`````````8P@``:```````````````!`````````"N)```
+M`0````8`````````@,(``&0$``````````````0`````````JB0```D`````
+M`````````!C4`P`0````,00``#T"```$````"````-$D```!````!@``````
+M``#DQ@``$```````````````!`````````#-)```"0``````````````*-0#
+M``@````Q!```/P(```0````(````\20```$````&`````````/3&```8````
+M```````````$`````````.TD```)```````````````PU`,`$````#$$``!!
+M`@``!`````@````*)0```0````8`````````#,<``(````````````````0`
+M````````!B4```D``````````````$#4`P`X````,00``$,"```$````"```
+M`"HE```!````!@````````",QP``9```````````````!``````````F)0``
+M"0``````````````>-0#`!@````Q!```10(```0````(````124```$````&
+M`````````/#'``!,```````````````$`````````$$E```)````````````
+M``"0U`,`(````#$$``!'`@``!`````@```!J)0```0````8`````````/,@`
+M`%`!``````````````0`````````9B4```D``````````````+#4`P!H````
+M,00``$D"```$````"````(TE```!````!@````````",R0``3```````````
+M````!`````````"))0``"0``````````````&-4#`"`````Q!```2P(```0`
+M```(````J"4```$````&`````````-C)```H```````````````$````````
+M`*0E```)```````````````XU0,`$````#$$``!-`@``!`````@```#&)0``
+M`0````8``````````,H``"@```````````````0`````````PB4```D`````
+M`````````$C5`P`0````,00``$\"```$````"````.,E```!````!@``````
+M```HR@``.```````````````!`````````#?)0``"0``````````````6-4#
+M`!`````Q!```40(```0````(````^R4```$````&`````````&#*```D````
+M```````````$`````````/<E```)``````````````!HU0,`"````#$$``!3
+M`@``!`````@````3)@```0````8`````````A,H``%@```````````````0`
+M````````#R8```D``````````````'#5`P`8````,00``%4"```$````"```
+M`"\F```!````!@````````#<R@``&```````````````!``````````K)@``
+M"0``````````````B-4#``@````Q!```5P(```0````(````4B8```$````&
+M`````````/3*``"L`0`````````````$`````````$XF```)````````````
+M``"0U0,`4````#$$``!9`@``!`````@```!S)@```0````8`````````H,P`
+M``P```````````````0`````````D28```$````&`````````*S,```X`0``
+M```````````$`````````(TF```)``````````````#@U0,`,````#$$``!<
+M`@``!`````@```"K)@```0````8`````````Y,T```P```````````````0`
+M````````RR8```$````&`````````/#-```T```````````````$````````
+M`,<F```)```````````````0U@,`"````#$$``!?`@``!`````@```#P)@``
+M`0````8`````````),X```P!``````````````0`````````["8```D`````
+M`````````!C6`P!H````,00``&$"```$````"````!,G```!````!@``````
+M```PSP``>```````````````!``````````/)P``"0``````````````@-8#
+M`!`````Q!```8P(```0````(````-R<```$````&`````````*C/``!D`P``
+M```````````$`````````#,G```)``````````````"0U@,`R````#$$``!E
+M`@``!`````@```!8)P```0````8`````````#-,``!@```````````````0`
+M````````5"<```D``````````````%C7`P`(````,00``&<"```$````"```
+M`'8G```!````!@`````````DTP``%```````````````!`````````!R)P``
+M"0``````````````8-<#``@````Q!```:0(```0````(````E"<```$````&
+M`````````#C3```8```````````````$`````````)`G```)````````````
+M``!HUP,`"````#$$``!K`@``!`````@```"Q)P```0````8`````````4-,`
+M`'0```````````````0`````````K2<```D``````````````'#7`P`8````
+M,00``&T"```$````"````,HG```!````!@````````#$TP``/```````````
+M````!`````````#J)P```0````8``````````-0``'0```````````````0`
+M````````"R@```$````&`````````'34``"````````````````$````````
+M``<H```)``````````````"(UP,`*````#$$``!Q`@``!`````@````H*```
+M`0````8`````````]-0``#@```````````````0`````````)"@```D`````
+M`````````+#7`P`8````,00``',"```$````"````$0H```!````!@``````
+M```LU0``?```````````````!`````````!`*```"0``````````````R-<#
+M`!@````Q!```=0(```0````(````82@```$````&`````````*C5``!`````
+M```````````$`````````%TH```)``````````````#@UP,`&````#$$``!W
+M`@``!`````@```!Z*````0````8`````````Z-4``!````````````````0`
+M````````=B@```D``````````````/C7`P`(````,00``'D"```$````"```
+M`),H```!````!@````````#XU0``,```````````````!`````````"/*```
+M"0```````````````-@#`!@````Q!```>P(```0````(````K"@```$````&
+M`````````"C6``!\```````````````$`````````*@H```)````````````
+M```8V`,`$````#$$``!]`@``!`````@```#)*````0````8`````````I-8`
+M`$0```````````````0`````````Q2@```D``````````````"C8`P`8````
+M,00``'\"```$````"````.<H```!````!@````````#HU@``/```````````
+M````!`````````#C*```"0``````````````0-@#``@````Q!```@0(```0`
+M```(````"2D```$````&`````````"37``!@```````````````$````````
+M``4I```)``````````````!(V`,`*````#$$``"#`@``!`````@````G*0``
+M`0````8`````````A-<```0```````````````0`````````52D```$````&
+M`````````(C7```4```````````````$`````````%$I```)````````````
+M``!PV`,`"````#$$``"&`@``!`````@```!P*0```0````8`````````G-<`
+M`!0```````````````0`````````;"D```D``````````````'C8`P`(````
+M,00``(@"```$````"````(XI```!````!@````````"PUP``%```````````
+M````!`````````"**0``"0``````````````@-@#``@````Q!```B@(```0`
+M```(````J"D```$````&`````````,37```,```````````````$````````
+M`,DI```!````!@````````#0UP``)```````````````!`````````#%*0``
+M"0``````````````B-@#``@````Q!```C0(```0````(````YBD```$````&
+M`````````/37```$```````````````$``````````\J```!````!@``````
+M``#XUP``3```````````````!``````````+*@``"0``````````````D-@#
+M`!@````Q!```D`(```0````(````*RH```$````&`````````$38```<````
+M```````````$`````````"<J```)``````````````"HV`,`$````#$$``"2
+M`@``!`````@```!'*@```0````8`````````8-@``&@```````````````0`
+M````````0RH```D``````````````+C8`P`@````,00``)0"```$````"```
+M`&4J```!````!@````````#(V```'```````````````!`````````!A*@``
+M"0``````````````V-@#`!`````Q!```E@(```0````(````?RH```$````&
+M`````````.38```4```````````````$`````````)TJ```!````!@``````
+M``#XV```7```````````````!`````````"9*@``"0``````````````Z-@#
+M`"`````Q!```F0(```0````(````NRH```$````&`````````%39``!T````
+M```````````$`````````+<J```)```````````````(V0,`(````#$$``";
+M`@``!`````@```#9*@```0````8`````````R-D``"0```````````````0`
+M````````U2H```D``````````````"C9`P`0````,00``)T"```$````"```
+M`/<J```!````!@````````#LV0``3```````````````!`````````#S*@``
+M"0``````````````.-D#`!`````Q!```GP(```0````(````%2L```$````&
+M`````````#C:``#P```````````````$`````````!$K```)````````````
+M``!(V0,`(````#$$``"A`@``!`````@````V*P```0````8`````````*-L`
+M`!````````````````0`````````,BL```D``````````````&C9`P`(````
+M,00``*,"```$````"````$\K```!````!@`````````XVP``,```````````
+M````!`````````!M*P```0````8`````````:-L````"``````````````0`
+M````````:2L```D``````````````'#9`P#P````,00``*8"```$````"```
+M`(@K```!````!@````````!HW0``^```````````````!`````````"$*P``
+M"0``````````````8-H#`'`````Q!```J`(```0````(````I2L```$````&
+M`````````&#>```L```````````````$`````````*$K```)````````````
+M``#0V@,`"````#$$``"J`@``!`````@```#!*P```0````8`````````C-X`
+M`.0!``````````````0`````````O2L```D``````````````-C:`P`H````
+M,00``*P"```$````"````-\K```!````!@````````!PX```G`$`````````
+M````!`````````#;*P``"0```````````````-L#`#`````Q!```K@(```0`
+M```(````_2L```$````&``````````SB```@```````````````$````````
+M`/DK```)```````````````PVP,`"````#$$``"P`@``!`````@````:+```
+M`0````8`````````+.(``)@```````````````0`````````%BP```D`````
+M`````````#C;`P!(````,00``+("```$````"````#PL```!````!@``````
+M``#$X@``4```````````````!``````````X+```"0``````````````@-L#
+M`"`````Q!```M`(```0````(````7BP```$````&`````````!3C``!0````
+M```````````$`````````%HL```)``````````````"@VP,`(````#$$``"V
+M`@``!`````@```"'+````0````8`````````9.,``$````````````````0`
+M````````@RP```D``````````````,#;`P`8````,00``+@"```$````"```
+M`*0L```!````!@````````"DXP``&```````````````!`````````"@+```
+M"0``````````````V-L#``@````Q!```N@(```0````(````P2P```$````&
+M`````````+SC``"X```````````````$`````````+TL```)````````````
+M``#@VP,`2````#$$``"\`@``!`````@```#>+````0````8`````````=.0`
+M``P```````````````0`````````VBP```D``````````````"C<`P`(````
+M,00``+X"```$````"````/8L```!````!@````````"`Y```#```````````
+M````!`````````#R+```"0``````````````,-P#``@````Q!```P`(```0`
+M```(````#BT```$````&`````````(SD```,```````````````$````````
+M``HM```)```````````````XW`,`"````#$$``#"`@``!`````@````L+0``
+M`0````8`````````F.0``"0```````````````0`````````*"T```D`````
+M`````````$#<`P`0````,00``,0"```$````"````$LM```!````!@``````
+M``"\Y```,```````````````!`````````!'+0``"0``````````````4-P#
+M`"`````Q!```Q@(```0````(````:RT```$````&`````````.SD```H````
+M```````````$`````````&<M```)``````````````!PW`,`&````#$$``#(
+M`@``!`````@```"*+0```0````8`````````%.4``"0```````````````0`
+M````````ABT```D``````````````(C<`P`0````,00``,H"```$````"```
+M`*TM```!````!@`````````XY0``2```````````````!`````````"I+0``
+M"0``````````````F-P#`!@````Q!```S`(```0````(````U2T```$````&
+M`````````(#E``!(```````````````$`````````-$M```)````````````
+M``"PW`,`&````#$$``#.`@``!`````@```#]+0```0````8`````````R.4`
+M`$````````````````0`````````^2T```D``````````````,C<`P`0````
+M,00``-`"```$````"````!DN```!````!@`````````(Y@``<```````````
+M````!``````````5+@``"0``````````````V-P#`"@````Q!```T@(```0`
+M```(````,2X```$````&`````````'CF``"(```````````````$````````
+M`$TN```!````!@``````````YP``>`$`````````````!`````````!)+@``
+M"0```````````````-T#`!`````Q!```U0(```0````(````:"X```$````&
+M`````````'CH``#<"P`````````````$`````````&0N```)````````````
+M```0W0,`,`,``#$$``#7`@``!`````@```!^+@```0````8`````````5/0`
+M`'P```````````````0`````````>BX```D``````````````$#@`P`H````
+M,00``-D"```$````"````)LN```!````!@````````#0]```'```````````
+M````!`````````"7+@``"0``````````````:.`#``@````Q!```VP(```0`
+M```(````MBX```$````&`````````.ST``"X`0`````````````$````````
+M`+(N```)``````````````!PX`,`B````#$$``#=`@``!`````@```#4+@``
+M`0````8`````````I/8``(P```````````````0`````````T"X```D`````
+M`````````/C@`P`P````,00``-\"```$````"````/4N```!````!@``````
+M```P]P``#```````````````!`````````#Q+@``"0``````````````*.$#
+M``@````Q!```X0(```0````(````$"\```$````&`````````#SW```@````
+M```````````$``````````PO```)```````````````PX0,`$````#$$``#C
+M`@``!`````@````H+P```0````8`````````7/<``/0!``````````````0`
+M````````)"\```D``````````````$#A`P!@````,00``.4"```$````"```
+M`$(O```!````!@````````!0^0``B`(`````````````!``````````^+P``
+M"0``````````````H.$#`+@````Q!```YP(```0````(````82\```$````&
+M`````````-C[``"0```````````````$`````````%TO```)````````````
+M``!8X@,`.````#$$``#I`@``!`````@```!]+P```0````8`````````:/P`
+M`"````````````````0`````````>2\```D``````````````)#B`P`(````
+M,00``.L"```$````"````)LO```!````!@````````"(_```5```````````
+M````!`````````"7+P``"0``````````````F.(#`!@````Q!```[0(```0`
+M```(````L2\```$````&`````````-S\``"0```````````````$````````
+M`*TO```)``````````````"PX@,`0````#$$``#O`@``!`````@```#-+P``
+M`0````8`````````;/T``(````````````````0`````````R2\```D`````
+M`````````/#B`P`(````,00``/$"```$````"````.@O```!````!@``````
+M``#L_0``1`$`````````````!`````````#D+P``"0``````````````^.(#
+M`"@````Q!```\P(```0````(````$3````$````&`````````##_``!H````
+M```````````$``````````TP```)```````````````@XP,`"````#$$``#U
+M`@``!`````@````O,````0````8`````````F/\``*@$``````````````0`
+M````````*S````D``````````````"CC`P#X````,00``/<"```$````"```
+M`$XP```!````!@````````!`!`$`!`4`````````````!`````````!*,```
+M"0``````````````(.0#`*`!```Q!```^0(```0````(````<#````$````&
+M`````````$0)`0"D```````````````$`````````&PP```)````````````
+M``#`Y0,`*````#$$``#[`@``!`````@```".,````0````8`````````Z`D!
+M`"@```````````````0`````````BC````D``````````````.CE`P`(````
+M,00``/T"```$````"````*XP```!````!@`````````0"@$`'`,`````````
+M````!`````````"J,```"0``````````````\.4#`&@````Q!```_P(```0`
+M```(````SS````$````&`````````"P-`0"T!``````````````$````````
+M`,LP```)``````````````!8Y@,`,````#$$```!`P``!`````@```#L,```
+M`0````8`````````X!$!`-0```````````````0`````````Z#````D`````
+M`````````(CF`P`8````,00```,#```$````"`````\Q```!````!@``````
+M``"T$@$`>`$`````````````!``````````+,0``"0``````````````H.8#
+M``@````Q!```!0,```0````(````,#$```$````&`````````"P4`0"L````
+M```````````$`````````"PQ```)``````````````"HY@,`"````#$$```'
+M`P``!`````@```!0,0```0````8`````````V!0!`/@```````````````0`
+M````````3#$```D``````````````+#F`P`@````,00```D#```$````"```
+M`&8Q```!````!@````````#0%0$`'`$`````````````!`````````!B,0``
+M"0``````````````T.8#`"@````Q!```"P,```0````(````@C$```$````&
+M`````````.P6`0"$```````````````$`````````*8Q```!````!@``````
+M``!P%P$`8```````````````!`````````"B,0``"0``````````````^.8#
+M`!`````Q!```#@,```0````(````RS$```$````&`````````-`7`0"D````
+M```````````$`````````,<Q```)```````````````(YP,`(````#$$```0
+M`P``!`````@```#O,0```0````8`````````=!@!`$0```````````````0`
+M````````ZS$```D``````````````"CG`P`(````,00``!(#```$````"```
+M``TR```!````!@````````"X&`$`]```````````````!``````````),@``
+M"0``````````````,.<#`"@````Q!```%`,```0````(````(S(```$````&
+M`````````*P9`0`8```````````````$`````````$8R```!````!@``````
+M``#$&0$`Z```````````````!`````````!",@``"0``````````````6.<#
+M`!`````Q!```%P,```0````(````83(```$````&`````````*P:`0!P````
+M```````````$`````````%TR```)``````````````!HYP,`(````#$$```9
+M`P``!`````@```"$,@```0````8`````````'!L!`(````````````````0`
+M````````@#(```D``````````````(CG`P`(````,00``!L#```$````"```
+M`*,R```!````!@````````"<&P$`'`$`````````````!`````````"?,@``
+M"0``````````````D.<#`$`````Q!```'0,```0````(````R#(```$````&
+M`````````+@<`0"@```````````````$`````````,0R```)````````````
+M``#0YP,`,````#$$```?`P``!`````@```#E,@```0````8`````````6!T!
+M`'P```````````````0`````````X3(```D```````````````#H`P`@````
+M,00``"$#```$````"`````<S```!````!@````````#4'0$`*```````````
+M````!``````````#,P``"0``````````````(.@#``@````Q!```(P,```0`
+M```(````)S,```$````&`````````/P=`0`L```````````````$````````
+M`",S```)```````````````HZ`,`"````#$$```E`P``!`````@```!',P``
+M`0````8`````````*!X!`/0```````````````0`````````0S,```D`````
+M`````````##H`P`0````,00``"<#```$````"````&0S```!````!@``````
+M```<'P$`B```````````````!`````````!@,P``"0``````````````0.@#
+M``@````Q!```*0,```0````(````@S,```$````&`````````*0?`0`0!```
+M```````````$`````````'\S```)``````````````!(Z`,`B````#$$```K
+M`P``!`````@```"@,P```0````8`````````M",!`!````````````````0`
+M````````G#,```D``````````````-#H`P`(````,00``"T#```$````"```
+M`+@S```!````!@````````#$(P$`%```````````````!`````````"T,P``
+M"0``````````````V.@#``@````Q!```+P,```0````(````T#,```$````&
+M`````````-@C`0`4```````````````$`````````,PS```)````````````
+M``#@Z`,`"````#$$```Q`P``!`````@```#K,P```0````8`````````[",!
+M`#@```````````````0`````````YS,```D``````````````.CH`P`0````
+M,00``#,#```$````"`````@T```!````!@`````````D)`$`7`$`````````
+M````!``````````$-```"0``````````````^.@#`)`````Q!```-0,```0`
+M```(````'C0```$````&`````````(`E`0`<`@`````````````$````````
+M`#8T```!````!@````````"<)P$`)`$`````````````!`````````!/-```
+M`0````8`````````P"@!`"P```````````````0`````````:30```$````&
+M`````````.PH`0#\```````````````$`````````(`T```!````!@``````
+M``#H*0$`E`$`````````````!`````````"7-````0````8`````````?"L!
+M`!@```````````````0`````````MC0```$````&`````````)0K`0!8````
+M```````````$`````````+(T```)``````````````"(Z0,`,````#$$```]
+M`P``!`````@```#8-````0````8`````````["L!`#@```````````````0`
+M````````U#0```D``````````````+CI`P`@````,00``#\#```$````"```
+M`/<T```!````!@`````````D+`$`4```````````````!``````````6-0``
+M`0````8`````````="P!``P```````````````0`````````.34```$````&
+M`````````(`L`0`<```````````````$`````````#4U```)````````````
+M``#8Z0,`"````#$$``!#`P``!`````@```!<-0```0````8`````````G"P!
+M`&P!``````````````0`````````6#4```D``````````````.#I`P`@````
+M,00``$4#```$````"````'8U```!````!@`````````(+@$`-```````````
+M````!`````````!R-0``"0```````````````.H#`!@````Q!```1P,```0`
+M```(````D#4```$````&`````````#PN`0`(!0`````````````$````````
+M`(PU```)```````````````8Z@,`B`$``#$$``!)`P``!`````@```"K-0``
+M`0````8`````````1#,!`*0```````````````0`````````IS4```D`````
+M`````````*#K`P`H````,00``$L#```$````"````,8U```!````!@``````
+M``#H,P$`U```````````````!`````````#"-0``"0``````````````R.L#
+M`"@````Q!```30,```0````(````Z#4```$````&`````````+PT`0"(````
+M```````````$`````````.0U```)``````````````#PZP,`$````#$$``!/
+M`P``!`````@````)-@```0````8`````````1#4!`*0!``````````````0`
+M````````!38```D```````````````#L`P#0````,00``%$#```$````"```
+M`"(V```!````!@````````#H-@$`V```````````````!``````````>-@``
+M"0``````````````T.P#`$`````Q!```4P,```0````(````038```$````&
+M`````````,`W`0!H```````````````$`````````#TV```)````````````
+M```0[0,`&````#$$``!5`P``!`````@```!A-@```0````8`````````*#@!
+M`'@```````````````0`````````738```D``````````````"CM`P`(````
+M,00``%<#```$````"````((V```!````!@````````"@.`$`@```````````
+M````!`````````!^-@``"0``````````````,.T#`"`````Q!```60,```0`
+M```(````HS8```$````&`````````"`Y`0"H`0`````````````$````````
+M`)\V```)``````````````!0[0,`B````#$$``!;`P``!`````@```"W-@``
+M`0````8`````````R#H!`#@```````````````0`````````T38```$````&
+M```````````[`0"L```````````````$`````````,TV```)````````````
+M``#8[0,`2````#$$``!>`P``!`````@```#K-@```0````8`````````K#L!
+M`!P!``````````````0`````````YS8```D``````````````"#N`P!(````
+M,00``&`#```$````"`````8W```!````!@````````#(/`$`-```````````
+M````!``````````"-P``"0``````````````:.X#``@````Q!```8@,```0`
+M```(````(#<```$````&`````````/P\`0`L!0`````````````$````````
+M`!PW```)``````````````!P[@,`^````#$$``!D`P``!`````@````Z-P``
+M`0````8`````````*$(!```#``````````````0`````````-C<```D`````
+M`````````&CO`P`H````,00``&8#```$````"````%@W```!````!@``````
+M```H10$`'`$`````````````!`````````!4-P``"0``````````````D.\#
+M`%@````Q!```:`,```0````(````<S<```$````&`````````$1&`0!D````
+M```````````$`````````),W```!````!@````````"H1@$`1```````````
+M````!`````````"/-P``"0``````````````Z.\#``@````Q!```:P,```0`
+M```(````MS<```$````&`````````.Q&`0`T```````````````$````````
+M`+,W```)``````````````#P[P,`$````#$$``!M`P``!`````@```#*-P``
+M`0````8`````````($<!``0```````````````0`````````[3<```$````&
+M`````````"1'`0`L```````````````$`````````.DW```)````````````
+M````\`,`"````#$$``!P`P``!`````@````).````0````8`````````4$<!
+M`,@```````````````0`````````!3@```D```````````````CP`P!0````
+M,00``'(#```$````"````"(X```!````!@`````````82`$`K```````````
+M````!``````````>.```"0``````````````6/`#`$@````Q!```=`,```0`
+M```(````/#@```$````&`````````,1(`0#@`0`````````````$````````
+M`#@X```)``````````````"@\`,`L````#$$``!V`P``!`````@```!7.```
+M`0````8`````````I$H!`#````````````````0`````````4S@```D`````
+M`````````%#Q`P`(````,00``'@#```$````"````'$X```!````!@``````
+M``#42@$`T`4`````````````!`````````!M.```"0``````````````6/$#
+M`&`!```Q!```>@,```0````(````BS@```$````&`````````*10`0#D!```
+M```````````$`````````(<X```)``````````````"X\@,`F````#$$``!\
+M`P``!`````@```"I.````0````8`````````B%4!`+0```````````````0`
+M````````I3@```D``````````````%#S`P`8````,00``'X#```$````"```
+M`,(X```!````!@`````````\5@$`8```````````````!`````````#E.```
+M`0````8`````````G%8!`-@```````````````0`````````X3@```D`````
+M`````````&CS`P`(````,00``($#```$````"````/LX```!````!@``````
+M``!T5P$`N```````````````!``````````D.0```0````8`````````+%@!
+M`.P```````````````0`````````53D```$````&`````````!A9`0`T````
+M```````````$`````````%$Y```)``````````````!P\P,`$````#$$``"%
+M`P``!`````@```!H.0```0````8`````````3%D!`&````````````````0`
+M````````A#D```$````&`````````*Q9`0"8`0`````````````$````````
+M`(`Y```)``````````````"`\P,`0````#$$``"(`P``!`````@```"J.0``
+M`0````8`````````1%L!`&0```````````````0`````````ICD```D`````
+M`````````,#S`P`(````,00``(H#```$````"````,TY```!````!@``````
+M``"H6P$`T```````````````!`````````#).0``"0``````````````R/,#
+M`%`````Q!```C`,```0````(````YCD```$````&`````````'A<`0"L````
+M```````````$`````````.(Y```)```````````````8]`,`2````#$$``".
+M`P``!`````@`````.@```0````8`````````)%T!`.`!``````````````0`
+M````````_#D```D``````````````&#T`P"P````,00``)`#```$````"```
+M`!LZ```!````!@`````````$7P$`2`(`````````````!``````````7.@``
+M"0``````````````$/4#`(@````Q!```D@,```0````(````-3H```$````&
+M`````````$QA`0`P```````````````$`````````#$Z```)````````````
+M``"8]0,`"````#$$``"4`P``!`````@```!+.@```0````8`````````?&$!
+M`,````````````````0`````````:#H```$````&`````````#QB`0#X````
+M```````````$`````````&0Z```)``````````````"@]0,`$````#$$``"7
+M`P``!`````@```"%.@```0````8`````````-&,!`.`#``````````````0`
+M````````@3H```D``````````````+#U`P`@````,00``)D#```$````"```
+M`+DZ```!````!@`````````49P$`:`$`````````````!`````````"U.@``
+M"0``````````````T/4#`#`````Q!```FP,```0````(````USH```$````&
+M`````````'QH`0!(```````````````$`````````-,Z```)````````````
+M````]@,`&````#$$``"=`P``!`````@```#L.@```0````8`````````Q&@!
+M`"0```````````````0`````````!#L```$````&`````````.AH`0`L````
+M```````````$`````````"`[```!````!@`````````4:0$`R`$`````````
+M````!``````````<.P``"0``````````````&/8#`&@````Q!```H0,```0`
+M```(````1CL```$````&`````````-QJ`0!D```````````````$````````
+M`$([```)``````````````"`]@,`"````#$$``"C`P``!`````@```!I.P``
+M`0````8`````````0&L!`-P```````````````0`````````93L```D`````
+M`````````(CV`P!8````,00``*4#```$````"````(([```!````!@``````
+M```<;`$`K```````````````!`````````!^.P``"0``````````````X/8#
+M`$@````Q!```IP,```0````(````G#L```$````&`````````,AL`0#,`0``
+M```````````$`````````)@[```)```````````````H]P,`H````#$$``"I
+M`P``!`````@```"W.P```0````8`````````E&X!`.0#``````````````0`
+M````````LSL```D``````````````,CW`P#(````,00``*L#```$````"```
+M`-$[```!````!@````````!X<@$`,```````````````!`````````#-.P``
+M"0``````````````D/@#``@````Q!```K0,```0````(````ZSL```$````&
+M`````````*AR`0#X```````````````$`````````.<[```)````````````
+M``"8^`,`$````#$$``"O`P``!`````@````(/````0````8`````````H',!
+M`.`#``````````````0`````````!#P```D``````````````*CX`P`@````
+M,00``+$#```$````"````#P\```!````!@````````"`=P$`;`$`````````
+M````!``````````X/```"0``````````````R/@#`#`````Q!```LP,```0`
+M```(````6CP```$````&`````````.QX`0!(```````````````$````````
+M`%8\```)``````````````#X^`,`&````#$$``"U`P``!`````@```!O/```
+M`0````8`````````-'D!`"0```````````````0`````````ASP```$````&
+M`````````%AY`0`L```````````````$`````````*,\```!````!@``````
+M``"$>0$`T`$`````````````!`````````"?/```"0``````````````$/D#
+M`&@````Q!```N0,```0````(````R3P```$````&`````````%1[`0!D````
+M```````````$`````````,4\```)``````````````!X^0,`"````#$$``"[
+M`P``!`````@```#L/````0````8`````````N'L!`-P```````````````0`
+M````````Z#P```D``````````````(#Y`P!8````,00``+T#```$````"```
+M``4]```!`````@````````"4?`$`:`,`````````````!``````````!/0``
+M"0``````````````V/D#`-@$```Q!```OP,```0````(````#3T```$````R
+M`````````/Q_`0```0`````````````$`````0```!P]```!`````@``````
+M``#\@`$`!@```````````````0`````````O/0```0````(``````````H$!
+M``P```````````````(`````````0ST```$````"``````````Z!`0`6````
+M```````````"`````````%D]```!`````@`````````D@0$`%@``````````
+M`````@````````!Q/0```0````(`````````/($!`!@```````````````0`
+M````````BST```$````"`````````%2!`0`8```````````````$````````
+M`*4]```!`````@````````!L@0$`!```````````````!`````````#"/0``
+M`0````(`````````<($!``0```````````````0`````````X#T```$````"
+M`````````'2!`0`8```````````````$`````````/(]```!`````@``````
+M``",@0$`<!``````````````!`````````#N/0``"0``````````````L/X#
+M`"@#```Q!```RP,```0````(````!#X```$````"`````````/R1`0`,````
+M```````````!`````````!,^```!`````@`````````(D@$`.`4`````````
+M````!``````````I/@```0````(`````````0)<!`!$```````````````$`
+M````````1CX```$````"`````````%*7`0`4```````````````"````````
+M`&<^```!`````@````````!HEP$`1```````````````!`````````"$/@``
+M`0````(`````````K)<!`'`0``````````````0`````````@#X```D`````
+M`````````-@!!``H`P``,00``-(#```$````"````)8^```!`````@``````
+M```<J`$`!@```````````````@````````"J/@```0````(`````````)*@!
+M`"````````````````0`````````O#X```$````"`````````$2H`0"\`@``
+M```````````$`````````-`^```!`````@``````````JP$`6`4`````````
+M````!`````````#E/@```0````(`````````6+`!```#``````````````0`
+M````````_3X```$````"`````````%BS`0`H`@`````````````$````````
+M`!(_```!`````@````````"`M0$``P```````````````0`````````D/P``
+M`0````(`````````A+4!`%0```````````````0`````````.3\```$````"
+M`````````-BU`0`*```````````````"`````````%H_```!`````@``````
+M``#DM0$`D`(`````````````!`````````!Q/P```0````(`````````=+@!
+M`'`0``````````````0`````````;3\```D````````````````%!``P`P``
+M,00``-X#```$````"````(,_```!`````@````````#DR`$`!@``````````
+M`````@````````"7/P```0````(`````````ZL@!``8```````````````(`
+M````````JS\```$````"`````````/#(`0`&```````````````!````````
+M`,(_```!`````@````````#XR`$`$```````````````!`````````#1/P``
+M`0````(`````````",D!`"````````````````0`````````XS\```$````"
+M`````````"C)`0`L```````````````$`````````/<_```!`````@``````
+M``!4R0$`'```````````````!``````````&0````0````(`````````<,D!
+M`%@"``````````````0`````````&D````$````"`````````,C+`0`@!@``
+M```````````$`````````"]````!`````@````````#HT0$`"@``````````
+M`````@````````!00````0````(`````````]-$!`'`!``````````````0`
+M````````9T````$````"`````````&33`0!0`0`````````````$````````
+M`(!````!`````@````````"TU`$`0`(`````````````!`````````":0```
+M`0````(`````````]-8!`)@!``````````````0`````````LT````$````"
+M`````````(S8`0```P`````````````$`````````-!````!`````@``````
+M``",VP$`"```````````````!`````````#I0````0````(`````````E-L!
+M`!@```````````````0``````````D$```$````"`````````*S;`0`8````
+M```````````$`````````!M!```!`````@````````#$VP$`F`$`````````
+M````!``````````T00```0````(`````````7-T!`,````````````````0`
+M````````34$```$````"`````````!S>`0`H`@`````````````$````````
+M`&1!```!`````@````````!$X`$`@`$`````````````!`````````!]00``
+M`0````(`````````Q.$!`"@"``````````````0`````````ET$```$````"
+M`````````.SC`0```P`````````````$`````````+1!```!`````@``````
+M``#LY@$`"```````````````!`````````#-00```0````(`````````].8!
+M`!@```````````````0`````````YD$```$````"``````````SG`0`8````
+M```````````$`````````/]!```!`````@`````````DYP$`P`,`````````
+M````!``````````80@```0````(`````````Y.H!`#@!``````````````0`
+M````````,4(```$````"`````````!SL`0"``0`````````````$````````
+M`$I"```!`````@````````"<[0$`6`0`````````````!`````````!D0@``
+M`0````(`````````]/$!```#``````````````0`````````@4(```$````"
+M`````````/3T`0`(```````````````$`````````)I"```!`````@``````
+M``#\]`$`&```````````````!`````````"S0@```0````(`````````%/4!
+M`!@```````````````0`````````S$(```$````"`````````"SU`0"(`@``
+M```````````$`````````.5"```!`````@````````"T]P$`2```````````
+M````!`````````#^0@```0````(`````````_/<!`-`"``````````````0`
+M````````%T,```$````"`````````,SZ`0``!``````````````$````````
+M`#%#```!`````@````````#,_@$```,`````````````!`````````!.0P``
+M`0````(`````````S`$"``@```````````````0`````````9T,```$````"
+M`````````-0!`@`8```````````````$`````````(!#```!`````@``````
+M``#L`0(`&```````````````!`````````"90P```0````(`````````!`("
+M`'@#``````````````0`````````LD,```$````"`````````'P%`@!(````
+M```````````$`````````,M#```!`````P````````#$!0(`````````````
+M`````0````````#10P```0````,`````````Q`4"``P```````````````0`
+M````````ZT,```$````#`````````-`%`@`D```````````````$````````
+M`.=#```)```````````````P"`0`0````#$$```/!```!`````@````#1```
+M`0````,`````````]`4"`#0(``````````````0`````````&$0```$````#
+M`````````"@.`@!0```````````````$`````````#-$```!`````P``````
+M``!X#@(`/`H`````````````!`````````!&1````0````,`````````M!@"
+M`,P%``````````````0`````````6T0```$````#`````````(`>`@#8`@``
+M```````````$`````````'5$```!`````P````````!8(0(`O`(`````````
+M````!`````````"*1````0````,`````````%"0"`$P"``````````````0`
+M````````HD0```$````#`````````&`F`@",```````````````$````````
+M`+]$```!`````P````````#L)@(`^!8`````````````!`````````#01```
+M`0````,`````````Y#T"`'````````````````0`````````WT0```$````#
+M`````````%0^`@`X```````````````$`````````/)$```!`````P``````
+M``",/@(`I`$`````````````!``````````)10```0````,`````````,$`"
+M`*0!``````````````0`````````(D4```$````#`````````-1!`@"D`0``
+M```````````$`````````#E%```!`````P````````!X0P(`I`$`````````
+M````!`````````!210```0````,`````````'$4"`*0!``````````````0`
+M````````:44```$````#`````````,!&`@!0`0`````````````$````````
+M`'U%```!`````P`````````02`(`+`$`````````````!`````````"/10``
+M`0````,`````````/$D"`*0!``````````````0`````````ID4```$````#
+M`````````.!*`@"D`0`````````````$`````````,)%```!`````P``````
+M``"$3`(`I`$`````````````!`````````#A10```0````,`````````*$X"
+M`*0!``````````````0`````````^T4```$````#`````````,Q/`@"D`0``
+M```````````$`````````!5&```!`````P````````!P40(`I`$`````````
+M````!``````````L1@```0````,`````````%%,"`*0!``````````````0`
+M````````0T8```$````#`````````+A4`@"D`0`````````````$````````
+M`%E&```(`````P````````!<5@(``````````````````0````````!>1@``
+M"`````,`````````7%8"``@!``````````````0`````````<48```@````#
+M`````````%Q6`@"````````````````"`````````(-&```(`````P``````
+M``!<5@(`$````````````````@````````"51@```0``````````````7%8"
+M`*@#``````````````$`````````$0````,```````````````1:`@">1@``
+M```````````!``````````$````"``````````````"<2`,`X$L``#($```D
+M`P``!````!`````)`````P``````````````?)0#`/H8``````````````$`
+M``````````````````````````````````````````````,`%P``````````
+M```````#`#X``````````````````P#S`0````````````````,`90(`````
+M```````````#`*P"`````````````````P"N`@````````````````,`UP(`
+M```````````````#`$D#`````````````````P!B`P````````````````,`
+M>`,````````````````#`)0#`````````````````P"M`P``````````````
+M``,`OP,````````````````#`,$#`````````````````P#"`P``````````
+M``````,`PP,````````````````#`,0#`````````````````P#%`P``````
+M``````````,`Q@,````````````````#`,<#`````````````````P#*`P``
+M``````````````,`RP,````````````````#`,T#`````````````````P#.
+M`P````````````````,`SP,````````````````#`-`#````````````````
+M`P#1`P````````````````,`T@,````````````````#`-0#````````````
+M`````P#5`P````````````````,`U@,````````````````#`-<#````````
+M`````````P#8`P````````````````,`V0,````````````````#`-H#````
+M`````````````P#;`P````````````````,`W`,````````````````#`-T#
+M`````````````````P#>`P````````````````,`X`,````````````````#
+M`.$#`````````````````P#B`P````````````````,`XP,`````````````
+M```#`.0#`````````````````P#E`P````````````````,`Y@,`````````
+M```````#`.<#`````````````````P#H`P````````````````,`Z0,`````
+M```````````#`.H#`````````````````P#K`P````````````````,`[`,`
+M```````````````#`.T#`````````````````P#N`P````````````````,`
+M[P,````````````````#`/`#`````````````````P#Q`P``````````````
+M``,`\@,````````````````#`/,#`````````````````P#T`P``````````
+M``````,`]0,````````````````#`/8#`````````````````P#W`P``````
+M``````````,`^`,````````````````#`/D#`````````````````P#Z`P``
+M``````````````,`^P,````````````````#`/P#`````````````````P#]
+M`P````````````````,`_@,````````````````#`/\#````````````````
+M`P``!`````````````````,``00````````````````#``($````````````
+M`````P`#!`````````````````,`!`0````````````````#``4$````````
+M`````````P`&!`````````````````,`!P0````````````````#``@$````
+M`````````````P`)!`````````````````,`"@0````````````````#``L$
+M`````````````````P`,!`````````````````,`$00````````````````#
+M`!($`````````````````P`3!`````````````````,`%`0`````````````
+M```#`!4$`````````````````P`6!`````````````````,`%P0`````````
+M```````#`!@$`````````````````P`9!`````````````````,`&@0`````
+M```````````#`!L$`````````````````P`A!`````````````````,`(@0`
+M```````````````#`"P$`````````````````P`M!`````````````````,`
+M+@0!`````````/`````-``(`#`````````!>````#0`:`!<`````````8```
+M``T`)``B`````````%@````-`"8`+0`````````T````#0`G`#@`````````
+M4`(```T`*`!#`````````,P````-`"H`3@````````#2`0``#0`L`%D`````
+M````2`,```T`+0!D`````````"P````-`"\`;P````````"(````#0`Q`'H`
+M````````1`4```T`,@"%`````````"(!```-`#0`D`````````!&`0``#0`U
+M`)L`````````B`$```T`-@"F`````````&`"```-`#@`L0````````#0`0``
+M#0`Z`+P`````````_`(```T`/`#'`````````-@+```-`#X`T@`````````D
+M````#0!$`-T`````````%`````T`10#H`````````"`````-`$8`\P``````
+M``!@````#0!'`/X`````````;`````T`20`)`0```````&8````-`$L`%`$`
+M```````H````#0!1`!\!````````S`$```T`60`J`0```````%0````-`%,`
+M-0$````````T````#0!5`$`!````````+`````T`5P!+`0```````#@````-
+M`%L`5@$````````T````#0!=`&$!````````1`````T`<0!L`0```````&@`
+M```-`&<`=P$```````"0````#0!I`((!````````A`````T`:P"-`0``````
+M`'@````-`&T`F`$```````!X````#0!O`*,!````````+`````T`=P"N`0``
+M``````0````-`'@`N0$```````"2````#0!Y`,0!````````2`````T`V0#/
+M`0```````)@````-`-L`V@$```````!(````#0#=`.4!````````>`````T`
+M``'P`0```````$P````-`!<!^P$```````!8````#0`,`08"````````C```
+M``T`#@$1`@```````*0````-`!`!'`(```````!0`@``#0`3`2<"````````
+M7`````T`0P$R`@````````0````-`$0!/0(```````!,````#0`[`4@"````
+M````U`````T`00%3`@````````@!```-`$4!7@(```````"8````#0"I`6D"
+M````````2`````T`JP%T`@```````$@````-`*T!?P(````````,`P``#0#G
+M`8H"````````;`````T`"`*5`@```````,`"```-`.L!H`(```````#H````
+M#0#:`:L"````````5@````T`V`&V`@```````%P````-`.$!P0(````````T
+M````#0```LP"````````(`````T`W`'7`@```````)0````-`-X!X@(`````
+M``!(````#0#@`>T"````````M`(```T`\0'X`@```````&0$```-`/,!`P,`
+M```````B`0``#0#U`0X#````````N@````T`^`$9`P```````(0````-`/H!
+M)`,```````!Z````#0#W`2\#````````1`````T`^P$Z`P```````$P````-
+M`/\!10,````````6````#0`$`E`#````````X`````T`!0);`P```````$0`
+M```-``<"9@,```````!\````#0`4`G$#````````$@````T`,0)\`P``````
+M`)0````-`"L"AP,```````"8````#0`O`I(#````````.`````T`-`*=`P``
+M`````!`````-`#\"J`,```````"8````#0"R`K,#````````4`````T`M`*^
+M`P```````%`````-`+8"R0,```````".````#0#I`M0#````````1`````T`
+M$@/B`@``2````$@````-`.`!WP,```````!^````#0#Q`NH#````````M`0`
+M``T``0/U`P```````'@!```-``4#``0```````"J````#0`'`PL$````````
+M'`$```T`"P,6!````````'P````-``D#(00```````"D````#0`0`RP$````
+M````<`````T`&0,W!````````!8````-`!8#0@0```````#H````#0`7`V8#
+M``!\````?`````T`%`)-!````````%`````-`$$#6`0```````"D````#0!+
+M`V,$````````U`````T`30-N!````````(@````-`$\#>00```````!X````
+M#0!7`X0$````````@`````T`60./!````````*P````-`%X#F@0````````<
+M`0``#0!@`Z4$````````-`````T`8@.P!````````"P%```-`&0#%@0``'P`
+M``!\````#0`)`[L$``````````,```T`9@/&!````````!H!```-`&@#T00`
+M``````!B````#0!J`]P$````````1`````T`:P/G!````````#0````-`&T#
+M\@0````````$````#0!O`_T$````````+`````T`<`,(!0```````*P````-
+M`'0#$P4```````#@`0``#0!V`QX%````````,`````T`>`,I!0```````-`%
+M```-`'H#-`4```````#D!```#0!\`S\%````````7@````T`@`-*!0``````
+M`-@````-`($#504````````Z````#0!^`V`%````````N`````T`@P-K!0``
+M`````.H````-`(0#=@4````````T````#0"%`X$%````````8`````T`AP.,
+M!0```````)@!```-`(@#EP4```````!B````#0"*`Z(%````````K`````T`
+MC@.M!0```````.`!```-`)`#N`4```````!(`@``#0"2`\,%````````,```
+M``T`E`/.!0```````%X````-`)8#V04```````#X````#0"7`U4%```\````
+M.@````T`?@/D!0```````.`#```-`)D#[P4```````!H`0``#0";`_H%````
+M````2`````T`G0,%!@```````"0````-`)\#$`8````````L````#0"@`QL&
+M````````R`$```T`H0,F!@```````&(````-`*,#,08```````"L````#0"G
+M`SP&````````S`$```T`J0-'!@```````.0#```-`*L#4@8````````P````
+M#0"M`\X%``!@````7@````T`E@-=!@```````/@````-`*\#504``'@````Z
+M````#0!^`V@&````````X`,```T`L0-S!@```````&P!```-`+,#?@8`````
+M``!(````#0"U`XD&````````)`````T`MP.4!@```````"P````-`+@#GP8`
+M``````#0`0``#0"Y`ZH&````````8@````T`NP,````````````````#``$`
+M`````````````````P`"``````````````````,`!``````````````````#
+M``8``````````````````P`(``````````````````,`"0``````````````
+M```#``L``````````````````P`,``````````````````,`#@``````````
+M```````#``\``````````````````P`1``````````````````,`$P``````
+M```````````#`!4``````````````````P`9``````````````````,`&@``
+M```````````````#`!P``````````````````P`>``````````````````,`
+M'P`````````````````#`"```````````````````P`B````````````````
+M``,`)``````````````````#`"8``````````````````P`G````````````
+M``````,`*``````````````````#`"H``````````````````P`L````````
+M``````````,`+0`````````````````#`"\``````````````````P`Q````
+M``````````````,`,@`````````````````#`#0``````````````````P`U
+M``````````````````,`-@`````````````````#`#@`````````````````
+M`P`Z``````````````````,`/``````````````````#`$``````````````
+M`````P!"``````````````````,`1``````````````````#`$4`````````
+M`````````P!&``````````````````,`1P`````````````````#`$D`````
+M`````````````P!+``````````````````,`30`````````````````#`$\`
+M`````````````````P!1``````````````````,`4P`````````````````#
+M`%4``````````````````P!7``````````````````,`60``````````````
+M```#`%L``````````````````P!=``````````````````,`7@``````````
+M```````#`&```````````````````P!A``````````````````,`8P``````
+M```````````#`&4``````````````````P!G``````````````````,`:0``
+M```````````````#`&L``````````````````P!M``````````````````,`
+M;P`````````````````#`'$``````````````````P!S````````````````
+M``,`=0`````````````````#`'<``````````````````P!X````````````
+M``````,`>0`````````````````#`'H``````````````````P!\````````
+M``````````,`?@`````````````````#`(```````````````````P""````
+M``````````````,`A``````````````````#`(8``````````````````P"'
+M``````````````````,`B0`````````````````#`(H`````````````````
+M`P",``````````````````,`C@`````````````````#`)``````````````
+M`````P"2``````````````````,`E``````````````````#`)8`````````
+M`````````P"8``````````````````,`F0`````````````````#`)L`````
+M`````````````P"<``````````````````,`G0`````````````````#`)\`
+M`````````````````P"A``````````````````,`HP`````````````````#
+M`*4``````````````````P"G``````````````````,`J0``````````````
+M```#`*L``````````````````P"M``````````````````,`KP``````````
+M```````#`+```````````````````P"Q``````````````````,`LP``````
+M```````````#`+4``````````````````P"W``````````````````,`N0``
+M```````````````#`+L``````````````````P"]``````````````````,`
+MOP`````````````````#`,$``````````````````P##````````````````
+M``,`Q0`````````````````#`,<``````````````````P#(````````````
+M``````,`R@`````````````````#`,P``````````````````P#.````````
+M``````````,`SP`````````````````#`-```````````````````P#1````
+M``````````````,`T@`````````````````#`-,``````````````````P#5
+M``````````````````,`UP`````````````````#`-D`````````````````
+M`P#;``````````````````,`W0`````````````````#`-\`````````````
+M`````P#A``````````````````,`XP`````````````````#`.4`````````
+M`````````P#G``````````````````,`Z0`````````````````#`.L`````
+M`````````````P#M``````````````````,`[P`````````````````#`/$`
+M`````````````````P#S``````````````````,`]0`````````````````#
+M`/<``````````````````P#Y``````````````````,`^P``````````````
+M```#`/P``````````````````P#^``````````````````,```$`````````
+M```````#``(!`````````````````P`$`0````````````````,`!@$`````
+M```````````#``@!`````````````````P`*`0````````````````,`#`$`
+M```````````````#``X!`````````````````P`0`0````````````````,`
+M$@$````````````````#`!,!`````````````````P`5`0``````````````
+M``,`%P$````````````````#`!D!`````````````````P`;`0``````````
+M``````,`'0$````````````````#`!X!`````````````````P`?`0``````
+M``````````,`(0$````````````````#`",!`````````````````P`E`0``
+M``````````````,`)@$````````````````#`"@!`````````````````P`J
+M`0````````````````,`+`$````````````````#`"X!````````````````
+M`P`P`0````````````````,`,@$````````````````#`#0!````````````
+M`````P`U`0````````````````,`-@$````````````````#`#<!````````
+M`````````P`X`0````````````````,`.0$````````````````#`#H!````
+M`````````````P`[`0````````````````,`/0$````````````````#`#\!
+M`````````````````P!!`0````````````````,`0P$````````````````#
+M`$0!`````````````````P!%`0````````````````,`1P$`````````````
+M```#`$D!`````````````````P!+`0````````````````,`30$`````````
+M```````#`$\!`````````````````P!1`0````````````````,`4P$`````
+M```````````#`%0!`````````````````P!6`0````````````````,`5P$`
+M```````````````#`%D!`````````````````P!;`0````````````````,`
+M70$````````````````#`%\!`````````````````P!A`0``````````````
+M``,`8P$````````````````#`&4!`````````````````P!F`0``````````
+M``````,`:`$````````````````#`&D!`````````````````P!J`0``````
+M``````````,`;`$````````````````#`&X!`````````````````P!P`0``
+M``````````````,`<@$````````````````#`'0!`````````````````P!V
+M`0````````````````,`>`$````````````````#`'H!````````````````
+M`P!\`0````````````````,`?@$````````````````#`(`!````````````
+M`````P""`0````````````````,`A`$````````````````#`(8!````````
+M`````````P"(`0````````````````,`B@$````````````````#`(P!````
+M`````````````P".`0````````````````,`CP$````````````````#`)$!
+M`````````````````P"3`0````````````````,`E0$````````````````#
+M`)8!`````````````````P"7`0````````````````,`F`$`````````````
+M```#`)D!`````````````````P":`0````````````````,`G`$`````````
+M```````#`)X!`````````````````P"@`0````````````````,`H0$`````
+M```````````#`*,!`````````````````P"E`0````````````````,`IP$`
+M```````````````#`*D!`````````````````P"K`0````````````````,`
+MK0$````````````````#`*\!`````````````````P"Q`0``````````````
+M``,`LP$````````````````#`+4!`````````````````P"W`0``````````
+M``````,`N0$````````````````#`+L!`````````````````P"]`0``````
+M``````````,`OP$````````````````#`,$!`````````````````P##`0``
+M``````````````,`Q0$````````````````#`,<!`````````````````P#)
+M`0````````````````,`RP$````````````````#`,P!````````````````
+M`P#.`0````````````````,`T`$````````````````#`-(!````````````
+M`````P#4`0````````````````,`U@$````````````````#`-@!````````
+M`````````P#:`0````````````````,`W`$````````````````#`-X!````
+M`````````````P#@`0````````````````,`X0$````````````````#`.,!
+M`````````````````P#E`0````````````````,`YP$````````````````#
+M`.D!`````````````````P#K`0````````````````,`[0$`````````````
+M```#`.\!`````````````````P#Q`0````````````````,`]0$`````````
+M```````#`/<!`````````````````P#X`0````````````````,`^@$`````
+M```````````#`/L!`````````````````P#]`0````````````````,`_P$`
+M```````````````#```"`````````````````P`"`@````````````````,`
+M!`(````````````````#``4"`````````````````P`'`@``````````````
+M``,`"`(````````````````#``H"`````````````````P`,`@``````````
+M``````,`#@(````````````````#`!`"`````````````````P`2`@``````
+M``````````,`%`(````````````````#`!8"`````````````````P`8`@``
+M``````````````,`&@(````````````````#`!P"`````````````````P`>
+M`@````````````````,`(`(````````````````#`"("````````````````
+M`P`D`@````````````````,`)0(````````````````#`"8"````````````
+M`````P`G`@````````````````,`*`(````````````````#`"D"````````
+M`````````P`J`@````````````````,`*P(````````````````#`"T"````
+M`````````````P`O`@````````````````,`,0(````````````````#`#("
+M`````````````````P`T`@````````````````,`-@(````````````````#
+M`#@"`````````````````P`Z`@````````````````,`/`(`````````````
+M```#`#T"`````````````````P`_`@````````````````,`00(`````````
+M```````#`$,"`````````````````P!%`@````````````````,`1P(`````
+M```````````#`$D"`````````````````P!+`@````````````````,`30(`
+M```````````````#`$\"`````````````````P!1`@````````````````,`
+M4P(````````````````#`%4"`````````````````P!7`@``````````````
+M``,`60(````````````````#`%L"`````````````````P!<`@``````````
+M``````,`7@(````````````````#`%\"`````````````````P!A`@``````
+M``````````,`8P(````````````````#`&<"`````````````````P!I`@``
+M``````````````,`:P(````````````````#`&T"`````````````````P!O
+M`@````````````````,`<`(````````````````#`'$"````````````````
+M`P!S`@````````````````,`=0(````````````````#`'<"````````````
+M`````P!Y`@````````````````,`>P(````````````````#`'T"````````
+M`````````P!_`@````````````````,`@0(````````````````#`(,"````
+M`````````````P"%`@````````````````,`A@(````````````````#`(@"
+M`````````````````P"*`@````````````````,`C`(````````````````#
+M`(T"`````````````````P"/`@````````````````,`D`(`````````````
+M```#`)("`````````````````P"4`@````````````````,`E@(`````````
+M```````#`)@"`````````````````P"9`@````````````````,`FP(`````
+M```````````#`)T"`````````````````P"?`@````````````````,`H0(`
+M```````````````#`*,"`````````````````P"E`@````````````````,`
+MI@(````````````````#`*@"`````````````````P"J`@``````````````
+M``,`L`(````````````````#`+("`````````````````P"T`@``````````
+M``````,`M@(````````````````#`+@"`````````````````P"Z`@``````
+M``````````,`O`(````````````````#`+X"`````````````````P#``@``
+M``````````````,`P@(````````````````#`,0"`````````````````P#&
+M`@````````````````,`R`(````````````````#`,H"````````````````
+M`P#,`@````````````````,`S@(````````````````#`-`"````````````
+M`````P#2`@````````````````,`U`(````````````````#`-4"````````
+M`````````P#9`@````````````````,`VP(````````````````#`-T"````
+M`````````````P#?`@````````````````,`X0(````````````````#`.,"
+M`````````````````P#E`@````````````````,`YP(````````````````#
+M`.D"`````````````````P#K`@````````````````,`[0(`````````````
+M```#`.\"`````````````````P#Q`@````````````````,`\P(`````````
+M```````#`/4"`````````````````P#W`@````````````````,`^0(`````
+M```````````#`/L"`````````````````P#]`@````````````````,`_P(`
+M```````````````#``$#`````````````````P`#`P````````````````,`
+M!0,````````````````#``<#`````````````````P`)`P``````````````
+M``,`"P,````````````````#``T#`````````````````P`.`P``````````
+M``````,`$`,````````````````#`!(#`````````````````P`4`P``````
+M``````````,`%@,````````````````#`!<#`````````````````P`9`P``
+M``````````````,`&P,````````````````#`!T#`````````````````P`?
+M`P````````````````,`(0,````````````````#`",#````````````````
+M`P`E`P````````````````,`)P,````````````````#`"D#````````````
+M`````P`K`P````````````````,`+0,````````````````#`"\#````````
+M`````````P`Q`P````````````````,`,P,````````````````#`#4#````
+M`````````````P`W`P````````````````,`.`,````````````````#`#D#
+M`````````````````P`Z`P````````````````,`.P,````````````````#
+M`#P#`````````````````P`]`P````````````````,`/P,`````````````
+M```#`$$#`````````````````P!"`P````````````````,`0P,`````````
+M```````#`$4#`````````````````P!'`P````````````````,`2P,`````
+M```````````#`$T#`````````````````P!/`P````````````````,`40,`
+M```````````````#`%,#`````````````````P!5`P````````````````,`
+M5P,````````````````#`%D#`````````````````P!;`P``````````````
+M``,`70,````````````````#`%X#`````````````````P!@`P``````````
+M``````,`9`,````````````````#`&8#`````````````````P!H`P``````
+M``````````,`:@,````````````````#`&L#`````````````````P!M`P``
+M``````````````,`;P,````````````````#`'`#`````````````````P!R
+M`P````````````````,`=`,````````````````#`'8#````````````````
+M`P!Z`P````````````````,`?`,````````````````#`'X#````````````
+M`````P"``P````````````````,`@0,````````````````#`(,#````````
+M`````````P"$`P````````````````,`A0,````````````````#`(<#````
+M`````````````P"(`P````````````````,`B@,````````````````#`(P#
+M`````````````````P".`P````````````````,`D`,````````````````#
+M`)(#`````````````````P"6`P````````````````,`EP,`````````````
+M```#`)D#`````````````````P";`P````````````````,`G0,`````````
+M```````#`)\#`````````````````P"@`P````````````````,`H0,`````
+M```````````#`*,#`````````````````P"E`P````````````````,`IP,`
+M```````````````#`*D#`````````````````P"K`P````````````````,`
+MKP,````````````````#`+$#`````````````````P"S`P``````````````
+M``,`M0,````````````````#`+<#`````````````````P"X`P``````````
+M``````,`N0,````````````````#`+L#`````````````````P"]`P``````
+M``````````,`R`,````````````````#`,D#`````````````````P`-!```
+M``````````````,`#@0````````````````#``\$`````````````````P`<
+M!`````````````````,`'00````````````````#`!X$````````````````
+M`P`?!`````````````````,`(`0````````````````#`",$````````````
+M`````P`D!`````````````````,`)00````````````````#`"8$````````
+M`````````P`G!`````````````````,`*`0````````````````#`"D$````
+M`````````````P`J!`````````````````,`*P0````````````````#`"\$
+MM08```````!D````'0!)`<`&````````!````!T`'@'+!@```````)P!```=
+M`*X"U@8```````!H````'0##`.$&````````N`$``!T`W0+L!@``````````
+M```0````]@8````````X````'0`J`@$'````````1`$``!T`\P(,!P``````
+M`!`!```=`(``%P<```````#8````'0!3`R('````````I`$``!$`'`0M!P``
+M`````"@````=`,@".`<````````L````'0"*`$,'````````H````!T`8P!.
+M!P```````*0!```1`"8$60<````````P````'0"E`F0'````````%````!T`
+MA@)O!P````````H````=`%X">@<```````#R````'0`H`H4'````````U```
+M`!T`.@*0!P```````&P````=`!D`FP<```````!\````'0`"`J8'````````
+MD````!T`XP&Q!P```````%P````=`(\!O`<````````*````'0"U`<<'````
+M````*````!T`*`'2!P```````"P````=`*H"W0<````````$````'0`E`N@'
+M````````&````!T`5P+S!P```````(P````=`-\"_@<````````L````'0`3
+M``D(````````!`$``!T`,@(4"`````````0````=`%8!'P@```````#\````
+M'0`Z`RH(````````!````!T`-0$U"`````````P````=`+<!0`@````````P
+M`0``'0`B`%L(````````I`$``!$`(P1F"````````&@````=`)0"<0@`````
+M``!0````'0`N`7P(````````(@```!T`"P"'"````````%@````=`#T#D@@`
+M````````````$````+,(````````/````!T`J0"^"````````/`````=`*$"
+MR0@```````!,````'0"?`M0(````````=````!T`#`+?"````````"0````=
+M`+L`Z@@```````!,````'0!T`?4(````````=````!T`D0$`"0```````"@`
+M```=`!`""PD````````4````'0!C`18)````````7````!T`F0(A"0``````
+M`+H````=`#<!+`D````````X````'0"C`#<)````````*````!T`(0%""0``
+M`````'0````=`&T"30D````````T````'0"E`5@)````````'````!T`E@)C
+M"0```````$P````=`)`";@D```````!,````'0`M`GD)````````'@```!T`
+MXP*$"0````````0````=`(D`CPD```````!T````'0";`IH)````````0`4`
+M`!T`<P"E"0```````"0````=`*$!L`D```````!`````'0!W`KL)````````
+M/````!T`"0#&"0```````!P````=`)("T0D```````#T````'0`4`]P)````
+M````*````!T`3P+G"0```````)`````=`.\"\@D````````D````'0"W`/T)
+M````````E````!T`60$("@```````&`````=`&H!$PH````````@````'0`9
+M`1X*````````?````!T`(0,I"@```````#`"```=``H!-`H````````"````
+M'0#1`#\*````````*````!T`(P-*"@```````'`"```=`"8!50H````````,
+M`0``'0`&`&0*````````'`,``!T`_P)O"@`````````````0````=@H`````
+M``"X````'0"\`H$*````````%````!T`G`&,"@```````!H!```=`!T#EPH`
+M``````#X````'0"H`J(*````````#````!T`P`*M"@````````P````=``@`
+MN`H````````0````'0!\`<,*````````H@```!T`$@+."@```````"0````=
+M``X"V0H````````P````'0#2`>0*````````"````!T`=0#O"@```````$0`
+M```=`+D`^@H```````!(`0``'0`,`!`+````````(````!T`ZP(;"P``````
+M`-P````=`#@!)@L````````<````'0#!`#$+`````````````!`````["P``
+M`````!0````=`$\!1@L````````*````'0#A`E$+````````(````!T`[0%<
+M"P```````&0#```=`&4"9PL````````,````'0!;`G(+````````=````!T`
+MC@!]"P```````$P````=`$L!B`L````````T````'0!'`Y,+````````#`$`
+M`!T`80*>"P````````(````=`)@!J0L```````!<````'0"G`+0+````````
+M$````!T`"@*_"P```````-`%```=`#8"R@L```````!^````'0`;`]4+````
+M````!````!T`A0+@"P```````!0````=`&$!ZPL```````!(````'0#.`O8+
+M````````!````!T`'0$!#````````!P"```=`#<##`P```````":````'0#+
+M`1<,````````/````!T`G0`B#````````"0````=`)T"+0P```````!$````
+M'0`X`C@,````````$@```!T`'`)##````````#@````=`#\#3@P`````````
+M````$````%L,````````=````!T`)0%F#````````)H````=`/L`<0P`````
+M```J````'0`Y`WP,````````#````!T`0@.'#````````'P````=`'T"D@P`
+M``````#P````'0`/`*,,````````$`0``!T`*P.N#````````&`````=`+T`
+MN0P```````!X````'0`R`<0,`````````@```!T`E@'/#````````!0````=
+M`(@"V@P```````!H````'0!5`^4,````````2````!T`]0#P#````````(``
+M```=`$,"^PP````````L````'0!7`08-````````1`$``!T`U@$1#0``````
+M`&X````=`!L!'`T````````$!0``'0#Y`B<-````````A@```!T`U`(R#0``
+M`````!X````=`+`"/0T````````T`0``'0#,`4@-``````````(``!T`I@)3
+M#0```````$@````=`(8!7@T````````4````'0":`6D-````````Y`$``!T`
+MK`)T#0```````/0````=`"<#?PT````````(!0``'0!)`XH-````````'```
+M`!T`HP&5#0````````P````=`#H!H`T````````,````'0"&`*L-````````
+M``$``!T`30&V#0```````#@````=`',"P0T````````4````'0#7`,P-````
+M````W````!T`I0/7#0````````(````=`,\`X@T````````,````'0",`NT-
+M````````/````!T`@0+X#0```````*0!```1`"@$`PX```````!,````'0`B
+M`@X.````````.````!T`70,9#@```````%P````=`,@`)`X````````,````
+M'0"Y`2\.````````@`$``!T`_``Z#@```````!P````=`-L"10X````````4
+M````'0!I`E`.````````?````!T`=0);#@```````&P!```=`$4#9@X`````
+M```,````'0`$`7$.````````#````!T`YP!\#@```````+@````=`+$`APX`
+M```````H````'0#Y`)(.````````@````!T`<0*=#@```````(@"```=`.<"
+MJ`X`````````````$````+(.````````7`$``!T`-0.]#@```````*0!```1
+M`!X$R`X```````!,`0``'0"0`-,.````````3````!T`3P#>#@```````"0`
+M```=`!\!Z0X````````0````'0#W`/0.`````````````!`````4#P``````
+M```````0````(0\```````#,!0``'0#^`"P/````````"0```!$`#@0\#P``
+M`````&8````=`/4"1P\````````H````'0!L`5(/````````W````!T`O0-=
+M#P```````&@````=`#P":`\````````P````'0![`G,/`````````@```!T`
+MT@!^#P```````%0````=`.T"B0\````````$````'0"7`90/````````&```
+M`!T`L0&?#P```````'0````=`%L!J@\````````D````'0"-`K4/````````
+M`````!````#$#P```````#@````=`'`!SP\```````"D`0``$0`G!-H/````
+M````&````!T`N@+E#P```````$P````=`$<"\`\````````X````'0#E`?L/
+M````````$````!T``@$&$````````&@````=`(H!$1`````````X`0``'0!<
+M`AP0````````I`$``!$`)`0G$````````!`````=`*,",A````````!`````
+M'0!Z`3T0````````<````!T`T@)($````````*0!```=`%$#4Q````````!D
+M`0``'0!=`5X0````````(````!T`[P!I$````````#P````=`&@!=!``````
+M``#X````'0#I`7\0````````%````!T`$@&*$````````$@````=`,P"E1``
+M``````"D`0``$0`E!*`0````````*````!T`;@&K$````````'P````=`'@!
+MMA````````!`````'0"S`,$0````````$@```!T`+P/,$``````````````0
+M````VQ`````````J````'0`F`N80````````&````!T`:P+Q$````````!0`
+M```=`)0`_!`````````4````'0"8`@<1````````!````!T`E0$2$0``````
+M`'0````=`'`"'1$```````"D`0``$0`?!"@1````````$````!T`QP$S$0``
+M`````/`````=`%$!/A$````````X````'0`$`$P1````````I`$``!$`'017
+M$0```````$@````=`,4!8A$````````,````'0!3`6T1````````)````!$`
+M#P1_$0```````"`````=`*L`BA$````````,````'0"P`)41````````-```
+M`!T`7P*@$0```````$`````=`-\`JQ$```````"H`0``'0!;`[81````````
+M&````!T`X0#!$0```````!0````=`(X!S!$````````P````'0#&`M<1````
+M````I````!T`8`#B$0```````!`````=`"T#[1$```````!(````'0##`?@1
+M````````)````!T`DP$#$@```````"0````=`,0"#A(````````4````'0`>
+M`AD2````````+````!T`)0,D$@```````!P````=`(P!+Q(```````"D````
+M'0#[`CH2````````Q````!T`5`%%$@```````+H````=`"<"4!(```````"D
+M`0``$0`@!%L2````````(````!T`[0!F$@```````!P````=`$,#<1(`````
+M``"(````'0"$`'P2````````+````!T`XP"'$@```````-`#```=`!@"DA(`
+M```````\````'0#5`)T2````````%````!T`QP"H$@```````%`!```=`$D"
+MLQ(```````"@````'0`?`[X2````````$````!T`R0')$@```````"`````=
+M`&$`U!(```````!8````'0!5`M\2````````2````!T`'P#J$@```````/0`
+M```=`!<`]1(````````H````'0!-`@`3````````=````!T`R@`+$P``````
+M``H````=`.4`%A,```````!@````'0`.`R$3````````*````!T`H0`L$P``
+M`````"@````=`/T"-Q,````````<````'0!"`$(3````````3@```!T`#@!-
+M$P```````#P````=`&\"6!,`````````````$````&@3````````2`$``!T`
+M[P%S$P`````````````0````?!,````````4````'0""`(<3````````(@$`
+M`!T`.`.2$P```````"0````=`*4`G1,```````!X````'0!C`J@3````````
+M8````!T`A`&S$P```````/8````=`"0"OA,`````````````$````-X3````
+M````B@```!T`%0#I$P```````#@````=`)D`]!,````````\````'0";`/\3
+M````````/````!T`:0$*%````````)0````=`(P`%10````````X````'0!V
+M`2`4````````9`0``!T`/0(K%````````!0````=`)X!-A0```````!X`0``
+M'0#5`D$4````````!````!T`S@!,%````````!@````=`)(`5Q0````````$
+M````'0"O`&(4`````````````!````!P%````````!@````=`%\!>Q0`````
+M``!T````'0`<`(84````````&````!T`TP"1%````````"0````=`,$!G!0`
+M```````>````'0"G`:<4````````A````!T`"`&R%````````"0````=`/$`
+MO10````````X````'0"M`,@4````````&````!T`9P+3%`````````P````=
+M`,("WA0```````!\````'0#9`ND4````````)````!T`<@'T%````````"0`
+M```=`%,"_Q0```````"H!```'0#W`@H5````````$````!T`M0`5%0``````
+M`#P````=`+,!(!4````````D````'0!^`2L5````````)@$``!T`-`$V%0``
+M`````$P````=`&8!014````````"````'0"9`4P5````````A@```!T`(P%7
+M%0```````*0!```1`"D$8A4````````$````'0"8`&T5````````!````!T`
+M90%X%0```````$P````=`'X`@Q4```````"L````'0"'`(X5````````.```
+M`!T`40*9%0```````%0````=`"``I!4````````6````'0`\`Z\5````````
+M!````!T`CP*Z%0```````#P````=`((!Q14```````""````'0`-`]`5````
+M````0````!T`KP';%0````````X(```=`,X!YA4```````"D`0``$0`J!/$5
+M````````&````!T`00+\%0```````#`````=`)\`!Q8````````H````'0`1
+M`!(6````````%````!T`E@`=%@```````)(!```=`#L#*!8```````"(````
+M'0`I`S,6````````#````!T`Z0`^%@```````!P````=`(@!218````````*
+M````'0"^`E06````````.````!T`ZP!?%@```````$P````=`'H`:A8`````
+M```<````'0#%`'46````````&````!T`/P&`%@`````````````0````C18`
+M````````````$````)H6````````]@```!T`'@"E%@````````(````=`"D"
+ML!8````````T````'0`J`;L6````````(````!T`O0'&%@````````0````=
+M`-``T18```````"`````'0`6`MP6````````)````!T`R@+G%@```````,@`
+M```=`'(#\A8`````````````$````/L6````````)````!T`S``&%P``````
+M`!H````=`&4`$1<```````#H!```'0!>`"<7````````0````!T`T`(R%P``
+M`````$@````=`/,`/1<```````#<"P``'0#7`D@7````````K`$``!T`60)3
+M%P```````#8````=`"`"7A<````````@````'0"_`6D7````````7````!T`
+M+`%T%P```````$`````=`$``?Q<````````J````'0`V`8H7````````2```
+M`!T`!@&5%P```````"0````=`+L!H!<````````*````'0#0`:L7````````
+M5````!T`?`"V%P````````(````=`#D!P1<```````!,````'0"_`,P7````
+M````+````!T`_0'7%P```````$`````=`+@"XA<```````!@````'0"#`NT7
+M````````1````!T`@`'X%P````````0$```=`#T!`Q@```````!$`@``'0`5
+M`0X8````````%````!T`B@(9&````````!`````=`!H")!@```````#0````
+M'0",`R\8````````1````!T`?P(Z&````````$P````=`$L"11@```````#T
+M`0``'0#E`E`8````````%````!T`,0-;&``````````````0````;1@`````
+M``!,````'0!'`7@8````````9````!T`10*#&``````````````0````E!@`
+M```````$````'0"<`)\8````````#````!T`H`&J&````````#`````=`#`!
+MM1@````````0````'0!Y`L`8````````T@```!T``P/+&````````"P!```=
+M`-0!UA@```````!`````'0!-`.\8````````-@```!T`,P,`>GHP,#,S93AB
+M,P!Z>C`Q.68T96-E`'IZ,&0P-61D.&$`>GHP,#`P8V$U,P!Z>C`P,&-A83`T
+M`'IZ,&%C-39C-S@`>GHP.#8Q.60V90!Z>C!D,&8P-#`P`'IZ,#)B,V(W864`
+M>GHP8V(U-3`W9`!Z>C!B-&)A,S(S`'IZ,#5B,V%F-S(`>GHP8C8Y9C)F,@!Z
+M>C!B,S`U93(S`'IZ,#)B,V(W83,`>GHP-C)B-3EF-`!Z>C`Q-68V-#5A`'IZ
+M,#!D-C(V8F(`>GHP,#%A8F8W8@!Z>C`P,#`V-C)C`'IZ,#`P,S,X9C0`>GHP
+M,&-E-C<X-P!Z>C`P,&0P,V%E`'IZ,#%A,F,U-F4`>GHP8V9A.&1B.0!Z>C`P
+M,#,S93AD`'IZ,#`P,#,S-S0`>GHP,&-D8S`X9`!Z>C`P,&0S,6$P`'IZ,#!D
+M,S%F-#@`>GHP,#`Q,V,X,@!Z>C`Q.64V8C9A`'IZ,#=D.&5F-&$`>GHP,#`V
+M-V0U8P!Z>C!F83%C.3EF`'IZ,#=D,#@V9&,`>GHP,S-E835D-P!Z>C!C9F$Y
+M-S,Q`'IZ,&(V8F8P,#D`>GHP8C5E,S%A.`!Z>C!B-C$W,V)C`'IZ,#9D960X
+M.#``>GHP9&)D8C$R,0!Z>C!D8F1B,68X`'IZ,#9D96$T9F4`>GHP,#5B-S<R
+M90!Z>C`P8C9F-S`Y`'IZ,#`P,#8W,&0`>GHP,#`P-C8W90!Z>C`Q8S`R96,Q
+M`'IZ,&(V8S<P,#D`>GHP8C8R,S%A.`!Z>C`P8C9C8S4P`'IZ,#`Q-F0X,F4`
+M>GHP8C8U-S-B8P!Z>C!D8F9B,3(Q`'IZ,&1B9F(Q9C@`>GHP9F(V-&-B-P!Z
+M>C`P-6(W8C5F`'IZ,#9D9F$T9F4`>GHP-6(W8S`T,0!Z>C`P-6(W8C)E`'IZ
+M,#!B-F9F,#D`>GHP,#$V9#DY-@!Z>C`R9&,R.#%C`'IZ,#)D8C-B86,`>GHP
+M,F1C-3-A8P!Z>C`S,V8P,C<R`'IZ,#)D8S`U,&0`>GHP,39D9F(R9`!Z>C`U
+M8C8V834P`'IZ,&0Y-#DY-C4`>GHP-F-C,#9E,`!Z>C!B-F0P9C%E`'IZ,#9C
+M8S`U86,`>GHP-F5E8C,P-`!Z>C!B-C0W-&$W`'IZ,#`U8C5E9&,`>GHP,#)D
+M8F8Q8P!Z>C`P-F1F,S8S`'IZ,#!B-F1A,C@`>GHP83-F.3)A80!Z>C`P,39D
+M.&$R`'IZ,#5B-F,V9F4`>GHP8C9F,V-C8@!Z>C!D8S%B,3(Q`'IZ,&1C,6(Q
+M9C@`>GHP,&(U9F%F-`!Z>C`P8C<P-S`Y`'IZ,#)D8S0X,6,`>GHP,#5B-CAB
+M.`!Z>C`Q-F4P8C)D`'IZ,#9D8SDT,64`>GHP8C9D,C1F,`!Z>C!B-F0W-C$S
+M`'IZ,#`P,S8V,C$`>GHP-F8V8C,P-`!Z>C!B-C5C,S$Q`'IZ,&(V.#<T83<`
+M>GHP,#5B-C)D8P!Z>C!B-C4T-V,S`'IZ,#`U8C8S-&,`>GHP9&(P,34U80!Z
+M>C`V9#<R-S%D`'IZ,#9D.#<Y-C(`>GHP-F0W839C,`!Z>C`P,F1C,C<U`'IZ
+M,#`U8C9B,F4`>GHP,#)D83EF8@!Z>C`P,F1B-C@U`'IZ,#)D8C@U,&0`>GHP
+M-6(V86$U,`!Z>C!B-F0X9C%E`'IZ,#9D-#`U86,`>GHP,#`U8C1E,@!Z>C!B
+M-3(S,6$X`'IZ,#!B-F$W-64`>GHP,#)D8S0W-0!Z>C`P-6(V9C)E`'IZ,#`R
+M9&%B9F(`>GHP,#)D8C@X-0!Z>C`R9&)A-3!D`'IZ,&(V83)B.#,`>GHP,#,S
+M8S<P9`!Z>C`Q8C,T,S1E`'IZ,#1F.#(Q9C0`>GHP9C@Q-CEF,0!Z>C`P,#5B
+M-3(R`'IZ,#!B-F(T,3``>GHP86%D9#AC.0!Z>C!B-38S,6$X`'IZ,#`R9&%E
+M-S4`>GHP,#5B-#,R90!Z>C`P,F1A,C@U`'IZ,#`R9#DU9F(`>GHP,35F8S0U
+M,@!Z>C`Q-F-C-CAD`'IZ,#,P9C0V-C4`>GHP,F1A-#4P9`!Z>C`P,39C8V$R
+M`'IZ,#!B-C5C,3``>GHP,&(V-6(U,`!Z>C`Y-&1D.&,Y`'IZ,&(R83,Q83@`
+M>GHP,#)D9&4W-0!Z>C`P-6)A,S)E`'IZ,#`R9&0R.#4`>GHP,#)D8S5F8@!Z
+M>C`Q-F4T-CAD`'IZ,&8S83<T,C@`>GHP,F1D-#4P9`!Z>C`P,39E-&$R`'IZ
+M,#!B-S%C,3``>GHP,&(W,6(U,`!Z>C!C-&1D.&,Y`'IZ,&(X83,Q83@`>GHP
+M,#5B-3@T-@!Z>C`P,F1B,3%C`'IZ,#)D8F8X-S4`>GHP,F1B8C%B,@!Z>C`R
+M9&(R,#4S`%]?87-H;&1I,P!Z>C`P,F1B830R`'IZ,&9B8C%E,V8`>GHP8C<Y
+M96$Y-`!Z>C`U8CAC-C5A`'IZ,#`U8C0P860`>GHP-6(Y-#)E9`!Z>C!D.&1C
+M-C)C`'IZ,#`Q.68T-S``>GHP,F1D.30R9`!Z>C`R9&)E-S-D`'IZ,#`U8C8Y
+M,F(`>GHP8C9D,C,R-0!Z>C`P-6(X-3-D`'IZ,#`Q-F0Y,F4`>GHP8V9B,3@W
+M-0!Z>C`P,F1B,S%C`'IZ,#)D86)B86,`>GHP,F1B8S@U,0!Z>C`P,&(V8S8X
+M`'IZ,#`P8C9B9C@`>GHP,&(V8V8U90!Z>C`Q-F4Q9&9D`'IZ,&(V9C4P8C@`
+M>GHP-F4P831F90!Z>C`P-C=D,F(Q`'IZ,#`R9&)C-C$`>GHP8C9C83,R-0!Z
+M>C`P-6(V8V9D`'IZ,#$V93!D9F0`>GHP,#!B-F8V.`!A=&A?:&%L7W!R;V-E
+M<W-?;F]I<V5F;&]O<@!Z>C`P-6(T.&%D`'IZ,#)D8F8Q8C(`>GHP,#5B.#AC
+M8@!Z>C`S,V5C.&)F`'IZ,&1B-#(U8S4`871H7VAA;%]D;6%?8F5A8V]N7W)E
+M<W!O;G-E7W1I;64`>GHP,&(V9C$V,0!Z>C`V93`P8CAA`'IZ,#)D8F9C,60`
+M>GHP9&,T93,Y,`!Z>C!D869E9#@V`'IZ,#!B-F4R-V$`>GHP,F1B8F%B,@!Z
+M>C!B-F0Q969F`'IZ,#$V9#DP9&0`>GHP,F1B93@U,0!Z>C`P-6(V-&9D`'IZ
+M,#`P8C9D-3(`>GHP8C9C.65F9@!Z>C`Q-F4P,&1D`'IZ,#)D8F0X-S4`>GHP
+M,F1B,S%B,@!Z>C`P8C<P.3(S`'IZ,#!B-F0T-3``>GHP,#!B-F0Q9`!Z>C!B
+M-F,R,S(U`'IZ,#)D8F1A8C(`>GHP,#`U8C8S,@!Z>C`V9&5D9#DS`'IZ,#`Q
+M-F1A-3``>GHP,#`V-V0S,@!Z>C`P8C9D.3(S`'IZ,#`R9&(U,6,`>GHP,39D
+M8V)F90!Z>C`P8C<P,30U`'IZ,#`Q-F1F,F,`>GHP8C=F860S90!Z>C`Q-F0Y
+M.3(P`'IZ,#)D8C%B86,`>GHP9&,V93,Y,`!Z>C`U8C<P,64P`'IZ,#`P8C9B
+M,3``>GHP8C<P.65F9@!Z>C`Q-F1F.#EB`&%T:%]H86Q?871T86-H`'IZ,#9E
+M,&9C,&0`;65M8W!Y`'IZ,#$V9&%B,F0`>GHP,F1B,3,U9`!Z>C!E,#0V.#1B
+M`'IZ,#$V93(Y,60`>GHP,#!B-F9E.`!Z>C`P8V9B,V4P`'IZ,#`Q-F0Y-#@`
+M>GHP,39E,C`Y8@!Z>C!B-S`Q969F`'IZ,#`P8C9C.60`>GHP,#`U8C5A,@!Z
+M>C`R9&(Q-S!A`&%T:%]H86Q?8V]M<'5T971X=&EM90!Z>C`R9&(U8F%C`'IZ
+M,#`U8C@Q,V0`>GHP,&(V8SDR,P!?7W5D:79S:3,`>GHP8C9B-3!B.`!Z>C`P
+M-6(W9CED`'IZ,&(W,#%D,#(`>GHP-F1F9C0T80!Z>C`R9&(U-S8S`'IZ,#9E
+M96%F-C``>GHP93`P-V-A,0!Z>C`P,F1A9C8R`'IZ,&(X,V%D,V4`>GHP,#!B
+M-F(Y,`!Z>C`Q-F0Y969A`'IZ,#$V9&4P-3$`>GHP,#`U8C9B,@!Z>C`U8C=F
+M,3$T`'IZ,#1A93`S,68`>GHP,F1B9&1F9`!Z>C`P-30W9F5D`'IZ,#!B-F)F
+M-64`>GHP,&(W,3<W9`!Z>C`P8C<P9C-D`'IZ,#$V9#@Y,C``>GHP,F1B,6%B
+M,@!Z>C`P,#5B-C(R`'IZ,#`P8C9F-S@`>GHP8C8Y8C`W8P!A=&A?:&%L7V9R
+M964`>GHP-6(W.6(Q8@!Z>C`P8C<P-S-D`'IZ,#)D8F5B8F0`>GHP8C5E,S$U
+M,@!Z>C`Q-F1F8F8Q`&%T:%]H86Q?;6AZ,FEE964`>GHP,39E,3@Y8@!Z>C!D
+M8S)A-6,U`'IZ,#`R9&,V,&(`>GHP-F1F,&(X80!Z>C`R9&(S,S5D`'IZ,&(V
+M8S4S830`>GHP9C4T9#%B,`!Z>C!B-F9D,S8S`'IZ,&0Y9&,V,F,`>GHP-6(W
+M-#%E,`!Z>C`R9&$Y8F%C`'IZ,&1C,C%D,V$`>GHP,&(W,3<S9`!Z>C`Q-F0Y
+M9#0Q`'IZ,#`U8C@T9F0`>GHP,#5B.&%B9`!Z>C`P8C<P,3(S`'IZ,#`U8C8U
+M,F(`>GHP,F1B,S@W-0!Z>C`Q-F4S,#EB`'IZ,#`U8C8P8C(`>GHP,F1B,3@W
+M-0!Z>C`P,F1B.#0R`'IZ,#)D8C$W-C,`>GHP8C=D96$Y-`!Z>C`P8C<P,38Q
+M`'IZ,#$V9#=D-#$`>GHP,#$V8V0S,@!Z>C`V9&4P8CAA`'IZ,#9D.61D.3,`
+M>GHP9&(S960X-@!Z>C`P-6(T.&5D`'IZ,#`R9&,X,&(`>GHP,#)D8F,T,@!Z
+M>C`R9&)A.#4Q`'IZ,#)D8C,S960`>GHP,#5B.#!F9`!Z>C`P-6(W9C)E`'IZ
+M,#)D8F9D9F0`>GHP,39E-C0X80!Z>C`P,F1A9F8R`'IZ,#`U8C<W.60`>GHP
+M,#!B-F5E.`!Z>C`Q-F4T-#AA`'IZ,#!B-F8V8F,`>GHP,39D83DR,`!Z>C`U
+M8C<X,64P`%]?=6UO9'-I,P!Z>C`P,F1C83!B`'IZ,#`U8C0T860`>GHP-F1D
+M9C0T80!Z>C!F86,P8SEB`'IZ,&(V9CEE9F8`>GHP,&(V8S9B8P!A=&A?:&%L
+M7V%D9&ET:6]N86Q?<W=B85]B86-K;V9F`%]C86QL7W9I85]R,P!Z>C`P,#)D
+M8CDR`&%T:%]H86Q?=F5R<VEO;@!Z>C`R9&)A8S)E`'IZ,#)D8C<Y864`>GHP
+M,#$V934S,@!Z>C!B-F-F,#`Y`'IZ,#`Q-F4Q,F,`>GHP,#$V9#EE-`!Z>C`P
+M,#)D865A`'IZ,#`U8C5C8C(`>GHP,39D83(U,0!Z>C`V9C9A9C8P`'IZ,#9D
+M9F1D.3,`871H7VAA;%]M86QL;V,`>GHP,#!B-F1D,@!Z>C`R9&0Y,F%D`'IZ
+M,#$V9&(R-3$`>GHP93$P-V-A,0!Z>C`P8C9C-S5E`'IZ,#$V9&0P-3$`>GHP
+M,F1B9#%B,@!Z>C`R9&,Q-S8S`'IZ,&(V.3!D-F0`>GHP,39D9C`U,0!Z>C`P
+M,39D.34P`'IZ,#!B-S`V8F,`>GHP,#$V9#@W,@!Z>C`V9&5F-#1A`'IZ,#5B
+M.&,R960`>GHP-F9B.30W8@!Z>C!E8F(Q93-F`'IZ,&(V9CED,#(`>GHP9#$T
+M9#%B,`!Z>C!B-#@P,S%E`'IZ,#$V9&)B9F4`>GHP,39E-30X80!Z>C`P,39D
+M.#4P`'IZ,#`P8C9F9C@`871H7VAA;%]M96UC<'D`>GHP,F1B8V)B9`!Z>C`Q
+M-F1A,&1D`'IZ,#)D8F)D9F0`>GHP,F1B,C@U,0!Z>C`R9&)D8S%D`'IZ,#9D
+M8C!C9C(`>GHP,39E8CEA9`!Z>C`P8C9C96)C`'IZ,&0Y-#@T83$`871H7VAA
+M;%]P<F]B90!Z>C`Q-F5A.6%D`'IZ,&9D-&0Q8C``>GHP,F1B,S<V,P!A=&A?
+M:&%L7V)U:6QD;W!T<P!Z>C`R9&%F,S5D`'IZ,#9D9&1D.3,`>GHP9&%D8S8R
+M8P!Z>C`Q-F1F,C4Q`'IZ,#`P8C9C,3``>GHP,39D.3(U,0!Z>C`R9&(P.#4Q
+M`'IZ,&(W,C%A960`>GHP-C=C9F-A90!Z>C`P,&(V8V8X`'IZ,&,Y-&0Q8C``
+M>GHP,F1A9F%B,@!Z>C`U8CDR865D`'IZ,#`U8CAC8V(`>GHP8C9D.65F9@!Z
+M>C`R9&(Q,6(R`'IZ,#)D8F9F8C$`>GHP,F1B9C<V,P!Z>C`P-6(V.&9D`'IZ
+M,#`U8C0T960`>GHP8C<Q,6%E9`!Z>C!B-64S,38P`'IZ,&0X-#@T83$`>GHP
+M,39D.&(R9`!Z>C`Q-F4P.#EB`'IZ,#)D8F(X-S4`>GHP,F1A93@U,0!Z>C!B
+M.#%E83DT`'IZ,#$V9&5C,68`>GHP,&(V9F5B8P!Z>C!E.#DT.3`W`'IZ,#!B
+M-F5A-V$`>GHP,S-E.&9B9@!Z>C!C9F$U.#<U`'IZ,#)D8CDY864`>GHP,F1B
+M.6%B,@!Z>C`P,&(V8F4X`'IZ,&1E-C@S-V8`>GHP,39D86)F90!Z>C!B-S`Y
+M9#`R`'IZ,#8W9#(U93(`>GHP,3EF,V$P,0!Z>C`W,#,Y-#=B`&%T:%]H86Q?
+M;65M>F5R;P!Z>C`V9&9F8S!D`%]?9&EV<VDS`'IZ,&(V-S4P8C@`>GHP,39E
+M,F1F9`!Z>C`P,&(V9#(R`'IZ,#9F96%F-C``>GHP9&,T835C-0!Z>C`P8C<P
+M9C=D`&%T:%]H86Q?<W=?8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP.68V-&(V
+M80!Z>C`P-6(V-3=A`'IZ,#9F,SDT-V(`>GHP-F1A,&-F,@!Z>C!B-V)A9#-E
+M`'IZ,#!B-F8Y-C$`>GHP8C8Y-S-B8P!Z>C`R9&)D,S5D`'IZ,#`U8C@X9F0`
+M>GHP,F1B8F,Q9`!Z>C`R9&%F9&9D`'IZ,#9D-V1D.3,`871H7VAA;%]D96QA
+M>0!Z>C`R9&(Q9&9D`'IZ,#8W9#)F-#$`>GHP,F1A9C@W-0!Z>C!B-V5D939D
+M`'IZ,#$V9#AD-#$`>GHP,#)D864Y,@!Z>C!B-V%D939D`'IZ,#)D8F(S-60`
+M>GHP,F1B,V1F9`!Z>C`R9&(U,V5D`'IZ,#$V9&-E864`>GHP,#!B-F1A,@!Z
+M>C`P,&(V93(R`'IZ,#5B.#`P-#$`>GHP,#$V9#@T.`!Z>C`Q-F0Y8C)D`'IZ
+M,#`Q-F4P,F,`>GHP,&(W,#<W9`!Z>C`P-6(V.3=A`'IZ,#`Q-F1A930`>GHP
+M,39E,3`Y8@!Z>C`P-6(T83)D`'IZ,#$V9&4P9&0`>GHP,39D9C!D9`!Z>C!D
+M9C`W8V$Q`'IZ,#)D8F0W-C,`>GHP,#!B-F4U,@!Z>C`V-V0P8S0W`'IZ,#5B
+M-F,V9&(`>GHP8S,Q-65B-0!Z>C!D8C%E9#@V`'IZ,#9D-#`V93``>GHP,39E
+M,#(U,0!Z>C`P,#)D8F(R`'IZ,#`R9&0X-F0`>GHP,#$V93$T9`!Z>C`R9&(U
+M.6%E`'IZ,#`V-V0R,C$`>GHP,39D.#!D9`!Z>C`P-6(X.3-D`'IZ,#5B.#%B
+M,6(`>GHP,F1B,3-E9`!Z>C`P8C9D,3(S`'IZ,#`P8C9C93@`>GHP-6(X86%E
+M9`!Z>C!B-F5D,S8S`'IZ,#)D868Q8C(`>GHP,#`U8C5E,@!?8V%L;%]V:6%?
+M<CD`7V-A;&Q?=FEA7W(T`'IZ,#,S96)F8F8`>GHP-6(V.#9D8@!Z>C`P,&(V
+M968X`'IZ,&(W,3EA960`>GHP,#5B-3AB,@!Z>C`U8C=D8C%B`'IZ,&(X,F1E
+M-F0`>GHP,#$V9#<S,@!?7VUO9'-I,P!Z>C`R9&%D86(R`'IZ,&8T-64V93,`
+M871H7VAA;%]I;FET7V-H86YN96QS`'IZ,#!B-F0V8F,`>GHP8S$T9#%B,`!Z
+M>C`P,#)D8F0R`'IZ,&1A-#@T83$`>GHP,39E,&(X-P!Z>C`U8CDP,F5D`'IZ
+M,&1C,F4S.3``>GHP838P9#$T-0!Z>C`R9&)A8F)D`'IZ,#`P8C9C,60`>GHP
+M-6(X96%E9`!Z>C`P-6(W8CED`'IZ,#`U8C4T-#8`>GHP-6(V-#9D8@!Z>C`P
+M8C9F.3(S`'IZ,&1D-C@S-V8`>GHP,39E,3(U,0!Z>C!D8S9A-6,U`'IZ,#)D
+M8C,W,&$`>GHP,#`U8C8W,@!Z>C`V9&5F8S!D`'IZ,#)D8F8S-60`>GHP,#!B
+M-F,W.`!Z>C`P,39D.#,R`'IZ,#)D8C4W,&$`>GHP,#5B-F0W80!Z>C`P,F1B
+M,CDR`'IZ,#`U8CDP8V(`871H7VAA;%]R96=?=W)I=&4`>GHP8C9F-3,V,P!Z
+M>C`P-6(U8S0V`&%T:%]H86Q?<F5G7W)E860`>GHP-F0Y,&-F,@!Z>C`V9#AD
+M9#DS`'IZ,#$V9&9B.#<`>GHP,#$V9&$T.`!Z>C!B-C8S,6$X`'IZ,#`R9&(P
+M.3(`871H7VAA;%]G971W:7)E;&5S<VUO9&5S`'IZ,#$V93%B.#<```#(````
+M`@X``,P````"#@``T`````(.``#4`````@X``-@````"#@``W`````(.``#@
+M`````@X``.0````"#@``Z`````(.``#L`````@X``"`````*90``=@````J5
+M`P"$````"JD$`)(````*9`,`%`````JU!``D````"E<$`&@````*B`,`B@``
+M``J(`P"6````"H@#`+X````*B`,`R@````J(`P#<````"H@#`.@````*B`,`
+M^@````J(`P`&`0``"H@#`!@!```*B`,`)`$```J(`P`F````"MP#`&(````*
+M0P0`;@````K<`P"(````"M@#`*P````*B`,`N@````J(`P`.````"C\$`"0`
+M```"#P``#@````H_!``>````"H@#`"@````"#P``7@````J$`P!P````"H0#
+M`.0````"#0``-`````JU!``R````"F8```8````*'@0`(`````H_!``V````
+M"N`#`%`````"$```1`````H_!`!B````"N`#`(@````*X`,`M@````K@`P#V
+M````"N`#`"P!```"$```0`````I#!`!8`````A$``%P````"$@``9@````K@
+M`P"\````"N`#``8!```*X`,`4@$```K@`P">`0``"N`#`.X!```*X`,`+`(`
+M``IH```D````"NX#`%X````*X`,`@@````IH``"B````"F@``"`!```*000`
+M=`$```K@`P"R`0``"N`#`/`!```*X`,`)`(```K@`P!B`@``"N`#`/8"```*
+M:P``'`,```IL```<````"J(#`%H````*X`,`A@````IH``"D````"FD``,X`
+M```*:```[@````II```&`0``"F\``&(!```*X`,`F@$```K@`P#6`0``"N`#
+M`!X"```*X`,`7`(```K@`P"@`@``"N`#`.8"```*X`,`)@,```K@`P!J`P``
+M"N`#`-H#```*X`,`(@0```K@`P!L!```"N`#`+H$```*X`,`]@0```K@`P`>
+M````"G<#`"P````*[@,`1@````I!!`!D````"G```'P````*<0``A@````IR
+M``"L````"D$$`,H````*<```X`````IQ``#J````"G(``!(!```*000`,`$`
+M``IP``!&`0``"G$``%`!```*<@``8@$```JB`P!X`0```@T``"(````*;0``
+M.@````IS```,`0``"N`#`#@!```*X`,`;@$```K@`P":`0``"N`#`,8!```*
+MX`,`]`$```IG``#>````"N`#``@!```*:```$@$```II``!0`0``"N`#`)X`
+M```*X`,`X@````K@`P`H`0``"N`#`%@!```*X`,`B@$```K@`P"\`0``"N`#
+M`/8!```*X`,`*@(```K@`P!:`@``"N`#`*@"```*:```M@(```II```\````
+M`A0``%0````"$P``;`````K@`P!T````"@(``.(````*X`,`Z@````H"```2
+M`0``"N`#`!H!```*`@``5`$```K@`P!<`0``"@(``)(!```*X`,`F@$```H"
+M``#4`0``"N`#`-P!```*`@``#@(```K@`P`6`@``"@(``$X"```*X`,`5@(`
+M``H"``".`@``"N`#`)8"```*`@``W`(```K@`P#D`@``"@(``!P#```*X`,`
+M)`,```H"``"X`P``"N`#`,`#```*`@``%`0```K@`P`<!```"@(``#P$```*
+MX`,`9@0```K@`P"F!```"N`#`!@%```*X`,`I`4```K@`P!@!@``"N`#`'8&
+M```*:0``C@8```II``"D!@``"N`#`+0&```*:0``Z`8```K@`P#^!@``"FD`
+M`!8'```*:0``+@<```K@`P!6!P``"N`#`&@'```*:0``F@<```K@`P#@!P``
+M"N`#`"((```*X`,`8@@```K@`P"H"```"N`#`/0(```*X`,`+@D```K@`P!:
+M"0``"@(``'8)```*X`,`J@D```K@`P`\"@``"N`#`)P*```*X`,`O@H```K@
+M`P!,"P``"N`#`&8+```*X`,`!@````IW```2````"FH``!X````*=```*@``
+M``IU```Z````"G8``!`````*;@```@````IY```X`````E<``%P````"50``
+M"@````IY``!H`````E<```X````*X`,`6`````IZ```.````"GX``"(````*
+M?P``,`````I]```$````"GD``"0````"5P```@````IY```8````"GX``%``
+M```"50``'`````H'!``P`````ET``"@````"50``+@````IY``!"````"H$`
+M`$P````*@@``;@$```J!``#$`0```E4``,@!```"5@``%@````HI`P`R````
+M"GL``#P````*@```4@````I\``!F````"H4``'`````*?@``@@````I_``"2
+M````"G\``-8````*?0``0@$```J)!`#^`0``"GH``!`"```*@P``+@(```J$
+M``#>`@``"D$$`%P#```"%0``8`,```)9``!D`P```E@``&@#```"6@``;`,`
+M``);``!P`P```EP``/@#```*=P,`0@0```J&``"&!```"N`#`-@$```"%0``
+MW`0```)X```$````"AX$`!(````*>0``;@````H>!``"````"AX$`"P````*
+MB`0`%@````K@`P`\````"N`#``0````*>0``8@````J'```:````"N`#`%0`
+M```*@```;`````)>```:````"N`#`%0````*@```;`````)?```&````"H@`
+M`"P````*B0``.@````J*```:````"NX#`#(````*!P0`D`````(6``"Z````
+M"ET$`-X````*M00`\@````JU!``.`0``"K($`!P!```*L@0`1@$```JU!`!.
+M`0``"DP#`&(!```*M00`<@$```JR!`!^`0``"DP$`*`!```*3`0`N@$```I,
+M!`#R`0``"DP$`"`"```*3`0`4@0```J-``!L!```"DP$`*P$```*L@0`^`0`
+M``*:`P`4!0``"K($`!X%```*H@,``@````JB`P`*````"K($`!0````*L@0`
+M'@````JR!``H````"K($`#(````*L@0`/@````J%!`!(`````DX#`$P````"
+M2@0`"`````JR!``2````"K4$`"8````*L@0`,`````JR!``2````"K4$`"8`
+M```*L@0`,`````JR!``Z````"K($`$P````*M00`6@````JR!`!D````"K($
+M`&P````*M00`D@````JR!`#>````"K($``0````*M00`"@````JU!``8````
+M"K($`'8````*L@0`B@````JR!``0````"K4$`!8````*L@0`(@````JR!``N
+M````"K($`#H````*L@0`1@````JR!`!2````"K($`%X````*L@0`;`````JR
+M!`!*````"K($`%X````*L@0`V`````JR!`#D````"K($`/`````*L@0`_```
+M``JR!``(`0``"K($`!8!```*L@0`(`$```J.`P`,````"@<$``@````*!P0`
+M"`````H'!``0`````A<```X````*M00`'`````IG`P`N````"K4$`"(````*
+M1@0`,@````J3`P`*````"K4$`"(````*L@0`"@````JU!``<````"K($`!``
+M```*M00`*`````JR!``*````"K4$``H````*M00`/`````JR!`!.````"G$$
+M``@````*M00`,@````JR!``$````"K4$``@````*M00`+`````JR!``0````
+M"@<$`#@````*L@0`6@````JR!`!H````"K4$`'P````*M00`B@````JR!``(
+M````"K4$`!(````*M00`'`````JU!``$````"K4$``@````*M00`&`````JR
+M!``&````"K4$`!P````*M00`)@````JU!``.````"K4$``@````*M00`%@``
+M``JU!``D````"K4$`#(````*M00`0`````JU!``.````"D(#`"@````*?00`
+M,@````JR!``&````"K4$`!`````*0@,`#@````I"`P`L````"K4$`#@````*
+M?00`2`````JR!``&````"K4$`!`````*0@,`#@````JU!``<````"K($`"X`
+M```*M00`/@````JR!``.````"D(#`"P````*M00`.@````I]!`!,````"K($
+M``8````*M00`%`````I"`P`2````"C<$`!X````*L@0`,`````HX`P`,````
+M"ED$``H````*M00`&@````JR!``H````"K4$`#8````*L@0`#`````JU!``:
+M````"K($`"(````*5P0`+@````JU!``^````"E<$`$8````*M00`5`````JR
+M!`!N````"K4$`'P````*L@0`"@````JU!``:````"K($`"@````*M00`-@``
+M``JR!``8````"H\``"`````*D```)@````J.```$````"K4$`!H````*2P0`
+M)`````(N`P`H`````A($``0````*M00`!@````JR!``&````"K($``@````*
+ML@0`%`````JU!``D````"E<$``@````*M00`%@````JR!``(````"K4$`!8`
+M```*L@0`#`````JR!``6````"K($`!8````*M00`*`````JU!``X````"K($
+M`!8````*M00`*`````JU!``X````"K($``0````*M00`&`````JR!``B````
+M"K4$`%@````*M00`)`````H>!`!*````"K4$`%@````*700`C`````JR!`"D
+M````"K($`*P````*D0``T@````JR!``*`0``"K($`!8!```*L@0`(`$```JU
+M!``L`0``"K($`%@!```*L@0`<`$```JR!`!Z`0``"K($`(0!```*L@0`C@$`
+M``JR!`"6`0``"K4$`*`!```*L@0`J@$```JR!`"Z`0``"K4$`,0!```*L@0`
+MS@$```JR!`#8`0``"K($`.(!```*L@0`[`$```JR!`#V`0``"K($```"```*
+ML@0`"@(```JR!``8`@``"K($`"("```*L@0`*@(```K5`P`T`@``"K($`#X"
+M```*L@0`2`(```JR!`!2`@``"K($`%P"```*L@0`9@(```JR!`!P`@``"K($
+M`'H"```*L@0`A`(```JR!`".`@``"K($`)P"```*L@0`I@(```JR!`"P`@``
+M"K($`-0"```*L@0`X@(```JJ!`#R`@``"K4$``H#```*L@0`*@,```JR!``T
+M`P``"K4$`%(#```*L@0`7`,```JU!`!V`P``"K($`(`#```*M00`G@,```JR
+M!`"H`P``"K4$`+P#```*L@0`Q`,```J2``#Z`P``"K($``($```*5P0`#`0`
+M``JU!``:!```"K($`"8$```*9P,`+@0```JS`P"P!````A@```8%```*=`,`
+M'`4```J=`P`F!0``"K4$`#0%```*L@0`2`4```JD!`!<!0``"B<#`'`%```*
+M.00`A`4```JR!``*````"K4$`&H````*L@0`"@````J1```&````"I,```@`
+M```*&00`%@````J3```F````"E<$`#`````*DP``-@````I7!``*````"AD$
+M`"H````*L@0`-`````J3``!`````"E<$`$H````*DP``5`````I7!`!>````
+M"AD$`'`````*DP``%`````H>!``D````"K4$`#(````*L@0`/`````JU!`!,
+M````"K($`%0````*5P0`7@````JU!`!N````"K($`'0````*5P0`?`````J2
+M``"0````"E<$`)H````*M00`J`````JR!`"P````"K4$`+H````*M00`R```
+M``JU!`#>````"K($`/`````*L@0`!`$```JR!``*`0``"E<$`!(!```*M00`
+M(@$```JR!``H`0``"E<$`#(!```*L@0`.@$```JU!`!(`0``"K($`$X!```*
+M5P0`6`$```JU!`!F`0``"K($`'(!```*9P,`?`$```JR!`"&`0``"K($`)`!
+M```*L@0`F`$```JS`P"B`0``"E<$`*H!```*LP,`P`$```JU!`#.`0``"K($
+M`-@!```*L@0`(`````JR!``F````"E<$`#@````*9P,`3`````JR!`!6````
+M"H@#`'H````*0P0`D`````J(`P!D````"D,$`'`````*B`,`O@````J5``#2
+M````"I4``.8````*E0``^`````J5```X`0``"I0``$@!```*E0``;@$```J4
+M``!^`0``"I4``*@!```*E```N`$```J5``#>`0``"I0``.X!```*E0``3`(`
+M``(:```8````"@<$`"0````*!P0`+@````J6``!F````"DP#`(8````*3`,`
+MO`$```I,`P#0`0``"DP#`.0!```*3`,``@(```JR!``@`@``"K($`#0"```"
+M&P``.`(```(9```.````"D,$`!0````*3`,`(@````JR!``L````"K($``0`
+M```*M00`"@````JU!``8````"K($`"0````*9P,`,@````I7!``X````"F\#
+M`!@````*B@0`'`````HV!`!*````"D$$`'H````*W0,`1`````JR!`!.````
+M"K($`%@````*L@0`<@````JR!`!\````"K($`(@````*M00`F@````JR!`"P
+M````"K($`+H````*L@0`Q`````JR!`#@````"K($`.H````*L@0`]`````JU
+M!``&`0``"K($`!`!```*L@0`0@$```JR!``8````"K4$`"@````*L@0`!@``
+M``K``P`2````"G$$`!H````*M00`.@````IQ!`!&````"K($`$X````*<00`
+M+`````JR!`!"````"K($`!@````*M00`(@````JR!``P````"K4$`#P````*
+M5P0`3@````JR!`!D````"F<#``@````*L@0`%@````JR!``F````"K4$`#H`
+M```*3`,`%@````KN`P`N````"@<$`(@````"'```L@````J[!`#4````"K($
+M`-X````*L@0`Y@````I7!`#N````"K4$`!H!```*M00`*`$```J:``!2`0``
+M"K($`%H!```*5P0`8`$```J9``"``0``"FH$`*H!```*M00`Q`$```IJ!`#L
+M`0``"FH$`)`"```"'0``P`(```J=!`#J`@``"K($`/0"```*5P0`^@(```J9
+M```,`P``"K($`!(#```*5P0`2`,```IJ!`"``P```O,#`(0#```*FP``B@,`
+M``JE!`"@`P``"FH$`.`#```*AP0`"`````H^!``.````"J(#`$(````*M00`
+M5@````JR!`!>````"K4$`(`````*L@0`B`````JU!`"H````"K($`+@````*
+M5P0`S`````(-``#0`````@T``"0````*_@,`R`````IJ!``*````"K($`!0`
+M```*L@0`'@````JR!``H````"K($`#(````*L@0`1@````JS!`!8`````DX#
+M`%P````"2@0`"`````JR!``2````"K4$`"8````*L@0`,`````JR!``2````
+M"K4$`"(````*L@0`+`````JR!``V````"K($`$@````*M00`5@````JR!`!@
+M````"K($`&@````*M00`C@````JR!`"N````"K($`+@````*M00`S@````JR
+M!``$````"K4$``@````*M00`C@````JU!`"<````"K4$`*P````*M00`N@``
+M``JU!`#(````"K4$`!@````*L@0`(`````JU!`".````"K($`*(````*L@0`
+M$`````JU!``6````"K($`"(````*L@0`+@````JR!``Z````"K($`$8````*
+ML@0`4@````JR!`!>````"K($`&P````*L@0`3@````JR!`!B````"K($`/(`
+M```*L@0`_@````JR!``*`0``"K($`!8!```*L@0`(@$```JR!``P`0``"K($
+M`#H!```*[`,`#`````H'!``(````"@<$``@````*!P0`$`````(7```.````
+M"K($`!@````*L@0`)`````IG`P`T````"K4$`"`````*`P0`+`````JU!``\
+M````"K($`$8````*8P0`5@````I4`P`*````"K4$`!P````*L@0`"@````JU
+M!``<````"K($`!`````*M00`*`````JR!``*````"K4$``@````*M00`)@``
+M``JR!``X````"B<$``H````*M00`)`````JR!``T`````AX``!`````*!P0`
+M.`````JR!`!6````"K($``@````*M00`$@````JU!``<````"K4$``0````*
+MM00`"`````JU!``8````"K($``8````*M00`'`````JU!``F````"K4$``8`
+M```*M00`"`````JU!``6````"K4$`"0````*M00`,@````JU!`!`````"K4$
+M``X````*0@,`)`````I]!``N````"K($``8````*M00`$`````I"`P`.````
+M"D(#`"P````*M00`.`````I]!`!(````"K($``8````*M00`$`````I"`P`.
+M````"K4$`!P````*L@0`+@````JU!``^````"K($``X````*0@,`+`````JU
+M!``Z````"GT$`$P````*L@0`!@````JU!``4````"D(#``0````*M00`!```
+M``JU!``*````"K($`!8````*_P,`%@````HW!``8````"K($`"8````*.`,`
+M#`````I9!``,````"K4$`!H````*L@0`(`````I7!``L````"K4$`#P````*
+M5P0`1`````JU!`!2````"K($`&P````*M00`>@````JR!``*````"K4$`!H`
+M```*L@0`*`````JU!``V````"K($``H````*M00`&@````JR!``H````"K4$
+M`#8````*L@0`&`````J<```@````"IT``"8````*G@``!`````JU!``H````
+M"DL$`#`````"V@,`-`````(I!``X`````@X$``0````*M00`!@````JR!``&
+M````"K($``@````*L@0`%`````IG`P`(````"K4$`!8````*L@0`"`````JU
+M!``6````"K($``P````*L@0`%@````JR!``6````"K4$`"@````*M00`.```
+M``JR!``6````"K4$`"@````*M00`.`````JR!``$````"K4$``8````*L@0`
+M(`````JU!`!J````"AX$`)@````*M00`H@````JU!`"Z````"K4$`-(````*
+MM00``@$```JU!``4`0``"K4$`"8!```*M00`-@$```JU!`!``0``"K4$`$P!
+M```*NP0`P`$```JR!``,`@``"DP#`!8"```*3`,`;@(```JR!`!\`@``"I\`
+M`)@"```*L@0`N@(```JR!`#D`@``"K($```#```*M00`$@,```JR!``<`P``
+M"K($`"8#```*L@0`,`,```JU!`!``P``"K($`%`#```*L@0`6@,```JR!`!R
+M`P``"K($`*P#```"8```L`,```(?``"T`P```B$``+@#```"(```X`,```JR
+M!``4!```"K($`#`$```*L@0`.`0```J@``!"!```"K4$`%`$```*L@0`6@0`
+M``JR!`!D!```"K($`&X$```*L@0`F@0```JR!`"R!```"K($`,`$```*L@0`
+MS`0```JR!`#L!```"K4$`/P$```*L@0`!`4```I"!``H!0``"K4$`$`%```*
+ML@0`2`4```JA``!0!0``"J(``'@%```*L@0`@@4```JR!`"*!0``"K4$`*8%
+M```*B`,`K`4```I7!`"V!0``"K4$`,0%```*L@0`T`4```IG`P#8!0``"CH#
+M``H&```*L@0`*`8```JR!``X!@``"BX$`$@&```*L@0`4@8```JR!`!<!@``
+M"K($`&8&```*M00`<`8```JR!`!\!@``"K($`(H&```*M00`F@8```JR!`"H
+M!@``"K4$`+@&```*L@0`S@8```IN`P#8!@``"K4$`.8&```*L@0`^@8```JY
+M`P`.!P``"O4#`"('```*50,`-@<```JR!``$````"J,```@````*>`0`%```
+M``JC```B````"E<$``P````*>`0`4@````JR!`!>````"K($`&@````*L@0`
+M<`````I7!`!\````"K($`)(````*L@0`F@````I7!`#"````"K($`-@````*
+ML@0`X`````I7!`#L````"K($`/0````*HP``_@````I7!``(`0``"G@$`!@!
+M```*HP``%@````H>!``R````"K4$`$8````*M00`4`````JU!`!:````"K4$
+M`'0````*0P0`@@````I#!`"0````"K4$`*@````*L@0`L`````JD``#0````
+M"CH#`-H````*5P0`X@````HZ`P`&`0``"J4``!0````*M00`(@````JR!``H
+M````"E<$`#H````*9P,`3@````JR!``0````"J@#`#(````*3`,`8`````I,
+M`P!^````"DP#`*8````*L@0`O@````JR!`#4`````B(```0````*M00`$```
+M``JU!``L````"K($`#8````*M00`1`````JR!`!>````"K4$`&H````*5P0`
+M@`````JF```,````"J@``!P````*M00`(@````JF```4````"I0$`"0````*
+MJ```.@````JG``!H`````B,``'(````*M00`@`````JR!``H````"D,$`#0`
+M```")```P@$```I,`P#F`0``"DP#``("```*3`,`(`(```I,`P`Z`@``"DP#
+M`'H"```*L@0`U`(```)A``"T````"K($`+X````*L@0`-@````JU!`!0````
+M"K($`'@````*M00`C@````JU!`"P````"K($`+X````*_P,`U@````JR!`#@
+M````"K4$``8!```*L@0`$`$```JU!``N`0``"K($`#@!```*M00`8@$```JR
+M!`"$`0``"K($`(X!```*M00`I@$```JR!`"P`0``"K4$`,X!```*L@0`*`(`
+M``JU!``^`@``"K($`!0````*L@0`M@````JI``#"````"C$#`/H````*J@``
+M)@````I!!``N````"D$$`((````*JP``G`````)B``"@`````F,``#X!```*
+M0P0`4@$```I#!`#R`0``"JP``(`"```*L@0`I`(```)B``"H`@```F,``&8`
+M```*-`0`L`````JM``!,`0``"JT``*0"```"9```L`(```(-``#N`@``"JP`
+M`/`#```*L@0`(@0```JR!``J!```"HL#`%0$```")0``(@````JN``!"````
+M"JT``%X````*KP``>@````JO``",````"JX``)X````*K@``M`````JL``#*
+M````"JX``-H````*K@``\@````JL```,`0``"JP``%(````*0P0`E`````I#
+M!``\````"JT``"@````")@``&@````JR!``@````"K4$`#H````*L```1@``
+M``JQ``!2````"K(``%X````*LP``V`````(F``#<`````B8```H````*M00`
+M7@````JR!``*````"J````8````*%`0`$@````HG!``:````"K4$`$(````*
+M)P0`7@````JR!`!F````"B<$`!@````*B@0`'`````HV!`!:````"D$$`)8`
+M```*@`,`'@````JR!``\````"K($`$0````*M00`7`````JR!`":````"K($
+M`+@````*L@0`P`````JU!`#8````"K($`&`````*M```A@````JR!`"H````
+M"K($`+@````*L@0`U`````JR!`#R````"K($```!```*M00`(`$```JR!``^
+M`0``"K($`%P!```*L@0`=`$```JU!`"$`0``"K($`*`!```*M00`L`$```JR
+M!`#,`0``"K4$`-P!```*L@0`^`$```JU!``&`@``"K($`#8"```*M00`1`(`
+M``JR!`!P`@``"K($`)("```*L@0`K`(```JU!`"\`@``"K($`(P#```"2@0`
+MD`,```).`P"4`P```M\#`+X#```*M```"@````JU!``*````"K($``P````*
+ML@0`#@````JU!``B````"K4$``X````*L@0`&`````J:!``B````"E<$`#8`
+M```*L@0`#`````JR!``6````"K($`"`````*L@0`*@````JR!``T````"K($
+M`#X````*L@0`2`````JR!`!2````"K($`%P````*L@0`9@````JR!``(````
+M"K($`!8````*L@0`)@````JU!``Z````"DP#`&X````*T0,`>`````(-``!\
+M`````@T``(`````"#0``A`````(-```4````"@<$`'0````")P``S@````H'
+M!`#\`````BH``#0````"*P``'`````KN`P`\````"D,#`$@````*I@0`5```
+M``JU!`!T````"K@``((````*L`0`D@````JU!`"\````"K8``,(````*-P,`
+MX`````JU!`#P````"K($`/P````*L@0``@$```I@`P`,`@``"J\$`#8"```*
+MM00`<@(```JO!`",`@``"J\$`*P"```*KP0`W@(```JO!`!L`P```B@``'`#
+M```"*0``J`,```J=!`!8!```"K($`&($```*5P0`:`0```I@`P!Z!```"K($
+M`(`$```*5P0`F@0```JO!`"X!```"E$$`.0$```*Y0,`_@0```K$`P`:!0``
+M"JT$`"0%```*D00`/`4```H[!`!2!0``"J\$`(@%```*MP``G`4```J?`P`$
+M````"I`#`!0````*X`,`&@````IA`P`D````"J8$`"X````*/@0`-`````JB
+M`P!"````"K4$`%8````*L@0`7@````JU!`"`````"K($`(@````*M00`J```
+M``JR!`"X````"E<$`,P````"#0``T`````(-```V````"N`#`.(#```*X`,`
+M!@````K*`P`0`````K$$`!0````"N0``#`````JR!``6````"K($`"`````*
+ML@0`*@````JR!``^````"LH#`%8````*L@0`8`````JR!`!&````"K`#`%@`
+M```"3@,`7`````)*!``(````"K($`!(````*M00`)@````JR!``P````"K($
+M`!8````*M00`)@````JR!``P````"K($`#H````*L@0`3`````JU!`!:````
+M"K($`&0````*L@0`;`````JU!`"2````"K($`+(````*L@0`Y@````JR!`#\
+M````"K($``P!```*L@0`#@````JR!``8````"K($`"0````*9P,`-`````JU
+M!``*````"K4$`!P````*L@0`"@````JU!``<````"K($`!`````*M00`*```
+M``JR!``*````"K4$``H````*M00`.`````JR!`!*````"O8#``8````*M00`
+M%`````JU!``F````"K4$`'@````*M00`S@````JU!`#P````"K4$`$(!```*
+MM00`4`$```JU!`!@`0``"K4$`&X!```*M00`?`$```JU!``>````"K($`"8`
+M```*M00`Y`````JR!`#L````"K4$`/P````*L@0`$`$```JR!``8````"K4$
+M`"@````*M00`.`````JR!`!$````"K($`%`````*L@0`7`````JR!`!H````
+M"K($`'(````*L@0`?@````JR!`",````"K($`+@````*L@0`Q`````JR!`#0
+M````"K($`-X````*L@0`5`````JR!`!H````"K($`%H!```*L@0`:@$```JR
+M!`!X`0``"K($`(8!```*L@0`D@$```JR!`"@`0``"K($`*H!```*1P0`1@(`
+M``JR!`!2`@``"K($`%X"```*L@0`:@(```JR!`!V`@``"K($`(("```*L@0`
+MC@(```JR!`"<`@``"K($`+`"```*L@0`O`(```JR!`#6`@``"K($`.0"```*
+ML@0`\@(```JR!````P``"K($``P#```*L@0`&@,```JR!``D`P``"D<$`#P#
+M```"#0``#`````H'!``(````"@<$``P````*!P0`#`````H'!``T````"K($
+M`$P````*L@0`*`````K@`P`T````"K4$`$0````*L@0`5`````K@`P!T````
+M"N`#``H````*M00`)`````JR!``T`````BP``!`````*!P0`.`````JR!`!6
+M````"K($``@````*M00`$@````JU!``<````"K4$``0````*M00`"`````JU
+M!``:````"K($`"0````*L@0`2`````JU!`!J````"K($``8````*M00`'```
+M``JU!``F````"K4$``8````*M00`"`````JU!``6````"K4$`"0````*M00`
+M,@````JU!`!`````"K4$``0````*M00`!`````JU!``*````"K($`!8````*
+M*P,`#@````I"`P`H````"GT$`#(````*L@0`!@````JU!``0````"D(#``X`
+M```*0@,`+`````JU!``X````"GT$`$@````*L@0`!@````JU!``0````"D(#
+M``X````*M00`'`````JR!``N````"K4$`#X````*L@0`#@````I"`P`L````
+M"K4$`#H````*?00`3`````JR!``&````"K4$`!0````*0@,`(`````JR!``P
+M````"K($`#`````*?00`N`````JR!`#"````"K($`,X````*L@0`"@````I!
+M`P`$````"C,#`!0````*L@0`-`````JR!``^````"K4$`%`````*L@0`6@``
+M``JR!`!D````"K4$`'(````*L@0`I`````JR!`"N````"K($`+@````*L@0`
+MP@````JR!`#,````"K4$`.`````*L@0`Z@````JR!`#T````"K($`/X````*
+ML@0`"`$```JU!``D`0``"K4$`#(!```*L@0`.@$```JU!`!(`0``"K($`%(!
+M```*L@0`7`$```JR!`!F`0``"K($`'`!```*L@0`>@$```JR!`":`0``"K($
+M`*(!```*M00`S@$```JR!``$````"C,#`!(````*M00`(`````JR!``H````
+M"K4$`#8````*L@0`0`````JR!`!(````"K4$`'0````*L@0`?@````JR!`"(
+M````"K($`)(````*L@0`G`````JR!`"F````"K($`,8````*L@0`*`````(M
+M``"J````"K4$`'P!```*I@,`M`$```HW!`"\`0```@T``.`!```"#0``<```
+M``JU!`":````"K($`"@!```*O0,`9`$```HX`P!L`0```@T``)@!```"+@``
+M#`````I9!``,````"K4$`!H````*L@0`(`````I7!``L````"K4$`#P````*
+M5P0`1`````JU!`!2````"K($`&P````*M00`>@````JR!``*````"K4$`!H`
+M```*L@0`*`````JU!``\````"K($``H````*M00`&@````JR!``H````"K4$
+M`#P````*L@0`&`````JZ```@````"KL``"8````*O```!`````JU!`",````
+M"DL$`)0````"20,`G`````+(`P"@`````FT$`*0````"\`,`J`````(R`P"L
+M`````GH$`+`````"]P,`M`````("!``$````"K4$``8````*L@0`!@````JR
+M!``(````"K($`!0````*9P,`"`````JU!``6````"K($`!P````*30,`)```
+M``K[`P`(````"K4$`!8````*L@0`'`````JA`P`,````"K($`!8````*L@0`
+M%@````JU!``H````"K4$`#@````*L@0`%@````JU!``H````"K4$`#@````*
+ML@0`!@````JU!``0````"K4$``X````*L@0`-`````JR!`!`````"K4$`%``
+M```*M00`7@````JR!``B````"K4$`#@!```*K@,`8@````JF!`!J````"@<`
+M`'(````*'@0`H@````JU!`"L````"ND#`+0````*^P,`$@$```HH`P`:`0``
+M"@<``"(!```*M00`-`$```JU!`!&`0``"K4$`%0!```*M00`7@$```JU!`!H
+M`0``"GL#`&X!```*:0,`=@$```JP!``"`@``"@<```X"```*L@0`+@(```JR
+M!``^`@``"E<$`'("```*L@0`@@(```I7!`":`@``"HD$`+8"```*,@0`S`(`
+M``JR!`#P`@``"D,$`$`#```"+P``1`,```(P``!R`P``"K($`'P#```*M00`
+MB@,```JR!`"2`P``"K4$`*8#```*L@0`L`,```JR!`#&`P``"K($`-`#```*
+ML@0`#`0```JU!``:!```"K($`"0$```*=@,`0@0```IB!`!4!```"HD$`*($
+M```*M`,`J@0```HF!`"R!```"F4$`,H$```*L@0`^`0```JR!``B!0``"K($
+M`"H%```*00,`5@4```JR!`!N!0``"K($`'@%```*M00`A@4```JR!`"0!0``
+M"K($`)H%```*L@0`I`4```JR!`#0!0``"K($`.@%```*L@0`]@4```JR!``"
+M!@``"K($``H&```*S@,`(`8```I0`P`H!@``"GH#`'8&```*M00`B`8```JR
+M!`"0!@``"K4$`*P&```*B`,`N`8```JR!`"J!P``"E<$`+0'```*M00`P@<`
+M``JR!`#.!P``"E<$`-X'```*M00`[@<```JR!`#X!P``"K4$``8(```*L@0`
+M)`@```JU!``X"```"K($`$`(```*M00`4`@```JR!`!D"```"FL#`'H(```*
+ML@0`H@@```JI`P#."```"K($`-8(```*M00`Y@@```JR!`#V"```"M8#``()
+M```*9P,`"@D```JX`P`4"0``"K4$`"()```*L@0`2`D```JR!`!2"0``"K($
+M`%P)```*L@0`Q@D```HT!`#0"@``"K($`.(*```*L@0`]@H```I?`P`*"P``
+M"DH#`!X+```*8P,`,@L```JR!`"$"P``"F8#`)`+```*>P0`&`````JU!``N
+M````"K($`$H````*M00`7`````JU!`!J````"K($``@````*X`,`%`````H>
+M!``N````"KT$`$X````*L@0`6`````JU!`!B````"E<$`'8````*S@,`@@``
+M``JU!`">````"H@#`*0````*5P0`K@````IV`P#`````"K($``P!```*M`,`
+M%`$```HF!``>`0``"K4$`"P!```*L@0`?@$```IF`P"*`0``"GL$``@````*
+MM00`,@````JR!``Z````"K4$`%`````*L@0`6`````JU!`!T````"K($``0`
+M```*O0``"`````JF!``8````"KT```X````*O0``'`````JF!``H````"KT`
+M`&8!```*M00`A`$```JR!`"0`0``"K($`)X!```*L@0`I@$```I7!`"V`0``
+M"K($`+X!```*5P0`R`$```JR!`#4`0``"K($`!H````*'@0`2@````JU!`!H
+M````"K4$`'(````*M00`?`````JU!`".````"K4$`)X````*L@0`R`````I#
+M!`#F````"H@#``@!```*M00`(`$```JR!``H`0``"K4$`#H!```*L@0`0@$`
+M``JU!`!2`0``"K($`(X!```*M00`H@$```JR!`"J`0``"K4$`+H!```*L@0`
+MQ@$```KI`P#<`0``"K4$`.@!```*L@0`/@(```J^```V````"K4$`$0````*
+ML@0`2@````I7!`!<````"F<#`'`````*L@0`>@````JF!`"&````"K4$``0`
+M```*M00`"@````JU!``<````"H4#`"X````*OP``&@````JR!``H````"K($
+M`#`````*M00`/@````JR!`!(````"K($`%0````*L@0`8@````JR!`!R````
+M"K($`'`````*3`,`O@````JU!`#0````"K4$`.`````*L@0`\@````JR!`#\
+M````"K($`%`````*V`,`K@````JU!`#,````"K($`.@````*M00`"@$```JR
+M!``8`0``"BL#`#`!```*L@0`Q`$```JU!`#>`0``"K($`.@!```*M00```(`
+M``JR!``(`@``"K4$`!X"```*L@0`*`(```JU!`!$`@``"K($`&P"```*L@0`
+M=@(```JU!`".`@``"K($`)@"```*M00`M@(```JR!`#J`@``"N,#``8#```*
+MM00`&@,```JR!`!&`P``"K4$`%X#```*L@0`9@,```JU!`!X`P``"K($`(`#
+M```*M00`D`,```JR!`"Z`P``"K4$`-0#```*L@0`[`,```JR!``P````"G<#
+M`#H````*=P,`K@````K@`P#X````"K4$``X!```*M00`&@$```JR!``B`0``
+M"K4$`#`!```*L@0`.@$```JR!`!$`0``"K($`$X!```*M00`6@$```JR!`!D
+M`0``"K($`&X!```*M00`>@$```JR!`"&`0``"K($`)`!```*L@0`F@$```JR
+M!`"B`0``"K4$`*X!```*L@0`N`$```JR!`#"`0``"K($`,P!```*L@0`U@$`
+M``JU!``@`@``"D,$`#0"```*0P0`0@(```I#!`!4`@``"D,$`&X"```*0P0`
+M+`,```(-```P`P```@T``*X#```*M00`P`,```JR!`#*`P``"K4$`-H#```*
+ML@0`^`,```JR!``"!```"K($``P$```*M00`(`0```JR!``J!```"K($`#0$
+M```*M00`0@0```JR!`!.!```"K($`%@$```*L@0`8@0```JR!`!J!```"K4$
+M`'X$```*L@0`B`0```JR!`"2!```"K($`)P$```*L@0`I@0```JU!`"Z!```
+M"K($`#`````*B`,`9`````JU!`!T````"K($`'P````*M00`E`````JR!``:
+M````"G8#`!P````*000`)@````I!!`!H`````AH``((````*P0``G`````J)
+M!`!L`0``"D,$`'H!```*P@``K@$```JR!`#J`0``"K($`!X"```*L@0`4@(`
+M``JR!`"&`@``"K($`)X"```*L@0`2@````HQ`P"H````"L,``#8!```*PP``
+MD`$```HT!`#>`0``"L0``*0#```*Q```'`````K@`P!D`````C$``)(````*
+MP0``)`````H'!`!&````"G<$`$`````*0P0`:@````I#!`"\````"D,$`.8`
+M```*0P0`2`````IW!`#&````"L4``-P````*Q0``\@````K%```(`0``"L4`
+M`%@````",@``7`````(F```>````"N`#`"@````*P```2`````K@`P!2````
+M"L```"8````*L@0`)`````JU!`!T````"L<``)@````*Q@``I@````K(``"R
+M````"LD``.`````",@``Y`````(F```4````"N`#`!X````*P```,@````K@
+M`P`\````"L```!(````*3`,`0@````IX`P!F````"H0#`'P````*L@0`F```
+M``IX`P#0````"H0#`-X````*L@0`^`````J$`P`&`0``"K($``@````*M00`
+M3`````JR!`!6````"K($`&`````*L@0`:@````JU!`!\````"K($`!0````*
+M]@,`'@````JU!`!:````"K($`&(````*]@,`(@````J*!``F````"C8$`)X`
+M```*000`Y@````IS`P!J````"LH``)0````*L@0`M@````JR!`#<````"K($
+M``X!```*L@0`+@$```JR!`!V`@``"K($`*@"```*L@0`N`(```JR!`#,`@``
+M"K($`-8"```*L@0`X`(```JR!`#H`@``"K4$`/@"```*L@0`<`,```)*!`!T
+M`P```DX#`'@#```"WP,`\@,```K*```*````"K4$``H````*L@0`#`````JR
+M!``.````"K4$`"(````*M00`%`````JR!``B````"KT$`"P````*5P0`0```
+M``J]!`!Z````"K4$`(@````*L@0`G@````JR!`"F````"K4$`+P````*M00`
+MS`````JR!`#2````"E<$`-P````*M00`Z@````JR!`#Z````"E<$``(!```*
+MO00`$`$```JU!``>`0``"K($`"H!```*L@0`"`````JG!``2````"K($`!P`
+M```*L@0`)@````JR!``R````"K($`#X````*L@0`"`````JR!``2````"J<$
+M`!P````*L@0`)@````JR!``(````"J<$`"8````*000`V@````JR!`#H````
+M"K($`.X````*30,`#@````JA`P`8````"K($`"(````*L@0`-@````JU!`!:
+M````"K($`&0````*M00`@@````JR!`"*````"K4$`*@````*L@0`L@````JU
+M!`#0````"K($`$8!```*M00`9`$```JR!`!L`0``"K4$`(@!```*L@0`D@$`
+M``JU!`"N`0``"K($`+8!```*M00`T@$```JR!`#:`0``"K4$`/`!```*L@0`
+M^`$```JU!``4`@``"K($`"("```*M00`-`(```JU!`!"`@``"K($`)H"```*
+MM00`L@(```JR!`#R`@``"K4$`!`#```*L@0`6`,```JU!`!R`P``"K($`*`#
+M```"#0``V`,```(-``#<`P```@T``.`#```"#0``Y`,```(-``#H`P```@T`
+M`.P#```"#0``%`0```(-```@!````@T``#`$```"#0``4@0```J0`P!8!```
+M"I8$`&0$```*^@,`A`0```J6!`"0!```"OH#`)X$```*L@0`K`0```JR!`"R
+M!```"DT#`+H$```*E@0`R`0```KZ`P!0````"K($`%H````*L@0`9@````JR
+M!`!R````"K($`'P````*IP0`9@````J]`P""````"KT#`)8````*/P0`K```
+M``J]`P"\````"KT#`%P````*/P0`<@````J]`P`.````"LL``&(````*O0,`
+M;`````J]`P!V````"KT#`(`````*O0,`B@````J]`P"0````"I8$`)X````*
+M^@,`I`````K,``#"````"KT#`,P````*O0,`W@````J]`P#H````"KT#`/H`
+M```*O0,`!`$```J]`P`.`0``"KT#`!@!```*O0,`(@$```J]`P`R`0``"I8$
+M`#X!```*^@,`1`$```K,``!0`0``"K($`%P!```*L@0`9`$```K,``!J`0``
+M"I8$`'@!```*^@,`$`````JR!``:````"K($`"0````*IP0`-`````JU!``^
+M````"K4$`)0````*S0``H@````K.``"H````"LP``"H````*S0``4`````K.
+M``!6````"LP``&H````*O0,`"@````JU!``4````"K4$`!X````*M00`5@``
+M``I#!``@````"M```#8````*S```4`````JG!`!8````"K4$`&(````*M00`
+M?@````JR!`"*````"K($`)@````*L@0`I`````JR!`#^````"H@#`!(!```*
+MB`,`'@$```K/```\`0``"H@#`$@!```*S0``6@$```J(`P!F`0``"LX``&P!
+M```*S```)@````JR!``V````"E<$`$X````*L@0`7@````I7!`!^````"K($
+M`(X````*5P0`H`````(S``"D`````C0``*@````"-@``$`````JH`P`R````
+M"DP#`$X````*M00`;@````JR!`".````"DP#`*P````*3`,`U`````JR!`#L
+M````"K($```!```"/```,`````(-``!:`@``"I8#`&@"```*E@,`@@(```JR
+M!`"2`@``"E<$`*H"```*L@0`N@(```I7!`#D`@``"K($`/0"```*5P0`'@,`
+M``JR!``N`P``"E<$`(8#```*E@,`F`,```J6`P"J`P``"I8#`+P#```*E@,`
+MS@,```J6`P#@`P``"I8#`/@#```*L@0`"`0```I7!`!.!```"I8#`&`$```*
+ME@,`H`0```J6`P"N!```"I8#`+P$```*E@,`U@0```JR!`#F!```"E<$``@%
+M```"-0``#`4```(W```0!0```C@``!0%```".0``&`4```(Z```D!0```CL`
+M`,0````*000`$@$```K7``"R`0``"D,$`,8!```*0P0`8@(```K5```B````
+M"M@``$(````*=P0`7@````K9``!Z````"MD``(P````*V```G@````K8``"P
+M````"M4``,8````*V```U@````K8``#L````"M4```0!```*U0``/`````IW
+M!``.````"J(#`"`````*H@,`*`````(D```,````"NX#`"0````*[@,`C```
+M``+:``"4`````M$``)P````"TP``I`````+2``"L`````M0``+0````"U@``
+MO`````+;``#$`````MP``"8````*L@0`-@````I7!`!.````"K($`%X````*
+M5P0`?@````JR!`".````"E<$`*`````"/0``I`````(^``"H`````C\``"(`
+M```*D@0`-`````I#!`!$````"I($`%@````*0P0`;`````I,`P!X````"K4$
+M`)8````*L@0`H@````K8`P#*````"D,$`-(````*3`,`X@````K8`P#X````
+M"D,$```!```*3`,`$`$```K8`P`@`0``"D,$`"@!```*3`,`.`$```K8`P!(
+M`0``"D,$`$X!```*3`,`6`$```I,`P"``0``"K($`)`!```*L@0`+`````(-
+M``#<`0``"I8#`.X!```*E@,`_@$```J6`P`@`@``"I8#`#0"```*E@,`2`(`
+M``J6`P!<`@``"I8#`'`"```*E@,`A`(```J6`P"H`@``"I8#`!`#```"0```
+M%`,```)!```8`P```D(``!P#```"0P``/`,```J6`P!0`P``"I8#`(8#```*
+ME@,`E`,```J6`P"B`P``"I8#`+`#```*E@,`T`,```J6`P#@`P``"I8#`.X#
+M```*E@,`_`,```J6`P`*!```"I8#`%($```*E@,`:`0```J6`P"J!```"I8#
+M`+@$```*E@,`R@0```JR!`#:!```"E<$`/8$```*L@0`!@4```I7!``B!0``
+M"K($`#(%```*5P0`3@4```JR!`!>!0``"E<$`'P%```*L@0`C`4```I7!`"X
+M!0```D0``+P%```"0```P`4```)!``#$!0```D(``,@%```"0P``/@$```KB
+M``"``0``"@<$`(P!```*!P0`H`$```KC``#*`0``"@<$`-8!```*!P0`Z@$`
+M``KC`````@``"@<$`!P"```*!P0`*`(```H'!``\`@``"N,``%("```*!P0`
+MO`(```KD``#2`@``"N4``$X#```*Y```:`,```KD``"(`P``"N8``/0#```*
+MY0``9@0```KE```L````"D,$`&@````*0P0`I`````I#!`".````"N0```X`
+M```*H@,`(`````JB`P",````"N@``*0````*Z```$@$```I#!``@`0``"N@`
+M`"X!```*Z```1`$```KH``!6`0``"D,$`'@!```*Z```,@````KI```,````
+M"NX#`"0````*[@,`E`````+G``"<`````MT``*0````"WP``K`````+>``"T
+M`````N```+P````"X0``Q`````+J``#,`````CX#`"8````*L@0`-@````I7
+M!`!.````"K($`%X````*5P0`?@````JR!`".````"E<$`*`````"10``I```
+M``)&``"H`````D<``"(````*D@0`-`````I#!`!$````"I($`%@````*0P0`
+M;`````I,`P!X````"K4$`)8````*L@0`H@````K8`P#*````"D,$`-(````*
+M3`,`X@````K8`P#X````"D,$```!```*3`,`$`$```K8`P`@`0``"D,$`"@!
+M```*3`,`.`$```K8`P!(`0``"D,$`$X!```*3`,`6`$```I,`P"``0``"K($
+M`)`!```*L@0`\@````J6`P`$`0``"I8#`#@!```*L@0`2`$```I7!`!D`0``
+M"K($`'0!```*5P0`D`$```JR!`"@`0``"E<$`+P!```*L@0`S`$```I7!`#H
+M`0``"K($`/@!```*5P0`,`(```)(```T`@```DD``#@"```"2@``/`(```)+
+M``!``@```DP``"P````"#0``7@````KO``"X````"D,$`#0````*[P``.@$`
+M``KP``!D`0``"O```*P!```*\0``1`````JU!`!N````"O(``'@````*M00`
+ME`````JR!``(`0``"K($`%`!```*L@0`#@````JB`P`@````"J(#`#(````*
+MH@,`=`````KV``"4````"O8``*`````*]0``_`````KV```*`0``"O8``"`!
+M```*]@``,@$```I#!`!"`0``"O4``%`!```*]0``9@$```KU``!X`0``"D,$
+M`)@!```*]@``I`$```KU```R````"O<```P````*[@,`)`````KN`P`V````
+M"NX#`*`````"]```J`````+K``"P`````NX``+@````"[```P`````+M``#(
+M`````O,``-`````"^```V`````(^`P`F````"K($`#8````*5P0`3@````JR
+M!`!>````"E<$`'X````*L@0`C@````I7!`"@`````DT``*0````"3@``J```
+M``)/```B````"I($`#0````*0P0`1`````J2!`!8````"D,$`&P````*3`,`
+M>`````JU!`"6````"K($`*(````*V`,`R@````I#!`#2````"DP#`.(````*
+MV`,`^`````I#!``&`0``"M@#`!8!```*0P0`)`$```K8`P`T`0``"D,$`#H!
+M```*3`,`1`$```I,`P!L`0``"K($`'P!```*L@0`O`$```J6`P#0`0``"I8#
+M`.`!```*E@,`!`(```I,`P!<`@```E```&`"```"40``9`(```)2``!H`@``
+M`E,``(8"```*E@,`F`(```J6`P#8`@``"K($`.@"```*5P0`"`,```JR!``8
+M`P``"E<$`#@#```*L@0`2`,```I7!`!H`P``"K($`'@#```*5P0`F@,```JR
+M!`"J`P``"E<$`,P#```"5```T`,```)0``#4`P```E$``-@#```"4@``W`,`
+M``)3```L`````@T``%X````*_0``N`````I#!``T````"OT``#H!```*_@``
+M9`$```K^``"L`0``"O\``$(````*M00`;`````H``0!V````"K4$`)(````*
+ML@0`#`$```JR!`!4`0``"K($``X````*H@,`(`````JB`P`R````"J(#`'8`
+M```*!`$`E@````H$`0"B````"@,!`/X````*!`$`#`$```H$`0`B`0``"@0!
+M`#0!```*0P0`1`$```H#`0!2`0``"@,!`&@!```*`P$`>@$```I#!`":`0``
+M"@0!`*8!```*`P$`,@````H%`0`,````"NX#`"0````*[@,`-@````KN`P"@
+M`````@(!`*@````"^0``L`````+\``"X`````OH``,`````"^P``R`````(!
+M`0#0`````@8!`-@````"/@,```````(!```$`````@$```@````"`0``#```
+M``(!```0`````@$``!0````"`0``&`````(!```<`````@$``"`````"`0``
+M)`````(!```H`````@$``"P````"`0``,`````(!```T`````@$``#@````"
+M`0``/`````(!``!``````@$``$0````"`0``2`````(!``!,`````@$``%``
+M```"`0``5`````(!``!8`````@$``%P````"`0``8`````(!``!D`````@$`
+M`&@````"`0``;`````(!``!P`````@$``'0````"`0``>`````(!``!\````
+M`@$``(`````"`0``A`````(!``"(`````@$``*P````"`P``L`````(#``"T
+M`````@,``+@````"`P``O`````(#``#``````@,``,0````"`P``R`````(#
+M```T`0```@0``#@!```"!```/`$```($``!``0```@0``$0!```"!```2`$`
+M``($``!,`0```@4``%`!```"!0``5`$```(%``!8`0```@4``%P!```"!0``
+M8`$```(%``!D`0```@4``&@!```"!0``;`$```(%``!P`0```@4``'0!```"
+M!0``>`$```(%``!\`0```@4``(`!```"!0``A`$```(%``"(`0```@4``(P!
+M```"!0``D`$```(%``"4`0```@4``)@!```"!0``G`$```(%``"@`0```@4`
+M`*0!```"!0``J`$```(%``"L`0```@4``+`!```"!0``M`$```(%``"X`0``
+M`@4``+P!```"!0``P`$```(%``#$`0```@4``,@!```"!0``S`$```(%``#0
+M`0```@4``-0!```"!0``V`$```(%``#<`0```@4``.`!```"!@``Y`$```(&
+M``#H`0```@8``.P!```"!@``\`$```(&``#T`0```@8``/@!```"!@``_`$`
+M``(&`````@```@8```0"```"!@``"`(```(&```,`@```@8``!`"```"!@``
+M%`(```(&```8`@```@8``!P"```"!@``(`(```(&```D`@```@8``"@"```"
+M!@``+`(```(&```P`@```@8``#0"```"!@``.`(```(&```\`@```@8``$`"
+M```"!@``1`(```(&``!(`@```@8``$P"```"!@``4`(```(&``!4`@```@8`
+M`,P"```""```T`(```((``#4`@```@@``-@"```""```W`(```((``#@`@``
+M`@@``.0"```""```Z`(```()``#L`@```@D``/`"```""0``]`(```()``#X
+M`@```@D``/P"```""0````,```()```$`P```@D```@#```""@``#`,```(*
+M```0`P```@H``!0#```""@``&`,```(*```<`P```@H``"`#```""@``)`,`
+M``(*```H`P```@L``"P#```""P``,`,```(+```T`P```@L``#@#```""P``
+M/`,```(+``!``P```@L``$0#```""P``2`,```(,``!,`P```@P``%`#```"
+M#```5`,```(,``!8`P```@P``%P#```"#```8`,```(,``!D`P```@P``"@`
+M```"+00`+`````*"`P`P`````N$#`#0````"T@,`.`````*?!``\`````O0#
+M`$`````"<0,`1`````(`!`!(`````K\#`$P````"G`0`4`````)L!`!4````
+M`MT#`%@````"6P,`7`````*C`P!@`````G0#`&0````"/0,`:`````*,!`!L
+M`````K@$`'`````"2P,`=`````*K`P!X`````FD$`'P````"1@,`@`````)9
+M`P"$`````H8#`(@````"HP0`C`````*>!`"0`````CH$`)0````"TP,`F```
+M``*!!`"<`````H0$`*`````"*@0`I`````+]`P"H`````EX$`*P````"KP,`
+ML`````*7!`"T`````MX#`+@````"U0,`O`````*D`P#``````LT#`,0````"
+M<@,`R`````+H`P#,`````EH$`-`````"+P0`U`````+#`P#8`````E4$`-P`
+M```""@0`X`````)^!`#D`````FX$`.@````"300`[`````)/`P#P`````M0#
+M`/0````"?`0`^`````(\!`#\`````D8$```!```"6@,`!`$```*3`P`(`0``
+M`F8$``P!```"!00`$`$```)L`P`4`0```E,#`!@!```"J@,`'`$```(E`P`@
+M`0```A8$`"0!```"7P0`*`$```)6!``L`0```A<$`#`!```"I`0`-`$```*'
+M`P`X`0```B<#`#P!```"A@0`0`$```++`P!$`0```C`$`$@!```".00`3`$`
+M``*3!`!0`0```E0$`%0!```"Q0,`6`$```)B`P!<`0```D\$`&`!```",`,`
+M9`$```+;`P!H`0```HX#`&P!```"&00`<`$```(;!`!T`0```G,$`'@!```"
+MA00`?`$```*B!`"``0```BP#`(0!```"<`0`B`$```)$!`",`0```BP$`)`!
+M```"P`,`E`$```)Q!`"8`0```HL``)P!```"M@0`H`$```),!`"H`0```GP$
+M`*P!```"/`0`L`$```)&!`"T`0```EH#`+@!```"DP,`O`$```*,```H````
+M`F<$`"P````"AP0`,`````)Y!``T`````J$$`#@````"@0,`/`````*4`P!`
+M`````K(#`$0````"BP,`2`````(J`P!,`````E(#`%`````"?P,`5`````*`
+M`P!8`````E8#`%P````"CP0`8`````(N!`!D`````JP$`&@````"H`,`;```
+M``*:!`!P`````B,$`'0````"R0,`>`````))!`!\`````C\#`(`````"*`0`
+MA`````(V`P"(`````HL$`(P````""`0`D`````(\`P"4`````D<#`)@````"
+MS`,`G`````*@!`"@`````HT$`*0````"FP0`J`````);!`"L`````A,$`+``
+M```"(`0`M`````(/!`"X`````C,$`+P````"G`,`P`````*W`P#$`````I(#
+M`,@````":P0`S`````*^`P#0`````ET#`-0````"7`0`V`````)8!`#<````
+M`I@#`.`````"5P,`Y`````)O!`#H`````OX#`.P````"4`0`\`````($!`#T
+M`````N0#`/@````"`P0`_`````)C!````0```N\#``0!```"5`,`"`$```)^
+M`P`,`0```OD#`!`!```":`0`%`$```)V!``8`0```D@$`!P!```".0,`(`$`
+M``)Y`P`D`0```E($`"@!```"MP0`+`$```)E`P`P`0```KD#`#0!```"@@0`
+M.`$```+U`P`\`0```B4$`$`!```".P,`1`$```(<!`!(`0```E4#`$P!```"
+M(00`4`$```(,!`!4`0```JP#`%@!```"1`,`7`$```)M`P!@`0```K$#`&0!
+M```"_`,`:`$```+L`P!L`0```G@$`'`!```"ZP,`=`$```)S!`!X`0```K,$
+M`'P!```")`,`@`$```+!`P"$`0```H\#`(@!```"B0,`C`$```(0!`"0`0``
+M`A0$`)0!```")P0`F`$```*7``"<`0```DX$`*`!```":@0`J`$```+D`P"L
+M`0```@,$`+`!```"8P0`M`$```+O`P"X`0```E0#`+P!```"F```*`````)X
+M`P`L`````I\#`#`````"F`0`-`````**`P`X`````F$#`#P````"^`,`0```
+M``+7`P!$`````CT$`$@````"R@,`3`````)P`P!0`````KP#`%0````"<P,`
+M6`````(D!`!<`````H`$`&`````"J0,`9`````(?!`!H`````@8$`&P````"
+MO00`<`````*Q!`!T`````MD#`'@````"FP,`?`````)%!`"``````D4#`(0`
+M```"?P0`B`````)T!`",`````J4#`)`````"@P0`E`````)\`P"8`````F$$
+M`)P````"(@0`H`````(=!`"D`````B\#`*@````"D`0`K`````*9`P"P````
+M`@$$`+0````"E@0`N`````+Z`P"\`````K4#`,`````"4P0`Q`````(:!`#(
+M`````BT#`,P````"NP,`T`````(F`P#4`````K8#`-@````"8`0`W`````+/
+M`P#@`````@D$`.0````"7`,`Z`````)`!`#L`````L(#`/`````"T`,`]```
+M``(X!`#X`````FH#`/P````"9`0```$```)R!``$`0```C4$``@!```"N00`
+M#`$```)F`P`0`0```N<#`!0!```"QP,`&`$```*G!``<`0```FD#`"`!```"
+MK0,`)`$```*K!``H`0```L8#`"P!```"[0,`,`$```)?`P`T`0```F@#`#@!
+M```"2@,`/`$```)>`P!``0```E@#`$0!```""P0`2`$```)C`P!,`0```IX#
+M`%`!```"40,`5`$```)0`P!8`0```C4#`%P!```"D0,`8`$```(8!`!D`0``
+M`HP#`&@!```"1P0`;`$```*F!`!P`0```O$#`'0!```"<P0`>`$```*P`P!\
+M`0```K0$`(`!```",00`A`$```+R`P"(`0```D`#`(P!```"F00`D`$```*-
+M`P"4`0```O8#`)@!```"Y@,`G`$```(-!`"@`0```J\$`*@!```".`0`K`$`
+M``)J`P"P`0```F0$`+0!```"<@0`N`$```(U!`"\`0```KH$`,0!```"M0``
+M``````(.```$`````@X```@````"#@``#`````(.```0`````@X``!0````"
+3#@``&`````(.```<`````@X`````
+`
+end
diff --git a/sys/contrib/dev/ath/public/arm9-le-thumb-elf.inc b/sys/contrib/dev/ath/public/arm9-le-thumb-elf.inc
new file mode 100644
index 0000000..65f061d
--- /dev/null
+++ b/sys/contrib/dev/ath/public/arm9-le-thumb-elf.inc
@@ -0,0 +1,78 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/arm9-le-thumb-elf.inc#3 $
+#
+
+#
+# Compilation configuration for building little-endian ARM9/arm-elf.
+#
+# Known to work on:
+# Arm940T
+
+#
+# Force register read/write operations to go through a function so
+# ARM users can implement a windowing scheme to access registers in
+# the PCI address space.
+#
+AH_REGOPS_FUNC=1
+
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=arm-elf
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/arm-elf-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+LDOPTS= -EL
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+COPTS+= -mthumb -mlittle-endian -mcpu=arm9 \
+ -ffunction-sections -fdata-sections
diff --git a/sys/contrib/dev/ath/public/arm9-le-thumb-elf.opt_ah.h b/sys/contrib/dev/ath/public/arm9-le-thumb-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/arm9-le-thumb-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/armv4-be-elf.hal.o.uu b/sys/contrib/dev/ath/public/armv4-be-elf.hal.o.uu
new file mode 100644
index 0000000..762b7be
--- /dev/null
+++ b/sys/contrib/dev/ath/public/armv4-be-elf.hal.o.uu
@@ -0,0 +1,5479 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/armv4-be-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`6$````````````!`"@````!`````````````NZ(```$```T````
+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
+M@S`#X5$``XH``<CB13Z6XD,P!^6?(+S@P@*3X:`_P^!C`,+I&Z@PXZ`]3N*#
+M,`?A40`#B@`![>O___[C4```"@`!X^)%/4WB0S`-XU,`,(H``>/@A3$%X:`@
+M@^6?$'#@@P61X:`Q(^"#,0/@8S`%XU,``@)""0,"0`#S`(,@D1)""0,20`#X
+M%9\P1!"#$Y#J``&UXZ`\$^*#,"3A50`#B@`!LN)%+IWEGS`DX(,3DN&@,B/B
+M@P`/Z1NH,.)!/4[B0S`(Y9\@"."#`Y+AH`$CZ1NH,,S,S,UF9F9GX:#`#>DM
+MV!#B3+`$X:!``>.@.@'B@S`XYY`0`^-1````A#$$`(0P@P&@`(,)&Z@0Z___
+M_N6?,`CGTS``X``$D^D;J!``````X:#`#>DMV!#B3+`$X:!``>.@.@'B@S`X
+MYY`0`^-1```%GS`@`(,CE`&@`B,)&Z@0Z____N6?,!#GTQ``X:``!.O___[I
+M&Z@0NBZ+HP````#AH,`-Z2W=\.),L`3B3=`$X:"@`.&@<`'ET3`$XU,``!D;
+MK?#AH(`#X^`@`."(,`?EPR`$XHB``>-8`!_:``(FXZ"``.67,`#A6``#J1NM
+M\."(0(C@AT$$XH00*.74,"CET5`#X(,@!^7"@`3ET2`!X8,P`N"#,`?EPX`$
+MXH1@+..@,`#EC3``X:``"N&@$`?CH"`.X:`P!>O___[AQ`*\XZ`P`>6-,`#A
+MH``*X:`0!^.@(`[AH#`%Z____N'&`++BB(`!Y9<P`.%8``.I&ZWPZ@`"+^&@
+MP`/B@#X>XU$`(I>?\0'J``+1```)Z```"R````L@```+(```"?````L@```*
+M!```"A0```M,```*'```"B@```ID```*/```"E````I8```*;```"TP```M,
+M```*J```"K````L@```*O```"R````K(```*U```"N````M,```+3```"R``
+M``M,```+*```"TP```M,```+3```"T3CH#^"Z@`"Q.73,`/AL#.C$Z````.@
+M``'AH/`.X=,PNN6,,`#CH```X:#P#N'3,+CJ``*`Y=,P`N,3`$#J``*/Y=,P
+M`N&P,Z,#H```$Z``#>&@\`[ETS``XQ,`(!.@```#H``-X:#P#N73,`#J``*K
+MY=,P`.,3``CJ``*/Y9`Q^.H``H#C4@`#EY_Q`NH``L8```H,```*B```"I0`
+M``J@XZ`_?^&0,//J``*`XZ`_?^*#,`+J``+$Y9`R`.H``H#ETS`"Z@`"CN73
+M,`+C$P`0Z@`"C^73,`'AL#.CZ@`"C^73,`+C$P`$Z@`"C^73,`+C$P`"Z@`"
+MC^-2``$*``+!.@`"ON-2``(#H#U!`H,P#`H``L3J``+&Y=,P`N,3``'J``*/
+MXZ`]0>*#,!#J``+*X9`PL^H``H#CH``-X:#P#N.@/4'B@S`LYY`P`^-3```#
+MH``-$Z```.&@\`[EDS`4Z@`"@..@``SAH/`.Y2W@!.&@P`/EG>`$XU$`&0H`
+M`N6*``+<XU$`#PH``M_J``+YXU$`'@H``O7J``+YXU(``QH``OGC4P`$E8`R
+M`)H``N_J``+YXU(``0H``NKC4@`""@`"\>H``OGCH#U!XH,P$.)<(``3H"`!
+MYX`@`^.@``'DG?`$XZ`]0>*#,`SA@,"SZ@`"[^.@/4'B@S`LYX#``^H``N_C
+M7@``$Z`P#!6.,`#CH```Y)WP!.&@P`WI+=_PXDRP!.)-T`3AH(``X:"0`>4+
+M("SAH%`#X:!@`N.@H`#C4P`'F@`#(N&@,0K@@R`)X9-`N>'2<++AAS@$Y(8P
+M!.)%4`3AH``(X:`0!.O___[DA@`$XH1`!.)%4`3C50`#DZ`P`(.@,`'A5``'
+M@Z`P`)(#,`'C4P``&@`#$>**H`'C50`'B@`#"N4;,"S@8P`&Z1NO\.&@P`WI
+M+=@0XDRP!.&@P`+IFP`4XU$`'I>?\0'J``-K```-.```#;0```VT```-M```
+M#;0```VT```-M```#;0```VT```-M```#;0```VT```-M```#4@```VT```-
+MM```#;0```VT```-M```#;0```VT```-M```#;0```VT```-M```#;0```VT
+M```-M```#;0```UD```-?.*`/W+E@C``XZ`P$.H``UOAH!`,Y9(@`.64,`#K
+M``+^Y80``..@``'I&Z@0XH`]0>*#,!3E@C``XZ`P&.6$,`#J``-5XU,``!H`
+M`V7CH#`$Y80P`.62(`#ED#($Y8(P`.H``U7C4P`$!9PP``6`,@0*``-5XZ``
+M`.D;J!#CH```Z1NH$.61``3C4````:#P#N62,`#E@3``Y9(P!.6!,`CEDC`(
+MY8$P#.62,`SE@3`0Y9(P$.-S``$#H#`""@`#?N-3`/\CH##_Y8$P%.62,!3C
+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
+MH``'XZ`9`N*!$&CK___^XX`@8.&@``?CH!D"XH$0:.O___[AH``'XZ`9`N*!
+M$"3K___^X:"@`./`)0+AH``'XZ`9`N*!$"3K___^XZ`.^NO___[AH``'XZ`;
+M)N*!$`CK___^XX`C`N&@``?CH!LFXH$0".O___[CH``*Z____N&@``?AH!`(
+MZP`D<>-0```)&Z_PXZ`/^NO___[AH``'XZ`;)N*!$`CK___^X\`C`N&@``?C
+MH!LFXH$0".O___[AH``'XZ`;)N*!$%CK___^X:!``.&@``?CH!LFXH$07.O_
+M__[AH%``X:``!^.@&R;B@1!HZ____N&@8`#CA"?_X:``!^.@&R;B@1!8Z___
+M_N/%*?_CPBW^XX(I_^."((#AH``'XZ`;)N*!$%SK___^X\8K?^/"+C[C@BU&
+MX:``!^.@&R;B@1!HZ____N.@`!3K___^X:``!^.@&R;B@1`(Z____N.`(P+A
+MH``'XZ`;)N*!$`CK___^XZ``"NO___[AH``'XZ`;)N*!$-3CH"`AZ____N&@
+M``?CH!LFXH$0".O___[CP","X:``!^.@&R;B@1`(Z____N.@#_KK___^X:``
+M!^.@&R;B@1!@Z____N.`(`'AH``'XZ`;)N*!$&#K___^X:``!^.@&R;B@1!@
+MXZ`@`>.@,`#K___^X:``!^.@&R;B@1!8X:`@!.O___[AH``'XZ`;)N*!$%SA
+MH"`%Z____N&@``?CH!LFXH$0:.&@(`;K___^X:``!^&@$`CK___^XU```!H`
+M(@#CH`U.XH``".O___[AH``'X:`0".O___[C4```!1L@+`'2,+(#@S`"`<(P
+MLN&@``?CH!D"XH$0:.O___[CP"!@X:``!^.@&0+B@1!HZ____N&@``?CH!D"
+MXH$0).&@(`KK___^XZ`P`>6),`#AH``#Z1NO\.&@P`WI+=APXDRP!.)-T`3A
+MH&``X:!``>&@4`+C40``$:`P`0/@,`#E"S`<XZ`9`>&@(`3K___^X:``!>O_
+M__[B!$`/Y1LP'.(#,`_E"S`<X:``!N.@&0'AH"`#X:`P!.O___[AH%``XQ0`
+M!!H`(COCH#`5Y0LP'.5;(!SB2Q`<Y=$P`>&")`/ET3`"X8(H`^71,`/A@BP#
+MX:``!N.@$!3K___^X:``!>D;J'#I+4`PX@)`_^.@X`#CH,`*XH10`>&@,(SB
+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
+M___^Y90QS.-3``L34P`'"@!,@N-3``H*`$R"XU,`"0H`3(+C4P`*&@!,G>.@
+M/AWAE#"SXU,``XH`3)WAH``$XZ`;)N*!$'3CH"`FZ____N&@``3CH!LFXH$0
+M>..@(`WK___^X:``!..@')GB@1#PXZ`@!^O___[AH``$XZ`<F>*!$/3CH"`_
+MZ____N&@``3CH!D!XH$0$.O___[CP"0#XX(D`NH`3+;AH``$XZ`;)N*!$'3C
+MH"`*Z____N&@``3CH!LFXH$0>..@(`SK___^X:``!..@')GB@1#PXZ`@`^O_
+M__[AH``$XZ`<F>*!$/3CH"`@Z____N&@``3CH!D!XH$0$.O___[C@"0#X:``
+M!..@&0'B@1`0Z____ND;J!#AH``$XZ`9`>*!$!#K___^X\`D`^&@``3CH!D!
+MXH$0$.O___[AH``$XZ`9`>*!$!#K___^X\`@`N&@``3CH!D!XH$0$.O___[A
+MH``$XZ`;)N*!$'#CH"`?Z____N&@``3CH!LFXH$0=..@('_K___^X:``!..@
+M&R;B@1!XXZ`@#NO___[AH``$XZ`<F>*!$/#CH"`,Z____N&@``3CH!R9XH$0
+M]..@(/_K___^XZ`_=>&4(+/B`B#PXD(@,.-2`#^#H"`2DZ`@#N&@``3CH!R9
+MXH$0^.O___[AH``$XZ`9`N*!$!SK___^X\`-_N.@/W7AE#"SX@,P\.)#,##C
+M4P`_DX`M3H.`+3[AH``$XZ`9`N*!$!SJ`$RYX:#`#>DMV!#B3+`$X:!``.O_
+M__[C4```"1NH$.&@``3CH!D!XH$0$.O___[CP"0#X:``!..@&0'B@1`0Z___
+M_N&@``3CH!D!XH$0$.O___[CP"`"X:``!..@&0'B@1`0Z____N&@``3CH!R!
+MXH$0!..@(`'K___^X:``!..@&0+B@1`<Z____N/`#?[CH#]UX90PL^(#,/#B
+M0S`PXU,`/Y.`+4Z#@"T^X:``!..@&0+B@1`<Z____N&@``3CH!LFXH$0<..@
+M(!_K___^X:``!..@&R;B@1!TXZ`@?^O___[AH``$XZ`;)N*!$'CCH"`.Z___
+M_N&@``3CH!R9XH$0\..@(`SK___^X:``!..@')GB@1#TXZ`@_^O___[CH#]U
+MX90@L^("(/#B0B`PXU(`/X.@(!B3H"`4X:``!..@')GB@1#XZ____ND;J!#C
+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
+M&ZAP``(-U``!^_P``@0P``'\V``!_XP``@PD``(18``````H4!8L6"C_H/^C
+M_Y[_H/^C_Z````````4`"@`4`!X`,@!&`%4`6@!?`&0````*`!0`'@`H`#(`
+M/`!&`%``6@!D``0`!@`)``P```#"````Q````,4```#0````V@```.0```#"
+M````PP```-0```#R```!#0```2@```#/````R@`"(5```0%```0`H``(`,``
+M(`#0`$`!4!F8`20&$"8`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````7_@`````````````````````````````````````````
+M````8"``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````________`````)@`````
+M1P``F`@```````"8#`F$CJ8``)@0/3+@````F!0```=K``"8'````````)@@
+M`@("````F"0```X.``"8*`H"`@$``)@L``-O_```F#````````"8-```#@X`
+M`)@X````!P``F#P``@$```"80(EC`````)A$$W(6G```F$@`&+8S``"83!*$
+M83P``)A0#>BXX```F%0`!TA9``"86'Z`OKH``)A<,3IF7@``F&```!T(``"8
+M9``!S@```)AH0)I!D```F'`````/``"8=````(```)AX````!```F0``````
+M``"9!````````)D(````````F0P`@`````"9$`````,``)L`````````FP0`
+M```@``";"````!```)L,````,```FQ`````(``";%````"@``)L8````*```
+MFQP````$``";(````"0``)LD````%```FR@````T``";+`````P``)LP````
+M+```FS0````"``";.````"(``)L\````$@``FT`````R``";1`````H``)M(
+M````*@``FTP````!``";4````"$``)M4````$0``FU@````Q``";7`````D`
+M`)M@````*0``FV0````%``";:````"4``)ML````%0``FW`````U``";=```
+M``T``)MX````+0``FWP````#``";@````",``)N$````$P``FX@````S``";
+MC`````L``)N0````*P``FY0````'``";F````"<``)N<````%P``FZ`````W
+M``";I`````\``)NH````+P``FZP````O``";L````"\``)NT````+P``F[@`
+M```O``";O````"\``)O`````+P``F\0````O``";R````"\``)O,````+P``
+MF]`````O``";U````"\``)O8````+P``F]P````O``";X````"\``)OD````
+M+P``F^@````O``";[````"\``)OP````+P``F_0````O``";^````"\``)O\
+M````+P``F@`````=``":!````%T``)H(````G0``F@P```#=``":$````1T`
+M`)H4````(0``FA@```!A``":'````*$``)H@````X0``FB0````Q``":*```
+M`'$``)HL````L0``FC`````<``":-````%P``)HX````*0``FCP```!I``":
+M0````*D``)I$````(```FD@````9``":3````%D``)I0````F0``FE0````P
+M``":6`````4``)I<````)0``FF````!E``":9````*4``)IH````*```FFP`
+M``!H``":<````!\``)IT````'@``FG@````8``":?````%@``)J`````F```
+MFH0````#``":B`````0``)J,````1```FI````"$``":E````!,``)J8````
+M$@``FIP```!2``":H````)(``)JD````T@``FJ@````K``":K````"H``)JP
+M````:@``FK0```"J``":N````!L``)J\````&@``FL````!:``":Q````)H`
+M`)K(````V@``FLP````&``":T`````8``)K4````!@``FM@````&``":W```
+M``8``)K@````!@``FN0````&``":Z`````8``)KL````!@``FO`````&``":
+M]`````8``)KX````!@``FOP````&``"8U````"```)C,````!```F,@`!@$&
+M``"8G````&T``)C`````````F-`````4"0D```````("!@8&!@8&`@(`````
+M`P`&``D`/```````````````````````````\````,P`````````````````
+M```*````````X@H``"`!```"`0``&$````````08&5<$!080)@``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````"F#```````````
+M``````````````````````````````````"F?```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````);`F/";0`````@````)@@55555:JJJJIF9F9FF9F9F?______
+M_P```````````"`````@````0````$``!@````8````&```````P````%0``
+M`!4````=````%0``$$``+_P/`"_\#P`O_!\`+_P/```01``O_`\`+_P/`"_\
+M'P`O_`\``!!(`"_\#P`O_`\`+_P?`"_\#P``$$P`+_P/`"_\#P`O_!\`+_P/
+M```04``O_`\`+_P/`"_\'P`O_`\``!!4`"_\#P`O_`\`+_P?`"_\#P``$%@`
+M+_P/`"_\#P`O_!\`+_P/```07``O_`\`+_P/`"_\'P`O_`\``!!@`"_\#P`O
+M_`\`+_P?`"_\#P``$&0`+_P/`"_\#P`O_!\`+_P/```0<````6@```'@```!
+MN````6@``!`P```",````>````"P```",```$+````V8```1@```'T@```V8
+M```0\```H.```4!H``!8@```H.```(`4!``$``@`"``@`#``!``$````@!P.
+MC8^G#HV/SP%@CY4.C8^G``"8!``````````#`````````````)@@`@("``("
+M`@`"`0(``@("````F"0```X.```.#@``!P<```X.``"8*`H"``$*`@`!!0$`
+M``H"``$``)@T```.#@``#@X```X.```.#@``F#@````'````!P````L````+
+M``"81!-R%IP3<A:E$W(6J!-R%IP``)A(`!BZ9P`8NF<`&+II`!BZ:0``F%`,
+M*+3@#"BTX`PHM.`,*+3@``"86'Z`#2Y^@`TN?L`-+GZ`#2X``)A<,3==7C$W
+M75XQ.EU>,3==7@``F&```+T0``"]$```O3@``+T0``"89``!S@```<X```'.
+M```!S@```)D4```G$```)Q```!5\```G$```F1@```&0```!D````(0```&0
+M``"91&_@$"!OX!`@;^`)(&_@$"```*&`!?\4_P7_%/\%_Q3_!?\9_P``F-0`
+M```0````%````!`````0````#``````````HA(2<G````"Q\?'Q\````-```
+M``4```!``````````$0````(````2`````@```!,````$````%``````````
+M5````!\```@`````````"`0````````("`````````@,````````"!``````
+M```(%`````````@8````````"!P````````((`````````@D````````$C``
+M``````"`!````````(`(````````@`P```````"`&````````(`D````````
+M@"@````P``"`+``'__\``(`P`?___P``@#0````Q``"`.````````(`\````
+M````@$````````"`1`````(``(!(````````@%0```````"`6````````)@(
+M````````F`PMA)"3``"8$'TRX````)@4```/:P``F!P```````"8+``";_X`
+M`)@P````````F#P``@$```"80"!J`7H``)A,$H1A/```F%0```A9``"8:$":
+M09```)AL!0RP@0``F'`````/``"8=````(```)AX````#```F0````````"9
+M!````````)D(````````F0P`@`````"9$`````$``)D<```)*@``F2``````
+M``"9)``%B@4``)DH`````0``F2P```````"9,````````)DT````````F3@`
+M``````"9/````#\``)E`````!```F4@```````"93````````)E0````````
+MF51=4/%,``"96````!@``)E<`$MJC@``H80&_P7_``"AB`?_!_\``*&,"/\(
+M_P``H9`)_PG_``"AE`K_"O\``*&8"_\+_P``H9P,_PS_``"AH`W_#?\``*&D
+M#_\._P``H:@2_Q+_``"AK!3_$_\``*&P%O\5_P``H;09_Q?_``"AN!O_&O\`
+M`*&\'O\=_P``H<`C_R#_``"AQ"?_)?\``*'(+/\I_P``H<PQ_R__``"AT#?_
+M-/\``*'4.O\Z_P``H=@Z_SK_``"AW#K_.O\``*'@.O\Z_P``H>0Z_SK_``"A
+MZ#K_.O\``*'L.O\Z_P``H?`Z_SK_``"A]#K_.O\``*'X.O\Z_P``H?PZ_SK_
+M``";`````````)L$````(```FP@````0``";#````#```)L0````"```FQ0`
+M```H``";&`````0``)L<````)```FR`````4``";)````#0``)LH````#```
+MFRP````L``";,`````(``)LT````(@``FS@````2``";/````#(``)M`````
+M"@``FT0````J``";2`````8``)M,````)@``FU`````6``";5````#8``)M8
+M````#@``FUP````N``";8`````$``)MD````(0``FV@````1``";;````#$`
+M`)MP````"0``FW0````I``";>`````4``)M\````)0``FX`````5``";A```
+M`#4``)N(````#0``FXP````M``";D`````,``)N4````(P``FY@````3``";
+MG````#,``)N@````"P``FZ0````K``";J````"L``)NL````*P``F[`````K
+M``";M````"L``)NX````*P``F[P````K``";P````"L``)O$````*P``F\@`
+M```K``";S````"L``)O0````*P``F]0````K``";V````"L``)O<````*P``
+MF^`````K``";Y````"L``)OH````*P``F^P````K``";\````"L``)OT````
+M*P``F_@````"``";_````!8``)C4````(```F-@`8!!H``":`````:D`````
+M``":!````>D```!```":"````"D```"```":#````&D```%0``":$````9D`
+M``&0``":%````=D```'0``":&````!D````0``":'````%D```!$``":(```
+M`)D```"$``":)````:4```%(``":*````>4```&(``":+````"4```'(``":
+M,````<@````4``":-`````@```!"``":.````$@```""``":/````(@```%X
+M``":0````9@```&X``":1````=@```'X``":2````!@````2``":3````%@`
+M``!2``":4````)@```"2``":5````:0```%\``":6````>0```&\``":7```
+M`"0```'\``":8````&0````*``":9````*0```!*``"::````.0```"*``":
+M;````0H```%:``":<````4H```&:``":=````8H```':``":>````<H````.
+M``":?`````H```!.``":@````$H```".``":A````(H```%>``":B````;H`
+M``&>``":C````?H```'>``":D````#H````)``":E````'H```!)``":F```
+M`88```")``":G````<8```%Y``":H`````8```&Y``":I````$8```'Y``":
+MJ````(8````Y``":K````,8```!Y``":L````,8```"Y``":M````,8```&]
+M``":N````,8```']``":O````,8````]``":P````,8```!]``":Q````,8`
+M``"]``":R````,8```#]``":S````,8```#]``":T````,8```#]``":U```
+M`,8```#]``":V````,8```#]``":W````,8```#]``":X````,8```#]``":
+MY````,8```#]``":Z````,8```#]``":[````,8```#]``":\````,8```#]
+M``":]````,8```#]``":^````,8```#]``":_````,8```#]`````0```$8`
+M8````````0```$8`80```````0```$8`8@```````0```$8`8P```````0``
+M`$8`9````````0```$8`90```````0```$8`9@```````0```$8`9P``````
+M`0```$8`:````````0```$8`:0```````0```$8`:@```````0```$8`:P``
+M`````0```$8`;````````0```$8`=````````0```$8`=````````0```$8`
+M=````````0```$8`=````````0```$8`=````````0```$8`=````````0``
+M`$8`=````````0```$8`=````````0```$8`=0```````0```$8`=@``````
+M`0```$8`=P```````0```$8`>````````0```$8`>0```````0```$8`>@``
+M`````0```$8`>P```````0```$8`?````````0```$8`?0```````0```$8`
+M?@```````0```$8`?P```````0```$8`@````````0```$0`?````````0``
+M`$8`B````````0```$8`C````````0```$8`D````````0```$8`E```````
+M`0```$8`F````````0```$8`G````````0```$8`H````````0```$8`I```
+M`````0```$8`J````````0```$8`K````````0```$8`L````````0```$8`
+MM`````('`!:>``L68@`*%CH`"18<``@5Z@`'%9H`!15*``05`P`"%%D`````
+M``$````#``8`"0`_```````)````!``$``$``0`!````!D9'.```````````
+M````````!`````$``0````1&1S<```````````````````,``0`!``$````#
+M1D<V```````````````````$```````!`````49'-0``````````````````
+M!``!``$```````!&1S0```````````````````0````!``#____^1D<S````
+M```````````````#``$``0``_____49',@``````````````````!```````
+M`/____Q&1S$```````````````````(``0`!``#____Z1D<P````````````
+M```````````````````````````````````````````95!`4!A`F````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````!!#0`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````EL"8\)M`D("6P)M/___\G____)____R?___\G____"____
+M\O____+____R____\O____3____`____P/___\#____`____NO___[+___^R
+M____LO___[+___^P________```%`@\`!P(/``H`#P`)``\```"`````F"!5
+M5555JJJJJF9F9F:9F9F9`````````"`````@````0````$``!@````8````&
+M```6G@`+%F(`"A8Z``D6'``(%>H`!Q6:``452@`$%0,``A19```+N``!````
+M```````````&`````0````(````#````!`````4``!!``"_\#P`O_`\`+_P?
+M`"_\#P`O_`\``!!$`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!(`"_\#P`O_`\`
+M+_P?`"_\#P`O_`\``!!,`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!0`"_\#P`O
+M_`\`+_P?`"_\#P`O_`\``!!4`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!8`"_\
+M#P`O_`\`+_P?`"_\#P`O_`\``!!<`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!@
+M`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!D`"_\#P`O_`\`+_P?`"_\#P`O_`\`
+M`!`P```",````>````"P```!8````>```!!P```!:````>````&X```!C```
+M`>```!"P```.8```$8```!\<```^.```$8```!#P``"@X``!0&@``%B```"P
+MX``!0&@``(`4`^@#Z`;@!N`$(`0@"$`(0`;@!N```)@$``````````,`````
+M``````````,``)@@`@("``("`@`"`0(``@("``("`@```)@D```.#@``#@X`
+M``<'```.#@``#@X``)A$$W(6'!-R'"43<A<B$W(6HA-R'"4``)A@``"=$```
+MG1```)T8``"=&```G1```)AD``'.```!S@```<X```'.```!S@```)AH0)I!
+MD$":09!`FD&00)I!D$":09```)D8```!N````;@```"$```!"````;@``)DD
+M$`6*!1`%B@40!8H%$`6*!1`%B@4``*(P```````````````````!"```````
+M```,`````````#0````%````0`````````!$````"````$@````(````3```
+M`!````!0`````````%0````?```(``````````@$````````"`@````````(
+M#`````````@0````````"!0````````(&`````````@<````````""``````
+M```()````````!)P````````$#@````````0>````````!"X````````$/@`
+M```````1.````````!%X````````$;@````````1^````````!(X````````
+M$G@````````2N````````!+X````````$S@````````3>````````!.X````
+M````$_@````````4.````````!1X````````%+@````````4^````````!4X
+M````````%7@````````5N````````!7X````````%C@````````6>```````
+M`!:X````````%O@````````7.````````!=X````````%[@````````7^```
+M`````!`\````````$'P````````0O````````!#\````````$3P````````1
+M?````````!&\````````$?P````````2/````````!)\````````$KP`````
+M```2_````````!,\````````$WP````````3O````````!/\````````%#P`
+M```````4?````````(`$````````@`@```````"`#````````(`@````````
+M@"0```````"`*````#```(`L``?__P``@#`!____``"`-````#$``(`X````
+M````@#P```````"`2````````(!4````````@%@```````"`7``/QX\``(#`
+M*H(P&@``@,0%W`'@``"`R!]`)Q```(#,`?0`````@-```!X<``"`U``"JJH`
+M`(#8`@!550``@-P```````"`X/____\``(#D``#__P``@.@```````"`[```
+M`````(#P````````@/0```````"`^````````(#\````B```AP````````"'
+M!````(P``(<(````Y```APP```+5``"'$````````(<4````````AQ@```"@
+M``"''````<D``(<@````+```AR0````L``"'*````#```(<L````/```AS``
+M```L``"'-````"P``(<X````,```ASP````\``"'0````````(=$````````
+MAT@```````"'3````````(=0````````AU0```````"'6````````(=<````
+M````AV````#5``"'9````-\``(=H```!`@``AVP```$Z``"'<````'4``(=T
+M````?P``AW@```"B``"'?````````($```$``@``@00````!``"!"````,``
+M`($,````````@1````%H``"!%````````(?``P(!````A\0'!@4$``"'R`L*
+M"0@``(?,#PX-#```A]`3$A$0``"'U!<6%10``(?8&QH9&```A]P?'AT<``"'
+MX`,"`0```(?D!P8%!```A^@+"@D(``"'[`\.#0P``(?P$Q(1$```A_07%A44
+M``"'^!L:&1@``(?\'QX='```F`RMA(X9``"8$'THX````)@4G`J?:P``F!P`
+M``````"80"!J`7H``)A4```(60``F0````````"9!````````)D(````````
+MF0P`@`````"9$`````$``)D<```,@```F2`%$`````"9*`````$``)DL````
+M!```F30>'R`B``"9.`H+#`T``)D\````/P``F4B2@+(2``"95%U0X8@``)E<
+M`$MJC@``F6@```/.``"9<!DOM14``)EX`````0``F7P```````"B$`"`8S,`
+M`*(4`!!L$```HA@`G$!@``"B(`&(,,8``*(D```$````HBP```````"B-"`@
+M("```*(X("`@(```HD`X20H@``"B1```>[8``*)(#_\__```FP````````";
+M*`````P``)LX````$@``FV0````A``";C````"T``)N<````,P`!``(``@`!
+M``$``@`!`````P`&``D`/P````,`!@`)`#\```````D````$``0``0`!``$`
+M``````````````9&1S@```````````````````0````!``$`````````````
+M``1&1S<```````````````````,``0`!``$```````````````-&1S8`````
+M``````````````0```````$```````````````%&1S4`````````````````
+M``0``0`!``````````````````!&1S0```````````````````0````!````
+M`````````/____Y&1S,```````````````````,``0`!`````````````/__
+M__U&1S(```````````````````0``````````````````/____Q&1S$`````
+M``````````````(``0`!`````````````/____I&1S``````````````````
+M````````````````````````````````````````````````````"`````$`
+M`P``````````````````````!D9'-P```````````````````@``````````
+M`````````````$9'-@```````````````````0``````````````````____
+M_49'-0``````````````````````````````````````____^D9'-```````
+M```````````````!``$`````````````____^$9',P``````````````````
+M```!``$````!``$`````____]D9',@`````````````````````!`````0`!
+M``$`````____\T9',0`````````````````````!`````0`!`````0``____
+M\$9',```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``!_````,@```'\````H````?P```$T```!_````0````!\````0````/P``
+M`#`````(````!@`````````$````"`````(````$````!@````@````*````
+M#`````X````0````,```@!4``(`5``"`%0``@!4``(`5``"`'!*-CZ<)B`_/
+M!.`/E1+@#ZL)B`_/``"8*`H"``$*`@`!!0$!``H"``$*`@`!``"8-```#@X`
+M``X.```.#@``#@X```X.``"8.`````<````'````"P````L````+``"82``8
+MVEH`&-I:`!C*:0`8RFD`&,II``"84`WHM.`-Z+3@#>BTX`WHM.`-Z+3@``"8
+M6'Z`#2Y^@`TN?NA-+G[H32Y^@`TN``"87#$W9EXQ-V9>,3=F7C$W9EXQ-V%>
+M``"8;`4,L($%#+"!!0RP@04,L(`%#+"```"9%```)Q```"<0```5?```*O@`
+M`"<0``"91/>X$"#WN!`@][@-(/>X$"#WN!`@``"B#&0L06ID+$%J9$!!:F1`
+M06ID0$%J``"B'!B#@`H8@X`*&'.`"AB#@`H8@X`*```2,````````)@(````
+M````F"P``B_^``"8/``"`0```)A,$H1A/```F3```$B#``"90`````0``)E8
+M````_P``F70```````"9^````!@``*($````````H@C0/F>(``"B*````;4`
+M`*(\$\B)KP``FP0````@``";"````!```)L,````,```FQ`````(``";%```
+M`"@``)L8````!```FQP````D``";(````!0``)LD````-```FRP````L``";
+M,`````(``)LT````(@``FSP````R``";0`````H``)M$````*@``FT@````&
+M``";3````"8``)M0````%@``FU0````V``";6`````X``)M<````+@``FV``
+M```!``";:````!$``)ML````,0``FW`````)``";=````"D``)MX````!0``
+MFWP````E``";@````!4``)N$````-0``FX@````-``";D`````,``)N4````
+M(P``FY@````3``";H`````L``)ND````*P``FZ@````K``";K````"L``)NP
+M````*P``F[0````K``";N````"L``)N\````*P``F\`````K``";Q````"L`
+M`)O(````*P``F\P````K``";T````"L``)O4````*P``F]@````K``";W```
+M`"L``)O@````*P``F^0````K``";Z````"L``)OL````*P``F_`````K``";
+M]````"L``)OX`````@``F_P````6``"8G```````````````````````````
+M``"8G`````````````````````````````"8G```````````````````````
+M``````"8G`````````````````````````````"8G```````````````````
+M``````````"8G`````````````````````````````"8G```````````````
+M``````````````"8G`````````````````````````````"8G```````````
+M``````````````````"8G`````````````````````````````"8G```````
+M``````````````````````"8G``X````.````#@````X````.`````"8G```
+M``````````````````````````"8G`````````````````````````````"8
+MG```````````````P````(````"```"8G``$`/D`!`#Y``0`_P`$`/T`!`#]
+M``"8U```````````````!`````0````$``":`````:D```````":!````>D`
+M``!```":"````"D```"```":#````&D```%0``":$````9D```&0``":%```
+M`=D```'0``":&````!D````0``":'````%D```!$``":(````)D```"$``":
+M)````:4```%(``":*````>4```&(``":+````"4```'(``":,````<@````4
+M``":-`````@```!"``":.````$@```""``":/````(@```%X``":0````9@`
+M``&X``":1````=@```'X``":2````!@````2``":3````%@```!2``":4```
+M`)@```"2``":5````:0```%\``":6````>0```&\``":7````"0```'\``":
+M8````&0````*``":9````*0```!*``"::````.0```"*``":;````0H```%:
+M``":<````4H```&:``":=````8H```':``":>````<H````.``":?`````H`
+M``!.``":@````$H```".``":A````(H```%>``":B````;H```&>``":C```
+M`?H```'>``":D````#H````)``":E````'H```!)``":F````88```")``":
+MG````<8```%Y``":H`````8```&Y``":I````$8```'Y``":J````(8````Y
+M``":K````,8```!Y``":L````,8```"Y``":M````,8```&]``":N````,8`
+M``']``":O````,8````]``":P````,8```!]``":Q````,8```"]``":R```
+M`,8```#]``":S````,8```#]``":T````,8```#]``":U````,8```#]``":
+MV````,8```#]``":W````,8```#]``":X````,8```#]``":Y````,8```#]
+M``":Z````,8```#]``":[````,8```#]``":\````,8```#]``":]````,8`
+M``#]``":^````,8```#]``":_````,8```#]``"8U````"```)C4````$```
+M`!0````0````$````!0``)C8`&`0:`!@$&@`8!!H`&`0:`!@$&@``)B<````
+M`````````````````````````)B<`````````````````````````````)B<
+M`````````````````````````````)B<````````````````````````````
+M`)B<`````````````````````````````)B<$````!`````0````$````!``
+M`````)B<!`````0````$````!`````0``````)B<````````````````````
+M`````````)B<`````````````````````````````)B<````````````````
+M`````````````)B<```````````*`````````````````)B<`#@`P``X`(`"
+M.`#``#@`P``X`,```)B<``(`!@`"``8````&``(`!@`"``8``)B<````B0``
+M`(D```")````B0```(D``)B<````H````*````"@````H````*```)B<``0`
+M!P`$``<`!``'``0`!P`$``<``)C4````&@```!H````:````&@```!H``)B<
+M````0````$@```!`````0````$```)B<````$````!`````0````$````!``
+M`)B<````"`````@````(````"`````@``)B<````3P```$\```!/````3P``
+M`$\``)B<````\0```/$```!A````\0```/$``)B<``"03P``D$\``)!,``"0
+M3P``D$\``)B<```26@``$EH``!*:```26@``$EH``)C,````#@````X````/
+M````#@````X````!````1@!@```````!````1@!A```````!````1@!B````
+M```!````1@!C```````!````1@!D```````!````1@!E```````!````1@!F
+M```````!````1@!G```````!````1@!H```````!````1@!I```````!````
+M1@!J```````!````1@!K```````!````1@!L```````!````1@!T```````!
+M````1@!T```````!````1@!T```````!````1@!T```````!````1@!T````
+M```!````1@!T```````!````1@!T```````!````1@!T```````!````1@!U
+M```````!````1@!V```````!````1@!W```````!````1@!X```````!````
+M1@!Y```````!````1@!Z```````!````1@![```````!````1@!\```````!
+M````1@!]```````!````1@!^```````!````1@!_```````!````1@"`````
+M```!````1`!\```````!````1@"(```````!````1@",```````!````1@"0
+M```````!````1@"4```````!````1@"8```````!````1@"<```````!````
+M1@"@```````!````1@"D```````!````1@"H```````!````1@"L```````!
+M````1@"P```````!````1@"T```6G@`&%F(`!!8Z``,6'``"%>H``16:```5
+M2@``%0,``119``,+N``%`````````#```(`5``"`%0``@!4``(`5``"`%0``
+M@!P2C9.G"8@3SP3@$Y42X!.K"8@3SP``F"@*`@`!"@(``04"`0`*`@`!"@(`
+M`0``F#0```X.```.#@``#@X```X.```.#@``F#@````'````!P````L````+
+M````"P``F$@`&-IM`!C:;0`8RG4`&,IU`!C*=0``F%`-Z+3@#>BTX`WHM.`-
+MZ+3@#>BTX```F%A^@`TN?H`-+G[H#2Y^Z`TN?H`-+@``F%PQ-V9>,3=F7C$W
+M9EXQ-V9>,3=F7@``F&P%#+"!!0RP@04,L($%#+"!!0RP@0``F10```?0```'
+MT```!$P```B8```'T```F43WN!`@][@0(/>X#1#WN!`0][@0$```H@0`````
+M``````````@````(````"```H@C6OF>(UKYGB-`^9XC0/F>(T#YGB```H@QD
+M+`%`9"P!0&1"P6!D0L%@9$+!8```HAP8@X`*&(.`"AAS@`H8@X`*&(.`"@``
+M$C````````"8"````````)@L``(O_@``F#P``@$```"83!*$83P``)DP``!(
+M@@``F4`````$``"96````/\``)ET````````HB@```&U``"B/!/(B:\``)L$
+M`````0``FP@````"``";#`````,``)L0````!```FQ0````%``";&`````@`
+M`)L<````"0``FR`````*``";)`````L``)LL````#0``FS`````0``";-```
+M`!$``)L\````$P``FT`````4``";1````!4``)M(````&```FTP````9``";
+M4````!H``)M4````&P``FU@````<``";7````!T``)M@````(```FV@````B
+M``";;````",``)MP````)```FW0````E``";>````"@``)M\````*0``FX``
+M```J``";A````"L``)N(````+```FY`````P``";E````#$``)N8````,@``
+MFZ`````T``";I````#4``)NH````-0``FZP````U``";L````#4``)NT````
+M-0``F[@````U``";O````#4``)O`````-0``F\0````U``";R````#4``)O,
+M````-0``F]`````U``";U````#4``)O8````-0``F]P````U``";X````#4`
+M`)OD````-0``F^@````U``";[````#4``)OP````-0``F_0````U``";^```
+M`!```)O\````&@``F@`````'````!P``F@0```!'````1P``F@@```"'````
+MAP``F@P```&@```!H```FA````'@```!X```FA0````@````(```FA@```!@
+M````8```FAP```&A```!H0``FB````'A```!X0``FB0````A````(0``FB@`
+M``!A````80``FBP```%B```!8@``FC````&B```!H@``FC0```'B```!X@``
+MFC@````B````(@``FCP```!B````8@``FD````%C```!8P``FD0```&C```!
+MHP``FD@```'C```!XP``FDP````C````(P``FE````!C````8P``FE0```&$
+M```!A```FE@```'$```!Q```FEP````$````!```FF````'J````"P``FF0`
+M```J````2P``FF@```!J````BP``FFP```"J```!K```FG````&K```![```
+MFG0```'K````+```FG@````K````$@``FGP```!K````4@``FH````"K````
+MD@``FH0```&L```!DP``FH@```'L```!TP``FHP````L````$P``FI`````Z
+M````4P``FI0```!Z````DP``FI@```"Z```!E```FIP```&[```!U```FJ``
+M``'[````%```FJ0````[````.@``FJ@```![````>@``FJP```"[````N@``
+MFK````&\```!NP``FK0```'\```!^P``FK@````\````.P``FKP```!\````
+M>P``FL````"\````NP``FL0```#\```!O```FL@```#\```!_```FLP```#\
+M````/```FM````#\````?```FM0```#\````O```FM@```#\````_```FMP`
+M``#\````_```FN````#\````_```FN0```#\````_```FN@```#\````_```
+MFNP```#\````_```FO````#\````_```FO0```#\````_```FO@```#\````
+M_```FOP```#\````_```F-0````@``"8T`,&!`@#!P0(`P8$"`,&!`@#!P0(
+M``"8W`"@(,``H"#``.`@P`#@(,``X"#```"8G`\````/````#P````\````/
+M``````"8G`````````````````````````````"8G`"`````@````(````"`
+M````@`````"8G``J````*@```"H````J````*@````"8G``!`````0````$`
+M```!`````0````"8G`````````````````````````````"8G``8````&```
+M`!@````8````&`````"8G`!@````8````&X```!N````;@````"8G`#'````
+MQP```,<```#'````QP````"8G`!+````2P```$L```!+````2P````"8G`1(
+M```$2```!$@```1(```$2`````"8G`!,````3````$P```!,````3`````"8
+MG`#D````Y````.0```#D````Y`````"8G```````````````````````````
+M``"8G`#\````_````/P```#\````_`````"8G`#_````_P```/\```#_````
+M_P````"8G`0_```$/P``!#\```0_```$/P````"8G``,````#`````P````,
+M````#`````"8G`(9```"&0```AD```(9```"&0````"8G``D````)````"0`
+M```D````)`````"8G`"T````M````+0```"T````M`````"8G`"9````F0``
+M`)D```"9````F0````"8G`!0````4````%````!0````4`````"8G``J````
+M*@```"H````J````*@````"8G``2````$@```!(````2````$@````"8G,`R
+M``#`,@``P#(``,`R``#`,@````"8G`%T```!=````70```%T```!=`````"8
+MG``1````$0```!$````1````$0````"8G(8H``"&*```AB@``(8H``"&*```
+M``"8G#&$```QA```,80``#&$```QA`````"8G`#R`(``\@"``/(`@`#R`(``
+M\@"```"8G``G`!D`)P`9`"<`&0`G`!D`)P`9``"8G`````,````#`````P``
+M``,````#``"8G`````````````````````````````"8G````+(```"R````
+ML@```+(```"R``"8G`"P((0`L""$`+`@A`"P((0`L""$``"8G`!!):0`026D
+M`$$EI`!!):0`026D``"8G``1DB``$9(@`!&2(``1DB``$9(@``"8G``:2```
+M&D@``!I(```:2```&D@```"8V``+`C``"P(P``L",``+`C``"P(P``"8G```
+M`)0```"4````E````)0```"4``"8G````)$```"1````D0```)$```"1``"8
+MG````!(````2````$@```!(````2``"8G````(````"`````@````(````"`
+M``"8G````-D```#9````V0```-D```#9``"8G````&````!@````8````&``
+M``!@``"8G````/````#P````\````/````#P``"8G````*(```"B````H@``
+M`*(```"B``"8G````%(```!2````4@```%(```!2``"8G````-0```#4````
+MU````-0```#4``"8G```%,P``!3,```4S```%,P``!3,``"8G```!(P```2,
+M```$C```!(P```2,``"8Q`````,````#`````P````,````#````,````!4`
+M```5````%0```!4````5``"`'!*-DZ<)B!//!.`3E1+@$ZL)B!//``"8*`H"
+M``$*`@`!!0(```H"``$*`@`!``"8-```#@````X````.````#@````X```"8
+M.`````(````"````"@````H````*``"82``8VFT`&-IM`!IJ9``::F0`&FID
+M``"84`WHM.`-Z+3@#>BPV@R8L-H-Z+#:``"86'Z`#2Y^@`TN?N@-+G[(#2Y^
+M@`TN``"87#$W9EXQ-V9>,3=F7C$Y8%XQ-V9>``"8;`4,L($%#+"!!0RP@04,
+ML($%#+"!``"9%```!]````?0```$3```")@```?0``"91/>X$`#WN!``][@-
+M`/>X$`#WN!````"B!`````````````````````````````"B"-:^9XC6OF>(
+MT#YGB-`^9XC0/F>(``"B#``L`4``+`%``$+!0`!"P4``0L%```"B'!B#@`H8
+M@X`*&&.`"AB#@`H8@X`*```2,````^```(!@````#P``@1@```````"!'```
+M`````($@````````@20```````"!*````````($L````````@3````````"!
+M-````````($X````````@3P```````"!0(```*@``(%$````````F`@`````
+M``"8+```H````)@\`"`$````F$P2A",\``"8<````!\``)AT````@```F'@`
+M```.``"96````/\``)F`````````F80"@`````"9H````````)G@````````
+MF>2JJJJJ``"9Z#Q&9'@``)GL````J@``F?`````,``"9]````/\``)GX````
+M%```HB@```FU``"B/)/(B:\``*),`````0``HE```*````"B5````````*)8
+M#,=3@```HEP/#P\!``"B8%]I#P$``*)D`$&*$0``HF@```````"B;`PPP6H`
+M`*)P`((((```HG0`&WRJ``"B>!SG.<X``*)\!1<!S@``HP`8`0````"C!#`#
+M)@(``*,(2`<^!@``HPQ6"TP*``"C$&0:8`\``*,4>$]N&P``HQB&CWQ:``"C
+M'([/AEL``*,@G4^7#P``HR2ESZ&/``"C*+5?KQ\``*,LO=^YGP``HS#-?\<_
+M``"C--7_T;\``*,X````````HSP```````"C0````````*-$````````HT@_
+M____``"C3#____\``*-0/____P``HU0``___``"C6'FHJA\``*-<!FQ"#P``
+MHV`/*"('``"C9!=@%H4``*-H'X`1!```HVPWH`P#``"C<#_$"(,``*-T5\`(
+M`P``HWA?V`:"``"C?'_@!((``*.`?SQ[N@``HX3S,'_P``";!`````$``)L(
+M`````@``FPP````#``";$`````0``)L4````!0``FQ@````(``";'`````D`
+M`)L@````"@``FR0````+``";+`````T``)LP````$```FS0````1``";/```
+M`!,``)M`````%```FT0````5``";2````!@``)M,````&0``FU`````:``";
+M5````!L``)M8````'```FUP````=``";8````"```)MH````(@``FVP````C
+M``";<````"0``)MT````)0``FW@````H``";?````"D``)N`````*@``FX0`
+M```K``";B````"P``)N0````,```FY0````Q``";F````#(``)N@````-```
+MFZ0````U``";J````#4``)NL````-0``F[`````U``";M````#4``)NX````
+M-0``F[P````U``";P````#4``)O$````-0``F\@````U``";S````#4``)O0
+M````-0``F]0````U``";V````#4``)O<````-0``F^`````U``";Y````#4`
+M`)OH````-0``F^P````U``";\````#4``)OT````-0``F_@````0``";_```
+M`!H``)H``````````````)H$`````````$```)H(`````````(```)H,````
+M`````8$``)H0`````````<$``)H4``````````$``)H8`````````$$``)H<
+M`````````($``)H@`````````6@``)HD`````````:@``)HH`````````>@`
+M`)HL`````````"@``)HP`````````&@``)HT`````````8D``)HX````````
+M`<D``)H\``````````D``)I``````````$D``)I$`````````(D``)I(````
+M`````9```)I,`````````=```)I0`````````!```)I4`````````%```)I8
+M`````````)```)I<`````````9$``)I@`````````=$``)ID`````````!$`
+M`)IH`````````%$``)IL`````````)$``)IP`````````7@``)IT````````
+M`;@``)IX`````````?@``)I\`````````#@``)J``````````'@``)J$````
+M`````9D``)J(`````````=D``)J,`````````!D``)J0`````````%D``)J4
+M`````````)D``)J8`````````-D``)J<`````````/D``)J@`````````/D`
+M`)JD`````````/D``)JH`````````/D``)JL`````````/D``)JP````````
+M`/D``)JT`````````/D``)JX`````````/D``)J\`````````/D``)K`````
+M`````/D``)K$`````````/D``)K(`````````/D``)K,`````````/D``)K0
+M`````````/D``)K4`````````/D``)K8`````````/D``)K<`````````/D`
+M`)K@`````````/D``)KD`````````/D``)KH`````````/D``)KL````````
+M`/D``)KP`````````/D``)KT`````````/D``)KX`````````/D``)K\````
+M`````/D``)C4````(```F-`"`!0(`@$4"`(`%`@"`!0(`@$4"```F-P`H"#`
+M`*`@P`#@(,``X"#``.`@P```F)SP````\````/````#P````\```````F)P`
+M````````````````````````````F)P#`````P````,````#`````P``````
+MF)P`````````````````````````````F)P`````````````````````````
+M````F)P`````````````````````````````F)P`````````````````````
+M````````F)P`````````````````````````````F)Q`0```0$```$!```!`
+M0```0$``````F)QE!0``904``&4%``!E!0``904`````F)P`````````````
+M````````````````F)P`````````````````````````````F)P`0@```$(`
+M``!"````0@```$(`````F)P`M0```+4```"U````M0```+4`````F)P``P``
+M``,````#`````P````,`````F)P`]P```/<```#W````]P```/<`````F)P`
+MG0```)T```"=````G0```)T`````F)P`(@```"(````B````(@```"(`````
+MF)P$(@``!"(```0B```$(@``!"(`````F)P`(P`8`",`&``C`!@`(P`8`",`
+M&```F)P`*````"@````H`&``*`!@`"@`8```F)P`4`#``%``P`!0`,,`4`##
+M`%``PP``F)P`!`!_``0`?P`$`'\`!`!_``0`?P``F)P```18```$6```!%@`
+M``18```$6```F)P`````````````````````````````F)P``,````#`````
+MP````,````#`````F-@`0`(P`$`",`!``C``0`(P`$`",```F)P``&0```!D
+M````9````&0```!D````F)P```@````(````"`````@````(````F,P````.
+M````#@````X````.````#@```#`````5````%0```!4````5````%0``@!P2
+MC9.G"8@3SP3@$Y42X!.K"8@3SP``F"@*`@`!"@(``04"`0`*`@`!"@(``0``
+MF#0```X.```.#@``#@X```X.```.#@``F#@````'````!P````L````+````
+M"P``F$@`&/IA`!CZ80`:&F,`&AIC`!H:8P``F%`,F+3@#)BTX`R8L-H,F+#:
+M#)BPV@``F%A^R`TN?L@-+G[(#2Y^R`TN?L@-+@``F%PQ.6!>,3E@7C$Y8%XQ
+M.6!>,3E@7@``F&P%#+"!!0RP@04,L($%#+"!!0RP@0``F10```?0```'T```
+M!$P```B8```'T```F43WN!``][@0`/>X#0#WN!``][@0````H@0`````````
+M````````````````````H@C6OF>(UKYGB-`^9XC0/F>(T#YGB```H@P`+L'@
+M`"[!X``JP2``*L$@`"K!(```HAP8@X`*&(.`"AAC@`H8@X`*&(.`"@``HP`8
+M`0``&`$``!@!```8`0``&`$`````HP0P`R8",`,F`C`#)@(P`R8",`,F`@``
+MHPA(!SX&2`<^!D@'/@9(!SX&2`<^!@``HPQ6"TP*5@M,"E8+3`I6"TP*5@M,
+M"@``HQ!D&F`/9!I@#V0:8`]D&F`/9!I@#P``HQ1X3VX;>$]N&WA/;AMX3VX;
+M>$]N&P``HQB&CWQ:AH]\6H:/?%J&CWQ:AH]\6@``HQR0SX9;D,^&6X[/AEN.
+MSX9;CL^&6P``HR"=3Y</G4^7#YM/EP^;3Y</FT^7#P``HR2GSZ./I\^CCZ//
+MGX^CSY^/H\^?CP``HRBU7Z\?M5^O'[-?KQ^S7Z\?LU^O'P``HRR]W[F?O=^Y
+MG[O?N9^[W[F?N]^YGP``HS#+?\4_RW_%/\M_QS_+?\<_RW_'/P``HS35_]&_
+MU?_1O]/_T;_3_]&_T__1OP``$C````/@``!`:````!```(!@````#P``@)P`
+M``````"`H````````($8````````@1P```````"!(````````($D````````
+M@2@```````"!+````````($P````````@30```````"!.````````($\````
+M````@4"```/Y``"!1````````)@(````````F"P``*````"8/``@!````)A,
+M$H0C/```F'`````?``"8=````(```)AX````#@``F5@`"!__``"9@```````
+M`)F$`H``````F:````````"9X````````)GDJJJJJ@``F>@\1F1X``"9[```
+M`*H``)GP````#```F?0```#_``"9^````!0``*(H```)M0``HCR3R(FO``"B
+M3`````$``*)0``"@````HE0```````"B6`S'4X```*)<#P\/`0``HF!?:0\!
+M``"B9`!!BA$``*)H````````HFP,,,%J``"B<`""""```*)T"!M\J@``HG@<
+MYSG.``"B?`47`<X``*,X````````HSP```````"C0````````*-$````````
+MHT@_____``"C3#____\``*-0/____P``HU0``___``"C6'FHJA\``*-<!FQ"
+M#P``HV`/*"('``"C9!=@%H4``*-H'X`1!```HVPWH`P#``"C<#_$"(,``*-T
+M5\`(`P``HWA?V`:"``"C?'_@!((``*.`?SQ[N@``HX3S,'_P``";!`````$`
+M`)L(`````@``FPP````#``";$`````0``)L4````!0``FQ@````(``";'```
+M``D``)L@````"@``FR0````+``";+`````T``)LP````$```FS0````1``";
+M/````!,``)M`````%```FT0````5``";2````!@``)M,````&0``FU`````:
+M``";5````!L``)M8````'```FUP````=``";8````"```)MH````(@``FVP`
+M```C``";<````"0``)MT````)0``FW@````H``";?````"D``)N`````*@``
+MFX0````K``";B````"P``)N0````,```FY0````Q``";F````#(``)N@````
+M-```FZ0````U``";J````#4``)NL````-0``F[`````U``";M````#4``)NX
+M````-0``F[P````U``";P````#4``)O$````-0``F\@````U``";S````#4`
+M`)O0````-0``F]0````U``";V````#4``)O<````-0``F^`````U``";Y```
+M`#4``)OH````-0``F^P````U``";\````#4``)OT````-0``F_@````0``";
+M_````!H``)H``````````````)H$````0````$```)H(````@````(```)H,
+M```!H0```6$``)H0```!X0```:$``)H4````(0```>$``)H8````80```"$`
+M`)H<```!B````&$``)H@```!R````8@``)HD````"````<@``)HH````2```
+M``@``)HL````B````$@``)HP```!J0```(@``)HT```!Z0```6D``)HX````
+M*0```:D``)H\````:0```>D``)I````!T````"D``)I$````$````&D``)I(
+M````4````9```)I,````D````=```)I0```!L0```!```)I4```!\0```%``
+M`)I8````,0```)```)I<````<0```7$``)I@```!N````;$``)ID```!^```
+M`?$``)IH````.````#$``)IL````>````'$``)IP```!F0```9@``)IT```!
+MV0```=@``)IX````&0```!@``)I\````60```%@``)J`````F0```)@``)J$
+M````V0```7D``)J(````^0```;D``)J,````^0```?D``)J0````^0```#D`
+M`)J4````^0```'D``)J8````^0```+D``)J<````^0```/D``)J@````^0``
+M`/D``)JD````^0```/D``)JH````^0```/D``)JL````^0```/D``)JP````
+M^0```/D``)JT````^0```/D``)JX````^0```/D``)J\````^0```/D``)K`
+M````^0```/D``)K$````^0```/D``)K(````^0```/D``)K,````^0```/D`
+M`)K0````^0```/D``)K4````^0```/D``)K8````^0```/D``)K<````^0``
+M`/D``)K@````^0```/D``)KD````^0```/D``)KH````^0```/D``)KL````
+M^0```/D``)KP````^0```/D``)KT````^0```/D``)KX````^0```/D``)K\
+M````^0```/D``)C4````(```F-`````(````"`````@````(````"```F-P`
+MH`#``*``P`#@`,``X`#``.``P```F)PS````,P```#,````S````,P``````
+MF)P!`````0````$````!`````0``````F)P`````````````````````````
+M````F)P`````````````````````````````F)P`````````````````````
+M````````F)P?````'P```!\````?````'P``````F)P`````````````````
+M````````````F)P`N````+@```"X````N````+@`````F)P`MP```+<```"W
+M````MP```+<`````F)P`A````(0```"$````A````(0`````F)P`F````)@`
+M``"8````F````)@`````F)P`P````,````#`````P````,``````F)P`_P``
+M`/\```#_````_P```/\`````F)P`_P```/\```#_````_P```/\`````F)P`
+M_P```/\```#_````_P```/\`````F)P`_P```/\```#_````_P```/\`````
+MF)P`UP```-<```#7````UP```-<`````F)P`80```&$```!A````80```&$`
+M````F)P`_@```/X```#^````_@```/X`````F)P`W@```-X```#>````W@``
+M`-X`````F)P`?P```'\```!_````?P```'\`````F)P$/0``!#T```0]```$
+M/0``!#T`````F)P`=P```'<```!W````=P```'<`````F)P`1````$0```!$
+M````1````$0`````F)P`F````)@```"8````F````)@`````F)P`$`"``!``
+M@``0`(``$`"``!``@```F)P`!<`T``7`-``%P#0`!<`T``7`-```F)P`,0#P
+M`#$`\``Q`/``,0#P`#$`\```F)P`#`$?``P!'P`,`1\`#`$?``P!'P``F)P`
+M40!``%$`0`!1`$``40!``%$`0```F)P`4`#:`%``V@!0`-H`4`#:`%``V@``
+MF)P`````````````````````````````F)P``$!$``!`1```0$0``$!$``!`
+M1```F)P`````````````````````````````F)P``&#```!@P```8,```&#`
+M``!@P```F)P``"P````L````-@```#8````L````F,@```0#```$`P``!`,`
+M``0#```$`P``F)P``&0```!D````9````&0```!D````F)P```@````(````
+M"`````@````(````F,P````.````#@````X````.````#D%2-3(Q,```05(U
+M,C$Q``!!4C4R,3(``%)&-3$Q,0``4D8U,3$R``!21C(T,3,``%)&-30Q,P``
+M4D5'3U!37T953D,`071H97)O<R`R,S$S(%=I4V]#``!!=&AE<F]S(#4T,C0O
+M,C0R-````$%T:&5R;W,@,C,Q-R!7:5-O0P``071H97)O<R`U,C$R("A&4$=!
+M*0!!=&AE<F]S(#4R,3$@*$901T$I`$%T:&5R;W,@-3(Q,`````!!=&AE<F]S
+M(#4R,3$`````071H97)O<R`U,S$R(%=I4V]#``!!=&AE<F]S(#(S,34@5VE3
+M;T,``$%T:&5R;W,@-3(Q,@`````P+CDN,C`N,P``````````````"````!``
+M```8````(````"@````P````.`````````'_`?\`````````````?_______
+M__\```````,!F`&9`````````````'__________```````'`9@+,```````
+M``````!__________P``````"`&8##``````````````?_________\`````
+M`"`!(`H0`````````````'__________```````A`2`!F0````````````!_
+M_________P``````(@$@##``````````````?_________\``````#H!8`H0
+M`````````````'__________```````[`6`!F0````````````!_________
+M_P``````$@%E"A````````,`````?_________\``````#<!,`&9```````#
+M`````'__________```````U`C`!F0```````P````!__________P``````
+M-@,P`9D```````,`````?_________\``````#`$,`&9```````#`````'__
+M________```````Y!3`!F0```````P````!__________P``````-`8P`9D`
+M``````,`````?_________\``````#(#,`&9```````#`````'__________
+M```````Q`S`!F0````````````!__________P``````$0$0`9D`````````
+M````?_________\``````!`!$`H0`````````````'__________``````!2
+M`5`!F0````````````!__________P``````10)0`9D`````````````?___
+M______\``````$<#4`&9`````````````'__________``````!"!%`!F0``
+M``````````!__________P``````6`50`9D`````````````?_________\`
+M`````%L&4`&9`````````````'__________``````!="%`!F0``````````
+M``!__________P``````7@E0`9D`````````````?_________\``````%`#
+M4`H0`````````````'__________``````!5`5`,,`````````````!_____
+M_____P``````5@)0##``````````````?_________\``````$D"4`U0````
+M`````````'__________``````!``4`*0```````1@````0`````````*`&(
+M````00%`"D```````$<````$`````````&@!B0```$@!0`H0``````!&````
+M!``````````(`8H```!*`4`*0```````1@````0````````8"`&,````2P%`
+M"D```````$8````$````````8`@!C0```$P!0`I0``````!&````!```````
+M```(`8\```!#`D`*0```````1P````0`````````<`&+````\`-`"D``````
+M`$8````$`````````"```````(`#0`I```````!'````!`````````!@#Z<`
+M``#Q`T`*0```````1@````0````````8````````@0-`"D```````$8````$
+M````````8``/J````((#0`I0``````!&````!```````````#ZD```#R`T`*
+M$```````1@````0`````````````````@P1`"D```````$<````$````````
+M@&`/J@```/0$0`I```````!&````!````````)@```````"$!$`*0```````
+M1@````0```````#@``^K````A01`"E```````$8````$````````@``/K```
+M`/4$0`H0``````!&````!````````(````````"&!4`*0```````1P````0`
+M``````"`8`^M````AP5`"D```````$8````$````````X``/K@```(@%0`I0
+M``````!&````!````````(``#Z\```")!D`*0```````1P````0`````````
+M:`^P````B@9`"D```````$8````$````````8`@/L0```(L&0`I0``````!&
+M````!``````````(#[(```",!T`*0```````1P````0```````"`:`^S````
+MC0=`"D```````$8````$````````X`@/M````(X'0`I0``````!&````!```
+M`````(`(#[4```"/"$`*0```````1P````0```````"`:`^V````D`A`"D``
+M`````$8````$````````X`@/MP```)$(0`I0``````!&````!````````(`(
+M#[@```#V"4`*0```````1P````0```````"`8```````]PM`"D```````$<`
+M```$````````@&```````&``8`!@`````````````'__________``````!A
+M`&$`80```````P````!__________P``````8@!B`&(```````(`````?___
+M______\``````&,`8P!C`````````````'__________``````!D`&0`9```
+M`````P````!__________P``````90!E`&4```````,`````?_________\`
+M`````&8`9@!F`````````````'__________``````!G`&<`9P``````````
+M``!__________P``````:`!H`&@`````````````?_________\``````&D`
+M:0!I```````#`````'__________``````!J`&H`:@```````P````!_____
+M_____P``````90```````?____\```"`_____P````!*4```#[0`````````
+M`````&H```````'_____````@/____\`````2E````^T``````````````'_
+M```````!`````0````$;6```````$`````$````!`````1M8````"``#````
+M`0`````````!&U@````,``,````!``````````$;6````"``1P``````````
+M`````!M8````,P`P`````0`````````!&U@````D`"$````!`````0````$;
+M6````"@`-P````$``````````1M8````'P`P`````0````$````!&U@````P
+M`%L````!``````````$;6````'```P````$``````````1M8````.``W````
+M`0`````````!&U@```!4`%4````!`````0````$;6````$0`50````$````!
+M`````1M8````3``[`````0``````````&U@```!@`%(````!`````0````$;
+M6````&0`-`````$``````````1M8````?``@`````0````$````!&U@```"8
+M`%L````!`````0````$;6````)P`4@````$````!`````1M8````J@`0````
+M`0`````````!&U@```"\``,````!``````````$;6````+\`-@````$`````
+M`````1M8````Q``W`````0````$````!&U@```#+`#<````!``````````$;
+M6````-``-P````$``````````1M8````U@`0`````0````$````!&U@```#:
+M``,````````````````;6````S(`-@````$``````````1M8````W@`#````
+M`0`````````!&U@```#I`#<````!``````````$;6````/8`-P````$`````
+M`````1M8````^@`W`````0`````````!&U@```#_`#8````!``````````$;
+M6````0P`,`````$````!`````1M8```!%``W`````0`````````!&U@```$L
+M`#<````!``````````$;6````4``$`````$````!`````1M8```!5``#````
+M`0`````````!&U@```%8`"$````!`````0````$;6````5P`-P````$`````
+M`````1M8```!8``W`````0`````````!&U@```%D`%L````!``````````$;
+M6````6@`4@````$``````````1M8```!;`!2`````0````$````!&U@```%T
+M`#<````!``````````$;6````7@``P````$``````````1M8```!?``W````
+M`0`````````!&U@```&(`$`````!```````````;6````8D`00````$`````
+M`````!M8```!B@!(`````0``````````&U@```&+`$,````!```````````;
+M6````8P`2@````$``````````!M8```!C0!+`````0``````````&U@```&/
+M`$P````!```````````;6```#Z<`@`````$``````````!M8```/J`"!````
+M`0``````````&U@```^I`((````!```````````;6```#ZH`@P````$`````
+M`````!M8```/JP"$`````0``````````&U@```^L`(4````!```````````;
+M6```#ZT`A@````$``````````!M8```/K@"'`````0``````````&U@```^O
+M`(@````!```````````;6```#[``B0````$``````````!M8```/L0"*````
+M`0``````````&U@```^R`(L````!```````````;6```#[,`C`````$`````
+M`````!M8```/M`"-`````0``````````&U@```^U`(X````!```````````;
+M6```#[8`CP````$``````````!M8```/MP"0`````0``````````&U@```^X
+M`)$````!```````````;6````9``0@````$``````````1M8```!C@`#````
+M`0`````````!&U@```&8`$4````!`````0````$;6````9H`10````$`````
+M`````!M8```!FP!%`````0``````````&U@```&<`%X````!```````````;
+M6````9X``P````$``````````1M8```!K``W`````0`````````!&U@```&F
+M``,````!``````````$;6````;8`-P````$``````````1M8```!N``W````
+M`0`````````!&U@```&Z`#<````!``````````$;6````;X`(0````$````!
+M`````1M8```#)P`#`````0`````````!&U@```'*`%T````!```````````;
+M6````=8`-P````$``````````1M8```!Y``0`````0````$````!&U@```'L
+M`#`````!`````0````$;6````?@``P````$``````````1M8```"$``W````
+M`0`````````!&U@```(J`"(````!``````````$;6````D(`-P````$`````
+M`````1M8```"``!;`````0`````````!&U@```)*``,````!``````````$;
+M6````D\`$`````$````!`````1M8```"7`!2`````0`````````!&U@```)@
+M`#L````!`````0````$;6````F@`-P````$``````````1M8```";``W````
+M`0`````````!&U@```)V`!`````!`````0````$;6````GH``P````$`````
+M`````1M8```"@@`#`````0`````````!&U@```*#``,````!``````````$;
+M6````JH`(0````$``````````1M8```"O@!;`````0````$````!&U@```*_
+M`#<````!``````````$;6````L$`-P````$``````````1M8```"Q@`[````
+M`0`````````!&U@```+4`#<````!``````````$;6````O``-P````$`````
+M`````1M8```"]``W`````0`````````!&U@```+X``,````!``````````$;
+M6````)X`4`````$````!`````1M8```"_``#`````0`````````!&U@```,,
+M`#`````!``````````$;6````Q0`-@````$``````````1M8```#&``V````
+M`0`````````!&U@```,D``,````!``````````$;6````Q```P````$`````
+M`````1M8```#.@`W`````0`````````!&U@```-(`!`````!`````0````$6
+MP0```TH`$@````$````!`````1M8```#6@`1`````0`````````!&U@```-<
+M`#H````!`````0````$;6````UX`5@````$``````````1M8```"P``#````
+M`0`````````!&U@```-W``,````!``````````$;6````LP``P````$`````
+M`````1M8```3,Q,]%P`*!0```````````````````!`0````$T<341<`"@4`
+M```````````````````0$````!,X$W07`!04````````````````````$`<`
+M```33A-[&P8%!0````````````````````$`````$U$3>1X&"@4`````````
+M```````````!`````!-6$W0A!A0%`````````````````````0`````3JQ.P
+M%P`*!0```````````````````!`,````$[`3V!<`%!0`````````````````
+M```0`@```!._$[\7``H%````````````````````$`P````4`!1X!084%```
+M````````````````````````%#(4;A<`%!0````````````````````8`0``
+M`!0R%&X4`!04````````````````````&`$````4/!1X#P`4%```````````
+M``````````4`````%#P4>!$&%!0````````````````````!`0```!0\%'@2
+M`!04````````````````````!0`````4/!1X%``4%```````````````````
+M``4`````%#P4>!<`%!0````````````````````%`````!0\%'@7!A04````
+M`````````````````0`````4/!3(%`84%``````````"``````````0`````
+M%'@4H!<`%!0``````````0`````````%`````!2,%*`7`!04``````````,`
+M````````!0`````4C!3($@`4%``````````#``````````4`````%(P4R!0`
+M%!0`````````!P```````(`%`````!2,%,@4!A04``````````,`````````
+M`0(````4C!3(%P84%``````````#``````````$"````%(P4R!<&%!0`````
+M`````P`````````!`````!2,%,@>`!04```````````````````````````4
+MC!9$!084%``````````#````````````````%*`4R!$&%!0``````````P``
+M```````!`````!5\%?0>!A04``````````(`````````!``````5?!9$%`84
+M%``````````#``````````$$````%7P61!L`%!0``````````P`````````%
+M`````!5\%D0>`!04``````````,`````````!0`````5?!9$%P`4%```````
+M```'````````@`$`````%G$6K1<`%!0``````````````````````````!9Q
+M%JT>!A04```````````````````````````6<1:M'@84%``````````"````
+M``````0`````%G$6P04&%!0``````````````````````````!9Q%L$1`!04
+M```````````````````````````6<1;!%``4%```````````````````````
+M````%G$6P1X`%!0``````````````````````````!9Q%L$>!A04````````
+M``````````````,````6<1;!'@84%```````````````````````````$S@3
+M=!X`%!0```````````````````0``````!.P$]@>`!04````````````````
+M```$```````4,A1N'@`4%``````````#````````!```````%#P4>!X`%!0`
+M`````````P````````0``````!2,%,@>`!04``````````,````````$````
+M```6<1;!'@`4%```````````````````!```````%7P61!X`%!0`````````
+M`P````````0``````!2,%,@>`!04```````````````````````````4/!1X
+M'@`4%```````````````````````````%L$6P1X`%!0`````````````````
+M``0``````!0*%%H%!B@H```````````````````````````4@A32!08H*```
+M```````!````````````````%/H5<@4&*"@`````````````````````````
+M`!6:%A(%!B@H``````````$````````````````4'A1&!08H*```````````
+M````````````````%&X4O@4&*"@``````````0```````````````!3F%5X%
+M!B@H```````````````````````````5AA8F!08H*``````````!````````
+M````````%%`4>!$&*"@``````````````````````````!10%'@7!B@H````
+M```````````````````````46A1:$08H*```````````````````````````
+M%%H46A<`*"@``````````````````````````!2@%*`7!B@H``````````$`
+M`````````@`````4H!2@%`8H*``````````!``````````(`````%((4@A$`
+M*"@``````````0`````````"`````!2J%*H4`"@H``````````$`````````
+M`@`````4@A2J%``H*``````````!``````````(`````%((4JA<&*"@`````
+M`````0`````````"`````!6D%AP4!B@H``````````$``````````@`````6
+M@!:H%``H*```````````````````````````%H`6J!X&*"@`````````````
+M`````````````!:%%JT>!B@H```````````````````````````46A2"#P`H
+M*``````````#````````!```````%*H4JA(`*"@``````````P````````0`
+M`````!6D%AP4`"@H``````````,````````$```````6@!:H%``H*```````
+M````````````!```````"0@)1`4&%`4```````````````````````````D(
+M"404`!0%```````````````````````````);`FH!084!0``````````````
+M````````````"6P)J!0`%`4````````````````````@``````EL":@>`!0%
+M```````````````````````````);`F>&P84!0``````````````````````
+M````"6P)GA0`%`4````````````````````@``````F`"8H4`!0%````````
+M```````````````````)F0FH%``4!0``````````````````````````":,)
+MJ!0`%`4``````````````````"`@``````FT";0%!A0%````````````````
+M```````````)M`FT%``4!0``````````````````*"``````"=`*K`4&%`4`
+M``````````````````````````D("404`!0%````````````````````````
+M```);`EL%``4!0``````````````````````````"7$)@!0`%`4`````````
+M``````````````````F%"8H4`!0%```````````````````````````)CPF9
+M%``4!0``````````````````````````"9X)GA0`%`4`````````````````
+M``````````FC":,4`!0%``````````"````````$```````)HPFC%``4!0``
+M````````@```````````````":@)J!0`%`4``````````(````````0`````
+M``FH":@4`!0%``````````"````````````````)M`FT%``4!0``````````
+M@```````!```````";0)M!0`%`4``````````(````````````````D("40%
+M!A0%```````````````````````````)"`E$%``4!0``````````````````
+M````````"6P)J`4&%`4```````````````````````````EL":@4`!0%````
+M````````````````0``````);`FH'@`4!0``````````````````````````
+M"6P)GAL&%`4```````````````````````````EL"9X4`!0%````````````
+M````````0``````)@`F*%``4!0``````````````````````````"9D)J!0`
+M%`4```````````````````````````G0"JP%!A0%````````````````````
+M```````)HPFH%``4!0``````````````````("``````"0@)1!0`%`4`````
+M``````````````````````EL"6P4`!0%```````````````````````````)
+M<0F`%``4!0``````````````````````````"84)BA0`%`4`````````````
+M``````````````F/"9D4`!0%```````````````````````````)G@F>%``4
+M!0``````````````````````````":,)HQ0`%`4``````````(````````0`
+M``````FC":,4`!0%``````````"````````````````)J`FH%``4!0``````
+M````@```````!```````":@)J!0`%`4``````````(````````````````D(
+M"40%!B@H```````````````````````````)A0F%!08H*```````````````
+M````````````"84)A10&*"@```````````````````````````F%"842!B@H
+M```````````````````$```````)T`JL!08H*```````````````````````
+M`````?\0```````````!````````````````````(`@``@``````````````
+M``````#_`````````````````"01````````````````````%`4`````````
+M``````````(%````````````````````$P```````````5`0````````````
+M```````````````````!````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````E`0````````````````````````````````
+M!```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````U`0````````````````````````````````"!``````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````!%`0````````````
+M````````````````````@```@```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````!5`0````````````````````````````````
+M0```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````!E`P```````````"``````````,`````````@`!`@```````````````
+M````"0@`````````````````````````````````````````````````````
+M````````````````````````````````````````````"%`P````````````
+M```````````````#```!``0`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````"5`P```````````"``````````0````#````
+M$"`$````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````3`P```````````"``````````0````#``@``(!`````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````C`P```````````"
+M``````````0````#````````0```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````S`P```````````"``````````0````#``@`
+M``!`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````!#`P```````````"``````````0````#```````@0```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````!3`P```````````"
+M``````````0````#````````$```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````!C`P```````````"``````````0````#````
+M`0`1````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````1`0```````````````````````````````"``$`(```````````````
+M````$@0``````````````````"`1````````````````````````````````
+M`````````````````````````````````````````````2`0````````````
+M```````````````````$``("````````````````````````````````````
+M`````"`2````````````````````````````````````````````````````
+M`````````````````````````6`0```````````!``````````,````````"
+M`$"`(```````````````````$,0```````````````````0A````````````
+M````````````````````````````````````````````````````````````
+M`````640```````````!``````````,``````````````#@`````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````4!`````````````
+M``````````@````"````````!```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````D!``````````````````````!`````"````
+M````!<<`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````T!`````````````````````@``````"````````@```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````!$!````````````$
+M````````@``````"``````!`@```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````!4!````````````$````````@``````"````
+M`@!`@```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````!D!```````````````````````@````"````````B```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````!T!````````````$
+M````````@`@````"``````!`A```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````"$!````````````$````````@`@````"````
+M`@!`A```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"4!`````````````````````@``````"````````@<<`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````"T!````````````$
+M````````@``````"``````!`@<<`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````#5#_````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````H````````````````````*````````````````````````````
+M````"C#_`````````````````````(`````#````````````````````````
+M`````````````````````````````````````````````````0``````````
+M``````````$`````````````````````!```````````"S`P````````````
+M`````````0`````#````````````````````````````````````````````
+M`````````````````````````````(````````````````````"`````````
+M````````````!```````````##`P`````````````````````@`````#````
+M````````````````````````````````````````````````````````````
+M`````````!`````````````````````0````````````````````!```````
+M````"A`0````````````````````````````````````````````````````
+M`````````````````````````````````````````````````"``````````
+M```````````@````````````````````!```````````"D!`````````````
+M````````>&`````"````````````````````````````````````````````
+M````````````````````````````"D````````````````````1`````````
+M````````````!```````````"E!`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````@````````````````````(````````````````````!```````
+M`````9DP````````````````````````````````````````````````````
+M``````````````````````````````````````````````````@`````````
+M```````````(````````````````````!````````````&#_```````````#
+M````````!``````(``/@```````````````````````"P```````````````
+M``````````````````````````"OP```````````````````"_``````````
+M````````````"````````````&;_```````````#````````!``````(``/@
+M```````````````````````"P```````````````````````````````````
+M```````'P````````````````````?``````````````````````"```````
+M`````&?_```````````#````````!``````(``/@````````````````````
+M```"P``````````````````````````````````````````OP```````````
+M````````"_``````````````````````"````````````&C_```````````#
+M````````!``````(``/@```````````````````````"P```````````````
+M``````````````````````````!7P```````````````````%?``````````
+M````````````"````````````&'_```````````#````````!``````0``/@
+M````````````````````````````````````````````````````````````
+M``````"OP```````````````````"_``````````````````````"```````
+M`````&+_```````````#````````!``````0``/@````````````````````
+M```"P`````````````````````````````````````````"OP```````````
+M````````"_``````````````````````"````````````&/_```````````#
+M````````!``````(``'@```````````````````````"P```````````````
+M```````````````````````````OP```````````````````"_``````````
+M````````````"````````````&3_```````````#````````!``````0`!P`
+M"``````````````````````"P```````````````````````````````````
+M```````'P````````````````````?``````````````````````"```````
+M`````&7_```````````#````````!``````0``B$````````````````````
+M``````````````````````````````````````````````!7P```````````
+M````````%?``````````````````````"````````````&G_```````````#
+M````````!``````0``/````````````````````````"P```````````````
+M```````````````````````````'P````````````````````?``````````
+M````````````"````````````&K_```````````#````````!``````0``/`
+M````````````````````````````````````````````````````````````
+M```````OP```````````````````"_``````````````````````"```````
+M`````9C_````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````$``\`#S``"!B`#P
+M`/,```!!`(``@P``@8D`@`"#````2`#R`/4``(&*`/(`]0```$,`]@#W``"!
+MBP#V`/<```!*`/$`]```@8P`\0#T````2P"!`(0``(&-`($`A````$P`@@"%
+M``"!CP""`(4```&(`/``\P```8D`@`"#```!B@#R`/4```&+`/8`]P```8P`
+M\0#T```!C0"!`(0```&/`((`A0``````"```````````````````````````
+M`````````````````0(7<`L`C````````0(C*`\`$@```````0(NX`H`F`(`
+M`````0)&4`X`)`(``````0)=P`D`L`0``````0*,H`T`2`0``````0*[@`@`
+M8`0``````0+2\`P`;`0`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````"```````
+M`````````````````````````````````````0,7<`L`C````````0,C*`\`
+M$@```````0,NX`H`F`(``````0-&4`X`)`(``````0-=P`D`L`0``````0.,
+MH`T`2`0``````0.[@`@`8`0``````0/2\`P`;`0`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````"````````````````````````````````````````````0(7
+M<`L`C````````0(C*`\`$@```````0(NX`H`F`(``````0)&4`X`)`(`````
+M`0)=P`D`L`0``````0*,H`T`2`0``````0*[@`@`8`0``````0+2\`P`;`0`
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"```````````````````````````
+M`````````````````0,7<`L`C````````0,C*`\`$@```````0,NX`H`F`(`
+M`````0-&4`X`)`(``````0-=P`D`L`0``````0.,H`T`2`0``````0.[@`@`
+M8`0``````0/2\`P`;`0`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````!```````
+M`````````````````````````````````````0`#Z`L`@@```````0`'T`H$
+MA`$``````0`5?`D$BP$``````0`J^`@$E@$`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````"B!`````````````"B"%`^1D90/D9&``"B#&2`06QD@$%L``"B
+M$`&9H`,!F:`#``"B%`1,UA`$3-80``"B&!.``$`3@`!```"B'!O@`&`;X`!@
+M``"B(`Q3@`H,4X`*``"B)``4WSL`%-\[``"B*````;4```&U``"B+````"``
+M```@``"8G`````````````"8G`````````````"8G`````````````"8G```
+M``````````"8G`````````````"8G`````````````"8G`````````````"8
+MG`````````````"8G`````````````"8G`````````````"8G```````````
+M``"8G``X````.`````"8G`````````````"8G`````````````"8G```````
+M``````"8G``$`/D`!`#Y``"8U``````````$``"8G`````````````"8G```
+M``````````"8G`````````````"8G`````````````"8G`````````````"8
+MG!`````0``````"8G`0````$``````"8G`````````````"8G```````````
+M``"8G`````````````"8G``````*``````"8G``X`(`".`"```"8G``"``8`
+M```&``"8G````)(```"2``"8G````*````"@``"8G``$``<`!``'``"8U```
+M`!H````:``"8G````$@```!(``"8G````!`````0``"8G`````@````(``"8
+MG`````\````/``"8G````/(```!B``"8G```D$\``)!,``"8G```$EH``!*:
+M``"8S`````X````/````"```````````````````````````````````````
+M`````0(7<`L`C````````0(C*`\`$@```````0(NX`H`F`(``````0)&4`X`
+M)`(``````0)=P`D`L`0``````0*,H`T`2`0``````0*[@`@`8`0``````0+2
+M\`P`;`0`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````"```````````````````
+M`````````````````````````0(+N`L`A@```````0(1E`\`"0```````0(7
+M<`H`C`(``````0(C*`X`$@(``````0(NX`D`F`0``````0)&4`T`)`0`````
+M`0)=P`@`,`0``````0)I>`P`-@0`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M"````````````````````````````````````````````0(%W`L`@P``````
+M`0((R@\`!````````0(+N`H`A@(``````0(1E`X`"0(``````0(7<`D`C`0`
+M`````0(C*`T`$@0``````0(NX`@`&`0``````0(TO`P`&P0`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````!P``````````````````````````````````````
+M`````0,7<`L`C````````0,NX`H`F`(``````0-&4`X`)`(``````0-=P`D`
+ML`,``````0.,H`T`2`,``````0.[@`@`8`,``````0/2\`P`;`,`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````"```````````````````
+M`````````````````````````0,7<`L`C````````0,C*`\`$@```````0,N
+MX`H`F`(``````0-&4`X`)`(``````0-=P`D`L`0``````0.,H`T`2`0`````
+M`0.[@`@`8`0``````0/2\`P`;`0`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M!````````````````````````````````````````````0`#Z!L`@@``````
+M`0`'T!H$A`$``````0`5?!D$BP$``````0`J^!@$E@$`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````#```````````````````````````````````````
+M`````0`#Z!L`@@```````0`'T!H$A`$``````0`5?!D$BP(``````0`J^!@$
+ME@,```````(7<`L`#`0```````(C*`\`$@0``````0(NX`H`&`8``````0)&
+M4`X`)`8``````0)=P`D`,`@``````0*,H`T`2`@``````0*[@`@`8`@`````
+M`0+2\`P`;`@`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````#0``````````````````
+M`````````````````````````00`^@,`@0`"9`)D`00!]`<`@0`!R0')`00#
+MZ`(`@@$`Y`#D`00'T`8`A`(`H`"@`00+N`$`A@,`C`",`0(7<`L`C`0`/``\
+M`0(C*`\`$@0`/``\`0(NX`H`F`8`,``P`0)&4`X`)`8`,``P`0)=P`D`,`@`
+M+``L`0*,H`T`2`@`+``L`0*[@`@`8`@`+``L`0+2\`P`;`@`+``L````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``"YS>6UT86(`+G-T
+M<G1A8@`N<VAS=')T86(`+G)E;"YT97AT`"YR96PN<F]D871A`"YR;V1A=&$N
+M<W1R,2XT`"YR96PN9&%T80`N8G-S`"YC;VUM96YT````````````````````
+M```````````````````````````````````````?`````0````8`````````
+M-``"$O@```````````````0`````````&P````D````````````#''@``)6(
+M````"P````$````$````"````"D````!`````@```````A,L``"%Q```````
+M````````!``````````E````"0````````````.R````"8`````+`````P``
+M``0````(````,0````$````R```````"F/````$````````````````$````
+M`0```$0````!`````P```````IGP``!0F```````````````!`````````!`
+M````"0````````````.[@````$`````+````!@````0````(````2@````@`
+M```#```````"ZH@```&8```````````````$`````````$\````!````````
+M`````NJ(```#J````````````````0`````````1`````P````````````+N
+M,````%@```````````````$``````````0````(````````````"\)```!G0
+M````#`````<````$````$`````D````#`````````````PI@```2%@``````
+M`````````0```````````````````````````````````````````P```0``
+M``````````````,```,````````````````#```%`````````````````P``
+M!@````````````````,```@````````````````#```)`````0``J(0```"P
+M$@```0````P``),P````"!(```$````7``$X[````H02```!````(@``<%P`
+M``"<$@```0```"T``55P```"<!(```$````X```````````0````````0@`!
+M`7````!0$@```0```$T``6*(```!H!(```$```!8``!B3````6@2```!````
+M8P`!L+0```$L$@```0```&X``#C(```!I!$```8```!Y``$_O````#P2```!
+M````A```97@```!`$@```0```(\``%24````[!(```$```":``!(9````:01
+M```&````I0`!,-P```!`$@```0```+```2MP````(!(```$```"[``$>,```
+M`!`2```!````Q@`!`"@```%$$@```0```-$``0V\```!$!(```$```#<```+
+M5````*P2```!````YP``\(P```#`$@```0```/(``-58````R!(```$```#]
+M``"XX````(P2```!```!"```OD@````8$@```0```1,``)A,````1!(```$`
+M``$>``$U6````$@2```!```!*0``_J@````($@```0```30``1K0````*!(`
+M``$```$_``%7X````-`2```!```!2@``""0```!0$@```0```54``01(```!
+M'!(```$```%@``"M6`````@2```!```!:P`!G0````&@$@```0```78``)RL
+M````"!(```$```&!``"^8````!P2```!```!C```$!````&4$@```0```:<`
+M`$-X```!I!$```8```&R``$LT````)P2```!```!O0``F7@```"$$@```0``
+M`<@```/,````,!(```$```'3``&@Z````(`2```!```!W@``````````$```
+M`````?\``&N\````5!(```$```(*``$OA````4`2```!```"%0`!+Q0```!P
+M$@```0```B```/1(````G!(```$```(K``!NU````#@2```!```"-@``L]@`
+M``!@$@```0```D$``+EL````G!(```$```),``#U%````#@2```!```"5P``
+ML2P````D$@```0```F(``2VT````C!(```$```)M``"<^````302```!```"
+M>```:KP```!,$@```0```H,``)-H````.!(```$```*.``$EA````*`2```!
+M```"F0``NSP```!,$@```0```J0``2UL````,!(```$```*O``$L(````(`2
+M```!```"N@`!`LP```!P$@```0```L4``5C(````-!(```$```+0``!E<```
+M``@2```!```"VP`!+D````"<$@```0```N8``%D\```&J!(```$```+Q``"Z
+MS````#@2```!```"_``!*(````!L$@```0```P<```-L````8!(```$```,2
+M``$LH````#`2```!```#'0`!AD````%4$@```0```R@``1F0````1!(```$`
+M``,S``%A&````,P2```!```#/@``;C`````T$@```0```TD``*V@````M!(`
+M``$```-4``"R6````'02```!```#7P``DD0````T$@```0```VH``8T8````
+MF!(```$```-U``"%9````NP2```!```#@```<K0````$$@```0```XL``8VP
+M````-!(```$```.6``"5#````T`2```!```#H0```<0```&<$@```0```[``
+M`7+8```$/!(```$```.[```````````0```````#P@`!/<P```$8$@```0``
+M`\T``+I\````(!(```$```/8``&*K````8P2```!```#XP`!-`P```%,$@``
+M`0```^X``3[\````'!(```$```/Y```#8`````P2```!```$!```M:0````<
+M$@```0``!`\``/5,````\!(```$```0:``#TY````#`2```!```$)0``S?``
+M``!,$@```0``!#```%_D````%!(```$```0[``!N9````'`2```!```$1@``
+M`_P```'<$@```0``!%P``6`$````-!(```$```1G``">+````102```!```$
+M<@``<"P````P$@```0``!'T``````````!````````2'``"K"````"02```!
+M```$D@`!6+`````8$@```0``!)T``-ZT````-!(```$```2H``$@C```!(02
+M```!```$LP`!'.`````0$@```0``!+X``&9L````J!(```$```3)``"I-```
+M`&02```!```$U``!I(0```!4$@```0``!-\``1Z,```!3!(```$```3J``"Z
+M5`````02```!```$]0``:T````!\$@```0``!0```/0P````&!(```$```4+
+M``$%O```!YP2```!```%%@`!B@0```"H$@```0``!2$``2MH````"!(```$`
+M``4L``"Q"````"02```!```%-P`!0+0```!\$@```0``!4(``),H````"!(`
+M``$```5-``&8(````L02```!```%6```P+0```#<$@```0``!6,``&G<````
+M4!(```$```5N``$NW````#@2```!```%>0`!#5@```!D$@```0``!80``/QL
+M````(!(```$```6/``&A:````%@2```!```%F@``````````$```````!:<`
+M`)1L````H!(```$```6R``!X<````-P2```!```%O0`!G+P```!$$@```0``
+M!<@``:)0````$!(```$```73``$I5````+@2```!```%W@``!C0```&H$@``
+M`0``!>\``9$````$N!(```$```7Z``!O#````*`2```!```&!0``FD@```"X
+M$@```0``!A```+I(````!!(```$```8;``$KD````"`2```!```&)@`!L>``
+M``"P$@```0``!C$``'>L````?!(```$```8\``$5-````,02```!```&1P``
+MK6````!`$@```0``!E(``,_P```!N!(```$```9=``"2>````+`2```!```&
+M:``!:HP```<\$@```0``!G,``4(4````L!(```$```9^``$[<````#`2```!
+M```&B0``P9````&H$@```0``!I0``3$<```"\!(```$```:?``"W4````'P2
+M```!```&J@``NEP````@$@```0``!K4``36@```#3!(```$```;```&.(```
+M`602```!```&RP`!I-@```9\$@```0``!M8``+L$````.!(```$```;A``"?
+M1````!02```!```&[```9(@````0$@```0``!O<``*F8```!<!(```$```<"
+M``$G@````%`2```!```'#0``<T0````H$@```0``!Q@``?K4```!*!(```$`
+M``<C``!RJ`````02```!```'+@`!*]`````0$@```0``!SD``2I\````3!(`
+M``$```=$``!+K````:01```&```'3P``_/@```"`$@```0``!UH``;:$````
+M7!(```$```=E``!Q0````(P2```!```'<```OGP````<$@```0``!WL``'E,
+M```!_!(```$```>&``%51````"P2```!```'D0`!)3@````D$@```0``!YP`
+M`2?0````L!(```$```>G``&BC````?@2```!```'L@``A!`````<$@```0``
+M![T``'7T````'!(```$```?(``!LJ````0`2```!```'TP``>$0````L$@``
+M`0``!]X``2;\````A!(```$```?I``%;C````W@2```!```']```````````
+M$```````!_X``99@```!P!(```$```@)```\$````:01```&```(%```9Q0`
+M``&T$@```0``"!\``$<,````@!(```$```@J``"3.````#`2```!```(-0``
+M>"@````<$@```0``"$```````````!````````A@``![2```!]02```!```(
+M:P`````````)$0``!@``"'L``60H````F!(```$```B&``"RS````$02```!
+M```(D0`"$=````$H$@```0``")P``0[,````A!(```$```BG``$I"````$P2
+M```!```(L@``<K@````$$@```0``"+T``6"8````@!(```$```C(``"Z3```
+M``@2```!```(TP``O;@````D$@```0``"-X``*Y4````J!(```$```CI``$K
+MX````#@2```!```(]```````````$```````"0,``+-4````3!(```$```D.
+M``!*"````:01```&```)&0`!/:@````D$@```0``"20``1:H````9!(```$`
+M``DO``#6(````&`2```!```).@``@_@````8$@```0``"44``+?\````G!(`
+M``$```E0``$<\````4`2```!```)6P``11P```&D$0``!@``"68``3#$````
+M&!(```$```EQ``"U.````&P2```!```)?``!08@```",$@```0``"8<``:YD
+M```"4!(```$```F2``"N_````>02```!```)G0``=KP````T$@```0``":@`
+M`+',````0!(```$```FS``#9\````502```!```)O@``BR@````8$@```0``
+M"<D``4`X````?!(```$```G4``!&P````:01```&```)WP``LQ````!$$@``
+M`0``">H``+2(````L!(```$```GU``!MJ````&P2```!```*```!E=0````@
+M$@```0``"@L``````````!````````H:``#^L````$02```!```*)0`!)5P`
+M```H$@```0``"C```&CP````)!(```$```H[``$MG````!@2```!```*1@``
+MND`````($@```0``"E$``29D````F!(```$```I<```]M````:01```&```*
+M9P``P'@````<$@```0``"G(``*LL```!+!(```$```I]```!:````%P2```!
+M```*BP``.FP```&D$0``!@``"I8``+_\````?!(```$```JA``"L6````!`2
+M```!```*K`````P````D$0``!@``"KX``&P0````*!(```$```K)``!LE```
+M`!02```!```*U``!'D````!,$@```0``"M\``'4`````;!(```$```KJ``&T
+M%````G`2```!```*]0``=6P````D$@```0``"P```+C(````&!(```$```L+
+M``$_=````$@2```!```+%@``4S@```$<$@```0``"R$``96X````'!(```$`
+M``LL``"_@````'P2```!```+-P``N@@````X$@```0``"T(``3\T````0!(`
+M``$```M-``#\C````"02```!```+6``!C>0````\$@```0``"V,``+B8````
+M,!(```$```MN``%QR````-@2```!```+>0``K&@```#P$@```0``"X0``/[T
+M```!-!(```$```N/```_6````:01```&```+F@``=H@````T$@```0``"Z4`
+M`:)@````+!(```$```NP``!CV````+`2```!```+NP``=9````!,$@```0``
+M"\8``/>X```$F!(```$```O1``!RZ````%P2```!```+W```<2@````8$@``
+M`0``"^<``1<,```!S!(```$```OR``&,.````.`2```!```+_0``P)0````@
+M$@```0``#`@``%14````0!(```$```P3``$:6````'@2```!```,'@``#P@`
+M``"$$@```0``#"D```E(```"#!(```$```PT``$93````$02```!```,/P``
+M<<P```"<$@```0``#$H``'7<````&!(```$```Q5``&$-````)02```!```,
+M8```:G@```!$$@```0``#&L``7*@````.!(```$```QV``!#_````"P2```!
+M```,@0``!=@```!<$@```0``#(P``28D````0!(```$```R7```````````0
+M```````,IP``WN@```&D$@```0``#+(``````````!````````R[``!CM```
+M`"02```!```,Q@`!FN0```'8$@```0``#-$``&L(````.!(```$```S<``$?
+MV````+02```!```,YP``MK````"@$@```0``#/(``/UX```!,!(```$```S]
+M```````````0```````-'0``"'0```#4$@```0``#2@``&E`````5!(```$`
+M``TS``!IE````$`2```!```-/@``L@P```!,$@```0``#4D``&6X````M!(`
+M``$```U4``"T.````%`2```!```-7P`!#U````6H$@```0``#6H``+J<````
+M(!(```$```UU``%"Q````?02```!```-@```<J`````($@```0``#8L``&C(
+M````*!(```$```V6``!LC`````@2```!```-H0``````````$```````#:\`
+M`+#@````*!(```$```VZ```,G````2`2```!```-Q0``<KP````L$@```0``
+M#=```+]`````0!(```$```W;``"[B````#`2```!```-Y@``A)P```#($@``
+M`0``#?$``';P````0!(```$```W\``!L.````%02```!```.!P`!)1`````H
+M$@```0``#A(``3\8````'!(```$```X=``%4L````)02```!```.*```LZ``
+M```X$@```0``#C,``1H@````.!(```$```X^``%DP```!<P2```!```.20``
+M;A0````<$@```0``#E0``+W<````;!(```$```Y?``"UP````#02```!```.
+M:@``FP````&L$@```0``#G4``+%8````=!(```$```Z```"Z6`````02```!
+M```.BP``DZ````#,$@```0``#I8``$U0```!I!$```8```ZA``!I.`````@2
+M```!```.K```L5`````($@```0``#K<``&'H````9!(```$```["``!DF```
+M`-@2```!```.S0`!&=0```!,$@```0``#M@```^,````A!(```$```[C``&@
+MQ````"02```!```.[@`!+!@````($@```0``#OD``+9D````3!(```$```\$
+M``&#5````.`2```!```/#P``O4P```!L$@```0``#QH``,,X```*H!(```$`
+M``\E``!.]````:01```&```/,``!%1@````<$@```0``#SL``&HL````3!(`
+M``$```]&```'W````$@2```!```/40``:10````D$@```0``#UP``9Z@```"
+M)!(```$```]G``&0/````,02```!```/<@``=A`````<$@```0``#WT``+?,
+M````,!(```$```^(``$^Y````!@2```!```/DP``=BP```!<$@```0``#YX`
+M`&#L````>!(```$```^I``!P^````#`2```!```/M```I-0````H$@```0``
+M#[\```V\```!3!(```$```_*``$!;`````02```!```/U0``F)````!<$@``
+M`0``#^```+[8````-!(```$```_K``!RK`````@2```!```/]@``]O0```#$
+M$@```0``$`$``3_X````0!(```$``!`,``'(]````0P2```!```0%P``<F@`
+M```X$@```0``$"(``%6`````*!(```$``!`M``!+B```![`2```!```00P`!
+M03````!8$@```0``$$X``'<P````?!(```$``!!9``%$N```#_@2```!```0
+M9``!&O@```'H$@```0``$&\``/RP````2!(```$``!!Z``"_#````#02```!
+M```0A0``F.P```",$@```0``$)```$.0````;!(```$``!";``"<M````$02
+M```!```0I@``A"P```!P$@```0``$+$``+Z8````0!(```$``!"\``#-V```
+M`!@2```!```0QP``860```"$$@```0``$-(``)]`````!!(```$``!#=``!O
+MK````(`2```!```0Z```[V0```!$$@```0``$/,``3T\````;!(```$``!#^
+M``$JR````*`2```!```1"0``M?0```!P$@```0``$10``)_(```%#!(```$`
+M`!$?``".6````W02```!```1*@`!*[`````@$@```0``$34``/Q0````'!(`
+M``$``!%```'E;````1P2```!```12P`!*@P```!P$@```0``$58``1C8````
+M=!(```$``!%A``%8_````I`2```!```1;``!E?0````D$@```0``$7<`````
+M`````!```````!&)``"H#````'@2```!```1E``!%?@```"P$@```0``$9\`
+M`````````!```````!&P``!IU`````@2```!```1NP``NKP````0$@```0``
+M$<8``)G\````3!(```$``!'1``$H[````!P2```!```1W``!?0@```$`$@``
+M`0``$><``,X\```!M!(```$``!'R``!&F````'02```!```2"P`!EA@```!(
+M$@```0!Z>C`P-6(U.#0V`'IZ,#`R9&(Q,6,`>GHP,F1B9C@W-0!Z>C`R9&)B
+M,6(R`'IZ,#)D8C(P-3,`7U]A<VAL9&DS`'IZ,#`R9&)A-#(`>GHP9F)B,64S
+M9@!Z>C!B-SEE83DT`'IZ,#5B.&,V-6$`>GHP,#5B-#!A9`!Z>C`U8CDT,F5D
+M`'IZ,&0X9&,V,F,`>GHP,#$Y9C0W,`!Z>C`R9&0Y-#)D`'IZ,#)D8F4W,V0`
+M>GHP,#5B-CDR8@!Z>C!B-F0R,S(U`'IZ,#`U8C@U,V0`>GHP,#$V9#DR90!Z
+M>C!C9F(Q.#<U`'IZ,#`R9&(S,6,`>GHP,F1A8F)A8P!Z>C`R9&)C.#4Q`'IZ
+M,#`P8C9C-C@`>GHP,#!B-F)F.`!Z>C`P8C9C9C5E`'IZ,#$V93%D9F0`>GHP
+M8C9F-3!B.`!Z>C`V93!A-&9E`'IZ,#`V-V0R8C$`>GHP,#)D8F,V,0!Z>C!B
+M-F-A,S(U`'IZ,#`U8C9C9F0`>GHP,39E,&1F9`!Z>C`P,&(V9C8X`&%T:%]H
+M86Q?<')O8V5S<U]N;VES969L;V]R`'IZ,#`U8C0X860`>GHP,F1B9C%B,@!Z
+M>C`P-6(X.&-B`'IZ,#,S96,X8F8`>GHP9&(T,C5C-0!A=&A?:&%L7V1M85]B
+M96%C;VY?<F5S<&]N<V5?=&EM90!Z>C`P8C9F,38Q`'IZ,#9E,#!B.&$`>GHP
+M,F1B9F,Q9`!Z>C!D8S1E,SDP`'IZ,&1A9F5D.#8`>GHP,&(V93(W80!Z>C`R
+M9&)B86(R`'IZ,&(V9#%E9F8`>GHP,39D.3!D9`!Z>C`R9&)E.#4Q`'IZ,#`U
+M8C8T9F0`>GHP,#!B-F0U,@!Z>C!B-F,Y969F`'IZ,#$V93`P9&0`>GHP,F1B
+M9#@W-0!Z>C`R9&(S,6(R`'IZ,#!B-S`Y,C,`>GHP,&(V9#0U,`!Z>C`P,&(V
+M9#%D`'IZ,&(V8S(S,C4`>GHP,F1B9&%B,@!Z>C`P,#5B-C,R`'IZ,#9D961D
+M.3,`>GHP,#$V9&$U,`!Z>C`P,#8W9#,R`'IZ,#!B-F0Y,C,`>GHP,#)D8C4Q
+M8P!Z>C`Q-F1C8F9E`'IZ,#!B-S`Q-#4`>GHP,#$V9&8R8P!Z>C!B-V9A9#-E
+M`'IZ,#$V9#DY,C``>GHP,F1B,6)A8P!Z>C!D8S9E,SDP`'IZ,#5B-S`Q93``
+M>GHP,#!B-F(Q,`!Z>C!B-S`Y969F`'IZ,#$V9&8X.6(`871H7VAA;%]A='1A
+M8V@`>GHP-F4P9F,P9`!M96UC<'D`>GHP,39D86(R9`!Z>C`R9&(Q,S5D`'IZ
+M,&4P-#8X-&(`>GHP,39E,CDQ9`!Z>C`P,&(V9F4X`'IZ,#!C9F(S93``>GHP
+M,#$V9#DT.`!Z>C`Q-F4R,#EB`'IZ,&(W,#%E9F8`>GHP,#!B-F,Y9`!Z>C`P
+M,#5B-6$R`'IZ,#)D8C$W,&$`871H7VAA;%]C;VUP=71E='AT:6UE`'IZ,#)D
+M8C5B86,`>GHP,#5B.#$S9`!Z>C`P8C9C.3(S`%]?=61I=G-I,P!Z>C!B-F(U
+M,&(X`'IZ,#`U8C=F.60`>GHP8C<P,60P,@!Z>C`V9&9F-#1A`'IZ,#)D8C4W
+M-C,`>GHP-F5E868V,`!Z>C!E,#`W8V$Q`'IZ,#`R9&%F-C(`>GHP8C@S860S
+M90!Z>C`P,&(V8CDP`'IZ,#$V9#EE9F$`>GHP,39D93`U,0!Z>C`P,#5B-F(R
+M`'IZ,#5B-V8Q,30`>GHP-&%E,#,Q9@!Z>C`R9&)D9&9D`'IZ,#`U-#=F960`
+M>GHP,&(V8F8U90!Z>C`P8C<Q-S=D`'IZ,#!B-S!F,V0`>GHP,39D.#DR,`!Z
+M>C`R9&(Q86(R`'IZ,#`P-6(V,C(`>GHP,#!B-F8W.`!Z>C!B-CEB,#=C`&%T
+M:%]H86Q?9G)E90!Z>C`U8C<Y8C%B`'IZ,#!B-S`W,V0`>GHP,F1B96)B9`!Z
+M>C!B-64S,34R`'IZ,#$V9&9B9C$`871H7VAA;%]M:'HR:65E90!Z>C`Q-F4Q
+M.#EB`'IZ,&1C,F$U8S4`>GHP,#)D8S8P8@!Z>C`V9&8P8CAA`'IZ,#)D8C,S
+M-60`>GHP8C9C-3-A-`!Z>C!F-31D,6(P`'IZ,&(V9F0S-C,`>GHP9#ED8S8R
+M8P!Z>C`U8C<T,64P`'IZ,#)D83EB86,`>GHP9&,R,60S80!Z>C`P8C<Q-S-D
+M`'IZ,#$V9#ED-#$`>GHP,#5B.#1F9`!Z>C`P-6(X86)D`'IZ,#!B-S`Q,C,`
+M>GHP,#5B-C4R8@!Z>C`R9&(S.#<U`'IZ,#$V93,P.6(`>GHP,#5B-C!B,@!Z
+M>C`R9&(Q.#<U`'IZ,#`R9&(X-#(`>GHP,F1B,3<V,P!Z>C!B-V1E83DT`'IZ
+M,#!B-S`Q-C$`>GHP,39D-V0T,0!Z>C`P,39C9#,R`'IZ,#9D93!B.&$`>GHP
+M-F0Y9&0Y,P!Z>C!D8C-E9#@V`'IZ,#`U8C0X960`>GHP,#)D8S@P8@!Z>C`P
+M,F1B8S0R`'IZ,#)D8F$X-3$`>GHP,F1B,S-E9`!Z>C`P-6(X,&9D`'IZ,#`U
+M8C=F,F4`>GHP,F1B9F1F9`!Z>C`Q-F4V-#AA`'IZ,#`R9&%F9C(`>GHP,#5B
+M-S<Y9`!Z>C`P,&(V964X`'IZ,#$V930T.&$`>GHP,&(V9C9B8P!Z>C`Q-F1A
+M.3(P`'IZ,#5B-S@Q93``7U]U;6]D<VDS`'IZ,#`R9&-A,&(`>GHP,#5B-#1A
+M9`!Z>C`V9&1F-#1A`'IZ,&9A8S!C.6(`>GHP8C9F.65F9@!Z>C`P8C9C-F)C
+M`&%T:%]H86Q?861D:71I;VYA;%]S=V)A7V)A8VMO9F8`>GHP,#`R9&(Y,@!A
+M=&A?:&%L7W9E<G-I;VX`>GHP,F1B86,R90!Z>C`R9&(W.6%E`'IZ,#`Q-F4U
+M,S(`>GHP8C9C9C`P.0!Z>C`P,39E,3)C`'IZ,#`Q-F0Y930`>GHP,#`R9&%E
+M80!Z>C`P-6(U8V(R`'IZ,#$V9&$R-3$`>GHP-F8V868V,`!Z>C`V9&9D9#DS
+M`&%T:%]H86Q?;6%L;&]C`'IZ,#`P8C9D9#(`>GHP,F1D.3)A9`!Z>C`Q-F1B
+M,C4Q`'IZ,&4Q,#=C83$`>GHP,&(V8S<U90!Z>C`Q-F1D,#4Q`'IZ,#)D8F0Q
+M8C(`>GHP,F1C,3<V,P!Z>C!B-CDP9#9D`'IZ,#$V9&8P-3$`>GHP,#$V9#DU
+M,`!Z>C`P8C<P-F)C`'IZ,#`Q-F0X-S(`>GHP-F1E9C0T80!Z>C`U8CAC,F5D
+M`'IZ,#9F8CDT-V(`>GHP96)B,64S9@!Z>C!B-F8Y9#`R`'IZ,&0Q-&0Q8C``
+M>GHP8C0X,#,Q90!Z>C`Q-F1B8F9E`'IZ,#$V934T.&$`>GHP,#$V9#@U,`!Z
+M>C`P,&(V9F8X`&%T:%]H86Q?;65M8W!Y`'IZ,#)D8F-B8F0`>GHP,39D83!D
+M9`!Z>C`R9&)B9&9D`'IZ,#)D8C(X-3$`>GHP,F1B9&,Q9`!Z>C`V9&(P8V8R
+M`'IZ,#$V96(Y860`>GHP,&(V8V5B8P!Z>C!D.30X-&$Q`&%T:%]H86Q?<')O
+M8F4`>GHP,39E83EA9`!Z>C!F9#1D,6(P`'IZ,#)D8C,W-C,`871H7VAA;%]B
+M=6EL9&]P=',`>GHP,F1A9C,U9`!Z>C`V9&1D9#DS`'IZ,&1A9&,V,F,`>GHP
+M,39D9C(U,0!Z>C`P,&(V8S$P`'IZ,#$V9#DR-3$`>GHP,F1B,#@U,0!Z>C!B
+M-S(Q865D`'IZ,#8W8V9C864`>GHP,#!B-F-F.`!Z>C!C.31D,6(P`'IZ,#)D
+M869A8C(`>GHP-6(Y,F%E9`!Z>C`P-6(X8V-B`'IZ,&(V9#EE9F8`>GHP,F1B
+M,3%B,@!Z>C`R9&)F9F(Q`'IZ,#)D8F8W-C,`>GHP,#5B-CAF9`!Z>C`P-6(T
+M-&5D`'IZ,&(W,3%A960`>GHP8C5E,S$V,`!Z>C!D.#0X-&$Q`'IZ,#$V9#AB
+M,F0`>GHP,39E,#@Y8@!Z>C`R9&)B.#<U`'IZ,#)D864X-3$`>GHP8C@Q96$Y
+M-`!Z>C`Q-F1E8S%F`'IZ,#!B-F9E8F,`>GHP93@Y-#DP-P!Z>C`P8C9E83=A
+M`'IZ,#,S93AF8F8`>GHP8V9A-3@W-0!Z>C`R9&(Y.6%E`'IZ,#)D8CEA8C(`
+M>GHP,#!B-F)E.`!Z>C!D938X,S=F`'IZ,#$V9&%B9F4`>GHP8C<P.60P,@!Z
+M>C`V-V0R-64R`'IZ,#$Y9C-A,#$`>GHP-S`S.30W8@!A=&A?:&%L7VUE;7IE
+M<F\`>GHP-F1F9F,P9`!?7V1I=G-I,P!Z>C!B-C<U,&(X`'IZ,#$V93)D9F0`
+M>GHP,#!B-F0R,@!Z>C`V9F5A9C8P`'IZ,&1C-&$U8S4`>GHP,&(W,&8W9`!A
+M=&A?:&%L7W-W7V)E86-O;E]R97-P;VYS95]T:6UE`'IZ,#EF-C1B-F$`>GHP
+M,#5B-C4W80!Z>C`V9C,Y-#=B`'IZ,#9D83!C9C(`>GHP8C=B860S90!Z>C`P
+M8C9F.38Q`'IZ,&(V.3<S8F,`>GHP,F1B9#,U9`!Z>C`P-6(X.&9D`'IZ,#)D
+M8F)C,60`>GHP,F1A9F1F9`!Z>C`V9#=D9#DS`&%T:%]H86Q?9&5L87D`>GHP
+M,F1B,61F9`!Z>C`V-V0R9C0Q`'IZ,#)D868X-S4`>GHP8C=E9&4V9`!Z>C`Q
+M-F0X9#0Q`'IZ,#`R9&%E.3(`>GHP8C=A9&4V9`!Z>C`R9&)B,S5D`'IZ,#)D
+M8C-D9F0`>GHP,F1B-3-E9`!Z>C`Q-F1C96%E`'IZ,#`P8C9D83(`>GHP,#!B
+M-F4R,@!Z>C`U8C@P,#0Q`'IZ,#`Q-F0X-#@`>GHP,39D.6(R9`!Z>C`P,39E
+M,#)C`'IZ,#!B-S`W-V0`>GHP,#5B-CDW80!Z>C`P,39D864T`'IZ,#$V93$P
+M.6(`>GHP,#5B-&$R9`!Z>C`Q-F1E,&1D`'IZ,#$V9&8P9&0`>GHP9&8P-V-A
+M,0!Z>C`R9&)D-S8S`'IZ,#`P8C9E-3(`>GHP-C=D,&,T-P!Z>C`U8C9C-F1B
+M`'IZ,&,S,35E8C4`>GHP9&(Q960X-@!Z>C`V9#0P-F4P`'IZ,#$V93`R-3$`
+M>GHP,#`R9&)B,@!Z>C`P,F1D.#9D`'IZ,#`Q-F4Q-&0`>GHP,F1B-3EA90!Z
+M>C`P-C=D,C(Q`'IZ,#$V9#@P9&0`>GHP,#5B.#DS9`!Z>C`U8C@Q8C%B`'IZ
+M,#)D8C$S960`>GHP,&(V9#$R,P!Z>C`P,&(V8V4X`'IZ,#5B.&%A960`>GHP
+M8C9E9#,V,P!Z>C`R9&%F,6(R`'IZ,#`P-6(U93(`>GHP,S-E8F9B9@!Z>C`U
+M8C8X-F1B`'IZ,#`P8C9E9C@`>GHP8C<Q.6%E9`!Z>C`P-6(U.&(R`'IZ,#5B
+M-V1B,6(`>GHP8C@R9&4V9`!Z>C`P,39D-S,R`'IZ,#)D861A8C(`>GHP9C0U
+M939E,P!A=&A?:&%L7VEN:71?8VAA;FYE;',`>GHP,&(V9#9B8P!Z>C!C,31D
+M,6(P`'IZ,#`P,F1B9#(`>GHP9&$T.#1A,0!Z>C`Q-F4P8C@W`'IZ,#5B.3`R
+M960`>GHP9&,R93,Y,`!Z>C!A-C!D,30U`'IZ,#)D8F%B8F0`>GHP,#!B-F,Q
+M9`!Z>C`U8CAE865D`'IZ,#`U8C=B.60`>GHP,#5B-30T-@!Z>C`U8C8T-F1B
+M`'IZ,#!B-F8Y,C,`>GHP9&0V.#,W9@!Z>C`Q-F4Q,C4Q`'IZ,&1C-F$U8S4`
+M>GHP,F1B,S<P80!Z>C`P,#5B-C<R`'IZ,#9D969C,&0`>GHP,F1B9C,U9`!Z
+M>C`P,&(V8S<X`'IZ,#`Q-F0X,S(`>GHP,F1B-3<P80!Z>C`P-6(V9#=A`'IZ
+M,#`R9&(R.3(`>GHP,#5B.3!C8@!A=&A?:&%L7W)E9U]W<FET90!Z>C!B-F8U
+M,S8S`'IZ,#`U8C5C-#8`871H7VAA;%]R96=?<F5A9`!Z>C`V9#DP8V8R`'IZ
+M,#9D.&1D.3,`>GHP,39D9F(X-P!Z>C`P,39D830X`'IZ,&(V-C,Q83@`>GHP
+M,#)D8C`Y,@!A=&A?:&%L7V=E='=I<F5L97-S;6]D97,`>GHP,39E,6(X-P``
+M`````!0```$!````'````0$````D```!`0```"P```$!````-````0$````\
+M```!`0```$````$!````2````0$```!0```!`0```%0```$!````9````0$`
+M``!L```!`0```'````$!````@````0$```"$```!`0```)0```$!````H```
+M`0$```"D```!`0```+0```$!````N````0$```#(```!`0```,P```$!````
+MW````0$```#@```!`0```0P```$!```!0````P(```%$```#`@```4@```,"
+M```!3````P(```%0```#`@```50```,"```!6````P(```%<```#`@```6``
+M``,"```!9````P(```&<```!`0```;P```$!```!]````0$```'X```!`0``
+M`@````$!```""````0$```(0```!`0```A0```$!```"'````0$```(H```!
+M`0```BP```$!```"/````0$```)````!`0```E````$!```"7````0$```)L
+M```!`0```G````$!```"@````0$```*,```!`0```IP```$!```"H````0$`
+M``*H```!`0```L```'@!```"Q````0$```+8``&(`0```MP```$!```"\```
+M1P$```+T```!`0```YP``90!```#M``!.0$```/(```!`0```]@```$!```#
+M\````0$```1,```!`0``!%````$"```$5````0(```18```!`@``!%P```$"
+M```$8````0(```1P```!`0``!*0``&L!```$L````0$```3$```!`0``!-``
+M``$!```$[```:P$```3X```!`0``!0P```$!```%&````0$```4T``!K`0``
+M!4````$!```%7```:P$```5H```!`0``!80``&L!```%D````0$```6L``!K
+M`0``!<````$!```&3````0$```9<```!`0``!FP```$!```&<````0$```9X
+M```!`0``!GP``+\!```&A````0$```:4```!`0``!LP```$!```&\````0$`
+M``<(```!`0``!S0```$!```'.```OP$```=````!`0``!U````$!```'D```
+M`0$```>@```!`0``"`P``2$!```((````@(```A4``$A`0``"&0``&L!```(
+M<````@(```BP```!`0``"0P``&<!```)+```9P$```E$```!`0``"5@```$!
+M```)7````0(```E@```!`@``"60```$"```):````0(```EL```!`@``"7``
+M``$"```)=````0(```EX```!`@``"7P```$"```)@````0(```F$```!`@``
+M"8@```$"```)C````0(```F0```!`@``"90```$"```)F````0(```F<```!
+M`@``":````$"```)I````0(```FH```!`@``":P```$"```)L````0(```FT
+M```!`@``";@```$"```)O````0(```G````!`@``"<0```$"```)R````0(`
+M``G,```!`@``"=````$"```)U````0(```G8```!`@``"=P```$"```)X```
+M`0(```GD```!`@``">P```$!```*&````0$```HD```!`0``"E0```$!```*
+M8````0$```IH```!`0``"G0```$!```*>````0(```I\```!`@``"H````$"
+M```*A````0(```J0```!`0``"IP```$!```*I````0$```JL```!`0``"K@`
+M``$!```*Q````0$```K0```!`0``"MP```$!```*Y````0$```KH```!`0``
+M"O@```$!```*_````0$```L(```!`0``"Q0```$!```+'````0$```M(```!
+M`0``"V0```$!```+:````0$```MP```!`0``"W0```$!```+?````0$```N`
+M```!`0``"X@```$!```+E````0$```N8```!`0``"Z````$!```+J````0$`
+M``NL```!`0``"]@```$!```+Z````0$```PL```!`0``#%0``90!```,@```
+M`0$```R,```!`0``#+@```$!```,O````0(```S````!`@``#,0```$"```,
+MR````0(```S,```!`@``#-````$"```,U````0(```S8```!`@``#-P```$"
+M```,X````0(```SD```!`@``#.@```$"```,[````0(```SP```!`@``#/0`
+M``$"```,^````0(```S\```!`@``#0````$"```-!````0(```T(```!`@``
+M#0P```$"```-$````0(```T4```!`@``#1@```$"```-'````0(```T@```!
+M`@``#20```$"```-*````0(```TL```!`@``#3````$"```--````0(```U$
+M```!`0``#50```$!```->````0$```V````!`0``#9@```$!```-J````0$`
+M``WT```!`0``#@P```$!```.*````0$```XX```!`0``#CP```$!```.4```
+M`0$```YL```!`0``#GP```$!```.@````0$```Z<```!`0``#K@```$!```.
+M\````0$```^@``$``0``#[@```$!```/Q``!(0$``!`,```"`@``$$@```$!
+M```08````0$``!!L``$A`0``$*P```$!```0N````0$``!#H```!`0``$/0`
+M``$!```10````0$``!%<```!`0``$9P```$!```1H````@(``!(4```!`0``
+M$A@```("```2'````@(``!),```!`0``$Q````$!```3'````0$``!-````!
+M`0``$U@```$!```3P````0$``!/$```!`0``%:````$!```5O````0$``!7,
+M```!`0``%@P``-`!```62````0$``!:\```!`0``%O0```$!```7/````0$`
+M`!=(```!`0``%V0```$!```7>````0$``!>(```!`0``%_````$!```8!```
+M`0$``!B(```!`0``&;P```$!```9]````0$``!GX```!`0``&@````$!```:
+M!````0$``!H,```!`0``&A````$!```:'````0$``!HD```!`0``&E````$!
+M```:9````0$``!IT```!`0``&H@```$!```:E````0$``!J8```!`0``&J0`
+M``$!```:U````0$``!K8```!`0``&N0```$!```;%````0$``!L8```!`0``
+M&RP``2,!```;2````0$``!U,```!`0``'7````$!```=K````0$``!WD```!
+M`0``'@@```$!```>)````0$``!Y<``"%`0``'FP```$!```?%````0$``!]0
+M```!`0``'XP```$!```?E````0$``!^X```!`0``'[P```$!```?Y````0$`
+M`!_T```!`0``'_P```$!```@(````0$``"`D```!`0``(%````$!```@8```
+M`0$``"!T```!`0``()@```$!```@P````0$``"'(```!`0``(O0```$!```C
+M`````0$``"-L```!`0``)%@```$!```D9````0$``"20```!`0``)C0```$!
+M```F0````0$``":\```!`0``)Z0```$!```GR````0$``"?X```!`0``*!0`
+M``$!```HA````0$``"BD```!`0``*.````$!```I3````0$``"F<```!`0``
+M*;````$!```IT````0$``"H$``!:`0``*A0``-`!```J(````0$``"HP```!
+M`0``*CP``2,!```J8````0$``"IH```!`0``*H0```$!```JE````0$``"J<
+M```!`0``*L0```$!```JU``!(P$``"L````!`0``*P@```$!```K)````0$`
+M`"LT```!`0``*SP```$!```K9````0$``"MT``$C`0``*Z````$!```KJ```
+M`0$``"O$```!`0``*]0```$!```KW````0$``"OL``"%`0``*_@```("```L
+M'````0$``"PH```!`0``+"P```$!```L/````0$``"Q(```!`0``+%0```$!
+M```LA````0$``"R(```!`0``+)````$!```LE````0$``"R@```!`0``+*0`
+M``$!```LO````0$``"S(```!`0``+.0```$!```L\````0$``"T,```!`0``
+M+20```$!```NV````0$``"[L```!`0``+Q0```$!```O*````0$``"]$```!
+M`0``+W0```$!```OE````0$``"^8```!`0``+Z````$!```OI````0$``"^L
+M```!`0``+[````$!```OS````0$``"_8```!`0``+_0```$!```P`````0$`
+M`#`@```!`0``,$````$!```PD````0$``#"8```!`0``,*````$!```PI```
+M`0$``#"P```!`0``,,@```$!```PY````0$``#$X```!`0``,6````$!```Q
+ML````0$``#'$```!`0``,?@```$!```R+````0$``#)$```!`0``,F````$!
+M```R=````0$``#+````!`0``,RP```$!```S,````0$``#5$```!`0``-60`
+M``$!```U<````0$``#5T```!`0``-80```$!```UE````0$``#6X```!`0``
+M-C````$!```VP````0$``#;@```!`0``-P````$!```W4````0$``#=X```!
+M`0``-Y@```$!```WT````0$``#@D```!`0``.'0```$!```XQ````0$``#DH
+M```!`0``.7@```$!```YD````0$``#F4```!`0``.9P```$!```YH````0$`
+M`#FH```!`0``.:P```$!```YV````0$``#GT```!`0``.A0```$!```Z.```
+M`0$``#J@```!`0``.MP```$!```[&````0$``#MH```!`0``.Z0```$!```[
+MO````0$``#OD```!`0``/`0```$!```\(````0$``#PD```!`0``/#@```$!
+M```\0````0$``#Q$```!`0``/&````$!```\E````0$``#S$```!`0``/.@`
+M``$!```]%````0$``#T@```!`0``/5````$!```]<````0$``#UX```!`0``
+M/7P```$!```]A````0$``#V(```!`0``/9````$!```]E````0$``#VT```!
+M`0``/<@```$!```]X````0$``#X````!`0``/A````$!```^,````0$``#Y0
+M```!`0``/F@```$!```^?````0$``#ZD```!`0``/MP```$!```^]````0$`
+M`#\L```!`0``/V````$!```_@````0$``#^4```!`0``/\P```$!``!`$```
+M`0$``$`P```!`0``0#P```$!``!`7````0$``$!T```!`0``0*@```$!``!`
+M[````0$``$$4```!`0``02@```$!``!!1````0$``$%\```!`0``0>@```$!
+M``!"$````0$``$)````!`0``0E0```$!``!"?````0$``$*H```!`0``0L@`
+M``$!``!"W````0$``$,P```!`0``0T0```$!``!#7````0$``$-@```!`0``
+M0V@```$!``!#B````@(``$.,```"`@``0Z0```$!``!#N````0$``$/,```!
+M`0``0^````$!``!#]````0$``$0@```!`0``1+P```$!``!$S````0$``$3H
+M```!`0``10P```$!``!%&````0$``$4<```!`0``13@```$!``!%1````0$`
+M`$50```$`@``150```0"``!%<````0$``$5T```!`0``180```$!``!%O```
+M`0$``$7T```!`0``1@````$!``!&%````0$``$88```$`@``1D````$!``!&
+M5````0$``$9H```!`0``1GP```$!``!&A````0$``$:\```!`0``1L@```$!
+M``!&Y````0$``$;L```!`0``1OP```$!``!''````0$``$<L```!`0``1S``
+M``$!``!'.````0$``$<\```!`0``1TP```$!``!'7````0$``$=X```!`0``
+M1\0```$!``!'R```!`(``$?8```!`0``1^0```$!``!']````0$``$@H```!
+M`0``2$P```$!``!(4```!`(``$B````!`0``2)```.D!``!(K````0$``$BP
+M```$`@``2.P```$!``!(\```!`(``$DP```!`0``230```$!``!)1````0$`
+M`$E4```!`0``25P```$!``!)9````0$``$EL```!`0``27@```$!``!)A```
+M`0$``$FX```!`0``2<@```$!``!)W````0$``$H0```!`0``2C@```$!``!*
+M0````0$``$I(```!`0``2F0```$!``!*B````0$``$KD```$`@``2N@```0"
+M``!+%```#`$``$M,```!`0``2V````$!``!+;````0$``$O,```!`0``2^@`
+M``$!``!+^````0$``$P(```!`0``3"P```$!``!,/````0$``$Q@```!`0``
+M3'P```$!``!,V````0$``$TH```!`0``33@```$!``!-1````0$``$UH```!
+M`0``370```$!``!->````0$``$V````!`0``38@```$!``!-C````0$``$V4
+M```!`0``39@```$!``!-H````0$``$VD```!`0``3:P```$!``!-L````0$`
+M`$W4```!`0``3?@```$!``!.(````0$``$Y(```!`0``3FP```$!``!.F```
+M`0$``$Z@```!`0``3K````$!``!.N````0$``$[8```!`0``3O@```$!``!/
+M#````0$``$\<```!`0``3SP```$!``!/6````0$``$]T```!`0``3WP```$!
+M``!/I````0$``$^T```!`0``3\````$!``!/S``!(P$``%`$```!`0``4!P`
+M``$!``!0F````0$``%"X```!`0``44@```$!``!1=````0$``%'P```!`0``
+M4@0```$!``!2%````0$``%(<```!`0``4C@```$!``!24````0$``%*<```!
+M`0``4KP```$!``!2\````0$``%,8```"`@``4QP```0"``!3(```!`(``%,D
+M```$`@``4R@```0"``!3+```!`(``%,P```"`@``4S0```$"``!39````0$`
+M`%-T```!`0``4Y````$!``!3G````0$``%.L```!`0``4\0```$!``!3[```
+M`0$``%/\```!`0``5`@```$!``!42````0$``%1D``$``0``5+P```$!``!4
+MP````0$``%3,```!`0``5-0```$!``!4Z````0$``%3\```!`0``51````$!
+M``!5)````0$``%4\```!`0``54@``0`!``!54````0$``%5D```!`0``58P`
+M`0`!``!5U````0$``%7P```!`0``5A````$!``!6'````0$``%8L```!`0``
+M5L@```$!``!6V````0$``%;<```!`0``5N0```$!``!6[````0$``%;T```!
+M`0``5O@```$!``!7`````0$``%<0```!`0``5R````$!``!7+````0$``%<P
+M```!`0``5T````$!``!75````0$``%=D```!`0``5W0```$!``!7?````0$`
+M`%?P```!`0``6!0```$!``!8+````0$``%@P```$`@``6)@```$!``!8O```
+M`0$``%C4```!`0``6-@```0"``!8\````0$``%D4```!`0``61P```$!``!9
+M-````0$``%EL``#0`0``67P```$!``!9D```Z0$``%H<``$_`0``6B0```$!
+M``!:0``!E`$``%I<``&4`0``6H@``9$!``!:H``!D0$``%JL```!`0``6K@`
+M`90!``!:Q```+P$``%K@``&4`0``6O@``9$!``!;"``!+@$``%L0```!`0``
+M6R@```$!``!;.``!+@$``%M````!`0``6V```2X!``!;:````0$``%N,```!
+M`0``6Z@``2X!``!;L````0$``%O,```!`0``6^````$!``!;\``!+@$``%OX
+M```!`0``7OP```$!``!?!````0$``%\P``$N`0``7S@```$!``!?9````0$`
+M`%^````!`0``7Y0``9$!``!?I````0$``%^\``&1`0``7\@``(4!``!?W```
+M`@(``%_@``!]`@``7_```(4!``!@H````0$``&$,``&1`0``82```9$!``!A
+M-``!D0$``&%(``&1`0``85P``9$!``!A@````0$``&&P```!`0``8=@``6<!
+M``!AX```,0(``&'D``$L`@``8@0``9$!``!B%``!E`$``&(L``&1`0``8D0`
+M`9$!``!B;````0$``&)X``&4`0``8I```9$!``!BI``!D0$``&*X``&1`0``
+M8M````$!``!BW``!E`$``&+P``&1`0``8P0``9$!``!C%``!E`$``&-,``&1
+M`0``8ZP``9$!``!CR``!E`$``&/T``&4`0``9,@``9$!``!DZ````0$``&5$
+M``&1`0``960``9$!``!ED````0$``&6@``&4`0``9>P``9$!``!E_``!D0$`
+M`&8,``&1`0``9AP``9$!``!F+``!D0$``&8\``&1`0``9DP``9$!``!F8``!
+MD0$``&:<```!`0``9O```9$!``!G"``!D0$``&=<```!`0``9V@```$!``!G
+M=````0$``&>,```!`0``:%P``9$!``!H;``!D0$``&A\``&1`0``:(P``9$!
+M``!HG``!D0$``&BP``&1`0``:,```'$!``!HZ```Z0$``&D(``#I`0``:2P`
+M`.D!``!I-````@(``&E<``&4`0``:7```$H!``!IA``!E`$``&FH```!`0``
+M:@P``2@!``!J)```=@$``&I(``&4`0``:FP``9$!``!JE``!E`$``&JP``&1
+M`0``:MP``90!``!J_``!D0$``&LL``&4`0``:V```90!``!KG``!D0$``&NT
+M``%3`0``:]@``90!``!KY````0$``&P(``&1`0``;"0``90!``!L5``!E`$`
+M`&Q<```!`0``;&@```$!``!LA``!D0$``&S,``#I`0``;1@``9$!``!M7``!
+MD0$``&UD```!`0``;70``90!``!M?````0$``&V,``&4`0``;:```9$!``!M
+MP``!E`$``&W4``&4`0``;>@``90!``!N*``!E`$``&Y(``&4`0``;EP``9$!
+M``!N?``!E`$``&ZL``&4`0``;L```90!``!N\``!E`$``&\H``&4`0``;T0`
+M`90!``!O8``!E`$``&]\``&4`0``;Y@``90!``!OR````0$``&_4```E`0``
+M;]P```$!``!P```!7P$``'`4``&1`0``<$0``90!``!P5```)0$``'!\```E
+M`0``<(0```$!``!PK``!E`$``'#```%?`0``<.```9$!``!Q$``!E`$``'$@
+M```E`0``<5@```$!``!Q9``!E`$``'%X``&1`0``<8P```$!``!QF``!E`$`
+M`'&L``&1`0``<>P``"4!``!Q]````0$``'(<``&4`0``<C```5\!``!R4``!
+MD0$``'*```&4`0``<I@``"4!``!RS````0$``'+@``$9`0``<P````$!``!S
+M$````0$``',D``&1`0``<SP``!L!``!S9``!.P$``'.(``&4`0``<YP``9$!
+M``!SM``!E`$``'/(``&1`0``<^0```$!``!S\``!E`$``'0$``&1`0``=`P`
+M`3D!``!T)``!E`$``'0L```!`0``=#0``3D!``!T0``!E`$``'10``&1`0``
+M=%@```$!``!T7````0$``'1D```!`0``='P``90!``!TD``!D0$``'2X``&4
+M`0``=,P``9$!``!TY``!E`$``'3X``&1`0``=2````$!``!U)````0$``'4L
+M```!`0``=3````$!``!U-````0$``'4\```!`0``=4````$!``!U1````0$`
+M`'5(```!`0``=4P```$!``!U@``!E`$``'6@```!`0``=:P```$!``!UL```
+M`0$``'6X```!`0``=<@``2T!``!UU```]`(``'78```1`@``=>P``90!``!V
+M"``!D0$``'8D``&1`0``=D0``9$!``!V7``!E`$``'9P``$Y`0``=H0```$!
+M``!VH``!E`$``':T``&1`0``=M0``90!``!VZ``!D0$``'<4``&1`0``=R@`
+M`9$!``!W5````0$``'=@``&4`0``=WP```$!``!WB``!E`$``'>@``&1`0``
+M=]````$!``!WW``!E`$``'?X```!`0``>`0``90!``!X'``!D0$``'@\``&4
+M`0``>&@``9$!``!XW````0$``'ET```!`0``>8````$!``!YB``!E`$``'F0
+M```!`0``>?P``90!``!Z7````0$``'IH```!`0``>GP```$!``!ZB````0$`
+M`'J8```!`0``>W0```$!``![?``!``$``'N(```!`0``>Y0```$!``![F```
+M`0(``'N<```!`@``>Z````$"``![I````0(``'NH```!`@``>ZP```$"``![
+ML````0(``'NT```!`@``>[@```$"``![P````0$``'O0``&4`0``>^```3\!
+M``![Z````0$``'PP``&1`0``?%P``9$!``!\:````0$``'QT```!`0``?'@`
+M``$"``!\?````0(``'R````!`@``?(0```$"``!\B````0(``'R,```!`@``
+M?)````$"``!\E````0(``'R8```!`@``?*@```$!``!\N``!D0$``'S0```!
+M`0``?.```9$!``!\]``!D0$``'T$``&4`0``?1@``9$!``!]9``!D0$``'V0
+M``&1`0``?:```9$!``!]L``!D0$``'W```&1`0``?<P``90!``!]W``!D0$`
+M`'WL``&1`0``?@@``90!``!^&``!D0$``'XH``&1`0``?C@``9$!``!^2``!
+MD0$``'Y8``&1`0``?F@``9$!``!^?``!D0$``'Z,``&1`0``?J@``9$!``!^
+MO``!D0$``'[(``"X`0``?MP``9$!``!^\``!D0$``'\$``&1`0``?Q@``9$!
+M``!_+``!D0$``']```&1`0``?U0``9$!``!_:``!D0$``']\``&1`0``?Y``
+M`9$!``!_I``!D0$``'^X``&1`0``?\P``9$!``!_Z````0$``'_T```!`0``
+M@`0``9$!``"`$````0$``(`<``&)`0``@"0```$!``"`-``!E`$``(!8``&1
+M`0``@)```9$!``"`H``!E`$``(#,``&1`0``@-P``90!``"!```!D0$``($0
+M``&4`0``@3P``9$!``"!3``!E`$``(%L``&1`0``@7@```$!``"!@````0$`
+M`(&,```!`0``@<P``9$!``"!U``!.0$``('D``&4`0``@?@``9$!``""$```
+M2@$``((<``"6`0``@B@```$!``""/````0$``()(``!7`0``@E0```$!``""
+M;```@`$``()\``&4`0``@I```9$!``""J``!@P$``(+````*`0``@M@``1L!
+M``""\``!D0$``(,8```"`@``@SP``90!``"#4````0$``(-4```!`@``@U@`
+M``$"``"#7````0(``(-@```!`@``@V0```$"``"#:````0(``(-L```!`@``
+M@W````$"``"#=````0(``(.,```!`0``@[```9$!``"#S````0$``(/P``&1
+M`0``A`@```$!``"$)````0$``(1$``#[`0``A&````$!``"$<``!.0$``(2$
+M```!`0``A)```3D!``"$N```^P$``(3,```!`0``A.@``9$!``"$_````0$`
+M`(4,``$Y`0``A2````$!``"%-``!.0$``(5$``#[`0``A5P```$!``"%@``!
+M``$``(6<``&4`0``A;```9$!``"%P``!E`$``(78``&1`0``A>```3D!``"%
+M\``!E`$``(8$``&1`0``A@P``3D!``"&&````0$``(8H``$Y`0``AC@``90!
+M``"&3``!D0$``(9<``&4`0``AG```90!``"&A``!E`$``(:<``&1`0``AKP`
+M`9$!``"&V``!D0$``(;@``$Y`0``AO```90!``"'!``!D0$``(<,``$Y`0``
+MAR```9$!``"',``!E`$``(=$``&1`0``ATP``3D!``"'7``!E`$``(=P``&1
+M`0``AX@``$H!``"'G``!D0$``(>P``&1`0``A\0``9$!``"'T```E@$``(?8
+M```!`0``A^0``3D!``"'\```E@$``(@4``&4`0``B"@``9$!``"(/``!D0$`
+M`(B$``&1`0``B(P``3D!``"(L```2@$``(B\```!`0``B/```9$!``")(```
+M`0$``(DP```!`0``B5P```$!``"):````0$``(EX```!`0``B;````$!``")
+MN````0$``(G,```!`0``B?````$!``"*)````0$``(HL```!`0``BCP```$!
+M``"*6````0$``(I<```!`0``BF@```$!``"*E````0$``(K````!`0``BNP`
+M`24!``"+F````0$``(O````!`0``B\P```$!``"+U````0$``(QX```!`0``
+MC)````$!``",J````0$``(S````!`0``C-````$!``"-#````0$``(TH```!
+M`0``C5````$!``"-:````0$``(V0```!`0``C:@```$!``"-T````0$``(WH
+M```!`0``CE0```("``".?```Z0$``(Z0``#I`0``CJ````$!``".N````0$`
+M`([,```!`0``CNP``"\!``"/!````0$``(\@```O`0``CSP```$!``"1#```
+M+P$``)$L```O`0``D4P``"\!``"1A``!D0$``)&8```!`0``D;@``9$!``"1
+MQ````@(``)'(```"`@``D?P``"\!``"2%``!D0$``)(H``&1`0``DE@``90!
+M``"2E``!E`$``)*H``&1`0``DL```$H!``"2U``!.0$``)+<``!2`0``DP@`
+M``$!``"38``!:@$``).8``$8`0``D[P```$!``"3P````0$``)/(```!`0``
+MD\P```$!``"3U````0$``)/8```!`0``D^````$!``"3Z````0$``)0(```!
+M`0``E!P``2,!``"4*````0$``)10```!`0``E&```,`!``"5<````0$``)6$
+M``&1`0``E9P``9$!``"5L``!D0$``)74``&1`0``E?```9$!``"6```!E`$`
+M`)88``&1`0``EC0```$!``"62``!D0$``)9@``&1`0``EG0``9$!``"6G``!
+MD0$``):X``&1`0``EL@``90!``"6X``!D0$``);\``&1`0``ESP``9$!``"8
+M<````0$``)AX```!`0``F(```90!``"8N````0$``)B\```!`@``F,````$"
+M``"8Q````0(``)C(```!`@``F-````$!``"8V``!D0$``)D```"C`0``F1``
+M`5,!``"9(``!E`$``)DP```!`0``F3P```$!``"92``!4P$``)E@``&1`0``
+MF6P``5,!``"9I````0$``)FH```!`@``F:P```$"``"9L````0(``)FT```!
+M`@``F<````$!``"9S``!D0$``)G<```!`0``F>@``9$!``":(````0$``)HH
+M```!`0``FC```90!``":<````0$``)IT```!`0``FGP```$!``":@````0$`
+M`)J,``&1`0``FJ0``90!``":K````0$``)JT``$Y`0``FL````$!``":T``!
+MD0$``)KP``!*`0``FXP```$!``";^````0$``)P4```!`0``G1````$!``"=
+M9````0$``)UL```!`0``G<@```$!``">K````0$``)]X``&1`0``GY```9$!
+M``"?G````0$``)^H``&4`0``G\```"\!``"?^```T`$``*`(```!`0``H!P`
+M`.D!``"@I``!F@$``*"P```!`0``H,@```$!``"@V``!D0$``*#L``&1`0``
+MH/0``3D!``"A!``!E`$``*$H```!`0``H4```90!``"A3````0$``*%8```!
+M`0``H7P``9$!``"AA``!.0$``*&0```!`0``H:0```$!``"AM``!3`$``*&\
+M```!`0``H<P```$!``"A[``!E`$``*(````!`0``HA```4P!``"B&````0$`
+M`*)(``%,`0``HE````$!``"B9````0$``*)X```!`0``HL@```$!``"C-```
+M`0$``*-$``%\`0``HTP```$!``"C6````0$``*-L```!`0``HX```9$!``"C
+MB``!.0$``*.8```!`0``HZP``9$!``"CM``!.0$``*/$```!`0``H\P```$!
+M``"C[``!3`$``*/T```!`0``I"````$!``"D*``!A`$``*10``%,`0``I%@`
+M``$!``"D@````0$``*2<```!`0``I+0``6D!``"DR````@(``*3,```"`@``
+MI-```-4"``"D[``!(`$``*3T``"%`0``I4P``90!``"E:``!D0$``*5T``&4
+M`0``I7P```$!``"EB````0$``*6H``&1`0``I;0``90!``"EO````0$``*70
+M```!`0``I>0``9$!``"E\````0$``*7X``$Y`0``I@0```("``"F"````@(`
+M`*8<```!`0``IC0```$!``"F/````0$``*90```!`0``IK@``.`!``"FU```
+M`0$``*>T```!`0``I\@``4P!``"GT````0$``*@L``&1`0``J$```9$!``"H
+M5``!D0$``*AH``&1`0``J'P``9$!``"HI````0$``*BH```!`@``J*P```$"
+M``"HL````0(``*BT```!`@``J+@```$"``"HO````0(``*C````!`@``J,0`
+M``$"``"HR````0(``*C@```!`0``J20``9(!``"I+```,0(``*DP``$L`@``
+MJ5```9$!``"I8``!E`$``*EX``&1`0``J9```9$!``"IN````0$``*G$``&4
+M`0``J=@``9$!``"I[``!D0$``*H```&1`0``JA@```$!``"J)``!E`$``*HX
+M``&1`0``JDP``9$!``"J7``!E`$``*J4``&1`0``JL@``9$!``"JV``!E`$`
+M`*L```&1`0``JQP``90!``"K1``!E`$``*N@```!`0``J\@```$!``"KZ``!
+ME`$``*P```&4`0``K!@``90!``"L,``!E`$``*Q(``&4`0``K)````$!``"L
+MG``!D0$``*RH``&4`0``K,````$!``"M+``!D0$``*U,``&1`0``K7@```$!
+M``"MB``!E`$``*W4``&1`0``K>0``9$!``"M]``!D0$``*X$``&1`0``KA0`
+M`9$!``"N)``!D0$``*XT``&1`0``KD@``9$!``"NA````0$``*[8``&1`0``
+MKO```9$!``"O1````0$``*]0```!`0``KU0```$!``"O7````0$``*]@```!
+M`0``KV@```$!``"O;````0$``*]T```!`0``KX````$!``"OD````0$``*^D
+M```!`0``KZP```$!``"P=``!D0$``+"$``&1`0``L)0``9$!``"PI``!D0$`
+M`+"T``&1`0``L,@``9$!``"PV```S@$``+$```#I`0``L2```.D!``"Q1```
+MZ0$``+%,```"`@``L7@``9$!``"QC``!D0$``+&D``!*`0``L;P``90!``"Q
+MX````0$``+(@```!`0``LH@``.4!``"RE``!E`$``+*D``&1`0``LK```44!
+M``"RQ```-P$``++H``&4`0``LP0``9$!``"S+``!E`$``+-(``&1`0``LW0`
+M`90!``"SE``!D0$``+/$``&4`0``L_0``90!``"T&``!D0$``+0P``$)`0``
+MM%0``90!``"T?``!D0$``+2$```"`@``M*P``.D!``"T^``!D0$``+4P``&1
+M`0``M5```90!``"U9``!E`$``+5X``&4`0``M;@``90!``"UV``!E`$``+7L
+M``&1`0``M@P``90!``"V/``!E`$``+90``&4`0``MGP``90!``"VE````0$`
+M`+;,``&4`0``MN@``90!``"W!``!E`$``+<@``&4`0``MSP``90!``"W;```
+M`0$``+=X```E`0``MX````$!``"WH``!7P$``+>T``&1`0``M^0``90!``"W
+M]```)0$``+@<```E`0``N"0```$!``"X3``!E`$``+A@``%?`0``N(```9$!
+M``"XL``!E`$``+C````E`0``N/@```$!``"Y!``!E`$``+D8``&1`0``N2P`
+M``$!``"Y.``!E`$``+E,``&1`0``N8P``"4!``"YE````0$``+F\``&4`0``
+MN=```5\!``"Y\``!D0$``+H@``&4`0``NC@``"4!``"Z<``!E`$``+J0``&4
+M`0``NK0``9$!``"Z_```X0$``+L4```!`0``NQP```$!``"[-``!&0$``+M4
+M```!`0``NV@``9$!``"[@```&P$``+NH``$[`0``N\P```$!``"[V``!E`$`
+M`+OL``&1`0``N_0``3D!``"\#``!E`$``+P4```!`0``O!P``3D!``"\*``!
+ME`$``+PX``&1`0``O$````$!``"\1````0$``+Q,```!`0``O&0``90!``"\
+M>``!D0$``+R@``&4`0``O+0``9$!``"\S``!E`$``+S@``&1`0``O00``90!
+M``"]&``!D0$``+TP``&4`0``O40``9$!``"];````0$``+UP```!`0``O7@`
+M``$!``"]?````0$``+V````!`0``O8@```$!``"]C````0$``+V0```!`0``
+MO90```$!``"]F````0$``+W,``&4`0``O>P```$!``"]\````0$``+WX```!
+M`0``O?P```$!``"^!````0$``+X(```!`0``OA````$!``"^&````0$``+X@
+M```!`0``OC```2T!``"^/```O0(``+Y```$+`@``OD0``/`"``"^6``!E`$`
+M`+YT``&1`0``OI```9$!``"^L``!D0$``+[$``!*`0``OO```90!``"_!``!
+MD0$``+\D``&4`0``OS@``9$!``"_9``!D0$``+]X``&1`0``OZ0```$!``"_
+ML``!E`$``+_,```!`0``O]@``90!``"_\``!D0$``,`@```!`0``P"P``90!
+M``#`2````0$``,!4``&4`0``P&P``9$!``#`C``!E`$``,"L``&1`0``P2``
+M``$!``#!M````0$``,'````!`0``P<@``90!``#!T````0$``,)@```!`0``
+MPFP```$!``#">````0$``,*(```!`0``PW0```$!``##?````0$``,.0```!
+M`0``PYP```$!``##I````0$``,.X```!`0``P\0``0`!``##T````0$``,/@
+M```!`0``P^0```$"``##Z````0(``,/L```!`@``P_````$"``##]````0(`
+M`,/X```!`@``P_P```$"``#$`````0(``,0$```!`@``Q`P```$!``#$&```
+M`0$``,0H``&4`0``Q#P``90!``#$4````0$``,1<``&4`0``Q&0```$!``#$
+M?``!E`$``,2,```!`0``Q,@``90!``#$Z``!E`$``,4```&4`0``Q2```90!
+M``#%-``!E`$``,5$``&:`0``Q4P```$!``#%7````0$``,5@```!`0``Q6@`
+M``$!``#%;````0$``,5\```!`0``Q9````$!``#%G````0$``,7,``&1`0``
+MQ=@```$!``#%Y````0$``,7X```!`0``QC0``"\!``#&1```+P$``,:L``&1
+M`0``QK@```$!``#&Q````0$``,;H``&1`0``QO0```$!``#'%``!D0$``,<@
+M```!`0``QT````$!``#'3````0$``,=<``&1`0``QV@```$!``#'=````0$`
+M`,>$``&4`0``QZ```9$!``#'L``!D0$``,?$``&1`0``Q]0``90!``#'Z``!
+MD0$``,?T```!`0``R`@``9$!``#('``!D0$``,@L```!`0``R#P``9$!``#(
+M0````0$``,A<``&1`0``R&@```$!``#(L``!D0$``,CD``&1`0``R/````$!
+M``#)```!E`$``,D4``&1`0``R2@``9$!``#)/``!D0$``,E0``&1`0``R9P`
+M`9$!``#)R``!D0$``,GD``&1`0``R?0``9$!``#*`````0$``,H0```!`0``
+MRAP``90!``#*+``!D0$``,HX``$D`0``RD````$!``#*3````0$``,I8```!
+M`0``RF@``90!``#*B``!D0$``,J4```!`0``RJ````$!``#*J````0$``,K`
+M```!`0``RLP```$!``#*Y``!D0$``,KX``&1`0``RP@``90!``#+/``!.0$`
+M`,M,``&4`0``RV```9$!``#+>```2@$``,N$```=`0``RXP```$!``#+I```
+M`0$``,NX```!`0``R\P``9$!``#+^``!D0$``,P$```!`0``S!0``1`!``#,
+M(````0$``,PT``&1`0``S$0``9$!``#,5``!D0$``,QD``&4`0``S'@``9$!
+M``#,D``!D0$``,RT``&4`0``S,0``9$!``#,T````0$``,S<``&4`0``S.P`
+M`9$!``#-$```40$``,T@``&4`0``S30``9$!``#-3```G`$``,UD``#7`0``
+MS7P``#@!``#-E``!D0$``,W````$`@``S<0```("``#-R````@(``,W,```"
+M`@``S>@```$!``#."``!6@$``,X<```!`0``SC```3D!``#.7``!6@$``,YP
+M```!`0``SG0```$!``#.?````0$``,Z$```!`0``SH@```$!``#.D````0$`
+M`,Z4```!`0``SIP```$!``#.H````0$``,ZH```!`0``SJP```$!``#.P``!
+MD0$``,[0``&1`0``SN0``9$!``#.[``!.0$``,[P```!`0``SP0``9$!``#/
+M%````0$``,\H``&1`0``SS```3D!``#/0````0$``,]H``&1`0``SW@```$!
+M``#/C``!D0$``,^4``$Y`0``SZ0``9$!``#/L````0$``,_$``$Y`0``S]0`
+M`5H!``#/Z````0$``-`0``$``0``T#````$!``#00``!E`$``-!(```!`0``
+MT%P``90!``#0<``!E`$``-"$``&4`0``T+````$!``#0O``!)0$``-#,``$E
+M`0``T.```90!``#0_``!D0$``-$(```!`0``T1````$!``#1.```'0$``-%`
+M```!`0``T4P``3D!``#16```'0$``-%@```!`0``T8````$!``#1U``!E`$`
+M`-'D``&1`0``T>P``3D!``#2$```2@$``-(<```!`0``TE```9$!``#2>```
+MBP$``-*0```!`0``TJP``"\!``#2R````0$``-+0```!`0``TMP``"\!``#2
+MZ````0$``-+\```O`0``TS```9$!``#34``!D0$``--H```"`@``TX```90!
+M``#3Q``!E`$``-/T``&1`0``U`0``90!``#4&``!D0$``-0\``&4`0``U$0`
+M``$!``#43``!.0$``-18```!`0``U%P```$!``#49````0$``-1T```!`0``
+MU)````$!``#4E````0$``-2<```!`0``U*````$!``#4L````0$``-2T```!
+M`0``U,````$!``#5`````0$``-48``&4`0``U2````$!``#5>````0$``-5\
+M``%S`0``U80```$!``#5E````0$``-6T```!`0``U=P```$!``#5_``!E`$`
+M`-80``&1`0``UAP```("``#6/````0$``-90```!`0``UG@```("``#6L```
+M`0$``-:T```!`0``UKP```$!``#6P````0$``-;(```!`0``UN@```$!``#7
+M`````0$``-<8```!`0``US````$!``#72````0$``-=@```!`0``UX````$!
+M``#8*````0$``-AD```!`0``V+````$!``#8W```+P$``-D$```O`0``V2P`
+M`"\!``#94```+P$``-EX```O`0``V<0``9$!``#9T````0$``-GL```$`@``
+MV@P```$!``#:$````0$``-H8```!`0``VAP```$!``#:*````0$``-HL```!
+M`0``VC0```$!``#:W````0$``-K@```!`0``VN@```$!``#:[````0$``-KT
+M```!`0``VOP```$!``#;)``!D0$``-LX``&1`0``VV@```$!``#;;````0$`
+M`-MT```!`0``VW@```$!``#;@````0$``-N0``&4`0``V[P``9$!``#;P```
+M`0$``-O(```!`0``V]````$!``#;Y````0$``-OT``&4`0``W`@```$!``#<
+M&``!E`$``-Q(``&1`0``W&```.$!``#<B``!D0$``-R8``&4`0``W,@``9$!
+M``#<V``!E`$``-T$``&1`0``W10``90!``#=4``!D0$``-V$``&1`0``W90`
+M`90!``#=N``!D0$``-W(``&4`0``W?0``9$!``#>%````0$``-XP```!`0``
+MWD````$!``#>B``!E`$``-ZH``&1`0``WMP``9$!``#?$````0$``-\4```!
+M`0``WQP```$!``#?(````0$``-\H```!`0``WV@```$!``#?J````0$``-_H
+M```!`0``X`````$!``#@$```%`$``.`H```!`0``X$@```$!``#@7````0$`
+M`.!H```!`0``X(````$!``#@Q``!(P$``.#0``$C`0``X0P```$!``#A-```
+M`0$``.%0```!`0``X7````$!``#AD````0$``.'(```!`0``X?P```$!``#B
+M$````0$``.)(```!`0``XHP```$!``#BT````0$``.+L```!`0``XQ````$!
+M``#C1````0$``..,```!`0``X]P```$!``#C[````0$``.08```!`0``Y&P`
+M`9$!``#DB````0$``.2,```%`@``Y)````4"``#DE```!0(``.4P``$6`0``
+MY4````$!``#E7````0$``.5\```!`0``Y:0```$!``#EL````0$``.78```!
+M`0``Y>P```$!``#E_````0$``.8(```!`0``YAP```$!``#F0````0$``.9\
+M```!`0``YJ0```$!``#FL````0$``.<````!`0``YQ0```$!``#G1````0$`
+M`.=8```!`0``YV0```$!``#G<````0$``.=\```!`0``YX````$!``#GE```
+M`0$``.>8```!`@``YYP```$"``#GH````0(``.>D```!`@``YZ@```$"``#G
+MK````0(``.>P```!`@``Y[0```$"``#GU````0$``.?T```!`0``Z!0```$!
+M``#H:````0$``.B8```!`0``Z+````$!``#I&````0$``.ET```!`0``Z>P`
+M`9$!``#J/``!D0$``.I(``!N`0``ZF````4"``#J9````@(``.J8```!`0``
+MZL@```$!``#J[````0$``.L(```!`0``ZR````$!``#K.````0$``.M<```!
+M`0``ZWP```$!``#KD````0$``.NL```!`0``Z]0```$!``#L$````0$``.PD
+M```!`0``[#@```$!``#L3````0$``.R````!`0``[)P```$!``#M#````0$`
+M`.TH``$E`0``[30```$!``#M2````0$``.U,```!`0``[50```$!``#M:```
+M`0$``.UP```!`0``[9@``24!``#MI````0$``.VP```!`0``[B@```$!``#N
+M5````0$``.Z8```!`0``[MP```$!``#O&````0$``.\L```!`0``[SP```$!
+M``#O7````0$``.^D```"`@``[\````$!``#OW````0$``/!T``&1`0``\,0`
+M``$!``#PU``!E`$``/#<```!`0``\/0```$!``#P_````0$``/$(```!`0``
+M\1````$!``#Q'````0$``/$D```!`0``\3````$!``#Q7````0$``/&$```!
+M`0``\:@```$!``#QL````0$``/'0```!`0``\=P```$!``#R*````0$``/(P
+M```!`0``\H````$!``#RG````0$``/+D```!`0``\O@```$!``#S!````@(`
+M`/,(```"`@``\XP``90!``#SH````0$``/.D```!`@``\Z@```$"``#SK```
+M`0(``/.P```!`@``\[0```$"``#SN````0(``/.\```!`@``\\````$"``#S
+MQ````0(``//<```!`0``]````9$!``#T*``!D0$``/1````!`0``]%P``/8!
+M``#T;``!"0$``/1X``&4`0``])````$!``#TG````0$``/2H``$)`0``],P`
+M`9$!``#TV``!"0$``/4,``%J`0``]40``1@!``#U:````0$``/5L```!`0``
+M]70```$!``#U>````0$``/6````!`0``]80```$!``#UC````0$``/64```!
+M`0``]<P```$!``#UX``!(P$``/7L```!`0``]B````$!``#V,```8P$``/9\
+M``&1`0``]K0``9$!``#VP``!E`$``/;L``&1`0``]ZP```$!``#X%````0$`
+M`/@<```!`0``^#````$!``#X0````0$``/A0```!`0``^(P``9$!``#XM``!
+MD0$``/C$``&1`0``^-P``9$!``#XZ````0$``/D$``&1`0``^10``90!``#Y
+M.``!D0$``/E$```!`0``^5P``9$!``#Y:````0$``/F$``&1`0``^9````$!
+M``#YH``!E`$``/FP``&1`0``^;P```$!``#YT``!E`$``/G@``&1`0``^>P`
+M``$!``#Z```!E`$``/H0``&1`0``^AP```$!``#Z)````0$``/HH```!`0``
+M^CP``90!``#Z3``!D0$``/IH```!`0``^GP``90!``#ZD``!D0$``/K8``&1
+M`0``^O@``9$!``#[!````0$``/L8``&4`0``^R@``9$!``#\.````0$``/Q$
+M``$L`@``_$@``#$"``#\3```P@(``/QD``&4`0``_(```9$!``#\I``!D0$`
+M`/S,``&4`0``_-0```$!``#\X``!E`$``/T8``&1`0``_3```7D!``#].```
+M`0$``/U```$Y`0``_4P```$!``#]7``!D0$``/X4```!`0``_PP```$!``#_
+M8````0$``/]H```!`0``_\0```$!``$`K````0$``0'D``&1`0`!`@```9$!
+M``$"&``!D0$``0(L``&1`0`!`D```9$!``$"7``!D0$``0)X``&1`0`!`HP`
+M`9$!``$"I``!D0$``0*X``&1`0`!`NP``9$!``$#!``!D0$``0,0```!`0`!
+M`QP``90!``$#-```+P$``000```!`0`!!!P``+0!``$$)````@(``00H```"
+M`@`!!"P```("``$$,````@(``01T``#I`0`!!4@``.D!``$%6````@(``05@
+M```"`@`!!8````$!``$%D````0$``06T```!`0`!!;@```("``$%[```T`$`
+M`088```F`0`!!BP``84!``$&-````0$``09$``&4`0`!!G0```$!``$&?```
+M`0$``0:(``&/`0`!!I````$!``$&F````0$``0:P``&4`0`!!L````$!``$&
+MR````0$``0;8```!`0`!!N````$!``$&Z```&@$``0;T```!`0`!!P````$!
+M``$'$``!E`$``0<D``&1`0`!!S0``9$!``$'0```0P$``0=4```!`0`!!U@`
+M``$!``$'8````0$``0=H```!`0`!!W````$!``$'=````0$``0=\```!`0`!
+M!X0```$!``$'E````0$``0>@```!`0`!![P```$!``$'V````0$``0?D```!
+M`0`!!^P```$!``$']````0$``0@$```!`0`!"!P```$!``$()````0$``0@L
+M```!`0`!"#P```$!``$(5````0$``0A@```!`0`!"'```8X!``$(>````0$`
+M`0B0```!`0`!"+```90!``$(P````0$``0C(```!`0`!"-0```$!``$(W```
+M`0$``0CL```!`0`!"/0```$!``$)!``!C@$``0D,```!`0`!"2P``8X!``$)
+M-````0$``0E$```!`0`!"60``8X!``$)>````0$``0F(```!`0`!"9@``8X!
+M``$)H````0$``0FT```!`0`!"<@```$!``$*&````0$``0J,```!`0`!"IP`
+M`7P!``$*I````0$``0K````!`0`!"LP```$!``$*U````0$``0K<```!`0`!
+M"NP```$!``$+0````0$``0M4```!`0`!"V@``9$!``$+<``!.0$``0M\``!#
+M`0`!"Y```9$!``$+F``!.0$``0NH```!`0`!"[````$!``$+P``!C@$``0O(
+M```!`0`!"^@``3,!``$+\````0$``0O\```!`0`!#`0```$!``$,#````0$`
+M`0P<```!`0`!#"@``,<!``$,+````0$``0P\```!`0`!#$@``*<!``$,3```
+M`0$``0QD```!`0`!#'```8P!``$,=````0$``0R```%Q`0`!#(@```$!``$,
+MH``!'0$``0S(``&.`0`!#-````$!``$,^````0$``0T4```!`0`!#1P```$!
+M``$-.```@@$``0U0```"`@`!#50```("``$-:```<P$``0V,``!$`0`!#9P`
+M`84!``$-K``!(`$``0VT``"%`0`!#@P``90!``$.*``!D0$``0XT``&4`0`!
+M#CP```$!``$.2````0$``0YH``&1`0`!#G0``90!``$.?````0$``0Z0```!
+M`0`!#J0``9$!``$.L````0$``0ZX``$Y`0`!#L0```("``$.R````@(``0[<
+M```!`0`!#O0```$!``$._````0$``0\0```!`0`!#R0```$!``$/B````0$`
+M`0_,```!`0`!#]@```$!``$/Z````0$``1`8```!`0`!$#0```$!``$05```
+M`0$``1"$```!`0`!$-0```$!``$0\````0$``1$X```!`0`!$4@```$!``$1
+M4````0$``1%8```!`0`!$6````$!``$1<````0$``1%\```!`0`!$<@```$!
+M``$1U````0$``1'8```!`0`!$>@```$!``$2?````0$``1*(```!`0`!$I@`
+M``$!``$2X````0$``1,X```!`0`!$TP```$!``$3H````0$``1.P```!`0`!
+M$[P```$!``$44````0$``11P```!`0`!%+0```$!``$4Q````0$``130```!
+M`0`!%0P``*T!``$5+``!D`(``14P```!`@`!%5@``9$!``$5;``!D0$``16`
+M``&1`0`!%90``9$!``$5H````0$``16L``"M`0`!%=P``9$!``$5\``!D0$`
+M`188```!`0`!%AP```$"``$6(````0(``18D```!`@`!%B@```$"``$6+```
+M`0(``18P```!`@`!%C0```$"``$6.````0(``18\```!`@`!%E0```$!``$6
+MF```DP$``1:@```Q`@`!%J0``2P"``$6Q``!D0$``1;4``&4`0`!%NP``9$!
+M``$7!``!D0$``1<L```!`0`!%S@``90!``$73``!D0$``1=@``&1`0`!%W0`
+M`9$!``$7C````0$``1>8``&4`0`!%ZP``9$!``$7P``!D0$``1?0``&4`0`!
+M&`@``9$!``$8/``!D0$``1B0``&1`0`!&+0``9$!``$8T``!D0$``1CX``&1
+M`0`!&0P``9$!``$9)```2@$``1D\``&4`0`!&6@``90!``$9A``!D0$``1FL
+M``&4`0`!&<@``9$!``$9]``!E`$``1H4``&1`0`!&D0``90!``$:>``!E`$`
+M`1JP``&1`0`!&L@``-@!``$:Y``!E`$``1L8``&4`0`!&R````$!``$;+``!
+ME`$``1M8``&4`0`!&Z@```$!``$;P``!E`$``1OT``&4`0`!'"````$!``$<
+M4````0$``1QP``&4`0`!'(@``90!``$<H``!E`$``1RX``&4`0`!'-```90!
+M``$=&````0$``1TD``&1`0`!'3```90!``$=3````0$``1VL```!`0`!'>0`
+M`9$!``$=\``!E`$``1X$``&1`0`!'B0``9$!``$>9````0$``1YT``&4`0`!
+M'M```90!``$>Z``!D0$``1[X``&1`0`!'P@``9$!``$?&``!D0$``1\H``&1
+M`0`!'S@``9$!``$?2``!D0$``1]<``&1`0`!'V0```$!``$?>````0$``1^8
+M``&1`0`!'Z@``9$!``$?N``!D0$``1_,``&1`0`!(!0```$!``$@:``!D0$`
+M`2"```&1`0`!(.@```$!``$@^````0$``2#\```!`@`!(0````$"``$A!```
+M`0(``2$(```!`@`!(0P```$"``$A$````0(``2$<```!`0`!(30```$!``$A
+M4````0$``2%L```!`0`!(7````$!``$A?````0$``2&,```!`0`!(:0```$!
+M``$AL````0$``2)D```!`0`!(G@```$!``$BL``!D0$``2+$``&1`0`!(M0`
+M`9$!``$BY``!D0$``2+T``&1`0`!(P@``9$!``$C&``!*0$``2-T```!`0`!
+M(\P``9$!``$CW``!D0$``2/L``&1`0`!(_P``9$!``$D#``!D0$``20<``&1
+M`0`!)"P``9$!``$D0``!D0$``21@``&1`0`!)'0``9$!``$D>````0$``22@
+M``&1`0`!)+```9$!``$DP``!D0$``230``&1`0`!).```9$!``$D]``!D0$`
+M`24$``$I`0`!)3```.D!``$E4```Z0$``25\``#I`0`!):```.D!``$E[``!
+MD0$``288``&1`0`!)C@```$!``$F?````0$``2:\```!`0`!)M@```$!``$G
+M/``!E`$``2=,``&1`0`!)YP``90!``$GQ``!D0$``2?,```"`@`!)_0``.D!
+M``$H0``!D0$``2AX``&1`0`!*)@``90!``$HK``!E`$``2C```&4`0`!*0``
+M`90!``$I(``!E`$``2DX``&1`0`!*4P``9$!``$IE````0$``2FL```!`0`!
+M*<0```$!``$IU``!E`$``2G<```!`0`!*?````$!``$J!``!D0$``2HD``&4
+M`0`!*E0``90!``$J:``!E`$``2J4``&4`0`!*JP```$!``$JY``!E`$``2L`
+M``&4`0`!*QP``90!``$K.``!E`$``2M4``&4`0`!*X0``90!``$KI``!E`$`
+M`2O(``&1`0`!+!````X!``$L/````0$``2Q(```E`0`!+%````$!``$L=``!
+M7P$``2R(``&1`0`!++@``90!``$LR```)0$``2SP```E`0`!+/@```$!``$M
+M(``!E`$``2TT``%?`0`!+50``9$!``$MA``!E`$``2V4```E`0`!+<P```$!
+M``$MV``!E`$``2WL``&1`0`!+@````$!``$N#``!E`$``2X@``&1`0`!+F``
+M`"4!``$N:````0$``2Z0``&4`0`!+J0``5\!``$NQ``!D0$``2[T``&4`0`!
+M+PP``"4!``$O4``!D0$``2]H``&1`0`!+]@``5\!``$OZ````0$``3`0```!
+M`0`!,"@```$!``$P4````0$``3"0``&1`0`!,*0``9$!``$PO``!D0$``3#4
+M```D`0`!,2P``!8!``$Q-````0$``3%(``&1`0`!,70``9$!``$QA``!E`$`
+M`3&<``&1`0`!,;```9$!``$QP``!E`$``3'4``&1`0`!,>0```$!``$Q[```
+M`0$``3'T```!`0`!,?P```$!``$R#````0$``3(@``&1`0`!,C0``9$!``$R
+M2``!D0$``3)<``&1`0`!,FP``90!``$R>````0$``3*,``&1`0`!,J```9$!
+M``$RM``!D0$``3+(``&1`0`!,M@``90!``$R[``!D0$``3,```&4`0`!,Q0`
+M`9$!``$S)``!E`$``3,X``&1`0`!,TP``9$!``$S8``!D0$``3-T``&1`0`!
+M,X@``9$!``$SG``!D0$``3/(``&1`0`!,]@``90!``$T"````0$``30<```6
+M`0`!-#0``90!``$T2``!D0$``318``&4`0`!-&P``9$!``$T@``!D0$``320
+M``&4`0`!-,```9$!``$TU``!D0$``33H``&1`0`!-/P``9$!``$U$``!D0$`
+M`34D``&1`0`!-5```9$!``$U=````0$``36(```!`0`!-9P```("``$UR```
+M`0$``37,```!`@`!-=````$"``$UU````0(``378```!`@`!-=P```$"``$U
+MX````0(``37D```!`@`!->@```$"``$U[````0(``37P```!`@`!-?0```$"
+M``$U^````0(``37\```!`@`!-@````$"``$V!````0(``38(```!`@`!-@P`
+M``$"``$V$````0(``384```!`@`!-A@```$"``$V'````0(``38@```!`@`!
+M-B0```$"``$V*````0(``38L```!`@`!-C````$"``$V-````0(``38X```!
+M`@`!-CP```$"``$V1````0$``39(```!`0`!-E````$!``$V6````0$``39@
+M```!`0`!-F0```$!``$V<````0$``39X```!`0`!-I````$!``$VF````0$`
+M`3:P```!`0`!-K0```$!``$VW````0$``3;@```!`0`!-O````$!``$W````
+M`0$``3<(```!`0`!-Q0``90!``$W/````0$``3=0```!`0`!-U0```$!``$W
+M:````0$``3=P```!`0`!-W0```$!``$WF````0$``3>L```!`0`!-[````$!
+M``$WN````0$``3?````!`0`!-^````$!``$W^````0$``3?\```!`0`!."``
+M``$!``$X-````0$``3A````!`0`!.$0```$"``$X2````0(``3A,```!`@`!
+M.%````$"``$X5````0(``3A8```!`@`!.%P```$"``$X<````0$``3AT``")
+M`0`!.'P```$!``$XE````0$``3B8```!`@`!.)P```$"``$XH````0(``3BD
+M```!`@`!.*@```$"``$XL````0$``3BX```!`0`!.,````$!``$XR````0$`
+M`3C0```!`0`!..0``1D!``$Y&````0$``3D<```!`@`!.2````$"``$Y)```
+M`0(``3DH```!`@`!.2P```$"``$Y,````0(``3DT```!`@`!.3@```$"``$Y
+M/````0(``3E````!`@`!.40```$"``$Y2````0(``3E,```!`@`!.5````$"
+M``$Y5````0(``3E8```!`@`!.5P```$"``$Y8````0(``3ED```!`@`!.6@`
+M``$"``$Y;````0(``3EP```!`@`!.70```$"``$Y>````0(``3E\```!`@`!
+M.8````$"``$YA````0(``3F(```!`@`!.;0```$!``$Z"``!D0$``3H@``&4
+M`0`!.CP```$!``$Z5````0$``3IL```!`0`!.I0```$!``$ZM````0$``3K,
+M```!`0`!.O@```$!``$[&```H`$``3LH```!`0`!.U````$!``$[9```&P$`
+M`3ML```"`@`!.Y```3L!``$[M````0$``3O```&4`0`!.]0``9$!``$[W``!
+M.0$``3OT``&4`0`!._P```$!``$\!``!.0$``3P0``&4`0`!/"```9$!``$\
+M*````0$``3PL```!`0`!/#0```$!``$\3``!E`$``3Q@``&1`0`!/(@``90!
+M``$\G``!D0$``3RT``&4`0`!/,P``9$!``$\\``!E`$``3T$``&1`0`!/1P`
+M`90!``$]-``!D0$``3U<```!`0`!/6````$!``$]:````0$``3UL```!`0`!
+M/7````$!``$]>````0$``3U\```!`0`!/8````$!``$]A````0$``3V(```!
+M`0`!/;P``90!``$]W````0$``3W@```!`0`!/>@```$!``$][````0$``3WT
+M```!`0`!/?@```$!``$^`````0$``3X$```!`0`!/@P```$!``$^$````0$`
+M`3X8```!`0`!/AP```$!``$^)````0$``3XL```!`0`!/C````$!``$^2```
+M`0$``3Y4```!`0`!/FP```$!``$^<````0$``3YX```!`0`!/H````$!``$^
+MB````0$``3Z0```!`0`!/I@```$!``$^H````0$``3ZH```!`0`!/K@``2T!
+M``$^Q```+`(``3[(``"K`@`!/LP``4\"``$^T```T@(``3[4```5`@`!/M@`
+M`5P"``$^W```V0(``3[@``#D`@`!/O0``90!``$_$``!D0$``3\L``&1`0`!
+M/TP``9$!``$_8```2@$``3^,``&4`0`!/Z```9$!``$_J```,`$``3^T``#=
+M`0`!/]0``90!``$_Z``!D0$``3_P``"$`0`!0!P``9$!``%`,``!D0$``4!<
+M```!`0`!0&@``90!``%`A````0$``4"0``&4`0`!0*@``9$!``%`V````0$`
+M`4#D``&4`0`!00````$!``%!#``!E`$``4$D``&1`0`!04@``90!``%!7``!
+ME`$``4&H``&1`0`!0=0``9$!``%!W````0$``4'H``&4`0`!0?````$!``%!
+M_``!E`$``4(,``&1`0`!0E0```$!``%"[````0$``4+X```!`0`!0P```90!
+M``%#"````0$``408```!`0`!1"@```$!``%$-````0$``41P```!`0`!1'P`
+M`)$!``%$@````0$``424```!`0`!1*````$!``%$Z````0$``43P```!`0`!
+M100```$!``%%$````0$``448```!`0`!12P```$!``%%/``!A0$``450``$`
+M`0`!15P```$!``%%;````0$``45P```!`@`!170```$"``%%>````0(``45\
+M```!`@`!18````$"``%%A````0(``46(```!`@`!18P```$"``%%D````0(`
+M`46D```!`0`!1;```90!``%%P```RP$``47,``#=`0`!1=P```$!``%%Y```
+M`0$``47L```!`0`!1?0```$!``%&!````0$``480```!`0`!1B0```$!``%&
+M-````0$``49,```!`0`!1E@```L!``%&8````0$``49P``&4`0`!1I```90!
+M``%&J``!E`$``4;,``&4`0`!1N```90!``%&\```7@$``4;X``!,`0`!1P0`
+M`8\!``%'#````0$``4<<```!`0`!1R````$!``%'*````0$``4<L```!`0`!
+M1S0```$!``%'.````0$``4=````!`0`!1T0```$!``%'3````0$``4=0```!
+M`0`!1U@```$!``%'8````0$``4=H```!`0`!1VP```$!``%'>````0$``4>(
+M```!`0`!1YP```$!``%'L````0$``4?$```!`0`!1\P```$!``%'W``!D0$`
+M`4@```&1`0`!2!```3D!``%('````0$``4@\```!`0`!2%@```$!``%(:``!
+MD0$``4AX``$Y`0`!2(0```$!``%(L````0$``4B\```!`0`!2,@``10!``%(
+MW````0$``4CT``&1`0`!20@```$!``%)0````0$``4F$```!`0`!2;P``9$!
+M``%)S``!E`$``4G@``&1`0`!2?```90!``%*"``!D0$``4H<``&1`0`!2C``
+M``$!``%*1``!D0$``4I8``&1`0`!2F0```$!``%*;````0$``4IT```!`0`!
+M2H0```$!``%*N``!E`$``4K````!`0`!2M0``9$!``%*Y```60$``4KL```!
+M`0`!2O@```$!``%+"``!1`$``4LP```!`0`!2SP```$!``%+2````0$``4M0
+M```!`0`!2U@```$!``%+:````0$``4N$```!`0`!2YP``)<!``%+J``!"`$`
+M`4NT``%'`0`!2[P```$!``%+U``!D0$``4P<``&1`0`!3&0``9$!``%,<```
+M)`$``4R\``&1`0`!3.@``9$!``%,^``!E`$``4T0``&1`0`!320``9$!``%-
+M.``!D0$``4U,``&1`0`!39@``9$!``%-Q``!D0$``4W@``&1`0`!3?```9$!
+M``%-_```L0$``4X$```!`0`!3@P```$!``%.)```,P$``4XP``!=`0`!3D@`
+M``$!``%.8````0$``4YL```!`0`!3I@``90!``%.M``!D0$``4[$``&4`0`!
+M3P0``9$!``%/(````0$``4\\```!`0`!3T@``3D!``%/6``!E`$``4]P``&1
+M`0`!3W@```$!``%/@``!.0$``4^0```!`0`!3Z```90!``%/J````0$``4^\
+M``&1`0`!3\P``90!``%/X``!D0$``4_P```!`0`!4`0```$!``%0%``!E`$`
+M`5`H``&1`0`!4#@``90!``%03``!D0$``5!8```!`0`!4'```$X!``%0C``!
+MD0$``5"8```!`0`!4+@```$!``%0R```C`$``5#8```!`0`!41@``9$!``%1
+M)``!E`$``5$T``&1`0`!44P``+D!``%19```2@$``5%P``";`0`!48```90!
+M``%1E``!D0$``5&@```!`0`!4:0```$!``%1M````0$``5',``&1`0`!4>0`
+M`9$!``%1^``!D0$``5(H``$6`0`!4V0``9$!``%3A``!D0$``5.<``!"`0`!
+M4[0``"T!``%3S```1@$``5/D``&1`0`!4_@```$!``%4:```20$``51X``%=
+M`0`!5)P```("``%4H````@(``53(```!`0`!5-0``90!``%4\``!D0$``54`
+M```!`0`!51```90!``%5&````0$``54H``&4`0`!53P``9$!``%5D``!``$`
+M`56H```!`0`!5;@``9P!``%5Q````0$``574```!`0`!5?0``9$!``%6"``!
+ME`$``580```!`0`!5A@``3D!``%6)````0$``58H```!`0`!5C````$!``%6
+M1```L0$``59<``&4`0`!5I```3D!``%6H```60$``5:\``&1`0`!5L@```$!
+M``%6U````0$``5;<```!`0`!5N0```$!``%6]````0$``5<0```!`0`!5R@`
+M`)<!``%7-``!"`$``5=$``&4`0`!5U@``9$!``%7O```20$``5?,``%=`0`!
+M5_P``90!``%8#````0$``5@0```!`@`!6!0```$"``%8&````0(``5@<```!
+M`@`!6"````$"``%8)````0(``5@H```!`@`!6"P```$"``%8,````0(``5A(
+M``&1`0`!6%0``90!``%87````0$``5AT``&1`0`!6(```90!``%8D``!D0$`
+M`5BH``&1`0`!6,````$!``%8X``!A0$``5CT```!`0`!610```$!``%9+``!
+MA0$``5E````!`0`!65````$!``%97````0$``5ED```!`0`!66P```$!``%9
+M?````0$``5F,```!`0`!69P```$!``%9H````0$``5FX```!`0`!6<@```$!
+M``%9V````0$``5GD```!`0`!6>P```$!``%9_````0$``5H8```!`0`!6B@`
+M``$!``%:-````0$``5H\```!`0`!6D@```$!``%:5````0$``5IX```!`0`!
+M6H````$!``%:C````0$``5J4```!`0`!6J````$!``%:T``!E`$``5K@```!
+M`0`!6NP```$!``%;```!D0$``5L0``&1`0`!6Q@```$!``%;+``!D0$``5LT
+M``$Y`0`!6S@```$!``%;0````0$``5M4``&1`0`!6UP``3D!``%;<``!D0$`
+M`5N```&1`0`!6[0``0`!``%;\````0$``5P```&4`0`!7`@```$!``%<)``!
+ME`$``5PT``&4`0`!7$0``90!``%<5````0$``5QD``&4`0`!7'@``9$!``%<
+MA````0$``5RP```!`0`!7,@``24!``%<V````0$``5SL``!K`0`!7/P```$!
+M``%=%``!E`$``5TT``&1`0`!740``90!``%=8``!D0$``5UP``&4`0`!780`
+M`9$!``%=J````0$``5V\```!`0`!7=````$!``%=W````0$``5WL``&4`0`!
+M7@```9$!``%>$``!E`$``5XD``&1`0`!7C@``,L!``%>1````0$``5Y4``&4
+M`0`!7F@``9$!``%>>````0$``5Z0```!`0`!7I@```$!``%>J````0$``5ZP
+M```!`0`!7K@```$!``%>P````0$``5[0```!`0`!7M@```$!``%>W````0$`
+M`5\T```!`0`!7SP```$!``%?3````0$``5]<``&4`0`!7VP``9$!``%?=``!
+M.0$``5^8``!*`0`!7Z0```$!``%?V``!D0$``5_H``&%`0`!7_@``90!``%@
+M&``!E`$``6!$```!`0`!8$@```$!``%@4````0$``6!4```!`0`!8&0```$!
+M``%@:````0$``6!T```!`0`!8+@``90!``%@Q````0$``6#,``!H`0`!8.0`
+M``$!``%@[````0$``6#X```!`0`!840``9$!``%A5``!D0$``6%@``&4`0`!
+M87```9$!``%AC``!D0$``6&<``&1`0`!8;@``9$!``%AT``!D0$``6'@```!
+M`0`!8A@```$!``%B=````0$``6*````O`0`!8JP```$!``%BL````0$``6*X
+M```!`0`!8KP```$!``%BR````0$``6+,```!`0`!8M0```$!``%C?````0$`
+M`6.````!`0`!8X@```$!``%CC````0$``6.4```!`0`!8YP```$!``%CK```
+M`0$``6.\``&4`0`!8\0```$!``%CU``!E`$``6/H``&1`0`!9`@``9$!``%D
+M'``!D0$``61````!`0`!9$@```$!``%D4````0$``61@```!`0`!9'````$!
+M``%DC````0$``628``"[`0`!9/0```$!``%D^````0$``64````!`0`!900`
+M``$!``%E#````0$``640```!`0`!91@```$!``%E'````0$``64D```!`0`!
+M92@```$!``%E,````0$``64X```!`0`!94````$!``%E8````0$``65P```!
+M`0`!97@```$!``%E@````0$``66(```!`0`!99@```$!``%EJ``!E`$``678
+M``&1`0`!9=P```$!``%EZ````0$``67T```!`0`!9@P``90!``%F0``!D0$`
+M`698```.`0`!9H```9$!``%FE````0$``6:@```!`0`!9NP```$!``%G5``!
+ME`$``6=T``&1`0`!9X0``90!``%GG``!D0$``6>L``&4`0`!9\0``9$!``%G
+MU``!E`$``6?X``&1`0`!:#0``9$!``%H1``!E`$``6AH``&1`0`!:'@``90!
+M``%HI``!D0$``6C$```!`0`!:.````$!``%H\````0$``6C\``#%`0`!:00`
+M``$!``%I+``!E`$``6E,``&1`0`!:8@``90!``%IJ``!D0$``6FX``&4`0`!
+M:=0``9$!``%IY``!E`$``6GX``&1`0`!:@P```$!``%J'````0$``6HD```!
+M`0`!:C0``90!``%J6``!D0$``6IL```!`0`!:H```9$!``%JX```6@$``6KP
+M``!:`0`!:S0```$!``%K>````0$``6N8```!`0`!:Z@```$!``%KO````0$`
+M`6O,```!`0`!:]P``90!``%K]``!E`$``6P(``&1`0`!;!@``90!``%L+``!
+MD0$``6Q```&1`0`!;%0``9$!``%L9``!E`$``6Q\``&1`0`!;)```9$!``%L
+MH``!E`$``6RX``&1`0`!;,@``9$!``%LW``!D0$``6SP``&1`0`!;0```90!
+M``%M&``!D0$``6TL``&1`0`!;4```9$!``%M5``!D0$``6UD``&4`0`!;7``
+M``$!``%ME````0$``6V8```!`0`!;:````$!``%MI````0$``6VL```!`0`!
+M;;0```$!``%MN````0$``6WH```!`0`!;C@```$!``%N>``!)0$``6Z8```!
+M`0`!;KP```$!``%NS````0$``6[4```!`0`!;N@```$!``%O"````0$``6\L
+M```!`0`!;S@```$!``%O7````0$``6]H```!`0`!;XP```$!``%OF````0$`
+M`6_,```!`0`!;]P``90!``%O\``!D0$``7````&4`0`!<!0``9$!``%P1``!
+MD0$``7!8``&1`0`!<&@``90!``%PD``!D0$``7"D``&1`0`!<+0``90!``%P
+MT``!D0$``7#@``&1`0`!</0``9$!``%Q"``!D0$``7$8``&4`0`!<4```9$!
+M``%Q5``!D0$``7%H``&1`0`!<7P``9$!``%QC``!E`$``7&T``&1`0`!<;P`
+M``("``%QP````@(``7'T```!`0`!<@@``&L!``%R&````0$``7(@```!`0`!
+M<DP``90!``%R:``!D0$``7)X``&4`0`!<I@``9$!``%RT```60$``7,0``$C
+M`0`!<R```2,!``%SB````0$``7/,```!`0`!<]0```$!``%SW````0$``7/D
+M```!`0`!<_0```$!``%T3````0$``71@```!`0`!='0```$!``%TA````0$`
+M`728```!`0`!=-````$!``%U!````0$``75,``&1`0`!=5@```$!``%UN``!
+MD0$``788``&1`0`!=G@``9$!``%VV``!D0$``7<```&1`0`!=PP```("``%W
+M@```%`$``7><```!`0`!=[@```$!``%WP````0$``7?0```!`0`!=^0```$!
+M``%W_````0$``7@T```!`0`!>$P```$!``%X;````0$``7B(```!`0`!>)``
+M``$!``%XH````0$``7BT```!`0`!>,P```$!``%Y!````0$``7DT``$6`0`!
+M>40```$!``%Y@````0$``7G````!`0`!>=0```$!``%Z!````0$``7H0```!
+M`0`!>FP```$!``%ZW````0$``7L$```!`0`!>SP```$!``%[<````0$``7M\
+M```!`0`!>Z0```$!``%\&````0$``7R````!`0`!?-0```$!``%]C````0$`
+M`7V\```!`0`!??@```$!``%^!````@(``7X\``#I`0`!?J````$!``%^S```
+M`0$``7[@```!`0`!?Q@```$!``%_D````0$``7_4```!`0`!@`0```$!``&`
+M'````0$``8!$``%9`0`!@%````$!``&`8````0$``8!L```!`0`!@(````$!
+M``&`D````0$``8"<```!`0`!@+````$!``&!'````0$``8$X``$E`0`!@40`
+M``$!``&!4````0$``8&(```!`0`!@<P```$!``&!^````0$``8(@``%9`0`!
+M@C0```$!``&"<````0$``8)\```!`0`!@LP```$!``&"]````0$``8,<```!
+M`0`!@T0```$!``&#E````0$``8.P```!`0`!A#````$!``&$4````0$``82$
+M```!`0`!A,````("``&$Q````@(``83P```!`0`!A10```$!``&%.````0$`
+M`84\```!`0`!A6````$!``&&*``!D0$``89X```!`0`!AH@``90!``&&D```
+M`0$``8:H```!`0`!ANP```$!``&&]````0$``8<H```!`0`!AS0```$!``&'
+M0````0$``8=(```!`0`!AU0```$!``&'7````0$``8>D```!`0`!B`@```$!
+M``&(+````0$``8@X```!`0`!B'@```$!``&(@````0$``8C,```!`0`!B.0`
+M``$!``&)(````0$``8DT```!`0`!B4````("``&)1````@(``8F(```!`0`!
+MB;@```$!``&)Q````0$``8G(```!`@`!B<P```$"``&)T````0(``8G4```!
+M`@`!B=P```$!``&*)```+P$``8JH```!`0`!BM````$!``&*X````0$``8KT
+M``!;`0`!BP@```$!``&++```9P$``8M,``&1`0`!BUP```$!``&+=```6P$`
+M`8NL```!`0`!B\0``&<!``&+W``!D0$``8OH```!`0`!C`@``&<!``&,(``!
+MD0$``8PT```!`0`!C%0``90!``&,9````0$``8R$```!`0`!C+P``9$!``&,
+MT``!D0$``8SD``&1`0`!C/0``90!``&-$``!D0$``8T\``#8`0`!C4P``90!
+M``&-:````0$``8UX```!`0`!C90``9$!``&-H```V`$``8W<``%J`0`!CA@`
+M`1@!``&.3````0$``8Y0```!`@`!CE0```$"``&.6````0(``8Y<```!`@`!
+MCG````$!``&.A````0$``8ZH```!`0`!CJP```$!``&.P````0$``8[<```!
+M`0`!CN@```$!``&.]````0$``8\,```!`0`!CR```2,!``&/+````0$``8]@
+M```!`0`!CW@``%8!``&/Q``!D0$``8_\``&1`0`!D`@``90!``&0-``!D0$`
+M`9#T```!`0`!D60```$!``&1;````0$``9&````!`0`!D9````$!``&1H```
+M`0$``9'<``&1`0`!D@0``9$!``&2'````0$``9(T``&1`0`!DE````$!``&2
+M:``!D0$``9*4``&1`0`!DJ````$!``&2Q````0$``9,@```!`0`!DRP```$!
+M``&3;````0$``9-T```!`0`!DW@```$!``&3B````0$``9.8```!`0`!D^``
+M`9$!``&4&``!D0$``90L``&1`0`!E#@```$!``&43``!D0$``91@``&1`0`!
+ME'0``9$!``&4@``!E`$``920``&1`0`!E:````$!``&5K``!+`(``96P```Q
+M`@`!E;0``,("``&5S``!E`$``97H``&1`0`!E@P``9$!``&6-``!E`$``98\
+M```!`0`!ED@``90!``&6@``!D0$``9:0``&<`0`!EI@```$!``&6H``!.0$`
+M`9:H```!`0`!EK0``9P!``&6O````0$``9;,```!`0`!EM0```$!``&6W```
+M`0$``9;D```!`0`!EO0```$!``&7#``!E`$``9<D``&1`0`!ET```9$!``&7
+M3``!E`$``9=4```!`0`!EV````$!``&7<``!E`$``9>$``&1`0`!EXP``3D!
+M``&7G``!E`$``9>P``&1`0`!E[@```$!``&7P````0$``9?(``$Y`0`!E]0`
+M`9P!``&7W````0$``9?L``&4`0`!F````9$!``&8$``!D0$``9E0```!`0`!
+MF>````$!``&:_````0$``9N0```!`0`!G"@```$!``&=&````0$``9UL```!
+M`0`!G70```$!``&>'````0$``9\D```!`0`!GW@```$!``&??````0(``9^`
+M```!`@`!GX0```$"``&?B````0(``9^4```!`0`!G\````$!``&?W````0$`
+M`:!(```!`0`!H$P```$!``&@5````0$``:!8```!`0`!H&````$!``&A```!
+MA@$``:$4``&1`0`!H2@``9$!``&A.``!D0$``:%,``&1`0`!H6```9$!``&A
+M@``!D0$``:&0``&&`0`!H:0``9$!``&AN``!D0$``:(<```!`0`!HDP```$!
+M``&B>``!A@$``:+0``$C`0`!H[P```$!``&C\````0$``:0$```!`0`!I"``
+M`9$!``&D/``!D0$``:1$```P`0`!I*@``(0!``&DO``!D0$``:30``&1`0`!
+MI0@```$!``&E#````0(``:40```!`@`!I10```$"``&E&````0(``:4<```!
+M`@`!I2````$"``&E)````0(``:4P```!`0`!I3P``90!``&E;``!D0$``:5\
+M``&4`0`!I:@``9$!``&EN``!E`$``:7D``&1`0`!I?0``90!``&F(``!D0$`
+M`:8T```!`0`!ID````$!``&F7````0$``:;4``&4`0`!IP```9$!``&G$``!
+ME`$``:<X``&1`0`!IT@``90!``&G<``!D0$``:>```&4`0`!IZ@``9$!``&G
+MN``!E`$``:?<``&1`0`!I^P``90!``&H%``!D0$``:@<```!`0`!J"P``90!
+M``&H-````0$``:A$``&4`0`!J%@``9$!``&H:````0$``:B4```!`0`!J+P`
+M`90!``&HX``!D0$``:CL```!`0`!J1````$!``&I+````0$``:D\``&4`0`!
+MJ6@``9$!``&I?````0$``:F(```!`0`!J:0```$!``&IR````0$``:G8``&4
+M`0`!J@0``9$!``&J&````0$``:HD```!`0`!JD````$!``&J2````0$``:I@
+M``!S`0`!JF@``74!``&J=```W`$``:IX```!`0`!JHP```$!``&JH````0$`
+M`:JD``%U`0`!JK```-P!``&JS``!D0$``:KH``&1`0`!JO```#`!``&J]```
+M`0$``:KX``%U`0`!JP0``-P!``&K'````0$``:LP```"`@`!JS0```("``&K
+M.````@(``:L\```"`@`!JT````("``&K1````@(``:M(```"`@`!JTP```("
+M``&K4````@(``:N,```!`0`!J]```9$!``&KY``!D0$``:OX``&1`0`!K`P`
+M`9$!``&L'``!A@$``:R````!`0`!K)````$!``&LG```H`$``:S8```!`0`!
+MK.0```$!``&L]```H`$``:T````!`0`!K0P```$!``&M)```H`$``:U````!
+M`0`!K4@``2$!``&M:```H`$``:V$```!`0`!K=@```$!``&N$````0$``:XL
+M``"@`0`!KC@``2$!``&N8````0$``:Z(```!`0`!KN0```$!``&O"```H`$`
+M`:\8``"@`0`!KR@``*`!``&O.```H`$``:](``"@`0`!KU```74!``&O7```
+MW`$``:]D```!`0`!KX@```$!``&OF```H`$``:^H``"@`0`!K\0``*`!``&O
+MU```H`$``:_D```!`0`!K_0``*`!``&P!```H`$``;`4``"@`0`!L"0``*`!
+M``&P-```H`$``;!(```!`0`!L%```74!``&P7```W`$``;!D```!`0`!L'@`
+M`9$!``&PC``!D0$``;"8```!`0`!L*```74!``&PK```W`$``;#8``&1`0`!
+ML.P``9$!``&P_``!A@$``;$<``&4`0`!L3```90!``&Q0````0$``;&\```!
+M`0`!L=````$!``&QV````0$``;((```!`0`!LCP```$!``&R0````0$``;*`
+M```!`0`!LH@```$!``&RW````0$``;+H```!`0`!LOP```$!``&S`````0$`
+M`;,,``"@`0`!LQP```$!``&S,````0$``;-(```!`0`!LV0``90!``&S>``!
+ME`$``;.,``&4`0`!LZ@```$!``&SL````0$``;/,```!`0`!M%````$!``&T
+M7````0$``;1X```!`0`!M)@```$!``&TJ``!A@$``;2X``&4`0`!M,P``90!
+M``&TW````0$``;3H```!`0`!M/0```$!``&U!``!D0$``;48``&1`0`!M30`
+M`9$!``&U2``!D0$``;7,```!`0`!M>@```$!``&V`````0$``;8(```!`0`!
+MM@P```$!``&V/````0$``;9$```!`0`!MDP```$!``&V>````0$``;9\```!
+M`0`!MQ@``9$!``&W*``!.0$``;<T```!`0`!MU```9$!``&W8``!.0$``;=L
+M```!`0`!MXP``9$!``&WG``!.0$``;>L```!`0`!M[````("``&WM````@(`
+M`;>X```"`@`!M]@``(L!``&W]````0$``;@0```O`0`!N#0``90!``&X7``!
+MD0$``;AD```!`0`!N&P```$!``&X>```+P$``;B$```!`0`!N)@``"\!``&X
+MS``!D0$``;CL``&1`0`!N00```("``&Y'````0$``;D@```!`@`!N20```$"
+M``&Y*````0(``;DL```!`@`!N3````$"``&Y-````0(``;DX```!`@`!N3P`
+M``$"``&YI````0$``;FH```!`0`!N;````$!``&YM````0$``;F\```!`0`!
+MN<0```$!``&YY````0$``;H````!`0`!NA@```$!``&Z-````0$``;I,```!
+M`0`!NF@```$!``&ZB````0$``;KT```!`0`!NW````$!``&[[````0$``;PP
+M```!`0`!O#P```$!``&\6```>0$``;QP``!Y`0`!O)0``9$!``&\I``!.0$`
+M`;RP```!`0`!O-```9$!``&\X``!.0$``;SH```!`0`!O1```9$!``&](``!
+M.0$``;TH```!`0`!O5```9$!``&]8``!.0$``;UH```!`0`!O9P```$!``&]
+MK````0$``;W4``!Y`0`!O?0``'D!``&^%```>0$``;XT``!Y`0`!OE0``'D!
+M``&^=```>0$``;Z4``&1`0`!OJ0``3D!``&^L````0$``;[D```!`0`!OPP`
+M`'D!``&_+```>0$``;\X```!`0`!OT0```$!``&_=```>0$``;^,``!Y`0`!
+MOZ0``'D!``&_R``!D0$``;_8``$Y`0`!O^0```$!``'``````@(``<`$```"
+M`@`!P`@```("``'`#````@(``<`0```"`@`!P!0```("``'`;````0$``<"(
+M``$E`0`!P)0```$!``'`H````0$``<#8```!`0`!P20```$!``'!*````0$`
+M`<$P```!`0`!P3@```$!``'!/````0$``<%$```!`0`!P4@```$!``'!4```
+M`0$``<%8```!`0`!P8P```$!``'!P````0$``<'T```!`0`!P@P``2,!``'"
+M-````0$``<*````!`0`!PIP```$!``'"M````0$``<+<```!`0`!PQP```$!
+M``'#3````0$``<-H```!`0`!PZ````$!``'#Y````0$``<0L```!`0`!Q#P`
+M``$!``'$:````0$``<20```!`0`!Q,P```$!``'%2````0$``<58```!`0`!
+MQ8P```$!``'%W````0$``<8,``%9`0`!QC````$!``'&3````0$``<9D```!
+M`0`!QGP```$!``'&F````0$``<:X```!`0`!QLP```$!``'&Z````0$``<<0
+M```!`0`!QTP```$!``''8````0$``<=T```!`0`!QZP```$!``''P````0$`
+M`<@$```!`0`!R!@```$!``'(*````0$``<A(``%9`0`!R'````$!``'(=```
+MA0$``<B4``"%`0`!R,@```$!``'(W````0$``<CP```"`@`!R10``-`!``')
+M(````0$``<D\``#0`0`!R4@```$!``')X````0(``<GD```!`@`!R>@```$"
+M``')[````0(``<GP```!`@`!R?0```$"``')^````0(``<G\```!`@`!RC@`
+M`9$!``'*2``!.0$``<I4```!`0`!RG```9$!``'*@``!.0$``<J,```!`0`!
+MRJP``9$!``'*O``!.0$``<K,```!`0`!RM````("``'*U````@(``<K8```"
+M`@`!RP0```$!``'+)````0$``<M````!`0`!RV0```$!``'+E```+P$``<NH
+M``&4`0`!R]```9$!``'+U````0$``<O\```!`0`!S`P```$!``',1```+P$`
+M`<Q0```!`0`!S'````$!``',>````0$``<R8```O`0`!S*0```$!``',Q```
+M`0$``<SD```O`0`!S/````$!``'-$````0$``<TL```O`0`!S3P``"\!``'-
+M1````0$``<UT``&1`0`!S8P``9$!``'-R````0$``<W,```!`@`!S=````$"
+M``'-U````0(``<W8```!`@`!S=P```$"``'-X````0(``<WD```!`@`!SG0`
+M``$!``'.>````0$``<Z````!`0`!SH@```$!``'.C````0$``<Z4```!`0`!
+MSI@```$!``'.H````0$``<ZH```!`0`!SLP```$!``'.Z````0$``<\$```!
+M`0`!SR````$!``'//````0$``<]8```!`0`!SW````$!``'/I````0$``<_<
+M```!`0`!T`@```$!``'0-````0$``=!D```!`0`!T)0```$!``'0R````0$`
+M`=#P``!Y`0`!T1```'D!``'1,```>0$``=%````!`0`!T60``'D!``'1A```
+M>0$``=&D``!Y`0`!T<0``'D!``'1Y```>0$``=($``!Y`0`!TA0```$!``'2
+M0```>0$``=)@```!`0`!THP``'D!``'2K```>0$``=+$```!`0`!TM````$!
+M``'2V````0$``=+@```!`0`!TP```'D!``'3&```>0$``=,P``!Y`0`!TT@`
+M`'D!``'37````0$``=.```!Y`0`!TYP``'D!``'3M```>0$``=/,``!Y`0`!
+MT^0``'D!``'4&````0$``=0H```!`0`!U$P``'D!``'4<```>0$``=2````!
+M`0`!U(P```$!``'4P```>0$``=38``!Y`0`!U/```9$!``'5```!.0$``=4(
+M```!`0`!U2@``9$!``'5.``!.0$``=5````!`0`!U6```9$!``'5<``!.0$`
+M`=5X```!`0`!U9@``9$!``'5J``!.0$``=6T```!`0`!U=0``9$!``'5Y``!
+M.0$``=7P```!`0`!U@P```("``'6$````@(``=84```"`@`!UA@```("``'6
+M'````@(``=94```!`0`!UF````$!``'6:````0$``=9P```!`0`!UGP```$!
+M``'6F````0$``=:<```!`0`!UJ0```$!``'6K````0$``=:P```!`0`!UK@`
+M``$!``'6O````0$``=;$```!`0`!ULP```$!``'6[````0$``=<(```!`0`!
+MUY@```$!``'7I````0$``=?(```!`0`!U^@```$!``'8`````0$``=@P```!
+M`0`!V&```.D!``'8=```Z0$``=B0```!`0`!V*@```$!``'8V```Z0$``=CL
+M``#I`0`!V0@```$!``'9*```Z0$``=E8``#I`0`!V6P``.D!``'9B````0$`
+M`=FH``#I`0`!V<0```$!``':"````0$``=I4```!`0`!VF0```$!``':?```
+M`0$``=K0```!`0`!VR0```$!``';5````0$``=MD```!`0`!VW````$!``';
+MD````0$``=O\```!`0`!W`P```$!``'<&````0$``=PP```!`0`!W'````$!
+M``'<D````0$``=U@``$E`0`!W9P```$!``'=J````0$``=W,```!`0`!W?P`
+M``$!``'>"````0$``=X8```!`0`!WH````$!``'>F````0$``=[P```!`0`!
+MWP0```$!``'?#````0$``=\L```!`0`!WT@```$!``'?C````0$``=^L```!
+M`0`!W\@```$!``'?V````0$``=_P```!`0`!X`````$!``'@"````0$``>`0
+M```!`0`!X#````$!``'@-````0$``>!8```!`0`!X+````$!``'@T````0$`
+M`>#L```!`0`!X10```$!``'A*````0$``>$X```!`0`!X4P```$!``'A7```
+M`0$``>%T```!`0`!X7P```$!``'AG````0$``>&@```!`0`!X<@```$!``'A
+M]````0$``>'X``"%`0`!XA@``(4!``'B6````0$``>*H```!`0`!XO````$!
+M``'C%````0$``>,D```!`0`!XU````$!``'C:````0$``>.$```!`0`!XY@`
+M``$!``'CN````0$``>/,```!`0`!X]P```$!``'C]````0$``>0L```!`0`!
+MY%```24!``'D:````0$``>2````!`0`!Y*0```$!``'DN``!)0$``>3$```!
+M`0`!Y/@```$!``'E)````0$``>4\```!`0`!Y6````$!``'EC```T`$``>68
+M```!`0`!Y;0``-`!``'EP````0$``>9H```!`@`!YFP```$"``'F<````0(`
+M`>9T```!`@`!YG@```$"``'F?````0(``>:````!`@`!YH0``"$"``'FP``!
+MD0$``>;0``$Y`0`!YMP```$!``'F^``!D0$``><(``$Y`0`!YQ0```$!``'G
+M-``!D0$``>=$``$Y`0`!YU0```$!``'G6````@(``>=<```"`@`!YV````("
+M``'GC````0$``>>L```!`0`!Y\@```$!``'G[````0$``>@<```O`0`!Z#``
+M`90!``'H6``!D0$``>A<```!`0`!Z(0```$!``'HE````0$``>C,```O`0`!
+MZ-@```$!``'H^````0$``>D````!`0`!Z2```"\!``'I+````0$``>E,```!
+M`0`!Z6P``"\!``'I>````0$``>F8```!`0`!Z;0``"\!``'IQ```+P$``>G,
+M```!`0`!Z?P``9$!``'J%``!D0$``>IT```!`0`!ZG@```$!``'J@````0$`
+M`>J$```!`0`!ZHP```$!``'JD````0$``>JH```!`0`!ZL````$!``'J[```
+M`0$``>L8```!`0`!ZT0```$!``'K=````0$``>N8``!Y`0`!Z[@``'D!``'K
+MY````0$``>O\``&1`0`![`P``3D!``'L%````0$``>PT``&1`0`![$0``3D!
+M``'L3````0$``>QL``&1`0`!['P``3D!``'LA````0$``>RD``&1`0`![+0`
+M`3D!``'LP````0$``>S@``&1`0`![/```3D!``'L_````0$``>T8```"`@`!
+M[1P```("``'M(````@(``>TD```"`@`![2@```("``'M1````0$``>U(```!
+M`@`![4P```$"``'M4````0(``>U4```!`@`![5@```$"``'M7````0(``>U@
+M```!`@`![;@```$!``'MQ````0$``>WH```!`0`![A@```$!``'N)````0$`
+M`>XT```!`0`![I````$!``'NN````0$``>\(```!`0`![T```24!``'OA```
+M`0$``>_H``$E`0`!\$P```$!``'P@````0$``?&@```!`0`!\=@```$!``'Q
+M]````0$``?)````!`0`!\F@```$!``'R>````0$``?*4```!`0`!\L@```$!
+M``'RZ````0$``?,<```!`0`!\W0```$!``'SL````0$``?/T```!`0`!]"@`
+M``$!``'T7````0$``?1H```!`0`!]+P```$!``'TR````0$``?30```!`0`!
+M]/````$!``'U'````0$``?5@```!`0`!]7@```$!``'UD``!E`$``?7$```!
+M`0`!]=0``90!``'U_``!D0$``?9H``&1`0`!]G@```$!``'VR``!D0$``?;T
+M```!`0`!]O@``(4!``'W%````0$``?<8``"%`0`!]S@``(4!``'W?````0$`
+M`?>T```!`0`!]_@```$!``'X$````0$``?@\```!`0`!^%P```$!``'X:```
+M`0$``?AT```!`0`!^(0```$!``'XJ````0$``?BX```!`0`!^-P```$!``'X
+M\````0$``?D$```!`0`!^1P```$!``'Y8````0$``?EL```!`0`!^80```$!
+M``'YK````0$``?G```$E`0`!^=@```$!``'Y\````0$``?H8```!`0`!^BP`
+M`24!``'Z.````0$``?I@```!`0`!^HP```$!``'ZI````0$``?K(```!`0`!
+M^O0``-`!``'[`````0$``?L<``#0`0`!^R@```$!``'[.```T`$``?M$```!
+M`0`!^]P```$"``'[X````0(``?OD```!`@`!^^@```$"``'[[````0(``?OP
+M```!`@`!^_0```$"``'[^```(0(``?PT``&1`0`!_$0``3D!``'\4````0$`
+M`?QL``&1`0`!_'P``3D!``'\B````0$``?RH``&1`0`!_+@``3D!``'\R```
+M`0$``?S,```"`@`!_-````("``'\U````@(``?T````!`0`!_2````$!``']
+M/````0$``?U@```!`0`!_9```"\!``']I``!E`$``?W,``&1`0`!_=````$!
+M``']^````0$``?X(```!`0`!_D```"\!``'^3````0$``?YL```!`0`!_G0`
+M``$!``'^D````0$``?ZP```!`0`!_LP```$!``'^[````0$``?\(```O`0`!
+M_Q@``"\!``'_(````0$``?]0``&1`0`!_V@``9$!``'_W````0$``?_@```!
+M`0`!_^@```$!``'_\````0$``?_T```!`0`!__P```$!``(`!````0$``@`D
+M```!`0`"`#P```$!``(`5````0$``@!L```!`0`"`(0```$!``(`G````0$`
+M`@"P```!`0`"`,P```$!``(`Y````0$``@$$```!`0`"`2@```$!``(!6```
+M`0$``@&(```!`0`"`;P```$!``(!R````0$``@'L``!Y`0`"`@P``'D!``("
+M+```>0$``@(X```!`0`"`D````$!``("4````0$``@)<```O`0`"`G0```$!
+M``("F```>0$``@*T``!Y`0`"`N@```$!``(#```!D0$``@,0``$Y`0`"`Q@`
+M``$!``(#.``!D0$``@-(``$Y`0`"`U````$!``(#<``!D0$``@.```$Y`0`"
+M`X@```$!``(#J``!D0$``@.X``$Y`0`"`\0```$!``(#Y``!D0$``@/T``$Y
+M`0`"!`````$!``($'````@(``@0@```"`@`"!"0```("``($*````@(``@0L
+M```"`@`"!$@```$!``($3````0(``@10```!`@`"!%0```$"``($6````0(`
+M`@1<```!`@`"!&````$"``($9````0(``@2\```!`0`"!,@```$!``($[```
+M`0$``@4<```!`0`"!2@```$!``(%.````0$``@64```!`0`"!;P```$!``(&
+M#````0$``@9$``$E`0`"!H@```$!``(&[``!)0$``@=0```!`0`"!X0```$!
+M``((I````0$``@C<```!`0`""/@```$!``()1````0$``@EL```!`0`""7P`
+M``$!``()F````0$``@G,```!`0`"">P```$!``(*(````0$``@IX```!`0`"
+M"K0```$!``(*^````0$``@LL```!`0`""V````$!``(+;````0$``@O````!
+M`0`""\P```$!``(+U````0$``@OT```!`0`"#"````$!``(,9````0$``@R0
+M``&4`0`"#,0```$!``(,U``!E`$``@S\``&1`0`"#6@``9$!``(->````0$`
+M`@W(``&1`0`"#?0```$!``(-^```A0$``@X4```!`0`"#A@``(4!``(..```
+MA0$``@Y\```!`0`"#K0```$!``(.^````0$``@\X```!`0`"#U@```$!``(/
+M9````0$``@]P```!`0`"#X````$!``(/A````0$``@^H```!`0`"#[@```$!
+M``(/X````0$``@_T```!`0`"$`@```$!``(0(````0$``A!<```!`0`"$&@`
+M``$!``(0@````0$``A"D```!`0`"$+@``24!``(0T````0$``A#H```!`0`"
+M$0P```$!``(1(``!)0$``A$T```!`0`"$5P```$!``(1B````0$``A&@```!
+M`0`"$<0```$!``(1\```T`$``A'\```!`0`"$A@``-`!``(2)````0$``A(T
+M``#0`0`"$D````$!``(2V````0(``A+<```!`@`"$N````$"``(2Y````0(`
+M`A+H```!`@`"$NP```$"``(2\````0(``A+T```A`@```,```0\"````Q```
+M90(```#(``##`@```,P``+4"````T``!?@(```#4``#6`@```-@``%0"````
+MW```X@(```#@``"B`@```.0``7L"````Z``!3@(```#L``#``@```/```#X"
+M````]```A@(```#X``!7`@```/P``"`"```!```!;`(```$$``&7`@```0@`
+M`"X"```!#```C@(```$0``%+`@```10``"D"```!&```/`(```$<``!I`@``
+M`2```8("```!)``!?0(```$H``$<`@```2P``+8"```!,``!8P(```$T``%F
+M`@```3@``0P"```!/```WP(```%```%``@```40``)("```!2``!=@(```%,
+M``#!`@```5```+@"```!5```AP(```%8``"P`@```5P``%4"```!8```R@(`
+M``%D``$\`@```6@``1$"```!;```I@(```%P``$W`@```70``.P"```!>``!
+M8`(```%\``%0`@```8```2\"```!A```,@(```&(``"W`@```8P``5X"```!
+MD``!'@(```&4``$H`@```9@``#T"```!G```=@(```&@``%(`@```:0``.<"
+M```!J```3P(```&L```V`@```;```(T"```!M```"`(```&X``#X`@```;P`
+M`4$"```!P``!.`(```'$``#Y`@```<@``8,"```!S```:@(```'0```*`@``
+M`=0``6@"```!V```K@(```'<``$2`@```>```1L"```!Y``!<@(```'H``$V
+M`@```>P``*@"```!\```10(```'T``$Q`@```?@``!,"```!_```O@(```(`
+M``!Q`@```@0``/L"```""```_0(```(,``%5`@```A```6<"```"%``!@0(`
+M``(8```/`@```AP``5("```"(``!)@(```(D``$.`@```B@``*,"```"+``!
+M4P(```(P```!`@```C0``94"```".``!+@(```)```%>`@```D0``1X"```"
+M2``!*`(```),```]`@```E```'8"```"5````0(``!;0``%)`@``%M0``6D"
+M```6V``!6P(``!;<``&``@``%N```&0"```6Y```=P(``!;H``"5`@``%NP`
+M`&X"```6\```#0(``!;T```U`@``%O@``&("```6_```8P(``!<````Y`@``
+M%P0``6\"```7"``!$`(``!<,``&+`@``%Q```(,"```7%``!>0(``!<8``$%
+M`@``%QP``*P"```7(``!*P(``!<D```B`@``%R@``0H"```7+```&0(``!<P
+M``%K`@``%S0``.H"```7.```'P(``!<\```J`@``%T```*\"```71``!?P(`
+M`!=(``%M`@``%TP``7H"```74``!/0(``!=4``#U`@``%U@``0("```77```
+M\0(``!=@``$5`@``%V0``'\"```7:```F@(``!=L``!U`@``%W```4T"```7
+M=```H0(``!=X``!``@``%WP``3X"```7@``!.@(``!>$``![`@``%X@``#H"
+M```7C``!40(``!>0``#@`@``%Y0``3("```7F```Y@(``!><``#&`@``%Z``
+M`.4"```7I``!10(``!>H``#1`@``%ZP``#<"```7L```80(``!>T``#;`@``
+M%[@``4H"```7O``!6`(``!?```$J`@``%\0``!P"```7R```7`(``!?,``$T
+M`@``%]```98"```7U```2`(``!?8``"<`@``%]P``60"```7X```UP(``!?D
+M``$'`@``%^@``!X"```7[```_@(``!?P```X`@``%_0``0,"```7^```[@(`
+M`!?\``"/`@``&````"<"```8!```4`(``!@(``"4`@``&`P``-X"```8$```
+MS@(``!@4``%:`@``&!@``,T"```8'``!50(``!@@``&2`@``&"0```<"```8
+M*```I`(``!@L``!R`@``&#```&P"```8-```\@(``!@X``#V`@``&#P``0D"
+M```80````0(``!A$``$P`@``&$@``4P"```84```Q@(``!A4``#E`@``&%@`
+M`44"```87```T0(``!A@```W`@``&&0```$"```V'```6P(``#8@``""`@``
+M-B0``7<"```V*```;0(``#8L``!$`@``-C```-H"```V-```N@(``#8X``$?
+M`@``-CP``*T"```V0```4P(``#9$``"?`@``-D@``%8"```V3``!!@(``#90
+M``%B`@``-E0``(P"```V6``!`0(``#9<``#H`@``-F```9P"```V9``!D`(`
+M`#9H``"\`@``-FP``'X"```V<``!)P(``#9T```H`@``-G@``6$"```V?``!
+M5@(``#:```"(`@``-H0``64"```VB```7P(``#:,``%#`@``-I```00"```V
+ME```_P(``#:8```2`@``-IP``7`"```VH```?`(``#:D``#C`@``-J@``74"
+M```VK```W`(``#:P``"8`@``-K0``34"```VN```_`(``#:\```0`@``-L``
+M`)X"```VQ```"0(``#;(``"9`@``-LP``4("```VT```L@(``#;4``#K`@``
+M-M@``#\"```VW``!(@(``#;@``"E`@``-N0``+,"```VZ``!&@(``#;L``!-
+M`@``-O```48"```V]``!5`(``#;X``$7`@``-OP``9@"```W````20(``#<$
+M``#)`@``-P@``*H"```W#``!A@(``#<0``!,`@``-Q0``)`"```W&``!B@(`
+M`#<<``"I`@``-R```,\"```W)```0@(``#<H``!+`@``-RP``"T"```W,```
+M00(``#<T```[`@``-S@``.T"```W/```1@(``#=```"!`@``-T0``#0"```W
+M2```,P(``#=,```8`@``-U```'0"```W5```^@(``#=8``!O`@``-UP``2D"
+M```W8``!A0(``#=D``#3`@``-V@``54"```W;```DP(``#=P``&3`@``-W0`
+M`1,"```W>```U`(``#=\```C`@``-X```7@"```WA```<`(``#>(``#8`@``
+M-XP``,@"```WD```[P(``#>4``&.`@``-YP``1H"```WH```30(``#>D``%&
+M`@``-Z@``50"```WK``!%P(``#>P``&9`@``-[@```$"````#````P(````0
+M```#`@```!0```,"````&````P(````<```#`@```"````,"````)````P(`
+'```H```#`@``
+`
+end
diff --git a/sys/contrib/dev/ath/public/armv4-be-elf.inc b/sys/contrib/dev/ath/public/armv4-be-elf.inc
new file mode 100644
index 0000000..f5fe9d0
--- /dev/null
+++ b/sys/contrib/dev/ath/public/armv4-be-elf.inc
@@ -0,0 +1,74 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/armv4-be-elf.inc#4 $
+#
+
+#
+# Compilation configuration for building big-endian ARMv4.
+#
+
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=arm-elf
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/arm-elf-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -march=armv4 -mbig-endian \
+ -fno-strict-aliasing -fno-common
diff --git a/sys/contrib/dev/ath/public/armv4-be-elf.opt_ah.h b/sys/contrib/dev/ath/public/armv4-be-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/armv4-be-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/armv4-le-elf.hal.o.uu b/sys/contrib/dev/ath/public/armv4-le-elf.hal.o.uu
new file mode 100644
index 0000000..d0a69ec
--- /dev/null
+++ b/sys/contrib/dev/ath/public/armv4-le-elf.hal.o.uu
@@ -0,0 +1,5468 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/armv4-le-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$!`6$```````````$`*``!``````````````"\[`(```0``#0`````
+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
+M$*#A_O__ZP`,H.%`#*#A+"`;Y;``PN%\@P#J@#"`X`,Q@."#,:#A!4"#X+`@
+MUN&U,)/A`P!2X0``H!/PKQL9<X,`Z@W`H.'PW2WI!+!,X@303>(`@*#A`7"@
+MX0)@H.$!H*#C`%"@XP(`5>']@P`JA4&'X`@`H.$$$*#A)B!+XB@P2^(Y@P#K
+M``!0XR8P6Q4&,,05*#!;%0<PQ!4`H*`#`5"%X@8`5>'N@P`Z"@"@X?"M&^D-
+MP*#A<-@MZ02P3.(!8*#A`%"@X;E-H.,,0(3BK`"@X_[__^L$`(7G``!0XQR$
+M``H1.Z#CW#"#X@$,H.,#`(7G$4N@X]A`A.+^___K!`"%YP``4.,<A``**TR@
+MXP1`A.(&#*#C_O__ZP0`A><``%#C'X0`&@(PH.,`,(;E<*@;Z2L\H.,(,(/B
+M>""?Y0,@A><K/*#C##"#XFP@G^4#((7G*SR@XQ`P@^)@()_E`R"%YRL\H.,4
+M,(/B5""?Y0,@A><K/*#C&#"#XD@@G^4#((7G*SR@XQPP@^(\()_E`R"%YRL\
+MH.,@,(/B,""?Y0,@A><K/*#C)#"#XB0@G^4#((7G`0"@XW"H&^D(#`(`-/H!
+M`&@"`@`0^P$`Q/T!`%P*`@"4#P(``````"A0%BQ8**#_H_^>_Z#_H_^@_P``
+M```%``H`%``>`#(`1@!5`%H`7P!D````"@`4`!X`*``R`#P`1@!0`%H`9``$
+M``8`"0`,`,(```#$````Q0```-````#:````Y````,(```##````U````/(`
+M```-`0``*`$``,\```#*`````@!0(0$`0`$$`*``"`#``"``T`!``%`!)`&8
+M&0`F$`8`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M^%\`````````````````````````````````````````````(&``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````#_______\```"8``!'````")@````````,
+MF```IHZ$"1"8````X#(]%)@``&L'```<F````````""8`````@("))@```X.
+M```HF````0(""BR8``#\;P,`,)@````````TF```#@X``#B8```'````/)@`
+M```!`@!`F`````!CB428``"<%G(32)@``#.V&`!,F```/&&$$E"8``#@N.@-
+M5)@``%E(!P!8F```NKZ`?ER8``!>9CHQ8)@```@=``!DF````,X!`&B8``"0
+M09I`<)@```\```!TF```@````'B8```$`````)D````````$F0````````B9
+M````````#)D`````@``0F0```P````";````````!)L``"`````(FP``$```
+M``R;```P````$)L```@````4FP``*````!B;```H````')L```0````@FP``
+M)````"2;```4````*)L``#0````LFP``#````#";```L````-)L```(````X
+MFP``(@```#R;```2````0)L``#(```!$FP``"@```$B;```J````3)L```$`
+M``!0FP``(0```%2;```1````6)L``#$```!<FP``"0```&";```I````9)L`
+M``4```!HFP``)0```&R;```5````<)L``#4```!TFP``#0```'B;```M````
+M?)L```,```"`FP``(P```(2;```3````B)L``#,```",FP``"P```)";```K
+M````E)L```<```"8FP``)P```)R;```7````H)L``#<```"DFP``#P```*B;
+M```O````K)L``"\```"PFP``+P```+2;```O````N)L``"\```"\FP``+P``
+M`,";```O````Q)L``"\```#(FP``+P```,R;```O````T)L``"\```#4FP``
+M+P```-B;```O````W)L``"\```#@FP``+P```.2;```O````Z)L``"\```#L
+MFP``+P```/";```O````])L``"\```#XFP``+P```/R;```O`````)H``!T`
+M```$F@``70````B:``"=````#)H``-T````0F@``'0$``!2:```A````&)H`
+M`&$````<F@``H0```"":``#A````))H``#$````HF@``<0```"R:``"Q````
+M,)H``!P````TF@``7````#B:```I````/)H``&D```!`F@``J0```$2:```@
+M````2)H``!D```!,F@``60```%":``"9````5)H``#````!8F@``!0```%R:
+M```E````8)H``&4```!DF@``I0```&B:```H````;)H``&@```!PF@``'P``
+M`'2:```>````>)H``!@```!\F@``6````(":``"8````A)H```,```"(F@``
+M!````(R:``!$````D)H``(0```"4F@``$P```)B:```2````G)H``%(```"@
+MF@``D@```*2:``#2````J)H``"L```"LF@``*@```+":``!J````M)H``*H`
+M``"XF@``&P```+R:```:````P)H``%H```#$F@``F@```,B:``#:````S)H`
+M``8```#0F@``!@```-2:```&````V)H```8```#<F@``!@```.":```&````
+MY)H```8```#HF@``!@```.R:```&````\)H```8```#TF@``!@```/B:```&
+M````_)H```8```#4F```(````,R8```$````R)@```8!!@"<F```;0```,"8
+M````````T)@``!0````)"0```````@(&!@8&!@8"`@````,`!@`)`#P`````
+M``````````````````````````#P````S`````````````````````KB````
+M(```"@(```$8```!````0!@$```%!%<9`"80!@``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````"`I0``````````````````````````
+M``````````````````#PI0``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````&P)
+MCPFT"0```(```""8``!55555JJJJJF9F9F:9F9F9________````````(```
+M`"````!`````0```````!@````8````&`#`````5````%0```!T````5````
+M0!````_\+P`/_"\`'_PO``_\+P!$$```#_PO``_\+P`?_"\`#_PO`$@0```/
+M_"\`#_PO`!_\+P`/_"\`3!````_\+P`/_"\`'_PO``_\+P!0$```#_PO``_\
+M+P`?_"\`#_PO`%00```/_"\`#_PO`!_\+P`/_"\`6!````_\+P`/_"\`'_PO
+M``_\+P!<$```#_PO``_\+P`?_"\`#_PO`&`0```/_"\`#_PO`!_\+P`/_"\`
+M9!````_\+P`/_"\`'_PO``_\+P!P$```:`$``.`!``"X`0``:`$``#`0```P
+M`@``X`$``+`````P`@``L!```)@-``"`$0``2!\``)@-``#P$```X*```&A`
+M`0"`6```X*```!2`````!``$``@`"``P`"``!``$'(```*>/C0[/CXT.E8]@
+M`:>/C0X$F`````````,``````````````""8`````@("``("`@`"`0(``@("
+M))@```X.```.#@``!P<```X.```HF````0`""@$``@H```$%`0`""C28```.
+M#@``#@X```X.```.#@``.)@```<````'````"P````L```!$F```G!9R$Z46
+M<A.H%G(3G!9R$TB8``!GNA@`9[H8`&FZ&`!INA@`4)@``."T*`S@M"@,X+0H
+M#."T*`Q8F```+@V`?BX-@'XN#<!^+@V`?ER8``!>73<Q7ETW,5Y=.C%>73<Q
+M8)@``!"]```0O0``.+T``!"]``!DF````,X!``#.`0``S@$``,X!`!29```0
+M)P``$"<``'P5```0)P``&)D``)`!``"0`0``A````)`!``!$F0``(!#@;R`0
+MX&\@">!O(!#@;X"A``#_%/\%_Q3_!?\4_P7_&?\%U)@``!`````4````$```
+M`!`````,`````````"@```"<G(2$+````'Q\?'PT````!0```$``````````
+M1`````@```!(````"````$P````0````4`````````!4````'P`````(````
+M````!`@````````("`````````P(````````$`@````````4"````````!@(
+M````````'`@````````@"````````"0(````````,!(````````$@```````
+M``B`````````#(`````````8@````````"2`````````*(```#`````L@```
+M__\'`#"```#___\!-(```#$````X@````````#R`````````0(````````!$
+M@````@```$B`````````5(````````!8@`````````B8````````#)@``).0
+MA"T0F````.`R?128``!K#P``')@````````LF```_F\"`#"8````````/)@`
+M```!`@!`F```>@%J($R8```\88025)@``%D(``!HF```D$&:0&R8``"!L`P%
+M<)@```\```!TF```@````'B8```,`````)D````````$F0````````B9````
+M````#)D`````@``0F0```0```!R9```J"0``()D````````DF0``!8H%`"B9
+M```!````+)D````````PF0```````#29````````.)D````````\F0``/P``
+M`$"9```$````2)D```````!,F0```````%"9````````5)D``$SQ4%U8F0``
+M&````%R9``".:DL`A*$``/\%_P:(H0``_P?_!XRA``#_"/\(D*$``/\)_PF4
+MH0``_PK_"IBA``#_"_\+G*$``/\,_PR@H0``_PW_#:2A``#_#O\/J*$``/\2
+M_Q*LH0``_Q/_%+"A``#_%?\6M*$``/\7_QFXH0``_QK_&[RA``#_'?\>P*$`
+M`/\@_R/$H0``_R7_)\BA``#_*?\LS*$``/\O_S'0H0``_S3_-]2A``#_.O\Z
+MV*$``/\Z_SK<H0``_SK_.N"A``#_.O\ZY*$``/\Z_SKHH0``_SK_.NRA``#_
+M.O\Z\*$``/\Z_SKTH0``_SK_.OBA``#_.O\Z_*$``/\Z_SH`FP````````2;
+M```@````")L``!`````,FP``,````!";```(````%)L``"@````8FP``!```
+M`!R;```D````()L``!0````DFP``-````"B;```,````+)L``"P````PFP``
+M`@```#2;```B````.)L``!(````\FP``,@```$";```*````1)L``"H```!(
+MFP``!@```$R;```F````4)L``!8```!4FP``-@```%B;```.````7)L``"X`
+M``!@FP```0```&2;```A````:)L``!$```!LFP``,0```'";```)````=)L`
+M`"D```!XFP``!0```'R;```E````@)L``!4```"$FP``-0```(B;```-````
+MC)L``"T```"0FP```P```)2;```C````F)L``!,```"<FP``,P```*";```+
+M````I)L``"L```"HFP``*P```*R;```K````L)L``"L```"TFP``*P```+B;
+M```K````O)L``"L```#`FP``*P```,2;```K````R)L``"L```#,FP``*P``
+M`-";```K````U)L``"L```#8FP``*P```-R;```K````X)L``"L```#DFP``
+M*P```.B;```K````[)L``"L```#PFP``*P```/2;```K````^)L```(```#\
+MFP``%@```-28```@````V)@``&@08```F@``J0$````````$F@``Z0$``$``
+M```(F@``*0```(`````,F@``:0```%`!```0F@``F0$``)`!```4F@``V0$`
+M`-`!```8F@``&0```!`````<F@``60```$0````@F@``F0```(0````DF@``
+MI0$``$@!```HF@``Y0$``(@!```LF@``)0```,@!```PF@``R`$``!0````T
+MF@``"````$(````XF@``2````((````\F@``B````'@!``!`F@``F`$``+@!
+M``!$F@``V`$``/@!``!(F@``&````!(```!,F@``6````%(```!0F@``F```
+M`)(```!4F@``I`$``'P!``!8F@``Y`$``+P!``!<F@``)````/P!``!@F@``
+M9`````H```!DF@``I````$H```!HF@``Y````(H```!LF@``"@$``%H!``!P
+MF@``2@$``)H!``!TF@``B@$``-H!``!XF@``R@$```X```!\F@``"@```$X`
+M``"`F@``2@```(X```"$F@``B@```%X!``"(F@``N@$``)X!``",F@``^@$`
+M`-X!``"0F@``.@````D```"4F@``>@```$D```"8F@``A@$``(D```"<F@``
+MQ@$``'D!``"@F@``!@```+D!``"DF@``1@```/D!``"HF@``A@```#D```"L
+MF@``Q@```'D```"PF@``Q@```+D```"TF@``Q@```+T!``"XF@``Q@```/T!
+M``"\F@``Q@```#T```#`F@``Q@```'T```#$F@``Q@```+T```#(F@``Q@``
+M`/T```#,F@``Q@```/T```#0F@``Q@```/T```#4F@``Q@```/T```#8F@``
+MQ@```/T```#<F@``Q@```/T```#@F@``Q@```/T```#DF@``Q@```/T```#H
+MF@``Q@```/T```#LF@``Q@```/T```#PF@``Q@```/T```#TF@``Q@```/T`
+M``#XF@``Q@```/T```#\F@``Q@```/T````!````1@```&`````!````1@``
+M`&$````!````1@```&(````!````1@```&,````!````1@```&0````!````
+M1@```&4````!````1@```&8````!````1@```&<````!````1@```&@````!
+M````1@```&D````!````1@```&H````!````1@```&L````!````1@```&P`
+M```!````1@```'0````!````1@```'0````!````1@```'0````!````1@``
+M`'0````!````1@```'0````!````1@```'0````!````1@```'0````!````
+M1@```'0````!````1@```'4````!````1@```'8````!````1@```'<````!
+M````1@```'@````!````1@```'D````!````1@```'H````!````1@```'L`
+M```!````1@```'P````!````1@```'T````!````1@```'X````!````1@``
+M`'\````!````1@```(`````!````1````'P````!````1@```(@````!````
+M1@```(P````!````1@```)`````!````1@```)0````!````1@```)@````!
+M````1@```)P````!````1@```*`````!````1@```*0````!````1@```*@`
+M```!````1@```*P````!````1@```+`````!````1@```+0``````@<`GA8+
+M`&(6"@`Z%@D`'!8(`.H5!P":%04`2A4$``,5`@!9%``````!`````P`&``D`
+M/P````D````$````!``!``$``0`&````1D<X``````````````````0````!
+M``$`!````$9'-P`````````````````#``$``0`!``,```!&1S8`````````
+M````````!````````0`!````1D<U``````````````````0``0`!````````
+M`$9'-``````````````````$`````0```/[___]&1S,`````````````````
+M`P`!``$```#]____1D<R``````````````````0`````````_/___T9',0``
+M```````````````"``$``0```/K___]&1S``````````````````````````
+M`````````````````````````````!005!D`)A`&````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````'`,!````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M;`F/";0)"`EL";0)R?___\G____)____R?___\+____R____\O____+____R
+M____]/___\#____`____P/___\#___^Z____LO___[+___^R____LO___[#_
+M__________\```4"#P`'`@\`"@`/``D`#P``@```()@``%55556JJJJJ9F9F
+M9IF9F9D`````(````"````!`````0```````!@````8````&`)X6"P!B%@H`
+M.A8)`!P6"`#J%0<`FA4%`$H5!``#%0(`610``+@+`0````````````8````!
+M`````@````,````$````!0```$`0```/_"\`#_PO`!_\+P`/_"\`#_PO`$00
+M```/_"\`#_PO`!_\+P`/_"\`#_PO`$@0```/_"\`#_PO`!_\+P`/_"\`#_PO
+M`$P0```/_"\`#_PO`!_\+P`/_"\`#_PO`%`0```/_"\`#_PO`!_\+P`/_"\`
+M#_PO`%00```/_"\`#_PO`!_\+P`/_"\`#_PO`%@0```/_"\`#_PO`!_\+P`/
+M_"\`#_PO`%P0```/_"\`#_PO`!_\+P`/_"\`#_PO`&`0```/_"\`#_PO`!_\
+M+P`/_"\`#_PO`&00```/_"\`#_PO`!_\+P`/_"\`#_PO`#`0```P`@``X`$`
+M`+````!@`0``X`$``'`0``!H`0``X`$``+@!``",`0``X`$``+`0``!@#@``
+M@!$``!P?```X/@``@!$``/`0``#@H```:$`!`(!8``#@L```:$`!`!2```#H
+M`^@#X`;@!B`$(`1`"$`(X`;@!@28`````````P```````````````P```""8
+M`````@("``("`@`"`0(``@("``("`B28```.#@``#@X```<'```.#@``#@X`
+M`$28```<%G(3)1QR$R(7<A.B%G(3)1QR$V"8```0G0``$)T``!B=```8G0``
+M$)T``&28````S@$``,X!``#.`0``S@$``,X!`&B8``"009I`D$&:0)!!FD"0
+M09I`D$&:0!B9``"X`0``N`$``(0````(`0``N`$``"29```%B@40!8H%$`6*
+M!1`%B@40!8H%$#"B```````````````````(`0````````P`````````-```
+M``4```!``````````$0````(````2`````@```!,````$````%``````````
+M5````!\`````"`````````0(````````"`@````````,"````````!`(````
+M````%`@````````8"````````!P(````````(`@````````D"````````'`2
+M````````.!````````!X$````````+@0````````^!`````````X$0``````
+M`'@1````````N!$```````#X$0```````#@2````````>!(```````"X$@``
+M`````/@2````````.!,```````!X$P```````+@3````````^!,````````X
+M%````````'@4````````N!0```````#X%````````#@5````````>!4`````
+M``"X%0```````/@5````````.!8```````!X%@```````+@6````````^!8`
+M```````X%P```````'@7````````N!<```````#X%P```````#P0````````
+M?!````````"\$````````/P0````````/!$```````!\$0```````+P1````
+M````_!$````````\$@```````'P2````````O!(```````#\$@```````#P3
+M````````?!,```````"\$P```````/P3````````/!0```````!\%```````
+M``2`````````"(`````````,@````````""`````````)(`````````H@```
+M,````"R```#__P<`,(```/___P$T@```,0```#B`````````/(````````!(
+M@````````%2`````````6(````````!<@```C\</`,"````:,((JQ(```.`!
+MW`7(@```$"=`'\R``````/0!T(```!P>``#4@```JJH"`-B```!550`"W(``
+M``````#@@```_____^2```#__P``Z(````````#L@````````/"`````````
+M](````````#X@````````/R```"(`````(<````````$AP``C`````B'``#D
+M````#(<``-4"```0AP```````!2'````````&(<``*`````<AP``R0$``""'
+M```L````)(<``"P````HAP``,````"R'```\````,(<``"P````TAP``+```
+M`#B'```P````/(<``#P```!`AP```````$2'````````2(<```````!,AP``
+M`````%"'````````5(<```````!8AP```````%R'````````8(<``-4```!D
+MAP``WP```&B'```"`0``;(<``#H!``!PAP``=0```'2'``!_````>(<``*(`
+M``!\AP````````"!```"``$`!($```$````(@0``P`````R!````````$($`
+M`&@!```4@0```````,"'`````0(#Q(<```0%!@?(AP``"`D*"\R'```,#0X/
+MT(<``!`1$A/4AP``%!46%]B'```8&1H;W(<``!P='A_@AP````$"`^2'```$
+M!08'Z(<```@)"@OLAP``#`T.#_"'```0$1(3](<``!05%A?XAP``&!D:&_R'
+M```<'1X?#)@``!F.A*T0F````.`H?128``!KGPJ<')@```````!`F```>@%J
+M(%28``!9"````)D````````$F0````````B9````````#)D`````@``0F0``
+M`0```!R9``"`#```()D`````$`4HF0```0```"R9```$````-)D``"(@'QXX
+MF0``#0P+"CR9```_````2)D``!*R@))4F0``B.%075R9``".:DL`:)D``,X#
+M``!PF0``%;4O&7B9```!````?)D````````0H@``,V.``!2B```0;!``&*(`
+M`&!`G``@H@``QC"(`22B````!```+*(````````TH@``("`@(#BB```@("`@
+M0*(``"`*23A$H@``MGL``$BB``#\/_\/`)L````````HFP``#````#B;```2
+M````9)L``"$```",FP``+0```)R;```S`````0`"``(``0`!``(``0````,`
+M!@`)`#\````#``8`"0`_````"0````0````$``$``0`!````````````!@``
+M`$9'.``````````````````$`````0`!````````````!````$9'-P``````
+M```````````#``$``0`!`````````````P```$9'-@`````````````````$
+M```````!`````````````0```$9'-0`````````````````$``$``0``````
+M`````````````$9'-``````````````````$`````0``````````````_O__
+M_T9',P`````````````````#``$``0``````````````_?___T9',@``````
+M```````````$````````````````````_/___T9',0`````````````````"
+M``$``0``````````````^O___T9',```````````````````````````````
+M```````````````````````````````````(`````0````,`````````````
+M```````&````1D<W``````````````````(`````````````````````````
+M1D<V``````````````````$```````````````````#]____1D<U````````
+M``````````````````````````````#Z____1D<T````````````````````
+M`0`!``````````````#X____1D<S`````````````````````0`!`````0`!
+M``````#V____1D<R`````````````````````0````$``0`!``````#S____
+M1D<Q`````````````````````0````$``0````$```#P____1D<P````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````'\````R````?P``
+M`"@```!_````30```'\```!`````'P```!`````_````,`````@````&````
+M``````0````(`````@````0````&````"`````H````,````#@```!`````P
+M````%8```!6````5@```%8```!6````<@```IX^-$L\/B`F5#^`$JP_@$L\/
+MB`DHF````0`""@$``@H``0$%`0`""@$``@HTF```#@X```X.```.#@``#@X`
+M``X.```XF```!P````<````+````"P````L```!(F```6MH8`%K:&`!IRA@`
+M:<H8`&G*&`!0F```X+3H#>"TZ`W@M.@-X+3H#>"TZ`U8F```+@V`?BX-@'XN
+M3>A^+DWH?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F8W,5YA-S%LF```@;`,!8&P
+M#`6!L`P%@+`,!8"P#`44F0``$"<``!`G``!\%0``^"H``!`G``!$F0``(!"X
+M]R`0N/<@#;CW(!"X]R`0N/<,H@``:D$L9&I!+&1J04!D:D%`9&I!0&0<H@``
+M"H"#&`J`@Q@*@',8"H"#&`J`@Q@P$@````````B8````````+)@``/XO`@`\
+MF`````$"`$R8```\8802,)D``(-(``!`F0``!````%B9``#_````=)D`````
+M``#XF0``&`````2B````````"*(``(AG/M`HH@``M0$``#RB``"OB<@3!)L`
+M`"`````(FP``$`````R;```P````$)L```@````4FP``*````!B;```$````
+M')L``"0````@FP``%````"2;```T````+)L``"P````PFP```@```#2;```B
+M````/)L``#(```!`FP``"@```$2;```J````2)L```8```!,FP``)@```%";
+M```6````5)L``#8```!8FP``#@```%R;```N````8)L```$```!HFP``$0``
+M`&R;```Q````<)L```D```!TFP``*0```'B;```%````?)L``"4```"`FP``
+M%0```(2;```U````B)L```T```"0FP```P```)2;```C````F)L``!,```"@
+MFP``"P```*2;```K````J)L``"L```"LFP``*P```+";```K````M)L``"L`
+M``"XFP``*P```+R;```K````P)L``"L```#$FP``*P```,B;```K````S)L`
+M`"L```#0FP``*P```-2;```K````V)L``"L```#<FP``*P```.";```K````
+MY)L``"L```#HFP``*P```.R;```K````\)L``"L```#TFP``*P```/B;```"
+M````_)L``!8```"<F`````````````````````````````"<F```````````
+M``````````````````"<F`````````````````````````````"<F```````
+M``````````````````````"<F`````````````````````````````"<F```
+M``````````````````````````"<F`````````````````````````````"<
+MF`````````````````````````````"<F```````````````````````````
+M``"<F`````````````````````````````"<F```````````````````````
+M``````"<F``````X````.````#@````X````.`"<F```````````````````
+M``````````"<F`````````````````````````````"<F`````````````#`
+M````@````(````"<F```^0`$`/D`!`#_``0`_0`$`/T`!`#4F```````````
+M```$````!`````0`````F@``J0$````````$F@``Z0$``$`````(F@``*0``
+M`(`````,F@``:0```%`!```0F@``F0$``)`!```4F@``V0$``-`!```8F@``
+M&0```!`````<F@``60```$0````@F@``F0```(0````DF@``I0$``$@!```H
+MF@``Y0$``(@!```LF@``)0```,@!```PF@``R`$``!0````TF@``"````$(`
+M```XF@``2````((````\F@``B````'@!``!`F@``F`$``+@!``!$F@``V`$`
+M`/@!``!(F@``&````!(```!,F@``6````%(```!0F@``F````)(```!4F@``
+MI`$``'P!``!8F@``Y`$``+P!``!<F@``)````/P!``!@F@``9`````H```!D
+MF@``I````$H```!HF@``Y````(H```!LF@``"@$``%H!``!PF@``2@$``)H!
+M``!TF@``B@$``-H!``!XF@``R@$```X```!\F@``"@```$X```"`F@``2@``
+M`(X```"$F@``B@```%X!``"(F@``N@$``)X!``",F@``^@$``-X!``"0F@``
+M.@````D```"4F@``>@```$D```"8F@``A@$``(D```"<F@``Q@$``'D!``"@
+MF@``!@```+D!``"DF@``1@```/D!``"HF@``A@```#D```"LF@``Q@```'D`
+M``"PF@``Q@```+D```"TF@``Q@```+T!``"XF@``Q@```/T!``"\F@``Q@``
+M`#T```#`F@``Q@```'T```#$F@``Q@```+T```#(F@``Q@```/T```#,F@``
+MQ@```/T```#0F@``Q@```/T```#4F@``Q@```/T```#8F@``Q@```/T```#<
+MF@``Q@```/T```#@F@``Q@```/T```#DF@``Q@```/T```#HF@``Q@```/T`
+M``#LF@``Q@```/T```#PF@``Q@```/T```#TF@``Q@```/T```#XF@``Q@``
+M`/T```#\F@``Q@```/T```#4F```(````-28```0````%````!`````0````
+M%````-B8``!H$&``:!!@`&@08`!H$&``:!!@`)R8````````````````````
+M`````````)R8`````````````````````````````)R8````````````````
+M`````````````)R8`````````````````````````````)R8````````````
+M`````````````````)R8```````0````$````!`````0````$)R8```````$
+M````!`````0````$````!)R8`````````````````````````````)R8````
+M`````````````````````````)R8`````````````````````````````)R8
+M``````````````````H``````````)R8``#``#@`@``X`,``.`+``#@`P``X
+M`)R8```&``(`!@`"``8````&``(`!@`"`)R8``")````B0```(D```")````
+MB0```)R8``"@````H````*````"@````H````)R8```'``0`!P`$``<`!``'
+M``0`!P`$`-28```:````&@```!H````:````&@```)R8``!`````2````$``
+M``!`````0````)R8```0````$````!`````0````$````)R8```(````"```
+M``@````(````"````)R8``!/````3P```$\```!/````3P```)R8``#Q````
+M\0```&$```#Q````\0```)R8``!/D```3Y```$R0``!/D```3Y```)R8``!:
+M$@``6A(``)H2``!:$@``6A(``,R8```.````#@````\````.````#@````$`
+M``!&````8`````$```!&````80````$```!&````8@````$```!&````8P``
+M``$```!&````9`````$```!&````90````$```!&````9@````$```!&````
+M9P````$```!&````:`````$```!&````:0````$```!&````:@````$```!&
+M````:P````$```!&````;`````$```!&````=`````$```!&````=`````$`
+M``!&````=`````$```!&````=`````$```!&````=`````$```!&````=```
+M``$```!&````=`````$```!&````=`````$```!&````=0````$```!&````
+M=@````$```!&````=P````$```!&````>`````$```!&````>0````$```!&
+M````>@````$```!&````>P````$```!&````?`````$```!&````?0````$`
+M``!&````?@````$```!&````?P````$```!&````@`````$```!$````?```
+M``$```!&````B`````$```!&````C`````$```!&````D`````$```!&````
+ME`````$```!&````F`````$```!&````G`````$```!&````H`````$```!&
+M````I`````$```!&````J`````$```!&````K`````$```!&````L`````$`
+M``!&````M````)X6!@!B%@0`.A8#`!P6`@#J%0$`FA4``$H5```#%0$`610#
+M`+@+!0``````,````!6````5@```%8```!6````5@```'(```*>3C1+/$X@)
+ME1/@!*L3X!+/$X@)*)@```$``@H!``(*``$"!0$``@H!``(*-)@```X.```.
+M#@``#@X```X.```.#@``.)@```<````'````"P````L````+````2)@``&W:
+M&`!MVA@`=<H8`'7*&`!URA@`4)@``."TZ`W@M.@-X+3H#>"TZ`W@M.@-6)@`
+M`"X-@'XN#8!^+@WH?BX-Z'XN#8!^7)@``%YF-S%>9C<Q7F8W,5YF-S%>9C<Q
+M;)@``(&P#`6!L`P%@;`,!8&P#`6!L`P%%)D``-`'``#0!P``3`0``)@(``#0
+M!P``1)D``"`0N/<@$+CW$`VX]Q`0N/<0$+CW!*(`````````````"`````@`
+M```(````"*(``(AGOM:(9[[6B&<^T(AG/M"(9S[0#*(``$`!+&1``2QD8,%"
+M9&#!0F1@P4)D'*(```J`@Q@*@(,8"H!S&`J`@Q@*@(,8,!(````````(F```
+M`````"R8``#^+P(`/)@````!`@!,F```/&&$$C"9``""2```0)D```0```!8
+MF0``_P```'29````````**(``+4!```\H@``KXG($P2;```!````")L```(`
+M```,FP```P```!";```$````%)L```4````8FP``"````!R;```)````()L`
+M``H````DFP``"P```"R;```-````,)L``!`````TFP``$0```#R;```3````
+M0)L``!0```!$FP``%0```$B;```8````3)L``!D```!0FP``&@```%2;```;
+M````6)L``!P```!<FP``'0```&";```@````:)L``"(```!LFP``(P```'";
+M```D````=)L``"4```!XFP``*````'R;```I````@)L``"H```"$FP``*P``
+M`(B;```L````D)L``#````"4FP``,0```)B;```R````H)L``#0```"DFP``
+M-0```*B;```U````K)L``#4```"PFP``-0```+2;```U````N)L``#4```"\
+MFP``-0```,";```U````Q)L``#4```#(FP``-0```,R;```U````T)L``#4`
+M``#4FP``-0```-B;```U````W)L``#4```#@FP``-0```.2;```U````Z)L`
+M`#4```#LFP``-0```/";```U````])L``#4```#XFP``$````/R;```:````
+M`)H```<````'````!)H``$<```!'````")H``(<```"'````#)H``*`!``"@
+M`0``$)H``.`!``#@`0``%)H``"`````@````&)H``&````!@````')H``*$!
+M``"A`0``()H``.$!``#A`0``))H``"$````A````*)H``&$```!A````+)H`
+M`&(!``!B`0``,)H``*(!``"B`0``-)H``.(!``#B`0``.)H``"(````B````
+M/)H``&(```!B````0)H``&,!``!C`0``1)H``*,!``"C`0``2)H``.,!``#C
+M`0``3)H``",````C````4)H``&,```!C````5)H``(0!``"$`0``6)H``,0!
+M``#$`0``7)H```0````$````8)H``.H!```+````9)H``"H```!+````:)H`
+M`&H```"+````;)H``*H```"L`0``<)H``*L!``#L`0``=)H``.L!```L````
+M>)H``"L````2````?)H``&L```!2````@)H``*L```"2````A)H``*P!``"3
+M`0``B)H``.P!``#3`0``C)H``"P````3````D)H``#H```!3````E)H``'H`
+M``"3````F)H``+H```"4`0``G)H``+L!``#4`0``H)H``/L!```4````I)H`
+M`#L````Z````J)H``'L```!Z````K)H``+L```"Z````L)H``+P!``"[`0``
+MM)H``/P!``#[`0``N)H``#P````[````O)H``'P```![````P)H``+P```"[
+M````Q)H``/P```"\`0``R)H``/P```#\`0``S)H``/P````\````T)H``/P`
+M``!\````U)H``/P```"\````V)H``/P```#\````W)H``/P```#\````X)H`
+M`/P```#\````Y)H``/P```#\````Z)H``/P```#\````[)H``/P```#\````
+M\)H``/P```#\````])H``/P```#\````^)H``/P```#\````_)H``/P```#\
+M````U)@``"````#0F```"`0&`P@$!P,(!`8#"`0&`P@$!P/<F```P""@`,`@
+MH`#`(.``P"#@`,`@X`"<F```````#P````\````/````#P````^<F```````
+M``````````````````````"<F`````"`````@````(````"`````@`"<F```
+M```J````*@```"H````J````*@"<F``````!`````0````$````!`````0"<
+MF`````````````````````````````"<F``````8````&````!@````8````
+M&`"<F`````!@````8````&X```!N````;@"<F`````#'````QP```,<```#'
+M````QP"<F`````!+````2P```$L```!+````2P"<F`````!(!```2`0``$@$
+M``!(!```2`2<F`````!,````3````$P```!,````3`"<F`````#D````Y```
+M`.0```#D````Y`"<F`````````````````````````````"<F`````#\````
+M_````/P```#\````_`"<F`````#_````_P```/\```#_````_P"<F``````_
+M!```/P0``#\$```_!```/P2<F``````,````#`````P````,````#`"<F```
+M```9`@``&0(``!D"```9`@``&0*<F``````D````)````"0````D````)`"<
+MF`````"T````M````+0```"T````M`"<F`````"9````F0```)D```"9````
+MF0"<F`````!0````4````%````!0````4`"<F``````J````*@```"H````J
+M````*@"<F``````2````$@```!(````2````$@"<F``````RP```,L```#+`
+M```RP```,L"<F`````!T`0``=`$``'0!``!T`0``=`&<F``````1````$0``
+M`!$````1````$0"<F``````HA@``*(8``"B&```HA@``*(:<F`````"$,0``
+MA#$``(0Q``"$,0``A#&<F```@`#R`(``\@"``/(`@`#R`(``\@"<F```&0`G
+M`!D`)P`9`"<`&0`G`!D`)P"<F````P````,````#`````P````,```"<F```
+M``````````````````````````"<F```L@```+(```"R````L@```+(```"<
+MF```A""P`(0@L`"$(+``A""P`(0@L`"<F```I"5!`*0E00"D)4$`I"5!`*0E
+M00"<F```()(1`""2$0`@DA$`()(1`""2$0"<F````$@:``!(&@``2!H``$@:
+M``!(&@#8F```,`(+`#`""P`P`@L`,`(+`#`""P"<F```E````)0```"4````
+ME````)0```"<F```D0```)$```"1````D0```)$```"<F```$@```!(````2
+M````$@```!(```"<F```@````(````"`````@````(````"<F```V0```-D`
+M``#9````V0```-D```"<F```8````&````!@````8````&````"<F```\```
+M`/````#P````\````/````"<F```H@```*(```"B````H@```*(```"<F```
+M4@```%(```!2````4@```%(```"<F```U````-0```#4````U````-0```"<
+MF```S!0``,P4``#,%```S!0``,P4``"<F```C`0``(P$``",!```C`0``(P$
+M``#$F````P````,````#`````P````,````P````%0```!4````5````%0``
+M`!4````<@```IY.-$L\3B`F5$^`$JQ/@$L\3B`DHF````0`""@$``@H```(%
+M`0`""@$``@HTF`````X````.````#@````X````.```XF````@````(````*
+M````"@````H```!(F```;=H8`&W:&`!D:AH`9&H:`&1J&@!0F```X+3H#>"T
+MZ`W:L.@-VK"8#-JPZ`U8F```+@V`?BX-@'XN#>A^+@W(?BX-@'Y<F```7F8W
+M,5YF-S%>9C<Q7F`Y,5YF-S%LF```@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``
+MT`<``-`'``!,!```F`@``-`'``!$F0```!"X]P`0N/<`#;CW`!"X]P`0N/<$
+MH@`````````````````````````````(H@``B&>^UHAGOM:(9S[0B&<^T(AG
+M/M`,H@``0`$L`$`!+`!`P4(`0,%"`$#!0@`<H@``"H"#&`J`@Q@*@&,8"H"#
+M&`J`@Q@P$@``X`,``&"````/````&($````````<@0```````""!````````
+M)($````````H@0```````"R!````````,($````````T@0```````#B!````
+M````/($```````!`@0``J```@$2!````````")@````````LF````*```#R8
+M````!"``3)@``#PCA!)PF```'P```'28``"`````>)@```X```!8F0``_P``
+M`("9````````A)D`````@`*@F0```````."9````````Y)D``*JJJJKHF0``
+M>&1&/.R9``"J````\)D```P```#TF0``_P```/B9```4````**(``+4)```\
+MH@``KXG(DTRB```!````4*(```"@``!4H@```````%BB``"`4\<,7*(```$/
+M#P]@H@```0]I7V2B```1BD$`:*(```````!LH@``:L$P#'"B```@"((`=*(`
+M`*I\&P!XH@``SCGG''RB``#.`1<%`*,``````1@$HP```B8#,`BC```&/@=(
+M#*,```I,"U80HP``#V`:9!2C```;;D]X&*,``%I\CX8<HP``6X;/CB"C```/
+MET^=)*,``(^ASZ4HHP``'Z]?M2RC``"?N=^],*,``#_'?\TTHP``O]'_U3BC
+M````````/*,```````!`HP```````$2C````````2*,``/___S],HP``____
+M/U"C``#___\_5*,``/__`P!8HP``'ZJH>5RC```/0FP&8*,```<B*`]DHP``
+MA19@%VBC```$$8`?;*,```,,H#=PHP``@PC$/W2C```#",!7>*,``((&V%]\
+MHP``@@3@?X"C``"Z>SQ_A*,``/!_,/,$FP```0````B;```"````#)L```,`
+M```0FP``!````!2;```%````&)L```@````<FP``"0```"";```*````))L`
+M``L````LFP``#0```#";```0````-)L``!$````\FP``$P```$";```4````
+M1)L``!4```!(FP``&````$R;```9````4)L``!H```!4FP``&P```%B;```<
+M````7)L``!T```!@FP``(````&B;```B````;)L``",```!PFP``)````'2;
+M```E````>)L``"@```!\FP``*0```(";```J````A)L``"L```"(FP``+```
+M`)";```P````E)L``#$```"8FP``,@```*";```T````I)L``#4```"HFP``
+M-0```*R;```U````L)L``#4```"TFP``-0```+B;```U````O)L``#4```#`
+MFP``-0```,2;```U````R)L``#4```#,FP``-0```-";```U````U)L``#4`
+M``#8FP``-0```-R;```U````X)L``#4```#DFP``-0```.B;```U````[)L`
+M`#4```#PFP``-0```/2;```U````^)L``!````#\FP``&@````":````````
+M``````2:````````0`````B:````````@`````R:````````@0$``!":````
+M````P0$``!2:`````````0```!B:````````00```!R:````````@0```"":
+M````````:`$``"2:````````J`$``"B:````````Z`$``"R:````````*```
+M`#":````````:````#2:````````B0$``#B:````````R0$``#R:````````
+M"0```$":````````20```$2:````````B0```$B:````````D`$``$R:````
+M````T`$``%":````````$````%2:````````4````%B:````````D````%R:
+M````````D0$``&":````````T0$``&2:````````$0```&B:````````40``
+M`&R:````````D0```'":````````>`$``'2:````````N`$``'B:````````
+M^`$``'R:````````.````(":````````>````(2:````````F0$``(B:````
+M````V0$``(R:````````&0```)":````````60```)2:````````F0```)B:
+M````````V0```)R:````````^0```*":````````^0```*2:````````^0``
+M`*B:````````^0```*R:````````^0```+":````````^0```+2:````````
+M^0```+B:````````^0```+R:````````^0```,":````````^0```,2:````
+M````^0```,B:````````^0```,R:````````^0```-":````````^0```-2:
+M````````^0```-B:````````^0```-R:````````^0```.":````````^0``
+M`.2:````````^0```.B:````````^0```.R:````````^0```/":````````
+M^0```/2:````````^0```/B:````````^0```/R:````````^0```-28```@
+M````T)@```@4``((%`$""!0``@@4``((%`$"W)@``,`@H`#`(*``P"#@`,`@
+MX`#`(.``G)@``````/````#P````\````/````#PG)@`````````````````
+M````````````G)@```````,````#`````P````,````#G)@`````````````
+M````````````````G)@`````````````````````````````G)@`````````
+M````````````````````G)@`````````````````````````````G)@`````
+M````````````````````````G)@`````0$```$!```!`0```0$```$!`G)@`
+M````!64```5E```%90``!64```5EG)@`````````````````````````````
+MG)@`````````````````````````````G)@`````0@```$(```!"````0@``
+M`$(`G)@`````M0```+4```"U````M0```+4`G)@``````P````,````#````
+M`P````,`G)@`````]P```/<```#W````]P```/<`G)@`````G0```)T```"=
+M````G0```)T`G)@`````(@```"(````B````(@```"(`G)@`````(@0``"($
+M```B!```(@0``"($G)@``!@`(P`8`",`&``C`!@`(P`8`",`G)@`````*```
+M`"@`8``H`&``*`!@`"@`G)@``,``4`#``%``PP!0`,,`4`##`%``G)@``'\`
+M!`!_``0`?P`$`'\`!`!_``0`G)@``%@$``!8!```6`0``%@$``!8!```G)@`
+M````````````````````````````G)@```#`````P````,````#`````P```
+MV)@``#`"0``P`D``,`)``#`"0``P`D``G)@```!D````9````&0```!D````
+M9```G)@````(````"`````@````(````"```S)@```X````.````#@````X`
+M```.````,````!4````5````%0```!4````5````'(```*>3C1+/$X@)E1/@
+M!*L3X!+/$X@)*)@```$``@H!``(*``$"!0$``@H!``(*-)@```X.```.#@``
+M#@X```X.```.#@``.)@```<````'````"P````L````+````2)@``&'Z&`!A
+M^A@`8QH:`&,:&@!C&AH`4)@``."TF`S@M)@,VK"8#-JPF`S:L)@,6)@``"X-
+MR'XN#<A^+@W(?BX-R'XN#<A^7)@``%Y@.3%>8#DQ7F`Y,5Y@.3%>8#DQ;)@`
+M`(&P#`6!L`P%@;`,!8&P#`6!L`P%%)D``-`'``#0!P``3`0``)@(``#0!P``
+M1)D````0N/<`$+CW``VX]P`0N/<`$+CW!*(`````````````````````````
+M````"*(``(AGOM:(9[[6B&<^T(AG/M"(9S[0#*(``.#!+@#@P2X`(,$J`"#!
+M*@`@P2H`'*(```J`@Q@*@(,8"H!C&`J`@Q@*@(,8`*,``````1@```$8```!
+M&````1@```$8!*,```(F`S`")@,P`B8#,`(F`S`")@,P"*,```8^!T@&/@=(
+M!CX'2`8^!T@&/@=(#*,```I,"U8*3`M6"DP+5@I,"U8*3`M6$*,```]@&F0/
+M8!ID#V`:9`]@&F0/8!ID%*,``!MN3W@;;D]X&VY/>!MN3W@;;D]X&*,``%I\
+MCX9:?(^&6GR/AEI\CX9:?(^&'*,``%N&SY!;AL^06X;/CEN&SXY;AL^.(*,`
+M``^73YT/ET^=#Y=/FP^73YL/ET^;)*,``(^CSZ>/H\^GCY_/HX^?SZ./G\^C
+M**,``!^O7[4?KU^U'Z]?LQ^O7[,?KU^S+*,``)^YW[V?N=^]G[G?NY^YW[N?
+MN=^[,*,``#_%?\L_Q7_+/\=_RS_'?\L_QW_+-*,``+_1_]6_T?_5O]'_T[_1
+M_]._T?_3,!(``.`#``!H0```$````&"````/````G(````````"@@```````
+M`!B!````````'($````````@@0```````"2!````````*($````````L@0``
+M`````#"!````````-($````````X@0```````#R!````````0($``/D#`(!$
+M@0````````B8````````+)@```"@```\F`````0@`$R8```\(X02<)@``!\`
+M``!TF```@````'B8```.````6)D``/\?"`"`F0```````(29`````(`"H)D`
+M``````#@F0```````.29``"JJJJJZ)D``'AD1CSLF0``J@```/"9```,````
+M])D``/\```#XF0``%````"BB``"U"0``/*(``*^)R)-,H@```0```%"B````
+MH```5*(```````!8H@``@%/'#%RB```!#P\/8*(```$/:5]DH@``$8I!`&BB
+M````````;*(``&K!,`QPH@``(`B"`'2B``"J?!L(>*(``,XYYQQ\H@``S@$7
+M!3BC````````/*,```````!`HP```````$2C````````2*,``/___S],HP``
+M____/U"C``#___\_5*,``/__`P!8HP``'ZJH>5RC```/0FP&8*,```<B*`]D
+MHP``A19@%VBC```$$8`?;*,```,,H#=PHP``@PC$/W2C```#",!7>*,``((&
+MV%]\HP``@@3@?X"C``"Z>SQ_A*,``/!_,/,$FP```0````B;```"````#)L`
+M``,````0FP``!````!2;```%````&)L```@````<FP``"0```"";```*````
+M))L```L````LFP``#0```#";```0````-)L``!$````\FP``$P```$";```4
+M````1)L``!4```!(FP``&````$R;```9````4)L``!H```!4FP``&P```%B;
+M```<````7)L``!T```!@FP``(````&B;```B````;)L``",```!PFP``)```
+M`'2;```E````>)L``"@```!\FP``*0```(";```J````A)L``"L```"(FP``
+M+````)";```P````E)L``#$```"8FP``,@```*";```T````I)L``#4```"H
+MFP``-0```*R;```U````L)L``#4```"TFP``-0```+B;```U````O)L``#4`
+M``#`FP``-0```,2;```U````R)L``#4```#,FP``-0```-";```U````U)L`
+M`#4```#8FP``-0```-R;```U````X)L``#4```#DFP``-0```.B;```U````
+M[)L``#4```#PFP``-0```/2;```U````^)L``!````#\FP``&@````":````
+M``````````2:``!`````0`````B:``"`````@`````R:``"A`0``80$``!":
+M``#A`0``H0$``!2:```A````X0$``!B:``!A````(0```!R:``"(`0``80``
+M`"":``#(`0``B`$``"2:```(````R`$``"B:``!(````"````"R:``"(````
+M2````#":``"I`0``B````#2:``#I`0``:0$``#B:```I````J0$``#R:``!I
+M````Z0$``$":``#0`0``*0```$2:```0````:0```$B:``!0````D`$``$R:
+M``"0````T`$``%":``"Q`0``$````%2:``#Q`0``4````%B:```Q````D```
+M`%R:``!Q````<0$``&":``"X`0``L0$``&2:``#X`0``\0$``&B:```X````
+M,0```&R:``!X````<0```'":``"9`0``F`$``'2:``#9`0``V`$``'B:```9
+M````&````'R:``!9````6````(":``"9````F````(2:``#9````>0$``(B:
+M``#Y````N0$``(R:``#Y````^0$``)":``#Y````.0```)2:``#Y````>0``
+M`)B:``#Y````N0```)R:``#Y````^0```*":``#Y````^0```*2:``#Y````
+M^0```*B:``#Y````^0```*R:``#Y````^0```+":``#Y````^0```+2:``#Y
+M````^0```+B:``#Y````^0```+R:``#Y````^0```,":``#Y````^0```,2:
+M``#Y````^0```,B:``#Y````^0```,R:``#Y````^0```-":``#Y````^0``
+M`-2:``#Y````^0```-B:``#Y````^0```-R:``#Y````^0```.":``#Y````
+M^0```.2:``#Y````^0```.B:``#Y````^0```.R:``#Y````^0```/":``#Y
+M````^0```/2:``#Y````^0```/B:``#Y````^0```/R:``#Y````^0```-28
+M```@````T)@```@````(````"`````@````(````W)@``,``H`#``*``P`#@
+M`,``X`#``.``G)@``````#,````S````,P```#,````SG)@```````$````!
+M`````0````$````!G)@`````````````````````````````G)@`````````
+M````````````````````G)@`````````````````````````````G)@`````
+M`!\````?````'P```!\````?G)@`````````````````````````````G)@`
+M````N````+@```"X````N````+@`G)@`````MP```+<```"W````MP```+<`
+MG)@`````A````(0```"$````A````(0`G)@`````F````)@```"8````F```
+M`)@`G)@`````P````,````#`````P````,``G)@`````_P```/\```#_````
+M_P```/\`G)@`````_P```/\```#_````_P```/\`G)@`````_P```/\```#_
+M````_P```/\`G)@`````_P```/\```#_````_P```/\`G)@`````UP```-<`
+M``#7````UP```-<`G)@`````80```&$```!A````80```&$`G)@`````_@``
+M`/X```#^````_@```/X`G)@`````W@```-X```#>````W@```-X`G)@`````
+M?P```'\```!_````?P```'\`G)@`````/00``#T$```]!```/00``#T$G)@`
+M````=P```'<```!W````=P```'<`G)@`````1````$0```!$````1````$0`
+MG)@`````F````)@```"8````F````)@`G)@``(``$`"``!``@``0`(``$`"`
+M`!``G)@``#3`!0`TP`4`-,`%`#3`!0`TP`4`G)@``/``,0#P`#$`\``Q`/``
+M,0#P`#$`G)@``!\!#``?`0P`'P$,`!\!#``?`0P`G)@``$``40!``%$`0`!1
+M`$``40!``%$`G)@``-H`4`#:`%``V@!0`-H`4`#:`%``G)@`````````````
+M````````````````G)@``$1```!$0```1$```$1```!$0```G)@`````````
+M````````````````````G)@``,!@``#`8```P&```,!@``#`8```G)@````L
+M````+````#8````V````+```R)@```,$```#!````P0```,$```#!```G)@`
+M``!D````9````&0```!D````9```G)@````(````"`````@````(````"```
+MS)@```X````.````#@````X````.````05(U,C$P``!!4C4R,3$``$%2-3(Q
+M,@``4D8U,3$Q``!21C4Q,3(``%)&,C0Q,P``4D8U-#$S``!214=/4%-?1E5.
+M0P!!=&AE<F]S(#(S,3,@5VE3;T,``$%T:&5R;W,@-30R-"\R-#(T````071H
+M97)O<R`R,S$W(%=I4V]#``!!=&AE<F]S(#4R,3(@*$901T$I`$%T:&5R;W,@
+M-3(Q,2`H1E!'02D`071H97)O<R`U,C$P`````$%T:&5R;W,@-3(Q,0````!!
+M=&AE<F]S(#4S,3(@5VE3;T,``$%T:&5R;W,@,C,Q-2!7:5-O0P``071H97)O
+M<R`U,C$R`````#`N.2XR,"XS```````````(````$````!@````@````*```
+M`#`````X````````````_P'_`0````````````#_________?P`````#`)@!
+MF0$`````````````_________W\`````!P"8`3`+`````````````/______
+M__]_``````@`F`$P#`````````````#_________?P`````@`"`!$`H`````
+M````````_________W\`````(0`@`9D!`````````````/________]_````
+M`"(`(`$P#`````````````#_________?P`````Z`&`!$`H`````````````
+M_________W\`````.P!@`9D!`````````````/________]_`````!(`90$0
+M"@```P````````#_________?P`````W`#`!F0$```,`````````________
+M_W\`````-0`P`ID!```#`````````/________]_`````#8`,`.9`0```P``
+M``````#_________?P`````P`#`$F0$```,`````````_________W\`````
+M.0`P!9D!```#`````````/________]_`````#0`,`:9`0```P````````#_
+M________?P`````R`#`#F0$```,`````````_________W\`````,0`P`YD!
+M`````````````/________]_`````!$`$`&9`0````````````#_________
+M?P`````0`!`!$`H`````````````_________W\`````4@!0`9D!````````
+M`````/________]_`````$4`4`*9`0````````````#_________?P````!'
+M`%`#F0$`````````````_________W\`````0@!0!)D!`````````````/__
+M______]_`````%@`4`69`0````````````#_________?P````!;`%`&F0$`
+M````````````_________W\`````70!0")D!`````````````/________]_
+M`````%X`4`F9`0````````````#_________?P````!0`%`#$`H`````````
+M````_________W\`````50!0`3`,`````````````/________]_`````%8`
+M4`(P#`````````````#_________?P````!)`%`"4`T`````````````____
+M_____W\`````0`!``4`*``!&````!````"@`````````B`$``$$`0`%`"@``
+M1P````0```!H`````````(D!``!(`$`!$`H``$8````$````"`````````"*
+M`0``2@!``4`*``!&````!`````@8````````C`$``$L`0`%`"@``1@````0`
+M```(8````````(T!``!,`$`!4`H``$8````$````"`````````"/`0``0P!`
+M`D`*``!'````!````'``````````BP$``/``0`-`"@``1@````0````@````
+M``````````"``$`#0`H``$<````$````8`````````"G#P``\0!``T`*``!&
+M````!``````8`````````````($`0`-`"@``1@````0`````8````````*@/
+M``""`$`#4`H``$8````$``````````````"I#P``\@!``Q`*``!&````!```
+M`````````````````(,`0`1`"@``1P````0```!@@````````*H/``#T`$`$
+M0`H``$8````$`````)@`````````````A`!`!$`*``!&````!`````#@````
+M````JP\``(4`0`10"@``1@````0`````@````````*P/``#U`$`$$`H``$8`
+M```$`````(``````````````A@!`!4`*``!'````!````&"`````````K0\`
+M`(<`0`5`"@``1@````0`````X````````*X/``"(`$`%4`H``$8````$````
+M`(````````"O#P``B0!`!D`*``!'````!````&@`````````L`\``(H`0`9`
+M"@``1@````0````(8````````+$/``"+`$`&4`H``$8````$````"```````
+M``"R#P``C`!`!T`*``!'````!````&B`````````LP\``(T`0`=`"@``1@``
+M``0````(X````````+0/``".`$`'4`H``$8````$````"(````````"U#P``
+MCP!`"$`*``!'````!````&B`````````M@\``)``0`A`"@``1@````0````(
+MX````````+</``"1`$`(4`H``$8````$````"(````````"X#P``]@!`"4`*
+M``!'````!````&"``````````````/<`0`M`"@``1P````0```!@@```````
+M``````!@`&``8```````````````_________W\`````80!A`&$````#````
+M`````/________]_`````&(`8@!B`````@````````#_________?P````!C
+M`&,`8P``````````````_________W\`````9`!D`&0````#`````````/__
+M______]_`````&4`90!E`````P````````#_________?P````!F`&8`9@``
+M````````````_________W\`````9P!G`&<``````````````/________]_
+M`````&@`:`!H``````````````#_________?P````!I`&D`:0````,`````
+M````_________W\`````:@!J`&H````#`````````/________]_`````&4`
+M```!````_____X````#_____`````$I0``"T#P````````````!J`````0``
+M`/____^`````_____P````!*4```M`\`````````````_P$```$````!````
+M`0```%@;`````!```0````$````!````6!L```@``P`!``````````$```!8
+M&P``#``#``$``````````0```%@;```@`$<`````````````````6!L``#,`
+M,``!``````````$```!8&P``)``A``$````!`````0```%@;```H`#<``0``
+M```````!````6!L``!\`,``!`````0````$```!8&P``,`!;``$`````````
+M`0```%@;``!P``,``0`````````!````6!L``#@`-P`!``````````$```!8
+M&P``5`!5``$````!`````0```%@;``!$`%4``0````$````!````6!L``$P`
+M.P`!``````````````!8&P``8`!2``$````!`````0```%@;``!D`#0``0``
+M```````!````6!L``'P`(``!`````0````$```!8&P``F`!;``$````!````
+M`0```%@;``"<`%(``0````$````!````6!L``*H`$``!``````````$```!8
+M&P``O``#``$``````````0```%@;``"_`#8``0`````````!````6!L``,0`
+M-P`!`````0````$```!8&P``RP`W``$``````````0```%@;``#0`#<``0``
+M```````!````6!L``-8`$``!`````0````$```!8&P``V@`#````````````
+M`````%@;```R`S8``0`````````!````6!L``-X``P`!``````````$```!8
+M&P``Z0`W``$``````````0```%@;``#V`#<``0`````````!````6!L``/H`
+M-P`!``````````$```!8&P``_P`V``$``````````0```%@;```,`3```0``
+M``$````!````6!L``!0!-P`!``````````$```!8&P``+`$W``$`````````
+M`0```%@;``!``1```0````$````!````6!L``%0!`P`!``````````$```!8
+M&P``6`$A``$````!`````0```%@;``!<`3<``0`````````!````6!L``&`!
+M-P`!``````````$```!8&P``9`%;``$``````````0```%@;``!H`5(``0``
+M```````!````6!L``&P!4@`!`````0````$```!8&P``=`$W``$`````````
+M`0```%@;``!X`0,``0`````````!````6!L``'P!-P`!``````````$```!8
+M&P``B`%```$``````````````%@;``")`4$``0``````````````6!L``(H!
+M2``!``````````````!8&P``BP%#``$``````````````%@;``",`4H``0``
+M````````````6!L``(T!2P`!``````````````!8&P``CP%,``$`````````
+M`````%@;``"G#X```0``````````````6!L``*@/@0`!``````````````!8
+M&P``J0^"``$``````````````%@;``"J#X,``0``````````````6!L``*L/
+MA``!``````````````!8&P``K`^%``$``````````````%@;``"M#X8``0``
+M````````````6!L``*X/AP`!``````````````!8&P``KP^(``$`````````
+M`````%@;``"P#XD``0``````````````6!L``+$/B@`!``````````````!8
+M&P``L@^+``$``````````````%@;``"S#XP``0``````````````6!L``+0/
+MC0`!``````````````!8&P``M0^.``$``````````````%@;``"V#X\``0``
+M````````````6!L``+</D``!``````````````!8&P``N`^1``$`````````
+M`````%@;``"0`4(``0`````````!````6!L``(X!`P`!``````````$```!8
+M&P``F`%%``$````!`````0```%@;``":`44``0``````````````6!L``)L!
+M10`!``````````````!8&P``G`%>``$``````````````%@;``">`0,``0``
+M```````!````6!L``*P!-P`!``````````$```!8&P``I@$#``$`````````
+M`0```%@;``"V`3<``0`````````!````6!L``+@!-P`!``````````$```!8
+M&P``N@$W``$``````````0```%@;``"^`2$``0````$````!````6!L``"<#
+M`P`!``````````$```!8&P``R@%=``$``````````````%@;``#6`3<``0``
+M```````!````6!L``.0!$``!`````0````$```!8&P``[`$P``$````!````
+M`0```%@;``#X`0,``0`````````!````6!L``!`"-P`!``````````$```!8
+M&P``*@(B``$``````````0```%@;``!"`C<``0`````````!````6!L````"
+M6P`!``````````$```!8&P``2@(#``$``````````0```%@;``!/`A```0``
+M``$````!````6!L``%P"4@`!``````````$```!8&P``8`([``$````!````
+M`0```%@;``!H`C<``0`````````!````6!L``&P"-P`!``````````$```!8
+M&P``=@(0``$````!`````0```%@;``!Z`@,``0`````````!````6!L``(("
+M`P`!``````````$```!8&P``@P(#``$``````````0```%@;``"J`B$``0``
+M```````!````6!L``+X"6P`!`````0````$```!8&P``OP(W``$`````````
+M`0```%@;``#!`C<``0`````````!````6!L``,8".P`!``````````$```!8
+M&P``U`(W``$``````````0```%@;``#P`C<``0`````````!````6!L``/0"
+M-P`!``````````$```!8&P``^`(#``$``````````0```%@;``">`%```0``
+M``$````!````6!L``/P"`P`!``````````$```!8&P``#`,P``$`````````
+M`0```%@;```4`S8``0`````````!````6!L``!@#-@`!``````````$```!8
+M&P``)`,#``$``````````0```%@;```0`P,``0`````````!````6!L``#H#
+M-P`!``````````$```!8&P``2`,0``$````!`````0```,$6``!*`Q(``0``
+M``$````!````6!L``%H#$0`!``````````$```!8&P``7`,Z``$````!````
+M`0```%@;``!>`U8``0`````````!````6!L``,`"`P`!``````````$```!8
+M&P``=P,#``$``````````0```%@;``#,`@,``0`````````!````6!L``#,3
+M/1,7``H%```````````0`````````!````!'$U$3%P`*!0``````````$```
+M```````0````.!-T$Q<`%!0``````````!``````````!P```$X3>Q,;!@4%
+M```````````!``````````````!1$WD3'@8*!0```````````0``````````
+M````5A-T$R$&%`4```````````$``````````````*L3L!,7``H%````````
+M```0``````````P```"P$]@3%P`4%```````````$``````````"````OQ._
+M$Q<`"@4``````````!``````````#``````4>!0%!A04````````````````
+M```````````R%&X4%P`4%```````````&``````````!````,A1N%!0`%!0`
+M`````````!@``````````0```#P4>!0/`!04```````````%````````````
+M```\%'@4$084%````````````0`````````!````/!1X%!(`%!0`````````
+M``4``````````````#P4>!04`!04```````````%```````````````\%'@4
+M%P`4%```````````!0``````````````/!1X%!<&%!0```````````$`````
+M`````````#P4R!04!A04`@`````````$``````````````!X%*`4%P`4%`$`
+M````````!0``````````````C!2@%!<`%!0#``````````4`````````````
+M`(P4R!02`!04`P`````````%``````````````",%,@4%``4%`<`````````
+M!8``````````````C!3(%!0&%!0#``````````$``````````@```(P4R!07
+M!A04`P`````````!``````````(```",%,@4%P84%`,``````````0``````
+M````````C!3(%!X`%!0``````````````````````````(P41!8%!A04`P``
+M``````````````````````"@%,@4$084%`,``````````0``````````````
+M?!7T%1X&%!0"``````````0``````````````'P51!84!A04`P`````````!
+M``````````0```!\%406&P`4%`,`````````!0``````````````?!5$%AX`
+M%!0#``````````4``````````````'P51!87`!04!P`````````!@```````
+M``````!Q%JT6%P`4%```````````````````````````<1:M%AX&%!0`````
+M`````````````````````'$6K18>!A04`@`````````$``````````````!Q
+M%L$6!084%```````````````````````````<1;!%A$`%!0`````````````
+M`````````````'$6P184`!04``````````````````````````!Q%L$6'@`4
+M%```````````````````````````<1;!%AX&%!0`````````````````````
+M`P```'$6P18>!A04```````````````````````````X$W03'@`4%```````
+M``````0`````````````L!/8$QX`%!0````````````$`````````````#(4
+M;A0>`!04`P``````````!``````````````\%'@4'@`4%`,```````````0`
+M````````````C!3(%!X`%!0#```````````$`````````````'$6P18>`!04
+M````````````!`````````````!\%406'@`4%`,```````````0`````````
+M````C!3(%!X`%!0``````````````````````````#P4>!0>`!04````````
+M``````````````````#!%L$6'@`4%`````````````0`````````````"A1:
+M%`4&*"@``````````````````````````((4TA0%!B@H`0``````````````
+M``````````#Z%'(5!08H*```````````````````````````FA42%@4&*"@!
+M`````````````````````````!X41A0%!B@H````````````````````````
+M``!N%+X4!08H*`$`````````````````````````YA1>%04&*"@`````````
+M`````````````````(85)A8%!B@H`0````````````````````````!0%'@4
+M$08H*```````````````````````````4!1X%!<&*"@`````````````````
+M`````````%H46A01!B@H``````````````````````````!:%%H4%P`H*```
+M````````````````````````H!2@%!<&*"@!``````````(`````````````
+M`*`4H!04!B@H`0`````````"``````````````""%((4$0`H*`$`````````
+M`@``````````````JA2J%!0`*"@!``````````(``````````````((4JA04
+M`"@H`0`````````"``````````````""%*H4%P8H*`$``````````@``````
+M````````I!4<%A0&*"@!``````````(``````````````(`6J!84`"@H````
+M``````````````````````"`%J@6'@8H*```````````````````````````
+MA1:M%AX&*"@``````````````````````````%H4@A0/`"@H`P``````````
+M!`````````````"J%*H4$@`H*`,```````````0`````````````I!4<%A0`
+M*"@#```````````$`````````````(`6J!84`"@H````````````!```````
+M```````("40)!084!0``````````````````````````"`E$"10`%`4`````
+M`````````````````````&P)J`D%!A0%``````````````````````````!L
+M":@)%``4!0``````````(```````````````;`FH"1X`%`4`````````````
+M`````````````&P)G@D;!A0%``````````````````````````!L"9X)%``4
+M!0``````````(```````````````@`F*"10`%`4`````````````````````
+M`````)D)J`D4`!0%``````````````````````````"C":@)%``4!0``````
+M````("``````````````M`FT"04&%`4``````````````````````````+0)
+MM`D4`!0%```````````@*`````````````#0":P*!084!0``````````````
+M````````````"`E$"10`%`4``````````````````````````&P);`D4`!0%
+M``````````````````````````!Q"8`)%``4!0``````````````````````
+M````A0F*"10`%`4``````````````````````````(\)F0D4`!0%````````
+M``````````````````">"9X)%``4!0``````````````````````````HPFC
+M"10`%`4````````````$``````"``````*,)HPD4`!0%````````````````
+M````@`````"H":@)%``4!0````````````0``````(``````J`FH"10`%`4`
+M``````````````````"``````+0)M`D4`!0%````````````!```````@```
+M``"T";0)%``4!0```````````````````(``````"`E$"04&%`4`````````
+M``````````````````@)1`D4`!0%``````````````````````````!L":@)
+M!084!0``````````````````````````;`FH"10`%`4``````````$``````
+M`````````&P)J`D>`!0%``````````````````````````!L"9X)&P84!0``
+M````````````````````````;`F>"10`%`4``````````$``````````````
+M`(`)B@D4`!0%``````````````````````````"9":@)%``4!0``````````
+M````````````````T`FL"@4&%`4``````````````````````````*,)J`D4
+M`!0%```````````@(``````````````("40)%``4!0``````````````````
+M````````;`EL"10`%`4``````````````````````````'$)@`D4`!0%````
+M``````````````````````"%"8H)%``4!0``````````````````````````
+MCPF9"10`%`4``````````````````````````)X)G@D4`!0%````````````
+M``````````````"C":,)%``4!0````````````0``````(``````HPFC"10`
+M%`4```````````````````"``````*@)J`D4`!0%````````````!```````
+M@`````"H":@)%``4!0```````````````````(``````"`E$"04&*"@`````
+M`````````````````````(4)A0D%!B@H``````````````````````````"%
+M"84)%`8H*```````````````````````````A0F%"1(&*"@````````````$
+M`````````````-`)K`H%!B@H``````````````````````````#_`1```0``
+M`````````````````````````@`((```````````````_P``````````````
+M```````1)``````````````````%%```````````````````!0(`````````
+M`````````!,```````````````````!0`1``````````````````````````
+M``````````$`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````!0`A``````````````````````````````````!```````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!0`Q``````
+M```````````````````````````0"```````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````!0!!``````````````````````````
+M````@```@```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````!0!1``````````````````````````````````0```````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!0!C```@``
+M```````#````````````````@$``@`````````````````@)````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````!0"#````````````````````````,`
+M```````$``$`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````!0"3```@`````````$``````````,```````0@$```````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````P`3```@``
+M```````$``````````,``````$"````(````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````P`C```@`````````$``````````,`
+M````0```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````P`S```@`````````$``````````,``````$`````(````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````P!#```@``
+M```````$``````````,`````0"``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````P!3```@`````````$``````````,`
+M````$```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````P!C```@`````````$``````````,``````!$``0``````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````0`1``````
+M````````````````````````(``!``(```````````````02````````````
+M```````1(```````````````````````````````````````````````````
+M```````````````````````````````@`1``````````````````````````
+M``````("``0````````````````````````````````````2(```````````
+M````````````````````````````````````````````````````````````
+M``````````!@`1```0`````````#````````````````((!```(`````````
+M`````,00```````````````````A!```````````````````````````````
+M``````````````````````````````````````````````````!E`1```0``
+M```````#```````````````X````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````!``4`````````````(``````````(`
+M````!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````!``D`````````````0``````````(```#'!0``````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!``T``````
+M````````@`````````(`````@```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````!`!$``!```````````@`````````(`
+M````@$``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````!`!4``!```````````@`````````(`````@$```@``````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!`!D``````
+M```````(``````````(`````B```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````!`!T``!``````````(@`````````(`
+M````A$``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````!`"$``!``````````(@`````````(`````A$```@``````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!`"4``````
+M````````@`````````(```#'@0``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````!`"T``!```````````@`````````(`
+M``#'@4``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````!0#?\`````````````````````````````````````````````
+M```````````````````````````````````````````````*````````````
+M````````"@`````````````````````````````````````````P"O\`````
+M``````"```````````,`````````````````````````````````````````
+M`````````````````````````````0````````````````````$`````````
+M``````````0````````````````````P"S```````````````0````````,`
+M````````````````````````````````````````````````````````````
+M``````"`````````````````````@`````````````````````0`````````
+M```````````P##```````````````@````````,`````````````````````
+M```````````````````````````````````````````````0````````````
+M````````$`````````````````````0````````````````````0"A``````
+M````````````````````````````````````````````````````````````
+M```````````````````````````@````````````````````(```````````
+M``````````0```````````````````!`"D````````````!@>`````````(`
+M````````````````````````````````````````````````````````````
+M``````!`"@``````````````````0`0```````````````````0`````````
+M``````````!0"D``````````````````````````````````````````````
+M```````````````````````````````````````````````(````````````
+M````````"`````````````````````0```````````````````"9`3``````
+M````````````````````````````````````````````````````````````
+M```````````````````````````(````````````````````"```````````
+M``````````0```````````````````!@`/\``P``````````!`````````@`
+M`````````.`#``````````````#``@``````````````````````````````
+M````````P*\``````````````````/`+``````````````````@`````````
+M``````````!F`/\``P``````````!`````````@``````````.`#````````
+M``````#``@``````````````````````````````````````P`<`````````
+M`````````/`!``````````````````@```````````````````!G`/\``P``
+M````````!`````````@``````````.`#``````````````#``@``````````
+M````````````````````````````P"\``````````````````/`+````````
+M``````````@```````````````````!H`/\``P``````````!`````````@`
+M`````````.`#``````````````#``@``````````````````````````````
+M````````P%<``````````````````/`5``````````````````@`````````
+M``````````!A`/\``P``````````!````````!```````````.`#````````
+M````````````````````````````````````````````````P*\`````````
+M`````````/`+``````````````````@```````````````````!B`/\``P``
+M````````!````````!```````````.`#``````````````#``@``````````
+M````````````````````````````P*\``````````````````/`+````````
+M``````````@```````````````````!C`/\``P``````````!`````````@`
+M`````````.`!``````````````#``@``````````````````````````````
+M````````P"\``````````````````/`+``````````````````@`````````
+M``````````!D`/\``P``````````!````````!``````````"``<````````
+M``````#``@``````````````````````````````````````P`<`````````
+M`````````/`!``````````````````@```````````````````!E`/\``P``
+M````````!````````!```````````(0(````````````````````````````
+M````````````````````````````P%<``````````````````/`5````````
+M``````````@```````````````````!I`/\``P``````````!````````!``
+M`````````,`#``````````````#``@``````````````````````````````
+M````````P`<``````````````````/`!``````````````````@`````````
+M``````````!J`/\``P``````````!````````!```````````,`#````````
+M````````````````````````````````````````````````P"\`````````
+M`````````/`+``````````````````@```````````````````"8`?\`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````!``/``\P```(B!\`#S````00"``(,`
+M``")@8``@P```$@`\@#U````BH'R`/4```!#`/8`]P```(N!]@#W````2@#Q
+M`/0```",@?$`]````$L`@0"$````C8&!`(0```!,`((`A0```(^!@@"%````
+MB`'P`/,```")`8``@P```(H!\@#U````BP'V`/<```",`?$`]````(T!@0"$
+M````CP&"`(4````(````````````````````````````````````````````
+M```!`G`7"P",```````!`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D
+M`@`````!`L!="0"P!``````!`J",#0!(!``````!`H"["`!@!``````!`O#2
+M#`!L!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(````````````````````````
+M```````````````````````!`W`7"P",```````!`R@C#P`2```````!`^`N
+M"@"8`@`````!`U!&#@`D`@`````!`\!="0"P!``````!`Z",#0!(!``````!
+M`X"["`!@!``````!`_#2#`!L!```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````(````
+M```````````````````````````````````````````!`G`7"P",```````!
+M`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D`@`````!`L!="0"P!```
+M```!`J",#0!(!``````!`H"["`!@!``````!`O#2#`!L!```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````(````````````````````````````````````````````
+M```!`W`7"P",```````!`R@C#P`2```````!`^`N"@"8`@`````!`U!&#@`D
+M`@`````!`\!="0"P!``````!`Z",#0!(!``````!`X"["`!@!``````!`_#2
+M#`!L!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````$````````````````````````
+M```````````````````````!`.@#"P""```````!`-`'"@2$`0`````!`'P5
+M"02+`0`````!`/@J"`26`0``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````$H@``
+M```````````(H@``1D8^4$9&/E`,H@``;$&`9&Q!@&00H@```Z"9`0.@F0$4
+MH@``$-9,!!#63`08H@``0`"`$T``@!,<H@``8`#@&V``X!L@H@``"H!3#`J`
+M4PPDH@``.]\4`#O?%``HH@``M0$``+4!```LH@``(````"````"<F```````
+M``````"<F`````````````"<F`````````````"<F`````````````"<F```
+M``````````"<F`````````````"<F`````````````"<F`````````````"<
+MF`````````````"<F`````````````"<F`````````````"<F``````X````
+M.`"<F`````````````"<F`````````````"<F`````````````"<F```^0`$
+M`/D`!`#4F`````````0```"<F`````````````"<F`````````````"<F```
+M``````````"<F`````````````"<F`````````````"<F```````$````!"<
+MF```````!`````2<F`````````````"<F`````````````"<F```````````
+M``"<F`````````````J<F```@``X`(``.`*<F```!@`"``8```"<F```D@``
+M`)(```"<F```H````*````"<F```!P`$``<`!`#4F```&@```!H```"<F```
+M2````$@```"<F```$````!````"<F```"`````@```"<F```#P````\```"<
+MF```\@```&(```"<F```3Y```$R0``"<F```6A(``)H2``#,F```#@````\`
+M```(```````````````````````````````````````````````!`G`7"P",
+M```````!`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D`@`````!`L!=
+M"0"P!``````!`J",#0!(!``````!`H"["`!@!``````!`O#2#`!L!```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````(````````````````````````````````````
+M```````````!`K@+"P"&```````!`I01#P`)```````!`G`7"@",`@`````!
+M`B@C#@`2`@`````!`N`N"0"8!``````!`E!&#0`D!``````!`L!="``P!```
+M```!`GAI#``V!```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````(````````````````
+M```````````````````````````````!`MP%"P"#```````!`LH(#P`$````
+M```!`K@+"@"&`@`````!`I01#@`)`@`````!`G`7"0",!``````!`B@C#0`2
+M!``````!`N`N"``8!``````!`KPT#``;!```````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```'```````````````````````````````````````````````!`W`7"P",
+M```````!`^`N"@"8`@`````!`U!&#@`D`@`````!`\!="0"P`P`````!`Z",
+M#0!(`P`````!`X"["`!@`P`````!`_#2#`!L`P``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````(````````````````````````````````````
+M```````````!`W`7"P",```````!`R@C#P`2```````!`^`N"@"8`@`````!
+M`U!&#@`D`@`````!`\!="0"P!``````!`Z",#0!(!``````!`X"["`!@!```
+M```!`_#2#`!L!```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````$````````````````
+M```````````````````````````````!`.@#&P""```````!`-`'&@2$`0``
+M```!`'P5&02+`0`````!`/@J&`26`0``````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```,```````````````````````````````````````````````!`.@#&P""
+M```````!`-`'&@2$`0`````!`'P5&02+`@`````!`/@J&`26`P```````G`7
+M"P`,!````````B@C#P`2!``````!`N`N"@`8!@`````!`E!&#@`D!@`````!
+M`L!="0`P"``````!`J",#0!("``````!`H"["`!@"``````!`O#2#`!L"```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````-````````````````````````````````````
+M```````````!!/H``P"!`&0"9`(!!/0!!P"!`,D!R0$!!.@#`@""`>0`Y``!
+M!-`'!@"$`J``H``!!+@+`0"&`XP`C``!`G`7"P",!#P`/``!`B@C#P`2!#P`
+M/``!`N`N"@"8!C``,``!`E!&#@`D!C``,``!`L!="0`P""P`+``!`J",#0!(
+M""P`+``!`H"["`!@""P`+``!`O#2#`!L""P`+```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``+G-Y;71A8@`N<W1R=&%B`"YS:'-T
+M<G1A8@`N<F5L+G1E>'0`+G)E;"YR;V1A=&$`+G)O9&%T82YS='(Q+C0`+G)E
+M;"YD871A`"YB<W,`+F-O;6UE;G0`````````````````````````````````
+M`````````````````````!\````!````!@`````````T````+!$"````````
+M````!``````````;````"0``````````````K!H#`'B5```+`````0````0`
+M```(````*0````$````"`````````&`1`@#$A0`````````````$````````
+M`"4````)```````````````DL`,`@`D```L````#````!`````@````Q````
+M`0```#(`````````))<"```!``````````````0````!````1`````$````#
+M`````````"28`@"84``````````````$`````````$`````)````````````
+M``"DN0,`0`````L````&````!`````@```!*````"`````,`````````O.@"
+M`)@!``````````````0`````````3P````$``````````````+SH`@"H`P``
+M```````````!`````````!$````#``````````````!D[`(`6```````````
+M`````0`````````!`````@``````````````Q.X"`-`9```,````!P````0`
+M```0````"0````,``````````````)0(`P`6$@`````````````!````````
+M```````````````````````````````````````#``$`````````````````
+M`P`#``````````````````,`!0`````````````````#``8`````````````
+M`````P`(``````````````````,`"0`!````]*<``+`````2``$`#````."2
+M```(````$@`!`!<```#,-P$`A`(``!(``0`B````8'```)P````2``$`+0``
+M`%A4`0!P`@``$@`!`#@``````````````!````!"````6``!`%`````2``$`
+M30```#QA`0"@`0``$@`!`%@```!08@``:`$``!(``0!C````\*X!`"P!```2
+M``$`;@```,@X``"D`0``$0`&`'D```"</@$`/````!(``0"$````?&4``$``
+M```2``$`CP```)14``#L````$@`!`)H```!D2```I`$``!$`!@"E````O"\!
+M`$`````2``$`L````%0J`0`@````$@`!`+L````4'0$`$````!(``0#&````
+M+/\``"@!```2``$`T0```)P,`0`0`0``$@`!`-P```!4"P``K````!(``0#G
+M````K.\``,`````2``$`\@```'C4``#(````$@`!`/T```!,N```C````!(`
+M`0`(`0``M+T``!@````2``$`$P$``/R7``!$````$@`!`!X!```X-`$`2```
+M`!(``0`I`0``P/T```@````2``$`-`$``+09`0`H````$@`!`#\!``#(5@$`
+MT````!(``0!*`0``)`@``%`````2``$`50$``#`#`0`<`0``$@`!`&`!``#(
+MK```"````!(``0!K`0``@)L!`)@!```2``$`=@$``%"<```(````$@`!`($!
+M``#,O0``'````!(``0",`0``$!```)0!```2``$`IP$``'A#``"D`0``$0`&
+M`+(!``"T*P$`G````!(``0"]`0``*)D``(0````2``$`R`$``,P#```P````
+M$@`!`-,!```DGP$`@````!(``0#>`0`````````````0````_P$``,!K``!4
+M````$@`!``H"``!D+@$`0`$``!(``0`5`@``]"T!`'`````2``$`(`(``&CS
+M``"<````$@`!`"L"``#8;@``.````!(``0`V`@``2+,``&`````2``$`00(`
+M`-BX``"<````$@`!`$P"```T]```.````!(``0!7`@``G+```"0````2``$`
+M8@(``)0L`0",````$@`!`&T"``"8G```)`$``!(``0!X`@``P&H``$P````2
+M``$`@P(``!B3```X````$@`!`(X"``!H)`$`H````!(``0"9`@``J+H``$P`
+M```2``$`I`(``%`L`0`P````$@`!`*\"```$*P$`@````!(``0"Z`@``M`$!
+M`'`````2``$`Q0(``+!7`0`T````$@`!`-`"``!T90``"````!(``0#;`@``
+M("T!`)P````2``$`Y@(``#Q9``"H!@``$@`!`/$"```XN@``.````!(``0#\
+M`@``9"<!`&P````2``$`!P,``&P#``!@````$@`!`!(#``"$*P$`,````!(`
+M`0`=`P``\(0!`%0!```2``$`*`,``'08`0!$````$@`!`#,#``#,7P$`S```
+M`!(``0`^`P``-&X``#0````2``$`20,``!"M``"T````$@`!`%0#``#(L0``
+M=````!(``0!?`P``])$``#0````2``$`:@,``,B+`0"8````$@`!`'4#``!0
+MA0``[`(``!(``0"``P``M'(```0````2``$`BP,``&",`0`T````$@`!`)8#
+M``"\E```0`,``!(``0"A`P``Q`$``)P!```2``$`L`,``(QQ`0`\!```$@`!
+M`+L#`````````````!````#"`P``K#P!`!@!```2``$`S0,``.BY```@````
+M$@`!`-@#``!<B0$`C`$``!(``0#C`P``[#(!`$P!```2``$`[@,``-P]`0`<
+M````$@`!`/D#``!@`P``#````!(``0`$!```%+4``!P````2``$`#P0``&ST
+M``#P````$@`!`!H$```$]```,````!(``0`E!```2,T``$P````2``$`,`0`
+M`.1?```4````$@`!`#L$``!H;@``<````!(``0!&!```_`,``-P!```2``$`
+M7`0``+A>`0`T````$@`!`&<$``"\G0``^````!(``0!R!```,'```#`````2
+M``$`?00`````````````$````(<$``!XJ@``)````!(``0"2!```F%<!`!@`
+M```2``$`G00``-3=```T````$@`!`*@$``!P'P$`A`0``!(``0"S!```Q!L!
+M`!`````2``$`O@0``'!F``"H````$@`!`,D$``"DJ```9````!(``0#4!```
+MP*(!`%0````2``$`WP0``'`=`0!,`0``$@`!`.H$``#`N0``!````!(``0#U
+M!```1&L``'P````2``$```4``%#S```8````$@`!``L%``"D!`$`E`<``!(`
+M`0`6!0``M(@!`*@````2``$`(04``$PJ`0`(````$@`!`"P%``!XL```)```
+M`!(``0`W!0``E#\!`'P````2``$`0@4``-B2```(````$@`!`$T%``#0E@$`
+ML`(``!(``0!8!0``(,```-0````2``$`8P4``.!I``!0````$@`!`&X%``"\
+M+0$`.````!(``0!Y!0``.`P!`&0````2``$`A`4``(S[```@````$@`!`(\%
+M``"DGP$`6````!(``0":!0`````````````0````IP4``!R4``"@````$@`!
+M`+(%``!P>```U````!(``0"]!0``0)L!`$`````2``$`R`4``(R@`0`0````
+M$@`!`-,%```X*`$`N````!(``0#>!0``-`8``*@!```2``$`[P4``+"/`0"X
+M!```$@`!`/H%```0;P``H````!(``0`%!@``^)D``+@````2``$`$`8``+2Y
+M```$````$@`!`!L&``!T*@$`(````!(``0`F!@``'+`!`+`````2``$`,08`
+M`*QW``!\````$@`!`#P&```8%`$`Q````!(``0!'!@``T*P``$`````2``$`
+M4@8``$C/``"X`0``$@`!`%T&```HD@``L````!(``0!H!@``0&D!`#P'```2
+M``$`<P8``/1``0"L````$@`!`'X&``!0.@$`,````!(``0")!@``],```)P!
+M```2``$`E`8``/PO`0#P`@``$@`!`)\&``#`M@``?````!(``0"J!@``R+D`
+M`"`````2``$`M08``(`T`0!,`P``$@`!`,`&``#0C`$`9`$``!(``0#+!@``
+M%*,!`'P&```2``$`U@8``'"Z```X````$@`!`.$&``"XG@``%````!(``0#L
+M!@``C&0``!`````2``$`]P8```BI``!P`0``$@`!``('``!D)@$`4````!(`
+M`0`-!P``1',``"@````2``$`&`<```SY`0`H`0``$@`!`",'``"H<@``!```
+M`!(``0`N!P``M"H!`!`````2``$`.0<``&`I`0!,````$@`!`$0'``"L2P``
+MI`$``!$`!@!/!P``&/P``(`````2``$`6@<``,"T`0!<````$@`!`&4'``!`
+M<0``C````!(``0!P!P``Z+T``!P````2``$`>P<``$1Y``#P`0``$@`!`(8'
+M```L5`$`+````!(``0"1!P``'"0!`"0````2``$`G`<``+0F`0"P````$@`!
+M`*<'``#(H`$`^`$``!(``0"R!P``_(,``!P````2``$`O0<``/1U```<````
+M$@`!`,@'``"L;`````$``!(``0#3!P``1'@``"P````2``$`W@<``.`E`0"$
+M````$@`!`.D'``!T6@$`>`,``!(``0#T!P`````````````0````_@<``!"5
+M`0#``0``$@`!``D(```0/```I`$``!$`!@`4"```&&<``+0!```2``$`'P@`
+M``Q'``"`````$@`!`"H(``#HD@``,````!(``0`U"```*'@``!P````2``$`
+M0`@`````````````$````&`(```T>P``U`<``!(``0!K"`````````D````1
+M``8`>P@``-QB`0"8````$@`!`(8(```\L@``1````!(``0"1"```!!`"`"@!
+M```2``$`G`@``*P-`0"$````$@`!`*<(``#L)P$`3````!(``0"R"```N'(`
+M``0````2``$`O0@``$Q?`0"`````$@`!`,@(``"XN0``"````!(``0#3"```
+M)+T``"0````2``$`W@@``,2M``"H````$@`!`.D(``#$*@$`.````!(``0#T
+M"``````````````0`````PD``,2R``!,````$@`!``X)```(2@``I`$``!$`
+M!@`9"0``B#P!`"0````2``$`)`D``(P5`0!D````$@`!`"\)``!`U0``8```
+M`!(``0`Z"0``Y(,``!@````2``$`10D``&RW``"<````$@`!`%`)``#4&P$`
+M0`$``!(``0!;"0``'$4``*0!```1``8`9@D``*0O`0`8````$@`!`'$)``"H
+MM```;````!(``0!\"0``:$`!`(P````2``$`APD``*"L`0!0`@``$@`!`)()
+M``!LK@``Y`$``!(``0"="0``O'8``#0````2``$`J`D``#RQ``!`````$@`!
+M`+,)```0V0``5`$``!(``0"^"0``W(H``!@````2``$`R0D``!@_`0!\````
+M$@`!`-0)``#`1@``I`$``!$`!@#?"0``@+(``$0````2``$`Z@D``/BS``"P
+M````$@`!`/4)``"L;0``;````!(``0``"@``A)0!`"`````2``$`"PH`````
+M````````$````!H*``#(_0``0````!(``0`E"@``0"0!`"@````2``$`,`H`
+M`/1H```D````$@`!`#L*``"`+`$`%````!(``0!&"@``K+D```@````2``$`
+M40H``$@E`0"8````$@`!`%P*``"T/0``I`$``!$`!@!G"@``Y+\``!P````2
+M``$`<@H``)RJ```L`0``$@`!`'T*``!H`0``7````!(``0"+"@``;#H``*0!
+M```1``8`E@H``&B_``!\````$@`!`*$*``#(JP``$````!(``0"L"@``#```
+M`"0````1``8`O@H``!1L```H````$@`!`,D*``"8;```%````!(``0#4"@``
+M)!T!`$P````2``$`WPH```!U``!L````$@`!`.H*``!0L@$`<`(``!(``0#U
+M"@``;'4``"0````2``$```L``#BX```4````$@`!``L+``!4/@$`2````!(`
+M`0`6"P``.%,``!P!```2``$`(0L``&B4`0`<````$@`!`"P+``#LO@``?```
+M`!(``0`W"P``=+D``#@````2``$`0@L``!0^`0!`````$@`!`$T+``"L^P``
+M)````!(``0!8"P``E(P!`#P````2``$`8PL```BX```P````$@`!`&X+``!\
+M<`$`V````!(``0!Y"P``V*L``/`````2``$`A`L```C^```D`0``$@`!`(\+
+M``!8/P``I`$``!$`!@":"P``B'8``#0````2``$`I0L``)R@`0`L````$@`!
+M`+`+``#<8P``L````!(``0"["P``D'4``$P````2``$`Q@L``-CV``"8!```
+M$@`!`-$+``#H<@``7````!(``0#<"P``+'$``!0````2``$`YPL``/`5`0#,
+M`0``$@`!`/(+``#HB@$`X````!(``0#]"P```,```"`````2``$`"`P``%14
+M``!`````$@`!`!,,```\&0$`>````!(``0`>#```"`\``(0````2``$`*0P`
+M`$@)```,`@``$@`!`#0,```P&`$`1````!(``0`_#```S'$``)P````2``$`
+M2@P``-QU```8````$@`!`%4,``#D@@$`E````!(``0!@#```?&H``$0````2
+M``$`:PP``%1Q`0`X````$@`!`'8,``#\0P``+````!(``0"!#```V`4``%P`
+M```2``$`C`P```@E`0!`````$@`!`)<,`````````````!````"G#```"-X`
+M`*0!```2``$`L@P`````````````$````+L,``"X8P``)````!(``0#&#```
+M@)D!`,`!```2``$`T0P```QK```X````$@`!`-P,``"\'@$`M````!(``0#G
+M#```(+8``*`````2``$`\@P``)C\```H`0``$@`!`/T,`````````````!``
+M```=#0``=`@``-0````2``$`*`T``$1I``!4````$@`!`#,-``"8:0``0```
+M`!(``0`^#0``?+$``$P````2``$`20T``+QE``"T````$@`!`%0-``"HLP``
+M4````!(``0!?#0``,`X!`*P%```2``$`:@T```BZ```@````$@`!`'4-``"@
+M00$`_`$``!(``0"`#0``H'(```@````2``$`BPT``,QH```H````$@`!`)8-
+M``"0;```"````!(``0"A#0`````````````0````KPT``%"P```H````$@`!
+M`+H-``"<#```(`$``!(``0#%#0``O'(``"P````2``$`T`T``*R^``!`````
+M$@`!`-L-``#TN@``,````!(``0#F#0``B(0``,@````2``$`\0T``/!V``!`
+M````$@`!`/P-```\;```5````!(``0`'#@``]",!`"@````2``$`$@X``/@]
+M`0`<````$@`!`!T.``"84P$`E````!(``0`H#@``$+,``#@````2``$`,PX`
+M``09`0`X````$@`!`#X.``!T8P$`S`4``!(``0!)#@``&&X``!P````2``$`
+M5`X``$B]``!L````$@`!`%\.```PM0``-````!(``0!J#@``L)H``*`!```2
+M``$`=0X``,BP``!T````$@`!`(`.``#$N0``!````!(``0"+#@``4),``,P`
+M```2``$`E@X``%!-``"D`0``$0`&`*$.```\:0``"````!(``0"L#@``P+``
+M``@````2``$`MPX``.QA``!D````$@`!`,(.``"<9```V````!(``0#-#@``
+MN!@!`$P````2``$`V`X``(P/``"$````$@`!`.,.````GP$`)````!(``0#N
+M#@``_"H!``@````2``$`^0X``-2U``!,````$@`!``0/```$@@$`X````!(`
+M`0`/#P``N+P``&P````2``$`&@\``)#"``"@"@``$@`!`"4/``#T3@``I`$`
+M`!$`!@`P#P``_!,!`!P````2``$`.P\``#!J``!,````$@`!`$8/``#<!P``
+M2````!(``0!1#P``&&D``"0````2``$`7`\``!B=`0#H`0``$@`!`&</``#L
+MC@$`Q````!(``0!R#P``$'8``!P````2``$`?0\``#RW```P````$@`!`(@/
+M``#$/0$`&````!(``0"3#P``+'8``%P````2``$`G@\``/!@``!X````$@`!
+M`*D/``#\<```,````!(``0"T#P``2*0``"@````2``$`OP\``+P-``!,`0``
+M$@`!`,H/``!4``$`!````!(``0#5#P``0)@``%P````2``$`X`\``$2^```T
+M````$@`!`.L/``"L<@``"````!(``0#V#P``%/8``,0````2``$``1```-@^
+M`0!`````$@`!``P0```PQP$`#`$``!(``0`7$```:'(``#@````2``$`(A``
+M`(!5```H````$@`!`"T0``"(2P``L`<``!(``0!#$```$$`!`%@````2``$`
+M3A```#!W``!\````$@`!`%D0``"<0P$`_`\``!(``0!D$```W!D!`.@!```2
+M``$`;Q```-#[``!(````$@`!`'H0``!XO@``-````!(``0"%$```G)@``(P`
+M```2``$`D!```)!#``!L````$@`!`)L0``!8G```0````!(``0"F$```&(0`
+M`'`````2``$`L1````2^``!`````$@`!`+P0```PS0``&````!(``0#'$```
+M:&$``(0````2``$`TA```+2>```$````$@`!`-T0``"P;P``@````!(``0#H
+M$```A.X``$0````2``$`\Q```!P\`0!L````$@`!`/X0``"L*0$`H````!(`
+M`0`)$0``9+4``'`````2``$`%!$``#R?```,!0``$@`!`!\1```(C@``=`,`
+M`!(``0`J$0``E"H!`"`````2``$`-1$``'#[```<````$@`!`$`1``"HXP$`
+M'`$``!(``0!+$0``\"@!`'`````2``$`5A$``+P7`0!T````$@`!`&$1``#D
+M5P$`D`(``!(``0!L$0``I)0!`"0````2``$`=Q$`````````````$````(D1
+M``!\IP``>````!(``0"4$0``W!0!`+`````2``$`GQ$`````````````$```
+M`+`1``#8:0``"````!(``0"[$0``*+H``!`````2``$`QA$``*R9``!,````
+M$@`!`-$1``#0)P$`'````!(``0#<$0``N'L!```!```2``$`YQ$``)3-``"T
+M`0``$@`!`/(1``"81@``=````!(``0`+$@``R)0!`$@````2``$``'IZ,#`U
+M8C4X-#8`>GHP,#)D8C$Q8P!Z>C`R9&)F.#<U`'IZ,#)D8F(Q8C(`>GHP,F1B
+M,C`U,P!?7V%S:&QD:3,`>GHP,#)D8F$T,@!Z>C!F8F(Q93-F`'IZ,&(W.65A
+M.30`>GHP-6(X8S8U80!Z>C`P-6(T,&%D`'IZ,#5B.30R960`>GHP9#AD8S8R
+M8P!Z>C`P,3EF-#<P`'IZ,#)D9#DT,F0`>GHP,F1B93<S9`!Z>C`P-6(V.3)B
+M`'IZ,&(V9#(S,C4`>GHP,#5B.#4S9`!Z>C`P,39D.3)E`'IZ,&-F8C$X-S4`
+M>GHP,#)D8C,Q8P!Z>C`R9&%B8F%C`'IZ,#)D8F,X-3$`>GHP,#!B-F,V.`!Z
+M>C`P,&(V8F8X`'IZ,#!B-F-F-64`>GHP,39E,61F9`!Z>C!B-F8U,&(X`'IZ
+M,#9E,&$T9F4`>GHP,#8W9#)B,0!Z>C`P,F1B8S8Q`'IZ,&(V8V$S,C4`>GHP
+M,#5B-F-F9`!Z>C`Q-F4P9&9D`'IZ,#`P8C9F-C@`871H7VAA;%]P<F]C97-S
+M7VYO:7-E9FQO;W(`>GHP,#5B-#AA9`!Z>C`R9&)F,6(R`'IZ,#`U8C@X8V(`
+M>GHP,S-E8SAB9@!Z>C!D8C0R-6,U`&%T:%]H86Q?9&UA7V)E86-O;E]R97-P
+M;VYS95]T:6UE`'IZ,#!B-F8Q-C$`>GHP-F4P,&(X80!Z>C`R9&)F8S%D`'IZ
+M,&1C-&4S.3``>GHP9&%F960X-@!Z>C`P8C9E,C=A`'IZ,#)D8F)A8C(`>GHP
+M8C9D,65F9@!Z>C`Q-F0Y,&1D`'IZ,#)D8F4X-3$`>GHP,#5B-C1F9`!Z>C`P
+M,&(V9#4R`'IZ,&(V8SEE9F8`>GHP,39E,#!D9`!Z>C`R9&)D.#<U`'IZ,#)D
+M8C,Q8C(`>GHP,&(W,#DR,P!Z>C`P8C9D-#4P`'IZ,#`P8C9D,60`>GHP8C9C
+M,C,R-0!Z>C`R9&)D86(R`'IZ,#`P-6(V,S(`>GHP-F1E9&0Y,P!Z>C`P,39D
+M834P`'IZ,#`P-C=D,S(`>GHP,&(V9#DR,P!Z>C`P,F1B-3%C`'IZ,#$V9&-B
+M9F4`>GHP,&(W,#$T-0!Z>C`P,39D9C)C`'IZ,&(W9F%D,V4`>GHP,39D.3DR
+M,`!Z>C`R9&(Q8F%C`'IZ,&1C-F4S.3``>GHP-6(W,#%E,`!Z>C`P,&(V8C$P
+M`'IZ,&(W,#EE9F8`>GHP,39D9C@Y8@!A=&A?:&%L7V%T=&%C:`!Z>C`V93!F
+M8S!D`&UE;6-P>0!Z>C`Q-F1A8C)D`'IZ,#)D8C$S-60`>GHP93`T-C@T8@!Z
+M>C`Q-F4R.3%D`'IZ,#`P8C9F93@`>GHP,&-F8C-E,`!Z>C`P,39D.30X`'IZ
+M,#$V93(P.6(`>GHP8C<P,65F9@!Z>C`P,&(V8SED`'IZ,#`P-6(U83(`>GHP
+M,F1B,3<P80!A=&A?:&%L7V-O;7!U=&5T>'1I;64`>GHP,F1B-6)A8P!Z>C`P
+M-6(X,3-D`'IZ,#!B-F,Y,C,`7U]U9&EV<VDS`'IZ,&(V8C4P8C@`>GHP,#5B
+M-V8Y9`!Z>C!B-S`Q9#`R`'IZ,#9D9F8T-&$`>GHP,F1B-3<V,P!Z>C`V965A
+M9C8P`'IZ,&4P,#=C83$`>GHP,#)D868V,@!Z>C!B.#-A9#-E`'IZ,#`P8C9B
+M.3``>GHP,39D.65F80!Z>C`Q-F1E,#4Q`'IZ,#`P-6(V8C(`>GHP-6(W9C$Q
+M-`!Z>C`T864P,S%F`'IZ,#)D8F1D9F0`>GHP,#4T-V9E9`!Z>C`P8C9B9C5E
+M`'IZ,#!B-S$W-V0`>GHP,&(W,&8S9`!Z>C`Q-F0X.3(P`'IZ,#)D8C%A8C(`
+M>GHP,#`U8C8R,@!Z>C`P,&(V9C<X`'IZ,&(V.6(P-V,`871H7VAA;%]F<F5E
+M`'IZ,#5B-SEB,6(`>GHP,&(W,#<S9`!Z>C`R9&)E8F)D`'IZ,&(U93,Q-3(`
+M>GHP,39D9F)F,0!A=&A?:&%L7VUH>C)I965E`'IZ,#$V93$X.6(`>GHP9&,R
+M835C-0!Z>C`P,F1C-C!B`'IZ,#9D9C!B.&$`>GHP,F1B,S,U9`!Z>C!B-F,U
+M,V$T`'IZ,&8U-&0Q8C``>GHP8C9F9#,V,P!Z>C!D.61C-C)C`'IZ,#5B-S0Q
+M93``>GHP,F1A.6)A8P!Z>C!D8S(Q9#-A`'IZ,#!B-S$W,V0`>GHP,39D.60T
+M,0!Z>C`P-6(X-&9D`'IZ,#`U8CAA8F0`>GHP,&(W,#$R,P!Z>C`P-6(V-3)B
+M`'IZ,#)D8C,X-S4`>GHP,39E,S`Y8@!Z>C`P-6(V,&(R`'IZ,#)D8C$X-S4`
+M>GHP,#)D8C@T,@!Z>C`R9&(Q-S8S`'IZ,&(W9&5A.30`>GHP,&(W,#$V,0!Z
+M>C`Q-F0W9#0Q`'IZ,#`Q-F-D,S(`>GHP-F1E,&(X80!Z>C`V9#ED9#DS`'IZ
+M,&1B,V5D.#8`>GHP,#5B-#AE9`!Z>C`P,F1C.#!B`'IZ,#`R9&)C-#(`>GHP
+M,F1B83@U,0!Z>C`R9&(S,V5D`'IZ,#`U8C@P9F0`>GHP,#5B-V8R90!Z>C`R
+M9&)F9&9D`'IZ,#$V938T.&$`>GHP,#)D869F,@!Z>C`P-6(W-SED`'IZ,#`P
+M8C9E93@`>GHP,39E-#0X80!Z>C`P8C9F-F)C`'IZ,#$V9&$Y,C``>GHP-6(W
+M.#%E,`!?7W5M;V1S:3,`>GHP,#)D8V$P8@!Z>C`P-6(T-&%D`'IZ,#9D9&8T
+M-&$`>GHP9F%C,&,Y8@!Z>C!B-F8Y969F`'IZ,#!B-F,V8F,`871H7VAA;%]A
+M9&1I=&EO;F%L7W-W8F%?8F%C:V]F9@!Z>C`P,#)D8CDR`&%T:%]H86Q?=F5R
+M<VEO;@!Z>C`R9&)A8S)E`'IZ,#)D8C<Y864`>GHP,#$V934S,@!Z>C!B-F-F
+M,#`Y`'IZ,#`Q-F4Q,F,`>GHP,#$V9#EE-`!Z>C`P,#)D865A`'IZ,#`U8C5C
+M8C(`>GHP,39D83(U,0!Z>C`V9C9A9C8P`'IZ,#9D9F1D.3,`871H7VAA;%]M
+M86QL;V,`>GHP,#!B-F1D,@!Z>C`R9&0Y,F%D`'IZ,#$V9&(R-3$`>GHP93$P
+M-V-A,0!Z>C`P8C9C-S5E`'IZ,#$V9&0P-3$`>GHP,F1B9#%B,@!Z>C`R9&,Q
+M-S8S`'IZ,&(V.3!D-F0`>GHP,39D9C`U,0!Z>C`P,39D.34P`'IZ,#!B-S`V
+M8F,`>GHP,#$V9#@W,@!Z>C`V9&5F-#1A`'IZ,#5B.&,R960`>GHP-F9B.30W
+M8@!Z>C!E8F(Q93-F`'IZ,&(V9CED,#(`>GHP9#$T9#%B,`!Z>C!B-#@P,S%E
+M`'IZ,#$V9&)B9F4`>GHP,39E-30X80!Z>C`P,39D.#4P`'IZ,#`P8C9F9C@`
+M871H7VAA;%]M96UC<'D`>GHP,F1B8V)B9`!Z>C`Q-F1A,&1D`'IZ,#)D8F)D
+M9F0`>GHP,F1B,C@U,0!Z>C`R9&)D8S%D`'IZ,#9D8C!C9C(`>GHP,39E8CEA
+M9`!Z>C`P8C9C96)C`'IZ,&0Y-#@T83$`871H7VAA;%]P<F]B90!Z>C`Q-F5A
+M.6%D`'IZ,&9D-&0Q8C``>GHP,F1B,S<V,P!A=&A?:&%L7V)U:6QD;W!T<P!Z
+M>C`R9&%F,S5D`'IZ,#9D9&1D.3,`>GHP9&%D8S8R8P!Z>C`Q-F1F,C4Q`'IZ
+M,#`P8C9C,3``>GHP,39D.3(U,0!Z>C`R9&(P.#4Q`'IZ,&(W,C%A960`>GHP
+M-C=C9F-A90!Z>C`P,&(V8V8X`'IZ,&,Y-&0Q8C``>GHP,F1A9F%B,@!Z>C`U
+M8CDR865D`'IZ,#`U8CAC8V(`>GHP8C9D.65F9@!Z>C`R9&(Q,6(R`'IZ,#)D
+M8F9F8C$`>GHP,F1B9C<V,P!Z>C`P-6(V.&9D`'IZ,#`U8C0T960`>GHP8C<Q
+M,6%E9`!Z>C!B-64S,38P`'IZ,&0X-#@T83$`>GHP,39D.&(R9`!Z>C`Q-F4P
+M.#EB`'IZ,#)D8F(X-S4`>GHP,F1A93@U,0!Z>C!B.#%E83DT`'IZ,#$V9&5C
+M,68`>GHP,&(V9F5B8P!Z>C!E.#DT.3`W`'IZ,#!B-F5A-V$`>GHP,S-E.&9B
+M9@!Z>C!C9F$U.#<U`'IZ,#)D8CDY864`>GHP,F1B.6%B,@!Z>C`P,&(V8F4X
+M`'IZ,&1E-C@S-V8`>GHP,39D86)F90!Z>C!B-S`Y9#`R`'IZ,#8W9#(U93(`
+M>GHP,3EF,V$P,0!Z>C`W,#,Y-#=B`&%T:%]H86Q?;65M>F5R;P!Z>C`V9&9F
+M8S!D`%]?9&EV<VDS`'IZ,&(V-S4P8C@`>GHP,39E,F1F9`!Z>C`P,&(V9#(R
+M`'IZ,#9F96%F-C``>GHP9&,T835C-0!Z>C`P8C<P9C=D`&%T:%]H86Q?<W=?
+M8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP.68V-&(V80!Z>C`P-6(V-3=A`'IZ
+M,#9F,SDT-V(`>GHP-F1A,&-F,@!Z>C!B-V)A9#-E`'IZ,#!B-F8Y-C$`>GHP
+M8C8Y-S-B8P!Z>C`R9&)D,S5D`'IZ,#`U8C@X9F0`>GHP,F1B8F,Q9`!Z>C`R
+M9&%F9&9D`'IZ,#9D-V1D.3,`871H7VAA;%]D96QA>0!Z>C`R9&(Q9&9D`'IZ
+M,#8W9#)F-#$`>GHP,F1A9C@W-0!Z>C!B-V5D939D`'IZ,#$V9#AD-#$`>GHP
+M,#)D864Y,@!Z>C!B-V%D939D`'IZ,#)D8F(S-60`>GHP,F1B,V1F9`!Z>C`R
+M9&(U,V5D`'IZ,#$V9&-E864`>GHP,#!B-F1A,@!Z>C`P,&(V93(R`'IZ,#5B
+M.#`P-#$`>GHP,#$V9#@T.`!Z>C`Q-F0Y8C)D`'IZ,#`Q-F4P,F,`>GHP,&(W
+M,#<W9`!Z>C`P-6(V.3=A`'IZ,#`Q-F1A930`>GHP,39E,3`Y8@!Z>C`P-6(T
+M83)D`'IZ,#$V9&4P9&0`>GHP,39D9C!D9`!Z>C!D9C`W8V$Q`'IZ,#)D8F0W
+M-C,`>GHP,#!B-F4U,@!Z>C`V-V0P8S0W`'IZ,#5B-F,V9&(`>GHP8S,Q-65B
+M-0!Z>C!D8C%E9#@V`'IZ,#9D-#`V93``>GHP,39E,#(U,0!Z>C`P,#)D8F(R
+M`'IZ,#`R9&0X-F0`>GHP,#$V93$T9`!Z>C`R9&(U.6%E`'IZ,#`V-V0R,C$`
+M>GHP,39D.#!D9`!Z>C`P-6(X.3-D`'IZ,#5B.#%B,6(`>GHP,F1B,3-E9`!Z
+M>C`P8C9D,3(S`'IZ,#`P8C9C93@`>GHP-6(X86%E9`!Z>C!B-F5D,S8S`'IZ
+M,#)D868Q8C(`>GHP,#`U8C5E,@!Z>C`S,V5B9F)F`'IZ,#5B-C@V9&(`>GHP
+M,#!B-F5F.`!Z>C!B-S$Y865D`'IZ,#`U8C4X8C(`>GHP-6(W9&(Q8@!Z>C!B
+M.#)D939D`'IZ,#`Q-F0W,S(`>GHP,F1A9&%B,@!Z>C!F-#5E-F4S`&%T:%]H
+M86Q?:6YI=%]C:&%N;F5L<P!Z>C`P8C9D-F)C`'IZ,&,Q-&0Q8C``>GHP,#`R
+M9&)D,@!Z>C!D830X-&$Q`'IZ,#$V93!B.#<`>GHP-6(Y,#)E9`!Z>C!D8S)E
+M,SDP`'IZ,&$V,&0Q-#4`>GHP,F1B86)B9`!Z>C`P,&(V8S%D`'IZ,#5B.&5A
+M960`>GHP,#5B-V(Y9`!Z>C`P-6(U-#0V`'IZ,#5B-C0V9&(`>GHP,&(V9CDR
+M,P!Z>C!D9#8X,S=F`'IZ,#$V93$R-3$`>GHP9&,V835C-0!Z>C`R9&(S-S!A
+M`'IZ,#`P-6(V-S(`>GHP-F1E9F,P9`!Z>C`R9&)F,S5D`'IZ,#`P8C9C-S@`
+M>GHP,#$V9#@S,@!Z>C`R9&(U-S!A`'IZ,#`U8C9D-V$`>GHP,#)D8C(Y,@!Z
+M>C`P-6(Y,&-B`&%T:%]H86Q?<F5G7W=R:71E`'IZ,&(V9C4S-C,`>GHP,#5B
+M-6,T-@!A=&A?:&%L7W)E9U]R96%D`'IZ,#9D.3!C9C(`>GHP-F0X9&0Y,P!Z
+M>C`Q-F1F8C@W`'IZ,#`Q-F1A-#@`>GHP8C8V,S%A.`!Z>C`P,F1B,#DR`&%T
+M:%]H86Q?9V5T=VER96QE<W-M;V1E<P!Z>C`Q-F4Q8C@W````%`````$!```<
+M`````0$``"0````!`0``+`````$!```T`````0$``#P````!`0``0`````$!
+M``!(`````0$``%`````!`0``5`````$!``!D`````0$``&P````!`0``<```
+M``$!``"``````0$``(0````!`0``E`````$!``"@`````0$``*0````!`0``
+MM`````$!``"X`````0$``,@````!`0``S`````$!``#<`````0$``.`````!
+M`0``#`$```$!``!``0```@,``$0!```"`P``2`$```(#``!,`0```@,``%`!
+M```"`P``5`$```(#``!8`0```@,``%P!```"`P``8`$```(#``!D`0```@,`
+M`)P!```!`0``O`$```$!``#T`0```0$``/@!```!`0````(```$!```(`@``
+M`0$``!`"```!`0``%`(```$!```<`@```0$``"@"```!`0``+`(```$!```\
+M`@```0$``$`"```!`0``4`(```$!``!<`@```0$``&P"```!`0``<`(```$!
+M``"``@```0$``(P"```!`0``G`(```$!``"@`@```0$``*@"```!`0``P`(`
+M``%X``#$`@```0$``-@"```!B`$`W`(```$!``#P`@```4<``/0"```!`0``
+MG`,```&4`0"T`P```3D!`,@#```!`0``V`,```$!``#P`P```0$``$P$```!
+M`0``4`0```(!``!4!````@$``%@$```"`0``7`0```(!``!@!````@$``'`$
+M```!`0``I`0```%K``"P!````0$``,0$```!`0``T`0```$!``#L!````6L`
+M`/@$```!`0``#`4```$!```8!0```0$``#0%```!:P``0`4```$!``!<!0``
+M`6L``&@%```!`0``A`4```%K``"0!0```0$``*P%```!:P``P`4```$!``!,
+M!@```0$``%P&```!`0``;`8```$!``!P!@```0$``'@&```!`0``?`8```&_
+M``"$!@```0$``)0&```!`0``S`8```$!``#P!@```0$```@'```!`0``-`<`
+M``$!```X!P```;\``$`'```!`0``4`<```$!``"0!P```0$``*`'```!`0``
+M#`@```$A`0`@"````@(``%0(```!(0$`9`@```%K``!P"````@(``+`(```!
+M`0``#`D```%G```L"0```6<``$0)```!`0``6`D```$!``!<"0```@$``&`)
+M```"`0``9`D```(!``!H"0```@$``&P)```"`0``<`D```(!``!T"0```@$`
+M`'@)```"`0``?`D```(!``"`"0```@$``(0)```"`0``B`D```(!``","0``
+M`@$``)`)```"`0``E`D```(!``"8"0```@$``)P)```"`0``H`D```(!``"D
+M"0```@$``*@)```"`0``K`D```(!``"P"0```@$``+0)```"`0``N`D```(!
+M``"\"0```@$``,`)```"`0``Q`D```(!``#("0```@$``,P)```"`0``T`D`
+M``(!``#4"0```@$``-@)```"`0``W`D```(!``#@"0```@$``.0)```"`0``
+M[`D```$!```8"@```0$``"0*```!`0``5`H```$!``!@"@```0$``&@*```!
+M`0``=`H```$!``!X"@```@$``'P*```"`0``@`H```(!``"$"@```@$``)`*
+M```!`0``G`H```$!``"D"@```0$``*P*```!`0``N`H```$!``#$"@```0$`
+M`-`*```!`0``W`H```$!``#D"@```0$``.@*```!`0``^`H```$!``#\"@``
+M`0$```@+```!`0``%`L```$!```<"P```0$``$@+```!`0``9`L```$!``!H
+M"P```0$``'`+```!`0``=`L```$!``!\"P```0$``(`+```!`0``B`L```$!
+M``"4"P```0$``)@+```!`0``H`L```$!``"H"P```0$``*P+```!`0``V`L`
+M``$!``#H"P```0$``"P,```!`0``5`P```&4`0"`#````0$``(P,```!`0``
+MN`P```$!``"\#````@$``,`,```"`0``Q`P```(!``#(#````@$``,P,```"
+M`0``T`P```(!``#4#````@$``-@,```"`0``W`P```(!``#@#````@$``.0,
+M```"`0``Z`P```(!``#L#````@$``/`,```"`0``]`P```(!``#X#````@$`
+M`/P,```"`0````T```(!```$#0```@$```@-```"`0``#`T```(!```0#0``
+M`@$``!0-```"`0``&`T```(!```<#0```@$``"`-```"`0``)`T```(!```H
+M#0```@$``"P-```"`0``,`T```(!```T#0```@$``$0-```!`0``5`T```$!
+M``!X#0```0$``(`-```!`0``F`T```$!``"H#0```0$``/0-```!`0``#`X`
+M``$!```H#@```0$``#@.```!`0``/`X```$!``!0#@```0$``&P.```!`0``
+M?`X```$!``"`#@```0$``)P.```!`0``N`X```$!``#P#@```0$``*`/```!
+M``$`N`\```$!``#$#P```2$!``P0```"`@``2!````$!``!@$````0$``&P0
+M```!(0$`K!````$!``"X$````0$``.@0```!`0``]!````$!``!`$0```0$`
+M`%P1```!`0``G!$```$!``"@$0```@(``!02```!`0``&!(```("```<$@``
+M`@(``$P2```!`0``$!,```$!```<$P```0$``$`3```!`0``6!,```$!``#`
+M$P```0$``,03```!`0``H!4```$!``"\%0```0$``,P5```!`0``#!8```'0
+M``!(%@```0$``+P6```!`0``]!8```$!```\%P```0$``$@7```!`0``9!<`
+M``$!``!X%P```0$``(@7```!`0``\!<```$!```$&````0$``(@8```!`0``
+MO!D```$!``#T&0```0$``/@9```!`0```!H```$!```$&@```0$```P:```!
+M`0``$!H```$!```<&@```0$``"0:```!`0``4!H```$!``!D&@```0$``'0:
+M```!`0``B!H```$!``"4&@```0$``)@:```!`0``I!H```$!``#4&@```0$`
+M`-@:```!`0``Y!H```$!```4&P```0$``!@;```!`0``+!L```$C`0!(&P``
+M`0$``$P=```!`0``<!T```$!``"L'0```0$``.0=```!`0``"!X```$!```D
+M'@```0$``%P>```!A0``;!X```$!```4'P```0$``%`?```!`0``C!\```$!
+M``"4'P```0$``+@?```!`0``O!\```$!``#D'P```0$``/0?```!`0``_!\`
+M``$!```@(````0$``"0@```!`0``4"````$!``!@(````0$``'0@```!`0``
+MF"````$!``#`(````0$``,@A```!`0``]"(```$!````(P```0$``&PC```!
+M`0``6"0```$!``!D)````0$``)`D```!`0``-"8```$!``!`)@```0$``+PF
+M```!`0``I"<```$!``#()P```0$``/@G```!`0``%"@```$!``"$*````0$`
+M`*0H```!`0``X"@```$!``!,*0```0$``)PI```!`0``L"D```$!``#0*0``
+M`0$```0J```!6@``%"H```'0```@*@```0$``#`J```!`0``/"H```$C`0!@
+M*@```0$``&@J```!`0``A"H```$!``"4*@```0$``)PJ```!`0``Q"H```$!
+M``#4*@```2,!```K```!`0``""L```$!```D*P```0$``#0K```!`0``/"L`
+M``$!``!D*P```0$``'0K```!(P$`H"L```$!``"H*P```0$``,0K```!`0``
+MU"L```$!``#<*P```0$``.PK```!A0``^"L```("```<+````0$``"@L```!
+M`0``+"P```$!```\+````0$``$@L```!`0``5"P```$!``"$+````0$``(@L
+M```!`0``D"P```$!``"4+````0$``*`L```!`0``I"P```$!``"\+````0$`
+M`,@L```!`0``Y"P```$!``#P+````0$```PM```!`0``)"T```$!``#8+@``
+M`0$``.PN```!`0``%"\```$!```H+P```0$``$0O```!`0``="\```$!``"4
+M+P```0$``)@O```!`0``H"\```$!``"D+P```0$``*PO```!`0``L"\```$!
+M``#,+P```0$``-@O```!`0``]"\```$!````,````0$``"`P```!`0``0#``
+M``$!``"0,````0$``)@P```!`0``H#````$!``"D,````0$``+`P```!`0``
+MR#````$!``#D,````0$``#@Q```!`0``8#$```$!``"P,0```0$``,0Q```!
+M`0``^#$```$!```L,@```0$``$0R```!`0``8#(```$!``!T,@```0$``,`R
+M```!`0``+#,```$!```P,P```0$``$0U```!`0``9#4```$!``!P-0```0$`
+M`'0U```!`0``A#4```$!``"4-0```0$``+@U```!`0``,#8```$!``#`-@``
+M`0$``.`V```!`0```#<```$!``!0-P```0$``'@W```!`0``F#<```$!``#0
+M-P```0$``"0X```!`0``=#@```$!``#$.````0$``"@Y```!`0``>#D```$!
+M``"0.0```0$``)0Y```!`0``G#D```$!``"@.0```0$``*@Y```!`0``K#D`
+M``$!``#8.0```0$``/0Y```!`0``%#H```$!```X.@```0$``*`Z```!`0``
+MW#H```$!```8.P```0$``&@[```!`0``I#L```$!``"\.P```0$``.0[```!
+M`0``!#P```$!```@/````0$``"0\```!`0``.#P```$!``!`/````0$``$0\
+M```!`0``8#P```$!``"4/````0$``,0\```!`0``Z#P```$!```4/0```0$`
+M`"`]```!`0``4#T```$!``!P/0```0$``'@]```!`0``?#T```$!``"$/0``
+M`0$``(@]```!`0``D#T```$!``"4/0```0$``+0]```!`0``R#T```$!``#@
+M/0```0$````^```!`0``$#X```$!```P/@```0$``%`^```!`0``:#X```$!
+M``!\/@```0$``*0^```!`0``W#X```$!``#T/@```0$``"P_```!`0``8#\`
+M``$!``"`/P```0$``)0_```!`0``S#\```$!```00````0$``#!````!`0``
+M/$````$!``!<0````0$``'1````!`0``J$````$!``#L0````0$``!1!```!
+M`0``*$$```$!``!$00```0$``'Q!```!`0``Z$$```$!```00@```0$``$!"
+M```!`0``5$(```$!``!\0@```0$``*A"```!`0``R$(```$!``#<0@```0$`
+M`#!#```!`0``1$,```$!``!<0P```0$``&!#```!`0``:$,```$!``"(0P``
+M`@(``(Q#```"`@``I$,```$!``"X0P```0$``,Q#```!`0``X$,```$!``#T
+M0P```0$``"!$```!`0``O$0```$!``#,1````0$``.A$```!`0``#$4```$!
+M```810```0$``!Q%```!`0``.$4```$!``!$10```0$``%!%```"!```5$4`
+M``($``!P10```0$``'1%```!`0``A$4```$!``"\10```0$``/1%```!`0``
+M`$8```$!```41@```0$``!A&```"!```0$8```$!``!41@```0$``&A&```!
+M`0``?$8```$!``"$1@```0$``+Q&```!`0``R$8```$!``#D1@```0$``.Q&
+M```!`0``_$8```$!```<1P```0$``"Q'```!`0``,$<```$!```X1P```0$`
+M`#Q'```!`0``3$<```$!``!<1P```0$``'A'```!`0``Q$<```$!``#(1P``
+M`@0``-A'```!`0``Y$<```$!``#T1P```0$``"A(```!`0``3$@```$!``!0
+M2````@0``(!(```!`0``D$@```'I``"L2````0$``+!(```"!```[$@```$!
+M``#P2````@0``#!)```!`0``-$D```$!``!$20```0$``%1)```!`0``7$D`
+M``$!``!D20```0$``&Q)```!`0``>$D```$!``"$20```0$``+A)```!`0``
+MR$D```$!``#<20```0$``!!*```!`0``.$H```$!``!`2@```0$``$A*```!
+M`0``9$H```$!``"(2@```0$``.1*```"!```Z$H```($```42P```0P``$Q+
+M```!`0``8$L```$!``!L2P```0$``,Q+```!`0``Z$L```$!``#X2P```0$`
+M``A,```!`0``+$P```$!```\3````0$``&!,```!`0``?$P```$!``#83```
+M`0$``"A-```!`0``.$T```$!``!$30```0$``&A-```!`0``=$T```$!``!X
+M30```0$``(!-```!`0``B$T```$!``",30```0$``)1-```!`0``F$T```$!
+M``"@30```0$``*1-```!`0``K$T```$!``"P30```0$``-1-```!`0``^$T`
+M``$!```@3@```0$``$A.```!`0``;$X```$!``"83@```0$``*!.```!`0``
+ML$X```$!``"X3@```0$``-A.```!`0``^$X```$!```,3P```0$``!Q/```!
+M`0``/$\```$!``!83P```0$``'1/```!`0``?$\```$!``"D3P```0$``+1/
+M```!`0``P$\```$!``#,3P```2,!``10```!`0``'%````$!``"84````0$`
+M`+A0```!`0``2%$```$!``!T40```0$``/!1```!`0``!%(```$!```44@``
+M`0$``!Q2```!`0``.%(```$!``!04@```0$``)Q2```!`0``O%(```$!``#P
+M4@```0$``!A3```"`@``'%,```($```@4P```@0``"13```"!```*%,```($
+M```L4P```@0``#!3```"`@``-%,```(!``!D4P```0$``'13```!`0``D%,`
+M``$!``"<4P```0$``*Q3```!`0``Q%,```$!``#L4P```0$``/Q3```!`0``
+M"%0```$!``!(5````0$``&14```!``$`O%0```$!``#`5````0$``,Q4```!
+M`0``U%0```$!``#H5````0$``/Q4```!`0``$%4```$!```D50```0$``#Q5
+M```!`0``2%4```$``0!050```0$``&15```!`0``C%4```$``0#450```0$`
+M`/!5```!`0``$%8```$!```<5@```0$``"Q6```!`0``R%8```$!``#85@``
+M`0$``-Q6```!`0``Y%8```$!``#L5@```0$``/16```!`0``^%8```$!````
+M5P```0$``!!7```!`0``(%<```$!```L5P```0$``#!7```!`0``0%<```$!
+M``!45P```0$``&17```!`0``=%<```$!``!\5P```0$``/!7```!`0``%%@`
+M``$!```L6````0$``#!8```"!```F%@```$!``"\6````0$``-18```!`0``
+MV%@```($``#P6````0$``!19```!`0``'%D```$!```T60```0$``&Q9```!
+MT```?%D```$!``"060```>D``!Q:```!/P$`)%H```$!``!`6@```90!`%Q:
+M```!E`$`B%H```&1`0"@6@```9$!`*Q:```!`0``N%H```&4`0#$6@```2\`
+M`.!:```!E`$`^%H```&1`0`(6P```2X!`!!;```!`0``*%L```$!```X6P``
+M`2X!`$!;```!`0``8%L```$N`0!H6P```0$``(Q;```!`0``J%L```$N`0"P
+M6P```0$``,Q;```!`0``X%L```$!``#P6P```2X!`/A;```!`0``_%X```$!
+M```$7P```0$``#!?```!+@$`.%\```$!``!D7P```0$``(!?```!`0``E%\`
+M``&1`0"D7P```0$``+Q?```!D0$`R%\```&%``#<7P```@(``.!?```"?0``
+M\%\```&%``"@8````0$``!!A```!D0$`)&$```&1`0`X80```9$!`$QA```!
+MD0$`8&$```&1`0"$80```0$``+1A```!`0``W&$```%G`0#D80```C$``.AA
+M```"+`$`"&(```&1`0`88@```90!`#!B```!D0$`2&(```&1`0!P8@```0$`
+M`'QB```!E`$`E&(```&1`0"H8@```9$!`+QB```!D0$`U&(```$!``#@8@``
+M`90!`/1B```!D0$`"&,```&1`0`88P```90!`%!C```!D0$`L&,```&1`0#,
+M8P```90!`/AC```!E`$`S&0```&1`0#L9````0$``$AE```!D0$`:&4```&1
+M`0"490```0$``*1E```!E`$`\&4```&1`0``9@```9$!`!!F```!D0$`(&8`
+M``&1`0`P9@```9$!`$!F```!D0$`4&8```&1`0!D9@```9$!`*!F```!`0``
+M]&8```&1`0`,9P```9$!`&!G```!`0``;&<```$!``!X9P```0$``)!G```!
+M`0``8&@```&1`0!P:````9$!`(!H```!D0$`D&@```&1`0"@:````9$!`+1H
+M```!D0$`Q&@```%Q``#L:````>D```QI```!Z0``,&D```'I```X:0```@(`
+M`&!I```!E`$`=&D```%*``"(:0```90!`*QI```!`0``$&H```$H`0`H:@``
+M`78``$QJ```!E`$`<&H```&1`0"8:@```90!`+1J```!D0$`X&H```&4`0``
+M:P```9$!`#!K```!E`$`9&L```&4`0"@:P```9$!`+AK```!4P$`W&L```&4
+M`0#H:P```0$```QL```!D0$`*&P```&4`0!8;````90!`&!L```!`0``;&P`
+M``$!``"(;````9$!`-!L```!Z0``'&T```&1`0!@;0```9$!`&AM```!`0``
+M>&T```&4`0"`;0```0$``)!M```!E`$`I&T```&1`0#$;0```90!`-AM```!
+ME`$`[&T```&4`0`L;@```90!`$QN```!E`$`8&X```&1`0"`;@```90!`+!N
+M```!E`$`Q&X```&4`0#T;@```90!`"QO```!E`$`2&\```&4`0!D;P```90!
+M`(!O```!E`$`G&\```&4`0#,;P```0$``-AO```!)0``X&\```$!```$<```
+M`5\!`!AP```!D0$`2'````&4`0!8<````24``(!P```!)0``B'````$!``"P
+M<````90!`,1P```!7P$`Y'````&1`0`4<0```90!`"1Q```!)0``6'$```$!
+M``!D<0```90!`'AQ```!D0$`C'$```$!``"8<0```90!`*QQ```!D0$`['$`
+M``$E``#T<0```0$``!QR```!E`$`,'(```%?`0!0<@```9$!`(!R```!E`$`
+MF'(```$E``#,<@```0$``.!R```!&0$``',```$!```0<P```0$``"1S```!
+MD0$`/',```$;``!D<P```3L!`(AS```!E`$`G',```&1`0"T<P```90!`,AS
+M```!D0$`Y',```$!``#P<P```90!``1T```!D0$`#'0```$Y`0`D=````90!
+M`"QT```!`0``-'0```$Y`0!`=````90!`%!T```!D0$`6'0```$!``!<=```
+M`0$``&1T```!`0``?'0```&4`0"0=````9$!`+AT```!E`$`S'0```&1`0#D
+M=````90!`/AT```!D0$`('4```$!```D=0```0$``"QU```!`0``,'4```$!
+M```T=0```0$``#QU```!`0``0'4```$!``!$=0```0$``$AU```!`0``3'4`
+M``$!``"`=0```90!`*!U```!`0``K'4```$!``"P=0```0$``+AU```!`0``
+MR'4```$M`0#4=0```O0``-AU```"$0``['4```&4`0`(=@```9$!`"1V```!
+MD0$`1'8```&1`0!<=@```90!`'!V```!.0$`A'8```$!``"@=@```90!`+1V
+M```!D0$`U'8```&4`0#H=@```9$!`!1W```!D0$`*'<```&1`0!4=P```0$`
+M`&!W```!E`$`?'<```$!``"(=P```90!`*!W```!D0$`T'<```$!``#<=P``
+M`90!`/AW```!`0``!'@```&4`0`<>````9$!`#QX```!E`$`:'@```&1`0#8
+M>````0$``&QY```!`0``>'D```$!``"`>0```90!`(AY```!`0``Y'D```&4
+M`0!`>@```0$``$QZ```!`0``8'H```$!``!L>@```0$``'QZ```!`0``8'L`
+M``$!``!H>P```0`!`'1[```!`0``@'L```$!``"$>P```@$``(A[```"`0``
+MC'L```(!``"0>P```@$``)1[```"`0``F'L```(!``"<>P```@$``*![```"
+M`0``I'L```(!``"L>P```0$``+Q[```!E`$`S'L```$_`0#4>P```0$``!Q\
+M```!D0$`2'P```&1`0!4?````0$``&!\```!`0``9'P```(!``!H?````@$`
+M`&Q\```"`0``<'P```(!``!T?````@$``'A\```"`0``?'P```(!``"`?```
+M`@$``(1\```"`0``E'P```$!``"D?````9$!`+Q\```!`0``S'P```&1`0#@
+M?````9$!`/!\```!E`$`!'T```&1`0!0?0```9$!`'Q]```!D0$`C'T```&1
+M`0"<?0```9$!`*Q]```!D0$`N'T```&4`0#(?0```9$!`-A]```!D0$`]'T`
+M``&4`0`$?@```9$!`!1^```!D0$`)'X```&1`0`T?@```9$!`$1^```!D0$`
+M5'X```&1`0!H?@```9$!`'A^```!D0$`E'X```&1`0"H?@```9$!`+1^```!
+MN```R'X```&1`0#<?@```9$!`/!^```!D0$`!'\```&1`0`8?P```9$!`"Q_
+M```!D0$`0'\```&1`0!4?P```9$!`&A_```!D0$`?'\```&1`0"0?P```9$!
+M`*1_```!D0$`N'\```&1`0#4?P```0$``.!_```!`0``\'\```&1`0#\?P``
+M`0$```B````!B0$`$(````$!```@@````90!`$2````!D0$`?(````&1`0",
+M@````90!`+B````!D0$`R(````&4`0#L@````9$!`/R````!E`$`*($```&1
+M`0`X@0```90!`%B!```!D0$`9($```$!``!L@0```0$``'B!```!`0``N($`
+M``&1`0#`@0```3D!`-"!```!E`$`Y($```&1`0#\@0```4H```B"```!E@``
+M%((```$!```H@@```0$``#2"```!5P``0((```$!``!8@@```8```&B"```!
+ME`$`?((```&1`0"4@@```8,!`*R"```!"@``Q((```$;`0#<@@```9$!``2#
+M```"`@``*(,```&4`0`\@P```0$``$"#```"`0``1(,```(!``!(@P```@$`
+M`$R#```"`0``4(,```(!``!4@P```@$``%B#```"`0``7(,```(!``!@@P``
+M`@$``'B#```!`0``G(,```&1`0"X@P```0$``-R#```!D0$`](,```$!```0
+MA````0$``#"$```!^P``3(0```$!``!<A````3D!`'"$```!`0``?(0```$Y
+M`0"DA````?L``+B$```!`0``U(0```&1`0#HA````0$``/B$```!.0$`#(4`
+M``$!```@A0```3D!`#"%```!^P``2(4```$!``!LA0```0`!`(B%```!E`$`
+MG(4```&1`0"LA0```90!`,2%```!D0$`S(4```$Y`0#<A0```90!`/"%```!
+MD0$`^(4```$Y`0`$A@```0$``!2&```!.0$`)(8```&4`0`XA@```9$!`$B&
+M```!E`$`7(8```&4`0!PA@```90!`(B&```!D0$`J(8```&1`0#$A@```9$!
+M`,R&```!.0$`W(8```&4`0#PA@```9$!`/B&```!.0$`#(<```&1`0`<AP``
+M`90!`#"'```!D0$`.(<```$Y`0!(AP```90!`%R'```!D0$`=(<```%*``"(
+MAP```9$!`)R'```!D0$`L(<```&1`0"\AP```98``,2'```!`0``T(<```$Y
+M`0#<AP```98```"(```!E`$`%(@```&1`0`HB````9$!`&B(```!D0$`<(@`
+M``$Y`0",B````4H``*2(```!D0$`U(@```$!``#DB````0$``!")```!`0``
+M'(D```$!```LB0```0$``&2)```!`0``;(D```$!``"`B0```0$``*2)```!
+M`0``V(D```$!``#@B0```0$``/")```!`0``#(H```$!```0B@```0$``!R*
+M```!`0``2(H```$!``!TB@```0$``*"*```!)0$`2(L```$!``!PBP```0$`
+M`'R+```!`0``A(L```$!```HC````0$``$",```!`0``6(P```$!``!PC```
+M`0$``(",```!`0``O(P```$!``#8C````0$```"-```!`0``&(T```$!``!`
+MC0```0$``%B-```!`0``@(T```$!``"8C0```0$```2.```"`@``+(X```'I
+M``!`C@```>D``%".```!`0``:(X```$!``!\C@```0$``)R.```!+P``M(X`
+M``$!``#0C@```2\``.R.```!`0``O)````$O``#<D````2\``/R0```!+P``
+M-)$```&1`0!(D0```0$``&B1```!D0$`=)$```("``!XD0```@(``*R1```!
+M+P``Q)$```&1`0#8D0```9$!``B2```!E`$`1)(```&4`0!8D@```9$!`'"2
+M```!2@``A)(```$Y`0",D@```5(``+B2```!`0``$),```%J`0!(DP```1@!
+M`&R3```!`0``<),```$!``!XDP```0$``'R3```!`0``A),```$!``"(DP``
+M`0$``)"3```!`0``F),```$!``"XDP```0$``,R3```!(P$`V),```$!````
+ME````0$``!"4```!P```()4```$!```TE0```9$!`$R5```!D0$`8)4```&1
+M`0"$E0```9$!`*"5```!D0$`L)4```&4`0#(E0```9$!`.25```!`0``^)4`
+M``&1`0`0E@```9$!`"26```!D0$`3)8```&1`0!HE@```9$!`'B6```!E`$`
+MD)8```&1`0"LE@```9$!`.R6```!D0$`()@```$!```HF````0$``#"8```!
+ME`$`:)@```$!``!LF````@$``'"8```"`0``=)@```(!``!XF````@$``("8
+M```!`0``B)@```&1`0"PF````:,``,"8```!4P$`T)@```&4`0#@F````0$`
+M`.R8```!`0``^)@```%3`0`0F0```9$!`!R9```!4P$`5)D```$!``!8F0``
+M`@$``%R9```"`0``8)D```(!``!DF0```@$``'"9```!`0``?)D```&1`0",
+MF0```0$``)B9```!D0$`T)D```$!``#8F0```0$``."9```!E`$`()H```$!
+M```DF@```0$``"R:```!`0``,)H```$!```\F@```9$!`%2:```!E`$`7)H`
+M``$!``!DF@```3D!`'":```!`0``@)H```&1`0"@F@```4H``#R;```!`0``
+MI)L```$!``#`FP```0$``*R<```!`0``_)P```$!```$G0```0$``%B=```!
+M`0``))X```$!``#LG@```9$!``2?```!D0$`$)\```$!```<GP```90!`#2?
+M```!+P``;)\```'0``!\GP```0$``)"?```!Z0``&*````&:`0`DH````0$`
+M`#R@```!`0``3*````&1`0!@H````9$!`&B@```!.0$`>*````&4`0"<H```
+M`0$``+2@```!E`$`P*````$!``#,H````0$``/"@```!D0$`^*````$Y`0`$
+MH0```0$``!BA```!`0``**$```%,`0`PH0```0$``$"A```!`0``8*$```&4
+M`0!TH0```0$``(2A```!3`$`C*$```$!``"\H0```4P!`,2A```!`0``V*$`
+M``$!``#LH0```0$``#RB```!`0``J*(```$!``"XH@```7P!`,"B```!`0``
+MS*(```$!``#@H@```0$``/2B```!D0$`_*(```$Y`0`,HP```0$``""C```!
+MD0$`**,```$Y`0`XHP```0$``$"C```!`0``8*,```%,`0!HHP```0$``)2C
+M```!`0``G*,```&$`0#$HP```4P!`,RC```!`0``]*,```$!```0I````0$`
+M`"BD```!:0$`/*0```("``!`I````@(``$2D```"U0``8*0```$@`0!HI```
+M`84``,"D```!E`$`W*0```&1`0#HI````90!`/"D```!`0``_*0```$!```<
+MI0```9$!`"BE```!E`$`,*4```$!``!$I0```0$``%BE```!D0$`9*4```$!
+M``!LI0```3D!`'BE```"`@``?*4```("``"0I0```0$``*BE```!`0``L*4`
+M``$!``#$I0```0$``"RF```!X```2*8```$!```@IP```0$``#2G```!3`$`
+M/*<```$!``"<IP```9$!`+"G```!D0$`Q*<```&1`0#8IP```9$!`.RG```!
+MD0$`%*@```$!```8J````@$``!RH```"`0``(*@```(!```DJ````@$``"BH
+M```"`0``+*@```(!```PJ````@$``#2H```"`0``.*@```(!``!0J````0$`
+M`)2H```!D@$`G*@```(Q``"@J````BP!`,"H```!D0$`T*@```&4`0#HJ```
+M`9$!``"I```!D0$`**D```$!```TJ0```90!`$BI```!D0$`7*D```&1`0!P
+MJ0```9$!`(BI```!`0``E*D```&4`0"HJ0```9$!`+RI```!D0$`S*D```&4
+M`0`$J@```9$!`#BJ```!D0$`2*H```&4`0!PJ@```9$!`(RJ```!E`$`M*H`
+M``&4`0`0JP```0$``#BK```!`0``6*L```&4`0!PJP```90!`(BK```!E`$`
+MH*L```&4`0"XJP```90!``"L```!`0``#*P```&1`0`8K````90!`#"L```!
+M`0``G*P```&1`0"\K````9$!`.BL```!`0``^*P```&4`0!$K0```9$!`%2M
+M```!D0$`9*T```&1`0!TK0```9$!`(2M```!D0$`E*T```&1`0"DK0```9$!
+M`+BM```!D0$`]*T```$!``!(K@```9$!`&"N```!D0$`M*X```$!``#`K@``
+M`0$``,2N```!`0``S*X```$!``#0K@```0$``-BN```!`0``W*X```$!``#D
+MK@```0$``/"N```!`0```*\```$!```4KP```0$``!RO```!`0``Y*\```&1
+M`0#TKP```9$!``2P```!D0$`%+````&1`0`DL````9$!`#BP```!D0$`2+``
+M``'.``!PL````>D``)"P```!Z0``M+````'I``"\L````@(``.BP```!D0$`
+M_+````&1`0`4L0```4H``"RQ```!E`$`4+$```$!``"0L0```0$``/BQ```!
+MY0``!+(```&4`0`4L@```9$!`""R```!10$`-+(```$W``!8L@```90!`'2R
+M```!D0$`G+(```&4`0"XL@```9$!`.2R```!E`$`!+,```&1`0`TLP```90!
+M`&2S```!E`$`B+,```&1`0"@LP```0D!`,2S```!E`$`[+,```&1`0#TLP``
+M`@(``!RT```!Z0``:+0```&1`0"@M````9$!`,"T```!E`$`U+0```&4`0#H
+MM````90!`"BU```!E`$`2+4```&4`0!<M0```9$!`'RU```!E`$`K+4```&4
+M`0#`M0```90!`.RU```!E`$`!+8```$!```\M@```90!`%BV```!E`$`=+8`
+M``&4`0"0M@```90!`*RV```!E`$`W+8```$!``#HM@```24``/"V```!`0``
+M$+<```%?`0`DMP```9$!`%2W```!E`$`9+<```$E``",MP```24``)2W```!
+M`0``O+<```&4`0#0MP```5\!`/"W```!D0$`(+@```&4`0`PN````24``&2X
+M```!`0``<+@```&4`0"$N````9$!`)BX```!`0``I+@```&4`0"XN````9$!
+M`/BX```!)0```+D```$!```HN0```90!`#RY```!7P$`7+D```&1`0",N0``
+M`90!`*2Y```!)0``W+D```&4`0#\N0```90!`""Z```!D0$`:+H```'A``"`
+MN@```0$``(BZ```!`0``H+H```$9`0#`N@```0$``-2Z```!D0$`[+H```$;
+M```4NP```3L!`#B[```!`0``1+L```&4`0!8NP```9$!`&"[```!.0$`>+L`
+M``&4`0"`NP```0$``(B[```!.0$`E+L```&4`0"DNP```9$!`*R[```!`0``
+ML+L```$!``"XNP```0$``-"[```!E`$`Y+L```&1`0`,O````90!`""\```!
+MD0$`.+P```&4`0!,O````9$!`'"\```!E`$`A+P```&1`0"<O````90!`+"\
+M```!D0$`V+P```$!``#<O````0$``.2\```!`0``Z+P```$!``#LO````0$`
+M`/2\```!`0``^+P```$!``#\O````0$```"]```!`0``!+T```$!```XO0``
+M`90!`%B]```!`0``7+T```$!``!DO0```0$``&B]```!`0``<+T```$!``!T
+MO0```0$``'R]```!`0``A+T```$!``",O0```0$``)R]```!+0$`J+T```*]
+M``"LO0```@L!`+"]```"\```Q+T```&4`0#@O0```9$!`/R]```!D0$`'+X`
+M``&1`0`PO@```4H``%R^```!E`$`<+X```&1`0"0O@```90!`*2^```!D0$`
+MT+X```&1`0#DO@```9$!`!"_```!`0``'+\```&4`0`XOP```0$``$2_```!
+ME`$`7+\```&1`0",OP```0$``)B_```!E`$`M+\```$!``#`OP```90!`-B_
+M```!D0$`^+\```&4`0`8P````9$!`(C````!`0``&,$```$!```DP0```0$`
+M`"S!```!E`$`-,$```$!``"PP0```0$``+S!```!`0``R,$```$!``#8P0``
+M`0$``,S"```!`0``U,(```$!``#HP@```0$``/3"```!`0``_,(```$!```0
+MPP```0$``!S#```!``$`*,,```$!```XPP```0$``#S#```"`0``0,,```(!
+M``!$PP```@$``$C#```"`0``3,,```(!``!0PP```@$``%3#```"`0``6,,`
+M``(!``!<PP```@$``&3#```!`0``<,,```$!``"`PP```90!`)3#```!E`$`
+MJ,,```$!``"TPP```90!`+S#```!`0``U,,```&4`0#DPP```0$``"#$```!
+ME`$`0,0```&4`0!8Q````90!`'C$```!E`$`C,0```&4`0"<Q````9H!`*3$
+M```!`0``M,0```$!``"XQ````0$``,#$```!`0``Q,0```$!``#4Q````0$`
+M`.C$```!`0``],0```$!```DQ0```9$!`##%```!`0``/,4```$!``!0Q0``
+M`0$``(S%```!+P``G,4```$O```$Q@```9$!`!#&```!`0``',8```$!``!`
+MQ@```9$!`$S&```!`0``;,8```&1`0!XQ@```0$``)C&```!`0``I,8```$!
+M``"TQ@```9$!`,#&```!`0``S,8```$!``#<Q@```90!`/C&```!D0$`",<`
+M``&1`0`<QP```9$!`"S'```!E`$`0,<```&1`0!,QP```0$``&#'```!D0$`
+M=,<```&1`0"$QP```0$``)3'```!D0$`F,<```$!``"TQP```9$!`,#'```!
+M`0``",@```&1`0`\R````9$!`$C(```!`0``6,@```&4`0!LR````9$!`(#(
+M```!D0$`E,@```&1`0"HR````9$!`/3(```!D0$`(,D```&1`0`\R0```9$!
+M`$S)```!D0$`6,D```$!``!HR0```0$``'3)```!E`$`A,D```&1`0"0R0``
+M`20!`)C)```!`0``I,D```$!``"PR0```0$``,#)```!E`$`X,D```&1`0#L
+MR0```0$``/C)```!`0```,H```$!```8R@```0$``"3*```!`0``/,H```&1
+M`0!0R@```9$!`&#*```!E`$`E,H```$Y`0"DR@```90!`+C*```!D0$`T,H`
+M``%*``#<R@```1T``.3*```!`0``_,H```$!```0RP```0$``"3+```!D0$`
+M4,L```&1`0!<RP```0$``&S+```!$`$`>,L```$!``",RP```9$!`)S+```!
+MD0$`K,L```&1`0"\RP```90!`-#+```!D0$`Z,L```&1`0`,S````90!`!S,
+M```!D0$`*,P```$!```TS````90!`$3,```!D0$`:,P```%1``!XS````90!
+M`(S,```!D0$`I,P```&<``"\S````=<``-3,```!.```[,P```&1`0`8S0``
+M`@0``!S-```"`@``(,T```("```DS0```@(``$#-```!`0``8,T```%:`0!T
+MS0```0$``(C-```!.0$`M,T```%:`0#(S0```0$``,S-```!`0``U,T```$!
+M``#<S0```0$``.#-```!`0``Z,T```$!``#LS0```0$``/3-```!`0``^,T`
+M``$!````S@```0$```3.```!`0``&,X```&1`0`HS@```9$!`#S.```!D0$`
+M1,X```$Y`0!(S@```0$``%S.```!D0$`;,X```$!``"`S@```9$!`(C.```!
+M.0$`F,X```$!``#`S@```9$!`-#.```!`0``Y,X```&1`0#LS@```3D!`/S.
+M```!D0$`",\```$!```<SP```3D!`"S/```!6@$`0,\```$!``!HSP```0`!
+M`(C/```!`0``F,\```&4`0"@SP```0$``+3/```!E`$`R,\```&4`0#<SP``
+M`90!``C0```!`0``%-````$E`0`DT````24!`#C0```!E`$`5-````&1`0!@
+MT````0$``&C0```!`0``D-````$=``"8T````0$``*30```!.0$`L-````$=
+M``"XT````0$``-C0```!`0``)-$```&4`0`TT0```9$!`#S1```!.0$`6-$`
+M``%*``!PT0```9$!`)C1```!BP``L-$```$!``#,T0```2\``.C1```!`0``
+M\-$```$!``#\T0```2\```C2```!`0``'-(```$O``!0T@```9$!`'#2```!
+MD0$`B-(```("``"@T@```90!`.32```!E`$`%-,```&1`0`DTP```90!`#C3
+M```!D0$`7-,```&4`0!DTP```0$``&S3```!.0$`>-,```$!``!\TP```0$`
+M`(33```!`0``E-,```$!``"PTP```0$``+33```!`0``O-,```$!``#`TP``
+M`0$``-#3```!`0``U-,```$!``#@TP```0$``"#4```!`0``.-0```&4`0!`
+MU````0$``)C4```!`0``G-0```%S`0"DU````0$``+34```!`0``U-0```$!
+M``#\U````0$``!S5```!E`$`,-4```&1`0`\U0```@(``%S5```!`0``<-4`
+M``$!``"8U0```@(``-#5```!`0``U-4```$!``#<U0```0$``.#5```!`0``
+MZ-4```$!```(U@```0$``"#6```!`0``.-8```$!``!0U@```0$``&C6```!
+M`0``@-8```$!``"@U@```0$``$C7```!`0``A-<```$!``#0UP```0$``/S7
+M```!+P``)-@```$O``!,V````2\``'#8```!+P``F-@```$O``#DV````9$!
+M`/#8```!`0``#-D```($```LV0```0$``##9```!`0``.-D```$!```\V0``
+M`0$``$C9```!`0``3-D```$!``!4V0```0$``/S9```!`0```-H```$!```(
+MV@```0$```S:```!`0``%-H```$!```<V@```0$``$3:```!D0$`6-H```&1
+M`0"(V@```0$``(S:```!`0``E-H```$!``"8V@```0$``*#:```!`0``L-H`
+M``&4`0#<V@```9$!`.#:```!`0``Z-H```$!``#PV@```0$```3;```!`0``
+M%-L```&4`0`HVP```0$``#C;```!E`$`:-L```&1`0"`VP```>$``*C;```!
+MD0$`N-L```&4`0#HVP```9$!`/C;```!E`$`)-P```&1`0`TW````90!`'#<
+M```!D0$`I-P```&1`0"TW````90!`-C<```!D0$`Z-P```&4`0`4W0```9$!
+M`#3=```!`0``4-T```$!``!@W0```0$``*C=```!E`$`R-T```&1`0#\W0``
+M`9$!`##>```!`0``--X```$!```\W@```0$``$#>```!`0``2-X```$!``"(
+MW@```0$``,C>```!`0``"-\```$!```@WP```0$``##?```!%```2-\```$!
+M``!HWP```0$``'S?```!`0``B-\```$!``"@WP```0$``.3?```!(P$`\-\`
+M``$C`0`LX````0$``%3@```!`0``<.````$!``"0X````0$``+#@```!`0``
+MZ.````$!```<X0```0$``##A```!`0``:.$```$!``"LX0```0$``/#A```!
+M`0``#.(```$!```PX@```0$``&3B```!`0``K.(```$!``#\X@```0$```SC
+M```!`0``..,```$!``",XP```9$!`*CC```!`0``K.,```(%``"PXP```@4`
+M`+3C```"!0``4.0```$6`0!@Y````0$``'SD```!`0``G.0```$!``#$Y```
+M`0$``-#D```!`0``^.0```$!```,Y0```0$``!SE```!`0``*.4```$!```\
+MY0```0$``&#E```!`0``G.4```$!``#$Y0```0$``-#E```!`0``(.8```$!
+M```TY@```0$``&3F```!`0``>.8```$!``"$Y@```0$``)#F```!`0``G.8`
+M``$!``"@Y@```0$``+3F```!`0``N.8```(!``"\Y@```@$``,#F```"`0``
+MQ.8```(!``#(Y@```@$``,SF```"`0``T.8```(!``#4Y@```@$``/3F```!
+M`0``%.<```$!```TYP```0$``(CG```!`0``N.<```$!``#0YP```0$``#CH
+M```!`0``E.@```$!```,Z0```9$!`%SI```!D0$`:.D```%N``"`Z0```@4`
+M`(3I```"`@``N.D```$!``#HZ0```0$```SJ```!`0``*.H```$!``!`Z@``
+M`0$``%CJ```!`0``?.H```$!``"<Z@```0$``+#J```!`0``S.H```$!``#T
+MZ@```0$``##K```!`0``1.L```$!``!8ZP```0$``&SK```!`0``H.L```$!
+M``"\ZP```0$``"SL```!`0``2.P```$E`0!4[````0$``&CL```!`0``;.P`
+M``$!``!T[````0$``(CL```!`0``D.P```$!``"X[````24!`,3L```!`0``
+MT.P```$!``!([0```0$``'3M```!`0``N.T```$!``#\[0```0$``#CN```!
+M`0``3.X```$!``!<[@```0$``'SN```!`0``Q.X```("``#@[@```0$``/SN
+M```!`0``E.\```&1`0#D[P```0$``/3O```!E`$`_.\```$!```4\````0$`
+M`!SP```!`0``*/````$!```P\````0$``#SP```!`0``1/````$!``!0\```
+M`0$``'SP```!`0``I/````$!``#(\````0$``-#P```!`0``\/````$!``#\
+M\````0$``$CQ```!`0``4/$```$!``"@\0```0$``+SQ```!`0``!/(```$!
+M```8\@```0$``"3R```"`@``*/(```("``"L\@```90!`,#R```!`0``Q/(`
+M``(!``#(\@```@$``,SR```"`0``T/(```(!``#4\@```@$``-CR```"`0``
+MW/(```(!``#@\@```@$``.3R```"`0``_/(```$!```@\P```9$!`$CS```!
+MD0$`8/,```$!``!\\P```?8``(SS```!"0$`F/,```&4`0"P\P```0$``+SS
+M```!`0``R/,```$)`0#L\P```9$!`/CS```!"0$`+/0```%J`0!D]````1@!
+M`(CT```!`0``C/0```$!``"4]````0$``)CT```!`0``H/0```$!``"D]```
+M`0$``*ST```!`0``M/0```$!``#L]````0$```#U```!(P$`#/4```$!``!`
+M]0```0$``%#U```!8P``G/4```&1`0#4]0```9$!`.#U```!E`$`#/8```&1
+M`0#,]@```0$``#3W```!`0``//<```$!``!0]P```0$``&#W```!`0``</<`
+M``$!``"L]P```9$!`-3W```!D0$`Y/<```&1`0#\]P```9$!``CX```!`0``
+M)/@```&1`0`T^````90!`%CX```!D0$`9/@```$!``!\^````9$!`(CX```!
+M`0``I/@```&1`0"P^````0$``,#X```!E`$`T/@```&1`0#<^````0$``/#X
+M```!E`$``/D```&1`0`,^0```0$``"#Y```!E`$`,/D```&1`0`\^0```0$`
+M`$3Y```!`0``2/D```$!``!<^0```90!`&SY```!D0$`B/D```$!``"<^0``
+M`90!`+#Y```!D0$`^/D```&1`0`8^@```9$!`"3Z```!`0``./H```&4`0!(
+M^@```9$!`%C[```!`0``9/L```(L`0!H^P```C$``&S[```"P@``A/L```&4
+M`0"@^P```9$!`,3[```!D0$`[/L```&4`0#T^P```0$```#\```!E`$`./P`
+M``&1`0!0_````7D!`%C\```!`0``8/P```$Y`0!L_````0$``'S\```!D0$`
+M-/T```$!```<_@```0$``&S^```!`0``=/X```$!``#(_@```0$``)C_```!
+M`0``S``!``&1`0#H``$``9$!```!`0`!D0$`%`$!``&1`0`H`0$``9$!`$0!
+M`0`!D0$`8`$!``&1`0!T`0$``9$!`(P!`0`!D0$`H`$!``&1`0#4`0$``9$!
+M`.P!`0`!D0$`^`$!``$!```$`@$``90!`!P"`0`!+P``^`(!``$!```$`P$`
+M`;0```P#`0`"`@``$`,!``("```4`P$``@(``!@#`0`"`@``7`,!``'I```P
+M!`$``>D``$`$`0`"`@``2`0!``("``!H!`$``0$``'@$`0`!`0``G`0!``$!
+M``"@!`$``@(``-0$`0`!T`````4!``$F```4!0$``84!`!P%`0`!`0``+`4!
+M``&4`0!4!0$``0$``%P%`0`!`0``:`4!``&/`0!P!0$``0$``'@%`0`!`0``
+MD`4!``&4`0"@!0$``0$``*@%`0`!`0``N`4!``$!``#`!0$``0$``,@%`0`!
+M&@``U`4!``$!``#@!0$``0$``/`%`0`!E`$`!`8!``&1`0`4!@$``9$!`"`&
+M`0`!0P``-`8!``$!```X!@$``0$``$`&`0`!`0``2`8!``$!``!0!@$``0$`
+M`%0&`0`!`0``7`8!``$!``!D!@$``0$``'0&`0`!`0``@`8!``$!``"<!@$`
+M`0$``+@&`0`!`0``Q`8!``$!``#,!@$``0$``-0&`0`!`0``Y`8!``$!``#\
+M!@$``0$```0'`0`!`0``#`<!``$!```<!P$``0$``#0'`0`!`0``0`<!``$!
+M``!0!P$``8X!`%@'`0`!`0``<`<!``$!``"0!P$``90!`*`'`0`!`0``J`<!
+M``$!``"T!P$``0$``+P'`0`!`0``S`<!``$!``#4!P$``0$``.0'`0`!C@$`
+M[`<!``$!```,"`$``8X!`!0(`0`!`0``)`@!``$!``!$"`$``8X!`%@(`0`!
+M`0``:`@!``$!``!X"`$``8X!`(`(`0`!`0``E`@!``$!``"H"`$``0$``/@(
+M`0`!`0``;`D!``$!``!\"0$``7P!`(0)`0`!`0``H`D!``$!``"L"0$``0$`
+M`+0)`0`!`0``O`D!``$!``#,"0$``0$``"`*`0`!`0``-`H!``$!``!("@$`
+M`9$!`%`*`0`!.0$`7`H!``%#``!P"@$``9$!`'@*`0`!.0$`B`H!``$!``"0
+M"@$``0$``*`*`0`!C@$`J`H!``$!``#("@$``3,!`-`*`0`!`0``W`H!``$!
+M``#D"@$``0$``.P*`0`!`0``_`H!``$!```("P$``<<```P+`0`!`0``'`L!
+M``$!```H"P$``:<``"P+`0`!`0``1`L!``$!``!0"P$``8P!`%0+`0`!`0``
+M8`L!``%Q`0!H"P$``0$``(`+`0`!'0$`J`L!``&.`0"P"P$``0$``-@+`0`!
+M`0``]`L!``$!``#\"P$``0$``!@,`0`!@@``,`P!``("```T#`$``@(``$@,
+M`0`!<P``;`P!``%$``!\#`$``84!`(P,`0`!(`$`E`P!``&%``#L#`$``90!
+M``@-`0`!D0$`%`T!``&4`0`<#0$``0$``"@-`0`!`0``2`T!``&1`0!4#0$`
+M`90!`%P-`0`!`0``<`T!``$!``"$#0$``9$!`)`-`0`!`0``F`T!``$Y`0"D
+M#0$``@(``*@-`0`"`@``O`T!``$!``#4#0$``0$``-P-`0`!`0``\`T!``$!
+M```$#@$``0$``&@.`0`!`0``K`X!``$!``"X#@$``0$``,@.`0`!`0``^`X!
+M``$!```4#P$``0$``#0/`0`!`0``9`\!``$!``"T#P$``0$``-`/`0`!`0``
+M&!`!``$!```H$`$``0$``#`0`0`!`0``.!`!``$!``!`$`$``0$``%`0`0`!
+M`0``7!`!``$!``"L$`$``0$``+@0`0`!`0``O!`!``$!``#,$`$``0$``%P1
+M`0`!`0``:!$!``$!``!X$0$``0$``,`1`0`!`0``'!(!``$!```P$@$``0$`
+M`(`2`0`!`0``D!(!``$!``"<$@$``0$``#`3`0`!`0``4!,!``$!``"8$P$`
+M`0$``*@3`0`!`0``M!,!``$!``#P$P$``:T``!`4`0`"D`$`%!0!``(!```\
+M%`$``9$!`%`4`0`!D0$`9!0!``&1`0!X%`$``9$!`(04`0`!`0``D!0!``&M
+M``#`%`$``9$!`-04`0`!D0$`_!0!``$!````%0$``@$```05`0`"`0``"!4!
+M``(!```,%0$``@$``!`5`0`"`0``%!4!``(!```8%0$``@$``!P5`0`"`0``
+M(!4!``(!```X%0$``0$``'P5`0`!DP``A!4!``(Q``"(%0$``BP!`*@5`0`!
+MD0$`N!4!``&4`0#0%0$``9$!`.@5`0`!D0$`$!8!``$!```<%@$``90!`#`6
+M`0`!D0$`1!8!``&1`0!8%@$``9$!`'`6`0`!`0``?!8!``&4`0"0%@$``9$!
+M`*06`0`!D0$`M!8!``&4`0#L%@$``9$!`"`7`0`!D0$`=!<!``&1`0"8%P$`
+M`9$!`+07`0`!D0$`W!<!``&1`0#P%P$``9$!``@8`0`!2@``(!@!``&4`0!,
+M&`$``90!`&@8`0`!D0$`D!@!``&4`0"L&`$``9$!`-@8`0`!E`$`^!@!``&1
+M`0`H&0$``90!`%P9`0`!E`$`E!D!``&1`0"L&0$``=@``,@9`0`!E`$`_!D!
+M``&4`0`$&@$``0$``!`:`0`!E`$`/!H!``&4`0",&@$``0$``*0:`0`!E`$`
+MV!H!``&4`0`$&P$``0$``#0;`0`!`0``5!L!``&4`0!L&P$``90!`(0;`0`!
+ME`$`G!L!``&4`0"T&P$``90!`/P;`0`!`0``"!P!``&1`0`4'`$``90!`#`<
+M`0`!`0``D!P!``$!``#('`$``9$!`-0<`0`!E`$`Z!P!``&1`0`('0$``9$!
+M`$@=`0`!`0``6!T!``&4`0"T'0$``90!`,P=`0`!D0$`W!T!``&1`0#L'0$`
+M`9$!`/P=`0`!D0$`#!X!``&1`0`<'@$``9$!`"P>`0`!D0$`0!X!``&1`0!(
+M'@$``0$``%P>`0`!`0``?!X!``&1`0",'@$``9$!`)P>`0`!D0$`L!X!``&1
+M`0#X'@$``0$``$P?`0`!D0$`9!\!``&1`0#,'P$``0$``-P?`0`!`0``X!\!
+M``(!``#D'P$``@$``.@?`0`"`0``[!\!``(!``#P'P$``@$``/0?`0`"`0``
+M`"`!``$!```8(`$``0$``#0@`0`!`0``4"`!``$!``!4(`$``0$``&`@`0`!
+M`0``<"`!``$!``"((`$``0$``)0@`0`!`0``2"$!``$!``!<(0$``0$``)0A
+M`0`!D0$`J"$!``&1`0"X(0$``9$!`,@A`0`!D0$`V"$!``&1`0#L(0$``9$!
+M`/PA`0`!*0$`6"(!``$!``"P(@$``9$!`,`B`0`!D0$`T"(!``&1`0#@(@$`
+M`9$!`/`B`0`!D0$``",!``&1`0`0(P$``9$!`"0C`0`!D0$`1",!``&1`0!8
+M(P$``9$!`%PC`0`!`0``A",!``&1`0"4(P$``9$!`*0C`0`!D0$`M",!``&1
+M`0#$(P$``9$!`-@C`0`!D0$`Z",!``$I`0`4)`$``>D``#0D`0`!Z0``8"0!
+M``'I``"$)`$``>D``-`D`0`!D0$`_"0!``&1`0`<)0$``0$``&`E`0`!`0``
+MH"4!``$!``"\)0$``0$``"`F`0`!E`$`,"8!``&1`0"`)@$``90!`*@F`0`!
+MD0$`L"8!``("``#8)@$``>D``"0G`0`!D0$`7"<!``&1`0!\)P$``90!`)`G
+M`0`!E`$`I"<!``&4`0#D)P$``90!``0H`0`!E`$`'"@!``&1`0`P*`$``9$!
+M`'@H`0`!`0``D"@!``$!``"H*`$``0$``+@H`0`!E`$`P"@!``$!``#4*`$`
+M`0$``.@H`0`!D0$`""D!``&4`0`X*0$``90!`$PI`0`!E`$`>"D!``&4`0"0
+M*0$``0$``,@I`0`!E`$`Y"D!``&4`0``*@$``90!`!PJ`0`!E`$`."H!``&4
+M`0!H*@$``90!`(@J`0`!E`$`K"H!``&1`0#T*@$``0X``"`K`0`!`0``+"L!
+M``$E```T*P$``0$``%@K`0`!7P$`;"L!``&1`0"<*P$``90!`*PK`0`!)0``
+MU"L!``$E``#<*P$``0$```0L`0`!E`$`&"P!``%?`0`X+`$``9$!`&@L`0`!
+ME`$`>"P!``$E``"L+`$``0$``+@L`0`!E`$`S"P!``&1`0#@+`$``0$``.PL
+M`0`!E`$``"T!``&1`0!`+0$``24``$@M`0`!`0``<"T!``&4`0"$+0$``5\!
+M`*0M`0`!D0$`U"T!``&4`0#L+0$``24``#`N`0`!D0$`2"X!``&1`0"X+@$`
+M`5\!`,@N`0`!`0``\"X!``$!```(+P$``0$``#`O`0`!`0``<"\!``&1`0"$
+M+P$``9$!`)PO`0`!D0$`M"\!``$D```,,`$``18``!0P`0`!`0``*#`!``&1
+M`0!4,`$``9$!`&0P`0`!E`$`?#`!``&1`0"0,`$``9$!`*`P`0`!E`$`M#`!
+M``&1`0#$,`$``0$``,PP`0`!`0``U#`!``$!``#<,`$``0$``.PP`0`!`0``
+M`#$!``&1`0`4,0$``9$!`"@Q`0`!D0$`/#$!``&1`0!,,0$``90!`%@Q`0`!
+M`0``;#$!``&1`0"`,0$``9$!`)0Q`0`!D0$`J#$!``&1`0"X,0$``90!`,PQ
+M`0`!D0$`X#$!``&4`0#T,0$``9$!``0R`0`!E`$`&#(!``&1`0`L,@$``9$!
+M`$`R`0`!D0$`5#(!``&1`0!H,@$``9$!`'PR`0`!D0$`J#(!``&1`0"X,@$`
+M`90!`.@R`0`!`0``_#(!``$6```4,P$``90!`"@S`0`!D0$`.#,!``&4`0!,
+M,P$``9$!`&`S`0`!D0$`<#,!``&4`0"@,P$``9$!`+0S`0`!D0$`R#,!``&1
+M`0#<,P$``9$!`/`S`0`!D0$`!#0!``&1`0`P-`$``9$!`%0T`0`!`0``:#0!
+M``$!``!\-`$``@(``*@T`0`!`0``K#0!``(!``"P-`$``@$``+0T`0`"`0``
+MN#0!``(!``"\-`$``@$``,`T`0`"`0``Q#0!``(!``#(-`$``@$``,PT`0`"
+M`0``T#0!``(!``#4-`$``@$``-@T`0`"`0``W#0!``(!``#@-`$``@$``.0T
+M`0`"`0``Z#0!``(!``#L-`$``@$``/`T`0`"`0``]#0!``(!``#X-`$``@$`
+M`/PT`0`"`0```#4!``(!```$-0$``@$```@U`0`"`0``##4!``(!```0-0$`
+M`@$``!0U`0`"`0``&#4!``(!```<-0$``@$``"0U`0`!`0``*#4!``$!```P
+M-0$``0$``#@U`0`!`0``0#4!``$!``!$-0$``0$``%`U`0`!`0``6#4!``$!
+M``!P-0$``0$``'@U`0`!`0``D#4!``$!``"4-0$``0$``+PU`0`!`0``P#4!
+M``$!``#0-0$``0$``.`U`0`!`0``Z#4!``$!``#T-0$``90!`!PV`0`!`0``
+M,#8!``$!```T-@$``0$``$@V`0`!`0``4#8!``$!``!4-@$``0$``'@V`0`!
+M`0``C#8!``$!``"0-@$``0$``)@V`0`!`0``H#8!``$!``#`-@$``0$``-@V
+M`0`!`0``W#8!``$!````-P$``0$``!0W`0`!`0``(#<!``$!```D-P$``@$`
+M`"@W`0`"`0``+#<!``(!```P-P$``@$``#0W`0`"`0``.#<!``(!```\-P$`
+M`@$``%`W`0`!`0``5#<!``&)``!<-P$``0$``'0W`0`!`0``>#<!``(!``!\
+M-P$``@$``(`W`0`"`0``A#<!``(!``"(-P$``@$``)`W`0`!`0``F#<!``$!
+M``"@-P$``0$``*@W`0`!`0``L#<!``$!``#$-P$``1D!`/@W`0`!`0``_#<!
+M``(!````.`$``@$```0X`0`"`0``"#@!``(!```,.`$``@$``!`X`0`"`0``
+M%#@!``(!```8.`$``@$``!PX`0`"`0``(#@!``(!```D.`$``@$``"@X`0`"
+M`0``+#@!``(!```P.`$``@$``#0X`0`"`0``.#@!``(!```\.`$``@$``$`X
+M`0`"`0``1#@!``(!``!(.`$``@$``$PX`0`"`0``4#@!``(!``!4.`$``@$`
+M`%@X`0`"`0``7#@!``(!``!@.`$``@$``&0X`0`"`0``:#@!``(!``"4.`$`
+M`0$``.@X`0`!D0$``#D!``&4`0`<.0$``0$``#0Y`0`!`0``3#D!``$!``!T
+M.0$``0$``)0Y`0`!`0``K#D!``$!``#8.0$``0$``/@Y`0`!H```"#H!``$!
+M```P.@$``0$``$0Z`0`!&P``3#H!``("``!P.@$``3L!`)0Z`0`!`0``H#H!
+M``&4`0"T.@$``9$!`+PZ`0`!.0$`U#H!``&4`0#<.@$``0$``.0Z`0`!.0$`
+M\#H!``&4`0``.P$``9$!``@[`0`!`0``##L!``$!```4.P$``0$``"P[`0`!
+ME`$`0#L!``&1`0!H.P$``90!`'P[`0`!D0$`E#L!``&4`0"L.P$``9$!`-`[
+M`0`!E`$`Y#L!``&1`0#\.P$``90!`!0\`0`!D0$`/#P!``$!``!`/`$``0$`
+M`$@\`0`!`0``3#P!``$!``!0/`$``0$``%@\`0`!`0``7#P!``$!``!@/`$`
+M`0$``&0\`0`!`0``:#P!``$!``"</`$``90!`+P\`0`!`0``P#P!``$!``#(
+M/`$``0$``,P\`0`!`0``U#P!``$!``#8/`$``0$``.`\`0`!`0``Y#P!``$!
+M``#L/`$``0$``/`\`0`!`0``^#P!``$!``#\/`$``0$```0]`0`!`0``##T!
+M``$!```0/0$``0$``"@]`0`!`0``-#T!``$!``!,/0$``0$``%`]`0`!`0``
+M6#T!``$!``!@/0$``0$``&@]`0`!`0``<#T!``$!``!X/0$``0$``(`]`0`!
+M`0``B#T!``$!``"8/0$``2T!`*0]`0`"+```J#T!``*K``"L/0$``D\!`+`]
+M`0`"T@``M#T!``(5``"X/0$``EP!`+P]`0`"V0``P#T!``+D``#4/0$``90!
+M`/`]`0`!D0$`##X!``&1`0`L/@$``9$!`$`^`0`!2@``;#X!``&4`0"`/@$`
+M`9$!`(@^`0`!,```E#X!``'=``"T/@$``90!`,@^`0`!D0$`T#X!``&$``#\
+M/@$``9$!`!`_`0`!D0$`/#\!``$!``!(/P$``90!`&0_`0`!`0``<#\!``&4
+M`0"(/P$``9$!`+@_`0`!`0``Q#\!``&4`0#@/P$``0$``.P_`0`!E`$`!$`!
+M``&1`0`H0`$``90!`#Q``0`!E`$`B$`!``&1`0"T0`$``9$!`+Q``0`!`0``
+MR$`!``&4`0#00`$``0$``-Q``0`!E`$`[$`!``&1`0`T00$``0$``,A!`0`!
+M`0``U$$!``$!``#<00$``90!`.1!`0`!`0``_$(!``$!```,0P$``0$``!A#
+M`0`!`0``5$,!``$!``!@0P$``9$``&1#`0`!`0``>$,!``$!``"$0P$``0$`
+M`,Q#`0`!`0``U$,!``$!``#H0P$``0$``/1#`0`!`0``_$,!``$!```01`$`
+M`0$``"!$`0`!A0$`-$0!``$``0!`1`$``0$``%!$`0`!`0``5$0!``(!``!8
+M1`$``@$``%Q$`0`"`0``8$0!``(!``!D1`$``@$``&A$`0`"`0``;$0!``(!
+M``!P1`$``@$``'1$`0`"`0``B$0!``$!``"41`$``90!`*1$`0`!RP``L$0!
+M``'=``#`1`$``0$``,A$`0`!`0``T$0!``$!``#81`$``0$``.A$`0`!`0``
+M]$0!``$!```(10$``0$``!A%`0`!`0``,$4!``$!```\10$``0L``$1%`0`!
+M`0``5$4!``&4`0!T10$``90!`(Q%`0`!E`$`L$4!``&4`0#$10$``90!`-1%
+M`0`!7@``W$4!``%,``#H10$``8\!`/!%`0`!`0```$8!``$!```$1@$``0$`
+M``Q&`0`!`0``$$8!``$!```81@$``0$``!Q&`0`!`0``)$8!``$!```H1@$`
+M`0$``#!&`0`!`0``-$8!``$!```\1@$``0$``$1&`0`!`0``3$8!``$!``!0
+M1@$``0$``%Q&`0`!`0``;$8!``$!``"`1@$``0$``)1&`0`!`0``J$8!``$!
+M``"P1@$``0$``,!&`0`!D0$`Y$8!``&1`0#T1@$``3D!``!'`0`!`0``($<!
+M``$!```\1P$``0$``$Q'`0`!D0$`7$<!``$Y`0!H1P$``0$``)1'`0`!`0``
+MH$<!``$!``"L1P$``10!`,!'`0`!`0``V$<!``&1`0#L1P$``0$``"1(`0`!
+M`0``:$@!``$!``"@2`$``9$!`+!(`0`!E`$`Q$@!``&1`0#42`$``90!`.Q(
+M`0`!D0$``$D!``&1`0`420$``0$``"A)`0`!D0$`/$D!``&1`0!(20$``0$`
+M`%!)`0`!`0``6$D!``$!``!H20$``0$``)Q)`0`!E`$`I$D!``$!``"X20$`
+M`9$!`,A)`0`!60``T$D!``$!``#<20$``0$``.Q)`0`!1`$`%$H!``$!```@
+M2@$``0$``"Q*`0`!`0``-$H!``$!```\2@$``0$``$Q*`0`!`0``:$H!``$!
+M``"`2@$``9<``(Q*`0`!"`$`F$H!``%'`0"@2@$``0$``+A*`0`!D0$``$L!
+M``&1`0!(2P$``9$!`%1+`0`!)```H$L!``&1`0#,2P$``9$!`-Q+`0`!E`$`
+M]$L!``&1`0`(3`$``9$!`!Q,`0`!D0$`,$P!``&1`0!\3`$``9$!`*A,`0`!
+MD0$`Q$P!``&1`0#43`$``9$!`.!,`0`!L0``Z$P!``$!``#P3`$``0$```A-
+M`0`!,P``%$T!``%=```L30$``0$``$1-`0`!`0``4$T!``$!``!\30$``90!
+M`)A-`0`!D0$`J$T!``&4`0#H30$``9$!``1.`0`!`0``($X!``$!```L3@$`
+M`3D!`#Q.`0`!E`$`5$X!``&1`0!<3@$``0$``&1.`0`!.0$`=$X!``$!``"$
+M3@$``90!`(Q.`0`!`0``H$X!``&1`0"P3@$``90!`,1.`0`!D0$`U$X!``$!
+M``#H3@$``0$``/A.`0`!E`$`#$\!``&1`0`<3P$``90!`#!/`0`!D0$`/$\!
+M``$!``!43P$``4X``'!/`0`!D0$`?$\!``$!``"<3P$``0$``*Q/`0`!C```
+MO$\!``$!``#\3P$``9$!``A0`0`!E`$`&%`!``&1`0`P4`$``;D``$A0`0`!
+M2@``5%`!``&;``!D4`$``90!`'A0`0`!D0$`A%`!``$!``"(4`$``0$``)A0
+M`0`!`0``L%`!``&1`0#(4`$``9$!`-Q0`0`!D0$`#%$!``$6`0!,4@$``9$!
+M`&Q2`0`!D0$`A%(!``%"``"<4@$``2T``+12`0`!1@``S%(!``&1`0#@4@$`
+M`0$``%!3`0`!20``8%,!``%=`0"$4P$``@(``(A3`0`"`@``L%,!``$!``"\
+M4P$``90!`-A3`0`!D0$`Z%,!``$!``#X4P$``90!``!4`0`!`0``$%0!``&4
+M`0`D5`$``9$!`'A4`0`!``$`D%0!``$!``"@5`$``9P!`*Q4`0`!`0``O%0!
+M``$!``#<5`$``9$!`/!4`0`!E`$`^%0!``$!````50$``3D!``Q5`0`!`0``
+M$%4!``$!```850$``0$``"Q5`0`!L0``1%4!``&4`0!X50$``3D!`(A5`0`!
+M60``I%4!``&1`0"P50$``0$``+Q5`0`!`0``Q%4!``$!``#,50$``0$``-Q5
+M`0`!`0``^%4!``$!```05@$``9<``!Q6`0`!"`$`+%8!``&4`0!`5@$``9$!
+M`*16`0`!20``M%8!``%=`0#D5@$``90!`/16`0`!`0``^%8!``(!``#\5@$`
+M`@$```!7`0`"`0``!%<!``(!```(5P$``@$```Q7`0`"`0``$%<!``(!```4
+M5P$``@$``!A7`0`"`0``,%<!``&1`0`\5P$``90!`$17`0`!`0``7%<!``&1
+M`0!H5P$``90!`'A7`0`!D0$`D%<!``&1`0"H5P$``0$``,A7`0`!A0$`W%<!
+M``$!``#\5P$``0$``!18`0`!A0$`*%@!``$!```X6`$``0$``$18`0`!`0``
+M3%@!``$!``!46`$``0$``&18`0`!`0``=%@!``$!``"$6`$``0$``(A8`0`!
+M`0``H%@!``$!``"P6`$``0$``,!8`0`!`0``S%@!``$!``#46`$``0$``.18
+M`0`!`0```%D!``$!```060$``0$``!Q9`0`!`0``)%D!``$!```P60$``0$`
+M`#Q9`0`!`0``8%D!``$!``!H60$``0$``'19`0`!`0``?%D!``$!``"(60$`
+M`0$``+A9`0`!E`$`R%D!``$!``#460$``0$``.A9`0`!D0$`^%D!``&1`0``
+M6@$``0$``!1:`0`!D0$`'%H!``$Y`0`@6@$``0$``"A:`0`!`0``/%H!``&1
+M`0!$6@$``3D!`%A:`0`!D0$`:%H!``&1`0"<6@$``0`!`-A:`0`!`0``Z%H!
+M``&4`0#P6@$``0$```Q;`0`!E`$`'%L!``&4`0`L6P$``90!`#Q;`0`!`0``
+M3%L!``&4`0!@6P$``9$!`&Q;`0`!`0``F%L!``$!``"P6P$``24!`,!;`0`!
+M`0``U%L!``%K``#D6P$``0$``/Q;`0`!E`$`'%P!``&1`0`L7`$``90!`$A<
+M`0`!D0$`6%P!``&4`0!L7`$``9$!`)!<`0`!`0``I%P!``$!``"X7`$``0$`
+M`,1<`0`!`0``U%P!``&4`0#H7`$``9$!`/A<`0`!E`$`#%T!``&1`0`@70$`
+M`<L``"Q=`0`!`0``/%T!``&4`0!070$``9$!`&!=`0`!`0``>%T!``$!``"`
+M70$``0$``)!=`0`!`0``F%T!``$!``"@70$``0$``*A=`0`!`0``N%T!``$!
+M``#`70$``0$``,1=`0`!`0``%%X!``$!```<7@$``0$``"Q>`0`!`0``/%X!
+M``&4`0!,7@$``9$!`%1>`0`!.0$`<%X!``%*``!\7@$``0$``(Q>`0`!D0$`
+MG%X!``&%`0"L7@$``90!`,Q>`0`!E`$`^%X!``$!``#\7@$``0$```1?`0`!
+M`0``"%\!``$!```87P$``0$``!Q?`0`!`0``*%\!``$!``!L7P$``90!`'A?
+M`0`!`0``@%\!``%H``"87P$``0$``*!?`0`!`0``K%\!``$!``#X7P$``9$!
+M``A@`0`!D0$`%&`!``&4`0`D8`$``9$!`$!@`0`!D0$`4&`!``&1`0!L8`$`
+M`9$!`(1@`0`!D0$`E&`!``$!``#,8`$``0$``"AA`0`!`0``-&$!``$O``!@
+M80$``0$``&1A`0`!`0``;&$!``$!``!P80$``0$``'QA`0`!`0``@&$!``$!
+M``"(80$``0$``#!B`0`!`0``-&(!``$!```\8@$``0$``$!B`0`!`0``2&(!
+M``$!``!08@$``0$``&!B`0`!`0``<&(!``&4`0!X8@$``0$``(AB`0`!E`$`
+MG&(!``&1`0"\8@$``9$!`-!B`0`!D0$`]&(!``$!``#\8@$``0$```1C`0`!
+M`0``%&,!``$!```D8P$``0$``$!C`0`!`0``3&,!``&[``"H8P$``0$``*QC
+M`0`!`0``M&,!``$!``"X8P$``0$``,!C`0`!`0``Q&,!``$!``#,8P$``0$`
+M`-!C`0`!`0``V&,!``$!``#<8P$``0$``.1C`0`!`0``[&,!``$!``#T8P$`
+M`0$``!1D`0`!`0``)&0!``$!```L9`$``0$``#1D`0`!`0``/&0!``$!``!,
+M9`$``0$``%QD`0`!E`$`C&0!``&1`0"09`$``0$``)QD`0`!`0``J&0!``$!
+M``#`9`$``90!`/1D`0`!D0$`#&4!``$.```T90$``9$!`$AE`0`!`0``5&4!
+M``$!``"@90$``0$```AF`0`!E`$`*&8!``&1`0`X9@$``90!`%!F`0`!D0$`
+M8&8!``&4`0!X9@$``9$!`(AF`0`!E`$`K&8!``&1`0#H9@$``9$!`/AF`0`!
+ME`$`'&<!``&1`0`L9P$``90!`%AG`0`!D0$`>&<!``$!``"49P$``0$``*1G
+M`0`!`0``L&<!``'%``"X9P$``0$``.!G`0`!E`$``&@!``&1`0`\:`$``90!
+M`%QH`0`!D0$`;&@!``&4`0"(:`$``9$!`)AH`0`!E`$`K&@!``&1`0#`:`$`
+M`0$``-!H`0`!`0``V&@!``$!``#H:`$``90!``QI`0`!D0$`(&D!``$!```T
+M:0$``9$!`)1I`0`!6@``I&D!``%:``#H:0$``0$``"QJ`0`!`0``3&H!``$!
+M``!<:@$``0$``'!J`0`!`0``@&H!``$!``"0:@$``90!`*AJ`0`!E`$`O&H!
+M``&1`0#,:@$``90!`.!J`0`!D0$`]&H!``&1`0`(:P$``9$!`!AK`0`!E`$`
+M,&L!``&1`0!$:P$``9$!`%1K`0`!E`$`;&L!``&1`0!\:P$``9$!`)!K`0`!
+MD0$`I&L!``&1`0"T:P$``90!`,QK`0`!D0$`X&L!``&1`0#T:P$``9$!``AL
+M`0`!D0$`&&P!``&4`0`D;`$``0$``$AL`0`!`0``3&P!``$!``!4;`$``0$`
+M`%AL`0`!`0``8&P!``$!``!H;`$``0$``&QL`0`!`0``G&P!``$!``#L;`$`
+M`0$``"QM`0`!)0$`3&T!``$!``!P;0$``0$``(!M`0`!`0``B&T!``$!``"<
+M;0$``0$``+QM`0`!`0``X&T!``$!``#L;0$``0$``!!N`0`!`0``'&X!``$!
+M``!`;@$``0$``$QN`0`!`0``@&X!``$!``"0;@$``90!`*1N`0`!D0$`M&X!
+M``&4`0#(;@$``9$!`/AN`0`!D0$`#&\!``&1`0`<;P$``90!`$1O`0`!D0$`
+M6&\!``&1`0!H;P$``90!`(1O`0`!D0$`E&\!``&1`0"H;P$``9$!`+QO`0`!
+MD0$`S&\!``&4`0#T;P$``9$!``AP`0`!D0$`''`!``&1`0`P<`$``9$!`$!P
+M`0`!E`$`:'`!``&1`0!P<`$``@(``'1P`0`"`@``J'`!``$!``"\<`$``6L`
+M`,QP`0`!`0``U'`!``$!````<0$``90!`!QQ`0`!D0$`+'$!``&4`0!,<0$`
+M`9$!`(1Q`0`!60``Q'$!``$C`0#4<0$``2,!`#QR`0`!`0``@'(!``$!``"(
+M<@$``0$``)!R`0`!`0``F'(!``$!``"H<@$``0$```!S`0`!`0``%',!``$!
+M```H<P$``0$``#AS`0`!`0``3',!``$!``"$<P$``0$``+AS`0`!`0```'0!
+M``&1`0`,=`$``0$``&QT`0`!D0$`S'0!``&1`0`L=0$``9$!`(QU`0`!D0$`
+MM'4!``&1`0#`=0$``@(``#1V`0`!%```4'8!``$!``!L=@$``0$``'1V`0`!
+M`0``A'8!``$!``"8=@$``0$``+!V`0`!`0``Z'8!``$!````=P$``0$``"!W
+M`0`!`0``/'<!``$!``!$=P$``0$``%1W`0`!`0``:'<!``$!``"`=P$``0$`
+M`+AW`0`!`0``Z'<!``$6`0#X=P$``0$``#1X`0`!`0``='@!``$!``"(>`$`
+M`0$``+AX`0`!`0``Q'@!``$!```@>0$``0$``)!Y`0`!`0``N'D!``$!``#P
+M>0$``0$``"1Z`0`!`0``,'H!``$!``!8>@$``0$``,QZ`0`!`0``-'L!``$!
+M``"(>P$``0$``#Q\`0`!`0``;'P!``$!``"H?`$``0$``+1\`0`"`@``['P!
+M``'I``!0?0$``0$``'Q]`0`!`0``D'T!``$!``#(?0$``0$``$!^`0`!`0``
+MA'X!``$!``"T?@$``0$``,Q^`0`!`0``]'X!``%9`0``?P$``0$``!!_`0`!
+M`0``''\!``$!```P?P$``0$``$!_`0`!`0``3'\!``$!``!@?P$``0$``,Q_
+M`0`!`0``Z'\!``$E`0#T?P$``0$```"``0`!`0``.(`!``$!``!\@`$``0$`
+M`*B``0`!`0``T(`!``%9`0#D@`$``0$``""!`0`!`0``+($!``$!``!\@0$`
+M`0$``*2!`0`!`0``S($!``$!``#T@0$``0$``$2"`0`!`0``8((!``$!``#@
+M@@$``0$```"#`0`!`0``-(,!``$!``!P@P$``@(``'2#`0`"`@``H(,!``$!
+M``#$@P$``0$``.B#`0`!`0``[(,!``$!```0A`$``0$``-B$`0`!D0$`*(4!
+M``$!```XA0$``90!`$"%`0`!`0``6(4!``$!``"<A0$``0$``*2%`0`!`0``
+MV(4!``$!``#DA0$``0$``/"%`0`!`0``^(4!``$!```$A@$``0$```R&`0`!
+M`0``5(8!``$!``"XA@$``0$``-R&`0`!`0``Z(8!``$!```HAP$``0$``#"'
+M`0`!`0``?(<!``$!``"4AP$``0$``-"'`0`!`0``Y(<!``$!``#PAP$``@(`
+M`/2'`0`"`@``.(@!``$!``!HB`$``0$``'2(`0`!`0``>(@!``(!``!\B`$`
+M`@$``("(`0`"`0``A(@!``(!``",B`$``0$``-2(`0`!+P``6(D!``$!``"`
+MB0$``0$``)")`0`!`0``I(D!``%;``"XB0$``0$``-R)`0`!9P``_(D!``&1
+M`0`,B@$``0$``"2*`0`!6P``7(H!``$!``!TB@$``6<``(R*`0`!D0$`F(H!
+M``$!``"XB@$``6<``-"*`0`!D0$`Y(H!``$!```$BP$``90!`!2+`0`!`0``
+M-(L!``$!``!LBP$``9$!`("+`0`!D0$`E(L!``&1`0"DBP$``90!`,"+`0`!
+MD0$`[(L!``'8``#\BP$``90!`!B,`0`!`0``*(P!``$!``!$C`$``9$!`%",
+M`0`!V```C(P!``%J`0#(C`$``1@!`/R,`0`!`0```(T!``(!```$C0$``@$`
+M``B-`0`"`0``#(T!``(!```@C0$``0$``#2-`0`!`0``6(T!``$!``!<C0$`
+M`0$``'"-`0`!`0``C(T!``$!``"8C0$``0$``*2-`0`!`0``O(T!``$!``#0
+MC0$``2,!`-R-`0`!`0``$(X!``$!```HC@$``58``'2.`0`!D0$`K(X!``&1
+M`0"XC@$``90!`.2.`0`!D0$`I(\!``$!```4D`$``0$``!R0`0`!`0``,)`!
+M``$!``!`D`$``0$``%"0`0`!`0``C)`!``&1`0"TD`$``9$!`,R0`0`!`0``
+MY)`!``&1`0``D0$``0$``!B1`0`!D0$`1)$!``&1`0!0D0$``0$``'21`0`!
+M`0``T)$!``$!``#<D0$``0$``!R2`0`!`0``))(!``$!```HD@$``0$``#B2
+M`0`!`0``2)(!``$!``"0D@$``9$!`,B2`0`!D0$`W)(!``&1`0#HD@$``0$`
+M`/R2`0`!D0$`$),!``&1`0`DDP$``9$!`#"3`0`!E`$`0),!``&1`0!0E`$`
+M`0$``%R4`0`"+`$`8)0!``(Q``!DE`$``L(``'R4`0`!E`$`F)0!``&1`0"\
+ME`$``9$!`.24`0`!E`$`[)0!``$!``#XE`$``90!`#"5`0`!D0$`0)4!``&<
+M`0!(E0$``0$``%"5`0`!.0$`6)4!``$!``!DE0$``9P!`&R5`0`!`0``?)4!
+M``$!``"$E0$``0$``(R5`0`!`0``E)4!``$!``"DE0$``0$``+R5`0`!E`$`
+MU)4!``&1`0#PE0$``9$!`/R5`0`!E`$`!)8!``$!```0E@$``0$``""6`0`!
+ME`$`-)8!``&1`0`\E@$``3D!`$R6`0`!E`$`8)8!``&1`0!HE@$``0$``'"6
+M`0`!`0``>)8!``$Y`0"$E@$``9P!`(R6`0`!`0``G)8!``&4`0"PE@$``9$!
+M`,"6`0`!D0$``)@!``$!``"(F`$``0$``)B9`0`!`0``))H!``$!``"TF@$`
+M`0$``)B;`0`!`0``Z)L!``$!``#PFP$``0$``)2<`0`!`0``A)T!``$!``#8
+MG0$``0$``-R=`0`"`0``X)T!``(!``#DG0$``@$``.B=`0`"`0``])T!``$!
+M```,G@$``0$``"">`0`!`0``A)X!``$!``"(G@$``0$``)">`0`!`0``E)X!
+M``$!``"<G@$``0$``#R?`0`!A@$`4)\!``&1`0!DGP$``9$!`'2?`0`!D0$`
+MB)\!``&1`0"<GP$``9$!`+R?`0`!D0$`S)\!``&&`0#@GP$``9$!`/2?`0`!
+MD0$`6*`!``$!``"(H`$``0$``+2@`0`!A@$`#*$!``$C`0#XH0$``0$``"RB
+M`0`!`0``0*(!``$!``!<H@$``9$!`'BB`0`!D0$`@*(!``$P``#DH@$``80`
+M`/BB`0`!D0$`#*,!``&1`0!$HP$``0$``$BC`0`"`0``3*,!``(!``!0HP$`
+M`@$``%2C`0`"`0``6*,!``(!``!<HP$``@$``&"C`0`"`0``;*,!``$!``!X
+MHP$``90!`*BC`0`!D0$`N*,!``&4`0#DHP$``9$!`/2C`0`!E`$`(*0!``&1
+M`0`PI`$``90!`%RD`0`!D0$`<*0!``$!``!\I`$``0$``)BD`0`!`0``$*4!
+M``&4`0`\I0$``9$!`$RE`0`!E`$`=*4!``&1`0"$I0$``90!`*RE`0`!D0$`
+MO*4!``&4`0#DI0$``9$!`/2E`0`!E`$`&*8!``&1`0`HI@$``90!`%"F`0`!
+MD0$`6*8!``$!``!HI@$``90!`'"F`0`!`0``@*8!``&4`0"4I@$``9$!`*2F
+M`0`!`0``T*8!``$!``#XI@$``90!`!RG`0`!D0$`**<!``$!``!,IP$``0$`
+M`&BG`0`!`0``>*<!``&4`0"DIP$``9$!`+BG`0`!`0``Q*<!``$!``#@IP$`
+M`0$```2H`0`!`0``%*@!``&4`0!`J`$``9$!`%2H`0`!`0``8*@!``$!``!\
+MJ`$``0$``(2H`0`!`0``G*@!``%S``"DJ`$``74!`+"H`0`!W```M*@!``$!
+M``#(J`$``0$``-RH`0`!`0``X*@!``%U`0#LJ`$``=P```BI`0`!D0$`)*D!
+M``&1`0`LJ0$``3```#"I`0`!`0``-*D!``%U`0!`J0$``=P``%BI`0`!`0``
+M;*D!``("``!PJ0$``@(``'2I`0`"`@``>*D!``("``!\J0$``@(``("I`0`"
+M`@``A*D!``("``"(J0$``@(``(RI`0`"`@``R*D!``$!```,J@$``9$!`""J
+M`0`!D0$`-*H!``&1`0!(J@$``9$!`%BJ`0`!A@$`O*H!``$!``#,J@$``0$`
+M`-BJ`0`!H```%*L!``$!```@JP$``0$``#"K`0`!H```/*L!``$!``!(JP$`
+M`0$``&"K`0`!H```?*L!``$!``"$JP$``2$!`*2K`0`!H```P*L!``$!```4
+MK`$``0$``$RL`0`!`0``:*P!``&@``!TK`$``2$!`)RL`0`!`0``Q*P!``$!
+M```@K0$``0$``$2M`0`!H```5*T!``&@``!DK0$``:```'2M`0`!H```A*T!
+M``&@``",K0$``74!`)BM`0`!W```H*T!``$!``#$K0$``0$``-2M`0`!H```
+MY*T!``&@````K@$``:```!"N`0`!H```(*X!``$!```PK@$``:```$"N`0`!
+MH```4*X!``&@``!@K@$``:```'"N`0`!H```A*X!``$!``",K@$``74!`)BN
+M`0`!W```H*X!``$!``"TK@$``9$!`,BN`0`!D0$`U*X!``$!``#<K@$``74!
+M`.BN`0`!W```%*\!``&1`0`HKP$``9$!`#BO`0`!A@$`6*\!``&4`0!LKP$`
+M`90!`'RO`0`!`0``^*\!``$!```,L`$``0$``!2P`0`!`0``1+`!``$!``!X
+ML`$``0$``'RP`0`!`0``O+`!``$!``#$L`$``0$``!BQ`0`!`0``)+$!``$!
+M```XL0$``0$``#RQ`0`!`0``2+$!``&@``!8L0$``0$``&RQ`0`!`0``A+$!
+M``$!``"@L0$``90!`+2Q`0`!E`$`R+$!``&4`0#DL0$``0$``.RQ`0`!`0``
+M"+(!``$!``",L@$``0$``)BR`0`!`0``M+(!``$!``#4L@$``0$``.2R`0`!
+MA@$`]+(!``&4`0`(LP$``90!`!BS`0`!`0``)+,!``$!```PLP$``0$``$"S
+M`0`!D0$`5+,!``&1`0!PLP$``9$!`(2S`0`!D0$`"+0!``$!```DM`$``0$`
+M`#RT`0`!`0``1+0!``$!``!(M`$``0$``'BT`0`!`0``@+0!``$!``"(M`$`
+M`0$``+2T`0`!`0``N+0!``$!``!4M0$``9$!`&2U`0`!.0$`<+4!``$!``",
+MM0$``9$!`)RU`0`!.0$`J+4!``$!``#(M0$``9$!`-BU`0`!.0$`Z+4!``$!
+M``#LM0$``@(``/"U`0`"`@``]+4!``("```4M@$``8L``#"V`0`!`0``3+8!
+M``$O``!PM@$``90!`)BV`0`!D0$`H+8!``$!``"HM@$``0$``+2V`0`!+P``
+MP+8!``$!``#4M@$``2\```BW`0`!D0$`*+<!``&1`0!`MP$``@(``%BW`0`!
+M`0``7+<!``(!``!@MP$``@$``&2W`0`"`0``:+<!``(!``!LMP$``@$``'"W
+M`0`"`0``=+<!``(!``!XMP$``@$``."W`0`!`0``Y+<!``$!``#LMP$``0$`
+M`/"W`0`!`0``^+<!``$!````N`$``0$``""X`0`!`0``/+@!``$!``!4N`$`
+M`0$``'"X`0`!`0``B+@!``$!``"DN`$``0$``,2X`0`!`0``,+D!``$!``"L
+MN0$``0$``"BZ`0`!`0``;+H!``$!``!XN@$``0$``)2Z`0`!>0``K+H!``%Y
+M``#0N@$``9$!`."Z`0`!.0$`[+H!``$!```,NP$``9$!`!R[`0`!.0$`)+L!
+M``$!``!,NP$``9$!`%R[`0`!.0$`9+L!``$!``",NP$``9$!`)R[`0`!.0$`
+MI+L!``$!``#8NP$``0$``.B[`0`!`0``$+P!``%Y```PO`$``7D``%"\`0`!
+M>0``<+P!``%Y``"0O`$``7D``+"\`0`!>0``T+P!``&1`0#@O`$``3D!`.R\
+M`0`!`0``(+T!``$!``!(O0$``7D``&B]`0`!>0``=+T!``$!``"`O0$``0$`
+M`+"]`0`!>0``R+T!``%Y``#@O0$``7D```2^`0`!D0$`%+X!``$Y`0`@O@$`
+M`0$``#R^`0`"`@``0+X!``("``!$O@$``@(``$B^`0`"`@``3+X!``("``!0
+MO@$``@(``*B^`0`!`0``Q+X!``$E`0#0O@$``0$``-R^`0`!`0``%+\!``$!
+M``!@OP$``0$``&2_`0`!`0``;+\!``$!``!TOP$``0$``'B_`0`!`0``@+\!
+M``$!``"$OP$``0$``(R_`0`!`0``E+\!``$!``#(OP$``0$``/R_`0`!`0``
+M,,`!``$!``!(P`$``2,!`'#``0`!`0``O,`!``$!``#8P`$``0$``/#``0`!
+M`0``&,$!``$!``!8P0$``0$``(C!`0`!`0``I,$!``$!``#<P0$``0$``"#"
+M`0`!`0``:,(!``$!``!XP@$``0$``*3"`0`!`0``S,(!``$!```(PP$``0$`
+M`(3#`0`!`0``E,,!``$!``#(PP$``0$``!C$`0`!`0``2,0!``%9`0!LQ`$`
+M`0$``(C$`0`!`0``H,0!``$!``"XQ`$``0$``-3$`0`!`0``],0!``$!```(
+MQ0$``0$``"3%`0`!`0``3,4!``$!``"(Q0$``0$``)S%`0`!`0``L,4!``$!
+M``#HQ0$``0$``/S%`0`!`0``0,8!``$!``!4Q@$``0$``&3&`0`!`0``A,8!
+M``%9`0"LQ@$``0$``+#&`0`!A0``T,8!``&%```$QP$``0$``!C'`0`!`0``
+M+,<!``("``!0QP$``=```%S'`0`!`0``>,<!``'0``"$QP$``0$``!S(`0`"
+M`0``(,@!``(!```DR`$``@$``"C(`0`"`0``+,@!``(!```PR`$``@$``#3(
+M`0`"`0``.,@!``(!``!TR`$``9$!`(3(`0`!.0$`D,@!``$!``"LR`$``9$!
+M`+S(`0`!.0$`R,@!``$!``#HR`$``9$!`/C(`0`!.0$`",D!``$!```,R0$`
+M`@(``!#)`0`"`@``%,D!``("``!`R0$``0$``&#)`0`!`0``?,D!``$!``"@
+MR0$``0$``-#)`0`!+P``Y,D!``&4`0`,R@$``9$!`!#*`0`!`0``.,H!``$!
+M``!(R@$``0$``(#*`0`!+P``C,H!``$!``"LR@$``0$``+3*`0`!`0``U,H!
+M``$O``#@R@$``0$```#+`0`!`0``(,L!``$O```LRP$``0$``$S+`0`!`0``
+M:,L!``$O``!XRP$``2\``(#+`0`!`0``L,L!``&1`0#(RP$``9$!``3,`0`!
+M`0``",P!``(!```,S`$``@$``!#,`0`"`0``%,P!``(!```8S`$``@$``!S,
+M`0`"`0``(,P!``(!``"PS`$``0$``+3,`0`!`0``O,P!``$!``#$S`$``0$`
+M`,C,`0`!`0``T,P!``$!``#4S`$``0$``-S,`0`!`0``Y,P!``$!```(S0$`
+M`0$``"3-`0`!`0``0,T!``$!``!<S0$``0$``'C-`0`!`0``E,T!``$!``"L
+MS0$``0$``.#-`0`!`0``&,X!``$!``!$S@$``0$``'#.`0`!`0``H,X!``$!
+M``#0S@$``0$```3/`0`!`0``+,\!``%Y``!,SP$``7D``&S/`0`!>0``?,\!
+M``$!``"@SP$``7D``,#/`0`!>0``X,\!``%Y````T`$``7D``"#0`0`!>0``
+M0-`!``%Y``!0T`$``0$``'S0`0`!>0``G-`!``$!``#(T`$``7D``.C0`0`!
+M>0```-$!``$!```,T0$``0$``!31`0`!`0``'-$!``$!```\T0$``7D``%31
+M`0`!>0``;-$!``%Y``"$T0$``7D``)C1`0`!`0``O-$!``%Y``#8T0$``7D`
+M`/#1`0`!>0``"-(!``%Y```@T@$``7D``%32`0`!`0``9-(!``$!``"(T@$`
+M`7D``*S2`0`!>0``O-(!``$!``#(T@$``0$``/S2`0`!>0``%-,!``%Y```L
+MTP$``9$!`#S3`0`!.0$`1-,!``$!``!DTP$``9$!`'33`0`!.0$`?-,!``$!
+M``"<TP$``9$!`*S3`0`!.0$`M-,!``$!``#4TP$``9$!`.33`0`!.0$`\-,!
+M``$!```0U`$``9$!`"#4`0`!.0$`+-0!``$!``!(U`$``@(``$S4`0`"`@``
+M4-0!``("``!4U`$``@(``%C4`0`"`@``D-0!``$!``"<U`$``0$``*34`0`!
+M`0``K-0!``$!``"XU`$``0$``-34`0`!`0``V-0!``$!``#@U`$``0$``.C4
+M`0`!`0``[-0!``$!``#TU`$``0$``/C4`0`!`0```-4!``$!```(U0$``0$`
+M`"C5`0`!`0``1-4!``$!``#4U0$``0$``.#5`0`!`0``!-8!``$!```DU@$`
+M`0$``#S6`0`!`0``;-8!``$!``"<U@$``>D``+#6`0`!Z0``S-8!``$!``#D
+MU@$``0$``!37`0`!Z0``*-<!``'I``!$UP$``0$``&37`0`!Z0``E-<!``'I
+M``"HUP$``>D``,37`0`!`0``Y-<!``'I````V`$``0$``$38`0`!`0``D-@!
+M``$!``"@V`$``0$``+C8`0`!`0``#-D!``$!``!@V0$``0$``)#9`0`!`0``
+MH-D!``$!``"LV0$``0$``,S9`0`!`0``.-H!``$!``!(V@$``0$``%3:`0`!
+M`0``;-H!``$!``"LV@$``0$``,S:`0`!`0``G-L!``$E`0#8VP$``0$``.3;
+M`0`!`0``"-P!``$!```XW`$``0$``$3<`0`!`0``5-P!``$!``"\W`$``0$`
+M`-3<`0`!`0``+-T!``$!``!`W0$``0$``$C=`0`!`0``:-T!``$!``"$W0$`
+M`0$``,C=`0`!`0``Z-T!``$!```$W@$``0$``!3>`0`!`0``+-X!``$!```\
+MW@$``0$``$3>`0`!`0``3-X!``$!``!LW@$``0$``'#>`0`!`0``E-X!``$!
+M``#LW@$``0$```S?`0`!`0``*-\!``$!``!0WP$``0$``&3?`0`!`0``=-\!
+M``$!``"(WP$``0$``)C?`0`!`0``L-\!``$!``"XWP$``0$``-C?`0`!`0``
+MW-\!``$!```$X`$``0$``##@`0`!`0``-.`!``&%``!4X`$``84``)3@`0`!
+M`0``Y.`!``$!```LX0$``0$``%#A`0`!`0``8.$!``$!``",X0$``0$``*3A
+M`0`!`0``P.$!``$!``#4X0$``0$``/3A`0`!`0``".(!``$!```8X@$``0$`
+M`##B`0`!`0``:.(!``$!``",X@$``24!`*3B`0`!`0``O.(!``$!``#@X@$`
+M`0$``/3B`0`!)0$``.,!``$!```TXP$``0$``&#C`0`!`0``>.,!``$!``"<
+MXP$``0$``,CC`0`!T```U.,!``$!``#PXP$``=```/SC`0`!`0``I.0!``(!
+M``"HY`$``@$``*SD`0`"`0``L.0!``(!``"TY`$``@$``+CD`0`"`0``O.0!
+M``(!``#`Y`$``B$``/SD`0`!D0$`#.4!``$Y`0`8Y0$``0$``#3E`0`!D0$`
+M1.4!``$Y`0!0Y0$``0$``'#E`0`!D0$`@.4!``$Y`0"0Y0$``0$``)3E`0`"
+M`@``F.4!``("``"<Y0$``@(``,CE`0`!`0``Z.4!``$!```$Y@$``0$``"CF
+M`0`!`0``6.8!``$O``!LY@$``90!`)3F`0`!D0$`F.8!``$!``#`Y@$``0$`
+M`-#F`0`!`0``".<!``$O```4YP$``0$``#3G`0`!`0``/.<!``$!``!<YP$`
+M`2\``&CG`0`!`0``B.<!``$!``"HYP$``2\``+3G`0`!`0``U.<!``$!``#P
+MYP$``2\```#H`0`!+P``".@!``$!```XZ`$``9$!`%#H`0`!D0$`L.@!``$!
+M``"TZ`$``0$``+SH`0`!`0``P.@!``$!``#(Z`$``0$``,SH`0`!`0``Y.@!
+M``$!``#\Z`$``0$``"CI`0`!`0``5.D!``$!``"`Z0$``0$``+#I`0`!`0``
+MU.D!``%Y``#TZ0$``7D``"#J`0`!`0``..H!``&1`0!(Z@$``3D!`%#J`0`!
+M`0``<.H!``&1`0"`Z@$``3D!`(CJ`0`!`0``J.H!``&1`0"XZ@$``3D!`,#J
+M`0`!`0``X.H!``&1`0#PZ@$``3D!`/SJ`0`!`0``'.L!``&1`0`LZP$``3D!
+M`#CK`0`!`0``5.L!``("``!8ZP$``@(``%SK`0`"`@``8.L!``("``!DZP$`
+M`@(``(#K`0`!`0``A.L!``(!``"(ZP$``@$``(SK`0`"`0``D.L!``(!``"4
+MZP$``@$``)CK`0`"`0``G.L!``(!``#TZP$``0$```#L`0`!`0``).P!``$!
+M``!4[`$``0$``&#L`0`!`0``<.P!``$!``#,[`$``0$``/3L`0`!`0``1.T!
+M``$!``!\[0$``24!`,#M`0`!`0``).X!``$E`0"([@$``0$``+SN`0`!`0``
+MW.\!``$!```4\`$``0$``##P`0`!`0``?/`!``$!``"D\`$``0$``+3P`0`!
+M`0``T/`!``$!```$\0$``0$``"3Q`0`!`0``6/$!``$!``"P\0$``0$``.SQ
+M`0`!`0``,/(!``$!``!D\@$``0$``)CR`0`!`0``I/(!``$!``#X\@$``0$`
+M``3S`0`!`0``#/,!``$!```L\P$``0$``%CS`0`!`0``G/,!``$!``"T\P$`
+M`0$``,SS`0`!E`$``/0!``$!```0]`$``90!`#CT`0`!D0$`H/0!``&1`0"P
+M]`$``0$```#U`0`!D0$`+/4!``$!```P]0$``84``$SU`0`!`0``4/4!``&%
+M``!P]0$``84``+3U`0`!`0``[/4!``$!```P]@$``0$``$CV`0`!`0``=/8!
+M``$!``"4]@$``0$``*#V`0`!`0``K/8!``$!``"\]@$``0$``.#V`0`!`0``
+M\/8!``$!```4]P$``0$``"CW`0`!`0``//<!``$!``!4]P$``0$``)CW`0`!
+M`0``I/<!``$!``"\]P$``0$``.3W`0`!`0``^/<!``$E`0`0^`$``0$``"CX
+M`0`!`0``4/@!``$!``!D^`$``24!`'#X`0`!`0``F/@!``$!``#$^`$``0$`
+M`-SX`0`!`0```/D!``$!```L^0$``=```#CY`0`!`0``5/D!``'0``!@^0$`
+M`0$``'#Y`0`!T```?/D!``$!```4^@$``@$``!CZ`0`"`0``'/H!``(!```@
+M^@$``@$``"3Z`0`"`0``*/H!``(!```L^@$``@$``##Z`0`"(0``;/H!``&1
+M`0!\^@$``3D!`(CZ`0`!`0``I/H!``&1`0"T^@$``3D!`,#Z`0`!`0``X/H!
+M``&1`0#P^@$``3D!``#[`0`!`0``!/L!``("```(^P$``@(```S[`0`"`@``
+M./L!``$!``!8^P$``0$``'3[`0`!`0``F/L!``$!``#(^P$``2\``-S[`0`!
+ME`$`!/P!``&1`0`(_`$``0$``##\`0`!`0``0/P!``$!``!X_`$``2\``(3\
+M`0`!`0``I/P!``$!``"L_`$``0$``,C\`0`!`0``Z/P!``$!```$_0$``0$`
+M`"3]`0`!`0``0/T!``$O``!0_0$``2\``%C]`0`!`0``B/T!``&1`0"@_0$`
+M`9$!`!3^`0`!`0``&/X!``$!```@_@$``0$``"C^`0`!`0``+/X!``$!```T
+M_@$``0$``#S^`0`!`0``7/X!``$!``!T_@$``0$``(S^`0`!`0``I/X!``$!
+M``"\_@$``0$``-3^`0`!`0``Z/X!``$!```$_P$``0$``!S_`0`!`0``//\!
+M``$!``!@_P$``0$``)#_`0`!`0``P/\!``$!``#T_P$``0$``````@`!`0``
+M)``"``%Y``!$``(``7D``&0``@`!>0``<``"``$!``!X``(``0$``(@``@`!
+M`0``E``"``$O``"L``(``0$``-```@`!>0``[``"``%Y```@`0(``0$``#@!
+M`@`!D0$`2`$"``$Y`0!0`0(``0$``'`!`@`!D0$`@`$"``$Y`0"(`0(``0$`
+M`*@!`@`!D0$`N`$"``$Y`0#``0(``0$``.`!`@`!D0$`\`$"``$Y`0#\`0(`
+M`0$``!P"`@`!D0$`+`("``$Y`0`X`@(``0$``%0"`@`"`@``6`("``("``!<
+M`@(``@(``&`"`@`"`@``9`("``("``"``@(``0$``(0"`@`"`0``B`("``(!
+M``",`@(``@$``)`"`@`"`0``E`("``(!``"8`@(``@$``)P"`@`"`0``]`("
+M``$!`````P(``0$``"0#`@`!`0``5`,"``$!``!@`P(``0$``'`#`@`!`0``
+MS`,"``$!``#T`P(``0$``$0$`@`!`0``?`0"``$E`0#`!`(``0$``"0%`@`!
+M)0$`B`4"``$!``"\!0(``0$``-P&`@`!`0``%`<"``$!```P!P(``0$``'P'
+M`@`!`0``I`<"``$!``"T!P(``0$``-`'`@`!`0``!`@"``$!```D"`(``0$`
+M`%@(`@`!`0``L`@"``$!``#L"`(``0$``#`)`@`!`0``9`D"``$!``"8"0(`
+M`0$``*0)`@`!`0``^`D"``$!```$"@(``0$```P*`@`!`0``+`H"``$!``!8
+M"@(``0$``)P*`@`!`0``R`H"``&4`0#\"@(``0$```P+`@`!E`$`-`L"``&1
+M`0"<"P(``9$!`*P+`@`!`0``_`L"``&1`0`H#`(``0$``"P,`@`!A0``2`P"
+M``$!``!,#`(``84``&P,`@`!A0``L`P"``$!``#H#`(``0$``"P-`@`!`0``
+M;`T"``$!``",#0(``0$``)@-`@`!`0``I`T"``$!``"T#0(``0$``+@-`@`!
+M`0``W`T"``$!``#L#0(``0$``!0.`@`!`0``*`X"``$!```\#@(``0$``%0.
+M`@`!`0``D`X"``$!``"<#@(``0$``+0.`@`!`0``V`X"``$!``#L#@(``24!
+M``0/`@`!`0``'`\"``$!``!`#P(``0$``%0/`@`!)0$`:`\"``$!``"0#P(`
+M`0$``+P/`@`!`0``U`\"``$!``#X#P(``0$``"00`@`!T```,!`"``$!``!,
+M$`(``=```%@0`@`!`0``:!`"``'0``!T$`(``0$```P1`@`"`0``$!$"``(!
+M```4$0(``@$``!@1`@`"`0``'!$"``(!```@$0(``@$``"01`@`"`0``*!$"
+M``(A``#``````@\!`,0````"90``R`````+#``#,`````K4``-`````"?@$`
+MU`````+6``#8`````E0``-P````"X@``X`````*B``#D`````GL!`.@````"
+M3@$`[`````+```#P`````CX``/0````"A@``^`````)7``#\`````B`````!
+M```";`$`!`$```*7`0`(`0```BX```P!```"C@``$`$```)+`0`4`0```BD`
+M`!@!```"/```'`$```)I```@`0```H(!`"0!```"?0$`*`$```(<`0`L`0``
+M`K8``#`!```"8P$`-`$```)F`0`X`0```@P!`#P!```"WP``0`$```)``0!$
+M`0```I(``$@!```"=@$`3`$```+!``!0`0```K@``%0!```"AP``6`$```*P
+M``!<`0```E4``&`!```"R@``9`$```(\`0!H`0```A$!`&P!```"I@``<`$`
+M``(W`0!T`0```NP``'@!```"8`$`?`$```)0`0"``0```B\!`(0!```",@``
+MB`$```*W``",`0```EX!`)`!```"'@$`E`$```(H`0"8`0```CT``)P!```"
+M=@``H`$```)(`0"D`0```N<``*@!```"3P``K`$```(V``"P`0```HT``+0!
+M```""```N`$```+X``"\`0```D$!`,`!```".`$`Q`$```+Y``#(`0```H,!
+M`,P!```":@``T`$```(*``#4`0```F@!`-@!```"K@``W`$```(2`0#@`0``
+M`AL!`.0!```"<@$`Z`$```(V`0#L`0```J@``/`!```"10``]`$```(Q`0#X
+M`0```A,``/P!```"O@````(```)Q```$`@```OL```@"```"_0``#`(```)5
+M`0`0`@```F<!`!0"```"@0$`&`(```(/```<`@```E(!`"`"```")@$`)`(`
+M``(.`0`H`@```J,``"P"```"4P$`,`(```(!```T`@```I4!`#@"```"+@$`
+M0`(```)>`0!$`@```AX!`$@"```"*`$`3`(```(]``!0`@```G8``%0"```"
+M`0``T!8```))`0#4%@```FD!`-@6```"6P$`W!8```*``0#@%@```F0``.06
+M```"=P``Z!8```*5``#L%@```FX``/`6```"#0``]!8```(U``#X%@```F(`
+M`/P6```"8P```!<```(Y```$%P```F\!``@7```"$`$`#!<```*+`0`0%P``
+M`H,``!07```">0$`&!<```(%`0`<%P```JP``"`7```"*P$`)!<```(B```H
+M%P```@H!`"P7```"&0``,!<```)K`0`T%P```NH``#@7```"'P``/!<```(J
+M``!`%P```J\``$07```"?P$`2!<```)M`0!,%P```GH!`%`7```"/0$`5!<`
+M``+U``!8%P```@(!`%P7```"\0``8!<```(5`0!D%P```G\``&@7```"F@``
+M;!<```)U``!P%P```DT!`'07```"H0``>!<```)```!\%P```CX!`(`7```"
+M.@$`A!<```)[``"(%P```CH``(P7```"40$`D!<```+@``"4%P```C(!`)@7
+M```"Y@``G!<```+&``"@%P```N4``*07```"10$`J!<```+1``"L%P```C<`
+M`+`7```"80``M!<```+;``"X%P```DH!`+P7```"6`$`P!<```(J`0#$%P``
+M`AP``,@7```"7```S!<```(T`0#0%P```I8!`-07```"2```V!<```*<``#<
+M%P```F0!`.`7```"UP``Y!<```('`0#H%P```AX``.P7```"_@``\!<```(X
+M``#T%P```@,!`/@7```"[@``_!<```*/````&````B<```08```"4```"!@`
+M``*4```,&````MX``!`8```"S@``%!@```):`0`8&````LT``!P8```"50$`
+M(!@```*2`0`D&````@<``"@8```"I```+!@```)R```P&````FP``#08```"
+M\@``.!@```+V```\&````@D!`$`8```"`0``1!@```(P`0!(&````DP!`%`8
+M```"Q@``5!@```+E``!8&````D4!`%P8```"T0``8!@```(W``!D&````@$`
+M`!PV```"6P``(#8```*"```D-@```G<!`"@V```";0``+#8```)$```P-@``
+M`MH``#0V```"N@``.#8```(?`0`\-@```JT``$`V```"4P``1#8```*?``!(
+M-@```E8``$PV```"!@$`4#8```)B`0!4-@```HP``%@V```"`0$`7#8```+H
+M``!@-@```IP!`&0V```"D`$`:#8```*\``!L-@```GX``'`V```")P$`=#8`
+M``(H``!X-@```F$!`'PV```"5@$`@#8```*(``"$-@```F4!`(@V```"7P``
+MC#8```)#`0"0-@```@0!`)0V```"_P``F#8```(2``"<-@```G`!`*`V```"
+M?```I#8```+C``"H-@```G4!`*PV```"W```L#8```*8``"T-@```C4!`+@V
+M```"_```O#8```(0``#`-@```IX``,0V```""0``R#8```*9``#,-@```D(!
+M`-`V```"L@``U#8```+K``#8-@```C\``-PV```"(@$`X#8```*E``#D-@``
+M`K,``.@V```"&@$`[#8```)-``#P-@```D8!`/0V```"5`$`^#8```(7`0#\
+M-@```I@!```W```"20``!#<```+)```(-P```JH```PW```"A@$`$#<```),
+M```4-P```I```!@W```"B@$`'#<```*I```@-P```L\``"0W```"0@``*#<`
+M``)+```L-P```BT``#`W```"00``-#<```([```X-P```NT``#PW```"1@``
+M0#<```*!``!$-P```C0``$@W```",P``3#<```(8``!0-P```G0``%0W```"
+M^@``6#<```)O``!<-P```BD!`&`W```"A0$`9#<```+3``!H-P```E4!`&PW
+M```"DP``<#<```*3`0!T-P```A,!`'@W```"U```?#<```(C``"`-P```G@!
+M`(0W```"<```B#<```+8``",-P```L@``)`W```"[P``E#<```*.`0"<-P``
+M`AH!`*`W```"30``I#<```)&`0"H-P```E0!`*PW```"%P$`L#<```*9`0"X
+M-P```@$```P````"`P``$`````(#```4`````@,``!@````"`P``'`````(#
+:```@`````@,``"0````"`P``*`````(#````
+`
+end
diff --git a/sys/contrib/dev/ath/public/armv4-le-elf.inc b/sys/contrib/dev/ath/public/armv4-le-elf.inc
new file mode 100644
index 0000000..f12ffbe
--- /dev/null
+++ b/sys/contrib/dev/ath/public/armv4-le-elf.inc
@@ -0,0 +1,74 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/armv4-le-elf.inc#4 $
+#
+
+#
+# Compilation configuration for building little-endian ARMv4.
+#
+
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=arm-elf
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/arm-elf-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EL
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+COPTS+= -march=armv4 -mlittle-endian \
+ -fno-strict-aliasing -fno-common
diff --git a/sys/contrib/dev/ath/public/armv4-le-elf.opt_ah.h b/sys/contrib/dev/ath/public/armv4-le-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/armv4-le-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/i386-elf.hal.o.uu b/sys/contrib/dev/ath/public/i386-elf.hal.o.uu
new file mode 100644
index 0000000..45a31f1
--- /dev/null
+++ b/sys/contrib/dev/ath/public/i386-elf.hal.o.uu
@@ -0,0 +1,4300 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/i386-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$!`0D```````````$``P`!``````````````!<E0(``````#0`````
+M`"@`#0`*``^W1"0$NC$```"#^%@/A`4!``"#^%A_:(/X&W\S@_@:#XWB````
+M@_@2?Q>#^!$/C;\```"#^`</A*\```#IS@```(/X$P^$O0```.G`````@_A2
+M#X2A````@_A2?Q.Z1````(/X'`^$K````.F?````@_A7#X2`````Z9$```"0
+M/0<1``!T93T'$0``?RJZ5@```#V1````='X]D0```'\,+88```"#^`%W9>M4
+M/100``!T5.M:B?8]$Q$``'1)/1,1``!_"3T2$0``=";K0;II````/1/P``!T
+M/;I]````/1OQ``!T,>LGC78`NI$```#K);J>````ZQZZJP```.L7NKX```#K
+M$+K1````ZPF0N@````"-=@")T,.0BU0D!(M$)`AF@?J,%G039H'Z)Z=T#+D`
+M````9H'ZMQ!U#@^WP%#HN?[__X/$!(G!B<C#D%=64XM\)!2+="08BUPD'(M,
+M)""+5"00#[?"/0<"```/A+L````]!P(``'\P@_@2?Q>#^!$/C8X```"#^`</
+MA)T```#IL````(/X$W1D@^@:@_@"#X>?````ZU&0/1,1``!T3CT3$0``?R(]
+M!Q$``'1O/0<1``!_"3T4$```="WK=ST2$0``=$#K;HGV/1OQ``!T-3T;\0``
+M?PD]$_```'00ZU4]&?\``'5.B?:Z$P```(/L#%%35E</M\)0Z/S___^)PH/$
+M(.L\@^P,45-65P^WPE#H_/___XG"@\0@ZR60@^P,45-65P^WPE#H_/___XG"
+M@\0@ZPV0N@````#'`0$```"0A=)T2V:+@L@!``!FB4((9HN"R@$``&:)0@J+
+M@LP!``")0AQFBX+0`0``9HE"(&:+@M(!``!FB4(B9HN"U`$``&:)0B1FBX+6
+M`0``9HE")HG06UY?PXUV`(M4)`B+1"0$B9#8`0``N`$```##55=64X/L#(ML
+M)"2+?"0HBW0D++L`````BU0D((M"%(L$*"'X.?!U"+@!````ZQR0@^P,:@KH
+M_/___X/$$$.!^^<#``!^TK@`````@\0,6UY?7<.05E.+3"0,BW0D$+L`````
+MN``````Y\',1C10`B<B#X`$)T-'I0SGS<N];7L-75E.+="00BTPD%(M\)!B+
+M5"0<#[?"C01`#[=<@2:X`````(7;#X25`0``#[?"C01`#[9$@26#^`)T:8/X
+M`G\,A<!T'^EO`0``C78`@_@##X3\````@_@$#X0<`0``Z54!``"^P````(-\
+M)"``=!$/M\*-!$"`?($I`'0$9KY@`(T$_0````"-!("-!("-!(#!X`.Z````
+M`/?SC40P"ND:`0``D(.^-!````!T>XN&-!```&:#>`(`>2N)VL'B!+C336(0
+M]^+!Z@:-3/H5B<B)T[H`````]_/!X`0%D````.G8````@[XT$````'0ZBX8T
+M$```]D`#0'0NC13=`````+C336(0]^+!Z@:-3/H5B<B)T[H`````]_.-!,5(
+M````Z9<```")]HT4G0````"XTTUB$/?BP>H&C4SZ%8G(B=.Z`````/?SC02%
+M)````.MLC13=`````+C336(0]^+!Z@:-3/H5B<B)T[H`````]_.-!(46````
+MZT.-%)T`````N---8A#WXL'J!HU,^A6)R(G6N@````#W]HT$A0````"!^^<#
+M``!W!P6]````ZPV#P%SK"(UV`+@`````#[?`6UY?PXM,)`BZ`@```/9!`B!U
+M2`^W00(ET````+H#````/<````!T,P^W00(ET````+H$````/=````!T'KH!
+M````]D$"$'43#[=!`B4`"```@_@!&=+WTH/B!8G0PXGV55=64X/L#(M4)""+
+M7"0D@'PD*`!Y4K@.````@?NT"0``#X39`0``@?NS"0``=QV-BYGV__^X9V9F
+M9O?IB=#1^,'Y'RG(Z;8!``")]HV3,/;__[C-S,S,]^*)T,'H!(/`#^F:`0``
+MB?;W1"0H``$```^$H@```(/L#%+H_/___X/$$(7`=%*-@[/L__^#^#!W1XT$
+MFXT,`+H%````B=B)UKH`````]_:#^@)U$HV1#3___[C-S,S,]^+!Z@+K$(V1
+M"#___[C-S,S,]^+!Z@*)T.DK`0``C78`]T0D*$`!``!T'X'[B!,``'<7C9-@
+M\/__N,W,S,SWXHG0P>@"Z?\```"-DWCL__^XS<S,S/?BB=#!Z`+IZ````+@.
+M````@?NT"0``#X37````@?NS"0``=QN-BYGV__^X9V9F9O?IB=#1^,'Y'RG(
+MZ;0```"!^X<3```/AY0```"#[`Q2Z/S___^#Q!"%P'10C8.S[/__@_@P=T6-
+M!)N-#`"^S<S,S(G8]^:)T,'H`HT$@"G#@_L"=1&!Z?/```")R/?FB='!Z0+K
+M$H'I^,```+C-S,S,]^&)T<'I`HG(ZTB!^R03``!V%(V38/#__[C-S,S,]^*)
+MT,'H`NLLC9,P]O__N,W,S,SWXHG0P>@$@\`/ZQ60C9-X[/__N,W,S,SWXHG0
+MP>@"B?:#Q`Q;7E]=PU.+5"0(BUPD#(N"-!```(7`=!E04NC\____@\0(#[:`
+M``````^OP^L'C78`:\,6D%O#B?93BU0D"(N"-!```(7`="504NC\____@\0(
+M#[:0`````(M$)`R)T[H`````]_.)P>L3C78`N*.++KKW9"0,B='!Z02)]HG(
+M6\-55U93@^P$BWPD'(!_!`!U<;L`````B?;&1!\$_T.#^Q]^];L`````@S\`
+M?E6-=@"-!%N-=(<@BD8(BDX+#[;0B%P7!`I&"0^VP(A<!P0/MNEJ`%5J#E?_
+M="0HZ/S___^#Q!1FB48,:@%5:@Y7_W0D*.C\____@\049HE&#D,Y'W^N@\0$
+M6UY?7<.)]E93BTPD#(M4)!"+7"04BW0D&(V!X`$``(/Z(@^'+`(``/\DE0@`
+M```/MX$(`@``B0:X`````.D9`@``N`T```#I#P(``+@-````Z04"``#V0`,!
+M#Y3`#[;`Z?8!``"X#0```.GL`0``N`T```#IX@$```^W0`J)!K@`````Z=(!
+M```/MT`(B0:X`````.G"`0``BD`"T.B#X`&#^`$9P(/@#>FM`0``#[9``H/@
+M`8/X`1G`]]"#X`WIEP$``(H`P.@"@^`!@_@!&<"#X`WI@@$``(H`P.@#@^`!
+M@_@!&<"#X`WI;0$``(H`P.@$@^`!@_@!&<"#X`WI6`$``(N!^`$``(D&N```
+M``#I1@$``(/[`70:N`````"#^P$/@C,!``"#^P)T&H/[`W0HZS@/OX'\`0``
+MB0:X`````.D4`0``#[>!_@$``(D&N`````#I`0$``(N!``(``(D&N`````#I
+M[P```+@-````Z>4```"0BD`"P.@"@^`!@_@!&<"#X`WIS@```(I``L#H`X/@
+M`8/X`1G`@^`-Z;@```"X#0```.FN````#[9``8/@`8/X`1G`@^`-Z9H```"*
+M0`+`Z`6#X`&#^`$9P(/@#>F$````BD`"P.@&@^`!@_@!&<"#X`WK<8/[`70?
+M@_L!<@>#^P)T(^LQBD`"P.@'#[;`@_@!&<"#X`WK38.Y3!````$9P(/@#>L_
+M#[>!2!```(D&N`````#K+[@-````ZRBX#0```.LA@[EH$````1G`@^`-ZQ.+
+M0!2)!K@`````ZP>X#````(GV6U[#D%93BW0D#(M$)!"+5"04BTPD&(M<)!R#
+M^!ET+8/X&7<(@_@/=`OK89"#^!YT2^M9D(/Z`W53@_D$=TZ)C@`"``"X`0``
+M`.M0D(/Z`70'@_H"=!?K-(7)#Y7`#[;`B89,$```N`$```#K+F:)CD@0``"X
+M`0```.L@D(F.:!```+@!````ZQ*-=@"%VW0&QP,,````N`````!;7L.)]E57
+M5E.+;"04BUPD((M,)!R_`````(/[!W8^B?:+1"08#[<4N`^W=+@"B=#!X!`)
+M\(D!@\$$@^L$BT44BP00B0&#P02#P@2#ZP0Y\G<%@_L#=^9'@_L'=\2)R"M$
+M)!Q;7E]=PY!75E.+="00BTPD%(M\)!B+1"0<BU0D((M<)"2#^0UT-(/Y#7\+
+MA<ET$^F"````B?:#^1UT-X/Y'G1'ZW2-AL@!``")`L<#$````+H!````ZV2-
+M=@#_,_\R5U;H/?___XD#N@$```"#Q!#K2I"-AE`0``")`L<#&````+H!````
+MZS2%P'42QP,$````BQ*+A@0"``")`NL2N@````"#^`1U%(L'B88$`@``N@$`
+M``#K!;H`````B=!;7E_#D%.+7"0,BTPD$+@`````@WL$``^$+0$``(L!B0.+
+M002)0PB+00B)0PR+00R)0Q"#>1#_=!2+01`]_P```'8%N/\```")0Q3K",=#
+M%`(```"0@WD4_W0PBU$4@?H`!```=@6Z``0``,=#&`$````Y4QAS&K@!````
+MD-'@@\@!.=!R]XE#&.L&BT$4B4,8@WD8_W0PBU$8@?H`!```=@6Z``0``,=#
+M'`$````Y4QQS'K@!````D-'@@\@!.=!R]XE#'.L*QT,<_P,``(UV`&:#>1P`
+M=!5FBT$<9H/X#W8%N`\```!FB4,@ZP9FQT,@"@!F@WD>`'079HM!'F:#^`]V
+M!;@/````9HE#(NL(B?9FQT,B"@"+02")0R2+022)0RB+02B)0RR+02R)0S"#
+M>00$=1"#>P0!=0K'0S@!````C78`N`$```!;PY"+3"0(BU0D#+@`````@WH$
+M`'1;BT(,B4$(BP*)`8M""(E!!(M"#(E!"(M"$(E!#(M"%(E!$(M"&(E!%(M"
+M'(E!&&:+0B!FB4$<9HM"(F:)01Z+0B2)02"+0BB)022+0BR)02B+0C")02RX
+M`0```,.05U93BWPD$(M<)!2#[`A35^C\____B<:#Q!"X`````(7V=#)F@WX6
+M`'4B4U?H_/___XG#5E?_E\`!``!F`X0;E````)B#Q!#K#(UV`&:+1A9F`T88
+MF%M>7\.-=@!55U93@^P<BVPD,&;'1"06``!FQT0D&@``9L=$)!0``&;'1"08
+M``"_`````#N],!````^#N0```(T$_0`````I^(VTQ3`"``!F@WX6``^)D0``
+M`%95Z/S___^)1"089HN$`)0```!FB40D%HG#9@->%E95_Y7``0``C00#@\00
+M]D8#`70M9CM$)!1]6&:)1"04@^P(5E7_E<`!``!F`T869HM4)!YF*<)FB50D
+M*(/$$.LR9CM$)!9]*V:)1"06@^P(5E7_E<`!``!F`T86BTPD(&:+E`F4````
+M9BG"9HE4)"J#Q!!'.[TP$```#X)'____OP````")]HT$_0`````I^(VTQ3`"
+M``!F@WX6`'DE@^P(5E7_E<`!``"8@\00]D8#`70&`T0D&.L%9@-$)!IFB488
+MD$>#_S]^OH/$'%M>7UW#D)!55U93@^P4BUPD-(M,)"R+5"0PQT0D#*````"+
+M1"0H9H$X`3!V",=$)`RV````O@`````/M^H/M_F-=@"+5"0,#[<$<HG!#Z_-
+MNF0````IPHG0#Z_'`<&X'X7K4??IB00DB50D!(M$)`3!^`7!^1\IR&:)`X/#
+M`D:#_@I^OX/$%%M>7UW#C78`BU0D"`^WPF:!^O\`=$2+1"0$9H$X`C!W*V:#
+M^CYV$0^WPHT$@`4B%0``#[?`PXGV#[?"C02`C80`[!,```^WP,.-=@`/M\*-
+M!(`%P!(```^WP,.0BU0D"`^WPF:!^O\`=!^+1"0$9H$X`C!W"XV"8`D```^W
+MP,.0C8+\"```#[?`PXGV55=64X/L#(ML)""+="0D9H$^_S]V&F:#?BX`=!.Z
+M`0```&:#?A8`#X13`@``C78`9H$^`C!V9[]0`0``NP````!F@[YV`0````^$
+M+`(``)"#[`2-1"0.4`^WQU!'5?^5H`$``(/$$(7`#X2]`0``9@^V1"0+9HF$
+M7F(!``!F#[9$)`IFB81>9`$``(/#`@^WAG8!```YV'^WZ:4!``"#[`2-1"0.
+M4&@``0``OP$!``!5_Y6@`0``@\00N@````"%P`^$N0$``&:+1"0*B<)FP>H)
+M9HF68@$``&;!Z`*#X']FB89D`0``#[=$)`K!X`6#X']FB89F`0``@^P$C40D
+M#E`/M\=01U7_E:`!``"#Q!"Z`````(7`#X1C`0``9HM$)`J)PF;!Z@MF"99F
+M`0``9L'H!(/@?V:)AF@!```/MT0D"L'@`X/@?V:)AFH!``"#[`2-1"0.4`^W
+MQU!'5?^5H`$``(/$$+H`````A<`/A`T!``!FBT0D"HG"9L'J#68)EFH!``!F
+MP>@&@^!_9HF&;`$```^W1"0*T>"#X']FB89N`0``@^P$C40D#E`/M\=01U7_
+ME:`!``"#Q!"Z`````(7`#X2X````9HM4)`J)T&;!Z`]F"89N`0``B=!FP>@(
+M@^!_9HF&<`$``&;1ZH/B?V:)EG(!```/MT0D"L'@!H/@?V:)AG0!``"#[`2-
+M1"0.4`^WQU!5_Y6@`0``@\00N@````"%P'18ZPF)]KH`````ZTUFBT0D"F;!
+MZ`IF"89T`0``NP````!F@[YV`0```'0I#[>^=@$``(UV``^WA%YB`0``4%;H
+M$?W__X/$"&:)A%YB`0``0SG??^&Z`0```(G0@\0,6UY?7<.)]E575E.#[!B+
+M1"0PBWPD-&:+4!1FB50D$HE$)!0/M\*-%("-%)"-1``#P>@"`<+!X@)2Z/S_
+M__^)P8/$$+@`````A<D/A*4```")#P^W5"0&C402`R7\_P<``<B)1PAFBVPD
+M!F:);P2^`````(/Z`'YXC78`BQ^+3PB-!+:-!(:+;"0(9HM4=0!FB12!9HD4
+M<[D`````C02VC02&C1R%`````(GVC02)C02#B<(#5PAFB4H$`T<(9L=`!@``
+M08/Y`W[BBU<(C02VC02&P>`"9L=$$`8$`(M7"&;'1!!"`P!&#[=$)`8Y\'^+
+MN`$```"#Q`Q;7E]=PXGV55=64X/L!(ML)""+5"0<9HM"%F:)109FQP0DK=YF
+MQT0D`JW>N@````"Y``````^WV(GFD(G8T_BH`70*@_H!?REFB0Q60D&#^0-^
+MZ(M4)!QFBT(49HE%!+@`````9H-]!``/A-4!``#K"K@`````Z<D!``"_````
+M`&:#?00`#X2T`0``C11_C127BT0D'(T44(U:&(MU"(T$OXT$A\'@`F:+4AAF
+MB10PBW4(9HM3$F:)5#`"N0````"-!+^-!(>-%(4`````B?:-!(F-!((#10AF
+MQT`&``!!@_D#?NMF@7PD`JW>=68/MPPDC12_C127C02)P>`"C120`U4(@\($
+M9L="`@0`9HM#`F:)0@1F`T,&9HE"!F8#0PIFB4((9@-##F:)0@IFBT,$9HE"
+M#&:+0PAFB4(.9HM##&:)0A!FBT,09HE"$NGA````B?:-!+^-!(>--(4`````
+M#[<$)(T$@(T$A@-%"&:+4P)FB5`(#[=$)`*-!("-!(8#10AFQT`(%``/MT0D
+M`HT$@(T$A@-%"&;'0`HC``^W1"0"C02`C02&`T4(9L=`##\`#[<,)(T$B8T4
+MA@-5"(/"!&;'0@($`&:+0@1F`T,&9HE"!F8#0PIFB4((9@-##F:)0@IFBT,$
+M9HE"#&:+0PAFB4(.9HM##&:)0A!FBT,09HE"$@^W3"0"C02)C12&`U4(@\($
+M9L="`@,`9HM#%&:)0@QFBT,69HE"#F:+0QAFB4(01P^W100Y^`^/3/[__[@!
+M````@\0$6UY?7<.-=@!55U93@>Q<`0``OU`!``#'1"0(`````,=$)`0`````
+M@WPD"`$/A-X```"#?"0(`7\/@WPD"`!T&.EC`0``C78`@WPD"`(/A`D!``#I
+M4`$``(N$)'0!``!F@W@6``^$/@0``(-\)`0)#X\_`0``@^P$C40D$E!71_^T
+M)'P!``"+E"2``0``_Y*@`0``@\00A<`/A!X$``"`?"0.``^$"P$``(M<)`0/
+MMD0D#O]$)`10_[0D>`$``.CU^/__@\0(9HF$7#`!``!F#[9$)`]FA<`/A-<`
+M``"+7"0$#[;`_T0D!%#_M"1X`0``Z,/X__^#Q`AFB81<,`$``(-\)`0)#XYJ
+M____Z:0```"+C"1T`0``9H-Y&@`/A(8#``"[`````)"+A"1T`0``9H&\6%0!
+M``#_`'099HN$6%0!``"+3"0$9HF$3#`!``!!B4PD!$.#^P)^SNM8BX0D=`$`
+M`&:#>!P`#X0Z`P``NP````"0BY0D=`$``&:!O%I.`0``_P!T&6:+A%I.`0``
+MBTPD!&:)A$PP`0``08E,)`1#@_L"?L[K#+@`````Z0H#``")]H/L"&@<`0``
+MC40D'%#H_/___XM$)!1FB40D-+L`````@\00.UPD!`^-7`(``(UL)`Z-=@!F
+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
+M=2AFQT(@!0#K()`/M].-%%*-!+:-!("-!$;1X(T4T(M$)"!FQT0"(```0V:#
+M^P-VHF;_1"0*9HML)`J+5"0D9CEJ%`^'.O___X/$#%M>7UW#B?955U93@^PD
+M9L=$)!BMWHU$)!AFQT`"K=YFQT`$K=YFQT`&K=['1"00`````&;'1"04``"+
+M1"1`#[=0%KL#````C70D&`^W1"04B=DIP8G0T_BH`704B=AF*T0D%(M,)!!F
+MB01.08E,)!!F_T0D%&:#?"04`W;.BU0D/&:+0A2+3"1`9HE!%&;'1"06``!F
+M@WD4``^&_P````^W5"06C022C02`C01"T>"+3"0\C10(C6H89HM2&(M,)$!F
+MB50(&&;'1"04``"#?"00``^$K@````^W5"06C022C02`C01"T>")1"0,C78`
+M#[=4)!0/MT14&(T$0(M,)`R-!,&+3"1`C70('@^_1%4,P>`"9HE&#F:+1%4$
+M9HE&!+\!````9H-^`@%V1@^W1"04B40D"&:+5@)FB50D!I`/M\^+1"0(C1R(
+M#[]$731FBU1.#(T$0F:)1$X.9HM$3@)F`T1=#&:)1$X$1V8Y?"0&=\UF_T0D
+M%`^W1"04.T0D$`^":?___V;_1"069HM,)!:+5"1`9CE*%`^'`?___[@!````
+M@\0D6UY?7<-55U93@^P<BWPD-&;'1"00!`"-1"009L=``@8`9L=`!`D`9L=`
+M!@P`QT0D#`````"#[`QH%`0``.C\____B<.#Q!"%P`^$=@$```^WK]````!F
+M@W\6`'1X@^P(:!0$``!0Z/S___]FBT=H9HE#%H/$"&H`:@I54U?_="1,Z*/V
+M__^#Q""%P`^$)`$``(VW9`T``&:+1VAFB4864U;H9_S__XDT)%/_="0\Z*[]
+M__^#Q!"%P`^$]P````^W0QH/MU1$#@^W0Q0/K\*-;`4%C78`9H-_&@!T<8/L
+M"&@4!```4^C\____9HM':F:)0Q:#Q`AJ`6H$55-7_W0D3.@D]O__@\0@A<`/
+MA*4```"-MW@1``!FBT=J9HE&%E-6Z.C[__^)-"13_W0D/.@O_?__@\00A<!T
+M?`^W0QH/MU1$#@^W0Q0/K\*-;`4"9H-_'`!T68/L"&@4!```4^C\____9HM'
+M;&:)0Q:#Q`AJ`FH$55-7_W0D3.BL]?__@\0@A<!T,8VWC!4``&:+1VQFB486
+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
+M:.P```!5_Y6@`0``@\00QT0D!`````"%P`^$:`,``&:+1"0*B<*#X@=FB9;\
+M````9L'H`X/@!V:)A@`!``"#[`2-1"0.4&CM````5?^5H`$``(/$$,=$)`0`
+M````A<`/A"(#``!FBT0D"HG"@^('9HF6_@```&;!Z`.#X`=FB88"`0``C78`
+M9L>&8`$```0`9L>&7@$```$`9L>&7`$```$`9L>&6@$`````BP0DBU@4OP``
+M``!F@[X$`0```'1)C78`@^P$C40D#E!30U7_E:`!``"#Q!"%P`^$=`(``&8/
+MMD0D"V:)A'X&`0``9@^V1"0*9HF$?@@!``"#QP(/MX8$`0``.?A_NF:!/@)0
+M=F&_`````(GV@^P$C40D#E!35?^5H`$``(/$$(7`#X0K`@``9HM$)`IFB82^
+MC@,``(/L!(U$)`Y0C4,%4%7_E:`!``"#Q!"%P`^$"@(``&:+1"0*9HF$OI`#
+M``!#1X/_!'ZF9H$^`C!W)F;'1ES*_V;'1E[__V;'1F#__W<29L=&1`\`9L=&
+M1AP`9L=&2!P`9H$^_S]V*8/L!(U$)`Y0:,H```!5_Y6@`0``@\00QT0D!```
+M``"%P`^$NP$``.LG@^P$C40D#E!HSP```%7_E:`!``"#Q!#'1"0$`````(7`
+M#X22`0``9HM$)`IFB4889H-^%@`/A70!``!F@3[_/P^&70$```^WP,'H"X/@
+M`6:)1A;I5P$``,=$)`0`````Z50!``#'1"0$`````.E'`0``QT0D!`````#I
+M.@$``,=$)`0`````Z2T!``#'1"0$`````.D@`0``QT0D!`````#I$P$``,=$
+M)`0`````Z08!``#'1"0$`````.GY````QT0D!`````#I[````,=$)`0`````
+MZ=\```#'1"0$`````.G2````QT0D!`````#IQ0```,=$)`0`````Z;@```#'
+M1"0$`````.FK````QT0D!`````#IG@```,=$)`0`````Z9$```#'1"0$````
+M`.F$````QT0D!`````#K>L=$)`0`````ZW#'1"0$`````.MFQT0D!`````#K
+M7,=$)`0`````ZU+'1"0$`````.M(QT0D!`````#K/L=$)`0`````ZS3'1"0$
+M`````.LJQT0D!`````#K(,=$)`0`````ZQ9FBT889L'H#V:)1A;'1"0$`0``
+M`(GVBT0D!(/$#%M>7UW#5E.#[`R+="08BUPD'%-6Z$CQ__^#Q!"Z`````(7`
+M=%2#[`A35NANT?__@\00N@````"%P'0^@^P(4U;H5.?__X/$$+H`````A<!T
+M*(/L"%-6Z*+J__^#Q!"Z`````(7`=!*#[`A35NCH[/__B<*#Q!"-=@")T(/$
+M!%M>PX/L#(M$)!1F@3C_/W8:9H-X+@%U$X/L"%#_="0<Z(;;__^#Q!"-=@"#
+MQ`S#BU0D!(M,)`AFBP)F.P%U&`^W4@*!XO#!```/MT$")?#!```IPNL)D`^W
+M$@^W`2G"B=##D(M$)`0/MX`(`@``)?^_``##C78`BTPD!+H`````BT31!`L$
+MT70&N`````##0H/Z`7[KN`$```##_W0D!.B_____@\0$B<&Z`````&:%P'DL
+M@>'_?P``B?:-!))F.0R%X`@``'0+0H'Z@@```';JZR6X`0```,.X`0```,.-
+M!-4`````*=!F.0R%0````'3G0H/Z2G;GN`````##D%.+7"0,N`$```!FA=MT
+M<?]T)`CH3/___X/$!(G!9H7`>14/M\.)RH'B_W\``#G0#Y3`#[;`ZTEF/?\!
+M=`JZ`````&:%P'41N`$```#K,K@!````ZRN-=@"-!)+!X`)F.9C@"```=0EF
+M.8CB"```=-Y"@?J"````=M^X`````(GV6\.)]E93@^P0BT0D'(MT)"!0_Y"<
+M`0``B<.#Q!"H0G0+@WX(`'4%@^.]B?;VPR!T"X-^#`!U!8/CWXGV]L,(=`N#
+M?@0`=06#X_>)]O;#`707BT0D&(/`&%#HFO[__X/$!(7`=`.#X_Z)V(/$!%M>
+MPU575E.![)@```"+K"2L````OP`````/MX0DL````%#HE````(G#@\00A<!T
+M)XGF5FA__P``4%7HR`$``(/$$(7`=!&#[`164U7H1O___XG'@\00D(GX@<2,
+M````6UY?7<.-=@!3BUPD"%/H!?[__X/$!`^WP(/X$G0>@_@2?PF%P'0=ZRN-
+M=@`]_P$``'01/4J#``!U&HGVN`$```#K%I"X`0```&:!NPH"``!*`W0%N```
+M``!;PY"+3"0$N@````"-=@"-!)+!X`)F.8C@"```=0D%X`@``,.-=@!"@?J"
+M````=M^X`````,.05E/_="0,Z'W]__^#Q`2)QF:%P'DCB?.!X_]_``!3Z*G_
+M__^#Q`2)VH7`=4?K"@^W5!`(ZSZ-=@"Z`````(UV`(T$U0`````IT,'@`F8Y
+ML$````!U$[I0````9H-\$`@`=<RZ2P```)!"@_I*=M*Z`````(G06U[#5E.#
+M[`2+7"00BW0D%+H`````B?:-!%*-!("-#,4`````#[>!H"$``#G8=2"%]G05
+M@^P$:GB-@:`A``!05NC\____@\00N`$```#K"T*#^C!VPK@`````@\0$6U[#
+MC78`BTPD!+@`````A<ET+^L&N`$```##N@````")]HT$U0`````IT`^W!(5`
+M````.<ATWD*#^DIVY;@`````PXUV`%575E.#[!R+1"0X9HE$)!J_`````+T`
+M````QT0D%`````#'1"00`````(M4)#1F@SH`=4[_="0PZ#/\__^#Q`2)PV:%
+MP'@Q@^P(:@`/M_!6Z`O___^#Q!"%P'4-5NA>____@\0$A<!T!0^W\^L<BT0D
+M-`^W<`+K$HM4)#0/MW("ZPB+1"0T#[=P`O?&`/\```^%.@$``+D`````NP``
+M``"-!,T`````*<B-%(4`````#[>"0````#GP=1&!PD````")5"04NP$```")
+M]D&#^4IW!H7;=,KK$+@`````A=L/A$(!``"-=@"`?"0:`'@0BU0D%`^W<@*+
+M>@B]`````(!\)!H`>1"+1"04#[=P!(MX#+T`````N0````"[`````(T$R8T4
+MA0`````/MX*`"```.?!U(XM$)#"+@-@!```[@H0(``!U$8'"@`@``(E4)!"[
+M`0```(GV08/Y`7<&A=MTONL$A=MT:(!\)!H`>"R+5"00BTH(NP````")^"'(
+MB>HAVHG'BT0D$(M(#+L`````B?@)R`G:B<>)U8!\)!H`>2Z+5"00BTH0NP``
+M``")^"'(B>HAVHG'BT0D$(M(%+L`````B?@)R`G:B<>)U8GV@^P(_W0D1%;H
+M@_W__XG#@\00N`````"%VW0\BU0D/(M"#(M:$(G"BW0D%"-6$(G9(TX4BT0D
+M/(E0#(E($(M4)#1F]T("`/]U"8GN"?YT`XEX%+@!````@\0<6UY?7<.05U93
+MBU0D$(MT)!2)T(72>0.-0C^)Q\'_!HGXP>`&B=,IP[@!````N@````"(V0^E
+MPM/@]L,@=`>)PK@`````(P3^(U3^!(G1"<$/E<`/ML!;7E_#5E.+3"0,BUPD
+M$(MT)!2*5"08A-)T)K@`````.=AS$9`X%`%T%X`\`0!T!4`YV'+P.=AT"(@4
+M`?\&C78`6U[#D%575E.![(P!``"+G"2\`0``BX0DP`$``&:)1"0Z9L=$)#)8
+M&XN4)*`!``"!PC`"``")5"0HOP````#_M"2@`0``Z)[Y__^#Q`2Z`````(7`
+M#X3>!@``_[0DH`$``.C"^___BXPDI`$``&:)@0H"``"#Q`1FA<!U+P^WPU!1
+MZ,;Y__^#Q`BZ`````(7`#X2B!@``B=@E_S\``(N<)*`!``!FB8,*`@``@^P,
+M_[0DK`$``.@Z"P``B[0DL`$```^WA@H"``!0Z";[__^)PX/$%+H`````A<`/
+MA%@&``"-A"0``0``4&A__P``4_^T)*P!``#H1OS__X/$$+H`````A<`/A"X&
+M``"-A"2`````4&B`````4_^T)*P!``#H'/S__X/$$+H`````A<`/A`0&``"+
+MA"0$`0``@^`%N@````")T0G!=`6_`0```(N$)`0!``"#X`*Z`````(G6"<9T
+M!;\"````BX0DH`$``#FX#`(``'0&B;@,`@``@^P$C80D!`$``%!3_[0DK`$`
+M`.@[^?__B40D1(/$$(.\),0!````=0EFBUL09HE<)#+'1"0D`````(.\)*@!
+M``!`=@O'A"2H`0``0````(N4)*`!``"*@N(!``"(PL#J!8G1@^$!B4PD%,#H
+M!HG#@^,!B5PD&,=$)"P$`0``@7PD+!P!```/@QX$``"-=@!FBWPD.HMT)"QF
+MA3X/A/8#```/MP:%1"0T#X3I`P``C40D/E"-1"1`4`^W1@)0_[0DK`$``(N4
+M)+`!``#_DI@!``"#Q!"%P`^$NP,```^W!H/X!`^$G0```(/X!'\/@_@!=&6#
+M^`)T+^F;`P``@_@@#X3?````@_@@?PZ#^`@/A*,```#I?P,``(/X0`^$\0``
+M`.EQ`P``C8PD``$``(E,)`R-G"0H`0``B5PD$,=$)`0`&0``BH0D`@$``(/(
+M`XA$)!_IYP```(V4)``!``")5"0,C8PD&`$``(E,)!#'1"0$(!,``(J<)`(!
+M``"(7"0?Z;D```"-M"2`````B70D#(V\),@```")?"00QT0D!.`;``"*A"2"
+M````@\@!B$0D'^F(````C90D@````(E4)`R-C"38````B4PD$,=$)`2@'@``
+MBIPD@@```(/+`HA<)!_K6HVT)(````")="0,C;PDZ````(E\)!#'1"0$`"$`
+M`(J$)((```"#R`2(1"0?ZRR-E"0``0``B50D#(V,)#@!``")3"00QT0D!``9
+M``"*G"0"`0``@\L$B%PD'_]T)!#H`/;__X/$!(7`#X5%`@``QT0D(`````"0
+M_W0D$/]T)"3HB_O__X/$"(7`#X04`@``BT0D(,'@`RM$)""+="0$C02&B40D
+M"`^V0!A0_[0DO`$``/^T)+P!``#_M"2\`0``Z)_[__^+?"089HLO@\009CEO
+M`@^"RP$``(UV`&8Y;"0\#X>E`0``9CML)#X/AYH!``"+1"0(@'@&"G4+@WPD
+M%``/A(4!``"+5"0(@'H&!74+@WPD&``/A'`!```/M\6+3"0(#[91!P'0T?@/
+MMU0D,H/""CG0#X]1`0``BYPDJ`$``#E<)"0/@WL!``"#>10`>0Z#O"3(`0``
+M``^$+`$``(MT)`R`?A0`>12+O"2@`0``@[_<`0``!@^$#@$``(/L"&HXC40D
+M3%#H_/___V:);"10BU0D/&:+0@)FB40D4H/$$(M,)`@/ME$&@_H%=`^#^@IU
+M$8#,0&:)1"1"ZP=F@4PD0@"`BUPD"(I#!(A$)$6*0P6(1"1:BW0D#(M&%(E$
+M)%P/MD0D'XE$)&"+2Q"+6Q2)R"-&#(G:(U80B=$)P70)9H%,)$(``NL'9H%D
+M)$+__8M<)`B+2PB)WHM;#(G(BWPD#"-'!(G:(U<("="#^`$9P/?0@^`"B$0D
+M1(M."(G((T<$@^`"N@````")T0G!=`6`3"1$"(M<)`SV0Q1`=`6`3"1$!(M\
+M)"3!YP,K?"0DBW0D*(T\_HU$)$#\N0X```")QO.E_T0D)(UV`(M\)`AF#[9'
+M!P'%9CEO`@^#._[__XUV`/]$)""#?"0@?P^.Q?W__Y"#1"0L!(%\)"P<`0``
+M#X+E^___@WPD)``/A-X```"#?"0D0'8(QT0D)$````!H^#\``&HX_W0D+/]T
+M)#3H_P(``(M4)#2+A"2P`0``B9`P$```N0````"#Q!`YT7U`C03-`````"G(
+MP>`#BUPD*&:+%!B+M"2D`0``9HD4SF:+5!@"9HE4S@**5!@$B%3.!(I$&`6(
+M1,X%03M,)"1\P(/L!/]T)"C_M"2L`0``_[0DK`$``(N\)+`!``#_E[P!``"Y
+M`````(/$$#M,)"1]+HT$S0`````IR,'@`XN<)*0!``"*5,L&BW0D*(A4,`:*
+M5,L'B%0P!T$[3"0D?-*+A"2L`0``BWPD)(DXBY0DH`$``&:+@@H"``!FB4(8
+MA?\/E<`/MM"0B="!Q(P!``!;7E]=PXUV`%575E.+3"04BUPD&`^W>P*!Y_#!
+M``"+D300``"%TG0P9HL"9CL#=2@/MW("B?`E\,$``#GX=1GV0@0!=`VX````
+M`/?&`@```'5ZB=#K=HGVC:DP`@``BXDP$```A<ET7P^W,Y")R-'XC13%````
+M`"G"C535``^W`HGS*<.)V'4S#[=:`HG8)?#!```Y^'45]D($`70*N`````#V
+MPP)U)8G0ZR&0#[="`B7PP0``B?LIPXG8A<!^!(UJ.$G1^76EN`````!;7E]=
+MPXUV`/]T)`C_="0(Z/S___^#Q`BZ`````(7`=!L/OE`:T>*+1"0,*-`/OM"$
+MP'D(N@````"-=@")T,.055=64XMT)!2+;"08O_\```!F@[X*`@````^%A0``
+M`%;H/_'__X/$!(G#B=@E\````(/X8'005N@H\?__@\0$9H'[F0%U7@^W10(E
+MH````+_A````/:````!T?0^W10(ET````+_B````/<````!T:`^W10(ET```
+M`+_D````/=````!T4P^W10(E4`$``#U0`0``#Y3`#[;XC;Q_X````.LVB?95
+M5NC\____@\0(A<!T)HMX(`^W10(EP````#W`````=1.)^(/@#X/X`74)@^?P
+M@\\"C78`B?A;7E]=PY#_="0(_W0D".C\____@\0(N@````"%P'0+BT`<P>@"
+MB<*#X@&)T,.055=64X/L#(ML)"B+1"0@B40D!`'HB00DBT0D)$B)1"0(=$.+
+M/"2+1"0$.<=V+XGVB?XI[H/L"%=6_U0D/(/$$(7`?AF)^8GKBA:*`8@&1H@1
+M04MU\RGO.WPD!'?3`2PD_TPD"'6]@\0,6UY?7<.)]E93@^P(BW0D%(GSC40D
+M!E!HP0```%;_EJ`!``"#Q!"Z`````(7`=%R#[`2-1"0$4&:!?"0*`$`9P(/@
+M!07*````4%;_EJ`!``"#Q!"Z`````(7`="]F@7PD`O\_=A(/MP0DP>@+@^`!
+MB88\$```ZPT/OP0DP>@?B88\$```BY,\$```D(G0@\0$6U[#4X/L"(M<)!!3
+MZ%+O__^#Q`0/M\"#^$AT/X/X2'\:@_A!?PV#^$!],(7`=#KK8HGV@_A#="/K
+M69`]C8$``'\1/8B!``!]$H/H2H/X`G="ZP@]CX$``'4YD(/L#%/H$____X/$
+M$.LO#[>#"@(``#V(`0``?!P]C0$``'X'/8\!``!U#H/L#%/HZ?[__X/$$.L%
+MN`````"#Q`A;PXGV5U93@^P4BWPD)(M<)"B)_HU$)!)0:,$```!7_Y>@`0``
+M@\00A<!T5+H`````C78`C012T>!F.9B@.```=39F@7PD#@)0=PEFBX"B.```
+MZPN-!%)FBX0`I#@``&:)A@@"``!7Z-3P__]FB88*`@``@\0$ZPA"@_H-=K:)
+M]H/$$%M>7\.05U93@^P4BWPD)(MT)"B)^XU$)!)0:,$```!7_Y>@`0``@\00
+MA<!T4KH`````C78`C012T>!F.;``.0``=39F@7PD#@)0=PEFBX`".0``ZPN-
+M!%)FBX0`!#D``&:)@P@"``!7Z%#P__]FB8,*`@``@\0$ZP9"@_H&=K:#Q!!;
+M7E_#C78`5E.#[!"+7"0<4^A-_O__@\00A<!T/O:#Y`$```%T-6:#NP@"````
+M=!>#[`@/MX,(`@``4%/HOO[__X/$$.L5D(/L"`^W@PH"``!04^@K____@\00
+M@\0$6U[#D)!55U93@>RH````BZPDO````&@$$@``Z/S___^)PX/$$+X"````
+MA<`/A(`%``")QX/L!&AL$```:"`!``!0Z/S___^+A"3$````B4,,BX0DR```
+M`(E#$(N$),P```")0Q1FB:O(`0``9L>#R@$`````9L>#_`$``#P`QX,``@``
+M`````,>#,!$```,```#'@_`1````````QX/T$0````<``,>#^!$``/_____'
+M@_P1``#_____QX,`$@``_____X/$"&H`4^C\____@\00O@,```"%P`^$TP0`
+M`,>#S`$```$```"+0Q2+D"!```!F#[;29HF3T`$``(N0&)@``&:)D](!``!F
+MQX/6`0````#'@-"8```6'```O@````"-=@"+1Q3'@("8``````$`1H/^`W;M
+MBT<4BX``G```P>@<@^P(:@10Z/S___]`9HF'U`$``(M7%(N"$$```(E$)!B#
+MR`&)@A!```"#Q`R-1"024&H]5^C\____@\00O@@```"%P`^$&`0``+X$````
+M9H%\)`ZE6@^%!@0``(/L!(U$)!)0:C]7Z/S___^#Q!"^"````(7`#X3F`P``
+M9HM$)`YFB8-N$```@^P$C40D$E!HP0```%?H_/___X/$$+X(````A<`/A+<#
+M``!FBT0D#F;!Z`QFB8-L$```O@4```!F@_@!#X68`P``O0````"^`````(GV
+M@^P$C41T%%"-AL````!05^C\____@\00A<`/A&0#```/MT1T$#'%1H/^/W;3
+MO@<```"!_?__```/A4X#``"#[`2-1"024&B_````5^C\____@\00O@@```"%
+MP`^$*P,``&8/MD0D#F:)AP@"``"+1"049HF#<!```&:+1"069HF#<A```(M$
+M)!B(@W00``!F#[9$)!F(@W40``!FBT0D&HB#=Q```&8/MD0D&XB#=A```&8/
+MMD0D'8B#>A```(M$)!R(@WL0``!F#[9$)!^(@WP0``!FBT0D'HB#?1```(I$
+M)""#X`&(@W@0``"+1"0@9M'H@^`'B(-Y$```QX?``0```````+X`````O0D`
+M``"-%/4`````*?*-%)8!VHV*?A```&:+1&P09L'H"HB"?A```&:+1&P09L'H
+M!(/@/XA!"P^W1&P0P>`"@^`\9HM4;!)FP>H."="(00&*1&P3@^`_B$$,9HM$
+M;!)FP>@"@^`_B$$"#[=$;!+!X`2#X#!FBU1L%&;!Z@P)T(A!#6:+1&P49L'H
+M!H/@/XA!`XI$;!2#X#^(00YFBT1L%F;!Z`J(001FBT1L%F;!Z`2#X#^(00\/
+MMT1L%L'@`H/@/&:+5&P89L'J#@G0B$$%BD1L&8/@/XA!$&:+1&P89L'H`H/@
+M/XA!!@^W1&P8P>`$@^`P9HM4;!IFP>H,"="(01%FBT1L&F;!Z`:#X#^(00>*
+M1&P:@^`_B$$29HM$;!QFP>@*B$$(9HM$;!QFP>@$@^`_B$$3#[=$;!S!X`*#
+MX#QFBU1L'F;!Z@X)T(A!"8I$;!^#X#^(011FBT1L'F;!Z`*#X#^(00H/MT1L
+M'L'@!(/@,&:+5&P@9L'J#`G0B$$59HM$;"!FP>@&@^`_B$$6BD1L((/@/XA!
+M%V:+1&PB9L'H"HA!&&:+1&PB9L'H!(/@/XA!&0^W1&PBP>`"@^`\9HM4;"1F
+MP>H."="(01J*1&PE@^`_B$$;9HM$;"1FP>@"@^`_B$$<1H/%"X/^!`^&$O[_
+M_X/L#%?H`0$``+T`````O@````"#Q!"#[`2-1"024+@?````*?!05^C\____
+M@\00A<!T2@^W1"0.`<5F#[9$)`^(A',/$0``9HM$)`Z(A',0$0``1H/^`G:]
+MA>UT"(']_?\"`'4'O@D```#K(HM'%(M4)`B)D!!```")^.M&O@@```#K%XGV
+MO@@```"-=@"+1Q2+5"0(B9`00```A=MT#(/L#%/H_/___X/$$(.\),``````
+M=`F+A"3`````B3"X`````('$G````%M>7UW#@^P8_W0D'.C\____@\0<P[@`
+M````]D0D"0%T%XM$)`QFQP``%(M$)!!FQP`V%;@!````P[@!````PXGVBTPD
+M!(V1X`$``(-*!`%FQT(,`!1FQT(.-A6`B>`!```"BD("9L=""`,`9L=""D``
+M@^">B$("@+EX$````'079L>!2!``````QX%,$````0```(!*`H#'0A0/````
+MQX%H$````0```+@!````PY"0D%.+3"0(BUPD#(M1%(M#!(F"+(```(M1%(M#
+M#(F",(```(M1%(M#$(F"-(```(M1%(M#"(F".(```(M1%(L#B8(D@```6\.)
+M]H/L+(M,)#"+5"0TB50D!(.YW`$```%T)(G0*P4`````P>`#B40D#(G0*P4`
+M````P>`#B40D$(E4)`CK&,=$)`S_____QT0D$/_____'1"0(`0```(M$)#@E
+M__^``8D$)(G@4%'H_/___X/$-,.-=@"+5"0$BT(4QX`L@````````(M*%(N!
+M!(````T``!``)?__7_^)@02```"+0A3'@"2```#__P``PU=64XM\)!"+3"04
+MB?YF@WD2`'1$BU<4BX($@```)?__?_\-```@`(F"!(```(M7%`^W01")@BB`
+M``"+5Q0/MT$2B8)(@```BU<4BT$4P>`#B8(T@```ZQ2+5Q2+@@2````E__]?
+M_XF"!(```(M7%(L!B8(L@```BU\4BX,D@```)0``@/\/MU$("<)F@WD8`'01
+M#[=!&(/`!,'@$"4``'\`"<*)DR2```!F@[_0`0```W8Y#[=!&J@'=#&+EO01
+M``"`YOAF@WD:!W<-P>`()0`'```)PNL$D(#.!XF6]!$``(M'%(F0&(```(GV
+M6UY?PXM$)`2+0!2+@`A```"%P`^5P`^VP,.)]E93BW0D#(M,)!"+1A2+4!R#
+M^O]U#\<!`````+@`````ZT2)]HG0(X88$0``);K8!0&)`??"(`!P`'0'#0``
+M`$")`?;"!70#@PD!]\+`!0``=`.#"4#V00-`=`:)EE`0``"X`0```%M>PXUV
+M`(M$)`2+@!@1``##D%=64XMT)!"+7"04B?&+OA@1``"%_WD-BT84QT`D````
+M`(UV`(G:@>*ZV`4!]L,!=`.#R@7VPT!T,X.Y'!$```!T`X/*0(.Y(!$```!T
+M`X#.`8.Y)!$```!T`X#*@(.Y*!$```!T!H#.!(UV`(M&%(E0((F9&!$``(7;
+M>0R+1A3'0"0!````B?:)^%M>7\.0D+A`````PXGVBT0D"&:#^#]W'0^WP,'@
+M!8M4)`0#0A2+@!R0``"Z`0```&:%P'@%N@````")T,.0BTPD!(M$)`BZ````
+M`&:#^#\/AX$````/M\#!X`6)P@-1%,>"`)````````")P@-1%,>"!)``````
+M``")P@-1%,>"")````````")P@-1%,>"#)````````")P@-1%,>"$)``````
+M``")P@-1%,>"%)````````")P@-1%,>"&)`````````#013'@!R0````````
+MN@$```")T,.05U93BWPD$(M4)!B+="04N`````!F@_X_=VJ%TG0X#[9:!<'C
+M"`^V0@0)PP^V2@/!X1@/MD("P>`0"<$/MD(!P>`("<$/M@()P='IB=C!X!\)
+MP='KZPJ[`````+D`````#[?&P>`%B<(#5Q2)BAB0```#1Q2)VH#.@(F0')``
+M`+@!````6UY?PU575E.#[!"+="0LBT0D*&:)1"0.@WPD-`$9R??1@>&JJJJJ
+MN`````!F@WPD#C\/AU`!``"X`````(`^``^%0@$``+@`````9H-^`@0/AC(!
+M``#'!"0`````9H-^`@5V$&:#?@(.&=*#XOZ#P@.)%"0/MFX$#[9&!<'@"`G%
+M#[9&!L'@$`G%#[9&!\'@&`G%,<T/MD8)P>`(#[96"`G",<J!XO__``")5"0(
+M#[9^"@^V1@O!X`@)QP^V1@S!X!`)QP^V1@W!X!@)QS'/#[9&#\'@"`^V5@X)
+MPC'*@>+__P``B50D!`^V7A`/MD81P>`("<,/MD82P>`0"<,/MD83P>`8"<,Q
+MRV:#?@(-=P:!X_\````/MTPD#HG(P>`%B<*+="0D`U84B:H`D```B<(#5A2+
+M="0(B;($D```B<*+="0D`U84B;H(D```B<(#5A2+="0$B;(,D```B<*+="0D
+M`U84B9H0D````T84BQ0DB9`4D```_W0D,%%6Z/S___^#Q`R-=@"#Q!!;7E]=
+MPX/L$&H&BT0D&`4/$0``4/]T)"#H_/___X/$',.#[!!J!O]T)!R+1"0<!0\1
+M``!0Z/S___^X`0```(/$',.-=@"#[!!J!FB,$0``_W0D(.C\____@\0<PY"X
+M`````,.)]E.#[`B+7"00BU,4BT0D%(N$@@!@``!J`FH#:`!L``!3Z/S___^#
+MQ!"Z`````(7`=!6+0Q2+D`!H``"+1"089HD0N@$```")T(/$"%O#C78`4XM<
+M)!"+3"0(N@P```"+1"0,9CF!"`(``'03BH%N$```@^"`/`$9TH/B^(/""X7;
+M=`*)$[@`````6\.0N`$```##B?975E.+?"009HN?2!```(G>@^8<P?X"@^,"
+MT?N#[`A65^C\____@\0,.=@/E,`/ML!05E?H_/___X/$$%M>7\.04XM$)`B+
+M6!2+3"0,T>&Z`P```-/B]]*+@Q1````APK@"````T^`)PHF3%$```+@!````
+M6\.-=@!3BT0D"(M8%(M,)`S1X;@#````T^#WT(N3%$```"'0B8,40```N`$`
+M``!;PU.+3"0,BT0D"(M8%(N3&$```+C^____T\`APHM$)!"#X`'3X`G"B9,8
+M0```N`$```!;PY"+3"0(N/____^#^05W%8M$)`2+0!2+@!Q```"#X"_3Z(/@
+M`<-64X/L!(MT)!"+3"04BT84BY@40```B<K!X@S1X;@#````T^`)T`T`@`$`
+M]]`APPG3@,^`@WPD&`!T!H'+```!`(M&%(F8%$```(/L"(N&&!$```T````!
+M4%;H_/___X/$%%M>PXUV`%.+7"0(BTPD#(M#%(N0$$```(7)=`J#^01T#>L3
+MC78`@^*?ZQ&-=@"#XM^#RD#K!H/*((/BOXM#%(F0$$```%O#C78`BT0D!(M`
+M%(N`!(```"4``(``@_@!&<"#P`+#D(M,)`2+5"0(BT$4BX`$@```J0``@`!T
+M"(/Z`G4(PXGV@_H!=`Z+410-``"``(F"!(```,.X`````,.)]H-\)`@`#Y3`
+M#[;`PU93@^P(BW0D%(M<)!QJ!O]T)!R-AC01``!0Z/S___^+3A0/MI8T$0``
+M#[:&-1$``,'@"`G"#[:&-A$``,'@$`G"#[:&-Q$``,'@&`G"B9$(@```@\00
+MBTX4#[:&.1$``,'@"`^VEC@1```)PHG8)?\_``#!X!`)PHF1#(```&:%VW49
+MBU84BX($@```#0``$`")@@2```#K%XUV`(M6%(N"!(```"7__^__B8($@```
+M@\0$6U[#B?93BT0D"(M`%(N(;(```(N0<(```(N8;(```#G+@](`N`````")
+MV;L`````"<@)VEO#C78`BT0D!(M`%(N`;(```,.)]HM$)`2+4!2+@B2````-
+M`````8F")(```,.-=@"+5"0$BT(4BX!DF```B<'!Z1.!X?\!``#VQ0%T!H'Q
+M`/[__XM2%(N"<(```(N2;(```#'0,<C#D(M$)`0/MY#0`0``BT`4BX`@0```
+M)?\````YP@^4P`^VT(G0PXM,)`2+1"0(BU$4BY*8@````1"+412+DI2````!
+M4`2+412+DIR````!4`R+412+DI"````!4`B+412+DJ"````!4!##5U93BWPD
+M$(MT)!2)^X/^"'86@^P(:/__``!7Z/S___^#Q!`Y\',2D,>#^!$``/____^X
+M`````.LC@^P(5E?H_/___XM7%(F"$(```(/$$(FW^!$``+@!````B?9;7E_#
+M@^P4BU0D&(M"%(N`$(```"7__P``4%+H_/___X/$',-55U93@^P4BVPD*&C_
+M'P``5>C\____@\00.T0D)',1QX7\$0``_____[@`````ZSR+=12+GA2```"!
+MXP#@__^#[`C_="0L5>C\____)?\?```)PXF>%(```(/$$(M$)"2)A?P1``"X
+M`0```)"#Q`Q;7E]=PX/L%(M4)!B+0A2+@!2````E_Q\``%!2Z/S___^#Q!S#
+MBT0D!`^V@/,1``"#\`&#X`'#B?:+1"0$B<&#?"0(`'0CBU`4BX($@```)?__
+M__Z)@@2```"!H?`1``#____^ZR&-=@"+4!2+@@2````-`````8F"!(```(&)
+M\!$```````&X`0```,-55U93@^P4BVPD*&C_'P``5>C\____@\00.T0D)',1
+MQX4`$@``_____[@`````ZT"+=12+GA2```"!X___`."#[`C_="0L5>C\____
+MP>`0)0``_Q\)PXF>%(```(/$$(M$)"2)A0`2``"X`0```(GV@\0,6UY?7<.#
+M[!2+5"08BT(4BX`4@```)0``_Q_!Z!!04NC\____@\0<PY"X`0```,.)]L.-
+M=@"X`````,.)]L.-=@##C78`@^P,BT0D%(M4)!B#^`%U#(/Z`1G`]]"#X`WK
+M$O]T)!Q24/]T)!SH_/___X/$$(/$#,.)]E.#[`B+7"00BTPD%(M4)!R#^0MT
+M#[@`````@_D>=#?K'XUV`(/B!HF3^`$``(M#%(F0:(```+@!````ZQF-=@"#
+M[`S_="0L4O]T)"Q14^C\____@\0@@\0(6\.0@^P4_W0D+/]T)"S_="0L_W0D
+M+/]T)"S_="0LZ/S___^#Q"S#BTPD!(M1%(N"!(````T```0`B8($@```@WPD
+M"`!T%(M1%(N"!$```"7___S_B8($0```PU93@^P$BW0D$(-\)!0`='2+5A2+
+M@@1````E___\_XF"!$```(/L#&C0!P``Z/S___^["@```(/$$(UV`(M&%(N`
+M$$```*D```$`="F#[`QHR````.C\____BU84BX($0```)?___/^)@@1```"#
+MQ!!+=<GK!X7;=0N-=@"X`````.L:D(M6%(N"!(```"7___O_B8($@```N`$`
+M``"#Q`1;7L.0BTPD!(M1%(N"!(````T```0`B8($@```@WPD"`!T%(M1%(N"
+M!$```"7___S_B8($0```PU=64XM$)!"+7"04BU0D&(G&OP$```"#^P%T(8/[
+M`7((@_L"="/K+9"#[`A24.CV_O__B<>#Q!#K(XUV`%)0Z(G___^#Q`CK%%)0
+MZ*7^__^#Q`CK"+@`````ZPF0B9XP$0``B?A;7E_#BT0D!(M`%(N`!$```"4`
+M``,`P>@0PY"04X/L"(M$)!2#^`%T#[L`````@_@"=!7K"XUV`+L`````ZPF0
+MN`````#K$Y"#[`A3_W0D'.C\____B=B#Q!"#Q`A;PY"+1"0$BT`4BT`,PY"+
+M1"0$BU`4BT0D"(E"#,.0BT0D!(M`%,=`"`0```##D%93@^P$BW0D$(M&%,=`
+M""````"[`````(M&%(M`"*@$=0JX`0```.L>C78`@^P,:@KH_/___X/$$$.!
+M^^<#``!^UK@`````@\0$6U[#C78`BT0D!(M0%(N":(```(/@OXF":(```,.0
+MBT0D!(M0%(N":(```(/(0(F":(```,.0BTPD!(M1%(M$)`B)@E"```"+412+
+M1"0,B8)4@```PY!3BU0D"(M,)`RX`````(/Y/W="@_D?=B"+4A2+FE2```"#
+MZ2"X_O___]/`(=B)@E2```#K&XUV`(M2%(N:4(```+C^____T\`AV(F"4(``
+M`+@!````6\.04XM4)`B+3"0,N`````"#^3]W0H/Y'W8@BU(4BYI4@```@^D@
+MN`$```#3X`G8B8)4@```ZQN-=@"+4A2+FE"```"X`0```-/@"=B)@E"```"X
+M`0```%O#D(M$)`2+0!2+@$R```##B?:+5"0(]L8"=`:`YOV#RB"+1"0$BT`4
+MB9!,@```PXUV`(M4)`R+3"0(QT$(`````(G0)?\/``")00RX`````#E1#'4A
+M]D0D$"!T!X%)#``@``#'010`````QT$0`````+@!````PXUV`%=64XM\)!"+
+M="0HBUPD%(M$)!RZ#P```/9#%`$/A`4!``#V0!0!=16+1Q2+0`RZ#P```#M$
+M)!@/A.H```!FBT,0)?\/``!FB0:+2Q2!X0"`_P_!Z0^+1Q2+@&R```")PL'J
+M"H'B__\``(G0)?\?```YR',0C8(`X/__)?__```)P>L#D`G1B<@E_W\``&:)
+M1@+&1@0`BT,4J`)U.*@$=`C&1@0!ZRZ)]O9#%!!T!H!.!`CK(/9#%`AT!H!.
+M!`3K%(!.!`*+0Q0EX````,'H!8A&!8GVBT,0)0``^`?!Z!.(1@:+0Q3VQ`%T
+M#B4`?@``P>@)B$8'ZP60QD8'_XM#$"4`@`<`P>@/B$8(BT,0P>@.@^`!B$8)
+MBT,0P>@,@^`!B$8*N@````")T%M>7\.0D)!55U93@^P,BWPD((ML)"R)?"0(
+MN@P```"+1"0H]D`#`0^$P@4``(/L"/]T)#!7Z/S___^)1"04@\00N@P```"%
+MP`^$H04``(-\)"0&="&#?"0D!G<)@WPD)`%W">L1@WPD)`AT"KH,````Z7D%
+M``"+1Q2+@!!```")PX/C8(/L"/]T)#!7Z/S___^#Q!"Z`P```(7`#X1.!0``
+MBT\4BW0D"`^VE@\1```/MH80$0``P>`("<(/MH81$0``P>`0"<(/MH82$0``
+MP>`8"<*)D0"```"+3Q0/MI84$0``P>((#[:&$Q$```G0B8$$@```@^P(_W0D
+M+%?H!04``(/$$(-\)"0!=$F#?"0D`7(I@WPD)`9T"8-\)"0(=$WK8HM'%,=`
+M*`````"+1Q3'@!!```!`$```ZTF+1Q3'0"@!````BT<4QX`00```)!```.LP
+MBT<4QT`H`````(M'%,>`$$```"00``#K%XM'%,=`*`````"+1Q3'@!!```!`
+M$```BU<4BX(00```"=B)@A!```"+3Q2+1"0(#[:0-!$```^V@#41``#!X`@)
+MPHM<)`@/MH,V$0``P>`0"<(/MH,W$0``P>`8"<*)D0B```"+3Q0/MI,Y$0``
+MP>((#[:#.!$```G0B8$,@```BT<4QP``````BT<4QT`$`````(M'%,=`#```
+M``"+1Q2+4!S'0"``````BT<4QT`D`````,>#&!$```````"+1Q2+4"S'0#`%
+M````BT<4QT`T!0```(M'%,=`1`@```"+1Q3'0$@(````BT<4QT!0`````(M'
+M%,=`3`````"+1Q3'@`Q`````````BT<4QT!``````(M7%(N#]!$``(F"&(``
+M`(M'%,>`2(````````"#[`AJ`%?H_/___XM'%,>`4(````````"#Q!"+1Q3'
+M@%2`````````BT<4QX!8@````````(M'%,>`7(````````"+1Q3'@&"````!
+M````BT<4QX!D@````0```(M'%,>`:(````````"+1Q3'@"B`````````BT<4
+MQX`L@````````(M'%,>`;(````````"+1Q3'@#"```#_____BT<4QX`T@```
+M_____XM'%,>`.(````$```"Y`````+Z@$0``BQS.A>UT#8V#`(#__SW_#P``
+M=@J+5Q2+1,X$B00:08'YI@```';9@^P(_W0D,%?H_/___X/$$+H#````A<`/
+MA$P"``"+3Q2+D2B8```P]HMT)`@/MH9U$```P>`("<*)D2B8``"+7Q0/MI9V
+M$```B=#!X!C!XA`)T`^VCG<0``")RL'B"`G0"<B)@S28``"+3Q2+D428``"!
+MXG_`__]FBX9P$```9M'H)8`_```)PHF11)@``(M/%(N12)@``('B_P_\_P^W
+MAG`0``#!X`HE`/`#``G"B9%(F```BT\4BY%DF```@>+_#_C_#[:&=!```,'@
+M#"4`\`<`"<*)D628``"+3Q2+D1"9``"#XOP/MX9P$```@^`#"<*)D1"9``"#
+M[`C_="0,5^A$#0``@\00N@,```"%P`^$5`$``(7M="2+1"0$]D`$`G4$@&`$
+M_HM4)`1FBT("BTPD*&:)00**0@2(002+1Q3'@!R8```!````@^P,:.@#``#H
+M_/___XM7%(N"8)@``(/(`8F"8)@``(/$$&H`:@%H8)@``%?H_/___X/$"/]T
+M)`Q7Z/S___^#Q!"[`````(7`=1.+7"0H9H-+`@*Z`P```.G"````@^P(4U?H
+M_/___X/$$$.#^P)^[8._3!````!T#(/L#%?H_/___X/$$(M7%(N")(```"7_
+M_W_^B8(D@```BW0D"(.^^!$``/]T$H/L"/^V^!$``%?H_/___X/$$(M$)`B#
+MN/P1``#_=!*#[`C_L/P1``!7Z/S___^#Q!"+5"0(@[H`$@``_W02@^P(_[(`
+M$@``5^C\____@\00@[_X`0```'0/BU<4BX?X`0``B8)H@```BTPD)(F/W`$`
+M`+@!````ZQ"+7"0P@SL`=`*)$[@`````@\0,6UY?7<-3BUPD"(M4)`R+0Q2+
+M@`2````E__\``(/Z`71$@_H!?P>%TG0EZV60@_H&=`>#^@AT1NM8BU,4"X/P
+M$0``#0``40")@@2```#K0HM3%`N#\!$```T``%(`B8($@```ZRR+4Q0+@_`1
+M```-```4`(F"!(```.L6B?:+4Q0+@_`1```-```0`(F"!(```%O#B?:+1"0$
+M_[#<`0``4.A@____@\0(PX/L$&H*:@C_="0<Z&`#``"#Q!S#4X/L#(M<)!1J
+M`6H`4^C\____@\00N@````"%P'1.@^P$:"!.``!J#U/H+@,``(/$$+H`````
+MA<!T,H/L#&CH`P``Z/S___^#Q`QH($X``&H?4^@%`P``QP0D-`@``.C\____
+MN@$```"#Q!"0B="#Q`A;PY!64X/L"(MT)!2+7"08:@%J`%;H_/___X/$$+H`
+M````A<`/A)D```"+1A2Z`````(7;=`CV0P(0=`*R`8F0!)@``(/L!&@@3@``
+M:@]6Z)<"``"#Q!"Z`````(7`=&.#[`QHZ`,``.C\____@\0,:"!.``!J'U;H
+M;@(``(/$$+H`````A<!T.H/L#&@T"```Z/S___^#Q`QJ`6H`5NC\____@\00
+MN@````"%P'04@^P$:@IJ`%;H+P(``(G"@\00B?:)T(/$!%M>PU575E.#[!2+
+M;"0H_W0D+%7H_/___XG'@\00N@````"%P`^$[0$``(M5%(N":(```(/(8(F"
+M:(```(M5%(NR)(```(GP)?__?_^)@B2```"#[`QHH`\``.C\____BU44BX((
+MF```#0````B)@@B8``#'!"0*````Z/S___^#Q`A75>A."0``@\00N@````"%
+MP`^$?@$``(/L#&CH`P``Z/S___^+512+@@B8```E____]XF"")@``(/$!(M%
+M%(N86)@``(N07)@``(E4)!2+D&B8``")5"00B=J!R@``_`.)D%B8``"+512+
+M1"04)7\`P/\-@,`_`(F"7)@``(M5%(M$)!`E'P#^_PV`$0``B8)HF```:A3H
+M_/___XM5%(N"")@```T````(B8((F```QP0D"@```.C\____BT44QX#4F```
+M(0```(M5%(N"")@``"7____WB8((F```QP0DZ`,``.C\____BU44BX)@F```
+M@\@!B8)@F```@\00:@!J`6A@F```5>C\____@\0(BT44B9A8F```BT44BU0D
+M$(F07)@``(M%%(M4)`R)D&B8``!75>C\____@\00A<!U*8/L#&B($P``Z/S_
+M__^#Q`A75>C\____@\00A<!U"XM$)"1F@T@"`HGVBU44BX)H@```@^"?B8)H
+M@```BT44B;`D@```BT0D*,<``0```+H!````B?:)T(/$#%M>7UW#B?975E.+
+M?"00BW0D%(GPA?9U!;C_____B<.+1Q2)L`!```"#[`S_="0DZ/S___^#Y@^#
+MXP]64V@`0```5^C\____B<*#Q"#WQ@0```!U"HM'%,=`%`````")T%M>7\.-
+M=@!64X/L!(M,)!2*1"08B$0D`[L`````N@H````/ML"-<`&-=@"-1!(#.D0D
+M`W4:@#P1/W0,#[8$$>F>````C78`NP$```#K<9"-1!(##[;`.<9U4872?DV`
+M/!$_=#^`?`K_/W0X#[8<$0^V3`K_*<N-!)N-!("-%,4`````*<*-G!+G`P``
+MN---8A#WXXG0P>@&C1P(#[;#ZT*-=@"[`0```.L5D(/[`74/@#P1/W0)#[8$
+M$>LFC78`2@^)9?___[H`````@#P1/W0&#[8$$>L+0H/Z"G[NN`$```"#Q`1;
+M7L.-=@!55U93@^P$BUPD'(ML)"2*5"0@O_____^^_____[D`````B?:`/`L_
+M="HX%`MT3S@4"W,"B<XX%`MV&8G/@_[_=1J-1`D#B$4`#[9$"POID@```)!!
+M@_D*?LKK!8/Y"GXKN#\```"#_O]T>H/Y"GX<C40V`XA%``^V1#,+ZV>-1`D#
+MB$4`#[9$"POK68U$/@.(10`/MM(/M@PS*<J-%)*-%)*-%)*-+-4`````#[8$
+M.RG(B<&)Z)GW^8G%#[9$.PL/MDPS"RG(B>H/K]"!PN<#``"XTTUB$/?BB=#!
+MZ`8"1#,+#[;`@\0$6UY?7<.-=@"+5"0(@_H\=@6Z/````(M$)`1FB9#\`0``
+MN`$```##D%575E.#[!"+;"0DBU0D*(M\)"R);"0$9HN%<A```&;!Z`2#X`>(
+M1P^*A7(0``"#X`>(1Q!FBP(M,A0``+D`````9CV6``^'3`(``+L`````BTPD
+M!&8/MH0+>A```&8YA0@"``!T!D.#^P-VY+D`````@_L$#X0=`@``#[<*@>DR
+M%```N&=F9F;WZ<'Z`HG(P?@?B=$IP8/Y#(/1_[BKJJJJ]^&)T='IC03-````
+M`"G(C32!BT0D!(VT!GX0``"*1!X9B$<.BE0>&8I&%CC0=@*(T(A'"8I4'AF*
+M1A<XT'8"B-"(1PB*5!X9BD88.-!V`HC0B$<'C40D#U`/MD0>&5!65>CI_?__
+MB,.-1"0>4`^V1PE05E7HUOW__XA$)".#Q""-1"0-4`^V1PA05E7HOOW__XA$
+M)!*-1"0<4`^V1P=05E7HJ?W__XC"@\0@@[T``@````^$]````(N%``(``&:+
+MC`#J%@``#[94)`\/M\&#P`,YPGT'QD0D#P/K!"A,)`\/MD0D#U!65>A^_/__
+MB$<.C40D%U`/MD<.4%95Z$[]__^(PXI4)"J*1"0K@\0<.-!V`HC0B$0D#@^V
+MP%!65>A(_/__B$<)C40D%U`/MD<)4%95Z!C]__^(1"0?BE0D*8I$)"N#Q!PX
+MT'8"B-"(1"0-#[;`4%95Z!#\__^(1PB-1"074`^V1PA05E7HX/S__XA$)!Z*
+M5"0HBD0D*X/$'#C0=@*(T(A$)`P/ML!05E7HV/O__XA'!XU$)!=0#[9'!U!6
+M5>BH_/__B,*#Q!P/MD0D#]'@9HF%_@$``(I'#HA'"HA'"XA'#(A'#8C8*-"(
+M!XC8*D0D`HA'`8C8*D0D`XA'`L9'!@#&1P4`QD<$`,9'`P"Y`0```(G(@\00
+M6UY?7<.-=@!75E.#['2+O"2$````:D1H`!<``(U$)`Q0Z/S___^#Q`QJ$6C8
+M%@``C5PD7%/H_/___U/_M"28````5^@<_?__@\0<N@````"%P`^$8`(``(I$
+M)%](N@`````\!`^'3@(``(I$)&!(N@`````\!`^'/`(``+X`````C78`#[?>
+M@^P(:@4/MD0<7%#H_/___XA$'&"#Q!!&9H/^!G;?O@<```")]@^WWH/L"&H&
+M#[9$'%Q0Z/S___^(1!Q@@\001F:#_@YVWP^V1"11P>`%)>`````/ME0D4(/B
+M'PG0"00D#[94)%/!X@>!XH`````/MD0D4L'@`H/@?`G"BD0D4<#H`X/@`PG"
+M"50D!`^V5"14P>($@>+P````BD0D4]#H@^`/"<()5"0(#[94)%;!X@:!XL``
+M```/MD0D5='@@^`^"<**1"14P.@$@^`!"<()5"0,#[94)%?!X@.!XO@```"*
+M1"16P.@"@^`'"<()5"00#[94)%G!X@>!XH`````/MD0D6-'@@^!^"<**1"17
+MP.@%@^`!"<()5"04#[94)%K!X@6!XN````"*1"19T.B#X!\)P@E4)!@/ME0D
+M6\'B`X'B^````(I$)%K`Z`.#X`<)P@E4)!P/ME0D7-'B@^)^BD0D6\#H!8/@
+M`0G""50D(`^V1"1=P>`%)>`````)1"0D#[94)%[!X@.!XO@```"*1"1=P.@#
+M@^`'"<()5"0HBD0D7L#H!8/@`0E$)"R#[`AJ`P^V1"1K4.C\____P>`')8``
+M```)1"0P@\0(:@,/MD0D:U#H_/___]'H@^`#"40D-(/$"&H##[9$)&Q0Z/S_
+M___!X`*#X!P)1"0TO@````"#Q!")]HM'%`^WUHL4E(F0G)@``$9F@_X/=NJ+
+M1Q0/M]:+%)2)D-28``"Z`0```(GVB="#Q'!;7E_#C78`5E.#[`R+7"08BW0D
+M'&H%#[<.@>D`%```N&=F9F;WZ8G0P?@"P?D?*<A0Z/S____1X(/(08M3%(F"
+MG)@``(M#%,>`P)@```````")LS00``"X`0```(/$%%M>PY"+1"0$BT`4BX!D
+MF```P>@3)?\!``#VQ`%T!34`_O__F,.-=@!75E.+="00BWPD%(M&%(N08)@`
+M`(/*`HF08)@``&H`:@)H8)@``%;H_/___X/$$+H`````A<!T2;L`````C78`
+M@^P,:.@#``#H_/___U;H_/___YB#Q!1#@_L4?P>#^+A_WNL4@_BX?@]FQT<6
+M``"Z`````.L+B?9FB4<6N@$```")T%M>7\.0N`````##B?:X`````,.0D%.#
+M[`B+7"00BU0D%+@`````@_H"?QZ#[`3_="0<C012C02`C82#/!$``%!3Z/S_
+M__^#Q!"#Q`A;PXUV`%.#[`B+7"00BU0D%+@`````@_H"?QZ#[`2-!%*-!("-
+MA(,\$0``4/]T)"!3Z/S___^#Q!"#Q`A;PXUV`%575E.#[`R+;"0@BW0D)(GJ
+M@_X"=!:#_@)W"8/^`70<ZR*)]H/^`W0+ZQF0OP(```#K&9"_`0```.L1D+\`
+M````ZPF0N/_____K:)"-!'^-!("-G((\$0``N/____^#>P0`=4^#[`AJ/%/H
+M_/___XES!(/$$(-\)"@`=23'0PP+````QT,4`@```,=#&/____]FQT,@"@!F
+MQT,B"@#K$I"#[`3_="0L5U7H_/___X/$$(GX@\0,6UY?7<.04XM,)`R+5"0(
+MNP````"#^0)W28T$28T$@(V$@CP1``"[`````(-X!`!T,<=`!`````"X_O__
+M_]/`(8(<$0``(8(@$0``(8(D$0``(8(H$0``(8(L$0``NP$```")V%O#55=6
+M4XMT)!2+3"08B?.+EC00``"X`````(/Y`@^'#@(``(T$28T$@(V\ACP1``"X
+M`````(-_!``/A/(!``"X`0```(-_!`$/A>,!``#V0@(0='B+1A3'@!"```#@
+M`0``BT84QX`4@`````@`"(M&%,>`((```,^/W0&+5A2+1Q2-!$"-!(#!X!"-
+M@```#P`-X`$``(F"0(```(M&%,>`1(```,`#K@6+5A2+@D28``"#X("#R#B)
+M@D28``"+1A3'@`28```C(`!OZWJ+1A3'@!"```!H`0``BT84QX`4@`````0`
+M!(M&%,>`((```*>/W0&+;A2+5Q2-!)*-!$*-!(*-!,4P`@``P>`+#3`"``")
+MA4"```"+1A3'@$2```"8`]<$BU84BX)$F```@^"`@\@<B8)$F```BT84QX`$
+MF```(!``;[@/````@W\8_W0#BT<8BW84B<+!XA0/MT<BP>`$)?`````)P@^W
+M1R"#X`\)PH'*`"`(`(F6'(```/9'#`%T#[@!````T^`)@QP1``#K#;C^____
+MT\`A@QP1``#V1PP!=`^X`0```-/@"8,@$0``ZPVX_O___]/`(8,@$0``]D<,
+M`G0/N`$```#3X`F#)!$``.L-N/[____3P"&#)!$``/9'#`1T#[@!````T^`)
+M@R@1``#K#;C^____T\`A@R@1``#V1PP(=`^X`0```-/@"8,L$0``ZPVX_O__
+M_]/`(8,L$0``N`$```"-=@!;7E]=PXUV`(M,)`2+1"0(C01`C02`NO____^#
+MO(%`$0```74%BT$4BQ")T,.-=@"+5"0$BT0D"(M,)`R-!$"-!("+A()`$0``
+M@_@!=`Z#^`%R&8/X`W<4ZPJ)]HM"%(D(ZQ&0BT(4B4@$ZPBX`````,.)]K@!
+M````PXGV5E.#[!"+="0<5NC\____B<.#Q`@E____?U!6Z/S___^+1A2+D&2`
+M``"#Q!"#?"04`'0-N"4````IT-'H`<+K'(/Z`78#2NL4@^P(4U;H_/___[@`
+M````@\00ZQN+1A2)D&2```"#[`A35NC\____N`$```"#Q!"#Q`1;7L.-=@"+
+M5"0$BT0D"(T$0(T$@(N$@D`1``"#^`)T.H/X`G<)@_@!=`SK.HGV@_@#=`_K
+M,9"+0A3'0`@!````ZRR+0A3'0`@"````BT(4QT`H#@```.L6B?:+0A3'0"@*
+M````ZPBX`````,.)]K@!````PXGVBTPD!(M$)`B-!$"-!("Z`````(.\@4`1
+M```!=1.+012+0!0E`'@``(G"P>H+C78`B=##D%93@^P$BW0D$(M$)!2-!$"-
+M!("+A(9`$0``@_@!=`>#^`)T3>M>BT84QT`("````+L`````C78`BT84BT`4
+M]L1X=!:#[`QJ"NC\____@\000X'[YP,``'[?BT84QT`(`````('[YP,```^>
+MP`^VP.L8:@!J!&HL5NC\____@\00ZP>)]K@`````@\0$6U[#D%=64XM4)""+
+M?"0PBW0D.(M,)!2-0OV[````#(/X`78%B=/!XQJ+1"08)?\/``"+5"0HP>(2
+M"="+5"0<P>(,@>(`\`,`"=`)V/?&`0```'0%#0````'WQA````!T!0T````@
+MB<*#?"0T`'0&@<H````"B5$(@___=!N)^,'@#24`X`<`B4$,B=`-````0(E!
+M".L*B?;'00P`````D/?&!````'03@4D(``!``(M$)$`E``#X_PE!#+@!````
+M6UY?P[@`````PXGVBT0D"(%("````"##4XM,)!"+7"08BU0D#(-\)!0`=!2+
+M0@P)R(7;=0.`S!")0@SK)XUV`(7;=!"+1"0<BT`(B4((B4H,ZQ&0QT((````
+M`(G(@,P0B4(,D,="%`````#'0A``````N`$```!;PXUV`(M,)`R+5"0(N`\`
+M``#V0A0!#X2"````9HM"%"7^'P``9HD!#[="$F:)00+&000`BT(0J`%U'J@"
+M=`3&000!]D(0"'0$@$D$`O9"$`1T!H!)!`2)]HM"""4``#P`P>@2B$$%BT(4
+M)0#@'P#!Z`V(00:+0A`E``\``,'H"(A!!XM"$"7P````P>@$B$$(QD$*`,9!
+M"P"X`````,.)]L.0D)"+1"0(@$@$"+@`````PY"0@^P,BTPD$(M!%,>`T)@`
+M`!8<``"Z`````(UV`(M!%,>`@)@``````0!"@_H'?NV+012+@`"<``#!Z!B)
+MPL'J!(/@#\'@!`G0@^P(:@A0Z/S___^#Q!S#D%575E.#[!B+;"0L:.PL``#H
+M_/___XG#@\00O@(```"%P`^$.00``(G'@^P$:&P0``!H8!<``%#H_/___XM$
+M)#2)0PR+1"0XB4,0BT0D/(E#%&:)J\@!``!FQX/*`0````!FQX/\`0``/P#'
+M@P`"````````QX.H+````````,>#Q"P```````#'@\PL````!P``QX/0+```
+M_____\>#U"P``/_____'@]@L``#_____@\0(:@!3Z/S___^#Q!"^`P```(7`
+M#X25`P``9H&[R`$``!OQ=2J+0Q3'@`"B````````BT,4QX!\F```&0```(/L
+M#&CH`P``Z/S___^#Q!"+1Q2+@"!````E_P```(G"P>H$B9?,`0``@^`/9HF'
+MT`$``(/J`KX-````@_H"#X<L`P``BT<4BX`8F```9HF'T@$``(/L#%?H8P,`
+M`(/$$+X.````A<`/A`,#``"#O\P!```#=A*+1Q3'@`"8```'````ZQ"-=@"+
+M1Q3'@`"8``!'````@^P,:-`'``#H_/___XD\).@._O__9HF'U`$```^WP"7P
+M````@\00O@T```"#^!`/A:8"``"#[`2-1"0.4&C!````5^C\____@\00O@@`
+M``"%P`^$@P(``+X%````9H%\)`K_+P^&<0(``&:+1"0*9HF#;!```(M'%(N`
+M$$```(/@&,'H`[X*````@_@"#X5(`@``@^P$C40D#E!J/U?H_/___X/$$+X(
+M````A<`/A"@"``!FBT0D"F:)@VX0``"]`````+X`````B?:#[`2-1"0.4(V&
+MP````%!7Z/S___^#Q!"%P`^$Z`$```^W1"0*,<5&@?X_`P``=M"^!P```(']
+M__\```^%SP$``&;'@^(1```*`&;'@^P3```#`+X`````C01VC02&9L>$@^H1
+M```+`$:#_@EVZKX`````NLPG``!FBP1R9HF$<_03``!FB81S[A,``(T$=HT$
+MAHT$@V;'@+`4```+`&;'@!04```+`$:#_@)VRX/L"(V#;!```%!7Z/S___^#
+MQ!"^"````(7`#X1#`0``@[_,`0```W9K9H.[AA````!T88M'%,>``)@```=`
+M``"#[`QHT`<``.C\____B3PDZ%;\__]FB8?6`0``BT<4QX``F```!P```,<$
+M)-`'``#H_/___P^WA]8!```E\````(/$$+X-````@_@@#X71````ZPEFQX.&
+M$`````"#[`2-1"0.4&B_````5^C\____@\00O@@```"%P`^$HP```&:+1"0*
+M9HF#<!```&:)AP@"``#'A\`!````````@^P,5^@-`@``B3PDZ/S___^]````
+M`+X`````@\00@^P$C40D#E"X'P```"GP4%?H_/___X/$$(7`=#L/MT0D"@'%
+M9@^V1"0+B(1S*"H``&:+1"0*B(1S*2H``$:#_@)VO87M=`J)^(']_?\"`'4Y
+MO@D```#K$+X(````ZPF0O@@```"-=@"%VW0,@^P,4^C\____@\00@WPD,`!T
+M!HM$)#"),+@`````@\0,6UY?7<.)]E.#[!"+7"08C8-L$```4%/H_/___XD<
+M).C\____@\086\.)]E575E.#["R+="1`QT0D"`"```#'1"0,()@``,=$)!!5
+M5555QT0D%*JJJJK'1"089F9F9L=$)!R9F9F9OP````"-;"0(C02]`````(L<
+M*(M6%(L4&HD4!+D`````B<C!X!")P@G*BT84B108BT84BP08.=!T![@`````
+MZV%!@?G_````?M>Y`````(M4C!"+1A2)%!B+1A2+!!@YPG0*N`````#K.(UV
+M`$&#^0-^W(T$O0````"+3A2+%"B+!`2)!!%'@_\!#XYY____@^P,:F3H_/__
+M_[@!````@\00@\0L6UY?7<.-=@"+5"0,BTPD$(M$)`CVQ`%T$V;'`C@39L<!
+MU!>X`0```,.-=@"$P'D@BT0D!&:#N(80````=!)FQP(("6;'`:P*N`$```##
+MB?:X`````,.)]K@!````PXGV55=64X/L#(ML)"")[HGOC9W@`0``9H.]"`(`
+M``%U%8/L!(U$)`Q0:A!5Z/S___^#Q!")]L=#!`````!F@[Z"$````'0;QT,$
+M`0```&:#OG(0````=0K'0P0#````C78`9H.^AA````!T!(-+!`1FQT,0"`EF
+MQT,2K`IFQT,,.!-FQT,.U!>`"P.*0P*#R`-FQT,("@!FQT,*@`"#X)^(0P)F
+M@[YV$````'0I@^P$C8=($```4&H/5>C\____@\00A<!T$,>'3!````$```"`
+M2P*`B?;'0Q0-````QX=H$````0```+@!````@\0,6UY?7<.0D%.+3"0(BUPD
+M#(M1%(M#!(F"*(```(M1%(M##(F"+(```(M1%(M#$(F",(```(M1%(M#"(F"
+M-(```(M1%(L#B8(@@```6\.)]H/L+(M,)#"+5"0TB50D!(N!W`$``(/X`702
+M@_@!<B&#^`9T'(/X"'4UC78`QT0D#/__``#'1"00__\'`.L@B?:)T"L%````
+M`,'@`XE$)`R)T"L%`````,'@`XE$)!"-0@&)1"0(BT0D."7__X`!B00DB>!0
+M4>C\____@\0TPXGVBU0D!(M"%,>`*(````````"+2A2+@02````-```$`"7_
+M_\__B8$$@```BT(4QX`@@```__\``,-75E.+3"00BUPD%(G/9H-[$@!T0(M1
+M%(N"!(````T``!``B8($@```BU$4#[=#$(F")(```(M1%`^W0Q*)@CB```"+
+M412+0Q3!X`.)@C"```#K%9"+412+@@2````E___O_XF"!(```(M1%(L#B8(H
+M@```BW$4BX8@@```)0``@/\/MU,("<)F@WL8`'01#[=#&(/`!,'@$"4``'\`
+M"<*)EB"```"+E\PL```P]@^W0QK!X`@E`/\```G"B9?,+```BT$4B9`8@```
+MBTD4BY$$0```@>(``/__BT,<@^@#P>`#)?__```)PHF1!$```%M>7\.0BT0D
+M!(M`%(N`"$```(7`#Y7`#[;`PXGV4XM<)`B+3"0,BT,4BY#`````@_K_=1''
+M`0````"X`````.F1````D(G0);K8!0&)`??"```(`'0'#0```$")`?;"!70#
+M@PD!]\+`!0``=`.#"4#VPB!T$(.[:!````!T!X$)````0)#V00-`=$6)DU`0
+M``"+4Q2+@L0```")@U00``"+@L@```")@U@0``"+@LP```")@UP0``"+@M``
+M``")@V`0``"+@M0```")@V00``"X`0```%O#B?:+1"0$BX`T*@``PY!75E.+
+M="00BUPD%(GQB[XT*@``A?]Y$8M&%,=`)`````"+1A2+0"20B=J!XKK8!0'V
+MPT!T,X.Y."H```!T`X/*0(.Y/"H```!T`X#.`8.Y0"H```!T`X#*@(.Y1"H`
+M``!T!H#.!(UV`/;#`70#@\H']\,```!`=`:!R@``"`"+1A2)D*````")F30J
+M``"%VWD+BT84QT`D`0```)")^%M>7\.0D+B`````PXGVBT0D"&:#^']W'0^W
+MP,'@!8M4)`0#0A2+@!R(``"Z`0```&:%P'@%N@````")T,.0BTPD!(M$)`BZ
+M`````&:#^'\/AX$````/M\#!X`6)P@-1%,>"`(@```````")P@-1%,>"!(@`
+M``````")P@-1%,>""(@```````")P@-1%,>"#(@```````")P@-1%,>"$(@`
+M``````")P@-1%,>"%(@```````")P@-1%,>"&(@````````#013'@!R(````
+M````N@$```")T,.05U93BWPD$(M4)!B+="04N`````!F@_Y_=VJ%TG0X#[9:
+M!<'C"`^V0@0)PP^V2@/!X1@/MD("P>`0"<$/MD(!P>`("<$/M@()P='IB=C!
+MX!\)P='KZPJ[`````+D`````#[?&P>`%B<(#5Q2)BAB(```#1Q2)VH#.@(F0
+M'(@``+@!````6UY?PU575E.#[!"+?"0LBT0D*&:)1"0.@WPD-`$9R??1@>&J
+MJJJJN`````!F@WPD#G\/AWP!```/M@>#^`%T%(/X`7\'A<!T%.M-D(/X!70\
+MZT60QP0D!0```.M'N`````!F@W\"!`^&1P$``,<$)`````!F@W\"!78I9H-_
+M`@X9TH/B_H/"`XD4).L7QP0D!P```.L.B?:X`````.D2`0``B?8/MF\$#[9'
+M!<'@"`G%#[9'!L'@$`G%#[9'!\'@&`G%,<T/MD<)P>`(#[97"`G",<J!XO__
+M``")5"0(#[9W"@^V1PO!X`@)Q@^V1PS!X!`)Q@^V1PW!X!@)QC'.#[9'#\'@
+M"`^V5PX)PC'*@>+__P``B50D!`^V7Q`/MD<1P>`("<,/MD<2P>`0"<,/MD<3
+MP>`8"<,QRV:#?P(-=P:!X_\````/MTPD#HG(P>`%B<*+?"0D`U<4B:H`B```
+MB<(#5Q2+?"0(B;H$B```B<*+?"0D`U<4B;((B```B<(#5Q2+="0$B;(,B```
+MB<(#5Q2)FA"(```#1Q2+/"2)N!2(``#_="0P4?]T)"SH_/___X/$#(/$$%M>
+M7UW#@^P0:@:+1"08!2@J``!0_W0D(.C\____@\0<PX/L$&H&_W0D'(M$)!P%
+M*"H``%#H_/___[@!````@\0<PXUV`(/L$&H&:.`G``#_="0@Z/S___^#Q!S#
+MD+@`````PXGV4X/L"(M<)!"+4Q2+1"04B8(`8```BT,4QX`(8````0```&H"
+M:@-H#&```%/H_/___X/$$+H`````A<!T%8M#%(N0!&```(M$)!AFB1"Z`0``
+M`(G0@\0(6\.-=@!3BUPD$(M,)`BZ#````(M$)`QF.8$(`@``=!.*@6X0``"#
+MX(`\`1G2@^+X@\(+A=MT`HD3N`````!;PY"+5"0$N`````!F@[J"$````'0.
+M9H.Z<A````$9P(/@0D!F@[J&$````'0#@\@$PY!75E.+?"009HN?2!```(G>
+M@^8<P?X"@^,"T?N#[`A65^C\____BU<4BX(`F```@,P@B8(`F```@\0(5E?H
+M_/___X/$##G8#Y7`#[;`4%97Z/S___^#Q!!;7E_#D%.+1"0(BU@4BY,40```
+MBTPD#-'AN`,```#3X`G"B9,40```N`$```!;PXGV4XM$)`B+6!2+DQ1```"+
+M3"0,T>&X`P```-/@]]`APHF3%$```+@!````6\-3BTPD#(M$)`B+6!2+DQA`
+M``"X_O___]/`(<*+1"00@^`!T^`)PHF3&$```+@!````6\.0BTPD"+C_____
+M@_D%=Q6+1"0$BT`4BX`<0```@^`OT^B#X`'#@^P,BTPD$(M!%(N0%$```('B
+M_'_^_X#.@(-\)!@`=`:!R@```0"+012)D!1```"#[`B+@30J```-`````5!1
+MZ/S___^#Q!S#BT0D!(M(%(N!$$```"6?__'_BU0D"(/B!PL$E0`H``")@1!`
+M``##D%93@^P(BUPD%(MT)!QJ!O]T)!R-@RXJ``!0Z/S___^+2Q0/MI,N*@``
+M#[:#+RH``,'@"`G"#[:#,"H``,'@$`G"#[:#,2H``,'@&`G"B9$(@```BTL4
+M#[:#,RH``,'@"`^VDS(J```)PH'F_S\``,'F$`GRB9$,@```@\046U[#4XM$
+M)`B+0!2+B$R```"+D%"```"+F$R````YRX/2`+@`````B=F[``````G("=I;
+MPXUV`(M$)`2+0!2+@$R```##B?:+1"0$BU`4BX(@@```#0````&)@B"```##
+MC78`BU0D!(M"%(N`9)@``(G!P>D3@>'_`0``]L4!=`:!\0#^__^+4A2+@E"`
+M``"+DDR````QT#'(PY!3BU0D"(M"%(N`($```"7_````B<&#X0^[`````,'H
+M!#F"S`$``'4,9CF*T`$``'4#LP&0B=A;PXM,)`2+1"0(BU$4BY*0@````1"+
+M412+DHR````!4`2+412+DI2````!4`R+412+DHB````!4`B+412+DIB````!
+M4!##5U93BWPD$(MT)!2)^X/^"'86@^P(:/__``!7Z/S___^#Q!`Y\',.D(FS
+MT"P``+@`````ZR.#[`A65^C\____BU<4B8)P$```@\00B;?0+```N`$```")
+M]EM>7\.#[!2+5"08BT(4BX!P$```)?__``!04NC\____@\0<PU575E.#[!2+
+M;"0H:/\?``!5Z/S___^#Q!`[1"0D<Q''A=0L``#_____N`````#K/(MU%(N>
+M%(```('C`.#__X/L"/]T)"Q5Z/S___\E_Q\```G#B9X4@```@\00BT0D)(F%
+MU"P``+@!````D(/$#%M>7UW#@^P4BU0D&(M"%(N`%(```"7_'P``4%+H_/__
+M_X/$',.+1"0$#[:`QRP``(/P`8/@`<.)]HM$)`2)P8-\)`@`=".+4!2+@@2`
+M```E_____HF"!(```(&AQ"P``/____[K(8UV`(M0%(N"!(````T````!B8($
+M@```@8G$+````````;@!````PU575E.#[!2+;"0H:/\?``!5Z/S___^#Q!`[
+M1"0D<Q''A=@L``#_____N`````#K0(MU%(N>%(```('C__\`X(/L"/]T)"Q5
+MZ/S____!X!`E``#_'PG#B9X4@```@\00BT0D)(F%V"P``+@!````B?:#Q`Q;
+M7E]=PX/L%(M4)!B+0A2+@!2````E``#_'\'H$%!2Z/S___^#Q!S#D+@!````
+MPXGVPXUV`+@`````PXGVPXUV`,.-=@"+1"0$BT`4BX`<G```)?\```##D(M$
+M)`2+0!2+@%B```"#X`?#C78`BT0D!(M0%(M$)`B#X`>)@EB```##C78`BT0D
+M!(N`J"P``,.0@^P,BU0D$(M,)!2+@C00``"%P'4+B8JH+```L`'K#Y"#[`10
+M45+H_/___X/$$(/$#,.)]H/L#(M$)!2+5"08@_@!=12#^@%V![`-@_H%=1JX
+M`````.L3D/]T)!Q24/]T)!SH_/___X/$$(/$#,.)]H/L#(M$)!"+3"04BU0D
+M'(/Y"W4<@^(&B9#X`0``BT`4B9!(@```N`$```#K&8UV`(/L#/]T)"Q2_W0D
+M+%%0Z/S___^#Q""#Q`S#B?:#[!3_="0L_W0D+/]T)"S_="0L_W0D+/]T)"SH
+M_/___X7`#Y7`#[;`@\0LPU93@^P$BW0D$(-\)!0`='"+5A2+@@1````E___\
+M_XF"!$```(/L#&H*Z/S___^["@```(/$$(GVBT84BX`00```J0```0!T*8/L
+M#&C(````Z/S___^+5A2+@@1````E___\_XF"!$```(/$$$MUR>L'A=MU"XUV
+M`+@`````ZQJ0BU84BX($@```)?__^_^)@@2```"X`0```(/$!%M>PY"+3"0$
+MBU$4BX($@```#0``!`")@@2```"#?"0(`'04BU$4BX($0```)?___/^)@@1`
+M``##BTPD!(M1%(N"!(````T```0`B8($@```@WPD"`!T%(M1%(N"!$```"7_
+M__S_B8($0```PU=64XM$)!"+7"04BU0D&(G&OP$```"#^P%T(8/[`7((@_L"
+M="/K+9"#[`A24.C&_O__B<>#Q!#K(XUV`%)0Z%7___^#Q`CK%%)0Z'W___^#
+MQ`CK"+@`````ZPF0B9ZD+```B?A;7E_#BT0D!(M`%(N`!$```"4```,`P>@0
+MPY"04X/L"(M$)!2#^`)T)X/X`G<*@_@!=`WK(XUV`(/X!'0+ZQF0NP````#K
+M&9"[`````.L1D+L`````ZPF0N`````#K$Y"#[`A3_W0D'.C\____B=B#Q!"#
+MQ`A;PY"+1"0$BT`4BT`,PY"+1"0$BU`4BT0D"(E"#,.0BT0D!(M`%,=`"`0`
+M``##D(/L#(M4)!"+0A3'0`@@````:@!J!&H(4NC\____A<`/E<`/ML"#Q!S#
+MC78`BT0D!(M0%(N"2(```(/@WXF"2(```,.0BT0D!(M0%(N"2(```(/(((F"
+M2(```,.0BTPD!(M1%(M$)`B)@D"```"+412+1"0,B8)$@```PY!3BU0D"(M,
+M)`RX`````(/Y/W="@_D?=B"+4A2+FD2```"#Z2"X_O___]/`(=B)@D2```#K
+M&XUV`(M2%(N:0(```+C^____T\`AV(F"0(```+@!````6\.04XM4)`B+3"0,
+MN`````"#^3]W0H/Y'W8@BU(4BYI$@```@^D@N`$```#3X`G8B8)$@```ZQN-
+M=@"+4A2+FD"```"X`0```-/@"=B)@D"```"X`0```%O#D(M$)`2+0!2+@#R`
+M``##B?:+1"0$BU`4BT0D"(F"/(```,.)]HM4)`R+3"0(QT$(`````(G0)?\/
+M``")00RX`````#E1#'4A]D0D$"!T!X%)#``@``#'010`````QT$0`````+@!
+M````PXUV`%.+3"0@BU0D#(M$)!2[#P```/9"%`$/A,4```#V0!0!=1F+1"0(
+MBT`4BT`,NP\````[1"00#X2F````9HM"$"7_#P``9HD!BT(4)0"`_P_!Z`]F
+MB4$"QD$$`(M"%*@"=2NH!'0'QD$$`>LAD/9"%!!T!H!)!`CK%(!)!`*+0A0E
+MX````,'H!8A!!8GVBT(0)0``^`?!Z!.(00:+0A3VQ`%T#B4`?@``P>@)B$$'
+MZP60QD$'_XM"$"4`@`<`P>@/B$$(BT(0)0```#C!Z!N(00F+0A#!Z`R#X`&(
+M00J[`````(G86\.0D)!55U93@^QLBZPD@````(EL)"1FQT0D%@``9L=$)!0`
+M`,=$)!``````QT0D#`````"+E"2(````#[="`HG"P>H'P>@(,="Z#````*@!
+M#X1N"```BXPDB`````^W00*)PL'J!L'H!3'0N@P```"H`0^$3`@``(/L"/^T
+M))````!5Z/S___^)1"0P@\00N@P```"%P`^$*`@``(.\)(0````&="J#O"2$
+M````!G<,@[PDA`````%W#.L4@[PDA`````AT"KH,````Z?0'``"#O"2,````
+M`'1SBT44BYA,@```B5PD$(N04(```(E4)`R#O<P!```#=@R+@$`1``")1"0P
+MZR"^`````(M5%(T$M0````"+A`)`$0``B42T,$:#_@EVZ(M,)"#V000"=02`
+M803^BUPD(&:+0P*+E"2(````9HE"`HI#!(A"!(M%%(N`6(```(E$)`B%P'4(
+MQT0D"`$```"+512+@@2````E`````HE$)!B+@A!````E8`#^`(E$)!R+BA1`
+M``")3"0LBY(80```B50D*(/L"(N<))`````/MT,"4%7H_/___X/$$+H#````
+MA<`/A`0'``"+E"2(````#[="`B7P`0``/<````!T4#W`````?PD]H````'0R
+MZTX]0`$``'0)/5`!``!T$NL^9L=$)!8!`&;'1"04`0#K+F;'1"06`@!FQT0D
+M%`$`ZQYFQT0D%@,`9L=$)!0"`.L.9L=$)!8$`&;'1"04`@"#O<P!```#=@^+
+M113'@`"8```'````ZPV+113'@`"8``!'````@[W,`0```P^&X@```(N,)(@`
+M``"`>0(`#XFG````BUPD)&:!NVP0````,`^&E````/9!`B!T%`^WNV@1```/
+MMX-L$0``B40D!.L6BU0D)`^WNFH1```/MXIN$0``B4PD!(/L"&H#5^C\____
+MB<>#Q`AJ`_]T)!#H_/___XE$)!0/MUPD)+DL0P``BQ29@.(_B?C!X`8EP```
+M``G"B129OCA#``"+#)Z#X?")^L'J`H/B`8M$)!31X(/@#@G""=&)#)Z#Q!"^
+M`````+\`0@``#[=<)!2-!':+312+%(4`0@```=B+!(>)!!%&@_X;=N6#[`C_
+MM"20````5>C_#```O@````"#Q!"_("@```^W7"06D(T$MHM-%(L4A2`H```!
+MV(L$AXD$$4:#_B)VY;X`````OT`P```/MUPD%(GVC01VBTT4BQ2%0#````'8
+MBP2'B0011H/^/W;EO@````"[X"H``+_D*@``B?:+#/.#O"2,`````'0-C8$`
+M@/__/?\/``!V"8M5%(L$]XD$"D:!_JH```!VU(.]S`$```-W1(M5%(N*'(``
+M`(G()?__#P`-``#0`8F"'(```(M%%,=`7`````"+113'@'B8```(````BU44
+MBX)(@```@,P$B8)(@```@[PDC`````!T5(M%%(M<)!")F$R```"+112+5"0,
+MB9!0@```O@````"#O<P!```#=A&+512+1"0PB8)`$0``ZQV)]HT,M0````"+
+M512+1+0PB80*0!$``$:#_@EVY8M-%(M<)"0/MI,H*@``#[:#*2H``,'@"`G"
+M#[:#*BH``,'@$`G"#[:#*RH``,'@&`G"B9$`@```BTT4#[:3+2H``,'B"`^V
+M@RPJ```)T`M$)!B)@02```"#[`C_M"2,````5>@M(P``BU44BX(00```"T0D
+M+(F"$$```(/$$(M%%(M4)"R)D!1```"+112+3"0HB8@80```BT44BUPD"(F8
+M6(```(M-%(M$)"0/MI`N*@``#[:`+RH``,'@"`G"BUPD)`^V@S`J``#!X!`)
+MP@^V@S$J``#!X!@)PHF1"(```(M-%`^VDS,J``#!X@@/MH,R*@``"=")@0R`
+M``"+512+@\PL``")@AB```"+113'@(````#_____@[W,`0``!'469H.]T`$`
+M``%W#(M5%(M"%(#,!(E"%(/L"/^T))````!5Z/S___^#Q!"Z`P```(7`#X31
+M`@``@[PDA`````9T)XN%!`(``*@#=!V+312+D429``"!XO___]^#X`'!X!T)
+MPHF11)D``(/L"/^T))````!5Z,0.``"#Q`C_="0H5>A[!@``@\00N@,```"%
+MP`^$<P(``&:!O<@!```;\74:BX0DB````(!X`@!Y#8M%%,>`"-@```(%``"+
+M113'@!R8```!````BT44BX`4F0``B<&!X?\_``"+E"2(````]D("('05C12-
+M`````+BCBRZZ]^*)T,'H!.L,N,W,S,SWX8G0P>@#@^P,@\!D4.C\____BU44
+MBX)@F```@\@!B8)@F```@\00:@!J`6A@F```5>C\____@\0(_W0D*%7H_/__
+M_X/$$(7`=1R+C"2(````]D$"('4%9H-)`@*Z`P```.FB`0``BUPD)(.[K"P`
+M``!T%XM%%,>`()D```#P`0#'@[`L```!````NP````"^`0```(T\G0````"+
+M512)\(C9T^")A#H`$```0X/["7[CNP````"#[`A35>C\____@\000X/["7[M
+MBT44QX"D`````0`!`(M%%,>`J`````$```"+113'@*P````!````BU44BX*P
+M$```B8*P$```BT44QX"@````90D(`(M<)"3'@S0J``!E"0@`BU44BX*L````
+M#0``!P")@JP```"#O"2$````!G4<BU44BX*@````@,P0B8*@````@8LT*@``
+M`!```(.]3!````!T#(/L#%7H_/___X/$$(M5%(N"((```"7__W_^B8(@@```
+MBT0D)(.XT"P``/]T$H/L"/^PT"P``%7H_/___X/$$(M4)"2#NM0L``#_=!*#
+M[`C_LM0L``!5Z/S___^#Q!"+3"0D@[G8+```_W02@^P(_['8+```5>C\____
+M@\00@[WX`0```'0/BU44BX7X`0``B8)(@```BYPDA````(F=W`$``+@!````
+MZQ6)]HN$))````"#.`!T`HD0N`````"#Q&Q;7E]=PY"#[!1J`O]T)!SH;@,`
+M`(/$',.)]E.#[`R+7"04:@%J`%/H_/___X/$$+H`````A<!T+H/L"&H34^@_
+M`P``@\00N@````"%P'07@^P,:#0(``#H_/___[H!````@\00B?:)T(/$"%O#
+MD%93@^P(BUPD%(MT)!AJ`6H`4^C\____@\00N@````"%P`^$B0$``(GP)?`!
+M```]P`````^$AP```#W`````?Q0]H````'0[/;````!T-.D-`0``D#U``0``
+M#X2H````/4`!``!_##W0````=%/I[@```#U0`0``#X2*````Z=X```"+0Q3'
+M@`28````````BT,4QX``H@```P```(M#%,>`?)@``!D```"#[`QH+`$``.C\
+M____@\00Z:(```")]HM#%,>`!)@```````!F@[O(`0``$@^%A0```(M#%,>`
+M?)@``!@```"#[`QH+`$``.C\____BT,4QX``H@```@```(/$$.M9]\80````
+M=`^+0Q3'@`28```#````ZPV+0Q3'@`28````````9H.[R`$``!)U*XM#%,>`
+M?)@``!@```"#[`QH+`$``.C\____BT,4QX``H@```````(/$$)"#[`AJ$U/H
+MJ0$``(/$$+H`````A<!T.8/L#&@T"```Z/S___^#Q`QJ`6H`4^C\____@\00
+MN@````"%P'03@^P(:@!3Z&P!``")PH/$$(UV`(G0@\0$6U[#55=64X/L)(M\
+M)#B)_O]T)#Q7Z/S___^)PX/$$+@`````A=L/A"L!``"#O[`L````#X2.````
+MBT<4BX`@F0``J0```0!U?L>'L"P```````"+;Q2+A1"<``")1"04BX44G```
+MBY48G```B50D&(M4)!31ZHG!T>D!RHG!P>D&P>H'B50D#'0]A<ET.8M$)!CW
+MV)GW?"0,@^`_B40D$(M$)!29]_F)P8/A'XM$)!#!X`6+E2"9```)T`G(@,P(
+MB84@F0``D(/L"%-7Z#H#``"#Q!"%P'43BU0D-&:#2@("9H-C`OWK;XUV`(/L
+M"%-7Z/S___^#Q!"%P'4W@^P,:(@3``#H_/___X/$"%-7Z/S___^#Q!"%P'49
+MBT0D-/9``B!U!6:#2`("N`````#K)XUV`(/L#%?HOQD``(/$$(.^L"P````/
+ME,(/MM*+1"0XB1"X`0```(/$'%M>7UW#5U93BWPD$(MT)!2)\(7V=06X____
+M_XG#BT<4BU`,B;``0```@^P,:@_H_/___X/F`X/C`U93:`!```!7Z/S___^)
+MPH/$(/?&`0```'4*BT<4QT`4`````(G06UY?PXGV55=64X/L$(ML)"@/MT4"
+M4`^W10!0_W0D+.C\____@\00O@````"`?0(`>3P/O_B-''_!XP*-NR0T``"#
+M[`AJ"/]W!.C\____B<:!YO\```#!Y@6+@R0T``#!X`0)QF:+1PB#Q!"-=@!F
+M/9``?P2H`70B@^P(:@B8@^@84.C\____B<.!X_\```"X`0```(/$$.LID(/L
+M"&H(F(/H&(G"P>H?`=#1^%#H_/___XG#@>/_````N`````"#Q!#!XP+1X`G#
+M@<L!!```BT0D((M(%(GP)?\```#!X`@/MM,)T(F!G)@``(M$)""+2!2)\"4`
+M_P``#[;7"=")@="8``"+1"0@B:@T$```N`$```"#Q`Q;7E]=PXUV`(M$)`2+
+M0!2+@&28``#!Z!,E_P$``/;$`70%-0#^__^8PXUV`%=64XM\)!"*7"04BT\4
+MBY%DF```@>(`\/__B=C!X`DE``X```G"#[]$)!@E_P$```G"B9%DF```BU<4
+MBX)@F```@\@"B8)@F```OC@```"$VW01#[;SC03U`````"GPB<;!Y@F[````
+M`(UV`(M'%(N`8)@``*@"=!2#[`Q6Z/S___^#Q!!#@_L[?N'K!8/[.WX'N```
+M``#K"E?H/?___YB#Q`1;7E_#D(M,)`R+5"0$BT0D"`^W0`(EX`$``#W`````
+M=#`]P````'\)/:````!T%NLL/4`!``!U)6:+@L@0``!FB0'K(9!FBX+*$```
+M9HD!ZQ1FBX+,$```9HD!ZPBX`````,.)]K@!````PXGV5E.#[`2+7"00BW0D
+M%(U$)`)05E/H?____X/$#+H`````A<!T+XM#%(N`8)@``%/HF/[__X/$!&8[
+M1"0"?@5F@TX"`F:)1A9F.T0D`@^>P`^VT(GVB="#Q`1;7L-75E.#[!"+7"0@
+MBW0D)(.[S`$```-W:8/L"%93Z/S___^#Q!"%P'18C40D#E!64^@(____@\0,
+MN@````"%P'17OP````"#[`1J``^VAV@U``!04^@\_O__@\009CM$)`Y^"&;'
+M1A8``.L$9HE&%D>#_P)VT8/_`P^6P`^VT.L8D(M3%(N"8)@``(/(`HF"8)@`
+M`+H!````B="#Q!!;7E_#4[H`````BT0D#&:+`(G!9CL%@#4``'</N(`U``"-
+M=@!"9CL,D';Y9HL<E8(U```/O].-!)*-!(*-!(*)P<'A"`'(`=#!Z!!FP?L/
+M9BG8F%O#C78`55=64X/L/(M4)%2+1"10B40D+(!Z`@`/F<!F#[;`9HE$)`BX
+M`@```&8K1"0(9HE$)`@/MT(")>`!```]P`````^$Q@$``#W`````?Q`]H```
+M``^$9P$``.G\`0``/4`!```/A?$!``!FBP(MH0\``&8]Z@1W)8M4)"QFBY)0
+M$0``9HE4)`R+="0L9HNV4A$``&:)="0*Z9<```!FBP(MC!0``&8][P!W(HM$
+M)"QFBX!4$0``9HE$)`R+5"0L9HN25A$``&:)5"0*ZV=FBP(M?!4``&8]X`!W
+M(HMT)"QFB[98$0``9HET)`R+1"0L9HN`6A$``&:)1"0*ZS=F@3I<%G8BBU0D
+M+&:+DEP1``!FB50D#(MT)"QFB[9>$0``9HET)`KK#F;'1"0*``!FQT0D#```
+MBT0D+&:+J-00``!FBY#:$```9HE4)!!F@[C:$`````^4P&8/ML!FB40D#@^W
+M3"0(NYQ#``"+%(N!XO___^^+="0L#[>&R!$``,'@'`G"B12+NZA#``"+%(N!
+MXO____L/MX;*$0``P>`:"<*)%(N[7$0``(L4BX/B]P^WAL81``#!X`,)PHD4
+MB^FD````BT0D+&:+@&`1``!FB40D#(M4)"QFBY)B$0``9HE4)`J+="0L9HNN
+MUA```&:+AMP0``!FB40D$&:#OMP0````#Y3`9@^VP&:)1"0.ZU>+5"0L9HN2
+M9!$``&:)5"0,BW0D+&:+MF81``!FB70D"HM$)"QFBZC8$```9HN0WA```&:)
+M5"009H.XWA`````/E,!F#[;`9HE$)`[K"K@`````Z1,!```/MW0D"+_D0P``
+MBQRW@.,_@^P(:@0/M^U5Z/S____!X`</MU0D'L'B!@G0)<`````)PXD<M[_P
+M0P``BQRW@^/X@\0(:@15Z/S____1Z(/@!PG#B1RW@.-_@\0(:@,/MVPD&%7H
+M_/___\'@!R6`````"<.)'+>__$,``(L<MX/C_(/$"&H#5>C\____T>B#X`,)
+MPXD<MX/CXX/$"&H##[=$)!90Z/S____!X`*#X!P)PXD<M[DL1```BQ2Q@^+W
+MBT0D(,'@`X/@"`G"B12QNP````"#Q!"_8$,```^W="0(B?:-!%N+5"10BTH4
+MBQ2%8$,```'PBP2'B0010X/[&';ABW0D+,>&O"P```````"X`0```(/$/%M>
+M7UW#B?955U93BWPD%(ML)!B)^XM$)!P/MT`")>`!```]P````'0J/<````!_
+M"SV@````=!3K(HGVO@`````]0`$``'0@ZQ*)]KX!````ZQ60O@(```#K#9"X
+M`````.F[````B?8/MXQSYA````^WA'/L$```P>`&"<$/MX1S\A```,'@#`G!
+M#[>$<_@0``#!X!()P0^WA'/^$```P>`8"<$/MY1S!!$```^WA',*$0``P>`&
+M"<(/MX1S$!$``,'@#`G"#[>$<Q81``#!X!()P@^WA',<$0``P>`8"<*#_0%T
+M#X/]`7(:@_T"=`GK"XUV`(G*ZPR)T>L(N`````#K'I")JZ@L``"+1Q2)B&"9
+M``"+1Q2)D&29``"X`0```%M>7UW#B?955U93BWPD%(G^BU0D&`^W0@(EX`$`
+M`#W`````=$H]P````'\+/:````!T-.M"B?8]0`$``'4YO0````"+3Q2+D429
+M``"#XL</MX?,$0``P>`#@^`X"<*)D429``#K'9"]`0```.L5D+T"````ZPV0
+MN`````#ITP$``(GV@[_,`0```W<7BU<4BX(0F0``@\@#B8(0F0``ZU.-=@"+
+M3Q2+@1"9```E!OS__P^WE&[@$```P>($"="#R`&)@1"9``#_="08_[:H+```
+M5^C\____BU<4#[^$;L@0```E_P$``(#,`HF":)D``(/$#(M/%(N11)@``('B
+M?\#__P^WA&Z>$```P>`')8`_```)PHF11)@``(M/%(N12)@``('B_P_\_P^W
+MA&ZD$```P>`,)0#P`P`)PHF12)@``(M/%(N14)@``('B``#__P^^A#7%$```
+MP>`()0#_```)P@^VA#7"$```"<*)D5"8``"+7Q0/MY1NMA```(G0P>`8P>(0
+M"=`/MXQNO!```(G*P>(("=`)R(F#-)@``(M/%(N1*)@``##V#[>$;JH0``#!
+MX`@)PHF1*)@``(M/%(N19)@``('B_P_X_P^WA&ZP$```P>`,)0#P!P`)PHF1
+M9)@``+L"````9H&^;!````(P=QQF@;_*`0``(A!U-8M$)!CV0`)`="NS".LG
+MC78`BU0D&&:+`H/@'P^WP(7`=!.#Z`J#^`QV"P^WA&XB$0```<.0BT\4BY$D
+MF0``@.(!C00;)?<````)PHF1))D``+@!````6UY?7<.)]HM,)`2+5"0(B="#
+M^C]V!;@_````9HF!_`$``(M!%(F0/)D``+@!````PXGV55=64X/L+(M\)$2+
+M7"1`#[='`B7@`0``/<````!T5CW`````?PX]H````'1[Z:H```")]CU``0``
+M#X6=````9HN#XA$``&:)1"04C8/.$0``B40D$(V#Y!$``(E$)!@/MX-&%0``
+MB40D"(VK2!4``.F#````9HN#[!,``&:)1"04C8/N$P``B40D$(V##A0``(E$
+M)!@/MX.8%0``B40D"(VKFA4``.M09HN#[!,``&:)1"04C8/T$P``B40D$(V#
+MJA0``(E$)!@/MX.X%0``B40D"(VKNA4``.L=D+@`````Z98```")T,'@!HV<
+M&-`5``")7"0,ZV2#[`0/MP=0C40D&%#_="1,Z'<```#'1"0<`````(/$"%?_
+M="1,Z/S___^)QKH`````@\009H.[<!$```!T)@^WBW`1``"-=@!F@[Q3<A$`
+M``!T#`^WA%-R$0``.?!TCT(YT7_D@^P,5P^W1"084%7_="0D_W0D7.A4`P``
+MN`$```"#Q""#Q"Q;7E]=PU575E.#[#2+7"109L=$)"X``&;'1"0L/P!H"`$`
+M`&@`````Z/S___^#Q`AH@````&@@`0``Z/S___^]B````+\!````O@````"#
+MQ!`/M\9FB;P`"````$=&9H/_/W;M9HDU!@```&;'!0(````!`&;'!00````_
+M`+X`````9H,]!@````!V+@^W^P^WWH/L!/]T)$@/MX0;"````%!7Z*D'``!F
+MB41=`(/$$$9F.34&````=]5FBTT`#[<%!@```&:+7$7^O@````!F@ST&````
+M`'9V#[?&9CE,10!_"F:+3$4`9HET)":)\/?0B<=F`ST&````=",/M]=FBT15
+M_F8[1%4`?@IFBT15`&:)1%7^1F8Y-08```!WNKX`````9H,]!@````!V(6:+
+M%08````/M\9F.5Q%`'X*9HM<10!FB70D)$9F.?)WY@^_R8/!&;L?A>M1B<CW
+MZXG0P?@$P?D?*<B-!("-!("--`!FQT0D(@``OP`````/O\Z)3"0<B<CWZXE$
+M)!")5"04BT0D%,'X!,'Y'RG(0(7`?CJY(`$``+@?A>M1]VPD'(G3P?L$BT0D
+M')F)V"G0C5`!#[=$)")FBUPD)F:)'$%F_T0D(D</M\<YT'SEOP`````/MP4&
+M````B<)F.71%_@^.V0```(/&,HE4)!AF.715_GY9#[_.B<L/M\>)1"0,#[]$
+M10")RBG"B50D$(M$)`P/OU1%`BG1BT0D$`^OP87`?BI'BU0D&&8Y=%7^?AX/
+MM]</OT15`(G9*<&)R`^_5%4"B=DIT0^OP87`?]:#[`AJ``^WUP^WA!(*````
+MT>`/M\!0#[>$$@@```#1X`^WP%`/MT15`E`/MT15`%`/M\90Z)$'``!`#[=4
+M)$*Y(`$``&;1Z&:)!%&#Q""+7"0D9CG8=@1FB1Q19O]$)"(/MQ4&````9CET
+M5?X/CR?___]F@WPD(C]W)+L@`0``N1X!```/MU0D(F:+!%%FB0139O]$)")F
+M@WPD(C]VYKF`H0``OP````"^(@$``+L@`0``#[?'#[<4AL'B&('*``#_``^W
+M!(/!X`@,_R7__P``"<*+;"1`BT44B10(@\$$1V:#_Q]VS(/$+%M>7UW#55=6
+M4X/L/(MT)%R+1"10B40D&&;'1"06``!FQT0D%```9L=$)!(``&;'1"00``!F
+MQT0D#C\`9L=$)`H``+^@`0``BU0D8`^^0@71X&:)1"0,]D(#`706BTPD4(J!
+MBA```.L49HE<)!+I6`$``(M4)!B*@HL0``"#[`0/OL!0_W0D:/]T)%SH_/__
+M_XA$)!F#Q!"#?"14``^$HP```+L`````B?8/M].+3"149H,\T0!T$&:+!-%F
+MB414($-F@_L'=N*)W8/L#(U$)"I0C40D+%`/M\-0C40D.%"+5"1\#[<"4.C=
+M!@``NP````"#Q"!F.>MS%(M4)!P/M\-F.51$('0&0V8YZW+PBT0D'&8[1"0>
+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
+MM\&-!("-!("-!(4*````.=!S+&:)#V:)30#K9V:+!$YFB0=FBP1.9HE%`.M6
+M9HL$3F:)!V:+1$X"9HE%`.M$N0````!FA=MT.@^WVXUV``^W!$Z-!("-!(#!
+MX`(IT(/`"8/X$G:V#[=$3@*-!("-!("-!(7V____.=!WL4$YRW_.B?9;7E]=
+MPXUV`%=64XM$)!B+?"00BW0D%(M0"+D`````#[=`!(G#@_@`?@^)]F8Y,G0(
+M@\(T03G+?_/_="0@_W0D(`^W0@90C4((4`^WQU#HU?[__X/$%%M>7\.)]HM$
+M)`2-B`PJ``"+%>0U``")D`PJ``"-!-4`````*="-!(7H-0``B4$8QT$4`0``
+M`,=!#!0```#'01`C````PY!75E.+5"04BT0D$(N`-!```/9``B!T);\`````
+MNQP```"Y0````+YR````QT(,`````,="$'<```#K(Y"_`````+LR````N0``
+M``"^,@```,="#!0```#'0A`C````BU($N``````Y^G($.=IV#3G*<@0Y\G8%
+MN`$```!;7E_#D(M$)`2+2!2+D,`L``#!X@F!X@!^``"`SH")D3"9``#'@+PL
+M```!````PXGV5U93BWPD$(G[C;<,*@``N`````"#?A0`='2#O[PL```!=66+
+M1Q2+@#"9``!FA<!X5\'H&8E&!,>'O"P```````!65^@,____@\0(A<!U.8/L
+M"%97Z#L```"#Q!"%P'0H@^P(5E?H1@```(/$$(7`?A>#[`A65^A)`0``QX>\
+M+````@```(/$$(N#O"P``%M>7\.)]HM,)`BX`````(M1!#M1#'8%.U$0<@6X
+M`0```,-64XM<)!"Z_____X-[%``/A/<```"+`XT4Q0`````IPHT4E>@U``")
+M4QB+0P0[0Q!R8KK_____@SL`#X3,````BT,$B4,(.T,0<D&#.P!T/(L#2(D#
+MC13%`````"G"P>("BTL8BX+P-0``*T$(T>"+2P@IP8E+"('"Z#4``(E3&#M+
+M$'('@SL`=<:)]KH!````ZWF0BT,$N@`````[0PQW:Z'@-0``2+K^____.0-T
+M7(M#!(E#"#M##'=)H>`U``!(.0-S/XG&D(L#0(D#C13%`````"G"P>("BTL8
+MBX+P-0``*T$(T>"+2P@IP8E+"('"Z#4``(E3&#M+#'<'.3-RQXUV`+H"````
+MC78`B=!;7L.-=@"+3"0$BU0D"(-Z%`!T-XM"&&:+`&:)@<P1``"+0AAFBT`"
+M9HF!RA$``(M"&&:+0`1FB8'($0``BT(89HM`!F:)@<81``##B?93BUPD"(M4
+M)`R)V8M#%(N`!(```"7__P``@_H!=$:#^@%_"872="?K3XUV`(/Z!G0'@_H(
+M="[K0(M3%`N#Q"P```T``($`B8($@```ZRJ+4Q0+@\0L```-``!"`(F"!(``
+M`.L4BU,4"X'$+```#0``(`")@@2```!;PXGVBT0D!/^PW`$``%#H=/___X/$
+M",-75E.+?"00@^P,5^C\____B<:#Q`@E____?U!7Z/S___^+1Q2+4#")TX'C
+M\`,``,'K!(/$$(-\)!0`=!"X)0```"G8T>@!P^L?C78`@_L!=@-+ZQ2#[`A6
+M5^C\____N`````"#Q!#K*HM/%('B#_S__XG8P>`$)?`#```)PHE1,(/L"%97
+MZ/S___^X`0```(/$$%M>7\.)]E.#[`B+7"00BU0D%+@`````@_H)?QZ#[`3_
+M="0<C012C02`C82#3"H``%!3Z/S___^#Q!"#Q`A;PXUV`%.#[`B+7"00BU0D
+M%+@`````@_H)?QZ#[`2-!%*-!("-A(-,*@``4/]T)"!3Z/S___^#Q!"#Q`A;
+MPXUV`%575E.#[`R+;"0@BW0D)(GJ@_X"=!:#_@)W"8/^`70<ZS*)]H/^`W0+
+MZRF0OPD```#K*9"_"````.LAD+\`````N`````"#O5`J````=7SK"XUV`+C_
+M____ZW"0C01_C02`C9R"3"H``+C_____@WL$`'57@^P(:CQ3Z/S___^)<P2#
+MQ!"#?"0H`'4LQT,,"P```,=#%`(```#'0QC_____QT,<_P,``&;'0R`*`&;'
+M0R(*`.L3B?:#[`3_="0L5U7H_/___X/$$(GX@\0,6UY?7<.04XM,)`B+612+
+MD3@J``"!XO\#``"+@4`J``#!X!`E``#_`PG"B9.D````BUD4BY$\*@``@>+_
+M`P``BX%$*@``P>`0)0``_P,)PHF3J````(M9%(N#K````"4`_/__BY%(*@``
+M@>+_`P``"=")@ZP```!;PY!64XMT)`R+3"00N`````"#^0EW5(T$28T$@(V<
+MADPJ``"X`````(-[!`!T/,=#!`````"X_O___]/`(88X*@``(88\*@``(89`
+M*@``(89$*@``(89(*@``4U;H+?___[@!````@\0(D%M>PY!55U93BWPD&(ML
+M)!2+E300``"X`````(/_"0^'U`,``(T$?XT$@(VTA4PJ``"X`0```(-^!``/
+MA+@#``"#?AC_=3:%TG05#[="`B6@````NA\````]H````'0%N@\```"X`0``
+M`#G0<Q*-=@#1X(/(`3G0<O?K!)"+1AB-'+T`````BU0D%(M*%(G"@>+_`P``
+MBT8<P>`*)0#\#P`)PHM&%,'@%"4``/`/"<*)E!E`$```BT0D%(M(%`^W1B+!
+MX`0E\`````^W5B"#X@\)T`T`(`@`B809@!```(M4)!2+0A3'A!C`"0````@`
+M`(.ZS`$```-W#HM"%,>$&``1```````!@WXD`'1.C0R]`````(M$)!2+6!2+
+M5B2!XO___P"+1BC!X!@)PHF4"\`(``"+5"04BUH4BX0+P`D``(G"@\H!@WXH
+M`'0(B<*!R@$!``")E`O`"0``@WXP`'0BC0R]`````(M$)!2+4!2+1C`E____
+M``T````!B80*``D``(-^+`!T0XT,O0````"+1"04BU`4BT8L)?__#P`-```0
+M`(F$"L`0``#V1@P@=!N+1"04BU`4BX0*P`D``(#,`HF$"L`)``"-=@#V1@X!
+M="&-#+T`````BT0D%(M0%(N$"@`1```-```@`(F$"@`1``#V1@Z`=!^-#+T`
+M````BT0D%(M0%(N$"@`1``"`S`*)A`H`$0``BT8$@_@"=`J#^`-T4>G*````
+MC0R]`````(M$)!2+4!2+A`K`"0``#**)A`K`"0``BU0D%(.ZS`$```09VX'C
+M`````8'#```E`(G*BTPD%(M!%(F<$``1``#I?@```(T,O0````"+1"04BU`4
+MBX0*P`D```UB`@``B80*P`D``*$`````*P4`````BY7(+```B=,IPRL=````
+M`,'C"HM$)!2+4!2)V`T````!B80*``D``(M4)!2#NLP!```$&=N!XP````&!
+MPP``!`")RHM,)!2+012)G!#`"0``D/9&.`%T(8T,O0````"+1"04BU`4BX0*
+M`!$```T``"0`B80*`!$``/9&#`%T$[@!````B?G3X`F%."H``.L1B?:X_O__
+M_XGYT\`AA3@J``#V1@P!=!.X`0```(GYT^`)A3PJ``#K$8GVN/[___^)^=/`
+M(84\*@``]D8,`G03N`$```")^=/@"85`*@``ZQ&)]KC^____B?G3P"&%0"H`
+M`/9&#`1T$[@!````B?G3X`F%1"H``.L1B?:X_O___XGYT\`AA40J``#V1@P(
+M=!.X`0```(GYT^`)A4@J``#K$8GVN/[___^)^=/`(85(*@``5O]T)!CH-_O_
+M_[@!````@\0(C78`6UY?7<.-=@"+1"0(P>`"BU0D!(M2%(N$`@`(``##B?:+
+M5"0(P>("BT0D!(M(%(M$)`R)A!$`"```N`$```##D(M,)`B+1"0$BU`4N`$`
+M``#3X(F"0`@``+@!````PXGV5E.+5"00P>("BT0D#(MP%(N$%@`*``")PX/C
+M`W4:N`$```"*3"00T^"+ED`(``"%PG0%NP$```")V%M>PXUV`%=64XM\)!"+
+M="04BU<4N`$```")\=/@B8*`"```NP````")]E97Z/S___^#Q`B%P'06@^P,
+M:@KH_/___X/$$$.!^P\G``!^W(M'%,>`@`@```````"!^P\G```/GL`/ML!;
+M7E_#C78`5E.+="0LBUPD-(M,)!"+1"04)?\/``"+5"0DP>(2"="+5"0PP>(9
+M"=#VPP%T!0T````!]L,0=`4-````(/;#!'0%#0``0`#VPR!T!0T``(``B4$(
+MBT0D'(G"P>(:]L,"=`:!R@``@`")40R#_O]T%HGPP>`-)0#@#P`)T(E!#(%)
+M"````$"X`0```%M>PXGVN`````##B?:+1"0(@4@(````(,-3BTPD$(M<)!B+
+M5"0,@WPD%`!T%(M"#`G(A=MU`X#,$(E"#.LGC78`A=MT$(M$)!R+0`B)0@B)
+M2@SK$9#'0@@`````B<B`S!")0@R0QT(4`````,="$`````"X`0```%O#C78`
+M4XM,)!"+5"0,N`\```#V0A0!#X2D````BT(4)?X?``#1Z&:)`0^W0A)FB4$"
+MQD$$`(M"$*@!=1RH`G0$QD$$`?9"$`AT!(!)!`+V0A`$=`2`200$BT(()0``
+M/`#!Z!*(006+0A0E`.`?`,'H#8A!!HM"$"4`#P``B</!ZPB(60>+0A`E\```
+M`,'H!(A!"(M"$"4`\```P>@,B$$)QD$*`,9!"P"$VW0&C4,!B$$'@'D(`'0#
+M_D$(N`````!;PXGVPY"0D(M4)`2+3"0(@(JX+```"(!)!`AFBX*V+```9HD!
+MBH*X+```B$$$BH*Y+```B$$%N`````##D)"0BU0D!(M"%,>`@$````#\2)*+
+M0A3'@(!````D29(DBT(4QX"`0```.0``*(M"%,>`@$```"0(%E.+0A3'@(!`
+M``!Y!9CEBT(4QX"`0```_^\=`(M"%,>`@$```$"^JAJ+0A3'@(!```!451"^
+MBT(4QX"`0```!S`.`(M"%,>`A$````````##D(/L#(M,)!"+013'@-"8```6
+M'```N@````"-=@"+013'@("8``````$`0H/Z!W[MBT$4BX``G```P>@8B<+!
+MZ@2#X`_!X`0)T(/L"&H(4.C\____@\0<PY!55U93@>R<````BZPDL````(GK
+MC7PD<+YX1P``_+D%````\Z6-?"10OHQ'``"Q!?.EC7PD,+Z@1P``L07SI8U\
+M)!"^M$<``+$%\Z6Z`````(M$E'")A),D1```BT244(F$DSA$``"+1)0PB823
+M3$0``(M$E!")A)-@1```0H/Z!'[.@^P(:@%5Z/S___^!Q*P```!;7E]=PXM$
+M)`C1X`-$)`R+5"0$#[>$0OH3``##D%93@^P(BUPD%(MT)!AH;!```&@`-P``
+M4^C\____BT0D*(E##(M$)"R)0Q"+1"0PB4,49HFSR`$``&;'@\H!`````&;'
+M@_P!```_`,>#``(```````#'@[@M````````QX.\+0```````,>#R"T`````
+M``C'@]`M``"!!P``QX/8+0```````,>#W"T``#\_/P#'@^`M``!D````QX/D
+M+0```@```,>#]"T``/_____'@_@M``#_____QX/\+0``_____X/$#&H&:,A'
+M``"-@S@J``!0Z/S____&@P`N````@\046U[#B?93BDPD"(I<)`RZ`````(GV
+MC012.(C.1P``=1DXF,]'``!W$3B8T$<``'()N`$```#K#8GV0H/Z`W;6N```
+M``!;PXUV`%575E.#["B+;"1,BUPD/&B@1```Z/S___^)QH/$$(7`=1+'10`"
+M````N`````#I&0<``)"#[`A5_W0D2/]T)$C_="1(#[?#4%;H_/___XGS@\0<
+M:@%J`%;H_/___X/$$(7`=1#'1"04`P```.F[!@``C78`BT84BX`@0```#[;0
+MB=#!Z`2)ALP!``")T(/@#V:)AM`!```/ML!0#[:&S`$``%#H%/___X/$"(7`
+M=0W'1"04#0```.EP!@``@^P(:@!6Z/S___^#Q!"%P'4.QT0D%`,```#I408`
+M`)"+1A2+@!B8``!FB8;2`0``@[[,`0``"703@[[,`0``"G469H.^T`$```-W
+M#%/H-OS__X/$!(UV`(/L#%/H_/___X/$$(7`=1#'1"04#@```.G[!0``C78`
+M@[O,`0``!'82BU,4BX(00```@,P0B8(00```BT,4QX``F```!P```(/L#%/H
+M_/___V:)@]0!``"#Q!`/M\`E\````(/X,`^$L````(/X,'\4@_@0#X2B````
+M@_@@#X29````ZR"#^&`/A(X```"#^&!_"X/X4`^$@````.L'/:````!T=V:#
+MN]0!````=6V#N\P!```%=1B!N]`!```)`$,`=0QFQX/4`0``1@#K39"#N\P!
+M```'=`F#N\P!```+=0MFQX/4`0``40#K+X.[S`$```IT'(.[S`$```ET$X.[
+MS`$```IU'6:#N]`!```#=PIFQX/4`0``8@"0@[O,`0``"G1+@[O,`0``"71"
+M@[O,`0``"G4*9H.[T`$```-V+P^WD]0!``")T"7P````@^@P@_@_=QF)T(/@
+M#X/X!'\/QT0D%`T```#IJ@0``(GV@^P$C40D'E!HP0```%/H_/___X/$$(7`
+M=0['1"04"````.F!!```D&:!?"0:`3!W#<=$)!0%````Z6H$``!FBT0D&F:)
+MAFP0``"+0Q2+D!!```"#XAC!Z@.#^@)T.X/Z`W4-QT0D%`H```#I.`0``(.[
+MS`$```ET((.[S`$```IU"F:#N]`!```#=@W'1"04"@```.D/!```@^P$C40D
+M'E!J/U/H_/___X/$$(7`=0W'1"04"````.GK`P``9HM$)!IFB89N$```@^P$
+MC40D'E!J'%/H_/___X/$$(7`=0W'1"04"````.F[`P``QT0D#$`#``!F@WPD
+M&@!T1@^W1"0:)?#_``#!X`R)1"0,@^P$C40D'E!J&U/H_/___X/$$(7`=0W'
+M1"04"````.EV`P``#[=$)!H)1"0,@6PD#,````#'1"00`````+\`````BT0D
+M##G'<S"#[`2-1"0>4(V'P````%!3Z/S___^#Q!"%P`^$*`,```^W1"0:,40D
+M$$<[?"0,<M"!?"00__\``'0-QT0D%`<```#I"0,``&;'AN(1```*`&;'ANP3
+M```#`+\`````C01_C02'9L>$ANH1```+`$>#_PEVZK\`````N6Q'``"Z<D<`
+M`&:+!'EFB81^]!,``&:+!'IFB81^[A,``(T$?XT$AXT$AF;'@+`4```+`&;'
+M@!04```+`$>#_P)VQX/L"(V&;!```%!3Z/S___^#Q!"%P'4-QT0D%`@```#I
+M<`(``&:!OFP0```"4'=)@[O,`0``"G0<@[O,`0``"703@[O,`0``"G4N9H.[
+MT`$```-W)&;'AOP3``!H!F;'A@`4``"P!&;'A@04````@&;'AOH3````@&:#
+MOH80````='8/MX/4`0``)?````"#^!!U98M#%,>``)@```=```"#[`QHT`<`
+M`.C\____B1PDZ/S___]FB8/6`0``BT,4QX``F```!P```,<$)-`'``#H_/__
+M_P^W@]8!```E\````(/$$(/X('0/QT0D%`T```#IG@$``(GV@^P$C40D'E!H
+MOP```%/H_/___X/$$(7`=0W'1"04"````.EU`0``9HM$)!IFB89P$```9HF#
+M"`(``(/L#%/H_/___X/$$(7`=0W'1"04"````.E%`0``@[O,`0``"G0<@[O,
+M`0``"703@[O,`0``"G4=9H.[T`$```-W$X/L"(U$)!Q04^C\____@\00ZUV#
+MN\P!```'=`F#N\P!```+=1.#[`B-1"0<4%/H_/___X/$$.LX#[>#U`$``"7P
+M````@^@P@_@_=Q.#[`B-1"0<4%/H_/___X/$$.L1@^P(C40D'%!3Z/S___^#
+MQ!"%P`^$J````(N&P"H``(F#P`$``(/L#%/H_/___\=$)"``````OP````"#
+MQ!"#[`2-1"0>4+@?````*?A04^C\____@\00A<!T4P^W1"0:`40D$&8/MD0D
+M&XB$?BPJ``!FBT0D&HB$?BTJ``!'@_\"=KN#?"00`'0*@7PD$/W_`@!U"L=$
+M)!0)````ZR.#[`Q3Z!+W__^)V(/$$.LSQT0D%`@```#K"9#'1"04"````(7V
+M=`R#[`Q6Z/S___^#Q!"%[70'BT0D%(E%`+@`````@\0<6UY?7<-3@^P4BUPD
+M'%/H_/___X/$$(.[I"H```!T#H/L#%/_DZ0J``"#Q!"0@^P,4^C\____@\0,
+M:@%J`5/H_/___X/$"(V#;!```%!3Z/S___^)'"3H_/___X/$&%O#D%575E.#
+M["R+="1`QT0D"`"```#'1"0,()@``,=$)!!55555QT0D%*JJJJK'1"089F9F
+M9L=$)!R9F9F9OP````"-;"0(C02]`````(L<*(M6%(L4&HD4!+D`````B<C!
+MX!")P@G*BT84B108BT84BP08.=!T![@`````ZV%!@?G_````?M>Y`````(M4
+MC!"+1A2)%!B+1A2+!!@YPG0*N`````#K.(UV`$&#^0-^W(T$O0````"+3A2+
+M%"B+!`2)!!%'@_\!#XYY____@^P,:F3H_/___[@!````@\00@\0L6UY?7<.-
+M=@!3BTPD"(M4)!"+7"04BT0D#/;$`7029L<",Q-FQP/4%[@!````ZS60A,!Y
+M*&:#N880````=0IF@[F($````'049L<""`EFQP.L"K@!````ZPN-=@"X````
+M`(UV`%O#B?955U93@^P,BWPD((G]B7PD!(VWX`$``&;'1"0*``!F@;]L$```
+M`%!V)X/L!(U$)`Y0:,D```!7_Y>@`0``@\00N@````"%P`^$O`,``(UV``^W
+MA]0!```E\````(/X0'4+9L>%@A``````B?9F@WPD"@!U+(._S`$```=U(V:#
+MO]`!```(=1EFQT0D"@4`9L>%<A````$`9L>%=!````$`BT0D!(.XW`$```9T
+M0V:!N,H!``!E<'4X9HN0"`(``(U"G&:#^`%W$(U"!8M4)`1FB8((`@``ZQB+
+M1"0$9H.X"`(``$%U"F;'@`@"``!#`)#'1@0`````9H.]@A````!T&\=&!`$`
+M``!F@[UR$````'4*QT8$`P```(UV`&:#O880````=`2#3@0$9H.]B!````!T
+M+(M4)`1F@;K*`0``$0YT'8M6!(G0@\@(B48$9H.]=!````!U"(G0@\@HB48$
+M9L=&$`@)#[>'U`$``"7P````@^@P@_@_=CJ#O\P!```'=#&#O\P!```+="B#
+MO\P!```*=!^#O\P!```)=!:#O\P!```*=15F@[_0`0```W<+C78`9L=&$L0)
+MZPAFQT82K`J)]F;'1@PS$V;'1@[4%XI&`8/@OX/(@(A&`;@`````]D0D"@)U
+M)(._S`$```5W$X._S`$```5U$F:#O]`!```#=@BX`0```(UV`,'@!8I6`8/B
+MVPG"@\H(#[=$)`K1Z(/P`8/@`='@@^+]"<*(5@&#O\P!```&=@J(T(/($(A&
+M`>L$@&8![X`.`XM$)`1F@[C0`0```7<+@[_,`0``"W5?B?:X`````/9$)`H!
+M=0CV1@0)=`*P`8T<A0````"*%H/B\P^W3"0*B<C!Z`.#\`&#X`'!X`,)V@G"
+MB!:X`````/;!!'4)]D8$"70#L`&0B,+!X@2*!H/@[PG0@\B@B`:`)K^Z````
+M`(.]-!$```!T"8.].!$```!U!;H!````BD8!@^#^"="(1@&`3@(/BU0D!(.Z
+MS`$```5U#&:#NM`!```(=`^)]HM$)`2#N,P!```%=@2`3@(0#[=$)`HE\`$`
+M`'0+P?@$9HE&".L(B?9FQT8("@!F]T0D"@#P=!4/MTPD"L'I#+@!````T^!F
+MB48*ZP9FQT8*@``/MX?4`0``)?````"#Z#"#^#]W!H!.`F#K!(!F`I]F@[UV
+M$````'0R@^P$BT0D"`5($```4&H/5_^7H`$``(/$$(7`=!6+5"0$QX),$```
+M`0```(!.`H"-=@"#O\P!```$#Y;`#[;`BU0D!(F":!```+H`````@[_,`0``
+M!74+9H._T`$```ET"I"#O\P!```%=@6Z`0```(I&`X/@_@G0B$8#QT84#P``
+M`+H!````B="#Q`Q;7E]=PY"#[!2-1"0(4/]T)!SH_/___[@!````@\0<PXGV
+MBT0D!(-\)`@!=0G'0'``````PY#'0'#,X@``PU93@^P4BUPD((MT)"2+4Q2+
+M1@2)@BB```"+4Q2+1@R)@BR```"+4Q2+1A")@C"```"+4Q2+1@B)@C2```#V
+M1@,!=#6#[`B-1"004%/H_/___XN#-!```,=`)`````#'0"@`````BT,4QX`@
+M@````````8/$$(UV`(M3%(L&B8(@@```@\046U[#C78`@^PLBTPD,(M4)#2)
+M5"0$BX'<`0``@_@!=!*#^`%R(8/X!G0<@_@(=36-=@#'1"0,__\``,=$)!#_
+M_P<`ZR")]HG0*P4`````P>`#B40D#(G0*P4`````P>`#B40D$(U"`8E$)`B+
+M1"0X)?__@`&)!"2#[`B-1"0(4%'H_/___X/$/,.0BU0D!(M"%,>`*(``````
+M``"+2A2+@02````-```$`"7__\__B8$$@```BT(4QX`@@```__\``,-55U93
+MBWPD%(M,)!B)_F:#>1(`=#^+5Q2+@@2````-```0`(F"!(```(M7%`^W01")
+M@B2```"+5Q0/MT$2B8(X@```BU<4BT$4P>`#B8(P@```ZQ2+5Q2+@@2````E
+M___O_XF"!(```(M7%(L!B8(H@```BU\4BX,@@```)0``@/\/MU$("<)F@WD8
+M`'01#[=!&(/`!,'@$"4``'\`"<*)DR"```"+AM`M```PY`^W41K!X@B!X@#_
+M```)T(F&T"T``(M7%(F"&(````^W<0@Y<1QV`XMQ'(M9##E9''8#BUD<.=YU
+M!HMI!.L#D(LIBU<4BT$$@^@#P>`#)?__!P`-```8"HF"U(```(M7%(T$[>C_
+M__\E__\'``T````*B8+8@```BT\4B?`E__\``(G:P>(0"=")@=R```!;7E]=
+MPU.#[`B+7"00BU,4BT0D%(F"`&```(M#%,>`"&````$```!J`FH#:`Q@``!3
+MZ/S___^#Q!"Z`````(7`=!6+0Q2+D`1@``"+1"089HD0N@$```")T(/$"%O#
+MD)"04XM$)`B+6!2+3"0,T>&X`P```-/@BY,40```"=")@Q1```"X`0```%O#
+MB?93BT0D"(M8%(M,)`S1X;@#````T^#WT(N3%$```"'0B8,40```N`$```!;
+MPU.+3"0,BT0D"(M8%(N3&$```+C^____T\`APHM$)!"#X`'3X`G"B9,80```
+MN`$```!;PY"+3"0(N/____^#^05W%8M$)`2+0!2+@!Q```"#X"_3Z(/@`<-6
+M4X/L!(MT)!"+5"04BT84BY@40```C0P2N`,```#3X`T`\`$`]]`AP\'B#`G3
+M@,^`@WPD&`!T!H'+```!`(M&%(F8%$```(/L"(N&0"H```T````!4%;H_/__
+M_X/$%%M>PY"0BT0D!(M`%(N`"$```(/X`0^4P`^VP,.055=64X/L!(MT)!B+
+M?"0<O0````")-"2+1A2+F(````#WPP``@`!T/(N`C````*D````!=`6]```@
+M`*D````@=`:!S0``0`"I````!'0&@<T``(``J0````)T"8'-`````HUV`(M&
+M%(N8P````(/[_W42QP<`````N`````#IZ0```(GVB=@ENM@%`8D']\,```@`
+M=`<-````0(D']L,%=`.##P'WP\`%``!T4X,/0(M&%(N0Q````(G0)?\#``"+
+M#"0+@9Q$``"!X@``_P/!ZA`)PHF1G$0``(M&%(N`R````(G!@>'_`P``"=$E
+M``#_`\'H$`G(BQ0DB8*<1```]L,@=!"#OF@0````=`>!#P```$"0B>@+!XD'
+MJ0```$!T18F>4!```(M6%(N"Q````(F&5!```(N"R````(F&6!```(N"S```
+M`(F&7!```(N"T````(F&8!```(N"U````(F&9!```+@!````@\0$6UY?7<.0
+MBT0D!(N`0"H``,.055=64XMT)!2+3"08B?.+KD`J``"%[7D0BT84QT`D````
+M`(M&%(M`)(G*@>*ZV`4!OP````#VP4!T,H.[R"H```!T`X/*0(.[S"H```!T
+M`X#.`8.[T"H```!T`X#*@(.[U"H```!T!8#.!(GV]L$!=`.#R@?WP0``X`)T
+M0('*``"``/?!```@`'0&@<\````!]\$``$``=`:!SP```"#WP0``@`!T!H'/
+M````!/?!`````G0(@<\````"B?;WP0```$!T!H'*```(`(M&%(F0H````(M6
+M%(N"K````"7___]("?B)@JP```")BT`J``"%R7D-BT84QT`D`0```(UV`(GH
+M6UY?7<.0BT0D!`^W@.H!``##BU0D!(M$)`AF.8+J`0``=AD/M\#!X`4#0A2+
+M@!R(``"Z`0```&:%P'@%N@````")T,.)]E93BUPD#(MT)!"X`````&8YL^H!
+M```/AMD````/M\;!X`6)P@-3%(N*%(@``,>"`(@```````")P@-3%,>"!(@`
+M``````")P@-3%,>""(@```````")P@-3%,>"#(@```````")P@-3%,>"$(@`
+M``````")P@-3%,>"%(@```<```")P@-3%,>"&(@````````#0Q3'@!R(````
+M````@_D$=4WV@\LM```(=$2-1D`/M\#!X`6)P@-3%,>"`(@```````")P@-3
+M%,>"!(@```````")P@-3%,>""(@````````#0Q3'@`R(````````D+@!````
+M6U[#5U93BWPD$(M4)!B+="04N`````!F.;?J`0``=FN%TG0X#[9:!<'C"`^V
+M0@0)PP^V2@/!X1@/MD("P>`0"<$/MD(!P>`("<$/M@()P='IB=C!X!\)P='K
+MZPN[`````+D`````D`^WQL'@!8G"`U<4B8H8B````T<4B=J`SH")D!R(``"X
+M`0```%M>7\-55U93@^PHBUPD/(ML)$2+1"1`9HE$)":)7"0@C9/@`0``@WPD
+M3`$9R??1@>&JJJJJO@````!F.4(*#X:D`P``#[9%`(/X!0^'EP```/\DA=Q'
+M``#'1"00!0```.F/````O@````#V0@$@#X1T`P``QT0D$`8```#K=L=$)!`$
+M````]H/++0``"'1E#[=$)":#P$`/MU(*O@`````YT`^-0`,``.M*O@````!F
+M@WT"!`^&+@,``,=$)!``````9H-]`@5V*V:#?0(.&=*#XOZ#P@.)5"00ZQC'
+M1"00!P```.L.B?:^`````.GV`@``B?8/MGT$B7PD'`^V107!X`@)QXE\)!P/
+MMD4&P>`0"<>)?"0<#[9%!\'@&`G',<^)?"0<#[9%"<'@"`^V50@)PC'*@>+_
+M_P``B50D&`^V?0H/MD4+P>`("<</MD4,P>`0"<</MD4-P>`8"<<QSP^V10_!
+MX`@/ME4."<(QRH'B__\``(E4)!0/MG40#[9%$<'@"`G&#[9%$L'@$`G&#[9%
+M$\'@&`G&,<YF@WT"#7<&@>;_````@WPD$`0/A<<!``#V@\LM```(#X2Z`0``
+M9HM$)":#P$!FB40D#@^W5"0FB10DP>(%B=$#2Q2+1"0<]]")@0"(``")T0-+
+M%(M$)!CWT(F!!(@``(G0`T,4B;@(B```B=`#0Q2+3"04B8@,B```B=`#0Q2)
+ML!"(```#4Q3'@A2(```$````_W0D2/]T)`13Z/S___\/MGT4#[9%%<'@"`G'
+M#[9%%L'@$`G'#[9%%\'@&`G'#[9-&`^V11G!X`@)P0^V11K!X!`)P0^V11O!
+MX!@)P8/$#(M$)"#V@,PM```$=$,/MD4?P>`(#[95'@G"B50D"`^V11W!X`@/
+MME4<"<*)5"0$#[9U(`^V12'!X`@)Q@^V12+!X!`)Q@^V12/!X!@)QNL5O@``
+M``#'1"0$`````,=$)`@`````#[=$)`[!X`6)P@-3%(FZ`(@``(G"`U,4BWPD
+M"(FZ!(@``(G"`U,4B8H(B```B<(#4Q2+;"0$B:H,B```B<(#4Q2)LA"(``")
+MP@-3%,>"%(@```<```")P@-3%,>"&(@````````#0Q3'@!R(````````#[=$
+M)";!X`6)P@-3%(M,)!R)B@"(```#0Q2+?"08B;@$B```ZVJ)]@^W3"0FB<C!
+MX`6)P@-3%(ML)!R)J@"(``")P@-3%(ML)!B)J@2(``")P@-3%(FZ"(@``(G"
+M`U,4BWPD%(FZ#(@``(G"`U,4B;(0B````T,4BVPD$(FH%(@``/]T)$A14^C\
+M____@\0,O@$```"-=@")\(/$*%M>7UW#D)"#[!!J!HM$)!@%+"H``%#_="0@
+MZ/S___^#Q!S#@^P0:@;_="0<BT0D'`4L*@``4.C\____N`$```"#Q!S#C78`
+M@^P0:@:+1"08!3@J``!0_W0D(.C\____@\0<PU.#[`R+7"04:@;_="0<C8,X
+M*@``4.C\____BTL4#[:3."H```^V@SDJ``#!X`@)P@^V@SHJ``#!X!`)P@^V
+M@SLJ``#!X!@)PHF1X(```(M+%`^VDSTJ``#!X@@/MH,\*@``"=")@>2```"X
+M`0```(/$&%O#4XM<)!"+3"0(N@P```"+1"0,9CF!"`(``'03BH%N$```@^"`
+M/`$9TH/B^(/""X7;=`*)$[@`````6\.0BTPD!(G*N`````!F@[F"$````'0.
+M9H.Y<A````$9P(/@0D!F@[J&$````'0#@\@$9H.ZB!````!T'F:!N<H!```1
+M#G03@\@(9H.Z=!````!U!H/(((UV`,.-=@!75E.+="009HN&2!```(G'@^<<
+MP?\"B<.#XP+1^X/L"%=6_Y:L`0``BU84BX(`F```@,P@B8(`F```@\0(5U;_
+MEK`!``"#Q`R)VCG8=0J%VP^4P`^VT(GV4E=6_Y:X`0``@\006UY?PXM$)`2+
+M2!2+@1!````EG__Q_XM4)`B#X@<+!)4`2```B8$00```PY!64X/L"(M<)!2+
+M="0<:@;_="0<C8,R*@``4.C\____BTL4#[:3,BH```^V@S,J``#!X`@)P@^V
+M@S0J``#!X!`)P@^V@S4J``#!X!@)PHF1"(```(M+%`^V@S<J``#!X`@/MI,V
+M*@``"<*!YO\_``#!YA`)\HF1#(```(/$%%M>PU.+1"0(BT`4BXA,@```BY!0
+M@```BYA,@```.<N#T@"X`````(G9NP`````)R`G:6\.-=@"+1"0$BT`4BX!,
+M@```PXGVBTPD!(M1%(N"((````T````!B8(@@```BU$4B8(@@```PXGV5E.+
+M="0,BUPD$(N&-!```(7`=&#V0`(@=%JP`+D`````.PMS'(UV`(I4"P2$TGD,
+M@^)_.,)R!8C0C78`03L+<N>+5A2+B@2```"$P'06T.@\`G<0B<@-`````HF"
+M!(```.L1D(M6%(G()?____V)@@2```!;7L.0BU0D!(M"%(N`9)@``(G!P>D3
+M@>'_`0``]L4!=`:!\0#^__^+4A2+@E"```"+DDR````QT#'(PY!3BU0D"(M"
+M%(N`($```"7_````B<&#X0^[`````,'H!#F"S`$``'4,9CF*T`$``'4#LP&0
+MB=A;PXM,)`2+1"0(BU$4BY*0@````1"+412+DHR````!4`2+412+DI2````!
+M4`R+412+DHB````!4`B+412+DIB````!4!##N`$```##B?:+1"0$BT`4BX`<
+MG```)?\```##D(M$)`2+0!2+@%B```"#X`?#C78`BT0D!(M0%(M$)`B#X`>)
+M@EB```##C78`BT0D!(N`N"T``,.0@^P,BU0D$(M,)!2+@C00``"%P'4+B8JX
+M+0``L`'K#Y"#[`1045+H_/___X/$$(/$#,.)]K@!````PXGV5U93BWPD$(MT
+M)!2)^X/^!786@^P(:/__``!7Z/S___^#Q!`Y\',2D,>#]"T``/____^X````
+M`.LC@^P(5E?H_/___XM7%(F"<!```(/$$(FW]"T``+@!````B?9;7E_#@^P4
+MBU0D&(M"%(N`<!```"7__P``4%+H_/___X/$',-55U93@^P4BVPD*&C_/P``
+M5>C\____@\00.T0D)',1QX7X+0``_____[@`````ZSR+=12+GA2```"!XP#`
+M__^#[`C_="0L5>C\____)?\_```)PXF>%(```(/$$(M$)"2)A?@M``"X`0``
+M`)"#Q`Q;7E]=PX/L%(M4)!B+0A2+@!2````E_S\``%!2Z/S___^#Q!S#BT0D
+M!`^V@,LM``"#\`&#X`'#B?:+1"0$B<&#?"0(`'0CBU`4BX($@```)?____Z)
+M@@2```"!H<@M``#____^ZR&-=@"+4!2+@@2````-`````8F"!(```(&)R"T`
+M``````&X`0```,-55U93@^P4BVPD*&C_/P``5>C\____@\00.T0D)',1QX7\
+M+0``_____[@`````ZT"+=12+GA2```"!X___`,"#[`C_="0L5>C\____P>`0
+M)0``_S\)PXF>%(```(/$$(M$)"2)A?PM``"X`0```(GV@\0,6UY?7<.#[!2+
+M5"08BT(4BX`4@```)0``_S_!Z!!04NC\____@\0<PY!64XM<)`R+5"00N`P`
+M``!F@_I_=S"+0Q0/M\J)B``$``"+4Q2#?"04``^5P`^VP(F"!`0``(I$)!2(
+MA!DT+0``N`````!;7L-55U93@^P,BUPD((M$)"2)QHB#.!```(-\)"@`#X3Z
+M````A,`/A/(```"+@S00```/MT`")4`!```]0`$```^%V````(/L"&H!4^C\
+M____B<6+@S00``"#Q!#V0`-`="F)\`^V^(GHT>@/K_B-/'^!QP0!``")\@^V
+MR@^OR(T$28V,`*P-``#K6(N#-!```&:#>`(`>2J)\`^V^(GHP>@"#Z_XC3Q_
+M@<?2````B?(/MLH/K\B-!$F-C`!(#0``ZR&)\`^V^`^O_8T\?X'':`$```^V
+MR`^OS8T$28V,`&`.``")\`^VT`^OU8T44H'"Z`,``('B_S\``(M#%(FX<!``
+M`(M#%(F(L!```(M+%(G0P>`0"=")@12```")]H/$#%M>7UW#@^P4BT0D&/^P
+MW`$``%#H_/___X/$',.0BU0D!+@`````@WPD"`9T%("ZCQ````!T"X.ZY"T`
+M``%W`K`!PXUV`%.+7"0(_W0D#%/H_/___X/$"(7`#X1"`0``BT,4QX!PF```
+M'P```(M3%`^W@]0!```E\````(/H,(/X0!G`@^#\@\`8B8+XF0``BU,4BX(<
+M@```)7_`__\,@(F"'(```(M#%,>`!($``#T```"+4Q2+@A!```"#R`*)@A!`
+M``"#N\P!```'=#"#N\P!```+=">#N\P!```*=!Z#N\P!```)=!6#N\P!```*
+M=6!F@[O0`0```W=6B?:+0Q3'@'28```F````BT,4QX!XF```#0```(M#%,>`
+M\)D```<```"+0Q3'@/29```_````BU,4BX(00```)?____P-`````HF"$$``
+M`.D7`0``B?:+0Q3'@'28```*````BT,4QX!XF```#````(M#%,>`\)D```,`
+M``"+0Q3'@/29```@````BU,4BX(00```#0````.)@A!```#IR````(UV`(M3
+M%(N"$$```"7____\B8(00```BU,4BX(00```@^#]B8(00```BT,4QX!PF```
+M'P```(M#%,>`=)@``'\```"+0Q3'@'B8```.````BT,4QX#PF0``#````(M#
+M%,>`])D``/\```"+4Q0/MX/4`0``)?````"#Z#"#^$`9P(/@_(/`$HF"^)D`
+M`(M3%(N"'(```(G!@>%_P/__#[>#U`$``"7P````@^@P@_@_=PF)R`V`$P``
+MZP>)R`V`#P``B8(<@```6\.04XM<)`C_="0,4^C\____@\0(A<`/A-,```"+
+M4Q2+@A!````E_____(F"$$```(M3%(N"$$```(/@_8F"$$```(M#%,>`!($`
+M``$```"+4Q2+@AR```")P8'A?\#__P^W@]0!```E\````(/H,(/X/W<*B<@-
+M@!,``.L(D(G(#8`/``")@AR```"+0Q3'@'"8```?````BT,4QX!TF```?P``
+M`(M#%,>`>)@```X```"+0Q3'@/"9```,````BT,4QX#TF0``_P```(M3%`^W
+M@]0!```E\````(/H,(/X0!G`@^#\@\`8B8+XF0``6\.0N@````"+1"0(9HL`
+MB<%F.P4@2```=PRX($@``$)F.PR0=OD/OP25(D@``,-75E.+5"00BT0D%(MT
+M)!B+?"0<B=.-BN`!``"#^!T/AZ@"``#_)(5,2```@_X"=!:#_@)R)X/^!'(L
+M@_X%=AV#_G]T&.L@BD$!P.@%@^`!@_@!&<"#X`WI?`(``+@`````Z7("``"X
+M#0```.EH`@``N`````"%]@^$6P(``(/^`742]H+++0``"`^4P`^VP.E$`@``
+MA?9T!X/^`701ZR#V00$0#Y7`#[;`Z2H"``"+@\PM``#!Z`*#X`'I&0(``+@,
+M````Z0\"``"-=@"#NLP!```%=Q.#NLP!```%=11F@[K0`0``!W8*N`````#I
+MY@$``+@-````Z=P!``"X`````(7V#X3/`0``N`P```"#_@$/A<$!``"+0A2+
+M@`BB``#VQ"`/E,`/ML#IJ@$``(N"^`$``(D'N`````#IF`$``+@`````A?8/
+MA(L!``"X`````(/^`0^%?0$``(.ZV"T````/E,`/ML#I:P$``(7V=`>#_@%T
+M%>LZ9H.Z@A`````/E,`/ML#I30$``&:#NH@0````=1.X`0```&:#NH80````
+M#X0P`0``N`````#I)@$``+@!````Z1P!``"X`````(7V#X0/`0``N`P```"#
+M_@$/A0$!``"+@L@M``#WT,'H'^GQ````A?9T!X/^`708ZRB*00+`Z`2#X`&#
+M^`$9P(/@#>G0````]H+,+0``"`^4P`^VP.F^````N`P```#IM````(N"W"T`
+M`(/@/XD'N`````#IGP```(N"W"T``"4`/P``P>@(B0>X`````.F%````@_X!
+M=!.X`````(/^`7)VL`R#_@9W;^L/]H(4+@```0^4P`^VP.M>@^P,4NC\____
+MB<*#Q!"X`0```(72=$>#_@9W+?\DM<1(```/MD()B0?K'@^V0@R)!^L6#[9"
+M#8D'ZPX/MD(+B0?K!@^V0@J)![@`````ZPZ)]E=64%+H_/___X/$$%M>7\-5
+M5U93@^P,BWPD((M<)"2+;"0HBTPD+(G^C9?@`0``@_L=#X>$`0``_R2=_$@`
+M`(7)=`R!C\@M```````(ZPJ!I\@M``#____WN`$```#I;`$``+@`````]D(!
+M$`^$70$``(7)=`F#I\PM``#[ZP>#C\PM```$BU<4BX;,+0``B8(@@0``N`$`
+M``#I,`$``(M'%(N0"*(``(7)=`6`SB#K`X#FWXM'%(F0"*(``+@!````Z0@!
+M``")C_@!``"+1Q2)B$B```"X`0```.GO````A<D/E<`/ML")A]@M``"X`0``
+M`.G7````A<ET#(&/R"T``````(#K"H&GR"T``/___W^X`0```.FS````#[^'
+M\"T```'!@_D_=@6Y/P```(/[&G43B<@+AMPM``"#X#^)AMPM``#K'HN6W"T`
+M`('B`#\``(G()0`_``#!Z`@)T(F&W"T``(M7%(N&W"T``(F"Z(```+@!````
+MZU2X`````(/]!G=*@^P$4?\TK>!(``!7Z/S___^#Q!#K-/9"`A!T&X7)=`F#
+MC\PM```(ZP>#I\PM``#WN`$```#K$X/L#/]T)#Q155-7Z/S___^#Q""#Q`Q;
+M7E]=PY"#[!3_="0L_W0D+/]T)"S_="0L_W0D+/]T)"SH_/___X7`#Y7`#[;`
+M@\0LPU93@^P$BW0D$(-\)!0`=&R+5A2+@@1````E___\_XF"!$```(/L#&H*
+MZ/S___^[*````(/$$(GVBT84BX`00```J0```0!T)H/L#&HRZ/S___^+5A2+
+M@@1````E___\_XF"!$```(/$$$MUS.L$A=MU"K@`````ZQR-=@"+5A2+@@2`
+M```E___[_XF"!(```+@!````@\0$6U[#D(M,)`2+412+@@2````-```$`(F"
+M!(```(-\)`@`=!F+412+@@1````E___\_PT```$`B8($0```PXUV`(M,)`2+
+M412+@@2````-```$`(F"!(```(-\)`@`=!F+412+@@1````E___\_PT```(`
+MB8($0```PXUV`%=64XM$)!"+7"04BU0D&(G&OP$```"#^P%T(8/[`7((@_L"
+M="/K+9"#[`A24.BZ_O__B<>#Q!#K(XUV`%)0Z$7___^#Q`CK%%)0Z'7___^#
+MQ`CK"+@`````ZPF0B9ZT+0``B?A;7E_#BT0D!(M`%(N`!$```"4```,`P>@0
+MPY"04X/L"(M4)!"+1"04@_@(#X23````@_@(=R:#^`(/A(T```"#^`)W#(/X
+M`70[Z:8```")]H/X!'1GZ9H```")]CT``0``='D]``$``'<*@_@@=&3I@```
+M`#T``@``=&@]``0``'1HZW"[`````(.Z-!````!T:HN"-!```/9``T!T![L`
+M````ZU>+@C00``!F@W@"`'E*NP````#K0XUV`+L`````ZSF0NP````#K,9"[
+M`````.LINP````#K(HGVNP````#K&;L`````ZQ*[`````.L+C78`N`````#K
+M$)"#[`A34NC\____B=B#Q!"#Q`A;PXM$)`2+0!2+0`S#D(M$)`2+4!2+1"0(
+MB4(,PY"+1"0$BT`4QT`(!````,.0@^P,BU0D$(M"%,=`""````!J`&H$:@A2
+MZ/S___^%P`^5P`^VP(/$',.-=@!3@^P4BUPD'(M3%(N"2(```(/@WXF"2(``
+M`%/H_/___X/$"&H!4^C\____@\086\.#[!B+3"0<BU$4BX)(@```@\@@B8)(
+M@```4>C\____@\0<PY"+3"0$BU$4BT0D"(F"0(```(M1%(M$)`R)@D2```##
+MD%.+5"0(BTPD#+@`````@_D_=T*#^1]V((M2%(N:1(```(/I(+C^____T\`A
+MV(F"1(```.L;C78`BU(4BYI`@```N/[____3P"'8B8)`@```N`$```!;PY!3
+MBU0D"(M,)`RX`````(/Y/W="@_D?=B"+4A2+FD2```"#Z2"X`0```-/@"=B)
+M@D2```#K&XUV`(M2%(N:0(```+@!````T^`)V(F"0(```+@!````6\.0BT0D
+M!(M`%(N0/(```(N`#($``*@@=`.`S@*I```"`G0#@,X!B=##D%.+7"0(BTPD
+M#(M3%`^VP8F"/(```+H`````]L4"=`*R(/;%`70&@<H```("BT,4B9`,@0``
+MA=)T#XM3%(M"-(/($(E"-.L-D(M3%(M"-(/@[XE"-%O#B?:+5"0(QT((````
+M`(M$)`PE_P\``(E"#/9$)!`@=`:`S"")0@S'0A0`````QT(0`````+@!````
+MPU93@^P$BW0D$(M,)"B+5"04BT0D'+L/````]D(4`0^$]0```/9`%`%U%8M&
+M%(M`#+L/````.T0D&`^$V@```&:+0A`E_P\``&:)`8M"%"4``/]_P>@09HE!
+M`L9!!`"+0A`E``#P#\'H%(A!!CR`=03&008`BT(4]L0!=!`E`/X``,'H"8A!
+M!^L'C78`QD$'_XM"$"4`@`\`P>@/B$$(BT(0)0```/#!Z!R(00F+0A#!Z`R#
+MX`&(00J+0A2H`G55J`1T"8!)!`'K2XUV`/9"%!!T*H!)!`(/MD(5B$$%@[X8
+M+@```'4N@_@%="F#[`A15NC\____@\00ZQJ)]O9"%`AT!H!)!`CK#/9"%"!T
+M!H!)!!")]KL`````B=B#Q`1;7L.0D)!55U93@^P\BWPD4(G]O@````"+5"18
+M#[="`HG"P>H'P>@(,="Z#````*@!#X2W#```BTPD6`^W00*)PL'J!L'H!3'0
+MN@P```"H`0^$F`P``(/L!&H!:@!7Z/S___^#Q!"Z`````(7`#X2+#```@^P(
+M_W0D8%?H_/___XE$)#R#Q!"Z#````(7`#X1:#```@WPD5`9T(8-\)%0&=PF#
+M?"14`7<)ZQ&#?"14"'0*N@P```#I,@P``,=$)"@`````@WPD7`!T*(M'%(N`
+M0!$``(E$)"B#[`C_="0T5^C\____@\0(:@!7Z/S___^#Q!"#O\P!```'="Z#
+MO\P!```+="6#O\P!```*=!R#O\P!```)=!.#O\P!```*=5UF@[_0`0```W=3
+M@WPD7`!T3(._-!````!T0XN/-!```(M<)%AFBP-F.P%T,0^W4P*!XO`!```/
+MMT$")?`!```YPG4:@^P(4U?H_/___X/$$+H!````A<`/A8$+``"+1Q2+@%B`
+M``")1"0DA<!U",=$)"0!````BU<4BX($@```)0``(`*)1"0<BX(00```)6``
+M_@")1"0@BX(40```B40D-(N2&$```(E4)#"#[`C_="1<5^C\____B3PDZ/S_
+M__^#Q`C_="1@5^C\____@\00N@,```"%P`^$\0H``(M4)%@/MT(")?`!```]
+M0`$``'14/4`!``!_)CW`````='P]P````'\,/:````!T7.F-````/=````!T
+M=.F!````/<`(``!T5CW`"```?PD]4`$``'0DZVH]0`D``'0)/5`)``!T%.M:
+MQT0D&`$```#'1"04`0```.M2QT0D&`(```#'1"04`0```.M`QT0D&`,```#'
+M1"04`@```.LNQT0D&`0```#'1"04`@```.L<QT0D&`4```#'1"04`@```.L*
+MN@P```#I)0H``(M'%,>``)@```<```"[`````(UV`(T$6XM/%(L4Q8!)``")
+M5"0(BU0D&(T$0HL$A8!)``"+5"0(B0011O?&/P```'4-@^P,:@'H_/___X/$
+M$$.#^QAVOKL`````D(L,W>!+``"#?"1<`'06C8'@?___@_@8=B^-@2Q___^#
+M^`AV)(M7%(L$W>1+``")!`I&]\8_````=0Z#[`QJ`>C\____@\00D$.!^\,`
+M``!VKU;_="08_W0D(%?_E:@J``"#Q!"+3"18]D$#0'4'9H-Y`@!Y$(/L"/]T
+M)&!7Z/S___^#Q!!F@[_2`0``00^&T0```(M'%,>`+)@```*@`@"+7"189H$[
+MM`EU)0^VC8X0```/MX68$```*<&X9V9F9O?IB=#1^,'Y'XG#9BG+ZQ(/MI6.
+M$```N&=F9F;WZHG3T>N+="18#[=&`B70````/<````!U*XM/%`^VE8X0``#W
+MVL'B!H'BP`\``(G8P>`2]]@E``#\``G"B9%,F0``ZPV+1Q3'@$R9````````
+MBU<4BX(HH@``@.3]B8(HH@``BU<4BX(HH@``)?\#_O^`S`B)@BBB``"+1Q3'
+M@&"````/````9H._T@$``$)V#8M'%,>`5*(```````"+1Q3'@'B8```.````
+M@[_,`0``"G0<@[_,`0``"703@[_,`0``"G4Y9H._T`$```-W+[D!````BT0D
+M6&:!.)X)=`=F@3BC"74%N0````"+5Q2+@DRB```YR'0&B8I,H@``@^P$C40D
+M/%#_="0T5^C\____@\00N@,```"%P`^$R@<``(-\)%0&=!6#OP0"````=`R#
+M[`Q7Z/S___^#Q!"-1"0X4`^W1"0<4/]T)#17_Y6T*@``@\00N@,```"%P`^$
+MB`<``(M4)%CV0@)`=&2#O\P!```*=">#O\P!```)=!Z#O\P!```*=0IF@[_0
+M`0```W8+9H&];!````)0=B2+3"18#[=!`B6@````/:````!T$(/L"/]T)#17
+MZ/S___^#Q!"#[`C_="1@5^C\____@\00@^P(_W0D-%?H_/___X/$$+H#````
+MA<`/A/T&``"#?"1<`'0-BT<4BUPD*(F80!$``(M/%`^VE2PJ```/MH4M*@``
+MP>`("<(/MH4N*@``P>`0"<(/MH4O*@``P>`8"<*)D0"```"+3Q0/MI4Q*@``
+MP>((#[:%,"H```G0"T0D'`N%R"T```T``(``B8$$@```@^P(_W0D7%?H_/__
+M_XM/%`^VE3@J```/MH4Y*@``P>`("<(/MH4Z*@``P>`0"<(/MH4[*@``P>`8
+M"<*)D>"```"#Q`B+3Q0/MI4]*@``P>((#[:%/"H```G0B8'D@```BU<4BX(0
+M0```"T0D*(F"$$```(M'%(MT)#R)L!1```"+1Q2+5"0XB9`80```BT<4BTPD
+M+(F(6(```(M/%`^VE3(J```/MH4S*@``P>`("<(/MH4T*@``P>`0"<(/MH4U
+M*@``P>`8"<*)D0B```"+3Q0/MI4W*@``P>((#[:%-BH```G0B8$,@```BU<4
+MBX70+0``B8(8@```BT<4QX"`````______]T)#17Z/S___^#Q!"Z`P```(7`
+M#X1J!0``@^P$:@$/MH<X$```4%?H_/___X/$"/]T)&!7Z/S___\/MX?4`0``
+M)?````"#Z#"#Q!"#^#]W0XN'-!```/9``T!U!V:#>`(`>3"+AS00```/MT`"
+M)0!```"#^`$9P/?0@\`-BT\4BY$DF```@^+P@^`/"<*)D228``"+1Q2+@!29
+M``")PH'B_S\``(M<)%CV0P(@=`_!X@*XHXLNNO?BP>H$ZPJXS<S,S/?BP>H#
+MBT<4QX`<F````0```(N'-!```/9``T!T$H/L#(U$$F10Z/S___^#Q!#K,8N'
+M-!```&:#>`(`>16#[`R-!)5D````4.C\____@\00ZP^#[`R-0F10Z/S___^#
+MQ!"+1Q2+L`B8``#'@`B8````.```NP$```"+1Q2+@"2<``"H$'0E@^P,:,@`
+M``#H_/___X/$$(G80X/X$W\-BT<4BX`DG```J!!UVXM'%(FP")@``(M7%(N"
+M8)@``(/(`XF"8)@``(MT)%@/MT8"):`````]H````'0[@[V\+0```G0RBU<4
+MBX(@F0``@,SPB8(@F0``BU<4BX(@F0``#0```0")@B"9``#'A;PM```!````
+MZPK'A;PM````````@^P,5^C\____NP````"#Q!"^`0```(T$G0````")1"0$
+MBU<4B?"(V=/@BTPD!(F$"@`0``!#@_L)?MO'A9Q$````````NP````!F@[_H
+M`0```'09@^P(4U?H_/___X/$$$,/MX?H`0``.=A_Y\>%0"H``&4)"`"#?"14
+M!G4*QX5`*@``91D(`(M7%(N%0"H``(F"H````(M7%(N"K`````T```<`B8*L
+M````@[],$````'0,@^P,5^C\____@\00:@!J`6A@F```5^C\____@\0(_W0D
+M7%?H_/___XM7%(N"((```"7__W_^B8(@@```@\00@[_,`0``!7<3@[_,`0``
+M!74D9H._T`$```=V&HM'%,>`&($``*H``0"+1Q3'@!R!```0,@``BT<4QX`(
+M@0``4@```(M<)%CV0P,!=`B*A8H0``#K!HJ%BQ```(/L!`^^P%#_="1@5^C\
+M____B$0D(XNUW"T``(/F/XET)!P/OXWP+0``B?`IR(M<)#P/OE,&@\00.=!V
+M!@'*B50D#(MT)"P/OD8%T>`/OE0D$RG0B<([1"0,<PT/OX7P+0```<*)5"0,
+MBYW<+0``@>,`/P``P>L(#[^-\"T``(G8*<B+="0L#[Y6!CG0=@.-'`J+5"0L
+M#[Y"!='@#[Y4)!,IT(G".=AS"@^_A?`M``"-'`*+C=PM``"!X0``/P#!Z1`/
+MO[7P+0``B<@I\(D$)(M$)"P/OE`&.10D=@.-##*+5"0L#[Y"!='@#[Y4)!,I
+MT(G".<AS"@^_A?`M``"-#`*#?"0,/W8(QT0D##\```"#^S]V!;L_````@_D_
+M=@6Y/P```(M4)`R#XC^)V,'@""4`/P``"<*)R,'@$"4``#\`"<*+1Q2)D.B`
+M``"#O<PM````=`^+5Q2+A<PM``")@B"!``"#O?0M``#_=!*#[`C_M?0M``!7
+MZ/S___^#Q!"#O?@M``#_=!*#[`C_M?@M``!7Z/S___^#Q!"#O?PM``#_=!*#
+M[`C_M?PM``!7Z/S___^#Q!"#O_@!````=`^+5Q2+A_@!``")@DB```"+3"14
+MB8_<`0``@WPD7`!T;8M<)"SV0P0"=02`8P3^BW0D+&:+1@*+5"189HE"`HI&
+M!(A"!(I&!8A"!8I&!HA"!HI&!XA"!XN'-!```,=`+`````#'0#``````BY\T
+M$```@^P,5^C\____B4,DB5,H@\0(:@%7Z/S___^#Q!"Z`0```.L3C78`BTPD
+M8(,Y`'0"B1&Z`````(G0@\0\6UY?7<.)]E93BW0D#(N>!`(``/;#`W0?BTX4
+MBY%$F0``@>+____?B=B#X`'!X!T)PHF11)D``/;##'0O]L,$=1:+5A2+@M"`
+M``"#X..)@M"```#K%HGVBU84BX+0@```@\@<B8+0@```B?9;7L.0@^P4BT0D
+M&/]T)!Q0_Y"P*@``A<`/E<`/ML"#Q!S#B?955U93@^PDBW0D.+\!````B70D
+M%/]T)#Q6Z/S___^)Q;L`````@\009H.^Z`$```!T(HGV@^P(4U;H_/___X/$
+M$(7`=1Y##[>&Z`$``#G8=^.-=@"Z`````(7_#X2[`0``ZP>_`````.OJBT84
+MQX!\F0```0```+L`````BT84BX`@G```A<!U%8/L#&H%Z/S___^#Q!!#@_MC
+M=N#K!8/[8W8*N@````#I;P$``(/L"%56Z/S___^#Q!"Z`````(7`#X15`0``
+MBT84BX`4F0``B<*!XO\_``#V10(@=!'!X@*XHXLNNO?BB=#!Z`3K#+C-S,S,
+M]^*)T,'H`X/L#(/`9%#H_/___X/$#(U$)!1055;H_/___X/$$+H`````A<`/
+MA/8```"+1A3'@'R9````````]D4"0'1E@[[,`0``"G0K@[[,`0``"70B@[[,
+M`0``"G4*9H.^T`$```-V#XM$)`QF@;AL$````E!V(8M4)#0/MT("):`````]
+MH````'0-@^P(55;H_/___X/$$(/L"/]T)#Q6Z/S___^#Q!"+5A2+@F"8``"#
+MR`*)@F"8``#V100"=02`903^9HM%`HM4)#1FB4("BD4$B$($BD4%B$(%BD4&
+MB$(&BD4'B$('BX8T$```QT`L`````,=`,`````"+GC00``"#[`Q6Z/S___^)
+M0R2)4RB#Q`AJ`5;H_/___[H!````@\00B?:)T(/$'%M>7UW#B?:+3"0$BU0D
+M"(M!%(N`!(```"7___S_@_H!=%&#^@%_"(72="O#C78`@_H&=`>#^@AT.L.0
+MBU$4#0```1")@@2```"+412+0A2#X-^)0A3#BU$4#0```A")@@2```"+412+
+M0A2#R"")0A3#B?:+410-````$(F"!(```,.0@^P4:@+_="0<Z#8%``"#Q!S#
+MB?93@^P,BUPD%&H!:@!3Z/S___^#Q!"Z`````(7`=!*#[`AJ$U/H!P4``(G"
+M@\00B?:)T(/$"%O#D%575E.#[!2+7"0HBWPD+&H34^CA!```@\00N@````"%
+MP`^$_0$``(/L!&H!:@!3Z/S___^#Q!"Z`````(7`#X3@`0``@^P(:@!3Z*D$
+M``"#Q!"Z`````(7`#X3%`0``A?\/A+8!``"#N\P!```*=!R#N\P!```)=!.#
+MN\P!```*=39F@[O0`0```W<LO0@````/MT<"J"!U%270````N00````]P```
+M``^%L@```+GK````Z:@````/MX/4`0``)?````"#Z#"#^#]V$H.[S`$```=T
+M"8.[S`$```MU0KT(````#[='`J@@=0PET````#W`````=0>YZP```.MBN>H!
+M``#V1P-`=5</OT<"B<'!^1^!X0`"``"!P>H```#K0+T`````#[='`J@@=0PE
+MT````#W`````=0>YJP```.L@N:H!``#V1P-`=14/OT<"B<'!^1^!X0`"``"!
+MP:H````/MT<"J$!T%:@@=0PET````#W`````=06#S03K"?9'`D!U`X/-`?9'
+M`P%U`X/-`@^W1P*#X!"#^`$9]O?6@^8#BT,4BY!\F```#[='`J@@=0PET```
+M`#W`````=3&+0Q2)L`28``"+0Q2)J`"B```YRG1*BT,4B8A\F```@^P,:"P!
+M``#H_/___X/$$.LO.<IT&8M#%(F(?)@``(/L#&@L`0``Z/S___^#Q!"+0Q2)
+ML`28``"+0Q2)J`"B``"Z`0```(GVB="#Q`Q;7E]=PXGV55=64X/L%(M<)#"+
+M;"0HQP,`````_W0D+/]T)"SH_/___XG&@\00N`````"%]@^$BP(``(.]O"T`
+M``)T"8.]O"T```!U!L<#`0```(.]O"T```$/A5,!``"+5"0@BT(4BX`@F0``
+MJ0```0`/A3L!``#'A;PM````````QP,!````NP````")]HM,)""+012+N!"<
+M``"+B!2<``"+@!B<``")1"0(A?]T!(7)=1Z+1"0@BU`4BX(@F0``#0```0")
+M@B"9``!#@_L)?KV)^-'HB<K1Z@'0P>D'P>@'B40D!`^$'P$``(/Y`0^.%@$`
+M`(I$)`CWV`^^V(G8F?=\)`2)PX/XX'T'N^#____K"H/X'WX%NQ\```")^+H`
+M````]_&->("#__!]![_P____ZPJ#_P]^!;\/````BT0D((M(%(N1()D``('B
+M'_C__XG8P>`%)>`'```)PHF1()D``(M4)""+2A2+@2"9``"#X.")^H/B'PG0
+MB8$@F0``BTPD((M1%(N"()D``(#,"(F"()D``,>%O"T```(```#'1A`!````
+MB%X4B?B(1A7K69"+5"0D#[="`B6@````/:````!T1(.]O"T```)U.X-^$`!U
+M-8M,)""+412+@B"9``"`S/")@B"9``"+412+@B"9```-```!`(F"()D``,>%
+MO"T```$```"0@^P(5O]T)"SH_/___X/$$/9&`@(/A8X```"+1"0@BU`4BX)@
+MF```@\@"B8)@F```BTPD)`^W40+VQ@%U'XM,)"`/MX'4`0``)?````"#Z#"#
+M^#]W8?;"0'1<B?:+1"0@@[C,`0``!W1-@[C,`0``"W1$@[C,`0``"G0[@[C,
+M`0``"70R@[C,`0``"G4*9H.XT`$```-V'X/L#/]T)"SH91\``(/$$.L.BU0D
+M)&:#2@("9H-F`OVX`0```(/$#%M>7UW#D%=64XM\)!"+7"04B=B%VW4%N/__
+M__^)QH._S`$```ET$X._S`$```IU#6:#O]`!```#=P.#X^^+1Q2+4`R)F`!`
+M``"#[`QJ#^C\____@^8#@^,#4U9H`$```%?H_/___XG&@\0@]L,!=2J+1Q3'
+M0!0`````@^P$:@%J`%?H_/___X/$$(7`=`R+1Q2+@,````"-=@")\%M>7\.)
+M]HM$)`2+0!2+@&28``#!Z!,E_P$``/;$`70%-0#^__^8PXUV`(M,)`R+5"0$
+MBT0D"`^W0`(EX`$``#W`````=#`]P````'\)/:````!T%NLL/4`!``!U)6:+
+M@L@0``!FB0'K(9!FBX+*$```9HD!ZQ1FBX+,$```9HD!ZPBX`````,.)]K@!
+M````PXGV5U93@^P$BUPD%(M\)!B+0Q2+@&"8``"^`````*@"=3Q3Z/S___^)
+MQHU$)`905U/H9/___X/$$(7`=!5F.W0D`GX39H-/`@*^`````.L'B?:^````
+M`&:)=Q:-=@`/O\:#Q`1;7E_#B?964XMT)`R)\_:&X`$```1T:XM&%,>`(`0`
+M``$```"+1A3'@``&````````BU84BX(`!@``@\@(B8(`!@``BT84QX`$!@``
+M`0(0`(M&%,>`(`8```````"Y`````(M&%(F(``0``(M6%`^VA!DT+0``B8($
+M!```08/Y?W[@6U[#D%575E.#[`R+1"0HQT0D"`````"->/_![P-(@^`'B00D
+MBW0D)+T`````A?9^9XM$)"S!X`.)1"0$BQPD`?.#^PAV!;L(````N`$```"(
+MV=/@2+H!````B@PDT^)*,="*3"0$T^"+5"0@(P2ZT^B*#"33Z(GIT^`)1"0(
+MB=@K!"0!Q8L$)(UT!OC'!"0`````1X7V?Z2#[`C_="0L_W0D%.C\____B40D
+M&(M$)!B#Q!Q;7E]=PU575E.+?"04BVPD&(G^BT0D'`^W0`(EX`$``#W`````
+M="H]P````'\+/:````!T%.LBB?:Z`````#U``0``="#K$HGVN@$```#K%9"Z
+M`@```.L-D+@`````Z>4```")]@^WG%;F$```#[>$5NP0``#!X`8)PP^WA%;R
+M$```P>`,"<,/MX16^!```,'@$@G##[>$5OX0``#!X!@)PP^WC%8$$0``#[>$
+M5@H1``#!X`8)P0^WA%80$0``P>`,"<$/MX16%A$``,'@$@G!#[>$5AP1``#!
+MX!@)P8/]`70/@_T!<AJ#_0)T">L+C78`B=GK#(G+ZPBX`````.M(D#G9=12+
+M5Q2+@@BB``"`Y-^)@@BB``#K$HM7%(N""*(``(#,((F""*(``(FNN"T``(M'
+M%(F88)D``(M'%(F(9)D``+@!````6UY?7<-3BT0D"(.XS`$```IT2H.XS`$`
+M``ET08.XS`$```IU#&:#N-`!```#=BZ)]H.XS`$```=T(X.XS`$```MT&@^W
+M@-0!```E\````(/H,+H@````@_@_=P:0NB@```"Y`````(M$)`P/MP")T[H`
+M````]_.%TG0*C4+V@_@,=@*Q`8G(6\-55U93@^Q,BVPD8(GNBT0D9`^W>`+!
+M[P>#YP$/MT`")?`!```]0`$``'1M/4`!``!_,CW`````#X3C````/<````!_
+M$#V@````#X3%````Z=@````]T`````^$P0```.G(````/<`(```/A+$````]
+MP`@``'\./5`!``!T&^FJ````B?8]0`D``'0-/5`)```/A98```")]L=$)#P`
+M````#[>%U`$``"7P````@^@P@_@_#X:`````@[W,`0``!W1W@[W,`0``"W1N
+M@[W,`0``"G1E@[W,`0``"71<@[W,`0``"G4*9H.]T`$```-V28M-%(N11)D`
+M`(/BQXN&*"H```^_`,'@`X/@.`G"B9%$F0``ZR3'1"0\`0```.L:B?;'1"0\
+M`@```.L.B?:X`````.D%`P``B?:+312+@1"9```E!OS__XM<)#P/MY1>X!``
+M`,'B!`G0@\@!B8$0F0``_W0D9/^VN"T``%7H_/___XM5%`^_A%[($```)?\!
+M``"`S`*)@FB9``"#Q`QF@;YL$```_T]V08M$)&3V0`(0=#=FBX1^0!$``(J<
+M-T@1``"*E#=*$0``B%0D(&:+C'Y$$0``9HE,)!!FBY1^3!$``&:)%"3K.8GV
+MBTPD/&:+A$Z>$```BIPQPA```(J4-\40``"(5"0@9HN,?J00``!FB4PD$&:+
+ME'XN$0``9HD4)(M-%(N11)@``('B?\#__\'@!R6`/P``"<*)D428``"+312+
+M@5"8``"P``^VTPG0B8%0F```BTT4BY%0F```,/:*1"0@P>`()0#_```)PHF1
+M4)@``(M-%(N12)@``('B_P_\_XM$)!#!X`PE`/`#``G"B9%(F```BUT4BTPD
+M/`^WE$ZV$```B=#!X!C!XA`)T`^WC$Z\$```B<K!X@@)T`G(B8,TF```BTT4
+MBY$HF```,/:+7"0\#[>$7JH0``#!X`@)PHF1*)@``(M-%(N19)@``('B_P_X
+M_P^WA%ZP$```P>`,)0#P!P`)PHF19)@``+L"````9H&^;!````(P=QEF@;W*
+M`0``(A!U+HM$)&3V0`)`="2S".L@_W0D9%7H_/___X/$"(7`=`^+5"0\#[>$
+M5B(1```!PY"+312+D229``"`X@&-!!LE_@````G"B9$DF0``BTPD9(-Y$`!T
+M"@^^010/OED5ZQ`/MX1^LA$```^WG'ZV$0``BTT4BY$@F0``@>(?^/__P>`%
+M)>`'```)PHF1()D``(M-%(N!()D``(/@X(G:@^(?"=")@2"9``"+512+@B"9
+M``"`S`B)@B"9``!F@;YL$````$!V08M<)&0/MT,")=`````]T````'4+9H&^
+M;!```/]/=B*+312+D0RB``"!XO__`_^+!"3!X!(E``#\``G"B9$,H@``9H&^
+M;!````!0=@V+113'@."9````````N`$```"#Q$Q;7E]=PY!55U93@^QLQT0D
+M,`````#'1"0T`````(U\)%#\N@0```"X`````(G1\ZMFQT0D)@``QT0D(```
+M``#'1"0<`````&;'1"0X`0"-1"0X9L=``@(`9L=`!`(`9L=`!@$`9L=$)$`!
+M`&;'1"1"`@!FQT0D1`$`BYPDA`````^W:P+![0</MP.#Y0%T$XT$@(V$`"BF
+M__]FB40D*.L1B?:-!("-A`"80```9HE$)"B+A"2$````9H-X-`!T'V:+4#1F
+MB50D*NFB````@>'_/P``9HE,)"KI@@```)!FQT0D*@"`N%<```"+C"2$````
+M]D$"$'0"L*Z^``````^W7"0HB5PD%`^WP(E$)!"#[`15#[?&4/^T)(P```"+
+ME"20````_Y+$`0``B<&#Q!!F/0"`="J+7"04BWPD$(G8*?B)RH'B_S\``#G0
+M?PN-!#LYT`^-=?___T9F@_X$=J]FBUPD*HN,)(0```!FB5DT9H%\)"H`@`^%
+M&@$``(N$)(````"+4!2+@B"9``"I````0`^$I`0``(N"#)D``"7___\`B8(,
+MF0``BY0D@````(M"%(N0()D``('B____CXF0#)D``(N,)(````"+013'@*"9
+M````````BT$4QX"`F0```````(M1%(N"A)D``"4``/#_B8*$F0``BT$4QX"8
+MF0```````(M1%(N"G)D``"4``/#_B8*<F0``BT$4QX``F0```````(M!%,>`
+M!)D```````"+013'@`B9````````BU$4BX(,F0``)0#`__^)@@R9``"+013'
+M@(B9````````BT$4QX",F0```````(M!%,>`D)D```````"+412+@I29```E
+M`,#__XF"E)D``.FF`P``D`^W3"0J#[=$)"@IP8N<)(0````/MT,")?`!```]
+MT`````^$F@```#W0````?PP]P````'1*Z;<````]0`$``'0,/5`!``!T>>FD
+M````B<C!X!&)1"0@N!^%ZU'W;"0@P?H#BT0D(,'X'RG"B50D(,'Z"HE4)!QF
+MQT0D)C4,ZW*)RL'B"(E4)!RXE2!/"??JT?J+1"0<P?@?*<*)5"0<B<O!XQ&X
+M'X7K4??KP?H#B=C!^!\IPHE4)"!FQT0D)C4,ZS")R,'@$(E$)""X'X7K4?=L
+M)"#!^@.+1"0@P?@?*<*)5"0@P?H*B50D'&;'1"0F:AB-!(F-!("-!(")P<'A
+M!P^W5"0FB<B)TYGW^XG!J`]T"[\$````C6PD..L)OP,```"-;"1`O@````!F
+MA?\/A!0!``")R\'[!(/['`^/9`(```^WQHU$`QF)1"0,@_@@=S.#^!E_$K@!
+M````BDPD#-/@"40D,.LYD(-\)`P:?C&+1"0,2+H!````B,'3X@E4)##K'9"+
+M1"0,@^@A@_@3=Q"Z`0```(C!T^()5"0TC78`BT0D#$"#^`]W&@^WQ@^W1$4`
+MBTPD#(U,"0+3X`E$)%#K=HGVBT0D#(/H#X/X#W<<#[?&#[=$10"+3"0,C50)
+MXHC1T^`)1"14ZTZ)]HM$)`R#Z!^#^`]W'`^WQ@^W1$4`BTPD#(U4"<*(T=/@
+M"40D6.LFB?:+1"0,@^@O@_@&=Q@/M\8/MT1%`(M,)`R-5`FBB-'3X`E$)%Q&
+M#[?6#[_'.<(/C/'^__^+G"2`````BU,4BX(,F0``#0```/^)@@R9``"+0Q2+
+MD""9``"!R@```'")D""9``"+A"2`````BU@4BT0D','@%"4``/`_BU0D(('B
+M__\/``G0#0```$")@Z"9``"+E"2`````BT(4BTPD,(F(@)D``(N<)(````"+
+M4Q2+@H29```E``#P_XM<)#2!X___#P`)V(F"A)D``(N4)(````"+0A2+3"0P
+MB8B8F0``BX0D@````(M0%(N"G)D``"4``/#_"=B)@IR9``"+C"2`````BU$4
+MBT0D4(F"`)D``(M1%(M$)%2)@@29``"+412+1"18B8((F0``BUD4BX,,F0``
+M)0#`__^+5"1<@>+_/P``"=")@PR9``"+412+1"10B8*(F0``BU$4BT0D5(F"
+MC)D``(M1%(M$)%B)@I"9``"+612+@Y29```E`,#__XM4)%R!XO\_```)T(F#
+ME)D``(/$;%M>7UW#C78`5U93BW0D$(M$)!2Z````9/9``A!T!;H```#(]D`#
+M0'0$T>KK"F:#>`(`>0/!Z@(/MPB)T+H`````]_&)P[\?````B?:)V(GYT^BH
+M`74#3W7SN"8````I^(G'N!<```")PBGZL`&(T=/@`=BZ&````"GZB-'3Z(M>
+M%(N3%)@``('B__\!`,'@$0G"B9,4F```BUX4BY,4F```@>+_'_[_B?C!X`TE
+M`.`!``G"B9,4F```6UY?PXUV`(/L#(M4)!"+1"04@_@_=@6X/P```&:)@OP!
+M``"#[`2-1"0,4/^R-!```%+H_/___X/$',-55U93@^P4BVPD*(M<)"R)[_^U
+M>$0``/^U=$0``.C\____@\0(:B"-A7Q$``!0Z/S___]FBY7\`0``@\009H/Z
+M/WX%NC\```!F@_H^?PJY`````&:%TG4.BX4``@``9HN,``!2``"#[`2-1"0.
+M4(U$)!!0:@$/O\)0#[_!4%-5Z(0"``"#Q""Z`````(7`#X1H`@``@^P,_W0D
+M-%.-1"0>4(U$)"!05?^7N"H``(/$(+H`````A<`/A#\"``"#O<P!```'=#:#
+MO<P!```+="V#O<P!```*="2#O<P!```)=!N#O<P!```*=0IF@[W0`0```W8(
+M9H.'FD0```2^`````&:+A_`M``!F`81W?$0``&:#O'=\1```/W8*9L>$=WQ$
+M```_`$:#_@]VW6:#OYH0```!#X>F````9H.]T@$``$%W7`^W0P(ET````#W`
+M````=4QF@3NT"74C#[:/CA````^WAY@0```IP;AG9F9F]^F)T-'XP?D?9BG(
+MZQ(/MI>.$```N&=F9F;WZHG0T>B#[`@/M\!05>AT!P``@\00O@````"-'+4`
+M````BTT4BX=T1```#[=4L`+!XAB!R@``_P`/MP2PP>`(#/\E__\```G"B909
+M@*$``$:#_A]^Q8M-%`^WEX)$``"#XC_!XA@/MX>`1```@^`_P>`0"<(/MX=^
+M1```@^`_P>`("<(/MX=\1```@^`_"<*)D329``"+310/MY>*1```@^(_P>(8
+M#[>'B$0``(/@/\'@$`G"#[>'AD0``(/@/\'@"`G"#[>'A$0``(/@/PG"B9$X
+MF0``BTT4#[>7D$0``(/B/\'B&`^WAXY$``"#X#_!X!`)P@^WAYI$``"#X#_!
+MX`@)P@^WAXQ$``"#X#\)PHF1-*(``(M-%`^WEYA$``"#XC_!XA@/MX>61```
+M@^`_P>`0"<(/MX>41```@^`_P>`("<(/MX>21```@^`_"<*)D3BB``"+512#
+MO]@M```!&<"#X,"#P'^)@CR9``"Z`0```(G0@\0,6UY?7<.)]E575E.#[%2+
+M;"1LBT0D<&:)1"0FBU0D=&:)5"0DBW0D:(GQ@<%\1```B4PD(&;'1"0>/P!F
+MQT0D'#\`#[Y%!='@9HE$)!J+A"2`````9L<`P?^+5"1\9L<"/P!5_W0D;.C\
+M____B$0D(;L`````@\00BTPD8&:#N7`1````#X2%````#[9\)!&)^(/@^(E$
+M)`R-=@!F@[Q><A$```!T768/MD0D$68YA%YR$0``=!$/MX1><A$``(/@!PS@
+M.<=U/(G8P>`&C80PT!4``(/L"%`/MT4`4.A^!@``@\00@7PD#.````!U#F8Y
+M1"06=@YFB40D%NL'9HE$)!;K#$,/MX9P$0``.=A_C`^W10(ET````#W`````
+M#X6B````@&0D$?B`3"01`;L`````9H.^<!$````/A(\````/MGPD$8GZ@^+X
+MB50D")!F@[Q><A$```!T768/MD0D$68YA%YR$0``=!$/MX1><A$``(/@!PS@
+M.<=U/(G8P>`&C80PT!4``(/L"%`/MT4`4.C*!0``@\00@7PD".````!U#F8Y
+M1"04=@YFB40D%.L'9HE$)!3K&$,/MX9P$0``.=A_C.L*9HM,)!9FB4PD%/9%
+M`P%T"(J&BA```.L&BH:+$```@^P$#[[`4%7_="1LZ/S___^(1"0@@\00]D4"
+M0`^$TP$``(!]`@!Y)H/L#(U$)#Q0#[>&F!4``%"-AIH5``!05?]T)'SH9P8`
+M`(/$(.LD@^P,C40D/%`/MX9&%0``4(V&2!4``%!5_W0D?.A!!@``@\0@#[=4
+M)!(/OD0D$"G"#[=$)!8YPGX"B<*)T?9%`A!T0&:!OFP0````,'82#[>&>A``
+M``^_TCG0?@*)T(G!9H&^;!```/\_=AB`?0(`>1(/MX9\$```#[_1.=!^`HG0
+MB<$/MU0D-@^_P3G"?@*)PF:+1"0>T>")T68IP7D%N0````!F.TPD''X$BTPD
+M'(-\)'``#X3-````BT0D&&:)2`AFB4@&9HE(!&:)2`)FB0B)SXM$)#1F.<AV
+M`HG(BU0D&&:)0@J+1"089HL09HM$)#)F.=!V`HG0BU0D&&:)0@R+1"089HL0
+MBT0D,&8YT'8"B="+5"089HE"#HG"9H&^;!```/\_=D4/O]F`?0(`>0T/MX:`
+M$```.<-\#>L/#[>&?A```#G#?02)R.L6@'T"`'D)9HN&@!```.L'9HN&?A``
+M`(M,)!AFB4$>ZPN+3"089HL!9HE!'HM,)'@/OP&)ANPM``#K$HG/#[=$)#`/
+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
+M`CG:<LZ)]EM>7UW#C78`BTPD!(V1#"H```^W@=0!```E\````(/H,(/X/W<N
+MH:13``")@0PJ``"-!,"-!(6H4P``B4(<QT(8`0```,="#!0```#'0A!5````
+MPZ$D4@``B0*-!,"-!(4H4@``B4(<QT(8`0```,="#!0```#'0A`C````PXGV
+M55=64X/L#(M4)""+?"0D#[>"U`$``"7P````@^@P@_@_=TEJ`&HD:@&#[`QJ
+M!U+_DJPJ``"#Q!10Z(+C__^]`````+YK````N0````"[:P```(/$$(/X`75T
+M9KY3`+-3QT<0-P```.MEC78`:@!J)6H&@^P,:@=2_Y*L*@``@\044.@YX___
+MO0````"#Q!"^,@```(/X/W0#C7`$B>F#^#]T!;E`````C5DRB>J#^#]U!HU5
+M%(UV`(E7#(/X/W4(C4/QZP:-=@"-0P6)1Q"+5P2X`````#GJ<@0Y\G8-.<IR
+M!#G:=@6X`0```(/$#%M>7UW#D(M$)`0/OY#P+0```Y#L+0``BT@4P>()@>(`
+M?@``@,Z`B9$PF0``QX#`+0```0```,.-=@!75E.+?"00B?N-MPPJ``"X````
+M`(-^&``/A.@```"#O\`M```!#X75````BT<4BX`PF0``9H7`#XC#````B<+!
+MZAF)5@0E``"``<'H%X/X`G4<9H._T@$``$%V#@^WAY80```!T(E&!.L$@T8$
+M!0^WA]0!```E\````(/H,(/X/W<C@^P,5^B=`0``@\00BT8$.T84<@@K1A2)
+M1@3K!\=&!`````#'@\`M````````@^P(5E?H'_[__X/$$(7`=4"#[`A65^A"
+M````@\00A<!T+X/L"%97Z$T```"#Q!"%P'X>QX/`+0```@```,>#U"T```$`
+M``#'@[PM````````BX/`+0``6UY?PXGVBTPD"+@`````BU$$.U$,=@4[41!R
+M!;@!````PU93BUPD$(M$)`P/MX#4`0``)?````"#Z#"^H%,``(/X/W8%OB!2
+M``"+`XT$P(U$A@B)0QR+0P0[0Q!R6+K_____@SL`#X2N````BT,$B4,(.T,0
+M<C>#.P!T,HGVBQ-*B1.-%-*-%):+2QR+0A@K01#1X(M+""G!B4L(@\((B5,<
+M.TL0<@>#.P!UTHGVN@$```#K99"+0P2Z`````#M##'=7BP9(NO[___\Y`W1+
+MBT,$B4,(.T,,=SB+!D@Y`W,QD(L30HD3C132C126BTL<BT(8*T$0T>"+2P@I
+MP8E+"(/""(E3'#M+#'<'BP9(.0-RT+H"````C78`B=!;7L.-=@!75E.+7"00
+MC;,,*@``QT84`````&H`:B1J`8/L#&H'4_^3K"H``(/$%%#H0>#__X/$$(/X
+M`759BT8<#[\X:@!J(&H$@^P,:@=3_Y.L*@``@\044.@8X/__@\00@_\!=!J#
+M_P%R#(/_`G05@_\#=!GK'\=&%`````#K%HE&%.L1C40`^XE&%.L(T>")1A2-
+M=@!;7E_#55=64X/L%(MT)#"+7"0T5O]T)##H_/___XG%C7O_P>\#2X/C!X/$
+M$(7V?G*+1"0PP>`#B40D")"-##.#^0A^!;D(````N@$```#3XDJX`0```(C9
+MT^!(,<**3"0(T^*)T??1BT0D(",,N(E,)`2)Z(C9T^"*3"0(T^`AT`M$)`2+
+M5"0@B02ZC70>^+D(````*=G3[;L`````1X7V?YJ#Q`Q;7E]=PXGV55=64X/L
+M#(M$)"3V0`-`=!N#[`AH``(``/]T)"SH_/___XG'@\00ZU"-=@"+5"0D9H-Z
+M`@!Y&(/L"&@`!```_W0D+.C\____B<>#Q!#K*H/L"(M4)"P/MT("@^`0@_@!
+M&<`E_@```(/``E#_="0LZ/S___^)QX/$$+T`````@S\`?CR0C41M`(U$AR`/
+MME@(P>,"BU0D((MR%(/L#&H`#[9`"U!J#E=2Z/S___\/M\")A!X`AP``@\0@
+M13DO?\6+1"0D]D`"$`^%KP```(/L"&H(_W0D+.C\____B<>]`````(/$$(,X
+M``^.C@```(GVC41M`(UTAR`/MD8(C02%`(<``(E$)`B`?@4`=6.+5"0@BUH4
+M@^P,:@`/MD8+4&H.5U+H_/___P^WP(M4)"B)!!.#Q""`?@D`=#8/MD8)C02"
+MB40D"(M$)""+6!2#[`QJ`0^V1@M0:@Y7_W0D/.C\____#[?`BU0D*(D$$X/$
+M()!%.2\/CW?___^-=@"#Q`Q;7E]=PU575E.#[`2+3"08BT$4BX`<@```B<.!
+MXX`_``"+1"0<]D`#0'0>QP0D!`$``+X``!L`N!,```"_K`T``+T4````ZQR0
+MQP0DT@```+X``#8`N`D```"_2`T``+T*````BU$4"=@)\`T``(`?B8(<@```
+MBT$4BQ0DB9!P$```BT$4B;BP$```BTD4BX'P$```)?\#\/^)ZL'B"@G0B8'P
+M$```@\0$6UY?7<.0D)!55U93@^P4BWPD*(N'0"H``"7___]_4%?H_/___XG%
+MBT<4BU`PB=.!X_`#``#!ZP2)WH/$$(-\)"0`=!"X)0```"G8T>B--`/K"(GV
+M@_L"@];_.=YT&(M/%('B#_S__XGPP>`$)?`#```)PHE1,(/L"%57Z/S___\Y
+MW@^5P`^VP(/$'%M>7UW#5E.#[`2+3"00BU0D%`^W@>@!``"[`````#G0?B.#
+M[`3_="0<C012C02`C82!W"H``%!1Z/S___^)PX/$$(UV`(G8@\0$6U[#5E.#
+M[`2+3"00BU0D%`^W@>@!``"[`````#G0?B.#[`2-!%*-!("-A('<*@``4/]T
+M)"!1Z/S___^)PX/$$(UV`(G8@\0$6U[#55=64X/L#(ML)""+?"0DB>F-E>`!
+M``#'1"0("P```(/_`G0<@_\"=PN#_P%T5NF)````D(/_`W07@_\$="/K?`^W
+M<@A.@4PD",``!0#K=9`/MW((@^X"@4PD",`!!0#K8P^W<@B#[@.-!':-!("Z
+M_____X.\A>`J````#X7!````ZT&0O@`````/MT((B<.#^`!^%8T$=HT$@(.\
+M@>`J````=`5&.?-_ZP^W0@BZ_____SGP#X2(````ZPBZ_____^M_D(T$=HT$
+M@(V<@=PJ``"Z_____X-[!`!U9H/L"&H\4^C\____B7L$@\00@WPD*`!U-(M$
+M)`B)0PS'0Q0"````QT,8_____\=#'/\#``!FQT,@"@!FQT,B"@#'0S0`````
+MZQN-=@"+5"0HBT(PB4,T@^P$4E95Z/S___^#Q!")\HG0@\0,6UY?7<-3BTPD
+M"(M9%(N1R"H``('B_P,``(N!T"H``,'@$"4``/\#"<*)DZ0```"+612+D<PJ
+M``"!XO\#``"+@=0J``#!X!`E``#_`PG"B9.H````BUD4BX.L````)0#\__^+
+MD=@J``"!XO\#```)T(F#K````%O#D%=64XM\)!"+3"04#[>'Z`$``+X`````
+M.<AV58T$28T$@(V<A]PJ``"^`````(-[!`!T/<=#!`````"X_O___]/`(8?(
+M*@``(8?,*@``(8?0*@``(8?4*@``(8?8*@``4U?H)O___[X!````@\0(B?:)
+M\%M>7\.)]E575E.#[`B+;"0<BTPD((GNB[TT$```#[>%Z`$``+H`````.<@/
+MAG4#``"-!$F-!("-G(7<*@``N@$```"#>P0`#X19`P``@WL8_W4SA?]T%0^W
+M1P(EH````+H?````/:````!T!;H/````N`$````YT',/T>"#R`$YT'+WZP20
+MBT,8C3R-`````(G"@>+_`P``BT,<P>`*)0#\#P`)PHM#%,'@%"4``/`/"<*+
+M112)E#A`$```#[=#(L'@!"7P````#[=3((/B#PG0#0`@"`"+512)A#J`$```
+MQT0D!``(``#'!"0``0``@WLD`'0MBU,D@>+___\`BT,HP>`8"<*+112)E#C`
+M"```@WLH`1G2L@"!P@$)``")5"0$@WLP`'0>C3R-`````(M5%(M#,"7___\`
+M#0````&)A#H`"0``C3R-`````(M5%(M#+"7__P\`@WLL`'0%#0``$`")A#K`
+M$```@WLP`'0.]D,,('0(@4PD!``"``#V0PQ`=`J#9"0$\(-,)`0"]D0D!`]T
+M)?9##0%T!X-,)`1`ZP6#9"0$OX![#`!Y!X-,)`0@ZP:#9"0$WY#V0PX!=`>!
+M#"0``"``]D,.@'0'@0PD``(``/9##@1T#($,)```!`#K$XUV`/9##@)T"H$,
+M)````@"-=@#V0PX(=`>!#"0`0```]D,.$'0'@0PD```0`(M#!(/X`G0'@_@#
+M=!/K5X%,)`2B````@0PD```E`.M&@TPD!&*#>S``=3.+%0`````K%0````"+
+MAN`M```IT"L%`````,'@"HT\C0````"+510-`````8F$.@`)``"!#"0```0`
+MD/9#.`%T!X$,)```)`"-!(T`````BU44BWPD!(F\`L`)``"+512+/"2)O`(`
+M$0``@WLT`'0ZBU44C40)4(F"``L``(M5%(M#-(F"!`L``(M%%,>`"`L```D`
+M``"+512+A(K`"0``@,P0B82*P`D``/9##`%T#[@!````T^`)AL@J``#K#;C^
+M____T\`AAL@J``#V0PP!=!&X`0```-/@"8;,*@``ZP^)]KC^____T\`AALPJ
+M``#V0PP"=!&X`0```-/@"8;0*@``ZP^)]KC^____T\`AAM`J``#V0PP$=!&X
+M`0```-/@"8;4*@``ZP^)]KC^____T\`AAM0J``#V0PP(=!&X`0```-/@"8;8
+M*@``ZP^)]KC^____T\`AAM@J``!35>A\^___N@$```"#Q`B)T(/$"%M>7UW#
+MB?:+1"0(P>`"BU0D!(M2%(N$`@`(``##B?:+5"0(P>("BT0D!(M(%(M$)`R)
+MA!$`"```N`$```##D(M,)`B+1"0$BU`4N`$```#3X(F"0`@``+@!````PXGV
+M5E.+5"00P>("BT0D#(MP%(N$%@`*``")PX/C`W4:N`$```"*3"00T^"+ED`(
+M``"%PG0%NP$```")V%M>PXUV`%575E.#[`R+="0@BWPD)(M6%+@!````B?G3
+MX(F"@`@``+WH`P``B?975NC\____@\0(A<!T$(/L#&IDZ/S___^#Q!!-=>)7
+M5NC\____@\0(A<`/A/(```"#OLP!```'=#:#OLP!```+="V#OLP!```*="2#
+MOLP!```)=!N#OLP!```*#X7!````9H.^T`$```,/A[,```"[`````(M&%(N0
+M3(```,>``($``&0`"@"+3A3!Z@H/M\(-```!`(F!_(```(M&%(N`3(```,'H
+M"CG0=`9#@_L!=L.+5A2+@DB````-``!``(F"2(```(/L#&C(````Z/S___^+
+M5A2+@OR````E___^_XF"_(```(/$$+MD````ZQ!+=!N#[`QJ"NC\____@\00
+M5U;H_/___X/$"(7`=>*+5A2+@DB````E__^__XF"2(```(M&%,>`@`@`````
+M``"%[0^5P`^VP(/$#%M>7UW#D%575E.+;"0TBWPD/(MT)!B+1"04#[^`\"T`
+M``-$)"B#^#]V!;@_````BU0D'('B_P\``,'@$`G"]\<@````=`:!R@``@`"+
+M1"0XP>`9)0```!X)T/?'`0```'0%#0````'WQQ````!T!0T````@B48(BUPD
+M),'C%(M,)%#!X1F+5"1(P>(=BT0D3,'@&PG9"=$)P??'`@```'0&@<D````!
+MB4X,BT0D,,'@$"4```\`]\=`````=`.`S(")1A"+1"0LB484@_W_=!2)Z,'@
+M#24`X`\`"48,@4X(````0/?'#````'1+N`#_`'^*3"1`T_BZ`````*@!=#R)
+M^(/@"(/X`1G`]]`E````@/?'!````'0%#0``0``)1@B+1"1$)?]_```)1A"+
+M1"1`P>`4"484N@$```")T%M>7UW#C78`4XM$)!2+3"0<BUPD)(M4)`R%P'0;
+MP>`4)0``\``+0A"`S(")0A"+1"00P>`%"4(4A<ET'8G(P>`8)0````\+0A"`
+MS(")0A"+1"08P>`*"4(4A=MT&(G8P>`<"T(0@,R`B4(0BT0D(,'@#PE"%+@!
+M````6\.+1"0(@4@(````(,-3BT0D$(M,)!B+7"0<BU0D#(-\)!0`=!`+0@R%
+MR74#@,P0B4(,ZSF0A<ET&,=""`````")0@R+0Q")0A"+0Q2)0A3K',=""```
+M``"`S!")0@S'0A``````QT(4`````)#'0AP`````QT(8`````+@!````6\.-
+M=@"+3"0,BU0D"+@/````]D(<`0^$2P$``(M"'"7^'P``T>AFB0$/MT(:9HE!
+M`L9!!`"+0ABH`74=J`)T!,9!!`'V0A@(=`2`200"]D(8!'0%@$D$!)"+0APE
+M``!@`,'H%8A!"P^VP(/X`70F@_@!?PF%P'01ZU>-=@"#^`)T)X/X`W0VZTB*
+M0A2#X!^(007K/9"+0A0EX`,``,'H!8/(@(A!!>LID(M"%"4`?```P>@*@\B`
+MB$$%ZQ60BT(4)0"`#P#!Z`^#R("(006-=@"+0APE`.`?`,'H#8A!!HM"&"7P
+M````P>@$B$$'BT(8)0`/``#!Z`B(00@/MD$+@_@"="&#^`)_"(/X`70EZS&0
+M@_@#=2N+0A`E````#\'H&`!!")"+0A`E``#P`,'H%`!!"(M"$"4```\`P>@0
+M`$$(BT(8)0#P``#!Z`R(00F+0APE`````8/X`1G`@\`"B$$*N`````##D(M$
+M)`2+3"0(BQ$CD)Q$``")$??2(9"<1```PY!3@^P0BUPD&(V#@"H``%!3Z/S_
+M__^+0Q3'@"2!````````BT,4QX`H@0```````(M#%,=`0`````"+0Q3'@#"!
+M``````(`BT,4QX`X@0```````H/$&%O#4X/L$(M<)!B+0Q3'0$`&````C8.`
+M*@``4%/H_/___XM#%,>`)($```````"+0Q3'@"B!````````@\086\.)]E93
+MBW0D$(M<)`RZ`````)"-!)*-!$)FBX3#)"X``&8[!G4%B=#K/)"-!)*-!$*-
+MC,,@+@``9H-Y!`!U'&:+!F:)001FBT8"9HE!!HI&!(A!"(G0ZPZ-=@!"@_H_
+M=K*X`````%M>PXGVBT0D!(N`("X``,.04X/L$(M<)!B-@X`J``!04^C\____
+MC8-$*@``@\086\-75E.+?"00B?X/MH?C`0``@^`!B8<8+@``@^P(:``6``"-
+MAR0N``!0Z/S___^[`````(/$$(UV`(._S`$```9W$XT$FXT$0\:$QBPN```'
+MZQ&-=@"-!)N-!$/&A,8L+@```HT$FXT$0XT,QL>!."X``/0!``#'@3PN``#(
+M````QX%`+@``R````,>!1"X``&0```#'@4PN```H````QX%(+@``!P```(V!
+M("X``,9`$`#&0!$`BE`,B%`.QD`/`(.^&"X```!T%,>!:"X```S^OP#'@6PN
+M```X_[\`0X/[/P^&4O___X.^&"X```!T*HM7%(N&:"X``(F"+($``(M7%(N&
+M;"X``(F"-($``(/L#%?H_/___X/$$,>&'"X``&0```"#?"04`'0)@XX4+@``
+M`>L'@Z84+@``_EM>7\.)]E.#[`B+7"00@[L8+@```'0G@^P,4^C\____BT,4
+MQX`L@0```````(/$$(M#%,>`-($```````"0@\0(6\.-=@!55U93@>R,````
+MBY0DI````(N<)*@```"+K"2@````BX4@+@``B40D%+@`````@_H&#X?Z!```
+M_R25,%4``(G>N`````"#^P0/A^,$``"+E"2@````BTH4BY%0F```@>+__P_P
+MBX2=)$0``,'@%"4``/`/"<*)D5"8``"+O"2@````BT\4BY%<F```@>)_@/__
+MBX2=3$0``,'@!R6`?P``"<*)D5R8``"+3Q2+D5R8``"!XO]_P/^+A)TX1```
+MP>`/)0"`/P`)PHF17)@``(M/%(N16)@``('B__\#_(N$G6!$``#!X!(E``#\
+M`PG"B9%8F```BU0D%`^V0@DYV',(_X5$*@``ZQ*+3"04#[9!"3G8=@;_A4@J
+M``")\(M4)!2(0@GI!`0``,=$)$A_````C70D2,=&!#(```#'1"1`?P```,=$
+M)$0H````QT0D.'\```#'1"0\30```,=$)#!_````QT0D-$````#'1"0H'P``
+M`,=$)"P0````QT0D(#\```#'1"0D,````(7;#Y7`#[;`B40D$(N\)*````"+
+M3Q2+D6R8``"!XO\_X/^)P\'C`HL$,\'@#B4`P!\`"<*)D6R8``"+3Q2+D6R8
+M``"!XO__'_"+1!Q`P>`5)0``X`\)PHF1;)@``(M/%(N1:)@``('B__\!_XM$
+M'#C!X!$E``#^``G"B9%HF```BT\4BY%HF```@>+___^`BT0<,,'@&"4```!_
+M"<*)D6B8``"+3Q2+@6B8``"#X."+5!PH@^(?"=")@6B8``"+3Q2+D6R8``"`
+MYL"+1!P@P>`()0`_```)PHF1;)@``(-\)!``=!2+5Q2+@FR8``"#R`&)@FR8
+M``#K&8N$)*````"+4!2+@FR8``"#X/Z)@FR8``"#?"00``^4P`^VP(M,)!0/
+MME$,.=`/A'0"``"#?"00`'0(_X54*@``ZP;_A5@J``"#?"00`(M\)!0/E$<,
+MZ4T"``#'1"08"````(U4)!C'0@0&````A=L/E<`/MMB+A"2@````BT@4BX$(
+MH@``@^#`BQ2:@^(_"=")@0BB``"+5"04#[9"#3G8#X0!`@``A=MT"/^%7"H`
+M`.L&_X5@*@``BTPD%(A9#>GC`0``QT0D<`````#'1"1T!````,=$)'@(````
+MB=ZX`````(/[`@^'P`$``(N\)*````"+3Q2+D5B8``"!XO\/_/^+1)QPP>`,
+M)0#P`P`)PHF16)@``(M4)!0/MD(+.=AS"/^%9"H``.L2BTPD%`^V00LYV'8&
+M_X5H*@``B?"+5"04B$(+Z5T!``"-3"10B4PD#+X050``_+D(````BWPD#/.E
+MB=ZX`````(/[!P^'.0$``(N$)*````"+2!2+D229``"`X@&+1)Q0T>`E_@``
+M``G"B9$DF0``BU0D%`^V0@HYV',(_X5,*@``ZQ*+3"04#[9!"CG8=@;_A5`J
+M``")\(M4)!2(0@KIV@```(7;=4"#I10N``#]@^P,_[0DK````.C\____@\0$
+M_[0DK````.C\____@\0(@.3^4/^T)*P```#H_/___X/$$.F6````]H44+@``
+M`@^%B0```(.]&"X```!T5(/L#/^T)*P```#H_/___X/$"(#D_E#_M"2L````
+MZ/S___^+C"2P````BU$4BX5H+@``B8(L@0``BU$4BX5L+@``B8(T@0``B0PD
+MZ/S___^#Q!#K)8/L#/^T)*P```#H_/___X/$"(#,`5#_M"2L````Z/S___^#
+MQ!"#C10N```"N`$```"!Q(P```!;7E]=PU93@^P$BTPD$(G.BYD@+@``QT,0
+M`````(.Y&"X````/A(,```"!>Q0``,``=@K'0T0`````ZPR0N```P``K0Q2)
+M0T2!>QP``,``?@S'0T@`````ZPZ-=@"X``#``"M#'(E#2(M1%(M#1(F"+($`
+M`(M1%(M#2(F"-($``(M!%,>`,($``````@"+013'@#B!```````"@^P(C8:`
+M*@``4%'H_/___X/$$,=#/`````#'0T``````@\0$6U[#5U93BW0D$(N^-!``
+M`(N&%"X``(/@`X/X`P^%+0$``(N>("X``(!["0-W&8/L!`^V0PE`4&H!5NC\
+M____@\00Z0@!``"*0PHZ0PAS&(/L!`^VP$!0:@56Z/S___^#Q!#IZ````(N.
+ME"H``(G(@^!_@_@_=@B-07_!Z`?K"8N&E"H``,'H!SE#*'U(@'L,`'4B@^P$
+M:@!J`E;H_/___X/$#&H`:@56Z/S___^#Q!#IF@```(!["P$/AY````"#[`0/
+MMD,+0%!J!%;H_/___X/$$.MZ.4,D?3*`>PP`=!"#[`1J`6H"5NC\____@\00
+M@'L+`7=9@^P$#[9#"T!0:@16Z/S___^#Q!#K0X/L"%=6Z/S___^#Z`*#Q!"#
+M^`%W+H![#`!U$(/L!&H`:@)6Z/S___^#Q!"`>PL`=!*#[`1J`&H$5NC\____
+M@\00B?9;7E_#5U93BUPD$(N[-!```(N#%"X``(/@`X/X`P^%E0```(NS("X`
+M`(!^"0-W&8/L!`^V1@E`4&H!4^C\____@\00ZW.-=@"+DY0J``")T(/@?X/X
+M/W8(C4)_P>@'ZPF+@Y0J``#!Z`<Y1B1]'(!^"P%W1(/L!`^V1@M`4&H$4^C\
+M____@\00ZRZ#[`A74^C\____@^@"@\00@_@!=QF`?@L`=!.#[`1J`&H$4^C\
+M____@\00C78`6UY?PU=64XM<)!")W_^S-!```%/HU_7__XT4@(T44(VTTR0N
+M``")LR`N``"#Q`B#N]P!```!=0R#BQ0N```"ZPJ-=@"#HQ0N``#]@[O<`0``
+M`71L_X=T*@``@^P$:@!J`5/H_/___X/$#&H`:@53Z/S___^#Q`QJ`&H$4^C\
+M____@\0,:@!J`E/H_/___X/$#&H`:@-3Z/S___^)'"3H_/___X/$"(#,`5!3
+MZ/S___^)'"3HB/S__X/$$.DD`0``BX,4+@``@^`#@_@##X42`0``@WPD%`!T
+M6X/L!`^V1@E0:@%3Z/S___^#Q`P/MD8*4&H%4^C\____@\0,@'X,``^4P`^V
+MP%!J`E/H_/___X/$#`^V1@U0:@-3Z/S___^#Q`P/MD8+4&H$4^C\____@\00
+MZT>#[`1J!&H!4^C\____@\0,#[9&"%!J!5/H_/___X/$#&H!:@)3Z/S___^#
+MQ`QJ`6H#4^C\____@\0,:@)J!%/H_/___X/$$(._&"X```!T/8/L#%/H_/__
+M_X/$"(#D_E!3Z/S___^)'"3HGOO__XM#%,>`,($``````@"#Q!"+0Q3'@#B!
+M```````"ZR.#[`Q3Z';[__^)'"3H_/___X/$"(#,`5!3Z/S___^#Q!")]EM>
+M7\-75E.+="00BUPD%(GWBT84QX`D@0```````(M&%,>`*($```````"#[`B-
+MAH`J``!05NC\____BP.)AI0J``"+0P2)AI@J``"+0PB)AIPJ``"+1A2+D"R!
+M``"+B#2!``")T"4``,``@\00/0``P`!T#HG()0``P``]``#``'5ABY\@+@``
+M*U-$B=`K0SP!AVPJ``")4SR)RBM32(G0*T-``8=P*@``B5-`BT,\.T,4=@^#
+M[`Q6Z%K[__^#Q!"-=@"+0T`[0QQV#(/L#%;HD_S__X/$$(/L#%;H>_K__X/$
+M$%M>7\-3@^P(BUPD$(M$)!2+DR`N``"`>`41=2C_0CS_@VPJ``"+0CP[0A1V
+M0X/L#%/H_OK__XD<).@Z^O__@\00ZRV0@'@%&74F_T)`_X-P*@``BT)`.T(<
+M=A6#[`Q3Z"#\__^)'"3H#/K__X/$$)"#Q`A;PXUV`%93@^P$BW0D$(N.("X`
+M`(N6E"H``(G0@^!_@_@_=@F-0G_!Z`?K"I"+AI0J``#!Z`<Y02A\5CE!)'TU
+M@'D,`'03@^P$:@%J`E;H_/___X/$$.MQD(!Y"P!T,H/L!`^V00M(4&H$5NC\
+M____@\00ZU2`>0L`=!:#[`0/MD$+2%!J!%;H_/___X/$$.LX@'D*`'06@^P$
+M#[9!"DA0:@56Z/S___^#Q!#K'(!Y"0!T%H/L!`^V00E(4&H!5NC\____@\00
+MB?:#Q`1;7L.)]E575E.+5"04BT(4B[CL@```BZCP@```B[#X@```BYH@+@``
+M@WLX`'0%.7,X=@ZY`````/^">"H``.LID(GQ*TLXB>@K0S2)^BM3,"G!*=&X
+M*3E37_?IP?H.B<C!^!^)T2G!B?:)<SB)>S"):S2)R%M>7UW#55=64X/L#(M\
+M)""+5"0DB?V+GR`N``"+`HF'E"H``(M"!(F'F"H``(M""(F'G"H``(7;#X27
+M`0``5^A-____B<:#Q`2%P'D4_X=\*@``@^P,5^AI^/__@\00B?8!<Q"#O1@N
+M````#X28````@^P(C86`*@``4%?H_/___XM'%(N0+($``(N(-($``(/$$#E3
+M1'<-.4M(=D@Y4T1V'(UV`(M'%(M31(F0+($``(M'%,>`,($``````@`Y2T@/
+MA@X!``"+1Q2+4TB)D#2!``"+1Q3'@#B!```````"Z?`````K4T2)T"M#/`&%
+M;"H``(E3/(G**U-(B=`K0T`!A7`J``")4T"+AQ0N``"#X`.#^`,/A;H```"+
+MA1PN``"-!(`Y0Q!V1HM+$(G(#Z]#&+[336(0]^:)T,'H!CE#/'<>B<@/KT,@
+M]^:)T,'H!CE#0'<,@^P,5^AG_?__@\00@^P,5^A;]___@\00ZV:+0Q`[A1PN
+M``!V6XG"#Z]3%+C336(0]^*)T,'H!CE#/'86@^P,5^CG]___B3PDZ"/W__^#
+MQ!#K+HM#$`^O0QRZTTUB$/?BB=#!Z`8Y0T!V%H/L#%?H"?G__XD\).CU]O__
+M@\00B?:#Q`Q;7E]=PXM,)`2+5"0(BX$T$```9HL`9HD"BX$T$```@$@$"(!*
+M!`B+@300``!FBT`"9HE"`HN!-!```(I`!(A"!(N!-!```(I`!8A"!;@`````
+MPY"055=64X/L#(M\)""+;"0HBUPD++X`````C01VBT\4BQ3%8%4``(E4)`B+
+M5"0DC01"BP2%8%4``(M4)`B)!!%#]L,_=1"#[`QJ`>C\____@\00C78`1H/^
+M#7:^O@````"0BT\4BQ3UP%8``(L$]<16``")!!%#]L,_=0Z#[`QJ`>C\____
+M@\00D$:#_D=VTKX`````D(T$=HM/%(L4A:!:```!Z(L$A:!:``")!!%#]L,_
+M=0V#[`QJ`>C\____@\001H/^/W;.@\0,6UY?7<.)]E575E.#[!"+;"0DBU0D
+M*`^W0@)0#[<"4%7H_/___X/$$(M<)"2`>P(`>6D/O_"-'';!XP*-LR1A``"#
+M[`AJ"/]V!.C\____B<>!Y_\```#!YP6+@R1A``#!X`0)QV:+3@B+512+@@2B
+M``"#Q!"+7"0D9H$[M`EU#(/($(F"!*(``.L8D(M5%(/@[XF"!*(``.L)B?:)
+MP;\`````9H'YD`!_!?;!`70E@^P(:@@/O\&#Z!A0Z/S___^)PX'C_P```+@!
+M````@\00ZRZ)]H/L"&H(#[_!@^@8B<+!ZA\!T-'X4.C\____B<.!X_\```"X
+M`````(/$$(GVP>,"T>`)PX'+`00``(M-%(GX)?\```#!X`@/MM,)T(F!G)@`
+M`(M-%(GX)0#_```/MM<)T(F!T)@``(M$)"2)A300``"X`0```(/$#%M>7UW#
+MC78`BU0D"(M$)`2+@.@M``"#^@=W(?\DE6AB``")]H/`1,.#P$C#@\!,PX/`
+M4,,%E````,.)]K@`````PXGV55=64X/L?(NL))````"+A"28````9HE$)!Z)
+M;"08OP````"+E"24````#[="`B7P`0``/<`````/A.`!```]P````'\0/:``
+M```/A%,!``#I00(``#U``0``=`L]4`$```^%+P(``(N4))0```!FBP(MH0\`
+M`&8]Z@1W)8M$)!AFBX!0$0``9HE$)`Z+5"089HN24A$``&:)5"0,Z:P```"+
+ME"24````9HL"+8P4``!F/>\`=R*+1"089HN`5!$``&:)1"0.BU0D&&:+DE81
+M``!FB50D#.MUBY0DE````&:+`BU\%0``9CW@`'<BBT0D&&:+@%@1``!FB40D
+M#HM4)!AFBY):$0``9HE4)`SK/HN$))0```!F@3A<%G8BBU0D&&:+DEP1``!F
+MB50D#HM$)!AFBX!>$0``9HE$)`SK#F;'1"0,``!FQT0D#@``QT0D"`````"^
+M`````(M4)!AFBY+4$```9HE4)!:+1"089HN`VA```&:)1"04BU0D&&:#NMH0
+M````#Y3`9@^VP&:)1"029HN"*!$``&:)1"00Z?T```"+5"089HN28!$``&:)
+M5"0.BT0D&&:+@&(1``!FB40D#(M4)!@/M[)H$0``#[>";!$``(E$)`AFBY+6
+M$```9HE4)!:+1"089HN`W!```&:)1"04BU0D&&:#NMP0````#Y3`9@^VP&:)
+M1"029HN"*A$``&:)1"00Z8(```"+5"089HN29!$``&:)5"0.BT0D&&:+@&81
+M``!FB40D#(M4)!@/M[)J$0``#[>";A$``(E$)`AFBY+8$```9HE4)!:+1"08
+M9HN`WA```&:)1"04BU0D&&:#NMX0````#Y3`9@^VP&:)1"029HN"+!$``&:)
+M1"00ZPJX`````.E5`P``NP`````/MU0D'KD`60``D(T$6XT$0HL$@8E$G"!#
+M@_L0=NV+E"24````@'H"`'DJ@^P,:@!J=VH#5HU<)#Q3Z/S___^#Q!1J`&IZ
+M:@/_="0@4^C\____@\0@NP````"0C01;BTT4BQ3%`%D``(M$G"")!!%']\<_
+M````=0^#[`QJ`>C\____@\00B?9#@_L0=LZ[`````(M-%(L4W:!=``"+!-VD
+M70``B0011_?'/P```'4-@^P,:@'H_/___X/$$$-TT[L`````#[=T)!Z-!%N+
+M312+%,6H70``C01&BP2%J%T``(D$$4?WQS\```!U#8/L#&H!Z/S___^#Q!!#
+M=,V[``````^W="0>C01;BTT4BQ3%P%T``(T$1HL$A<!=``")!!%']\<_````
+M=0V#[`QJ`>C\____@\000W3-NP`````/MU0D'KG@70``C78`C01;C01"BP2!
+MB42<($.#^Q!V[8N4))0````/MT(")4`!```]0`$``'4]@^P,:@-J,VH!BU0D
+M,`^W@L@1``!0C5PD/%/H_/___X/$%&H#:BUJ`8M4)#`/MX+*$0``4%/H_/__
+M_X/$((/L#&H`:E]J`0^W1"0J4(U<)#Q3Z/S___^#Q!1J`&I@:@0/MT0D+E!3
+MZ/S___^#Q!1J`&IH:@,/MT0D)E!3Z/S___^#Q!1J`&IK:@,/MT0D)%!3Z/S_
+M__^[`````(/$()"-!%N+312+%,7@70``BT2<((D$$4?WQS\```!U#X/L#&H!
+MZ/S___^#Q!")]D.#^Q!VSKL`````#[=4)!ZY@%\``(UV`(T$6XT$0HL$@8E$
+MG"!#@_L'=NV#[`QJ`&H=:@8/MT0D*%"-7"0\4^C\____@\04:@!J!&H!#[=$
+M)"Q04^C\____@\0@BX0DE````&:#>`(`>`;V0`-`=%2+E"24````#[="`B4`
+M0```@_@!&=N#XP^#PQ"#[`QJ`&H3:@5J'XUT)#Q6Z/S___^#Q!1J`&H8:@53
+M5NC\____@\04:@!J,6H":@-6Z/S___^#Q""[`````(UV`(T$6XM-%(L4Q8!?
+M``"+1)P@B0011_?'/P```'4/@^P,:@'H_/___X/$$(GV0X/[!W;.BT0D&,>`
+MP"T```````"X`0```(/$?%M>7UW#C78`55=64XML)!2+3"08BWPD'(M<)""+
+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
+MH&(``'<,N*!B``!"9CL,D';Y#[\$E:)B``##5E.#[!"+="0@BUPD'&BT````
+MZ/S___^)@^@M``"#Q!"%P'4,QP8"````Z84```"0QX-X1```@````(/L#&B`
+M````Z/S___^)@W1$``"#Q!"%P'4(QP8"````ZUC'@Z0J```H;0$`QX.H*@``
+M)%X!`,>#K"H``$!@`0#'@[`J``#T7@$`QX.T*@``?&`!`,>#N"H``!!G`0#'
+M@[PJ``"`;0$`QX/`*@``B&T!`+@!````C78`@\0$6U[#D)!55U93@^P,BWPD
+M((ML)"B+7"0LO@````"-!':+3Q2+%,7@8@``B50D"(M4)"2-!$*+!(7@8@``
+MBU0D"(D$$4/VPS]U$(/L#&H!Z/S___^#Q!"-=@!&@_X/=KZ^`````)"+3Q2+
+M%/5@9```BP3U9&0``(D$$4/VPS]U#H/L#&H!Z/S___^#Q!"01H/^1';2O@``
+M``"0C01VBT\4BQ2%H&8```'HBP2%H&8``(D$$4/VPS]U#8/L#&H!Z/S___^#
+MQ!!&@_X_=LZ#Q`Q;7E]=PXGV55=64X/L#(ML)""+="0DQT0D"`````"_````
+M`&:!/K\2#X?-````#[<&B40D!"V0"```N@4```")TYGW^X72=2.+1"0$C9P`
+MX.[__[AG9F9F]^O!^@*)V,'X'XG3*</K18UV``^W#HV!4/?__[H%````B=.9
+M]_NX`````(72#X4<`@``C9P)H.[__[AG9F9F]^O!^@*)V,'X'XG3*</'1"0(
+M`0```,'C`H'C_P```(/L"&H(4^C\____B<.+512+@@2B``"#Q!!F@3ZT"741
+M@\@0B8($H@``Z7\!``"-=@"+512#X.^)@@2B``#I:P$``(UV`&:+#KL%````
+MN@````")R&;W\V:#^@)U3&:!^3L5=T6#Z0*#[`AJ"`^WR8T,B8V,"8!$__^X
+M'X7K4??IB=#!^`/!^1\IR$!0Z/S___^)PX/$"&H":@#H_/___XG'@\00Z00!
+M``!FBP:Y%````+H`````9O?Q9H72=4=F@3[_$W9`@^P(:@@/MPZ!Z<`2``"X
+M9V9F9O?IB=#!^`/!^1\IR,'@`E#H_/___XG#@\0(:@)J`^C\____B<>#Q!#I
+MJ````&:+!KD*````N@````!F]_%FA=)U/X/L"&H(#[<.@>G`$@``N&=F9F;W
+MZ8G0P?@"P?D?*<C1X%#H_/___XG#@\0(:@)J`NC\____B<>#Q!#K5XUV`&:+
+M!KD%````N@````!F]_&X`````&:%TG5^@^P(:@@/MPZ!Z<`2``"X9V9F9O?I
+MB=#1^,'Y'RG(4.C\____B<.#Q`AJ`FH!Z/S___^)QX/$$(UV`(G9P>$$C02]
+M``````G!BT0D"-'@"<&!R0$0``"+510/ML&)@IR8``#!Z0B+512)R(/@?XF"
+MV)@``(FU-!```+@!````@\0,6UY?7<.+5"0(BT0D!(N`Z"T``(/Z!W<=_R25
+MV&X``(GV@\`$PX/`",.#P`S#!:P```##B?:X`````,.)]E575E.#[!R+1"0X
+M9HE$)!J+5"0PB50D%&;'1"00``!FQT0D#@``9L=$)`P``&;'1"0*``"+NN@M
+M``"!P@PJ``")5"0$O0````"+5"0T#[="`B7P`0``/=`````/A&,!```]T```
+M`'\;/:`````/A!@!```]P`````^$1@$``.EO`0``/5`!``!T'CU0`0``?PP]
+M0`$``'00Z54!```]``@```^%2@$``(M4)#1FBP(MH0\``&8]Z@1W)8M$)!1F
+MBX!0$0``9HE$)!"+5"049HN24A$``&:)5"0.Z9,```"+5"0T9HL"+8P4``!F
+M/>\`=R*+1"049HN`5!$``&:)1"00BU0D%&:+DE81``!FB50D#NM?BU0D-&:+
+M`BU\%0``9CW@`'<BBT0D%&:+@%@1``!FB40D$(M4)!1FBY):$0``9HE4)`[K
+M*XM$)#1F@3A<%G8@BU0D%&:+DEP1``!FB50D$(M$)!1FBX!>$0``9HE$)`Z+
+M5"049HNRVA```&:+@B@1``!FB40D$NMQBU0D%&:+DF@1``!FB50D#(M$)!1F
+MBX!L$0``9HE$)`J+5"049HNRW!```&:+@BH1``!FB40D$NLXBU0D%&:+DFH1
+M``!FB50D"F:)5"0,BT0D%&:+L-X0``!FBY`L$0``9HE4)!+K"K@`````Z?$$
+M``"Z`````+FD:0``BP31B0270G3WN@`````/MTPD&KNH:0``C012C01!BP2#
+MB427!$)T\+H`````#[=,)!J[P&D``(T$4HT$08L$@XE$EPA"=/"Z``````^W
+M3"0:N^!I``"-!%*-!$&+!(.)1)<,0H/Z)W;M@^P,:@!H+@$``&H!#[?&4(U?
+M#%/H_/___X/$%&H`:`X!``!J`HM4)%0/MP)04^C\____@\04:@!H`0$``&H"
+MBU0D5`^W0@)04^C\____@\0@BT0D-/9``D`/A+<```"#[`QJ`VBH````:@&+
+M5"0<BT(<#[]``E!3Z/S___^#Q!1J`VBI````:@&+5"0<BT(<#[]`!%!3Z/S_
+M__^#Q!1J`VBJ````:@&+5"0<BT(<#[]`!E!3Z/S___^#Q!1J`VBN````:@&+
+M5"0<BT(<#[]`"%!3Z/S___^#Q!1J`VBO````:@&+5"0<BT(<#[]`"E!3Z/S_
+M__^#Q!1J`VBP````:@&+5"0<BT(<#[]`#%!3Z/S___^#Q""+1"0T@'@"`'DX
+M@^P,:@!H'P$``&H##[=$)"10C5\,4^C\____@\04:@!H(@$``&H##[=$)")0
+M4^C\____@\0@ZS:#[`QJ`&@7`0``:@,/MT0D*%"-7PQ3Z/S___^#Q!1J`&@:
+M`0``:@,/MT0D)E!3Z/S___^#Q""+5"0P#[>"U`$``"7P````@^@P@_@_=W5F
+M@[K4`0``-70>9H.ZU`$``$5T%&:#NM0!``!&=`IF@[K4`0``-G5-@^P,:@)J
+M6FH":@*-7PQ3Z/S___^#Q!1J`FI<:@)J`E/H_/___X/$%&H":EYJ`FH"4^C\
+M____@\04:@)H_@```&H!:@)3Z/S___^#Q""+1"0P9H.XT@$``$%V9(/L#&H!
+M:!D!``!J`6H!C5\,4^C\____@\04:@-J`6H":@%3Z/S___^#Q!1J`VH#:@)J
+M`5/H_/___X/$%&H#:(L```!J`6H!4^C\____@\04:@-HC````&H!:@%3Z/S_
+M__^#Q""Z``````^W3"0:NZ!M``"0C012C01!BP2#B827K````$*#^@QVZHM4
+M)#3V0@)`=".#[`QJ`&HE:@*+5"0<BT(<#[\`4(V'K````%#H_/___X/$((/L
+M#&H`:@YJ!@^W1"0J4(V'K````%#H_/___X/$((M$)#3V0`-`=0=F@W@"`'E"
+MBU0D-`^W0@(E`$```(/X`1G;@^,'@\,(@^P,:@!J.FH$:@^-MZP```!6Z/S_
+M__^#Q!1J`&I&:@135NC\____@\0@NP````"+1"0PBT@4BQ3=H&D``(L$GXD$
+M$47WQ3\```!U#8/L#&H!Z/S___^#Q!!#=-.[`````(T$6XM4)#"+2A2+%,6H
+M:0``BT2?!(D$$47WQ3\```!U#8/L#&H!Z/S___^#Q!!#=,^[`````(T$6XM4
+M)#"+2A2+%,7`:0``BT2?"(D$$47WQ3\```!U#8/L#&H!Z/S___^#Q!!#=,^[
+M`````)"-!%N+5"0PBTH4BQ3%X&D``(M$GPR)!!%%]\4_````=0^#[`QJ`>C\
+M____@\00B?9#@_LG=LJ[`````)"-!%N+5"0PBTH4BQ3%H&T``(N$GZP```")
+M!!%%]\4_````=1"#[`QJ`>C\____@\00C78`0X/[#';&BT0D%,>`P"T`````
+M``"X`0```(/$'%M>7UW#C78`55=64X'L_`,``(N$)!`$``")1"08#[>`U`$`
+M`"7P````@^@P@_@_=S:+5"089H.ZU`$``#5T'F:#NM0!``!%=!1F@[K4`0``
+M1G0*9H.ZU`$``#9U"L=$)!0"````ZPC'1"04`0```(N,)!P$```/MT$")?`!
+M```]T````'1I/=````!_$#V@````=$$]P````'14ZVP]4`$``'07/5`!``!_
+M"3U``0``=`GK53T`"```=4Z+1"08!=`=``")1"0,BTPD&`^WD=00``#K/HM$
+M)!@%W!T``(E$)`R+3"08#[>1UA```.LDBT0D&`7H'0``B40D#(M,)!@/MY'8
+M$```ZPJY`````.GW!0``BTPD#`^W00:Y`````(7"#X3B!0``BY0D&`0```^_
+M`M'@9HE$)`2+C"04!```#[\!T>!FB40D!F;'1"0HK=YFQT0D*JW>QT0D"```
+M``"^`````(M$)`P/MU`&C5PD*(UV`(G0B?'3^*@!=!B#?"0(`0^'T00``(M$
+M)`AFB31#0(E$)`A&@_X#=MB#[`R-1"0P4(U$)#!0BU0D(`^W0@10_S*+C"0X
+M!```#[<!4.B<!0``QT0D*`````"+;"1`@\0@.VPD)`^']0$``(UV`(U$K0"-
+M1(4`BTPD#(M1"(T$@HE$)!!F@7PD*JW>#X67````#[=T)"B-'+:-')B#[`0/
+MMWL&C30_5HU#"%"-A"3<`@``4.C\____@\0,5H/#$%.-E"2\`@``4NC\____
+M@\0$C4PD/%&+5"0@#[]"`E"-C"3$`@``48V$).@"``!05^B*!0``@\0@A<`/
+MA/,#``"#[`1H@````(U4)#A2BT0D%,'@!XV$!+P!``!0Z/S___^#Q!#I*0$`
+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
+M1"0"0``/OT9^BTPD*`^_$2G0@_A^?@YFBVY^@^U^9HEL)`[K#(M$)"AFBP!F
+MB40D#F:+5GYFB50D#+D_````#[]6?@^_1"0,2#G"?A.)PDD/O\$/OP1&.=!^
+M!6:%R7GOBVPD*&:+17Z+5"0P9HD"OS\```"+7"0,C78`BVPD,&8Y70!]#F:%
+MR7499H-\)`)`=1&09L=$)`(``(MT)"BY/P```&:%R7X:#[_!9CD<1GP1B?9)
+M9H7)?@D/O\%F.1Q&??%FA<EU)&:#?"0"`'4<9H7_>#@/O]>+3"0L9HM$40)F
+MB0119D]Y[.LBD`^_[XEL)`1FBT0D`@G(BU0D+&:)!&J#ZP)F3P^);____P^_
+M1"0.@\006UY?7<.)]E.#[`B+7"00@[MT1````'0;@^P,_[-T1```Z/S____'
+M@W1$````````@\00@[OH+0```'0;@^P,_[/H+0``Z/S____'@^@M````````
+M@\00@\0(6\.-=@!55U93BWPD&&:+=P2]`````+D!````B?:-!(F-'(</MU,$
+M#[_&.<)]!HG-9HMS!$&#^0-^XXU$K0"-!(=FBU@09HMP"+D!````C42M`-'@
+MD(T4"&8Y7%<0?0IFBUQ7$&:+=%<(08/Y`W[FC00V9BG#B=B86UY?7<-55U93
+M@^P(BWPD((M4)!R+1"0D9L<````/MT<")4`!```]0`$``'44BT0D'`70'0``
+MBU@(#[=0!.M2B?8/MT<")=`````]P````'0'/=````!U$8V"T!T``(M8(`^W
+M4!SK*HGV#[='`B6@````N0$````]H`````^%NP$``(V"T!T``(M8%`^W4!")
+M]KD`````A=(/CI\!``!FBP]F.PMR$XT$DHT$@F8[3(.L=F9F.PMS+9!FBT,"
+MBU0D)&:)`E/_="0@Z+_^__^+3"0P9HD!N0$```"#Q`CI6P$``(UV`(T$DHT$
+M@HU$@ZQFBU`"BTPD)&:)$5#_="0@Z(G^__^+5"0P9HD"N0$```"#Q`CI)0$`
+M`)"]`````+D`````.=%](F:+!XG&9CL#=AB)R$&)Q3G1?0^-!(F-!(%F.S2#
+M=^N-=@"-!(F-!('!X`*)1"0$#[<T&(U$K0"-1(4`P>`"B00D#[<L&"GNA?8/
+MCH0```"+1"0$#[],&`*+!"0/OU08`BG1#[<'*>@/K\$/K]8!T)GW_F:8BU0D
+M)&:)`HM$)`0!V%#_="0@Z-O]__\/O^@#7"0(4_]T)"CHROW__Y@IQ0^W%P^W
+M`RG"B=</K_U3_W0D,.BP_?__F`^OQHT$!YGW_F:8BTPD0&:)`;D!````@\08
+MZT.-!(F-!(&-%(4`````9HL'N0````!F.P0:=2AFBT0:`HM,)"1FB0&-!!I0
+M_W0D(.A?_?__BU0D,&:)`KD!````@\0(B<B#Q`A;7E]=PXGV55=64X/L"(ML
+M)!R+="0@BWPD),<$)`$```"[`````#G[<SV0C40D!E"-1"0(4(T$WE!5Z(3]
+M__^#Q!"%P'05BT0D!(A$W@9FBT0D!HA$W@?K"8GVQP0D`````$,Y^W+$BP0D
+M@\0(6UY?7<.05E.#[!"+="0@BUPD'&C@````Z/S___^)@^@M``"#Q!"%P'4,
+MQP8"````Z8T```"0QX-X1```@````(/L#&B`````Z/S___^)@W1$``"#Q!"%
+MP'4(QP8"````ZV#'@WA$``!`````QX.D*@``S(,!`,>#J"H``'!N`0#'@ZPJ
+M``#H<0$`QX.P*@``0&\!`,>#M"H``"!R`0#'@[@J```8>0$`QX.\*@``X(8!
+M`,>#P"H```````"X`0```)"#Q`1;7L.0D%575E.#[`R+?"0@BVPD*(MT)"R[
+M`````(T$6XM/%(L4Q0!O``")5"0(BU0D)(T$0HL$A0!O``"+5"0(B0011O?&
+M/P```'4-@^P,:@'H_/___X/$$$.#^P]VOKL`````D(M/%(L4W8!P``"+!-V$
+M<```B0011O?&/P```'4/@^P,:@'H_/___X/$$(GV0X'[B@```';+NP````")
+M]HT$6XM/%(L4A>!T```!Z(L$A>!T``")!!%&]\8_````=0Z#[`QJ`>C\____
+M@\00D$.#^S]VRH/$#%M>7UW#B?955U93@^P,BVPD((MT)"3'1"0(`````+\`
+M````9H$^OQ(/A\T````/MP:)1"0$+9`(``"Z!0```(G3F??[A=)U(XM$)`2-
+MG`#@[O__N&=F9F;WZ\'Z`HG8P?@?B=,IP^M%C78`#[<.C8%0]___N@4```")
+MTYGW^[@`````A=(/A1P"``"-G`F@[O__N&=F9F;WZ\'Z`HG8P?@?B=,IP\=$
+M)`@!````P>,"@>/_````@^P(:@A3Z/S___^)PXM5%(N"!*(``(/$$&:!/K0)
+M=1&#R!")@@2B``#I?P$``(UV`(M5%(/@[XF"!*(``.EK`0``C78`9HL.NP4`
+M``"Z`````(G(9O?S9H/Z`G5,9H'Y.Q5W18/I`H/L"&H(#[?)C0R)C8P)@$3_
+M_[@?A>M1]^F)T,'X`\'Y'RG(0%#H_/___XG#@\0(:@)J`.C\____B<>#Q!#I
+M!`$``&:+!KD4````N@````!F]_%FA=)U1V:!/O\3=D"#[`AJ"`^W#H'IP!(`
+M`+AG9F9F]^F)T,'X`\'Y'RG(P>`"4.C\____B<.#Q`AJ`FH#Z/S___^)QX/$
+M$.FH````9HL&N0H```"Z`````&;W\6:%TG4_@^P(:@@/MPZ!Z<`2``"X9V9F
+M9O?IB=#!^`+!^1\IR-'@4.C\____B<.#Q`AJ`FH"Z/S___^)QX/$$.M7C78`
+M9HL&N04```"Z`````&;W\;@`````9H72=7Z#[`AJ"`^W#H'IP!(``+AG9F9F
+M]^F)T-'XP?D?*<A0Z/S___^)PX/$"&H":@'H_/___XG'@\00C78`B=G!X02-
+M!+T`````"<&+1"0(T>`)P8')`1```(M5%`^VP8F"G)@``,'I"(M5%(G(@^!_
+MB8+8F```B;4T$```N`$```"#Q`Q;7E]=PU575E.#[`R+;"0@BT0D*&:)1"0*
+MB6PD!+\`````B[7H+0``BT0D)`^W0`(E\`$``#W`````=#H]P````'\)/:``
+M``!T"^M+/=````!T(^M"BT0D!&:+@&`1``!FB40D`HM$)`1FBX!B$0``9HD$
+M).LKBT0D!&:+@&01``!FB40D`HM$)`1FBX!F$0``9HD$).L*N`````#IX0$`
+M`+H`````N>1W``"+!-&)!)9"=/>Z``````^W3"0*N^AW``"-!%*-!$&+!(.)
+M1)8$0G3PN@`````/MTPD"KL`>```C012C01!BP2#B426"$)T\+H`````#[=,
+M)`J[('@``(T$4HT$08L$@XE$E@Q"@_H:=NV#[`QJ`&BH````:@,/MT0D&E"-
+M7@Q3Z/S___^#Q!1J`&BE````:@,/MT0D&%!3Z/S___^Z`````(/$(`^W3"0*
+MN\!Z``"-!%*-!$&+!(.)1)9X0H/Z`G;MNP````"+312+%-W@=P``BP2>B001
+M1_?'/P```'4-@^P,:@'H_/___X/$$$-TU[L`````C01;BTT4BQ3%Z'<``(M$
+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
+M`<4IU8M$)`2)1"08.>AV!(EL)!@/OT0D&(G#.<A^)8M4)"3!X@:0C00*08MT
+M)"AFBX1&``0``(MT)'QFB01^1SG+?^.+1"0DP>`&`T0D!(M<)"AFBY1#_@,`
+M`(G3BW0D*&8KG$;\`P``B=AFA=MU!;@!````B<,[;"08=E8/O\4YR'Y/BT0D
+M),'@!@-$)`2+5"0HC01"B40D#)")R"M$)!@/M],/K\*+="0,9@.&_@,``(G^
+M1XG"9H/X?WX%NG\```"+1"1\9HD4<$$/O\4YR'_)D/]$)"2+5"0<.50D)`^"
+M%O[__X-\)"0#=QZ-=@"+3"0DBUPD=&:+1$O^9HD$2T&)3"0D@_D#=N6#_W]W
+M$XMT)'QFBT1^_F:)!'Y'@_]_=NV#Q$Q;7E]=PY!55U93@^PLBWPD0(M,)$R)
+M_8NW=$0```^W00(ET````#W`````=`<]T````'4(C9WX)0``ZQ\/MT$"):``
+M``"Z`````#V@````#X4'`0``C9_D(0``BT<4BX!LH@``@^`/9HD$)%;_="14
+MC40D(%"-1"0B4`^W1"004%,/MP%05^B3^O__BT\4BY%8H@``@.8_#[=#'$C!
+MX`XE`,````G"B9%8H@``@\0@9H-\)!8`=!!FBT0D%O?89HF%\"T``.L)9L>%
+M\"T`````NX"B``"Y``````^V%,X/MD3.`L'@"`G"#[9$S@3!X!`)P@^V1,X&
+MP>`8"<*+1Q2)%!B#PP1!@_D?=L^+7Q2+%"2#X@\/MT0D&,'@!"7P`P``"<*-
+M3"08#[=!`L'@"B4`_```"<(/MT$$P>`0)0``/P`)P@^W00;!X!8E``#`#PG"
+MB9-LH@``N@$```")T(/$+%M>7UW#4X/L"(M<)!"#NW1$````=!N#[`S_LW1$
+M``#H_/___\>#=$0```````"#Q!"#N^@M````=!N#[`S_L^@M``#H_/___\>#
+MZ"T```````"#Q!"#NZ`J````=!N#[`S_LZ`J``#H_/___\>#H"H```````"#
+MQ!"#Q`A;PXUV`%.+7"0,N@````"Y`P```)")R"G0C01`C03#9H-X"`!T!P^_
+M0!3K#)!"@_H#=N*X`````%O#C78`4XM<)`RZ`````(GVC0Q29HM$RPAFA<!T
+M#P^WP(T$B`^_1$,2ZPV)]D*#^@-VWK@`````6\.-=@!55U93@^P(BVPD((M4
+M)!R+1"0D9L<````/MT4")=`````]P````'0'/=````!U"8V"^"4``.LAD`^W
+M10(EH````+X`````/:`````/A0L"``"-@N0A``"09HM(%(UX&+X`````9H7)
+M#X3O`0``9HM=`&8['W(:#[?1C022C02`C01"9CM<1YIV=68['W,QB?97_W0D
+M(.@N____BU0D+&:)`E?_="0HZ.7^__^+5"0X9HD"O@$```"#Q!#IG0$```^W
+MP8T<@(T<FXT<6(U<7YI3_W0D(.CO_O__BU0D+&:)`E/_="0HZ*;^__^+5"0X
+M9HD"O@$```"#Q!#I7@$``+L`````N@`````/M\&)QH/X`'XF9HM%`(G!9CL'
+M=AN-=@")T$*)PSG6?@^-!)*-!("-!$)F.PQ'=^B-!)*-!("-!$*-#``/MP0Y
+MB40D!(T$FXT$@(T$0XT<``^W!#LI1"0$@WPD!``/CJ@```"--#E6_W0D(.A0
+M_O__F(E$)`@!^U/_="0HZ#_^__^8*40D$`^W50`/MP,IPHG7#Z]\)!!3_W0D
+M,.@@_O__F`^O1"0<C00'F?=\)!QFF(M4)#QFB0)6_W0D..C'_?__#[_P@\0@
+M4_]T)"#HM_W__Y@IQ@^W50`/MP,IP@^O\E/_="0HZ)[]__^8#Z]$)!2-!`:9
+M]WPD%&:8BU0D.&:)`KX!````@\00ZTF-!)*-!("-!$*-%`!FBT4`O@````!F
+M.P0Z=2Z-'#I3_W0D(.B-_?__BU0D+&:)`E/_="0HZ$3]__^+5"0X9HD"9KX!
+M`(/$$(GVB?"#Q`A;7E]=PXGV55=64X/L"(ML)!R+="0@BWPD),<$)`$```"[
+M`````#G[<SV0C40D!E"-1"0(4(T$WE!5Z&#]__^#Q!"%P'05BT0D!(A$W@9F
+MBT0D!HA$W@?K"8GVQP0D`````$,Y^W+$BP0D@\0(6UY?7<.05E.#[!"+="0@
+MBUPD'&B$````Z/S___^)@^@M``"#Q!"%P'4,QP8"````Z:4```"0QX-X1```
+M``$``(/L#&@``0``Z/S___^)@W1$``"#Q!"%P'4(QP8"````ZWB#[`QH``8`
+M`.C\____B8.@*@``@\00A<!U",<&`@```.M6QX.D*@``T)8!`,>#J"H``!"(
+M`0#'@ZPJ```<C@$`QX.P*@``[(@!`,>#M"H``)2+`0#'@[@J``!PE0$`QX.\
+M*@``))H!`,>#P"H```````"X`0```)"#Q`1;7L.0D%575E.#[`R+?"0@BVPD
+M)(MT)"R[`````(T$6XM/%(L4Q4![``"-1$4`BP2%0'L``(D$$4;WQC\```!U
+M$(/L#&H!Z/S___^#Q!"-=@!#@_L==L:[`````)"+3Q2+%-T@?@``BP3=)'X`
+M`(D$$4;WQC\```!U#X/L#&H!Z/S___^#Q!")]D.#^W]VSKL`````D(T$6XM/
+M%(L4A2""```#1"0HBP2%(((``(D$$4;WQC\```!U$(/L#&H!Z/S___^#Q!"-
+M=@!#@_L_=L:#Q`Q;7E]=PXGV55=64X/L#(ML)""+="0DQT0D"`````"_````
+M`&:!/K\2#X?-````#[<&B40D!"V0"```N@4```")TYGW^X72=2.+1"0$C9P`
+MX.[__[AG9F9F]^O!^@*)V,'X'XG3*</K18UV``^W#HV!4/?__[H%````B=.9
+M]_NX`````(72#X4<`@``C9P)H.[__[AG9F9F]^O!^@*)V,'X'XG3*</'1"0(
+M`0```,'C`H'C_P```(/L"&H(4^C\____B<.+512+@@2B``"#Q!!F@3ZT"741
+M@\@0B8($H@``Z7\!``"-=@"+512#X.^)@@2B``#I:P$``(UV`&:+#KL%````
+MN@````")R&;W\V:#^@)U3&:!^3L5=T6#Z0*#[`AJ"`^WR8T,B8V,"8!$__^X
+M'X7K4??IB=#!^`/!^1\IR$!0Z/S___^)PX/$"&H":@#H_/___XG'@\00Z00!
+M``!FBP:Y%````+H`````9O?Q9H72=4=F@3[_$W9`@^P(:@@/MPZ!Z<`2``"X
+M9V9F9O?IB=#!^`/!^1\IR,'@`E#H_/___XG#@\0(:@)J`>C\____B<>#Q!#I
+MJ````&:+!KD*````N@````!F]_%FA=)U/X/L"&H(#[<.@>G`$@``N&=F9F;W
+MZ8G0P?@"P?D?*<C1X%#H_/___XG#@\0(:@)J`>C\____B<>#Q!#K5XUV`&:+
+M!KD%````N@````!F]_&X`````&:%TG5^@^P(:@@/MPZ!Z<`2``"X9V9F9O?I
+MB=#1^,'Y'RG(4.C\____B<.#Q`AJ`FH!Z/S___^)QX/$$(UV`(G9P>$$C02]
+M``````G!BT0D"-'@"<&!R0$0``"+510/ML&)@IR8``#!Z0B+512)R(/@?XF"
+MV)@``(FU-!```+@!````@\0,6UY?7<-55U93@^P<BVPD,(M$)#AFB40D&HEL
+M)!1FQT0D$@``9L=$)!```&;'1"0.``!FQT0D#```OP````"+M>@M``"+5"0T
+M#[="`B7P`0``/=`````/A"4!```]T````'\;/:`````/A/$````]P`````^$
+M"`$``.DE`0``/4`!``!T"SU0`0``#X43`0``BU0D-&:+`BVA#P``9CWJ!'<E
+MBT0D%&:+@%`1``!FB40D$HM4)!1FBY)2$0``9HE4)!#IY@```(M4)#1FBP(M
+MC!0``&8][P!W)8M$)!1FBX!4$0``9HE$)!*+5"049HN25A$``&:)5"00Z:\`
+M``"+5"0T9HL"+7P5``!F/>``=R*+1"049HN`6!$``&:)1"02BU0D%&:+DEH1
+M``!FB50D$.M[BT0D-&:!.%P6=G"+5"049HN27!$``&:)5"02BT0D%&:+@%X1
+M``!FB40D$.M.BU0D%&:+DF`1``!FB50D#HM$)!1FBX!B$0``9HE$)`SK+(M4
+M)!1FBY)D$0``9HE4)`Z+1"049HN`9A$``&:)1"0,ZPJX`````.E]`@``N@``
+M``"Y)(4``(L$T8D$ED)T][H`````#[=,)!J[*(4``(T$4HT$08L$@XE$E@1"
+M=/"Z``````^W3"0:NT"%``"-!%*-!$&+!(.)1)8(0G3PN@`````/MTPD&KM@
+MA0``C012C01!BP2#B426#$*#^B1V[8M4)#2`>@(`#XF-````@^P,:@!H\0``
+M`&H##[=$)"90C5X,4^C\____@\04:@!H[@```&H##[=$)"104^C\____@\04
+M:@)H(P$``&H!:@%3Z/S___^#Q""#O<P!```)=!.#O<P!```*=6=F@[W0`0``
+M`W==@^P,:@-H@P```&H#:@-J!NC\____@\0(4(U&#%#H_/___X/$(.LV@^P,
+M:@!H]P```&H##[=$)"I0C5X,4^C\____@\04:@!H]````&H##[=$)"A04^C\
+M____@\0@N@`````/MTPD&KO@B```C012C01!BP2#B826H````$*#^@)VZKL`
+M````BTT4BQ3=((4``(L$GHD$$4?WQS\```!U#8/L#&H!Z/S___^#Q!!#=->[
+M`````(T$6XM-%(L4Q2B%``"+1)X$B0011_?'/P```'4-@^P,:@'H_/___X/$
+M$$-TT[L`````C01;BTT4BQ3%0(4``(M$G@B)!!%']\<_````=0V#[`QJ`>C\
+M____@\000W33NP````"-!%N+312+%,5@A0``BT2>#(D$$4?WQS\```!U#X/L
+M#&H!Z/S___^#Q!")]D.#^R1VSKL`````C01;BTT4BQ3%X(@``(N$GJ````")
+M!!%']\<_````=0V#[`QJ`>C\____@\000X/[`G;-BT0D%,>`P"T```````"X
+M`0```(/$'%M>7UW#C78`BU0D"(M$)`2+@.@M``"#^@=W'?\DE2B)``")]H/`
+M!,.#P`C#@\`,PP6@````PXGVN`````##B?955U93BWPD&(ML)"2+3"0<BW0D
+M%`^WV8T<7P^_U@^W!SG"?13'10``````BT0D(,<``````.MED`^_U@^W0_XY
+MPGPU#[?!2(E%`(M4)"")`NM*B<@I^-'XB44`BU0D((D"ZSF)R"GXT?B+5"0@
+MB0)`B44`ZR>-=@")^3G?<QX/O]:-=@`/MP$YT'3'#[=!`CG"?-"#P0(YV7+J
+MB?9;7E]=PXUV`%575E.#[!B+1"0P9HE$)`Z+3"0T9HE,)`R+7"1`9HE<)`J)
+MQ='E9L=$)`@``+@`````9H/[`0^&!@$``(M$)`QF*T0D#F8[1"0(#X+M````
+M#[=$)`J)1"0$C78`C40D%%"-1"044`^W1"024/]T)$0/O\50Z./^__^#Q!2#
+M?"04`'4(QT0D%`$```"+5"0$C4+_.T0D$'4(C4+^B40D$)"+3"00BUPD.&:+
+M%$N+1"049CL40W4*BT0D/&:+#$CK2P^_S8M<)!"+1"0X#[\T6(G/*?>+5"04
+MBT0D/`^W!%`/K_B+1"0X#[\44(G0*<B)!"2+1"0\#[<,6(L$)`^OP8T$!RGR
+MB=&9]_F)P0^W1"0(BU0D+,'B!@'"BUPD1&:)#%-F_T0D"(/%`HM$)`QF*T0D
+M#F8[1"0(#X,?____N`$```"#Q!A;7E]=PXGV5U93BUPD$(MT)!2+3"08BWPD
+M'(M4)"")^&8Y\70D#[?;#[?VB=@I\`^_T@^OP@^WR8G**=H/O]\/K],!T"GQ
+MF??YF%M>7\.055=64X/L3(M$)&1FB40D+HM4)&QFB50D+(M$)&"+@*`J``")
+M1"0HQT0D'`````"-1"1$4(U$)$10BTPD<`^W011040^_1"0^4.AZ_?__QT0D
+M.`````"#Q!2-=@"X`P```"M$)"2)1"0@BU0D0(T$0(T<Q0````"-!)*-!("-
+M!$*-!$.+="1HC10P9HMZ(&:%_P^$[@$``&:+0AZ+3"0<BW0D>&:)!$Z)S='E
+MC70D.&:+2BQFB4PU`(M4)$2-!)*-!("-!$*-!$,#1"1H9CM(+'X)9HM`+&:)
+M1#4`BVPD'-'E9HM$+#B)PF;!Z@\!T&;1^&:)1"PXC40D,(E$)!2+5"1`#[?W
+MBUPD((T,6\'A`HT$DHT$@(T$0HT$`0'PBU0D:&:+7$(JBT0D%&:)7`4`BU0D
+M1(T$DHT$@(T$0@'!C00QBU0D:&8[7$(J?@YFBT1"*HM,)!1FB40-`(M<)!S1
+MXV:+1!PPB<)FP>H/`=!FT?AFB40<,/]T)"@/M_]7BU0D2(T$DHT$@(T$0HM4
+M)"B--%+!Y@.-!$8#1"1PC5`B4H/`+%`/OT0<0%`/OT0<3%#_="0TZ+3\__^+
+M1"1$!0`"``!05XM4)&B-!)*-!("-!$*-!$8#A"2,````C5`B4H/`+%`/OT0<
+M7%`/OT0<:%#_="10Z'7\__^_`````(/$.&:+1!PP9CM$'#AT=@^W3"0NB4PD
+M$(ML)!S1Y8GVBUPD','C!@'[BW0D*`^_C%X``@``#[\T7HM4)$2+1"1H#[<4
+M4(D4)(M$)$"+5"1H#[<$0E%6_W0D"%#_="0@Z%C]__^#Q!2+3"0H9HF$60`$
+M``!'9HM$+#!F*T0L.`^WP#GX=YO_1"0<_T0D)(-\)"0##X;(_?__BU0D.(M$
+M)'!FB1"_`````,=$)"0`````.WPD'`^#[`$``(GVBT0D'$@[1"0D=1F+7"0D
+M9HM$7#"#P`2+="1T9HD$7NLJC78`BU0D)-'B#[]$%#`/OU04.@'0B<+!ZA\!
+MT-'XBU0D)(M,)'1FB011N0````"#?"0D`'0;BUPD)(MT)'0/MTQ>_@^_1%PX
+M*<$/MT0D+"G!BU0D),'B!XM<)"AFBX0:`@0``(G#BW0D*&8KG#(`!```B=AF
+MA=MU!;@!````B<.%R7DWBT0D),'@!XM4)"B-+!`/M].)]HG0#Z_!B?M'O@``
+M``!F`X4`!```>`*)QHM$)'QFB31807C=D(M$)"31X`^_5`0PB50D!`^_5`0X
+M*50D!(M<)"2+="1T#[<L7@^W1"0L`<4IU8M$)`2)1"08.>AV!(EL)!@/OT0D
+M&(G#.<A^)8M4)"3!X@:0C00*08MT)"AFBX1&``0``(MT)'QFB01^1SG+?^.+
+M1"0DP>`&`T0D!(M<)"AFBY1#_@,``(G3BW0D*&8KG$;\`P``B=AFA=MU!;@!
+M````B<,[;"08=E8/O\4YR'Y/BT0D),'@!@-$)`2+5"0HC01"B40D#)")R"M$
+M)!@/M],/K\*+="0,9@.&_@,``(G^1XG"9H/X?WX%NG\```"+1"1\9HD4<$$/
+MO\4YR'_)D/]$)"2+5"0<.50D)`^"%O[__X-\)"0#=QZ-=@"+3"0DBUPD=&:+
+M1$O^9HD$2T&)3"0D@_D#=N6#_W]W$XMT)'QFBT1^_F:)!'Y'@_]_=NV#Q$Q;
+M7E]=PY!55U93@^PLBWPD0(M4)$R)_8NW=$0```^W0@(ET````#W`````=`<]
+MT````'4(C9WX)0``ZQP/MT("):````"-G^0A```]H````'0&C9_0'0``BT<4
+MBX!LH@``@^`/9HD$)%;_="14C40D(%"-1"0B4`^W1"004%,/MP)05^B6^O__
+MBT\4BY%8H@``@.8_#[=#'$C!X`XE`,````G"B9%8H@``@\0@9H-\)!8`=!!F
+MBT0D%O?89HF%\"T``.L)9L>%\"T`````NX"B``"Y`````(UV``^V%,X/MD3.
+M`L'@"`G"#[9$S@3!X!`)P@^V1,X&P>`8"<*+1Q2)%!B#PP1!@_D?=L^+7Q2+
+M%"2#X@\/MT0D&,'@!"7P`P``"<*-3"08#[=!`L'@"B4`_```"<(/MT$$P>`0
+M)0``/P`)P@^W00;!X!8E``#`#PG"B9-LH@``N`$```"#Q"Q;7E]=PXGV4X/L
+M"(M<)!"#NW1$````=!N#[`S_LW1$``#H_/___\>#=$0```````"#Q!"#N^@M
+M````=!N#[`S_L^@M``#H_/___\>#Z"T```````"#Q!"#NZ`J````=!N#[`S_
+MLZ`J``#H_/___\>#H"H```````"#Q!"#Q`A;PXUV`%.+7"0,N@````"Y`P``
+M`)")R"G0C01`C03#9H-X"`!T!P^_0!3K#)!"@_H#=N*X`````%O#C78`4XM<
+M)`RZ`````(GVC0Q29HM$RPAFA<!T#P^WP(T$B`^_1$,2ZPV)]D*#^@-VWK@`
+M````6\.-=@!55U93@^P$BU0D&(M$)"!FQP```(M,)!P/MT$")=`````]P```
+M`'0'/=````!U"8V"^"4``.LCD(M,)!P/MT$"):`````]H````'4(C8+D(0``
+MZP:-@M`=``!FBT@4C7@8N@````!FA<D/A.T!``"+1"0<9HL89CL?<AD/M]&-
+M!)*-!("-!$)F.UQ'FG9V9CL?<S&05_]T)!SH*O___XM,)"AFB0%7_W0D).CA
+M_O__BU0D-&:)`KH!````@\00Z9D!``"0#[?!C1R`C1R;C1Q8C5Q?FE/_="0<
+MZ.K^__^+3"0H9HD!4_]T)"3HH?[__XM4)#1FB0*Z`0```(/$$.E9`0``D+L`
+M````N@`````/M\&)QH/X`'XHBTPD'&:+`8G!9CL'=AJ)]HG00HG#.=9^#XT$
+MDHT$@(T$0F8[#$=WZ(T$DHT$@(T$0HT,``^W+#F-!)N-!("-!$.-'``/MP0[
+M*<6%[0^.I0````'YB0PD4?]T)!SH3_[__P^_\`'[4_]T)"3H0/[__Y@IQHM$
+M)"P/MQ`/MP,IPHG7#Z_^4_]T)"SH(O[__Y@/K\6-!`>9]_UFF(M4)#AFB0+_
+M="08_W0D-.C*_?__#[_P@\0@4_]T)!SHNOW__Y@IQHM,)"0/MQ$/MP,IP@^O
+M\E/_="0DZ)[]__^8#Z_%C00&F??]9IB+5"0T9HD"N@$```"#Q!#K38T$DHT$
+M@(T$0HT,`(M4)!QFBP*Z`````&8[!#EU+XT<.5/_="0<Z([]__^+3"0H9HD!
+M4_]T)"3H1?W__XM4)#1FB0*Z`0```(/$$(GVB="#Q`1;7E]=PXGV55=64X/L
+M"(ML)!R+="0@BWPD),<$)`$```"[`````#G[<SV0C40D!E"-1"0(4(T$WE!5
+MZ&#]__^#Q!"%P'05BT0D!(A$W@9FBT0D!HA$W@?K"8GVQP0D`````$,Y^W+$
+MBP0D@\0(6UY?7<.05E.#[!"+="0@BUPD'&BL````Z/S___^)@^@M``"#Q!"%
+MP'4,QP8"````Z:4```"0QX-X1`````$``(/L#&@``0``Z/S___^)@W1$``"#
+MQ!"%P'4(QP8"````ZWB#[`QH``8``.C\____B8.@*@``@\00A<!U",<&`@``
+M`.M6QX.D*@``T*L!`,>#J"H``&R;`0#'@ZPJ```8HP$`QX.P*@``0)P!`,>#
+MM"H``.B>`0#'@[@J``!PJ@$`QX.\*@``)*\!`,>#P"H```````"X`0```)"#
+MQ`1;7L.0D"A0%BQ8*```F`@``*L(``"K"```M0@``+\(``#8"```X@@``/((
+M``"]"@```@D``!<)``!L"0``+0D``$()``!7"0``?@D``+T*``"]"@``X`D`
+M`/8)```,"@``%@H``,X(```J"@``0`H``%,*``"]"@``O0H``)P*``"]"@``
+MHPH``+T*``"]"@``O0H``+$*``"@_Z/_GO^@_Z/_H/\```4`"@`4`!X`,@!&
+M`%4`6@!?`&0````*`!0`'@`H`#(`/`!&`%``6@!D`,(```#$````Q0```-``
+M``#:````Y````,(```##````U````/(````-`0``*`$``,\```#*`````@!0
+M(0$`0`$$`*``"`#``"``T`!``%`!`````"0!F!D`)A`&````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````+Q8````````````````````
+M`````````````````````````.!8````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````#_
+M______\```````````````````"8``!'````")@````````,F```IHZ$"1"8
+M````X#(]%)@``&L'```<F````````""8`````@("))@```X.```HF````0("
+M"BR8``#\;P,`,)@````````TF```#@X``#B8```'````/)@````!`@!`F```
+M``!CB428``"<%G(32)@``#.V&`!,F```/&&$$E"8``#@N.@-5)@``%E(!P!8
+MF```NKZ`?ER8``!>9CHQ8)@```@=``!DF````,X!`&B8``"009I`<)@```\`
+M``!TF```@````'B8```$`````)D````````$F0````````B9````````#)D`
+M````@``0F0```P````";````````!)L``"`````(FP``$`````R;```P````
+M$)L```@````4FP``*````!B;```H````')L```0````@FP``)````"2;```4
+M````*)L``#0````LFP``#````#";```L````-)L```(````XFP``(@```#R;
+M```2````0)L``#(```!$FP``"@```$B;```J````3)L```$```!0FP``(0``
+M`%2;```1````6)L``#$```!<FP``"0```&";```I````9)L```4```!HFP``
+M)0```&R;```5````<)L``#4```!TFP``#0```'B;```M````?)L```,```"`
+MFP``(P```(2;```3````B)L``#,```",FP``"P```)";```K````E)L```<`
+M``"8FP``)P```)R;```7````H)L``#<```"DFP``#P```*B;```O````K)L`
+M`"\```"PFP``+P```+2;```O````N)L``"\```"\FP``+P```,";```O````
+MQ)L``"\```#(FP``+P```,R;```O````T)L``"\```#4FP``+P```-B;```O
+M````W)L``"\```#@FP``+P```.2;```O````Z)L``"\```#LFP``+P```/";
+M```O````])L``"\```#XFP``+P```/R;```O`````)H``!T````$F@``70``
+M``B:``"=````#)H``-T````0F@``'0$``!2:```A````&)H``&$````<F@``
+MH0```"":``#A````))H``#$````HF@``<0```"R:``"Q````,)H``!P````T
+MF@``7````#B:```I````/)H``&D```!`F@``J0```$2:```@````2)H``!D`
+M``!,F@``60```%":``"9````5)H``#````!8F@``!0```%R:```E````8)H`
+M`&4```!DF@``I0```&B:```H````;)H``&@```!PF@``'P```'2:```>````
+M>)H``!@```!\F@``6````(":``"8````A)H```,```"(F@``!````(R:``!$
+M````D)H``(0```"4F@``$P```)B:```2````G)H``%(```"@F@``D@```*2:
+M``#2````J)H``"L```"LF@``*@```+":``!J````M)H``*H```"XF@``&P``
+M`+R:```:````P)H``%H```#$F@``F@```,B:``#:````S)H```8```#0F@``
+M!@```-2:```&````V)H```8```#<F@``!@```.":```&````Y)H```8```#H
+MF@``!@```.R:```&````\)H```8```#TF@``!@```/B:```&````_)H```8`
+M``#4F```(````,R8```$````R)@```8!!@"<F```;0```,"8````````T)@`
+M`!0````)"0```````@(&!@8&!@8"`@````,`!@`)`#P`````````````````
+M``````````````````````````````#P````S`````````````````````KB
+M````(```"@(```$8```!````0!@$````````````````````````````````
+M````````!017&0`F$`8`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````@(P`````````````````````````````````````````````
+MT(P`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````&P)CPFT"0``````````````````
+M________````````````````````````````````````````(````"````!`
+M````0```````!@````8````&`#`````5````%0```!T````5````0!````_\
+M+P`/_"\`'_PO``_\+P!$$```#_PO``_\+P`?_"\`#_PO`$@0```/_"\`#_PO
+M`!_\+P`/_"\`3!````_\+P`/_"\`'_PO``_\+P!0$```#_PO``_\+P`?_"\`
+M#_PO`%00```/_"\`#_PO`!_\+P`/_"\`6!````_\+P`/_"\`'_PO``_\+P!<
+M$```#_PO``_\+P`?_"\`#_PO`&`0```/_"\`#_PO`!_\+P`/_"\`9!````_\
+M+P`/_"\`'_PO``_\+P!P$```:`$``.`!``"X`0``:`$``#`0```P`@``X`$`
+M`+`````P`@``L!```)@-``"`$0``2!\``)@-``#P$```X*```&A``0"`6```
+MX*```!2`````!``$``@`"``P`"``!``$'(```*>/C0[/CXT.E8]@`:>/C0X$
+MF`````````,``````````````""8`````@("``("`@`"`0(``@("))@```X.
+M```.#@``!P<```X.```HF````0`""@$``@H```$%`0`""C28```.#@``#@X`
+M``X.```.#@``.)@```<````'````"P````L```!$F```G!9R$Z46<A.H%G(3
+MG!9R$TB8``!GNA@`9[H8`&FZ&`!INA@`4)@``."T*`S@M"@,X+0H#."T*`Q8
+MF```+@V`?BX-@'XN#<!^+@V`?ER8``!>73<Q7ETW,5Y=.C%>73<Q8)@``!"]
+M```0O0``.+T``!"]``!DF````,X!``#.`0``S@$``,X!`!29```0)P``$"<`
+M`'P5```0)P``&)D``)`!``"0`0``A````)`!``!$F0``(!#@;R`0X&\@">!O
+M(!#@;X"A``#_%/\%_Q3_!?\4_P7_&?\%U)@``!`````4````$````!``````
+M````#``````````H````G)R$A"P```!\?'Q\-`````4```!``````````$0`
+M```(````2`````@```!,````$````%``````````5````!\`````"```````
+M``0(````````"`@````````,"````````!`(````````%`@````````8"```
+M`````!P(````````(`@````````D"````````#`2````````!(`````````(
+M@`````````R`````````&(`````````D@````````"B````P````+(```/__
+M!P`P@```____`32````Q````.(`````````\@````````$"`````````1(``
+M``(```!(@````````%2`````````6(`````````(F`````````R8``"3D(0M
+M$)@```#@,GT4F```:P\``!R8````````+)@``/YO`@`PF````````#R8````
+M`0(`0)@``'H!:B!,F```/&&$$E28``!9"```:)@``)!!FD!LF```@;`,!7"8
+M```/````=)@``(````!XF```#`````"9````````!)D````````(F0``````
+M``R9`````(``$)D```$````<F0``*@D``""9````````))D```6*!0`HF0``
+M`0```"R9````````,)D````````TF0```````#B9````````/)D``#\```!`
+MF0``!````$B9````````3)D```````!0F0```````%29``!,\5!=6)D``!@`
+M``!<F0``CFI+`(2A``#_!?\&B*$``/\'_P>,H0``_PC_")"A``#_"?\)E*$`
+M`/\*_PJ8H0``_PO_"YRA``#_#/\,H*$``/\-_PVDH0``_P[_#ZBA``#_$O\2
+MK*$``/\3_Q2PH0``_Q7_%K2A``#_%_\9N*$``/\:_QN\H0``_QW_'L"A``#_
+M(/\CQ*$``/\E_R?(H0``_RG_+,RA``#_+_\QT*$``/\T_S?4H0``_SK_.MBA
+M``#_.O\ZW*$``/\Z_SK@H0``_SK_.N2A``#_.O\ZZ*$``/\Z_SKLH0``_SK_
+M.O"A``#_.O\Z]*$``/\Z_SKXH0``_SK_.ORA``#_.O\Z`)L````````$FP``
+M(`````B;```0````#)L``#`````0FP``"````!2;```H````&)L```0````<
+MFP``)````"";```4````))L``#0````HFP``#````"R;```L````,)L```(`
+M```TFP``(@```#B;```2````/)L``#(```!`FP``"@```$2;```J````2)L`
+M``8```!,FP``)@```%";```6````5)L``#8```!8FP``#@```%R;```N````
+M8)L```$```!DFP``(0```&B;```1````;)L``#$```!PFP``"0```'2;```I
+M````>)L```4```!\FP``)0```(";```5````A)L``#4```"(FP``#0```(R;
+M```M````D)L```,```"4FP``(P```)B;```3````G)L``#,```"@FP``"P``
+M`*2;```K````J)L``"L```"LFP``*P```+";```K````M)L``"L```"XFP``
+M*P```+R;```K````P)L``"L```#$FP``*P```,B;```K````S)L``"L```#0
+MFP``*P```-2;```K````V)L``"L```#<FP``*P```.";```K````Y)L``"L`
+M``#HFP``*P```.R;```K````\)L``"L```#TFP``*P```/B;```"````_)L`
+M`!8```#4F```(````-B8``!H$&``````````````F@``J0$````````$F@``
+MZ0$``$`````(F@``*0```(`````,F@``:0```%`!```0F@``F0$``)`!```4
+MF@``V0$``-`!```8F@``&0```!`````<F@``60```$0````@F@``F0```(0`
+M```DF@``I0$``$@!```HF@``Y0$``(@!```LF@``)0```,@!```PF@``R`$`
+M`!0````TF@``"````$(````XF@``2````((````\F@``B````'@!``!`F@``
+MF`$``+@!``!$F@``V`$``/@!``!(F@``&````!(```!,F@``6````%(```!0
+MF@``F````)(```!4F@``I`$``'P!``!8F@``Y`$``+P!``!<F@``)````/P!
+M``!@F@``9`````H```!DF@``I````$H```!HF@``Y````(H```!LF@``"@$`
+M`%H!``!PF@``2@$``)H!``!TF@``B@$``-H!``!XF@``R@$```X```!\F@``
+M"@```$X```"`F@``2@```(X```"$F@``B@```%X!``"(F@``N@$``)X!``",
+MF@``^@$``-X!``"0F@``.@````D```"4F@``>@```$D```"8F@``A@$``(D`
+M``"<F@``Q@$``'D!``"@F@``!@```+D!``"DF@``1@```/D!``"HF@``A@``
+M`#D```"LF@``Q@```'D```"PF@``Q@```+D```"TF@``Q@```+T!``"XF@``
+MQ@```/T!``"\F@``Q@```#T```#`F@``Q@```'T```#$F@``Q@```+T```#(
+MF@``Q@```/T```#,F@``Q@```/T```#0F@``Q@```/T```#4F@``Q@```/T`
+M``#8F@``Q@```/T```#<F@``Q@```/T```#@F@``Q@```/T```#DF@``Q@``
+M`/T```#HF@``Q@```/T```#LF@``Q@```/T```#PF@``Q@```/T```#TF@``
+MQ@```/T```#XF@``Q@```/T```#\F@``Q@```/T````!````1@```&`````!
+M````1@```&$````!````1@```&(````!````1@```&,````!````1@```&0`
+M```!````1@```&4````!````1@```&8````!````1@```&<````!````1@``
+M`&@````!````1@```&D````!````1@```&H````!````1@```&L````!````
+M1@```&P````!````1@```'0````!````1@```'0````!````1@```'0````!
+M````1@```'0````!````1@```'0````!````1@```'0````!````1@```'0`
+M```!````1@```'0````!````1@```'4````!````1@```'8````!````1@``
+M`'<````!````1@```'@````!````1@```'D````!````1@```'H````!````
+M1@```'L````!````1@```'P````!````1@```'T````!````1@```'X````!
+M````1@```'\````!````1@```(`````!````1````'P````!````1@```(@`
+M```!````1@```(P````!````1@```)`````!````1@```)0````!````1@``
+M`)@````!````1@```)P````!````1@```*`````!````1@```*0````!````
+M1@```*@````!````1@```*P````!````1@```+`````!````1@```+0`````
+M`@<```````````````````````````">%@L`8A8*`#H6"0`<%@@`ZA4'`)H5
+M!0!*%00``Q4"`%D4``````$````#``8`"0`_````@[\``(._``"MOP``K;\`
+M`->_``#7OP```<````'````````````````````)````!`````0``0`!``$`
+M!@```$9'.``````````````````$`````0`!``0```!&1S<`````````````
+M`````P`!``$``0`#````1D<V``````````````````0```````$``0```$9'
+M-0`````````````````$``$``0````````!&1S0`````````````````!```
+M``$```#^____1D<S``````````````````,``0`!````_?___T9',@``````
+M```````````$`````````/S___]&1S$``````````````````@`!``$```#Z
+M____1D<P````````````````````````````````````````````````````
+M```4$%09`"80!@``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````'S4````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````;`F/";0)"`EL";0)R?___\G____)____
+MR?___\+____R____\O____+____R____]/___\#____`____P/___\#___^Z
+M____LO___[+___^R____LO___[#___________\%`@\'`@\*``\)``\```;L
+M``"TZP``P>L``$3L``#:ZP``..P````````````````````````@````(```
+M`$````!````````&````!@````8`GA8+`&(6"@`Z%@D`'!8(`.H5!P":%04`
+M2A4$``,5`@!9%```N`L!``````"\_0``&_L``&#[``"$^P``O/T``.S[``"\
+M_0``O/T``+S]``"\_0``O/T``![\``"\_0``O/T``+S]``"\_0``,/P``%W\
+M``"\_0``K/P``-?\``"\_0``O/L``+S]``"\_0``O/T``!3]```I_0``O/T`
+M`$/]``"S_0``L_T``(W]``"5_0``G?T``*7]``"M_0````````8````!````
+M`@````,````$````!0```'C_``!X_P``^_T``!_^``!X_P``6_X``'C_``!X
+M_P``>/\``'C_``!X_P``@_X``'C_``!X_P``>/\``'C_``"<_@``>/\``'C_
+M``"T_@``5_\``'C_``!X_P``>/\``'C_``!X_P``V/X``-C^``!X_P``-_\`
+M`````````````````$`0```/_"\`#_PO`!_\+P`/_"\`#_PO`$00```/_"\`
+M#_PO`!_\+P`/_"\`#_PO`$@0```/_"\`#_PO`!_\+P`/_"\`#_PO`$P0```/
+M_"\`#_PO`!_\+P`/_"\`#_PO`%`0```/_"\`#_PO`!_\+P`/_"\`#_PO`%00
+M```/_"\`#_PO`!_\+P`/_"\`#_PO`%@0```/_"\`#_PO`!_\+P`/_"\`#_PO
+M`%P0```/_"\`#_PO`!_\+P`/_"\`#_PO`&`0```/_"\`#_PO`!_\+P`/_"\`
+M#_PO`&00```/_"\`#_PO`!_\+P`/_"\`#_PO`#`0```P`@``X`$``+````!@
+M`0``X`$``'`0``!H`0``X`$``+@!``",`0``X`$``+`0``!@#@``@!$``!P?
+M```X/@``@!$``/`0``#@H```:$`!`(!8``#@L```:$`!`!2```#H`^@#X`;@
+M!B`$(`1`"$`(X`;@!@28`````````P```````````````P```""8`````@("
+M``("`@`"`0(``@("``("`B28```.#@``#@X```<'```.#@``#@X``$28```<
+M%G(3)1QR$R(7<A.B%G(3)1QR$V"8```0G0``$)T``!B=```8G0``$)T``&28
+M````S@$``,X!``#.`0``S@$``,X!`&B8``"009I`D$&:0)!!FD"009I`D$&:
+M0!B9``"X`0``N`$``(0````(`0``N`$``"29```%B@40!8H%$`6*!1`%B@40
+M!8H%$#"B```````````````````(`0``````````````````#``````````T
+M````!0```$``````````1`````@```!(````"````$P````0````4```````
+M``!4````'P`````(````````!`@````````("`````````P(````````$`@`
+M```````4"````````!@(````````'`@````````@"````````"0(````````
+M<!(````````X$````````'@0````````N!````````#X$````````#@1````
+M````>!$```````"X$0```````/@1````````.!(```````!X$@```````+@2
+M````````^!(````````X$P```````'@3````````N!,```````#X$P``````
+M`#@4````````>!0```````"X%````````/@4````````.!4```````!X%0``
+M`````+@5````````^!4````````X%@```````'@6````````N!8```````#X
+M%@```````#@7````````>!<```````"X%P```````/@7````````/!``````
+M``!\$````````+P0````````_!`````````\$0```````'P1````````O!$`
+M``````#\$0```````#P2````````?!(```````"\$@```````/P2````````
+M/!,```````!\$P```````+P3````````_!,````````\%````````'P4````
+M````!(`````````(@`````````R`````````((`````````D@````````"B`
+M```P````+(```/__!P`P@```____`32````Q````.(`````````\@```````
+M`$B`````````5(````````!8@````````%R```"/QP\`P(```!HP@BK$@```
+MX`'<!<B````0)T`?S(``````]`'0@```'!X``-2```"JJ@(`V(```%55``+<
+M@````````."```#_____Y(```/__``#H@````````.R`````````\(``````
+M``#T@````````/B`````````_(```(@`````AP````````2'``",````"(<`
+M`.0````,AP``U0(``!"'````````%(<````````8AP``H````!R'``#)`0``
+M((<``"P````DAP``+````"B'```P````+(<``#P````PAP``+````#2'```L
+M````.(<``#`````\AP``/````$"'````````1(<```````!(AP```````$R'
+M````````4(<```````!4AP```````%B'````````7(<```````!@AP``U0``
+M`&2'``#?````:(<```(!``!LAP``.@$``'"'``!U````=(<``'\```!XAP``
+MH@```'R'`````````($```(``0`$@0```0````B!``#`````#($````````0
+M@0``:`$``!2!````````P(<````!`@/$AP``!`4&!\B'```("0H+S(<```P-
+M#@_0AP``$!$2$]2'```4%187V(<``!@9&AO<AP``'!T>'^"'`````0(#Y(<`
+M``0%!@?HAP``"`D*"^R'```,#0X/\(<``!`1$A/TAP``%!46%_B'```8&1H;
+M_(<``!P='A\,F```&8Z$K1"8````X"A]%)@``&N?"IP<F````````$"8``!Z
+M`6H@5)@``%D(````F0````````29````````")D````````,F0````"``!"9
+M```!````')D``(`,```@F0`````0!2B9```!````+)D```0````TF0``(B`?
+M'CB9```-#`L*/)D``#\```!(F0``$K*`DE29``"(X5!=7)D``(YJ2P!HF0``
+MS@,``'"9```5M2\9>)D```$```!\F0```````!"B```S8X``%*(``!!L$``8
+MH@``8$"<`""B``#&,(@!)*(````$```LH@```````#2B```@("`@.*(``"`@
+M("!`H@``(`I).$2B``"V>P``2*(``/P__P\`FP```````"B;```,````.)L`
+M`!(```!DFP``(0```(R;```M````G)L``#,```````,`!@`)`#\````#``8`
+M"0`_``````````````````D````$````!``!``$``0````````````8```!&
+M1S@`````````````````!`````$``0````````````0```!&1S<`````````
+M`````````P`!``$``0````````````,```!&1S8`````````````````!```
+M`````0````````````$```!&1S4`````````````````!``!``$`````````
+M``````````!&1S0`````````````````!`````$``````````````/[___]&
+M1S,``````````````````P`!``$``````````````/W___]&1S(`````````
+M````````!````````````````````/S___]&1S$``````````````````@`!
+M``$``````````````/K___]&1S``````````````````````````````````
+M``````````````````````````````````````````````````````@````!
+M`````P````````````````````8```!&1S<``````````````````@``````
+M``````````````````!&1S8``````````````````0``````````````````
+M`/W___]&1S4``````````````````````````````````````/K___]&1S0`
+M```````````````````!``$``````````````/C___]&1S,`````````````
+M```````!``$````!``$``````/;___]&1S(````````````````````!````
+M`0`!``$``````//___]&1S$````````````````````!`````0`!`````0``
+M`/#___]&1S``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````@````0````&````"`````H````,````#@```!````"L5`$`OD\!`*A0
+M`0!?4@$`R5(!`$]3`0#24P$````````````````````````````P````%8``
+M`!6````5@```%8```!6````<@```IX^-$L\/B`F5#^`$JP_@$L\/B`DHF```
+M`0`""@$``@H``0$%`0`""@$``@HTF```#@X```X.```.#@``#@X```X.```X
+MF```!P````<````+````"P````L```!(F```6MH8`%K:&`!IRA@`:<H8`&G*
+M&`!0F```X+3H#>"TZ`W@M.@-X+3H#>"TZ`U8F```+@V`?BX-@'XN3>A^+DWH
+M?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F8W,5YA-S%LF```@;`,!8&P#`6!L`P%
+M@+`,!8"P#`44F0``$"<``!`G``!\%0``^"H``!`G``!$F0``(!"X]R`0N/<@
+M#;CW(!"X]R`0N/<,H@``:D$L9&I!+&1J04!D:D%`9&I!0&0<H@``"H"#&`J`
+M@Q@*@',8"H"#&`J`@Q@`````````````````````,!(````````(F```````
+M`"R8``#^+P(`/)@````!`@!,F```/&&$$C"9``"#2```0)D```0```!8F0``
+M_P```'29````````^)D``!@````$H@````````BB``"(9S[0**(``+4!```\
+MH@``KXG($P2;```@````")L``!`````,FP``,````!";```(````%)L``"@`
+M```8FP``!````!R;```D````()L``!0````DFP``-````"R;```L````,)L`
+M``(````TFP``(@```#R;```R````0)L```H```!$FP``*@```$B;```&````
+M3)L``"8```!0FP``%@```%2;```V````6)L```X```!<FP``+@```&";```!
+M````:)L``!$```!LFP``,0```'";```)````=)L``"D```!XFP``!0```'R;
+M```E````@)L``!4```"$FP``-0```(B;```-````D)L```,```"4FP``(P``
+M`)B;```3````H)L```L```"DFP``*P```*B;```K````K)L``"L```"PFP``
+M*P```+2;```K````N)L``"L```"\FP``*P```,";```K````Q)L``"L```#(
+MFP``*P```,R;```K````T)L``"L```#4FP``*P```-B;```K````W)L``"L`
+M``#@FP``*P```.2;```K````Z)L``"L```#LFP``*P```/";```K````])L`
+M`"L```#XFP```@```/R;```6````G)@`````````````````````````````
+MG)@`````````````````````````````G)@`````````````````````````
+M````G)@`````````````````````````````G)@`````````````````````
+M````````G)@`````````````````````````````G)@`````````````````
+M````````````G)@`````````````````````````````G)@`````````````
+M````````````````G)@`````````````````````````````G)@`````````
+M````````````````````G)@`````.````#@````X````.````#@`G)@`````
+M````````````````````````G)@`````````````````````````````G)@`
+M````````````P````(````"`````G)@``/D`!`#Y``0`_P`$`/T`!`#]``0`
+MU)@`````````````!`````0````$````````````````F@``J0$````````$
+MF@``Z0$``$`````(F@``*0```(`````,F@``:0```%`!```0F@``F0$``)`!
+M```4F@``V0$``-`!```8F@``&0```!`````<F@``60```$0````@F@``F0``
+M`(0````DF@``I0$``$@!```HF@``Y0$``(@!```LF@``)0```,@!```PF@``
+MR`$``!0````TF@``"````$(````XF@``2````((````\F@``B````'@!``!`
+MF@``F`$``+@!``!$F@``V`$``/@!``!(F@``&````!(```!,F@``6````%(`
+M``!0F@``F````)(```!4F@``I`$``'P!``!8F@``Y`$``+P!``!<F@``)```
+M`/P!``!@F@``9`````H```!DF@``I````$H```!HF@``Y````(H```!LF@``
+M"@$``%H!``!PF@``2@$``)H!``!TF@``B@$``-H!``!XF@``R@$```X```!\
+MF@``"@```$X```"`F@``2@```(X```"$F@``B@```%X!``"(F@``N@$``)X!
+M``",F@``^@$``-X!``"0F@``.@````D```"4F@``>@```$D```"8F@``A@$`
+M`(D```"<F@``Q@$``'D!``"@F@``!@```+D!``"DF@``1@```/D!``"HF@``
+MA@```#D```"LF@``Q@```'D```"PF@``Q@```+D```"TF@``Q@```+T!``"X
+MF@``Q@```/T!``"\F@``Q@```#T```#`F@``Q@```'T```#$F@``Q@```+T`
+M``#(F@``Q@```/T```#,F@``Q@```/T```#0F@``Q@```/T```#4F@``Q@``
+M`/T```#8F@``Q@```/T```#<F@``Q@```/T```#@F@``Q@```/T```#DF@``
+MQ@```/T```#HF@``Q@```/T```#LF@``Q@```/T```#PF@``Q@```/T```#T
+MF@``Q@```/T```#XF@``Q@```/T```#\F@``Q@```/T```#4F```(````-28
+M```0````%````!`````0````%````-B8``!H$&``:!!@`&@08`!H$&``:!!@
+M````````````G)@`````````````````````````````G)@`````````````
+M````````````````G)@`````````````````````````````G)@`````````
+M````````````````````G)@`````````````````````````````G)@`````
+M`!`````0````$````!`````0G)@```````0````$````!`````0````$G)@`
+M````````````````````````````G)@`````````````````````````````
+MG)@`````````````````````````````G)@`````````````````"@``````
+M````G)@``,``.`"``#@`P``X`L``.`#``#@`G)@```8``@`&``(`!@````8`
+M`@`&``(`G)@``(D```")````B0```(D```")````G)@``*````"@````H```
+M`*````"@````G)@```<`!``'``0`!P`$``<`!``'``0`U)@``!H````:````
+M&@```!H````:``````````````"<F```0````$@```!`````0````$````"<
+MF```$````!`````0````$````!````"<F```"`````@````(````"`````@`
+M``"<F```3P```$\```!/````3P```$\```"<F```\0```/$```!A````\0``
+M`/$```"<F```3Y```$^0``!,D```3Y```$^0``"<F```6A(``%H2``":$@``
+M6A(``%H2``#,F```#@````X````/````#@````X````!````1@```&`````!
+M````1@```&$````!````1@```&(````!````1@```&,````!````1@```&0`
+M```!````1@```&4````!````1@```&8````!````1@```&<````!````1@``
+M`&@````!````1@```&D````!````1@```&H````!````1@```&L````!````
+M1@```&P````!````1@```'0````!````1@```'0````!````1@```'0````!
+M````1@```'0````!````1@```'0````!````1@```'0````!````1@```'0`
+M```!````1@```'0````!````1@```'4````!````1@```'8````!````1@``
+M`'<````!````1@```'@````!````1@```'D````!````1@```'H````!````
+M1@```'L````!````1@```'P````!````1@```'T````!````1@```'X````!
+M````1@```'\````!````1@```(`````!````1````'P````!````1@```(@`
+M```!````1@```(P````!````1@```)`````!````1@```)0````!````1@``
+M`)@````!````1@```)P````!````1@```*`````!````1@```*0````!````
+M1@```*@````!````1@```*P````!````1@```+`````!````1@```+0```!Y
+M8`$`7&`!`&!@`0!D8`$`=&`!`'1@`0!H8`$`;&`!````````````````````
+M`````````````)X6!@!B%@0`.A8#`!P6`@#J%0$`FA4``$H5```#%0$`610#
+M`+@+!0`````````````````````````````````P````%8```!6````5@```
+M%8```!6````<@```IY.-$L\3B`F5$^`$JQ/@$L\3B`DHF````0`""@$``@H`
+M`0(%`0`""@$``@HTF```#@X```X.```.#@``#@X```X.```XF```!P````<`
+M```+````"P````L```!(F```;=H8`&W:&`!URA@`=<H8`'7*&`!0F```X+3H
+M#>"TZ`W@M.@-X+3H#>"TZ`U8F```+@V`?BX-@'XN#>A^+@WH?BX-@'Y<F```
+M7F8W,5YF-S%>9C<Q7F8W,5YF-S%LF```@;`,!8&P#`6!L`P%@;`,!8&P#`44
+MF0``T`<``-`'``!,!```F`@``-`'``!$F0``(!"X]R`0N/<0#;CW$!"X]Q`0
+MN/<$H@`````````````(````"`````@````(H@``B&>^UHAGOM:(9S[0B&<^
+MT(AG/M`,H@``0`$L9$`!+&1@P4)D8,%"9&#!0F0<H@``"H"#&`J`@Q@*@',8
+M"H"#&`J`@Q@P$@````````B8````````+)@``/XO`@`\F`````$"`$R8```\
+M8802,)D``()(``!`F0``!````%B9``#_````=)D````````HH@``M0$``#RB
+M``"OB<@3!)L```$````(FP```@````R;```#````$)L```0````4FP``!0``
+M`!B;```(````')L```D````@FP``"@```"2;```+````+)L```T````PFP``
+M$````#2;```1````/)L``!,```!`FP``%````$2;```5````2)L``!@```!,
+MFP``&0```%";```:````5)L``!L```!8FP``'````%R;```=````8)L``"``
+M``!HFP``(@```&R;```C````<)L``"0```!TFP``)0```'B;```H````?)L`
+M`"D```"`FP``*@```(2;```K````B)L``"P```"0FP``,````)2;```Q````
+MF)L``#(```"@FP``-````*2;```U````J)L``#4```"LFP``-0```+";```U
+M````M)L``#4```"XFP``-0```+R;```U````P)L``#4```#$FP``-0```,B;
+M```U````S)L``#4```#0FP``-0```-2;```U````V)L``#4```#<FP``-0``
+M`.";```U````Y)L``#4```#HFP``-0```.R;```U````\)L``#4```#TFP``
+M-0```/B;```0````_)L``!H`````````````````````````````````````
+MF@``!P````<````$F@``1P```$<````(F@``AP```(<````,F@``H`$``*`!
+M```0F@``X`$``.`!```4F@``(````"`````8F@``8````&`````<F@``H0$`
+M`*$!```@F@``X0$``.$!```DF@``(0```"$````HF@``80```&$````LF@``
+M8@$``&(!```PF@``H@$``*(!```TF@``X@$``.(!```XF@``(@```"(````\
+MF@``8@```&(```!`F@``8P$``&,!``!$F@``HP$``*,!``!(F@``XP$``.,!
+M``!,F@``(P```",```!0F@``8P```&,```!4F@``A`$``(0!``!8F@``Q`$`
+M`,0!``!<F@``!`````0```!@F@``Z@$```L```!DF@``*@```$L```!HF@``
+M:@```(L```!LF@``J@```*P!``!PF@``JP$``.P!``!TF@``ZP$``"P```!X
+MF@``*P```!(```!\F@``:P```%(```"`F@``JP```)(```"$F@``K`$``),!
+M``"(F@``[`$``-,!``",F@``+````!,```"0F@``.@```%,```"4F@``>@``
+M`),```"8F@``N@```)0!``"<F@``NP$``-0!``"@F@``^P$``!0```"DF@``
+M.P```#H```"HF@``>P```'H```"LF@``NP```+H```"PF@``O`$``+L!``"T
+MF@``_`$``/L!``"XF@``/````#L```"\F@``?````'L```#`F@``O````+L`
+M``#$F@``_````+P!``#(F@``_````/P!``#,F@``_````#P```#0F@``_```
+M`'P```#4F@``_````+P```#8F@``_````/P```#<F@``_````/P```#@F@``
+M_````/P```#DF@``_````/P```#HF@``_````/P```#LF@``_````/P```#P
+MF@``_````/P```#TF@``_````/P```#XF@``_````/P```#\F@``_````/P`
+M``#4F```(````-"8```(!`8#"`0'`P@$!@,(!`8#"`0'`]R8``#`(*``P""@
+M`,`@X`#`(.``P"#@````````````G)@```````\````/````#P````\````/
+MG)@`````````````````````````````G)@`````@````(````"`````@```
+M`(``G)@`````*@```"H````J````*@```"H`G)@``````0````$````!````
+M`0````$`G)@`````````````````````````````G)@`````&````!@````8
+M````&````!@`G)@`````8````&````!N````;@```&X`G)@`````QP```,<`
+M``#'````QP```,<`G)@`````2P```$L```!+````2P```$L`G)@`````2`0`
+M`$@$``!(!```2`0``$@$G)@`````3````$P```!,````3````$P`G)@`````
+MY````.0```#D````Y````.0`G)@`````````````````````````````G)@`
+M````_````/P```#\````_````/P`G)@`````_P```/\```#_````_P```/\`
+MG)@`````/P0``#\$```_!```/P0``#\$G)@`````#`````P````,````#```
+M``P`G)@`````&0(``!D"```9`@``&0(``!D"G)@`````)````"0````D````
+M)````"0`G)@`````M````+0```"T````M````+0`G)@`````F0```)D```"9
+M````F0```)D`G)@`````4````%````!0````4````%``G)@`````*@```"H`
+M```J````*@```"H`G)@`````$@```!(````2````$@```!(`G)@`````,L``
+M`#+````RP```,L```#+`G)@`````=`$``'0!``!T`0``=`$``'0!G)@`````
+M$0```!$````1````$0```!$`G)@`````*(8``"B&```HA@``*(8``"B&G)@`
+M````A#$``(0Q``"$,0``A#$``(0QG)@``(``\@"``/(`@`#R`(``\@"``/(`
+MG)@``!D`)P`9`"<`&0`G`!D`)P`9`"<`G)@```,````#`````P````,````#
+M````G)@`````````````````````````````G)@``+(```"R````L@```+(`
+M``"R````G)@``(0@L`"$(+``A""P`(0@L`"$(+``G)@``*0E00"D)4$`I"5!
+M`*0E00"D)4$`G)@``""2$0`@DA$`()(1`""2$0`@DA$`G)@```!(&@``2!H`
+M`$@:``!(&@``2!H`V)@``#`""P`P`@L`,`(+`#`""P`P`@L`G)@``)0```"4
+M````E````)0```"4````G)@``)$```"1````D0```)$```"1````G)@``!(`
+M```2````$@```!(````2````G)@``(````"`````@````(````"`````G)@`
+M`-D```#9````V0```-D```#9````G)@``&````!@````8````&````!@````
+MG)@``/````#P````\````/````#P````G)@``*(```"B````H@```*(```"B
+M````G)@``%(```!2````4@```%(```!2````G)@``-0```#4````U````-0`
+M``#4````G)@``,P4``#,%```S!0``,P4``#,%```G)@``(P$``",!```C`0`
+M`(P$``",!```Q)@```,````#`````P````,````#````&'(!`!UR`0`$<@$`
+M"'(!`!AR`0`8<@$`#'(!`!!R`0```````````#`````5````%0```!4````5
+M````%0```!R```"GDXT2SQ.("943X`2K$^`2SQ.("2B8```!``(*`0`""@``
+M`@4!``(*`0`""C28````#@````X````.````#@````X``#B8```"`````@``
+M``H````*````"@```$B8``!MVA@`;=H8`&1J&@!D:AH`9&H:`%"8``#@M.@-
+MX+3H#=JPZ`W:L)@,VK#H#5B8```N#8!^+@V`?BX-Z'XN#<A^+@V`?ER8``!>
+M9C<Q7F8W,5YF-S%>8#DQ7F8W,6R8``"!L`P%@;`,!8&P#`6!L`P%@;`,!129
+M``#0!P``T`<``$P$``"8"```T`<``$29````$+CW`!"X]P`-N/<`$+CW`!"X
+M]P2B``````````````````````````````BB``"(9[[6B&>^UHAG/M"(9S[0
+MB&<^T`RB``!``2P`0`$L`$#!0@!`P4(`0,%"`!RB```*@(,8"H"#&`J`8Q@*
+M@(,8"H"#&#`2``#@`P``8(````\````8@0```````!R!````````(($`````
+M```D@0```````"B!````````+($````````P@0```````#2!````````.($`
+M```````\@0```````$"!``"H``"`1($````````(F````````"R8````H```
+M/)@````$(`!,F```/".$$G"8```?````=)@``(````!XF```#@```%B9``#_
+M````@)D```````"$F0````"``J"9````````X)D```````#DF0``JJJJJNB9
+M``!X9$8\[)D``*H```#PF0``#````/29``#_````^)D``!0````HH@``M0D`
+M`#RB``"OB<B33*(```$```!0H@```*```%2B````````6*(``(!3QPQ<H@``
+M`0\/#V"B```!#VE?9*(``!&*00!HH@```````&RB``!JP3`,<*(``"`(@@!T
+MH@``JGP;`'BB``#..><<?*(``,X!%P4`HP`````!&`2C```")@,P"*,```8^
+M!T@,HP``"DP+5A"C```/8!ID%*,``!MN3W@8HP``6GR/AARC``!;AL^.(*,`
+M``^73YTDHP``CZ'/I2BC```?KU^U+*,``)^YW[TPHP``/\=_S32C``"_T?_5
+M.*,````````\HP```````$"C````````1*,```````!(HP``____/TRC``#_
+M__\_4*,``/___S]4HP``__\#`%BC```?JJAY7*,```]";`9@HP``!R(H#V2C
+M``"%%F`7:*,```01@!]LHP```PR@-W"C``"#",0_=*,```,(P%=XHP``@@;8
+M7WRC``""!.!_@*,``+I[/'^$HP``\'\P\P2;```!````")L```(````,FP``
+M`P```!";```$````%)L```4````8FP``"````!R;```)````()L```H````D
+MFP``"P```"R;```-````,)L``!`````TFP``$0```#R;```3````0)L``!0`
+M``!$FP``%0```$B;```8````3)L``!D```!0FP``&@```%2;```;````6)L`
+M`!P```!<FP``'0```&";```@````:)L``"(```!LFP``(P```'";```D````
+M=)L``"4```!XFP``*````'R;```I````@)L``"H```"$FP``*P```(B;```L
+M````D)L``#````"4FP``,0```)B;```R````H)L``#0```"DFP``-0```*B;
+M```U````K)L``#4```"PFP``-0```+2;```U````N)L``#4```"\FP``-0``
+M`,";```U````Q)L``#4```#(FP``-0```,R;```U````T)L``#4```#4FP``
+M-0```-B;```U````W)L``#4```#@FP``-0```.2;```U````Z)L``#4```#L
+MFP``-0```/";```U````])L``#4```#XFP``$````/R;```:````````````
+M````F@`````````````$F@```````$`````(F@```````(`````,F@``````
+M`($!```0F@```````,$!```4F@````````$````8F@```````$$````<F@``
+M`````($````@F@```````&@!```DF@```````*@!```HF@```````.@!```L
+MF@```````"@````PF@```````&@````TF@```````(D!```XF@```````,D!
+M```\F@````````D```!`F@```````$D```!$F@```````(D```!(F@``````
+M`)`!``!,F@```````-`!``!0F@```````!````!4F@```````%````!8F@``
+M`````)````!<F@```````)$!``!@F@```````-$!``!DF@```````!$```!H
+MF@```````%$```!LF@```````)$```!PF@```````'@!``!TF@```````+@!
+M``!XF@```````/@!``!\F@```````#@```"`F@```````'@```"$F@``````
+M`)D!``"(F@```````-D!``",F@```````!D```"0F@```````%D```"4F@``
+M`````)D```"8F@```````-D```"<F@```````/D```"@F@```````/D```"D
+MF@```````/D```"HF@```````/D```"LF@```````/D```"PF@```````/D`
+M``"TF@```````/D```"XF@```````/D```"\F@```````/D```#`F@``````
+M`/D```#$F@```````/D```#(F@```````/D```#,F@```````/D```#0F@``
+M`````/D```#4F@```````/D```#8F@```````/D```#<F@```````/D```#@
+MF@```````/D```#DF@```````/D```#HF@```````/D```#LF@```````/D`
+M``#PF@```````/D```#TF@```````/D```#XF@```````/D```#\F@``````
+M`/D```#4F```(````-"8```(%``""!0!`@@4``((%``""!0!`MR8``#`(*``
+MP""@`,`@X`#`(.``P"#@````````````G)@``````/````#P````\````/``
+M``#PG)@`````````````````````````````G)@```````,````#`````P``
+M``,````#G)@`````````````````````````````G)@`````````````````
+M````````````G)@`````````````````````````````G)@`````````````
+M````````````````G)@`````````````````````````````G)@`````0$``
+M`$!```!`0```0$```$!`G)@`````!64```5E```%90``!64```5EG)@`````
+M````````````````````````G)@`````````````````````````````G)@`
+M````0@```$(```!"````0@```$(`G)@`````M0```+4```"U````M0```+4`
+MG)@``````P````,````#`````P````,`G)@`````]P```/<```#W````]P``
+M`/<`G)@`````G0```)T```"=````G0```)T`G)@`````(@```"(````B````
+M(@```"(`G)@`````(@0``"($```B!```(@0``"($G)@``!@`(P`8`",`&``C
+M`!@`(P`8`",`G)@`````*````"@`8``H`&``*`!@`"@`G)@``,``4`#``%``
+MPP!0`,,`4`##`%``G)@``'\`!`!_``0`?P`$`'\`!`!_``0`G)@``%@$``!8
+M!```6`0``%@$``!8!```G)@`````````````````````````````G)@```#`
+M````P````,````#`````P```V)@``#`"0``P`D``,`)``#`"0``P`D``````
+M````````````````````````````G)@```!D````9````&0```!D````9```
+MG)@````(````"`````@````(````"```S)@```X````.````#@````X````.
+M````2(X!`$V.`0`XC@$`/(X!`$B.`0!(C@$`0(X!`$2.`0``````````````
+M```````````````````P````%0```!4````5````%0```!4````<@```IY.-
+M$L\3B`F5$^`$JQ/@$L\3B`DHF````0`""@$``@H``0(%`0`""@$``@HTF```
+M#@X```X.```.#@``#@X```X.```XF```!P````<````+````"P````L```!(
+MF```8?H8`&'Z&`!C&AH`8QH:`&,:&@!0F```X+28#."TF`S:L)@,VK"8#-JP
+MF`Q8F```+@W(?BX-R'XN#<A^+@W(?BX-R'Y<F```7F`Y,5Y@.3%>8#DQ7F`Y
+M,5Y@.3%LF```@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,!```
+MF`@``-`'``!$F0```!"X]P`0N/<`#;CW`!"X]P`0N/<$H@``````````````
+M```````````````(H@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``X,$N`.#!
+M+@`@P2H`(,$J`"#!*@`<H@``"H"#&`J`@Q@*@&,8"H"#&`J`@Q@`HP`````!
+M&````1@```$8```!&````1@$HP```B8#,`(F`S`")@,P`B8#,`(F`S`(HP``
+M!CX'2`8^!T@&/@=(!CX'2`8^!T@,HP``"DP+5@I,"U8*3`M6"DP+5@I,"U80
+MHP``#V`:9`]@&F0/8!ID#V`:9`]@&F04HP``&VY/>!MN3W@;;D]X&VY/>!MN
+M3W@8HP``6GR/AEI\CX9:?(^&6GR/AEI\CX8<HP``6X;/D%N&SY!;AL^.6X;/
+MCEN&SXX@HP``#Y=/G0^73YT/ET^;#Y=/FP^73YLDHP``CZ//IX^CSZ>/G\^C
+MCY_/HX^?SZ,HHP``'Z]?M1^O7[4?KU^S'Z]?LQ^O7[,LHP``G[G?O9^YW[V?
+MN=^[G[G?NY^YW[LPHP``/\5_RS_%?\L_QW_+/\=_RS_'?\LTHP``O]'_U;_1
+M_]6_T?_3O]'_T[_1_],`````````````````````,!(``.`#``!H0```$```
+M`&"````/````G(````````"@@````````!B!````````'($````````@@0``
+M`````"2!````````*($````````L@0```````#"!````````-($````````X
+M@0```````#R!````````0($``/D#`(!$@0````````B8````````+)@```"@
+M```\F`````0@`$R8```\(X02<)@``!\```!TF```@````'B8```.````6)D`
+M`/\?"`"`F0```````(29`````(`"H)D```````#@F0```````.29``"JJJJJ
+MZ)D``'AD1CSLF0``J@```/"9```,````])D``/\```#XF0``%````"BB``"U
+M"0``/*(``*^)R)-,H@```0```%"B````H```5*(```````!8H@``@%/'#%RB
+M```!#P\/8*(```$/:5]DH@``$8I!`&BB````````;*(``&K!,`QPH@``(`B"
+M`'2B``"J?!L(>*(``,XYYQQ\H@``S@$7!3BC````````/*,```````!`HP``
+M`````$2C````````2*,``/___S],HP``____/U"C``#___\_5*,``/__`P!8
+MHP``'ZJH>5RC```/0FP&8*,```<B*`]DHP``A19@%VBC```$$8`?;*,```,,
+MH#=PHP``@PC$/W2C```#",!7>*,``((&V%]\HP``@@3@?X"C``"Z>SQ_A*,`
+M`/!_,/,$FP```0````B;```"````#)L```,````0FP``!````!2;```%````
+M&)L```@````<FP``"0```"";```*````))L```L````LFP``#0```#";```0
+M````-)L``!$````\FP``$P```$";```4````1)L``!4```!(FP``&````$R;
+M```9````4)L``!H```!4FP``&P```%B;```<````7)L``!T```!@FP``(```
+M`&B;```B````;)L``",```!PFP``)````'2;```E````>)L``"@```!\FP``
+M*0```(";```J````A)L``"L```"(FP``+````)";```P````E)L``#$```"8
+MFP``,@```*";```T````I)L``#4```"HFP``-0```*R;```U````L)L``#4`
+M``"TFP``-0```+B;```U````O)L``#4```#`FP``-0```,2;```U````R)L`
+M`#4```#,FP``-0```-";```U````U)L``#4```#8FP``-0```-R;```U````
+MX)L``#4```#DFP``-0```.B;```U````[)L``#4```#PFP``-0```/2;```U
+M````^)L``!````#\FP``&@````":``````````````2:``!`````0`````B:
+M``"`````@`````R:``"A`0``80$``!":``#A`0``H0$``!2:```A````X0$`
+M`!B:``!A````(0```!R:``"(`0``80```"":``#(`0``B`$``"2:```(````
+MR`$``"B:``!(````"````"R:``"(````2````#":``"I`0``B````#2:``#I
+M`0``:0$``#B:```I````J0$``#R:``!I````Z0$``$":``#0`0``*0```$2:
+M```0````:0```$B:``!0````D`$``$R:``"0````T`$``%":``"Q`0``$```
+M`%2:``#Q`0``4````%B:```Q````D````%R:``!Q````<0$``&":``"X`0``
+ML0$``&2:``#X`0``\0$``&B:```X````,0```&R:``!X````<0```'":``"9
+M`0``F`$``'2:``#9`0``V`$``'B:```9````&````'R:``!9````6````(":
+M``"9````F````(2:``#9````>0$``(B:``#Y````N0$``(R:``#Y````^0$`
+M`)":``#Y````.0```)2:``#Y````>0```)B:``#Y````N0```)R:``#Y````
+M^0```*":``#Y````^0```*2:``#Y````^0```*B:``#Y````^0```*R:``#Y
+M````^0```+":``#Y````^0```+2:``#Y````^0```+B:``#Y````^0```+R:
+M``#Y````^0```,":``#Y````^0```,2:``#Y````^0```,B:``#Y````^0``
+M`,R:``#Y````^0```-":``#Y````^0```-2:``#Y````^0```-B:``#Y````
+M^0```-R:``#Y````^0```.":``#Y````^0```.2:``#Y````^0```.B:``#Y
+M````^0```.R:``#Y````^0```/":``#Y````^0```/2:``#Y````^0```/B:
+M``#Y````^0```/R:``#Y````^0```-28```@````T)@```@````(````"```
+M``@````(````W)@``,``H`#``*``P`#@`,``X`#``.````````````"<F```
+M````,P```#,````S````,P```#.<F````````0````$````!`````0````&<
+MF`````````````````````````````"<F```````````````````````````
+M``"<F`````````````````````````````"<F```````'P```!\````?````
+M'P```!^<F`````````````````````````````"<F`````"X````N````+@`
+M``"X````N`"<F`````"W````MP```+<```"W````MP"<F`````"$````A```
+M`(0```"$````A`"<F`````"8````F````)@```"8````F`"<F`````#`````
+MP````,````#`````P`"<F`````#_````_P```/\```#_````_P"<F`````#_
+M````_P```/\```#_````_P"<F`````#_````_P```/\```#_````_P"<F```
+M``#_````_P```/\```#_````_P"<F`````#7````UP```-<```#7````UP"<
+MF`````!A````80```&$```!A````80"<F`````#^````_@```/X```#^````
+M_@"<F`````#>````W@```-X```#>````W@"<F`````!_````?P```'\```!_
+M````?P"<F``````]!```/00``#T$```]!```/02<F`````!W````=P```'<`
+M``!W````=P"<F`````!$````1````$0```!$````1`"<F`````"8````F```
+M`)@```"8````F`"<F```@``0`(``$`"``!``@``0`(``$`"<F```-,`%`#3`
+M!0`TP`4`-,`%`#3`!0"<F```\``Q`/``,0#P`#$`\``Q`/``,0"<F```'P$,
+M`!\!#``?`0P`'P$,`!\!#`"<F```0`!1`$``40!``%$`0`!1`$``40"<F```
+MV@!0`-H`4`#:`%``V@!0`-H`4`"<F`````````````````````````````"<
+MF```1$```$1```!$0```1$```$1```"<F```````````````````````````
+M``"<F```P&```,!@``#`8```P&```,!@``"<F````"P````L````-@```#8`
+M```L``#(F````P0```,$```#!````P0```,$`````````````)R8````9```
+M`&0```!D````9````&0``)R8````"`````@````(````"`````@``,R8```.
+M````#@````X````.````#@```$BC`0!-HP$`-*,!`#BC`0!(HP$`2*,!`#RC
+M`0!`HP$`05(U,C$P`$%2-3(Q,0!!4C4R,3(`4D8U,3$Q`%)&-3$Q,@!21C(T
+M,3,`4D8U-#$S`$%T:&5R;W,@,C,Q,R!7:5-O0P!!=&AE<F]S(#4T,C0O,C0R
+M-`!!=&AE<F]S(#(S,3<@5VE3;T,`071H97)O<R`U,C$R("A&4$=!*0!!=&AE
+M<F]S(#4R,3$@*$901T$I`$%T:&5R;W,@-3(Q,`!!=&AE<F]S(#4R,3$`071H
+M97)O<R`U,S$R(%=I4V]#`$%T:&5R;W,@,C,Q-2!7:5-O0P!!=&AE<F]S(#4R
+M,3(````````````````````````````````````P+CDN,C`N,P``````````
+M```````````````````````````'````#@```!4````<````(P```"H`````
+M``````#_`?\!`````````````/________]_``````,`F`&9`0``````````
+M``#_________?P`````'`)@!,`L`````````````_________W\`````"`"8
+M`3`,`````````````/________]_`````"``(`$0"@````````````#_____
+M____?P`````A`"`!F0$`````````````_________W\`````(@`@`3`,````
+M`````````/________]_`````#H`8`$0"@````````````#_________?P``
+M```[`&`!F0$`````````````_________W\`````$@!E`1`*```#````````
+M`/________]_`````#<`,`&9`0```P````````#_________?P`````U`#`"
+MF0$```,`````````_________W\`````-@`P`YD!```#`````````/______
+M__]_`````#``,`29`0```P````````#_________?P`````Y`#`%F0$```,`
+M````````_________W\`````-``P!ID!```#`````````/________]_````
+M`#(`,`.9`0```P````````#_________?P`````Q`#`#F0$`````````````
+M_________W\`````$0`0`9D!`````````````/________]_`````!``$`$0
+M"@````````````#_________?P````!2`%`!F0$`````````````________
+M_W\`````10!0`ID!`````````````/________]_`````$<`4`.9`0``````
+M``````#_________?P````!"`%`$F0$`````````````_________W\`````
+M6`!0!9D!`````````````/________]_`````%L`4`:9`0````````````#_
+M________?P````!=`%`(F0$`````````````_________W\`````7@!0"9D!
+M`````````````/________]_`````%``4`,0"@````````````#_________
+M?P````!5`%`!,`P`````````````_________W\`````5@!0`C`,````````
+M`````/________]_`````$D`4`)0#0````````````#_________?P````!`
+M`$`!0`H``$8````$````*`````````"(`0``00!``4`*``!'````!````&@`
+M````````B0$``$@`0`$0"@``1@````0````(`````````(H!``!*`$`!0`H`
+M`$8````$````"!@```````",`0``2P!``4`*``!&````!`````A@````````
+MC0$``$P`0`%0"@``1@````0````(`````````(\!``!#`$`"0`H``$<````$
+M````<`````````"+`0``\`!``T`*``!&````!````"```````````````(``
+M0`-`"@``1P````0```!@`````````*</``#Q`$`#0`H``$8````$`````!@`
+M````````````@0!``T`*``!&````!`````!@````````J`\``((`0`-0"@``
+M1@````0``````````````*D/``#R`$`#$`H``$8````$````````````````
+M````@P!`!$`*``!'````!````&"`````````J@\``/0`0`1`"@``1@````0`
+M````F`````````````"$`$`$0`H``$8````$`````.````````"K#P``A0!`
+M!%`*``!&````!`````"`````````K`\``/4`0`00"@``1@````0`````@```
+M``````````"&`$`%0`H``$<````$````8(````````"M#P``AP!`!4`*``!&
+M````!`````#@````````K@\``(@`0`50"@``1@````0`````@````````*\/
+M``")`$`&0`H``$<````$````:`````````"P#P``B@!`!D`*``!&````!```
+M``A@````````L0\``(L`0`90"@``1@````0````(`````````+(/``",`$`'
+M0`H``$<````$````:(````````"S#P``C0!`!T`*``!&````!`````C@````
+M````M`\``(X`0`=0"@``1@````0````(@````````+4/``"/`$`(0`H``$<`
+M```$````:(````````"V#P``D`!`"$`*``!&````!`````C@````````MP\`
+M`)$`0`A0"@``1@````0````(@````````+@/``#V`$`)0`H``$<````$````
+M8(``````````````]P!`"T`*``!'````!````&"``````````````&``8`!@
+M``````````````#_________?P````!A`&$`80````,`````````________
+M_W\`````8@!B`&(````"`````````/________]_`````&,`8P!C````````
+M``````#_________?P````!D`&0`9`````,`````````_________W\`````
+M90!E`&4````#`````````/________]_`````&8`9@!F``````````````#_
+M________?P````!G`&<`9P``````````````_________W\`````:`!H`&@`
+M`````````````/________]_`````&D`:0!I`````P````````#_________
+M?P````!J`&H`:@````,`````````_________W\`````````````````````
+M90````$```#_____@````/____\`````2E```+0/````````:@````$```#_
+M____@````/____\`````2E```+0/````````````````````````````````
+M````````_P$```$````!`````0```%@;`````!```0````$````!````6!L`
+M``@``P`!``````````$```!8&P``#``#``$``````````0```%@;```@`$<`
+M````````````````6!L``#,`,``!``````````$```!8&P``)``A``$````!
+M`````0```%@;```H`#<``0`````````!````6!L``!\`,``!`````0````$`
+M``!8&P``,`!;``$``````````0```%@;``!P``,``0`````````!````6!L`
+M`#@`-P`!``````````$```!8&P``5`!5``$````!`````0```%@;``!$`%4`
+M`0````$````!````6!L``$P`.P`!``````````````!8&P``8`!2``$````!
+M`````0```%@;``!D`#0``0`````````!````6!L``'P`(``!`````0````$`
+M``!8&P``F`!;``$````!`````0```%@;``"<`%(``0````$````!````6!L`
+M`*H`$``!``````````$```!8&P``O``#``$``````````0```%@;``"_`#8`
+M`0`````````!````6!L``,0`-P`!`````0````$```!8&P``RP`W``$`````
+M`````0```%@;``#0`#<``0`````````!````6!L``-8`$``!`````0````$`
+M``!8&P``V@`#`````````````````%@;```R`S8``0`````````!````6!L`
+M`-X``P`!``````````$```!8&P``Z0`W``$``````````0```%@;``#V`#<`
+M`0`````````!````6!L``/H`-P`!``````````$```!8&P``_P`V``$`````
+M`````0```%@;```,`3```0````$````!````6!L``!0!-P`!``````````$`
+M``!8&P``+`$W``$``````````0```%@;``!``1```0````$````!````6!L`
+M`%0!`P`!``````````$```!8&P``6`$A``$````!`````0```%@;``!<`3<`
+M`0`````````!````6!L``&`!-P`!``````````$```!8&P``9`%;``$`````
+M`````0```%@;``!H`5(``0`````````!````6!L``&P!4@`!`````0````$`
+M``!8&P``=`$W``$``````````0```%@;``!X`0,``0`````````!````6!L`
+M`'P!-P`!``````````$```!8&P``B`%```$``````````````%@;``")`4$`
+M`0``````````````6!L``(H!2``!``````````````!8&P``BP%#``$`````
+M`````````%@;``",`4H``0``````````````6!L``(T!2P`!````````````
+M``!8&P``CP%,``$``````````````%@;``"G#X```0``````````````6!L`
+M`*@/@0`!``````````````!8&P``J0^"``$``````````````%@;``"J#X,`
+M`0``````````````6!L``*L/A``!``````````````!8&P``K`^%``$`````
+M`````````%@;``"M#X8``0``````````````6!L``*X/AP`!````````````
+M``!8&P``KP^(``$``````````````%@;``"P#XD``0``````````````6!L`
+M`+$/B@`!``````````````!8&P``L@^+``$``````````````%@;``"S#XP`
+M`0``````````````6!L``+0/C0`!``````````````!8&P``M0^.``$`````
+M`````````%@;``"V#X\``0``````````````6!L``+</D``!````````````
+M``!8&P``N`^1``$``````````````%@;``"0`4(``0`````````!````6!L`
+M`(X!`P`!``````````$```!8&P``F`%%``$````!`````0```%@;``":`44`
+M`0``````````````6!L``)L!10`!``````````````!8&P``G`%>``$`````
+M`````````%@;``">`0,``0`````````!````6!L``*P!-P`!``````````$`
+M``!8&P``I@$#``$``````````0```%@;``"V`3<``0`````````!````6!L`
+M`+@!-P`!``````````$```!8&P``N@$W``$``````````0```%@;``"^`2$`
+M`0````$````!````6!L``"<#`P`!``````````$```!8&P``R@%=``$`````
+M`````````%@;``#6`3<``0`````````!````6!L``.0!$``!`````0````$`
+M``!8&P``[`$P``$````!`````0```%@;``#X`0,``0`````````!````6!L`
+M`!`"-P`!``````````$```!8&P``*@(B``$``````````0```%@;``!"`C<`
+M`0`````````!````6!L````"6P`!``````````$```!8&P``2@(#``$`````
+M`````0```%@;``!/`A```0````$````!````6!L``%P"4@`!``````````$`
+M``!8&P``8`([``$````!`````0```%@;``!H`C<``0`````````!````6!L`
+M`&P"-P`!``````````$```!8&P``=@(0``$````!`````0```%@;``!Z`@,`
+M`0`````````!````6!L``(("`P`!``````````$```!8&P``@P(#``$`````
+M`````0```%@;``"J`B$``0`````````!````6!L``+X"6P`!`````0````$`
+M``!8&P``OP(W``$``````````0```%@;``#!`C<``0`````````!````6!L`
+M`,8".P`!``````````$```!8&P``U`(W``$``````````0```%@;``#P`C<`
+M`0`````````!````6!L``/0"-P`!``````````$```!8&P``^`(#``$`````
+M`````0```%@;``">`%```0````$````!````6!L``/P"`P`!``````````$`
+M``!8&P``#`,P``$``````````0```%@;```4`S8``0`````````!````6!L`
+M`!@#-@`!``````````$```!8&P``)`,#``$``````````0```%@;```0`P,`
+M`0`````````!````6!L``#H#-P`!``````````$```!8&P``2`,0``$````!
+M`````0```,$6``!*`Q(``0````$````!````6!L``%H#$0`!``````````$`
+M``!8&P``7`,Z``$````!`````0```%@;``!>`U8``0`````````!````6!L`
+M`,`"`P`!``````````$```!8&P``=P,#``$``````````0```%@;``#,`@,`
+M`0`````````!````6!L````````S$ST3%P`*!0``````````$``````````0
+M````1Q-1$Q<`"@4``````````!``````````$````#@3=!,7`!04````````
+M```0``````````<```!.$WL3&P8%!0```````````0``````````````41-Y
+M$QX&"@4```````````$``````````````%83=!,A!A0%```````````!````
+M``````````"K$[`3%P`*!0``````````$``````````,````L!/8$Q<`%!0`
+M`````````!```````````@```+\3OQ,7``H%```````````0``````````P`
+M````%'@4!084%```````````````````````````,A1N%!<`%!0`````````
+M`!@``````````0```#(4;A04`!04```````````8``````````$````\%'@4
+M#P`4%```````````!0``````````````/!1X%!$&%!0```````````$`````
+M`````0```#P4>!02`!04```````````%```````````````\%'@4%``4%```
+M````````!0``````````````/!1X%!<`%!0```````````4`````````````
+M`#P4>!07!A04```````````!```````````````\%,@4%`84%`(`````````
+M!```````````````>!2@%!<`%!0!``````````4``````````````(P4H!07
+M`!04`P`````````%``````````````",%,@4$@`4%`,`````````!0``````
+M````````C!3(%!0`%!0'``````````6``````````````(P4R!04!A04`P``
+M```````!``````````(```",%,@4%P84%`,``````````0`````````"````
+MC!3(%!<&%!0#``````````$``````````````(P4R!0>`!04````````````
+M``````````````",%$06!084%`,`````````````````````````H!3(%!$&
+M%!0#``````````$``````````````'P5]!4>!A04`@`````````$````````
+M``````!\%406%`84%`,``````````0`````````$````?!5$%AL`%!0#````
+M``````4``````````````'P51!8>`!04`P`````````%``````````````!\
+M%406%P`4%`<``````````8``````````````<1:M%A<`%!0`````````````
+M`````````````'$6K18>!A04``````````````````````````!Q%JT6'@84
+M%`(`````````!```````````````<1;!%@4&%!0`````````````````````
+M`````'$6P181`!04``````````````````````````!Q%L$6%``4%```````
+M````````````````````<1;!%AX`%!0``````````````````````````'$6
+MP18>!A04``````````````````````,```!Q%L$6'@84%```````````````
+M````````````.!-T$QX`%!0````````````$`````````````+`3V!,>`!04
+M````````````!``````````````R%&X4'@`4%`,```````````0`````````
+M````/!1X%!X`%!0#```````````$`````````````(P4R!0>`!04`P``````
+M````!`````````````!Q%L$6'@`4%`````````````0`````````````?!5$
+M%AX`%!0#```````````$`````````````(P4R!0>`!04````````````````
+M```````````\%'@4'@`4%```````````````````````````P1;!%AX`%!0`
+M```````````$````````````````````````````````````````"A1:%`4&
+M*"@``````````````````````````((4TA0%!B@H`0``````````````````
+M``````#Z%'(5!08H*```````````````````````````FA42%@4&*"@!````
+M`````````````````````!X41A0%!B@H``````````````````````````!N
+M%+X4!08H*`$`````````````````````````YA1>%04&*"@`````````````
+M`````````````(85)A8%!B@H`0````````````````````````!0%'@4$08H
+M*```````````````````````````4!1X%!<&*"@`````````````````````
+M`````%H46A01!B@H``````````````````````````!:%%H4%P`H*```````
+M````````````````````H!2@%!<&*"@!``````````(``````````````*`4
+MH!04!B@H`0`````````"``````````````""%((4$0`H*`$``````````@``
+M````````````JA2J%!0`*"@!``````````(``````````````((4JA04`"@H
+M`0`````````"``````````````""%*H4%P8H*`$``````````@``````````
+M````I!4<%A0&*"@!``````````(``````````````(`6J!84`"@H````````
+M``````````````````"`%J@6'@8H*```````````````````````````A1:M
+M%AX&*"@``````````````````````````%H4@A0/`"@H`P``````````!```
+M``````````"J%*H4$@`H*`,```````````0`````````````I!4<%A0`*"@#
+M```````````$`````````````(`6J!84`"@H````````````!```````````
+M``````````````@)1`D%!A0%```````````````````````````("40)%``4
+M!0``````````````````````````;`FH"04&%`4`````````````````````
+M`````&P)J`D4`!0%```````````@``````````````!L":@)'@`4!0``````
+M````````````````````;`F>"1L&%`4``````````````````````````&P)
+MG@D4`!0%```````````@``````````````"`"8H)%``4!0``````````````
+M````````````F0FH"10`%`4``````````````````````````*,)J`D4`!0%
+M```````````@(`````````````"T";0)!084!0``````````````````````
+M````M`FT"10`%`4``````````"`H`````````````-`)K`H%!A0%````````
+M```````````````````("40)%``4!0``````````````````````````;`EL
+M"10`%`4``````````````````````````'$)@`D4`!0%````````````````
+M``````````"%"8H)%``4!0``````````````````````````CPF9"10`%`4`
+M`````````````````````````)X)G@D4`!0%````````````````````````
+M``"C":,)%``4!0````````````0``````(``````HPFC"10`%`4`````````
+M``````````"``````*@)J`D4`!0%````````````!```````@`````"H":@)
+M%``4!0```````````````````(``````M`FT"10`%`4````````````$````
+M``"``````+0)M`D4`!0%````````````````````@```````````"`E$"04&
+M%`4```````````````````````````@)1`D4`!0%````````````````````
+M``````!L":@)!084!0``````````````````````````;`FH"10`%`4`````
+M`````$```````````````&P)J`D>`!0%``````````````````````````!L
+M"9X)&P84!0``````````````````````````;`F>"10`%`4``````````$``
+M`````````````(`)B@D4`!0%``````````````````````````"9":@)%``4
+M!0``````````````````````````T`FL"@4&%`4`````````````````````
+M`````*,)J`D4`!0%```````````@(``````````````("40)%``4!0``````
+M````````````````````;`EL"10`%`4``````````````````````````'$)
+M@`D4`!0%``````````````````````````"%"8H)%``4!0``````````````
+M````````````CPF9"10`%`4``````````````````````````)X)G@D4`!0%
+M``````````````````````````"C":,)%``4!0````````````0``````(``
+M````HPFC"10`%`4```````````````````"``````*@)J`D4`!0%````````
+M````!```````@`````"H":@)%``4!0```````````````````(``````````
+M```````````````````````("40)!08H*```````````````````````````
+MA0F%"04&*"@``````````````````````````(4)A0D4!B@H````````````
+M``````````````"%"84)$@8H*`````````````0`````````````T`FL"@4&
+M*"@`````````````````````````````````````````````````````_P$0
+M``$```````````````````````````(`""```````````````/\`````````
+M````````````$20`````````````````!10```````````````````4"````
+M```````````````3````````````````````4`$0````````````````````
+M```````````````!````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````4`(0``````````````````````````````````0`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````4`,0
+M````````````````````````````````$`@`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````4`00````````````````````
+M`````````(```(``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````4`40`````````````````````````````````$``````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````4`8P
+M``(``````````P```````````````(!``(`````````````````("0``````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````4`@P````````````````````
+M```#````````!``!````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````4`DP``(`````````!``````````#```````$(!``````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````,`$P
+M``(`````````!``````````#``````!`@```"```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````,`(P``(`````````!```````
+M```#`````$``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````,`,P``(`````````!``````````#``````!`````"```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````,`0P
+M``(`````````!``````````#`````$`@````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````,`4P``(`````````!```````
+M```#`````!``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````,`8P``(`````````!``````````#```````1``$`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````$`$0
+M`````````````````````````````"```0`"```````````````$$@``````
+M````````````$2``````````````````````````````````````````````
+M````````````````````````````````````(`$0````````````````````
+M```````````"`@`$````````````````````````````````````$B``````
+M````````````````````````````````````````````````````````````
+M````````````````8`$0``$``````````P```````````````""`0``"````
+M``````````#$$```````````````````(00`````````````````````````
+M````````````````````````````````````````````````````````90$0
+M``$``````````P``````````````.```````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````0`%`````````````"```````
+M```"``````0`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````0`)`````````````$``````````"````QP4`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````0`-`
+M`````````````(`````````"`````(``````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````0`1```0``````````(``````
+M```"`````(!`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````0`5```0``````````(`````````"`````(!```(`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````0`9`
+M````````````"``````````"`````(@`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````0`=```0`````````"(``````
+M```"`````(1`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````0`A```0`````````"(`````````"`````(1```(`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````0`E`
+M`````````````(`````````"````QX$`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````0`M```0``````````(``````
+M```"````QX%`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````4`W_````````````````````````````````````````
+M````````````````````````````````````````````````````"@``````
+M``````````````H`````````````````````````````````````````,`K_
+M````````````@``````````#````````````````````````````````````
+M``````````````````````````````````$````````````````````!````
+M```````````````$````````````````````,`LP``````````````$`````
+M```#````````````````````````````````````````````````````````
+M````````````@````````````````````(`````````````````````$````
+M````````````````,`PP``````````````(````````#````````````````
+M````````````````````````````````````````````````````$```````
+M`````````````!`````````````````````$````````````````````$`H0
+M````````````````````````````````````````````````````````````
+M````````````````````````````````(````````````````````"``````
+M```````````````$````````````````````0`I`````````````8'@`````
+M```"````````````````````````````````````````````````````````
+M````````````0`H``````````````````$`$```````````````````$````
+M````````````````4`I`````````````````````````````````````````
+M````````````````````````````````````````````````````"```````
+M``````````````@````````````````````$````````````````````F0$P
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"`````````````````````@`````
+M```````````````$````````````````````8`#_``,```````````0`````
+M```(``````````#@`P``````````````P`(`````````````````````````
+M`````````````,"O``````````````````#P"P`````````````````(````
+M````````````````9@#_``,```````````0````````(``````````#@`P``
+M````````````P`(``````````````````````````````````````,`'````
+M``````````````#P`0`````````````````(````````````````````9P#_
+M``,```````````0````````(``````````#@`P``````````````P`(`````
+M`````````````````````````````````,`O``````````````````#P"P``
+M```````````````(````````````````````:`#_``,```````````0`````
+M```(``````````#@`P``````````````P`(`````````````````````````
+M`````````````,!7``````````````````#P%0`````````````````(````
+M````````````````80#_``,```````````0````````0``````````#@`P``
+M`````````````````````````````````````````````````````,"O````
+M``````````````#P"P`````````````````(````````````````````8@#_
+M``,```````````0````````0``````````#@`P``````````````P`(`````
+M`````````````````````````````````,"O``````````````````#P"P``
+M```````````````(````````````````````8P#_``,```````````0`````
+M```(``````````#@`0``````````````P`(`````````````````````````
+M`````````````,`O``````````````````#P"P`````````````````(````
+M````````````````9`#_``,```````````0````````0``````````@`'```
+M````````````P`(``````````````````````````````````````,`'````
+M``````````````#P`0`````````````````(````````````````````90#_
+M``,```````````0````````0``````````"$"```````````````````````
+M`````````````````````````````````,!7``````````````````#P%0``
+M```````````````(````````````````````:0#_``,```````````0`````
+M```0``````````#``P``````````````P`(`````````````````````````
+M`````````````,`'``````````````````#P`0`````````````````(````
+M````````````````:@#_``,```````````0````````0``````````#``P``
+M`````````````````````````````````````````````````````,`O````
+M``````````````#P"P`````````````````(````````````````````F`'_
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````!``/``\P"(@?``
+M\P!!`(``@P")@8``@P!(`/(`]0"*@?(`]0!#`/8`]P"+@?8`]P!*`/$`]`",
+M@?$`]`!+`($`A`"-@8$`A`!,`((`A0"/@8(`A0````````````````"(`?``
+M\P")`8``@P"*`?(`]0"+`?8`]P",`?$`]`"-`8$`A`"/`8(`A0``````````
+M````````````````````"```````````````````````````````````````
+M`````````0)P%PL`C````````0(H(P\`$@```````0+@+@H`F`(``````0)0
+M1@X`)`(``````0+`70D`L`0``````0*@C`T`2`0``````0*`NP@`8`0`````
+M`0+PT@P`;`0`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````@`````````````````````````````````````````
+M``````$#<!<+`(P```````$#*",/`!(```````$#X"X*`)@"``````$#4$8.
+M`"0"``````$#P%T)`+`$``````$#H(P-`$@$``````$#@+L(`&`$``````$#
+M\-(,`&P$````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````(````````````````````````````````````````````
+M```!`G`7"P",```````!`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D
+M`@`````!`L!="0"P!``````!`J",#0!(!``````!`H"["`!@!``````!`O#2
+M#`!L!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````"```````````````````````````````````````````````
+M`0-P%PL`C````````0,H(P\`$@```````0/@+@H`F`(``````0-01@X`)`(`
+M`````0/`70D`L`0``````0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`
+M;`0`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````0```````````````````````````````````````````````$`
+MZ`,+`((```````$`T`<*!(0!``````$`?!4)!(L!``````$`^"H(!)8!````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````$H@`````````````(H@``1D8^4$9&/E`,H@``;$&`9&Q!@&00H@``
+M`Z"9`0.@F0$4H@``$-9,!!#63`08H@``0`"`$T``@!,<H@``8`#@&V``X!L@
+MH@``"H!3#`J`4PPDH@``.]\4`#O?%``HH@``M0$``+4!```LH@``(````"``
+M``"<F`````````````"<F`````````````"<F`````````````"<F```````
+M``````"<F`````````````"<F`````````````"<F`````````````"<F```
+M``````````"<F`````````````"<F`````````````"<F`````````````"<
+MF``````X````.`"<F`````````````"<F`````````````"<F```````````
+M``"<F```^0`$`/D`!`#4F`````````0`````````````````````````G)@`
+M````````````G)@`````````````G)@`````````````G)@`````````````
+MG)@`````````````G)@``````!`````0G)@```````0````$G)@`````````
+M````G)@`````````````G)@`````````````G)@````````````*G)@``(``
+M.`"``#@"G)@```8``@`&````G)@``)(```"2````G)@``*````"@````G)@`
+M``<`!``'``0`U)@``!H````:````G)@``$@```!(````G)@``!`````0````
+MG)@```@````(````G)@```\````/````G)@``/(```!B````G)@``$^0``!,
+MD```G)@``%H2``":$@``S)@```X````/````````````````````````````
+M```(```````````````````````````````````````````````!`G`7"P",
+M```````!`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D`@`````!`L!=
+M"0"P!``````!`J",#0!(!``````!`H"["`!@!``````!`O#2#`!L!```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M"````````````````````````````````````````````````0*X"PL`A@``
+M`````0*4$0\`"0```````0)P%PH`C`(``````0(H(PX`$@(``````0+@+@D`
+MF`0``````0)01@T`)`0``````0+`70@`,`0``````0)X:0P`-@0`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````@`
+M``````````````````````````````````````````````$"W`4+`(,`````
+M``$"R@@/``0```````$"N`L*`(8"``````$"E!$.``D"``````$"<!<)`(P$
+M``````$"*",-`!($``````$"X"X(`!@$``````$"O#0,`!L$````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````'````
+M```````````````````````````````````````````!`W`7"P",```````!
+M`^`N"@"8`@`````!`U!&#@`D`@`````!`\!="0"P`P`````!`Z",#0!(`P``
+M```!`X"["`!@`P`````!`_#2#`!L`P``````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````"```````
+M`````````````````````````````````````````0-P%PL`C````````0,H
+M(P\`$@```````0/@+@H`F`(``````0-01@X`)`(``````0/`70D`L`0`````
+M`0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`;`0`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````0`````````
+M``````````````````````````````````````$`Z`,;`((```````$`T`<:
+M!(0!``````$`?!49!(L!``````$`^"H8!)8!````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````,````````````
+M```````````````````````````````````!`.@#&P""```````!`-`'&@2$
+M`0`````!`'P5&02+`@`````!`/@J&`26`P```````G`7"P`,!````````B@C
+M#P`2!``````!`N`N"@`8!@`````!`E!&#@`D!@`````!`L!="0`P"``````!
+M`J",#0!("``````!`H"["`!@"``````!`O#2#`!L"```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````#0``````````````
+M`````````````````````````````````03Z``,`@0!D`F0"`03T`0<`@0#)
+M`<D!`03H`P(`@@'D`.0``030!P8`A`*@`*```02X"P$`A@.,`(P``0)P%PL`
+MC`0\`#P``0(H(P\`$@0\`#P``0+@+@H`F`8P`#```0)01@X`)`8P`#```0+`
+M70D`,`@L`"P``0*@C`T`2`@L`"P``0*`NP@`8`@L`"P``0+PT@P`;`@L`"P`
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!'0T,Z("A'3E4I(#,N
+M-"XT(%M&<F5E0E-$72`R,#`U,#4Q.```1T-#.B`H1TY5*2`S+C0N-"!;1G)E
+M94)31%T@,C`P-3`U,3@``$=#0SH@*$=.52D@,RXT+C0@6T9R965"4T1=(#(P
+M,#4P-3$X``!'0T,Z("A'3E4I(#,N-"XT(%M&<F5E0E-$72`R,#`U,#4Q.```
+M1T-#.B`H1TY5*2`S+C0N-"!;1G)E94)31%T@,C`P-3`U,3@``$=#0SH@*$=.
+M52D@,RXT+C0@6T9R965"4T1=(#(P,#4P-3$X``!'0T,Z("A'3E4I(#,N-"XT
+M(%M&<F5E0E-$72`R,#`U,#4Q.```1T-#.B`H1TY5*2`S+C0N-"!;1G)E94)3
+M1%T@,C`P-3`U,3@``$=#0SH@*$=.52D@,RXT+C0@6T9R965"4T1=(#(P,#4P
+M-3$X``!'0T,Z("A'3E4I(#,N-"XT(%M&<F5E0E-$72`R,#`U,#4Q.```1T-#
+M.B`H1TY5*2`S+C0N-"!;1G)E94)31%T@,C`P-3`U,3@``$=#0SH@*$=.52D@
+M,RXT+C0@6T9R965"4T1=(#(P,#4P-3$X``!'0T,Z("A'3E4I(#,N-"XT(%M&
+M<F5E0E-$72`R,#`U,#4Q.```1T-#.B`H1TY5*2`S+C0N-"!;1G)E94)31%T@
+M,C`P-3`U,3@``$=#0SH@*$=.52D@,RXT+C0@6T9R965"4T1=(#(P,#4P-3$X
+M``!'0T,Z("A'3E4I(#,N-"XT(%M&<F5E0E-$72`R,#`U,#4Q.```1T-#.B`H
+M1TY5*2`S+C0N-"!;1G)E94)31%T@,C`P-3`U,3@``$=#0SH@*$=.52D@,RXT
+M+C0@6T9R965"4T1=(#(P,#4P-3$X``!'0T,Z("A'3E4I(#,N-"XT(%M&<F5E
+M0E-$72`R,#`U,#4Q.```1T-#.B`H1TY5*2`S+C0N-"!;1G)E94)31%T@,C`P
+M-3`U,3@``$=#0SH@*$=.52D@,RXT+C0@6T9R965"4T1=(#(P,#4P-3$X``!'
+M0T,Z("A'3E4I(#,N-"XT(%M&<F5E0E-$72`R,#`U,#4Q.```1T-#.B`H1TY5
+M*2`S+C0N-"!;1G)E94)31%T@,C`P-3`U,3@``$=#0SH@*$=.52D@,RXT+C0@
+M6T9R965"4T1=(#(P,#4P-3$X``!'0T,Z("A'3E4I(#,N-"XT(%M&<F5E0E-$
+M72`R,#`U,#4Q.```1T-#.B`H1TY5*2`S+C0N-"!;1G)E94)31%T@,C`P-3`U
+M,3@``$=#0SH@*$=.52D@,RXT+C0@6T9R965"4T1=(#(P,#4P-3$X``!'0T,Z
+M("A'3E4I(#,N-"XT(%M&<F5E0E-$72`R,#`U,#4Q.```1T-#.B`H1TY5*2`S
+M+C0N-"!;1G)E94)31%T@,C`P-3`U,3@``$=#0SH@*$=.52D@,RXT+C0@6T9R
+M965"4T1=(#(P,#4P-3$X``!'0T,Z("A'3E4I(#,N-"XT(%M&<F5E0E-$72`R
+M,#`U,#4Q.```1T-#.B`H1TY5*2`S+C0N-"!;1G)E94)31%T@,C`P-3`U,3@`
+M`$=#0SH@*$=.52D@,RXT+C0@6T9R965"4T1=(#(P,#4P-3$X``!'0T,Z("A'
+M3E4I(#,N-"XT(%M&<F5E0E-$72`R,#`U,#4Q.```1T-#.B`H1TY5*2`S+C0N
+M-"!;1G)E94)31%T@,C`P-3`U,3@``$=#0SH@*$=.52D@,RXT+C0@6T9R965"
+M4T1=(#(P,#4P-3$X``!'0T,Z("A'3E4I(#,N-"XT(%M&<F5E0E-$72`R,#`U
+M,#4Q.```1T-#.B`H1TY5*2`S+C0N-"!;1G)E94)31%T@,C`P-3`U,3@``$=#
+M0SH@*$=.52D@,RXT+C0@6T9R965"4T1=(#(P,#4P-3$X``!'0T,Z("A'3E4I
+M(#,N-"XT(%M&<F5E0E-$72`R,#`U,#4Q.```1T-#.B`H1TY5*2`S+C0N-"!;
+M1G)E94)31%T@,C`P-3`U,3@``$=#0SH@*$=.52D@,RXT+C0@6T9R965"4T1=
+M(#(P,#4P-3$X``!'0T,Z("A'3E4I(#,N-"XT(%M&<F5E0E-$72`R,#`U,#4Q
+M.```1T-#.B`H1TY5*2`S+C0N-"!;1G)E94)31%T@,C`P-3`U,3@``$=#0SH@
+M*$=.52D@,RXT+C0@6T9R965"4T1=(#(P,#4P-3$X``!'0T,Z("A'3E4I(#,N
+M-"XT(%M&<F5E0E-$72`R,#`U,#4Q.```1T-#.B`H1TY5*2`S+C0N-"!;1G)E
+M94)31%T@,C`P-3`U,3@``$=#0SH@*$=.52D@,RXT+C0@6T9R965"4T1=(#(P
+M,#4P-3$X``!'0T,Z("A'3E4I(#,N-"XT(%M&<F5E0E-$72`R,#`U,#4Q.```
+M1T-#.B`H1TY5*2`S+C0N-"!;1G)E94)31%T@,C`P-3`U,3@``$=#0SH@*$=.
+M52D@,RXT+C0@6T9R965"4T1=(#(P,#4P-3$X``!'0T,Z("A'3E4I(#,N-"XT
+M(%M&<F5E0E-$72`R,#`U,#4Q.```+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A
+M8@`N<F5L+G1E>'0`+G)E;"YR;V1A=&$`+G)O9&%T82YS='(Q+C$`+G)E;"YD
+M871A`"YB<W,`+F-O;6UE;G0`````````````````````````````````````
+M`````````````````!\````!````!@`````````T````;+`!````````````
+M!``````````;````"0``````````````C,("`&@;```+`````0````0````(
+M````*0````$````"`````````*"P`0!(B0`````````````@`````````"4`
+M```)``````````````#TW0(`6`X```L````#````!`````@````Q`````0``
+M`#(`````````Z#D"`-X```````````````$````!````1`````$````#````
+M`````.`Z`@"$4@`````````````@`````````$`````)``````````````!,
+M[`(`.`````L````&````!`````@```!*````"`````,`````````@(T"`+`!
+M`````````````"``````````3P````$``````````````("-`@"$!P``````
+M```````!`````````!$````#```````````````$E0(`6```````````````
+M`0`````````!`````@``````````````9)<"`&`9```,````!P````0````0
+M````"0````,``````````````,2P`@#%$0`````````````!````````````
+M```````````````````````````````````#``$``````````````````P`#
+M``````````````````,`!0`````````````````#``8`````````````````
+M`P`(``````````````````,`"0`!````%(X``'X````2``$`#````*Q^```&
+M````$@`!`!<```#,_0``QP$``!(``0`B````>&0``'0````2``$`+0```"P3
+M`0`F`@``$@`!`#@```#,T@``-0```!(``0!#````V!T!`$@!```2``$`3@``
+M`$A:``#P````$@`!`%D```!D60$`Y````!(``0!D````0#D``*0!```1``8`
+M;P```-`"`0`C````$@`!`'H```!@7```+P```!(``0"%````R$X``-\````2
+M``$`D````.!)``"D`0``$0`&`)L```"(]P``)0```!(``0"F````9/,``!,`
+M```2``$`L0```)SI```,````$@`!`+P````(T@``O@```!(``0#'````<-T`
+M`.4````2``$`T@```,@*``":````$@`!`-T```"DQ@``D@```!(``0#H````
+MY*\``*`````2``$`\P```+29``!4````$@`!`/X```#8G0``"P```!(``0`)
+M`0``@((``"4````2``$`%`$``,3Z```L````$@`!`!\!``"0T0``!@```!(`
+M`0`J`0``_.8``!<````2``$`-0$``%05`0![````$@`!`$`!``"<!P``2```
+M`!(``0!+`0``E-0``.8````2``$`5@$``$21```&````$@`!`&$!``#<2@$`
+M=0```!(``0!L`0``:(4```8````2``$`=P$``.2=```/````$@`!`((!``"8
+M#@``0@$``!(``0"=`0``H$0``*0!```1``8`J`$``&ST``!T````$@`!`+,!
+M``!T@P``;@```!(``0"^`0``%`,``"P````2``$`R0$``-1,`0!8````$@`!
+M`-0!`````````````!````#U`0``F&$``$$````2``$```(``$SV```D`0``
+M$@`!``L"```$]@``2````!(``0`6`@``0,D``)8````2``$`(0(``)!C```D
+M````$@`!`"P"``",E@``2````!(``0`W`@``")H``'@````2``$`0@(``!3*
+M```Y````$@`!`$T"``"8E```%P```!(``0!8`@``%/4``%0````2``$`8P(`
+M`'R%``!A````$@`!`&X"``#88```,P```!(``0!Y`@``\'X``#D````2``$`
+MA`(``*SO``!T````$@`!`(\"``!\FP``2@```!(``0":`@``X/0``"`````2
+M``$`I0(``.SS``!@````$@`!`+`"``",TP``5P```!(``0"[`@``Y!4!`#<`
+M```2``$`Q@(``%A<```&````$@`!`-$"``!H]0``>````!(``0#<`@``S%(`
+M`.`%```2``$`YP(```R;```R````$@`!`/("``#(\0``,0```!(``0#]`@``
+MP`(``%,````2``$`"`,``$ST```@````$@`!`!,#``",.@$`"@$``!(``0`>
+M`P``%.8``"P````2``$`*0,``*0<`0!_````$@`!`#0#```\8P``&0```!(`
+M`0`_`P``?)$``)L````2``$`2@,``("5``!;````$@`!`%4#``#X?0``(0``
+M`!(``0!@`P``($`!`(@````2``$`:P,``,AS```>`@``$@`!`'8#```D9@``
+M`0```!(``0"!`P``J$`!`$@````2``$`C`,``$B````U`@``$@`!`)<#``!0
+M`0``60$``!(``0"F`P``%"L!``8#```2``$`L0,``%0!`0#T````$@`!`+P#
+M``#4F@``$0```!(``0#'`P``\#T!`(0!```2``$`T@,``-3Y``#O````$@`!
+M`-T#``!4`@$`#P```!(``0#H`P``K`(``!0````2``$`\P,``+"7```.````
+M$@`!`/X#``!0R@``TP```!(``0`)!```V,D``#D````2``$`%`0``'2I``!3
+M````$@`!`!\$``"L6```$````!(``0`J!```6&,``#<````2``$`-00``$`#
+M``#$`0``$@`!`$L$``"P&P$`(0```!(``0!6!```X(4``)H````2``$`800`
+M`%AD```@````$@`!`&P$``#`CP``%@```!(``0!W!```T!4!`!(````2``$`
+M@@0``,RW```J````$@`!`(T$``!@ZP``[@,``!(``0"8!```B.@```L````2
+M``$`HP0``"Q=``"(````$@`!`*X$``"4C@``.````!(``0"Y!```0$\!`#T`
+M```2``$`Q`0``-SI``#X````$@`!`,\$``"XF@```0```!(``0#:!```,&$`
+M`&4````2``$`Y00``"S)```4````$@`!`/`$``#`U0``5`<``!(``0#[!```
+M2#T!`*8````2``$`!@4``%SS```&````$@`!`!$%``!TE```(0```!(``0`<
+M!0``;`,!`%<````2``$`)P4``*1^```&````$@`!`#(%```<20$`/0$``!(`
+M`0`]!0``5)\``$4````2``$`2`4``#1@```_````$@`!`%,%``#@]0``(P``
+M`!(``0!>!0``%-T``%L````2``$`:04``!C0```?````$@`!`'0%```L30$`
+M/@```!(``0!_!0`````````````0````C`4``.A_``!@````$@`!`)<%``!<
+M:@``10```!(``0"B!0``T$H!``P````2``$`K04``-1-`0`+````$@`!`+@%
+M```P\@``=P```!(``0##!0``8`4```@"```2``$`U`4``'!#`0"J`P``$@`!
+M`-\%``"T8P``1````!(``0#J!0``&(0``(\````2``$`]04``*R:```!````
+M$@`!```&``!X\P``$0```!(``0`+!@``2%H!`'$````2``$`%@8``-1I``!7
+M````$@`!`"$&```$XP``B0```!(``0`L!@``3)$``"\````2``$`-P8``("K
+M``!<`0``$@`!`$(&```<?@``AP```!(``0!-!@``Z",!`#T&```2``$`6`8`
+M`$0$`0`X````$@`!`&,&``"4_P``+````!(``0!N!@``G)\``.4````2``$`
+M>08``+#W```C`@``$@`!`(0&``"0F```7````!(``0"/!@``P)H``!,````2
+M``$`F@8``/#Z``#<`@``$@`!`*4&```X00$`3`$``!(``0"P!@``@$\!`#P%
+M```2``$`NP8``$";```Z````$@`!`,8&``"`A@``#@```!(``0#1!@``O%L`
+M``L````2``$`W`8``,R.``#S````$@`!`.<&```@\0``)P```!(``0#R!@``
+MO&8``"0````2``$`_08``)":`0#:````$@`!``@'```89@```0```!(``0`3
+M!P``I/,```L````2``$`'@<``.#R```X````$@`!`"D'``!@30``I`$``!$`
+M!@`T!P``F-```&4````2``$`/P<``-1=`0!.````$@`!`$H'```@90``5```
+M`!(``0!5!P``])T```\````2``$`8`<``*1J```M`0``$@`!`&L'```,$P$`
+M'@```!(``0!V!P``;.\``"$````2``$`@0<``$CQ``"`````$@`!`(P'````
+M3@$`/@$``!(``0"7!P``>'(``!0````2``$`H@<``+QH```/````$@`!`*T'
+M``!`8@``M@```!(``0"X!P``/&H``!T````2``$`PP<``+CP``!H````$@`!
+M`,X'``!,&`$`QP(``!(``0#9!P``M$<!`&<!```2``$`Y`<``,`\``"D`0``
+M$0`&`.\'``"T70``C`$``!(``0#Z!P``'$(``%,````2``$`!0@``+1^```Y
+M````$@`!`!`(```L:@``#@```!(``0`;"``````````````0````.P@``-1K
+M````!@``$@`!`$8(````````"0```!$`!@!6"```(!\!`(0````2``$`80@`
+M`-R5```J````$@`!`&P(``"0KP$`V@```!(``0!W"```6-X``%X````2``$`
+M@@@```SR```B````$@`!`(T(```H9@```0```!(``0"8"```/!P!`&8````2
+M``$`HP@``+":```&````$@`!`*X(``!DG0``%@```!(``0"Y"```&)(``(@`
+M```2``$`Q`@``+#S```R````$@`!`,\(`````````````!````#>"```-)8`
+M`#,````2``$`Z0@``*!+``"D`0``$0`&`/0(```\`0$`%@```!(``0#_"```
+M%.0``#@````2``$`"@D``(2P``!1````$@`!`!4)``!D<@``%````!(``0`@
+M"0``#)D``'0````2``$`*PD``)3H```'`0``$@`!`#8)``!@1@``I`$``!$`
+M!@!!"0``</<``!<````2``$`3`D``'R7```Q````$@`!`%<)``#L`P$`5@``
+M`!(``0!B"0``@%<!`.0!```2``$`;0D``*"2``"X`0``$@`!`'@)``!$:0``
+M%P```!(``0"#"0``%)4``#L````2``$`C@D``%BT```>`0``$@`!`)D)```<
+M>```'P```!(``0"D"0``%`,!`%<````2``$`KPD``"!(``"D`0``$0`&`+H)
+M```(E@``+````!(``0#%"0``_)8``(`````2``$`T`D``/AB```Q````$@`!
+M`-L)```T1P$`'P```!(``0#F"0`````````````0````]0D``)C1```,````
+M$@`!```*``"0[P``'````!(``0`+"@``7%\``"$````2``$`%@H```#U```2
+M````$@`!`"$*``"DF@``!@```!(``0`L"@``7/```%D````2``$`-PH``(`^
+M``"D`0``$0`&`$(*```PGP``#@```!(``0!-"@``V(\``+H````2``$`6`H`
+M`!P!```S````$@`!`&8*````.P``I`$``!$`!@!Q"@``V)X``%<````2``$`
+M?`H``)20```+````$@`!`(<*```@````(````!$`!@"9"@``W&$``!L````2
+M``$`I`H``#1B```,````$@`!`*\*``"HZ0``,@```!(``0"Z"@``[&<``&@`
+M```2``$`Q0H``/Q;`0#8`0``$@`!`-`*``!4:```%@```!(``0#;"@``H)D`
+M`!(````2``$`Y@H``*`"`0`P````$@`!`/$*``#$30``R0```!(``0#\"@``
+M'$<!`!8````2``$`!PL``(">``!7````$@`!`!(+``"`F@``(P```!(``0`=
+M"P``=`(!`"D````2``$`*`L``#C0```>````$@`!`#,+``#P0`$`2````!(`
+M`0`^"P``@)D``"`````2``$`20L``"@J`0"U````$@`!`%0+``"@D```H@``
+M`!(``0!?"P``I-$``&$````2``$`:@L``$!```"D`0``$0`&`'4+```L:0``
+M%P```!(``0"`"P``X$T!`"`````2``$`BPL``%!;``!I````$@`!`)8+``!L
+M:```0P```!(``0"A"P``!,P``/D#```2``$`K`L``&!F``!;````$@`!`+<+
+M```,90``$@```!(``0#""P``3.0``$`!```2``$`S0L``'0_`0"I````$@`!
+M`-@+``!`GP``$@```!(``0#C"P``D$X``#<````2``$`[@L``)CF``!B````
+M$@`!`/D+``#,#0``;P```!(``0`$#```<`@``%<"```2``$`#PP``.CE```J
+M````$@`!`!H,``!T90``>````!(``0`E#```L&@```L````2``$`,`P``.PX
+M`0!V````$@`!`#L,``"L8```+````!(``0!&#```X"H!`#0````2``$`40P`
+M`,P_```L````$@`!`%P,```$!0``6@```!(``0!G#```(/```#L````2``$`
+M<@P`````````````$````((,``#XMP``A`$``!(``0"-#```.%L``!8````2
+M``$`F`P``%Q*`0!T````$@`!`*,,```,80``)````!(``0"N#```U.H``(P`
+M```2``$`N0P``$R8``!$````$@`!`,0,````T0``C@```!(``0#/#```````
+M```````0````[PP``.0'``"*````$@`!`/H,``"@7P``30```!(``0`%#0``
+M\%\``#L````2``$`$`T``%"5```O````$@`!`!L-``"07```FP```!(``0`F
+M#0``U)8``"<````2``$`,0T``+C>```3!```$@`!`#P-``#HF@``%0```!(`
+M`0!'#0``?`0!`"$!```2``$`4@T``!!F```&````$@`!`%T-``!`7P``'```
+M`!(``0!H#0``+&(```8````2``$`<PT`````````````$````($-``!8E```
+M'````!(``0",#0``R`L``+L````2``$`EPT``"QF```R````$@`!`*(-``!@
+MG@``'P```!(``0"M#0``R)L``"P````2``$`N`T```!S``#(````$@`!`,,-
+M``!<:0``'P```!(``0#.#0``^&$``#0````2``$`V0T``%#O```<````$@`!
+M`.0-``!D`@$`#P```!(``0#O#0``I!(!`&<````2``$`^@T``&B6```D````
+M$@`!``4.``!TY@``)````!(``0`0#@``I!\!`$,$```2``$`&PX``"QC```.
+M````$@`!`"8.``!\G0``6P```!(``0`Q#@``P)<``!D````2``$`/`X``*B$
+M``#`````$@`!`$<.``"XE```60```!(``0!2#@``O)H```$````2``$`70X`
+M`"Q_``"[````$@`!`&@.```@3P``I`$``!$`!@!S#@``F%\```8````2``$`
+M?@X``+"4```&````$@`!`(D.```06@``.````!(``0"4#@``R%L``(X````2
+M``$`GPX``$#F```S````$@`!`*H.```\#@``60```!(``0"U#@``N$P!`!L`
+M```2``$`P`X``.3S```&````$@`!`,L.```4F```.````!(``0#6#@``'#@!
+M`,T````2``$`X0X``/R<``!H````$@`!`.P.``"$H```VP@``!(``0#W#@``
+MX%```*0!```1``8``@\``.CB```<````$@`!``T/``!T8```-0```!(``0`8
+M#P``:`<``#(````2``$`(P\``(!?```7````$@`!`"X/``!42P$`8P$``!(`
+M`0`Y#P``^$(!`'8````2``$`1`\``,QH```/````$@`!`$\/``#LF```(```
+M`!(``0!:#P``2`(!``L````2``$`90\``-QH``!-````$@`!`'`/``!860``
+M1@```!(``0![#P``[&0``"`````2``$`A@\``'2+```B````$@`!`)$/``"$
+M#```1P$``!(``0"<#P``R-(```$````2``$`IP\``*B"``!*````$@`!`+(/
+M```PG@``%P```!(``0"]#P``'&8```8````2``$`R`\``)C+``!K````$@`!
+M`-,/``#T`@$`'P```!(``0#>#P``M&T!`+H````2``$`Z0\``.QE```C````
+M$@`!`/0/``"H3P``)P```!(``0#_#P``@$8``$$'```2``$`%1```,0#`0`G
+M````$@`!`"`0``!\:0``5P```!(``0`K$```H`4!``(-```2``$`-A```!3G
+M``!S`0``$@`!`$$0``!8T```/0```!(``0!,$```2)X``!<````2``$`5Q``
+M`/2"``!]````$@`!`&(0``!0/P``?````!(``0!M$```<(4```P````2``$`
+M>!```(QR``!S````$@`!`(,0```$G@``*0```!(``0".$```8*D``!(````2
+M``$`F1```*!9``!M````$@`!`*00``!\A@```0```!(``0"O$```^&,``&``
+M```2``$`NA```+C%```_````$@`!`,40``#4``$`:````!(``0#0$```&/,`
+M`$0````2``$`VQ```-R7```W````$@`!`.80``#HA@``B@0``!(``0#Q$```
+MX'H``+D"```2``$`_!```(SS```5````$@`!``<1````T```%@```!(``0`2
+M$0``3(<!`,(````2``$`'1$``*CR```W````$@`!`"@1``",Y0``60```!(`
+M`0`S$0``'!8!`"X"```2``$`/A$``%1'`0`>````$@`!`$D1``#,C0``1@``
+M`!(``0!4$0``D.,``(,````2``$`7Q$``"Q@```&````$@`!`&H1````FP``
+M"P```!(``0!U$0``Y(,``#,````2``$`@!$``/SQ```.````$@`!`(L1``!`
+M,P$`XP```!(``0"6$0``R*D``+@!```2``$`H1$``+A!``!A````$@`!`+H1
+M``!T1P$`/0```!(``0``>GHP,#5B-3@T-@!Z>C`P,F1B,3%C`'IZ,#)D8F8X
+M-S4`>GHP,F1B8C%B,@!Z>C`R9&(R,#4S`'IZ,#`R9&)A-#(`>GHP9F)B,64S
+M9@!Z>C!B-SEE83DT`'IZ,#5B.&,V-6$`>GHP,#5B-#!A9`!Z>C`U8CDT,F5D
+M`'IZ,&0X9&,V,F,`>GHP,#$Y9C0W,`!Z>C`R9&0Y-#)D`'IZ,#)D8F4W,V0`
+M>GHP,#5B-CDR8@!Z>C!B-F0R,S(U`'IZ,#`U8C@U,V0`>GHP,#$V9#DR90!Z
+M>C!C9F(Q.#<U`'IZ,#`R9&(S,6,`>GHP,F1A8F)A8P!Z>C`R9&)C.#4Q`'IZ
+M,#`P8C9C-C@`>GHP,#!B-F)F.`!Z>C`P8C9C9C5E`'IZ,#$V93%D9F0`>GHP
+M8C9F-3!B.`!Z>C`V93!A-&9E`'IZ,#`V-V0R8C$`>GHP,#)D8F,V,0!Z>C!B
+M-F-A,S(U`'IZ,#`U8C9C9F0`>GHP,39E,&1F9`!Z>C`P,&(V9C8X`&%T:%]H
+M86Q?<')O8V5S<U]N;VES969L;V]R`'IZ,#`U8C0X860`>GHP,F1B9C%B,@!Z
+M>C`P-6(X.&-B`'IZ,#,S96,X8F8`>GHP9&(T,C5C-0!A=&A?:&%L7V1M85]B
+M96%C;VY?<F5S<&]N<V5?=&EM90!Z>C`P8C9F,38Q`'IZ,#9E,#!B.&$`>GHP
+M,F1B9F,Q9`!Z>C!D8S1E,SDP`'IZ,&1A9F5D.#8`>GHP,&(V93(W80!Z>C`R
+M9&)B86(R`'IZ,&(V9#%E9F8`>GHP,39D.3!D9`!Z>C`R9&)E.#4Q`'IZ,#`U
+M8C8T9F0`>GHP,#!B-F0U,@!Z>C!B-F,Y969F`'IZ,#$V93`P9&0`>GHP,F1B
+M9#@W-0!Z>C`R9&(S,6(R`'IZ,#!B-S`Y,C,`>GHP,&(V9#0U,`!Z>C`P,&(V
+M9#%D`'IZ,&(V8S(S,C4`>GHP,F1B9&%B,@!Z>C`P,#5B-C,R`'IZ,#9D961D
+M.3,`>GHP,#$V9&$U,`!Z>C`P,#8W9#,R`'IZ,#!B-F0Y,C,`>GHP,#)D8C4Q
+M8P!Z>C`Q-F1C8F9E`'IZ,#!B-S`Q-#4`>GHP,#$V9&8R8P!Z>C!B-V9A9#-E
+M`'IZ,#$V9#DY,C``>GHP,F1B,6)A8P!Z>C!D8S9E,SDP`'IZ,#5B-S`Q93``
+M>GHP,#!B-F(Q,`!Z>C!B-S`Y969F`'IZ,#$V9&8X.6(`871H7VAA;%]A='1A
+M8V@`>GHP-F4P9F,P9`!Z>C`Q-F1A8C)D`'IZ,#)D8C$S-60`>GHP93`T-C@T
+M8@!Z>C`Q-F4R.3%D`'IZ,#`P8C9F93@`>GHP,&-F8C-E,`!Z>C`P,39D.30X
+M`'IZ,#$V93(P.6(`>GHP8C<P,65F9@!Z>C`P,&(V8SED`'IZ,#`P-6(U83(`
+M>GHP,F1B,3<P80!A=&A?:&%L7V-O;7!U=&5T>'1I;64`>GHP,F1B-6)A8P!Z
+M>C`P-6(X,3-D`'IZ,#!B-F,Y,C,`>GHP8C9B-3!B.`!Z>C`P-6(W9CED`'IZ
+M,&(W,#%D,#(`>GHP-F1F9C0T80!Z>C`R9&(U-S8S`'IZ,#9E96%F-C``>GHP
+M93`P-V-A,0!Z>C`P,F1A9C8R`'IZ,&(X,V%D,V4`>GHP,#!B-F(Y,`!Z>C`Q
+M-F0Y969A`'IZ,#$V9&4P-3$`>GHP,#`U8C9B,@!Z>C`U8C=F,3$T`'IZ,#1A
+M93`S,68`>GHP,F1B9&1F9`!Z>C`P-30W9F5D`'IZ,#!B-F)F-64`>GHP,&(W
+M,3<W9`!Z>C`P8C<P9C-D`'IZ,#$V9#@Y,C``>GHP,F1B,6%B,@!Z>C`P,#5B
+M-C(R`'IZ,#`P8C9F-S@`>GHP8C8Y8C`W8P!A=&A?:&%L7V9R964`>GHP-6(W
+M.6(Q8@!Z>C`P8C<P-S-D`'IZ,#)D8F5B8F0`>GHP8C5E,S$U,@!Z>C`Q-F1F
+M8F8Q`&%T:%]H86Q?;6AZ,FEE964`>GHP,39E,3@Y8@!Z>C!D8S)A-6,U`'IZ
+M,#`R9&,V,&(`>GHP-F1F,&(X80!Z>C`R9&(S,S5D`'IZ,&(V8S4S830`>GHP
+M9C4T9#%B,`!Z>C!B-F9D,S8S`'IZ,&0Y9&,V,F,`>GHP-6(W-#%E,`!Z>C`R
+M9&$Y8F%C`'IZ,&1C,C%D,V$`>GHP,&(W,3<S9`!Z>C`Q-F0Y9#0Q`'IZ,#`U
+M8C@T9F0`>GHP,#5B.&%B9`!Z>C`P8C<P,3(S`'IZ,#`U8C8U,F(`>GHP,F1B
+M,S@W-0!Z>C`Q-F4S,#EB`'IZ,#`U8C8P8C(`>GHP,F1B,3@W-0!Z>C`P,F1B
+M.#0R`'IZ,#)D8C$W-C,`>GHP8C=D96$Y-`!Z>C`P8C<P,38Q`'IZ,#$V9#=D
+M-#$`>GHP,#$V8V0S,@!Z>C`V9&4P8CAA`'IZ,#9D.61D.3,`>GHP9&(S960X
+M-@!Z>C`P-6(T.&5D`'IZ,#`R9&,X,&(`>GHP,#)D8F,T,@!Z>C`R9&)A.#4Q
+M`'IZ,#)D8C,S960`>GHP,#5B.#!F9`!Z>C`P-6(W9C)E`'IZ,#)D8F9D9F0`
+M>GHP,39E-C0X80!Z>C`P,F1A9F8R`'IZ,#`U8C<W.60`>GHP,#!B-F5E.`!Z
+M>C`Q-F4T-#AA`'IZ,#!B-F8V8F,`>GHP,39D83DR,`!Z>C`U8C<X,64P`'IZ
+M,#`R9&-A,&(`>GHP,#5B-#1A9`!Z>C`V9&1F-#1A`'IZ,&9A8S!C.6(`>GHP
+M8C9F.65F9@!Z>C`P8C9C-F)C`&%T:%]H86Q?861D:71I;VYA;%]S=V)A7V)A
+M8VMO9F8`>GHP,#`R9&(Y,@!A=&A?:&%L7W9E<G-I;VX`>GHP,F1B86,R90!Z
+M>C`R9&(W.6%E`'IZ,#`Q-F4U,S(`>GHP8C9C9C`P.0!Z>C`P,39E,3)C`'IZ
+M,#`Q-F0Y930`>GHP,#`R9&%E80!Z>C`P-6(U8V(R`'IZ,#$V9&$R-3$`>GHP
+M-F8V868V,`!Z>C`V9&9D9#DS`&%T:%]H86Q?;6%L;&]C`'IZ,#`P8C9D9#(`
+M>GHP,F1D.3)A9`!Z>C`Q-F1B,C4Q`'IZ,&4Q,#=C83$`>GHP,&(V8S<U90!Z
+M>C`Q-F1D,#4Q`'IZ,#)D8F0Q8C(`>GHP,F1C,3<V,P!Z>C!B-CDP9#9D`'IZ
+M,#$V9&8P-3$`>GHP,#$V9#DU,`!Z>C`P8C<P-F)C`'IZ,#`Q-F0X-S(`>GHP
+M-F1E9C0T80!Z>C`U8CAC,F5D`'IZ,#9F8CDT-V(`>GHP96)B,64S9@!Z>C!B
+M-F8Y9#`R`'IZ,&0Q-&0Q8C``>GHP8C0X,#,Q90!Z>C`Q-F1B8F9E`'IZ,#$V
+M934T.&$`>GHP,#$V9#@U,`!Z>C`P,&(V9F8X`&%T:%]H86Q?;65M8W!Y`'IZ
+M,#)D8F-B8F0`>GHP,39D83!D9`!Z>C`R9&)B9&9D`'IZ,#)D8C(X-3$`>GHP
+M,F1B9&,Q9`!Z>C`V9&(P8V8R`'IZ,#$V96(Y860`>GHP,&(V8V5B8P!Z>C!D
+M.30X-&$Q`&%T:%]H86Q?<')O8F4`>GHP,39E83EA9`!Z>C!F9#1D,6(P`'IZ
+M,#)D8C,W-C,`871H7VAA;%]B=6EL9&]P=',`>GHP,F1A9C,U9`!Z>C`V9&1D
+M9#DS`'IZ,&1A9&,V,F,`>GHP,39D9C(U,0!Z>C`P,&(V8S$P`'IZ,#$V9#DR
+M-3$`>GHP,F1B,#@U,0!Z>C!B-S(Q865D`'IZ,#8W8V9C864`>GHP,#!B-F-F
+M.`!Z>C!C.31D,6(P`'IZ,#)D869A8C(`>GHP-6(Y,F%E9`!Z>C`P-6(X8V-B
+M`'IZ,&(V9#EE9F8`>GHP,F1B,3%B,@!Z>C`R9&)F9F(Q`'IZ,#)D8F8W-C,`
+M>GHP,#5B-CAF9`!Z>C`P-6(T-&5D`'IZ,&(W,3%A960`>GHP8C5E,S$V,`!Z
+M>C!D.#0X-&$Q`'IZ,#$V9#AB,F0`>GHP,39E,#@Y8@!Z>C`R9&)B.#<U`'IZ
+M,#)D864X-3$`>GHP8C@Q96$Y-`!Z>C`Q-F1E8S%F`'IZ,#!B-F9E8F,`>GHP
+M93@Y-#DP-P!Z>C`P8C9E83=A`'IZ,#,S93AF8F8`>GHP8V9A-3@W-0!Z>C`R
+M9&(Y.6%E`'IZ,#)D8CEA8C(`>GHP,#!B-F)E.`!Z>C!D938X,S=F`'IZ,#$V
+M9&%B9F4`>GHP8C<P.60P,@!Z>C`V-V0R-64R`'IZ,#$Y9C-A,#$`>GHP-S`S
+M.30W8@!A=&A?:&%L7VUE;7IE<F\`>GHP-F1F9F,P9`!Z>C!B-C<U,&(X`'IZ
+M,#$V93)D9F0`>GHP,#!B-F0R,@!Z>C`V9F5A9C8P`'IZ,&1C-&$U8S4`>GHP
+M,&(W,&8W9`!A=&A?:&%L7W-W7V)E86-O;E]R97-P;VYS95]T:6UE`'IZ,#EF
+M-C1B-F$`>GHP,#5B-C4W80!Z>C`V9C,Y-#=B`'IZ,#9D83!C9C(`>GHP8C=B
+M860S90!Z>C`P8C9F.38Q`'IZ,&(V.3<S8F,`>GHP,F1B9#,U9`!Z>C`P-6(X
+M.&9D`'IZ,#)D8F)C,60`>GHP,F1A9F1F9`!Z>C`V9#=D9#DS`&%T:%]H86Q?
+M9&5L87D`>GHP,F1B,61F9`!Z>C`V-V0R9C0Q`'IZ,#)D868X-S4`>GHP8C=E
+M9&4V9`!Z>C`Q-F0X9#0Q`'IZ,#`R9&%E.3(`>GHP8C=A9&4V9`!Z>C`R9&)B
+M,S5D`'IZ,#)D8C-D9F0`>GHP,F1B-3-E9`!Z>C`Q-F1C96%E`'IZ,#`P8C9D
+M83(`>GHP,#!B-F4R,@!Z>C`U8C@P,#0Q`'IZ,#`Q-F0X-#@`>GHP,39D.6(R
+M9`!Z>C`P,39E,#)C`'IZ,#!B-S`W-V0`>GHP,#5B-CDW80!Z>C`P,39D864T
+M`'IZ,#$V93$P.6(`>GHP,#5B-&$R9`!Z>C`Q-F1E,&1D`'IZ,#$V9&8P9&0`
+M>GHP9&8P-V-A,0!Z>C`R9&)D-S8S`'IZ,#`P8C9E-3(`>GHP-C=D,&,T-P!Z
+M>C`U8C9C-F1B`'IZ,&,S,35E8C4`>GHP9&(Q960X-@!Z>C`V9#0P-F4P`'IZ
+M,#$V93`R-3$`>GHP,#`R9&)B,@!Z>C`P,F1D.#9D`'IZ,#`Q-F4Q-&0`>GHP
+M,F1B-3EA90!Z>C`P-C=D,C(Q`'IZ,#$V9#@P9&0`>GHP,#5B.#DS9`!Z>C`U
+M8C@Q8C%B`'IZ,#)D8C$S960`>GHP,&(V9#$R,P!Z>C`P,&(V8V4X`'IZ,#5B
+M.&%A960`>GHP8C9E9#,V,P!Z>C`R9&%F,6(R`'IZ,#`P-6(U93(`>GHP,S-E
+M8F9B9@!Z>C`U8C8X-F1B`'IZ,#`P8C9E9C@`>GHP8C<Q.6%E9`!Z>C`P-6(U
+M.&(R`'IZ,#5B-V1B,6(`>GHP8C@R9&4V9`!Z>C`P,39D-S,R`'IZ,#)D861A
+M8C(`>GHP9C0U939E,P!A=&A?:&%L7VEN:71?8VAA;FYE;',`>GHP,&(V9#9B
+M8P!Z>C!C,31D,6(P`'IZ,#`P,F1B9#(`>GHP9&$T.#1A,0!Z>C`Q-F4P8C@W
+M`'IZ,#5B.3`R960`>GHP9&,R93,Y,`!Z>C!A-C!D,30U`'IZ,#)D8F%B8F0`
+M>GHP,#!B-F,Q9`!Z>C`U8CAE865D`'IZ,#`U8C=B.60`>GHP,#5B-30T-@!Z
+M>C`U8C8T-F1B`'IZ,#!B-F8Y,C,`>GHP9&0V.#,W9@!Z>C`Q-F4Q,C4Q`'IZ
+M,&1C-F$U8S4`>GHP,F1B,S<P80!Z>C`P,#5B-C<R`'IZ,#9D969C,&0`>GHP
+M,F1B9C,U9`!Z>C`P,&(V8S<X`'IZ,#`Q-F0X,S(`>GHP,F1B-3<P80!Z>C`P
+M-6(V9#=A`'IZ,#`R9&(R.3(`>GHP,#5B.3!C8@!Z>C!B-F8U,S8S`'IZ,#`U
+M8C5C-#8`>GHP-F0Y,&-F,@!Z>C`V9#AD9#DS`'IZ,#$V9&9B.#<`>GHP,#$V
+M9&$T.`!Z>C!B-C8S,6$X`'IZ,#`R9&(P.3(`871H7VAA;%]G971W:7)E;&5S
+M<VUO9&5S`'IZ,#$V93%B.#<`````!@````$#``!?`````0,``(\````!`P``
+MT`````$#``#<`````0,``.T````!`P``]`````$#``#[`````0,```(!```!
+M`P``"0$```$#```-`@```G4``"0"```"@P$`/`(```)&``#V`@```C0!`-L%
+M```"NP``O08```*[``!^!P```AT!`(@'```!`@``K@<```(=`0"X!P```0(`
+M`$`(```"90``5@@```)E``"4"````0(``$T.```"_```:0X```(=`0![#@``
+M`0(``.X.```"'0$`^@X```$"``!M#P```0(``/,/```!`@``!A````$"``"G
+M$P```LP``&X8```"'P$`HQL```*"``!1)0```LP``'HE```"'P$`^24```(?
+M`0!Q)@```A\!`-$F```"@@``T3````$"``#C,````0(``(M````!!```M4``
+M``$$```I00```00``#)!```!!```A4(```$$``",0@```00``/-"```!!```
+M^D(```$$``!`0P```00``%-#```!!```6D,```+E``"E0P```00``&]$```!
+M!```>40```$$``#I1````00``/U$```!!```!44```$$``!S2````0(``'M(
+M```!`@``.4D```$$``!J20```00``)A)```!!```R4D```$$``#W20```00`
+M`"5*```!!```94L```(?`0"93````0(``+Y,```!`0``F4X```+\``!O3P``
+M`OP``+%/```"_```H%$```$$``"R40```00``+]1```!!```)%(```$$```V
+M4@```00``$-2```!!```XU(```+,```$4P```0(```I3```"Y0``DE,```(Z
+M`0`25````BX``$!4```"*0$`<E0```(I`0"A5````BD!`/%4```"*0$`+54`
+M``(I`0#B50```7H```98```"*0$`@E@```*"``"T6````H(``+Q9```!,```
+MRUD```$G`0`%6@```F(!`"Y?```";@``5%\```+E``!P7P```N4``(9?```!
+M`@``CU\```+E``#!7P```DD``%5@```"(P$`:&````)S``"+80```DX!`%MB
+M```"Y0``%&0```(D```W9````EH!`'!D```")```BF0```(D``#`9````EH!
+M``1E```")```AF4```(D``"\90```EH!``=F```")```4V8```(5`0"O9@``
+M`AH``-AF```"-@$`06<```(T`0!I9P```C0!`'IH```!\```B6@```$0``"A
+M:````B@!``YI```"-`$``VP```+\``!:;````CH!`')N```"M0``*&\```$"
+M``!<;P```H0!`*9P```"-`$`RG````))``#7<````I,```!Q```"5@``&W$`
+M``)]``!.<0```GX!`&UQ```""@``C'$```(7`0":<@```O<``,]R```"-`$`
+MZW(```(T`0`3<P```O<``&9S```"-`$`CW,```(T`0"<<P```O<``-ES```"
+M_```('0```(T`0!`=````C0!`&=T```"-`$`WG0```(T`0#^=````C0!`"MU
+M```"-`$`3W4```))``!\=0```I,``)!U```"-`$`FG4```*3```1=@```C0!
+M`"1V```"20``GWD```$"``#P>@```0(``/IZ```"Y0``!'L```$"```.>P``
+M`N4``&M[```"+@``DWL```(N```7?0```BX``#-]```"+@``3'T```(N``#'
+M?0```BX``$1^```"20``97X```(T`0!K?@```E$``.%^```"90$`'7\```(4
+M`0"7?P```A\!`-9_```"O```_X(```*@```0@P```DX!`$*#```"3@$`7X,`
+M``).`0!AA````C0!`)&$```"20``WX8```(N``#YA@```LP``!J'```!`@``
+M((<```+E``"?AP```I,!`.&'```"-`$`=H@```(T`0"QB````D<!``R)```"
+M1P$`28D```)'`0"LB0```0(``/&)```"=P$`+HH```(T`0!6B@```C0!`)&*
+M```"1P$`OHH```'1``#/B@```G\!`/**```"1P$`48L```)D`0"%BP```AP!
+M`(V+```"@@``:8P```(T`0`#C0```MP``)&-```"1P$`6(X```$P``!GC@``
+M`2<!`(J.```"C`$`290```+*``!LE````N4``(B4```"Y0``GI0```$"``"G
+ME````N4``.64```"20``H94```+A``"]E0```D`!`-"5```"-@``S)8```(%
+M`0#PE@```0(``!>7```"Y0``K)@```(D``#+F````EH!``29```")```'ID`
+M``(D``!4F0```EH!`)B9```")```&IH```(D``!0F@```EH!`)N:```")```
+M,YL```+=``!OFP```A4!`+N;```"&@``Y)L```(V`0`>G````C0!`$6<```"
+M-`$`H9T```&Y``"IG0```0<!`+&=```![```R9T```(H`0`=G@```DD```2A
+M```"_```+*(```*3`0!"HP```BX``%*C```"+@``8*,```$$``!ZHP```00`
+M`*6C```!!```MZ,```$$``#BHP```0(``/6C```!`@``#:0```$"```AI```
+M`0(``#FD```!`@``/J0```$"``!?I@```B`!`$JG```"-`$`;J<```))``![
+MIP```AP``/BG```"#`$`GJ@```)0``#1J````ID``/"H```"TP``#ZD```(W
+M``""J0```E4!`+*I```"-`$`VZD```)5`0!ZJ@```C0!`+FJ```"-`$`$ZL`
+M``(T`0!(JP```C0!`%6K```"50$`DZL```+\``!NK````AP``(*L```"-`$`
+MC*P```(<```&K0```C0!`!FM```"20``5JT```*(``!SK0```0(``("M```"
+M+@``D:T```$"``"YK0```BX``.2M```"+@``]JX```(T`0`!L````FX!`#&P
+M```!`@``EK````$"``"=L````0(``*^P```!`@``.[(```$$``!<L@```00`
+M`'FR```!!```0;,```$$``!5LP```BX``'&S```!!```@K,```(N``"?LP``
+M`BX``+&S```!!```PK,```(N``#?LP```BX``.^S```!!```$;0```$$```I
+MM````00``$2V```"W0``%KD```(3``";N0```04``*"Y```"'P$`K;D```$%
+M``"RN0```A\!`+>Y```!!0``S[D```$%``#>N0```04``.6Y```!!0``[KD`
+M``$%``#\N0```04``!2Z```!!0``*[H```$%```XN@```04``$FZ```!!0``
+M;;H```$%``"0N@```04``)ZZ```!!0``J+H```$%```9NP```04``%J[```!
+M!0``WKL```$%``#LNP```04``!*\```!!0``-;P```$%``!-O````04``%*\
+M```!!0``>[P```$%``"`O````04``/Z\```!!0``1[T```(2`0!_OP```0(`
+M`+O````!`@``J\$```)K``#$Q0```0(``-K%```!`@``=\<```$"``"ZQP``
+M`0(``,W'```!`@``]L<```$"```0R````0(``#+(```!`@``1<@```$"``!,
+MR0```O(``%W)```"!0$`FLD```(%`0#&R0```@4!``7*```"90$`0<H```(4
+M`0#+R@```A\!`!++```"80``F,X```$G`0">S@```3```*[.```!O@``O]``
+M``)T`0#0T````C0!`-O3```"+@``_-,```$"```-U````0(``!K4```!`@``
+M)]0```$"``!MU````K$``*?4```!`@``K=0```+E``!=U0```0(``&G5```"
+MY0``D=4```$"``"9U0```0(``*'5```!`@``U=4```+,```*U@```B4``!G6
+M```"@`$`@]8```**`0#9U@```AD``"'7```"0@``4]@```*)`0#IV````HD!
+M`!G9```"B0$`7MD```*)`0"MV0```HD!`!;:```!`@``&]H```$"``!DV@``
+M`G<!``';```"-`$`"=L```)"```IVP```C0!`%_;```"B0$`C]L```(N`0#6
+MVP```L,``/O;```"I```(MP```*'`0`UW````FP!`%7<```"&0$`>]P```*)
+M`0#UW````G\``![=```"<```0=T```)#``!.W0```H`!`%[=```"'`$`9MT`
+M``*"``!!W@```C0!`-GB```"J@``]N(```&+`0#_X@```0$``%'C```"J@``
+MU.,```$P``#CXP```2<!``OD```"D```N>4```))``#PY@```M0``+#K```!
+M`@``D.T```(D`0`U[P```B0!`&3O```"Y0``@.\```+E``"D[P```N4``,+O
+M```"Y0``//$```$"``!C\0```N4``-?S```"#0``"/0```(D```K]````EH!
+M`&3T```")```?O0```(D``"T]````EH!`/CT```")```>O4```(D``"P]0``
+M`EH!`/OU```")```E_8```):`0!_]P```B,``+OW```"%0``W_D```(5``#5
+M^@```0(``-SZ```!`@``Z_H```$"```7^P```0(``&_]```"A@``B?T```$"
+M``#!_0```A4!`/?]```!`@``2/\```$"``!._P```IT``(3_```"&@``L/\`
+M``(V`0#J_P```C0!``X``0`"-`$`O0$!``$K``#7`0$``=4``.L!`0`!X```
+M]0$!``&H``#]`0$``4H!``4"`0`!S@``#`(!``$4```5`@$``5<!`!P"`0`!
+MU0``(P(!``'@```Z`@$``B@!`(T"`0`"20``O`(!``(O``#'`@$``MD``.L"
+M`0`"@0``;04!``*.``#Y!0$``H`!`!8&`0`"_```>P8!``+'``"&!@$``MD`
+M``,'`0`""P``;@<!``)<``!V!P$``DL``(,'`0`"B@$`@0@!``$"``"3"`$`
+M`0(``*T(`0`"-`$`PP@!``$"``#J"`$``0(````)`0`"-`$`/@D!``(0`0"J
+M"@$``E@``-,*`0`"/P$`5PL!``*4``!G"P$``@0!`'<+`0`"0@$`!PP!``(C
+M```*#0$``JX``"T-`0`",@``.@T!``);``#N#0$``C0!`!`.`0`"-`$`(0X!
+M``(T`0!6#@$``C0!`.L.`0`"30``0`\!``*)``"?#P$``K8``+$/`0`"20``
+MO@\!``*8``!!$`$``A(!`*L1`0`"00``QA$!``(L``#A$0$``D4``&82`0`"
+M2```=Q(!``)8`0!&$P$``OP``&83`0`"E0$`NQ,!``(T`0#?$P$``JX``"\4
+M`0`"-`$`/A0!``)8``"S%`$``I0``,,4`0`"!`$`*14!``)(```Z%0$``E@!
+M`/(5`0`"@`$`3!8!``*``0`!&`$``C0!`"`8`0`"-`$`:A@!``+\``!9&@$`
+M`L<``%T;`0`"-`$`<!L!``))``"1&P$``H`!`%X<`0`"9@``Q!T!``(N```0
+M(0$``@T``-(B`0`"P0``#"L!``)8```R*P$``A\!`$,K`0`"'P$`=BL!``$"
+M``!]+@$``A,```4P`0`"$@$`F#,!``$"``!*-`$``N4``+LU`0`"5`$`^38!
+M``)4`0`+.0$``0(``!LY`0`!`@``.3D!``$"``!%.0$``0(``,X[`0`!`@``
+MV#L!``$"``!=/0$``BX```X^`0`"60``-#X!``)9``!@/@$``ED``)D^`0`"
+M90``QSX!``)9```3/P$``F4``$X_`0`"90``.4`!``+4``"40`$``M0``-Q`
+M`0`"90$`)$$!``(4`0`;0@$``A\!`'%"`0`"50``IT4!``$G`0"M10$``3``
+M`+M%`0`!O@``WT<!``*5`0#P1P$``C0!`/U'`0`"E0$`JD@!``(T`0#52`$`
+M`C0!`-](`0`"E0$`Y4P!``*!`0!'30$``H$!`/%-`0`"@0$`*4X!``(?`0`2
+M3P$``B\``%9/`0`"@0``ND\!``$"``!84P$``0(``.A3`0`"<```]U,!``)P
+M`0`*5`$``M@``#=4`0`"<`$`2E0!``+8``!W5`$``B\``(M4`0`"<`$`GE0!
+M``+8``!=50$``H$!`+!5`0`"G0``T%4!``*=```15@$``IT``!Y6`0`"G0``
+M058!``*=``!>5@$``IT``'A6`0`"G0``AU8!``(=`0"E5@$``IT``+M6`0`"
+MG0```%<!``*=``!%5P$``IT``%17`0`"'0$`<E<!``*=``#?5P$``IT``.Q7
+M`0`"G0``^5<!``*=```&6`$``IT``!-8`0`"G0``&U@!``)P`0`H6`$``M@`
+M`&%8`0`"G0``<5@!``*=``"'6`$``IT``)=8`0`"G0``IU@!``*=``"Y6`$`
+M`IT``,E8`0`"G0``UE@!``*=``#C6`$``IT``/!8`0`"G0``!5D!``)P`0`2
+M60$``M@``$I9`0`"<`$`5UD!``+8``"760$``H$!``9;`0`"G0``(UL!``*=
+M```_6P$``IT``%M;`0`"G0``=UL!``*=``!T7`$``H$!`$5>`0`!`@``5UX!
+M``$"``!N7@$``C0!`(I>`0`!`@``D5X!``$"``"D7@$``C0!`,%>`0`!`@``
+MREX!``$"``#=7@$``C0!``Y?`0`"B```*E\!``$"```W7P$``BX``$A?`0`!
+M`@``J%\!``(N``#67P$``BX``%9@`0`!`@``)V,!``$"``!<8P$``G8``&]C
+M`0`"=@``A6,!``$"``"?8P$``C0!`+EC`0`!`@``P&,!``$"``#68P$``C0!
+M`/-C`0`!`@``_6,!``$"```39`$``C0!`#!D`0`!`@``.F0!``$"``!09`$`
+M`C0!`&5D`0`!`@``L60!``)V``#,9`$``G8``.AD`0`"=@``_60!``)V```2
+M90$``G8``"=E`0`"=@``/64!``$"``!790$``C0!`'%E`0`!`@``H&4!``)V
+M``"U90$``G8``/QE`0`"=@``#&8!``)V```=9@$``G8``#5F`0`!`@``3V8!
+M``(T`0`1:`$``A\!`#IK`0`"5`$`&FT!``)4`0!#;0$``H(``&=M`0`"@@``
+MF6T!``$"``"@;0$``0(``*]M`0`!`@``QVT!``+,``#W;0$``LP``!9N`0`!
+M`0``(&X!``$!```J;@$``0$``#1N`0`!`0``/FX!``$!``!(;@$``0$``%)N
+M`0`!`0``7&X!``$!``"1;@$``0(``*-N`0`!`@``NFX!``(T`0#6;@$``0(`
+M`-UN`0`!`@``\&X!``(T`0`-;P$``0(``!9O`0`!`@``*6\!``(T`0#V;P$`
+M`BX``'QP`0`"+@``BG`!``(N``#8<`$``BX``.9P`0`"+@``+'$!``(N```Z
+M<0$``BX``()Q`0`"+@``D'$!``(N``#^<0$``0(``")T`0`!`@``.G0!``$"
+M``!9=`$``0(``'AT`0`!`@``I'0!``)V``"^=`$``G8``-ET`0`"=@``"'4!
+M``)V```F=0$``G8``$1U`0`"=@``8G4!``)V``"`=0$``G8``)YU`0`"=@``
+MQG4!``)V``#>=0$``G8``/YU`0`"=@``%G8!``)V``!M=@$``G8``'YV`0`"
+M=@``CW8!``)V``"C=@$``G8``,MV`0`"=@``W'8!``)V``#M=@$``G8```%W
+M`0`"=@``%7<!``)V```G=P$``0(``&AW`0`"=@``AG<!``)V``#)=P$``G8`
+M`-EW`0`"=@``[W<!``$"```(>`$``C0!`"1X`0`!`@``/G@!``(T`0!:>`$`
+M`0(``'1X`0`"-`$`D7@!``$"``"K>`$``C0!`,UX`0`!`@``ZG@!``(T`0`V
+M>P$``N4``$M[`0`"Y0``GGL!``+E``#1>P$``N4``.9[`0`"Y0``.7P!``+E
+M``!D?`$``N4``'E\`0`"Y0``S'P!``+E``#G@P$``H(```N$`0`"@@``7X<!
+M``+,``"/AP$``LP``+B'`0`!`0``PH<!``$!``#,AP$``0$``-:'`0`!`0``
+MX(<!``$!``#JAP$``0$``/2'`0`!`0``_H<!``$@```QB`$``0(``$.(`0`!
+M`@``78@!``(T`0!VB`$``0(``'V(`0`!`@``DX@!``(T`0"UB`$``0(``+Z(
+M`0`!`@``U(@!``(T`0"BB0$``BX``"B*`0`"+@``-HH!``(N``"$B@$``BX`
+M`)**`0`"+@``V(H!``(N``#FB@$``BX``"Z+`0`"+@``/(L!``(N```VC`$`
+M`0(``$Z,`0`!`@``;8P!``$"``",C`$``0(``+J,`0`"=@``THP!``)V``#D
+MC`$``0(```:-`0`!`@``'XT!``(T`0`WC0$``0(``%&-`0`"-`$`:8T!``$"
+M``"#C0$``C0!`)V-`0`!`@``MXT!``(T`0#4C0$``0(``.Z-`0`"-`$`,HX!
+M``$"``#KE@$``H(```^7`0`"@@``,Y<!``*"``"CF@$``LP``-.:`0`"S```
+M]9H!``+,```4FP$``0$``!Z;`0`!`0``*)L!``$!```RFP$``0$``#R;`0`!
+M`0``1IL!``$!``!0FP$``0$``%J;`0`!(```C9L!``$"``"8FP$``0(``*Z;
+M`0`"-`$`RIL!``$"``#1FP$``0(``.>;`0`"-`$`!9P!``$"```0G`$``0(`
+M`":<`0`"-`$`]IP!``(N``!\G0$``BX``(J=`0`"+@``V)T!``(N``#FG0$`
+M`BX``"R>`0`"+@``.IX!``(N``""G@$``BX``)">`0`"+@``EJ`!``$"``"N
+MH`$``0(``,V@`0`!`@``[*`!``$"```HH0$``G8``$"A`0`"=@``5*$!``)V
+M``"(H0$``BX``)6A`0`"=@``M:$!``)V``#-H0$``G8``-^A`0`!`@``!*(!
+M``$"```=H@$``C0!`#6B`0`!`@``3Z(!``(T`0!GH@$``0(``(&B`0`"-`$`
+MF:(!``$"``"SH@$``C0!`-"B`0`!`@``[:(!``(T`0`NHP$``0(``.NK`0`"
+M@@``#ZP!``*"```SK`$``H(``*.O`0`"S```TZ\!``+,``#UKP$``LP``!2P
+M`0`!`0``'K`!``$!```HL`$``0$``#*P`0`!`0``/+`!``$!``!&L`$``0$`
+M`%"P`0`!`0``6K`!``$@```(`````0$```P````!`0``$`````$!```4````
+M`0$``!@````!`0``'`````$!```@`````0$``"0````!`0``*`````$!```L
+M`````0$``#`````!`0``-`````$!```X`````0$``#P````!`0``0`````$!
+M``!$`````0$``$@````!`0``3`````$!``!0`````0$``%0````!`0``6```
+M``$!``!<`````0$``&`````!`0``9`````$!``!H`````0$``&P````!`0``
+M<`````$!``!T`````0$``'@````!`0``?`````$!``"``````0$``(0````!
+M`0``B`````$!``",`````0$``)`````!`0``2`$```$+`0!,`0```6,``%`!
+M```!OP``5`$```&R``!8`0```7D!`%P!```!T@``8`$```%3``!D`0```=X`
+M`&@!```!GP``;`$```%V`0!P`0```4D!`'0!```!O```>`$```$]``!\`0``
+M`8,``(`!```!5@``A`$```$?``"(`0```6<!`(P!```!D`$`D`$```$M``"4
+M`0```8L``)@!```!1@$`G`$```$H``"@`0```3L``*0!```!9P``J`$```%]
+M`0"L`0```7@!`+`!```!&`$`M`$```&S``"X`0```5X!`+P!```!80$`P`$`
+M``$(`0#$`0```=L``,@!```!.P$`S`$```&/``#0`0```7$!`-0!```!O0``
+MV`$```&U``#<`0```80``.`!```!K0``Y`$```%4``#H`0```<8``.P!```!
+M-P$`\`$```$-`0#T`0```:,``/@!```!,@$`_`$```'H`````@```5L!``0"
+M```!2P$`"`(```$J`0`,`@```3$``!`"```!M```%`(```%9`0`8`@```1H!
+M`!P"```!(P$`(`(```$\```D`@```7,``"@"```!0P$`+`(```'C```P`@``
+M`4X``#0"```!-0``.`(```&*```\`@```0@``$`"```!]```1`(```$\`0!(
+M`@```3,!`$P"```!]0``4`(```%^`0!4`@```6@``%@"```!"@``7`(```%C
+M`0!@`@```:L``&0"```!#@$`:`(```$7`0!L`@```6T!`'`"```!,0$`=`(`
+M``&E``!X`@```40``'P"```!+`$`@`(```$2``"$`@```;H``(@"```!;@``
+MC`(```'W``"0`@```?D``)0"```!4`$`F`(```%B`0"<`@```7P!`*`"```!
+M#@``I`(```%-`0"H`@```2$!`*P"```!"@$`L`(```&@``"T`@```4X!`+@"
+M```!`0``O`(```&.`0#``@```2D!`,@"```!60$`S`(```$:`0#0`@```2,!
+M`-0"```!/```V`(```%S``#<`@```0$``(@7```!1`$`C!<```%D`0"0%P``
+M`58!`)07```!>P$`F!<```%B``"<%P```70``*`7```!D@``I!<```%K``"H
+M%P```0P``*P7```!-```L!<```%@``"T%P```6$``+@7```!.```O!<```%J
+M`0#`%P```0P!`,07```!A@$`R!<```&```#,%P```70!`-`7```!`0$`U!<`
+M``&I``#8%P```28!`-P7```!(0``X!<```$&`0#D%P```1@``.@7```!9@$`
+M[!<```'F``#P%P```1X``/07```!*0``^!<```&L``#\%P```7H!```8```!
+M:`$`!!@```%U`0`(&````3@!``P8```!\0``$!@```'^```4&````>T``!@8
+M```!$0$`'!@```%\```@&````9<``"08```!<@``*!@```%(`0`L&````9X`
+M`#`8```!/P``-!@```$Y`0`X&````34!`#P8```!>```0!@```$Y``!$&```
+M`4P!`$@8```!W```3!@```$M`0!0&````>(``%08```!P@``6!@```'A``!<
+M&````4`!`&`8```!S0``9!@```$V``!H&````5\``&P8```!UP``<!@```%%
+M`0!T&````5,!`'@8```!)0$`?!@```$;``"`&````5H``(08```!+P$`B!@`
+M``&/`0",&````4<``)`8```!F0``E!@```%?`0"8&````=,``)P8```!`P$`
+MH!@```$=``"D&````?H``*@8```!-P``K!@```'_``"P&````>H``+08```!
+MC```N!@```$F``"\&````4\``,`8```!D0``Q!@```':``#(&````<H``,P8
+M```!50$`T!@```')``#4&````5`!`-@8```!C`$`W!@```$'``#@&````:$`
+M`.08```!;P``Z!@```%I``#L&````>X``/`8```!\@``]!@```$%`0#X&```
+M`0$``/P8```!*P$``!D```%'`0`(&0```<(```P9```!X0``$!D```%``0`4
+M&0```<T``!@9```!-@``'!D```$!``"T-0```0$``+@U```!`0``O#4```$!
+M``#`-0```0$``,0U```!`0``R#4```$!``#,-0```0$``-`U```!`0``*#<`
+M``%9```L-P```7\``#`W```!<@$`-#<```%J```X-P```4,``#PW```!U@``
+M0#<```&W``!$-P```1L!`$@W```!J@``3#<```%2``!0-P```9P``%0W```!
+M50``6#<```$"`0!<-P```5T!`&`W```!B0``9#<```']``!H-P```>0``&PW
+M```!E0$`<#<```&+`0!T-P```;@``'@W```!>P``?#<```$B`0"`-P```2<`
+M`(0W```!7`$`B#<```%1`0",-P```84``)`W```!8`$`E#<```%=``"8-P``
+M`3X!`)PW```!``$`H#<```'[``"D-P```1$``*@W```!:P$`K#<```%Y``"P
+M-P```=\``+0W```!<`$`N#<```'8``"\-P```94``,`W```!,`$`Q#<```'X
+M``#(-P```0\``,PW```!FP``T#<```$)``#4-P```98``-@W```!/0$`W#<`
+M``&O``#@-P```><``.0W```!/@``Z#<```$>`0#L-P```:(``/`W```!L```
+M]#<```$6`0#X-P```4P``/PW```!00$``#@```%/`0`$.````1,!``@X```!
+MD0$`##@```%(```0.````<4``!0X```!IP``&#@```&!`0`<.````4L``"`X
+M```!C0``)#@```&%`0`H.````:8``"PX```!RP``,#@```%!```T.````4H`
+M`#@X```!+```/#@```%```!`.````3H``$0X```!Z0``2#@```%%``!,.```
+M`7X``%`X```!,P``5#@```$R``!8.````1<``%PX```!<0``8#@```'V``!D
+M.````6P``&@X```!)`$`;#@```&``0!P.````<\``'0X```!4`$`>#@```&0
+M``!\.````8T!`(`X```!#P$`A#@```'0``"(.````2(``(PX```!<P$`D#@`
+M``%M``"4.````=0``)@X```!Q```G#@```'K``"@.````8D!`*@X```!%@$`
+MK#@```%,``"P.````4$!`+0X```!3P$`N#@```$3`0"\.````9(!`,0X```!
+M`0``W$<```$!``#@1P```0$``.1'```!`0``Z$<```$!``#L1P```0$``/!'
+M```!`0``3$@```$!``!02````0$``%1(```!`0``6$@```$!``!<2````0$`
+M`&!(```!`0``9$@```$!``!H2````0$``&Q(```!`0``<$@```$!``!T2```
+M`0$``'A(```!`0``?$@```$!``"`2````0$``(1(```!`0``B$@```$!``",
+M2````0$``)!(```!`0``E$@```$!``"82````0$``)Q(```!`0``H$@```$!
+M``"D2````0$``*A(```!`0``K$@```$!``"P2````0$``+1(```!`0``N$@`
+M``$!``"\2````0$``,!(```!`0``Q$@```$!``#(2````0$``,Q(```!`0``
+MT$@```$!``#42````0$``-A(```!`0``W$@```$!``#\2````0$```!)```!
+M`0``!$D```$!```(20```0$```Q)```!`0``$$D```$!```420```0$``!A)
+M```!`0``'$D```$!```@20```0$``"1)```!`0``*$D```$!```L20```0$`
+M`#!)```!`0``-$D```$!```X20```0$``#Q)```!`0``0$D```$!``!$20``
+M`0$``$A)```!`0``3$D```$!``!020```0$``%1)```!`0``6$D```$!``!<
+M20```0$``&!)```!`0``9$D```$!``!H20```0$``&Q)```!`0``<$D```$!
+M```P50```0$``#15```!`0``.%4```$!```\50```0$``$!5```!`0``1%4`
+M``$!``!(50```0$``&AB```!`0``;&(```$!``!P8@```0$``'1B```!`0``
+M>&(```$!``!\8@```0$``(!B```!`0``A&(```$!``#8;@```0$``-QN```!
+M`0``X&X```$!``#D;@```0$``.AN```!`0``[&X```$!``#P;@```0$``/1N
+M```!`0``"'L```$!```,>P```0$``!![```!`0``%'L```$!```8>P```0$`
+M`!Q[```!`0``('L```$!```D>P```0$``"B)```!`0``+(D```$!```PB0``
+M`0$``#2)```!`0``.(D```$!```\B0```0$``$")```!`0``1(D```$!```@
+M`````0,``"0````!`P``*`````$#```L`````0,``#`````!`P``-`````$#
+*```X`````0,`````
+`
+end
diff --git a/sys/contrib/dev/ath/public/i386-elf.inc b/sys/contrib/dev/ath/public/i386-elf.inc
new file mode 100644
index 0000000..977a465
--- /dev/null
+++ b/sys/contrib/dev/ath/public/i386-elf.inc
@@ -0,0 +1,58 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/i386-elf.inc#1 $
+#
+
+#
+# Compilation configuration for building i386-elf.
+# This assumes the build platform is also i386-elf.
+#
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX=
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+ifndef CONFIG_FRAME_POINTER
+COPTS+= -fomit-frame-pointer
+endif
diff --git a/sys/contrib/dev/ath/public/i386-elf.opt_ah.h b/sys/contrib/dev/ath/public/i386-elf.opt_ah.h
new file mode 100644
index 0000000..de94323
--- /dev/null
+++ b/sys/contrib/dev/ath/public/i386-elf.opt_ah.h
@@ -0,0 +1,7 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
diff --git a/sys/contrib/dev/ath/public/mips-be-elf.hal.o.uu b/sys/contrib/dev/ath/public/mips-be-elf.hal.o.uu
new file mode 100644
index 0000000..98c3497
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips-be-elf.hal.o.uu
@@ -0,0 +1,5761 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/mips-be-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`0`````````````!``@````!`````````````T4,$``0`0`T````
+M```H`!$`#N#_`_P```````````````````````!__P`````PA/__)`,`6#P"
+M```0@P!<)$(`A"B"`%D00``E)`(1!RB"`!P00``3)`(`4BB"`!H00`!1/`(`
+M`"B"`!,00``))`(`$RB"`!$00`!'/`(``"0"``=0@@!"/`(```/@``@``!`E
+M4((`1#P"```#X``(```0)1""`#X\`@``*((`4U!```<D`@!7)`,`'#P"```0
+M@P`[)$(`F`/@``@``!`E4((`,SP"```#X``(```0)1""`"L\`@``*((1"%!`
+M`!4D`A$3)`,`D3P"```0@P`L)$(`<"B"`)(00``*)`(0%"B"`(@00``F```0
+M)2B"`(940``C```0)3P"```#X``()$(`7%""`!P\`@```^``"```$"40@@`8
+M/`(``"B"$1000``&-`/P$R0"$1)0@@`./`(```/@``@``!`E/`(``!"#``\D
+M0@`T-`/Q&SP"```0@P`+)$(`(`/@``@``!`E`^``""1"```#X``()$(`$`/@
+M``@D0@!(`^``""1"`*P#X``(`````">]_^BOOP`0,(3__SB#%HPL8P`!.(*G
+M)RQ"``$`8A@E%&``!#"E__\D`A"W5((`!P``$"4\`@``)$(```!`^`D`H"`E
+M$````H^_`!"/OP`0`^``"">]`!@GO?_@K[\`&#"$__\D`@('$((`0H^H`#`H
+M@@(($$``%20"$1,H@@`3$$``"20"`!,H@@`1$$``-#P"```D`@`'$((`-@``
+M&"40```[)`(``1""`"8H@@`=$$``-@``&"4H@@`:%$``-"0"``$0```?)`0`
+M$Q""`!TH@A$4$$``#S0"\1LD`A$'$((`)"B"$0@00``&)`(1$B0"$!00@@`2
+M```8)1```"0D`@`!$((`%0``&"40```@)`(``1""`!$`1!`J%$``!C0"_QDT
+M`O`3$((`!@``&"40```7)`(``12"`!0``!@E)`0`$SP"```D0@```$#X":^H
+M`!`0```/`$`8)3P"```D0@```$#X":^H`!`0```)`$`8)3P"```D0@```$#X
+M":^H`!`0```#`$`8)20"``&M`@``$&``$`!@$"648@'(I&(`")1B`<JD8@`*
+MC&(!S*QB`!R48@'0I&(`()1B`=*D8@`BE&(!U*1B`"248@'6I&(`)@!@$"6/
+MOP`8`^``"">]`""LA0'8`^``""0"``$GO?_0K[\`+*^V`"BOM0`DK[0`(*^S
+M`!ROL@`8K[$`%*^P`!``@+`E`*"H)0#`H"4`X)@E``"`)3P"```D4@``/`(`
+M`"11```"P"`E`D#X"0*@*"4`5!@D$',`""0"``$"(/@))`0`"B80``$J`@/H
+M5$#_]@+`("4``!`EC[\`+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#
+MX``()[T`,```,"40H``(```8)0`#$$`P@P`!`$,8)23&``$`Q1`K%$#_^@`$
+M($(#X``(`&`0)8^I`!`PY___``<00`!'$"$``A"``$40(91(`"81``".```0
+M)0`'$$``1Q`A``(0@`!%$"&00P`E)`(``A!B`"0H8@`#$$``!20"``,08``*
+M`````!```'\``#`E$&(`6P`($,`D`@`$4&(`:``($(`0``!X```P)1$@``@D
+M`P#```<00`!'$"$``A"``$40(9!"`"E40``!)`,`8``&(,``!A(``$00(P`"
+M$(``1!`A``(0P`!(`!L``!`240```0`'``T`8C`A$```8B3&``J,@A(T4$``
+M+0`($("40@`",$*``!!``!$`"!$`/`,08C1C3=,`0P`9```0$``"&8(`````
+M``8@P`"#$"$D0@`5`$,`&P``$!)08``!``<`#0`"$0`0``!+)$8`D(R$$C00
+M@``6``@0@)2"``(P0D``$$``$3P#$&(`"!#`-&--TP!#`!D``!`0``(9@@``
+M````!B#``(,0(21"`!4`0P`;```0$E!@``$`!P`-``(0P!```#0D1@!(``@0
+M@#P#$&(T8TW3`$,`&0``$!```AF"```````&(,``@Q`A)$(`%0!#`!L``!`2
+M4&```0`'``T``A"`$```(R1&`"0\`Q!B-&--TP!#`!D``!`0``(9@@``````
+M!B#``(,0(21"`!4`0P`;```0$E!@``$`!P`-``(0@!```!,D1@`6/`,08C1C
+M3=,`0P`9```0$``"&8(```````8@P`"#$"$D0@`5`$,`&P``$!)08``!``<`
+M#0`"&(`M`@/H%$```B1F`+TD9@!<,,+__P/@``@`````E*,``C!C`"`48``6
+M)`(``I2C``(P8P#0)`0`P!!D`!$D`@`#E*,``C!C`-`D!`#0$&0`#"0"``24
+MHP`",&,`$!1@``@D`@`!E*(``C!""``L0@`!``(0(R0#__L`0Q`D)$(`!0/@
+M``@`````)[W_X*^_`!BOL0`4K[``$`#`B"4R(@"`$$``"0"@@"4D`PFT$@,`
+M:20"``XN`@FT4$``6"8"]C`0```H)@/VF3(B`0`00``>/`(``"1"````0/@)
+M`````!!``!$F`NRS+$(`,1!```\R(@%``!`0@`!0$"$``B!`)`(`!0("`!L`
+M`!@04$```0`'``TD`@`"%&(`,CP"__\0```Q-$(_#3(B`4```A`K+@,3B0!#
+M$"000``_)@+P8!```#X`````)`,)M!(#`$$D`@`.+@()M%!```HN`A.()@/V
+MF3P"9F8T0F9G`&(`&```$!```A!#``,?PQ```#4`0Q`C$$``+28"['@\`@``
+M)$(```!`^`D`````$$``&B8"[+,L0@`Q$$``&"X"$R4`$!"``%`0(0`"($`D
+M`@`%`@(`&P``&!!00``!``<`#20"``(48@`#/`+__Q````(T0C\--$(_"`""
+M&"$\`LS,-$+,S0!B`!D``!`0``(8@A```!0`8!`E+@(3)51```,F`O8P$```
+M"28"\&`\`\S,-&/,S0!#`!D``!`0``(1`A````@D0@`/)@+L>#P#S,PT8\S-
+M`$,`&0``$!```A""`````(^_`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_`!2O
+ML``0`*"`)8R%$C00H``,/`(``"1"````0/@)`````#P#```D8P"\`$,0(9!"
+M```"`@`8```0$A````B/OP`4/`(``)!"`+X"`@`8```0$@``````````C[\`
+M%(^P`!`#X``()[T`&">]_^BOOP`4K[``$`"@@"6,A1(T$*``"3P"```D0@``
+M`$#X"0`````\`P``)&,`O`!#$"$0```#D$,``#P"``"00P"^`@,`&P``$!)0
+M8``!``<`#8^_`!2/L``0`^``"">]`!@GO?_`K[\`/*^^`#BOMP`TK[8`,*^U
+M`"ROM``HK[,`)*^R`""OL0`<K[``&`"@F"628@`$%$``-0"`L"4``)`E)F,`
+M!"0$`/\`<A`AH$0``"92``$J0@`@%$#__`!R$"&.8@``&$``*0``D"4F=``$
+M/`(``"15```D'@`!)G<`!@`2@$`"$H`A`!"`@"8#`"`"8Q@AD&0`")!Q``L"
+MA!`AH%(``)!B``D`1!`E`H(0(:!2``"OH``0`L`@)0)@*"4D!@`.`J#X"0(@
+M."4F$``H`I`8(:1B``"OO@`0`L`@)0)@*"4D!@`.`J#X"0(@."4"\(`AI@(`
+M`"92``&.8@```D(0*A1`_]\`$H!`C[\`/(^^`#B/MP`TC[8`,(^U`"R/M``H
+MC[,`)(^R`""/L0`<C[``&`/@``@GO0!`+*(`(Q!``'PDB`'@/`(``"1"`,@`
+M!1B``&(8(8QB````0``(`````)2"`@BLX@```^``"```$"4#X``()`(`#0/@
+M``@D`@`-C0(````"$<(X0@`!`^``"#!"``$#X``()`(`#0/@``@D`@`-E0(`
+M"JSB```#X``(```0)94"``BLX@```^``"```$"6-`@``$```3S!"0`"-`@``
+M,$*``!```$PL0@`!C0(``#P#(``0``!'`$,0)(T"```\`Q``$```0P!#$"2-
+M`@``/`,(`!```#\`0Q`DC((!^*SB```#X``(```0)20"``%0P@`+A((!_!#`
+M`$$``!`E)`(``E#"``F4@@'^)`(``U#"``F,@@(``^``""0"``VLX@```^``
+M"```$"6LX@```^``"```$"6LX@```^``"```$"6-`@``$```(C!"(`"-`@``
+M$```'S!"$``#X``()`(`#8T"```\`P"`$```&0!#$"2-`@``$```%C!"!`"-
+M`@``$```$S!"`@`D`@`!4,(`$(R"$DQ0P``&D0(``B0"``)0P@`%E((22`/@
+M``@D`@`-$```"#!"``&LX@```^``"```$"4#X``()`(`#8R"$F@``A`K``(0
+M(R0#__,`0Q`D`^``""1"``V-`@`4K.(```/@``@``!`E)`(`#`/@``@`````
+M)`(`&1"B`!./HP`0+*(`&A!```8D`@`>)`(`#Q"B``<D`@`#$```&@````!0
+MH@`6K(<2:!```!8`````%,(`%"SB``400``2)`(``0/@``BLAP(`)`(``1#"
+M``8`!Q`K)`(``E#"``:DAQ)($```"`````"L@A),`^``""0"``$#X``()`(`
+M`0/@``@D`@`!$&```P`````D`@`,K&(```/@``@``!`E)[W_R*^_`#2OO@`P
+MK[<`+*^V`"BOM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@+`E`*"X)0#`\"4`
+MX(@E`\"0)2XB``@40``<``"@)3P"```D50```!00@`!7$"&44```E%,``@`0
+M%```4Q`EKD(``"92``0F,?_\`L`@)0*@^`D"`"@EKD(``"80``0F,?_\`G`8
+M*SAC``$N(@`$.$(``0!B&"048/_T)E(`!"XB``@00/_H)I0``0)>$"./OP`T
+MC[X`,(^W`"R/M@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#@G
+MO?_HK[\`%*^P`!"/HP`H)`(`#1"B`!2/L``L**(`#E!```4D`@`=4*``"B2"
+M`<@0```H```0)1"B`!0D@A)0)`(`'A"B`!8``!`E$```(H^_`!2L8@``)`(`
+M$*X"```0```<)`(``3P"```D0@VT`,`H)8QF````0/@)C@<``*X"```0```3
+M)`(``:QB```D`@`8K@(``!````XD`@`!5.``!R0#``0D`@`$K@(``(QC``",
+M@@($$```!:QB```4XP`$```0)8S"``"L@@($)`(``8^_`!2/L``0`^``"">]
+M`!B,HP`$$&``8P``$"6,P@``K*(``(S"``2LH@`(C,(`"*RB``R,P@`,K*(`
+M$(S#`!`D`O__$&(`!2QB`0!00``!)`,`_Q````.LHP`4)`(``JRB`!2,PP`4
+M)`+__Q!B`!$L8@0!4$```20#!``D`@`!K*(`&`!#$"M00``-C,,`&(RB`!@`
+M`A!`-$(``:RB`!@`0Q`K5$#_^XRB`!@0```$C,,`&(S"`!2LH@`8C,,`&"0"
+M__\08@`1+&($`5!```$D`P0`)`(``:RB`!P`0Q`K4$``#93"`!R,H@`<``(0
+M0#1"``&LH@`<`$,0*U1`__N,H@`<$```!)3"`!PD`@/_K*(`')3"`!P00``'
+M)`(`"I3#`!PL8@`04$```20#``\0```"I*,`(*2B`""4P@`>$$``!R0"``J4
+MPP`>+&(`$%!```$D`P`/$````J2C`"*DH@`BC,(`(*RB`"2,P@`DK*(`*(S"
+M`"BLH@`LC,(`+*RB`#",PP`$)`(`!!1B``4D`@`!C*,`!%!B``*LHP`X)`(`
+M`0/@``@`````C,,`!!!@`!X``!`EC,(`#*RB``B,P@``K*(``(S"``BLH@`$
+MC,(`#*RB``B,P@`0K*(`#(S"`!2LH@`0C,(`&*RB`!2,P@`<K*(`&)3"`""D
+MH@`<E,(`(J2B`!Z,P@`DK*(`((S"`"BLH@`DC,(`+*RB`"B,P@`PK*(`+"0"
+M``$#X``(`````">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)3P"```D0@```$#X
+M"0"@@"4`0(@E$B``'(^_`!R&(@`65$``%)8B`!8\`@``)$(```)`("4`0/@)
+M`@`H)0!`@"6.0@'``D`@)0!`^`D"("@E/`,``"1C`50`$(!``@.`(98#````
+M8A@A``,<`!````4``Q0#EB,`&`!#$"$``A0```(4`X^_`!R/L@`8C[$`%(^P
+M`!`#X``()[T`(">]_\"OOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`
+M(*^Q`!ROL``8`("@)0``\"6OH``0``"X):^@`!2.@A(P$$``0@``D"4\`@``
+M)%8!5``2$8`"@H`AA@("1@1!`#8F$0(P`H`@)3P#```D8P```&#X"0(@*"4`
+M0*@ECH(!P`*`("4`0/@)`B`H)0`5&$``=A@AE@0"1I1S````DR`A`$00(0`"
+M%````AP#E@(",C!"`0`00``/`'<0*E!``!\F4@`!`&"X)8Z"`<`"@"`E`$#X
+M"0(@*"66`P)&`&(8(0)C&",``QP```,<`Q```!*OHP`4`'X0*E!``!`F4@`!
+M`&#P)8Z"`<`"@"`E`$#X"0(@*"4`%2!``)8@(98C`!8`8A@AE((```!#$",`
+M`A0```(4`Z^B`!`F4@`!CH(2,`)"$"L40/_#`!(1@```D"4`$A&``H*`(88"
+M`D8$00`.)A$",(Z"`<`"@"`E`$#X"0(@*"4`0"`EE@(",C!"`0"/I0`4%$``
+M`P"%&"&/H@`0`((8(:8C`!@F4@`!*D(`0%1`_^P`$A&`C[\`/(^^`#B/MP`T
+MC[8`,(^U`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@GO0!````````````P
+MI?__,,;__Y2"```L0C`"/`,``!1```,D:`&P/`(``"1(`<@``"`E)`H`9#P)
+M4>LU*84?``000`!($"&40@```$8`&```&!(!0A`C``````!%`!@``!`2`&(8
+M(0``````:0`8```0$``"$4,``Q_#`$,0(Z3B```DA``!*((`"Q1`_^PDYP`"
+M`^``"``````PI?__)`,`_Q"C`!,D`@#_E(,``"QC,`,`!1"``$40(21"$L`0
+M8``,,$+__RRB`#\40``%``40@`!%$"$D0A4B`^``"#!"__\`11`A``(00"1"
+M$^PP0O__`^``"``````PI?__)`,`_Q"C``DD`@#_E((``"Q",`,DHPE@%$``
+M`S!C__\DH@C\,$/__P!@$"4#X``(`````">]_]"OOP`LK[0`**^S`"2OL@`@
+MK[$`'*^P`!@`H)`EED(``"Q"0``40``'`("@)99"`"Y00``%ED(``)9#`!80
+M8`".)`(``99"```L0C`#%$``'203`0$D$P%0ED(!=A!``'0``(@E)E```@)@
+M*"4F8@`!,%/__XZ"`:`"@"`E`$#X"2>F`!`00`!\`!$80`!P("&7H@`0``(2
+M`J2"`6``@!@EDZ(`$:1B`6(F,0`"ED(!=@(B$"H40/_M`F`H)1```%R60@%V
+MCH(!H`*`("4D!0$``$#X"2>F`!`00`!G`H`@)9>B`!```AI"ID,!8@`"$((P
+M0@!_ID(!9)>B`!```A%`,$(`?Z9"`68"8"@E)F(``3!3__^.@@&@`$#X"2>F
+M`!`00`!5EZ,`$``#(L*60@%F`$00):9"`68``QD",&,`?Z9#`6B7H@`0``(0
+MP#!"`'^F0@%J`F`H)29B``$P4___CH(!H`*`("4`0/@))Z8`$!!``$&7HP`0
+M``,C0I9"`6H`1!`EID(!:@`#&8(P8P!_ID,!;)>B`!```A!`,$(`?Z9"`6X"
+M8"@E)F(``3!3__^.@@&@`H`@)0!`^`DGI@`0$$``+9>C`!```R/"ED(!;@!$
+M$"6F0@%N``,2`C!"`'^F0@%P``,80C!C`'^F0P%REZ(`$``"$8`P0@!_ID(!
+M=(Z"`:`"@"`E`F`H)0!`^`DGI@`0$$``&)>C`!```QJ"ED(!=`!#$"6F0@%T
+MED(!=A!``!```(@E)E,``CP"```D5!30`!&`0"80`6`"<(`A`D`@)0*`^`F6
+M!0``I@(``"8Q``&60@%V`B(0*A1`__8`$8!`)`(``8^_`"R/M``HC[,`)(^R
+M`""/L0`<C[``&`/@``@GO0`P)[W_X*^_`!ROL@`8K[$`%*^P`!``P(`EE+$`
+M%`"@D"4`$2"``)$@(0`$((``D2`A`!$00"1"``,``A""`((@(3P"```D0@``
+M`$#X"0`$((``0!@E$&``08^_`!RN`P```!$00"1"``,``A""``(0@`!B$"&N
+M`@`(IA$`!!(@`#4``#`E)`@`!"0'``..!`````880`!D("&.!0`(``80@`!&
+M$"$``A"``$80(0`"$(``11`A`'(8(91C``"D0P``I(,`````("4`!A"``$80
+M(0`"$(``1A`A``(H@(X"``@`HA`A``08@`!D&"$``QB``$,0(:1$``2.`@`(
+M`*(0(0!#$"&D0``&)(0``2B"``140/_SC@(`"(X#``@`!A"``$80(0`"$(``
+M1A`A``(0@`!#&"&D:``&C@,`"`!#$"&D1P!"),8``0#1$"I40/_0C@0``"0"
+M``&/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_X`*!8)95B`!:DP@`&-`+>
+MK:>B``"GH@`"```8)93$``8``#@E`.00!S!"``%80``)).<``2AB``(00`"U
+M```0)0`#$$`#HA`AI$<``"1C``$DYP`!*.(`!!1`__,`Y!`'E6(`%*3"``0P
+M0O__5$```Y3"``00``"F```0)1!``*,``$@E)`H`!``)($``B2`A``0@@`")
+M("$`!"!``60@(22(`!B,Q0`(``D0@`!)$"$``A"``$D0(0`"$(``12@AE(,`
+M&*2C``",PP`(`$,0(92#`"JD0P`"```X)0`)$(``21`A``(0@`!)$"$``B"`
+MC,(`"`""$"$`!QB``&<8(0`#&(``0Q`AI$``!B3G``$HX@`$5$#_]XS"``B7
+MHP`"-`+>K51B`"&,Q``(EZ<````)$(``21`A``(0@`!)$"$`!R"``(<@(0""
+M("$`!""`C,(`"`""("&DB@`&E0(``J2"``B5`P`&`$,0(:2"``J5`P`*`$,0
+M(:2"``R5`P`.`$,0(:2"``Z5`@`$I((`$)4"``BD@@`2E0(`#*2"`!25`@`0
+M$```5*2"`!8`"2B``*DH(0`%*(``J2@A``4H@`"D("&7HP````,0@`!#$"$`
+M`A"``((@(94"``*D@@`(C,0`"`"D("&7HP`"``,0@`!#$"$``A"``((@(20"
+M`!2D@@`(C,0`"`"D("&7HP`"``,0@`!#$"$``A"``$00(20#`".D0P`*C,0`
+M"`"D("&7HP`"``,0@`!#$"$``A"``$00(20#`#^D0P`,EZ<````'$(``1Q`A
+M``(0@`"B."&,P@`(`.(X(23G``2DZ@`"E.(`!)4#``8`0Q`AI.(`!I4#``H`
+M0Q`AI.(`")4#``X`0Q`AI.(`"I4"``2DX@`,E0(`"*3B``Z5`@`,I.(`$)4"
+M`!"DX@`2EZ<``@`'$(``1Q`A``(0@`"B."&,P@`(`.(X(23G``0D`@`#I.(`
+M`I4"`!2DX@`,E0(`%J3B``Z5`@`8I.(`$"4I``&4P@`$`2(0*A1`_V$`"2!`
+M)`(``0/@``@GO0`()[W^B*^_`72OO@%PK[<!;*^V`6BOM0%DK[0!8*^S`5RO
+ML@%8K[$!5*^P`5``@*`E`*#P)203`5"OH`%,)`(``8^C`4P08@`P``"0)2AB
+M``(00``%)`(``E!@``>7P@`6$``!,```$"508@`]E\(`'!```%```!`E$$`!
+M)"I"``H00`!/)Z0`*#P5```"8"@E)G,``8Z"`:`"@"`E`$#X"2>F`4@00`$?
+MDZ4!21"@`$,FL130`B#X"0/`("4`$AA`)[``$`(#&"&D8@``EZ(!2``"*@(0
+MH``Y)E(``0(@^`D#P"`E`!(80`(#&"&D8@``)E(``2I"``I40/_E`F`H)1``
+M`"\GI``HE\(`&A!``/\GQ0`$``"`)20&`/\GI``0`!`00"1"`5``HA@AE&(`
+M`!!&``4`$A!``((0(91C``"D0P``)E(``280``$J`@`#%$#_]``0$$`0```9
+M)Z0`*!!``.HGQ0`&``"`)20&`/\GI``0`!`00"1"`4@`HA@AE&(``!!&``4`
+M$A!``((0(91C``"D0P``)E(``280``$J`@`#%$#_]``0$$`0```$)Z0`*!``
+M`-R/OP%T)Z0`*#P"```D0@```$#X"20%`1RGL@`\&D``L0``@"4GM0`H)[<`
+M+">V`"XGL0`J`!`00`*B*"$GI``0`((@(92#``"DHP```%`0(0`"$(``4!`A
+M``(00`!5$"&4@P``I$,`&`)@*"4F<P`!CH(!H`*`("4`0/@))Z8!2!!``+H`
+M$!A``'`8(0`#&(``<!@A``,80`!W*"&3I`%)EZ(!2``"$$`P0@$``((@(Z2D
+M`!@`=1@AEZ(!2``"(@(``A/"``(2``""(".D9``@`F`H)29S``&.@@&@`H`@
+M)0!`^`DGI@%($$``H``0&$``<!@A``,8@`!P&"$``QA``'<H(9.D`4F7H@%(
+M``(00#!"`0``@B`CI*0`(`!U&"&7H@%(``(B`@`"$\(``A(``((@(Z1D`"@"
+M8"@E)G,``8Z"`:`"@"`E`$#X"2>F`4@00`"&`!`80`!P&"$``QB``'`8(0`#
+M&$``=B`AEZ(!2#!"`!^D@@`8)&,`(`(C("&7H@%(``(10C!"`!^D@@```L,8
+M(9>B`4@``A*",$(`'Z1B```"8"@E)G,``8Z"`:`"@"`E`$#X"2>F`4@00`!K
+M`!`80`!P&"$``QB``'`8(0`#&$`D8P`H`N,H(9.D`4F7H@%(``(00#!"`0``
+M@B`CI*0```+#&"&7H@%(``(B`@`"$\(``A(``((@(Z1D```"8"@E)G,``8Z"
+M`:`"@"`E`$#X"2>F`4@00`!0DZ,!20`0$$``4!`A``(0@`!0$"$``BA`)Z8`
+M*`"F("&7H@%(``(00#!"`0``8A@CI(,`,)?"```L0D`#%$``#``0&$`DH@`H
+M`B(8(0#"$"&40@``I&(```"Q&"&7H@%(``(2`C!"`#\0```/I&(`&`!P&"$`
+M`QB``'`8(0`#&$``<2@AEZ(!2``"(@(``A/"``(2``""(".DI``H`*`8)20"
+M``&D8@`8)A```0(2$"H40/]6`!`00(^C`4P``S!``-X0(91"`&BGH@`^`,,P
+M(0`&,(`#QC`A`H`@)2>E`"@\`P``)&,8!`!@^`DDQ@UD$$``$P*`("6/H@%,
+M``(P0`#","$`!C"``\8P(2>E`"@\`P``)&,9=`!@^`DDQ@UD$$``"(^_`72/
+MH@%,)$(``:^B`4PH0@`#%$#^R"0"``&/OP%TC[X!<(^W`6R/M@%HC[4!9(^T
+M`6"/LP%<C[(!6(^Q`52/L`%0`^``"">]`7@GO?_@K[\`'*^R`!BOL0`4K[``
+M$`"@D"4``(`E/`(``"11````$!!``%`0(0`"$(`"0A`AC$0-9%"```0F$``!
+M`B#X":Q`#60F$``!*@(``U1`__4`$!!`C[\`'(^R`!B/L0`4C[``$`/@``@G
+MO0`@`(!()3"E__^E)0`4E2,`%C!B``$00``"``!`)20(``$``Q!",$(``1!`
+M``(E`@`!,$C__P`#$((P0@`!$$```B4"``$P2/__``,0PC!"``$00``")0(`
+M`3!(__\0H``5```X)24J``(`!Q!``$88(91D```!(A@AI&0```!'$"$``AD`
+M`$,0(0`"$$`D0@`8`2(8(:1D```!0A`AI$@``"3B``$P1___`.40*Q1`_^\`
+M!Q!``^``"``````GO?^HK[\`5*^^`%"OMP!,K[8`2*^U`$2OM`!`K[,`/*^R
+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
+M``8EB@`()!@`!"0/``$D#@`%``<00`"B&"&49````8(8(:1D````1Q`A``(9
+M``!#$"$``A!`)$(`&`&"&"&D9````R(0(:1+`````$`E```@)0`'$$``1Q`A
+M``(9``!#$"$``C!```000`!$$"$``A#``$80(21#`!@!HQ`AI$0```")$`<P
+M0@`!$$``!P%#&"$E`@`!,$C__Q4/``FD>```$```!Z1N````!!!``$00(0`"
+M$,``1A`A`$H0(:1``!@D@@`!,$3__RR"``040/_F``000"3B``$P1___E*(`
+M%`#B$"L40/_+``<00`/@``@`````)[W_Z*^R`!"OL0`,K[``"`"@D"4`P(@E
+M-`+>K:>B``"GH@`"IZ(`!*>B``8``(`EEB0`%@``:"4D!0`#`*T8(P!D$`<P
+M0@`!$$``!``0$$`#HA`AI$,``"80``$EH@`!,$W__RVB``040/_U`*T8(Y9"
+M`!2F(@`4,$+__Q!``$X``'`E``X00`!.$"$``AD``$,0(0`"$$`"0A@A)'@`
+M&`!1$"&48P`8I$,`&!(``#P``&@E``X00`!.$"$``AD``$,0(0`"R$`G#P`$
+M``T@0`.D$"&40@````(80`!B&"$``QC``R,8(0!Q&"$`CQ`AA$(`"``"$("D
+M8@`L`>0@(92"``"D8@`B)`@``91B`"`!`A`K$$``'21L`!XEBP`&)PH`!"6)
+M``0`""A``*LX(0#@,"4`"""``(T@(0`$($``BA`AA$,`,``#&$"4P@`&`$,0
+M(:3B``@!)3`A`*DH(0"*("&4H__^E((`"`!B&"&DPP``)0(``3!(__^5@@`"
+M`0(0*Q1`_^D`""A`):(``3!-__\!L!`K%$#_S0`-($`EP@`!,$[__Y8B`!0!
+MPA`K%$#_M0`.$$`D`@`!C[(`$(^Q``R/L``(`^``"">]`!@GO?_`K[\`.*^U
+M`#2OM``PK[,`+*^R`"BOL0`DK[``(`"`H"4`H)@E)`(`!*>B`!@D`@`&IZ(`
+M&B0"``FGH@`<)`(`#*>B`!X``*@E/`(``"1"````0/@))`0$%`!`@"42``",
+M`J`0)99B`!800``MEG(`T#P"```D0@```@`@)0!`^`DD!004EF(`:*8"`!8D
+M`@`*KZ(`$*^@`!0\`@``)$(C$`*`("4"8"@E`@`P)0!`^`D"0#@E$$``<```
+M```F<0UDEF(`:*9B#7H\`@``)$(IS`(@("4`0/@)`@`H)3P"```D0BLP`H`@
+M)0(`*"4`0/@)`B`P)1!``&``````E@(`&@`"$$``71`AE$,`%I8"`!0`0P`8
+M```0$@)"D"$F4@`%EF(`&A!``"T\`@``)$(```(`("4`0/@))`4$%)9B`&JF
+M`@`6)`(`!*^B`!`D`@`!KZ(`%#P"```D0B,0`H`@)0)@*"4"`#`E`$#X"0)`
+M."400`!!`````"9Q$7B68@!JIF(1CCP"```D0BG,`B`@)0!`^`D"`"@E/`(`
+M`"1"*S`"@"`E`@`H)0!`^`D"(#`E$$``,0````"6`@`:``(00`!=$"&40P`6
+ME@(`%`!#`!@``!`2`D*0(292``*68@`<$$``)#P"```D0@```@`@)0!`^`DD
+M!004EF(`;*8"`!8D`@`$KZ(`$"0"``*OH@`4/`(``"1"(Q`"@"`E`F`H)0(`
+M,"4`0/@)`D`X)1!``!(`````)G$5C)9B`&RF8A6B/`(``"1"*<P"("`E`$#X
+M"0(`*"4\`@``)$(K,`*`("4"`"@E`$#X"0(@,"400``"`````"05``$2```$
+M/`(``"1"````0/@)`@`@)0*@$"6/OP`XC[4`-(^T`#"/LP`LC[(`*(^Q`"2/
+ML``@`^``"">]`$`GO?_`K[\`/*^^`#BOMP`TK[8`,*^U`"ROM``HK[,`)*^R
+M`""OL0`<K[``&`"@D"660@``+$)``!1```L`@)@EED,`+B0"``%48@`(ED(`
+M`#P"```D0AR0`$#X"0`````0``#%C[\`/)9"```L0E``%$``#```N"660P`N
+M)`(``E1B``F60@``/`(``"1"+0`"8"`E`$#X"0)`*"40``"VC[\`/)9"```L
+M43`#`!&((R0"_[`"(H@D)`(``1+B`!`F,0%0*N(``A!```4D`@`"$N``!R8Q
+M``40``"F```0)5+B``^60@`<$```%```$"6650%V)E`!>!```!(F5@%BED(`
+M&E!``)<F]P`!)C$`-Y95`X`F4`0^$```"B96`XA00`"0)O<``28Q`$:650.`
+M)E`#HA````,F5@."$```CH^_`#P2H`"&``"@)3P"```D7A1``!000`!6$"&4
+M0@``I@(```(@*"4F,0`!CF(!H`)@("4`0/@))Z8`$!!``'T"8"`EEZ(`$``"
+M$H*F`@`$EZ(`$``"$0(P0@`_I@(``I>B`!```A"`,$(`/Z8"`!X"("@E)C$`
+M`8YB`:``0/@))Z8`$!!``&N7HP`0``,;@I8"`!X`0Q`EI@(`'I>B`!```A("
+M,$(`/Z8"`""7H@`0``(0@C!"`#^F`@`BEZ(`$``"$0`P0@`_I@(`)`(@*"4F
+M,0`!CF(!H`)@("4`0/@))Z8`$!!``%.7HP`0``,;`I8"`"0`0Q`EI@(`))>B
+M`!```A&",$(`/Z8"`":7H@`0,$(`/Z8"`"@"("@E)C$``8YB`:`"8"`E`$#X
+M"2>F`!`00`!``F`@)9>B`!```A*"I@(`*I>B`!```A$",$(`/Z8"`"R7H@`0
+M``(0@#!"`#^F`@`N`B`H)28Q``&.8@&@`$#X"2>F`!`00``NEZ,`$``#&X*6
+M`@`N`$,0):8"`"Z7H@`0``(2`C!"`#^F`@`PEZ(`$``"$((P0@`_I@(`,@)`
+M("66!0`"E@8`!`/`^`DF!P`(E@(`!A!``!$``"@E)@8`!@`%($`DA``8`,0@
+M(82#`````Q!``$,0(0`"$,``0Q`A``(00*2"```DI0`!E@(`!@"B$"H40/_S
+M``4@0":4``$"E1`J%$#_?B80`#0F]P`!*N(``U1`_T^60@``)`(``8^_`#R/
+MO@`XC[<`-(^V`#"/M0`LC[0`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`0">]
+M_\"OOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`("X
+M)0"@D"4``*@EED(``"Q"0`!40``$ED(``)9"`"00```&)%'_JRQ1,`,`$8@C
+M)`+_L`(BB"0F,0%0)`(``1*B``XJH@`"$$``""0"``(F,0!5)!8`""90!-P2
+MH``8)E,$VA```'T``!`E4J(`"Y9"`!P0```0```0)99"`!I00`!R)K4``28Q
+M`&4D%@`")E`%3A````HF4P5,4$``:R:U``$F,0!I)!8``R90!2X0```#)E,%
+M+!```&F/OP`\IF```!+``&```*`E/`(``"1>%3`"("@E)C$``8[B`:`"X"`E
+M`$#X"2>F`!`00`!<C[\`/)9"```L0C`#%$``!)>B`!```A("$````Z8"``@`
+M`A)"I@(`")8%``A0H`!')I0``1:@``<"0"`E/`,``"1C%-``8/@)`D`@)1``
+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
+M$P(P0@`'IB(`[@`#$D(P0@`'IB(`Z``#$8(P0@`'IB(`Z@`#&,(P8P`'IB,`
+MY)>B`!`P0@`'IB(`Y@(`*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``BT`%!A`
+M`'4@(9>B`!```A("I((`.`!S&"&3H@`1I&(`0`(`*"4F$``!CD(!H`)`("4`
+M0/@))Z8`$!!``AX`%!A``'$@(9>B`!```A("I((`2@"`&"63H@`1I&(`4`(`
+M*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``@\"D1@AEZ(`$``"$@*@8@!9`!00
+M0"1"`%@"8B`ADZ,`$3!B`(`00``#I(,``#1B_P"D@@```@`H)280``&.0@&@
+M`D`@)0!`^`DGI@`0$$`!^P`4($``D2@AEZ,`$``#$4(P0@#_I*(`8B2$`&@"
+M)!`A``,80C!C``^D0P```J0@(9>B`!`P0@`!I((``)8B```L0D``5$``#I8B
+M```2@``%EZ(`$%*7``<``A-"$```")8B`````A-",$(``1````.F(@`F,$(`
+M`:8B`"B6(@``+$(P`U1``"V6(@```@`H)280``&.0@&@`D`@)0!`^`DGI@`0
+M$$`!T9>C`!``%!!``%40(0`#&8(P8P!_I$,`L"0"``$2@@`+*H(``A!```4`
+M````4H``%I>B`!`0```7EB(``%*7``N7H@`0$```$Y8B``"7H@`0,$(`!Z8B
+M`/R7H@`0``(0PC!"``<0```*IB(!`#!"``>F(@#^EZ(`$``"$,(P0@`'$```
+M`Z8B`0(P0@`_IB(`$I8B```L0C`$%$``+``4$$``%!A``',8(9>B`!```A-"
+MI&(`N`(`*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``9T`%"!`)(0`N`)D("&7
+MHP`0``,8P#!C`#B4@@```$,0)1:7``FD@@``EZ,`$``#$,*B(@`BEB(``"Q"
+M0`840``"``,2PJ8B`"P6@``2EB(``"Q"0`!40`#X)I0``9>C`!```Q(",$(`
+M/Z8B`48``QC",&,`'Q````:F(P%*`%,0(20#``JD0P"X)`(`#Z(B`"*6(@``
+M+$)``%1``.<FE``!)`(``1*"``LJ@@`"$$``!0````!2@`"DEB(``!```-XF
+ME``!$I<`)@(`*"40``#:)I0``0(`*"4F$``!CD(!H`)`("4`0/@))Z8`$!!`
+M`6$"("`E`L#X"9.E`!&F(@%4EZ4`$`(@("4"P/@)``4J`J8B`5:.0@&@`D`@
+M)0(`*"4`0/@))Z8`$!!``5("("`E`L#X"9.E`!&F(@%8EB(``"Q"0`%40`"\
+M)I0``9>B`!```A(",$(`/Q```+:F(@#$)A```8Y"`:`"0"`E`$#X"2>F`!`0
+M0`$_`B`@)0+`^`F3I0`1IB(!3I>E`!`"("`E`L#X"0`%*@*F(@%0`@`H)280
+M``&.0@&@`D`@)0!`^`DGI@`0$$`!+P(`*"67H@`0,$(`?Z8B`!"7H@`0``(1
+MPC!"`#^F(@`4)A```8Y"`:`"0"`E`$#X"2>F`!`00`$A`B`@)0+`^`F3I0`1
+MIB(!4I8B```L0D`!%$``!0(`*"67H@`0``(2`C!"`#^F(@#&)A```8Y"`:`"
+M0"`E`$#X"2>F`!`00`$0C[\`/)>B`!```A%",$(`/Z8B`4B7H@`0,$(`'Z8B
+M`4R6(@``+$)``E1``'4FE``!`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$``
+M_8^_`#R3H@`1IB(`*I8B```L0E``5$``9R:4``&7HP`0``,2`C!"`'^F(@#6
+M``,;PJ8C`-H"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`#HEZ,`$#!C`!\`
+M`QA`EB(`V@!#$"6F(@#:EZ,`$``#$4(P0@`_IB(`X@`#&L*B(P#=CD(!H`)`
+M("4"`"@E`$#X"2>F`!`00`#7C[\`/).B`!$P0@`'``(10)(C`-T`8A@EHB,`
+MW9>B`!```A#"$```/*(B`-\L0D`!5$``.B:4``$"`"@E)A```8Y"`:`"0"`E
+M`$#X"2>F`!`00`#"C[\`/)>B`!`P0@`_IB(`PI8B```L0E``5$``*R:4``&7
+MHP`0``,1@C!"`'^F(@#4``,;0J8C`-@"`"@E)A```8Y"`:`"0"`E`$#X"2>F
+M`!`00`"LEZ,`$#!C``<``QC`EB(`V`!#$"6F(@#8EZ,`$``#$,(P0@`_IB(`
+MX``#&D*B(P#<CD(!H`)`("4"`"@E`$#X"2>F`!`00`";C[\`/).B`!$P0@`!
+M``(1P)(C`-P`8A@EHB,`W)>B`!```A!"HB(`WB:4``$J@@`#%$#]E0`4$("6
+M(@``+$(P`Q!``!TD`@`$CD(!H`)`("4D!0#L`$#X"2>F`!`00`""`D`@)9>B
+M`!`P0@`'IB(`_)>B`!```A#",$(`!Z8B`0".0@&@)`4`[0!`^`DGI@`0$$``
+M=H^_`#R7H@`0,$(`!Z8B`/Z7H@`0``(0PC!"``>F(@$")`(`!*8B`6`D`@`!
+MIB(!7J8B`5RF(`%:C]``%)8B`0000``6``"@)28S``8"`"@E)A```8Y"`:`"
+M0"`E`$#X"2>F`!`00`!;`!080`!S("&7H@`0``(2`J2"`0``@!@EDZ(`$:1B
+M`0(FE``"EB(!!`*"$"H40/_N`@`H)98B```L0E`#5$``')8B`````*`E)C,`
+M!HY"`:`"0"`E`@`H)0!`^`DGI@`0$$``0I>C`!``%!"``%,0(:1#`XB.0@&@
+M`D`@)28%``4`0/@))Z8`$!!``#B7HP`0`!00@`!3$"&D0P.*)I0``2J"``44
+M0/_I)A```98B```L0C`#4$``#)8B```D`O_*IB(`7"0"__^F(@!>IB(`8"0"
+M``^F(@!$)`(`'*8B`$:F(@!(EB(``"Q"0``40``)CD(!H`)`("4D!0#*`$#X
+M"2>F`!!40``*EZ(`$!```!B/OP`\`D`@)20%`,\`0/@))Z8`$!!``!*/OP`\
+MEZ(`$*8B`!B6(@`6%$``#"0"``&6(@``+$)``!1```66(@`8``(2PC!"``$0
+M```#IB(`%@`"$\*F(@`6)`(``8^_`#R/O@`XC[<`-(^V`#"/M0`LC[0`*(^S
+M`"2/L@`@C[$`'(^P`!@#X``()[T`0">]_^"OOP`8K[$`%*^P`!``@(`E/`(`
+M`"1".E@`0/@)`*"()1!``!<"`"`E/`(``"1"%6@`0/@)`B`H)1!``!$"`"`E
+M/`(``"1"+[@`0/@)`B`H)1!```L"`"`E/`(``"1",UP`0/@)`B`H)1!```4"
+M`"`E/`(``"1"-A0`0/@)`B`H)8^_`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_
+M`!``H!@EE&(``"Q"0``40``)C[\`$)1C`"XD`@`!%&(`!3P"```D0B'D`$#X
+M"0````"/OP`0`^``"">]`!@``````````)2#``"4H@``5&(`!Y2$``"4@@`"
+M,$3!\)2B``(P0L'P$````@""(",`@B`C`^``"`"`$"64@@((`^``"#!"O_\`
+M`"@E``40P`!$$"&,0P``C$(`!`!B&"448``&```0)22E``$HH@`"5$#_]P`%
+M$,`D`@`!`^``"``````GO?_HK[\`$#P"```D0DFD`$#X"0``````0"@E,**`
+M`!!``!$``"`E,*5__SP"```D1AJ8``00@`!$$"$``A"``$80(91#```090`3
+M)`(``22$``$L@@"#5$#_]P`$$(`0```-```0)3P"```D1A$X``010`!&$"&4
+M0P``$&4`!B0"``$DA``!+((`2Q1`__D`!!%````0)8^_`!`#X``()[T`&">]
+M_^BOOP`4K[``$#"P__\2```F)`(``3P"```D0DFD`$#X"0``````0"@E,**`
+M`!!```8\`O__-$)__P"B$"0"`A`F$```&2Q"``$XH@'_+$(``2RC``$`0Q`E
+M%$``$R0"``$``"`E/`(``"1&&I@`!!"``$00(0`"$(``1A@AE&(``%8"``4D
+MA``!E&,``A!E``8D`@`!)(0``2R"`(,40/_T``00@```$"6/OP`4C[``$`/@
+M``@GO0`8)[W_X*^_`!ROL@`8K[$`%*^P`!``H(@EC((!G`!`^`D`P)`E`$"`
+M)3("`$(00``',@(`((XB``@40``$,@(`("0"_[T"`H`D,@(`(!!```<R`@`(
+MCB(`#!1```0R`@`()`+_WP("@"0R`@`($$``!S("``&.(@`$%$``!#("``$D
+M`O_W`@*`)#("``$00``'/`(``"1"2;``0/@))D0`(!!```(D`O_^`@*`)`(`
+M$"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?]@K[\`G*^R`)BOL0"4K[``
+MD`"`D"4``(@E/`(``"1"320`0/@),*3__P!`@"42```//`(``"1"3L`"0"`E
+M`@`H)30&_W\`0/@))Z<`$!!```<\`@``)$)+3`)`("4"`"@E`$#X"2>F`!``
+M0(@E`B`0)8^_`)R/L@"8C[$`E(^P`)`#X``()[T`H">]_^BOOP`4K[``$#P"
+M```D0DFD`$#X"0"`@"4`0!@E)`(`$A!B`!,D`@`!*&(`$U!```4D`@'_$&``
+M"0``$"40```-C[\`%!!B``4T`H-*5&(`"```$"40```&)`(``98$`@HD`P-*
+M$(,``B0"``$``!`EC[\`%(^P`!`#X``()[T`&#"$__\``"@E/`(``"1&&I@`
+M!1"``$40(0`"$(``1A`AE$,``!!D``8`````)*4``2RB`(-40/_W``40@```
+M$"4#X``(`````">]_^"OOP`8K[$`%#P"```D0DFD`$#X":^P`!``0(@E,B*`
+M`!!```<R,'__/`(``"1"320`0/@)`@`@)11``!,"`!`E```@)3P"```D11$X
+M``090`!E$"&40@``5%$`!R2$``$`91`AE$,`&!1@``<`8!`E)`0`2R2$``$L
+M@@!+%$#_]``$&4```!`EC[\`&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`$`"@
+M."4``!@E/`(``"1&)-@\`@``)$@````#$<``1B@AE*(``%1$``@D8P`!4.``
+M"B0"``$`X"`E`0#X"20&`(`0```%)`(``2QB`#$40/_S``,1P```$"6/OP`0
+M`^``"">]`!@``"@E/`(``!2```,D1A$X`^``"```$"4`!1%``$80(91#```0
+M9``&)`(``22E``$LH@!+5$#_^0`%$4```!`E`^``"``````GO?_(K[\`-*^^
+M`#"OMP`LK[8`**^U`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`\"4`H*@E`."P
+M)3#7__\``(`E``"()0``F"66H@``%$``&```H"4\`@``)$))I`!`^`D`````
+M`$"0)3)"@`!40``1EJ0``CP"```D0DX,`D`@)0!`^`D``"@E%$``"@)`("4\
+M`@``)$).>`!`^`D"0"`E4$``!):D``(0```"`D`@)9:D``(P@O\`%$``2#P"
+M`````#`E```X)3P"```D11$X``810`!%&"&48@``%$0``R3&``$`8)@E)`<`
+M`2S"`$LLXP`!`$,0)!1`__8`!A%`$.``3@``$"4RX@"`5$``!99D``269``"
+MCG$`"!````,``(`ECG$`#```@"4``#`E```X)3P"```D20!</`(``"1(`&``
+M!A#``$80(0`"&(``:2@AE*(``!1$``@DQ@`!`&@0(8_#`=B,0@``%&(``P``
+M````H*`E)`<``2S"``(LXP`!`$,0)!1`_^\`!A#`$.``$3+B`(!40``)CH,`
+M$(Z#``@``!`E`@*`)`(CB"2.@P`,`@*`)1````<"(X@E```0)0("@"0"(X@D
+MCH,`%`("@"4"(X@E/`(``"1"3@P`0/@)`L`H)1!``!6/OP`TCL(`$([#`!2.
+M9``0CF4`%`!$$"0`91@DKL(`$*[#`!26H@`",$+_`"Q%``$",!`E$$```@``
+M&"4D`P`!`*,0)%1```&NT0`8)`(``8^_`#2/O@`PC[<`+(^V`"B/M0`DC[0`
+M((^S`!R/L@`8C[$`%(^P`!`#X``()[T`.``$-\,`!C:"`(8P(0`&,8,`!A&`
+M`((@(R0"```D`P`!``0^@`3A``0``````(-`!!````<``$@E$.``!`""0`0`
+M!#@C`.,X!@$'0"4`@T@$`0`0)0$@&"4`!C#``,4P(8S$``",Q0`$`$00)`!E
+M&"0`8A`E`^``"``"$"LPYP#_$.``%P"`&"40H``/```@)9!B```01P`2````
+M`!!```H`````)(0``0"%$"L00``&`&00(9!"```01P`)`````%1`__DDA``!
+M$(4`!0!D$"&@1P``C,(``"1"``&LP@```^``"``````GO?Y@K[\!G*^^`9BO
+MMP&4K[8!D*^U`8ROM`&(K[,!A*^R`8"OL0%\K[`!>`"`\"6OI0&DKZ8!J*^G
+M`:R/L@'$E[`!OI>B`<*OH@%8)`,;6*^C`6`GQ0(PKZ4!9#P"```D0DGL`$#X
+M"0``B"400`&HC[\!G#P"```D0DUL`$#X"0/`("6GP@(*,$+__Q1```L\`@``
+M/`(``"1"2I`#P"`E`$#X"0(`*"400`&9C[\!G#("/_^GP@(*/`(``"1"8!``
+M0/@)`\`@)3P"```D0DTD`$#X"9?$`@H`0(`E$@`!BP/`("4\`@``)$).P`(`
+M*"4T!O]_`$#X"2>G`!`00`&#`\`@)3P"```D0D[``@`H)20&`(``0/@))Z<`
+MD!!``7R/OP&<CZ(`&(^C`!PD!```)`4`!0!$$"0`91@D`&(0)51```$D$0`!
+MCZ(`&(^C`!PD!```)`4``@!$$"0`91@D`&(0)51```$D$0`"C\("#%8B``&O
+MT0(,/`(``"1"2TP#P"`E`@`H)0!`^`DGI@`0%D```Z^B`5R6$``0K[`!8(^F
+M`:@LP@!!%$```P``L"4D!P!`KZ<!J(_"`>```D*",0@``:^H`6P``A)",$(`
+M`:^B`6@\`@``)%<"(#P"```D0@(X`N(0*Q!``0T`````EN(``(^C`5@`0Q`D
+M4$`!`B;W``26X@``CZ0!7`!$$"000`#\)Z8!$(_"`9@#P"`EEN4``@!`^`DG
+MIP$2$$``]20"``26XP``$&(`)BAB``400``()`(`("0"``$08@`:)`(``E!B
+M`!$GL@`0$```ZB;W``008@`I)[(`D"AB`"$00``&)`(`0"0"``A08@`=)[0`
+M\!```.`F]P`$4&(`(R>R`!`0``#<)O<`!">T`$`\`@``)$('6*^B`7"20@`"
+M$```(#13``,GL@`0)[0`,#P"```D0@J8KZ(!<!```!F24P`")[(`D">T`.`\
+M`@``)$($.*^B`7"20@`"$```$313``$\`@``)$(!F*^B`7"20@`"$```"S13
+M``(GM`$`/`(``!````0D0@#X)[0`4#P"```D0@=8KZ(!<))"``(T4P`$/`4`
+M`"2E2;``H/@)`H`@)51``+`F]P`$``"H)0*@("4\!@``),91+`#`^`D"@"@E
+M$$``HP`5$4"/IP%P`.*`(8^D`;"/I0&TCZ8!N#P(```E"%&H`0#X"9('`!B6
+M$0``E@(``@!1$"M40`"6)K4``9>B`1`"(A`K5$``BY("``>7H@$2`%$0*U1`
+M`(>2`@`'D@0`!CB"``HL0@`!CZ4!;"RC``$`0Q`D5$``?Y("``<X@@`%+$(`
+M`8^F`6@LPP`!`$,0)%1``'B2`@`'D@,`!P(C&"$``QA#CZ<!8"3B``H`0Q`J
+M5$``<)("``>/J`&H`L@0*Q!``'V/I0'(C@(`$(X#`!0``A_"+*0``0"#("04
+M@`!D```0)8Y"`!@P0@"`$$``!"0"``:/PP'<4&(`7I("``<GI`$8/`8``"3&
+M````P/@))`4`0*>Q`1B6Y``"IZ0!&I(#``8D`@`%$&(`!B0"``I48@`(D@(`
+M!#2"0``0```$IZ(!&I>B`1HT0H``IZ(!&I("``2CH@$=D@(`!:.B`3*.0@`8
+MKZ(!-*^S`3B.`@`0C@,`%(Y$`!".10`4`$00)`!E&"0`8A`E$$``!)>B`1HT
+M0@(`$````Z>B`1HP0OW_IZ(!&HX"``B.`P`,CD0`"(Y%``P`1!`D`&48)`!B
+M$"400``#)`(``A````*CH@$<HZ`!'(X"``B.`P`,CD0`"(Y%``P`1!`D`&48
+M)"0$```D!0`"`$00)`!E&"0`8A`E$$```Y.B`1PT0@`(HZ(!'(Y"`!@P0@!`
+M4$``!0`6$8"3H@$<-$(`!*.B`1P`%A&`CZ<!9`!'$"$GHP$8)Z0!6(QH``",
+M90`$C&8`"(QG``RL2```K$4`!*Q&``BL1P`,)&,`$!1D__8D0@`0)M8``9("
+M``<"(A`A,%'__Y8"``(`41`K$$#_;I>B`1`FM0`!*J(`@%1`_U4"H"`E)O<`
+M!#P"```\`@``)$(".`+B$"M40/[VEN(``!+``#4NP@!!4$```206`$`\`@``
+M)$);\(^D`60"P"@E)`8`0#P'````0/@)).=)<*_6$C`:P``3```H)0`%(,"/
+MJ`&D`(@@(0`%&8"/H@%D`&(8(91B``"D@@``E&(``J2"``*08@`$H((`!)!B
+M``6@@@`%)*4``0"V$"H40/_P``4@P(_"`;P#P"`ECZ4!I`!`^`D"P#`E&L``
+M#P``*"4`!2&`CZ,!9`"#("$`!1C`CZ8!I`!F&"&08@`&H((`!I!B``>@@@`'
+M)*4``0"V$"H40/_T``4A@(^G`:RL]@``E\(""J?"`!@`%A`KC[\!G(^^`9B/
+MMP&4C[8!D(^U`8R/M`&(C[,!A(^R`8"/L0%\C[`!>`/@``@GO0&@E*(``HR&
+M$C00P``1,$C!\)3#``"4H@``%&(`#B2'`C"4PP`",&+!\%1(``N,A!(PD,(`
+M!#!"``$00``#,&,``A1@`"4``!`E`^``"`#`$"4DAP(PC(02,!"``!\``!`E
+ME*4````$$$,``A&``.(P(93"````HA`C%$``#P````"4PP`",&+!\%1(``F4
+MP@`"D,(`!#!"``$00``#,&,``A1@``T``!`E`^``"`#`$"4P0L'P`0(0(UA`
+M``0`!"!#),<`0"2$__\`!"!#5(#_Y@`$$$,``!`E`^``"``````GO?_HK[\`
+M%*^P`!`\`@``)$(```!`^`D`P(`E4$``"@``$"6`0@`:``(00`("$",``A8`
+M``(6`P1!``(`0!@E```8)0!@$"6/OP`4C[``$`/@``@GO0`8)[W_V*^_`""O
+MLP`<K[(`&*^Q`!2OL``0`("()0"@F"66(@(*%$``)B00`/\\`@``)%))I`)`
+M^`D`````,$(`\"0#`&!00P`'EF(``@)`^`D"("`E)`,!F11#`!H\`@``EF(`
+M`C!"`*`D`P"@$$,`)R00`.&68@`",$(`T"0#`,`00P`B)!``XI9B``(P0@#0
+M)`,`T!!#`!TD$`#DEF(``C!"`5`X0@%0``*`*P`0@",D`O_]`@*`)!```!0F
+M$`#C/`(``"1"```"("`E`$#X"0)@*"400``-)`,`P(Q0`""68@`",$(`P!1#
+M``D"`!`E,@,`#R0"``$48@`%`@`0)20"__`"`H`D-A```@(`$"6/OP`@C[,`
+M'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_Z*^_`!`\`@``)$(```!`^`D`````
+M`$`8)1!@``0``!`EC&(`'``"$((P0@`!C[\`$`/@``@GO0`8)[W_T*^_`"RO
+MM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`,"@)0#@L"4`@*@E)+/__Q)@
+M`!L"M)`A`K(0*Q!``!4"0(@E`C2`(P(`("4"P/@)`B`H)5A``!`F<___`B`@
+M)0*`*"62`P``D((``*("```F$``!H(,``"2E__\4H/_Y)(0``0(TB","L1`K
+M5$#_[@(T@",F<___%F#_YP)4D"&/OP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/
+ML0`4C[``$`/@``@GO0`P)[W_V*^_`""OL0`<K[``&`"`@"4"`(@EC@(!H"0%
+M`,$`0/@))Z8`$!!``!:7I0`0+*5````%*",PI0`%CB(!H`(@("4DI0#*`$#X
+M"2>F`!(00``-C[\`()>B`!`L0D``%$``!9>B`!(``A+",$(``1````.N`A(\
+M``(3PJX"$CR.`A(\C[\`((^Q`!R/L``8`^``"">]`"@GO?_HK[\`%*^P`!`\
+M`@``)$))I`!`^`D`@(`E`$`8)20"`$@08@`P/`(``"AB`$D00``/-`*!C2AB
+M`$(00``()`(`0RAB`$`00``G/`(``!!@`!H``!`E$```*8^_`!108@`A/`(`
+M`!```"0``!`E`$,0*A1```TT`H&/-`*!B`!B$"H00``8/`(``"AB`$T00``:
+M```0)2AB`$I40``7```0)1```!`\`@``5&(`$P``$"40```,/`(``)8#`@HH
+M8@&(%$``#0``$"4H8@&.%$``!3P"```D`@&/5&(`!P``$"4\`@``)$)<O`!`
+M^`D"`"`E$````H^_`!2/OP`4C[``$`/@``@GO0`8)[W_V*^_`"2OL@`@K[$`
+M'*^P`!@`@)`E,+'__P)`@"6.`@&@)`4`P0!`^`DGI@`0$$``(SP"`````"`E
+M)$4`I#P"```D1@"F/`(``"1'`*@\`@``)$A-;``$$$``1!`A``(80`!E$"&4
+M0@``5%$`$22$``&7H@`0+$)0`U!```0`!!!``&80(1````640@```$00(0`"
+M$$``1Q`AE$(``*8"`@@!`/@)`D`@)1````2F`@(*+((`#A1`_^@`!!!`C[\`
+M)(^R`""/L0`<C[``&`/@``@GO0`H)[W_V*^_`"2OL@`@K[$`'*^P`!@`@)`E
+M,+'__P)`@"6.`@&@)`4`P0!`^`DGI@`0$$``(SP"`````"`E)$4`,#P"```D
+M1@`R/`(``"1'`#0\`@``)$A-;``$$$``1!`A``(80`!E$"&40@``5%$`$22$
+M``&7H@`0+$)0`U!```0`!!!``&80(1````640@```$00(0`"$$``1Q`AE$(`
+M`*8"`@@!`/@)`D`@)1````2F`@(*+((`!Q1`_^@`!!!`C[\`)(^R`""/L0`<
+MC[``&`/@``@GO0`H)[W_X*^_`!BOL0`4K[``$`"`@"4\`@``)$)=5`!`^`D"
+M`(@E$$``$X^_`!B.`@'D,$(``5!``!"/L0`4E@4""!"@``8\`@``)$)>8`!`
+M^`D"`"`E$```!X^_`!@\`@``)$)?.`(`("4`0/@)EB4""H^_`!B/L0`4C[``
+M$`/@``@GO0`@````````````````)[W_0*^_`+ROO@"XK[<`M*^V`+"OM0"L
+MK[0`J*^S`*2OL@"@K[$`G*^P`)@`H)@E`,"H)0#@L"6/O@#0,)'__SP"```D
+M0@```$#X"20$%`@`0)`E$D`!E"00``("0*`E/`(``"1"```"0"`E/`4``"2E
+M`D``0/@))`82<*Y3``RN50`0KE8`%*91`<BF0`'*)`(`/*9"`?RN0`(`)`(`
+M`ZY"$S2N0!/T)`('`*Y"$_@D`O__KD(3_*Y"%`"N0A0$/`(``"1"```"0"`E
+M`$#X"0``*"400`%T)!```R0"``&N@@',/!```"80```"@"`E`@#X"20%0"`P
+M0@#_IH(!T`*`("4"`/@)-`68&*:"`=*F@`'6/`(``"1"```"@"`E-`68T`!`
+M^`DD!AP6``"()3P"```D4````H`@)30%F(`"`/@)/`8``28Q``$N(@`$%$#_
+M^@*`("4\$```)A````(`^`DT!9P`/`,``"1C`````B<"`&#X"20%``0D0@`!
+MIH(!U`*`("4"`/@))`5`$`!`N"4\`@``)$(```*`("4D!4`0`$#X"3;F``$\
+M`@``)$(```*`("4D!0`]`$#X"2>F`)`00`$R)!``")>C`)`D`EJE%&(!+B00
+M``0\`@``)$(```*`("4D!0`_`$#X"2>F`)`00`$F)!``")>B`)"F0A)R/`(`
+M`"1"```"@"`E)`4`P0!`^`DGI@"0$$`!')>B`)```A,"ID(2<#!#__\D`@`!
+M%&(!%B00``4``)@E``"()2>P`!`\`@``)%4````1,$`"@"`E)B4`P`*@^`D"
+M!C`A$$`!"0`1$$`"`A`AE$(```)BF"8F,0`!+B(`0%1`__0`$3!`-`+__Q9B
+M`0`D$``'/`(``"1"```"@"`E)`4`OP!`^`DGI@"0$$``^"00``B3H@"1IH("
+M")>B`!2F0A)TEZ(`%J9"$G:3H@`9HD(2>)>B`!@``A("HD(2>9.B`!NB0A)[
+MEZ(`&@`"$@*B0A)ZEZ(`'``"$@*B0A)^DZ(`':)"$G^7H@`>``(2`J)"$H"3
+MH@`?HD(2@9.B`"$P0@`!HD(2?)>B`"```A!",$(`!Z)"$GT\`@``)$(``*Z"
+M`<```(@E)`@`"2>G`!``$2C``+$H(P`%*(``L2@A`D4H(0`(,$``YA@AE&(`
+M```"$H*@HA*"E&(````"$0(P0@`_H*(2C9!C``$``QB`,&,`/"3$``(`Y"`A
+ME((````"$X(`8A@EH*,2@Y2"`````A(",$(`/Z"B$HZ4@@````(0@C!"`#^@
+MHA*$D(,``0`#&0`P8P`P),0`!`#D("&4@@````(3`@!B&"6@HQ*/E((````"
+M$8(P0@`_H*(2A9""``$P0@`_H*(2D"3#``8`XQ@AE&(````"$H*@HA*&E&(`
+M```"$0(P0@`_H*(2D9!C``$``QB`,&,`/"3$``@`Y"`AE((````"$X(`8A@E
+MH*,2AY2"`````A(",$(`/Z"B$I*4@@````(0@C!"`#^@HA*(D(,``0`#&0`P
+M8P`P),0`"@#D("&4@@````(3`@!B&"6@HQ*3E((````"$8(P0@`_H*(2B9""
+M``$P0@`_H*(2E"3#``P`XQ@AE&(````"$H*@HA**E&(````"$0(P0@`_H*(2
+ME9!C``$``QB`,&,`/"3$``X`Y"`AE((````"$X(`8A@EH*,2BY2"`````A("
+M,$(`/Z"B$I:4@@````(0@C!"`#^@HA*,D(,``0`#&0`P8P`P),0`$`#D("&4
+M@@````(3`@!B&"6@HQ*7E((````"$8(P0@`_H*(2F)""``$P0@`_H*(2F23#
+M`!(`XQ@AE&(````"$H*@HA*:E&(````"$0(P0@`_H*(2FY!C``$``QB`,&,`
+M/"3&`!0`YC`AE,(````"$X(`8A@EH*,2G)3"`````A(",$(`/Z"B$IV4P@``
+M``(0@C!"`#^@HA*>)C$``2XB``440/]@)0@`"SP"```D0F?P`$#X"0*`("4`
+M`)@E``"()206`!\\`@``)%4``"90``,"@"`E`M$H(P*@^`DGI@"0$$``'9>B
+M`)`"8I@A`!$80`!P("$``A("H((3$`"`&"63H@"1H&(3$28Q``$N(@`#%$#_
+M\`*`("4N8P`!/`(``C1"__T"8A`F+$(``0!B&"448``,)!``"3P"```D0@``
+M`H`@)20%0!``0/@)`N`P)1```!("@!`E$```""00``@D$``(/`(``"1"```"
+M@"`E)`5`$`!`^`D"X#`E$D``!#P"```D0@```$#X"0)`("57P``!K]``````
+M$"6/OP"\C[X`N(^W`+2/M@"PC[4`K(^T`*B/LP"DC[(`H(^Q`)R/L`"8`^``
+M"">]`,`GO?_HK[\`$#P"```D0@```$#X"0````"/OP`0`^``"">]`!@PI0$`
+M$*``!P`````D`A0`I,(``"0"%3:DX@```^``""0"``$#X``(```0)0/@``@D
+M`@`!C((!Y#1"``&L@@'D)`(4`*2"`>PD`A4VI((![HR"`>`\`T```$,0)3P#
+M__\T8W__`$,0)"0#``.D@P'H)`,`0*2#`>HD`_O_`$,0)"0#_?\`0Q@DK(,!
+MX)""$GP00``&)(4!X*2`$D@D`@`!K((23#1B`0"L@@'@)`(`#ZRB`!0D`@`!
+M`^``"*R"$F@`````)[W_X*^_`!ROL@`8K[$`%*^P`!``@)`E`*"()3P0```F
+M$```-`6`+`(`^`F.)@`$`D`@)30%@#`"`/@)CB8`#`)`("4T!8`T`@#X"8XF
+M`!`"0"`E-`6`.`(`^`F.)@`(`D`@)30%@"0"`/@)CB8``(^_`!R/L@`8C[$`
+M%(^P`!`#X``()[T`(">]_]"OOP`HKZ4`%(R#`=PD`@`!$&(`##P"``",0@``
+M`*(0(P`"$,"OH@`</`(``(Q"````HA`C``(0P*^B`"`0```&KZ4`&"0"__^O
+MH@`<KZ(`("0"``&OH@`8/`(!@#1"__\`PA`DKZ(`$#P"```D0@```$#X"2>E
+M`!"/OP`H`^``"">]`#`GO?_@K[\`&*^Q`!2OL``0`("()3P0```F$```-`6`
+M+`(`^`D``#`E/`(``"1"```"("`E`$#X"30%@`0\`P`0`$,0)3P&_U\TQO__
+M`B`@)30%@`0"`/@)`$8P)`(@("4T!8`D`@#X"30&__^/OP`8C[$`%(^P`!`#
+MX``()[T`(">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`F"4`H(@EEB(`$A!`
+M`!X"8)`E/`(``"1"````0/@)-`6`!#P#_W\T8___`$,0)#P&`"`\$```)A``
+M``)`("4T!8`$`@#X"0!&,"4"0"`E-`6`*`(`^`F6)@`0`D`@)30%@$@"`/@)
+MEB8`$HXF`!0"0"`E-`6`-`(`^`D`!C#`$```#SP"```\`@``)$(```)@("4`
+M0/@)-`6`!#P&_U\TQO__/`,``"1C```"8"`E-`6`!`!@^`D`1C`D/`(``"1"
+M```"8"`E-`6`+`!`^`F.)@``/`(``"1"```"8"`E`$#X"30%@"0\`_^``$,0
+M))8C``H`0S`EEB(`&!!```4D0@`$``(4`#P#`'\`0Q`D`,(P)3P"```D0@``
+M`F`@)0!`^`DT!8`DEF(!T"Q"``040``5C[\`()8B`!HP0@`'$$``$20"^/^.
+M0Q/X`&(@))8B`!HL0P`(``(2`#!"!P`48``"`((P)32&!P"N1A/X/`(``"1"
+M```"8"`E`$#X"30%@!B/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H````
+M```````GO?_HK[\`$#P"```D0@```$#X"20%0`@``A`KC[\`$`/@``@GO0`8
+M)[W_X*^_`!ROL@`8K[$`%*^P`!``@)`E`*"`)0)`B"4\`@``)$(```!`^`DD
+M!0`<`$`@)20"__]4@@`$CB(3'*X````0```>```0)0""$"0\`P$%-&/8N@!#
+M&"0\`@!P-$(`(`""$"000``$K@,``#P"0```8A`EK@(``#""``400``%,((%
+MP(X"```T0@`!K@(``#""!<`00``$C@(``#1"`$"N`@``C@(``#P#0```0Q`D
+M5$```:Y$$E`D`@`!C[\`'(^R`!B/L0`4C[``$`/@``@GO0`@`^``"(R"$QPG
+MO?_8K[\`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("8)0"@B"6.=!,<!H$`!@)@
+M@"4\`@``)$(``"0%`"0`0/@)```P)3P"`04T0MBZ`B(P)#(B``%40``!-,8`
+M!3(B`$`00``./`(``(X"$R!40``!-,8`0(X"$R140``!-,8!`(X"$RA40``!
+M-,8`@(X"$RQ40``!-,8$`#P"```D4@```F`@)0)`^`DD!0`@!B$`!:X1$QP"
+M8"`E)`4`)`)`^`DD!@`!`H`0)8^_`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@
+M``@GO0`H`^``""0"`$`GO?_H,*/__RQB`$`00``*K[\`$``#&4`T!9`</`(`
+M`"1"````0/@)`&4H(3!#@``48``")`(``0``$"6/OP`0`^``"">]`!@GO?_@
+MK[\`'*^R`!BOL0`4K[``$#"E__\LH@!`$$``+0"`D"4`!8E`-`60`#P0```F
+M$````B4H(0(`^`D``#`E-`60!`)`("4")2@A`@#X"0``,"4T!9`(`D`@)0(E
+M*"$"`/@)```P)30%D`P"0"`E`B4H(0(`^`D``#`E-`60$`)`("4")2@A`@#X
+M"0``,"4T!9`4`D`@)0(E*"$"`/@)```P)30%D!@"0"`E`B4H(0(`^`D``#`E
+M-`60'`)`("4")2@A`@#X"0``,"40```")`(``0``$"6/OP`<C[(`&(^Q`!2/
+ML``0`^``"">]`"`GO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``@)@E`,`@)3"E
+M__\LHP!`$&``)```$"50@``4``"0)9"2``4`$I(`D((`!`)"D"60A@`#``8V
+M`)""``(``A0``,(P)9""``$``A(``,(P)9""````PC`E``8P0@`2%\``PC`E
+M$````@`2D$(``#`E``6)0#0%D!@\$```)A````)@("4"`/@)`B4H(30%D!P"
+M8"`E`B4H(0(`^`DV1H``)`(``8^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]
+M`"@GO?_(K[\`-*^^`#"OMP`LK[8`**^U`"2OM``@K[,`'*^R`!BOL0`4K[``
+M$`"`N"6OIP!$CZ(`2#"^__\L1``!``0@(SP"554T0E56`((@)`""(",OPP!`
+M$&``:@``$"60PP``5&``:(^_`#24PP`"+&,`!51@`&2/OP`TE,(``BQ"``84
+M0``'``"P)93"``(L0@`.+%8``0`6L",RU@`")M8``9#'``20P@`%``(2``#B
+M."60P@`&``(4``#B."60P@`'``(6``#B."4`Y#@FD,,`")#"``D``A(``&*H
+M)0*DJ"8RM?__D-,`"I#"``L``A(``F*8)9#"``P``A0``F*8)9#"``T``A8`
+M`F*8)0)DF":0PP`.D,(`#P`"$@``8J`E`H2@)C*4__^0T@`0D,(`$0`"$@`"
+M0I`ED,(`$@`"%``"0I`ED,(`$P`"%@`"0I`EE,(``BQ"``X00``"`D20)C)2
+M`/\`'HE`-`60`#P0```F$````N`@)0(E*"$"`/@)`.`P)30%D`0"X"`E`B4H
+M(0(`^`D"H#`E-`60"`+@("4")2@A`@#X"0)@,"4T!9`,`N`@)0(E*"$"`/@)
+M`H`P)30%D!`"X"`E`B4H(0(`^`D"0#`E-`60%`+@("4")2@A`@#X"0+`,"4\
+M`@``)$(```+@("4#P"@E`$#X"8^F`$2/OP`TC[X`,(^W`"R/M@`HC[4`)(^T
+M`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#@`````)[W_Z*^_`!`D@Q,3/`(`
+M`"1"````H"`E`&`H)0!`^`DD!@`&C[\`$`/@``@GO0`8)[W_Z*^_`!`\`@``
+M)$(``"2$$Q,`0/@))`8`!B0"``&/OP`0`^``"">]`!@GO?_HK[\`$#P"```D
+M0@```*`@)3P%```DI12P`$#X"20&``:/OP`0`^``"">]`!@#X``(```0)2>]
+M_^"OOP`8K[$`%*^P`!``@(`E`,"()0`%*(`\`@``)$(```!`^`DDI6``/`(`
+M`"1"```"`"`E)`5L`"0&``,`0/@))`<``A!```<"`"`E/`(``"1"````0/@)
+M)`5H`*8B```D`@`!C[\`&(^Q`!2/L``0`^``"">]`"`PI?__`(`8)91B`@@0
+M10`()`0`#)1B$G(P0@"`+$0``0`$(",D`O_X`((@)"2$``M4P``!K,0```/@
+M``@``!`E`^``""0"``$GO?_@K[\`'*^R`!BOL0`4K[``$`"`D"664!)(,A$`
+M'``1B((R$``"`!"`*SP"```D0@```$#X"0(@*"4`4!`F/`,``"1C```"0"`E
+M`B`H)0!@^`DL1@`!C[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_`!BO
+ML0`4K[``$`"`B"4`H(`E/`(``"1"````0/@))`5`%``0@$`D`P`#`@,8!``#
+M&"<`0Q`D)`8``@(&,`0\`P``)&,```(@("4D!4`4`&#X"0!&,"4D`@`!C[\`
+M&(^Q`!2/L``0`^``"">]`"`GO?_@K[\`&*^Q`!2OL``0`("()0"@@"4\`@``
+M)$(```!`^`DD!4`4`!"`0"0&``,"!C`$``8P)SP#```D8P```B`@)20%0!0`
+M8/@)`$8P)"0"``&/OP`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`<K[(`&*^Q
+M`!2OL``0`("0)0"@B"4`P(`E/`(``"1"````0/@))`5`&"0#``$"(Q@$``,8
+M)P!#$"0R$``!`C"`!#P#```D8P```D`@)20%0!@`8/@)`%`P)20"``&/OP`<
+MC[(`&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`%*^P`!``H(`E+@(`!A!```@D
+M`O__/`(``"1"````0/@))`5`'#!"`"\"`A`&,$(``8^_`!2/L``0`^``"">]
+M`!@GO?_@K[\`'*^R`!BOL0`4K[``$`"`D"4`H(`E`,"()3P"```D0@```$#X
+M"20%0!0`$"L``!"`0"0$``,"!"`$`*0@)3P#``$T8X```&08)P!#,"0`Q3`E
+M$B```S3&@``\`@`!`,(P)3P"```D0@```D`@)0!`^`DD!4`4CD,3'#P%`0`\
+M`@``)$(```)`("4`0/@)`&4H)8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]
+M_^"OOP`8K[$`%*^P`!``@(@E`*"`)3P"```D0@```$#X"20%0!`2```&`$`P
+M)20"``02`@`&)`+_WQ````<TQ@`@)`+_GQ````8`PC`D`,(P)!````,TQ@!`
+M)`+_OP#","0\`@``)$(```(@("4`0/@))`5`$(^_`!B/L0`4C[``$`/@``@G
+MO0`@)[W_Z*^_`!`\`@``)$(```!`^`DT!8`$/`,`@`!#$"0L0@`!)`,``@!B
+M$"./OP`0`^``"">]`!@GO?_@K[\`&*^Q`!2OL``0`("()0"@@"4\`@``)$(`
+M``!`^`DT!8`$`$`8)3P"`(``8A`D$$``!20"``)6`@`'/`8`@!````R/OP`8
+M)`(``1("``F/OP`8/`8`@#P"```D0@```B`@)30%@`0`0/@)`&8P)8^_`!B/
+ML0`4C[``$`/@``@GO0`@`^``"```$"4#X``(+*(``2>]_^"OOP`<K[(`&*^Q
+M`!2OL``0`("()3#0__\\`@``)$(``"8D$S@`0/@))`8`!I(C$SB2(A,Y``(2
+M``!B&"62(A,Z``(4``!B&"62)A,[``8V`#P"```D4@```B`@)30%@`@"0/@)
+M`&8P)9(C$SR2(A,]``(2``!B&"4R!C__``8T``(@("4T!8`,`D#X"0!F,"46
+M```,/`(``"1"```"("`E`$#X"30%@`0\!@`0`B`@)30%@`0"0/@)`$8P)1``
+M``Z/OP`<)$(```(@("4`0/@)-`6`!#P&_^\TQO__/`,``"1C```"("`E-`6`
+M!`!@^`D`1C`DC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_V*^_`"2OM``@
+MK[,`'*^R`!BOL0`4K[``$`"`H"4\$@``)E(```)`^`DT!8!L`$"8)0*`("4"
+M0/@)-`6`<`!`@"4"@"`E`D#X"30%@&P`4Y@K`A.`(0(`B"4``(`E`!&`````
+MB"4`0!@E```0)0("$"4"(Q@EC[\`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``
+M"">]`"@GO?_HK[\`$#P"```D0@```$#X"30%@&R/OP`0`^``"">]`!@GO?_H
+MK[\`%*^P`!``@(`E/`(``"1"````0/@)-`6`)#P&`0`\`P``)&,```(`("4T
+M!8`D`&#X"0!&,"6/OP`4C[``$`/@``@GO0`8)[W_V*^_`""OLP`<K[(`&*^Q
+M`!2OL``0`("8)3P"```D0@```$#X"30%F&0``I3",E(!_S)"`0`00``#/!$`
+M`#I2`?\`$I`G)C$```)@("4"(/@)-`6`<`!`@"4"8"`E`B#X"30%@&P"`H`F
+M`A(0)H^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_HK[\`%*^P`!``
+M@(`E/`(``"1"````0/@))`5`()8#`=`P0@#_`&(8)BQB``&/OP`4C[``$`/@
+M``@GO0`8)[W_X*^_`!ROL@`8K[$`%*^P`!``@)`E`*"`)3P1```F,0```B#X
+M"30%@)B.`P```$,0(:X"```"0"`E`B#X"30%@)2.`P`$`$,0(:X"``0"0"`E
+M`B#X"30%@)R.`P`,`$,0(:X"``P"0"`E`B#X"30%@)".`P`(`$,0(:X"``@"
+M0"`E`B#X"30%@*".`P`0`$,0(:X"`!"/OP`<C[(`&(^Q`!2/L``0`^``"">]
+M`"`GO?_@K[\`'*^R`!BOL0`4K[``$`"`B"4`H(`E+@(`"11```@"()`E/`(`
+M`"1"````0/@)-`7__P!0$"M00``%/`(``"0"__^N0A/\$```#0``$"4D0@``
+M`B`@)0!`^`D"`"@E/`,``"1C```"("`E-`6`$`!@^`D`0#`EKE`3_"0"``&/
+MOP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`%*^P`!``@(`E/`(``"1"
+M````0/@)-`6`$#P#```D8P```@`@)0!@^`DP1?__C[\`%(^P`!`#X``()[T`
+M&">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`B"4`H)`E`B"8)3P"```D0@``
+M`$#X"20%'_\`4A`K4$``!3P"```D`O__KF(4`!```!8``!`E)$(```(@("4`
+M0/@)-`6`%`!`@"4\`@``)$(```(@("4`0/@)`D`H)20#X``"`X`D,$(?_SP#
+M```D8P```B`@)30%@!0`8/@)`@(P):YR%``D`@`!C[\`((^S`!R/L@`8C[$`
+M%(^P`!`#X``()[T`*">]_^BOOP`4K[``$`"`@"4\`@``)$(```!`^`DT!8`4
+M/`,``"1C```"`"`E`&#X"3!%'_^/OP`4C[``$`/@``@GO0`8D((3]#A"``$#
+MX``(,$(``2>]_^"OOP`<K[(`&*^Q`!2OL``0`("0)1"@`!$"0(@E/`(``"1"
+M````0/@)-`6`!#P0_O\V$/__/`,``"1C```"("`E-`6`!`!@^`D`4#`DCB(3
+M]`!0$"00```0KB(3]#P"```D0@```D`@)0!`^`DT!8`$/!`!`#P#```D8P``
+M`D`@)30%@`0`8/@)`%`P)8XB$_0`4!`EKB(3]"0"``&/OP`<C[(`&(^Q`!2/
+ML``0`^``"">]`"`GO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``@(@E`*"0)0(@
+MF"4\`@``)$(```!`^`DD!1__`%(0*U!```4\`@``)`+__ZYB%`00```9```0
+M)21"```"("`E`$#X"30%@!0`0(`E/`(``"1"```"("`E`$#X"0)`*"4\`^``
+M-&/__P(#@"0``A0`/`,?_P!#$"0\`P``)&,```(@("4T!8`4`&#X"0(","6N
+M<A0$)`(``8^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_HK[\`%*^P
+M`!``@(`E/`(``"1"````0/@)-`6`%``"+`(\`@``)$(```(`("4`0/@),*4?
+M_X^_`!2/L``0`^``"">]`!@#X``()`(``0/@``@``````^``"```$"4#X``(
+M``````/@``@`````)[W_Z"0"``$4H@`'K[\`$"S"``$``A`C)`/_\P!#$"00
+M```%)$(`#3P"```D0@```$#X"0````"/OP`0`^``"">]`!@GO?_@)`(`"Q"B
+M``:OOP`8)`,`'A"C`!```!`E$```"8^B`#`PY@`&K(8!^#P"```D0@```$#X
+M"30%@&@0```&)`(``:^B`!`\`@``)$(```!`^`D`````C[\`&`/@``@GO0`@
+M)[W_X*^_`!B/H@`PCZ,`-*^B`!`\`@``)$(```!`^`FOHP`4C[\`&`/@``@G
+MO0`@```````````GO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``@(@E`*"`)3P"
+M```D4@```D#X"30%@`0\!@`$/`,``"1S```"("`E-`6`!`)@^`D`1C`E$@``
+M"0(@("4"0/@))`5`!#P&__PTQO__`B`@)20%0`0"8/@)`$8P)(^_`""/LP`<
+MC[(`&(^Q`!2/L``0`^``"">]`"@GO?_0K[\`+*^V`"BOM0`DK[0`(*^S`!RO
+ML@`8K[$`%*^P`!`0H``Q`("()3P"```D0@```$#X"20%0`0\!O_\-,;__SP#
+M```D8P```B`@)20%0`0`8/@)`$8P)#P"```D0@```$#X"20$!]`D$``*/`(`
+M`"12```\%@`!/`(``"15```\%/_\-I3__SP"```0```+)%,```*@^`DD!`#(
+M`B`@)0)`^`DD!4`$`B`@)20%0`0"8/@)`%0P)"80__\2```(`B`@)0)`^`DD
+M!4`0`%80)!1`__``````5@``!#P"```0```/```0)3P"```D0@```B`@)0!`
+M^`DT!8`$/`;_^S3&__\\`P``)&,```(@("4T!8`$`&#X"0!&,"0D`@`!C[\`
+M+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`,">]_]BOOP`@
+MK[,`'*^R`!BOL0`4K[``$`"`B"4`H(`E/`(``"12```"0/@)-`6`!#P&``0\
+M`P``)',```(@("4T!8`$`F#X"0!&,"42```)`B`@)0)`^`DD!4`$/`;__#3&
+M__\"("`E)`5`!`)@^`D`1C`DC[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`
+M*">]_^"OOP`<K[(`&*^Q`!2OL``0`*"()0#`*"4D$``!$C``#0"`D"42(``&
+M/`(``20"``(2(@`.```0)1```!./OP`<)$*`<`!`^`D`````$```"P!`@"4\
+M`@`!)$*!O`!`^`D`````$```!JY1$S0\`@``)$)_X`!`^`D`````KE$3-`(`
+M$"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`$#P"```D0@```$#X
+M"20%0`0``A0",$(``X^_`!`#X``()[T`&```````````)[W_Z*^_`!0D`@`!
+M$*(`!J^P`!`D`@`"$*(`!@``$"40```,C[\`%#P"```0```#)%```#P"```D
+M4```/`(``"1"````0/@)`@`H)0(`$"6/OP`4C[``$`/@``@GO0`8)[W_Z*^_
+M`!`\`@``)$(```!`^`DD!0`,C[\`$`/@``@GO0`8)[W_Z*^_`!``H#`E/`(`
+M`"1"````0/@))`4`#(^_`!`#X``()[T`&">]_^BOOP`0/`(``"1"```D!0`(
+M`$#X"20&``2/OP`0`^``"">]`!@GO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``
+M@)@E/`(``"1"```D!0`(`$#X"20&`"```(`E/`(``"12```\`@``)%$```)@
+M("4"0/@))`4`"#!#``008``()`(``0(@^`DD!``*)A```2H"`^A40/_V`F`@
+M)0``$"6/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_Z*^_`!2OL``0
+M`("`)3P"```D0@```$#X"30%@&@D!O^_/`,``"1C```"`"`E-`6`:`!@^`D`
+M1C`DC[\`%(^P`!`#X``()[T`&">]_^BOOP`4K[``$`"`@"4\`@``)$(```!`
+M^`DT!8!H/`,``"1C```"`"`E-`6`:`!@^`DT1@!`C[\`%(^P`!`#X``()[T`
+M&">]_^"OOP`<K[(`&*^Q`!2OL``0`("()0"@$"4`P)`E/!```"80```T!8!0
+M`@#X"0!`,"4"("`E-`6`5`(`^`D"0#`EC[\`'(^R`!B/L0`4C[``$`/@``@G
+MO0`@)[W_X*^_`!BOL0`4K[``$`"`B"4`H(`E+@,`0!!@`"$``!`E+@(`(!1`
+M`!`\`@``)$(```!`^`DT!8!4)@/_X"0&``$`9C`$``8P)SP#```D8P```B`@
+M)30%@%0`8/@)`$8P)!````\D`@`!)$(```(@("4`0/@)-`6`4"0&``$"!C`$
+M``8P)SP#```D8P```B`@)30%@%``8/@)`$8P)"0"``&/OP`8C[$`%(^P`!`#
+MX``()[T`(">]_^"OOP`8K[$`%*^P`!``@(@E`*"`)2X#`$`08``?```0)2X"
+M`"`40``//`(``"1"````0/@)-`6`5"8#_^`D!@`!`&8P!#P#```D8P```B`@
+M)30%@%0`8/@)`$8P)1````XD`@`!)$(```(@("4`0/@)-`6`4"0&``$"!C`$
+M/`,``"1C```"("`E-`6`4`!@^`D`1C`E)`(``8^_`!B/L0`4C[``$`/@``@G
+MO0`@)[W_Z*^_`!`\`@``)$(```!`^`DT!8!,C[\`$`/@``@GO0`8)[W_Z`"@
+M,"4PP@(`$$``!*^_`!`D`OW_`,(P)#3&`"`\`@``)$(```!`^`DT!8!,C[\`
+M$`/@``@GO0`8J*``"+B@``LPP@__J*(`#+BB``^(HP`,F*,`#Q1F`!```!`E
+M,.(`(!!```8`````B*(`#)BB``\T0B``J*(`#+BB``^HH``4N*``%XBB`!28
+MH@`7J*(`$+BB`!,D`@`!`^``"``````GO?_8K[\`(*^S`!ROL@`8K[$`%*^P
+M`!``@)@E`,"`)8^R`$``H(@EBB,`%)HC`!<P8P`!$&``:B0"``^(X@`4F.(`
+M%S!"``$40``&/`(``"1"````0/@))`4`#!!0`&`D`@`/BB(`$)HB`!,P0@__
+MID(``(HP`!2:,``7/`(/_S1"@``"`H`D`!"#PCP"```D0@```F`@)0!`^`DT
+M!8!L``(:@C!C__\P8A__`%`0*U!```0"`X`E)&+@`#!"__\"`H`E,@)__Z9"
+M``*B0``$BB(`%)HB`!<P0@`"%$``(`````"*(@`4FB(`%S!"``000``#)`(`
+M`1```!FB0@`$BB(`%)HB`!<P0@`0$$``!0````"20@`$-$(`"!```!"B0@`$
+MBB(`%)HB`!<P0@`($$``!))"``0T0@`$$```"*)"``0T0@`"HD(`!(HB`!2:
+M(@`7,$(`X``"$4*B0@`%BB(`$)HB`!,``A3"HD(`!HHB`!2:(@`7,$(!`!!`
+M``<D`@#_BB(`%)HB`!<P0GX```(20A````*B0@`'HD(`!XHB`!":(@`3``(3
+MPC!"``^B0@`(BB(`$)HB`!,``A.",$(``:)"``F*(@`0FB(`$P`"$P(P0@`!
+MHD(`"@``$"6/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H````````````
+M````)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`DK[0`(*^S`!ROL@`8K[$`%*^P
+M`!``@)`E`*"X)0#`\"6OIP!$`D"8)9?"``(P0@$`$$`!\"0#``P\`@``)$(`
+M``!`^`D#P"@E`$"P)1+``>DD`P`,)`(`!A+B``HNX@`'$$``!B0"``@NX@`"
+M$$`!X3P"```0```%)$(``!;B`=TD`P`,/`(``"1"```"0"`E`$#X"20%0!`P
+M5`!@/`(``"1"```"0"`E`$#X"0/`*"400`'0)`,``Y)C$Q.28A,4``(2``!B
+M&"628A,5``(4``!B&"629A,6``8V`#P0```F$````D`@)30%@``"`/@)`&8P
+M)9)B$Q>29A,8``8R``)`("4T!8`$`@#X"0!&,"4\`@`!)$*2``)`("4`0/@)
+M`N`H)20"``%2X@`;/!```%+@`!0\$```)`(`!A+B``4D`@`($N(`(#P1```0
+M```J)C$``#P0```F$````D`@)20%`"@"`/@)```P)0)`("4D!4`0`@#X"20&
+M$$`0```=/!$``"80```"0"`E)`4`*!````4D!@`!)A````)`("4D!0`H```P
+M)0(`^`D\$0```D`@)20%0!`"`/@))`80)!````TF,0``/!```"80```"0"`E
+M)`4`*`(`^`D``#`E`D`@)20%0!`"`/@))`800#P1```F,0```D`@)0(@^`DD
+M!4`0/!```"80```"0"`E)`5`$`(`^`D`5#`EDF,3.))B$SD``A(``&(8)9)B
+M$SH``A0``&(8)9)F$SL`!C8``D`@)30%@`@"`/@)`&8P)9)B$SR29A,]``8R
+M``)`("4T!8`,`@#X"0!&,"4"0"`E```H)0(`^`D``#`E`D`@)20%``0"`/@)
+M```P)0)`("4D!0`,`@#X"0``,"4"0"`E`B#X"20%`!P"0"`E)`4`(`(`^`D`
+M`#`E`D`@)20%`"0"`/@)```P):Y@$QP"0"`E`B#X"20%`"P"0"`E)`4`,`(`
+M^`DD!@`%`D`@)20%`#0"`/@))`8`!0)`("4D!0!$`@#X"20&``@"0"`E)`4`
+M2`(`^`DD!@`(`D`@)20%`%`"`/@)```P)0)`("4D!0!,`@#X"0``,"4"0"`E
+M)`5`#`(`^`D``#`E`D`@)20%`$`"`/@)```P)0)`("4T!8`8`@#X"8YF$_@"
+M0"`E-`6`2`(`^`D``#`E/`(``"1"```"0"`E`$#X"0``*"4"0"`E-`6`4`(`
+M^`D``#`E`D`@)30%@%0"`/@)```P)0)`("4T!8!8`@#X"0``,"4"0"`E-`6`
+M7`(`^`D``#`E`D`@)30%@&`"`/@))`8``0)`("4T!8!D`@#X"20&``$"0"`E
+M-`6`:`(`^`D``#`E`D`@)30%@"@"`/@)```P)0)`("4T!8`L`@#X"0``,"4"
+M0"`E-`6`;`(`^`D``#`E`D`@)30%@#`"`/@))`;__P)`("4T!8`T`@#X"20&
+M__\"0"`E-`6`.`(`^`DD!@`!``"`)3P"```D513`/`(``"14%,0\`@``)%$`
+M```0$,``51`AC$4``(^B`$000``$)**``"Q"$`!40``')A```0`0$,``5!`A
+M`D`@)0(@^`F,1@``)A```2X"`*<40/_P`!`0P#P"```D0@```D`@)0!`^`D#
+MP"@E$$``QR0#``,\$0``)C$```)`("4"(/@)-`68*#P#__\T8P#_`$,0)))F
+M$GD`!C(`/!```"80```"0"`E-`68*`(`^`D`1C`EDF(2>@`"-@```A0``,(P
+M)9)C$GL``Q(``,(P)0)`("4T!9@T`@#X"0##,"4"0"`E`B#X"30%F$0D`\!_
+M`$,0))9F$G0`!C!",,8_@`)`("4T!9A$`@#X"0!&,"4"0"`E`B#X"30%F$@\
+M`__\-&,/_P!#$"269A)T``8R@#P#``,T8_```,,P)`)`("4T!9A(`@#X"0!&
+M,"4"0"`E`B#X"30%F&0\`__X-&,/_P!#$"229A)X``8S`#P#``<T8_```,,P
+M)`)`("4T!9AD`@#X"0!&,"4"0"`E`B#X"30%F1`D`__\`$,0))9F$G0PQ@`#
+M`D`@)30%F1`"`/@)`$8P)3P"``$D0J-L`D`@)0!`^`D"P"@E$$``<"0#``./
+MI`!$$(``##P0``"2PP`$,&(``E1```26P@`",&(`_J+"``26P@`"I\(``I+"
+M``2CP@`$/!```"80```"0"`E-`68'`(`^`DD!@`!/`(``"1"````0/@))`0#
+MZ#P"```D0@```D`@)0!`^`DT!9A@`D`@)30%F&`"`/@)-$8``3P"```D0@``
+M`D`@)30%F&`D!@`!`$#X"0``."4\`@``)$(```)`("4`0/@)`L`H)11```8`
+M`(`EE\(``C1"``*GP@`"$```/20#``,\`@``)%$```)`("4"(/@)`@`H)280
+M``$J`@`#%$#_^P)`("6.0A),$$``!#P"```D0@```$#X"0)`("4\`@``)$(`
+M``)`("4`0/@)-`6`)#P&_G\TQO__/`,``"1C```"0"`E-`6`)`!@^`D`1C`D
+MCF43_"0"__\0H@`$/`(``"1"````0/@)`D`@)8YE%``D`O__$*(`!#P"```D
+M0@```$#X"0)`("6.910$)`+__Q"B``0\`@``)$(```!`^`D"0"`ECD8!^%#`
+M``>N5P'</`(``"1"```"0"`E`$#X"30%@&BN5P'<$```!B0"``&/I`!(C((`
+M`%1```&L@P`````0)8^_`#2/O@`PC[<`+(^V`"B/M0`DC[0`((^S`!R/L@`8
+MC[$`%(^P`!`#X``()[T`.">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)0"@B"4"
+M0(`E/`(``"1"````0/@)-`6`!#!#__\D`@`!$B(`%2HB``)00``%)`(`!A(@
+M``V/OP`<$```)8^R`!@2(@`%)`(`"!(B`!:/OP`<$```'X^R`!B.!A/T`&8P
+M)1````@\`P!1C@83]`!F,"40```$/`,`4HX&$_0`9C`E/`,`%#P"```D0@``
+M`D`@)30%@`0`0/@)`,,P)1````N/OP`<C@83]`!F,"4\`P`0/`(``"1"```"
+M0"`E-`6`!`!`^`D`PS`EC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_
+M`!`\`@`!)$*2``!`^`F,A0'<C[\`$`/@``@GO0`8)[W_Z*^_`!`\`@`!)$*8
+M-"0%``@`0/@))`8`"H^_`!`#X``()[T`&">]_^"OOP`8K[$`%*^P`!``@(@E
+M/`(``"1"`````"@E`$#X"20&``$00``4)`4`#SP"``$D0I@T`B`@)0!`^`DD
+M!DX@$$``#3P0```F$````@#X"20$`^@\`@`!)$*8-`(@("4D!0`?`$#X"20&
+M3B`"`/@))`0(-"0"``&/OP`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`8K[$`
+M%*^P`!``@(@E`*"`)3P"```D0@`````H)0!`^`DD!@`!$$``,H^_`!@2```%
+M```P)98"``(P0@`05$```20&``$\`@``)$(```(@("4`0/@)-`68!#P"``$D
+M0I@T`B`@)20%``\`0/@))`9.(!!``!^/OP`8/`(``"1"````0/@))`0#Z#P"
+M``$D0I@T`B`@)20%`!\`0/@))`9.(!!``!./OP`8/`(``"1"````0/@))`0(
+M-#P"```D0@```B`@)0``*"4`0/@))`8``1!```8"("`E/`(``21"F#0``"@E
+M`$#X"20&``J/OP`8C[$`%(^P`!`#X``()[T`(">]_\"OOP`\K[X`.*^W`#2O
+MM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`("P):^E`$0\`@``)$(```!`
+M^`FOI@!(`$"X)1+@`+<\$0``)C$```+`("4"(/@)-`6`:#P2```F4@```L`@
+M)30%@&@"0/@)-$8`8`+`("4"(/@)-`6`)*^B`!`\!O]_-,;__P+`("4T!8`D
+M`D#X"0!&,"0\$```)A````(`^`DD!`^@`L`@)0(@^`DT!9@(/`8(``+`("4T
+M!9@(`D#X"0!&,"4"`/@))`0`"CP"``$D0J-L`L`@)0!`^`D"X"@E$$``CX^_
+M`#P\`@``)%X```/`^`DD!`/H/!$``"8Q```"P"`E`B#X"30%F`@\$O?_-E+_
+M_SP0```F$````L`@)30%F`@"`/@)`%(P)`+`("4"(/@)-`686`!`F"4"P"`E
+M`B#X"30%F%P`0*`E`L`@)0(@^`DT!9AH`$"H)3P&_`,TQO__`F8P)#P"`_P"
+MP"`E-`686`(`^`D`PC`E/`;_P#3&`'\"AC`D/`(`/S1"P(`"P"`E-`687`(`
+M^`D`PC`E/`;__C3&`!\"IC`D`L`@)30%F&@"`/@)-,81@`/`^`DD!``4`L`@
+M)0(@^`DT!9@(/`8(``+`("4T!9@(`@#X"0!&,"4#P/@))`0`"@+`("4T!9C4
+M`@#X"20&`"$"P"`E`B#X"30%F`@"P"`E-`68"`(`^`D`4C`D`\#X"20$`^@"
+MP"`E`B#X"30%F&`"P"`E-`688`(`^`DT1@`!/`(``"1"```"P"`E-`688"0&
+M``$`0/@)```X)0+`("4T!9A8`@#X"0)@,"4"P"`E-`687`(`^`D"@#`E`L`@
+M)30%F&@"`/@)`J`P)3P"```D4````L`@)0(`^`D"X"@E5$``#3P"```#P/@)
+M)`03B`+`("4"`/@)`N`H)11```8\`@``CZ,`1)1B``(T0@`"I&(``CP"```D
+M0@```L`@)0!`^`DT!8!H)`;_GSP0```F$````L`@)30%@&@"`/@)`$8P)`+`
+M("4T!8`D`@#X"8^F`!`D`@`!CZ,`2*QB``"/OP`\C[X`.(^W`#2/M@`PC[4`
+M+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?_0K[\`**^S`"2OL@`@
+MK[$`'*^P`!@`@)`E`*"`)0#`B"46```#K[``$"0"__^OH@`0/`(``"13```"
+M0"`E)`5```)@^`D"`#`E/`(``"1"````0/@)`B`@)3(0``^/H@`0,$(`#Z^B
+M`!`\`@``)$(```)`("4D!4``CZ8`$`!`^`D"`#@E`$"()3("``040``2`B`0
+M)20"`!6OH@`0DZ<`$">C`!"08@`!``(2``#B."608@`"``(4``#B."609@`#
+M``8V``)`("4D!0`4`F#X"0#F,"4"(!`EC[\`*(^S`"2/L@`@C[$`'(^P`!@#
+MX``()[T`,##&`/\``#@E)`0`"B0)`#\DR@`!/`P08C6,3=,D"P`!``000"1"
+M``,P0@#_5,(`!P`$$$``I!`AD$,``!1I`#8`8!`E$```)B0'``$D0@`#,$(`
+M_P%"$"8L0@`!``08*@!#$"000``8`*00(9!#```D!P`_4&<`&B0'``$`A1`A
+MD$C__U$'`!8D!P`!`&@0(P`"&$``8A@A``,8@`!B&",``QD``&(8(P`#&$`D
+M8@/G`$P`&0``$!```A&"`$@0(0/@``@P0@#_5.L`!B2$__\`I!`AD$,``!1I
+M``\`8!`E)(3__P2#_\\`!!!````@)20&`#\`I!`AD$,``!1F``8`8!`E)(0`
+M`2B"``M40/_Z`*00(20"``$#X``(`````##&`/\D"?__)`C__P``("4D"@`_
+M)`O__R2C``,`I!`AD$(``%!*`!4DA``!$,(`)@`$$$``I!`AD$(```!&$"M4
+M0``!`(!`)0"D$"&00@```,(0*U!```DDA``!%0L`"@"`2"4`"1!`)$(``Z#B
+M```!(Q`A`^``")!"``@H@@`+5$#_YP"D$"$H@P`+.&,``0`($"<L0@`!`&(8
+M)!1@`#,D`@`_*((`"U1```P!"1`A``@00"1"``.@X@```040(0/@``B00@`+
+M)$(``Z#B````A1`A`^``")!"``LD0@`#H.(```"H$"&01````,0P(P`&&4``
+M9A@C``,8@`!F&"$``QC``*D0(9!"````1!`C`&(`&@``&!)00``!``<`#22E
+M``,!)1`AD$0`""4"``@`HB@AD*(```""(",`9``8```P$B3&`^<\`A!B-$)-
+MTP#"`!D``!`0``(1@@````"0HP```$,0(3!"`/\#X``(`````"RB`#U00``!
+M)`4`/*2%`?P#X``()`(``2>]_\BOOP`TK[8`,*^U`"ROM``HK[,`)*^R`""O
+ML0`<K[``&`"`F"4`H#@E`,"0)0)@*"668A)V``(1`C!"``>B0@`/DF(2=S!"
+M``>B0@`0E.,``"1CZ\XL8P"7$&``UP``$"668P((D*(2?A!B``L``#`E)*0`
+M!B3&``$LP@`$$$``!R0#``0`Q!`AEF,"")!"$GA48O_Y),8``20#``00PP#&
+M```0)93B```D0NO./`-F9C1C9F<`0P`8```8$``#&(,``A?#`&(8(RQB``PL
+M0@`!`&(0(SP#JJHT8ZJK`$,`&0``&!```QA"```````#$,``0Q`C``(0@`!#
+M$"$`HH@A)C$2@@#1$"$D10`9D*(``*)"``Z2)``6,(,`_Y"B````0Q`K5$``
+M`9"D``"B1``)`-$0(21%`!F2)``7,(,`_Y"B````0Q`K5$```9"D``"B1``(
+M`-$0(21%`!F2)``8,(,`_Y"B````0Q`K5$```9"D``"B1``'`-$0(3P0``$F
+M$)I,`F`@)0(@*"601@`9`@#X"2>G`!``0*`E`F`@)0(@*"621@`)`@#X"2>G
+M`!$`0+`E`F`@)0(@*"621@`(`@#X"2>G`!(`0*@E`F`@)0(@*"621@`'`@#X
+M"2>G`!,`0!@ECF("`!!``&```A!`/`,``"1C&@P`0Q`AE$0``).B`!`D@P`#
+M`$,0*A!```23H@`0)`(``Q````.CH@`0`$00(Z.B`!`\`@`!)$*9+`)@("4"
+M("@E`$#X"9.F`!"B0@`./`(``21"FDP"8"`E`B`H)9)&``X`0/@))Z<`%`!`
+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
+M`!``H#@E`(!`)2CC``,08``)```0)0`'*0``IR@C``4H@`$%*"$\`@``)$(`
+M``!`^`DDI1-`C[\`$`/@``@GO0`8)[W_Z*^_`!``P$`E`(`X)2BC``,08``*
+M```0)0`%,0``Q3`C``8P@`#F,"$\`@``)$(```$`*"4`0/@)),830(^_`!`#
+MX``()[T`&">]_]BOOP`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@)@E`*"()20"
+M``(2(@`-`,"@)2XB``,00``&)`(``R0"``$2(@`+``"0)1```"DD`O__$B(`
+M!R02``$0```#)`+__Q````,D$@`"$```(H^_`"0`$A$``%(0(P`"$(``@H`A
+M)A`30(X#``048``9)`+__SP"```D0@```@`@)0!`^`DD!0`\%H``"ZX1``0D
+M`@`+K@(`#"0"``*N`@`4)`+__ZX"`!@D`@`*I@(`(!````>F`@`B/`(``"1"
+M```"8"`E`D`H)0!`^`D"@#`E`D`0)8^_`"2/M``@C[,`'(^R`!B/L0`4C[``
+M$`/@``@GO0`H+*,``Q!@`!T``!`E``41``!%$",``A"``((P(23&$T",PP`$
+M$&``%0``$"6LP``$)`,``0"C&`0``Q@GC((3(`!B$"2L@A,@C((3)`!B$"2L
+M@A,DC((3*`!B$"2L@A,HC((3+`!B$"2L@A,LC((3,`!B&"2L@Q,P)`(``0/@
+M``@`````)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`F"4`H*`E`F"(
+M)8XE$C0N@P`#$&``S0``$"4`%!$``%00(P`"$(`"(I`A)E(30(Y#``008`#%
+M```0)8Y$``0D`P`!%(,`P20"``&4H@`",$(`$!!``#$\$```)A````)@("4T
+M!8`0`@#X"20&`>`"8"`E-`6`%#P&"``"`/@)-,8(``)@("4T!8`@/`8!W0(`
+M^`DTQH_/CD(`%``",0``PC`C``8Q0"3&`>``!C+``F`@)30%@$`"`/@)-,8!
+MX`)@("4T!8!$/`8%K@(`^`DTQ@/`/`(``"1"```"8"`E`$#X"30%F$0D`_^`
+M`$,0)`)@("4T!9A$`@#X"31&`#@"8"`E-`68!#P&;P`"`/@)-,8@(Q```#*.
+M0P`8)A````)@("4T!8`0`@#X"20&`6@"8"`E-`6`%#P&!``"`/@)-,8$``)@
+M("4T!8`@/`8!W0(`^`DTQH^GCD,`%``#$$``0Q`A``(Q``#",",`!C#`),8"
+M,``&,L`"8"`E-`6`0`(`^`DTQ@(P`F`@)30%@$0\!@37`@#X"33&`Y@\`@``
+M)$(```)@("4`0/@)-`681"0#_X``0Q`D`F`@)30%F$0"`/@)-$8`'`)@("4T
+M!9@$/`9O``(`^`DTQA`@CD,`&"0"__\08@`")`8`#XY&`!@`!C4`ED(`(@`"
+M$0`P0@#P`,(P)99"`"`P0@`/`,(P)3P#``@T8R``/`(``"1"```"8"`E-`6`
+M'`!`^`D`PS`ECD(`##!"``$00``&)`(``0*"$`2.(Q,@`$,0)1````:N(A,@
+M`H(0!``"$">.(Q,@`$,0)*XB$R".0@`,,$(``1!```8D`@`!`H(0!(XC$R0`
+M0Q`E$```!JXB$R0"@A`$``(0)XXC$R0`0Q`DKB(3)(Y"``PP0@`"$$``!B0"
+M``$"@A`$CB,3*`!#$"40```&KB(3*`*"$`0``A`GCB,3*`!#$"2N(A,HCD(`
+M##!"``000``&)`(``0*"$`2.(Q,L`$,0)1````:N(A,L`H(0!``"$">.(Q,L
+M`$,0)*XB$RR.0@`,,$(`"!!```8D`@`!`H(0!(XC$S``0Q`E$```!JXB$S`"
+M@A`$``(0)XXC$S``0Q`DKB(3,"0"``&/OP`DC[0`((^S`!R/L@`8C[$`%(^P
+M`!`#X``()[T`*">]_^BOOP`0``41``!%$",``A"``((0(8Q#$T008``))`(`
+M`11B``@D`O__/`(``"1"````0/@)```H)1````./OP`0)`+__X^_`!`#X``(
+M)[T`&">]_^BOOP`0`(`X)0`%$0``11`C``(0@`#B$"&,0Q-$)`(``1!B``P`
+MP$`E$&``$0``$"4L8@`$$$``#@``$"4\`@``)$(```!`^`DD!0`$$```""0"
+M``$\`@``)$(```#@("4``"@E`$#X"0$`,"4D`@`!C[\`$`/@``@GO0`8)[W_
+MX*^_`!ROL@`8K[$`%*^P`!``@)`E/`(``"1"````0/@)`*"`)0!`B"4\!7__
+M-*7__SP"```D0@```D`@)0!`^`D")2@D/`(``"1"```"0"`E`$#X"30%@&02
+M```&`$`P)20"`"4`1A`C``(00A````L`PC`A+,(``A!```@DQO__/`(``"1"
+M```"0"`E`$#X"0(@*"40```,```0)3P"```D0@```D`@)0!`^`DT!8!D/`(`
+M`"1"```"0"`E`$#X"0(@*"4D`@`!C[\`'(^R`!B/L0`4C[``$`/@``@GO0`@
+M)[W_X*^_`!BOL0`4K[``$`"`B"4`!1$``$40(P`"$(`"(A`AC$,31"0"``$0
+M8@`*/`(``!!@`"(``!`E)`(``A!B`!@D`@`#$&(`"@``$"40```<C[\`&"1"
+M```"("`E)`4`"`!`^`DD!@`!$```%"0"``$\$```)A````(@("4D!0`(`@#X
+M"20&``("("`E)`4`*`(`^`DD!@`.$```""0"``$\`@``)$(```(@("4D!0`H
+M`$#X"20&``HD`@`!C[\`&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`$``%$0``
+M11`C``(0@`""$"&,0Q-$$&``"B0"``$48@`)```0)3P"```D0@```$#X"20%
+M`!0P0G@`$````@`"$L(``!`EC[\`$`/@``@GO0`8)[W_V*^_`""OLP`<K[(`
+M&*^Q`!2OL``0`("()0`%$0``11`C``(0@`(B$"&,0Q-$)`(``1!B``@\`@``
+M$&``+0``$"4D`@`"$&(`(0``$"40```IC[\`("1"```"("`E)`4`"`!`^`DD
+M!@`(``"`)3P"```D4P``/`(``!````0D4@```D#X"20$``HF$``!*@(#Z%!`
+M``<\`@```B`@)0)@^`DD!0`4,$)X`!1`__4\`@``)$(```(@("4D!0`(`$#X
+M"0``,"40```**@(#Z#P"```D0@```B`@)20%`"PD!@`$`$#X"0``."40```"
+MC[\`((^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@`P"`ECZ,`$(^I`""/
+MJ``H)&+__2Q"``(40``"/`8,```#-H`PA`__CZ(`&``"%(``@B`E``<3`#P#
+M``,T8_```$,0)`""("4Q`@`!$$```P"&("4\`@$``((@)0`($0(P0@`!``(7
+M0`!$$"6/HP`D``,8*P`#'D``8A@EJ*,`"+BC``LD`O__$2(`#@`)$T`\`P`'
+M-&/@``!#$"2HH@`,N*(`#XBB``B8H@`+/`-```!#$"6HH@`(N*(`"Q````0Q
+M`@`$J*``#+B@``\Q`@`$$$``#CP#`$"(H@`(F*(`"P!#$"6HH@`(N*(`"XBC
+M``R8HP`//`3_^(^B`#``1!`D`&(8):BC``RXHP`/`^``""0"``$#X``(```0
+M)8BB``B8H@`+/`,@``!#$"6HH@`(N*(`"P/@``@`````$.``"X^B`!"(HP`,
+MF*,`#RQ"``$``A,``&88)0!#$"6HH@`,N*(`#Q```!``````4$``"C3"$`"/
+MH@`4B$,`")A#``NHHP`(N*,`"ZBF``RXI@`/$```!0!@$"6HH``(N*``"ZBB
+M``RXH@`/J*``%+B@`!>(H@`4F*(`%ZBB`!"XH@`3`^``""0"``&(HP`4F*,`
+M%S!C``$08``[)`(`#XBB`!28H@`7,$(?_J3"``"(H@`0F*(`$P`"%`*DP@`"
+MH,``!(BB`!"8H@`3,$(``11``!<`````B*(`$)BB`!,P0@`"$$```B0"``&@
+MP@`$B*(`$)BB`!,P0@`($$``!`````"0P@`$-$(``J#"``2(H@`0F*(`$S!"
+M``000``$`````)#"``0T0@`$H,(`!(BB``B8H@`+``(4@C!"``^@P@`%B*(`
+M%)BB`!<``A-"H,(`!HBB`!"8H@`3,$(/```"$@*@P@`'B*(`$)BB`!,P0@#P
+M``(1`J#"``B@P``*H,``"P``$"4#X``(``````/@``@```````````````"0
+MH@`$-$(`"*"B``0#X``(```0)0```````````````">]_^"OOP`<K[(`&*^Q
+M`!2OL``0`("()3P"```D0@``-`68T`!`^`DD!AP6``"`)3P"```D4@```B`@
+M)30%F(`"0/@)/`8``280``$J`@`(%$#_^@(@("4\`@``)$(```!`^`DT!9P`
+M``(>`@`#(0(P8P`/``,9`#P"```D0@```(,@)0!`^`DD!0`(C[\`'(^R`!B/
+ML0`4C[``$`/@``@GO0`@)[W_P*^_`#BOMP`TK[8`,*^U`"ROM``HK[,`)*^R
+M`""OL0`<K[``&`"@H"4`P*@E`."P)8^W`%`PD?__/`(``"1"````0/@))`0N
+M\`!`F"428`$N)!```@)@D"4\`@``)$(```)@("4\!0``)*4:8`!`^`DD!A)P
+MKG0`#*YU`!"N=@`4IG$!R*9@`<HD`@`_IF(!_*Y@`@"N8"ZLKF`NR"0"!P"N
+M8B[0)`+__ZYB+M2N8B[8KF(NW#P"```D0@```F`@)0!`^`D``"@E$$`!#R00
+M``.60P'(-`+Q&U1B`!`\`@``/!```"80```"0"`E-`6B``(`^`D``#`E`D`@
+M)30%F'P"`/@))`8`&3P"```D0@```$#X"20$`^@\`@``)$(```)`("4`0/@)
+M)`5`(#!#`/\``QD"KD,!S#!"``^F0@'0)&/__BQC``,08`#O)!``#3P"```D
+M0@```D`@)0!`^`DT!9@8ID(!TCP"``$D0K@<`$#X"0)`("400`#C)!``#HY"
+M`<PL0@`$%$``"#P"```D0@```D`@)30%F```0/@))`8`!Q````<\`@``)$(`
+M``)`("4T!9@``$#X"20&`$<\`@``)$(```!`^`DD!`?0/`(``21"L>``0/@)
+M`D`@):9"`=0P0@#P)`,`$!1#`,8D$``-/`(``"1"```"0"`E)`4`P0!`^`DG
+MI@`0$$``OB00``B7H@`0+$(P`!1``+HD$``%EZ(`$*9B$G`\`@``)$(```)`
+M("4`0/@))`5`$#!#`!@``QC")`(``A1B`*XD$``*/`(``"1"```"0"`E)`4`
+M/P!`^`DGI@`0$$``IB00``B7H@`0IF(2<@``H"4``(`E/`(``"11```"0"`E
+M)@4`P`(@^`DGI@`0$$``F9>B`!`"@J`F)A```2X"`T`40/_W`D`@)30"__\6
+M@@"2)!``!R0"``JF8A/F)`(``Z9B%?```(`E)F,`!B0$``L`$!!``%`0(0`"
+M$(``4!`A``(0@`!#$"&D1!/H)A```2X"``H40/_W`!`00```@"4\`@``)$HL
+MT"9I``(F:``,)`8`"R9G``@`$!!``%,H(0!*&"&49```I*05^`!)&"&D9!7P
+M`%`0(0`"$(``4!`A``(0@`!(&"&D9A:H`$<0(:1&%A`F$``!+@(``Q1`_^\`
+M$!!`/`(``"1"```"0"`E`$#X"29E$G`00`!?)!``"(Y"`<PL0@`$5$``(*9@
+M$HJ68A**$$``'#P1```F,0```D`@)30%F``"(/@))`9`!SP0```F$````@#X
+M"20$!]`\`@`!)$*QX`!`^`D"0"`EID(!U@)`("4T!9@``B#X"20&``<"`/@)
+M)`0'T)9"`=8P0@#P)`,`(!!#``0D$``-$```/0````"F8!**/`(``"1"```"
+M0"`E)`4`OP!`^`DGI@`0$$``-"00``B7H@`0IF(2=*9"`@@\`@``)$(``*Y"
+M`<`\`@`!)$*Z6`!`^`D"0"`E/`(``"1"````0/@)`D`@)0``H"4``(`E)!8`
+M'SP"```D50``)G$`!`)`("4"T"@C`J#X"2>F`!`00``7EZ(`$`*"H"$`$!A`
+M`'$@(0`"$@*@@BPH`(`8)9.B`!&@8BPI)A```2X"``-40/_P`D`@)2Z#``$\
+M`@`"-$+__0*"$"8L0@`!`&(8)11@``8D$``)$```#`)`$"40```")!``""00
+M``@28``$/`(``"1"````0/@)`F`@)5;@``&N\``````0)8^_`#B/MP`TC[8`
+M,(^U`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@GO0!`)[W_Z*^_`!2OL``0
+M`("`)3P"```D0@```$#X"28%$G`\`@``)$(```!`^`D"`"`EC[\`%(^P`!`#
+MX``()[T`&">]_Z"OOP!<K[X`6*^W`%2OM@!0K[4`3*^T`$BOLP!$K[(`0*^Q
+M`#ROL``X`("@)30"@`"OH@`0-`*8(*^B`!0\`E55-$)55:^B`"`\`JJJ-$*J
+MJJ^B`"0\`F9F-$)F9J^B`"@\`IF9-$*9F:^B`"P``+@E)Z(`$*^B`#`GO@`8
+M`!>`@(^C`#``<!`AC%(```*`("4\`P``)&,```!@^`D"0"@E`]"`(:X"````
+M`(@E`!$4``!1@"4"@"`E`D`H)3P"```D0@```$#X"0(`,"4"@"`E/`,``"1C
+M````8/@)`D`H)1!0``,F,0`!$```+@``$"4J(@$`%$#_[@`1%````(@E)[,`
+M(#P"```D5@``/`(``"15````$1"``F(0(8Q0```"@"`E`D`H)0+`^`D"`#`E
+M`H`@)0*@^`D"0"@E$@(``R8Q``$0```7```0)2HB``040/_Q`!$0@``7$("/
+MI``P`((8(0/"$"$"@"`EC$8``#P"```D0@```$#X"8QE```F]P`!*N(``A1`
+M_[T`%X"`/`(``"1"````0/@))`0`9"0"``&/OP!<C[X`6(^W`%2/M@!0C[4`
+M3(^T`$B/LP!$C[(`0(^Q`#R/L``X`^``"">]`&`PI?__,*(!`!!```8D`A,X
+MI,(``"0"%]2DX@```^``""0"``$PH@"`$$``"@````"4@A**$$``!P`````D
+M`@D(I,(``"0""JRDX@```^``""0"``$#X``(```0)0/@``@D`@`!)[W_T*^_
+M`"BOLP`DK[(`(*^Q`!ROL``8`("8)0)@B"4"8)`EED,"""0"``$48@`&)E`!
+MX#P"```D0@``)`4`$`!`^`DGI@`0K@``!)8B$H800``')`(``:X"``26(A)V
+M5$``!)8B$HHD`@`#K@(`!)8B$HH00``%)`()"(X"``0T0@`$K@(`!"0""0BF
+M`@`0)`(*K*8"`!(D`A,XI@(`#"0"%]2F`@`.C@(``#P#@```0Q`E/`-``#1C
+MP```0Q`E)`,`"J8#``@D`P"`I@,`"B0#^_\`0Q`D)`/]_P!#$"2N`@``EB(2
+M>A!```P\`@``)$(```)@("4D!0`/`$#X"29&$D@00``%)`(``:Y"$DR.`@``
+M-$(!`*X"```D`@`-K@(`%"0"``&N0A)HC[\`*(^S`"2/L@`@C[$`'(^P`!@#
+MX``()[T`,">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)0"@B"4\$```)A```#0%
+M@"@"`/@)CB8`!`)`("4T!8`L`@#X"8XF``P"0"`E-`6`,`(`^`F.)@`0`D`@
+M)30%@#0"`/@)CB8`"`)`("4T!8`@`@#X"8XF``"/OP`<C[(`&(^Q`!2/L``0
+M`^``"">]`"`GO?_0K[\`**^E`!2,@P'<)`(``1!B``DT`O__$&``#3P"```D
+M`@`&$&(`"20"``@48@`2)*(``30"__^OH@`</`(`!S1"__\0```+KZ(`(#P"
+M``",0@```*(0(P`"$,"OH@`</`(``(Q"````HA`C``(0P*^B`"`DH@`!KZ(`
+M&#P"`8`T0O__`,(0)*^B`!`\`@``)$(```!`^`DGI0`0C[\`*`/@``@GO0`P
+M)[W_X*^_`!BOL0`4K[``$`"`B"4\$```)A```#0%@"@"`/@)```P)3P"```D
+M0@```B`@)0!`^`DT!8`$/`,`!`!#$"4\!O_/-,;__P(@("4T!8`$`@#X"0!&
+M,"0"("`E-`6`(`(`^`DT!O__C[\`&(^Q`!2/L``0`^``"">]`"`GO?_8K[\`
+M(*^S`!ROL@`8K[$`%*^P`!``@(@E`*"0)99"`!(00``;`B"8)3P"```D0@``
+M`$#X"30%@`0\!@`0/!```"80```"("`E-`6`!`(`^`D`1C`E`B`@)30%@"0"
+M`/@)ED8`$`(@("4T!8`X`@#X"99&`!*.1@`4`B`@)30%@#`"`/@)``8PP!``
+M``\\`@``/`(``"1"```"("`E`$#X"30%@`0\!O_O-,;__SP#```D8P```B`@
+M)30%@`0`8/@)`$8P)#P"```D0@```B`@)30%@"@`0/@)CD8``#P"```D0@``
+M`B`@)0!`^`DT!8`@/`/_@`!#$"260P`*`$,P)99"`!@00``%)$(`!``"%``\
+M`P!_`$,0)`#","4\$```)A````(@("4"`/@)-`6`((YF+M`\`O__-$(`_P#"
+M,"260@`:``(2`#!"_P``PC`EKF8NT`(@("4"`/@)-`6`&#P"```D0@```B`@
+M)0!`^`DD!4`$/`/__P!#$"2.1@`<),;__0`&,,`PQO__`B`@)20%0`0"`/@)
+M`$8P)8^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_HK[\`$#P"```D
+M0@```$#X"20%0`@``A`KC[\`$`/@``@GO0`8)[W_X*^_`!BOL0`4K[``$`"`
+MB"4`H(`E/`(``"1"````0/@))`4`P`!`("4D`O__5((`!#P"`06N````$```
+M.P``$"4T0MBZ`((8)#P"``@`@A`D$$``!*X#```\`D```&(0):X"```P@@`%
+M$$``!3""!<".`@``-$(``:X"```P@@7`$$``!3""`"".`@``-$(`0*X"```P
+M@@`@4$``"(X"``".(A)H$$``!#P#0`".`@```$,0):X"``".`@``/`-```!#
+M$"000``7/!```*XD$E`F$````B`@)0(`^`DD!0#$KB(25`(@("4"`/@))`4`
+MR*XB$E@"("`E`@#X"20%`,RN(A)<`B`@)0(`^`DD!0#0KB(28`(@("4"`/@)
+M)`4`U*XB$F0D`@`!C[\`&(^Q`!2/L``0`^``"">]`"`#X``(C((L.">]_]BO
+MOP`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@)@E`*"()8YT+#@&@0`+`F"`)3P"
+M```D0@``)`4`)`!`^`D``#`E/`(``"1"```"8"`E`$#X"20%`"0\`@$%-$+8
+MN@(B,"0R(@!`$$``#C(B``&.`BP\5$```33&`$".`BQ`5$```33&`0".`BQ$
+M5$```33&`(".`BQ(5$```33&!``R(@`!5$```33&``<\`D```B(0)!!```(\
+M`@`(`,(P)3P"```D4@```F`@)0)`^`DD!0"@!B$`!:X1+#@"8"`E)`4`)`)`
+M^`DD!@`!`H`0)8^_`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H`^``
+M""0"`(`GO?_H,*/__RQB`(`00``*K[\`$``#&4`T!8@</`(``"1"````0/@)
+M`&4H(3!#@``48``")`(``0``$"6/OP`0`^``"">]`!@GO?_@K[\`'*^R`!BO
+ML0`4K[``$#"E__\LH@"`$$``+0"`D"4`!8E`-`6(`#P0```F$````B4H(0(`
+M^`D``#`E-`6(!`)`("4")2@A`@#X"0``,"4T!8@(`D`@)0(E*"$"`/@)```P
+M)30%B`P"0"`E`B4H(0(`^`D``#`E-`6($`)`("4")2@A`@#X"0``,"4T!8@4
+M`D`@)0(E*"$"`/@)```P)30%B!@"0"`E`B4H(0(`^`D``#`E-`6('`)`("4"
+M)2@A`@#X"0``,"40```")`(``0``$"6/OP`<C[(`&(^Q`!2/L``0`^``"">]
+M`"`GO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``@)@E`,`@)3"E__\LHP"`$&``
+M)```$"50@``4``"0)9"2``4`$I(`D((`!`)"D"60A@`#``8V`)""``(``A0`
+M`,(P)9""``$``A(``,(P)9""````PC`E``8P0@`2%\``PC`E$````@`2D$(`
+M`#`E``6)0#0%B!@\$```)A````)@("4"`/@)`B4H(30%B!P"8"`E`B4H(0(`
+M^`DV1H``)`(``8^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_(K[\`
+M-*^^`#"OMP`LK[8`**^U`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`N"6OIP!$
+MCZ(`2#"^__\L1``!``0@(SP"554T0E56`((@)`""(",OPP"`$&``>0``$"60
+MPP``)`(``1!B``LH8@`"4$``!20"``408``)```0)1```'"/OP`T$&(`%```
+M$"40``!LC[\`-!```!$D%@`%E,,``BQC``448`!FC[\`-)3"``(L0@`&%$``
+M"0``L"64P@`"+$(`#BQ6``$`%K`C,M8``A````(FU@`!)!8`!Y#'``20P@`%
+M``(2``#B."60P@`&``(4``#B."60P@`'``(6``#B."4`Y#@FD,,`")#"``D`
+M`A(``&*H)0*DJ"8RM?__D-,`"I#"``L``A(``F*8)9#"``P``A0``F*8)9#"
+M``T``A8``F*8)0)DF":0PP`.D,(`#P`"$@``8J`E`H2@)C*4__^0T@`0D,(`
+M$0`"$@`"0I`ED,(`$@`"%``"0I`ED,(`$P`"%@`"0I`EE,(``BQ"``X00``"
+M`D20)C)2`/\`'HE`-`6(`#P0```F$````N`@)0(E*"$"`/@)`.`P)30%B`0"
+MX"`E`B4H(0(`^`D"H#`E-`6("`+@("4")2@A`@#X"0)@,"4T!8@,`N`@)0(E
+M*"$"`/@)`H`P)30%B!`"X"`E`B4H(0(`^`D"0#`E-`6(%`+@("4")2@A`@#X
+M"0+`,"4\`@``)$(```+@("4#P"@E`$#X"8^F`$2/OP`TC[X`,(^W`"R/M@`H
+MC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#@``````````">]_^BO
+MOP`0)(,L+#P"```D0@```*`@)0!@*"4`0/@))`8`!H^_`!`#X``()[T`&">]
+M_^BOOP`0/`(``"1"```DA"PL`$#X"20&``8D`@`!C[\`$`/@``@GO0`8)[W_
+MZ*^_`!`\`@``)$(```"@("4\!0``)*4LX`!`^`DD!@`&C[\`$`/@``@GO0`8
+M`^``"```$"4GO?_@K[\`'*^R`!BOL0`4K[``$`"`B"4`H!`E`,"0)3P0```F
+M$```)`5@``(`^`D`0#`E`B`@)20%8`@"`/@))`8``3P"```D0@```B`@)20%
+M8`PD!@`#`$#X"20'``(00``'`B`@)3P"```D0@```$#X"20%8`2F0@``)`(`
+M`8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(#"E__\`@!@EE&(""!!%``@D!``,
+ME&(2<C!"`(`L1``!``0@(R0"__@`@B`D)(0`"U3```&LQ````^``"```$"64
+M@A*&$$``!0``&"64@A)V%$```B0#``$D`P!#E((2BE1```$T8P`$`^``"`!@
+M$"4GO?_@K[\`'*^R`!BOL0`4K[``$`"`D"664!)(,A$`'``1B((R$``"`!"`
+M*SP"```D0@```$#X"0(@*"4\`@``)$(```)`("4`0/@)-`68`#P#```D8P``
+M`D`@)30%F```8/@)-$8@`#P"```D0@```D`@)0!`^`D"("@E`%`0)CP#```D
+M8P```D`@)0(@*"4`8/@)``(P*X^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]
+M_^"OOP`8K[$`%*^P`!``@(@E`*"`)3P"```D0@```$#X"20%0!0`$(!`)`8`
+M`P(&,`0\`P``)&,```(@("4D!4`4`&#X"0!&,"4D`@`!C[\`&(^Q`!2/L``0
+M`^``"">]`"`GO?_@K[\`&*^Q`!2OL``0`("()0"@@"4\`@``)$(```!`^`DD
+M!4`4`!"`0"0&``,"!C`$``8P)SP#```D8P```B`@)20%0!0`8/@)`$8P)"0"
+M``&/OP`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`<K[(`&*^Q`!2OL``0`("0
+M)0"@B"4`P(`E/`(``"1"````0/@))`5`&"0#``$"(Q@$``,8)P!#$"0R$``!
+M`C"`!#P#```D8P```D`@)20%0!@`8/@)`%`P)20"``&/OP`<C[(`&(^Q`!2/
+ML``0`^``"">]`"`GO?_HK[\`%*^P`!``H(`E+@(`!A!```@D`O__/`(``"1"
+M````0/@))`5`'#!"`"\"`A`&,$(``8^_`!2/L``0`^``"">]`!@GO?_@K[\`
+M&*^Q`!2OL``0`("()0#`@"4\`@``)$(```!`^`DD!4`4/`/__C1C?_P`0S`D
+M$@```S3&@``\`@`!`,(P)3P"```D0@```B`@)0!`^`DD!4`4CB,L.#P%`0`\
+M`@``)$(```(@("4`0/@)`&4H)8^_`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_
+M`!BOL0`4K[``$`"`B"4`H(`E/`(``"1"````0/@))`5`$#P#__$T8_^?`$,0
+M)#P#```D8RSH,A``!P`0@(`"`X`AC@8``#P#```D8P```B`@)20%0!``8/@)
+M`$8P)8^_`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_`!ROL@`8K[$`%*^P`!``
+M@(`E,-+__SP"```D0@``)@0L,@!`^`DD!@`&D@,L,I("+#,``A(``&(8)9("
+M+#0``A0``&(8)9(&+#4`!C8`/!$``"8Q```"`"`E-`6`"`(@^`D`9C`ED@8L
+M-I("+#<``A(``,(P)3)2/_\`$I0``@`@)30%@`P"(/@)`-(P)8^_`!R/L@`8
+MC[$`%(^P`!`#X``()[T`(">]_]BOOP`DK[0`(*^S`!ROL@`8K[$`%*^P`!``
+M@*`E/!(``"92```"0/@)-`6`3`!`F"4"@"`E`D#X"30%@%``0(`E`H`@)0)`
+M^`DT!8!,`%.8*P(3@"$"`(@E``"`)0`1@````(@E`$`8)0``$"4"`A`E`B,8
+M)8^_`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_Z*^_`!`\`@``
+M)$(```!`^`DT!8!,C[\`$`/@``@GO0`8)[W_Z*^_`!2OL``0`("`)3P"```D
+M0@```$#X"30%@"`\!@$`/`,``"1C```"`"`E-`6`(`!@^`D`1C`EC[\`%(^P
+M`!`#X``()[T`&">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`F"4\`@``)$(`
+M``!`^`DT!9AD``*4PC)2`?\R0@$`$$```SP1```Z4@'_`!*0)R8Q```"8"`E
+M`B#X"30%@%``0(`E`F`@)0(@^`DT!8!,`@*`)@(2$":/OP`@C[,`'(^R`!B/
+ML0`4C[``$`/@``@GO0`H)[W_Z*^_`!2OL``0`("`)3P"```D0@```$#X"20%
+M0"`P0P#_``,9`C!$``^.`@',%$,`!```*"66`@'04$0``20%``$`H!`EC[\`
+M%(^P`!`#X``()[T`&">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)0"@@"4\$0``
+M)C$```(@^`DT!8"0C@,```!#$"&N`@```D`@)0(@^`DT!8",C@,`!`!#$"&N
+M`@`$`D`@)0(@^`DT!8"4C@,`#`!#$"&N`@`,`D`@)0(@^`DT!8"(C@,`"`!#
+M$"&N`@`(`D`@)0(@^`DT!8"8C@,`$`!#$"&N`@`0C[\`'(^R`!B/L0`4C[``
+M$`/@``@GO0`@)[W_X*^_`!ROL@`8K[$`%*^P`!``@(@E`*"`)2X"``D40``(
+M`B"0)3P"```D0@```$#X"30%__\`4!`K4$``!#P"``"N4"[4$```#0``$"4D
+M0@```B`@)0!`^`D"`"@E/`,``"1C```"("`E)`40<`!@^`D`0#`EKE`NU"0"
+M``&/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`%*^P`!``@(`E/`(`
+M`"1"````0/@))`40<#P#```D8P```@`@)0!@^`DP1?__C[\`%(^P`!`#X``(
+M)[T`&">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`B"4`H)`E`B"8)3P"```D
+M0@```$#X"20%'_\`4A`K4$``!3P"```D`O__KF(NV!```!8``!`E)$(```(@
+M("4`0/@)-`6`%`!`@"4\`@``)$(```(@("4`0/@)`D`H)20#X``"`X`D,$(?
+M_SP#```D8P```B`@)30%@!0`8/@)`@(P):YR+M@D`@`!C[\`((^S`!R/L@`8
+MC[$`%(^P`!`#X``()[T`*">]_^BOOP`4K[``$`"`@"4\`@``)$(```!`^`DT
+M!8`4/`,``"1C```"`"`E`&#X"3!%'_^/OP`4C[``$`/@``@GO0`8D((NR#A"
+M``$#X``(,$(``2>]_^"OOP`<K[(`&*^Q`!2OL``0`("0)1"@`!$"0(@E/`(`
+M`"1"````0/@)-`6`!#P0_O\V$/__/`,``"1C```"("`E-`6`!`!@^`D`4#`D
+MCB(NR`!0$"00```0KB(NR#P"```D0@```D`@)0!`^`DT!8`$/!`!`#P#```D
+M8P```D`@)30%@`0`8/@)`%`P)8XB+L@`4!`EKB(NR"0"``&/OP`<C[(`&(^Q
+M`!2/L``0`^``"">]`"`GO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``@(@E`*"0
+M)0(@F"4\`@``)$(```!`^`DD!1__`%(0*U!```4\`@``)`+__ZYB+MP0```9
+M```0)21"```"("`E`$#X"30%@!0`0(`E/`(``"1"```"("`E`$#X"0)`*"4\
+M`^``-&/__P(#@"0``A0`/`,?_P!#$"0\`P``)&,```(@("4T!8`4`&#X"0("
+M,"6N<B[<)`(``8^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_HK[\`
+M%*^P`!``@(`E/`(``"1"````0/@)-`6`%``"+`(\`@``)$(```(`("4`0/@)
+M,*4?_X^_`!2/L``0`^``"">]`!@#X``()`(``0/@``@``````^``"```$"4#
+MX``(``````/@``@`````)[W_Z*^_`!`\`@``)$(```!`^`DT!9P<,$(`_X^_
+M`!`#X``()[T`&">]_^BOOP`0/`(``"1"````0/@)-`6`6#!"``>/OP`0`^``
+M"">]`!@GO?_HK[\`$#"F``<\`@``)$(```!`^`DT!8!8C[\`$`/@``@GO0`8
+M`^``"(R"+JPGO?_HK[\`$(R&$C14P``$/`(``*R%+JP0```$)`(``21"````
+M0/@)`````(^_`!`#X``()[T`&">]_^@D`@`!%*(`":^_`!`LP@`"%$``"@``
+M$"4D`P`%%,,`!R0"``T0```%```0)3P"```D0@```$#X"0````"/OP`0`^``
+M"">]`!@GO?_@K[\`&"0"``L4H@`)`(`8)3#F``:L9@'X/`(``"1"````0/@)
+M-`6`2!````<D`@`!CZ(`,*^B`!`\`@``)$(```!`^`D`8"`EC[\`&`/@``@G
+MO0`@)[W_X*^_`!B/H@`PCZ,`-*^B`!`\`@``)$(```!`^`FOHP`4``(0*X^_
+M`!@#X``()[T`(```````````)[W_T*^_`"ROM@`HK[4`)*^T`""OLP`<K[(`
+M&*^Q`!2OL``0$*``,0"`B"4\`@``)$(```!`^`DD!4`$/`;__#3&__\\`P``
+M)&,```(@("4D!4`$`&#X"0!&,"0\`@``)$(```!`^`DD!``*)!``"CP"```D
+M4@``/!8``3P"```D50``/!3__#:4__\\`@``$```"R13```"H/@))`0`R`(@
+M("4"0/@))`5`!`(@("4D!4`$`F#X"0!4,"0F$/__$@``"`(@("4"0/@))`5`
+M$`!6$"040/_P`````%8```0\`@``$```#P``$"4\`@``)$(```(@("4`0/@)
+M-`6`!#P&__LTQO__/`,``"1C```"("`E-`6`!`!@^`D`1C`D)`(``8^_`"R/
+MM@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#`GO?_8K[\`(*^S
+M`!ROL@`8K[$`%*^P`!``@(@E`*"`)3P"```D4@```D#X"30%@`0\!@`$/`,`
+M`"1S```"("`E-`6`!`)@^`D`1C`E$@``"0(@("4"0/@))`5`!#P&__PTQO__
+M`B`@)20%0`0"8/@)`$8P)(^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@G
+MO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``@(@E`*"`)3P"```D4@```D#X"30%
+M@`0\!@`$/`,``"1S```"("`E-`6`!`)@^`D`1C`E$@``"0(@("4"0/@))`5`
+M!#P&__PTQO__`B`@)20%0`0"8/@)`$8P)(^_`""/LP`<C[(`&(^Q`!2/L``0
+M`^``"">]`"@GO?_@K[\`'*^R`!BOL0`4K[``$`"@B"4`P"@E)!```1(P``T`
+M@)`E$B``!CP"``$D`@`"$B(`#@``$"40```3C[\`'"1"T\``0/@)`````!``
+M``L`0(`E/`(``21"U0P`0/@)`````!````:N42ZH/`(``21"U9P`0/@)````
+M`*Y1+J@"`!`EC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_`!`\`@``
+M)$(```!`^`DD!4`$``(4`C!"``./OP`0`^``"">]`!@``````````">]_^BO
+MOP`4)`(``A"B`!.OL``0+*(``Q!```8D`@`$)`(``1"B``<``!`E$```$X^_
+M`!00H@`&```0)1````^/OP`4/`(``!````8D4```/`(``!````,D4```/`(`
+M`"10```\`@``)$(```!`^`D"`"@E`@`0)8^_`!2/L``0`^``"">]`!@`````
+M`````">]_^BOOP`0/`(``"1"````0/@))`4`#(^_`!`#X``()[T`&">]_^BO
+MOP`0`*`P)3P"```D0@```$#X"20%``R/OP`0`^``"">]`!@GO?_HK[\`$#P"
+M```D0@``)`4`"`!`^`DD!@`$C[\`$`/@``@GO0`8)[W_Z*^_`!2OL``0`("`
+M)3P"```D0@``)`4`"`!`^`DD!@`@/`(``"1"```"`"`E)`4`""0&``0`0/@)
+M```X)0`"$"N/OP`4C[``$`/@``@GO0`8)[W_Z*^_`!2OL``0`("`)3P"```D
+M0@```$#X"30%@$@D!O_?/`,``"1C```"`"`E-`6`2`!@^`D`1C`DC[\`%(^P
+M`!`#X``()[T`&">]_^BOOP`4K[``$`"`@"4\`@``)$(```!`^`DT!8!(/`,`
+M`"1C```"`"`E-`6`2`!@^`DT1@`@C[\`%(^P`!`#X``()[T`&">]_^"OOP`<
+MK[(`&*^Q`!2OL``0`("()0"@$"4`P)`E/!```"80```T!8!``@#X"0!`,"4"
+M("`E-`6`1`(`^`D"0#`EC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_
+M`!BOL0`4K[``$`"`B"4`H(`E+@,`0!!@`"$``!`E+@(`(!1``!`\`@``)$(`
+M``!`^`DT!8!$)@/_X"0&``$`9C`$``8P)SP#```D8P```B`@)30%@$0`8/@)
+M`$8P)!````\D`@`!)$(```(@("4`0/@)-`6`0"0&``$"!C`$``8P)SP#```D
+M8P```B`@)30%@$``8/@)`$8P)"0"``&/OP`8C[$`%(^P`!`#X``()[T`(">]
+M_^"OOP`8K[$`%*^P`!``@(@E`*"`)2X#`$`08``?```0)2X"`"`40``//`(`
+M`"1"````0/@)-`6`1"8#_^`D!@`!`&8P!#P#```D8P```B`@)30%@$0`8/@)
+M`$8P)1````XD`@`!)$(```(@("4`0/@)-`6`0"0&``$"!C`$/`,``"1C```"
+M("`E-`6`0`!@^`D`1C`E)`(``8^_`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_
+M`!`\`@``)$(```!`^`DT!8`\C[\`$`/@``@GO0`8)[W_Z*^_`!``H#`E/`(`
+M`"1"````0/@)-`6`/(^_`!`#X``()[T`&*B@``BXH``+,,(/_ZBB``RXH@`/
+MB*,`#)BC``\49@`0```0)3#B`"`00``&`````(BB``R8H@`/-$(@`*BB``RX
+MH@`/J*``%+B@`!>(H@`4F*(`%ZBB`!"XH@`3)`(``0/@``@`````)[W_X*^_
+M`!ROL@`8K[$`%*^P`!``P)`EC[$`.`"@@"6*`P`4F@,`%S!C``$08`!0)`(`
+M#XCB`!28X@`7,$(``11```8\`@``)$(```!`^`DD!0`,$%(`1B0"``^*`@`0
+MF@(`$S!"#_^F(@``B@(`%)H"`!<``A/",$(?_Z8B``*B(``$B@(`%)H"`!<P
+M0@`"%$``%P````"*`@`4F@(`%S!"``000``#)`(``1```!"B(@`$B@(`%)H"
+M`!<P0@`0$$``!)(B``0T0@`($```"*(B``0T0@`"HB(`!(H"`!2:`@`7,$(`
+MX``"$4*B(@`%B@(`$)H"`!,``A3"HB(`!HH"`!2:`@`7,$(!`!!```<D`@#_
+MB@(`%)H"`!<P0GX```(20A````*B(@`'HB(`!XH"`!":`@`3``(3PC!"``^B
+M(@`(B@(`$)H"`!,``A;",$(`!Z(B``F*`@`0F@(`$P`"$P(P0@`!HB(`"@``
+M$"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"``````)[W_@*^_`'ROO@!XK[<`
+M=*^V`'"OM0!LK[0`:*^S`&2OL@!@K[$`7*^P`%@`@)`EKZ4`A`#`L"6OIP",
+M`D"@):^@`$BOH`!,KZ``4);"``(``A'",$,``9;"``(P0@$`$$``!0``N"44
+M8`+E)`,`#!````B6P@`"EL(``@`"$<(X0@`!,$(``11``MTD`P`,EL(``@`"
+M$8(P0P`!EL(``C!"`"!00``%EL(``A1@`M0D`P`,$```!SP"`````A&".$(`
+M`3!"``$40`+-)`,`##P"```D0@```D`@)0!`^`D"P"@E`$#P)1/``L4D`P`,
+M)`(`!H^C`(008@`++&(`!Q!```8D`@`(+&(``A!``KPD`P`,$```!8^B`(R/
+MI`"$%(("MR0#``R/H@",$$``*CP"```D4````D`@)0(`^`DT!8!,KZ(`3`)`
+M("4"`/@)-`6`4*^B`%".0@',+$(`!!1```8``(@E`D`@)0(`^`DD!1%`$```
+M#J^B`!`\`@``)%4``">S`!``$8"``D`@)0*@^`DF!1%``G"`(:X"```F,0`!
+M+B(`"A1`__@`$8"`D\,`!#!B``)40``$E\(``C!B`/ZCP@`$E\(``J;"``*3
+MP@`$HL(`!#P"```D0@```D`@)0!`^`DT!8!8`$"H)5*@``$D%0`!/!```"80
+M```"0"`E`@#X"30%@`0\`P(``$,0)*^B`$0"0"`E`@#X"20%0!`\`P#^-&,`
+M8`!#$"2OH@!``D`@)0(`^`DD!4`4KZ(`.`)`("4"`/@))`5`&*^B`#P\`@``
+M)$(```)`("4`0/@)EL4``A!``F4D`P`#EL(``C!#`?`D`@#`$&(`&"AB`,$0
+M0``&)`(!0"0"`*!08@`0)`(``Q```!6.0@',$&(`!20"`5`08@`')`0``A``
+M``^.0@',)`,``:^C`$@0```*)!<``:^D`$@0```')!<``:^B`$@0```$)!<`
+M`B0#``2OHP!()!<``HY"`<PL0@`$%$``"#P"```D0@```D`@)30%F```0/@)
+M)`8`!Q````>.0@',)$(```)`("4T!9@``$#X"20&`$>.0@',+$(`!!1``$8\
+M`@`!EL,``C!B`(`00``N``"()9:"$G`L0C`!%$``*SP"```P8@`@4$``!):1
+M$VZ6D1-L$````I:3$W"6DQ-R/!```"80```"("`E`@#X"20%``,`0(@E`F`@
+M)0(`^`DD!0`#/`<``"3G1LP`%S"`),4!+`"G*"&,I```)`/_/P"#("0`$1F`
+M,&,`P`"#("6LI```),8!.`#',"&,Q```)`/_\`"#("0`$1B",&,``0`"$$`P
+M0@`.`&(8)0"#("6LQ`````"()3P"```D4$;,/`(``"13````$1!``%$0(0`"
+M&(``<!@A`%<0(0`"$(``4!`A`D`@)8QE```"8/@)C$8``"8Q``$N(@`<%$#_
+M\P`1$$`\`@`!)$+T>`)`("4`0/@)`L`H)0``B"4\`@``)%`M$#P"```D4P``
+M`!$0@`!1$"$``AB``'`8(8^D`$@`1!`A``(0@`!0$"$"0"`EC&4```)@^`F,
+M1@``)C$``2XB`",40/_R`!$0@```B"4\`@``)%`U)#P"```D4P```!$00`!1
+M$"$``AB``'`8(0!7$"$``A"``%`0(0)`("6,90```F#X"8Q&```F,0`!+B(`
+M0!1`__,`$1!```"()3P"```D4"_,/`(``"13````$1#``%`0(8Q%``"/H@",
+M$$``!"2B@``L0A``5$``!R8Q``$`$1#``%`0(0)`("4"8/@)C$8`!"8Q``$N
+M(@"K%$#_\``1$,".0@',+$(`!!!``""/HP",/!$``"8Q```"0"`E`B#X"30%
+M@!P\`P`/-&/__P!#$"0\!@'0/!```"80```"0"`E-`6`'`(`^`D`1C`E`D`@
+M)20%`%P"`/@)```P)0)`("4T!9AX`@#X"20&``@"0"`E`B#X"30%@$@"0"`E
+M-`6`2`(`^`DT1@0`CZ,`C!!@`"$\`@``)%````)`("4T!8!,`@#X"8^F`$P"
+M0"`E-`6`4`(`^`F/I@!0CD(!S"Q"``040``'``"()0)`("4D!1%``@#X"8^F
+M`!`0```/DH,L+">P`!`\`@``)%,````1*(`"!1`A`D`@)22E$4`"8/@)C$8`
+M`"8Q``$N(@`*%$#_^``1*("2@RPLDH(L+0`"$@``8A@EDH(L+@`"%```8A@E
+MDH8L+P`&-@`\`@``)%````)`("4T!8```@#X"0!F,"62ABPPDH(L,0`"$@``
+MPC`E`D`@)30%@`2/H@!$`@#X"0#","4\`@`!)$(2Z`)`("4`0/@)CZ4`A#P"
+M```D40```D`@)0(@^`DD!4`0`D`@)20%0!"/HP!``@#X"0!#,"4"0"`E)`5`
+M%`(`^`F/I@`X`D`@)20%0!@"`/@)CZ8`/`)`("4T!8!8`@#X"0*@,"62@RPR
+MDH(L,P`"$@``8A@EDH(L-``"%```8A@EDH8L-0`&-@`"0"`E-`6`"`(`^`D`
+M9C`EDH(L-I*&+#<`!C(``D`@)30%@`P"`/@)`$8P)0)`("4T!8`8`@#X"8Z&
+M+M`"0"`E)`4`@`(`^`DD!O__CD,!S"0"``048@`-/`(``)9"`=`L0@`"4$``
+M"3P"```"0"`E`B#X"20%`!0"0"`E)`4`%`(`^`DT1@0`/`(``"1"```"0"`E
+M`$#X"0+`*"400`#_)`,``R0"``:/I`"$$((`%CP"``&.0@($,$(``Q!``!$\
+M`@``)$(```)`("4`0/@)-`691#P#W_\T8___`$,0)(Y&`@0PQ@`!``8W0#P#
+M```D8P```D`@)30%F40`8/@)`$8P)3P"``$D0ODT`D`@)0!`^`D"P"@E/`(`
+M`21"[QP"0"`E`$#X"0/`*"400`#;)`,``Y9#`<@T`O$;%&(`"SP"``"6P@`"
+M,$(`@!!```8\`@``)$(```)`("4T!=@(`$#X"20&!0(\`@``)$(```)`("4T
+M!9@<`$#X"20&``$\`@``)$(```)`("4`0/@)-`69%#!#/_^6P@`",$(`(!!`
+M``D``Q"`/`.Z+C1CBZ,`0P`9```0$```````````$```!P`"(0(\`LS,-$+,
+MS0!B`!D``!`0``(@P@`````\`@``)$(```!`^`DDA`!D/`(``"1"```"0"`E
+M`$#X"30%F&`\`P``)&,```)`("4T!9A@`&#X"31&``$\`@``)$(```)`("4T
+M!9A@)`8``0!`^`D``#@E/`(``"1"```"0"`E`$#X"0/`*"540``)CH(NL);#
+M``(P8@`@5$``CR0#``,T8@`"IL(``A```(LD`P`#$$``"3P"```D0@```D`@
+M)30%F2`\!@`!`$#X"33&\``D`@`!KH(NM```@"4D$P`!/`(``"11````$"B`
+M`D`@)22E$``"(/@)`A,P!"80``$J`@`*5$#_^0`0*(```(`E/`(``"11```"
+M0"`E`B#X"0(`*"4F$``!*@(`"A1`__L"0"`E/`(``"10```D!0"D/`8``0(`
+M^`DTQ@`!`D`@)20%`*@"`/@))`8``0)`("4D!0"L`@#X"20&``$\`@``)%$`
+M``)`("4"(/@))`40L`)`("4D!1"P`@#X"0!`,"4"0"`E)`4`H#P&``@"`/@)
+M-,8)93P"``@T0@EEKH(L.`)`("4"(/@))`4`K#P&``<"0"`E)`4`K`(`^`D`
+M1C`E)`(`!H^C`(148@`,CD(23`)`("4"(/@))`4`H`)`("4D!0"@`@#X"31&
+M$`".@BPX-$(0`*Z"+#B.0A),$$``!#P"```D0@```$#X"0)`("4\`@``)$(`
+M``)`("4`0/@)-`6`(#P&_G\TQO__/`,``"1C```"0"`E-`6`(`!@^`D`1C`D
+MCH4NU"0"__\0H@`$/`(``"1"````0/@)`D`@)8Z%+M@D`O__$*(`!#P"```D
+M0@```$#X"0)`("6.A2[<)`+__Q"B``0\`@``)$(```!`^`D"0"`ECD8!^!#`
+M``>/I`"$/`(``"1"```"0"`E`$#X"30%@$B/I`"$KD0!W!````8D`@`!CZ0`
+MD(R"``!40``!K(,`````$"6/OP!\C[X`>(^W`'2/M@!PC[4`;(^T`&B/LP!D
+MC[(`8(^Q`%R/L`!8`^``"">]`(`GO?_HK[\`$#P"``$D0NX4`$#X"20%``*/
+MOP`0`^``"">]`!@GO?_HK[\`%*^P`!``@(`E/`(``"1"`````"@E`$#X"20&
+M``$00``.C[\`%#P"``$D0NX4`@`@)0!`^`DD!0`3$$``!X^_`!0\`@``)$(`
+M``!`^`DD!`@T)`(``8^_`!2/L``0`^``"">]`!@GO?_@K[\`&*^Q`!2OL``0
+M`("()3"P__\\`@``)$(`````*"4`0/@))`8``1!``'XR`P'P)`(`P!!B`"LH
+M8@#!$$``""0"`4`D`@"@$&(`$B0"`+`08@`0/`(``1```%TD0NX4$&(`."AB
+M`4$00``&)`(!4"0"`-`08@`;/`(``1```%0D0NX4$&(`+SP"``$0``!0)$+N
+M%#P0```F$````B`@)30%F`0"`/@)```P)0(@("4T!:(``@#X"20&``,"("`E
+M-`68?`(`^`DD!@`9/`(``"1"````0/@))`0!+!```#L\`@`!/`(``"10```"
+M("`E-`68!`(`^`D``#`EEB,!R"0"`!)48@`Q/`(``0(@("4T!9A\`@#X"20&
+M`!@\`@``)$(```!`^`DD!`$L`B`@)30%H@`"`/@))`8``A```",\`@`!,@(`
+M$!!```@\`@``)$(```(@("4T!9@$`$#X"20&``,0```'EB,!R"1"```"("`E
+M-`68!`!`^`D``#`EEB,!R"0"`!)48@`0/`(``3P0```F$````B`@)30%F'P"
+M`/@))`8`&#P"```D0@```$#X"20$`2P"("`E-`6B``(`^`D``#`E/`(``21"
+M[A0"("`E`$#X"20%`!,00``2C[\`&#P"```D0@```$#X"20$"#0\`@``)$(`
+M``(@("4``"@E`$#X"20&``$00``%`B`@)3P"``$D0NX4`$#X"0``*"6/OP`8
+MC[$`%(^P`!`#X``()[T`(">]_\BOOP`TK[X`,*^W`"ROM@`HK[4`)*^T`""O
+MLP`<K[(`&*^Q`!2OL``0`("8)0"@N"4`P/`E/`(``"1"````0/@)`F"P)0!`
+MH"42@`!FC[\`-(["+K000``V/`(``"15```"8"`E`J#X"30%F2`\`P`!`$,0
+M)%1``"\\`@`!KL`NM`)@("4"H/@)-`6<$`!`D"4"8"`E`J#X"30%G!0`0(`E
+M`F`@)0*@^`DT!9P8`$`P)0`2(@(`$!("`((@(0`0*8(`!!`K``48*P!#$"00
+M0``8``:((P(D`!H``!`24(```0`'``TP40`_`D4`&@``@!)0H``!``<`#280
+M_\`R$``?`F`@)0*@^`DT!9D@`!$90`!#$"4`4!`E/`,``"1C```"8"`E-`69
+M(`!@^`DT1@@`/`(``21"\E@"8"`E`$#X"0*`*"540``(/`(``);C``(T8P`"
+MIN,``I:#``(P8__]$```'Z:#``(D4````F`@)0(`^`D"@"@E%$``$CP"``$\
+M`@``)$(```!`^`DD!!.(`F`@)0(`^`D"@"@E%$``"3P"``&6XP`",&(`(%1`
+M``P``!`E-&(``J;B``(0```(```0)21"#WP`0/@)`F`@)8["+K0L0@`!K\(`
+M`"0"``&/OP`TC[X`,(^W`"R/M@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0
+M`^``"">]`#@GO?_0K[\`**^S`"2OL@`@K[$`'*^P`!@`@(@E`*"`)18```.O
+ML``0)`+__Z^B`!`\`@``)$(```(@("4`0/@))`4`##P"```D4P```B`@)20%
+M0``"8/@)`@`P)3P"```D0@```$#X"20$``\R$``#CZ(`$#!"``.OH@`0/`(`
+M`"1"```"("`E)`5``(^F`!``0/@)`@`X)0!`D"4R`@`!%$``$@)`$"4D`@`5
+MKZ(`$).G`!`GHP`0D&(``0`"$@``XC@ED&(``@`"%```XC@ED&8``P`&-@`"
+M("`E)`4`%`)@^`D`YC`E`D`0)8^_`"B/LP`DC[(`((^Q`!R/L``8`^``"">]
+M`#`GO?_8K[\`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("@)0"@F"4\`@``)$(`
+M`)9E````0/@)EF8``@`"%````B0#EF(``C!"`(`00``2``2`0`($@"$`$("`
+M/`(``"1".0@"`H`A/`(``"1"``".!``$`$#X"20%``@P4@#_`!*10(X"````
+M`A$``D*0)1````*&!``(``"0)2B"`)$00``$/`(``#""``$00``(/`(``"1"
+M```DA/_H`$#X"20%``@P40#_$```"R0"``$DA/_H``07P@""("$\`@``)$(`
+M```$($,`0/@))`4`"#!1`/\``!`E`!&(@``"$$`"(H@E-C$$`3)&`/\`!C(`
+M,B(`_SP0```F$````H`@)30%F)P"`/@)`,(P)0`1B@(R0O\`,B8`_P*`("4T
+M!9C0`@#X"0!&,"6NDQ(T)`(``8^_`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@
+M``@GO0`H)[W_Z*^_`!`\`@``)$(```!`^`DT!9AD``(4PC!#`?\P8@$`$$``
+M`CAB`?\``A@G`&`0)8^_`!`#X``()[T`&">]_]BOOP`DK[0`(*^S`!ROL@`8
+MK[$`%*^P`!``@*`E,+,`_P`&C```$8P#/!(``"92```"0/@)-`689"0#\```
+M0Q`D`!,:0#!C#@``0Q`E,C$!_SP0```F$````H`@)30%F&0"`/@)`%$P)0*`
+M("4"0/@)-`688`*`("4T!9A@`@#X"31&``(28``$)!$`.``3$,``4Q`C``**
+M0```@"4\`@``)%,``#P"```0```$)%(```)`^`D"("`E)A```2H"`#Q00``.
+M```0)0*`("4"8/@)-`688#!"``(40/_U*@(`/%1```,\`@`!$```!```$"4D
+M0O"(`$#X"0*`("6/OP`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*)2B
+M``(P0P'@)`(`P%!B`!&4@A+0*&(`P1!```8D`@%`)`(`H%!B``F4@A+.`^``
+M"```$"4`````%&(`"`````"4@A+,$```!Z3"```0```%I,(``!````.DP@``
+M`^``"```$"4D`@`!`^``"``````GO?_8K[\`(*^Q`!ROL``8`("()0"@@"4\
+M`@`!)$+QZ`!`^`DGI@`0$$``%X^_`"`\`@``)$(```(@("4`0/@)-`688#P"
+M``$D0O"(`$#X"0(@("4`0!@EAZ(`$`!#$"I00``%I@,`%I8"``(T0@`"I@(`
+M`J8#`!:'H@`0`$,0*CA"``&/OP`@C[$`'(^P`!@#X``()[T`*">]_]"OOP`L
+MK[0`**^S`"2OL@`@K[$`'*^P`!@`@)`ECD(!S"Q"``000``C`*"()3P"```D
+M0@```$#X"0`````00``=/`(``21"\>@"0"`E`B`H)0!`^`DGI@`0$$``(@``
+M@"4\`@``)%0Z3#P"``$D4_#(`A00(0)`("6010```F#X"0``,"4`0!@EAZ(`
+M$`!#$"I00``"IB,`%J8@`!8F$``!+@(``U1`__,"%!`A$```#2X"``0\`@``
+M)$(```)`("4`0/@)-`688#P#```D8P```D`@)30%F&``8/@)-$8``B0"``&/
+MOP`LC[0`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`,#P"``"4HP``E$(Z4`!#
+M$"L40``+```@)3P"```D0SI0E*4``"2$``$`!!"``$,0(91"````11`K4$#_
+M^R2$``$\`@``)$(Z4``$&(``0Q`AE$,``@`#'````Q0#/`15532$558`1``8
+M```0$``#'\,`0Q`C``(4``/@``@``A0#)[W_P*^_`#ROO@`XK[<`-*^V`#"O
+MM0`LK[0`**^S`"2OL@`@K[$`'*^P`!BOI`!``("@)92D``(P@@"`+$(``20#
+M``(`8A@C,(0!X"0"`,`0@@!2KZ,`$"B"`,$00``&)`(!0"0"`*`0@@!&```0
+M)1```*^/OP`\%((`K```$"64H@``)$+P7RQ"!.M00``$E*(``):5$U00```5
+MEI835B1"ZW0L0@#P4$``!)2B``"6E1-8$```#I:6$UHD0NJ$+$(`X5!```24
+MH@``EI437!````>6EA->+$(670``L"440``#``"H)9:5$V"6EA-BEI`2V):>
+M$MXOUP`!/`8``"3&1:"/H@`0``(H@"2D`#P`AB`AC(,``#P"[_\T0O__`&(8
+M)):"$\P``A<``&(8):R#```DI`!(`(8@(8R#```\`OO_-$+__P!B&"26@A/.
+M``(6@`!B&"6L@P``)*4`_`"F*"&,HP``)`+_]P!B&"26@A/*``(0P`!B&"40
+M```,K*,``):5$V26EA-FEI`2VI:>$N`0```&+]<``9:5$VB6EA-JEI`2W):>
+M$N(OUP`!/!(``"92```"`"`E`D#X"20%``0\$P``)G-%H(^C`!```XB`)B4`
+MA`"S*"&,I```)`/_/P"#("0``A'``!<9@`!#$"4P0@#``((@):RD```"`"`E
+M`D#X"20%``0F,`"0`A.`(8X#```D!/_X`&08)``"$$(P0@`'`&(8):X#```"
+MH"`E`D#X"20%``..`P``)`3_?P!D&"0``A'`,$(`@`!B&"6N`P```J`@)0)`
+M^`DD!0`#)C``G`(3@"&.`P``)`3__`!D&"0``A!",$(``P!B&"6N`P```L`@
+M)0)`^`DD!0`#C@,``"0$_^,`9!@D``(0@#!"`!P`8A@EK@,``"8Q`,P",X@A
+MCB,``"0"__<`8A@D`!X0P#!"``@`8A@EKB,`````@"4"8(@E/`(``"12````
+M$!!``%`0(0`"&(``<1@ACZ0`$`!$$"$``A"``%$0(8^D`$",90```D#X"8Q&
+M```F$``!+@(`&11`__(`$!!`KH`NP"0"``&/OP`\C[X`.(^W`#2/M@`PC[4`
+M+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?_@K[\`'*^R`!BOL0`4
+MK[``$`"`D"64P@`",$,!X"0"`,`08@`/`D`X)2AB`,$00``&)`(!0"0"`*`0
+M8@`'```0)1```$&/OP`<%&(`/@``$"40```$```8)1````(D`P`!)`,``@`#
+M&$`DY``$`&00(91&$N:40A+L``(1@`#","4`9!`AE$(2\@`"$P``PC`E`&00
+M(91"$O@``A2``,(P)0!D$"&40A+^``(6``#","4`9!`AE%$3!)1"$PH``A&`
+M`B*()0!D$"&40A,0``(3``(BB"4`9!`AE$(3%@`"%(`"(H@E`&08(91B$QP`
+M`A8``B*()20"``%0H@`'`,"()5"@``:LY2ZL)`(``A2B``T``!`E`B`P):SE
+M+JP\$```)A````)`("4"`/@)-`698`)`("4T!9ED`@#X"0(@,"4D`@`!C[\`
+M'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`D
+MK[0`(*^S`!ROL@`8K[$`%*^P`!``@+`EKZ4`/)2B``(P0P'@)`(`P!!B`"`"
+MP+@E*&(`P1!```8D`@%`)`(`H!!B`!@``!`E$```TX^_`#048@#0```0)0``
+M\"4\`@``)$(```+`("4`0/@)-`691"0#_\<`0Q`DEN83T``&,,`PQ@`X/`,`
+M`"1C```"P"`E-`691`!@^`D`1C`E$```!8["`<P0```")!X``20>``*.P@',
+M+$(`!!!```T\`@``)$(```+`("4`0/@)-`69$#P#```D8P```L`@)30%F1``
+M8/@)-$8``Q```"$\$P``)$(```+`("4`0/@)-`69$"0#_`8`0Q`D`!Z(0";R
+M``0",A@AE&,2X``#&0``0Q`E/!```"80```"P"`E-`69$`(`^`DT1@`!/`(`
+M`"1"```"P"`ECN4NK`!`^`F/I@`\`C*((98F$L@PQ@'_`L`@)30%F6@"`/@)
+M-,8"`#P3```F<P```L`@)0)@^`DT!9A$)`/`?P!#$"0`'I!`)O0``@)4&"&4
+M9A*@``8QP##&/X`\$0``)C$```+`("4T!9A$`B#X"0!&,"4"P"`E`F#X"30%
+MF$@\`__\-&,/_P!#$"0F51*H`O48(91F````!C,`/`,``S1C\```PS`D`L`@
+M)30%F$@"(/@)`$8P)0+`("4"8/@)-`684#P#__\`0Q`D`]<8(9!C$LD``QH`
+M`$,0)2;P``8#T!@AD&82P`+`("4T!9A0`B#X"0!&,"4"5*`AEH(2N``"-@``
+M`A0``,(P)0)7$"&40Q+```,2``#","4"P"`E-`68-`(@^`D`PS`E`L`@)0)@
+M^`DT!9@H/`/__S1C`/\`0Q`D`A6`(98&````!C(``L`@)30%F"@"(/@)`$8P
+M)0+`("4"8/@)-`689#P#__@T8P__`$,0)`)7D"&61A*T``8S`#P#``<T8_``
+M`,,P)`+`("4T!9AD`B#X"0!&,"66XA)P+$(P`Q!```PD$``"EL,!RB0"$"(4
+M8@`6/`(``(^C`#R48@`",$(`0%1``!`D$``($```#SP"``"/HP`\E&(``#!"
+M`!\``A@K)$+_]BQ"``TX0@`!`&(8)!!@``0`'A!``%<0(91"$R8"`H`A/`(`
+M`"1"```"P"`E`$#X"30%F20D`_\!`$,0)``0,$`PQ@#W/`,``"1C```"P"`E
+M-`69)`!@^`D`1C`E)`(``8^_`#2/O@`PC[<`+(^V`"B/M0`DC[0`((^S`!R/
+ML@`8C[$`%(^P`!`#X``()[T`.">]_^BOOP`0`*`P)2S"`$`40``"`,`8)20#
+M`#^D@P'\/`(``"1"````0/@)-`69/"0"``&/OP`0`^``"">]`!@GO?_`K[\`
+M/*^T`#BOLP`TK[(`,*^Q`"ROL``H`("@)0"@F"668@`",$,!X"0"`,`08@`4
+M`H"`)2AB`,$00``&)`(!0"0"`*`08@`7```0)1```$N/OP`\%&(`2```$"66
+M`A/FIZ(`'"8"$]*OH@`8)@(3Z*^B`""6$A=*$```$B81%TR6`A7PIZ(`'"8"
+M%?*OH@`8)@(6$J^B`""6$A><$```"281%YZ6`A7PIZ(`'"8"%?BOH@`8)@(6
+MKJ^B`""6$A>\)A$7OCP"``$D0O[L`H`@)2>E`!@`0/@)EF8``#P"```D0@``
+M`H`@)0!`^`D"8"@E`$`@)0``&"66`A-T$$``%@``*"66`A-V4$``!21C``%4
+M1``#)&,``1````\F!1?4E@(3=`!B$"I00``,K[,`$``#$$``4!`AE$(3=E!`
+M__@D8P`!5$3_]B1C``$``Q&``@(0(21%%]2OLP`0/`(``21"`Z@"@"`E`B`P
+M)0!`^`DR1___)`(``8^_`#R/M``XC[,`-(^R`#"/L0`LC[``*`/@``@GO0!`
+M)[W_P*^_`#ROO@`XK[<`-*^V`#"OM0`LK[0`**^S`"2OL@`@K[$`'*^P`!BO
+MI`!`KZ4`1##6__\``+@E)!X`/SP0```F$```/`0``"2$`)`"`/@))`4!"#P$
+M```DA``0`@#X"20%`(`\`@``)%4`F":S`(`D$@`!``"()0`1$$``51`AI%(`
+M`"9"``$P4O__)B(``3!1__\N0@!`%$#_^``1$$`\`@``)$(`D*11``8D`P`!
+MI$,``B0#`#^D0P`$E$(`!A!``!,``(@E/`(``214"9P\`@``)%(`D``1@$`"
+M%1`A`L`@)91%```"@/@)CZ8`1`(3@"&F`@``)B(``3!1__^60@`&`B(0*Q1`
+M__0`$8!`AF8``#P"``"40P"6``,00`)B$"&$1__^$&``'0``B"4\`@``)$@`
+MD``1$$``4Q`AA$,```##$"H40``#E0(`!@!@,"4"(+@E`%$0(R1"__\P4O__
+M$D``#@`2$$`"8B`AA(/__H2"````0Q`J$$```I2%``"DA?_^)B(``3!1__^5
+M`@`&`B(0*Q1`_^@`$1!`/`(``)1"`)800``/``"()3P"``"41`"6`!$00`!3
+M$"&$0P```.,0*A!```,F(@`!`&`X)0(@\"4P4?__`B00*Q1`__8`$1!`),(`
+M&3P$4>LTA(4?`$0`&```&!```QD#``(7PP!B&",``Q!``$,0(0`"$,``0Q`A
+M``(40``"A`,``(@E`@0`&```(!``!"$#``(7PP""(",DA``!&(``$@``D"4\
+M`@``)$4`$```$!```A$#`!`?PP!#$",D1``!`B`8)28B``$P4?__``,80`!E
+M&"$F0@`!,%+__P)$$"H40/_WI'<``#P"``"40@"6``(00`)B$"&$0O_^`@(0
+M*A!``%```)`E/`(``"14`)`\`@`!)%<+V#P"```D5@`0)@(`,@`"%````H0#
+MEH(`!@`"$$`"8A`AA$+__@("$"H00``?`!(80``2$$``4Q`AA$,```(#&".$
+M0@`"`@(0(P!B`!@``!@2&&``%0`2&$`\`@``E$(`E@`"$$`"8A`AA$+__@("
+M("HF0@`!$(``"S!2__\`$A!``%,0(81#```"`Q@CA$(``@("$",`8@`8```8
+M$AQ@__4F0@`!`!(80`!S$"&410``E$8``@!U&"&49P````<X0)1B``(``A!`
+M,$+__Z^B`!"OH``4,@3__P+@^`DPY___)$(``3!"__\`$1A``'88(0`"$$*D
+M8@``,$+__P/"$"M40``!I'X``"8B``$P4?__EH(`!@`"$$`"8A`AA$+__@("
+M$"H40/^Y)@(`,BXB`$!00``.-!"A@#P"```D1``0`!$00`!$&"$`8!`EE$+_
+M_J1B```F(@`!,%'__RXB`$`40/_X`!$00#00H8```)`E/`(``"11`!`\`@``
+M)%,````2&(``<1`AE$(``@`"$@`T0@#_``(4``!Q&"&49@````8R`#3&`/\P
+MQO__CZ0`0`(`*"4"8/@)`$8P)29"``$P4O__+D(`(!1`_^TF$``$C[\`/(^^
+M`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@GO0!`)[W_
+MF*^_`&2OO@!@K[<`7*^V`%BOM0!4K[0`4*^S`$ROL@!(K[$`1*^P`$"OI`!H
+M`*"P)0#`F"4P_O__KZ0`+```D"4``+@E``"@)20"`#^OH@`PKZ``.(^C`'B`
+M8@`%``(00#!"__^OH@`TE&(``C!"`0`00``#``"H)1````.`AA*.CZ0`+("&
+M$H\\`@``)$(``(^D`&@`0/@)CZ4`>``"%@```A8#$L``0:^B`#R6P@``$$``
+M$@``@"4GI``8`!`80`"#&"$`$!#``%80(91"``"D8@``)@(``3!0__\N`@`(
+M$$``!P(`B"4`$!#``%80(91"```40/_R`!`80`(`B"6/I0!XE*0``">B`"JO
+MH@`0/`(``21"#10GI0`8`@`P)0!`^`DGIP`H$B``$```@"67HP`HEZ(`&!!B
+M``Z7H@`J)Z0`&"8"``$P4/__`A$0*U!```>7HP`H`!`00`""$"&40@``%&+_
+M^"8"``&7HP`HEZ(`*A1B``4`$!#`CZ8`>)3"```08@`%`!`0P`!6$"&,0@`$
+M$$``!0``````$!#``%80(91"``*OH@`P$\``#P``@"4GI``8`!`80`"#&"$`
+M$!"``%`0(0`"$$``4Q`AE$(`"*1B```F`@`!,%#__P(>$"L40/_U`!`80(^B
+M`'B41```)Z(`*J^B`!`\`@`!)$(-%">E`!@#P#`E`$#X"2>G`"@``(`E)Z,`
+M&)>E`"@0```"EZ0`*C!0__\"'A`K4$``#0``@"4`$!!``&(0(91"``!0H@`!
+M`@"0)0`0$$``8A`AE$(``!2"__,F`@`!`@"@)0``@"6/HP!XE&(``C!"`$`0
+M0``,+@(`!11``!4`$A"`)`(`!1("`!PD`@`&$@(`)20"``<6`@`YCZ4`>!``
+M`"T`$A"`+@(`"!!``#2/I0!X/`(``"1".H@`$!B``&(8(8QB````0``(````
+M```2$(``4A`A``(00`!3$"&45P`&`!00@`!4$"$``A!``%,0(1```"&450`&
+M`!(0@`!2$"$``A!``%,0(917``0`%!"``%00(0`"$$``4Q`A$```%I15``0`
+M$A"``%(0(0`"$$``4Q`AE%<``@`4$(``5!`A``(00`!3$"$0```+E%4``@`2
+M$(``4A`A``(00`!3$"&45P```!00@`!4$"$``A!``%,0(915``"/I0!XE*0`
+M`)>E`"B7I@`JK[4`$*^@`!0\`@`!)$(+V`!`^`D"X#@E`$`@)8^F`#``AA`K
+M$$```@#`&"4`@!@E,&3__X^C`'B48@`",$(`$!!```N/I0`LE*(2<"Q",`$4
+M0``(`!`00)2C$GXP8O__`((0*U1```$`@!@E,&3__P`0$$`\!@``),8```!&
+M*"&/H@`TCZ8`/`!&&",`@Q`J5$```0"`&"46```3I*,``#P#```D8SIXCZ0`
+M:(R"`@```A!``$,0(91#`````QA`/`4``"2E``"4H@```$,0(P`"%````A0#
+M'$```Z^B`#@D!@`!KZ8`.``0$$`\`P``)&,```!#*"&4I```CZ,`.`"#$"I4
+M0``!`(`8)28"``$P4/__+@(`"!1`_W"DHP``/`0``"2$``"4@@``CZ4`+*RB
+M+L0D!@`!,-$````1AX"4A@`&,,8`/P`&-@`"!C`E`!&E@`#4,"64@@`$,$(`
+M/P`"%```PC`E`!&;@`#3,"64@@`",$(`/P`"$@``PC`E`!&)@`#1,"64@@``
+M,$(`/SP2```F4@``CZ0`:#0%F30"0/@)`,(P)3P#```D8P``E&(`#C!"`#\`
+M`A8``@*`)0(4@"648@`,,$(`/P`"%``"`H`E`A.`)91B``HP0@`_``(2``("
+M@"4"$8`EE&8`"##&`#^/I`!H-`69.`)`^`D"!C`E/`(``"1"``"/I`!H/`8`
+M`"3&````0/@)E,4``#P#```D8P``E&(``(^D`&BD@@'^C[\`9(^^`&"/MP!<
+MC[8`6(^U`%2/M`!0C[,`3(^R`$B/L0!$C[``0`/@``@GO0!H)[W_J*^_`%"O
+MMP!,K[8`2*^U`$2OM`!`K[,`/*^R`#BOL0`TK[``,`#`J"4PE___,+;__SP"
+M``$D0@M(`N`@)0+`*"4`0/@))Z<`&!1``$R7H@`8EJ8`!">B`!ROH@`0/`(`
+M`21"#10"X"`ECJ4```!`^`DGIP`:EZ4`&B>B`""OH@`0/!```280#D0"P"`E
+M`J`P)0(`^`DGIP`>EZ4`'">B`"2OH@`0`L`@)0*@,"4"`/@))Z<`(B>S`"8\
+M$``!)A`+2)>D`!J7I0`>`J`P)0(`^`D"8#@E)[(`*)>D`!J7I0`@`J`P)0(`
+M^`D"0#@EEZ4`'I>F`""7IP`FEZ(`**^B`!"OH``4/!$``28Q"]@"(/@)`L`@
+M)0!`H"67I``<EZ4`(@*@,"4"`/@)`F`X)9>D`!R7I0`D`J`P)0(`^`D"0#@E
+MEZ4`(I>F`"27IP`FEZ(`**^B`!"OH``4`B#X"0+`("67I0`:EZ8`'*^B`!"O
+MH``4`N`@)0(@^`D"@#@EC[\`4(^W`$R/M@!(C[4`1(^T`$"/LP`\C[(`.(^Q
+M`#2/L``P`^``"">]`%@PA/__,*7__XS(``B4P@`$$$``'0``4"65`@``%$0`
+M%25"``$E"0`(E0(`!A!``!```!@E)0L`!I4B``!410`')&(``0`#$$``2Q`A
+ME$(`&*3B```#X``()`(``3!#__^5`@`&`&(0*Q1`__,E*0`")4(``3!*__^4
+MP@`$`4(0*Q1`_^4E"``T`^``"```$"6/J@`4,(3__S"E__\PQO__,.?__Y>H
+M`!(D"0!D`.@`&```&!(08`!#```0)55```$D"0`!$,4`-@"%$",``AA``&(8
+M(0`#&,``8A@A``,8@`#%$",`8@`:```8$E!```$`!P`-``,<```#)`,$@P`-
+M*((`91%```@`X!`E``<00`!'$"$``A#``$<0(0`"$(`0```",$+__S!"__\0
+M```D`$`8)11```T`B``8$4``"`$`$"4`"!!``$@0(0`"$,``2!`A``(0@!``
+M``(P0O__,$+__Q```!8`0!@E```8$B0"`&0`1!`C`$<`&```$!(`8A@A````
+M``!I`!H``!@242```0`'``T0```),&/__Q%```<`X!@E``,00`!#$"$``A#`
+M`$,0(0`"$(`P0___`&`0)0/@``@`````,,;__P`&$$``HA`AE$C__C"$__\`
+M!!!``$00(0`"$,``1!`A``(@@)2C`````Q!``$,0(0`"$,``0Q`A``(0@"1"
+M__8`@A`K$$``!H^J`!"4H@``I.(``)2B```#X``(I4(````($$``2!`A``(0
+MP`!($"$``A"`)$(`"@!$$"L00``,`````*3H```#X``(I4@``*3B``"5(@``
+M`^``"*5"``"DX@``E2(``@/@``BE0@``$,``'```0"4`"!!``$5((94C````
+M`Q!``$,0(0`"$,``0Q`A``(0@`!$$",D0@`)+$(`$U1`_^J5(@``E2,``@`#
+M$$``0Q`A``(0P`!#$"$``A"`)$+_]@""$"M40/_DE2(``"4(``$!!A`J%$#_
+MYP`($$`#X``(`````">]_^"OOP`8,(3__S"H__^,Q0`(E,(`!!!```P``!@E
+ME*(``%!(``J4I@`&E,8`!"1C``$`9A`J$$``!"2E`#24H@``%$C_^R1C``&4
+MI@`&CZ(`,*^B`!`\`@`!)$(-%`!`^`DDI0`(C[\`&`/@``@GO0`@/`4``"2E
+M.JB,HP`$K(,L$``#$,``0Q`C``(0@"2E``@`11`AK((L*"0"``&L@BPD)`(`
+M%*R"+!PD`@`C`^``"*R"+"",@A(TE$(``C!"`"`00``(``!`)20#`!PD!P!`
+M)`8`<JR@``PD`@!W$```"*RB`!`D`P`R```X)20&`#(D`@`4K*(`#"0"`".L
+MH@`0C*4`!`"H$"L`91@K`$,0)1!```8``"`E`*<0*P#%&"L`0Q`E5$```20$
+M``$#X``(`(`0)2>]_^BOOP`4K[``$`"`@"6.!B[$``8R0##&?@`\`@``)$(`
+M`#0%F3``0/@)-,:``"0"``&N`B[`C[\`%(^P`!`#X``()[T`&">]_^"OOP`<
+MK[(`&*^Q`!2OL``0`("`)0(`B"4F$BP0C@,L)!!@`"T``!`EC@,NP"0"``%4
+M8@`IC@(NP#P"```D0@```B`@)0!`^`DT!9DP`$`8)3!B@`!40``@C@(NP``#
+M%D*N0@`$K@`NP#P"``$D0@[\`B`@)0!`^`D"0"@E5$``%HX"+L`\`@`!)$(0
+MN`(@("4`0/@)`D`H)1!```X\`@`!)$(0Z`(@("4`0/@)`D`H)5A```F.`B[`
+M/`(``21"$J0"("`E`$#X"0)`*"4D`@`"K@(NP(X"+L"/OP`<C[(`&(^Q`!2/
+ML``0`^``"">]`"",HP`$C*(`#`!#$"L00``%```@)8RB`!``8A`K%$```@``
+M```D!``!`^``"`"`$"4`H#@EC.,`%!!@`&HD`O__C.0````$$,``1!`C``(0
+M@#P#```D8SJP`$,0(:SB`!B,X@`$C.,`$`!#$"M40``GC.,`!!"``%LD`O__
+MC.(`!*SB``B,XP`0`$,0*Q1``!T`8$`EC.(``!!``!H`````/`(``"1*.J@\
+M`@``)$DZL(SB```D1O__K.8````&(,``AB`C``0@@`"*$"&,Y0`8C$,`$(RB
+M``@`8A@C``,80(SB``@`0Q`CK.(`"`")("$`2!`K%$```ZSD`!A4P/_MC.(`
+M``/@``@D`@`!C.(`#`!#$"M40``S```0)3P"``",0SJH)&/__XSD```0@P`M
+M)`+__HSC``2LXP`(C.(`#`!`2"4`0Q`K%$``)``````\`@``C$,ZJ"1C__^,
+MX@```$`@)0!#$"L00``</`,```!@$"4D2SJH/`(``"1*.K",8CJH)$C__R2&
+M``&LY@````8@P`"&(",`!""``(L0(8SE`!B,0P`0C*(`"`!B&",``QA`C.(`
+M"`!#$".LX@`(`(H@(0$B$"L40``$K.0`&`#($"L40/_L`,`@)0/@``@D`@`"
+M`^``"`````",H@`4$$``#0````",H@`8E$(``*2"$]",H@`8E$(``J2"$\Z,
+MH@`8E$(`!*2"$\R,H@`8E$(`!J2"$\H#X``(`````">]_^"OOP`<K[(`&*^Q
+M`!2OL``0`("0)0"@B"4"0(`E/`(``"1"````0/@)-`6`!#!#__\D`@`!$B(`
+M'"HB``)00``%)`(`!A(@``V/OP`<$```(8^R`!@2(@`%)`(`"!(B`!*/OP`<
+M$```&X^R`!B.!B[(`&8P)1````0\`P"!C@8NR`!F,"4\`P!"/`(``"1"```"
+M0"`E-`6`!`!`^`D`PS`E$```"X^_`!R.!B[(`&8P)3P#`"`\`@``)$(```)`
+M("4T!8`$`$#X"0##,"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`
+M$#P"``$D0A+H`$#X"8R%`=R/OP`0`^``"">]`!@````````````````GO?_@
+MK[\`'*^R`!BOL0`4K[``$`"`D"4\`@``)$(```!`^`D`H(`E`$"()3P%?_\T
+MI?__/`(``"1"```"0"`E`$#X"0(E*"0\`@``)$(```)`("4`0/@))`4`,`!`
+M("4PA@/P$@``!@`&,0(D`@`E`$80(P`"$$(0```+`,(P(2S"``(00``(),;_
+M_SP"```D0@```D`@)0!`^`D"("@E$```$0``$"4D`_P/`(,8)``&,0`PQ@/P
+M/`(``"1"```"0"`E)`4`,`!`^`D`9C`E/`(``"1"```"0"`E`$#X"0(@*"4D
+M`@`!C[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_`!``H#@E`(!`)2CC
+M``H08``)```0)0`'*0``IR@C``4H@`$%*"$\`@``)$(```!`^`DDI2Q0C[\`
+M$`/@``@GO0`8)[W_Z*^_`!``P$`E`(`X)2BC``H08``*```0)0`%,0``Q3`C
+M``8P@`#F,"$\`@``)$(```$`*"4`0/@)),8L4(^_`!`#X``()[T`&">]_]BO
+MOP`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@)@E`*"()20"``(2(@`-`,"@)2XB
+M``,00``&)`(``R0"``$2(@`))`+__Q```#&/OP`D$B(`#"02``@0```()`+_
+M_Q````@D$@`)C((L5!!```4``)`E$```)0``$"40```DC[\`)``2$0``4A`C
+M``(0@`""@"$F$"Q0C@,`!!1@`!LD`O__/`(``"1"```"`"`E`$#X"20%`#P6
+M@``-KA$`!"0"``NN`@`,)`(``JX"`!0D`O__K@(`&"0"`_^N`@`<)`(`"J8"
+M`"`0```'I@(`(CP"```D0@```F`@)0)`*"4`0/@)`H`P)0)`$"6/OP`DC[0`
+M((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_^"OOP`<K[(`&*^Q`!2OL``0
+M`("`)8X"+#PP0@/_C@8L1``&-``\$@/_`-(P)#P1```F,0``)`4`I`(@^`D`
+M1C`EC@(L0#!"`_^.!BQ(``8T``#2,"0"`"`E)`4`J`(@^`D`1C`E/`(``"1"
+M```"`"`E`$#X"20%`*PD`_P``$,0)(X&+$PPQ@/_`@`@)20%`*P"(/@)`$8P
+M)8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_^BOOP`0`*`X)0"`,"4LXP`*
+M$&``(```$"4`!Q$``$<0(P`"$(``PB@A)*4L4(RC``008``8```0):R@``0D
+M`P`!`.,8!``#&">,PBP\`&(0)*S"+#R,PBQ``&(0)*S"+$",PBQ$`&(0)*S"
+M+$2,PBQ(`&(0)*S"+$B,PBQ,`&(8)#P"``$D0A;``$#X":S#+$PD`@`!C[\`
+M$`/@``@GO0`8)[W_T*^_`"ROM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0
+M`("H)0"@L"4"H*`ECJ02-"[#``H08`%7```0)0`6$0``5A`C``(0@`*"F"$F
+M<RQ0CF,`!!!@`4\D`@`!CF,`&"0"__]48@`3CF<`&!"```4D`P"@E((``C!"
+M`*`00P`")`0`'R0$``\D!P`!`.00*Q!```D`%H"```<00#1'``$`Y!`K%$#_
+M_0`'$$`0```"`!:`@``6@(`PYP/_CF(`'``"$H`\`P`/-&/\``!#$"0`XC@E
+MCF8`%``&-0`\`@_P`,(P)#P"```D40```J`@)28%$$`"(/@)`.8P)99F`"(`
+M!C$`,,8`\)9B`"`P0@`/`,(P)3P"``@T0B```J`@)28%$(`"(/@)`,(P)0*@
+M("4F!0G``B#X"20&"`".H@',+$(`!%!```:.8P`D`J`@)28%$0`"(/@)/`8!
+M`(YC`"008``:`!:`@#P"`/\T0O__`&(0)(YF`"@`!C8`/!$``"8Q```"H"`E
+M)@4(P`(@^`D`1C`E)A`)P#P"```D0@```J`@)0!`^`D"`"@E-$(``8YF`"@`
+M!C`K``8R``*@("4"`"@E`B#X"0#","6.8@`P$$``"P`6*(`\!@#_-,;__P!&
+M,"0\`P$`/`(``"1"```"H"`E)*4)``!`^`D`PS`ECF(`+!!``!@`%H"`/`8`
+M#S3&__\`1C`D/`,`$#P"```D40```J`@)28%$,`"(/@)`,,P)8YB``PP0@`@
+M$$``"B80"<`\`@``)$(```*@("4`0/@)`@`H)0*@("4"`"@E`B#X"31&`@".
+M8@`,/`,``0!#$"000``.`!:`@"80$0`\`@``)$(```*@("4`0/@)`@`H)3P&
+M`"`\`P``)&,```*@("4"`"@E`&#X"0!&,"6.8@`,/`,`@`!#$"000``-`!:`
+M@"80$0`\`@``)$(```*@("4`0/@)`@`H)3P#```D8P```J`@)0(`*"4`8/@)
+M-$8"`(YC``0D`@`"$&(`!20"``,08@`>`!:0@!```$6.8@`X`!:`@"80"<`\
+M`@``)$(```*@("4`0/@)`@`H)3P#```D8P```J`@)0(`*"4`8/@)-$8`HHZB
+M`<PL0@`$$$```CP#`"4\`P$E`!8H@#P"```D0@```J`@)22E$0``0/@)`&`P
+M)1```"J.8@`X)E$)P#P"```D0@```J`@)0!`^`D"("@E/!```"80```"H"`E
+M`B`H)0(`^`DT1@)B/`(``#P#``",0@``C&,```!#$"..@R[,`&(8(SP"``",
+M0@```&(8(P`#&H`\!@$``J`@)29%"0`"`/@)`&8P)8ZB`<PL0@`$$$```CP#
+M``0\`P$$`!8H@#P"```D0@```J`@)22E"<``0/@)`&`P)8YB`#@P0@`!$$``
+M#@`6@(`F$!$`/`(``"1"```"H"`E`$#X"0(`*"4\!@`D/`,``"1C```"H"`E
+M`@`H)0!@^`D`1C`ECF(`##!"``$00``&)`(``0+"$`2.@RP\`$,0)1````:N
+M@BP\`L(0!``"$">.@RP\`$,0)*Z"+#R.8@`,,$(``1!```8D`@`!`L(0!(Z#
+M+$``0Q`E$```!JZ"+$`"PA`$``(0)XZ#+$``0Q`DKH(L0(YB``PP0@`"$$``
+M!B0"``$"PA`$CH,L1`!#$"40```&KH(L1`+"$`0``A`GCH,L1`!#$"2N@BQ$
+MCF(`##!"``000``&)`(``0+"$`2.@RQ(`$,0)1````:N@BQ(`L(0!``"$">.
+M@RQ(`$,0)*Z"+$B.8@`,,$(`"!!```8D`@`!`L(0!(Z#+$P`0Q`E$```!JZ"
+M+$P"PA`$``(0)XZ#+$P`0Q`DKH(L3#P"``$D0A;``J`@)0!`^`D"8"@E)`(`
+M`8^_`"R/M@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#`GO?_H
+MK[\`$``%*(`\`@``)$(```!`^`DDI0@`C[\`$`/@``@GO0`8)[W_Z*^_`!``
+M!2B`/`(``"1"````0/@))*4(`"0"``&/OP`0`^``"">]`!@GO?_HK[\`$"0&
+M``$`IC`$/`(``"1"````0/@))`4(0"0"``&/OP`0`^``"">]`!@GO?_8K[\`
+M(*^S`!ROL@`8K[$`%*^P`!``@)@E`*"0)0`2*(`\`@``)%$```(@^`DDI0H`
+M,%```U8```H"`!`E`F`@)0(@^`DD!0A`)`,``0)#&`0`0Q`D5$```200``$"
+M`!`EC[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_]BOOP`DK[0`(*^S
+M`!ROL@`8K[$`%*^P`!``@)`E`*"()20&``$\`@``)$(``"0%"(``0/@)`B8P
+M!```@"4\`@``)%0``#P"```0```$)%,```)@^`DD!``*)A```2H")Q`00``&
+M/`(```)`("4"@/@)`B`H)11`__8\`@``)$(```)`("4D!0B``$#X"0``,"4J
+M`B<0C[\`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"B/H@`8CZ<`((^C
+M`"2/I``H,,8/_P`"%(``PC`E``,>0#""``$00``#`,,P)3P"`0``PC`E``01
+M`C!"``$``A=``$80)0`$&((P8P`!``,=@`!B&"4`!!%",$(``0`"%<``0Q`E
+MJ*(`"+BB``N/HP`0``,>@``$$$(P0@`!``(5P`!#$"6HH@`,N*(`#R0"__\0
+MX@`//`,`#XBD``R8I``/``<30#1CX```0Q`D`((@):BD``RXI``/B*(`")BB
+M``L\`T```$,0):BB``BXH@`+`^``""0"``$#X``(```0)8BB``B8H@`+/`,@
+M``!#$"6HH@`(N*(`"P/@``@`````$.``"X^B`!"(HP`,F*,`#RQ"``$``A,`
+M`&88)0!#$"6HH@`,N*(`#Q```!``````4$``"C3"$`"/H@`4B$,`")A#``NH
+MHP`(N*,`"ZBF``RXI@`/$```!0!@$"6HH``(N*``"ZBB``RXH@`/J*``%+B@
+M`!>(H@`4F*(`%ZBB`!"XH@`3`^``""0"``&(HP`4F*,`%S!C``$08`!+)`(`
+M#XBB`!28H@`7,$(?_@`"$$*DP@``B*(`$)BB`!,``A0"I,(``J#```2(H@`0
+MF*(`$S!"``$40``7`````(BB`!"8H@`3,$(``A!```(D`@`!H,(`!(BB`!"8
+MH@`3,$(`"!!```0`````D,(`!#1"``*@P@`$B*(`$)BB`!,P0@`$$$``!```
+M``"0P@`$-$(`!*#"``2(H@`(F*(`"P`"%((P0@`/H,(`!8BB`!28H@`7``(3
+M0J#"``:(H@`0F*(`$S!"#P```AH"H,,`!XBB`!"8H@`3,$(`\``"$0*@P@`(
+MB*(`$)BB`!,P0O````(3`J#"``F@P``*,&(`_Q!```.@P``+)&(``:#"``>0
+MP@`(4$``!0``$"60P@`()$(``:#"``@``!`E`^``"``````#X``(````````
+M``"0@BZ\-$(`"*""+KR0H@`$-$(`"*"B``24@BZZI*(``)""+KR@H@`$D((N
+MO:"B``4#X``(```0)0``````````)[W_X*^_`!BOL0`4K[``$`"`B"4\$```
+M)A```"0%0(`\!I)(`@#X"33&_``"("`E)`5`@#P&))("`/@)-,9))`(@("4D
+M!4"`/`8H``(`^`DTQ@`Y`B`@)20%0(`\!E,6`@#X"33&""0"("`E)`5`@#P&
+MY9@"`/@)-,8%>0(@("4D!4"`/`8`'0(`^`DTQN__`B`@)20%0(`\!AJJ`@#X
+M"33&OD`"("`E)`5`@#P&OA`"`/@)-,955`(@("4D!4"`/`8`#@(`^`DTQC`'
+M`B`@)20%0(0"`/@)```P)8^_`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_`!RO
+ML@`8K[$`%*^P`!``@(@E/`(``"1"```T!9C0`$#X"20&'!8``(`E/`(``"12
+M```"("`E-`68@`)`^`D\!@`!)A```2H"``@40/_Z`B`@)3P"```D0@```$#X
+M"30%G````AX"``,A`C!C``\``QD`/`(``"1"````@R`E`$#X"20%``B/OP`<
+MC[(`&(^Q`!2/L``0`^``"">]`"`GO?^(K[\`<`"`8"4!@#@E)`+_R:^B`!"O
+MH@`4KZ(`&*^B`!PD`O_"KZ(`("0"__*OH@`HKZ(`+*^B`#"OH@`T)`+_]*^B
+M`#@D`O_`KZ(`0*^B`$2OH@!(KZ(`3"0"_[JOH@!0)`+_LJ^B`%BOH@!<KZ(`
+M8*^B`&0D`O^PKZ(`:```*"4GJP`0).8`!">J`"@GJ0!`)Z@`6``%&(``9R`A
+M`6,0(8Q"``"L@D8H`&8@(0%#$"&,0@``K()&.`!G("$!(Q`AC$(``*R"1E``
+M9B`A`0,8(8QB``"L@D9@)*4``2BB``540/_M``48@#P"```D0@```8`@)0!`
+M^`DD!0`!C[\`<`/@``@GO0!X``4H0`"F*"$`!2A``*0H(0/@``B4HA7^)[W_
+MT*^_`"BOM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@(`E`,"0)0#@F"6/M`!`
+M,+7__SP1```F,0``/`4``"2E.]`"(/@))`82<*X2``RN$P`0KA0`%*85`<BF
+M``'*)`(`/Z8"`?RN``(`K@`OO*X`+\`\`@@`K@(OS"0"!X&N`B_4K@`OW#P"
+M`#\T0C\_K@(OX"0"`&2N`B_D)`(``JX"+^@D`O__K@(O^*X"+_RN`C``)@0L
+M/#P%```DI4Y0`B#X"20&``:B`#`$C[\`*(^U`"2/M``@C[,`'(^R`!B/L0`4
+MC[``$`/@``@GO0`P,(0`_S"E`/\``#`E/`(``"1)3E@\`@``)$A.63P"```D
+M1TY:``800`!&&"$`:1`AD$(``%1$``PDQ@`!`&@0(9!"````HA`K5$``!R3&
+M``$`9Q`AD$,```!E&"L08``&)`(``23&``$LP@`$5$#_[@`&$$```!`E`^``
+M"``````GO?_`K[\`/*^V`#BOM0`TK[0`,*^S`"ROL@`HK[$`)*^P`"``H)`E
+M`,"8)0#@B"6/M@!0,)#__SP"```D0@```$#X"20$1J@`0*`E5H``!*^Q`!`D
+M`P`"$``"'*[#``"OM@`4/`(``"1"```"@"`E`@`H)0)`,"4`0/@)`F`X)0*`
+MD"4\`@``)$(```*`("4``"@E`$#X"20&``$40``$/`(``"0"``,0``'_KZ(`
+M'"1"```"0"`E`$#X"20%0"`P0P#_``,9`JY#`<PP0@`/ID(!T#P"``$D0B98
+MDD0!SP!`^`F210'1%$``!#P"```D`@`-$``![*^B`!PD0@```D`@)0!`^`D`
+M`"@E%$``!#P"```D`@`#$``!XZ^B`!PD0@```D`@)0!`^`DT!9@8ID(!THY#
+M`<PD`@`)$&(`!R0"``H48@`*/`(``)9"`=`L0@`$$$``!CP"```\`@`!)$(B
+ML`!`^`D"0"`E/`(``"1"````0/@)`D`@)51```2.0@',)`(`#A```<>OH@`<
+M+$(`!11```T\`@``/`(``"1"```"0"`E`$#X"20%0!`\`P``)&,```)`("4D
+M!4`0`&#X"31&$``\`@``)$(```)`("4T!9@``$#X"20&``<\`@``)$(```!`
+M^`D"0"`EID(!U#!#`/`D`@`P$&(`.BAB`#$00``()`(`8"0"`!`08@`U)`(`
+M(%!B`#2.0P',$```#99"`=008@`O*&(`81!```8D`@"@)`(`4%!B`"N.0P',
+M$```!)9"`=108@`GCD,!S)9"`=040``DCD,!S"0"``548@`)CD(!S(Y#`=`\
+M`@`)-$(`0U1B``2.0@',)`(`1A```!BF0@'4.$,`!RQC``$X0@`++$(``0!B
+M&"408``#)`(`41````^F0@'4CD,!S"0$``H09``))`(`"1!B``@D`@!B%&0`
+M#"0"``F60@'0+$(`!!!```4D`@`*)`(`8J9"`=2.0P',)`(`"A!B`!<D`@`)
+MCD,!S!!B`!0D`@`*5&(`!I9#`=260@'0+$(`!!1```\\`@``ED,!U#!B`/`D
+M0O_0+$(`0!!```D\`@``,&(`#RQ"``400``%/`(``"0"``T0``%7KZ(`'#P"
+M```D0@```D`@)20%`,$`0/@))Z8`&!1```27H@`8)`(`"!```4ROH@`<+$(P
+M`A!```27H@`8)`(`!1```4:OH@`<IH(2<#P"```D0@```D`@)0!`^`DD!4`0
+M,$,`&``#&,(D`@`"$&(`$B0"``-48@`$CD,!S"0"``H0``$VKZ(`'"0"``D0
+M8@`*)`(`"E1B`3&OH@`<ED(!T"Q"``040``%/`(``"0"``H0``$JKZ(`'#P"
+M```D0@```D`@)20%`#\`0/@))Z8`&!1```27H@`8)`(`"!```1^OH@`<IH(2
+M<CP"```D0@```D`@)20%`!P`0/@))Z8`&!1```27H@`8)`(`"!```1.OH@`<
+M$$``$9>B`!@P4?_P`!&+`#P"```D0@```D`@)20%`!L`0/@))Z8`&!1```27
+MH@`8)`(`"!```02OH@`<`B*()1````(F,?]`)!$#0```@"42(``.``"8)3P"
+M```D50```D`@)28%`,`"H/@))Z8`&!!``/.7H@`8`F*8)B80``$"$1`K%$#_
+M]P)`("4T`O__$F(``R0"``<0``#KKZ(`'"0"``JF@A/F)`(``Z:"%?```(`E
+M)H,`!B0$``L`$!!``%`0(0`"$(``4!`A``(0@`!#$"&D1!/H)A```2X"``H4
+M0/_W`!`00```@"4\`@``)$I.0":(``(\`@``)$E.2":'``PD!0`+)H8`"``0
+M$$``5"`A`$H8(91C``"D@Q7X`$@@(0!)&"&48P``I(,5\`!0$"$``A"``%`0
+M(0`"$(``1Q@AI&46J`!&$"&D1180)A```2X"``,40/_M`!`00#P"```D0@``
+M`D`@)0!`^`DFA1)P5$``!):"$G`D`@`($```L:^B`!PL0E`#4$``%9:"$HJ.
+M0P',)`0`"A!D``DD`@`)$&(`""0"!FA49``-EH(2BI9"`=`L0@`$4$``"9:"
+M$HHD`@9HIH(6`"0"!+"F@A8$-`*``*:"%@BF@A7^EH(2BA!``"$D`P`0ED(!
+MU#!"`/!40P`>/`(``#P1```F,0```D`@)30%F``"(/@))`9`!SP0```F$```
+M`@#X"20$!]`\`@``)$(```!`^`D"0"`EID(!U@)`("4T!9@``B#X"20&``<"
+M`/@))`0'T)9"`=8P0@#P)`,`(!!#``,D`@`-$```>*^B`!P\`@``)$(```)`
+M("4D!0"_`$#X"2>F`!@40``$EZ(`&"0"``@0``!MKZ(`'*:"$G2F0@((/`(`
+M`"1"````0/@)`D`@)51```2.0P',)`(`"!```&*OH@`<)`0`"A!D``DD`@`)
+M$&(`"#P"``!49``,CD(!S)9"`=`L0@`$4$``"(Y"`<P\`@``)$(```)`("4`
+M0/@))Z4`'!```!\`````.$,`!RQC``$X0@`++$(``0!B&"408``'/`(``"1"
+M```"0"`E`$#X"2>E`!P0```2`````)9"`=0P0@#P)$+_T"Q"`$`00``(/`(`
+M`#P"```D0@```D`@)0!`^`DGI0`<$```!0`````D0@```D`@)0!`^`DGI0`<
+M$$``,`````".@BS$KD(!P#P"```D0@```$#X"0)`("4``)@E``"`)205`!\\
+M`@``)%$```)`("4"L"@C`B#X"2>F`!@00``=EZ(`&`)BF"$`$!A``'0@(0`"
+M$@*@@BPP`(`8)9.B`!F@8BPQ)A```2X"``-40/_P`D`@)2YC``$\`@`"-$+_
+M_0)B$"8L0@`!`&(8)1!@``0\`@`!)`(`"1````BOH@`<)$(D1`!`^`D"0"`E
+M$```#`)`$"4D`@`(KZ(`'!*```0\`@``)$(```!`^`D"@"`E$L```H^B`!RN
+MP@`````0)8^_`#R/M@`XC[4`-(^T`#"/LP`LC[(`*(^Q`"2/L``@`^``"">]
+M`$`GO?_HK[\`%*^P`!`\`@``)$(```!`^`D`@(`EC@(LJ%!```0\`@```$#X
+M"0(`("4\`@``)$(```!`^`D"`"`E/`(``"1"```"`"`E)`4``0!`^`DD!@`!
+M/`(``"1"```"`"`E`$#X"28%$G`\`@``)$(```!`^`D"`"`EC[\`%(^P`!`#
+MX``()[T`&">]_Z"OOP!<K[X`6*^W`%2OM@!0K[4`3*^T`$BOLP!$K[(`0*^Q
+M`#ROL``X`("@)30"@`"OH@`0-`*8(*^B`!0\`E55-$)55:^B`"`\`JJJ-$*J
+MJJ^B`"0\`F9F-$)F9J^B`"@\`IF9-$*9F:^B`"P``+@E)Z(`$*^B`#`GO@`8
+M`!>`@(^C`#``<!`AC%(```*`("4\`P``)&,```!@^`D"0"@E`]"`(:X"````
+M`(@E`!$4``!1@"4"@"`E`D`H)3P"```D0@```$#X"0(`,"4"@"`E/`,``"1C
+M````8/@)`D`H)1!0``,F,0`!$```+@``$"4J(@$`%$#_[@`1%````(@E)[,`
+M(#P"```D5@``/`(``"15````$1"``F(0(8Q0```"@"`E`D`H)0+`^`D"`#`E
+M`H`@)0*@^`D"0"@E$@(``R8Q``$0```7```0)2HB``040/_Q`!$0@``7$("/
+MI``P`((8(0/"$"$"@"`EC$8``#P"```D0@```$#X"8QE```F]P`!*N(``A1`
+M_[T`%X"`/`(``"1"````0/@))`0`9"0"``&/OP!<C[X`6(^W`%2/M@!0C[4`
+M3(^T`$B/LP!$C[(`0(^Q`#R/L``X`^``"">]`&`PI?__,*(!`!!```8D`A,S
+MI,(``"0"%]2DX@```^``""0"``$PH@"`$$``#0````"4@A**%$``!20""0B4
+M@A*,$$``!P`````D`@D(I,(``"0""JRDX@```^``""0"``$#X``(```0)2>]
+M_]"OOP`HK[,`)*^R`""OL0`<K[``&`"`D"4"0)@E`D"():>@`!"60A)P+$)0
+M`11```<F4`'@CD(!H"0%`,D`0/@))Z8`$!!``4:/OP`HED(!U#!"`/`D`P!`
+M4$,``:9@$H:7H@`05$``#XXC`=R.0P',)`(`!U1B``N.(P'<ED,!T"0"``A4
+M8@`'CB,!W"0"``6GH@`0)`(``:9B$G:F8A)XCB,!W"0"``808@`1)`)P998C
+M`<I48@`/K@``!)8C`@@D8O^<+$(``E!```26(P(()&(`!1````:F(@(()`(`
+M051B``2N```$)`(`0Z8B`@BN```$EF(2AA!```<D`@`!K@(`!)9B$G940``$
+MEF(2BB0"``.N`@`$EF(2BE!```668A*,C@(`!#1"``2N`@`$EF(2C!!```PD
+M`@X1EB,!RA!B``HD`@D(C@,`!#1B``BN`@`$EF(2>!1```0D`@D(-&(`**X"
+M``0D`@D(I@(`$)9"`=0P0@#P)$+_T"Q"`$`40``5)`()Q(Y$`<PX@P`'+&,`
+M`3B"``LL0@`!`&(8)11@``TD`@G$)`,`"A"#``DD`@`)$((`""0""<04@P`(
+M)`(*K)9"`=`L0@`$$$``!"0""JPD`@G$$````J8"`!*F`@`2)`(3,Z8"``PD
+M`A?4I@(`#HX"```\`__]-&/__P!#$"0\`P`!`$,0):X"``"7H@`0,$(``A1`
+M``T``"`ECD,!S"QB``900``))`0``20"``448@`'``04@)9"`=`L0@`$%$``
+M`P`$%(`D!``!``04@(X$````1!`F/`,`!`!#$"0`@B`F/`+_WS1"__\`@B`D
+M/`(`$`""("67H@`0``(00CA"``$P0@`!``(5@`!$$"8\`P!``$,0)`""(":N
+M!```CD(!S"Q"``=40``%C@(``#P"``@`@A`E$```!:X"```\`__W-&/__P!#
+M$"2N`@``C@(``#P#@```0Q`E/`-```!#$"6N`@``EB(!T"Q"``(00``&EZ(`
+M$(Y#`<PD`@`+5&(`+8X"``"7H@`0,$(``11```4``!@EC@(`!#!"``E40``!
+M)`,``0`#%T".!````$00)CP#(```0Q`D`((@)I>B`!```A#".$(``3!"``$`
+M`A<``$00)CP#$```0Q`D`((@)JX$``"7H@`0,$(`!!1```4``!@EC@(`!#!"
+M``E40``!)`,``0`#'L".`@```&(8)CP$"```9!@D`$,0)CP#!```0Q`E/`,!
+M``!#$"6N`@``C@(``#P#_?\T8___`$,0)*X"``".8A,X$$``!```&"6.8A,\
+M%$```P`#%<`D`P`!``,5P(X#````0Q`F/`0`@`!$$"0`8A@F-&/P`*X#``".
+M(P',)`(`!51B``:.(@',EB,!T"0"``A08@`&C@(``(XB`<PL0@`&%$``!9>B
+M`!".`@``-$((`*X"``"7H@`0,$(!\!!```,``A$"$````Z8"``@D`@`*I@(`
+M")>B`!`P0O``$$``!0`"&P(D`@`!`&(0!!````.F`@`*)`(`@*8"``J60@'4
+M,$(`\"1"_]`L0@!`$$``!(X"```T0@8`$```!JX"```D`_O_`$,0)"0#_?\`
+M0Q`DK@(``)9B$GH00``+`D`@)8Y"`:`D!0`/`$#X"28F$D@00``%)`(``:XB
+M$DR.`@``-$(!`*X"``".0@',+$(`!:XB$FB.0P',)`(`!11B``4``"`EED,!
+MT"0"``E08@`&)`0``8Y"`<PL0@`&%$```P`$$<`D!``!``01P(X#````0Q`F
+M,$(`@`!B&":N`P``)`(`#ZX"`!0D`@`!C[\`*(^S`"2/L@`@C[$`'(^P`!@#
+MX``()[T`,">]_^"OOP`8/`(``"1"````0/@))Z4`$"0"``&/OP`8`^``"">]
+M`"`D`@`!%*(`!3P"``$\`@``)$(```/@``BL@@!P)$(X%`/@``BL@@!P````
+M````````````)[W_V*^_`"2OL@`@K[$`'*^P`!@`@(`E`*"0)3P"```D40``
+M-`6`*`(@^`F.1@`$`@`@)30%@"P"(/@)CD8`#`(`("4T!8`P`B#X"8Y&`!`"
+M`"`E-`6`-`(@^`F.1@`(CD(``#P#`0``0Q`D$$``#CP"```D0@```@`@)0!`
+M^`DGI0`0C@(2-```("4``"@EK$0`**Q%`"P"`"`E-`6`(`(@^`D\!@$`/`(`
+M`"1"```"`"`E-`6`(`!`^`F.1@``C[\`)(^R`""/L0`<C[``&`/@``@GO0`H
+M)[W_T*^_`"BOI0`4C(,!W"0"``$08@`)-`+__Q!@``T\`@``)`(`!A!B``DD
+M`@`(%&(`$B2B``$T`O__KZ(`'#P"``<T0O__$```"Z^B`"`\`@``C$(```"B
+M$",``A#`KZ(`'#P"``",0@```*(0(P`"$,"OH@`@)*(``:^B`!@\`@&`-$+_
+M_P#"$"2OH@`0/`(``"1"````0/@))Z4`$(^_`"@#X``()[T`,">]_^"OOP`8
+MK[$`%*^P`!``@(@E/!```"80```T!8`H`@#X"0``,"4\`@``)$(```(@("4`
+M0/@)-`6`!#P#``0`0Q`E/`;_SS3&__\"("`E-`6`!`(`^`D`1C`D`B`@)30%
+M@"`"`/@)-`;__X^_`!B/L0`4C[``$`/@``@GO0`@)[W_T*^_`"BOM0`DK[0`
+M(*^S`!ROL@`8K[$`%*^P`!``@*`E`*"()98B`!(00``;`H"0)3P"```D0@``
+M`$#X"30%@`0\!@`0/!```"80```"@"`E-`6`!`(`^`D`1C`E`H`@)30%@"0"
+M`/@)EB8`$`*`("4T!8`X`@#X"98F`!*.)@`4`H`@)30%@#`"`/@)``8PP!``
+M``\\`@``/`(``"1"```"@"`E`$#X"30%@`0\!O_O-,;__SP#```D8P```H`@
+M)30%@`0`8/@)`$8P)#P"```D0@```H`@)30%@"@`0/@)CB8``#P"```D0@``
+M`H`@)0!`^`DT!8`@/`/_@`!#$"26(P`*`$,P)98B`!@00``%)$(`!``"%``\
+M`P!_`$,0)`#","4\$```)A````*`("4"`/@)-`6`((Y&+]0\`O__-$(`_P#"
+M,"26(@`:``(2`#!"_P``PC`EKD8OU`*`("4"`/@)-`6`&)8S``J.(P`<`F,0
+M*U1```$`8)@ECC(`#(XC`!P"0Q`K5$```0!@D"56<@`"CC4``(XU``2.)@`$
+M),;__0`&,,`\$0`'-C'__P#1,"0\`@H8/!```"80```"@"`E-`6`U`(`^`D`
+MPC`E)J;__0`&,,``T3`D/`(*``*`("4T!8#8`@#X"0#","4R8O__`!(T``*`
+M("4T!8#<`@#X"0!&,"6/OP`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``
+M"">]`#`````````````````GO?_@K[\`'*^R`!BOL0`4K[``$`"`B"4`H!`E
+M`,"0)3P0```F$```)`5@``(`^`D`0#`E`B`@)20%8`@"`/@))`8``3P"```D
+M0@```B`@)20%8`PD!@`#`$#X"20'``(00``'`B`@)3P"```D0@```$#X"20%
+M8`2F0@``)`(``8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(```````````)[W_
+MX*^_`!BOL0`4K[``$`"`B"4`H(`E/`(``"1"````0/@))`5`%``0@$`D!@`#
+M`@8P!#P#```D8P```B`@)20%0!0`8/@)`$8P)20"``&/OP`8C[$`%(^P`!`#
+MX``()[T`(">]_^"OOP`8K[$`%*^P`!``@(@E`*"`)3P"```D0@```$#X"20%
+M0!0`$(!`)`8``P(&,`0`!C`G/`,``"1C```"("`E)`5`%`!@^`D`1C`D)`(`
+M`8^_`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_`!ROL@`8K[$`%*^P`!``@)`E
+M`*"()0#`@"4\`@``)$(```!`^`DD!4`8)`,``0(C&`0``Q@G`$,0)#(0``$"
+M,(`$/`,``"1C```"0"`E)`5`&`!@^`D`4#`E)`(``8^_`!R/L@`8C[$`%(^P
+M`!`#X``()[T`(">]_^BOOP`4K[``$`"@@"4N`@`&$$``""0"__\\`@``)$(`
+M``!`^`DD!4`<,$(`+P("$`8P0@`!C[\`%(^P`!`#X``()[T`&">]_^"OOP`<
+MK[(`&*^Q`!2OL``0`("0)0"@@"4`P(@E/`(``"1"````0/@))`5`%``0&$`D
+M!``#`&0@!#P#``$T8_```&08)P!#,"0`$(,``-`P)1(@``,TQH``/`(``0#"
+M,"4\`@``)$(```)`("4`0/@))`5`%(Y#+$0\!0$`/`(``"1"```"0"`E`$#X
+M"0!E*"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"``````)[W_Z*^_`!`\`@``
+M)$(```!`^`DD!4`(.$(``2Q"``&/OP`0`^``"">]`!@GO?_0K[\`+*^V`"BO
+MM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@)@E`*"@)0``J"4"8+`E/`(``"10
+M```"`/@))`4`@#P#`(``0Q`D$$``%@)@("4"`/@))`4`C`!`&"4\`@$``&(0
+M)%1```$\%0`@/`(@``!B$"000``"/`(`0`*BJ"4\`@0``&(0)!!```(\`@"`
+M`J*H)3P$`@``9!`D5$```0*DJ"4\`@``)$(```)@("4`0/@))`4`P`!`D"4D
+M`O__5D(`!#P"`06N@```$```4P``$"4T0MBZ`D(8)#P"``@"0A`D$$``!*Z#
+M```\`D```&(0):Z"```R0@`%$$``!3)"!<".@@``-$(``:Z"```R0@7`$$``
+M&CP0``".@@``-$(`0*Z"```F$````F`@)0(`^`DD!0#$,$0#_X[#1J``@R`E
+M/!$#_P!1$"0``A0"`$00):["1J`"8"`E`@#X"20%`,@P1`/_CL-&H`"#("4`
+M41`D``(4`@!$$"6NPD:@,D(`(%!```B.@@``CF(2:!!```0\`T``CH(```!#
+M$"6N@@``CH(```*B$"6N@@``/`-```!#$"000``7/!```*YR$E`F$````F`@
+M)0(`^`DD!0#$KF(25`)@("4"`/@))`4`R*YB$E@"8"`E`@#X"20%`,RN8A)<
+M`F`@)0(`^`DD!0#0KF(28`)@("4"`/@))`4`U*YB$F0D`@`!C[\`+(^V`"B/
+MM0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`,`/@``B,@BQ$)[W_T*^_
+M`"BOM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@*`E`*"()8Z5+$0&H0`+`H"8
+M)3P"```D0@``)`4`)`!`^`D``#`E/`(``"1"```"@"`E`$#X"20%`"0\`@$%
+M-$+8N@(B,"0R(@!`$$``#0``@"6.8BS,5$```33&`$".8BS05$```33&`0".
+M8BS45$```33&`(".8BS85$```33&!``R(@`!5$```33&``<\`@+@`B(0)!!`
+M`!4\`@"``,(P)3P"`"`"(A`D$$```CP"`0`"`H`E/`(`0`(B$"000``"/`(@
+M``("@"4\`@"``B(0)!!```(\`@0``@*`)3P#`@`"(Q`D5$```0(#@"4\`D``
+M`B(0)!!```(\`@`(`,(P)3P"```D4@```H`@)0)`^`DD!0"@/`(``"1"```"
+M@"`E`$#X"20%`*P\`TC_-&/__P!#$"0"@"`E)`4`K`)`^`D`4#`E!B$`!:YQ
+M+$0"@"`E)`4`)`)`^`DD!@`!`J`0)8^_`"B/M0`DC[0`((^S`!R/L@`8C[$`
+M%(^P`!`#X``()[T`,`````````````````/@``B4@@'J)[W_Z*^_`!`PH___
+ME((!Z@!B$"L00``+```0)0`#&4`T!8@</`(``"1"````0/@)`&4H(3!#@``4
+M8``")`(``0``$"6/OP`0`^``"">]`!@GO?_(K[\`-*^^`#"OMP`LK[8`**^U
+M`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`F"4PM?__EF,!Z@*C&"L08`!.```0
+M)0`5@4`T$8@4`A&((3P"```D0@```$#X"0(@*"4`0)`E/`(``"14```"8"`E
+M-`*(``("*"$"@/@)```P)30>B`0"8"`E`AXH(0*`^`D``#`E-!>("`)@("4"
+M%R@A`H#X"0``,"4T%H@,`F`@)0(6*"$"@/@)```P)30%B!`"8"`E`@4H(0*`
+M^`D``#`E`F`@)0(@*"4"@/@))`8`!S0%B!@"8"`E`@4H(0*`^`D``#`E-`6(
+M'`)@("4"!2@A`H#X"0``,"4D`@`$%D(`&B0"``&.8B_,/`,(``!#$"000``4
+M)K``0#(0__\`$(%``F`@)30"B``"`B@A`H#X"0``,"4"8"`E`AXH(0*`^`D`
+M`#`E`F`@)0(7*"$"@/@)```P)0)@("4"%B@A`H#X"0``,"4D`@`!C[\`-(^^
+M`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`X)[W_
+MV*^_`""OLP`<K[(`&*^Q`!2OL``0`("8)0#`("4PI?__EF,!Z@"C&"L08``D
+M```0)5"``!0``)`ED)(`!0`2D@"0@@`$`D*0)9"&``,`!C8`D((``@`"%```
+MPC`ED((``0`"$@``PC`ED((```#","4`!C!"`!(7P`#","40```"`!*00@``
+M,"4`!8E`-`6(&#P0```F$````F`@)0(`^`D")2@A-`6('`)@("4")2@A`@#X
+M"39&@``D`@`!C[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_["OOP!,
+MK[X`2*^W`$2OM@!`K[4`/*^T`#BOLP`TK[(`,*^Q`"ROL``H`("P)0#`D"6O
+MIP!<CZ(`8#"E__^OI0`0K[8`%";%`>`L1``!``0@(SP"554T0E56`((@)`""
+M(".6PP'JCZ(`$`!#&"L08`$I```0)9)#```L8@`&$$`!)0``$"4\`@``)$).
+M<``#&(``8A@AC&(```!```@`````$```*"07``6,HP``/`(`!`!B&"008`$7
+M```0)1```"$D%P`&CL(OS#P#"```0Q`D$$``'"07``2/HP`0)&(`0)2C``H`
+M0Q`J5$``%Y)>``00``$(```0)99#``(L8P`%%&`!!```$"660@`"+$(`!A1`
+M``P``+@EED(``BQ"``XL5P`!`!>X(S+W``(0```%)O<``1````,D%P`'$```
+M]0``$"627@`$DD(`!0`"$@`#PO`EDD(`!@`"%``#PO`EDD(`!P`"%@`#PO`E
+M`\3P)I)#``B20@`)``(2``!B$"4`1!`F,$+__Z^B`!B25``*DD(`"P`"$@`"
+M@J`EDD(`#``"%``"@J`EDD(`#0`"%@`"@J`E`H2@)I)#``Z20@`/``(2``!B
+MJ"4"I*@F,K7__Y)3`!"20@`1``(2``)BF"620@`2``(4``)BF"620@`3``(6
+M``)BF"660@`"+$(`#A!```("9)@F,G,`_R0"``06X@"8CZ(`$(["+\P\`P@`
+M`$,0)!!``)*/HP`0)&(`0#!"__^OH@`<``.)0#0%B``\$```)A````+`("4"
+M)2@A`@#X"0`>,"<T!8@$`L`@)0(E*"&/H@`8`@#X"0`","<T!8@(`L`@)0(E
+M*"$"`/@)`H`P)30%B`P"P"`E`B4H(0(`^`D"H#`E-`6($`+`("4")2@A`@#X
+M"0)@,"4T!8@4`L`@)0(E*"$"`/@))`8`!#P"```D0@```L`@)8^E`!``0/@)
+MCZ8`7))&`!220@`5``(2``#","620@`6``(4``#","620@`7``(6``#","62
+M50`8DD(`&0`"$@`"HJ@EDD(`&@`"%``"HJ@EDD(`&P`"%@`"HJ@ECZ,`%(QB
+M+]`P0@`$4$``%0``H"620P`>DD(`'P`"$@``8K@EDD,`'))"`!T``A(``&(0
+M):^B`""25``@DD(`(0`"$@`"@J`EDD(`(@`"%``"@J`EDD(`(P`"%@`0```#
+M`H*@):^@`"```+@ECZ(`'``"B4`T$X@`/!```"80```"P"`E`@#X"0(S*"$T
+M$H@$`L`@)0(R*"$"`/@)`N`P)30%B`@"P"`E`B4H(0(`^`D"H#`E-`6(#`+`
+M("4")2@A`@#X"8^F`"`T!8@0`L`@)0(E*"$"`/@)`H`P)30%B!0"P"`E`B4H
+M(0(`^`DD!@`'-`6(&`+`("4")2@A`@#X"0``,"4T!8@<`L`@)0(E*"$"`/@)
+M```P)8^C`!```XE``L`@)0(S*"$"`/@)`\`P)0+`("4",B@A`@#X"8^F`!@0
+M```J)`(``8^B`!```HE`-`6(`#P0```F$````L`@)0(E*"$"`/@)`\`P)30%
+MB`0"P"`E`B4H(0(`^`F/I@`8-`6("`+`("4")2@A`@#X"0*`,"4T!8@,`L`@
+M)0(E*"$"`/@)`J`P)30%B!`"P"`E`B4H(0(`^`D"8#`E-`6(%`+`("4")2@A
+M`@#X"0+@,"4\`@``)$(```+`("6/I0`0`$#X"8^F`%PD`@`!C[\`3(^^`$B/
+MMP!$C[8`0(^U`#R/M``XC[,`-(^R`#"/L0`LC[``*`/@``@GO0!0````````
+M````````)[W_Z*^_`!`D@RPP/`(``"1"````H"`E`&`H)0!`^`DD!@`&C[\`
+M$`/@``@GO0`8)[W_Z*^_`!`\`@``)$(``"2$+#``0/@))`8`!B0"``&/OP`0
+M`^``"">]`!@GO?_HK[\`$"2#+#P\`@``)$(```"@("4`8"@E`$#X"20&``:/
+MOP`0`^``"">]`!@GO?_@K[\`&*^Q`!2OL``0`("`)3P"```D0@``)@0L/`!`
+M^`DD!@`&D@,L/)("+#T``A(``&(8)9("+#X``A0``&(8)9(&+#\`!C8`/!$`
+M`"8Q```"`"`E-`6`X`(@^`D`9C`ED@(L0)(&+$$`!C(``@`@)30%@.0"(/@)
+M`$8P)20"``&/OP`8C[$`%(^P`!`#X``()[T`(#"E__\`@!@EE&(""!!%``@D
+M!``,E&(2<C!"`(`L1``!``0@(R0"__@`@B`D)(0`"U3```&LQ````^``"```
+M$"4`@!@EE((2AA!```4``"@EE((2=A1```(D!0`!)`4`0Y2"$HI40``!-*4`
+M!)2"$HP00``)`````)1C`<HD`@X1$&(`!0````"4@A)X%$```C2E``@TI0`@
+M`^``"`"@$"4GO?_@K[\`'*^R`!BOL0`4K[``$`"`@"66`A)(,$,`'``#D((P
+M0@`"``*(*XX"`:P`0/@)`D`H)3P"```D0@```@`@)0!`^`DT!9@`/`,``"1C
+M```"`"`E-`68``!@^`DT1B``C@(!L`(`("4`0/@)`D`H)1!1``(N)@`!`B`P
+M)8X"`;@"`"`E`$#X"0)`*"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_@
+MK[\`&*^Q`!2OL``0`("()0"@@"4\`@``)$(```!`^`DD!4`0/`/_\31C_Y\`
+M0Q`D/`,``"1C3I`R$``'`!"`@`(#@"&.!@``/`,``"1C```"("`E)`5`$`!@
+M^`D`1C`EC[\`&(^Q`!2/L``0`^``"">]`"`GO?_@K[\`'*^R`!BOL0`4K[``
+M$`"`@"4PTO__/`(``"1"```F!"PV`$#X"20&``:2`RPVD@(L-P`"$@``8A@E
+MD@(L.``"%```8A@ED@8L.0`&-@`\$0``)C$```(`("4T!8`(`B#X"0!F,"62
+M!BPZD@(L.P`"$@``PC`E,E(__P`2E``"`"`E-`6`#`(@^`D`TC`EC[\`'(^R
+M`!B/L0`4C[``$`/@``@GO0`@)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``
+M$`"`H"4\$@``)E(```)`^`DT!8!,`$"8)0*`("4"0/@)-`6`4`!`@"4"@"`E
+M`D#X"30%@$P`4Y@K`A.`(0(`B"4``(`E`!&`````B"4`0!@E```0)0("$"4"
+M(Q@EC[\`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_HK[\`$#P"
+M```D0@```$#X"30%@$R/OP`0`^``"">]`!@GO?_@K[\`'*^R`!BOL0`4K[``
+M$`"`D"4\`@``)$(```!`^`DT!8`@/`,!``!#B"4\$```)A````)`("4T!8`@
+M`@#X"0(@,"4"0"`E-`6`(`(`^`D"(#`EC[\`'(^R`!B/L0`4C[``$`/@``@G
+MO0`@)[W_X*^_`!BOL0`4K[``$`"`B"6.(A(T4$``-(^_`!B40@`",$(`(!!`
+M`"\``"`EC*(``!!``!```(`E)*8`!`!`*"4`Q!`AD$,``#!B`(!00``&)(0`
+M`3!C`'\`<!`K4$```0!@@"4DA``!`(40*Q1`__4`Q!`A/`(``"1"```"("`E
+M`$#X"30%@`02```.`$`8)0`0$$(L0@`#4$``"SP&_?\\!@(`/`(``"1"```"
+M("`E-`6`!`!`^`D`9C`E$```"H^_`!@\!OW_-,;__SP"```D0@```B`@)30%
+M@`0`0/@)`&8P)(^_`!B/L0`4C[``$`/@``@GO0`@)[W_V*^_`""OLP`<K[(`
+M&*^Q`!2OL``0`("8)3P"```D0@```$#X"30%F&0``I3",E(!_S)"`0`00``#
+M/!$``#I2`?\`$I`G)C$```)@("4"(/@)-`6`4`!`@"4"8"`E`B#X"30%@$P"
+M`H`F`A(0)H^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_HK[\`%*^P
+M`!``@(`E/`(``"1"````0/@))`5`(#!#`/\``QD",$0`#XX"`<P40P`$```H
+M)98"`=!01``!)`4``0"@$"6/OP`4C[``$`/@``@GO0`8)[W_X*^_`!ROL@`8
+MK[$`%*^P`!``@)`E`*"`)3P1```F,0```B#X"30%@)".`P```$,0(:X"```"
+M0"`E`B#X"30%@(R.`P`$`$,0(:X"``0"0"`E`B#X"30%@)2.`P`,`$,0(:X"
+M``P"0"`E`B#X"30%@(B.`P`(`$,0(:X"``@"0"`E`B#X"30%@)B.`P`0`$,0
+M(:X"`!"/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`#X``()`(``2>]_^BOOP`0
+M/`(``"1"````0/@)-`6<'#!"`/^/OP`0`^``"">]`!@GO?_HK[\`$#P"```D
+M0@```$#X"30%@%@P0@`'C[\`$`/@``@GO0`8)[W_Z*^_`!`PI@`'/`(``"1"
+M````0/@)-`6`6(^_`!`#X``()[T`&`/@``B,@B^\)[W_Z*^_`!",AA(T5,``
+M!#P"``"LA2^\$```!"0"``$D0@```$#X"0````"/OP`0`^``"">]`!@#X``(
+M)`(``2>]_^"OOP`<K[(`&*^Q`!2OL``0`("()0"@@"4N`@`&%$``"`(@D"4\
+M`@``)$(```!`^`DT!?__`%`0*U!```4\`@``)`+__ZY"+_@0```-```0)21"
+M```"("`E`$#X"0(`*"4\`P``)&,```(@("4D!1!P`&#X"0!`,"6N4"_X)`(`
+M`8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_^BOOP`4K[``$`"`@"4\`@``
+M)$(```!`^`DD!1!P/`,``"1C```"`"`E`&#X"3!%__^/OP`4C[``$`/@``@G
+MO0`8)[W_V*^_`""OLP`<K[(`&*^Q`!2OL``0`("()0"@D"4"()@E/`(``"1"
+M````0/@))`4__P!2$"M00``%/`(``"0"__^N8B_\$```%@``$"4D0@```B`@
+M)0!`^`DT!8`4`$"`)3P"```D0@```B`@)0!`^`D"0"@E)`/```(#@"0P0C__
+M/`,``"1C```"("`E-`6`%`!@^`D"`C`EKG(O_"0"``&/OP`@C[,`'(^R`!B/
+ML0`4C[``$`/@``@GO0`H)[W_Z*^_`!2OL``0`("`)3P"```D0@```$#X"30%
+M@!0\`P``)&,```(`("4`8/@),$4__X^_`!2/L``0`^``"">]`!B0@B_,.$(`
+M`0/@``@P0@`!)[W_X*^_`!ROL@`8K[$`%*^P`!``@)`E$*``$0)`B"4\`@``
+M)$(```!`^`DT!8`$/!#^_S80__\\`P``)&,```(@("4T!8`$`&#X"0!0,"2.
+M(B_,`%`0)!```!"N(B_,/`(``"1"```"0"`E`$#X"30%@`0\$`$`/`,``"1C
+M```"0"`E-`6`!`!@^`D`4#`ECB(OS`!0$"6N(B_,)`(``8^_`!R/L@`8C[$`
+M%(^P`!`#X``()[T`(">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`B"4`H)`E
+M`B"8)3P"```D0@```$#X"20%/_\`4A`K4$``!3P"```D`O__KF(P`!```!D`
+M`!`E)$(```(@("4`0/@)-`6`%`!`@"4\`@``)$(```(@("4`0/@)`D`H)3P#
+MP``T8___`@.`)``"%``\`S__`$,0)#P#```D8P```B`@)30%@!0`8/@)`@(P
+M):YR,``D`@`!C[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_^BOOP`4
+MK[``$`"`@"4\`@``)$(```!`^`DT!8`4``(L`CP"```D0@```@`@)0!`^`DP
+MI3__C[\`%(^P`!`#X``()[T`&">]_]BOOP`DK[0`(*^S`!ROL@`8K[$`%*^P
+M`!``@)`E`,"@)3"Q__\"0)@E+B,`@!!@``TD`@`,/!```"80```D!00``@#X
+M"0(@,"4"0"`E)`4$!`(`^`D`%#`K`C,0(:!4+S@``!`EC[\`)(^T`""/LP`<
+MC[(`&(^Q`!2/L``0`^``"">]`"@GO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``
+M@)@E,+``_Q#``$FB<!(X,@(`_Q!``$8D`P%`CF(2-)1"``(P0@%`5$,`0H^_
+M`"`\`@``)$(```!`^`DD!0`!`$`H)8YB$C240@`",$)``!!```L`!1A"`@,`
+M&```,!(`!A!``,(P(23&`00``)`2`%(0(0`"$$`0```9)%(-K(YB$C240@`"
+M,$*``!!```L`!1B"`@,`&```,!(`!A!``,(P(23&`-(``)`2`%(0(0`"$$`0
+M```*)%(-2`(%`!@``#`2``800`#","$DQ@%H``"0$@!2$"$``A!`)%(.8`(%
+M`!@``(`2`!`00`("@"$F$`/H,A`__SP1```F,0```F`@)0(@^`DD!1!P`F`@
+M)20%$+`"(/@)`D`P)0`0-``"8"`E-`6`%`(@^`D`T#`EC[\`((^S`!R/L@`8
+MC[$`%(^P`!`#X``()[T`*">]_^BOOP`0/`(``"1"````0/@)C(4!W(^_`!`#
+MX``()[T`&"0#``80HP`)```0)9""$I,00``%```8)8R"+^@L0@`"5$```20#
+M``$`8!`E`^``"``````GO?_@K[\`'*^R`!BOL0`4K[``$#P"```D0@```$#X
+M"0"`D"400`!U/!```"80```"0"`E-`68<`(`^`DD!@`?ED8!U##&`/`DQO_0
+M+,8`0"S&``$`!C`C,,8`!`)`("4T!9GX`@#X"23&`!0\$0``)C$```)`("4"
+M(/@)-`6`'"0#P'\`0Q`D`D`@)30%@!P"`/@)-$8`@`)`("4T!8$$`@#X"20&
+M`#T"0"`E`B#X"20%0!`"0"`E)`5`$`(`^`DT1@`"CD0!S#B#``<L8P`!.((`
+M"RQ"``$`8A@E5&``#3P0```D`P`*$(,`"20"``D0@@`(/!```!2#`"$F$```
+MED(!T"Q"``000``=`````#P0```F$````D`@)30%F'0"`/@))`8`)@)`("4T
+M!9AX`@#X"20&``T"0"`E-`69\`(`^`DD!@`'`D`@)30%F?0"`/@))`8`/SP"
+M```D0@```D`@)0!`^`DD!4`0/`/\_S1C__\`0Q`D$```&CP&`@`"0"`E-`68
+M=`(`^`DD!@`*`D`@)30%F'@"`/@))`8`#`)`("4T!9GP`@#X"20&``,"0"`E
+M-`69]`(`^`DD!@`@/`(``"1"```"0"`E`$#X"20%0!`\`_S_-&/__P!#$"0\
+M!@,``D`@)20%0!`"`/@)`$8P)1```$>/OP`</!$``"8Q```"0"`E`B#X"20%
+M0!`\!OS_-,;__SP0```F$````D`@)20%0!`"`/@)`$8P)`)`("4"(/@))`5`
+M$"0&__T"0"`E)`5`$`(`^`D`1C`D`D`@)30%F'`"`/@))`8`'P)`("4T!9AT
+M`@#X"20&`'\"0"`E-`68>`(`^`DD!@`.`D`@)30%F?`"`/@))`8`#`)`("4T
+M!9GT`@#X"20&`/^61@'4,,8`\"3&_]`LQ@!`+,8``0`&,",PQ@`$`D`@)30%
+MF?@"`/@)),8`#@)`("4"(/@)-`6`'"0#P'\`0Q@DED(!U#!"`/`D0O_0+$(`
+M0!1```(T9A.`-&8/@#P"```D0@```D`@)0!`^`DT!8`<C[\`'(^R`!B/L0`4
+MC[``$`/@``@GO0`@)[W_X*^_`!ROL@`8K[$`%*^P`!`\`@``)$(```!`^`D`
+M@)`E$$``23P1```F,0```D`@)0(@^`DD!4`0/`;\_S3&__\\$```)A````)`
+M("4D!4`0`@#X"0!&,"0"0"`E`B#X"20%0!`D!O_]`D`@)20%0!`"`/@)`$8P
+M)`)`("4T!8$$`@#X"20&``$"0"`E`B#X"30%@!PD`\!_`$,8))9"`=0P0@#P
+M)$+_T"Q"`$`40``"-&83@#1F#X`\$```)A````)`("4"`/@)-`6`'`)`("4T
+M!9AP`@#X"20&`!\"0"`E-`68=`(`^`DD!@!_`D`@)30%F'@"`/@))`8`#@)`
+M("4T!9GP`@#X"20&``P"0"`E-`69]`(`^`DD!@#_ED8!U##&`/`DQO_0+,8`
+M0"S&``$`!C`C,,8`!`)`("4T!9GX`@#X"23&`!2/OP`<C[(`&(^Q`!2/L``0
+M`^``"">]`"`\`@``E*,``)1"3K``0Q`K%$``"P``("4\`@``)$-.L)2E```D
+MA``!``00@`!#$"&40@```$40*U!`__LDA``!/`(``"1"3K``!!B``$,0(0/@
+M``B$0@`")[W_X*^_`!BOL0`4K[``$`#`@"4`X(@E`(`P)22C__\L8@`=$$``
+MOB2'`>`\`@``)$).X``#&(``8A@AC&(```!```@`````)`(``E("``^,X@``
+M+@(``A1``+8``!`E+@(`!!1``+,D`@`-+@(`!A1``+```!`E)`(`?U("`*T`
+M`!`E$```JR0"``T\`P`$$```8`!#$"02``"F```0)20"``$6`@`&`````(S"
+M+\P``A;".$(``1```)XP0@`!4@``!HSB```D`@`!4@(`!HS"+]`0``"7)`(`
+M#``"%,(0``"4,$(``0`"$((0``"1,$(``8R#`<PL8@`&$$``C0``$"4D`@`%
+M%&(`BB0"``V4@@'0+$(`"%!``(8``!`E$```A"0"``T2``""```0)20#``$6
+M`P!_)`(`##P"```D0@```$#X"30%H@@``A-".$(``1```'<P0@`!C((!^*XB
+M```0``!S```0)1(``'$``!`E)`,``18#`&^/OP`8C,(OW!```&PL0@`!4@``
+M!I3"$H8D`@`!$@(`!8^_`!@0``!FC[$`%!```&(L0@`!E,(2C!1``%\``!`E
+ME,,2BA!@`%PD`@`!$```6@``$"42``!8```0)20#``$6`P!5)`(`#(S"+\P`
+M`A?"$```43A"``%2```&C.(``"0"``%2`@`*C,(OT!```$HD`@`,,$((```"
+M$"L``A`C)`/_\P!#$"00``!#)$(`#0`"$,(X0@`!$```/S!"``&,PB_@,$(`
+M/ZXB```0```Z```0)8S"+^`P0C\```(2`JXB```0```T```0)20"``%2`@`(
+MC,(P&!(``"\``!`E+@,`!Q!@`"PD`@`,$```!#P"```X0@`!$```)S!"``$D
+M0@```$#X"0``````0"`E$(``(20"``$F`__^+&(`!1!``!T``!`E/`(``"1"
+M3U@``QB``&(8(8QB````0``(`````)""``D0```,KB(``)""``P0```)KB(`
+M`)""``T0```&KB(``)""``L0```#KB(``)""``JN(@``$```!@``$"4\`@``
+M)$(```(`,"4`0/@)`B`X)8^_`!B/L0`4C[``$`/@``@GO0`@)[W_V*^_`""O
+ML0`<K[``&`"`B"4`X(`E`B!`)22C__XL8@`<$$``CB8D`>`\`@``)$)/B``#
+M&(``8A@AC&(```!```@`````$@``!3P#"`"-`B_,`$,0)1````:M`B_,C0(O
+MS#P#]_\T8___`$,0)*T"+\P0``"!)`(``8R#```\`@`(`&(8)!!@`'P``!`E
+M$@``!20#__N-`B_0`$,0)!````2M`B_0C0(OT#1"``2M`B_0/`(``"1"```"
+M("`E-`6!(`!`^`F-!B_0$```:R0"``$\`@``)$(```(@("4`0/@)-`6B"!(`
+M``,`0#`E$````S3&(``D`M__`,(P)#P"```D0@```B`@)0!`^`DT!:(($```
+M620"``&N,`'X/`(``"1"```"("`E-`6`2`!`^`D"`#`E$```4"0"``$`$!`K
+MK0(OW!```$PD`@`!$@``!3P#@`"-`B_,`$,0)1````:M`B_,C0(OS#P#?_\T
+M8___`$,0)*T"+\P0```_)`(``84"+_0"`H`A+@(`0%!```$D$``_)`(`&E2B
+M``:-`R_@C0(OX`("$"4P0@`_$```!JT"+^`P8S\`,@(_```"$@(`0Q`EK0(O
+MX#P"```D0@```B`@)30%@.@`0/@)C08OX!```"4D`@`!+,(`!Q!``"(``!`E
+M/`(``"1"3VP`!AB``&(8(3P"```D0@```B`@)8QE````0/@)`@`P)1```!>/
+MOP`@C((``#!""`!00``,CZ(`.!(```2-`B_0-$(`"!````2M`B_0)`/_]P!#
+M$"2M`B_0$```""0"``&/H@`XKZ(`$#P"```D0@```B`@)0!`^`D"`#@EC[\`
+M((^Q`!R/L``8`^``"">]`"@GO?_@K[\`&(^B`#"/HP`TKZ(`$#P"```D0@``
+M`$#X":^C`!0``A`KC[\`&`/@``@GO0`@```````````GO?_0K[\`+*^V`"BO
+MM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!`0H``Q`("()3P"```D0@```$#X"20%
+M0`0\!O_\-,;__SP#```D8P```B`@)20%0`0`8/@)`$8P)#P"```D0@```$#X
+M"20$``HD$``H/`(``"12```\%@`!/`(``"15```\%/_\-I3__SP"```0```+
+M)%,```*@^`DD!``R`B`@)0)`^`DD!4`$`B`@)20%0`0"8/@)`%0P)"80__\2
+M```(`B`@)0)`^`DD!4`0`%80)!1`__``````5@``!#P"```0```/```0)3P"
+M```D0@```B`@)0!`^`DT!8`$/`;_^S3&__\\`P``)&,```(@("4T!8`$`&#X
+M"0!&,"0D`@`!C[\`+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``(
+M)[T`,">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`B"4`H(`E/`(``"12```"
+M0/@)-`6`!#P&``0\`P``)',```(@("4T!8`$`F#X"0!&,"42```+`B`@)0)`
+M^`DD!4`$/`/__#1C__\`0Q`D/`8``0(@("4D!4`$`F#X"0!&,"6/OP`@C[,`
+M'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_V*^_`""OLP`<K[(`&*^Q`!2OL``0
+M`("()0"@@"4\`@``)%(```)`^`DT!8`$/`8`!#P#```D<P```B`@)30%@`0"
+M8/@)`$8P)1(```L"("`E`D#X"20%0`0\`__\-&/__P!#$"0\!@`"`B`@)20%
+M0`0"8/@)`$8P)8^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_@K[\`
+M'*^R`!BOL0`4K[``$`"@B"4`P"@E)!```1(P``T`@)`E$B``!CP"``$D`@`"
+M$B(`#@``$"40```3C[\`'"1"90``0/@)`````!````L`0(`E/`(``21"9DP`
+M0/@)`````!````:N42^X/`(``21"9N0`0/@)`````*Y1+[@"`!`EC[\`'(^R
+M`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_`!`\`@``)$(```!`^`DD!4`$``(4
+M`C!"``./OP`0`^``"">]`!@``````````">]_^BOOP`4)`(`"!"B`#:OL``0
+M+*(`"1!```\D`@$`)`(``A"B`#,LH@`#$$``!B0"``0D`@`!$*(`%@``$"40
+M``!`C[\`%!"B`"0``!`E$```/(^_`!00H@`L+*(!`1!```8D`@(`)`(`(!"B
+M`"0``!`E$```,X^_`!00H@`F)`($`!"B`"<``!`E$```+8^_`!0\`@``)%``
+M`(R"$C100``C/`(``)1"``(P0D``$$```SP"```0```<)%```(R"$C240@`"
+M,$*``!!``!<\`@``$```%210```\`@``$```$B10```\`@``$```#R10```\
+M`@``$```#"10```\`@``$```"210```\`@``$```!B10```\`@``$````R10
+M```\`@``)%```#P"```D0@```$#X"0(`*"4"`!`EC[\`%(^P`!`#X``()[T`
+M&">]_^BOOP`0/`(``"1"````0/@))`4`#(^_`!`#X``()[T`&">]_^BOOP`0
+M`*`P)3P"```D0@```$#X"20%``R/OP`0`^``"">]`!@GO?_HK[\`$#P"```D
+M0@``)`4`"`!`^`DD!@`$C[\`$`/@``@GO0`8)[W_Z*^_`!2OL``0`("`)3P"
+M```D0@``)`4`"`!`^`DD!@`@/`(``"1"```"`"`E)`4`""0&``0`0/@)```X
+M)0`"$"N/OP`4C[``$`/@``@GO0`8)[W_Z*^_`!2OL``0`("`)3P"```D0@``
+M`$#X"30%@$@D!O_?/`,``"1C```"`"`E-`6`2`!@^`D`1C`D/`(``"1"````
+M0/@)`@`@)3P"```D0@```@`@)0!`^`DD!0`!C[\`%(^P`!`#X``()[T`&">]
+M_^BOOP`4K[``$`"`@"4\`@``)$(```!`^`DT!8!(/`,``"1C```"`"`E-`6`
+M2`!@^`DT1@`@/`(``"1"````0/@)`@`@)8^_`!2/L``0`^``"">]`!@GO?_@
+MK[\`'*^R`!BOL0`4K[``$`"`B"4`H!`E`,"0)3P0```F$```-`6`0`(`^`D`
+M0#`E`B`@)30%@$0"`/@)`D`P)8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]
+M_^"OOP`8K[$`%*^P`!``@(@E`*"`)2X#`$`08``A```0)2X"`"`40``0/`(`
+M`"1"````0/@)-`6`1"8#_^`D!@`!`&8P!``&,"<\`P``)&,```(@("4T!8!$
+M`&#X"0!&,"00```/)`(``21"```"("`E`$#X"30%@$`D!@`!`@8P!``&,"<\
+M`P``)&,```(@("4T!8!``&#X"0!&,"0D`@`!C[\`&(^Q`!2/L``0`^``"">]
+M`"`GO?_@K[\`&*^Q`!2OL``0`("()0"@@"4N`P!`$&``'P``$"4N`@`@%$``
+M#SP"```D0@```$#X"30%@$0F`__@)`8``0!F,`0\`P``)&,```(@("4T!8!$
+M`&#X"0!&,"40```.)`(``21"```"("`E`$#X"30%@$`D!@`!`@8P!#P#```D
+M8P```B`@)30%@$``8/@)`$8P)20"``&/OP`8C[$`%(^P`!`#X``()[T`(">]
+M_^"OOP`<K[(`&*^Q`!2OL``0`("()3P0```F$````@#X"30%@#P`0)`E`B`@
+M)0(`^`DT!8$,`$`8)3!B`"!40``!-E("`#P"`@(`8A`D5$```392`0`"0!`E
+MC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_`!ROL@`8K[$`%*^P`!``
+M@)`E`*"()3P"```D0@``-`6`/`!`^`DR)@#_,B("`!!```(``(`E)!``(#(B
+M`0`00``"/`("`@("@"4\`@``)%$```)`("4T!8$,`B#X"0(`,"42```+/`(`
+M`"1"```"0"`E`$#X"20%`#0"0"`E)`4`-`(@^`DT1@`0$```#8^_`!PD0@``
+M`D`@)0!`^`DD!0`T)`;_[SP#```D8P```D`@)20%`#0`8/@)`$8P)(^_`!R/
+ML@`8C[$`%(^P`!`#X``()[T`(*B@``BXH``+,,8/_ZBF``RXI@`/,.<`(!#@
+M``8`````B*(`#)BB``\T0B``J*(`#+BB``^HH``4N*``%XBB`!28H@`7J*(`
+M$+BB`!,#X``()`(``2>]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`F"4`P)`E
+MC[$`0`"@@"6*`P`4F@,`%S!C``$08`!S)`(`#XCB`!28X@`7,$(``11```8\
+M`@``)$(```!`^`DD!0`,$%(`:20"``^*`@`0F@(`$S!"#_^F(@``B@(`%)H"
+M`!<``A0",$)__Z8B``*B(``$B@(`$)H"`!,``A4",$(`_Z(B``8``A8```(6
+M`R0#_X!00P`!HB``!HH"`!2:`@`7,$(!`!!```<D`@#_B@(`%)H"`!<P0OX`
+M``(20A````*B(@`'HB(`!XH"`!":`@`3``(3PC!"`!^B(@`(B@(`$)H"`!,`
+M`A<"HB(`"8H"`!":`@`3``(3`C!"``&B(@`*B@(`%)H"`!<P0@`"%$``-@``
+M$"6*`@`4F@(`%S!"``000``%`````)(B``0T0@`!$```+*(B``2*`@`4F@(`
+M%S!"`!`00``6`````)(B``0T0@`"HB(`!(H"`!2:`@`7,$+_```"$@*B(@`%
+MCF,P'"QC``$X0@`%``(0*P!B&"008``8/`(``"1"```"8"`E`$#X"0(@*"40
+M```3```0)8H"`!2:`@`7,$(`"!!```4`````DB(`!#1"``@0```)HB(`!(H"
+M`!2:`@`7,$(`(!!```4``!`EDB(`!#1"`!"B(@`$```0)8^_`""/LP`<C[(`
+M&(^Q`!2/L``0`^``"">]`"@``````````">]_Z"OOP!<K[X`6*^W`%2OM@!0
+MK[4`3*^T`$BOLP!$K[(`0*^Q`#ROL``X`("0):^E`&0`P+@EKZ<`;`)`F"66
+MX@`"``(1PC!#``&6X@`",$(!`!!```4``*`E%&`$*20#``P0```(EN(``I;B
+M``(``A'".$(``3!"``$40`0A)`,`#);B``(``A&",$,``9;B``(P0@`@4$``
+M!9;B``(48`08)`,`#!````<\`@````(1@CA"``$P0@`!%$`$$20#``P\`@``
+M)$(```)`("4``"@E`$#X"20&``$00`0.`D`@)3P"```D0@```$#X"0+@*"4`
+M0*@E$J`$`B0#``PD`@`&CZ,`9!!B``LL8@`'$$``!B0"``@L8@`"$$`#^20#
+M``P0```%CZ4`;(^D`&04@@/T)`,`#(^E`&P0H``2/`(``"1"```"0"`E`$#X
+M"20%$4"OH@`@/`(``"1"```"0"`E`$#X"0*@*"4\`@``)$(```)`("4`0/@)
+M```H)1````..1`',KZ``((Y$`<PX@P`'+&,``3B"``LL0@`!`&(8)11@``V/
+MH@!L)`,`"A"#``DD`@`)$((`"(^B`&P4@P`=/`(``)9"`=`L0@`$$$``&3P"
+M``"/H@!L$$``%CP"``".1!(T$(``%"1"``"6XP``E((``!!B``\\`@``EN,`
+M`I2"``(P8P'P,$(!\!1B``D\`@``/`(``"1"```"0"`E`$#X"0+@*"440`.Z
+M)`(``3P"```D0@```D`@)0!`^`DT!8!8%$```Z^B`"0D`P`!KZ,`)#P0```F
+M$````D`@)0(`^`DT!8`$/`,"(`!#$"2OH@`L`D`@)0(`^`DD!4`0/`,`_C1C
+M`&``0Q`DKZ(`*`)`("4"`/@))`5`%*^B`!@"0"`E`@#X"20%0!BOH@`</`(`
+M`"1"```"0"`E`$#X"8^E`&0\`@``)$(```!`^`D"0"`E/`(``"1"```"0"`E
+M`$#X"0+@*"400`.%)`,``Y;B``(P0P'P)`(!0!!B`"`H8@%!$$``#R0"",`D
+M`@#`$&(`*2AB`,$00``&)`(`T"0"`*`08@`?)`,`#!```W6/I0!P$&(`)20#
+M``P0``-QCZ4`<!!B`!PH8@C!$$``!B0""4`D`@%0$&(`#20#``P0``-HCZ4`
+M<!!B``4D`@E0$&(`!R0#``P0``-BCZ4`<"0$``&OI``P$```%*^D`#0D!0`"
+MKZ4`,"0"``$0```/KZ(`-"0#``.OHP`P)`0``A````JOI``T)`4`!*^E`#`D
+M`@`"$```!:^B`#0D`P`%KZ,`,"0$``*OI``T/`(``"1"```"0"`E-`68``!`
+M^`DD!@`'``"`)3P"```D45``/`(``"1>```\`@``)%8````0$$``4!`A``(8
+MP`!Q&"$``A!`CZ4`,`!%$"$``A"``%$0(0)`("6,90```\#X"8Q&```FE``!
+M,H(`/U1```0F$``!`L#X"20$``$F$``!+@(`&11`_^L`$!!```"`)3P"```D
+M45)8/`(``"1>```\`@``)%8````0$,``41`AC$4``(^B`&P00``-/`3__S2$
+M?^``I!@A+&,`&3AC``$\!/__-(1_+`"D$"$L0@`).$(``0!B&"108``-)A``
+M`0`0$,``41`A`D`@)0/`^`F,1@`$)I0``3*"`#]40``$)A```0+`^`DD!``!
+M)A```2X"`,040/_A`!`0P(YB+*P"0"`ECZ4`,(^F`#0`0/@)`H`X)9;B``(P
+M0L``$$``!3P"```D0@```D`@)0!`^`D"X"@EED(!TBQ"`$)40`!7ED(!TCP"
+M```D0@```D`@)30%F"P\!@`"`$#X"33&H`*6XP``)`()M%1B``Z28Q*2DF(2
+MDI9C$IP`0Q`C/`-F9C1C9F<`0P`8```8$``#&$,``A?#`&(8(P`#'``0```*
+M``,D`SP"9F8T0F9G`&(`&```$!```A!#``,?PP!#$",``A0```(D`Y;B``(P
+M0@#0)`,`P!1#`!$\`@``DF82D@`&,",`!C&`,,8/P``$&",``QR`/`(`_`!B
+M&"0\`@``)$(```)`("4T!9E,`$#X"0##,"40```'/!```"1"```"0"`E-`69
+M3`!`^`D``#`E/!```"80```"0"`E`@#X"30%HB@D!OW_/!$``"8Q```"0"`E
+M-`6B*`(@^`D`1C`D`D`@)0(`^`DT!:(H/`/__C1C`_\`0Q`D`D`@)30%HB@"
+M(/@)-$8(``)`("4T!8!@`B#X"20&``^60@'2+$(`0Q1```<\`@``)$(```)`
+M("4T!:)4`$#X"0``,"4\`@``)$(```)`("4T!9AX`$#X"20&``Z.0P',)`0`
+M"A!D``DD`@`)4&(`");B```49``9/`(``)9"`=`L0@`$$$``%3P"``"6X@``
+M.$,)GBQC``$X0@FC+$(``0!B&"4X<``!/`(``"1"```"0"`E`$#X"30%HDP0
+M4``&/`(``"1"```"0"`E-`6B3`!`^`D"`#`E/`(``"1"```"0"`E`J`H)0!`
+M^`DGI@`0$$`"820#``,D`@`&CZ,`9%!B``B.8BRXCD("!!!```0\`@``)$(`
+M``!`^`D"0"`ECF(LN`)`("4"H"@ECZ,`,#!F__\`0/@))Z<`$!!``DXD`P`#
+MEN(``C!"`$`00``>)`0`"HY#`<P09``-)`(`"5!B``R6X@`"5&0`!I9B$G"6
+M0@'0+$(`!%1```:6X@`"EF(2<"Q"4`,40``+/`(``);B``(P0@"@)`,`H!!#
+M``4\`@``)$(```)`("4`0/@)`J`H)3P"```D0@```D`@)0!`^`D"X"@E/`(`
+M`"1"```"0"`E`$#X"0*@*"400`(F)`,``X^D`&P0@``&/`(``"1"```"0"`E
+M)`410`!`^`F/I@`@DF,L,))B+#$``A(``&(8)9)B+#(``A0``&(8)9)F+#,`
+M!C8`/!```"80```"0"`E-`6```(`^`D`9C`EDF8L-))B+#4``A(``,(P)8^E
+M`"P`Q3`ECF(OS`#","4\`@"``D`@)30%@`0"`/@)`,(P)3P"```D0@```D`@
+M)0!`^`F/I0!DDF,L/))B+#T``A(``&(8)9)B+#X``A0``&(8)9)F+#\`!C8`
+M`D`@)30%@.`"`/@)`&8P)9)B+$"29BQ!``8R``)`("4T!8#D`@#X"0!&,"4\
+M`@``)$(```)`("4`0/@))`5`$`)`("4D!4`0CZ,`*`(`^`D`0S`E`D`@)20%
+M0!0"`/@)CZ8`&`)`("4D!4`8`@#X"8^F`!P"0"`E-`6`6`(`^`F/I@`DDF,L
+M-I)B+#<``A(``&(8)9)B+#@``A0``&(8)9)F+#D`!C8``D`@)30%@`@"`/@)
+M`&8P)9)B+#J29BP[``8R``)`("4T!8`,`@#X"0!&,"4"0"`E-`6`&`(`^`F.
+M9B_4`D`@)20%`(`"`/@))`;__SP"```D0@```D`@)0!`^`D"H"@E$$`!L"0#
+M``,\`@``)$(```)`("6211(X`$#X"20&``$\`@``)$(```)`("4`0/@)`N`H
+M)99"`=0P0@#P)$+_T"Q"`$`00``8/`(``(Y#$C2,8@``,$+``!!``!(\`@``
+ME'```C(00``N$``!)A``#"1"```"0"`E`$#X"30%F"0D`__P`$,0)#(0``\\
+M`P``)&,```)`("4T!9@D`&#X"0!0,"4\`@``)$(```)`("4`0/@)-`69%#!0
+M/_^6X@`",$(`(!!```D`$!"`/`.Z+C1CBZ,`0P`9```0$```````````$```
+M!P`"@0(\`LS,-$+,S0("`!D``!`0``*`P@`````\`@``)$(```)`("4T!9@<
+M`$#X"20&``&.0A(TE$(``C!"0``40``'`!`@0(Y"$C240@`",$*``!!```@\
+M`@```!`@@#P"```D0@```$#X"22$`&00```%/`(``"1"````0/@))@0`9#P"
+M```D0@```D`@)0!`^`DT!9@(`$"P)3P"```D0@```D`@)30%F`@`0/@))`8X
+M````@"4\`@``)%0``#P"```0```#)%$```(@^`DD!`#(`@`0)2A"`!000``'
+M)A```0)`("4"@/@)-`6<)#!"`!`40/_U`````#P"```D40```D`@)30%F`@"
+M(/@)`L`P)3P"```D4````D`@)0(`^`DT!9A@`D`@)30%F&`"(/@)-$8``Y;B
+M``(P0@"@)`,`H!!#`!8D`@`"CF,OP%!B`!2N8"_``D`@)0(`^`DT!9D@`D`@
+M)30%F2`"(/@)-$;P``)`("4"`/@)-`69(#P&``$"0"`E-`69(`(@^`D`1C`E
+M)`(``1````*N8B_`KF`OP#P"```D0@```$#X"0)`("4``(`E)!0``3P"```D
+M40```!`H@`)`("4DI1```B#X"0(4,`0F$``!*@(`"A1`__D`$"B`KF!&H)9"
+M`>@00``+``"`)3P"```D40```D`@)0(@^`D"`"@E)A```99"`>@"`A`J%$#_
+M^@)`("4\`@`(-$()9:YB+$0D`@`&CZ,`9!1B``0\$```/`(`"#1"&66N8BQ$
+M)A````)`("4D!0"@`@#X"8YF+$0\`@``)$(```)`("4`0/@))`4`K#P&``<"
+M0"`E)`4`K`(`^`D`1C`ECD(23!!```0\`@``)$(```!`^`D"0"`E/`(``"1"
+M```"0"`E-`688"0&``$`0/@)```X)3P"```D0@```D`@)0!`^`F/I0!D/`(`
+M`"1"```"0"`E`$#X"30%@"`\!OY_-,;__SP#```D8P```D`@)30%@"``8/@)
+M`$8P)(Y#`<PL8@`&$$``"3P0```D`@`%%&(`$3P"``"60@'0+$(`"!1```T\
+M`@``/!```"80```"0"`E-`6!&#P&``$"`/@)-,8`J@)`("4T!8$<`@#X"20&
+M,A`\`@``)$(```)`("4T!8$(`$#X"20&`%*6X@`",$(!`%!```*"9A*/@F82
+MCCP"```D0@```D`@)0!`^`D"X"@E``(6```"1@..8B_@,$,`/X9E+_0`91`C
+M@J0`!@""$"M40``!`(48(8*B``4``A!``$@@(P"#$"M00``$CF(OX(9B+_0`
+M@A@ACF(OX#!%/P``!2H"AF8O]`"F$"."I``&`((0*U1```$`AB@A@J(`!0`"
+M$$``2"`C`(40*Q!```.69B_@AF(O]`""*"$PQ@`_AF<O]`#'$"."I``&`((0
+M*U1```$`AS`A@J(`!0`"$$``2"`C`(80*Q!```0L8@!`AF(O]`"","$L8@!`
+M4$```20#`#\LH@!`4$```20%`#\LP@!`4$```20&`#\P8P`_``42`#!"/P``
+M8A@E``8T`#P"`#\`PC`D/`(``"10```"0"`E-`6`Z`(`^`D`9C`ECF8OT!#`
+M``,"0"`E`@#X"30%@2".92_X)`+__Q"B``0\`@``)$(```!`^`D"0"`ECF4O
+M_"0"__\0H@`$/`(``"1"````0/@)`D`@)8YE,``D`O__$*(`!#P"```D0@``
+M`$#X"0)`("6.1@'X$,``!3P"```D0@```D`@)0!`^`DT!8!(CZ0`9*Y$`=R/
+MI0!L$*``*20"``&2HP`$,&(``E1```26H@`",&(`_J*B``26H@`"IN(``I*B
+M``2BX@`$DJ(`!:+B``62H@`&HN(`!I*B``>BX@`'CD(2-```("4``"@EK$0`
+M,*Q%`#0\`@``)$(```!`^`D"0"`ECD02-*R"`"BL@P`L/`(``"1"```"0"`E
+M`$#X"20%``$0```&)`(``8^E`'",H@``5$```:RC`````!`EC[\`7(^^`%B/
+MMP!4C[8`4(^U`$R/M`!(C[,`1(^R`$"/L0`\C[``.`/@``@GO0!@)[W_X*^_
+M`!BOL0`4K[``$`"`B"6.,`($,@(``Q!```\\`@``)$(```!`^`DT!9E$/`/?
+M_S1C__\`0Q`D,@8``0`&-T`\`P``)&,```(@("4T!9E$`&#X"0!&,"4R`@`,
+M$$``&P`"$((P0@`!%$``#CP"```D0@```B`@)0!`^`DT!8#0)`;_XSP#```D
+M8P```B`@)30%@-``8/@)`$8P)!````R/OP`8)$(```(@("4`0/@)-`6`T#P#
+M```D8P```B`@)30%@-``8/@)-$8`'(^_`!B/L0`4C[``$`/@``@GO0`@)[W_
+MZ*^_`!",@BRT`$#X"0```````A`KC[\`$`/@``@GO0`8)[W_R*^_`#2OM@`P
+MK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`("()0"@J"4D%``!/`(``"1"````
+M0/@)`B"P)0!`D"4``(`E/`(``"13``"6(@'H`@(0*Q!```8"("`E`F#X"0(`
+M*"500/_Y)A```0``H"42@`"8```0)3P"```D0@```B`@)30%F7P`0/@))`8`
+M`0``@"4\`@``)%0``#P"```0```$)%,```)@^`DD!``%)A```2X"`&100`"&
+M```0)0(@("4"@/@)-`6<(!!`__8N`@!D5$```SP"```0``!]```0)21"```"
+M("`E`$#X"0)`*"400`!W`B`@)3P"```D0@```$#X"30%F10P0S__ED(``C!"
+M`"`00``)``,0@#P#NBXT8XNC`$,`&0``$!```````````!````<``B$"/`+,
+MS#1"S,T`8@`9```0$``"(,(`````/`(``"1"````0/@))(0`9#P"```D0@``
+M`B`@)0)`*"4`0/@))Z8`$!!``%0"("`E/`(``"1"```T!9E\`$#X"0``,"66
+M0@`",$(`0!!``!XD!``*CB,!S!!D``TD`@`)4&(`#):B``)49``&EL(2<)8B
+M`=`L0@`$5$``!I:B``*6PA)P+$)0`Q1```L\`@``EJ(``C!"`*`D`P"@$$,`
+M!3P"```D0@```B`@)0!`^`D"0"@E/`(``"1"```"("`E`$#X"0*@*"4\`@``
+M)$(```(@("4`0/@)-`688#P#```D8P```B`@)30%F&``8/@)-$8``I)#``0P
+M8@`"5$``!)9"``(P8@#^HD(`!)9"``*FH@`"DD(`!**B``220@`%HJ(`!9)"
+M``:BH@`&DD(`!Z*B``>.(A(T```@)0``*"6L1``PK$4`-#P"```D0@```$#X
+M"0(@("6.)!(TK((`**R#`"P\`@``)$(```(@("4`0/@))`4``20"``&/OP`T
+MC[8`,(^U`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@GO0`X)[W_X*^_`!BO
+ML0`4K[``$`"`B"4`H(`E/`(``"1"````0/@)-`6`!#P#__PT8___`$,8)"0"
+M``$2`@`R*@(``E!```4D`@`&$@``'(^_`!@0```UC[$`%!("``4D`@`($@(`
+M*(^_`!@0```OC[$`%#P&$`$\$```)A````(@("4T!8`$`@#X"0!F,"4\`@``
+M)$(```(@("4`0/@))`4`%"0&_]\"("`E)`4`%`(`^`D`1C`D$```&X^_`!@\
+M!A`"/!```"80```"("`E-`6`!`(`^`D`9C`E/`(``"1"```"("`E`$#X"20%
+M`!0"("`E)`4`%`(`^`DT1@`@$```"8^_`!@\!A``/`(``"1"```"("`E-`6`
+M!`!`^`D`9C`EC[\`&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`$#P"``(D0H[<
+M`$#X"20%``*/OP`0`^``"">]`!@GO?_HK[\`%*^P`!``@(`E/`(``"1"````
+M`"@E`$#X"20&``$00``%`@`@)3P"``(D0H[<`$#X"20%`!./OP`4C[``$`/@
+M``@GO0`8)[W_T*^_`"BOM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@*`E`*"0
+M)3P"``(D0H[<`$#X"20%`!,00`"K`H`@)3P"```D0@`````H)0!`^`DD!@`!
+M$$``I`*`("4\`@`")$*.W`!`^`D``"@E$$``GX^_`"@20`";)`0`"HZ#`<P0
+M9``))`(`"5!B``B60P`"5&0`#Y:"`=26@@'0+$(`!%!```N6@@'4ED,``C!B
+M`"`40``%)!4`"#!C`-`D`@#`%&(`-R00``00```U)!``ZS!"`/`D0O_0+$(`
+M0%1```F60P`"CH(!S#A#``<L8P`!.$(`"RQ"``$`8A@E$&``%99#``(P8@`@
+M%$``!205``@P8P#0)`(`P%1B``.60@`"$```'R00`.LP0D``%$``'"00`>J6
+M0@`",$*``"Q0``$`$(`C)`+^``("@"00```4)A`"ZC!B`"`40``%``"H)3!C
+M`-`D`@#`5&(``Y9"``(0```+)!``JS!"0``40``()!`!JI9"``(P0H``+%``
+M`0`0@",D`OX``@*`)"80`JJ60P`",&(`0!!```PP8@`@5$``"S:U``0P8P#0
+M)`(`P%1B``.60@`"$```!3:U``0P0@!`5$```Y9"``(VM0`!ED(``C!"`0!0
+M0``!-K4``I9"``(P0@`0+%$``0`1B",D`O_]`B*()"8Q``,\`@``)$(```*`
+M("4`0/@)-`68?`!`F"660P`",&(`(!1```4\`@``,&,`T"0"`,`48@`5/`(`
+M`"12```"@"`E-`68!`)`^`D"(#`E`H`@)30%H@`"0/@)`J`P)1)P`!X"@"`E
+M-`68?`)`^`D"`#`E/`(``"1"````0/@))`0!+!```!8D`@`!$G``"21"```"
+M@"`E-`68?`!`^`D"`#`E/`(``"1"````0/@))`0!+#P0```F$````H`@)30%
+MF`0"`/@)`B`P)0*`("4T!:(``@#X"0*@,"4D`@`!C[\`*(^U`"2/M``@C[,`
+M'(^R`!B/L0`4C[``$`/@``@GO0`P)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`D
+MK[0`(*^S`!ROL@`8K[$`%*^P`!``@*`EKZ4`/`#`B"4"@+@E/`(``"1"````
+M0/@)KB````!`J"42H`#GC[\`-([C+\`X8@`"+$(``2QC``$`0Q`E$$```B0"
+M``&N(@``CO`OP"0"``$6`@!YCZ,`/#P"```D0@```H`@)0!`^`DT!9D@/`,`
+M`0!#$"040`!PCZ,`/*[@+\"N,`````"0)3P"```D40``/`(``"1>```"@"`E
+M`B#X"30%G!``0)@E`H`@)0(@^`DT!9P4`$"`)0*`("4"(/@)-`6<&`!`L"4`
+M$Q`K`!`8*P!#$"040``.`!,B`@*`("4"(/@)-`69(`*`("4T!9D@/`,``0/`
+M^`D`0S`E)E(``2I"``H40/_E`H`@)0`3(@(`$!("`((@(0`0*<(`!!@K**(`
+M`CA"``$`8A@D$&``8@`6$",``A8```*6`P)$`!H``!`24(```0`'``T`0)`E
+M*D+_X!!```,J0@`@$````R02_^!00``!)!(`'P)E`!L``!`24*```0`'``TD
+M4_^`*F+_\!!```,J8@`0$````R03__!00``!)!,`#SP1```F,0```H`@)0(@
+M^`DT!9D@)`/X'P!#$"0`$C%`,,8'X#P0```F$````H`@)30%F2`"`/@)`$8P
+M)0*`("4"(/@)-`69("0#_^``0Q`D,F8`'P*`("4T!9D@`@#X"0!&,"4"@"`E
+M`B#X"30%F2`"@"`E-`69(`(`^`DT1@@`)`(``J[B+\`D`@`!KJ(`$**R`!00
+M```AHK,`%91B``(P0@"@)`,`H!!#`!PD`@`"CN,OP!1B`!H\`@``CJ(`$%1`
+M`!<\`@``/!```"80```"@"`E`@#X"30%F2`\$0``)C$```*`("4T!9D@`B#X
+M"31&\``"@"`E`@#X"30%F2`\!@`!`H`@)30%F2`"(/@)`$8P)20"``&NXB_`
+M/`(``"1"```"@"`E`$#X"0*@*"66H@`",$(``A1``#*/HP`\/`(``"1"```"
+M@"`E`$#X"30%F&`\`P``)&,```*`("4T!9A@`&#X"31&``*/H@`\E$4``C"B
+M`0!40``+CH0!S):"`=0P0@#P)$+_T"Q"`$`00``C)`(``3"B`$`00``@)`(`
+M`8Z$`<PX@P`'``,8*SB"``L``A`K`&(8)!!@`!<D`P`*$(,`%20"``D0@@`4
+M)`(``12#``8\`@`"EH(!T"Q"``040``.)`(``3P"``(D0KD``$#X"0*`("40
+M```()`(``91B``(T0@`"I&(``I:B``(P0O_]IJ(``B0"``&/OP`TC[X`,(^W
+M`"R/M@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#@GO?_0K[\`
+M**^S`"2OL@`@K[$`'*^P`!@`@(@E`*"`)18```.OL``0)`+__Z^B`!".(P',
+M)`(`"1!B``<D`@`*%&(`"#P"``"6(@'0+$(`!!!```0\`@``)`+_[P("@"0\
+M`@``)$(```(@("4`0/@))`4`##P"```D4P```B`@)20%0``"8/@)`@`P)3P"
+M```D0@```$#X"20$``^/H@`0,$(``Z^B`!`R$``#/`(``"1"```"("`E)`5`
+M`(^F`!``0/@)`@`X)0!`D"4R`@`!%$``(`)`$"4D`@`4KZ(`$#1"``&OH@`0
+MDZ<`$">C`!"08@`!``(2``#B."608@`"``(4``#B."609@`#``8V``(@("4D
+M!0`4`F#X"0#F,"4\`@``)$(```(@("4``"@E`$#X"20&``$00``%/`(``"1"
+M```"("`E`$#X"20%`,`"0!`EC[\`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`
+M,">]_^BOOP`0/`(``"1"````0/@)-`689``"%,(P0P'_,&(!`!!```(X8@'_
+M``(8)P!@$"6/OP`0`^``"">]`!B4H@`",$,!X"0"`,!08@`1E((2T"AB`,$0
+M0``&)`(!0"0"`*!08@`)E((2S@/@``@``!`E`````!1B``@`````E((2S!``
+M``>DP@``$```!:3"```0```#I,(```/@``@``!`E)`(``0/@``@`````)[W_
+MV*^_`"2OL@`@K[$`'*^P`!@`@)`E`*"()3P"```D0@```$#X"30%F&`P0@`"
+M%$``&```@"4\`@``)$(```!`^`D"0"`E`$"`)3P"``(D0I",`D`@)0(@*"4`
+M0/@))Z8`$!!```F'H@`0`%`0*E!```BF,``6EB(``C1"``*F(@`"$````@``
+M@"4``(`EIC``%@(`$"6/OP`DC[(`((^Q`!R/L``8`^``"">]`"@GO?_8K[\`
+M(*^S`!ROL@`8K[$`%*^P`!``@)`ECD(!X#P#(```0Q`D$$``+`)`F"4\$```
+M)A```"0%!"`"`/@))`8``0)`("4D!08``@#X"0``,"4\`@``)$(```)`("4`
+M0/@))`4&``)`("4D!08``@#X"31&``@"0"`E)`4&!#P&`!`"`/@)-,8"`0)`
+M("4D!08@`@#X"0``,"4``(`E/`(``"11```"0"`E)`4$``(@^`D"`#`E`A,0
+M(0)`("4D!00$`B#X"9!&+S@F$``!*@(`@!1`__4"0"`EC[\`((^S`!R/L@`8
+MC[$`%(^P`!`#X``()[T`*">]_^BOOP`0`(!H)0``("4DRO__``I0PB3&__\P
+MQ@`'`*!()1B@`!P``%@E)`P``0`'.,``R4`A+0(`"5!```$D"``(`0P0!"1"
+M__\`S!@$)&/__P!#$"8`XA`$``H8@`!M&"&,8P```$,0)`#B$`8`PA`&`6(0
+M!`""("4!!A`C`6)8(0$F$"$D2?_X```P)1T@_^@E2@`!/`(``"1"````0/@)
+M`````(^_`!`#X``()[T`&">]_]BOOP`DK[0`(*^S`!ROL@`8K[$`%*^P`!``
+M@)@E`*"`)93"``(P0P'@)`(`P!!B``\"8*`E*&(`P1!```8D`@%`)`(`H!!B
+M``<``!`E$```6H^_`"048@!7```0)1````0``!@E$````B0#``$D`P`"``,8
+M0":$``0`9!`AE%(2YI1"$NP``A&``D*0)0!D$"&40A+R``(3``)"D"4`9!`A
+ME$(2^``"%(`"0I`E`&00(91"$OX``A8``D*0)0!D$"&441,$E$(3"@`"$8`"
+M(H@E`&00(91"$Q```A,``B*()0!D$"&40A,6``(4@`(BB"4`9!@AE&(3'``"
+M%@`"(H@E)`(``5("``8"0(@E$@``!"0"``(6`@`G```0)0(@D"46,@`./`(`
+M`"1"```"8"`E`$#X"30%H@@D!M__/`,``"1C```"8"`E-`6B"`!@^`D`1C`D
+M$```#*Z0+[PD0@```F`@)0!`^`DT!:((/`,``"1C```"8"`E-`6B"`!@^`DT
+M1B``KI`OO#P0```F$````F`@)30%F6`"`/@)`D`P)0)@("4T!9ED`@#X"0(@
+M,"4D`@`!C[\`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"B,@P',)`8`
+M"E!F`!DD`P`H)`(`"5!B`!8D`P`H5&8`!HR"`<R4@@'0+$(`!!1``!`D`P`H
+MC((!S#A#``<L8P`!.$(`"RQ"``$`8A@E%&``""0#`"B4@@'4,$(`\"1"_]`L
+M0@!`$$```B0#`"`D`P`HE*(```!#`!L``!`04&```0`'``T``A@K)$+_]BQ"
+M``TX0@`!`^``"`!B$"0GO?_`K[\`/*^^`#BOMP`TK[8`,*^U`"ROM``HK[,`
+M)*^R`""OL0`<K[``&`"`H"6OI0!$E*(``@`"$<(P0@`!KZ(`$)2B``(P0P'P
+M)`(!0!!B`!\"@*@E*&(!01!```\D`@C`)`(`P!!B`$4H8@#!$$``!B0"`-`D
+M`@"@$&(`/@``$"40``%IC[\`/!!B`#P``!`E$``!98^_`#P08@`X*&((P1!`
+M``8D`@E`)`(!4!!B``<``!`E$``!7(^_`#P08@`#)`()4!1B`5<``!`EEH(!
+MU#!"`/`D0O_0+$(`0!1``"@``/`ECH0!S#B#``<``Q@K.((`"P`"$"L`8A@D
+M$&``("0#``H0@P`>)`(`"1""`!T\`@``%(,`!B1"``"6@@'0+$(`!!1``!<\
+M`@``)$(```*`("4`0/@)-`691"0#_\<`0Q`DCJ,L+(1F````!C#`,,8`.#P#
+M```D8P```H`@)30%F40`8/@)`$8P)1````4\`@``$````B0>``$D'@`"/`(`
+M`"1"```"@"`E`$#X"30%F1`D`_P&`$,0)``>B$`FL@`$`C(8(91C$N```QD`
+M`$,0)3P0```F$````H`@)30%F1`"`/@)-$8``3P"```D0@```H`@)8ZE+[P`
+M0/@)CZ8`1`(RB"&6)A+(,,8!_P*`("4T!9EH`@#X"33&`@"6HA)P+$)0`!1`
+M`!D`'A!`CZ,`1)1B``(P0@`0$$``$X^B`!```B!`)((30`)"$"&44```CZ,`
+M$"1B$T@"0A@A@',```*B$"&`5@`&)((32`*B$"&45P``)(034`*D("&4A```
+M$```$Z^D`!0`'A!`)J0``@!$$"&44!*@`]40(8!3$L:/HP`0)&(2R`*B$"&`
+M5@`!``,80"1B$J@"HA`AE%<``"1C$S``@R`AE(0``*^D`!0\$@``)E(```*`
+M("4"0/@)-`681"0#P'\`0Q`D`!`QP##&/X`\$0``)C$```*`("4T!9A$`B#X
+M"0!&,"4"@"`E`D#X"30%F%`D`_\``$,0)#)F`/\"@"`E-`684`(@^`D`1C`E
+M`H`@)0)`^`DT!9A0/!/__S9S`/\`4Q`D`!8R`##&_P`"@"`E-`684`(@^`D`
+M1C`E`H`@)0)`^`DT!9A(/`/__#1C#_\`0Q`D`!<S`#P#``,T8_```,,P)`*`
+M("4T!9A(`B#X"0!&,"4`'H!``A40(91"$KH``C8```(4``#","4"%1`AE$,2
+MP``#$@``PC`E`H`@)30%F#0"(/@)`,,P)0*`("4"0/@)-`68*`!3$"0"%1@A
+ME&82K@`&,@`"@"`E-`68*`(@^`D`1C`E`H`@)0)`^`DT!9AD/`/_^#1C#_\`
+M0Q`D`A6`(98&$K0`!C,`/`,`!S1C\```PS`D`H`@)30%F&0"(/@)`$8P)9:B
+M$G`L0C`#$$``#"00``*6@P'*)`(0(A1B`!,\`@``CZ,`1)1B``(P0@!`5$``
+M#200``@0```,/`(``#P"```D0@```H`@)0!`^`F/I0!$$$``!``>$$``51`A
+ME$(3)@("@"$\`@``)$(```*`("4`0/@)-`69)"0#_P$`0Q`D`!`P0##&`/X\
+M`P``)&,```*`("4T!9DD`&#X"0!&,"6/HP!$C&(`$!!```2/H@`0@'``%!``
+M``B`<@`5``(80"1B$[`"HA`AE%``!B1C$[@"HQ@AE'(``CP1```F,0```H`@
+M)0(@^`DT!9D@)`/X'P!#$"0`$#%`,,8'X#P0```F$````H`@)30%F2`"`/@)
+M`$8P)0*`("4"(/@)-`69("0#_^``0Q`D,D8`'P*`("4T!9D@`@#X"0!&,"4"
+M@"`E`B#X"30%F2`"@"`E-`69(`(`^`DT1@@`EJ02<"R"0`%40``=EJ(2<(^C
+M`$248@`",$(`T"0#`-`40P`%/`(``"R"4`!40``4EJ(2<#P"```D0@```H`@
+M)0!`^`DT!:(,/`/_`S1C__\`0Q`DCZ,`%``#-(`\`P#\`,,P)#P#```D8P``
+M`H`@)30%H@P`8/@)`$8P)9:B$G`L0E`!%$``""0"``$\`@``)$(```*`("4T
+M!9G@`$#X"0``,"4D`@`!C[\`/(^^`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R
+M`""/L0`<C[``&`/@``@GO0!`)[W_F*^_`&2OO@!@K[<`7*^V`%BOM0!4K[0`
+M4*^S`$ROL@!(K[$`1*^P`$``@*`E`*#P):^@`!"OH``4KZ``&*^@`!ROH``@
+MKZ``)*^@`#@``+@EKZ``/"0#``&GHP`H)`(``J>B`"JGH@`LIZ,`+J>C`#"G
+MH@`RIZ,`-)?"``(``A'",%,``1)@``>7PP````,0@`!#$"$``A!`)$*F*!``
+M``@P0O__``,0@`!#$"$``A!`/`/__S1C0)@`0Q`A,$+__P!`D"67P@`X%$``
+M'P!`B"4T$8``E\(``C!"`!`00``")`,`5R0#`*X``(`E`D.P(Q````("0Z@A
+M,%#__RX"``500``1I]$`.(Z"`<0"@"`E`@`H)0!`^`D"8#`E-`.``!!#``@P
+M0S__`'80*A1`__(F`@`!`J,0*A1`_^\F`@`!`&"():?1`#@T`H``5B(`89?"
+M``(\`@``)%(```*`("4"0/@)-`69(#P#0```0Q`D$$`!<0*`("4"0/@)-`69
+M##P&`/\TQO__/!```"80```"@"`E-`69#`(`^`D`1C`D`H`@)0)`^`DT!9D@
+M/`:/_S3&__\"@"`E-`69#`(`^`D`1C`D`H`@)30%F:`"`/@)```P)0*`("4T
+M!9F``@#X"0``,"4"@"`E`D#X"30%F80\$?_P`H`@)30%F80"`/@)`%$P)`*`
+M("4T!9F8`@#X"0``,"4"@"`E`D#X"30%F9P"@"`E-`69G`(`^`D`43`D`H`@
+M)30%F0`"`/@)```P)0*`("4T!9D$`@#X"0``,"4"@"`E-`69"`(`^`D``#`E
+M`H`@)0)`^`DT!9D,)!'```*`("4T!9D,`@#X"0!1,"0"@"`E-`69B`(`^`D`
+M`#`E`H`@)30%F8P"`/@)```P)0*`("4T!9F0`@#X"0``,"4"@"`E`D#X"30%
+MF90"@"`E-`69E`(`^`D`43`D$``!&X^_`&0P10'P)`(`T!"B`#`",B`C**(`
+MT1!```8D`@%`)`(`P!"B`!8`!!%`$```-@!$$",0H@`%)`(!4!"B`"0`!!%`
+M$```,`!$$",`!+Q`/`)1ZS1"A1\"X@`8```0$``"$,,`%Q_#`$.X(P`7$H.O
+MH@`\)`,,-1```"&OHP`X``0J`#P""4\T0B"5`*(`&```$!```A!#``4?PP!#
+M$".OH@`\``2\0#P"4>LT0H4?`N(`&```$!```A##`!<?PP!#N",D`@PU$```
+M#:^B`#@`!+P`/`)1ZS1"A1\"X@`8```0$``"$,,`%Q_#`$.X(P`7$H.OH@`\
+M)`,8:J^C`#@`!!%``$00(P`"$(``1!`A``(9P(^D`#@`9``:```0$E"```$`
+M!P`-`$`8)3!B``\D"``$%$```R>E`"@D"``#)Z4`,!$``%H``(`E``,Q`RC)
+M`!TD!P`!$2``PP#0$"$D1``9+((`(1!``!$D@__?*((`&A!```8H@@`;`(<0
+M!(^C`!``0Q`E$```$*^B`!`40``/)((``22"__\`1Q`$CZ,`$`!#$"40```(
+MKZ(`$"QB`!000``&)((``0!G$`2/HP`4`$,0):^B`!0D@@`!+$(`$!!```LD
+M@O_Q`!`00`!%$"&40P````000"1"``(`0Q@$CZ(`&`!B&"40```GKZ,`&"Q"
+M`!`00``+)(+_X0`0$$``11`AE$,````$$$`D0O_B`$,8!(^B`!P`8A@E$```
+M&J^C`!PL0@`0$$``"R2"_]$`$!!``$40(91#````!!!`)$+_P@!#&`2/H@`@
+M`&(8)1````VOHP`@+$(`!Q!```LF`@`!`!`00`!%$"&40P````000"1"_Z(`
+M0Q@$CZ(`)`!B&"6OHP`D)@(``3!0__\""!`J%$#_JP`````\$0``)C$```*`
+M("4"(/@)-`69##P#`/\T8___`$,0)#P&_P`\$```)A````*`("4T!9D,`@#X
+M"0!&,"4"@"`E`B#X"30%F2`\!G```H`@)30%F2`"`/@)`$8P)8^E`#P`!34`
+M/`(_\`#","0\$@`/-E+__P+R$"0`PC`E/`)```*`("4T!9F@`@#X"0#","4"
+M@"`E-`69@`(`^`F/I@`0`H`@)0(@^`DT!9F$/!/_\`!3$"2/I@`4`-(P)`*`
+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
+M`$`D`O_!CZ,`B*1B``"/H@"$I%X``#P"```D0@```$#X"205`#\P4@#_``"`
+M)8^C`'"48A-T$$``):^@`$0F-P`&,E8`^``0$$`D0A-P`N(0(91#```08``8
+M,D3__Q!D``<`$"F`E$(``#!"``<T0@#@5((`$B80``$`$"F``B4H(9:$```\
+M`P`")&.R>`!@^`DDI1?4)`0`X%;$``P`0*@E`$`8)3!B__\"HA`K5$```0*@
+M&"4P=?__)A```98B$W0"`A`J%$#_X``0$$"6@@`",$(`T"0#`,!40P`L`J#P
+M)3)"`/@T4@`!EB(3=!!``"<``(`E)C<`!C)6`/@`$!!`)$(3<`+B$"&40P``
+M$&``&#)$__\09``'`!`I@)1"```P0@`'-$(`X%2"`!(F$``!`!`I@`(E*"&6
+MA```/`,``B1CLG@`8/@))*47U"0$`.!6Q``.`$#P)0!`&"4P8O__`\(0*U1`
+M``$#P!@E,'[__R80``&6(A-T`@(0*E1`_^``$!!`$````I:"``*6@@`",$(!
+M`%!```*")A*/@B82CCP"```D0@``CZ0`<`!`^`D"@"@E``(6```"A@.6@P`"
+M,&(`0!!``)@P8@"`$$``"R>B`!B6)Q><KZ(`$#P"``(D0K14CZ0`<`*`*"4`
+M0/@))B87GA````J/H@!`EB<72J^B`!`\`@`")$*T5(^D`'`"@"@E`$#X"28F
+M%TR/H@!``%`8(P*C$"I40``!`J`8)0`#%````C0#EH(``C!"`!`00``:EZ,`
+M'I8B$G`L0C`!5$``")8B$G"6(Q)^`,,0*E1```$`P!@E``,4```"-`.6(A)P
+M+$)``!1```R7HP`>EH(``C!"`(`00``)`,,0*I8C$H``PQ`J5$```0#`&"4`
+M`Q0```(T`Y>C`!X`PQ`J5$```0#`&"4``Q0```(4`Z^B`$2/HP`X``,00(^D
+M`$0`@A`C``(4```"-`,`!A`G``(7PP#","2/H@`\`$`8)0#"$"I40``!`,`8
+M)0`#%`"/HP"`$&``/``"-`.F9@`(IF8`!J9F``2F9@`"IF8``)>D`!PP@___
+M,,+__P!#$"L00``"`,`H)0#`("6F9``*EZ0`&C"#__^68@```$,0*U1```&6
+M9```IF0`#)>D`!@P@___EF(```!#$"M40``!EF0``*9D``X`!!0```(<`Y8B
+M$G`L0D``5$``%I9B``"6@@`",$(`@!!```<`P"`EEB(2A`#"$"I00``(EH(`
+M`A````H`P!`EEB(2@@""$"H40``&`,`0)9:"``(P0@"`4$```I8B$H*6(A*$
+M$````J9B`!ZF8@`>CZ0`B(2"```0```(KB(O\)>C`!@`PQ`J$$```@#`*"4`
+MP!@E``,4```"'`./H@"$I$,``(^C`(BD90``EH,``C!B`"!40``&EB<7O#!C
+M`-`D`@#`%&(`78^B`("6)Q>\)Z(`**^B`!`\`@`")$*T5(^D`'`"@"@E`$#X
+M"28F%[Z/I`!``)`8(P/#$"I40``!`\`8)0`#%````C0#EZ,`+@##$"I40``!
+M`,`8)9>C`"X`PQ`J5$```0#`&"6/I``X``000`!B$",``A0```(T`P`&$"<`
+M`A?#`,(P)(^B`#P`0!@E`,(0*E1```$`P!@E``,4`(^C`(`08``=``(T`Y>C
+M`"X`PQ`J5$```0#`&"6F8P`0EZ,`+`##$"I40``!`,`8):9C`!(``Q0```(L
+M`Z9C`!27HP`J`,,0*E1```$`P!@EIF,`%J9C`!B7HP`H`,,0*E1```$`P!@E
+MIF,`&@`#%````B0#$```#:9C`!R7HP`L`,,0*E1```$`P!@E``,4```"+`.7
+MHP`H`,,0*E1```$`P!@E``,4```")`./HP"$A&(```""$"I40``!I&0``(^D
+M`(B$@@```$40*E1```&DA0``CZ(`@!!```:/HP"(A&(``*XB+\B6(B_*CZ0`
+M<*2"`?XD`@`!C[\`;(^^`&B/MP!DC[8`8(^U`%R/M`!8C[,`5(^R`%"/L0!,
+MC[``2`/@``@GO0!P)[W_L*^_`$ROO@!(K[<`1*^V`$"OM0`\K[0`.*^S`#2O
+ML@`PK[$`+*^P`"@`@*`EKZ4`5(Z"+,``0/@)`,"X)1!``#R/OP!,AH(!_"A"
+M`$`40``"EH,!_"0#`#\``Q0```*<`RIC`#\X8P`!,F+__RQ"``$`8A@E$&``
+M!SP#```D8UB$CH("```"$$``0Q`A$````H12`````)`E$N``(P``B"4GM@`@
+M)[4`(CP"``(D7JD(`!$0P(^C`%0`8H`AKZ``$*^V`!2OM0`8`H`@)0(`*"4"
+M0#`E`\#X"0)@."400``4C[\`3(>B`"*"`P`&`$,0*A!```2'H@`@DZ(`(Z("
+M``:'H@`@@@,`!P!#$"H00``#)C$``9.B`"&B`@`'`C<0*Q1`_^0`$1#`)`(`
+M`8^_`$R/O@!(C[<`1(^V`$"/M0`\C[0`.(^S`#2/L@`PC[$`+(^P`"@#X``(
+M)[T`4">]_\"OOP`\K[(`.*^Q`#2OL``P`*"0)0"`@"6&$1*:/`(``"1"```G
+MI``0)@5&@`!`^`DD!@`@)`D`"">J`!`D#0`()`X`/P`)&$`!0Q@AE&(```!1
+M$".D8@`````X)0``6"4`"6!``&`P)83"```$0@`!I,```!3M``,!3"@A$```
+M&"0'``^4J```A*0````'$$``4!`AE$-&@"3B``$4@P`0,$?__Q2```0M8@`S
+M)0(``1````BDH@``%$``!)3"```D0@`!$````Z3"```D0O__I,(`````."4E
+M8@`!,$O__RSB`!!40/_AA,(````)$$`!0A@AA&(``"A"`$!00``!I&X````)
+M($``D!`AE$-&@`!R&",``Q`G``(7PP!B&"0!1"`AA(0``(X"1G@`!"!``((@
+M(0`#&$``8A@AE&(``*2"```E(@`!,$G__RTB``\40/^]``D80"0)``@GI``0
+M``D00`!0&"$`@A`AE$(``*1B1H`E(@`!,$G__RTB``]40/_X``D00(^_`#R/
+ML@`XC[$`-(^P`#`#X``()[T`0">]_\"OOP`\K[(`.*^Q`#2OL``P`*"()3"2
+M__^6(@``$$``$0``,"4GI``8``880`"#&"$`!A#``%$0(91"``"D8@``),8`
+M`2C"``@00``'`,"`)0`&$,``41`AE$(``!1`__,`!AA``,"`)2>B`"JOH@`0
+M/`(``"1"```"0"`E)Z4`&##&__\`0/@))Z<`*!H```\``#`EEZ,`*)>B`!@0
+M8@`-EZ(`*B>D`!@DQ@`!`-`0*E!```>7HP`H``800`""$"&40@``5&+_^23&
+M``&7HP`HEZ(`*A1B``,`!A#`4'(`!P!1$"$`41`AC$(`!!!```0D`P`_``80
+MP`!1$"&40P`"`&`0)8^_`#R/L@`XC[$`-(^P`#`#X``()[T`0#"$__\PI?__
+M,,;__S#G__^7J``2`.@`&```&!(08``E```0)5#%`"(`X!@E`(40(P`"&$``
+M8A@A``,8P`!B&"$``QB``,40(P!B`!H``!@24$```0`'``T``QP```,D`P2`
+M`!,`X!@E*((`91!``!`!`!@E`(@`&```&!(D`@!D`$00(P!'`!@``!`2`&(8
+M(3P"4>LT0H4?`&(`&```$!```A%#``,?PP!#$",P0___`&`0)0/@``@`````
+M)[W_N*^_`$2OM`!`K[,`/*^R`#BOL0`TK[``,`"@F"4`P)`EC[0`6##P__\2
+M```.```@)2>E`!@`!!A``*,8(0`$$(``1!`A``(00`!2$"&40@`(I&(``"2$
+M``$`D!`J%$#_]@`$&$"69```)Z(`*J^B`!`\`@``)$(``">E`!@"`#`E`$#X
+M"2>G`"@``$`E```X)0``("4GHP`8EZ8`*)>E`"H`D!`J4$``#99D````!!!`
+M`&(0(91"``!0P@`!,(?__P`$$$``8A`AE$(``%2B__0DA``!,(C__Y9D``"7
+MI0`HEZ8`*@`'B(`")X@A`!&(0`(RB"&6)P`&``B`@`((@"$`$(!``A*`(98"
+M``8\$@`")E*SF`)`^`FOH@`0IH(`!I9D``"7I0`HEZ8`*I8G``26`@`$`D#X
+M":^B`!"F@@`$EF0``)>E`"B7I@`JEB<``I8"``("0/@)KZ(`$*:"``*69```
+MEZ4`*)>F`"J6)P``E@(```)`^`FOH@`0IH(``(^_`$2/M`!`C[,`/(^R`#B/
+ML0`TC[``,`/@``@GO0!(CZH`$##&__\PA/__``000`!$$"$``A#``$00(0`"
+M((``!C!`E*,````#$$``0Q`A``(0P`!#$"$``A"`)$+_]@""$"L00``%`*9`
+M(92B``"E0@```^``"*3B``"5`__^``,00`!#$"$``A#``$,0(0`"$(`D0@`*
+M`$00*Q!```P`J!`KE0+__J5"```#X``(I.(``*5&```#X``(I.8``*3B``"4
+MH@`"`^``"*5"```00``;``04```"3`.$HP````,00`!#$"$``A#``$,0(0`"
+M$(``21`C)$(`"2Q"`!,40/_LE*8``)2C``(``Q!``$,0(0`"$,``0Q`A``(0
+M@"1"__8`@A`K5$#_Y92B```DI0`"`*@0*U1`_^F$HP```^``"```````@#`E
+ME,(!U#!"`/`D0O_0+$(`0!!``!(DQ2P0/`0``"2$6@",@P`$K,,L$``#$,``
+M0Q`A``(0@"2$``@`1!`AK,(L+"0"``&LPBPH)`(`%*S"+!PD`@!5`^``"*S"
+M+"`\!```)(18D(R#``2LHP````,0P`!#$"$``A"`)(0`"`!$$"&LH@`<)`(`
+M`:RB`!@D`@`4K*(`#"0"`",#X``(K*(`$">]_^BOOP`4K[``$`"`&"648@'4
+M,$(`\"1"_]`L0@!`$$``%@"@@"6,8BRP`$#X"20%``<\`P`")&.2I`!`("4D
+M!0`!)`8`)`!@^`D``#@E``!()20'`&L``"`E)`,``11#`"8D!@!K)`<`4R0&
+M`%,D`@`W$```(:X"`!",8BRP`&`@)0!`^`DD!0`'/`,``B1CDJ0`0"`E)`4`
+M!B0&`"4`8/@)```X)0!`&"4``$@E)`(`/Q1B``,D9P`$)`<`,B0"`#\08@`"
+M`2`@)20$`$`DA@`R)`(`/Q1B``:N"0`,)2(`%*X"``PD@@`C$````ZX"`!`D
+MP@`%K@(`$(X%``0`J1`K`.48*P!#$"400``&``!`)0"D$"L`Q1@K`$,0)51`
+M``$D"``!`0`0)8^_`!2/L``0`^``"">]`!@GO?_HK[\`%*^P`!``@(`EA@8O
+M](X"+_``PC`A``8R0##&?@`\`@``)$(``#0%F3``0/@)-,:``"0"``&N`B_$
+MC[\`%(^P`!`#X``()[T`&">]_^"OOP`<K[(`&*^Q`!2OL``0`("()0(@D"4F
+M,"P0CB,L*!!@`$H``!`ECB,OQ"0"``%48@!&CB(OQ#P"```D0@```D`@)0!`
+M^`DT!9DP`$`8)3!B@`!40``]CB(OQ``#)D(``Q7",$(``R0#``(40P`+K@0`
+M!)9"`=(L0@!"5$``!8X"``26(A*:`$00(1````.N`@`$)$(`!:X"``260@'4
+M,$(`\"1"_]`L0@!`4$``#:X@+\0\`@`")$*\D`!`^`D"0"`EC@0`!(X#`!0`
+M@Q`K5$```ZX```0`@Q`CK@(`!*X@+\0\`@`")$*WQ`)`("4`0/@)`@`H)51`
+M`!2.(B_$/`(``B1"NK@"0"`E`$#X"0(`*"400``,/`(``B1"NN@"0"`E`$#X
+M"0(`*"580``'CB(OQ"0"``*N(B_$)`(``:XB+]BN("_`CB(OQ(^_`!R/L@`8
+MC[$`%(^P`!`#X``()[T`((RC``2,H@`,`$,0*Q!```4``"`EC*(`$`!B$"L4
+M0``"`````"0$``$#X``(`(`0)0"@."64@@'4,$(`\"1"_]`L0@!`/`,``!1`
+M``,D:%H`/`(``"1(6)",Y`````00P`!$$"$``A"``0(0(21"``BLX@`<C.(`
+M!(SC`!``0Q`K5$``(XSB``00@`!1)`+__XSB``2LX@`(C.,`$`!#$"L40``9
+M`&!()8SB```00``6`````"1&__^LY@````8@P`"&("$`!""``(@0(8SE`!R,
+M0P`8C*(`$`!B&",``QA`C.(`"`!#$".LX@`(`00@(22$``@`21`K%$```ZSD
+M`!Q4P/_LC.(```/@``@D`@`!C.,`#`!B&"L48``M```0)8T#```D8___C.0`
+M`!"#`"@D`O_^C.,`!*SC``B,X@`,`$!()0!#$"L40``A)`(``HT#```D8___
+MC.(```!`("4`0Q`K$$``&B0"``(DA@`!K.8````&(,``AB`A``0@@`"($"&,
+MY0`<C$,`&(RB`!``8A@C``,80(SB``@`0Q`CK.(`"`$$("$DA``(`2(0*Q1`
+M``:LY``<C0(``"1"__\`PA`K%$#_Z0#`("4D`@`"`^``"``````GO?_8K[\`
+M)*^T`""OLP`<K[(`&*^Q`!2OL``0`("()28R+!"N("PDCB(LL`!`^`DD!0`'
+M/`,``B1TDJ0`0"`E)`4``20&`"0"@/@)```X)0!`F"4D`@`!%F(`((^_`"2.
+M(BPLA%```(XB++`"("`E`$#X"20%``<`0"`E)`4`!"0&`"`"@/@)```X)1(3
+M``H`0!@E4@``$*Y``!0D`@`"$@(`!R0"``,2`@`)C[\`)!````N/M``@$```
+M!ZY#`!0``Q!`)$+_^Q````.N0@`4``,00*Y"`!2/OP`DC[0`((^S`!R/L@`8
+MC[$`%(^P`!`#X``()[T`*">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)0#`B"4`
+MX(`E/`(``"1"````H"`E`$#X"0(@*"4`0#@E)@;__P`&,,(F$/__&B``(#(0
+M``<D"0`!CZ(`,``"0,`D"@`(`A$8(2AB``E00``!)`,`"`!I&`0D8___`@D0
+M!"1"__\`8A@F`0,8!``&*(``LB@A``,@)XRB````@B`D`@<0!`$"$`0`0Q`D
+M`$00):RB```",!`A)%'_^`%0$",`1S@&``"`)1X@_^8DQ@`!C[\`'(^R`!B/
+ML0`4C[``$`/@``@GO0`@)[W_P*^_`#ROO@`XK[<`-*^V`#"OM0`LK[0`**^S
+M`"2OL@`@K[$`'*^P`!@`H)`EED(``C!"0``00``'`("P)3P"```D0@```$#X
+M"20%`@`0```5`$"8)99"``(P0H``$$``!SP"```D0@```L`@)0!`^`DD!00`
+M$```"P!`F"6610`",*4`$"RE``$`!2@C,*4`_B1"```"P"`E`$#X"22E``(`
+M0)@ECF(``!A``!P``(@E/`(``"17```T%8<`/`(``"14````$8!``A&`(0`0
+M@(`F$``@`G"`(9('``NOH``0`L`@)0)@*"4"X/@))`8`#I(%``@`!2B``L`@
+M)0"U*"$"@/@)`$`P)28Q``&.8@```B(0*A1`_^P`$8!`ED(``C!"`!`40``Y
+MC[\`/#P"```D0@```L`@)0!`^`DD!0`(`$"8)8YB```80``O``"()3P>```D
+M%P`!`!$00`!1$"$``A"`)$(`(`)B@"&2`@`(``(0@#0#AP``0Y`AD@(`!51`
+M`!TF,0`!D@<`"Z^@`!`\`@``)%4```+`("4"8"@E`J#X"20&``XGU````L`@
+M)0)`*"4"@/@)`$`P)9("``D00``,``(0@`)"D"&2!P`+K[<`$`+`("4"8"@E
+M`J#X"20&``X"P"`E`D`H)0*`^`D`0#`E)C$``8YB```"(A`J%$#_U@`1$$"/
+MOP`\C[X`.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]
+M`$`GO?_8K[\`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("()0"@@"4\`@``)$(`
+M``!`^`DT!8`<,$,_@)8"``(P0D``$$``!R03`00\!Q^`/`(`&R0&`!,D$@VL
+M$```!R04`!0D$P#2/`<?@#P"`#8D!@`))!(-2"04``H`PS`E`,(P)3P0```F
+M$````B`@)30%@!P"`/@)`,<P)0(@("4D!1!P`@#X"0)@,"4"("`E)`40L`(`
+M^`D"0#`E/`(``"1"```"("`E`$#X"20%$/`\`__P-&,#_P!#$"0`%#*``B`@
+M)20%$/`"`/@)`$8P)8^_`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H
+M)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`F"4`H(`ECF,L1#P%?_\T
+MI?__/`(``"1"````0/@)`&4H)`!`H"4\`@``)$(```)@("4`0/@))`4`,`!`
+M("4PD0/P`!&)`A(```8"()`E)`(`)0!1$",``A!"$```!`(BD"$N(@`"+$(`
+M`0)"D",240`*)`/\#P"#&"0`$C$`,,8#\#P"```D0@```F`@)20%`#``0/@)
+M`&8P)3P"```D0@```F`@)0!`^`D"@"@E`E$0)@`"$"N/OP`DC[0`((^S`!R/
+ML@`8C[$`%(^P`!`#X``()[T`*">]_^BOOP`0`*`X)0"`0"64@P'H`.,8*A!@
+M``D``!`E``<I``"G*",`!2B``04H(3P"```D0@```$#X"22E+."/OP`0`^``
+M"">]`!@GO?_HK[\`$`#`0"4`@#@EE(,!Z`"C&"H08``*```0)0`%,0``Q3`C
+M``8P@`#F,"$\`@``)$(```$`*"4`0/@)),8LX(^_`!`#X``()[T`&">]_]"O
+MOP`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("@)0"@D"4`P*@E)H,!X"0"
+M``(20@`0)!,`"RY"``,00``&)`(``R0"``$20@`@)`+__Q```%N/OP`H4D(`
+M#)1Q``@D`@`$$D(`#B0"__\0``!4C[\`*)1Q``@F,?__/`(`!31"`,`0```I
+M`F*8)28Q__X\`@`%-$(!P!```"0"8I@EE'$`""8Q__T`$1$``%$0(P`"$(``
+M1!`AC$(LY%!``!P`$1$`$```/20"__^48@`($$``$@``B"6,@BSD4$``#Y1B
+M``B49@`()(4`!"8Q``$")A`J4$``"91B``@`$1$``%$0(P`"$(``11`AC$(L
+MX%1`__<F,0`!E&(`"%8B``0`$1$`$```)20"__\`$1$``%$0(P`"$(``@H`A
+M)A`LX(X#``048``=)`+__SP"```D0@```@`@)0!`^`DD!0`\%J``#:X2``2N
+M$P`,)`(``JX"`!0D`O__K@(`&"0"`_^N`@`<)`(`"J8"`""F`@`B$```":X`
+M`#2.H@`PK@(`-#P"```D0@```H`@)0(@*"4`0/@)`J`P)0(@$"6/OP`HC[4`
+M)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#`GO?_@K[\`'*^R`!BOL0`4
+MK[``$`"`@"6.`BS,,$(#_XX&+-0`!C0`/!(#_P#2,"0\$0``)C$``"0%`*0"
+M(/@)`$8P)8X"+-`P0@/_C@8LV``&-```TC`D`@`@)20%`*@"(/@)`$8P)3P"
+M```D0@```@`@)0!`^`DD!0"L)`/\``!#$"2.!BS<,,8#_P(`("4D!0"L`B#X
+M"0!&,"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`$`"@."4`@#`E
+ME(,!Z`#C&"L08``@```0)0`'$0``1Q`C``(0@`#"*"$DI2S@C*,`!!!@`!@`
+M`!`EK*``!"0#``$`XQ@$``,8)XS"+,P`8A`DK,(LS(S"+-``8A`DK,(LT(S"
+M+-0`8A`DK,(LU(S"+-@`8A`DK,(LV(S"+-P`8A@D/`(``B1"Q20`0/@)K,,L
+MW"0"``&/OP`0`^``"">]`!@GO?_(K[\`-*^^`#"OMP`LK[8`**^U`"2OM``@
+MK[,`'*^R`!BOL0`4K[``$`"`\"4`H+@E`\"8)8_$$C27PP'H`N,8*Q!@`3P`
+M`!`E`!<1``!7$",``A"``F*((28Q+.".(P`$$&`!-"0"``&.(P`8)`+__U1B
+M`!..)P`8$(``!20#`*"4@@`",$(`H!!#``(D!``?)`0`#R0'``$`Y!`K$$``
+M"0`7@(``!Q!`-$<``0#D$"L40/_]``<00!````(`%X"``!>`@##G`_^.(@`<
+M``(2@#P#``\T8_P``$,0)`#B."6.)@`4``8U`#P"#_``PC`D/`(``"15```#
+MP"`E)@400`*@^`D`YC`EEB8`(@`&,0`PQ@#PEB(`(#!"``\`PC`E/`(`"#1"
+M(``#P"`E)@40@`*@^`D`PC`E)!((`(XC`"008``.)!0!`#P"`/\T0O__`&(0
+M)(XF`"@`!C8``\`@)28%",`"H/@)`$8P)8XB`"@00``")!((`202"0&.(@`P
+M$$``"P`7*(`\!@#_-,;__P!&,"0\`P$`/`(``"1"```#P"`E)*4)``!`^`D`
+MPS`E`!<H@(XF`"P\`P`/-&/__P##&"0`!C`K``8U`#P"```D0@```\`@)22E
+M$,``0/@)`,,P)8XB`#`00``%CB(`##!"`"!40``!-E("`(XB``PP0@!`$$``
+M`R0"__`"0I`D-E(``C)"``\00``/CB(`##!"`0`00``#)`+_OQ````(V4@!`
+M`D*0)(XB``PP0@"`$$```R0"_]\0```"-E(`(`)"D"2.(@`,/`,``0!#$"00
+M0``"/`(`(`*"H"6.(@`,/`,`@`!#$"140``!-I0"`(XB``P\`P`$`$,0)%!`
+M``..(@`,$```!0*#H"4\`P`"`$,0)%1```$"@Z`ECB(`##P#``@`0Q`D5$``
+M`3:40`".(@`,/`,`$`!#$"140``!`H.@)8XC``0D`@`"$&(`!20"``-08@`'
+MCB(`,!```!V.(@`X-E(`HCP"`"40```8`H*@)11``!0V4@!B/`(``#P#``",
+M0@``C&,```!#$"..9B_D`,(P(SP"``",0@```,(P(P`&,H``%RB`/`,!`#P"
+M```D0@```\`@)22E"0``0/@)`,,P)3P"``0"@J`ECB(`.#!"``$00``"/`(`
+M)`*"H"4`%X"`)A4)P#P"```D5@```\`@)0*@*"4"P/@)`D`P)0/`("4F!1$`
+M`L#X"0*`,"6.(@`T$$``%@/`("4`%S!`)`4+``+`^`DDQ@!0`\`@)20%"P0"
+MP/@)CB8`-`/`("4D!0L(`L#X"20&``D\`@``)$(```/`("4`0/@)`J`H)0/`
+M("4"H"@E`L#X"31&$`".(@`,,$(``1!```8D`@`!`N(0!(YC+,P`0Q`E$```
+M!JYB+,P"XA`$``(0)XYC+,P`0Q`DKF(LS(XB``PP0@`!$$``!B0"``$"XA`$
+MCF,LT`!#$"40```&KF(LT`+B$`0``A`GCF,LT`!#$"2N8BS0CB(`##!"``(0
+M0``&)`(``0+B$`2.8RS4`$,0)1````:N8BS4`N(0!``"$">.8RS4`$,0)*YB
+M+-2.(@`,,$(`!!!```8D`@`!`N(0!(YC+-@`0Q`E$```!JYB+-@"XA`$``(0
+M)XYC+-@`0Q`DKF(LV(XB``PP0@`($$``!B0"``$"XA`$CF,LW`!#$"40```&
+MKF(LW`+B$`0``A`GCF,LW`!#$"2N8BS</`(``B1"Q20#P"`E`$#X"0(@*"4D
+M`@`!C[\`-(^^`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@
+M``@GO0`X)[W_Z*^_`!``!2B`/`(``"1"````0/@))*4(`(^_`!`#X``()[T`
+M&">]_^BOOP`0``4H@#P"```D0@```$#X"22E"``D`@`!C[\`$`/@``@GO0`8
+M)[W_Z*^_`!`D!@`!`*8P!#P"```D0@```$#X"20%"$`D`@`!C[\`$`/@``@G
+MO0`8)[W_V*^_`""OLP`<K[(`&*^Q`!2OL``0`("8)0"@D"4`$BB`/`(``"11
+M```"(/@))*4*`#!0``-6```*`@`0)0)@("4"(/@))`4(0"0#``$"0Q@$`$,0
+M)%1```$D$``!`@`0)8^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_(
+MK[\`,*^W`"ROM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("0)0"@N"4D
+M!@`!/`(``"1"```D!0B``$#X"0+F,`0D%0/H/`(``"11```\`@``$```!"10
+M```"`/@))`0`9":U__\2H``%`D`@)0(@^`D"X"@E%$#_^``````\`@``)$(`
+M``)`("4`0/@)`N`H)1!``&@\`@``CD0!S#B#``<L8P`!.((`"RQ"``$`8A@E
+M5&``#0``B"4D`P`*$(,`"20"``E0@@`(``"()12#`%D\`@``ED(!T"Q"``00
+M0`!5/`(`````B"4\`@``)%0``#P"```D4P``/!8``0)`("4"@/@)-`6`3`!`
+M@"4"0"`E-`6!`#P&``H"8/@)-,8`9``0@H(R!O__`D`@)30%@/P"8/@)`-8P
+M)0)`("4"@/@)-`6`3``"$H(04``$)C$``2XB``(40/_J`D`@)3P1```F,0``
+M`D`@)0(@^`DT!8!(/`8`0#P0```F$````D`@)30%@$@"`/@)`$8P)3P"```D
+M0@```$#X"20$`,@"0"`E`B#X"30%@/P\!O_^-,;__P)`("4T!8#\`@#X"0!&
+M,"0D$`!D/`(``"13```\`@``$````R11```"(/@))`0`"@)`("4"8/@)`N`H
+M)1!```0\`@``)A#__Q8`__<`````)$(```)`("4`0/@)-`6`2#P&_[\TQO__
+M/`,``"1C```"0"`E-`6`2`!@^`D`1C`D/`(``"1"```"0"`E)`4(@`!`^`D`
+M`#`E`!40*X^_`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@
+M``@GO0`XCZ<`%(^J`""/J0`HCZL`+(2"+_0`XC@A+.(`0!1```(`H$`E)`<`
+M/S###_\`!Q0``&(8)0`)$4(P0@`!``(5P`!#$"6/HP`D``,>0#P$'@``9!@D
+M`$,8)3$B``$00``"/`(!``!B&"4`"1$",$(``0`"%T``0Q`EJ0(`"+D"``N/
+MHP`0``,=`(^F`#P`!C9`CZ4`-``%+T"/I``X``0FP``)$$(P0@`!``(6``!F
+M&"4`91@E`&08)0!#$"6I`@`,N0(`#X^C`!P``QP`/`(`#P!B&"0`"1)`,$*`
+M``!#$"6I`@`0N0(`$X^B`!BI`@`4N0(`%R0"__\10@`/``H30(D$``R9!``/
+M/`,`#S1CX```0Q`D`((@):D$``RY!``/B0(`")D"``L\`T```$,0):D"``BY
+M`@`+,2(`#!!``!\\`W\`-&/_``%C&`<P8P`!$&``&P``$"4Q(P`(``,8*P`#
+M'\")!``(F00`"P`)$((P0@`!``(5@`"#("4`1!`EJ0(`"+D"``N)`P`0F0,`
+M$X^B`#`P0G__`&(8):D#`!"Y`P`3B0(`%)D"`!<`"QT``$,0):D"`!2Y`@`7
+M)`(``0/@``@`````CZ@`%!#@`!"/J0`<B*,`$)BC`!,`!Q4`/`0`\`!$$"0`
+M8A@E-&.``*BC`!"XHP`3B*(`%)BB`!<`!AE``$,0):BB`!2XH@`7$0``$``(
+M%@"(HP`0F*,`$SP$#P``1!`D`&(8)31C@`"HHP`0N*,`$XBC`!28HP`7CZ(`
+M$``"$H``8A@EJ*,`%+BC`!<1(``.``D?`(BB`!"8H@`3`$,0)31"@`"HH@`0
+MN*(`$XBC`!28HP`7CZ(`&``"$\``8A@EJ*,`%+BC`!<#X``()`(``8BB``B8
+MH@`+/`,@``!#$"6HH@`(N*(`"P/@``@`````CZ(`$!#@``N/HP`4B*,`#)BC
+M``\L0@`!``(3``!F&"4`0Q`EJ*(`#+BB``\0```:`````%!```\``!@EJ*``
+M"+B@``NHI@`,N*8`#XAB`!"88@`3J*(`$+BB`!.(8@`4F&(`%ZBB`!2XH@`7
+M$```"@````"HHP`(N*,`"S3"$`"HH@`,N*(`#ZBC`!"XHP`3J*,`%+BC`!>H
+MH``<N*``'XBB`!R8H@`?J*(`&+BB`!L#X``()`(``8BC`!R8HP`?,&,``1!@
+M`)0D`@`/B*(`')BB`!\P0A_^``(00J3"``"(H@`8F*(`&P`"%`*DP@`"H,``
+M!(BB`!B8H@`;,$(``11``!<`````B*(`&)BB`!LP0@`"$$```B0"``&@P@`$
+MB*(`&)BB`!LP0@`($$``!`````"0P@`$-$(``J#"``2(H@`8F*(`&S!"``00
+M0``$`````)#"``0T0@`$H,(`!(BB`!R8H@`?``(50C!"``.@P@`+,$,`_R0"
+M``$08@`2*&(``A!```4D`@`"$&``"0`````0```@`````!!B`!$D`@`#$&(`
+M%@`````0```:`````(BB`!28H@`7,$(`'Q```!6@P@`%B*(`%)BB`!<P0@/@
+M``(10C1"`(`0```.H,(`!8BB`!28H@`7,$)\```"$H(T0@"`$```!Z#"``6(
+MH@`4F*(`%P`"$\(P0@`?-$(`@*#"``6(H@`<F*(`'P`"$T*@P@`&B*(`&)BB
+M`!LP0@#P``(1`J#"``>(H@`8F*(`&S!"#P```A("H,(`")##``LD`@`"$&(`
+M$P`````H8@`#$$``!B0"``,D`@`!$&(`%``````0```9```````````48@`6
+M`````(BC`!"8HP`3``,>`C!C``^0P@`(`$,0(:#"``B(HP`0F*,`$P`#'0(P
+M8P`/D,(`"`!#$"&@P@`(B*,`$)BC`!,``QP",&,`#Y#"``@`0Q`AH,(`"(BB
+M`!B8H@`;,$+P```"$P*@P@`)B*,`')BC`!\\`@$``&(8)"QC``$D`@`"`$,0
+M(Z#"``H``!`E`^``"`````",H@``C(-&H`!#$"2LH@````(0)XR#1J``0Q`D
+M`^``"*R"1J```````````">]_^"OOP`8K[$`%*^P`!``@(`E/`(``"1"````
+M0/@))@4LA#P1```F,0```@`@)30%@20"(/@)```P)0(`("4T!8$H`B#X"0``
+M,"4"`"`E)`4`0`(@^`D``#`E`@`@)30%@3`"(/@)/`8``@(`("4T!8$X`B#X
+M"3P&`@"/OP`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`8K[$`%*^P`!``@(@E
+M/!```"80```D!0!``@#X"20&``8\`@``)$(```(@("4`0/@))B4LA`(@("4T
+M!8$D`@#X"0``,"4"("`E-`6!*`(`^`D``#`EC[\`&(^Q`!2/L``0`^``"">]
+M`"``@#@E```P)0`&$$``1A`A``(0@`!&$",``A#``$<0(91$,"B4HP``$(,`
+M%P#`$"4`!A!``$80(0`"$(``1A`C``(0P"1","@`XA@AE&(``%1```DDQ@`!
+ME*(``*1B``"4H@`"I&(``I"B``2@8@`$`^``"`#`$"4LP@!`5$#_XP`&$$``
+M`!`E`^``"``````#X``(C((P)">]_^BOOP`4K[``$`"`@"4\`@``)$(```!`
+M^`DF!2R$)@(L2(^_`!2/L``0`^``"">]`!@GO?_8K[\`(*^S`!ROL@`8K[$`
+M%*^P`!``@)`E`*"8)0)`B"62(@'C``(1PJXB,!P\`@``)$(``"8D,"@`0/@)
+M)`46````,"4D#P`')`X``B0-`?0D!P#()`P`9"0+`"@D"@`'/`D`OS4I_@P\
+M"`"_-0C_.(Y"`<PL0@`'$$``"``&$$``1A`A``(0@`!&$",``A#``%$0(1``
+M``>@3S`P`$80(0`"$(``1A`C``(0P`!1$"&@3C`P``800`!&$"$``A"``$80
+M(P`"(,`F)0`$`(40(:Q-,#@D@S!``B,0(:Q'````HQ@AK&<``"2#,$@"(Q`A
+MK$P```"1$"&L2S!0`*,8(:QJ```D@C`P`B(0(:!```2@0``%D$,``*!#``*@
+M0``#CB(P'!!```0`A1`AK$DP:`"1$"&L2#!P),8``2S"`$!40/_,CD(!S(XB
+M,!P00``./!```"80```"0"`E-`6!+`(`^`F.)C!L`D`@)30%@30"`/@)CB8P
+M<#P"```D0@```$#X"0)`("4D`@!D$F``!:XB,"".(C`8-$(``1````6N(C`8
+MCB(P&"0#__X`0Q`DKB(P&(^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@G
+MO?_@K[\`&*^Q`!2OL``0`("()8XB,!P00``-/`(``"1"````0/@)/!```"80
+M```"("`E-`6!+`(`^`D``#`E`B`@)30%@30"`/@)```P)8^_`!B/L0`4C[``
+M$`/@``@GO0`@)[W_F*^_`&"OMP!<K[8`6*^U`%2OM`!0K[,`3*^R`$BOL0!$
+MK[``0`"`J"4"H*`E+*(`!Q!``<*.ES`D/`(``"1"6Y``!1B``&(8(8QB````
+M0``(``````#`L"4LPP`%$&`!N@``$"4\$@``)E(```*@("4"0/@)-`684#P#
+M\`\T8___`$,0)``6@(`"%!@AC&9&*``&-0`\`P_P`,,P)#P1```F,0```J`@
+M)30%F%`"(/@)`$8P)0*@("4"0/@)-`687"0#@'\`0Q`D`A08(8QF1E``!C'`
+M,,9_@`*@("4T!9A<`B#X"0!&,"4"H"`E`D#X"30%F%P\`__`-&-__P!#$"0F
+MDP`$`A,8(8QF1C@`!C/`/`,`/S1C@```PS`D`J`@)30%F%P"(/@)`$8P)0*@
+M("4"0/@)-`686#P#_`,T8___`$,0)`(3@"&.!D9@``8T@#P#`_P`PS`D`J`@
+M)30%F%@"(/@)`$8P)9+B``D`5A`K4$``!9+B``F.@BQ()$(``1````>N@BQ(
+M`L(0*U!``6VB]@`)CH(L3"1"``&N@BQ,$``!:*+V``DD`P!_KZ,`$"0"`#*O
+MH@`4KZ,`&"0"`"BOH@`<KZ,`("0"`$VOH@`DKZ,`*"0"`$"OH@`L)`(`'Z^B
+M`#`D`@`0KZ(`-"0"`#^OH@`X)`(`,*^B`#P`!I@K/`(``"12```"H"`E`D#X
+M"30%F&P\`__@-&,__P!#$"0`$X"`)Z,`$`!P&"&,9@````8S@#P#`!\T8\``
+M`,,P)#P#```D<0```J`@)30%F&P"(/@)`$8P)0*@("4"0/@)-`68;#P#\!\T
+M8___`$,0)">C`!@`<!@AC&8````&-4`\`P_@`,,P)`*@("4T!9AL`B#X"0!&
+M,"4"H"`E`D#X"30%F&@\`_\!-&/__P!#$"0GHP`@`'`8(8QF````!C1`/`,`
+M_@##,"0"H"`E-`68:`(@^`D`1C`E`J`@)0)`^`DT!9AH/`.`_S1C__\`0Q`D
+M)Z,`*`!P&"&,9@````8V`#P#?P``PS`D`J`@)30%F&@"(/@)`$8P)0*@("4"
+M0/@)-`68:"0#_^``0Q`D)Z,`,`!P&"&,9@``,,8`'P*@("4T!9AH`B#X"0!&
+M,"4"H"`E`D#X"30%F&PD`\#_`$,0)">C`#@`<!@AC&8````&,@`PQC\``J`@
+M)30%F&P"(/@)`$8P)1)@``D"H"`E`D#X"30%F&P"H"`E-`68;`(@^`DT1@`!
+M$```#2YC``$\`@``)$(```!`^`DT!9AL)`;__CP#```D8P```J`@)30%F&P`
+M8/@)`$8P)"YC``&2X@`,$&(`V20"``%28``%CH(L7(Z"+%@D0@`!$````ZZ"
+M+%@D0@`!KH(L7"YB``$0``#-HN(`#"0"``BOH@`0)`(`!J^B`!0`!H`K/`(`
+M`"1"```"H"`E`$#X"30%H@@D`__``$,0)``0((`GHP`0`&08(8QF```PQ@`_
+M/`,``"1C```"H"`E-`6B"`!@^`D`1C`EDN(`#1("`+0D`@`!4@``!8Z"+&2.
+M@BQ@)$(``1````.N@BQ@)$(``:Z"+&00``"IHO``#:^@`!`D`@`$KZ(`%"0"
+M``BOH@`8`,"()2S#``,08`"A```0)3P"```D0@```J`@)0!`^`DT!9A8/`/_
+M_#1C#_\`0Q`D`!$8@`.C&"&,9@`0``8S`#P#``,T8_```,,P)#P#```D8P``
+M`J`@)30%F%@`8/@)`$8P)9+B``L`41`K4$``!9+B``N.@BQH)$(``1````>N
+M@BQH`B(0*U!``("B\0`+CH(L;"1"``&N@BQL$```>Z+Q``L\`@``)$-;<(Q"
+M6W"OH@`0C&(`!*^B`!2,8@`(KZ(`&(QB``ROH@`<C&(`$*^B`"",8@`4KZ(`
+M)(QB`!BOH@`HC&(`'*^B`"P`P(@E+,,`"!!@`&8``!`E/`(``"1"```"H"`E
+M`$#X"30%F20D`_\!`$,0)``1&(`#HQ@AC&8`$``&,$`PQ@#^/`,``"1C```"
+MH"`E-`69)`!@^`D`1C`EDN(`"@!1$"M00``%DN(`"HZ"+%`D0@`!$```!ZZ"
+M+%`"(A`K4$``2*+Q``J.@BQ4)$(``:Z"+%00``!#HO$`"A3``!2.@C`8)`/_
+M_0!#$"2N@C`8/`(``"1"````0/@)`J`@)3P"```D0@```$#X"0*@("4D!?[_
+M/`,``"1C```"H"`E`&#X"0!%*"00```O)`(``3!"``(40``L)`(``8Z",!P0
+M0``:/`(``"1"````0/@)`J`@)20%_O\\`P``)&,```*@("4`8/@)`$4H)#P0
+M```F$````J`@)30%@2P"`/@)CH8P;`*@("4T!8$T`@#X"8Z&,'`\`@``)$(`
+M``!`^`D"H"`E$```"HZ",!@D0@```$#X"0*@("4\`P``)&,```*@("4`8/@)
+M-$4!`(Z",!@T0@`"$````ZZ",!@0```"```0)20"``&/OP!@C[<`7(^V`%B/
+MM0!4C[0`4(^S`$R/L@!(C[$`1(^P`$`#X``()[T`:">]_]BOOP`@K[,`'*^R
+M`!BOL0`4K[``$`"`D"6.43`DKB``$(Y",!P00``J`D"8)8XC`!0\`@#``$,0
+M*Q!```,\`@#`$````ZX@`$0`0Q`CKB(`1(XC`!P\`@#``$,0*A!```,\`@#`
+M$````ZX@`$@`0Q`CKB(`2#P0```F$````D`@)30%@2P"`/@)CB8`1`)`("4T
+M!8$T`@#X"8XF`$@"0"`E-`6!,`(`^`D\!@`"`D`@)30%@3@"`/@)/`8"`#P"
+M```D0@```D`@)0!`^`DF92R$KB``/*X@`$"/OP`@C[,`'(^R`!B/L0`4C[``
+M$`/@``@GO0`H)[W_X*^_`!BOL0`4K[``$`"`B"4"(#@ECB(P&#!"``,D`P`#
+M%$,`8HXE$C2.,#`DD@8`"2S"``100``(D@8`"CP"```D0@``)`4``0!`^`DD
+MQ@`!$```5X^_`!B2`@`(`,(0*U!```F,XRR8/`(``"1"```"("`E)`4`!0!`
+M^`DDQ@`!$```2X^_`!@P8@!_+$(`0"1C`'\00``#``,9PHSB+)@``AG"C@(`
+M*`!#$"I00``0C@(`))("``Q40``9D@8`"SP0```F$````B`@)20%``("`/@)
+M```P)0(@("4D!0`%`@#X"0``,"40```QC[\`&`!#$"H00``5/`(``)("``P0
+M0``&/`(``"1"```"("`E)`4``@!`^`DD!@`!D@8`"RS"``)00``BC[\`&#P"
+M```D0@```B`@)20%``0`0/@)),8``1```!J/OP`8)$(```!`^`D"("`E)$+_
+M_BQ"``(00``3C[\`&)("``Q40``(D@(`"SP"```D0@```B`@)20%``(`0/@)
+M```P)9("``L00``&/`(``"1"```"("`E)`4`!`!`^`D``#`EC[\`&(^Q`!2/
+ML``0`^``"">]`"`GO?_@K[\`&*^Q`!2OL``0`("()0(@."6.(C`8,$(``R0#
+M``,40P`SCB42-(XP,"22!@`)+,(`!%!```B,XRR8/`(``"1"```D!0`!`$#X
+M"23&``$0```HC[\`&#!B`'\L0@!`)&,`?Q!```,``QG"C.(LF``"&<*.`@`D
+M`$,0*A!```T\`@``D@8`"RS"``)00``9C[\`&#P"```D0@```B`@)20%``0`
+M0/@)),8``1```!&/OP`8)$(```!`^`D"("`E)$+__BQ"``(00``*C[\`&)("
+M``L00``'/`(``"1"```"("`E)`4`!`!`^`D``#`EC[\`&(^Q`!2/L``0`^``
+M"">]`"`GO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``@(@E`*"`)0(@F"4\`@`"
+M)$+6<`!`^`F.)1(T``(80`!B&"$``QB``&(8(P`#&,`"(Y`A)E(P**XR,"2.
+M(P'<)`(``51B``6.8C`8CB(P&#1"``(0```$KB(P&"0#__T`0Q`DKF(P&(XC
+M`=PD`@`!$&(`*`(@("6.8BQX)$(``:YB+'@\$```)A```"0%``$"`/@)```P
+M)0(@("4D!0`%`@#X"0``,"4"("`E)`4`!`(`^`D``#`E`B`@)20%``("`/@)
+M```P)0(@("4D!0`#`@#X"0``,"4\`@``)$(```!`^`D"("`E/`,``"1C```"
+M("`E`&#X"31%`0`\`@`")$+@[`!`^`D"("`E$```7X^_`"".(C`8,$(``R0#
+M``,40P!:C[\`(!(``!D\$```)A````(@("4D!0`!`@#X"9)&``D"("`E)`4`
+M!0(`^`F21@`*DD8`#`(@("4D!0`"`@#X"2S&``$"("`E)`4``P(`^`F21@`-
+M`B`@)20%``0"`/@)DD8`"Q```!>.8C`<)A````(@("4D!0`!`@#X"20&``0"
+M("`E)`4`!0(`^`F21@`(`B`@)20%``("`/@))`8``0(@("4D!0`#`@#X"20&
+M``$"("`E)`4`!`(`^`DD!@`"CF(P'!!``!H\`@``)$(```!`^`D"("`E)`7^
+M_SP#```D8P```B`@)0!@^`D`12@D/`(``B1"X.P`0/@)`B`@)3P0```F$```
+M`B`@)30%@3`"`/@)/`8``@(@("4T!8$X`@#X"3P&`@`0```/C[\`(#P"``(D
+M0N#L`$#X"0(@("4\`@``)$(```!`^`D"("`E/`,``"1C```"("`E`&#X"31%
+M`0"/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_V*^_`""OLP`<K[(`
+M&*^Q`!2OL``0`("0)0"@B"4"0)@E/!```"80```T!8$D`@#X"0``,"4"0"`E
+M-`6!*`(`^`D``#`E/`(``"1"```"0"`E`$#X"29%+(2.(@``KD(LF(XB``2N
+M0BR<CB(`"*Y"+*`\$```)A````)`("4"`/@)-`6!+`!`B"4"0"`E`@#X"30%
+M@30`0"@E/`,`P`(C$"000P`#`*,0)!1#`"F/OP`@CG`P)(X$`$0")"`CC@(`
+M/`""$"..8RQP`$,0(:YB+'"N!``\C@0`2`"D("..`@!``((0(XYC+'0`0Q`A
+MKF(L=*X$`$".`P`\C@(`%`!#$"M00``&C@,`0#P"``(D0N'D`$#X"0)`("6.
+M`P!`C@(`'`!#$"L00``&/`(``CP"``(D0N.H`$#X"0)`("4\`@`")$+@[`!`
+M^`D"0"`EC[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_^BOOP`4K[``
+M$`"`@"4"`#@ED*,`!20"`!$48@`6C@8P)(S"`#PD0@`!K,(`/(X"+'`D0@`!
+MK@(L<(S#`#R,P@`4`$,0*U!``"*/OP`4/`(``B1"X>0`0/@)`````#P"``(D
+M0N#L`$#X"0(`("40```8C[\`%"0"`!D48@`5C[\`%(S"`$`D0@`!K,(`0(SB
+M+'0D0@`!K.(L=(S#`$",P@`<`$,0*U!```N/L``0/`(``B1"XZ@`0/@)`@`@
+M)3P"``(D0N#L`$#X"0(`("6/OP`4C[``$`/@``@GO0`8)[W_Z*^_`!``@"@E
+MC(8P)(R#+)@P8@!_+$(`0"1C`'\00``#``,9PHRB+)@``AG"C,(`*`!#$"I4
+M0``8D,,`"HS"`"0`0Q`J4$``"Y##``N0P@`,$$``!SP"```D0@``)`4``@!`
+M^`DD!@`!$```&H^_`!"0PP`+$&``!SP"```D0@``)`4`!`!`^`DD9O__$```
+M$8^_`!"0PP`*$&``!SP"```D0@``)`4`!0!`^`DD9O__$```"(^_`!"0Q@`)
+M$,``!"1"```D!0`!`$#X"23&__^/OP`0`^``"">]`!@GO?_8K[\`(*^S`!RO
+ML@`8K[$`%*^P`!``@(@E/!```"80```"`/@)-`6`[`!`F"4"("`E`@#X"30%
+M@/``0)`E`B`@)0(`^`DT!8#X`$`P)8XE,"2,H@`X$$```P#"$"M00``&C*0`
+M.```&"6.(BQ\)$(``1````^N(BQ\`,0@(XRC`#0"0Q@CC*(`,`)B$",`@Q@C
+M`&(8(SP"7U,T0CDI`&(`&```$!```A.#``,?PP!#&".LI@`XK+,`,*RR`#0`
+M8!`EC[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_]"OOP`HK[4`)*^T
+M`""OLP`<K[(`&*^Q`!2OL``0`("8)0)@D"6.<3`DC*(``*YB+)B,H@`$KF(L
+MG(RB``@2(`"LKF(LH#P"``(D0NJ8`$#X"0``````0(`E!@,`"8XB`!".8BR`
+M)$(``:YB+(`\`@`")$+@[`!`^`D"8"`ECB(`$`("$"&N(@`0CD(P'!!``$`\
+M`@``)$(```)@("4`0/@))D4LA#P0```F$````F`@)0(`^`DT!8$L`$"H)0)@
+M("4"`/@)-`6!-`!`H"6.(@!$`J(0*U1```<\$```CB(`2`*"$"M00``;CB0`
+M1!````N.)@!()A````)@("4T!8$L`@#X"8XF`$0"8"`E-`6!,`(`^`D\!@`"
+MCB8`2`*&$"L00`!TC[\`*#P0```F$````F`@)0(`^`DT!8$T`F`@)30%@3@"
+M`/@)/`8"`!```&F/OP`H`J0@(XXB`#P`@A`CCD,L<`!#$"&N0BQPKB0`/(XD
+M`$@"A"`CCB(`0`""$"..0RQT`$,0(:Y"+'2N)`!`CF(P&#!"``,D`P`#%$,`
+M58^_`"B.0S`@``,0@`!#$"&.)``0`$00*U!``!^.(P`0CB(`&`""`!@``!`2
+M/`408C2E3=,`10`9```0$``"$8*.(P`\`$,0*Q1``"@\`@`"CB(`(`""`!@`
+M`!`2````````````10`9```0$``"$8*.(P!``$,0*U1``!P\`@`"/`(``B1"
+MZ;@`0/@)`F`@)1```!8\`@`"CD(P(`!#$"L00``LC[\`*(XB`!0`8@`8```0
+M$CP#$&(T8TW3`$,`&0``$!```A&"CB,`/`!#$"M00``+CB(`$#P"``(D0N'D
+M`$#X"0)@("4\`@`")$+@[`!`^`D"8"`E$```%H^_`"B.(P`<`$,`&```$!(\
+M`Q!B-&--TP!#`!D``!`0``(1@HXC`$``0Q`K$$``"H^_`"@\`@`")$+CJ`!`
+M^`D"8"`E/`(``B1"X.P`0/@)`F`@)8^_`"B/M0`DC[0`((^S`!R/L@`8C[$`
+M%(^P`!`#X``()[T`,(R"$C240@``I*(``(R#$C208@`$-$(`"*!B``20H@`$
+M-$(`"*"B``2,@A(TE$(``J2B``*,@A(TD$(`!*"B``2,@A(TD$(`!:"B``4#
+MX``(```0)0```````````````">]_\BOOP`PK[<`+*^V`"BOM0`DK[0`(*^S
+M`!ROL@`8K[$`%*^P`!``@*`E`*"P)0#`N"4`X(`E``"()3P"```D4ENP/`(`
+M`"15```\`@``)%,````1$$``41`A``(8P`!R&"$``A!``%80(0`"$(``4A`A
+M`H`@)8QE```"H/@)C$8``"80``$R`@`_5$``!"8Q``$"8/@))`0``28Q``$N
+M(@`.%$#_[``1$$```(@E/`(``"1270`\`@``)%4``#P"```D4P```!$0P`!2
+M&"$`8!`E`H`@)8QE```"H/@)C$8`!"80``$R`@`_5$``!"8Q``$"8/@))`0`
+M`28Q``$N(@!(%$#_\0`1$,```(@E/`(``"128-@\`@``)%4``#P"```D4P``
+M`!$00`!1$"$``AB``'(8(0!7$"$``A"``%(0(0*`("6,90```J#X"8Q&```F
+M$``!,@(`/U1```0F,0`!`F#X"20$``$F,0`!+B(`0%1`_^T`$1!`C[\`,(^W
+M`"R/M@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#@GO?_8K[\`
+M)*^T`""OLP`<K[(`&*^Q`!2OL``0`("8)0"@H"4\`@``)$(``):%````0/@)
+MEH8``@`"%````B0#EH(``C!"`(`00``K``2`0`($@"$`$("`/`(``"1"9TP"
+M`H`A/`(``"1"``".!``$`$#X"20%``@P4@#_`!*10(X"`````A$``D*0)880
+M``@\`@``)$(```)@("4`0/@)-`6B!`!`."66@P``)`()M%1B``DD!O_O/`(`
+M`"1"```"8"`E-`6B!`!`^`DTY@`0$```#"H"`)$\`@``)$(```)@("4T!:($
+M`$#X"0#F,"00```$*@(`D0"`@"4``)`E*@(`D1!```0\`@``,@(``1!```@\
+M`@``)$(``"8$_^@`0/@))`4`"#!1`/\0```+)`(``28$_^@`!!?"`((@(3P"
+M```D0@````0@0P!`^`DD!0`(,%$`_P``$"4`$8B```(00`(BB"4V,00!,D8`
+M_P`&,@`R(@#_/!```"80```"8"`E-`68G`(`^`D`PC`E`!&*`C)"_P`R)@#_
+M`F`@)30%F-`"`/@)`$8P):YT$C0D`@`!C[\`)(^T`""/LP`<C[(`&(^Q`!2/
+ML``0`^``"">]`"@LH@`($$``%(R$+^P\`@``)$)HD``%&(``8A@AC&(```!`
+M``@``````^``"`"`$"4#X``()((`1`/@``@D@@!(`^``""2"`$P#X``()((`
+M4`/@``@D@@"4`^``"```$"4GO?]HK[\`E*^^`)"OMP",K[8`B*^U`(2OM`"`
+MK[,`?*^R`'BOL0!TK[``<*^D`)BOI0"<,-3__P"`D"64H@`",$,!\"0"`,`0
+M8@!$``"8)2AB`,$00``&)`(!0"0"`*`08@`Q```0)1```8N/OP"4$&(``R0"
+M`5`48@&&```0)8^C`)R48@``)$+P7RQ"!.M00``$E&(``)95$U00```7EE83
+M5B1"ZW0L0@#P$$``!(^C`)R651-8$```$)96$UJ48@``)$+JA"Q"`.$00``$
+MCZ,`G)95$UP0```(EE837I1B```L0A9=``"P)11```,``*@EEE438)96$V(`
+M`(@E```H)99"$MBOH@!@ED,2WJ^C`&0L8@`!KZ(`:)9#$RP0```:KZ,`;)95
+M$V265A-FED43;)91$W"60A+:KZ(`8)9#$N"OHP!D+&(``:^B`&B60Q,N$```
+M#:^C`&R651-HEE83:I9%$VZ641-RED(2W*^B`&"60Q+BKZ,`9"QB``&OH@!H
+MED,3,*^C`&P``(`E)Z0`&#P"```D1E]``!`8@`"#&"$`$!!``%`0(0`"$$``
+M5!`A``(0@`!&$"&,0@``K&(``"80``$N`@`1%$#_]``0&("/HP"<E&(``C!"
+M`(`00``-/!```*^@`!`F$```)Z0`&"0&``,"`/@))`<`=Z^@`!`GI``8`B`H
+M)20&``,"`/@))`<`>@``@"4GL0`8/`(``"1>```\`@``)%<````0$$``4!`A
+M``(0P#P#```D8U]``$,0(0`0&(`"(Q@ACZ0`F(Q%```#P/@)C&8``"9S``$R
+M8@`_5$``!"80``$"X/@))`0``280``$N`@`1%$#_[``0$$```(`E/`(``"11
+M8]@\`@``)%X``#P"```D5P```!`0P`!1&"$`8!`ECZ0`F(QE```#P/@)C$8`
+M!"9S``$R8@`_5$``!"80``$"X/@))`0``280``$2`/_Q/`(`````@"4D46/@
+M/`(``"1>```\`@``)%<````0$$``4!`A``(8P`!Q&"$``A!``%00(0`"$(``
+M41`ACZ0`F(QE```#P/@)C$8``"9S``$R8@`_5$``!"80``$"X/@))`0``280
+M``$2`/_L/`(`````@"4D46/X/`(``"1>```\`@``)%<````0$$``4!`A``(8
+MP`!Q&"$``A!``%00(0`"$(``41`ACZ0`F(QE```#P/@)C$8``"9S``$R8@`_
+M5$``!"80``$"X/@))`0``280``$2`/_L)Z0`&```@"4\`@``)$5D$``0&(``
+M@Q@A`!`00`!0$"$``A!``%00(0`"$(``11`AC$(``*QB```F$``!+@(`$11`
+M__0`$!B`CZ,`G)1B``(P0@%`)`,!0%1#`!&OH``0ED43S"01``.OL0`0/!``
+M`"80```GI``8)`8``0(`^`DD!P`SED43SJ^Q`!`GI``8)`8``0(`^`DD!P`M
+MKZ``$#P0```F$```)Z0`&(^E`&@D!@`!`@#X"20'`%^OH``0)Z0`&(^E`&`D
+M!@`$`@#X"20'`&"OH``0)Z0`&`*@*"4D!@`#`@#X"20'`&BOH``0)Z0`&`+`
+M*"4D!@`#`@#X"20'`&L``(`E/`(``"179!`GL0`8/`(``"16```\`@``)%4`
+M```0$$``4!`A``(0P`!7$"$`$!B``B,8(8^D`)B,10```L#X"8QF```F<P`!
+M,F(`/U1```0F$``!`J#X"20$``$F$``!+@(`$11`_^X`$!!```"`)2>D`!@\
+M`@``)$5EJ``0&(``@Q@A`!`00`!0$"$``A!``%00(0`"$(``11`AC$(``*QB
+M```F$``!+@(`"%1`__0`$!B`KZ``$#P"```D40``)Z0`&(^E`&PD!@`&`B#X
+M"20'`!VOH``0)Z0`&(^E`&0D!@`!`B#X"20'``2/HP"<C&(``#!"P``00``8
+M)Z0`&)1P``(R$$``+A```0`0@",R$``/)A``$*^@`!`D!0`?)`8`!0(@^`DD
+M!P`3KZ``$">D`!@"`"@E)`8`!0(@^`DD!P`8KZ``$">D`!@D!0`#)`8``@(@
+M^`DD!P`Q``"`)3P"```D5F6H)[$`&#P"```D50``/`(``"14````$!!``%`0
+M(0`"$,``5A`A`!`8@`(C&"&/I`"8C$4```*@^`F,9@``)G,``3)B`#]40``$
+M)A```0*`^`DD!``!)A```2X"``@40/_N`!`00*Y`+\0D`@`!C[\`E(^^`)"/
+MMP",C[8`B(^U`(2/M`"`C[,`?(^R`'B/L0!TC[``<`/@``@GO0"8,(3__S"E
+M__\PQO__,.?__Y>H`!(`Z``8```8$A!@`"4``!`E4,4`(@#@&"4`A1`C``(8
+M0`!B&"$``QC``&(8(0`#&(``Q1`C`&(`&@``&!)00``!``<`#0`#'````R0#
+M!(``$P#@&"4H@@!E$$``$`$`&"4`B``8```8$B0"`&0`1!`C`$<`&```$!(`
+M8A@A/`)1ZS1"A1\`8@`8```0$``"$4,``Q_#`$,0(S!#__\`8!`E`^``"```
+M```GO?Z@K[\!7*^^`5BOMP%4K[8!4*^U`4ROM`%(K[,!1*^R`4"OL0$\K[`!
+M.`#@N"4`@*`E)`(`/Z^B`3"6X@`",$,!\"0"`-`08@`D``#P)2AB`-$00``(
+M)`(!4"0"`*`08@`7)`(`P!!B`!P``!`E$``!!H^_`5P08@`**&(!41!```8D
+M`@E`)`(!0!!B``4``!`E$```_8^_`5P48@#Z```0)9:"$^:GH@$D)H(3TJ^B
+M`2`F@A/H$```#J^B`2B6@A7PIZ(!)":"%?BOH@$@)H(6KA````>OH@$HEH(5
+M\*>B`20F@A7RKZ(!(":"%A*OH@$H)[4!(#P"```D0@``)Z0`&`!`^`DD!0$(
+M)[8`(">S`*`D$@`!``"()0`1$$``5A`AI%(``"92``$J0@!`%$#_^B8Q``&G
+ML0`>)`(``:>B`!HD`@`_IZ(`'#(B__\00``0``"()3P"``(D4O\$`!&`0`(6
+M$"&6Y```E$4```)`^`D"H#`E`A.`(:8"```F,0`!EZ(`'@(B$"H40/_U`!&`
+M0(9F``"7H@`>``(00`)B$"&$1__^$```"0``B"4"8B`AA(/__H2"````0Q`J
+M$$```I2%``"DA?_^)C$``9>B`!X"(A`J$$``#Y>B`!X`$1!``%,0(81#````
+MPQ`J%$```Y>B`!X`8#`E,C[__P!1$",D0O__,%+__Q9`_^@`$A!`EZ(`'A!`
+M``\``(@E`$`@)0`1$$``4Q`AA$,```#C$"I00``%)C$``0!@."4R(___KZ,!
+M,"8Q``$")!`J%$#_]0`1$$`DP@`9/`11ZS2$A1\`1``8```8$``#&0,``A?#
+M`&(8(P`#$$``0Q`A``(0P`!#$"$``A1```*$`P``D"4"!``8```@$``$(0,`
+M`A?#`((@(R2$``$8@``0``"()0``$!```A$#`!`?PP!#$",D1``!`B`8)28B
+M``$P4?__CH)&>``#&$``8A@A)E(``0)$$"H40/_WI'X``)>B`!X`0"`E``(0
+M0`)B$"&$0O_^`@(0*BXC`$``0Q`D$$``3@``D"4\`@`")%7YD"8"`#(``A0`
+M``*$`P"`$"4``A!``F(0(81"__X"`A`J$$``'``2&$``$A!``%,0(81#```"
+M`Q@CA$(``@("$",`8@`8```8$AA@`!(`$AA```000`)B$"&$0O_^`@(@*A"`
+M``LF4@`!`!(00`!3$"&$0P```@,8(X1"``("`A`C`&(`&```&!(<8/_U````
+M```2&$``<Q`AE$4``)1&``(`=A@AE&<````'.$"48@`"``(00#!"__^OH@`0
+M,@3__P*@^`DPY___)$(``3!"__^.@T9X`!$@0`"#&"$``A!"I&(``(Z"1G@`
+M@B`AE((``(^C`3``8A`K5$```:2#```F(@`!,%'__Y>D`!X`!!!``F(0(81"
+M__X"`A`J+B,`0`!#$"040/^W)@(`,BXB`$!00``,IH`O](Z#1G@`$1!``$,0
+M(91#__ZD0P``)B(``3!1__\N(@!`5$#_^(Z#1GBF@"_T)`(``8^_`5R/O@%8
+MC[<!5(^V`5"/M0%,C[0!2(^S`42/L@%`C[$!/(^P`3@#X``()[T!8">]_ZBO
+MOP!0K[<`3*^V`$BOM0!$K[0`0*^S`#ROL@`XK[$`-*^P`#``P*@E,)?__S"V
+M__\\`@`")$(`I`+@("4"P"@E`$#X"2>G`!@40`!)EZ(`&):F``0GH@`<KZ(`
+M$#P"```D0@```N`@)8ZE````0/@))Z<`&I>E`!HGH@`@KZ(`$#P0``(F$`$L
+M`L`@)0*@,"4"`/@))Z<`'I>E`!PGH@`DKZ(`$`+`("4"H#`E`@#X"2>G`"(G
+MLP`F/!```B80`*27I``:EZ4`'@*@,"4"`/@)`F`X)2>R`"B7I``:EZ4`(`*@
+M,"4"`/@)`D`X)9>E`!Z7I@`@EZ<`)I>B`"BOH@`0/!$``B8Q^9`"(/@)`L`@
+M)0!`H"67I``<EZ4`(@*@,"4"`/@)`F`X)9>D`!R7I0`D`J`P)0(`^`D"0#@E
+MEZ4`(I>F`"27IP`FEZ(`**^B`!`"(/@)`L`@)9>E`!J7I@`<KZ(`$`+@("4"
+M(/@)`H`X)8^_`%"/MP!,C[8`2(^U`$2/M`!`C[,`/(^R`#B/L0`TC[``,`/@
+M``@GO0!8,(3__S"E__^,R``(E,(`!!!``!L``%`EE0(``%1$`!0E2@`!)0D`
+M")4"``800``/```8)24+``:5(@``5$4`!R1C``$``Q!``$L0(91"`!BDX@``
+M`^``""0"``&5`@`&`&(0*A1`__0E*0`")4H``93"``0!0A`J%$#_YR4(`#0#
+MX``(```0)2>]_^"OOP`8,(3__S"H__^,Q0`(E,(`!!!```P``!@EE*(``%!(
+M``J4I@`&E,8`!"1C``$`9A`J$$``!"2E`#24H@``5$C_^R1C``&4I@`&CZ(`
+M,*^B`!`\`@``)$(```!`^`DDI0`(C[\`&`/@``@GO0`@)[W_Z*^_`!2OL``0
+M`("`)8X$1G@0@``%/`(``"1"````0/@)`````*X`1GB.!"_L$(``!3P"```D
+M0@```$#X"0````"N`"_LC[\`%(^P`!`#X``()[T`&`/@``@D`@`!/`(``)2C
+M``"40FBP`$,0*Q1```L``"`E/`(``"1#:+"4I0``)(0``0`$$(``0Q`AE$(`
+M``!%$"M00/_[)(0``3P"```D0FBP``08@`!#$"$#X``(A$(``B>]_^"OOP`8
+MK[$`%*^P`!``H(@E`("`)3P"```D0@```$#X"20$`+0`0!@E%&``!*X#+^PD
+M`P`"$```)JXC```D`@"`K@)&?#P"```D0@```$#X"20$`(``0!@E%&``!*X#
+M1G@D`P`"$```&JXC```\`@`")$(!H*X"+*@\`@`")$+N\*X"+*P\`@`")$+R
+M;*X"++`\`@`")$+PF*X"++0\`@`")$+RS*X"++@\`@`")$+Z3*X"++P\`@`"
+M)$(!^*X"+,`\`@`")$("`*X"+,0D`@`!C[\`&(^Q`!2/L``0`^``"">]`"`G
+MO?_(K[\`,*^W`"ROM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("@)0"@
+ML"4`P+@E`."`)0``B"4\`@``)%)HX#P"```D50``/`(``"13````$1!``%$0
+M(0`"&,``<A@A``(00`!6$"$``A"``%(0(0*`("6,90```J#X"8Q&```F$``!
+M,@(`/U1```0F,0`!`F#X"20$``$F,0`!+B(`$!1`_^P`$1!```"()3P"```D
+M4FI@/`(``"15```\`@``)%,````1$,``4A@A`&`0)0*`("6,90```J#X"8Q&
+M``0F$``!,@(`/U1```0F,0`!`F#X"20$``$F,0`!+B(`111`__$`$1#```"(
+M)3P"```D4FR(/`(``"15```\`@``)%,````1$$``41`A``(8@`!R&"$`5Q`A
+M``(0@`!2$"$"@"`EC&4```*@^`F,1@``)A```3("`#]40``$)C$``0)@^`DD
+M!``!)C$``2XB`$!40/_M`!$00(^_`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R
+M`!B/L0`4C[``$`/@``@GO0`X)[W_T*^_`"BOM0`DK[0`(*^S`!ROL@`8K[$`
+M%*^P`!``@*`E`*"8)0``J"669```+((2P!!``$8``(`E)(+W<"0#``4`0P`:
+M```0$%!@``$`!P`-5$``"Y9D````!!!`)%'NX#P"9F8T0F9G`B(`&```$!``
+M`A"#`!$?PQ```!,`0X@C)(+W4"0#``4`0P`:```0$%!@``$`!P`-%$``M0``
+M$"4`!!!`)%'NH#P"9F8T0F9G`B(`&```$!```A"#`!$?PP!#B",D%0`!`!&(
+M@#P"```D0@``,B0`_P!`^`DD!0`(`$"()3P"```D0@```H`@)0!`^`DT!:($
+M`$`X)99C```D`@FT5&(`"20&_^\\`@``)$(```*`("4T!:($`$#X"33F`!`0
+M``"``!&1`#P"```D0@```H`@)30%H@0`0/@)`.8P)!```'@`$9$`)`(`!0""
+M`!L``!@04$```0`'``TP8___)`(``E1B`!^69```+((5/%!``!R69```EF,`
+M`"1C__XP8___``,0@`!#$"$``A!`/`/__S1C1(``0Q`A/`11ZS2$A1\`1``8
+M```@$``$(,,``A?#`((@(SP0```F$```)(0``0(`^`DD!0`(`$"()0``("4"
+M`/@))`4``A```%``0(`E)`(`%`""`!L``!@04$```0`'``U48``7EF0``"R"
+M%`!40``4EF0``"2"[4`\!&9F-(1F9P!$`!@``"`0``0@PP`"%\,`@B`C/!``
+M`"80````!""``@#X"20%``@`0(@E)`0``P(`^`DD!0`"$```,P!`@"4D`@`*
+M`((`&P``&!!00``!``<`#51@`!269```)(+M0#P$9F8TA&9G`$0`&```(!``
+M!""#``(7PP""(",\$```)A`````$($`"`/@))`4`"`!`B"4D!``"`@#X"20%
+M``(0```9`$"`)20"``4`@@`;```8$%!```$`!P`-%&``)0``$"4DA.U`/`)F
+M9C1"9F<`@@`8```0$``"$$,`!"?#/!```"80````1"`C`@#X"20%``@`0(@E
+M)`0``0(`^`DD!0`"`$"`)0`1D0``$!"``D*0)0`5$$`"0I`E-E(0`3P0```F
+M$````H`@)30%F)P"`/@),D8`_P`2D@("@"`E-`68V`(`^`DR1@!_KI,2-"0"
+M``&/OP`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#`DH___+&(`
+M!Q!``!*,A"_L/`(``"1"=+@``QB``&(8(8QB````0``(``````/@``@`@!`E
+M`^``""2"``0#X``()((`"`/@``@D@@`,`^``""2"`*P#X``(```0)2>]_ZBO
+MOP!4K[X`4*^W`$ROM@!(K[4`1*^T`$"OLP`\K[(`.*^Q`#2OL``PKZ0`6`"@
+M\"4`X(`E,-;__P"`H"6OH``<KZ``(*^@`"2OH``HCI,O[":7+!"7P@`",$,!
+M\"0"`-`08@!%``"H)2AB`-$00``()`(!4"0"`*`08@`W)`(`P!!B`#T``!`E
+M$``!^H^_`%008@`**&(!41!```8D`@@`)`(!0!!B``4``!`E$``!\8^_`%04
+M8@'N```0)9?"```D0O!?+$($ZU!```:7P@``EH(35*^B`!R6@Q-6$```&J^C
+M`"`D0NMT+$(`\%!```:7P@``EH(36*^B`!R6@Q-:$```$:^C`"`D0NJ$+$(`
+MX5!```:7P@``EH(37*^B`!R6@Q->$```"*^C`"`L0A9=5$``!I:%$MZ6@A-@
+MKZ(`'):#$V*OHP`@EH42WI:"$RP0```/KZ(`&):#$VROHP`DEH(3<*^B`"B6
+MA1+@EH,3+A````>OHP`8EH(3;J^B`"2OH@`HEH42XI:#$S"OHP`8```@)3P"
+M```D1F^(``00@`)B$"$`!!C``&88(8QC``0DA``!$(#_^:Q#`````"`E)F8`
+M!#P"```D1V^0``00@`#"$"$`!!A``&08(0`#&$``=A@A``,8@`!G&"&,8P``
+M)(0``1"`__6L0P`````@)3P"```D1F^H``00@`!3$"$`!!A``&08(0`#&$``
+M=A@A``,8@`!F&"&,8P``)(0``1"`__6L0P`(```@)29F``0\`@``)$=OP``$
+M&(``9A@A``000`!$$"$``A!``%80(0`"$(``1Q`AC$(``*QB``@DA``!+((`
+M*%1`__0`!!B`)G$`#*^@`!`\`@``)%(```(@("4D!@`!`D#X"20'`2Z6!0``
+MKZ``$`(@("4D!@`"`D#X"20'`0Z6!0`"KZ``$`(@("4D!@`"`D#X"20'`0&7
+MP@`",$(`0!!``"LD$``#CN(`'(1%``*OL``0`B`@)20&``$"0/@))`<`J([B
+M`!R$10`$K[``$`(@("4D!@`!`D#X"20'`*F.X@`<A$4`!J^P`!`"("`E)`8`
+M`0)`^`DD!P"JCN(`'(1%``BOL``0`B`@)20&``$"0/@))`<`KH[B`!R$10`*
+MK[``$`(@("4D!@`!`D#X"20'`*^.X@`<A$4`#*^P`!`"("`E)`8``0)`^`DD
+M!P"PE\(``C!"`(`00``1)G$`#*^@`!`\$```)A````(@("6/I0`D)`8``P(`
+M^`DD!P$?KZ``$`(@("6/I0`H)`8``P(`^`DD!P$B$```$(^C`%BOH``0/!``
+M`"80```"("`ECZ4`'"0&``,"`/@))`<!%Z^@`!`"("`ECZ4`("0&``,"`/@)
+M)`<!&H^C`%B48@'4,$(`\"1"_]`L0@!`4$``*X^C`%B49`'4.(,`-2QC``$X
+M@@!%+$(``0!B&"448``')G(`#"0"`$80@@`$)`(`-A2"`!Z/HP!8)G(`#"01
+M``*OL0`0/!```"80```"0"`E)`4``B0&``("`/@))`<`6J^Q`!`"0"`E)`4`
+M`B0&``("`/@))`<`7*^Q`!`"0"`E)`4``B0&``("`/@))`<`7J^Q`!`"0"`E
+M)`4``B0&``$"`/@))`<`_H^C`%B48@'2+$(`0A1``"4``"`E)G(`#"0"``&O
+MH@`0/!```"80```"0"`E)`4``20&``$"`/@))`<!&201``.OL0`0`D`@)20%
+M``$D!@`"`@#X"20'``&OL0`0`D`@)20%``$D!@`"`@#X"20'``.OL0`0`D`@
+M)20%``$D!@`!`@#X"20'`(NOL0`0`D`@)20%``$D!@`!`@#X"20'`(P``"`E
+M)F4`!#P"```D1G.```08@`!E&"$`!!!``$00(0`"$$``5A`A``(0@`!&$"&,
+M0@``K&(`J"2$``$L@@`-5$#_]``$&("7P@`",$(`0!!```DF9`"LCN(`'(1%
+M``"OH``0/`(``"1"```D!@`"`$#X"20'`"4F<0"LKZ``$#P"```D4@```B`@
+M)8^E`!@D!@`&`D#X"20'``Z/P@``,$+``!!``!("("`EE]```C(00``N$``!
+M`!"`(S(0``<F$``(KZ``$"0%``\D!@`$`D#X"20'`#JOH``0`B`@)0(`*"4D
+M!@`$`D#X"20'`$8``(`E/`(``"16;X@\`@``)%(``#P"```D40```!`8P`!V
+M&"$`$!"``F(0(8^D`%B,90```D#X"8Q&```FM0`!,J(`/U1```0F$``!`B#X
+M"20$``$F$``!$@#_\#P"`````(`E)%=OD"9Q``0\`@``)%8``#P"```D4@``
+M`!`00`!0$"$``A#``%<0(0`0&(`"(Q@ACZ0`6(Q%```"P/@)C&8``":U``$R
+MH@`_5$``!"80``$"0/@))`0``280``$2`/_N/`(`````@"4D5F^H/`(``"12
+M```\`@``)%$````0$$``4!`A``(0P`!6$"$`$!B``',8(8^D`%B,10```D#X
+M"8QF``@FM0`!,J(`/U1```0F$``!`B#X"20$``$F$``!$@#_[CP"`````(`E
+M)%=OP"9Q``0\`@``)%8``#P"```D4@```!`00`!0$"$``A#``%<0(0`0&(``
+M<1@ACZ0`6(Q%```"P/@)C&8`"":U``$RH@`_5$``!"80``$"0/@))`0``280
+M``$N`@`H%$#_[@`0$$```(`E/`(``"16<X`F<0`$/`(``"13```\`@``)%(`
+M```0$$``4!`A``(0P`!6$"$`$!B``'$8(8^D`%B,10```F#X"8QF`*@FM0`!
+M,J(`/U1```0F$``!`D#X"20$``$F$``!+@(`#11`_^X`$!!`KH`OQ"0"``&/
+MOP!4C[X`4(^W`$R/M@!(C[4`1(^T`$"/LP`\C[(`.(^Q`#2/L``P`^``"">]
+M`%@GO?O0K[\$+*^^!"BOMP0DK[8$(*^U!!ROM`08K[,$%*^R!!"OL00,K[`$
+M"*^E!#2OI@0XKZ<$/*^D`^24@@'4,$(`\"1"_]`L0@!`$$``$20#``&4A`'4
+M.(,`-2QC``$X@@!%+$(``0!B&"448``')`(``B0"`$80@@`#)`(`-A2"``0D
+M`P`!)`(``A````*OH@/HKZ,#Z">D`!BOI`/LCZ,$/)1B``(P0P'P)`(`T%!B
+M`"./I`/D*&(`T1!```DD`@%0)`(`H!!B`!B/I`/D)`(`P%!B`!LDA!_L$``!
+MDP``$"408@`,CZ0#Y"AB`5$00``&)`((`"0"`4`08@`')(0?U!```8D``!`E
+M5&(!AP``$"6/I`/D)(0?U*^D`_"/HP/D$```"I1B$M@DA!_@KZ0#\(^C`^00
+M```%E&(2VB2$'^ROI`/PCZ,#Y)1B$MR/I`/PE(,`!@!#&"008`%S```0)8^C
+M!#B$8@````(40``"%`.OH@/XCZ0$-(2"`````A1```(4`Z^B`_0T`MZMIZ(#
+MT*>B`](``/`ECZ(#\)1$``8``)`E)Z,#T`)$$`<P0@`!6$``"292``$OP@`"
+M$$`!6@``$"4`'A!``&(0(:12```GW@`!)E(``2Y"``040/_S`D00!X^C!#R4
+M9```CZ(#\)1&``0GH@/<KZ(`$#P"``(D0AE`CZ,#\(QE````0/@))Z<#X(^T
+M`^"/H@/<`%00*Q1``'L``/`E)[8!(#P"```D5P``)[4!.">D`U"OI`/\)Z(!
+M4*^B!```%!"``%00(0`"$(``5!`A``(0@(^D`_",@P`(`$.8(9>C`](T`MZM
+M%&(`(I>R`]``$H"``A*`(0`0@(`"<!`AE%(`!@!`@"4`$HA``L`@)28%``@"
+MX/@)`B`P)0*@("4F!0`0`N#X"0(@,"6&9P`"CZ(#_*^B`!`"0"`E`L`H)3P#
+M``(D8QGP`&#X"0*@,"400`$3`!XAP(^B!```1"`A)Z4#4`+@^`DD!@"`$```
+M02?>``$`$H"``A*`(0`0@(`"<!`AE%(`!@!`@"4`$HA``L`@)28%``@"X/@)
+M`B`P)0*@("4F!0`0`N#X"0(@,"6&9P`"CZ,#_*^C`!`"0"`E`L`H)3P#``(D
+M8QGP`&#X"0*@,"400`#R`!XAP(^B!```1"`ACZ4#_`+@^`DD!@"`E[(#T@`2
+M@(`"$H`A`!"`@`)P$"&44@`&`$"`)0`2B$`"P"`E)@4`"`+@^`D"(#`E`J`@
+M)28%`!`"X/@)`B`P)89G``*/HP/\KZ,`$`)`("4"P"@E/`,``B1C&?``8/@)
+M`J`P)1!``-(`'B'`)Z("4`!$("$GI0-0`N#X"20&`(`GW@`!)I0``8^B`]P`
+M5!`K$$#_D``4$("/I0/@CZ(#\(Q$````!1!``$00(916``"/HP/<``,00`!$
+M$"&450```&7P(Y>C`](T`MZM%&(`,P``D"4GL0%0`!ZA@#P"``(D5QC<)[,`
+M((^C!#R49````!*`0`(P$"&$1P```I(0(0`"$$`"(A`AA$(``*^B`!`"P"@E
+M`N#X"0*@,"4"<(`AI@(``"92``$N0@!`%$#_[X^C!#P\`@`")$(;6">D`""/
+MHP/D`$#X"8QE1G@``A_"`&(8(0`#&$./I`0TI(,``)>B`)X``A0```(<`P`"
+M%\(`8A@A``,80X^B`^RD0P``CZ0$.*2#``"7H@/0CZ,$0*1B```0``!_I&(`
+M`B>T`5``'O&`K[X$!#P"``(D5QC<)[X`(">S`E"/H@0\E$0````2B$`"D1`A
+MA$<``(^C!`0`<H`A`!"`0`*0$"&$0@``KZ(`$`+`*"4"X/@)`J`P)0/1&"&D
+M8@``CZ($/)1$```"<1`AA$<```)P@"&&`@``KZ(`$`+`*"4"X/@)`J`P)0.Q
+M&"&D8@"@)E(``2Y"`$`40/_BCZ($/"0"``*/HP/H%&(`)(>C`1X\`@`")$(<
+M@">D`"`GI0"@CZ,#Y(QF1G@`0/@))Z<#V``"'\(`8A@A``,80X^D!#2D@P``
+MEZ(#V``"%````AP#``(7P@!B&"$``QA#CZ(#[*1#``"7H@">``(4```"'`,`
+M`A?"`&(8(0`#&$./I`0XI(,``)>B`]"/HP1`I&(``)>B`](0```QI&(``H^D
+M`_0`9!`J%$``%3P"``*/I`/X`&00*A1``!$\`@`")$(;6">D`*"/HP/D`$#X
+M"8QE1GB7HP/2CZ0$0*2#``"D@P`"``(?P@!B&"$``QA#CZ($-*1#```0```0
+MEZ(!'B1"&U@GI``@CZ,#Y`!`^`F,949XEZ,#T(^D!$"D@P``I(,``@`"'\(`
+M8A@A``,80X^B!#2D0P``EZ(`G@`"%````AP#``(7P@!B&"$``QA#CZ0#[*2#
+M``"/H@0XI$,``(^D!#B4@P``)`(`/P!#$"./HP/DI&(O]"0"``&/OP0LC[X$
+M*(^W!"2/M@0@C[4$'(^T!!B/LP04C[($$(^Q!`R/L`0(`^``"">]!#`PB/__
+M,*7__S#&__\`!SP```<D`Q#%`!&'HP`2`040(P!#`!@``!`2`,@8(P``````
+M9``8```8$@!#$"$`Q1@C`$,`&@``$!)08``!``<`#0`"%``#X``(``(4`P/@
+M``@`@!`E,,;__S"$__\`!A!``*)`(92B````@A`K$$``!(^I`!"M(````^``
+M"*S@``"5`O_^`((0*Q1```X`H!@E),+__ZTB```#X``(K.(````"$$.M(@``
+M`^``"*SB`````A!#K.(``"1"``$#X``(K2(```!H$"L00``,`````)1B```0
+M1/_R`&40(Y1B``(`@A`K%$#_\@!E$",D8P`"`&@0*U1`__>48@```^``"```
+M```GO?_`K[\`/*^^`#BOMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``
+M&`"@H"4`P+`EC[4`4#"$__\`!SP```>4`P``F"4D$0`!+(,``A1@`#D``!`E
+M``"`)227__\\`@`")%X8W``1$$``5!`AE$(```!0$"L00``)`!,@0`(W$"H0
+M0``'`)00(29B``$P4___)B(``3!1__\`$R!``)00(91%````$1A``'00(91&
+M````EB`AA(<```!V&"&$8@``KZ(`$`/`^`D"`"`E`!`80`!U&"&D8@````(4
+M```"%`,`4A`J%$``#B8"``$N`@!`$$``"R8"``$"`!`E)@,``3!P__\``A!`
+M`%40(:12```N`@!`%$#_^0(`$"4F`@`!,%#__RX"`$`40/_/`!$00"0"``&/
+MOP`\C[X`.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]
+M`$``@$`EE0(`?H4$`'Z%`P```(,@(RB$`'\D0O^"``(4`!"```(``DP#A0D`
+M`(4&`'XDPO__`$`X)0!&$"H00``-)`0`/R2"__\``A0```(D`P`$$$``2!`A
+MA$,```#C&"H`!!`G``(7P@!B&"148/_V)(+__P"`&"4D!P`_)&+__P!`("40
+M```$,$+__P`"'`,D9/__,(+__RQ"`#\00``&``,00`!($"&$0@```$80*A!`
+M__8`!!0`%&``#@`'$$`$X``7`2`0)0`'$$``11`AE$,``J1#```DXO__``(4
+M```"/`,$X__Y``<00`/@``@!(!`E`$40(:1#```DPO_^``(4```"-`,DXO__
+M``(4```"/`,$X__:)&+__P$@$"4#X``(``````"`6"4D#`!`E6(`?H5D`'Z$
+MHP```(,@(RB$`'\D0O^"``(4`!"```(``FP#A*T``(5I`'XE(O__`$!`)0!)
+M$"H00``-)`0`/R2"__\``A0```(D`P`$$$``2Q`AA$,```$#&"H`!!`G``(7
+MP@!B&"048/_V)(+__Y2B`'ZDX@```(!`)20*`#\!8"`EA.(```!)$"I00``(
+M``!@)3$"__\L0@`!``P8*P!#$"000``'````````8"4`H"`E$````R0(`#\`
+M`A0```)$`QD```@Q`O__``@00`!$$"&$0@```$D0*A!`__<E`O__,0+__RQ"
+M``$M@P`!`$,0)!!```X`"A!`!4``&`&@$"4`"A!``$80(91#``*D0P``)4+_
+M_P`"%````E0#!4/_^0`*$$`#X``(`:`0)0!&$"$!B!@EI$,``"4B__X``A0`
+M``),`R5"__\``A0```)4`P5#_\R$X@```:`0)0/@``@`````)[W_Z*^_`!2O
+ML``0`("`)8X$1G@0@``%/`(``"1"````0/@)`````*X`1GB.!"_L$(``!3P"
+M```D0@```$#X"0````"N`"_LC[\`%(^P`!`#X``()[T`&(2D``0``#`E)`<`
+M`22H``0`!Q"``$<0(0`"$(`!`A@AE&(```!$$"I00``$).<``0#@,"6$9```
+M).<``2CB``040/_T``<0@``&&(``9A@A``,8@"2B``@`8B`AA(@`"`!#$"&$
+M20``)`<``0`&$(``1A`A``(80"2E``@`9Q`A``(P0`#%$"&$1``(`(@0*A!`
+M``0DYP`!`(!`)0"F$"&$20``*.(`!%1`__4`9Q`A``D00`$"$",``A0``^``
+M"``"%`,GO?_0K[\`+*^V`"BOM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@*@E
+M`*"@)0#@L"6DP```EH(``C!"`4`D`P%`%$,`!`*@*"6.J!_<$```$Y:G']B6
+M@@`",$(`T#A#`,`L8P`!.$(`T"Q"``$`8A@E4&``!):#``*,J!_T$```!Y2G
+M'_`P8P"@)`0`H!1D`)DD`@`!C*@?Z)2G'^08X`"5```0)9:#``"5`@```&(0
+M*U1``!N5`@`"``<0@`!'$"$``A"``$<0(0`"$(`!`A`AE$+_K`!#$"L00``:
+M``!()0`'*(``IR@A``4H@`"G*"$`!2B``04H(92B_ZZDP@``/`(``B1"'D@"
+MH"`E`$#X"22E_ZRFP@``$```=B0"``&DP@``/`(``B1"'D@"H"`E`$#X"0$`
+M*"6FP@``$```;20"``$0X``5```@)9:#``"5`@```$,0*Q!``!$`!!"``(!(
+M)22$``$`AQ`J$$``#``$$(``1!`A``(0@`!$$"$``A"``$@0(9:#``"40@``
+M`$,0*U1`__,`@$@E``00@`!$$"$``A"``$00(0`"$(``2"@AE+(````)$(``
+M21`A``(0@`!)$"$``A"``$B8(99G```"1Y`C6D``-0`$$("$HP`"AF0``@!D
+M&".6@@```$<0(P!B`!@``!@2````````````D@`8```@$@!D&"$``````'(`
+M&@``&!)20``!``<`#0`#'@```QX#I,,``#P1``(F,1Y(`B#X"0*@("4`0(`E
+M`J`@)0(@^`D"8"@E`@*`(P*@("4"(/@)`F`H)9:#``"69````&08(P(#`!@`
+M`(`2````````````4@`8```0$@("@"$``````A(`&@``@!)20``!``<`#0`0
+MA@``$(8#IM```!```!(D`@`!`$00(0`"$(``1!`A``(0@`!(*"&6@P``E*(`
+M`%1B``D``!`EE*(``J3"```\`@`")$(>2`!`^`D"H"`EIL(``"0"``&/OP`L
+MC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`P)[W_R*^_`#2O
+MM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`("P)0"@J"4`P)`E)!,``1)`
+M`!4``(@E/`(``B14'PP`$1#``J*`(0+`("4"`"@E)Z8`$`*`^`DGIP`2$$``
+M!9.B`!&B`@`&DZ(`$Q````*B`@`'``"8)28Q``$",A`K%$#_\``1$,`"8!`E
+MC[\`-(^V`#"/M0`LC[0`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`.">]_^"O
+MOP`8K[$`%*^P`!``H(@E`("`)3P"```D0@```$#X"20$`.``0!@E%&``!*X#
+M+^PD`P`"$```**XC```D`@"`K@)&?#P"```D0@```$#X"20$`(``0!@E%&``
+M!*X#1G@D`P`"$```'*XC```D`@!`K@)&?#P"``(D0AWPK@(LJ#P"``(D0@-`
+MK@(LK#P"``(D0@B`K@(LL#P"``(D0@3HK@(LM#P"``(D0@C<K@(LN#P"``(D
+M0A&`K@(LO#P"``(D0B(HK@(LP#P"```D0@``K@(LQ"0"``&/OP`8C[$`%(^P
+M`!`#X``()[T`(">]_\BOOP`PK[<`+*^V`"BOM0`DK[0`(*^S`!ROL@`8K[$`
+M%*^P`!``@*`E`*"P)0#`N"4`X(`E``"()3P"```D4G3@/`(``"15```\`@``
+M)%,````1$$``41`A``(8P`!R&"$``A!``%80(0`"$(``4A`A`H`@)8QE```"
+MH/@)C$8``"80``$R`@`_5$``!"8Q``$"8/@))`0``28Q``$N(@`0%$#_[``1
+M$$```(@E/`(``"12=F`\`@``)%4``#P"```D4P```!$0P`!2&"$`8!`E`H`@
+M)8QE```"H/@)C$8`!"80``$R`@`_5$``!"8Q``$"8/@))`0``28Q``$N(@"+
+M%$#_\0`1$,```(@E/`(``"12>K@\`@``)%4``#P"```D4P```!$00`!1$"$`
+M`AB``'(8(0!7$"$``A"``%(0(0*`("6,90```J#X"8Q&```F$``!,@(`/U1`
+M``0F,0`!`F#X"20$``$F,0`!+B(`0%1`_^T`$1!`C[\`,(^W`"R/M@`HC[4`
+M)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#@GO?_0K[\`**^U`"2OM``@
+MK[,`'*^R`!BOL0`4K[``$`"`H"4`H)@E``"H)99D```L@A+`$$``1@``@"4D
+M@O=P)`,`!0!#`!H``!`04&```0`'``U40``+EF0````$$$`D4>[@/`)F9C1"
+M9F<"(@`8```0$``"$(,`$1_#$```$P!#B",D@O=0)`,`!0!#`!H``!`04&``
+M`0`'``T40`"U```0)0`$$$`D4>Z@/`)F9C1"9F<"(@`8```0$``"$(,`$1_#
+M`$.((R05``$`$8B`/`(``"1"```R)`#_`$#X"20%``@`0(@E/`(``"1"```"
+M@"`E`$#X"30%H@0`0#@EEF,``"0"";148@`))`;_[SP"```D0@```H`@)30%
+MH@0`0/@)-.8`$!```(``$9$`/`(``"1"```"@"`E-`6B!`!`^`D`YC`D$```
+M>``1D0`D`@`%`((`&P``&!!00``!``<`#3!C__\D`@`"5&(`'Y9D```L@A4\
+M4$``')9D``"68P``)&/__C!C__\``Q"``$,0(0`"$$`\`___-&-$@`!#$"$\
+M!%'K-(2%'P!$`!@``"`0``0@PP`"%\,`@B`C/!```"80```DA``!`@#X"20%
+M``@`0(@E```@)0(`^`DD!0`"$```4`!`@"4D`@`4`((`&P``&!!00``!``<`
+M#51@`!>69```+((4`%1``!269```)(+M0#P$9F8TA&9G`$0`&```(!``!"##
+M``(7PP""(",\$```)A`````$((`"`/@))`4`"`!`B"4D!``#`@#X"20%``(0
+M```S`$"`)20"``H`@@`;```8$%!```$`!P`-5&``%)9D```D@NU`/`1F9C2$
+M9F<`1``8```@$``$((,``A?#`((@(SP0```F$`````0@0`(`^`DD!0`(`$"(
+M)20$``("`/@))`4``A```!D`0(`E)`(`!0""`!L``!@04$```0`'``T48``E
+M```0)22$[4`\`F9F-$)F9P""`!@``!`0``(00P`$)\,\$```)A````!$(","
+M`/@))`4`"`!`B"4D!``!`@#X"20%``(`0(`E`!&1```0$(`"0I`E`!400`)"
+MD"4V4A`!/!```"80```"@"`E-`68G`(`^`DR1@#_`!*2`@*`("4T!9C8`@#X
+M"3)&`'^NDQ(T)`(``8^_`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``(
+M)[T`,">]_\"OOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!RO
+ML``8`("H)3#4__\"H/`E``"8)92B``(P0P'P)`(`P!!B`!"/TB_L*&(`P1!`
+M``8D`@#0)`(`H!!B``<``!`E$```Z8^_`#P08@`&```0)1```.6/OP`\E\43
+M9!````.7UA-FE\43:)?6$VH``"`E/`(``"1&?;@`!!"``D(0(0`$&,``9A@A
+MC&,`!"2$``$0@/_YK$,`````("4F1@`$/`(``"1'?<``!!"``,(0(0`$&$``
+M9!@A``,80`!T&"$``QB``&<8(8QC```DA``!$(#_]:Q#`````"`E/`(``"1&
+M?=@`!!"``%(0(0`$&$``9!@A``,80`!T&"$``QB``&88(8QC```DA``!$(#_
+M]:Q#``@``"`E)D8`!#P"```D1WWP``08@`!F&"$`!!!``$00(0`"$$``5!`A
+M``(0@`!'$"&,0@``K&(`""2$``$L@@`;5$#_]``$&(`F40`,KZ``$#P0```F
+M$````B`@)20&``,"`/@))`<`J*^@`!`"("`E`L`H)20&``,"`/@))`<`I0``
+M("4\`@`!)$6`>``$&(``<A@A``000`!$$"$``A!``%00(0`"$(``11`AC$(`
+M`*QB`'@DA``!+((``Q1`__0`!!B```"`)3P"```D5GVX/`(``"14```\`@``
+M)%$````0&,``=A@A`!`0@`)"$"$"H"`EC&4```*`^`F,1@``)G,``3)B`#]4
+M0``$)A```0(@^`DD!``!)A```1(`__`\`@````"`)217?<`F40`$/`(``"16
+M```\`@``)%0````0$$``4!`A``(0P`!7$"$`$!B``B,8(0*@("6,10```L#X
+M"8QF```F<P`!,F(`/U1```0F$``!`H#X"20$``$F$``!$@#_[CP"`````(`E
+M)%9]V#P"```D5```/`(``"11````$!!``%`0(0`"$,``5A`A`!`8@`!R&"$"
+MH"`EC$4```*`^`F,9@`()G,``3)B`#]40``$)A```0(@^`DD!``!)A```1(`
+M_^X\`@````"`)217??`F40`$/`(``"16```\`@``)%0````0$$``4!`A``(0
+MP`!7$"$`$!B``'$8(0*@("6,10```L#X"8QF``@F<P`!,F(`/U1```0F$``!
+M`H#X"20$``$F$``!+@(`&Q1`_^X`$!!```"`)3P"``$D5H!X/`(``"14```\
+M`@``)%$````0$$``4!`A``(0P`!6$"$`$!B``'(8(0*@("6,10```H#X"8QF
+M`'@F<P`!,F(`/U1```0F$``!`B#X"20$``$F$``!+@(``Q1`_^X`$!!`K\`O
+MQ"0"``&/OP`\C[X`.(^W`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8
+M`^``"">]`$`DH___+&(`!Q!``!*,A"_L/`(``21"@,```QB``&(8(8QB````
+M0``(``````/@``@`@!`E`^``""2"``0#X``()((`"`/@``@D@@`,`^``""2"
+M`'@#X``(```0)0`$)``PQO__``0D`P`&$$``HD`AE*(```""$"H00``$CZD`
+M$*T@```#X``(K.```)4"__X`@A`J%$``#@"@&"4DPO__K2(```/@``BLX@``
+M``(00ZTB```#X``(K.(````"$$.LX@``)$(``0/@``BM(@```&@0*Q!```P`
+M````E&(``!!$__(`91`CE&(``@""$"H40/_R`&40(R1C``(`:!`K5$#_]Y1B
+M```#X``(`````">]_[BOOP!$K[X`0*^W`#ROM@`XK[4`-*^T`#"OLP`LK[(`
+M**^Q`"2OL``@KZ0`2`#@D"6/M`!8C[X`8``%+```!2P#``8T```&-`.7LP!>
+M``440``"A`,``(@E+F,``A1@`%```!`E`,40(S!"__\`41`K%$``2R0"``$\
+M`@`")%<MJ"9V__\`Q1`C,%7__R>B`!ROH@`0`@`@)0)`*"4"8#`E`N#X"2>G
+M`!B/H@`<%$``!(^B`!@D`@`!KZ(`'(^B`!@45@`$CZ(`&"9B__ZOH@`8CZ(`
+M&``"($``DA@ACZ(`'``"$$``4A`AA&,``(1"```48@`$CZ8`&`"4$"$0```9
+ME$,````&,$``TA`AA$<```('*"./HP`<``,80`!T$"&40@```*(`&```*!(`
+M<A@AA&0```"0&",`U#`AE,(```!B`!@``!@2`*,H(0"'(",`I``:```H$E"`
+M``$`!P`-,*/__X^D`$@`!!&``%$0(0`"$$``7A`AI$,``"8B``$P4?__)@(`
+M`@`"%````H0#`K$0*Q!`_[XGH@`<)`(``8^_`$2/O@!`C[<`/(^V`#B/M0`T
+MC[0`,(^S`"R/L@`HC[$`)(^P`"`#X``()[T`2#"(__\PI?__,,;__P`'/```
+M!R0#$,4`$8>C`!(!!1`C`$,`&```$!(`R!@C``````!D`!@``!@2`$,0(0#%
+M&",`0P`:```0$E!@``$`!P`-``(4``/@``@``A0#`^``"`"`$"4GO?^(K[\`
+M=*^^`'"OMP!LK[8`:*^U`&2OM`!@K[,`7*^R`%BOL0!4K[``4`#`N"4PI?__
+MKZ4`.##G__^OIP`\C)0LI*^@`$``!20`EN8`%">B`#"OH@`0/`(``B1"+:@`
+M!"0#`N`H)0!`^`DGIP`T``"8)2>B`""OH@!()OX`#">C`"BOHP!$)`(``P!3
+M0",`"!!``$@0(0`".,"/HP`T``,00`!#$"$``AD``$,0(0`"$$``XC`A),4`
+M&`+E$"&450`($J``J8^M`$``#2!`CZ(`D`""&"$"Y1`AE$(`!J1B``"/HP!(
+M`&0H(0#>$"&41``@I*0``(^C`#```Q!``$,0(0`"&0``0Q`A``(00`#B$"$`
+M7A`A``0D```$)`.40P`@A$(`(`!$$"I40``!I*,``(^D`$``!"A`CZ<`2`#E
+M("&4@@````(4```"'`,``A?"`&(8(0`#&$.D@P``CZT`1`&E,"$`""!``(@@
+M(0`$(("/HP`T``,00`!#$"$``AD``$,0(0""$"$`51`A``(00`!>$"&410`>
+MI,4``(^C`#```Q!``$,0(0`"&0``0Q`A`((@(0"5("$`!"!``)X@(0`%+```
+M!2P#A((`'@!%$"H00``"E(,`'J3#``"/H@!```*(0(^C`$0`<9`AED(````"
+M%````C0#``(7P@#","$`!C!#ID8``(^D`$@`D8@AAB4``(^B`#0``CA``.(X
+M(0`'$0``XC@A``<X0``(@$`""(`A`!"`P`#P."$`]S@A).(`(J^B`!"OM0`4
+MK[0`&(^D`$`\#0`"):TN7`&@^`DDYP`LAB4``(9&``"/H@`P``(X0`#B."$`
+M!Q$``.(X(0`'.$``\#@A`/<X(23B`"*OH@`0K[4`%":"`@"OH@`8CZ0`0#P#
+M``(D8RY<`&#X"23G`"R60P``EB(```!B&",P8___$&``)0``B"6/I`!```2Q
+M@``$&$`GH@`H`$.H(2>B`"``0Y`ACZ(`-``"$$`"XA`AE$4``(^B`#```A!`
+M`N(0(91&```"T8`A`!"`0`*0$"&$1P```A00(81"`@"OH@`0/`T``B6M,#`!
+MH/@)CZ0`.`(4@"&F`@0`)C$``9:B``"60P```$,0(S!"__\"(A`K%$#_Y8^B
+M`#2/H@!`)$(``:^B`$`F<P`!+F(`!!1`_T4D`@`#EZ,`((^B`(BD0P````"8
+M)8^C`$`08`"?``"()2>L`"@GJP`@CZ0`0"2"__\68@`)`!,80``3$$"/I0",
+M`$48(0&"$"&40@``)$(`!!````RD8@``CZ<`C`!G("$!@Q`AA$(```!K&"&$
+M8P`"`$,0(0`"'\(`0Q`A``(00Z2"```28``*```@)0`3&$"/K0",`:,0(91$
+M__X!8Q@AA&(```""("./H@`\`((@(P`3&<``=!`A`$`8)91"!`*48P0``$,0
+M(S!&__\4P``"`,`0)20"``$$@0`5`$`P)0`3$<`D0@0``H(H(0"&`!@``!`2
+ME*,```!B&"$``QP```,<`P`1$$"/IP"4`$<0(01@``,F,0`!$````J1#``"D
+M0```)(0``02`__$`A@`8`!,80`&#$"&$2````6,0(81"```!`D`CCZT`C`!M
+M&"&490``CZ,`/`"C*"$`HB@C`0!()0"I$"M40``!`*!()0`)%```0!@E``(4
+M`P""$"H00``0`!,1@``3.8```S0#`!$80(^M`)0`;1@A`.00(0`"$$``5!`A
+ME$($`*1B```DA``!`(80*A1`__4F,0`!`!,1@`!($"$``AA``'08(0!@$"64
+M8P/^E$(#_`!B&",P9O__%,```@#`$"4D`@`!`$`P)0$E$"M00``C)G,``0`%
+M%````A0#`((0*E!``!XF<P`!`!,1@`!($"$``A!`)$(#_@*"0"$D"@!_``44
+M```"/`,`B1@C`&8`&```&!*5`@```$,0(0`"%````AP#`!$00(^M`)0`32@A
+M*&(`@!!```,F,0`!$````J2C``"DJ@``)(0``0"'$"H40/_N`(D8(R9S``&/
+MHP!``F,0*U1`_V:/I`!`+F(`!!!```LN(@"``!,00(^D`(P`1!`AE$/__J1#
+M```F<P`!+F(`!!1`__D`$Q!`+B(`@!!```N/OP!T`!$00(^E`)0`11`AE$/_
+M_J1#```F,0`!+B(`@!1`__D`$1!`C[\`=(^^`'"/MP!LC[8`:(^U`&2/M`!@
+MC[,`7(^R`%B/L0!4C[``4`/@``@GO0!X)[W_L*^_`$ROM@!(K[4`1*^T`$"O
+MLP`\K[(`.*^Q`#2OL``P`("0)0#@F"4"0*`ECE5&>)9B``(P0@#0.$,`P"QC
+M``$X0@#0+$(``0!B&"448``')E$G_)9C``(P8P"@)`0`H":1(^@49`!;```0
+M)3P0```F$````D`@)0(`^`DT!:)L,%8`#Y9E```GH@`HKZ(`$">B`""OH@`4
+MCZ(`8*^B`!BOM0`</`(``B1",)0"0"`E`B`P)0!`^`D"P#@E`D`@)0(`^`DT
+M!:)8/`/__S1C/_\`0Q`DEB8`'"3&__\`!C.`,,;``#P#```D8P```D`@)30%
+MHE@`8/@)`$8P)8>B`"@00``$EZ,`*``#$",0```"IH(O]*:`+_0T$:*```"`
+M)3P"```D4P```!`8P`!U&"&09P`!D&(``P`"$@``XC@ED&(`!0`"%```XC@E
+MD&8`!P`&-@`"0"`E`B`H)0)@^`D`YC`E)A```2X"`"`40/_N)C$`!)>F`"``
+M!C$`,,8#\`+&,"67H@`B``(2@#!"_```PC`EEZ(`)``"%``\`P`_`$,0)`#"
+M,"67HP`F``,=@#P"#\``8A@D/`(``"1"```"0"`E-`6B;`!`^`D`PS`E)`(`
+M`8^_`$R/M@!(C[4`1(^T`$"/LP`\C[(`.(^Q`#2/L``P`^``"">]`%`GO?_H
+MK[\`%*^P`!``@(`EC@1&>!"```4\`@``)$(```!`^`D`````K@!&>(X$+^P0
+M@``%/`(``"1"````0/@)`````*X`+^R.!"RD$(``!3P"```D0@```$#X"0``
+M``"N`"RDC[\`%(^P`!`#X``()[T`&```("4D!P`#)*8`""2E``P`Y!@C``,0
+M0`!#$"$``AC``,,0(91"``!00``$)(0``0!E$"$#X``(A$(`""R"``040/_T
+M`.08(P``$"4``A0``^``"``"%`,``#`E)*<`""2E``P`!A!``$8@(0`$$,``
+MXA`AE$,``%!@``<DQ@`!``00@`!#$"$``A!``$40(0/@``B$0@`&+,(`!%1`
+M__(`!A!````0)0`"%``#X``(``(4`R>]_\BOOP`TK[X`,*^W`"ROM@`HK[4`
+M)*^T`""OLP`<K[(`&*^Q`!2OL``0`("H)0"@L"4`P+@E`.#P)0*@,"6FX```
+MEL(``C!"`-`X0P#`+&,``3A"`-`L0@`!`&(8)11@``<FI2?\EL,``C!C`*`D
+M!`"@),4CZ!1D`*8``!`EE*8`%"2Q`!@0P`"B```0)9;$``"6(@```((0*Q1`
+M`!,\`@`"``800`!&$"$``AD``$,0(0`"$$`"(A`AE$+_F@!$$"L00``6```H
+M)0`&@$`"!H`A`&`0)0("@"$`$(!``C"`(1```'XF$/^:)$(Z``*@("4`0/@)
+M`B`H):;B```\`@`")$(YJ`*@("4`0/@)`B`H):?"```0``!^)`(``1#``!4`
+M`"`EEL,``)8B````0Q`K$$``$0`$$$``@"@E)(0``0"&$"H00``,``000`!$
+M$"$``AD``$,0(0`"$$``41`AEL,``)1"````0Q`K5$#_\P"`*"4`!!!``$00
+M(0`"&0``0Q`A``(00`!1H"&6D@````400`!%$"$``AD``$,0(0`"$$``49@A
+MEF(```)"D"-:0`!!``000#P1``(F,3H``J`@)0(@^`D"@"@E`$"`)0*@("4"
+M(/@)`F`H)0("@","H"`E`B#X"0)@*"66PP``EF0```!D&","`P`8``"`$@``
+M`````````%(`&```$!("`H`A``````(2`!H``(`24D```0`'``T`$(8``!"&
+M`Z;P```\$0`")C$YJ`*@("4"(/@)`H`H)0!`@"4"H"`E`B#X"0)@*"4"`H`C
+M`J`@)0(@^`D"8"@EEL,``)9D````9!@C`@,`&```@!(```````````!2`!@`
+M`!`2`@*`(0`````"$@`:``"`$E)```$`!P`-`!"&```0A@.GT```$```%R0"
+M``$`1!`A``(9``!#$"$``A!``%&`(9;#``"6`@``5&(`#@``$"4\`@`")$(Z
+M``*@("4`0/@)`@`H):;B```\`@`")$(YJ`*@("4`0/@)`@`H):?"```D`@`!
+MC[\`-(^^`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@G
+MO0`X)[W_R*^_`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`("P)0"@
+MJ"4`P)`E)!,``1)``!4``(@E/`(``B14.EP`$1#``J*`(0+`("4"`"@E)Z8`
+M$`*`^`DGIP`2$$``!9.B`!&B`@`&DZ(`$Q````*B`@`'``"8)28Q``$",A`K
+M%$#_\``1$,`"8!`EC[\`-(^V`#"/M0`LC[0`*(^S`"2/L@`@C[$`'(^P`!@#
+MX``()[T`.">]_^"OOP`8K[$`%*^P`!``H(@E`("`)3P"```D0@```$#X"20$
+M`(0`0!@E%&``!*X#+^PD`P`"$```,*XC```D`@$`K@)&?#P"```D0@```$#X
+M"20$`0``0!@E%&``!*X#1G@D`P`"$```)*XC```\`@``)$(```!`^`DD!`8`
+M`$`8)11@``2N`RRD)`,``A```!JN(P``/`(``B1".32N`BRH/`(``B1"(]"N
+M`BRL/`(``B1"+4RN`BRP/`(``B1")7BN`BRT/`(``B1"*1"N`BRX/`(``B1"
+M-S2N`BR\/`(``B1"/:"N`BS`/`(``"1"``"N`BS$)`(``8^_`!B/L0`4C[``
+M$`/@``@GO0`@```````````GO?_(K[\`,*^W`"ROM@`HK[4`)*^T`""OLP`<
+MK[(`&*^Q`!2OL``0`("@)0"@L"4`P+@E`."`)0``B"4\`@`!)%*`X#P"```D
+M50``/`(``"13````$1!``%$0(0`"&,``<A@A``(00`!6$"$``A"``%(0(0*`
+M("6,90```J#X"8Q&```F$``!,@(`/U1```0F,0`!`F#X"20$``$F,0`!+B(`
+M'A1`_^P`$1!```"()3P"``$D4H.P/`(``"15```\`@``)%,````1$,``4A@A
+M`&`0)0*`("6,90```J#X"8Q&``0F$``!,@(`/U1```0F,0`!`F#X"20$``$F
+M,0`!+B(`@!1`__$`$1#```"()3P"``$D4H>P/`(``"15```\`@``)%,````1
+M$$``41`A``(8@`!R&"$`5Q`A``(0@`!2$"$"@"`EC&4```*@^`F,1@``)A``
+M`3("`#]40``$)C$``0)@^`DD!``!)C$``2XB`$!40/_M`!$00(^_`#"/MP`L
+MC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`X)[W_T*^_`"BO
+MM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@*`E`*"8)0``J"669```+((2P!!`
+M`$8``(`E)(+W<"0#``4`0P`:```0$%!@``$`!P`-5$``"Y9D````!!!`)%'N
+MX#P"9F8T0F9G`B(`&```$!```A"#`!$?PQ```!,`0X@C)(+W4"0#``4`0P`:
+M```0$%!@``$`!P`-%$``IP``$"4`!!!`)%'NH#P"9F8T0F9G`B(`&```$!``
+M`A"#`!$?PP!#B",D%0`!`!&(@#P"```D0@``,B0`_P!`^`DD!0`(`$"()3P"
+M```D0@```H`@)0!`^`DT!:($`$`X)99C```D`@FT5&(`"20&_^\\`@``)$(`
+M``*`("4T!:($`$#X"33F`!`0``!R`!&1`#P"```D0@```H`@)30%H@0`0/@)
+M`.8P)!```&H`$9$`)`(`!0""`!L``!@04$```0`'``TP8___)`(``E1B`!^6
+M9```+((5/%!``!R69```EF,``"1C__XP8___``,0@`!#$"$``A!`/`/__S1C
+M1(``0Q`A/`11ZS2$A1\`1``8```@$``$(,,``A?#`((@(SP0```F$```)(0`
+M`0(`^`DD!0`(`$"()0``("4"`/@))`4``A```$(`0(`E)`(`%`""`!L``!@0
+M4$```0`'``U48``0EF0``"R"%`!40``-EF0``"2"[4`\!&9F-(1F9P!$`!@`
+M`"`0``0@PP`"%\,`@B`C/!```"80```0```E``0@@"0"``H`@@`;```8$%!`
+M``$`!P`-5&``#99D```D@NU`/`1F9C2$9F<`1``8```@$``$((,``A?#`((@
+M(SP0```F$```$```$@`$($`D`@`%`((`&P``&!!00``!``<`#11@`"4``!`E
+M)(3M0#P"9F8T0F9G`((`&```$!```A!#``0GPSP0```F$````$0@(P(`^`DD
+M!0`(`$"()20$``$"`/@))`4``@!`@"4`$9$``!`0@`)"D"4`%1!``D*0)392
+M$`$\$```)A````*`("4T!9B<`@#X"3)&`/\`$I("`H`@)30%F-@"`/@),D8`
+M?ZZ3$C0D`@`!C[\`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`P
+M)[W_P*^_`#ROO@`XK[<`-*^V`#"OM0`LK[0`**^S`"2OL@`@K[$`'*^P`!@`
+M@+@E,-7__P+@H"4``$`E``"P)0``2"4``/`E``"8)92B``(P0P'P)`(`T!!B
+M`"Z.DB_L*&(`T1!```@D`@%`)`(`H!!B`"4D`@#`$&(`)@``$"40``$XC[\`
+M/!!B``,D`@%0%&(!,P``$"64H@``)$+P7RQ"!.M00``$E*(``):($U00```:
+MEI835B1"ZW0L0@#P4$``!)2B``"6B!-8$```$Y:6$UHD0NJ$+$(`X5!```24
+MH@``EH@37!````R6EA->+$(6711```H``"`EEH@38!````>6EA-BEHD39!``
+M``.6GA-FEHD3:):>$VH``"`E/`(``21&BK``!!"``D(0(0`$&,``9A@AC&,`
+M!"2$``$0@/_YK$,`````("4F1@`$/`(``21'BK@`!!"``,(0(0`$&$``9!@A
+M``,80`!U&"$``QB``&<8(8QC```DA``!$(#_]:Q#`````"`E/`(``21&BM``
+M!!"``%(0(0`$&$``9!@A``,80`!U&"$``QB``&88(8QC```DA``!$(#_]:Q#
+M``@``"`E)D8`!#P"``$D1XKH``08@`!F&"$`!!!``$00(0`"$$``51`A``(0
+M@`!'$"&,0@``K&(`""2$``$L@@`E5$#_]``$&("4H@`",$(`@!!``#`F40`,
+MKZ``$#P0```F$````B`@)0$@*"4D!@`#`@#X"20'`/&OH``0`B`@)0/`*"4D
+M!@`#`@#X"20'`.XD`@`"KZ(`$`(@("4D!0`!)`8``0(`^`DD!P$CCN,!S"0"
+M``D08@`')`(`"A1B`"0``"`EEN(!T"Q"``000``A/`(``3P"```D0@``)`0`
+M!@!`^`DD!0`#)`,``Z^C`!`\`P``)&,``"9$``P`0"@E)`8``P!@^`DD!P"#
+M$```$```("6OH``0/!```"80```"("`E`0`H)20&``,"`/@))`<`]Z^@`!`"
+M("`E`L`H)20&``,"`/@))`<`]```("4\`@`!)$6.8``$&(``<A@A``000`!$
+M$"$``A!``%40(0`"$(``11`AC$(``*QB`*`DA``!+((``Q1`__0`!!B```"`
+M)3P"``$D5HJP/`(``"15```\`@``)%$````0&,``=A@A`!`0@`)"$"$"X"`E
+MC&4```*@^`F,1@``)G,``3)B`#]40``$)A```0(@^`DD!``!)A```1(`__`\
+M`@`!``"`)21>BK@F40`$/`(``"16```\`@``)%4````0$$``4!`A``(0P`!>
+M$"$`$!B``B,8(0+@("6,10```L#X"8QF```F<P`!,F(`/U1```0F$``!`J#X
+M"20$``$F$``!$@#_[CP"``$``(`E)%:*T#P"```D50``/`(``"11````$!!`
+M`%`0(0`"$,``5A`A`!`8@`!R&"$"X"`EC$4```*@^`F,9@`()G,``3)B`#]4
+M0``$)A```0(@^`DD!``!)A```1(`_^X\`@`!``"`)21>BN@F40`$/`(``"16
+M```\`@``)%4````0$$``4!`A``(0P`!>$"$`$!B``'$8(0+@("6,10```L#X
+M"8QF``@F<P`!,F(`/U1```0F$``!`J#X"20$``$F$``!+@(`)11`_^X`$!!`
+M``"`)3P"``$D5HY@/`(``"15```\`@``)%$````0$$``4!`A``(0P`!6$"$`
+M$!B``'(8(0+@("6,10```J#X"8QF`*`F<P`!,F(`/U1```0F$``!`B#X"20$
+M``$F$``!+@(``Q1`_^X`$!!`KH`OQ"0"``&/OP`\C[X`.(^W`#2/M@`PC[4`
+M+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`DH___+&(`!Q!``!*,A"_L
+M/`(``21"CJ@``QB``&(8(8QB````0``(``````/@``@`@!`E`^``""2"``0#
+MX``()((`"`/@``@D@@`,`^``""2"`*`#X``(```0)0`$)``PQO__``0D`P`&
+M$$``HD`AE*(```""$"H00``$CZD`$*T@```#X``(K.```)4"__X`@A`J%$``
+M#@"@&"4DPO__K2(```/@``BLX@````(00ZTB```#X``(K.(````"$$.LX@``
+M)$(``0/@``BM(@```&@0*Q!```P`````E&(``!!$__(`91`CE&(``@""$"H4
+M0/_R`&40(R1C``(`:!`K5$#_]Y1B```#X``(`````">]_[BOOP!$K[X`0*^W
+M`#ROM@`XK[4`-*^T`#"OLP`LK[(`**^Q`"2OL``@KZ0`2`#@D"6/M`!8C[X`
+M8``%+```!2P#``8T```&-`.7LP!>``440``"A`,``(@E+F,``A1@`%```!`E
+M`,40(S!"__\`41`K%$``2R0"``$\`@`")%=*9"9V__\`Q1`C,%7__R>B`!RO
+MH@`0`@`@)0)`*"4"8#`E`N#X"2>G`!B/H@`<%$``!(^B`!@D`@`!KZ(`'(^B
+M`!@45@`$CZ(`&"9B__ZOH@`8CZ(`&``"($``DA@ACZ(`'``"$$``4A`AA&,`
+M`(1"```48@`$CZ8`&`"4$"$0```9E$,````&,$``TA`AA$<```('*"./HP`<
+M``,80`!T$"&40@```*(`&```*!(`<A@AA&0```"0&",`U#`AE,(```!B`!@`
+M`!@2`*,H(0"'(",`I``:```H$E"```$`!P`-,*/__X^D`$@`!!&``%$0(0`"
+M$$``7A`AI$,``"8B``$P4?__)@(``@`"%````H0#`K$0*Q!`_[XGH@`<)`(`
+M`8^_`$2/O@!`C[<`/(^V`#B/M0`TC[0`,(^S`"R/L@`HC[$`)(^P`"`#X``(
+M)[T`2#"(__\PI?__,,;__P`'/```!R0#$,4`$8>C`!(!!1`C`$,`&```$!(`
+MR!@C``````!D`!@``!@2`$,0(0#%&",`0P`:```0$E!@``$`!P`-``(4``/@
+M``@``A0#`^``"`"`$"4GO?^(K[\`=*^^`'"OMP!LK[8`:*^U`&2OM`!@K[,`
+M7*^R`%BOL0!4K[``4`#`N"4PI?__KZ4`.##G__^OIP`\C)0LI*^@`$``!20`
+MEN8`%">B`#"OH@`0/`(``B1"2F0`!"0#`N`H)0!`^`DGIP`T``"8)2>B`""O
+MH@!()OX`#">C`"BOHP!$)`(``P!30",`"!!``$@0(0`".,"/HP`T``,00`!#
+M$"$``AD``$,0(0`"$$``XC`A),4`&`+E$"&450`($J``J8^M`$``#2!`CZ(`
+MD`""&"$"Y1`AE$(`!J1B``"/HP!(`&0H(0#>$"&41``@I*0``(^C`#```Q!`
+M`$,0(0`"&0``0Q`A``(00`#B$"$`7A`A``0D```$)`.40P`@A$(`(`!$$"I4
+M0``!I*,``(^D`$``!"A`CZ<`2`#E("&4@@````(4```"'`,``A?"`&(8(0`#
+M&$.D@P``CZT`1`&E,"$`""!``(@@(0`$(("/HP`T``,00`!#$"$``AD``$,0
+M(0""$"$`51`A``(00`!>$"&410`>I,4``(^C`#```Q!``$,0(0`"&0``0Q`A
+M`((@(0"5("$`!"!``)X@(0`%+```!2P#A((`'@!%$"H00``"E(,`'J3#``"/
+MH@!```*(0(^C`$0`<9`AED(````"%````C0#``(7P@#","$`!C!#ID8``(^D
+M`$@`D8@AAB4``(^B`#0``CA``.(X(0`'$0``XC@A``<X0``(@$`""(`A`!"`
+MP`#P."$`]S@A).(`(J^B`!"OM0`4K[0`&(^D`$`\#0`"):U+&`&@^`DDYP`L
+MAB4``(9&``"/H@`P``(X0`#B."$`!Q$``.(X(0`'.$``\#@A`/<X(23B`"*O
+MH@`0K[4`%":"`@"OH@`8CZ0`0#P#``(D8TL8`&#X"23G`"R60P``EB(```!B
+M&",P8___$&``)0``B"6/I`!```2Q@``$&$`GH@`H`$.H(2>B`"``0Y`ACZ(`
+M-``"$$`"XA`AE$4``(^B`#```A!``N(0(91&```"T8`A`!"`0`*0$"&$1P``
+M`A00(81"`@"OH@`0/`T``B6M3.P!H/@)CZ0`.`(4@"&F`@0`)C$``9:B``"6
+M0P```$,0(S!"__\"(A`K%$#_Y8^B`#2/H@!`)$(``:^B`$`F<P`!+F(`!!1`
+M_T4D`@`#EZ,`((^B`(BD0P````"8)8^C`$`08`"?``"()2>L`"@GJP`@CZ0`
+M0"2"__\68@`)`!,80``3$$"/I0",`$48(0&"$"&40@``)$(`!!````RD8@``
+MCZ<`C`!G("$!@Q`AA$(```!K&"&$8P`"`$,0(0`"'\(`0Q`A``(00Z2"```2
+M8``*```@)0`3&$"/K0",`:,0(91$__X!8Q@AA&(```""("./H@`\`((@(P`3
+M&<``=!`A`$`8)91"!`*48P0``$,0(S!&__\4P``"`,`0)20"``$$@0`5`$`P
+M)0`3$<`D0@0``H(H(0"&`!@``!`2E*,```!B&"$``QP```,<`P`1$$"/IP"4
+M`$<0(01@``,F,0`!$````J1#``"D0```)(0``02`__$`A@`8`!,80`&#$"&$
+M2````6,0(81"```!`D`CCZT`C`!M&"&490``CZ,`/`"C*"$`HB@C`0!()0"I
+M$"M40``!`*!()0`)%```0!@E``(4`P""$"H00``0`!,1@``3.8```S0#`!$8
+M0(^M`)0`;1@A`.00(0`"$$``5!`AE$($`*1B```DA``!`(80*A1`__4F,0`!
+M`!,1@`!($"$``AA``'08(0!@$"648P/^E$(#_`!B&",P9O__%,```@#`$"4D
+M`@`!`$`P)0$E$"M00``C)G,``0`%%````A0#`((0*E!``!XF<P`!`!,1@`!(
+M$"$``A!`)$(#_@*"0"$D"@!_``44```"/`,`B1@C`&8`&```&!*5`@```$,0
+M(0`"%````AP#`!$00(^M`)0`32@A*&(`@!!```,F,0`!$````J2C``"DJ@``
+M)(0``0"'$"H40/_N`(D8(R9S``&/HP!``F,0*U1`_V:/I`!`+F(`!!!```LN
+M(@"``!,00(^D`(P`1!`AE$/__J1#```F<P`!+F(`!!1`__D`$Q!`+B(`@!!`
+M``N/OP!T`!$00(^E`)0`11`AE$/__J1#```F,0`!+B(`@!1`__D`$1!`C[\`
+M=(^^`'"/MP!LC[8`:(^U`&2/M`!@C[,`7(^R`%B/L0!4C[``4`/@``@GO0!X
+M)[W_L*^_`$ROM@!(K[4`1*^T`$"OLP`\K[(`.*^Q`#2OL``P`("8)0#@H"4"
+M8)`ECG5&>):"``(P0@#0.$,`P"QC``$X0@#0+$(``0!B&"448``')G$G_):"
+M``(P0@"@)`,`H!!#``(F42/H)E$?U#P0```F$````F`@)0(`^`DT!:)L,%8`
+M#Y:%```GH@`HKZ(`$">B`""OH@`4CZ(`8*^B`!BOM0`</`(``B1"35`"8"`E
+M`B`P)0!`^`D"P#@E`F`@)0(`^`DT!:)8/`/__S1C/_\`0Q`DEB8`'"3&__\`
+M!C.`,,;``#P#```D8P```F`@)30%HE@`8/@)`$8P)8>B`"@00``$EZ,`*``#
+M$",0```"ID(O]*9`+_0T$:*```"`)3P"```D4@```!`8P`!U&"&09P`!D&(`
+M`P`"$@``XC@ED&(`!0`"%```XC@ED&8`!P`&-@`"8"`E`B`H)0)`^`D`YC`E
+M)A```2X"`"`40/_N)C$`!)>F`"``!C$`,,8#\`+&,"67H@`B``(2@#!"_```
+MPC`EEZ(`)``"%``\`P`_`$,0)`#","67HP`F``,=@#P"#\``8A@D/`(``"1"
+M```"8"`E-`6B;`!`^`D`PS`E)`(``8^_`$R/M@!(C[4`1(^T`$"/LP`\C[(`
+M.(^Q`#2/L``P`^``"">]`%`GO?_HK[\`%*^P`!``@(`EC@1&>!"```4\`@``
+M)$(```!`^`D`````K@!&>(X$+^P0@``%/`(``"1"````0/@)`````*X`+^R.
+M!"RD$(``!3P"```D0@```$#X"0````"N`"RDC[\`%(^P`!`#X``()[T`&```
+M("4D!P`#)*8`""2E``P`Y!@C``,00`!#$"$``AC``,,0(91"``!00``$)(0`
+M`0!E$"$#X``(A$(`""R"``040/_T`.08(P``$"4``A0``^``"``"%`,``#`E
+M)*<`""2E``P`!A!``$8@(0`$$,``XA`AE$,``%!@``<DQ@`!``00@`!#$"$`
+M`A!``$40(0/@``B$0@`&+,(`!%1`__(`!A!````0)0`"%``#X``(``(4`R>]
+M_\BOOP`TK[X`,*^W`"ROM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("H
+M)0"@L"4`P+@E`.#P):;@``"6P@`",$(`T#A#`,`L8P`!.$(`T"Q"``$`8A@E
+M%&``!R:E)_R6P@`",$(`H"0#`*`00P`")(4CZ"2%']24I@`4)+$`&!#``*(`
+M`!`EEL0``)8B````@A`K%$``$SP"``(`!A!``$80(0`"&0``0Q`A``(00`(B
+M$"&40O^:`$00*Q!``!8``"@E``:`0`(&@"$`8!`E`@*`(0`0@$`",(`A$```
+M?B80_YHD0E:\`J`@)0!`^`D"("@EIN(``#P"``(D0E9D`J`@)0!`^`D"("@E
+MI\(``!```'XD`@`!$,``%0``("66PP``EB(```!#$"L00``1``000`"`*"4D
+MA``!`(80*A!```P`!!!``$00(0`"&0``0Q`A``(00`!1$"&6PP``E$(```!#
+M$"M40/_S`(`H)0`$$$``1!`A``(9``!#$"$``A!``%&@(9:2````!1!``$40
+M(0`"&0``0Q`A``(00`!1F"&68@```D*0(UI``$$`!!!`/!$``B8Q5KP"H"`E
+M`B#X"0*`*"4`0(`E`J`@)0(@^`D"8"@E`@*`(P*@("4"(/@)`F`H)9;#``"6
+M9````&08(P(#`!@``(`2````````````4@`8```0$@("@"$``````A(`&@``
+M@!)20``!``<`#0`0A@``$(8#IO```#P1``(F,59D`J`@)0(@^`D"@"@E`$"`
+M)0*@("4"(/@)`F`H)0("@","H"`E`B#X"0)@*"66PP``EF0```!D&","`P`8
+M``"`$@```````````%(`&```$!("`H`A``````(2`!H``(`24D```0`'``T`
+M$(8``!"&`Z?0```0```7)`(``0!$$"$``AD``$,0(0`"$$``48`AEL,``)8"
+M``!48@`.```0)3P"``(D0E:\`J`@)0!`^`D"`"@EIN(``#P"``(D0E9D`J`@
+M)0!`^`D"`"@EI\(``"0"``&/OP`TC[X`,(^W`"R/M@`HC[4`)(^T`""/LP`<
+MC[(`&(^Q`!2/L``0`^``"">]`#@GO?_(K[\`-*^V`#"OM0`LK[0`**^S`"2O
+ML@`@K[$`'*^P`!@`@+`E`*"H)0#`D"4D$P`!$D``%0``B"4\`@`")%17&``1
+M$,`"HH`A`L`@)0(`*"4GI@`0`H#X"2>G`!(00``%DZ(`$:("``:3H@`3$```
+M`J("``<``)@E)C$``0(R$"L40/_P`!$0P`)@$"6/OP`TC[8`,(^U`"R/M``H
+MC[,`)(^R`""/L0`<C[``&`/@``@GO0`X)[W_X*^_`!BOL0`4K[``$`"@B"4`
+M@(`E/`(``"1"````0/@))`0`K`!`&"448``$K@,O["0#``(0```PKB,``"0"
+M`0"N`D9\/`(``"1"````0/@))`0!``!`&"448``$K@-&>"0#``(0```DKB,`
+M`#P"```D0@```$#X"20$!@``0!@E%&``!*X#+*0D`P`"$```&JXC```\`@`"
+M)$)5\*X"+*@\`@`")$(_<*X"+*P\`@`")$)*"*X"++`\`@`")$)!&*X"++0\
+M`@`")$)$>*X"++@\`@`")$)3\*X"++P\`@`")$):6*X"+,`\`@``)$(``*X"
+M+,0D`@`!C[\`&(^Q`!2/L``0`^``"">]`"!!=&AE<F]S(#4R,3``````071H
+M97)O<R`U,C$Q`````$%T:&5R;W,@-3(Q,2`H1E!'02D`071H97)O<R`U,C$R
+M("A&4$=!*0!!=&AE<F]S(#4S,3(@5VE3;T,``$%T:&5R;W,@,C,Q-2!7:5-O
+M0P``071H97)O<R`R,S$W(%=I4V]#``!!=&AE<F]S(#(S,3,@5VE3;T,``$%T
+M:&5R;W,@-30R-"\R-#(T````071H97)O<R`U,C$R`````"A0%BQ8*```````
+M````"S````M````+0```"T@```M0```+;```"W0```N$```-````"Y0```N@
+M```+X```"[````O````+T```"_````T````-````#$@```Q4```,8```#&@`
+M``MD```,>```#(0```R0```-````#0````S,```-````#-0```T````-````
+M#0````SP_Z#_H_^>_Z#_H_^@05(U,C$P``!!4C4R,3$``$%2-3(Q,@``4D8U
+M,3$Q``!21C4Q,3(``%)&,C0Q,P``4D8U-#$S``!214=/4%-?1E5.0P``````
+M```````````````%``H`%``>`#(`1@!5`%H`7P!D```````*`!0`'@`H`#(`
+M/`!&`%``6@!D``````#"````Q````,4```#0````V@```.0```#"````PP``
+M`-0```#R```!#0```2@```#/````R@````````````(A4``!`4``!`"@``@`
+MP``@`-``0`%0```````````9F`$D!A`F````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````&>\````````````````````````````
+M`````````````````&?H````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````________````````````````F`````!'``"8"```````
+M`)@,"82.I@``F!`],N````"8%```!VL``)@<````````F"`"`@(```"8)```
+M#@X``)@H"@("`0``F"P``V_\``"8,````````)@T```.#@``F#@````'``"8
+M/``"`0```)A`B6,`````F$03<A:<``"82``8MC,``)A,$H1A/```F%`-Z+C@
+M``"85``'2%D``)A8?H"^N@``F%PQ.F9>``"88```'0@``)AD``'.````F&A`
+MFD&0``"8<`````\``)AT````@```F'@````$``"9`````````)D$````````
+MF0@```````"9#`"``````)D0`````P``FP````````";!````"```)L(````
+M$```FPP````P``";$`````@``)L4````*```FQ@````H``";'`````0``)L@
+M````)```FR0````4``";*````#0``)LL````#```FS`````L``";-`````(`
+M`)LX````(@``FSP````2``";0````#(``)M$````"@``FT@````J``";3```
+M``$``)M0````(0``FU0````1``";6````#$``)M<````"0``FV`````I``";
+M9`````4``)MH````)0``FVP````5``";<````#4``)MT````#0``FW@````M
+M``";?`````,``)N`````(P``FX0````3``";B````#,``)N,````"P``FY``
+M```K``";E`````<``)N8````)P``FYP````7``";H````#<``)ND````#P``
+MFZ@````O``";K````"\``)NP````+P``F[0````O``";N````"\``)N\````
+M+P``F\`````O``";Q````"\``)O(````+P``F\P````O``";T````"\``)O4
+M````+P``F]@````O``";W````"\``)O@````+P``F^0````O``";Z````"\`
+M`)OL````+P``F_`````O``";]````"\``)OX````+P``F_P````O``":````
+M`!T``)H$````70``F@@```"=``":#````-T``)H0```!'0``FA0````A``":
+M&````&$``)H<````H0``FB````#A``":)````#$``)HH````<0``FBP```"Q
+M``":,````!P``)HT````7```FC@````I``":/````&D``)I`````J0``FD0`
+M```@``":2````!D``)I,````60``FE````"9``":5````#```)I8````!0``
+MFEP````E``":8````&4``)ID````I0``FF@````H``":;````&@``)IP````
+M'P``FG0````>``":>````!@``)I\````6```FH````"8``":A`````,``)J(
+M````!```FHP```!$``":D````(0``)J4````$P``FI@````2``":G````%(`
+M`)J@````D@``FJ0```#2``":J````"L``)JL````*@``FK````!J``":M```
+M`*H``)JX````&P``FKP````:``":P````%H``)K$````F@``FL@```#:``":
+MS`````8``)K0````!@``FM0````&``":V`````8``)K<````!@``FN`````&
+M``":Y`````8``)KH````!@``FNP````&``":\`````8``)KT````!@``FO@`
+M```&``":_`````8``)C4````(```F,P````$``"8R``&`08``)B<````;0``
+MF,````````"8T````!0)"0```````@(&!@8&!@8"`@````````,`!@`)`#P`
+M````````````````````````````\````,P````````````````````*````
+M````X@H``"`!```"`0``&$````````08`````!E7!`4&$"8`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````N?0`````````````
+M````````````````````````````````NE``````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````);`F/";0`````````````________
+M````````````(````"````!`````0``&````!@````8`````````````````
+M,````!4````5````'0```!4``!!``"_\#P`O_`\`+_P?`"_\#P``$$0`+_P/
+M`"_\#P`O_!\`+_P/```02``O_`\`+_P/`"_\'P`O_`\``!!,`"_\#P`O_`\`
+M+_P?`"_\#P``$%``+_P/`"_\#P`O_!\`+_P/```05``O_`\`+_P/`"_\'P`O
+M_`\``!!8`"_\#P`O_`\`+_P?`"_\#P``$%P`+_P/`"_\#P`O_!\`+_P/```0
+M8``O_`\`+_P/`"_\'P`O_`\``!!D`"_\#P`O_`\`+_P?`"_\#P``$'````%H
+M```!X````;@```%H```0,````C````'@````L````C```!"P```-F```$8``
+M`!](```-F```$/```*#@``%`:```6(```*#@``"`%`0`!``(``@`(``P``0`
+M!````(`<#HV/IPZ-C\\!8(^5#HV/IP``F`0``````````P````````````"8
+M(`("`@`"`@(``@$"``("`@```)@D```.#@``#@X```<'```.#@``F"@*`@`!
+M"@(``04!```*`@`!``"8-```#@X```X.```.#@``#@X``)@X````!P````<`
+M```+````"P``F$03<A:<$W(6I1-R%J@3<A:<``"82``8NF<`&+IG`!BZ:0`8
+MNFD``)A0#"BTX`PHM.`,*+3@#"BTX```F%A^@`TN?H`-+G[`#2Y^@`TN``"8
+M7#$W75XQ-UU>,3I=7C$W75X``)A@``"]$```O1```+TX``"]$```F&0``<X`
+M``'.```!S@```<X```"9%```)Q```"<0```5?```)Q```)D8```!D````9``
+M``"$```!D```F41OX!`@;^`0(&_@"2!OX!`@``"A@`7_%/\%_Q3_!?\4_P7_
+M&?\``)C4````$````!0````0````$`````P`````````*(2$G)P````L?'Q\
+M?````#0````%````0`````````!$````"````$@````(````3````!````!0
+M`````````%0````?```(``````````@$````````"`@````````(#```````
+M``@0````````"!0````````(&`````````@<````````""`````````()```
+M`````!(P````````@`0```````"`"````````(`,````````@!@```````"`
+M)````````(`H````,```@"P`!___``"`,`'___\``(`T````,0``@#@`````
+M``"`/````````(!`````````@$0````"``"`2````````(!4````````@%@`
+M``````"8"````````)@,+820DP``F!!],N````"8%```#VL``)@<````````
+MF"P``F_^``"8,````````)@\``(!````F$`@:@%Z``"83!*$83P``)A4```(
+M60``F&A`FD&0``"8;`4,L($``)AP````#P``F'0```"```"8>`````P``)D`
+M````````F00```````"9"````````)D,`(``````F1`````!``"9'```"2H`
+M`)D@````````F20`!8H%``"9*`````$``)DL````````F3````````"9-```
+M`````)DX````````F3P````_``"90`````0``)E(````````F4P```````"9
+M4````````)E475#Q3```F5@````8``"97`!+:HX``*&$!O\%_P``H8@'_P?_
+M``"AC`C_"/\``*&0"?\)_P``H90*_PK_``"AF`O_"_\``*&<#/\,_P``H:`-
+M_PW_``"AI`__#O\``*&H$O\2_P``H:P4_Q/_``"AL!;_%?\``*&T&?\7_P``
+MH;@;_QK_``"AO![_'?\``*'`(_\@_P``H<0G_R7_``"AR"S_*?\``*',,?\O
+M_P``H=`W_S3_``"AU#K_.O\``*'8.O\Z_P``H=PZ_SK_``"AX#K_.O\``*'D
+M.O\Z_P``H>@Z_SK_``"A[#K_.O\``*'P.O\Z_P``H?0Z_SK_``"A^#K_.O\`
+M`*'\.O\Z_P``FP````````";!````"```)L(````$```FPP````P``";$```
+M``@``)L4````*```FQ@````$``";'````"0``)L@````%```FR0````T``";
+M*`````P``)LL````+```FS`````"``";-````"(``)LX````$@``FSP````R
+M``";0`````H``)M$````*@``FT@````&``";3````"8``)M0````%@``FU0`
+M```V``";6`````X``)M<````+@``FV`````!``";9````"$``)MH````$0``
+MFVP````Q``";<`````D``)MT````*0``FW@````%``";?````"4``)N`````
+M%0``FX0````U``";B`````T``)N,````+0``FY`````#``";E````",``)N8
+M````$P``FYP````S``";H`````L``)ND````*P``FZ@````K``";K````"L`
+M`)NP````*P``F[0````K``";N````"L``)N\````*P``F\`````K``";Q```
+M`"L``)O(````*P``F\P````K``";T````"L``)O4````*P``F]@````K``";
+MW````"L``)O@````*P``F^0````K``";Z````"L``)OL````*P``F_`````K
+M``";]````"L``)OX`````@``F_P````6``"8U````"```)C8`&`0:```F@``
+M``&I````````F@0```'I````0```F@@````I````@```F@P```!I```!4```
+MFA````&9```!D```FA0```'9```!T```FA@````9````$```FAP```!9````
+M1```FB````"9````A```FB0```&E```!2```FB@```'E```!B```FBP````E
+M```!R```FC````'(````%```FC0````(````0@``FC@```!(````@@``FCP`
+M``"(```!>```FD````&8```!N```FD0```'8```!^```FD@````8````$@``
+MFDP```!8````4@``FE````"8````D@``FE0```&D```!?```FE@```'D```!
+MO```FEP````D```!_```FF````!D````"@``FF0```"D````2@``FF@```#D
+M````B@``FFP```$*```!6@``FG````%*```!F@``FG0```&*```!V@``FG@`
+M``'*````#@``FGP````*````3@``FH````!*````C@``FH0```"*```!7@``
+MFH@```&Z```!G@``FHP```'Z```!W@``FI`````Z````"0``FI0```!Z````
+M20``FI@```&&````B0``FIP```'&```!>0``FJ`````&```!N0``FJ0```!&
+M```!^0``FJ@```"&````.0``FJP```#&````>0``FK````#&````N0``FK0`
+M``#&```!O0``FK@```#&```!_0``FKP```#&````/0``FL````#&````?0``
+MFL0```#&````O0``FL@```#&````_0``FLP```#&````_0``FM````#&````
+M_0``FM0```#&````_0``FM@```#&````_0``FMP```#&````_0``FN````#&
+M````_0``FN0```#&````_0``FN@```#&````_0``FNP```#&````_0``FO``
+M``#&````_0``FO0```#&````_0``FO@```#&````_0``FOP```#&````_0``
+M``$```!&`&````````$```!&`&$```````$```!&`&(```````$```!&`&,`
+M``````$```!&`&0```````$```!&`&4```````$```!&`&8```````$```!&
+M`&<```````$```!&`&@```````$```!&`&D```````$```!&`&H```````$`
+M``!&`&L```````$```!&`&P```````$```!&`'0```````$```!&`'0`````
+M``$```!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'0`
+M``````$```!&`'0```````$```!&`'0```````$```!&`'4```````$```!&
+M`'8```````$```!&`'<```````$```!&`'@```````$```!&`'D```````$`
+M``!&`'H```````$```!&`'L```````$```!&`'P```````$```!&`'T`````
+M``$```!&`'X```````$```!&`'\```````$```!&`(````````$```!$`'P`
+M``````$```!&`(@```````$```!&`(P```````$```!&`)````````$```!&
+M`)0```````$```!&`)@```````$```!&`)P```````$```!&`*````````$`
+M``!&`*0```````$```!&`*@```````$```!&`*P```````$```!&`+``````
+M``$```!&`+0````"!P`6G@`+%F(`"A8Z``D6'``(%>H`!Q6:``452@`$%0,`
+M`A19```````!`````P`&``D`/P`````````!!GP``09\``$&J``!!J@``0;4
+M``$&U``!!P```0<`````"0````0`!``!``$``0````9&1S@`````````````
+M``````0````!``$````$1D<W```````````````````#``$``0`!`````T9'
+M-@``````````````````!````````0````%&1S4```````````````````0`
+M`0`!````````1D<T```````````````````$`````0``_____D9',P``````
+M`````````````P`!``$``/____U&1S(```````````````````0```````#_
+M___\1D<Q```````````````````"``$``0``____^D9',```````````````
+M```````````````````````````````````````````````````95!`4!A`F
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````!)5``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````"6P)CPFT```)"`EL
+M";0``/_______P``!0(/!P(/"@`/"0`/``````````````````%'F``!1T``
+M`4=(``%'W``!1V0``4?4````````````````````(````"````!`````0``&
+M````!@````8``!:>``L68@`*%CH`"18<``@5Z@`'%9H`!15*``05`P`"%%D`
+M``NX``$````````````!7S0``5^$``%?K``!8@P``6`4``%B#``!8@P``6(,
+M``%B#``!8@P``6!(``%B#``!8@P``6(,``%B#``!8%@``6!X``%B#``!8+P`
+M`6#@``%B#``!7^```6(,``%B#``!8@P``6$H``%A/``!8@P``6%4```````!
+M8<P``6'8``%AY``!8?```6'\``````````8````!`````@````,````$````
+M!0`!8GP``6*P``%DE``!8P@``624``%DE``!9)0``624``%DE``!8U```624
+M``%DE``!9)0``624``%C=``!9)0``624``%CA``!9%P``624``%DE``!9)0`
+M`624``%DE``!8[@``6.X``%DE``!9"``````````````$$``+_P/`"_\#P`O
+M_!\`+_P/`"_\#P``$$0`+_P/`"_\#P`O_!\`+_P/`"_\#P``$$@`+_P/`"_\
+M#P`O_!\`+_P/`"_\#P``$$P`+_P/`"_\#P`O_!\`+_P/`"_\#P``$%``+_P/
+M`"_\#P`O_!\`+_P/`"_\#P``$%0`+_P/`"_\#P`O_!\`+_P/`"_\#P``$%@`
+M+_P/`"_\#P`O_!\`+_P/`"_\#P``$%P`+_P/`"_\#P`O_!\`+_P/`"_\#P``
+M$&``+_P/`"_\#P`O_!\`+_P/`"_\#P``$&0`+_P/`"_\#P`O_!\`+_P/`"_\
+M#P``$#````(P```!X````+````%@```!X```$'````%H```!X````;@```&,
+M```!X```$+````Y@```1@```'QP``#XX```1@```$/```*#@``%`:```6(``
+M`+#@``%`:```@!0#Z`/H!N`&X`0@!"`(0`A`!N`&X```F`0``````````P``
+M`````````````P``F"`"`@(``@("``(!`@`"`@(``@("````F"0```X.```.
+M#@``!P<```X.```.#@``F$03<A8<$W(<)1-R%R(3<A:B$W(<)0``F&```)T0
+M``"=$```G1@``)T8``"=$```F&0``<X```'.```!S@```<X```'.````F&A`
+MFD&00)I!D$":09!`FD&00)I!D```F1@```&X```!N````(0```$(```!N```
+MF200!8H%$`6*!1`%B@40!8H%$`6*!0``HC````````````````````$(````
+M``````P`````````-`````4```!``````````$0````(````2`````@```!,
+M````$````%``````````5````!\```@`````````"`0````````("```````
+M``@,````````"!`````````(%`````````@8````````"!P````````((```
+M``````@D````````$G`````````0.````````!!X````````$+@````````0
+M^````````!$X````````$7@````````1N````````!'X````````$C@`````
+M```2>````````!*X````````$O@````````3.````````!-X````````$[@`
+M```````3^````````!0X````````%'@````````4N````````!3X````````
+M%3@````````5>````````!6X````````%?@````````6.````````!9X````
+M````%K@````````6^````````!<X````````%W@````````7N````````!?X
+M````````$#P````````0?````````!"\````````$/P````````1/```````
+M`!%\````````$;P````````1_````````!(\````````$GP````````2O```
+M`````!+\````````$SP````````3?````````!.\````````$_P````````4
+M/````````!1\````````@`0```````"`"````````(`,````````@"``````
+M``"`)````````(`H````,```@"P`!___``"`,`'___\``(`T````,0``@#@`
+M``````"`/````````(!(````````@%0```````"`6````````(!<``_'CP``
+M@,`J@C`:``"`Q`7<`>```(#('T`G$```@,P!]`````"`T```'AP``(#4``*J
+MJ@``@-@"`%55``"`W````````(#@_____P``@.0``/__``"`Z````````(#L
+M````````@/````````"`]````````(#X````````@/P```"(``"'````````
+M`(<$````C```AP@```#D``"'#````M4``(<0````````AQ0```````"'&```
+M`*```(<<```!R0``AR`````L``"')````"P``(<H````,```ARP````\``"'
+M,````"P``(<T````+```AS@````P``"'/````#P``(=`````````AT0`````
+M``"'2````````(=,````````AU````````"'5````````(=8````````AUP`
+M``````"'8````-4``(=D````WP``AV@```$"``"';````3H``(=P````=0``
+MAW0```!_``"'>````*(``(=\````````@0```0`"``"!!`````$``($(````
+MP```@0P```````"!$````6@``($4````````A\`#`@$```"'Q`<&!00``(?(
+M"PH)"```A\P/#@T,``"'T!,2$1```(?4%Q85%```A]@;&AD8``"'W!\>'1P`
+M`(?@`P(!````A^0'!@4$``"'Z`L*"0@``(?L#PX-#```A_`3$A$0``"']!<6
+M%10``(?X&QH9&```A_P?'AT<``"8#*V$CAD``)@0?2C@````F!2<"I]K``"8
+M'````````)A`(&H!>@``F%0```A9``"9`````````)D$````````F0@`````
+M``"9#`"``````)D0`````0``F1P```R```"9(`40`````)DH`````0``F2P`
+M```$``"9-!X?("(``)DX"@L,#0``F3P````_``"92)*`LA(``)E475#AB```
+MF5P`2VJ.``"9:````\X``)EP&2^U%0``F7@````!``"9?````````*(0`(!C
+M,P``HA0`$&P0``"B&`"<0&```*(@`8@PQ@``HB0```0```"B+````````*(T
+M("`@(```HC@@("`@``"B0#A)"B```*)$``![M@``HD@/_S_\``";````````
+M`)LH````#```FS@````2``";9````"$``)N,````+0``FYP````S`````P`&
+M``D`/P```````P`&``D`/P``````"0````0`!``!``$``0``````````````
+M!D9'.```````````````````!`````$``0``````````````!$9'-P``````
+M`````````````P`!``$``0```````````````T9'-@``````````````````
+M!````````0```````````````49'-0``````````````````!``!``$`````
+M`````````````$9'-```````````````````!`````$`````````````____
+M_D9',P```````````````````P`!``$`````````````_____49',@``````
+M````````````!```````````````````_____$9',0``````````````````
+M`@`!``$`````````````____^D9',```````````````````````````````
+M```````````````````````````````````````(`````0`#````````````
+M```````````&1D<W```````````````````"````````````````````````
+M1D<V```````````````````!``````````````````#____]1D<U````````
+M``````````````````````````````#____Z1D<T````````````````````
+M``$``0````````````#____X1D<S``````````````````````$``0````$`
+M`0````#____V1D<R``````````````````````$````!``$``0````#____S
+M1D<Q``````````````````````$````!``$````!``#____P1D<P````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````(````$````
+M!@````@````*````#`````X````0``'@O``!V<P``=L@``'=C``!WAP``=[4
+M``'?M``````````P``"`%0``@!4``(`5``"`%0``@!4``(`<$HV/IPF(#\\$
+MX`^5$N`/JPF(#\\``)@H"@(``0H"``$%`0$`"@(``0H"``$``)@T```.#@``
+M#@X```X.```.#@``#@X``)@X````!P````<````+````"P````L``)A(`!C:
+M6@`8VEH`&,II`!C*:0`8RFD``)A0#>BTX`WHM.`-Z+3@#>BTX`WHM.```)A8
+M?H`-+GZ`#2Y^Z$TN?NA-+GZ`#2X``)A<,3=F7C$W9EXQ-V9>,3=F7C$W85X`
+M`)AL!0RP@04,L($%#+"!!0RP@`4,L(```)D4```G$```)Q```!5\```J^```
+M)Q```)E$][@0(/>X$"#WN`T@][@0(/>X$"```*(,9"Q!:F0L06ID0$%J9$!!
+M:F1`06H``*(<&(.`"AB#@`H8<X`*&(.`"AB#@`H``!(P````````F`@`````
+M``"8+``"+_X``)@\``(!````F$P2A&$\``"9,```2(,``)E`````!```F5@`
+M``#_``"9=````````)GX````&```H@0```````"B"-`^9X@``*(H```!M0``
+MHCP3R(FO``";!````"```)L(````$```FPP````P``";$`````@``)L4````
+M*```FQ@````$``";'````"0``)L@````%```FR0````T``";+````"P``)LP
+M`````@``FS0````B``";/````#(``)M`````"@``FT0````J``";2`````8`
+M`)M,````)@``FU`````6``";5````#8``)M8````#@``FUP````N``";8```
+M``$``)MH````$0``FVP````Q``";<`````D``)MT````*0``FW@````%``";
+M?````"4``)N`````%0``FX0````U``";B`````T``)N0`````P``FY0````C
+M``";F````!,``)N@````"P``FZ0````K``";J````"L``)NL````*P``F[``
+M```K``";M````"L``)NX````*P``F[P````K``";P````"L``)O$````*P``
+MF\@````K``";S````"L``)O0````*P``F]0````K``";V````"L``)O<````
+M*P``F^`````K``";Y````"L``)OH````*P``F^P````K``";\````"L``)OT
+M````*P``F_@````"``";_````!8``)B<````````````````````````````
+M`)B<`````````````````````````````)B<````````````````````````
+M`````)B<`````````````````````````````)B<````````````````````
+M`````````)B<`````````````````````````````)B<````````````````
+M`````````````)B<`````````````````````````````)B<````````````
+M`````````````````)B<`````````````````````````````)B<````````
+M`````````````````````)B<`#@````X````.````#@````X`````)B<````
+M`````````````````````````)B<`````````````````````````````)B<
+M``````````````#`````@````(```)B<``0`^0`$`/D`!`#_``0`_0`$`/T`
+M`)C4```````````````$````!`````0``)H````!J0```````)H$```!Z0``
+M`$```)H(````*0```(```)H,````:0```5```)H0```!F0```9```)H4```!
+MV0```=```)H8````&0```!```)H<````60```$0``)H@````F0```(0``)HD
+M```!I0```4@``)HH```!Y0```8@``)HL````)0```<@``)HP```!R````!0`
+M`)HT````"````$(``)HX````2````((``)H\````B````7@``)I````!F```
+M`;@``)I$```!V````?@``)I(````&````!(``)I,````6````%(``)I0````
+MF````)(``)I4```!I````7P``)I8```!Y````;P``)I<````)````?P``)I@
+M````9`````H``)ID````I````$H``)IH````Y````(H``)IL```!"@```5H`
+M`)IP```!2@```9H``)IT```!B@```=H``)IX```!R@````X``)I\````"@``
+M`$X``)J`````2@```(X``)J$````B@```5X``)J(```!N@```9X``)J,```!
+M^@```=X``)J0````.@````D``)J4````>@```$D``)J8```!A@```(D``)J<
+M```!Q@```7D``)J@````!@```;D``)JD````1@```?D``)JH````A@```#D`
+M`)JL````Q@```'D``)JP````Q@```+D``)JT````Q@```;T``)JX````Q@``
+M`?T``)J\````Q@```#T``)K`````Q@```'T``)K$````Q@```+T``)K(````
+MQ@```/T``)K,````Q@```/T``)K0````Q@```/T``)K4````Q@```/T``)K8
+M````Q@```/T``)K<````Q@```/T``)K@````Q@```/T``)KD````Q@```/T`
+M`)KH````Q@```/T``)KL````Q@```/T``)KP````Q@```/T``)KT````Q@``
+M`/T``)KX````Q@```/T``)K\````Q@```/T``)C4````(```F-0````0````
+M%````!`````0````%```F-@`8!!H`&`0:`!@$&@`8!!H`&`0:```F)P`````
+M````````````````````````F)P`````````````````````````````F)P`
+M````````````````````````````F)P`````````````````````````````
+MF)P`````````````````````````````F)P0````$````!`````0````$```
+M````F)P$````!`````0````$````!```````F)P`````````````````````
+M````````F)P`````````````````````````````F)P`````````````````
+M````````````F)P```````````H`````````````````F)P`.`#``#@`@`(X
+M`,``.`#``#@`P```F)P``@`&``(`!@````8``@`&``(`!@``F)P```")````
+MB0```(D```")````B0``F)P```"@````H````*````"@````H```F)P`!``'
+M``0`!P`$``<`!``'``0`!P``F-0````:````&@```!H````:````&@``F)P`
+M``!`````2````$````!`````0```F)P````0````$````!`````0````$```
+MF)P````(````"`````@````(````"```F)P```!/````3P```$\```!/````
+M3P``F)P```#Q````\0```&$```#Q````\0``F)P``)!/``"03P``D$P``)!/
+M``"03P``F)P``!):```26@``$IH``!):```26@``F,P````.````#@````\`
+M```.````#@````$```!&`&````````$```!&`&$```````$```!&`&(`````
+M``$```!&`&,```````$```!&`&0```````$```!&`&4```````$```!&`&8`
+M``````$```!&`&<```````$```!&`&@```````$```!&`&D```````$```!&
+M`&H```````$```!&`&L```````$```!&`&P```````$```!&`'0```````$`
+M``!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'0`````
+M``$```!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'4`
+M``````$```!&`'8```````$```!&`'<```````$```!&`'@```````$```!&
+M`'D```````$```!&`'H```````$```!&`'L```````$```!&`'P```````$`
+M``!&`'T```````$```!&`'X```````$```!&`'\```````$```!&`(``````
+M``$```!$`'P```````$```!&`(@```````$```!&`(P```````$```!&`)``
+M``````$```!&`)0```````$```!&`)@```````$```!&`)P```````$```!&
+M`*````````$```!&`*0```````$```!&`*@```````$```!&`*P```````$`
+M``!&`+````````$```!&`+0````!\I0``?*<``'RI``!\JP``?+$``'RQ``!
+M\K0``?*\%IX`!A9B``06.@`#%AP``A7J``$5F@``%4H``!4#``$460`#"[@`
+M!0``````````````,```@!4``(`5``"`%0``@!4``(`5``"`'!*-DZ<)B!//
+M!.`3E1+@$ZL)B!//``"8*`H"``$*`@`!!0(!``H"``$*`@`!``"8-```#@X`
+M``X.```.#@``#@X```X.``"8.`````<````'````"P````L````+``"82``8
+MVFT`&-IM`!C*=0`8RG4`&,IU``"84`WHM.`-Z+3@#>BTX`WHM.`-Z+3@``"8
+M6'Z`#2Y^@`TN?N@-+G[H#2Y^@`TN``"87#$W9EXQ-V9>,3=F7C$W9EXQ-V9>
+M``"8;`4,L($%#+"!!0RP@04,L($%#+"!``"9%```!]````?0```$3```")@`
+M``?0``"91/>X$"#WN!`@][@-$/>X$!#WN!`0``"B!```````````````"```
+M``@````(``"B"-:^9XC6OF>(T#YGB-`^9XC0/F>(``"B#&0L`4!D+`%`9$+!
+M8&1"P6!D0L%@``"B'!B#@`H8@X`*&'.`"AB#@`H8@X`*```2,````````)@(
+M````````F"P``B_^``"8/``"`0```)A,$H1A/```F3```$B"``"90`````0`
+M`)E8````_P``F70```````"B*````;4``*(\$\B)KP``FP0````!``";"```
+M``(``)L,`````P``FQ`````$``";%`````4``)L8````"```FQP````)``";
+M(`````H``)LD````"P``FRP````-``";,````!```)LT````$0``FSP````3
+M``";0````!0``)M$````%0``FT@````8``";3````!D``)M0````&@``FU0`
+M```;``";6````!P``)M<````'0``FV`````@``";:````"(``)ML````(P``
+MFW`````D``";=````"4``)MX````*```FWP````I``";@````"H``)N$````
+M*P``FX@````L``";D````#```)N4````,0``FY@````R``";H````#0``)ND
+M````-0``FZ@````U``";K````#4``)NP````-0``F[0````U``";N````#4`
+M`)N\````-0``F\`````U``";Q````#4``)O(````-0``F\P````U``";T```
+M`#4``)O4````-0``F]@````U``";W````#4``)O@````-0``F^0````U``";
+MZ````#4``)OL````-0``F_`````U``";]````#4``)OX````$```F_P````:
+M``":``````<````'``":!````$<```!'``":"````(<```"'``":#````:``
+M``&@``":$````>````'@``":%````"`````@``":&````&````!@``":'```
+M`:$```&A``":(````>$```'A``":)````"$````A``":*````&$```!A``":
+M+````6(```%B``":,````:(```&B``":-````>(```'B``":.````"(````B
+M``":/````&(```!B``":0````6,```%C``":1````:,```&C``":2````>,`
+M``'C``":3````",````C``":4````&,```!C``":5````80```&$``":6```
+M`<0```'$``":7`````0````$``":8````>H````+``":9````"H```!+``":
+M:````&H```"+``":;````*H```&L``":<````:L```'L``":=````>L````L
+M``":>````"L````2``":?````&L```!2``":@````*L```"2``":A````:P`
+M``&3``":B````>P```'3``":C````"P````3``":D````#H```!3``":E```
+M`'H```"3``":F````+H```&4``":G````;L```'4``":H````?L````4``":
+MI````#L````Z``":J````'L```!Z``":K````+L```"Z``":L````;P```&[
+M``":M````?P```'[``":N````#P````[``":O````'P```![``":P````+P`
+M``"[``":Q````/P```&\``":R````/P```'\``":S````/P````\``":T```
+M`/P```!\``":U````/P```"\``":V````/P```#\``":W````/P```#\``":
+MX````/P```#\``":Y````/P```#\``":Z````/P```#\``":[````/P```#\
+M``":\````/P```#\``":]````/P```#\``":^````/P```#\``":_````/P`
+M``#\``"8U````"```)C0`P8$"`,'!`@#!@0(`P8$"`,'!`@``)C<`*`@P`"@
+M(,``X"#``.`@P`#@(,```)B<#P````\````/````#P````\``````)B<````
+M`````````````````````````)B<`(````"`````@````(````"``````)B<
+M`"H````J````*@```"H````J`````)B<``$````!`````0````$````!````
+M`)B<`````````````````````````````)B<`!@````8````&````!@````8
+M`````)B<`&````!@````;@```&X```!N`````)B<`,<```#'````QP```,<`
+M``#'`````)B<`$L```!+````2P```$L```!+`````)B<!$@```1(```$2```
+M!$@```1(`````)B<`$P```!,````3````$P```!,`````)B<`.0```#D````
+MY````.0```#D`````)B<`````````````````````````````)B<`/P```#\
+M````_````/P```#\`````)B<`/\```#_````_P```/\```#_`````)B<!#\`
+M``0_```$/P``!#\```0_`````)B<``P````,````#`````P````,`````)B<
+M`AD```(9```"&0```AD```(9`````)B<`"0````D````)````"0````D````
+M`)B<`+0```"T````M````+0```"T`````)B<`)D```"9````F0```)D```"9
+M`````)B<`%````!0````4````%````!0`````)B<`"H````J````*@```"H`
+M```J`````)B<`!(````2````$@```!(````2`````)B<P#(``,`R``#`,@``
+MP#(``,`R`````)B<`70```%T```!=````70```%T`````)B<`!$````1````
+M$0```!$````1`````)B<AB@``(8H``"&*```AB@``(8H`````)B<,80``#&$
+M```QA```,80``#&$`````)B<`/(`@`#R`(``\@"``/(`@`#R`(```)B<`"<`
+M&0`G`!D`)P`9`"<`&0`G`!D``)B<`````P````,````#`````P````,``)B<
+M`````````````````````````````)B<````L@```+(```"R````L@```+(`
+M`)B<`+`@A`"P((0`L""$`+`@A`"P((0``)B<`$$EI`!!):0`026D`$$EI`!!
+M):0``)B<`!&2(``1DB``$9(@`!&2(``1DB```)B<`!I(```:2```&D@``!I(
+M```:2````)C8``L",``+`C``"P(P``L",``+`C```)B<````E````)0```"4
+M````E````)0``)B<````D0```)$```"1````D0```)$``)B<````$@```!(`
+M```2````$@```!(``)B<````@````(````"`````@````(```)B<````V0``
+M`-D```#9````V0```-D``)B<````8````&````!@````8````&```)B<````
+M\````/````#P````\````/```)B<````H@```*(```"B````H@```*(``)B<
+M````4@```%(```!2````4@```%(``)B<````U````-0```#4````U````-0`
+M`)B<```4S```%,P``!3,```4S```%,P``)B<```$C```!(P```2,```$C```
+M!(P``)C$`````P````,````#`````P````,``@BL``((M``""+P``@C4``((
+MU``"",0``@C,````````````````````,````!4````5````%0```!4````5
+M``"`'!*-DZ<)B!//!.`3E1+@$ZL)B!//``"8*`H"``$*`@`!!0(```H"``$*
+M`@`!``"8-```#@````X````.````#@````X```"8.`````(````"````"@``
+M``H````*``"82``8VFT`&-IM`!IJ9``::F0`&FID``"84`WHM.`-Z+3@#>BP
+MV@R8L-H-Z+#:``"86'Z`#2Y^@`TN?N@-+G[(#2Y^@`TN``"87#$W9EXQ-V9>
+M,3=F7C$Y8%XQ-V9>``"8;`4,L($%#+"!!0RP@04,L($%#+"!``"9%```!]``
+M``?0```$3```")@```?0``"91/>X$`#WN!``][@-`/>X$`#WN!````"B!```
+M``````````````````````````"B"-:^9XC6OF>(T#YGB-`^9XC0/F>(``"B
+M#``L`4``+`%``$+!0`!"P4``0L%```"B'!B#@`H8@X`*&&.`"AB#@`H8@X`*
+M```2,````^```(!@````#P``@1@```````"!'````````($@````````@20`
+M``````"!*````````($L````````@3````````"!-````````($X````````
+M@3P```````"!0(```*@``(%$````````F`@```````"8+```H````)@\`"`$
+M````F$P2A",\``"8<````!\``)AT````@```F'@````.``"96````/\``)F`
+M````````F80"@`````"9H````````)G@````````F>2JJJJJ``"9Z#Q&9'@`
+M`)GL````J@``F?`````,``"9]````/\``)GX````%```HB@```FU``"B/)/(
+MB:\``*),`````0``HE```*````"B5````````*)8#,=3@```HEP/#P\!``"B
+M8%]I#P$``*)D`$&*$0``HF@```````"B;`PPP6H``*)P`((((```HG0`&WRJ
+M``"B>!SG.<X``*)\!1<!S@``HP`8`0````"C!#`#)@(``*,(2`<^!@``HPQ6
+M"TP*``"C$&0:8`\``*,4>$]N&P``HQB&CWQ:``"C'([/AEL``*,@G4^7#P``
+MHR2ESZ&/``"C*+5?KQ\``*,LO=^YGP``HS#-?\<_``"C--7_T;\``*,X````
+M````HSP```````"C0````````*-$````````HT@_____``"C3#____\``*-0
+M/____P``HU0``___``"C6'FHJA\``*-<!FQ"#P``HV`/*"('``"C9!=@%H4`
+M`*-H'X`1!```HVPWH`P#``"C<#_$"(,``*-T5\`(`P``HWA?V`:"``"C?'_@
+M!((``*.`?SQ[N@``HX3S,'_P``";!`````$``)L(`````@``FPP````#``";
+M$`````0``)L4````!0``FQ@````(``";'`````D``)L@````"@``FR0````+
+M``";+`````T``)LP````$```FS0````1``";/````!,``)M`````%```FT0`
+M```5``";2````!@``)M,````&0``FU`````:``";5````!L``)M8````'```
+MFUP````=``";8````"```)MH````(@``FVP````C``";<````"0``)MT````
+M)0``FW@````H``";?````"D``)N`````*@``FX0````K``";B````"P``)N0
+M````,```FY0````Q``";F````#(``)N@````-```FZ0````U``";J````#4`
+M`)NL````-0``F[`````U``";M````#4``)NX````-0``F[P````U``";P```
+M`#4``)O$````-0``F\@````U``";S````#4``)O0````-0``F]0````U``";
+MV````#4``)O<````-0``F^`````U``";Y````#4``)OH````-0``F^P````U
+M``";\````#4``)OT````-0``F_@````0``";_````!H``)H`````````````
+M`)H$`````````$```)H(`````````(```)H,`````````8$``)H0````````
+M`<$``)H4``````````$``)H8`````````$$``)H<`````````($``)H@````
+M`````6@``)HD`````````:@``)HH`````````>@``)HL`````````"@``)HP
+M`````````&@``)HT`````````8D``)HX`````````<D``)H\``````````D`
+M`)I``````````$D``)I$`````````(D``)I(`````````9```)I,````````
+M`=```)I0`````````!```)I4`````````%```)I8`````````)```)I<````
+M`````9$``)I@`````````=$``)ID`````````!$``)IH`````````%$``)IL
+M`````````)$``)IP`````````7@``)IT`````````;@``)IX`````````?@`
+M`)I\`````````#@``)J``````````'@``)J$`````````9D``)J(````````
+M`=D``)J,`````````!D``)J0`````````%D``)J4`````````)D``)J8````
+M`````-D``)J<`````````/D``)J@`````````/D``)JD`````````/D``)JH
+M`````````/D``)JL`````````/D``)JP`````````/D``)JT`````````/D`
+M`)JX`````````/D``)J\`````````/D``)K``````````/D``)K$````````
+M`/D``)K(`````````/D``)K,`````````/D``)K0`````````/D``)K4````
+M`````/D``)K8`````````/D``)K<`````````/D``)K@`````````/D``)KD
+M`````````/D``)KH`````````/D``)KL`````````/D``)KP`````````/D`
+M`)KT`````````/D``)KX`````````/D``)K\`````````/D``)C4````(```
+MF-`"`!0(`@$4"`(`%`@"`!0(`@$4"```F-P`H"#``*`@P`#@(,``X"#``.`@
+MP```F)SP````\````/````#P````\```````F)P`````````````````````
+M````````F)P#`````P````,````#`````P``````F)P`````````````````
+M````````````F)P`````````````````````````````F)P`````````````
+M````````````````F)P`````````````````````````````F)P`````````
+M````````````````````F)Q`0```0$```$!```!`0```0$``````F)QE!0``
+M904``&4%``!E!0``904`````F)P`````````````````````````````F)P`
+M````````````````````````````F)P`0@```$(```!"````0@```$(`````
+MF)P`M0```+4```"U````M0```+4`````F)P``P````,````#`````P````,`
+M````F)P`]P```/<```#W````]P```/<`````F)P`G0```)T```"=````G0``
+M`)T`````F)P`(@```"(````B````(@```"(`````F)P$(@``!"(```0B```$
+M(@``!"(`````F)P`(P`8`",`&``C`!@`(P`8`",`&```F)P`*````"@````H
+M`&``*`!@`"@`8```F)P`4`#``%``P`!0`,,`4`##`%``PP``F)P`!`!_``0`
+M?P`$`'\`!`!_``0`?P``F)P```18```$6```!%@```18```$6```F)P`````
+M````````````````````````F)P``,````#`````P````,````#`````F-@`
+M0`(P`$`",`!``C``0`(P`$`",```F)P``&0```!D````9````&0```!D````
+MF)P```@````(````"`````@````(````F,P````.````#@````X````.````
+M#@`"+7@``BV```(MB``"+:```BV@``(MD``"+9@`````````,````!4````5
+M````%0```!4````5``"`'!*-DZ<)B!//!.`3E1+@$ZL)B!//``"8*`H"``$*
+M`@`!!0(!``H"``$*`@`!``"8-```#@X```X.```.#@``#@X```X.``"8.```
+M``<````'````"P````L````+``"82``8^F$`&/IA`!H:8P`:&F,`&AIC``"8
+M4`R8M.`,F+3@#)BPV@R8L-H,F+#:``"86'[(#2Y^R`TN?L@-+G[(#2Y^R`TN
+M``"87#$Y8%XQ.6!>,3E@7C$Y8%XQ.6!>``"8;`4,L($%#+"!!0RP@04,L($%
+M#+"!``"9%```!]````?0```$3```")@```?0``"91/>X$`#WN!``][@-`/>X
+M$`#WN!````"B!`````````````````````````````"B"-:^9XC6OF>(T#YG
+MB-`^9XC0/F>(``"B#``NP>``+L'@`"K!(``JP2``*L$@``"B'!B#@`H8@X`*
+M&&.`"AB#@`H8@X`*``"C`!@!```8`0``&`$``!@!```8`0````"C!#`#)@(P
+M`R8",`,F`C`#)@(P`R8"``"C"$@'/@9(!SX&2`<^!D@'/@9(!SX&``"C#%8+
+M3`I6"TP*5@M,"E8+3`I6"TP*``"C$&0:8`]D&F`/9!I@#V0:8`]D&F`/``"C
+M%'A/;AMX3VX;>$]N&WA/;AMX3VX;``"C&(:/?%J&CWQ:AH]\6H:/?%J&CWQ:
+M``"C')#/AEN0SX9;CL^&6X[/AEN.SX9;``"C()U/EP^=3Y</FT^7#YM/EP^;
+M3Y</``"C)*?/HX^GSZ./H\^?CZ//GX^CSY^/``"C*+5?KQ^U7Z\?LU^O'[-?
+MKQ^S7Z\?``"C++W?N9^]W[F?N]^YG[O?N9^[W[F?``"C,,M_Q3_+?\4_RW_'
+M/\M_QS_+?\<_``"C--7_T;_5_]&_T__1O]/_T;_3_]&_```2,````^```$!H
+M````$```@&`````/``"`G````````("@````````@1@```````"!'```````
+M`($@````````@20```````"!*````````($L````````@3````````"!-```
+M`````($X````````@3P```````"!0(```_D``(%$````````F`@```````"8
+M+```H````)@\`"`$````F$P2A",\``"8<````!\``)AT````@```F'@````.
+M``"96``('_\``)F`````````F80"@`````"9H````````)G@````````F>2J
+MJJJJ``"9Z#Q&9'@``)GL````J@``F?`````,``"9]````/\``)GX````%```
+MHB@```FU``"B/)/(B:\``*),`````0``HE```*````"B5````````*)8#,=3
+M@```HEP/#P\!``"B8%]I#P$``*)D`$&*$0``HF@```````"B;`PPP6H``*)P
+M`((((```HG0(&WRJ``"B>!SG.<X``*)\!1<!S@``HS@```````"C/```````
+M`*-`````````HT0```````"C2#____\``*-,/____P``HU`_____``"C5``#
+M__\``*-8>:BJ'P``HUP&;$(/``"C8`\H(@<``*-D%V`6A0``HV@?@!$$``"C
+M;#>@#`,``*-P/\0(@P``HW17P`@#``"C>%_8!H(``*-\?^`$@@``HX!_/'NZ
+M``"CA/,P?_```)L$`````0``FP@````"``";#`````,``)L0````!```FQ0`
+M```%``";&`````@``)L<````"0``FR`````*``";)`````L``)LL````#0``
+MFS`````0``";-````!$``)L\````$P``FT`````4``";1````!4``)M(````
+M&```FTP````9``";4````!H``)M4````&P``FU@````<``";7````!T``)M@
+M````(```FV@````B``";;````",``)MP````)```FW0````E``";>````"@`
+M`)M\````*0``FX`````J``";A````"L``)N(````+```FY`````P``";E```
+M`#$``)N8````,@``FZ`````T``";I````#4``)NH````-0``FZP````U``";
+ML````#4``)NT````-0``F[@````U``";O````#4``)O`````-0``F\0````U
+M``";R````#4``)O,````-0``F]`````U``";U````#4``)O8````-0``F]P`
+M```U``";X````#4``)OD````-0``F^@````U``";[````#4``)OP````-0``
+MF_0````U``";^````!```)O\````&@``F@``````````````F@0```!`````
+M0```F@@```"`````@```F@P```&A```!80``FA````'A```!H0``FA0````A
+M```!X0``FA@```!A````(0``FAP```&(````80``FB````'(```!B```FB0`
+M```(```!R```FB@```!(````"```FBP```"(````2```FC````&I````B```
+MFC0```'I```!:0``FC@````I```!J0``FCP```!I```!Z0``FD````'0````
+M*0``FD0````0````:0``FD@```!0```!D```FDP```"0```!T```FE````&Q
+M````$```FE0```'Q````4```FE@````Q````D```FEP```!Q```!<0``FF``
+M``&X```!L0``FF0```'X```!\0``FF@````X````,0``FFP```!X````<0``
+MFG````&9```!F```FG0```'9```!V```FG@````9````&```FGP```!9````
+M6```FH````"9````F```FH0```#9```!>0``FH@```#Y```!N0``FHP```#Y
+M```!^0``FI````#Y````.0``FI0```#Y````>0``FI@```#Y````N0``FIP`
+M``#Y````^0``FJ````#Y````^0``FJ0```#Y````^0``FJ@```#Y````^0``
+MFJP```#Y````^0``FK````#Y````^0``FK0```#Y````^0``FK@```#Y````
+M^0``FKP```#Y````^0``FL````#Y````^0``FL0```#Y````^0``FL@```#Y
+M````^0``FLP```#Y````^0``FM````#Y````^0``FM0```#Y````^0``FM@`
+M``#Y````^0``FMP```#Y````^0``FN````#Y````^0``FN0```#Y````^0``
+MFN@```#Y````^0``FNP```#Y````^0``FO````#Y````^0``FO0```#Y````
+M^0``FO@```#Y````^0``FOP```#Y````^0``F-0````@``"8T`````@````(
+M````"`````@````(``"8W`"@`,``H`#``.``P`#@`,``X`#```"8G#,````S
+M````,P```#,````S``````"8G`$````!`````0````$````!``````"8G```
+M``````````````````````````"8G`````````````````````````````"8
+MG`````````````````````````````"8G!\````?````'P```!\````?````
+M``"8G`````````````````````````````"8G`"X````N````+@```"X````
+MN`````"8G`"W````MP```+<```"W````MP````"8G`"$````A````(0```"$
+M````A`````"8G`"8````F````)@```"8````F`````"8G`#`````P````,``
+M``#`````P`````"8G`#_````_P```/\```#_````_P````"8G`#_````_P``
+M`/\```#_````_P````"8G`#_````_P```/\```#_````_P````"8G`#_````
+M_P```/\```#_````_P````"8G`#7````UP```-<```#7````UP````"8G`!A
+M````80```&$```!A````80````"8G`#^````_@```/X```#^````_@````"8
+MG`#>````W@```-X```#>````W@````"8G`!_````?P```'\```!_````?P``
+M``"8G`0]```$/0``!#T```0]```$/0````"8G`!W````=P```'<```!W````
+M=P````"8G`!$````1````$0```!$````1`````"8G`"8````F````)@```"8
+M````F`````"8G``0`(``$`"``!``@``0`(``$`"```"8G``%P#0`!<`T``7`
+M-``%P#0`!<`T``"8G``Q`/``,0#P`#$`\``Q`/``,0#P``"8G``,`1\`#`$?
+M``P!'P`,`1\`#`$?``"8G`!1`$``40!``%$`0`!1`$``40!```"8G`!0`-H`
+M4`#:`%``V@!0`-H`4`#:``"8G`````````````````````````````"8G```
+M0$0``$!$``!`1```0$0``$!$``"8G`````````````````````````````"8
+MG```8,```&#```!@P```8,```&#```"8G```+````"P````V````-@```"P`
+M``"8R```!`,```0#```$`P``!`,```0#``"8G```9````&0```!D````9```
+M`&0```"8G```"`````@````(````"`````@```"8S`````X````.````#@``
+M``X````.``)*-``"2CP``DI$``)*7``"2EP``DI,``)*5```````````````
+M`#`N.2XR,"XS`````````6````%H```!<````7@```&````!B````9````&8
+M``````&(`/``\P&)`(``@P&*`/(`]0&+`/8`]P&,`/$`]`&-`($`A`&/`((`
+MA0```&4```````'_____````@/____\`````2E````^T`````````&H`````
+M``'_____````@/____\`````2E````^T`````````$``\`#S@8@`\`#S`$$`
+M@`"#@8D`@`"#`$@`\@#U@8H`\@#U`$,`]@#W@8L`]@#W`$H`\0#T@8P`\0#T
+M`$L`@0"$@8T`@0"$`$P`@@"%@8\`@@"%"0@)1`4&*"@`````````````````
+M```````````````)A0F%!08H*`````````````````````````````````F%
+M"844!B@H````````````````````````````````"84)A1(&*"@`````````
+M``````````0````````````)T`JL!08H*```````````````````````````
+M``````D("40%!A0%````````````````````````````````"0@)1!0`%`4`
+M```````````````````````````````);`FH!084!0``````````````````
+M``````````````EL":@4`!0%````````````````````0```````````"6P)
+MJ!X`%`4````````````````````````````````);`F>&P84!0``````````
+M``````````````````````EL"9X4`!0%````````````````````0```````
+M````"8`)BA0`%`4````````````````````````````````)F0FH%``4!0``
+M``````````````````````````````G0"JP%!A0%````````````````````
+M````````````":,)J!0`%`4``````````````````"`@```````````)"`E$
+M%``4!0````````````````````````````````EL"6P4`!0%````````````
+M````````````````````"7$)@!0`%`4`````````````````````````````
+M```)A0F*%``4!0````````````````````````````````F/"9D4`!0%````
+M````````````````````````````"9X)GA0`%`4`````````````````````
+M```````````)HPFC%``4!0``````````@```````!`````````````FC":,4
+M`!0%``````````"`````````````````````":@)J!0`%`4``````````(``
+M``````0````````````)J`FH%``4!0``````````@```````````````````
+M``D("40%!A0%````````````````````````````````"0@)1!0`%`4`````
+M```````````````````````````);`FH!084!0``````````````````````
+M``````````EL":@4`!0%````````````````````(```````````"6P)J!X`
+M%`4````````````````````````````````);`F>&P84!0``````````````
+M``````````````````EL"9X4`!0%````````````````````(```````````
+M"8`)BA0`%`4````````````````````````````````)F0FH%``4!0``````
+M``````````````````````````FC":@4`!0%```````````````````@(```
+M````````";0)M`4&%`4````````````````````````````````)M`FT%``4
+M!0``````````````````*"````````````G0"JP%!A0%````````````````
+M````````````````"0@)1!0`%`4````````````````````````````````)
+M;`EL%``4!0````````````````````````````````EQ"8`4`!0%````````
+M````````````````````````"84)BA0`%`4`````````````````````````
+M```````)CPF9%``4!0````````````````````````````````F>"9X4`!0%
+M````````````````````````````````":,)HQ0`%`4``````````(``````
+M``0````````````)HPFC%``4!0``````````@`````````````````````FH
+M":@4`!0%``````````"````````$````````````":@)J!0`%`4`````````
+M`(`````````````````````)M`FT%``4!0``````````@```````!```````
+M``````FT";04`!0%``````````"`````````````````````%`H46@4&*"@`
+M```````````````````````````````4@A32!08H*``````````!````````
+M`````````````!3Z%7(%!B@H````````````````````````````````%9H6
+M$@4&*"@``````````0`````````````````````4'A1&!08H*```````````
+M`````````````````````!1N%+X%!B@H``````````$`````````````````
+M````%.857@4&*"@````````````````````````````````5AA8F!08H*```
+M```````!`````````````````````!10%'@1!B@H````````````````````
+M````````````%%`4>!<&*"@````````````````````````````````46A1:
+M$08H*````````````````````````````````!1:%%H7`"@H````````````
+M````````````````````%*`4H!<&*"@``````````0`````````"````````
+M```4H!2@%`8H*``````````!``````````(``````````!2"%((1`"@H````
+M``````$``````````@``````````%*H4JA0`*"@``````````0`````````"
+M```````````4@A2J%``H*``````````!``````````(``````````!2"%*H7
+M!B@H``````````$``````````@``````````%:06'!0&*"@``````````0``
+M```````"```````````6@!:H%``H*```````````````````````````````
+M`!:`%J@>!B@H````````````````````````````````%H46K1X&*"@`````
+M```````````````````````````46A2"#P`H*``````````#````````!```
+M`````````!2J%*H2`"@H``````````,````````$````````````%:06'!0`
+M*"@``````````P````````0````````````6@!:H%``H*```````````````
+M````!````````````!,S$ST7``H%````````````````````$!``````````
+M$T<341<`"@4````````````````````0$``````````3.!-T%P`4%```````
+M`````````````!`'`````````!-.$WL;!@4%`````````````````````0``
+M````````$U$3>1X&"@4````````````````````!```````````35A-T(084
+M!0````````````````````$``````````!.K$[`7``H%````````````````
+M````$`P`````````$[`3V!<`%!0````````````````````0`@`````````3
+MOQ._%P`*!0```````````````````!`,`````````!0`%'@%!A04````````
+M````````````````````````%#(4;A<`%!0````````````````````8`0``
+M```````4,A1N%``4%````````````````````!@!`````````!0\%'@/`!04
+M````````````````````!0``````````%#P4>!$&%!0`````````````````
+M```!`0`````````4/!1X$@`4%`````````````````````4``````````!0\
+M%'@4`!04````````````````````!0``````````%#P4>!<`%!0`````````
+M```````````%```````````4/!1X%P84%`````````````````````$`````
+M`````!0\%,@4!A04``````````(`````````!```````````%'@4H!<`%!0`
+M`````````0`````````%```````````4C!2@%P`4%``````````#````````
+M``4``````````!2,%,@2`!04``````````,`````````!0``````````%(P4
+MR!0`%!0`````````!P```````(`%```````````4C!3(%`84%``````````#
+M``````````$"`````````!2,%,@7!A04``````````,``````````0(`````
+M````%(P4R!<&%!0``````````P`````````!```````````4C!3('@`4%```
+M`````````````````````````````!2,%D0%!A04``````````,`````````
+M````````````%*`4R!$&%!0``````````P`````````!```````````5?!7T
+M'@84%``````````"``````````0``````````!5\%D04!A04``````````,`
+M`````````00`````````%7P61!L`%!0``````````P`````````%````````
+M```5?!9$'@`4%``````````#``````````4``````````!5\%D07`!04````
+M``````<```````"``0``````````%G$6K1<`%!0`````````````````````
+M```````````6<1:M'@84%````````````````````````````````!9Q%JT>
+M!A04``````````(`````````!```````````%G$6P04&%!0`````````````
+M```````````````````6<1;!$0`4%```````````````````````````````
+M`!9Q%L$4`!04````````````````````````````````%G$6P1X`%!0`````
+M```````````````````````````6<1;!'@84%``````````````````````#
+M`````````!9Q%L$>!A04````````````````````````````````$S@3=!X`
+M%!0```````````````````0````````````3L!/8'@`4%```````````````
+M````!````````````!0R%&X>`!04``````````,````````$````````````
+M%#P4>!X`%!0``````````P````````0````````````4C!3('@`4%```````
+M```#````````!````````````!9Q%L$>`!04```````````````````$````
+M````````%7P61!X`%!0``````````P````````0````````````4C!3('@`4
+M%````````````````````````````````!0\%'@>`!04````````````````
+M````````````````%L$6P1X`%!0```````````````````0`````````````
+M``'_`?\`````````````?_________\````````````#`9@!F0``````````
+M``!__________P````````````<!F`LP`````````````'__________````
+M````````"`&8##``````````````?_________\````````````@`2`*$```
+M``````````!__________P```````````"$!(`&9`````````````'______
+M____````````````(@$@##``````````````?_________\````````````Z
+M`6`*$`````````````!__________P```````````#L!8`&9````````````
+M`'__________````````````$@%E"A````````,`````?_________\`````
+M```````W`3`!F0```````P````!__________P```````````#4",`&9````
+M```#`````'__________````````````-@,P`9D```````,`````?_______
+M__\````````````P!#`!F0```````P````!__________P```````````#D%
+M,`&9```````#`````'__________````````````-`8P`9D```````,`````
+M?_________\````````````R`S`!F0```````P````!__________P``````
+M`````#$#,`&9`````````````'__________````````````$0$0`9D`````
+M````````?_________\````````````0`1`*$`````````````!_________
+M_P```````````%(!4`&9`````````````'__________````````````10)0
+M`9D`````````````?_________\```````````!'`U`!F0````````````!_
+M_________P```````````$($4`&9`````````````'__________````````
+M````6`50`9D`````````````?_________\```````````!;!E`!F0``````
+M``````!__________P```````````%T(4`&9`````````````'__________
+M````````````7@E0`9D`````````````?_________\```````````!0`U`*
+M$`````````````!__________P```````````%4!4`PP`````````````'__
+M________````````````5@)0##``````````````?_________\`````````
+M``!)`E`-4`````````````!__________P```````````$`!0`I```````!&
+M````!``````````H`8@`````````00%`"D```````$<````$`````````&@!
+MB0````````!(`4`*$```````1@````0`````````"`&*`````````$H!0`I`
+M``````!&````!````````!@(`8P`````````2P%`"D```````$8````$````
+M````8`@!C0````````!,`4`*4```````1@````0`````````"`&/````````
+M`$,"0`I```````!'````!`````````!P`8L`````````\`-`"D```````$8`
+M```$`````````"````````````"``T`*0```````1P````0`````````8`^G
+M`````````/$#0`I```````!&````!````````!@`````````````@0-`"D``
+M`````$8````$````````8``/J`````````""`T`*4```````1@````0`````
+M``````^I`````````/(#0`H0``````!&````!```````````````````````
+M@P1`"D```````$<````$````````@&`/J@````````#T!$`*0```````1@``
+M``0```````"8`````````````(0$0`I```````!&````!````````.``#ZL`
+M````````A01`"E```````$8````$````````@``/K`````````#U!$`*$```
+M````1@````0```````"``````````````(8%0`I```````!'````!```````
+M`(!@#ZT`````````AP5`"D```````$8````$````````X``/K@````````"(
+M!4`*4```````1@````0```````"```^O`````````(D&0`I```````!'````
+M!`````````!H#[``````````B@9`"D```````$8````$````````8`@/L0``
+M``````"+!D`*4```````1@````0`````````"`^R`````````(P'0`I`````
+M``!'````!````````(!H#[,`````````C0=`"D```````$8````$````````
+MX`@/M`````````".!T`*4```````1@````0```````"`"`^U`````````(\(
+M0`I```````!'````!````````(!H#[8`````````D`A`"D```````$8````$
+M````````X`@/MP````````"1"$`*4```````1@````0```````"`"`^X````
+M`````/8)0`I```````!'````!````````(!@````````````]PM`"D``````
+M`$<````$````````@&````````````!@`&``8`````````````!_________
+M_P```````````&$`80!A```````#`````'__________````````````8@!B
+M`&(```````(`````?_________\```````````!C`&,`8P````````````!_
+M_________P```````````&0`9`!D```````#`````'__________````````
+M````90!E`&4```````,`````?_________\```````````!F`&8`9@``````
+M``````!__________P```````````&<`9P!G`````````````'__________
+M````````````:`!H`&@`````````````?_________\```````````!I`&D`
+M:0```````P````!__________P```````````&H`:@!J```````#`````'__
+M________```````````!_P```````0````$````!&U@``````!`````!````
+M`0````$;6`````@``P````$``````````1M8````#``#`````0`````````!
+M&U@````@`$<````````````````;6````#,`,`````$``````````1M8````
+M)``A`````0````$````!&U@````H`#<````!``````````$;6````!\`,```
+M``$````!`````1M8````,`!;`````0`````````!&U@```!P``,````!````
+M``````$;6````#@`-P````$``````````1M8````5`!5`````0````$````!
+M&U@```!$`%4````!`````0````$;6````$P`.P````$``````````!M8````
+M8`!2`````0````$````!&U@```!D`#0````!``````````$;6````'P`(```
+M``$````!`````1M8````F`!;`````0````$````!&U@```"<`%(````!````
+M`0````$;6````*H`$`````$``````````1M8````O``#`````0`````````!
+M&U@```"_`#8````!``````````$;6````,0`-P````$````!`````1M8````
+MRP`W`````0`````````!&U@```#0`#<````!``````````$;6````-8`$```
+M``$````!`````1M8````V@`#````````````````&U@```,R`#8````!````
+M``````$;6````-X``P````$``````````1M8````Z0`W`````0`````````!
+M&U@```#V`#<````!``````````$;6````/H`-P````$``````````1M8````
+M_P`V`````0`````````!&U@```$,`#`````!`````0````$;6````10`-P``
+M``$``````````1M8```!+``W`````0`````````!&U@```%``!`````!````
+M`0````$;6````50``P````$``````````1M8```!6``A`````0````$````!
+M&U@```%<`#<````!``````````$;6````6``-P````$``````````1M8```!
+M9`!;`````0`````````!&U@```%H`%(````!``````````$;6````6P`4@``
+M``$````!`````1M8```!=``W`````0`````````!&U@```%X``,````!````
+M``````$;6````7P`-P````$``````````1M8```!B`!``````0``````````
+M&U@```&)`$$````!```````````;6````8H`2`````$``````````!M8```!
+MBP!#`````0``````````&U@```&,`$H````!```````````;6````8T`2P``
+M``$``````````!M8```!CP!,`````0``````````&U@```^G`(`````!````
+M```````;6```#Z@`@0````$``````````!M8```/J0""`````0``````````
+M&U@```^J`(,````!```````````;6```#ZL`A`````$``````````!M8```/
+MK`"%`````0``````````&U@```^M`(8````!```````````;6```#ZX`AP``
+M``$``````````!M8```/KP"(`````0``````````&U@```^P`(D````!````
+M```````;6```#[$`B@````$``````````!M8```/L@"+`````0``````````
+M&U@```^S`(P````!```````````;6```#[0`C0````$``````````!M8```/
+MM0".`````0``````````&U@```^V`(\````!```````````;6```#[<`D```
+M``$``````````!M8```/N`"1`````0``````````&U@```&0`$(````!````
+M``````$;6````8X``P````$``````````1M8```!F`!%`````0````$````!
+M&U@```&:`$4````!```````````;6````9L`10````$``````````!M8```!
+MG`!>`````0``````````&U@```&>``,````!``````````$;6````:P`-P``
+M``$``````````1M8```!I@`#`````0`````````!&U@```&V`#<````!````
+M``````$;6````;@`-P````$``````````1M8```!N@`W`````0`````````!
+M&U@```&^`"$````!`````0````$;6````R<``P````$``````````1M8```!
+MR@!=`````0``````````&U@```'6`#<````!``````````$;6````>0`$```
+M``$````!`````1M8```![``P`````0````$````!&U@```'X``,````!````
+M``````$;6````A``-P````$``````````1M8```"*@`B`````0`````````!
+M&U@```)"`#<````!``````````$;6````@``6P````$``````````1M8```"
+M2@`#`````0`````````!&U@```)/`!`````!`````0````$;6````EP`4@``
+M``$``````````1M8```"8``[`````0````$````!&U@```)H`#<````!````
+M``````$;6````FP`-P````$``````````1M8```"=@`0`````0````$````!
+M&U@```)Z``,````!``````````$;6````H(``P````$``````````1M8```"
+M@P`#`````0`````````!&U@```*J`"$````!``````````$;6````KX`6P``
+M``$````!`````1M8```"OP`W`````0`````````!&U@```+!`#<````!````
+M``````$;6````L8`.P````$``````````1M8```"U``W`````0`````````!
+M&U@```+P`#<````!``````````$;6````O0`-P````$``````````1M8```"
+M^``#`````0`````````!&U@```">`%`````!`````0````$;6````OP``P``
+M``$``````````1M8```##``P`````0`````````!&U@```,4`#8````!````
+M``````$;6````Q@`-@````$``````````1M8```#)``#`````0`````````!
+M&U@```,0``,````!``````````$;6````SH`-P````$``````````1M8```#
+M2``0`````0````$````!%L$```-*`!(````!`````0````$;6````UH`$0``
+M``$``````````1M8```#7``Z`````0````$````!&U@```->`%8````!````
+M``````$;6````L```P````$``````````1M8```#=P`#`````0`````````!
+M&U@```+,``,````!``````````$;6`````````'_$`````````````````$`
+M````````````````````````(`@``@````````````````````#_````````
+M`````````"01````````````````````%`4```````````````````(%````
+M````````````````$P```````````5`0````````````````````````````
+M``````````````$`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````"4!``````````````````````````````````````
+M``````0`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````-0$```````````````````````````````````````````"!``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M!%`0``````````````````````````````````````````"```"`````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````%4!``````
+M`````````````````````````````````````$``````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````90,```````````````
+M``(``````````P``````````````@`!`@```````````````````"0@`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"%`P````````````````````````
+M`````````P````````$`!```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````)4#`````````````````"``````````0````#
+M`````````!`@!```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````$P,`````````````````(`````````!`````,```````@`
+M`(!`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````C`P`````````````````@`````````$`````P````````````!`````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````#,#``
+M```````````````"``````````0````#```````(````0```````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````0P,```````````
+M``````(`````````!`````,````````````@0```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````!3`P`````````````````@``
+M```````$`````P`````````````0````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````&,#`````````````````"``````````0`
+M```#``````````$`$0``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````$0$```````````````````````````````````````
+M```"``$`(```````````````````$@0``````````````````"`1````````
+M````````````````````````````````````````````````````````````
+M`````````2`0``````````````````````````````````````````0``@(`
+M````````````````````````````````````````(!(`````````````````
+M```````````````````````````````````````````````````````````!
+M8!`````````````````!``````````,``````````````@!`@"``````````
+M`````````!#$```````````````````$(0``````````````````````````
+M``````````````````````````````````````````````````%E$```````
+M``````````$``````````P```````````````````#@`````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````4!`````````````````
+M```````````(`````@`````````````$````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````"0$``````````````````````````
+M`!`````"``````````````7'````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````-`0`````````````````````````"```````(`
+M````````````@```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````!$!`````````````````!````````(```````@``````````
+M`$"`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```%0$`````````````````$````````@``````"``````````(`0(``````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````9`0```
+M````````````````````````"`````(`````````````B```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````!T!`````````````
+M````!````````(`(`````@```````````$"$````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(0$`````````````````$````
+M````@`@````"``````````(`0(0`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````E`0`````````````````````````"`````
+M``(`````````````@<<`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````"T!`````````````````!````````(```````@``````
+M`````$"!QP``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````-4/\`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```*````````````````````"@````````````````````````````````HP
+M_P``````````````````````````@`````,`````````````````````````
+M`````````````````````````````````````````````````````0``````
+M``````````````$`````````````````````!```````````"S`P````````
+M``````````````````$``````P``````````````````````````````````
+M````````````````````````````````````````````@```````````````
+M`````(`````````````````````$```````````,,#``````````````````
+M`````````@`````#````````````````````````````````````````````
+M```````````````````````````````````0````````````````````$```
+M``````````````````0```````````H0$```````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````"`````````````````````@````````````
+M````````!```````````"D!``````````````````````````'A@`````@``
+M````````````````````````````````````````````````````````````
+M```````````````*0```````````````````!$`````````````````````$
+M```````````*4$``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````(````````````````````"`````````````````````0`````````
+M``&9,```````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````@`
+M```````````````````(````````````````````!````````````&#_````
+M`````````````P````````0`````"````````^``````````````````````
+M``+``````````````````````````````````````````*_`````````````
+M```````+\``````````````````````(````````````9O\`````````````
+M```#````````!``````(```````#X````````````````````````L``````
+M````````````````````````````````````!\````````````````````'P
+M``````````````````````@```````````!G_P````````````````,`````
+M```$``````@```````/@```````````````````````"P```````````````
+M```````````````````````````OP```````````````````"_``````````
+M````````````"````````````&C_`````````````````P````````0`````
+M"````````^````````````````````````+`````````````````````````
+M`````````````````%?````````````````````5\```````````````````
+M```(````````````8?\````````````````#````````!``````0```````#
+MX```````````````````````````````````````````````````````````
+M````````K\````````````````````OP``````````````````````@`````
+M``````!B_P````````````````,````````$`````!````````/@````````
+M```````````````"P`````````````````````````````````````````"O
+MP```````````````````"_``````````````````````"````````````&/_
+M`````````````````P````````0`````"````````>``````````````````
+M``````+``````````````````````````````````````````"_`````````
+M```````````+\``````````````````````(````````````9/\`````````
+M```````#````````!``````0```````<``@``````````````````````L``
+M````````````````````````````````````````!\``````````````````
+M``'P``````````````````````@```````````!E_P````````````````,`
+M```````$`````!````````B$````````````````````````````````````
+M``````````````````````````````!7P```````````````````%?``````
+M````````````````"````````````&G_`````````````````P````````0`
+M````$````````\````````````````````````+`````````````````````
+M``````````````````````?````````````````````!\```````````````
+M```````(````````````:O\````````````````#````````!``````0````
+M```#P```````````````````````````````````````````````````````
+M````````````+\````````````````````OP``````````````````````@`
+M``````````&8_P``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````(```````````````````````````````````````````!
+M`Q=P"P",```````!`R,H#P`2```````!`R[@"@"8`@`````!`T90#@`D`@``
+M```!`UW`"0"P!``````!`XR@#0!(!``````!`[N`"`!@!``````!`]+P#`!L
+M!```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(````````````````````````
+M```````````````````!`A=P"P",```````!`B,H#P`2```````!`B[@"@"8
+M`@`````!`D90#@`D`@`````!`EW`"0"P!``````!`HR@#0!(!``````!`KN`
+M"`!@!``````!`M+P#`!L!```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````0```````````````````````````````````````````$``^@+`((`
+M``````$`!]`*!(0!``````$`%7P)!(L!``````$`*O@(!)8!````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````@`````````````````````````````````
+M``````````$#%W`+`(P```````$#(R@/`!(```````$#+N`*`)@"``````$#
+M1E`.`"0"``````$#7<`)`+`$``````$#C*`-`$@$``````$#NX`(`&`$````
+M``$#TO`,`&P$````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````@`````````````
+M``````````````````````````````$"%W`+`(P```````$"(R@/`!(`````
+M``$"+N`*`)@"``````$"1E`.`"0"``````$"7<`)`+`$``````$"C*`-`$@$
+M``````$"NX`(`&`$``````$"TO`,`&P$````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````)B<`````````````)B<`````````````)B<`````````````)B<
+M`````````````)B<`````````````)B<$````!```````)B<!`````0`````
+M`)B<`````````````)B<`````````````)B<`````````````)B<``````H`
+M`````)B<`#@`@`(X`(```)B<``(`!@````8``)B<````D@```)(``)B<````
+MH````*```)B<``0`!P`$``<``)C4````&@```!H``)B<````2````$@``)B<
+M````$````!```)B<````"`````@``)B<````#P````\``)B<````\@```&(`
+M`)B<``"03P``D$P``)B<```26@``$IH``)C,````#@````\``*($````````
+M`````*((4#Y&1E`^1D8``*(,9(!!;&2`06P``*(0`9F@`P&9H`,``*(4!$S6
+M$`1,UA```*(8$X``0!.``$```*(<&^``8!O@`&```*(@#%.`"@Q3@`H``*(D
+M`!3?.P`4WSL``*(H```!M0```;4``*(L````(````"```)B<````````````
+M`)B<`````````````)B<`````````````)B<`````````````)B<````````
+M`````)B<`````````````)B<`````````````)B<`````````````)B<````
+M`````````)B<`````````````)B<`````````````)B<`#@````X`````)B<
+M`````````````)B<`````````````)B<`````````````)B<``0`^0`$`/D`
+M`)C4``````````0`````````#0``````````````````````````````````
+M`````````00`^@,`@0`"9`)D`00!]`<`@0`!R0')`00#Z`(`@@$`Y`#D`00'
+MT`8`A`(`H`"@`00+N`$`A@,`C`",`0(7<`L`C`0`/``\`0(C*`\`$@0`/``\
+M`0(NX`H`F`8`,``P`0)&4`X`)`8`,``P`0)=P`D`,`@`+``L`0*,H`T`2`@`
+M+``L`0*[@`@`8`@`+``L`0+2\`P`;`@`+``L````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````#```````````````
+M`````````````````````````````0`#Z!L`@@```````0`'T!H$A`$`````
+M`0`5?!D$BP(``````0`J^!@$E@,```````(7<`L`#`0```````(C*`\`$@0`
+M`````0(NX`H`&`8``````0)&4`X`)`8``````0)=P`D`,`@``````0*,H`T`
+M2`@``````0*[@`@`8`@``````0+2\`P`;`@`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````!````````````````````````````````````````````0`#Z!L`@@``
+M`````0`'T!H$A`$``````0`5?!D$BP$``````0`J^!@$E@$`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````"```````````````````````````````````
+M`````````0,7<`L`C````````0,C*`\`$@```````0,NX`H`F`(``````0-&
+M4`X`)`(``````0-=P`D`L`0``````0.,H`T`2`0``````0.[@`@`8`0`````
+M`0/2\`P`;`0`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````!P``````````````
+M`````````````````````````````0,7<`L`C````````0,NX`H`F`(`````
+M`0-&4`X`)`(``````0-=P`D`L`,``````0.,H`T`2`,``````0.[@`@`8`,`
+M`````0/2\`P`;`,`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"````````````````````````````````````````````0(%W`L`@P``
+M`````0((R@\`!````````0(+N`H`A@(``````0(1E`X`"0(``````0(7<`D`
+MC`0``````0(C*`T`$@0``````0(NX`@`&`0``````0(TO`P`&P0`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````"```````````````````````````````````
+M`````````0(+N`L`A@```````0(1E`\`"0```````0(7<`H`C`(``````0(C
+M*`X`$@(``````0(NX`D`F`0``````0)&4`T`)`0``````0)=P`@`,`0`````
+M`0)I>`P`-@0`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````"```````````````
+M`````````````````````````````0(7<`L`C````````0(C*`\`$@``````
+M`0(NX`H`F`(``````0)&4`X`)`(``````0)=P`D`L`0``````0*,H`T`2`0`
+M`````0*[@`@`8`0``````0+2\`P`;`0`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`
+M`````````3`Q+C`Q````````"``````````!,#$N,#$````````(````````
+M``$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N
+M,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q````
+M````"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`
+M`````````3`Q+C`Q````````"``````````!,#$N,#$````````(````````
+M``$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N
+M,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q````
+M````"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`
+M`````````3`Q+C`Q````````"``````````!,#$N,#$````````(````````
+M``$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N
+M,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q````
+M````"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`
+M`````````3`Q+C`Q````````"``````````!,#$N,#$````````(````````
+M``$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N
+M,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q````
+M````"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`
+M`````````3`Q+C`Q````````"``````````!,#$N,#$````````(````````
+M``$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N
+M,#$````````(``````````$P,2XP,0````````@``````````3`Q+C`Q````
+M````"``````````!,#$N,#$````````(``````````$P,2XP,0````````@`
+M`````````3`Q+C`Q````````"``````````!,#$N,#$````````(````````
+M``$P,2XP,0````````@``````````3`Q+C`Q````````"``````````!,#$N
+M,#$`````+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5G:6YF;P`N<F5L
+M82YT97AT`"YR96PN=&5X=``N<F5L82YR;V1A=&$`+G)E;"YR;V1A=&$`+G)E
+M;&$N9&%T80`N<F5L+F1A=&$`+F1A=&$Q`"YB<W,`+FYO=&4`````````````
+M`````````````````````````````````````````````````!MP```&````
+M`@`````````T````&```````````````!````!@````I`````0````8`````
+M````4``"7"```````````````!``````````+P````D````````````#<RP`
+M`&O8````#P````(````$````"````"0````$`````````````]\$````````
+M``\````"````!`````P````^`````0````(```````)<<```CM``````````
+M`````!``````````1@````D````````````#WP0```X8````#P````4````$
+M````"````#D````$`````````````^T<``````````\````%````!`````P`
+M``!7`````0````,```````+K0```54```````````````!``````````70``
+M``D````````````#[1P```!`````#P````@````$````"````%(````$````
+M`````````^U<``````````\````(````!`````P```!G`````0````,`````
+M``-`@````````````````````!``````````;@````@````#```````#0(``
+M``&@```````````````0`````````',````'`````````````T"````$$```
+M`````````````0`````````1`````P````````````-$D````'D`````````
+M``````$``````````0````(````````````#1[0``!F0````$`````@````$
+M````$`````D````#`````````````V%$```1Z````````````````0``````
+M`````````````````````````````````````P```@````````````````,`
+M``4````````````````#```(`````````````````P``#```````````````
+M``,```$````````````````#```+`````````````````P``#0````$``+PH
+M````K!(```(````,``"E.`````@2```"````%P`!8C0```*0$@```@```"(`
+M`'OX````P!(```(````M``&#$````P`2```"````.``!(G`````X$@```@``
+M`$,``9-8```!V!(```(```!.``!J$````;@2```"````60`!YVP```%L$@``
+M`@```&0``#\$```!I!$```@```!O``%JV````%@2```"````>@``;<@```!(
+M$@```@```(4``%J(```!+!(```(```"0``!.L````:01```(````FP`!6=0`
+M```T$@```@```*8``5-$````*!(```(```"Q``%#P`````@2```"````O``!
+M(2````%$$@```@```,<``3!8```!V!(```(```#2```-#````*@2```"````
+MW0`!#\0```#T$@```@```.@``/+P```!"!(```(```#S``#0-````+@2```"
+M````_@``UY`````D$@```@```0D``*KP````5!(```(```$4``%>E````%@2
+M```"```!'P`!(&P````($@```@```2H``3^0````+!(```(```$U``&&$```
+M`302```"```!0```"6@```!D$@```@```4L``25H````\!(```(```%6``#!
+MD`````@2```"```!80`!TB0```"X$@```@```6P``*_X````"!(```(```%W
+M``#7M````"@2```"```!@@``$EP```'<$@```@```9T``%.<```!I!$```@`
+M``&H``%4Y````,`2```"```!LP``K*@```#4$@```@```;X```0<````,!(`
+M``(```')``'5<````)`2```"```!U```````````$````````?4``'8H````
+MC!(```(```(```%83````602```"```""P`!5\0```"($@```@```A8``10`
+M```!`!(```(```(A``!Z*````$`2```"```"+```R?P```"($@```@```C<`
+M`-#L````S!(```(```)"``$52````$P2```"```"30``QGP````P$@```@``
+M`E@``57X````N!(```(```)C``"P(````(P2```"```";@``=+0```!\$@``
+M`@```GD``*6(````3!(```(```*$``%,?````)@2```"```"CP``TRP```!8
+M$@```@```IH``56D````1!(```(```*E``%4!````)P2```"```"L``!(Z``
+M``"D$@```@```KL``8=H````3!(```(```+&``!MP`````@2```"```"T0`!
+M5K````#,$@```@```MP``&"@```&^!(```(```+G``#2J````#@2```"```"
+M\@`!3X````"8$@```@```OT```-X````I!(```(```,(``%4H````$02```"
+M```#$P`!N5````%H$@```@```QX``3VT````:!(```(```,I``&1K````/@2
+M```"```#-```>5````!,$@```@```S\``,'@````\!(```(```-*``#'O```
+M`+`2```"```#50``I`@```!`$@```@```V```<&P````]!(```(```-K``"4
+MW````U@2```"```#=@``?O`````($@```@```X$``<*D````3!(```(```.,
+M``"G:````X@2```"```#EP```>````&,$@```@```Z8``:4<```#[!(```(`
+M``.Q``%H4````5`2```"```#O```TE`````H$@```@```\<``;YH```"/!(`
+M``(```/2``%=,````602```"```#W0`!:<0````H$@```@```^@```-L````
+M#!(```(```/S``#,0````"02```"```#_@`!%90```$L$@```@``!`D``14`
+M````2!(```(```04``#I6````&P2```"```$'P``9Y@````D$@```@``!"H`
+M`'F<````C!(```(```0U```$3````F`2```"```$2P`!D$P```!`$@```@``
+M!%8``+"L```!!!(```(```1A``![M````$02```"```$;```OQ`````H$@``
+M`@``!'<``8=$````)!(```(```2"``#]$````$`2```"```$C0`!1IP```5(
+M$@```@``!)@``4($````"!(```(```2C``!O`````-@2```"```$K@``O-0`
+M``"`$@```@``!+D``=D0````9!(```(```3$``%$&````:@2```"```$SP``
+MTA@````($@```@``!-H``'5X````L!(```(```3E``$3T````"02```"```$
+M\``!)M@```CT$@```@``!/L``;V(````X!(```(```4&``%3/`````@2```"
+M```%$0``QE`````L$@```@``!1P``6Q$````L!(```(```4G``"E,`````@2
+M```"```%,@`!SVP```'($@```@``!3T``-K\````:!(```(```5(``!S:```
+M`'`2```"```%4P`!5WP```!($@```@``!5X``2_,````C!(```(```5I``$>
+M`````"P2```"```%=``!U@````!P$@```@``!7\``````````!(```````6,
+M``"FY````(02```"```%EP``AT````!H$@```@``!:(``=($````(!(```(`
+M``6M``'7``````@2```"```%N``!4*P```#\$@```@``!<,```<8```!X!(`
+M``(```74``'&@```!6@2```"```%WP``>F@```"P$@```@``!>H``*W4```!
+M$!(```(```7U``#2"`````@2```"```&```!4VP````H$@```@``!@L``>C8
+M````X!(```(```86``"&,````+`2```"```&(0`!.'````#8$@```@``!BP`
+M`,&8````2!(```(```8W``#L`````A02```"```&0@``I$@```#H$@```@``
+M!DT``9PD```';!(```(```98``%N1````%02```"```&8P`!9,0````T$@``
+M`@``!FX``-MD```!B!(```(```9Y``%:"````R@2```"```&A```SD0```"8
+M$@```@``!H\``-(H````*!(```(```::``%>[````T@2```"```&I0`!PT``
+M``'D$@```@``!K```=ET```'>!(```(```:[``#2X````$P2```"```&Q@``
+ML<`````4$@```@``!M$``&S0````"!(```(```;<``"]5````;P2```"```&
+MYP`!3EP```!X$@```@``!O(``'^H````,!(```(```;]``(^6````1`2```"
+M```'"```?N`````($@```@``!Q,``5.\````"!(```(```<>``%2-````%@2
+M```"```'*0``2V@```&D$0``"```!S0``1[<````N!(```(```<_``'ND```
+M`%02```"```'2@``?0P```"X$@```@``!U4``-?<````*!(```(```=@``"'
+MJ````?P2```"```':P`!@NP````D$@```@``!W8``4P@````+!(```(```>!
+M``%.U````*P2```"```'C``!USP```'4$@```@``!Y<``),<````*!(```(`
+M``>B``"#I````"@2```"```'K0``=X0```$0$@```@``![@``(<$````/!(`
+M``(```?#``%-M````*@2```"```'S@`!BL````0<$@```@``!]D``<SL```"
+M@!(```(```?D``!#^````:01```(```'[P``;]@```(T$@```@``!_H``$R@
+M````A!(```(```@%``"E0````$@2```"```($```AN`````D$@```@``"!L`
+M`````````!````````@[``")L```"%`2```"```(1@`````````)$0``"```
+M"%8``94P````G!(```(```AA``#(;````&02```"```(;``"6Q````$0$@``
+M`@``"'<``3(P````:!(```(```B"``%0/````'`2```"```(C0``?O@````(
+M$@```@``")@``9#\````L!(```(```BC``#2$`````@2```"```(K@``ULP`
+M```L$@```@``"+D``,+0````V!(```(```C$``%3Q````#@2```"```(SP``
+M````````$@``````"-X``,DX````?!(```(```CI``!-#````:01```(```(
+M]``!:!P````L$@```@``"/\``3GT````@!(```(```D*``#S^````(`2```"
+M```)%0``DO@````D$@```@``"2```,\@````P!(```(```DK``%"#````:@2
+M```"```)-@``4?@```&D$0``"```"4$``5FP````)!(```(```E,``#+J```
+M`)@2```"```)5P`!;6@```#<$@```@``"6(``>2P```"O!(```(```EM``##
+MJ````G`2```"```)>```A-0```!($@```@``"8,``,=,````0!(```(```F.
+M``#WU````6`2```"```)F0``F\`````8$@```@``":0``6N,````N!(```(`
+M``FO``!05````:01```(```)N@``R-````!H$@```@``"<4``,K\````K!(`
+M``(```G0``!XE````)@2```"```)VP`!S!`````L$@```@``">8`````````
+M`!(```````GU``$@=````"`2```"```*```!3$P````P$@```@``"@L``')`
+M````+!(```(```H6``%5Z````!`2```"```*(0``T@`````($@```@``"BP`
+M`4U4````8!(```(```HW``!"5````:01```(```*0@``VK`````D$@```@``
+M"DT``+\X```!0!(```(```I8```!B````%@2```"```*9@``/6````&D$0``
+M"```"G$``-H`````L!(```(```I\``#`>`````@2```"```*AP````P````D
+M$0``"```"ID``':T````.!(```(```JD``!W?`````@2```"```*KP`!0\@`
+M``!0$@```@``"KH``(),````H!(```(```K%``'K>````Q@2```"```*T```
+M@NP````L$@```@``"ML``-`D````$!(```(```KF``%J:````'`2```"```*
+M\0``65````#@$@```@``"OP``<OH````*!(```(```L'``#92````+@2```"
+M```+$@``T;@```!($@```@``"QT``6H4````5!(```(```LH``$>+````#`2
+M```"```+,P`!PO````!0$@```@``"SX``,_@````1!(```(```M)``&CD```
+M`4P2```"```+5```P(````$0$@```@``"U\``2"4````C!(```(```MJ``!`
+ML````:01```(```+=0``A(@```!,$@```@``"X```=<(````-!(```(```N+
+M``!K^````-@2```"```+E@``@R````!@$@```@``"Z$``1@8```%P!(```(`
+M``NL``!_1````&02```"```+MP``?/P````0$@```@``"\(``3IT```",!(`
+M``(```O-``'`I````0P2```"```+V```VM0````H$@```@``"^,``%HP````
+M6!(```(```ON``$^X````*P2```"```+^0``$2````"($@```@``#`0```L(
+M```"!!(```(```P/``$]4````&02```"```,&@``?<0```#,$@```@``#"4`
+M`(.`````)!(```(```PP``&W(````*02```"```,.P``=$P```!H$@```@``
+M#$8``:3<````0!(```(```Q1``!))````$02```"```,7```!JP```!L$@``
+M`@``#&<``4T4````0!(```(```QR```````````2```````,@@``_5````&<
+M$@```@``#(T``&O0````*!(```(```R8``'1-````-`2```"```,HP``=3``
+M``!($@```@``#*X``47`````W!(```(```RY``#-E````+`2```"```,Q``!
+M'Y0```#8$@```@``#,\``````````!````````SO```)S````3P2```"```,
+M^@``<J0```!\$@```@``#04``',@````0!(```(```T0``#'C````#`2```"
+M```-&P``;A````#P$@```@``#28``,J$````>!(```(```TQ``$RF```!7P2
+M```"```-/```TG@````H$@```@``#4<``6Z8```"(!(```(```U2``!^V```
+M``@2```"```-70``<A`````P$@```@``#6@``'=T````"!(```(```US````
+M```````2```````-@0``QB`````P$@```@``#8P```Z@````Y!(```(```V7
+M``!_`````$02```"```-H@``V.P```!<$@```@``#:T``-.$````-!(```(`
+M``VX``"3U````0@2```"```-PP``A1P```!<$@```@``#<X``';L````B!(`
+M``(```W9``%+\````#`2```"```-Y``!:>P````H$@```@``#>\``8((````
+MY!(```(```WZ``#)M````$@2```"```.!0`!/I@```!($@```@``#A```97,
+M```&6!(```(```X;``!Y+````"02```"```.)@``UP````"($@```@``#C$`
+M`,QD````3!(```(```X\``"NY````102```"```.1P``QK0```"8$@```@``
+M#E(``-(@````"!(```(```Y=``"EU````1`2```"```.:```2<0```&D$0``
+M"```#G,``'*<````"!(```(```Y^``#&K`````@2```"```.B0``:9````"`
+M$@```@``#I0``&S8````Z!(```(```Z?``$^'````'P2```"```.J@``$:@`
+M``"T$@```@``#K4``=5$````)!(```(```[```%3_`````@2```"```.RP``
+MS3P```!8$@```@``#M8``;7X```!*!(```(```[A``#6+````*`2```"```.
+M[```W/````Q$$@```@``#O<``$@@```!I!$```@```\"``$X/````"@2```"
+M```/#0``<]@```!T$@```@``#Q@```CX````<!(```(```\C``!R;````#`2
+M```"```/+@`!TMP```)H$@```@``#SD``<78````J!(```(```]$``"#S```
+M`"@2```"```/3P``SMP```!$$@```@``#UH``6F@````)!(```(```]E``"#
+M]````)02```"```/<```:(````"($@```@``#WL``'RX````1!(```(```^&
+M``"WW````$`2```"```/D0``#X0```&<$@```@``#YP``2)D````"!(```(`
+M``^G``"K1````(`2```"```/L@``V%@```!,$@```@``#[T``'[H````"!(`
+M``(```_(``$7=````*02```"```/TP`!:S````!<$@```@``#]X``@)8````
+MZ!(```(```_I``!^D````$@2```"```/]```6[0````\$@```@``#_\``%(4
+M```'/!(```(``!`5``%L]````'02```"```0(```A7@```"X$@```@``$"L`
+M`7#````12!(```(``!`V``$_O````D@2```"```000`!'EP```"`$@```@``
+M$$P``-BD````2!(```(``!!7``"KQ````.02```"```08@``2(P```"8$@``
+M`@``$&T``+``````(!(```(``!!X``"31````)`2```"```0@P``V`0```!4
+M$@```@``$(X``.DT````)!(```(``!"9``!I"````(@2```"```0I```L;``
+M```($@```@``$*\``'L8````G!(```(``!"Z``$.N````$02```"```0Q0`!
+M9WP```"@$@```@``$-```5*,````L!(```(``!#;``#,L````(P2```"```0
+MY@``LH0```58$@```@``$/$``)^\```#L!(```(``!#\``%3E````"@2```"
+M```1!P`!'=@````H$@```@``$1(``B+@````\!(```(``!$=``%1J````(P2
+M```"```1*``!/+````"8$@```@``$3,``8>T```##!(```(``!$^``',/```
+M`#`2```"```120``````````$@``````$5L``+N@````B!(```(``!%F``$Y
+M2````*P2```"```1<0``````````$@``````$8(``'-@````"!(```(``!&-
+M``#2H`````@2```"```1F```K7P```!8$@```@``$:,``5`8````)!(```(`
+M`!&N``&O=````6`2```"```1N0``Z<0```(\$@```@``$<0``$P4````C!(`
+M``(``!'=``',;````(`2```"`'IZ,#`U8C4X-#8`>GHP,#)D8C$Q8P!Z>C`R
+M9&)F.#<U`'IZ,#)D8F(Q8C(`>GHP,F1B,C`U,P!Z>C`P,F1B830R`'IZ,&9B
+M8C%E,V8`>GHP8C<Y96$Y-`!Z>C`U8CAC-C5A`'IZ,#`U8C0P860`>GHP-6(Y
+M-#)E9`!Z>C!D.&1C-C)C`'IZ,#`Q.68T-S``>GHP,F1D.30R9`!Z>C`R9&)E
+M-S-D`'IZ,#`U8C8Y,F(`>GHP8C9D,C,R-0!Z>C`P-6(X-3-D`'IZ,#`Q-F0Y
+M,F4`>GHP8V9B,3@W-0!Z>C`P,F1B,S%C`'IZ,#)D86)B86,`>GHP,F1B8S@U
+M,0!Z>C`P,&(V8S8X`'IZ,#`P8C9B9C@`>GHP,&(V8V8U90!Z>C`Q-F4Q9&9D
+M`'IZ,&(V9C4P8C@`>GHP-F4P831F90!Z>C`P-C=D,F(Q`'IZ,#`R9&)C-C$`
+M>GHP8C9C83,R-0!Z>C`P-6(V8V9D`'IZ,#$V93!D9F0`>GHP,#!B-F8V.`!A
+M=&A?:&%L7W!R;V-E<W-?;F]I<V5F;&]O<@!Z>C`P-6(T.&%D`'IZ,#)D8F8Q
+M8C(`>GHP,#5B.#AC8@!Z>C`S,V5C.&)F`'IZ,&1B-#(U8S4`871H7VAA;%]D
+M;6%?8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP,&(V9C$V,0!Z>C`V93`P8CAA
+M`'IZ,#)D8F9C,60`>GHP9&,T93,Y,`!Z>C!D869E9#@V`'IZ,#!B-F4R-V$`
+M>GHP,F1B8F%B,@!Z>C!B-F0Q969F`'IZ,#$V9#DP9&0`>GHP,F1B93@U,0!Z
+M>C`P-6(V-&9D`'IZ,#`P8C9D-3(`>GHP8C9C.65F9@!Z>C`Q-F4P,&1D`'IZ
+M,#)D8F0X-S4`>GHP,F1B,S%B,@!Z>C`P8C<P.3(S`'IZ,#!B-F0T-3``>GHP
+M,#!B-F0Q9`!Z>C!B-F,R,S(U`'IZ,#)D8F1A8C(`>GHP,#`U8C8S,@!Z>C`V
+M9&5D9#DS`'IZ,#`Q-F1A-3``>GHP,#`V-V0S,@!Z>C`P8C9D.3(S`'IZ,#`R
+M9&(U,6,`>GHP,39D8V)F90!Z>C`P8C<P,30U`'IZ,#`Q-F1F,F,`>GHP8C=F
+M860S90!Z>C`Q-F0Y.3(P`'IZ,#)D8C%B86,`>GHP9&,V93,Y,`!Z>C`U8C<P
+M,64P`'IZ,#`P8C9B,3``>GHP8C<P.65F9@!Z>C`Q-F1F.#EB`&%T:%]H86Q?
+M871T86-H`'IZ,#9E,&9C,&0`>GHP,39D86(R9`!Z>C`R9&(Q,S5D`'IZ,&4P
+M-#8X-&(`>GHP,39E,CDQ9`!Z>C`P,&(V9F4X`'IZ,#!C9F(S93``>GHP,#$V
+M9#DT.`!Z>C`Q-F4R,#EB`'IZ,&(W,#%E9F8`>GHP,#!B-F,Y9`!Z>C`P,#5B
+M-6$R`'IZ,#)D8C$W,&$`871H7VAA;%]C;VUP=71E='AT:6UE`'IZ,#)D8C5B
+M86,`>GHP,#5B.#$S9`!Z>C`P8C9C.3(S`'IZ,&(V8C4P8C@`>GHP,#5B-V8Y
+M9`!Z>C!B-S`Q9#`R`'IZ,#9D9F8T-&$`>GHP,F1B-3<V,P!Z>C`V965A9C8P
+M`'IZ,&4P,#=C83$`>GHP,#)D868V,@!Z>C!B.#-A9#-E`'IZ,#`P8C9B.3``
+M>GHP,39D.65F80!Z>C`Q-F1E,#4Q`'IZ,#`P-6(V8C(`>GHP-6(W9C$Q-`!Z
+M>C`T864P,S%F`'IZ,#)D8F1D9F0`>GHP,#4T-V9E9`!Z>C`P8C9B9C5E`'IZ
+M,#!B-S$W-V0`>GHP,&(W,&8S9`!Z>C`Q-F0X.3(P`'IZ,#)D8C%A8C(`>GHP
+M,#`U8C8R,@!Z>C`P,&(V9C<X`'IZ,&(V.6(P-V,`871H7VAA;%]F<F5E`'IZ
+M,#5B-SEB,6(`>GHP,&(W,#<S9`!Z>C`R9&)E8F)D`'IZ,&(U93,Q-3(`>GHP
+M,39D9F)F,0!A=&A?:&%L7VUH>C)I965E`'IZ,#$V93$X.6(`>GHP9&,R835C
+M-0!Z>C`P,F1C-C!B`'IZ,#9D9C!B.&$`>GHP,F1B,S,U9`!Z>C!B-F,U,V$T
+M`'IZ,&8U-&0Q8C``>GHP8C9F9#,V,P!Z>C!D.61C-C)C`'IZ,#5B-S0Q93``
+M>GHP,F1A.6)A8P!Z>C!D8S(Q9#-A`'IZ,#!B-S$W,V0`>GHP,39D.60T,0!Z
+M>C`P-6(X-&9D`'IZ,#`U8CAA8F0`>GHP,&(W,#$R,P!Z>C`P-6(V-3)B`'IZ
+M,#)D8C,X-S4`>GHP,39E,S`Y8@!Z>C`P-6(V,&(R`'IZ,#)D8C$X-S4`>GHP
+M,#)D8C@T,@!Z>C`R9&(Q-S8S`'IZ,&(W9&5A.30`>GHP,&(W,#$V,0!Z>C`Q
+M-F0W9#0Q`'IZ,#`Q-F-D,S(`>GHP-F1E,&(X80!Z>C`V9#ED9#DS`'IZ,&1B
+M,V5D.#8`>GHP,#5B-#AE9`!Z>C`P,F1C.#!B`'IZ,#`R9&)C-#(`>GHP,F1B
+M83@U,0!Z>C`R9&(S,V5D`'IZ,#`U8C@P9F0`>GHP,#5B-V8R90!Z>C`R9&)F
+M9&9D`'IZ,#$V938T.&$`>GHP,#)D869F,@!Z>C`P-6(W-SED`'IZ,#`P8C9E
+M93@`>GHP,39E-#0X80!Z>C`P8C9F-F)C`'IZ,#$V9&$Y,C``>GHP-6(W.#%E
+M,`!Z>C`P,F1C83!B`'IZ,#`U8C0T860`>GHP-F1D9C0T80!Z>C!F86,P8SEB
+M`'IZ,&(V9CEE9F8`>GHP,&(V8S9B8P!A=&A?:&%L7V%D9&ET:6]N86Q?<W=B
+M85]B86-K;V9F`'IZ,#`P,F1B.3(`871H7VAA;%]V97)S:6]N`'IZ,#)D8F%C
+M,F4`>GHP,F1B-SEA90!Z>C`P,39E-3,R`'IZ,&(V8V8P,#D`>GHP,#$V93$R
+M8P!Z>C`P,39D.64T`'IZ,#`P,F1A96$`>GHP,#5B-6-B,@!Z>C`Q-F1A,C4Q
+M`'IZ,#9F-F%F-C``>GHP-F1F9&0Y,P!A=&A?:&%L7VUA;&QO8P!Z>C`P,&(V
+M9&0R`'IZ,#)D9#DR860`>GHP,39D8C(U,0!Z>C!E,3`W8V$Q`'IZ,#!B-F,W
+M-64`>GHP,39D9#`U,0!Z>C`R9&)D,6(R`'IZ,#)D8S$W-C,`>GHP8C8Y,&0V
+M9`!Z>C`Q-F1F,#4Q`'IZ,#`Q-F0Y-3``>GHP,&(W,#9B8P!Z>C`P,39D.#<R
+M`'IZ,#9D968T-&$`>GHP-6(X8S)E9`!Z>C`V9F(Y-#=B`'IZ,&5B8C%E,V8`
+M>GHP8C9F.60P,@!Z>C!D,31D,6(P`'IZ,&(T.#`S,64`>GHP,39D8F)F90!Z
+M>C`Q-F4U-#AA`'IZ,#`Q-F0X-3``>GHP,#!B-F9F.`!A=&A?:&%L7VUE;6-P
+M>0!Z>C`R9&)C8F)D`'IZ,#$V9&$P9&0`>GHP,F1B8F1F9`!Z>C`R9&(R.#4Q
+M`'IZ,#)D8F1C,60`>GHP-F1B,&-F,@!Z>C`Q-F5B.6%D`'IZ,#!B-F-E8F,`
+M>GHP9#DT.#1A,0!A=&A?:&%L7W!R;V)E`'IZ,#$V96$Y860`>GHP9F0T9#%B
+M,`!Z>C`R9&(S-S8S`&%T:%]H86Q?8G5I;&1O<'1S`'IZ,#)D868S-60`>GHP
+M-F1D9&0Y,P!Z>C!D861C-C)C`'IZ,#$V9&8R-3$`>GHP,#!B-F,Q,`!Z>C`Q
+M-F0Y,C4Q`'IZ,#)D8C`X-3$`>GHP8C<R,6%E9`!Z>C`V-V-F8V%E`'IZ,#`P
+M8C9C9C@`>GHP8SDT9#%B,`!Z>C`R9&%F86(R`'IZ,#5B.3)A960`>GHP,#5B
+M.&-C8@!Z>C!B-F0Y969F`'IZ,#)D8C$Q8C(`>GHP,F1B9F9B,0!Z>C`R9&)F
+M-S8S`'IZ,#`U8C8X9F0`>GHP,#5B-#1E9`!Z>C!B-S$Q865D`'IZ,&(U93,Q
+M-C``>GHP9#@T.#1A,0!Z>C`Q-F0X8C)D`'IZ,#$V93`X.6(`>GHP,F1B8C@W
+M-0!Z>C`R9&%E.#4Q`'IZ,&(X,65A.30`>GHP,39D96,Q9@!Z>C`P8C9F96)C
+M`'IZ,&4X.30Y,#<`>GHP,&(V96$W80!Z>C`S,V4X9F)F`'IZ,&-F834X-S4`
+M>GHP,F1B.3EA90!Z>C`R9&(Y86(R`'IZ,#`P8C9B93@`>GHP9&4V.#,W9@!Z
+M>C`Q-F1A8F9E`'IZ,&(W,#ED,#(`>GHP-C=D,C5E,@!Z>C`Q.68S83`Q`'IZ
+M,#<P,SDT-V(`871H7VAA;%]M96UZ97)O`'IZ,#9D9F9C,&0`>GHP8C8W-3!B
+M.`!Z>C`Q-F4R9&9D`'IZ,#`P8C9D,C(`>GHP-F9E868V,`!Z>C!D8S1A-6,U
+M`'IZ,#!B-S!F-V0`871H7VAA;%]S=U]B96%C;VY?<F5S<&]N<V5?=&EM90!Z
+M>C`Y9C8T8C9A`'IZ,#`U8C8U-V$`>GHP-F8S.30W8@!Z>C`V9&$P8V8R`'IZ
+M,&(W8F%D,V4`>GHP,&(V9CDV,0!Z>C!B-CDW,V)C`'IZ,#)D8F0S-60`>GHP
+M,#5B.#AF9`!Z>C`R9&)B8S%D`'IZ,#)D869D9F0`>GHP-F0W9&0Y,P!A=&A?
+M:&%L7V1E;&%Y`'IZ,#)D8C%D9F0`>GHP-C=D,F8T,0!Z>C`R9&%F.#<U`'IZ
+M,&(W961E-F0`>GHP,39D.&0T,0!Z>C`P,F1A93DR`'IZ,&(W861E-F0`>GHP
+M,F1B8C,U9`!Z>C`R9&(S9&9D`'IZ,#)D8C4S960`>GHP,39D8V5A90!Z>C`P
+M,&(V9&$R`'IZ,#`P8C9E,C(`>GHP-6(X,#`T,0!Z>C`P,39D.#0X`'IZ,#$V
+M9#EB,F0`>GHP,#$V93`R8P!Z>C`P8C<P-S=D`'IZ,#`U8C8Y-V$`>GHP,#$V
+M9&%E-`!Z>C`Q-F4Q,#EB`'IZ,#`U8C1A,F0`>GHP,39D93!D9`!Z>C`Q-F1F
+M,&1D`'IZ,&1F,#=C83$`>GHP,F1B9#<V,P!Z>C`P,&(V934R`'IZ,#8W9#!C
+M-#<`>GHP-6(V8S9D8@!Z>C!C,S$U96(U`'IZ,&1B,65D.#8`>GHP-F0T,#9E
+M,`!Z>C`Q-F4P,C4Q`'IZ,#`P,F1B8C(`>GHP,#)D9#@V9`!Z>C`P,39E,31D
+M`'IZ,#)D8C4Y864`>GHP,#8W9#(R,0!Z>C`Q-F0X,&1D`'IZ,#`U8C@Y,V0`
+M>GHP-6(X,6(Q8@!Z>C`R9&(Q,V5D`'IZ,#!B-F0Q,C,`>GHP,#!B-F-E.`!Z
+M>C`U8CAA865D`'IZ,&(V960S-C,`>GHP,F1A9C%B,@!Z>C`P,#5B-64R`'IZ
+M,#,S96)F8F8`>GHP-6(V.#9D8@!Z>C`P,&(V968X`'IZ,&(W,3EA960`>GHP
+M,#5B-3AB,@!Z>C`U8C=D8C%B`'IZ,&(X,F1E-F0`>GHP,#$V9#<S,@!Z>C`R
+M9&%D86(R`'IZ,&8T-64V93,`871H7VAA;%]I;FET7V-H86YN96QS`'IZ,#!B
+M-F0V8F,`>GHP8S$T9#%B,`!Z>C`P,#)D8F0R`'IZ,&1A-#@T83$`>GHP,39E
+M,&(X-P!Z>C`U8CDP,F5D`'IZ,&1C,F4S.3``>GHP838P9#$T-0!Z>C`R9&)A
+M8F)D`'IZ,#`P8C9C,60`>GHP-6(X96%E9`!Z>C`P-6(W8CED`'IZ,#`U8C4T
+M-#8`>GHP-6(V-#9D8@!Z>C`P8C9F.3(S`'IZ,&1D-C@S-V8`>GHP,39E,3(U
+M,0!Z>C!D8S9A-6,U`'IZ,#)D8C,W,&$`>GHP,#`U8C8W,@!Z>C`V9&5F8S!D
+M`'IZ,#)D8F8S-60`>GHP,#!B-F,W.`!Z>C`P,39D.#,R`'IZ,#)D8C4W,&$`
+M>GHP,#5B-F0W80!Z>C`P,F1B,CDR`'IZ,#`U8CDP8V(`871H7VAA;%]R96=?
+M=W)I=&4`>GHP8C9F-3,V,P!Z>C`P-6(U8S0V`&%T:%]H86Q?<F5G7W)E860`
+M>GHP-F0Y,&-F,@!Z>C`V9#AD9#DS`'IZ,#$V9&9B.#<`>GHP,#$V9&$T.`!Z
+M>C!B-C8S,6$X`'IZ,#`R9&(P.3(`871H7VAA;%]G971W:7)E;&5S<VUO9&5S
+M`'IZ,#$V93%B.#<`````"````@4````0```"!@```(P```(%````E````@8`
+M``#(```"!0```-````(&````^````@4```$````"!@```3P```(%```!1```
+M`@8```%,```"!0```50```(&````M````@4```!8```"!0```60```(&```!
+M,````@4```!,```"!0```6P```(&````I````@4```!X```"!0```70```(&
+M```!&````@4```$(```"!0```&@```(%````-````@4```%\```"!@```;P`
+M``$%```!P````08```+,``!V!0```M```'8&```"Y``!A`4```(8``&$!0``
+M`N@``80&```"_```1P4```,```!'!@```[```9`%```#M``!D`8```.X``$U
+M!0```[P``34&```'8```O`4```=D``"\!@``"!P``+P%```((```O`8```D0
+M``$>!0``"10``1X&```)(````@4```DD```"!@``"4````(%```)1````@8`
+M``F```$>!0``"80``1X&```)D````@4```F4```"!@``":0```(%```)J```
+M`@8```H\``!F!0``"D```&8&```+%````@4```L8```"!@``#@```9`%```.
+M!``!D`8```\(```!!0``#PP```$&```1P```_04``!'$``#]!@``$>@``1X%
+M```1[``!'@8``!(0```"!0``$A0```(&```2J````@4``!*L```"!@``$L@`
+M`1X%```2S``!'@8``!10```"!0``%%@```(&```47````@4``!1@```"!@``
+M%Z@```$%```7K````08``!A$``#-!0``&$@``,T&```=&````04``!U````!
+M!@``'E```2`%```>5``!(`8``"%4```!!0``(5@```$&```AA````04``"&(
+M```!!@``(@```(,%```B!```@P8``"-@```!!0``(V0```$&```C;````04`
+M`"-P```!!@``)"P```$%```CG````04``"0P```!!@``+4P``,T%```M4```
+MS08``"UT``$@!0``+7@``2`&```MG````04``"V@```!!@``+<P```$%```M
+MT````08``"W@```!!0``+>0```$&```N+``!(`4``"XP``$@!@``+E@```$%
+M```N7````08``"Z(```!!0``+HP```$&```NG````04``"Z@```!!@``+N@`
+M`2`%```N[``!(`8``"\4```!!0``+Q@```$&```O1````04``"](```!!@``
+M+U@```$%```O7````08``"^```"#!0``+X0``(,&```P"````04``#`,```!
+M!@``,$````$%```P1````08``#$$```!!0``,0@```$&```T5````04``#18
+M```!!@``-+0```$%```TN````08``#F(```!!0``.8P```$&```YD````04`
+M`#F4```!!@``.J0```(%```ZJ````@8``#JX```"!0``.KP```(&```\<```
+M`04``#QT```!!@``2*````$%``!(I````08``$BX```!!0``2+P```$&``!(
+MT````04``$C4```!!@``2.@```$%``!([````08``$D````!!0``200```$&
+M``!)3````04``$E0```!!@``2?0```$%``!)^````08``$H8```#!0``2AP`
+M``,&``!*5````P4``$I8```#!@``2J@```$%``!*K````08``$KX```#!0``
+M2OP```,&``!+W````04``$O@```!!@``3#````$%``!,-````08``$Q(```!
+M!0``3$P```$&``!,:````04``$QL```!!@``3*P```$%``!,L````08``$TL
+M```#!0``33````,&``!->````04``$U\```!!@``39@```$%``!-G````08`
+M`$VT```#!0``3;@```,&``!.'````P4``$X@```#!@``3B0``.8%``!.*```
+MY@8``$Y\```#!0``3H0```,&``!/%````04``$\8```!!@``3WP```$%``!/
+M-````04``$\X```!!@``3U````$%``!/5````08``$^(```#!0``3XP```,&
+M``!/]````P4``$_X```#!@``3_P```,%``!0`````P8``%"8```!!0``4)P`
+M``$&``!2<````04``%)T```!!@``4H@```$%``!2C````08``%*H```!!0``
+M4JP```$&``!2S````04``%*D```!!0``4M````$&``!2W````04``%+@```!
+M!@``4O@```$%``!2_````08``%,8```!!0``4QP```$&``!3C````04``%.0
+M```!!@``4^@```(%``!3[````@8``%/P```"!0``6!P```(%``!3]````@8`
+M`%2T```#!0``5+@```,&``!4U````P4``%38```#!@``5/````,%``!4]```
+M`P8``%4(```#!0``50P```,&``!5)````P4``%4L```#!@``530```,%``!5
+M.````P8``%5(```!!0``54P```$&``!5:````04``%5L```!!@``590```$%
+M``!5F````08``%:```$@!0``5H0``2`&``!8(````@4``%@D```"!@``6$0`
+M``$%``!82````08``%A8```!!0``6&````$&``!:Y```_04``%H\``#]!0``
+M6D```/T&``!:M````04``%JX```!!@``6T@``/T%``!;3```_08``%N\``#]
+M!0``6\```/T&``!=8````04``%UD```!!@``7C@```$%``!>*````04``%X,
+M```!!0``7?P```$%``!=W````04``%VX```!!0``7:````$%``!=?````04`
+M`%X\```!!@``7I0```,%``!>G````P8``%Z@```#!0``7J0```,&``!>J```
+M`P4``%ZL```#!@``7K````$%``!>M````08``%]L```#!0``7W0```,&``!?
+M>````P4``%]\```#!@``7X````,%``!?A````P8``%^(```!!0``7XP```$&
+M``!@)````04``&`H```!!@``8%0```$%``!@6````08``&!L```!!0``8'``
+M``$&``!@X```S04``&#D``#-!@``80```.8%``!A!```Y@8``&$,```"!0``
+M81````(&``!A8``!.P4``&%D``$[!@``880``9`%``!AB``!D`8``&&T``&-
+M!0``8;@``8T&``!AT``!C04``&'4``&-!@``8?@``9`%``!A_``!D`8``&((
+M```O!0``8@P``"\&``!B-``!C04``&(X``&-!@``8DP``2H%``!B4``!*@8`
+M`&)\``$J!0``8H```2H&``!BI``!*@4``&*H``$J!@``8N@``2H%``!B[``!
+M*@8``&,T``$J!0``8S@``2H&``!CV```>P4``&/<``![!@``9G0```$%``!F
+M>````08``&:0``$J!0``9I0``2H&``!G!``!C04``&<(``&-!@``9S```8T%
+M``!G-``!C08``&=,``"#!0``9U```(,&``!GH```@P4``&>D``"#!@``:JP`
+M`8T%``!HG``!C04``&B@``&-!@``:2```#$%``!I)```,08``&DT``$H!0``
+M:3@``2@&``!I=``!8P4``&EX``%C!@``::0``8T%``!IJ``!C08``&FX``&0
+M!0``:;P``9`&``!J/``!D`4``&I```&0!@``:EP``8T%``!J8``!C08``&JP
+M``&0!0``:K0``9`&``!JS``!C04``&K0``&-!@``:N0``8T%``!JZ``!C08`
+M`&K\``&0!0``:P```9`&``!K/``!C04``&M```&-!@``:Y@``8T%``!KG``!
+MC08``&O8``&0!0``:]P``9`&``!L&``!D`4``&P<``&0!@``;3P``8T%``!M
+M"``!C04``&T,``&-!@``;7```8T%``!M=``!C08``&WD``&0!0``;>@``9`&
+M``!N/``!C04``&Y```&-!@``;Y```8T%``!OE``!C08``'%(``&-!0``<4P`
+M`8T&``!QQ```;P4``''(``!O!@``<AP``.8%``!R(```Y@8``')(``#F!0``
+M<DP``.8&``!R=```Y@4``')X``#F!@``<H````(%``!RA````@8``'+```&0
+M!0``<L0``9`&``!RT```2@4``'+4``!*!@``<O0``9`%``!R^``!D`8``'.4
+M``$D!0``<Y@``20&``!SJ```=`4``'.L``!T!@``<_```9`%``!S]``!D`8`
+M`'0<``&-!0``="```8T&``!T9``!D`4``'1H``&0!@``=(0``8T%``!TB``!
+MC08``'34``&0!0``=-@``9`&``!T_``!C04``'4```&-!@``=4P``9`%``!U
+M4``!D`8``'68``&0!0``=9P``9`&``!UX``!C04``'7D``&-!@``=?P``4\%
+M``!V```!3P8``'9```&0!0``=D0``9`&``!VC``!C04``':0``&-!@``=KP`
+M`9`%``!VP``!D`8``'<$``&0!0``=P@``9`&``!W2``!C04``'=,``&-!@``
+M=Z```.8%``!WI```Y@8``'?8``&-!0``=]P``8T&``!X'``!D`4``'@@``&0
+M!@``?@```9`%``!X3``!D`8``'AD``&-!0``>&@``8T&``!XM``!D`4``'BX
+M``&0!@``>30``9`%``!Y.``!D`8``'E@``&0!0``>60``9`&``!Y=``!C04`
+M`'EX``&-!@``>;@``9`%``!YO``!D`8``'G8``&0!0``>>0``9`&``!Z.``!
+MD`4``'H\``&0!@``>H0``9`%``!ZB``!D`8``'M````E!0``>T0``"4&``![
+M6``!6P4``'ML``%;!@``>WP``8T%``![@``!C08``'O$``&0!0``>\@``9`&
+M``![U```)04``'O8```E!@``?!P``"4%``!\(```)08``'PT``&0!0``?$@`
+M`9`&``!\7``!6P4``'Q@``%;!@``?'P``8T%``!\@``!C08``'S(``&0!0``
+M?,P``9`&``!\V```)04``'S<```E!@``?2P``9`%``!],``!D`8``'U$``&-
+M!0``?4@``8T&``!];``!D`4``'UP``&0!@``?80``8T%``!]B``!C08``'WH
+M```E!0``?>P``"4&``!^%``!D`8``'XH``%;!0``?BP``5L&``!^5``!C04`
+M`'Y8``&-!@``?J```9`%``!^I``!D`8``'ZT```E!0``?K@``"4&``!_*``!
+M%@4``'\L``$6!@``?W```8T%``!_=``!C08``'^,```;!0``?Y```!L&``!_
+MO``!-P4``'_```$W!@``@5```9`%``"````!D`4``(`$``&0!@``@!0``8T%
+M``"`&``!C08``("<``&0!0``@*```9`&``"`M``!C04``("X``&-!@``@,P`
+M`34%``"`T``!-08``(#@``&0!0``@.0``9`&``"`[``!-04``(#P``$U!@``
+M@/P``8T%``"!!``!C08``(%<``&0!0``@6```9`&``"!>``!C04``(%\``&-
+M!@``@=P``9`%``"!X``!D`8``('P``&-!0``@?0``8T&``"">````04``(*0
+M```!!@``@J0```$%``""J````08``(*\```!!0``@L````$&``""]``!D`4`
+M`(+X``&0!@``@T@``!$%``"#4```$08``(-4``#Q!0``@U@``/$&``"#7``!
+M*04``(-@``$I!@``@X@``9`%``"#C``!D`8``(.P``&-!0``@[0``8T&``"#
+MU``!C04``(/8``&-!@``A!```8T%``"$%``!C08``(0H``&0!0``A"P``9`&
+M``"$,``!-04``(0T``$U!@``A)@``9`%``"$G``!D`8``(2L``&-!0``A+``
+M`8T&``"$Y``!D`4``(3H``&0!@``A/0``8T%``"$^``!C08``(4\``&-!0``
+MA4```8T&``"%I``!D`4``(6H``&0!@``A<0``8T%``"%R``!C08``(7D``&0
+M!@``A@```8T%``"&!``!C08``(9<``&0!0``AF```9`&``"&>``!C04``(9\
+M``&-!@``AI@``9`&``"&L``!C04``(:T``&-!@``AN@``9`%``"&[``!D`8`
+M`(<D``&-!0``AR@``8T&``"']``!D`4``(?X``&0!@``B#0``9`%``"(.``!
+MD`8``(H```#]!0``B@0``/T&``"7I``!D`4``(M(``&0!0``BQ```9`%``"*
+M.``!D`4``(I```&0!@``BDP``9`%``"*4``!D`8``(ID``$[!0``BF@``3L&
+M``"*]``!C04``(JD``&-!0``BJ@``8T&``"*V````04``(K<```!!@``EX@`
+M`9`%``"+&``!D`8``(L<``&-!0``BR```8T&``"0"``!C04``(M,``&-!@``
+MBOP``8T%``"+8``!C08``(MT``&0!0``BXP``9`&``"+D``!C04``(N4``&-
+M!@``B[@``9`%``"+O``!D`8``(O,``&-!0``B]```8T&``"-0```M@4``(U$
+M``"V!@``CB@```(%``".+````@8``(XP```"!0``CC0```(&``"..``!C04`
+M`(X\``&-!@``CH@``84%``".C``!A08``(ZD``&0!0``CJ@``9`&``".S``!
+MC04``([0``&-!@``C^0```$%``"/Z````08``)`T``&-!0``D#@``8T&``"0
+M3``!-04``)!0``$U!@``D%P``9`%``"08``!D`8``)"```!*!0``D(0``$H&
+M``"0G```E`4``)"@``"4!@``D,P``%<%``"0T```5P8``)#X``!^!0``D/P`
+M`'X&``"1"``!D`4``)$,``&0!@``D20``8T%``"1*``!C08``)%(``%_!0``
+MD4P``7\&``"19```"P4``)%H```+!@``D8```1@%``"1A``!&`8``)&<``&-
+M!0``D:```8T&``"2(``!D`4``)(D``&0!@``DIP``8T%``"2H``!C08``)+(
+M``&-!0``DLP``8T&``"3`````04``),$```!!@``DR0```$%``"3*````08`
+M`)-8``#X!0``DUP``/@&``"3=````04``)-X```!!@``DXP``34%``"3D``!
+M-08``).<```!!0``DZ````$&``"3[```^`4``)/P``#X!@``E"```8T%``"4
+M)``!C08``)0T```!!0``E#@```$&``"45``!-04``)18``$U!@``E&0```$%
+M``"4:````08``)2$``$U!0``E(@``34&``"4E```^`4``)28``#X!@``E+0`
+M``$%``"4N````08``)40``#]!0``E10``/T&``"5*``!D`4``)4L``&0!@``
+ME3P``8T%``"50``!C08``)5\``$U!0``E8```34&``"5M````04``)6X```!
+M!@``E=```34%``"5U``!-08``)7@``&0!0``E>0``9`&``"5_``!C04``)8`
+M``&-!@``ER0``$H%``"7*```2@8``)=P``"4!0``EW0``)0&``"7N``!D`4`
+M`)>\``&0!@``E]```8T%``"7U``!C08``)AH``&-!0``F&P``8T&``"8@``!
+M-04``)B$``$U!@``F*```$H%``"8I```2@8``)U8```!!0``G5P```$&``"=
+MS````@4``)W0```"!@``G@0```$%``">"````08``)X@```!!0``GB0```$&
+M``">7````04``)Y@```!!@``GG@```$%``">?````08``)ZT```!!0``GK@`
+M``$&``">T````04``)[4```!!@``GPP```$%``"?$````08``)\H```!!0``
+MGRP```$&``"?X```Y@4``)_D``#F!@``G^P```(%``"?\````@8``*`````"
+M!0``H`0```(&``"@$````04``*`4```!!@``H%P``"\%``"@8```+P8``*"4
+M```O!0``H)@``"\&``"BB```+P4``**,```O!@``HO@``8T%``"B_``!C08`
+M`*,P``&-!0``HS0``8T&``"CJ```+P4``*.L```O!@``H\```8T%``"CQ``!
+MC08``*00``&0!0``I!0``9`&``"D;``!D`4``*1P``&0!@``I'P``8T%``"D
+M@``!C08``*24``!*!0``I)@``$H&``"DN``!-04``*2\``$U!@``I,```%(%
+M``"DQ```4@8``*5L``%F!0``I7```68&``"EM``!%04``*6X``$5!@``IF0`
+M`2`%``"F:``!(`8``*:H``"]!0``IJP``+T&``"GW``!C04``*?@``&-!@``
+MJ%@``9`%``"H7``!D`8``*YL``&-!0``J*```8T&``"I(``!D`4``*DD``&0
+M!@``J9P``8T%``"IH``!C08``*L<``&0!0``JR```9`&``"KA``!C04``*N(
+M``&-!@``JYP``8T%``"KH``!C08``*O<``"A!0``J^```*$&``"K^``!3P4`
+M`*O\``%/!@``K`P``9`%``"L$``!D`8``*Q(``%/!0``K$P``4\&``"L9``!
+MC04``*QH``&-!@``K'@``4\%``"L?``!3P8``*X,``&-!0``K0```8T&``"M
+M'``!C04``*T@``&-!@``K4P``8T%``"M4``!C08``*VH``&0!0``K:P``9`&
+M``"LV``!C04``*XL``&-!@``KD0``9`%``"N2``!D`8``*Y,``$U!0``KE0`
+M`34&``"NA``!C04``*Z(``&-!@``KJ0``$H%``"NJ```2@8``+'X``&-!0``
+ML?P``8T&``"R$``!C04``+(4``&-!@``LV0``9`%``"R.``!D`4``+(\``&0
+M!@``LE@``"\%``"R7```+P8``++```#-!0``LL0``,T&``"RX```Y@4``++D
+M``#F!@``LNP```(%``"R\````@8``+,\``&6!0``LT```98&``"S:``!C04`
+M`+-L``&-!@``M#```34%``"SD``!-04``+.4``$U!@``LZ```9`%``"SI``!
+MD`8``+/8``&0!0``L]P``9`&``"S\````04``+/T```!!@``M!0``8T%``"T
+M&``!C08``+0T``&-!@``M$@``34%``"T3``!-08``+18```!!0``M%P```$&
+M``"T?``!2`4``+2```%(!@``M+0``9`%``"TN``!D`8``+3<``%(!0``M.``
+M`4@&``"U#``!2`4``+40``%(!@``M9@```(%``"UG````@8``+7\``%X!0``
+MM@```7@&``"V,``!C04``+8T``&-!@``MD@``34%``"V3``!-08``+98```!
+M!0``MEP```$&``"VI``!2`4``+:H``%(!@``MM```-(%``"VU```T@8``+;<
+M```!!0``MN````$&``"V[``!@`4``+;P``&`!@``MP@``4@%``"W#``!2`8`
+M`+>4``%E!0``MY@``64&``"W[``!'04``+?P``$=!@``M_P``(,%``"X````
+M@P8``+BP``&0!0``N+0``9`&``"XW``!C04``+C@``&-!@``N/```9`%``"X
+M]``!D`8``+DD``&-!0``N2@``8T&``"Y+``!D`4``+DP``&0!@``N9```8T%
+M``"YE``!C08``+FP``$U!0``N;0``34&``"ZC```W04``+J0``#=!@``NT0`
+M`4@%``"[2``!2`8``+WD``&-!0``N[P``8T%``"[P``!C08``+QX```Q!0``
+MO$@``#$%``"\?```,08``+R,``$H!0``O)```2@&``"\N``!C@4``+R\``&.
+M!@``O.@``8T%``"\[``!C08``+S\``&0!0``O0```9`&``"]@``!D`4``+V$
+M``&0!@``O90``8T%``"]F``!C08``+WH``&0!0``O>P``9`&``"^!``!C04`
+M`+X(``&-!@``OAP``8T%``"^(``!C08``+XT``&0!0``OC@``9`&``"^=``!
+MC04``+YX``&-!@``OK@``9`%``"^O``!D`8``+\8``&0!0``OQP``9`&``"_
+M4``!D`4``+]4``&0!@``P`0``9`%``#`#``!D`8``,"P``&-!0``P+0``8T&
+M``#`Q``!D`4``,#(``&0!@``P4```8T%``#!1``!C08``,&T``&0!0``P;@`
+M`9`&``#"#``!C04``,(0``&-!@``PV```8T%``##9``!C08``,54``&-!0``
+MQ5@``8T&``#%T```RP4``,74``#+!@``QBP``.8%``#&,```Y@8``,98``#F
+M!0``QEP``.8&``#&A```Y@4``,:(``#F!@``QI````(%``#&E````@8``,;4
+M``&-!0``QM@``8T&``#&^```2@4``,;\``!*!@``QQP``9`%``#'(``!D`8`
+M`,?H``#B!0``Q^P``.(&``#'^``!D`4``,?\``&0!@``R`P``8T%``#($``!
+MC08``,@D``%!!0``R"@``4$&``#(/```-P4``,A````W!@``R(0``9`%``#(
+MB``!D`8``,B@``&-!0``R*0``8T&``#(Z``!D`4``,CL``&0!@``R0@``8T%
+M``#)#``!C08``,E8``&0!0``R5P``9`&``#)@``!C04``,F$``&-!@``R=``
+M`9`%``#)U``!D`8``,H4``&0!0``RA@``9`&``#*0``!C04``,I$``&-!@``
+MREP``08%``#*8``!!@8``,J<``&0!0``RJ```9`&``#*N````@4``,J\```"
+M!@``RM```8T%``#*U``!C08``,L8``#F!0``RQP``.8&``#+4``!C04``,M4
+M``&-!@``R\@``9`%``#+S``!D`8``,Q(``&0!0``S$P``9`&``#,=``!D`4`
+M`,QX``&0!@``S(@``8T%``#,C``!C08``,S,``&0!0``S-```9`&``#,[``!
+MD`4``,SX``&0!@``S4P``9`%``#-4``!D`8``,VP``&0!0``S;0``9`&``#.
+M;```)04``,YP```E!@``SH0``5L%``#.E``!6P8``,ZD``&-!0``SJ@``8T&
+M``#.[``!D`4``,[P``&0!@``SOP``"4%``#/````)08``,]$```E!0``ST@`
+M`"4&``#1*``!D`4``,]P``&0!@``SX0``5L%``#/B``!6P8``,^D``&-!0``
+MSZ@``8T&``#/\``!D`4``,_T``&0!@``T````"4%``#0!```)08``-!4``&0
+M!0``T%@``9`&``#0;``!C04``-!P``&-!@``T)0``9`%``#0F``!D`8``-"L
+M``&-!0``T+```8T&``#1$```)04``-$4```E!@``SUP``9`%``#1/``!D`8`
+M`-%0``%;!0``T50``5L&``#1?``!C04``-&```&-!@``T<@``9`%``#1S``!
+MD`8``-'<```E!0``T>```"4&``#2,``!D`4``-(T``&0!@``TE@``9`%``#2
+M7``!D`8``-*$``&-!0``TH@``8T&``#2N```W@4``-+(``#>!@``TQ```18%
+M``#3%``!%@8``--(``&-!0``TTP``8T&``#3:```&P4``--L```;!@``TY@`
+M`3<%``#3G``!-P8``-2@``&0!0``T^P``9`%``#3\``!D`8``-0$``&-!0``
+MU`@``8T&``#4'``!-04``-0@``$U!@``U#```9`%``#4-``!D`8``-0\``$U
+M!0``U$```34&``#43``!C04``-14``&-!@``U*P``9`%``#4L``!D`8``-3(
+M``&-!0``U,P``8T&``#5+``!D`4``-4P``&0!@``U4```8T%``#51``!C08`
+M`-6\``&0!0``U<```9`&``#5T``!C04``-74``&-!@``UE@```$%``#6<```
+M`08``-:$```!!0``UH@```$&``#6G````04``-:@```!!@``UM0``9`%``#6
+MV``!D`8``-=$``"Z!0``UTP``+H&``#74``!"`4``-=8``$(!@``UUP``.T%
+M``#78```[08``-=D``$I!0``UV@``2D&``#7F``!D`4``-><``&0!@``U\``
+M`8T%``#7Q``!C08``-?D``&-!0``U^@``8T&``#8%``!C04``-@8``&-!@``
+MV"@``$H%``#8+```2@8``-AH``&0!0``V&P``9`&``#8?``!C04``-B```&-
+M!@``V+0``9`%``#8N``!D`8``-C$``&-!0``V,@``8T&``#9#``!C04``-D0
+M``&-!@``V70``9`%``#9>``!D`8``-F4``&-!0``V9@``8T&``#9M``!D`8`
+M`-G0``&-!0``V=0``8T&``#:+``!D`4``-HP``&0!@``VD@``8T%``#:3``!
+MC08``-IH``&0!@``VH```8T%``#:A``!C08``-JX``&0!0``VKP``9`&``#:
+MX``!C04``-KD``&-!@``VZ@``9`%``#;K``!D`8``-W```#]!0``W:@``/T%
+M``#=Q```_08``/QH``&0!0``_$P``9`%``#>(``!D`4``-XD``&0!@``WFP`
+M`9`%``#><``!D`8``-[(``&0!0``WLP``9`&``#>Z``!D`4``-[L``&0!@``
+MWT0``98%``#?2``!E@8``-_H``&-!0``W^P``8T&``#EE``!C04``.`(``&-
+M!@``[[P``"\%``#@:```+P4``.!L```O!@``X(P```,%``#@2````P4``."0
+M```#!@``X/````,%``#@]````P8``.#X``&-!0``X/P``8T&``#A/````04`
+M`.`H```!!0``X4````$&``#A5````@4``.%8```"!@``X5P``8T%``#A8``!
+MC08``.&H```"!0``X:P```(&``#AL``!C04``.&T``&-!@``X?@```(%``#A
+M_````@8``.(```&-!0``X@0``8T&``#B8``!D`4``.)D``&0!@``XH0``8T%
+M``#BB``!C08``.+@``&-!0``XN0``8T&``#C-``!C04``.,X``&-!@``XX@`
+M`8T%``#CC``!C08``./$```!!0``X\@```$&``#CV``!D`4``./<``&0!@``
+MY-P``2$%``#DO``!(04``.2L``$A!0``Y.```2$&``#E%``!D`4``.48``&0
+M!@``Y4```8T%``#E1``!C08``.58```!!0``Y00```$%``#E7````08``.5L
+M```!!0``Y7````$&``#EI``!C04``.6H``&-!@``Y;P``8T%``#EP``!C08`
+M`.74``&0!0``Y=@``9`&``#F-``!-04``.8X``$U!@``YD0``9`%``#F2``!
+MD`8``.98``&-!0``YEP``8T&``#F<```2@4``.9T``!*!@``YHP``!T%``#F
+MD```'08``.;,``&-!0``YM```8T&``#F^``!C04``.;\``&-!@``YR@``0T%
+M``#G+``!#08``.=,``&-!0``YU```8T&``#GA``!D`4``.>(``&0!@``Z"@`
+M`%$%``#H+```408``.@X``&0!0``Z#P``9`&``#H5``!C04``.A8``&-!@``
+MZ'@``)H%``#H?```F@8``.B4``#4!0``Z)@``-0&``#HL```.`4``.BT```X
+M!@``Z,P``8T%``#HT``!C08``.JH```!!0``ZE````$%``#J0````04``.H<
+M```!!0``Z3P```$%``#I0````08``.EH``%6!0``Z6P``58&``#IA````04`
+M`.F(```!!@``Z:```34%``#II``!-08``.G<``%6!0``Z>```58&``#K5```
+M`04``.HD```!!@``ZP@```$%``#J2````08``.K0```!!0``ZE@```$&``#J
+M7``!C04``.I@``&-!@``ZI0``34%``#JF``!-08``.JL``&-!0``ZK```8T&
+M``#JY``!-04``.KH``$U!@``ZQ0``8T%``#K&``!C08``.LT``&-!@``ZU@`
+M`8T%``#K7``!C08``.MP``$U!0``ZW0``34&``#KD````04``.N4```!!@``
+MZZP``34%``#KL``!-08``.N\``%6!0``Z\```58&``#KW````04``.O@```!
+M!@``[#@``/T%``#L/```_08``.Q<``&0!0``[&```9`&``#M'``!C04``.T@
+M``&-!@``[30```$%``#L?````04``.TX```!!@``[4P``!T%``#M;```'08`
+M`.V$``$U!0``[8@``34&``#MI````04``.V````!!0``[<@```$&``#N1``!
+MD`4``.Y(``&0!@``[E@``8T%``#N7``!C08``.YP``$U!0``[G0``34&``#N
+MD```2@4``.Z4``!*!@``[T```(D%``#O1```B08``.]T```"!0``[W@```(&
+M``#O@```+P4``.^$```O!@``[\@``"\%``#OS```+P8``._T```O!0``[_@`
+M`"\&``#P+``!C04``/`P``&-!@``\)```9`%``#PE``!D`8``/#T``&0!0``
+M\/@``9`&``#Q'``!C04``/$@``&-!@``\6@``9`%``#Q;``!D`8``/%P``$U
+M!0``\7@``34&``#QL````04``/&\```!!@``\G````$%``#R=````08``/*(
+M``&0!0``\HP``9`&``#RG````04``/*@```!!@``\R```6\%``#S)``!;P8`
+M`/,T```!!0``\S@```$&``#S5````@4``/-8```"!@``\UP```$%``#S8```
+M`08``/.H``&0!0``\ZP``9`&``#SO``!C04``//```&-!@``\_@```(%``#T
+M`````@8``/00```"!0``]!0```(&``#T.````@4``/0\```"!@``]70```,%
+M``#U>````P8``/8H```O!0``]BP``"\&``#V/````P4``/9````#!@``]U0`
+M`8T%``#W6``!C08``/CT``&-!0``^/@``8T&``#YJ``!D`4``/FL``&0!@``
+M^=```8T%``#YU``!C08``/H(``&0!0``^@P``9`&``#Z'``!C04``/H@``&-
+M!@``^C@``9`%``#Z/``!D`8``/IL``&-!0``^G```8T&``#ZA```W@4``/J(
+M``#>!@``^K@``9`%``#ZO``!D`8``/KL``&-!0``^O```8T&``#\H``!D`4`
+M`/RD``&0!@``_,0``8T%``#\R``!C08``/TP``&-!0``_30``8T&``#^&```
+M`04``/X<```!!@``_C```!0%``#^-```%`8``/ZP```!!0``_K0```$&``#_
+M+``!(`4``/\P``$@!@``_S0```0%``#_.```!`8``/]$```$!0``_T@```0&
+M``#_5```!`4``/]8```$!@``_Y````0%``#_E```!`8``/^X```!!0``_[P`
+M``$&``#_P```!`4``/_$```$!@`!``0```0%``$`"```!`8``0`@```$!0`!
+M`"0```0&``$`D```!`4``0"4```$!@`!`*````0%``$`I```!`8``0$T```$
+M!0`!`3@```0&``$!>```!`4``0%\```$!@`!`9@```0%``$!G```!`8``0&@
+M```!!0`!`:0```$&``$!J```!`4``0&L```$!@`!`@````0%``$"!```!`8`
+M`0+@```$!0`!`N0```0&``$#&```!`4``0,<```$!@`!`R```8T%``$#)``!
+MC08``00T``$3!0`!!#@``1,&``$$O````04``03````!!@`!!:@```$%``$%
+MK````08``09@```"!0`!!F0```(&``$'0````04``0=$```!!@`!!ZP```0%
+M``$'L```!`8``0?8```"!0`!!]P```(&``$'^```!`4``0?\```$!@`!""0`
+M``0%``$(*```!`8``0A8```$!0`!"%P```0&``$(R``!C04``0C,``&-!@`!
+M".````0%``$(Y```!`8``0D\``!L!0`!"4```&P&``$)2```!`4``0E,```$
+M!@`!"5@```0%``$)7```!`8``0G0```!!0`!"=0```$&``$)_````04``0H`
+M```!!@`!"B````$%``$*)````08``0I8```!!0`!"EP```$&``$*I````04`
+M`0JH```!!@`!#IP```$%``$.H````08``0ZX```"!0`!#KP```(&``$/F``!
+MC04``0^<``&-!@`!$````9`%``$0!``!D`8``1`P```!!0`!$#0```$&``$0
+M3````04``1!0```!!@`!$&0```$%``$0:````08``1"````!!0`!$(0```$&
+M``$1"````@4``1$,```"!@`!$5@```(%``$17````@8``1%@```"!0`!$60`
+M``(&``$1U````@4``1'8```"!@`!$@@```(%``$2#````@8``1(D```"!0`!
+M$BP```(&``$2,````@4``1(T```"!@`!$C@```(&``$3"``!D`4``1,,``&0
+M!@`!$W0``8T%``$3>``!C08``1.@``&-!0`!$Z0``8T&``$3V````04``1/<
+M```!!@`!%!@``/,%``$4'```\P8``10T``$&!0`!%#@``08&``$42``!D`4`
+M`11,``&0!@`!%(P``08%``$4D``!!@8``1]$``&-!0`!%+@``8T%``$4O``!
+MC08``130``$&!0`!%-0``08&``$5+``!9@4``14P``%F!@`!%70``14%``$5
+M>``!%08``18X``$@!0`!%CP``2`&``$6A```8@4``1:(``!B!@`!%O```8T%
+M``$6]``!C08``1<H``&0!0`!%RP``9`&``$7^````04``1?\```!!@`!&0``
+M`8T%``$9!``!C08``1F8``&-!0`!&9P``8T&``$9M``!D`4``1FX``&0!@`!
+M&@0``8T%``$:"``!C08``1HX``&-!0`!&CP``8T&``$:8``!D`4``1ID``&0
+M!@`!&IP``9`%``$:H``!D`8``1JT``&-!0`!&K@``8T&``$:Y``!D`4``1KH
+M``&0!@`!&O@``8T%``$:_``!C08``1LX``&0!0`!&SP``9`&``$;3``!C04`
+M`1M0``&-!@`!&WP``8T%``$;@``!C08``1N@``&0!0`!&Z0``9`&``$;M``!
+MC04``1NX``&-!@`!&\P``2@%``$;U``!*`8``1O0```Q!0`!&]@``#$&``$;
+MZ```OP4``1OL``"_!@`!'"0``8T%``$<*``!C08``1Q0``&0!0`!'%0``9`&
+M``$<:``!C04``1QL``&-!@`!'9@```$%``$=G````08``1WD``&0!0`!'>@`
+M`9`&``$>#``!C04``1X0``&-!@`!'CP``8T%``$>0``!C08``1Z```&0!0`!
+M'H0``9`&``$?!``!C04``1\(``&-!@`!'QP``74%``$?(``!=08``1\D``$U
+M!0`!'RP``34&``$?6``!C04``1]<``&-!@`!*'```8T%``$BQ``!C04``2+(
+M``&-!@`!([@``8T%``$CO``!C08``2/0``&-!0`!(]0``8T&``$C^``!D`4`
+M`2/\``&0!@`!)!@``"\%``$D'```+P8``24P``"R!0`!)30``+(&``$EG```
+MY@4``26@``#F!@`!):0```(%``$EJ````@8``28@```"!0`!)B0```(&``$F
+M9````@4``29H```"!@`!)FP```(%``$F<````@8``29T```"!0`!)G@```(&
+M``$G$```S04``2<4``#-!@`!)SP``"8%``$G0```)@8``2=<``&!!0`!)V``
+M`8$&``$GZ``!D`4``2>(``&0!@`!)ZP```$%``$GL````08``2?$``&+!0`!
+M)]0``8L&``$G>``!D`4``2?X``&0!@`!*#0```$%``$H.````08``2A$```:
+M!0`!*#```!H%``$H(```&@4``2A(```:!@`!*'0``9`%``$H>``!D`8``2B(
+M``&-!0`!*(P``8T&``$HH``!C04``2BD``&-!@`!*+@``$,%``$HO```0P8`
+M`2TP``&*!0`!*LP``8H%``$J*``!B@4``2H8``&*!0`!*@@``8H%``$I\``!
+MB@4``2HL``&*!@`!*G```9`%``$J=``!D`8``2K<``&*!0`!*N```8H&``$K
+M#``!B@4``2L0``&*!@`!*T@``8H%``$K3``!B@8``2N0``&*!0`!*Y0``8H&
+M``$L)````@4``2PH```"!@`!+#````(%``$L-````@8``2R8``%X!0`!+)P`
+M`7@&``$M-``!C04``2TX``&-!@`!+4P``34%``$M4``!-08``2U<``!#!0`!
+M+6```$,&``$MI``!B@4``2VH``&*!@`!+=@``2\%``$MW``!+P8``2XH``#$
+M!0`!+@P``,0%``$N+```Q`8``2Y<``"E!0`!+F```*4&``$ND``!B`4``2Z4
+M``&(!@`!+HP``6T%``$NK``!;08``2[,``$:!0`!+M```1H&``$NZ``!B@4`
+M`2[L``&*!@`!+U0```$%``$O9````08``2^$``"`!0`!+X@``(`&``$OV```
+M<04``2_<``!Q!@`!+_P``$0%``$O\```1`4``3````!$!@`!,`P``8$%``$P
+M$``!@08``3`D``$=!0`!,"@``1T&``$P.```@P4``3`\``"#!@`!,.P``9`%
+M``$P\``!D`8``3$8``&-!0`!,1P``8T&``$Q+``!D`4``3$P``&0!@`!,6``
+M`8T%``$Q9``!C08``3%H``&0!0`!,6P``9`&``$QS``!C04``3'0``&-!@`!
+M,>P``34%``$Q\``!-08``3@<``"K!0`!."```*L&``$X2``!C`4``3A,``&,
+M!@`!.$0```$%``$X6````08``3L,``&-!0`!.(P``8T%``$XD``!C08``3C@
+M``"K!0`!..0``*L&``$Y&``!C04``3D<``&-!@`!.9@``#$%``$Y:```,04`
+M`3F<```Q!@`!.:P``2@%``$YL``!*`8``3G8``"1!0`!.=P``)$&``$Z"``!
+MC04``3H,``&-!@`!.AP``9`%``$Z(``!D`8``3JH``&0!0`!.JP``9`&``$Z
+MO``!C04``3K```&-!@`!.Q```9`%``$[%``!D`8``3LL``&-!0`!.S```8T&
+M``$[1``!C04``3M(``&-!@`!.UP``9`%``$[8``!D`8``3N<``&-!0`!.Z``
+M`8T&``$\,``!C04``3PT``&-!@`!/-```8T%``$\U``!C08``3ST``!*!0`!
+M//@``$H&``$]&``!D`4``3T<``&0!@`!/6@``9`%``$];``!D`8``3V$``&-
+M!0`!/8@``8T&``$]S``!D`4``3W0``&0!@`!/>P``8T%``$]\``!C08``3X\
+M``&0!0`!/D```9`&``$^9``!C04``3YH``&-!@`!/K0``9`%``$^N``!D`8`
+M`3\```&0!0`!/P0``9`&``$_1``!C04``3](``&-!@`!/V```-4%``$_9```
+MU08``3^8``&0!0`!/YP``9`&``$_\``!D`4``3_T``&0!@`!0&0``9`%``%`
+M:``!D`8``4#8``&0!0`!0.@``9`&``%!?``!D`4``4&$``&0!@`!0D```8T%
+M``%"1``!C08``4)4``&0!0`!0E@``9`&``%#,``!C04``4,T``&-!@`!0T0`
+M`9`%``%#2``!D`8``4/L``&0!0`!0_```9`&``%$:``!D`4``41L``&0!@`!
+M1'P``8T%``%$@``!C08``494``&-!0`!1E@``8T&``%')````@4``4<H```"
+M!@`!2.```8T%``%(Y``!C08``4E@``$E!0`!260``24&``%*0``!C04``4I$
+M``&-!@`!2QP``8T%``%+(``!C08``4N8``$E!0`!2YP``24&``%+_```Y@4`
+M`4P```#F!@`!3"@``.8%``%,+```Y@8``4Q8``#F!0`!3%P``.8&``%,D```
+MY@4``4R4``#F!@`!6N@``8T%``%,R``!C04``4S,``&-!@`!3>P``9`%``%-
+M\``!D`8``4X```&-!0`!3@0``8T&``%.=``!D`4``4YX``&0!@`!3I````(%
+M``%.E````@8``4ZH``&-!0`!3JP``8T&``%.\```Y@4``4[T``#F!@`!3R@`
+M`8T%``%/+``!C08``4^@``&0!0`!3Z0``9`&``%0(``!D`4``5`D``&0!@`!
+M4%0``9`%``%06``!D`8``5!L``&-!0`!4'```8T&``%1)``!D`4``5$H``&0
+M!@`!450``8T%``%16``!C08``5%\``&-!0`!48```8T&``%1Q``!D`4``5'(
+M``&0!@`!4>0``9`%``%1\``!D`8``5)$``&0!0`!4D@``9`&``%2J``!D`4`
+M`5*L``&0!@`!4TP``9`%``%34``!D`8``5-T``&0!0`!4W@``9`&``%3H``!
+MC04``5.D``&-!@`!4]0```X%``%3Y```#@8``50L```E!0`!5#```"4&``%4
+M1``!6P4``518``%;!@`!5&@``8T%``%4;``!C08``52P``&0!0`!5+0``9`&
+M``%4P```)04``53$```E!@`!50@``"4%``%5#```)08``5;L``&0!0`!530`
+M`9`&``%52``!6P4``55,``%;!@`!56@``8T%``%5;``!C08``56T``&0!0`!
+M5;@``9`&``%5Q```)04``57(```E!@`!5A@``9`%``%6'``!D`8``58P``&-
+M!0`!5C0``8T&``%66``!D`4``59<``&0!@`!5G```8T%``%6=``!C08``5;4
+M```E!0`!5M@``"4&``%5(``!D`4``5<```&0!@`!5Q0``5L%``%7&``!6P8`
+M`5=```&-!0`!5T0``8T&``%7C``!D`4``5>0``&0!@`!5Z```"4%``%7I```
+M)08``5?\``&-!0`!6````8T&``%8E``!6P4``5B8``%;!@`!65P``8T%``%9
+M8``!C08``5FX```D!0`!6;P``"0&``%:'```%@4``5H@```6!@`!6C```8T%
+M``%:-``!C08``5IT``&0!0`!6G@``9`&``%:_``!C04``5L$``&-!@`!6Q@`
+M`8T%``%;'``!C08``5M@``&0!0`!6V0``9`&``%;R``!D`4``5O,``&0!@`!
+M7`0``9`%``%<"``!D`8``5P@``&-!0`!7"0``8T&``%=!``!C04``5T(``&-
+M!@`!740``!8%``%=2```%@8``5U8``&0!0`!75P``9`&``%==``!C04``5UX
+M``&-!@`!7>P``8T%``%=\``!C08``5Z4```"!0`!7IP```(&``%>K````@4`
+M`5ZP```"!@`!7M0```(%``%>V````@8``5\8```"!0`!7QP```(&``%@*``!
+MD`4``6`L``&0!@`!87@``(<%``%AB```AP8``6&P```"!0`!8;0```(&``%B
+M#``!%@4``6(0``$6!@`!8F````(%``%B9````@8``6+H``&-!0`!8NP``8T&
+M``%C"``!D`4``6,,``&0!@`!8S0``8T%``%C.``!C08``6-4``&-!0`!8U@`
+M`8T&``%D```!C04``60$``&-!@`!9"P```(%``%D,````@8``60\``">!0`!
+M9$```)X&``%DG```&P4``62@```;!@`!9-@``3<%``%DW``!-P8``67@``&0
+M!0`!92P``9`%``%E,``!D`8``65$``&-!0`!94@``8T&``%E7``!-04``65@
+M``$U!@`!97```9`%``%E=``!D`8``65\``$U!0`!98```34&``%EC``!C04`
+M`664``&-!@`!9>P``9`%``%E\``!D`8``68(``&-!0`!9@P``8T&``%F;``!
+MD`4``69P``&0!@`!9H```8T%``%FA``!C08``6<$``&0!0`!9P@``9`&``%G
+M&``!C04``6<<``&-!@`!9Z@```$%``%GP````08``6?4```!!0`!9]@```$&
+M``%G[````04``6?P```!!@`!:"0``9`%``%H*``!D`8``6CD```L!0`!:.@`
+M`"P&``%I:```U@4``6D,``#6!@`!:2```.$%``%I*```X08``6DL``"I!0`!
+M:30``*D&``%I.``!2P4``6E```%+!@`!:40``,\%``%I3```SP8``6E0```5
+M!0`!:5@``!4&``%I7``!6`4``6ED``%8!@`!:00``-8%``%I<```U@8``6ET
+M``#A!0`!:7@``.$&``%I?``!*04``6CT``$I!0`!:8```2D&``%IJ``!D`4`
+M`6FL``&0!@`!:=```8T%``%IU``!C08``6GT``&-!0`!:?@``8T&``%J)``!
+MC04``6HH``&-!@`!:C@``$H%``%J/```2@8``6IX``&0!0`!:GP``9`&``%J
+MC``!C04``6J0``&-!@`!:J0``#`%``%JJ```,`8``6JT``#:!0`!:K@``-H&
+M``%JZ``!D`4``6KL``&0!@`!:O@``8T%``%J_``!C08``6L0``""!0`!:Q0`
+M`((&``%K4``!C04``6M4``&-!@`!:[@``9`%``%KO``!D`8``6O8``&-!0`!
+M:]P``8T&``%K^``!D`8``6P4``&-!0`!;!@``8T&``%L<``!D`4``6QT``&0
+M!@`!;(P``8T%``%LD``!C08``6RL``&0!@`!;,0``8T%``%LR``!C08``6T,
+M``&0!0`!;1```9`&``%MA``!C04``6V(``&-!@`!;;@``8T%``%MO``!C08`
+M`6W4``&0!0`!;=@``9`&``%N```!D`8``6X4``&-!0`!;A@``8T&``%NY``!
+MD`4``6[H``&0!@`!<#@``(\%``%P/```CP8``7&$``&!!0`!<6P``8$%``%Q
+MB``!@08``7&D``#]!0`!<:@``/T&``&6X``!D`4``8\P``&0!0`!CR```9`%
+M``%\7``!D`4``7M(``&0!0`!=NP``9`%``%RU``!D`4``7*\``&0!0`!<J``
+M`9`%``%RE``!D`4``7*$``&0!0`!<@```9`%``%R!``!D`8``8U0``#(!0`!
+MC40``,@%``%R&```R`4``7(<``#(!@`!<BP``-H%``%R,```V@8``9MP``&0
+M!0`!<JP``9`&``%RV```#`4``7+<```,!@`!<O0``9`%``%R^``!D`8``7,8
+M``&0!0`!<QP``9`&``%S=```704``7-X``!=!@`!<X@``$P%``%SC```3`8`
+M`7.8``&+!0`!<YP``8L&``%_```!C04``7[T``&-!0`!=JP``8T%``%TH``!
+MC04``72D``&-!@`!=+P```(%``%TP````@8``73$``&-!0`!=,@``8T&``%T
+MS``!-04``730``$U!@`!=30```(%``%U.````@8``74\``&-!0`!=4```8T&
+M``%U1``!-04``75(``$U!@`!=?0``1$%``%U^``!$08``788``&-!0`!=AP`
+M`8T&``%VT``!C04``7;4``&-!@`!O[P``8T%``%V\``!C08``7<$``&0!0`!
+M=P@``9`&``%W'``!C04``7<@``&-!@`!=W@``8T%``%W?``!C08``7>0``&-
+M!0`!=Y0``8T&``%W]``!D`4``7?X``&0!@`!>`P``8T%``%X$``!C08``7@D
+M``!9!0`!=]0``%D%``%WQ```604``7@H``!9!@`!>%P``4`%``%X8``!0`8`
+M`7CL``"5!0`!>/```)4&``&$^``!!04``7D```$%!0`!>-@``04%``%Y!``!
+M!08``7D4``%#!0`!>1@``4,&``%Y.``!C04``7D\``&-!@`!>70``8T%``%Y
+M>``!C08``7G````D!0`!><0``"0&``%Z)``!D`4``7HH``&0!@`!>NP``*\%
+M``%Z\```KP8``7L(```S!0`!>PP``#,&``%[(```7`4``7LD``!<!@`!>UP`
+M`9`%``%[<``!D`8``7N,``&-!0`!>Y```8T&``%[I``!D`4``7NH``&0!@`!
+M?`0``8T%``%\"``!C08``7Q(``$U!0`!?$P``34&``&#L``!-04``7Q@``$U
+M!@`!?&P``9`%``%\<``!D`8``7R$``&-!0`!?(@``8T&``%\H``!D`4``7RD
+M``&0!@`!?*@``34%``%\L``!-08``7SD``&-!0`!?.@``8T&``%\_``!D`4`
+M`7T```&0!@`!?8P``$X%``%]D```3@8``7VD``&-!0`!?:@``8T&``%]X```
+MB@4``7WD``"*!@`!?B```8T%``%^,``!C08``7Y$``&0!0`!?D@``9`&``%^
+M=```MP4``7YX``"W!@`!?H0``$H%``%^B```2@8``7Z@``"9!0`!?J0``)D&
+M``%^M``!D`4``7ZX``&0!@`!?M```8T%``%^U``!C08``7\4``&-!0`!?Q@`
+M`8T&``%_0``!C04``7]$``&-!@`!?VP``1,%``%_<``!$P8``8"(``&-!0`!
+M@(P``8T&``&`P```0@4``8#$``!"!@`!@-P``"T%``&`X```+08``8#X``!&
+M!0`!@/P``$8&``&!$``!C04``8$4``&-!@`!@8P``$D%``&!D```208``8&H
+M``%9!0`!@:P``5D&``&"*``!D`4``8(L``&0!@`!@DP``8T%``&"4``!C08`
+M`8)X``&0!0`!@GP``9`&``&"D``!C04``8*4``&-!@`!FBP``9`%``&"L``!
+MD`8``8+```&-!0`!@L0``8T&``&#0```_04``8-$``#]!@`!@U@``9@%``&#
+M7``!F`8``8.,``&-!0`!@Y```8T&``&#J``!D`4``8.L``&0!@`!?$```34%
+M``&#N``!-08``8/L``"O!0`!@_@``*\&``&$$``!D`4``804``&0!@`!A&P`
+M`34%``&$<``!-08``81\``!9!0`!A(```%D&``&$G``!C04``82@``&-!@`!
+MA0P``)4%``&%$```E08``84@``$%!0`!A20``04&``&%-``!D`4``84X``&0
+M!@`!A4@``8T%``&%3``!C08``86T``!)!0`!A;@``$D&``&%T``!604``874
+M``%9!@`!AB@``9`%``&&+``!D`8``8:$``&-!0`!AH@``8T&``&&G``!D`4`
+M`8:@``&0!@`!AM```8T%``&&U``!C08``8;H``&0!0`!ANP``9`&``&'&``!
+MC04``8<<``&-!@`!ATP```$%``&'4````08``8=X``&!!0`!AWP``8$&``&'
+ME````04``8>8```!!@`!A]P```$%``&'X````08``8?T``&!!0`!A_@``8$&
+M``&($````04``8@4```!!@`!B<```9`%``&)Q``!D`8``8GT``&-!0`!B?@`
+M`8T&``&*,``!-04``8HT``$U!@`!B>0``8T%``&*3``!C08``8I@``$U!0`!
+MBF0``34&``&*<``!C04``8IT``&-!@`!BOP``/T%``&+````_08``8M(``&0
+M!0`!BTP``9`&``&+>``!D`4``8M\``&0!@`!BX```8T%``&+A``!C08``8R,
+M``&0!0`!C)```9`&``&,L``!C04``8RT``&-!@`!C50``9`%``&-6``!D`8`
+M`8UH``&-!0`!C6P``8T&``&-J```R`4``8VL``#(!@`!C<P``9`%``&-T``!
+MD`8``8W@``&-!0`!C>0``8T&``&.>````04``8YD```!!0`!CGP```$&``&/
+M/``!D`4``8]```&0!@`!CU```8T%``&/5``!C08``8]H``$U!0`!CVP``34&
+M``&/B```2@4``8^,``!*!@`!C_P``8$%``&0```!@08``9`8``&0!0`!D!P`
+M`9`&``&05``!D`4``9!8``&0!@`!D1@``9`%``&1'``!D`8``9$T``!G!0`!
+MD3@``&<&``&12````04``9%,```!!@`!D=P``8T%``&1X``!C08``9(```&0
+M!0`!D@0``9`&``&23``!C04``9)0``&-!@`!DSP``"\%``&30```+P8``92`
+M``&0!0`!E(0``9`&``&4F``!C04``92<``&-!@`!FA```9`%``&4N``!D`8`
+M`93(``&-!0`!E,P``8T&``&4Y``!C04``93H``&-!@`!ET```9`%``&6Z``!
+MD`8``9;X``&0!0`!EOP``9`&``&7)``!C04``9<H``&-!@`!EU```9`%``&7
+M5``!D`8``9>$``&-!0`!EX@``8T&``&7G```#@4``9>@```.!@`!F(0``9`%
+M``&8B``!D`8``9BH``&-!0`!F*P``8T&``&:,```P@4``9HT``#"!@`!FE@`
+M`9`%``&:7``!D`8``9I\``&-!0`!FH```8T&``&:S``!D`4``9K0``&0!@`!
+MFO```8T%``&:]``!C08``9N```&0!0`!FX0``9`&``&;L``!C04``9NT``&-
+M!@`!F]@``8T%``&;W``!C08``9U\``&0!0`!G8```9`&``&=L``!C04``9VT
+M``&-!@`!H:@``9`%``&AK``!D`8``:',``&-!0`!H=```8T&``&D2``!D`4`
+M`:1,``&0!@`!I&P``8T%``&D<``!C08``:3X``!9!0`!I/P``%D&``&E2``!
+M(`4``:5,``$@!@`!I9P```(%``&EH````@8``:74```!!0`!I=@```$&``&G
+M/````04``:=````!!@`!IU0``8T%``&G6``!C08``:?<``&-!0`!I^```8T&
+M``&IA```%`4``:F(```4!@`!J?0```$%``&I^````08``:JL```!!0`!JK``
+M``$&``&K$``!$P4``:L4``$3!@`!JTP```$%``&K4````08``:MT```!!0`!
+MJW@```$&``&MP````04``:W$```!!@`!K_````(%``&O]````@8``;`@```!
+M!0`!L"0```$&``&P]```Y@4``;#X``#F!@`!LNP``54%``&R\``!508``;3(
+M``%5!0`!M,P``54&``&U9````04``;5H```!!@`!MSP```(%``&W0````@8`
+M`;>````"!0`!MX0```(&``&W^````04``;?\```!!@`!N%````$%``&X5```
+M`08``;DD``&-!0`!N2@``8T&``&YC``!D`4``;F0``&0!@`!N@@```$%``&Z
+M#````08``;HX```!!0`!NCP```$&``&Z5````04``;I8```!!@`!NFP```$%
+M``&Z<````08``;K\```"!0`!NP0```(&``&["````@4``;L,```"!@`!O,0`
+M``$%``&\R````08``;VH```O!0`!O:P``"\&``&^J```6@4``;ZL``!:!@`!
+MOLP``%H%``&^T```6@8``;[\``!:!@`!OQP``&8%``&_(```9@8``;\H``&-
+M!0`!ORP``8T&``&_F```6@4``;^<``!:!@`!O_P``&8%``'`````9@8``7\0
+M``&-!0`!P!0``8T&``'`R``!D`4``<#,``&0!@`!P20``8T%``'!*``!C08`
+M`<%<``&0!0`!P6```9`&``'!X```U04``<'D``#5!@`!P?0``9`%``'!^``!
+MD`8``<W4``&-!0`!S<0``8T%``'-B``!C04``<)0``&-!0`!PE0``8T&``'"
+M:```U04``<)L``#5!@`!PM0``68%``'"V``!9@8``<,@``$5!0`!PR0``14&
+M``'$D``!(`4``<24``$@!@`!Q.0``%8%``'$Z```5@8``<54``&-!0`!Q5@`
+M`8T&``'%C``!D`4``<60``&0!@`!QF````$%``'&9````08``<=T``&-!0`!
+MQW@``8T&``'('``!C04``<@@``&-!@`!R%```8T%``'(5``!C08``<F0``$H
+M!0`!R9@``2@&``')E```,04``<F<```Q!@`!R:P``+\%``')L```OP8``<G$
+M``&-!0`!R<@``8T&``'*```!C04``<H$``&-!@`!RF0``9`%``'*:``!D`8`
+M`<N@```!!0`!RZ0```$&``'+]``!D`4``<OX``&0!@`!S!P``8T%``',(``!
+MC08``<Q,``&-!0`!S%```8T&``',D``!D`4``<R4``&0!@`!S2```8T%``'-
+M)``!C08``<TX``&8!0`!S3P``9@&``'.P``!-04``<U(``$U!@`!S7```9@%
+M``'-=``!F`8``<W<``&0!0`!S>```9`&``'-Y``!C04``<WH``&-!@`!SE``
+M`9`%``'.5``!D`8``<YH``&-!0`!SFP``8T&``'.@``!-04``<Z$``$U!@`!
+MSK@``9@%``'.O``!F`8``<U```$U!0`!SL@``34&``'.Y``!D`4``<[T``&0
+M!@`!SPP``8T%``'/$``!C08``<\D``&-!0`!SR@``8T&``'5A``!@@4``=6(
+M``&"!@`!U90``8T%``'5F``!C08``=84``&-!0`!UA@``8T&``'6*``!@@4`
+M`=8L``&"!@`!UQ@``8(%``'7'``!@@8``==L``$@!0`!UW```2`&``'8D``!
+MC04``=B4``&-!@`!V+@``#`%``'8O```,`8``=DL``""!0`!V3```((&``'9
+M.``!C04``=D\``&-!@`!V;````(%``'9M````@8``=G<``&0!0`!V>```9`&
+M``':%``!C04``=H8``&-!@`!VW@``9`%``';?``!D`8``=NX``&-!0`!V[P`
+M`8T&``'=)``!D`4``=TH``&0!@`!W3@``8T%``'=/``!C08``=V@``&0!0`!
+MW:0``9`&``'=T``!C04``=W4``&-!@`!WD```9`%``'>1``!D`8``=Y\``&-
+M!0`!WH```8T&``'>U````@4``=[8```"!@`!WMP```(&``'?+``!D`4``=\P
+M``&0!@`!WUP``8T%``'?8``!C08``=_(``!Q!0`!W\P``'$&``'?V``!<04`
+M`=_<``%Q!@`!W^P``-D%``'?\```V08``>`<``%Q!0`!X"```7$&``'@,```
+MV04``>`T``#9!@`!X$0``8T%``'@2``!C08``>!L```P!0`!X'```#`&``'@
+MA``!<08``>"0``#9!0`!X)0``-D&``'A9``!C04``>%H``&-!@`!X:P``8(%
+M``'AL``!@@8``>(D``">!0`!XB@``)X&``'B4```G@4``>)4``">!@`!XJ@`
+M`)X%``'BK```G@8``>+L``">!0`!XO```)X&``'C%```G@4``>,8``">!@`!
+MY"P``1X%``'C-``!'@8``>-<``">!0`!XV```)X&``'C?```G@4``>.```">
+M!@`!X^@``)X%``'C[```G@8``>1```">!0`!Y$0``)X&``'BX``!'@4``>1@
+M``$>!@`!Y(0``)X%``'DB```G@8``>34```!!0`!Y-@```$&``'E3```G@4`
+M`>50``">!@`!Y:```7$%``'EI``!<08``>6P``#9!0`!Y;0``-D&``'ML```
+M`04``>V8```!!0`![6@```$%``'HF````04``>7$```!!0`!Y<@```$&``'E
+M]```G@4``>7X``">!@`!YE@``)X&``'FM``!<04``>:X``%Q!@`!YL@``-D%
+M``'FS```V08``>;<```!!0`!YN````$&``'F[``!C04``>;P``&-!@`!YQP`
+M``$%``'G(````08``><L``%Q!0`!YS```7$&``'G/```V04``>=```#9!@`!
+MYY```8T%``'GE``!C08``>>T``&"!0`!Y[@``8(&``'GX``!D`4``>?D``&0
+M!@`!Z'@```$%``'H?````08``>B<```!!0`!Z*````$&``'HK````04``>BP
+M```!!@`!Z2@```$%``'I+````08``>DX```!!0`!Z3P```$&``'IB````04`
+M`>F,```!!@`!Z9@```$%``'IG````08``>H0``">!0`!ZA0``)X&``'J-```
+MG@4``>HX``">!@`!ZE@``)X%``'J7```G@8``>I\``">!@`!ZK0``9`%``'J
+MN``!D`8``>O````!!0`!Z\0```$&``'KZ````04``>OL```!!@`![`P``8(%
+M``'L$``!@@8``>P@``&0!0`!["0``9`&``'L5``!C04``>QP``&-!@`![*0`
+M`8T%``'LJ``!C08``>V<```!!0`![:````$&``'M]````04``>WX```!!@`!
+M[@0```$%``'N"````08``>Y,```!!0`![E````$&``'N7````04``>Y@```!
+M!@`![RP```(%``'O,````@8``>\T``&-!0`![S@``8T&``'O/``!-04``>]`
+M``$U!@`![Z````(%``'OI````@8``>^H``&-!0`![ZP``8T&``'OL``!-04`
+M`>^T``$U!@`!\`````(%``'P!````@8``?`(``&-!0`!\`P``8T&``'P$``!
+M-04``?`4``$U!@`!\+P``(D%``'PP```B08``?#P```"!0`!\/0```(&``'Q
+MH```+P4``?#\```O!0`!\0```"\&``'Q*``!D`4``?$L``&0!@`!\5```8T%
+M``'Q5``!C08``?%P``&-!0`!\70``8T&``'QK```+P4``?&P```O!@`!\=@`
+M`"\%``'QW```+P8``?(0``&-!0`!\A0``8T&``'R>````@4``?)\```"!@`!
+M]&````(%``'T9````@8``?2P``!W!0`!]+@``'<&``'T[``!C04``?3P``&-
+M!@`!]/0``34%``'T^``!-08``?4(```"!0`!]0P```(&``'U6````@4``?5<
+M```"!@`!]6```8T%``'U9``!C08``?5H``$U!0`!]6P``34&``'UK````@4`
+M`?6T```"!@`!];@``8T%``'UO``!C08``?7```$U!0`!]<0``34&``'V&```
+M`@4``?8@```"!@`!]B0``8T%``'V*``!C08``?8L``$U!0`!]C```34&``'V
+MC````@4``?:0```"!@`!]O```'<%``'V]```=P8``?<D``!W!0`!]R@``'<&
+M``'WC````@4``?>0```"!@`!]Y@``8T%``'WG``!C08``?>@``$U!0`!]Z0`
+M`34&``'X`````@4``?@$```"!@`!^$0``'<%``'X2```=P8``?CL```"!0`!
+M^/````(&``'X^``!C04``?C\``&-!@`!^0```34%``'Y!``!-08``?M$``$@
+M!0`!^T@``2`&``'[I````04``?NH```!!@`!_60```$%``']:````08``?\X
+M```!!0`!_SP```$&``'_9``!504``?]H``%5!@`!_X@```$%``'_C````08`
+M`?_````!!0`!_\0```$&``(`"````04``@`,```!!@`"`80``54%``(!B``!
+M508``@&X``"#!0`"`;P``(,&``(!U```@P4``@'8``"#!@`"`@````(%``("
+M"````@8``@(8```"!0`"`AP```(&``("0````@4``@)$```"!@`"`G```,T%
+M``("=```S08``@*@``#-!0`"`J0``,T&``("R````04``@+,```!!@`"`M0`
+M``$%``("V````08``@+@```!!0`"`N0```$&``("[````04``@+P```!!@`"
+M`O@```$%``("_````08``@,$```!!0`"`P@```$&``(#$````04``@,4```!
+M!@`"`QP```$%``(#(````08``@-\```"!0`"`X````(&``(#A``!C04``@.(
+M``&-!@`"`XP``34%``(#D``!-08``@/P```"!0`"`_0```(&``(#^``!C04`
+M`@/\``&-!@`"!````34%``($!``!-08``@10```"!0`"!%0```(&``($6``!
+MC04``@1<``&-!@`"!&```34%``($9``!-08``@6X```O!0`"!;P``"\&``(%
+MT``!D`4``@74``&0!@`"!?@``8T%``(%_``!C08``@88``&-!0`"!AP``8T&
+M``(&J```+P4``@:L```O!@`"!QP``"\%``('(```+P8``@>$```O!0`"!X@`
+M`"\&``('Z```+P4``@?L```O!@`"""@``8T%``((+``!C08``@B0```"!0`"
+M")0```(&``(*=````@4``@IX```"!@`""J0```(%``(*J````@8``@K@```"
+M!0`""N0```(&``(+(````@4``@LD```"!@`""V@``'<%``(+;```=P8``@Q\
+M``!W!0`"#(```'<&``(,O```=P4``@S```!W!@`"#4P``'<%``(-4```=P8`
+M`@W0``!W!0`"#=0``'<&``(.6````@4``@Y<```"!@`"#K0``'<%``(.N```
+M=P8``@[0``!W!0`"#M0``'<&``(/1````@4``@](```"!@`"#TP``8T%``(/
+M4``!C08``@]4``$U!0`"#U@``34&``(/G````@4``@^D```"!@`"#ZP``8T%
+M``(/L``!C08``@^T``$U!0`"#[@``34&``(0!````@4``A`,```"!@`"$!``
+M`8T%``(0%``!C08``A`8``$U!0`"$!P``34&``(0:````@4``A!P```"!@`"
+M$'@``8T%``(0?``!C08``A"```$U!0`"$(0``34&``(0W````@4``A#@```"
+M!@`"$.@``8T%``(0[``!C08``A#P``$U!0`"$/0``34&``(3@````04``A.$
+M```!!@`"$[```.8%``(3M```Y@8``A1,```!!0`"%%````$&``(4T````04`
+M`A34```!!@`"%5````$%``(55````08``A78```!!0`"%=P```$&``(6,```
+M`04``A8T```!!@`"%J0```$%``(6J````08``A=$```!!0`"%T@```$&``(7
+M[````04``A?P```!!@`"%]P```$%``(8,````08``AI0```!!0`"&E0```$&
+M``(>"```@P4``AX,``"#!@`"'B0``(,%``(>*```@P8``B`,```!!0`"(!``
+M``$&``(@,````04``B`T```!!@`"(3P```$%``(A0````08``B'H```!!0`"
+M(>P```$&``(B9````04``B)H```!!@`"(O@``,T%``(B_```S08``B,H``#-
+M!0`"(RP``,T&``(C6````04``B-<```!!@`"(V0```$%``(C:````08``B-P
+M```!!0`"(W0```$&``(C?````04``B.````!!@`"(X@```$%``(CC````08`
+M`B.4```!!0`"(Y@```$&``(CH````04``B.D```!!@`"(ZP``"$%``(CL```
+M(08``B0,```"!0`")!````(&``(D%``!C04``B08``&-!@`")!P``34%``(D
+M(``!-08``B2````"!0`")(0```(&``(DB``!C04``B2,``&-!@`"))```34%
+M``(DE``!-08``B3@```"!0`").0```(&``(DZ``!C04``B3L``&-!@`")/``
+M`34%``(D]``!-08``B9(```O!0`")DP``"\&``(F8``!D`4``B9D``&0!@`"
+M)H@``8T%``(FC``!C08``B:H``&-!0`")JP``8T&``(G.```+P4``B<\```O
+M!@`")ZP``"\%``(GL```+P8``B@4```O!0`"*!@``"\&``(H>```+P4``BA\
+M```O!@`"*+@``8T%``(HO``!C08``BFH```"!0`"*:P```(&``(IV````@4`
+M`BG<```"!@`"*A0```(%``(J&````@8``BI4```"!0`"*E@```(&``(JG```
+M=P4``BJ@``!W!@`"*M````(%``(JU````@8``BL4```"!0`"*Q@```(&``(K
+M'``!C04``BL@``&-!@`"*R0``34%``(K*``!-08``BML```"!0`"*W0```(&
+M``(K?``!C04``BN```&-!@`"*X0``34%``(KB``!-08``BO4```"!0`"*]P`
+M``(&``(KX``!C04``BOD``&-!@`"*^@``34%``(K[``!-08``BPX```"!0`"
+M+$````(&``(L2``!C04``BQ,``&-!@`"+%```34%``(L5``!-08``BRL```"
+M!0`"++````(&``(LM``!C04``BRX``&-!@`"++P``34%``(LP``!-08``BU<
+M```"!0`"+6````(&``(NV````04``B[<```!!@`",.P```$%``(P\````08`
+M`C+L```!!0`",O````$&``(S/````04``C-````!!@`",[P```$%``(SP```
+M`08``C>D``&0!0`"-Z@``9`&``(WW````04``C?@```!!@`".!P``8T%``(X
+M(``!C08``CA8``&-!0`".%P``8T&``(X\``!C04``CCT``&-!@`".4P``(,%
+M``(Y4```@P8``CEH``"#!0`".6P``(,&``(YA```@P4``CF(``"#!@`".OP`
+M``$%``([2````08``CM<```!!0`".V````$&``(\&````04``CP<```!!@`"
+M/)0```$%``(\F````08``CT\```!!0`"/4````$&``(]5````04``CU8```!
+M!@`"/=P```$%``(]X````08``CYP``#-!0`"/G0``,T&``(^H```S04``CZD
+M``#-!@`"/L@``,T%``(^S```S08``C[P```!!0`"/O0```$&``(^_````04`
+M`C\````!!@`"/P@```$%``(_#````08``C\4```!!0`"/Q@```$&``(_(```
+M`04``C\D```!!@`"/RP```$%``(_,````08``C\X```!!0`"/SP```$&``(_
+M1```(04``C](```A!@`"/ZP```(%``(_L````@8``C^T``&-!0`"/[@``8T&
+M``(_O``!-04``C_```$U!@`"0"````(%``)`)````@8``D`H``&-!0`"0"P`
+M`8T&``)`,``!-04``D`T``$U!@`"0(````(%``)`A````@8``D"(``&-!0`"
+M0(P``8T&``)`D``!-04``D"4``$U!@`"0>@``"\%``)![```+P8``D(```&0
+M!0`"0@0``9`&``)"*``!C04``D(L``&-!@`"0D@``8T%``)"3``!C08``D+8
+M```O!0`"0MP``"\&``)#3```+P4``D-0```O!@`"0Y@``"\%``)#G```+P8`
+M`D/@```O!0`"0^0``"\&``)$(``!C04``D0D``&-!@`"19@```(%``)%G```
+M`@8``D7(```"!0`"1<P```(&``)&!````@4``D8(```"!@`"1D0```(%``)&
+M2````@8``D:8``!W!0`"1IP``'<&``)'$```+P4``D<4```O!@`"1RP``'<%
+M``)',```=P8``D=4``!W!0`"1U@``'<&``)'C````@4``D<,```"!0`"1Y``
+M``(&``)'T````@4``D?4```"!@`"1]@``8T%``)'W``!C08``D?@``$U!0`"
+M1^0``34&``)(*````@4``D@P```"!@`"2#@``8T%``)(/``!C08``DA```$U
+M!0`"2$0``34&``)(D````@4``DB8```"!@`"2)P``8T%``)(H``!C08``DBD
+M``$U!0`"2*@``34&``)(]````@4``DC\```"!@`"200``8T%``))"``!C08`
+M`DD,``$U!0`"21```34&``)):````@4``DEL```"!@`"27```8T%``))=``!
+MC08``DEX``$U!0`"27P``34&``)*&````@4``DH<```"!@`"2Y0```$%``)+
+MF````08``DVH```!!0`"3:P```$&``)/J````04``D^L```!!@`"3_@```$%
+M``)/_````08``E!X```!!0`"4'P```$&``)48``!D`4``E1D``&0!@`"5)@`
+M``$%``)4G````08``E38``&-!0`"5-P``8T&``)5%``!C04``E48``&-!@`"
+M5:P``8T%``)5L``!C08``E8(``"#!0`"5@P``(,&``)6)```@P4``E8H``"#
+M!@`"5D```(,%``)61```@P8``E>T```!!0`"6`````$&``)8%````04``E@8
+M```!!@`"6-````$%``)8U````08``EE,```!!0`"65````$&``)9]````04`
+M`EGX```!!@`"6@P```$%``):$````08``EJ4```!!0`"6I@```$&``);*```
+MS04``ELL``#-!@`"6U@``,T%``);7```S08``EN```#-!0`"6X0``,T&``);
+MJ````04``ENL```!!@`"6[0```$%``);N````08``EO````!!0`"6\0```$&
+M``);S````04``EO0```!!@`"6]@```$%``);W````08``EOD```!!0`"6^@`
+M``$&``);\````04``EOT```!!@`"6_P``"$%``)<````(08```#(```!`@``
+M`,P```$"````T````0(```#4```!`@```-@```$"````W````0(```#@```!
+M`@```.0```$"````Z````0(```#L```!`@```/````$"````]````0(```#X
+M```!`@```/P```$"```!`````0(```$$```!`@```0@```$"```!#````0(`
+M``$0```!`@```10```$"```!&````0(```$<```!`@```2````$"```!)```
+M`0(```$H```!`@```2P```$"```!,````0(```$T```!`@```3@```$"```!
+M/````0(```%````!`@```40```$"```!2````0(```%,```!`@```5````$"
+M```":``!#`(```)L``!D`@```G```,`"```"=```LP(```)X``%Z`@```GP`
+M`-,"```"@```5`(```*$``#?`@```H@``*`"```"C``!=P(```*0``%*`@``
+M`I0``+T"```"F```/@(```*<``"$`@```J```%<"```"I```(`(```*H``%H
+M`@```JP``9,"```"L```+@(```*T``",`@```K@``4<"```"O```*0(```+`
+M```\`@```L0``&@"```"R``!?@(```+,``%Y`@```M```1D"```"U```M`(`
+M``+8``%?`@```MP``6("```"X``!"0(```+D``#<`@```N@``3P"```"[```
+MD`(```+P``%R`@```O0``+X"```"^```M@(```+\``"%`@```P```*X"```#
+M!```50(```,(``#'`@```PP``3@"```#$``!#@(```,4``"D`@```Q@``3,"
+M```#'```Z0(```,@``%<`@```R0``4P"```#*``!*P(```,L```R`@```S``
+M`+4"```#-``!6@(```,X``$;`@```SP``20"```#0```/0(```-$``!T`@``
+M`T@``40"```#3```Y`(```-0``!/`@```U0``#8"```#6```BP(```-<```)
+M`@```V```/4"```#9``!/0(```-H``$T`@```VP``/8"```#<``!?P(```-T
+M``!I`@```W@```L"```#?``!9`(```.```"L`@```X0``0\"```#B``!&`(`
+M``.,``%N`@```Y```3("```#E```I@(```.8``!%`@```YP``2T"```#H```
+M$P(```.D``"[`@```Z@``&\"```#K```^`(```.P``#Z`@```[0``5$"```#
+MN``!8P(```.\``%]`@```\````\"```#Q``!3@(```/(``$B`@```\P``0L"
+M```#T```H0(```/4``%/`@```]@```$"```#W``!D0(```/@``$J`@```^@`
+M`5H"```#[``!&P(```/P``$D`@```_0``#T"```#^```=`(```/\```!`@``
+M&H@``44"```:C``!90(``!J0``%7`@``&I0``7P"```:F```8P(``!J<``!U
+M`@``&J```),"```:I```;`(``!JH```-`@``&JP``#4"```:L```80(``!JT
+M``!B`@``&K@``#D"```:O``!:P(``!K```$-`@``&L0``8<"```:R```@0(`
+M`!K,``%U`@``&M```0("```:U```J@(``!K8``$G`@``&MP``"("```:X``!
+M!P(``!KD```9`@``&N@``6<"```:[```YP(``!KP```?`@``&O0``"H"```:
+M^```K0(``!K\``%[`@``&P```6D"```;!``!=@(``!L(``$Y`@``&PP``/("
+M```;$```_P(``!L4``#N`@``&Q@``1("```;'```?0(``!L@``"8`@``&R0`
+M`',"```;*``!20(``!LL``"?`@``&S```$`"```;-``!.@(``!LX``$V`@``
+M&SP``'D"```;0```.@(``!M$``%-`@``&T@``-T"```;3``!+@(``!M0``#C
+M`@``&U0``,,"```;6```X@(``!M<``%!`@``&V```,X"```;9```-P(``!MH
+M``!@`@``&VP``-@"```;<``!1@(``!MT``%4`@``&W@``28"```;?```'`(`
+M`!N```!;`@``&X0``3`"```;B``!D@(``!N,``!(`@``&Y```)H"```;E``!
+M8`(``!N8``#4`@``&YP``00"```;H```'@(``!ND``#[`@``&Z@``#@"```;
+MK``!``(``!NP``#K`@``&[0``(T"```;N```)P(``!N\``!0`@``&\```)("
+M```;Q```VP(``!O(``#+`@``&\P``58"```;T```R@(``!O4``%1`@``&]@`
+M`8X"```;W```"`(``!O@``"B`@``&^0``'`"```;Z```:@(``!OL``#O`@``
+M&_```/,"```;]``!!@(``!OX```!`@``&_P``2P"```<```!2`(``!P(``##
+M`@``'`P``.("```<$``!00(``!P4``#.`@``'!@``#<"```<'````0(``#J(
+M```!`@``.HP```$"```ZD````0(``#J4```!`@``.I@```$"```ZG````0(`
+M`#J@```!`@``.J0```$"```[^```6@(``#O\``"``@``/````7,"```\!```
+M:P(``#P(``!$`@``/`P``-<"```\$```N`(``#P4``$<`@``/!@``*L"```\
+M'```4P(``#P@``"=`@``/"0``%8"```\*``!`P(``#PL``%>`@``/#```(H"
+M```\-```_@(``#PX``#E`@``/#P``9@"```\0``!C`(``#Q$``"Y`@``/$@`
+M`'P"```\3``!(P(``#Q0```H`@``/%0``5T"```\6``!4@(``#Q<``"&`@``
+M/&```6$"```\9```7@(``#QH``$_`@``/&P``0$"```\<```_`(``#QT```2
+M`@``/'@``6P"```\?```>@(``#R```#@`@``/(0``7$"```\B```V0(``#R,
+M``"6`@``/)```3$"```\E```^0(``#R8```0`@``/)P``)P"```\H```"@(`
+M`#RD``"7`@``/*@``3X"```\K```L`(``#RP``#H`@``/+0``#\"```\N``!
+M'P(``#R\``"C`@``/,```+$"```\Q``!%P(``#S(``!-`@``/,P``4("```\
+MT``!4`(``#S4``$4`@``/-@``90"```\W```20(``#S@``#&`@``/.0``*@"
+M```\Z``!@@(``#SL``!,`@``//```(X"```\]``!A@(``#SX``"G`@``//P`
+M`,P"```]````0@(``#T$``!+`@``/0@``"T"```]#```00(``#T0```[`@``
+M/10``.H"```]&```1@(``#T<``!_`@``/2```#0"```])```,P(``#TH```8
+M`@``/2P``'("```],```]P(``#TT``!M`@``/3@``24"```]/``!@0(``#U`
+M``#0`@``/40``5$"```]2```D0(``#U,``&/`@``/5```1`"```]5```T0(`
+M`#U8```C`@``/5P``70"```]8```;@(``#UD``#5`@``/6@``,4"```];```
+M[`(``#UP``&*`@``/7@``1<"```]?```30(``#V```%"`@``/80``5`"```]
+MB``!%`(``#V,``&5`@``/90```$"``!.<````0(``$YT```!`@``3G@```$"
+M``!.?````0(``$Z````!`@``3H0```$"``!.X````0(``$[D```!`@``3N@`
+M``$"``!.[````0(``$[P```!`@``3O0```$"``!.^````0(``$[\```!`@``
+M3P````$"``!/!````0(``$\(```!`@``3PP```$"``!/$````0(``$\4```!
+M`@``3Q@```$"``!/'````0(``$\@```!`@``3R0```$"``!/*````0(``$\L
+M```!`@``3S````$"``!/-````0(``$\X```!`@``3SP```$"``!/0````0(`
+M`$]$```!`@``3T@```$"``!/3````0(``$]0```!`@``3U@```$"``!/7```
+M`0(``$]@```!`@``3V0```$"``!/:````0(``$^(```!`@``3XP```$"``!/
+MD````0(``$^4```!`@``3Y@```$"``!/G````0(``$^@```!`@``3Z0```$"
+M``!/J````0(``$^L```!`@``3[````$"``!/M````0(``$^X```!`@``3[P`
+M``$"``!/P````0(``$_$```!`@``3\@```$"``!/S````0(``$_0```!`@``
+M3]0```$"``!/V````0(``$_<```!`@``3^````$"``!/Y````0(``$_H```!
+M`@``3^P```$"``!/\````0(``$_T```!`@``6Y````$"``!;E````0(``%N8
+M```!`@``6YP```$"``!;H````0(``%ND```!`@``6Z@```$"``!HD````0(`
+M`&B4```!`@``:)@```$"``!HG````0(``&B@```!`@``:*0```$"``!HJ```
+M`0(``&BL```!`@``=+@```$"``!TO````0(``'3````!`@``=,0```$"``!T
+MR````0(``'3,```!`@``=-````$"``"`P````0(``(#$```!`@``@,@```$"
+M``"`S````0(``(#0```!`@``@-0```$"``"`V````0(``(ZH```!`@``CJP`
+M``$"``".L````0(``(ZT```!`@``CK@```$"``".O````0(``([````!`@``
+M``P```("````$````@(````4```"`@```!@```("````'````@(````@```"
+1`@```"0```("````*````@(`
+`
+end
diff --git a/sys/contrib/dev/ath/public/mips-be-elf.inc b/sys/contrib/dev/ath/public/mips-be-elf.inc
new file mode 100644
index 0000000..06e2c18
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips-be-elf.inc
@@ -0,0 +1,75 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/mips-be-elf.inc#2 $
+#
+
+#
+# Configuration for building big-endian MIPS2 using the 5.01
+# linux-mips.org toolchain (manually moved to /pub/gnu from
+# /pub/gnu/local where rpm --prefix=/pub/gnu bogusly installs them).
+#
+# Known to work on:
+# AMD Au1500
+
+#
+# http://www.linux-mips.org/toolchain.html
+#
+# /pub/gnu/bin/mips-linux-gcc -v
+# Reading specs from /pub/gnu/bin/../lib/gcc-lib/mips-linux/2.96-mips3264-000710/specs
+# gcc version 2.96-mips3264-000710
+# /pub/gnu/bin/mips-linux-as -v
+# GNU assembler version 2.12.90.0.7 (mips-linux) using BFD version 2.12.90.0.7 20020423
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/mips-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -G 0 -EB -mno-abicalls -fno-pic -mips2 -Wa,--trap \
+ -fno-strict-aliasing -fno-common -fomit-frame-pointer -mlong-calls
diff --git a/sys/contrib/dev/ath/public/mips-be-elf.opt_ah.h b/sys/contrib/dev/ath/public/mips-be-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips-be-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/mips-le-elf.hal.o.uu b/sys/contrib/dev/ath/public/mips-le-elf.hal.o.uu
new file mode 100644
index 0000000..445fa7d
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips-le-elf.hal.o.uu
@@ -0,0 +1,5758 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/mips-le-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$!`0````````````$`"``!``````````````!<1`,``1``$#0`````
+M`"@`$0`.`/P#_^``````````````````````_W\```````#__X0P6``#)```
+M`CQ<`(,0A`!")%D`@B@E`$`0!Q$")!P`@B@3`$`04@`")!H`@BA1`$`0```"
+M/!,`@B@)`$`0$P`")!$`@BA'`$`0```"/`<``B1"`()0```"/`@`X`,E$```
+M1`""4````CP(`.`#)1```#X`@A````(\4P""*`<`0%!7``(D'``#)````CP[
+M`(,0F`!")`@`X`,E$```,P""4````CP(`.`#)1```"L`@A````(\"!&"*!4`
+M0%`3$0(DD0`#)````CPL`(,0<`!"))(`@B@*`$`0%!`")(@`@B@F`$`0)1``
+M`(8`@B@C`$!4)1```````CP(`.`#7`!")!P`@E````(\"`#@`R40```8`((0
+M```"/!01@B@&`$`0$_`#-!(1`B0.`()0```"/`@`X`,E$``````"/`\`@Q`T
+M`$(D&_$#-````CP+`(,0(`!")`@`X`,E$```"`#@`P``0B0(`.`#$`!")`@`
+MX`-(`$(D"`#@`ZP`0B0(`.`#`````.C_O2<0`+^O__^$,(P6@S@!`&,L)Z>"
+M.`$`0BPE&&(`!`!@%/__I3"W$`(D!P""5"40``````(\``!")`GX0``E(*``
+M`@``$!``OX\0`+^/"`#@`Q@`O2?@_[TG&`"_K___A#`'`@(D0@""$#``J(\(
+M`H(H%0!`$!,1`B03`((H"0!`$!,``B01`((H-`!`$````CP'``(D-@""$"48
+M```[```0`0`")"8`@A`=`((H-@!`$"48```:`((H-`!`%`$``B0?```0$P`$
+M)!T`@A`4$8(H#P!`$!OQ`C0'$0(D)`""$`@1@B@&`$`0$A$")!00`B02`((0
+M)1@``"0``!`!``(D%0""$"48```@```0`0`")!$`@A`J$$0`!@!`%!G_`C03
+M\`(T!@""$"48```7```0`0`")!0`@A0E&```$P`$)````CP``$(D"?A``!``
+MJ*\/```0)1A``````CP``$(D"?A``!``J*\)```0)1A``````CP``$(D"?A`
+M`!``J*\#```0)1A```$``B0```*M$`!@$"408`#(`6*4"`!BI,H!8I0*`&*D
+MS`%BC!P`8JS0`6*4(`!BI-(!8I0B`&*DU`%BE"0`8J36`6*4)@!BI"408``8
+M`+^/"`#@`R``O2?8`86L"`#@`P$``B30_[TG+`"_KR@`MJ\D`+6O(`"TKQP`
+MLZ\8`+*O%`"QKQ``L*\EL(``):B@`"6@P``EF.``)8```````CP``%(D```"
+M/```420E(,`""?A``B4HH`(D&%0`"`!S$`$``B0)^"`""@`$)`$`$";H`P(J
+M]O]`5"4@P`(E$```+`"_CR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(
+M`.`#,`"])R4P```(`*`0)1@``$`0`P`!`(,P)1A#``$`QB0K$,4`^O]`%$(@
+M!``(`.`#)1!@`!``J8___^<P0!`'`"$01P"`$`(`(1!%`"8`2)2.```1)1``
+M`$`0!P`A$$<`@!`"`"$010`E`$.0`@`")"0`8A`#`&(H!0!`$`,``B0*`&`0
+M`````'\``!`E,```6P!B$,`0"``$``(D:`!B4(`0"`!X```0)3````@`(!'`
+M``,D0!`'`"$01P"`$`(`(1!%`"D`0I`!`$!48``#),`@!@``$@8`(Q!$`(`0
+M`@`A$$0`P!`"`!L`2``2$````0``40T`!P`A,&(`8@``$`H`QB0T$H*,+0!`
+M4(`0"``"`$*4`(!",!$`0!``$0@`8A`#/---8S09`$,`$!```((9`@``````
+MP"`&`"$0@P`5`$(D&P!#`!(0```!`&!0#0`'```1`@!+```0D`!&)#02A(P6
+M`(`0@!`(``(`@I0`0$(P$0!`$&(0`SS`$`@`TTUC-!D`0P`0$```@AD"````
+M``#`(`8`(1"#`!4`0B0;`$,`$A````$`8%`-``<`P!`"`#0``!!(`$8D@!`(
+M`&(0`SS336,T&0!#`!`0``""&0(``````,`@!@`A$(,`%0!")!L`0P`2$```
+M`0!@4`T`!P"`$`(`(P``$"0`1B1B$`,\TTUC-!D`0P`0$```@AD"``````#`
+M(`8`(1"#`!4`0B0;`$,`$A````$`8%`-``<`@!`"`!,``!`6`$8D8A`#/---
+M8S09`$,`$!```((9`@``````P"`&`"$0@P`5`$(D&P!#`!(0```!`&!0#0`'
+M`(`8`@#H`P(M`@!`%+T`9B1<`&8D___",`@`X`,``````@"CE"``8S`6`&`4
+M`@`")`(`HY30`&,PP``$)!$`9!`#``(D`@"CE-``8S#0``0D#`!D$`0``B0"
+M`*.4$`!C,`@`8!0!``(D`@"BE``(0C`!`$(L(Q`"`/O_`R0D$$,`!0!")`@`
+MX`,`````X/^])Q@`OZ\4`+&O$`"PKR6(P`"``"(R"0!`$"6`H`"T"0,D:0`#
+M$@X``B2T"0(N6`!`4##V`B8H```0F?8#)@`!(C(>`$`0```"/```0B0)^$``
+M`````!$`0!"S[`(F,0!"+`\`0!!``2(R@!`0`"$04`!`(`(`!0`")!L``@(0
+M&````0!`4`T`!P`"``(D,@!B%/__`CPQ```0#3]"-$`!(C(K$`(`B1,#+B00
+M0P`_`$`08/`")CX``!``````M`D#)$$``Q(.``(DM`D"+@H`0%"($P(NF?8#
+M)F9F`CQG9D(T&`!B`!`0``!#$`(`PQ\#`#4``!`C$$,`+0!`$'CL`B8```(\
+M``!")`GX0```````&@!`$+/L`B8Q`$(L&`!`$"43`BZ`$!``(1!0`$`@`@`%
+M``(D&P`"`A`8```!`$!0#0`'``(``B0#`&(4__\"/`(``!`-/T(T"#]"-"$8
+M@@#,S`(\S<Q"-!D`8@`0$```@A@"`!0``!`E$&``)1,"+@,`0%0P]@(F"0``
+M$&#P`B;,S`,\S<QC-!D`0P`0$````A$"``@``!`/`$(D>.P")LS,`SS-S&,T
+M&0!#`!`0``""$`(``````!@`OX\4`+&/$`"PCP@`X`,@`+TGZ/^])Q0`OZ\0
+M`+"O)8"@`#02A8P,`*`0```"/```0B0)^$```````````SR\`&,D(1!#````
+M0I`8``("$A````@``!`4`+^/```"/+X`0I`8``("$A``````````````%`"_
+MCQ``L(\(`.`#&`"])^C_O2<4`+^O$`"PKR6`H``T$H6,"0"@$````CP``$(D
+M"?A```````````,\O`!C)"$00P`#```0``!#D````CR^`$.0&P`#`A(0```!
+M`&!0#0`'`!0`OX\0`+"/"`#@`Q@`O2?`_[TG/`"_KS@`OJ\T`+>O,`"VKRP`
+MM:\H`+2O)`"SKR``LJ\<`+&O&`"PKR68H``$`&*2-0!`%"6P@``ED```!`!C
+M)O\`!"0A$'(```!$H`$`4B8@`$(J_/]`%"$0<@```&*.*0!`&"60```$`'0F
+M```"/```520!`!XD!@!W)D"`$@`A@!("@(`0`"```R8A&&,""`!DD`L`<9`A
+M$(0"``!2H`D`8I`E$$0`(1""`@``4J`0`*"O)2#``B4H8`(.``8D"?B@`B4X
+M(`(H`!`F(1B0`@``8J00`+ZO)2#``B4H8`(.``8D"?B@`B4X(`(A@/`"```"
+MI@$`4B8``&*.*A!"`M__0!1`@!(`/`"_CS@`OH\T`+>/,`"VCRP`M8\H`+2/
+M)`"SCR``LH\<`+&/&`"PCP@`X`-``+TG(P"B+((`0!#@`8@D```"/,@`0B2`
+M&`4`(1AB````8HP(`$````````@"@I0``.*L"`#@`R40```(`.`##0`")`@`
+MX`,-``(D`P`"D0$`0C@(`.`#`0!",`@`X`,-``(D"`#@`PT``B0*``*5``#B
+MK`@`X`,E$```"``"E0``XJP(`.`#)1```````HT"``,\50``$"000P````*-
+M`0`#/"000P!1```0`0!"+````HT&```00!<"`````HT#```0`!<"`````HW`
+M%@(`PQ<"`//_`R0D$$,`"`#@`PT`0B3X`8*,``#BK`@`X`,E$````0`")`L`
+MPE#\`8*$10#`$"40```"``(D"0#"4/X!@I0#``(D"0#"4``"@HP(`.`##0`"
+M)```XJP(`.`#)1``````XJP(`.`#)1``````XJP(`.`#)1```````HT$``,\
+M)0``$"000P````*-"``#/"$``!`D$$,`"`#@`PT``B0!``*1'0``$`$`0C``
+M``*-(``#/!@``!`D$$,````"C4```SP4```0)!!#``$``B01`,)03!*"C`8`
+MP%````*-`@`")`8`PE!($H*4"`#@`PT``B2```,\!P``$"000P```.*L"`#@
+M`R40```(`.`##0`")&@2@HPK$`(`(Q`"`//_`R0D$$,`"`#@`PT`0B04``*-
+M``#BK`@`X`,E$```#``")`@`X`,`````&0`")!,`HA`0`*./&@"B+`8`0!`>
+M``(D#P`")`<`HA`#``(D&@``$``````6`*)0:!*'K!8``!``````%`#"%`4`
+MXBP2`$`0`0`")`@`X`,``H>L`0`")`8`PA`K$`<``@`")`8`PE!($H>D"```
+M$`````!,$H*L"`#@`P$``B0(`.`#`0`")`@`X`,!``(D`P!@$``````,``(D
+M``!BK`@`X`,E$```R/^])S0`OZ\P`+ZO+`"WKR@`MJ\D`+6O(`"TKQP`LZ\8
+M`+*O%`"QKQ``L*\EL(``);B@`"7PP``EB.``)9#``P@`(BX<`$`4):``````
+M`CP``%4D@!`4`"$05P```%"4`@!3E``4$``E$%,```!"K@0`4B;\_S$F)2#`
+M`@GXH`(E*``"``!"K@0`$";\_S$F*QAP`@$`8S@$`"(N`0!"."088@#T_V`4
+M!`!2)@@`(B[H_T`0`0"4)B,07@(T`+^/,`"^CRP`MX\H`+:/)`"UCR``M(\<
+M`+./&`"RCQ0`L8\0`+"/"`#@`S@`O2?H_[TG%`"_KQ``L*\H`*./#0`")!0`
+MHA`L`+"/#@"B*`4`0%`=``(D"@"@4,@!@B0H```0)1```!0`HA!0$H(D'@`"
+M)!8`HA`E$```(@``$!0`OX\``&*L$``")````JX<```0`0`")````CS,#4(D
+M)2C`````9HP)^$`````'C@```JX3```0`0`")```8JP8``(D```"K@X``!`!
+M``(D!P#@5`0``R0$``(D```"K@``8XP$`H*,!0``$```8JP$`.,4)1``````
+MPHP$`H*L`0`")!0`OX\0`+"/"`#@`Q@`O2<$`*.,8P!@$"40`````,*,``"B
+MK`0`PHP(`**L"`#"C`P`HJP,`,*,$`"BK!``PXS__P(D!0!B$``!8BP!`$!0
+M_P`#)`,``!`4`*.L`@`")!0`HJP4`,.,__\")!$`8A`!!&(L`0!`4``$`R0!
+M``(D&`"BK"L00P`-`$!0&`##C!@`HHQ`$`(``0!"-!@`HJPK$$,`^_]`5!@`
+MHHP$```0&`##C!0`PHP8`**L&`##C/__`B01`&(0`01B+`$`0%``!`,D`0`"
+M)!P`HJPK$$,`#0!`4!P`PI0<`**,0!`"``$`0C0<`**L*Q!#`/O_0%0<`**,
+M!```$!P`PI3_`P(D'`"BK!P`PI0'`$`0"@`")!P`PY00`&(L`0!`4`\``R0"
+M```0(`"CI"``HJ0>`,*4!P!`$`H``B0>`,.4$`!B+`$`0%`/``,D`@``$"(`
+MHZ0B`**D(`#"C"0`HJPD`,*,*`"BK"@`PHPL`**L+`#"C#``HJP$`,.,!``"
+M)`4`8A0!``(D!`"CC`(`8E`X`*.L`0`")`@`X`,`````!`##C!X`8!`E$```
+M#`#"C`@`HJP``,*,``"BK`@`PHP$`**L#`#"C`@`HJP0`,*,#`"BK!0`PHP0
+M`**L&`#"C!0`HJP<`,*,&`"BK"``PI0<`**D(@#"E!X`HJ0D`,*,(`"BK"@`
+MPHPD`**L+`#"C"@`HJPP`,*,+`"BK`$``B0(`.`#`````.#_O2<<`+^O&`"R
+MKQ0`L:\0`+"O)9"``````CP``$(D"?A``"6`H``EB$``'``@$AP`OX\6`"*&
+M%`!`5!8`(I8```(\``!")"4@0`()^$``)2@``B6`0`#``4*.)2!``@GX0``E
+M*"`"```#/%0!8R1`@!``(8`#`@```Y8A&&(``!P#``4``!`#%`,`&``CEB$0
+M0P``%`(``Q0"`!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])\#_O2<\`+^O.`"^
+MKS0`MZ\P`+:O+`"UKR@`M*\D`+.O(`"RKQP`L:\8`+"O):"``"7P```0`*"O
+M);@``!0`H*\P$H*.0@!`$"60``````(\5`%6)(`1$@`A@(("1@("AC8`000P
+M`A$F)2"``@```SP``&,D"?A@`"4H(`(EJ$``P`&"CB4@@`()^$``)2@@`D`8
+M%0`A&'8`1@($E@``<Y0A(),`(1!$```4`@`#'`(`,@("E@`!0C`/`$`0*A!W
+M`!\`0%`!`%(F);A@`,`!@HXE((`""?A``"4H(`)&`@.6(1AB`",88P(`'`,`
+M`QP#`!(``!`4`*.O*A!^`!``0%`!`%(F)?!@`,`!@HXE((`""?A``"4H(`)`
+M(!4`(2"6`!8`(Y8A&&(```""E",00P``%`(``Q0"`!``HJ\!`%(F,!*"CBL0
+M0@+#_T`4@!$2`"60``"`$1(`(8""`D8"`H8.`$$$,`(1)L`!@HXE((`""?A`
+M`"4H(`(E($``,@("E@`!0C`4`*6/`P!`%"$8A0`0`**/(1B"`!@`(Z8!`%(F
+M0`!"*NS_0%2`$1(`/`"_CS@`OH\T`+>/,`"VCRP`M8\H`+2/)`"SCR``LH\<
+M`+&/&`"PCP@`X`-``+TG__^E,/__QC```(*4`C!"+````SP#`$`4L`%H)```
+M`CS(`4@D)2```&0`"B3K40D\'X4I-4`0!``A$$@```!"E!@`1@`2&```(Q!"
+M`0`````8`$4`$A```"$88@``````&`!I`!`0``!#$0(`PQ\#`",00P```.*D
+M`0"$)`L`@BCL_T`4`@#G)`@`X`,`````__^E,/\``R03`*,0_P`")```@Y0#
+M,&,L@!`%`"$010#`$D(D#`!@$/__0C`_`*(L!0!`%(`0!0`A$$4`(A5")`@`
+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
+MHI0^`$`0)3@```0`F24&`(TE"`"*)00`&"0!``\D!0`.)$`0!P`A&*(```!D
+ME"$8@@$``&2D(1!'```9`@`A$$,`0!`"`!@`0B0A&((!``!DI"$0(@,``$ND
+M)4```"4@``!`$`<`(1!'```9`@`A$$,`0#`"`$`0!``A$$0`P!`"`"$01@`8
+M`$,D(1"C`0``1*0'$(D``0!",`<`0!`A&$,!`0`")?__2#`)``\5``!XI`<`
+M`!```&ZD0!`$`"$01`#`$`(`(1!&`"$02@`8`$"D`0"")/__1#`$`((LYO]`
+M%$`0!``!`.(D__]',!0`HI0K$.(`R_]`%$`0!P`(`.`#`````.C_O2<0`+*O
+M#`"QKP@`L*\ED*``)8C``*W>`C0``**G`@"BIP0`HJ<&`**G)8```!8`))8E
+M:````P`%)",8K0`'$&0``0!",`0`0!!`$!``(1"B`P``0Z0!`!`F`0"B)?__
+M33`$`*(M]?]`%",8K0`4`$*6%``BIO__0C!.`$`0)7```$`0#@`A$$X``!D"
+M`"$00P!`$`(`(1A"`A@`>"0A$%$`&`!CE!@`0Z0\```2)6@``$`0#@`A$$X`
+M`!D"`"$00P!`R`(`!``/)T`@#0`A$*0#``!"E$`8`@`A&&(`P!@#`"$8(P,A
+M&'$`(1"/``@`0H2`$`(`+`!BI"$@Y`$``(*4(@!BI`$`""0@`&*4*Q`"`1T`
+M0!`>`&PD!@"+)00`"B<$`(DE0"@(`"$XJP`E,.``@"`(`"$@C0!`(`0`(1"*
+M`#``0X1`&`,`!@#"E"$00P`(`.*D(3`E`2$HJ0`A((H`_O^CE`@`@I0A&&(`
+M``##I`$``B7__T@P`@""E2L0`@'I_T`40"@(``$`HB7__TTP*Q"P`<W_0!1`
+M(`T``0#")?__3C`4`"*6*Q#"`;7_0!1`$`X``0`")!``LH\,`+&/"`"PCP@`
+MX`,8`+TGP/^])S@`OZ\T`+6O,`"TKRP`LZ\H`+*O)`"QKR``L*\EH(``)9B@
+M``0``B08`**G!@`")!H`HJ<)``(D'`"BIPP``B0>`**G):@``````CP``$(D
+M"?A``!0$!"0E@$``C```$B40H`(6`&*6+0!`$-``<I8```(\``!")"4@``()
+M^$``%`0%)&@`8I86``*F"@`")!``HJ\4`*"O```"/"`C0B0E((`")2A@`B4P
+M``()^$``)3A``G``0!``````9`UQ)F@`8I9Z#6*F```"/-PI0B0E("`""?A`
+M`"4H``(```(\0"M")"4@@`(E*``""?A``"4P(`)@`$`0`````!H``I9`$`(`
+M(1!=`!8`0Y04``*6&`!#`!(0```AD$("!0!2)AH`8I8M`$`0```"/```0B0E
+M(``""?A``!0$!21J`&*6%@`"I@0``B00`**O`0`")!0`HJ\```(\("-")"4@
+M@`(E*&`")3```@GX0``E.$`"00!`$`````!X$7$F:@!BEHX18J8```(\W"E"
+M)"4@(`()^$``)2@``@```CQ`*T(D)2"``B4H``()^$``)3`@`C$`0!``````
+M&@`"ED`0`@`A$%T`%@!#E!0``I88`$,`$A```"&00@("`%(F'`!BEB0`0!``
+M``(\``!")"4@``()^$``%`0%)&P`8I86``*F!``")!``HJ\"``(D%`"BKP``
+M`CP@(T(D)2"``B4H8`(E,``""?A``"4X0`(2`$`0`````(P5<29L`&*6HA5B
+MI@```CS<*4(D)2`@`@GX0``E*``"```"/$`K0B0E((`")2@``@GX0``E,"`"
+M`@!`$``````!`!4D!```$@```CP``$(D"?A``"4@``(E$*`".`"_CS0`M8\P
+M`+2/+`"SCR@`LH\D`+&/(`"PCP@`X`-``+TGP/^])SP`OZ\X`+ZO-`"WKS``
+MMJ\L`+6O*`"TKR0`LZ\@`+*O'`"QKQ@`L*\ED*````!"E@!`0BP+`$`4)9B`
+M`"X`0Y8!``(D"`!B5```0I8```(\H!Q")`GX0```````Q0``$#P`OX\``$*6
+M`%!"+`P`0!0EN```+@!#E@(``B0)`&)4``!"E@```CP0+4(D)2!@`@GX0``E
+M*$`"M@``$#P`OX\``$*6`S!1+".($0"P_P(D)(@B`@$``B00`.(24`$Q)@(`
+MXBH%`$`0`@`")`<`X!(%`#$FI@``$"40```/`.)2'`!"EA0``!`E$```=@%5
+MEG@!4"82```08@%6)AH`0I:7`$!0`0#W)C<`,2:``U66/@10)@H``!"(`U8F
+MD`!`4`$`]R9&`#$F@`-5EJ(#4"8#```0@@-6)HX``!`\`+^/A@"@$B6@````
+M``(\4!1>)$`0%``A$%8```!"E````J8E*"`"`0`Q)J`!8HXE(&`""?A``!``
+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
+M0!`0`*.7@A,#`"X`(J9"$P,``0!",,@`(JX"&P,``0!C,,P`(ZX0`**7_P]"
+M,#``(J8E*``"`0`0)J`!0HXE($`""?A``!``IB<5`T`0/`"_CQ``HI?_#T(P
+M)``BIA``HI>"$P(``0!",",`(J(``"*6`%!"+`L`0!0EH```H`%"CB4@0`("
+M``4F"?A``!``IB<"`T`0):```!``HI<"$0(`T``BI@0`,R8&`#4F`@`7)```
+M`CQ`%58D@!`4`"$07@`(`%",)2@``@$`$":@`4*.)2!``@GX0``0`*8G[P)`
+M$$`@%``A*)$`$`"CEP(2`P!_`$(P,@"BI"40H`""&`,`/P!C,#@`0Z0A(),`
+M$`"BEP`1`@`_`$(P<`""I"4H``(!`!`FH`%"CB4@0`()^$``$`"F)]D"0!!`
+M,!0`<`#$)"$@9`(0`*.7`BL#````@I0E$$4```""I"$0TP""&0,`/P!C,'8`
+M0Z0E,$``$`"BES\`0C!\`,*D)2@``@$`$":@`4*.)2!``@GX0``0`*8GP@)`
+M$$`@%``A*),`$`"CEX(2`P""`**D)1"@``(9`P`_`&,PB`!#I"4@0``0`**7
+M@!`"`#\`0C".`(*D)2@``@$`$":@`4*.)2!``@GX0``0`*8GK0)`$$`P%`".
+M`,0D(2!D`A``HY>"*P,```""E"4010```(*D(2#3``(2`P`_`$(PE`""I"40
+M@`""&`,`/P!C,)H`0Z0E,$``$`"BEP`1`@`_`$(PH`#"I"4H``(!`!`FH`%"
+MCB4@0`()^$``$`"F)Y$"0!!`,!0`H`#$)"$@9`(0`*.7`BL#````@I0E$$4`
+M``""I"$0TP""&0,`/P!C,*8`0Z0E,$``$`"BES\`0C"L`,*D)2@``@$`$":@
+M`4*.)2!``@GX0``0`*8G>@)`$!``HY<A$)4"`AH#`%``0Z`!``(D%@""$@(`
+M@BH%`$`0``````<`@!(0`**7'@``$``````6`)<2$`"BEQH``!``````0AD"
+M``<`8S#P`".F@A`"``<`0C#R`"*F$`"BET`0`@`'`$(P#P``$.P`(J80`**7
+M`A$"``<`0C#T`"*F$`"BEP<`0C`'```0]@`BI@(1`@`'`$(P^``BIA``HI<'
+M`$(P^@`BIAP`@!8E*``"`0`0)J`!0HXE($`""?A``!``IB=(`D`0$`"CE\(C
+M`P#L`"*6)1!$`.P`(J8"$P,`!P!",.X`(J9"$@,`!P!",.@`(J:"$0,`!P!"
+M,.H`(J;"&`,`!P!C,.0`(Z80`**7!P!",.8`(J8E*``"`0`0)J`!0HXE($`"
+M"?A``!``IB<M`D`00!@4`"$@=0`0`**7`A("`#@`@J0A&',`$`"BDT``8J0E
+M*``"`0`0)J`!0HXE($`""?A``!``IB<>`D`00!@4`"$@<0`0`**7`A("`$H`
+M@J0E&(``$`"BDU``8J0E*``"`0`0)J`!0HXE($`""?A``!``IB</`D`0(1B1
+M`A``HI<"$@(`60!BH$`0%`!8`$(D(2!B`A``HY.``&(P`P!`$```@Z0`_V(T
+M``""I"4H``(!`!`FH`%"CB4@0`()^$``$`"F)_L!0!!`(!0`(2B1`!``HY="
+M$0,`_P!",&(`HJ1H`(0D(1`D`D(8`P`/`&,P``!#I"$@I`(0`**7`0!",```
+M@J0``"*6`$!"+`X`0%0``"*6!0"`$A``HI<'`)=20A,"``@``!```"*60A,"
+M``$`0C`#```0)@`BI@$`0C`H`"*F```BE@,P0BPM`$!4```BEB4H``(!`!`F
+MH`%"CB4@0`()^$``$`"F)]$!0!`0`*.70!`4`"$050""&0,`?P!C,+``0Z0!
+M``(D"P""$@(`@BH%`$`0`````!8`@%(0`**7%P``$```(I8+`)=2$`"BEQ,`
+M`!```"*6$`"BEP<`0C#\`"*F$`"BE\(0`@`'`$(P"@``$``!(J8'`$(P_@`B
+MIA``HI?"$`(`!P!",`,``!`"`2*F/P!",!(`(J8``"*6!#!"+"P`0!1`$!0`
+M0!@4`"$8<P`0`**70A,"`+@`8J0E*``"`0`0)J`!0HXE($`""?A``!``IB>=
+M`4`00"`4`+@`A"0A(&0"$`"CE\`8`P`X`&,P``""E"400P`)`)<6``""I!``
+MHY?"$`,`(@`BH@``(I8&0$(L`@!`%,(2`P`L`"*F$@"`%@``(I8`0$(L^`!`
+M5`$`E"80`*.7`A(#`#\`0C!&`2*FPA@#`!\`8S`&```02@$CIB$04P`*``,D
+MN`!#I`\``B0B`"*B```BE@!`0BSG`$!4`0"4)@$``B0+`((2`@""*@4`0!``
+M````I`"`4@``(I;>```0`0"4)B8`EQ(E*``"V@``$`$`E"8E*``"`0`0)J`!
+M0HXE($`""?A``!``IB=A`4`0)2`@`@GXP`(0`*635`$BIA``I9<E("`""?C`
+M`@(J!0!6`2*FH`%"CB4@0`(E*``""?A``!``IB=2`4`0)2`@`@GXP`(0`*63
+M6`$BI@``(I8!0$(LO`!`5`$`E"80`**7`A("`#\`0C"V```0Q``BI@$`$":@
+M`4*.)2!``@GX0``0`*8G/P%`$"4@(`()^,`"$`"EDTX!(J80`*67)2`@`@GX
+MP`("*@4`4`$BIB4H``(!`!`FH`%"CB4@0`()^$``$`"F)R\!0!`E*``"$`"B
+MEW\`0C`0`"*F$`"BE\(1`@`_`$(P%``BI@$`$":@`4*.)2!``@GX0``0`*8G
+M(0%`$"4@(`()^,`"$`"EDU(!(J8``"*6`4!"+`4`0!0E*``"$`"BEP(2`@`_
+M`$(PQ@`BI@$`$":@`4*.)2!``@GX0``0`*8G$`%`$#P`OX\0`**70A$"`#\`
+M0C!(`2*F$`"BEQ\`0C!,`2*F```BE@)`0BQU`$!4`0"4)B4H``(!`!`FH`%"
+MCB4@0`()^$``$`"F)_T`0!`\`+^/$`"BDRH`(J8``"*6`%!"+&<`0%0!`)0F
+M$`"CEP(2`P!_`$(PU@`BIL(;`P#:`".F)2@``@$`$":@`4*.)2!``@GX0``0
+M`*8GZ`!`$!``HY<?`&,P0!@#`-H`(I8E$$,`V@`BIA``HY="$0,`/P!",.(`
+M(J;"&@,`W0`CHJ`!0HXE($`")2@``@GX0``0`*8GUP!`$#P`OX\0`**3!P!"
+M,$`1`@#=`".2)1AB`-T`(Z(0`**7PA`"`#P``!#?`"*B`4!"+#H`0%0!`)0F
+M)2@``@$`$":@`4*.)2!``@GX0``0`*8GP@!`$#P`OX\0`**7/P!",,(`(J8`
+M`"*6`%!"+"L`0%0!`)0F$`"CEX(1`P!_`$(PU``BID(;`P#8`".F)2@``@$`
+M$":@`4*.)2!``@GX0``0`*8GK`!`$!``HY<'`&,PP!@#`-@`(I8E$$,`V``B
+MIA``HY?"$`,`/P!",.``(J9"&@,`W``CHJ`!0HXE($`")2@``@GX0``0`*8G
+MFP!`$#P`OX\0`**3`0!",,`1`@#<`".2)1AB`-P`(Z(0`**70A`"`-X`(J(!
+M`)0F`P""*I7]0!2`$!0````BE@,P0BP=`$`0!``")*`!0HXE($`"[``%)`GX
+M0``0`*8G@@!`$"4@0`(0`**7!P!",/P`(J80`**7PA`"``<`0C```2*FH`%"
+MCNT`!20)^$``$`"F)W8`0!`\`+^/$`"BEP<`0C#^`"*F$`"BE\(0`@`'`$(P
+M`@$BI@0``B1@`2*F`0`")%X!(J9<`2*F6@$@IA0`T(\$`2*6%@!`$"6@```&
+M`#,F)2@``@$`$":@`4*.)2!``@GX0``0`*8G6P!`$$`8%``A(',`$`"BEP(2
+M`@```8*D)1B``!``HI,"`6*D`@"4)@0!(I8J$(("[O]`%"4H``(``"*6`U!"
+M+!P`0%0``"*6):````8`,R:@`4*.)2!``B4H``()^$``$`"F)T(`0!`0`*.7
+M@!`4`"$04P"(`T.DH`%"CB4@0`(%``4F"?A``!``IB<X`$`0$`"CEX`0%``A
+M$%,`B@-#I`$`E"8%`((JZ?]`%`$`$"8``"*6`S!"+`P`0%```"*6RO\")%P`
+M(J;__P(D7@`BIF``(J8/``(D1``BIAP``B1&`"*F2``BI@``(I8`0$(L"0!`
+M%*`!0HXE($`"R@`%)`GX0``0`*8G"@!`5!``HI<8```0/`"_CR4@0`+/``4D
+M"?A``!``IB<2`$`0/`"_CQ``HI<8`"*F%@`BE@P`0!0!``(D```BE@!`0BP%
+M`$`4&``BEL(2`@`!`$(P`P``$!8`(J;"$P(`%@`BI@$``B0\`+^/.`"^CS0`
+MMX\P`+:/+`"UCR@`M(\D`+./(`"RCQP`L8\8`+"/"`#@`T``O2?@_[TG&`"_
+MKQ0`L:\0`+"O)8"``````CQH.D(D"?A``"6(H``7`$`0)2```@```CQX%4(D
+M"?A``"4H(`(1`$`0)2```@```CS(+T(D"?A``"4H(`(+`$`0)2```@```CQL
+M,T(D"?A``"4H(`(%`$`0)2```@```CPD-D(D"?A``"4H(`(8`+^/%`"QCQ``
+ML(\(`.`#(`"])^C_O2<0`+^O)1B@````8I0`0$(L"0!`%!``OX\N`&.4`0`"
+M)`4`8A0```(\]"%")`GX0```````$`"_CP@`X`,8`+TG`````````````(.4
+M``"BE`<`8E0``(24`@""E/#!1#`"`**4\,%",`(``!`C(((`(R""``@`X`,E
+M$(``"`*"E`@`X`/_OT(P)2@``,`0!0`A$$0```!#C`0`0HPE&&(`!@!@%"40
+M```!`*4D`@"B*/?_0%3`$`4``0`")`@`X`,`````Z/^])Q``OZ\```(\M$E"
+M)`GX0```````)2A```"`HC`1`$`0)2```/]_I3````(\F!I&)(`0!``A$$0`
+M@!`"`"$01@```$.4$P!E$`$``B0!`(0D@P""+/?_0%2`$`0`#0``$"40````
+M``(\.!%&)$`1!``A$$8```!#E`8`91`!``(D`0"$)$L`@BSY_T`40!$$`"40
+M```0`+^/"`#@`Q@`O2?H_[TG%`"_KQ``L*___[`P)@``$@$``B0```(\M$E"
+M)`GX0```````)2A```"`HC`&`$`0__\"//]_0C0D$*(`)A`"`AD``!`!`$(L
+M_P&B.`$`0BP!`*,L)1!#`!,`0!0!``(D)2```````CR8&D8D@!`$`"$01`"`
+M$`(`(1A&````8I0%``)6`0"$)`(`8Y0&`&40`0`")`$`A"2#`((L]/]`%(`0
+M!``E$```%`"_CQ``L(\(`.`#&`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O)8B@
+M`)P!@HP)^$``)9#``"6`0`!"``(R!P!`$"```C((`"*.!`!`%"```C*]_P(D
+M)(`"`B```C('`$`0"``",@P`(HX$`$`4"``",M__`B0D@`(""``",@<`0!`!
+M``(R!``BC@0`0!0!``(R]_\")"2``@(!``(R!P!`$````CS`24(D"?A``"``
+M1"8"`$`0_O\")"2``@(E$``"'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TG8/^]
+M)YP`OZ^8`+*OE`"QKY``L*\ED(``)8@``````CPT34(D"?A``/__I#`E@$``
+M#P``$@```CS03D(D)2!``B4H``)__P8T"?A``!``IR<'`$`0```"/%Q+0B0E
+M($`")2@``@GX0``0`*8G)8A``"40(`*<`+^/F`"RCY0`L8^0`+"/"`#@`Z``
+MO2?H_[TG%`"_KQ``L*\```(\M$E")`GX0``E@(``)1A``!(``B03`&(0`0`"
+M)!,`8B@%`$!0_P$")`D`8!`E$```#0``$!0`OX\%`&(02H,"-`@`8E0E$```
+M!@``$`$``B0*`@262@,#)`(`@Q`!``(D)1```!0`OX\0`+"/"`#@`Q@`O2?_
+M_X0P)2@``````CR8&D8D@!`%`"$010"`$`(`(1!&````0Y0&`&00``````$`
+MI22#`*(L]_]`5(`0!0`E$```"`#@`P````#@_[TG&`"_KQ0`L:\```(\M$E"
+M)`GX0``0`+"O)8A```"`(C('`$`0_W\P,@```CPT34(D"?A``"4@``(3`$`4
+M)1```B4@``````(\.!%%)$`9!``A$&4```!"E`<`450!`(0D(1!E`!@`0Y0'
+M`&`4)1!@`$L`!"0!`(0D2P""+/3_0!1`&00`)1```!@`OX\4`+&/$`"PCP@`
+MX`,@`+TGZ/^])Q``OZ\E.*``)1@``````CS8)$8D```"/```2"3`$0,`(2A&
+M````HI0(`$14`0!C)`H`X%`!``(D)2#@``GX``&```8D!0``$`$``B0Q`&(L
+M\_]`%,`1`P`E$```$`"_CP@`X`,8`+TG)2@``````CP#`(`4.!%&)`@`X`,E
+M$```0!$%`"$01@```$.4!@!D$`$``B0!`*4D2P"B+/G_0%1`$04`)1````@`
+MX`,`````R/^])S0`OZ\P`+ZO+`"WKR@`MJ\D`+6O(`"TKQP`LZ\8`+*O%`"Q
+MKQ``L*\E\(``):B@`"6PX`#__]<P)8```"6(```EF`````"BEA@`0!0EH```
+M```"/+1)0B0)^$```````"600```@$(R$0!`5`(`I)8```(\'$Y")"4@0`()
+M^$``)2@```H`0!0E($`"```"/(A.0B0)^$``)2!``@0`0%`"`*26`@``$"4@
+M0`("`*26`/^",$@`0!0```(\)3```"4X``````(\.!%%)$`1!@`A&$4```!B
+ME`,`1!0!`,8D)9A@``$`!R1+`,(L`0#C+"000P#V_T`40!$&`$X`X!`E$```
+M@`#B,@4`0%0$`&26`@!DE@@`<(X#```0)8@```P`<(XEB```)3```"4X````
+M``(\7`!))````CQ@`$@DP!`&`"$01@"`&`(`(2AI````HI0(`$04`0#&)"$0
+M:`#8`<./``!"C`,`8A0`````):"@``$`!R0"`,(L`0#C+"000P#O_T`4P!`&
+M`!$`X!"``.(R"0!`5!``@HX(`(*.)1@``"2``@(DB","#`""CB6``@('```0
+M)8@C`B48```D@`(")(@C`A0`@HXE@`(")8@C`@```CP<3D(D"?A``"4HP`(5
+M`$`0-`"_CQ``PHX4`,..$`!DCA0`98XD$$0`)!AE`!``PJX4`,.N`@"BE@#_
+M0C`!`$4L)1`P`@(`0!`E&````0`#)"00HP`!`$!4&`#0K@$``B0T`+^/,`"^
+MCRP`MX\H`+:/)`"UCR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`S@`O2?#-P0`
+M@C8&`"$PA@"#,08`@!$&`",@@@````,D`0`")(`^!``$`.$$``````1(@@`'
+M```0)4````0`X!`$2(,`(S@$``8XX@`E2"<!!$""`"40``$E&"`!P#`&`"$P
+MQ0```,2,!`#%C"001``D&&4`)1!B``@`X`,K$`(`_P#G,!<`X!`E&(``#P"@
+M$"4@`````&*0$@!'$``````*`$`0``````$`A"0K$(4`!@!`$"$09````$*0
+M"0!'$`````#Y_T!4`0"$)`4`A1`A$&0```!'H```PHP!`$(D``#"K`@`X`,`
+M````8/Z])YP!OZ^8`;ZOE`&WKY`!MJ^,`;6OB`&TKX0!LZ^``;*O?`&QKW@!
+ML*\E\(``I`&EKZ@!IJ^L`:>OQ`&RC[P!L)?``:*76`&BKU@;`R1@`:.O,`+%
+M)V0!I:\```(\_$E")`GX0``EB```J`%`$)P!OX\```(\?$U")`GX0``E(,`#
+M"@+"I___0C`+`$`4```"/````CR@2D(D)2#``PGX0``E*``"F0%`$)P!OX__
+M/P(R"@+"IP```CP@8$(D"?A``"4@P`,```(\-$U")`GX0``*`L27)8!``(L!
+M`!(E(,`#```"/-!.0B0E*``"?_\&-`GX0``0`*<G@P%`$"4@P`,```(\T$Y"
+M)"4H``*```8D"?A``)``IR=\`4`0G`&_CQ@`HH\<`*./```%)`4`!"0D$$0`
+M)!AE`"408@`!`$!4`0`1)!@`HH\<`*./```%)`(`!"0D$$0`)!AE`"408@`!
+M`$!4`@`1)`P"PH\!`")6#`+1KP```CQ<2T(D)2#``R4H``()^$``$`"F)P,`
+M0!9<`:*O$``0EF`!L*^H`::/00#"+`,`0!0EL```0``')*@!IZ_@`<*/0D4"
+M``$`"#%L`:BO@A4"``$`0C!H`:*O```"/"`"5R0```(\.`)")"L0X@(-`4`0
+M````````XI98`:./)!!#``(!0%`$`/<F``#BEEP!I(\D$$0`_`!`$!`!IB>8
+M`<*/)2#``P(`Y98)^$``$@&G)_4`0!`$``(D``#CEB8`8A`%`&(H"`!`$"``
+M`B0!``(D&@!B$`(``B01`&)0$`"R)^H``!`$`/<F*0!B$)``LB<A`&(H!@!`
+M$$```B0(``(D'0!B4/``M"?@```0!`#W)B,`8E`0`+(GW```$`0`]R9``+0G
+M```"/%@'0B1P`:*O`@!"DB```!`#`%,T$`"R)S``M"<```(\F`I")'`!HJ\9
+M```0`@!3DI``LB?@`+0G```"/#@$0B1P`:*O`@!"DA$``!`!`%,T```"/)@!
+M0B1P`:*O`@!"D@L``!`"`%,T``&T)P```CP$```0^`!")%``M"<```(\6`="
+M)'`!HJ\"`$*2!`!3-```!3S`2:4D"?B@`"4@@`*P`$!4!`#W)B6H```E(*`"
+M```&/#Q1QB0)^,``)2B``J,`0!!`$14`<`&GCR&`X@"P`:2/M`&EC[@!IH\`
+M``@\N%$()0GX``$8``>2```1E@(``I8K$%$`E@!`5`$`M280`:*7*Q`B`HL`
+M0%0'``*2$@&BERL040"'`$!4!P`"D@8`!)(*`((X`0!"+&P!I8\!`*,L)!!#
+M`'\`0%0'``*2!0"".`$`0BQH`::/`0##+"000P!X`$!4!P`"D@<``Y(A&","
+M0Q@#`&`!IX\*`.(D*A!#`'``0%0'``*2J`&HCRL0R`)]`$`0R`&ECQ```HX4
+M``..PA<#``$`I"PD(((`9`"`%"48```8`$*.@`!",`0`0!`&``(DW`'#CUX`
+M8E`'``*2&`&D)P``!CP``,8D"?C``$``!208`;&G`@#DEAH!I*<&``.2!0`"
+M)`8`8A`*``(D"`!B5`0``I(`0((T!```$!H!HJ<:`:*7`(!"-!H!HJ<$``*2
+M'0&BHP4``I(R`:*C&`!"CC0!HJ\X`;.O$``"CA0``XX0`$2.%`!%CB001``D
+M&&4`)1!B``0`0!`:`:*7``)"-`,``!`:`:*G__U",!H!HJ<(``*.#``#C@@`
+M1(X,`$6.)!!$`"0890`E$&(``P!`$`(``B0"```0'`&BHQP!H*,(``*.#``#
+MC@@`1(X,`$6.)!!$`"0890````4D`@`$)"001``D&&4`)1!B``,`0!`<`:*3
+M"`!"-!P!HJ,8`$*.0`!",`4`0%"`$18`'`&BDP0`0C0<`:*C@!$6`&0!IX\A
+M$$<`&`&C)U@!I"<``&B,!`!EC`@`9HP,`&>,``!(K`0`1:P(`$:L#`!'K!``
+M8R3V_V04$`!")`$`UB8'``*2(1`B`O__43`"``*6*Q!1`&[_0!`0`:*7`0"U
+M)H``HBI5_T!4)2"@`@0`]R8```(\```"/#@"0B0K$.("]OY`5```XI8U`,`2
+M00#"+@$`0%!``!8D```"/`!<0B1D`:2/)2C``D``!B0```<\"?A``(!)YR0P
+M$M:O$P#`&B4H``#`(`4`I`&HCR$@B`"`&04`9`&BCR$88@```&*4``""I`(`
+M8I0"`(*D!`!BD`0`@J`%`&*0!0""H`$`I20J$+8`\/]`%,`@!0"\`<*/)2#`
+M`Z0!I8\)^$``)3#``@\`P!HE*```@"$%`&0!HX\A((,`P!@%`*0!IH\A&&8`
+M!@!BD`8`@J`'`&*0!P""H`$`I20J$+8`]/]`%(`A!0"L`:>/``#VK`H"PI<8
+M`,*G*Q`6`)P!OX^8`;Z/E`&WCY`!MH^,`;6/B`&TCX0!LX^``;*/?`&QCW@!
+ML(\(`.`#H`&])P(`HI0T$H:,$0#`$/#!2#```,.4``"BE`X`8A0P`H<D`@##
+ME/#!8C`+`$A4,!*$C`0`PI`!`$(P`P!`$`(`8S`E`&`4)1````@`X`,E$,``
+M,`*')#`2A(P?`(`0)1``````I91#$`0`@!$"`"$PX@```,*4(Q"B``\`0!0`
+M`````@##E/#!8C`)`$A4`@#"E`0`PI`!`$(P`P!`$`(`8S`-`&`4)1````@`
+MX`,E$,``\,%",",0`@$$`$!80R`$`$``QR3__X0D0R`$`.;_@%1#$`0`)1``
+M``@`X`,`````Z/^])Q0`OZ\0`+"O```"/```0B0)^$``)8#```H`0%`E$```
+M&@!"@$`0`@`C$`("`!8"``,6`@`"`$$$)1A``"48```E$&``%`"_CQ``L(\(
+M`.`#&`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@``EF*``"@(BEB8`
+M0!3_`!`D```"/+1)4B0)^$`"`````/``0C!@``,D!P!#4`(`8I8)^$`")2`@
+M`ID!`R0:`$,4```"/`(`8I:@`$(PH``#)"<`0Q#A`!`D`@!BEM``0C#```,D
+M(@!#$.(`$"0"`&*6T`!",-```R0=`$,0Y``0)`(`8I90`4(P4`%"."N``@`C
+M@!``_?\")"2``@(4```0XP`0)@```CP``$(D)2`@`@GX0``E*&`"#0!`$,``
+M`R0@`%",`@!BEL``0C`)`$,4)1```@\``S(!``(D!0!B%"40``+P_P(D)(`"
+M`@(`$#8E$``"(`"_CQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])^C_O2<0`+^O
+M```"/```0B0)^$```````"480``$`&`0)1```!P`8HR"$`(``0!",!``OX\(
+M`.`#&`"])]#_O2<L`+^O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6@
+MP``EL.``):B``/__LR0;`&`2(9"T`BL0L@(5`$`0)8A``B.`-`(E(``""?C`
+M`B4H(`(0`$!8__]S)B4@(`(E*(`"```#D@``@I````*B`0`0)@``@Z#__Z4D
+M^?^@%`$`A"0CB#0"*Q"Q`N[_0%0C@#0"__]S)N?_8!8AD%0"+`"_CR@`MH\D
+M`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#,`"])]C_O2<@`+^O'`"QKQ@`
+ML*\E@(``)8@``J`!`H[!``4D"?A``!``IB<6`$`0$`"EEP!`I2PC*`4`!0"E
+M,*`!(HXE("`"R@"E)`GX0``2`*8G#0!`$"``OX\0`**7`$!"+`4`0!02`**7
+MPA("``$`0C`#```0/!("KL(3`@`\$@*N/!("CB``OX\<`+&/&`"PCP@`X`,H
+M`+TGZ/^])Q0`OZ\0`+"O```"/+1)0B0)^$``)8"``"480`!(``(D,`!B$```
+M`CQ)`&(H#P!`$(V!`C1"`&(H"`!`$$,``B1``&(H)P!`$````CP:`&`0)1``
+M`"D``!`4`+^/(0!B4````CPD```0)1```"H00P`-`$`4CX$"-(B!`C0J$&(`
+M&`!`$````CQ-`&(H&@!`$"40``!*`&(H%P!`5"40```0```0```"/!,`8E0E
+M$```#```$````CP*`@.6B`%B*`T`0!0E$```C@%B*`4`0!0```(\CP$")`<`
+M8E0E$``````"/,Q<0B0)^$``)2```@(``!`4`+^/%`"_CQ``L(\(`.`#&`"]
+M)]C_O2<D`+^O(`"RKQP`L:\8`+"O)9"``/__L3`E@$`"H`$"CL$`!20)^$``
+M$`"F)R,`0!````(\)2```*0`120```(\I@!&)````CRH`$<D```"/'Q-2"1`
+M$`0`(1!$`$`8`@`A$&4```!"E!$`450!`(0D$`"BEP-00BP$`$!00!`$`"$0
+M9@`%```0``!"E"$01`!`$`(`(1!'````0I0(`@*F"?@``24@0`($```0"@("
+MI@X`@BSH_T`40!`$`"0`OX\@`+*/'`"QCQ@`L(\(`.`#*`"])]C_O2<D`+^O
+M(`"RKQP`L:\8`+"O)9"``/__L3`E@$`"H`$"CL$`!20)^$``$`"F)R,`0!``
+M``(\)2```#``120```(\,@!&)````CPT`$<D```"/'Q-2"1`$`0`(1!$`$`8
+M`@`A$&4```!"E!$`450!`(0D$`"BEP-00BP$`$!00!`$`"$09@`%```0``!"
+ME"$01`!`$`(`(1!'````0I0(`@*F"?@``24@0`($```0"@("I@<`@BSH_T`4
+M0!`$`"0`OX\@`+*/'`"QCQ@`L(\(`.`#*`"])^#_O2<8`+^O%`"QKQ``L*\E
+M@(`````"/&1=0B0)^$``)8@``A,`0!`8`+^/Y`$"C@$`0C`0`$!0%`"QCP@"
+M!98&`*`0```"/'!>0B0)^$``)2```@<``!`8`+^/```"/$A?0B0E(``""?A`
+M``H")988`+^/%`"QCQ``L(\(`.`#(`"])P```````````````$#_O2>\`+^O
+MN`"^K[0`MZ^P`+:OK`"UKZ@`M*^D`+.OH`"RKYP`L:^8`+"O)9B@`"6HP``E
+ML.``T`"^C___D3````(\``!")`GX0``(%`0D)9!``)0!0!("`!`D):!``@``
+M`CP``$(D)2!``@``!3Q``J4D"?A``'`2!B0,`%.N$`!5KA0`5J[(`5&FR@%`
+MICP``B3\`4*F``)`K@,``B0T$T*N]!-`K@`'`B3X$T*N__\")/P30JX`%$*N
+M!!1"K@```CP``$(D)2!``@GX0``E*```=`%`$`,`$"0!``(DS`&"K@``$#P`
+M`!`F)2"``@GX``(@0`4D_P!",-`!@J8E((`""?@``AB8!332`8*FU@&`I@``
+M`CP``$(D)2"``M"8!30)^$``%AP&)"6(``````(\``!0)"4@@`*`F`4T"?@`
+M`@$`!CP!`#$F!``B+OK_0!0E((`"```0/```$"8)^``"`)P%-````SP``&,D
+M`B<"``GX8``$``4D`0!")-0!@J8E((`""?@``A!`!20EN$`````"/```0B0E
+M((`"$$`%)`GX0``!`.8V```"/```0B0E((`"/0`%)`GX0`"0`*8G,@%`$`@`
+M$"20`*.7I5H")"X!8A0$`!`D```"/```0B0E((`"/P`%)`GX0`"0`*8G)@%`
+M$`@`$"20`**7<A)"I@```CP``$(D)2"``L$`!20)^$``D`"F)QP!0!"0`**7
+M`A,"`'`20J;__T,P`0`")!8!8A0%`!`D)9@``"6(```0`+`G```"/```521`
+M,!$`)2"``L``)28)^*`"(3`&`@D!0!!`$!$`(1`"`@``0I0FF&("`0`Q)D``
+M(B[T_T!40#`1`/__`C0``6(6!P`0)````CP``$(D)2"``K\`!20)^$``D`"F
+M)_@`0!`(`!`DD`"BDP@"@J84`**7=!)"IA8`HI=V$D*F&`"BDW@20J(8`**7
+M`A("`'D20J(:`**3>Q)"HAH`HI<"$@(`>A)"HAP`HI<"$@(`?A)"HAP`HI-_
+M$D*B'@"BEP(2`@"`$D*B'@"BDX$20J(@`**3`0!",'P20J(@`**70A`"``<`
+M0C!]$D*B```"/```0B3``8*N)8@```D`""00`*<GP"@1`",HL0"`*`4`(2BQ
+M`"$H10)`,`@`(1CF````8I2"$@(`@A*BH```8I0"$0(`/P!",(T2HJ```&.0
+M@!@#`#P`8S`"`,0D(2#D````@I2"$P(`)1AB`(,2HZ```(*4`A("`#\`0C".
+M$J*@``""E((0`@`_`$(PA!*BH```@Y``&0,`,`!C,`0`Q"0A(.0```""E`(3
+M`@`E&&(`CQ*CH```@I2"$0(`/P!",(42HJ```(*0/P!",)`2HJ`&`,,D(1CC
+M````8I2"$@(`AA*BH```8I0"$0(`/P!",)$2HJ```&.0@!@#`#P`8S`(`,0D
+M(2#D````@I2"$P(`)1AB`(<2HZ```(*4`A("`#\`0C"2$J*@``""E((0`@`_
+M`$(PB!*BH```@Y``&0,`,`!C,`H`Q"0A(.0```""E`(3`@`E&&(`DQ*CH```
+M@I2"$0(`/P!",(D2HJ```(*0/P!",)02HJ`,`,,D(1CC````8I2"$@(`BA*B
+MH```8I0"$0(`/P!",)42HJ```&.0@!@#`#P`8S`.`,0D(2#D````@I2"$P(`
+M)1AB`(L2HZ```(*4`A("`#\`0C"6$J*@``""E((0`@`_`$(PC!*BH```@Y``
+M&0,`,`!C,!``Q"0A(.0```""E`(3`@`E&&(`EQ*CH```@I2"$0(`/P!",)@2
+MHJ```(*0/P!",)D2HJ`2`,,D(1CC````8I2"$@(`FA*BH```8I0"$0(`/P!"
+M,)L2HJ```&.0@!@#`#P`8S`4`,8D(3#F````PI2"$P(`)1AB`)P2HZ```,*4
+M`A("`#\`0C"=$J*@``#"E((0`@`_`$(PGA*BH`$`,28%`"(N8/]`%`L`""4`
+M``(\`&A")`GX0``E((`")9@``"6(```?`!8D```"/```520#`%`F)2"``B,H
+MT0()^*`"D`"F)QT`0!"0`**7(9AB`D`8$0`A('```A("`!`3@J`E&(``D`"B
+MDQ$38J`!`#$F`P`B+O#_0!0E((`"`0!C+@(``CS]_T(T)A!B`@$`0BPE&&(`
+M#`!@%`D`$"0```(\``!")"4@@`(00`4D"?A``"4PX`(2```0)1"``@@``!`(
+M`!`D"``0)````CP``$(D)2"``A!`!20)^$``)3#@`@0`0!(```(\``!")`GX
+M0``E($`"`0#`5P``T*\E$```O`"_C[@`OH^T`+>/L`"VCZP`M8^H`+2/I`"S
+MCZ``LH^<`+&/F`"PCP@`X`/``+TGZ/^])Q``OZ\```(\``!")`GX0```````
+M$`"_CP@`X`,8`+TG``&E,`<`H!```````!0")```PJ0V%0(D``#BI`@`X`,!
+M``(D"`#@`R40```(`.`#`0`").0!@HP!`$(TY`&"K``4`B3L`8*D-A4").X!
+M@J3@`8*,`@!"-/[_`SS__V,T)!!#``,``R3H`8.D0``#).H!@Z3?_P,\__]C
+M-"000P"__P,\__]C-"080P#@`8.L?!*"D`<`0!#@`84D2!*`I`$``B1,$H*L
+M@``"/"408@#@`8*L#P`")!0`HJP!``(D"`#@`V@2@JP```````````````#@
+M_[TG'`"_KQ@`LJ\4`+&O$`"PKR60@``EB*`````0/```$"8L@`4T"?@``@0`
+M)HXE($`",(`%-`GX``(,`":.)2!``C2`!30)^``"$``FCB4@0`(X@`4T"?@`
+M`@@`)HXE($`")(`%-`GX``(``":.'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TG
+MT/^])R@`OZ\4`*6OW`&#C`$``B0,`&(0```"/```0HPC$*(`P!`"`!P`HJ\`
+M``(\``!"C",0H@#`$`(`(`"BKP8``!`8`*6O__\")!P`HJ\@`**O`0`")!@`
+MHJ^``0(\__]"-"00P@`0`**O```"/```0B0)^$``$`"E)R@`OX\(`.`#,`"]
+M)^#_O2<8`+^O%`"QKQ``L*\EB(`````0/```$"8L@`4T"?@``B4P``````(\
+M``!")"4@(`()^$``!(`%-!```SPE$$,`7_\&//__QC0E("`"!(`%-`GX``(D
+M,$8`)2`@`B2`!30)^``"__\&-!@`OX\4`+&/$`"PCP@`X`,@`+TGV/^])R``
+MOZ\<`+.O&`"RKQ0`L:\0`+"O)9B``"6(H``2`"*6'@!`$"608`(```(\``!"
+M)`GX0``$@`4T?_\#//__8S0D$$,`(``&/```$#P``!`F)2!``@2`!30)^``"
+M)3!&`"4@0`(H@`4T"?@``A``)I8E($`"2(`%-`GX``(2`":6%``FCB4@0`(T
+M@`4T"?@``L`P!@`/```0```"/````CP``$(D)2!@`@GX0``$@`4T7_\&//__
+MQC0```,\``!C)"4@8`($@`4T"?A@`"0P1@````(\``!")"4@8`(L@`4T"?A`
+M````)HX```(\``!")"4@8`()^$``)(`%-(#_`SPD$$,`"``CEB4P0P`8`"*6
+M!0!`$`0`0B0`%`(`?P`#/"000P`E,,(````"/```0B0E(&`""?A``"2`!330
+M`6*6!`!"+!4`0!0@`+^/&@`BE@<`0C`1`$`0__@")/@30XXD(&(`&@`BE@@`
+M0RP`$@(```=",`(`8!0E,((```>&-/@31JX```(\``!")"4@8`()^$``&(`%
+M-"``OX\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2<``````````.C_O2<0`+^O
+M```"/```0B0)^$``"$`%)"L0`@`0`+^/"`#@`Q@`O2?@_[TG'`"_KQ@`LJ\4
+M`+&O$`"PKR60@``E@*``)8A``@```CP``$(D"?A``!P`!20E($``__\")`0`
+M@E0<$R*.````KAX``!`E$```)!""``4!`SRZV&,T)!A#`'```CP@`$(T)!""
+M``0`0!````.N`$`"/"408@````*N!0"",`4`0!#`!8(P```"C@$`0C0```*N
+MP`6",`0`0!````*.0`!"-````JX```*.`$`#/"000P`!`$!44!)$K@$``B0<
+M`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2<(`.`#'!."C-C_O2<D`+^O(`"TKQP`
+MLZ\8`+*O%`"QKQ``L*\EF(``)8B@`!P3=(X&`($&)8!@`@```CP``$(D)``%
+M)`GX0``E,```!0$"/+K80C0D,"("`0`B,@$`0%0%`,8T0``B,@X`0!````(\
+M(!,"C@$`0%1``,8T)!,"C@$`0%0``<8T*!,"C@$`0%2``,8T+!,"C@$`0%0`
+M!,8T```"/```4B0E(&`""?A``B``!20%`"$&'!,1KB4@8`(D``4D"?A``@$`
+M!B0E$(`")`"_CR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2<(`.`#0``"
+M).C_O2?__Z,P0`!B+`H`0!`0`+^O0!D#`!R0!30```(\``!")`GX0``A*&4`
+M`(!#,`(`8!0!``(D)1```!``OX\(`.`#&`"])^#_O2<<`+^O&`"RKQ0`L:\0
+M`+"O__^E,$``HBPM`$`0)9"``$")!0``D`4T```0/```$"8A*"4""?@``B4P
+M```$D`4T)2!``B$H)0()^``")3````B0!30E($`"(2@E`@GX``(E,```#)`%
+M-"4@0`(A*"4""?@``B4P```0D`4T)2!``B$H)0()^``")3```!20!30E($`"
+M(2@E`@GX``(E,```&)`%-"4@0`(A*"4""?@``B4P```<D`4T)2!``B$H)0()
+M^``")3````(``!`!``(D)1```!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])]C_
+MO2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR68@``E(,``__^E,$``HRPD`&`0)1``
+M`!0`@%`ED```!0"2D`"2$@`$`(*0)9!"`@,`AI``-@8``@""D``4`@`E,,(`
+M`0""D``2`@`E,,(```""D"4PP@!",`8`P!<2`"4PP@`"```00I`2`"4P``!`
+MB04`&)`%-```$#P``!`F)2!@`@GX``(A*"4"')`%-"4@8`(A*"4""?@``@"`
+M1C8!``(D(`"_CQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])\C_O2<T`+^O,`"^
+MKRP`MZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O);B``$0`IZ](`**/
+M__^^,`$`1"PC(`0`554"/%950C0D(((`(R""`$``PR]J`&`0)1``````PY!H
+M`&!4-`"_CP(`PY0%`&,L9`!@5#0`OX\"`,*4!@!"+`<`0!0EL````@#"E`X`
+M0BP!`%8L([`6``(`UC(!`-8F!`#'D`4`PI``$@(`)3CB``8`PI``%`(`)3CB
+M``<`PI``%@(`)3CB`"8XY``(`,.0"0#"D``2`@`EJ&(`)JBD`O__M3(*`-.0
+M"P#"D``2`@`EF&("#`#"D``4`@`EF&("#0#"D``6`@`EF&(")IAD`@X`PY`/
+M`,*0`!("`"6@8@`FH(0"__^4,A``TI`1`,*0`!("`"600@(2`,*0`!0"`"60
+M0@(3`,*0`!8"`"600@("`,*4#@!"+`(`0!`FD$0"_P!2,D")'@``D`4T```0
+M/```$"8E(.`"(2@E`@GX``(E,.``!)`%-"4@X`(A*"4""?@``B4PH`((D`4T
+M)2#@`B$H)0()^``")3!@`@R0!30E(.`"(2@E`@GX``(E,(`"$)`%-"4@X`(A
+M*"4""?@``B4P0`(4D`4T)2#@`B$H)0()^``")3#``@```CP``$(D)2#@`B4H
+MP`,)^$``1`"FCS0`OX\P`+Z/+`"WCR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"Q
+MCQ``L(\(`.`#.`"])P````#H_[TG$`"_KQ,3@R0```(\``!")"4@H``E*&``
+M"?A```8`!B00`+^/"`#@`Q@`O2?H_[TG$`"_KP```CP``$(D$Q.$)`GX0``&
+M``8D`0`")!``OX\(`.`#&`"])^C_O2<0`+^O```"/```0B0E(*`````%/+`4
+MI20)^$``!@`&)!``OX\(`.`#&`"])P@`X`,E$```X/^])Q@`OZ\4`+&O$`"P
+MKR6`@``EB,``@"@%`````CP``$(D"?A```!@I20```(\``!")"4@``(`;`4D
+M`P`&)`GX0``"``<D!P!`$"4@``(```(\``!")`GX0```:`4D```BI@$``B08
+M`+^/%`"QCQ``L(\(`.`#(`"])___I3`E&(``"`)BE`@`11`,``0D<A)BE(``
+M0C`!`$0L(R`$`/C_`B0D(((`"P"$)`$`P%0``,2L"`#@`R40```(`.`#`0`"
+M).#_O2<<`+^O&`"RKQ0`L:\0`+"O)9"``$@24)8<`!$R@H@1``(`$#(K@!``
+M```"/```0B0)^$``)2@@`B804`````,\``!C)"4@0`(E*"`""?A@``$`1BP<
+M`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?@_[TG&`"_KQ0`L:\0`+"O)8B``"6`
+MH`````(\``!")`GX0``40`4D0(`0``,``R0$&`,")Q@#`"000P`"``8D!#`&
+M`@```SP``&,D)2`@`A1`!20)^&``)3!&``$``B08`+^/%`"QCQ``L(\(`.`#
+M(`"])^#_O2<8`+^O%`"QKQ``L*\EB(``)8"@`````CP``$(D"?A``!1`!21`
+M@!```P`&)`0P!@(G,`8````#/```8R0E("`"%$`%)`GX8``D,$8``0`")!@`
+MOX\4`+&/$`"PCP@`X`,@`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\ED(``)8B@
+M`"6`P`````(\``!")`GX0``80`4D`0`#)`08(P(G&`,`)!!#``$`$#($@#`"
+M```#/```8R0E($`"&$`%)`GX8``E,%```0`")!P`OX\8`+*/%`"QCQ``L(\(
+M`.`#(`"])^C_O2<4`+^O$`"PKR6`H``&``(N"`!`$/__`B0```(\``!")`GX
+M0``<0`4D+P!",`80`@(!`$(P%`"_CQ``L(\(`.`#&`"])^#_O2<<`+^O&`"R
+MKQ0`L:\0`+"O)9"``"6`H``EB,`````"/```0B0)^$``%$`%)``K$`!`@!``
+M`P`$)`0@!`(E(*0``0`#/`"`8S0G&&0`)#!#`"4PQ0`#`"`2`(#&-`$``CPE
+M,,(````"/```0B0E($`""?A``!1`!20<$T..``$%/````CP``$(D)2!``@GX
+M0``E*&4`'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGX/^])Q@`OZ\4`+&O$`"P
+MKR6(@``E@*`````"/```0B0)^$``$$`%)`8``!(E,$``!``")`8``A+?_P(D
+M!P``$"``QC2?_P(D!@``$"0PP@`D,,(``P``$$``QC2__P(D)##"`````CP`
+M`$(D)2`@`@GX0``00`4D&`"_CQ0`L8\0`+"/"`#@`R``O2?H_[TG$`"_KP``
+M`CP``$(D"?A```2`!32```,\)!!#``$`0BP"``,D(Q!B`!``OX\(`.`#&`"]
+M)^#_O2<8`+^O%`"QKQ``L*\EB(``)8"@`````CP``$(D"?A```2`!30E&$``
+M@``"/"008@`%`$`0`@`")`<``E:```8\#```$!@`OX\!``(D"0`"$A@`OX^`
+M``8\```"/```0B0E("`"!(`%-`GX0``E,&8`&`"_CQ0`L8\0`+"/"`#@`R``
+MO2<(`.`#)1````@`X`,!`*(LX/^])QP`OZ\8`+*O%`"QKQ``L*\EB(``___0
+M,````CP``$(D.!,D)@GX0``&``8D.!,CDCD3(I(`$@(`)1AB`#H3(I(`%`(`
+M)1AB`#L3)I(`-@8````"/```4B0E("`""(`%-`GX0`(E,&8`/!,CDCT3(I(`
+M$@(`)1AB`/\_!C(`-`8`)2`@`@R`!30)^$`")3!F``P``!8```(\``!")"4@
+M(`()^$``!(`%-!``!CPE("`"!(`%-`GX0`(E,$8`#@``$!P`OX\``$(D)2`@
+M`@GX0``$@`4T[_\&//__QC0```,\``!C)"4@(`($@`4T"?A@`"0P1@`<`+^/
+M&`"RCQ0`L8\0`+"/"`#@`R``O2?8_[TG)`"_KR``M*\<`+.O&`"RKQ0`L:\0
+M`+"O):"`````$CP``%(F"?A``FR`!30EF$``)2"``@GX0`)P@`4T)8!``"4@
+M@`()^$`";(`%-"N84P`A@!,")8@```"($``E@```)1@``"40`@(E&",")`"_
+MCR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2?H_[TG$`"_KP```CP``$(D
+M"?A``&R`!300`+^/"`#@`Q@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)
+M^$``)(`%-``!!CP```,\``!C)"4@``(D@`4T"?A@`"4P1@`4`+^/$`"PCP@`
+MX`,8`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0`+"O)9B``````CP``$(D"?A`
+M`&28!33"E`(`_P%2,@`!0C(#`$`0```1//\!4CHGD!(````Q)B4@8`()^"`"
+M<(`%-"6`0``E(&`""?@@`FR`!30F@`(")A`2`B``OX\<`+./&`"RCQ0`L8\0
+M`+"/"`#@`R@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``($`%)-`!
+M`Y;_`$(P)AAB``$`8BP4`+^/$`"PCP@`X`,8`+TGX/^])QP`OZ\8`+*O%`"Q
+MKQ``L*\ED(``)8"@````$3P``#$F"?@@`IB`!30```..(1!#`````JXE($`"
+M"?@@`I2`!30$``..(1!#``0``JXE($`""?@@`IR`!30,``..(1!#``P``JXE
+M($`""?@@`I"`!30(``..(1!#``@``JXE($`""?@@`J"`!300``..(1!#`!``
+M`JX<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?@_[TG'`"_KQ@`LJ\4`+&O$`"P
+MKR6(@``E@*``"0`"+@@`0!0ED"`"```"/```0B0)^$``__\%-"L04``%`$!0
+M```"//__`B3\$T*N#0``$"40`````$(D)2`@`@GX0``E*``"```#/```8R0E
+M("`"$(`%-`GX8``E,$``_!-0K@$``B0<`+^/&`"RCQ0`L8\0`+"/"`#@`R``
+MO2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``$(`%-````SP``&,D)2``
+M`@GX8`#__T4P%`"_CQ``L(\(`.`#&`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O
+M$`"PKR6(@``ED*``)9@@`@```CP``$(D"?A``/\?!20K$%(`!0!`4````CS_
+M_P(D`!1BKA8``!`E$`````!")"4@(`()^$``%(`%-"6`0`````(\``!")"4@
+M(`()^$``)2A``@#@`R0D@`,"_Q]",````SP``&,D)2`@`A2`!30)^&``)3`"
+M`@`4<JX!``(D(`"_CQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])^C_O2<4`+^O
+M$`"PKR6`@`````(\``!")`GX0``4@`4T```#/```8R0E(``""?A@`/\?13`4
+M`+^/$`"PCP@`X`,8`+TG]Q."D`$`0C@(`.`#`0!",.#_O2<<`+^O&`"RKQ0`
+ML:\0`+"O)9"``!$`H!`EB$`"```"/```0B0)^$``!(`%-/_^$#S__Q`V```#
+M/```8R0E("`"!(`%-`GX8``D,%``]!,BCB004``0```0]!,BK@```CP``$(D
+M)2!``@GX0``$@`4T``$0/````SP``&,D)2!``@2`!30)^&``)3!0`/03(HXE
+M$%``]!,BK@$``B0<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?8_[TG(`"_KQP`
+MLZ\8`+*O%`"QKQ``L*\EB(``)9"@`"68(`(```(\``!")`GX0`#_'P4D*Q!2
+M``4`0%````(\__\")`048JX9```0)1``````0B0E("`""?A``!2`!30E@$``
+M```"/```0B0E("`""?A``"4H0`(`X`,\__]C-"2``P(`%`(`_Q\#/"000P``
+M``,\``!C)"4@(`(4@`4T"?A@`"4P`@($%'*N`0`")"``OX\<`+./&`"RCQ0`
+ML8\0`+"/"`#@`R@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``%(`%
+M-`(L`@````(\``!")"4@``()^$``_Q^E,!0`OX\0`+"/"`#@`Q@`O2<(`.`#
+M`0`")`@`X`,`````"`#@`R40```(`.`#``````@`X`,`````Z/^])P$``B0'
+M`*(4$`"_KP$`PBPC$`(`\_\#)"000P`%```0#0!")````CP``$(D"?A`````
+M```0`+^/"`#@`Q@`O2?@_[TG"P`")`8`HA`8`+^O'@`#)!``HQ`E$```"0``
+M$#``HH\&`.8P^`&&K````CP``$(D"?A``&B`!30&```0`0`")!``HJ\```(\
+M``!")`GX0```````&`"_CP@`X`,@`+TGX/^])Q@`OZ\P`**/-`"CCQ``HJ\`
+M``(\``!")`GX0``4`*.O&`"_CP@`X`,@`+TGV/^])R``OZ\<`+.O&`"RKQ0`
+ML:\0`+"O)8B``"6`H`````(\``!2)`GX0`($@`4T!``&/````SP``',D)2`@
+M`@2`!30)^&`")3!&``D``!(E("`""?A``@1`!23\_P8\___&-"4@(`($0`4D
+M"?A@`B0P1@`@`+^/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TGT/^])RP`OZ\H
+M`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O,0"@$"6(@`````(\``!")`GX
+M0``$0`4D_/\&//__QC0```,\``!C)"4@(`($0`4D"?A@`"0P1@````(\``!"
+M)`GX0`#0!P0D"@`0)````CP``%(D`0`6/````CP``%4D_/\4//__E#8```(\
+M"P``$```4R0)^*`"R``$)"4@(`()^$`"!$`%)"4@(`($0`4D"?A@`B0P5`#_
+M_Q`F"```$B4@(`()^$`"$$`%)"005@#P_T`4``````0``%8```(\#P``$"40
+M``````(\``!")"4@(`()^$``!(`%-/O_!CS__\8T```#/```8R0E("`"!(`%
+M-`GX8``D,$8``0`")"P`OX\H`+:/)`"UCR``M(\<`+./&`"RCQ0`L8\0`+"/
+M"`#@`S``O2?8_[TG(`"_KQP`LZ\8`+*O%`"QKQ``L*\EB(``)8"@`````CP`
+M`%(D"?A``@2`!30$``8\```#/```<R0E("`"!(`%-`GX8`(E,$8`"0``$B4@
+M(`()^$`"!$`%)/S_!CS__\8T)2`@`@1`!20)^&`")#!&`"``OX\<`+./&`"R
+MCQ0`L8\0`+"/"`#@`R@`O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKR6(H``E*,``
+M`0`0)`T`,!(ED(``!@`@$@$``CP"``(D#@`B$B40```3```0'`"_CX"`0B0)
+M^$````````L``!`E@$```0`"/,R!0B0)^$````````8``!`T$U&N```"//!_
+M0B0)^$```````#034:XE$``"'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGZ/^]
+M)Q``OZ\```(\``!")`GX0``$0`4D`A0"``,`0C`0`+^/"`#@`Q@`O2<`````
+M`````.C_O2<4`+^O`0`")`8`HA`0`+"O`@`")`8`HA`E$```#```$!0`OX\`
+M``(\`P``$```4"0```(\``!0)````CP``$(D"?A``"4H``(E$``"%`"_CQ``
+ML(\(`.`#&`"])^C_O2<0`+^O```"/```0B0)^$``#``%)!``OX\(`.`#&`"]
+M)^C_O2<0`+^O)3"@`````CP``$(D"?A```P`!200`+^/"`#@`Q@`O2?H_[TG
+M$`"_KP```CP``$(D"``%)`GX0``$``8D$`"_CP@`X`,8`+TGV/^])R``OZ\<
+M`+.O&`"RKQ0`L:\0`+"O)9B``````CP``$(D"``%)`GX0``@``8D)8``````
+M`CP``%(D```"/```420E(&`""?A``@@`!20$`$,P"`!@$`$``B0)^"`""@`$
+M)`$`$";H`P(J]O]`5"4@8`(E$```(`"_CQP`LX\8`+*/%`"QCQ``L(\(`.`#
+M*`"])^C_O2<4`+^O$`"PKR6`@`````(\``!")`GX0`!H@`4TO_\&)````SP`
+M`&,D)2```FB`!30)^&``)#!&`!0`OX\0`+"/"`#@`Q@`O2?H_[TG%`"_KQ``
+ML*\E@(`````"/```0B0)^$``:(`%-````SP``&,D)2```FB`!30)^&``0`!&
+M-!0`OX\0`+"/"`#@`Q@`O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKR6(@``E$*``
+M)9#`````$#P``!`F4(`%-`GX``(E,$``)2`@`E2`!30)^``")3!``AP`OX\8
+M`+*/%`"QCQ``L(\(`.`#(`"])^#_O2<8`+^O%`"QKQ``L*\EB(``)8"@`$``
+M`RXA`&`0)1```"```BX0`$`4```"/```0B0)^$``5(`%-.#_`R8!``8D!#!F
+M`"<P!@````,\``!C)"4@(`)4@`4T"?A@`"0P1@`/```0`0`")```0B0E("`"
+M"?A``%"`!30!``8D!#`&`B<P!@````,\``!C)"4@(`)0@`4T"?A@`"0P1@`!
+M``(D&`"_CQ0`L8\0`+"/"`#@`R``O2?@_[TG&`"_KQ0`L:\0`+"O)8B``"6`
+MH`!```,N'P!@$"40```@``(N#P!`%````CP``$(D"?A``%2`!33@_P,F`0`&
+M)`0P9@````,\``!C)"4@(`)4@`4T"?A@`"4P1@`.```0`0`")```0B0E("`"
+M"?A``%"`!30!``8D!#`&`@```SP``&,D)2`@`E"`!30)^&``)3!&``$``B08
+M`+^/%`"QCQ``L(\(`.`#(`"])^C_O2<0`+^O```"/```0B0)^$``3(`%-!``
+MOX\(`.`#&`"])^C_O2<E,*````+",`0`0!`0`+^O__T")"0PP@`@`,8T```"
+M/```0B0)^$``3(`%-!``OX\(`.`#&`"])PL`H*@(`*"X_P_",`\`HJ@,`**X
+M#P"CB`P`HY@0`&84)1```"``XC`&`$`0``````\`HH@,`**8`"!"-`\`HJ@,
+M`**X%P"@J!0`H+@7`**(%`"BF!,`HJ@0`**X`0`")`@`X`,`````V/^])R``
+MOZ\<`+.O&`"RKQ0`L:\0`+"O)9B``"6`P`!``+*/)8B@`!<`(XH4`".:`0!C
+M,&H`8!`/``(D%P#BB!0`XI@!`$(P!@!`%````CP``$(D"?A```P`!21@`%`0
+M#P`")!,`(HH0`"*:_P]",```0J87`#"*%``PFO\/`CP`@$(T)(`"`L*#$```
+M``(\``!")"4@8`()^$``;(`%-((:`@#__V,P_Q]B,"L04``$`$!0)8`#`@#@
+M8B3__T(P)8`"`O]_`C("`$*F!`!`HA<`(HH4`"*:`@!","``0!0`````%P`B
+MBA0`(IH$`$(P`P!`$`$``B09```0!`!"HA<`(HH4`"*:$`!",`4`0!``````
+M!`!"D@@`0C00```0!`!"HA<`(HH4`"*:"`!",`0`0!`$`$*2!`!"-`@``!`$
+M`$*B`@!"-`0`0J(7`"**%``BFN``0C!"$0(`!0!"HA,`(HH0`"*:PA0"``8`
+M0J(7`"**%``BF@`!0C`'`$`0_P`")!<`(HH4`"*:`'Y",$(2`@`"```0!P!"
+MH@<`0J(3`"**$``BFL(3`@`/`$(P"`!"HA,`(HH0`"*:@A,"``$`0C`)`$*B
+M$P`BBA``(IH"$P(``0!",`H`0J(E$```(`"_CQP`LX\8`+*/%`"QCQ``L(\(
+M`.`#*`"])P```````````````,C_O2<T`+^O,`"^KRP`MZ\H`+:O)`"UKR``
+MM*\<`+.O&`"RKQ0`L:\0`+"O)9"``"6XH``E\,``1`"GKR680`("`,*7``%"
+M,/`!0!`,``,D```"/```0B0)^$``)2C``R6P0`#I`<`2#``#)`8``B0*`.(2
+M!P#B+@8`0!`(``(D`@#B+N$!0!````(\!0``$```0B3=`>(6#``#)````CP`
+M`$(D)2!``@GX0``00`4D8`!4,````CP``$(D)2!``@GX0``E*,`#T`%`$`,`
+M`R03$V.2%!-BD@`2`@`E&&(`%1-BD@`4`@`E&&(`%A-FD@`V!@```!`\```0
+M)B4@0`(`@`4T"?@``B4P9@`7$V*2&!-FD@`R!@`E($`"!(`%-`GX``(E,$8`
+M`0`"/!"20B0E($`""?A``"4HX`(!``(D&P#B4@``$#P4`.!2```0/`8``B0%
+M`.(2"``")"``XA(``!$\*@``$```,28``!`\```0)B4@0`(H``4D"?@``B4P
+M```E($`"$$`%)`GX``)`$`8D'0``$```$3P``!`F)2!``B@`!20%```0`0`&
+M)```$"8E($`"*``%)"4P```)^``"```1/"4@0`(00`4D"?@``B00!B0-```0
+M```Q)@``$#P``!`F)2!``B@`!20)^``")3```"4@0`(00`4D"?@``D`0!B0`
+M`!$\```Q)B4@0`()^"`"$$`%)```$#P``!`F)2!``A!`!20)^``")3!4`#@3
+M8Y(Y$V*2`!("`"488@`Z$V*2`!0"`"488@`[$V:2`#8&`"4@0`((@`4T"?@`
+M`B4P9@`\$V*2/1-FD@`R!@`E($`"#(`%-`GX``(E,$8`)2!``B4H```)^``"
+M)3```"4@0`($``4D"?@``B4P```E($`"#``%)`GX``(E,```)2!``@GX(`(<
+M``4D)2!``B``!20)^``")3```"4@0`(D``4D"?@``B4P```<$V"N)2!``@GX
+M(`(L``4D)2!``C``!20)^``"!0`&)"4@0`(T``4D"?@``@4`!B0E($`"1``%
+M)`GX``((``8D)2!``D@`!20)^``""``&)"4@0`)0``4D"?@``B4P```E($`"
+M3``%)`GX``(E,```)2!``@Q`!20)^``")3```"4@0`)```4D"?@``B4P```E
+M($`"&(`%-`GX``+X$V:.)2!``DB`!30)^``")3```````CP``$(D)2!``@GX
+M0``E*```)2!``E"`!30)^``")3```"4@0`)4@`4T"?@``B4P```E($`"6(`%
+M-`GX``(E,```)2!``ER`!30)^``")3```"4@0`)@@`4T"?@``@$`!B0E($`"
+M9(`%-`GX``(!``8D)2!``FB`!30)^``")3```"4@0`(H@`4T"?@``B4P```E
+M($`"+(`%-`GX``(E,```)2!``FR`!30)^``")3```"4@0`(P@`4T"?@``O__
+M!B0E($`"-(`%-`GX``+__P8D)2!``CB`!30)^``"`0`&)"6```````(\P!15
+M)````CS$%%0D```"/```423`$!``(1!5````18Q$`**/!`!`$`"`HB0`$$(L
+M!P!`5`$`$";`$!``(1!4`"4@0`()^"`"``!&C`$`$":G``(N\/]`%,`0$```
+M``(\``!")"4@0`()^$``)2C``\<`0!`#``,D```1/```,28E($`""?@@`BB8
+M!33__P,\_P!C-"000P!Y$F:2`#(&````$#P``!`F)2!``BB8!30)^``")3!&
+M`'H28I(`-@(``!0"`"4PP@![$F.2`!(#`"4PP@`E($`"-)@%-`GX``(E,,,`
+M)2!``@GX(`)$F`4T?\`#)"000P!T$F:60C`&`(`_QC`E($`"1)@%-`GX``(E
+M,$8`)2!``@GX(`)(F`4T_/\#//\/8S0D$$,`=!)FEH`R!@`#``,\`/!C-"0P
+MPP`E($`"2)@%-`GX``(E,$8`)2!``@GX(`)DF`4T^/\#//\/8S0D$$,`>!)F
+MD@`S!@`'``,\`/!C-"0PPP`E($`"9)@%-`GX``(E,$8`)2!``@GX(`(0F04T
+M_/\#)"000P!T$F:6`P#&,"4@0`(0F04T"?@``B4P1@`!``(\1*-")"4@0`()
+M^$``)2C``G``0!`#``,D1`"DCPP`@!```!`\!`##D@(`8C`$`$!4`@#"EOX`
+M8C`$`,*B`@#"E@(`PJ<$`,*2!`#"HP``$#P``!`F)2!``AR8!30)^``"`0`&
+M)````CP``$(D"?A``.@#!"0```(\``!")"4@0`()^$``8)@%-"4@0`)@F`4T
+M"?@``@$`1C0```(\``!")"4@0`)@F`4T`0`&)`GX0``E.``````"/```0B0E
+M($`""?A``"4HP`(&`$`4)8````(`PI<"`$(T`@#"IST``!`#``,D```"/```
+M420E($`""?@@`B4H``(!`!`F`P`"*OO_0!0E($`"3!)"C@0`0!````(\``!"
+M)`GX0``E($`"```"/```0B0E($`""?A``"2`!31__@8\___&-````SP``&,D
+M)2!``B2`!30)^&``)#!&`/P398[__P(D!`"B$````CP``$(D"?A``"4@0`(`
+M%&6.__\")`0`HA````(\``!")`GX0``E($`"!!1ECO__`B0$`*(0```"/```
+M0B0)^$``)2!``O@!1HX'`,!0W`%7K@```CP``$(D)2!``@GX0`!H@`4TW`%7
+MK@8``!`!``(D2`"DCP``@HP!`$!4``"#K"40```T`+^/,`"^CRP`MX\H`+:/
+M)`"UCR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`S@`O2?@_[TG'`"_KQ@`LJ\4
+M`+&O$`"PKR60@``EB*``)8!``@```CP``$(D"?A```2`!33__T,P`0`")!4`
+M(A("`"(J!0!`4`8``B0-`"`2'`"_CR4``!`8`+*/!0`B$@@``B06`"(2'`"_
+MCQ\``!`8`+*/]!,&CB4P9@`(```040`#//03!HXE,&8`!```$%(``SST$P:.
+M)3!F`!0``SP```(\``!")"4@0`($@`4T"?A``"4PPP`+```0'`"_C_03!HXE
+M,&8`$``#/````CP``$(D)2!``@2`!30)^$``)3##`!P`OX\8`+*/%`"QCQ``
+ML(\(`.`#(`"])^C_O2<0`+^O`0`"/!"20B0)^$``W`&%C!``OX\(`.`#&`"]
+M)^C_O2<0`+^O`0`"/$280B0(``4D"?A```H`!B00`+^/"`#@`Q@`O2?@_[TG
+M&`"_KQ0`L:\0`+"O)8B``````CP``$(D)2@```GX0``!``8D%`!`$`\`!20!
+M``(\1)A")"4@(`()^$``($X&)`T`0!```!`\```0)@GX``+H`P0D`0`"/$28
+M0B0E("`"'P`%)`GX0``@3@8D"?@``C0(!"0!``(D&`"_CQ0`L8\0`+"/"`#@
+M`R``O2?@_[TG&`"_KQ0`L:\0`+"O)8B``"6`H`````(\``!")"4H```)^$``
+M`0`&)#(`0!`8`+^/!0``$B4P```"``*6$`!",`$`0%0!``8D```"/```0B0E
+M("`""?A```28!30!``(\1)A")"4@(`(/``4D"?A``"!.!B0?`$`0&`"_CP``
+M`CP``$(D"?A``.@#!"0!``(\1)A")"4@(`(?``4D"?A``"!.!B03`$`0&`"_
+MCP```CP``$(D"?A``#0(!"0```(\``!")"4@(`(E*```"?A```$`!B0&`$`0
+M)2`@`@$``CQ$F$(D)2@```GX0``*``8D&`"_CQ0`L8\0`+"/"`#@`R``O2?`
+M_[TG/`"_KS@`OJ\T`+>O,`"VKRP`M:\H`+2O)`"SKR``LJ\<`+&O&`"PKR6P
+M@`!$`*6O```"/```0B0)^$``2`"FKR6X0`"W`.`2```1/```,28E(,`""?@@
+M`FB`!30``!(\``!2)B4@P`)H@`4T"?A``F``1C0E(,`""?@@`B2`!300`**O
+M?_\&//__QC0E(,`")(`%-`GX0`(D,$8````0/```$"8)^``"H`\$)"4@P`()
+M^"`"")@%-``(!CPE(,`"")@%-`GX0`(E,$8`"?@``@H`!"0!``(\1*-")"4@
+MP`()^$``)2C@`H\`0!`\`+^/```"/```7B0)^,`#Z`,$)```$3P``#$F)2#`
+M`@GX(`((F`4T__<2//__4C8``!`\```0)B4@P`((F`4T"?@``B0P4@`E(,`"
+M"?@@`EB8!30EF$``)2#``@GX(`)<F`4T):!``"4@P`()^"`":)@%-"6H0``#
+M_`8\___&-"0P9@+\`P(\)2#``EB8!30)^``")3#"`,#_!CQ_`,8T)#"&`C\`
+M`CR`P$(T)2#``ER8!30)^``")3#"`/[_!CP?`,8T)#"F`B4@P`)HF`4T"?@`
+M`H`1QC0)^,`#%``$)"4@P`()^"`"")@%-``(!CPE(,`"")@%-`GX``(E,$8`
+M"?C``PH`!"0E(,`"U)@%-`GX``(A``8D)2#``@GX(`((F`4T)2#``@B8!30)
+M^``")#!2``GXP`/H`P0D)2#``@GX(`)@F`4T)2#``F"8!30)^``"`0!&-```
+M`CP``$(D)2#``F"8!30!``8D"?A``"4X```E(,`"6)@%-`GX``(E,&`")2#`
+M`ER8!30)^``")3"``B4@P`)HF`4T"?@``B4PH`(```(\``!0)"4@P`()^``"
+M)2C@`@T`0%0```(\"?C``X@3!"0E(,`""?@``B4HX`(&`$`4```"/$0`HX\"
+M`&*4`@!"-`(`8J0```(\``!")"4@P`()^$``:(`%-)__!B0``!`\```0)B4@
+MP`)H@`4T"?@``B0P1@`E(,`")(`%-`GX``(0`*:/`0`")$@`HX\``&*L/`"_
+MCS@`OH\T`+>/,`"VCRP`M8\H`+2/)`"SCR``LH\<`+&/&`"PCP@`X`-``+TG
+MV/^])R``OZ\<`+.O&`"RKQ0`L:\0`+"O)9"``"6`H``EF,```@``%B6(``+_
+M_Q$D```"/```0B0E($`"`$`%)`GX0``E,``"```"/```0B0)^$``)2!@`@\`
+M$#(```(\``!")"4@0`(`0`4D#P`F,@GX0``E.``")8A```0``C((`$`4)1`@
+M`@```CP``$(D)2!``A0`!20)^$``)3```"40(`(@`+^/'`"SCQ@`LH\4`+&/
+M$`"PCP@`X`,H`+TG_P#&,"4X```*``0D/P`))`$`RB1B$`P\TTV,-0$`"R1`
+M$`0``P!")/\`0C`'`,)40!`$`"$0I````$.0-@!I%"408``F```0`0`')`,`
+M0B3_`$(P)A!"`0$`0BPJ&`0`)!!#`!@`0!`A$*0```!#D#\`!R0:`&=0`0`'
+M)"$0A0#__TB0%@`'40$`!R0C$&@`0!@"`"$88@"`&`,`(QAB```9`P`C&&(`
+M0!@#`.<#8B09`$P`$!```((1`@`A$$@`"`#@`_\`0C`&`.M4__^$)"$0I```
+M`$.0#P!I%"408`#__X0DS_^#!$`0!``E(```/P`&)"$0I````$.0!@!F%"40
+M8``!`(0D"P""*/K_0%0A$*0``0`")`@`X`,`````_P#&,/__"23__P@D)2``
+M`#\`"B3__PLD`P"C)"$0I````$*0%0!*4`$`A"0F`,(00!`$`"$0I````$*0
+M*Q!&``$`0%0E0(``(1"D````0I`K$,(`"0!`4`$`A"0*``L5)4B``$`0"0`#
+M`$(D``#BH"$0(P$(`.`#"`!"D`L`@BCG_T!4(1"D``L`@R@!`&,X)Q`(``$`
+M0BPD&&(`,P!@%#\``B0+`((H#`!`5"$0"0%`$`@``P!")```XJ`A$`4!"`#@
+M`PL`0I`#`$(D``#BH"$0A0`(`.`#"P!"D`,`0B0``.*@(1"H````1)`C,,0`
+M0!D&`",89@"`&`,`(1AF`,`8`P`A$*D```!"D",01``:`&(`$A@```$`0%`-
+M``<``P"E)"$0)0$(`$20"``")2$HH@```**0(R""`!@`9``2,```YP/&)&(0
+M`CS334(T&0#"`!`0``""$0(`````````HY`A$$,`_P!",`@`X`,`````/0"B
+M+`$`0%`\``4D_`&%I`@`X`,!``(DR/^])S0`OZ\P`+:O+`"UKR@`M*\D`+.O
+M(`"RKQP`L:\8`+"O)9B``"4XH``ED,``)2A@`G828I8"$0(`!P!",`\`0J)V
+M$F*2!P!",!``0J(``..4SNMC))<`8RS7`&`0)1````@"8Y9^$J*0"P!B$"4P
+M```&`*0D`0#&)`0`PBP'`$`0!``#)"$0Q``(`F.6>!)"D/G_8E0!`,8D!``#
+M),8`PQ`E$`````#BE,[K0B1F9@,\9V9C-!@`0P`0&```@Q@#`,,7`@`C&&(`
+M#`!B+`$`0BPC$&(`JJH#/*NJ8S09`$,`$!@``$(8`P``````P!`#`",00P"`
+M$`(`(1!#`"&(H@""$C$F(1#1`!D`120``**0#@!"HA8`))+_`(,P``"BD"L0
+M0P`!`$!4``"DD`D`1*(A$-$`&0!%)!<`))+_`(,P``"BD"L00P`!`$!4``"D
+MD`@`1*(A$-$`&0!%)!@`))+_`(,P``"BD"L00P`!`$!4``"DD`<`1*(A$-$`
+M`0`0/"2:$"8E(&`")2@@`AD`1I`)^``"$`"G)R6@0``E(&`")2@@`@D`1I()
+M^``"$0"G)R6P0``E(&`")2@@`@@`1I()^``"$@"G)R6H0``E(&`")2@@`@<`
+M1I()^``"$P"G)R480````F*.8`!`$$`0`@````,\#!IC)"$00P```$24$`"B
+MDP,`@R0J$$,`!`!`$!``HI,#``(D`P``$!``HJ,C$$0`$`"BHP$``CP$F4(D
+M)2!@`B4H(`()^$``$`"FDPX`0J(!``(\))I")"4@8`(E*"`"#@!&D@GX0``4
+M`*<G):!``!``I)/_`(,P$0"BDRL00P`!`$!4$0"DDQ$`I*,!``(\!)E")"4@
+M8`(E*"`""?A``!$`II,)`$*B`0`"/"2:0B0E(&`")2@@`@D`1I()^$``%`"G
+M)R6P0``0`*23_P"#,!(`HI,K$$,``0!`5!(`I),2`*2C`0`"/`290B0E(&`"
+M)2@@`@GX0``2`*:3"`!"H@$``CPDFD(D)2!@`B4H(`((`$:2"?A``!0`IR<E
+MJ$``$`"DD_\`@S`3`**3*Q!#``$`0%03`*23$P"DHP$``CP$F4(D)2!@`B4H
+M(`()^$``$P"FDP<`0J(!``(\))I")"4@8`(E*"`"!P!&D@GX0``4`*<G)1A`
+M`!``HI-`$`(`_@%BI@X`0I(*`$*B"P!"H@P`0J(-`$*B(Q"#`@``0J(C$)4"
+M`0!"HB,0E@("`$*B!@!`H@4`0*($`$"B`P!`H@$``B0T`+^/,`"VCRP`M8\H
+M`+2/)`"SCR``LH\<`+&/&`"PCP@`X`,X`+TG>/^])X0`OZ^``+2O?`"SKW@`
+MLJ]T`+&O<`"PKR6@@``EB*`````0/```$"8H`*0G```%/!@:I20)^``"1``&
+M)!``I"<```4\^!FE)`GX``(1``8D`0`"/+";0B0E((`")2@@`@GX0``0`*8G
+MR`!`$!\`HY/__V,D!0!C+,0`8!`E$```(`"CD___8R0%`&,LP`!@$(0`OX\E
+MB```$`"R)P```CP``%,D(8!1`@``!)()^&`"!0`%)````J(!`"(F__]1,`<`
+M(B[X_T`4(8!1`@<`$200`+(G```"/```4R0A@%$"```$D@GX8`(&``4D```"
+MH@$`(B;__U$P#P`B+OC_0!0A@%$"$0"DDT`9!`#@`&,P$`"BDQ\`0C`E&&(`
+M*`"BCR488@`H`*.O$P"ED\`9!0"``&,P$@"BDX`0`@!\`$(P)1AB`,(@!``#
+M`(0P)1AD`"P`HH\E&&(`+`"CKQ0`I),`$00`\`!",$(H!0`/`*4P)1!%`#``
+MHX\E$$,`,`"BKQ8`I9.`&04`P`!C,!4`HI-`$`(`/@!","488@`"(00``0"$
+M,"489``T`**/)1AB`#0`HZ\7`*23P!`$`/@`0C""*`4`!P"E,"4010`X`*./
+M)1!#`#@`HJ\9`*63P!D%`(``8S`8`**30!`"`'X`0C`E&&(`0B$$``$`A#`E
+M&&0`/`"BCR488@`\`*.O&@"DDT`1!`#@`$(P0B@%`!\`I3`E$$4`0`"CCR40
+M0P!``**O&P"ED\`0!0#X`$(PPB`$``<`A#`E$$0`1`"CCR400P!$`**O'`"B
+MDT`0`@!^`$(P0BD%``$`I3`E$$4`2`"CCR400P!(`**O'0"DDT`1!`#@`$(P
+M3`"CCR400P!,`**O'@"CD\`0`P#X`$(PPB`$``<`A#`E$$0`4`"DCR401`!0
+M`**O0AD#``$`8S!4`**/)1AB`%0`HZ\``!`\```0)A\`I),)^``"`P`%),`1
+M`@"``$(P2`"CCR400P!(`**O'P"DDPGX``(#``4D0A`"``,`0C!,`*./)1!#
+M`$P`HJ\@`*23"?@``@,`!22`$`(`'`!",$P`HX\E$$,`3`"BKR6(```H`+`G
+M```"/```4B2`$!$`(1`"`B4@@`*<F`4T"?A``@``1HP!`"(F__]1,!``(B[W
+M_T`4@!`1`"$8H@,```(\``!")"4@@`+4F`4T"?A``"@`9HP!``(DA`"_CX``
+MM(]\`+./>`"RCW0`L8]P`+"/"`#@`X@`O2?@_[TG'`"_KQ@`LJ\4`+&O$`"P
+MKR6(@``ED*````!#E@#L8R1F9@0\9V:$-!@`9``0(```@R`$`,,?`P````(\
+M``!")",@@P`)^$``!0`%)$`0`@```!`\```0)B4@(`*<F`4T"?@``D$`1C0E
+M("`"P)@%-`GX``(E,```-!(RK@$``B0<`+^/&`"RCQ0`L8\0`+"/"`#@`R``
+MO2?H_[TG$`"_KP```CP``$(D"?A``&28!33"%`(`_P%#,``!8C`"`$`0_P%B
+M."<8`@`E$&``$`"_CP@`X`,8`+TGV/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O
+M$`"PKR6(@``EH*`````"/```0B0)^$``8)@%-````SP``&,D)2`@`F"8!30)
+M^&```@!&-````CP``$(D)2`@`F"8!30"``8D"?A``"4X```7`$`0)8``````
+M`CP``%,D```"/```4B0)^&`"Z`,$)`GX0`(E("`")2!```$`$"85``,JN?^"
+M*`$`0C@D&&(`]?]@%+G_@B@$`$!4%@"$IA8`@*8"```0)1````$``B0D`+^/
+M(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])P@`X`,E$```"`#@`R40````
+M`````````.C_O2<0`+^O)3B@`"5`@``#`.,H"0!@$"40````*0<`(RBG`(`H
+M!0`A*`4!```"/```0B0)^$``0!.E)!``OX\(`.`#&`"])^C_O2<0`+^O)4#`
+M`"4X@``#`*,H"@!@$"40````,04`(S#%`(`P!@`A,.8````"/```0B0E*``!
+M"?A``$`3QB00`+^/"`#@`Q@`O2?8_[TG)`"_KR``M*\<`+.O&`"RKQ0`L:\0
+M`+"O)9B``"6(H``"``(D#0`B$B6@P``#`"(N!@!`$`,``B0!``(D"P`B$B60
+M```I```0__\")`<`(A(!`!(D`P``$/__`B0#```0`@`2)"(``!`D`+^/`!$2
+M`",04@"`$`(`(8""`$`3$"8$``..&0!@%/__`B0```(\``!")"4@``()^$``
+M/``%)`L`@!8$`!&N"P`")`P``JX"``(D%``"KO__`B08``*N"@`")"```J8'
+M```0(@`"I@```CP``$(D)2!@`B4H0`()^$``)3"``B400`(D`+^/(`"TCQP`
+MLX\8`+*/%`"QCQ``L(\(`.`#*`"])P,`HRP=`&`0)1`````1!0`C$$4`@!`"
+M`"$P@@!`$\8D!`##C!4`8!`E$```!`#`K`$``R0$&*,`)Q@#`"`3@HPD$&(`
+M(!."K"03@HPD$&(`)!."K"@3@HPD$&(`*!."K"P3@HPD$&(`+!."K#`3@HPD
+M&&(`,!.#K`$``B0(`.`#`````-C_O2<D`+^O(`"TKQP`LZ\8`+*O%`"QKQ``
+ML*\EF(``):"@`"6(8`(T$B6.`P"#+LT`8!`E$````!$4`",05`"`$`(`(9`B
+M`D`34B8$`$..Q0!@$"40```$`$2.`0`#),$`@Q0!``(D`@"BE!``0C`Q`$`0
+M```0/```$"8E(&`"$(`%-`GX``+@`08D)2!@`A2`!30`"`8\"?@``@`(QC0E
+M(&`"((`%--T!!CP)^``"SX_&-!0`0HX`,0(`(S#"`$`Q!@#@`<8DP#(&`"4@
+M8`)`@`4T"?@``N`!QC0E(&`"1(`%-*X%!CP)^``"P`/&-````CP``$(D)2!@
+M`@GX0`!$F`4T@/\#)"000P`E(&`"1)@%-`GX``(X`$8T)2!@`@28!30`;P8\
+M"?@``B,@QC0R```0&`!#C@``$"8E(&`"$(`%-`GX``)H`08D)2!@`A2`!30`
+M!`8\"?@``@`$QC0E(&`"((`%--T!!CP)^``"IX_&-!0`0XY`$`,`(1!#```Q
+M`@`C,,(`P#`&`#`"QB3`,@8`)2!@`D"`!30)^``",`+&-"4@8`)$@`4TUP0&
+M/`GX``*8`\8T```"/```0B0E(&`""?A``$28!32`_P,D)!!#`"4@8`)$F`4T
+M"?@``AP`1C0E(&`"!)@%-`!O!CP)^``"(!#&-!@`0X[__P(D`@!B$`\`!B08
+M`$:.`#4&`"(`0I8`$0(`\`!","4PP@`@`$*6#P!","4PP@`(``,\`"!C-```
+M`CP``$(D)2!@`AR`!30)^$``)3##``P`0HX!`$(P!@!`$`$``B0$$(("(!,C
+MCB400P`&```0(!,BK@00@@(G$`(`(!,CCB000P`@$R*N#`!"C@$`0C`&`$`0
+M`0`")`00@@(D$R..)1!#``8``!`D$R*N!!""`B<0`@`D$R..)!!#`"03(JX,
+M`$*.`@!",`8`0!`!``(D!!""`B@3(XXE$$,`!@``$"@3(JX$$((")Q`"`"@3
+M(XXD$$,`*!,BK@P`0HX$`$(P!@!`$`$``B0$$(("+!,CCB400P`&```0+!,B
+MK@00@@(G$`(`+!,CCB000P`L$R*N#`!"C@@`0C`&`$`0`0`")`00@@(P$R..
+M)1!#``8``!`P$R*N!!""`B<0`@`P$R..)!!#`#`3(JX!``(D)`"_CR``M(\<
+M`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2?H_[TG$`"_KP`1!0`C$$4`@!`"`"$0
+M@@!$$T.,"0!@$`$``B0(`&(4__\")````CP``$(D"?A``"4H```#```0$`"_
+MC___`B00`+^/"`#@`Q@`O2?H_[TG$`"_KR4X@```$04`(Q!%`(`0`@`A$.(`
+M1!-#C`$``B0,`&(0)4#``!$`8!`E$```!`!B+`X`0!`E$``````"/```0B0)
+M^$``!``%)`@``!`!``(D```"/```0B0E(.``)2@```GX0``E,``!`0`")!``
+MOX\(`.`#&`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O)9"``````CP``$(D"?A`
+M`"6`H``EB$``_W\%//__I30```(\``!")"4@0`()^$``)"@E`@```CP``$(D
+M)2!``@GX0`!D@`4T!@``$B4P0``E``(D(Q!&`$(0`@`+```0(3#"``(`PBP(
+M`$`0___&)````CP``$(D)2!``@GX0``E*"`"#```$"40``````(\``!")"4@
+M0`()^$``9(`%-````CP``$(D)2!``@GX0``E*"`"`0`")!P`OX\8`+*/%`"Q
+MCQ``L(\(`.`#(`"])^#_O2<8`+^O%`"QKQ``L*\EB(```!$%`",010"`$`(`
+M(1`B`D030XP!``(D"@!B$````CPB`&`0)1````(``B08`&(0`P`")`H`8A`E
+M$```'```$!@`OX\``$(D)2`@`@@`!20)^$```0`&)!0``!`!``(D```0/```
+M$"8E("`""``%)`GX``("``8D)2`@`B@`!20)^``"#@`&)`@``!`!``(D```"
+M/```0B0E("`"*``%)`GX0``*``8D`0`")!@`OX\4`+&/$`"PCP@`X`,@`+TG
+MZ/^])Q``OZ\`$04`(Q!%`(`0`@`A$((`1!-#C`H`8!`!``(D"0!B%"40````
+M``(\``!")`GX0``4``4D`'A",`(``!#"$@(`)1```!``OX\(`.`#&`"])]C_
+MO2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@```$04`(Q!%`(`0`@`A$"("1!-#
+MC`$``B0(`&(0```"/"T`8!`E$````@`")"$`8A`E$```*0``$"``OX\``$(D
+M)2`@`@@`!20)^$``"``&)"6```````(\``!3)````CP$```0``!2)`GX0`(*
+M``0D`0`0)N@#`BH'`$!0```"/"4@(`()^&`"%``%)`!X0C#U_T`4```"/```
+M0B0E("`""``%)`GX0``E,```"@``$.@#`BH```(\``!")"4@(`(L``4D!``&
+M)`GX0``E.````@``$"``OX\@`+^/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TG
+M)2#``!``HX\@`*F/*`"HC_W_8B0"`$(L`@!`%``,!CR`-@,`_P^$,!@`HH^`
+M%`(`)2""```3!P`#``,\`/!C-"000P`E(((``0`",0,`0!`E((8```$"/"4@
+M@@`"$0@``0!",$`7`@`E$$0`)`"CCRL8`P!`'@,`)1AB``L`HZ@(`*.X__\"
+M)`X`(A%`$PD`!P`#/`#@8S0D$$,`#P"BJ`P`HK@+`**("`"BF`!``SPE$$,`
+M"P"BJ`@`HK@$```0!``",0\`H*@,`*"X!``",0X`0!!```,\"P"BB`@`HI@E
+M$$,`"P"BJ`@`HK@/`*.(#`"CF/C_!#PP`**/)!!$`"488@`/`*.H#`"CN`@`
+MX`,!``(D"`#@`R40```+`**("`"BF``@`SPE$$,`"P"BJ`@`HK@(`.`#````
+M``L`X!`0`**/#P"CB`P`HY@!`$(L`!,"`"489@`E$$,`#P"BJ`P`HK@0```0
+M``````H`0%``$,(T%`"BCPL`0X@(`$.8"P"CJ`@`H[@/`*:H#`"FN`4``!`E
+M$&``"P"@J`@`H+@/`**H#`"BN!<`H*@4`*"X%P"BB!0`HI@3`**H$`"BN`@`
+MX`,!``(D%P"CB!0`HY@!`&,P.P!@$`\``B07`**(%`"BF/X?0C```,*D$P"B
+MB!``HI@"%`(``@#"I`0`P*`3`**($`"BF`$`0C`7`$`4`````!,`HH@0`**8
+M`@!",`(`0!`!``(D!`#"H!,`HH@0`**8"`!",`0`0!``````!`#"D`(`0C0$
+M`,*@$P"BB!``HI@$`$(P!`!`$``````$`,*0!`!"-`0`PJ`+`**("`"BF((4
+M`@`/`$(P!0#"H!<`HH@4`**80A,"``8`PJ`3`**($`"BF``/0C`"$@(`!P#"
+MH!,`HH@0`**8\`!",`(1`@`(`,*@"@#`H`L`P*`E$```"`#@`P`````(`.`#
+M````````````````!`"BD`@`0C0$`**@"`#@`R40``````````````````#@
+M_[TG'`"_KQ@`LJ\4`+&O$`"PKR6(@`````(\``!")-"8!30)^$``%AP&)"6`
+M``````(\``!2)"4@(`*`F`4T"?A``@$`!CP!`!`F"``"*OK_0!0E("`"```"
+M/```0B0)^$```)P%-`(>`@`"(0,`#P!C,``9`P````(\``!")"4@@P`)^$``
+M"``%)!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])\#_O2<X`+^O-`"WKS``MJ\L
+M`+6O*`"TKR0`LZ\@`+*O'`"QKQ@`L*\EH*``):C``"6PX`!0`+>/__^1,```
+M`CP``$(D"?A``/`N!"0EF$``+@%@$@(`$"0ED&`"```"/```0B0E(&`"```%
+M/&`:I20)^$``<!(&)`P`=*X0`'6N%`!VKL@!<:;*`6"F/P`")/P!8J8``F"N
+MK"Y@KL@N8*X`!P(DT"YBKO__`B34+F*NV"YBKMPN8JX```(\``!")"4@8`()
+M^$``)2@```\!0!`#`!`DR`%#EAOQ`C00`&)4```"/```$#P``!`F)2!``@"B
+M!30)^``")3```"4@0`)\F`4T"?@``AD`!B0```(\``!")`GX0`#H`P0D```"
+M/```0B0E($`""?A``"!`!23_`$,P`AD#`,P!0ZX/`$(PT`%"IO[_8R0#`&,L
+M[P!@$`T`$"0```(\``!")"4@0`()^$``&)@%--(!0J8!``(\_+=")`GX0``E
+M($`"XP!`$`X`$"3,`4*.!`!"+`@`0!0```(\``!")"4@0`(`F`4T"?A```<`
+M!B0'```0```"/```0B0E($`"`)@%-`GX0`!'``8D```"/```0B0)^$``T`<$
+M)`$``CS`L4(D"?A``"4@0`+4`4*F\`!",!```R3&`$,4#0`0)````CP``$(D
+M)2!``L$`!20)^$``$`"F)[X`0!`(`!`D$`"BEP`P0BRZ`$`4!0`0)!``HI=P
+M$F*F```"/```0B0E($`""?A``!!`!208`$,PPA@#``(``B2N`&(4"@`0)```
+M`CP``$(D)2!``C\`!20)^$``$`"F)Z8`0!`(`!`D$`"BEW(28J8EH```)8``
+M`````CP``%$D)2!``L``!28)^"`"$`"F)YD`0!`0`**7)J""`@$`$"9``P(N
+M]_]`%"4@0`+__P(TD@""%@<`$"0*``(DYA-BI@,``B3P%6*F)8````8`8R8+
+M``0D0!`0`"$04`"`$`(`(1!0`(`0`@`A$$,`Z!-$I`$`$"8*``(N]_]`%$`0
+M$``E@``````"/-`L2B0"`&DF#`!H)@L`!B0(`&<F0!`0`"$H4P`A&$H```!D
+ME/@5I*0A&$D`\!5DI"$04`"`$`(`(1!0`(`0`@`A&$@`J!9FI"$01P`0%D:D
+M`0`0)@,``B[O_T`40!`0`````CP``$(D)2!``@GX0`!P$F4F7P!`$`@`$"3,
+M`4*.!`!"+"``0%2*$F"FBA)BEAP`0!```!$\```Q)B4@0`(`F`4T"?@@`@=`
+M!B0``!`\```0)@GX``+0!P0D`0`"/,"Q0B0)^$``)2!``M8!0J8E($`"`)@%
+M-`GX(`('``8D"?@``M`'!"36`4*6\`!","```R0$`$,0#0`0)#T``!``````
+MBA)@I@```CP``$(D)2!``K\`!20)^$``$`"F)S0`0!`(`!`D$`"BEW028J8(
+M`D*F```"/```0B3``4*N`0`"/#BZ0B0)^$``)2!``@```CP``$(D"?A``"4@
+M0`(EH```)8```!\`%B0```(\``!5)`0`<28E($`"(RC0`@GXH`(0`*8G%P!`
+M$!``HI<AH(("0!@0`"$@<0`"$@(`*"R"H"48@``0`**3*2QBH`$`$"8#``(N
+M\/]`5"4@0`(!`(,N`@`"//W_0C0F$(("`0!"+"488@`&`&`4"0`0)`P``!`E
+M$$`"`@``$`@`$"0(`!`D!`!@$@```CP``$(D"?A``"4@8`(!`.!6``#PKB40
+M```X`+^/-`"WCS``MH\L`+6/*`"TCR0`LX\@`+*/'`"QCQ@`L(\(`.`#0`"]
+M)^C_O2<4`+^O$`"PKR6`@`````(\``!")`GX0`!P$@4F```"/```0B0)^$``
+M)2```A0`OX\0`+"/"`#@`Q@`O2>@_[TG7`"_KU@`OJ]4`+>O4`"VKTP`M:](
+M`+2O1`"SKT``LJ\\`+&O.`"PKR6@@```@`(T$`"BKR"8`C04`**O554"/%55
+M0C0@`**OJJH"/*JJ0C0D`**O9F8"/&9F0C0H`**OF9D"/)F90C0L`**O);@`
+M`!``HB<P`**O&`"^)X"`%P`P`*./(1!P````4HPE((`"```#/```8R0)^&``
+M)2A``B&`T`,```*N)8@````4$0`E@%$`)2"``B4H0`(```(\``!")`GX0``E
+M,``")2"``@```SP``&,D"?A@`"4H0`(#`%`0`0`Q)BX``!`E$`````$B*N[_
+M0!0`%!$`)8@``"``LR<```(\``!6)````CP``%4D@!`1`"$08@(``%",)2"`
+M`B4H0`()^,`")3```B4@@`()^*`")2A``@,``A(!`#$F%P``$"40```$`"(J
+M\?]`%(`0$0"`$!<`,`"DCR$8@@`A$,(#)2"``@``1HP```(\``!")`GX0```
+M`&6,`0#W)@(`XBJ]_T`4@(`7`````CP``$(D"?A``&0`!"0!``(D7`"_CU@`
+MOH]4`+>/4`"VCTP`M8](`+2/1`"SCT``LH\\`+&/.`"PCP@`X`-@`+TG__^E
+M,``!HC`&`$`0.!,")```PJ34%P(D``#BI`@`X`,!``(D@`"B,`H`0!``````
+MBA*"E`<`0!``````"`D")```PJ2L"@(D``#BI`@`X`,!``(D"`#@`R40```(
+M`.`#`0`")-#_O2<H`+^O)`"SKR``LJ\<`+&O&`"PKR68@``EB&`")9!@`@@"
+M0Y8!``(D!@!B%.`!4"8```(\``!")!``!20)^$``$`"F)P0``*Z&$B*6!P!`
+M$`$``B0$``*N=A(BE@0`0%2*$B*6`P`")`0``JZ*$B*6!0!`$`@)`B0$``*.
+M!`!"-`0``JX("0(D$``"IJP*`B02``*F.!,")`P``J;4%P(D#@`"I@```HX!
+M``,\`P!C-"400P`"``,\)1!#``H``R0(``.F@``#)`H``Z;?_P,\__]C-"00
+M0P"__P,\__]C-"000P````*N>A(BE@T`0!````(\``!")"4@8`(/``4D"?A`
+M`$@21B8&`$`0`0`")$P20JX```*.@``#/"400P````*N#0`")!0``JX!``(D
+M:!)"KB@`OX\D`+./(`"RCQP`L8\8`+"/"`#@`S``O2<`````X/^])QP`OZ\8
+M`+*O%`"QKQ``L*\ED(``)8B@````$#P``!`F*(`%-`GX``($`":.)2!``BR`
+M!30)^``"#``FCB4@0`(P@`4T"?@``A``)HXE($`"-(`%-`GX``((`":.)2!`
+M`B"`!30)^``"```FCAP`OX\8`+*/%`"QCQ``L(\(`.`#(`"])]#_O2<H`+^O
+M%`"EK]P!@XP!``(D"0!B$/__`C0-`&`0```"/`8``B0)`&(0"``")!(`8A0!
+M`*(D__\"-!P`HJ\'``(\__]"-`L``!`@`**O```"/```0HPC$*(`P!`"`!P`
+MHJ\```(\``!"C",0H@#`$`(`(`"BKP$`HB08`**O@`$"//__0C0D$,(`$`"B
+MKP```CP``$(D"?A``!``I2<H`+^/"`#@`S``O2?@_[TG&`"_KQ0`L:\0`+"O
+M)8B`````$#P``!`F*(`%-`GX``(E,``````"/```0B0E("`""?A```2`!30$
+M``,\)1!#`,__!CS__\8T)2`@`@2`!30)^``")#!&`"4@(`(@@`4T"?@``O__
+M!C08`+^/%`"QCQ``L(\(`.`#(`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"P
+MKR6(@``ED*``$@!"EAL`0!`EF"`"```"/```0B0)^$``!(`%-!``!CP``!`\
+M```0)B4@(`($@`4T"?@``B4P1@`E("`")(`%-`GX``(0`$:6)2`@`CB`!30)
+M^``"$@!&EA0`1HXE("`",(`%-`GX``+`,`8`#P``$````CP```(\``!")"4@
+M(`()^$``!(`%-.__!CS__\8T```#/```8R0E("`"!(`%-`GX8``D,$8````"
+M/```0B0E("`"*(`%-`GX0````$:.```"/```0B0E("`""?A``""`!32`_P,\
+M)!!#``@`0Y8E,$,`&`!"E@4`0!`$`$(D`!0"`'\``SPD$$,`)3#"````$#P`
+M`!`F)2`@`@GX``(@@`4TT"YFCO__`CS_`$(T)##"`!H`0I8`$@(``/]","4P
+MP@#0+F:N)2`@`@GX``(8@`4T```"/```0B0E("`""?A```1`!23__P,\)!!#
+M`!P`1H[]_\8DP#`&`/__QC`E("`"!$`%)`GX``(E,$8`(`"_CQP`LX\8`+*/
+M%`"QCQ``L(\(`.`#*`"])^C_O2<0`+^O```"/```0B0)^$``"$`%)"L0`@`0
+M`+^/"`#@`Q@`O2?@_[TG&`"_KQ0`L:\0`+"O)8B``"6`H`````(\``!")`GX
+M0`#```4D)2!``/__`B0$`()4!0$"/````*X[```0)1```+K80C0D&((`"``"
+M/"00@@`$`$`0```#K@!``CPE$&(````"K@4`@C`%`$`0P`6",````HX!`$(T
+M```"KL`%@C`%`$`0(`"",````HY``$(T```"KB``@C`(`$!0```"CF@2(HX$
+M`$`0`$`#/````HXE$$,````"K@```HX`0`,\)!!#`!<`0!```!`\4!(DK@``
+M$"8E("`""?@``L0`!214$B*N)2`@`@GX``+(``4D6!(BKB4@(`()^``"S``%
+M)%P2(JXE("`""?@``M``!21@$B*N)2`@`@GX``+4``4D9!(BK@$``B08`+^/
+M%`"QCQ``L(\(`.`#(`"])P@`X`,X+(*,V/^])R0`OZ\@`+2O'`"SKQ@`LJ\4
+M`+&O$`"PKR68@``EB*``."QTC@L`@08E@&`"```"/```0B0D``4D"?A``"4P
+M``````(\``!")"4@8`()^$``)``%)`4!`CRZV$(T)#`B`D``(C(.`$`0`0`B
+M,CPL`HX!`$!40`#&-$`L`HX!`$!4``'&-$0L`HX!`$!4@`#&-$@L`HX!`$!4
+M``3&-`$`(C(!`$!4!P#&-`!``CPD$"("`@!`$`@``CPE,,(````"/```4B0E
+M(&`""?A``J``!20%`"$&."P1KB4@8`(D``4D"?A``@$`!B0E$(`")`"_CR``
+MM(\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2<(`.`#@``").C_O2?__Z,P@`!B
+M+`H`0!`0`+^O0!D#`!R(!30```(\``!")`GX0``A*&4``(!#,`(`8!0!``(D
+M)1```!``OX\(`.`#&`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O__^E,(``HBPM
+M`$`0)9"``$")!0``B`4T```0/```$"8A*"4""?@``B4P```$B`4T)2!``B$H
+M)0()^``")3````B(!30E($`"(2@E`@GX``(E,```#(@%-"4@0`(A*"4""?@`
+M`B4P```0B`4T)2!``B$H)0()^``")3```!2(!30E($`"(2@E`@GX``(E,```
+M&(@%-"4@0`(A*"4""?@``B4P```<B`4T)2!``B$H)0()^``")3````(``!`!
+M``(D)1```!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])]C_O2<@`+^O'`"SKQ@`
+MLJ\4`+&O$`"PKR68@``E(,``__^E,(``HRPD`&`0)1```!0`@%`ED```!0"2
+MD`"2$@`$`(*0)9!"`@,`AI``-@8``@""D``4`@`E,,(``0""D``2`@`E,,(`
+M``""D"4PP@!",`8`P!<2`"4PP@`"```00I`2`"4P``!`B04`&(@%-```$#P`
+M`!`F)2!@`@GX``(A*"4"'(@%-"4@8`(A*"4""?@``@"`1C8!``(D(`"_CQP`
+MLX\8`+*/%`"QCQ``L(\(`.`#*`"])\C_O2<T`+^O,`"^KRP`MZ\H`+:O)`"U
+MKR``M*\<`+.O&`"RKQ0`L:\0`+"O);B``$0`IZ](`**/__^^,`$`1"PC(`0`
+M554"/%950C0D(((`(R""`(``PR]Y`&`0)1``````PY`!``(D"P!B$`(`8B@%
+M`$!0!0`")`D`8!`E$```<```$#0`OX\4`&(0)1```&P``!`T`+^/$0``$`4`
+M%B0"`,.4!0!C+&8`8!0T`+^/`@#"E`8`0BP)`$`4);````(`PI0.`$(L`0!6
+M+".P%@`"`-8R`@``$`$`UB8'`!8D!`#'D`4`PI``$@(`)3CB``8`PI``%`(`
+M)3CB``<`PI``%@(`)3CB`"8XY``(`,.0"0#"D``2`@`EJ&(`)JBD`O__M3(*
+M`-.0"P#"D``2`@`EF&("#`#"D``4`@`EF&("#0#"D``6`@`EF&(")IAD`@X`
+MPY`/`,*0`!("`"6@8@`FH(0"__^4,A``TI`1`,*0`!("`"600@(2`,*0`!0"
+M`"600@(3`,*0`!8"`"600@("`,*4#@!"+`(`0!`FD$0"_P!2,D")'@``B`4T
+M```0/```$"8E(.`"(2@E`@GX``(E,.``!(@%-"4@X`(A*"4""?@``B4PH`((
+MB`4T)2#@`B$H)0()^``")3!@`@R(!30E(.`"(2@E`@GX``(E,(`"$(@%-"4@
+MX`(A*"4""?@``B4P0`(4B`4T)2#@`B$H)0()^``")3#``@```CP``$(D)2#@
+M`B4HP`,)^$``1`"FCS0`OX\P`+Z/+`"WCR@`MH\D`+6/(`"TCQP`LX\8`+*/
+M%`"QCQ``L(\(`.`#.`"])P``````````Z/^])Q``OZ\L+(,D```"/```0B0E
+M(*``)2A@``GX0``&``8D$`"_CP@`X`,8`+TGZ/^])Q``OZ\```(\``!")"PL
+MA"0)^$``!@`&)`$``B00`+^/"`#@`Q@`O2?H_[TG$`"_KP```CP``$(D)2"@
+M````!3S@+*4D"?A```8`!B00`+^/"`#@`Q@`O2<(`.`#)1```.#_O2<<`+^O
+M&`"RKQ0`L:\0`+"O)8B``"40H``ED,`````0/```$"8`8`4D"?@``B4P0``E
+M("`""&`%)`GX``(!``8D```"/```0B0E("`"#&`%)`,`!B0)^$```@`')`<`
+M0!`E("`"```"/```0B0)^$``!&`%)```0J8!``(D'`"_CQ@`LH\4`+&/$`"P
+MCP@`X`,@`+TG__^E,"48@``(`F*4"`!%$`P`!"1R$F*4@`!",`$`1"PC(`0`
+M^/\")"0@@@`+`(0D`0#`5```Q*P(`.`#)1```(82@I0%`$`0)1@``'82@I0"
+M`$`4`0`#)$,``R2*$H*4`0!`5`0`8S0(`.`#)1!@`.#_O2<<`+^O&`"RKQ0`
+ML:\0`+"O)9"``$@24)8<`!$R@H@1``(`$#(K@!`````"/```0B0)^$``)2@@
+M`@```CP``$(D)2!``@GX0```F`4T```#/```8R0E($`"`)@%-`GX8```($8T
+M```"/```0B0E($`""?A``"4H(`(F$%`````#/```8R0E($`")2@@`@GX8``K
+M,`(`'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGX/^])Q@`OZ\4`+&O$`"PKR6(
+M@``E@*`````"/```0B0)^$``%$`%)$"`$``#``8D!#`&`@```SP``&,D)2`@
+M`A1`!20)^&``)3!&``$``B08`+^/%`"QCQ``L(\(`.`#(`"])^#_O2<8`+^O
+M%`"QKQ``L*\EB(``)8"@`````CP``$(D"?A``!1`!21`@!```P`&)`0P!@(G
+M,`8````#/```8R0E("`"%$`%)`GX8``D,$8``0`")!@`OX\4`+&/$`"PCP@`
+MX`,@`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\ED(``)8B@`"6`P`````(\``!"
+M)`GX0``80`4D`0`#)`08(P(G&`,`)!!#``$`$#($@#`"```#/```8R0E($`"
+M&$`%)`GX8``E,%```0`")!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])^C_O2<4
+M`+^O$`"PKR6`H``&``(N"`!`$/__`B0```(\``!")`GX0``<0`4D+P!",`80
+M`@(!`$(P%`"_CQ``L(\(`.`#&`"])^#_O2<8`+^O%`"QKQ``L*\EB(``)8#`
+M`````CP``$(D"?A``!1`!23^_P,\_']C-"0P0P`#```2`(#&-`$``CPE,,(`
+M```"/```0B0E("`""?A``!1`!20X+"..``$%/````CP``$(D)2`@`@GX0``E
+M*&4`&`"_CQ0`L8\0`+"/"`#@`R``O2?@_[TG&`"_KQ0`L:\0`+"O)8B``"6`
+MH`````(\``!")`GX0``00`4D\?\#/)__8S0D$$,````#/.@L8R0'`!`R@(`0
+M`"&``P(```:.```#/```8R0E("`"$$`%)`GX8``E,$8`&`"_CQ0`L8\0`+"/
+M"`#@`R``O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKR6`@`#__](P```"/```0B0R
+M+`0F"?A```8`!B0R+`.2,RP"D@`2`@`E&&(`-"P"D@`4`@`E&&(`-2P&D@`V
+M!@```!$\```Q)B4@``((@`4T"?@@`B4P9@`V+`:2-RP"D@`2`@`E,,(`_S]2
+M,@"4$@`E(``"#(`%-`GX(`(E,-(`'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TG
+MV/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6@@````!(\``!2)@GX0`),
+M@`4T)9A``"4@@`()^$`"4(`%-"6`0``E((`""?A``DR`!30KF%,`(8`3`B6(
+M````B!``)8```"48```E$`(")1@C`B0`OX\@`+2/'`"SCQ@`LH\4`+&/$`"P
+MCP@`X`,H`+TGZ/^])Q``OZ\```(\``!")`GX0`!,@`4T$`"_CP@`X`,8`+TG
+MZ/^])Q0`OZ\0`+"O)8"``````CP``$(D"?A``""`!30``08\```#/```8R0E
+M(``"((`%-`GX8``E,$8`%`"_CQ``L(\(`.`#&`"])]C_O2<@`+^O'`"SKQ@`
+MLJ\4`+&O$`"PKR68@`````(\``!")`GX0`!DF`4TPI0"`/\!4C(``4(R`P!`
+M$```$3S_`5(Z)Y`2````,28E(&`""?@@`E"`!30E@$``)2!@`@GX(`),@`4T
+M)H`"`B80$@(@`+^/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TGZ/^])Q0`OZ\0
+M`+"O)8"``````CP``$(D"?A``"!`!23_`$,P`AD#``\`1##,`0*.!`!#%"4H
+M``#0`0*6`0!$4`$`!20E$*``%`"_CQ``L(\(`.`#&`"])^#_O2<<`+^O&`"R
+MKQ0`L:\0`+"O)9"``"6`H````!$\```Q)@GX(`*0@`4T```#CB$00P````*N
+M)2!``@GX(`*,@`4T!``#CB$00P`$``*N)2!``@GX(`*4@`4T#``#CB$00P`,
+M``*N)2!``@GX(`*(@`4T"``#CB$00P`(``*N)2!``@GX(`*8@`4T$``#CB$0
+M0P`0``*N'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGX/^])QP`OZ\8`+*O%`"Q
+MKQ``L*\EB(``)8"@``D``BX(`$`4)9`@`@```CP``$(D"?A``/__!30K$%``
+M!`!`4````CS4+E"N#0``$"40`````$(D)2`@`@GX0``E*``"```#/```8R0E
+M("`"<!`%)`GX8``E,$``U"Y0K@$``B0<`+^/&`"RCQ0`L8\0`+"/"`#@`R``
+MO2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``<!`%)````SP``&,D)2``
+M`@GX8`#__T4P%`"_CQ``L(\(`.`#&`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O
+M$`"PKR6(@``ED*``)9@@`@```CP``$(D"?A``/\?!20K$%(`!0!`4````CS_
+M_P(DV"YBKA8``!`E$`````!")"4@(`()^$``%(`%-"6`0`````(\``!")"4@
+M(`()^$``)2A``@#@`R0D@`,"_Q]",````SP``&,D)2`@`A2`!30)^&``)3`"
+M`M@N<JX!``(D(`"_CQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])^C_O2<4`+^O
+M$`"PKR6`@`````(\``!")`GX0``4@`4T```#/```8R0E(``""?A@`/\?13`4
+M`+^/$`"PCP@`X`,8`+TGRRZ"D`$`0C@(`.`#`0!",.#_O2<<`+^O&`"RKQ0`
+ML:\0`+"O)9"``!$`H!`EB$`"```"/```0B0)^$``!(`%-/_^$#S__Q`V```#
+M/```8R0E("`"!(`%-`GX8``D,%``R"XBCB004``0```0R"XBK@```CP``$(D
+M)2!``@GX0``$@`4T``$0/````SP``&,D)2!``@2`!30)^&``)3!0`,@N(HXE
+M$%``R"XBK@$``B0<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?8_[TG(`"_KQP`
+MLZ\8`+*O%`"QKQ``L*\EB(``)9"@`"68(`(```(\``!")`GX0`#_'P4D*Q!2
+M``4`0%````(\__\")-PN8JX9```0)1``````0B0E("`""?A``!2`!30E@$``
+M```"/```0B0E("`""?A``"4H0`(`X`,\__]C-"2``P(`%`(`_Q\#/"000P``
+M``,\``!C)"4@(`(4@`4T"?A@`"4P`@+<+G*N`0`")"``OX\<`+./&`"RCQ0`
+ML8\0`+"/"`#@`R@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``%(`%
+M-`(L`@````(\``!")"4@``()^$``_Q^E,!0`OX\0`+"/"`#@`Q@`O2<(`.`#
+M`0`")`@`X`,`````"`#@`R40```(`.`#``````@`X`,`````Z/^])Q``OZ\`
+M``(\``!")`GX0``<G`4T_P!",!``OX\(`.`#&`"])^C_O2<0`+^O```"/```
+M0B0)^$``6(`%-`<`0C`0`+^/"`#@`Q@`O2?H_[TG$`"_KP<`IC````(\``!"
+M)`GX0`!8@`4T$`"_CP@`X`,8`+TG"`#@`ZPN@HSH_[TG$`"_KS02AHP$`,!4
+M```"/*PNA:P$```0`0`")```0B0)^$```````!``OX\(`.`#&`"])^C_O2<!
+M``(D"0"B%!``OZ\"`,(L"@!`%"40```%``,D!P##%`T``B0%```0)1``````
+M`CP``$(D"?A````````0`+^/"`#@`Q@`O2?@_[TG&`"_KPL``B0)`*(4)1B`
+M``8`YC#X`6:L```"/```0B0)^$``2(`%-`<``!`!``(D,`"BCQ``HJ\```(\
+M``!")`GX0``E(&``&`"_CP@`X`,@`+TGX/^])Q@`OZ\P`**/-`"CCQ``HJ\`
+M``(\``!")`GX0``4`*.O*Q`"`!@`OX\(`.`#(`"])]#_O2<L`+^O*`"VKR0`
+MM:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKS$`H!`EB(`````"/```0B0)^$``!$`%
+M)/S_!CS__\8T```#/```8R0E("`"!$`%)`GX8``D,$8````"/```0B0)^$``
+M"@`$)`H`$"0```(\``!2)`$`%CP```(\``!5)/S_%#S__Y0V```"/`L``!``
+M`%,D"?B@`L@`!"0E("`""?A``@1`!20E("`"!$`%)`GX8`(D,%0`__\0)@@`
+M`!(E("`""?A``A!`!20D$%8`\/]`%``````$``!6```"/`\``!`E$``````"
+M/```0B0E("`""?A```2`!33[_P8\___&-````SP``&,D)2`@`@2`!30)^&``
+M)#!&``$``B0L`+^/*`"VCR0`M8\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,P
+M`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0`+"O)8B``"6`H`````(\``!2)`GX
+M0`($@`4T!``&/````SP``',D)2`@`@2`!30)^&`")3!&``D``!(E("`""?A`
+M`@1`!23\_P8\___&-"4@(`($0`4D"?A@`B0P1@`@`+^/'`"SCQ@`LH\4`+&/
+M$`"PCP@`X`,H`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0`+"O)8B``"6`H```
+M``(\``!2)`GX0`($@`4T!``&/````SP``',D)2`@`@2`!30)^&`")3!&``D`
+M`!(E("`""?A``@1`!23\_P8\___&-"4@(`($0`4D"?A@`B0P1@`@`+^/'`"S
+MCQ@`LH\4`+&/$`"PCP@`X`,H`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\EB*``
+M)2C```$`$"0-`#`2)9"```8`(!(!``(\`@`")`X`(A(E$```$P``$!P`OX^@
+MTT(D"?A````````+```0)8!```$``CSLU$(D"?A````````&```0J"Y1K@$`
+M`CQ\U4(D"?A```````"H+E&N)1```AP`OX\8`+*/%`"QCQ``L(\(`.`#(`"]
+M)^C_O2<0`+^O```"/```0B0)^$``!$`%)`(4`@`#`$(P$`"_CP@`X`,8`+TG
+M``````````#H_[TG%`"_KP(``B03`*(0$`"PKP,`HBP&`$`0!``")`$``B0'
+M`*(0)1```!,``!`4`+^/!@"B$"40```/```0%`"_CP```CP&```0``!0)```
+M`CP#```0``!0)````CP``%`D```"/```0B0)^$``)2@``B40``(4`+^/$`"P
+MCP@`X`,8`+TG``````````#H_[TG$`"_KP```CP``$(D"?A```P`!200`+^/
+M"`#@`Q@`O2?H_[TG$`"_KR4PH`````(\``!")`GX0``,``4D$`"_CP@`X`,8
+M`+TGZ/^])Q``OZ\```(\``!")`@`!20)^$``!``&)!``OX\(`.`#&`"])^C_
+MO2<4`+^O$`"PKR6`@`````(\``!")`@`!20)^$``(``&)````CP``$(D)2``
+M`@@`!20$``8D"?A``"4X```K$`(`%`"_CQ``L(\(`.`#&`"])^C_O2<4`+^O
+M$`"PKR6`@`````(\``!")`GX0`!(@`4TW_\&)````SP``&,D)2```DB`!30)
+M^&``)#!&`!0`OX\0`+"/"`#@`Q@`O2?H_[TG%`"_KQ``L*\E@(`````"/```
+M0B0)^$``2(`%-````SP``&,D)2```DB`!30)^&``(`!&-!0`OX\0`+"/"`#@
+M`Q@`O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKR6(@``E$*``)9#`````$#P``!`F
+M0(`%-`GX``(E,$``)2`@`D2`!30)^``")3!``AP`OX\8`+*/%`"QCQ``L(\(
+M`.`#(`"])^#_O2<8`+^O%`"QKQ``L*\EB(``)8"@`$```RXA`&`0)1```"``
+M`BX0`$`4```"/```0B0)^$``1(`%-.#_`R8!``8D!#!F`"<P!@````,\``!C
+M)"4@(`)$@`4T"?A@`"0P1@`/```0`0`")```0B0E("`""?A``$"`!30!``8D
+M!#`&`B<P!@````,\``!C)"4@(`)`@`4T"?A@`"0P1@`!``(D&`"_CQ0`L8\0
+M`+"/"`#@`R``O2?@_[TG&`"_KQ0`L:\0`+"O)8B``"6`H`!```,N'P!@$"40
+M```@``(N#P!`%````CP``$(D"?A``$2`!33@_P,F`0`&)`0P9@````,\``!C
+M)"4@(`)$@`4T"?A@`"4P1@`.```0`0`")```0B0E("`""?A``$"`!30!``8D
+M!#`&`@```SP``&,D)2`@`D"`!30)^&``)3!&``$``B08`+^/%`"QCQ``L(\(
+M`.`#(`"])^C_O2<0`+^O```"/```0B0)^$``/(`%-!``OX\(`.`#&`"])^C_
+MO2<0`+^O)3"@`````CP``$(D"?A``#R`!300`+^/"`#@`Q@`O2<+`*"H"`"@
+MN/\/PC`/`**H#`"BN`\`HX@,`*.8$`!F%"40```@`.(P!@!`$``````/`**(
+M#`"BF``@0C0/`**H#`"BN!<`H*@4`*"X%P"BB!0`HI@3`**H$`"BN`$``B0(
+M`.`#`````.#_O2<<`+^O&`"RKQ0`L:\0`+"O)9#``#@`L8\E@*``%P`#BA0`
+M`YH!`&,P4`!@$`\``B07`.*(%`#BF`$`0C`&`$`4```"/```0B0)^$``#``%
+M)$8`4A`/``(D$P`"BA```IK_#T(P```BIA<``HH4``*:PA,"`/\?0C`"`"*F
+M!``@HA<``HH4``*:`@!",!<`0!0`````%P`"BA0``IH$`$(P`P!`$`$``B00
+M```0!``BHA<``HH4``*:$`!",`0`0!`$`"*2"`!"-`@``!`$`"*B`@!"-`0`
+M(J(7``**%``"FN``0C!"$0(`!0`BHA,``HH0``*:PA0"``8`(J(7``**%``"
+MF@`!0C`'`$`0_P`")!<``HH4``*:`'Y",$(2`@`"```0!P`BH@<`(J(3``**
+M$``"FL(3`@`/`$(P"``BHA,``HH0``*:PA8"``<`0C`)`"*B$P`"BA```IH"
+M$P(``0!",`H`(J(E$```'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TG`````(#_
+MO2=\`+^O>`"^KW0`MZ]P`+:O;`"UKV@`M*]D`+.O8`"RKUP`L:]8`+"O)9"`
+M`(0`I:\EL,``C`"GKR6@0`)(`*"O3`"@KU``H*\"`,*6PA$"``$`0S`"`,*6
+M``%",`4`0!`EN```Y0)@%`P``R0(```0`@#"E@(`PI;"$0(``0!".`$`0C#=
+M`D`4#``#)`(`PI:"$0(``0!#,`(`PI8@`$(P!0!`4`(`PI;4`F`4#``#)`<`
+M`!````(\@A$"``$`0C@!`$(PS0)`%`P``R0```(\``!")"4@0`()^$``)2C`
+M`B7P0`#%`L`3#``#)`8``B2$`*./"P!B$`<`8BP&`$`0"``")`(`8BR\`D`0
+M#``#)`4``!",`**/A`"DC[<"@A0,``,DC`"BCRH`0!````(\``!0)"4@0`()
+M^``"3(`%-$P`HJ\E($`""?@``E"`!310`**OS`%"C@0`0BP&`$`4)8@``"4@
+M0`()^``"0!$%)`X``!`0`**O```"/```5200`+,G@(`1`"4@0`()^*`"0!$%
+M)B&`<`(```*N`0`Q)@H`(B[X_T`4@(`1``0`PY,"`&(P!`!`5`(`PI?^`&(P
+M!`#"HP(`PI<"`,*F!`#"DP0`PJ(```(\``!")"4@0`()^$``6(`%-"6H0``!
+M`*!2`0`5)```$#P``!`F)2!``@GX``($@`4T``(#/"000P!$`**O)2!``@GX
+M``(00`4D_@`#/&``8S0D$$,`0`"BKR4@0`()^``"%$`%)#@`HJ\E($`""?@`
+M`AA`!20\`**O```"/```0B0E($`""?A```(`Q99E`D`0`P`#)`(`PI;P`4,P
+MP``")!@`8A#!`&(H!@!`$$`!`B2@``(D$`!B4`,``B05```0S`%"C@4`8A!0
+M`0(D!P!B$`(`!"0/```0S`%"C@$``R1(`*.O"@``$`$`%R1(`*2O!P``$`$`
+M%R1(`**O!```$`(`%R0$``,D2`"CKP(`%R3,`4*.!`!"+`@`0!0```(\``!"
+M)"4@0`(`F`4T"?A```<`!B0'```0S`%"C@``0B0E($`"`)@%-`GX0`!'``8D
+MS`%"C@0`0BQ&`$`4`0`"/`(`PY:``&(P+@!`$"6(``!P$H*6`3!"+"L`0!0`
+M``(\(`!B,`0`0%!N$Y&6;!.1E@(``!!P$Y.6<A.3E@``$#P``!`F)2`@`@GX
+M``(#``4D)8A``"4@8`()^``"`P`%)```!SS,1N<D@#`7`"P!Q20A**<```"D
+MC#__`R0D((,`@!D1`,``8S`E((,```"DK#@!QB0A,,<```#$C/#_`R0D((,`
+M@A@1``$`8S!`$`(`#@!","488@`E((,```#$K"6(``````(\S$90)````CP`
+M`%,D0!`1`"$040"`&`(`(1AP`"$05P"`$`(`(1!0`"4@0`(``&6,"?A@`@``
+M1HP!`#$F'``B+O/_0!1`$!$``0`"/!CT0B0E($`""?A``"4HP`(EB``````"
+M/!`M4"0```(\``!3)(`0$0`A$%$`@!@"`"$8<`!(`*2/(1!$`(`0`@`A$%``
+M)2!``@``98P)^&`"``!&C`$`,28C`"(N\O]`%(`0$0`EB``````"/"0U4"0`
+M``(\``!3)$`0$0`A$%$`@!@"`"$8<``A$%<`@!`"`"$04``E($`"``!EC`GX
+M8`(``$:,`0`Q)D``(B[S_T`40!`1`"6(``````(\S"]0)````CP``%,DP!`1
+M`"$04````$6,C`"BCP0`0!``@*(D`!!"+`<`0%0!`#$FP!`1`"$04``E($`"
+M"?A@`@0`1HP!`#$FJP`B+O#_0!3`$!$`S`%"C@0`0BP@`$`0C`"CCP``$3P`
+M`#$F)2!``@GX(`(<@`4T#P`#//__8S0D$$,`T`$&/```$#P``!`F)2!``AR`
+M!30)^``")3!&`"4@0`)<``4D"?@``B4P```E($`">)@%-`GX``((``8D)2!`
+M`@GX(`)(@`4T)2!``DB`!30)^``"``1&-(P`HX\A`&`0```"/```4"0E($`"
+M3(`%-`GX``),`*:/)2!``E"`!30)^``"4`"FC\P!0HX$`$(L!P!`%"6(```E
+M($`"0!$%)`GX``(0`*:/#P``$"PL@Y(0`+`G```"/```4R2`*!$`(1`%`B4@
+M0`)`$:4D"?A@`@``1HP!`#$F"@`B+OC_0!2`*!$`+"R#DBTL@I(`$@(`)1AB
+M`"XL@I(`%`(`)1AB`"\LAI(`-@8````"/```4"0E($`"`(`%-`GX``(E,&8`
+M,"R&DC$L@I(`$@(`)3#"`"4@0`($@`4T1`"BCPGX``(E,,(``0`"/(@20B0E
+M($`""?A``(0`I8\```(\``!1)"4@0`()^"`"$$`%)"4@0`(00`4D0`"CCPGX
+M``(E,$,`)2!``A1`!20)^``".`"FCR4@0`(80`4D"?@``CP`IH\E($`"6(`%
+M-`GX``(E,*`",BR#DC,L@I(`$@(`)1AB`#0L@I(`%`(`)1AB`#4LAI(`-@8`
+M)2!``@B`!30)^``")3!F`#8L@I(W+(:2`#(&`"4@0`(,@`4T"?@``B4P1@`E
+M($`"&(`%-`GX``+0+H:.)2!``H``!20)^``"__\&),P!0XX$``(D#0!B%```
+M`CS0`4*6`@!"+`D`0%````(\)2!``@GX(`(4``4D)2!``A0`!20)^``"``1&
+M-````CP``$(D)2!``@GX0``E*,`"_P!`$`,``R0&``(DA`"DCQ8`@A`!``(\
+M!`)"C@,`0C`1`$`0```"/```0B0E($`""?A``$29!33_WP,\__]C-"000P`$
+M`D:.`0#&,$`W!@````,\``!C)"4@0`)$F04T"?A@`"4P1@`!``(\U/A")"4@
+M0`()^$``)2C``@$``CR\[D(D)2!``@GX0``E*,`#VP!`$`,``R3(`4.6&_$"
+M-`L`8A0```(\`@#"EH``0C`&`$`0```"/```0B0E($`""-@%-`GX0``"!08D
+M```"/```0B0E($`"')@%-`GX0``!``8D```"/```0B0E($`""?A``!29!33_
+M/T,P`@#"EB``0C`)`$`0@!`#`"ZZ`SRCBV,T&0!#`!`0``````````````<`
+M`!`"(0(`S,P"/,W,0C09`&(`$!```,(@`@`````````"/```0B0)^$``9`"$
+M)````CP``$(D)2!``@GX0`!@F`4T```#/```8R0E($`"8)@%-`GX8``!`$8T
+M```"/```0B0E($`"8)@%-`$`!B0)^$``)3@``````CP``$(D)2!``@GX0``E
+M*,`#"0!`5+`N@HX"`,.6(`!B,(\`0%0#``,D`@!B-`(`PJ:+```0`P`#)`D`
+M0!````(\``!")"4@0`(@F04T`0`&/`GX0```\,8T`0`")+0N@JXE@````0`3
+M)````CP``%$D@"@0`"4@0`(`$*4D"?@@`@0P$P(!`!`F"@`"*OG_0%2`*!``
+M)8```````CP``%$D)2!``@GX(`(E*``"`0`0)@H``BK[_T`4)2!``@```CP`
+M`%`DI``%)`$`!CP)^``"`0#&-"4@0`*H``4D"?@``@$`!B0E($`"K``%)`GX
+M``(!``8D```"/```420E($`""?@@`K`0!20E($`"L!`%)`GX``(E,$``)2!`
+M`J``!20(``8\"?@``F4)QC0(``(\90E"-#@L@JXE($`""?@@`JP`!20'``8\
+M)2!``JP`!20)^``")3!&``8``B2$`*./#`!B5$P20HXE($`""?@@`J``!20E
+M($`"H``%)`GX``(`$$8T."R"C@`00C0X+(*N3!)"C@0`0!````(\``!")`GX
+M0``E($`"```"/```0B0E($`""?A``""`!31__@8\___&-````SP``&,D)2!`
+M`B"`!30)^&``)#!&`-0NA8[__P(D!`"B$````CP``$(D"?A``"4@0`+8+H6.
+M__\")`0`HA````(\``!")`GX0``E($`"W"Z%CO__`B0$`*(0```"/```0B0)
+M^$``)2!``O@!1HX'`,`0A`"DCP```CP``$(D)2!``@GX0`!(@`4TA`"DC]P!
+M1*X&```0`0`"))``I(\``(*,`0!`5```@ZPE$```?`"_CW@`OH]T`+>/<`"V
+MCVP`M8]H`+2/9`"SCV``LH]<`+&/6`"PCP@`X`.``+TGZ/^])Q``OZ\!``(\
+M].U")`GX0``"``4D$`"_CP@`X`,8`+TGZ/^])Q0`OZ\0`+"O)8"``````CP`
+M`$(D)2@```GX0``!``8D#@!`$!0`OX\!``(\].U")"4@``()^$``$P`%)`<`
+M0!`4`+^/```"/```0B0)^$``-`@$)`$``B04`+^/$`"PCP@`X`,8`+TGX/^]
+M)Q@`OZ\4`+&O$`"PKR6(@`#__[`P```"/```0B0E*```"?A```$`!B1^`$`0
+M\`$#,L```B0K`&(0P0!B*`@`0!!``0(DH``")!(`8A"P``(D$`!B$`$``CQ=
+M```0].U")#@`8A!!`6(H!@!`$%`!`B30``(D&P!B$`$``CQ4```0].U")"\`
+M8A`!``(\4```$/3M0B0``!`\```0)B4@(`($F`4T"?@``B4P```E("`"`*(%
+M-`GX``(#``8D)2`@`GR8!30)^``"&0`&)````CP``$(D"?A``"P!!"0[```0
+M`0`"/````CP``%`D)2`@`@28!30)^``")3```,@!(Y82``(D,0!B5`$``CPE
+M("`"?)@%-`GX``(8``8D```"/```0B0)^$``+`$$)"4@(`(`H@4T"?@``@(`
+M!B0C```0`0`"/!```C((`$`0```"/```0B0E("`"!)@%-`GX0``#``8D!P``
+M$,@!(Y8``$(D)2`@`@28!30)^$``)3```,@!(Y82``(D$`!B5`$``CP``!`\
+M```0)B4@(`)\F`4T"?@``A@`!B0```(\``!")`GX0``L`00D)2`@`@"B!30)
+M^``")3````$``CST[4(D)2`@`@GX0``3``4D$@!`$!@`OX\```(\``!")`GX
+M0``T"`0D```"/```0B0E("`")2@```GX0``!``8D!0!`$"4@(`(!``(\].U"
+M)`GX0``E*```&`"_CQ0`L8\0`+"/"`#@`R``O2?(_[TG-`"_KS``OJ\L`+>O
+M*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR68@``EN*``)?#``````CP`
+M`$(D"?A``"6P8`(EH$``9@"`$C0`OX^T+L*.-@!`$````CP``%4D)2!@`@GX
+MH`(@F04T`0`#/"000P`O`$!4`0`"/+0NP*XE(&`""?B@`A"<!30ED$``)2!@
+M`@GXH`(4G`4T)8!``"4@8`()^*`"&)P%-"4P0``"(A(``A(0`"$@@@""*1``
+M*Q`$`"L8!0`D$$,`&`!`$".(!@`:`"0"$A````$`@%`-``<`/P!1,!H`10(2
+M@````0"@4`T`!P#`_Q`F'P`0,B4@8`()^*`"()D%-$`9$0`E$$,`)1!0````
+M`SP``&,D)2!@`B"9!30)^&````A&-`$``CSX\4(D)2!@`@GX0``E*(`""`!`
+M5````CP"`..6`@!C-`(`XZ8"`(.6_?]C,!\``!`"`(.F``!0)"4@8`()^``"
+M)2B``A(`0!0!``(\```"/```0B0)^$``B!,$)"4@8`()^``")2B``@D`0!0!
+M``(\`@#CEB``8C`,`$!4)1````(`8C0"`.*F"```$"40```<#T(D"?A``"4@
+M8`*T+L*.`0!"+```PJ\!``(D-`"_CS``OH\L`+>/*`"VCR0`M8\@`+2/'`"S
+MCQ@`LH\4`+&/$`"PCP@`X`,X`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\ED(``
+M)8"@``(``!8EB``"__\1)````CP``$(D)2!``@GX0``,``4D```"/```0B0E
+M($`"`$`%)`GX0``E,``"```"/```0B0)^$``#P`$)`,`$#(```(\``!")"4@
+M0`(`0`4D`P`F,@GX0``E.``")8A```$``C((`$`4)1`@`@```CP``$(D)2!`
+M`A0`!20)^$``)3```"40(`(<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?8_[TG
+M)`"_KR``M*\<`+.O&`"RKQ0`L:\0`+"O):"``"68H`````(\``!")```998)
+M^$```@!FE@`4`@`#)`(``@!BEH``0C`2`$`00(`$`"&`!`*`@!`````"/`@Y
+M0B0A@`("```"/```0B0$``2."?A```@`!23_`%(P0)$2`````HX`$0(`)9!"
+M`@(``!`(``2&)9```)$`@B@$`$`0```"/`$`@C`(`$`0```"/```0B3H_X0D
+M"?A```@`!23_`%$P"P``$`$``B3H_X0DPA<$`"$@@@````(\``!")$,@!``)
+M^$``"``%)/\`43`E$```@(@1`$`0`@`EB"("`00Q-O\`1C(`,@8`_P`B,@``
+M$#P``!`F)2"``IR8!30)^``")3#"``**$0``_T(R_P`F,B4@@`+0F`4T"?@`
+M`B4P1@`T$I.N`0`")"0`OX\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TG
+MZ/^])Q``OZ\```(\``!")`GX0`!DF`4TPA0"`/\!0S```6(P`@!`$/\!8C@G
+M&`(`)1!@`!``OX\(`.`#&`"])]C_O2<D`+^O(`"TKQP`LZ\8`+*O%`"QKQ``
+ML*\EH(``_P"S,`",!@`#C!$````2/```4B8)^$`"9)@%-`#P`R0D$$,`0!H3
+M```.8S`E$$,`_P$Q,@``$#P``!`F)2"``F28!30)^``")3!1`"4@@`()^$`"
+M8)@%-"4@@`)@F`4T"?@``@(`1C0$`&`2.``1),`0$P`C$%,`0(H"`"6`````
+M``(\``!3)````CP$```0``!2)`GX0`(E("`"`0`0)CP``BH.`$!0)1```"4@
+M@`()^&`"8)@%-`(`0C#U_T`4/``"*@,`0%0!``(\!```$"40```H\$(D"?A`
+M`"4@@`(D`+^/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])P(`HI3@`4,P
+MP``")!$`8E#0$H*4P0!B*`8`0!!``0(DH``")`D`8E#.$H*4"`#@`R40````
+M````"`!B%`````#,$H*4!P``$```PJ0%```0``#"I`,``!```,*D"`#@`R40
+M```!``(D"`#@`P````#8_[TG(`"_KQP`L:\8`+"O)8B``"6`H``!``(\B/%"
+M)`GX0``0`*8G%P!`$"``OX\```(\``!")"4@(`()^$``8)@%-`$``CPH\$(D
+M"?A``"4@(`(E&$``$`"BARH00P`%`$!0%@`#I@(``I8"`$(T`@`"IA8``Z80
+M`**'*A!#``$`0C@@`+^/'`"QCQ@`L(\(`.`#*`"])]#_O2<L`+^O*`"TKR0`
+MLZ\@`+*O'`"QKQ@`L*\ED(``S`%"C@0`0BPC`$`0)8B@`````CP``$(D"?A`
+M```````=`$`0`0`"/(CQ0B0E($`")2@@`@GX0``0`*8G(@!`$"6```````(\
+M3#I4)`$``CQH\%,D(1`4`B4@0`(``$60"?A@`B4P```E&$``$`"BARH00P`"
+M`$!0%@`CIA8`(*8!`!`F`P`"+O/_0%0A$!0"#0``$`0``BX```(\``!")"4@
+M0`()^$``8)@%-````SP``&,D)2!``F"8!30)^&```@!&-`$``B0L`+^/*`"T
+MCR0`LX\@`+*/'`"QCQ@`L(\(`.`#,`"])P```CP``*.44#I"E"L00P`+`$`4
+M)2```````CQ0.D,D``"EE`$`A"2`$`0`(1!#````0I0K$$4`^_]`4`$`A"0`
+M``(\4#I")(`8!``A$$,``@!#E``<`P`#%`,`554$/%95A#08`$0`$!```,,?
+M`P`C$$,``!0"``@`X`,#%`(`P/^])SP`OZ\X`+ZO-`"WKS``MJ\L`+6O*`"T
+MKR0`LZ\@`+*O'`"QKQ@`L*]``*2O):"```(`I)2``((P`0!"+`(``R0C&&(`
+MX`&$,,```B12`((0$`"CK\$`@B@&`$`00`$")*```B1&`((0)1```*\``!`\
+M`+^/K`""%"40`````**47_!").L$0BP$`$!0``"BE%03E985```05A.6EG3K
+M0B3P`$(L!`!`4```HI18$Y66#@``$%H3EI:$ZD(DX0!"+`0`0%```**47!.5
+ME@<``!!>$Y:6719"+"6P```#`$`4):@``&`3E99B$Y:6V!*0EMX2GI8!`-<O
+M```&/*!%QB00`**/@"@"`#P`I"0A((8```"#C/_O`CS__T(T)!AB`,P3@I8`
+M%P(`)1AB````@ZQ(`*0D(2"&````@XS_^P(\__]"-"088@#.$X*6@!8"`"48
+M8@```(.L_`"E)"$HI@```*.,]_\")"088@#*$X*6P!`"`"488@`,```0``"C
+MK&03E99F$Y:6VA*0EN`2GI8&```0`0#7+V@3E99J$Y:6W!*0EN(2GI8!`-<O
+M```2/```4B8E(``""?A``@0`!20``!,\H$5S)A``HX^`B`,`A``E)B$HLP``
+M`*2,/_\#)"0@@P#`$0(`@!D7`"400P#``$(P)2""````I*PE(``""?A``@0`
+M!220`#`F(8`3`@```X[X_P0D)!AD`$(0`@`'`$(P)1AB`````ZXE(*`""?A`
+M`@,`!20```..?_\$)"089`#`$0(`@`!","488@````.N)2"@`@GX0`(#``4D
+MG``P)B&`$P(```.._/\$)"089`!"$`(``P!","488@````.N)2#``@GX0`(#
+M``4D```#CN/_!"0D&&0`@!`"`!P`0C`E&&(````#KLP`,28AB#,"```CCO?_
+M`B0D&&(`P!`>``@`0C`E&&(````CKB6````EB&`"```"/```4B1`$!``(1!0
+M`(`8`@`A&'$`$`"DCR$01`"`$`(`(1!1`$``I(\``&6,"?A``@``1HP!`!`F
+M&0`"+O+_0!1`$!``P"Z`K@$``B0\`+^/.`"^CS0`MX\P`+:/+`"UCR@`M(\D
+M`+./(`"RCQP`L8\8`+"/"`#@`T``O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKR60
+M@``"`,*4X`%#,,```B0/`&(0)3A``L$`8B@&`$`00`$")*```B0'`&(0)1``
+M`$$``!`<`+^//@!B%"40```$```0)1@```(``!`!``,D`@`#)$`8`P`$`.0D
+M(1!D`.821I3L$D*4@!$"`"4PP@`A$&0`\A)"E``3`@`E,,(`(1!D`/@20I2`
+M%`(`)3#"`"$09`#^$D*4`!8"`"4PP@`A$&0`!!-1E`H30I2`$0(`)8@B`B$0
+M9``0$T*4`!,"`"6((@(A$&0`%A-"E(`4`@`EB"("(1AD`!P38I0`%@(`)8@B
+M`@$``B0'`*)0)8C```8`H%"L+N6L`@`")`T`HA0E$```)3`@`JPNY:P``!`\
+M```0)B4@0`()^``"8)D%-"4@0`)DF04T"?@``B4P(`(!``(D'`"_CQ@`LH\4
+M`+&/$`"PCP@`X`,@`+TGR/^])S0`OZ\P`+ZO+`"WKR@`MJ\D`+6O(`"TKQP`
+MLZ\8`+*O%`"QKQ``L*\EL(``/`"EKP(`HI3@`4,PP``")"``8A`EN,`"P0!B
+M*`8`0!!``0(DH``")!@`8A`E$```TP``$#0`OX_0`&(4)1```"7P``````(\
+M``!")"4@P`()^$``1)D%-,?_`R0D$$,`T!/FEL`P!@`X`,8P```#/```8R0E
+M(,`"1)D%-`GX8``E,$8`!0``$,P!PHX"```0`0`>)`(`'B3,`<*.!`!"+`T`
+M0!````(\``!")"4@P`()^$``$)D%-````SP``&,D)2#``A"9!30)^&```P!&
+M-"$``!```!,\``!")"4@P`()^$``$)D%-`;\`R0D$$,`0(@>``0`\B8A&#("
+MX!)CE``9`P`E$$,````0/```$"8E(,`"$)D%-`GX``(!`$8T```"/```0B0E
+M(,`"K"[EC@GX0``\`*:/(8@R`L@2)I;_`<8P)2#``FB9!30)^``"``+&-```
+M$SP``',F)2#``@GX8`)$F`4T?\`#)"000P!`D!X``@#T)B$85`*@$F:4P#$&
+M`(`_QC```!$\```Q)B4@P`)$F`4T"?@@`B4P1@`E(,`""?A@`DB8!33\_P,\
+M_P]C-"000P"H$E4F(1CU`@``9I0`,P8``P`#/`#P8S0D,,,`)2#``DB8!30)
+M^"`")3!&`"4@P`()^&`"4)@%-/__`SPD$$,`(1C7`\D28Y``&@,`)1!#``8`
+M\"8A&-`#P!)FD"4@P`)0F`4T"?@@`B4P1@`AH%0"N!*"E@`V`@``%`(`)3#"
+M`"$05P+`$D.4`!(#`"4PP@`E(,`"-)@%-`GX(`(E,,,`)2#``@GX8`(HF`4T
+M__\#//\`8S0D$$,`(8`5`@``!I8`,@8`)2#``BB8!30)^"`")3!&`"4@P`()
+M^&`"9)@%-/C_`SS_#V,T)!!#`"&05P*T$D:6`#,&``<``SP`\&,T)###`"4@
+MP`)DF`4T"?@@`B4P1@!P$N*6`S!"+`P`0!`"`!`DR@'#EB(0`B06`&(4```"
+M/#P`HX\"`&*40`!",!``0%0(`!`D#P``$````CP\`*./``!BE!\`0C`K&`(`
+M]O]")`T`0BP!`$(X)!AB``0`8!!`$!X`(1!7`"830I0A@`("```"/```0B0E
+M(,`""?A``"29!30!_P,D)!!#`$`P$`#W`,8P```#/```8R0E(,`"))D%-`GX
+M8``E,$8``0`")#0`OX\P`+Z/+`"WCR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"Q
+MCQ``L(\(`.`#.`"])^C_O2<0`+^O)3"@`$``PBP"`$`4)1C``#\``R3\`8.D
+M```"/```0B0)^$``/)D%-`$``B00`+^/"`#@`Q@`O2?`_[TG/`"_KS@`M*\T
+M`+.O,`"RKRP`L:\H`+"O):"``"68H``"`&*6X`%#,,```B04`&(0)8"``L$`
+M8B@&`$`00`$")*```B07`&(0)1```$L``!`\`+^/2`!B%"40``#F$P*6'`"B
+MI](3`B88`**OZ!,")B``HJ]*%Q*6$@``$$P7$2;P%0*6'`"BI_(5`B88`**O
+M$A8")B``HJ^<%Q*6"0``$)X7$2;P%0*6'`"BI_@5`B88`**OKA8")B``HJ^\
+M%Q*6OA<1)@$``CR,_D(D)2"``A@`I2<)^$````!FE@```CP``$(D)2"``@GX
+M0``E*&`")2!``"48``!T$P*6%@!`$"4H``!V$P*6!0!`4`$`8R0#`$14`0!C
+M)`\``!#4%P4F=!,"EBH08@`,`$!0$`"SKT`0`P`A$%``=A-"E/C_0%`!`&,D
+M]O]$5`$`8R2`$0,`(1`"`M071200`+.O`0`"/$@#0B0E((`")3`@`@GX0`#_
+M_T<R`0`")#P`OX\X`+2/-`"SCS``LH\L`+&/*`"PCP@`X`-``+TGP/^])SP`
+MOZ\X`+ZO-`"WKS``MJ\L`+6O*`"TKR0`LZ\@`+*O'`"QKQ@`L*]``*2O1`"E
+MK___UC`EN```/P`>)```$#P``!`F```$/)``A"0)^``""`$%)```!#P0`(0D
+M"?@``H``!20```(\F`!5)(``LR8!`!(D)8@``$`0$0`A$%4```!2I`$`0B;_
+M_U(P`0`B)O__43!``$(N^/]`%$`0$0````(\D`!")`8`4:0!``,D`@!#I#\`
+M`R0$`$.D!@!"E!,`0!`EB````0`"/#P)5"0```(\D`!2)$"`$0`A$!4")2#`
+M`@``190)^(`"1`"FCR&`$P(```*F`0`B)O__43`&`$*6*Q`B`O3_0!1`@!$`
+M``!FA@```CR6`$.40!`#`"$08@+^_T>$'0!@$"6(``````(\D`!()$`0$0`A
+M$%,```!#A"H0PP`#`$`4!@`"E24P8``EN"`"(Q!1`/__0B3__U(P#@!`$D`0
+M$@`A(&("_O^#A```@H0J$$,``@!`$```A93^_X6D`0`B)O__43`&``*5*Q`B
+M`NC_0!1`$!$````"/)8`0I0/`$`0)8@``````CR6`$240!`1`"$04P```$.$
+M*A#C``,`0!`!`"(F)3A@`"7P(`+__U$P*Q`D`O;_0!1`$!$`&0#").M1!#P?
+MA80T&`!$`!`8```#&0,`PQ<"`",88@!`$`,`(1!#`,`0`@`A$$,`0!0"``.$
+M`@`EB```&``$`A`@```#(00`PQ<"`",@@@`!`(0D$@"`&"60``````(\$`!%
+M)!`0```#$0(`PQ\0`",00P`!`$0D)1@@`@$`(B;__U$P0!@#`"$890`!`$(F
+M__]2,"H01`+W_T`4``!WI````CR6`$*40!`"`"$08@+^_T*$*A`"`E``0!`E
+MD``````"/)``5"0!``(\>`M7)````CP0`%8D,@`")@`4`@`#A`(`!@""ED`0
+M`@`A$&("_O]"A"H0`@(?`$`00!@2`$`0$@`A$%,```!#A",8`P("`$*$(Q`"
+M`A@`8@`2&```%0!@&$`8$@````(\E@!"E$`0`@`A$&("_O]"A"H@`@(!`$(F
+M"P"`$/__4C!`$!(`(1!3````0X0C&`,"`@!"A",0`@(8`&(`$A@``/7_8!P!
+M`$(F0!@2`"$0<P```$64`@!&E"$8=0```&>40#@'``(`8I1`$`(`__]",!``
+MHJ\4`*"O__\$,@GXX`+__^<P`0!")/__0C!`&!$`(1AV`$(0`@```&*D__]"
+M,"L0P@,!`$!4``!^I`$`(B;__U$P!@""ED`0`@`A$&("_O]"A"H0`@*Y_T`4
+M,@`")D``(BX.`$!0@*$0-````CP0`$0D0!`1`"$81``E$&``_O]"E```8J0!
+M`"(F__]1,$``(B[X_T`40!`1`("A$#0ED``````"/!``420```(\``!3)(`8
+M$@`A$'$``@!"E``2`@#_`$(T`!0"`"$8<0```&:4`#(&`/\`QC3__\8P0`"D
+MCR4H``()^&`")3!&``$`0B;__U(P(`!"+NW_0!0$`!`F/`"_CS@`OH\T`+>/
+M,`"VCRP`M8\H`+2/)`"SCR``LH\<`+&/&`"PCP@`X`-``+TGF/^])V0`OZ]@
+M`+ZO7`"WKU@`MJ]4`+6O4`"TKTP`LZ](`+*O1`"QKT``L*]H`*2O);"@`"68
+MP`#___XP+`"DKR60```EN```):```#\``B0P`**O.`"@KW@`HX\%`&*`0!`"
+M`/__0C`T`**O`@!BE``!0C`#`$`0):@```,``!".$H:`+`"DCX\2AH````(\
+M``!")&@`I(\)^$``>`"ECP`6`@`#%@(`00#`$CP`HJ\``,*6$@!`$"6````8
+M`*0G0!@0`"$8@P#`$!``(1!6````0I0``&*D`0`")O__4#`(``(N!P!`$"6(
+M``+`$!``(1!6````0I3R_T`40!@0`"6(``)X`*6/``"DE"H`HB<0`**O`0`"
+M/+0,0B08`*4G)3```@GX0``H`*<G$``@$B6````H`*.7&`"BEPX`8A`J`**7
+M&`"D)P$``B;__U`P*Q`1`@<`0%`H`*.70!`0`"$0@@```$*4^/]B%`$``B8H
+M`*.7*@"BEP4`8A3`$!``>`"FCP``PI0%`&(0P!`0`"$05@`$`$*,!0!`$```
+M``#`$!``(1!6``(`0I0P`**O#P#`$R6````8`*0G0!@0`"$8@P"`$!``(1!0
+M`$`0`@`A$%,`"`!"E```8J0!``(F__]0,"L0'@+U_T`40!@0`'@`HH\``$24
+M*@"B)Q``HJ\!``(\M`Q")!@`I2<E,,`#"?A``"@`IR<E@```&`"C)R@`I9<"
+M```0*@"DE___4#`K$!X"#0!`4"6```!`$!``(1!B````0I0!`*)0)9```D`0
+M$``A$&(```!"E//_@A0!``(F):```B6```!X`*./`@!BE$``0C`,`$`0!0`"
+M+A4`0!2`$!(`!0`")!P``A(&``(D)0`"$@<``B0Y``(6>`"ECRT``!"`$!(`
+M"``"+C0`0!!X`*6/```"/(@Z0B2`&!``(1AB````8HP(`$```````(`0$@`A
+M$%(`0!`"`"$04P`&`%>4@!`4`"$05`!`$`(`(1!3`"$``!`&`%64@!`2`"$0
+M4@!`$`(`(1!3``0`5Y2`$!0`(1!4`$`0`@`A$%,`%@``$`0`592`$!(`(1!2
+M`$`0`@`A$%,``@!7E(`0%``A$%0`0!`"`"$04P`+```0`@!5E(`0$@`A$%(`
+M0!`"`"$04P```%>4@!`4`"$05`!`$`(`(1!3````591X`*6/``"DE"@`I9<J
+M`*:7$`"UKQ0`H*\!``(\>`M")`GX0``E..`")2!``#``IH\K$(8``@!`$"48
+MP``E&(``__]D,'@`HX\"`&*4$`!",`L`0!`L`*6/<!*BE`$P0BP(`$`40!`0
+M`'X2HY3__V(P*Q""``$`0%0E&(``__]D,$`0$`````8\``#&)"$H1@`T`**/
+M/`"FCR,81@`J$(,``0!`5"48@``3```6``"CI````SQX.F,D:`"DCP`"@HQ`
+M$`(`(1!#````0Y1`&`,````%/```I20``**4(Q!#```4`@`#%`(``P!`'#@`
+MHJ\!``8D.`"FKT`0$`````,\``!C)"$H0P```*24.`"CCRH0@P`!`$!4)1B`
+M``$``B;__U`P"``"+G#_0!0``*.D```$/```A"0``(*4+`"EC\0NHJP!``8D
+M``#1,("'$0`&`(:4/P#&,``V!@`E,`8"@*41`"4PU``$`(*4/P!",``4`@`E
+M,,(`@)L1`"4PTP`"`(*4/P!",``2`@`E,,(`@(D1`"4PT0```(*4/P!",```
+M$CP``%(F:`"DCS29!30)^$`")3#"`````SP``&,D#@!BE#\`0C``%@(`)8`"
+M`B6`%`(,`&*4/P!",``4`@`E@`(")8`3`@H`8I0_`$(P`!("`"6``@(E@!$"
+M"`!FE#\`QC!H`*2/.)D%-`GX0`(E,`8"```"/```0B1H`*2/```&/```QB0)
+M^$````#%E````SP``&,D``!BE&@`I(_^`8*D9`"_CV``OH]<`+>/6`"VCU0`
+MM8]0`+2/3`"SCT@`LH]$`+&/0`"PCP@`X`-H`+TGJ/^])U``OZ],`+>O2`"V
+MKT0`M:]``+2O/`"SKS@`LJ\T`+&O,`"PKR6HP`#__Y<P__^V,`$``CSH"D(D
+M)2#@`B4HP`()^$``&`"G)TP`0!08`**7!`"FEAP`HB<0`**O`0`"/+0,0B0E
+M(.`"``"EC@GX0``:`*<G&@"EER``HB<0`**O`0`0/.0-$"8E(,`")3"@`@GX
+M``(>`*<G'`"EER0`HB<0`**O)2#``B4PH`()^``"(@"G)R8`LR<!`!`\Z`H0
+M)AH`I)<>`*67)3"@`@GX``(E.&`"*`"R)QH`I)<@`*67)3"@`@GX``(E.$`"
+M'@"EER``II<F`*>7*`"BEQ``HJ\4`*"O`0`1/'@+,28)^"`")2#``B6@0``<
+M`*27(@"EER4PH`()^``")3A@`AP`I)<D`*67)3"@`@GX``(E.$`"(@"EER0`
+MII<F`*>7*`"BEQ``HJ\4`*"O"?@@`B4@P`(:`*67'`"FEQ``HJ\4`*"O)2#@
+M`@GX(`(E.(`"4`"_CTP`MX](`+:/1`"UCT``M(\\`+./.`"RCS0`L8\P`+"/
+M"`#@`U@`O2?__X0P__^E,`@`R(P$`,*4'0!`$"50``````*5%0!$%`$`0B4(
+M``DE!@`"E1``0!`E&```!@`+)0``(I4'`$54`0!B)$`0`P`A$$L`&`!"E```
+MXJ0(`.`#`0`")/__0S`&``*5*Q!B`//_0!0"`"DE`0!")?__2C`$`,*4*Q!"
+M`>7_0!0T``@E"`#@`R40```4`*J/__^$,/__I3#__\8P___G,!``J)=D``DD
+M&`#H`!(8``!#`&`0)1````$`0%4!``DD-@#%$",0A0!`&`(`(1AB`,`8`P`A
+M&&(`@!@#`",0Q0`:`&(`$A@```$`0%`-``<``!P#``,D`P`-`(,$90""*`@`
+M0!$E$.``0!`'`"$01P#`$`(`(1!'`(`0`@`"```0__]",/__0C`D```0)1A`
+M``T`0!08`(@`"`!`$240``%`$`@`(1!(`,`0`@`A$$@`@!`"``(``!#__T(P
+M__]",!8``!`E&$``$A@``&0``B0C$$0`&`!'`!(0```A&&(``````!H`:0`2
+M&````0`@40T`!P`)```0__]C,`<`0!$E&.``0!`#`"$00P#`$`(`(1!#`(`0
+M`@#__T,P)1!@``@`X`,`````___&,$`0!@`A$*(`_O](E/__A#!`$`0`(1!$
+M`,`0`@`A$$0`@"`"````HY1`$`,`(1!#`,`0`@`A$$,`@!`"`/;_0B0K$((`
+M!@!`$!``JH\``**4``#BI```HI0(`.`#``!"I4`0"``A$$@`P!`"`"$02`"`
+M$`(`"@!")"L01``,`$`0````````Z*0(`.`#``!(I0``XJ0``"*5"`#@`P``
+M0J4``.*D`@`BE0@`X`,``$*E'`#`$"5```!`$`@`(4A%````(Y5`$`,`(1!#
+M`,`0`@`A$$,`@!`"`",01``)`$(D$P!"+.K_0%0``"*5`@`CE4`0`P`A$$,`
+MP!`"`"$00P"`$`(`]O]")"L0@@#D_T!4```BE0$`""4J$`8!Y_]`%$`0"``(
+M`.`#`````.#_O2<8`+^O__^$,/__J#`(`,6,!`#"E`P`0!`E&`````"BE`H`
+M2%`&`*:4!`#&E`$`8R0J$&8`!`!`$#0`I20``**4^_](%`$`8R0&`*:4,`"B
+MCQ``HJ\!``(\M`Q")`GX0``(`*4D&`"_CP@`X`,@`+TG```%/*@ZI20$`*.,
+M$"R#K,`0`P`C$$,`@!`"``@`I20A$$4`*"R"K`$``B0D+(*L%``")!PL@JPC
+M``(D"`#@`R`L@JPT$H*,`@!"E"``0C`(`$`0)4```!P``R1```<D<@`&)`P`
+MH*QW``(D"```$!``HJPR``,D)3@``#(`!B04``(D#`"BK",``B00`**L!`"E
+MC"L0J``K&&4`)1!#``8`0!`E(```*Q"G`"L8Q0`E$$,``0!`5`$`!"0(`.`#
+M)1"``.C_O2<4`+^O$`"PKR6`@`#$+@:.0#(&``!^QC````(\``!")#"9!30)
+M^$```(#&-`$``B3`+@*N%`"_CQ``L(\(`.`#&`"])^#_O2<<`+^O&`"RKQ0`
+ML:\0`+"O)8"``"6(``(0+!(F)"P#CBT`8!`E$```P"X#C@$``B0I`&)4P"X"
+MC@```CP``$(D)2`@`@GX0``PF04T)1A```"`8C`@`$!4P"X"CD(6`P`$`$*N
+MP"X`K@$``CR<#D(D)2`@`@GX0``E*$`"%@!`5,`N`HX!``(\6!!")"4@(`()
+M^$``)2A``@X`0!`!``(\B!!")"4@(`()^$``)2A``@D`0%C`+@*.`0`"/$02
+M0B0E("`""?A``"4H0`("``(DP"X"KL`N`HX<`+^/&`"RCQ0`L8\0`+"/"`#@
+M`R``O2<$`*.,#`"BC"L00P`%`$`0)2```!``HHPK$&(``@!`%``````!``0D
+M"`#@`R40@``E.*``%`#CC&H`8!#__P(D``#DC,`0!``C$$0`@!`"`````SRP
+M.F,D(1!#`!@`XJP$`.*,$`#CC"L00P`G`$!4!`#CC%L`@!#__P(D!`#BC`@`
+MXJP0`..,*Q!#`!T`0!0E0&````#BC!H`0!`````````"/*@Z2B0```(\L#I)
+M)```XHS__T8D``#FK,`@!@`C((8`@"`$`"$0B@`8`.6,$`!#C`@`HHPC&&(`
+M0!@#``@`XHPC$$,`"`#BK"$@B0`K$$@``P!`%!@`Y*SM_\!4``#BC`@`X`,!
+M``(D#`#BC"L00P`S`$!4)1```````CRH.D.,__]C)```Y(PM`(,0_O\")`0`
+MXXP(`..L#`#BC"5(0``K$$,`)`!`%`````````(\J#I#C/__8R0``.*,)2!`
+M`"L00P`<`$`0```#/"408`"H.DLD```"/+`Z2B2H.F*,__]()`$`AB0``.:L
+MP"`&`",@A@"`(`0`(1"+`!@`Y8P0`$.,"`"BC",88@!`&`,`"`#BC",00P`(
+M`.*L(2"*`"L0(@$$`$`4&`#DK"L0R`#L_T`4)2#```@`X`,"``(D"`#@`P``
+M```4`**,#0!`$``````8`**,``!"E-`3@J08`**,`@!"E,X3@J08`**,!`!"
+ME,P3@J08`**,!@!"E,H3@J0(`.`#`````.#_O2<<`+^O&`"RKQ0`L:\0`+"O
+M)9"``"6(H``E@$`"```"/```0B0)^$``!(`%-/__0S`!``(D'``B$@(`(BH%
+M`$!0!@`")`T`(!(<`+^/(0``$!@`LH\%`"(2"``")!(`(A(<`+^/&P``$!@`
+MLH_(+@:.)3!F``0``!"!``,\R"X&CB4P9@!"``,\```"/```0B0E($`"!(`%
+M-`GX0``E,,,`"P``$!P`OX_(+@:.)3!F`"```SP```(\``!")"4@0`($@`4T
+M"?A``"4PPP`<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?H_[TG$`"_KP$``CR(
+M$D(D"?A``-P!A8P0`+^/"`#@`Q@`O2<```````````````#@_[TG'`"_KQ@`
+MLJ\4`+&O$`"PKR60@`````(\``!")`GX0``E@*``)8A``/]_!3S__Z4T```"
+M/```0B0E($`""?A``"0H)0(```(\``!")"4@0`()^$``,``%)"4@0`#P`X8P
+M!@``$@(Q!@`E``(D(Q!&`$(0`@`+```0(3#"``(`PBP(`$`0___&)````CP`
+M`$(D)2!``@GX0``E*"`"$0``$"40```/_`,D)!B#```Q!@#P`\8P```"/```
+M0B0E($`",``%)`GX0``E,&8````"/```0B0E($`""?A``"4H(`(!``(D'`"_
+MCQ@`LH\4`+&/$`"PCP@`X`,@`+TGZ/^])Q``OZ\E.*``)4"```H`XR@)`&`0
+M)1`````I!P`C**<`@"@%`"$H!0$```(\``!")`GX0`!0+*4D$`"_CP@`X`,8
+M`+TGZ/^])Q``OZ\E0,``)3B```H`HR@*`&`0)1`````Q!0`C,,4`@#`&`"$P
+MY@````(\``!")"4H``$)^$``4"S&)!``OX\(`.`#&`"])]C_O2<D`+^O(`"T
+MKQP`LZ\8`+*O%`"QKQ``L*\EF(``)8B@``(``B0-`"(2):#```,`(BX&`$`0
+M`P`")`$``B0)`"(2__\")#$``!`D`+^/#``B$@@`$B0(```0__\")`@``!`)
+M`!(D5"R"C`4`0!`ED```)0``$"40```D```0)`"_CP`1$@`C$%(`@!`"`"&`
+M@@!0+!`F!``#CAL`8!3__P(D```"/```0B0E(``""?A``#P`!20-`(`6!``1
+MK@L``B0,``*N`@`")!0``J[__P(D&``"KO\#`B0<``*N"@`")"```J8'```0
+M(@`"I@```CP``$(D)2!@`B4H0`()^$``)3"``B400`(D`+^/(`"TCQP`LX\8
+M`+*/%`"QCQ``L(\(`.`#*`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O)8"``#PL
+M`H[_`T(P1"P&C@`T!@#_`Q(\)##2````$3P``#$FI``%)`GX(`(E,$8`0"P"
+MCO\#0C!(+`:.`#0&`"0PT@`E(``"J``%)`GX(`(E,$8````"/```0B0E(``"
+M"?A``*P`!20`_`,D)!!#`$PL!H[_`\8P)2```JP`!20)^"`")3!&`!P`OX\8
+M`+*/%`"QCQ``L(\(`.`#(`"])^C_O2<0`+^O)3B@`"4P@``*`.,L(`!@$"40
+M````$0<`(Q!'`(`0`@`A*,(`4"RE)`0`HXP8`&`0)1````0`H*P!``,D!!CC
+M`"<8`P`\+,*,)!!B`#PLPJQ`+,*,)!!B`$`LPJQ$+,*,)!!B`$0LPJQ(+,*,
+M)!!B`$@LPJQ,+,*,)!AB``$``CQ@%D(D"?A``$PLPZP!``(D$`"_CP@`X`,8
+M`+TGT/^])RP`OZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O):B``"6P
+MH``EH*`"-!*DC@H`PRY7`6`0)1`````1%@`C$%8`@!`"`"&8@@)0+',F!`!C
+MCD\!8!`!``(D&`!CCO__`B03`&)4&`!GC@4`@!"@``,D`@""E*``0C`"`$,0
+M'P`$)`\`!"0!``<D*Q#D``D`0!"`@!8`0!`'``$`1S0K$.0`_?]`%$`0!P`"
+M```0@(`6`("`%@#_`^<P'`!BCH`2`@`/``,\`/QC-"000P`E..(`%`!FC@`U
+M!@#P#P(\)##"`````CP``%$D)2"@`D`0!28)^"`")3#F`"(`9I8`,08`\`#&
+M,"``8I8/`$(P)3#"``@``CP`($(T)2"@`H`0!28)^"`")3#"`"4@H`+`"04F
+M"?@@`@`(!B3,`:*.!`!"+`8`0%`D`&..)2"@`@`1!28)^"`"``$&/"0`8XX:
+M`&`0@(`6`/\``CS__T(T)!!B`"@`9HX`-@8````1/```,28E(*`"P`@%)@GX
+M(`(E,$8`P`D0)@```CP``$(D)2"@`@GX0``E*``"`0!"-"@`9HXK,`8``#(&
+M`"4@H`(E*``""?@@`B4PP@`P`&*."P!`$(`H%@#_``8\___&-"0P1@```0,\
+M```"/```0B0E(*`"``FE)`GX0``E,,,`+`!BCA@`0!"`@!8`#P`&//__QC0D
+M,$8`$``#/````CP``%$D)2"@`L`0!28)^"`")3##``P`8HX@`$(P"@!`$,`)
+M$"8```(\``!")"4@H`()^$``)2@``B4@H`(E*``""?@@`@`"1C0,`&*.`0`#
+M/"000P`.`$`0@(`6```1$"8```(\``!")"4@H`()^$``)2@``B``!CP```,\
+M``!C)"4@H`(E*``""?A@`"4P1@`,`&*.@``#/"000P`-`$`0@(`6```1$"8`
+M``(\``!")"4@H`()^$``)2@``@```SP``&,D)2"@`B4H``()^&````)&-`0`
+M8XX"``(D!0!B$`,``B0>`&(0@)`6`$4``!`X`&*.@(`6`,`)$"8```(\``!"
+M)"4@H`()^$``)2@``@```SP``&,D)2"@`B4H``()^&``H@!&-,P!HHX$`$(L
+M`@!`$"4``SPE`0,\@"@6`````CP``$(D)2"@`@`1I20)^$``)3!@`"H``!`X
+M`&*.P`E1)@```CP``$(D)2"@`@GX0``E*"`"```0/```$"8E(*`")2@@`@GX
+M``)B`D8T```"/````SP``$*,``!CC",00P#,+H..(QAB`````CP``$*,(QAB
+M`(`:`P```08\)2"@`@`)128)^``")3!F`,P!HHX$`$(L`@!`$`0``SP$`0,\
+M@"@6`````CP``$(D)2"@`L`)I20)^$``)3!@`#@`8HX!`$(P#@!`$("`%@``
+M$1`F```"/```0B0E(*`""?A``"4H``(D``8\```#/```8R0E(*`")2@``@GX
+M8``E,$8`#`!BC@$`0C`&`$`0`0`")`00P@(\+(..)1!#``8``!`\+(*N!!#"
+M`B<0`@`\+(..)!!#`#PL@JX,`&*.`0!",`8`0!`!``(D!!#"`D`L@XXE$$,`
+M!@``$$`L@JX$$,(")Q`"`$`L@XXD$$,`0"R"K@P`8HX"`$(P!@!`$`$``B0$
+M$,("1"R#CB400P`&```01"R"K@00P@(G$`(`1"R#CB000P!$+(*N#`!BC@0`
+M0C`&`$`0`0`")`00P@)(+(..)1!#``8``!!(+(*N!!#"`B<0`@!(+(..)!!#
+M`$@L@JX,`&*."`!",`8`0!`!``(D!!#"`DPL@XXE$$,`!@``$$PL@JX$$,("
+M)Q`"`$PL@XXD$$,`3"R"K@$``CQ@%D(D)2"@`@GX0``E*&`"`0`")"P`OX\H
+M`+:/)`"UCR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`S``O2?H_[TG$`"_KX`H
+M!0````(\``!")`GX0```"*4D$`"_CP@`X`,8`+TGZ/^])Q``OZ^`*`4````"
+M/```0B0)^$````BE)`$``B00`+^/"`#@`Q@`O2?H_[TG$`"_KP$`!B0$,*8`
+M```"/```0B0)^$``0`@%)`$``B00`+^/"`#@`Q@`O2?8_[TG(`"_KQP`LZ\8
+M`+*O%`"QKQ``L*\EF(``)9"@`(`H$@````(\``!1)`GX(`(`"J4D`P!0,`H`
+M`%8E$``")2!@`@GX(`)`"`4D`0`#)`080P(D$$,``0!`5`$`$"0E$``"(`"_
+MCQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])]C_O2<D`+^O(`"TKQP`LZ\8`+*O
+M%`"QKQ``L*\ED(``)8B@``$`!B0```(\``!")(`(!20)^$``!#`F`B6`````
+M``(\``!4)````CP$```0``!3)`GX8`(*``0D`0`0)A`G`BH&`$`0```"/"4@
+M0`()^(`")2@@`O;_0!0```(\``!")"4@0`*`"`4D"?A``"4P```0)P(J)`"_
+MCR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2<8`**/(`"GCR0`HX\H`*2/
+M_P_&,(`4`@`E,,(`0!X#``$`@C`#`$`0)3##```!`CPE,,(``A$$``$`0C!`
+M%P(`)1!&`((8!``!`&,P@!T#`"488@!"$00``0!",,`5`@`E$$,`"P"BJ`@`
+MHK@0`*./@!X#`$(0!``!`$(PP!4"`"400P`/`**H#`"BN/__`B0/`.(0#P`#
+M/`\`I(@,`*280!,'``#@8S0D$$,`)2""``\`I*@,`*2X"P"BB`@`HI@`0`,\
+M)1!#``L`HJ@(`**X"`#@`P$``B0(`.`#)1````L`HH@(`**8`"`#/"400P`+
+M`**H"`"BN`@`X`,`````"P#@$!``HH\/`*.(#`"CF`$`0BP`$P(`)1AF`"40
+M0P`/`**H#`"BN!```!``````"@!`4``0PC04`**/"P!#B`@`0Y@+`*.H"`"C
+MN`\`IJ@,`*:X!0``$"408``+`*"H"`"@N`\`HJ@,`**X%P"@J!0`H+@7`**(
+M%`"BF!,`HJ@0`**X"`#@`P$``B07`*.(%`"CF`$`8S!+`&`0#P`")!<`HH@4
+M`**8_A]",$(0`@```,*D$P"BB!``HI@"%`(``@#"I`0`P*`3`**($`"BF`$`
+M0C`7`$`4`````!,`HH@0`**8`@!",`(`0!`!``(D!`#"H!,`HH@0`**8"`!"
+M,`0`0!``````!`#"D`(`0C0$`,*@$P"BB!``HI@$`$(P!`!`$``````$`,*0
+M!`!"-`0`PJ`+`**("`"BF((4`@`/`$(P!0#"H!<`HH@4`**80A,"``8`PJ`3
+M`**($`"BF``/0C`"&@(`!P##H!,`HH@0`**8\`!",`(1`@`(`,*@$P"BB!``
+MHI@`\$(P`A,"``D`PJ`*`,"@_P!B,`,`0!`+`,"@`0!B)`<`PJ`(`,*0!0!`
+M4"40```(`,*0`0!")`@`PJ`E$```"`#@`P`````(`.`#``````````"\+H*0
+M"`!"-+PN@J`$`**0"`!"-`0`HJ"Z+H*4``"BI+PN@I`$`**@O2Z"D`4`HJ`(
+M`.`#)1``````````````X/^])Q@`OZ\4`+&O$`"PKR6(@````!`\```0)H!`
+M!21(D@8\"?@``@#\QC0E("`"@$`%))(D!CP)^``")$G&-"4@(`*`0`4D`"@&
+M/`GX``(Y`,8T)2`@`H!`!2064P8\"?@``B0(QC0E("`"@$`%))CE!CP)^``"
+M>07&-"4@(`*`0`4D'0`&/`GX``+_[\8T)2`@`H!`!22J&@8\"?@``D"^QC0E
+M("`"@$`%)!"^!CP)^``"5%7&-"4@(`*`0`4D#@`&/`GX``(',,8T)2`@`H1`
+M!20)^``")3```!@`OX\4`+&/$`"PCP@`X`,@`+TGX/^])QP`OZ\8`+*O%`"Q
+MKQ``L*\EB(`````"/```0B30F`4T"?A``!8<!B0E@``````"/```4B0E("`"
+M@)@%-`GX0`(!``8\`0`0)@@``BKZ_T`4)2`@`@```CP``$(D"?A```"<!30"
+M'@(``B$#``\`8S``&0,````"/```0B0E((,`"?A```@`!20<`+^/&`"RCQ0`
+ML8\0`+"/"`#@`R``O2>(_[TG<`"_KR5@@``E.(`!R?\")!``HJ\4`**O&`"B
+MKQP`HJ_"_P(D(`"BK_+_`B0H`**O+`"BKS``HJ\T`**O]/\")#@`HJ_`_P(D
+M0`"BKT0`HJ](`**O3`"BK[K_`B10`**OLO\")%@`HJ]<`**O8`"BKV0`HJ^P
+M_P(D:`"BKR4H```0`*LG!`#F)"@`JB=``*DG6`"H)X`8!0`A(&<`(1!C`0``
+M0HPH1H*L(2!F`"$00P$``$*,.$:"K"$@9P`A$",!``!"C%!&@JPA(&8`(1@#
+M`0``8HQ@1H*L`0"E)`4`HBCM_T!4@!@%`````CP``$(D)2"``0GX0``!``4D
+M<`"_CP@`X`-X`+TG0"@%`"$HI@!`*`4`(2BD``@`X`/^%:*4T/^])R@`OZ\D
+M`+6O(`"TKQP`LZ\8`+*O%`"QKQ``L*\E@(``)9#``"68X`!``+2/__^U,```
+M$3P``#$F```%/-`[I20)^"`"<!(&)`P`$JX0`!.N%``4KL@!%:;*`0"F/P`"
+M)/P!`J8``@"NO"\`KL`O`*X`"`(\S"\"KH$'`B34+P*NW"\`KC\``CP_/T(T
+MX"\"KF0``B3D+P*N`@`").@O`J[__P(D^"\"KOPO`JX`,`*N/"P$)@``!3Q0
+M3J4D"?@@`@8`!B0$,`"B*`"_CR0`M8\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`
+MX`,P`+TG_P"$,/\`I3`E,``````"/%A.220```(\64Y()````CQ:3D<D0!`&
+M`"$81@`A$&D```!"D`P`1%0!`,8D(1!H````0I`K$*(`!P!`5`$`QB0A$&<`
+M``!#D"L890`&`&`0`0`")`$`QB0$`,(L[O]`5$`0!@`E$```"`#@`P````#`
+M_[TG/`"_KS@`MJ\T`+6O,`"TKRP`LZ\H`+*O)`"QKR``L*\ED*``)9C``"6(
+MX`!0`+:/__^0,````CP``$(D"?A``*A&!"0EH$``!`"`5A``L:\"``,D'`(`
+M$```PZX4`+:O```"/```0B0E((`")2@``B4P0`()^$``)3A@`B60@`(```(\
+M``!")"4@@`(E*```"?A```$`!B0$`$`4```"/`,``B3_`0`0'`"BKP``0B0E
+M($`""?A``"!`!23_`$,P`AD#`,P!0ZX/`$(PT`%"I@$``CSX)4(DS`%$D@GX
+M0`#0`462!`!`%````CP-``(D[`$`$!P`HJ\``$(D)2!``@GX0``E*```!`!`
+M%````CP#``(DXP$`$!P`HJ\``$(D)2!``@GX0``8F`4TT@%"ILP!0XX)``(D
+M!P!B$`H``B0*`&(4```"/-`!0I8$`$(L!@!`$````CP!``(\4")")`GX0``E
+M($`"```"/```0B0)^$``)2!``@0`0%3,`4*.#@`"),<!`!`<`**O!0!"+`T`
+M0!0```(\```"/```0B0E($`""?A``!!`!20```,\``!C)"4@0`(00`4D"?A@
+M```01C0```(\``!")"4@0`(`F`4T"?A```<`!B0```(\``!")`GX0``E($`"
+MU`%"IO``0S`P``(D.@!B$#$`8B@(`$`08``")!```B0U`&(0(``")#0`8E#,
+M`4..#0``$-0!0I8O`&(080!B*`8`0!"@``(D4``")"L`8E#,`4..!```$-0!
+M0I8G`&)0S`%#CM0!0I8D`$`4S`%#C@4``B0)`&)4S`%"CM`!0XY#``(\"0!"
+M-`0`8E3,`4*.1@`")!@``!#4`4*F!P!#.`$`8RP+`$(X`0!"+"488@`#`&`0
+M40`")`\``!#4`4*FS`%#C@H`!"0)`&00"0`")`@`8A!B``(D#`!D%`D``B30
+M`4*6!`!"+`4`0!`*``(D8@`")-0!0J;,`4.."@`")!<`8A`)``(DS`%#CA0`
+M8A`*``(D!@!B5-0!0Y;0`4*6!`!"+`\`0!0```(\U`%#EO``8C#0_T(D0`!"
+M+`D`0!````(\#P!B,`4`0BP%`$`0```"/`T``B17`0`0'`"BKP```CP``$(D
+M)2!``L$`!20)^$``&`"F)P0`0!08`**7"``")$P!`!`<`**O`C!"+`0`0!`8
+M`**7!0`")$8!`!`<`**O<!*"I@```CP``$(D)2!``@GX0``00`4D&`!#,,(8
+M`P`"``(D$@!B$`,``B0$`&)4S`%#C@H``B0V`0`0'`"BKPD``B0*`&(0"@`"
+M)#$!8E0<`**OT`%"E@0`0BP%`$`4```"/`H``B0J`0`0'`"BKP```CP``$(D
+M)2!``C\`!20)^$``&`"F)P0`0!08`**7"``")!\!`!`<`**O<A*"I@```CP`
+M`$(D)2!``AP`!20)^$``&`"F)P0`0!08`**7"``")!,!`!`<`**O$0!`$!@`
+MHI?P_U$P`(L1`````CP``$(D)2!``AL`!20)^$``&`"F)P0`0!08`**7"``"
+M)`0!`!`<`**O)8@B`@(``!!`_S$F0`,1)"6````.`"`2)9@``````CP``%4D
+M)2!``L``!28)^*`"&`"F)_,`0!`8`**7)IAB`@$`$"8K$!$"]_]`%"4@0`+_
+M_P(T`P!B$@<``B3K```0'`"BKPH``B3F$X*F`P`")/`5@J8E@```!@"#)@L`
+M!"1`$!``(1!0`(`0`@`A$%``@!`"`"$00P#H$T2D`0`0)@H``B[W_T`40!`0
+M`"6```````(\0$Y*)`(`B"8```(\2$Y))`P`AR8+``4D"`"&)D`0$``A(%0`
+M(1A*````8Y3X%8.D(2!(`"$820```&.4\!6#I"$04`"`$`(`(1!0`(`0`@`A
+M&$<`J!9EI"$01@`0%D6D`0`0)@,``B[M_T`40!`0`````CP``$(D)2!``@GX
+M0`!P$H4F!`!`5'`2@I8(``(DL0``$!P`HJ\#4$(L%0!`4(H2@I;,`4.."@`$
+M)`D`9!`)``(D"`!B$&@&`B0-`&14BA*"EM`!0I8$`$(L"0!`4(H2@I9H!@(D
+M`!:"IK`$`B0$%H*F`(`"-`@6@J;^%8*FBA*"EB$`0!`0``,DU`%"EO``0C`>
+M`$-4```"/```$3P``#$F)2!``@"8!30)^"`"!T`&)```$#P``!`F"?@``M`'
+M!"0```(\``!")`GX0``E($`"U@%"IB4@0`(`F`4T"?@@`@<`!B0)^``"T`<$
+M)-8!0I;P`$(P(``#)`,`0Q`-``(D>```$!P`HJ\```(\``!")"4@0`*_``4D
+M"?A``!@`IB<$`$`4&`"BEP@``B1M```0'`"BKW02@J8(`D*F```"/```0B0)
+M^$``)2!``@0`0%3,`4.."``")&(``!`<`**O"@`$)`D`9!`)``(D"`!B$```
+M`CP,`&14S`%"CM`!0I8$`$(L"`!`4,P!0HX```(\``!")"4@0`()^$``'`"E
+M)Q\``!``````!P!#.`$`8RP+`$(X`0!"+"488@`'`&`0```"/```0B0E($`"
+M"?A``!P`I2<2```0`````-0!0I;P`$(PT/]")$``0BP(`$`0```"/````CP`
+M`$(D)2!``@GX0``<`*4G!0``$````````$(D)2!``@GX0``<`*4G,`!`$```
+M``#$+(*.P`%"K@```CP``$(D"?A``"4@0`(EF```)8```!\`%20```(\``!1
+M)"4@0`(C*+`""?@@`A@`IB<=`$`0&`"BER&88@)`&!``(2!T``(2`@`P+(*@
+M)1B``!@`HI,Q+&*@`0`0)@,``B[P_T!4)2!``@$`8RX"``(\_?]"-"808@(!
+M`$(L)1AB``0`8!`!``(\"0`")`@``!`<`**OY"-")`GX0``E($`"#```$"40
+M0`((``(D'`"BKP0`@!(```(\``!")`GX0``E((`"`@#`$AP`HH\``,*N)1``
+M`#P`OX\X`+:/-`"UCS``M(\L`+./*`"RCR0`L8\@`+"/"`#@`T``O2?H_[TG
+M%`"_KQ``L*\```(\``!")`GX0``E@(``J"P"C@0`0%````(\"?A``"4@``(`
+M``(\``!")`GX0``E(``"```"/```0B0E(``"`0`%)`GX0``!``8D```"/```
+M0B0E(``""?A``'`2!28```(\``!")`GX0``E(``"%`"_CQ``L(\(`.`#&`"]
+M)Z#_O2=<`+^O6`"^KU0`MZ]0`+:O3`"UKT@`M*]$`+.O0`"RKSP`L:\X`+"O
+M):"```"``C00`**O()@"-!0`HJ]550(\555"-"``HJ^JJ@(\JJI"-"0`HJ]F
+M9@(\9F9"-"@`HJ^9F0(\F9E"-"P`HJ\EN```$`"B)S``HJ\8`+XG@(`7`#``
+MHX\A$'````!2C"4@@`(```,\``!C)`GX8``E*$`"(8#0`P```JXEB````!01
+M`"6`40`E((`")2A``@```CP``$(D"?A``"4P``(E((`"```#/```8R0)^&``
+M)2A``@,`4!`!`#$F+@``$"40`````2(J[O]`%``4$0`EB```(`"S)P```CP`
+M`%8D```"/```522`$!$`(1!B`@``4(PE((`")2A``@GXP`(E,``")2"``@GX
+MH`(E*$`"`P`"$@$`,287```0)1````0`(BKQ_T`4@!`1`(`0%P`P`*2/(1B"
+M`"$0P@,E((`"``!&C````CP``$(D"?A`````98P!`/<F`@#B*KW_0!2`@!<`
+M```"/```0B0)^$``9``$)`$``B1<`+^/6`"^CU0`MX]0`+:/3`"UCT@`M(]$
+M`+./0`"RCSP`L8\X`+"/"`#@`V``O2?__Z4P``&B,`8`0!`S$P(D``#"I-07
+M`B0``.*D"`#@`P$``B2``*(P#0!`$`````"*$H*4!0!`%`@)`B2,$H*4!P!`
+M$``````("0(D``#"I*P*`B0``.*D"`#@`P$``B0(`.`#)1```-#_O2<H`+^O
+M)`"SKR``LJ\<`+&O&`"PKR60@``EF$`")8A``A``H*=P$D*6`5!"+`<`0!3@
+M`5`FH`%"CLD`!20)^$``$`"F)T(!0!`H`+^/U`%"EO``0C!```,D`0!#4(82
+M8*80`**7#P!`5-P!(X[,`4..!P`")`L`8E3<`2..T`%#E@@``B0'`&)4W`$C
+MC@4``B00`**G`0`")'828J9X$F*FW`$CC@8``B01`&(097`"),H!(Y8/`&)4
+M!```K@@"(Y:<_V(D`@!"+`0`0%`(`B.6!0!B)`8``!`(`B*F00`")`0`8E0$
+M``"N0P`")`@"(J8$``"NAA)BE@<`0!`!``(D!``"KG828I8$`$!4BA)BE@,`
+M`B0$``*NBA)BE@4`0%",$F*6!``"C@0`0C0$``*NC!)BE@P`0!`1#@(DR@$C
+ME@H`8A`("0(D!``#C@@`8C0$``*N>!)BE@0`0!0("0(D*`!B-`0``JX("0(D
+M$``"IM0!0I;P`$(PT/]")$``0BP5`$`4Q`D"),P!1(X'`(,X`0!C+`L`@C@!
+M`$(L)1AB``T`8!3$"0(D"@`#)`D`@Q`)``(D"`""$,0)`B0(`(,4K`H")-`!
+M0I8$`$(L!`!`$*P*`B3$"0(D`@``$!(``J82``*F,Q,")`P``J;4%P(D#@`"
+MI@```H[_OP,D)!!#``"`0C0```*N$`"BEP(`0C`-`$`4)2```,P!0XX&`&(L
+M"0!`4`$`!"0%``(D!P!B%$`3!`#0`4*6!`!"+`,`0!1`$P0``0`$)$`3!```
+M``..)A!#```@0C`F&&(`__L")"088@``"&,T$`"BET(0`@`!`$(X`0!",$`2
+M`@`F$$,```)","888@````.NS`%"C@<`0BP$`$!4```"C@`08C0$```0```"
+MKO_O`R0D$$,````"K@```HX#`$(T```"KM`!(I8"`$(L!@!`$!``HI?,`4..
+M"P`")"<`8E0```*.$`"BEP$`0C`%`$`4)1@```0``HX)`$(P`0!`5`$``R2`
+M$`,````#CB800P`$`$(P)AAB`!``HI?"$`(``0!".`$`0C#`$`(`)A!#``@`
+M0C`F&&(````#KA``HI<$`$(P!0!`%"48```$``*."0!",`$`0%0!``,D`!$#
+M`````XXF$$,`$`!","888@"@`&,T```#K@```HY``$,P)A!#`````JXX$V*.
+M!`!`$"48```\$V*.`P!`%``:`P`!``,D`!H#`````HXF&&(```%C,"800P`!
+M``,\)1!#``(``SPE$$,`!``#/"400P`(``,\)1!#`````J[,`2..!0`")`8`
+M8E3,`2*.T`$CE@@``B0&`&)0```"CLP!(HX&`$(L!@!`%!``HI<```*.$``#
+M/"400P````*N$`"BE_`!0C`#`$`0`A$"``,``!`(``*F"@`")`@``J80`**7
+M`/!",`4`0!`"&P(``0`")`008@`#```0"@`"IH```B0*``*FU`%"EO``0C#0
+M_T(D0`!"+`<`0!````*.(``#/"400P!```,\)1!#``@``!````*NW_\#//__
+M8S0D$$,`O_\#//__8S0D$$,````"KGH28I8,`$`0)2!``J`!0HX/``4D"?A`
+M`$@2)B8&`$`0`0`")$P2(JX```*.@``#/"400P````*NS`%"C@4`0BQH$B*N
+MS`%#C@4``B0%`&(4)2```-`!0Y8)``(D!@!B4`$`!"3,`4*.!@!"+`,`0!0`
+M%@0``0`$)``6!`````..)A!#```!!#PD$$0`)AAB`````ZX/``(D%``"K@$`
+M`B0H`+^/)`"SCR``LH\<`+&/&`"PCP@`X`,P`+TGX/^])Q@`OZ\```(\``!"
+M)`GX0``0`*4G`0`")!@`OX\(`.`#(`"])P$``B0%`*(4`0`"/````CP``$(D
+M"`#@`W``@JRD-T(D"`#@`W``@JP```````````````#8_[TG)`"_KR``LJ\<
+M`+&O&`"PKR6`@``ED*`````"/```420H@`4T"?@@`@0`1HXE(``"+(`%-`GX
+M(`(,`$:.)2```C"`!30)^"`"$`!&CB4@``(T@`4T"?@@`@@`1HX``$*.``$#
+M/"000P`.`$`0```"/```0B0E(``""?A``!``I2<T$@*.)2```"4H```H`$2L
+M+`!%K"4@``(@@`4T"?@@`@`!!CP```(\``!")"4@``(@@`4T"?A`````1HXD
+M`+^/(`"RCQP`L8\8`+"/"`#@`R@`O2?0_[TG*`"_KQ0`I:_<`8.,`0`")`D`
+M8A#__P(T#0!@$````CP&``(D"0!B$`@``B02`&(4`0"B)/__`C0<`**O!P`"
+M//__0C0+```0(`"BKP```CP``$*,(Q"B`,`0`@`<`**O```"/```0HPC$*(`
+MP!`"`"``HJ\!`*(D&`"BKX`!`CS__T(T)!#"`!``HJ\```(\``!")`GX0``0
+M`*4G*`"_CP@`X`,P`+TGX/^])Q@`OZ\4`+&O$`"PKR6(@````!`\```0)BB`
+M!30)^``")3```````CP``$(D)2`@`@GX0``$@`4T!``#/"400P#/_P8\___&
+M-"4@(`($@`4T"?@``B0P1@`E("`"((`%-`GX``+__P8T&`"_CQ0`L8\0`+"/
+M"`#@`R``O2?0_[TG*`"_KR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6@@``E
+MB*``$@`BEAL`0!`ED(`"```"/```0B0)^$``!(`%-!``!CP``!`\```0)B4@
+M@`($@`4T"?@``B4P1@`E((`")(`%-`GX``(0`":6)2"``CB`!30)^``"$@`F
+MEA0`)HXE((`",(`%-`GX``+`,`8`#P``$````CP```(\``!")"4@@`()^$``
+M!(`%-.__!CS__\8T```#/```8R0E((`"!(`%-`GX8``D,$8````"/```0B0E
+M((`"*(`%-`GX0````":.```"/```0B0E((`""?A``""`!32`_P,\)!!#``@`
+M(Y8E,$,`&``BE@4`0!`$`$(D`!0"`'\``SPD$$,`)3#"````$#P``!`F)2"`
+M`@GX``(@@`4TU"]&CO__`CS_`$(T)##"`!H`(I8`$@(``/]","4PP@#4+T:N
+M)2"``@GX``(8@`4T"``SEAP`(XXK$&,"`0!`5"688``,`#*.'``CCBL00P(!
+M`$!4)9!@``(`<E8``#6.!``UC@0`)H[]_\8DP#`&``<`$3S__S$V)##1`!@*
+M`CP``!`\```0)B4@@`+4@`4T"?@``B4PP@#]_Z8FP#`&`"0PT0``"@(\)2"`
+M`MB`!30)^``")3#"`/__8C(`-!(`)2"``MR`!30)^``")3!&`"@`OX\D`+6/
+M(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#,`"])P```````````````.#_O2<<
+M`+^O&`"RKQ0`L:\0`+"O)8B``"40H``ED,`````0/```$"8`8`4D"?@``B4P
+M0``E("`""&`%)`GX``(!``8D```"/```0B0E("`"#&`%)`,`!B0)^$```@`'
+M)`<`0!`E("`"```"/```0B0)^$``!&`%)```0J8!``(D'`"_CQ@`LH\4`+&/
+M$`"PCP@`X`,@`+TG``````````#@_[TG&`"_KQ0`L:\0`+"O)8B``"6`H```
+M``(\``!")`GX0``40`4D0(`0``,`!B0$,`8"```#/```8R0E("`"%$`%)`GX
+M8``E,$8``0`")!@`OX\4`+&/$`"PCP@`X`,@`+TGX/^])Q@`OZ\4`+&O$`"P
+MKR6(@``E@*`````"/```0B0)^$``%$`%)$"`$``#``8D!#`&`B<P!@````,\
+M``!C)"4@(`(40`4D"?A@`"0P1@`!``(D&`"_CQ0`L8\0`+"/"`#@`R``O2?@
+M_[TG'`"_KQ@`LJ\4`+&O$`"PKR60@``EB*``)8#``````CP``$(D"?A``!A`
+M!20!``,D!!@C`B<8`P`D$$,``0`0,@2`,`(```,\``!C)"4@0`(80`4D"?A@
+M`"4P4``!``(D'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGZ/^])Q0`OZ\0`+"O
+M)8"@``8``BX(`$`0__\")````CP``$(D"?A``!Q`!20O`$(P!A`"`@$`0C`4
+M`+^/$`"PCP@`X`,8`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\ED(``)8"@`"6(
+MP`````(\``!")`GX0``40`4D0!@0``,`!"0$(&0``0`#/`#P8S0G&&0`)#!#
+M``"#$``E,-```P`@$@"`QC0!``(\)3#"`````CP``$(D)2!``@GX0``40`4D
+M1"Q#C@`!!3P```(\``!")"4@0`()^$``)2AE`!P`OX\8`+*/%`"QCQ``L(\(
+M`.`#(`"])P````#H_[TG$`"_KP```CP``$(D"?A```A`!20!`$(X`0!"+!``
+MOX\(`.`#&`"])]#_O2<L`+^O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"P
+MKR68@``EH*``):@``"6P8`(```(\``!0)`GX``*```4D@``#/"000P`6`$`0
+M)2!@`@GX``*,``4D)1A````!`CPD$&(``0!`5"``%3P`(`(\)!!B``(`0!!`
+M``(\):BB`@`$`CPD$&(``@!`$(```CPEJ*("``($/"009``!`$!4):BD`@``
+M`CP``$(D)2!@`@GX0`#```4D)9!``/__`B0$`$)6!0$"/```@*Y3```0)1``
+M`+K80C0D&$(""``"/"000@($`$`0``"#K@!``CPE$&(```""K@4`0C(%`$`0
+MP`5",@``@HX!`$(T``""KL`%0C(:`$`0```0/```@HY``$(T``""K@``$"8E
+M(&`""?@``L0`!23_`T0PH$;#CB4@@P#_`Q$\)!!1``(4`@`E$$0`H$;"KB4@
+M8`()^``"R``%)/\#1#"@1L..)2"#`"0040`"%`(`)1!$`*!&PJX@`$(R"`!`
+M4```@HYH$F*.!`!`$`!``SP``(*.)1!#````@JX``(*.)1"B`@``@JX`0`,\
+M)!!#`!<`0!```!`\4!)RK@``$"8E(&`""?@``L0`!214$F*N)2!@`@GX``+(
+M``4D6!)BKB4@8`()^``"S``%)%P28JXE(&`""?@``M``!21@$F*N)2!@`@GX
+M``+4``4D9!)BK@$``B0L`+^/*`"VCR0`M8\@`+2/'`"SCQ@`LH\4`+&/$`"P
+MCP@`X`,P`+TG"`#@`T0L@HS0_[TG*`"_KR0`M:\@`+2O'`"SKQ@`LJ\4`+&O
+M$`"PKR6@@``EB*``1"R5C@L`H08EF(`"```"/```0B0D``4D"?A``"4P````
+M``(\``!")"4@@`()^$``)``%)`4!`CRZV$(T)#`B`D``(C(-`$`0)8```,PL
+M8HX!`$!40`#&--`L8HX!`$!4``'&--0L8HX!`$!4@`#&--@L8HX!`$!4``3&
+M-`$`(C(!`$!4!P#&-.`"`CPD$"("%0!`$(```CPE,,(`(``"/"00(@("`$`0
+M``$"/"6``@)```(\)!`B`@(`0!``(`(\)8`"`H```CPD$"("`@!`$``$`CPE
+M@`("``(#/"00(P(!`$!4)8`#`@!``CPD$"("`@!`$`@``CPE,,(````"/```
+M4B0E((`""?A``J``!20```(\``!")"4@@`()^$``K``%)/](`SS__V,T)!!#
+M`"4@@`*L``4D"?A``B4P4``%`"$&1"QQKB4@@`(D``4D"?A``@$`!B0E$*`"
+M*`"_CR0`M8\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,P`+TG````````````
+M````"`#@`^H!@I3H_[TG$`"_K___HS#J`8*4*Q!B``L`0!`E$```0!D#`!R(
+M!30```(\``!")`GX0``A*&4``(!#,`(`8!0!``(D)1```!``OX\(`.`#&`"]
+M)\C_O2<T`+^O,`"^KRP`MZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O
+M)9B``/__M3#J`6.6*QBC`DX`8!`E$```0($5`!2($30AB!$"```"/```0B0)
+M^$``)2@@`B600`````(\``!4)"4@8`(`B`(T(2@"`@GX@`(E,```!(@>-"4@
+M8`(A*!X""?B``B4P```(B!<T)2!@`B$H%P()^(`")3````R(%C0E(&`"(2@6
+M`@GX@`(E,```$(@%-"4@8`(A*`4""?B``B4P```E(&`")2@@`@GX@`('``8D
+M&(@%-"4@8`(A*`4""?B``B4P```<B`4T)2!@`B$H!0()^(`")3````0``B0:
+M`$(6`0`"),PO8HX`"`,\)!!#`!0`0!!``+`F__\0,D"!$``E(&`"`(@"-"$H
+M`@()^(`")3```"4@8`(A*!X""?B``B4P```E(&`"(2@7`@GX@`(E,```)2!@
+M`B$H%@()^(`")3````$``B0T`+^/,`"^CRP`MX\H`+:/)`"UCR``M(\<`+./
+M&`"RCQ0`L8\0`+"/"`#@`S@`O2?8_[TG(`"_KQP`LZ\8`+*O%`"QKQ``L*\E
+MF(``)2#``/__I3#J`6.6*QBC`"0`8!`E$```%`"`4"60```%`)*0`)(2``0`
+M@I`ED$("`P"&D``V!@`"`(*0`!0"`"4PP@`!`(*0`!("`"4PP@```(*0)3#"
+M`$(P!@#`%Q(`)3#"``(``!!"D!(`)3```$")!0`8B`4T```0/```$"8E(&`"
+M"?@``B$H)0(<B`4T)2!@`B$H)0()^``"`(!&-@$``B0@`+^/'`"SCQ@`LH\4
+M`+&/$`"PCP@`X`,H`+TGL/^])TP`OZ](`+ZO1`"WKT``MJ\\`+6O.`"TKS0`
+MLZ\P`+*O+`"QKR@`L*\EL(``)9#``%P`IZ]@`**/__^E,!``I:\4`+:OX`'%
+M)@$`1"PC(`0`554"/%950C0D(((`(R""`.H!PY80`**/*QA#`"@!8!`E$```
+M``!#D@8`8BPD`4`0)1```````CQP3D(D@!@#`"$88@```&*,"`!````````G
+M```0!0`7)```HXP`(&,P%P%@$"40```A```0!@`7),POPHX`"`,\)!!#`!P`
+M0!`$`!<D$`"CCT``8B0*`*.4*A!#`!<`0%0$`%Z2"`$`$"40```"`$.6!0!C
+M+`0!8!0E$````@!"E@8`0BP,`$`4);@```(`0I8.`$(L`0!7+".X%P`"`/<R
+M!0``$`$`]R8#```0!P`7)/4``!`E$```!`!>D@4`0I(`$@(`)?#"`P8`0I(`
+M%`(`)?#"`P<`0I(`%@(`)?#"`R;PQ`,(`$.2"0!"D@`2`@`E$&(`)A!$`/__
+M0C`8`**O"@!4D@L`0I(`$@(`):""`@P`0I(`%`(`):""`@T`0I(`%@(`):""
+M`B:@A`(.`$.2#P!"D@`2`@`EJ&(`)JBD`O__M3(0`%.2$0!"D@`2`@`EF&("
+M$@!"D@`4`@`EF&("$P!"D@`6`@`EF&("`@!"E@X`0BP"`$`0)IAD`O\`<S($
+M``(DF`#B%A``HH_,+\*.``@#/"000P"2`$`0$`"CCT``8B3__T(P'`"BKT")
+M`P``B`4T```0/```$"8E(,`"(2@E`@GX``(G,!X`!(@%-"4@P`(A*"4"&`"B
+MCPGX``(G,`(`"(@%-"4@P`(A*"4""?@``B4P@`(,B`4T)2#``B$H)0()^``"
+M)3"@`A"(!30E(,`"(2@E`@GX``(E,&`"%(@%-"4@P`(A*"4""?@``@0`!B0`
+M``(\``!")"4@P`(0`*6/"?A``%P`IH\4`$:2%0!"D@`2`@`E,,(`%@!"D@`4
+M`@`E,,(`%P!"D@`6`@`E,,(`&`!5DAD`0I(`$@(`):BB`AH`0I(`%`(`):BB
+M`AL`0I(`%@(`):BB`A0`HX_0+V*,!`!",!4`0%`EH```'@!#DA\`0I(`$@(`
+M);AB`!P`0Y(=`$*2`!("`"408@`@`**O(`!4DB$`0I(`$@(`):""`B(`0I(`
+M%`(`):""`B,`0I(`%@(``P``$"6@@@(@`*"O);@``!P`HH]`B0(``(@3-```
+M$#P``!`F)2#``@GX``(A*#,"!(@2-"4@P`(A*#(""?@``B4PX`((B`4T)2#`
+M`B$H)0()^``")3"@`@R(!30E(,`"(2@E`@GX``(@`*:/$(@%-"4@P`(A*"4"
+M"?@``B4P@`(4B`4T)2#``B$H)0()^``"!P`&)!B(!30E(,`"(2@E`@GX``(E
+M,```'(@%-"4@P`(A*"4""?@``B4P```0`*./0(D#`"4@P`(A*#,""?@``B4P
+MP`,E(,`"(2@R`@GX``(8`*:/*@``$`$``B00`**/0(D"``"(!30``!`\```0
+M)B4@P`(A*"4""?@``B4PP`,$B`4T)2#``B$H)0()^``"&`"FCPB(!30E(,`"
+M(2@E`@GX``(E,(`"#(@%-"4@P`(A*"4""?@``B4PH`(0B`4T)2#``B$H)0()
+M^``")3!@`A2(!30E(,`"(2@E`@GX``(E,.`"```"/```0B0E(,`"$`"ECPGX
+M0`!<`*:/`0`")$P`OX](`+Z/1`"WCT``MH\\`+6/.`"TCS0`LX\P`+*/+`"Q
+MCR@`L(\(`.`#4`"])^C_O2<0`+^O,"R#)````CP``$(D)2"@`"4H8``)^$``
+M!@`&)!``OX\(`.`#&`"])^C_O2<0`+^O```"/```0B0P+(0D"?A```8`!B0!
+M``(D$`"_CP@`X`,8`+TGZ/^])Q``OZ\\+(,D```"/```0B0E(*``)2A@``GX
+M0``&``8D$`"_CP@`X`,8`+TGX/^])Q@`OZ\4`+&O$`"PKR6`@`````(\``!"
+M)#PL!"8)^$``!@`&)#PL`Y(]+`*2`!("`"488@`^+`*2`!0"`"488@`_+`:2
+M`#8&````$3P``#$F)2```N"`!30)^"`")3!F`$`L`I)!+`:2`#(&`"4@``+D
+M@`4T"?@@`B4P1@`!``(D&`"_CQ0`L8\0`+"/"`#@`R``O2?__Z4P)1B```@"
+M8I0(`$40#``$)'(28I2``$(P`0!$+",@!`#X_P(D)"""``L`A"0!`,!4``#$
+MK`@`X`,E$```)1B``(82@I0%`$`0)2@``'82@I0"`$`4`0`%)$,`!22*$H*4
+M`0!`5`0`I32,$H*4"0!`$`````#*`6.4$0X")`4`8A``````>!*"E`(`0!0(
+M`*4T(`"E-`@`X`,E$*``X/^])QP`OZ\8`+*O%`"QKQ``L*\E@(``2!("EAP`
+M0S""D`,``@!","N(`@"L`0*."?A``"4H0`(```(\``!")"4@``()^$```)@%
+M-````SP``&,D)2```@"8!30)^&```"!&-+`!`HXE(``""?A``"4H0`("`%$0
+M`0`F+B4P(`*X`0*.)2```@GX0``E*$`"'`"_CQ@`LH\4`+&/$`"PCP@`X`,@
+M`+TGX/^])Q@`OZ\4`+&O$`"PKR6(@``E@*`````"/```0B0)^$``$$`%)/'_
+M`SR?_V,T)!!#`````SR03F,D!P`0,H"`$``A@`,"```&C@```SP``&,D)2`@
+M`A!`!20)^&``)3!&`!@`OX\4`+&/$`"PCP@`X`,@`+TGX/^])QP`OZ\8`+*O
+M%`"QKQ``L*\E@(``___2,````CP``$(D-BP$)@GX0``&``8D-BP#DC<L`I(`
+M$@(`)1AB`#@L`I(`%`(`)1AB`#DL!I(`-@8````1/```,28E(``""(`%-`GX
+M(`(E,&8`.BP&DCLL`I(`$@(`)3#"`/\_4C(`E!(`)2```@R`!30)^"`")3#2
+M`!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])]C_O2<D`+^O(`"TKQP`LZ\8`+*O
+M%`"QKQ``L*\EH(`````2/```4B8)^$`"3(`%-"680``E((`""?A``E"`!30E
+M@$``)2"``@GX0`),@`4T*YA3`"&`$P(EB````(@0`"6````E&```)1`"`B48
+M(P(D`+^/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])^C_O2<0`+^O```"
+M/```0B0)^$``3(`%-!``OX\(`.`#&`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O
+M)9"``````CP``$(D"?A``""`!30``0,\)8A#````$#P``!`F)2!``B"`!30)
+M^``")3`@`B4@0`(@@`4T"?@``B4P(`(<`+^/&`"RCQ0`L8\0`+"/"`#@`R``
+MO2?@_[TG&`"_KQ0`L:\0`+"O)8B``#02(HXT`$!0&`"_CP(`0I0@`$(P+P!`
+M$"4@`````**,$`!`$"6````$`*8D)2A``"$0Q````$.0@`!B,`8`0%`!`(0D
+M?P!C,"L0<``!`$!0)8!@``$`A"0K$(4`]?]`%"$0Q`````(\``!")"4@(`()
+M^$``!(`%-`X``!(E&$``0A`0``,`0BP+`$!0__T&/``"!CP```(\``!")"4@
+M(`($@`4T"?A``"4P9@`*```0&`"_C__]!CS__\8T```"/```0B0E("`"!(`%
+M-`GX0``D,&8`&`"_CQ0`L8\0`+"/"`#@`R``O2?8_[TG(`"_KQP`LZ\8`+*O
+M%`"QKQ``L*\EF(`````"/```0B0)^$``9)@%-,*4`@#_`5(R``%",@,`0!``
+M`!$\_P%2.B>0$@```#$F)2!@`@GX(`)0@`4T)8!``"4@8`()^"`"3(`%-":`
+M`@(F$!("(`"_CQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])^C_O2<4`+^O$`"P
+MKR6`@`````(\``!")`GX0``@0`4D_P!#,`(9`P`/`$0PS`$"C@0`0Q0E*```
+MT`$"E@$`1%`!``4D)1"@`!0`OX\0`+"/"`#@`Q@`O2?@_[TG'`"_KQ@`LJ\4
+M`+&O$`"PKR60@``E@*`````1/```,28)^"`"D(`%-````XXA$$,````"KB4@
+M0`()^"`"C(`%-`0``XXA$$,`!``"KB4@0`()^"`"E(`%-`P``XXA$$,`#``"
+MKB4@0`()^"`"B(`%-`@``XXA$$,`"``"KB4@0`()^"`"F(`%-!```XXA$$,`
+M$``"KAP`OX\8`+*/%`"QCQ``L(\(`.`#(`"])P@`X`,!``(DZ/^])Q``OZ\`
+M``(\``!")`GX0``<G`4T_P!",!``OX\(`.`#&`"])^C_O2<0`+^O```"/```
+M0B0)^$``6(`%-`<`0C`0`+^/"`#@`Q@`O2?H_[TG$`"_KP<`IC````(\``!"
+M)`GX0`!8@`4T$`"_CP@`X`,8`+TG"`#@`[PO@HSH_[TG$`"_KS02AHP$`,!4
+M```"/+POA:P$```0`0`")```0B0)^$```````!``OX\(`.`#&`"])P@`X`,!
+M``(DX/^])QP`OZ\8`+*O%`"QKQ``L*\EB(``)8"@``8``BX(`$`4)9`@`@``
+M`CP``$(D"?A``/__!30K$%``!0!`4````CS__P(D^"]"K@T``!`E$`````!"
+M)"4@(`()^$``)2@``@```SP``&,D)2`@`G`0!20)^&``)3!``/@O4*X!``(D
+M'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGZ/^])Q0`OZ\0`+"O)8"``````CP`
+M`$(D"?A``'`0!20```,\``!C)"4@``()^&``__]%,!0`OX\0`+"/"`#@`Q@`
+MO2?8_[TG(`"_KQP`LZ\8`+*O%`"QKQ``L*\EB(``)9"@`"68(`(```(\``!"
+M)`GX0`#_/P4D*Q!2``4`0%````(\__\")/PO8JX6```0)1``````0B0E("`"
+M"?A``!2`!30E@$`````"/```0B0E("`""?A``"4H0`(`P`,D)(`#`O\_0C``
+M``,\``!C)"4@(`(4@`4T"?A@`"4P`@+\+W*N`0`")"``OX\<`+./&`"RCQ0`
+ML8\0`+"/"`#@`R@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``%(`%
+M-````SP``&,D)2```@GX8`#_/T4P%`"_CQ``L(\(`.`#&`"])\\O@I`!`$(X
+M"`#@`P$`0C#@_[TG'`"_KQ@`LJ\4`+&O$`"PKR60@``1`*`0)8A``@```CP`
+M`$(D"?A```2`!33__A`\__\0-@```SP``&,D)2`@`@2`!30)^&``)#!0`,PO
+M(HXD$%``$```$,PO(JX```(\``!")"4@0`()^$``!(`%-``!$#P```,\``!C
+M)"4@0`($@`4T"?A@`"4P4`#,+R*.)1!0`,PO(JX!``(D'`"_CQ@`LH\4`+&/
+M$`"PCP@`X`,@`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0`+"O)8B``"60H``E
+MF"`"```"/```0B0)^$``_S\%)"L04@`%`$!0```"//__`B0`,&*N&0``$"40
+M`````$(D)2`@`@GX0``4@`4T)8!``````CP``$(D)2`@`@GX0``E*$`"`,`#
+M//__8S0D@`,"`!0"`/\_`SPD$$,````#/```8R0E("`"%(`%-`GX8``E,`("
+M`#!RK@$``B0@`+^/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TGZ/^])Q0`OZ\0
+M`+"O)8"``````CP``$(D"?A``!2`!30"+`(````"/```0B0E(``""?A``/\_
+MI3`4`+^/$`"PCP@`X`,8`+TGV/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O$`"P
+MKR60@``EH,``__^Q,"680`*``",N#0!@$`P``B0``!`\```0)@`$!20)^``"
+M)3`@`B4@0`($!`4D"?@``BLP%``A$#,"."]4H"40```D`+^/(`"TCQP`LX\8
+M`+*/%`"QCQ``L(\(`.`#*`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR68
+M@`#_`+`P20#`$#@2<*+_``(R1@!`$$`!`R0T$F*.`@!"E$`!0C!"`$-4(`"_
+MCP```CP``$(D"?A```$`!20E*$``-!)BC@(`0I0`0$(P"P!`$$(8!0`8``,"
+M$C```$`0!@`A,,(`!`'&)!*0```A$%(`0!`"`!D``!"L#5(D-!)BC@(`0I0`
+M@$(P"P!`$((8!0`8``,"$C```$`0!@`A,,(`T@#&)!*0```A$%(`0!`"``H`
+M`!!(#5(D&``%`A(P``!`$`8`(3#"`&@!QB02D```(1!2`$`0`@!@#E(D&``%
+M`A*```!`$!``(8`"`N@#$";_/Q`R```1/```,28E(&`""?@@`G`0!20E(&`"
+ML!`%)`GX(`(E,$`"`#00`"4@8`(4@`4T"?@@`B4PT``@`+^/'`"SCQ@`LH\4
+M`+&/$`"PCP@`X`,H`+TGZ/^])Q``OZ\```(\``!")`GX0`#<`86,$`"_CP@`
+MX`,8`+TG!@`#)`D`HQ`E$```DQ*"D`4`0!`E&```Z"^"C`(`0BP!`$!4`0`#
+M)"408``(`.`#`````.#_O2<<`+^O&`"RKQ0`L:\0`+"O```"/```0B0)^$``
+M)9"``'4`0!```!`\```0)B4@0`)PF`4T"?@``A\`!B34`4:6\`#&,-#_QB1`
+M`,8L`0#&+",P!@`$`,8P)2!``OB9!30)^``"%`#&)```$3P``#$F)2!``@GX
+M(`(<@`4T?\`#)"000P`E($`"'(`%-`GX``*``$8T)2!``@2!!30)^``"/0`&
+M)"4@0`()^"`"$$`%)"4@0`(00`4D"?@``@(`1C3,`42.!P"#.`$`8RP+`((X
+M`0!"+"488@`-`&!4```0/`H``R0)`(,0"0`")`@`@A```!`\(0"#%```$";0
+M`4*6!`!"+!T`0!`````````0/```$"8E($`"=)@%-`GX``(F``8D)2!``GB8
+M!30)^``"#0`&)"4@0`+PF04T"?@``@<`!B0E($`"])D%-`GX``(_``8D```"
+M/```0B0E($`""?A``!!`!23__`,\__]C-"000P`:```0``(&/"4@0`)TF`4T
+M"?@``@H`!B0E($`">)@%-`GX``(,``8D)2!``O"9!30)^``"`P`&)"4@0`+T
+MF04T"?@``B``!B0```(\``!")"4@0`()^$``$$`%)/_\`SS__V,T)!!#```#
+M!CPE($`"$$`%)`GX``(E,$8`1P``$!P`OX\``!$\```Q)B4@0`()^"`"$$`%
+M)/_\!CS__\8T```0/```$"8E($`"$$`%)`GX``(D,$8`)2!``@GX(`(00`4D
+M_?\&)"4@0`(00`4D"?@``B0P1@`E($`"<)@%-`GX``(?``8D)2!``G28!30)
+M^``"?P`&)"4@0`)XF`4T"?@``@X`!B0E($`"\)D%-`GX``(,``8D)2!``O29
+M!30)^``"_P`&)-0!1I;P`,8PT/_&)$``QBP!`,8L(S`&``0`QC`E($`"^)D%
+M-`GX``(.`,8D)2!``@GX(`(<@`4T?\`#)"080P#4`4*6\`!",-#_0B1``$(L
+M`@!`%(`39C2`#V8T```"/```0B0E($`""?A``!R`!30<`+^/&`"RCQ0`L8\0
+M`+"/"`#@`R``O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKP```CP``$(D"?A``"60
+M@`!)`$`0```1/```,28E($`""?@@`A!`!23__`8\___&-```$#P``!`F)2!`
+M`A!`!20)^``")#!&`"4@0`()^"`"$$`%)/W_!B0E($`"$$`%)`GX``(D,$8`
+M)2!``@2!!30)^``"`0`&)"4@0`()^"`"'(`%-'_``R0D&$,`U`%"EO``0C#0
+M_T(D0`!"+`(`0!2`$V8T@`]F-```$#P``!`F)2!``@GX``(<@`4T)2!``G"8
+M!30)^``"'P`&)"4@0`)TF`4T"?@``G\`!B0E($`">)@%-`GX``(.``8D)2!`
+M`O"9!30)^``"#``&)"4@0`+TF04T"?@``O\`!B34`4:6\`#&,-#_QB1``,8L
+M`0#&+",P!@`$`,8P)2!``OB9!30)^``"%`#&)!P`OX\8`+*/%`"QCQ``L(\(
+M`.`#(`"])P```CP``*.4L$Y"E"L00P`+`$`4)2```````CRP3D,D``"EE`$`
+MA"2`$`0`(1!#````0I0K$$4`^_]`4`$`A"0```(\L$Y")(`8!``A$$,`"`#@
+M`P(`0H3@_[TG&`"_KQ0`L:\0`+"O)8#``"6(X``E,(``__^C)!T`8BR^`$`0
+MX`&')````CS@3D(D@!@#`"$88@```&*,"`!````````"``(D#P`"4@``XHP"
+M``(NM@!`%"40```$``(NLP!`%`T``B0&``(NL`!`%"40``!_``(DK0`"4B40
+M``"K```0#0`")&$``!``($(PIP``$B40```!``(D!@`"%@````#,+\*,PA8"
+M``$`0CB?```0`0!",`8``%(``.*,`0`")`8``E+0+\*,F```$`P``B0"$P(`
+ME0``$`$`0C""$`(`D@``$`$`0C#,`8.,!@!B+(X`0!`E$```!0`")(L`8A0-
+M``(DT`&"E`@`0BR'`$!0)1```(4``!`-``(D@P``$B40```!``,D@``#%@P`
+M`B0```(\``!")`GX0``(H@4T0A,"``$`0CAX```0`0!",/@!@HP``"*N=```
+M$"40``!R```2)1````$``R1P``,6&`"_C]POPHQM```0`0!"+`8``%*&$L*4
+M`0`")`4``A(8`+^/9P``$!0`L8]C```0`0!"+(P2PI1@`$`4)1```(H2PY1=
+M`&`0`0`")%L``!`E$```60``$B40```!``,D5@`#%@P``B3,+\*,PA<"`%(`
+M`!`!`$(X!@``4@``XHP!``(D"P`"4M`OPHQ+```0#``")!```SPD$$,`*Q`"
+M`",0`@#S_P,D)!!#`$,``!`-`$(DPA`"``$`0C@_```0`0!",.`OPHP_`$(P
+M```BKCH``!`E$```X"_"C``_0C`"$@(````BKC0``!`E$````0`")`@``E(8
+M,,*,+P``$B40```'``,N+`!@$`P``B0$```0```"/`$`0C@G```0`0!",```
+M0B0)^$```````"4@0``A`(`0`0`")/[_`R8%`&(L'0!`$"40``````(\6$]"
+M)(`8`P`A&&(```!BC`@`0```````"0""D`P``!```"*N#`""D`D``!```"*N
+M#0""D`8``!```"*N"P""D`,``!```"*N"@""D```(JX&```0)1```````CP`
+M`$(D)3```@GX0``E."`"&`"_CQ0`L8\0`+"/"`#@`R``O2?8_[TG(`"_KQP`
+ML:\8`+"O)8B``"6`X``E0"`"_O^C)!P`8BR.`$`0X`$D)@```CR(3T(D@!@#
+M`"$88@```&*,"`!````````%```2``@#/,PO`HTE$$,`!@``$,PO`JW,+P*-
+M__<#//__8S0D$$,`S"\"K8$``!`!``(D``"#C``08S!]`&`0)1````4``!+[
+M_P,DT"\"C2000P`$```0T"\"K=`O`HT$`$(TT"\"K0```CP``$(D)2`@`B"!
+M!30)^$``T"\&C6P``!`!``(D```"/```0B0E("`""?A```BB!30#```2)3!`
+M``,``!``(,8T_]\")"0PP@````(\``!")"4@(`()^$``"*(%-%H``!`!``(D
+M^`$PK@```CP``$(D)2`@`DB`!30)^$``)3```E$``!`!``(D*Q`0`-PO`JU-
+M```0`0`")`4``!(`@`,\S"\"C2400P`&```0S"\"K<PO`HW_?P,\__]C-"00
+M0P#,+P*M0```$`$``B3T+P*%(8`"`D```BX!`$!0/P`0)!H``B0&`*)4X"\#
+MC>`O`HTE$`("/P!",`8``!#@+P*M`#]C,``_`C("$@(`)1!#`.`O`JT```(\
+M``!")"4@(`+H@`4T"?A``.`O!HTF```0`0`")`<`PBPC`$`0)1```````CQL
+M3T(D@!@&`"$88@````(\``!")"4@(`(``&6,"?A``"4P``(8```0(`"_CP``
+M@HP0``,\)!!#``P`0%`X`**/!```$M`O`HT(`$(T!```$-`O`JWW_P,D)!!#
+M`-`O`JT(```0`0`")#@`HH\0`**O```"/```0B0E("`""?A``"4X``(@`+^/
+M'`"QCQ@`L(\(`.`#*`"])^#_O2<8`+^O,`"BCS0`HX\0`**O```"/```0B0)
+M^$``%`"CKRL0`@`8`+^/"`#@`R``O2?0_[TG+`"_KR@`MJ\D`+6O(`"TKQP`
+MLZ\8`+*O%`"QKQ``L*\Q`*`0)8B``````CP``$(D"?A```1`!23\_P8\___&
+M-````SP``&,D)2`@`@1`!20)^&``)#!&`````CP``$(D"?A```H`!"0H`!`D
+M```"/```4B0!`!8\```"/```523\_Q0\__^4-@```CP+```0``!3)`GXH`(R
+M``0D)2`@`@GX0`($0`4D)2`@`@1`!20)^&`")#!4`/__$"8(```2)2`@`@GX
+M0`(00`4D)!!6`/#_0!0`````!```5@```CP/```0)1```````CP``$(D)2`@
+M`@GX0``$@`4T^_\&//__QC0```,\``!C)"4@(`($@`4T"?A@`"0P1@`!``(D
+M+`"_CR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#,`"])]C_O2<@
+M`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@``E@*`````"/```4B0)^$`"!(`%-`0`
+M!CP```,\``!S)"4@(`($@`4T"?A@`B4P1@`+```2)2`@`@GX0`($0`4D_/\#
+M//__8S0D$$,``0`&/"4@(`($0`4D"?A@`B4P1@`@`+^/'`"SCQ@`LH\4`+&/
+M$`"PCP@`X`,H`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0`+"O)8B``"6`H```
+M``(\``!2)`GX0`($@`4T!``&/````SP``',D)2`@`@2`!30)^&`")3!&``L`
+M`!(E("`""?A``@1`!23\_P,\__]C-"000P`"``8\)2`@`@1`!20)^&`")3!&
+M`"``OX\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2?@_[TG'`"_KQ@`LJ\4`+&O
+M$`"PKR6(H``E*,```0`0)`T`,!(ED(``!@`@$@$``CP"``(D#@`B$B40```3
+M```0'`"_CW!D0B0)^$````````L``!`E@$```0`"/+QE0B0)^$````````8`
+M`!"X+U&N`0`"/%1F0B0)^$```````+@O4:XE$``"'`"_CQ@`LH\4`+&/$`"P
+MCP@`X`,@`+TGZ/^])Q``OZ\```(\``!")`GX0``$0`4D`A0"``,`0C`0`+^/
+M"`#@`Q@`O2<``````````.C_O2<4`+^O"``")#8`HA`0`+"O"0"B+`\`0!``
+M`0(D`@`")#,`HA`#`*(L!@!`$`0``B0!``(D%@"B$"40``!````0%`"_CR0`
+MHA`E$```/```$!0`OX\L`*(0`0&B+`8`0!```@(D(``")"0`HA`E$```,P``
+M$!0`OX\F`*(0``0")"<`HA`E$```+0``$!0`OX\```(\``!0)#02@HPC`$!0
+M```"/`(`0I0`0$(P`P!`$````CP<```0``!0)#02@HP"`$*4`(!",!<`0!``
+M``(\%0``$```4"0```(\$@``$```4"0```(\#P``$```4"0```(\#```$```
+M4"0```(\"0``$```4"0```(\!@``$```4"0```(\`P``$```4"0```(\``!0
+M)````CP``$(D"?A``"4H``(E$``"%`"_CQ``L(\(`.`#&`"])^C_O2<0`+^O
+M```"/```0B0)^$``#``%)!``OX\(`.`#&`"])^C_O2<0`+^O)3"@`````CP`
+M`$(D"?A```P`!200`+^/"`#@`Q@`O2?H_[TG$`"_KP```CP``$(D"``%)`GX
+M0``$``8D$`"_CP@`X`,8`+TGZ/^])Q0`OZ\0`+"O)8"``````CP``$(D"``%
+M)`GX0``@``8D```"/```0B0E(``""``%)`0`!B0)^$``)3@``"L0`@`4`+^/
+M$`"PCP@`X`,8`+TGZ/^])Q0`OZ\0`+"O)8"``````CP``$(D"?A``$B`!33?
+M_P8D```#/```8R0E(``"2(`%-`GX8``D,$8````"/```0B0)^$``)2```@``
+M`CP``$(D)2```@GX0``!``4D%`"_CQ``L(\(`.`#&`"])^C_O2<4`+^O$`"P
+MKR6`@`````(\``!")`GX0`!(@`4T```#/```8R0E(``"2(`%-`GX8``@`$8T
+M```"/```0B0)^$``)2```A0`OX\0`+"/"`#@`Q@`O2?@_[TG'`"_KQ@`LJ\4
+M`+&O$`"PKR6(@``E$*``)9#`````$#P``!`F0(`%-`GX``(E,$``)2`@`D2`
+M!30)^``")3!``AP`OX\8`+*/%`"QCQ``L(\(`.`#(`"])^#_O2<8`+^O%`"Q
+MKQ``L*\EB(``)8"@`$```RXA`&`0)1```"```BX0`$`4```"/```0B0)^$``
+M1(`%-.#_`R8!``8D!#!F`"<P!@````,\``!C)"4@(`)$@`4T"?A@`"0P1@`/
+M```0`0`")```0B0E("`""?A``$"`!30!``8D!#`&`B<P!@````,\``!C)"4@
+M(`)`@`4T"?A@`"0P1@`!``(D&`"_CQ0`L8\0`+"/"`#@`R``O2?@_[TG&`"_
+MKQ0`L:\0`+"O)8B``"6`H`!```,N'P!@$"40```@``(N#P!`%````CP``$(D
+M"?A``$2`!33@_P,F`0`&)`0P9@````,\``!C)"4@(`)$@`4T"?A@`"4P1@`.
+M```0`0`")```0B0E("`""?A``$"`!30!``8D!#`&`@```SP``&,D)2`@`D"`
+M!30)^&``)3!&``$``B08`+^/%`"QCQ``L(\(`.`#(`"])^#_O2<<`+^O&`"R
+MKQ0`L:\0`+"O)8B`````$#P``!`F"?@``CR`!30ED$``)2`@`@GX``(,@04T
+M)1A``"``8C`!`$!4``)2-@("`CPD$&(``0!`5``!4C8E$$`"'`"_CQ@`LH\4
+M`+&/$`"PCP@`X`,@`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\ED(``)8B@````
+M`CP``$(D/(`%-`GX0`#_`"8R``(B,@(`0!`E@```(``0)``!(C("`$`0`@("
+M/"6``@(```(\``!1)"4@0`(,@04T"?@@`B4P``(+```2```"/```0B0E($`"
+M"?A``#0`!20E($`"-``%)`GX(`(0`$8T#0``$!P`OX\``$(D)2!``@GX0``T
+M``4D[_\&)````SP``&,D)2!``C0`!20)^&``)#!&`!P`OX\8`+*/%`"QCQ``
+ML(\(`.`#(`"])PL`H*@(`*"X_P_&,`\`IJ@,`*:X(`#G,`8`X!``````#P"B
+MB`P`HI@`($(T#P"BJ`P`HK@7`*"H%`"@N!<`HH@4`**8$P"BJ!``HK@(`.`#
+M`0`")-C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR68@``ED,``0`"QCR6`H``7
+M``.*%``#F@$`8S!S`&`0#P`")!<`XH@4`.*8`0!",`8`0!0```(\``!")`GX
+M0``,``4D:0!2$`\``B03``**$``"FO\/0C```"*F%P`"BA0``IH"%`(`_W]"
+M,`(`(J8$`""B$P`"BA```IH"%0(`_P!",`8`(J(`%@(``Q8"`(#_`R0!`$-0
+M!@`@HA<``HH4``*:``%",`<`0!#_``(D%P`"BA0``IH`_D(P0A("``(``!`'
+M`"*B!P`BHA,``HH0``*:PA,"`!\`0C`(`"*B$P`"BA```IH"%P(`"0`BHA,`
+M`HH0``*:`A,"``$`0C`*`"*B%P`"BA0``IH"`$(P-@!`%"40```7``**%``"
+MF@0`0C`%`$`0``````0`(I(!`$(T+```$`0`(J(7``**%``"FA``0C`6`$`0
+M``````0`(I("`$(T!``BHA<``HH4``*:`/]",`(2`@`%`"*B'#!CC@$`8RP%
+M`$(X*Q`"`"088@`8`&`0```"/```0B0E(&`""?A``"4H(`(3```0)1```!<`
+M`HH4``*:"`!",`4`0!``````!``BD@@`0C0)```0!``BHA<``HH4``*:(`!"
+M,`4`0!`E$```!``BDA``0C0$`"*B)1```"``OX\<`+./&`"RCQ0`L8\0`+"/
+M"`#@`R@`O2<``````````*#_O2=<`+^O6`"^KU0`MZ]0`+:O3`"UKT@`M*]$
+M`+.O0`"RKSP`L:\X`+"O)9"``&0`I:\EN,``;`"GKR680`("`.*6PA$"``$`
+M0S`"`.*6``%",`4`0!`EH```*@1@%`P``R0(```0`@#BE@(`XI;"$0(``0!"
+M.`$`0C`B!$`4#``#)`(`XI:"$0(``0!#,`(`XI8@`$(P!0!`4`(`XI89!&`4
+M#``#)`<``!````(\@A$"``$`0C@!`$(P$@1`%`P``R0```(\``!")"4@0`(E
+M*```"?A```$`!B0/!$`0)2!``@```CP``$(D"?A``"4HX`(EJ$```P2@$@P`
+M`R0&``(D9`"CCPL`8A`'`&(L!@!`$`@``B0"`&(L^@-`$`P``R0%```0;`"E
+MCV0`I(_U`X(4#``#)&P`I8\2`*`0```"/```0B0E($`""?A``$`1!20@`**O
+M```"/```0B0E($`""?A``"4HH`(```(\``!")"4@0`()^$``)2@```,``!#,
+M`42.(`"@K\P!1(X'`(,X`0!C+`L`@C@!`$(L)1AB``T`8!1L`**/"@`#)`D`
+M@Q`)``(D"`""$&P`HH\=`(,4```"/-`!0I8$`$(L&0!`$````CQL`**/%@!`
+M$````CPT$D2.%`"`$```0B0``..6``""E`\`8A````(\`@#CE@(`@I3P`6,P
+M\`%",`D`8A0```(\```"/```0B0E($`""?A``"4HX`*[`T`4`0`")````CP`
+M`$(D)2!``@GX0`!8@`4T`P!`%"0`HJ\!``,D)`"CKP``$#P``!`F)2!``@GX
+M``($@`4T(`(#/"000P`L`**O)2!``@GX``(00`4D_@`#/&``8S0D$$,`*`"B
+MKR4@0`()^``"%$`%)!@`HJ\E($`""?@``AA`!20<`**O```"/```0B0E($`"
+M"?A``&0`I8\```(\``!")`GX0``E($`"```"/```0B0E($`""?A``"4HX`*&
+M`T`0`P`#)`(`XI;P`4,P0`$")"``8A!!`6(H#P!`$,`(`B3```(D*0!B$,$`
+M8B@&`$`0T``")*```B0?`&(0#``#)'8#`!!P`*6/)0!B$`P``R1R`P`0<`"E
+MCQP`8A#!"&(H!@!`$$`)`B10`0(D#0!B$`P``R1I`P`0<`"ECP4`8A!0"0(D
+M!P!B$`P``R1C`P`0<`"ECP$`!"0P`*2O%```$#0`I*\"``4D,`"EKP$``B0/
+M```0-`"BKP,``R0P`*.O`@`$)`H``!`T`*2O!``%)#``I:\"``(D!0``$#0`
+MHJ\%``,D,`"CKP(`!"0T`*2O```"/```0B0E($`"`)@%-`GX0``'``8D)8``
+M`````CP`4%$D```"/```7B0```(\``!6)$`0$``A$%``P!@"`"$8<0!`$`(`
+M,`"ECR$010"`$`(`(1!1`"4@0`(``&6,"?C``P``1HP!`)0F/P"",@0`0%0!
+M`!`F"?C``@$`!"0!`!`F&0`"+NO_0!1`$!``)8```````CQ84E$D```"/```
+M7B0```(\``!6),`0$``A$%$```!%C&P`HH\-`$`0__\$/.!_A#0A&*0`&0!C
+M+`$`8SC__P0\+'^$-"$0I``)`$(L`0!"."088@`-`&!0`0`0)L`0$``A$%$`
+M)2!``@GXP`,$`$:,`0"4)C\`@C($`$!4`0`0)@GXP`(!``0D`0`0)L0``B[A
+M_T`4P!`0`*PL8HXE($`",`"ECS0`IH\)^$``)3B``@(`XI8`P$(P!0!`$```
+M`CP``$(D)2!``@GX0``E*.`"T@%"ED(`0BQ7`$!4T@%"E@```CP``$(D)2!`
+M`BR8!30"``8\"?A```*@QC0``..6M`D")`X`8E22$F.2DA)BDIP28Y8C$$,`
+M9F8#/&=F8S08`$,`$!@``$,8`P##%P(`(QAB```<`P`*```0`R0#`&9F`CQG
+M9D(T&`!B`!`0``!#$`(`PQ\#`",00P``%`(``R0"``(`XI;0`$(PP``#)!$`
+M0Q0```(\DA)FDB,P!@"`,08`P`_&,",8!`"`'`,`_``"/"088@````(\``!"
+M)"4@0`),F04T"?A``"4PPP`'```0```0/```0B0E($`"3)D%-`GX0``E,```
+M```0/```$"8E($`""?@``BBB!33__08D```1/```,28E($`"**(%-`GX(`(D
+M,$8`)2!``@GX``(HH@4T_O\#//\#8S0D$$,`)2!``BBB!30)^"`"``A&-"4@
+M0`)@@`4T"?@@`@\`!B32`4*60P!"+`<`0!0```(\``!")"4@0`)4H@4T"?A`
+M`"4P``````(\``!")"4@0`)XF`4T"?A```X`!B3,`4.."@`$)`D`9!`)``(D
+M"`!B4```XI89`&04```"/-`!0I8$`$(L%0!`$````CP``.*6G@E#.`$`8RRC
+M"4(X`0!"+"488@`!`'`X```"/```0B0E($`""?A``$RB!30&`%`0```"/```
+M0B0E($`"3*(%-`GX0``E,``"```"/```0B0E($`")2B@`@GX0``0`*8G8@)`
+M$`,``R0&``(D9`"CCP@`8E"X+&*.!`)"C@0`0!````(\``!")`GX0``E($`"
+MN"QBCB4@0`(E**`",`"CC___9C`)^$``$`"G)T\"0!`#``,D`@#BED``0C`>
+M`$`0"@`$),P!0XX-`&00"0`")`P`8E`"`.*6!@!D5'`28I;0`4*6!`!"+`8`
+M0%0"`.*6<!)BE@-00BP+`$`4```"/`(`XI:@`$(PH``#)`4`0Q````(\``!"
+M)"4@0`()^$``)2B@`@```CP``$(D)2!``@GX0``E*.`"```"/```0B0E($`"
+M"?A``"4HH`(G`D`0`P`#)&P`I(\&`(`0```"/```0B0E($`"0!$%)`GX0``@
+M`*:/,"QCDC$L8I(`$@(`)1AB`#(L8I(`%`(`)1AB`#,L9I(`-@8````0/```
+M$"8E($`"`(`%-`GX``(E,&8`-"QFDC4L8I(`$@(`)3#"`"P`I8\E,,4`S"]B
+MCB4PP@"```(\)2!``@2`!30)^``")3#"`````CP``$(D)2!``@GX0`!D`*6/
+M/"QCDCTL8I(`$@(`)1AB`#XL8I(`%`(`)1AB`#\L9I(`-@8`)2!``N"`!30)
+M^``")3!F`$`L8I)!+&:2`#(&`"4@0`+D@`4T"?@``B4P1@````(\``!")"4@
+M0`()^$``$$`%)"4@0`(00`4D*`"CCPGX``(E,$,`)2!``A1`!20)^``"&`"F
+MCR4@0`(80`4D"?@``AP`IH\E($`"6(`%-`GX``(D`*:/-BQCDC<L8I(`$@(`
+M)1AB`#@L8I(`%`(`)1AB`#DL9I(`-@8`)2!``@B`!30)^``")3!F`#HL8I([
+M+&:2`#(&`"4@0`(,@`4T"?@``B4P1@`E($`"&(`%-`GX``+4+V:.)2!``H``
+M!20)^``"__\&)````CP``$(D)2!``@GX0``E**`"L0%`$`,``R0```(\``!"
+M)"4@0`(X$D62"?A```$`!B0```(\``!")"4@0`()^$``)2C@`M0!0I;P`$(P
+MT/]")$``0BP9`$`0```"/#021(X``(*,`,`#/"000P`2`$`0```"/`(`D)0`
+M0!`R`0`0+@P`$"8``$(D)2!``@GX0``DF`4T\/\#)"000P`/`!`R```#/```
+M8R0E($`"))@%-`GX8``E,%`````"/```0B0E($`""?A``!29!33_/U`P`@#B
+MEB``0C`)`$`0@!`0`"ZZ`SRCBV,T&0!#`!`0``````````````<``!`"@0(`
+MS,P"/,W,0C09``("$!```,*``@`````````"/```0B0E($`"')@%-`GX0``!
+M``8D-!)"C@(`0I0`0$(P!P!`%$`@$``T$D*.`@!"E`"`0C`(`$`0```"/(`@
+M$`````(\``!")`GX0`!D`(0D!0``$````CP``$(D"?A``&0`!"8```(\``!"
+M)"4@0`()^$``")@%-"6P0`````(\``!")"4@0`((F`4T"?A````X!B0E@```
+M```"/```5"0```(\`P``$```420)^"`"R``$)"40``(4`$(H!P!`$`$`$"8E
+M($`""?B``B2<!300`$(P]?]`%`````````(\``!1)"4@0`((F`4T"?@@`B4P
+MP`(```(\``!0)"4@0`()^``"8)@%-"4@0`)@F`4T"?@@`@,`1C0"`.*6H`!"
+M,*```R06`$,0`@`"),`O8XX4`&)0P"]@KB4@0`()^``"()D%-"4@0`(@F04T
+M"?@@`@#P1C0E($`""?@``B"9!30!``8\)2!``B"9!30)^"`")3!&``$``B0"
+M```0P"]BKL`O8*X```(\``!")`GX0``E($`")8````$`%"0```(\``!1)(`H
+M$``E($`"`!"E)`GX(`($,!0"`0`0)@H``BKY_T`4@"@0`*!&8*[H`4*6"P!`
+M$"6```````(\``!1)"4@0`()^"`")2@``@$`$";H`4*6*A`"`OK_0!0E($`"
+M"``"/&4)0C1$+&*N!@`")&0`HX\$`&(4```0/`@``CQE&4(T1"QBK@``$"8E
+M($`"H``%)`GX``)$+&:.```"/```0B0E($`""?A``*P`!20'``8\)2!``JP`
+M!20)^``")3!&`$P20HX$`$`0```"/```0B0)^$``)2!``@```CP``$(D)2!`
+M`F"8!30!``8D"?A``"4X``````(\``!")"4@0`()^$``9`"ECP```CP``$(D
+M)2!``@GX0``@@`4T?_X&//__QC0```,\``!C)"4@0`(@@`4T"?A@`"0P1@#,
+M`4..!@!B+`D`0!```!`\!0`")!$`8A0```(\T`%"E@@`0BP-`$`4```"/```
+M$#P``!`F)2!``AB!!30!``8\"?@``JH`QC0E($`"'($%-`GX``(0,@8D```"
+M/```0B0E($`""($%-`GX0`!2``8D`@#BE@`!0C`"`$!0CQ)F@HX29H(```(\
+M``!")"4@0`()^$``)2C@`@`6`@`#1@(`X"]BCC\`0S#T+V6&(Q!E``8`I((K
+M$((``0!`5"$8A0`%`**"0!`"`",@2``K$(,`!`!`4.`O8H[T+V*&(1B"`.`O
+M8HX`/T4P`BH%`/0O9H8C$*8`!@"D@BL0@@`!`$!4(2B&``4`HH)`$`(`(R!(
+M`"L0A0`#`$`0XB]FEO0O8H8A*((`/P#&,/0O9X8C$,<`!@"D@BL0@@`!`$!4
+M(3"'``4`HH)`$`(`(R!(`"L0A@`$`$`00`!B+/0O8H8A,((`0`!B+`$`0%`_
+M``,D0`"B+`$`0%`_``4D0`#"+`$`0%`_``8D/P!C,``2!0``/T(P)1AB```T
+M!@`_``(\)##"`````CP``%`D)2!``NB`!30)^``")3!F`-`O9HX#`,`0)2!`
+M`@GX``(@@04T^"]ECO__`B0$`*(0```"/```0B0)^$``)2!``OPO98[__P(D
+M!`"B$````CP``$(D"?A``"4@0`(`,&6.__\")`0`HA````(\``!")`GX0``E
+M($`"^`%&C@4`P!````(\``!")"4@0`()^$``2(`%-&0`I(_<`42N;`"ECRD`
+MH!`!``(D!`"CD@(`8C`$`$!4`@"BEOX`8C`$`**B`@"BE@(`XJ8$`**2!`#B
+MH@4`HI(%`.*B!@"BD@8`XJ('`**2!P#BHC020HXE(```)2@``#``1*PT`$6L
+M```"/```0B0)^$``)2!``C021(XH`(*L+`"#K````CP``$(D)2!``@GX0``!
+M``4D!@``$`$``B1P`*6/``"BC`$`0%0``*.L)1```%P`OX]8`+Z/5`"WCU``
+MMH],`+6/2`"TCT0`LX]``+*//`"QCS@`L(\(`.`#8`"])^#_O2<8`+^O%`"Q
+MKQ``L*\EB(``!`(PC@,``C(/`$`0```"/```0B0)^$``1)D%-/_?`SS__V,T
+M)!!#``$`!C)`-P8````#/```8R0E("`"1)D%-`GX8``E,$8`#``",AL`0!""
+M$`(``0!",`X`0!0```(\``!")"4@(`()^$``T(`%-./_!B0```,\``!C)"4@
+M(`+0@`4T"?A@`"0P1@`,```0&`"_CP``0B0E("`""?A``-"`!30```,\``!C
+M)"4@(`+0@`4T"?A@`!P`1C08`+^/%`"QCQ``L(\(`.`#(`"])^C_O2<0`+^O
+MM"R"C`GX0```````*Q`"`!``OX\(`.`#&`"])\C_O2<T`+^O,`"VKRP`M:\H
+M`+2O)`"SKR``LJ\<`+&O&`"PKR6(@``EJ*```0`4)````CP``$(D"?A``"6P
+M(`(ED$``)8```````CP``%,DZ`$BEBL0`@(&`$`0)2`@`@GX8`(E*``"^?]`
+M4`$`$"8EH```F`"`$B40``````(\``!")"4@(`)\F04T"?A```$`!B0E@```
+M```"/```5"0```(\!```$```4R0)^&`"!0`$)`$`$"9D``(NA@!`4"40```E
+M("`""?B``B"<!33V_T`09``"+@,`0%0```(\?0``$"40`````$(D)2`@`@GX
+M0``E*$`"=P!`$"4@(`(```(\``!")`GX0``4F04T_S]#,`(`0I8@`$(P"0!`
+M$(`0`P`NN@,\HXMC-!D`0P`0$``````````````'```0`B$"`,S,`CS-S$(T
+M&0!B`!`0``#"(`(``````````CP``$(D"?A``&0`A"0```(\``!")"4@(`(E
+M*$`""?A``!``IB=4`$`0)2`@`@```CP``$(D?)D%-`GX0``E,````@!"ED``
+M0C`>`$`0"@`$),P!(XX-`&00"0`")`P`8E`"`**6!@!D5'`2PI;0`2*6!`!"
+M+`8`0%0"`**6<!+"E@-00BP+`$`4```"/`(`HI:@`$(PH``#)`4`0Q````(\
+M``!")"4@(`()^$``)2A``@```CP``$(D)2`@`@GX0``E**`"```"/```0B0E
+M("`""?A``&"8!30```,\``!C)"4@(`)@F`4T"?A@``(`1C0$`$.2`@!B,`0`
+M0%0"`$*6_@!B,`0`0J("`$*6`@"BI@0`0I($`**B!0!"D@4`HJ(&`$*2!@"B
+MH@<`0I('`**B-!(BCB4@```E*```,`!$K#0`1:P```(\``!")`GX0``E("`"
+M-!(DCB@`@JPL`(.L```"/```0B0E("`""?A```$`!20!``(D-`"_CS``MH\L
+M`+6/*`"TCR0`LX\@`+*/'`"QCQ@`L(\(`.`#.`"])^#_O2<8`+^O%`"QKQ``
+ML*\EB(``)8"@`````CP``$(D"?A```2`!33\_P,\__]C-"080P`!``(D,@`"
+M$@(``BH%`$!0!@`")!P``!(8`+^/-0``$!0`L8\%``(2"``")"@``A(8`+^/
+M+P``$!0`L8\!$`8\```0/```$"8E("`"!(`%-`GX``(E,&8````"/```0B0E
+M("`""?A``!0`!23?_P8D)2`@`A0`!20)^``")#!&`!L``!`8`+^/`A`&/```
+M$#P``!`F)2`@`@2`!30)^``")3!F`````CP``$(D)2`@`@GX0``4``4D)2`@
+M`A0`!20)^``"(`!&-`D``!`8`+^/`!`&/````CP``$(D)2`@`@2`!30)^$``
+M)3!F`!@`OX\4`+&/$`"PCP@`X`,@`+TGZ/^])Q``OZ\"``(\4(Y")`GX0``"
+M``4D$`"_CP@`X`,8`+TGZ/^])Q0`OZ\0`+"O)8"``````CP``$(D)2@```GX
+M0``!``8D!0!`$"4@``("``(\4(Y")`GX0``3``4D%`"_CQ``L(\(`.`#&`"]
+M)]#_O2<H`+^O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O):"``"60H``"``(\
+M4(Y")`GX0``3``4DJP!`$"4@@`(```(\``!")"4H```)^$```0`&)*0`0!`E
+M((`"`@`"/%".0B0)^$``)2@``)\`0!`H`+^/FP!`$@H`!"3,`8.."0!D$`D`
+M`B0(`&)0`@!#E@\`9%34`8*6T`&"E@0`0BP+`$!0U`&"E@(`0Y8@`&(P!0!`
+M%`@`%230`&,PP``")#<`8A0$`!`D-0``$.L`$"3P`$(PT/]")$``0BP)`$!4
+M`@!#ELP!@HX'`$,X`0!C+`L`0C@!`$(L)1AB`!4`8!`"`$.6(`!B,`4`0!0(
+M`!4DT`!C,,```B0#`&)4`@!"EA\``!#K`!`D`$!",!P`0!3J`1`D`@!"E@"`
+M0C`!`%`L(X`0``#^`B0D@`("%```$.H"$"8@`&(P!0!`%"6H``#0`&,PP``"
+M)`,`8E0"`$*6"P``$*L`$"0`0$(P"`!`%*H!$"0"`$*6`(!",`$`4"PC@!``
+M`/X")"2``@*J`A`F`@!#ED``8C`,`$`0(`!B,`L`0%0$`+4VT`!C,,```B0#
+M`&)4`@!"E@4``!`$`+4V0`!",`,`0%0"`$*6`0"U-@(`0I8``4(P`0!`4`(`
+MM38"`$*6$`!",`$`42PCB!$`_?\")"2((@(#`#$F```"/```0B0E((`""?A`
+M`'R8!30EF$```@!#EB``8C`%`$`4```"/-``8S#```(D%0!B%````CP``%(D
+M)2"``@28!30)^$`")3`@`B4@@`(`H@4T"?A``B4PH`(>`'`2)2"``GR8!30)
+M^$`")3```@```CP``$(D"?A``"P!!"06```0`0`")`D`<!(``$(D)2"``GR8
+M!30)^$``)3```@```CP``$(D"?A``"P!!"0``!`\```0)B4@@`($F`4T"?@`
+M`B4P(`(E((`"`*(%-`GX``(E,*`"`0`")"@`OX\D`+6/(`"TCQP`LX\8`+*/
+M%`"QCQ``L(\(`.`#,`"])\C_O2<T`+^O,`"^KRP`MZ\H`+:O)`"UKR``M*\<
+M`+.O&`"RKQ0`L:\0`+"O):"``#P`I:\EB,``);B``@```CP``$(D"?A`````
+M(*XEJ$``YP"@$C0`OX_`+^..`@!B.`$`0BP!`&,L)1!#``(`0!`!``(D```B
+MKL`O\(X!``(D>0`"%CP`HX\```(\``!")"4@@`()^$``()D%-`$``SPD$$,`
+M<`!`%#P`HX_`+^"N```PKB60``````(\``!1)````CP``%XD)2"``@GX(`(0
+MG`4T)9A``"4@@`()^"`"%)P%-"6`0``E((`""?@@`AB<!30EL$``*Q`3`"L8
+M$``D$$,`#@!`%`(B$P`E((`""?@@`B"9!30E((`"()D%-`$``SP)^,`#)3!#
+M``$`4B8*`$(JY?]`%"4@@`("(A,``A(0`"$@@@#"*1``*Q@$``(`HB@!`$(X
+M)!AB`&(`8!`C$!8``!8"``.6`@`:`$0"$A````$`@%`-``<`)9!``.#_0BH#
+M`$`0(`!"*@,``!#@_Q(D`0!`4!\`$B0;`&4"$A````$`H%`-``<`@/]3)/#_
+M8BH#`$`0$`!B*@,``!#P_Q,D`0!`4`\`$R0``!$\```Q)B4@@`()^"`"()D%
+M-!_X`R0D$$,`0#$2`.`'QC```!`\```0)B4@@`(@F04T"?@``B4P1@`E((`"
+M"?@@`B"9!33@_P,D)!!#`!\`9C(E((`"()D%-`GX``(E,$8`)2"``@GX(`(@
+MF04T)2"``B"9!30)^``"``A&-`(``B3`+^*N`0`")!``HJX4`+*B(0``$!4`
+MLZ("`&*4H`!",*```R0<`$,0`@`"),`OXXX:`&(4```"/!``HHX7`$!4```"
+M/```$#P``!`F)2"``@GX``(@F04T```1/```,28E((`"()D%-`GX(`(`\$8T
+M)2"``@GX``(@F04T`0`&/"4@@`(@F04T"?@@`B4P1@`!``(DP"_BK@```CP`
+M`$(D)2"``@GX0``E**`"`@"BE@(`0C`R`$`4/`"CCP```CP``$(D)2"``@GX
+M0`!@F`4T```#/```8R0E((`"8)@%-`GX8``"`$8T/`"BCP(`190``:(P"P!`
+M5,P!A([4`8*6\`!",-#_0B1``$(L(P!`$`$``B1``*(P(`!`$`$``B3,`82.
+M!P"#."L8`P`+`((X*Q`"`"088@`7`&`0"@`#)!4`@Q`)``(D%`""$`$``B0&
+M`(,4`@`"/-`!@I8$`$(L#@!`%`$``B0"``(\*+A")`GX0``E((`""```$`$`
+M`B0"`&*4`@!"-`(`8J0"`**6_?]",`(`HJ8!``(D-`"_CS``OH\L`+>/*`"V
+MCR0`M8\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,X`+TGX/^])QP`OZ\8`+*O
+M%`"QKQ``L*\EB(``)8"@``(``!8ED``"__\2),P!(XX)``(D!P!B$`H``B0(
+M`&(4```"/-`!(I8$`$(L!`!`$````CSO_P(D)(`"`@```CP``$(D)2`@`@GX
+M0``,``4D```"/```0B0E("`"`$`%)`GX0``E,``"```"/```0B0)^$``#P`$
+M)`,`$#(```(\``!")"4@(`(`0`4D`P!&,@GX0``E.``")9!```$``C(4`$`4
+M)1!``@```CP``$(D)2`@`A0`!20)^$``)3```````CP``$(D)2`@`B4H```)
+M^$```0`&)`4`0!````(\``!")"4@(`()^$``P``%)"400`(<`+^/&`"RCQ0`
+ML8\0`+"/"`#@`R``O2?H_[TG$`"_KP```CP``$(D"?A``&28!33"%`(`_P%#
+M,``!8C`"`$`0_P%B."<8`@`E$&``$`"_CP@`X`,8`+TG`@"BE.`!0S#```(D
+M$0!B4-`2@I3!`&(H!@!`$$`!`B2@``(D"0!B4,X2@I0(`.`#)1`````````(
+M`&(4`````,P2@I0'```0``#"I`4``!```,*D`P``$```PJ0(`.`#)1````$`
+M`B0(`.`#`````-C_O2<D`+^O(`"RKQP`L:\8`+"O)9"``"6(H`````(\``!"
+M)`GX0`!@F`4T`@!",!@`0!0E@``````"/```0B0)^$``)2!``B6`0``"``(\
+MN(]")"4@0`(E*"`""?A``!``IB<)`$`0$`"BARH04``(`$!0%@`PI@(`(I8"
+M`$(T`@`BI@(``!`E@```)8```!8`,*8E$``")`"_CR``LH\<`+&/&`"PCP@`
+MX`,H`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0`+"O)8B``.`!(HX$`$(P+`!`
+M$"68(`(``!`\```0)B`$!20)^``"`0`&)"4@(`(`!@4D"?@``B4P``````(\
+M``!")"4@(`()^$````8%)"4@(`(`!@4D"?@``@@`1C0E("`"!`8%)!``!CP)
+M^``"`0+&-"4@(`(@!@4D"?@``B4P```E@``````"/```4B0E("`"``0%)`GX
+M0`(E,``"(1`3`B4@(`($!`4D"?A``C@O1I`!`!`F@``"*O7_0!0E("`"(`"_
+MCQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])^C_O2<0`+^O)6B``"4@``#__\HD
+MPE`*`/__QB0'`,8P)4B@`!P`H!@E6````0`,),`X!P`A0,D`"0`"+0$`0%`(
+M``@D!!`,`?__0B0$&,P`__]C)"800P`$$.(`@!@*`"$8;0```&.,)!!#``80
+MX@`&$,(`!!!B`24@@@`C$`8!(5AB`2$0)@'X_TDD)3```.C_(!T!`$HE```"
+M/```0B0)^$```````!``OX\(`.`#&`"])]C_O2<D`+^O(`"TKQP`LZ\8`+*O
+M%`"QKQ``L*\EF(``)8"@``(`PI3@`4,PP``")`\`8A`EH&`"P0!B*`8`0!!`
+M`0(DH``")`<`8A`E$```6@``$"0`OX]7`&(4)1````0``!`E&````@``$`$`
+M`R0"``,D0!@#``0`A"8A$&0`YA)2E.P20I2`$0(`)9!"`B$09`#R$D*4`!,"
+M`"600@(A$&0`^!)"E(`4`@`ED$("(1!D`/X20I0`%@(`)9!"`B$09``$$U&4
+M"A-"E(`1`@`EB"("(1!D`!`30I0`$P(`)8@B`B$09``6$T*4@!0"`"6((@(A
+M&&0`'!-BE``6`@`EB"("`0`")`8``E(EB$`"!```$@(``B0G``(6)1```"60
+M(`(.`#(6```"/```0B0E(&`""?A```BB!33_WP8D```#/```8R0E(&`""*(%
+M-`GX8``D,$8`#```$+POD*X``$(D)2!@`@GX0``(H@4T```#/```8R0E(&`"
+M"*(%-`GX8```($8TO"^0K@``$#P``!`F)2!@`F"9!30)^``")3!``B4@8`)D
+MF04T"?@``B4P(`(!``(D)`"_CR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`
+MO2?,`8.,"@`&)!D`9E`H``,D"0`")!8`8E`H``,D!@!F5,P!@HS0`8*4!`!"
+M+!``0!0H``,DS`&"C`<`0S@!`&,L"P!".`$`0BPE&&(`"`!@%"@``R34`8*4
+M\`!",-#_0B1``$(L`@!`$"```R0H``,D``"BE!L`0P`0$````0!@4`T`!P`K
+M&`(`]O]")`T`0BP!`$(X"`#@`R008@#`_[TG/`"_KS@`OJ\T`+>O,`"VKRP`
+MM:\H`+2O)`"SKR``LJ\<`+&O&`"PKR6@@`!$`*6O`@"BE,(1`@`!`$(P$`"B
+MKP(`HI3P`4,P0`$")!\`8A`EJ(`"00%B*`\`0!#`"`(DP``")$4`8A#!`&(H
+M!@!`$-```B2@``(D/@!B$"40``!I`0`0/`"_CSP`8A`E$```90$`$#P`OX\X
+M`&(0P0AB*`8`0!!`"0(D4`$")`<`8A`E$```7`$`$#P`OX\#`&(04`D")%<!
+M8A0E$```U`&"EO``0C#0_T(D0`!"+"@`0!0E\```S`&$C@<`@S@K&`,`"P""
+M."L0`@`D&&(`(`!@$`H``R0>`(,0"0`")!T`@A````(\!@"#%```0B30`8*6
+M!`!"+!<`0!0```(\``!")"4@@`()^$``1)D%-,?_`R0D$$,`+"RCC@``9H3`
+M,`8`.`#&,````SP``&,D)2"``D29!30)^&``)3!&``4``!````(\`@``$`$`
+M'B0"`!XD```"/```0B0E((`""?A``!"9!30&_`,D)!!#`$"('@`$`+(F(1@R
+M`N`28Y0`&0,`)1!#````$#P``!`F)2"``A"9!30)^``"`0!&-````CP``$(D
+M)2"``KPOI8X)^$``1`"FCR&(,@+($B:6_P'&,"4@@`)HF04T"?@``@`"QC1P
+M$J*6`%!"+!D`0!1`$!X`1`"CCP(`8I00`$(P$P!`$!``HH]`(`(`0!.")"$0
+M0@(``%"4$`"CCT@38B0A&$("``!S@"$0H@(&`%:`2!.")"$0H@(``%>44!.$
+M)"$@I`(``(24$P``$!0`I*]`$!X``@"D)B$01`"@$E"4(1#5`\824X`0`*./
+MR!)B)"$0H@(!`%:`0!@#`*@28B0A$*("``!7E#`38R0A((,```"$E!0`I*\`
+M`!(\``!2)B4@@`()^$`"1)@%-'_``R0D$$,`P#$0`(`_QC```!$\```Q)B4@
+M@`)$F`4T"?@@`B4P1@`E((`""?A``E"8!30`_P,D)!!#`/\`9C(E((`"4)@%
+M-`GX(`(E,$8`)2"``@GX0`)0F`4T__\3//\`<S8D$%,``#(6``#_QC`E((`"
+M4)@%-`GX(`(E,$8`)2"``@GX0`)(F`4T_/\#//\/8S0D$$,``#,7``,``SP`
+M\&,T)###`"4@@`)(F`4T"?@@`B4P1@!`@!X`(1`5`KH20I0`-@(``!0"`"4P
+MP@`A$!4"P!)#E``2`P`E,,(`)2"``C28!30)^"`")3##`"4@@`()^$`"*)@%
+M-"004P`A&!4"KA)FE``R!@`E((`"*)@%-`GX(`(E,$8`)2"``@GX0`)DF`4T
+M^/\#//\/8S0D$$,`(8`5`K02!I8`,P8`!P`#/`#P8S0D,,,`)2"``F28!30)
+M^"`")3!&`'`2HI8#,$(L#`!`$`(`$"3*`8.6(A`")!,`8A0```(\1`"CCP(`
+M8I1``$(P#0!`5`@`$"0,```0```"/````CP``$(D)2"``@GX0`!$`*6/!`!`
+M$$`0'@`A$%4`)A-"E"&``@(```(\``!")"4@@`()^$``))D%-`'_`R0D$$,`
+M0#`0`/X`QC````,\``!C)"4@@`(DF04T"?A@`"4P1@!$`*./$`!BC`0`0!`0
+M`**/%`!P@`@``!`5`'*`0!@"`+`38B0A$*("!@!0E+@38R0A&*,"`@!RE```
+M$3P``#$F)2"``@GX(`(@F04T'_@#)"000P!`,1``X`?&,```$#P``!`F)2"`
+M`B"9!30)^``")3!&`"4@@`()^"`"()D%-.#_`R0D$$,`'P!&,B4@@`(@F04T
+M"?@``B4P1@`E((`""?@@`B"9!30E((`"()D%-`GX``(`"$8T<!*DE@%`@BP=
+M`$!4<!*BED0`HX\"`&*4T`!",-```R0%`$,4```"/`!0@BP4`$!4<!*BE@``
+M`CP``$(D)2"``@GX0``,H@4T`_\#//__8S0D$$,`%`"CCX`T`P#\``,\)###
+M`````SP``&,D)2"``@RB!30)^&``)3!&`'`2HI8!4$(L"`!`%`$``B0```(\
+M``!")"4@@`+@F04T"?A``"4P```!``(D/`"_CS@`OH\T`+>/,`"VCRP`M8\H
+M`+2/)`"SCR``LH\<`+&/&`"PCP@`X`-``+TGF/^])V0`OZ]@`+ZO7`"WKU@`
+MMJ]4`+6O4`"TKTP`LZ](`+*O1`"QKT``L*\EH(``)?"@`!``H*\4`*"O&`"@
+MKQP`H*\@`*"O)`"@KS@`H*\EN```/`"@KP$``R0H`*.G`@`")"H`HJ<L`**G
+M+@"CIS``HZ<R`**G-`"CIP(`PI?"$0(``0!3,`<`8!(``,.7@!`#`"$00P!`
+M$`(`**9")`@``!#__T(P@!`#`"$00P!`$`(`__\#/)A`8S0A$$,`__]","60
+M0``X`,*7'P!`%"6(0```@!$T`@#"EQ``0C`"`$`05P`#)*X``R0E@```([!#
+M`@(``!`AJ$,"__]0,`4``BX1`$!0.`#1I\0!@HXE((`")2@``@GX0``E,&`"
+M`(`#-`@`0Q#_/T,P*A!V`/+_0!0!``(F*A"C`N__0!0!``(F)8A@`#@`T:<`
+M@`(T80`B5@(`PI<```(\``!2)"4@@`()^$`"()D%-`!``SPD$$,`<0%`$"4@
+M@`()^$`"#)D%-/\`!CS__\8T```0/```$"8E((`"#)D%-`GX``(D,$8`)2"`
+M`@GX0`(@F04T_X\&//__QC0E((`"#)D%-`GX``(D,$8`)2"``J"9!30)^``"
+M)3```"4@@`*`F04T"?@``B4P```E((`""?A``H29!33P_Q$\)2"``H29!30)
+M^``")#!1`"4@@`*8F04T"?@``B4P```E((`""?A``IR9!30E((`"G)D%-`GX
+M``(D,%$`)2"``@"9!30)^``")3```"4@@`($F04T"?@``B4P```E((`"")D%
+M-`GX``(E,```)2"``@GX0`(,F04T`,`1)"4@@`(,F04T"?@``B0P40`E((`"
+MB)D%-`GX``(E,```)2"``HR9!30)^``")3```"4@@`*0F04T"?@``B4P```E
+M((`""?A``I29!30E((`"E)D%-`GX``(D,%$`&P$`$&0`OX_P`44PT``")#``
+MHA`C(#("T0"B*`8`0!!``0(DP``")!8`HA!`$00`-@``$",01``%`*(04`$"
+M)"0`HA!`$00`,```$",01`!`O`0`ZU$"/!^%0C08`.("$!```,,0`@##'Q<`
+M([A#`(,2%P`\`**O-0P#)"$``!`X`*.O`"H$`$\)`CR5($(T&`"B`!`0``!#
+M$`(`PQ\%`",00P`\`**O0+P$`.M1`CP?A4(T&`#B`A`0``##$`(`PQ\7`".X
+M0P`U#`(D#0``$#@`HJ\`O`0`ZU$"/!^%0C08`.("$!```,,0`@##'Q<`([A#
+M`(,2%P`\`**O:A@#)#@`HZ]`$00`(Q!$`(`0`@`A$$0`P!D"`#@`I(\:`&0`
+M$A````$`@%`-``<`)1A```\`8C`$``@D`P!`%"@`I2<#``@D,`"E)UH``!$E
+M@````S$#`!T`R2@!``<DPP`@$2$0T``9`$0D(0""+!$`0!#?_X,D&@""*`8`
+M0!`;`((H!!"'`!``HX\E$$,`$```$!``HJ\/`$`4`0"")/__@B0$$$<`$`"C
+MCR400P`(```0$`"BKQ0`8BP&`$`0`0"")`009P`4`*./)1!#`!0`HJ\!`((D
+M$`!"+`L`0!#Q_X(D0!`0`"$010```$.40!`$``(`0B0$&$,`&`"BCR488@`G
+M```0&`"CKQ``0BP+`$`0X?^")$`0$``A$$4```!#E$`0!`#B_T(D!!A#`!P`
+MHH\E&&(`&@``$!P`HZ\0`$(L"P!`$-'_@B1`$!``(1!%````0Y1`$`0`PO]"
+M)`080P`@`**/)1AB``T``!`@`*.O!P!"+`L`0!`!``(F0!`0`"$010```$.4
+M0!`$`*+_0B0$&$,`)`"BCR488@`D`*.O`0`")O__4#`J$`@"J_]`%```````
+M`!$\```Q)B4@@`()^"`"#)D%-/\``SS__V,T)!!#``#_!CP``!`\```0)B4@
+M@`(,F04T"?@``B4P1@`E((`""?@@`B"9!30`<`8\)2"``B"9!30)^``")3!&
+M`#P`I8\`-04`\#\"/"0PP@`/`!(\__]2-B00\@(E,,(``$`"/"4@@`*@F04T
+M"?@``B4PP@`E((`"@)D%-`GX``(0`*:/)2"``@GX(`*$F04T\/\3/"004P`4
+M`*:/)##2`"4@@`*$F04T"?@``B4P1@`E((`"F)D%-`GX``(0`*:/)2"``@GX
+M(`*<F04T)!!3`!0`IH\D,-(`)2"``IR9!30)^``")3!&`"4@@`(`F04T"?@`
+M`A@`IH\E((`"!)D%-`GX``(<`*:/)2"``@B9!30)^``"(`"FCR4@@`()^"`"
+M#)D%-`#`$B0D$%(`)`"FC_\_QC`E((`"#)D%-`GX``(E,$8`)2"``HB9!30)
+M^``"&`"FCR4@@`*,F04T"?@``AP`IH\E((`"D)D%-`GX``(@`*:/)2"``@GX
+M(`*4F04T)!!2`"0`IH__/\8P)2"``I29!30)^``")3!&`&0`OX]@`+Z/7`"W
+MCU@`MH]4`+6/4`"TCTP`LX](`+*/1`"QCT``L(\(`.`#:`"])]C_O2<D`+^O
+M(`"TKQP`LZ\8`+*O%`"QKQ``L*\EH(```@"BE!``0C`"`$`0`&0#/`#(`SP"
+M`**4`$!",`,`0%`"`**4!```$$(8`P``@$(P`0!`5((8`P```**4&P!B`!(8
+M```!`$!0#0`'``<`8`0?`!,D__]S)@0`8!(&$&,"`0!",/S_0%#__W,F)@`"
+M)".84P`7``(D(Q!3``$`$"0$@%``(8!P`!@``B0C$%,`!H!0`/#_<R8``!$\
+M```Q)B4@@`()^"`"%)@%-`$``SS__V,T)!!#`$"$$````!(\``!2)B4@@`(4
+MF`4T"?A``B4P4``E((`""?@@`A28!33^_P,\_Q]C-"000P!`FQ,``0`#/`#@
+M8S0DF&,")2"``A28!30)^$`")3!3`"0`OX\@`+2/'`"SCQ@`LH\4`+&/$`"P
+MCP@`X`,H`+TGX/^])Q@`OZ]``*(L`@!`%"48@``_``4D_`%EI````CP``$(D
+M)2!@`#0298P)^$``$`"F)Q@`OX\(`.`#(`"])\#_O2<\`+^O.`"TKS0`LZ\P
+M`+*O+`"QKR@`L*\ED(``)9B@`"6@P``EB$`"```0/```$"9X1D2."?@``GQ&
+M18Z`1D0F"?@``B``!23\`4*&0`!"*`(`0!3\`4.6/P`#)``4`P`#/`(`/P#C
+M*`$`8SC__^(P`0!"+"488@`'`&`0```#/'A88R0``D*.0!`"`"$00P`"```0
+M``!&A"4P```!``(D$`"BKR``HB<4`**O(@"B)Q@`HJ\"``(\,*A")"4@0`()
+M^$``)2A@`K\`0!`E($`"$`"TK[PL(HX@`*4G(@"F)PGX0``E.&`"N`!`$#P`
+MOX_,`42.!P"#."L8`P`+`((X*Q`"`"088@`.`&`0"@`#)`P`@Q`)``(D"P""
+M$"6````&`(-4GD8BEM`!0I8$`$(L!@!`%#\`!22>1B*6!`!"))Y&(J8E@```
+M/P`%)$`0$`"`1D(D(2`B`@``@I3T+R.6(1!#````@J3__T(P0`!"+`$`0%``
+M`(6D`0`0)A```B[S_T`40!`0`)X2(I8"`$(L/@!`4(9&)I;2`4*60@!"+",`
+M0%`E@````@!BEM``0C#```,D'@!#5"6``````&.6M`D")`T`8E22$B.2DA(B
+MDIP2(Y8C$$,`9F8#/&=F8S08`$,`$!@``$,8`P##%P(`(QAB``D``!#__V4P
+M9F8"/&=F0C08`&(`$!```$,0`@##'P,`(Q!#`/__13`"``(\_*]")`GX0``E
+M($`")8```("A%#0```(\``!3)(`H$`!X1B..(1BC``(`8I0`$@(`_P!"-``4
+M`@```&:4`#(&`/\`QC3__\8P)2!``B$HM``)^&`")3!&``$`$"8@``(J[_]`
+M%(`H$`"&1B:6/P#&,``V!@"$1B*6/P!",``4`@`E,,(`@D8BEC\`0C``$@(`
+M)3#"`(!&(I8_`$(P```0/```$"8E($`"-)D%-`GX``(E,,(`CD8FEC\`QC``
+M-@8`C$8BEC\`0C``%`(`)3#"`(I&(I8_`$(P`!("`"4PP@"(1B*6/P!","4@
+M0`(XF04T"?@``B4PP@"41B:6/P#&,``V!@"21B*6/P!",``4`@`E,,(`GD8B
+MEC\`0C``$@(`)3#"`)!&(I8_`$(P)2!``C2B!30)^``")3#"`)Q&)I8_`,8P
+M`#8&`)I&(I8_`$(P`!0"`"4PP@"81B*6/P!",``2`@`E,,(`ED8BEC\`0C`E
+M($`".*(%-`GX``(E,,(`W"\FC@$`QBPC,`8`P/\")"0PP@`E($`"/)D%-`GX
+M``)_`,8D`0`")#P`OX\X`+2/-`"SCS``LH\L`+&/*`"PCP@`X`-``+TGD/^]
+M)VP`OZ]H`+ZO9`"WKV``MJ]<`+6O6`"TKU0`LZ]0`+*O3`"QKT@`L*]P`*2O
+M):"@```T!@`#-`8`.`"FKP`\!P`#/`<`/`"GKR6(@`"`1C,F/P`>)`4`@H)`
+M$`(`__]",$``HJ_!_P(DB`"CCP``8J2$`**/``!>I````CP``$(D"?A``#\`
+M%23_`%(P)8```'``HX]T$V*4)0!`$$0`H*\&`#<F^`!6,D`0$`!P$T(D(1#B
+M`@``0Y08`&`0__]$,@<`9!"`*1````!"E`<`0C#@`$(T$@""5`$`$":`*1``
+M(2@E`@``A)8"``,\H+%C)`GX8`#4%Z4DX``$)`P`Q%8EJ$``)1A``/__8C`K
+M$*("`0!`5"48H`+__W4P`0`0)G03(I8J$`("X/]`%$`0$``"`(*6T`!",,``
+M`R0L`$-4)?"@`O@`0C(!`%(T=!,BEB<`0!`E@```!@`W)O@`5C)`$!``<!-"
+M)"$0X@(``$.4&`!@$/__1#('`&00@"D0````0I0'`$(PX`!"-!(`@E0!`!`F
+M@"D0`"$H)0(``(26`@`#/*"Q8R0)^&``U!>E).``!"0.`,16)?!``"480`#_
+M_V(P*Q#"`P$`0%0E&,`#__]^,`$`$"9T$R*6*A`"`N#_0%1`$!```@``$`(`
+M@I8"`(*6``%",`(`0%"/$B:"CA(F@@```CP``$(D<`"DCPGX0``E*(`"`!8"
+M``.&`@`"`(.60`!B,)@`0!"``&(P"P!`$!@`HB><%R>6$`"BKP(``CQ\LT(D
+M<`"DCR4H@`()^$``GA<F)@H``!!``**/2A<GEA``HJ\"``(\?+-")'``I(\E
+M*(`""?A``$P7)B9``**/(QA0`"H0HP(!`$!4)1B@`@`4`P`#-`(``@""EA``
+M0C`:`$`0'@"CEW`2(I8!,$(L"`!`5'`2(I9^$B.6*A##``$`0%0E&,```!0#
+M``,T`@!P$B*6`$!"+`P`0!0>`*.7`@""EH``0C`)`$`0*A##`(`2(Y8J$,,`
+M`0!`5"48P```%`,``S0"`!X`HY<J$,,``0!`5"48P```%`,``Q0"`$0`HJ\X
+M`*./0!`#`$0`I(\C$((``!0"``,T`@`G$`8`PQ<"`"0PP@`\`**/)1A``"H0
+MP@`!`$!4)1C````4`P"``*.//`!@$`,T`@`(`&:F!@!FI@0`9J8"`&:F``!F
+MIAP`I)?__X,P___","L00P`"`$`0)2C``"4@P``*`&2F&@"DE___@S```&*6
+M*Q!#``$`0%0``&26#`!DIA@`I)?__X,P``!BEBL00P`!`$!4``!DE@X`9*8`
+M%`0``QP"`'`2(I8`0$(L%@!`5```8I8"`(*6@`!",`<`0!`E(,``A!(BEBH0
+MP@`(`$!0`@""E@H``!`E$,``@A(BEBH0@@`&`$`4)1#```(`@I:``$(P`@!`
+M4((2(I:$$B*6`@``$!X`8J8>`&*FB`"DCP``@H0(```0\"\BKA@`HY<J$,,`
+M`@!`$"4HP``E&,```!0#``,<`@"$`**/``!#I(@`HX\``&6D`@"#EB``8C`&
+M`$!4O!<GEM``8S#```(D70!B%(``HH^\%R>6*`"B)Q``HJ\"``(\?+-")'``
+MI(\E*(`""?A``+X7)B9``*2/(QB0`"H0PP,!`$!4)1C``P`4`P`#-`(`+@"C
+MERH0PP`!`$!4)1C``"X`HY<J$,,``0!`5"48P``X`*2/0!`$`",08@``%`(`
+M`S0"`"<0!@##%P(`)##"`#P`HH\E&$``*A#"``$`0%0E&,```!0#`(``HX\=
+M`&`0`S0"`"X`HY<J$,,``0!`5"48P``0`&.F+`"CERH0PP`!`$!4)1C``!(`
+M8Z8`%`,``RP"`!0`8Z8J`*.7*A##``$`0%0E&,``%@!CIA@`8Z8H`*.7*A##
+M``$`0%0E&,``&@!CI@`4`P`#)`(`#0``$!P`8Z8L`*.7*A##``$`0%0E&,``
+M`!0#``,L`@`H`*.7*A##``$`0%0E&,```!0#``,D`@"$`*./``!BA"H0@@`!
+M`$!4``!DI(@`I(\``(*$*A!%``$`0%0``(6D@`"BCP8`0!"(`*./``!BA,@O
+M(J[(+R*6<`"DC_X!@J0!``(D;`"_CV@`OH]D`+>/8`"VCUP`M8]8`+2/5`"S
+MCU``LH],`+&/2`"PCP@`X`-P`+TGL/^])TP`OZ](`+ZO1`"WKT``MJ\\`+6O
+M.`"TKS0`LZ\P`+*O+`"QKR@`L*\EH(``5`"EK\`L@HX)^$``);C``#P`0!!,
+M`+^/_`&"AD``0B@"`$`4_`&#EC\``R0`%`,``YP"`#\`8RH!`&,X__]B,@$`
+M0BPE&&(`!P!@$````SR$6&,D``*"CD`0`@`A$$,``@``$```4H0ED```(P#@
+M$B6(```@`+8G(@"U)P(``CPPJ%XDP!`1`%0`HX\A@&(`$`"@KQ0`MJ\8`+6O
+M)2"``B4H``(E,$`""?C``R4X8`(4`$`03`"_CR(`HH<&``."*A!#``0`0!`@
+M`**'(@"BDP8``J(@`**'!P`#@BH00P`#`$`0`0`Q)B``HI,'``*B*Q`W`N3_
+M0!3`$!$``0`")$P`OX](`+Z/1`"WCT``MH\\`+6/.`"TCS0`LX\P`+*/+`"Q
+MCR@`L(\(`.`#4`"])\#_O2<\`+^O.`"RKS0`L:\P`+"O)9"@`"6`@`":$A&&
+M```"/```0B00`*0G@$8%)@GX0``@``8D"``))!``JB<(``TD/P`.)$`8"0`A
+M&$,!``!BE",040```&*D)3@``"58``!`8`D`)3!@````PH0!`$($``#`I`,`
+M[10A*$P!&```$`\`!R0``*B4``"DA$`0!P`A$%``@$9#E`$`XB00`(,4__]'
+M,`0`@!0S`&(M`0`")0@``!```**D!`!`%```PI0!`$(D`P``$```PJ3__T(D
+M``#"I"4X```!`&(E__]+,!``XBSA_T!4``#"A$`0"0`A&$(!``!BA$``0B@!
+M`$!0``!NI$`@"0`A$)``@$9#E",8<@`G$`,`PQ<"`"088@`A($0!``"$A'A&
+M`HY`(`0`(2""`$`8`P`A&&(```!BE```@J0!`"(E__]),`\`(BV]_T`40!@)
+M``@`"200`*0G0!`)`"$84``A$((```!"E(!&8J0!`"(E__]),`\`(BWX_T!4
+M0!`)`#P`OX\X`+*/-`"QCS``L(\(`.`#0`"])\#_O2<\`+^O.`"RKS0`L:\P
+M`+"O)8B@`/__DC```"*6$0!`$"4P```8`*0G0!@&`"$8@P#`$`8`(1!1````
+M0I0``&*D`0#&)`@`PB@'`$`0)8#``,`0!@`A$%$```!"E//_0!1`&`8`)8#`
+M`"H`HB<0`**O```"/```0B0E($`"&`"E)___QC`)^$``*`"G)P\``!HE,```
+M*`"CEQ@`HI<-`&(0*@"BEQ@`I"<!`,8D*A#0``<`0%`H`*.70!`&`"$0@@``
+M`$*4^?]B5`$`QB0H`*.7*@"BEP,`8A3`$`8`!P!R4"$040`A$%$`!`!"C`0`
+M0!`_``,DP!`&`"$040`"`$.4)1!@`#P`OX\X`+*/-`"QCS``L(\(`.`#0`"]
+M)___A##__Z4P___&,/__YS`0`*B7&`#H`!(8```E`&`0)1```"(`Q5`E&.``
+M(Q"%`$`8`@`A&&(`P!@#`"$88@"`&`,`(Q#%`!H`8@`2&````0!`4`T`!P``
+M'`,``R0#`!,`@`0E&.``90""*!``0!`E&``!&`"(`!(8``!D``(D(Q!$`!@`
+M1P`2$```(1AB`.M1`CP?A4(T&`!B`!`0``!#$0(`PQ\#`",00P#__T,P)1!@
+M``@`X`,`````N/^])T0`OZ]``+2O/`"SKS@`LJ\T`+&O,`"PKR68H``ED,``
+M6`"TC___\#`.```2)2```!@`I2=`&`0`(1BC`(`0!``A$$0`0!`"`"$04@`(
+M`$*4``!BI`$`A"0J$)``]O]`%$`8!````&26*@"B)Q``HJ\```(\``!")!@`
+MI2<E,``""?A``"@`IR<E0```)3@``"4@```8`*,G*`"FERH`I9<J$)``#0!`
+M4```9)9`$`0`(1!B````0I0!`,)0__^',$`0!``A$&(```!"E/3_HE0!`(0D
+M__^(,```9)8H`*67*@"FEX"(!P`AB"<"0(@1`"&(,@(&`">6@(`(`"&`"`)`
+M@!``(8`2`@8``I8"`!(\P+)2)@GX0`(0`**O!@""I@``9)8H`*67*@"FEP0`
+M)Y8$``*6"?A``A``HJ\$`(*F``!DEB@`I9<J`*:7`@`GE@(``I8)^$`"$`"B
+MKP(`@J8``&26*`"EERH`II<``">6```"E@GX0`(0`**O``""ID0`OX]``+2/
+M/`"SCS@`LH\T`+&/,`"PCP@`X`-(`+TG$`"JC___QC#__X0P0!`$`"$01`#`
+M$`(`(1!$`(`@`@!`,`8```"CE$`0`P`A$$,`P!`"`"$00P"`$`(`]O]")"L0
+M@@`%`$`0(4"F````HI0``$*E"`#@`P``XJ3^_P.50!`#`"$00P#`$`(`(1!#
+M`(`0`@`*`$(D*Q!$``P`0!`K$*@`_O\"E0``0J4(`.`#``#BI```1J4(`.`#
+M``#FI```XJ0"`**4"`#@`P``0J4;`$`0`!0$``-,`@```*.$0!`#`"$00P#`
+M$`(`(1!#`(`0`@`C$$D`"0!")!,`0BSL_T`4``"FE`(`HY1`$`,`(1!#`,`0
+M`@`A$$,`@!`"`/;_0B0K$((`Y?]`5```HI0"`*4D*Q"H`.G_0%0``*.$"`#@
+M`P`````E,(``U`'"E/``0C#0_T(D0`!"+!(`0!`0+,4D```$/`!:A"0$`(.,
+M$"S#K,`0`P`A$$,`@!`"``@`A"0A$$0`+"S"K`$``B0H+,*L%``")!PLPJQ5
+M``(D"`#@`R`LPJP```0\D%B$)`0`@XP``*.LP!`#`"$00P"`$`(`"`"$)"$0
+M1``<`**L`0`")!@`HJP4``(D#`"BK",``B0(`.`#$`"BK.C_O2<4`+^O$`"P
+MKR48@`#4`6*4\`!",-#_0B1``$(L%@!`$"6`H`"P+&*,"?A```<`!20"``,\
+MS)%C)"4@0``!``4D)``&)`GX8``E.```)4@``&L`!R0E(````0`#)"8`0Q1K
+M``8D4P`')%,`!B0W``(D(0``$!```JZP+&*,)2!@``GX0``'``4D`@`#/,R1
+M8R0E($``!@`%)"4`!B0)^&``)3@``"480``E2```/P`")`,`8A0$`&<D,@`'
+M)#\``B0"`&(0)2`@`4``!"0R`(8D/P`")`8`8A0,``FN%``B)0P``JXC`((D
+M`P``$!```JX%`,(D$``"K@0`!8XK$*D`*QCE`"400P`&`$`0)4```"L0I``K
+M&,4`)1!#``$`0%0!``@D)1```10`OX\0`+"/"`#@`Q@`O2?H_[TG%`"_KQ``
+ML*\E@(``]"\&AO`O`HXA,,(`0#(&``!^QC````(\``!")#"9!30)^$```(#&
+M-`$``B3$+P*N%`"_CQ``L(\(`.`#&`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O
+M)8B``"60(`(0+#`F*"PCCDH`8!`E$```Q"\CC@$``B1&`&)4Q"\BC@```CP`
+M`$(D)2!``@GX0``PF04T)1A```"`8C`]`$!4Q"\BCD(F`P#"%0,``P!",`(`
+M`R0+`$,4!``$KM(!0I9"`$(L!0!`5`0``HZ:$B*6(1!$``,``!`$``*N!0!"
+M)`0``J[4`4*6\`!",-#_0B1``$(L#0!`4,0O(*X"``(\N+M")`GX0``E($`"
+M!``$CA0``XXK$(,``P!`5`0``*XC$(,`!``"KL0O(*X"``(\[+9")"4@0`()
+M^$``)2@``A0`0%3$+R*.`@`"/."Y0B0E($`""?A``"4H``(,`$`0`@`"/!"Z
+M0B0E($`""?A``"4H``('`$!8Q"\BC@(``B3$+R*N`0`")-@O(J[`+R"NQ"\B
+MCAP`OX\8`+*/%`"QCQ``L(\(`.`#(`"])P0`HXP,`**,*Q!#``4`0!`E(```
+M$`"BC"L08@`"`$`4``````$`!"0(`.`#)1"``"4XH`#4`8*4\`!",-#_0B1`
+M`$(L```#/`,`0!0`6F@D```"/)!82"0``.2,P!`$`"$01`"`$`(`(1`"`0@`
+M0B0<`.*L!`#BC!``XXPK$$,`(P!`5`0`XHQ1`(`0__\")`0`XHP(`.*L$`#C
+MC"L00P`9`$`4)4A@````XHP6`$`0`````/__1B0``.:LP"`&`"$@A@"`(`0`
+M(1"(`!P`Y8P8`$.,$`"BC",88@!`&`,`"`#BC",00P`(`.*L(2`$`0@`A"0K
+M$$D``P!`%!P`Y*SL_\!4``#BC`@`X`,!``(D#`#CC"L88@`M`&`4)1``````
+M`XW__V,D``#DC"@`@Q#^_P(D!`#CC`@`XZP,`.*,)4A``"L00P`A`$`4`@`"
+M)````XW__V,D``#BC"4@0``K$$,`&@!`$`(``B0!`(8D``#FK,`@!@`A((8`
+M@"`$`"$0B``<`.6,&`!#C!``HHPC&&(`0!@#``@`XHPC$$,`"`#BK"$@!`$(
+M`(0D*Q`B`08`0!0<`.2L```"C?__0B0K$,(`Z?]`%"4@P``"``(D"`#@`P``
+M``#8_[TG)`"_KR``M*\<`+.O&`"RKQ0`L:\0`+"O)8B``!`L,B8D+""NL"PB
+MC@GX0``'``4D`@`#/,R1="0E($```0`%)"0`!B0)^(`")3@``"680``!``(D
+M(`!B%B0`OX\L+"*.``!0A+`L(HXE("`""?A```<`!20E($``!``%)"``!B0)
+M^(`")3@```H`$Q(E&$``$```4A0`0*X"``(D!P`"$@,``B0)``(2)`"_CPL`
+M`!`@`+2/!P``$!0`0ZY`$`,`^_]")`,``!`4`$*N0!`#`!0`0JXD`+^/(`"T
+MCQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O
+M)9"``"6(P``E@.`````"/```0B0E(*``"?A``"4H(`(E.$``__\&)L(P!@#_
+M_Q`F(``@&@<`$#(!``DD,`"BC\!``@`(``HD(1@1`@D`8B@!`$!0"``#)`08
+M:0#__V,D!!`)`O__0B0F&&(`!!@#`8`H!@`A*+(`)R`#````HHPD(((`!!`'
+M`@00`@$D$$,`)1!$````HJPA$#`"^/]1)",04`$&.$<`)8```.;_(!X!`,8D
+M'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGP/^])SP`OZ\X`+ZO-`"WKS``MJ\L
+M`+6O*`"TKR0`LZ\@`+*O'`"QKQ@`L*\ED*```@!"E@!`0C`'`$`0);"`````
+M`CP``$(D"?A````"!205```0)9A```(`0I8`@$(P!P!`$````CP``$(D)2#`
+M`@GX0```!`4D"P``$"680``"`$66$`"E,`$`I2PC*`4`_@"E,```0B0E(,`"
+M"?A```(`I20EF$````!BCAP`0!@EB``````"/```5R0`AQ4T```"/```5"1`
+M@!$`(8`1`H"`$``@`!`F(8!P`@L`!Y(0`*"O)2#``B4H8`()^.`"#@`&)`@`
+M!9*`*`4`)2#``B$HM0`)^(`")3!```$`,28``&*.*A`B`NS_0!1`@!$``@!"
+MEA``0C`Y`$`4/`"_CP```CP``$(D)2#``@GX0``(``4D)9A`````8HXO`$`8
+M)8@`````'CP!`!<D0!`1`"$040"`$`(`(`!")"&`8@((``*2@!`"``"'`S0A
+MD$,`!0`"DAT`0%0!`#$F"P`'DA``H*\```(\``!5)"4@P`(E*&`""?B@`@X`
+M!B0``-0G)2#``B4H0`()^(`")3!```D``I(,`$`0@!`"`"&00@(+``>2$`"W
+MKR4@P`(E*&`""?B@`@X`!B0E(,`")2A``@GX@`(E,$```0`Q)@``8HXJ$"("
+MUO]`%$`0$0`\`+^/.`"^CS0`MX\P`+:/+`"UCR@`M(\D`+./(`"RCQP`L8\8
+M`+"/"`#@`T``O2?8_[TG)`"_KR``M*\<`+.O&`"RKQ0`L:\0`+"O)8B``"6`
+MH`````(\``!")`GX0``<@`4T@#]#,`(``I8`0$(P!P!`$`0!$R2`'P<\&P`"
+M/!,`!B2L#1(D!P``$!0`%"32`!,D@!\'/#8``CP)``8D2`T2)`H`%"0E,,,`
+M)3#"````$#P``!`F)2`@`AR`!30)^``")3#'`"4@(`)P$`4D"?@``B4P8`(E
+M("`"L!`%)`GX``(E,$`"```"/```0B0E("`""?A``/`0!23P_P,\_P-C-"00
+M0P"`,A0`)2`@`O`0!20)^``")3!&`"0`OX\@`+2/'`"SCQ@`LH\4`+&/$`"P
+MCP@`X`,H`+TG``````````#8_[TG)`"_KR``M*\<`+.O&`"RKQ0`L:\0`+"O
+M)9B``"6`H`!$+&.._W\%//__I30```(\``!")`GX0``D*&4`):!``````CP`
+M`$(D)2!@`@GX0``P``4D)2!``/`#D3`"B1$`!@``$B60(`(E``(D(Q!1`$(0
+M`@`$```0(9`B`@(`(BX!`$(L(Y!"`@H`41(/_`,D)!B#```Q$@#P`\8P```"
+M/```0B0E(&`",``%)`GX0``E,&8````"/```0B0E(&`""?A``"4H@`(F$%$"
+M*Q`"`"0`OX\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TGZ/^])Q``OZ\E
+M.*``)4"``.@!@Y0J&.,`"0!@$"40````*0<`(RBG`(`H!0`A*`4!```"/```
+M0B0)^$``X"RE)!``OX\(`.`#&`"])^C_O2<0`+^O)4#``"4X@`#H`8.4*ABC
+M``H`8!`E$````#$%`",PQ0"`,`8`(3#F`````CP``$(D)2@``0GX0`#@+,8D
+M$`"_CP@`X`,8`+TGT/^])R@`OZ\D`+6O(`"TKQP`LZ\8`+*O%`"QKQ``L*\E
+MH(``)9"@`"6HP`#@`8,F`@`")!``0A(+`!,D`P!"+@8`0!`#``(D`0`")"``
+M0A+__P(D6P``$"@`OX\,`$)2"`!QE`0``B0.`$(2__\")%0``!`H`+^/"`!Q
+ME/__,28%``(\P`!"-"D``!`EF&("_O\Q)@4``CS``4(T)```$"688@((`'&4
+M_?\Q)@`1$0`C$%$`@!`"`"$01`#D+$*,'`!`4``1$0`]```0__\")`@`8I02
+M`$`0)8@``.0L@HP/`$!0"`!BE`@`9I0$`(4D`0`Q)BH0)@()`$!0"`!BE``1
+M$0`C$%$`@!`"`"$010#@+$*,]_]`5`$`,28(`&*4!``B5@`1$0`E```0__\"
+M)``1$0`C$%$`@!`"`"&`@@#@+!`F!``#CAT`8!3__P(D```"/```0B0E(``"
+M"?A``#P`!20-`*`6!``2K@P`$ZX"``(D%``"KO__`B08``*N_P,")!P``JX*
+M``(D(``"IB(``J8)```0-```KC``HHXT``*N```"/```0B0E((`")2@@`@GX
+M0``E,*`")1`@`B@`OX\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#,`"]
+M)^#_O2<<`+^O&`"RKQ0`L:\0`+"O)8"``,PL`H[_`T(PU"P&C@`T!@#_`Q(\
+M)##2````$3P``#$FI``%)`GX(`(E,$8`T"P"CO\#0C#8+`:.`#0&`"0PT@`E
+M(``"J``%)`GX(`(E,$8````"/```0B0E(``""?A``*P`!20`_`,D)!!#`-PL
+M!H[_`\8P)2```JP`!20)^"`")3!&`!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"]
+M)^C_O2<0`+^O)3B@`"4P@`#H`8.4*QCC`"``8!`E$````!$'`",01P"`$`(`
+M(2C"`.`LI20$`*.,&`!@$"40```$`*"L`0`#)`08XP`G&`,`S"S"C"008@#,
+M+,*LT"S"C"008@#0+,*LU"S"C"008@#4+,*LV"S"C"008@#8+,*LW"S"C"08
+M8@`"``(\5,1")`GX0`#<+,.L`0`")!``OX\(`.`#&`"])\C_O2<T`+^O,`"^
+MKRP`MZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O)?"``"6XH``EF,`#
+M-!+$C^@!PY<K&.,"/`%@$"40````$1<`(Q!7`(`0`@`AB&("X"PQ)@0`(XXT
+M`6`0`0`")!@`(X[__P(D$P!B5!@`)XX%`(`0H``#)`(`@I2@`$(P`@!#$!\`
+M!"0/``0D`0`')"L0Y``)`$`0@(`7`$`0!P`!`$<T*Q#D`/W_0!1`$`<``@``
+M$("`%P"`@!<`_P/G,!P`(HZ`$@(`#P`#/`#\8S0D$$,`)3CB`!0`)HX`-08`
+M\`\"/"0PP@````(\``!5)"4@P`-`$`4F"?B@`B4PY@`B`":6`#$&`/``QC`@
+M`"*6#P!","4PP@`(``(\`"!"-"4@P`.`$`4F"?B@`B4PP@``"!(D)``CC@X`
+M8!```10D_P`"//__0C0D$&(`*``FC@`V!@`E(,`#P`@%)@GXH`(E,$8`*``B
+MC@(`0!`!"!(D`0D2)#``(HX+`$`0@"@7`/\`!CS__\8T)#!&```!`SP```(\
+M``!")"4@P`,`":4D"?A``"4PPP"`*!<`+``FC@\``SS__V,T)!C#`"LP!@``
+M-08````"/```0B0E(,`#P!"E)`GX0``E,,,`,``BC@4`0!`,`"*.(`!",`$`
+M0%0``E(V#``BCD``0C`#`$`0\/\")"200@("`%(V#P!",@\`0!`,`"*.``%"
+M,`,`0!"__P(D`@``$$``4C8DD$("#``BCH``0C`#`$`0W_\")`(``!`@`%(V
+M))!"`@P`(HX!``,\)!!#``(`0!`@``(\):""`@P`(HZ```,\)!!#``$`0%0`
+M`I0V#``BC@0``SPD$$,``P!`4`P`(HX%```0):"#`@(``SPD$$,``0!`5"6@
+M@P(,`"*."``#/"000P`!`$!4`$"4-@P`(HX0``,\)!!#``$`0%0EH(,"!``C
+MC@(``B0%`&(0`P`")`<`8E`P`"*.'0``$#@`(HZB`%(V)0`"/!@``!`EH(("
+M%`!`%&(`4C8```(\```#/```0HP``&.,(Q!#`.0O9HXC,,(````"/```0HPC
+M,,(`@#(&`(`H%P```0,\```"/```0B0E(,`#``FE)`GX0``E,,,`!``"/"6@
+M@@(X`"*.`0!",`(`0!`D``(\):""`H"`%P#`"14F```"/```5B0E(,`#)2B@
+M`@GXP`(E,$`")2#``P`1!28)^,`")3"``C0`(HX6`$`0)2#``T`P%P``"P4D
+M"?C``E``QB0E(,`#!`L%)`GXP`(T`":.)2#``P@+!20)^,`""0`&)````CP`
+M`$(D)2#``PGX0``E**`")2#``R4HH`()^,`"`!!&-`P`(HX!`$(P!@!`$`$`
+M`B0$$.("S"QCCB400P`&```0S"QBK@00X@(G$`(`S"QCCB000P#,+&*N#``B
+MC@$`0C`&`$`0`0`")`00X@+0+&..)1!#``8``!#0+&*N!!#B`B<0`@#0+&..
+M)!!#`-`L8JX,`"*.`@!",`8`0!`!``(D!!#B`M0L8XXE$$,`!@``$-0L8JX$
+M$.(")Q`"`-0L8XXD$$,`U"QBK@P`(HX$`$(P!@!`$`$``B0$$.("V"QCCB40
+M0P`&```0V"QBK@00X@(G$`(`V"QCCB000P#8+&*N#``BC@@`0C`&`$`0`0`"
+M)`00X@+<+&..)1!#``8``!#<+&*N!!#B`B<0`@#<+&..)!!#`-PL8JX"``(\
+M5,1")"4@P`,)^$``)2@@`@$``B0T`+^/,`"^CRP`MX\H`+:/)`"UCR``M(\<
+M`+./&`"RCQ0`L8\0`+"/"`#@`S@`O2?H_[TG$`"_KX`H!0````(\``!")`GX
+M0```"*4D$`"_CP@`X`,8`+TGZ/^])Q``OZ^`*`4````"/```0B0)^$````BE
+M)`$``B00`+^/"`#@`Q@`O2?H_[TG$`"_KP$`!B0$,*8````"/```0B0)^$``
+M0`@%)`$``B00`+^/"`#@`Q@`O2?8_[TG(`"_KQP`LZ\8`+*O%`"QKQ``L*\E
+MF(``)9"@`(`H$@````(\``!1)`GX(`(`"J4D`P!0,`H``%8E$``")2!@`@GX
+M(`)`"`4D`0`#)`080P(D$$,``0!`5`$`$"0E$``"(`"_CQP`LX\8`+*/%`"Q
+MCQ``L(\(`.`#*`"])\C_O2<P`+^O+`"WKR@`MJ\D`+6O(`"TKQP`LZ\8`+*O
+M%`"QKQ``L*\ED(``);B@``$`!B0```(\``!")(`(!20)^$``!##F`N@#%20`
+M``(\``!1)````CP$```0``!0)`GX``)D``0D__^U)@4`H!(E($`""?@@`B4H
+MX`+X_T`4`````````CP``$(D)2!``@GX0``E*.`":`!`$````CS,`42.!P"#
+M.`$`8RP+`((X`0!"+"488@`-`&!4)8@```H``R0)`(,0"0`")`@`@E`EB```
+M60"#%````CS0`4*6!`!"+%4`0!````(\)8@``````CP``%0D```"/```4R0!
+M`!8\)2!``@GX@`),@`4T)8!``"4@0`(`@04T"@`&/`GX8`)D`,8T@H(0`/__
+M!C(E($`"_(`%-`GX8`(E,-8`)2!``@GX@`),@`4T@A("``0`4!`!`#$F`@`B
+M+NK_0!0E($`"```1/```,28E($`""?@@`DB`!31```8\```0/```$"8E($`"
+M2(`%-`GX``(E,$8````"/```0B0)^$``R``$)"4@0`()^"`"_(`%-/[_!CS_
+M_\8T)2!``OR`!30)^``")#!&`&0`$"0```(\``!3)````CP#```0``!1)`GX
+M(`(*``0D)2!``@GX8`(E*.`"!`!`$````CS__Q`F]_\`%@```````$(D)2!`
+M`@GX0`!(@`4TO_\&//__QC0```,\``!C)"4@0`)(@`4T"?A@`"0P1@````(\
+M``!")"4@0`*`"`4D"?A``"4P```K$!4`,`"_CRP`MX\H`+:/)`"UCR``M(\<
+M`+./&`"RCQ0`L8\0`+"/"`#@`S@`O2<4`*>/(`"JCR@`J8\L`*N/]"^"A"$X
+MX@!``.(L`@!`%"5`H``_``<D_P_#,``4!P`E&&(`0A$)``$`0C#`%0(`)1!#
+M`"0`HX]`'@,``!X$/"089``E&$,``0`B,0(`0!```0(\)1AB``(1"0`!`$(P
+M0!<"`"400P`+``*I"``"N1``HX\`'0,`/`"FCT`V!@`T`*6/0"\%`#@`I(_`
+M)@0`0A`)``$`0C``%@(`)1AF`"4890`E&&0`)1!#``\``JD,``*Y'`"CCP`<
+M`P`/``(\)!AB`$`2"0``@$(P)1!#`!,``JD0``*Y&`"BCQ<``JD4``*Y__\"
+M)`\`0A%`$PH`#P`$B0P`!)D/``,\`.!C-"000P`E(((`#P`$J0P`!+D+``*)
+M"``"F0!``SPE$$,`"P`"J0@``KD,`"(Q'P!`$`!_`SP`_V,T!QAC`0$`8S`;
+M`&`0)1````@`(S$K&`,`P!\#``L`!(D(``29@A`)``$`0C"`%0(`)2"#`"40
+M1``+``*I"``"N1,``XD0``.9,`"BC_]_0C`E&&(`$P`#J1```[D7``*)%``"
+MF0`="P`E$$,`%P`"J10``KD!``(D"`#@`P`````4`*B/$`#@$!P`J8\3`*.(
+M$`"CF``5!P#P``0\)!!$`"488@``@&,T$P"CJ!``H[@7`**(%`"BF$`9!@`E
+M$$,`%P"BJ!0`HK@0```1`!8(`!,`HX@0`*.8``\$/"001``E&&(``(!C-!,`
+MHZ@0`*.X%P"CB!0`HY@0`**/@!("`"488@`7`*.H%`"CN`X`(!$`'PD`$P"B
+MB!``HI@E$$,``(!"-!,`HJ@0`**X%P"CB!0`HY@8`**/P!,"`"488@`7`*.H
+M%`"CN`@`X`,!``(D"P"BB`@`HI@`(`,\)1!#``L`HJ@(`**X"`#@`P`````0
+M`**/"P#@$!0`HX\/`*.(#`"CF`$`0BP`$P(`)1AF`"400P`/`**H#`"BN!H`
+M`!``````#P!`4"48```+`*"H"`"@N`\`IJ@,`*:X$P!BB!``8I@3`**H$`"B
+MN!<`8H@4`&*8%P"BJ!0`HK@*```0``````L`HZ@(`*.X`!#"-`\`HJ@,`**X
+M$P"CJ!``H[@7`*.H%`"CN!\`H*@<`*"X'P"BB!P`HI@;`**H&`"BN`@`X`,!
+M``(D'P"CB!P`HY@!`&,PE`!@$`\``B0?`**('`"BF/X?0C!"$`(```#"I!L`
+MHH@8`**8`A0"``(`PJ0$`,"@&P"BB!@`HI@!`$(P%P!`%``````;`**(&`"B
+MF`(`0C`"`$`0`0`")`0`PJ`;`**(&`"BF`@`0C`$`$`0``````0`PI`"`$(T
+M!`#"H!L`HH@8`**8!`!",`0`0!``````!`#"D`0`0C0$`,*@'P"BB!P`HIA"
+M%0(``P!",`L`PJ#_`$,P`0`")!(`8A`"`&(H!0!`$`(``B0)`&`0`````"``
+M`!``````$0!B$`,``B06`&(0`````!H``!``````%P"BB!0`HI@?`$(P%0``
+M$`4`PJ`7`**(%`"BF.`#0C!"$0(`@`!"-`X``!`%`,*@%P"BB!0`HI@`?$(P
+M@A("`(``0C0'```0!0#"H!<`HH@4`**8PA,"`!\`0C"``$(T!0#"H!\`HH@<
+M`**80A,"``8`PJ`;`**(&`"BF/``0C`"$0(`!P#"H!L`HH@8`**8``]",`(2
+M`@`(`,*@"P##D`(``B03`&(0``````,`8B@&`$`0`P`")`$``B04`&(0````
+M`!D``!```````````!8`8A0`````$P"CB!``HY@"'@,`#P!C,`@`PI`A$$,`
+M"`#"H!,`HX@0`*.8`AT#``\`8S`(`,*0(1!#``@`PJ`3`*.($`"CF`(<`P`/
+M`&,P"`#"D"$00P`(`,*@&P"BB!@`HI@`\$(P`A,"``D`PJ`?`*.('`"CF``!
+M`CPD&&(``0!C+`(``B0C$$,`"@#"H"40```(`.`#````````HHR@1H.,)!!#
+M````HJPG$`(`H$:#C"000P`(`.`#H$:"K```````````X/^])Q@`OZ\4`+&O
+M$`"PKR6`@`````(\``!")`GX0`"$+`4F```1/```,28E(``")($%-`GX(`(E
+M,```)2```BB!!30)^"`")3```"4@``)```4D"?@@`B4P```E(``",($%-`GX
+M(`("``8\)2```CB!!30)^"`"``(&/!@`OX\4`+&/$`"PCP@`X`,@`+TGX/^]
+M)Q@`OZ\4`+&O$`"PKR6(@````!`\```0)D``!20)^``"!@`&)````CP``$(D
+M)2`@`@GX0`"$+"4F)2`@`B2!!30)^``")3```"4@(`(H@04T"?@``B4P```8
+M`+^/%`"QCQ``L(\(`.`#(`"])R4X@``E,```0!`&`"$01@"`$`(`(Q!&`,`0
+M`@`A$$<`*#!$E```HY07`(,0)1#``$`0!@`A$$8`@!`"`",01@#`$`(`*#!"
+M)"$8X@```&*4"0!`5`$`QB0``**4``!BI`(`HI0"`&*D!`"BD`0`8J`(`.`#
+M)1#``$``PBSC_T!40!`&`"40```(`.`#``````@`X`,D,(*,Z/^])Q0`OZ\0
+M`+"O)8"``````CP``$(D"?A``(0L!29(+`(F%`"_CQ``L(\(`.`#&`"])]C_
+MO2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR60@``EF*``)8A``N,!(I(!`$(P'#`B
+MK@```CP``$(D*#`D)@GX0```%@4D)3````<`#R0"``XD]`$-),@`!R1D``PD
+M*``+)`<`"B2_``D\#/XI-;\`"#PX_P@US`%"C@<`0BP(`$`00!`&`"$01@"`
+M$`(`(Q!&`,`0`@`A$%$`!P``$#`P3Z`A$$8`@!`"`",01@#`$`(`(1!1`#`P
+M3J!`$`8`(1!&`(`0`@`C$$8`P"`"``0`)28A$(4`.#!-K$`P@R0A$","``!'
+MK"$8HP```&>L2#"#)"$0(P(``$RL(1"1`%`P2ZPA&*,```!JK#`P@B0A$"("
+M!`!`H`4`0*```$.0`@!#H`,`0*`<,"*.!`!`$"$0A0!H,$FL(1"1`'`P2*P!
+M`,8D0`#"+,S_0%3,`4*.'#`BC@X`0!```!`\```0)B4@0`(L@04T"?@``FPP
+M)HXE($`"-($%-`GX``)P,":.```"/```0B0)^$``)2!``F0``B0%`&`2(#`B
+MKA@P(HX!`$(T!0``$!@P(JX8,"*._O\#)"000P`8,"*N(`"_CQP`LX\8`+*/
+M%`"QCQ``L(\(`.`#*`"])^#_O2<8`+^O%`"QKQ``L*\EB(``'#`BC@T`0!``
+M``(\``!")`GX0````!`\```0)B4@(`(L@04T"?@``B4P```E("`"-($%-`GX
+M``(E,```&`"_CQ0`L8\0`+"/"`#@`R``O2>8_[TG8`"_KUP`MZ]8`+:O5`"U
+MKU``M*],`+.O2`"RKT0`L:]``+"O):B``"6@H`('`*(LP@%`$"0PEXX```(\
+MD%M")(`8!0`A&&(```!BC`@`0```````);#```4`PRRZ`6`0)1``````$CP`
+M`%(F)2"@`@GX0`)0F`4T#_`#//__8S0D$$,`@(`6`"$8%`(H1F:,`#4&`/`/
+M`SPD,,,````1/```,28E(*`"4)@%-`GX(`(E,$8`)2"@`@GX0`)<F`4T?X`#
+M)"000P`A&!0"4$9FC,`Q!@"`?\8P)2"@`ER8!30)^"`")3!&`"4@H`()^$`"
+M7)@%-,#_`SS_?V,T)!!#``0`DR8A&!,".$9FC,`S!@`_``,\`(!C-"0PPP`E
+M(*`"7)@%-`GX(`(E,$8`)2"@`@GX0`)8F`4T`_P#//__8S0D$$,`(8`3`F!&
+M!HZ`-`8`_`,#/"0PPP`E(*`"6)@%-`GX(`(E,$8`"0#BDBL05@`%`$!0"0#B
+MDD@L@HX!`$(D!P``$$@L@JXK$,(";0%`4`D`]J),+(*.`0!")$PL@JYH`0`0
+M"0#VHG\``R00`*.O,@`")!0`HJ\8`*.O*``")!P`HJ\@`*.O30`")"0`HJ\H
+M`*.O0``")"P`HJ\?``(D,`"BKQ```B0T`**O/P`")#@`HJ\P``(D/`"BKRN8
+M!@````(\``!2)"4@H`()^$`";)@%-.#_`SS_/V,T)!!#`("`$P`0`*,G(1AP
+M````9HR`,P8`'P`#/`#`8S0D,,,````#/```<20E(*`";)@%-`GX(`(E,$8`
+M)2"@`@GX0`)LF`4T'_`#//__8S0D$$,`&`"C)R$8<````&:,0#4&`.`/`SPD
+M,,,`)2"@`FR8!30)^"`")3!&`"4@H`()^$`":)@%-`'_`SS__V,T)!!#`"``
+MHR<A&'````!FC$`T!@#^``,\)###`"4@H`)HF`4T"?@@`B4P1@`E(*`""?A`
+M`FB8!33_@`,\__]C-"000P`H`*,G(1AP````9HP`-@8``'\#/"0PPP`E(*`"
+M:)@%-`GX(`(E,$8`)2"@`@GX0`)HF`4TX/\#)"000P`P`*,G(1AP````9HP?
+M`,8P)2"@`FB8!30)^"`")3!&`"4@H`()^$`";)@%-/_``R0D$$,`.`"C)R$8
+M<````&:,`#(&```_QC`E(*`";)@%-`GX(`(E,$8`"0!@$B4@H`()^$`";)@%
+M-"4@H`)LF`4T"?@@`@$`1C0-```0`0!C+@```CP``$(D"?A``&R8!33^_P8D
+M```#/```8R0E(*`";)@%-`GX8``D,$8``0!C+@P`XI+9`&(0`0`")`4`8%)<
+M+(*.6"R"C@$`0B0#```06"R"K@$`0B1<+(*N`0!B+LT``!`,`.*B"``")!``
+MHJ\&``(D%`"BKRN`!@````(\``!")"4@H`()^$``"*(%-,#_`R0D$$,`@"`0
+M`!``HR<A&&0```!FC#\`QC````,\``!C)"4@H`((H@4T"?A@`"4P1@`-`.*2
+MM``"$@$``B0%``!29"R"CF`L@HX!`$(D`P``$&`L@JX!`$(D9"R"KJD``!`-
+M`/"B$`"@KP0``B04`**O"``")!@`HJ\EB,```P##+*$`8!`E$``````"/```
+M0B0E(*`""?A``%B8!33\_P,\_P]C-"000P"`&!$`(1BC`Q``9HP`,P8``P`#
+M/`#P8S0D,,,````#/```8R0E(*`"6)@%-`GX8``E,$8`"P#BDBL040`%`$!0
+M"P#BDF@L@HX!`$(D!P``$&@L@JXK$"("@`!`4`L`\:)L+(*.`0!")&PL@JY[
+M```0"P#QH@```CQP6T,D<%M"C!``HJ\$`&*,%`"BKP@`8HP8`**O#`!BC!P`
+MHJ\0`&*,(`"BKQ0`8HPD`**O&`!BC"@`HJ\<`&*,+`"BKR6(P``(`,,L9@!@
+M$"40``````(\``!")"4@H`()^$``))D%-`'_`R0D$$,`@!@1`"$8HP,0`&:,
+M0#`&`/X`QC````,\``!C)"4@H`(DF04T"?A@`"4P1@`*`.*2*Q!1``4`0%`*
+M`.*24"R"C@$`0B0'```04"R"KBL0(@)(`$!0"@#QHE0L@HX!`$(D5"R"KD,`
+M`!`*`/&B%`#`%!@P@H[]_P,D)!!#`!@P@JX```(\``!")`GX0``E(*`"```"
+M/```0B0)^$``)2"@`O_^!20```,\``!C)"4@H`()^&``)"A%`"\``!`!``(D
+M`@!","P`0!0!``(D'#""CAH`0!````(\``!")`GX0``E(*`"__X%)````SP`
+M`&,D)2"@`@GX8``D*$4````0/```$"8E(*`"+($%-`GX``)L,(:.)2"@`C2!
+M!30)^``"<#"&C@```CP``$(D"?A``"4@H`(*```0&#""C@``0B0)^$``)2"@
+M`@```SP``&,D)2"@`@GX8````44T&#""C@(`0C0#```0&#""K@(``!`E$```
+M`0`")&``OX]<`+>/6`"VCU0`M8]0`+2/3`"SCT@`LH]$`+&/0`"PCP@`X`-H
+M`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0`+"O)9"``"0P48X0`""N'#!"CBH`
+M0!`EF$`"%``CCL```CPK$$,``P!`$,```CP#```01``@KB,00P!$`"*N'``C
+MCL```CPJ$$,``P!`$,```CP#```02``@KB,00P!(`"*N```0/```$"8E($`"
+M+($%-`GX``)$`":.)2!``C2!!30)^``"2``FCB4@0`(P@04T"?@``@(`!CPE
+M($`".($%-`GX``(``@8\```"/```0B0E($`""?A``(0L928\`""N0``@KB``
+MOX\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2?@_[TG&`"_KQ0`L:\0`+"O)8B`
+M`"4X(`(8,"*.`P!",`,``R1B`$,4-!(ECB0P,(X)``:2!`#"+`@`0%`*``:2
+M```"/```0B0!``4D"?A```$`QB17```0&`"_CP@``I(K$,(`"0!`4)@LXXP`
+M``(\``!")"4@(`(%``4D"?A```$`QB1+```0&`"_CW\`8C!``$(L?P!C)`,`
+M0!#"&0,`F"SBC,(9`@`H``*.*A!#`!``0%`D``*.#``"DAD`0%0+``:2```0
+M/```$"8E("`"`@`%)`GX``(E,```)2`@`@4`!20)^``")3```#$``!`8`+^/
+M*A!#`!4`0!````(\#``"D@8`0!````(\``!")"4@(`("``4D"?A```$`!B0+
+M``:2`@#"+"(`0%`8`+^/```"/```0B0E("`"!``%)`GX0``!`,8D&@``$!@`
+MOX\``$(D"?A``"4@(`+^_T(D`@!"+!,`0!`8`+^/#``"D@@`0%0+``*2```"
+M/```0B0E("`"`@`%)`GX0``E,```"P`"D@8`0!````(\``!")"4@(`($``4D
+M"?A``"4P```8`+^/%`"QCQ``L(\(`.`#(`"])^#_O2<8`+^O%`"QKQ``L*\E
+MB(``)3@@`A@P(HX#`$(P`P`#)#,`0Q0T$B6.)#`PC@D`!I($`,(L"`!`4)@L
+MXXP```(\``!")`$`!20)^$```0#&)"@``!`8`+^/?P!B,$``0BQ_`&,D`P!`
+M$,(9`P"8+.*,PAD"`"0``HXJ$$,`#0!`$````CP+``:2`@#"+!D`0%`8`+^/
+M```"/```0B0E("`"!``%)`GX0``!`,8D$0``$!@`OX\``$(D"?A``"4@(`+^
+M_T(D`@!"+`H`0!`8`+^/"P`"D@<`0!````(\``!")"4@(`($``4D"?A``"4P
+M```8`+^/%`"QCQ``L(\(`.`#(`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"P
+MKR6(@``E@*``)9@@`@(``CR@U4(D"?A``#02)8Y`&`(`(1AB`(`8`P`C&&(`
+MP!@#`"&0(P(H,%(F)#`RKMP!(XX!``(D!0!B5!@P8HX8,"*.`@!"-`0``!`8
+M,"*N_?\#)"000P`8,&*NW`$CC@$``B0H`&(0)2`@`G@L8HX!`$(D>"QBK@``
+M$#P``!`F`0`%)`GX``(E,```)2`@`@4`!20)^``")3```"4@(`($``4D"?@`
+M`B4P```E("`"`@`%)`GX``(E,```)2`@`@,`!20)^``")3```````CP``$(D
+M"?A``"4@(`(```,\``!C)"4@(`()^&````%%-`(``CP<X$(D"?A``"4@(`)?
+M```0(`"_CQ@P(HX#`$(P`P`#)%H`0Q0@`+^/&0``$@``$#P``!`F)2`@`@$`
+M!20)^``""0!&DB4@(`(%``4D"?@``@H`1I(,`$:2)2`@`@(`!20)^``"`0#&
+M+"4@(`(#``4D"?@``@T`1I(E("`"!``%)`GX``(+`$:2%P``$!PP8HX``!`F
+M)2`@`@$`!20)^``"!``&)"4@(`(%``4D"?@``@@`1I(E("`"`@`%)`GX``(!
+M``8D)2`@`@,`!20)^``"`0`&)"4@(`($``4D"?@``@(`!B0<,&*.&@!`$```
+M`CP``$(D"?A``"4@(`+__@4D```#/```8R0E("`""?A@`"0H10`"``(\'.!"
+M)`GX0``E("`"```0/```$"8E("`",($%-`GX``("``8\)2`@`CB!!30)^``"
+M``(&/`\``!`@`+^/`@`"/!S@0B0)^$``)2`@`@```CP``$(D"?A``"4@(`(`
+M``,\``!C)"4@(`()^&````%%-"``OX\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`
+MO2?8_[TG(`"_KQP`LZ\8`+*O%`"QKQ``L*\ED(``)8B@`"680`(``!`\```0
+M)B2!!30)^``")3```"4@0`(H@04T"?@``B4P``````(\``!")"4@0`()^$``
+MA"Q%)@``(HZ8+$*N!``BCIPL0JX(`"*.H"Q"K@``$#P``!`F)2!``@GX``(L
+M@04T)8A``"4@0`()^``"-($%-"4H0`#```,\)!`C`@,`0Q`D$*,`*0!#%"``
+MOX\D,'".1``$CB,@)`(\``*.(Q""`'`L8XXA$$,`<"QBKCP`!*Y(``2.(R"D
+M`$```HXC$((`="QCCB$00P!T+&*N0``$KCP``XX4``*.*Q!#``8`0%!```..
+M`@`"/!3A0B0)^$``)2!``D```XX<``*.*Q!#``8`0!`"``(\`@`"/-CB0B0)
+M^$``)2!``@(``CP<X$(D"?A``"4@0`(@`+^/'`"SCQ@`LH\4`+&/$`"PCP@`
+MX`,H`+TGZ/^])Q0`OZ\0`+"O)8"``"4X``(%`*.0$0`")!8`8A0D,`:./`#"
+MC`$`0B0\`,*L<"P"C@$`0B1P+`*N/`##C!0`PHPK$$,`(@!`4!0`OX\"``(\
+M%.%")`GX0````````@`"/!S@0B0)^$``)2```A@``!`4`+^/&0`")!4`8A04
+M`+^/0`#"C`$`0B1``,*L="SBC`$`0B1T+.*L0`##C!P`PHPK$$,`"P!`4!``
+ML(\"``(\V.)")`GX0``E(``"`@`"/!S@0B0)^$``)2```A0`OX\0`+"/"`#@
+M`Q@`O2?H_[TG$`"_KR4H@``D,(:,F"R#C'\`8C!``$(L?P!C)`,`0!#"&0,`
+MF"RBC,(9`@`H`,*,*A!#`!@`0%0*`,.0)`#"C"H00P`+`$!0"P##D`P`PI`'
+M`$`0```"/```0B0"``4D"?A```$`!B0:```0$`"_CPL`PY`'`&`0```"/```
+M0B0$``4D"?A``/__9B01```0$`"_CPH`PY`'`&`0```"/```0B0%``4D"?A`
+M`/__9B0(```0$`"_CPD`QI`$`,`0``!")`$`!20)^$``___&)!``OX\(`.`#
+M&`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@````!`\```0)@GX``+L
+M@`4T)9A``"4@(`()^``"\(`%-"600``E("`""?@``OB`!30E,$``)#`ECC@`
+MHHP#`$`0*Q#"``8`0%`X`*2,)1@``'PL(HX!`$(D#P``$'PL(JXC(,0`-`"C
+MC",80P(P`**,(Q!B`B,8@P`C&&(`4U\"/"DY0C08`&(`$!```(,3`@##'P,`
+M(QA#`#@`IJPP`+.L-`"RK"408``@`+^/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H
+M`+TGT/^])R@`OZ\D`+6O(`"TKQP`LZ\8`+*O%`"QKQ``L*\EF(``)9!@`B0P
+M<8X``**,F"QBK@0`HHR<+&*N"`"BC*P`(!*@+&*N`@`"/,CI0B0)^$``````
+M`"6`0``)``,&$``BCH`L8HX!`$(D@"QBK@(``CP<X$(D"?A``"4@8`(0`"*.
+M(1`"`A``(JX<,$*.0`!`$````CP``$(D)2!@`@GX0`"$+$4F```0/```$"8E
+M(&`""?@``BR!!30EJ$``)2!@`@GX``(T@04T):!``$0`(HXK$*("!P!`5```
+M$#Q(`"*.*Q""`AL`0%!$`"2."P``$$@`)HX``!`F)2!@`BR!!30)^``"1``F
+MCB4@8`(P@04T"?@``@(`!CQ(`":.*Q"&`G0`0!`H`+^/```0/```$"8E(&`"
+M"?@``C2!!30E(&`".($%-`GX``(``@8\:0``$"@`OX\C(*0"/``BCB,0@@!P
+M+$..(1!#`'`L0JX\`"2N2``DCB,@A`)``"*.(Q""`'0L0XXA$$,`="Q"KD``
+M)*X8,&*.`P!",`,``R15`$,4*`"_CR`P0XZ`$`,`(1!#`!``)(XK$$0`'P!`
+M4!``(XX8`"*.&`""`!(0``!B$`4\TTVE-!D`10`0$```@A$"`#P`(XXK$$,`
+M*`!`%`(``CP@`"*.&`""`!(0`````````````!D`10`0$```@A$"`$``(XXK
+M$$,`'`!`5`(``CP"``(\Z.A")`GX0``E(&`"%@``$`(``CP@,$*.*Q!#`"P`
+M0!`H`+^/%``BCA@`8@`2$```8A`#/---8S09`$,`$!```((1`@`\`"..*Q!#
+M``L`0%`0`"*.`@`"/!3A0B0)^$``)2!@`@(``CP<X$(D"?A``"4@8`(6```0
+M*`"_CQP`(XX8`$,`$A```&(0`SS336,T&0!#`!`0``""$0(`0``CCBL00P`*
+M`$`0*`"_CP(``CS8XD(D"?A``"4@8`("``(\'.!")`GX0``E(&`"*`"_CR0`
+MM8\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,P`+TG-!*"C```0I0``**D-!*#
+MC`0`8I`(`$(T!`!BH`0`HI`(`$(T!`"BH#02@HP"`$*4`@"BI#02@HP$`$*0
+M!`"BH#02@HP%`$*0!0"BH`@`X`,E$```````````````````R/^])S``OZ\L
+M`+>O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6@@``EL*``);C``"6`
+MX``EB``````"/+!;4B0```(\``!5)````CP``%,D0!`1`"$040#`&`(`(1AR
+M`$`0`@`A$%8`@!`"`"$04@`E((`"``!EC`GXH`(``$:,`0`0)C\``C($`$!4
+M`0`Q)@GX8`(!``0D`0`Q)@X`(B[L_T`40!`1`"6(``````(\`%U2)````CP`
+M`%4D```"/```4R3`$!$`(1A2`"408``E((`"``!EC`GXH`($`$:,`0`0)C\`
+M`C($`$!4`0`Q)@GX8`(!``0D`0`Q)D@`(B[Q_T`4P!`1`"6(``````(\V&!2
+M)````CP``%4D```"/```4R1`$!$`(1!1`(`8`@`A&'(`(1!7`(`0`@`A$%(`
+M)2"``@``98P)^*`"``!&C`$`$"8_``(R!`!`5`$`,28)^&`"`0`$)`$`,29`
+M`"(N[?]`5$`0$0`P`+^/+`"WCR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``
+ML(\(`.`#.`"])]C_O2<D`+^O(`"TKQP`LZ\8`+*O%`"QKQ``L*\EF(``):"@
+M`````CP``$(D``"%E@GX0``"`(:6`!0"``,D`@`"`(*6@`!","L`0!!`@`0`
+M(8`$`H"`$`````(\3&=")"&``@(```(\``!")`0`!(X)^$``"``%)/\`4C!`
+MD1(````"C@`1`@`ED$(""``0A@```CP``$(D)2!@`@GX0``$H@4T)3A`````
+M@Y:T"0(D"0!B5.__!B0```(\``!")"4@8`($H@4T"?A``!``YC0,```0D0`"
+M*@```CP``$(D)2!@`@2B!30)^$``)##F``0``!"1``(J)8"``"60``"1``(J
+M!`!`$````CP!``(R"`!`$````CP``$(DZ/\$)@GX0``(``4D_P!1,`L``!`!
+M``(DZ/\$)L(7!``A(((````"/```0B1#(`0`"?A```@`!23_`%$P)1```("(
+M$0!`$`(`)8@B`@$$,3;_`$8R`#(&`/\`(C(``!`\```0)B4@8`*<F`4T"?@`
+M`B4PP@`"BA$``/]",O\`)C(E(&`"T)@%-`GX``(E,$8`-!)TK@$``B0D`+^/
+M(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])P@`HBP4`$`0["^$C````CR0
+M:$(D@!@%`"$88@```&*,"`!````````(`.`#)1"```@`X`-$`((D"`#@`T@`
+M@B0(`.`#3`"")`@`X`-0`((D"`#@`Y0`@B0(`.`#)1```&C_O2>4`+^OD`"^
+MKXP`MZ^(`+:OA`"UKX``M*]\`+.O>`"RKW0`L:]P`+"OF`"DKYP`I:___]0P
+M)9"```(`HI3P`4,PP``")$0`8A`EF```P0!B*`8`0!!``0(DH``")#$`8A`E
+M$```C0$`$)0`OX\#`&(04`$")(@!8A0E$```G`"CCP``8I1?\$(DZP1"+`0`
+M0%```&*45!-5EA<``!!6$U:6=.M")/``0BP$`$`0G`"CCU@35980```06A-6
+ME@``8I2$ZD(DX0!"+`0`0!"<`*./7!-5E@@``!!>$U:6``!BE%T60BPEL```
+M`P!`%"6H``!@$U668A-6EB6(```E*```V!)"EF``HJ_>$D.69`"CKP$`8BQH
+M`**O+!-#EAH``!!L`*.O9!-5EF835I9L$T66<!-1EMH20I9@`**OX!)#EF0`
+MHZ\!`&(L:`"BKRX30Y8-```0;`"CKV@3599J$U:6;A-%EG(349;<$D*68`"B
+MK^(20Y9D`*.O`0!B+&@`HJ\P$T.6;`"CKR6````8`*0G```"/$!?1B2`&!``
+M(1B#`$`0$``A$%``0!`"`"$05`"`$`(`(1!&````0HP``&*L`0`0)A$``B[T
+M_T`4@!@0`)P`HX\"`&*4@`!",`T`0!```!`\$`"@KP``$"88`*0G`P`&)`GX
+M``)W``<D$`"@KQ@`I"<E*"`"`P`&)`GX``)Z``<D)8```!@`L2<```(\``!>
+M)````CP``%<D0!`0`"$04`#`$`(````#/$!?8R0A$$,`@!@0`"$8(P*8`*2/
+M``!%C`GXP`,``&:,`0!S)C\`8C($`$!4`0`0)@GXX`(!``0D`0`0)A$``B[L
+M_T`40!`0`"6```````(\V&-1)````CP``%XD```"/```5R3`$!``(1A1`"40
+M8`"8`*2/``!EC`GXP`,$`$:,`0!S)C\`8C($`$!4`0`0)@GXX`(!``0D`0`0
+M)O'_`!(```(\)8```.!C420```(\``!>)````CP``%<D0!`0`"$04`#`&`(`
+M(1AQ`$`0`@`A$%0`@!`"`"$040"8`*2/``!EC`GXP`,``$:,`0!S)C\`8C($
+M`$!4`0`0)@GXX`(!``0D`0`0)NS_`!(```(\)8```/AC420```(\``!>)```
+M`CP``%<D0!`0`"$04`#`&`(`(1AQ`$`0`@`A$%0`@!`"`"$040"8`*2/``!E
+MC`GXP`,``$:,`0!S)C\`8C($`$!4`0`0)@GXX`(!``0D`0`0)NS_`!(8`*0G
+M)8```````CP09$4D@!@0`"$8@P!`$!``(1!0`$`0`@`A$%0`@!`"`"$010``
+M`$*,``!BK`$`$"81``(N]/]`%(`8$`"<`*./`@!BE$`!0C!``0,D$0!#5!``
+MH*_,$T66`P`1)!``L:\``!`\```0)A@`I"<!``8D"?@``C,`!R3.$T66$`"Q
+MKQ@`I"<!``8D"?@``BT`!R00`*"O```0/```$"88`*0G:`"ECP$`!B0)^``"
+M7P`')!``H*\8`*0G8`"ECP0`!B0)^``"8``')!``H*\8`*0G)2B@`@,`!B0)
+M^``":``')!``H*\8`*0G)2C``@,`!B0)^``":P`')"6```````(\$&17)!@`
+ML2<```(\``!6)````CP``%4D0!`0`"$04`#`$`(`(1!7`(`8$``A&","F`"D
+MCP``18P)^,`"``!FC`$`<R8_`&(R!`!`5`$`$"8)^*`"`0`$)`$`$"81``(N
+M[O]`%$`0$``E@```&`"D)P```CRH944D@!@0`"$8@P!`$!``(1!0`$`0`@`A
+M$%0`@!`"`"$010```$*,``!BK`$`$"8(``(N]/]`5(`8$``0`*"O```"/```
+M4208`*0G;`"ECP8`!B0)^"`"'0`')!``H*\8`*0G9`"ECP$`!B0)^"`"!``'
+M))P`HX\``&*,`,`#/"000P`9`$`0G`"BCP(`4)0`0!`R`0`0+B.`$``/`!`R
+M$``0)A``H*\8`*0G'P`%)`4`!B0)^"`"$P`')!``H*\8`*0G)2@``@4`!B0)
+M^"`"&``')!``H*\8`*0G`P`%)`(`!B0)^"`",0`')"6```````(\J&56)!@`
+ML2<```(\``!5)````CP``%0D0!`0`"$04`#`$`(`(1!6`(`8$``A&","F`"D
+MCP``18P)^*`"``!FC`$`<R8_`&(R!`!`5`$`$"8)^(`"`0`$)`$`$"8(``(N
+M[O]`%$`0$`#$+T"N`0`"))0`OX^0`+Z/C`"WCX@`MH^$`+6/@`"TCWP`LX]X
+M`+*/=`"QCW``L(\(`.`#F`"])___A##__Z4P___&,/__YS`0`*B7&`#H`!(8
+M```E`&`0)1```"(`Q5`E&.``(Q"%`$`8`@`A&&(`P!@#`"$88@"`&`,`(Q#%
+M`!H`8@`2&````0!`4`T`!P``'`,``R0#`!,`@`0E&.``90""*!``0!`E&``!
+M&`"(`!(8``!D``(D(Q!$`!@`1P`2$```(1AB`.M1`CP?A4(T&`!B`!`0``!#
+M$0(`PQ\#`",00P#__T,P)1!@``@`X`,`````H/Z])UP!OZ]8`;ZO5`&WKU`!
+MMJ],`;6O2`&TKT0!LZ]``;*O/`&QKS@!L*\EN.``):"``#\``B0P`:*O`@#B
+MEO`!0S#0``(D)`!B$"7P``#1`&(H"`!`$%`!`B2@``(D%P!B$,```B0<`&(0
+M)1````8!`!!<`;^/"@!B$%$!8B@&`$`00`D")$`!`B0%`&(0)1```/T``!!<
+M`;^/^@!B%"40``#F$X*6)`&BI](3@B8@`:*OZ!.")@X``!`H`:*O\!6"EB0!
+MHJ?X%8(F(`&BKZX6@B8'```0*`&BK_`5@I8D`:*G\A6")B`!HJ\2%H(F*`&B
+MKR`!M2<```(\``!")!@`I"<)^$``"`$%)"``MB>@`+,G`0`2)"6(``!`$!$`
+M(1!6````4J0!`%(F0`!"*OK_0!0!`#$F'@"QIP$``B0:`**G/P`")!P`HJ?_
+M_R(R$`!`$"6(```"``(\//Y2)$"`$0`A$!8"``#DE@``190)^$`")3"@`B&`
+M$P(```*F`0`Q)AX`HI<J$"("]?]`%$"`$0```&:&'@"BET`0`@`A$&("_O]'
+MA`D``!`EB```(2!B`O[_@X0``(*$*A!#``(`0!```(64_O^%I`$`,28>`**7
+M*A`B`@\`0!`>`**70!`1`"$04P```$.$*A##``,`0!0>`**7)3!@`/__/C(C
+M$%$`__]")/__4C#H_T`60!`2`!X`HI</`$`0)8@``"4@0`!`$!$`(1!3````
+M0X0J$.,`!0!`4`$`,28E.&``__\C,C`!HZ\!`#$F*A`D`O7_0!1`$!$`&0#"
+M).M1!#P?A80T&`!$`!`8```#&0,`PQ<"`",88@!`$`,`(1!#`,`0`@`A$$,`
+M0!0"``.$`@`ED```&``$`A`@```#(00`PQ<"`",@@@`!`(0D$`"`&"6(```0
+M$````Q$"`,,?$``C$$,``0!$)"48(`(!`"(F__]1,'A&@HY`&`,`(1AB``$`
+M4B8J$$0"]_]`%```?J0>`**7)2!``$`0`@`A$&("_O]"A"H0`@)``",N)!!#
+M`$X`0!`ED````@`"/,CX520R``(F`!0"``.$`@`E$(``0!`"`"$08@+^_T*$
+M*A`"`AP`0!!`&!(`0!`2`"$04P```$.$(Q@#`@(`0H0C$`("&`!B`!(8```2
+M`&`80!@2`$`0!``A$&("_O]"A"H@`@(+`(`0`0!2)D`0$@`A$%,```!#A",8
+M`P("`$*$(Q`"`A@`8@`2&```]?]@'`````!`&!(`(1!S````190"`$:4(1AV
+M````9Y1`.`<``@!BE$`0`@#__T(P$`"BK___!#()^*`"___G,`$`0B3__T(P
+M>$:#CD`@$0`A&(,`0A`"````8J1X1H*.(2""````@I0P`:./*Q!B``$`0%0`
+M`(.D`0`B)O__43`>`*270!`$`"$08@+^_T*$*A`"`D``(RXD$$,`M_]`%#(`
+M`B9``"(N#`!`4/0O@*9X1H..0!`1`"$00P#^_T.4``!#I`$`(B;__U$P0``B
+M+OC_0%1X1H..]"^`I@$``B1<`;^/6`&^CU0!MX]0`;:/3`&UCT@!M(]$`;./
+M0`&RCSP!L8\X`;"/"`#@`V`!O2>H_[TG4`"_KTP`MZ](`+:O1`"UKT``M*\\
+M`+.O.`"RKS0`L:\P`+"O):C``/__ES#__[8P`@`"/-S_0B0E(.`")2C``@GX
+M0``8`*<G20!`%!@`HI<$`*:6'`"B)Q``HJ\```(\``!")"4@X`(``*6."?A`
+M`!H`IR<:`*67(`"B)Q``HJ\"`!`\9``0)B4@P`(E,*`""?@``AX`IR<<`*67
+M)`"B)Q``HJ\E(,`")3"@`@GX``(B`*<G)@"S)P(`$#S<_Q`F&@"DEQX`I9<E
+M,*`""?@``B4X8`(H`+(G&@"DER``I9<E,*`""?@``B4X0`(>`*67(`"FER8`
+MIY<H`**7$`"BKP(`$3S(^#$F"?@@`B4@P`(EH$``'`"DER(`I9<E,*`""?@`
+M`B4X8`(<`*27)`"EER4PH`()^``")3A``B(`I9<D`*:7)@"GER@`HI<0`**O
+M"?@@`B4@P`(:`*67'`"FEQ``HJ\E(.`""?@@`B4X@`)0`+^/3`"WCT@`MH]$
+M`+6/0`"TCSP`LX\X`+*/-`"QCS``L(\(`.`#6`"])___A##__Z4P"`#(C`0`
+MPI0;`$`0)5```````I44`$14`0!*)0@`"24&``*5#P!`$"48```&``LE```B
+ME0<`150!`&,D0!`#`"$02P`8`$*4``#BI`@`X`,!``(D!@`"E2H08@#T_T`4
+M`@`I)0$`2B4$`,*4*A!"`>?_0!0T``@E"`#@`R40``#@_[TG&`"_K___A##_
+M_Z@P"`#%C`0`PI0,`$`0)1@`````HI0*`$A0!@"FE`0`QI0!`&,D*A!F``0`
+M0!`T`*4D``"BE/O_2%0!`&,D!@"FE#``HH\0`**O```"/```0B0)^$``"`"E
+M)!@`OX\(`.`#(`"])^C_O2<4`+^O$`"PKR6`@`!X1@2.!0"`$````CP``$(D
+M"?A```````!X1@"N["\$C@4`@!````(\``!")`GX0```````["\`KA0`OX\0
+M`+"/"`#@`Q@`O2<(`.`#`0`")````CP``*.4L&A"E"L00P`+`$`4)2``````
+M`CRP:$,D``"EE`$`A"2`$`0`(1!#````0I0K$$4`^_]`4`$`A"0```(\L&A"
+M)(`8!``A$$,`"`#@`P(`0H3@_[TG&`"_KQ0`L:\0`+"O)8B@`"6`@`````(\
+M``!")`GX0`"T``0D)1A```0`8!3L+P.N`@`#)"8``!```".N@``")'Q&`JX`
+M``(\``!")`GX0`"```0D)1A```0`8!1X1@.N`@`#)!H``!```".N`@`"/-@`
+M0B2H+`*N`@`"/"#N0B2L+`*N`@`"/)SQ0B2P+`*N`@`"/,CO0B2T+`*N`@`"
+M//SQ0B2X+`*N`@`"/(3Y0B2\+`*N`@`"/#`!0B3`+`*N`@`"/#@!0B3$+`*N
+M`0`")!@`OX\4`+&/$`"PCP@`X`,@`+TG``````````#(_[TG,`"_KRP`MZ\H
+M`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O):"``"6PH``EN,``)8#@`"6(
+M``````(\X&A2)````CP``%4D```"/```4R1`$!$`(1!1`,`8`@`A&'(`0!`"
+M`"$05@"`$`(`(1!2`"4@@`(``&6,"?B@`@``1HP!`!`F/P`",@0`0%0!`#$F
+M"?A@`@$`!"0!`#$F$``B+NS_0!1`$!$`)8@``````CQ@:E(D```"/```520`
+M``(\``!3),`0$0`A&%(`)1!@`"4@@`(``&6,"?B@`@0`1HP!`!`F/P`",@0`
+M0%0!`#$F"?A@`@$`!"0!`#$F10`B+O'_0!3`$!$`)8@``````CR(;%(D```"
+M/```520```(\``!3)$`0$0`A$%$`@!@"`"$8<@`A$%<`@!`"`"$04@`E((`"
+M``!EC`GXH`(``$:,`0`0)C\``C($`$!4`0`Q)@GX8`(!``0D`0`Q)D``(B[M
+M_T!40!`1`#``OX\L`+>/*`"VCR0`M8\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`
+MX`,X`+TGT/^])R@`OZ\D`+6O(`"TKQP`LZ\8`+*O%`"QKQ``L*\EH(``)9B@
+M`"6H`````&26P!*"+$8`0!`E@```</>")`4``R0:`$,`$!````$`8%`-``<`
+M"P!`5```9)9`$`0`X.Y1)&9F`CQG9D(T&``B`A`0``"#$`(`PQ\1`!,``!`C
+MB$,`4/>")`4``R0:`$,`$!````$`8%`-``<`M0!`%"40``!`$`0`H.Y1)&9F
+M`CQG9D(T&``B`A`0``"#$`(`PQ\1`".(0P`!`!4D@(@1`````CP``$(D_P`D
+M,@GX0``(``4D)8A``````CP``$(D)2"``@GX0``$H@4T)3A`````8Y:T"0(D
+M"0!B5.__!B0```(\``!")"4@@`($H@4T"?A``!``YC2````0`)$1`````CP`
+M`$(D)2"``@2B!30)^$``)##F`'@``!``D1$`!0`")!L`@@`0&````0!`4`T`
+M!P#__V,P`@`")!\`8E0``&26/!6"+!P`0%```&26``!CEO[_8R3__V,P@!`#
+M`"$00P!`$`(`__\#/(!$8S0A$$,`ZU$$/!^%A#08`$0`$"```,,@!`##%P(`
+M(R""````$#P``!`F`0"$)`GX``((``4D)8A``"4@```)^``"`@`%)%```!`E
+M@$``%``")!L`@@`0&````0!`4`T`!P`7`&!4``!DE@`4@BP4`$!4``!DED#M
+M@B1F9@0\9V:$-!@`1``0(```PR`$`,,7`@`C(((````0/```$":`(`0`"?@`
+M`@@`!20EB$```P`$)`GX``("``4D,P``$"6`0``*``(D&P""`!`8```!`$!0
+M#0`'`!0`8%0``&260.V")&9F!#QG9H0T&`!$`!`@``"#(`0`PQ<"`",@@@``
+M`!`\```0)D`@!``)^``""``%)"6(0``"``0D"?@``@(`!209```0)8!```4`
+M`B0;`((`$!@```$`0%`-``<`)0!@%"40``!`[80D9F8"/&=F0C08`((`$!``
+M`$,0`@##)P0````0/```$"8C($0`"?@``@@`!20EB$```0`$)`GX``("``4D
+M)8!```"1$0"`$!``)9!"`D`0%0`ED$("`1!2-@``$#P``!`F)2"``IR8!30)
+M^``"_P!&,@*2$@`E((`"V)@%-`GX``)_`$8R-!*3K@$``B0H`+^/)`"UCR``
+MM(\<`+./&`"RCQ0`L8\0`+"/"`#@`S``O2?__Z,D!P!B+!(`0!#L+X2,```"
+M/+AT0B2`&`,`(1AB````8HP(`$````````@`X`,E$(``"`#@`P0`@B0(`.`#
+M"`"")`@`X`,,`((D"`#@`ZP`@B0(`.`#)1```*C_O2=4`+^O4`"^KTP`MZ](
+M`+:O1`"UKT``M*\\`+.O.`"RKS0`L:\P`+"O6`"DKR7PH``E@.``___6,"6@
+M@``<`*"O(`"@KR0`H*\H`*"O["^3CA`LER8"`,*7\`%#,-```B1%`&(0):@`
+M`-$`8B@(`$`04`$")*```B0W`&(0P``")#T`8A`E$```^P$`$%0`OX\*`&(0
+M40%B*`8`0!``"`(D0`$")`4`8A`E$```\@$`$%0`OX_O`6(4)1``````PI=?
+M\$(DZP1"+`8`0%```,*75!."EAP`HJ]6$X.6&@``$"``HZ]TZT(D\`!"+`8`
+M0%```,*76!."EAP`HJ]:$X.6$0``$"``HZ^$ZD(DX0!"+`8`0%```,*77!."
+MEAP`HJ]>$X.6"```$"``HZ]=%D(L!@!`5-X2A99@$X*6'`"BKV(3@Y8@`*.O
+MWA*%EBP3@I8/```0&`"BKVP3@Y8D`*.O<!."EB@`HJ_@$H66+A.#E@<``!`8
+M`*.O;A."EB0`HJ\H`**OXA*%EC`3@Y88`*.O)2```````CR(;T8D@!`$`"$0
+M8@+`&`0`(1AF``0`8XP!`(0D^?^`$```0ZPE(```!`!F)@```CR0;T<D@!`$
+M`"$0P@!`&`0`(1AD`$`8`P`A&'8`@!@#`"$89P```&.,`0"$)/7_@!```$.L
+M)2```````CRH;T8D@!`$`"$04P!`&`0`(1AD`$`8`P`A&'8`@!@#`"$89@``
+M`&.,`0"$)/7_@!`(`$.L)2````0`9B8```(\P&]')(`8!``A&&8`0!`$`"$0
+M1`!`$`(`(1!6`(`0`@`A$$<```!"C`@`8JP!`(0D*`""+/3_0%2`&`0`#`!Q
+M)A``H*\```(\``!2)"4@(`(!``8D"?A``BX!!R0```66$`"@KR4@(`("``8D
+M"?A``@X!!R0"``66$`"@KR4@(`("``8D"?A``@$!!R0"`,*70`!","L`0!`#
+M`!`D'`#BC@(`1800`+"O)2`@`@$`!B0)^$`"J``')!P`XHX$`$6$$`"PKR4@
+M(`(!``8D"?A``JD`!R0<`.*.!@!%A!``L*\E("`"`0`&)`GX0`*J``<D'`#B
+MC@@`1800`+"O)2`@`@$`!B0)^$`"K@`')!P`XHX*`$6$$`"PKR4@(`(!``8D
+M"?A``J\`!R0<`.*.#`!%A!``L*\E("`"`0`&)`GX0`*P``<D`@#"EX``0C`1
+M`$`0#`!Q)A``H*\``!`\```0)B4@(`(D`*6/`P`&)`GX``(?`0<D$`"@KR4@
+M(`(H`*6/`P`&)`GX``(B`0<D$```$%@`HX\0`*"O```0/```$"8E("`"'`"E
+MCP,`!B0)^``"%P$')!``H*\E("`"(`"ECP,`!B0)^``"&@$')%@`HX_4`6*4
+M\`!",-#_0B1``$(L*P!`4%@`HX_4`624-0"#.`$`8RQ%`((X`0!"+"488@`'
+M`&`4#`!R)D8``B0$`((0-@`")!X`@A18`*./#`!R)@(`$200`+&O```0/```
+M$"8E($`"`@`%)`(`!B0)^``"6@`')!``L:\E($`"`@`%)`(`!B0)^``"7``'
+M)!``L:\E($`"`@`%)`(`!B0)^``"7@`')!``L:\E($`"`@`%)`$`!B0)^``"
+M_@`')%@`HX_2`6*40@!"+"4`0!0E(```#`!R)@$``B00`**O```0/```$"8E
+M($`"`0`%)`$`!B0)^``"&0$')`,`$200`+&O)2!``@$`!20"``8D"?@``@$`
+M!R00`+&O)2!``@$`!20"``8D"?@``@,`!R00`+&O)2!``@$`!20!``8D"?@`
+M`HL`!R00`+&O)2!``@$`!20!``8D"?@``HP`!R0E(```!`!E)@```CR`<T8D
+M@!@$`"$890!`$`0`(1!$`$`0`@`A$%8`@!`"`"$01@```$*,J`!BK`$`A"0-
+M`((L]/]`5(`8!``"`,*70`!",`D`0!"L`&0F'`#BC@``1800`*"O```"/```
+M0B0"``8D"?A``"4`!R2L`'$F$`"@KP```CP``%(D)2`@`A@`I8\&``8D"?A`
+M`@X`!R0``,*/`,`#/"000P`2`$`0)2`@`@(`T)<`0!`R`0`0+B.`$``'`!`R
+M"``0)A``H*\/``4D!``&)`GX0`(Z``<D$`"@KR4@(`(E*``"!``&)`GX0`)&
+M``<D)8```````CR(;U8D```"/```4B0```(\``!1),`8$``A&'8`@!`0`"$0
+M8@)8`*2/``!EC`GX0`(``$:,`0"U)C\`HC($`$!4`0`0)@GX(`(!``0D`0`0
+M)O#_`!(```(\)8```)!O5R0$`'$F```"/```5B0```(\``!2)$`0$``A$%``
+MP!`"`"$05P"`&!``(1@C`E@`I(\``$6,"?C``@``9HP!`+4F/P"B,@0`0%0!
+M`!`F"?A``@$`!"0!`!`F[O\`$@```CPE@```J&]6)````CP``%(D```"/```
+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
+MAX0A&'8```!BA!``HJ\)^,`#)2```D`8$``A&'4```!BI``4`@`#%`(`*A!2
+M``X`0!0!``(F0``"+@L`0!`!``(F)1```@$``R;__W`P0!`"`"$050```%*D
+M0``"+OG_0!0E$``"`0`")O__4#!```(NS_]`%$`0$0`!``(D/`"_CS@`OH\T
+M`+>/,`"VCRP`M8\H`+2/)`"SCR``LH\<`+&/&`"PCP@`X`-``+TG)4"``'X`
+M`I5^``2%```#A2,@@P!_`(0H@O]")``4`@`"`(`0`TP"````"85^``:%___"
+M)"4X0``J$$8`#0!`$#\`!"3__X(D`!0"``,D`@!`$`0`(1!(````0X0J&.,`
+M)Q`$`,(7`@`D&&(`]O]@5/__@B0E&(``/P`')/__8B0E($``!```$/__0C`#
+M'`(`__]D)/__@C`_`$(L!@!`$$`0`P`A$$@```!"A"H01@#V_T`0`!0$``X`
+M8!1`$`<`%P#@!"40(`%`$`<`(1!%``(`0Y0``$.D___B)``4`@`#/`(`^?_C
+M!$`0!P`(`.`#)1`@`2$010```$.D_O_")``4`@`#-`(`___B)``4`@`#/`(`
+MVO_C!/__8B0E$"`!"`#@`P`````E6(``0``,)'X`8I5^`&2%``"CA",@@P!_
+M`(0H@O]")``4`@`"`(`0`VP"````K81^`&F%__\B)25`0``J$$D`#0!`$#\`
+M!"3__X(D`!0"``,D`@!`$`0`(1!+````0X0J&`,!)Q`$`,(7`@`D&&(`]O]@
+M%/__@B1^`**4``#BI"5`@``_``HD)2!@`0``XH0J$$D`"`!`4"5@``#__P(Q
+M`0!"+"L8#``D$$,`!P!`$``````E8```)2"@``,``!`_``@D`!0"``-$`@`(
+M```9__\",4`0"``A$$0```!"A"H020#W_T`0__\")?__`C$!`$(L`0"#+200
+M0P`.`$`00!`*`!@`0`4E$*`!0!`*`"$01@`"`$.4``!#I/__0B4`%`(``U0"
+M`/G_0P5`$`H`"`#@`R40H`$A$$8`)1B(`0``0Z3^_R(E`!0"``-,`@#__T(E
+M`!0"``-4`@#,_T,%``#BA"40H`$(`.`#`````.C_O2<4`+^O$`"PKR6`@`!X
+M1@2.!0"`$````CP``$(D"?A```````!X1@"N["\$C@4`@!````(\``!")`GX
+M0```````["\`KA0`OX\0`+"/"`#@`Q@`O2<$`*2$)3````$`!R0$`*@D@!`'
+M`"$01P"`$`(`(1@"`0``8I0J$$0`!`!`4`$`YR0E,.````!DA`$`YR0$`.(H
+M]/]`%(`0!P"`&`8`(1AF`(`8`P`(`*(D(2!B``@`B(0A$$,```!)A`$`!R2`
+M$`8`(1!&`$`8`@`(`*4D(1!G`$`P`@`A$,4`"`!$A"H0B``$`$`0`0#G)"5`
+M@``A$*8```!)A`0`XBCU_T!4(1!G`$`0"0`C$`(!`!0"``@`X`,#%`(`T/^]
+M)RP`OZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O):B``"6@H``EL.``
+M``#`I`(`@I9``4(P0`$#)`0`0Q0E**`"W!^HCA,``!#8'Z>6`@""EM``0C#`
+M`$,X`0!C+-``0C@!`$(L)1AB``0`8%`"`(.6]!^HC`<``!#P'Z>4H`!C,*``
+M!"29`&04`0`").@?J(SD'Z>4E0#@&"40`````(.6```"E2L08@`;`$!4`@`"
+ME8`0!P`A$$<`@!`"`"$01P"`$`(`(1`"`:S_0I0K$$,`&@!`$"5(``"`*`<`
+M(2BG`(`H!0`A**<`@"@%`"$H!0&N_Z*4``#"I`(``CR,'4(D)2"@`@GX0`"L
+M_Z4D``#"IG8``!`!``(D``#"I`(``CR,'4(D)2"@`@GX0``E*``!``#"IFT`
+M`!`!``(D%0#@$"4@`````(.6```"E2L00P`1`$`0@!`$`"5(@``!`(0D*A"'
+M``P`0!"`$`0`(1!$`(`0`@`A$$0`@!`"`"$02````(.6``!"E"L00P#S_T!4
+M)4B``(`0!``A$$0`@!`"`"$01`"`$`(`(2A(````LI2`$`D`(1!)`(`0`@`A
+M$$D`@!`"`"&82````&>6(Y!'`C4`0%J`$`0``@"CA`(`9(8C&&0```""EB,0
+M1P`8`&(`$A@`````````````&`"2`!(@```A&&0``````!H`<@`2&````0!`
+M4@T`!P``'@,``QX#````PZ0"`!$\C!TQ)@GX(`(E(*`")8!``"4@H`()^"`"
+M)2A@`B.``@(E(*`""?@@`B4H8`(``(.6``!DEB,89``8``,"$H``````````
+M````&`!2`!(0```A@`("`````!H`$@(2@````0!`4@T`!P``AA```X80````
+MT*82```0`0`")"$01`"`$`(`(1!$`(`0`@`A*$@```"#E@``HI0)`&)4)1``
+M``(`HI0``,*D`@`"/(P=0B0)^$``)2"@`@``PJ8!``(D+`"_CR@`MH\D`+6/
+M(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#,`"])\C_O2<T`+^O,`"VKRP`M:\H
+M`+2O)`"SKR``LJ\<`+&O&`"PKR6P@``EJ*``)9#```$`$R05`$`2)8@```(`
+M`CQ0'E0DP!`1`"&`H@(E(,`")2@``A``IB<)^(`"$@"G)P4`0!`0`**3!@`"
+MHA(`HI,"```0!P`"HB68```!`#$F*Q`R`O#_0!3`$!$`)1!@`C0`OX\P`+:/
+M+`"UCR@`M(\D`+./(`"RCQP`L8\8`+"/"`#@`S@`O2?@_[TG&`"_KQ0`L:\0
+M`+"O)8B@`"6`@`````(\``!")`GX0`#@``0D)1A```0`8!3L+P.N`@`#)"@`
+M`!```".N@``")'Q&`JX```(\``!")`GX0`"```0D)1A```0`8!1X1@.N`@`#
+M)!P``!```".N0``")'Q&`JX"``(\-!U")*@L`JX"``(\@`)")*PL`JX"``(\
+MP`=")+`L`JX"``(\*`1")+0L`JX"``(\'`A")+@L`JX"``(\Q!!")+PL`JX"
+M``(\;"%"),`L`JX```(\``!"),0L`JX!``(D&`"_CQ0`L8\0`+"/"`#@`R``
+MO2<```````````````#(_[TG,`"_KRP`MZ\H`+:O)`"UKR``M*\<`+.O&`"R
+MKQ0`L:\0`+"O):"``"6PH``EN,``)8#@`"6(``````(\X'12)````CP``%4D
+M```"/```4R1`$!$`(1!1`,`8`@`A&'(`0!`"`"$05@"`$`(`(1!2`"4@@`(`
+M`&6,"?B@`@``1HP!`!`F/P`",@0`0%0!`#$F"?A@`@$`!"0!`#$F$``B+NS_
+M0!1`$!$`)8@``````CQ@=E(D```"/```520```(\``!3),`0$0`A&%(`)1!@
+M`"4@@`(``&6,"?B@`@0`1HP!`!`F/P`",@0`0%0!`#$F"?A@`@$`!"0!`#$F
+MBP`B+O'_0!3`$!$`)8@``````CRX>E(D```"/```520```(\``!3)$`0$0`A
+M$%$`@!@"`"$8<@`A$%<`@!`"`"$04@`E((`"``!EC`GXH`(``$:,`0`0)C\`
+M`C($`$!4`0`Q)@GX8`(!``0D`0`Q)D``(B[M_T!40!`1`#``OX\L`+>/*`"V
+MCR0`M8\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,X`+TGT/^])R@`OZ\D`+6O
+M(`"TKQP`LZ\8`+*O%`"QKQ``L*\EH(``)9B@`"6H`````&26P!*"+$8`0!`E
+M@```</>")`4``R0:`$,`$!````$`8%`-``<`"P!`5```9)9`$`0`X.Y1)&9F
+M`CQG9D(T&``B`A`0``"#$`(`PQ\1`!,``!`CB$,`4/>")`4``R0:`$,`$!``
+M``$`8%`-``<`M0!`%"40``!`$`0`H.Y1)&9F`CQG9D(T&``B`A`0``"#$`(`
+MPQ\1`".(0P`!`!4D@(@1`````CP``$(D_P`D,@GX0``(``4D)8A``````CP`
+M`$(D)2"``@GX0``$H@4T)3A`````8Y:T"0(D"0!B5.__!B0```(\``!")"4@
+M@`($H@4T"?A``!``YC2````0`)$1`````CP``$(D)2"``@2B!30)^$``)##F
+M`'@``!``D1$`!0`")!L`@@`0&````0!`4`T`!P#__V,P`@`")!\`8E0``&26
+M/!6"+!P`0%```&26``!CEO[_8R3__V,P@!`#`"$00P!`$`(`__\#/(!$8S0A
+M$$,`ZU$$/!^%A#08`$0`$"```,,@!`##%P(`(R""````$#P``!`F`0"$)`GX
+M``((``4D)8A``"4@```)^``"`@`%)%```!`E@$``%``")!L`@@`0&````0!`
+M4`T`!P`7`&!4``!DE@`4@BP4`$!4``!DED#M@B1F9@0\9V:$-!@`1``0(```
+MPR`$`,,7`@`C(((````0/```$":`(`0`"?@``@@`!20EB$```P`$)`GX``("
+M``4D,P``$"6`0``*``(D&P""`!`8```!`$!0#0`'`!0`8%0``&260.V")&9F
+M!#QG9H0T&`!$`!`@``"#(`0`PQ<"`",@@@```!`\```0)D`@!``)^``""``%
+M)"6(0``"``0D"?@``@(`!209```0)8!```4``B0;`((`$!@```$`0%`-``<`
+M)0!@%"40``!`[80D9F8"/&=F0C08`((`$!```$,0`@##)P0````0/```$"8C
+M($0`"?@``@@`!20EB$```0`$)`GX``("``4D)8!```"1$0"`$!``)9!"`D`0
+M%0`ED$("`1!2-@``$#P``!`F)2"``IR8!30)^``"_P!&,@*2$@`E((`"V)@%
+M-`GX``)_`$8R-!*3K@$``B0H`+^/)`"UCR``M(\<`+./&`"RCQ0`L8\0`+"/
+M"`#@`S``O2?`_[TG/`"_KS@`OJ\T`+>O,`"VKRP`M:\H`+2O)`"SKR``LJ\<
+M`+&O&`"PKR6H@`#__]0P)?"@`B68```"`**4\`%#,,```B00`&(0["_2C\$`
+M8B@&`$`0T``")*```B0'`&(0)1```.D``!`\`+^/!@!B$"40``#E```0/`"_
+MCV03Q9<#```09A/6EV@3Q9=J$]:7)2```````CRX?48D@!`$`"$00@+`&`0`
+M(1AF``0`8XP!`(0D^?^`$```0ZPE(```!`!&)@```CS`?4<D@!`$`"$0P@!`
+M&`0`(1AD`$`8`P`A&'0`@!@#`"$89P```&.,`0"$)/7_@!```$.L)2``````
+M`CS8?48D@!`$`"$04@!`&`0`(1AD`$`8`P`A&'0`@!@#`"$89@```&.,`0"$
+M)/7_@!`(`$.L)2````0`1B8```(\\'U')(`8!``A&&8`0!`$`"$01`!`$`(`
+M(1!4`(`0`@`A$$<```!"C`@`8JP!`(0D&P""+/3_0%2`&`0`#`!1)A``H*\`
+M`!`\```0)B4@(`(#``8D"?@``J@`!R00`*"O)2`@`B4HP`(#``8D"?@``J4`
+M!R0E(````0`"/'B`122`&`0`(1AR`$`0!``A$$0`0!`"`"$05`"`$`(`(1!%
+M````0HQX`&*L`0"$)`,`@BST_T`4@!@$`"6```````(\N'U6)````CP``%0D
+M```"/```423`&!``(1AV`(`0$``A$$(")2"@`@``98P)^(`"``!&C`$`<R8_
+M`&(R!`!`5`$`$"8)^"`"`0`$)`$`$";P_P`2```"/"6```#`?5<D!`!1)@``
+M`CP``%8D```"/```5"1`$!``(1!0`,`0`@`A$%<`@!@0`"$8(P(E(*`"``!%
+MC`GXP`(``&:,`0!S)C\`8C($`$!4`0`0)@GX@`(!``0D`0`0)N[_`!(```(\
+M)8```-A]5B0```(\``!4)````CP``%$D0!`0`"$04`#`$`(`(1!6`(`8$``A
+M&'(`)2"@`@``18P)^(`""`!FC`$`<R8_`&(R!`!`5`$`$"8)^"`"`0`$)`$`
+M$";N_P`2```"/"6```#P?5<D!`!1)@```CP``%8D```"/```5"1`$!``(1!0
+M`,`0`@`A$%<`@!@0`"$8<0`E(*`"``!%C`GXP`((`&:,`0!S)C\`8C($`$!4
+M`0`0)@GX@`(!``0D`0`0)AL``B[N_T`40!`0`"6````!``(\>(!6)````CP`
+M`%0D```"/```421`$!``(1!0`,`0`@`A$%8`@!@0`"$8<@`E(*`"``!%C`GX
+M@`)X`&:,`0!S)C\`8C($`$!4`0`0)@GX(`(!``0D`0`0)@,``B[N_T`40!`0
+M`,0OP*\!``(D/`"_CS@`OH\T`+>/,`"VCRP`M8\H`+2/)`"SCR``LH\<`+&/
+M&`"PCP@`X`-``+TG__^C)`<`8BP2`$`0["^$C`$``CS`@$(D@!@#`"$88@``
+M`&*,"`!````````(`.`#)1"```@`X`,$`((D"`#@`P@`@B0(`.`##`"")`@`
+MX`-X`((D"`#@`R40````)`0`___&,`,D!`!`$`8`(4"B````HI0J$((`!`!`
+M$!``J8\``""M"`#@`P``X*S^_P*5*A""``X`0!0E&*``___")```(JT(`.`#
+M``#BK$,0`@```"*M"`#@`P``XJQ#$`(```#BK`$`0B0(`.`#```BK2L0:``,
+M`$`0````````8I3R_T00(Q!E``(`8I0J$((`\O]`%",090`"`&,D*Q!H`/?_
+M0%0``&*4"`#@`P````"X_[TG1`"_KT``OJ\\`+>O.`"VKS0`M:\P`+2O+`"S
+MKR@`LJ\D`+&O(`"PKT@`I*\ED.``6`"TCV``OH\`+`4``RP%```T!@`#-`8`
+M7`"SET`4!0`#A`(`)8@```(`8RY0`&`4)1```",0Q0#__T(P*Q!1`$L`0!0!
+M``(D`@`"//@L5R3__W8F(Q#%`/__53`<`*(G$`"BKR4@``(E*$`")3!@`@GX
+MX`(8`*<G'`"BCP0`0!08`**/`0`")!P`HJ\8`**/!`!6%!@`HH_^_V(F&`"B
+MKQ@`HH]`(`(`(1B2`!P`HH]`$`(`(1!2````8X0``$*$!`!B%!@`IH\A$)0`
+M&0``$```0Y1`,`8`(1#2````1X0C*`<"'`"CCT`8`P`A$'0```!"E!@`H@`2
+M*```(1AR````9(0C&)``(3#4````PI08`&(`$A@``"$HHP`C((<`&@"D`!(H
+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
+M0Y0``$.D`0!S)@0`8B[Y_T`40!`3`(``(BX+`$`0=`"_CT`0$0"4`*6/(1!%
+M`/[_0Y0``$.D`0`Q)H``(B[Y_T`40!`1`'0`OX]P`+Z/;`"WCV@`MH]D`+6/
+M8`"TCUP`LX]8`+*/5`"QCU``L(\(`.`#>`"])[#_O2=,`+^O2`"VKT0`M:]`
+M`+2O/`"SKS@`LJ\T`+&O,`"PKR60@``EF.``):!``GA&58X"`&*6T`!",,``
+M0S@!`&,LT`!".`$`0BPE&&(`!P!@%/PG428"`&.6H`!C,*``!"3H(Y$F6P!D
+M%"40`````!`\```0)B4@0`()^``";*(%-`\`5C```&66*`"B)Q``HJ\@`*(G
+M%`"BKV``HH\8`**O'`"UKP(``CSD+T(D)2!``B4P(`()^$``)3C``B4@0`()
+M^``"6*(%-/__`SS_/V,T)!!#`!P`)I;__\8D@#,&``#`QC````,\``!C)"4@
+M0`)8H@4T"?A@`"4P1@`H`**'!`!`$"@`HY<C$`,``@``$/0O@J;T+X"F@*(1
+M-"6```````(\``!3),`8$``A&'4```!GD`(`8I``$@(`)3CB``0`8I``%`(`
+M)3CB``8`9I``-@8`)2!``B4H(`()^&`")3#F``$`$"8@``(N[O]`%`0`,28@
+M`*:7`#$&`/`#QC`E,,8"(@"BEX`2`@``_$(P)3#"`"0`HI<`%`(`/P`#/"00
+M0P`E,,(`)@"CEX`=`P#`#P(\)!AB`````CP``$(D)2!``FRB!30)^$``)3##
+M``$``B1,`+^/2`"VCT0`M8]``+2//`"SCS@`LH\T`+&/,`"PCP@`X`-0`+TG
+MZ/^])Q0`OZ\0`+"O)8"``'A&!(X%`(`0```"/```0B0)^$```````'A&`*[L
+M+P2.!0"`$````CP``$(D"?A```````#L+P"NI"P$C@4`@!````(\``!")`GX
+M0```````I"P`KA0`OX\0`+"/"`#@`Q@`O2<E(````P`')`@`IB0,`*4D(QCD
+M`$`0`P`A$$,`P!@"`"$0PP```$*4!`!`4`$`A"0A$&4`"`#@`P@`0H0$`((L
+M]/]`%",8Y``E$````!0"``@`X`,#%`(`)3````@`IR0,`*4D0!`&`"$@1@#`
+M$`0`(1#B````0Y0'`&!0`0#&)(`0!``A$$,`0!`"`"$010`(`.`#!@!"A`0`
+MPBSR_T!40!`&`"40````%`(`"`#@`P,4`@#(_[TG-`"_KS``OJ\L`+>O*`"V
+MKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6H@``EL*``);C``"7PX``E,*`"
+M``#@I@(`PI;0`$(PP`!#.`$`8RS0`$(X`0!"+"488@`'`&`4_">E)@(`PY:@
+M`&,PH``$).@CQ22F`&04)1```!0`II08`+$DH@#`$"40`````,26```BEBL0
+M@@`3`$`4`@`"/$`0!@`A$$8``!D"`"$00P!`$`(`(1`B`IK_0I0K$$0`%@!`
+M$"4H``!`@`8`(8`&`B408``A@`("0(`0`"&`,`)^```0FO\0)E`Y0B0E(*`"
+M"?A``"4H(`(``.*F`@`"//@X0B0E(*`""?A``"4H(`(``,*G?@``$`$``B05
+M`,`0)2``````PY8``"*6*Q!#`!$`0!!`$`0`)2B```$`A"0J$(8`#`!`$$`0
+M!``A$$0``!D"`"$00P!`$`(`(1!1````PY8``$*4*Q!#`//_0%0E*(``0!`$
+M`"$01```&0(`(1!#`$`0`@`AH%$```"2ED`0!0`A$$4``!D"`"$00P!`$`(`
+M(9A1````8I8CD$("00!`6D`0!``"`!$\4#DQ)B4@H`()^"`")2B``B6`0``E
+M(*`""?@@`B4H8`(C@`(")2"@`@GX(`(E*&`"``##E@``9)8C&&0`&``#`A*`
+M`````````````!@`4@`2$```(8`"`@`````:`!("$H````$`0%(-``<``(80
+M``.&$````/"F`@`1//@X,28E(*`""?@@`B4H@`(E@$``)2"@`@GX(`(E*&`"
+M(X`"`B4@H`()^"`")2A@`@``PY8``&26(QAD`!@``P(2@``````````````8
+M`%(`$A```"&``@(`````&@`2`A*````!`$!2#0`'``"&$``#AA````#0IQ<`
+M`!`!``(D(1!$```9`@`A$$,`0!`"`"&`40```,.6```"E@X`8E0E$````@`"
+M/%`Y0B0E(*`""?A``"4H``(``.*F`@`"//@X0B0E(*`""?A``"4H``(``,*G
+M`0`")#0`OX\P`+Z/+`"WCR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(
+M`.`#.`"])\C_O2<T`+^O,`"VKRP`M:\H`+2O)`"SKR``LJ\<`+&O&`"PKR6P
+M@``EJ*``)9#```$`$R05`$`2)8@```(``CRL.50DP!`1`"&`H@(E(,`")2@`
+M`A``IB<)^(`"$@"G)P4`0!`0`**3!@`"HA(`HI,"```0!P`"HB68```!`#$F
+M*Q`R`O#_0!3`$!$`)1!@`C0`OX\P`+:/+`"UCR@`M(\D`+./(`"RCQP`L8\8
+M`+"/"`#@`S@`O2?@_[TG&`"_KQ0`L:\0`+"O)8B@`"6`@`````(\``!")`GX
+M0`"$``0D)1A```0`8!3L+P.N`@`#)#```!```".N``$")'Q&`JX```(\``!"
+M)`GX0````00D)1A```0`8!1X1@.N`@`#)"0``!```".N```"/```0B0)^$``
+M``8$)"480``$`&`4I"P#K@(``R0:```0```CK@(``CR$.$(DJ"P"K@(``CP@
+M(T(DK"P"K@(``CR<+$(DL"P"K@(``CS()$(DM"P"K@(``CQ@*$(DN"P"K@(`
+M`CR$-D(DO"P"K@(``CSP/$(DP"P"K@```CP``$(DQ"P"K@$``B08`+^/%`"Q
+MCQ``L(\(`.`#(`"])P``````````R/^])S``OZ\L`+>O*`"VKR0`M:\@`+2O
+M'`"SKQ@`LJ\4`+&O$`"PKR6@@``EL*``);C``"6`X``EB````0`"/."`4B0`
+M``(\``!5)````CP``%,D0!`1`"$040#`&`(`(1AR`$`0`@`A$%8`@!`"`"$0
+M4@`E((`"``!EC`GXH`(``$:,`0`0)C\``C($`$!4`0`Q)@GX8`(!``0D`0`Q
+M)AX`(B[L_T`40!`1`"6(```!``(\L(-2)````CP``%4D```"/```4R3`$!$`
+M(1A2`"408``E((`"``!EC`GXH`($`$:,`0`0)C\``C($`$!4`0`Q)@GX8`(!
+M``0D`0`Q)H``(B[Q_T`4P!`1`"6(```!``(\L(=2)````CP``%4D```"/```
+M4R1`$!$`(1!1`(`8`@`A&'(`(1!7`(`0`@`A$%(`)2"``@``98P)^*`"``!&
+MC`$`$"8_``(R!`!`5`$`,28)^&`"`0`$)`$`,29``"(N[?]`5$`0$0`P`+^/
+M+`"WCR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#.`"])]#_O2<H
+M`+^O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O):"``"68H``EJ`````!DEL`2
+M@BQ&`$`0)8```'#W@B0%``,D&@!#`!`0```!`&!0#0`'``L`0%0``&260!`$
+M`.#N421F9@(\9V9"-!@`(@(0$```@Q`"`,,?$0`3```0(XA#`%#W@B0%``,D
+M&@!#`!`0```!`&!0#0`'`*<`0!0E$```0!`$`*#N421F9@(\9V9"-!@`(@(0
+M$```@Q`"`,,?$0`CB$,``0`5)("($0````(\``!")/\`)#()^$``"``%)"6(
+M0`````(\``!")"4@@`()^$``!*(%-"4X0````&.6M`D")`D`8E3O_P8D```"
+M/```0B0E((`"!*(%-`GX0``0`.8T<@``$`"1$0````(\``!")"4@@`($H@4T
+M"?A``"0PY@!J```0`)$1``4``B0;`((`$!@```$`0%`-``<`__]C,`(``B0?
+M`&)4``!DECP5@BP<`$!0``!DE@``8Y;^_V,D__]C,(`0`P`A$$,`0!`"`/__
+M`SR`1&,T(1!#`.M1!#P?A80T&`!$`!`@``##(`0`PQ<"`",@@@```!`\```0
+M)@$`A"0)^``""``%)"6(0``E(```"?@``@(`!21"```0)8!``!0``B0;`((`
+M$!@```$`0%`-``<`$`!@5```9)8`%((L#0!`5```9)9`[8(D9F8$/&=FA#08
+M`$0`$"```,,@!`##%P(`(R""````$#P``!`F)0``$(`@!``*``(D&P""`!`8
+M```!`$!0#0`'``T`8%0``&260.V")&9F!#QG9H0T&`!$`!`@``"#(`0`PQ<"
+M`",@@@```!`\```0)A(``!!`(`0`!0`")!L`@@`0&````0!`4`T`!P`E`&`4
+M)1```$#MA"1F9@(\9V9"-!@`@@`0$```0Q`"`,,G!````!`\```0)B,@1``)
+M^``""``%)"6(0``!``0D"?@``@(`!20E@$```)$1`(`0$``ED$("0!`5`"60
+M0@(!$%(V```0/```$"8E((`"G)@%-`GX``+_`$8R`I(2`"4@@`+8F`4T"?@`
+M`G\`1C(T$I.N`0`")"@`OX\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#
+M,`"])\#_O2<\`+^O.`"^KS0`MZ\P`+:O+`"UKR@`M*\D`+.O(`"RKQP`L:\8
+M`+"O);B``/__U3`EH.`")4```"6P```E2```)?```"68```"`**4\`%#,-``
+M`B0N`&(0["^2CM$`8B@(`$`00`$")*```B0E`&(0P``")"8`8A`E$```.`$`
+M$#P`OX\#`&(04`$")#,!8A0E$`````"BE%_P0B3K!$(L!`!`4```HI14$XB6
+M&@``$%83EI9TZT(D\`!"+`0`0%```**46!.(EA,``!!:$Y:6A.I").$`0BP$
+M`$!0``"BE%P3B)8,```07A.6EET60BP*`$`4)2```&`3B)8'```08A.6EF03
+MB98#```09A.>EF@3B99J$YZ6)2````$``CRPBD8D@!`$`"$00@+`&`0`(1AF
+M``0`8XP!`(0D^?^`$```0ZPE(```!`!&)@$``CRXBD<D@!`$`"$0P@!`&`0`
+M(1AD`$`8`P`A&'4`@!@#`"$89P```&.,`0"$)/7_@!```$.L)2````$``CS0
+MBD8D@!`$`"$04@!`&`0`(1AD`$`8`P`A&'4`@!@#`"$89@```&.,`0"$)/7_
+M@!`(`$.L)2````0`1B8!``(\Z(I')(`8!``A&&8`0!`$`"$01`!`$`(`(1!5
+M`(`0`@`A$$<```!"C`@`8JP!`(0D)0""+/3_0%2`&`0``@"BE(``0C`P`$`0
+M#`!1)A``H*\``!`\```0)B4@(`(E*"`!`P`&)`GX``+Q``<D$`"@KR4@(`(E
+M*,`#`P`&)`GX``+N``<D`@`")!``HJ\E("`"`0`%)`$`!B0)^``"(P$'),P!
+MXXX)``(D!P!B$`H``B0D`&(4)2```-`!XI8$`$(L(0!`$`$``CP```(\``!"
+M)`8`!"0)^$```P`%)`,``R00`*.O```#/```8R0,`$0F)2A```,`!B0)^&``
+M@P`')!```!`E(```$`"@KP``$#P``!`F)2`@`B4H``$#``8D"?@``O<`!R00
+M`*"O)2`@`B4HP`(#``8D"?@``O0`!R0E(````0`"/&".122`&`0`(1AR`$`0
+M!``A$$0`0!`"`"$050"`$`(`(1!%````0HR@`&*L`0"$)`,`@BST_T`4@!@$
+M`"6````!``(\L(I6)````CP``%4D```"/```423`&!``(1AV`(`0$``A$$("
+M)2#@`@``98P)^*`"``!&C`$`<R8_`&(R!`!`5`$`$"8)^"`"`0`$)`$`$";P
+M_P`2`0`"/"6```"XBEXD!`!1)@```CP``%8D```"/```521`$!``(1!0`,`0
+M`@`A$%X`@!@0`"$8(P(E(.`"``!%C`GXP`(``&:,`0!S)C\`8C($`$!4`0`0
+M)@GXH`(!``0D`0`0)N[_`!(!``(\)8```-"*5B0```(\``!5)````CP``%$D
+M0!`0`"$04`#`$`(`(1!6`(`8$``A&'(`)2#@`@``18P)^*`""`!FC`$`<R8_
+M`&(R!`!`5`$`$"8)^"`"`0`$)`$`$";N_P`2`0`"/"6```#HBEXD!`!1)@``
+M`CP``%8D```"/```521`$!``(1!0`,`0`@`A$%X`@!@0`"$8<0`E(.`"``!%
+MC`GXP`((`&:,`0!S)C\`8C($`$!4`0`0)@GXH`(!``0D`0`0)B4``B[N_T`4
+M0!`0`"6````!``(\8(Y6)````CP``%4D```"/```421`$!``(1!0`,`0`@`A
+M$%8`@!@0`"$8<@`E(.`"``!%C`GXH`*@`&:,`0!S)C\`8C($`$!4`0`0)@GX
+M(`(!``0D`0`0)@,``B[N_T`40!`0`,0O@*X!``(D/`"_CS@`OH\T`+>/,`"V
+MCRP`M8\H`+2/)`"SCR``LH\<`+&/&`"PCP@`X`-``+TG__^C)`<`8BP2`$`0
+M["^$C`$``CRHCD(D@!@#`"$88@```&*,"`!````````(`.`#)1"```@`X`,$
+M`((D"`#@`P@`@B0(`.`##`"")`@`X`.@`((D"`#@`R40````)`0`___&,`,D
+M!`!`$`8`(4"B````HI0J$((`!`!`$!``J8\``""M"`#@`P``X*S^_P*5*A""
+M``X`0!0E&*``___")```(JT(`.`#``#BK$,0`@```"*M"`#@`P``XJQ#$`(`
+M``#BK`$`0B0(`.`#```BK2L0:``,`$`0````````8I3R_T00(Q!E``(`8I0J
+M$((`\O]`%",090`"`&,D*Q!H`/?_0%0``&*4"`#@`P````"X_[TG1`"_KT``
+MOJ\\`+>O.`"VKS0`M:\P`+2O+`"SKR@`LJ\D`+&O(`"PKT@`I*\ED.``6`"T
+MCV``OH\`+`4``RP%```T!@`#-`8`7`"SET`4!0`#A`(`)8@```(`8RY0`&`4
+M)1```",0Q0#__T(P*Q!1`$L`0!0!``(D`@`"/+1)5R3__W8F(Q#%`/__53`<
+M`*(G$`"BKR4@``(E*$`")3!@`@GXX`(8`*<G'`"BCP0`0!08`**/`0`")!P`
+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
+M$P`A$$@`0!`"`/X#0B0A0(("?P`*)``4!0`#/`(`(QB)`!@`9@`2&``````"
+ME2$00P``%`(``QP"`$`0$0"4`*V/(2A-`(``8B@#`$`0`0`Q)@(``!```*.D
+M``"JI`$`A"0J$(<`[O]`%",8B0`!`',F0`"CCRL08P)F_T!40`"DCP0`8BX+
+M`$`0@``B+D`0$P",`*2/(1!$`/[_0Y0``$.D`0!S)@0`8B[Y_T`40!`3`(``
+M(BX+`$`0=`"_CT`0$0"4`*6/(1!%`/[_0Y0``$.D`0`Q)H``(B[Y_T`40!`1
+M`'0`OX]P`+Z/;`"WCV@`MH]D`+6/8`"TCUP`LX]8`+*/5`"QCU``L(\(`.`#
+M>`"])[#_O2=,`+^O2`"VKT0`M:]``+2O/`"SKS@`LJ\T`+&O,`"PKR68@``E
+MH.``)9!@`GA&=8X"`(*6T`!",,``0S@!`&,LT`!".`$`0BPE&&(`!P!@%/PG
+M<28"`(*6H`!",*```R0"`$,0Z"-1)M0?428``!`\```0)B4@8`()^``";*(%
+M-`\`5C```(66*`"B)Q``HJ\@`*(G%`"BKV``HH\8`**O'`"UKP(``CR@3$(D
+M)2!@`B4P(`()^$``)3C``B4@8`()^``"6*(%-/__`SS_/V,T)!!#`!P`)I;_
+M_\8D@#,&``#`QC````,\``!C)"4@8`)8H@4T"?A@`"4P1@`H`**'!`!`$"@`
+MHY<C$`,``@``$/0O0J;T+T"F@*(1-"6```````(\``!2),`8$``A&'4```!G
+MD`(`8I``$@(`)3CB``0`8I``%`(`)3CB``8`9I``-@8`)2!@`B4H(`()^$`"
+M)3#F``$`$"8@``(N[O]`%`0`,28@`*:7`#$&`/`#QC`E,,8"(@"BEX`2`@``
+M_$(P)3#"`"0`HI<`%`(`/P`#/"000P`E,,(`)@"CEX`=`P#`#P(\)!AB````
+M`CP``$(D)2!@`FRB!30)^$``)3##``$``B1,`+^/2`"VCT0`M8]``+2//`"S
+MCS@`LH\T`+&/,`"PCP@`X`-0`+TGZ/^])Q0`OZ\0`+"O)8"``'A&!(X%`(`0
+M```"/```0B0)^$```````'A&`*[L+P2.!0"`$````CP``$(D"?A```````#L
+M+P"NI"P$C@4`@!````(\``!")`GX0```````I"P`KA0`OX\0`+"/"`#@`Q@`
+MO2<E(````P`')`@`IB0,`*4D(QCD`$`0`P`A$$,`P!@"`"$0PP```$*4!`!`
+M4`$`A"0A$&4`"`#@`P@`0H0$`((L]/]`%",8Y``E$````!0"``@`X`,#%`(`
+M)3````@`IR0,`*4D0!`&`"$@1@#`$`0`(1#B````0Y0'`&!0`0#&)(`0!``A
+M$$,`0!`"`"$010`(`.`#!@!"A`0`PBSR_T!40!`&`"40````%`(`"`#@`P,4
+M`@#(_[TG-`"_KS``OJ\L`+>O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"P
+MKR6H@``EL*``);C``"7PX````."F`@#"EM``0C#``$,X`0!C+-``0C@!`$(L
+M)1AB``<`8!3\)Z4F`@#"EJ``0C"@``,D`@!#$.@CA234'X4D%`"FE!@`L22B
+M`,`0)1``````Q)8``"*6*Q""`!,`0!0"``(\0!`&`"$01@``&0(`(1!#`$`0
+M`@`A$"("FO]"E"L01``6`$`0)2@``$"`!@`A@`8")1!@`"&``@)`@!``(8`P
+M`GX``!":_Q`F#%9")"4@H`()^$``)2@@`@``XJ8"``(\M%5")"4@H`()^$``
+M)2@@`@``PJ=^```0`0`")!4`P!`E(`````##E@``(I8K$$,`$0!`$$`0!``E
+M*(```0"$)"H0A@`,`$`00!`$`"$01```&0(`(1!#`$`0`@`A$%$```##E@``
+M0I0K$$,`\_]`5"4H@`!`$`0`(1!$```9`@`A$$,`0!`"`"&@40```)*60!`%
+M`"$010``&0(`(1!#`$`0`@`AF%$```!BEB.00@)!`$!:0!`$``(`$3P,5C$F
+M)2"@`@GX(`(E*(`")8!``"4@H`()^"`")2A@`B.``@(E(*`""?@@`B4H8`(`
+M`,.6``!DEB,89``8``,"$H``````````````&`!2`!(0```A@`("`````!H`
+M$@(2@````0!`4@T`!P``AA```X80````\*8"`!$\M%4Q)B4@H`()^"`")2B`
+M`B6`0``E(*`""?@@`B4H8`(C@`(")2"@`@GX(`(E*&`"``##E@``9)8C&&0`
+M&``#`A*``````````````!@`4@`2$```(8`"`@`````:`!("$H````$`0%(-
+M``<``(80``.&$````-"G%P``$`$``B0A$$0``!D"`"$00P!`$`(`(8!1````
+MPY8```*6#@!B5"40```"``(\#%9")"4@H`()^$``)2@``@``XJ8"``(\M%5"
+M)"4@H`()^$``)2@``@``PJ<!``(D-`"_CS``OH\L`+>/*`"VCR0`M8\@`+2/
+M'`"SCQ@`LH\4`+&/$`"PCP@`X`,X`+TGR/^])S0`OZ\P`+:O+`"UKR@`M*\D
+M`+.O(`"RKQP`L:\8`+"O);"``"6HH``ED,```0`3)!4`0!(EB````@`"/&A6
+M5"3`$!$`(8"B`B4@P`(E*``"$`"F)PGX@`(2`*<G!0!`$!``HI,&``*B$@"B
+MDP(``!`'``*B)9@```$`,28K$#("\/]`%,`0$0`E$&`"-`"_CS``MH\L`+6/
+M*`"TCR0`LX\@`+*/'`"QCQ@`L(\(`.`#.`"])^#_O2<8`+^O%`"QKQ``L*\E
+MB*``)8"``````CP``$(D"?A``*P`!"0E&$``!`!@%.PO`ZX"``,D,```$```
+M(ZX``0(D?$8"K@```CP``$(D"?A````!!"0E&$``!`!@%'A&`ZX"``,D)```
+M$```(ZX```(\``!")`GX0```!@0D)1A```0`8!2D+`.N`@`#)!H``!```".N
+M`@`"/$!50B2H+`*N`@`"/,`^0B2L+`*N`@`"/%A)0B2P+`*N`@`"/&A`0B2T
+M+`*N`@`"/,A#0B2X+`*N`@`"/$!30B2\+`*N`@`"/*A90B3`+`*N```"/```
+M0B3$+`*N`0`")!@`OX\4`+&/$`"PCP@`X`,@`+TG071H97)O<R`U,C$P````
+M`$%T:&5R;W,@-3(Q,0````!!=&AE<F]S(#4R,3$@*$901T$I`$%T:&5R;W,@
+M-3(Q,B`H1E!'02D`071H97)O<R`U,S$R(%=I4V]#``!!=&AE<F]S(#(S,34@
+M5VE3;T,``$%T:&5R;W,@,C,Q-R!7:5-O0P``071H97)O<R`R,S$S(%=I4V]#
+M``!!=&AE<F]S(#4T,C0O,C0R-````$%T:&5R;W,@-3(Q,@`````H4!8L6"@`
+M```````P"P``0`L``$`+``!("P``4`L``&@+``!P"P``@`L``!@-``"0"P``
+MH`L``.@+``"T"P``P`L``,P+``#X"P``&`T``!@-``!0#```8`P``'`,``!X
+M#```8`L``(0,``"4#```I`P``!@-```8#0``Y`P``!@-``#L#```&`T``!@-
+M```8#0``"`T``*#_H_^>_Z#_H_^@_T%2-3(Q,```05(U,C$Q``!!4C4R,3(`
+M`%)&-3$Q,0``4D8U,3$R``!21C(T,3,``%)&-30Q,P``4D5'3U!37T953D,`
+M```````````````````%``H`%``>`#(`1@!5`%H`7P!D```````*`!0`'@`H
+M`#(`/`!&`%``6@!D````P@```,0```#%````T````-H```#D````P@```,,`
+M``#4````\@````T!```H`0``SP```,H```````````````(`4"$!`$`!!`"@
+M``@`P``@`-``0`!0`0``````````)`&8&0`F$`8`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````S&<`````````````````````````
+M````````````````````^&<`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````/_______P``````````````F```1P````B8````
+M````#)@``*:.A`D0F````.`R/128``!K!P``')@````````@F`````("`B28
+M```.#@``*)@```$"`@HLF```_&\#`#"8````````-)@```X.```XF```!P``
+M`#R8`````0(`0)@`````8XE$F```G!9R$TB8```SMA@`3)@``#QAA!)0F```
+MX+CH#528``!92`<`6)@``+J^@'Y<F```7F8Z,6"8```('0``9)@```#.`0!H
+MF```D$&:0'"8```/````=)@``(````!XF```!`````"9````````!)D`````
+M```(F0````````R9`````(``$)D```,`````FP````````2;```@````")L`
+M`!`````,FP``,````!";```(````%)L``"@````8FP``*````!R;```$````
+M()L``"0````DFP``%````"B;```T````+)L```P````PFP``+````#2;```"
+M````.)L``"(````\FP``$@```$";```R````1)L```H```!(FP``*@```$R;
+M```!````4)L``"$```!4FP``$0```%B;```Q````7)L```D```!@FP``*0``
+M`&2;```%````:)L``"4```!LFP``%0```'";```U````=)L```T```!XFP``
+M+0```'R;```#````@)L``",```"$FP``$P```(B;```S````C)L```L```"0
+MFP``*P```)2;```'````F)L``"<```"<FP``%P```*";```W````I)L```\`
+M``"HFP``+P```*R;```O````L)L``"\```"TFP``+P```+B;```O````O)L`
+M`"\```#`FP``+P```,2;```O````R)L``"\```#,FP``+P```-";```O````
+MU)L``"\```#8FP``+P```-R;```O````X)L``"\```#DFP``+P```.B;```O
+M````[)L``"\```#PFP``+P```/2;```O````^)L``"\```#\FP``+P````":
+M```=````!)H``%T````(F@``G0````R:``#=````$)H``!T!```4F@``(0``
+M`!B:``!A````')H``*$````@F@``X0```"2:```Q````*)H``'$````LF@``
+ML0```#":```<````-)H``%P````XF@``*0```#R:``!I````0)H``*D```!$
+MF@``(````$B:```9````3)H``%D```!0F@``F0```%2:```P````6)H```4`
+M``!<F@``)0```&":``!E````9)H``*4```!HF@``*````&R:``!H````<)H`
+M`!\```!TF@``'@```'B:```8````?)H``%@```"`F@``F````(2:```#````
+MB)H```0```",F@``1````)":``"$````E)H``!,```"8F@``$@```)R:``!2
+M````H)H``)(```"DF@``T@```*B:```K````K)H``"H```"PF@``:@```+2:
+M``"J````N)H``!L```"\F@``&@```,":``!:````Q)H``)H```#(F@``V@``
+M`,R:```&````T)H```8```#4F@``!@```-B:```&````W)H```8```#@F@``
+M!@```.2:```&````Z)H```8```#LF@``!@```/":```&````])H```8```#X
+MF@``!@```/R:```&````U)@``"````#,F```!````,B8```&`08`G)@``&T`
+M``#`F````````-"8```4````"0D```````("!@8&!@8&`@(```````,`!@`)
+M`#P``````````````````````````````````/````#,````````````````
+M````"N(````@```*`@```1@```$```!`&`0````````%!%<9`"80!@``````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````#4N0``````````
+M```````````````````````````````````PN@``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````;`F/";0)`````````````/__
+M_____P```````"`````@````0````$````````8````&````!@``````````
+M`#`````5````%0```!T````5````0!````_\+P`/_"\`'_PO``_\+P!$$```
+M#_PO``_\+P`?_"\`#_PO`$@0```/_"\`#_PO`!_\+P`/_"\`3!````_\+P`/
+M_"\`'_PO``_\+P!0$```#_PO``_\+P`?_"\`#_PO`%00```/_"\`#_PO`!_\
+M+P`/_"\`6!````_\+P`/_"\`'_PO``_\+P!<$```#_PO``_\+P`?_"\`#_PO
+M`&`0```/_"\`#_PO`!_\+P`/_"\`9!````_\+P`/_"\`'_PO``_\+P!P$```
+M:`$``.`!``"X`0``:`$``#`0```P`@``X`$``+`````P`@``L!```)@-``"`
+M$0``2!\``)@-``#P$```X*```&A``0"`6```X*```!2`````!``$``@`"``P
+M`"``!``$'(```*>/C0[/CXT.E8]@`:>/C0X$F`````````,`````````````
+M`""8`````@("``("`@`"`0(``@("))@```X.```.#@``!P<```X.```HF```
+M`0`""@$``@H```$%`0`""C28```.#@``#@X```X.```.#@``.)@```<````'
+M````"P````L```!$F```G!9R$Z46<A.H%G(3G!9R$TB8``!GNA@`9[H8`&FZ
+M&`!INA@`4)@``."T*`S@M"@,X+0H#."T*`Q8F```+@V`?BX-@'XN#<!^+@V`
+M?ER8``!>73<Q7ETW,5Y=.C%>73<Q8)@``!"]```0O0``.+T``!"]``!DF```
+M`,X!``#.`0``S@$``,X!`!29```0)P``$"<``'P5```0)P``&)D``)`!``"0
+M`0``A````)`!``!$F0``(!#@;R`0X&\@">!O(!#@;X"A``#_%/\%_Q3_!?\4
+M_P7_&?\%U)@``!`````4````$````!`````,`````````"@```"<G(2$+```
+M`'Q\?'PT````!0```$``````````1`````@```!(````"````$P````0````
+M4`````````!4````'P`````(````````!`@````````("`````````P(````
+M````$`@````````4"````````!@(````````'`@````````@"````````"0(
+M````````,!(````````$@`````````B`````````#(`````````8@```````
+M`"2`````````*(```#`````L@```__\'`#"```#___\!-(```#$````X@```
+M`````#R`````````0(````````!$@````@```$B`````````5(````````!8
+M@`````````B8````````#)@``).0A"T0F````.`R?128``!K#P``')@`````
+M```LF```_F\"`#"8````````/)@````!`@!`F```>@%J($R8```\88025)@`
+M`%D(``!HF```D$&:0&R8``"!L`P%<)@```\```!TF```@````'B8```,````
+M`)D````````$F0````````B9````````#)D`````@``0F0```0```!R9```J
+M"0``()D````````DF0``!8H%`"B9```!````+)D````````PF0```````#29
+M````````.)D````````\F0``/P```$"9```$````2)D```````!,F0``````
+M`%"9````````5)D``$SQ4%U8F0``&````%R9``".:DL`A*$``/\%_P:(H0``
+M_P?_!XRA``#_"/\(D*$``/\)_PF4H0``_PK_"IBA``#_"_\+G*$``/\,_PR@
+MH0``_PW_#:2A``#_#O\/J*$``/\2_Q*LH0``_Q/_%+"A``#_%?\6M*$``/\7
+M_QFXH0``_QK_&[RA``#_'?\>P*$``/\@_R/$H0``_R7_)\BA``#_*?\LS*$`
+M`/\O_S'0H0``_S3_-]2A``#_.O\ZV*$``/\Z_SK<H0``_SK_.N"A``#_.O\Z
+MY*$``/\Z_SKHH0``_SK_.NRA``#_.O\Z\*$``/\Z_SKTH0``_SK_.OBA``#_
+M.O\Z_*$``/\Z_SH`FP````````2;```@````")L``!`````,FP``,````!";
+M```(````%)L``"@````8FP``!````!R;```D````()L``!0````DFP``-```
+M`"B;```,````+)L``"P````PFP```@```#2;```B````.)L``!(````\FP``
+M,@```$";```*````1)L``"H```!(FP``!@```$R;```F````4)L``!8```!4
+MFP``-@```%B;```.````7)L``"X```!@FP```0```&2;```A````:)L``!$`
+M``!LFP``,0```'";```)````=)L``"D```!XFP``!0```'R;```E````@)L`
+M`!4```"$FP``-0```(B;```-````C)L``"T```"0FP```P```)2;```C````
+MF)L``!,```"<FP``,P```*";```+````I)L``"L```"HFP``*P```*R;```K
+M````L)L``"L```"TFP``*P```+B;```K````O)L``"L```#`FP``*P```,2;
+M```K````R)L``"L```#,FP``*P```-";```K````U)L``"L```#8FP``*P``
+M`-R;```K````X)L``"L```#DFP``*P```.B;```K````[)L``"L```#PFP``
+M*P```/2;```K````^)L```(```#\FP``%@```-28```@````V)@``&@08```
+MF@``J0$````````$F@``Z0$``$`````(F@``*0```(`````,F@``:0```%`!
+M```0F@``F0$``)`!```4F@``V0$``-`!```8F@``&0```!`````<F@``60``
+M`$0````@F@``F0```(0````DF@``I0$``$@!```HF@``Y0$``(@!```LF@``
+M)0```,@!```PF@``R`$``!0````TF@``"````$(````XF@``2````((````\
+MF@``B````'@!``!`F@``F`$``+@!``!$F@``V`$``/@!``!(F@``&````!(`
+M``!,F@``6````%(```!0F@``F````)(```!4F@``I`$``'P!``!8F@``Y`$`
+M`+P!``!<F@``)````/P!``!@F@``9`````H```!DF@``I````$H```!HF@``
+MY````(H```!LF@``"@$``%H!``!PF@``2@$``)H!``!TF@``B@$``-H!``!X
+MF@``R@$```X```!\F@``"@```$X```"`F@``2@```(X```"$F@``B@```%X!
+M``"(F@``N@$``)X!``",F@``^@$``-X!``"0F@``.@````D```"4F@``>@``
+M`$D```"8F@``A@$``(D```"<F@``Q@$``'D!``"@F@``!@```+D!``"DF@``
+M1@```/D!``"HF@``A@```#D```"LF@``Q@```'D```"PF@``Q@```+D```"T
+MF@``Q@```+T!``"XF@``Q@```/T!``"\F@``Q@```#T```#`F@``Q@```'T`
+M``#$F@``Q@```+T```#(F@``Q@```/T```#,F@``Q@```/T```#0F@``Q@``
+M`/T```#4F@``Q@```/T```#8F@``Q@```/T```#<F@``Q@```/T```#@F@``
+MQ@```/T```#DF@``Q@```/T```#HF@``Q@```/T```#LF@``Q@```/T```#P
+MF@``Q@```/T```#TF@``Q@```/T```#XF@``Q@```/T```#\F@``Q@```/T`
+M```!````1@```&`````!````1@```&$````!````1@```&(````!````1@``
+M`&,````!````1@```&0````!````1@```&4````!````1@```&8````!````
+M1@```&<````!````1@```&@````!````1@```&D````!````1@```&H````!
+M````1@```&L````!````1@```&P````!````1@```'0````!````1@```'0`
+M```!````1@```'0````!````1@```'0````!````1@```'0````!````1@``
+M`'0````!````1@```'0````!````1@```'0````!````1@```'4````!````
+M1@```'8````!````1@```'<````!````1@```'@````!````1@```'D````!
+M````1@```'H````!````1@```'L````!````1@```'P````!````1@```'T`
+M```!````1@```'X````!````1@```'\````!````1@```(`````!````1```
+M`'P````!````1@```(@````!````1@```(P````!````1@```)`````!````
+M1@```)0````!````1@```)@````!````1@```)P````!````1@```*`````!
+M````1@```*0````!````1@```*@````!````1@```*P````!````1@```+``
+M```!````1@```+0``````@<`GA8+`&(6"@`Z%@D`'!8(`.H5!P":%04`2A4$
+M``,5`@!9%``````!`````P`&``D`/P`````````<!@$`'`8!`$@&`0!(!@$`
+M=`8!`'0&`0"@!@$`H`8!``D````$````!``!``$``0`&````1D<X````````
+M``````````0````!``$`!````$9'-P`````````````````#``$``0`!``,`
+M``!&1S8`````````````````!````````0`!````1D<U````````````````
+M``0``0`!`````````$9'-``````````````````$`````0```/[___]&1S,`
+M`````````````````P`!``$```#]____1D<R``````````````````0`````
+M````_/___T9',0`````````````````"``$``0```/K___]&1S``````````
+M````````````````````````````````````````````````````````%!!4
+M&0`F$`8`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````#P
+M)`$`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````&P)CPFT"0``
+M"`EL";0)``#_______\```4"#P<"#PH`#PD`#P```````````````"1'`0#0
+M1@$`V$8!`&A'`0#P1@$`8$<!`````````````````"`````@````0````$``
+M``````8````&````!@">%@L`8A8*`#H6"0`<%@@`ZA4'`)H5!0!*%00``Q4"
+M`%D4``"X"P$```````````"L7@$`^%X!`"!?`0"$80$`B%\!`(1A`0"$80$`
+MA&$!`(1A`0"$80$`O%\!`(1A`0"$80$`A&$!`(1A`0#,7P$`[%\!`(1A`0`P
+M8`$`5&`!`(1A`0!47P$`A&$!`(1A`0"$80$`H&`!`+1@`0"$80$`S&`!````
+M``!$80$`4&$!`%QA`0!H80$`=&$!```````&`````0````(````#````!```
+M``4```#T80$`*&(!``QD`0!\8@$`#&0!``QD`0`,9`$`#&0!``QD`0#$8@$`
+M#&0!``QD`0`,9`$`#&0!`.AB`0`,9`$`#&0!`/AB`0#08P$`#&0!``QD`0`,
+M9`$`#&0!``QD`0`L8P$`+&,!``QD`0"48P$```````````!`$```#_PO``_\
+M+P`?_"\`#_PO``_\+P!$$```#_PO``_\+P`?_"\`#_PO``_\+P!($```#_PO
+M``_\+P`?_"\`#_PO``_\+P!,$```#_PO``_\+P`?_"\`#_PO``_\+P!0$```
+M#_PO``_\+P`?_"\`#_PO``_\+P!4$```#_PO``_\+P`?_"\`#_PO``_\+P!8
+M$```#_PO``_\+P`?_"\`#_PO``_\+P!<$```#_PO``_\+P`?_"\`#_PO``_\
+M+P!@$```#_PO``_\+P`?_"\`#_PO``_\+P!D$```#_PO``_\+P`?_"\`#_PO
+M``_\+P`P$```,`(``.`!``"P````8`$``.`!``!P$```:`$``.`!``"X`0``
+MC`$``.`!``"P$```8`X``(`1```<'P``.#X``(`1``#P$```X*```&A``0"`
+M6```X+```&A``0`4@```Z`/H`^`&X`8@!"`$0`A`".`&X`8$F`````````,`
+M``````````````,````@F`````("`@`"`@(``@$"``("`@`"`@(DF```#@X`
+M``X.```'!P``#@X```X.``!$F```'!9R$R4<<A,B%W(3HA9R$R4<<A-@F```
+M$)T``!"=```8G0``&)T``!"=``!DF````,X!``#.`0``S@$``,X!``#.`0!H
+MF```D$&:0)!!FD"009I`D$&:0)!!FD`8F0``N`$``+@!``"$````"`$``+@!
+M```DF0``!8H%$`6*!1`%B@40!8H%$`6*!1`PH@``````````````````"`$`
+M```````,`````````#0````%````0`````````!$````"````$@````(````
+M3````!````!0`````````%0````?``````@````````$"`````````@(````
+M````#`@````````0"````````!0(````````&`@````````<"````````"`(
+M````````)`@```````!P$@```````#@0````````>!````````"X$```````
+M`/@0````````.!$```````!X$0```````+@1````````^!$````````X$@``
+M`````'@2````````N!(```````#X$@```````#@3````````>!,```````"X
+M$P```````/@3````````.!0```````!X%````````+@4````````^!0`````
+M```X%0```````'@5````````N!4```````#X%0```````#@6````````>!8`
+M``````"X%@```````/@6````````.!<```````!X%P```````+@7````````
+M^!<````````\$````````'P0````````O!````````#\$````````#P1````
+M````?!$```````"\$0```````/P1````````/!(```````!\$@```````+P2
+M````````_!(````````\$P```````'P3````````O!,```````#\$P``````
+M`#P4````````?!0````````$@`````````B`````````#(`````````@@```
+M`````"2`````````*(```#`````L@```__\'`#"```#___\!-(```#$````X
+M@````````#R`````````2(````````!4@````````%B`````````7(```(_'
+M#P#`@```&C""*L2```#@`=P%R(```!`G0!_,@`````#T`="````<'@``U(``
+M`*JJ`@#8@```554``MR`````````X(```/_____D@```__\``.B`````````
+M[(````````#P@````````/2`````````^(````````#\@```B`````"'````
+M````!(<``(P````(AP``Y`````R'``#5`@``$(<````````4AP```````!B'
+M``"@````'(<``,D!```@AP``+````"2'```L````*(<``#`````LAP``/```
+M`#"'```L````-(<``"P````XAP``,````#R'```\````0(<```````!$AP``
+M`````$B'````````3(<```````!0AP```````%2'````````6(<```````!<
+MAP```````&"'``#5````9(<``-\```!HAP```@$``&R'```Z`0``<(<``'4`
+M``!TAP``?P```'B'``"B````?(<`````````@0```@`!``2!```!````"($`
+M`,`````,@0```````!"!``!H`0``%($```````#`AP````$"`\2'```$!08'
+MR(<```@)"@O,AP``#`T.#]"'```0$1(3U(<``!05%A?8AP``&!D:&]R'```<
+M'1X?X(<````!`@/DAP``!`4&!^B'```("0H+[(<```P-#@_PAP``$!$2$_2'
+M```4%187^(<``!@9&AO\AP``'!T>'PR8```9CH2M$)@```#@*'T4F```:Y\*
+MG!R8````````0)@``'H!:B!4F```60@```"9````````!)D````````(F0``
+M``````R9`````(``$)D```$````<F0``@`P``""9`````!`%*)D```$````L
+MF0``!````#29```B(!\>.)D```T,"PH\F0``/P```$B9```2LH"25)D``(CA
+M4%U<F0``CFI+`&B9``#.`P``<)D``!6U+QEXF0```0```'R9````````$*(`
+M`#-C@``4H@``$&P0`!BB``!@0)P`(*(``,8PB`$DH@````0``"RB````````
+M-*(``"`@("`XH@``("`@($"B```@"DDX1*(``+9[``!(H@``_#__#P";````
+M````*)L```P````XFP``$@```&2;```A````C)L``"T```"<FP``,P``````
+M`P`&``D`/P```````P`&``D`/P````D````$````!``!``$``0``````````
+M``8```!&1S@`````````````````!`````$``0````````````0```!&1S<`
+M`````````````````P`!``$``0````````````,```!&1S8`````````````
+M````!````````0````````````$```!&1S4`````````````````!``!``$`
+M``````````````````!&1S0`````````````````!`````$`````````````
+M`/[___]&1S,``````````````````P`!``$``````````````/W___]&1S(`
+M````````````````!````````````````````/S___]&1S$`````````````
+M`````@`!``$``````````````/K___]&1S``````````````````````````
+M````````````````````````````````````````"`````$````#````````
+M````````````!@```$9'-P`````````````````"````````````````````
+M`````$9'-@`````````````````!````````````````````_?___T9'-0``
+M````````````````````````````````````^O___T9'-```````````````
+M``````$``0``````````````^/___T9',P````````````````````$``0``
+M``$``0``````]O___T9',@````````````````````$````!``$``0``````
+M\____T9',0````````````````````$````!``$````!````\/___T9',```
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````"````!```
+M``8````(````"@````P````.````$````.S?`0#\V`$`4-H!`+S<`0!,W0$`
+M!-X!`.3>`0``````,````!6````5@```%8```!6````5@```'(```*>/C1+/
+M#X@)E0_@!*L/X!+/#X@)*)@```$``@H!``(*``$!!0$``@H!``(*-)@```X.
+M```.#@``#@X```X.```.#@``.)@```<````'````"P````L````+````2)@`
+M`%K:&`!:VA@`:<H8`&G*&`!IRA@`4)@``."TZ`W@M.@-X+3H#>"TZ`W@M.@-
+M6)@``"X-@'XN#8!^+DWH?BY-Z'XN#8!^7)@``%YF-S%>9C<Q7F8W,5YF-S%>
+M83<Q;)@``(&P#`6!L`P%@;`,!8"P#`6`L`P%%)D``!`G```0)P``?!4``/@J
+M```0)P``1)D``"`0N/<@$+CW(`VX]R`0N/<@$+CW#*(``&I!+&1J02QD:D%`
+M9&I!0&1J04!D'*(```J`@Q@*@(,8"H!S&`J`@Q@*@(,8,!(````````(F```
+M`````"R8``#^+P(`/)@````!`@!,F```/&&$$C"9``"#2```0)D```0```!8
+MF0``_P```'29````````^)D``!@````$H@````````BB``"(9S[0**(``+4!
+M```\H@``KXG($P2;```@````")L``!`````,FP``,````!";```(````%)L`
+M`"@````8FP``!````!R;```D````()L``!0````DFP``-````"R;```L````
+M,)L```(````TFP``(@```#R;```R````0)L```H```!$FP``*@```$B;```&
+M````3)L``"8```!0FP``%@```%2;```V````6)L```X```!<FP``+@```&";
+M```!````:)L``!$```!LFP``,0```'";```)````=)L``"D```!XFP``!0``
+M`'R;```E````@)L``!4```"$FP``-0```(B;```-````D)L```,```"4FP``
+M(P```)B;```3````H)L```L```"DFP``*P```*B;```K````K)L``"L```"P
+MFP``*P```+2;```K````N)L``"L```"\FP``*P```,";```K````Q)L``"L`
+M``#(FP``*P```,R;```K````T)L``"L```#4FP``*P```-B;```K````W)L`
+M`"L```#@FP``*P```.2;```K````Z)L``"L```#LFP``*P```/";```K````
+M])L``"L```#XFP```@```/R;```6````G)@`````````````````````````
+M````G)@`````````````````````````````G)@`````````````````````
+M````````G)@`````````````````````````````G)@`````````````````
+M````````````G)@`````````````````````````````G)@`````````````
+M````````````````G)@`````````````````````````````G)@`````````
+M````````````````````G)@`````````````````````````````G)@`````
+M````````````````````````G)@`````.````#@````X````.````#@`G)@`
+M````````````````````````````G)@`````````````````````````````
+MG)@`````````````P````(````"`````G)@``/D`!`#Y``0`_P`$`/T`!`#]
+M``0`U)@`````````````!`````0````$`````)H``*D!````````!)H``.D!
+M``!`````")H``"D```"`````#)H``&D```!0`0``$)H``)D!``"0`0``%)H`
+M`-D!``#0`0``&)H``!D````0````')H``%D```!$````()H``)D```"$````
+M))H``*4!``!(`0``*)H``.4!``"(`0``+)H``"4```#(`0``,)H``,@!```4
+M````-)H```@```!"````.)H``$@```""````/)H``(@```!X`0``0)H``)@!
+M``"X`0``1)H``-@!``#X`0``2)H``!@````2````3)H``%@```!2````4)H`
+M`)@```"2````5)H``*0!``!\`0``6)H``.0!``"\`0``7)H``"0```#\`0``
+M8)H``&0````*````9)H``*0```!*````:)H``.0```"*````;)H```H!``!:
+M`0``<)H``$H!``":`0``=)H``(H!``#:`0``>)H``,H!```.````?)H```H`
+M``!.````@)H``$H```".````A)H``(H```!>`0``B)H``+H!``">`0``C)H`
+M`/H!``#>`0``D)H``#H````)````E)H``'H```!)````F)H``(8!``")````
+MG)H``,8!``!Y`0``H)H```8```"Y`0``I)H``$8```#Y`0``J)H``(8````Y
+M````K)H``,8```!Y````L)H``,8```"Y````M)H``,8```"]`0``N)H``,8`
+M``#]`0``O)H``,8````]````P)H``,8```!]````Q)H``,8```"]````R)H`
+M`,8```#]````S)H``,8```#]````T)H``,8```#]````U)H``,8```#]````
+MV)H``,8```#]````W)H``,8```#]````X)H``,8```#]````Y)H``,8```#]
+M````Z)H``,8```#]````[)H``,8```#]````\)H``,8```#]````])H``,8`
+M``#]````^)H``,8```#]````_)H``,8```#]````U)@``"````#4F```$```
+M`!0````0````$````!0```#8F```:!!@`&@08`!H$&``:!!@`&@08`"<F```
+M``````````````````````````"<F`````````````````````````````"<
+MF`````````````````````````````"<F```````````````````````````
+M``"<F`````````````````````````````"<F```````$````!`````0````
+M$````!"<F```````!`````0````$````!`````2<F```````````````````
+M``````````"<F`````````````````````````````"<F```````````````
+M``````````````"<F``````````````````*``````````"<F```P``X`(``
+M.`#``#@"P``X`,``.`"<F```!@`"``8``@`&````!@`"``8``@"<F```B0``
+M`(D```")````B0```(D```"<F```H````*````"@````H````*````"<F```
+M!P`$``<`!``'``0`!P`$``<`!`#4F```&@```!H````:````&@```!H```"<
+MF```0````$@```!`````0````$````"<F```$````!`````0````$````!``
+M``"<F```"`````@````(````"`````@```"<F```3P```$\```!/````3P``
+M`$\```"<F```\0```/$```!A````\0```/$```"<F```3Y```$^0``!,D```
+M3Y```$^0``"<F```6A(``%H2``":$@``6A(``%H2``#,F```#@````X````/
+M````#@````X````!````1@```&`````!````1@```&$````!````1@```&(`
+M```!````1@```&,````!````1@```&0````!````1@```&4````!````1@``
+M`&8````!````1@```&<````!````1@```&@````!````1@```&D````!````
+M1@```&H````!````1@```&L````!````1@```&P````!````1@```'0````!
+M````1@```'0````!````1@```'0````!````1@```'0````!````1@```'0`
+M```!````1@```'0````!````1@```'0````!````1@```'0````!````1@``
+M`'4````!````1@```'8````!````1@```'<````!````1@```'@````!````
+M1@```'D````!````1@```'H````!````1@```'L````!````1@```'P````!
+M````1@```'T````!````1@```'X````!````1@```'\````!````1@```(``
+M```!````1````'P````!````1@```(@````!````1@```(P````!````1@``
+M`)`````!````1@```)0````!````1@```)@````!````1@```)P````!````
+M1@```*`````!````1@```*0````!````1@```*@````!````1@```*P````!
+M````1@```+`````!````1@```+0```#$\0$`S/$!`-3Q`0#<\0$`]/$!`/3Q
+M`0#D\0$`[/$!`)X6!@!B%@0`.A8#`!P6`@#J%0$`FA4``$H5```#%0$`610#
+M`+@+!0```````````#`````5@```%8```!6````5@```%8```!R```"GDXT2
+MSQ.("943X`2K$^`2SQ.("2B8```!``(*`0`""@`!`@4!``(*`0`""C28```.
+M#@``#@X```X.```.#@``#@X``#B8```'````!P````L````+````"P```$B8
+M``!MVA@`;=H8`'7*&`!URA@`=<H8`%"8``#@M.@-X+3H#>"TZ`W@M.@-X+3H
+M#5B8```N#8!^+@V`?BX-Z'XN#>A^+@V`?ER8``!>9C<Q7F8W,5YF-S%>9C<Q
+M7F8W,6R8``"!L`P%@;`,!8&P#`6!L`P%@;`,!129``#0!P``T`<``$P$``"8
+M"```T`<``$29```@$+CW(!"X]Q`-N/<0$+CW$!"X]P2B``````````````@`
+M```(````"`````BB``"(9[[6B&>^UHAG/M"(9S[0B&<^T`RB``!``2QD0`$L
+M9&#!0F1@P4)D8,%"9!RB```*@(,8"H"#&`J`<Q@*@(,8"H"#&#`2````````
+M")@````````LF```_B\"`#R8`````0(`3)@``#QAA!(PF0``@D@``$"9```$
+M````6)D``/\```!TF0```````"BB``"U`0``/*(``*^)R!,$FP```0````B;
+M```"````#)L```,````0FP``!````!2;```%````&)L```@````<FP``"0``
+M`"";```*````))L```L````LFP``#0```#";```0````-)L``!$````\FP``
+M$P```$";```4````1)L``!4```!(FP``&````$R;```9````4)L``!H```!4
+MFP``&P```%B;```<````7)L``!T```!@FP``(````&B;```B````;)L``",`
+M``!PFP``)````'2;```E````>)L``"@```!\FP``*0```(";```J````A)L`
+M`"L```"(FP``+````)";```P````E)L``#$```"8FP``,@```*";```T````
+MI)L``#4```"HFP``-0```*R;```U````L)L``#4```"TFP``-0```+B;```U
+M````O)L``#4```#`FP``-0```,2;```U````R)L``#4```#,FP``-0```-";
+M```U````U)L``#4```#8FP``-0```-R;```U````X)L``#4```#DFP``-0``
+M`.B;```U````[)L``#4```#PFP``-0```/2;```U````^)L``!````#\FP``
+M&@````":```'````!P````2:``!'````1P````B:``"'````AP````R:``"@
+M`0``H`$``!":``#@`0``X`$``!2:```@````(````!B:``!@````8````!R:
+M``"A`0``H0$``"":``#A`0``X0$``"2:```A````(0```"B:``!A````80``
+M`"R:``!B`0``8@$``#":``"B`0``H@$``#2:``#B`0``X@$``#B:```B````
+M(@```#R:``!B````8@```$":``!C`0``8P$``$2:``"C`0``HP$``$B:``#C
+M`0``XP$``$R:```C````(P```%":``!C````8P```%2:``"$`0``A`$``%B:
+M``#$`0``Q`$``%R:```$````!````&":``#J`0``"P```&2:```J````2P``
+M`&B:``!J````BP```&R:``"J````K`$``'":``"K`0``[`$``'2:``#K`0``
+M+````'B:```K````$@```'R:``!K````4@```(":``"K````D@```(2:``"L
+M`0``DP$``(B:``#L`0``TP$``(R:```L````$P```)":```Z````4P```)2:
+M``!Z````DP```)B:``"Z````E`$``)R:``"[`0``U`$``*":``#[`0``%```
+M`*2:```[````.@```*B:``![````>@```*R:``"[````N@```+":``"\`0``
+MNP$``+2:``#\`0``^P$``+B:```\````.P```+R:``!\````>P```,":``"\
+M````NP```,2:``#\````O`$``,B:``#\````_`$``,R:``#\````/````-":
+M``#\````?````-2:``#\````O````-B:``#\````_````-R:``#\````_```
+M`.":``#\````_````.2:``#\````_````.B:``#\````_````.R:``#\````
+M_````/":``#\````_````/2:``#\````_````/B:``#\````_````/R:``#\
+M````_````-28```@````T)@```@$!@,(!`<#"`0&`P@$!@,(!`<#W)@``,`@
+MH`#`(*``P"#@`,`@X`#`(.``G)@```````\````/````#P````\````/G)@`
+M````````````````````````````G)@`````@````(````"`````@````(``
+MG)@`````*@```"H````J````*@```"H`G)@``````0````$````!`````0``
+M``$`G)@`````````````````````````````G)@`````&````!@````8````
+M&````!@`G)@`````8````&````!N````;@```&X`G)@`````QP```,<```#'
+M````QP```,<`G)@`````2P```$L```!+````2P```$L`G)@`````2`0``$@$
+M``!(!```2`0``$@$G)@`````3````$P```!,````3````$P`G)@`````Y```
+M`.0```#D````Y````.0`G)@`````````````````````````````G)@`````
+M_````/P```#\````_````/P`G)@`````_P```/\```#_````_P```/\`G)@`
+M````/P0``#\$```_!```/P0``#\$G)@`````#`````P````,````#`````P`
+MG)@`````&0(``!D"```9`@``&0(``!D"G)@`````)````"0````D````)```
+M`"0`G)@`````M````+0```"T````M````+0`G)@`````F0```)D```"9````
+MF0```)D`G)@`````4````%````!0````4````%``G)@`````*@```"H````J
+M````*@```"H`G)@`````$@```!(````2````$@```!(`G)@`````,L```#+`
+M```RP```,L```#+`G)@`````=`$``'0!``!T`0``=`$``'0!G)@`````$0``
+M`!$````1````$0```!$`G)@`````*(8``"B&```HA@``*(8``"B&G)@`````
+MA#$``(0Q``"$,0``A#$``(0QG)@``(``\@"``/(`@`#R`(``\@"``/(`G)@`
+M`!D`)P`9`"<`&0`G`!D`)P`9`"<`G)@```,````#`````P````,````#````
+MG)@`````````````````````````````G)@``+(```"R````L@```+(```"R
+M````G)@``(0@L`"$(+``A""P`(0@L`"$(+``G)@``*0E00"D)4$`I"5!`*0E
+M00"D)4$`G)@``""2$0`@DA$`()(1`""2$0`@DA$`G)@```!(&@``2!H``$@:
+M``!(&@``2!H`V)@``#`""P`P`@L`,`(+`#`""P`P`@L`G)@``)0```"4````
+ME````)0```"4````G)@``)$```"1````D0```)$```"1````G)@``!(````2
+M````$@```!(````2````G)@``(````"`````@````(````"`````G)@``-D`
+M``#9````V0```-D```#9````G)@``&````!@````8````&````!@````G)@`
+M`/````#P````\````/````#P````G)@``*(```"B````H@```*(```"B````
+MG)@``%(```!2````4@```%(```!2````G)@``-0```#4````U````-0```#4
+M````G)@``,P4``#,%```S!0``,P4``#,%```G)@``(P$``",!```C`0``(P$
+M``",!```Q)@```,````#`````P````,````#````[`<"`/0'`@#\!P(`%`@"
+M`!0(`@`$"`(`#`@"`````````````````#`````5````%0```!4````5````
+M%0```!R```"GDXT2SQ.("943X`2K$^`2SQ.("2B8```!``(*`0`""@```@4!
+M``(*`0`""C28````#@````X````.````#@````X``#B8```"`````@````H`
+M```*````"@```$B8``!MVA@`;=H8`&1J&@!D:AH`9&H:`%"8``#@M.@-X+3H
+M#=JPZ`W:L)@,VK#H#5B8```N#8!^+@V`?BX-Z'XN#<A^+@V`?ER8``!>9C<Q
+M7F8W,5YF-S%>8#DQ7F8W,6R8``"!L`P%@;`,!8&P#`6!L`P%@;`,!129``#0
+M!P``T`<``$P$``"8"```T`<``$29````$+CW`!"X]P`-N/<`$+CW`!"X]P2B
+M``````````````````````````````BB``"(9[[6B&>^UHAG/M"(9S[0B&<^
+MT`RB``!``2P`0`$L`$#!0@!`P4(`0,%"`!RB```*@(,8"H"#&`J`8Q@*@(,8
+M"H"#&#`2``#@`P``8(````\````8@0```````!R!````````(($````````D
+M@0```````"B!````````+($````````P@0```````#2!````````.($`````
+M```\@0```````$"!``"H``"`1($````````(F````````"R8````H```/)@`
+M```$(`!,F```/".$$G"8```?````=)@``(````!XF```#@```%B9``#_````
+M@)D```````"$F0````"``J"9````````X)D```````#DF0``JJJJJNB9``!X
+M9$8\[)D``*H```#PF0``#````/29``#_````^)D``!0````HH@``M0D``#RB
+M``"OB<B33*(```$```!0H@```*```%2B````````6*(``(!3QPQ<H@```0\/
+M#V"B```!#VE?9*(``!&*00!HH@```````&RB``!JP3`,<*(``"`(@@!TH@``
+MJGP;`'BB``#..><<?*(``,X!%P4`HP`````!&`2C```")@,P"*,```8^!T@,
+MHP``"DP+5A"C```/8!ID%*,``!MN3W@8HP``6GR/AARC``!;AL^.(*,```^7
+M3YTDHP``CZ'/I2BC```?KU^U+*,``)^YW[TPHP``/\=_S32C``"_T?_5.*,`
+M```````\HP```````$"C````````1*,```````!(HP``____/TRC``#___\_
+M4*,``/___S]4HP``__\#`%BC```?JJAY7*,```]";`9@HP``!R(H#V2C``"%
+M%F`7:*,```01@!]LHP```PR@-W"C``"#",0_=*,```,(P%=XHP``@@;87WRC
+M``""!.!_@*,``+I[/'^$HP``\'\P\P2;```!````")L```(````,FP```P``
+M`!";```$````%)L```4````8FP``"````!R;```)````()L```H````DFP``
+M"P```"R;```-````,)L``!`````TFP``$0```#R;```3````0)L``!0```!$
+MFP``%0```$B;```8````3)L``!D```!0FP``&@```%2;```;````6)L``!P`
+M``!<FP``'0```&";```@````:)L``"(```!LFP``(P```'";```D````=)L`
+M`"4```!XFP``*````'R;```I````@)L``"H```"$FP``*P```(B;```L````
+MD)L``#````"4FP``,0```)B;```R````H)L``#0```"DFP``-0```*B;```U
+M````K)L``#4```"PFP``-0```+2;```U````N)L``#4```"\FP``-0```,";
+M```U````Q)L``#4```#(FP``-0```,R;```U````T)L``#4```#4FP``-0``
+M`-B;```U````W)L``#4```#@FP``-0```.2;```U````Z)L``#4```#LFP``
+M-0```/";```U````])L``#4```#XFP``$````/R;```:`````)H`````````
+M````!)H```````!`````")H```````"`````#)H```````"!`0``$)H`````
+M``#!`0``%)H````````!````&)H```````!!````')H```````"!````()H`
+M``````!H`0``))H```````"H`0``*)H```````#H`0``+)H````````H````
+M,)H```````!H````-)H```````")`0``.)H```````#)`0``/)H````````)
+M````0)H```````!)````1)H```````")````2)H```````"0`0``3)H`````
+M``#0`0``4)H````````0````5)H```````!0````6)H```````"0````7)H`
+M``````"1`0``8)H```````#1`0``9)H````````1````:)H```````!1````
+M;)H```````"1````<)H```````!X`0``=)H```````"X`0``>)H```````#X
+M`0``?)H````````X````@)H```````!X````A)H```````"9`0``B)H`````
+M``#9`0``C)H````````9````D)H```````!9````E)H```````"9````F)H`
+M``````#9````G)H```````#Y````H)H```````#Y````I)H```````#Y````
+MJ)H```````#Y````K)H```````#Y````L)H```````#Y````M)H```````#Y
+M````N)H```````#Y````O)H```````#Y````P)H```````#Y````Q)H`````
+M``#Y````R)H```````#Y````S)H```````#Y````T)H```````#Y````U)H`
+M``````#Y````V)H```````#Y````W)H```````#Y````X)H```````#Y````
+MY)H```````#Y````Z)H```````#Y````[)H```````#Y````\)H```````#Y
+M````])H```````#Y````^)H```````#Y````_)H```````#Y````U)@``"``
+M``#0F```"!0``@@4`0((%``""!0``@@4`0+<F```P""@`,`@H`#`(.``P"#@
+M`,`@X`"<F```````\````/````#P````\````/"<F```````````````````
+M``````````"<F````````P````,````#`````P````.<F```````````````
+M``````````````"<F`````````````````````````````"<F```````````
+M``````````````````"<F`````````````````````````````"<F```````
+M``````````````````````"<F`````!`0```0$```$!```!`0```0$"<F```
+M```%90``!64```5E```%90``!66<F`````````````````````````````"<
+MF`````````````````````````````"<F`````!"````0@```$(```!"````
+M0@"<F`````"U````M0```+4```"U````M0"<F``````#`````P````,````#
+M`````P"<F`````#W````]P```/<```#W````]P"<F`````"=````G0```)T`
+M``"=````G0"<F``````B````(@```"(````B````(@"<F``````B!```(@0`
+M`"($```B!```(@2<F```&``C`!@`(P`8`",`&``C`!@`(P"<F``````H````
+M*`!@`"@`8``H`&``*`"<F```P`!0`,``4`##`%``PP!0`,,`4`"<F```?P`$
+M`'\`!`!_``0`?P`$`'\`!`"<F```6`0``%@$``!8!```6`0``%@$``"<F```
+M``````````````````````````"<F````,````#`````P````,````#```#8
+MF```,`)``#`"0``P`D``,`)``#`"0`"<F````&0```!D````9````&0```!D
+M``"<F`````@````(````"`````@````(``#,F```#@````X````.````#@``
+M``X```#(+`(`T"P"`-@L`@#P+`(`\"P"`.`L`@#H+`(``````#`````5````
+M%0```!4````5````%0```!R```"GDXT2SQ.("943X`2K$^`2SQ.("2B8```!
+M``(*`0`""@`!`@4!``(*`0`""C28```.#@``#@X```X.```.#@``#@X``#B8
+M```'````!P````L````+````"P```$B8``!A^A@`8?H8`&,:&@!C&AH`8QH:
+M`%"8``#@M)@,X+28#-JPF`S:L)@,VK"8#%B8```N#<A^+@W(?BX-R'XN#<A^
+M+@W(?ER8``!>8#DQ7F`Y,5Y@.3%>8#DQ7F`Y,6R8``"!L`P%@;`,!8&P#`6!
+ML`P%@;`,!129``#0!P``T`<``$P$``"8"```T`<``$29````$+CW`!"X]P`-
+MN/<`$+CW`!"X]P2B``````````````````````````````BB``"(9[[6B&>^
+MUHAG/M"(9S[0B&<^T`RB``#@P2X`X,$N`"#!*@`@P2H`(,$J`!RB```*@(,8
+M"H"#&`J`8Q@*@(,8"H"#&`"C``````$8```!&````1@```$8```!&`2C```"
+M)@,P`B8#,`(F`S`")@,P`B8#,`BC```&/@=(!CX'2`8^!T@&/@=(!CX'2`RC
+M```*3`M6"DP+5@I,"U8*3`M6"DP+5A"C```/8!ID#V`:9`]@&F0/8!ID#V`:
+M9!2C```;;D]X&VY/>!MN3W@;;D]X&VY/>!BC``!:?(^&6GR/AEI\CX9:?(^&
+M6GR/AARC``!;AL^06X;/D%N&SXY;AL^.6X;/CB"C```/ET^=#Y=/G0^73YL/
+MET^;#Y=/FR2C``"/H\^GCZ//IX^?SZ./G\^CCY_/HRBC```?KU^U'Z]?M1^O
+M7[,?KU^S'Z]?LRRC``"?N=^]G[G?O9^YW[N?N=^[G[G?NS"C```_Q7_+/\5_
+MRS_'?\L_QW_+/\=_RS2C``"_T?_5O]'_U;_1_]._T?_3O]'_TS`2``#@`P``
+M:$```!````!@@```#P```)R`````````H(`````````8@0```````!R!````
+M````(($````````D@0```````"B!````````+($````````P@0```````#2!
+M````````.($````````\@0```````$"!``#Y`P"`1($````````(F```````
+M`"R8````H```/)@````$(`!,F```/".$$G"8```?````=)@``(````!XF```
+M#@```%B9``#_'P@`@)D```````"$F0````"``J"9````````X)D```````#D
+MF0``JJJJJNB9``!X9$8\[)D``*H```#PF0``#````/29``#_````^)D``!0`
+M```HH@``M0D``#RB``"OB<B33*(```$```!0H@```*```%2B````````6*(`
+M`(!3QPQ<H@```0\/#V"B```!#VE?9*(``!&*00!HH@```````&RB``!JP3`,
+M<*(``"`(@@!TH@``JGP;"'BB``#..><<?*(``,X!%P4XHP```````#RC````
+M````0*,```````!$HP```````$BC``#___\_3*,``/___S]0HP``____/U2C
+M``#__P,`6*,``!^JJ'E<HP``#T)L!F"C```'(B@/9*,``(468!=HHP``!!&`
+M'VRC```##*`W<*,``(,(Q#]THP```PC`5WBC``""!MA??*,``(($X'^`HP``
+MNGL\?X2C``#P?S#S!)L```$````(FP```@````R;```#````$)L```0````4
+MFP``!0```!B;```(````')L```D````@FP``"@```"2;```+````+)L```T`
+M```PFP``$````#2;```1````/)L``!,```!`FP``%````$2;```5````2)L`
+M`!@```!,FP``&0```%";```:````5)L``!L```!8FP``'````%R;```=````
+M8)L``"````!HFP``(@```&R;```C````<)L``"0```!TFP``)0```'B;```H
+M````?)L``"D```"`FP``*@```(2;```K````B)L``"P```"0FP``,````)2;
+M```Q````F)L``#(```"@FP``-````*2;```U````J)L``#4```"LFP``-0``
+M`+";```U````M)L``#4```"XFP``-0```+R;```U````P)L``#4```#$FP``
+M-0```,B;```U````S)L``#4```#0FP``-0```-2;```U````V)L``#4```#<
+MFP``-0```.";```U````Y)L``#4```#HFP``-0```.R;```U````\)L``#4`
+M``#TFP``-0```/B;```0````_)L``!H`````F@`````````````$F@``0```
+M`$`````(F@``@````(`````,F@``H0$``&$!```0F@``X0$``*$!```4F@``
+M(0```.$!```8F@``80```"$````<F@``B`$``&$````@F@``R`$``(@!```D
+MF@``"````,@!```HF@``2`````@````LF@``B````$@````PF@``J0$``(@`
+M```TF@``Z0$``&D!```XF@``*0```*D!```\F@``:0```.D!``!`F@``T`$`
+M`"D```!$F@``$````&D```!(F@``4````)`!``!,F@``D````-`!``!0F@``
+ML0$``!````!4F@``\0$``%````!8F@``,0```)````!<F@``<0```'$!``!@
+MF@``N`$``+$!``!DF@``^`$``/$!``!HF@``.````#$```!LF@``>````'$`
+M``!PF@``F0$``)@!``!TF@``V0$``-@!``!XF@``&0```!@```!\F@``60``
+M`%@```"`F@``F0```)@```"$F@``V0```'D!``"(F@``^0```+D!``",F@``
+M^0```/D!``"0F@``^0```#D```"4F@``^0```'D```"8F@``^0```+D```"<
+MF@``^0```/D```"@F@``^0```/D```"DF@``^0```/D```"HF@``^0```/D`
+M``"LF@``^0```/D```"PF@``^0```/D```"TF@``^0```/D```"XF@``^0``
+M`/D```"\F@``^0```/D```#`F@``^0```/D```#$F@``^0```/D```#(F@``
+M^0```/D```#,F@``^0```/D```#0F@``^0```/D```#4F@``^0```/D```#8
+MF@``^0```/D```#<F@``^0```/D```#@F@``^0```/D```#DF@``^0```/D`
+M``#HF@``^0```/D```#LF@``^0```/D```#PF@``^0```/D```#TF@``^0``
+M`/D```#XF@``^0```/D```#\F@``^0```/D```#4F```(````-"8```(````
+M"`````@````(````"````-R8``#``*``P`"@`,``X`#``.``P`#@`)R8````
+M```S````,P```#,````S````,YR8```````!`````0````$````!`````9R8
+M`````````````````````````````)R8````````````````````````````
+M`)R8`````````````````````````````)R8```````?````'P```!\````?
+M````'YR8`````````````````````````````)R8`````+@```"X````N```
+M`+@```"X`)R8`````+<```"W````MP```+<```"W`)R8`````(0```"$````
+MA````(0```"$`)R8`````)@```"8````F````)@```"8`)R8`````,````#`
+M````P````,````#``)R8`````/\```#_````_P```/\```#_`)R8`````/\`
+M``#_````_P```/\```#_`)R8`````/\```#_````_P```/\```#_`)R8````
+M`/\```#_````_P```/\```#_`)R8`````-<```#7````UP```-<```#7`)R8
+M`````&$```!A````80```&$```!A`)R8`````/X```#^````_@```/X```#^
+M`)R8`````-X```#>````W@```-X```#>`)R8`````'\```!_````?P```'\`
+M``!_`)R8`````#T$```]!```/00``#T$```]!)R8`````'<```!W````=P``
+M`'<```!W`)R8`````$0```!$````1````$0```!$`)R8`````)@```"8````
+MF````)@```"8`)R8``"``!``@``0`(``$`"``!``@``0`)R8```TP`4`-,`%
+M`#3`!0`TP`4`-,`%`)R8``#P`#$`\``Q`/``,0#P`#$`\``Q`)R8```?`0P`
+M'P$,`!\!#``?`0P`'P$,`)R8``!``%$`0`!1`$``40!``%$`0`!1`)R8``#:
+M`%``V@!0`-H`4`#:`%``V@!0`)R8`````````````````````````````)R8
+M``!$0```1$```$1```!$0```1$```)R8````````````````````````````
+M`)R8``#`8```P&```,!@``#`8```P&```)R8````+````"P````V````-@``
+M`"P``,B8```#!````P0```,$```#!````P0``)R8````9````&0```!D````
+M9````&0``)R8````"`````@````(````"`````@``,R8```.````#@````X`
+M```.````#@```(1)`@",20(`E$D"`*Q)`@"L20(`G$D"`*1)`@``````````
+M```````P+CDN,C`N,P````!@`0``:`$``'`!``!X`0``@`$``(@!``"0`0``
+MF`$```````"(`?``\P")`8``@P"*`?(`]0"+`?8`]P",`?$`]`"-`8$`A`"/
+M`8(`A0```&4````!````_____X````#_____`````$I0``"T#P```````&H`
+M```!````_____X````#_____`````$I0``"T#P```````$``\`#S`(B!\`#S
+M`$$`@`"#`(F!@`"#`$@`\@#U`(J!\@#U`$,`]@#W`(N!]@#W`$H`\0#T`(R!
+M\0#T`$L`@0"$`(V!@0"$`$P`@@"%`(^!@@"%``@)1`D%!B@H````````````
+M````````````````````A0F%"04&*"@`````````````````````````````
+M``"%"84)%`8H*````````````````````````````````(4)A0D2!B@H````
+M````````!```````````````````T`FL"@4&*"@`````````````````````
+M```````````("40)!084!0````````````````````````````````@)1`D4
+M`!0%````````````````````````````````;`FH"04&%`4`````````````
+M``````````````````!L":@)%``4!0``````````0```````````````````
+M`&P)J`D>`!0%````````````````````````````````;`F>"1L&%`4`````
+M``````````````````````````!L"9X)%``4!0``````````0```````````
+M`````````(`)B@D4`!0%````````````````````````````````F0FH"10`
+M%`4```````````````````````````````#0":P*!084!0``````````````
+M`````````````````*,)J`D4`!0%```````````@(```````````````````
+M"`E$"10`%`4```````````````````````````````!L"6P)%``4!0``````
+M`````````````````````````'$)@`D4`!0%````````````````````````
+M````````A0F*"10`%`4```````````````````````````````"/"9D)%``4
+M!0```````````````````````````````)X)G@D4`!0%````````````````
+M````````````````HPFC"10`%`4````````````$``````"```````````"C
+M":,)%``4!0```````````````````(```````````*@)J`D4`!0%````````
+M````!```````@```````````J`FH"10`%`4```````````````````"`````
+M```````("40)!084!0````````````````````````````````@)1`D4`!0%
+M````````````````````````````````;`FH"04&%`4`````````````````
+M``````````````!L":@)%``4!0``````````(````````````````````&P)
+MJ`D>`!0%````````````````````````````````;`F>"1L&%`4`````````
+M``````````````````````!L"9X)%``4!0``````````(```````````````
+M`````(`)B@D4`!0%````````````````````````````````F0FH"10`%`4`
+M``````````````````````````````"C":@)%``4!0``````````("``````
+M`````````````+0)M`D%!A0%````````````````````````````````M`FT
+M"10`%`4``````````"`H``````````````````#0":P*!084!0``````````
+M``````````````````````@)1`D4`!0%````````````````````````````
+M````;`EL"10`%`4```````````````````````````````!Q"8`)%``4!0``
+M`````````````````````````````(4)B@D4`!0%````````````````````
+M````````````CPF9"10`%`4```````````````````````````````">"9X)
+M%``4!0```````````````````````````````*,)HPD4`!0%````````````
+M!```````@```````````HPFC"10`%`4```````````````````"`````````
+M``"H":@)%``4!0````````````0``````(```````````*@)J`D4`!0%````
+M````````````````@```````````M`FT"10`%`4````````````$``````"`
+M``````````"T";0)%``4!0```````````````````(````````````H46A0%
+M!B@H````````````````````````````````@A32%`4&*"@!````````````
+M``````````````````#Z%'(5!08H*```````````````````````````````
+M`)H5$A8%!B@H`0``````````````````````````````'A1&%`4&*"@`````
+M``````````````````````````!N%+X4!08H*`$`````````````````````
+M`````````.847A4%!B@H````````````````````````````````AA4F%@4&
+M*"@!``````````````````````````````!0%'@4$08H*```````````````
+M`````````````````%`4>!07!B@H````````````````````````````````
+M6A1:%!$&*"@```````````````````````````````!:%%H4%P`H*```````
+M`````````````````````````*`4H!07!B@H`0`````````"````````````
+M````````H!2@%!0&*"@!``````````(```````````````````""%((4$0`H
+M*`$``````````@```````````````````*H4JA04`"@H`0`````````"````
+M````````````````@A2J%!0`*"@!``````````(```````````````````""
+M%*H4%P8H*`$``````````@```````````````````*05'!84!B@H`0``````
+M```"````````````````````@!:H%A0`*"@`````````````````````````
+M``````"`%J@6'@8H*````````````````````````````````(46K18>!B@H
+M````````````````````````````````6A2"%`\`*"@#```````````$````
+M``````````````"J%*H4$@`H*`,```````````0``````````````````*05
+M'!84`"@H`P``````````!```````````````````@!:H%A0`*"@`````````
+M```$```````````````````S$ST3%P`*!0``````````$``````````0````
+M`````$<341,7``H%```````````0`````````!``````````.!-T$Q<`%!0`
+M`````````!``````````!P````````!.$WL3&P8%!0```````````0``````
+M`````````````%$3>1,>!@H%```````````!````````````````````5A-T
+M$R$&%`4```````````$```````````````````"K$[`3%P`*!0``````````
+M$``````````,`````````+`3V!,7`!04```````````0``````````(`````
+M````OQ._$Q<`"@4``````````!``````````#```````````%'@4!084%```
+M`````````````````````````````#(4;A07`!04```````````8````````
+M``$`````````,A1N%!0`%!0``````````!@``````````0`````````\%'@4
+M#P`4%```````````!0```````````````````#P4>!01!A04```````````!
+M``````````$`````````/!1X%!(`%!0```````````4`````````````````
+M```\%'@4%``4%```````````!0```````````````````#P4>!07`!04````
+M```````%````````````````````/!1X%!<&%!0```````````$`````````
+M```````````\%,@4%`84%`(`````````!````````````````````'@4H!07
+M`!04`0`````````%````````````````````C!2@%!<`%!0#``````````4`
+M``````````````````",%,@4$@`4%`,`````````!0``````````````````
+M`(P4R!04`!04!P`````````%@```````````````````C!3(%!0&%!0#````
+M``````$``````````@````````",%,@4%P84%`,``````````0`````````"
+M`````````(P4R!07!A04`P`````````!````````````````````C!3(%!X`
+M%!0```````````````````````````````",%$06!084%`,`````````````
+M`````````````````*`4R!01!A04`P`````````!````````````````````
+M?!7T%1X&%!0"``````````0```````````````````!\%406%`84%`,`````
+M`````0`````````$`````````'P51!8;`!04`P`````````%````````````
+M````````?!5$%AX`%!0#``````````4```````````````````!\%406%P`4
+M%`<``````````8```````````````````'$6K187`!04````````````````
+M````````````````<1:M%AX&%!0```````````````````````````````!Q
+M%JT6'@84%`(`````````!````````````````````'$6P18%!A04````````
+M````````````````````````<1;!%A$`%!0`````````````````````````
+M``````!Q%L$6%``4%````````````````````````````````'$6P18>`!04
+M````````````````````````````````<1;!%AX&%!0`````````````````
+M`````P````````!Q%L$6'@84%````````````````````````````````#@3
+M=!,>`!04````````````!```````````````````L!/8$QX`%!0`````````
+M```$```````````````````R%&X4'@`4%`,```````````0`````````````
+M`````#P4>!0>`!04`P``````````!```````````````````C!3(%!X`%!0#
+M```````````$``````````````````!Q%L$6'@`4%`````````````0`````
+M`````````````'P51!8>`!04`P``````````!```````````````````C!3(
+M%!X`%!0````````````````````````````````\%'@4'@`4%```````````
+M`````````````````````,$6P18>`!04````````````!```````````````
+M``````#_`?\!`````````````/________]_```````````#`)@!F0$`````
+M````````_________W\```````````<`F`$P"P````````````#_________
+M?P``````````"`"8`3`,`````````````/________]_```````````@`"`!
+M$`H`````````````_________W\``````````"$`(`&9`0````````````#_
+M________?P``````````(@`@`3`,`````````````/________]_````````
+M```Z`&`!$`H`````````````_________W\``````````#L`8`&9`0``````
+M``````#_________?P``````````$@!E`1`*```#`````````/________]_
+M```````````W`#`!F0$```,`````````_________W\``````````#4`,`*9
+M`0```P````````#_________?P``````````-@`P`YD!```#`````````/__
+M______]_```````````P`#`$F0$```,`````````_________W\`````````
+M`#D`,`69`0```P````````#_________?P``````````-``P!ID!```#````
+M`````/________]_```````````R`#`#F0$```,`````````_________W\`
+M`````````#$`,`.9`0````````````#_________?P``````````$0`0`9D!
+M`````````````/________]_```````````0`!`!$`H`````````````____
+M_____W\``````````%(`4`&9`0````````````#_________?P``````````
+M10!0`ID!`````````````/________]_``````````!'`%`#F0$`````````
+M````_________W\``````````$(`4`29`0````````````#_________?P``
+M````````6`!0!9D!`````````````/________]_``````````!;`%`&F0$`
+M````````````_________W\``````````%T`4`B9`0````````````#_____
+M____?P``````````7@!0"9D!`````````````/________]_``````````!0
+M`%`#$`H`````````````_________W\``````````%4`4`$P#```````````
+M``#_________?P``````````5@!0`C`,`````````````/________]_````
+M``````!)`%`"4`T`````````````_________W\``````````$``0`%`"@``
+M1@````0````H`````````(@!````````00!``4`*``!'````!````&@`````
+M````B0$```````!(`$`!$`H``$8````$````"`````````"*`0```````$H`
+M0`%`"@``1@````0````(&````````(P!````````2P!``4`*``!&````!```
+M``A@````````C0$```````!,`$`!4`H``$8````$````"`````````"/`0``
+M`````$,`0`)`"@``1P````0```!P`````````(L!````````\`!``T`*``!&
+M````!````"````````````````````"``$`#0`H``$<````$````8```````
+M``"G#P```````/$`0`-`"@``1@````0`````&```````````````````@0!`
+M`T`*``!&````!`````!@````````J`\```````""`$`#4`H``$8````$````
+M``````````"I#P```````/(`0`,0"@``1@````0`````````````````````
+M````@P!`!$`*``!'````!````&"`````````J@\```````#T`$`$0`H``$8`
+M```$`````)@``````````````````(0`0`1`"@``1@````0`````X```````
+M`*L/````````A0!`!%`*``!&````!`````"`````````K`\```````#U`$`$
+M$`H``$8````$`````(```````````````````(8`0`5`"@``1P````0```!@
+M@````````*T/````````AP!`!4`*``!&````!`````#@````````K@\`````
+M``"(`$`%4`H``$8````$`````(````````"O#P```````(D`0`9`"@``1P``
+M``0```!H`````````+`/````````B@!`!D`*``!&````!`````A@````````
+ML0\```````"+`$`&4`H``$8````$````"`````````"R#P```````(P`0`=`
+M"@``1P````0```!H@````````+,/````````C0!`!T`*``!&````!`````C@
+M````````M`\```````".`$`'4`H``$8````$````"(````````"U#P``````
+M`(\`0`A`"@``1P````0```!H@````````+8/````````D`!`"$`*``!&````
+M!`````C@````````MP\```````"1`$`(4`H``$8````$````"(````````"X
+M#P```````/8`0`E`"@``1P````0```!@@```````````````````]P!`"T`*
+M``!'````!````&"```````````````````!@`&``8```````````````____
+M_____W\``````````&$`80!A`````P````````#_________?P``````````
+M8@!B`&(````"`````````/________]_``````````!C`&,`8P``````````
+M````_________W\``````````&0`9`!D`````P````````#_________?P``
+M````````90!E`&4````#`````````/________]_``````````!F`&8`9@``
+M````````````_________W\``````````&<`9P!G``````````````#_____
+M____?P``````````:`!H`&@``````````````/________]_``````````!I
+M`&D`:0````,`````````_________W\``````````&H`:@!J`````P``````
+M``#_________?P``````````_P$```$````!`````0```%@;`````!```0``
+M``$````!````6!L```@``P`!``````````$```!8&P``#``#``$`````````
+M`0```%@;```@`$<`````````````````6!L``#,`,``!``````````$```!8
+M&P``)``A``$````!`````0```%@;```H`#<``0`````````!````6!L``!\`
+M,``!`````0````$```!8&P``,`!;``$``````````0```%@;``!P``,``0``
+M```````!````6!L``#@`-P`!``````````$```!8&P``5`!5``$````!````
+M`0```%@;``!$`%4``0````$````!````6!L``$P`.P`!``````````````!8
+M&P``8`!2``$````!`````0```%@;``!D`#0``0`````````!````6!L``'P`
+M(``!`````0````$```!8&P``F`!;``$````!`````0```%@;``"<`%(``0``
+M``$````!````6!L``*H`$``!``````````$```!8&P``O``#``$`````````
+M`0```%@;``"_`#8``0`````````!````6!L``,0`-P`!`````0````$```!8
+M&P``RP`W``$``````````0```%@;``#0`#<``0`````````!````6!L``-8`
+M$``!`````0````$```!8&P``V@`#`````````````````%@;```R`S8``0``
+M```````!````6!L``-X``P`!``````````$```!8&P``Z0`W``$`````````
+M`0```%@;``#V`#<``0`````````!````6!L``/H`-P`!``````````$```!8
+M&P``_P`V``$``````````0```%@;```,`3```0````$````!````6!L``!0!
+M-P`!``````````$```!8&P``+`$W``$``````````0```%@;``!``1```0``
+M``$````!````6!L``%0!`P`!``````````$```!8&P``6`$A``$````!````
+M`0```%@;``!<`3<``0`````````!````6!L``&`!-P`!``````````$```!8
+M&P``9`%;``$``````````0```%@;``!H`5(``0`````````!````6!L``&P!
+M4@`!`````0````$```!8&P``=`$W``$``````````0```%@;``!X`0,``0``
+M```````!````6!L``'P!-P`!``````````$```!8&P``B`%```$`````````
+M`````%@;``")`4$``0``````````````6!L``(H!2``!``````````````!8
+M&P``BP%#``$``````````````%@;``",`4H``0``````````````6!L``(T!
+M2P`!``````````````!8&P``CP%,``$``````````````%@;``"G#X```0``
+M````````````6!L``*@/@0`!``````````````!8&P``J0^"``$`````````
+M`````%@;``"J#X,``0``````````````6!L``*L/A``!``````````````!8
+M&P``K`^%``$``````````````%@;``"M#X8``0``````````````6!L``*X/
+MAP`!``````````````!8&P``KP^(``$``````````````%@;``"P#XD``0``
+M````````````6!L``+$/B@`!``````````````!8&P``L@^+``$`````````
+M`````%@;``"S#XP``0``````````````6!L``+0/C0`!``````````````!8
+M&P``M0^.``$``````````````%@;``"V#X\``0``````````````6!L``+</
+MD``!``````````````!8&P``N`^1``$``````````````%@;``"0`4(``0``
+M```````!````6!L``(X!`P`!``````````$```!8&P``F`%%``$````!````
+M`0```%@;``":`44``0``````````````6!L``)L!10`!``````````````!8
+M&P``G`%>``$``````````````%@;``">`0,``0`````````!````6!L``*P!
+M-P`!``````````$```!8&P``I@$#``$``````````0```%@;``"V`3<``0``
+M```````!````6!L``+@!-P`!``````````$```!8&P``N@$W``$`````````
+M`0```%@;``"^`2$``0````$````!````6!L``"<#`P`!``````````$```!8
+M&P``R@%=``$``````````````%@;``#6`3<``0`````````!````6!L``.0!
+M$``!`````0````$```!8&P``[`$P``$````!`````0```%@;``#X`0,``0``
+M```````!````6!L``!`"-P`!``````````$```!8&P``*@(B``$`````````
+M`0```%@;``!"`C<``0`````````!````6!L````"6P`!``````````$```!8
+M&P``2@(#``$``````````0```%@;``!/`A```0````$````!````6!L``%P"
+M4@`!``````````$```!8&P``8`([``$````!`````0```%@;``!H`C<``0``
+M```````!````6!L``&P"-P`!``````````$```!8&P``=@(0``$````!````
+M`0```%@;``!Z`@,``0`````````!````6!L``(("`P`!``````````$```!8
+M&P``@P(#``$``````````0```%@;``"J`B$``0`````````!````6!L``+X"
+M6P`!`````0````$```!8&P``OP(W``$``````````0```%@;``#!`C<``0``
+M```````!````6!L``,8".P`!``````````$```!8&P``U`(W``$`````````
+M`0```%@;``#P`C<``0`````````!````6!L``/0"-P`!``````````$```!8
+M&P``^`(#``$``````````0```%@;``">`%```0````$````!````6!L``/P"
+M`P`!``````````$```!8&P``#`,P``$``````````0```%@;```4`S8``0``
+M```````!````6!L``!@#-@`!``````````$```!8&P``)`,#``$`````````
+M`0```%@;```0`P,``0`````````!````6!L``#H#-P`!``````````$```!8
+M&P``2`,0``$````!`````0```,$6``!*`Q(``0````$````!````6!L``%H#
+M$0`!``````````$```!8&P``7`,Z``$````!`````0```%@;``!>`U8``0``
+M```````!````6!L``,`"`P`!``````````$```!8&P``=P,#``$`````````
+M`0```%@;``#,`@,``0`````````!````6!L```````#_`1````````$`````
+M```````````````````````````"``@@``````````````#_````````````
+M`````````!$D``````````````````44```````````````````%`@``````
+M````````````$P```````````````````%`!$```````````````````````
+M```````````````````````!````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````4`(0````````````````````````````````
+M````````````!```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````!0`Q``````````````````````````````````````````
+M`!`(````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````%`$$````````````````````````````````````````(```(``````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````4`40
+M````````````````````````````````````````````0```````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````!0!C````````(`
+M`````````P````````````````````"`0`"`````````````````"`D`````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````%`(,```````````````````
+M``````````,`````````````!``!````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````4`DP```````"``````````0`````````
+M`P````````````0@$```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````P`3````````(`````````!``````````#````````
+M````0(````@`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````#`",````````@`````````$``````````,``````````$``````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M,`,P```````"``````````0``````````P```````````$`````(````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````P!#``````
+M``(`````````!``````````#``````````!`(```````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````#`%,````````@``````
+M```$``````````,``````````!``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````,`8P```````"``````````0`````
+M`````P```````````!$``0``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````0`1``````````````````````````````````
+M```````@``$``@``````````````!!(``````````````````!$@````````
+M````````````````````````````````````````````````````````````
+M`````````````"`!$``````````````````````````````````````````"
+M`@`$````````````````````````````````````$B``````````````````
+M````````````````````````````````````````````````````````````
+M````8`$0```````!``````````,`````````````````````((!```(`````
+M`````````,00```````````````````A!```````````````````````````
+M``````````````````````````````````````````````````````!E`1``
+M``````$``````````P```````````````````#@`````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````$`!0```````````
+M```````(``````````(```````````0`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````0`)``````````````````!``
+M`````````@````````#'!0``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````!``T```````````````````(`````````"
+M``````````"`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````$`$0```````!```````````@`````````(`````````
+M`(!`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````0`5````````$``````````"``````````@``````````@$```@``
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!`
+M!D``````````````````"``````````"``````````"(````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````$`'0```````
+M!``````````(@`````````(``````````(1`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````0`A````````$````````
+M``B``````````@``````````A$```@``````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````!`"4```````````````````(``````
+M```"`````````,>!````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````$`+0```````!```````````@`````````(`````
+M````QX%`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````4`W_````````````````````````````````````````````
+M```````````````````````````````````````````````````````````*
+M````````````````````"@``````````````````````````````````````
+M```P"O\`````````````````@``````````#````````````````````````
+M```````````````````````````````````````````````````!````````
+M`````````````0``````````````````!````````````````````#`+,```
+M`````````````````0````````,`````````````````````````````````
+M````````````````````````````````````````@```````````````````
+M`(`````````````````````$````````````````````,`PP````````````
+M```````"`````````P``````````````````````````````````````````
+M```````````````````````````````0````````````````````$```````
+M``````````````0````````````````````0"A``````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````"`````````````````````@````````````````
+M````!````````````````````$`*0`````````````````!@>`````````(`
+M````````````````````````````````````````````````````````````
+M````````````0`H``````````````````$`$```````````````````$````
+M````````````````4`I`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```(````````````````````"`````````````````````0`````````````
+M``````"9`3``````````````````````````````````````````````````
+M``````````````````````````````````````````````````````@`````
+M```````````````(````````````````````!````````````````````&``
+M_P```````P``````````!`````````@```````````````#@`P``````````
+M````P`(``````````````````````````````````````,"O````````````
+M``````#P"P`````````````````(````````````````````9@#_```````#
+M```````````$````````"````````````````.`#``````````````#``@``
+M````````````````````````````````````P`<``````````````````/`!
+M``````````````````@```````````````````!G`/\```````,`````````
+M``0````````(````````````````X`,``````````````,`"````````````
+M``````````````````````````#`+P``````````````````\`L`````````
+M````````"````````````````````&@`_P```````P``````````!```````
+M``@```````````````#@`P``````````````P`(`````````````````````
+M`````````````````,!7``````````````````#P%0`````````````````(
+M````````````````````80#_```````#```````````$````````$```````
+M`````````.`#````````````````````````````````````````````````
+M````````P*\``````````````````/`+``````````````````@`````````
+M``````````!B`/\```````,```````````0````````0````````````````
+MX`,``````````````,`"``````````````````````````````````````#`
+MKP``````````````````\`L`````````````````"```````````````````
+M`&,`_P```````P``````````!`````````@```````````````#@`0``````
+M````````P`(``````````````````````````````````````,`O````````
+M``````````#P"P`````````````````(````````````````````9`#_````
+M```#```````````$````````$```````````````"``<``````````````#`
+M`@``````````````````````````````````````P`<`````````````````
+M`/`!``````````````````@```````````````````!E`/\```````,`````
+M``````0````````0````````````````A`@`````````````````````````
+M``````````````````````````````#`5P``````````````````\!4`````
+M````````````"````````````````````&D`_P```````P``````````!```
+M`````!````````````````#``P``````````````P`(`````````````````
+M`````````````````````,`'``````````````````#P`0``````````````
+M```(````````````````````:@#_```````#```````````$````````$```
+M`````````````,`#````````````````````````````````````````````
+M````````````P"\``````````````````/`+``````````````````@`````
+M``````````````"8`?\`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````"```````````````````````````````````````````
+M`````0-P%PL`C````````0,H(P\`$@```````0/@+@H`F`(``````0-01@X`
+M)`(``````0/`70D`L`0``````0.@C`T`2`0``````0.`NP@`8`0``````0/P
+MT@P`;`0`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````"```````````````````````
+M`````````````````````````0)P%PL`C````````0(H(P\`$@```````0+@
+M+@H`F`(``````0)01@X`)`(``````0+`70D`L`0``````0*@C`T`2`0`````
+M`0*`NP@`8`0``````0+PT@P`;`0`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````$```````````````````````````````````````````````!`.@#
+M"P""```````!`-`'"@2$`0`````!`'P5"02+`0`````!`/@J"`26`0``````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````(````````````````````````````````
+M```````````````!`W`7"P",```````!`R@C#P`2```````!`^`N"@"8`@``
+M```!`U!&#@`D`@`````!`\!="0"P!``````!`Z",#0!(!``````!`X"["`!@
+M!``````!`_#2#`!L!```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````(````````````
+M```````````````````````````````````!`G`7"P",```````!`B@C#P`2
+M```````!`N`N"@"8`@`````!`E!&#@`D`@`````!`L!="0"P!``````!`J",
+M#0!(!``````!`H"["`!@!``````!`O#2#`!L!```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````G)@`````````````G)@`````````````G)@`````````````
+MG)@`````````````G)@`````````````G)@``````!`````0G)@```````0`
+M```$G)@`````````````G)@`````````````G)@`````````````G)@`````
+M```````*G)@``(``.`"``#@"G)@```8``@`&````G)@``)(```"2````G)@`
+M`*````"@````G)@```<`!``'``0`U)@``!H````:````G)@``$@```!(````
+MG)@``!`````0````G)@```@````(````G)@```\````/````G)@``/(```!B
+M````G)@``$^0``!,D```G)@``%H2``":$@``S)@```X````/````!*(`````
+M````````"*(``$9&/E!&1CY0#*(``&Q!@&1L08!D$*(```.@F0$#H)D!%*(`
+M`!#63`00UDP$&*(``$``@!-``(`3'*(``&``X!M@`.`;(*(```J`4PP*@%,,
+M)*(``#O?%``[WQ0`**(``+4!``"U`0``+*(``"`````@````G)@`````````
+M````G)@`````````````G)@`````````````G)@`````````````G)@`````
+M````````G)@`````````````G)@`````````````G)@`````````````G)@`
+M````````````G)@`````````````G)@`````````````G)@`````.````#@`
+MG)@`````````````G)@`````````````G)@`````````````G)@``/D`!`#Y
+M``0`U)@````````$``````````T`````````````````````````````````
+M``````````````$$^@`#`($`9`)D`@$$]`$'`($`R0')`0$$Z`,"`((!Y`#D
+M``$$T`<&`(0"H`"@``$$N`L!`(8#C`",``$"<!<+`(P$/``\``$"*",/`!($
+M/``\``$"X"X*`)@&,``P``$"4$8.`"0&,``P``$"P%T)`#`(+``L``$"H(P-
+M`$@(+``L``$"@+L(`&`(+``L``$"\-(,`&P(+``L````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````P`````````````
+M``````````````````````````````````$`Z`,;`((```````$`T`<:!(0!
+M``````$`?!49!(L"``````$`^"H8!)8#```````"<!<+``P$```````"*",/
+M`!($``````$"X"X*`!@&``````$"4$8.`"0&``````$"P%T)`#`(``````$"
+MH(P-`$@(``````$"@+L(`&`(``````$"\-(,`&P(````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````0```````````````````````````````````````````````$`Z`,;
+M`((```````$`T`<:!(0!``````$`?!49!(L!``````$`^"H8!)8!````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````@`````````````````````````````````
+M``````````````$#<!<+`(P```````$#*",/`!(```````$#X"X*`)@"````
+M``$#4$8.`"0"``````$#P%T)`+`$``````$#H(P-`$@$``````$#@+L(`&`$
+M``````$#\-(,`&P$````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````<`````````````
+M``````````````````````````````````$#<!<+`(P```````$#X"X*`)@"
+M``````$#4$8.`"0"``````$#P%T)`+`#``````$#H(P-`$@#``````$#@+L(
+M`&`#``````$#\-(,`&P#````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````@```````````````````````````````````````````````$"W`4+
+M`(,```````$"R@@/``0```````$"N`L*`(8"``````$"E!$.``D"``````$"
+M<!<)`(P$``````$"*",-`!($``````$"X"X(`!@$``````$"O#0,`!L$````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````@`````````````````````````````````
+M``````````````$"N`L+`(8```````$"E!$/``D```````$"<!<*`(P"````
+M``$"*",.`!("``````$"X"X)`)@$``````$"4$8-`"0$``````$"P%T(`#`$
+M``````$">&D,`#8$````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````@`````````````
+M``````````````````````````````````$"<!<+`(P```````$"*",/`!(`
+M``````$"X"X*`)@"``````$"4$8.`"0"``````$"P%T)`+`$``````$"H(P-
+M`$@$``````$"@+L(`&`$``````$"\-(,`&P$````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````@``````````0```#`Q+C`Q````"``````````!````,#$N,#$````(
+M``````````$````P,2XP,0````@``````````0```#`Q+C`Q````"```````
+M```!````,#$N,#$````(``````````$````P,2XP,0````@``````````0``
+M`#`Q+C`Q````"``````````!````,#$N,#$````(``````````$````P,2XP
+M,0````@``````````0```#`Q+C`Q````"``````````!````,#$N,#$````(
+M``````````$````P,2XP,0````@``````````0```#`Q+C`Q````"```````
+M```!````,#$N,#$````(``````````$````P,2XP,0````@``````````0``
+M`#`Q+C`Q````"``````````!````,#$N,#$````(``````````$````P,2XP
+M,0````@``````````0```#`Q+C`Q````"``````````!````,#$N,#$````(
+M``````````$````P,2XP,0````@``````````0```#`Q+C`Q````"```````
+M```!````,#$N,#$````(``````````$````P,2XP,0````@``````````0``
+M`#`Q+C`Q````"``````````!````,#$N,#$````(``````````$````P,2XP
+M,0````@``````````0```#`Q+C`Q````"``````````!````,#$N,#$````(
+M``````````$````P,2XP,0````@``````````0```#`Q+C`Q````"```````
+M```!````,#$N,#$````(``````````$````P,2XP,0````@``````````0``
+M`#`Q+C`Q````"``````````!````,#$N,#$````(``````````$````P,2XP
+M,0````@``````````0```#`Q+C`Q````"``````````!````,#$N,#$````(
+M``````````$````P,2XP,0````@``````````0```#`Q+C`Q````"```````
+M```!````,#$N,#$````(``````````$````P,2XP,0````@``````````0``
+M`#`Q+C`Q````"``````````!````,#$N,#$````(``````````$````P,2XP
+M,0````@``````````0```#`Q+C`Q````"``````````!````,#$N,#$````(
+M``````````$````P,2XP,0````@``````````0```#`Q+C`Q````"```````
+M```!````,#$N,#$````(``````````$````P,2XP,0````@``````````0``
+M`#`Q+C`Q`````"YS>6UT86(`+G-T<G1A8@`N<VAS=')T86(`+G)E9VEN9F\`
+M+G)E;&$N=&5X=``N<F5L+G1E>'0`+G)E;&$N<F]D871A`"YR96PN<F]D871A
+M`"YR96QA+F1A=&$`+G)E;"YD871A`"YD871A,0`N8G-S`"YN;W1E````````
+M```````````````````````````````````````````````````;````!@``
+M<`(`````````-````!@```````````````0````8````*0````$````&````
+M`````%````!P6P(````````````0`````````"\````)``````````````!\
+M<@,`"&P```\````"````!`````@````D````!```````````````A-X#````
+M```/`````@````0````,````/@````$````"`````````,!;`@#0C@``````
+M```````0`````````$8````)``````````````"$W@,`&`X```\````%````
+M!`````@````Y````!```````````````G.P#```````/````!0````0````,
+M````5P````$````#`````````)#J`@!`50`````````````0`````````%T`
+M```)``````````````"<[`,`0`````\````(````!`````@```!2````!```
+M````````````W.P#```````/````"`````0````,````9P````$````#````
+M`````-`_`P`````````````````0`````````&X````(`````P````````#0
+M/P,`H`$`````````````$`````````!S````!P``````````````T#\#`!`$
+M``````````````$`````````$0````,``````````````.!#`P!Y````````
+M```````!``````````$````"```````````````$1P,`D!D``!`````(````
+M!````!`````)`````P``````````````E&`#`.@1``````````````$`````
+M``````````````````````````````````````````,``@``````````````
+M```#``4``````````````````P`(``````````````````,`#```````````
+M```````#``$``````````````````P`+``````````````````,`#0`!````
+M&+P``*P````2``(`#````!"E```(````$@`"`!<```"L80$`D`(``!(``@`B
+M````$'P``,`````2``(`+0```(2"`0```P``$@`"`#@````0(@$`.````!(`
+M`@!#````@)(!`-@!```2``(`3@```#!J``"X`0``$@`"`%D```"<Y@$`;`$`
+M`!(``@!D````!#\``*0!```1``@`;P```$AJ`0!8````$@`"`'H```#H;0``
+M2````!(``@"%````F%H``"P!```2``(`D````+!.``"D`0``$0`(`)L```!,
+M60$`-````!(``@"F````O%(!`"@````2``(`L0```%!#`0`(````$@`"`+P`
+M``#`(`$`1`$``!(``@#'````^"\!`-@!```2``(`T@```"0-``"H````$@`"
+M`-T```!D#P$`]````!(``@#H````D/(```@!```2``(`\P```!S0``"X````
+M$@`"`/X```!PUP``)````!(``@`)`0``T*H``%0````2``(`%`$```Q>`0!8
+M````$@`"`!\!```,(`$`"````!(``@`J`0``(#\!`"P````2``(`-0$``(2%
+M`0`T`0``$@`"`$`!``!H"0``9````!(``@!+`0``""4!`/`````2``(`5@$`
+M`(#!```(````$@`"`&$!``!4T0$`N````!(``@!L`0``V*\```@````2``(`
+M=P$``)37```H````$@`"`((!``!T$@``W`$``!(``@"=`0``G%,``*0!```1
+M``@`J`$``%Q4`0#`````$@`"`+,!``"(K```U````!(``@"^`0``'`0``#``
+M```2``(`R0$``*#4`0"0````$@`"`-0!`````````````!````#U`0``2'8`
+M`(P````2``(```(``,17`0!D`0``$@`"``L"```\5P$`B````!(``@`6`@``
+MH!,!```!```2``(`(0(``$!Z``!`````$@`"`"P"``#LR0``B````!(``@`W
+M`@``U-```,P````2``(`0@(``.@4`0!,````$@`"`$T"``!LQ@``,````!(`
+M`@!8`@``<%4!`+@````2``(`8P(```"P``",````$@`"`&X"``#4=```?```
+M`!(``@!Y`@``:*4``$P````2``(`A`(``/Q+`0"8````$@`"`(\"```4TP``
+M6````!(``@":`@``'%4!`$0````2``(`I0(``'Q3`0"<````$@`"`+`"``!`
+M(P$`I````!(``@"[`@``W(8!`$P````2``(`Q@(``.!M```(````$@`"`-$"
+M```H5@$`S````!(``@#<`@``L&```/@&```2``(`YP(``)#2```X````$@`"
+M`/("````3P$`D````!(``@#]`@``>`,``*0````2``(`"`,``!A4`0!$````
+M$@`"`!,#``!XN`$`:`$``!(``@`>`P``1#T!`&@````2``(`*0,``-B0`0#T
+M````$@`"`#0#``!H>0``3````!(``@`_`P``T,$``/`````2``(`2@,``*S'
+M``"P````$@`"`%4#``#@HP``0````!(``@!@`P``X,`!`/0````2``(`:P,`
+M`.R4``!8`P``$@`"`'8#```(?P``"````!(``@"!`P``U,$!`$P````2``(`
+MC`,``$BG``"(`P``$@`"`)<#``#@`0``C`$``!(``@"F`P``1*0!`.P#```2
+M``(`L0,``,!G`0!0`0``$@`"`+P#```XT@``*````!(``@#'`P``D+T!`#P"
+M```2``(`T@,``*A<`0!D`0``$@`"`-T#```T:0$`*````!(``@#H`P``;`,`
+M``P````2``(`\P,``"C,```D````$@`"`/X#```T%0$`+`$``!(``@`)!```
+MH!0!`$@````2``(`%`0``#CI``!L````$@`"`!\$``"H9P``)````!(``@`J
+M!```M'D``(P````2``(`-00``$P$``!@`@``$@`"`$L$``!XCP$`0````!(`
+M`@!6!```C+````0!```2``(`800``,Q[``!$````$@`"`&P$````OP``*```
+M`!(``@!W!```N(8!`"0````2``(`@@0``+#\``!`````$@`"`(T$```L1@$`
+M1`4``!(``@"8!```E$$!``@````2``(`HP0``"!O``#8````$@`"`*X$``#$
+MO```@````!(``@"Y!```0-@!`&0````2``(`Q`0``*A#`0"H`0``$@`"`,\$
+M````T@``"````!(``@#:!```F'4``+`````2``(`Y00``'`3`0`D````$@`"
+M`/`$``!X)@$`]`@``!(``@#[!```L+P!`.`````2``(`!@4``+12`0`(````
+M$@`"`!$%``!`Q@``+````!(``@`<!0``M&L!`+`````2``(`)P4```BE```(
+M````$@`"`#(%``"<S@$`R`$``!(``@`]!0``W-H``&@````2``(`2`4``(AS
+M``!P````$@`"`%,%``#T5@$`2````!(``@!>!0``;"\!`(P````2``(`:04`
+M`*`=`0`L````$@`"`'0%```PU0$`<````!(``@!_!0`````````````2````
+MC`4``,2F``"$````$@`"`)<%``!0AP``:````!(``@"B!0``--$!`"`````2
+M``(`K04``##6`0`(````$@`"`+@%```D4`$`_````!(``@##!0``&`<``.`!
+M```2``(`U`4``+#%`0!H!0``$@`"`-\%``"`>@``L````!(``@#J!0``M*T`
+M`!`!```2``(`]04``/#1```(````$@`"```&``#D4@$`*````!(``@`+!@``
+M".@!`.`````2``(`%@8``$"&``"P````$@`"`"$&````.`$`V````!(``@`L
+M!@``B,$``$@````2``(`-P8``.#K```4`@``$@`"`$(&```@I```Z````!(`
+M`@!-!@``3)L!`&P'```2``(`6`8``+1M`0!4````$@`"`&,&```\9`$`-```
+M`!(``@!N!@``1-L``(@!```2``(`>08``(!9`0`H`P``$@`"`(0&```LS@``
+MF````!(``@"/!@``$-(``"@````2``(`F@8``&1>`0!(`P``$@`"`*4&``!P
+MP@$`Y`$``!(``@"P!@``I-@!`'@'```2``(`NP8``,C2``!,````$@`"`,8&
+M``"@L0``%````!(``@#1!@``\&P```@````2``(`W`8``$2]``"\`0``$@`"
+M`.<&``#<30$`>````!(``@#R!@``P'\``#`````2``(`_08``*@]`@`0`0``
+M$@`"``@'``#X?@``"````!(``@`3!P``-%,!``@````2``(`'@<``*Q1`0!8
+M````$@`"`"D'``!H2P``I`$``!$`"``T!P``?!X!`+@````2``(`/P<``,#M
+M`0!4````$@`"`$H'```D?0``N````!(``@!5!P``O-<``"@````2``(`8`<`
+M`+B'``#\`0``$@`"`&L'``!@@@$`)````!(``@!V!P``H$L!`"P````2``(`
+M@0<``%1.`0"L````$@`"`(P'``!LU@$`U`$``!(``@"7!P``+),``"@````2
+M``(`H@<``+2#```H````$@`"`*T'``"D=P``$`$``!(``@"X!P``%(<``#P`
+M```2``(`PP<``#1-`0"H````$@`"`,X'```TB@$`'`0``!(``@#9!P``',P!
+M`(`"```2``(`Y`<``/A#``"D`0``$0`(`.\'``#X;P``-`(``!(``@#Z!P``
+ML$P``(0````2``(`!0@``""E``!(````$@`"`!`(``#PA@``)````!(``@`;
+M"``````````````0````.P@``,")``!0"```$@`"`$8(````````"0```!$`
+M"`!6"```6)0!`)P````2``(`80@``%S(``!D````$@`"`&P(``!@6@(`$`$`
+M`!(``@!W"```T#$!`&@````2``(`@@@``+1/`0!P````$@`"`(T(```0?P``
+M"````!(``@"8"```*)`!`+`````2``(`HP@``/C1```(````$@`"`*X(``"L
+MU@``+````!(``@"Y"```P,(``-@````2``(`Q`@``#Q3`0`X````$@`"`,\(
+M`````````````!(```#>"```*,D``'P````2``(`Z0@```Q-``"D`0``$0`(
+M`/0(``",9P$`+````!(``@#_"```A#D!`(`````2``(`"@D``)CS``"`````
+M$@`"`!4)```(DP``)````!(``@`@"0``",\``,`````2``(`*PD``)Q!`0"H
+M`0``$@`"`#8)``#X40``I`$``!$`"`!!"0``*%D!`"0````2``(`3`D``)C+
+M``"0````$@`"`%<)``#8;`$`W````!(``@!B"0``X.,!`+P"```2``(`;0D`
+M`)C#``!P`@``$@`"`'@)``#DA```2````!(``@"#"0``/,<``$`````2``(`
+MC@D``'3W``!@`0``$@`"`)D)``"8FP``&````!(``@"D"0``_&H!`+@````2
+M``(`KPD``%10``"D`0``$0`(`+H)``#`R```:````!(``@#%"0``[,H``*P`
+M```2``(`T`D``+1X``"0````$@`"`-L)``!`RP$`+````!(``@#F"0``````
+M```````2````]0D``!0@`0`@````$@`"```*``#,2P$`,````!(``@`+"@``
+M8'(``"P````2``(`%@H``&!5`0`0````$@`"`"$*``#HT0``"````!(``@`L
+M"@``U$P!`&`````2``(`-PH``%1"``"D`0``$0`(`$(*``"0V@``)````!(`
+M`@!-"@``*+\``$`!```2``(`6`H``(@!``!8````$@`"`&8*``!@/0``I`$`
+M`!$`"`!Q"@``X-D``+`````2``(`?`H``&C````(````$@`"`(<*```,````
+M)````!$`"`"9"@``U'8``#@````2``(`I`H``)QW```(````$@`"`*\*``!8
+M0P$`4````!(``@"Z"@``7((``*`````2``(`Q0H``*CJ`0`8`P``$@`"`-`*
+M``#\@@``+````!(``@#;"@``#-```!`````2``(`Y@H``-AI`0!P````$@`"
+M`/$*``!@60``X````!(``@#\"@``&,L!`"@````2``(`!PL``"C9``"X````
+M$@`"`!(+``"@T0``2````!(``@`="P``A&D!`%0````2``(`*`L``,P=`0`P
+M````$@`"`#,+```@P@$`4````!(``@`^"P``R,\``$0````2``(`20L``+BB
+M`0!,`0``$@`"`%0+``!PP```$`$``!(``@!?"P``-"`!`(P````2``(`:@L`
+M`+!```"D`0``$0`(`'4+``"8A```3````!(``@"`"P``.-8!`#0````2``(`
+MBPL``!AL``#8````$@`"`)8+```P@P``8````!(``@"A"P``N!<!`,`%```2
+M``(`K`L``%Q_``!D````$@`"`+<+```4?0``$````!(``@#""P``!#H!`#`"
+M```2``(`S0L``,R_`0`,`0``$@`"`-@+``"TV@``*````!(``@#C"P``0%H`
+M`%@````2``(`[@L``'`^`0"L````$@`"`/D+```X$0``B````!(``@`$#```
+M"`L``!P"```2``(`#PP``.`\`0!D````$@`"`!H,``#<?0``S````!(``@`E
+M#```D(,``"0````2``(`,`P``$BV`0"D````$@`"`#L,``!L=```:````!(`
+M`@!&#```!*0!`$`````2``(`40P``#1)``!$````$@`"`%P,``"L!@``;```
+M`!(``@!G#```E$P!`$`````2``(`<@P`````````````$@```((,``#P_```
+MG`$``!(``@"-#```\&L``"@````2``(`F`P``&30`0#0````$@`"`*,,``!0
+M=0``2````!(``@"N#```4$4!`-P````2``(`N0P``'S-``"P````$@`"`,0,
+M```T'P$`V````!(``@#/#``````````````0````[PP``,P)```\`0``$@`"
+M`/H,``#$<@``?````!(``@`%#0``0',``$`````2``(`$`T``'S'```P````
+M$@`"`!L-```P;@``\````!(``@`F#0``=,H``'@````2``(`,0T``#@R`0!L
+M!0``$@`"`#P-``!@T@``*````!(``@!'#0``"&X!`"`"```2``(`4@T``/!^
+M```(````$@`"`%T-```P<@``,````!(``@!H#0``E'<```@````2``(`<PT`
+M````````````$@```($-```0Q@``,````!(``@",#0``N`X``.0````2``(`
+MEPT``!A_``!$````$@`"`*(-``#,V```7````!(``@"M#0``;-,``#0````2
+M``(`N`T``.23```(`0``$@`"`,,-```LA0``7````!(``@#.#0``#'<``(@`
+M```2``(`V0T``'!+`0`P````$@`"`.0-``!<:0$`*````!(``@#O#0``?($!
+M`.0````2``(`^@T``*3)``!(````$@`"``4.```H/@$`2````!(``@`0#@``
+M])0!`%@&```2``(`&PX``$1Y```D````$@`"`"8.``#@U@``B````!(``@`Q
+M#@``3,P``$P````2``(`/`X``,2N```4`0``$@`"`$<.``"DQ@``F````!(`
+M`@!2#@``"-(```@````2``(`70X``+2E```0`0``$@`"`&@.``#$20``I`$`
+M`!$`"`!S#@``O'(```@````2``(`?@X``)S&```(````$@`"`(D.``"P:0``
+M@````!(``@"4#@``^&P``.@````2``(`GPX``*P]`0!\````$@`"`*H.``#`
+M$0``M````!(``@"U#@``=-0!`"0````2``(`P`X``'13`0`(````$@`"`,L.
+M```DS0``6````!(``@#6#@``(+4!`"@!```2``(`X0X```S6``"@````$@`"
+M`.P.``#0W```1`P``!(``@#W#@``($@``*0!```1``@``@\``,PW`0`H````
+M$@`"``T/``#X<P``=````!(``@`8#P``^`@``'`````2``(`(P\``(QR```P
+M````$@`"`"X/```,T@$`:`(``!(``@`Y#P``",4!`*@````2``(`1`\``-R#
+M```H````$@`"`$\/``#$S@``1````!(``@!:#P``$&D!`"0````2``(`90\`
+M``2$``"4````$@`"`'`/``"@:```B````!(``@![#P``T'P``$0````2``(`
+MA@\``+RW``!`````$@`"`)$/``"<#P``G`$``!(``@"<#P``!"(!``@````2
+M``(`IP\``"2K``"`````$@`"`+(/```XV```3````!(``@"]#P```'\```@`
+M```2``(`R`\``!07`0"D````$@`"`-,/``"@:@$`7````!(``@#>#P``D`$"
+M`.@````2``(`Z0\``*A^``!(````$@`"`/0/``#$6P``/````!(``@#_#P``
+M)%(``#P'```2``(`%1```&1L`0!T````$@`"`"`0``"(A0``N````!(``@`K
+M$```,'`!`$P1```2``(`-A```$P_`0!(`@``$@`"`$$0``#\'0$`@````!(`
+M`@!,$```A-@``$@````2``(`5Q```*2K``#D````$@`"`&(0``"<2```F```
+M`!(``@!M$```X*\``"`````2``(`>!```%23``"0````$@`"`(,0``#DUP``
+M5````!(``@".$```%.D``"0````2``(`F1```"AI``"(````$@`"`*00``"0
+ML0``"````!(``@"O$```,'L``)P````2``(`NA```%@.`0!$````$@`"`,40
+M``#L9@$`H````!(``@#0$```!%(!`+`````2``(`VQ```)C,``",````$@`"
+M`.80``!DL@``6`4``!(``@#Q$```E)\``+`#```2``(`_!````Q3`0`H````
+M$@`"``<1``!X'0$`*````!(``@`2$0``)"("`/`````2``(`'1$``"!1`0",
+M````$@`"`"@1``!`/`$`F````!(``@`S$0``*(<!``P#```2``(`/A$``&S+
+M`0`P````$@`"`$D1`````````````!(```!;$0``D+L``(@````2``(`9A$`
+M`-@X`0"L````$@`"`'$1`````````````!(```""$0``@',```@````2``(`
+MC1$``(C2```(````$@`"`)@1``!<K0``6````!(``@"C$0``D$\!`"0````2
+M``(`KA$``)RN`0!@`0``$@`"`+D1``"DZ0``/`(``!(``@#$$0``)$P``(P`
+M```2``(`W1$``)S+`0"`````$@`"``!Z>C`P-6(U.#0V`'IZ,#`R9&(Q,6,`
+M>GHP,F1B9C@W-0!Z>C`R9&)B,6(R`'IZ,#)D8C(P-3,`>GHP,#)D8F$T,@!Z
+M>C!F8F(Q93-F`'IZ,&(W.65A.30`>GHP-6(X8S8U80!Z>C`P-6(T,&%D`'IZ
+M,#5B.30R960`>GHP9#AD8S8R8P!Z>C`P,3EF-#<P`'IZ,#)D9#DT,F0`>GHP
+M,F1B93<S9`!Z>C`P-6(V.3)B`'IZ,&(V9#(S,C4`>GHP,#5B.#4S9`!Z>C`P
+M,39D.3)E`'IZ,&-F8C$X-S4`>GHP,#)D8C,Q8P!Z>C`R9&%B8F%C`'IZ,#)D
+M8F,X-3$`>GHP,#!B-F,V.`!Z>C`P,&(V8F8X`'IZ,#!B-F-F-64`>GHP,39E
+M,61F9`!Z>C!B-F8U,&(X`'IZ,#9E,&$T9F4`>GHP,#8W9#)B,0!Z>C`P,F1B
+M8S8Q`'IZ,&(V8V$S,C4`>GHP,#5B-F-F9`!Z>C`Q-F4P9&9D`'IZ,#`P8C9F
+M-C@`871H7VAA;%]P<F]C97-S7VYO:7-E9FQO;W(`>GHP,#5B-#AA9`!Z>C`R
+M9&)F,6(R`'IZ,#`U8C@X8V(`>GHP,S-E8SAB9@!Z>C!D8C0R-6,U`&%T:%]H
+M86Q?9&UA7V)E86-O;E]R97-P;VYS95]T:6UE`'IZ,#!B-F8Q-C$`>GHP-F4P
+M,&(X80!Z>C`R9&)F8S%D`'IZ,&1C-&4S.3``>GHP9&%F960X-@!Z>C`P8C9E
+M,C=A`'IZ,#)D8F)A8C(`>GHP8C9D,65F9@!Z>C`Q-F0Y,&1D`'IZ,#)D8F4X
+M-3$`>GHP,#5B-C1F9`!Z>C`P,&(V9#4R`'IZ,&(V8SEE9F8`>GHP,39E,#!D
+M9`!Z>C`R9&)D.#<U`'IZ,#)D8C,Q8C(`>GHP,&(W,#DR,P!Z>C`P8C9D-#4P
+M`'IZ,#`P8C9D,60`>GHP8C9C,C,R-0!Z>C`R9&)D86(R`'IZ,#`P-6(V,S(`
+M>GHP-F1E9&0Y,P!Z>C`P,39D834P`'IZ,#`P-C=D,S(`>GHP,&(V9#DR,P!Z
+M>C`P,F1B-3%C`'IZ,#$V9&-B9F4`>GHP,&(W,#$T-0!Z>C`P,39D9C)C`'IZ
+M,&(W9F%D,V4`>GHP,39D.3DR,`!Z>C`R9&(Q8F%C`'IZ,&1C-F4S.3``>GHP
+M-6(W,#%E,`!Z>C`P,&(V8C$P`'IZ,&(W,#EE9F8`>GHP,39D9C@Y8@!A=&A?
+M:&%L7V%T=&%C:`!Z>C`V93!F8S!D`'IZ,#$V9&%B,F0`>GHP,F1B,3,U9`!Z
+M>C!E,#0V.#1B`'IZ,#$V93(Y,60`>GHP,#!B-F9E.`!Z>C`P8V9B,V4P`'IZ
+M,#`Q-F0Y-#@`>GHP,39E,C`Y8@!Z>C!B-S`Q969F`'IZ,#`P8C9C.60`>GHP
+M,#`U8C5A,@!Z>C`R9&(Q-S!A`&%T:%]H86Q?8V]M<'5T971X=&EM90!Z>C`R
+M9&(U8F%C`'IZ,#`U8C@Q,V0`>GHP,&(V8SDR,P!Z>C!B-F(U,&(X`'IZ,#`U
+M8C=F.60`>GHP8C<P,60P,@!Z>C`V9&9F-#1A`'IZ,#)D8C4W-C,`>GHP-F5E
+M868V,`!Z>C!E,#`W8V$Q`'IZ,#`R9&%F-C(`>GHP8C@S860S90!Z>C`P,&(V
+M8CDP`'IZ,#$V9#EE9F$`>GHP,39D93`U,0!Z>C`P,#5B-F(R`'IZ,#5B-V8Q
+M,30`>GHP-&%E,#,Q9@!Z>C`R9&)D9&9D`'IZ,#`U-#=F960`>GHP,&(V8F8U
+M90!Z>C`P8C<Q-S=D`'IZ,#!B-S!F,V0`>GHP,39D.#DR,`!Z>C`R9&(Q86(R
+M`'IZ,#`P-6(V,C(`>GHP,#!B-F8W.`!Z>C!B-CEB,#=C`&%T:%]H86Q?9G)E
+M90!Z>C`U8C<Y8C%B`'IZ,#!B-S`W,V0`>GHP,F1B96)B9`!Z>C!B-64S,34R
+M`'IZ,#$V9&9B9C$`871H7VAA;%]M:'HR:65E90!Z>C`Q-F4Q.#EB`'IZ,&1C
+M,F$U8S4`>GHP,#)D8S8P8@!Z>C`V9&8P8CAA`'IZ,#)D8C,S-60`>GHP8C9C
+M-3-A-`!Z>C!F-31D,6(P`'IZ,&(V9F0S-C,`>GHP9#ED8S8R8P!Z>C`U8C<T
+M,64P`'IZ,#)D83EB86,`>GHP9&,R,60S80!Z>C`P8C<Q-S-D`'IZ,#$V9#ED
+M-#$`>GHP,#5B.#1F9`!Z>C`P-6(X86)D`'IZ,#!B-S`Q,C,`>GHP,#5B-C4R
+M8@!Z>C`R9&(S.#<U`'IZ,#$V93,P.6(`>GHP,#5B-C!B,@!Z>C`R9&(Q.#<U
+M`'IZ,#`R9&(X-#(`>GHP,F1B,3<V,P!Z>C!B-V1E83DT`'IZ,#!B-S`Q-C$`
+M>GHP,39D-V0T,0!Z>C`P,39C9#,R`'IZ,#9D93!B.&$`>GHP-F0Y9&0Y,P!Z
+M>C!D8C-E9#@V`'IZ,#`U8C0X960`>GHP,#)D8S@P8@!Z>C`P,F1B8S0R`'IZ
+M,#)D8F$X-3$`>GHP,F1B,S-E9`!Z>C`P-6(X,&9D`'IZ,#`U8C=F,F4`>GHP
+M,F1B9F1F9`!Z>C`Q-F4V-#AA`'IZ,#`R9&%F9C(`>GHP,#5B-S<Y9`!Z>C`P
+M,&(V964X`'IZ,#$V930T.&$`>GHP,&(V9C9B8P!Z>C`Q-F1A.3(P`'IZ,#5B
+M-S@Q93``>GHP,#)D8V$P8@!Z>C`P-6(T-&%D`'IZ,#9D9&8T-&$`>GHP9F%C
+M,&,Y8@!Z>C!B-F8Y969F`'IZ,#!B-F,V8F,`871H7VAA;%]A9&1I=&EO;F%L
+M7W-W8F%?8F%C:V]F9@!Z>C`P,#)D8CDR`&%T:%]H86Q?=F5R<VEO;@!Z>C`R
+M9&)A8S)E`'IZ,#)D8C<Y864`>GHP,#$V934S,@!Z>C!B-F-F,#`Y`'IZ,#`Q
+M-F4Q,F,`>GHP,#$V9#EE-`!Z>C`P,#)D865A`'IZ,#`U8C5C8C(`>GHP,39D
+M83(U,0!Z>C`V9C9A9C8P`'IZ,#9D9F1D.3,`871H7VAA;%]M86QL;V,`>GHP
+M,#!B-F1D,@!Z>C`R9&0Y,F%D`'IZ,#$V9&(R-3$`>GHP93$P-V-A,0!Z>C`P
+M8C9C-S5E`'IZ,#$V9&0P-3$`>GHP,F1B9#%B,@!Z>C`R9&,Q-S8S`'IZ,&(V
+M.3!D-F0`>GHP,39D9C`U,0!Z>C`P,39D.34P`'IZ,#!B-S`V8F,`>GHP,#$V
+M9#@W,@!Z>C`V9&5F-#1A`'IZ,#5B.&,R960`>GHP-F9B.30W8@!Z>C!E8F(Q
+M93-F`'IZ,&(V9CED,#(`>GHP9#$T9#%B,`!Z>C!B-#@P,S%E`'IZ,#$V9&)B
+M9F4`>GHP,39E-30X80!Z>C`P,39D.#4P`'IZ,#`P8C9F9C@`871H7VAA;%]M
+M96UC<'D`>GHP,F1B8V)B9`!Z>C`Q-F1A,&1D`'IZ,#)D8F)D9F0`>GHP,F1B
+M,C@U,0!Z>C`R9&)D8S%D`'IZ,#9D8C!C9C(`>GHP,39E8CEA9`!Z>C`P8C9C
+M96)C`'IZ,&0Y-#@T83$`871H7VAA;%]P<F]B90!Z>C`Q-F5A.6%D`'IZ,&9D
+M-&0Q8C``>GHP,F1B,S<V,P!A=&A?:&%L7V)U:6QD;W!T<P!Z>C`R9&%F,S5D
+M`'IZ,#9D9&1D.3,`>GHP9&%D8S8R8P!Z>C`Q-F1F,C4Q`'IZ,#`P8C9C,3``
+M>GHP,39D.3(U,0!Z>C`R9&(P.#4Q`'IZ,&(W,C%A960`>GHP-C=C9F-A90!Z
+M>C`P,&(V8V8X`'IZ,&,Y-&0Q8C``>GHP,F1A9F%B,@!Z>C`U8CDR865D`'IZ
+M,#`U8CAC8V(`>GHP8C9D.65F9@!Z>C`R9&(Q,6(R`'IZ,#)D8F9F8C$`>GHP
+M,F1B9C<V,P!Z>C`P-6(V.&9D`'IZ,#`U8C0T960`>GHP8C<Q,6%E9`!Z>C!B
+M-64S,38P`'IZ,&0X-#@T83$`>GHP,39D.&(R9`!Z>C`Q-F4P.#EB`'IZ,#)D
+M8F(X-S4`>GHP,F1A93@U,0!Z>C!B.#%E83DT`'IZ,#$V9&5C,68`>GHP,&(V
+M9F5B8P!Z>C!E.#DT.3`W`'IZ,#!B-F5A-V$`>GHP,S-E.&9B9@!Z>C!C9F$U
+M.#<U`'IZ,#)D8CDY864`>GHP,F1B.6%B,@!Z>C`P,&(V8F4X`'IZ,&1E-C@S
+M-V8`>GHP,39D86)F90!Z>C!B-S`Y9#`R`'IZ,#8W9#(U93(`>GHP,3EF,V$P
+M,0!Z>C`W,#,Y-#=B`&%T:%]H86Q?;65M>F5R;P!Z>C`V9&9F8S!D`'IZ,&(V
+M-S4P8C@`>GHP,39E,F1F9`!Z>C`P,&(V9#(R`'IZ,#9F96%F-C``>GHP9&,T
+M835C-0!Z>C`P8C<P9C=D`&%T:%]H86Q?<W=?8F5A8V]N7W)E<W!O;G-E7W1I
+M;64`>GHP.68V-&(V80!Z>C`P-6(V-3=A`'IZ,#9F,SDT-V(`>GHP-F1A,&-F
+M,@!Z>C!B-V)A9#-E`'IZ,#!B-F8Y-C$`>GHP8C8Y-S-B8P!Z>C`R9&)D,S5D
+M`'IZ,#`U8C@X9F0`>GHP,F1B8F,Q9`!Z>C`R9&%F9&9D`'IZ,#9D-V1D.3,`
+M871H7VAA;%]D96QA>0!Z>C`R9&(Q9&9D`'IZ,#8W9#)F-#$`>GHP,F1A9C@W
+M-0!Z>C!B-V5D939D`'IZ,#$V9#AD-#$`>GHP,#)D864Y,@!Z>C!B-V%D939D
+M`'IZ,#)D8F(S-60`>GHP,F1B,V1F9`!Z>C`R9&(U,V5D`'IZ,#$V9&-E864`
+M>GHP,#!B-F1A,@!Z>C`P,&(V93(R`'IZ,#5B.#`P-#$`>GHP,#$V9#@T.`!Z
+M>C`Q-F0Y8C)D`'IZ,#`Q-F4P,F,`>GHP,&(W,#<W9`!Z>C`P-6(V.3=A`'IZ
+M,#`Q-F1A930`>GHP,39E,3`Y8@!Z>C`P-6(T83)D`'IZ,#$V9&4P9&0`>GHP
+M,39D9C!D9`!Z>C!D9C`W8V$Q`'IZ,#)D8F0W-C,`>GHP,#!B-F4U,@!Z>C`V
+M-V0P8S0W`'IZ,#5B-F,V9&(`>GHP8S,Q-65B-0!Z>C!D8C%E9#@V`'IZ,#9D
+M-#`V93``>GHP,39E,#(U,0!Z>C`P,#)D8F(R`'IZ,#`R9&0X-F0`>GHP,#$V
+M93$T9`!Z>C`R9&(U.6%E`'IZ,#`V-V0R,C$`>GHP,39D.#!D9`!Z>C`P-6(X
+M.3-D`'IZ,#5B.#%B,6(`>GHP,F1B,3-E9`!Z>C`P8C9D,3(S`'IZ,#`P8C9C
+M93@`>GHP-6(X86%E9`!Z>C!B-F5D,S8S`'IZ,#)D868Q8C(`>GHP,#`U8C5E
+M,@!Z>C`S,V5B9F)F`'IZ,#5B-C@V9&(`>GHP,#!B-F5F.`!Z>C!B-S$Y865D
+M`'IZ,#`U8C4X8C(`>GHP-6(W9&(Q8@!Z>C!B.#)D939D`'IZ,#`Q-F0W,S(`
+M>GHP,F1A9&%B,@!Z>C!F-#5E-F4S`&%T:%]H86Q?:6YI=%]C:&%N;F5L<P!Z
+M>C`P8C9D-F)C`'IZ,&,Q-&0Q8C``>GHP,#`R9&)D,@!Z>C!D830X-&$Q`'IZ
+M,#$V93!B.#<`>GHP-6(Y,#)E9`!Z>C!D8S)E,SDP`'IZ,&$V,&0Q-#4`>GHP
+M,F1B86)B9`!Z>C`P,&(V8S%D`'IZ,#5B.&5A960`>GHP,#5B-V(Y9`!Z>C`P
+M-6(U-#0V`'IZ,#5B-C0V9&(`>GHP,&(V9CDR,P!Z>C!D9#8X,S=F`'IZ,#$V
+M93$R-3$`>GHP9&,V835C-0!Z>C`R9&(S-S!A`'IZ,#`P-6(V-S(`>GHP-F1E
+M9F,P9`!Z>C`R9&)F,S5D`'IZ,#`P8C9C-S@`>GHP,#$V9#@S,@!Z>C`R9&(U
+M-S!A`'IZ,#`U8C9D-V$`>GHP,#)D8C(Y,@!Z>C`P-6(Y,&-B`&%T:%]H86Q?
+M<F5G7W=R:71E`'IZ,&(V9C4S-C,`>GHP,#5B-6,T-@!A=&A?:&%L7W)E9U]R
+M96%D`'IZ,#9D.3!C9C(`>GHP-F0X9&0Y,P!Z>C`Q-F1F8C@W`'IZ,#`Q-F1A
+M-#@`>GHP8C8V,S%A.`!Z>C`P,F1B,#DR`&%T:%]H86Q?9V5T=VER96QE<W-M
+M;V1E<P!Z>C`Q-F4Q8C@W``@````%`@``$`````8"``",````!0(``)0````&
+M`@``R`````4"``#0````!@(``/@````%`@````$```8"```\`0``!0(``$0!
+M```&`@``3`$```4"``!4`0``!@(``+0````%`@``6`````4"``!D`0``!@(`
+M`#`!```%`@``3`````4"``!L`0``!@(``*0````%`@``>`````4"``!T`0``
+M!@(``!@!```%`@``"`$```4"``!H````!0(``#0````%`@``?`$```8"``"\
+M`0``!0$``,`!```&`0``S`(```5V``#0`@``!G8``.0"```%A`$`&`(```6$
+M`0#H`@``!H0!`/P"```%1P````,```9'``"P`P``!9`!`+0#```&D`$`N`,`
+M``4U`0"\`P``!C4!`&`'```%O```9`<```:\```<"```!;P``"`(```&O```
+M$`D```4>`0`4"0``!AX!`"`)```%`@``)`D```8"``!`"0``!0(``$0)```&
+M`@``@`D```4>`0"$"0``!AX!`)`)```%`@``E`D```8"``"D"0``!0(``*@)
+M```&`@``/`H```5F``!`"@``!F8``!0+```%`@``&`L```8"```8#@``!9`!
+M`!P.```&D`$`(`\```4!```D#P``!@$``-@1```%_0``W!$```;]````$@``
+M!1X!``02```&'@$`*!(```4"```L$@``!@(``,`2```%`@``Q!(```8"``#@
+M$@``!1X!`.02```&'@$`8!0```4"``!H%```!@(``&P4```%`@``<!0```8"
+M``"X%P``!0$``+P7```&`0``5!@```7-``!8&```!LT``"@=```%`0``4!T`
+M``8!``!@'@``!2`!`&0>```&(`$`9"$```4!``!H(0``!@$``)0A```%`0``
+MF"$```8!```0(@``!8,``!0B```&@P``<",```4!``!T(P``!@$``'PC```%
+M`0``@",```8!```\)```!0$``*PC```%`0``0"0```8!``!<+0``!<T``&`M
+M```&S0``A"T```4@`0"(+0``!B`!`*PM```%`0``L"T```8!``#<+0``!0$`
+M`.`M```&`0``\"T```4!``#T+0``!@$``#PN```%(`$`0"X```8@`0!H+@``
+M!0$``&PN```&`0``F"X```4!``"<+@``!@$``*PN```%`0``L"X```8!``#X
+M+@``!2`!`/PN```&(`$`)"\```4!```H+P``!@$``%0O```%`0``6"\```8!
+M``!H+P``!0$``&PO```&`0``D"\```6#``"4+P``!H,``!@P```%`0``'#``
+M``8!``!0,```!0$``%0P```&`0``%#$```4!```8,0``!@$``&0T```%`0``
+M:#0```8!``#$-```!0$``,@T```&`0``F#D```4!``"<.0``!@$``*`Y```%
+M`0``I#D```8!``"T.@``!0(``+@Z```&`@``R#H```4"``#,.@``!@(``(`\
+M```%`0``A#P```8!``"P2```!0$``+1(```&`0``R$@```4!``#,2```!@$`
+M`.!(```%`0``Y$@```8!``#X2```!0$``/Q(```&`0``$$D```4!```420``
+M!@$``%Q)```%`0``8$D```8!```$2@``!0$```A*```&`0``*$H```4#```L
+M2@``!@,``&1*```%`P``:$H```8#``"X2@``!0$``+Q*```&`0``"$L```4#
+M```,2P``!@,``.Q+```%`0``\$L```8!``!`3```!0$``$1,```&`0``6$P`
+M``4!``!<3```!@$``'A,```%`0``?$P```8!``"\3```!0$``,!,```&`0``
+M/$T```4#``!`30``!@,``(A-```%`0``C$T```8!``"H30``!0$``*Q-```&
+M`0``Q$T```4#``#(30``!@,``"Q.```%`P``,$X```8#```T3@``!>8``#A.
+M```&Y@``C$X```4#``"43@``!@,``"1/```%`0``*$\```8!``",3P``!0$`
+M`$1/```%`0``2$\```8!``!@3P``!0$``&1/```&`0``F$\```4#``"<3P``
+M!@,```10```%`P``"%````8#```,4```!0,``!!0```&`P``J%````4!``"L
+M4```!@$``(!2```%`0``A%(```8!``"84@``!0$``)Q2```&`0``N%(```4!
+M``"\4@``!@$``-Q2```%`0``M%(```4!``#@4@``!@$``.Q2```%`0``\%(`
+M``8!```(4P``!0$```Q3```&`0``*%,```4!```L4P``!@$``)Q3```%`0``
+MH%,```8!``#X4P``!0(``/Q3```&`@```%0```4"```L6```!0(```14```&
+M`@``Q%0```4#``#(5```!@,``.14```%`P``Z%0```8#````50``!0,```15
+M```&`P``&%4```4#```<50``!@,``#15```%`P``/%4```8#``!$50``!0,`
+M`$A5```&`P``6%4```4!``!<50``!@$``'A5```%`0``?%4```8!``"D50``
+M!0$``*A5```&`0``D%8```4@`0"45@``!B`!`#!8```%`@``-%@```8"``!4
+M6```!0$``%A8```&`0``:%@```4!``!P6```!@$``/1:```%_0``3%H```7]
+M``!06@``!OT``,1:```%`0``R%H```8!``!86P``!?T``%Q;```&_0``S%L`
+M``7]``#06P``!OT``'!=```%`0``=%T```8!``!(7@``!0$``#A>```%`0``
+M'%X```4!```,7@``!0$``.Q=```%`0``R%T```4!``"P70``!0$``(Q=```%
+M`0``3%X```8!``"D7@``!0,``*Q>```&`P``L%X```4#``"T7@``!@,``+A>
+M```%`P``O%X```8#``#`7@``!0$``,1>```&`0``?%\```4#``"$7P``!@,`
+M`(A?```%`P``C%\```8#``"07P``!0,``)1?```&`P``F%\```4!``"<7P``
+M!@$``#1@```%`0``.&````8!``!D8```!0$``&A@```&`0``?&````4!``"`
+M8```!@$``/!@```%S0``]&````;-```080``!>8``!1A```&Y@``'&$```4"
+M```@80``!@(``'!A```%.P$`=&$```8[`0"480``!9`!`)AA```&D`$`Q&$`
+M``6-`0#(80``!HT!`.!A```%C0$`Y&$```:-`0`(8@``!9`!``QB```&D`$`
+M&&(```4O```<8@``!B\``$1B```%C0$`2&(```:-`0!<8@``!2H!`&!B```&
+M*@$`C&(```4J`0"08@``!BH!`+1B```%*@$`N&(```8J`0#X8@``!2H!`/QB
+M```&*@$`1&,```4J`0!(8P``!BH!`.AC```%>P``[&,```9[``"$9@``!0$`
+M`(AF```&`0``H&8```4J`0"D9@``!BH!`!1G```%C0$`&&<```:-`0!`9P``
+M!8T!`$1G```&C0$`7&<```6#``!@9P``!H,``+!G```%@P``M&<```:#``#,
+M:@``!8T!`+QH```%C0$`P&@```:-`0!`:0``!3$``$1I```&,0``5&D```4H
+M`0!8:0``!B@!`)1I```%8P$`F&D```9C`0#$:0``!8T!`,AI```&C0$`V&D`
+M``60`0#<:0``!I`!`%QJ```%D`$`8&H```:0`0!\:@``!8T!`(!J```&C0$`
+MT&H```60`0#4:@``!I`!`.QJ```%C0$`\&H```:-`0`$:P``!8T!``AK```&
+MC0$`'&L```60`0`@:P``!I`!`%QK```%C0$`8&L```:-`0"X:P``!8T!`+QK
+M```&C0$`^&L```60`0#\:P``!I`!`#AL```%D`$`/&P```:0`0!<;0``!8T!
+M`"AM```%C0$`+&T```:-`0"0;0``!8T!`)1M```&C0$`!&X```60`0`(;@``
+M!I`!`%QN```%C0$`8&X```:-`0"P;P``!8T!`+1O```&C0$`:'$```6-`0!L
+M<0``!HT!`.1Q```%;P``Z'$```9O```\<@``!>8``$!R```&Y@``:'(```7F
+M``!L<@``!N8``)1R```%Y@``F'(```;F``"@<@``!0(``*1R```&`@``X'(`
+M``60`0#D<@``!I`!`/!R```%2@``]'(```9*```4<P``!9`!`!AS```&D`$`
+MM',```4D`0"X<P``!B0!`,AS```%=```S',```9T```0=```!9`!`!1T```&
+MD`$`/'0```6-`0!`=```!HT!`(1T```%D`$`B'0```:0`0"D=```!8T!`*AT
+M```&C0$`]'0```60`0#X=```!I`!`!QU```%C0$`('4```:-`0!L=0``!9`!
+M`'!U```&D`$`N'4```60`0"\=0``!I`!``!V```%C0$`!'8```:-`0`<=@``
+M!4\!`"!V```&3P$`8'8```60`0!D=@``!I`!`*QV```%C0$`L'8```:-`0#<
+M=@``!9`!`.!V```&D`$`)'<```60`0`H=P``!I`!`&AW```%C0$`;'<```:-
+M`0#`=P``!>8``,1W```&Y@``^'<```6-`0#\=P``!HT!`#QX```%D`$`0'@`
+M``:0`0`8?@``!9`!`&QX```&D`$`A'@```6-`0"(>```!HT!`-1X```%D`$`
+MV'@```:0`0!,>0``!9`!`%!Y```&D`$`>'D```60`0!\>0``!I`!`(QY```%
+MC0$`D'D```:-`0#0>0``!9`!`-1Y```&D`$`\'D```60`0#\>0``!I`!`%!Z
+M```%D`$`5'H```:0`0"<>@``!9`!`*!Z```&D`$`6'L```4E``!<>P``!B4`
+M`'![```%6P$`A'L```9;`0"4>P``!8T!`)A[```&C0$`W'L```60`0#@>P``
+M!I`!`.Q[```%)0``\'L```8E```T?```!24``#A\```&)0``3'P```60`0!@
+M?```!I`!`'1\```%6P$`>'P```9;`0"4?```!8T!`)A\```&C0$`X'P```60
+M`0#D?```!I`!`/!\```%)0``]'P```8E``!$?0``!9`!`$A]```&D`$`7'T`
+M``6-`0!@?0``!HT!`(1]```%D`$`B'T```:0`0"<?0``!8T!`*!]```&C0$`
+M`'X```4E```$?@``!B4``"Q^```&D`$`0'X```5;`0!$?@``!EL!`&Q^```%
+MC0$`<'X```:-`0"X?@``!9`!`+Q^```&D`$`S'X```4E``#0?@``!B4``$!_
+M```%%@$`1'\```86`0"(?P``!8T!`(Q_```&C0$`I'\```4;``"H?P``!AL`
+M`-1_```%-P$`V'\```8W`0!@@0``!9`!`!"````%D`$`%(````:0`0`D@```
+M!8T!`"B````&C0$`K(````60`0"P@```!I`!`,2````%C0$`R(````:-`0#<
+M@```!34!`."````&-0$`\(````60`0#T@```!I`!`/R````%-0$``($```8U
+M`0`,@0``!8T!`!2!```&C0$`;($```60`0!P@0``!I`!`(B!```%C0$`C($`
+M``:-`0#L@0``!9`!`/"!```&D`$``((```6-`0`$@@``!HT!`(B"```%`0``
+MH((```8!``"T@@``!0$``+B"```&`0``S((```4!``#0@@``!@$```2#```%
+MD`$`"(,```:0`0!8@P``!1$``&"#```&$0``9(,```7Q``!H@P``!O$``&R#
+M```%*0$`<(,```8I`0"8@P``!9`!`)R#```&D`$`P(,```6-`0#$@P``!HT!
+M`.2#```%C0$`Z(,```:-`0`@A```!8T!`"2$```&C0$`.(0```60`0`\A```
+M!I`!`$"$```%-0$`1(0```8U`0"HA```!9`!`*R$```&D`$`O(0```6-`0#`
+MA```!HT!`/2$```%D`$`^(0```:0`0`$A0``!8T!``B%```&C0$`3(4```6-
+M`0!0A0``!HT!`+2%```%D`$`N(4```:0`0#4A0``!8T!`-B%```&C0$`](4`
+M``:0`0`0A@``!8T!`!2&```&C0$`;(8```60`0!PA@``!I`!`(B&```%C0$`
+MC(8```:-`0"HA@``!I`!`,"&```%C0$`Q(8```:-`0#XA@``!9`!`/R&```&
+MD`$`-(<```6-`0`XAP``!HT!``2(```%D`$`"(@```:0`0!$B```!9`!`$B(
+M```&D`$`$(H```7]```4B@``!OT``+27```%D`$`6(L```60`0`@BP``!9`!
+M`$B*```%D`$`4(H```:0`0!<B@``!9`!`&"*```&D`$`=(H```4[`0!XB@``
+M!CL!``2+```%C0$`M(H```6-`0"XB@``!HT!`.B*```%`0``[(H```8!``"8
+MEP``!9`!`"B+```&D`$`+(L```6-`0`PBP``!HT!`!B0```%C0$`7(L```:-
+M`0`,BP``!8T!`'"+```&C0$`A(L```60`0"<BP``!I`!`*"+```%C0$`I(L`
+M``:-`0#(BP``!9`!`,R+```&D`$`W(L```6-`0#@BP``!HT!`%"-```%M@``
+M5(T```:V```XC@``!0(``#R.```&`@``0(X```4"``!$C@``!@(``$B.```%
+MC0$`3(X```:-`0"8C@``!84!`)R.```&A0$`M(X```60`0"XC@``!I`!`-R.
+M```%C0$`X(X```:-`0#TCP``!0$``/B/```&`0``1)````6-`0!(D```!HT!
+M`%R0```%-0$`8)````8U`0!LD```!9`!`'"0```&D`$`D)````5*``"4D```
+M!DH``*R0```%E```L)````:4``#<D```!5<``."0```&5P``")$```5^```,
+MD0``!GX``!B1```%D`$`')$```:0`0`TD0``!8T!`#B1```&C0$`6)$```5_
+M`0!<D0``!G\!`'21```%"P``>)$```8+``"0D0``!1@!`)21```&&`$`K)$`
+M``6-`0"PD0``!HT!`#"2```%D`$`-)(```:0`0"LD@``!8T!`+"2```&C0$`
+MV)(```6-`0#<D@``!HT!`!"3```%`0``%),```8!```TDP``!0$``#B3```&
+M`0``:),```7X``!LDP``!O@``(23```%`0``B),```8!``"<DP``!34!`*"3
+M```&-0$`K),```4!``"PDP``!@$``/R3```%^````)0```;X```PE```!8T!
+M`#24```&C0$`1)0```4!``!(E```!@$``&24```%-0$`:)0```8U`0!TE```
+M!0$``'B4```&`0``E)0```4U`0"8E```!C4!`*24```%^```J)0```;X``#$
+ME```!0$``,B4```&`0``()4```7]```DE0``!OT``#B5```%D`$`/)4```:0
+M`0!,E0``!8T!`%"5```&C0$`C)4```4U`0"0E0``!C4!`,25```%`0``R)4`
+M``8!``#@E0``!34!`.25```&-0$`\)4```60`0#TE0``!I`!``R6```%C0$`
+M$)8```:-`0`TEP``!4H``#B7```&2@``@)<```64``"$EP``!I0``,B7```%
+MD`$`S)<```:0`0#@EP``!8T!`.27```&C0$`=)@```6-`0!XF```!HT!`(R8
+M```%-0$`D)@```8U`0"@F```!4H``*28```&2@``S)@```6-`0#0F```!HT!
+M`#"=```%`0``-)T```8!``"DG0``!0(``*B=```&`@``W)T```4!``#@G0``
+M!@$``/B=```%`0``_)T```8!```TG@``!0$``#B>```&`0``4)X```4!``!4
+MG@``!@$``(R>```%`0``D)X```8!``"HG@``!0$``*R>```&`0``Y)X```4!
+M``#HG@``!@$```"?```%`0``!)\```8!``"XGP``!>8``+R?```&Y@``Q)\`
+M``4"``#(GP``!@(``-B?```%`@``W)\```8"``#HGP``!0$``.R?```&`0``
+M-*````4O```XH```!B\``&R@```%+P``<*````8O``!@H@``!2\``&2B```&
+M+P``T*(```6-`0#4H@``!HT!``BC```%C0$`#*,```:-`0"`HP``!2\``(2C
+M```&+P``F*,```6-`0"<HP``!HT!`.BC```%D`$`[*,```:0`0!$I```!9`!
+M`$BD```&D`$`5*0```6-`0!8I```!HT!`&RD```%2@``<*0```9*``"0I```
+M!34!`)2D```&-0$`F*0```52``"<I```!E(``$RE```%9@$`4*4```9F`0"4
+MI0``!14!`)BE```&%0$`1*8```4@`0!(I@``!B`!`(BF```%O0``C*8```:]
+M``"\IP``!8T!`,"G```&C0$`.*@```60`0`\J```!I`!`$RN```%C0$`@*@`
+M``:-`0``J0``!9`!``2I```&D`$`?*D```6-`0"`J0``!HT!`/RJ```%D`$`
+M`*L```:0`0!DJP``!8T!`&BK```&C0$`?*L```6-`0"`JP``!HT!`+RK```%
+MH0``P*L```:A``#8JP``!4\!`-RK```&3P$`[*L```60`0#PJP``!I`!`"BL
+M```%3P$`+*P```9/`0!$K```!8T!`$BL```&C0$`6*P```5/`0!<K```!D\!
+M`.RM```%C0$`X*P```:-`0#\K```!8T!``"M```&C0$`+*T```6-`0`PK0``
+M!HT!`(BM```%D`$`C*T```:0`0"XK```!8T!``RN```&C0$`)*X```60`0`H
+MK@``!I`!`"RN```%-0$`-*X```8U`0!DK@``!8T!`&BN```&C0$`A*X```5*
+M``"(K@``!DH``-BQ```%C0$`W+$```:-`0#PL0``!8T!`/2Q```&C0$`1+,`
+M``60`0`8L@``!9`!`!RR```&D`$`.+(```4O```\L@``!B\``*"R```%S0``
+MI+(```;-``#`L@``!>8``,2R```&Y@``S+(```4"``#0L@``!@(``!RS```%
+ME@$`(+,```:6`0!(LP``!8T!`$RS```&C0$`$+0```4U`0!PLP``!34!`'2S
+M```&-0$`@+,```60`0"$LP``!I`!`+BS```%D`$`O+,```:0`0#0LP``!0$`
+M`-2S```&`0``]+,```6-`0#XLP``!HT!`!2T```&C0$`*+0```4U`0`LM```
+M!C4!`#BT```%`0``/+0```8!``!<M```!4@!`&"T```&2`$`E+0```60`0"8
+MM```!I`!`+RT```%2`$`P+0```9(`0#LM```!4@!`/"T```&2`$`>+4```4"
+M``!\M0``!@(``-RU```%>`$`X+4```9X`0`0M@``!8T!`!2V```&C0$`*+8`
+M``4U`0`LM@``!C4!`#BV```%`0``/+8```8!``"$M@``!4@!`(BV```&2`$`
+ML+8```72``"TM@``!M(``+RV```%`0``P+8```8!``#,M@``!8`!`-"V```&
+M@`$`Z+8```5(`0#LM@``!D@!`'2W```%90$`>+<```9E`0#,MP``!1T!`-"W
+M```&'0$`W+<```6#``#@MP``!H,``)"X```%D`$`E+@```:0`0"\N```!8T!
+M`,"X```&C0$`T+@```60`0#4N```!I`!``2Y```%C0$`"+D```:-`0`,N0``
+M!9`!`!"Y```&D`$`<+D```6-`0!TN0``!HT!`)"Y```%-0$`E+D```8U`0!L
+MN@``!=T``'"Z```&W0``++L```5(`0`PNP``!D@!`-2]```%C0$`K+L```6-
+M`0"PNP``!HT!`&B\```%,0``.+P```4Q``!LO```!C$``'R\```%*`$`@+P`
+M``8H`0"HO```!8X!`*R\```&C@$`V+P```6-`0#<O```!HT!`.R\```%D`$`
+M\+P```:0`0!PO0``!9`!`'2]```&D`$`A+T```6-`0"(O0``!HT!`-B]```%
+MD`$`W+T```:0`0#TO0``!8T!`/B]```&C0$`#+X```6-`0`0O@``!HT!`"2^
+M```%D`$`*+X```:0`0!DO@``!8T!`&B^```&C0$`J+X```60`0"LO@``!I`!
+M``B_```%D`$`#+\```:0`0!`OP``!9`!`$2_```&D`$`]+\```60`0#\OP``
+M!I`!`*#````%C0$`I,````:-`0"TP```!9`!`+C````&D`$`,,$```6-`0`T
+MP0``!HT!`*3!```%D`$`J,$```:0`0#\P0``!8T!``#"```&C0$`4,,```6-
+M`0!4PP``!HT!`$3%```%C0$`2,4```:-`0#`Q0``!<L``,3%```&RP``',8`
+M``7F```@Q@``!N8``$C&```%Y@``3,8```;F``!TQ@``!>8``'C&```&Y@``
+M@,8```4"``"$Q@``!@(``,3&```%C0$`R,8```:-`0#HQ@``!4H``.S&```&
+M2@``#,<```60`0`0QP``!I`!`-C'```%X@``W,<```;B``#HQP``!9`!`.S'
+M```&D`$`_,<```6-`0``R```!HT!`!3(```%00$`&,@```9!`0`LR```!3<`
+M`##(```&-P``=,@```60`0!XR```!I`!`)#(```%C0$`E,@```:-`0#8R```
+M!9`!`-S(```&D`$`^,@```6-`0#\R```!HT!`$C)```%D`$`3,D```:0`0!P
+MR0``!8T!`'3)```&C0$`P,D```60`0#$R0``!I`!``3*```%D`$`",H```:0
+M`0`PR@``!8T!`#3*```&C0$`3,H```4&`0!0R@``!@8!`(S*```%D`$`D,H`
+M``:0`0"HR@``!0(``*S*```&`@``P,H```6-`0#$R@``!HT!``C+```%Y@``
+M#,L```;F``!`RP``!8T!`$3+```&C0$`N,L```60`0"\RP``!I`!`##,```%
+MD`$`-,P```:0`0!<S```!9`!`&#,```&D`$`<,P```6-`0!TS```!HT!`+3,
+M```%D`$`N,P```:0`0#4S```!9`!`.#,```&D`$`-,T```60`0`XS0``!I`!
+M`)C-```%D`$`G,T```:0`0!4S@``!24``%C.```&)0``;,X```5;`0!\S@``
+M!EL!`(S.```%C0$`D,X```:-`0#4S@``!9`!`-C.```&D`$`Y,X```4E``#H
+MS@``!B4``"S/```%)0``,,\```8E```0T0``!9`!`%C/```&D`$`;,\```5;
+M`0!PSP``!EL!`(S/```%C0$`D,\```:-`0#8SP``!9`!`-S/```&D`$`Z,\`
+M``4E``#LSP``!B4``#S0```%D`$`0-````:0`0!4T```!8T!`%C0```&C0$`
+M?-````60`0"`T```!I`!`)30```%C0$`F-````:-`0#XT```!24``/S0```&
+M)0``1,\```60`0`DT0``!I`!`#C1```%6P$`/-$```9;`0!DT0``!8T!`&C1
+M```&C0$`L-$```60`0"TT0``!I`!`,31```%)0``R-$```8E```8T@``!9`!
+M`!S2```&D`$`0-(```60`0!$T@``!I`!`&S2```%C0$`<-(```:-`0"@T@``
+M!=X``+#2```&W@``^-(```46`0#\T@``!A8!`##3```%C0$`--,```:-`0!0
+MTP``!1L``%33```&&P``@-,```4W`0"$TP``!C<!`(#4```%D`$`S-,```60
+M`0#0TP``!I`!`.33```%C0$`Z-,```:-`0#\TP``!34!``#4```&-0$`$-0`
+M``60`0`4U```!I`!`!S4```%-0$`(-0```8U`0`LU```!8T!`#34```&C0$`
+MC-0```60`0"0U```!I`!`*C4```%C0$`K-0```:-`0`,U0``!9`!`!#5```&
+MD`$`(-4```6-`0`DU0``!HT!`)S5```%D`$`H-4```:0`0"PU0``!8T!`+35
+M```&C0$`.-8```4!``!0U@``!@$``&36```%`0``:-8```8!``!\U@``!0$`
+M`(#6```&`0``M-8```60`0"XU@``!I`!`"37```%N@``+-<```:Z```PUP``
+M!0@!`#C7```&"`$`/-<```7M``!`UP``!NT``$37```%*0$`2-<```8I`0!X
+MUP``!9`!`'S7```&D`$`H-<```6-`0"DUP``!HT!`,37```%C0$`R-<```:-
+M`0#TUP``!8T!`/C7```&C0$`"-@```5*```,V```!DH``$C8```%D`$`3-@`
+M``:0`0!<V```!8T!`&#8```&C0$`E-@```60`0"8V```!I`!`*38```%C0$`
+MJ-@```:-`0#LV```!8T!`/#8```&C0$`5-D```60`0!8V0``!I`!`'39```%
+MC0$`>-D```:-`0"4V0``!I`!`+#9```%C0$`M-D```:-`0`,V@``!9`!`!#:
+M```&D`$`*-H```6-`0`LV@``!HT!`$C:```&D`$`8-H```6-`0!DV@``!HT!
+M`)C:```%D`$`G-H```:0`0#`V@``!8T!`,3:```&C0$`B-L```60`0",VP``
+M!I`!`*#=```%_0``B-T```7]``"DW0``!OT```C\```%D`$`[/L```60`0``
+MW@``!9`!``3>```&D`$`3-X```60`0!0W@``!I`!`*C>```%D`$`K-X```:0
+M`0#(W@``!9`!`,S>```&D`$`)-\```66`0`HWP``!I8!`,C?```%C0$`S-\`
+M``:-`0!TY0``!8T!`.C?```&C0$`7.\```4O``!(X```!2\``$S@```&+P``
+M;.````4#```HX```!0,``'#@```&`P``T.````4#``#4X```!@,``-C@```%
+MC0$`W.````:-`0`<X0``!0$```C@```%`0``(.$```8!```TX0``!0(``#CA
+M```&`@``/.$```6-`0!`X0``!HT!`(CA```%`@``C.$```8"``"0X0``!8T!
+M`)3A```&C0$`V.$```4"``#<X0``!@(``.#A```%C0$`Y.$```:-`0!`X@``
+M!9`!`$3B```&D`$`9.(```6-`0!HX@``!HT!`,#B```%C0$`Q.(```:-`0`4
+MXP``!8T!`!CC```&C0$`:.,```6-`0!LXP``!HT!`*3C```%`0``J.,```8!
+M``"XXP``!9`!`+SC```&D`$`O.0```4A`0"<Y```!2$!`(SD```%(0$`P.0`
+M``8A`0#TY```!9`!`/CD```&D`$`(.4```6-`0`DY0``!HT!`#CE```%`0``
+MY.0```4!```\Y0``!@$``$SE```%`0``4.4```8!``"$Y0``!8T!`(CE```&
+MC0$`G.4```6-`0"@Y0``!HT!`+3E```%D`$`N.4```:0`0`4Y@``!34!`!CF
+M```&-0$`).8```60`0`HY@``!I`!`#CF```%C0$`/.8```:-`0!0Y@``!4H`
+M`%3F```&2@``;.8```4=``!PY@``!AT``*SF```%C0$`L.8```:-`0#8Y@``
+M!8T!`-SF```&C0$`".<```4-`0`,YP``!@T!`"SG```%C0$`,.<```:-`0!D
+MYP``!9`!`&CG```&D`$`".@```51```,Z```!E$``!CH```%D`$`'.@```:0
+M`0`TZ```!8T!`#CH```&C0$`6.@```6:``!<Z```!IH``'3H```%U```>.@`
+M``;4``"0Z```!3@``)3H```&.```K.@```6-`0"PZ```!HT!`(CJ```%`0``
+M,.H```4!```@Z@``!0$``/SI```%`0``'.D```4!```@Z0``!@$``$CI```%
+M5@$`3.D```96`0!DZ0``!0$``&CI```&`0``@.D```4U`0"$Z0``!C4!`+SI
+M```%5@$`P.D```96`0`TZP``!0$```3J```&`0``Z.H```4!```HZ@``!@$`
+M`+#J```%`0``..H```8!```\Z@``!8T!`$#J```&C0$`=.H```4U`0!XZ@``
+M!C4!`(SJ```%C0$`D.H```:-`0#$Z@``!34!`,CJ```&-0$`].H```6-`0#X
+MZ@``!HT!`!3K```&C0$`..L```6-`0`\ZP``!HT!`%#K```%-0$`5.L```8U
+M`0!PZP``!0$``'3K```&`0``C.L```4U`0"0ZP``!C4!`)SK```%5@$`H.L`
+M``96`0"\ZP``!0$``,#K```&`0``&.P```7]```<[```!OT``#SL```%D`$`
+M0.P```:0`0#\[```!8T!``#M```&C0$`%.T```4!``!<[```!0$``!CM```&
+M`0``+.T```4=``!,[0``!AT``&3M```%-0$`:.T```8U`0"$[0``!0$``&#M
+M```%`0``J.T```8!```<[@``!9`!`"#N```&D`$`,.X```6-`0`T[@``!HT!
+M`$CN```%-0$`3.X```8U`0!<[@``!4H``&#N```&2@``B.X```6-`0",[@``
+M!HT!`.#N```%B0``Y.X```:)```4[P``!0(``!CO```&`@``(.\```4O```D
+M[P``!B\``&CO```%+P``;.\```8O``"4[P``!2\``)CO```&+P``S.\```6-
+M`0#0[P``!HT!`##P```%D`$`-/````:0`0"4\```!9`!`)CP```&D`$`O/``
+M``6-`0#`\```!HT!``CQ```%D`$`#/$```:0`0`0\0``!34!`!CQ```&-0$`
+M4/$```4!``!<\0``!@$``!#R```%`0``%/(```8!```H\@``!9`!`"SR```&
+MD`$`//(```4!``!`\@``!@$``,#R```%;P$`Q/(```9O`0#4\@``!0$``-CR
+M```&`0``]/(```4"``#X\@``!@(``/SR```%`0```/,```8!``!(\P``!9`!
+M`$SS```&D`$`7/,```6-`0!@\P``!HT!`)CS```%`@``H/,```8"``"P\P``
+M!0(``+3S```&`@``V/,```4"``#<\P``!@(``!3U```%`P``&/4```8#``#(
+M]0``!2\``,SU```&+P``W/4```4#``#@]0``!@,``/3V```%C0$`^/8```:-
+M`0"4^```!8T!`)CX```&C0$`2/D```60`0!,^0``!I`!`'#Y```%C0$`=/D`
+M``:-`0"H^0``!9`!`*SY```&D`$`O/D```6-`0#`^0``!HT!`-CY```%D`$`
+MW/D```:0`0`,^@``!8T!`!#Z```&C0$`)/H```7>```H^@``!MX``%CZ```%
+MD`$`7/H```:0`0",^@``!8T!`)#Z```&C0$`0/P```60`0!$_```!I`!`&3\
+M```%C0$`:/P```:-`0#0_```!8T!`-3\```&C0$`N/T```4!``"\_0``!@$`
+M`-#]```%%```U/T```84``!0_@``!0$``%3^```&`0``S/X```4@`0#0_@``
+M!B`!`-3^```%!```V/X```8$``#D_@``!00``.C^```&!```]/X```4$``#X
+M_@``!@0``##_```%!```-/\```8$``!8_P``!0$``%S_```&`0``8/\```4$
+M``!D_P``!@0``*3_```%!```J/\```8$``#`_P``!00``,3_```&!```,``!
+M``4$```T``$`!@0``$```0`%!```1``!``8$``#4``$`!00``-@``0`&!```
+M&`$!``4$```<`0$`!@0``#@!`0`%!```/`$!``8$``!``0$`!0$``$0!`0`&
+M`0``2`$!``4$``!,`0$`!@0``*`!`0`%!```I`$!``8$``"``@$`!00``(0"
+M`0`&!```N`(!``4$``"\`@$`!@0``,`"`0`%C0$`Q`(!``:-`0#4`P$`!1,!
+M`-@#`0`&$P$`7`0!``4!``!@!`$`!@$``$@%`0`%`0``3`4!``8!````!@$`
+M!0(```0&`0`&`@``X`8!``4!``#D!@$`!@$``$P'`0`%!```4`<!``8$``!X
+M!P$`!0(``'P'`0`&`@``F`<!``4$``"<!P$`!@0``,0'`0`%!```R`<!``8$
+M``#X!P$`!00``/P'`0`&!```:`@!``6-`0!L"`$`!HT!`(`(`0`%!```A`@!
+M``8$``#<"`$`!6P``.`(`0`&;```Z`@!``4$``#L"`$`!@0``/@(`0`%!```
+M_`@!``8$``!P"0$`!0$``'0)`0`&`0``G`D!``4!``"@"0$`!@$``,`)`0`%
+M`0``Q`D!``8!``#X"0$`!0$``/P)`0`&`0``1`H!``4!``!("@$`!@$``#P.
+M`0`%`0``0`X!``8!``!8#@$`!0(``%P.`0`&`@``.`\!``6-`0`\#P$`!HT!
+M`*`/`0`%D`$`I`\!``:0`0#0#P$`!0$``-0/`0`&`0``[`\!``4!``#P#P$`
+M!@$```00`0`%`0``"!`!``8!```@$`$`!0$``"00`0`&`0``J!`!``4"``"L
+M$`$`!@(``/@0`0`%`@``_!`!``8"````$0$`!0(```01`0`&`@``=!$!``4"
+M``!X$0$`!@(``*@1`0`%`@``K!$!``8"``#$$0$`!0(``,P1`0`&`@``T!$!
+M``4"``#4$0$`!@(``-@1`0`&`@``J!(!``60`0"L$@$`!I`!`!03`0`%C0$`
+M&!,!``:-`0!`$P$`!8T!`$03`0`&C0$`>!,!``4!``!\$P$`!@$``+@3`0`%
+M\P``O!,!``;S``#4$P$`!08!`-@3`0`&!@$`Z!,!``60`0#L$P$`!I`!`"P4
+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
+M`0`%`@``Y/0!``8"``#H]`$`!8T!`.ST`0`&C0$`\/0!``4U`0#T]`$`!C4!
+M`$CU`0`%`@``4/4!``8"``!4]0$`!8T!`%CU`0`&C0$`7/4!``4U`0!@]0$`
+M!C4!`+SU`0`%`@``P/4!``8"```@]@$`!7<``"3V`0`&=P``5/8!``5W``!8
+M]@$`!G<``+SV`0`%`@``P/8!``8"``#(]@$`!8T!`,SV`0`&C0$`T/8!``4U
+M`0#4]@$`!C4!`##W`0`%`@``-/<!``8"``!T]P$`!7<``'CW`0`&=P``)/@!
+M``4"```H^`$`!@(``##X`0`%C0$`-/@!``:-`0`X^`$`!34!`#SX`0`&-0$`
+M?/H!``4@`0"`^@$`!B`!`-SZ`0`%`0``X/H!``8!``"<_`$`!0$``*#\`0`&
+M`0``</X!``4!``!T_@$`!@$``)S^`0`%50$`H/X!``95`0#`_@$`!0$``,3^
+M`0`&`0``^/X!``4!``#\_@$`!@$``$#_`0`%`0``1/\!``8!``"\``(`!54!
+M`,```@`&50$`\``"``6#``#T``(`!H,```P!`@`%@P``$`$"``:#```X`0(`
+M!0(``$`!`@`&`@``4`$"``4"``!4`0(`!@(``'@!`@`%`@``?`$"``8"``"H
+M`0(`!<T``*P!`@`&S0``V`$"``7-``#<`0(`!LT````"`@`%`0``!`("``8!
+M```,`@(`!0$``!`"`@`&`0``&`("``4!```<`@(`!@$``"0"`@`%`0``*`("
+M``8!```P`@(`!0$``#0"`@`&`0``/`("``4!``!``@(`!@$``$@"`@`%`0``
+M3`("``8!``!4`@(`!0$``%@"`@`&`0``O`("``4"``#``@(`!@(``,0"`@`%
+MC0$`R`("``:-`0#,`@(`!34!`-`"`@`&-0$`,`,"``4"```T`P(`!@(``#@#
+M`@`%C0$`/`,"``:-`0!``P(`!34!`$0#`@`&-0$`D`,"``4"``"4`P(`!@(`
+M`)@#`@`%C0$`G`,"``:-`0"@`P(`!34!`*0#`@`&-0$`^`0"``4O``#\!`(`
+M!B\``!`%`@`%D`$`%`4"``:0`0`X!0(`!8T!`#P%`@`&C0$`6`4"``6-`0!<
+M!0(`!HT!`.@%`@`%+P``[`4"``8O``!<!@(`!2\``&`&`@`&+P``Q`8"``4O
+M``#(!@(`!B\``"@'`@`%+P``+`<"``8O``!H!P(`!8T!`&P'`@`&C0$`T`<"
+M``4"``#4!P(`!@(``+0)`@`%`@``N`D"``8"``#D"0(`!0(``.@)`@`&`@``
+M(`H"``4"```D"@(`!@(``&`*`@`%`@``9`H"``8"``"H"@(`!7<``*P*`@`&
+M=P``O`L"``5W``#`"P(`!G<``/P+`@`%=P````P"``9W``",#`(`!7<``)`,
+M`@`&=P``$`T"``5W```4#0(`!G<``)@-`@`%`@``G`T"``8"``#T#0(`!7<`
+M`/@-`@`&=P``$`X"``5W```4#@(`!G<``(@.`@`%`@``C`X"``8"``"0#@(`
+M!8T!`)0.`@`&C0$`F`X"``4U`0"<#@(`!C4!`.`.`@`%`@``Z`X"``8"``#P
+M#@(`!8T!`/0.`@`&C0$`^`X"``4U`0#\#@(`!C4!`$@/`@`%`@``4`\"``8"
+M``!4#P(`!8T!`%@/`@`&C0$`7`\"``4U`0!@#P(`!C4!`*P/`@`%`@``M`\"
+M``8"``"\#P(`!8T!`,`/`@`&C0$`Q`\"``4U`0#(#P(`!C4!`"`0`@`%`@``
+M)!`"``8"```L$`(`!8T!`#`0`@`&C0$`-!`"``4U`0`X$`(`!C4!`,02`@`%
+M`0``R!("``8!``#T$@(`!>8``/@2`@`&Y@``D!,"``4!``"4$P(`!@$``!04
+M`@`%`0``&!0"``8!``"4%`(`!0$``)@4`@`&`0``'!4"``4!```@%0(`!@$`
+M`'05`@`%`0``>!4"``8!``#H%0(`!0$``.P5`@`&`0``B!8"``4!``",%@(`
+M!@$``#`7`@`%`0``-!<"``8!```@%P(`!0$``'07`@`&`0``E!D"``4!``"8
+M&0(`!@$``$P=`@`%@P``4!T"``:#``!H'0(`!8,``&P=`@`&@P``4!\"``4!
+M``!4'P(`!@$``'0?`@`%`0``>!\"``8!``"`(`(`!0$``(0@`@`&`0``+"$"
+M``4!```P(0(`!@$``*@A`@`%`0``K"$"``8!```\(@(`!<T``$`B`@`&S0``
+M;"("``7-``!P(@(`!LT``)PB`@`%`0``H"("``8!``"H(@(`!0$``*PB`@`&
+M`0``M"("``4!``"X(@(`!@$``,`B`@`%`0``Q"("``8!``#,(@(`!0$``-`B
+M`@`&`0``V"("``4!``#<(@(`!@$``.0B`@`%`0``Z"("``8!``#P(@(`!2$`
+M`/0B`@`&(0``7","``4"``!@(P(`!@(``&0C`@`%C0$`:","``:-`0!L(P(`
+M!34!`'`C`@`&-0$`T","``4"``#4(P(`!@(``-@C`@`%C0$`W","``:-`0#@
+M(P(`!34!`.0C`@`&-0$`,"0"``4"```T)`(`!@(``#@D`@`%C0$`/"0"``:-
+M`0!`)`(`!34!`$0D`@`&-0$`F"4"``4O``"<)0(`!B\``+`E`@`%D`$`M"4"
+M``:0`0#8)0(`!8T!`-PE`@`&C0$`^"4"``6-`0#\)0(`!HT!`(@F`@`%+P``
+MC"8"``8O``#\)@(`!2\````G`@`&+P``9"<"``4O``!H)P(`!B\``,@G`@`%
+M+P``S"<"``8O```(*`(`!8T!``PH`@`&C0$`^"@"``4"``#\*`(`!@(``"@I
+M`@`%`@``+"D"``8"``!D*0(`!0(``&@I`@`&`@``I"D"``4"``"H*0(`!@(`
+M`.PI`@`%=P``\"D"``9W```@*@(`!0(``"0J`@`&`@``9"H"``4"``!H*@(`
+M!@(``&PJ`@`%C0$`<"H"``:-`0!T*@(`!34!`'@J`@`&-0$`O"H"``4"``#$
+M*@(`!@(``,PJ`@`%C0$`T"H"``:-`0#4*@(`!34!`-@J`@`&-0$`)"L"``4"
+M```L*P(`!@(``#`K`@`%C0$`-"L"``:-`0`X*P(`!34!`#PK`@`&-0$`B"L"
+M``4"``"0*P(`!@(``)@K`@`%C0$`G"L"``:-`0"@*P(`!34!`*0K`@`&-0$`
+M_"L"``4"````+`(`!@(```0L`@`%C0$`""P"``:-`0`,+`(`!34!`!`L`@`&
+M-0$`K"P"``4"``"P+`(`!@(``"@N`@`%`0``+"X"``8!```\,`(`!0$``$`P
+M`@`&`0``/#("``4!``!`,@(`!@$``(PR`@`%`0``D#("``8!```,,P(`!0$`
+M`!`S`@`&`0``]#8"``60`0#X-@(`!I`!`"PW`@`%`0``,#<"``8!``!L-P(`
+M!8T!`'`W`@`&C0$`J#<"``6-`0"L-P(`!HT!`$`X`@`%C0$`1#@"``:-`0"<
+M.`(`!8,``*`X`@`&@P``N#@"``6#``"\.`(`!H,``-0X`@`%@P``V#@"``:#
+M``!,.@(`!0$``)@Z`@`&`0``K#H"``4!``"P.@(`!@$``&@[`@`%`0``;#L"
+M``8!``#D.P(`!0$``.@[`@`&`0``C#P"``4!``"0/`(`!@$``*0\`@`%`0``
+MJ#P"``8!```L/0(`!0$``#`]`@`&`0``P#T"``7-``#$/0(`!LT``/`]`@`%
+MS0``]#T"``;-```8/@(`!<T``!P^`@`&S0``0#X"``4!``!$/@(`!@$``$P^
+M`@`%`0``4#X"``8!``!8/@(`!0$``%P^`@`&`0``9#X"``4!``!H/@(`!@$`
+M`'`^`@`%`0``=#X"``8!``!\/@(`!0$``(`^`@`&`0``B#X"``4!``",/@(`
+M!@$``)0^`@`%(0``F#X"``8A``#\/@(`!0(````_`@`&`@``!#\"``6-`0`(
+M/P(`!HT!``P_`@`%-0$`$#\"``8U`0!P/P(`!0(``'0_`@`&`@``>#\"``6-
+M`0!\/P(`!HT!`(`_`@`%-0$`A#\"``8U`0#0/P(`!0(``-0_`@`&`@``V#\"
+M``6-`0#</P(`!HT!`.`_`@`%-0$`Y#\"``8U`0`X00(`!2\``#Q!`@`&+P``
+M4$$"``60`0!400(`!I`!`'A!`@`%C0$`?$$"``:-`0"800(`!8T!`)Q!`@`&
+MC0$`*$("``4O```L0@(`!B\``)Q"`@`%+P``H$("``8O``#H0@(`!2\``.Q"
+M`@`&+P``,$,"``4O```T0P(`!B\``'!#`@`%C0$`=$,"``:-`0#H1`(`!0(`
+M`.Q$`@`&`@``&$4"``4"```<10(`!@(``%1%`@`%`@``6$4"``8"``"410(`
+M!0(``)A%`@`&`@``Z$4"``5W``#L10(`!G<``&!&`@`%+P``9$8"``8O``!\
+M1@(`!7<``(!&`@`&=P``I$8"``5W``"H1@(`!G<``-Q&`@`%`@``7$8"``4"
+M``#@1@(`!@(``"!'`@`%`@``)$<"``8"```H1P(`!8T!`"Q'`@`&C0$`,$<"
+M``4U`0`T1P(`!C4!`'A'`@`%`@``@$<"``8"``"(1P(`!8T!`(Q'`@`&C0$`
+MD$<"``4U`0"41P(`!C4!`.!'`@`%`@``Z$<"``8"``#L1P(`!8T!`/!'`@`&
+MC0$`]$<"``4U`0#X1P(`!C4!`$1(`@`%`@``3$@"``8"``!42`(`!8T!`%A(
+M`@`&C0$`7$@"``4U`0!@2`(`!C4!`+A(`@`%`@``O$@"``8"``#`2`(`!8T!
+M`,1(`@`&C0$`R$@"``4U`0#,2`(`!C4!`&A)`@`%`@``;$D"``8"``#D2@(`
+M!0$``.A*`@`&`0``^$P"``4!``#\3`(`!@$``/A.`@`%`0``_$X"``8!``!(
+M3P(`!0$``$Q/`@`&`0``R$\"``4!``#,3P(`!@$``+!3`@`%D`$`M%,"``:0
+M`0#H4P(`!0$``.Q3`@`&`0``*%0"``6-`0`L5`(`!HT!`&14`@`%C0$`:%0"
+M``:-`0#\5`(`!8T!``!5`@`&C0$`6%4"``6#``!<50(`!H,``'15`@`%@P``
+M>%4"``:#``"050(`!8,``)15`@`&@P``!%<"``4!``!05P(`!@$``&17`@`%
+M`0``:%<"``8!```@6`(`!0$``"18`@`&`0``G%@"``4!``"@6`(`!@$``$19
+M`@`%`0``2%D"``8!``!<60(`!0$``&!9`@`&`0``Y%D"``4!``#H60(`!@$`
+M`'A:`@`%S0``?%H"``;-``"H6@(`!<T``*Q:`@`&S0``T%H"``7-``#46@(`
+M!LT``/A:`@`%`0``_%H"``8!```$6P(`!0$```A;`@`&`0``$%L"``4!```4
+M6P(`!@$``!Q;`@`%`0``(%L"``8!```H6P(`!0$``"Q;`@`&`0``-%L"``4!
+M```X6P(`!@$``$!;`@`%`0``1%L"``8!``!,6P(`!2$``%!;`@`&(0``R```
+M``(!``#,`````@$``-`````"`0``U`````(!``#8`````@$``-P````"`0``
+MX`````(!``#D`````@$``.@````"`0``[`````(!``#P`````@$``/0````"
+M`0``^`````(!``#\`````@$````!```"`0``!`$```(!```(`0```@$```P!
+M```"`0``$`$```(!```4`0```@$``!@!```"`0``'`$```(!```@`0```@$`
+M`"0!```"`0``*`$```(!```L`0```@$``#`!```"`0``-`$```(!```X`0``
+M`@$``#P!```"`0``0`$```(!``!$`0```@$``$@!```"`0``3`$```(!``!0
+M`0```@$``&@"```"#`$`;`(```)D``!P`@```L```'0"```"LP``>`(```)Z
+M`0!\`@```M,``(`"```"5```A`(```+?``"(`@```J```(P"```"=P$`D`(`
+M``)*`0"4`@```KT``)@"```"/@``G`(```*$``"@`@```E<``*0"```"(```
+MJ`(```)H`0"L`@```I,!`+`"```"+@``M`(```*,``"X`@```D<!`+P"```"
+M*0``P`(```(\``#$`@```F@``,@"```"?@$`S`(```)Y`0#0`@```AD!`-0"
+M```"M```V`(```)?`0#<`@```F(!`.`"```""0$`Y`(```+<``#H`@```CP!
+M`.P"```"D```\`(```)R`0#T`@```KX``/@"```"M@``_`(```*%`````P``
+M`JX```0#```"50``"`,```+'```,`P```C@!`!`#```"#@$`%`,```*D```8
+M`P```C,!`!P#```"Z0``(`,```)<`0`D`P```DP!`"@#```"*P$`+`,```(R
+M```P`P```K4``#0#```"6@$`.`,```(;`0`\`P```B0!`$`#```"/0``1`,`
+M``)T``!(`P```D0!`$P#```"Y```4`,```)/``!4`P```C8``%@#```"BP``
+M7`,```()``!@`P```O4``&0#```"/0$`:`,```(T`0!L`P```O8``'`#```"
+M?P$`=`,```)I``!X`P```@L``'P#```"9`$`@`,```*L``"$`P```@\!`(@#
+M```"&`$`C`,```)N`0"0`P```C(!`)0#```"I@``F`,```)%``"<`P```BT!
+M`*`#```"$P``I`,```*[``"H`P```F\``*P#```"^```L`,```+Z``"T`P``
+M`E$!`+@#```"8P$`O`,```)]`0#``P```@\``,0#```"3@$`R`,```(B`0#,
+M`P```@L!`-`#```"H0``U`,```)/`0#8`P```@$``-P#```"D0$`X`,```(J
+M`0#H`P```EH!`.P#```"&P$`\`,```(D`0#T`P```CT``/@#```"=```_`,`
+M``(!``"(&@```D4!`(P:```"90$`D!H```)7`0"4&@```GP!`)@:```"8P``
+MG!H```)U``"@&@```I,``*0:```";```J!H```(-``"L&@```C4``+`:```"
+M80``M!H```)B``"X&@```CD``+P:```":P$`P!H```(-`0#$&@```H<!`,@:
+M```"@0``S!H```)U`0#0&@```@(!`-0:```"J@``V!H```(G`0#<&@```B(`
+M`.`:```"!P$`Y!H```(9``#H&@```F<!`.P:```"YP``\!H```(?``#T&@``
+M`BH``/@:```"K0``_!H```)[`0``&P```FD!``0;```"=@$`"!L```(Y`0`,
+M&P```O(``!`;```"_P``%!L```+N```8&P```A(!`!P;```"?0``(!L```*8
+M```D&P```G,``"@;```"20$`+!L```*?```P&P```D```#0;```".@$`.!L`
+M``(V`0`\&P```GD``$`;```".@``1!L```)-`0!(&P```MT``$P;```"+@$`
+M4!L```+C``!4&P```L,``%@;```"X@``7!L```)!`0!@&P```LX``&0;```"
+M-P``:!L```)@``!L&P```M@``'`;```"1@$`=!L```)4`0!X&P```B8!`'P;
+M```"'```@!L```);``"$&P```C`!`(@;```"D@$`C!L```)(``"0&P```IH`
+M`)0;```"8`$`F!L```+4``"<&P```@0!`*`;```"'@``I!L```+[``"H&P``
+M`C@``*P;```"``$`L!L```+K``"T&P```HT``+@;```")P``O!L```)0``#`
+M&P```I(``,0;```"VP``R!L```++``#,&P```E8!`-`;```"R@``U!L```)1
+M`0#8&P```HX!`-P;```""```X!L```*B``#D&P```G```.@;```":@``[!L`
+M``+O``#P&P```O,``/0;```"!@$`^!L```(!``#\&P```BP!```<```"2`$`
+M"!P```+#```,'````N(``!`<```"00$`%!P```+.```8'````C<``!P<```"
+M`0``B#H```(!``",.@```@$``)`Z```"`0``E#H```(!``"8.@```@$``)PZ
+M```"`0``H#H```(!``"D.@```@$``/@[```"6@``_#L```*`````/````G,!
+M``0\```":P``"#P```)$```,/````M<``!`\```"N```%#P```(<`0`8/```
+M`JL``!P\```"4P``(#P```*=```D/````E8``"@\```"`P$`+#P```)>`0`P
+M/````HH``#0\```"_@``.#P```+E```\/````I@!`$`\```"C`$`1#P```*Y
+M``!(/````GP``$P\```"(P$`4#P```(H``!4/````ET!`%@\```"4@$`7#P`
+M``*&``!@/````F$!`&0\```"7@``:#P```(_`0!L/````@$!`'`\```"_```
+M=#P```(2``!X/````FP!`'P\```">@``@#P```+@``"$/````G$!`(@\```"
+MV0``C#P```*6``"0/````C$!`)0\```"^0``F#P```(0``"</````IP``*`\
+M```""@``I#P```*7``"H/````CX!`*P\```"L```L#P```+H``"T/````C\`
+M`+@\```"'P$`O#P```*C``#`/````K$``,0\```"%P$`R#P```)-``#,/```
+M`D(!`-`\```"4`$`U#P```(4`0#8/````I0!`-P\```"20``X#P```+&``#D
+M/````J@``.@\```"@@$`[#P```),``#P/````HX``/0\```"A@$`^#P```*G
+M``#\/````LP````]```"0@``!#T```)+```(/0```BT```P]```"00``$#T`
+M``([```4/0```NH``!@]```"1@``'#T```)_```@/0```C0``"0]```",P``
+M*#T```(8```L/0```G(``#`]```"]P``-#T```)M```X/0```B4!`#P]```"
+M@0$`0#T```+0``!$/0```E$!`$@]```"D0``3#T```*/`0!0/0```A`!`%0]
+M```"T0``6#T```(C``!</0```G0!`&`]```";@``9#T```+5``!H/0```L4`
+M`&P]```"[```<#T```**`0!X/0```A<!`'P]```"30``@#T```)"`0"$/0``
+M`E`!`(@]```"%`$`C#T```*5`0"4/0```@$``'!.```"`0``=$X```(!``!X
+M3@```@$``'Q.```"`0``@$X```(!``"$3@```@$``.!.```"`0``Y$X```(!
+M``#H3@```@$``.Q.```"`0``\$X```(!``#T3@```@$``/A.```"`0``_$X`
+M``(!````3P```@$```1/```"`0``"$\```(!```,3P```@$``!!/```"`0``
+M%$\```(!```83P```@$``!Q/```"`0``($\```(!```D3P```@$``"A/```"
+M`0``+$\```(!```P3P```@$``#1/```"`0``.$\```(!```\3P```@$``$!/
+M```"`0``1$\```(!``!(3P```@$``$Q/```"`0``4$\```(!``!83P```@$`
+M`%Q/```"`0``8$\```(!``!D3P```@$``&A/```"`0``B$\```(!``",3P``
+M`@$``)!/```"`0``E$\```(!``"83P```@$``)Q/```"`0``H$\```(!``"D
+M3P```@$``*A/```"`0``K$\```(!``"P3P```@$``+1/```"`0``N$\```(!
+M``"\3P```@$``,!/```"`0``Q$\```(!``#(3P```@$``,Q/```"`0``T$\`
+M``(!``#43P```@$``-A/```"`0``W$\```(!``#@3P```@$``.1/```"`0``
+MZ$\```(!``#L3P```@$``/!/```"`0``]$\```(!``"06P```@$``)1;```"
+M`0``F%L```(!``"<6P```@$``*!;```"`0``I%L```(!``"H6P```@$``)!H
+M```"`0``E&@```(!``"8:````@$``)QH```"`0``H&@```(!``"D:````@$`
+M`*AH```"`0``K&@```(!``"X=````@$``+QT```"`0``P'0```(!``#$=```
+M`@$``,AT```"`0``S'0```(!``#0=````@$``,"````"`0``Q(````(!``#(
+M@````@$``,R````"`0``T(````(!``#4@````@$``-B````"`0``J(X```(!
+M``"LC@```@$``+".```"`0``M(X```(!``"XC@```@$``+R.```"`0``P(X`
+M``(!```,`````@(``!`````"`@``%`````("```8`````@(``!P````"`@``
+8(`````("```D`````@(``"@````"`@``
+`
+end
diff --git a/sys/contrib/dev/ath/public/mips-le-elf.inc b/sys/contrib/dev/ath/public/mips-le-elf.inc
new file mode 100644
index 0000000..b1dd538
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips-le-elf.inc
@@ -0,0 +1,72 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/mips-le-elf.inc#2 $
+#
+
+#
+# Configuration for building little-endian MIPS2 using the 5.01
+# linux-mips.org toolchain (manually moved to /pub/gnu from
+# /pub/gnu/local where rpm --prefix=/pub/gnu bogusly installs them).
+
+#
+# http://www.linux-mips.org/toolchain.html
+#
+# /pub/gnu/bin/mips-linux-gcc -v
+# Reading specs from /pub/gnu/bin/../lib/gcc-lib/mips-linux/2.96-mips3264-000710/specs
+# gcc version 2.96-mips3264-000710
+# /pub/gnu/bin/mips-linux-as -v
+# GNU assembler version 2.12.90.0.7 (mips-linux) using BFD version 2.12.90.0.7 20020423
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/mips-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EL
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+COPTS+= -G 0 -EL -mno-abicalls -fno-pic -mips2 -Wa,--trap \
+ -fno-strict-aliasing -fno-common -fomit-frame-pointer -mlong-calls
diff --git a/sys/contrib/dev/ath/public/mips-le-elf.opt_ah.h b/sys/contrib/dev/ath/public/mips-le-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips-le-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/mips1-be-elf.hal.o.uu b/sys/contrib/dev/ath/public/mips1-be-elf.hal.o.uu
new file mode 100644
index 0000000..bcc9310
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips1-be-elf.hal.o.uu
@@ -0,0 +1,6052 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/mips1-be-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`0`````````````!``@````!`````````````W?L```0`0`T````
+M```H`!$`#N#_`_P```````````````````````!__P`````PA/__)`,`6#P"
+M```0@P!C)$(`A"B"`%D00``F)`(1!RB"`!P00``4)`(`4BB"`!H00`!7/`(`
+M`"B"`!,00``))`(`$RB"`!$00`!+/`(``"0"``<0@@!$``````/@``@``!`E
+M`````!""`$@``````^``"```$"40@@!"/`(``"B"`%,00``&)`,`'#P"```0
+M@P!")$(`F`/@``@``!`E)`(`5Q""`#8``````^``"```$"40@@`M/`(``"B"
+M$0@00``5)`,`D3P"```0@P`S)$(`<"B"`)(00``*)`(0%"B"`(@00``M```0
+M)2B"`(840``I`````#P"```#X``()$(`7``````0@@`@``````/@``@``!`E
+M)`(1$Q""`!P\`@``*((1%!!```8T`_`3)`(1$A""``\``````^``"```$"4\
+M`@``$(,`%"1"`#0T`_$;/`(``!"#`!`D0@`@`^``"```$"4\`@```^``""1"
+M```\`@```^``""1"`!`\`@```^``""1"`$@\`@```^``""1"`*P``!`E`^``
+M"``````GO?_HK[\`$#"$__\X@Q:,+&,``3B"IR<L0@`!`&(8)11@``0PI?__
+M)`(0MQ2"``<`````/`(``"1"````0/@)`*`@)1````(````````0)8^_`!``
+M`````^``"">]`!@GO?_@K[\`&(^H`#`PA/__)`("!Q""`$$H@@(($$``%20"
+M$1,H@@`3$$``"20"`!,H@@`1$$``-#P"```D`@`'$((`-@``&"40```[)`(`
+M`1""`"8H@@`=$$``-@``&"4H@@`:%$``-"0"``$0```?)`0`$Q""`!TH@A$4
+M$$``#S0"\1LD`A$'$((`)"B"$0@00``&)`(1$B0"$!00@@`2```8)1```"0D
+M`@`!$((`%0``&"40```@)`(``1""`!$`1!`J%$``!C0"_QDT`O`3$((`!@``
+M&"40```7)`(``12"`!0``!@E)`0`$SP"```D0@```$#X":^H`!`0```/`$`8
+M)3P"```D0@```$#X":^H`!`0```)`$`8)3P"```D0@```$#X":^H`!`0```#
+M`$`8)20"``&M`@``$&``%P!@$"648@'(`````*1B``B48@'*`````*1B``J,
+M8@',`````*QB`!R48@'0`````*1B`""48@'2`````*1B`"*48@'4`````*1B
+M`"248@'6`````*1B`"8`8!`EC[\`&``````#X``()[T`(*R%`=@#X``()`(`
+M`2>]_]"OOP`LK[8`**^U`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`L"4`H*@E
+M`,"@)0#@F"4``(`E/`(``"12```\`@``)%$```+`("4"0/@)`J`H)0!4&"00
+M<P`')`(``0(@^`DD!``*)A```2H"`^@40/_U```0)8^_`"R/M@`HC[4`)(^T
+M`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#```#`E$*``"```&"4``Q!`,(,`
+M`0!#&"4DQ@`!`,40*Q1`__H`!"!"`^``"`!@$"6/J0`0,.?__P`'$$``1Q`A
+M``(0@`!%$"&42``F`````!$``)H``!`E``<00`!'$"$``A"``$40(9!#`"4D
+M`@`"$&(`)RAB``,00``%)`(``Q!@``H`````$```BP``,"408@!E``@0P"0"
+M``008@!S/`,08A```(0``#`E$2``"B0#`,``!Q!``$<0(0`"$(``11`AD$(`
+M*0`````00``#``8@P"0#`&``!B#```82``!$$",``A"``$00(0`"$,``2``;
+M```0$A4```(```````<`#0!B,"$0``!K),8`"HR"$C0`````$$``,0````"4
+M0@`"`````#!"@``00``2``@1`#P#$&(T8TW3`$,`&0``$!```AF"```````&
+M(,``@Q`A)$(`%0!#`!L``!`2%&```@``````!P`-``(1`!```%$D1@"0C(02
+M-``````0@``8``@0@)2"``(`````,$)``!!``!(\`Q!B``@0P#1C3=,`0P`9
+M```0$``"&8(```````8@P`"#$"$D0@`5`$,`&P``$!(48``"```````'``T`
+M`A#`$```-R1&`$@`"!"`/`,08C1C3=,`0P`9```0$``"&8(```````8@P`"#
+M$"$D0@`5`$,`&P``$!(48``"```````'``T``A"`$```)21&`"0\`Q!B-&--
+MTP!#`!D``!`0``(9@@``````!B#``(,0(21"`!4`0P`;```0$A1@``(`````
+M``<`#0`"$(`0```4)$8`%@`($(`T8TW3`$,`&0``$!```AF"```````&(,``
+M@Q`A)$(`%0!#`!L``!`2%&```@``````!P`-``(8@"T"`^@40``")&8`O21F
+M`%PPPO__`^``"`````"4HP`"`````#!C`"`48``8)`(``I2C``(`````,&,`
+MT"0$`,`09``2)`(``Y2C``(`````,&,`T"0$`-`09``,)`(`!)2C``(`````
+M,&,`$!1@``<D`@`!E*,``@`````P8P@`%&```B0"``4``!`E`^``"``````G
+MO?_@K[\`&*^Q`!2OL``0`,"()3(B`(`00``)`*"`)20#";02`P!V)`(`#BX"
+M";000`!D)@/VF1```"T\`F9F,B(!`!!``",\`@``)$(```!`^`D`````$$``
+M%B8"[+,L0@`Q$$``%#(B`4``$!"``%`0(0`"($`\!<S,-*7,S0(%`!D``!`0
+M``(0@@`"&(``8A@A)@+__A1B`#H`````/`+__S1"/PT`@A@A$```.P!E`!DR
+M(@%```(0*RX#$XD`0Q`D$$``1R8"\&`0``!&`````"0#";02`P!))`(`#BX"
+M";000``))@/VF3P"9F8T0F9G`&(`&```$!```A!#``,?PQ```#X`0Q`C+@(3
+MB!!``#4F`NQX/`(``"1"````0/@)`````!!``"`F`NRS+$(`,1!``!XN`A,E
+M`!`0@`!0$"$``B!`/`7,S#2ES,T"!0`9```0$``"$((``AB``&(8(28"__X4
+M8@`&`````#P"__\T0C\-`((8(1````<`90`9/`+__S1"/P@`@A@A/`+,S#1"
+MS,T`8@`9```0$``"&((0```6`&`0)2X"$R4`````%$```P`````0```*)@+P
+M8"8"]C`\`\S,-&/,S0!#`!D``!`0``(1`A````@D0@`/)@+L>#P#S,PT8\S-
+M`$,`&0``$!```A""`````(^_`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_`!2O
+ML``0`*"`)8R%$C0`````$*``"CP"```D0@```$#X"0`````\`P``)&,`O`!#
+M$"&00@``$```!0("`!@\`@``D$(`O@`````"`@`8```0$@``````````C[\`
+M%(^P`!`#X``()[T`&">]_^BOOP`4K[``$`"@@"6,A1(T`````!"@``H\`@``
+M)$(```!`^`D`````/`,``"1C`+P`0Q`AD$,``!````4"`P`;/`(``)!#`+X`
+M`````@,`&P``$!(48``"```````'``V/OP`4C[``$`/@``@GO0`8)[W_P*^_
+M`#ROO@`XK[<`-*^V`#"OM0`LK[0`**^S`"2OL@`@K[$`'*^P`!@`H)@EDF(`
+M!``````40``Z`("P)0``D"4F8P`$)`0`_P!R$"&@1```)E(``2I"`"`40/_\
+M`'(0(8YB````````&$``+0``D"4F=``$/`(``"15```D'@`!)G<`!@`2@$`"
+M$H`A`!"`@"8#`"`"8Q@AD&0`"`````"0<0`+``````*$$"&@4@``D&(`"0``
+M````1!`E`H(0(:!2``"OH``0`L`@)0)@*"4D!@`.`J#X"0(@."4F$``H`I`8
+M(:1B``"OO@`0`L`@)0)@*"4D!@`.`J#X"0(@."4"\(`AI@(``"92``&.8@``
+M``````)"$"H40/_;`!*`0(^_`#R/O@`XC[<`-(^V`#"/M0`LC[0`*(^S`"2/
+ML@`@C[$`'(^P`!@#X``()[T`0"RB`",00`#$)(@!X#P"```D0@#(``48@`!B
+M&"&,8@````````!```@`````E((""`````"LX@```^``"```$"4#X``()`(`
+M#0/@``@D`@`-C0(``````````A'".$(``0/@``@P0@`!`^``""0"``T#X``(
+M)`(`#94"``H`````K.(```/@``@``!`EE0(`"`````"LX@```^``"```$"6-
+M`@```````#!"0``00``")`,`#0``&"4#X``(`&`0)8T"````````,$*``!1`
+M``(D`P`-```8)0/@``@`8!`EC0(``#P#(```0Q`D$$```B0#``T``!@E`^``
+M"`!@$"6-`@``/`,0``!#$"000``")`,`#0``&"4#X``(`&`0)8T"```\`P@`
+M`$,0)!!```(D`P`-```8)0/@``@`8!`EC((!^`````"LX@```^``"```$"4D
+M`@`!$,(`"P`````0P`!N```0)20"``(0P@`+`````"0"``,0P@`-``````/@
+M``@D`@`-A((!_`````"LX@```^``"```$"64@@'^`````*SB```#X``(```0
+M)8R"`@``````K.(```/@``@``!`EC0(````````P0B``$$```B0#``T``!@E
+M`^``"`!@$"6-`@```````#!"$``00``")`,`#0``&"4#X``(`&`0)0/@``@D
+M`@`-C0(``#P#`(``0Q`D$$```B0#``T``!@E`^``"`!@$"6-`@```````#!"
+M!``00``")`,`#0``&"4#X``(`&`0)8T"````````,$("`!!```(D`P`-```8
+M)0/@``@`8!`E)`(``1#"``\`````$,``!20"``(0P@`2``````/@``@D`@`-
+MC0(````````P0@$`$$```B0#``T``!@E`^``"`!@$"6,@A),`````!!```(D
+M`P`-```8)0/@``@`8!`EE((22`````"LX@```^``"```$"4#X``()`(`#8R"
+M$F@`````$$```B0#``T``!@E`^``"`!@$"6-`@`4`````*SB```#X``(```0
+M)20"``P#X``(`````(^C`!``````)`(`&1"B`!,LH@`:$$``!B0"`!XD`@`/
+M$*(`""0"``,0```=```````````0H@`7`````!```!@`````%,(`%BSB``40
+M0``4)`(``0/@``BLAP(`)`(``1#"``8`!Q`K)`(``A#"``8`````$```"@``
+M``"L@A),`^``""0"``&DAQ)(`^``""0"``&LAQ)H`^``""0"``$08``#````
+M`"0"``RL8@```^``"```$"4GO?_(K[\`-*^^`#"OMP`LK[8`**^U`"2OM``@
+MK[,`'*^R`!BOL0`4K[``$`"`L"4`H+@E`,#P)0#@B"4#P)`E+B(`"!1``!X`
+M`*`E/`(``"15````%!"``%<0(910````````E%,``@``````$!0``%,0):Y"
+M```F4@`$)C'__`+`("4"H/@)`@`H):Y"```F$``$)C'__`)P&"LX8P`!+B(`
+M!#A"``$`8A@D%&#_]"92``0N(@`($$#_YB:4``$"7A`CC[\`-(^^`#"/MP`L
+MC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`X)[W_Z*^_`!2O
+ML``0CZ,`*(^P`"P`````)`(`#1"B`!8\`@``**(`#A!```4`````$*``"P``
+M```0```M```0)20"`!T0H@`5)((24"0"`!X0H@`7```0)1```"4`````)((!
+MR*QB```D`@`0K@(``!```!\D`@`!)$(/P`#`*"6,9@``C@<```!`^`D`````
+MK@(``!```!8D`@`!K&(``"0"`!BN`@``$```$20"``$4X``(`````"0"``2N
+M`@``C&,``(R"`@0`````$```!ZQB```D`P`$%.,`!0``$"6,P@```````*R"
+M`@0D`@`!C[\`%(^P`!`#X``()[T`&(RC``0`````$&``=@``$"6,P@``````
+M`*RB``",P@`$`````*RB``B,P@`(`````*RB``R,P@`,`````*RB`!",PP`0
+M)`+__Q!B``8L8@$`%$```@`````D`P#_$````ZRC`!0D`@`"K*(`%(S#`!0D
+M`O__$&(`$BQB!`$40``")`(``20#!`"LH@`8`$,0*Q!```X`````C*(`&```
+M`````A!`-$(``:RB`!@`0Q`K%$#_^0`````0```$`````(S"`!0`````K*(`
+M&(S#`!@D`O__$&(`$BQB!`$40``")`(``20#!`"LH@`<`$,0*Q!```T`````
+MC*(`'````````A!`-$(``:RB`!P`0Q`K%$#_^0`````0```#`````"0"`_^L
+MH@`<E,(`'``````00``))`(`"I3#`!P`````+&(`$!1```(`````)`,`#Q``
+M``*DHP`@I*(`()3"`!X`````$$``"20"``J4PP`>`````"QB`!`40``"````
+M`"0#``\0```"I*,`(J2B`"*,P@`@`````*RB`"2,P@`D`````*RB`"B,P@`H
+M`````*RB`"R,P@`L`````*RB`#",PP`$)`(`!!1B``8D`@`!C*,`!``````4
+M8@`"`````*RC`#@#X``(`````(S#``0`````$&``+```$"6,P@`,`````*RB
+M``B,P@```````*RB``",P@`(`````*RB``2,P@`,`````*RB``B,P@`0````
+M`*RB``R,P@`4`````*RB`!",P@`8`````*RB`!2,P@`<`````*RB`!B4P@`@
+M`````*2B`!R4P@`B`````*2B`!Z,P@`D`````*RB`"",P@`H`````*RB`"2,
+MP@`L`````*RB`"B,P@`P`````*RB`"PD`@`!`^``"``````GO?_@K[\`'*^R
+M`!BOL0`4K[``$`"`D"4\`@``)$(```!`^`D`H(`E`$"()1(@`!X`````AB(`
+M%@`````40``4/`(``"1"```"0"`E`$#X"0(`*"4`0(`ECD(!P`)`("4`0/@)
+M`B`H)3P#```D8P%4`!"`0`(#@"&6`P````````!B&"$``QP`$```!P`#%`.6
+M(@`6EB,`&```````0Q`A``(4```"%`./OP`<C[(`&(^Q`!2/L``0`^``"">]
+M`"`GO?_`K[\`/*^^`#BOMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``
+M&`"`H"4``/`EKZ``$```N"6OH``4CH(2,``````00`!)``"0)3P"```D5@%4
+M`!(1@`*"@"&&`@)&``````1!`#LF$0(P`H`@)3P#```D8P```&#X"0(@*"4`
+M0*@ECH(!P`*`("4`0/@)`B`H)0`5&$``=A@AE@0"1I1S`````````),@(0!$
+M$"$``A0```(<`Y8"`C(`````,$(!`!!``!``=Q`J$$``(0*`("4`8+@ECH(!
+MP```````0/@)`B`H)98#`D8``````&(8(0)C&",``QP```,<`Q```!2OHP`4
+M`'X0*A!``!$"@"`E`&#P)8Z"`<```````$#X"0(@*"4`%2!``)8@(98C`!8`
+M`````&(8(92"`````````$,0(P`"%````A0#KZ(`$"92``&.@A(P``````)"
+M$"L40/^\`!(1@```D"4`$A&``H*`(88"`D8`````!$$`$"81`C".@@'``H`@
+M)0!`^`D"("@E`$`@)98"`C(`````,$(!`(^E`!040``$`(48(8^B`!``````
+M`((8(:8C`!@F4@`!*D(`0!1`_^@`````C[\`/(^^`#B/MP`TC[8`,(^U`"R/
+MM``HC[,`)(^R`""/L0`<C[``&`/@``@GO0!``````#"E__\PQO__E((`````
+M```L0C`"/`,``!1```,D:`&P/`(``"1(`<@``"`E)`H`9#P)4>LU*84?``00
+M0`!($"&40@````````!&`!@``!@2`4(0(P``````10`8```0$@!B&"$`````
+M`&D`&```$!```A%#``,?PP!#$".DX@``)(0``2B"``L40/_K).<``@/@``@`
+M````,*7__R0#`/\0HP`6)`(`_Y2#````````+&,P`P`%$(``11`A)$(2P!!@
+M``XP0O__+*(`/Q1```8```````40@`!%$"$D0A4B`^``"#!"__\`!1"``$40
+M(0`"$$`D0A/L,$+__P/@``@`````,*7__R0#`/\0HP`*)`(`_Y2"````````
+M+$(P`R2C"6`40``#,&/__R2B"/PP0___`&`0)0/@``@`````)[W_T*^_`"RO
+MM``HK[,`)*^R`""OL0`<K[``&`"@D"660@```````"Q"0``40``)`("@)99"
+M`"X`````$$``!0````"60P`6`````!!@`*,D`@`!ED(````````L0C`#%$``
+M(203`0$D$P%0ED(!=@`````00`"&``"()290``("8"@E)F(``3!3__^.@@&@
+M`H`@)0!`^`DGI@`0$$``CP`1&$``<"`AEZ(`$````````A("I((!8`"`&"63
+MH@`1`````*1B`6(F,0`"ED(!=@`````"(A`J%$#_Z@)@*"40``!I`````(Z"
+M`:`"@"`E)`4!``!`^`DGI@`0$$``=P)@*"67H@`0```````"&D*F0P%B``(0
+M@C!"`'^F0@%DEZ(`$````````A%`,$(`?Z9"`68F8@`!,%/__XZ"`:`"@"`E
+M`$#X"2>F`!`00`!C`F`H)9>C`!````````,BPI9"`68``````$00):9"`68`
+M`QD",&,`?Z9#`6B7H@`0```````"$,`P0@!_ID(!:B9B``$P4___CH(!H`*`
+M("4`0/@))Z8`$!!``$P"8"@EEZ,`$````````R-"ED(!:@``````1!`EID(!
+M:@`#&8(P8P!_ID,!;)>B`!````````(00#!"`'^F0@%N)F(``3!3__^.@@&@
+M`H`@)0!`^`DGI@`0$$``-0)@*"67HP`0```````#(\*60@%N``````!$$"6F
+M0@%N``,2`C!"`'^F0@%P``,80C!C`'^F0P%REZ(`$````````A&`,$(`?Z9"
+M`72.@@&@`H`@)0!`^`DGI@`0$$``'0````"7HP`0```````#&H*60@%T````
+M``!#$"6F0@%TED(!=@`````00``1``"()293``(\`@``)%07R``1@$`F$`%@
+M`G"`(98%```"@/@)`D`@):8"```F,0`!ED(!=@`````"(A`J%$#_]0`1@$`D
+M`@`!C[\`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`#`GO?_@K[\`'*^R
+M`!BOL0`4K[``$`#`@"64L0`4``````"@D"4`$2"``)$@(0`$((``D2`A`!$0
+M0"1"``,``A""`((@(3P"```D0@```$#X"0`$((``0!@E$&``0P````"N`P``
+M`!$00"1"``,``A""``(0@`!B$"&N`@`(IA$`!!(@`#@``#`E)`@`!"0'``..
+M!`````880`!D("&.!0`(``80@`!&$"$``A"``$80(0`"$(``11`A`'(8(91C
+M````````I$,``*2#`````"`E``80@`!&$"$``A"``$80(0`"*(".`@`(````
+M``"B$"$`!!B``&08(0`#&(``0Q`AI$0`!(X"``@``````*(0(0!#$"&D0``&
+M)(0``2B"``040/_P``80@(X#``@`1A`A``(0@`!&$"$``A"``$,8(:1H``:.
+M`P`(``````!#$"&D1P!"),8``0#1$"H40/_,`````"0"``&/OP`<C[(`&(^Q
+M`!2/L``0`^``"">]`"`GO?_X`*!8)95B`!8`````I,(`!C0"WJVGH@``IZ(`
+M`@``&"64Q``&````````."4`Y!`',$(``1A```<H8@`"$$``VP``$"4``Q!`
+M`Z(0(:1'```D8P`!).<``2CB``040/_T`.00!Y5B`!0`````I,(`!#!"__\0
+M0`#-```0)93"``0`````$$``R```2"4D"@`$``D@0`")("$`!""``(D@(0`$
+M($`!9"`A)(@`&(S%``@`"1"``$D0(0`"$(``21`A``(0@`!%*"&4@P`8````
+M`*2C``",PP`(``````!#$"&4@P`J`````*1#``(``#@E``D0@`!)$"$``A"`
+M`$D0(0`"((",P@`(``````""$"$`!QB``&<8(0`#&(``0Q`AI$``!B3G``$H
+MX@`$%$#_]30"WJV7HP`"`````!1B`"L`"2B`EZ<`````````"1"``$D0(0`"
+M$(``21`A``<@@`"'("$`@B`A``0@@(S"``@``````((@(:2*``:5`@`"````
+M`*2"``B5`P`&``````!#$"&D@@`*E0,`"@``````0Q`AI((`#)4#``X`````
+M`$,0(:2"``Z5`@`$`````*2"`!"5`@`(`````*2"`!*5`@`,`````*2"`!25
+M`@`0`````!```&JD@@`6C,0`"`"I*"$`!2B``*DH(0`%*(``I"`AEZ,`````
+M`````Q"``$,0(0`"$(``@B`AE0(``@````"D@@`(C,0`"```````I"`AEZ,`
+M`@```````Q"``$,0(0`"$(``@B`A)`(`%*2"``B,Q``(``````"D("&7HP`"
+M```````#$(``0Q`A``(0@`!$$"$D`P`CI$,`"HS$``@``````*0@(9>C``(`
+M``````,0@`!#$"$``A"``$00(20#`#^D0P`,EZ<`````````!Q"``$<0(0`"
+M$(``HC@AC,(`"```````XC@A).<`!*3J``*4X@`$E0,`!@``````0Q`AI.(`
+M!I4#``H``````$,0(:3B``B5`P`.``````!#$"&DX@`*E0(`!`````"DX@`,
+ME0(`"`````"DX@`.E0(`#`````"DX@`0E0(`$`````"DX@`2EZ<``@``````
+M!Q"``$<0(0`"$(``HC@AC,(`"```````XC@A).<`!"0"``.DX@`"E0(`%```
+M``"DX@`,E0(`%@````"DX@`.E0(`&`````"DX@`0)2D``93"``0``````2(0
+M*A1`_SP`"2!`)`(``0/@``@GO0`()[W^B*^_`72OO@%PK[<!;*^V`6BOM0%D
+MK[0!8*^S`5ROL@%8K[$!5*^P`5``@*`E`*#P)203`5"OH`%,)`(``8^C`4P`
+M````$&(`-0``D"4H8@`"$$``!20"``(08``'```0)1```4\`````$&(`10``
+M$"40``%+`````)?"`!8`````$$`!0"I"``H00`!7)Z0`*#P5```"8"@E)G,`
+M`8Z"`:`"@"`E`$#X"2>F`4@00`$\`````).E`4D`````$*``22:Q%\@"(/@)
+M`\`@)0`2&$`GL``0`@,8(:1B``"7H@%(```````"*@(0H``^)E(``0(@^`D#
+MP"`E`!(80`(#&"&D8@``)E(``2I"``H40/_A)Z0`*!```#4\`@``E\(`&@``
+M```00`$7)\4`!```@"4D!@#_)Z0`$``0$$`D0@%0`*(8(91B````````$$8`
+M!@`2$$``@A`AE&,```````"D0P``)E(``280``$J`@`#%$#_\@`0$$`0```;
+M)Z0`*)?"`!P`````$$``_B?%``8``(`E)`8`_R>D`!``$!!`)$(!2`"B&"&4
+M8@```````!!&``8`$A!``((0(91C````````I$,``"92``$F$``!*@(``Q1`
+M__(`$!!`$````B>D`"@GI``H/`(``"1"````0/@))`4!'*>R`#P:0`#"``"`
+M)2>U`"@GMP`L)[8`+B>Q`"H`$!!``J(H(2>D`!``@B`AE(,```````"DHP``
+M`%`0(0`"$(``4!`A``(00`!5$"&4@P```````*1#`!@"8"@E)G,``8Z"`:`"
+M@"`E`$#X"2>F`4@00`#-`!`80`!P&"$``QB``'`8(0`#&$``=R@ADZ0!29>B
+M`4@```````(00#!"`0``@B`CI*0`&`!U&"&7H@%(```````"(@(``A/"``(2
+M``""(".D9``@`F`H)29S``&.@@&@`H`@)0!`^`DGI@%($$``L0`0&$``<!@A
+M``,8@`!P&"$``QA``'<H(9.D`4F7H@%(```````"$$`P0@$``((@(Z2D`"``
+M=1@AEZ(!2````````B("``(3P@`"$@``@B`CI&0`*`)@*"4F<P`!CH(!H`*`
+M("4`0/@))Z8!2!!``)4`$!A``'`8(0`#&(``<!@A``,80`!V("&7H@%(````
+M`#!"`!^D@@`8)&,`(`(C("&7H@%(```````"$4(P0@`?I((```+#&"&7H@%(
+M```````"$H(P0@`?I&(```)@*"4F<P`!CH(!H`*`("4`0/@))Z8!2!!``'<`
+M$!A``'`8(0`#&(``<!@A``,80"1C`"@"XR@ADZ0!29>B`4@```````(00#!"
+M`0``@B`CI*0```+#&"&7H@%(```````"(@(``A/"``(2``""(".D9````F`H
+M)29S``&.@@&@`H`@)0!`^`DGI@%($$``6@``````$!!``%`0(0`"$(``4!`A
+M``(H0">F`"@`IB`ADZ,!29>B`4@```````(00#!"`0``8A@CI(,`,)?"````
+M````+$)``Q1```X`$!A`)*(`*`(B&"$`PA`AE$(```````"D8@```+$8(9>B
+M`4@```````(2`C!"`#\0```0I&(`&`!P&"$``QB``'`8(0`#&$``<2@AEZ(!
+M2````````B("``(3P@`"$@``@B`CI*0`*`"@&"4D`@`!I&(`&"80``$"$A`J
+M%$#_10`0$$"/HP%,```````#,$``WA`AE$(`:`````"GH@`^`,,P(0`&,(`#
+MQC`A`H`@)2>E`"@\`P``)&,;;`!@^`DDQ@UD$$``%0*`("6/H@%,```````"
+M,$``PC`A``8P@`/&,"$GI0`H/`,``"1C'.P`8/@)),8-9!!```@`````CZ(!
+M3``````D0@`!KZ(!3"A"``,40/ZH)`(``8^_`72/O@%PC[<!;(^V`6B/M0%D
+MC[0!8(^S`5R/L@%8C[$!5(^P`5`#X``()[T!>">]_^"OOP`<K[(`&*^Q`!2O
+ML``0`*"0)0``@"4\`@``)%$````0$$``4!`A``(0@`)"$"&,1`UD`````!"`
+M``,``````B#X":Q`#60F$``!*@(``Q1`__,`````C[\`'(^R`!B/L0`4C[``
+M$`/@``@GO0`@`(!()3"E__^E)0`4E2,`%@`````P8@`!$$```@``0"4D"``!
+M``,00C!"``$00``")0(``3!(__\``Q"",$(``1!```(E`@`!,$C__P`#$,(P
+M0@`!$$```B4"``$P2/__$*``%@``."4E*@`"``<00`!&&"&49`````````$B
+M&"&D9````$<0(0`"&0``0Q`A``(00"1"`!@!(A@AI&0```%"$"&D2```).(`
+M`3!'__\`Y1`K%$#_[@`'$$`#X``(`````">]_ZBOOP!4K[X`4*^W`$ROM@!(
+MK[4`1*^T`$"OLP`\K[(`.*^Q`#2OL``P`("8)0"@H"6OI@!@KZ<`9(^^`&B3
+MM0!O`````##Q__\3P``X``"`)3P"```D5Q?()[(`$#P"```D5A@T`B`H)28B
+M``$P4?__CF(!H`)@("4`0/@))Z8`*!!``;X`````DZ4`*0`````0H``G/`(`
+M`!:@``4``````N#X"0*`("40```$`@`@)0+`^`D"@"`E`@`@)28#``$`!"!`
+M`D0@(:2"``"7H@`H```````"*@(0H``4,'#__Q:@``4``````N#X"0*`("40
+M```&`@`@)9>E`"@"@"`E`L#X"0`%*@("`"`E)@,``3!P__\`!"!``D0@(:2"
+M```"'A`K%$#_T`(@*"4\`@``)$(F[(^D`&`"`"@E`$#X"2>F`!``'A!"CZ,`
+M9```````8A`A,%'__X^C`&``````E&(`%``````00`&#``"0)0`2$$``4A`A
+M``(9``!#$"$``A!`CZ,`8```````8A`A)%``&)1"`!H`````$$``.`(@*"4F
+M(@`!,%'__XYB`:`"8"`E`$#X"2>F`"@00`%O`B`H)9>B`"@`````,$(`'Z8"
+M``R7HP`H```````#$4(P0@!_I@(`!``#&P*F`P`\)B(``3!1__^.8@&@`F`@
+M)0!`^`DGI@`H$$`!7`(@*"67H@`H`````#!"`#^F`@`4EZ,`*````````Q&"
+M,$(`#Z8"`$0``QJ"I@,`'"8B``$P4?__CF(!H`)@("4`0/@))Z8`*!!``4D`
+M````EZ(`*``````P0@`/I@(`3)>B`"@```````(1`C!"`#^F`@`DE@(``@``
+M```L0@`"%$``1R0"``&7HP`H```````#$H(P0@`?I@(`#@`#&\*F`P`&`B`H
+M)28B``$P4?__CF(!H`)@("4`0/@))Z8`*!!``2L"("@EEZ,`*``````P8P`_
+M``,80)8"``8``````$,0):8"``:7HP`H```````#$8(P0@`/I@(`/@`#&H*F
+M`P`6)B(``3!1__^.8@&@`F`@)0!`^`DGI@`H$$`!%`(@*"67H@`H`````#!"
+M``^F`@!&EZ,`*````````Q$",$(`/Z8"`!X``Q*",$(`#Z8"`$X``QN"I@,`
+M)B8B``$P4?__CF(!H`)@("4`0/@))Z8`*!!``/X`````EZ,`*``````P8P`/
+M``,8@)8"`"8``````$,0)1```!RF`@`FE@,``@`````48@`8`B`H)9>C`"@`
+M``````,2@C!"``^F`@!4``,;@J8#`"PF(@`!,%'__XYB`:`"8"`E`$#X"2>F
+M`"@00`#B`````)>C`"@`````,&,`#P`#&("6`@`L``````!#$"6F`@`LE@(`
+M`@`````L0@`#%$``."0"``*7HP`H```````#$0(P0@`?I@(`$``#&D*F`P`(
+M`B`H)28B``$P4?__CF(!H`)@("4`0/@))Z8`*!!``,4"("@EEZ(`*``````P
+M0@`/I@(`0)>C`"@```````,1`C!"`#^F`@`8``,2@C!"``^F`@!(``,;@J8#
+M`"`F(@`!,%'__XYB`:`"8"`E`$#X"2>F`"@00`"O`````)>C`"@`````,&,`
+M#P`#&("6`@`@``````!#$"6F`@`@EZ,`*````````Q$",$(`#Z8"`%```QH"
+M,&,`/Q````VF`P`HE@,``@`````48@`)`````)>C`"@```````,1`C!"``^F
+M`@!6``,:`C!C`#^F`P`NE@(``@`````L0@`$%$``920"``.7H@`H```````"
+M$X*F`@`2`B`H)28B``$P4?__CF(!H`)@("4`0/@))Z8`*!!``(`"("@EEZ,`
+M*``````P8P`'``,8@)8"`!(``````$,0):8"`!*7HP`H```````#$,(P0@!_
+MI@(`"@`#$H(P0@`/I@(`0@`#&X*F`P`:)B(``3!1__^.8@&@`F`@)0!`^`DG
+MI@`H$$``9@(@*"67HP`H`````#!C``\``QB`E@(`&@``````0Q`EI@(`&I>C
+M`"@```````,1`C!"``^F`@!*``,2`C!"`#^F`@`B``,;@J8#`%(F(@`!,%'_
+M_XYB`:`"8"`E`$#X"2>F`"@00`!,`B`H)9>C`"@`````,&,``P`#&("6`@!2
+M``````!#$"6F`@!2EZ,`*````````Q"",$(`/Z8"`"H``Q(",$(`#Z8"`%H`
+M`QL"I@,`,B8B``$P4?__CF(!H`)@("4`0/@))Z8`*!!``#(`````EZ,`*```
+M```P8P`#``,9`)8"`#(``````$,0)1```!^F`@`RE@,``@`````48@`<)D(`
+M`9>B`"@```````(3@J8"`%@"("@E)B(``3!1__^.8@&@`F`@)0!`^`DGI@`H
+M$$``&`````"7H@`H`````#!"``,``A"`E@,`6```````8A@EI@,`6)>B`"@`
+M``````(0@C!"`#^F`@`P)D(``3!2__^/HP!@`````)1B`!0``````D(0*Q1`
+M_H``$A!`)`(``8^_`%2/O@!0C[<`3(^V`$B/M0!$C[0`0(^S`#R/L@`XC[$`
+M-(^P`#`#X``()[T`6`"`8"64H@`4`````*6"`!25B0`6`````#$B``$00``"
+M``!8)20+``$`"1!",$(``1!```(E8@`!,$O__P`)$((P0@`!$$```B5B``$P
+M2___``D0PC!"``$00``")6(``3!+__^4H@`4`````!!``$```#@E)9D`!"6-
+M``8EB@`()!@`!"0/``$D#@`%``<00`"B&"&49`````````&"&"&D9````$<0
+M(0`"&0``0Q`A``(00"1"`!@!@A@AI&0```,B$"&D2P````!`)0``("4`!Q!`
+M`$<0(0`"&0``0Q`A``(P0``$$$``1!`A``(0P`!&$"$D0P`8`:,0(:1$````
+MB1`',$(``1!```<!0Q@A)0(``3!(__\5#P`)I'@``!````>D;@````000`!$
+M$"$``A#``$80(0!*$"&D0``8)((``3!$__\L@@`$%$#_Y@`$$$`DX@`!,$?_
+M_Y2B`!0``````.(0*Q1`_\D`!Q!``^``"``````GO?_HK[(`$*^Q``ROL``(
+M`*"0)0#`B"4T`MZMIZ(``*>B``*GH@`$IZ(`!@``@"66)``6````````:"4D
+M!0`#`*T8(P!D$`<P0@`!$$``!``0$$`#HA`AI$,``"80``$EH@`!,$W__RVB
+M``040/_U`*T8(Y9"`!0`````IB(`%#!"__\00`!8``!P)0`.$$``3A`A``(9
+M``!#$"$``A!``D(8(21X`!@`41`AE&,`&`````"D0P`8$@``1```:"4`#A!`
+M`$X0(0`"&0``0Q`A``+(0"</``0`#2!``Z00(91"``````````(80`!B&"$`
+M`QC``R,8(0!Q&"$`CQ`AA$(`"````````A"`I&(`+`'D("&4@@```````*1B
+M`"(D"``!E&(`(``````!`A`K$$``(21L`!XEBP`&)PH`!"6)``0`""A``*LX
+M(0#@,"4`"""``(T@(0`$($``BA`AA$,`,````````QA`E,(`!@``````0Q`A
+MI.(`"`$E,"$`J2@A`(H@(92C__Z4@@`(``````!B&"&DPP``)0(``3!(__^5
+M@@`"``````$"$"L40/_E``@H0"6B``$P3?__`;`0*Q1`_\4`#2!`)<(``3!.
+M__^6(@`4``````'"$"L40/^K``X00"0"``&/L@`0C[$`#(^P``@#X``()[T`
+M&">]_\"OOP`XK[4`-*^T`#"OLP`LK[(`**^Q`"2OL``@`("@)0"@F"4D`@`$
+MIZ(`&"0"``:GH@`:)`(`":>B`!PD`@`,IZ(`'@``J"4\`@``)$(```!`^`DD
+M!`04`$"`)1(``)P"H!`EEG(`T`````"68@`6`````!!``#$\`@``)$(```(`
+M("4`0/@))`4$%)9B`&@`````I@(`%B0"``JOH@`0KZ``%#P"```D0B>P`H`@
+M)0)@*"4"`#`E`$#X"0)`."400`!]`````"9Q#6268@!H`````*9B#7H\`@``
+M)$(O8`(@("4`0/@)`@`H)3P"```D0C#8`H`@)0(`*"4`0/@)`B`P)1!``&P`
+M````E@(`&@```````A!``%T0(91#`!8`````E@(`%```````0P`8```0$@)"
+MD"$F4@`%EF(`&@`````00``R/`(``"1"```"`"`E`$#X"20%!!268@!J````
+M`*8"`!8D`@`$KZ(`$"0"``&OH@`4/`(``"1")[`"@"`E`F`H)0(`,"4`0/@)
+M`D`X)1!``$@`````)G$1>)9B`&H`````IF(1CCP"```D0B]@`B`@)0!`^`D"
+M`"@E/`(``"1",-@"@"`E`@`H)0!`^`D"(#`E$$``-P````"6`@`:```````"
+M$$``71`AE$,`%@````"6`@`4``````!#`!@``!`2`D*0(292``*68@`<````
+M`!!``"8\`@``)$(```(`("4`0/@))`4$%)9B`&P`````I@(`%B0"``2OH@`0
+M)`(``J^B`!0\`@``)$(GL`*`("4"8"@E`@`P)0!`^`D"0#@E$$``$P`````F
+M<16,EF(`;`````"F8A6B/`(``"1"+V`"("`E`$#X"0(`*"4\`@``)$(PV`*`
+M("4"`"@E`$#X"0(@,"400``"`````"05``$2```$/`(``"1"````0/@)`@`@
+M)0*@$"6/OP`XC[4`-(^T`#"/LP`LC[(`*(^Q`"2/L``@`^``"">]`$`GO?_`
+MK[\`/*^^`#BOMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"@D"66
+M0@```````"Q"0``40``*`("8)99#`"XD`@`!%&(`!CP"```D0B"D`$#X"0``
+M```0``#A`````)9"````````+$)0`!1```L``+@EED,`+B0"``(48@`'/`(`
+M`"1",M@"8"`E`$#X"0)`*"40``#2`````)9"````````+$(P`Q!```(D$0%0
+M)!$!`"0"``$2X@`0*N(``A!```4D`@`"$N``!R8Q``40``##```0)1+B`!(`
+M`!`E$```OP````"650%V`````"90`7@0```4)E8!8I9"`!H`````$$``L@``
+M```F,0`WEE4#@``````F4`0^$```"B96`XB60@`<`````!!``*@`````)C$`
+M1I95`X``````)E`#HB96`X(2H`"A``"@)3P"```D7A<P`!000`!6$"&40@``
+M`````*8"```"("@E)C$``8YB`:`"8"`E`$#X"2>F`!`00`"6`F`@)9>B`!``
+M``````(2@J8"``27H@`0```````"$0(P0@`_I@(``I>B`!````````(0@#!"
+M`#^F`@`>`B`H)28Q``&.8@&@``````!`^`DGI@`0$$``@`)@("67HP`0````
+M```#&X*6`@`>``````!#$"6F`@`>EZ(`$````````A(",$(`/Z8"`""7H@`0
+M```````"$((P0@`_I@(`(I>B`!````````(1`#!"`#^F`@`D`B`H)28Q``&.
+M8@&@``````!`^`DGI@`0$$``8@)@("67HP`0```````#&P*6`@`D``````!#
+M$"6F`@`DEZ(`$````````A&",$(`/Z8"`":7H@`0`````#!"`#^F`@`H`B`H
+M)28Q``&.8@&@``````!`^`DGI@`0$$``2@)@("67H@`0```````"$H*F`@`J
+MEZ(`$````````A$",$(`/Z8"`"R7H@`0```````"$(`P0@`_I@(`+@(@*"4F
+M,0`!CF(!H```````0/@))Z8`$!!``#0"0"`EEZ,`$````````QN"E@(`+@``
+M````0Q`EI@(`+I>B`!````````(2`C!"`#^F`@`PEZ(`$````````A"",$(`
+M/Z8"`#*6!0`"E@8`!`/`^`DF!P`(E@(`!@`````00``3```H)28&``8`!2!`
+M)(0`&`#$("&$@P`````````#$$``0Q`A``(0P`!#$"$``A!`I((``"2E``&6
+M`@`&``````"B$"H40/_Q``4@0":4``$"E1`J%$#_8R80`#0F]P`!*N(``Q1`
+M_S`D`@`!C[\`/(^^`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R`""/L0`<C[``
+M&`/@``@GO0!`)[W_P*^_`#ROO@`XK[<`-*^V`#"OM0`LK[0`**^S`"2OL@`@
+MK[$`'*^P`!@`@+@E`*"0)0``J"660@```````"Q"0``40``$`````)9"`"00
+M```')%'_JY9"````````+$(P`Q!```(D$0%0)!$!`"0"``$2H@`.*J(``A!`
+M``@D`@`")C$`5206``@F4`3<$J``&"93!-H0``"1```0)1*B``P``!`E$```
+MC0````"60@`:`````!!``(4`````)C$`9206``(F4`5.$```"293!4R60@`<
+M`````!!``'P`````)C$`:206``,F4`4N)E,%+*9@```2P`!U``"@)3P"```D
+M7A@T`B`H)28Q``&.X@&@`N`@)0!`^`DGI@`0$$``;P````"60@```````"Q"
+M,`,40``&`````)>B`!````````(2`A````6F`@`(EZ(`$````````A)"I@(`
+M")8%``@`````$*``50`````6H``&/`,``"1C%\@`8/@)`D`@)1````2F`@`(
+M`\#X"0)`("6F`@`(ED(````````L0C`#%$``"@````"7H@`0```````"$((P
+M0@`_I@(`!I>B`!``````$```"0`"$0"7H@`0```````"$,(P0@`_I@(`!I>B
+M`!````````(0P#!"`#^F`@`$`B`H)28Q``&.X@&@`N`@)0!`^`DGI@`0$$``
+M,P````"60@```````"Q",`,40``1`````)>C`!````````,;`I8"``0`````
+M`$,0):8"``27H@`0```````"$8(P0@`_I@(``I>B`!``````$```$3!"`#^7
+MHP`0```````#&T*6`@`$``````!#$"6F`@`$EZ(`$````````A'",$(`/Z8"
+M``*7H@`0```````"$$(P0@`_I@(``)9B````````)$(``:9B```FE``!`I80
+M*A1`_X\F$``*)K4``2JB``,40/]7)`(``8^_`#R/O@`XC[<`-(^V`#"/M0`L
+MC[0`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`0">]_\"OOP`\K[X`.*^W`#2O
+MM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`("@)0"@\"67P@```````"Q"
+M0``40``$)]$%9)?2`"00```')E(`&I?"````````+$(P`Q!```(D$@&_)!(!
+M;Y?"`00`````$$`!#*^@`!2/HP`4```````#$$``7A`AE$(!!@`````40``*
+M`````)?"````````+$(P`Q1```,`````$```\R92``@0``#Q)E(`!Y?"````
+M````+$(P`Q1``#0"0"@E``"8)292``&.@@&@`H`@)0!`^`DGI@`0$$``[P`3
+M&,``<1@AEZ(`$````````A("I&(``).B`!$`````I&(`""9S``(J8@`(%$#_
+M[@)`*"4``)@E`D`H)292``&.@@&@`H`@)0!`^`DGI@`0$$``V@``````$R#`
+M`)$@(9>C`!````````,2`C!"`#^D@@`"``,3@C!"``&L@@`$EZ(`$``````P
+M0@`_I((`"@`#&8(P8P`!)G,``BIB``@40/_EK(,`#!```)(``)@E)E(``8Z"
+M`:`"@"`E`$#X"2>F`!`00`"]`D`H)9>B`!````````(:0J8C`````A"",$(`
+M?Z8B``B7H@`0```````"$4`P0@!_IB(`$"92``&.@@&@`H`@)0!`^`DGI@`0
+M$$``J@)`*"67HP`0```````#(L*6(@`0``````!$$"6F(@`0``,9`C!C`'^F
+M(P`8EZ(`$````````A#`,$(`?Z8B`"`F4@`!CH(!H`*`("4`0/@))Z8`$!!`
+M`)0"0"@EEZ,`$````````R-"EB(`(```````1!`EIB(`(``#&8(P8P!_IB,`
+M*)>B`!````````(00#!"`'^F(@`P)E(``8Z"`:`"@"`E`$#X"2>F`!`00`!^
+M`D`H)9>C`!````````,CPI8B`#```````$00):8B`#```Q(",$(`?Z8B`#@`
+M`QB",&,`/Z8C``*7H@`0```````"$0`P0@`_IB(`"B92``&.@@&@`H`@)0!`
+M^`DGI@`0$$``90)`*"67HP`0```````#(P*6(@`*``````!$$"6F(@`*``,9
+M@C!C`#^F(P`2EZ(`$``````P0@`_IB(`&B92``&.@@&@`H`@)0!`^`DGI@`0
+M$$``4`)`*"67H@`0```````"&H*F(P`B``(1`C!"`#^F(@`JEZ(`$```````
+M`A"`,$(`/Z8B`#(F4@`!CH(!H`*`("4`0/@))Z8`$!!``#T``)@EEZ(`$```
+M`````B."EB,`,@``````9!@EIB,`,@`"$@(P0@`_IB(`.H^C`!0```````,0
+M0`!>$"$D50$&/`(``"17%\@\`@``)%88-``3$,``48`AC@(````````00``5
+M`````):B````````,$(`!RQ#``$X0@`#+$(``0!B&"408``&`````)8%```"
+MX/@)`\`@)1````>F`@```!.`P`(1@"&6!0```L#X"0/`("6F`@``)G,``2IB
+M``@40/_D`!,0P(^B`!0`````)$(``:^B`!27P@$$CZ,`%```````8A`J%$#^
+M^"8Q`$`D`@`!C[\`/(^^`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R`""/L0`<
+MC[``&`/@``@GO0!`)[W_P*^_`#ROO@`XK[<`-*^V`#"OM0`LK[0`**^S`"2O
+ML@`@K[$`'*^P`!@`H(@E)`(`#Z8B`"JF(@`LEB(````````L0C`#%$``!@"`
+MD"4\`@``)%X!^"0"`"`0```%IB(!!#P"```D7@'@)`(`$*8B`02.0@&@`D`@
+M)8_%````0/@))Z8`$!!``]X`````EZ,`$````````Q/"IB(`!@`#$X(P0@`!
+MIB(`"@`#$L(P0@`'IB(`#``#$0(P0@!_IB(`#I8B````````+$)``!1```4D
+M`@`!``,0PC!"``$0```"IB(`"*8B``B7HP`0```````#$((P0@`!IB(`'``#
+M&$(P8P`!IB,`&I>B`!``````,$(``:8B`!:/T``$``````(`*"4F$``!CD(!
+MH`)`("4`0/@))Z8`$!!``[$`````EZ(`$````````A("HB(`'I.B`!$`````
+MHB(`'Y8B````````+$)``!1``#<``*`E`@`H)280``&.0@&@`D`@)0!`^`DG
+MI@`0$$`#G0(`*"67HP`0```````#$X*F(@`N``,30C!"``&N(@#(``,;`C!C
+M``&N(P#,EZ(`$``````P0@__IB(`,"80``&.0@&@`D`@)0!`^`DGI@`0$$`#
+MB`````"7H@`0`````#!"#_^F(@`DEZ(`$````````A.",$(``:(B`".6(@``
+M`````"Q"4``40``,``"@)8Y"`:`"0"`E)@4``@!`^`DGI@`0$$`#<P``H"67
+MH@`0```````"$0*F(@#0)C,`!"8U``8D%P`"/`(``"16&#0`%!"``%X0(8Q0
+M``@``````@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`#7@`4($``D2@AEZ,`
+M$````````Q(",$(`?Z2B`#(`H!`E``,8@C!C`#^D0P`X`),@(9>B`!``````
+M``(1`#!"`#^D@@!P`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`#1@`4,$`D
+MQ`!P`F0@(9>C`!````````,K`I2"`````````$40):2"````TQ`A``,9@C!C
+M`#^D0P!V`$`P)9>B`!``````,$(`/Z3"`'P"`"@E)A```8Y"`:`"0"`E`$#X
+M"2>F`!`00`,L`!0@0`"3*"&7HP`0```````#$H*DH@""`*`0)0`#&0(P8P`_
+MI$,`B`!`("67H@`0```````"$(`P0@`_I((`C@(`*"4F$``!CD(!H`)`("4`
+M0/@))Z8`$!!``Q4`%#!`),0`C@)D("&7HP`0```````#*X*4@@````````!%
+M$"6D@@```-,@(0`#$@(P0@`_I((`E`"`$"4``QB",&,`/Z1#`)H`0#`EEZ(`
+M$````````A$`,$(`/Z3"`*`"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`+V
+M`!0P0"3$`*`"9"`AEZ,`$````````RL"E((`````````11`EI((```#3$"$`
+M`QF",&,`/Z1#`*8`0#`EEZ(`$``````P0@`_I,(`K`(`*"4F$``!CD(!H`)`
+M("4`0/@))Z8`$!!``MP``````I40(9>C`!````````,:`J!#`%`D`@`!$H(`
+M&BJ"``(00``%`````!*```@`````$```)P``````````$I<`&P`````0```B
+M`````)>B`!````````(90C!C``>F(P#P``(0@C!"``>F(@#REZ(`$```````
+M`A!`,$(`!Q```!2F(@#LEZ(`$````````A$",$(`!Z8B`/27H@`0`````#!"
+M``<0```*IB(`]I>B`!````````(1`C!"``>F(@#XEZ(`$``````P0@`'IB(`
+M^A:``!\"`"@E)A```8Y"`:`"0"`E`$#X"2>F`!`00`*?`@`H)9>C`!``````
+M``,CPI8B`.P``````$00):8B`.P``Q,",$(`!Z8B`.X``Q)",$(`!Z8B`.@`
+M`Q&",$(`!Z8B`.H``QC",&,`!Z8C`.27H@`0`````#!"``>F(@#F)A```8Y"
+M`:`"0"`E`$#X"2>F`!`00`*!`!080`!U("&7H@`0```````"$@*D@@`X`',8
+M(9.B`!$`````I&(`0`(`*"4F$``!CD(!H`)`("4`0/@))Z8`$!!``G``%!A`
+M`'$@(9>B`!````````(2`J2"`$H`@!@EDZ(`$0````"D8@!0`@`H)280``&.
+M0@&@`D`@)0!`^`DGI@`0$$`"7P*1&"&7H@`0```````"$@*@8@!9`!000"1"
+M`%@"8B`ADZ,`$0`````P8@"`$$```Z2#```T8O\`I((```(`*"4F$``!CD(!
+MH`)`("4`0/@))Z8`$!!``DD`%"!``)$H(9>C`!````````,10C!"`/^DH@!B
+M)(0`:`(D$"$``QA",&,`#Z1#```"I"`AEZ(`$``````P0@`!I((``)8B````
+M````+$)``!1``!(`````$H``!0`````2EP`)`````!````P`````EZ(`$```
+M`````A-",$(``1````:F(@`FEZ(`$````````A-",$(``:8B`"B6(@``````
+M`"Q",`,40``U`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$`"%P``````%!!`
+M`%40(9>C`!````````,9@C!C`'^D0P"P)`(``1*"``PJ@@`"$$``!0`````2
+M@``<`````!```!X``````````!*7``T`````$```&0````"7H@`0`````#!"
+M``>F(@#\EZ(`$````````A#",$(`!Q````^F(@$`EZ(`$``````P0@`'IB(`
+M_I>B`!````````(0PC!"``<0```%IB(!`I>B`!``````,$(`/Z8B`!*6(@``
+M`````"Q",`040``T`!000``4&$``<Q@AEZ(`$````````A-"I&(`N`(`*"4F
+M$``!CD(!H`)`("4`0/@))Z8`$!!``=<`%"!`)(0`N`)D("&7HP`0```````#
+M&,`P8P`XE((`````````0Q`E%I<`"Z2"``"7HP`0```````#$,*B(@`BEB(`
+M```````L0D`&%$```@`#$L*F(@`L%H``%`````"6(@```````"Q"0``40`$5
+M`````)>C`!````````,2`C!"`#^F(@%&``,8PC!C`!\0```&IB,!2@!3$"$D
+M`P`*I$,`N"0"``^B(@`BEB(````````L0D``%$`!`B0"``$2@@`+*H(``A!`
+M``4`````$H``N``````0``#[)I0``1*7`"H"`"@E$```]R:4``$"`"@E)A``
+M`8Y"`:`"0"`E`$#X"2>F`!`00`&4`````).E`!$"P/@)`B`@):8B`527I0`0
+M`B`@)0+`^`D`!2H"IB(!5HY"`:`"0"`E`@`H)0!`^`DGI@`0$$`!A`````"3
+MI0`1`L#X"0(@("6F(@%8EB(````````L0D`!%$``U0````"7H@`0```````"
+M$@(P0@`_$```SZ8B`,0F$``!CD(!H`)`("4`0/@))Z8`$!!``6X`````DZ4`
+M$0+`^`D"("`EIB(!3I>E`!`"("`E`L#X"0`%*@*F(@%0`@`H)280``&.0@&@
+M`D`@)0!`^`DGI@`0$$`!70(`*"67H@`0`````#!"`'^F(@`0EZ(`$```````
+M`A'",$(`/Z8B`!0F$``!CD(!H`)`("4`0/@))Z8`$!!``4T`````DZ4`$0+`
+M^`D"("`EIB(!4I8B````````+$)``11```8"`"@EEZ(`$````````A(",$(`
+M/Z8B`,8F$``!CD(!H`)`("4`0/@))Z8`$!!``3@`````EZ(`$````````A%"
+M,$(`/Z8B`4B7H@`0`````#!"`!^F(@%,EB(````````L0D`"%$``A`(`*"4F
+M$``!CD(!H`)`("4`0/@))Z8`$!!``2,`````DZ(`$0````"F(@`JEB(`````
+M```L0E``%$``=0(`*"67HP`0```````#$@(P0@!_IB(`U@`#&\*F(P#:)A``
+M`8Y"`:`"0"`E`$#X"2>F`!`00`$-`D`@)9>C`!``````,&,`'P`#&$"6(@#:
+M``````!#$"6F(@#:EZ,`$````````Q%",$(`/Z8B`.(``QK"HB,`W8Y"`:`"
+M`"@E`$#X"2>F`!`00`#X`````).B`!$`````,$(`!P`"$4"2(P#=``````!B
+M&"6B(P#=EZ(`$````````A#"$```1:(B`-^6(@```````"Q"0`$40`!``@`H
+M)280``&.0@&@`D`@)0!`^`DGI@`0$$``WP````"7H@`0`````#!"`#^F(@#"
+MEB(````````L0E``%$``,`(`*"67HP`0```````#$8(P0@!_IB(`U``#&T*F
+M(P#8)A```8Y"`:`"0"`E`$#X"2>F`!`00`#(`D`@)9>C`!``````,&,`!P`#
+M&,"6(@#8``````!#$"6F(@#8EZ,`$````````Q#",$(`/Z8B`.```QI"HB,`
+MW(Y"`:`"`"@E`$#X"2>F`!`00`"S`````).B`!$`````,$(``0`"$<"2(P#<
+M``````!B&"6B(P#<EZ(`$````````A!"HB(`WB:4``$J@@`#%$#].P`4$("6
+M(@```````"Q",`,00``A)`(`!(Y"`:`"0"`E)`4`[`!`^`DGI@`0$$``EP)`
+M("67H@`0`````#!"``>F(@#\EZ(`$````````A#",$(`!Z8B`0".0@&@)`4`
+M[0!`^`DGI@`0$$``B`````"7H@`0`````#!"``>F(@#^EZ(`$````````A#"
+M,$(`!Z8B`0(D`@`$IB(!8"0"``&F(@%>IB(!7*8@`5J/T``4`````)8B`00`
+M````$$``&0``H"4F,P`&`@`H)280``&.0@&@`D`@)0!`^`DGI@`0$$``:@`4
+M&$``<R`AEZ(`$````````A("I((!``"`&"63H@`1`````*1B`0(FE``"EB(!
+M!``````"@A`J%$#_ZP(`*"66(@```````"Q"4`,40``>````````H"4F,P`&
+MCD(!H`)`("4"`"@E`$#X"2>F`!`00`!-`D`@)0`4$(``4Q`AEZ,`$`````"D
+M0P.(CD(!H"8%``4`0/@))Z8`$!!``$(``````!00@`!3$"&7HP`0`````*1#
+M`XHFE``!*H(`!11`_^8F$``!EB(````````L0C`#$$``"B0"_\JF(@!<)`+_
+M_Z8B`%ZF(@!@)`(`#Z8B`$0D`@`<IB(`1J8B`$B6(@```````"Q"0``40``)
+M`D`@)8Y"`:`D!0#*`$#X"2>F`!`40``)`````!```!X`````CD(!H"0%`,\`
+M0/@))Z8`$!!``!@`````EZ(`$`````"F(@`8EB(`%@`````40``1)`(``98B
+M````````+$)``!1```<`````EB(`&````````A+",$(``1````6F(@`6EB(`
+M&````````A/"IB(`%B0"``&/OP`\C[X`.(^W`#2/M@`PC[4`+(^T`"B/LP`D
+MC[(`((^Q`!R/L``8`^``"">]`$`GO?_@K[\`&*^Q`!2OL``0`("`)3P"```D
+M0D'4`$#X"0"@B"400``7`@`@)3P"```D0AAP`$#X"0(@*"400``1`@`@)3P"
+M```D0C70`$#X"0(@*"400``+`@`@)3P"```D0CGH`$#X"0(@*"400``%`@`@
+M)3P"```D0CSX`$#X"0(@*"6/OP`8C[$`%(^P`!`#X``()[T`(">]_^BOOP`0
+M`*`8)91B````````+$)``!1```@D`@`!E&,`+@`````48@`$/`(``"1")G@`
+M0/@)`````(^_`!```````^``"">]`!@`````E(,``)2B````````%&(`"0``
+M``"4@@`"`````#!$P?"4H@`"`````#!"P?`0```$`((@(Y2$`````````((@
+M(P/@``@`@!`EE((""``````#X``(,$*__P``*"4`!1#``$00(8Q#``",0@`$
+M``````!B&"448``&```0)22E``$HH@`"%$#_]0`````D`@`!`^``"``````G
+MO?_HK[\`$#P"```D0E,X`$#X"0``````0"@E,**``!!``!(``"`E,*5__SP"
+M```D1AJ8``00@`!$$"$``A"``$80(91#````````$&4`%"0"``$DA``!+((`
+M@Q1`__4`````$```#@``$"4\`@``)$81.``$$4``1A`AE$,````````090`&
+M)`(``22$``$L@@!+%$#_^``$$4```!`EC[\`$``````#X``()[T`&">]_^BO
+MOP`4K[``$#"P__\2```H)`(``3P"```D0E,X`$#X"0``````0"@E,**``!!`
+M``8\`O__-$)__P"B$"0"`A`F$```&RQ"``$XH@'_+$(``2RC``$`0Q`E%$``
+M%20"``$``"`E/`(``"1&&I@`!!"``$00(0`"$(``1A@AE&(````````6`@`%
+M`````)1C``(`````$&4`!B0"``$DA``!+((`@Q1`__(`!!"````0)8^_`!2/
+ML``0`^``"">]`!@GO?_@K[\`'*^R`!BOL0`4K[``$`"@B"6,@@&<``````!`
+M^`D`P)`E`$"`)3("`$(00``(,@(`((XB``@`````%$``!#("`"`D`O^]`@*`
+M)#("`"`00``(,@(`"(XB``P`````%$``!#("``@D`O_?`@*`)#("``@00``(
+M,@(``8XB``0`````%$``!#("``$D`O_W`@*`)#("``$00``'/`(``"1"4T@`
+M0/@))D0`(!!```(D`O_^`@*`)`(`$"6/OP`<C[(`&(^Q`!2/L``0`^``"">]
+M`"`GO?]@K[\`G*^R`)BOL0"4K[``D`"`D"4``(@E/`(``"1"5N@`0/@),*3_
+M_P!`@"42```//`(``"1"6)0"0"`E`@`H)30&_W\`0/@))Z<`$!!```<\`@``
+M)$)4_`)`("4"`"@E`$#X"2>F`!``0(@E`B`0)8^_`)R/L@"8C[$`E(^P`)`#
+MX``()[T`H">]_^BOOP`4K[``$#P"```D0E,X`$#X"0"`@"4`0!@E)`(`$A!B
+M`!0D`@`!*&(`$Q!```4`````$&``"@``$"40```-`````"0"`?\08@`%-`*#
+M2A1B``<D`@`!$```!@````"6!`(*)`,#2A"#``(D`@`!```0)8^_`!2/L``0
+M`^``"">]`!@PA/__```H)3P"```D1AJ8``40@`!%$"$``A"``$80(91#````
+M````$&0`!0`````DI0`!+*(`@Q1`__4``!`E`^``"``````GO?_@K[\`&*^Q
+M`!0\`@``)$)3.`!`^`FOL``0`$"()3(B@``00``',C!__SP"```D0E;H`$#X
+M"0(`("440``4`@`0)0``("4\`@``)$41.``$&4``91`AE$(````````440`&
+M`&40(91#`!@`````%&``!P!@$"4D!`!+)(0``2R"`$L40/_S``090```$"6/
+MOP`8C[$`%(^P`!`#X``()[T`(">]_^BOOP`0`*`X)0``&"4\`@``)$8DV#P"
+M```D2`````,1P`!&*"&4H@```````!1$``@D8P`!$.``!"1C__\`X"`E`0#X
+M"20&`(`0```%)`(``2QB`#$40/_R``,1P```$"6/OP`0``````/@``@GO0`8
+M```H)3P"```4@``#)$81.`/@``@``!`E``410`!&$"&40P```````!!D``8D
+M`@`!)*4``2RB`$L40/_W````````$"4#X``(`````">]_\BOOP`TK[X`,*^W
+M`"ROM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`(#P)0"@J"4`X+`E,-?_
+M_P``@"4``(@E``"8)9:B````````%$``%0``H"4\`@``)$)3.`!`^`D`````
+M`$"0)3)"@``40``-/`(``"1"5]0"0"`E`$#X"0``*"440``)`D`@)3P"```D
+M0EA(`$#X"0)`("440``#`D`@)9:D``(`````,(+_`!1``$\\`@`````P)0``
+M."4\`@``)$41.``&$4``11@AE&(````````41``#``````!@F"4D!P`!),8`
+M`2S"`$LLXP`!`$,0)!1`__0`!A%`$.``5```$"4RX@"`%$``!P``@"669``"
+M`````(YQ``@`````$```!@``,"669``$`````(YQ``P````````P)0``."4\
+M`@``)$D`7#P"```D2`!@``80P`!&$"$``AB``&DH(92B````````%$0`"`!H
+M$"&/PP'8C$(````````48@`#``````"@H"4D!P`!),8``2S"``(LXP`!`$,0
+M)!1`_^T`!A#`$.``$#+B`(`40``(```0)8Z#``@``````B.()(Z#``P`````
+M$```!0("@"2.@P`0`@*`)`(CB"2.@P`4`@*`)0(CB"4\`@``)$)7U`!`^`D"
+MP"@E$$``%0````".P@`0CL,`%(YD`!".90`4`$00)`!E&"2NP@`0KL,`%):B
+M``(`````,$+_`"Q%``$",!`E$$```@``&"4D`P`!`*,0)!!```(D`@`!KM$`
+M&(^_`#2/O@`PC[<`+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``(
+M)[T`.`"`$"4`H#@E!$$``@!`*"4D10`_``4I@P`%(8``1"`C)`(``"0#``$`
+M!#:`!,$`!```````@T`$$```!P``2"40P``$`()`!``$,",`PS`&`09`)0"#
+M2`0!`!`E`2`8)0`%*,``IR@AC*0``(RE``0`1!`D`&48)`!B$"4#X``(``(0
+M*S#G`/\0X``:`(`8)1"@`!$``"`ED&(````````01P`4`````!!```L`````
+M)(0``0"%$"L00``'`&00(9!"````````$$<`"@`````40/_W`````!"%``8`
+M9!`AH$<``(S"````````)$(``:S"```#X``(`````">]_F"OOP&<K[X!F*^W
+M`92OM@&0K[4!C*^T`8BOLP&$K[(!@*^Q`7ROL`%X`(#P):^E`:2OI@&HKZ<!
+MK(^R`<27L`&^EZ(!P@````"OH@%8)`,;6*^C`6`GQ0(PKZ4!9#P"```D0E.(
+M`$#X"0``B"400`'?`````#P"```D0E<P`$#X"0/`("6GP@(*,$+__Q1```L\
+M`@``/`(``"1"5#@#P"`E`$#X"0(`*"400`'0`````#("/_^GP@(*/`(``"1"
+M:Z@`0/@)`\`@)3P"```D0E;HE\0""@!`^`D``````$"`)1(``<(#P"`E/`(`
+M`"1"6)0"`"@E-`;_?P!`^`DGIP`0$$`!N@/`("4\`@``)$)8E`(`*"4D!@"`
+M`$#X"2>G`)`00`&R`````(^B`!B/HP`<)`0``"0%``4`1!`D`&48)`!B$"40
+M0``"`````"01``&/H@`8CZ,`'"0$```D!0`"`$00)`!E&"0`8A`E$$```@``
+M```D$0`"C\("#``````2(@`"/`(``*_1`@PD0E3\`\`@)0(`*"4`0/@))Z8`
+M$!9```2OH@%<EA``$`````"OL`%@CZ8!J``````LP@!!%$```P``L"4D!P!`
+MKZ<!J(_"`>````````)"@C$(``&OJ`%L``(20C!"``&OH@%H/`(``"17`B`\
+M`@``)$(".`+B$"L00`$R`````);B``"/HP%8``````!#$"000`$E`````);B
+M``"/I`%<``````!$$"000`$?)Z8!$(_"`9@#P"`EEN4``@!`^`DGIP$2$$`!
+M&"0"``26XP```````!!B`"@H8@`%$$``""0"`"`D`@`!$&(`&R0"``(08@`1
+M/`(``!```0PF]P`$$&(`+2>R`)`H8@`A$$``!B0"`$`D`@`($&(`(#P"```0
+M``$")O<`!!!B`"<\`@``$```_B;W``0GL@`0)[0`0"1"!UBOH@%PDD(``@``
+M```0```D-%,``R>R`!`\`@``)$(*F*^B`7"24P`"`````!```!PGM``P)[(`
+MD">T`.`\`@``)$($.*^B`7"20@`"`````!```!,T4P`!)[0`\"1"`9BOH@%P
+MDD(``@`````0```,-%,``B>T`0`\`@``$```!"1"`/@GL@`0)[0`4"1"!UBO
+MH@%PDD(``@`````T4P`$/`4``"2E4T@`H/@)`H`@)11``,P```````"H)0*@
+M("4\!@``),9;'`#`^`D"@"@E$$``P``5$4"/IP%P``````#B@"&/I`&PCZ4!
+MM(^F`;B2!P`8/`@``"4(6Z`!`/@)`````)81``"6`@`"``````!1$"L40`"O
+M`````)>B`1```````B(0*Q1``*$`````EZ(!$@``````41`K%$``G`````"2
+M!``&`````#B"``HL0@`!CZ4!;``````LHP`!`$,0)!1``)(X@@`%+$(``8^F
+M`6@`````+,,``0!#$"040`"+`````)(#``<``````B,8(0`#&$./IP%@````
+M`"3B``H`0Q`J%$``@0````"/J`&H``````+($"L00`"0`````(X"`!".`P`4
+M``(?PH^E`<@`````+*0``0"#("04@`!S```0)8Y"`!@`````,$(`@!!```4D
+M`@`&C\,!W``````08@!J`````">D`1@\!@``),8```#`^`DD!0!`I[$!&);D
+M``(`````IZ0!&I(#``8D`@`%$&(`!20"``H48@`'-()``!````6GH@$:EZ(!
+M&@`````T0H``IZ(!&I("``0`````HZ(!'9("``4`````HZ(!,HY"`!@`````
+MKZ(!-*^S`3B.`@`0C@,`%(Y$`!".10`4`$00)`!E&"0`8A`E$$``!@````"7
+MH@$:`````#1"`@`0```%IZ(!&I>B`1H`````,$+]_Z>B`1J.`@`(C@,`#(Y$
+M``B.10`,`$00)`!E&"0`8A`E$$```R0"``(0```"HZ(!'*.@`1R.`@`(C@,`
+M#(Y$``B.10`,`$00)`!E&"0D!```)`4``@!$$"0`91@D`&(0)1!```4`````
+MDZ(!'``````T0@`(HZ(!'(Y"`!@`````,$(`0!!```4`````DZ(!'``````T
+M0@`$HZ(!'``6$8"/IP%D``````!'$"$GHP$8)Z0!6(QH``",90`$C&8`"(QG
+M``RL2```K$4`!*Q&``BL1P`,)&,`$!1D__8D0@`0)M8``9("``<``````B(0
+M(3!1__^6`@`"``````!1$"L00/]3`````":U``$JH@"`%$#_-P`````F]P`$
+M/`(``#P"```D0@(X`N(0*Q1`_M``````$L``/R["`$$40``"/`(``"06`$`D
+M0F<PCZ0!9`+`*"4D!@!`/`<```!`^`DDYU+PK]82,!K``!D``"@E``4@P(^H
+M`:0``````(@@(0`%&8"/H@%D``````!B&"&48@```````*2"``"48@`"````
+M`*2"``*08@`$`````*""``208@`%`````*""``4DI0`!`+80*A1`_^H`!2#`
+MC\(!O`/`("6/I0&D`$#X"0+`,"4:P``3```H)0`%(8"/HP%D``````"#("$`
+M!1C`CZ8!I```````9A@AD&(`!@````"@@@`&D&(`!P````"@@@`')*4``0"V
+M$"H40/_P``4A@(^G`:P`````K/8``)?"`@H`````I\(`&``6$"N/OP&<C[X!
+MF(^W`92/M@&0C[4!C(^T`8B/LP&$C[(!@(^Q`7R/L`%X`^``"">]`:"4H@`"
+M`````(R&$C0`````$,``%#!(P?"4PP``E*(````````48@`0)(<",)3#``(`
+M````,&+!\!1(``L`````D,(`!``````P0@`!$$```S!C``(48``K```0)0/@
+M``@`P!`E)(<",(R$$C``````$(``)```$"64I0`````````$$$,``A&``.(P
+M(93"`````````*(0(Q1``!,`````E,,``@`````P8L'P%$@`"@````"0P@`$
+M`````#!"``$00``#,&,``A1@``X``!`E`^``"`#`$"64P@`"`````#!"P?`!
+M`A`C&$```P`````DQP!`)(3__P`$($,4@/_@```0)0/@``@`````)[W_Z*^_
+M`!2OL``0/`(``"1"````0/@)`,"`)1!```P`````@$(`&@```````A!``@(0
+M(P`"%@```A8#!$$``@!`&"4``!@E$````@!@$"4``!`EC[\`%(^P`!`#X``(
+M)[T`&">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`B"4`H)@EEB(""@`````4
+M0``H)!``_SP"```D4E,X`D#X"0`````P0@#P)`,`8!!#``8``````D#X"0(@
+M("4D`P&9%$,`'#P"``"68@`"`````#!"`*`D`P"@$$,`*B00`.&68@`"````
+M`#!"`-`D`P#`$$,`)"00`.*68@`"`````#!"`-`D`P#0$$,`'B00`.268@`"
+M`````#!"`5`D`P%0$$,`&"00`.,0```6)!``X#P"```D0@```B`@)0!`^`D"
+M8"@E$$``#R0#`,",4``@`````)9B``(`````,$(`P!1#``D"`!`E,@,`#R0"
+M``$48@`%`@`0)20"__`"`H`D-A```@(`$"6/OP`@C[,`'(^R`!B/L0`4C[``
+M$`/@``@GO0`H)[W_Z*^_`!`\`@``)$(```!`^`D`````$$``!@````",0@`<
+M```````"$((0```",$(``0``$"6/OP`0``````/@``@GO0`8)[W_T*^_`"RO
+MM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`,"@)0#@L"4`@*@E)+/__Q)@
+M`!P"M)`A`K(0*Q!``!8"0(@E`C2`(P(`("4"P/@)`B`H)1A``!```````B`@
+M)0*`*"62`P``D((```````"B`@``)A```:"#```DI?__%*#_^"2$``$"-(@C
+M`K$0*Q1`_^P`````)G/__Q9@_^8"5)`AC[\`+(^V`"B/M0`DC[0`((^S`!R/
+ML@`8C[$`%(^P`!`#X``()[T`,">]_]BOOP`@K[$`'*^P`!@`@(`E`@"()8X"
+M`:`D!0#!`$#X"2>F`!`00``>`````)>B`!``````+$)``!!```(D!0#*)`4`
+MSXXB`:`"("`E`$#X"2>F`!(00``2`````)>B`!``````+$)``!1```<`````
+MEZ(`$@```````A+",$(``1````6N`A(\EZ(`$@```````A/"K@(2/(X"$CP`
+M````C[\`((^Q`!R/L``8`^``"">]`"@GO?_HK[\`%*^P`!`\`@``)$)3.`!`
+M^`D`@(`E`$`8)20"`$@08@`R/`(``"AB`$D00``0-`*!C2AB`$(00``()`(`
+M0RAB`$`00``I/`(``!!@`!L``!`E$```*P``````````$&(`(0`````0```F
+M```0)0!#$"H40``--`*!CS0"@8@`8A`J$$``&3P"```H8@!-$$``'```$"4H
+M8@!*%$``&#P"```0```2)$)H`!1B`!0\`@``$```#B1":`"6`P(*`````"AB
+M`8@40``.```0)2AB`8X40``%/`(``"0"`8\48@`'`````#P"```D0F@``$#X
+M"0(`("40```"````````$"6/OP`4C[``$`/@``@GO0`8)[W_V*^_`"2OL@`@
+MK[$`'*^P`!@`@)`E,+'__P)`@"6.`@&@)`4`P0!`^`DGI@`0$$``*#P"````
+M`"`E)$4`I#P"```D1@"F/`(``"1'`*@\`@``)$A7,``$$$``1!`A``(80`!E
+M$"&40@```````!11`!4DA``!)(3__Y>B`!``````+$)0`Q!```4`!!!``&80
+M(91"```0```'I@(""`!$$"$``A!``$<0(91"````````I@(""`$`^`D"0"`E
+M$```!*8"`@HL@@`.%$#_XP`$$$"/OP`DC[(`((^Q`!R/L``8`^``"">]`"@G
+MO?_8K[\`)*^R`""OL0`<K[``&`"`D"4PL?__`D"`)8X"`:`D!0#!`$#X"2>F
+M`!`00``H/`(`````("4D10`P/`(``"1&`#(\`@``)$<`-#P"```D2%<P``00
+M0`!$$"$``AA``&40(91"````````%%$`%22$``$DA/__EZ(`$``````L0E`#
+M$$``!0`$$$``9A`AE$(``!````>F`@((`$00(0`"$$``1Q`AE$(```````"F
+M`@((`0#X"0)`("40```$I@(""BR"``<40/_C``000(^_`"2/L@`@C[$`'(^P
+M`!@#X``()[T`*">]_^"OOP`8K[$`%*^P`!``@(`E/`(``"1":+@`0/@)`@"(
+M)1!``!0`````C@(!Y``````P0@`!$$``#P````"6!0((`````!"@``8\`@``
+M)$)IT`!`^`D"`"`E$```!@`````\`@``)$)JO)8E`@H`0/@)`@`@)8^_`!B/
+ML0`4C[``$`/@``@GO0`@````````````````)[W_0*^_`+ROO@"XK[<`M*^V
+M`+"OM0"LK[0`J*^S`*2OL@"@K[$`G*^P`)@`H)@E`,"H)0#@L"6/O@#0,)'_
+M_SP"```D0@```$#X"20$%`@`0)`E$D`!RB00``("0*`E/`(``"1"```"0"`E
+M/`4``"2E`D``0/@))`82<*Y3``RN50`0KE8`%*91`<BF0`'*)`(`/*9"`?RN
+M0`(`)`(``ZY"$S2N0!/T)`('`*Y"$_@D`O__KD(3_*Y"%`"N0A0$/`(``"1"
+M```"0"`E`$#X"0``*"400`&J)!```R0"``&N@@',/!```"80```"@"`E`@#X
+M"20%0"`P0@#_IH(!T`*`("4"`/@)-`68&*:"`=*F@`'6/`(``"1"```"@"`E
+M-`68T`!`^`DD!AP6``"()3P"```D4````H`@)30%F(`"`/@)/`8``28Q``$N
+M(@`$%$#_^@*`("4\$```)A````(`^`DT!9P`/`,``"1C`````B<"`&#X"20%
+M``0D0@`!IH(!U`*`("4"`/@))`5`$`!`N"4\`@``)$(```*`("4D!4`0`$#X
+M"3;F``$\`@``)$(```*`("4D!0`]`$#X"2>F`)`00`%H)!``")>C`)`D`EJE
+M%&(!9"00``0\`@``)$(```*`("4D!0`_`$#X"2>F`)`00`%<)!``")>B`)``
+M````ID(2<CP"```D0@```H`@)20%`,$`0/@))Z8`D!!``5(\`@``EZ(`D```
+M`````A,"ID(2<#!#__\D`@`!%&(!2200``4``)@E``"()2>P`!`\`@``)%4`
+M```1,$`"@"`E)B4`P`*@^`D"!C`A$$`!/``1$$`"`A`AE$(````````"8I@F
+M)C$``2XB`$`40/_R-`+__Q9B`3,D$``'/`(``"1"```"@"`E)`4`OP!`^`DG
+MI@"0$$`!*R00``B3H@"1`````*:"`@B7H@`4`````*9"$G27H@`6`````*9"
+M$G:3H@`9`````*)"$GB7H@`8```````"$@*B0A)YDZ(`&P````"B0A)[EZ(`
+M&@```````A("HD(2>I>B`!P```````(2`J)"$GZ3H@`=`````*)"$G^7H@`>
+M```````"$@*B0A*`DZ(`'P````"B0A*!DZ(`(0`````P0@`!HD(2?)>B`"``
+M``````(00C!"``>B0A)]/`(``"1"``"N@@'```"()20(``DGIP`0`!$HP`"Q
+M*",`!2B``+$H(0)%*"$`"#!``.88(91B``````````(2@J"B$H*48@``````
+M```"$0(P0@`_H*(2C9!C``$```````,8@#!C`#PDQ``"`.0@(92"````````
+M``(3@@!B&"6@HQ*#E((``````````A(",$(`/Z"B$HZ4@@`````````"$((P
+M0@`_H*(2A)"#``$```````,9`#!C`#`DQ``$`.0@(92"``````````(3`@!B
+M&"6@HQ*/E((``````````A&",$(`/Z"B$H60@@`!`````#!"`#^@HA*0),,`
+M!@#C&"&48@`````````"$H*@HA*&E&(``````````A$",$(`/Z"B$I&08P`!
+M```````#&(`P8P`\),0`"`#D("&4@@`````````"$X(`8A@EH*,2AY2"````
+M``````(2`C!"`#^@HA*2E((``````````A"",$(`/Z"B$HB0@P`!```````#
+M&0`P8P`P),0`"@#D("&4@@`````````"$P(`8A@EH*,2DY2"``````````(1
+M@C!"`#^@HA*)D((``0`````P0@`_H*(2E"3#``P`XQ@AE&(``````````A*"
+MH*(2BI1B``````````(1`C!"`#^@HA*5D&,``0```````QB`,&,`/"3$``X`
+MY"`AE((``````````A."`&(8):"C$HN4@@`````````"$@(P0@`_H*(2EI2"
+M``````````(0@C!"`#^@HA*,D(,``0```````QD`,&,`,"3$`!``Y"`AE((`
+M`````````A,"`&(8):"C$I>4@@`````````"$8(P0@`_H*(2F)""``$`````
+M,$(`/Z"B$IDDPP`2`.,8(91B``````````(2@J"B$IJ48@`````````"$0(P
+M0@`_H*(2FY!C``$```````,8@#!C`#PDQ@`4`.8P(93"``````````(3@@!B
+M&"6@HQ*<E,(``````````A(",$(`/Z"B$IV4P@`````````"$((P0@`_H*(2
+MGB8Q``$N(@`%%$#_/"4(``L\`@``)$)T;`!`^`D"@"`E``"8)0``B"4D%@`?
+M/`(``"15```F4``#`H`@)0+1*","H/@))Z8`D!!``!\`$1A`EZ(`D``````"
+M8I@A`'`@(0`"$@*@@A,0`(`8)9.B`)$`````H&(3$28Q``$N(@`#%$#_[@*`
+M("4N8P`!/`(``C1"__T"8A`F+$(``0!B&"448``,)!``"3P"```D0@```H`@
+M)20%0!``0/@)`N`P)1```!("@!`E$```""00``@D$``(/`(``"1"```"@"`E
+M)`5`$`!`^`D"X#`E$D``!#P"```D0@```$#X"0)`("43P``"```0):_0``"/
+MOP"\C[X`N(^W`+2/M@"PC[4`K(^T`*B/LP"DC[(`H(^Q`)R/L`"8`^``"">]
+M`,`GO?_HK[\`$#P"```D0@```$#X"0````"/OP`0``````/@``@GO0`8,*4!
+M`!"@``<`````)`(4`*3"```D`A4VI.(```/@``@D`@`!`^``"```$"4#X``(
+M)`(``8R"`>0`````-$(``:R"`>0D`A0`I((!["0"%3:D@@'NC((!X#P#0```
+M0Q`E/`/__S1C?_\`0Q`D)`,``Z2#`>@D`P!`I(,!ZB0#^_\`0Q`D)`/]_P!#
+M&"2L@P'@D((2?``````00``&)(4!X*2`$D@D`@`!K((23#1B`0"L@@'@)`(`
+M#ZRB`!0D`@`!`^``"*R"$F@GO?_@K[\`'*^R`!BOL0`4K[``$`"`D"4`H(@E
+M/!```"80``".)@`$`@#X"30%@"P"0"`ECB8`#`(`^`DT!8`P`D`@)8XF`!`"
+M`/@)-`6`-`)`("6.)@`(`@#X"30%@#@"0"`ECB8```(`^`DT!8`DC[\`'(^R
+M`!B/L0`4C[``$`/@``@GO0`@)[W_T*^_`"BOI0`4C(,!W"0"``$08@`./`(`
+M`(Q"`````````*(0(P`"$,"OH@`</`(``(Q"`````````*(0(P`"$,"OH@`@
+M$```!J^E`!@D`O__KZ(`'*^B`"`D`@`!KZ(`&#P"`8`T0O__`,(0)*^B`!`\
+M`@``)$(```!`^`DGI0`0C[\`*``````#X``()[T`,">]_^"OOP`8K[$`%*^P
+M`!``@(@E/!```"80```T!8`L`@#X"0``,"4\`@``)$(```(@("4`0/@)-`6`
+M!#P#`!``0Q`E/`;_7S3&__\"("`E-`6`!`(`^`D`1C`D`B`@)30%@"0"`/@)
+M-`;__X^_`!B/L0`4C[``$`/@``@GO0`@)[W_V*^_`""OLP`<K[(`&*^Q`!2O
+ML``0`("8)0"@B"66(@`2`````!!``!X"8)`E/`(``"1"````0/@)-`6`!#P#
+M_W\T8___`$,0)#P&`"`\$```)A````)`("4T!8`$`@#X"0!&,"4"0"`EEB8`
+M$`(`^`DT!8`H`D`@)98F`!("`/@)-`6`2(XF`!0"0"`E-`6`-`(`^`D`!C#`
+M$```#SP"```\`@``)$(```)@("4`0/@)-`6`!#P&_U\TQO__/`,``"1C```"
+M8"`E-`6`!`!@^`D`1C`D/`(``"1"```"8"`ECB8```!`^`DT!8`L/`(``"1"
+M```"8"`E`$#X"30%@"0\`_^``$,0))8C``H``````$,P)98B`!@`````$$``
+M!21"``0``A0`/`,`?P!#$"0`PC`E/`(``"1"```"8"`E`$#X"30%@"268@'0
+M`````"Q"``040``8`````)8B`!H`````,$(`!Q!``!,D`_C_CD(3^```````
+M0S`DEB4`&@`````LH@`($$``!``%$@`P0@<`$````@#","4TQ@<`KD83^#P"
+M```D0@```F`@)0!`^`DT!8`8C[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`
+M*````````````````">]_^BOOP`0/`(``"1"````0/@))`5`"``"$"N/OP`0
+M``````/@``@GO0`8)[W_X*^_`!ROL@`8K[$`%*^P`!``@)`E`*"`)0)`B"4\
+M`@``)$(```!`^`DD!0`<`$`@)20"__\4@@`$/`,!!:X````0```C```0)8XB
+M$QP``````((0)#1CV+H`0Q@D/`(`<#1"`"``@A`D$$``!*X#```\`D```&(0
+M):X"```P@@`%$$``!C""!<".`@```````#1"``&N`@``,((%P``````00``%
+M`````(X"````````-$(`0*X"``".`@``/`-```!#$"000``")`(``:Y$$E"/
+MOP`<C[(`&(^Q`!2/L``0`^``"">]`"",@A,<``````/@``@`````)[W_V*^_
+M`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`F"4`H(@ECG03'``````&@0`&`F"`
+M)3P"```D0@``)`4`)`!`^`D``#`E/`(!!31"V+H"(C`D,B(``1!```(R(@!`
+M-,8`!1!``!4\`@``C@(3(``````00``"`````#3&`$".`A,D`````!!```(`
+M````-,8!`(X"$R@`````$$```@`````TQ@"`C@(3+``````00``"/`(``#3&
+M!``D4@```F`@)0)`^`DD!0`@!B$`!:X1$QP"8"`E)`4`)`)`^`DD!@`!`H`0
+M)8^_`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H`^``""0"`$`GO?_H
+M,*/__RQB`$`00``*K[\`$``#&4`T!9`</`(``"1"````0/@)`&4H(3!#@``4
+M8``")`(``0``$"6/OP`0``````/@``@GO0`8)[W_X*^_`!ROL@`8K[$`%*^P
+M`!`PI?__+*(`0!!``"T`@)`E``6)0#0%D``\$```)A````(E*"$"`/@)```P
+M)30%D`0"0"`E`B4H(0(`^`D``#`E-`60"`)`("4")2@A`@#X"0``,"4T!9`,
+M`D`@)0(E*"$"`/@)```P)30%D!`"0"`E`B4H(0(`^`D``#`E-`60%`)`("4"
+M)2@A`@#X"0``,"4T!9`8`D`@)0(E*"$"`/@)```P)30%D!P"0"`E`B4H(0(`
+M^`D``#`E$````B0"``$``!`EC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_
+MV*^_`""OLP`<K[(`&*^Q`!2OL``0`("8)0#`("4PI?__+*,`0!!@`"L``!`E
+M$(``&@````"0D@`%```````2D@"0@@`$``````)"D"60A@`#```````&-@"0
+M@@`"```````"%```PC`ED((``0```````A(``,(P)9""`````````,(P)0`&
+M,$(`$A?``,(P)1````,`$I!"``"0)0``,"4`!8E`-`60&#P0```F$````F`@
+M)0(`^`D")2@A-`60'`)@("4")2@A`@#X"39&@``D`@`!C[\`((^S`!R/L@`8
+MC[$`%(^P`!`#X``()[T`*">]_\BOOP`TK[X`,*^W`"ROM@`HK[4`)*^T`""O
+MLP`<K[(`&*^Q`!2OL``0`("P):^G`$2/H@!(,+?__SP$JJH40``"-(2JJ@``
+M("4NXP!`$&``>0``$"60PP```````!1@`'4`````E,,``@`````L8P`%%&``
+M<`````"4P@`"`````"Q"``840``'``#P)93"``(`````+$(`#A1```(D'@`!
+M)!X``Y#'``20P@`%```````"$@``XC@ED,(`!@```````A0``.(X)9#"``<`
+M``````(6``#B."4`Y#@FD,,`")#"``D```````(2``!BJ"4"I*@F,K7__Y#3
+M``J0P@`+```````"$@`"8I@ED,(`#````````A0``F*8)9#"``T```````(6
+M``)BF"4"9)@FD,,`#I#"``\```````(2``!BH"4"A*`F,I3__Y#2`!"0P@`1
+M```````"$@`"0I`ED,(`$@```````A0``D*0)9#"`!,```````(6``)"D"64
+MP@`"`````"Q"``X00``"`D20)C)2`/\`%XE`-`60`#P0```F$````L`@)0(E
+M*"$"`/@)`.`P)30%D`0"P"`E`B4H(0(`^`D"H#`E-`60"`+`("4")2@A`@#X
+M"0)@,"4T!9`,`L`@)0(E*"$"`/@)`H`P)30%D!`"P"`E`B4H(0(`^`D"0#`E
+M-`60%`+`("4")2@A`@#X"0/`,"4\`@``)$(```+`("6/I@!$`$#X"0+@*"6/
+MOP`TC[X`,(^W`"R/M@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]
+M`#@GO?_HK[\`$"2#$Q,\`@``)$(```"@("4`8"@E`$#X"20&``:/OP`0````
+M``/@``@GO0`8)[W_Z*^_`!`\`@``)$(``"2$$Q,`0/@))`8`!B0"``&/OP`0
+M``````/@``@GO0`8)[W_Z*^_`!`\`@``)$(```"@("4\!0``)*44L`!`^`DD
+M!@`&C[\`$``````#X``()[T`&`/@``@``!`E)[W_X*^_`!BOL0`4K[``$`"`
+M@"4`P(@E``4H@#P"```D0@```$#X"22E8``\`@``)$(```(`("4D!6P`)`8`
+M`P!`^`DD!P`"$$``!P(`("4\`@``)$(```!`^`DD!6@`IB(``"0"``&/OP`8
+MC[$`%(^P`!`#X``()[T`(#"E__^4@@((`````!!%``<D`P`,E((2<@`````P
+M0@"`%$```B0#``LD`P`#$,```@````"LPP```^``"```$"4#X``()`(``2>]
+M_^"OOP`<K[(`&*^Q`!2OL``0`("0)990$D@`````,A$`'``1B((R$``"`!"`
+M*SP"```D0@```$#X"0(@*"4`4!`F/`,``"1C```"0"`E`B`H)0!@^`DL1@`!
+MC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_`!BOL0`4K[``$`"`B"4`
+MH(`E/`(``"1"````0/@))`5`%``0@$`D`P`#`@,8!``#&"<`0Q`D)`8``@(&
+M,`0\`P``)&,```(@("4D!4`4`&#X"0!&,"4D`@`!C[\`&(^Q`!2/L``0`^``
+M"">]`"`GO?_@K[\`&*^Q`!2OL``0`("()0"@@"4\`@``)$(```!`^`DD!4`4
+M`!"`0"0&``,"!C`$``8P)SP#```D8P```B`@)20%0!0`8/@)`$8P)"0"``&/
+MOP`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)0"@
+MB"4`P(`E/`(``"1"````0/@))`5`&"0#``$"(Q@$``,8)P!#$"0R$``!`C"`
+M!#P#```D8P```D`@)20%0!@`8/@)`%`P)20"``&/OP`<C[(`&(^Q`!2/L``0
+M`^``"">]`"`GO?_HK[\`%*^P`!``H(`E+@(`!A!```@D`O__/`(``"1"````
+M0/@))`5`'#!"`"\"`A`&,$(``8^_`!2/L``0`^``"">]`!@GO?_@K[\`'*^R
+M`!BOL0`4K[``$`"`D"4`H(`E`,"()3P"```D0@```$#X"20%0!0`$"L``!"`
+M0"0$``,"!"`$`*0@)3P#``$T8X```&08)P!#,"0`Q3`E$B```S3&@``\`@`!
+M`,(P)3P"```D0@```D`@)0!`^`DD!4`4CD,3'#P%`0`\`@``)$(```)`("4`
+M0/@)`&4H)8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`8K[$`%*^P
+M`!``@(@E`*"`)3P"```D0@```$#X"20%0!`2```&`$`P)20"``02`@`&)`+_
+MWQ````<TQ@`@)`+_GQ````8`PC`D`,(P)!````,TQ@!`)`+_OP#","0\`@``
+M)$(```(@("4`0/@))`5`$(^_`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_`!`\
+M`@``)$(```!`^`DT!8`$/`,`@`!#$"0L0@`!)`,``@!B$"./OP`0``````/@
+M``@GO0`8)[W_X*^_`!BOL0`4K[``$`"`B"4`H(`E/`(``"1"````0/@)-`6`
+M!`!`&"4\`@"``&(0)!!```4D`@`"%@(`!@`````0```+`````"0"``$2`@`(
+M`````#P&`(`\`@``)$(```(@("4T!8`$`$#X"0!F,"6/OP`8C[$`%(^P`!`#
+MX``()[T`(`/@``@``!`E`^``""RB``$GO?_@K[\`'*^R`!BOL0`4K[``$`"`
+MB"4PT/__/`(``"1"```F)!,X`$#X"20&``:2(Q,XDB(3.0```````A(``&(8
+M)9(B$SH```````(4``!B&"62)A,[```````&-@`\`@``)%(```(@("4T!8`(
+M`D#X"0!F,"62(Q,\DB(3/0```````A(``&(8)3(&/_\`!C0``B`@)30%@`P"
+M0/@)`&8P)18```P\`@``)$(```(@("4`0/@)-`6`!#P&`!`"("`E-`6`!`)`
+M^`D`1C`E$```#0`````D0@```B`@)0!`^`DT!8`$/`;_[S3&__\\`P``)&,`
+M``(@("4T!8`$`&#X"0!&,"2/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_8
+MK[\`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("@)3P2```F4@```D#X"30%@&P`
+M0)@E`H`@)0)`^`DT!8!P`$"`)0*`("4"0/@)-`6`;`!3F"L"$X`A`@"()0``
+M@"4`$8````"()0!`&"4``!`E`@(0)0(C&"6/OP`DC[0`((^S`!R/L@`8C[$`
+M%(^P`!`#X``()[T`*">]_^BOOP`0/`(``"1"````0/@)-`6`;(^_`!``````
+M`^``"">]`!@GO?_HK[\`%*^P`!``@(`E/`(``"1"````0/@)-`6`)#P&`0`\
+M`P``)&,```(`("4T!8`D`&#X"0!&,"6/OP`4C[``$`/@``@GO0`8)[W_V*^_
+M`""OLP`<K[(`&*^Q`!2OL``0`("8)3P"```D0@```$#X"30%F&0``I3",E(!
+M_S)"`0`00``#/!$``#I2`?\`$I`G)C$```)@("4"(/@)-`6`<`!`@"4"8"`E
+M`B#X"30%@&P"`H`F`A(0)H^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@G
+MO?_HK[\`%*^P`!``@(`E/`(``"1"````0/@))`5`()8#`=`P0@#_`&(8)BQB
+M``&/OP`4C[``$`/@``@GO0`8)[W_X*^_`!ROL@`8K[$`%*^P`!``@)`E`*"`
+M)3P1```F,0```B#X"30%@)B.`P````````!#$"&N`@```D`@)0(@^`DT!8"4
+MC@,`!```````0Q`AK@(`!`)`("4"(/@)-`6`G(X#``P``````$,0(:X"``P"
+M0"`E`B#X"30%@)".`P`(``````!#$"&N`@`(`D`@)0(@^`DT!8"@C@,`$```
+M````0Q`AK@(`$(^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`<K[(`
+M&*^Q`!2OL``0`("()0"@@"4N`@`)%$``"`(@D"4\`@``)$(```!`^`DT!?__
+M`%`0*Q!```4"("`E)`+__ZY"$_P0```-```0)3P"```D0@```$#X"0(`*"4\
+M`P``)&,```(@("4T!8`0`&#X"0!`,"6N4!/\)`(``8^_`!R/L@`8C[$`%(^P
+M`!`#X``()[T`(">]_^BOOP`4K[``$`"`@"4\`@``)$(```!`^`DT!8`0/`,`
+M`"1C```"`"`E`&#X"3!%__^/OP`4C[``$`/@``@GO0`8)[W_V*^_`""OLP`<
+MK[(`&*^Q`!2OL``0`("()0"@D"4"()@E/`(``"1"````0/@))`4?_P!2$"L0
+M0``%`B`@)20"__^N8A0`$```%@``$"4\`@``)$(```!`^`DT!8`4`$"`)3P"
+M```D0@```B`@)0!`^`D"0"@E)`/@``(#@"0P0A__/`,``"1C```"("`E-`6`
+M%`!@^`D"`C`EKG(4`"0"``&/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H
+M)[W_Z*^_`!2OL``0`("`)3P"```D0@```$#X"30%@!0\`P``)&,```(`("4`
+M8/@),$4?_X^_`!2/L``0`^``"">]`!B0@A/T`````#A"``$#X``(,$(``2>]
+M_^"OOP`<K[(`&*^Q`!2OL``0`("0)1"@`!("0(@E/`(``"1"````0/@)-`6`
+M!#P0_O\V$/__/`,``"1C```"("`E-`6`!`!@^`D`4#`DCB(3]```````4!`D
+M$```$:XB$_0\`@``)$(```)`("4`0/@)-`6`!#P0`0`\`P``)&,```)`("4T
+M!8`$`&#X"0!0,"6.(A/T``````!0$"6N(A/T)`(``8^_`!R/L@`8C[$`%(^P
+M`!`#X``()[T`(">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`B"4`H)`E`B"8
+M)3P"```D0@```$#X"20%'_\`4A`K$$``!0(@("4D`O__KF(4!!```!D``!`E
+M/`(``"1"````0/@)-`6`%`!`@"4\`@``)$(```(@("4`0/@)`D`H)3P#X``T
+M8___`@.`)``"%``\`Q__`$,0)#P#```D8P```B`@)30%@!0`8/@)`@(P):YR
+M%`0D`@`!C[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_^BOOP`4K[``
+M$`"`@"4\`@``)$(```!`^`DT!8`4``(L`CP"```D0@```@`@)0!`^`DPI1__
+MC[\`%(^P`!`#X``()[T`&`/@``@D`@`!`^``"``````#X``(```0)0/@``@`
+M`````^``"``````GO?_H)`(``12B``6OOP`0%,``!R0"``T0```%```0)3P"
+M```D0@```$#X"0````"/OP`0``````/@``@GO0`8)[W_X"0"``L0H@`&K[\`
+M&"0#`!X0HP`2```0)1````D`````,.8`!JR&`?@\`@``)$(```!`^`DT!8!H
+M$```""0"``&/H@`P`````*^B`!`\`@``)$(```!`^`D`````C[\`&``````#
+MX``()[T`(">]_^"OOP`8CZ(`,(^C`#0`````KZ(`$#P"```D0@```$#X":^C
+M`!2/OP`8``````/@``@GO0`@)[W_V*^_`""OLP`<K[(`&*^Q`!2OL``0`("(
+M)0"@@"4\`@``)%(```)`^`DT!8`$/`8`!#P#```D<P```B`@)30%@`0"8/@)
+M`$8P)1(```D"("`E`D#X"20%0`0\!O_\-,;__P(@("4D!4`$`F#X"0!&,"2/
+MOP`@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_T*^_`"ROM@`HK[4`)*^T
+M`""OLP`<K[(`&*^Q`!2OL``0$*``,0"`B"4\`@``)$(```!`^`DD!4`$/`;_
+M_#3&__\\`P``)&,```(@("4D!4`$`&#X"0!&,"0\`@``)$(```!`^`DD!`?0
+M)!``"CP"```D4@``/!8``3P"```D50``/!3__#:4__\\`@``$```"R13```"
+MH/@))`0`R`(@("4"0/@))`5`!`(@("4D!4`$`F#X"0!4,"0F$/__$@``"`(@
+M("4"0/@))`5`$`!6$"040/_P`````!8```,`````$```#P``$"4\`@``)$(`
+M``(@("4`0/@)-`6`!#P&__LTQO__/`,``"1C```"("`E-`6`!`!@^`D`1C`D
+M)`(``8^_`"R/M@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#`G
+MO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``@(@E`*"`)3P"```D4@```D#X"30%
+M@`0\!@`$/`,``"1S```"("`E-`6`!`)@^`D`1C`E$@``"0(@("4"0/@))`5`
+M!#P&__PTQO__`B`@)20%0`0"8/@)`$8P)(^_`""/LP`<C[(`&(^Q`!2/L``0
+M`^``"">]`"@GO?_@K[\`'*^R`!BOL0`4K[``$`"@B"4`P"@E)!```1(P``T`
+M@)`E$B``!CP"``$D`@`"$B(`#@``$"40```2`````"1"C@``0/@)`````!``
+M``L`0(`E/`(``21"CTP`0/@)`````!````:N41,T/`(``21"C7``0/@)````
+M`*Y1$S0"`!`EC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_`!`\`@``
+M)$(```!`^`DD!4`$``(4`C!"``./OP`0``````/@``@GO0`8`````">]_^BO
+MOP`4)`(``1"B``:OL``0)`(``A"B``8``!`E$```"P`````\`@``$````R10
+M```\`@``)%```#P"```D0@```$#X"0(`*"4"`!`EC[\`%(^P`!`#X``()[T`
+M&">]_^BOOP`0/`(``"1"````0/@))`4`#(^_`!```````^``"">]`!@GO?_H
+MK[\`$`"@,"4\`@``)$(```!`^`DD!0`,C[\`$``````#X``()[T`&">]_^BO
+MOP`0/`(``"1"```D!0`(`$#X"20&``2/OP`0``````/@``@GO0`8)[W_V*^_
+M`""OLP`<K[(`&*^Q`!2OL``0`("8)3P"```D0@``)`4`"`!`^`DD!@`@``"`
+M)3P"```D4@``/`(``"11```"8"`E`D#X"20%``@P0P`$$&``!R0"``$"(/@)
+M)`0`"B80``$J`@/H%$#_]0``$"6/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@G
+MO0`H)[W_Z*^_`!2OL``0`("`)3P"```D0@```$#X"30%@&@D!O^_/`,``"1C
+M```"`"`E-`6`:`!@^`D`1C`DC[\`%(^P`!`#X``()[T`&">]_^BOOP`4K[``
+M$`"`@"4\`@``)$(```!`^`DT!8!H/`,``"1C```"`"`E-`6`:`!@^`DT1@!`
+MC[\`%(^P`!`#X``()[T`&">]_^"OOP`<K[(`&*^Q`!2OL``0`("()0"@$"4`
+MP)`E/!```"80```T!8!0`@#X"0!`,"4"("`E-`6`5`(`^`D"0#`EC[\`'(^R
+M`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_`!BOL0`4K[``$`"`B"4`H(`E+@,`
+M0!!@`"$``!`E+@(`(!1``!`\`@``)$(```!`^`DT!8!4)@/_X"0&``$`9C`$
+M``8P)SP#```D8P```B`@)30%@%0`8/@)`$8P)!````\D`@`!)$(```(@("4`
+M0/@)-`6`4"0&``$"!C`$``8P)SP#```D8P```B`@)30%@%``8/@)`$8P)"0"
+M``&/OP`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`8K[$`%*^P`!``@(@E`*"`
+M)2X#`$`08``?```0)2X"`"`40``//`(``"1"````0/@)-`6`5"8#_^`D!@`!
+M`&8P!#P#```D8P```B`@)30%@%0`8/@)`$8P)1````XD`@`!)$(```(@("4`
+M0/@)-`6`4"0&``$"!C`$/`,``"1C```"("`E-`6`4`!@^`D`1C`E)`(``8^_
+M`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_`!`\`@``)$(```!`^`DT!8!,C[\`
+M$``````#X``()[T`&">]_^@`H#`E,,("`!!```2OOP`0)`+]_P#","0TQ@`@
+M/`(``"1"````0/@)-`6`3(^_`!```````^``"">]`!BHH``(N*``"S#"#_^H
+MH@`,N*(`#XBC``R8HP`/`````!1F`!(``!`E,.(`(!!```<`````B*(`#)BB
+M``\`````-$(@`*BB``RXH@`/J*``%+B@`!>(H@`4F*(`%P````"HH@`0N*(`
+M$R0"``$#X``(`````">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`F"4`P(`E
+MC[(`0```````H(@EBB,`%)HC`!<`````,&,``1!@`'TD`@`/B.(`%)CB`!<`
+M````,$(``11```8\`@``)$(```!`^`DD!0`,$%``<B0"``^*(@`0FB(`$P``
+M```P0@__ID(``(HP`!2:,``7/`(/_S1"@``"`H`D`!"#PCP"```D0@```F`@
+M)0!`^`DT!8!L``(:@C!C__\P8A__`%`0*Q!```0D8N``,$+__Q````("`H`E
+M`@.`)3("?_^F0@`"HD``!(HB`!2:(@`7`````#!"``(40``I`````(HB`!2:
+M(@`7`````#!"``000``#)`(``1```"&B0@`$BB(`%)HB`!<`````,$(`$!!`
+M``8`````DD(`!``````T0@`($```%J)"``2*(@`4FB(`%P`````P0@`($$``
+M!@````"20@`$`````#1"``00```+HD(`!))"``0`````-$(``J)"``2*(@`4
+MFB(`%P`````P0@#@``(10J)"``6*(@`0FB(`$P```````A3"HD(`!HHB`!2:
+M(@`7`````#!"`0`00``()`(`_XHB`!2:(@`7`````#!"?@```A)"$````J)"
+M``>B0@`'BB(`$)HB`!,```````(3PC!"``^B0@`(BB(`$)HB`!,```````(3
+M@C!"``&B0@`)BB(`$)HB`!,```````(3`C!"``&B0@`*```0)8^_`""/LP`<
+MC[(`&(^Q`!2/L``0`^``"">]`"@````````````````GO?_(K[\`-*^^`#"O
+MMP`LK[8`**^U`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`D"4`H+@E`,#P):^G
+M`$0"0)@EE\(``@`````P0@$`$$`"!20#``P\`@``)$(```!`^`D#P"@E`$"P
+M)1+``?XD`P`,)`(`!A+B``HNX@`'$$``!B0"``@NX@`"$$`!]CP"```0```%
+M)$(``!;B`?(D`P`,/`(``"1"```"0"`E`$#X"20%0!`P5`!@/`(``"1"```"
+M0"`E`$#X"0/`*"400`'E)`,``Y)C$Q.28A,4```````"$@``8A@EDF(3%0``
+M`````A0``&(8)9)F$Q8```````8V`#P0```F$````D`@)30%@``"`/@)`&8P
+M)9)B$Q>29A,8```````&,@`"0"`E-`6`!`(`^`D`1C`E/`(``21"H&`"0"`E
+M`$#X"0+@*"4D`@`!$N(`&@)`("42X``3)`(`!A+B``4D`@`($N(`(#P1```0
+M```K)C$``#P0```F$````D`@)20%`"@"`/@)```P)0)`("4D!4`0`@#X"20&
+M$$`0```=/!$``#P0```F$```)`4`*!````4D!@`!/!```"80```D!0`H```P
+M)0(`^`D\$0```D`@)20%0!`"`/@))`80)!````TF,0``/!```"80```"0"`E
+M)`4`*`(`^`D``#`E`D`@)20%0!`"`/@))`800#P1```F,0```D`@)0(@^`DD
+M!4`0/!```"80```"0"`E)`5`$`(`^`D`5#`EDF,3.))B$SD```````(2``!B
+M&"628A,Z```````"%```8A@EDF83.P``````!C8``D`@)30%@`@"`/@)`&8P
+M)9)B$SR29A,]```````&,@`"0"`E-`6`#`(`^`D`1C`E`D`@)0``*"4"`/@)
+M```P)0)`("4D!0`$`@#X"0``,"4"0"`E)`4`#`(`^`D``#`E`D`@)0(@^`DD
+M!0`<`D`@)20%`"`"`/@)```P)0)`("4D!0`D`@#X"0``,"6N8!,<`D`@)0(@
+M^`DD!0`L`D`@)20%`#`"`/@))`8`!0)`("4D!0`T`@#X"20&``4"0"`E)`4`
+M1`(`^`DD!@`(`D`@)20%`$@"`/@))`8`"`)`("4D!0!0`@#X"0``,"4"0"`E
+M)`4`3`(`^`D``#`E`D`@)20%0`P"`/@)```P)0)`("4D!0!``@#X"0``,"4"
+M0"`ECF83^`(`^`DT!8`8`D`@)30%@$@"`/@)```P)3P"```D0@```D`@)0!`
+M^`D``"@E`D`@)30%@%`"`/@)```P)0)`("4T!8!4`@#X"0``,"4"0"`E-`6`
+M6`(`^`D``#`E`D`@)30%@%P"`/@)```P)0)`("4T!8!@`@#X"20&``$"0"`E
+M-`6`9`(`^`DD!@`!`D`@)30%@&@"`/@)```P)0)`("4T!8`H`@#X"0``,"4"
+M0"`E-`6`+`(`^`D``#`E`D`@)30%@&P"`/@)```P)0)`("4T!8`P`@#X"20&
+M__\"0"`E-`6`-`(`^`DD!O__`D`@)30%@#@"`/@))`8``0``@"4\`@``)%44
+MP#P"```D5!3$/`(``"11````$!#``%40(8Q%````````CZ(`1``````00``$
+M)**``"Q"$``40``&```````0$,``5!`AC$8```(@^`D"0"`E)A```2X"`*<4
+M0/_N`!`0P#P"```D0@```D`@)0!`^`D#P"@E$$``TR0#``,\$0``)C$```)`
+M("4"(/@)-`68*#P#__\T8P#_`$,0)))F$GD```````8R`#P0```F$````D`@
+M)30%F"@"`/@)`$8P)9)B$GH```````(V```"%```PC`EDF,2>P```````Q(`
+M`,(P)0)`("4T!9@T`@#X"0##,"4"0"`E`B#X"30%F$0D`\!_`$,0))9F$G0`
+M``````8P0C#&/X`"0"`E-`681`(`^`D`1C`E`D`@)0(@^`DT!9A(/`/__#1C
+M#_\`0Q`DEF82=```````!C*`/`,``S1C\```PS`D`D`@)30%F$@"`/@)`$8P
+M)0)`("4"(/@)-`689#P#__@T8P__`$,0)))F$G@```````8S`#P#``<T8_``
+M`,,P)`)`("4T!9AD`@#X"0!&,"4"0"`E`B#X"30%F1`D`__\`$,0))9F$G0`
+M````,,8``P)`("4T!9D0`@#X"0!&,"4\`@`!)$*S@`)`("4`0/@)`L`H)1!`
+M`'4D`P`#CZ0`1``````0@``./!```)+#``0`````,&(``A1```(P8@#^HL(`
+M!);"``(`````I\(``I+"``0`````H\(`!#P0```F$````D`@)30%F!P"`/@)
+M)`8``3P"```D0@```$#X"20$`^@\`@``)$(```)`("4`0/@)-`688`)`("4T
+M!9A@`@#X"31&``$\`@``)$(```)`("4T!9A@)`8``0!`^`D``#@E/`(``"1"
+M```"0"`E`$#X"0+`*"440``'``"`)9?"``(`````-$(``J?"``(0```^)`,`
+M`SP"```D40```D`@)0(@^`D"`"@E)A```2H"``,40/_[`D`@)8Y"$DP`````
+M$$``!#P"```D0@```$#X"0)`("4\`@``)$(```)`("4`0/@)-`6`)#P&_G\T
+MQO__/`,``"1C```"0"`E-`6`)`!@^`D`1C`DCF43_"0"__\0H@`$/`(``"1"
+M````0/@)`D`@)8YE%``D`O__$*(`!#P"```D0@```$#X"0)`("6.910$)`+_
+M_Q"B``0\`@``)$(```!`^`D"0"`ECD8!^``````0P``%`D`@)3P"```D0@``
+M`$#X"30%@&BN5P'<$```""0"``&/I`!(`````(R"````````$$```@``$"6L
+M@P``C[\`-(^^`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@
+M``@GO0`X)[W_X*^_`!ROL@`8K[$`%*^P`!``@)`E`*"()0)`@"4\`@``)$(`
+M``!`^`DT!8`$,$/__R0"``$2(@`8*B(``A!```4`````$B``#P`````0```G
+M`````"0"``82(@`%)`(`"!(B`!D\`@``$```(`````".!A/T``````!F,"40
+M```*/`,`48X&$_0``````&8P)1````4\`P!2C@83]```````9C`E/`,`%#P"
+M```D0@```D`@)30%@`0`0/@)`,,P)1````H`````C@83]```````9C`E/`,`
+M$"1"```"0"`E-`6`!`!`^`D`PS`EC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@
+M)[W_Z*^_`!`\`@`!)$*@8(R%`=P`0/@)`````(^_`!```````^``"">]`!@G
+MO?_HK[\`$#P"``$D0J;$)`4`"`!`^`DD!@`*C[\`$``````#X``()[T`&">]
+M_^"OOP`8K[$`%*^P`!``@(@E/`(``"1"`````"@E`$#X"20&``$00``4)`4`
+M#SP"``$D0J;$`B`@)0!`^`DD!DX@$$``#3P0```F$````@#X"20$`^@\`@`!
+M)$*FQ`(@("4D!0`?`$#X"20&3B`"`/@))`0(-"0"``&/OP`8C[$`%(^P`!`#
+MX``()[T`(">]_^"OOP`8K[$`%*^P`!``@(@E`*"`)3P"```D0@`````H)0!`
+M^`DD!@`!$$``,P`````2```'```P)98"``(`````,$(`$!!```,\`@``)`8`
+M`3P"```D0@```B`@)0!`^`DT!9@$/`(``21"IL0"("`E)`4`#P!`^`DD!DX@
+M$$``'@`````\`@``)$(```!`^`DD!`/H/`(``21"IL0"("`E)`4`'P!`^`DD
+M!DX@$$``$@`````\`@``)$(```!`^`DD!`@T/`(``"1"```"("`E```H)0!`
+M^`DD!@`!$$``!@(@("4\`@`!)$*FQ```*"4`0/@))`8`"H^_`!B/L0`4C[``
+M$`/@``@GO0`@)[W_P*^_`#ROO@`XK[<`-*^V`#"OM0`LK[0`**^S`"2OL@`@
+MK[$`'*^P`!@`@+`EKZ4`1#P"```D0@```$#X":^F`$@`0+@E$N``NCP1```F
+M,0```L`@)0(@^`DT!8!H/!(``"92```"P"`E-`6`:`)`^`DT1@!@`L`@)0(@
+M^`DT!8`DKZ(`$#P&_W\TQO__`L`@)30%@"0"0/@)`$8P)#P0```F$````@#X
+M"20$#Z`"P"`E`B#X"30%F`@\!@@``L`@)30%F`@"0/@)`$8P)0(`^`DD!``*
+M/`(``21"LX`"P"`E`$#X"0+@*"400`"1`````#P"```D7@```\#X"20$`^@\
+M$0``)C$```+`("4"(/@)-`68"#P2]_\V4O__/!```"80```"P"`E-`68"`(`
+M^`D`4C`D`L`@)0(@^`DT!9A8`$"8)0+`("4"(/@)-`687`!`H"4"P"`E`B#X
+M"30%F&@`0*@E/`;\`S3&__\"9C`D/`(#_`+`("4T!9A8`@#X"0#","4\!O_`
+M-,8`?P*&,"0\`@`_-$+`@`+`("4T!9A<`@#X"0#","4\!O_^-,8`'P*F,"0"
+MP"`E-`68:`(`^`DTQA&``\#X"20$`!0"P"`E`B#X"30%F`@\!@@``L`@)30%
+MF`@"`/@)`$8P)0/`^`DD!``*`L`@)30%F-0"`/@))`8`(0+`("4"(/@)-`68
+M"`+`("4T!9@(`@#X"0!2,"0#P/@))`0#Z`+`("4"(/@)-`688`+`("4T!9A@
+M`@#X"31&``$\`@``)$(```+`("4T!9A@)`8``0!`^`D``#@E`L`@)30%F%@"
+M`/@)`F`P)0+`("4T!9A<`@#X"0*`,"4"P"`E-`68:`(`^`D"H#`E/`(``"10
+M```"P"`E`@#X"0+@*"440``.``````/`^`DD!!.(`L`@)0(`^`D"X"@E%$``
+M"#P"``"/HP!$`````)1B``(`````-$(``J1B``(\`@``)$(```+`("4`0/@)
+M-`6`:"0&_Y\\$```)A````+`("4T!8!H`@#X"0!&,"0"P"`ECZ8`$`(`^`DT
+M!8`D)`(``8^C`$@`````K&(``(^_`#R/O@`XC[<`-(^V`#"/M0`LC[0`*(^S
+M`"2/L@`@C[$`'(^P`!@#X``()[T`0">]_]"OOP`HK[,`)*^R`""OL0`<K[``
+M&`"`D"4`H(`E`,"()18```.OL``0)`+__Z^B`!`\`@``)%,```)`("4D!4``
+M`F#X"0(`,"4\`@``)$(```!`^`D"("`E,A``#X^B`!``````,$(`#Z^B`!`\
+M`@``)$(```)`("4D!4``CZ8`$`!`^`D"`#@E`$"()3("``040``5`B`0)20"
+M`!6OH@`0DZ<`$">C`!"08@`!```````"$@``XC@ED&(``@```````A0``.(X
+M)9!F``,```````8V``)`("4D!0`4`F#X"0#F,"4"(!`EC[\`*(^S`"2/L@`@
+MC[$`'(^P`!@#X``()[T`,##&`/\``#@E)`0`"B0)`#\DR@`!/`P08C6,3=,D
+M"P`!``000"1"``,P0@#_%,(`"``$&"H`I!`AD$,````````4:0`\`&`0)1``
+M`"LD!P`!``000"1"``,P0@#_`4(0)BQ"``$`0Q`D$$``&P"D$"&00P``)`<`
+M/Q!G`!4``````(40(9!(__\`````$0<`$```````:!`C``(80`!B&"$``QB`
+M`&(8(P`#&0``8A@C``,80"1B`^<`3``9```0$``"$8(`2!`A`^``"#!"`/\0
+M```))`<``0`````4ZP`&``````"D$"&00P```````!1I`!``8!`E)(3__P2!
+M_\@````````@)20&`#\`I!`AD$,````````49@`&`&`0)22$``$H@@`+%$#_
+M^``````D`@`!`^``"``````PQ@#_)`G__R0(__\``"`E)`H`/R0+__\DHP`#
+M`*00(9!"````````$$H`&@`````0P@`N``000`"D$"&00@````````!&$"L0
+M0``"`*00(0"`0"600@````````#"$"L00``-)(0``22$__\5"P`-`(!()0`)
+M$$`D0@`#H.(```$C$"&00@`(``````/@``@`````)(0``2B"``L40/_?````
+M`"B#``LX8P`!``@0)RQ"``$`8A@D%&#_]"0"`#\H@@`+%$``$```````"!!`
+M)$(``Z#B```!!1`AD$(`"P`````#X``(`````"1"``.@X@```(40(9!"``L`
+M`````^``"``````!"1`A)$(``Z#B````J!`AD$0`````````Q#`C``890`!F
+M&",``QB``&88(0`#&,``J1`AD$(`````````1!`C`&(`&@``&!(40``"````
+M```'``TDI0`#`240(9!$``@E`@`(`*(H(9"B`````````((@(P!D`!@``#`2
+M),8#YSP"$&(T0DW3`,(`&0``$!```A&"`````)"C`````````$,0(3!"`/\#
+MX``(`````"RB`#T40``"`````"0%`#RDA0'\`^``""0"``$GO?_(K[\`-*^V
+M`#"OM0`LK[0`**^S`"2OL@`@K[$`'*^P`!@`@)@E`*`X)0#`D"4"8"@EEF(2
+M=@```````A$",$(`!Z)"``^28A)W`````#!"``>B0@`0E.,````````D8^O.
+M+&,`EQ!@`/@``!`EEF,"")"B$GX`````$&(`#```,"4DI``&),8``2S"``00
+M0``()`,`!`#$$"&68P((D$(2>``````48O_W`````"0#``00PP#E```0)93B
+M````````)$+KSCP#9F8T8V9G`$,`&```&!```QB#``(7PP!B&",L8@`,+$(`
+M`0!B$",\`ZJJ-&.JJP!#`!D``!@0``,80@```````Q#``$,0(P`"$(``0Q`A
+M`**((28Q$H(`T1`A)$4`&9"B````````HD(`#I(D`!8`````,(,`_Y"B````
+M`````$,0*Q!```,`````D*0```````"B1``)`-$0(21%`!F2)``7`````#"#
+M`/^0H@````````!#$"L00``#`````)"D````````HD0`"`#1$"$D10`9DB0`
+M&``````P@P#_D*(`````````0Q`K$$```P````"0I````````*)$``<`T1`A
+M/!```280J0@"8"`E`B`H)9!&`!D"`/@))Z<`$`!`H"4"8"`E`B`H)9)&``D"
+M`/@))Z<`$0!`L"4"8"`E`B`H)9)&``@"`/@))Z<`$@!`J"4"8"`E`B`H)9)&
+M``<"`/@))Z<`$P!`&"6.8@(``````!!``&X``A!`/`,``"1C&@P`0Q`AE$0`
+M``````"3H@`0)(,``P!#$"H00``#)`(``Q````6CH@`0DZ(`$```````1!`C
+MHZ(`$#P"``$D0J?,`F`@)9.F`!``0/@)`B`H):)"``X\`@`!)$*I"`)@("4"
+M("@EDD8`#@!`^`DGIP`4`$"@)9.D`!``````,(,`_Y.B`!$``````$,0*Q!`
+M``,`````DZ0`$0````"CI``1/`(``21"I\P"8"`EDZ8`$0!`^`D"("@EHD(`
+M"3P"``$D0JD(`F`@)0(@*"621@`)`$#X"2>G`!0`0+`EDZ0`$``````P@P#_
+MDZ(`$@``````0Q`K$$```P````"3I``2`````*.D`!(\`@`!)$*GS`)@("63
+MI@`2`$#X"0(@*"6B0@`(/`(``21"J0@"8"`E`B`H)9)&``@`0/@))Z<`%`!`
+MJ"63I``0`````#"#`/^3H@`3``````!#$"L00``#`````).D`!,`````HZ0`
+M$SP"``$D0J?,`F`@)9.F`!,`0/@)`B`H):)"``<\`@`!)$*I"`)@("4"("@E
+MDD8`!P!`^`DGIP`4`$`8)9.B`!````````(00*9B`?Z20@`.`````*)"``JB
+M0@`+HD(`#*)"``T"@Q`CHD(```*5$".B0@`!`I80(Z)"``*B0``&HD``!:)`
+M``2B0``#)`(``8^_`#2/M@`PC[4`+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``
+M"">]`#@GO?]XK[\`A*^T`("OLP!\K[(`>*^Q`'2OL`!P`("@)0"@B"4\$```
+M)A```">D`"@\!0``)*4:&`(`^`DD!@!$)Z0`$#P%```DI1GX`@#X"20&`!$\
+M`@`!)$*JW`*`("4"("@E`$#X"2>F`!`00`#H`````).C`!\`````)&/__RQC
+M``408`#B```0)9.C`"``````)&/__RQC``408`#<``"()2>R`!`\`@``)%,`
+M``)1@"&2!````F#X"20%``6B`@``)B(``3!1__\N(@`'%$#_^`)1@"$D$0`'
+M)[(`$#P"```D4P```E&`(9($```"8/@))`4`!J("```F(@`!,%'__RXB``\4
+M0/_X`E&`(9.D`!$```````090#!C`."3H@`0`````#!"`!\`8A@ECZ(`*```
+M````8A@EKZ,`*).E`!,```````49P#!C`("3H@`2```````"$(`P0@!\`&(8
+M)0`$(,(PA``#`&08)8^B`"P``````&(8):^C`"R3I``4```````$$0`P0@#P
+M``4H0C"E``\`11`ECZ,`,```````0Q`EKZ(`,).E`!8```````49@#!C`,"3
+MH@`5```````"$$`P0@`^`&(8)0`$(0(PA``!`&08)8^B`#0``````&(8):^C
+M`#23I``7```````$$,`P0@#X``4H@C"E``<`11`ECZ,`.```````0Q`EKZ(`
+M.).E`!D```````49P#!C`("3H@`8```````"$$`P0@!^`&(8)0`$(4(PA``!
+M`&08)8^B`#P``````&(8):^C`#R3I``:```````$$4`P0@#@``4H0C"E`!\`
+M11`ECZ,`0```````0Q`EKZ(`0).E`!L```````40P#!"`/@`!"#",(0`!P!$
+M$"6/HP!$``````!#$"6OH@!$DZ(`'````````A!`,$(`?@`%*4(PI0`!`$40
+M)8^C`$@``````$,0):^B`$B3I``=```````$$4`P0@#@CZ,`3```````0Q`E
+MKZ(`3).C`!X```````,0P#!"`/@`!"#",(0`!P!$$"6/I`!0``````!$$"6O
+MH@!0``,90C!C``&/H@!4``````!B&"6OHP!4/!```"80``"3I``?`@#X"20%
+M``,``A'`,$(`@(^C`$@``````$,0):^B`$B3I``?`@#X"20%``,``A!",$(`
+M`X^C`$P``````$,0):^B`$R3I``@`@#X"20%``,``A"`,$(`'(^C`$P`````
+M`$,0):^B`$P``(@E)[``*#P"```D4@```!$0@`("$"$"@"`EC$8```)`^`DT
+M!9B<)B(``3!1__\N(@`0%$#_]P`1$(`#HA@A/`(``"1"```"@"`EC&8`*`!`
+M^`DT!9C4)`(``8^_`(2/M`"`C[,`?(^R`'B/L0!TC[``<`/@``@GO0"()[W_
+MX*^_`!ROL@`8K[$`%*^P`!``@(@E`*"0)99#````````)&/L`#P$9F8TA&9G
+M`&0`&```(!``!""#``,?PSP"```D0@```(,@(P!`^`DD!0`%``(00#P0```F
+M$````B`@)30%F)P"`/@)-$8`00(@("4T!9C``@#X"0``,"6N,A(T)`(``8^_
+M`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_^BOOP`0/`(``"1"````0/@)-`68
+M9``"%,(P0P'_,&(!`!!```(X8@'_``(8)P!@$"6/OP`0``````/@``@GO0`8
+M)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`B"4`H*`E/`(``"1"````
+M0/@)-`688#P#```D8P```B`@)30%F&``8/@)-$8``CP"```D0@```B`@)30%
+MF&`D!@`"`$#X"0``."400``7``"`)3P"```D4P``/`(``"12```"8/@))`0#
+MZ`)`^`D"("`E`$`@)280``$J`P`5*(+_N3A"``$`8A@D%&#_]2B"_[D40``#
+M```0)1````.F@``6IH0`%B0"``&/OP`DC[0`((^S`!R/L@`8C[$`%(^P`!`#
+MX``()[T`*`/@``@``!`E`^``"```$"4`````)[W_Z*^_`!``H#@E`(!`)2CC
+M``,08``)```0)0`'*0``IR@C``4H@`$%*"$\`@``)$(```!`^`DDI1-`C[\`
+M$``````#X``()[T`&">]_^BOOP`0`,!`)0"`."4HHP`#$&``"@``$"4`!3$`
+M`,4P(P`&,(``YC`A/`(``"1"```!`"@E`$#X"23&$T"/OP`0``````/@``@G
+MO0`8)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`F"4`H(@E)`(``A(B
+M``T`P*`E+B(``Q!```8D`@`#)`(``1(B``@``)`E$```)R0"__\2(@`$)!(`
+M`1```",D`O__)!(``@`2$0``4A`C``(0@`""@"$F$!-`C@,`!``````48``9
+M)`+__SP"```D0@```@`@)0!`^`DD!0`\%H``"ZX1``0D`@`+K@(`#"0"``*N
+M`@`4)`+__ZX"`!@D`@`*I@(`(!````>F`@`B/`(``"1"```"8"`E`D`H)0!`
+M^`D"@#`E`D`0)8^_`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H+*,`
+M`Q!@`",``!`E``41``!%$",``A"``((P(23&$T",PP`$`````!!@`!H``!`E
+MK,``!"0#``$`HQ@$``,8)XR"$R```````&(0)*R"$R",@A,D``````!B$"2L
+M@A,DC((3*```````8A`DK((3*(R"$RP``````&(0)*R"$RR,@A,P``````!B
+M&"2L@Q,P)`(``0/@``@`````)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``
+M$`"`F"4`H*`E`F"()8XE$C0`````+H,``Q!@`.,``!`E`!01``!4$",``A"`
+M`B*0(292$T".0P`$`````!!@`-H``!`ECD0`!"0#``$4@P#6)`(``92B``(`
+M````,$(`$!!``#(\$```)A````)@("4T!8`0`@#X"20&`>`"8"`E-`6`%#P&
+M"``"`/@)-,8(``)@("4T!8`@/`8!W0(`^`DTQH_/CD(`%````````C$``,(P
+M(P`&,4`DQ@'@``8RP`)@("4T!8!``@#X"33&`>`"8"`E-`6`1#P&!:X"`/@)
+M-,8#P#P"```D0@```F`@)0!`^`DT!9A$)`/_@`!#$"0"8"`E-`681`(`^`DT
+M1@`X`F`@)30%F`0\!F\``@#X"33&(",0```R`````"80```"8"`E-`6`$`(`
+M^`DD!@%H`F`@)30%@!0\!@0``@#X"33&!``"8"`E-`6`(#P&`=T"`/@)-,:/
+MIXY#`!0```````,00`!#$"$``C$``,(P(P`&,,`DQ@(P``8RP`)@("4T!8!`
+M`@#X"33&`C`"8"`E-`6`1#P&!-<"`/@)-,8#F#P"```D0@```F`@)0!`^`DT
+M!9A$)`/_@`!#$"0"8"`E-`681`(`^`DT1@`<`F`@)30%F`0\!F\``@#X"33&
+M$"".0P`8)`+__Q!B``,D!@`/CD8`&```````!C4`ED(`(@```````A$`,$(`
+M\`#","660@`@`````#!"``\`PC`E/`,`"#1C(``\`@``)$(```)@("4T!8`<
+M`$#X"0##,"6.0@`,`````#!"``$00``')`(``0*"$`2.(Q,@``````!#$"40
+M```'KB(3(`*"$`0``A`GCB,3(```````0Q`DKB(3((Y"``P`````,$(``1!`
+M``<D`@`!`H(0!(XC$R0``````$,0)1````>N(A,D`H(0!``"$">.(Q,D````
+M``!#$"2N(A,DCD(`#``````P0@`"$$``!R0"``$"@A`$CB,3*```````0Q`E
+M$```!ZXB$R@"@A`$``(0)XXC$R@``````$,0)*XB$RB.0@`,`````#!"``00
+M0``')`(``0*"$`2.(Q,L``````!#$"40```'KB(3+`*"$`0``A`GCB,3+```
+M````0Q`DKB(3+(Y"``P`````,$(`"!!```<D`@`!`H(0!(XC$S```````$,0
+M)1````>N(A,P`H(0!``"$">.(Q,P``````!#$"2N(A,P)`(``8^_`"2/M``@
+MC[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_Z*^_`!``!1$``$40(P`"$(``
+M@A`AC$,31``````08``))`(``11B``@D`O__/`(``"1"````0/@)```H)1``
+M``(`````)`+__X^_`!```````^``"">]`!@GO?_HK[\`$`"`."4`!1$``$40
+M(P`"$(``XA`AC$,31"0"``$08@`,`,!`)1!@`!$``!`E+&(`!!!```X``!`E
+M/`(``"1"````0/@))`4`!!````@D`@`!/`(``"1"````X"`E```H)0!`^`D!
+M`#`E)`(``8^_`!```````^``"">]`!@GO?_@K[\`'*^R`!BOL0`4K[``$`"`
+MD"4\`@``)$(```!`^`D`H(`E`$"()3P%?_\TI?__/`(``"1"```"0"`E`$#X
+M"0(E*"0\`@``)$(```)`("4`0/@)-`6`9!(```8`0#`E)`(`)0!&$",``A!"
+M$```"P#","$LP@`"$$``""3&__\\`@``)$(```)`("4`0/@)`B`H)1````P`
+M`!`E/`(``"1"```"0"`E`$#X"30%@&0\`@``)$(```)`("4`0/@)`B`H)20"
+M``&/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_@K[\`&*^Q`!2OL``0`("(
+M)0`%$0``11`C``(0@`(B$"&,0Q-$)`(``1!B``H\`@``$&``(@``$"4D`@`"
+M$&(`&"0"``,08@`*```0)1```!L`````)$(```(@("4D!0`(`$#X"20&``$0
+M```4)`(``3P0```F$````B`@)20%``@"`/@))`8``@(@("4D!0`H`@#X"20&
+M``X0```()`(``3P"```D0@```B`@)20%`"@`0/@))`8`"B0"``&/OP`8C[$`
+M%(^P`!`#X``()[T`(">]_^BOOP`0``41``!%$",``A"``((0(8Q#$T0`````
+M$&``"B0"``$48@`)```0)3P"```D0@```$#X"20%`!0P0G@`$````@`"$L(`
+M`!`EC[\`$``````#X``()[T`&">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`
+MB"4`!1$``$40(P`"$(`"(A`AC$,31"0"``$08@`(/`(``!!@`"L``!`E)`(`
+M`A!B`"$``!`E$```)@`````D0@```B`@)20%``@`0/@))`8`"```@"4\`@``
+M)%,``#P"```0```$)%(```)`^`DD!``*)A```2H"`^@00``&`B`@)0)@^`DD
+M!0`4,$)X`!1`__8`````/`(``"1"```"("`E)`4`"`!`^`D``#`E$```""H"
+M`^@\`@``)$(```(@("4D!0`L)`8`!`!`^`D``#@EC[\`((^S`!R/L@`8C[$`
+M%(^P`!`#X``()[T`*`#`("6/HP`0CZD`((^J`"2/J``H`````"1B__TL0@`"
+M%$```CP&#````S:`,(0/_X^B`!@```````(4@`""("4`!Q,`/`,``S1C\```
+M0Q`D`((@)3$"``$00``#`(8@)3P"`0``@B`E,0(`$!!```(\`B```((@)1%`
+M``(\`@(``((@):BD``BXI``+)`+__Q$B``X`"1-`/`,`!S1CX```0Q`DJ*(`
+M#+BB``^(H@`(F*(`"SP#0```0Q`EJ*(`"+BB``L0```$,0(`!*B@``RXH``/
+M,0(`!!!``!`\`P!`B*(`")BB``L``````$,0):BB``BXH@`+B*,`#)BC``\\
+M!/_XCZ(`,```````1!`D`&(8):BC``RXHP`/`^``""0"``$#X``(```0)8BB
+M``B8H@`+/`,@``!#$"6HH@`(N*(`"P/@``@`````CZ,`$``````0X``'````
+M`(BB``R8H@`/%&``%`!&$"40```2-$(0```````08``,`````(^B`!0`````
+MB$,`")A#``L`````J*,`"+BC``NHI@`,N*8`#Q````8`8!`EJ*``"+B@``LT
+MPA``J*(`#+BB``^HH``4N*``%XBB`!28H@`7`````*BB`!"XH@`3`^``""0"
+M``&(HP`4F*,`%P`````P8P`!$&``1R0"``^(H@`4F*(`%P`````P0A_^I,(`
+M`(BB`!"8H@`3```````"%`*DP@`"H,``!(BB`!"8H@`3`````#!"``$40``<
+M`````(BB`!"8H@`3`````#!"``(00``")`(``:#"``2(H@`0F*(`$P`````P
+M0@`($$``!0````"0P@`$`````#1"``*@P@`$B*(`$)BB`!,`````,$(`!!!`
+M``4`````D,(`!``````T0@`$H,(`!(BB``B8H@`+```````"%((P0@`/H,(`
+M!8BB`!28H@`7```````"$T*@P@`&B*(`$)BB`!,`````,$(/```"$@*@P@`'
+MB*(`$)BB`!,`````,$(`\``"$0*@P@`(H,``"J#```L``!`E`^``"``````#
+MX``(````````````````D*(`!``````T0@`(H*(`!`/@``@``!`E````````
+M```GO?_@K[\`'*^R`!BOL0`4K[``$`"`B"4\`@``)$(``#0%F-``0/@))`8<
+M%@``@"4\`@``)%(```(@("4T!9B``D#X"3P&``$F$``!*@(`"!1`__H"("`E
+M/`(``"1"````0/@)-`6<```"'@(``R$",&,`#P`#&0`\`@``)$(```"#("4`
+M0/@))`4`"(^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_\"OOP`XK[<`-*^V
+M`#"OM0`LK[0`**^S`"2OL@`@K[$`'*^P`!@`H*`E`,"H)0#@L"6/MP!0,)'_
+M_SP"```D0@```$#X"20$+O``0)@E$F`!-B00``("8)`E/`(``"1"```"8"`E
+M/`4``"2E&F``0/@))`82<*YT``RN=0`0KG8`%*9Q`<BF8`'*)`(`/Z9B`?RN
+M8`(`KF`NK*Y@+L@D`@<`KF(NT"0"__^N8B[4KF(NV*YB+MP\`@``)$(```)@
+M("4`0/@)```H)1!``1<D$``#ED,!R#0"\1L48@`./!```"80```"0"`E-`6B
+M``(`^`D``#`E`D`@)30%F'P"`/@))`8`&3P"```D0@```$#X"20$`^@\`@``
+M)$(```)`("4`0/@))`5`(#!#`/\``QD"KD,!S#!"``^F0@'0)&/__BQC``,0
+M8`#X)!``#3P"```D0@```D`@)0!`^`DT!9@8ID(!TCP"``$D0LDL`$#X"0)`
+M("400`#L)!``#HY"`<P`````+$(`!!1```@\`@``)$(```)`("4T!9@``$#X
+M"20&``<0```'/`(``"1"```"0"`E-`68``!`^`DD!@!'/`(``"1"````0/@)
+M)`0'T#P"``$D0L+0`$#X"0)`("6F0@'4,$(`\"0#`!`40P#.)!``#3P"```D
+M0@```D`@)20%`,$`0/@))Z8`$!!``,8D$``(EZ(`$``````L0C``%$``P200
+M``67H@`0`````*9B$G`\`@``)$(```)`("4`0/@))`5`$#!#`!@``QC")`(`
+M`A1B`+0D$``*/`(``"1"```"0"`E)`4`/P!`^`DGI@`0$$``K"00``B7H@`0
+M`````*9B$G(``*`E``"`)3P"```D40```D`@)28%`,`"(/@))Z8`$!!``)XF
+M$``!EZ(`$``````"@J`F+@(#0!1`__8"0"`E-`+__Q:"`)8D$``')`(`"J9B
+M$^8D`@`#IF(5\```@"4F8P`&)`0`"P`0$$``4!`A``(0@`!0$"$``A"``$,0
+M(:1$$^@F$``!+@(`"A1`__<`$!!```"`)3P"```D2BS0)FD``B9H``PD!@`+
+M)F<`"``0$$``4R@A`$H8(91D````````I*05^`!)&"&D9!7P`%`0(0`"$(``
+M4!`A``(0@`!(&"&D9A:H`$<0(:1&%A`F$``!+@(``Q1`_^X`$!!`/`(``"1"
+M```"0"`E`$#X"29E$G`00`!B)!``"(Y"`<P`````+$(`!!1``"$`````EF(2
+MB@`````00``=/!$``"8Q```"0"`E-`68``(@^`DD!D`'/!```"80```"`/@)
+M)`0'T#P"``$D0L+0`$#X"0)`("6F0@'6`D`@)30%F``"(/@))`8`!P(`^`DD
+M!`?0ED(!U@`````P0@#P)`,`(!!#``0D$``-$```/0````"F8!**/`(``"1"
+M```"0"`E)`4`OP!`^`DGI@`0$$``-"00``B7H@`0`````*9B$G2F0@((/`(`
+M`"1"``"N0@'`/`(``21"RWP`0/@)`D`@)3P"```D0@```$#X"0)`("4``*`E
+M``"`)206`!\\`@``)%4``"9Q``0"0"`E`M`H(P*@^`DGI@`0$$``&``0&$"7
+MH@`0``````*"H"$`<2`A``(2`J""+"@`@!@EDZ(`$0````"@8BPI)A```2X"
+M``,40/_M+H,``3P"``(T0O_]`H(0)BQ"``$`8A@E%&``!"00``D0```*`D`0
+M)200``@28``$/`(``"1"````0/@)`F`@)1+@``(``!`EKO```(^_`#B/MP`T
+MC[8`,(^U`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@GO0!`)[W_Z*^_`!2O
+ML``0`("`)3P"```D0@```$#X"28%$G`\`@``)$(```!`^`D"`"`EC[\`%(^P
+M`!`#X``()[T`&">]_Z"OOP!<K[X`6*^W`%2OM@!0K[4`3*^T`$BOLP!$K[(`
+M0*^Q`#ROL``X`("@)30"@`"OH@`0-`*8(*^B`!0\`E55-$)55:^B`"`\`JJJ
+M-$*JJJ^B`"0\`F9F-$)F9J^B`"@\`IF9-$*9F:^B`"P``+@E)Z(`$*^B`#`G
+MO@`8`!>`@(^C`#```````'`0(8Q2`````````H`@)3P#```D8P```&#X"0)`
+M*"4#T(`AK@(`````B"4`$10``%&`)0*`("4"0"@E/`(``"1"````0/@)`@`P
+M)0*`("4\`P``)&,```!@^`D"0"@E$%```R8Q``$0```P```0)2HB`0`40/_N
+M`!$4````B"4GLP`@/`(``"16```\`@``)%4````1$(`"8A`AC%`````````"
+M@"`E`D`H)0+`^`D"`#`E`H`@)0*@^`D"0"@E$@(``R8Q``$0```8```0)2HB
+M``040/_P`!$0@``7$("/I``P``````""&"$#PA`AC&4``(Q&```\`@``)$(`
+M``!`^`D"@"`E)O<``2KB``(40/^Y`!>`@#P"```D0@```$#X"20$`&0D`@`!
+MC[\`7(^^`%B/MP!4C[8`4(^U`$R/M`!(C[,`1(^R`$"/L0`\C[``.`/@``@G
+MO0!@,*7__S"B`0`00``&)`(3.*3"```D`A?4I.(```/@``@D`@`!,*(`@!!`
+M``L`````E((2B@`````00``'`````"0""0BDP@``)`(*K*3B```#X``()`(`
+M`0/@``@``!`E`^``""0"``$GO?_0K[\`**^S`"2OL@`@K[$`'*^P`!@`@)@E
+M`F"()0)@D"660P(()`(``11B``8F4`'@/`(``"1"```D!0`0`$#X"2>F`!"N
+M```$EB(2A@`````00``')`(``:X"``26(A)V`````!1```(D`@`#K@(`!)8B
+M$HH`````$$``!B0""0B.`@`$`````#1"``2N`@`$)`()"*8"`!`D`@JLI@(`
+M$B0"$SBF`@`,)`(7U*8"``Z.`@``/`.```!#$"4\`T``-&/```!#$"4D`P`*
+MI@,`""0#`("F`P`*)`/[_P!#$"0D`_W_`$,0)*X"``"6(A)Z`````!!```T\
+M`@``)$(```)@("4D!0`/`$#X"29&$D@00``&)`(``:Y"$DR.`@```````#1"
+M`0"N`@``)`(`#:X"`!0D`@`!KD(2:(^_`"B/LP`DC[(`((^Q`!R/L``8`^``
+M"">]`#```````````">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)0"@B"4\$```
+M)A```(XF``0"`/@)-`6`*`)`("6.)@`,`@#X"30%@"P"0"`ECB8`$`(`^`DT
+M!8`P`D`@)8XF``@"`/@)-`6`-`)`("6.)@```@#X"30%@""/OP`<C[(`&(^Q
+M`!2/L``0`^``"">]`"`GO?_0K[\`**^E`!2,@P'<)`(``1!B``DT`O__$&``
+M#3P"```D`@`&$&(`"20"``@48@`4)*(``30"__^OH@`</`(`!S1"__\0```-
+MKZ(`(#P"``",0@````````"B$",``A#`KZ(`'#P"``",0@````````"B$",`
+M`A#`KZ(`("2B``&OH@`8/`(!@#1"__\`PA`DKZ(`$#P"```D0@```$#X"2>E
+M`!"/OP`H``````/@``@GO0`P)[W_X*^_`!BOL0`4K[``$`"`B"4\$```)A``
+M`#0%@"@"`/@)```P)3P"```D0@```B`@)0!`^`DT!8`$/`,`!`!#$"4\!O_/
+M-,;__P(@("4T!8`$`@#X"0!&,"0"("`E-`6`(`(`^`DT!O__C[\`&(^Q`!2/
+ML``0`^``"">]`"`GO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``@(@E`*"0)99"
+M`!(`````$$``&P(@F"4\`@``)$(```!`^`DT!8`$/`8`$#P0```F$````B`@
+M)30%@`0"`/@)`$8P)0(@("661@`0`@#X"30%@"0"("`EED8`$@(`^`DT!8`X
+MCD8`%`(@("4T!8`P`@#X"0`&,,`0```//`(``#P"```D0@```B`@)0!`^`DT
+M!8`$/`;_[S3&__\\`P``)&,```(@("4T!8`$`&#X"0!&,"0\`@``)$(```(@
+M("6.1@```$#X"30%@"@\`@``)$(```(@("4`0/@)-`6`(#P#_X``0Q`DED,`
+M"@``````0S`EED(`&``````00``%)$(`!``"%``\`P!_`$,0)`#","4\$```
+M)A````(@("4"`/@)-`6`((YF+M`\`O__-$(`_P#","260@`:```````"$@`P
+M0O\``,(P):YF+M`"("`E`@#X"30%@!@\`@``)$(```(@("4`0/@))`5`!#P#
+M__\`0Q`DCD8`'``````DQO_]``8PP##&__\"("`E)`5`!`(`^`D`1C`EC[\`
+M((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_^BOOP`0/`(``"1"````0/@)
+M)`5`"``"$"N/OP`0``````/@``@GO0`8)[W_X*^_`!BOL0`4K[``$`"`B"4`
+MH(`E/`(``"1"````0/@))`4`P`!`("4D`O__%((``P``$"40``!!K@```#P"
+M`04T0MBZ`((8)#P"``@`@A`D$$``!*X#```\`D```&(0):X"```P@@`%$$``
+M!C""!<".`@```````#1"``&N`@``,((%P!!```8P@@`@C@(````````T0@!`
+MK@(``#""`"``````$$``"0````".(A)H`````!!```4\`T``C@(`````````
+M0Q`EK@(``(X"```\`T```$,0)!!``!<\$```KB024"80```"("`E`@#X"20%
+M`,2N(A)4`B`@)0(`^`DD!0#(KB(26`(@("4"`/@))`4`S*XB$EP"("`E`@#X
+M"20%`-"N(A)@`B`@)0(`^`DD!0#4KB(29"0"``&/OP`8C[$`%(^P`!`#X``(
+M)[T`((R"+#@``````^``"``````GO?_8K[\`)*^T`""OLP`<K[(`&*^Q`!2O
+ML``0`("8)0"@B"6.="PX``````:!``L"8(`E/`(``"1"```D!0`D`$#X"0``
+M,"4\`@``)$(```)@("4`0/@))`4`)#P"`04T0MBZ`B(P)#(B`$`00``5,B(`
+M`8X"+#P`````$$```@`````TQ@!`C@(L0``````00``"`````#3&`0".`BQ$
+M`````!!```(`````-,8`@(X"+$@`````$$```C(B``$TQ@0`$$```CP"0``T
+MQ@`'`B(0)!!```(\`@`(`,(P)3P"```D4@```F`@)0)`^`DD!0"@!B$`!:X1
+M+#@"8"`E)`4`)`)`^`DD!@`!`H`0)8^_`"2/M``@C[,`'(^R`!B/L0`4C[``
+M$`/@``@GO0`H`^``""0"`(`GO?_H,*/__RQB`(`00``*K[\`$``#&4`T!8@<
+M/`(``"1"````0/@)`&4H(3!#@``48``")`(``0``$"6/OP`0``````/@``@G
+MO0`8)[W_X*^_`!ROL@`8K[$`%*^P`!`PI?__+*(`@!!``"T`@)`E``6)0#0%
+MB``\$```)A````(E*"$"`/@)```P)30%B`0"0"`E`B4H(0(`^`D``#`E-`6(
+M"`)`("4")2@A`@#X"0``,"4T!8@,`D`@)0(E*"$"`/@)```P)30%B!`"0"`E
+M`B4H(0(`^`D``#`E-`6(%`)`("4")2@A`@#X"0``,"4T!8@8`D`@)0(E*"$"
+M`/@)```P)30%B!P"0"`E`B4H(0(`^`D``#`E$````B0"``$``!`EC[\`'(^R
+M`!B/L0`4C[``$`/@``@GO0`@)[W_V*^_`""OLP`<K[(`&*^Q`!2OL``0`("8
+M)0#`("4PI?__+*,`@!!@`"L``!`E$(``&@````"0D@`%```````2D@"0@@`$
+M``````)"D"60A@`#```````&-@"0@@`"```````"%```PC`ED((``0``````
+M`A(``,(P)9""`````````,(P)0`&,$(`$A?``,(P)1````,`$I!"``"0)0``
+M,"4`!8E`-`6(&#P0```F$````F`@)0(`^`D")2@A-`6('`)@("4")2@A`@#X
+M"39&@``D`@`!C[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_\BOOP`T
+MK[X`,*^W`"ROM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("P):^G`$2/
+MH@!(,+?__SP$JJH40``"-(2JJ@``("4NXP"`$&``B```$"60PP``)`(``1!B
+M``PH8@`"$$``!0`````08``*```0)1```'X`````)`(`!1!B`!8``!`E$```
+M>0`````0```3)!X`!93#``(`````+&,`!11@`'(`````E,(``@`````L0@`&
+M%$``"0``\"64P@`"`````"Q"``X40``$)!X``1````(D'@`#)!X`!Y#'``20
+MP@`%```````"$@``XC@ED,(`!@```````A0``.(X)9#"``<```````(6``#B
+M."4`Y#@FD,,`")#"``D```````(2``!BJ"4"I*@F,K7__Y#3``J0P@`+````
+M```"$@`"8I@ED,(`#````````A0``F*8)9#"``T```````(6``)BF"4"9)@F
+MD,,`#I#"``\```````(2``!BH"4"A*`F,I3__Y#2`!"0P@`1```````"$@`"
+M0I`ED,(`$@```````A0``D*0)9#"`!,```````(6``)"D"64P@`"`````"Q"
+M``X00``"`D20)C)2`/\`%XE`-`6(`#P0```F$````L`@)0(E*"$"`/@)`.`P
+M)30%B`0"P"`E`B4H(0(`^`D"H#`E-`6("`+`("4")2@A`@#X"0)@,"4T!8@,
+M`L`@)0(E*"$"`/@)`H`P)30%B!`"P"`E`B4H(0(`^`D"0#`E-`6(%`+`("4"
+M)2@A`@#X"0/`,"4\`@``)$(```+`("6/I@!$`$#X"0+@*"6/OP`TC[X`,(^W
+M`"R/M@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#@`````)[W_
+MZ*^_`!`D@RPL/`(``"1"````H"`E`&`H)0!`^`DD!@`&C[\`$``````#X``(
+M)[T`&">]_^BOOP`0/`(``"1"```DA"PL`$#X"20&``8D`@`!C[\`$``````#
+MX``()[T`&">]_^BOOP`0/`(``"1"````H"`E/`4``"2E+.``0/@))`8`!H^_
+M`!```````^``"">]`!@#X``(```0)2>]_^"OOP`<K[(`&*^Q`!2OL``0`("(
+M)0"@$"4`P)`E/!```"80```D!6```@#X"0!`,"4"("`E)`5@"`(`^`DD!@`!
+M/`(``"1"```"("`E)`5@#"0&``,`0/@))`<``A!```<"("`E/`(``"1"````
+M0/@))`5@!*9"```D`@`!C[\`'(^R`!B/L0`4C[``$`/@``@GO0`@,*7__Y2"
+M`@@`````$$4`!R0#``R4@A)R`````#!"`(`40``")`,`"R0#``,0P``"````
+M`*S#```#X``(```0)92"$H8`````$$``!@``&"64@A)V`````!1```(D`P`!
+M)`,`0Y2"$HH`````$$```@`````T8P`$`^``"`!@$"4GO?_@K[\`'*^R`!BO
+ML0`4K[``$`"`D"664!)(`````#(1`!P`$8B",A```@`0@"L\`@``)$(```!`
+M^`D"("@E/`(``"1"```"0"`E`$#X"30%F``\`P``)&,```)`("4T!9@``&#X
+M"31&(``\`@``)$(```)`("4`0/@)`B`H)0!0$"8\`P``)&,```)`("4"("@E
+M`&#X"0`","N/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_@K[\`&*^Q`!2O
+ML``0`("()0"@@"4\`@``)$(```!`^`DD!4`4`!"`0"0&``,"!C`$/`,``"1C
+M```"("`E)`5`%`!@^`D`1C`E)`(``8^_`!B/L0`4C[``$`/@``@GO0`@)[W_
+MX*^_`!BOL0`4K[``$`"`B"4`H(`E/`(``"1"````0/@))`5`%``0@$`D!@`#
+M`@8P!``&,"<\`P``)&,```(@("4D!4`4`&#X"0!&,"0D`@`!C[\`&(^Q`!2/
+ML``0`^``"">]`"`GO?_@K[\`'*^R`!BOL0`4K[``$`"`D"4`H(@E`,"`)3P"
+M```D0@```$#X"20%0!@D`P`!`B,8!``#&"<`0Q`D,A```0(P@`0\`P``)&,`
+M``)`("4D!4`8`&#X"0!0,"4D`@`!C[\`'(^R`!B/L0`4C[``$`/@``@GO0`@
+M)[W_Z*^_`!2OL``0`*"`)2X"``800``()`+__SP"```D0@```$#X"20%0!PP
+M0@`O`@(0!C!"``&/OP`4C[``$`/@``@GO0`8)[W_X*^_`!BOL0`4K[``$`"`
+MB"4`P(`E/`(``"1"````0/@))`5`%#P#__XT8W_\`$,P)!(```,TQH``/`(`
+M`0#","4\`@``)$(```(@("4`0/@))`5`%(XC+#@\!0$`/`(``"1"```"("`E
+M`$#X"0!E*"6/OP`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`8K[$`%*^P`!``
+M@(@E`*"`)3P"```D0@```$#X"20%0!`\`__Q-&/_GP!#$"0\`P``)&,LZ#(0
+M``<`$("``@.`(8X&```\`P``)&,```(@("4D!4`0`&#X"0!&,"6/OP`8C[$`
+M%(^P`!`#X``()[T`(">]_^"OOP`<K[(`&*^Q`!2OL``0`("`)3#2__\\`@``
+M)$(``"8$+#(`0/@))`8`!I(#+#*2`BPS```````"$@``8A@ED@(L-```````
+M`A0``&(8)9(&+#4```````8V`#P1```F,0```@`@)30%@`@"(/@)`&8P)9(&
+M+#:2`BPW```````"$@``PC`E,E(__P`2E``"`"`E-`6`#`(@^`D`TC`EC[\`
+M'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4
+MK[``$`"`H"4\$@``)E(```)`^`DT!8!,`$"8)0*`("4"0/@)-`6`4`!`@"4"
+M@"`E`D#X"30%@$P`4Y@K`A.`(0(`B"4``(`E`!&`````B"4`0!@E```0)0("
+M$"4"(Q@EC[\`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_HK[\`
+M$#P"```D0@```$#X"30%@$R/OP`0``````/@``@GO0`8)[W_Z*^_`!2OL``0
+M`("`)3P"```D0@```$#X"30%@"`\!@$`/`,``"1C```"`"`E-`6`(`!@^`D`
+M1C`EC[\`%(^P`!`#X``()[T`&">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`
+MF"4\`@``)$(```!`^`DT!9AD``*4PC)2`?\R0@$`$$```SP1```Z4@'_`!*0
+M)R8Q```"8"`E`B#X"30%@%``0(`E`F`@)0(@^`DT!8!,`@*`)@(2$":/OP`@
+MC[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_Z*^_`!2OL``0`("`)3P"```D
+M0@```$#X"20%0"`P0P#_``,9`C!$``^.`@',`````!1#``8``"@EE@(!T```
+M```41``#`*`0)20%``$`H!`EC[\`%(^P`!`#X``()[T`&">]_^"OOP`<K[(`
+M&*^Q`!2OL``0`("0)0"@@"4\$0``)C$```(@^`DT!8"0C@,`````````0Q`A
+MK@(```)`("4"(/@)-`6`C(X#``0``````$,0(:X"``0"0"`E`B#X"30%@)2.
+M`P`,``````!#$"&N`@`,`D`@)0(@^`DT!8"(C@,`"```````0Q`AK@(`"`)`
+M("4"(/@)-`6`F(X#`!```````$,0(:X"`!"/OP`<C[(`&(^Q`!2/L``0`^``
+M"">]`"`GO?_@K[\`'*^R`!BOL0`4K[``$`"`B"4`H(`E+@(`"11```@"()`E
+M/`(``"1"````0/@)-`7__P!0$"L00``$`B`@):Y0+M00```-```0)3P"```D
+M0@```$#X"0(`*"4\`P``)&,```(@("4D!1!P`&#X"0!`,"6N4"[4)`(``8^_
+M`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_^BOOP`4K[``$`"`@"4\`@``)$(`
+M``!`^`DD!1!P/`,``"1C```"`"`E`&#X"3!%__^/OP`4C[``$`/@``@GO0`8
+M)[W_V*^_`""OLP`<K[(`&*^Q`!2OL``0`("()0"@D"4"()@E/`(``"1"````
+M0/@))`4?_P!2$"L00``%`B`@)20"__^N8B[8$```%@``$"4\`@``)$(```!`
+M^`DT!8`4`$"`)3P"```D0@```B`@)0!`^`D"0"@E)`/@``(#@"0P0A__/`,`
+M`"1C```"("`E-`6`%`!@^`D"`C`EKG(NV"0"``&/OP`@C[,`'(^R`!B/L0`4
+MC[``$`/@``@GO0`H)[W_Z*^_`!2OL``0`("`)3P"```D0@```$#X"30%@!0\
+M`P``)&,```(`("4`8/@),$4?_X^_`!2/L``0`^``"">]`!B0@B[(`````#A"
+M``$#X``(,$(``2>]_^"OOP`<K[(`&*^Q`!2OL``0`("0)1"@`!("0(@E/`(`
+M`"1"````0/@)-`6`!#P0_O\V$/__/`,``"1C```"("`E-`6`!`!@^`D`4#`D
+MCB(NR```````4!`D$```$:XB+L@\`@``)$(```)`("4`0/@)-`6`!#P0`0`\
+M`P``)&,```)`("4T!8`$`&#X"0!0,"6.(B[(``````!0$"6N(B[()`(``8^_
+M`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_]BOOP`@K[,`'*^R`!BOL0`4K[``
+M$`"`B"4`H)`E`B"8)3P"```D0@```$#X"20%'_\`4A`K$$``!0(@("4D`O__
+MKF(NW!```!D``!`E/`(``"1"````0/@)-`6`%`!`@"4\`@``)$(```(@("4`
+M0/@)`D`H)3P#X``T8___`@.`)``"%``\`Q__`$,0)#P#```D8P```B`@)30%
+M@!0`8/@)`@(P):YR+MPD`@`!C[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`
+M*">]_^BOOP`4K[``$`"`@"4\`@``)$(```!`^`DT!8`4``(L`CP"```D0@``
+M`@`@)0!`^`DPI1__C[\`%(^P`!`#X``()[T`&`/@``@D`@`!`^``"``````#
+MX``(```0)0/@``@``````^``"``````GO?_HK[\`$#P"```D0@```$#X"30%
+MG!PP0@#_C[\`$``````#X``()[T`&">]_^BOOP`0/`(``"1"````0/@)-`6`
+M6#!"``>/OP`0``````/@``@GO0`8)[W_Z*^_`!`PI@`'/`(``"1"````0/@)
+M-`6`6(^_`!```````^``"">]`!B,@BZL``````/@``@`````)[W_Z*^_`!",
+MAA(T`````!3```,D`@`!$```!:R%+JP\`@``)$(```!`^`D`````C[\`$```
+M```#X``()[T`&">]_^@D`@`!%*(`":^_`!`LP@`"%$``"@``$"4D`P`%%,,`
+M!R0"``T0```%```0)3P"```D0@```$#X"0````"/OP`0``````/@``@GO0`8
+M)[W_X*^_`!@D`@`+%*(`"0"`&"4PY@`&K&8!^#P"```D0@```$#X"30%@$@0
+M```()`(``8^B`#``````KZ(`$#P"```D0@```$#X"0!@("6/OP`8``````/@
+M``@GO0`@)[W_X*^_`!B/H@`PCZ,`-`````"OH@`0/`(``"1"````0/@)KZ,`
+M%``"$"N/OP`8``````/@``@GO0`@```````````GO?_0K[\`+*^V`"BOM0`D
+MK[0`(*^S`!ROL@`8K[$`%*^P`!`0H``Q`("()3P"```D0@```$#X"20%0`0\
+M!O_\-,;__SP#```D8P```B`@)20%0`0`8/@)`$8P)#P"```D0@```$#X"20$
+M``HD$``*/`(``"12```\%@`!/`(``"15```\%/_\-I3__SP"```0```+)%,`
+M``*@^`DD!`#(`B`@)0)`^`DD!4`$`B`@)20%0`0"8/@)`%0P)"80__\2```(
+M`B`@)0)`^`DD!4`0`%80)!1`__``````%@```P`````0```/```0)3P"```D
+M0@```B`@)0!`^`DT!8`$/`;_^S3&__\\`P``)&,```(@("4T!8`$`&#X"0!&
+M,"0D`@`!C[\`+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`
+M,">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`B"4`H(`E/`(``"12```"0/@)
+M-`6`!#P&``0\`P``)',```(@("4T!8`$`F#X"0!&,"42```)`B`@)0)`^`DD
+M!4`$/`;__#3&__\"("`E)`5`!`)@^`D`1C`DC[\`((^S`!R/L@`8C[$`%(^P
+M`!`#X``()[T`*">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`B"4`H(`E/`(`
+M`"12```"0/@)-`6`!#P&``0\`P``)',```(@("4T!8`$`F#X"0!&,"42```)
+M`B`@)0)`^`DD!4`$/`;__#3&__\"("`E)`5`!`)@^`D`1C`DC[\`((^S`!R/
+ML@`8C[$`%(^P`!`#X``()[T`*">]_^"OOP`<K[(`&*^Q`!2OL``0`*"()0#`
+M*"4D$``!$C``#0"`D"42(``&/`(``20"``(2(@`.```0)1```!(`````)$+F
+M0`!`^`D`````$```"P!`@"4\`@`!)$+GC`!`^`D`````$```!JY1+J@\`@`!
+M)$+H'`!`^`D`````KE$NJ`(`$"6/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`G
+MO?_HK[\`$#P"```D0@```$#X"20%0`0``A0",$(``X^_`!```````^``"">]
+M`!@`````)[W_Z*^_`!0D`@`"$*(`$Z^P`!`LH@`#$$``!B0"``0D`@`!$*(`
+M!P``$"40```2`````!"B``8``!`E$```#@`````\`@``$```!B10```\`@``
+M$````R10```\`@``)%```#P"```D0@```$#X"0(`*"4"`!`EC[\`%(^P`!`#
+MX``()[T`&```````````)[W_Z*^_`!`\`@``)$(```!`^`DD!0`,C[\`$```
+M```#X``()[T`&">]_^BOOP`0`*`P)3P"```D0@```$#X"20%``R/OP`0````
+M``/@``@GO0`8)[W_Z*^_`!`\`@``)$(``"0%``@`0/@))`8`!(^_`!``````
+M`^``"">]`!@GO?_HK[\`%*^P`!``@(`E/`(``"1"```D!0`(`$#X"20&`"`\
+M`@``)$(```(`("4D!0`()`8`!`!`^`D``#@E``(0*X^_`!2/L``0`^``"">]
+M`!@GO?_HK[\`%*^P`!``@(`E/`(``"1"````0/@)-`6`2"0&_]\\`P``)&,`
+M``(`("4T!8!(`&#X"0!&,"2/OP`4C[``$`/@``@GO0`8)[W_Z*^_`!2OL``0
+M`("`)3P"```D0@```$#X"30%@$@\`P``)&,```(`("4T!8!(`&#X"31&`""/
+MOP`4C[``$`/@``@GO0`8)[W_X*^_`!ROL@`8K[$`%*^P`!``@(@E`*`0)0#`
+MD"4\$```)A```#0%@$`"`/@)`$`P)0(@("4T!8!$`@#X"0)`,"6/OP`<C[(`
+M&(^Q`!2/L``0`^``"">]`"`GO?_@K[\`&*^Q`!2OL``0`("()0"@@"4N`P!`
+M$&``(0``$"4N`@`@%$``$#P"```D0@```$#X"30%@$0F`__@)`8``0!F,`0`
+M!C`G/`,``"1C```"("`E-`6`1`!@^`D`1C`D$```#R0"``$D0@```B`@)0!`
+M^`DT!8!`)`8``0(&,`0`!C`G/`,``"1C```"("`E-`6`0`!@^`D`1C`D)`(`
+M`8^_`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_`!BOL0`4K[``$`"`B"4`H(`E
+M+@,`0!!@`!\``!`E+@(`(!1```\\`@``)$(```!`^`DT!8!$)@/_X"0&``$`
+M9C`$/`,``"1C```"("`E-`6`1`!@^`D`1C`E$```#B0"``$D0@```B`@)0!`
+M^`DT!8!`)`8``0(&,`0\`P``)&,```(@("4T!8!``&#X"0!&,"4D`@`!C[\`
+M&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`$#P"```D0@```$#X"30%@#R/OP`0
+M``````/@``@GO0`8)[W_Z*^_`!``H#`E/`(``"1"````0/@)-`6`/(^_`!``
+M`````^``"">]`!BHH``(N*``"S#"#_^HH@`,N*(`#XBC``R8HP`/`````!1F
+M`!(``!`E,.(`(!!```<`````B*(`#)BB``\`````-$(@`*BB``RXH@`/J*``
+M%+B@`!>(H@`4F*(`%P````"HH@`0N*(`$R0"``$#X``(`````">]_^"OOP`<
+MK[(`&*^Q`!2OL``0`,"0)8^Q`#@``````*"`)8H#`!2:`P`7`````#!C``$0
+M8`!A)`(`#XCB`!28X@`7`````#!"``$40``&/`(``"1"````0/@))`4`#!!2
+M`%8D`@`/B@(`$)H"`!,`````,$(/_Z8B``"*`@`4F@(`%P```````A/",$(?
+M_Z8B``*B(``$B@(`%)H"`!<`````,$(``A1``!X`````B@(`%)H"`!<`````
+M,$(`!!!```,D`@`!$```%J(B``2*`@`4F@(`%P`````P0@`0$$``!@````"2
+M(@`$`````#1"``@0```+HB(`!)(B``0`````-$(``J(B``2*`@`4F@(`%P``
+M```P0@#@``(10J(B``6*`@`0F@(`$P```````A3"HB(`!HH"`!2:`@`7````
+M`#!"`0`00``()`(`_XH"`!2:`@`7`````#!"?@```A)"$````J(B``>B(@`'
+MB@(`$)H"`!,```````(3PC!"``^B(@`(B@(`$)H"`!,```````(6PC!"``>B
+M(@`)B@(`$)H"`!,```````(3`C!"``&B(@`*```0)8^_`!R/L@`8C[$`%(^P
+M`!`#X``()[T`(```````````)[W_@*^_`'ROO@!XK[<`=*^V`'"OM0!LK[0`
+M:*^S`&2OL@!@K[$`7*^P`%@`@)`EKZ4`A`#`L"6OIP",`D"@):^@`$BOH`!,
+MKZ``4);"``(```````(1PC!#``&6P@`"`````#!"`0`00``%``"X)11@`Q`D
+M`P`,$```"`````"6P@`"```````"$<(X0@`!,$(``11``P<D`P`,EL(``@``
+M`````A&",$,``9;"``(`````,$(`(!!```4`````%&`"_"0#``P0```)/`(`
+M`);"``(```````(1@CA"``$P0@`!%$`"\R0#``P\`@``)$(```)`("4`0/@)
+M`L`H)0!`\"43P`+K)`,`#"0"``:/HP"$`````!!B``PL8@`'$$``!B0"``@L
+M8@`"$$`"X20#``P0```%`````(^D`(0`````%(("VR0#``R/H@",`````!!`
+M`"T\`@``)%````)`("4"`/@)-`6`3*^B`$P"0"`E`@#X"30%@%"OH@!0CD(!
+MS``````L0@`$%$``!@``B"4"0"`E`@#X"20%$4`0```.KZ(`$#P"```D50``
+M)[,`$``1@(`"0"`E`J#X"28%$4`"<(`AK@(``"8Q``$N(@`*%$#_^``1@("3
+MPP`$`````#!B``(40``",&(`_J/"``27P@`"`````*;"``*3P@`$`````*+"
+M``0\`@``)$(```)`("4`0/@)-`6`6`!`J"46H``"/!```"05``$F$````D`@
+M)0(`^`DT!8`$/`,"``!#$"2OH@!$`D`@)0(`^`DD!4`0/`,`_C1C`&``0Q`D
+MKZ(`0`)`("4"`/@))`5`%*^B`#@"0"`E`@#X"20%0!BOH@`\/`(``"1"``"6
+MQ0`"`$#X"0)`("400`*%)`,``Y;"``(`````,$,!\"0"`,`08@`8*&(`P1!`
+M``8D`@%`)`(`H!!B`!`D`@`#$```%``````08@`%)`(!4!!B``<D!``"$```
+M#@`````D`P`!KZ,`2!````HD%P`!KZ0`2!````<D%P`!KZ(`2!````0D%P`"
+M)`,`!*^C`$@D%P`"CD(!S``````L0@`$%$``"#P"```D0@```D`@)30%F```
+M0/@))`8`!Q````8`````)$(```)`("4T!9@``$#X"20&`$>.0@',`````"Q"
+M``040`!-/`(``9;#``(`````,&(`@!!``#0``(@EEH(2<``````L0C`!%$``
+M,#P"```P8@`@$$``!SP0``"6D1-L`````):3$W``````$```!B80``"6D1-N
+M`````):3$W(`````)A````(@("4"`/@))`4``P!`B"4"8"`E`@#X"20%``,\
+M!P``).=&S``7,(`DQ0$L`*<H(8RD```D`_\_`(,@)``1&8`P8P#``(,@):RD
+M```DQ@$X`,<P(8S$```D`__P`(,@)``1&((P8P`!``(00#!"``X`8A@E`(,@
+M):S$`````(@E/`(``"101LP\`@``)%,````1$$``41`A``(8@`!P&"$`5Q`A
+M``(0@`!0$"&,90``C$8```)@^`D"0"`E)C$``2XB`!P40/_S`!$00#P"``$D
+M0@B@`D`@)0!`^`D"P"@E``"()3P"```D4"T0/`(``"13````$1"``%$0(0`"
+M&(``<!@ACZ0`2```````1!`A``(0@`!0$"&,90``C$8```)@^`D"0"`E)C$`
+M`2XB`",40/_Q`!$0@```B"4\`@``)%`U)#P"```D4P```!$00`!1$"$``AB`
+M`'`8(0!7$"$``A"``%`0(8QE``",1@```F#X"0)`("4F,0`!+B(`0!1`__,`
+M$1!```"()3P"```D4"_,/`(``"13````$1#``%`0(8Q%````````CZ(`C```
+M```00``$)**``"Q"$``40``&```````1$,``4!`AC$8`!`)@^`D"0"`E)C$`
+M`2XB`*L40/_N`!$0P(Y"`<P`````+$(`!!!``!X\$0``)C$```)`("4"(/@)
+M-`6`'#P#``\T8___`$,0)#P&`=`\$```)A````)`("4T!8`<`@#X"0!&,"4"
+M0"`E)`4`7`(`^`D``#`E`D`@)30%F'@"`/@))`8`"`)`("4"(/@)-`6`2`)`
+M("4T!8!(`@#X"31&!`"/HP",`````!!@`"(\`@``)%````)`("6/I@!,`@#X
+M"30%@$P"0"`ECZ8`4`(`^`DT!8!0CD(!S``````L0@`$%$``!P``B"4"0"`E
+MCZ8`$`(`^`DD!1%`$```#@`````GL``0/`(``"13````$2B``@40(0)`("6,
+M1@```F#X"22E$4`F,0`!+B(`"A1`__@`$2B`DH,L+)*"+"T```````(2``!B
+M&"62@BPN```````"%```8A@EDH8L+P``````!C8`/`(``"10```"0"`E-`6`
+M``(`^`D`9C`EDH8L,)*"+#$```````(2``#","4"0"`E-`6`!(^B`$0"`/@)
+M`,(P)3P"``$D0BJ\CZ4`A`!`^`D"0"`E/`(``"11```"0"`E`B#X"20%0!`"
+M0"`E)`5`$(^C`$`"`/@)`$,P)0)`("6/I@`X`@#X"20%0!0"0"`ECZ8`/`(`
+M^`DD!4`8`D`@)30%@%@"`/@)`J`P)9*#+#*2@BPS```````"$@``8A@EDH(L
+M-````````A0``&(8)9*&+#4```````8V``)`("4T!8`(`@#X"0!F,"62@BPV
+MDH8L-P``````!C(``D`@)30%@`P"`/@)`$8P)0)`("6.AB[0`@#X"30%@!@"
+M0"`E)`4`@`(`^`DD!O__CD,!S"0"``048@`-/`(``)9"`=``````+$(``A!`
+M``<"0"`E`B#X"20%`!0"0"`E)`4`%`(`^`DT1@0`/`(``"1"```"0"`E`$#X
+M"0+`*"400`$()`,``R0"``:/I`"$`````!""`!@\`@`!CD("!``````P0@`#
+M$$``$CP"```D0@```D`@)0!`^`DT!9E$/`/?_S1C__\`0Q`DCD8"!``````P
+MQ@`!``8W0#P#```D8P```D`@)30%F40`8/@)`$8P)3P"``$D0@X8`D`@)0!`
+M^`D"P"@E/`(``21"`O`"0"`E`$#X"0/`*"400`#A)`,``Y9#`<@T`O$;%&(`
+M##P"``"6P@`"`````#!"`(`00``&/`(``"1"```"0"`E-`78"`!`^`DD!@4"
+M/`(``"1"```"0"`E-`68'`!`^`DD!@`!/`(``"1"```"0"`E`$#X"30%F10P
+M0S__EL(``@`````P0@`@$$``"0`#$(`\`[HN-&.+HP!#`!D``!`0````````
+M```0```'``(A`CP"S,PT0LS-`&(`&0``$!```B#"`````#P"```D0@```$#X
+M"22$`&0\`@``)$(```)`("4`0/@)-`688#P#```D8P```D`@)30%F&``8/@)
+M-$8``3P"```D0@```D`@)30%F&`D!@`!`$#X"0``."4\`@``)$(```)`("4`
+M0/@)`\`H)11```D`````EL,``@`````P8@`@%$```C1B``*FP@`"$```CR0#
+M``..@BZP`````!!```D\`@``)$(```)`("4T!9D@/`8``0!`^`DTQO``)`(`
+M`:Z"+K0``(`E)!,``3P"```D40```!`H@`)`("4DI1```B#X"0(3,`0F$``!
+M*@(`"A1`__@\`@````"`)211```"0"`E`B#X"0(`*"4F$``!*@(`"A1`__L"
+M0"`E/`(``"10```D!0"D/`8``0(`^`DTQ@`!`D`@)20%`*@"`/@))`8``0)`
+M("4D!0"L`@#X"20&``$\`@``)%$```)`("4"(/@))`40L`)`("4D!1"P`@#X
+M"0!`,"4"0"`E)`4`H#P&``@"`/@)-,8)93P"``@T0@EEKH(L.`)`("4"(/@)
+M)`4`K#P&``<"0"`E)`4`K`(`^`D`1C`E)`(`!H^C`(0`````%&(`"P)`("4"
+M(/@))`4`H`)`("4D!0"@`@#X"31&$`".@BPX`````#1"$`"N@BPXCD(23```
+M```00``$/`(``"1"````0/@)`D`@)3P"```D0@```D`@)0!`^`DT!8`@/`;^
+M?S3&__\\`P``)&,```)`("4T!8`@`&#X"0!&,"2.A2[4)`+__Q"B``0\`@``
+M)$(```!`^`D"0"`ECH4NV"0"__\0H@`$/`(``"1"````0/@)`D`@)8Z%+MPD
+M`O__$*(`!#P"```D0@```$#X"0)`("6.1@'X`````!#```4"0"`E/`(``"1"
+M````0/@)-`6`2(^D`(0`````KD0!W!````@D`@`!CZ0`D`````",@@``````
+M`!!```(``!`EK(,``(^_`'R/O@!XC[<`=(^V`'"/M0!LC[0`:(^S`&2/L@!@
+MC[$`7(^P`%@#X``()[T`@">]_^BOOP`0/`(``21"`=@`0/@))`4``H^_`!``
+M`````^``"">]`!@GO?_HK[\`%*^P`!``@(`E/`(``"1"`````"@E`$#X"20&
+M``$00``-`````#P"``$D0@'8`@`@)0!`^`DD!0`3$$``!@`````\`@``)$(`
+M``!`^`DD!`@T)`(``8^_`!2/L``0`^``"">]`!@GO?_@K[\`&*^Q`!2OL``0
+M`("()3"P__\\`@``)$(`````*"4`0/@))`8``1!``'PR`P'P)`(`P!!B`"LH
+M8@#!$$``""0"`4`D`@"@$&(`$B0"`+`08@`0/`(``1```%LD0@'8$&(`-RAB
+M`4$00``&)`(!4"0"`-`08@`;/`(``1```%(D0@'8$&(`+CP"``$0``!.)$(!
+MV#P0```F$````B`@)30%F`0"`/@)```P)0(@("4T!:(``@#X"20&``,"("`E
+M-`68?`(`^`DD!@`9/`(``"1"````0/@))`0!+!```#D\`@`!/`(``"10```"
+M("`E-`68!`(`^`D``#`EEB,!R"0"`!(48@`N`B`@)30%F'P"`/@))`8`&#P"
+M```D0@```$#X"20$`2P"("`E-`6B``(`^`DD!@`"$```(CP"``$R`@`0$$``
+M"#P"```D0@```B`@)30%F`0`0/@))`8``Q````8`````)$(```(@("4T!9@$
+M`$#X"0``,"66(P'()`(`$A1B``X\$```)A````(@("4T!9A\`@#X"20&`!@\
+M`@``)$(```!`^`DD!`$L`B`@)30%H@`"`/@)```P)3P"``$D0@'8`B`@)0!`
+M^`DD!0`3$$``$0`````\`@``)$(```!`^`DD!`@T/`(``"1"```"("`E```H
+M)0!`^`DD!@`!$$``!0(@("4\`@`!)$(!V`!`^`D``"@EC[\`&(^Q`!2/L``0
+M`^``"">]`"`GO?_(K[\`-*^^`#"OMP`LK[8`**^U`"2OM``@K[,`'*^R`!BO
+ML0`4K[``$`"`F"4`H+@E`,#P)3P"```D0@```$#X"0)@L"4`0*`E$H``;```
+M``".PBZT`````!!``#<\`@``)%4```)@("4"H/@)-`69(#P#``$`0Q`D%$``
+M+P)@("6NP"ZT`J#X"30%G!``0)`E`F`@)0*@^`DT!9P4`$"`)0)@("4"H/@)
+M-`6<&`!`,"4`$B("`!`2`@""("$`$"F"``00*P`%&"L`0Q`D$$``&@`&B","
+M)``:```0$A2```(```````<`#3!1`#\"10`:``"`$A2@``(```````<`#280
+M_\`R$``?`F`@)0*@^`DT!9D@`!$90`!#$"4`4!`E/`,``"1C```"8"`E-`69
+M(`!@^`DT1@@`/`(``21"!E@"8"`E`$#X"0*`*"440``*`````);C``(`````
+M-&,``J;C``*6@P`"`````#!C__T0```BIH,``CP"```D4````F`@)0(`^`D"
+M@"@E%$``$SP"``$\`@``)$(```!`^`DD!!.(`F`@)0(`^`D"@"@E%$``"CP"
+M``&6XP`"`````#!B`"`40``#`````#1B``*FX@`"$```"0``$"4D0B;4`$#X
+M"0)@("6.PBZT`````"Q"``&OP@``)`(``8^_`#2/O@`PC[<`+(^V`"B/M0`D
+MC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`.">]_]"OOP`HK[,`)*^R`""O
+ML0`<K[``&`"`B"4`H(`E%@```Z^P`!`D`O__KZ(`$#P"```D0@```B`@)0!`
+M^`DD!0`,/`(``"13```"("`E)`5```)@^`D"`#`E/`(``"1"````0/@))`0`
+M#S(0``./H@`0`````#!"``.OH@`0/`(``"1"```"("`E)`5``(^F`!``0/@)
+M`@`X)0!`D"4R`@`!%$``%0)`$"4D`@`5KZ(`$).G`!`GHP`0D&(``0``````
+M`A(``.(X)9!B``(```````(4``#B."609@`#```````&-@`"("`E)`4`%`)@
+M^`D`YC`E`D`0)8^_`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`#`GO?_8K[\`
+M)*^T`""OLP`<K[(`&*^Q`!2OL``0`*"8)3P"```D0@``EF4``)9F``(`0/@)
+M`("@)0`"%````B0#EF(``@`````P0@"`$$``%``$@$`"!(`A`!"`@#P"```D
+M0CD(`@*`(3P"```D0@``C@0`!`!`^`DD!0`(,%(`_P`2D4".`@`````````"
+M$0"&!``(`````!````("0I`E``"0)2B"`)$00``$/`(``#""``$00``(/`(`
+M`"1"```DA/_H`$#X"20%``@P40#_$```"R0"``$DA/_H``07P@""("$\`@``
+M)$(````$($,`0/@))`4`"#!1`/\``!`E`!&(@``"$$`"(H@E-C$$`3)&`/\`
+M!C(`,B(`_SP0```F$````H`@)30%F)P"`/@)`,(P)0`1B@(R0O\`,B8`_P*`
+M("4T!9C0`@#X"0!&,"6NDQ(T)`(``8^_`"2/M``@C[,`'(^R`!B/L0`4C[``
+M$`/@``@GO0`H)[W_Z*^_`!`\`@``)$(```!`^`DT!9AD``(4PC!#`?\P8@$`
+M$$```CAB`?\``A@G`&`0)8^_`!```````^``"">]`!@GO?_8K[\`)*^T`""O
+MLP`<K[(`&*^Q`!2OL``0`("@)3"S`/\`!HP``!&,`SP2```F4@```D#X"30%
+MF&0D`_```$,0)``3&D`P8PX``$,0)3(Q`?\\$```)A````*`("4T!9AD`@#X
+M"0!1,"4"@"`E`D#X"30%F&`"@"`E-`688`(`^`DT1@`"$F``!"01`#@`$Q#`
+M`%,0(P`"BD```(`E/`(``"13```\`@``$```!"12```"0/@)`B`@)280``$J
+M`@`\$$``"0`````"@"`E`F#X"30%F&`P0@`"%$#_]2H"`#P40``#`````!``
+M``4``!`E/`(``21"!&@`0/@)`H`@)8^_`"2/M``@C[,`'(^R`!B/L0`4C[``
+M$`/@``@GO0`HE*(``@`````P0P'@)`(`P!!B`!0`````*&(`P1!```8D`@%`
+M)`(`H!!B``H``````^``"```$"4`````%&(`#0````"4@A+,`````!````ND
+MP@``E((2S@`````0```'I,(``)2"$M``````$````Z3"```#X``(```0)20"
+M``$#X``(`````">]_]BOOP`@K[$`'*^P`!@`@(@E`*"`)3P"``$D0@70`$#X
+M"2>F`!`00``9`````#P"```D0@```B`@)0!`^`DT!9A@/`(``21"!&@`0/@)
+M`B`@)0!`&"6'H@`0``````!#$"H00``%`````)8"``(`````-$(``J8"``*F
+M`P`6AZ(`$```````0Q`J.$(``8^_`""/L0`<C[``&`/@``@GO0`H)[W_T*^_
+M`"ROM``HK[,`)*^R`""OL0`<K[``&`"`D"6.0@',`````"Q"``000``F`*"(
+M)3P"```D0@```$#X"0`````00``@/`(``21"!=`"0"`E`B`H)0!`^`DGI@`0
+M$$``)0``@"4\`@``)%0Z3#P"``$D4P2L`A00(0)`("6010```F#X"0``,"4`
+M0!@EAZ(`$```````0Q`J$$```P`````0```"IB``%J8C`!8F$``!+@(``Q1`
+M_^\N`@`$$```#0`````\`@``)$(```)`("4`0/@)-`688#P#```D8P```D`@
+M)30%F&``8/@)-$8``B0"``&/OP`LC[0`*(^S`"2/L@`@C[$`'(^P`!@#X``(
+M)[T`,#P"``"4HP``E$(Z4```````0Q`K%$``#```("4\`@``)$,Z4)2E```D
+MA``!``00@`!#$"&40@````````!%$"L00/_Y`````#P"```D0CI0``08@`!#
+M$"&40P`"```````#'````Q0#/`15532$558`1``8```0$``#'\,`0Q`C``(4
+M``/@``@``A0#)[W_P*^_`#ROO@`XK[<`-*^V`#"OM0`LK[0`**^S`"2OL@`@
+MK[$`'*^P`!BOI`!``("@)92D``(`````,((`@"Q"``$D`P`"`&(8(S"$`>`D
+M`@#`$((`;J^C`!`H@@#!$$``!B0"`4`D`@"@$((`7@``$"40``#0`````!2"
+M`,X``!`EE*(````````D0O!?+$($ZQ!```<`````EI435`````"6EA-6````
+M`!```",`````E*(````````D0NMT+$(`\!!```<`````EI436`````"6EA-:
+M`````!```!<`````E*(````````D0NJ$+$(`X1!```<`````EI437`````"6
+MEA->`````!````L`````E*(````````L0A9=``"P)11```4``*@EEI438```
+M``"6EA-B`````):0$M@`````EIX2W@`````OUP`!/`8``"3&1:"/H@`0````
+M```"*(`DI``\`(8@(8R#```\`N__-$+__P!B&"26@A/,```````"%P``8A@E
+MK(,``"2D`$@`AB`AC(,``#P"^_\T0O__`&(8)):"$\X```````(6@`!B&"6L
+M@P``)*4`_`"F*"&,HP``)`+_]P!B&"26@A/*```````"$,``8A@E$```%*RC
+M``"6E1-D`````):6$V8`````EI`2V@````"6GA+@`````!````HOUP`!EI43
+M:`````"6EA-J`````):0$MP`````EIX2X@`````OUP`!/!(``"92```"`"`E
+M`D#X"20%``0\$P``)G-%H(^C`!````````.(@"8E`(0`LR@AC*0``"0#_S\`
+M@R`D``(1P``7&8``0Q`E,$(`P`""("6LI````@`@)0)`^`DD!0`$)C``D`(3
+M@"&.`P``)`3_^`!D&"0``A!",$(`!P!B&"6N`P```J`@)0)`^`DD!0`#C@,`
+M`"0$_W\`9!@D``(1P#!"`(``8A@EK@,```*@("4"0/@))`4``R8P`)P"$X`A
+MC@,``"0$__P`9!@D``(00C!"``,`8A@EK@,```+`("4"0/@))`4``XX#```D
+M!/_C`&08)``"$(`P0@`<`&(8):X#```F,0#,`C.((8XC```D`O_W`&(8)``>
+M$,`P0@`(`&(8):XC`````(`E`F"()3P"```D4@```!`00`!0$"$``AB``'$8
+M(8^D`!```````$00(0`"$(``41`ACZ0`0(QE``",1@```D#X"280``$N`@`9
+M%$#_\0`0$$"N@"[`)`(``8^_`#R/O@`XC[<`-(^V`#"/M0`LC[0`*(^S`"2/
+ML@`@C[$`'(^P`!@#X``()[T`0">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)93"
+M``(`````,$,!X"0"`,`08@`/`D`X)2AB`,$00``&)`(!0"0"`*`08@`'```0
+M)1```$L`````%&(`20``$"40```$```8)1````(D`P`!)`,``@`#&$`DY``$
+M`&00(91&$N:40A+L```````"$8``PC`E`&00(91"$O(```````(3``#","4`
+M9!`AE$(2^````````A2``,(P)0!D$"&40A+^```````"%@``PC`E`&00(911
+M$P240A,*```````"$8`"(H@E`&00(91"$Q````````(3``(BB"4`9!`AE$(3
+M%@```````A2``B*()0!D&"&48A,<```````"%@`"(H@E)`(``1"B``<`````
+M$*``""0"``(0H@`%```0)1````\`````$````@#`B"4"(#`EK.4NK#P0```F
+M$````D`@)0(`^`DT!9E@`D`@)30%F60"`/@)`B`P)20"``&/OP`<C[(`&(^Q
+M`!2/L``0`^``"">]`"`GO?_(K[\`-*^^`#"OMP`LK[8`**^U`"2OM``@K[,`
+M'*^R`!BOL0`4K[``$`"`L"6OI0`\E*(``@`````P0P'@)`(`P!!B`"$"P+@E
+M*&(`P1!```8D`@%`)`(`H!!B`!D``!`E$```XP`````48@#A```0)0``\"4\
+M`@``)$(```+`("4`0/@)-`691"0#_\<`0Q`DEN83T```````!C#`,,8`.#P#
+M```D8P```L`@)30%F40`8/@)`$8P)1````0`````$````B0>``$D'@`"CL(!
+MS``````L0@`$$$``#3P"```D0@```L`@)0!`^`DT!9D0/`,``"1C```"P"`E
+M-`69$`!@^`DT1@`#$```(SP3```D0@```L`@)0!`^`DT!9D0)`/\!@!#$"0`
+M'HA`)O(`!`(R&"&48Q+@```````#&0``0Q`E/!```"80```"P"`E-`69$`(`
+M^`DT1@`!/`(``"1"``".Y2ZLCZ8`/`!`^`D"P"`E`C*((98F$L@`````,,8!
+M_P+`("4T!9EH`@#X"33&`@`\$P``)G,```+`("4"8/@)-`681"0#P'\`0Q`D
+M`!Z00";T``("5!@AE&82H```````!C'`,,8_@#P1```F,0```L`@)30%F$0"
+M(/@)`$8P)0+`("4"8/@)-`682#P#__PT8P__`$,0)"95$J@"]1@AE&8`````
+M````!C,`/`,``S1C\```PS`D`L`@)30%F$@"(/@)`$8P)0+`("4"8/@)-`68
+M4#P#__\`0Q`D`]<8(9!C$LD```````,:``!#$"4F\``&`]`8(9!F$L`"P"`E
+M-`684`(@^`D`1C`E`E2@(9:"$K@```````(V```"%```PC`E`E<0(91#$L``
+M``````,2``#","4"P"`E-`68-`(@^`D`PS`E`L`@)0)@^`DT!9@H/`/__S1C
+M`/\`0Q`D`A6`(98&``````````8R``+`("4T!9@H`B#X"0!&,"4"P"`E`F#X
+M"30%F&0\`__X-&,/_P!#$"0"5Y`AED82M```````!C,`/`,`!S1C\```PS`D
+M`L`@)30%F&0"(/@)`$8P)9;B$G``````+$(P`Q!```XD$``"EL,!RB0"$"(4
+M8@`;/`(``(^C`#P`````E&(``@`````P0@!`$$``%#P"```0```2)!``"(^C
+M`#P`````E&(````````P0@`?``(8*R1"__8L0@`-.$(``0!B&"008``%`!X0
+M0`!7$"&40A,F``````("@"$\`@``)$(```+`("4`0/@)-`69)"0#_P$`0Q`D
+M`!`P0##&`/<\`P``)&,```+`("4T!9DD`&#X"0!&,"4D`@`!C[\`-(^^`#"/
+MMP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`X)[W_Z*^_
+M`!``H#`E+,(`0!1```(`P!@E)`,`/Z2#`?P\`@``)$(```!`^`DT!9D\)`(`
+M`8^_`!```````^``"">]`!@GO?_`K[\`/*^T`#BOLP`TK[(`,*^Q`"ROL``H
+M`("@)0"@F"668@`"`````#!#`>`D`@#`$&(`%@*`@"4H8@#!$$``!B0"`4`D
+M`@"@$&(`&P``$"40``!3`````!1B`%$``!`EE@(3Y@````"GH@`<)@(3TJ^B
+M`!@F`A/HKZ(`()82%TH`````$```%B81%TR6`A7P`````*>B`!PF`A7RKZ(`
+M&"8"%A*OH@`@EA(7G``````0```+)A$7GI8"%?``````IZ(`'"8"%?BOH@`8
+M)@(6KJ^B`""6$A>\`````"81%[X\`@`!)$(41`*`("669@```$#X"2>E`!@\
+M`@``)$(```*`("4`0/@)`F`H)0!`("4``!@EE@(3=``````00``8```H)98"
+M$W8`````$$``!0`````41``#`````!```!`F!1?4)&,``98"$W0``````&(0
+M*A!```H``Q!``%`0(91"$W8`````$$#_]@`````41/_T``,1@`("$"$D11?4
+MK[,`$#P"``$D0AET`H`@)0(@,"4`0/@),D?__R0"``&/OP`\C[0`.(^S`#2/
+ML@`PC[$`+(^P`"@#X``()[T`0">]_\"OOP`\K[X`.*^W`#2OM@`PK[4`+*^T
+M`"BOLP`DK[(`(*^Q`!ROL``8KZ0`0*^E`$0PUO__``"X)20>`#\\$```)A``
+M`#P$```DA`"0`@#X"20%`0@\!```)(0`$`(`^`DD!0"`/`(``"15`)@FLP"`
+M)!(``0``B"4`$1!``%40(:12```F0@`!,%+__R8B``$P4?__+D(`0!1`__@`
+M$1!`/`(``"1"`)"D40`&)`,``:1#``(D`P`_I$,`!)1"``8`````$$``%```
+MB"4\`@`!)%0@6#P"```D4@"0`!&`0`(5$"&410``CZ8`1`*`^`D"P"`E`A.`
+M(:8"```F(@`!,%'__Y9"``8``````B(0*Q1`__,`$8!`AF8````````\`@``
+ME$,`E@```````Q!``F(0(81'__X`````$&``(@``B"4\`@``)$@`D``1$$``
+M4Q`AA$,`````````PQ`J%$```P``````8#`E`B"X)94"``8``````%$0(R1"
+M__\P4O__$D``$``2$$`"8B`AA(/__I2%``"$@@````````!#$"H00``")B(`
+M`:2%__XP4?__E0(`!@`````"(A`K%$#_XP`1$$`\`@``E$(`E@`````00``1
+M``"()3P"``"41`"6```````1$$``4Q`AA$,`````````XQ`J$$```R8B``$`
+M8#@E`B#P)3!1__\")!`K%$#_]0`1$$`DP@`9/`11ZS2$A1\`1``8```8$``#
+M&0,``A?#`&(8(P`#$$``0Q`A``(0P`!#$"$``A1```*$`P``B"4"!``8```@
+M$``$(0,``A?#`((@(R2$``$8@``2``"0)3P"```D10`0```0$``"$0,`$!_#
+M`$,0(R1$``$"(!@E)B(``3!1__\``QA``&48(29"``$P4O__`D00*A1`__>D
+M=P``/`(``)1"`)8```````(00`)B$"&$0O_^``````("$"H00`!<``"0)3P"
+M```D5`"0/`(``217(L0\`@``)%8`$"8"`#(``A0```*$`Y:"``8```````(0
+M0`)B$"&$0O_^``````("$"H00``E`!(80``2$$``4Q`AA$,````````"`Q@C
+MA$(``@`````"`A`C`&(`&```&!(88``9`!(80#P"``"40@"6```````"$$`"
+M8A`AA$+__@`````"`B`J)D(``1"```TP4O__`!(00`!3$"&$0P````````(#
+M&".$0@`"``````("$",`8@`8```8$AQ@__,F0@`!`!(80`!S$"&410``E$8`
+M`@!U&"&49P`````````'.$"48@`"```````"$$`P0O__KZ(`$*^@`!0R!/__
+M`N#X"3#G__\D0@`!,$+__P`1&$``=A@A``(00J1B```P0O__`\(0*Q!```(F
+M(@`!I'X``#!1__^6@@`&```````"$$`"8A`AA$+__@`````"`A`J%$#_K28"
+M`#(N(@!`$$``#3P"```D1``0`!$00`!$&"$`8!`EE$+__@````"D8@``)B(`
+M`3!1__\N(@!`%$#_]P`1$$`T$*&```"0)3P"```D40`0/`(``"13````$AB`
+M`'$0(91"``(```````(2`#1"`/\``A0``'$8(91F``````````8R`#3&`/\P
+MQO__CZ0`0`(`*"4"8/@)`$8P)29"``$P4O__+D(`(!1`_^LF$``$C[\`/(^^
+M`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@GO0!`)[W_
+MF*^_`&2OO@!@K[<`7*^V`%BOM0!4K[0`4*^S`$ROL@!(K[$`1*^P`$"OI`!H
+M`*"P)0#`F"4P_O__KZ0`+```D"4``+@E``"@)20"`#^OH@`PKZ``.(^C`'@`
+M````@&(`!0```````A!`,$+__Z^B`#248@`"`````#!"`0`00``%``"H)8"&
+M$HX`````$```!CP"``"/I``L`````("&$H\`````/`(``"1"``"/I`!HCZ4`
+M>`!`^`D```````(6```"%@,2P`!*KZ(`/);"````````$$``%```@"4GI``8
+M`!`80`"#&"$`$!#``%80(91"````````I&(``"8"``$P4/__+@(`"!!```@"
+M`(@E`!`0P`!6$"&40@```````!1`__``$!A``@"()8^E`'@`````E*0``">B
+M`"JOH@`0/`(``21")!0GI0`8`@`P)0!`^`DGIP`H$B``$```@"67HP`HEZ(`
+M&``````08@`,)@(``2>D`!@P4/__`A$0*Q!```8`$!!``((0(91"````````
+M%&+_^"8"``&7HP`HEZ(`*@`````48@`'`!`0P(^F`'@`````E,(````````0
+M8@`&`!`0P`!6$"&,0@`$`````!!```8``````!`0P`!6$"&40@`"`````*^B
+M`#`3P``0``"`)2>D`!@`$!A``(,8(0`0$(``4!`A``(00`!3$"&40@`(````
+M`*1B```F`@`!,%#__P(>$"L40/_T`!`80(^B`'@`````E$0``">B`"JOH@`0
+M/`(``21")!0GI0`8`\`P)0!`^`DGIP`H``"`)9>E`"B7I``J$````B>C`!@P
+M4/__`AX0*Q!```T`$!!``&(0(91"````````%*(``@`0$$`"`)`E`&(0(91"
+M````````%(+_\B8"``$"`*`E``"`)8^C`'@`````E&(``@`````P0@!`$$``
+M#"X"``440``5`!(0@"0"``42`@`?)`(`!A("`"LD`@`'%@(`0P`2$(`0```W
+M`%(0(2X"``@00``^/`(``"1".H@`$!B``&(8(8QB`````````$``"```````
+M$A"``%(0(0`"$$``4Q`AE%<`!@``````%!"``%00(0`"$$``4Q`AE%4`!@``
+M```0```I```````2$(``4A`A``(00`!3$"&45P`$```````4$(``5!`A``(0
+M0`!3$"&450`$`````!```!L``````!(0@`!2$"$``A!``%,0(917``(`````
+M`!00@`!4$"$``A!``%,0(915``(`````$```#0``````$A"``%(0(0`"$$``
+M4Q`AE%<`````````%!"``%00(0`"$$``4Q`AE%4```````"/I0!X`````)2D
+M``"7I0`HEZ8`*J^U`!"OH``4/`(``21"(L0`0/@)`N`X)0!`("6/I@`P````
+M``"&$"L00``"`,`8)0"`&"4P9/__CZ,`>`````"48@`"`````#!"`!`00``1
+M`!`00(^E`"P`````E*(2<``````L0C`!%$``"@`0$$"4HQ)^`````#!B__\`
+M@A`K$$```@``````@!@E,&3__P`0$$`\!@``),8```!&*"&/H@`TCZ8`/```
+M````1A@C`(,0*A!```(``````(`8)18``!>DHP``/`,``"1C.GB/I`!H````
+M`(R"`@````````(00`!#$"&40P`````````#&$`\!0``)*4``)2B````````
+M`$,0(P`"%````A0#'$```Z^B`#@D!@`!KZ8`.``0$$`\`P``)&,```!#*"&4
+MI```CZ,`.```````@Q`J$$```B8"``$`@!@E,%#__RX"``@40/]3I*,``#P$
+M```DA```E((``(^E`"P`````K*(NQ"0&``$PT0```!&'@)2&``8`````,,8`
+M/P`&-@`"!C`E`!&E@`#4,"64@@`$`````#!"`#\``A0``,(P)0`1FX``TS`E
+ME((``@`````P0@`_``(2``#","4`$8F``-$P)92"````````,$(`/SP2```F
+M4@``CZ0`:#0%F30"0/@)`,(P)3P#```D8P``E&(`#@`````P0@`_``(6``("
+M@"4"%(`EE&(`#``````P0@`_``(4``("@"4"$X`EE&(`"@`````P0@`_``(2
+M``("@"4"$8`EE&8`"``````PQ@`_CZ0`:#0%F3@"0/@)`@8P)3P"```D0@``
+MCZ0`:#P&```DQ@``E,4```!`^`D`````/`,``"1C``"48@``CZ0`:`````"D
+M@@'^C[\`9(^^`&"/MP!<C[8`6(^U`%2/M`!0C[,`3(^R`$B/L0!$C[``0`/@
+M``@GO0!H)[W_J*^_`%"OMP!,K[8`2*^U`$2OM`!`K[,`/*^R`#BOL0`TK[``
+M,`#`J"4PE___,+;__SP"``$D0B(4`N`@)0+`*"4`0/@))Z<`&!!```0"X"`E
+MEZ(`&!```$T`````EJ8`!">B`!ROH@`0/`(``21")!2.I0```$#X"2>G`!J7
+MI0`:)Z(`(*^B`!`\$``!)A`E<`+`("4"H#`E`@#X"2>G`!Z7I0`<)Z(`)*^B
+M`!`"P"`E`J`P)0(`^`DGIP`B)[,`)CP0``$F$"(4EZ0`&I>E`!X"H#`E`@#X
+M"0)@."4GL@`HEZ0`&I>E`"`"H#`E`@#X"0)`."67I0`>EZ8`()>G`":7H@`H
+M`````*^B`!"OH``4/!$``28Q(L0"(/@)`L`@)0!`H"67I``<EZ4`(@*@,"4"
+M`/@)`F`X)9>D`!R7I0`D`J`P)0(`^`D"0#@EEZ4`(I>F`"27IP`FEZ(`*```
+M``"OH@`0KZ``%`(@^`D"P"`EEZ4`&I>F`!ROH@`0KZ``%`+@("4"(/@)`H`X
+M)8^_`%"/MP!,C[8`2(^U`$2/M`!`C[,`/(^R`#B/L0`TC[``,`/@``@GO0!8
+M,(3__S"E__^,R``(`````)3"``0`````$$``(P``4"65`@```````!1$`!DE
+M0@`!)0D`")4"``8`````$$``$P``&"4E"P`&E2(````````410`'``,00`!+
+M$"&40@`8`````*3B```#X``()`(``21B``$P0___E0(`!@``````8A`K%$#_
+M\"4I``(E0@`!,$K__Y3"``0``````4(0*Q1`_]\E"``T`^``"```$"6/J@`4
+M,(3__S"E__\PQO__,.?__Y>H`!(`````)`D`9`#H`!@``!@2$&``1P``$"41
+M0``"`````"0)``$0Q0`Y`(40(P`"&$``8A@A``,8P`!B&"$``QB``,40(P!B
+M`!H``!@2%$```@``````!P`-``,<```#)`,$@0`-`````!%```@`X!`E``<0
+M0`!'$"$``A#``$<0(0`"$(`0```",$+__S!"__\0```F`$`8)2B"`&440``-
+M`(@`&!%```@!`!`E``@00`!($"$``A#``$@0(0`"$(`0```",$+__S!"__\0
+M```7`$`8)0``&!(D`@!D`$00(P!'`!@``!`2`&(8(0``````:0`:```8$A4@
+M``(```````<`#1````DP8___$4``!P#@&"4``Q!``$,0(0`"$,``0Q`A``(0
+M@#!#__\`8!`E`^``"`````"/J@`0,,;__P`&$$``HA`AE$C__@`````PA/__
+M``000`!$$"$``A#``$00(0`"(("4HP`````````#$$``0Q`A``(0P`!#$"$`
+M`A"`)$+_]@""$"L00``(``@00)2B````````I.(``)2B`````````^``"*5"
+M````2!`A``(0P`!($"$``A"`)$(`"@!$$"L00``2`````*3H```#X``(I4@`
+M`)4B````````I.(``)4B`````````^``"*5"``"5(@```````*3B``"5(@`"
+M``````/@``BE0@``$,``'0``0"4`"!!``$5((94C``````````,00`!#$"$`
+M`A#``$,0(0`"$(``1!`C)$(`"2Q"`!,40/_C`````)4C``(```````,00`!#
+M$"$``A#``$,0(0`"$(`D0O_V`((0*Q1`_]\E"``!`080*A1`_^8`"!!``^``
+M"``````GO?_@K[\`&#"$__\PJ/__C,4`"`````"4P@`$`````!!```X``!@E
+ME*(````````02``*)&,``93&``0``````&80*A!```4DI0`TE*(````````4
+M2/_Z)&,``92F``:/H@`P`````*^B`!`\`@`!)$(D%`!`^`DDI0`(C[\`&```
+M```#X``()[T`(#P%```DI3JHC*,`!`````"L@RP0``,0P`!#$",``A"`)*4`
+M"`!%$"&L@BPH)`(``:R"+"0D`@`4K((L'"0"`",#X``(K((L((R"$C0`````
+ME$(``@`````P0@`@$$``"```0"4D`P`<)`<`0"0&`'*LH``,)`(`=Q````BL
+MH@`0)`,`,@``."4D!@`R)`(`%*RB``PD`@`CK*(`$(RE``0``````*@0*P!E
+M&"L`0Q`E$$``!P``("4`IQ`K`,48*P!#$"400``"`````"0$``$#X``(`(`0
+M)2>]_^BOOP`4K[``$`"`@"6.!B[$```````&,D`PQGX`/`(``"1"```T!9DP
+M`$#X"33&@``D`@`!K@(NP(^_`!2/L``0`^``"">]`!@GO?_@K[\`'*^R`!BO
+ML0`4K[``$`"`@"4"`(@E)A(L$(X#+"0`````$&``*@``$"6.`R[`)`(``11B
+M`"0\`@``)$(```(@("4`0/@)-`69,`!`&"4P8H``%$``'``#%D*N0@`$K@`N
+MP#P"``$D0B9$`B`@)0!`^`D"0"@E%$``$SP"``$D0B@,`B`@)0!`^`D"0"@E
+M$$``#3P"``$D0BA$`B`@)0!`^`D"0"@E&$``!SP"``$D0BI4`B`@)0!`^`D"
+M0"@E)`(``JX"+L".`B[``````(^_`!R/L@`8C[$`%(^P`!`#X``()[T`((RC
+M``2,H@`,``````!#$"L00``&```@)8RB`!```````&(0*Q1```(`````)`0`
+M`0/@``@`@!`E`*`X)8SC`!0`````$&``?B0"__^,Y``````````$$,``1!`C
+M``(0@#P#```D8SJP`$,0(:SB`!B,X@`$C.,`$```````0Q`K%$``+0`````0
+M@`!M)`+__XSB``0`````K.(`"(SC`!```````$,0*Q1``"$`8$`EC.(`````
+M```00``=`````#P"```D2CJH/`(``"1).K",X@```````"1&__^LY@````8@
+MP`"&(",`!""``(H0(8SE`!B,0P`0C*(`"```````8A@C``,80(SB``@`````
+M`$,0(ZSB``@`B2`A`$@0*Q1```.LY``8%,#_Z0`````#X``()`(``8SC``2,
+MX@`,``````!#$"L40``\`````#P"``",0SJH`````"1C__^,Y````````!"#
+M`#4D`O_^C.,`!`````"LXP`(C.(`#```````0$@E`$,0*Q1``"D`````/`(`
+M`(Q#.J@`````)&/__XSB`````````$`@)0!#$"L00``?/`,```!@$"4D2SJH
+M/`(``"1*.K",8CJH`````"1(__\DA@`!K.8````&(,``AB`C``0@@`"+$"&,
+MY0`8C$,`$(RB``@``````&(8(P`#&$",X@`(``````!#$".LX@`(`(H@(0$B
+M$"L40``$K.0`&`#($"L40/_J`,`@)0/@``@D`@`"```0)0/@``@`````C*(`
+M%``````00``5`````(RB`!@`````E$(```````"D@A/0C*(`&`````"40@`"
+M`````*2"$\Z,H@`8`````)1"``0`````I((3S(RB`!@`````E$(`!@````"D
+M@A/*`^``"``````GO?_@K[\`'*^R`!BOL0`4K[``$`"`D"4`H(@E`D"`)3P"
+M```D0@```$#X"30%@`0P0___)`(``1(B`!\J(@`"$$``!0`````2(``/````
+M`!```",`````)`(`!A(B``4D`@`($B(`%``````0```<`````(X&+L@`````
+M`&8P)1````4\`P"!C@8NR```````9C`E/`,`0CP"```D0@```D`@)30%@`0`
+M0/@)`,,P)1````L`````C@8NR```````9C`E/`,`(#P"```D0@```D`@)30%
+M@`0`0/@)`,,P)8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_^BOOP`0/`(`
+M`21"*KR,A0'<`$#X"0````"/OP`0``````/@``@GO0`8)[W_X*^_`!ROL@`8
+MK[$`%*^P`!``@)`E/`(``"1"````0/@)`*"`)0!`B"4\!7__-*7__SP"```D
+M0@```D`@)0!`^`D")2@D/`(``"1"```"0"`E`$#X"20%`#``0"`E,(8#\!(`
+M``8`!C$")`(`)0!&$",``A!"$```"P#","$LP@`"$$``""3&__\\`@``)$(`
+M``)`("4`0/@)`B`H)1```!$``!`E)`/\#P"#&"0`!C$`,,8#\#P"```D0@``
+M`D`@)20%`#``0/@)`&8P)3P"```D0@```D`@)0!`^`D"("@E)`(``8^_`!R/
+ML@`8C[$`%(^P`!`#X``()[T`(">]_^BOOP`0`*`X)0"`0"4HXP`*$&``"0``
+M$"4`!RD``*<H(P`%*(`!!2@A/`(``"1"````0/@))*4L4(^_`!```````^``
+M"">]`!@GO?_HK[\`$`#`0"4`@#@E**,`"A!@``H``!`E``4Q``#%,",`!C"`
+M`.8P(3P"```D0@```0`H)0!`^`DDQBQ0C[\`$``````#X``()[T`&">]_]BO
+MOP`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@)@E`*"()20"``(2(@`-`,"@)2XB
+M``,00``&)`(``R0"``$2(@`))`+__Q```#``````$B(`"R02``@0```L)`+_
+M_Q````<D$@`)C((L5``````00``#``"0)1```"0``!`E`!(1``!2$",``A"`
+M`(*`(280+%".`P`$`````!1@`!LD`O__/`(``"1"```"`"`E`$#X"20%`#P6
+M@``-KA$`!"0"``NN`@`,)`(``JX"`!0D`O__K@(`&"0"`_^N`@`<)`(`"J8"
+M`"`0```'I@(`(CP"```D0@```F`@)0)`*"4`0/@)`H`P)0)`$"6/OP`DC[0`
+M((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_^"OOP`<K[(`&*^Q`!2OL``0
+M`("`)8X"+#P`````,$(#_XX&+$0```````8T`#P2`_\`TC`D/!$``"8Q```D
+M!0"D`B#X"0!&,"6.`BQ``````#!"`_^.!BQ(```````&-```TC`D`@`@)20%
+M`*@"(/@)`$8P)3P"```D0@```@`@)0!`^`DD!0"L)`/\``!#$"2.!BQ,````
+M`##&`_\"`"`E)`4`K`(@^`D`1C`EC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@
+M)[W_Z*^_`!``H#@E`(`P)2SC``H08``F```0)0`'$0``1Q`C``(0@`#"*"$D
+MI2Q0C*,`!``````08``=```0):R@``0D`P`!`.,8!``#&">,PBP\``````!B
+M$"2LPBP\C,(L0```````8A`DK,(L0(S"+$0``````&(0)*S"+$2,PBQ(````
+M``!B$"2LPBQ(C,(L3```````8A@D/`(``21"+J@`0/@)K,,L3"0"``&/OP`0
+M``````/@``@GO0`8)[W_T*^_`"ROM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2O
+ML``0`("H)0"@L"4"H*`ECJ02-``````NPP`*$&`!?```$"4`%A$``%80(P`"
+M$(`"@I@A)G,L4(YC``0`````$&`!<R0"``&.8P`8)`+__Q1B`!0`````$(``
+M!B0#`*"4@@`"`````#!"`*`00P`")`0`'R0$``\D!P`!`.00*Q!```L`%H"`
+M``<00#1'``$`Y!`K%$#__0`'$$`0```$`!:`@(YG`!@``````!:`@##G`_^.
+M8@`<```````"$H`\`P`/-&/\``!#$"0`XC@ECF8`%```````!C4`/`(/\`#"
+M,"0\`@``)%$```*@("4F!1!``B#X"0#F,"669@`B```````&,0`PQ@#PEF(`
+M(``````P0@`/`,(P)3P"``@T0B```J`@)28%$(`"(/@)`,(P)0*@("4F!0G`
+M`B#X"20&"`".H@',`````"Q"``000``$`J`@)28%$0`"(/@)/`8!`(YB`"0`
+M````$$``'CP#`/\`%H"`-&/__P!#&"2.9@`H```````&-@`\`@``)$(```*@
+M("4F!0C``$#X"0!F,"4\`@``)$(```*@("4`0/@))@4)P`!`&"6.8@`H````
+M`!!```(T9@`!-&8!`0`6*(`\`@``)$(```*@("4`0/@))*4)P(YB`#``````
+M$$``"P`6*(`\!@#_-,;__P!&,"0\`P$`/`(``"1"```"H"`E)*4)``!`^`D`
+MPS`ECF(`+``````00``9`!:`@#P&``\TQO__`$8P)#P#`!`\`@``)%$```*@
+M("4F!1#``B#X"0##,"6.8@`,`````#!"`"`00``*)A`)P#P"```D0@```J`@
+M)0!`^`D"`"@E`J`@)0(`*"4"(/@)-$8"`(YB``P\`P`!`$,0)!!```X`%H"`
+M)A`1`#P"```D0@```J`@)0!`^`D"`"@E/`8`(#P#```D8P```J`@)0(`*"4`
+M8/@)`$8P)8YB``P\`P"``$,0)!!```T`%H"`)A`1`#P"```D0@```J`@)0!`
+M^`D"`"@E/`,``"1C```"H"`E`@`H)0!@^`DT1@(`CF,`!"0"``(08@`%)`(`
+M`Q!B`!\`%I"`$```20``````%H"`)A`)P#P"```D0@```J`@)0!`^`D"`"@E
+M/`,``"1C```"H"`E`@`H)0!@^`DT1@"BCJ(!S``````L0@`$$$```CP#`"4\
+M`P$E`!8H@#P"```D0@```J`@)22E$0``0/@)`&`P)1```"T`````)E$)P#P"
+M```D0@```J`@)0!`^`D"("@E/!```"80```"H"`E`B`H)0(`^`DT1@)B/`(`
+M`#P#``",0@``C&,`````````0Q`CCH,NS```````8A@C/`(``(Q"````````
+M`&(8(P`#&H`\!@$``J`@)29%"0`"`/@)`&8P)8ZB`<P`````+$(`!!!```(\
+M`P`$/`,!!``6*(`\`@``)$(```*@("4DI0G``$#X"0!@,"6.8@`X`````#!"
+M``$00``.`!:`@"80$0`\`@``)$(```*@("4`0/@)`@`H)3P&`"0\`P``)&,`
+M``*@("4"`"@E`&#X"0!&,"6.8@`,`````#!"``$00``')`(``0+"$`2.@RP\
+M``````!#$"40```'KH(L/`+"$`0``A`GCH,L/```````0Q`DKH(L/(YB``P`
+M````,$(``1!```<D`@`!`L(0!(Z#+$```````$,0)1````>N@BQ``L(0!``"
+M$">.@RQ```````!#$"2N@BQ`CF(`#``````P0@`"$$``!R0"``$"PA`$CH,L
+M1```````0Q`E$```!ZZ"+$0"PA`$``(0)XZ#+$0``````$,0)*Z"+$2.8@`,
+M`````#!"``000``')`(``0+"$`2.@RQ(``````!#$"40```'KH(L2`+"$`0`
+M`A`GCH,L2```````0Q`DKH(L2(YB``P`````,$(`"!!```<D`@`!`L(0!(Z#
+M+$P``````$,0)1````>N@BQ,`L(0!``"$">.@RQ,``````!#$"2N@BQ,/`(`
+M`21"+J@"H"`E`$#X"0)@*"4D`@`!C[\`+(^V`"B/M0`DC[0`((^S`!R/L@`8
+MC[$`%(^P`!`#X``()[T`,">]_^BOOP`0``4H@#P"```D0@```$#X"22E"`"/
+MOP`0``````/@``@GO0`8)[W_Z*^_`!``!2B`/`(``"1"````0/@))*4(`"0"
+M``&/OP`0``````/@``@GO0`8)[W_Z*^_`!`D!@`!`*8P!#P"```D0@```$#X
+M"20%"$`D`@`!C[\`$``````#X``()[T`&">]_]BOOP`@K[,`'*^R`!BOL0`4
+MK[``$`"`F"4`H)`E`!(H@#P"```D40```B#X"22E"@`P4``#%@``"0)@("4"
+M(/@))`4(0"0#``$"0Q@$`$,0)!!```,"`!`E)!```0(`$"6/OP`@C[,`'(^R
+M`!B/L0`4C[``$`/@``@GO0`H)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``
+M$`"`D"4`H(@E)`8``3P"```D0@``)`4(@`!`^`D")C`$``"`)3P"```D5```
+M/`(``!````0D4P```F#X"20$``HF$``!*@(G$!!```8\`@```D`@)0*`^`D"
+M("@E%$#_]CP"```D0@```D`@)20%"(``0/@)```P)2H")Q"/OP`DC[0`((^S
+M`!R/L@`8C[$`%(^P`!`#X``()[T`*(^B`!B/IP`@CZ,`)(^D`"@`````,,8/
+M_P`"%(``PC`E``,>0#""``$00``#`,,P)3P"`0``PC`E,((`$!!```(\`B``
+M`,(P)3""``000``"/`(`0`#","4P@@`@$$```CP"`(``PC`EJ*8`"+BF``N/
+MH@`0```````"'H`P@@`"$$```CP"`(``8A@EJ*,`#+BC``\D`O__$.(`#SP#
+M``^(I``,F*0`#P`'$T`T8^```$,0)`""("6HI``,N*0`#XBB``B8H@`+/`-`
+M``!#$"6HH@`(N*(`"P/@``@D`@`!`^``"```$"6(H@`(F*(`"SP#(```0Q`E
+MJ*(`"+BB``L#X``(`````(^C`!``````$.``!P````"(H@`,F*(`#Q1@`!0`
+M1A`E$```$C1"$```````$&``#`````"/H@`4`````(A#``B80P`+`````*BC
+M``BXHP`+J*8`#+BF``\0```&`&`0):B@``BXH``+-,(0`*BB``RXH@`/J*``
+M%+B@`!>(H@`4F*(`%P````"HH@`0N*(`$P/@``@D`@`!B*,`%)BC`!<`````
+M,&,``1!@`%HD`@`/B*(`%)BB`!<`````,$(?_@`"$$*DP@``B*(`$)BB`!,`
+M``````(4`J3"``*@P``$B*(`$)BB`!,`````,$(``11``!P`````B*(`$)BB
+M`!,`````,$(``A!```(D`@`!H,(`!(BB`!"8H@`3`````#!"``@00``%````
+M`)#"``0`````-$(``J#"``2(H@`0F*(`$P`````P0@`$$$``!0````"0P@`$
+M`````#1"``2@P@`$B*(`")BB``L```````(4@C!"``^@P@`%B*(`%)BB`!<`
+M``````(30J#"``:(H@`0F*(`$P`````P0@\```(:`J##``>(H@`0F*(`$P``
+M```P0@#P``(1`J#"``B(H@`0F*(`$P`````P0O````(3`J#"``F@P``*,&(`
+M_Q!```.@P``+)&(``:#"``>0P@`(`````!!```4`````D,(`"``````D0@`!
+MH,(`"```$"4#X``(``````/@``@``````````)""+KP`````-$(`"*""+KR0
+MH@`$`````#1"``B@H@`$E((NN@````"DH@``D((NO`````"@H@`$D((NO0``
+M``"@H@`%`^``"```$"4`````)[W_X*^_`!BOL0`4K[``$`"`B"4\$```)A``
+M`"0%0(`\!I)(`@#X"33&_``"("`E)`5`@#P&))("`/@)-,9))`(@("4D!4"`
+M/`8H``(`^`DTQ@`Y`B`@)20%0(`\!E,6`@#X"33&""0"("`E)`5`@#P&Y9@"
+M`/@)-,8%>0(@("4D!4"`/`8`'0(`^`DTQN__`B`@)20%0(`\!AJJ`@#X"33&
+MOD`"("`E)`5`@#P&OA`"`/@)-,955`(@("4D!4"`/`8`#@(`^`DTQC`'`B`@
+M)20%0(0"`/@)```P)8^_`!B/L0`4C[``$`/@``@GO0`@)[W_X*^_`!ROL@`8
+MK[$`%*^P`!``@(@E/`(``"1"```T!9C0`$#X"20&'!8``(`E/`(``"12```"
+M("`E-`68@`)`^`D\!@`!)A```2H"``@40/_Z`B`@)3P"```D0@```$#X"30%
+MG````AX"``,A`C!C``\``QD`/`(``"1"````@R`E`$#X"20%``B/OP`<C[(`
+M&(^Q`!2/L``0`^``"">]`"`GO?^(K[\`<`"`8"4!@#@E)`+_R:^B`!"OH@`4
+MKZ(`&*^B`!PD`O_"KZ(`("0"__*OH@`HKZ(`+*^B`#"OH@`T)`+_]*^B`#@D
+M`O_`KZ(`0*^B`$2OH@!(KZ(`3"0"_[JOH@!0)`+_LJ^B`%BOH@!<KZ(`8*^B
+M`&0D`O^PKZ(`:```*"4GJP`0).8`!">J`"@GJ0!`)Z@`6``%&(``9R`A`6,0
+M(8Q"````````K()&*`!F("$!0Q`AC$(```````"L@D8X`&<@(0$C$"&,0@``
+M`````*R"1E``9B`A`0,8(8QB````````K()&8"2E``$HH@`%%$#_Z#P"```D
+M0@```8`@)0!`^`DD!0`!C[\`<``````#X``()[T`>``%*$``IB@A``4H0`"D
+M*"&4HA7^``````/@``@`````)[W_T*^_`"BOM0`DK[0`(*^S`!ROL@`8K[$`
+M%*^P`!``@(`E`,"0)0#@F"6/M`!`,+7__SP1```F,0``/`4``"2E.]`"(/@)
+M)`82<*X2``RN$P`0KA0`%*85`<BF``'*)`(`/Z8"`?RN``(`K@`OO*X`+\`\
+M`@@`K@(OS"0"!X&N`B_4K@`OW#P"`#\T0C\_K@(OX"0"`&2N`B_D)`(``JX"
+M+^@D`O__K@(O^*X"+_RN`C``)@0L/#P%```DI4Y0`B#X"20&``:B`#`$C[\`
+M*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`P,(0`_S"E`/\``#`E
+M/`(``"1)3E@\`@``)$A.63P"```D1TY:``800`!&&"$`:1`AD$(````````4
+M1``+`&@0(9!"`````````*(0*Q1```8`9Q`AD$,`````````91@K$&``!20"
+M``$DQ@`!+,(`!!1`_^P``!`E`^``"``````GO?_`K[\`/*^V`#BOM0`TK[0`
+M,*^S`"ROL@`HK[$`)*^P`"``H)`E`,"8)0#@B"6/M@!0,)#__SP"```D0@``
+M`$#X"20$1J@`0*`E%H``!`(`*"4D`P`"$``"'*[#``"OL0`0K[8`%#P"```D
+M0@```H`@)0)`,"4`0/@)`F`X)0*`D"4\`@``)$(```*`("4``"@E`$#X"20&
+M``$00``8/`(``"1"```"0"`E`$#X"20%0"`P0P#_``,9`JY#`<PP0@`/ID(!
+MT#P"``$D0C^0DD0!SY)%`=$`0/@)`````!!``7H\`@``)$(```)`("4`0/@)
+M```H)11```0\`@``)`(``Q```>:OH@`<)$(```)`("4`0/@)-`68&*9"`=*.
+M0P',)`(`"1!B``@D`@`*%&(`"SP"``"60@'0`````"Q"``000``&/`(``#P"
+M``$D0CO0`$#X"0)`("4\`@``)$(```!`^`D"0"`E%$```R0"``X0``'*KZ(`
+M'(Y"`<P`````+$(`!11```T\`@``/`(``"1"```"0"`E`$#X"20%0!`\`P``
+M)&,```)`("4D!4`0`&#X"31&$``\`@``)$(```)`("4T!9@``$#X"20&``<\
+M`@``)$(```!`^`D"0"`EID(!U#!#`/`D`@`P$&(`/BAB`#$00``()`(`8"0"
+M`!`08@`Y)`(`(!!B`#<`````$```#0`````08@`S*&(`81!```8D`@"@)`(`
+M4!!B`"X`````$```!```````````$&(`*0````"60@'4`````!1``"4D`@`%
+MCD,!S``````48@`'/`(`"8Y#`=`T0@!#%&(``R0"`$80```;ID(!U(Y"`<P`
+M````.$,`!RQC``$X0@`++$(``0!B&"408``#)`(`41```!"F0@'4CD,!S"0$
+M``H09``*)`(`"1!B``DD`@!B%&0`#B0"``F60@'0`````"Q"``000``%)`(`
+M"B0"`&*F0@'4CD,!S"0"``H08@`7)`(`"8Y#`<P`````$&(`$R0"``H48@`&
+M`````)9"`=``````+$(`!!1```T\`@``ED,!U``````P8@#P)$+_T"Q"`$`0
+M0``&/`(``#!B``\L0@`%%$``X"0"``T\`@``)$(```)`("4D!0#!`$#X"2>F
+M`!@00`%+)`(`")>B`!@`````+$(P`A!```0"0"`E)`(`!1```42OH@`<EZ(`
+M&`````"F@A)P/`(``"1"````0/@))`5`$#!#`!@``QC")`(``A!B`!$D`@`#
+M$&(`#"0"``F.0P',`````!!B``LD`@`*%&(`!P````"60@'0`````"Q"``04
+M0``%/`(``"0"``H0``$HKZ(`'#P"```D0@```D`@)20%`#\`0/@))Z8`&!!`
+M`1X"0"`EEZ(`&`````"F@A)R/`(``"1"```D!0`<`$#X"2>F`!@00`$5)`(`
+M")>B`!@`````$$``$0)`("67H@`8`````#!1__``$8L`/`(``"1"```D!0`;
+M`$#X"2>F`!@00`$&)`(`")>B`!@``````B*()1````(F,?]`)!$#0```@"42
+M(``/``"8)3P"```D50```D`@)28%`,`"H/@))Z8`&!!``/0F$``!EZ(`&```
+M```"8I@F`A$0*Q1`__8"0"`E-`+__Q)B``,D`@`'$```ZZ^B`!PD`@`*IH(3
+MYB0"``.F@A7P``"`)2:#``8D!``+`!`00`!0$"$``A"``%`0(0`"$(``0Q`A
+MI$03Z"80``$N`@`*%$#_]P`0$$```(`E/`(``"1*3D`FB``"/`(``"1)3D@F
+MAP`,)`4`"R:&``@`$!!``%0@(0!*&"&48P```````*2#%?@`2"`A`$D8(91C
+M````````I(,5\`!0$"$``A"``%`0(0`"$(``1Q@AI&46J`!&$"&D1180)A``
+M`2X"``,40/_K`!`00#P"```D0@```D`@)0!`^`DFA1)P$$``L20"``B6@A)P
+M`````"Q"4`,00``5)`0`"HY#`<P`````$&0`"B0"``D08@`))`(&:!1D``T`
+M````ED(!T``````L0@`$$$``"``````D`@9HIH(6`"0"!+"F@A8$-`*``*:"
+M%@BF@A7^EH(2B@`````00``C)`,`$)9"`=0`````,$(`\!1#`!X\$0``)C$`
+M``)`("4T!9@``B#X"20&0`<\$```)A````(`^`DD!`?0/`(``"1"````0/@)
+M`D`@):9"`=8"0"`E-`68``(@^`DD!@`'`@#X"20$!]"60@'6`````#!"`/`D
+M`P`@$$,`!3P"```D`@`-$```<Z^B`!P\`@``)$(```)`("4D!0"_`$#X"2>F
+M`!@00`!J)`(`")>B`!@`````IH(2=*9"`@@\`@``)$(```!`^`D"0"`E$$``
+M7R0$``J.0P',`````!!D``L\`@``)`(`"1!B``@\`@``%&0`"`````"60@'0
+M`````"Q"``000``#/`(``!```!4D0@``CD(!S``````X0P`'+&,``3A"``LL
+M0@`!`&(8)1!@``,\`@``$```"B1"``"60@'4`````#!"`/`D0O_0+$(`0!!`
+M``@\`@``/`(``"1"```"0"`E`$#X"2>E`!P0```%`````"1"```"0"`E`$#X
+M"2>E`!P00``R`````(Z"+,0`````KD(!P#P"```D0@```$#X"0)`("4``)@E
+M``"`)205`!\\`@``)%$```)`("4"L"@C`B#X"2>F`!@00``>`!`80)>B`!@`
+M`````F*8(0!T("$``A("H((L,`"`&"63H@`9`````*!B+#$F$``!+@(``Q1`
+M_^TN8P`!/`(``C1"__T"8A`F+$(``0!B&"408``$/`(``20"``D0```(KZ(`
+M'"1"/60`0/@)`D`@)1````X"0!`E)`(`"*^B`!P2@``$/`(``"1"````0/@)
+M`H`@)1+```4``!`ECZ(`'`````"NP@`````0)8^_`#R/M@`XC[4`-(^T`#"/
+MLP`LC[(`*(^Q`"2/L``@`^``"">]`$`GO?_HK[\`%*^P`!`\`@``)$(```!`
+M^`D`@(`EC@(LJ``````00``#``````!`^`D"`"`E/`(``"1"````0/@)`@`@
+M)3P"```D0@```@`@)20%``$`0/@))`8``3P"```D0@```@`@)0!`^`DF!1)P
+M/`(``"1"````0/@)`@`@)8^_`!2/L``0`^``"">]`!@GO?^@K[\`7*^^`%BO
+MMP!4K[8`4*^U`$ROM`!(K[,`1*^R`$"OL0`\K[``.`"`H"4T`H``KZ(`$#0"
+MF""OH@`4/`)5531"556OH@`@/`*JJC1"JJJOH@`D/`)F9C1"9F:OH@`H/`*9
+MF31"F9FOH@`L``"X)2>B`!"OH@`P)[X`&``7@("/HP`P``````!P$"&,4@``
+M``````*`("4\`P``)&,```!@^`D"0"@E`]"`(:X"`````(@E`!$4``!1@"4"
+M@"`E`D`H)3P"```D0@```$#X"0(`,"4"@"`E/`,``"1C````8/@)`D`H)1!0
+M``,F,0`!$```,```$"4J(@$`%$#_[@`1%````(@E)[,`(#P"```D5@``/`(`
+M`"15````$1"``F(0(8Q0`````````H`@)0)`*"4"P/@)`@`P)0*`("4"H/@)
+M`D`H)1("``,F,0`!$```&```$"4J(@`$%$#_\``1$(``%Q"`CZ0`,```````
+M@A@A`\(0(8QE``",1@``/`(``"1"````0/@)`H`@)2;W``$JX@`"%$#_N0`7
+M@(`\`@``)$(```!`^`DD!`!D)`(``8^_`%R/O@!8C[<`5(^V`%"/M0!,C[0`
+M2(^S`$2/L@!`C[$`/(^P`#@#X``()[T`8#"E__\PH@$`$$``!B0"$S.DP@``
+M)`(7U*3B```#X``()`(``3"B`(`00``/`````)2"$HH`````%$``!B0""0B4
+M@A*,`````!!```<`````)`()"*3"```D`@JLI.(```/@``@D`@`!`^``"```
+M$"4GO?_0K[\`**^S`"2OL@`@K[$`'*^P`!@`@)`E`D"8)0)`B"6GH``0ED(2
+M<``````L0E`!%$``!R90`>".0@&@)`4`R0!`^`DGI@`0$$`!<@````"60@'4
+M`````#!"`/`D`P!`%$,``@````"F8!*&EZ(`$``````40``-)`(`!XY#`<P`
+M````%&(`"20"``B60P'0`````!1B``4D`@`%IZ(`$"0"``&F8A)VIF(2>(XC
+M`=PD`@`&$&(`$R0"<&66(P'*`````!1B``\`````EB,""``````D8O^<+$(`
+M`A!```0D`@!!)&(`!1````:F(@((EB,""``````48@`")`(`0Z8B`@BN```$
+MEF(2A@`````00``')`(``:X"``268A)V`````!1```(D`@`#K@(`!)9B$HH`
+M````$$``!0````".`@`$`````#1"``2N`@`$EF(2C``````00``/)`(.$98C
+M`<H`````$&(`#"0""0B.`P`$`````#1B``BN`@`$EF(2>``````40``$)`()
+M"#1B`"BN`@`$)`()"*8"`!"60@'4`````#!"`/`D0O_0+$(`0!1``!<D`@G$
+MCD0!S``````X@P`'+&,``3B"``LL0@`!`&(8)11@``XD`@G$)`,`"A"#``HD
+M`@`)$((`"20""<04@P`))`(*K)9"`=``````+$(`!!!```0D`@JL)`()Q!``
+M``*F`@`2I@(`$B0"$S.F`@`,)`(7U*8"``Z.`@``/`/__31C__\`0Q`D/`,`
+M`0!#$"6N`@``EZ(`$``````P0@`"%$``#@``("6.0P',`````"QB``800``(
+M)`(`!11B``@`!!2`ED(!T``````L0@`$%$```P`$%(`D!``!``04@(X$````
+M`````$00)CP#``0`0Q`D`((@)CP"_]\T0O__`((@)#P"`!``@B`EEZ(`$```
+M`````A!".$(``3!"``$``A6``$00)CP#`$``0Q`D`((@)JX$``".0@',````
+M`"Q"``<40``%/`/_]SP"``@`@A`E$```!:X"``".`@``-&/__P!#$"2N`@``
+MC@(``#P#@```0Q`E/`-```!#$"6N`@``EB(!T``````L0@`"$$``!20"``N.
+M0P',`````!1B`#4`````EZ(`$``````P0@`!%$``!P``&"6.`@`$`````#!"
+M``D00``#``,70"0#``$``Q=`C@0`````````1!`F/`,@``!#$"0`@B`FEZ(`
+M$````````A#".$(``3!"``$``A<``$00)CP#$```0Q`D`((@)JX$``"7H@`0
+M`````#!"``040``'```8)8X"``0`````,$(`"1!```(`````)`,``0`#'L".
+M`@````````!B&"8\!`@``&08)`!#$"8\`P0``$,0)3P#`0``0Q`EK@(``(X"
+M```\`_W_-&/__P!#$"2N`@``CF(3.``````00``%```8)8YB$SP`````%$``
+M`P`#%<`D`P`!``,5P(X#`````````$,0)CP$`(``1!`D`&(8)C1C\`"N`P``
+MCB,!S"0"``448@`%)`(`")8C`=``````$&(`!@````".(@',`````"Q"``84
+M0``%`````(X"````````-$((`*X"``"7H@`0`````#!"`?`00``#``(1`A``
+M``.F`@`()`(`"J8"``B7H@`0`````#!"\``00``%``(;`B0"``$`8A`$$```
+M`Z8"``HD`@"`I@(`"I9"`=0`````,$(`\"1"_]`L0@!`$$``!B0#^_^.`@``
+M`````#1"!@`0```'K@(``(X"`````````$,0)"0#_?\`0Q`DK@(``)9B$GH`
+M````$$``#`)`("6.0@&@)`4`#P!`^`DF)A)($$``!B0"``&N(A),C@(`````
+M```T0@$`K@(``(Y"`<P`````+$(`!:XB$FB.0P',)`(`!11B``4``"`EED,!
+MT"0"``D08@`&`````(Y"`<P`````+$(`!A1```,`!!'`)`0``0`$$<".`P``
+M``````!#$"8P0@"``&(8)JX#```D`@`/K@(`%"0"``&/OP`HC[,`)(^R`""/
+ML0`<C[``&`/@``@GO0`P)[W_X*^_`!@\`@``)$(```!`^`DGI0`0)`(``8^_
+M`!@``````^``"">]`"`D`@`!%*(`!3P"``$\`@``)$(```/@``BL@@!P)$)2
+M(`/@``BL@@!P````````````````)[W_V*^_`"2OL@`@K[$`'*^P`!@`@(`E
+M`*"0)3P"```D40``CD8`!`(@^`DT!8`H`@`@)8Y&``P"(/@)-`6`+`(`("6.
+M1@`0`B#X"30%@#`"`"`ECD8`"`(@^`DT!8`TCD(``#P#`0``0Q`D$$``#CP"
+M```D0@```@`@)0!`^`DGI0`0C@(2-```("4``"@EK$0`**Q%`"P"`"`E-`6`
+M(`(@^`D\!@$`/`(``"1"```"`"`ECD8```!`^`DT!8`@C[\`)(^R`""/L0`<
+MC[``&`/@``@GO0`H)[W_T*^_`"BOI0`4C(,!W"0"``$08@`)-`+__Q!@``T\
+M`@``)`(`!A!B``DD`@`(%&(`%"2B``$T`O__KZ(`'#P"``<T0O__$```#:^B
+M`"`\`@``C$(`````````HA`C``(0P*^B`!P\`@``C$(`````````HA`C``(0
+MP*^B`"`DH@`!KZ(`&#P"`8`T0O__`,(0)*^B`!`\`@``)$(```!`^`DGI0`0
+MC[\`*``````#X``()[T`,">]_^"OOP`8K[$`%*^P`!``@(@E/!```"80```T
+M!8`H`@#X"0``,"4\`@``)$(```(@("4`0/@)-`6`!#P#``0`0Q`E/`;_SS3&
+M__\"("`E-`6`!`(`^`D`1C`D`B`@)30%@"`"`/@)-`;__X^_`!B/L0`4C[``
+M$`/@``@GO0`@)[W_T*^_`"BOM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@*`E
+M`*"()98B`!(`````$$``&P*`D"4\`@``)$(```!`^`DT!8`$/`8`$#P0```F
+M$````H`@)30%@`0"`/@)`$8P)0*`("66)@`0`@#X"30%@"0"@"`EEB8`$@(`
+M^`DT!8`XCB8`%`*`("4T!8`P`@#X"0`&,,`0```//`(``#P"```D0@```H`@
+M)0!`^`DT!8`$/`;_[S3&__\\`P``)&,```*`("4T!8`$`&#X"0!&,"0\`@``
+M)$(```*`("6.)@```$#X"30%@"@\`@``)$(```*`("4`0/@)-`6`(#P#_X``
+M0Q`DEB,`"@``````0S`EEB(`&``````00``%)$(`!``"%``\`P!_`$,0)`#"
+M,"4\$```)A````*`("4"`/@)-`6`((Y&+]0\`O__-$(`_P#","26(@`:````
+M```"$@`P0O\``,(P):Y&+]0"@"`E`@#X"30%@!B6,P`*`````(XC`!P`````
+M`F,0*Q!```(``````&"8)8XR``P`````CB,`'``````"0Q`K$$```@``````
+M8)`E%G(`!`````".-0`$$````P````".-0```````(XF``0`````),;__0`&
+M,,`\$0`'-C'__P#1,"0\`@H8/!```"80```"@"`E-`6`U`(`^`D`PC`E)J;_
+M_0`&,,``T3`D/`(*``*`("4T!8#8`@#X"0#","4R8O__`!(T``*`("4T!8#<
+M`@#X"0!&,"6/OP`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#``
+M````)[W_X*^_`!ROL@`8K[$`%*^P`!``@(@E`*`0)0#`D"4\$```)A```"0%
+M8``"`/@)`$`P)0(@("4D!6`(`@#X"20&``$\`@``)$(```(@("4D!6`,)`8`
+M`P!`^`DD!P`"$$``!P(@("4\`@``)$(```!`^`DD!6`$ID(``"0"``&/OP`<
+MC[(`&(^Q`!2/L``0`^``"">]`"```````````">]_^"OOP`8K[$`%*^P`!``
+M@(@E`*"`)3P"```D0@```$#X"20%0!0`$(!`)`8``P(&,`0\`P``)&,```(@
+M("4D!4`4`&#X"0!&,"4D`@`!C[\`&(^Q`!2/L``0`^``"">]`"`GO?_@K[\`
+M&*^Q`!2OL``0`("()0"@@"4\`@``)$(```!`^`DD!4`4`!"`0"0&``,"!C`$
+M``8P)SP#```D8P```B`@)20%0!0`8/@)`$8P)"0"``&/OP`8C[$`%(^P`!`#
+MX``()[T`(">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)0"@B"4`P(`E/`(``"1"
+M````0/@))`5`&"0#``$"(Q@$``,8)P!#$"0R$``!`C"`!#P#```D8P```D`@
+M)20%0!@`8/@)`%`P)20"``&/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`GO?_H
+MK[\`%*^P`!``H(`E+@(`!A!```@D`O__/`(``"1"````0/@))`5`'#!"`"\"
+M`A`&,$(``8^_`!2/L``0`^``"">]`!@GO?_@K[\`'*^R`!BOL0`4K[``$`"`
+MD"4`H(`E`,"()3P"```D0@```$#X"20%0!0`$!A`)`0``P!D(`0\`P`!-&/P
+M``!D&"<`0S`D`!"#``#0,"42(``#-,:``#P"``$`PC`E/`(``"1"```"0"`E
+M`$#X"20%0!2.0RQ$/`4!`#P"```D0@```D`@)0!`^`D`92@EC[\`'(^R`!B/
+ML0`4C[``$`/@``@GO0`@`````">]_^BOOP`0/`(``"1"````0/@))`5`"#A"
+M``$L0@`!C[\`$``````#X``()[T`&">]_]"OOP`LK[8`**^U`"2OM``@K[,`
+M'*^R`!BOL0`4K[``$`"`F"4`H*`E``"H)0)@L"4\`@``)%````(`^`DD!0"`
+M/`,`@`!#$"000``7`F`@)0(`^`DD!0",`$`8)3P"`0``8A`D$$```CP"(``\
+M%0`@`&(0)!!```(\`@!``J*H)3P"!```8A`D$$```CP"`(`"HJ@E/`0"``!D
+M$"000``#/`(```*DJ"4\`@``)$(```)@("4`0/@))`4`P`!`D"4D`O__%D(`
+M`P``$"40``!;KH```#P"`04T0MBZ`D(8)#P"``@"0A`D$$``!*Z#```\`D``
+M`&(0):Z"```R0@`%$$``!C)"!<".@@```````#1"``&N@@``,D(%P!!``!T\
+M$```CH(````````T0@!`KH(``"80```"8"`E`@#X"20%`,0P1`/_CL-&H```
+M````@R`E/!$#_P!1$"0``A0"`$00):["1J`"8"`E`@#X"20%`,@P1`/_CL-&
+MH```````@R`E`%$0)``"%`(`1!`EKL)&H#)"`"`00``)`````(YB$F@`````
+M$$``!3P#0`".@@````````!#$"6N@@``CH(````````"HA`EKH(``#P#0```
+M0Q`D$$``%SP0``"N<A)0)A````)@("4"`/@))`4`Q*YB$E0"8"`E`@#X"20%
+M`,BN8A)8`F`@)0(`^`DD!0#,KF(27`)@("4"`/@))`4`T*YB$F`"8"`E`@#X
+M"20%`-2N8A)D)`(``8^_`"R/M@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0
+M`^``"">]`#",@BQ$``````/@``@`````)[W_T*^_`"BOM0`DK[0`(*^S`!RO
+ML@`8K[$`%*^P`!``@*`E`*"()8Z5+$0`````!J$`"P*`F"4\`@``)$(``"0%
+M`"0`0/@)```P)3P"```D0@```H`@)0!`^`DD!0`D/`(!!31"V+H"(C`D,B(`
+M0!!``!4``(`ECF(LS``````00``"`````#3&`$".8BS0`````!!```(`````
+M-,8!`(YB+-0`````$$```@`````TQ@"`CF(LV``````00``#,B(``33&!``R
+M(@`!$$```CP"`N`TQ@`'`B(0)!!``!8\`@"``,(P)3P"`"`"(A`D$$```CP"
+M`0`"`H`E/`(`0`(B$"000``"/`(@``("@"4\`@"``B(0)!!```(\`@0``@*`
+M)3P#`@`"(Q`D$$```SP"0``"`X`E/`)```(B$"000``"/`(`"`#","4\`@``
+M)%(```*`("4"0/@))`4`H#P"```D0@```H`@)0!`^`DD!0"L/`-(_S1C__\`
+M0Q`D`H`@)20%`*P"0/@)`%`P)08A``6N<2Q$`H`@)20%`"0"0/@))`8``0*@
+M$"6/OP`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#``````````
+M`)2"`>H``````^``"``````GO?_HK[\`$#"C__^4@@'J``````!B$"L00``+
+M```0)0`#&4`T!8@</`(``"1"````0/@)`&4H(3!#@``48``")`(``0``$"6/
+MOP`0``````/@``@GO0`8)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`DK[0`(*^S
+M`!ROL@`8K[$`%*^P`!``@)@E,+7__Y9C`>H``````J,8*Q!@`$X``!`E`!6!
+M0#01B!0"$8@A/`(``"1"````0/@)`B`H)0!`D"4\`@``)%0```)@("4T`H@`
+M`@(H(0*`^`D``#`E-!Z(!`)@("4"'B@A`H#X"0``,"4T%X@(`F`@)0(7*"$"
+M@/@)```P)306B`P"8"`E`A8H(0*`^`D``#`E-`6($`)@("4"!2@A`H#X"0``
+M,"4"8"`E`B`H)0*`^`DD!@`'-`6(&`)@("4"!2@A`H#X"0``,"4T!8@<`F`@
+M)0(%*"$"@/@)```P)20"``060@`:)`(``8YB+\P\`P@``$,0)!!``!0FL`!`
+M,A#__P`0@4`"8"`E-`*(``("*"$"@/@)```P)0)@("4"'B@A`H#X"0``,"4"
+M8"`E`A<H(0*`^`D``#`E`F`@)0(6*"$"@/@)```P)20"``&/OP`TC[X`,(^W
+M`"R/M@`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#@GO?_8K[\`
+M(*^S`!ROL@`8K[$`%*^P`!``@)@E`,`@)3"E__^68P'J``````"C&"L08``K
+M```0)1"``!H`````D)(`!0``````$I(`D((`!``````"0I`ED(8``P``````
+M!C8`D((``@```````A0``,(P)9""``$```````(2``#","60@@````````#"
+M,"4`!C!"`!(7P`#","40```#`!*00@``D"4``#`E``6)0#0%B!@\$```)A``
+M``)@("4"`/@)`B4H(30%B!P"8"`E`B4H(0(`^`DV1H``)`(``8^_`""/LP`<
+MC[(`&(^Q`!2/L``0`^``"">]`"@GO?^PK[\`3*^^`$BOMP!$K[8`0*^U`#RO
+MM``XK[,`-*^R`#"OL0`LK[``*`"`L"4`P)`EKZ<`7(^B`&`PI?__KZ4`$*^V
+M`!0FQ`'@/`6JJA1```(TI:JJ```H)92#``J/H@`0``````!#&"L08`%5```0
+M)9)#````````+&(`!A!``5```!`E/`(``"1"3G```QB``&(8(8QB````````
+M`$``"``````D`P`%$```,J^C`!B,@P``/`(`!`!B&"008`%````0)20"``80
+M```JKZ(`&"0#``2OHP`8CL(OS#P#"```0Q`D$$``(P````"/HP`0`````"1B
+M`$"4@P`*``````!#$"H40``;```0)1```2P`````ED,``@`````L8P`%%&`!
+M)P``$"660@`"`````"Q"``840``/KZ``&)9"``(`````+$(`#B0#``$40``)
+MKZ,`&"0"``,0```&KZ(`&"0#``<0```#KZ,`&!```10``!`EDE<`!))"``4`
+M``````(2``+BN"620@`&```````"%``"XK@EDD(`!P```````A8``N*X)0+E
+MN":20P`(DD(`"0```````A(``&+P)0/%\"8SWO__DE0`"I)"``L```````(2
+M``*"H"620@`,```````"%``"@J`EDD(`#0```````A8``H*@)0*%H":20P`.
+MDD(`#P```````A(``&*H)0*EJ"8RM?__DE,`$))"`!$```````(2``)BF"62
+M0@`2```````"%``"8I@EDD(`$P```````A8``F*8)99"``(`````+$(`#A!`
+M``("99@F,G,`_R0"``2/HP`8`````!1B`*@\`P@`CL(OS```````0Q`D$$``
+MHS0%B`"/HP`0`````"1B`$`P0O__KZ(`'``#B4`\$```)A````+`("4")2@A
+M`@#X"0`7,"<T!8@$`L`@)0(E*"$"`/@)`!XP)S0%B`@"P"`E`B4H(0(`^`D"
+M@#`E-`6(#`+`("4")2@A`@#X"0*@,"4T!8@0`L`@)0(E*"$"`/@)`F`P)30%
+MB!0"P"`E`B4H(0(`^`DD!@`$/`(``"1"``"/I0`0CZ8`7`!`^`D"P"`EDD8`
+M%))"`!4```````(2``#","620@`6```````"%```PC`EDD(`%P```````A8`
+M`,(P)9)5`!B20@`9```````"$@`"HJ@EDD(`&@```````A0``J*H)9)"`!L`
+M``````(6``*BJ"6/HP`4`````(QB+]``````,$(`!!!``!L`````DD,`'I)"
+M`!\```````(2``!B$"6OH@`@DD,`'))"`!T```````(2``!B$"6OH@`DDE0`
+M())"`"$```````(2``*"H"620@`B```````"%``"@J`EDD(`(P```````A8`
+M$```!`*"H"4``*`EKZ``)*^@`""/H@`<```````"B4`T$X@`/!```"80```"
+MP"`E`@#X"0(S*"$T$H@$`L`@)8^F`"`"`/@)`C(H(30%B`@"P"`E`B4H(0(`
+M^`D"H#`E-`6(#`+`("6/I@`D`@#X"0(E*"$T!8@0`L`@)0(E*"$"`/@)`H`P
+M)30%B!0"P"`E`B4H(0(`^`DD!@`'-`6(&`+`("4")2@A`@#X"0``,"4T!8@<
+M`L`@)0(E*"$"`/@)```P)8^C`!````````.)0`+`("4",R@A`@#X"0+@,"4"
+MP"`E`C(H(0(`^`D#P#`E$```*R0"``&/H@`0```````"B4`T!8@`/!```"80
+M```"P"`E`B4H(0(`^`D"X#`E-`6(!`+`("4")2@A`@#X"0/`,"4T!8@(`L`@
+M)0(E*"$"`/@)`H`P)30%B`P"P"`E`B4H(0(`^`D"H#`E-`6($`+`("4")2@A
+M`@#X"0)@,"4T!8@4`L`@)8^F`!@"`/@)`B4H(3P"```D0@``CZ4`$(^F`%P`
+M0/@)`L`@)20"``&/OP!,C[X`2(^W`$2/M@!`C[4`/(^T`#B/LP`TC[(`,(^Q
+M`"R/L``H`^``"">]`%`````````````````GO?_HK[\`$"2#+#`\`@``)$(`
+M``"@("4`8"@E`$#X"20&``:/OP`0``````/@``@GO0`8)[W_Z*^_`!`\`@``
+M)$(``"2$+#``0/@))`8`!B0"``&/OP`0``````/@``@GO0`8)[W_Z*^_`!`D
+M@RP\/`(``"1"````H"`E`&`H)0!`^`DD!@`&C[\`$``````#X``()[T`&">]
+M_^"OOP`8K[$`%*^P`!``@(`E/`(``"1"```F!"P\`$#X"20&``:2`RP\D@(L
+M/0```````A(``&(8)9("+#X```````(4``!B&"62!BP_```````&-@`\$0``
+M)C$```(`("4T!8#@`B#X"0!F,"62`BQ`D@8L00``````!C(``@`@)30%@.0"
+M(/@)`$8P)20"``&/OP`8C[$`%(^P`!`#X``()[T`(#"E__^4@@((`````!!%
+M``<D`P`,E((2<@`````P0@"`%$```B0#``LD`P`#$,```@````"LPP```^``
+M"```$"4`@!@EE((2A@`````00``&```H)92"$G8`````%$```B0%``$D!0!#
+ME((2B@`````00``"`````#2E``24@A*,`````!!```H`````E&,!RB0"#A$0
+M8@`&`````)2"$G@`````%$```C2E``@TI0`@`^``"`"@$"4GO?_@K[\`'*^R
+M`!BOL0`4K[``$`"`@"66`A)(`````#!#`!P``Y"",$(``@`"B"N.`@&L````
+M``!`^`D"0"@E/`(``"1"```"`"`E`$#X"30%F``\`P``)&,```(`("4T!9@`
+M`&#X"31&(`".`@&P`@`@)0!`^`D"0"@E$%$``BXF``$"(#`EC@(!N`(`("4`
+M0/@)`D`H)8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`8K[$`%*^P
+M`!``@(@E`*"`)3P"```D0@```$#X"20%0!`\`__Q-&/_GP!#$"0\`P``)&-.
+MD#(0``<`$("``@.`(8X&```\`P``)&,```(@("4D!4`0`&#X"0!&,"6/OP`8
+MC[$`%(^P`!`#X``()[T`(">]_^"OOP`<K[(`&*^Q`!2OL``0`("`)3#2__\\
+M`@``)$(``"8$+#8`0/@))`8`!I(#+#:2`BPW```````"$@``8A@ED@(L.```
+M`````A0``&(8)9(&+#D```````8V`#P1```F,0```@`@)30%@`@"(/@)`&8P
+M)9(&+#J2`BP[```````"$@``PC`E,E(__P`2E``"`"`E-`6`#`(@^`D`TC`E
+MC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_V*^_`"2OM``@K[,`'*^R`!BO
+ML0`4K[``$`"`H"4\$@``)E(```)`^`DT!8!,`$"8)0*`("4"0/@)-`6`4`!`
+M@"4"@"`E`D#X"30%@$P`4Y@K`A.`(0(`B"4``(`E`!&`````B"4`0!@E```0
+M)0("$"4"(Q@EC[\`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_H
+MK[\`$#P"```D0@```$#X"30%@$R/OP`0``````/@``@GO0`8)[W_X*^_`!RO
+ML@`8K[$`%*^P`!``@)`E/`(``"1"````0/@)-`6`(#P#`0``0X@E/!```"80
+M```"0"`E-`6`(`(`^`D"(#`E`D`@)30%@"`"`/@)`B`P)8^_`!R/L@`8C[$`
+M%(^P`!`#X``()[T`(">]_^"OOP`8K[$`%*^P`!``@(@ECB(2-``````00``U
+M`````)1"``(`````,$(`(!!``#```"`EC*(````````00``1``"`)22F``0`
+M0"@E`,00(9!#````````,&(`@!!```4P8P!_`'`0*Q1```(``````&"`)22$
+M``$`A1`K%$#_]`#$$"$\`@``)$(```(@("4`0/@)-`6`!!(```T`0!@E`!`0
+M0BQ"``,00``)/`(``#P&`@`D0@```B`@)30%@`0`0/@)`&8P)1````D`````
+M/`;]_S3&__\\`@``)$(```(@("4T!8`$`$#X"0!F,"2/OP`8C[$`%(^P`!`#
+MX``()[T`(">]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`F"4\`@``)$(```!`
+M^`DT!9AD``*4PC)2`?\R0@$`$$```SP1```Z4@'_`!*0)R8Q```"8"`E`B#X
+M"30%@%``0(`E`F`@)0(@^`DT!8!,`@*`)@(2$":/OP`@C[,`'(^R`!B/L0`4
+MC[``$`/@``@GO0`H)[W_Z*^_`!2OL``0`("`)3P"```D0@```$#X"20%0"`P
+M0P#_``,9`C!$``^.`@',`````!1#``8``"@EE@(!T``````41``#`*`0)20%
+M``$`H!`EC[\`%(^P`!`#X``()[T`&">]_^"OOP`<K[(`&*^Q`!2OL``0`("0
+M)0"@@"4\$0``)C$```(@^`DT!8"0C@,`````````0Q`AK@(```)`("4"(/@)
+M-`6`C(X#``0``````$,0(:X"``0"0"`E`B#X"30%@)2.`P`,``````!#$"&N
+M`@`,`D`@)0(@^`DT!8"(C@,`"```````0Q`AK@(`"`)`("4"(/@)-`6`F(X#
+M`!```````$,0(:X"`!"/OP`<C[(`&(^Q`!2/L``0`^``"">]`"`#X``()`(`
+M`2>]_^BOOP`0/`(``"1"````0/@)-`6<'#!"`/^/OP`0``````/@``@GO0`8
+M)[W_Z*^_`!`\`@``)$(```!`^`DT!8!8,$(`!X^_`!```````^``"">]`!@G
+MO?_HK[\`$#"F``<\`@``)$(```!`^`DT!8!8C[\`$``````#X``()[T`&(R"
+M+[P``````^``"``````GO?_HK[\`$(R&$C0`````%,```R0"``$0```%K(4O
+MO#P"```D0@```$#X"0````"/OP`0``````/@``@GO0`8`^``""0"``$GO?_@
+MK[\`'*^R`!BOL0`4K[``$`"`B"4`H(`E+@(`!A1```@"()`E/`(``"1"````
+M0/@)-`7__P!0$"L00``%`B`@)20"__^N0B_X$```#0``$"4\`@``)$(```!`
+M^`D"`"@E/`,``"1C```"("`E)`40<`!@^`D`0#`EKE`O^"0"``&/OP`<C[(`
+M&(^Q`!2/L``0`^``"">]`"`GO?_HK[\`%*^P`!``@(`E/`(``"1"````0/@)
+M)`40<#P#```D8P```@`@)0!@^`DP1?__C[\`%(^P`!`#X``()[T`&">]_]BO
+MOP`@K[,`'*^R`!BOL0`4K[``$`"`B"4`H)`E`B"8)3P"```D0@```$#X"20%
+M/_\`4A`K$$``!0(@("4D`O__KF(O_!```!8``!`E/`(``"1"````0/@)-`6`
+M%`!`@"4\`@``)$(```(@("4`0/@)`D`H)20#P``"`X`D,$(__SP#```D8P``
+M`B`@)30%@!0`8/@)`@(P):YR+_PD`@`!C[\`((^S`!R/L@`8C[$`%(^P`!`#
+MX``()[T`*">]_^BOOP`4K[``$`"`@"4\`@``)$(```!`^`DT!8`4/`,``"1C
+M```"`"`E`&#X"3!%/_^/OP`4C[``$`/@``@GO0`8D((OS``````X0@`!`^``
+M"#!"``$GO?_@K[\`'*^R`!BOL0`4K[``$`"`D"40H``2`D"()3P"```D0@``
+M`$#X"30%@`0\$/[_-A#__SP#```D8P```B`@)30%@`0`8/@)`%`P)(XB+\P`
+M`````%`0)!```!&N(B_,/`(``"1"```"0"`E`$#X"30%@`0\$`$`/`,``"1C
+M```"0"`E-`6`!`!@^`D`4#`ECB(OS```````4!`EKB(OS"0"``&/OP`<C[(`
+M&(^Q`!2/L``0`^``"">]`"`GO?_8K[\`(*^S`!ROL@`8K[$`%*^P`!``@(@E
+M`*"0)0(@F"4\`@``)$(```!`^`DD!3__`%(0*Q!```4"("`E)`+__ZYB,``0
+M```9```0)3P"```D0@```$#X"30%@!0`0(`E/`(``"1"```"("`E`$#X"0)`
+M*"4\`\``-&/__P(#@"0``A0`/`,__P!#$"0\`P``)&,```(@("4T!8`4`&#X
+M"0(","6N<C``)`(``8^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_H
+MK[\`%*^P`!``@(`E/`(``"1"````0/@)-`6`%``"+`(\`@``)$(```(`("4`
+M0/@),*4__X^_`!2/L``0`^``"">]`!@GO?_8K[\`)*^T`""OLP`<K[(`&*^Q
+M`!2OL``0`("0)0#`H"4PL?__`D"8)2XC`(`08``-)`(`##P0```F$```)`4$
+M``(`^`D"(#`E`D`@)20%!`0"`/@)`!0P*P(S$"&@5"\X```0)8^_`"2/M``@
+MC[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_V*^_`""OLP`<K[(`&*^Q`!2O
+ML``0`("8)3"P`/\0P`!.HG`2.#("`/\00`!+)`,!0(YB$C0`````E$(``@``
+M```P0@%`%$,`1#P"```D0@```$#X"20%``$`0"@ECF(2-`````"40@`"````
+M`#!"0``00``+``480@(#`!@``#`2``800`#","$DQ@$$``"0$@!2$"$``A!`
+M$```&R12#:R.8A(T`````)1"``(`````,$*``!!```L`!1B"`@,`&```,!(`
+M!A!``,(P(23&`-(``)`2`%(0(0`"$$`0```*)%(-2`(%`!@``#`2``800`#"
+M,"$DQ@%H``"0$@!2$"$``A!`)%(.8`(%`!@``(`2`!`00`("@"$F$`/H,A`_
+M_SP1```F,0```F`@)0(@^`DD!1!P`F`@)20%$+`"(/@)`D`P)0`0-``"8"`E
+M-`6`%`(@^`D`T#`EC[\`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`*">]_^BO
+MOP`0/`(``"1"``",A0'<`$#X"0````"/OP`0``````/@``@GO0`8)`,`!A"C
+M``P``!`ED((2DP`````00``'```8)8R"+^@`````+$(``A!```(`````)`,`
+M`0!@$"4#X``(`````">]_^"OOP`<K[(`&*^Q`!2OL``0/`(``"1"````0/@)
+M`("0)1!``'D\`@``)$(```)`("4T!9AP`$#X"20&`!^60@'4`````#!"`/`D
+M0O_0+$(`0!1```(D!@`4)`8`&#P1```F,0```D`@)0(@^`DT!9GX/!```"80
+M```"0"`E`@#X"30%@!PD`\!_`$,0)`)`("4T!8`<`B#X"31&`(`"0"`E-`6!
+M!`(@^`DD!@`]`D`@)0(`^`DD!4`0`D`@)20%0!`"(/@)-$8``HY$`<P`````
+M.(,`!RQC``$X@@`++$(``0!B&"448``,)`,`"A"#``HD`@`)$((`"3P0```4
+M@P`B`````)9"`=``````+$(`!!!``!XF$```/!```"80```"0"`E-`68=`(`
+M^`DD!@`F`D`@)30%F'@"`/@))`8`#0)`("4T!9GP`@#X"20&``<"0"`E-`69
+M]`(`^`DD!@`_/`(``"1"```"0"`E`$#X"20%0!`\`_S_-&/__P!#$"00```;
+M/`8"`"80```"0"`E-`68=`(`^`DD!@`*`D`@)30%F'@"`/@))`8`#`)`("4T
+M!9GP`@#X"20&``,"0"`E-`69]`(`^`DD!@`@/`(``"1"```"0"`E`$#X"20%
+M0!`\`_S_-&/__P!#$"0\!@,``D`@)20%0!`"`/@)`$8P)1```$L`````/!$`
+M`"8Q```"0"`E`B#X"20%0!`\!OS_-,;__SP0```F$````D`@)20%0!`"`/@)
+M`$8P)`)`("4"(/@))`5`$"0&__T"0"`E)`5`$`(`^`D`1C`D`D`@)30%F'`"
+M`/@))`8`'P)`("4T!9AT`@#X"20&`'\"0"`E-`68>`(`^`DD!@`.`D`@)30%
+MF?`"`/@))`8`#`)`("4T!9GT`@#X"20&`/^60@'4`````#!"`/`D0O_0+$(`
+M0!1```(D!@`.)`8`$CP"```D0@```D`@)0!`^`DT!9GX/`(``"1"```"0"`E
+M`$#X"30%@!PD`\!_`$,8))9"`=0`````,$(`\"1"_]`L0@!`%$```C1F$X`T
+M9@^`/`(``"1"```"0"`E`$#X"30%@!R/OP`<C[(`&(^Q`!2/L``0`^``"">]
+M`"`GO?_@K[\`'*^R`!BOL0`4K[``$#P"```D0@```$#X"0"`D"400`!,/!$`
+M`"8Q```"0"`E`B#X"20%0!`\!OS_-,;__SP0```F$````D`@)20%0!`"`/@)
+M`$8P)`)`("4"(/@))`5`$"0&__T"0"`E)`5`$`(`^`D`1C`D`D`@)30%@00"
+M`/@))`8``0)`("4"(/@)-`6`'"0#P'\`0Q@DED(!U``````P0@#P)$+_T"Q"
+M`$`40``"-&83@#1F#X`\$```)A````)`("4"`/@)-`6`'`)`("4T!9AP`@#X
+M"20&`!\"0"`E-`68=`(`^`DD!@!_`D`@)30%F'@"`/@))`8`#@)`("4T!9GP
+M`@#X"20&``P"0"`E-`69]`(`^`DD!@#_ED(!U``````P0@#P)$+_T"Q"`$`4
+M0``")`8`%"0&`!@\`@``)$(```)`("4`0/@)-`69^(^_`!R/L@`8C[$`%(^P
+M`!`#X``()[T`(#P"``"4HP``E$).L```````0Q`K%$``#```("4\`@``)$-.
+ML)2E```DA``!``00@`!#$"&40@````````!%$"L00/_Y`````#P"```D0DZP
+M``08@`!#$"&$0@`"``````/@``@`````)[W_X*^_`!BOL0`4K[``$`#`@"4`
+MX(@E`(`P)22C__\L8@`=$$``VR2'`>`\`@``)$).X``#&(``8A@AC&(`````
+M````0``(`````"0"``(2`@`.+@(``A1``-,``!`E+@(`!!1``-`D`@`-+@(`
+M!A1``,T``!`E)`(`?Q("``L`````$```R"0"``V,X@``/`,`!`!#$"000``"
+M)`,`#0``&"40``#``&`0)1```+X``!`E$@``O```$"4D`@`!%@(`!P````",
+MPB_,```````"%L(X0@`!$```LS!"``$2```&`````"0"``$2`@`(`````!``
+M`*PD`@`,C.(``````````A3"$```IS!"``&,PB_0```````"$((0``"B,$(`
+M`8R#`<P`````+&(`!A!``)T``!`E)`(`!11B`)HD`@`-E((!T``````L0@`(
+M$$```P`````0``"3)`(`#1```)$``!`E$@``CP``$"4D`P`!%@,`C"0"``P\
+M`@``)$(```!`^`DT!:((``(30CA"``$0``"$,$(``8R"`?@`````KB(``!``
+M`'\``!`E$@``?0``$"4D`P`!%@,`>@````",PB_<$```=RQ"``$2```&````
+M`"0"``$2`@`&`````!```'``````E,(2AA```&TL0@`!E,(2C``````40`!I
+M```0)93#$HH`````$&``920"``$0``!C```0)1(``&$``!`E)`,``18#`%XD
+M`@`,C,(OS````````A?"$```63A"``$2```%)`(``1("``L`````$```4R0"
+M``R,X@```````#!""``00``")`,`#0``&"40``!+`&`0)8S"+]````````(0
+MPCA"``$0``!%,$(``8S"+^``````,$(`/ZXB```0```_```0)8S"+^``````
+M,$(_```"$@*N(@``$```.```$"4D`@`!$@(`"``````2```S```0)2X#``<0
+M8``P)`(`#!````8\`@``C,(P&``````X0@`!$```*3!"``$D0@```$#X"0``
+M````0"`E$(``(R0"``$F`__^+&(`!1!``!\``!`E/`(``"1"3U@``QB``&(8
+M(8QB`````````$``"`````"0@@`)$```#:XB``"0@@`,$```"JXB``"0@@`-
+M$```!ZXB``"0@@`+$```!*XB``"0@@`*`````*XB```0```&```0)3P"```D
+M0@```@`P)0!`^`D"(#@EC[\`&(^Q`!2/L``0`^``"">]`"`GO?_8K[\`(*^Q
+M`!ROL``8`("()0#@@"4"($`E)*/__BQB`!P00`":)B0!X#P"```D0D^(``,8
+M@`!B&"&,8@````````!```@`````$@``!CP#"`"-`B_,``````!#$"40```&
+MK0(OS(T"+\P\`_?_-&/__P!#$"2M`B_,$```C"0"``&,@P``/`(`"`!B&"00
+M8`"'```0)1(```8D`__[C0(OT```````0Q`D$```!:T"+]"-`B_0`````#1"
+M``2M`B_0/`(``"1"```"("`EC08OT`!`^`DT!8$@$```="0"``$\`@``)$(`
+M``(@("4`0/@)-`6B"!(```,`0#`E$````S3&(``D`M__`,(P)#P"```D0@``
+M`B`@)0!`^`DT!:(($```8B0"``&N,`'X/`(``"1"```"("`E-`6`2`!`^`D"
+M`#`E$```620"``$`$!`KK0(OW!```%4D`@`!$@``!CP#@`"-`B_,``````!#
+M$"40```&K0(OS(T"+\P\`W__-&/__P!#$"2M`B_,$```1R0"``&%`B_T````
+M``("@"$N`@!`%$```B0"`!HD$``_%*(`!S("/P"-`B_@``````("$"4P0@`_
+M$```!ZT"+^"-`R_@`````#!C/P```A("`$,0):T"+^`\`@``)$(```(@("6-
+M!B_@`$#X"30%@.@0```J)`(``2S"``<00``G```0)3P"```D0D]L``88@`!B
+M&"$\`@``)$(```(@("6,90```$#X"0(`,"40```;`````(R"````````,$((
+M`!!```X`````$@``!B0#__>-`B_0`````#1"``@0```%K0(OT(T"+]``````
+M`$,0)*T"+]`0```))`(``8^B`#@`````KZ(`$#P"```D0@```B`@)0!`^`D"
+M`#@EC[\`((^Q`!R/L``8`^``"">]`"@GO?_@K[\`&(^B`#"/HP`T`````*^B
+M`!`\`@``)$(```!`^`FOHP`4``(0*X^_`!@``````^``"">]`"``````````
+M```````GO?_0K[\`+*^V`"BOM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!`0H``Q
+M`("()3P"```D0@```$#X"20%0`0\!O_\-,;__SP#```D8P```B`@)20%0`0`
+M8/@)`$8P)#P"```D0@```$#X"20$``HD$``H/`(``"12```\%@`!/`(``"15
+M```\%/_\-I3__SP"```0```+)%,```*@^`DD!``R`B`@)0)`^`DD!4`$`B`@
+M)20%0`0"8/@)`%0P)"80__\2```(`B`@)0)`^`DD!4`0`%80)!1`__``````
+M%@```P`````0```/```0)3P"```D0@```B`@)0!`^`DT!8`$/`;_^S3&__\\
+M`P``)&,```(@("4T!8`$`&#X"0!&,"0D`@`!C[\`+(^V`"B/M0`DC[0`((^S
+M`!R/L@`8C[$`%(^P`!`#X``()[T`,">]_]BOOP`@K[,`'*^R`!BOL0`4K[``
+M$`"`B"4`H(`E/`(``"12```"0/@)-`6`!#P&``0\`P``)',```(@("4T!8`$
+M`F#X"0!&,"42```+`B`@)0)`^`DD!4`$/`/__#1C__\`0Q`D/`8``0(@("4D
+M!4`$`F#X"0!&,"6/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_V*^_
+M`""OLP`<K[(`&*^Q`!2OL``0`("()0"@@"4\`@``)%(```)`^`DT!8`$/`8`
+M!#P#```D<P```B`@)30%@`0"8/@)`$8P)1(```L"("`E`D#X"20%0`0\`__\
+M-&/__P!#$"0\!@`"`B`@)20%0`0"8/@)`$8P)8^_`""/LP`<C[(`&(^Q`!2/
+ML``0`^``"">]`"@GO?_@K[\`'*^R`!BOL0`4K[``$`"@B"4`P"@E)!```1(P
+M``T`@)`E$B``!CP"``(D`@`"$B(`#@``$"40```2`````"1"@D``0/@)````
+M`!````L`0(`E/`(``B1"@XP`0/@)`````!````:N42^X/`(``B1"A"0`0/@)
+M`````*Y1+[@"`!`EC[\`'(^R`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_`!`\
+M`@``)$(```!`^`DD!4`$``(4`C!"``./OP`0``````/@``@GO0`8`````">]
+M_^BOOP`4)`(`"!"B`#ROL``0+*(`"1!```\D`@$`)`(``A"B`#DLH@`#$$``
+M!B0"``0D`@`!$*(`%@``$"40```_`````!"B`"H``!`E$```.P`````0H@`R
+M+*(!`1!```8D`@(`)`(`(!"B`"H``!`E$```,@`````0H@`0)`($`!"B`!@`
+M`!`E$```+``````\`@``)%```(R"$C0`````$$``(0````"40@`"`````#!"
+M0``00``$`````#P"```0```9)%```(R"$C0`````E$(``@`````P0H``$$``
+M$SP"```\`@``$```#R10```\`@``$```#"10```\`@``$```"210```\`@``
+M$```!B10```\`@``$````R10```\`@``)%```#P"```D0@```$#X"0(`*"4"
+M`!`EC[\`%(^P`!`#X``()[T`&">]_^BOOP`0/`(``"1"````0/@))`4`#(^_
+M`!```````^``"">]`!@GO?_HK[\`$`"@,"4\`@``)$(```!`^`DD!0`,C[\`
+M$``````#X``()[T`&">]_^BOOP`0/`(``"1"```D!0`(`$#X"20&``2/OP`0
+M``````/@``@GO0`8)[W_Z*^_`!2OL``0`("`)3P"```D0@``)`4`"`!`^`DD
+M!@`@/`(``"1"```"`"`E)`4`""0&``0`0/@)```X)0`"$"N/OP`4C[``$`/@
+M``@GO0`8)[W_Z*^_`!2OL``0`("`)3P"```D0@```$#X"30%@$@D!O_?/`,`
+M`"1C```"`"`E-`6`2`!@^`D`1C`D/`(``"1"````0/@)`@`@)3P"```D0@``
+M`@`@)0!`^`DD!0`!C[\`%(^P`!`#X``()[T`&">]_^BOOP`4K[``$`"`@"4\
+M`@``)$(```!`^`DT!8!(/`,``"1C```"`"`E-`6`2`!@^`DT1@`@/`(``"1"
+M````0/@)`@`@)8^_`!2/L``0`^``"">]`!@GO?_@K[\`'*^R`!BOL0`4K[``
+M$`"`B"4`H!`E`,"0)3P0```F$```-`6`0`(`^`D`0#`E`B`@)30%@$0"`/@)
+M`D`P)8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`8K[$`%*^P`!``
+M@(@E`*"`)2X#`$`08``A```0)2X"`"`40``0/`(``"1"````0/@)-`6`1"8#
+M_^`D!@`!`&8P!``&,"<\`P``)&,```(@("4T!8!$`&#X"0!&,"00```/)`(`
+M`21"```"("`E`$#X"30%@$`D!@`!`@8P!``&,"<\`P``)&,```(@("4T!8!`
+M`&#X"0!&,"0D`@`!C[\`&(^Q`!2/L``0`^``"">]`"`GO?_@K[\`&*^Q`!2O
+ML``0`("()0"@@"4N`P!`$&``'P``$"4N`@`@%$``#SP"```D0@```$#X"30%
+M@$0F`__@)`8``0!F,`0\`P``)&,```(@("4T!8!$`&#X"0!&,"40```.)`(`
+M`21"```"("`E`$#X"30%@$`D!@`!`@8P!#P#```D8P```B`@)30%@$``8/@)
+M`$8P)20"``&/OP`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`<K[(`&*^Q`!2O
+ML``0`("()3P0```F$````@#X"30%@#P`0)`E`B`@)0(`^`DT!8$,`$`8)3!B
+M`"`00``"/`("`C92`@``8A`D$$```P)`$"4V4@$``D`0)8^_`!R/L@`8C[$`
+M%(^P`!`#X``()[T`(">]_^"OOP`<K[(`&*^Q`!2OL``0`("0)0"@B"4\`@``
+M)$(``#0%@#P`0/@),B8`_S(B`@`00``"``"`)200`"`R(@$`$$```CP"`@("
+M`H`E/`(``"11```"0"`E-`6!#`(@^`D"`#`E$@``"SP"```D0@```D`@)0!`
+M^`DD!0`T`D`@)20%`#0"(/@)-$8`$!````P`````)$(```)`("4`0/@))`4`
+M-"0&_^\\`P``)&,```)`("4D!0`T`&#X"0!&,"2/OP`<C[(`&(^Q`!2/L``0
+M`^``"">]`""HH``(N*``"S#&#_^HI@`,N*8`#S#G`"`0X``'`````(BB``R8
+MH@`/`````#1"(`"HH@`,N*(`#ZB@`!2XH``7B*(`%)BB`!<`````J*(`$+BB
+M`!,#X``()`(``2>]_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`F"4`P)`EC[$`
+M0```````H(`EB@,`%)H#`!<`````,&,``1!@`(@D`@`/B.(`%)CB`!<`````
+M,$(``11```8\`@``)$(```!`^`DD!0`,$%(`?20"``^*`@`0F@(`$P`````P
+M0@__IB(``(H"`!2:`@`7```````"%`(P0G__IB(``J(@``2*`@`0F@(`$P``
+M`````A4",$(`_Z(B``8``A8```(6`R0#_X`40P`"`````*(@``:*`@`4F@(`
+M%P`````P0@$`$$``""0"`/^*`@`4F@(`%P`````P0OX```(20A````*B(@`'
+MHB(`!XH"`!":`@`3```````"$\(P0@`?HB(`"(H"`!":`@`3```````"%P*B
+M(@`)B@(`$)H"`!,```````(3`C!"``&B(@`*B@(`%)H"`!<`````,$(``A1`
+M`$```!`EB@(`%)H"`!<`````,$(`!!!```8`````DB(`!``````T0@`!$```
+M-*(B``2*`@`4F@(`%P`````P0@`0$$``&0````"2(@`$`````#1"``*B(@`$
+MB@(`%)H"`!<`````,$+_```"$@*B(@`%CF,P'``````L8P`!.$(`!0`"$"L`
+M8A@D$&``'#P"```D0@```F`@)0!`^`D"("@E$```%P``$"6*`@`4F@(`%P``
+M```P0@`($$``!@````"2(@`$`````#1"``@0```+HB(`!(H"`!2:`@`7````
+M`#!"`"`00``&```0)9(B``0`````-$(`$*(B``0``!`EC[\`((^S`!R/L@`8
+MC[$`%(^P`!`#X``()[T`*``````GO?^@K[\`7*^^`%BOMP!4K[8`4*^U`$RO
+MM`!(K[,`1*^R`$"OL0`\K[``.`"`D"6OI0!D`,"X):^G`&P"0)@EEN(``@``
+M`````A'",$,``9;B``(`````,$(!`!!```4``*`E%&`$B20#``P0```(````
+M`);B``(```````(1PCA"``$P0@`!%$`$@"0#``R6X@`"```````"$8(P0P`!
+MEN(``@`````P0@`@$$``!0`````48`1U)`,`#!````D\`@``EN(``@``````
+M`A&".$(``3!"``$40`1L)`,`##P"```D0@```D`@)0``*"4`0/@))`8``1!`
+M!&L"0"`E/`(``"1"````0/@)`N`H)0!`J"42H`1=)`,`#"0"``:/HP!D````
+M`!!B``PL8@`'$$``!B0"``@L8@`"$$`$4R0#``P0```%`````(^D`&0`````
+M%(($320#``R/I0!L`````!"@`!(\`@``)$(```)`("4`0/@))`410*^B`"`\
+M`@``)$(```)`("4`0/@)`J`H)3P"```D0@```D`@)0!`^`D``"@E$````@``
+M``"OH``@CD0!S``````X@P`'+&,``3B"``LL0@`!`&(8)11@``PD`P`*$(,`
+M"B0"``D0@@`(`````!2#`"$\`@``ED(!T``````L0@`$$$``'#P"``"/H@!L
+M`````!!``!@\`@``CD02-``````0@``5)$(``);C``"4@@```````!!B``\\
+M`@``EN,``I2"``(P8P'P,$(!\!1B``D\`@``/`(``"1"```"0"`E`$#X"0+@
+M*"440`00)`(``3P"```D0@```D`@)0!`^`DT!8!8%$```Z^B`"0D`P`!KZ,`
+M)#P0```F$````D`@)0(`^`DT!8`$/`,"(`!#$"2OH@`L`D`@)0(`^`DD!4`0
+M/`,`_C1C`&``0Q`DKZ(`*`)`("4"`/@))`5`%*^B`!@"0"`E`@#X"20%0!BO
+MH@`</`(``"1"``"/I0!D`$#X"0)`("4\`@``)$(```!`^`D"0"`E/`(``"1"
+M```"0"`E`$#X"0+@*"400`/9)`,``Y;B``(`````,$,!\"0"`4`08@`@*&(!
+M01!```\D`@C`)`(`P!!B`"8H8@#!$$``!B0"`-`D`@"@$&(`'P`````0``/'
+M)`,`#!!B`"(D`P`,$``#PP`````08@`9*&((P1!```8D`@E`)`(!4!!B``TD
+M`P`,$``#N@`````08@`%)`()4!!B``<D`P`,$``#M``````D!``!KZ0`,!``
+M`!&OI``T)`4``J^E`#`D`@`!$```#*^B`#00```')`,``R0%``2OI0`P)`(`
+M`A````6OH@`T)`,`!:^C`#`D!``"KZ0`-#P"```D0@```D`@)30%F```0/@)
+M)`8`!P``@"4\`@``)%%0`#P"```D7@``/`(``"16````$!!``%`0(0`"&,``
+M<1@A``(00(^E`#```````$40(0`"$(``41`AC&4``(Q&```#P/@)`D`@)2:4
+M``$R@@`_%$```P`````"P/@))`0``280``$N`@`9%$#_Z@`0$$```(`E/`(`
+M`"114E@\`@``)%X``#P"```D5@```!`0P`!1$"&,10```````(^B`&P`````
+M$$``#@`0$,`\!/__-(1_X`"D&"$L8P`9.&,``3P$__\TA'\L`*00(2Q"``DX
+M0@`!`&(8)!!@``L`$!#``%$0(8Q&``0#P/@)`D`@)2:4``$R@@`_%$```P``
+M```"P/@))`0``280``$N`@#$%$#_WP`0$,".8BRL`D`@)8^E`#"/I@`T`$#X
+M"0*`."66X@`"`````#!"P``00``%/`(``"1"```"0"`E`$#X"0+@*"660@'2
+M`````"Q"`$(40`!8/`(``"1"```"0"`E-`68+#P&``(`0/@)-,:@`I;C```D
+M`@FT%&(`#SP"9F:28A*2EF,2G```````0Q`C/`-F9C1C9F<`0P`8```8$``#
+M&$,``A?#`&(8(P`#'``0```*``,D`Y)C$I(T0F9G`&(`&```$!```A!#``,?
+MPP!#$",``A0```(D`Y;B``(`````,$(`T"0#`,`40P`2/`(``))F$I(`````
+M``8P(P`&,8`PQ@_```08(P`#'(`\`@#\`&(8)#P"```D0@```D`@)30%F4P`
+M0/@)`,,P)1````<\$```)$(```)`("4T!9E,`$#X"0``,"4\$```)A````)`
+M("4"`/@)-`6B*"0&_?\\$0``)C$```)`("4T!:(H`B#X"0!&,"0"0"`E`@#X
+M"30%HB@\`__^-&,#_P!#$"0"0"`E-`6B*`(@^`DT1@@``D`@)30%@&`"(/@)
+M)`8`#Y9"`=(`````+$(`0Q1```<\`@``)$(```)`("4T!:)4`$#X"0``,"4\
+M`@``)$(```)`("4T!9AX`$#X"20&``Z.0P',)`0`"A!D``HD`@`)$&(`"```
+M```49``;/`(``)9"`=``````+$(`!!!``!8\`@``EN(````````X0PF>+&,`
+M`3A"":,L0@`!`&(8)3AP``$\`@``)$(```)`("4`0/@)-`6B3!!0``8\`@``
+M)$(```)`("4T!:),`$#X"0(`,"4\`@``)$(```)`("4"H"@E`$#X"2>F`!`0
+M0`*M)`,``R0"``:/HP!D`````!!B``@`````CD("!``````00``$/`(``"1"
+M````0/@)`D`@)8YB++@"0"`E`J`H)8^C`#``````,&;__P!`^`DGIP`0$$`"
+MER0#``.6X@`"`````#!"`$`00``B)`0`"HY#`<P`````$&0`#R0"``D08@`-
+M`````!1D``8`````ED(!T``````L0@`$%$``!@````"68A)P`````"Q"4`,4
+M0``,/`(``);B``(`````,$(`H"0#`*`00P`%/`(``"1"```"0"`E`$#X"0*@
+M*"4\`@``)$(```)`("4`0/@)`N`H)3P"```D0@```D`@)0!`^`D"H"@E$$`"
+M:B0#``./I`!L`````!"```8\`@``)$(```)`("6/I@`@`$#X"20%$4"28RPP
+MDF(L,0```````A(``&(8)9)B+#(```````(4``!B&"629BPS```````&-@`\
+M$```)A````)`("4T!8```@#X"0!F,"629BPTDF(L-0```````A(``,(P)8^E
+M`"P``````,4P)8YB+\P``````,(P)3P"`(`"0"`E-`6`!`(`^`D`PC`E/`(`
+M`"1"``"/I0!D`$#X"0)`("628RP\DF(L/0```````A(``&(8)9)B+#X`````
+M``(4``!B&"629BP_```````&-@`"0"`E-`6`X`(`^`D`9C`EDF(L0))F+$$`
+M``````8R``)`("4T!8#D`@#X"0!&,"4\`@``)$(```)`("4`0/@))`5`$`)`
+M("4D!4`0CZ,`*`(`^`D`0S`E`D`@)8^F`!@"`/@))`5`%`)`("6/I@`<`@#X
+M"20%0!@"0"`ECZ8`)`(`^`DT!8!8DF,L-I)B+#<```````(2``!B&"628BPX
+M```````"%```8A@EDF8L.0``````!C8``D`@)30%@`@"`/@)`&8P)9)B+#J2
+M9BP[```````&,@`"0"`E-`6`#`(`^`D`1C`E`D`@)8YF+]0"`/@)-`6`&`)`
+M("4D!0"``@#X"20&__\\`@``)$(```)`("4`0/@)`J`H)1!``>4D`P`#/`(`
+M`"1"```"0"`EDD42.`!`^`DD!@`!/`(``"1"```"0"`E`$#X"0+@*"660@'4
+M`````#!"`/`D0O_0+$(`0!!``!L\`@``CD,2-`````",8@```````#!"P``0
+M0``3/`(``)1P``(`````,A!``"X0``$F$``,)$(```)`("4`0/@)-`68)"0#
+M__``0Q`D,A``#SP#```D8P```D`@)30%F"0`8/@)`%`P)3P"```D0@```D`@
+M)0!`^`DT!9D4,%`__Y;B``(`````,$(`(!!```D`$!"`/`.Z+C1CBZ,`0P`9
+M```0$```````````$```!P`"@0(\`LS,-$+,S0("`!D``!`0``*`P@`````\
+M`@``)$(```)`("4T!9@<`$#X"20&``&.0A(T`````)1"``(`````,$)``!1`
+M``D`$"!`CD(2-`````"40@`"`````#!"@``00``(/`(````0((`\`@``)$(`
+M``!`^`DDA`!D$```!3P"```D0@```$#X"28$`&0\`@``)$(```)`("4`0/@)
+M-`68"`!`L"4\`@``)$(```)`("4T!9@(`$#X"20&.````(`E/`(``"14```\
+M`@``$````R11```"(/@))`0`R`(`$"4H0@`4$$``!R80``$"0"`E`H#X"30%
+MG"0P0@`0%$#_]0`````\`@``)%$```)`("4T!9@(`B#X"0+`,"4\`@``)%``
+M``)`("4"`/@)-`688`)`("4T!9A@`B#X"31&``.6X@`"`````#!"`*`D`P"@
+M$$,`%R0"``*.8R_``````!!B`!,``````D`@)0(`^`DT!9D@`D`@)30%F2`"
+M(/@)-$;P``)`("4"`/@)-`69(#P&``$"0"`E-`69(`(@^`D`1C`E)`(``1``
+M``*N8B_`KF`OP#P"```D0@```$#X"0)`("4``(`E)!0``3P"```D40```!`H
+M@`)`("4DI1```B#X"0(4,`0F$``!*@(`"A1`__D`$"B`KF!&H)9"`>@`````
+M$$``#```@"4\`@``)%$```)`("4"(/@)`@`H)280``&60@'H``````("$"H4
+M0/_Y`D`@)3P"``@T0@EEKF(L1"0"``:/HP!D`````!1B``0\$```/`(`"#1"
+M&66N8BQ$)A````)`("6.9BQ$`@#X"20%`*`\`@``)$(```)`("4`0/@))`4`
+MK#P&``<"0"`E)`4`K`(`^`D`1C`ECD(23``````00``$/`(``"1"````0/@)
+M`D`@)3P"```D0@```D`@)30%F&`D!@`!`$#X"0``."4\`@``)$(``(^E`&0`
+M0/@)`D`@)3P"```D0@```D`@)0!`^`DT!8`@/`;^?S3&__\\`P``)&,```)`
+M("4T!8`@`&#X"0!&,"2.0P',`````"QB``800``*/!```"0"``448@`2/`(`
+M`)9"`=``````+$(`"!1```T\`@``/!```"80```"0"`E-`6!&#P&``$"`/@)
+M-,8`J@)`("4T!8$<`@#X"20&,A`\`@``)$(```)`("4T!8$(`$#X"20&`%*6
+MX@`"`````#!"`0`00``%/`(``()F$HX`````$```!"1"``""9A*/`````"1"
+M```"0"`E`$#X"0+@*"4``A8```)&`XYB+^``````,$,`/X9E+_0``````&40
+M(X*D``8``````((0*Q!```(``````(48(8*B``4```````(00`!((",`@Q`K
+M$$``!`````"&8B_T``````""&"&.8B_@`````#!%/P``!2H"AF8O]```````
+MIA`C@J0`!@``````@A`K$$```@``````AB@A@J(`!0```````A!``$@@(P"%
+M$"L00``$`````(9B+_0``````((H(99F+^``````,,8`/X9G+_0``````,<0
+M(X*D``8``````((0*Q!```(``````(<P(8*B``4```````(00`!((",`AA`K
+M$$``!2QB`$"&8B_T``````"","$L8@!`%$```BRB`$`D`P`_%$```BS"`$`D
+M!0`_`````!1```(`````)`8`/S!C`#\`!1(`,$(_``!B&"4`!C0`/`(`/P#"
+M,"0\`@``)%````)`("4T!8#H`@#X"0!F,"6.9B_0`````!#```,"0"`E`@#X
+M"30%@2".92_X)`+__Q"B``0\`@``)$(```!`^`D"0"`ECF4O_"0"__\0H@`$
+M/`(``"1"````0/@)`D`@)8YE,``D`O__$*(`!#P"```D0@```$#X"0)`("6.
+M1@'X`````!#```4\`@``)$(```)`("4`0/@)-`6`2(^D`&0`````KD0!W(^E
+M`&P`````$*``,20"``&2HP`$`````#!B``(40``",&(`_J*B``26H@`"````
+M`*;B``*2H@`$`````*+B``22H@`%`````*+B``62H@`&`````*+B``:2H@`'
+M`````*+B``>.0A(T```@)0``*"6L1``PK$4`-#P"```D0@```$#X"0)`("6.
+M1!(T`````*R"`"BL@P`L/`(``"1"```"0"`E`$#X"20%``$0```()`(``8^E
+M`'``````C*(````````00``"```0):RC``"/OP!<C[X`6(^W`%2/M@!0C[4`
+M3(^T`$B/LP!$C[(`0(^Q`#R/L``X`^``"">]`&`GO?_@K[\`&*^Q`!2OL``0
+M`("()8XP`@0`````,@(``Q!```\\`@``)$(```!`^`DT!9E$/`/?_S1C__\`
+M0Q`D,@8``0`&-T`\`P``)&,```(@("4T!9E$`&#X"0!&,"4R`@`,$$``&P`"
+M$((P0@`!%$``#CP"```D0@```B`@)0!`^`DT!8#0)`;_XSP#```D8P```B`@
+M)30%@-``8/@)`$8P)!````L`````)$(```(@("4`0/@)-`6`T#P#```D8P``
+M`B`@)30%@-``8/@)-$8`'(^_`!B/L0`4C[``$`/@``@GO0`@)[W_Z*^_`!",
+M@BRT``````!`^`D```````(0*X^_`!```````^``"">]`!@GO?_(K[\`-*^V
+M`#"OM0`LK[0`**^S`"2OL@`@K[$`'*^P`!@`@(@E`*"H)204``$\`@``)$(`
+M``!`^`D"(+`E`$"0)0``@"4\`@``$````B13```F$``!EB(!Z``````"`A`K
+M$$``!@(@("4"8/@)`@`H)1!`__<```````"@)1*``*,``!`E/`(``"1"```"
+M("`E-`69?`!`^`DD!@`!``"`)3P"```D5```/`(``!````0D4P```F#X"20$
+M``4F$``!+@(`9!!```<"("`E`H#X"30%G"`00/_W+@(`9!1```,"("`E$```
+MB0``$"4\`@``)$(```!`^`D"0"@E$$``@P(@("4\`@``)$(```!`^`DT!9D4
+M,$,__Y9"``(`````,$(`(!!```D``Q"`/`.Z+C1CBZ,`0P`9```0$```````
+M````$```!P`"(0(\`LS,-$+,S0!B`!D``!`0``(@P@`````\`@``)$(```!`
+M^`DDA`!D/`(``"1"```"("`E`D`H)0!`^`DGI@`0$$``7P(@("4\`@``)$(`
+M`#0%F7P`0/@)```P)99"``(`````,$(`0!!``"(D!``*CB,!S``````09``/
+M)`(`"1!B``T`````%&0`!@````"6(@'0`````"Q"``040``&`````);"$G``
+M````+$)0`Q1```P\`@``EJ(``@`````P0@"@)`,`H!!#``4\`@``)$(```(@
+M("4`0/@)`D`H)3P"```D0@```B`@)0!`^`D"H"@E/`(``"1"```"("`E`$#X
+M"30%F&`\`P``)&,```(@("4T!9A@`&#X"31&``*20P`$`````#!B``(40``"
+M,&(`_J)"``260@`"`````*:B``*20@`$`````**B``220@`%`````**B``62
+M0@`&`````**B``:20@`'`````**B``>.(A(T```@)0``*"6L1``PK$4`-#P"
+M```D0@```$#X"0(@("6.)!(T`````*R"`"BL@P`L/`(``"1"```"("`E`$#X
+M"20%``$D`@`!C[\`-(^V`#"/M0`LC[0`*(^S`"2/L@`@C[$`'(^P`!@#X``(
+M)[T`.">]_^"OOP`8K[$`%*^P`!``@(@E`*"`)3P"```D0@```$#X"30%@`0\
+M`__\-&/__P!#&"0D`@`!$@(`,BH"``(00``%`````!(``!T\$```$```,P``
+M```D`@`&$@(`!20"``@2`@`G`````!```"P`````/`80`3P0```F$````B`@
+M)30%@`0"`/@)`&8P)3P"```D0@```B`@)0!`^`DD!0`4)`;_WP(@("4D!0`4
+M`@#X"0!&,"00```9`````#P&$`(F$````B`@)30%@`0"`/@)`&8P)3P"```D
+M0@```B`@)0!`^`DD!0`4`B`@)20%`!0"`/@)-$8`(!````@`````/`80`#P"
+M```D0@```B`@)30%@`0`0/@)`&8P)8^_`!B/L0`4C[``$`/@``@GO0`@)[W_
+MZ*^_`!`\`@`")$*NZ`!`^`DD!0`"C[\`$``````#X``()[T`&">]_^BOOP`4
+MK[``$`"`@"4\`@``)$(`````*"4`0/@))`8``1!```4"`"`E/`(``B1"KN@`
+M0/@))`4`$X^_`!2/L``0`^``"">]`!@GO?_0K[\`**^U`"2OM``@K[,`'*^R
+M`!BOL0`4K[``$`"`F"4`H(`E/`(``B1"KN@`0/@))`4`$Q!``+L"8"`E/`(`
+M`"1"`````"@E`$#X"20&``$00`"T`F`@)3P"``(D0J[H`$#X"0``*"400`"N
+M`````!(``*LD!``*CF,!S``````09``*)`(`"1!B``@`````%&0`$0````"6
+M8@'0`````"Q"``000``,`````)8#``(`````,&(`(!1```4D%0`(,&,`T"0"
+M`,`48@!`)!$`!!```#XD$0#KEF(!U``````P0@#P)$+_T"Q"`$`40``*````
+M`(YB`<P`````.$,`!RQC``$X0@`++$(``0!B&"408``8`````)8#``(`````
+M,&(`(!1```4D%0`(,&,`T"0"`,`48@`#`````!```",D$0#KE@(``@`````P
+M0D``%$``'B01`>J6`@`"`````#!"@``40``9)!$"ZA```!<D$0#JE@,``@``
+M```P8@`@%$``!0``J"4P8P#0)`(`P!1B``,`````$```#"01`*N6`@`"````
+M`#!"0``40``')!$!JI8"``(`````,$*``!1```(D$0*J)!$`JI8#``(`````
+M,&(`0!!```TP8@`@%$``!#!C`-`D`@#`%&(``P`````0```'-K4`!)8"``(`
+M````,$(`0!1```(`````-K4``98"``(`````,$(!`!1```(`````-K4``I8"
+M``(`````,$(`$!1```(D%``#``"@)3P"```D0@```F`@)0!`^`DT!9A\`$"0
+M)98#``(`````,&(`(!1```4\`@``,&,`T"0"`,`48@`5/`(``"10```"8"`E
+M-`68!`(`^`D"@#`E`F`@)30%H@`"`/@)`J`P)1)1`!X"8"`E-`68?`(`^`D"
+M(#`E/`(``"1"````0/@))`0!+!```!8D`@`!$E$`"21"```"8"`E-`68?`!`
+M^`D"(#`E/`(``"1"````0/@))`0!+#P0```F$````F`@)30%F`0"`/@)`H`P
+M)0)@("4T!:(``@#X"0*@,"4D`@`!C[\`*(^U`"2/M``@C[,`'(^R`!B/L0`4
+MC[``$`/@``@GO0`P)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`DK[0`(*^S`!RO
+ML@`8K[$`%*^P`!``@*`EKZ4`/`#`B"4"@+@E/`(``"1"````0/@)KB````!`
+MJ"42H`#W`````([C+\``````.&(``BQ"``$L8P`!`$,0)1!```(D`@`!KB(`
+M`([P+\`D`@`!%@(`?#P"```D0@```H`@)0!`^`DT!9D@/`,``0!#$"040`!T
+M``"0):[@+\"N,```/`(``"11```\`@``)%X```*`("4"(/@)-`6<$`!`F"4"
+M@"`E`B#X"30%G!0`0(`E`H`@)0(@^`DT!9P8`$"P)0`3$"L`$!@K`$,0)!1`
+M``X`$R("`H`@)0(@^`DT!9D@`H`@)30%F2`\`P`!`\#X"0!#,"4F4@`!*D(`
+M"A1`_^4"@"`E`!,B`@`0$@(`@B`A`!`IP@`$&"LHH@`".$(``0!B&"008`!K
+M`!80(P`"%@```I8#`D0`&@``$!(4@``"```````'``T`0)`E*D+_X!!```,J
+M0@`@$```!202_^``````%$```@`````D$@`?`F4`&P``$!(4H``"```````'
+M``TD4_^`*F+_\!!```,J8@`0$```!"03__`40``#/!$``"03``\\$0``)C$`
+M``*`("4"(/@)-`69("0#^!\`0Q`D`!(Q0##&!^`\$```)A````*`("4T!9D@
+M`@#X"0!&,"4"@"`E`B#X"30%F2`D`__@`$,0)#)F`!\"@"`E-`69(`(`^`D`
+M1C`E`H`@)0(@^`DT!9D@`H`@)30%F2`"`/@)-$8(`"0"``*NXB_`)`(``:ZB
+M`!"BL@`4$```):*S`!6/HP`\`````)1B``(`````,$(`H"0#`*`00P`=)`(`
+M`H[C+\``````%&(`&CP"``".H@`0`````!1``!4\$```)A````*`("4"`/@)
+M-`69(#P1```F,0```H`@)30%F2`"(/@)-$;P``*`("4"`/@)-`69(#P&``$"
+M@"`E-`69(`(@^`D`1C`E)`(``:[B+\`\`@``)$(```*`("4`0/@)`J`H)9:B
+M``(`````,$(``A1``#8\`@``)$(```*`("4`0/@)-`688#P#```D8P```H`@
+M)30%F&``8/@)-$8``H^B`#P`````E$4``@`````PH@$`%$``"P````"6@@'4
+M`````#!"`/`D0O_0+$(`0!!``"DD`@`!,*(`0!!``"8D`@`!CH0!S``````X
+M@P`'``,8*SB"``L``A`K`&(8)!!@`!PD`P`*$(,`&B0"``D0@@`9)`(``12#
+M``<\`@`"EH(!T``````L0@`$%$``$B0"``$\`@`")$+=@`!`^`D"@"`E$```
+M#"0"``&/HP`\`````)1B``(`````-$(``J1B``*6H@`"`````#!"__VFH@`"
+M)`(``8^_`#2/O@`PC[<`+(^V`"B/M0`DC[0`((^S`!R/L@`8C[$`%(^P`!`#
+MX``()[T`.">]_]"OOP`HK[,`)*^R`""OL0`<K[``&`"`B"4`H(`E%@```Z^P
+M`!`D`O__KZ(`$(XC`<PD`@`)$&(`""0"``H48@`)/`(``)8B`=``````+$(`
+M!!!```0\`@``)`+_[P("@"0\`@``)$(```(@("4`0/@))`4`##P"```D4P``
+M`B`@)20%0``"8/@)`@`P)3P"```D0@```$#X"20$``^/H@`0`````#!"``.O
+MH@`0,A```SP"```D0@```B`@)20%0`"/I@`0`$#X"0(`."4`0)`E,@(``11`
+M`","0!`E)`(`%*^B`!`T0@`!KZ(`$).G`!`GHP`0D&(``0```````A(``.(X
+M)9!B``(```````(4``#B."609@`#```````&-@`"("`E)`4`%`)@^`D`YC`E
+M/`(``"1"```"("`E```H)0!`^`DD!@`!$$``!3P"```D0@```B`@)0!`^`DD
+M!0#``D`0)8^_`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`#`GO?_HK[\`$#P"
+M```D0@```$#X"30%F&0``A3",$,!_S!B`0`00``".&(!_P`"&"<`8!`EC[\`
+M$``````#X``()[T`&)2B``(`````,$,!X"0"`,`08@`4`````"AB`,$00``&
+M)`(!0"0"`*`08@`*``````/@``@``!`E`````!1B``T`````E((2S``````0
+M```+I,(``)2"$LX`````$```!Z3"``"4@A+0`````!````.DP@```^``"```
+M$"4D`@`!`^``"``````GO?_8K[\`)*^R`""OL0`<K[``&`"`D"4`H(@E/`(`
+M`"1"````0/@)-`688#!"``(40``;``"`)3P"```D0@```$#X"0)`("4`0(`E
+M/`(``B1"L+`"0"`E`B`H)0!`^`DGI@`0$$``#`````"'H@`0``````!0$"H0
+M0``(`````)8B``(`````-$(``J8B``(0```"``"`)0``@"6F,``6`@`0)8^_
+M`"2/L@`@C[$`'(^P`!@#X``()[T`*">]_]BOOP`@K[,`'*^R`!BOL0`4K[``
+M$`"`D"6.0@'@/`,@``!#$"000``L`D"8)3P0```F$```)`4$(`(`^`DD!@`!
+M`D`@)20%!@`"`/@)```P)3P"```D0@```D`@)0!`^`DD!08``D`@)20%!@`"
+M`/@)-$8`"`)`("4D!08$/`8`$`(`^`DTQ@(!`D`@)20%!B`"`/@)```P)0``
+M@"4\`@``)%$```)`("4D!00``B#X"0(`,"4"$Q`A`D`@)9!&+S@"(/@))`4$
+M!"80``$J`@"`%$#_]0)`("6/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H
+M)[W_Z*^_`!``@&@E```@)23*__\`"E#"),;__S#&``<`H$@E&*``'@``6"4D
+M#``!``<XP`#)0"$M`@`)%$```P$,$`0D"``(`0P0!"1"__\`S!@$)&/__P!#
+M$"8`XA`$``H8@`!M&"&,8P````````!#$"0`XA`&`,(0!@%B$`0`@B`E`080
+M(P%B6"$!)A`A)$G_^```,"4=(/_F)4H``3P"```D0@```$#X"0````"/OP`0
+M``````/@``@GO0`8)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`F"4`
+MH(`EE,(``@`````P0P'@)`(`P!!B``\"8*`E*&(`P1!```8D`@%`)`(`H!!B
+M``<``!`E$```90`````48@!C```0)1````0``!@E$````B0#``$D`P`"``,8
+M0":$``0`9!`AE%(2YI1"$NP```````(1@`)"D"4`9!`AE$(2\@```````A,`
+M`D*0)0!D$"&40A+X```````"%(`"0I`E`&00(91"$OX```````(6``)"D"4`
+M9!`AE%$3!)1"$PH```````(1@`(BB"4`9!`AE$(3$````````A,``B*()0!D
+M$"&40A,6```````"%(`"(H@E`&08(91B$QP```````(6``(BB"4D`@`!$@(`
+M!P`````2```()`(``A("``4``!`E$```*0`````0```"`D"()0(@D"46,@`.
+M/`(``"1"```"8"`E`$#X"30%H@@D!M__/`,``"1C```"8"`E-`6B"`!@^`D`
+M1C`D$```#*Z0+[PD0@```F`@)0!`^`DT!:((/`,``"1C```"8"`E-`6B"`!@
+M^`DT1B``KI`OO#P0```F$````F`@)30%F6`"`/@)`D`P)0)@("4T!9ED`@#X
+M"0(@,"4D`@`!C[\`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"B,@P',
+M)`8`"A!F`!L`````)`(`"1!B`!@`````%&8`!@````"4@@'0`````"Q"``04
+M0``2)`,`*(R"`<P`````.$,`!RQC``$X0@`++$(``0!B&"448``))`,`*)2"
+M`=0`````,$(`\"1"_]`L0@!`$$```B0#`"`D`P`HE*(`````````0P`;```0
+M$!1@``(```````<`#0`"&"LD0O_V+$(`#3A"``$#X``(`&(0)">]_\"OOP`\
+MK[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`("@):^E`$24
+MH@`"```````"$<(P0@`!KZ(`$)2B``(`````,$,!\"0"`4`08@`?`H"H)2AB
+M`4$00``/)`((P"0"`,`08@!**&(`P1!```8D`@#0)`(`H!!B`$,``!`E$``!
+MD``````08@!!```0)1```8P`````$&(`/2AB",$00``&)`()0"0"`5`08@`'
+M```0)1```8,`````$&(``R0""5`48@%_```0)9:"`=0`````,$(`\"1"_]`L
+M0@!`%$``+```\"6.A`',`````#B#``<``Q@K.((`"P`"$"L`8A@D$&``(R0#
+M``H0@P`A)`(`"1""`"`\`@``%(,`!R1"``"6@@'0`````"Q"``040``9/`(`
+M`"1"```"@"`E`$#X"30%F40D`__'`$,0)(ZC+"P`````A&8`````````!C#`
+M,,8`.#P#```D8P```H`@)30%F40`8/@)`$8P)1````4\`@``$````B0>``$D
+M'@`"/`(``"1"```"@"`E`$#X"30%F1`D`_P&`$,0)``>B$`FL@`$`C(8(91C
+M$N````````,9``!#$"4\$```)A````*`("4T!9D0`@#X"31&``$\`@``)$(`
+M`(ZE+[R/I@!$`$#X"0*`("4",H@AEB82R``````PQ@'_`H`@)30%F6@"`/@)
+M-,8"`):B$G``````+$)0`!1``!\`'A!`CZ,`1`````"48@`"`````#!"`!`0
+M0``8`!X00(^B`!````````(@0"2"$T`"0A`AE%````````"/HP`0`````"1B
+M$T@"0A@A@',````````"HA`A@%8`!@`````D@A-(`J(0(917````````)(03
+M4!```!4"I"`A)J0``@!$$"&44!*@``````/5$"&`4Q+&`````(^C`!``````
+M)&(2R`*B$"&`5@`!```````#&$`D8A*H`J(0(917````````)&,3,`"#("&4
+MA````````*^D`!0\$@``)E(```*`("4"0/@)-`681"0#P'\`0Q`D`!`QP##&
+M/X`\$0``)C$```*`("4T!9A$`B#X"0!&,"4"@"`E`D#X"30%F%`D`_\``$,0
+M)#)F`/\"@"`E-`684`(@^`D`1C`E`H`@)0)`^`DT!9A0/!/__S9S`/\`4Q`D
+M`!8R`##&_P`"@"`E-`684`(@^`D`1C`E`H`@)0)`^`DT!9A(/`/__#1C#_\`
+M0Q`D`!<S`#P#``,T8_```,,P)`*`("4T!9A(`B#X"0!&,"4`'H!``A40(91"
+M$KH```````(V```"%```PC`E`A40(91#$L````````,2``#","4"@"`E-`68
+M-`(@^`D`PS`E`H`@)0)`^`DT!9@H`%,0)`(5&"&49A*N```````&,@`"@"`E
+M-`68*`(@^`D`1C`E`H`@)0)`^`DT!9AD/`/_^#1C#_\`0Q`D`A6`(98&$K0`
+M``````8S`#P#``<T8_```,,P)`*`("4T!9AD`B#X"0!&,"66HA)P`````"Q"
+M,`,00``.)!```I:#`<HD`A`B%&(`%CP"``"/HP!$`````)1B``(`````,$(`
+M0!!```\\`@``$```#200``@\`@``)$(``(^E`$0`0/@)`H`@)1!```4`'A!`
+M`%40(91"$R8``````@*`(3P"```D0@```H`@)0!`^`DT!9DD)`/_`0!#$"0`
+M$#!`,,8`_CP#```D8P```H`@)30%F20`8/@)`$8P)8^C`$0`````C&(`$```
+M```00``'/!$``(!P`!0`````@'(`%0`````0```-)C$``(^B`!````````(8
+M0"1B$[`"HA`AE%``!@`````D8Q.X`J,8(91R``(`````)C$```*`("4"(/@)
+M-`69("0#^!\`0Q`D`!`Q0##&!^`\$```)A````*`("4T!9D@`@#X"0!&,"4"
+M@"`E`B#X"30%F2`D`__@`$,0)#)&`!\"@"`E-`69(`(`^`D`1C`E`H`@)0(@
+M^`DT!9D@`H`@)30%F2`"`/@)-$8(`):D$G``````+()``11``!X`````CZ,`
+M1`````"48@`"`````#!"`-`D`P#0%$,`!#P"```L@E``%$``$SP"```D0@``
+M`H`@)0!`^`DT!:(,/`/_`S1C__\`0Q`DCZ,`%````````S2`/`,`_`##,"0\
+M`P``)&,```*`("4T!:(,`&#X"0!&,"66HA)P`````"Q"4`$40``()`(``3P"
+M```D0@```H`@)30%F>``0/@)```P)20"``&/OP`\C[X`.(^W`#2/M@`PC[4`
+M+(^T`"B/LP`DC[(`((^Q`!R/L``8`^``"">]`$`GO?^8K[\`9*^^`&"OMP!<
+MK[8`6*^U`%2OM`!0K[,`3*^R`$BOL0!$K[``0`"`H"4`H/`EKZ``$*^@`!2O
+MH``8KZ``'*^@`""OH``DKZ``.*^@`#PD`P`!IZ,`*"0"``*GH@`JIZ(`+*>C
+M`"ZGHP`PIZ(`,J>C`#27P@`"```````"$<(P4P`!E\,``!)@``<``+@E``,0
+M@`!#$"$``A!`)$*F*!````@P0O__``,0@`!#$"$``A!`/`/__S1C0)@`0Q`A
+M,$+__P!`D"67P@`X`````!1``!\`0(@E-!&``)?"``(`````,$(`$!!```(D
+M`P!7)`,`K@``@"4"0[`C$````@)#J"$P4/__+@(`!1!```\"@"`ECH(!Q`(`
+M*"4`0/@)`F`P)30#@``00P`(,$,__P!V$"H40/_S)@(``0*C$"H40/_P)@(`
+M`0!@B"6GT0`X-`*``!8B`&`\`@``)%(```*`("4"0/@)-`69(#P#0```0Q`D
+M$$`!?`*`("4"0/@)-`69##P&`/\TQO__/!```"80```"@"`E-`69#`(`^`D`
+M1C`D`H`@)0)`^`DT!9D@/`:/_S3&__\"@"`E-`69#`(`^`D`1C`D`H`@)30%
+MF:`"`/@)```P)0*`("4T!9F``@#X"0``,"4"@"`E`D#X"30%F80\$?_P`H`@
+M)30%F80"`/@)`%$P)`*`("4T!9F8`@#X"0``,"4"@"`E`D#X"30%F9P"@"`E
+M-`69G`(`^`D`43`D`H`@)30%F0`"`/@)```P)0*`("4T!9D$`@#X"0``,"4"
+M@"`E-`69"`(`^`D``#`E`H`@)0)`^`DT!9D,)!'```*`("4T!9D,`@#X"0!1
+M,"0"@"`E-`69B`(`^`D``#`E`H`@)30%F8P"`/@)```P)0*`("4T!9F0`@#X
+M"0``,"4"@"`E`D#X"30%F90"@"`E-`69E`(`^`D`43`D$``!)0````"7P@`"
+M`````#!%`?`D`@#0$*(`,`(R(",HH@#1$$``!B0"`4`D`@#`$*(`%@`$$4`0
+M```V`$00(Q"B``4D`@%0$*(`)``$$4`0```P`$00(P`$O$`\`E'K-$*%'P+B
+M`!@``!`0``(0PP`7'\,`0[@C`!<2@Z^B`#PD`PPU$```(:^C`#@`!"H`/`()
+M3S1"()4`H@`8```0$``"$$,`!1_#`$,0(Z^B`#P`!+Q`/`)1ZS1"A1\"X@`8
+M```0$``"$,,`%Q_#`$.X(R0"##40```-KZ(`.``$O``\`E'K-$*%'P+B`!@`
+M`!`0``(0PP`7'\,`0[@C`!<2@Z^B`#PD`QAJKZ,`.``$$4``1!`C``(0@`!$
+M$"$``AG`CZ0`.```````9``:```0$A2```(```````<`#0!`&"4P8@`/)`@`
+M!!1```,GI0`H)`@``R>E`#`1``!<``"`)0`#,0,HR0`=)`<``1$@`,H`T!`A
+M)$0`&2R"`"$00``.)(/_WRB"`!H40``&`(<0!"B"`!L40``1)((``22"__\`
+M1Q`$CZ,`$```````0Q`E$```":^B`!`L8@`4$$``!R2"``$`9Q`$CZ,`%```
+M````0Q`EKZ(`%"2"``$L0@`0$$``#"2"__$`$!!``$40(91#````!!!`)$(`
+M`@!#&`2/H@`8``````!B&"40```JKZ,`&"Q"`!`00``,)(+_X0`0$$``11`A
+ME$,````$$$`D0O_B`$,8!(^B`!P``````&(8)1```!ROHP`<+$(`$!!```PD
+M@O_1`!`00`!%$"&40P````000"1"_\(`0Q@$CZ(`(```````8A@E$```#J^C
+M`"`L0@`'$$``#"8"``$`$!!``$40(91#````!!!`)$+_H@!#&`2/H@`D````
+M``!B&"6OHP`D)@(``3!0__\""!`J%$#_J0`````\$0``)C$```*`("4"(/@)
+M-`69##P#`/\T8___`$,0)#P&_P`\$```)A````*`("4T!9D,`@#X"0!&,"4"
+M@"`E`B#X"30%F2`\!G```H`@)30%F2`"`/@)`$8P)8^E`#P```````4U`#P"
+M/_``PC`D/!(`#S92__\"\A`D`,(P)3P"0``"@"`E-`69H`(`^`D`PC`E`H`@
+M)8^F`!`"`/@)-`69@`*`("4"(/@)-`69A#P3__``4Q`DCZ8`%```````TC`D
+M`H`@)30%F80"`/@)`$8P)0*`("6/I@`0`@#X"30%F9@"@"`E`B#X"30%F9P`
+M4Q`DCZ8`%```````TC`D`H`@)30%F9P"`/@)`$8P)0*`("6/I@`8`@#X"30%
+MF0`"@"`ECZ8`'`(`^`DT!9D$`H`@)8^F`"`"`/@)-`69"`*`("4"(/@)-`69
+M#"02P```4A`DCZ8`)``````PQC__`H`@)30%F0P"`/@)`$8P)0*`("6/I@`8
+M`@#X"30%F8@"@"`ECZ8`'`(`^`DT!9F,`H`@)8^F`"`"`/@)-`69D`*`("4"
+M(/@)-`69E`!2$"2/I@`D`````##&/_\"@"`E-`69E`(`^`D`1C`EC[\`9(^^
+M`&"/MP!<C[8`6(^U`%2/M`!0C[,`3(^R`$B/L0!$C[``0`/@``@GO0!H)[W_
+MV*^_`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`H"64H@`"`````#!"`!`00``"
+M/`-D`#P#R`"4H@`"`````#!"0``00``#`````!````<``QA"E*(``@`````P
+M0H``$$```@```````QB"E*(`````````8@`;```8$A1```(```````<`#01@
+M``<D$P`?)G/__Q)@``0"8Q`&,$(``1!`__L`````)`(`)@!3F",D`@`7`%,0
+M(R00``$`4(`$`'"`(20"`!@`4Q`C`%"`!B9S__`\$0``)C$```*`("4"(/@)
+M-`68%#P#``$T8___`$,0)``0A$`\$@``)E(```*`("4T!9@4`D#X"0!0,"4"
+M@"`E`B#X"30%F!0\`__^-&,?_P!#$"0`$YM`/`,``31CX``"8Y@D`H`@)30%
+MF!0"0/@)`%,P)8^_`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_
+MX*^_`!@LH@!`%$```@"`&"4D!0`_I&4!_#P"```D0@```&`@)8QE$C0`0/@)
+M)Z8`$(^_`!@``````^``"">]`"`GO?_`K[\`/*^T`#BOLP`TK[(`,*^Q`"RO
+ML``H`("0)0"@F"4`P*`E/!```"80``".1$9XCD5&?`(`^`D"0(@E)D1&@`(`
+M^`DD!0`@ED,!_(9"`?P`````*$(`0!1```,``Q0`)`,`/P`#%````CP#*.,`
+M/SAC``$PXO__+$(``0!B&"408``)/`,``"1C6'B.0@(````````"$$``0Q`A
+MA$8``!````,D`@`!```P)20"``&OH@`0)Z(`(*^B`!0GH@`BKZ(`&#P"``(D
+M0LL<`D`@)0!`^`D"8"@E$$``VP)`("6OM``0CB(LO">E`"`GI@`B`$#X"0)@
+M."400`#3`````(Y$`<P`````.(,`!P`#&"LX@@`+``(0*P!B&"008``0)`,`
+M"A"#``XD`@`)$((`#0``@"44@P`&`````)9"`=``````+$(`!!1```<D!0`_
+MEB)&G@`````D0@`$IB)&G@``@"4D!0`_`!`00"1"1H`"(B`AE((``)8C+_0`
+M`````$,0(:2"```P0O__+$(`0!1```(`````I(4``"80``$N`@`0%$#_\0`0
+M$$"6(A*>`````"Q"``(00`!"`````)9"`=(`````+$(`0A!``",D`P#`EF(`
+M`@`````P0@#0%$,`'B0"";268P```````!1B``X\`F9FDB(2DI8C$IP`````
+M`$,0(SP#9F8T8V9G`$,`&```&!```QA#``(7PP!B&",0```),&7__Y(C$I(T
+M0F9G`&(`&```$!```A!#``,?PP!#$",P1?__/`(``B1"U*``0/@)`D`@)0``
+M@"4T%*&`/`(``"13````$"B`CB-&>```````HQ@AE&(``@```````A(`-$(`
+M_P`"%`"49@`````````&,@`TQ@#_,,;__P)`("4`M"@A`F#X"0!&,"4F$``!
+M*@(`(!1`_^P`$"B`EB9&A@`````PQ@`_``8V`)8B1H0`````,$(`/P`"%```
+MPC`EEB)&@@`````P0@`_``(2``#","66(D:``````#!"`#\\$```)A````)`
+M("4T!9DT`@#X"0#","66)D:.`````##&`#\`!C8`EB)&C``````P0@`_``(4
+M``#","66(D:*`````#!"`#\``A(``,(P)98B1H@`````,$(`/P)`("4T!9DX
+M`@#X"0#","66)D:4`````##&`#\`!C8`EB)&D@`````P0@`_``(4``#","66
+M(D:>`````#!"`#\``A(``,(P)98B1I``````,$(`/P)`("4T!:(T`@#X"0#"
+M,"66)D:<`````##&`#\`!C8`EB)&F@`````P0@`_``(4``#","66(D:8````
+M`#!"`#\``A(``,(P)98B1I8`````,$(`/P)`("4T!:(X`@#X"0#","6.(B_<
+M`````!1```(D!@!_)`8`/SP"```D0@```D`@)0!`^`DT!9D\)`(``8^_`#R/
+MM``XC[,`-(^R`#"/L0`LC[``*`/@``@GO0!`)[W_D*^_`&ROO@!HK[<`9*^V
+M`&"OM0!<K[0`6*^S`%2OL@!0K[$`3*^P`$BOI`!P`*"@)0`&-```!C0#KZ8`
+M.``'/```!SP#KZ<`/`"`B"4F,T:`)!X`/X*"``4```````(00#!"__^OH@!`
+M)`+_P8^C`(@`````I&(``(^B`(0`````I%X``#P"```D0@```$#X"205`#\P
+M4@#_``"`)8^C`'``````E&(3=``````00``JKZ``1"8W``8R5@#X`!`00"1"
+M$W`"XA`AE$,````````08``;,D3__Q!D``<`$"F`E$(````````P0@`'-$(`
+MX!2"`!,``````B4H(9:$```\`P`")&/6=`!@^`DDI1?4)`0`X!;$``@`0!@E
+M,&+__P*B$"L00``"``````*@&"40```#,'7__Q````<`0*@E)A```98B$W0`
+M`````@(0*A1`_]L`$!!`EH(``@`````P0@#0)`,`P!1#`#$R0@#X-%(``98B
+M$W0`````$$``+0``@"4F-P`&,E8`^``0$$`D0A-P`N(0(91#````````$&``
+M&S)$__\09``'`!`I@)1"````````,$(`!S1"`.`4@@`3``````(E*"&6A```
+M/`,``B1CUG0`8/@))*47U"0$`.`6Q``(`$`8)3!B__\#PA`K$$```@`````#
+MP!@E$````S!^__\0```*`$#P)280``&6(A-T``````("$"H40/_;`!`00!``
+M``(``````J#P)9:"``(`````,$(!`!!```4\`@``@B82C@`````0```$)$(`
+M`((F$H\`````)$(``(^D`'``0/@)`H`H)0`"%@```H8#EH,``@`````P8@!`
+M$$``PC!B`(`00``+)Z(`&)8G%YROH@`0/`(``B1"V("/I`!P`H`H)0!`^`DF
+M)A>>$```"0````"6)Q=*KZ(`$#P"``(D0MB`CZ0`<`*`*"4`0/@))B873(^B
+M`$```````%`8(P*C$"H00``#``,4``*@&"4``Q0```(T`Y:"``(`````,$(`
+M$!!``"``````EB(2<``````L0C`!%$``"0````"6(Q)^``````##$"H00``#
+M``,4``#`&"4``Q0```(T`Y8B$G``````+$)``!1```X`````EH(``@`````P
+M0@"`$$``"0````"6(Q*```````##$"H00``#``,4``#`&"4``Q0```(T`Y>C
+M`!X``````,,0*A!```,``Q0``,`8)0`#%````A0#KZ(`1(^C`#@```````,0
+M0(^D`$0``````((0(P`"%````C0#``80)P`"%\,`PC`DCZ(`/```````0!@E
+M`,(0*A!```,``Q0``,`8)0`#%`"/HP"``````!!@`%$``C0#IF8`"*9F``:F
+M9@`$IF8``J9F``"7I``<`````#"#__\PPO__`$,0*Q!```(`P"@E`,`@):9D
+M``J7I``:`````#"#__^68@````````!#$"L00``#`````)9D````````IF0`
+M#)>D`!@`````,(/__Y9B`````````$,0*Q!```,`````EF0```````"F9``.
+M``04```"'`.6(A)P`````"Q"0``40``=`````):"``(`````,$(`@!!```@`
+MP"`EEB(2A```````PA`J$$``"`#`$"40```4IF(`'I8B$H(``````((0*A1`
+M``X`P!`EEH(``@`````P0@"`$$``!`````"6(A*$$```!Z9B`!Z6(A*"$```
+M!*9B`!Z68@```````*9B`!Z/I`"(`````(2"````````$```":XB+_"7HP`8
+M``````##$"H00``"`,`H)0#`&"4``Q0```(<`X^B`(0`````I$,``(^C`(@`
+M````I&4``):#``(`````,&(`(!1```0P8P#0)`(`P!1B`'D`````EB<7O">B
+M`"BOH@`0/`(``B1"V("/I`!P`H`H)0!`^`DF)A>^CZ0`0```````D!@C`\,0
+M*A!```,``Q0``\`8)0`#%````C0#EZ,`+@``````PQ`J$$``!0``````P!@E
+MEZ,`+@``````PQ`J`````!!```(``````,`8)8^D`#@```````000`!B$",`
+M`A0```(T`P`&$"<``A?#`,(P)(^B`#P``````$`8)0#"$"H00``#``,4``#`
+M&"4``Q0`CZ,`@``````08``E``(T`Y>C`"X``````,,0*A!```(``````,`8
+M):9C`!"7HP`L``````##$"H00``"``````#`&"6F8P`2``,4```"+`.F8P`4
+MEZ,`*@``````PQ`J$$```@``````P!@EIF,`%J9C`!B7HP`H``````##$"H0
+M0``"``````#`&"6F8P`:``,4```")`,0```1IF,`')>C`"P``````,,0*A!`
+M``,``Q0``,`8)0`#%````BP#EZ,`*```````PQ`J$$```P`#%```P!@E``,4
+M```")`./HP"$`````(1B`````````((0*A!```(`````I&0``(^D`(@`````
+MA((`````````11`J$$```@````"DA0``CZ(`@``````00``+)`(``8^C`(@`
+M````A&(```````"N(B_(EB(ORH^D`'``````I((!_B0"``&/OP!LC[X`:(^W
+M`&2/M@!@C[4`7(^T`%B/LP!4C[(`4(^Q`$R/L`!(`^``"">]`'`GO?^PK[\`
+M3*^^`$BOMP!$K[8`0*^U`#ROM``XK[,`-*^R`#"OL0`LK[``*`"`H"6OI0!4
+MCH(LP```````0/@)`,"X)1!``$8`````EH,!_(:"`?P`````*$(`0!1```,`
+M`Q0`)`,`/P`#%````IP#*F,`/SAC``$R8O__+$(``0!B&"408``)/`,``"1C
+M6(2.@@(````````"$$``0Q`AA%(``!````,``(@E``"0)0``B"42X``J)`(`
+M`2>V`"`GM0`B/`(``B1>RQP`$1#`CZ,`5```````8H`AKZ``$*^V`!2OM0`8
+M`H`@)0(`*"4"0#`E`\#X"0)@."400``8`````(>B`"*"`P`&``````!#$"H0
+M0``$`````).B`",`````H@(`!H>B`"""`P`'``````!#$"H00``$`````).B
+M`"$`````H@(`!R8Q``$"-Q`K%$#_W@`1$,`D`@`!C[\`3(^^`$B/MP!$C[8`
+M0(^U`#R/M``XC[,`-(^R`#"/L0`LC[``*`/@``@GO0!0)[W_P*^_`#ROL@`X
+MK[$`-*^P`#``H)`E`("`)881$IH`````/`(``"1"```GI``0)@5&@`!`^`DD
+M!@`@)`D`"">J`!`D#0`()`X`/P`)&$`!0Q@AE&(`````````41`CI&(`````
+M."4``%@E``E@0`!@,"6$P@````````1!``(`````I,```!3M``,!3"@A$```
+M'20'``^4J```A*0````'$$``4!`AE$-&@``````DX@`!%(,`%#!'__\4@``$
+M+6(`,R4"``$0```,I*(``!1```8`````E,(````````D0@`!$```!:3"``"4
+MP@```````"1"__^DP@`````X)25B``$P2___+.(`$!1`_]D`"1!``4(8(81B
+M````````*$(`0!1```(`"2!`I&X```"0$"&40T:```````!R&",``Q`G``(7
+MPP!B&"0!1"`AA(0``(X"1G@`!"!``((@(0`#&$``8A@AE&(```````"D@@``
+M)2(``3!)__\M(@`/%$#_LP`)&$`D"0`()Z0`$``)$$``4!@A`((0(91"````
+M````I&)&@"4B``$P2?__+2(`#Q1`__8`````C[\`/(^R`#B/L0`TC[``,`/@
+M``@GO0!`)[W_P*^_`#ROL@`XK[$`-*^P`#``H(@E,)+__Y8B````````$$``
+M$P``,"4GI``8``880`"#&"$`!A#``%$0(91"````````I&(``"3&``$HP@`(
+M$$``"`#`@"4`!A#``%$0(91"````````%$#_\0`&&$``P(`E)Z(`*J^B`!`\
+M`@``)$(```)`("4GI0`8,,;__P!`^`DGIP`H&@``$```,"67HP`HEZ(`&```
+M```08@`,`````">D`!@DQ@`!`-`0*A!```8`!A!``((0(91"````````%&+_
+M^`````"7HP`HEZ(`*@`````48@`#``80P!!R``8``````%$0(8Q"``0`````
+M$$``!@`&$,``41`AE$(``@`````0```"`````"0"`#^/OP`\C[(`.(^Q`#2/
+ML``P`^``"">]`$`PA/__,*7__S#&__\PY___EZ@`$@``````Z``8```8$A!@
+M`"@``!`E$,4`)```````A1`C``(80`!B&"$``QC``&(8(0`#&(``Q1`C`&(`
+M&@``&!(40``"```````'``T``QP```,D`P2``!4`X!@E*((`91!``!(!`!@E
+M`(@`&```&!(D`@!D`$00(P!'`!@``!`2`&(8(3P"4>LT0H4?`&(`&```$!``
+M`A%#``,?PP!#$",0```",$/__P#@&"4`8!`E`^``"``````GO?^XK[\`1*^T
+M`$"OLP`\K[(`.*^Q`#2OL``P`*"8)0#`D"6/M`!8,/#__Q(```\``"`E)Z4`
+M&``$&$``HQ@A``00@`!$$"$``A!``%(0(91"``@`````I&(``"2$``$`D!`J
+M%$#_]0`$&$"69```)Z(`*J^B`!`\`@``)$(``">E`!@"`#`E`$#X"2>G`"@`
+M`$`E```X)0``("67I@`HEZ4`*A````(GHP`8)(0``0"0$"H00``-``000`!B
+M$"&40@```````!3"``(`!!!`,(?__P!B$"&40@```````!2B__(`````,(C_
+M_Y9D``"7I0`HEZ8`*@`'B(`")X@A`!&(0`(RB"&6)P`&``B`@`((@"$`$(!`
+M`A*`(98"``8\$@`")E+7M`)`^`FOH@`0IH(`!I9D``"7I0`HEZ8`*I8G``26
+M`@`$`D#X":^B`!"F@@`$EF0``)>E`"B7I@`JEB<``I8"``("0/@)KZ(`$*:"
+M``*69```EZ4`*)>F`"J6)P``E@(```)`^`FOH@`0IH(``(^_`$2/M`!`C[,`
+M/(^R`#B/L0`TC[``,`/@``@GO0!(CZH`$##&__\PA/__``000`!$$"$``A#`
+M`$00(0`"((``!C!`E*,``````````Q!``$,0(0`"$,``0Q`A``(0@"1"__8`
+M@A`K$$``!@"F0"&4H@```````*5"```#X``(I.(``)4#__X```````,00`!#
+M$"$``A#``$,0(0`"$(`D0@`*`$00*Q!``!``J!`KE0+__@````"E0@```^``
+M"*3B``"E1@```^``"*3F``"4H@```````*3B``"4H@`"``````/@``BE0@``
+M$$``'@`$%````DP#E*8``(2C``````````,00`!#$"$``A#``$,0(0`"$(``
+M21`C)$(`"2Q"`!,40/_G`````)2C``(```````,00`!#$"$``A#``$,0(0`"
+M$(`D0O_V`((0*Q1`_]\`````)*4``@"H$"L40/_E``````/@``@``````(`P
+M)93"`=0`````,$(`\"1"_]`L0@!`$$``$R3%+!`\!```)(1:`(R#``0`````
+MK,,L$``#$,``0Q`A``(0@"2$``@`1!`AK,(L+"0"``&LPBPH)`(`%*S"+!PD
+M`@!5`^``"*S"+"`\!```)(18D(R#``0`````K*,````#$,``0Q`A``(0@"2$
+M``@`1!`AK*(`'"0"``&LH@`8)`(`%*RB``PD`@`C`^``"*RB`!`GO?_HK[\`
+M%*^P`!``@!@EE&(!U``````P0@#P)$+_T"Q"`$`00``7`*"`)8QB++``````
+M`$#X"20%``<\`P`")&.R[`!`("4D!0`!)`8`)`!@^`D``#@E``!()20'`&L`
+M`"`E)`,``11#`"8D!@!K)`<`4R0&`%,D`@`W$```(:X"`!",8BRP`&`@)0!`
+M^`DD!0`'/`,``B1CLNP`0"`E)`4`!B0&`"4`8/@)```X)0!`&"4``$@E)`(`
+M/Q1B``,D9P`$)`<`,B0"`#\08@`"`2`@)20$`$`DA@`R)`(`/Q1B``:N"0`,
+M)2(`%*X"``PD@@`C$````ZX"`!`DP@`%K@(`$(X%``0``````*D0*P#E&"L`
+M0Q`E$$``!P``0"4`I!`K`,48*P!#$"400``#`0`0)20(``$!`!`EC[\`%(^P
+M`!`#X``()[T`&">]_^BOOP`4K[``$`"`@"6&!B_TC@(O\```````PC`A``8R
+M0##&?@`\`@``)$(``#0%F3``0/@)-,:``"0"``&N`B_$C[\`%(^P`!`#X``(
+M)[T`&">]_^"OOP`<K[(`&*^Q`!2OL``0`("()0(@D"4F,"P0CB,L*``````0
+M8`!-```0)8XC+\0D`@`!%&(`1SP"```D0@```D`@)0!`^`DT!9DP`$`8)3!B
+M@``40``_``,F0@`#%<(P0@`#)`,``A1#``^N!``$ED(!T@`````L0@!"%$``
+M!@````"6(A*:``````!$$"$0```%K@(`!(X"``0`````)$(`!:X"``260@'4
+M`````#!"`/`D0O_0+$(`0!!```T\`@`")$+AA`!`^`D"0"`EC@0`!(X#`!0`
+M`````(,0*Q1```,`@Q`C$````JX"``2N```$KB`OQ#P"``(D0MPT`D`@)0!`
+M^`D"`"@E%$``$3P"``(D0M],`D`@)0!`^`D"`"@E$$``"SP"``(D0M^$`D`@
+M)0!`^`D"`"@E&$``!20"``*N(B_$)`(``:XB+]BN("_`CB(OQ`````"/OP`<
+MC[(`&(^Q`!2/L``0`^``"">]`"",HP`$C*(`#```````0Q`K$$``!@``("6,
+MH@`0``````!B$"L40``"`````"0$``$#X``(`(`0)0"@."64@@'4`````#!"
+M`/`D0O_0+$(`0#P#```40``#)&A:`#P"```D2%B0C.0`````````!!#``$00
+M(0`"$(`!`A`A)$(`"*SB`!R,X@`$C.,`$```````0Q`K%$``*@`````0@`!D
+M)`+__XSB``0`````K.(`"(SC`!```````$,0*Q1``!X`8$@EC.(````````0
+M0``:`````(SB````````)$;__ZSF````!B#``(8@(0`$((``B!`AC.4`'(Q#
+M`!B,H@`0``````!B&",``QA`C.(`"```````0Q`CK.(`"`$$("$DA``(`$D0
+M*Q1```.LY``<%,#_Z``````#X``()`(``8SC``2,X@`,``````!#$"L40``W
+M```0)8T#````````)&/__XSD````````$(,`,"0"__Z,XP`$`````*SC``B,
+MX@`,``````!`2"4`0Q`K%$``)0````"-`P```````"1C__^,X@````````!`
+M("4`0Q`K$$``'``````DA@`!K.8````&(,``AB`A``0@@`"($"&,Y0`<C$,`
+M&(RB`!```````&(8(P`#&$",X@`(``````!#$".LX@`(`00@(22$``@!(A`K
+M%$``!ZSD`!R-`@```````"1"__\`PA`K%$#_Y@#`("4#X``()`(``@/@``@`
+M````)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`B"4F,BP0KB`L)(XB
+M++```````$#X"20%``<\`P`")'2R[`!`("4D!0`!)`8`)`*`^`D``#@E`$"8
+M)20"``$68@`A`B`@)8XB+"P`````A%````````".(BRP``````!`^`DD!0`'
+M`$`@)20%``0D!@`@`H#X"0``."42$P`+`$`8)1(```<D`@`"$@(`"20"``,2
+M`@`+``,00!````H`````$```"*Y``!00```&KD,`%``#$$`D0O_[$````JY"
+M`!2N0@`4C[\`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_@K[\`
+M'*^R`!BOL0`4K[``$`"`D"4`P(@E`."`)3P"```D0@```*`@)0!`^`D"("@E
+M`$`X)28&__\`!C#")A#__QH@`",R$``')`D``8^B`#````````)`P"0*``@"
+M$1@A*&(`"11```,`:1@$)`,`"`!I&`0D8___`@D0!"1"__\`8A@F`0,8!``&
+M*(``LB@A``,@)XRB`````````((@)`('$`0!`A`$`$,0)`!$$"6LH@```C`0
+M(211__@!4!`C`$<X!@``@"4>(/_D),8``8^_`!R/L@`8C[$`%(^P`!`#X``(
+M)[T`(">]_\"OOP`\K[X`.*^W`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!RO
+ML``8`*"0)99"``(`````,$)``!!```4`@+`E/`(``"1"```0```3)`4"`)9"
+M``(`````,$*``!!```4\`@``)$(```+`("40```*)`4$`)9"``(`````,$(`
+M$!1```(D!0`")`4!`#P"```D0@```L`@)0!`^`D``(@E`$"8)8YB````````
+M&$``'3P"```D5P``-!6'`#P"```D5````!&`0`(1@"$`$("`)A``(`)P@"&2
+M!P`+KZ``$`+`("4"8"@E`N#X"20&``Z2!0`(```````%*(`"P"`E`+4H(0*`
+M^`D`0#`E)C$``8YB`````````B(0*A1`_^H`$8!`ED(``@`````P0@`0%$``
+M.SP"```D0@```L`@)0!`^`DD!0`(`$"8)8YB````````&$``,@``B"4\'@``
+M)!<``0`1$$``41`A``(0@"1"`"`"8H`AD@(`"````````A"`-`.'``!#D"&2
+M`@`%`````!1``!P\`@``D@<`"Z^@`!`D50```L`@)0)@*"4"H/@))`8`#B?4
+M```"P"`E`D`H)0*`^`D`0#`ED@(`"0`````00``,``(0@`)"D"&2!P`+K[<`
+M$`+`("4"8"@E`J#X"20&``X"P"`E`D`H)0*`^`D`0#`E)C$``8YB````````
+M`B(0*A1`_],`$1!`C[\`/(^^`#B/MP`TC[8`,(^U`"R/M``HC[,`)(^R`""/
+ML0`<C[``&`/@``@GO0!`)[W_V*^_`"2OM``@K[,`'*^R`!BOL0`4K[``$`"`
+MB"4`H(`E/`(``"1"````0/@)-`6`'#!#/X"6`@`"`````#!"0``00``')!,!
+M!#P''X`\`@`;)`8`$R02#:P0```')!0`%"03`-(\!Q^`/`(`-B0&``DD$@U(
+M)!0`"@##,"4`PC`E/!```"80```"("`E-`6`'`(`^`D`QS`E`B`@)20%$'`"
+M`/@)`F`P)0(@("4D!1"P`@#X"0)`,"4\`@``)$(```(@("4`0/@))`40\#P#
+M__`T8P/_`$,0)``4,H`"("`E)`40\`(`^`D`1C`EC[\`)(^T`""/LP`<C[(`
+M&(^Q`!2/L``0`^``"">]`"@``````````">]_]BOOP`DK[0`(*^S`!ROL@`8
+MK[$`%*^P`!``@)@E`*"`)8YC+$0\!7__-*7__SP"```D0@```$#X"0!E*"0`
+M0*`E/`(``"1"```"8"`E`$#X"20%`#``0"`E,)$#\``1B0(2```&`B"0)20"
+M`"4`41`C``(00A````0"(I`A+B(``BQ"``$"0I`C$E$`"B0#_`\`@Q@D`!(Q
+M`##&`_`\`@``)$(```)@("4D!0`P`$#X"0!F,"4\`@``)$(```)@("4`0/@)
+M`H`H)0)1$"8``A`KC[\`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@G
+MO?_HK[\`$`"@."4`@$`EE(,!Z```````XQ@J$&``"0``$"4`!RD``*<H(P`%
+M*(`!!2@A/`(``"1"````0/@))*4LX(^_`!```````^``"">]`!@GO?_HK[\`
+M$`#`0"4`@#@EE(,!Z```````HQ@J$&``"@``$"4`!3$``,4P(P`&,(``YC`A
+M/`(``"1"```!`"@E`$#X"23&+."/OP`0``````/@``@GO0`8)[W_T*^_`"BO
+MM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@*`E`*"0)0#`J"4F@P'@)`(``A)"
+M`!`D$P`++D(``Q!```8D`@`#)`(``1)"`"0D`O__$```9``````20@`-/`(`
+M!20"``020@`0)`+__Q```%T`````E'$`"``````F,?__/`(`!31"`,`0```P
+M`F*8)91Q``@`````)C'__C1"`<`0```J`F*8)91Q``@`````)C'__0`1$0``
+M41`C``(0@`!$$"&,0BSD`````!!``!\`````$```0R0"__^48@`(`````!!`
+M`!0``(@EC((LY``````00``.`````)1F``@DA0`$)C$``0(F$"H00``(`!$1
+M``!1$",``A"``$40(8Q"+.``````%$#_]@````"48@`(```````````6(@`#
+M`````!```"<D`O__`!$1``!1$",``A"``(*`(280+.".`P`$`````!1@`!XD
+M`O__/`(``"1"```"`"`E`$#X"20%`#P6H``-KA(`!*X3``PD`@`"K@(`%"0"
+M__^N`@`8)`(#_ZX"`!PD`@`*I@(`(*8"`"(0```*K@``-(ZB`#``````K@(`
+M-#P"```D0@```H`@)0(@*"4`0/@)`J`P)0(@$"6/OP`HC[4`)(^T`""/LP`<
+MC[(`&(^Q`!2/L``0`^``"">]`#`GO?_@K[\`'*^R`!BOL0`4K[``$`"`@"6.
+M`BS,`````#!"`_^.!BS4```````&-``\$@/_`-(P)#P1```F,0``)`4`I`(@
+M^`D`1C`EC@(LT``````P0@/_C@8LV```````!C0``-(P)`(`("4D!0"H`B#X
+M"0!&,"4\`@``)$(```(`("4`0/@))`4`K"0#_```0Q`DC@8LW``````PQ@/_
+M`@`@)20%`*P"(/@)`$8P)8^_`!R/L@`8C[$`%(^P`!`#X``()[T`(">]_^BO
+MOP`0`*`X)0"`,"64@P'H``````#C&"L08``F```0)0`'$0``1Q`C``(0@`#"
+M*"$DI2S@C*,`!``````08``=```0):R@``0D`P`!`.,8!``#&">,PBS,````
+M``!B$"2LPBS,C,(LT```````8A`DK,(LT(S"+-0``````&(0)*S"+-2,PBS8
+M``````!B$"2LPBS8C,(LW```````8A@D/`(``B1"ZHP`0/@)K,,LW"0"``&/
+MOP`0``````/@``@GO0`8)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`DK[0`(*^S
+M`!ROL@`8K[$`%*^P`!``@/`E`*"X)0/`F"6/Q!(T`````)?#`>@``````N,8
+M*Q!@`6D``!`E`!<1``!7$",``A"``F*((28Q+.".(P`$`````!!@`6`D`@`!
+MCB,`&"0"__\48@`4`````!"```8D`P"@E((``@`````P0@"@$$,``B0$`!\D
+M!``/)`<``0#D$"L00``+`!>`@``'$$`T1P`!`.00*Q1`__T`!Q!`$```!``7
+M@(".)P`8```````7@(`PYP/_CB(`'````````A*`/`,`#S1C_```0Q`D`.(X
+M)8XF`!0```````8U`#P"#_``PC`D/`(``"15```#P"`E)@400`*@^`D`YC`E
+MEB8`(@``````!C$`,,8`\)8B`"``````,$(`#P#","4\`@`(-$(@``/`("4F
+M!1"``J#X"0#","4D$@@`CB,`)``````08``0)!0!`#P"`/\T0O__`&(0)(XF
+M`"@```````8V``/`("4F!0C``J#X"0!&,"6.(@`H`````!!```(D$@@!)!()
+M`8XB`#``````$$``"P`7*(`\!@#_-,;__P!&,"0\`P$`/`(``"1"```#P"`E
+M)*4)``!`^`D`PS`E`!<0@"1%$,".(P`L/`(`#S1"__\08``#`&(P)#P"`!``
+MPC`E/`(``"1"````0/@)`\`@)8XB`#``````$$``!P````".(@`,`````#!"
+M`"`00``"`````#92`@".(@`,`````#!"`$`00``#)`+_\`)"D"0V4@`",D(`
+M#Q!``!$`````CB(`#``````P0@$`$$```R0"_[\0```"-E(`0`)"D"2.(@`,
+M`````#!"`(`00``#)`+_WQ````(V4@`@`D*0)(XB``P\`P`!`$,0)!!```(\
+M`@`@`H*@)8XB``P\`P"``$,0)!!```(`````-I0"`(XB``P\`P`$`$,0)!1`
+M``8`````CB(`##P#``(`0Q`D$$```@`````"@Z`ECB(`##P#``@`0Q`D$$``
+M`@`````VE$``CB(`##P#`!``0Q`D$$```@`````"@Z`ECB,`!"0"``(08@`%
+M)`(``Q!B``<`````$```(0`````V4@"B/`(`)1```!T"@J`ECB(`,``````4
+M0``7-E(`8CP"```\`P``C$(``(QC`````````$,0(XYF+^0``````,(P(SP"
+M``",0@````````#",",`!C*``!<H@#P#`0`\`@``)$(```/`("4DI0D``$#X
+M"0##,"4\`@`$`H*@)8XB`#@`````,$(``1!```(\`@`D`H*@)0`7@(`F%0G`
+M/`(``"16```#P"`E`J`H)0+`^`D"0#`E`\`@)28%$0`"P/@)`H`P)8XB`#0`
+M````$$``%@/`("4`%S!`)`4+``+`^`DDQ@!0`\`@)8XF`#0"P/@))`4+!`/`
+M("4D!0L(`L#X"20&``D\`@``)$(```/`("4`0/@)`J`H)0/`("4"H"@E`L#X
+M"31&$`".(@`,`````#!"``$00``')`(``0+B$`2.8RS,``````!#$"40```'
+MKF(LS`+B$`0``A`GCF,LS```````0Q`DKF(LS(XB``P`````,$(``1!```<D
+M`@`!`N(0!(YC+-```````$,0)1````>N8BS0`N(0!``"$">.8RS0``````!#
+M$"2N8BS0CB(`#``````P0@`"$$``!R0"``$"XA`$CF,LU```````0Q`E$```
+M!ZYB+-0"XA`$``(0)XYC+-0``````$,0)*YB+-2.(@`,`````#!"``000``'
+M)`(``0+B$`2.8RS8``````!#$"40```'KF(LV`+B$`0``A`GCF,LV```````
+M0Q`DKF(LV(XB``P`````,$(`"!!```<D`@`!`N(0!(YC+-P``````$,0)1``
+M``>N8BS<`N(0!``"$">.8RS<``````!#$"2N8BS</`(``B1"ZHP#P"`E`$#X
+M"0(@*"4D`@`!C[\`-(^^`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4
+MC[``$`/@``@GO0`X)[W_Z*^_`!``!2B`/`(``"1"````0/@))*4(`(^_`!``
+M`````^``"">]`!@GO?_HK[\`$``%*(`\`@``)$(```!`^`DDI0@`)`(``8^_
+M`!```````^``"">]`!@GO?_HK[\`$"0&``$`IC`$/`(``"1"````0/@))`4(
+M0"0"``&/OP`0``````/@``@GO0`8)[W_V*^_`""OLP`<K[(`&*^Q`!2OL``0
+M`("8)0"@D"4`$BB`/`(``"11```"(/@))*4*`#!0``,6```)`F`@)0(@^`DD
+M!0A`)`,``0)#&`0`0Q`D$$```P(`$"4D$``!`@`0)8^_`""/LP`<C[(`&(^Q
+M`!2/L``0`^``"">]`"@GO?_(K[\`,*^W`"ROM@`HK[4`)*^T`""OLP`<K[(`
+M&*^Q`!2OL``0`("0)0"@N"4D!@`!/`(``"1"```D!0B``$#X"0+F,`0D%0/H
+M/`(``"11```\`@``$```!"10```"`/@))`0`9":U__\2H``%`D`@)0(@^`D"
+MX"@E%$#_^``````\`@``)$(```)`("4`0/@)`N`H)1!``&D\`@``CD0!S```
+M```X@P`'+&,``3B"``LL0@`!`&(8)11@``PD`P`*$(,`"B0"``D0@@`(````
+M`!2#`%H\`@``ED(!T``````L0@`$$$``53P"`````(@E/`(``"14```\`@``
+M)%,``#P6``$"0"`E`H#X"30%@$P`0(`E`D`@)30%@0`\!@`*`F#X"33&`&0`
+M$(*",@;__P)`("4T!8#\`F#X"0#6,"4"0"`E`H#X"30%@$P``A*"$%``!"8Q
+M``$N(@`"%$#_Z@)`("4\$0``)C$```)`("4"(/@)-`6`2#P&`$`\$```)A``
+M``)`("4T!8!(`@#X"0!&,"4\`@``)$(```!`^`DD!`#(`D`@)0(@^`DT!8#\
+M/`;__C3&__\"0"`E-`6`_`(`^`D`1C`D)!``9#P"```D4P``/`(``!````,D
+M40```B#X"20$``H"0"`E`F#X"0+@*"400``$/`(``"80__\6`/_W`````"1"
+M```"0"`E`$#X"30%@$@\!O^_-,;__SP#```D8P```D`@)30%@$@`8/@)`$8P
+M)#P"```D0@```D`@)20%"(``0/@)```P)0`5$"N/OP`PC[<`+(^V`"B/M0`D
+MC[0`((^S`!R/L@`8C[$`%(^P`!`#X``()[T`.(^C`!2/J0`@CZ@`*(^J`"P`
+M````A((O]```````8A@A+&(`0!1```(`H#@E)`,`/S#"#_\``QP``$,P)3$"
+M`"`00``"/`(`@`#","6/H@`D```````"%D`\`QX``$,0)`#"&"4Q`@`!$$``
+M`CP"`0``8A@E,0(`$!!```(\`B```&(8):CC``BXXP`+CZ4`$```````!2T`
+MCZ0`/```````!"9`CZ,`-````````Q]`CZ(`.````````A;``*0H)0"C*"4`
+MHB@E,0(``A!```(\`@$``*(H):CE``RXY0`/CZ(`'````````A0`/`,`#P!#
+M&"0Q`@!`$$```@`````T8X``J.,`$+CC`!./H@`8`````*CB`!2XX@`7)`+_
+M_Q$B``\`"1-`B.0`#)CD``\\`P`/-&/@``!#$"0`@B`EJ.0`#+CD``^(X@`(
+MF.(`"SP#0```0Q`EJ.(`"+CB``LQ`@`,$$``(CP#?P`T8_\``4,8!S!C``$0
+M8``>```0)3$"``@``A`K``(7P(CC``B8XP`+``````!B&"4Q`@`$$$```P``
+M```\`@!``&(8):CC``BXXP`+B.,`$)CC`!./H@`P`````#!"?_\`8A@EJ.,`
+M$+CC`!.(X@`4F.(`%P`*'0``0Q`EJ.(`%+CB`!<D`@`!`^``"`````"/J``4
+MCZD`'``````0X``/``<5`(BC`!"8HP`3/`0`\`!$$"0`8A@E-&.``*BC`!"X
+MHP`3B*(`%)BB`!<`!AE``$,0):BB`!2XH@`7$0``$0`(%@"(HP`0F*,`$SP$
+M#P``1!`D`&(8)31C@`"HHP`0N*,`$XBC`!28HP`7CZ(`$````````A*``&(8
+M):BC`!2XHP`7$2``$``)'P"(H@`0F*(`$P``````0Q`E-$*``*BB`!"XH@`3
+MB*,`%)BC`!>/H@`8```````"$\``8A@EJ*,`%+BC`!<#X``()`(``8BB``B8
+MH@`+/`,@``!#$"6HH@`(N*(`"P/@``@`````CZ,`$(^D`!0`````$.``"@``
+M``"(H@`,F*(`#Q1@``(`1A`E-$(0`*BB``RXH@`/$```'``````08``1```8
+M):B@``BXH``+J*8`#+BF``^(@@`0F((`$P````"HH@`0N*(`$XB"`!28@@`7
+M`````*BB`!2XH@`7$```"@````"HHP`(N*,`"S3"$`"HH@`,N*(`#ZBC`!"X
+MHP`3J*,`%+BC`!>HH``<N*``'XBB`!R8H@`?`````*BB`!BXH@`;`^``""0"
+M``&(HP`<F*,`'P`````P8P`!$&``JB0"``^(H@`<F*(`'P`````P0A_^``(0
+M0J3"``"(H@`8F*(`&P```````A0"I,(``J#```2(H@`8F*(`&P`````P0@`!
+M%$``'`````"(H@`8F*(`&P`````P0@`"$$```B0"``&@P@`$B*(`&)BB`!L`
+M````,$(`"!!```4`````D,(`!``````T0@`"H,(`!(BB`!B8H@`;`````#!"
+M``000``%`````)#"``0`````-$(`!*#"``2(H@`<F*(`'P```````A5",$(`
+M`Z#"``LP0P#_)`(``1!B`!8`````*&(``A!```4D`@`"$&``"P`````0```B
+M```````````08@`2`````"0"``,08@`5`````!```!H`````B*(`%)BB`!<`
+M````,$(`'Q```!2@P@`%B*(`%)BB`!<`````,$(#X!````P``A%"B*(`%)BB
+M`!<`````,$)\`!````8``A*"B*(`%)BB`!<```````(3PC!"`!\T0@"`H,(`
+M!8BB`!R8H@`?```````"$T*@P@`&B*(`&)BB`!L`````,$(`\``"$0*@P@`'
+MB*(`&)BB`!L`````,$(/```"$@*@P@`(D,,`"R0"``(08@`5`````"AB``,0
+M0``&)`(``R0"``$08@`8`````!```!\``````````!1B`!P`````B*,`$)BC
+M`!,```````,>`C!C``^0P@`(``````!#$"&@P@`(B*,`$)BC`!,```````,=
+M`C!C``^0P@`(``````!#$"&@P@`(B*,`$)BC`!,```````,<`C!C``^0P@`(
+M``````!#$"&@P@`(B*(`&)BB`!L`````,$+P```"$P*@P@`)B*,`')BC`!\\
+M`@$``&(8)"QC``$D`@`"`$,0(Z#"``H``!`E`^``"`````",H@``C(-&H```
+M````0Q`DK*(````"$">,@T:@``````!#$"0#X``(K()&H```````````)[W_
+MX*^_`!BOL0`4K[``$`"`@"4\`@``)$(```!`^`DF!2R$/!$``"8Q```"`"`E
+M-`6!)`(@^`D``#`E`@`@)30%@2@"(/@)```P)0(`("4D!0!``B#X"0``,"4"
+M`"`E-`6!,`(@^`D\!@`"`@`@)30%@3@"(/@)/`8"`(^_`!B/L0`4C[``$`/@
+M``@GO0`@)[W_X*^_`!BOL0`4K[``$`"`B"4\$```)A```"0%`$`"`/@))`8`
+M!CP"```D0@```B`@)0!`^`DF)2R$`B`@)30%@20"`/@)```P)0(@("4T!8$H
+M`@#X"0``,"6/OP`8C[$`%(^P`!`#X``()[T`(`"`."4``#`E``800`!&$"$`
+M`A"``$80(P`"$,``1Q`AE$0P*)2C````````$(,`'`#`$"4`!A!``$80(0`"
+M$(``1A`C``(0P"1","@`XA@AE&(````````40``-),8``23&__^4H@``````
+M`*1B``"4H@`"`````*1B``*0H@`$`````*!B``0#X``(`,`0)2S"`$`40/_<
+M````````$"4#X``(`````(R","0``````^``"``````GO?_HK[\`%*^P`!``
+M@(`E/`(``"1"````0/@))@4LA"8"+$B/OP`4C[``$`/@``@GO0`8)[W_V*^_
+M`""OLP`<K[(`&*^Q`!2OL``0`("0)0"@F"4"0(@EDB(!XP```````A'"KB(P
+M'#P"```D0@``)B0P*`!`^`DD!18````P)20/``<D#@`")`T!]"0'`,@D#`!D
+M)`L`*"0*``<\"0"_-2G^##P(`+\U"/\XCD(!S``````L0@`'$$``"``&$$``
+M1A`A``(0@`!&$",``A#``%$0(1````>@3S`P`$80(0`"$(``1A`C``(0P`!1
+M$"&@3C`P``800`!&$"$``A"``$80(P`"(,`F)0`$`(40(:Q-,#@D@S!``B,0
+M(:Q'````HQ@AK&<``"2#,$@"(Q`AK$P```"1$"&L2S!0`*,8(:QJ```D@C`P
+M`B(0(:!```2@0``%D$,```````"@0P`"H$```XXB,!P`````$$``!`"%$"&L
+M23!H`)$0(:Q(,'`DQ@`!+,(`0!1`_\@`````CB(P'``````00``./!```"80
+M```"0"`ECB8P;`(`^`DT!8$L`D`@)8XF,'`"`/@)-`6!-#P"```D0@```$#X
+M"0)`("4D`@!D$F``!JXB,"".(C`8`````#1"``$0```%KB(P&(XB,!@D`__^
+M`$,0)*XB,!B/OP`@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`H)[W_X*^_`!BO
+ML0`4K[``$`"`B"6.(C`<`````!!```T\`@``)$(```!`^`D\$```)A````(@
+M("4T!8$L`@#X"0``,"4"("`E-`6!-`(`^`D``#`EC[\`&(^Q`!2/L``0`^``
+M"">]`"`GO?^8K[\`8*^W`%ROM@!8K[4`5*^T`%"OLP!,K[(`2*^Q`$2OL`!`
+M`("H)0*@H"6.ES`D`````"RB``<00`'T```0)3P"```D0EN0``48@`!B&"&,
+M8@````````!```@``````,"P)2S#``408`'H```0)3P2```F4@```J`@)0)`
+M^`DT!9A0/`/P#S1C__\`0Q`D`!:`@`(4&"&,9D8H```````&-0`\`P_P`,,P
+M)#P1```F,0```J`@)30%F%`"(/@)`$8P)0*@("4"0/@)-`687"0#@'\`0Q`D
+M`A08(8QF1E````````8QP##&?X`"H"`E-`687`(@^`D`1C`E`J`@)0)`^`DT
+M!9A</`/_P#1C?_\`0Q`D)I,`!`(3&"&,9D8X```````&,\`\`P`_-&.```##
+M,"0"H"`E-`687`(@^`D`1C`E`J`@)0)`^`DT!9A8/`/\`S1C__\`0Q`D`A.`
+M(8X&1F````````8T@#P#`_P`PS`D`J`@)30%F%@"(/@)`$8P)9+B``D`````
+M`%80*Q!```8`````CH(L2``````D0@`!$```"JZ"+$B2X@`)``````+"$"L0
+M0``%`````(Z"+$P`````)$(``:Z"+$P0``&-HO8`"20#`'^OHP`0)`(`,J^B
+M`!2OHP`8)`(`**^B`!ROHP`@)`(`3:^B`"2OHP`H)`(`0*^B`"PD`@`?KZ(`
+M,"0"`!"OH@`T)`(`/Z^B`#@D`@`PKZ(`/``&F"L\`@``)%(```*@("4"0/@)
+M-`68;#P#_^`T8S__`$,0)``3@(`GHP`0`'`8(8QF``````````8S@#P#`!\T
+M8\```,,P)#P#```D<0```J`@)30%F&P"(/@)`$8P)0*@("4"0/@)-`68;#P#
+M\!\T8___`$,0)">C`!@`<!@AC&8`````````!C5`/`,/X`##,"0"H"`E-`68
+M;`(@^`D`1C`E`J`@)0)`^`DT!9AH/`/_`31C__\`0Q`D)Z,`(`!P&"&,9@``
+M```````&-$`\`P#^`,,P)`*@("4T!9AH`B#X"0!&,"4"H"`E`D#X"30%F&@\
+M`X#_-&/__P!#$"0GHP`H`'`8(8QF``````````8V`#P#?P``PS`D`J`@)30%
+MF&@"(/@)`$8P)0*@("4"0/@)-`68:"0#_^``0Q`D)Z,`,`!P&"&,9@``````
+M`##&`!\"H"`E-`68:`(@^`D`1C`E`J`@)0)`^`DT!9AL)`/`_P!#$"0GHP`X
+M`'`8(8QF``````````8R`##&/P`"H"`E-`68;`(@^`D`1C`E$F``"0*@("4"
+M0/@)-`68;`*@("4T!9AL`B#X"31&``$0```-+F,``3P"```D0@```$#X"30%
+MF&PD!O_^/`,``"1C```"H"`E-`68;`!@^`D`1C`D+F,``9+B``P`````$&(`
+M]R0"``$28``&`````(Z"+%@`````)$(``1````6N@BQ8CH(L7``````D0@`!
+MKH(L7"YB``$0``#HHN(`#"0"``BOH@`0)`(`!J^B`!0`!H`K/`(``"1"```"
+MH"`E`$#X"30%H@@D`__``$,0)``0((`GHP`0`&08(8QF````````,,8`/SP#
+M```D8P```J`@)30%H@@`8/@)`$8P)9+B``T`````$@(`S20"``$2```&````
+M`(Z"+&``````)$(``1````6N@BQ@CH(L9``````D0@`!KH(L9!```+^B\``-
+MKZ``$"0"``2OH@`4)`(`"*^B`!@`P(@E+,,``Q!@`+<``!`E/`(``"1"```"
+MH"`E`$#X"30%F%@\`__\-&,/_P!#$"0`$1B``Z,8(8QF`!````````8S`#P#
+M``,T8_```,,P)#P#```D8P```J`@)30%F%@`8/@)`$8P)9+B``L``````%$0
+M*Q!```8`````CH(L:``````D0@`!$```"JZ"+&B2X@`+``````(B$"L00``%
+M`````(Z"+&P`````)$(``:Z"+&P0``"+HO$`"SP"```D0UMPC$);<`````"O
+MH@`0C&(`!`````"OH@`4C&(`"`````"OH@`8C&(`#`````"OH@`<C&(`$```
+M``"OH@`@C&(`%`````"OH@`DC&(`&`````"OH@`HC&(`'`````"OH@`L`,"(
+M)2S#``@08`!N```0)3P"```D0@```J`@)0!`^`DT!9DD)`/_`0!#$"0`$1B`
+M`Z,8(8QF`!````````8P0##&`/X\`P``)&,```*@("4T!9DD`&#X"0!&,"62
+MX@`*``````!1$"L00``&`````(Z"+%``````)$(``1````JN@BQ0DN(`"@``
+M```"(A`K$$``!0````".@BQ4`````"1"``&N@BQ4$```1:+Q``H4P``5)`/_
+M_8Z",!@``````$,0)*Z",!@\`@``)$(```!`^`D"H"`E/`(``"1"````0/@)
+M`J`@)20%_O\\`P``)&,```*@("4`8/@)`$4H)!```#`D`@`!CH(P&``````P
+M0@`"%$``*R0"``&.@C`<`````!!``!H\`@``)$(```!`^`D"H"`E)`7^_SP#
+M```D8P```J`@)0!@^`D`12@D/!```"80```"H"`ECH8P;`(`^`DT!8$L`J`@
+M)8Z&,'`"`/@)-`6!-#P"```D0@```$#X"0*@("40```)`````"1"````0/@)
+M`J`@)3P#```D8P```J`@)0!@^`DT10$`CH(P&``````T0@`"KH(P&"0"``&/
+MOP!@C[<`7(^V`%B/M0!4C[0`4(^S`$R/L@!(C[$`1(^P`$`#X``()[T`:">]
+M_]BOOP`@K[,`'*^R`!BOL0`4K[``$`"`D"6.43`D`````*X@`!".0C`<````
+M`!!``"H"0)@ECB,`%#P"`,``0Q`K$$```SP"`,`0```#KB``1`!#$".N(@!$
+MCB,`'#P"`,``0Q`J$$```SP"`,`0```#KB``2`!#$".N(@!(/!```"80```"
+M0"`ECB8`1`(`^`DT!8$L`D`@)8XF`$@"`/@)-`6!-`)`("4T!8$P`@#X"3P&
+M``("0"`E-`6!.`(`^`D\!@(`/`(``"1"```"0"`E`$#X"29E+(2N(``\KB``
+M0(^_`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`"@GO?_@K[\`&*^Q`!2OL``0
+M`("()8XE$C0`````CB(P&``````P0@`#)`,``Q1#`&P"(#@ECC`P)`````"2
+M!@`)`````"S"``000``'/`(``"1"```D!0`!`$#X"23&``$0``!?`````)(&
+M``J2`@`(``````#"$"L00``(/`(``"1"```"("`E)`4`!0!`^`DDQ@`!$```
+M4@````",XRR8`````#!B`'\L0@!`)&,`?Q!```0``QG"C.(LF````````AG"
+MC@(`*```````0Q`J$$``$`````"2`@`,`````!1``!H"("`E/!```"80```D
+M!0`"`@#X"0``,"4"("`E)`4`!0(`^`D``#`E$```-`````".`@`D``````!#
+M$"H00``6/`(``)("``P`````$$``!CP"```D0@```B`@)20%``(`0/@))`8`
+M`9(&``L`````+,(``A!``"$\`@``)$(```(@("4D!0`$`$#X"23&``$0```:
+M`````"1"````0/@)`B`@)21"__XL0@`"$$``$P````"2`@`,`````!1```8\
+M`@``)$(```(@("4D!0`"`$#X"0``,"62`@`+`````!!```8\`@``)$(```(@
+M("4D!0`$`$#X"0``,"6/OP`8C[$`%(^P`!`#X``()[T`(">]_^"OOP`8K[$`
+M%*^P`!``@(@ECB42-`````".(C`8`````#!"``,D`P`#%$,`.0(@."6.,#`D
+M`````)(&``D`````+,(`!!!```<\`@``)$(``"0%``$`0/@)),8``1```"P`
+M````C.,LF``````P8@!_+$(`0"1C`'\00``$``,9PHSB+)@```````(9PHX"
+M`"0``````$,0*A!```T\`@``D@8`"P`````LP@`"$$``&#P"```D0@```B`@
+M)20%``0`0/@)),8``1```!$`````)$(```!`^`D"("`E)$+__BQ"``(00``*
+M`````)("``L`````$$``!CP"```D0@```B`@)20%``0`0/@)```P)8^_`!B/
+ML0`4C[``$`/@``@GO0`@)[W_V*^_`""OLP`<K[(`&*^Q`!2OL``0`("()0"@
+M@"4\`@`")$+]D(XE$C0`0/@)`B"8)0`"&$``8A@A``,8@`!B&",``QC``B.0
+M(292,"BN,C`DCB,!W"0"``$48@`&)`/__8XB,!@`````-$(``A````6N(C`8
+MCF(P&```````0Q`DKF(P&(XC`=PD`@`!$&(`*0(@("6.8BQX`````"1"``&N
+M8BQX/!```"80```D!0`!`@#X"0``,"4"("`E)`4`!0(`^`D``#`E`B`@)20%
+M``0"`/@)```P)0(@("4D!0`"`@#X"0``,"4"("`E)`4``P(`^`D``#`E/`(`
+M`"1"````0/@)`B`@)3P#```D8P```B`@)0!@^`DT10$`/`(``B1""0P`0/@)
+M`B`@)1```&``````CB(P&``````P0@`#)`,``Q1#`%H`````$@``&3P0```F
+M$````B`@)9)&``D"`/@))`4``0(@("621@`*`@#X"20%``621@`,`B`@)20%
+M``("`/@)+,8``0(@("621@`-`@#X"20%``,"("`EDD8`"P(`^`DD!0`$$```
+M%@`````F$````B`@)20%``$"`/@))`8`!`(@("621@`(`@#X"20%``4"("`E
+M)`4``@(`^`DD!@`!`B`@)20%``,"`/@))`8``0(@("4D!0`$`@#X"20&``*.
+M8C`<`````!!``!H\`@``)$(```!`^`D"("`E)`7^_SP#```D8P```B`@)0!@
+M^`D`12@D/`(``B1""0P`0/@)`B`@)3P0```F$````B`@)30%@3`"`/@)/`8`
+M`@(@("4T!8$X`@#X"3P&`@`0```.`````#P"``(D0@D,`$#X"0(@("4\`@``
+M)$(```!`^`D"("`E/`,``"1C```"("`E`&#X"31%`0"/OP`@C[,`'(^R`!B/
+ML0`4C[``$`/@``@GO0`H)[W_V*^_`""OLP`<K[(`&*^Q`!2OL``0`("0)0"@
+MB"4"0)@E/!```"80```T!8$D`@#X"0``,"4"0"`E-`6!*`(`^`D``#`E/`(`
+M`"1"```"0"`E`$#X"29%+(2.(@```````*Y"+)B.(@`$`````*Y"+)R.(@`(
+M`````*Y"+*`\$```)A````)`("4"`/@)-`6!+`!`B"4"0"`E`@#X"30%@30`
+M0"@E/`,`P`(C$"000P`#`*,0)!1#`#``````CG`P)`````".!`!$``````(D
+M("..`@`\``````""$"..8RQP``````!#$"&N8BQPK@0`/(X$`$@``````*0@
+M(XX"`$```````((0(XYC+'0``````$,0(:YB+'2N!`!`C@,`/(X"`!0`````
+M`$,0*Q!```0\`@`")$(*#`!`^`D"0"`EC@,`0(X"`!P``````$,0*Q!```8\
+M`@`"/`(``B1"#```0/@)`D`@)3P"``(D0@D,`$#X"0)`("6/OP`@C[,`'(^R
+M`!B/L0`4C[``$`/@``@GO0`H)[W_Z*^_`!2OL``0`("`)8X&,"0`````D*,`
+M!20"`!$48@`8`@`X)8S"`#P`````)$(``:S"`#R.`BQP`````"1"``&N`BQP
+MC,,`/(S"`!0``````$,0*Q!``"(\`@`")$(*#`!`^`D`````/`(``B1""0P`
+M0/@)`@`@)1```!D`````)`(`&11B`!8`````C,(`0``````D0@`!K,(`0(SB
+M+'0`````)$(``:SB+'2,PP!`C,(`'```````0Q`K$$``"#P"``(D0@P``$#X
+M"0(`("4\`@`")$()#`!`^`D"`"`EC[\`%(^P`!`#X``()[T`&">]_^BOOP`0
+M`(`H)8R&,"0`````C(,LF``````P8@!_+$(`0"1C`'\00``$``,9PHRB+)@`
+M``````(9PHS"`"@``````$,0*A1``!H`````C,(`)```````0Q`J$$``"P``
+M``"0P@`,`````!!```<\`@``)$(``"0%``(`0/@))`8``1```!P`````D,,`
+M"P`````08``'/`(``"1"```D!0`$`$#X"21F__\0```2`````)##``H`````
+M$&``!SP"```D0@``)`4`!0!`^`DD9O__$```"`````"0Q@`)`````!#```0D
+M0@``)`4``0!`^`DDQO__C[\`$``````#X``()[T`&">]_]BOOP`@K[,`'*^R
+M`!BOL0`4K[``$`"`B"4\$```)A````(`^`DT!8#L`$"8)0(@("4"`/@)-`6`
+M\`!`D"4"("`E`@#X"30%@/@`0#`ECB4P)`````",H@`X`````!!```,`PA`K
+M$$``!P```````!@ECB(L?``````D0@`!$```$ZXB+'R,I``X``````#$(".,
+MHP`T``````)#&".,H@`P``````)B$",`@Q@C`&(8(SP"7U,T0CDI`&(`&```
+M$!```A.#``,?PP!#&".LI@`XK+,`,*RR`#0`8!`EC[\`((^S`!R/L@`8C[$`
+M%(^P`!`#X``()[T`*">]_]"OOP`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0
+M`("8)0)@D"6.<3`D`````(RB````````KF(LF(RB``0`````KF(LG(RB``@`
+M````$B``PZYB+*`\`@`")$(3C`!`^`D``````$"`)08!``D`````CF(L@```
+M```D0@`!KF(L@#P"``(D0@D,`$#X"0)@("6.(@`0``````("$"&N(@`0CD(P
+M'``````00`!)/`(``"1"```"8"`E`$#X"29%+(0\$```)A````)@("4"`/@)
+M-`6!+`!`J"4"8"`E`@#X"30%@30`0*`ECB(`1``````"HA`K%$``"`)@("6.
+M(@!(``````*"$"L00``;`````!````H`````/!```"80``".)@!$`@#X"30%
+M@2P"8"`E-`6!,`(`^`D\!@`"CB8`2``````"AA`K$$``A#P0```F$````F`@
+M)0(`^`DT!8$T`F`@)30%@3@"`/@)/`8"`!```'H`````CB0`1``````"I"`C
+MCB(`/```````@A`CCD,L<```````0Q`AKD(L<*XD`#R.)`!(``````*$("..
+M(@!```````""$"..0RQT``````!#$"&N0BQTKB0`0(YB,!@`````,$(``R0#
+M``,40P!>`````(Y#,"````````,0@`!#$"&.)``0``````!$$"L00``B/`40
+M8HXB`!@``````((`&```$!(TI4W3``````!%`!D``!`0``(1@HXC`#P`````
+M`$,0*Q1``"P\`@`"CB(`(```````@@`8```0$@```````````$4`&0``$!``
+M`A&"CB,`0```````0Q`K%$``'3P"``(D0A*$`$#X"0)@("40```9/`(``HXC
+M`!".0C`@``````!#$"L00``N`````(XB`!0``````&(`&```$!(\`Q!B-&--
+MTP!#`!D``!`0``(1@HXC`#P``````$,0*Q!```H\`@`")$(*#`!`^`D"8"`E
+M/`(``B1""0P`0/@)`F`@)1```!<`````CB(`$(XC`!P``````$,`&```$!(\
+M`Q!B-&--TP!#`!D``!`0``(1@HXC`$```````$,0*Q!```@\`@`")$(,``!`
+M^`D"8"`E/`(``B1""0P`0/@)`F`@)8^_`"B/M0`DC[0`((^S`!R/L@`8C[$`
+M%(^P`!`#X``()[T`,`````",@A(T`````)1"````````I*(``(R#$C0`````
+MD&(`!``````T0@`(H&(`!)"B``0`````-$(`"*"B``2,@A(T`````)1"``(`
+M````I*(``HR"$C0`````D$(`!`````"@H@`$C((2-`````"00@`%`````*"B
+M``4#X``(```0)2>]_\BOOP`PK[<`+*^V`"BOM0`DK[0`(*^S`!ROL@`8K[$`
+M%*^P`!``@*`E`*"P)0#`N"4`X(`E``"()3P"```D4ENP/`(``"15```\`@``
+M)%,````1$$``41`A``(8P`!R&"$``A!``%80(0`"$(``4A`AC&4``(Q&```"
+MH/@)`H`@)280``$R`@`_%$```P`````"8/@))`0``28Q``$N(@`.%$#_[``1
+M$$```(@E/`(``"1270`\`@``)%4``#P"```D4P```!$0P`!2&"$`8!`EC&4`
+M`(Q&``0"H/@)`H`@)280``$R`@`_%$```P`````"8/@))`0``28Q``$N(@!(
+M%$#_\0`1$,```(@E/`(``"128-@\`@``)%4``#P"```D4P```!$00`!1$"$`
+M`AB``'(8(0!7$"$``A"``%(0(8QE``",1@```J#X"0*`("4F$``!,@(`/Q1`
+M``,``````F#X"20$``$F,0`!+B(`0!1`_^P`````C[\`,(^W`"R/M@`HC[4`
+M)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#@GO?_8K[\`)*^T`""OLP`<
+MK[(`&*^Q`!2OL``0`*"@)3P"```D0@``EH4``):&``(`0/@)`("8)0`"%```
+M`B0#EH(``@`````P0@"`$$``+``$@$`"!(`A`!"`@#P"```D0F=,`@*`(3P"
+M```D0@``C@0`!`!`^`DD!0`(,%(`_P`2D4".`@`````````"$0`"0I`EAA``
+M"``````\`@``)$(```)@("4`0/@)-`6B!`!`."66@P``)`()M!1B``@\`@``
+M)$(```)@("4T!:($`$#X"33F`!`0```,*@(`D20&_^\D0@```F`@)30%H@0`
+M0/@)`.8P)!````0J`@"1`("`)0``D"4J`@"1$$``!#P"```R`@`!$$``"#P"
+M```D0@``)@3_Z`!`^`DD!0`(,%$`_Q````LD`@`!)@3_Z``$%\(`@B`A/`(`
+M`"1"````!"!#`$#X"20%``@P40#_```0)0`1B(```A!``B*()38Q!`$R1@#_
+M``8R`#(B`/\\$```)A````)@("4T!9B<`@#X"0#","4`$8H",D+_`#(F`/\"
+M8"`E-`68T`(`^`D`1C`EKG02-"0"``&/OP`DC[0`((^S`!R/L@`8C[$`%(^P
+M`!`#X``()[T`*(R$+^P`````+*(`"!!``!0`!1B`/`(``"1":)``8A@AC&(`
+M````````0``(``````/@``@`@!`E`^``""2"`$0#X``()((`2`/@``@D@@!,
+M`^``""2"`%`#X``()((`E`/@``@``!`E)[W_:*^_`)2OO@"0K[<`C*^V`(BO
+MM0"$K[0`@*^S`'ROL@!XK[$`=*^P`'"OI`"8KZ4`G##4__\`@)`EE*(``@``
+M```P0P'P)`(`P!!B`&$``)@E*&(`P1!```8D`@%`)`(`H!!B`$<``!`E$``!
+MN``````08@`#)`(!4!1B`;0``!`ECZ,`G`````"48@```````"1"\%\L0@3K
+M$$``!P``B"6651-4`````)96$U8`````$```)P``*"648@```````"1"ZW0L
+M0@#P$$``!P``*"6651-8`````)96$UH`````$```&P````"/HP"<`````)1B
+M````````)$+JA"Q"`.$00``'``"()995$UP`````EE837@`````0```-```H
+M)91B````````+$(670``L"440``%``"H)995$V``````EE838@```````(@E
+M```H)99"$M@`````KZ(`8)9#$MX`````KZ,`9"QB``&OH@!HED,3+``````0
+M```HKZ,`;)95$V0`````EE839@````"611-L`````)91$W``````ED(2V@``
+M``"OH@!@ED,2X`````"OHP!D+&(``:^B`&B60Q,N`````!```!2OHP!LEE43
+M:`````"65A-J`````)9%$VX`````EE$3<@````"60A+<`````*^B`&"60Q+B
+M`````*^C`&0L8@`!KZ(`:)9#$S``````KZ,`;```@"4GI``8/`(``"1&7T``
+M$!B``(,8(0`0$$``4!`A``(00`!4$"$``A"``$80(8Q"````````K&(``"80
+M``$N`@`1%$#_\P`0&("/HP"<`````)1B``(`````,$(`@!!```T\$```KZ``
+M$"80```GI``8)`8``P(`^`DD!P!WKZ``$">D`!@"("@E)`8``P(`^`DD!P!Z
+M``"`)2>Q`!@\`@``)%X``#P"```D5P```!`00`!0$"$``A#`/`,``"1C7T``
+M0Q`A`!`8@`(C&"&/I`"8C$4``(QF```#P/@))G,``3)B`#\40``#``````+@
+M^`DD!``!)A```2X"`!$40/_L`!`00```@"4\`@``)%%CV#P"```D7@``/`(`
+M`"17````$!#``%$8(0!@$"6/I`"8C&4``(Q&``0#P/@))G,``3)B`#\40``#
+M``````+@^`DD!``!)A```1(`__$\`@````"`)2118^`\`@``)%X``#P"```D
+M5P```!`00`!0$"$``AC``'$8(0`"$$``5!`A``(0@`!1$"&/I`"8C&4``(Q&
+M```#P/@))G,``3)B`#\40``#``````+@^`DD!``!)A```1(`_^P\`@````"`
+M)2118_@\`@``)%X``#P"```D5P```!`00`!0$"$``AC``'$8(0`"$$``5!`A
+M``(0@`!1$"&/I`"8C&4``(Q&```#P/@))G,``3)B`#\40``#``````+@^`DD
+M!``!)A```1(`_^PGI``8``"`)3P"```D1600`!`8@`"#&"$`$!!``%`0(0`"
+M$$``5!`A``(0@`!%$"&,0@```````*QB```F$``!+@(`$11`__,`$!B`CZ,`
+MG`````"48@`"`````#!"`4`D`P%`%$,`#R01``.611/,K[$`$#P0```F$```
+M)Z0`&"0&``$"`/@))`<`,Y9%$\ZOL0`0)Z0`&"0&``$"`/@))`<`+:^@`!`\
+M$```)A```">D`!B/I0!H)`8``0(`^`DD!P!?KZ``$">D`!B/I0!@)`8`!`(`
+M^`DD!P!@KZ``$">D`!@"H"@E)`8``P(`^`DD!P!HKZ``$">D`!@"P"@E)`8`
+M`P(`^`DD!P!K``"`)3P"```D5V00)[$`&#P"```D5@``/`(``"15````$!!`
+M`%`0(0`"$,``5Q`A`!`8@`(C&"&/I`"8C$4``(QF```"P/@))G,``3)B`#\4
+M0``#``````*@^`DD!``!)A```2X"`!$40/_N`!`00```@"4GI``8/`(``"1%
+M9:@`$!B``(,8(0`0$$``4!`A``(00`!4$"$``A"``$40(8Q"````````K&(`
+M`"80``$N`@`(%$#_\B0&``:OH``0/!```"80```GI``8CZ4`;`(`^`DD!P`=
+MKZ``$">D`!B/I0!D)`8``0(`^`DD!P`$CZ,`G`````",8@```````#!"P``0
+M0``<``"`)91B``(`````,$)``!1```(D$0`0)!$`'Z^@`!`\$```)A```">D
+M`!@D!0`?)`8`!0(`^`DD!P`3KZ``$">D`!@"("@E)`8`!0(`^`DD!P`8KZ``
+M$">D`!@D!0`#)`8``@(`^`DD!P`Q``"`)3P"```D5F6H)[$`&#P"```D50``
+M/`(``"14````$!!``%`0(0`"$,``5A`A`!`8@`(C&"&/I`"8C$4``(QF```"
+MH/@))G,``3)B`#\40``#``````*`^`DD!``!)A```2X"``@40/_N`!`00*Y`
+M+\0D`@`!C[\`E(^^`)"/MP",C[8`B(^U`(2/M`"`C[,`?(^R`'B/L0!TC[``
+M<`/@``@GO0"8,(3__S"E__\PQO__,.?__Y>H`!(``````.@`&```&!(08``H
+M```0)1#%`"0``````(40(P`"&$``8A@A``,8P`!B&"$``QB``,40(P!B`!H`
+M`!@2%$```@``````!P`-``,<```#)`,$@``5`.`8)2B"`&400``2`0`8)0"(
+M`!@``!@2)`(`9`!$$",`1P`8```0$@!B&"$\`E'K-$*%'P!B`!@``!`0``(1
+M0P`#'\,`0Q`C$````C!#__\`X!@E`&`0)0/@``@`````)[W^H*^_`5ROO@%8
+MK[<!5*^V`5"OM0%,K[0!2*^S`42OL@%`K[$!/*^P`3@`X+@E`("@)20"`#^O
+MH@$PEN(``@`````P0P'P)`(`T!!B`"8``/`E*&(`T1!```@D`@%0)`(`H!!B
+M`!@D`@#`$&(`'@``$"40``$B`````!!B``HH8@%1$$``!B0""4`D`@%`$&(`
+M!0``$"40``$9`````!1B`1<``!`EEH(3Y@````"GH@$D)H(3TJ^B`2`F@A/H
+M$```$*^B`2B6@A7P`````*>B`20F@A7XKZ(!(":"%JX0```(KZ(!*):"%?``
+M````IZ(!)":"%?*OH@$@)H(6$J^B`2@GM0$@/`(``"1"```GI``8`$#X"20%
+M`0@GM@`@)[,`H"02``$``(@E`!$00`!6$"&D4@``)E(``2I"`$`40/_Z)C$`
+M`:>Q`!XD`@`!IZ(`&B0"`#^GH@`<,B+__Q!``!$``(@E/`(``B12*?@`$8!`
+M`A80(9;D``"410```D#X"0*@,"4"$X`AI@(``"8Q``&7H@`>``````(B$"H4
+M0/_T`!&`0(9F````````EZ(`'@```````A!``F(0(81'__X`````$```"P``
+MB"4"8B`AA(/__I2%``"$@@````````!#$"H00``"`````*2%__XF,0`!EZ(`
+M'@`````"(A`J$$``$``1$$``4Q`AA$,`````````PQ`J%$```P``````8#`E
+M,C[__Y>B`!X``````%$0(R1"__\P4O__%D#_XP`2$$"7H@`>`````!!``!``
+M`(@E`$`@)0`1$$``4Q`AA$,`````````XQ`J$$``!```````8#@E,B/__Z^C
+M`3`F,0`!`B00*A1`__0`$1!`),(`&3P$4>LTA(4?`$0`&```&!```QD#``(7
+MPP!B&",``Q!``$,0(0`"$,``0Q`A``(40``"A`,``)`E`@0`&```(!``!"$#
+M``(7PP""(",DA``!&(``$```B"4``!`0``(1`P`0'\,`0Q`C)$0``0(@&"4F
+M(@`!,%'__XZ"1G@``QA``&(8(292``$"1!`J%$#_]Z1^``"7H@`>``````!`
+M("4``A!``F(0(81"__X``````@(0*BXC`$``0Q`D$$``6@``D"4\`@`")%4C
+M_"8"`#(``A0```*$`P"`$"4``A!``F(0(81"__X``````@(0*A!``"$`$AA`
+M`!(00`!3$"&$0P````````(#&".$0@`"``````("$",`8@`8```8$AA@`!4`
+M$AA```000`)B$"&$0O_^``````("("H0@``-)E(``0`2$$``4Q`AA$,`````
+M```"`Q@CA$(``@`````"`A`C`&(`&```&!(<8/_S```````2&$``<Q`AE$4`
+M`)1&``(`=A@AE&<`````````!SA`E&(``@```````A!`,$+__Z^B`!`R!/__
+M`J#X"3#G__\D0@`!,$+__XZ#1G@`$2!``(,8(0`"$$*D8@``CH)&>```````
+M@B`AE((``(^C`3```````&(0*Q!```(F(@`!I(,``#!1__^7I``>```````$
+M$$`"8A`AA$+__@`````"`A`J+B,`0`!#$"040/^K)@(`,BXB`$`00``,````
+M`(Z#1G@`$1!``$,0(91#__X`````I$,``"8B``$P4?__+B(`0!1`__8`````
+MIH`O]"0"``&/OP%<C[X!6(^W`52/M@%0C[4!3(^T`4B/LP%$C[(!0(^Q`3R/
+ML`$X`^``"">]`6`GO?^HK[\`4*^W`$ROM@!(K[4`1*^T`$"OLP`\K[(`.*^Q
+M`#2OL``P`,"H)3"7__\PMO__/`(``B1"*Z@"X"`E`L`H)0!`^`DGIP`8$$``
+M!`+@("67H@`8$```2@````"6I@`$)Z(`'*^B`!`\`@``)$(``(ZE````0/@)
+M)Z<`&I>E`!HGH@`@KZ(`$#P0``(F$"Q4`L`@)0*@,"4"`/@))Z<`'I>E`!PG
+MH@`DKZ(`$`+`("4"H#`E`@#X"2>G`"(GLP`F/!```B80*ZB7I``:EZ4`'@*@
+M,"4"`/@)`F`X)2>R`"B7I``:EZ4`(`*@,"4"`/@)`D`X)9>E`!Z7I@`@EZ<`
+M)I>B`"@`````KZ(`$#P1``(F,2/\`B#X"0+`("4`0*`EEZ0`')>E`"("H#`E
+M`@#X"0)@."67I``<EZ4`)`*@,"4"`/@)`D`X)9>E`"*7I@`DEZ<`)I>B`"@`
+M````KZ(`$`(@^`D"P"`EEZ4`&I>F`!ROH@`0`N`@)0(@^`D"@#@EC[\`4(^W
+M`$R/M@!(C[4`1(^T`$"/LP`\C[(`.(^Q`#2/L``P`^``"">]`%@PA/__,*7_
+M_XS(``@`````E,(`!``````00``B``!0)94"````````%$0`&``````E"0`(
+ME0(`!@`````00``3```8)24+``:5(@```````!1%``DD8P`!)&/__P`#$$``
+M2Q`AE$(`&`````"DX@```^``""0"``&5`@`&``````!B$"H40/_P)2D``B5*
+M``&4P@`$``````%"$"H40/_@)0@`-`/@``@``!`E)[W_X*^_`!@PA/__,*C_
+M_XS%``@`````E,(`!``````00``/```8)92B````````$$@`"P````"4Q@`$
+M`````"1C``$`9A`J$$``!22E`#24H@```````!1(__D`````E*8`!H^B`#``
+M````KZ(`$#P"```D0@```$#X"22E``B/OP`8``````/@``@GO0`@)[W_Z*^_
+M`!2OL``0`("`)8X$1G@`````$(``!3P"```D0@```$#X"0````"N`$9XC@0O
+M[``````0@``%/`(``"1"````0/@)`````*X`+^R/OP`4C[``$`/@``@GO0`8
+M`^``""0"``$\`@``E*,``)1":+```````$,0*Q1```P``"`E/`(``"1#:+"4
+MI0``)(0``0`$$(``0Q`AE$(`````````11`K$$#_^0`````\`@``)$)HL``$
+M&(``0Q`AA$(``@`````#X``(`````">]_^"OOP`8K[$`%*^P`!``H(@E`("`
+M)3P"```D0@```$#X"20$`+0`0!@E$&``"JX#+^PD`@"`K@)&?#P"```D0@``
+M`$#X"20$`(``0!@E%&``!*X#1G@D`P`"$```&JXC```\`@`")$(LY*X"+*@\
+M`@`")$(8D*X"+*P\`@`")$(<%*X"++`\`@`")$(:.*X"++0\`@`")$(<?*X"
+M++@\`@`")$(DR*X"++P\`@`")$(M1*X"+,`\`@`")$(M3*X"+,0D`@`!C[\`
+M&(^Q`!2/L``0`^``"">]`"`GO?_(K[\`,*^W`"ROM@`HK[4`)*^T`""OLP`<
+MK[(`&*^Q`!2OL``0`("@)0"@L"4`P+@E`."`)0``B"4\`@``)%)HX#P"```D
+M50``/`(``"13````$1!``%$0(0`"&,``<A@A``(00`!6$"$``A"``%(0(8QE
+M``",1@```J#X"0*`("4F$``!,@(`/Q1```,``````F#X"20$``$F,0`!+B(`
+M$!1`_^P`$1!```"()3P"```D4FI@/`(``"15```\`@``)%,````1$,``4A@A
+M`&`0)8QE``",1@`$`J#X"0*`("4F$``!,@(`/Q1```,``````F#X"20$``$F
+M,0`!+B(`111`__$`$1#```"()3P"```D4FR(/`(``"15```\`@``)%,````1
+M$$``41`A``(8@`!R&"$`5Q`A``(0@`!2$"&,90``C$8```*@^`D"@"`E)A``
+M`3("`#\40``#``````)@^`DD!``!)C$``2XB`$`40/_L`````(^_`#"/MP`L
+MC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`X)[W_T*^_`"BO
+MM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@*`E`*"8)0``J"6690```````"RB
+M$L`00`!(``"`)22D]W`\!F9F-,9F9P"&`!@``!@0``,80P`$%\,`8A@C``,0
+M@`!#$"$4@@`))*3W4``%$$`D4>[@`B8`&```$!```A"#`!$?PQ```!0`0X@C
+M/`9F9C3&9F<`A@`8```8$``#&$,`!!?#`&(8(P`#$(``0Q`A%((`N```$"4`
+M!1!`)%'NH`(F`!@``!`0``(0@P`1'\,`0X@C)!4``0`1B(`\`@``)$(``#(D
+M`/\`0/@))`4`"`!`B"4\`@``)$(```*`("4`0/@)-`6B!`!`."668P``)`()
+MM!1B``@\`@``)$(```*`("4T!:($`$#X"33F`!`0``"&`!&1`"0&_^\D0@``
+M`H`@)30%H@0`0/@)`.8P)!```'X`$9$`EF0``#P"S,PT0LS-`((`&0``$!``
+M`A""``(8@`!B&"$`@Q@C,&/__R0"``(48@`;+((5/!!``!D\$```EF,`````
+M```D8__^,&/__P`#$(``0Q`A``(00#P#__\T8T2``$,0(3P$4>LTA(4?`$0`
+M&```(!``!"##``(7PP""(",F$```)(0``0(`^`DD!0`(`$"()1```%,``"`E
+M/`/,S#1CS,T`@P`9```8$``#&0(``Q"``$,0(0`"$(``@A`C,$+__Q1``!(L
+M@A0`%$``$"2"[4`\!&9F-(1F9P!$`!@``"`0``0@PP`"%\,`@B`C/!```"80
+M````!""``@#X"20%``@`0(@E$```-B0$``.69```/`/,S#1CS,T`@P`9```8
+M$``#&,(``Q"``$,0(0`"$$``@A`C,$+__Q1``!`D@NU`/`1F9C2$9F<`1``8
+M```@$``$((,``A?#`((@(SP0```F$`````0@0`(`^`DD!0`(`$"()1```!HD
+M!``"/`/,S#1CS,T`@P`9```8$``#&((``Q"``$,0(0""$",P0O__%$``)0``
+M$"4DA.U`/`)F9C1"9F<`@@`8```0$``"$$,`!"?#/!```"80````1"`C`@#X
+M"20%``@`0(@E)`0``0(`^`DD!0`"`$"`)0`1D0``$!"``D*0)0`5$$`"0I`E
+M-E(0`3P0```F$````H`@)30%F)P"`/@),D8`_P`2D@("@"`E-`68V`(`^`DR
+M1@!_KI,2-"0"``&/OP`HC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]
+M`#",A"_L`````"2C__\L8@`'$$``$@`#&(`\`@``)$)TN`!B&"&,8@``````
+M``!```@``````^``"`"`$"4#X``()((`!`/@``@D@@`(`^``""2"``P#X``(
+M)((`K`/@``@``!`E)[W_J*^_`%2OO@!0K[<`3*^V`$BOM0!$K[0`0*^S`#RO
+ML@`XK[$`-*^P`#"OI`!8`*#P)0#@@"4PUO__`("@):^@`!ROH``@KZ``)*^@
+M`"B.DR_L`````":7+!"7P@`"`````#!#`?`D`@#0$&(`6@``J"4H8@#1$$``
+M""0"`5`D`@"@$&(`2"0"`,`08@!2```0)1```B0`````$&(`"BAB`5$00``&
+M)`((`"0"`4`08@`%```0)1```AL`````%&("&0``$"67P@```````"1"\%\L
+M0@3K$$``"`````"6@A-4`````*^B`!R6@Q-6`````!```":OHP`@E\(`````
+M```D0NMT+$(`\!!```@`````EH(36`````"OH@`<EH,36@`````0```9KZ,`
+M()?"````````)$+JA"Q"`.$00``(`````):"$UP`````KZ(`'):#$UX`````
+M$```#*^C`""7P@```````"Q"%ET40``'`````):"$V``````KZ(`'):#$V(`
+M````KZ,`():%$MX`````EH(3+``````0```6KZ(`&):#$VP`````KZ,`)):"
+M$W``````KZ(`*):%$N``````EH,3+@`````0```*KZ,`&):"$VX`````KZ(`
+M)*^B`"B6A1+B`````):#$S``````KZ,`&```("4\`@``)$9OB``$$(`"8A`A
+M``08P`!F&"&,8P`$)(0``1"`__FL0P`````@)29F``0\`@``)$=OD``$$(``
+MPA`A``080`!D&"$``QA``'88(0`#&(``9Q@AC&,``"2$``$0@/_UK$,`````
+M("4\`@``)$9OJ``$$(``4Q`A``080`!D&"$``QA``'88(0`#&(``9A@AC&,`
+M`"2$``$0@/_UK$,`"```("4F9@`$/`(``"1';\``!!B``&88(0`$$$``1!`A
+M``(00`!6$"$``A"``$<0(8Q"````````K&(`""2$``$L@@`H%$#_\B9Q``RO
+MH``0/`(``"12```"("`E)`8``0)`^`DD!P$NE@4``*^@`!`"("`E)`8``@)`
+M^`DD!P$.E@4``J^@`!`"("`E)`8``@)`^`DD!P$!E\(``@`````P0@!`$$``
+M,200``..X@`<`````(1%``*OL``0`B`@)20&``$"0/@))`<`J([B`!P`````
+MA$4`!*^P`!`"("`E)`8``0)`^`DD!P"ICN(`'`````"$10`&K[``$`(@("4D
+M!@`!`D#X"20'`*J.X@`<`````(1%``BOL``0`B`@)20&``$"0/@))`<`KH[B
+M`!P`````A$4`"J^P`!`"("`E)`8``0)`^`DD!P"OCN(`'`````"$10`,K[``
+M$`(@("4D!@`!`D#X"20'`+"7P@`"`````#!"`(`00``1)G$`#*^@`!`\$```
+M)A````(@("6/I0`D)`8``P(`^`DD!P$?KZ``$`(@("6/I0`H)`8``P(`^`DD
+M!P$B$```#P````"OH``0/!```"80```"("`ECZ4`'"0&``,"`/@))`<!%Z^@
+M`!`"("`ECZ4`("0&``,"`/@))`<!&H^C`%@`````E&(!U``````P0@#P)$+_
+MT"Q"`$`00``L`````)1D`=0`````.(,`-2QC``$X@@!%+$(``0!B&"448``&
+M)G(`#"0"`$80@@`#)`(`-A2"`!P`````)!$``J^Q`!`\$```)A````)`("4D
+M!0`")`8``@(`^`DD!P!:K[$`$`)`("4D!0`")`8``@(`^`DD!P!<K[$`$`)`
+M("4D!0`")`8``@(`^`DD!P!>K[$`$`)`("4D!0`")`8``0(`^`DD!P#^CZ,`
+M6`````"48@'2`````"Q"`$(40``E```@)29R``PD`@`!KZ(`$#P0```F$```
+M`D`@)20%``$D!@`!`@#X"20'`1DD$0`#K[$`$`)`("4D!0`!)`8``@(`^`DD
+M!P`!K[$`$`)`("4D!0`!)`8``@(`^`DD!P`#K[$`$`)`("4D!0`!)`8``0(`
+M^`DD!P"+K[$`$`)`("4D!0`!)`8``0(`^`DD!P",```@)29E``0\`@``)$9S
+M@``$&(``91@A``000`!$$"$``A!``%80(0`"$(``1A`AC$(```````"L8@"H
+M)(0``2R"``T40/_R`````)?"``(`````,$(`0!!```HF9`"LCN(`'`````"$
+M10``KZ``$#P"```D0@``)`8``@!`^`DD!P`EKZ``$#P"```D0@``)F0`K(^E
+M`!@D!@`&`$#X"20'``Z/P@```````#!"P``00``7``"`)9?"``(`````,$)`
+M`!1```(D$@`()!(`#R9Q`*ROH``0/!```"80```"("`E)`4`#R0&``0"`/@)
+M)`<`.J^@`!`"("`E`D`H)20&``0"`/@))`<`1@``@"4\`@``)%9OB#P"```D
+M4@``/`(``"11````$!C``'88(0`0$(`"8A`ACZ0`6(QE``",1@```D#X"2:U
+M``$RH@`_%$```P`````"(/@))`0``280``$2`/_P/`(`````@"4D5V^0)G$`
+M!#P"```D5@``/`(``"12````$!!``%`0(0`"$,``5Q`A`!`8@`(C&"&/I`!8
+MC$4``(QF```"P/@))K4``3*B`#\40``#``````)`^`DD!``!)A```1(`_^X\
+M`@````"`)216;Z@\`@``)%(``#P"```D40```!`00`!0$"$``A#``%80(0`0
+M&(``<Q@ACZ0`6(Q%``",9@`(`D#X"2:U``$RH@`_%$```P`````"(/@))`0`
+M`280``$2`/_N/`(`````@"4D5V_`)G$`!#P"```D5@``/`(``"12````$!!`
+M`%`0(0`"$,``5Q`A`!`8@`!Q&"&/I`!8C$4``(QF``@"P/@))K4``3*B`#\4
+M0``#``````)`^`DD!``!)A```2X"`"@40/_N`!`00```@"4\`@``)%9S@"9Q
+M``0\`@``)%,``#P"```D4@```!`00`!0$"$``A#``%80(0`0&(``<1@ACZ0`
+M6(Q%``",9@"H`F#X"2:U``$RH@`_%$```P`````"0/@))`0``280``$N`@`-
+M%$#_[@`0$$"N@"_$)`(``8^_`%2/O@!0C[<`3(^V`$B/M0!$C[0`0(^S`#R/
+ML@`XC[$`-(^P`#`#X``()[T`6">]^]"OOP0LK[X$**^W!"2OM@0@K[4$'*^T
+M!!BOLP04K[($$*^Q!`ROL`0(KZ4$-*^F!#BOIP0\KZ0#Y)2"`=0`````,$(`
+M\"1"_]`L0@!`$$``$B0#``&4A`'4`````#B#`#4L8P`!.((`12Q"``$`8A@E
+M%&``!R0"``(D`@!&$((``R0"`#84@@`$)`,``20"``(0```"KZ(#Z*^C`^@G
+MI``8KZ0#[(^C!#P`````E&(``@`````P0P'P)`(`T!!B`"X`````*&(`T1!`
+M``DD`@%0)`(`H!!B`!X`````)`(`P!!B`"4`````$``!Y@``$"4`````$&(`
+M#``````H8@%1$$``!B0""``D`@%`$&(`!@`````0``';```0)0`````48@`?
+M`````(^D`^0`````)(0?U*^D`_"/HP/D`````)1B$M@`````$```%P````"/
+MI`/D`````"2$'^"OI`/PCZ,#Y`````"48A+:`````!````T`````CZ0#Y```
+M```DA!_LKZ0#\(^C`^0`````E&(2W``````0```#`````!```;@``!`ECZ0#
+M\`````"4@P`&``````!#&"008`&Q```0)8^C!#@`````A&(``````````A1`
+M``(4`Z^B`_B/I`0T`````(2"``````````(40``"%`.OH@/T-`+>K:>B`]"G
+MH@/2``#P)8^B`_``````E$0`!@```````)`E)Z,#T`)$$`<P0@`!&$``!R_"
+M``(00`&3```0)0`>$$``8A`AI%(``"?>``$F4@`!+D(`!!1`__0"1!`'CZ,$
+M/`````"49```CZ(#\`````"41@`$)Z(#W*^B`!`\`@`")$)&U(^C`_``````
+MC&4```!`^`DGIP/@C[0#X(^B`]P``````%00*Q1``(D``/`E)[8!(#P"```D
+M5P``)[4!.">D`U"OI`/\)Z(!4*^B!```%!"``%00(0`"$(``5!`A``(0@(^D
+M`_``````C(,`"```````0Y@AEZ,#TC0"WJT48@`F`L`@)9>R`]```````!*`
+M@`(2@"$`$("``G`0(912``8``````$"`)0`2B$`F!0`(`N#X"0(@,"4"H"`E
+M)@4`$`+@^`D"(#`EAF<``H^B`_P`````KZ(`$`)`("4"P"@E/`,``B1C1Y@`
+M8/@)`J`P)1!``4,`'B'`CZ($````````1"`A)Z4#4`+@^`DD!@"`$```2"?>
+M``&7L@/0```````2@(`"$H`A`!"`@`)P$"&44@`&``````!`@"4`$HA`)@4`
+M"`+@^`D"(#`E`J`@)28%`!`"X/@)`B`P)89G``*/HP/\`````*^C`!`"0"`E
+M`L`H)3P#``(D8T>8`&#X"0*@,"400`$>`!XAP(^B!````````$0@(8^E`_P"
+MX/@))`8`@)>R`](``````!*`@`(2@"$`$("``G`0(912``8``````$"`)0`2
+MB$`"P"`E)@4`"`+@^`D"(#`E`J`@)28%`!`"X/@)`B`P)89G``*/HP/\````
+M`*^C`!`"0"`E`L`H)3P#``(D8T>8`&#X"0*@,"400`#Z`!XAP">B`E``1"`A
+M)Z4#4`+@^`DD!@"`)]X``2:4``&/H@/<``````!4$"L00/^"`!00@(^E`^"/
+MH@/P`````(Q$````!1!``$00(916````````CZ,#W````````Q!``$00(915
+M`````````&7P(Y>C`](T`MZM%&(`.@``D"4GL0%0`!ZA@#P"``(D5T9H)[,`
+M((^C!#P`````E&0````2@$`",!`AA$<```*2$"$``A!``B(0(81"````````
+MKZ(`$`+`*"4"X/@)`J`P)0)P@"&F`@``)E(``2Y"`$`40/_L/`(``B1"20B/
+MHP/D`````(QE1G@`0/@))Z0`(``"'\(`8A@A``,80X^D!#0`````I(,``)>B
+M`)X```````(4```"'`,``A?"`&(8(0`#&$./H@/L`````*1#``"/I`0X````
+M`*2#``"7H@/0CZ,$0`````"D8@``$```F:1B``(GM`%0`![Q@*^^!`0\`@`"
+M)%=&:">^`"`GLP)0CZ($/`````"41````!*(0`*1$"&$1P``CZ,$!```````
+M<H`A`!"`0`*0$"&$0@```````*^B`!`"P"@E`N#X"0*@,"4#T1@AI&(``(^B
+M!#P`````E$0```)Q$"&$1P```G"`(88"````````KZ(`$`+`*"4"X/@)`J`P
+M)0.Q&"&D8@"@)E(``2Y"`$`40/_<)`(``H^C`^@`````%&(`*SP"``(D0DI(
+M)Z0`(">E`*"/HP/D`````(QF1G@`0/@))Z<#V``"'\(`8A@A``,80X^D!#0`
+M````I(,``)>B`]@```````(4```"'`,``A?"`&(8(0`#&$./H@/L`````*1#
+M``"7H@">```````"%````AP#``(7P@!B&"$``QA#CZ0$.`````"D@P``EZ(#
+MT(^C!$``````I&(``)>B`](`````$```/Z1B``*'HP$>CZ0#]```````9!`J
+M%$``&SP"``*/I`/X``````!D$"H40``6/`(``B1"20B/HP/D`````(QE1G@`
+M0/@))Z0`H)>C`]*/I`1``````*2#``"D@P`"``(?P@!B&"$``QA#CZ($-```
+M``"D0P``EZ(!'@`````0```5``(4`"1"20B/HP/D`````(QE1G@`0/@))Z0`
+M()>C`]"/I`1``````*2#``"D@P`"``(?P@!B&"$``QA#CZ($-`````"D0P``
+MEZ(`G@```````A0```(<`P`"%\(`8A@A``,80X^D`^P`````I(,``(^B!#@`
+M````I$,``(^D!#@`````E(,``"0"`#\`0Q`CCZ,#Y`````"D8B_T)`(``8^_
+M!"R/O@0HC[<$)(^V!""/M00<C[0$&(^S!!2/L@00C[$$#(^P!`@#X``()[T$
+M,#"(__\PI?__,,;__P`'/`"'HP`2`````!#%`!(`!R0#`040(P!#`!@``!`2
+M`,@8(P``````9``8```8$@!#$"$`Q1@C`$,`&@``$!(48``"```````'``T`
+M`A0``^``"``"%`,#X``(`(`0)8^I`!`PQO__,(3__P`&$$``HD`AE*(`````
+M````@A`K$$``!`````"M(````^``"*S@``"5`O_^``````""$"L40``.`*`8
+M)23"__^M(@```^``"*SB`````A!#K2(```/@``BLX@````(00ZSB```D0@`!
+M`^``"*TB````:!`K$$``#@````"48@```````!!$__$`91`CE&(``@``````
+M@A`K%$#_\`!E$",D8P`"`&@0*Q1`__0``````^``"``````GO?_`K[\`/*^^
+M`#BOMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"@H"4`P+`EC[4`
+M4#"$__\`!SP```>4`P``F"4D$0`!+(,``A1@`#L``!`E``"`)227__\\`@`"
+M)%Y&:``1$$``5!`AE$(`````````4!`K$$``"0`3($`"-Q`J$$``!P"4$"$F
+M8@`!,%/__R8B``$P4?__`!,@0`"4$"&410```!$80`!T$"&41@```)8@(82'
+M````=A@AA&(```````"OH@`0`\#X"0(`("4`$!A``'48(:1B`````A0```(4
+M`P!2$"H40``.)@(``2X"`$`00``+)@(``0(`$"4F`P`!,'#__P`"$$``51`A
+MI%(``"X"`$`40/_Y`@`0)28"``$P4/__+@(`0!1`_\T`$1!`)`(``8^_`#R/
+MO@`XC[<`-(^V`#"/M0`LC[0`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`0)2&
+M`'Z$@@!^A(,`````````0Q`C*$(`?Q1```0DPO^"``(4`!````,``DP#A(D`
+M``````"$AP!^`````"3B__\`0$`E`$<0*A!```XD!@`_),+__P`"%````C0#
+M``800`!$$"&$0P````````$#&"H`!A`G``(7P@!B&"048/_T``````#`&"4D
+M"``_)&+__P!`,"40```$,$+__P`"'`,D9O__,,+__RQ"`#\00``'``,00`!$
+M$"&$0@````````!'$"H00/_U``84`!1@``\`"!!`!0``&`$@$"4`"!!``$40
+M(91#``(`````I$,``"4"__\``A0```)$`P4!__<!(!`E$```#```````11`A
+MI$,``"3B__X``A0```(\`R4"__\``A0```)$`P4!_]<``````2`0)0/@``@`
+M````E(@`?H2"`'Z$HP````````!#$",H0@!_%$``!20+`$`E`O^"``(4`!``
+M``,``F0#A*P```````"$B0!^`````"4B__\`0%`E`$D0*A!```XD"``_)0+_
+M_P`"%````D0#``@00`!$$"&$0P````````%#&"H`"!`G``(7P@!B&"048/_U
+M)0+__Y2B`'X`````I.(``"0*`#^$X@````````!)$"H00``&,0+__RQ"``$`
+M"Q@K`$,0)!!```<```````!8)0"@("40```#)`@`/P`"%````D0#&0``"3$"
+M__\`"!!``$00(81"`````````$D0*A!`__8E`O__,0+__RQ"``$M8P`!`$,0
+M)!!```\`"A!`!4``&`&`$"4`"A!``$80(91#``(`````I$,``"5"__\``A0`
+M``)4`P5!__<!@!`E$```#```````1A`A`6@8):1#```E(O_^``(4```"3`,E
+M0O__``(4```"5`,%0?_)`8`0)0/@``@`````)[W_Z*^_`!2OL``0`("`)8X$
+M1G@`````$(``!3P"```D0@```$#X"0````"N`$9XC@0O[``````0@``%/`(`
+M`"1"````0/@)`````*X`+^R/OP`4C[``$`/@``@GO0`8A*0`!````````#`E
+M)`<``22H``0`!Q"``$<0(0`"$(`!`A@AE&(`````````1!`J$$``!```````
+MX#`EA&0````````DYP`!*.(`!!1`__(`!Q"```88@`!F&"$``QB`)*(`"`!B
+M("&$B``(``````!#$"&$20```````"0'``$`!A"``$80(0`"&$`DI0`(`&<0
+M(0`",$``Q1`AA$0`"```````B!`J$$``!`"F$"$`@$`EA$D````````DYP`!
+M*.(`!!1`__(`"1!``0(0(P`"%``#X``(``(4`R>]_]"OOP`LK[8`**^U`"2O
+MM``@K[,`'*^R`!BOL0`4K[``$`"`J"4`H*`E`."P):3```"6@@`"`````#!"
+M`4`D`P%`%$,`!P*@*"6.J!_<`````):G']@`````$```'```$"66@@`"````
+M`#!"`-`X0P#`+&,``3A"`-`L0@`!`&(8)1!@``<``!`EC*@?]`````"4IQ_P
+M`````!````P`````EH,``@`````P8P"@)`0`H!1D`*@D`@`!C*@?Z`````"4
+MIQ_D````````$"4`````&.``H`````"6@P``E0(`````````8A`K%$``&@*@
+M("4`!Q"``$<0(0`"$(``1Q`A``(0@`$"$"&40O^L``````!#$"L00``6``!(
+M)0`'*(``IR@A``4H@`"G*"$`!2B``04H(92B_ZX`````I,(``#P"``(D0DPH
+M`J`@)1```'LDI?^LE0(``@````"DP@``/`(``B1"3"@0``!T`0`H)1#@`!<`
+M`"`EEH,``)4"`````````$,0*Q!``!(`!!"``(!()22$``$`AQ`J$$``#0`$
+M$(``1!`A``(0@`!$$"$``A"``$@0(9:#``"40@````````!#$"L40/_Q````
+M```$$(``1!`A``(0@`!$$"$``A"``$@H(92R````"1"``$D0(0`"$(``21`A
+M``(0@`!(F"&69P````````)'D",:0``Z`````(2C``*&9``"``````!D&".6
+M@@````````!'$",`8@`8```8$@```````````)(`&```(!(`9!@A``````!R
+M`!H``!@2%D```@``````!P`-``,>```#'@.DPP``/!$``B8Q3"@"(/@)`J`@
+M)0!`@"4"H"`E`B#X"0)@*"4"`H`C`J`@)0(@^`D"8"@EEH,``)9D````````
+M`&08(P(#`!@``(`2````````````4@`8```0$@("@"$``````A(`&@``@!(6
+M0``"```````'``T`$(8``!"&`Z;0```0```7)`(``0`$$(``1!`A``(0@`!$
+M$"$``A"``$@H(9:#``"4H@```````!1B``L"H"`EE*(``@````"DP@``/`(`
+M`B1"3"@`0/@)`````*;"```0```")`(``0``$"6/OP`LC[8`*(^U`"2/M``@
+MC[,`'(^R`!B/L0`4C[``$`/@``@GO0`P)[W_R*^_`#2OM@`PK[4`+*^T`"BO
+MLP`DK[(`(*^Q`!ROL``8`("P)0"@J"4`P)`E)!,``1)``!@``(@E/`(``B14
+M300`$1#``J*`(0+`("4"`"@E)Z8`$`*`^`DGIP`2$$``"`````"3H@`1````
+M`*("``:3H@`3`````!````*B`@`'``"8)28Q``$",A`K%$#_[0`1$,`"8!`E
+MC[\`-(^V`#"/M0`LC[0`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`.">]_^"O
+MOP`8K[$`%*^P`!``H(@E`("`)3P"```D0@```$#X"20$`.``0!@E$&``"JX#
+M+^PD`@"`K@)&?#P"```D0@```$#X"20$`(``0!@E%&``!*X#1G@D`P`"$```
+M'*XC```D`@!`K@)&?#P"``(D0DO(K@(LJ#P"``(D0BZ0K@(LK#P"``(D0C/T
+MK@(LL#P"``(D0C`XK@(LM#P"``(D0C18K@(LN#P"``(D0CVPK@(LO#P"``(D
+M0E"$K@(LP#P"```D0@``K@(LQ"0"``&/OP`8C[$`%(^P`!`#X``()[T`(```
+M```GO?_(K[\`,*^W`"ROM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("@
+M)0"@L"4`P+@E`."`)0``B"4\`@``)%)TX#P"```D50``/`(``"13````$1!`
+M`%$0(0`"&,``<A@A``(00`!6$"$``A"``%(0(8QE``",1@```J#X"0*`("4F
+M$``!,@(`/Q1```,``````F#X"20$``$F,0`!+B(`$!1`_^P`$1!```"()3P"
+M```D4G9@/`(``"15```\`@``)%,````1$,``4A@A`&`0)8QE``",1@`$`J#X
+M"0*`("4F$``!,@(`/Q1```,``````F#X"20$``$F,0`!+B(`BQ1`__$`$1#`
+M``"()3P"```D4GJX/`(``"15```\`@``)%,````1$$``41`A``(8@`!R&"$`
+M5Q`A``(0@`!2$"&,90``C$8```*@^`D"@"`E)A```3("`#\40``#``````)@
+M^`DD!``!)C$``2XB`$`40/_L`````(^_`#"/MP`LC[8`*(^U`"2/M``@C[,`
+M'(^R`!B/L0`4C[``$`/@``@GO0`X)[W_T*^_`"BOM0`DK[0`(*^S`!ROL@`8
+MK[$`%*^P`!``@*`E`*"8)0``J"6690```````"RB$L`00`!(``"`)22D]W`\
+M!F9F-,9F9P"&`!@``!@0``,80P`$%\,`8A@C``,0@`!#$"$4@@`))*3W4``%
+M$$`D4>[@`B8`&```$!```A"#`!$?PQ```!0`0X@C/`9F9C3&9F<`A@`8```8
+M$``#&$,`!!?#`&(8(P`#$(``0Q`A%((`N```$"4`!1!`)%'NH`(F`!@``!`0
+M``(0@P`1'\,`0X@C)!4``0`1B(`\`@``)$(``#(D`/\`0/@))`4`"`!`B"4\
+M`@``)$(```*`("4`0/@)-`6B!`!`."668P``)`()M!1B``@\`@``)$(```*`
+M("4T!:($`$#X"33F`!`0``"&`!&1`"0&_^\D0@```H`@)30%H@0`0/@)`.8P
+M)!```'X`$9$`EF0``#P"S,PT0LS-`((`&0``$!```A""``(8@`!B&"$`@Q@C
+M,&/__R0"``(48@`;+((5/!!``!D\$```EF,````````D8__^,&/__P`#$(``
+M0Q`A``(00#P#__\T8T2``$,0(3P$4>LTA(4?`$0`&```(!``!"##``(7PP""
+M(",F$```)(0``0(`^`DD!0`(`$"()1```%,``"`E/`/,S#1CS,T`@P`9```8
+M$``#&0(``Q"``$,0(0`"$(``@A`C,$+__Q1``!(L@A0`%$``$"2"[4`\!&9F
+M-(1F9P!$`!@``"`0``0@PP`"%\,`@B`C/!```"80````!""``@#X"20%``@`
+M0(@E$```-B0$``.69```/`/,S#1CS,T`@P`9```8$``#&,(``Q"``$,0(0`"
+M$$``@A`C,$+__Q1``!`D@NU`/`1F9C2$9F<`1``8```@$``$((,``A?#`((@
+M(SP0```F$`````0@0`(`^`DD!0`(`$"()1```!HD!``"/`/,S#1CS,T`@P`9
+M```8$``#&((``Q"``$,0(0""$",P0O__%$``)0``$"4DA.U`/`)F9C1"9F<`
+M@@`8```0$``"$$,`!"?#/!```"80````1"`C`@#X"20%``@`0(@E)`0``0(`
+M^`DD!0`"`$"`)0`1D0``$!"``D*0)0`5$$`"0I`E-E(0`3P0```F$````H`@
+M)30%F)P"`/@),D8`_P`2D@("@"`E-`68V`(`^`DR1@!_KI,2-"0"``&/OP`H
+MC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#`GO?_`K[\`/*^^`#BO
+MMP`TK[8`,*^U`"ROM``HK[,`)*^R`""OL0`<K[``&`"`J"4PU/__`J#P)8_2
+M+^P`````E*(``@`````P0P'P)`(`P!!B`!,``)@E*&(`P1!```8D`@#0)`(`
+MH!!B``<``!`E$```[@`````08@`)```0)1```.H`````E\439`````"7UA-F
+M`````!````8``"`EE\43:`````"7UA-J````````("4\`@``)$9]N``$$(`"
+M0A`A``08P`!F&"&,8P`$)(0``1"`__FL0P`````@)29&``0\`@``)$=]P``$
+M$(``PA`A``080`!D&"$``QA``'08(0`#&(``9Q@AC&,``"2$``$0@/_UK$,`
+M````("4\`@``)$9]V``$$(``4A`A``080`!D&"$``QA``'08(0`#&(``9A@A
+MC&,``"2$``$0@/_UK$,`"```("4F1@`$/`(``"1'??``!!B``&88(0`$$$``
+M1!`A``(00`!4$"$``A"``$<0(8Q"````````K&(`""2$``$L@@`;%$#_\B91
+M``ROH``0/!```"80```"("`E)`8``P(`^`DD!P"HKZ``$`(@("4"P"@E)`8`
+M`P(`^`DD!P"E```@)3P"``$D18!X``08@`!R&"$`!!!``$00(0`"$$``5!`A
+M``(0@`!%$"&,0@```````*QB`'@DA``!+((``Q1`__,`!!B```"`)3P"```D
+M5GVX/`(``"14```\`@``)%$````0&,``=A@A`!`0@`)"$"&,90``C$8```*`
+M^`D"H"`E)G,``3)B`#\40``#``````(@^`DD!``!)A```1(`__`\`@````"`
+M)217?<`F40`$/`(``"16```\`@``)%0````0$$``4!`A``(0P`!7$"$`$!B`
+M`B,8(8Q%``",9@```L#X"0*@("4F<P`!,F(`/Q1```,``````H#X"20$``$F
+M$``!$@#_[CP"`````(`E)%9]V#P"```D5```/`(``"11````$!!``%`0(0`"
+M$,``5A`A`!`8@`!R&"&,10``C&8`"`*`^`D"H"`E)G,``3)B`#\40``#````
+M``(@^`DD!``!)A```1(`_^X\`@````"`)217??`F40`$/`(``"16```\`@``
+M)%0````0$$``4!`A``(0P`!7$"$`$!B``'$8(8Q%``",9@`(`L#X"0*@("4F
+M<P`!,F(`/Q1```,``````H#X"20$``$F$``!+@(`&Q1`_^X`$!!```"`)3P"
+M``$D5H!X/`(``"14```\`@``)%$````0$$``4!`A``(0P`!6$"$`$!B``'(8
+M(8Q%``",9@!X`H#X"0*@("4F<P`!,F(`/Q1```,``````B#X"20$``$F$``!
+M+@(``Q1`_^X`$!!`K\`OQ"0"``&/OP`\C[X`.(^W`#2/M@`PC[4`+(^T`"B/
+MLP`DC[(`((^Q`!R/L``8`^``"">]`$",A"_L`````"2C__\L8@`'$$``$@`#
+M&(`\`@`!)$*`P`!B&"&,8@````````!```@``````^``"`"`$"4#X``()((`
+M!`/@``@D@@`(`^``""2"``P#X``()((`>`/@``@``!`ECZD`$``$)``PQO__
+M``0D`P`&$$``HD`AE*(`````````@A`J$$``!`````"M(````^``"*S@``"5
+M`O_^``````""$"H40``.`*`8)23"__^M(@```^``"*SB`````A!#K2(```/@
+M``BLX@````(00ZSB```D0@`!`^``"*TB````:!`K$$``#@````"48@``````
+M`!!$__$`91`CE&(``@``````@A`J%$#_\`!E$",D8P`"`&@0*Q1`__0`````
+M`^``"``````GO?^XK[\`1*^^`$"OMP`\K[8`.*^U`#2OM``PK[,`+*^R`"BO
+ML0`DK[``(*^D`$@`X)`EC[0`6(^^`&``!2P```4L`P`&-```!C0#E[,`7@``
+M````!11```*$`P``B"4N8P`"%&``70``$"4`Q1`C,$+__P!1$"L40`!8)`(`
+M`3P"``(D5UQ4)G;__P#%$",P5?__)Z(`'*^B`!`"`"`E`D`H)0)@,"4"X/@)
+M)Z<`&(^B`!P`````%$```B0"``&OH@`<CZ(`&``````45@`&``(@0"9B__ZO
+MH@`8CZ(`&````````B!``)(8(8^B`!P```````(00`!2$"&$8P``A$(`````
+M```48@`$`)00(91#```0```A`````(^F`!@```````8P0`#2$"&$1P``````
+M``('*"./HP`<```````#&$``=!`AE$(`````````H@`8```H$@!R&"&$9```
+M``````"0&",`U#`AE,(`````````8@`8```8$@"C*"$`AR`C`*0`&@``*!(4
+M@``"```````'``TPH___CZ0`2```````!!&``%$0(0`"$$``7A`AI$,``"8B
+M``$P4?__)@(``@`"%````H0#`K$0*Q!`_[$GH@`<)`(``8^_`$2/O@!`C[<`
+M/(^V`#B/M0`TC[0`,(^S`"R/L@`HC[$`)(^P`"`#X``()[T`2#"(__\PI?__
+M,,;__P`'/`"'HP`2`````!#%`!(`!R0#`040(P!#`!@``!`2`,@8(P``````
+M9``8```8$@!#$"$`Q1@C`$,`&@``$!(48``"```````'``T``A0``^``"``"
+M%`,#X``(`(`0)2>]_XBOOP!TK[X`<*^W`&ROM@!HK[4`9*^T`&"OLP!<K[(`
+M6*^Q`%2OL`!0`,"X)3"E__^OI0`X,.?__Z^G`#R,E"RD`````*^@`$``!20`
+MEN8`%">B`#"OH@`0/`(``B1"7%0`!"0#`N`H)0!`^`DGIP`T``"8)2>B`""O
+MH@!()OX`#">C`"BOHP!$)`(``P!30",`"!!``$@0(0`".,"/HP`T```````#
+M$$``0Q`A``(9``!#$"$``A!``.(P(23%`!@"Y1`AE%4`"``````2H`#(````
+M`(^M`$````````T@0(^B`)```````((8(0+E$"&40@`&`````*1B``"/HP!(
+M``````!D*"$`WA`AE$0`(`````"DI```CZ,`,````````Q!``$,0(0`"&0``
+M0Q`A``(00`#B$"$`7A`A``0D```$)`.40P`@A$(`(```````1!`J$$```@``
+M``"DHP``CZ0`0```````!"A`CZ<`2```````Y2`AE((``````````A0```(<
+M`P`"%\(`8A@A``,80Z2#``"/K0!$``````&E,"$`""!``(@@(0`$(("/HP`T
+M```````#$$``0Q`A``(9``!#$"$`@A`A`%40(0`"$$``7A`AE$4`'@````"D
+MQ0``CZ,`,````````Q!``$,0(0`"&0``0Q`A`((@(0"5("$`!"!``)X@(0`%
+M+```!2P#E(,`'H2"`!X``````$40*A!```(`````I,,``(^B`$````````*(
+M0(^C`$0``````'&0(99"``````````(4```"-`,``A?"`,(P(0`&,$.F1@``
+MCZ0`2```````D8@AAB4``(^B`#0```````(X0`#B."$`!Q$``.(X(0`'.$``
+M"(!``@B`(0`0@,``\#@A`/<X(23B`"*OH@`0K[4`%*^T`!B/I`!`/`T``B6M
+M71P!H/@)).<`+(8E``"&1@``CZ(`,````````CA``.(X(0`'$0``XC@A``<X
+M0`#P."$`]S@A).(`(J^B`!"OM0`4)H("`*^B`!B/I`!`/`,``B1C71P`8/@)
+M).<`+)9#``"6(@````````!B&",P8___$&``*@``B"6/I`!````````$L8``
+M!!A`)Z(`*`!#J"$GH@`@`$.0(8^B`#0```````(00`+B$"&410``CZ(`,```
+M`````A!``N(0(91&```"T8`A`!"`0`*0$"&$1P```A00(81"`@``````KZ(`
+M$(^D`#@\#0`"):U?*`&@^`D"%(`AI@($`"8Q``&6H@``ED,`````````0Q`C
+M,$+__P(B$"L40/_@`````(^B`$``````)$(``:^B`$`F<P`!+F(`!!1`_R0D
+M`@`#EZ,`((^B`(@`````I$,`````F"6/HP!``````!!@`+(``(@E)ZP`*">K
+M`""/I`!``````"2"__\68@`+`!,80``3$$"/I0",``````!%&"$!@A`AE$(`
+M```````D0@`$$```#J1B``"/IP",``````!G("$!@Q`AA$(```!K&"&$8P`"
+M``````!#$"$``A_"`$,0(0`"$$.D@@``$F``#0``("4`$QA`CZT`C``````!
+MHQ`AE$3__@%C&"&$8@````````""("./H@`\``````""(",`$QG``'00(0!`
+M&"640@0"E&,$````````0Q`C,$;__Q3```(`P!`E)`(``02!`!<`0#`E`!,1
+MP"1"!``"@B@A`(8`&```$!*4HP````````!B&"$``QP```,<`P`1$$"/IP"4
+M``````!'$"$$8``#)C$``1````*D0P``I$```"2$``$$@/_O`(8`&``3&$`!
+M@Q`AA$@```%C$"&$0@````````$"0"./K0",``````!M&"&490``CZ,`/```
+M````HR@A`*(H(P$`2"4`J1`K$$```P`)%```H$@E``D4``!`&"4``A0#`((0
+M*A!``!(`$Q&``!,Y@``#-`,`$1A`CZT`E```````;1@A`.00(0`"$$``5!`A
+ME$($``````"D8@``)(0``0"&$"H40/_S)C$``0`3$8``2!`A``(80`!T&"$`
+M8!`EE&,#_I1"`_P``````&(8(S!F__\4P``"`,`0)20"``$`0#`E`240*Q!`
+M`"(`!10```(4`P""$"H00``>`!,1@`!($"$``A!`)$(#_@*"0"$D"@!_``44
+M```"/`,`B1@C`&8`&```&!*5`@````````!#$"$``A0```(<`P`1$$"/K0"4
+M``````!-*"$H8@"`$$```R8Q``$0```"I*,``*2J```DA``!`(<0*A1`_^P`
+MB1@C)G,``8^C`$```````F,0*Q1`_U(`````+F(`!!!```TN(@"``!,00(^D
+M`(P``````$00(91#__X`````I$,``"9S``$N8@`$%$#_]P`3$$`N(@"`$$``
+M"P`1$$"/I0"4``````!%$"&40__^`````*1#```F,0`!+B(`@!1`__<`$1!`
+MC[\`=(^^`'"/MP!LC[8`:(^U`&2/M`!@C[,`7(^R`%B/L0!4C[``4`/@``@G
+MO0!X)[W_L*^_`$ROM@!(K[4`1*^T`$"OLP`\K[(`.*^Q`#2OL``P`("0)0#@
+MF"4"0*`ECE5&>`````"68@`"`````#!"`-`X0P#`+&,``3A"`-`L0@`!`&(8
+M)11@``@F42?\EF,``@`````P8P"@)`0`H":1(^@49`!E```0)3P0```F$```
+M`D`@)0(`^`DT!:)L,%8`#Y9E```GH@`HKZ(`$">B`""OH@`4CZ(`8`````"O
+MH@`8K[4`'#P"``(D0E^4`D`@)0(@,"4`0/@)`L`X)0)`("4"`/@)-`6B6#P#
+M__\T8S__`$,0))8F`!P`````),;__P`&,X`PQL``/`,``"1C```"0"`E-`6B
+M6`!@^`D`1C`EEZ,`*(>B`"@`````$$```P`#$",0```"IH(O]*:`+_0T$:*`
+M``"`)3P"```D4P```!`8P`!U&"&09P`!D&(``P```````A(``.(X)9!B``4`
+M``````(4``#B."609@`'```````&-@`"0"`E`B`H)0)@^`D`YC`E)A```2X"
+M`"`40/_K)C$`!)>F`"````````8Q`##&`_`"QC`EEZ(`(@```````A*`,$+\
+M``#","67H@`D```````"%``\`P`_`$,0)`#","67HP`F```````#'8`\`@_`
+M`&(8)#P"```D0@```D`@)30%HFP`0/@)`,,P)20"``&/OP!,C[8`2(^U`$2/
+MM`!`C[,`/(^R`#B/L0`TC[``,`/@``@GO0!0)[W_Z*^_`!2OL``0`("`)8X$
+M1G@`````$(``!3P"```D0@```$#X"0````"N`$9XC@0O[``````0@``%/`(`
+M`"1"````0/@)`````*X`+^R.!"RD`````!"```4\`@``)$(```!`^`D`````
+MK@`LI(^_`!2/L``0`^``"">]`!@``"`E)`<``R2F``@DI0`,`.08(P`#$$``
+M0Q`A``(8P`##$"&40@```````!!```8DA``!`&40(81"``@``````^``""2$
+M__\L@@`$%$#_\0#D&",``!`E``(4``/@``@``A0#```P)22G``@DI0`,``80
+M0`!&("$`!!#``.(0(91#````````$&``"23&``$`!!"``$,0(0`"$$``11`A
+MA$(`!@`````#X``(),;__RS"``040/_N```0)0`"%``#X``(``(4`R>]_\BO
+MOP`TK[X`,*^W`"ROM@`HK[4`)*^T`""OLP`<K[(`&*^Q`!2OL``0`("H)0"@
+ML"4`P+@E`.#P)0*@,"6FX```EL(``@`````P0@#0.$,`P"QC``$X0@#0+$(`
+M`0!B&"448``()J4G_);#``(`````,&,`H"0$`*`DQ2/H%&0`L@``$"64I@`4
+M`````"2Q`!@0P`"M```0)9;$``"6(@````````""$"L40``4/`(``@`&$$``
+M1A`A``(9``!#$"$``A!``B(0(91"_YH``````$00*Q!``!,``"@E``:`0`(&
+M@"$`8!`E`@*`(0`0@$`",(`A$```A"80_YHD0FHT`J`@)0!`^`D"("@EIN(`
+M`#P"``(D0FG0`J`@)1```(0"("@E$,``%P``("66PP``EB(`````````0Q`K
+M$$``$@`$$$``@"@E)(0``0"&$"H00``-``000`!$$"$``AD``$,0(0`"$$``
+M41`AEL,``)1"`````````$,0*Q1`__$```````000`!$$"$``AD``$,0(0`"
+M$$``4:`AEI(````%$$``11`A``(9``!#$"$``A!``%&8(99B`````````D*0
+M(QI``$4`````/!$``B8Q:C0"H"`E`B#X"0*`*"4`0(`E`J`@)0(@^`D"8"@E
+M`@*`(P*@("4"(/@)`F`H)9;#``"69`````````!D&","`P`8``"`$@``````
+M`````%(`&```$!("`H`A``````(2`!H``(`2%D```@``````!P`-`!"&```0
+MA@.F\```/!$``B8Q:=`"H"`E`B#X"0*`*"4`0(`E`J`@)0(@^`D"8"@E`@*`
+M(P*@("4"(/@)`F`H)9;#``"69`````````!D&","`P`8``"`$@``````````
+M`%(`&```$!("`H`A``````(2`!H``(`2%D```@``````!P`-`!"&```0A@.G
+MT```$```'"0"``$`!!!``$00(0`"&0``0Q`A``(00`!1@"&6PP``E@(`````
+M```48@`0`````#P"``(D0FHT`J`@)0!`^`D"`"@EIN(``#P"``(D0FG0`J`@
+M)0(`*"4`0/@)`````*?"```0```")`(``0``$"6/OP`TC[X`,(^W`"R/M@`H
+MC[4`)(^T`""/LP`<C[(`&(^Q`!2/L``0`^``"">]`#@GO?_(K[\`-*^V`#"O
+MM0`LK[0`**^S`"2OL@`@K[$`'*^P`!@`@+`E`*"H)0#`D"4D$P`!$D``&```
+MB"4\`@`")%1JF``1$,`"HH`A`L`@)0(`*"4GI@`0`H#X"2>G`!(00``(````
+M`).B`!$`````H@(`!I.B`!,`````$````J("``<``)@E)C$``0(R$"L40/_M
+M`!$0P`)@$"6/OP`TC[8`,(^U`"R/M``HC[,`)(^R`""/L0`<C[``&`/@``@G
+MO0`X)[W_X*^_`!BOL0`4K[``$`"@B"4`@(`E/`(``"1"````0/@))`0`A`!`
+M&"408``1K@,O["0"`0"N`D9\/`(``"1"````0/@))`0!``!`&"408``(K@-&
+M>#P"```D0@```$#X"20$!@``0!@E%&``!*X#+*0D`P`"$```&JXC```\`@`"
+M)$)I4*X"+*@\`@`")$)2,*X"+*P\`@`")$);\*X"++`\`@`")$)3V*X"++0\
+M`@`")$)7E*X"++@\`@`")$)G'*X"++P\`@`")$)N%*X"+,`\`@``)$(``*X"
+M+,0D`@`!C[\`&(^Q`!2/L``0`^``"">]`"`GO?_(K[\`,*^W`"ROM@`HK[4`
+M)*^T`""OLP`<K[(`&*^Q`!2OL``0`("@)0"@L"4`P+@E`."`)0``B"4\`@`!
+M)%*`X#P"```D50``/`(``"13````$1!``%$0(0`"&,``<A@A``(00`!6$"$`
+M`A"``%(0(8QE``",1@```J#X"0*`("4F$``!,@(`/Q1```,``````F#X"20$
+M``$F,0`!+B(`'A1`_^P`$1!```"()3P"``$D4H.P/`(``"15```\`@``)%,`
+M```1$,``4A@A`&`0)8QE``",1@`$`J#X"0*`("4F$``!,@(`/Q1```,`````
+M`F#X"20$``$F,0`!+B(`@!1`__$`$1#```"()3P"``$D4H>P/`(``"15```\
+M`@``)%,````1$$``41`A``(8@`!R&"$`5Q`A``(0@`!2$"&,90``C$8```*@
+M^`D"@"`E)A```3("`#\40``#``````)@^`DD!``!)C$``2XB`$`40/_L````
+M`(^_`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@``@GO0`X
+M)[W_T*^_`"BOM0`DK[0`(*^S`!ROL@`8K[$`%*^P`!``@*`E`*"8)0``J"66
+M90```````"RB$L`00`!(``"`)22D]W`\!F9F-,9F9P"&`!@``!@0``,80P`$
+M%\,`8A@C``,0@`!#$"$4@@`))*3W4``%$$`D4>[@`B8`&```$!```A"#`!$?
+MPQ```!0`0X@C/`9F9C3&9F<`A@`8```8$``#&$,`!!?#`&(8(P`#$(``0Q`A
+M%((`L```$"4`!1!`)%'NH`(F`!@``!`0``(0@P`1'\,`0X@C)!4``0`1B(`\
+M`@``)$(``#(D`/\`0/@))`4`"`!`B"4\`@``)$(```*`("4`0/@)-`6B!`!`
+M."668P``)`()M!1B``@\`@``)$(```*`("4T!:($`$#X"33F`!`0``!^`!&1
+M`"0&_^\D0@```H`@)30%H@0`0/@)`.8P)!```'8`$9$`EF0``#P"S,PT0LS-
+M`((`&0``$!```A""``(8@`!B&"$`@Q@C,&/__R0"``(48@`;+((5/!!``!D\
+M$```EF,````````D8__^,&/__P`#$(``0Q`A``(00#P#__\T8T2``$,0(3P$
+M4>LTA(4?`$0`&```(!``!"##``(7PP""(",F$```)(0``0(`^`DD!0`(`$"(
+M)1```$L``"`E/`/,S#1CS,T`@P`9```8$``#&0(``Q"``$,0(0`"$(``@A`C
+M,$+__Q1```XL@A0`%$``#"2"[4`\!&9F-(1F9P!$`!@``"`0``0@PP`"%\,`
+M@B`C/!```"80```0```N``0@@)9D```\`\S,-&/,S0"#`!D``!@0``,8P@`#
+M$(``0Q`A``(00`""$",P0O__%$``#"2"[4`\!&9F-(1F9P!$`!@``"`0``0@
+M@P`"%\,`@B`C/!```"80```0```6``0@0#P#S,PT8\S-`(,`&0``&!```QB"
+M``,0@`!#$"$`@A`C,$+__Q1``"4``!`E)(3M0#P"9F8T0F9G`((`&```$!``
+M`A!#``0GPSP0```F$````$0@(P(`^`DD!0`(`$"()20$``$"`/@))`4``@!`
+M@"4`$9$``!`0@`)"D"4`%1!``D*0)392$`$\$```)A````*`("4T!9B<`@#X
+M"3)&`/\`$I("`H`@)30%F-@"`/@),D8`?ZZ3$C0D`@`!C[\`*(^U`"2/M``@
+MC[,`'(^R`!B/L0`4C[``$`/@``@GO0`P)[W_P*^_`#ROO@`XK[<`-*^V`#"O
+MM0`LK[0`**^S`"2OL@`@K[$`'*^P`!@`@+@E,-7__P+@H"4``$`E``"P)0``
+M2"4``/`ECI(O[`````"4H@`"`````#!#`?`D`@#0$&(`1```F"4H8@#1$$``
+M""0"`4`D`@"@$&(`."0"`,`08@`\```0)1```54`````$&(``R0"`5`48@%1
+M```0)92B````````)$+P7RQ"!.L00``'```@)9:($U0`````EI835@`````0
+M```R/`(``92B````````)$+K="Q"`/`00``'/`(``9:($U@`````EI836@``
+M```0```F`````)2B````````)$+JA"Q"`.$00``'```@)9:($UP`````EI83
+M7@`````0```:/`(``92B````````+$(6711``!,\`@`!EH@38`````"6EA-B
+M`````!````\`````EHD39`````"6GA-F`````!````@``"`EEHD3:`````"6
+MGA-J`````!````(``"`E```@)3P"``$D1HJP``00@`)"$"$`!!C``&88(8QC
+M``0DA``!$(#_^:Q#`````"`E)D8`!#P"``$D1XJX``00@`#"$"$`!!A``&08
+M(0`#&$``=1@A``,8@`!G&"&,8P``)(0``1"`__6L0P`````@)3P"``$D1HK0
+M``00@`!2$"$`!!A``&08(0`#&$``=1@A``,8@`!F&"&,8P``)(0``1"`__6L
+M0P`(```@)29&``0\`@`!)$>*Z``$&(``9A@A``000`!$$"$``A!``%40(0`"
+M$(``1Q`AC$(```````"L8@`()(0``2R"`"440/_R`````)2B``(`````,$(`
+M@!!``#$F40`,KZ``$#P0```F$````B`@)0$@*"4D!@`#`@#X"20'`/&OH``0
+M`B`@)0/`*"4D!@`#`@#X"20'`.XD`@`"KZ(`$`(@("4D!0`!)`8``0(`^`DD
+M!P$CCN,!S"0"``D08@`()`(`"A1B`"4``"`EEN(!T``````L0@`$$$``(3P"
+M``$\`@``)$(``"0$``8`0/@))`4``R0#``.OHP`0/`,``"1C```F1``,`$`H
+M)20&``,`8/@))`<`@Q```!```"`EKZ``$#P0```F$````B`@)0$`*"4D!@`#
+M`@#X"20'`/>OH``0`B`@)0+`*"4D!@`#`@#X"20'`/0``"`E/`(``21%CF``
+M!!B``'(8(0`$$$``1!`A``(00`!5$"$``A"``$40(8Q"````````K&(`H"2$
+M``$L@@`#%$#_\P`$&(```(`E/`(``216BK`\`@``)%4``#P"```D40```!`8
+MP`!V&"$`$!"``D(0(8QE``",1@```J#X"0+@("4F<P`!,F(`/Q1```,`````
+M`B#X"20$``$F$``!$@#_\#P"``$``(`E)%Z*N"91``0\`@``)%8``#P"```D
+M50```!`00`!0$"$``A#``%X0(0`0&(`"(Q@AC$4``(QF```"P/@)`N`@)29S
+M``$R8@`_%$```P`````"H/@))`0``280``$2`/_N/`(``0``@"4D5HK0/`(`
+M`"15```\`@``)%$````0$$``4!`A``(0P`!6$"$`$!B``'(8(8Q%``",9@`(
+M`J#X"0+@("4F<P`!,F(`/Q1```,``````B#X"20$``$F$``!$@#_[CP"``$`
+M`(`E)%Z*Z"91``0\`@``)%8``#P"```D50```!`00`!0$"$``A#``%X0(0`0
+M&(``<1@AC$4``(QF``@"P/@)`N`@)29S``$R8@`_%$```P`````"H/@))`0`
+M`280``$N`@`E%$#_[@`0$$```(`E/`(``216CF`\`@``)%4``#P"```D40``
+M`!`00`!0$"$``A#``%80(0`0&(``<A@AC$4``(QF`*`"H/@)`N`@)29S``$R
+M8@`_%$```P`````"(/@))`0``280``$N`@`#%$#_[@`0$$"N@"_$)`(``8^_
+M`#R/O@`XC[<`-(^V`#"/M0`LC[0`*(^S`"2/L@`@C[$`'(^P`!@#X``()[T`
+M0(R$+^P`````)*/__RQB``<00``2``,8@#P"``$D0HZH`&(8(8QB````````
+M`$``"``````#X``(`(`0)0/@``@D@@`$`^``""2"``@#X``()((`#`/@``@D
+M@@"@`^``"```$"6/J0`0``0D`##&__\`!"0#``800`"B0"&4H@````````""
+M$"H00``$`````*T@```#X``(K.```)4"__X``````((0*A1```X`H!@E),+_
+M_ZTB```#X``(K.(````"$$.M(@```^``"*SB`````A!#K.(``"1"``$#X``(
+MK2(```!H$"L00``.`````)1B````````$$3_\0!E$".48@`"``````""$"H4
+M0/_P`&40(R1C``(`:!`K%$#_]``````#X``(`````">]_[BOOP!$K[X`0*^W
+M`#ROM@`XK[4`-*^T`#"OLP`LK[(`**^Q`"2OL``@KZ0`2`#@D"6/M`!8C[X`
+M8``%+```!2P#``8T```&-`.7LP!>```````%%$```H0#``"()2YC``(48`!=
+M```0)0#%$",P0O__`%$0*Q1``%@D`@`!/`(``B17>X@F=O__`,40(S!5__\G
+MH@`<KZ(`$`(`("4"0"@E`F`P)0+@^`DGIP`8CZ(`'``````40``")`(``:^B
+M`!R/H@`8`````!16``8``B!`)F+__J^B`!B/H@`8```````"($``DA@ACZ(`
+M'````````A!``%(0(81C``"$0@```````!1B``0`E!`AE$,``!```"$`````
+MCZ8`&```````!C!``-(0(81'`````````@<H(X^C`!P```````,80`!T$"&4
+M0@````````"B`!@``"@2`'(8(81D`````````)`8(P#4,"&4P@````````!B
+M`!@``!@2`*,H(0"'(",`I``:```H$A2```(```````<`#3"C__^/I`!(````
+M```$$8``41`A``(00`!>$"&D0P``)B(``3!1__\F`@`"``(4```"A`,"L1`K
+M$$#_L2>B`!PD`@`!C[\`1(^^`$"/MP`\C[8`.(^U`#2/M``PC[,`+(^R`"B/
+ML0`DC[``(`/@``@GO0!(,(C__S"E__\PQO__``<\`(>C`!(`````$,4`$@`'
+M)`,!!1`C`$,`&```$!(`R!@C``````!D`!@``!@2`$,0(0#%&",`0P`:```0
+M$A1@``(```````<`#0`"%``#X``(``(4`P/@``@`@!`E)[W_B*^_`'2OO@!P
+MK[<`;*^V`&BOM0!DK[0`8*^S`%ROL@!8K[$`5*^P`%``P+@E,*7__Z^E`#@P
+MY___KZ<`/(R4+*0`````KZ``0``%)`"6Y@`4)Z(`,*^B`!`\`@`")$)[B``$
+M)`,"X"@E`$#X"2>G`#0``)@E)Z(`(*^B`$@F_@`,)Z,`**^C`$0D`@`#`%-`
+M(P`($$``2!`A``(XP(^C`#0```````,00`!#$"$``AD``$,0(0`"$$``XC`A
+M),4`&`+E$"&450`(`````!*@`,@`````CZT`0```````#2!`CZ(`D```````
+M@A@A`N40(91"``8`````I&(``(^C`$@``````&0H(0#>$"&41``@`````*2D
+M``"/HP`P```````#$$``0Q`A``(9``!#$"$``A!``.(0(0!>$"$`!"0```0D
+M`Y1#`""$0@`@``````!$$"H00``"`````*2C``"/I`!````````$*$"/IP!(
+M``````#E("&4@@`````````"%````AP#``(7P@!B&"$``QA#I(,``(^M`$0`
+M`````:4P(0`(($``B"`A``0@@(^C`#0```````,00`!#$"$``AD``$,0(0""
+M$"$`51`A``(00`!>$"&410`>`````*3%``"/HP`P```````#$$``0Q`A``(9
+M``!#$"$`@B`A`)4@(0`$($``GB`A``4L```%+`.4@P`>A((`'@``````11`J
+M$$```@````"DPP``CZ(`0````````HA`CZ,`1```````<9`AED(`````````
+M`A0```(T`P`"%\(`PC`A``8P0Z9&``"/I`!(``````"1B"&&)0``CZ(`-```
+M`````CA``.(X(0`'$0``XC@A``<X0``(@$`""(`A`!"`P`#P."$`]S@A).(`
+M(J^B`!"OM0`4K[0`&(^D`$`\#0`"):U\4`&@^`DDYP`LAB4``(9&``"/H@`P
+M```````".$``XC@A``<1``#B."$`!SA``/`X(0#W."$DX@`BKZ(`$*^U`!0F
+M@@(`KZ(`&(^D`$`\`P`")&-\4`!@^`DDYP`LED,``)8B`````````&(8(S!C
+M__\08``J``"()8^D`$````````2Q@``$&$`GH@`H`$.H(2>B`"``0Y`ACZ(`
+M-````````A!``N(0(91%``"/H@`P```````"$$`"XA`AE$8```+1@"$`$(!`
+M`I`0(81'```"%!`AA$("``````"OH@`0CZ0`.#P-``(EK7Y<`:#X"0(4@"&F
+M`@0`)C$``9:B``"60P````````!#$",P0O__`B(0*Q1`_^``````CZ(`0```
+M```D0@`!KZ(`0"9S``$N8@`$%$#_)"0"``.7HP`@CZ(`B`````"D0P````"8
+M)8^C`$``````$&``L@``B"4GK``H)ZL`((^D`$``````)(+__Q9B``L`$QA`
+M`!,00(^E`(P``````$48(0&"$"&40@```````"1"``00```.I&(``(^G`(P`
+M`````&<@(0&#$"&$0@```&L8(81C``(``````$,0(0`"'\(`0Q`A``(00Z2"
+M```28``-```@)0`3&$"/K0",``````&C$"&41/_^`6,8(81B`````````((@
+M(X^B`#P``````((@(P`3&<``=!`A`$`8)91"!`*48P0```````!#$",P1O__
+M%,```@#`$"4D`@`!!($`%P!`,"4`$Q'`)$($``*"*"$`A@`8```0$I2C````
+M`````&(8(0`#'````QP#`!$00(^G`)0``````$<0(01@``,F,0`!$````J1#
+M``"D0```)(0``02`_^\`A@`8`!,80`&#$"&$2````6,0(81"`````````0)`
+M(X^M`(P``````&T8(91E``"/HP`\``````"C*"$`HB@C`0!()0"I$"L00``#
+M``D4``"@2"4`"10``$`8)0`"%`,`@A`J$$``$@`3$8``$SF```,T`P`1&$"/
+MK0"4``````!M&"$`Y!`A``(00`!4$"&40@0``````*1B```DA``!`(80*A1`
+M__,F,0`!`!,1@`!($"$``AA``'08(0!@$"648P/^E$(#_```````8A@C,&;_
+M_Q3```(`P!`E)`(``0!`,"4!)1`K$$``(@`%%````A0#`((0*A!``!X`$Q&`
+M`$@0(0`"$$`D0@/^`H)`(20*`'\`!10```(\`P")&",`9@`8```8$I4"````
+M`````$,0(0`"%````AP#`!$00(^M`)0``````$TH(2AB`(`00``#)C$``1``
+M``*DHP``I*H``"2$``$`AQ`J%$#_[`")&",F<P`!CZ,`0``````"8Q`K%$#_
+M4@`````N8@`$$$``#2XB`(``$Q!`CZ0`C```````1!`AE$/__@````"D0P``
+M)G,``2YB``040/_W`!,00"XB`(`00``+`!$00(^E`)0``````$40(91#__X`
+M````I$,``"8Q``$N(@"`%$#_]P`1$$"/OP!TC[X`<(^W`&R/M@!HC[4`9(^T
+M`&"/LP!<C[(`6(^Q`%2/L`!0`^``"">]`'@GO?^PK[\`3*^V`$BOM0!$K[0`
+M0*^S`#ROL@`XK[$`-*^P`#``@)@E`."@)0)@D"6.=49X`````):"``(`````
+M,$(`T#A#`,`L8P`!.$(`T"Q"``$`8A@E%&``""9Q)_R6@@`"`````#!"`*`D
+M`P"@$$,``B91(^@F41_4/!```"80```"8"`E`@#X"30%HFPP5@`/EH4``">B
+M`"BOH@`0)Z(`(*^B`!2/H@!@`````*^B`!BOM0`</`(``B1"?L@"8"`E`B`P
+M)0!`^`D"P#@E`F`@)0(`^`DT!:)8/`/__S1C/_\`0Q`DEB8`'``````DQO__
+M``8S@##&P``\`P``)&,```)@("4T!:)8`&#X"0!&,"67HP`HAZ(`*``````0
+M0``#``,0(Q````*F0B_TID`O]#01HH```(`E/`(``"12````$!C``'48(9!G
+M``&08@`#```````"$@``XC@ED&(`!0```````A0``.(X)9!F``<```````8V
+M``)@("4"("@E`D#X"0#F,"4F$``!+@(`(!1`_^LF,0`$EZ8`(```````!C$`
+M,,8#\`+&,"67H@`B```````"$H`P0OP``,(P)9>B`"0```````(4`#P#`#\`
+M0Q`D`,(P)9>C`"8```````,=@#P"#\``8A@D/`(``"1"```"8"`E-`6B;`!`
+M^`D`PS`E)`(``8^_`$R/M@!(C[4`1(^T`$"/LP`\C[(`.(^Q`#2/L``P`^``
+M"">]`%`GO?_HK[\`%*^P`!``@(`EC@1&>``````0@``%/`(``"1"````0/@)
+M`````*X`1GB.!"_L`````!"```4\`@``)$(```!`^`D`````K@`O[(X$+*0`
+M````$(``!3P"```D0@```$#X"0````"N`"RDC[\`%(^P`!`#X``()[T`&```
+M("4D!P`#)*8`""2E``P`Y!@C``,00`!#$"$``AC``,,0(91"````````$$``
+M!B2$``$`91`AA$(`"``````#X``()(3__RR"``040/_Q`.08(P``$"4``A0`
+M`^``"``"%`,``#`E)*<`""2E``P`!A!``$8@(0`$$,``XA`AE$,````````0
+M8``)),8``0`$$(``0Q`A``(00`!%$"&$0@`&``````/@``@DQO__+,(`!!1`
+M_^X``!`E``(4``/@``@``A0#)[W_R*^_`#2OO@`PK[<`+*^V`"BOM0`DK[0`
+M(*^S`!ROL@`8K[$`%*^P`!``@*@E`*"P)0#`N"4`X/`EIN```);"``(`````
+M,$(`T#A#`,`L8P`!.$(`T"Q"``$`8A@E%&``"":E)_R6P@`"`````#!"`*`D
+M`P"@$$,``B2%(^@DA1_4E*8`%``````DL0`8$,``K0``$"66Q```EB(`````
+M````@A`K%$``%#P"``,`!A!``$80(0`"&0``0Q`A``(00`(B$"&40O^:````
+M``!$$"L00``3```H)0`&@$`"!H`A`&`0)0("@"$`$(!``C"`(1```(0F$/^:
+M)$*):`*@("4`0/@)`B`H):;B```\`@`#)$*)!`*@("40``"$`B`H)1#``!<`
+M`"`EEL,``)8B`````````$,0*Q!``!(`!!!``(`H)22$``$`AA`J$$``#0`$
+M$$``1!`A``(9``!#$"$``A!``%$0(9;#``"40@````````!#$"L40/_Q````
+M```$$$``1!`A``(9``!#$"$``A!``%&@(9:2````!1!``$40(0`"&0``0Q`A
+M``(00`!1F"&68@````````)"D",:0`!%`````#P1``,F,8EH`J`@)0(@^`D"
+M@"@E`$"`)0*@("4"(/@)`F`H)0("@","H"`E`B#X"0)@*"66PP``EF0`````
+M````9!@C`@,`&```@!(```````````!2`!@``!`2`@*`(0`````"$@`:``"`
+M$A9```(```````<`#0`0A@``$(8#IO```#P1``,F,8D$`J`@)0(@^`D"@"@E
+M`$"`)0*@("4"(/@)`F`H)0("@","H"`E`B#X"0)@*"66PP``EF0`````````
+M9!@C`@,`&```@!(```````````!2`!@``!`2`@*`(0`````"$@`:``"`$A9`
+M``(```````<`#0`0A@``$(8#I]```!```!PD`@`!``000`!$$"$``AD``$,0
+M(0`"$$``48`AEL,``)8"````````%&(`$``````\`@`#)$*):`*@("4`0/@)
+M`@`H):;B```\`@`#)$*)!`*@("4"`"@E`$#X"0````"GP@``$````B0"``$`
+M`!`EC[\`-(^^`#"/MP`LC[8`*(^U`"2/M``@C[,`'(^R`!B/L0`4C[``$`/@
+M``@GO0`X)[W_R*^_`#2OM@`PK[4`+*^T`"BOLP`DK[(`(*^Q`!ROL``8`("P
+M)0"@J"4`P)`E)!,``1)``!@``(@E/`(``R14B<P`$1#``J*`(0+`("4"`"@E
+M)Z8`$`*`^`DGIP`2$$``"`````"3H@`1`````*("``:3H@`3`````!````*B
+M`@`'``"8)28Q``$",A`K%$#_[0`1$,`"8!`EC[\`-(^V`#"/M0`LC[0`*(^S
+M`"2/L@`@C[$`'(^P`!@#X``()[T`.">]_^"OOP`8K[$`%*^P`!``H(@E`("`
+M)3P"```D0@```$#X"20$`*P`0!@E$&``$:X#+^PD`@$`K@)&?#P"```D0@``
+M`$#X"20$`0``0!@E$&``"*X#1G@\`@``)$(```!`^`DD!`8``$`8)11@``2N
+M`RRD)`,``A```!JN(P``/`(``R1"B(2N`BRH/`(``B1";]"N`BRL/`(``B1"
+M>R2N`BRP/`(``B1"<7BN`BRT/`(``B1"=12N`BRX/`(``R1"AE"N`BR\/`(`
+M`R1"C42N`BS`/`(``"1"``"N`BS$)`(``8^_`!B/L0`4C[``$`/@``@GO0`@
+M071H97)O<R`U,C$P`````$%T:&5R;W,@-3(Q,0````!!=&AE<F]S(#4R,3$@
+M*$901T$I`$%T:&5R;W,@-3(Q,B`H1E!'02D`071H97)O<R`U,S$R(%=I4V]#
+M``!!=&AE<F]S(#(S,34@5VE3;T,``$%T:&5R;W,@,C,Q-R!7:5-O0P``071H
+M97)O<R`R,S$S(%=I4V]#``!!=&AE<F]S(#4T,C0O,C0R-````$%T:&5R;W,@
+M-3(Q,@`````H4!8L6"@```````````P0```,)```#"0```PL```,-```#%0`
+M``Q<```,<```#OP```R$```,I```#20```S$```,Y```#00```TX```._```
+M#OP```VH```-R```#>@```WP```,3```#A````XP```.4```#OP```[\```.
+MQ```#OP```[,```._```#OP```[\```.Z/^@_Z/_GO^@_Z/_H$%2-3(Q,```
+M05(U,C$Q``!!4C4R,3(``%)&-3$Q,0``4D8U,3$R``!21C(T,3,``%)&-30Q
+M,P``4D5'3U!37T953D,`````````````````````!0`*`!0`'@`R`$8`50!:
+M`%\`9```````"@`4`!X`*``R`#P`1@!0`%H`9```````P@```,0```#%````
+MT````-H```#D````P@```,,```#4````\@```0T```$H````SP```,H`````
+M```````"(5```0%```0`H``(`,``(`#0`$`!4```````````&9@!)`80)@``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````!T.```
+M``````````````````````````````````````````!T9```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````/_______P``````````
+M`````)@`````1P``F`@```````"8#`F$CJ8``)@0/3+@````F!0```=K``"8
+M'````````)@@`@("````F"0```X.``"8*`H"`@$``)@L``-O_```F#``````
+M``"8-```#@X``)@X````!P``F#P``@$```"80(EC`````)A$$W(6G```F$@`
+M&+8S``"83!*$83P``)A0#>BXX```F%0`!TA9``"86'Z`OKH``)A<,3IF7@``
+MF&```!T(``"89``!S@```)AH0)I!D```F'`````/``"8=````(```)AX````
+M!```F0````````"9!````````)D(````````F0P`@`````"9$`````,``)L`
+M````````FP0````@``";"````!```)L,````,```FQ`````(``";%````"@`
+M`)L8````*```FQP````$``";(````"0``)LD````%```FR@````T``";+```
+M``P``)LP````+```FS0````"``";.````"(``)L\````$@``FT`````R``";
+M1`````H``)M(````*@``FTP````!``";4````"$``)M4````$0``FU@````Q
+M``";7`````D``)M@````*0``FV0````%``";:````"4``)ML````%0``FW``
+M```U``";=`````T``)MX````+0``FWP````#``";@````",``)N$````$P``
+MFX@````S``";C`````L``)N0````*P``FY0````'``";F````"<``)N<````
+M%P``FZ`````W``";I`````\``)NH````+P``FZP````O``";L````"\``)NT
+M````+P``F[@````O``";O````"\``)O`````+P``F\0````O``";R````"\`
+M`)O,````+P``F]`````O``";U````"\``)O8````+P``F]P````O``";X```
+M`"\``)OD````+P``F^@````O``";[````"\``)OP````+P``F_0````O``";
+M^````"\``)O\````+P``F@`````=``":!````%T``)H(````G0``F@P```#=
+M``":$````1T``)H4````(0``FA@```!A``":'````*$``)H@````X0``FB0`
+M```Q``":*````'$``)HL````L0``FC`````<``":-````%P``)HX````*0``
+MFCP```!I``":0````*D``)I$````(```FD@````9``":3````%D``)I0````
+MF0``FE0````P``":6`````4``)I<````)0``FF````!E``":9````*4``)IH
+M````*```FFP```!H``":<````!\``)IT````'@``FG@````8``":?````%@`
+M`)J`````F```FH0````#``":B`````0``)J,````1```FI````"$``":E```
+M`!,``)J8````$@``FIP```!2``":H````)(``)JD````T@``FJ@````K``":
+MK````"H``)JP````:@``FK0```"J``":N````!L``)J\````&@``FL````!:
+M``":Q````)H``)K(````V@``FLP````&``":T`````8``)K4````!@``FM@`
+M```&``":W`````8``)K@````!@``FN0````&``":Z`````8``)KL````!@``
+MFO`````&``":]`````8``)KX````!@``FOP````&``"8U````"```)C,````
+M!```F,@`!@$&``"8G````&T``)C`````````F-`````4"0D```````("!@8&
+M!@8&`@(````````#``8`"0`\`````````````````````````````/````#,
+M````````````````````"@```````.(*```@`0```@$``!A````````$&```
+M```95P0%!A`F````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````,L4`````````````````````````````````````````````,MT
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````"6P)
+MCPFT`````````````/_______P```````````"`````@````0````$``!@``
+M``8````&`````````````````#`````5````%0```!T````5```00``O_`\`
+M+_P/`"_\'P`O_`\``!!$`"_\#P`O_`\`+_P?`"_\#P``$$@`+_P/`"_\#P`O
+M_!\`+_P/```03``O_`\`+_P/`"_\'P`O_`\``!!0`"_\#P`O_`\`+_P?`"_\
+M#P``$%0`+_P/`"_\#P`O_!\`+_P/```06``O_`\`+_P/`"_\'P`O_`\``!!<
+M`"_\#P`O_`\`+_P?`"_\#P``$&``+_P/`"_\#P`O_!\`+_P/```09``O_`\`
+M+_P/`"_\'P`O_`\``!!P```!:````>````&X```!:```$#````(P```!X```
+M`+````(P```0L```#9@``!&````?2```#9@``!#P``"@X``!0&@``%B```"@
+MX```@!0$``0`"``(`"``,``$``0```"`'`Z-CZ<.C8_/`6"/E0Z-CZ<``)@$
+M``````````,`````````````F"`"`@(``@("``(!`@`"`@(```"8)```#@X`
+M``X.```'!P``#@X``)@H"@(``0H"``$%`0``"@(``0``F#0```X.```.#@``
+M#@X```X.``"8.`````<````'````"P````L``)A$$W(6G!-R%J43<A:H$W(6
+MG```F$@`&+IG`!BZ9P`8NFD`&+II``"84`PHM.`,*+3@#"BTX`PHM.```)A8
+M?H`-+GZ`#2Y^P`TN?H`-+@``F%PQ-UU>,3==7C$Z75XQ-UU>``"88```O1``
+M`+T0``"].```O1```)AD``'.```!S@```<X```'.````F10``"<0```G$```
+M%7P``"<0``"9&````9````&0````A````9```)E$;^`0(&_@$"!OX`D@;^`0
+M(```H8`%_Q3_!?\4_P7_%/\%_QG_``"8U````!`````4````$````!`````,
+M`````````"B$A)R<````+'Q\?'P````T````!0```$``````````1`````@`
+M``!(````"````$P````0````4`````````!4````'P``"``````````(!```
+M``````@(````````"`P````````($`````````@4````````"!@````````(
+M'`````````@@````````""0````````2,````````(`$````````@`@`````
+M``"`#````````(`8````````@"0```````"`*````#```(`L``?__P``@#`!
+M____``"`-````#$``(`X````````@#P```````"`0````````(!$`````@``
+M@$@```````"`5````````(!8````````F`@```````"8#"V$D),``)@0?3+@
+M````F!0```]K``"8'````````)@L``)O_@``F#````````"8/``"`0```)A`
+M(&H!>@``F$P2A&$\``"85```"%D``)AH0)I!D```F&P%#+"!``"8<`````\`
+M`)AT````@```F'@````,``"9`````````)D$````````F0@```````"9#`"`
+M`````)D0`````0``F1P```DJ``"9(````````)DD``6*!0``F2@````!``"9
+M+````````)DP````````F30```````"9.````````)D\````/P``F4`````$
+M``"92````````)E,````````F5````````"95%U0\4P``)E8````&```F5P`
+M2VJ.``"AA`;_!?\``*&(!_\'_P``H8P(_PC_``"AD`G_"?\``*&4"O\*_P``
+MH9@+_PO_``"AG`S_#/\``*&@#?\-_P``H:0/_P[_``"AJ!+_$O\``*&L%/\3
+M_P``H;`6_Q7_``"AM!G_%_\``*&X&_\:_P``H;P>_QW_``"AP"/_(/\``*'$
+M)_\E_P``H<@L_RG_``"AS#'_+_\``*'0-_\T_P``H=0Z_SK_``"AV#K_.O\`
+M`*'<.O\Z_P``H>`Z_SK_``"AY#K_.O\``*'H.O\Z_P``H>PZ_SK_``"A\#K_
+M.O\``*'T.O\Z_P``H?@Z_SK_``"A_#K_.O\``)L`````````FP0````@``";
+M"````!```)L,````,```FQ`````(``";%````"@``)L8````!```FQP````D
+M``";(````!0``)LD````-```FR@````,``";+````"P``)LP`````@``FS0`
+M```B``";.````!(``)L\````,@``FT`````*``";1````"H``)M(````!@``
+MFTP````F``";4````!8``)M4````-@``FU@````.``";7````"X``)M@````
+M`0``FV0````A``";:````!$``)ML````,0``FW`````)``";=````"D``)MX
+M````!0``FWP````E``";@````!4``)N$````-0``FX@````-``";C````"T`
+M`)N0`````P``FY0````C``";F````!,``)N<````,P``FZ`````+``";I```
+M`"L``)NH````*P``FZP````K``";L````"L``)NT````*P``F[@````K``";
+MO````"L``)O`````*P``F\0````K``";R````"L``)O,````*P``F]`````K
+M``";U````"L``)O8````*P``F]P````K``";X````"L``)OD````*P``F^@`
+M```K``";[````"L``)OP````*P``F_0````K``";^`````(``)O\````%@``
+MF-0````@``"8V`!@$&@``)H````!J0```````)H$```!Z0```$```)H(````
+M*0```(```)H,````:0```5```)H0```!F0```9```)H4```!V0```=```)H8
+M````&0```!```)H<````60```$0``)H@````F0```(0``)HD```!I0```4@`
+M`)HH```!Y0```8@``)HL````)0```<@``)HP```!R````!0``)HT````"```
+M`$(``)HX````2````((``)H\````B````7@``)I````!F````;@``)I$```!
+MV````?@``)I(````&````!(``)I,````6````%(``)I0````F````)(``)I4
+M```!I````7P``)I8```!Y````;P``)I<````)````?P``)I@````9`````H`
+M`)ID````I````$H``)IH````Y````(H``)IL```!"@```5H``)IP```!2@``
+M`9H``)IT```!B@```=H``)IX```!R@````X``)I\````"@```$X``)J`````
+M2@```(X``)J$````B@```5X``)J(```!N@```9X``)J,```!^@```=X``)J0
+M````.@````D``)J4````>@```$D``)J8```!A@```(D``)J<```!Q@```7D`
+M`)J@````!@```;D``)JD````1@```?D``)JH````A@```#D``)JL````Q@``
+M`'D``)JP````Q@```+D``)JT````Q@```;T``)JX````Q@```?T``)J\````
+MQ@```#T``)K`````Q@```'T``)K$````Q@```+T``)K(````Q@```/T``)K,
+M````Q@```/T``)K0````Q@```/T``)K4````Q@```/T``)K8````Q@```/T`
+M`)K<````Q@```/T``)K@````Q@```/T``)KD````Q@```/T``)KH````Q@``
+M`/T``)KL````Q@```/T``)KP````Q@```/T``)KT````Q@```/T``)KX````
+MQ@```/T``)K\````Q@```/T````!````1@!@```````!````1@!A```````!
+M````1@!B```````!````1@!C```````!````1@!D```````!````1@!E````
+M```!````1@!F```````!````1@!G```````!````1@!H```````!````1@!I
+M```````!````1@!J```````!````1@!K```````!````1@!L```````!````
+M1@!T```````!````1@!T```````!````1@!T```````!````1@!T```````!
+M````1@!T```````!````1@!T```````!````1@!T```````!````1@!T````
+M```!````1@!U```````!````1@!V```````!````1@!W```````!````1@!X
+M```````!````1@!Y```````!````1@!Z```````!````1@![```````!````
+M1@!\```````!````1@!]```````!````1@!^```````!````1@!_```````!
+M````1@"````````!````1`!\```````!````1@"(```````!````1@",````
+M```!````1@"0```````!````1@"4```````!````1@"8```````!````1@"<
+M```````!````1@"@```````!````1@"D```````!````1@"H```````!````
+M1@"L```````!````1@"P```````!````1@"T`````@<`%IX`"Q9B``H6.@`)
+M%AP`"!7J``<5F@`%%4H`!!4#``(460```````0````,`!@`)`#\`````````
+M`1R@``$<H``!'-@``1S8``$=$``!'1```1U(``$=2`````D````$``0``0`!
+M``$````&1D<X```````````````````$`````0`!````!$9'-P``````````
+M`````````P`!``$``0````-&1S8```````````````````0```````$````!
+M1D<U```````````````````$``$``0```````$9'-```````````````````
+M!`````$``/____Y&1S,```````````````````,``0`!``#____]1D<R````
+M```````````````$````````_____$9',0```````````````````@`!``$`
+M`/____I&1S``````````````````````````````````````````````````
+M````````````````&500%`80)@``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````3Z`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````EL"8\)M```"0@);`FT``#_______\```4"#P<"#PH`#PD`#P``
+M```````````````!8H@``6(8``%B)``!8N```6)$``%BU```````````````
+M`````"`````@````0````$``!@````8````&```6G@`+%F(`"A8Z``D6'``(
+M%>H`!Q6:``452@`$%0,``A19```+N``!`````````````7O$``%\+``!?%@`
+M`7\,``%\X``!?PP``7\,``%_#``!?PP``7\,``%]%``!?PP``7\,``%_#``!
+M?PP``7TH``%]2``!?PP``7V8``%]P``!?PP``7R<``%_#``!?PP``7\,``%^
+M$``!?B@``7\,``%^1````````7[(``%^U``!?N```7[L``%^^``````````&
+M`````0````(````#````!`````4``7^```%_N``!@<0``8`8``&!Q``!@<0`
+M`8'$``&!Q``!@<0``8!@``&!Q``!@<0``8'$``&!Q``!@(0``8'$``&!Q``!
+M@)0``8%\``&!Q``!@<0``8'$``&!Q``!@<0``8#,``&`S``!@<0``8%`````
+M`````````!!``"_\#P`O_`\`+_P?`"_\#P`O_`\``!!$`"_\#P`O_`\`+_P?
+M`"_\#P`O_`\``!!(`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!,`"_\#P`O_`\`
+M+_P?`"_\#P`O_`\``!!0`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!4`"_\#P`O
+M_`\`+_P?`"_\#P`O_`\``!!8`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!<`"_\
+M#P`O_`\`+_P?`"_\#P`O_`\``!!@`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!D
+M`"_\#P`O_`\`+_P?`"_\#P`O_`\``!`P```",````>````"P```!8````>``
+M`!!P```!:````>````&X```!C````>```!"P```.8```$8```!\<```^.```
+M$8```!#P``"@X``!0&@``%B```"PX``!0&@``(`4`^@#Z`;@!N`$(`0@"$`(
+M0`;@!N```)@$``````````,```````````````,``)@@`@("``("`@`"`0(`
+M`@("``("`@```)@D```.#@``#@X```<'```.#@``#@X``)A$$W(6'!-R'"43
+M<A<B$W(6HA-R'"4``)A@``"=$```G1```)T8``"=&```G1```)AD``'.```!
+MS@```<X```'.```!S@```)AH0)I!D$":09!`FD&00)I!D$":09```)D8```!
+MN````;@```"$```!"````;@``)DD$`6*!1`%B@40!8H%$`6*!1`%B@4``*(P
+M```````````````````!"``````````,`````````#0````%````0```````
+M``!$````"````$@````(````3````!````!0`````````%0````?```(````
+M``````@$````````"`@````````(#`````````@0````````"!0````````(
+M&`````````@<````````""`````````()````````!)P````````$#@`````
+M```0>````````!"X````````$/@````````1.````````!%X````````$;@`
+M```````1^````````!(X````````$G@````````2N````````!+X````````
+M$S@````````3>````````!.X````````$_@````````4.````````!1X````
+M````%+@````````4^````````!4X````````%7@````````5N````````!7X
+M````````%C@````````6>````````!:X````````%O@````````7.```````
+M`!=X````````%[@````````7^````````!`\````````$'P````````0O```
+M`````!#\````````$3P````````1?````````!&\````````$?P````````2
+M/````````!)\````````$KP````````2_````````!,\````````$WP`````
+M```3O````````!/\````````%#P````````4?````````(`$````````@`@`
+M``````"`#````````(`@````````@"0```````"`*````#```(`L``?__P``
+M@#`!____``"`-````#$``(`X````````@#P```````"`2````````(!4````
+M````@%@```````"`7``/QX\``(#`*H(P&@``@,0%W`'@``"`R!]`)Q```(#,
+M`?0`````@-```!X<``"`U``"JJH``(#8`@!550``@-P```````"`X/____\`
+M`(#D``#__P``@.@```````"`[````````(#P````````@/0```````"`^```
+M`````(#\````B```AP````````"'!````(P``(<(````Y```APP```+5``"'
+M$````````(<4````````AQ@```"@``"''````<D``(<@````+```AR0````L
+M``"'*````#```(<L````/```AS`````L``"'-````"P``(<X````,```ASP`
+M```\``"'0````````(=$````````AT@```````"'3````````(=0````````
+MAU0```````"'6````````(=<````````AV````#5``"'9````-\``(=H```!
+M`@``AVP```$Z``"'<````'4``(=T````?P``AW@```"B``"'?````````($`
+M``$``@``@00````!``"!"````,```($,````````@1````%H``"!%```````
+M`(?``P(!````A\0'!@4$``"'R`L*"0@``(?,#PX-#```A]`3$A$0``"'U!<6
+M%10``(?8&QH9&```A]P?'AT<``"'X`,"`0```(?D!P8%!```A^@+"@D(``"'
+M[`\.#0P``(?P$Q(1$```A_07%A44``"'^!L:&1@``(?\'QX='```F`RMA(X9
+M``"8$'THX````)@4G`J?:P``F!P```````"80"!J`7H``)A4```(60``F0``
+M``````"9!````````)D(````````F0P`@`````"9$`````$``)D<```,@```
+MF2`%$`````"9*`````$``)DL````!```F30>'R`B``"9.`H+#`T``)D\````
+M/P``F4B2@+(2``"95%U0X8@``)E<`$MJC@``F6@```/.``"9<!DOM14``)EX
+M`````0``F7P```````"B$`"`8S,``*(4`!!L$```HA@`G$!@``"B(`&(,,8`
+M`*(D```$````HBP```````"B-"`@("```*(X("`@(```HD`X20H@``"B1```
+M>[8``*)(#_\__```FP````````";*`````P``)LX````$@``FV0````A``";
+MC````"T``)N<````,P````,`!@`)`#\```````,`!@`)`#\```````D````$
+M``0``0`!``$```````````````9&1S@```````````````````0````!``$`
+M``````````````1&1S<```````````````````,``0`!``$`````````````
+M``-&1S8```````````````````0```````$```````````````%&1S4`````
+M``````````````0``0`!``````````````````!&1S0`````````````````
+M``0````!`````````````/____Y&1S,```````````````````,``0`!````
+M`````````/____U&1S(```````````````````0``````````````````/__
+M__Q&1S$```````````````````(``0`!`````````````/____I&1S``````
+M````````````````````````````````````````````````````````````
+M````"`````$``P``````````````````````!D9'-P``````````````````
+M`@```````````````````````$9'-@```````````````````0``````````
+M````````_____49'-0``````````````````````````````````````____
+M^D9'-``````````````````````!``$`````````````____^$9',P``````
+M```````````````!``$````!``$`````____]D9',@``````````````````
+M```!`````0`!``$`````____\T9',0`````````````````````!`````0`!
+M`````0``____\$9',```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````"````!`````8````(````"@````P````.````$``""-P`
+M`@$T``("K``"!4```@7D``(&M``"!\P`````````,```@!4``(`5``"`%0``
+M@!4``(`5``"`'!*-CZ<)B`_/!.`/E1+@#ZL)B`_/``"8*`H"``$*`@`!!0$!
+M``H"``$*`@`!``"8-```#@X```X.```.#@``#@X```X.``"8.`````<````'
+M````"P````L````+``"82``8VEH`&-I:`!C*:0`8RFD`&,II``"84`WHM.`-
+MZ+3@#>BTX`WHM.`-Z+3@``"86'Z`#2Y^@`TN?NA-+G[H32Y^@`TN``"87#$W
+M9EXQ-V9>,3=F7C$W9EXQ-V%>``"8;`4,L($%#+"!!0RP@04,L(`%#+"```"9
+M%```)Q```"<0```5?```*O@``"<0``"91/>X$"#WN!`@][@-(/>X$"#WN!`@
+M``"B#&0L06ID+$%J9$!!:F1`06ID0$%J``"B'!B#@`H8@X`*&'.`"AB#@`H8
+M@X`*```2,````````)@(````````F"P``B_^``"8/``"`0```)A,$H1A/```
+MF3```$B#``"90`````0``)E8````_P``F70```````"9^````!@``*($````
+M````H@C0/F>(``"B*````;4``*(\$\B)KP``FP0````@``";"````!```)L,
+M````,```FQ`````(``";%````"@``)L8````!```FQP````D``";(````!0`
+M`)LD````-```FRP````L``";,`````(``)LT````(@``FSP````R``";0```
+M``H``)M$````*@``FT@````&``";3````"8``)M0````%@``FU0````V``";
+M6`````X``)M<````+@``FV`````!``";:````!$``)ML````,0``FW`````)
+M``";=````"D``)MX````!0``FWP````E``";@````!4``)N$````-0``FX@`
+M```-``";D`````,``)N4````(P``FY@````3``";H`````L``)ND````*P``
+MFZ@````K``";K````"L``)NP````*P``F[0````K``";N````"L``)N\````
+M*P``F\`````K``";Q````"L``)O(````*P``F\P````K``";T````"L``)O4
+M````*P``F]@````K``";W````"L``)O@````*P``F^0````K``";Z````"L`
+M`)OL````*P``F_`````K``";]````"L``)OX`````@``F_P````6``"8G```
+M``````````````````````````"8G`````````````````````````````"8
+MG`````````````````````````````"8G```````````````````````````
+M``"8G`````````````````````````````"8G```````````````````````
+M``````"8G`````````````````````````````"8G```````````````````
+M``````````"8G`````````````````````````````"8G```````````````
+M``````````````"8G`````````````````````````````"8G``X````.```
+M`#@````X````.`````"8G`````````````````````````````"8G```````
+M``````````````````````"8G```````````````P````(````"```"8G``$
+M`/D`!`#Y``0`_P`$`/T`!`#]``"8U```````````````!`````0````$``":
+M`````:D```````":!````>D```!```":"````"D```"```":#````&D```%0
+M``":$````9D```&0``":%````=D```'0``":&````!D````0``":'````%D`
+M``!$``":(````)D```"$``":)````:4```%(``":*````>4```&(``":+```
+M`"4```'(``":,````<@````4``":-`````@```!"``":.````$@```""``":
+M/````(@```%X``":0````9@```&X``":1````=@```'X``":2````!@````2
+M``":3````%@```!2``":4````)@```"2``":5````:0```%\``":6````>0`
+M``&\``":7````"0```'\``":8````&0````*``":9````*0```!*``"::```
+M`.0```"*``":;````0H```%:``":<````4H```&:``":=````8H```':``":
+M>````<H````.``":?`````H```!.``":@````$H```".``":A````(H```%>
+M``":B````;H```&>``":C````?H```'>``":D````#H````)``":E````'H`
+M``!)``":F````88```")``":G````<8```%Y``":H`````8```&Y``":I```
+M`$8```'Y``":J````(8````Y``":K````,8```!Y``":L````,8```"Y``":
+MM````,8```&]``":N````,8```']``":O````,8````]``":P````,8```!]
+M``":Q````,8```"]``":R````,8```#]``":S````,8```#]``":T````,8`
+M``#]``":U````,8```#]``":V````,8```#]``":W````,8```#]``":X```
+M`,8```#]``":Y````,8```#]``":Z````,8```#]``":[````,8```#]``":
+M\````,8```#]``":]````,8```#]``":^````,8```#]``":_````,8```#]
+M``"8U````"```)C4````$````!0````0````$````!0``)C8`&`0:`!@$&@`
+M8!!H`&`0:`!@$&@``)B<`````````````````````````````)B<````````
+M`````````````````````)B<`````````````````````````````)B<````
+M`````````````````````````)B<`````````````````````````````)B<
+M$````!`````0````$````!```````)B<!`````0````$````!`````0`````
+M`)B<`````````````````````````````)B<````````````````````````
+M`````)B<`````````````````````````````)B<```````````*````````
+M`````````)B<`#@`P``X`(`".`#``#@`P``X`,```)B<``(`!@`"``8````&
+M``(`!@`"``8``)B<````B0```(D```")````B0```(D``)B<````H````*``
+M``"@````H````*```)B<``0`!P`$``<`!``'``0`!P`$``<``)C4````&@``
+M`!H````:````&@```!H``)B<````0````$@```!`````0````$```)B<````
+M$````!`````0````$````!```)B<````"`````@````(````"`````@``)B<
+M````3P```$\```!/````3P```$\``)B<````\0```/$```!A````\0```/$`
+M`)B<``"03P``D$\``)!,``"03P``D$\``)B<```26@``$EH``!*:```26@``
+M$EH``)C,````#@````X````/````#@````X````!````1@!@```````!````
+M1@!A```````!````1@!B```````!````1@!C```````!````1@!D```````!
+M````1@!E```````!````1@!F```````!````1@!G```````!````1@!H````
+M```!````1@!I```````!````1@!J```````!````1@!K```````!````1@!L
+M```````!````1@!T```````!````1@!T```````!````1@!T```````!````
+M1@!T```````!````1@!T```````!````1@!T```````!````1@!T```````!
+M````1@!T```````!````1@!U```````!````1@!V```````!````1@!W````
+M```!````1@!X```````!````1@!Y```````!````1@!Z```````!````1@![
+M```````!````1@!\```````!````1@!]```````!````1@!^```````!````
+M1@!_```````!````1@"````````!````1`!\```````!````1@"(```````!
+M````1@",```````!````1@"0```````!````1@"4```````!````1@"8````
+M```!````1@"<```````!````1@"@```````!````1@"D```````!````1@"H
+M```````!````1@"L```````!````1@"P```````!````1@"T`````AQ$``(<
+M3``"'%0``AQ<``(<=``"''0``AQD``(<;!:>``868@`$%CH``Q8<``(5Z@`!
+M%9H``!5*```5`P`!%%D``PNX``4``````````````#```(`5``"`%0``@!4`
+M`(`5``"`%0``@!P2C9.G"8@3SP3@$Y42X!.K"8@3SP``F"@*`@`!"@(``04"
+M`0`*`@`!"@(``0``F#0```X.```.#@``#@X```X.```.#@``F#@````'````
+M!P````L````+````"P``F$@`&-IM`!C:;0`8RG4`&,IU`!C*=0``F%`-Z+3@
+M#>BTX`WHM.`-Z+3@#>BTX```F%A^@`TN?H`-+G[H#2Y^Z`TN?H`-+@``F%PQ
+M-V9>,3=F7C$W9EXQ-V9>,3=F7@``F&P%#+"!!0RP@04,L($%#+"!!0RP@0``
+MF10```?0```'T```!$P```B8```'T```F43WN!`@][@0(/>X#1#WN!`0][@0
+M$```H@0```````````````@````(````"```H@C6OF>(UKYGB-`^9XC0/F>(
+MT#YGB```H@QD+`%`9"P!0&1"P6!D0L%@9$+!8```HAP8@X`*&(.`"AAS@`H8
+M@X`*&(.`"@``$C````````"8"````````)@L``(O_@``F#P``@$```"83!*$
+M83P``)DP``!(@@``F4`````$``"96````/\``)ET````````HB@```&U``"B
+M/!/(B:\``)L$`````0``FP@````"``";#`````,``)L0````!```FQ0````%
+M``";&`````@``)L<````"0``FR`````*``";)`````L``)LL````#0``FS``
+M```0``";-````!$``)L\````$P``FT`````4``";1````!4``)M(````&```
+MFTP````9``";4````!H``)M4````&P``FU@````<``";7````!T``)M@````
+M(```FV@````B``";;````",``)MP````)```FW0````E``";>````"@``)M\
+M````*0``FX`````J``";A````"L``)N(````+```FY`````P``";E````#$`
+M`)N8````,@``FZ`````T``";I````#4``)NH````-0``FZP````U``";L```
+M`#4``)NT````-0``F[@````U``";O````#4``)O`````-0``F\0````U``";
+MR````#4``)O,````-0``F]`````U``";U````#4``)O8````-0``F]P````U
+M``";X````#4``)OD````-0``F^@````U``";[````#4``)OP````-0``F_0`
+M```U``";^````!```)O\````&@``F@`````'````!P``F@0```!'````1P``
+MF@@```"'````AP``F@P```&@```!H```FA````'@```!X```FA0````@````
+M(```FA@```!@````8```FAP```&A```!H0``FB````'A```!X0``FB0````A
+M````(0``FB@```!A````80``FBP```%B```!8@``FC````&B```!H@``FC0`
+M``'B```!X@``FC@````B````(@``FCP```!B````8@``FD````%C```!8P``
+MFD0```&C```!HP``FD@```'C```!XP``FDP````C````(P``FE````!C````
+M8P``FE0```&$```!A```FE@```'$```!Q```FEP````$````!```FF````'J
+M````"P``FF0````J````2P``FF@```!J````BP``FFP```"J```!K```FG``
+M``&K```![```FG0```'K````+```FG@````K````$@``FGP```!K````4@``
+MFH````"K````D@``FH0```&L```!DP``FH@```'L```!TP``FHP````L````
+M$P``FI`````Z````4P``FI0```!Z````DP``FI@```"Z```!E```FIP```&[
+M```!U```FJ````'[````%```FJ0````[````.@``FJ@```![````>@``FJP`
+M``"[````N@``FK````&\```!NP``FK0```'\```!^P``FK@````\````.P``
+MFKP```!\````>P``FL````"\````NP``FL0```#\```!O```FL@```#\```!
+M_```FLP```#\````/```FM````#\````?```FM0```#\````O```FM@```#\
+M````_```FMP```#\````_```FN````#\````_```FN0```#\````_```FN@`
+M``#\````_```FNP```#\````_```FO````#\````_```FO0```#\````_```
+MFO@```#\````_```FOP```#\````_```F-0````@``"8T`,&!`@#!P0(`P8$
+M"`,&!`@#!P0(``"8W`"@(,``H"#``.`@P`#@(,``X"#```"8G`\````/````
+M#P````\````/``````"8G`````````````````````````````"8G`"`````
+M@````(````"`````@`````"8G``J````*@```"H````J````*@````"8G``!
+M`````0````$````!`````0````"8G`````````````````````````````"8
+MG``8````&````!@````8````&`````"8G`!@````8````&X```!N````;@``
+M``"8G`#'````QP```,<```#'````QP````"8G`!+````2P```$L```!+````
+M2P````"8G`1(```$2```!$@```1(```$2`````"8G`!,````3````$P```!,
+M````3`````"8G`#D````Y````.0```#D````Y`````"8G```````````````
+M``````````````"8G`#\````_````/P```#\````_`````"8G`#_````_P``
+M`/\```#_````_P````"8G`0_```$/P``!#\```0_```$/P````"8G``,````
+M#`````P````,````#`````"8G`(9```"&0```AD```(9```"&0````"8G``D
+M````)````"0````D````)`````"8G`"T````M````+0```"T````M`````"8
+MG`"9````F0```)D```"9````F0````"8G`!0````4````%````!0````4```
+M``"8G``J````*@```"H````J````*@````"8G``2````$@```!(````2````
+M$@````"8G,`R``#`,@``P#(``,`R``#`,@````"8G`%T```!=````70```%T
+M```!=`````"8G``1````$0```!$````1````$0````"8G(8H``"&*```AB@`
+M`(8H``"&*`````"8G#&$```QA```,80``#&$```QA`````"8G`#R`(``\@"`
+M`/(`@`#R`(``\@"```"8G``G`!D`)P`9`"<`&0`G`!D`)P`9``"8G`````,`
+M```#`````P````,````#``"8G`````````````````````````````"8G```
+M`+(```"R````L@```+(```"R``"8G`"P((0`L""$`+`@A`"P((0`L""$``"8
+MG`!!):0`026D`$$EI`!!):0`026D``"8G``1DB``$9(@`!&2(``1DB``$9(@
+M``"8G``:2```&D@``!I(```:2```&D@```"8V``+`C``"P(P``L",``+`C``
+M"P(P``"8G````)0```"4````E````)0```"4``"8G````)$```"1````D0``
+M`)$```"1``"8G````!(````2````$@```!(````2``"8G````(````"`````
+M@````(````"```"8G````-D```#9````V0```-D```#9``"8G````&````!@
+M````8````&````!@``"8G````/````#P````\````/````#P``"8G````*(`
+M``"B````H@```*(```"B``"8G````%(```!2````4@```%(```!2``"8G```
+M`-0```#4````U````-0```#4``"8G```%,P``!3,```4S```%,P``!3,``"8
+MG```!(P```2,```$C```!(P```2,``"8Q`````,````#`````P````,````#
+M``(T*``"-#```C0X``(T4``"-%```C1```(T2````````````````````#``
+M```5````%0```!4````5````%0``@!P2C9.G"8@3SP3@$Y42X!.K"8@3SP``
+MF"@*`@`!"@(``04"```*`@`!"@(``0``F#0```X````.````#@````X````.
+M````F#@````"`````@````H````*````"@``F$@`&-IM`!C:;0`::F0`&FID
+M`!IJ9```F%`-Z+3@#>BTX`WHL-H,F+#:#>BPV@``F%A^@`TN?H`-+G[H#2Y^
+MR`TN?H`-+@``F%PQ-V9>,3=F7C$W9EXQ.6!>,3=F7@``F&P%#+"!!0RP@04,
+ML($%#+"!!0RP@0``F10```?0```'T```!$P```B8```'T```F43WN!``][@0
+M`/>X#0#WN!``][@0````H@0`````````````````````````````H@C6OF>(
+MUKYGB-`^9XC0/F>(T#YGB```H@P`+`%``"P!0`!"P4``0L%``$+!0```HAP8
+M@X`*&(.`"AAC@`H8@X`*&(.`"@``$C````/@``"`8`````\``($8````````
+M@1P```````"!(````````($D````````@2@```````"!+````````($P````
+M````@30```````"!.````````($\````````@4"```"H``"!1````````)@(
+M````````F"P``*````"8/``@!````)A,$H0C/```F'`````?``"8=````(``
+M`)AX````#@``F5@```#_``"9@````````)F$`H``````F:````````"9X```
+M`````)GDJJJJJ@``F>@\1F1X``"9[````*H``)GP````#```F?0```#_``"9
+M^````!0``*(H```)M0``HCR3R(FO``"B3`````$``*)0``"@````HE0`````
+M``"B6`S'4X```*)<#P\/`0``HF!?:0\!``"B9`!!BA$``*)H````````HFP,
+M,,%J``"B<`""""```*)T`!M\J@``HG@<YSG.``"B?`47`<X``*,`&`$`````
+MHP0P`R8"``"C"$@'/@8``*,,5@M,"@``HQ!D&F`/``"C%'A/;AL``*,8AH]\
+M6@``HQR.SX9;``"C()U/EP\``*,DI<^ACP``HRBU7Z\?``"C++W?N9\``*,P
+MS7_'/P``HS35_]&_``"C.````````*,\````````HT````````"C1```````
+M`*-(/____P``HTP_____``"C4#____\``*-4``/__P``HUAYJ*H?``"C7`9L
+M0@\``*-@#R@B!P``HV078!:%``"C:!^`$00``*-L-Z`,`P``HW`_Q`B#``"C
+M=%?`"`,``*-X7]@&@@``HWQ_X`2"``"C@'\\>[H``*.$\S!_\```FP0````!
+M``";"`````(``)L,`````P``FQ`````$``";%`````4``)L8````"```FQP`
+M```)``";(`````H``)LD````"P``FRP````-``";,````!```)LT````$0``
+MFSP````3``";0````!0``)M$````%0``FT@````8``";3````!D``)M0````
+M&@``FU0````;``";6````!P``)M<````'0``FV`````@``";:````"(``)ML
+M````(P``FW`````D``";=````"4``)MX````*```FWP````I``";@````"H`
+M`)N$````*P``FX@````L``";D````#```)N4````,0``FY@````R``";H```
+M`#0``)ND````-0``FZ@````U``";K````#4``)NP````-0``F[0````U``";
+MN````#4``)N\````-0``F\`````U``";Q````#4``)O(````-0``F\P````U
+M``";T````#4``)O4````-0``F]@````U``";W````#4``)O@````-0``F^0`
+M```U``";Z````#4``)OL````-0``F_`````U``";]````#4``)OX````$```
+MF_P````:``":``````````````":!`````````!```":"`````````"```":
+M#`````````&!``":$`````````'!``":%``````````!``":&`````````!!
+M``":'`````````"!``":(`````````%H``":)`````````&H``":*```````
+M``'H``":+``````````H``":,`````````!H``":-`````````&)``":.```
+M``````')``":/``````````)``":0`````````!)``":1`````````")``":
+M2`````````&0``":3`````````'0``":4``````````0``":5`````````!0
+M``":6`````````"0``":7`````````&1``":8`````````'1``":9```````
+M```1``"::`````````!1``":;`````````"1``":<`````````%X``":=```
+M``````&X``":>`````````'X``":?``````````X``":@`````````!X``":
+MA`````````&9``":B`````````'9``":C``````````9``":D`````````!9
+M``":E`````````"9``":F`````````#9``":G`````````#Y``":H```````
+M``#Y``":I`````````#Y``":J`````````#Y``":K`````````#Y``":L```
+M``````#Y``":M`````````#Y``":N`````````#Y``":O`````````#Y``":
+MP`````````#Y``":Q`````````#Y``":R`````````#Y``":S`````````#Y
+M``":T`````````#Y``":U`````````#Y``":V`````````#Y``":W```````
+M``#Y``":X`````````#Y``":Y`````````#Y``":Z`````````#Y``":[```
+M``````#Y``":\`````````#Y``":]`````````#Y``":^`````````#Y``":
+M_`````````#Y``"8U````"```)C0`@`4"`(!%`@"`!0(`@`4"`(!%`@``)C<
+M`*`@P`"@(,``X"#``.`@P`#@(,```)B<\````/````#P````\````/``````
+M`)B<`````````````````````````````)B<`P````,````#`````P````,`
+M`````)B<`````````````````````````````)B<````````````````````
+M`````````)B<`````````````````````````````)B<````````````````
+M`````````````)B<`````````````````````````````)B<0$```$!```!`
+M0```0$```$!``````)B<904``&4%``!E!0``904``&4%`````)B<````````
+M`````````````````````)B<`````````````````````````````)B<`$(`
+M``!"````0@```$(```!"`````)B<`+4```"U````M0```+4```"U`````)B<
+M``,````#`````P````,````#`````)B<`/<```#W````]P```/<```#W````
+M`)B<`)T```"=````G0```)T```"=`````)B<`"(````B````(@```"(````B
+M`````)B<!"(```0B```$(@``!"(```0B`````)B<`",`&``C`!@`(P`8`",`
+M&``C`!@``)B<`"@````H````*`!@`"@`8``H`&```)B<`%``P`!0`,``4`##
+M`%``PP!0`,,``)B<``0`?P`$`'\`!`!_``0`?P`$`'\``)B<```$6```!%@`
+M``18```$6```!%@``)B<`````````````````````````````)B<``#`````
+MP````,````#`````P````)C8`$`",`!``C``0`(P`$`",`!``C```)B<``!D
+M````9````&0```!D````9````)B<```(````"`````@````(````"````)C,
+M````#@````X````.````#@````X``EPD``)<+``"7#0``EQ,``)<3``"7#P`
+M`EQ$`````````#`````5````%0```!4````5````%0``@!P2C9.G"8@3SP3@
+M$Y42X!.K"8@3SP``F"@*`@`!"@(``04"`0`*`@`!"@(``0``F#0```X.```.
+M#@``#@X```X.```.#@``F#@````'````!P````L````+````"P``F$@`&/IA
+M`!CZ80`:&F,`&AIC`!H:8P``F%`,F+3@#)BTX`R8L-H,F+#:#)BPV@``F%A^
+MR`TN?L@-+G[(#2Y^R`TN?L@-+@``F%PQ.6!>,3E@7C$Y8%XQ.6!>,3E@7@``
+MF&P%#+"!!0RP@04,L($%#+"!!0RP@0``F10```?0```'T```!$P```B8```'
+MT```F43WN!``][@0`/>X#0#WN!``][@0````H@0`````````````````````
+M````````H@C6OF>(UKYGB-`^9XC0/F>(T#YGB```H@P`+L'@`"[!X``JP2``
+M*L$@`"K!(```HAP8@X`*&(.`"AAC@`H8@X`*&(.`"@``HP`8`0``&`$``!@!
+M```8`0``&`$`````HP0P`R8",`,F`C`#)@(P`R8",`,F`@``HPA(!SX&2`<^
+M!D@'/@9(!SX&2`<^!@``HPQ6"TP*5@M,"E8+3`I6"TP*5@M,"@``HQ!D&F`/
+M9!I@#V0:8`]D&F`/9!I@#P``HQ1X3VX;>$]N&WA/;AMX3VX;>$]N&P``HQB&
+MCWQ:AH]\6H:/?%J&CWQ:AH]\6@``HQR0SX9;D,^&6X[/AEN.SX9;CL^&6P``
+MHR"=3Y</G4^7#YM/EP^;3Y</FT^7#P``HR2GSZ./I\^CCZ//GX^CSY^/H\^?
+MCP``HRBU7Z\?M5^O'[-?KQ^S7Z\?LU^O'P``HRR]W[F?O=^YG[O?N9^[W[F?
+MN]^YGP``HS#+?\4_RW_%/\M_QS_+?\<_RW_'/P``HS35_]&_U?_1O]/_T;_3
+M_]&_T__1OP``$C````/@``!`:````!```(!@````#P``@)P```````"`H```
+M`````($8````````@1P```````"!(````````($D````````@2@```````"!
+M+````````($P````````@30```````"!.````````($\````````@4"```/Y
+M``"!1````````)@(````````F"P``*````"8/``@!````)A,$H0C/```F'``
+M```?``"8=````(```)AX````#@``F5@`"!__``"9@````````)F$`H``````
+MF:````````"9X````````)GDJJJJJ@``F>@\1F1X``"9[````*H``)GP````
+M#```F?0```#_``"9^````!0``*(H```)M0``HCR3R(FO``"B3`````$``*)0
+M``"@````HE0```````"B6`S'4X```*)<#P\/`0``HF!?:0\!``"B9`!!BA$`
+M`*)H````````HFP,,,%J``"B<`""""```*)T"!M\J@``HG@<YSG.``"B?`47
+M`<X``*,X````````HSP```````"C0````````*-$````````HT@_____``"C
+M3#____\``*-0/____P``HU0``___``"C6'FHJA\``*-<!FQ"#P``HV`/*"('
+M``"C9!=@%H4``*-H'X`1!```HVPWH`P#``"C<#_$"(,``*-T5\`(`P``HWA?
+MV`:"``"C?'_@!((``*.`?SQ[N@``HX3S,'_P``";!`````$``)L(`````@``
+MFPP````#``";$`````0``)L4````!0``FQ@````(``";'`````D``)L@````
+M"@``FR0````+``";+`````T``)LP````$```FS0````1``";/````!,``)M`
+M````%```FT0````5``";2````!@``)M,````&0``FU`````:``";5````!L`
+M`)M8````'```FUP````=``";8````"```)MH````(@``FVP````C``";<```
+M`"0``)MT````)0``FW@````H``";?````"D``)N`````*@``FX0````K``";
+MB````"P``)N0````,```FY0````Q``";F````#(``)N@````-```FZ0````U
+M``";J````#4``)NL````-0``F[`````U``";M````#4``)NX````-0``F[P`
+M```U``";P````#4``)O$````-0``F\@````U``";S````#4``)O0````-0``
+MF]0````U``";V````#4``)O<````-0``F^`````U``";Y````#4``)OH````
+M-0``F^P````U``";\````#4``)OT````-0``F_@````0``";_````!H``)H`
+M`````````````)H$````0````$```)H(````@````(```)H,```!H0```6$`
+M`)H0```!X0```:$``)H4````(0```>$``)H8````80```"$``)H<```!B```
+M`&$``)H@```!R````8@``)HD````"````<@``)HH````2`````@``)HL````
+MB````$@``)HP```!J0```(@``)HT```!Z0```6D``)HX````*0```:D``)H\
+M````:0```>D``)I````!T````"D``)I$````$````&D``)I(````4````9``
+M`)I,````D````=```)I0```!L0```!```)I4```!\0```%```)I8````,0``
+M`)```)I<````<0```7$``)I@```!N````;$``)ID```!^````?$``)IH````
+M.````#$``)IL````>````'$``)IP```!F0```9@``)IT```!V0```=@``)IX
+M````&0```!@``)I\````60```%@``)J`````F0```)@``)J$````V0```7D`
+M`)J(````^0```;D``)J,````^0```?D``)J0````^0```#D``)J4````^0``
+M`'D``)J8````^0```+D``)J<````^0```/D``)J@````^0```/D``)JD````
+M^0```/D``)JH````^0```/D``)JL````^0```/D``)JP````^0```/D``)JT
+M````^0```/D``)JX````^0```/D``)J\````^0```/D``)K`````^0```/D`
+M`)K$````^0```/D``)K(````^0```/D``)K,````^0```/D``)K0````^0``
+M`/D``)K4````^0```/D``)K8````^0```/D``)K<````^0```/D``)K@````
+M^0```/D``)KD````^0```/D``)KH````^0```/D``)KL````^0```/D``)KP
+M````^0```/D``)KT````^0```/D``)KX````^0```/D``)K\````^0```/D`
+M`)C4````(```F-`````(````"`````@````(````"```F-P`H`#``*``P`#@
+M`,``X`#``.``P```F)PS````,P```#,````S````,P``````F)P!`````0``
+M``$````!`````0``````F)P`````````````````````````````F)P`````
+M````````````````````````F)P`````````````````````````````F)P?
+M````'P```!\````?````'P``````F)P`````````````````````````````
+MF)P`N````+@```"X````N````+@`````F)P`MP```+<```"W````MP```+<`
+M````F)P`A````(0```"$````A````(0`````F)P`F````)@```"8````F```
+M`)@`````F)P`P````,````#`````P````,``````F)P`_P```/\```#_````
+M_P```/\`````F)P`_P```/\```#_````_P```/\`````F)P`_P```/\```#_
+M````_P```/\`````F)P`_P```/\```#_````_P```/\`````F)P`UP```-<`
+M``#7````UP```-<`````F)P`80```&$```!A````80```&$`````F)P`_@``
+M`/X```#^````_@```/X`````F)P`W@```-X```#>````W@```-X`````F)P`
+M?P```'\```!_````?P```'\`````F)P$/0``!#T```0]```$/0``!#T`````
+MF)P`=P```'<```!W````=P```'<`````F)P`1````$0```!$````1````$0`
+M````F)P`F````)@```"8````F````)@`````F)P`$`"``!``@``0`(``$`"`
+M`!``@```F)P`!<`T``7`-``%P#0`!<`T``7`-```F)P`,0#P`#$`\``Q`/``
+M,0#P`#$`\```F)P`#`$?``P!'P`,`1\`#`$?``P!'P``F)P`40!``%$`0`!1
+M`$``40!``%$`0```F)P`4`#:`%``V@!0`-H`4`#:`%``V@``F)P`````````
+M````````````````````F)P``$!$``!`1```0$0``$!$``!`1```F)P`````
+M````````````````````````F)P``&#```!@P```8,```&#```!@P```F)P`
+M`"P````L````-@```#8````L````F,@```0#```$`P``!`,```0#```$`P``
+MF)P``&0```!D````9````&0```!D````F)P```@````(````"`````@````(
+M````F,P````.````#@````X````.````#@`">U@``GM@``)[:``">X```GN`
+M``)[<``">W@````````````````P+CDN,C`N,P````````%@```!:````7``
+M``%X```!@````8@```&0```!F``````!B`#P`/,!B0"``(,!B@#R`/4!BP#V
+M`/<!C`#Q`/0!C0"!`(0!CP""`(4```!E```````!_____P```(#_____````
+M`$I0```/M`````````!J```````!_____P```(#_____`````$I0```/M```
+M``````!``/``\X&(`/``\P!!`(``@X&)`(``@P!(`/(`]8&*`/(`]0!#`/8`
+M]X&+`/8`]P!*`/$`](&,`/$`]`!+`($`A(&-`($`A`!,`((`A8&/`((`A0D(
+M"40%!B@H````````````````````````````````"84)A04&*"@`````````
+M```````````````````````)A0F%%`8H*```````````````````````````
+M``````F%"842!B@H```````````````````$````````````"=`*K`4&*"@`
+M```````````````````````````````)"`E$!084!0``````````````````
+M``````````````D("404`!0%````````````````````````````````"6P)
+MJ`4&%`4````````````````````````````````);`FH%``4!0``````````
+M`````````$````````````EL":@>`!0%````````````````````````````
+M````"6P)GAL&%`4````````````````````````````````);`F>%``4!0``
+M`````````````````$````````````F`"8H4`!0%````````````````````
+M````````````"9D)J!0`%`4````````````````````````````````)T`JL
+M!084!0````````````````````````````````FC":@4`!0%````````````
+M```````@(```````````"0@)1!0`%`4`````````````````````````````
+M```);`EL%``4!0````````````````````````````````EQ"8`4`!0%````
+M````````````````````````````"84)BA0`%`4`````````````````````
+M```````````)CPF9%``4!0````````````````````````````````F>"9X4
+M`!0%````````````````````````````````":,)HQ0`%`4``````````(``
+M``````0````````````)HPFC%``4!0``````````@```````````````````
+M``FH":@4`!0%``````````"````````$````````````":@)J!0`%`4`````
+M`````(`````````````````````)"`E$!084!0``````````````````````
+M``````````D("404`!0%````````````````````````````````"6P)J`4&
+M%`4````````````````````````````````);`FH%``4!0``````````````
+M`````"````````````EL":@>`!0%````````````````````````````````
+M"6P)GAL&%`4````````````````````````````````);`F>%``4!0``````
+M`````````````"````````````F`"8H4`!0%````````````````````````
+M````````"9D)J!0`%`4````````````````````````````````)HPFH%``4
+M!0``````````````````("````````````FT";0%!A0%````````````````
+M````````````````";0)M!0`%`4``````````````````"@@```````````)
+MT`JL!084!0````````````````````````````````D("404`!0%````````
+M````````````````````````"6P);!0`%`4`````````````````````````
+M```````)<0F`%``4!0````````````````````````````````F%"8H4`!0%
+M````````````````````````````````"8\)F10`%`4`````````````````
+M```````````````)G@F>%``4!0````````````````````````````````FC
+M":,4`!0%``````````"````````$````````````":,)HQ0`%`4`````````
+M`(`````````````````````)J`FH%``4!0``````````@```````!```````
+M``````FH":@4`!0%``````````"`````````````````````";0)M!0`%`4`
+M`````````(````````0````````````)M`FT%``4!0``````````@```````
+M`````````````!0*%%H%!B@H````````````````````````````````%((4
+MT@4&*"@``````````0`````````````````````4^A5R!08H*```````````
+M`````````````````````!6:%A(%!B@H``````````$`````````````````
+M````%!X41@4&*"@````````````````````````````````4;A2^!08H*```
+M```````!`````````````````````!3F%5X%!B@H````````````````````
+M````````````%886)@4&*"@``````````0`````````````````````44!1X
+M$08H*````````````````````````````````!10%'@7!B@H````````````
+M````````````````````%%H46A$&*"@`````````````````````````````
+M```46A1:%P`H*````````````````````````````````!2@%*`7!B@H````
+M``````$``````````@``````````%*`4H!0&*"@``````````0`````````"
+M```````````4@A2"$0`H*``````````!``````````(``````````!2J%*H4
+M`"@H``````````$``````````@``````````%((4JA0`*"@``````````0``
+M```````"```````````4@A2J%P8H*``````````!``````````(`````````
+M`!6D%AP4!B@H``````````$``````````@``````````%H`6J!0`*"@`````
+M```````````````````````````6@!:H'@8H*```````````````````````
+M`````````!:%%JT>!B@H````````````````````````````````%%H4@@\`
+M*"@``````````P````````0````````````4JA2J$@`H*``````````#````
+M````!````````````!6D%AP4`"@H``````````,````````$````````````
+M%H`6J!0`*"@```````````````````0````````````3,Q,]%P`*!0``````
+M`````````````!`0`````````!-'$U$7``H%````````````````````$!``
+M````````$S@3=!<`%!0````````````````````0!P`````````33A-[&P8%
+M!0````````````````````$``````````!-1$WD>!@H%````````````````
+M`````0``````````$U83="$&%`4````````````````````!```````````3
+MJQ.P%P`*!0```````````````````!`,`````````!.P$]@7`!04````````
+M````````````$`(`````````$[\3OQ<`"@4````````````````````0#```
+M```````4`!1X!084%````````````````````````````````!0R%&X7`!04
+M````````````````````&`$`````````%#(4;A0`%!0`````````````````
+M```8`0`````````4/!1X#P`4%`````````````````````4``````````!0\
+M%'@1!A04`````````````````````0$`````````%#P4>!(`%!0`````````
+M```````````%```````````4/!1X%``4%`````````````````````4`````
+M`````!0\%'@7`!04````````````````````!0``````````%#P4>!<&%!0`
+M```````````````````!```````````4/!3(%`84%``````````"````````
+M``0``````````!1X%*`7`!04``````````$`````````!0``````````%(P4
+MH!<`%!0``````````P`````````%```````````4C!3($@`4%``````````#
+M``````````4``````````!2,%,@4`!04``````````<```````"`!0``````
+M````%(P4R!0&%!0``````````P`````````!`@`````````4C!3(%P84%```
+M```````#``````````$"`````````!2,%,@7!A04``````````,`````````
+M`0``````````%(P4R!X`%!0````````````````````````````````4C!9$
+M!084%``````````#`````````````````````!2@%,@1!A04``````````,`
+M`````````0``````````%7P5]!X&%!0``````````@`````````$````````
+M```5?!9$%`84%``````````#``````````$$`````````!5\%D0;`!04````
+M``````,`````````!0``````````%7P61!X`%!0``````````P`````````%
+M```````````5?!9$%P`4%``````````'````````@`$``````````!9Q%JT7
+M`!04````````````````````````````````%G$6K1X&%!0`````````````
+M```````````````````6<1:M'@84%``````````"``````````0`````````
+M`!9Q%L$%!A04````````````````````````````````%G$6P1$`%!0`````
+M```````````````````````````6<1;!%``4%```````````````````````
+M`````````!9Q%L$>`!04````````````````````````````````%G$6P1X&
+M%!0``````````````````````P`````````6<1;!'@84%```````````````
+M`````````````````!,X$W0>`!04```````````````````$````````````
+M$[`3V!X`%!0```````````````````0````````````4,A1N'@`4%```````
+M```#````````!````````````!0\%'@>`!04``````````,````````$````
+M````````%(P4R!X`%!0``````````P````````0````````````6<1;!'@`4
+M%```````````````````!````````````!5\%D0>`!04``````````,`````
+M```$````````````%(P4R!X`%!0````````````````````````````````4
+M/!1X'@`4%````````````````````````````````!;!%L$>`!04````````
+M```````````$```````````````!_P'_`````````````'__________````
+M`````````P&8`9D`````````````?_________\````````````'`9@+,```
+M``````````!__________P````````````@!F`PP`````````````'______
+M____````````````(`$@"A``````````````?_________\````````````A
+M`2`!F0````````````!__________P```````````"(!(`PP````````````
+M`'__________````````````.@%@"A``````````````?_________\`````
+M```````[`6`!F0````````````!__________P```````````!(!90H0````
+M```#`````'__________````````````-P$P`9D```````,`````?_______
+M__\````````````U`C`!F0```````P````!__________P```````````#8#
+M,`&9```````#`````'__________````````````,`0P`9D```````,`````
+M?_________\````````````Y!3`!F0```````P````!__________P``````
+M`````#0&,`&9```````#`````'__________````````````,@,P`9D`````
+M``,`````?_________\````````````Q`S`!F0````````````!_________
+M_P```````````!$!$`&9`````````````'__________````````````$`$0
+M"A``````````````?_________\```````````!2`5`!F0````````````!_
+M_________P```````````$4"4`&9`````````````'__________````````
+M````1P-0`9D`````````````?_________\```````````!"!%`!F0``````
+M``````!__________P```````````%@%4`&9`````````````'__________
+M````````````6P90`9D`````````````?_________\```````````!="%`!
+MF0````````````!__________P```````````%X)4`&9`````````````'__
+M________````````````4`-0"A``````````````?_________\`````````
+M``!5`5`,,`````````````!__________P```````````%8"4`PP````````
+M`````'__________````````````20)0#5``````````````?_________\`
+M``````````!``4`*0```````1@````0`````````*`&(`````````$$!0`I`
+M``````!'````!`````````!H`8D`````````2`%`"A```````$8````$````
+M``````@!B@````````!*`4`*0```````1@````0````````8"`&,````````
+M`$L!0`I```````!&````!````````&`(`8T`````````3`%`"E```````$8`
+M```$``````````@!CP````````!#`D`*0```````1P````0`````````<`&+
+M`````````/`#0`I```````!&````!``````````@````````````@`-`"D``
+M`````$<````$`````````&`/IP````````#Q`T`*0```````1@````0`````
+M```8`````````````($#0`I```````!&````!````````&``#Z@`````````
+M@@-`"E```````$8````$```````````/J0````````#R`T`*$```````1@``
+M``0``````````````````````(,$0`I```````!'````!````````(!@#ZH`
+M````````]`1`"D```````$8````$````````F`````````````"$!$`*0```
+M````1@````0```````#@``^K`````````(4$0`I0``````!&````!```````
+M`(``#ZP`````````]01`"A```````$8````$````````@`````````````"&
+M!4`*0```````1P````0```````"`8`^M`````````(<%0`I```````!&````
+M!````````.``#ZX`````````B`5`"E```````$8````$````````@``/KP``
+M``````")!D`*0```````1P````0`````````:`^P`````````(H&0`I`````
+M``!&````!````````&`(#[$`````````BP9`"E```````$8````$````````
+M``@/L@````````",!T`*0```````1P````0```````"`:`^S`````````(T'
+M0`I```````!&````!````````.`(#[0`````````C@=`"E```````$8````$
+M````````@`@/M0````````"/"$`*0```````1P````0```````"`:`^V````
+M`````)`(0`I```````!&````!````````.`(#[<`````````D0A`"E``````
+M`$8````$````````@`@/N`````````#V"4`*0```````1P````0```````"`
+M8````````````/<+0`I```````!'````!````````(!@````````````8`!@
+M`&``````````````?_________\```````````!A`&$`80```````P````!_
+M_________P```````````&(`8@!B```````"`````'__________````````
+M````8P!C`&,`````````````?_________\```````````!D`&0`9```````
+M`P````!__________P```````````&4`90!E```````#`````'__________
+M````````````9@!F`&8`````````````?_________\```````````!G`&<`
+M9P````````````!__________P```````````&@`:`!H`````````````'__
+M________````````````:0!I`&D```````,`````?_________\`````````
+M``!J`&H`:@```````P````!__________P```````````?\```````$````!
+M`````1M8```````0`````0````$````!&U@````(``,````!``````````$;
+M6`````P``P````$``````````1M8````(`!'````````````````&U@````S
+M`#`````!``````````$;6````"0`(0````$````!`````1M8````*``W````
+M`0`````````!&U@````?`#`````!`````0````$;6````#``6P````$`````
+M`````1M8````<``#`````0`````````!&U@````X`#<````!``````````$;
+M6````%0`50````$````!`````1M8````1`!5`````0````$````!&U@```!,
+M`#L````!```````````;6````&``4@````$````!`````1M8````9``T````
+M`0`````````!&U@```!\`"`````!`````0````$;6````)@`6P````$````!
+M`````1M8````G`!2`````0````$````!&U@```"J`!`````!``````````$;
+M6````+P``P````$``````````1M8````OP`V`````0`````````!&U@```#$
+M`#<````!`````0````$;6````,L`-P````$``````````1M8````T``W````
+M`0`````````!&U@```#6`!`````!`````0````$;6````-H``P``````````
+M`````!M8```#,@`V`````0`````````!&U@```#>``,````!``````````$;
+M6````.D`-P````$``````````1M8````]@`W`````0`````````!&U@```#Z
+M`#<````!``````````$;6````/\`-@````$``````````1M8```!#``P````
+M`0````$````!&U@```$4`#<````!``````````$;6````2P`-P````$`````
+M`````1M8```!0``0`````0````$````!&U@```%4``,````!``````````$;
+M6````5@`(0````$````!`````1M8```!7``W`````0`````````!&U@```%@
+M`#<````!``````````$;6````60`6P````$``````````1M8```!:`!2````
+M`0`````````!&U@```%L`%(````!`````0````$;6````70`-P````$`````
+M`````1M8```!>``#`````0`````````!&U@```%\`#<````!``````````$;
+M6````8@`0`````$``````````!M8```!B0!!`````0``````````&U@```&*
+M`$@````!```````````;6````8L`0P````$``````````!M8```!C`!*````
+M`0``````````&U@```&-`$L````!```````````;6````8\`3`````$`````
+M`````!M8```/IP"``````0``````````&U@```^H`($````!```````````;
+M6```#ZD`@@````$``````````!M8```/J@"#`````0``````````&U@```^K
+M`(0````!```````````;6```#ZP`A0````$``````````!M8```/K0"&````
+M`0``````````&U@```^N`(<````!```````````;6```#Z\`B`````$`````
+M`````!M8```/L`")`````0``````````&U@```^Q`(H````!```````````;
+M6```#[(`BP````$``````````!M8```/LP",`````0``````````&U@```^T
+M`(T````!```````````;6```#[4`C@````$``````````!M8```/M@"/````
+M`0``````````&U@```^W`)`````!```````````;6```#[@`D0````$`````
+M`````!M8```!D`!"`````0`````````!&U@```&.``,````!``````````$;
+M6````9@`10````$````!`````1M8```!F@!%`````0``````````&U@```&;
+M`$4````!```````````;6````9P`7@````$``````````!M8```!G@`#````
+M`0`````````!&U@```&L`#<````!``````````$;6````:8``P````$`````
+M`````1M8```!M@`W`````0`````````!&U@```&X`#<````!``````````$;
+M6````;H`-P````$``````````1M8```!O@`A`````0````$````!&U@```,G
+M``,````!``````````$;6````<H`70````$``````````!M8```!U@`W````
+M`0`````````!&U@```'D`!`````!`````0````$;6````>P`,`````$````!
+M`````1M8```!^``#`````0`````````!&U@```(0`#<````!``````````$;
+M6````BH`(@````$``````````1M8```"0@`W`````0`````````!&U@```(`
+M`%L````!``````````$;6````DH``P````$``````````1M8```"3P`0````
+M`0````$````!&U@```)<`%(````!``````````$;6````F``.P````$````!
+M`````1M8```":``W`````0`````````!&U@```)L`#<````!``````````$;
+M6````G8`$`````$````!`````1M8```">@`#`````0`````````!&U@```*"
+M``,````!``````````$;6````H,``P````$``````````1M8```"J@`A````
+M`0`````````!&U@```*^`%L````!`````0````$;6````K\`-P````$`````
+M`````1M8```"P0`W`````0`````````!&U@```+&`#L````!``````````$;
+M6````M0`-P````$``````````1M8```"\``W`````0`````````!&U@```+T
+M`#<````!``````````$;6````O@``P````$``````````1M8````G@!0````
+M`0````$````!&U@```+\``,````!``````````$;6````PP`,`````$`````
+M`````1M8```#%``V`````0`````````!&U@```,8`#8````!``````````$;
+M6````R0``P````$``````````1M8```#$``#`````0`````````!&U@```,Z
+M`#<````!``````````$;6````T@`$`````$````!`````1;!```#2@`2````
+M`0````$````!&U@```-:`!$````!``````````$;6````UP`.@````$````!
+M`````1M8```#7@!6`````0`````````!&U@```+```,````!``````````$;
+M6````W<``P````$``````````1M8```"S``#`````0`````````!&U@`````
+M```!_Q`````````````````!`````````````````````````"`(``(`````
+M````````````````_P`````````````````D$0```````````````````!0%
+M```````````````````"!0```````````````````!,```````````%0$```
+M```````````````````````````````````````!````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````E`0````````````
+M```````````````````````````````$````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````#4!``````````````````````
+M``````````````````````@0````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````10$```````````````````````````````
+M````````````@```@```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````!5`0````````````````````````````````````````
+M``!`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````&4#`````````````````"``````````,``````````````(``0(``
+M``````````````````D(````````````````````````````````````````
+M``````````````````````````````````````````````````````````A0
+M,`````````````````````````````````,````````!``0`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````"5`P````````
+M`````````@`````````$`````P`````````0(`0`````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````!,#`````````````````"
+M``````````0````#```````(``"`0```````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````(P,`````````````````(`````````
+M!`````,`````````````0```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````S`P`````````````````@`````````$`````P``
+M````"````$``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````$,#`````````````````"``````````0````#````````````
+M($``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``4P,`````````````````(`````````!`````,`````````````$```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````!C`P````
+M`````````````@`````````$`````P`````````!`!$`````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````!$!``````````````
+M`````````````````````````````@`!`"```````````````````!($````
+M```````````````@$0``````````````````````````````````````````
+M``````````````````````````````````$@$```````````````````````
+M```````````````````$``("````````````````````````````````````
+M`````"`2````````````````````````````````````````````````````
+M`````````````````````````6`0`````````````````0`````````#````
+M``````````(`0(`@```````````````````0Q```````````````````!"$`
+M````````````````````````````````````````````````````````````
+M```````````````!91`````````````````!``````````,`````````````
+M```````X````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````%`0```````````````````````````"`````(`````````````!```
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````D!`
+M```````````````````````````0`````@`````````````%QP``````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````#0$``````````
+M````````````````@``````"`````````````(``````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````1`0`````````````````0`
+M``````"```````(```````````!`@```````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````!4!`````````````````!````````(``
+M`````@`````````"`$"`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````&0$````````````````````````````@````"````
+M`````````(@`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````=`0`````````````````0```````"`"`````(```````````!`
+MA```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M"$!`````````````````!````````(`(`````@`````````"`$"$````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````)0$``````
+M````````````````````@``````"`````````````(''````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````M`0```````````````
+M``0```````"```````(```````````!`@<<`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````#5#_````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````"@````````````````````H`````````
+M```````````````````````*,/\``````````````````````````(`````#
+M````````````````````````````````````````````````````````````
+M``````````````````$````````````````````!````````````````````
+M``0```````````LP,``````````````````````````!``````,`````````
+M````````````````````````````````````````````````````````````
+M`````````(````````````````````"`````````````````````!```````
+M````##`P``````````````````````````(``````P``````````````````
+M````````````````````````````````````````````````````````````
+M$````````````````````!`````````````````````$```````````*$!``
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````@````````
+M````````````(`````````````````````0```````````I`0```````````
+M``````````````!X8`````(`````````````````````````````````````
+M````````````````````````````````````````"D``````````````````
+M``1`````````````````````!```````````"E!`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"`````````````````````@`````
+M```````````````$```````````!F3``````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````(````````````````````"```````````````
+M``````0```````````!@_P````````````````,````````$``````@`````
+M``/@```````````````````````"P```````````````````````````````
+M``````````"OP```````````````````"_``````````````````````"```
+M`````````&;_`````````````````P````````0`````"````````^``````
+M``````````````````+`````````````````````````````````````````
+M``?````````````````````!\``````````````````````(````````````
+M9_\````````````````#````````!``````(```````#X```````````````
+M`````````L``````````````````````````````````````````+\``````
+M``````````````OP``````````````````````@```````````!H_P``````
+M``````````,````````$``````@```````/@```````````````````````"
+MP`````````````````````````````````````````!7P```````````````
+M````%?``````````````````````"````````````&'_````````````````
+M`P````````0`````$````````^``````````````````````````````````
+M`````````````````````````````````*_````````````````````+\```
+M```````````````````(````````````8O\````````````````#````````
+M!``````0```````#X````````````````````````L``````````````````
+M````````````````````````K\````````````````````OP````````````
+M``````````@```````````!C_P````````````````,````````$``````@`
+M``````'@```````````````````````"P```````````````````````````
+M```````````````OP```````````````````"_``````````````````````
+M"````````````&3_`````````````````P````````0`````$```````'``(
+M``````````````````````+`````````````````````````````````````
+M``````?````````````````````!\``````````````````````(````````
+M````9?\````````````````#````````!``````0```````(A```````````
+M````````````````````````````````````````````````````````5\``
+M`````````````````!7P``````````````````````@```````````!I_P``
+M``````````````,````````$`````!````````/`````````````````````
+M```"P``````````````````````````````````````````'P```````````
+M`````````?``````````````````````"````````````&K_````````````
+M`````P````````0`````$````````\``````````````````````````````
+M`````````````````````````````````````"_````````````````````+
+M\``````````````````````(```````````!F/\`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````"```````````````````
+M`````````````````````````0,7<`L`C````````0,C*`\`$@```````0,N
+MX`H`F`(``````0-&4`X`)`(``````0-=P`D`L`0``````0.,H`T`2`0`````
+M`0.[@`@`8`0``````0/2\`P`;`0`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M"````````````````````````````````````````````0(7<`L`C```````
+M`0(C*`\`$@```````0(NX`H`F`(``````0)&4`X`)`(``````0)=P`D`L`0`
+M`````0*,H`T`2`0``````0*[@`@`8`0``````0+2\`P`;`0`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````$````````````````````````````
+M```````````````!``/H"P""```````!``?0"@2$`0`````!`!5\"02+`0``
+M```!`"KX"`26`0``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````(````````
+M```````````````````````````````````!`Q=P"P",```````!`R,H#P`2
+M```````!`R[@"@"8`@`````!`T90#@`D`@`````!`UW`"0"P!``````!`XR@
+M#0!(!``````!`[N`"`!@!``````!`]+P#`!L!```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````(```````````````````````````````````````````!`A=P
+M"P",```````!`B,H#P`2```````!`B[@"@"8`@`````!`D90#@`D`@`````!
+M`EW`"0"P!``````!`HR@#0!(!``````!`KN`"`!@!``````!`M+P#`!L!```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````"8G`````````````"8G```````
+M``````"8G`````````````"8G`````````````"8G`````````````"8G!``
+M```0``````"8G`0````$``````"8G`````````````"8G`````````````"8
+MG`````````````"8G``````*``````"8G``X`(`".`"```"8G``"``8````&
+M``"8G````)(```"2``"8G````*````"@``"8G``$``<`!``'``"8U````!H`
+M```:``"8G````$@```!(``"8G````!`````0``"8G`````@````(``"8G```
+M``\````/``"8G````/(```!B``"8G```D$\``)!,``"8G```$EH``!*:``"8
+MS`````X````/``"B!`````````````"B"%`^1D90/D9&``"B#&2`06QD@$%L
+M``"B$`&9H`,!F:`#``"B%`1,UA`$3-80``"B&!.``$`3@`!```"B'!O@`&`;
+MX`!@``"B(`Q3@`H,4X`*``"B)``4WSL`%-\[``"B*````;4```&U``"B+```
+M`"`````@``"8G`````````````"8G`````````````"8G`````````````"8
+MG`````````````"8G`````````````"8G`````````````"8G```````````
+M``"8G`````````````"8G`````````````"8G`````````````"8G```````
+M``````"8G``X````.`````"8G`````````````"8G`````````````"8G```
+M``````````"8G``$`/D`!`#Y``"8U``````````$``````````T`````````
+M``````````````````````````````````$$`/H#`($``F0"9`$$`?0'`($`
+M`<D!R0$$`^@"`((!`.0`Y`$$!]`&`(0"`*``H`$$"[@!`(8#`(P`C`$"%W`+
+M`(P$`#P`/`$"(R@/`!($`#P`/`$"+N`*`)@&`#``,`$"1E`.`"0&`#``,`$"
+M7<`)`#`(`"P`+`$"C*`-`$@(`"P`+`$"NX`(`&`(`"P`+`$"TO`,`&P(`"P`
+M+```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````P```````````````````````````````````````````$``^@;
+M`((```````$`!]`:!(0!``````$`%7P9!(L"``````$`*O@8!)8#```````"
+M%W`+``P$```````"(R@/`!($``````$"+N`*`!@&``````$"1E`.`"0&````
+M``$"7<`)`#`(``````$"C*`-`$@(``````$"NX`(`&`(``````$"TO`,`&P(
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````0`````````````````````````````
+M``````````````$``^@;`((```````$`!]`:!(0!``````$`%7P9!(L!````
+M``$`*O@8!)8!````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````@`````````
+M``````````````````````````````````$#%W`+`(P```````$#(R@/`!(`
+M``````$#+N`*`)@"``````$#1E`.`"0"``````$#7<`)`+`$``````$#C*`-
+M`$@$``````$#NX`(`&`$``````$#TO`,`&P$````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````<```````````````````````````````````````````$#%W`+
+M`(P```````$#+N`*`)@"``````$#1E`.`"0"``````$#7<`)`+`#``````$#
+MC*`-`$@#``````$#NX`(`&`#``````$#TO`,`&P#````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````@`````````````````````````````
+M``````````````$"!=P+`(,```````$"",H/``0```````$""[@*`(8"````
+M``$"$90.``D"``````$"%W`)`(P$``````$"(R@-`!($``````$"+N`(`!@$
+M``````$"-+P,`!L$````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````@`````````
+M``````````````````````````````````$""[@+`(8```````$"$90/``D`
+M``````$"%W`*`(P"``````$"(R@.`!("``````$"+N`)`)@$``````$"1E`-
+M`"0$``````$"7<`(`#`$``````$":7@,`#8$````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````@```````````````````````````````````````````$"%W`+
+M`(P```````$"(R@/`!(```````$"+N`*`)@"``````$"1E`.`"0"``````$"
+M7<`)`+`$``````$"C*`-`$@$``````$"NX`(`&`$``````$"TO`,`&P$````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````@``````````3`Q+C`Q````````"```
+M```````!,#$N,#$````````(``````````$P,2XP,0````````@`````````
+M`3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP
+M,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`````
+M```(``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```
+M```````!,#$N,#$````````(``````````$P,2XP,0````````@`````````
+M`3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP
+M,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`````
+M```(``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```
+M```````!,#$N,#$````````(``````````$P,2XP,0````````@`````````
+M`3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP
+M,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`````
+M```(``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```
+M```````!,#$N,#$````````(``````````$P,2XP,0````````@`````````
+M`3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP
+M,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`````
+M```(``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```
+M```````!,#$N,#$````````(``````````$P,2XP,0````````@`````````
+M`3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP
+M,0````````@``````````3`Q+C`Q````````"``````````!,#$N,#$`````
+M```(``````````$P,2XP,0````````@``````````3`Q+C`Q````````"```
+M```````!,#$N,#$````````(``````````$P,2XP,0````````@`````````
+M`3`Q+C`Q````````"``````````!,#$N,#$````````(``````````$P,2XP
+M,0````````@``````````3`Q+C`Q`````"YS>6UT86(`+G-T<G1A8@`N<VAS
+M=')T86(`+G)E9VEN9F\`+G)E;&$N=&5X=``N<F5L+G1E>'0`+G)E;&$N<F]D
+M871A`"YR96PN<F]D871A`"YR96QA+F1A=&$`+G)E;"YD871A`"YD871A,0`N
+M8G-S`"YN;W1E````````````````````````````````````````````````
+M```````````````;<```!@````(`````````-````!@```````````````0`
+M```8````*0````$````&`````````%```H\````````````````0````````
+M`"\````)`````````````Z8,``!L*`````\````"````!`````@````D````
+M!`````````````02-``````````/`````@````0````,````/@````$````"
+M```````"CU```([0```````````````0`````````$8````)````````````
+M!!(T```.&`````\````%````!`````@````Y````!`````````````0@3```
+M```````/````!0````0````,````5P````$````#```````#'B```%5`````
+M```````````0`````````%T````)````````````!"!,````0`````\````(
+M````!`````@```!2````!`````````````0@C``````````/````"`````0`
+M```,````9P````$````#```````#<V`````````````````````0````````
+M`&X````(`````P```````W-@```!H```````````````$`````````!S````
+M!P````````````-S8```!!````````````````$`````````$0````,`````
+M```````#=W````!Y```````````````!``````````$````"````````````
+M`WJ4```9D````!`````(````!````!`````)`````P````````````.4)```
+M$>@```````````````$`````````````````````````````````````````
+M``,```(````````````````#```%`````````````````P``"```````````
+M``````,```P````````````````#```!`````````````````P``"P``````
+M``````````,```T````!``#-:````+@2```"````#```M50````($@```@``
+M`!<``7\T```"Q!(```(````B``")=````,`2```"````+0`!HEP```,X$@``
+M`@```#@``3N`````3!(```(```!#``&SK````@P2```"````3@``=IP```'8
+M$@```@```%D``@_X```!F!(```(```!D```_!````:01```(````;P`!B"0`
+M``!8$@```@```'H``'JX````3!(```(```"%``!EJ````4`2```"````D```
+M3K````&D$0``"````)L``784````0!(```(```"F``%O0````"P2```"````
+ML0`!7F`````0$@```@```+P``3GP```!A!(```(```#'``%)E````>@2```"
+M````T@``#P@```"X$@```@```-T``2<@````[!(```(```#H``$&_````1@2
+M```"````\P``XGP```#`$@```@```/X``.H0````*!(```(```$)``"[A```
+M`%P2```"```!%``!>Q````!H$@```@```1\``3DP````"!(```(```$J``%9
+MX````#`2```"```!-0`!I90```$T$@```@```4````H<````=!(```(```%+
+M``$^H````/`2```"```!5@``TS`````($@```@```6$``?C0````R!(```(`
+M``%L``#`J`````@2```"```!=P``ZC@````L$@```@```8(``!4D```""!(`
+M``(```&=``!3G````:01```(```!J``!</P```#`$@```@```;,``+U(````
+MU!(```(```&^```$7````#`2```"```!R0`!_)````"0$@```@```=0`````
+M`````!````````'U``"#>````(P2```"```"```!='````%X$@```@```@L`
+M`7/H````B!(```(```(6``$KX````0`2```"```"(0``AY````!`$@```@``
+M`BP``-P,````B!(```(```(W``#C/````,P2```"```"0@`!+2P```!0$@``
+M`@```DT``-AT````-!(```(```)8``%R%````,`2```"```"8P``P-````"8
+M$@```@```FX``(($````?!(```(```)Y``"UK````%`2```"```"A``!:`@`
+M``"H$@```@```H\``.6<````8!(```(```*:``%QO````$02```"```"I0`!
+M<!P```"<$@```@```K```3S`````I!(```(```*[``&F\````$P2```"```"
+MQ@``>K`````($@```@```M$``7+4````S!(```(```+<``!L0```!]`2```"
+M```"YP``Y0P```!`$@```@```O(``6M,````F!(```(```+]```#O````*`2
+M```"```#"``!<+@```!$$@```@```Q,``=W4```!>!(```(```,>``%8!```
+M`&@2```"```#*0`!L?0```#X$@```@```S0``(:X````3!(```(```,_``#3
+MA````/`2```"```#2@``V<@```"T$@```@```U4``+0@````1!(```(```-@
+M``'FX````/02```"```#:P``HV````-D$@```@```W8``(QX````"!(```(`
+M``.!``'GU````%02```"```#C```MZ````/D$@```@```Y<```($```!K!(`
+M``(```.F``'&L```!&P2```"```#L0`!A9````%0$@```@```[P``.2D````
+M+!(```(```/'``'C=````E02```"```#T@`!>:````%P$@```@```]T``8<(
+M````+!(```(```/H```#L`````P2```"```#\P``WF`````H$@```@```_X`
+M`2U\```!+!(```(```0)``$LX````$P2```"```$%```_0@```!L$@```@``
+M!!\``'00````*!(```(```0J``"'!````(P2```"```$-0``!(P```*4$@``
+M`@``!$L``;!L````1!(```(```16``#!:````3@2```"```$80``B3````!$
+M$@```@``!&P``-!P````+!(```(```1W``&FR````"@2```"```$@@`!$CP`
+M``!$$@```@``!(T``6%P```%]!(```(```28``%<>````!`2```"```$HP``
+M>_0```#T$@```@``!*X``,X@````@!(```(```2Y``(`:````&@2```"```$
+MQ``!7L@```&L$@```@``!,\``.1H````"!(```(```3:``""R````+`2```"
+M```$Y0`!*[0````L$@```@``!/```4`0```(]!(```(```3[``'BB````.P2
+M```"```%!@`!;S@````($@```@``!1$``-A$````,!(```(```4<``&)D```
+M`+`2```"```%)P``M4P````($@```@``!3(``?74```!_!(```(```4]``#M
+MD````'02```"```%2```@+0```!T$@```@``!5,``7.@````2!(```(```5>
+M``%)!````)`2```"```%:0`!-K0````P$@```@``!70``?T@````<!(```(`
+M``5_```````````2```````%C```MP0```"<$@```@``!9<``)3@````=!(`
+M``(```6B``'XL````"`2```"```%K0`!_C@````0$@```@``!;@``6Q\```!
+M"!(```(```7#```'F````A02```"```%U``![!P```8D$@```@``!=\``(?0
+M````Q!(```(```7J``"^?````0@2```"```%]0``Y%@````($@```@``!@``
+M`6]L````+!(```(```8+``(1D````/02```"```&%@``D\@```"P$@```@``
+M!B$``5*`````V!(```(```8L``#3.````$P2```"```&-P``_Z@```(P$@``
+M`@``!D(``+1D````Z!(```(```9-``&]:```!YP2```"```&6``!BY0```!<
+M$@```@``!F,``8'X````/!(```(```9N``#N!````=02```"```&>0`!=E0`
+M``-,$@```@``!H0``."(````F!(```(```:/``#D>````"P2```"```&F@`!
+M>W@```.\$@```@``!J4``>B````"#!(```(```:P``(`T```"#P2```"```&
+MNP``Y4P```!0$@```@``!L8``,*P````&!(```(```;1``!YF````!`2```"
+M```&W```SJ````'0$@```@``!N<``6H8````>!(```(```;R``"-.````#@2
+M```"```&_0`";M@```#X$@```@``!P@``(QH````"!(```(```<3``%OQ```
+M`!`2```"```''@`!;A````!D$@```@``!RD``$MH```!I!$```@```<T``$W
+MF````+@2```"```'/P`"&!````"`$@```@``!TH``(J,````P!(```(```=5
+M``#J9````"P2```"```'8```E50```)0$@```@``!VL``:(P````+!(```(`
+M``=V``%GI````#`2```"```'@0`!:I````"\$@```@``!XP``?Y\```![!(`
+M``(```>7``"AE````"P2```"```'H@``D3@````L$@```@``!ZT``(38```!
+M(!(```(```>X``"4H````$`2```"```'PP`!:6@```"P$@```@``!\X``:J(
+M```$8!(```(```?9``'S4````H02```"```'Y```0_@```&D$0``"```!^\`
+M`'SH```":!(```(```?Z``!68````(@2```"```(!0``M6````!,$@```@``
+M"!```)1X````*!(```(```@;```````````0```````(.P``E[````BP$@``
+M`@``"$8`````````"1$```@```A6``&UN````+`2```"```(80``VGP```!D
+M$@```@``"&P``HX(````^!(```(```AW``%+?````'`2```"```(@@`!;`P`
+M``!P$@```@``"(T``(R`````"!(```(```B8``&Q.````+P2```"```(HP``
+MY&`````($@```@``"*X``.E,````,!(```(```BY``#4=````/02```"```(
+MQ``!;]0```!`$@```@``",\``````````!(```````C>``#;2````'P2```"
+M```(Z0``30P```&D$0``"```"/0``85<````,!(```(```C_``%4$````(`2
+M```"```)"@`!"!0```",$@```@``"14``*%H````+!(```(```D@``#A9```
+M`,`2```"```)*P`!7(@```'0$@```@``"38``%'X```!I!$```@```E!``%U
+MZ````"P2```"```)3```W<@```"8$@```@``"5<``8JX````W!(```(```EB
+M``(-*````M`2```"```);0``U6@```*D$@```@``"7@``))L````2!(```(`
+M``F#``#92````$`2```"```)C@`!#(@```&0$@```@``"9D``*K`````'!(`
+M``(```FD``&(V````+@2```"```)KP``4%0```&D$0``"```";H``-K@````
+M:!(```(```G%``#=#````+P2```"```)T```A?@```"8$@```@``"=L``?)L
+M````,!(```(```GF```````````2```````)]0`!.3@````@$@```@``"@``
+M`6?4````-!(```(```H+``!_A````#`2```"```*%@`!<@`````4$@```@``
+M"B$``.10````"!(```(```HL``%H\````'@2```"```*-P``0E0```&D$0``
+M"```"D(``.T\````*!(```(```I-``#0G````502```"```*6````:0```!@
+M$@```@``"F8``#U@```!I!$```@```IQ``#LC````+`2```"```*?```T?``
+M```0$@```@``"H<````,````)!$```@```J9``"$!````#P2```"```*I```
+MA-`````($@```@``"J\``5YP````6!(```(```JZ``"/W````*`2```"```*
+MQ0`"%(@```.$$@```@``"M```)!\````,!(```(```K;``#B:````!02```"
+M```*Y@`!A[0```!P$@```@``"O$``&0X```!#!(```(```K\``'R0````"P2
+M```"```+!P``Z]0```"X$@```@``"Q(``.0(````2!(```(```L=``&'8```
+M`%02```"```+*``!-N0````T$@```@``"S,``>@H````6!(```(```L^``#B
+M)````$02```"```+20`!Q00```%H$@```@``"U0``-(````!,!(```(```M?
+M``$Y6````)@2```"```+:@``0+````&D$0``"```"W4``)(@````3!(```(`
+M``N```'^2````#02```"```+BP``>*P```#L$@```@``"Y8``)"P````8!(`
+M``(```NA``$P,```!E@2```"```+K```C,@```!P$@```@``"[<``(IX````
+M%!(```(```O"``%4D````FP2```"```+S0`!Y<@```$0$@```@``"]@``.UD
+M````+!(```(```OC``!E1````&02```"```+[@`!63````"L$@```@``"_D`
+M`!.@````Q!(```(```P$```+Y````R02```"```,#P`!5Z````!D$@```@``
+M#!H``(M,````S!(```(```PE``"1$````"@2```"```,,``!VX0```"P$@``
+M`@``##L``(&<````:!(```(```Q&``'&;````$02```"```,40``4J````!,
+M$@```@``#%P```<@````>!(```(```QG``%HL````$`2```"```,<@``````
+M````$@``````#((``1*````!Q!(```(```R-``!X@````"P2```"```,F``!
+M]]````#@$@```@``#*,``(*`````2!(```(```RN``%@=````/P2```"```,
+MN0``W\0```#$$@```@``#,0``3A0````X!(```(```S/```````````0````
+M```,[P``"I````%4$@```@``#/H``'_P````?!(```(```T%``"`;````$`2
+M```"```-$```V8@```!`$@```@``#1L``'L$````\!(```(```TF``#<E```
+M`'@2```"```-,0`!2^P```8T$@```@``#3P``.30````+!(```(```U'``&+
+M\````GP2```"```-4@``C&`````($@```@``#5T``']0````-!(```(```UH
+M``"$R`````@2```"```-<P``````````$@``````#8$``-@0````-!(```(`
+M``V,```0M````0`2```"```-EP``C(@```!`$@```@``#:(``.MX````7!(`
+M``(```VM``#E_````#P2```"```-N```HE````$0$@```@``#<,``)*T````
+M7!(```(```W.``"$0````(@2```"```-V0`!9W`````T$@```@``#>0``8<T
+M````+!(```(```WO``&A2````.@2```"```-^@``V\0```!($@```@``#@4`
+M`5CH````2!(```(```X0``&V:```!P`2```"```.&P``AI`````H$@```@``
+M#B8``.F`````B!(```(```XQ``#>B````$P2```"```./```OX0```$D$@``
+M`@``#D<``-BP````F!(```(```Y2``#D<`````@2```"```.70``M?P```$(
+M$@```@``#F@``$G$```!I!$```@```YS``!_Z`````@2```"```.?@``V*@`
+M```($@```@``#HD``'8<````@!(```(```Z4``!YJ````0@2```"```.GP`!
+M6&P```!\$@```@``#JH``!1D````P!(```(```ZU``'\7````"P2```"```.
+MP``!<!0````($@```@``#LL``-]@````9!(```(```[6``':-````5`2```"
+M```.X0``Z*P```"@$@```@``#NP``._@```-`!(```(```[W``!((````:01
+M```(```/`@`!4DP````H$@```@``#PT``($H````=!(```(```\8```)K```
+M`'`2```"```/(P``?[0````T$@```@``#RX``?F8```"Q!(```(```\Y``'K
+M5````,@2```"```/1```D60````L$@```@``#T\``.$@````1!(```(```]:
+M``&&X````"@2```"```/90``D9````"0$@```@``#W```'4`````B!(```(`
+M``][``"*-````$02```"```/A@``R.P```!`$@```@``#Y$``!&T```![!(`
+M``(```^<``$[=`````@2```"```/IP``N^````"$$@```@``#[(``.KD````
+M3!(```(```^]``",<`````@2```"```/R``!+W````#`$@```@``#],``8A\
+M````7!(```(```_>``(MM````-P2```"```/Z0``C!@```!($@```@``#_0`
+M`&;H````2!(```(```__``!<&```""`2```"```0%0`!BD````!X$@```@``
+M$"```),0````N!(```(``!`K``&.<```$M@2```"```0-@`!6A````)H$@``
+M`@``$$$``3<8````@!(```(``!!,``#K,````$@2```"```05P``O&0```#D
+M$@```@``$&(``%((````F!(```(``!!M``#`L````"`2```"```0>```H<``
+M``"0$@```@``$(,``.J0````5!(```(``!".``#\X````"@2```"```0F0``
+M=8@```"4$@```@``$*0``,*@````"!(```(``!"O``"(E````)P2```"```0
+MN@`!)?P```!($@```@``$,4``82\````H!(```(``!#0``%N=````,02```"
+M```0VP``WM0```",$@```@``$.8``,-T```%>!(```(``!#Q``"O4```!#`2
+M```"```0_``!;Y@````L$@```@``$0<``3:(````+!(```(``!$2``)12```
+M`.02```"```1'0`!;80```",$@```@``$2@``5<`````F!(```(``!$S``&G
+M/````TP2```"```1/@`!\IP````T$@```@``$4D``````````!(``````!%;
+M``#,X````(@2```"```19@`!4U@```"X$@```@``$7$``````````!(`````
+M`!&"``"`K`````@2```"```1C0``Y/P````0$@```@``$9@``+X<````8!(`
+M``(``!&C``%KY````"@2```"```1K@`!TQ````&0$@```@``$;D``/UT```"
+M-!(```(``!'$``!5U````(P2```"```1W0`!\M````"`$@```@!Z>C`P-6(U
+M.#0V`'IZ,#`R9&(Q,6,`>GHP,F1B9C@W-0!Z>C`R9&)B,6(R`'IZ,#)D8C(P
+M-3,`>GHP,#)D8F$T,@!Z>C!F8F(Q93-F`'IZ,&(W.65A.30`>GHP-6(X8S8U
+M80!Z>C`P-6(T,&%D`'IZ,#5B.30R960`>GHP9#AD8S8R8P!Z>C`P,3EF-#<P
+M`'IZ,#)D9#DT,F0`>GHP,F1B93<S9`!Z>C`P-6(V.3)B`'IZ,&(V9#(S,C4`
+M>GHP,#5B.#4S9`!Z>C`P,39D.3)E`'IZ,&-F8C$X-S4`>GHP,#)D8C,Q8P!Z
+M>C`R9&%B8F%C`'IZ,#)D8F,X-3$`>GHP,#!B-F,V.`!Z>C`P,&(V8F8X`'IZ
+M,#!B-F-F-64`>GHP,39E,61F9`!Z>C!B-F8U,&(X`'IZ,#9E,&$T9F4`>GHP
+M,#8W9#)B,0!Z>C`P,F1B8S8Q`'IZ,&(V8V$S,C4`>GHP,#5B-F-F9`!Z>C`Q
+M-F4P9&9D`'IZ,#`P8C9F-C@`871H7VAA;%]P<F]C97-S7VYO:7-E9FQO;W(`
+M>GHP,#5B-#AA9`!Z>C`R9&)F,6(R`'IZ,#`U8C@X8V(`>GHP,S-E8SAB9@!Z
+M>C!D8C0R-6,U`&%T:%]H86Q?9&UA7V)E86-O;E]R97-P;VYS95]T:6UE`'IZ
+M,#!B-F8Q-C$`>GHP-F4P,&(X80!Z>C`R9&)F8S%D`'IZ,&1C-&4S.3``>GHP
+M9&%F960X-@!Z>C`P8C9E,C=A`'IZ,#)D8F)A8C(`>GHP8C9D,65F9@!Z>C`Q
+M-F0Y,&1D`'IZ,#)D8F4X-3$`>GHP,#5B-C1F9`!Z>C`P,&(V9#4R`'IZ,&(V
+M8SEE9F8`>GHP,39E,#!D9`!Z>C`R9&)D.#<U`'IZ,#)D8C,Q8C(`>GHP,&(W
+M,#DR,P!Z>C`P8C9D-#4P`'IZ,#`P8C9D,60`>GHP8C9C,C,R-0!Z>C`R9&)D
+M86(R`'IZ,#`P-6(V,S(`>GHP-F1E9&0Y,P!Z>C`P,39D834P`'IZ,#`P-C=D
+M,S(`>GHP,&(V9#DR,P!Z>C`P,F1B-3%C`'IZ,#$V9&-B9F4`>GHP,&(W,#$T
+M-0!Z>C`P,39D9C)C`'IZ,&(W9F%D,V4`>GHP,39D.3DR,`!Z>C`R9&(Q8F%C
+M`'IZ,&1C-F4S.3``>GHP-6(W,#%E,`!Z>C`P,&(V8C$P`'IZ,&(W,#EE9F8`
+M>GHP,39D9C@Y8@!A=&A?:&%L7V%T=&%C:`!Z>C`V93!F8S!D`'IZ,#$V9&%B
+M,F0`>GHP,F1B,3,U9`!Z>C!E,#0V.#1B`'IZ,#$V93(Y,60`>GHP,#!B-F9E
+M.`!Z>C`P8V9B,V4P`'IZ,#`Q-F0Y-#@`>GHP,39E,C`Y8@!Z>C!B-S`Q969F
+M`'IZ,#`P8C9C.60`>GHP,#`U8C5A,@!Z>C`R9&(Q-S!A`&%T:%]H86Q?8V]M
+M<'5T971X=&EM90!Z>C`R9&(U8F%C`'IZ,#`U8C@Q,V0`>GHP,&(V8SDR,P!Z
+M>C!B-F(U,&(X`'IZ,#`U8C=F.60`>GHP8C<P,60P,@!Z>C`V9&9F-#1A`'IZ
+M,#)D8C4W-C,`>GHP-F5E868V,`!Z>C!E,#`W8V$Q`'IZ,#`R9&%F-C(`>GHP
+M8C@S860S90!Z>C`P,&(V8CDP`'IZ,#$V9#EE9F$`>GHP,39D93`U,0!Z>C`P
+M,#5B-F(R`'IZ,#5B-V8Q,30`>GHP-&%E,#,Q9@!Z>C`R9&)D9&9D`'IZ,#`U
+M-#=F960`>GHP,&(V8F8U90!Z>C`P8C<Q-S=D`'IZ,#!B-S!F,V0`>GHP,39D
+M.#DR,`!Z>C`R9&(Q86(R`'IZ,#`P-6(V,C(`>GHP,#!B-F8W.`!Z>C!B-CEB
+M,#=C`&%T:%]H86Q?9G)E90!Z>C`U8C<Y8C%B`'IZ,#!B-S`W,V0`>GHP,F1B
+M96)B9`!Z>C!B-64S,34R`'IZ,#$V9&9B9C$`871H7VAA;%]M:'HR:65E90!Z
+M>C`Q-F4Q.#EB`'IZ,&1C,F$U8S4`>GHP,#)D8S8P8@!Z>C`V9&8P8CAA`'IZ
+M,#)D8C,S-60`>GHP8C9C-3-A-`!Z>C!F-31D,6(P`'IZ,&(V9F0S-C,`>GHP
+M9#ED8S8R8P!Z>C`U8C<T,64P`'IZ,#)D83EB86,`>GHP9&,R,60S80!Z>C`P
+M8C<Q-S-D`'IZ,#$V9#ED-#$`>GHP,#5B.#1F9`!Z>C`P-6(X86)D`'IZ,#!B
+M-S`Q,C,`>GHP,#5B-C4R8@!Z>C`R9&(S.#<U`'IZ,#$V93,P.6(`>GHP,#5B
+M-C!B,@!Z>C`R9&(Q.#<U`'IZ,#`R9&(X-#(`>GHP,F1B,3<V,P!Z>C!B-V1E
+M83DT`'IZ,#!B-S`Q-C$`>GHP,39D-V0T,0!Z>C`P,39C9#,R`'IZ,#9D93!B
+M.&$`>GHP-F0Y9&0Y,P!Z>C!D8C-E9#@V`'IZ,#`U8C0X960`>GHP,#)D8S@P
+M8@!Z>C`P,F1B8S0R`'IZ,#)D8F$X-3$`>GHP,F1B,S-E9`!Z>C`P-6(X,&9D
+M`'IZ,#`U8C=F,F4`>GHP,F1B9F1F9`!Z>C`Q-F4V-#AA`'IZ,#`R9&%F9C(`
+M>GHP,#5B-S<Y9`!Z>C`P,&(V964X`'IZ,#$V930T.&$`>GHP,&(V9C9B8P!Z
+M>C`Q-F1A.3(P`'IZ,#5B-S@Q93``>GHP,#)D8V$P8@!Z>C`P-6(T-&%D`'IZ
+M,#9D9&8T-&$`>GHP9F%C,&,Y8@!Z>C!B-F8Y969F`'IZ,#!B-F,V8F,`871H
+M7VAA;%]A9&1I=&EO;F%L7W-W8F%?8F%C:V]F9@!Z>C`P,#)D8CDR`&%T:%]H
+M86Q?=F5R<VEO;@!Z>C`R9&)A8S)E`'IZ,#)D8C<Y864`>GHP,#$V934S,@!Z
+M>C!B-F-F,#`Y`'IZ,#`Q-F4Q,F,`>GHP,#$V9#EE-`!Z>C`P,#)D865A`'IZ
+M,#`U8C5C8C(`>GHP,39D83(U,0!Z>C`V9C9A9C8P`'IZ,#9D9F1D.3,`871H
+M7VAA;%]M86QL;V,`>GHP,#!B-F1D,@!Z>C`R9&0Y,F%D`'IZ,#$V9&(R-3$`
+M>GHP93$P-V-A,0!Z>C`P8C9C-S5E`'IZ,#$V9&0P-3$`>GHP,F1B9#%B,@!Z
+M>C`R9&,Q-S8S`'IZ,&(V.3!D-F0`>GHP,39D9C`U,0!Z>C`P,39D.34P`'IZ
+M,#!B-S`V8F,`>GHP,#$V9#@W,@!Z>C`V9&5F-#1A`'IZ,#5B.&,R960`>GHP
+M-F9B.30W8@!Z>C!E8F(Q93-F`'IZ,&(V9CED,#(`>GHP9#$T9#%B,`!Z>C!B
+M-#@P,S%E`'IZ,#$V9&)B9F4`>GHP,39E-30X80!Z>C`P,39D.#4P`'IZ,#`P
+M8C9F9C@`871H7VAA;%]M96UC<'D`>GHP,F1B8V)B9`!Z>C`Q-F1A,&1D`'IZ
+M,#)D8F)D9F0`>GHP,F1B,C@U,0!Z>C`R9&)D8S%D`'IZ,#9D8C!C9C(`>GHP
+M,39E8CEA9`!Z>C`P8C9C96)C`'IZ,&0Y-#@T83$`871H7VAA;%]P<F]B90!Z
+M>C`Q-F5A.6%D`'IZ,&9D-&0Q8C``>GHP,F1B,S<V,P!A=&A?:&%L7V)U:6QD
+M;W!T<P!Z>C`R9&%F,S5D`'IZ,#9D9&1D.3,`>GHP9&%D8S8R8P!Z>C`Q-F1F
+M,C4Q`'IZ,#`P8C9C,3``>GHP,39D.3(U,0!Z>C`R9&(P.#4Q`'IZ,&(W,C%A
+M960`>GHP-C=C9F-A90!Z>C`P,&(V8V8X`'IZ,&,Y-&0Q8C``>GHP,F1A9F%B
+M,@!Z>C`U8CDR865D`'IZ,#`U8CAC8V(`>GHP8C9D.65F9@!Z>C`R9&(Q,6(R
+M`'IZ,#)D8F9F8C$`>GHP,F1B9C<V,P!Z>C`P-6(V.&9D`'IZ,#`U8C0T960`
+M>GHP8C<Q,6%E9`!Z>C!B-64S,38P`'IZ,&0X-#@T83$`>GHP,39D.&(R9`!Z
+M>C`Q-F4P.#EB`'IZ,#)D8F(X-S4`>GHP,F1A93@U,0!Z>C!B.#%E83DT`'IZ
+M,#$V9&5C,68`>GHP,&(V9F5B8P!Z>C!E.#DT.3`W`'IZ,#!B-F5A-V$`>GHP
+M,S-E.&9B9@!Z>C!C9F$U.#<U`'IZ,#)D8CDY864`>GHP,F1B.6%B,@!Z>C`P
+M,&(V8F4X`'IZ,&1E-C@S-V8`>GHP,39D86)F90!Z>C!B-S`Y9#`R`'IZ,#8W
+M9#(U93(`>GHP,3EF,V$P,0!Z>C`W,#,Y-#=B`&%T:%]H86Q?;65M>F5R;P!Z
+M>C`V9&9F8S!D`'IZ,&(V-S4P8C@`>GHP,39E,F1F9`!Z>C`P,&(V9#(R`'IZ
+M,#9F96%F-C``>GHP9&,T835C-0!Z>C`P8C<P9C=D`&%T:%]H86Q?<W=?8F5A
+M8V]N7W)E<W!O;G-E7W1I;64`>GHP.68V-&(V80!Z>C`P-6(V-3=A`'IZ,#9F
+M,SDT-V(`>GHP-F1A,&-F,@!Z>C!B-V)A9#-E`'IZ,#!B-F8Y-C$`>GHP8C8Y
+M-S-B8P!Z>C`R9&)D,S5D`'IZ,#`U8C@X9F0`>GHP,F1B8F,Q9`!Z>C`R9&%F
+M9&9D`'IZ,#9D-V1D.3,`871H7VAA;%]D96QA>0!Z>C`R9&(Q9&9D`'IZ,#8W
+M9#)F-#$`>GHP,F1A9C@W-0!Z>C!B-V5D939D`'IZ,#$V9#AD-#$`>GHP,#)D
+M864Y,@!Z>C!B-V%D939D`'IZ,#)D8F(S-60`>GHP,F1B,V1F9`!Z>C`R9&(U
+M,V5D`'IZ,#$V9&-E864`>GHP,#!B-F1A,@!Z>C`P,&(V93(R`'IZ,#5B.#`P
+M-#$`>GHP,#$V9#@T.`!Z>C`Q-F0Y8C)D`'IZ,#`Q-F4P,F,`>GHP,&(W,#<W
+M9`!Z>C`P-6(V.3=A`'IZ,#`Q-F1A930`>GHP,39E,3`Y8@!Z>C`P-6(T83)D
+M`'IZ,#$V9&4P9&0`>GHP,39D9C!D9`!Z>C!D9C`W8V$Q`'IZ,#)D8F0W-C,`
+M>GHP,#!B-F4U,@!Z>C`V-V0P8S0W`'IZ,#5B-F,V9&(`>GHP8S,Q-65B-0!Z
+M>C!D8C%E9#@V`'IZ,#9D-#`V93``>GHP,39E,#(U,0!Z>C`P,#)D8F(R`'IZ
+M,#`R9&0X-F0`>GHP,#$V93$T9`!Z>C`R9&(U.6%E`'IZ,#`V-V0R,C$`>GHP
+M,39D.#!D9`!Z>C`P-6(X.3-D`'IZ,#5B.#%B,6(`>GHP,F1B,3-E9`!Z>C`P
+M8C9D,3(S`'IZ,#`P8C9C93@`>GHP-6(X86%E9`!Z>C!B-F5D,S8S`'IZ,#)D
+M868Q8C(`>GHP,#`U8C5E,@!Z>C`S,V5B9F)F`'IZ,#5B-C@V9&(`>GHP,#!B
+M-F5F.`!Z>C!B-S$Y865D`'IZ,#`U8C4X8C(`>GHP-6(W9&(Q8@!Z>C!B.#)D
+M939D`'IZ,#`Q-F0W,S(`>GHP,F1A9&%B,@!Z>C!F-#5E-F4S`&%T:%]H86Q?
+M:6YI=%]C:&%N;F5L<P!Z>C`P8C9D-F)C`'IZ,&,Q-&0Q8C``>GHP,#`R9&)D
+M,@!Z>C!D830X-&$Q`'IZ,#$V93!B.#<`>GHP-6(Y,#)E9`!Z>C!D8S)E,SDP
+M`'IZ,&$V,&0Q-#4`>GHP,F1B86)B9`!Z>C`P,&(V8S%D`'IZ,#5B.&5A960`
+M>GHP,#5B-V(Y9`!Z>C`P-6(U-#0V`'IZ,#5B-C0V9&(`>GHP,&(V9CDR,P!Z
+M>C!D9#8X,S=F`'IZ,#$V93$R-3$`>GHP9&,V835C-0!Z>C`R9&(S-S!A`'IZ
+M,#`P-6(V-S(`>GHP-F1E9F,P9`!Z>C`R9&)F,S5D`'IZ,#`P8C9C-S@`>GHP
+M,#$V9#@S,@!Z>C`R9&(U-S!A`'IZ,#`U8C9D-V$`>GHP,#)D8C(Y,@!Z>C`P
+M-6(Y,&-B`&%T:%]H86Q?<F5G7W=R:71E`'IZ,&(V9C4S-C,`>GHP,#5B-6,T
+M-@!A=&A?:&%L7W)E9U]R96%D`'IZ,#9D.3!C9C(`>GHP-F0X9&0Y,P!Z>C`Q
+M-F1F8C@W`'IZ,#`Q-F1A-#@`>GHP8C8V,S%A.`!Z>C`P,F1B,#DR`&%T:%]H
+M86Q?9V5T=VER96QE<W-M;V1E<P!Z>C`Q-F4Q8C@W``````@```(%````$```
+M`@8```",```"!0```)0```(&````R````@4```#0```"!@```/@```(%```!
+M`````@8```%$```"!0```4P```(&```!5````@4```%<```"!@```6@```(%
+M````N````@4```%P```"!@```70```(%````3````@4```%\```"!@```8``
+M``(%````?````@4```&(```"!@```8P```(%```!(````@4````T```"!0``
+M`90```(&```!V````04```'<```!!@```O```'8%```"]```=@8```,(``&$
+M!0```CP``80%```##``!A`8```,@``!'!0```R0``$<&```#]``!D`4```/X
+M``&0!@```_P``34%```$```!-08```?@``"\!0``!^0``+P&```(L```O`4`
+M``BT``"\!@``"<@``1X%```)S``!'@8```G8```"!0``"=P```(&```)\```
+M`@4```GT```"!@``"C@``1X%```*/``!'@8```I(```"!0``"DP```(&```*
+M8````@4```ID```"!@``"P@``&8%```+#```9@8```OP```"!0``"_0```(&
+M```0#``!D`4``!`0``&0!@``$-0```$%```1+````08``!1\``#]!0``%(``
+M`/T&```4I``!'@4``!2H``$>!@``%,P```(%```4T````@8``!5T```"!0``
+M%7@```(&```5F``!'@4``!6<``$>!@``%T0```(%```73````@8``!=0```"
+M!0``%U0```(&```;#````04``!L0```!!@``&[```,T%```;M```S08``"$X
+M```!!0``(6@```$&```BD``!(`4``"'```$@!0``(I0``2`&```EX````04`
+M`"7D```!!@``)A0```$%```F&````08``":4``"#!0``)I@``(,&```H!```
+M`04``"@(```!!@``*!````$%```H%````08``"C@```!!0``*$@```$%```H
+MY````08``#,D``#-!0``,R@``,T&```S5``!(`4``#-8``$@!@``,X````$%
+M```SA````08``#.T```!!0``,[@```$&```SR````04``#/,```!!@``-"0`
+M`2`%```T*``!(`8``#14```!!0``-%@```$&```TB````04``#2,```!!@``
+M-)P```$%```TH````08``#3X``$@!0``-/P``2`&```U*````04``#4L```!
+M!@``-5P```$%```U8````08``#5P```!!0``-70```$&```UF```@P4``#6<
+M``"#!@``-B````$%```V)````08``#98```!!0``-EP```$&```W*````04`
+M`#<L```!!@``.N@```$%```Z[````08``#M<```!!0``.V````$&``!`\```
+M`04``$#T```!!@``0/@```$%``!`_````08``$(D```"!0``0B@```(&``!"
+M.````@4``$(\```"!@``1"P```$%``!$,````08``%(<```!!0``4B````$&
+M``!2-````04``%(X```!!@``4DP```$%``!24````08``%)D```!!0``4F@`
+M``$&``!2?````04``%*````!!@``4LP```$%``!2T````08``%.0```!!0``
+M4Y0```$&``!3M````P4``%.X```#!@``4_0```,%``!3^````P8``%10```!
+M!0``5%0```$&``!4H````P4``%2D```#!@``59P```$%``!5H````08``%7P
+M```!!0``5?0```$&``!6"````04``%8,```!!@``5B@```$%``!6+````08`
+M`%9L```!!0``5G````$&``!6\````P4``%;T```#!@``5SP```$%``!70```
+M`08``%=<```!!0``5V````$&``!7>````P4``%=\```#!@``5^0```,%``!7
+MZ````P8``%?L``#F!0``5_```.8&``!83````P4``%A4```#!@``6.P```$%
+M``!8\````08``%E,```!!0``60@```$%``!9#````08``%DD```!!0``62@`
+M``$&``!96````P4``%E<```#!@``6=P```,%``!9X````P8``%GD```#!0``
+M6>@```,&``!:A````04``%J(```!!@``7'@```$%``!<?````08``%R0```!
+M!0``7)0```$&``!<L````04``%RT```!!@``7-0```$%``!<K````04``%S8
+M```!!@``7.0```$%``!<Z````08``%T$```!!0``70@```$&``!=)````04`
+M`%TH```!!@``7:````$%``!=J````08``%X,```"!0``7A````(&``!>%```
+M`@4``&+4```"!0``7A@```(&``!>U````P4``%[H```#!@``7P0```,%``!?
+M"````P8``%\H```#!0``7RP```,&``!>Q````P4``%](```#!@``7V0```,%
+M``!?;````P8``%Z<```#!0``7W@```,&``!?C````04``%^0```!!@``7ZP`
+M``$%``!?L````08``%_@```!!0``7^0```$&``!@_``!(`4``&$```$@!@``
+M8M@```(%``!BW````@8``&+X```!!0``8P````$&``!C$````04``&,8```!
+M!@``9@@``/T%``!E4```_04``&54``#]!@``9=@```$%``!EW````08``&9T
+M``#]!0``9G@``/T&``!F\```_04``&;T``#]!@``:,0```$%``!HR````08`
+M`&F4```!!0``:5P```$%``!I1````04``&D$```!!0``:.````$%``!I9```
+M`08``&EL```!!0``:70```$&``!II````04``&FH```!!@``:@0```,%``!J
+M#````P8``&H0```#!0``:A0```,&``!J&````P4``&H<```#!@``:B````$%
+M``!J)````08``&KP```#!0``:O@```,&``!J_````P4``&L````#!@``:P0`
+M``,%``!K"````P8``&L,```!!0``:Q````$&``!KO````04``&O````!!@``
+M:_0```$%``!K^````08``&P,```!!0``;!````$&``!L@```S04``&R$``#-
+M!@``;*```.8%``!LI```Y@8``&RL```"!0``;+````(&``!M```!.P4``&T$
+M``$[!@``;20``9`%``!M*``!D`8``&YD``&-!0``;50``8T%``!M6``!C08`
+M`&UP``&-!0``;70``8T&``!MF``!D`4``&V<``&0!@``;:@``"\%``!MK```
+M+P8``&W4``&-!0``;=@``8T&``!M[``!*@4``&WP``$J!@``;AP``2H%``!N
+M(``!*@8``&Y(``$J!0``;DP``2H&``!NE``!*@4``&Z8``$J!@``;N```2H%
+M``!NY``!*@8``&^X``![!0``;[P``'L&``!RY````04``'+H```!!@``<P``
+M`2H%``!S!``!*@8``'-\``&-!0``<X```8T&``!SJ``!C04``'.L``&-!@``
+M<\0``(,%``!SR```@P8``'08``"#!0``=!P``(,&``!W/``!C04``'4<``&-
+M!0``=2```8T&``!UH```,04``'6D```Q!@``=;@``2@%``!UO``!*`8``'7\
+M``%C!0``=@```6,&``!V,``!C04``'8T``&-!@``=D0``9`%``!V2``!D`8`
+M`';,``&0!0``=M```9`&``!V[``!C04``';P``&-!@``=T```9`%``!W1``!
+MD`8``'=<``&-!0``=V```8T&``!W=``!C04``'=X``&-!@``=XP``9`%``!W
+MD``!D`8``'?4``&-!0``=]@``8T&``!X1``!C04``'A(``&-!@``>(@``9`%
+M``!XC``!D`8``'C,``&0!0``>-```9`&``!Z$``!C04``'G<``&-!0``>>``
+M`8T&``!Z7``!C04``'ID``&-!@``>M0``9`%``!ZV``!D`8``'LP``&-!0``
+M>S0``8T&``!\H``!C04``'RD``&-!@``?HP``8T%``!^D``!C08``'\(``!O
+M!0``?PP``&\&``!_7```Y@4``']@``#F!@``?XP``.8%``!_D```Y@8``'^\
+M``#F!0``?\```.8&``!_R````@4``'_,```"!@``@`P``9`%``"`$``!D`8`
+M`(`<``!*!0``@"```$H&``"`0``!D`4``(!$``&0!@``@.0``20%``"`Z``!
+M)`8``(#X``!T!0``@/P``'0&``"!0``!D`4``(%$``&0!@``@6P``8T%``"!
+M<``!C08``(&T``&0!0``@;@``9`&``"!U``!C04``('8``&-!@``@B0``9`%
+M``""*``!D`8``(),``&-!0``@E```8T&``""G``!D`4``(*@``&0!@``@N@`
+M`9`%``""[``!D`8``(,P``&-!0``@S0``8T&``"#3``!3P4``(-0``%/!@``
+M@Y```9`%``"#E``!D`8``(/<``&-!0``@^```8T&``"$#``!D`4``(00``&0
+M!@``A%@``9`%``"$7``!D`8``(2<``&-!0``A*```8T&``"$]```Y@4``(3X
+M``#F!@``A3@``8T%``"%/``!C08``(6```&0!0``A80``9`&``"%L``!D`8`
+M`(7(``&-!0``A<P``8T&``"&&``!D`4``(8<``&0!@``AI@``9`%``"&G``!
+MD`8``(;(``&0!0``ALP``9`&``"&W``!C04``(;@``&-!@``AR```9`%``"'
+M)``!D`8``(=```&0!0``ATP``9`&``"'H``!D`4``(>D``&0!@``A^P``9`%
+M``"'\``!D`8``(B\```E!0``B,```"4&``"(Z``!6P4``(CL``%;!@``B/@`
+M`8T%``"(_``!C08``(E```&0!0``B40``9`&``")4```)04``(E4```E!@``
+MB9@``"4%``")G```)08``(G$``&0!0``B<@``9`&``")V``!6P4``(G<``%;
+M!@``B?@``8T%``")_``!C08``(I$``&0!0``BD@``9`&``"*5```)04``(I8
+M```E!@``BJP``9`%``"*L``!D`8``(K$``&-!0``BL@``8T&``"*\``!D`4`
+M`(KT``&0!@``BP@``8T%``"+#``!C08``(MP```E!0``BW0``"4&``"+G``!
+MD`4``(N@``&0!@``B[```5L%``"+M``!6P8``(O<``&-!0``B^```8T&``",
+M*``!D`4``(PL``&0!@``C#P``"4%``",0```)08``(RH``$6!0``C*P``18&
+M``",]``!C04``(SX``&-!@``C1@``!L%``"-'```&P8``(U0``$W!0``C50`
+M`3<&``"-D``!D`4``(V4``&0!@``C:0``8T%``"-J``!C08``(XL``&0!0``
+MCC```9`&``".1``!C04``(Y(``&-!@``CEP``34%``".8``!-08``(YP``&0
+M!0``CG0``9`&``".?``!-04``(Z```$U!@``CHP``8T%``".E``!C08``([L
+M``&0!0``CO```9`&``"/"``!C04``(\,``&-!@``CVP``9`%``"/<``!D`8`
+M`(^```&-!0``CX0``8T&``"0"````04``)`@```!!@``D#0```$%``"0.```
+M`08``)!,```!!0``D%````$&``"0A``!D`4``)"(``&0!@``D-@``!$%``"0
+MX```$08``)#D``#Q!0``D.@``/$&``"0[``!*04``)#P``$I!@``D1@``9`%
+M``"1'``!D`8``)%$``&-!0``D4@``8T&``"1;``!C04``)%P``&-!@``D:P`
+M`8T%``"1L``!C08``)'$``&0!0``D<@``9`&``"1S``!-04``)'0``$U!@``
+MDC```9`%``"2-``!D`8``))$``&-!0``DD@``8T&``"2?``!D`4``)*```&0
+M!@``DHP``8T%``"2D``!C08``)+4``&-!0``DM@``8T&``"3/``!D`4``)-`
+M``&0!@``DUP``8T%``"38``!C08``)-\``&0!@``DY@``8T%``"3G``!C08`
+M`)/T``&0!0``D_@``9`&``"4$``!C04``)04``&-!@``E#```9`&``"42``!
+MC04``)1,``&-!@``E(```9`%``"4A``!D`8``)3```&-!0``E,0``8T&``"5
+MK``!D`4``)6P``&0!@``E?```9`%``"5]``!D`8``)@$``#]!0``F`@``/T&
+M``"F*``!D`4``)D@``&0!0``F#P``9`%``"81``!D`8``)A0``&0!0``F%0`
+M`9`&``"8:``!.P4``)AL``$[!@``H,@``8T%``">4``!C04``)BT``&-!0``
+MF+@``8T&``"8[````04``)CP```!!@``F80``9`%``"9*``!D`8``)DL``&-
+M!0``F3```8T&``"97``!C04``)E@``&-!@``F7```8T%``"9=``!C08``)E8
+M``&0!0``F9P``9`&``"9H``!C04``)FD``&-!@``F<@``9`%``"9S``!D`8`
+M`)G<``&-!0``F>```8T&``";8```M@4``)MD``"V!@``G$@```(%``"<3```
+M`@8``)Q0```"!0``G%0```(&``"<6``!C04``)Q<``&-!@``G+```84%``"<
+MM``!A08``)S,``&0!0``G-```9`&``"<^``!C04``)S\``&-!@``GB@```$%
+M``">+````08``)Z$``&-!0``GH@``8T&``">G``!-04``)Z@``$U!@``GJP`
+M`9`%``">L``!D`8``)[0``!*!0``GM0``$H&``">[```E`4``)[P``"4!@``
+MGR```%<%``"?)```5P8``)]0``!^!0``GU0``'X&``"?8``!D`4``)]D``&0
+M!@``GWP``8T%``"?@``!C08``)^@``%_!0``GZ0``7\&``"?O```"P4``)_`
+M```+!@``G]@``1@%``"?W``!&`8``)_X``&-!0``G_P``8T&``"@@``!D`4`
+M`*"$``&0!@``H0P``8T%``"A$``!C08``**<``&-!0``H3P``8T&``"A<```
+M`04``*%T```!!@``H9P```$%``"AH````08``*'4``#X!0``H=@``/@&``"A
+M\````04``*'T```!!@``H@@``34%``"B#``!-08``*(8```!!0``HAP```$&
+M``"B:```^`4``*)L``#X!@``HJ0``8T%``"BJ``!C08``**X```!!0``HKP`
+M``$&``"BV``!-04``*+<``$U!@``HN@```$%``"B[````08``*,(``$U!0``
+MHPP``34&``"C&```^`4``*,<``#X!@``HS@```$%``"C/````08``*.4``#]
+M!0``HY@``/T&``"CK``!D`4``*.P``&0!@``H\```8T%``"CQ``!C08``*0`
+M``$U!0``I`0``34&``"D.````04``*0\```!!@``I%0``34%``"D6``!-08`
+M`*1D``&0!0``I&@``9`&``"D@``!C04``*2$``&-!@``I:@``$H%``"EK```
+M2@8``*7T``"4!0``I?@``)0&``"F1``!D`4``*9(``&0!@``IEP``8T%``"F
+M8``!C08``*;X``&-!0``IOP``8T&``"G$``!-04``*<4``$U!@``IS0``$H%
+M``"G.```2@8``*RH```!!0``K*P```$&``"M(````@4``*TD```"!@``K6``
+M``$%``"M9````08``*U\```!!0``K8````$&``"MR````04``*W,```!!@``
+MK>0```$%``"MZ````08``*XP```!!0``KC0```$&``"N3````04``*Y0```!
+M!@``KI@```$%``"NG````08``*ZT```!!0``KK@```$&``"O=```Y@4``*]X
+M``#F!@``KX````(%``"OA````@8``*^4```"!0``KY@```(&``"OI````04`
+M`*^H```!!@``K_@``"\%``"O_```+P8``+`P```O!0``L#0``"\&``"RD```
+M+P4``+*4```O!@``LPP``8T%``"S$``!C08``+-$``&-!0``LT@``8T&``"S
+MP```+P4``+/$```O!@``L]@``8T%``"SW``!C08``+0H``&0!0``M"P``9`&
+M``"TB``!D`4``+2,``&0!@``M)@``8T%``"TG``!C08``+2P``!*!0``M+0`
+M`$H&``"TU``!-04``+38``$U!@``M-P``%(%``"TX```4@8``+6,``%F!0``
+MM9```68&``"UV``!%04``+7<``$5!@``MH0``2`%``"VB``!(`8``+;(``"]
+M!0``MLP``+T&``"X(``!C04``+@D``&-!@``N*```9`%``"XI``!D`8``+ZT
+M``&-!0``N.@``8T&``"Y;``!D`4``+EP``&0!@``N?0``8T%``"Y^``!C08`
+M`+NT``&0!0``N[@``9`&``"\(``!C04``+PD``&-!@``O#@``8T%``"\/``!
+MC08``+Q\``"A!0``O(```*$&``"\F``!3P4``+R<``%/!@``O*P``9`%``"\
+ML``!D`8``+SH``%/!0``O.P``4\&``"]!``!C04``+T(``&-!@``O1@``4\%
+M``"]'``!3P8``+UX``&-!0``O:```8T&``"]O``!C04``+W```&-!@``O>P`
+M`8T%``"]\``!C08``+Y,``&0!0``OE```9`&``"^U``!C08``+[L``&0!0``
+MOO```9`&``"^]``!-04``+[\``$U!@``ORP``8T%``"_,``!C08``+],``!*
+M!0``OU```$H&``#"Z``!C04``,+L``&-!@``PP```8T%``##!``!C08``,,H
+M``&0!0``PRP``9`&``##2```+P4``,-,```O!@``P[```,T%``##M```S08`
+M`,/0``#F!0``P]0``.8&``##W````@4``,/@```"!@``Q"P``98%``#$,``!
+ME@8``,14``&-!0``Q%@``8T&``#%(``!-04``,1\``$U!0``Q(```34&``#$
+MC``!D`4``,20``&0!@``Q,0``9`%``#$R``!D`8``,3<```!!0``Q.````$&
+M``#%!``!C04``,4(``&-!@``Q20``8T&``#%.``!-04``,4\``$U!@``Q4@`
+M``$%``#%3````08``,5L``%(!0``Q7```4@&``#%K``!D`4``,6P``&0!@``
+MQ=0``4@%``#%V``!2`8``,8(``%(!0``Q@P``4@&``#&F````@4``,:<```"
+M!@``QP```7@%``#'!``!>`8``,<\``&-!0``QT```8T&``#'5``!-04``,=8
+M``$U!@``QV0```$%``#':````08``,>T``%(!0``Q[@``4@&``#'Y```T@4`
+M`,?H``#2!@``Q_````$%``#']````08``,@```&`!0``R`0``8`&``#('``!
+M2`4``,@@``%(!@``R*0``64%``#(J``!908``,C\``$=!0``R0```1T&``#)
+M#```@P4``,D0``"#!@``R<@``9`%``#)S``!D`8``,GT``&-!0``R?@``8T&
+M``#*"``!D`4``,H,``&0!@``RCP``8T%``#*0``!C08``,I$``&0!0``RD@`
+M`9`&``#*L``!C04``,JT``&-!@``RM```34%``#*U``!-08``,NP``#=!0``
+MR[0``-T&``#,>``!2`4``,Q\``%(!@``SS0``8T%``#,_``!C04``,T```&-
+M!@``S;@``#$%``#-B```,04``,V\```Q!@``S=```2@%``#-U``!*`8``,X`
+M``&.!0``S@0``8X&``#.-``!C04``,XX``&-!@``SD@``9`%``#.3``!D`8`
+M`,[0``&0!0``SM0``9`&``#.Y``!C04``,[H``&-!@``SS@``9`%``#//``!
+MD`8``,]4``&-!0``SU@``8T&``#/;``!C04``,]P``&-!@``SX0``9`%``#/
+MB``!D`8``,_,``&-!0``S]```8T&``#0%``!D`4``-`8``&0!@``T'@``9`%
+M``#0?``!D`8``-"T``&0!0``T+@``9`&``#1?``!D`4``-&$``&0!@``TC0`
+M`8T%``#2.``!C08``-)(``&0!0``TDP``9`&``#2X``!C04``-+D``&-!@``
+MTU0``9`%``#36``!D`8``-.P``&-!0``T[0``8T&``#5(``!C04``-4D``&-
+M!@``UT@``8T%``#73``!C08``-?$``#+!0``U\@``,L&``#8'```Y@4``-@@
+M``#F!@``V$P``.8%``#84```Y@8``-A\``#F!0``V(```.8&``#8B````@4`
+M`-B,```"!@``V-```8T%``#8U``!C08``-CT``!*!0``V/@``$H&``#9&``!
+MD`4``-D<``&0!@``V?@``.(%``#9_```X@8``-H(``&0!0``V@P``9`&``#:
+M'``!C04``-H@``&-!@``VC0``4$%``#:.``!008``-I,```W!0``VE```#<&
+M``#:E``!D`4``-J8``&0!@``VK```8T%``#:M``!C08``-KX``&0!0``VOP`
+M`9`&``#;&``!C04``-L<``&-!@``VV@``9`%``#;;``!D`8``-N0``&-!0``
+MVY0``8T&``#;X``!D`4``-OD``&0!@``W"0``9`%``#<*``!D`8``-Q0``&-
+M!0``W%0``8T&``#<;``!!@4``-QP``$&!@``W*P``9`%``#<L``!D`8``-S(
+M```"!0``W,P```(&``#<X``!C04``-SD``&-!@``W2@``.8%``#=+```Y@8`
+M`-UL``&-!0``W7```8T&``#=Z``!D`4``-WL``&0!@``WF@``9`%``#>;``!
+MD`8``-Z8``&0!0``WIP``9`&``#>K``!C04``-ZP``&-!@``WO```9`%``#>
+M]``!D`8``-\0``&0!0``WQP``9`&``#?<``!D`4``-]T``&0!@``W^```9`%
+M``#?Y``!D`8``."P```E!0``X+0``"4&``#@V``!6P4``.#<``%;!@``X.@`
+M`8T%``#@[``!C08``.$P``&0!0``X30``9`&``#A0```)04``.%$```E!@``
+MX8@``"4%``#AC```)08``.&T``&0!0``X;@``9`&``#AR``!6P4``.',``%;
+M!@``X>@``8T%``#A[``!C08``.(T``&0!0``XC@``9`&``#B1```)04``.)(
+M```E!@``XIP``9`%``#BH``!D`8``.*T``&-!0``XK@``8T&``#BX``!D`4`
+M`.+D``&0!@``XO@``8T%``#B_``!C08``.-@```E!0``XV0``"4&``#CC``!
+MD`4``..0``&0!@``XZ```5L%``#CI``!6P8``./,``&-!0``X]```8T&``#D
+M&``!D`4``.0<``&0!@``Y"P``"4%``#D,```)08``.2```&0!0``Y(0``9`&
+M``#DK``!D`4``.2P``&0!@``Y-P``8T%``#DX``!C08``.4L``#>!0``Y3``
+M`-X&``#E?``!%@4``.6```$6!@``Y;@``8T%``#EO``!C08``.7<```;!0``
+MY>```!L&``#F%``!-P4``.88``$W!@``YFP``9`%``#F<``!D`8``.:$``&-
+M!0``YH@``8T&``#FG``!-04``.:@``$U!@``YK```9`%``#FM``!D`8``.:\
+M``$U!0``YL```34&``#FS``!C04``.;4``&-!@``YRP``9`%``#G,``!D`8`
+M`.=(``&-!0``YTP``8T&``#GK``!D`4``.>P``&0!@``Y\```8T%``#GQ``!
+MC08``.@\``&0!0``Z$```9`&``#H4``!C04``.A4``&-!@``Z-@```$%``#H
+M\````08``.D$```!!0``Z0@```$&``#I'````04``.D@```!!@``Z50``9`%
+M``#I6``!D`8``.G$``"Z!0``Z<P``+H&``#IT``!"`4``.G8``$(!@``Z=P`
+M`.T%``#IX```[08``.GD``$I!0``Z>@``2D&``#J&``!D`4``.H<``&0!@``
+MZD0``8T%``#J2``!C08``.IL``&-!0``ZG```8T&``#JH``!C04``.JD``&-
+M!@``ZK0``$H%``#JN```2@8``.KT``&0!0``ZO@``9`&``#K"``!C04``.L,
+M``&-!@``ZT```9`%``#K1``!D`8``.M0``&-!0``ZU0``8T&``#KF``!C04`
+M`.N<``&-!@``[````9`%``#L!``!D`8``.P@``&-!0``["0``8T&``#L0``!
+MD`8``.Q<``&-!0``[&```8T&``#LN``!D`4``.R\``&0!@``[-0``8T%``#L
+MV``!C08``.ST``&0!@``[0P``8T%``#M$``!C08``.U$``&0!0``[4@``9`&
+M``#M<``!C04``.UT``&-!@``[E0``9`%``#N6``!D`8``/#,``#]!0``\*P`
+M`/T%``#PT```_08``1&```&0!0`!$60``9`%``#Q.``!D`4``/$\``&0!@``
+M\8@``9`%``#QC``!D`8``/'L``&0!0``\?```9`&``#R"``!D`4``/(0``&0
+M!@``\F@``98%``#R;``!E@8``/,4``&-!0``\Q@``8T&``#Y(``!C04``/,T
+M``&-!@`!`YP``"\%``#SI```+P8``/.,```O!0``\[@``"\&``#SV````P4`
+M`/.````#!0``\]P```,&``#T/````P4``/1````#!@``]$0``8T%``#T2``!
+MC08``/2(```!!0``\U@```$%``#TC````08``/2@```"!0``]*0```(&``#T
+MJ``!C04``/2L``&-!@``]/@```(%``#T_````@8``/4```&-!0``]00``8T&
+M``#U2````@4``/5,```"!@``]5```8T%``#U5``!C08``/6X``&0!0``];P`
+M`9`&``#UW``!C04``/7@``&-!@``]CP``8T%``#V0``!C08``/:4``&-!0``
+M]I@``8T&``#V]``!C04``/;X``&-!@``]S0```$%``#W.````08``/=(``&0
+M!0``]TP``9`&``#X7``!(04``/@L``$A!0``^&```2$&``#XG``!D`4``/B@
+M``&0!@``^,P``8T%``#XT``!C08``/CD```!!0``^(@```$%``#XZ````08`
+M`/CX```!!0``^/P```$&``#Y-``!C04``/DX``&-!@``^4P``8T%``#Y4``!
+MC08``/ED``&0!0``^6@``9`&``#YR``!-04``/G,``$U!@``^=@``9`%``#Y
+MW``!D`8``/GL``&-!0``^?```8T&``#Z!```2@4``/H(``!*!@``^B```!T%
+M``#Z)```'08``/IH``&-!0``^FP``8T&``#ZE``!C04``/J8``&-!@``^KP`
+M`0T%``#ZQ``!#08``/KD``&-!0``^N@``8T&``#['``!D`4``/L@``&0!@``
+M^\@``%$%``#[S```408``/O8``&0!0``^]P``9`&``#[]``!C04``/OX``&-
+M!@``_!@``)H%``#\'```F@8``/PT``#4!0``_#@``-0&``#\4```.`4``/Q4
+M```X!@``_'```8T%``#\=``!C08``/WP```!!0``_<P```$%``#\Z````04`
+M`/SL```!!@``_1@``58%``#]'``!5@8``/TT```!!0``_3@```$&``#]4``!
+M-04``/U4``$U!@``_8P``58%``#]D``!5@8``/ZT```!!0``_=0```$&``#^
+M6````04``/WX```!!@``_@````$%``#^"````08``/X,``&-!0``_A```8T&
+M``#^1``!-04``/Y(``$U!@``_EP``8T%``#^8``!C08``/Z0``$U!0``_I0`
+M`34&``#^P``!C04``/[$``&-!@``_N```8T&``#_```!C04``/\$``&-!@``
+M_Q@``34%``#_'``!-08``/\X```!!0``_SP```$&``#_5``!-04``/]8``$U
+M!@``_V0``58%``#_:``!5@8``/^$```!!0``_X@```$&``#_X```_04``/_D
+M``#]!@`!``@``9`%``$`#``!D`8``0#,``&-!0`!`-```8T&``$`Y````04`
+M`0#H```!!@`!`20``!T%``$!*```'08``0%```$U!0`!`40``34&``$!8```
+M`04``0$\```!!0`!`8@```$&``$""``!D`4``0(,``&0!@`!`AP``8T%``$"
+M(``!C08``0(T``$U!0`!`C@``34&``$"6```2@4``0)<``!*!@`!`Q```(D%
+M``$#%```B08``0-,```"!0`!`U````(&``$#6```+P4``0-<```O!@`!`Z@`
+M`"\%``$#K```+P8``0/4```O!0`!`]@``"\&``$$#``!C04``000``&-!@`!
+M!'```9`%``$$=``!D`8``038``&0!0`!!-P``9`&``$%```!C04``04$``&-
+M!@`!!4P``9`%``$%4``!D`8``054``$U!0`!!5P``34&``$%H````04``06D
+M```!!@`!!G````$%``$&=````08``0:(``&0!0`!!HP``9`&``$&G````04`
+M`0:@```!!@`!!S```6\%``$'-``!;P8``0=$```!!0`!!T@```$&``$'9```
+M`@4``0=H```"!@`!!VP```$%``$'<````08``0?$``&0!0`!!\@``9`&``$'
+MV``!C04``0?<``&-!@`!"!0```(%``$('````@8``0@P```"!0`!"#0```(&
+M``$(7````@4``0A@```"!@`!"?````,%``$)]````P8``0K4```O!0`!"M@`
+M`"\&``$*Z````P4``0KL```#!@`!#`0``8T%``$,"``!C08``0W8``&-!0`!
+M#=P``8T&``$.D``!D`4``0Z4``&0!@`!#KP``8T%``$.P``!C08``0[X``&0
+M!0`!#OP``9`&``$/#``!C04``0\0``&-!@`!#R@``9`%``$/+``!D`8``0]@
+M``&-!0`!#V0``8T&``$/>```W@4``0]\``#>!@`!#[```9`%``$/M``!D`8`
+M`0_H``&-!0`!#^P``8T&``$1S``!D`4``1'0``&0!@`!$?```8T%``$1]``!
+MC08``1)<``&-!0`!$F```8T&``$39````04``1-H```!!@`!$WP``!0%``$3
+M@```%`8``10(```!!0`!%`P```$&``$4A``!(`4``12(``$@!@`!%(P```0%
+M``$4D```!`8``12<```$!0`!%*````0&``$4K```!`4``12P```$!@`!%.@`
+M``0%``$4[```!`8``144```!!0`!%1@```$&``$5'```!`4``14@```$!@`!
+M%6@```0%``$5;```!`8``16,```$!0`!%9````0&``$6$```!`4``184```$
+M!@`!%B0```0%``$6*```!`8``1;````$!0`!%L0```0&``$7!```!`4``1<(
+M```$!@`!%RP```0%``$7,```!`8``1<T```!!0`!%S@```$&``$7/```!`4`
+M`1=````$!@`!%Z0```0%``$7J```!`8``1B@```$!0`!&*0```0&``$8W```
+M!`4``1C@```$!@`!&.0``8T%``$8Z``!C08``1H<``$3!0`!&@@``1,%``$:
+M(``!$P8``1JX```!!0`!&KP```$&``$;P````04``1O$```!!@`!'(````(%
+M``$<A````@8``1V4```!!0`!'9@```$&``$>(```!`4``1XD```$!@`!'E0`
+M``(%``$>6````@8``1Z````$!0`!'H0```0&``$>L```!`4``1ZT```$!@`!
+M'N@```0%``$>[```!`8``1]L``&-!0`!'W```8T&``$?A```!`4``1^(```$
+M!@`!'_```&P%``$?]```;`8``1_\```$!0`!(`````0&``$@$```!`4``2`4
+M```$!@`!((P```$%``$@D````08``2#$```!!0`!(,@```$&``$@Y````04`
+M`2#H```!!@`!(1P```$%``$A(````08``2%L```!!0`!(7````$&``$EW```
+M`04``27@```!!@`!)?P```(%``$F`````@8``2;T``&-!0`!)O@``8T&``$G
+M7``!D`4``2=@``&0!@`!)X@```$%``$GC````08``2>@```!!0`!)Z0```$&
+M``$GN````04``2>\```!!@`!)]````$%``$GU````08``2AL```"!0`!*'``
+M``(&``$HS````@4``2C0```"!@`!*-0```(%``$HV````@8``2E<```"!0`!
+M*6````(&``$IH````@4``2FD```"!@`!*<0```(%``$IS````@8``2G0```"
+M!0`!*=0```(&``$IV````@8``2K<``&0!0`!*N```9`&``$K5``!C04``2M8
+M``&-!@`!*X0``8T%``$KB``!C08``2N\```!!0`!*\````$&``$K^```\P4`
+M`2O\``#S!@`!+!0``08%``$L&``!!@8``2PH``&0!0`!+"P``9`&``$L;``!
+M!@4``2QP``$&!@`!.````8T%``$LF``!C04``2R<``&-!@`!++```08%``$L
+MM``!!@8``2T,``%F!0`!+1```68&``$M6``!%04``2U<``$5!@`!+B```2`%
+M``$N)``!(`8``2YL``!B!0`!+G```&(&``$NX``!C04``2[D``&-!@`!+R``
+M`9`%``$O)``!D`8``3`,```!!0`!,!````$&``$Q-``!C04``3$X``&-!@`!
+M,=P``8T%``$QX``!C08``3'T``&0!0`!,?@``9`&``$R)``!C04``3(H``&-
+M!@`!,E@``8T%``$R7``!C08``3*0``&-!0`!,I0``8T&``$RO``!D`4``3+`
+M``&0!@`!,O@``9`%``$R_``!D`8``3,0``&-!0`!,Q0``8T&``$S0``!D`4`
+M`3-$``&0!@`!,U0``8T%``$S6``!C08``3.4``&0!0`!,Y@``9`&``$SJ``!
+MC04``3.L``&-!@`!,]P``8T%``$SX``!C08``30```&0!0`!-`0``9`&``$T
+M%``!C04``308``&-!@`!-"P``2@%``$T-``!*`8``30P```Q!0`!-#@``#$&
+M``$T4```OP4``314``"_!@`!-)0``8T%``$TF``!C08``33$``&0!0`!-,@`
+M`9`&``$TW``!C04``33@``&-!@`!-D@```$%``$V3````08``3:4``&0!0`!
+M-I@``9`&``$VP``!C04``3;$``&-!@`!-O0``8T%``$V^``!C08``3<\``&0
+M!0`!-T```9`&``$WP``!C04``3?$``&-!@`!-]@``74%``$WW``!=08``3?@
+M``$U!0`!-^@``34&``$X%``!C04``3@8``&-!@`!09P``8T%``$[Y``!C04`
+M`3OH``&-!@`!/-@``8T%``$\W``!C08``3SP``&-!0`!//0``8T&``$]&``!
+MD`4``3T<``&0!@`!/3@``"\%``$]/```+P8``3Y<``"R!0`!/F```+(&``$^
+MU```Y@4``3[8``#F!@`!/MP```(%``$^X````@8``3]8```"!0`!/UP```(&
+M``$_G````@4``3^@```"!@`!/Z0```(%``$_J````@8``3^L```"!0`!/[``
+M``(&``%`2```S04``4!,``#-!@`!0'@``"8%``%`?```)@8``4"4``&!!0`!
+M0)@``8$&``%`L``!D`4``4"T``&0!@`!0-@```$%``%`W````08``4#T``&+
+M!0`!0/@``8L&``%!#``!D`4``4$<``&0!@`!05P```$%``%!8````08``4%L
+M```:!0`!05@``!H%``%!1```&@4``4%P```:!@`!0:```9`%``%!I``!D`8`
+M`4&T``&-!0`!0;@``8T&``%!S``!C04``4'0``&-!@`!0>0``$,%``%!Z```
+M0P8``4;8``&*!0`!1`0``8H%``%#9``!B@4``4-0``&*!0`!0S0``8H%``%#
+M:``!B@8``4.P``&0!0`!0[0``9`&``%$%``!B@4``408``&*!@`!1$```8H%
+M``%$1``!B@8``41\``&*!0`!1(```8H&``%$O``!B@4``43```&*!@`!150`
+M``(%``%%6````@8``45@```"!0`!160```(&``%%T``!>`4``474``%X!@`!
+M1G```8T%``%&=``!C08``4:(``$U!0`!1HP``34&``%&F```0P4``4:<``!#
+M!@`!1N@``8H%``%&[``!B@8``4<8``$O!0`!1QP``2\&``%'9```Q`4``4=(
+M``#$!0`!1SP``,0%``%';```Q`8``4>0``"E!0`!1Y@``*4&``%'N``!B`4`
+M`4>\``&(!@`!1[0``6T%``%'U``!;08``4?X``$:!0`!1_P``1H&``%(%``!
+MB@4``4@8``&*!@`!2(0```$%``%(E````08``4BT``"`!0`!2+@``(`&``%)
+M$```<04``4D4``!Q!@`!23@``$0%``%)/```1`8``4E(``&!!0`!24P``8$&
+M``%)8``!'04``4ED``$=!@`!270``(,%``%)>```@P8``4HP``&0!0`!2C0`
+M`9`&``%*7``!C04``4I@``&-!@`!2G```9`%``%*=``!D`8``4JD``&-!0`!
+M2J@``8T&``%*K``!D`4``4JP``&0!@`!2Q@``8T%``%+'``!C08``4LX``$U
+M!0`!2SP``34&``%2*```JP4``5(L``"K!@`!4E@``8P%``%27``!C`8``5)4
+M```!!0`!4F@```$&``%5+``!C04``5*<``&-!0`!4J```8T&``%2\```JP4`
+M`5+T``"K!@`!4R@``8T%``%3+``!C08``5.H```Q!0`!4W@``#$%``%3K```
+M,08``5/```$H!0`!4\0``2@&``%3\```D04``5/T``"1!@`!5"0``8T%``%4
+M*``!C08``50X``&0!0`!5#P``9`&``%4R``!D`4``53,``&0!@`!5-P``8T%
+M``%4X``!C08``54P``&0!0`!530``9`&``%53``!C04``550``&-!@`!560`
+M`8T%``%5:``!C08``55\``&0!0`!58```9`&``%5Q``!C04``57(``&-!@`!
+M5H@``8T%``%6C``!C08``5<@``&-!0`!5R0``8T&``%71```2@4``5=(``!*
+M!@`!5V@``9`%``%7;``!D`8``5>X``&0!0`!5[P``9`&``%7U``!C04``5?8
+M``&-!@`!6!P``9`%``%8(``!D`8``5@\``&-!0`!6$```8T&``%8C``!D`4`
+M`5B0``&0!@`!6+0``8T%``%8N``!C08``5D$``&0!0`!60@``9`&``%94``!
+MD`4``5E4``&0!@`!690``8T%``%9F``!C08``5FP``#5!0`!6;0``-4&``%:
+MM``!D`4``5GH``&0!0`!6>P``9`&``%:1``!D`4``5I(``&0!@`!6KP``9`%
+M``%:P``!D`8``5LT``&0!0`!6T@``9`&``%;\``!D`4``5OX``&0!@`!7,``
+M`8T%``%<Q``!C08``5S4``&0!0`!7-@``9`&``%=U``!C04``5W8``&-!@`!
+M7>@``9`%``%=[``!D`8``5Z8``&0!0`!7IP``9`&``%?'``!D`4``5\@``&0
+M!@`!7S```8T%``%?-``!C08``6$H``&-!0`!82P``8T&``%A^````@4``6'\
+M```"!@`!9!P``8T%``%D(``!C08``628``$E!0`!9)P``24&``%EN``!C04`
+M`66\``&-!@`!9IP``8T%``%FH``!C08``6<8``$E!0`!9QP``24&``%G?```
+MY@4``6>```#F!@`!9ZP``.8%``%GL```Y@8``6?@``#F!0`!9^0``.8&``%H
+M'```Y@4``6@@``#F!@`!:&```8T%``%H9``!C08``6FH``&0!0`!::P``9`&
+M``%IO``!C04``6G```&-!@`!:C```9`%``%J-``!D`8``6I,```"!0`!:E``
+M``(&``%J9``!C04``6IH``&-!@`!:JP``.8%``%JL```Y@8``6KP``&-!0`!
+M:O0``8T&``%K;``!D`4``6MP``&0!@`!:^P``9`%``%K\``!D`8``6PD``&0
+M!0`!;"@``9`&``%L/``!C04``6Q```&-!@`!;00``9`%``%M"``!D`8``6TL
+M``&-!0`!;30``8T&``%M6``!C04``6U<``&-!@`!;:```9`%``%MI``!D`8`
+M`6W```&0!0`!;<P``9`&``%N(``!D`4``6XD``&0!@`!;I```9`%``%NE``!
+MD`8``6](``&0!0`!;TP``9`&``%O=``!D`4``6]X``&0!@`!;Z0``8T%``%O
+MJ``!C08``6_T```.!0`!;_@```X&``%P1```)04``7!(```E!@`!<'```5L%
+M``%P=``!6P8``7"```&-!0`!<(0``8T&``%PR``!D`4``7#,``&0!@`!<-@`
+M`"4%``%PW```)08``7$@```E!0`!<20``"4&``%Q3``!D`4``7%0``&0!@`!
+M<6```5L%``%Q9``!6P8``7&```&-!0`!<80``8T&``%QS``!D`4``7'0``&0
+M!@`!<=P``"4%``%QX```)08``7(T``&0!0`!<C@``9`&``%R3``!C04``7)0
+M``&-!@`!<G@``9`%``%R?``!D`8``7*0``&-!0`!<I0``8T&``%R^```)04`
+M`7+\```E!@`!<R0``9`%``%S*``!D`8``7,X``%;!0`!<SP``5L&``%S9``!
+MC04``7-H``&-!@`!<[```9`%``%SM``!D`8``7/$```E!0`!<\@``"4&``%T
+M(``!C04``70D``&-!@`!=+P``5L%``%TP``!6P8``764``&-!0`!=9@``8T&
+M``%U\```)`4``77T```D!@`!=F@``!8%``%V;```%@8``79\``&-!0`!=H``
+M`8T&``%VM``!C04``7:X``&-!@`!=L@``9`%``%VS``!D`8``7=0``&-!0`!
+M=VP``8T&``%W<``!C04``7=T``&-!@`!=[@``9`%``%WO``!D`8``7?@``&-
+M!@`!>"0``9`%``%X*``!D`8``7A@``&0!0`!>&0``9`&``%X?``!C04``7B`
+M``&-!@`!>20``8T%``%Y*``!C08``7DX``&0!0`!>3P``9`&``%Y=``!C04`
+M`7EX``&-!@`!>;0``!8%``%YN```%@8``7G(``&0!0`!><P``9`&``%YY``!
+MC04``7GH``&-!@`!>F```8T%``%Z9``!C08``7KD``&-!0`!>N@``8T&``%[
+M$````@4``7L8```"!@`!>RP```(%``%[,````@8``7M8```"!0`!>UP```(&
+M``%[I````@4``7NH```"!@`!?/0``9`%``%\^``!D`8``7YH``"'!0`!?H``
+M`(<&``%^J````@4``7ZL```"!@`!?PP``18%``%_$``!%@8``7]@```"!0`!
+M?V0```(&``%_^``!C04``7_\``&-!@`!@!@``9`%``&`'``!D`8``8!$``&-
+M!0`!@$@``8T&``&`9``!C04``8!H``&-!@`!@2```8T%``&!)``!C08``8%,
+M```"!0`!@5````(&``&!7```G@4``8%@``">!@`!@=```!L%``&!U```&P8`
+M`8(0``$W!0`!@A0``3<&``&";``!D`4``8)P``&0!@`!@H0``8T%``&"B``!
+MC08``8*<``$U!0`!@J```34&``&"L``!D`4``8*T``&0!@`!@KP``34%``&"
+MP``!-08``8+,``&-!0`!@M0``8T&``&#+``!D`4``8,P``&0!@`!@T@``8T%
+M``&#3``!C08``8.L``&0!0`!@[```9`&``&#P``!C04``8/$``&-!@`!A$0`
+M`9`%``&$2``!D`8``818``&-!0`!A%P``8T&``&$Z````04``84````!!@`!
+MA10```$%``&%&````08``84L```!!0`!A3````$&``&%9``!D`4``85H``&0
+M!@`!AB0``"P%``&&*```+`8``890``#6!0`!AE@``-8&``&&>```X04``8:`
+M``#A!@`!AH0``*D%``&&C```J08``8:0``%+!0`!AI@``4L&``&&G```SP4`
+M`8:D``#/!@`!AJ@``!4%``&&L```%08``8:T``%8!0`!AK@``5@&``&&O``!
+M*04``89T``$I!0`!AL```2D&``&&Z``!D`4``8;L``&0!@`!AQ0``8T%``&'
+M&``!C08``8<\``&-!0`!AT```8T&``&'<``!C04``8=T``&-!@`!AX0``$H%
+M``&'B```2@8``8?$``&0!0`!A\@``9`&``&'V``!C04``8?<``&-!@`!A_``
+M`#`%``&']```,`8``8@```#:!0`!B`0``-H&``&(-``!D`4``8@X``&0!@`!
+MB$0``8T%``&(2``!C08``8A<``""!0`!B&```((&``&(G``!C04``8B@``&-
+M!@`!B00``9`%``&)"``!D`8``8DD``&-!0`!B2@``8T&``&)1``!D`8``8E@
+M``&-!0`!B60``8T&``&)O``!D`4``8G```&0!@`!B=@``8T%``&)W``!C08`
+M`8GX``&0!@`!BA```8T%``&*%``!C08``8I8``&0!0`!BEP``9`&``&*U``!
+MC04``8K8``&-!@`!BP@``8T%``&+#``!C08``8LD``&0!0`!BR@``9`&``&+
+M4``!D`8``8MD``&-!0`!BV@``8T&``&,2``!D`4``8Q,``&0!@`!C=P``(\%
+M``&-X```CP8``8]0``&!!0`!CS```8$%``&/5``!@08``8]P``#]!0`!CW0`
+M`/T&``&O0``!D`4``:\L``&0!0`!K%P``9`%``&:Y``!D`4``9FP``&0!0`!
+ME.@``9`%``&0O``!D`4``9"D``&0!0`!D(```9`%``&0<``!D`4``9!<``&0
+M!0`!C]@``9`%``&/W``!D`8``:TL``#(!0`!C_```,@%``&/]```R`8``9`$
+M``#:!0`!D`@``-H&``&\L``!D`4``9"0``&0!@`!D,````P%``&0Q```#`8`
+M`9#<``&0!0`!D.```9`&``&1```!D`4``9$$``&0!@`!D5P``%T%``&18```
+M708``9%P``!,!0`!D70``$P&``&1@``!BP4``9&$``&+!@`!G:0``8T%``&=
+MF``!C04``92D``&-!0`!DH```8T%``&2A``!C08``9*<```"!0`!DJ````(&
+M``&2I``!C04``9*H``&-!@`!DJP``34%``&2L``!-08``9,8```"!0`!DQP`
+M``(&``&3(``!C04``9,D``&-!@`!DR@``34%``&3+``!-08``9/D``$1!0`!
+MD^@``1$&``&4"``!C04``90,``&-!@`!E,P``8T%``&4T``!C08``>34``&-
+M!0`!E.P``8T&``&5```!D`4``94$``&0!@`!E1@``8T%``&5'``!C08``95X
+M``&-!0`!E7P``8T&``&5D``!C04``964``&-!@`!E?P``9`%``&6```!D`8`
+M`984``&-!0`!EA@``8T&``&6+```604``978``!9!0`!E<0``%D%``&6,```
+M608``99L``%`!0`!EG```4`&``&7%```E04``9<8``"5!@`!I&```04%``&7
+M*``!!04``9;\``$%!0`!ERP``04&``&7/``!0P4``9=```%#!@`!EV0``8T%
+M``&7:``!C08``9>L``&-!0`!E[```8T&``&8!```)`4``9@(```D!@`!F'@`
+M`9`%``&8?``!D`8``9E0``"O!0`!F50``*\&``&9;```,P4``9EP```S!@`!
+MF80``%P%``&9B```7`8``9G,``&0!0`!F>0``9`&``&:```!C04``9H$``&-
+M!@`!FA@``9`%``&:'``!D`8``9I\``&-!0`!FH```8T&``&:T``!-04``9K4
+M``$U!@`!HP@``34%``&:Z``!-08``9KT``&0!0`!FO@``9`&``&;#``!C04`
+M`9L0``&-!@`!FR@``9`%``&;+``!D`8``9LP``$U!0`!FS@``34&``&;;``!
+MC04``9MP``&-!@`!FX0``9`%``&;B``!D`8``9P<``!.!0`!G"```$X&``&<
+M-``!C04``9PX``&-!@`!G'0``(H%``&<>```B@8``9R\``&-!0`!G,P``8T&
+M``&<X``!D`4``9SD``&0!@`!G10``+<%``&=&```MP8``9TD``!*!0`!G2@`
+M`$H&``&=0```F04``9U$``"9!@`!G50``9`%``&=6``!D`8``9UP``&-!0`!
+MG70``8T&``&=O``!C04``9W```&-!@`!G>@``8T%``&=[``!C08``<UD``$3
+M!0`!GB```1,&``&>$``!$P4``9XL``$3!@`!GY@``8T%``&?G``!C08``9_4
+M``!"!0`!G]@``$(&``&?\```+04``9_T```M!@`!H`P``$8%``&@$```1@8`
+M`:`H``&-!0`!H"P``8T&``&@P```204``:#$``!)!@`!H.```5D%``&@Y``!
+M608``:%L``&0!0`!H7```9`&``&AD``!C04``:&4``&-!@`!H;P``9`%``&A
+MP``!D`8``:'4``&-!0`!H=@``8T&``&[O``!D`4``:'T``&0!@`!H@0``8T%
+M``&B"``!C08``:*,``#]!0`!HI```/T&``&BI``!F`4``:*L``&8!@`!HN0`
+M`8T%``&BZ``!C08``:,```&0!0`!HP0``9`&``&:R``!-04``:,0``$U!@`!
+MHTP``*\%``&C4```KP8``:-D``&0!0`!HV@``9`&``&CQ``!-04``:/(``$U
+M!@`!H]0``%D%``&CV```608``:/T``&-!0`!H_@``8T&``&D>```E04``:1\
+M``"5!@`!I(P``04%``&DD``!!08``:2@``&0!0`!I*0``9`&``&DM``!C04`
+M`:2X``&-!@`!I30``$D%``&E.```208``:54``%9!0`!I5@``5D&``&EK``!
+MD`4``:6P``&0!@`!I@P``8T%``&F$``!C08``:8D``&0!0`!IB@``9`&``&I
+MK``!C04``:98``&-!@`!IFP``9`%``&F<``!D`8``::<``&-!0`!IJ```8T&
+M``&FT````04``:;4```!!@`!IP```8$%``&G!``!@08``:<<```!!0`!IR``
+M``$&``&G9````04``:=H```!!@`!IWP``8$%``&G@``!@08``:>8```!!0`!
+MIYP```$&``&IA``!D`4``:F(``&0!@`!J;P``8T%``&IP``!C08``:GX``$U
+M!0`!J?P``34&``&EX``!C04``:H4``&-!@`!JB@``34%``&J+``!-08``:HX
+M``&-!0`!JCP``8T&``&JQ```_04``:K(``#]!@`!JQ```9`%``&K%``!D`8`
+M`:L\``&0!0`!JT```9`&``&K1``!C04``:M(``&-!@`!K&0``9`%``&L:``!
+MD`8``:R(``&-!0`!K(P``8T&``&M/``!D`4``:U```&0!@`!K5```8T%``&M
+M5``!C08``:V0``#(!0`!K90``,@&``&MM``!D`4``:VX``&0!@`!K<@``8T%
+M``&MS``!C08``:YT```!!0`!KEP```$%``&N>````08``:],``&0!0`!KU``
+M`9`&``&O8``!C04``:]D``&-!@`!KW@``34%``&O?``!-08``:^<``!*!0`!
+MKZ```$H&``&P'``!@04``;`@``&!!@`!L#@``9`%``&P/``!D`8``;!T``&0
+M!0`!L'@``9`&``&Q5``!D`4``;%8``&0!@`!L7```&<%``&Q=```9P8``;&$
+M```!!0`!L8@```$&``&R)``!C04``;(H``&-!@`!LD@``9`%``&R3``!D`8`
+M`;*4``&-!0`!LI@``8T&``&SC```+P4``;.0```O!@`!M0@``9`%``&U#``!
+MD`8``;4@``&-!0`!M20``8T&``&[-``!D`4``;5```&0!@`!M5```8T%``&U
+M5``!C08``;5L``&-!0`!M7```8T&``&[&``!D`4``;>4``&0!@`!MZ@``9`%
+M``&WK``!D`8``;?<``&-!0`!M^```8T&``&X"``!D`4``;@,``&0!@`!N$``
+M`8T%``&X1``!C08``;A8```.!0`!N%P```X&``&Y>``!D`4``;E\``&0!@`!
+MN9P``8T%``&YH``!C08``;M```#"!0`!NT0``,(&``&[;``!D`4``;MP``&0
+M!@`!NY```8T%``&[E``!C08``;?X``&0!0`!N]0``9`&``&WC``!D`4``;P$
+M``&0!@`!O"0``8T%``&\*``!C08``;R\``&0!0`!O,```9`&``&\\``!C04`
+M`;ST``&-!@`!O1P``8T%``&](``!C08``;[$``&0!0`!OL@``9`&``&^^``!
+MC04``;[\``&-!@`!PP@``9`%``'##``!D`8``<,L``&-!0`!PS```8T&``'%
+MV``!D`4``<7<``&0!@`!Q?P``8T%``'&```!C08``<:(``!9!0`!QHP``%D&
+M``'&V``!(`4``<;<``$@!@`!QS@```(%``''/````@8``<=X```!!0`!QWP`
+M``$&``')`````04``<D$```!!@`!R1@``8T%``')'``!C08``<F\``&-!0`!
+MR<```8T&``'*Y``!C04``<KH``&-!@`!RZ0``!0%``'+J```%`8``<P@```!
+M!0`!S"0```$&``',\````04``<ST```!!@`!S70``1,&``'-@``!$P8``<V\
+M```!!0`!S<````$&``'-Y````04``<WH```!!@`!T-0```$%``'0V````08`
+M`=.8```"!0`!TYP```(&``'3U````04``=/8```!!@`!U,0``.8%``'4R```
+MY@8``=;T``%5!0`!UO@``54&``'8^``!504``=C\``%5!@`!V:````$%``'9
+MI````08``=ND```"!0`!VZ@```(&``';[````@4``=OP```"!@`!W'````$%
+M``'<=````08``=S(```!!0`!W,P```$&``'=J``!C04``=VL``&-!@`!WA``
+M`9`%``'>%``!D`8``=Z8```!!0`!WIP```$&``'>T````04``=[4```!!@`!
+MWN@```$%``'>[````08``=\````!!0`!WP0```$&``'?G````@4``=^D```"
+M!@`!WZ@```(%``'?K````@8``>&\```!!0`!X<````$&``'BJ```+P4``>*L
+M```O!@`!X[@``%H%``'CO```6@8``>/8``!:!0`!X]P``%H&``'D!```6@4`
+M`>0(``!:!@`!Y"@``&8%``'D+```9@8``>0T``&-!0`!Y#@``8T&``'DK```
+M6@4``>2P``!:!@`!Y1```&8%``'E'```9@8``9VX``&-!0`!Y3```8T&``'E
+M[``!D`4``>7P``&0!@`!YDP``8T%``'F4``!C08``>:$``&0!0`!YH@``9`&
+M``'G$```U04``><4``#5!@`!YR0``9`%``'G*``!D`8``?0\``&-!0`!]"@`
+M`8T%``'S[``!C04``>>```&-!0`!YX0``8T&``'GF```U04``>><``#5!@`!
+MZ`@``68%``'H#``!9@8``>A<``$5!0`!Z&```14&``'I]``!(`4``>GX``$@
+M!@`!ZDP``%8%``'J4```5@8``>K$``&-!0`!ZL@``8T&``'K!``!D`4``>L(
+M``&0!@`!Z_@```$%``'K_````08``>TP``&-!0`![30``8T&``'M\``!C04`
+M`>WT``&-!@`![BP``8T%``'N,``!C08``>^8``$H!0`![Z```2@&``'OG```
+M,04``>^D```Q!@`![[P``+\%``'OP```OP8``>_8``&-!0`![]P``8T&``'P
+M&``!C04``?`<``&-!@`!\(```9`%``'PA``!D`8``?'X```!!0`!\?P```$&
+M``'R3``!D`4``?)0``&0!@`!\G@``8T%``'R?``!C08``?*L``&-!0`!\K``
+M`8T&``'R]``!D`4``?+X``&0!@`!\X0``8T%``'SB``!C08``?.<``&8!0`!
+M\Z```9@&``'U*``!-04``?.L``$U!@`!\]0``9@%``'SV``!F`8``?1$``&0
+M!0`!]$@``9`&``'T3``!C04``?10``&-!@`!]+@``9`%``'TO``!D`8``?30
+M``&-!0`!]-0``8T&``'TZ``!-04``?3L``$U!@`!]2```9@%``'U)``!F`8`
+M`?.D``$U!0`!]3```34&``'U3``!D`4``?5<``&0!@`!]70``8T%``'U>``!
+MC08``?6,``&-!0`!]9```8T&``'\I``!@@4``?RH``&"!@`!_+0``8T%``'\
+MN``!C08``?TT``&-!0`!_3@``8T&``']2``!@@4``?U,``&"!@`!_E@``8(%
+M``'^7``!@@8``?ZP``$@!0`!_K0``2`&``'_Y``!C04``?_H``&-!@`"``P`
+M`#`%``(`$```,`8``@"(``""!0`"`(P``((&``(`E``!C04``@"8``&-!@`"
+M`10```(%``(!&````@8``@%$``&0!0`"`4@``9`&``(!@``!C04``@&$``&-
+M!@`"`P0``9`%``(#"``!D`8``@-(``&-!0`"`TP``8T&``($R``!D`4``@3,
+M``&0!@`"!-P``8T%``($X``!C08``@54``&0!0`"!5@``9`&``(%B``!C04`
+M`@6,``&-!@`"!@@``9`%``(&#``!D`8``@9(``&-!0`"!DP``8T&``(&M```
+M`@4``@:X```"!@`"!KP```(&``('+``!D`4``@<P``&0!@`"!V```8T%``('
+M9``!C08``@?D``!Q!0`"!^@``'$&``(']``!<04``@?X``%Q!@`""`@``-D%
+M``((#```V08``@A$``%Q!0`""$@``7$&``((6```V04``@A<``#9!@`""&P`
+M`8T%``((<``!C08``@B4```P!0`"")@``#`&``((K``!<08``@BX``#9!0`"
+M"+P``-D&``()C``!C04``@F0``&-!@`""=0``8(%``()V``!@@8``@I8``">
+M!0`""EP``)X&``(*B```G@4``@J,``">!@`""O0``)X%``(*^```G@8``@M`
+M``">!0`""T0``)X&``(+:```G@4``@ML``">!@`"#*```1X%``(+B``!'@8`
+M`@NP``">!0`""[0``)X&``(+U```G@4``@O8``">!@`"#$P``)X%``(,4```
+MG@8``@RT``">!0`"#+@``)X&``(+,``!'@4``@S4``$>!@`"#/P``)X%``(-
+M````G@8``@U(```!!0`"#4P```$&``(-T```G@4``@W4``">!@`"#B0``7$%
+M``(.*``!<08``@XT``#9!0`"#C@``-D&``(7&````04``A;,```!!0`"$5``
+M``$%``(.2````04``@Y,```!!@`"#GP``)X%``(.@```G@8``@[@``">!@`"
+M#T```7$%``(/1``!<08``@]4``#9!0`"#U@``-D&``(/:````04``@]L```!
+M!@`"#W@``8T%``(/?``!C08``@^H```!!0`"#ZP```$&``(/N``!<04``@^\
+M``%Q!@`"#\@``-D%``(/S```V08``A`<``&-!0`"$"```8T&``(00``!@@4`
+M`A!$``&"!@`"$'@``9`%``(0?``!D`8``A$L```!!0`"$3````$&``(15```
+M`04``A%8```!!@`"$60```$%``(1:````08``A'L```!!0`"$?````$&``(1
+M_````04``A(````!!@`"$E0```$%``(26````08``A)D```!!0`"$F@```$&
+M``(2]```G@4``A+X``">!@`"$QP``)X%``(3(```G@8``A-$``">!0`"$T@`
+M`)X&``(3;```G@8``A.H``&0!0`"$ZP``9`&``(4X````04``A3D```!!@`"
+M%0P```$%``(5$````08``A4X``&"!0`"%3P``8(&``(53``!D`4``A50``&0
+M!@`"%:0``8T%``(5J``!C08``A78``&-!0`"%=P``8T&``(7!````04``A<(
+M```!!@`"%V@```$%``(7;````08``A=X```!!0`"%WP```$&``(7R````04`
+M`A?,```!!@`"%]@```$%``(7W````08``AC,```"!0`"&-````(&``(8U``!
+MC04``AC8``&-!@`"&-P``34%``(8X``!-08``AE````"!0`"&40```(&``(9
+M2``!C04``AE,``&-!@`"&5```34%``(95``!-08``AF@```"!0`"&:0```(&
+M``(9J``!C04``AFL``&-!@`"&;```34%``(9M``!-08``AI8``")!0`"&EP`
+M`(D&``(:E````@4``AJ8```"!@`"&T@``"\%``(:H```+P4``AJD```O!@`"
+M&M0``9`%``(:V``!D`8``AKX``&-!0`"&OP``8T&``(;'``!C08``AM4```O
+M!0`"&U@``"\&``(;@```+P4``AN$```O!@`"&[@``8T%``(;O``!C08``APH
+M```"!0`"'"P```(&``(>I````@4``AZH```"!@`"'P```'<%``(?"```=P8`
+M`A\\``&-!0`"'T```8T&``(?1``!-04``A](``$U!@`"'U@```(%``(?7```
+M`@8``A^H```"!0`"'ZP```(&``(?L``!C04``A^T``&-!@`"'[@``34%``(?
+MO``!-08``A_\```"!0`"(`0```(&``(@"``!C04``B`,``&-!@`"(!```34%
+M``(@%``!-08``B!H```"!0`"('````(&``(@=``!C04``B!X``&-!@`"('P`
+M`34%``(@@``!-08``B#<```"!0`"(.````(&``(A2```=P4``B%,``!W!@`"
+M(7P``'<%``(A@```=P8``B'D```"!0`"(>@```(&``(A\``!C04``B'T``&-
+M!@`"(?@``34%``(A_``!-08``B)8```"!0`"(EP```(&``(BH```=P4``B*D
+M``!W!@`"(P@``'<%``(C#```=P8``B-8```"!0`"(UP```(&``(C9``!C04`
+M`B-H``&-!@`"(VP``34%``(C<``!-08``B70``$@!0`")=0``2`&``(F,```
+M`04``B8T```!!@`"*"0```$%``(H*````08``BHL```!!0`"*C````$&``(J
+M9``!504``BIH``%5!@`"*H0```$%``(JB````08``BJ\```!!0`"*L````$&
+M``(K"````04``BL,```!!@`"+,0``54%``(LR``!508``BT```"#!0`"+00`
+M`(,&``(M(```@P4``BTD``"#!@`"+4P```(%``(M5````@8``BUH```"!0`"
+M+6P```(&``(ME````@4``BV8```"!@`"+<P``,T%``(MT```S08``BWP``#-
+M!0`"+?0``,T&``(N&````04``BX<```!!@`"+B0```$%``(N*````08``BXP
+M```!!0`"+C0```$&``(N/````04``BY````!!@`"+D@```$%``(N3````08`
+M`BY4```!!0`"+E@```$&``(N8````04``BYD```!!@`"+FP```$%``(N<```
+M`08``B[,```"!0`"+M````(&``(NU``!C04``B[8``&-!@`"+MP``34%``(N
+MX``!-08``B]````"!0`"+T0```(&``(O2``!C04``B],``&-!@`"+U```34%
+M``(O5``!-08``B^@```"!0`"+Z0```(&``(OJ``!C04``B^L``&-!@`"+[``
+M`34%``(OM``!-08``C$8```O!0`",1P``"\&``(Q,``!D`4``C$T``&0!@`"
+M,50``8T%``(Q6``!C08``C%X``&-!@`",<P``"\%``(R%```+P8``C*$```O
+M!0`",H@``"\&``(R]```+P4``C+X```O!@`",UP``"\%``(S8```+P8``C.<
+M``&-!0`",Z```8T&``(T#````@4``C00```"!@`"-E@```(%``(V7````@8`
+M`C:(```"!0`"-HP```(&``(VQ````@4``C;(```"!@`"-P0```(%``(W"```
+M`@8``C=,``!W!0`"-U```'<&``(X@```=P4``CB$``!W!@`".,```'<%``(X
+MQ```=P8``CE8``!W!0`".5P``'<&``(YY```=P4``CGH``!W!@`".FP```(%
+M``(Z<````@8``CK4``!W!0`".M@``'<&``(Z[```=P4``CKP``!W!@`".SP`
+M`'<%``([0```=P8``CMT```"!0`".W@```(&``([?``!C04``CN```&-!@`"
+M.X0``34%``([B``!-08``CO,```"!0`".]0```(&``([W``!C04``CO@``&-
+M!@`".^0``34%``([Z``!-08``CPT```"!0`"/#P```(&``(\0``!C04``CQ$
+M``&-!@`"/$@``34%``(\3``!-08``CR8```"!0`"/*````(&``(\J``!C04`
+M`CRL``&-!@`"/+```34%``(\M``!-08``CT,```"!0`"/1````(&``(]&``!
+MC04``CT<``&-!@`"/2```34%``(])``!-08``D`P```!!0`"0#0```$&``)`
+M:```Y@4``D!L``#F!@`"01@```$%``)!'````08``D&L```!!0`"0;````$&
+M``)"/````04``D)````!!@`"0M@```$%``)"W````08``D,T```!!0`"0S@`
+M``$&``)#P````04``D/$```!!@`"1'````$%``)$=````08``D5$```!!0`"
+M14@```$&``)%,````04``D6<```!!@`"1_@```$%``)'_````08``DOD``"#
+M!0`"2^@``(,&``),!```@P4``DP(``"#!@`"3D@```$%``).3````08``DYH
+M```!!0`"3FP```$&``)/?````04``D^````!!@`"4#P```$%``)00````08`
+M`E#````!!0`"4,0```$&``)18```S04``E%D``#-!@`"480``,T%``)1B```
+MS08``E&T```!!0`"4;@```$&``)1P````04``E'$```!!@`"4<P```$%``)1
+MT````08``E'8```!!0`"4=P```$&``)1Y````04``E'H```!!@`"4?````$%
+M``)1]````08``E'\```!!0`"4@````$&``)2"```(04``E(,```A!@`"4FP`
+M``(%``)2<````@8``E)T``&-!0`"4G@``8T&``)2?``!-04``E*```$U!@`"
+M4N````(%``)2Y````@8``E+H``&-!0`"4NP``8T&``)2\``!-04``E+T``$U
+M!@`"4T````(%``)31````@8``E-(``&-!0`"4TP``8T&``)34``!-04``E-4
+M``$U!@`"5+@``"\%``)4O```+P8``E30``&0!0`"5-0``9`&``)4]``!C04`
+M`E3X``&-!@`"51@``8T&``)5;```+P4``E6T```O!@`"5B0``"\%``)6*```
+M+P8``E:4```O!0`"5I@``"\&``)6_```+P4``E<````O!@`"5SP``8T%``)7
+M0``!C08``EA(```"!0`"6$P```(&``)8>````@4``EA\```"!@`"6+0```(%
+M``)8N````@8``ECT```"!0`"6/@```(&``)9/```=P4``EE```!W!@`"67``
+M``(%``)9=````@8``EFX```"!0`"6;P```(&``)9P``!C04``EG$``&-!@`"
+M6<@``34%``)9S``!-08``EH0```"!0`"6A@```(&``):(``!C04``EHD``&-
+M!@`"6B@``34%``):+``!-08``EIX```"!0`"6H````(&``):A``!C04``EJ(
+M``&-!@`"6HP``34%``):D``!-08``EK<```"!0`"6N0```(&``):[``!C04`
+M`EKP``&-!@`"6O0``34%``):^``!-08``EM0```"!0`"6U0```(&``);6``!
+MC04``EM<``&-!@`"6V```34%``);9``!-08``EP(```"!0`"7`P```(&``)=
+MG````04``EV@```!!@`"7_````$%``)?]````08``F)4```!!0`"8E@```$&
+M``)BJ````04``F*L```!!@`"8T````$%``)C1````08``F>8``&0!0`"9YP`
+M`9`&``)GU````04``F?8```!!@`":!@``8T%``)H'``!C08``FA8``&-!0`"
+M:%P``8T&``)I#``!C04``FD0``&-!@`":6P``(,%``)I<```@P8``FF,``"#
+M!0`":9```(,&``)IK```@P4``FFP``"#!@`":T@```$%``)KF````08``FNL
+M```!!0`":[````$&``)L:````04``FQL```!!@`";.P```$%``)L\````08`
+M`FVD```!!0`";:@```$&``)MO````04``FW````!!@`";E````$%``)N5```
+M`08``F[P``#-!0`";O0``,T&``)O%```S04``F\8``#-!@`";S```,T%``)O
+M-```S08``F]8```!!0`";UP```$&``)O9````04``F]H```!!@`";W````$%
+M``)O=````08``F]\```!!0`";X````$&``)OB````04``F^,```!!@`";Y0`
+M``$%``)OF````08``F^@```!!0`";Z0```$&``)OK```(04``F^P```A!@`"
+M<`P```(%``)P$````@8``G`4``&-!0`"<!@``8T&``)P'``!-04``G`@``$U
+M!@`"<(````(%``)PA````@8``G"(``&-!0`"<(P``8T&``)PD``!-04``G"4
+M``$U!@`"<.````(%``)PY````@8``G#H``&-!0`"<.P``8T&``)P\``!-04`
+M`G#T``$U!@`"<E@``"\%``)R7```+P8``G)P``&0!0`"<G0``9`&``)RE``!
+MC04``G*8``&-!@`"<K@``8T&``)S#```+P4``G-4```O!@`"<\0``"\%``)S
+MR```+P8``G0D```O!0`"="@``"\&``)T?```+P4``G2````O!@`"=+P``8T%
+M``)TP``!C08``G:D```"!0`"=E0```(%``)V0````@4``G7X```"!0`"=>``
+M``(%``)VJ````@8``G;4```"!0`"=M@```(&``)W$````@4``G<4```"!@`"
+M=U````(%``)W5````@8``G>L``!W!0`"=[```'<&``)X*```+P4``G@L```O
+M!@`">$0``'<%``)X2```=P8``GAL``!W!0`">'```'<&``)XI````@4``G@D
+M```"!0`">*@```(&``)X[````@4``GCP```"!@`">/0``8T%``)X^``!C08`
+M`GC\``$U!0`">0```34&``)Y1````@4``GE,```"!@`">50``8T%``)Y6``!
+MC08``GE<``$U!0`">6```34&``)YK````@4``GFT```"!@`">;@``8T%``)Y
+MO``!C08``GG```$U!0`"><0``34&``)Z$````@4``GH8```"!@`">B```8T%
+M``)Z)``!C08``GHH``$U!0`">BP``34&``)ZA````@4``GJ(```"!@`">HP`
+M`8T%``)ZD``!C08``GJ4``$U!0`">I@``34&``)[/````@4``GM````"!@`"
+M?-````$%``)\U````08``G\D```!!0`"?R@```$&``*!B````04``H&,```!
+M!@`"@=P```$%``*!X````08``H)T```!!0`"@G@```$&``*&S``!D`4``H;0
+M``&0!@`"AP@```$%``*'#````08``H=,``&-!0`"AU```8T&``*'C``!C04`
+M`H>0``&-!@`"B$```8T%``*(1``!C08``HB@``"#!0`"B*0``(,&``*(P```
+M@P4``HC$``"#!@`"B.```(,%``*(Y```@P8``HIX```!!0`"BL@```$&``**
+MW````04``HK@```!!@`"BY@```$%``*+G````08``HP<```!!0`"C"````$&
+M``*,U````04``HS8```!!@`"C.P```$%``*,\````08``HV````!!0`"C80`
+M``$&``*.(```S04``HXD``#-!@`"CD0``,T%``*.2```S08``HY@``#-!0`"
+MCF0``,T&``*.B````04``HZ,```!!@`"CI0```$%``*.F````08``HZ@```!
+M!0`"CJ0```$&``*.K````04``HZP```!!@`"CK@```$%``*.O````08``H[$
+M```!!0`"CL@```$&``*.T````04``H[4```!!@`"CMP``"$%``*.X```(08`
+M``#(```!`@```,P```$"````T````0(```#4```!`@```-@```$"````W```
+M`0(```#@```!`@```.0```$"````Z````0(```#L```!`@```/````$"````
+M]````0(```#X```!`@```/P```$"```!`````0(```$$```!`@```0@```$"
+M```!#````0(```$0```!`@```10```$"```!&````0(```$<```!`@```2``
+M``$"```!)````0(```$H```!`@```2P```$"```!,````0(```$T```!`@``
+M`3@```$"```!/````0(```%````!`@```40```$"```!2````0(```%,```!
+M`@```5````$"```":``!#`(```)L``!D`@```G```,`"```"=```LP(```)X
+M``%Z`@```GP``-,"```"@```5`(```*$``#?`@```H@``*`"```"C``!=P(`
+M``*0``%*`@```I0``+T"```"F```/@(```*<``"$`@```J```%<"```"I```
+M(`(```*H``%H`@```JP``9,"```"L```+@(```*T``",`@```K@``4<"```"
+MO```*0(```+````\`@```L0``&@"```"R``!?@(```+,``%Y`@```M```1D"
+M```"U```M`(```+8``%?`@```MP``6("```"X``!"0(```+D``#<`@```N@`
+M`3P"```"[```D`(```+P``%R`@```O0``+X"```"^```M@(```+\``"%`@``
+M`P```*X"```#!```50(```,(``#'`@```PP``3@"```#$``!#@(```,4``"D
+M`@```Q@``3,"```#'```Z0(```,@``%<`@```R0``4P"```#*``!*P(```,L
+M```R`@```S```+4"```#-``!6@(```,X``$;`@```SP``20"```#0```/0(`
+M``-$``!T`@```T@``40"```#3```Y`(```-0``!/`@```U0``#8"```#6```
+MBP(```-<```)`@```V```/4"```#9``!/0(```-H``$T`@```VP``/8"```#
+M<``!?P(```-T``!I`@```W@```L"```#?``!9`(```.```"L`@```X0``0\"
+M```#B``!&`(```.,``%N`@```Y```3("```#E```I@(```.8``!%`@```YP`
+M`2T"```#H```$P(```.D``"[`@```Z@``&\"```#K```^`(```.P``#Z`@``
+M`[0``5$"```#N``!8P(```.\``%]`@```\````\"```#Q``!3@(```/(``$B
+M`@```\P``0L"```#T```H0(```/4``%/`@```]@```$"```#W``!D0(```/@
+M``$J`@```^@``5H"```#[``!&P(```/P``$D`@```_0``#T"```#^```=`(`
+M``/\```!`@``&H@``44"```:C``!90(``!J0``%7`@``&I0``7P"```:F```
+M8P(``!J<``!U`@``&J```),"```:I```;`(``!JH```-`@``&JP``#4"```:
+ML```80(``!JT``!B`@``&K@``#D"```:O``!:P(``!K```$-`@``&L0``8<"
+M```:R```@0(``!K,``%U`@``&M```0("```:U```J@(``!K8``$G`@``&MP`
+M`"("```:X``!!P(``!KD```9`@``&N@``6<"```:[```YP(``!KP```?`@``
+M&O0``"H"```:^```K0(``!K\``%[`@``&P```6D"```;!``!=@(``!L(``$Y
+M`@``&PP``/("```;$```_P(``!L4``#N`@``&Q@``1("```;'```?0(``!L@
+M``"8`@``&R0``',"```;*``!20(``!LL``"?`@``&S```$`"```;-``!.@(`
+M`!LX``$V`@``&SP``'D"```;0```.@(``!M$``%-`@``&T@``-T"```;3``!
+M+@(``!M0``#C`@``&U0``,,"```;6```X@(``!M<``%!`@``&V```,X"```;
+M9```-P(``!MH``!@`@``&VP``-@"```;<``!1@(``!MT``%4`@``&W@``28"
+M```;?```'`(``!N```!;`@``&X0``3`"```;B``!D@(``!N,``!(`@``&Y``
+M`)H"```;E``!8`(``!N8``#4`@``&YP``00"```;H```'@(``!ND``#[`@``
+M&Z@``#@"```;K``!``(``!NP``#K`@``&[0``(T"```;N```)P(``!N\``!0
+M`@``&\```)("```;Q```VP(``!O(``#+`@``&\P``58"```;T```R@(``!O4
+M``%1`@``&]@``8X"```;W```"`(``!O@``"B`@``&^0``'`"```;Z```:@(`
+M`!OL``#O`@``&_```/,"```;]``!!@(``!OX```!`@``&_P``2P"```<```!
+M2`(``!P(``##`@``'`P``.("```<$``!00(``!P4``#.`@``'!@``#<"```<
+M'````0(``#J(```!`@``.HP```$"```ZD````0(``#J4```!`@``.I@```$"
+M```ZG````0(``#J@```!`@``.J0```$"```[^```6@(``#O\``"``@``/```
+M`7,"```\!```:P(``#P(``!$`@``/`P``-<"```\$```N`(``#P4``$<`@``
+M/!@``*L"```\'```4P(``#P@``"=`@``/"0``%8"```\*``!`P(``#PL``%>
+M`@``/#```(H"```\-```_@(``#PX``#E`@``/#P``9@"```\0``!C`(``#Q$
+M``"Y`@``/$@``'P"```\3``!(P(``#Q0```H`@``/%0``5T"```\6``!4@(`
+M`#Q<``"&`@``/&```6$"```\9```7@(``#QH``$_`@``/&P``0$"```\<```
+M_`(``#QT```2`@``/'@``6P"```\?```>@(``#R```#@`@``/(0``7$"```\
+MB```V0(``#R,``"6`@``/)```3$"```\E```^0(``#R8```0`@``/)P``)P"
+M```\H```"@(``#RD``"7`@``/*@``3X"```\K```L`(``#RP``#H`@``/+0`
+M`#\"```\N``!'P(``#R\``"C`@``/,```+$"```\Q``!%P(``#S(``!-`@``
+M/,P``4("```\T``!4`(``#S4``$4`@``/-@``90"```\W```20(``#S@``#&
+M`@``/.0``*@"```\Z``!@@(``#SL``!,`@``//```(X"```\]``!A@(``#SX
+M``"G`@``//P``,P"```]````0@(``#T$``!+`@``/0@``"T"```]#```00(`
+M`#T0```[`@``/10``.H"```]&```1@(``#T<``!_`@``/2```#0"```])```
+M,P(``#TH```8`@``/2P``'("```],```]P(``#TT``!M`@``/3@``24"```]
+M/``!@0(``#U```#0`@``/40``5$"```]2```D0(``#U,``&/`@``/5```1`"
+M```]5```T0(``#U8```C`@``/5P``70"```]8```;@(``#UD``#5`@``/6@`
+M`,4"```];```[`(``#UP``&*`@``/7@``1<"```]?```30(``#V```%"`@``
+M/80``5`"```]B``!%`(``#V,``&5`@``/90```$"``!.<````0(``$YT```!
+M`@``3G@```$"``!.?````0(``$Z````!`@``3H0```$"``!.X````0(``$[D
+M```!`@``3N@```$"``!.[````0(``$[P```!`@``3O0```$"``!.^````0(`
+M`$[\```!`@``3P````$"``!/!````0(``$\(```!`@``3PP```$"``!/$```
+M`0(``$\4```!`@``3Q@```$"``!/'````0(``$\@```!`@``3R0```$"``!/
+M*````0(``$\L```!`@``3S````$"``!/-````0(``$\X```!`@``3SP```$"
+M``!/0````0(``$]$```!`@``3T@```$"``!/3````0(``$]0```!`@``3U@`
+M``$"``!/7````0(``$]@```!`@``3V0```$"``!/:````0(``$^(```!`@``
+M3XP```$"``!/D````0(``$^4```!`@``3Y@```$"``!/G````0(``$^@```!
+M`@``3Z0```$"``!/J````0(``$^L```!`@``3[````$"``!/M````0(``$^X
+M```!`@``3[P```$"``!/P````0(``$_$```!`@``3\@```$"``!/S````0(`
+M`$_0```!`@``3]0```$"``!/V````0(``$_<```!`@``3^````$"``!/Y```
+M`0(``$_H```!`@``3^P```$"``!/\````0(``$_T```!`@``6Y````$"``!;
+ME````0(``%N8```!`@``6YP```$"``!;H````0(``%ND```!`@``6Z@```$"
+M``!HD````0(``&B4```!`@``:)@```$"``!HG````0(``&B@```!`@``:*0`
+M``$"``!HJ````0(``&BL```!`@``=+@```$"``!TO````0(``'3````!`@``
+M=,0```$"``!TR````0(``'3,```!`@``=-````$"``"`P````0(``(#$```!
+M`@``@,@```$"``"`S````0(``(#0```!`@``@-0```$"``"`V````0(``(ZH
+M```!`@``CJP```$"``".L````0(``(ZT```!`@``CK@```$"``".O````0(`
+M`([````!`@````P```("````$````@(````4```"`@```!@```("````'```
+:`@(````@```"`@```"0```("````*````@(`
+`
+end
diff --git a/sys/contrib/dev/ath/public/mips1-be-elf.inc b/sys/contrib/dev/ath/public/mips1-be-elf.inc
new file mode 100644
index 0000000..3dafff3
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips1-be-elf.inc
@@ -0,0 +1,72 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/mips1-be-elf.inc#2 $
+#
+
+#
+# Configuration for building big-endian MIPS1 using the 5.01
+# linux-mips.org toolchain (manually moved to /pub/gnu from
+# /pub/gnu/local where rpm --prefix=/pub/gnu bogusly installs them).
+
+#
+# http://www.linux-mips.org/toolchain.html
+#
+# /pub/gnu/bin/mips-linux-gcc -v
+# Reading specs from /pub/gnu/bin/../lib/gcc-lib/mips-linux/2.96-mips3264-000710/specs
+# gcc version 2.96-mips3264-000710
+# /pub/gnu/bin/mips-linux-as -v
+# GNU assembler version 2.12.90.0.7 (mips-linux) using BFD version 2.12.90.0.7 20020423
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/mips-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -G 0 -EB -mno-abicalls -fno-pic -mips1 -Wa,--trap \
+ -fno-strict-aliasing -fno-common -fomit-frame-pointer -mlong-calls
diff --git a/sys/contrib/dev/ath/public/mips1-be-elf.opt_ah.h b/sys/contrib/dev/ath/public/mips1-be-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips1-be-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/mips1-le-elf.hal.o.uu b/sys/contrib/dev/ath/public/mips1-le-elf.hal.o.uu
new file mode 100644
index 0000000..101a2a8
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips1-le-elf.hal.o.uu
@@ -0,0 +1,6047 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/mips1-le-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$!`0````````````$`"``!``````````````#L=@,``1```#0`````
+M`"@`$0`.`/P#_^``````````````````````_W\```````#__X0P6``#)```
+M`CQC`(,0A`!")%D`@B@F`$`0!Q$")!P`@B@4`$`04@`")!H`@BA7`$`0```"
+M/!,`@B@)`$`0$P`")!$`@BA+`$`0```"/`<``B1$`((0``````@`X`,E$```
+M`````$@`@A``````"`#@`R40``!"`((0```"/%,`@B@&`$`0'``#)````CQ"
+M`(,0F`!")`@`X`,E$```5P`")#8`@A``````"`#@`R40```M`((0```"/`@1
+M@B@5`$`0D0`#)````CPS`(,0<`!"))(`@B@*`$`0%!`")(@`@B@M`$`0)1``
+M`(8`@B@I`$`4`````````CP(`.`#7`!")``````@`((0``````@`X`,E$```
+M$Q$")!P`@A````(\%!&"*`8`0!`3\`,T$A$")`\`@A``````"`#@`R40````
+M``(\%`"#$#0`0B0;\0,T```"/!``@Q`@`$(D"`#@`R40``````(\"`#@`P``
+M0B0```(\"`#@`Q``0B0```(\"`#@`T@`0B0```(\"`#@`ZP`0B0E$```"`#@
+M`P````#H_[TG$`"_K___A#",%H,X`0!C+">G@C@!`$(L)1AB``0`8!3__Z4P
+MMQ`")`<`@A0````````"/```0B0)^$``)2"@``(``!``````)1```!``OX\`
+M````"`#@`Q@`O2?@_[TG&`"_KS``J(___X0P!P(")$$`@A`(`H(H%0!`$!,1
+M`B03`((H"0!`$!,``B01`((H-`!`$````CP'``(D-@""$"48```[```0`0`"
+M)"8`@A`=`((H-@!`$"48```:`((H-`!`%`$``B0?```0$P`$)!T`@A`4$8(H
+M#P!`$!OQ`C0'$0(D)`""$`@1@B@&`$`0$A$")!00`B02`((0)1@``"0``!`!
+M``(D%0""$"48```@```0`0`")!$`@A`J$$0`!@!`%!G_`C03\`(T!@""$"48
+M```7```0`0`")!0`@A0E&```$P`$)````CP``$(D"?A``!``J*\/```0)1A`
+M`````CP``$(D"?A``!``J*\)```0)1A``````CP``$(D"?A``!``J*\#```0
+M)1A```$``B0```*M%P!@$"408`#(`6*4``````@`8J3*`6*4``````H`8J3,
+M`6*,`````!P`8JS0`6*4`````"``8J32`6*4`````"(`8J34`6*4`````"0`
+M8J36`6*4`````"8`8J0E$&``&`"_CP`````(`.`#(`"])]@!A:P(`.`#`0`"
+M)-#_O2<L`+^O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6P@``EJ*``
+M):#``"68X``E@``````"/```4B0```(\``!1)"4@P`()^$`")2B@`B085``'
+M`',0`0`")`GX(`(*``0D`0`0)N@#`BKU_T`4)1```"P`OX\H`+:/)`"UCR``
+MM(\<`+./&`"RCQ0`L8\0`+"/"`#@`S``O2<E,```"`"@$"48``!`$`,``0"#
+M,"480P`!`,8D*Q#%`/K_0!1"(`0`"`#@`R408``0`*F/___G,$`0!P`A$$<`
+M@!`"`"$010`F`$B4`````)H``!$E$```0!`'`"$01P"`$`(`(1!%`"4`0Y`"
+M``(D)P!B$`,`8B@%`$`0`P`")`H`8!``````BP``$"4P``!E`&(0P!`(``0`
+M`B1S`&(08A`#/(0``!`E,```"@`@$<```R1`$`<`(1!'`(`0`@`A$$4`*0!"
+MD``````#`$`0P"`&`&```R3`(`8``!(&`",01`"`$`(`(1!$`,`0`@`;`$@`
+M$A````(``!4`````#0`'`"$P8@!K```0"@#&)#02@HP`````,0!`$``````"
+M`$*4``````"`0C`2`$`0`!$(`&(0`SS336,T&0!#`!`0``""&0(``````,`@
+M!@`A$(,`%0!")!L`0P`2$````@!@%``````-``<``!$"`%$``!"0`$8D-!*$
+MC``````8`(`0@!`(``(`@I0``````$!",!(`0!!B$`,\P!`(`---8S09`$,`
+M$!```((9`@``````P"`&`"$0@P`5`$(D&P!#`!(0```"`&`4``````T`!P#`
+M$`(`-P``$$@`1B2`$`@`8A`#/---8S09`$,`$!```((9`@``````P"`&`"$0
+M@P`5`$(D&P!#`!(0```"`&`4``````T`!P"`$`(`)0``$"0`1B1B$`,\TTUC
+M-!D`0P`0$```@AD"``````#`(`8`(1"#`!4`0B0;`$,`$A````(`8!0`````
+M#0`'`(`0`@`4```0%@!&)(`0"`#336,T&0!#`!`0``""&0(``````,`@!@`A
+M$(,`%0!")!L`0P`2$````@!@%``````-``<`@!@"`.@#`BT"`$`4O0!F)%P`
+M9B3__\(P"`#@`P`````"`*.4`````"``8S`8`&`4`@`")`(`HY0`````T`!C
+M,,``!"02`&00`P`")`(`HY0`````T`!C,-``!"0,`&00!``")`(`HY0`````
+M$`!C,`<`8!0!``(D`@"CE```````"&,P`@!@%`4``B0E$```"`#@`P````#@
+M_[TG&`"_KQ0`L:\0`+"O)8C``(``(C()`$`0)8"@`+0)`R1V``,2#@`")+0)
+M`BYD`$`0F?8#)BT``!!F9@(\``$B,B,`0!````(\``!")`GX0```````%@!`
+M$+/L`B8Q`$(L%`!`$$`!(C*`$!``(1!0`$`@`@#,S`4\S<RE-!D`!0(0$```
+M@A`"`(`8`@`A&&(`_O\")CH`8A0`````__\"/`T_0C0A&((`.P``$!D`90!`
+M`2(R*Q`"`(D3`RXD$$,`1P!`$&#P`B9&```0`````+0)`R1)``,2#@`")+0)
+M`BX)`$`0F?8#)F9F`CQG9D(T&`!B`!`0``!#$`(`PQ\#`#X``!`C$$,`B!,"
+M+C4`0!!X[`(F```"/```0B0)^$```````"``0!"S[`(F,0!"+!X`0!`E$P(N
+M@!`0`"$04`!`(`(`S,P%/,W,I309``4"$!```((0`@"`&`(`(1AB`/[_`B8&
+M`&(4`````/__`CP-/T(T(1B"``<``!`9`&4`__\"/`@_0C0A&((`S,P"/,W,
+M0C09`&(`$!```((8`@`6```0)1!@`"43`BX``````P!`%``````*```08/`"
+M)C#V`B;,S`,\S<QC-!D`0P`0$````A$"``@``!`/`$(D>.P")LS,`SS-S&,T
+M&0!#`!`0``""$`(``````!@`OX\4`+&/$`"PCP@`X`,@`+TGZ/^])Q0`OZ\0
+M`+"O)8"@`#02A8P`````"@"@$````CP``$(D"?A```````````,\O`!C)"$0
+M0P```$*0!0``$!@``@(```(\O@!"D``````8``("$A``````````````%`"_
+MCQ``L(\(`.`#&`"])^C_O2<4`+^O$`"PKR6`H``T$H6,``````H`H!````(\
+M``!")`GX0``````````#/+P`8R0A$$,```!#D`4``!`;``,"```"/+X`0Y``
+M````&P`#`A(0```"`&`4``````T`!P`4`+^/$`"PCP@`X`,8`+TGP/^])SP`
+MOZ\X`+ZO-`"WKS``MJ\L`+6O*`"TKR0`LZ\@`+*O'`"QKQ@`L*\EF*``!`!B
+MD@`````Z`$`4);"``"60```$`&,F_P`$)"$0<@```$2@`0!2)B``0BK\_T`4
+M(1!R````8HX`````+0!`&"60```$`'0F```"/```520!`!XD!@!W)D"`$@`A
+M@!("@(`0`"```R8A&&,""`!DD``````+`'&0`````"$0A`(``%*@"0!BD```
+M```E$$0`(1""`@``4J`0`*"O)2#``B4H8`(.``8D"?B@`B4X(`(H`!`F(1B0
+M`@``8J00`+ZO)2#``B4H8`(.``8D"?B@`B4X(`(A@/`"```"I@$`4B8``&*.
+M`````"H00@+;_T`40(`2`#P`OX\X`+Z/-`"WCS``MH\L`+6/*`"TCR0`LX\@
+M`+*/'`"QCQ@`L(\(`.`#0`"])R,`HBS$`$`0X`&()````CS(`$(D@!@%`"$8
+M8@```&*,``````@`0```````"`*"E````````.*L"`#@`R40```(`.`##0`"
+M)`@`X`,-``(D`P`"D0`````!`$(X"`#@`P$`0C`(`.`##0`")`@`X`,-``(D
+M"@`"E0```````.*L"`#@`R40```(``*5````````XJP(`.`#)1```````HT"
+M``,\)!!#``(`0!`-``,D)1@```@`X`,E$&`````"C0$``SPD$$,``@!`%`T`
+M`R0E&```"`#@`R408`````*-``````0`0C`"`$`0#0`#)"48```(`.`#)1!@
+M`````HT`````"`!",`(`0!`-``,D)1@```@`X`,E$&`````"C0`````0`$(P
+M`@!`$`T``R0E&```"`#@`R408`#X`8*,````````XJP(`.`#)1````$``B0+
+M`,(0`````&\`P!`E$````@`")`L`PA```````P`")`T`PA``````"`#@`PT`
+M`B3\`8*$````````XJP(`.`#)1```/X!@I0```````#BK`@`X`,E$`````*"
+MC````````.*L"`#@`R40``````*-!``#/"000P`"`$`0#0`#)"48```(`.`#
+M)1!@`````HT(``,\)!!#``(`0!`-``,D)1@```@`X`,E$&``"`#@`PT``B0`
+M``*-```````!0C`"`$`0#0`#)"48```(`.`#)1!@`````HT@``,\)!!#``(`
+M0!`-``,D)1@```@`X`,E$&`````"C4```SPD$$,``@!`$`T``R0E&```"`#@
+M`R408``!``(D$`#"$``````&`,`0@``#/`(``B02`,(0``````@`X`,-``(D
+M```"C0`````D$$,``@!`$`T``R0E&```"`#@`R408`!,$H*,``````(`0!`-
+M``,D)1@```@`X`,E$&``2!*"E````````.*L"`#@`R40```(`.`##0`")&@2
+M@HP``````@!`$`T``R0E&```"`#@`R408``4``*-````````XJP(`.`#)1``
+M``P``B0(`.`#`````!``HX\`````&0`")!,`HA`:`*(L!@!`$!X``B0/``(D
+M"`"B$`,``B0=```0```````````7`*(0`````!@``!``````%@#"%`4`XBP4
+M`$`0`0`")`@`X`,``H>L`0`")`8`PA`K$`<``@`")`8`PA``````"@``$```
+M``!,$H*L"`#@`P$``B1($H>D"`#@`P$``B1H$H>L"`#@`P$``B0#`&`0````
+M``P``B0``&*L"`#@`R40``#(_[TG-`"_KS``OJ\L`+>O*`"VKR0`M:\@`+2O
+M'`"SKQ@`LJ\4`+&O$`"PKR6P@``EN*``)?#``"6(X``ED,`#"``B+AX`0!0E
+MH``````"/```522`$!0`(1!7````4)0``````@!3E```````%!``)1!3````
+M0JX$`%(F_/\Q)B4@P`()^*`")2@``@``0JX$`!`F_/\Q)BL8<`(!`&,X!``B
+M+@$`0C@D&&(`]/]@%`0`4B8(`"(NYO]`$`$`E"8C$%X"-`"_CS``OH\L`+>/
+M*`"VCR0`M8\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,X`+TGZ/^])Q0`OZ\0
+M`+"O*`"CCRP`L(\`````#0`")!8`HA````(\#@"B*`4`0!``````"P"@$```
+M```M```0)1```!T``B05`*(04!*")!X``B07`*(0)1```"4``!``````R`&"
+M)```8JP0``(D```"KA\``!`!``(DP`]")"4HP````&:,```'C@GX0```````
+M```"KA8``!`!``(D``!BK!@``B0```*N$0``$`$``B0(`.`4``````0``B0`
+M``*N``!CC`0"@HP`````!P``$```8JP$``,D!0#C%"40`````,*,``````0"
+M@JP!``(D%`"_CQ``L(\(`.`#&`"])P0`HXP`````=@!@$"40`````,*,````
+M````HJP$`,*,``````@`HJP(`,*,``````P`HJP,`,*,`````!``HJP0`,.,
+M__\")`8`8A```6(L`@!`%`````#_``,D`P``$!0`HZP"``(D%`"BK!0`PXS_
+M_P(D$@!B$`$$8BP"`$`4`0`")``$`R08`**L*Q!#``X`0!``````&`"BC```
+M``!`$`(``0!"-!@`HJPK$$,`^?]`%``````$```0`````!0`PHP`````&`"B
+MK!@`PXS__P(D$@!B$`$$8BP"`$`4`0`")``$`R0<`**L*Q!#``T`0!``````
+M'`"BC`````!`$`(``0!"-!P`HJPK$$,`^?]`%``````#```0`````/\#`B0<
+M`**L'`#"E``````)`$`0"@`")!P`PY0`````$`!B+`(`0!0`````#P`#)`(`
+M`!`@`*.D(`"BI!X`PI0`````"0!`$`H``B0>`,.4`````!``8BP"`$`4````
+M``\``R0"```0(@"CI"(`HJ0@`,*,`````"0`HJPD`,*,`````"@`HJPH`,*,
+M`````"P`HJPL`,*,`````#``HJP$`,.,!``")`8`8A0!``(D!`"CC``````"
+M`&(4`````#@`HZP(`.`#``````0`PXP`````+`!@$"40```,`,*,``````@`
+MHJP``,*,````````HJP(`,*,``````0`HJP,`,*,``````@`HJP0`,*,````
+M``P`HJP4`,*,`````!``HJP8`,*,`````!0`HJP<`,*,`````!@`HJP@`,*4
+M`````!P`HJ0B`,*4`````!X`HJ0D`,*,`````"``HJPH`,*,`````"0`HJPL
+M`,*,`````"@`HJPP`,*,`````"P`HJP!``(D"`#@`P````#@_[TG'`"_KQ@`
+MLJ\4`+&O$`"PKR60@`````(\``!")`GX0``E@*``)8A``!X`(!(`````%@`B
+MA@`````4`$`4```"/```0B0E($`""?A``"4H``(E@$``P`%"CB4@0`()^$``
+M)2@@`@```SQ4`6,D0(`0`"&``P(```.6`````"$88@``'`,`!P``$`,4`P`6
+M`"*6&``CE@`````A$$,``!0"``,4`@`<`+^/&`"RCQ0`L8\0`+"/"`#@`R``
+MO2?`_[TG/`"_KS@`OJ\T`+>O,`"VKRP`M:\H`+2O)`"SKR``LJ\<`+&O&`"P
+MKR6@@``E\```$`"@KR6X```4`*"O,!*"C@````!)`$`0)9```````CQ4`58D
+M@!$2`"&`@@)&`@*&`````#L`000P`A$F)2"``@```SP``&,D"?A@`"4H(`(E
+MJ$``P`&"CB4@@`()^$``)2@@`D`8%0`A&'8`1@($E@``<Y0`````(2"3`"$0
+M1```%`(``QP"`#("`I8```````%",!``0!`J$'<`(0!`$"4@@`(EN&``P`&"
+MC@`````)^$``)2@@`D8"`Y8`````(1AB`",88P(`'`,``QP#`!0``!`4`*.O
+M*A!^`!$`0!`E((`")?!@`,`!@HX`````"?A``"4H(`)`(!4`(2"6`!8`(Y8`
+M````(1AB````@I0`````(Q!#```4`@`#%`(`$`"BKP$`4B8P$H*.`````"L0
+M0@*\_T`4@!$2`"60``"`$1(`(8""`D8"`H8`````$`!!!#`"$2;``8*.)2"`
+M`@GX0``E*"`")2!``#("`I8```````%",!0`I8\$`$`4(1B%`!``HH\`````
+M(1B"`!@`(Z8!`%(F0`!"*NC_0!0`````/`"_CS@`OH\T`+>/,`"VCRP`M8\H
+M`+2/)`"SCR``LH\<`+&/&`"PCP@`X`-``+TG`````/__I3#__\8P``""E```
+M```",$(L```#/`,`0!2P`6@D```"/,@!2"0E(```9``*).M1"3P?A2DU0!`$
+M`"$02````$*4`````!@`1@`2&```(Q!"`0`````8`$4`$A```"$88@``````
+M&`!I`!`0``!#$0(`PQ\#`",00P```.*D`0"$)`L`@BCK_T`4`@#G)`@`X`,`
+M````__^E,/\``R06`*,0_P`")```@Y0``````S!C+(`0!0`A$$4`P!)")`X`
+M8!#__T(P/P"B+`8`0!0`````@!`%`"$010`B%4(D"`#@`___0C"`$`4`(1!%
+M`$`0`@#L$T(D__]",`@`X`,`````__^E,/\``R0*`*,0_P`")```@I0`````
+M`S!"+&`)HR0#`$`4__]C,/P(HB3__T,P)1!@``@`X`,`````T/^])RP`OZ\H
+M`+2O)`"SKR``LJ\<`+&O&`"PKR60H````$*6``````!`0BP)`$`4):"``"X`
+M0I8`````!0!`$``````6`$.6`````*,`8!`!``(D``!"E@`````#,$(L(0!`
+M%`$!$R10`1,D=@%"E@````"&`$`0)8@```(`4"8E*&`"`0!B)O__4S"@`8*.
+M)2"``@GX0``0`*8GCP!`$$`8$0`A('``$`"BEP`````"$@(`8`&"I"48@``0
+M`**3`````&(!8J0"`#$F=@%"E@`````J$"("ZO]`%"4H8`)I```0`````*`!
+M@HXE((`"``$%)`GX0``0`*8G=P!`$"4H8`(0`**7`````$(:`@!B`4.F@A`"
+M`'\`0C!D`4*F$`"BEP````!`$0(`?P!",&8!0J8!`&(F__]3,*`!@HXE((`"
+M"?A``!``IB=C`$`0)2A@`A``HY<`````PB(#`&8!0I8`````)1!$`&8!0J8"
+M&0,`?P!C,&@!0Z80`**7`````,`0`@!_`$(P:@%"I@$`8B;__U,PH`&"CB4@
+M@`()^$``$`"F)TP`0!`E*&`"$`"CEP````!"(P,`:@%"E@`````E$$0`:@%"
+MIH(9`P!_`&,P;`%#IA``HI<`````0!`"`'\`0C!N`4*F`0!B)O__4S"@`8*.
+M)2"``@GX0``0`*8G-0!`$"4H8`(0`*.7`````,(C`P!N`4*6`````"401`!N
+M`4*F`A(#`'\`0C!P`4*F0A@#`'\`8S!R`4.F$`"BEP````"`$0(`?P!",'0!
+M0J:@`8*.)2"``@GX0``0`*8G'0!`$``````0`*.7`````((:`P!T`4*6````
+M`"400P!T`4*F=@%"E@`````1`$`0)8@```(`4R8```(\R!=4)$"`$0!@`1`F
+M(8!P`@``!98)^(`")2!``@```J8!`#$F=@%"E@`````J$"("]?]`%$"`$0`!
+M``(D+`"_CR@`M(\D`+./(`"RCQP`L8\8`+"/"`#@`S``O2?@_[TG'`"_KQ@`
+MLJ\4`+&O$`"PKR6`P``4`+&4`````"60H`"`(!$`(2"1`(`@!``A()$`0!`1
+M``,`0B2"$`(`(2""`````CP``$(D"?A``(`@!``E&$``0P!@$`````````.N
+M0!`1``,`0B2"$`(`@!`"`"$08@`(``*N!``1IC@`(!(E,```!``()`,`!R0`
+M``2.0!@&`"$@9``(``6.@!`&`"$01@"`$`(`(1!&`(`0`@`A$$4`(1AR````
+M8Y0```````!#I```@Z0E(```@!`&`"$01@"`$`(`(1!&`(`H`@`(``*.````
+M`"$0H@"`&`0`(1AD`(`8`P`A$$,`!`!$I`@``HX`````(1"B`"$00P`&`$"D
+M`0"$)`0`@BCP_T`4@!`&``@``XXA$$8`@!`"`"$01@"`$`(`(1A#``8`:*0(
+M``..`````"$00P!"`$>D`0#&)"H0T0#,_T`4``````$``B0<`+^/&`"RCQ0`
+ML8\0`+"/"`#@`R``O2?X_[TG)5B@`!8`8I4`````!@#"I*W>`C0``**G`@"B
+MIR48```&`,24`````"4X```'$.0``0!",`<`0!@"`&(HVP!`$"40``!`$`,`
+M(1"B`P``1Z0!`&,D`0#G)`0`XBCT_T`4!Q#D`!0`8I4`````!`#"I/__0C#-
+M`$`0)1````0`PI0`````R`!`$"5(```$``HD0"`)`"$@B0"`(`0`(2")`$`@
+M!``A(&0!&`"()`@`Q8R`$`D`(1!)`(`0`@`A$$D`@!`"`"$H10`8`(.4````
+M````HZ0(`,.,`````"$00P`J`(.4``````(`0Z0E.```@!`)`"$020"`$`(`
+M(1!)`(`@`@`(`,*,`````"$0@@"`&`<`(1AG`(`8`P`A$$,`!@!`I`$`YR0$
+M`.(H]?]`%*W>`C0"`*.7`````"L`8A2`*`D```"GEP````"`$`D`(1!)`(`0
+M`@`A$$D`@"`'`"$@AP`A(((`@"`$``@`PHP`````(2""``8`BJ0"``*5````
+M``@`@J0&``.5`````"$00P`*`(*D"@`#E0`````A$$,`#`""I`X``Y4`````
+M(1!#``X`@J0$``*5`````!``@J0(``*5`````!(`@J0,``*5`````!0`@J00
+M``*5`````&H``!`6`(*D"`#$C"$HJ0"`*`4`(2BI`(`H!0`A(*0```"CEP``
+M``"`$`,`(1!#`(`0`@`A(((``@`"E0`````(`(*D"`#$C``````A(*0``@"C
+MEP````"`$`,`(1!#`(`0`@`A(((`%``")`@`@J0(`,2,`````"$@I``"`*.7
+M`````(`0`P`A$$,`@!`"`"$01``C``,D"@!#I`@`Q(P`````(2"D``(`HY<`
+M````@!`#`"$00P"`$`(`(1!$`#\``R0,`$.D``"GEP````"`$`<`(1!'`(`0
+M`@`A.*(`"`#"C``````A..(`!`#G)`(`ZJ0$`.*4!@`#E0`````A$$,`!@#B
+MI`H``Y4`````(1!#``@`XJ0.``.5`````"$00P`*`.*D!``"E0`````,`.*D
+M"``"E0`````.`.*D#``"E0`````0`.*D$``"E0`````2`.*D`@"GEP````"`
+M$`<`(1!'`(`0`@`A.*(`"`#"C``````A..(`!`#G)`,``B0"`.*D%``"E0``
+M```,`.*D%@`"E0`````.`.*D&``"E0`````0`.*D`0`I)00`PI0`````*A`B
+M`3S_0!1`(`D``0`")`@`X`,(`+TGB/Z])W0!OZ]P`;ZO;`&WKV@!MJ]D`;6O
+M8`&TKUP!LZ]8`;*O5`&QKU`!L*\EH(``)?"@`%`!$R1,`:"O`0`")$P!HX\`
+M````-0!B$"60```"`&(H!0!`$`(``B0'`&`0)1```$\!`!``````10!B$"40
+M``!+`0`0`````!8`PI<`````0`%`$`H`0BI7`$`0*`"D)P``%3PE*&`"`0!S
+M)J`!@HXE((`""?A``$@!IB<\`4`0`````$@!I9,`````20"@$,@7L28)^"`"
+M)2#``T`8$@`0`+`G(1@#`@``8J1(`:*7``````(J`@`^`*`0`0!2)@GX(`(E
+M(,`#0!@2`"$8`P(``&*D`0!2)@H`0BKA_T`4*`"D)S4``!````(\&@#"EP``
+M```7`4`0!`#%)R6```#_``8D$`"D)T`0$`!0`4(D(1BB````8I0`````!@!&
+M$$`0$@`A$((```!CE````````$.D`0!2)@$`$"8#``(J\O]`%$`0$``;```0
+M*`"D)QP`PI<`````_@!`$`8`Q2<E@```_P`&)!``I"=`$!``2`%")"$8H@``
+M`&*4``````8`1A!`$!(`(1""````8Y0```````!#I`$`4B8!`!`F`P`"*O+_
+M0!1`$!```@``$"@`I"<H`*0G```"/```0B0)^$``'`$%)#P`LJ?"`$`:)8``
+M`"@`M2<L`+<G+@"V)RH`L2=`$!``(2BB`A``I"<A(((```"#E````````*.D
+M(1!0`(`0`@`A$%``0!`"`"$050```(.4`````!@`0Z0E*&`"`0!S)J`!@HXE
+M((`""?A``$@!IB?-`$`00!@0`"$8<`"`&`,`(1AP`$`8`P`A*'<`2`&DDT@!
+MHI<`````0!`"```!0C`C(((`&`"DI"$8=0!(`:*7``````(B`@#"$P(``!("
+M`",@@@`@`&2D)2A@`@$`<R:@`8*.)2"``@GX0`!(`:8GL0!`$$`8$``A&'``
+M@!@#`"$8<`!`&`,`(2AW`$@!I)-(`:*7`````$`0`@```4(P(R""`"``I*0A
+M&'4`2`&BEP`````"(@(`PA,"```2`@`C(((`*`!DI"4H8`(!`',FH`&"CB4@
+M@`()^$``2`&F)Y4`0!!`&!``(1AP`(`8`P`A&'``0!@#`"$@=@!(`:*7````
+M`!\`0C`8`(*D(`!C)"$@(P)(`:*7`````$(1`@`?`$(P``""I"$8PP)(`:*7
+M`````((2`@`?`$(P``!BI"4H8`(!`',FH`&"CB4@@`()^$``2`&F)W<`0!!`
+M&!``(1AP`(`8`P`A&'``0!@#`"@`8R0A*.,"2`&DDT@!HI<`````0!`"```!
+M0C`C(((```"DI"$8PP)(`:*7``````(B`@#"$P(``!("`",@@@```&2D)2A@
+M`@$`<R:@`8*.)2"``@GX0`!(`:8G6@!`$`````!`$!``(1!0`(`0`@`A$%``
+M0"@"`"@`IB<A(*8`2`&CDT@!HI<`````0!`"```!0C`C&&(`,`"#I```PI<`
+M`````T!"+`X`0!1`&!``*`"B)"$8(@(A$,(```!"E````````&*D(1BQ`$@!
+MHI<``````A("`#\`0C`0```0&`!BI"$8<`"`&`,`(1AP`$`8`P`A*'$`2`&B
+MEP`````"(@(`PA,"```2`@`C(((`*`"DI"48H``!``(D&`!BI`$`$"8J$!("
+M1?]`%$`0$`!,`:./`````$`P`P`A$-X`:`!"E``````^`**G(3##`(`P!@`A
+M,,8#)2"``B@`I2<```,\;!MC)`GX8`!D#<8D%0!`$"4@@`),`:*/`````$`P
+M`@`A,,(`@#`&`"$PQ@,H`*4G```#/.P<8R0)^&``9`W&)`@`0!``````3`&B
+MCP`````!`$(D3`&BKP,`0BBH_D`4`0`")'0!OX]P`;Z/;`&WCV@!MH]D`;6/
+M8`&TCUP!LX]8`;*/5`&QCU`!L(\(`.`#>`&])^#_O2<<`+^O&`"RKQ0`L:\0
+M`+"O)9"@`"6```````(\``!1)$`0$``A$%``@!`"`"$00@)D#42,``````,`
+M@!``````"?@@`F0-0*P!`!`F`P`"*O/_0!0`````'`"_CQ@`LH\4`+&/$`"P
+MCP@`X`,@`+TG)4B``/__I3`4`"6E%@`CE0`````!`&(P`@!`$"5````!``@D
+M0A`#``$`0C`"`$`0`0`")?__2#""$`,``0!",`(`0!`!``(E__](,,(0`P`!
+M`$(P`@!`$`$``B7__T@P%@"@$"4X```"`"HE0!`'`"$81@```&24`````"$8
+M(@$``&2D(1!'```9`@`A$$,`0!`"`!@`0B0A&"(!``!DI"$00@$``$BD`0#B
+M)/__1S`K$.4`[O]`%$`0!P`(`.`#`````*C_O2=4`+^O4`"^KTP`MZ](`+:O
+M1`"UKT``M*\\`+.O.`"RKS0`L:\P`+"O)9B``"6@H`!@`*:O9`"GKV@`OH]L
+M`+63`````/__\3`X`,`3)8```````CS(%U<D$`"R)P```CPT&%8D)2@@`@$`
+M(B;__U$PH`%BCB4@8`()^$``*`"F)[X!0!``````*`"EDP`````G`*`0```"
+M/`4`H!8`````"?C@`B4@@`($```0)2```@GXP`(E((`")2```@$``R9`(`0`
+M(2!$`@``@J0H`**7``````(J`@`4`*`0__]P,`4`H!8`````"?C@`B4@@`(&
+M```0)2```B@`I9<E((`""?C``@(J!0`E(``"`0`#)O__<#!`(`0`(2!$`@``
+M@J0K$!X"T/]`%"4H(`(```(\["9")&``I(\E*``""?A``!``IB="$!X`9`"C
+MCP`````A$&(`__]1,&``HX\`````%`!BE`````"#`4`0)9```$`0$@`A$%(`
+M`!D"`"$00P!`$`(`8`"CCP`````A$&(`&`!0)!H`0I0`````.`!`$"4H(`(!
+M`"(F__]1,*`!8HXE(&`""?A``"@`IB=O`4`0)2@@`B@`HI<`````'P!",`P`
+M`J8H`*.7`````$(1`P!_`$(P!``"I@(;`P`\``.F`0`B)O__43"@`6*.)2!@
+M`@GX0``H`*8G7`%`$"4H(`(H`**7`````#\`0C`4``*F*`"CEP````""$0,`
+M#P!",$0``J:"&@,`'``#I@$`(B;__U$PH`%BCB4@8`()^$``*`"F)TD!0!``
+M````*`"BEP`````/`$(P3``"IB@`HI<``````A$"`#\`0C`D``*F`@`"E@``
+M```"`$(L1P!`%`$``B0H`*.7`````((2`P`?`$(P#@`"IL(;`P`&``.F)2@@
+M`@$`(B;__U$PH`%BCB4@8`()^$``*`"F)RL!0!`E*"`"*`"CEP`````_`&,P
+M0!@#``8``I8`````)1!#``8``J8H`*.7`````((1`P`/`$(P/@`"IH(:`P`6
+M``.F`0`B)O__43"@`6*.)2!@`@GX0``H`*8G%`%`$"4H(`(H`**7``````\`
+M0C!&``*F*`"CEP`````"$0,`/P!",!X``J:"$@,`#P!",$X``J:"&P,`)@`#
+MI@$`(B;__U$PH`%BCB4@8`()^$``*`"F)_X`0!``````*`"CEP`````/`&,P
+M@!@#`"8``I8`````)1!#`!P``!`F``*F`@`#E@`````8`&(4)2@@`B@`HY<`
+M````@A(#``\`0C!4``*F@AL#`"P``Z8!`"(F__]1,*`!8HXE(&`""?A``"@`
+MIB?B`$`0`````"@`HY<`````#P!C,(`8`P`L``*6`````"400P`L``*F`@`"
+ME@`````#`$(L.`!`%`(``B0H`*.7``````(1`P`?`$(P$``"ID(:`P`(``.F
+M)2@@`@$`(B;__U$PH`%BCB4@8`()^$``*`"F)\4`0!`E*"`"*`"BEP`````/
+M`$(P0``"IB@`HY<``````A$#`#\`0C`8``*F@A(#``\`0C!(``*F@AL#`"``
+M`Z8!`"(F__]1,*`!8HXE(&`""?A``"@`IB>O`$`0`````"@`HY<`````#P!C
+M,(`8`P`@``*6`````"400P`@``*F*`"CEP`````"$0,`#P!",%```J8"&@,`
+M/P!C,`T``!`H``.F`@`#E@`````)`&(4`````"@`HY<``````A$#``\`0C!6
+M``*F`AH#`#\`8S`N``.F`@`"E@`````$`$(L90!`%`,``B0H`**7`````((3
+M`@`2``*F)2@@`@$`(B;__U$PH`%BCB4@8`()^$``*`"F)X``0!`E*"`"*`"C
+MEP`````'`&,P@!@#`!(``I8`````)1!#`!(``J8H`*.7`````,(0`P!_`$(P
+M"@`"IH(2`P`/`$(P0@`"IH(;`P`:``.F`0`B)O__43"@`6*.)2!@`@GX0``H
+M`*8G9@!`$"4H(`(H`*.7``````\`8S"`&`,`&@`"E@`````E$$,`&@`"IB@`
+MHY<``````A$#``\`0C!*``*F`A(#`#\`0C`B``*F@AL#`%(``Z8!`"(F__]1
+M,*`!8HXE(&`""?A``"@`IB=,`$`0)2@@`B@`HY<``````P!C,(`8`P!2``*6
+M`````"400P!2``*F*`"CEP````""$`,`/P!","H``J8"$@,`#P!",%H``J8"
+M&P,`,@`#I@$`(B;__U$PH`%BCB4@8`()^$``*`"F)S(`0!``````*`"CEP``
+M```#`&,P`!D#`#(``I8`````)1!#`!\``!`R``*F`@`#E@`````<`&(4`0!"
+M)B@`HI<`````@A,"`%@``J8E*"`"`0`B)O__43"@`6*.)2!@`@GX0``H`*8G
+M&`!`$``````H`**7``````,`0C"`$`(`6``#E@`````E&&(`6``#IB@`HI<`
+M````@A`"`#\`0C`P``*F`0!")O__4C!@`*./`````!0`8I0`````*Q!"`H#^
+M0!1`$!(``0`")%0`OX]0`+Z/3`"WCT@`MH]$`+6/0`"TCSP`LX\X`+*/-`"Q
+MCS``L(\(`.`#6`"])R5@@``4`**4`````!0`@J46`(F5``````$`(C$"`$`0
+M)5@```$`"R1"$`D``0!",`(`0!`!`&(E__]+,((0"0`!`$(P`@!`$`$`8B7_
+M_TLPPA`)``$`0C`"`$`0`0!B)?__2S`4`**4`````$``0!`E.```!`"9)08`
+MC24(`(HE!``8)`$`#R0%``XD0!`'`"$8H@```&24`````"$8@@$``&2D(1!'
+M```9`@`A$$,`0!`"`!@`0B0A&((!``!DI"$0(@,``$ND)4```"4@``!`$`<`
+M(1!'```9`@`A$$,`0#`"`$`0!``A$$0`P!`"`"$01@`8`$,D(1"C`0``1*0'
+M$(D``0!",`<`0!`A&$,!`0`")?__2#`)``\5``!XI`<``!```&ZD0!`$`"$0
+M1`#`$`(`(1!&`"$02@`8`$"D`0"")/__1#`$`((LYO]`%$`0!``!`.(D__]'
+M,!0`HI0`````*Q#B`,G_0!1`$`<`"`#@`P````#H_[TG$`"RKPP`L:\(`+"O
+M)9"@`"6(P`"MW@(T``"BIP(`HJ<$`**G!@"BIR6````6`"26`````"5H```#
+M``4D(QBM``<09``!`$(P!`!`$$`0$``A$*(#``!#I`$`$"8!`*(E__]-,`0`
+MHBWU_T`4(QBM`!0`0I8`````%``BIO__0C!8`$`0)7```$`0#@`A$$X``!D"
+M`"$00P!`$`(`(1A"`A@`>"0A$%$`&`!CE``````8`$.D1```$B5H``!`$`X`
+M(1!.```9`@`A$$,`0,@"``0`#R=`(`T`(1"D`P``0I0`````0!@"`"$88@#`
+M&`,`(1@C`R$8<0`A$(\`"`!"A`````"`$`(`+`!BI"$@Y`$``(*4`````"(`
+M8J0!``@D(`!BE``````K$`(!(0!`$!X`;"0&`(LE!``*)P0`B25`*`@`(3BK
+M`"4PX`"`(`@`(2"-`$`@!``A$(H`,`!#A`````!`&`,`!@#"E``````A$$,`
+M"`#BI"$P)0$A**D`(2"*`/[_HY0(`(*4`````"$88@```,.D`0`")?__2#`"
+M`(*5`````"L0`@'E_T`40"@(``$`HB7__TTP*Q"P`<7_0!1`(`T``0#")?__
+M3C`4`"*6`````"L0P@&K_T`40!`.``$``B00`+*/#`"QCP@`L(\(`.`#&`"]
+M)\#_O2<X`+^O-`"UKS``M*\L`+.O*`"RKR0`L:\@`+"O):"``"68H``$``(D
+M&`"BIP8``B0:`**G"0`")!P`HJ<,``(D'@"BIR6H``````(\``!")`GX0``4
+M!`0D)8!``)P``!(E$*`"T`!RE@`````6`&*6`````#$`0!````(\``!")"4@
+M``()^$``%`0%)&@`8I8`````%@`"I@H``B00`**O%`"@KP```CRP)T(D)2"`
+M`B4H8`(E,``""?A``"4X0`)]`$`0`````&0-<29H`&*6`````'H-8J8```(\
+M8"]")"4@(`()^$``)2@``@```CS8,$(D)2"``B4H``()^$``)3`@`FP`0!``
+M````&@`"E@````!`$`(`(1!=`!8`0Y0`````%``"E@`````8`$,`$A```"&0
+M0@(%`%(F&@!BE@`````R`$`0```"/```0B0E(``""?A``!0$!21J`&*6````
+M`!8``J8$``(D$`"BKP$``B04`**O```"/+`G0B0E((`")2A@`B4P``()^$``
+M)3A``D@`0!``````>!%Q)FH`8I8`````CA%BI@```CQ@+T(D)2`@`@GX0``E
+M*``"```"/-@P0B0E((`")2@``@GX0``E,"`"-P!`$``````:``*6`````$`0
+M`@`A$%T`%@!#E``````4``*6`````!@`0P`2$```(9!"`@(`4B8<`&*6````
+M`"8`0!````(\``!")"4@``()^$``%`0%)&P`8I8`````%@`"I@0``B00`**O
+M`@`")!0`HJ\```(\L"=")"4@@`(E*&`")3```@GX0``E.$`"$P!`$`````",
+M%7$F;`!BE@````"B%6*F```"/&`O0B0E("`""?A``"4H``(```(\V#!")"4@
+M@`(E*``""?A``"4P(`("`$`0``````$`%20$```2```"/```0B0)^$``)2``
+M`B40H`(X`+^/-`"UCS``M(\L`+./*`"RCR0`L8\@`+"/"`#@`T``O2?`_[TG
+M/`"_KS@`OJ\T`+>O,`"VKRP`M:\H`+2O)`"SKR``LJ\<`+&O&`"PKR60H```
+M`$*6``````!`0BP*`$`4)9B``"X`0Y8!``(D!@!B%````CRD($(D"?A`````
+M``#A```0````````0I8``````%!"+`L`0!0EN```+@!#E@(``B0'`&(4```"
+M/-@R0B0E(&`""?A``"4H0`+2```0````````0I8``````S!"+`(`0!!0`1$D
+M``$1)`$``B00`.(2`@#B*@4`0!`"``(D!P#@$@4`,2;#```0)1```!(`XA(E
+M$```OP``$`````!V`566`````'@!4"84```08@%6)AH`0I8`````L@!`$```
+M```W`#$F@`-5E@`````^!%`F"@``$(@#5B8<`$*6`````*@`0!``````1@`Q
+M)H`#598`````H@-0)H(#5B:A`*`2):```````CPP%UXD0!`4`"$05@```$*4
+M`````````J8E*"`"`0`Q)J`!8HXE(&`""?A``!``IB>6`$`0)2!@`A``HI<`
+M````@A("``0``J80`**7``````(1`@`_`$(P`@`"IA``HI<`````@!`"`#\`
+M0C`>``*F)2@@`@$`,2:@`6*.``````GX0``0`*8G@`!`$"4@8`(0`*.7````
+M`((;`P`>``*6`````"400P`>``*F$`"BEP`````"$@(`/P!","```J80`**7
+M`````((0`@`_`$(P(@`"IA``HI<``````!$"`#\`0C`D``*F)2@@`@$`,2:@
+M`6*.``````GX0``0`*8G8@!`$"4@8`(0`*.7``````(;`P`D``*6`````"40
+M0P`D``*F$`"BEP````""$0(`/P!","8``J80`**7`````#\`0C`H``*F)2@@
+M`@$`,2:@`6*.``````GX0``0`*8G2@!`$"4@8`(0`**7`````((2`@`J``*F
+M$`"BEP`````"$0(`/P!","P``J80`**7`````(`0`@`_`$(P+@`"IB4H(`(!
+M`#$FH`%BC@`````)^$``$`"F)S0`0!`E($`"$`"CEP````""&P,`+@`"E@``
+M```E$$,`+@`"IA``HI<``````A("`#\`0C`P``*F$`"BEP````""$`(`/P!"
+M,#(``J8"``66!``&E@GXP`,(``<F!@`"E@`````3`$`0)2@```8`!B9`(`4`
+M&`"$)"$@Q````(.$`````$`0`P`A$$,`P!`"`"$00P!`$`(```""I`$`I20&
+M``*6`````"H0H@#Q_T`40"`%``$`E"8J$)4"8_]`%#0`$"8!`/<F`P#B*C#_
+M0!0!``(D/`"_CS@`OH\T`+>/,`"VCRP`M8\H`+2/)`"SCR``LH\<`+&/&`"P
+MCP@`X`-``+TGP/^])SP`OZ\X`+ZO-`"WKS``MJ\L`+6O*`"TKR0`LZ\@`+*O
+M'`"QKQ@`L*\EN(``)9"@`"6H`````$*6``````!`0BP$`$`4`````"0`0I8'
+M```0J_]1)```0I8``````S!"+`(`0!!0`1$D``$1)`$``B0.`*(2`@"B*@@`
+M0!`"``(D50`Q)@@`%B3<!%`F&`"@$MH$4R:1```0)1````P`HA(E$```C0``
+M$``````:`$*6`````(4`0!``````90`Q)@(`%B1.!5`F"0``$$P%4R8<`$*6
+M`````'P`0!``````:0`Q)@,`%B0N!5`F+`53)@``8*9U`,`2):```````CPT
+M&%XD)2@@`@$`,2:@`>*.)2#@`@GX0``0`*8G;P!`$````````$*6``````,P
+M0BP&`$`4`````!``HI<``````A("``4``!`(``*F$`"BEP````!"$@(`"``"
+MI@@`!98`````50"@$``````&`*`6```#/,@78R0)^&``)2!``@0``!`(``*F
+M"?C``R4@0`((``*F``!"E@`````#,$(L"@!`%``````0`**7`````((0`@`_
+M`$(P!@`"IA``HI<`````"0``$``1`@`0`**7`````,(0`@`_`$(P!@`"IA``
+MHI<`````P!`"`#\`0C`$``*F)2@@`@$`,2:@`>*.)2#@`@GX0``0`*8G,P!`
+M$````````$*6``````,P0BP1`$`4`````!``HY<``````AL#``0``I8`````
+M)1!#``0``J80`**7`````((1`@`_`$(P`@`"IA``HI<`````$0``$#\`0C`0
+M`*.7`````$(;`P`$``*6`````"400P`$``*F$`"BEP````#"$0(`/P!",`(`
+M`J80`**7`````$(0`@`_`$(P```"I@``8I8``````0!")```8J8!`)0F*A"6
+M`H__0!0*`!`F`0"U)@,`HBI7_T`4`0`")#P`OX\X`+Z/-`"WCS``MH\L`+6/
+M*`"TCR0`LX\@`+*/'`"QCQ@`L(\(`.`#0`"])\#_O2<\`+^O.`"^KS0`MZ\P
+M`+:O+`"UKR@`M*\D`+.O(`"RKQP`L:\8`+"O):"``"7PH````,*7``````!`
+M0BP$`$`49`71)R0`TI<'```0&@!2)@``PI<``````S!"+`(`0!"_`1(D;P$2
+M)`0!PI<`````#`%`$!0`H*\4`*./`````$`0`P`A$%X`!@%"E``````*`$`4
+M````````PI<``````S!"+`,`0!0`````\P``$`@`4B;Q```0!P!2)@``PI<`
+M`````S!"+#0`0!0E*$`")9@```$`4B:@`8*.)2"``@GX0``0`*8G[P!`$,`8
+M$P`A&'$`$`"BEP`````"$@(```!BI!``HI,`````"`!BI`(`<R8(`&(J[O]`
+M%"4H0`(EF```)2A``@$`4B:@`8*.)2"``@GX0``0`*8GV@!`$`````#`(!,`
+M(2"1`!``HY<``````A(#`#\`0C`"`(*D@A,#``$`0C`$`(*L$`"BEP`````_
+M`$(P"@""I((9`P`!`&,P`@!S)@@`8BKE_T`4#`"#K)(``!`EF````0!2)J`!
+M@HXE((`""?A``!``IB>]`$`0)2A``A``HI<`````0AH"````(Z:"$`(`?P!"
+M,`@`(J80`**7`````$`1`@!_`$(P$``BI@$`4B:@`8*.)2"``@GX0``0`*8G
+MJ@!`$"4H0`(0`*.7`````,(B`P`0`"*6`````"401``0`"*F`AD#`'\`8S`8
+M`".F$`"BEP````#`$`(`?P!","``(J8!`%(FH`&"CB4@@`()^$``$`"F)Y0`
+M0!`E*$`"$`"CEP````!"(P,`(``BE@`````E$$0`(``BIH(9`P!_`&,P*``C
+MIA``HI<`````0!`"`'\`0C`P`"*F`0!2)J`!@HXE((`""?A``!``IB=^`$`0
+M)2A``A``HY<`````PB,#`#``(I8`````)1!$`#``(J8"$@,`?P!",#@`(J:"
+M&`,`/P!C,`(`(Z80`**7```````1`@`_`$(P"@`BI@$`4B:@`8*.)2"``@GX
+M0``0`*8G90!`$"4H0`(0`*.7``````(C`P`*`"*6`````"401``*`"*F@AD#
+M`#\`8S`2`".F$`"BEP`````_`$(P&@`BI@$`4B:@`8*.)2"``@GX0``0`*8G
+M4`!`$"4H0`(0`**7`````((:`@`B`".F`A$"`#\`0C`J`"*F$`"BEP````"`
+M$`(`/P!",#(`(J8!`%(FH`&"CB4@@`()^$``$`"F)ST`0!`EF```$`"BEP``
+M``""(P(`,@`CE@`````E&&0`,@`CI@(2`@`_`$(P.@`BIA0`HX\`````0!`#
+M`"$07@`&`54D```"/,@75R0```(\-!A6),`0$P`A@%$````"C@`````5`$`0
+M````````HI8`````!P!",`$`0RP#`$(X`0!"+"488@`&`&`0````````!98)
+M^.`")2#``P<``!````*FP(`3`"&`$0(```66"?C``B4@P`,```*F`0!S)@@`
+M8BKD_T`4P!`3`!0`HH\``````0!")!0`HJ\$`<*7%`"CCP`````J$&(`^/Y`
+M%$``,28!``(D/`"_CS@`OH\T`+>/,`"VCRP`M8\H`+2/)`"SCR``LH\<`+&/
+M&`"PCP@`X`-``+TGP/^])SP`OZ\X`+ZO-`"WKS``MJ\L`+6O*`"TKR0`LZ\@
+M`+*O'`"QKQ@`L*\EB*``#P`")"H`(J8L`"*F```BE@`````#,$(L!@!`%"60
+M@`````(\^`%>)"```B0%```0!`$BI@```CS@`5XD$``")`0!(J:@`4*.)2!`
+M`@``Q8\)^$``$`"F)]X#0!``````$`"CEP````#"$P,`!@`BIH(3`P`!`$(P
+M"@`BIL(2`P`'`$(P#``BI@(1`P!_`$(P#@`BI@``(I8``````$!"+`4`0!0!
+M``(DPA`#``$`0C`"```0"``BI@@`(J80`*.7`````((0`P`!`$(P'``BID(8
+M`P`!`&,P&@`CIA``HI<``````0!",!8`(J8$`-"/`````"4H``(!`!`FH`%"
+MCB4@0`()^$``$`"F)[$#0!``````$`"BEP`````"$@(`'@`BHA``HI,`````
+M'P`BH@``(I8``````$!"+#<`0!0EH```)2@``@$`$":@`4*.)2!``@GX0``0
+M`*8GG0-`$"4H``(0`*.7`````((3`P`N`"*F0A,#``$`0C#(`"*N`AL#``$`
+M8S#,`".N$`"BEP````#_#T(P,``BI@$`$":@`4*.)2!``@GX0``0`*8GB`-`
+M$``````0`**7`````/\/0C`D`"*F$`"BEP````""$P(``0!",",`(J(``"*6
+M``````!00BP,`$`4):```*`!0HXE($`"`@`%)@GX0``0`*8G<P-`$"6@```0
+M`**7``````(1`@#0`"*F!``S)@8`-28"`!<D```"/#085B2`$!0`(1!>``@`
+M4(P`````)2@``@$`$":@`4*.)2!``@GX0``0`*8G7@-`$$`@%``A*)$`$`"C
+MEP`````"$@,`?P!",#(`HJ0E$*``@A@#`#\`8S`X`$.D(2"3`!``HI<`````
+M`!$"`#\`0C!P`(*D)2@``@$`$":@`4*.)2!``@GX0``0`*8G1@-`$$`P%`!P
+M`,0D(2!D`A``HY<``````BL#````@I0`````)1!%````@J0A$-,`@AD#`#\`
+M8S!V`$.D)3!``!``HI<`````/P!",'P`PJ0E*``"`0`0)J`!0HXE($`""?A`
+M`!``IB<L`T`00"`4`"$HDP`0`*.7`````((2`P""`**D)1"@``(9`P`_`&,P
+MB`!#I"4@0``0`**7`````(`0`@`_`$(PC@""I"4H``(!`!`FH`%"CB4@0`()
+M^$``$`"F)Q4#0!!`,!0`C@#$)"$@9`(0`*.7`````((K`P```(*4`````"40
+M10```(*D(2#3``(2`P`_`$(PE`""I"40@`""&`,`/P!C,)H`0Z0E,$``$`"B
+MEP``````$0(`/P!",*``PJ0E*``"`0`0)J`!0HXE($`""?A``!``IB?V`D`0
+M0#`4`*``Q"0A(&0"$`"CEP`````"*P,```""E``````E$$4```""I"$0TP""
+M&0,`/P!C,*8`0Z0E,$``$`"BEP`````_`$(PK`#"I"4H``(!`!`FH`%"CB4@
+M0`()^$``$`"F)]P"0!``````(1"5`A``HY<``````AH#`%``0Z`!``(D&@""
+M$@(`@BH%`$`0``````@`@!(`````)P``$```````````&P"7$@`````B```0
+M`````!``HI<`````0AD"``<`8S#P`".F@A`"``<`0C#R`"*F$`"BEP````!`
+M$`(`!P!",!0``!#L`"*F$`"BEP`````"$0(`!P!",/0`(J80`**7``````<`
+M0C`*```0]@`BIA``HI<``````A$"``<`0C#X`"*F$`"BEP`````'`$(P^@`B
+MIA\`@!8E*``"`0`0)J`!0HXE($`""?A``!``IB>?`D`0)2@``A``HY<`````
+MPB,#`.P`(I8`````)1!$`.P`(J8"$P,`!P!",.X`(J9"$@,`!P!",.@`(J:"
+M$0,`!P!",.H`(J;"&`,`!P!C,.0`(Z80`**7``````<`0C#F`"*F`0`0)J`!
+M0HXE($`""?A``!``IB>!`D`00!@4`"$@=0`0`**7``````(2`@`X`(*D(1AS
+M`!``HI,`````0`!BI"4H``(!`!`FH`%"CB4@0`()^$``$`"F)W`"0!!`&!0`
+M(2!Q`!``HI<``````A("`$H`@J0E&(``$`"BDP````!0`&*D)2@``@$`$":@
+M`4*.)2!``@GX0``0`*8G7P)`$"$8D0(0`**7``````(2`@!9`&*@0!`4`%@`
+M0B0A(&("$`"CDP````"``&(P`P!`$```@Z0`_V(T``""I"4H``(!`!`FH`%"
+MCB4@0`()^$``$`"F)TD"0!!`(!0`(2B1`!``HY<`````0A$#`/\`0C!B`**D
+M:`"$)"$0)`)"&`,`#P!C,```0Z0A(*0"$`"BEP`````!`$(P``""I```(I8`
+M`````$!"+!(`0!0`````!0"`$@`````)`)<2``````P``!``````$`"BEP``
+M``!"$P(``0!",`8``!`F`"*F$`"BEP````!"$P(``0!","@`(J8``"*6````
+M``,P0BPU`$`4)2@``@$`$":@`4*.)2!``@GX0``0`*8G%P)`$`````!`$!0`
+M(1!5`!``HY<`````@AD#`'\`8S"P`$.D`0`")`P`@A("`((J!0!`$``````<
+M`(`2`````!X``!````````````T`EQ(`````&0``$``````0`**7``````<`
+M0C#\`"*F$`"BEP````#"$`(`!P!",`\``!```2*F$`"BEP`````'`$(P_@`B
+MIA``HI<`````PA`"``<`0C`%```0`@$BIA``HI<`````/P!",!(`(J8``"*6
+M``````0P0BPT`$`40!`4`$`8%``A&',`$`"BEP````!"$P(`N`!BI"4H``(!
+M`!`FH`%"CB4@0`()^$``$`"F)]<!0!!`(!0`N`"$)"$@9`(0`*.7`````,`8
+M`P`X`&,P``""E``````E$$,`"P"7%@``@J00`*.7`````,(0`P`B`"*B```B
+ME@`````&0$(L`@!`%,(2`P`L`"*F%`"`%@```````"*6``````!`0BP5`4`4
+M`````!``HY<``````A(#`#\`0C!&`2*FPA@#`!\`8S`&```02@$CIB$04P`*
+M``,DN`!#I`\``B0B`"*B```BE@``````0$(L`@%`%`$``B0+`((2`@""*@4`
+M0!``````N`"`$@````#[```0`0"4)BH`EQ(E*``"]P``$`$`E"8E*``"`0`0
+M)J`!0HXE($`""?A``!``IB>4`4`0`````!``I9,)^,`")2`@`E0!(J80`*67
+M)2`@`@GXP`("*@4`5@$BIJ`!0HXE($`")2@``@GX0``0`*8GA`%`$``````0
+M`*63"?C``B4@(`)8`2*F```BE@`````!0$(LU0!`%``````0`**7``````(2
+M`@`_`$(PSP``$,0`(J8!`!`FH`%"CB4@0`()^$``$`"F)VX!0!``````$`"E
+MDPGXP`(E("`"3@$BIA``I9<E("`""?C``@(J!0!0`2*F)2@``@$`$":@`4*.
+M)2!``@GX0``0`*8G70%`$"4H``(0`**7`````'\`0C`0`"*F$`"BEP````#"
+M$0(`/P!",!0`(J8!`!`FH`%"CB4@0`()^$``$`"F)TT!0!``````$`"EDPGX
+MP`(E("`"4@$BI@``(I8``````4!"+`8`0!0E*``"$`"BEP`````"$@(`/P!"
+M,,8`(J8!`!`FH`%"CB4@0`()^$``$`"F)S@!0!``````$`"BEP````!"$0(`
+M/P!",$@!(J80`**7`````!\`0C!,`2*F```BE@`````"0$(LA`!`%"4H``(!
+M`!`FH`%"CB4@0`()^$``$`"F)R,!0!``````$`"BDP`````J`"*F```BE@``
+M````4$(L=0!`%"4H``(0`*.7``````(2`P!_`$(PU@`BIL(;`P#:`".F`0`0
+M)J`!0HXE($`""?A``!``IB<-`4`0)2!``A``HY<`````'P!C,$`8`P#:`"*6
+M`````"400P#:`"*F$`"CEP````!"$0,`/P!",.(`(J;"&@,`W0`CHJ`!0HXE
+M*``""?A``!``IB?X`$`0`````!``HI,`````!P!",$`1`@#=`".2`````"48
+M8@#=`".B$`"BEP````#"$`(`10``$-\`(J(``"*6``````%`0BQ``$`4)2@`
+M`@$`$":@`4*.)2!``@GX0``0`*8GWP!`$``````0`**7`````#\`0C#"`"*F
+M```BE@``````4$(L,`!`%"4H``(0`*.7`````((1`P!_`$(PU``BID(;`P#8
+M`".F`0`0)J`!0HXE($`""?A``!``IB?(`$`0)2!``A``HY<`````!P!C,,`8
+M`P#8`"*6`````"400P#8`"*F$`"CEP````#"$`,`/P!",.``(J9"&@,`W``C
+MHJ`!0HXE*``""?A``!``IB>S`$`0`````!``HI,``````0!",,`1`@#<`".2
+M`````"488@#<`".B$`"BEP````!"$`(`W@`BH@$`E"8#`((J._U`%(`0%```
+M`"*6``````,P0BPA`$`0!``")*`!0HXE($`"[``%)`GX0``0`*8GEP!`$"4@
+M0`(0`**7``````<`0C#\`"*F$`"BEP````#"$`(`!P!",``!(J:@`4*.[0`%
+M)`GX0``0`*8GB`!`$``````0`**7``````<`0C#^`"*F$`"BEP````#"$`(`
+M!P!",`(!(J8$``(D8`$BI@$``B1>`2*F7`$BIEH!(*84`-"/``````0!(I8`
+M````&0!`$"6@```&`#,F)2@``@$`$":@`4*.)2!``@GX0``0`*8G:@!`$$`8
+M%``A(',`$`"BEP`````"$@(```&"I"48@``0`**3``````(!8J0"`)0F!`$B
+ME@`````J$(("Z_]`%"4H``(``"*6``````-00BP>`$`4`````"6@```&`#,F
+MH`%"CB4@0`(E*``""?A``!``IB=-`$`0)2!``H`0%``A$%,`$`"CEP````"(
+M`T.DH`%"C@4`!28)^$``$`"F)T(`0!``````@!`4`"$04P`0`*.7`````(H#
+M0Z0!`)0F!0""*N;_0!0!`!`F```BE@`````#,$(L"@!`$,K_`B1<`"*F__\"
+M)%X`(J9@`"*F#P`")$0`(J8<``(D1@`BID@`(J8``"*6``````!`0BP)`$`4
+M)2!``J`!0H[*``4D"?A``!``IB<)`$`4`````!X``!``````H`%"CL\`!20)
+M^$``$`"F)Q@`0!``````$`"BEP`````8`"*F%@`BE@`````1`$`4`0`")```
+M(I8``````$!"+`<`0!0`````&``BE@````#"$@(``0!",`4``!`6`"*F&``B
+ME@````#"$P(`%@`BI@$``B0\`+^/.`"^CS0`MX\P`+:/+`"UCR@`M(\D`+./
+M(`"RCQP`L8\8`+"/"`#@`T``O2?@_[TG&`"_KQ0`L:\0`+"O)8"``````CS4
+M04(D"?A``"6(H``7`$`0)2```@```CQP&$(D"?A``"4H(`(1`$`0)2```@``
+M`CS0-4(D"?A``"4H(`(+`$`0)2```@```CSH.4(D"?A``"4H(`(%`$`0)2``
+M`@```CSX/$(D"?A``"4H(`(8`+^/%`"QCQ``L(\(`.`#(`"])^C_O2<0`+^O
+M)1B@````8I0``````$!"+`@`0!0!``(D+@!CE``````$`&(4```"/'@F0B0)
+M^$```````!``OX\`````"`#@`Q@`O2<```````"#E```HI0`````"0!B%```
+M```"`(*4`````/#!1#`"`**4`````/#!0C`$```0(R""````A)0`````(R""
+M``@`X`,E$(``"`*"E``````(`.`#_[]","4H``#`$`4`(1!$````0XP$`$*,
+M`````"488@`&`&`4)1````$`I20"`*(H]?]`%``````!``(D"`#@`P````#H
+M_[TG$`"_KP```CPX4T(D"?A````````E*$```("B,!(`0!`E(```_W^E,```
+M`CR8&D8D@!`$`"$01`"`$`(`(1!&````0Y0`````%`!E$`$``B0!`(0D@P""
+M+/7_0!0`````#@``$"40``````(\.!%&)$`1!``A$$8```!#E``````&`&40
+M`0`")`$`A"1+`((L^/]`%$`1!``E$```$`"_CP`````(`.`#&`"])^C_O2<4
+M`+^O$`"PK___L#`H```2`0`")````CPX4T(D"?A````````E*$```("B,`8`
+M0!#__P(\_W]"-"00H@`F$`("&P``$`$`0BS_`:(X`0!"+`$`HRPE$$,`%0!`
+M%`$``B0E(``````"/)@:1B2`$`0`(1!$`(`0`@`A&$8```!BE``````%``(6
+M``````(`8Y0`````!@!E$`$``B0!`(0D@P""+/+_0!2`$`0`)1```!0`OX\0
+M`+"/"`#@`Q@`O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKR6(H`"<`8*,``````GX
+M0``ED,``)8!``$(``C((`$`0(``",@@`(HX`````!`!`%"```C*]_P(D)(`"
+M`B```C((`$`0"``",@P`(HX`````!`!`%`@``C+?_P(D)(`"`@@``C((`$`0
+M`0`",@0`(HX`````!`!`%`$``C+W_P(D)(`"`@$``C('`$`0```"/$A30B0)
+M^$``(`!$)@(`0!#^_P(D)(`"`B40``(<`+^/&`"RCQ0`L8\0`+"/"`#@`R``
+MO2=@_[TGG`"_KY@`LJ^4`+&OD`"PKR60@``EB``````"/.A60B0)^$``__^D
+M,"6`0``/```2```"/)180B0E($`")2@``G__!C0)^$``$`"G)P<`0!````(\
+M_%1")"4@0`(E*``""?A``!``IB<EB$``)1`@`IP`OX^8`+*/E`"QCY``L(\(
+M`.`#H`"])^C_O2<4`+^O$`"PKP```CPX4T(D"?A``"6`@``E&$``$@`")!0`
+M8A`!``(D$P!B*`4`0!``````"@!@$"40```-```0`````/\!`B0%`&(02H,"
+M-`<`8A0!``(D!@``$``````*`@262@,#)`(`@Q`!``(D)1```!0`OX\0`+"/
+M"`#@`Q@`O2?__X0P)2@``````CR8&D8D@!`%`"$010"`$`(`(1!&````0Y0`
+M````!0!D$``````!`*4D@P"B+/7_0!0E$```"`#@`P````#@_[TG&`"_KQ0`
+ML:\```(\.%-")`GX0``0`+"O)8A```"`(C('`$`0_W\P,@```CSH5D(D"?A`
+M`"4@``(4`$`4)1```B4@``````(\.!%%)$`9!``A$&4```!"E``````&`%$4
+M(1!E`!@`0Y0`````!P!@%"408`!+``0D`0"$)$L`@BSS_T`40!D$`"40```8
+M`+^/%`"QCQ``L(\(`.`#(`"])^C_O2<0`+^O)3B@`"48``````(\V"1&)```
+M`CP``$@DP!$#`"$H1@```**4``````@`1!0!`&,D!`#@$/__8R0E(.``"?@`
+M`8``!B0%```0`0`")#$`8BSR_T`4P!$#`"40```0`+^/``````@`X`,8`+TG
+M)2@``````CP#`(`4.!%&)`@`X`,E$```0!$%`"$01@```$.4``````8`9!`!
+M``(D`0"E)$L`HBSW_T`4`````"40```(`.`#`````,C_O2<T`+^O,`"^KRP`
+MMZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O)?"``"6HH``EL.``___7
+M,"6````EB```)9@`````HI8`````%0!`%"6@``````(\.%-")`GX0```````
+M)9!```"`0C(-`$`4```"/-170B0E($`""?A``"4H```)`$`4)2!``@```CQ(
+M6$(D"?A``"4@0`(#`$`4)2!``@(`I)8``````/^",%$`0!0```(\)3```"4X
+M``````(\.!%%)$`1!@`A&$4```!BE``````#`$04`````"688``!``<D`0#&
+M)$L`PBP!`.,L)!!#`/3_0!1`$08`5@#@$"40``"``.(R!P!`%"6(```"`&26
+M``````@`<(X`````!@``$"4P```$`&26``````P`<(X`````)3```"4X````
+M``(\7`!))````CQ@`$@DP!`&`"$01@"`&`(`(2AI````HI0`````"`!$%"$0
+M:`#8`<./``!"C``````#`&(4`````"6@H``!``<D`0#&)`(`PBP!`.,L)!!#
+M`.W_0!3`$`8`$@#@$(``XC((`$`4)1@```@`@HX`````)(`"`@P`@HX`````
+M!P``$"2((P(0`(*.`````"2``@(DB","%`""C@`````E@`(")8@C`@```CS4
+M5T(D"?A``"4HP`(5`$`0`````!``PHX4`,..$`!DCA0`98XD$$0`)!AE`!``
+MPJX4`,.N`@"BE@``````_T(P`0!%+"40,`("`$`0)1@```$``R0D$*,``@!`
+M$`$``B08`-"N-`"_CS``OH\L`+>/*`"VCR0`M8\@`+2/'`"SCQ@`LH\4`+&/
+M$`"PCP@`X`,X`+TG)1"``"4XH``"`$$$)2A``#\`122#*04`@"$%`",@1```
+M``,D`0`")(`V!``$`,$$``````1(@@`'```0)4````0`P!`$2(,`(S`$``8P
+MP@`E2"8!!$""`"40``$E&"`!P"@%`"$HIP```*2,!`"EC"001``D&&4`)1!B
+M``@`X`,K$`(`_P#G,!H`X!`E&(``$0"@$"4@`````&*0`````!0`1Q``````
+M"P!`$``````!`(0D*Q"%``<`0!`A$&0```!"D``````*`$<0`````/?_0!0`
+M````!@"%$"$09````$>@``#"C``````!`$(D``#"K`@`X`,`````8/Z])YP!
+MOZ^8`;ZOE`&WKY`!MJ^,`;6OB`&TKX0!LZ^``;*O?`&QKW@!L*\E\(``I`&E
+MKZ@!IJ^L`:>OQ`&RC[P!L)?``:*7`````%@!HJ]8&P,D8`&CKS`"Q2=D`:6O
+M```"/(A30B0)^$``)8@``.`!0!`````````"/#!70B0)^$``)2#``PH"PJ?_
+M_T(P"P!`%````CP```(\.%1")"4@P`,)^$``)2@``M$!0!``````_S\",@H"
+MPJ<```(\M&M")`GX0``E(,`#```"/.A60B0*`L27"?A````````E@$``PP$`
+M$B4@P`,```(\E%A")"4H``)__P8T"?A``!``IR>[`4`0)2#``P```CR46$(D
+M)2@``H``!B0)^$``D`"G)[,!0!``````&`"BCQP`HX\```4D!0`$)"001``D
+M&&4`)1!B``(`0!```````0`1)!@`HH\<`*./```%)`(`!"0D$$0`)!AE`"40
+M8@`"`$`0``````(`$20,`L*/``````(`(A(```(\#`+1K_Q40B0E(,`#)2@`
+M`@GX0``0`*8G!`!`%EP!HJ\0`!"6`````&`!L*^H`::/`````$$`PBP#`$`4
+M);```$``!R2H`:>OX`'"CP````!"10(``0`(,6P!J*^"%0(``0!",&@!HJ\`
+M``(\(`)7)````CPX`D(D*Q#B`C,!0!````````#BEE@!HX\`````)!!#`"8!
+M0!````````#BEEP!I(\`````)!!$`"`!0!`0`:8GF`'"CR4@P`,"`.66"?A`
+M`!(!IR<9`4`0!``")```XY8`````*`!B$`4`8B@(`$`0(``")`$``B0;`&(0
+M`@`")!$`8A````(\#0$`$`0`]R8M`&(0D`"R)R$`8B@&`$`00``")`@``B0@
+M`&(0```"/`,!`!`$`/<F)P!B$````CS_```0!`#W)A``LB=``+0G6`=")'`!
+MHJ\"`$*2`````"0``!`#`%,T$`"R)P```CR8"D(D<`&BKP(`4Y(`````'```
+M$#``M">0`+(GX`"T)P```CPX!$(D<`&BKP(`0I(`````$P``$`$`4S3P`+0G
+MF`%")'`!HJ\"`$*2``````P``!`"`%,T``&T)P```CP$```0^`!")!``LB=0
+M`+0G6`=")'`!HJ\"`$*2``````0`4S0```4\2%.E)`GXH``E((`"S0!`%```
+M```EJ```)2"@`@``!CPD6\8D"?C``"4H@`+!`$`00!$5`'`!IX\`````(8#B
+M`+`!I(^T`:6/N`&FCQ@`!Y(```@\J%L()0GX``$````````1E@(``I8`````
+M*Q!1`+``0!0`````$`&BEP`````K$"("H@!`%``````2`:*7`````"L040"=
+M`$`4``````8`!)(`````"@"".`$`0BQL`:6/``````$`HRPD$$,`DP!`%`4`
+M@C@!`$(L:`&FCP`````!`,,L)!!#`(P`0!0`````!P`#D@`````A&","0Q@#
+M`&`!IX\`````"@#B)"H00P""`$`4`````*@!J(\`````*Q#(`I$`0!``````
+M$``"CA0``XX`````PA<#`,@!I8\``````0"D+"0@@@!S`(`4)1@``!@`0HX`
+M````@`!",`4`0!`&``(DW`'#CP````!J`&(0`````!@!I"<```8\``#&)`GX
+MP`!```4D&`&QIP(`Y)8`````&@&DIP8``Y(%``(D!0!B$`H``B0'`&(4`$""
+M-`4``!`:`:*G&@&BEP``````@$(T&@&BIP0``I(`````'0&BHP4``I(`````
+M,@&BHQ@`0HX`````-`&BKS@!LZ\0``*.%``#CA``1(X4`$6.)!!$`"0890`E
+M$&(`!@!`$``````:`:*7```````"0C0%```0&@&BIQH!HI<`````__U",!H!
+MHJ<(``*.#``#C@@`1(X,`$6.)!!$`"0890`E$&(``P!`$`(``B0"```0'`&B
+MHQP!H*,(``*.#``#C@@`1(X,`$6.)!!$`"0890````4D`@`$)"001``D&&4`
+M)1!B``4`0!``````'`&BDP`````(`$(T'`&BHQ@`0HX`````0`!",`4`0!``
+M````'`&BDP`````$`$(T'`&BHX`1%@!D`:>/`````"$01P`8`:,G6`&D)P``
+M:(P$`&6,"`!FC`P`9XP``$BL!`!%K`@`1JP,`$>L$`!C)/;_9!00`$(D`0#6
+M)@<``I(`````(1`B`O__43`"``*6`````"L040!2_T`0``````$`M2:``*(J
+M-O]`%``````$`/<F```"/````CPX`D(D*Q#B`L_^0!0`````/P#`$D$`PBX"
+M`$`4```"/$``%B0\9T(D9`&DCR4HP`)```8D```'/`GX0`#P4N<D,!+6KQD`
+MP!HE*```P"`%`*0!J(\`````(2"(`(`9!0!D`:*/`````"$88@```&*4````
+M````@J0"`&*4``````(`@J0$`&*0``````0`@J`%`&*0``````4`@J`!`*4D
+M*A"V`.K_0!3`(`4`O`'"CR4@P`.D`:6/"?A``"4PP`(3`,`:)2@``(`A!0!D
+M`:./`````"$@@P#`&`4`I`&FCP`````A&&8`!@!BD``````&`(*@!P!BD```
+M```'`(*@`0"E)"H0M@#P_T`4@"$%`*P!IX\```````#VK`H"PI<`````&`#"
+MIRL0%@"<`;^/F`&^CY0!MX^0`;:/C`&UCX@!M(^$`;./@`&RCWP!L8]X`;"/
+M"`#@`Z`!O2<"`**4`````#02AHP`````%`#`$/#!2#```,.4``"BE``````0
+M`&(4,`*')`(`PY0`````\,%B,`L`2!0`````!`#"D``````!`$(P`P!`$`(`
+M8S`K`&`4)1````@`X`,E$,``,`*')#`2A(P`````)`"`$"40`````*64````
+M`$,0!`"`$0(`(3#B````PI0`````(Q"B`!,`0!0``````@##E`````#PP6(P
+M"@!(%``````$`,*0``````$`0C`#`$`0`@!C,`X`8!0E$```"`#@`R40P``"
+M`,*4`````/#!0C`C$`(!`P!`&`````!``,<D__^$)$,@!`#@_X`4)1````@`
+MX`,`````Z/^])Q0`OZ\0`+"O```"/```0B0)^$``)8#```P`0!``````&@!"
+M@`````!`$`(`(Q`"`@`6`@`#%@(``@!!!"480``E&````@``$"408``E$```
+M%`"_CQ``L(\(`.`#&`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@``E
+MF*``"@(BE@`````H`$`4_P`0)````CPX4U(D"?A``@````#P`$(P8``#)`8`
+M0Q``````"?A``B4@(`*9`0,D'`!#%````CP"`&*6`````*``0C"@``,D*@!#
+M$.$`$"0"`&*6`````-``0C#```,D)`!#$.(`$"0"`&*6`````-``0C#0``,D
+M'@!#$.0`$"0"`&*6`````%`!0C!0`0,D&`!#$.,`$"06```0X``0)````CP`
+M`$(D)2`@`@GX0``E*&`"#P!`$,```R0@`%",``````(`8I8`````P`!",`D`
+M0Q0E$``"#P`#,@$``B0%`&(4)1```O#_`B0D@`("`@`0-B40``(@`+^/'`"S
+MCQ@`LH\4`+&/$`"PCP@`X`,H`+TGZ/^])Q``OZ\```(\``!")`GX0```````
+M!@!`$``````<`$*,`````((0`@`"```0`0!","40```0`+^/``````@`X`,8
+M`+TGT/^])RP`OZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O):#``"6P
+MX``EJ(``__^S)!P`8!(AD+0"*Q"R`A8`0!`EB$`"(X`T`B4@``()^,`")2@@
+M`A``0!@`````)2`@`B4H@`(```.2``""D`````````*B`0`0)@``@Z#__Z4D
+M^/^@%`$`A"0CB#0"*Q"Q`NS_0!0`````__]S)N;_8!8AD%0"+`"_CR@`MH\D
+M`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#,`"])]C_O2<@`+^O'`"QKQ@`
+ML*\E@(``)8@``J`!`H[!``4D"?A``!``IB<>`$`0`````!``HI<``````$!"
+M+`(`0!#*``4DSP`%)*`!(HXE("`""?A``!(`IB<2`$`0`````!``HI<`````
+M`$!"+`<`0!0`````$@"BEP````#"$@(``0!",`4``!`\$@*N$@"BEP````#"
+M$P(`/!("KCP2`HX`````(`"_CQP`L8\8`+"/"`#@`R@`O2?H_[TG%`"_KQ``
+ML*\```(\.%-")`GX0``E@(``)1A``$@``B0R`&(0```"/$D`8B@0`$`0C8$"
+M-$(`8B@(`$`00P`")$``8B@I`$`0```"/!L`8!`E$```*P``$```````````
+M(0!B$``````F```0)1```"H00P`-`$`4CX$"-(B!`C0J$&(`&0!`$````CQ-
+M`&(H'`!`$"40``!*`&(H&`!`%````CP2```0#&A")!0`8A0```(\#@``$`QH
+M0B0*`@.6`````(@!8B@.`$`4)1```(X!8B@%`$`4```"/(\!`B0'`&(4````
+M`````CP,:$(D"?A``"4@``("```0`````"40```4`+^/$`"PCP@`X`,8`+TG
+MV/^])R0`OZ\@`+*O'`"QKQ@`L*\ED(``__^Q,"6`0`*@`0*.P0`%)`GX0``0
+M`*8G*`!`$````CPE(```I`!%)````CRF`$8D```"/*@`1R0```(\,%=()$`0
+M!``A$$0`0!@"`"$090```$*4`````!4`410!`(0D__^$)!``HI<``````U!"
+M+`4`0!!`$`0`(1!F````0I0'```0"`("IB$01`!`$`(`(1!'````0I0`````
+M"`("I@GX``$E($`"!```$`H"`J8.`((LX_]`%$`0!``D`+^/(`"RCQP`L8\8
+M`+"/"`#@`R@`O2?8_[TG)`"_KR``LJ\<`+&O&`"PKR60@`#__[$P)8!``J`!
+M`H[!``4D"?A``!``IB<H`$`0```"/"4@```P`$4D```"/#(`1B0```(\-`!'
+M)````CPP5T@D0!`$`"$01`!`&`(`(1!E````0I0`````%0!1%`$`A"3__X0D
+M$`"BEP`````#4$(L!0!`$$`0!``A$&8```!"E`<``!`(`@*F(1!$`$`0`@`A
+M$$<```!"E``````(`@*F"?@``24@0`($```0"@("I@<`@BSC_T`40!`$`"0`
+MOX\@`+*/'`"QCQ@`L(\(`.`#*`"])^#_O2<8`+^O%`"QKQ``L*\E@(`````"
+M/,1H0B0)^$``)8@``A0`0!``````Y`$"C@`````!`$(P#P!`$``````(`@66
+M``````8`H!````(\W&E")`GX0``E(``"!@``$`````````(\R&I")`H")98)
+M^$``)2```A@`OX\4`+&/$`"PCP@`X`,@`+TG0/^])[P`OZ^X`+ZOM`"WK[``
+MMJ^L`+6OJ`"TKZ0`LZ^@`+*OG`"QKY@`L*\EF*``):C``"6PX`#0`+Z/__^1
+M,````CP``$(D"?A```@4!"0ED$``R@%`$@(`$"0EH$`"```"/```0B0E($`"
+M```%/$`"I20)^$``<!(&)`P`4ZX0`%6N%`!6KL@!4:;*`4"F/``")/P!0J8`
+M`D"N`P`")#030J[T$T"N``<")/@30J[__P(D_!-"K@`40JX$%$*N```"/```
+M0B0E($`""?A``"4H``"J`4`0`P`0)`$``B3,`8*N```0/```$"8E((`""?@`
+M`B!`!23_`$(PT`&"IB4@@`()^``"&)@%--(!@J;6`8"F```"/```0B0E((`"
+MT)@%-`GX0``6'`8D)8@``````CP``%`D)2"``H"8!30)^``"`0`&/`$`,28$
+M`"(N^O]`%"4@@`(``!`\```0)@GX``(`G`4T```#/```8R0")P(`"?A@``0`
+M!20!`$(DU`&"IB4@@`()^``"$$`%)"6X0`````(\``!")"4@@`(00`4D"?A`
+M``$`YC8```(\``!")"4@@`(]``4D"?A``)``IB=H`4`0"``0))``HY>E6@(D
+M9`%B%`0`$"0```(\``!")"4@@`(_``4D"?A``)``IB=<`4`0"``0))``HI<`
+M````<A)"I@```CP``$(D)2"``L$`!20)^$``D`"F)U(!0!````(\D`"BEP``
+M```"$P(`<!)"IO__0S`!``(D20%B%`4`$"0EF```)8@``!``L"<```(\``!5
+M)$`P$0`E((`"P``E)@GXH`(A,`8"/`%`$$`0$0`A$`("``!"E``````FF&("
+M`0`Q)D``(B[R_T`4__\"-#,!8A8'`!`D```"/```0B0E((`"OP`%)`GX0`"0
+M`*8G*P%`$`@`$"20`**3``````@"@J84`**7`````'020J86`**7`````'82
+M0J88`**3`````'@20J(8`**7``````(2`@!Y$D*B&@"BDP````![$D*B&@"B
+MEP`````"$@(`>A)"HAP`HI<``````A("`'X20J(<`**3`````'\20J(>`**7
+M``````(2`@"`$D*B'@"BDP````"!$D*B(`"BDP`````!`$(P?!)"HB``HI<`
+M````0A`"``<`0C!]$D*B```"/```0B3``8*N)8@```D`""00`*<GP"@1`",H
+ML0"`*`4`(2BQ`"$H10)`,`@`(1CF````8I0`````@A("`((2HJ```&*4````
+M``(1`@`_`$(PC1*BH```8Y``````@!@#`#P`8S`"`,0D(2#D````@I0`````
+M@A,"`"488@"#$J.@``""E``````"$@(`/P!",(X2HJ```(*4`````((0`@`_
+M`$(PA!*BH```@Y```````!D#`#``8S`$`,0D(2#D````@I0``````A,"`"48
+M8@"/$J.@``""E`````""$0(`/P!",(42HJ```(*0`````#\`0C"0$J*@!@##
+M)"$8XP```&*4`````((2`@"&$J*@``!BE``````"$0(`/P!",)$2HJ```&.0
+M`````(`8`P`\`&,P"`#$)"$@Y````(*4`````((3`@`E&&(`AQ*CH```@I0`
+M`````A("`#\`0C"2$J*@``""E`````""$`(`/P!",(@2HJ```(.0```````9
+M`P`P`&,P"@#$)"$@Y````(*4``````(3`@`E&&(`DQ*CH```@I0`````@A$"
+M`#\`0C")$J*@``""D``````_`$(PE!*BH`P`PR0A&.,```!BE`````""$@(`
+MBA*BH```8I0``````A$"`#\`0C"5$J*@``!CD`````"`&`,`/`!C,`X`Q"0A
+M(.0```""E`````""$P(`)1AB`(L2HZ```(*4``````(2`@`_`$(PEA*BH```
+M@I0`````@A`"`#\`0C",$J*@``"#D```````&0,`,`!C,!``Q"0A(.0```""
+ME``````"$P(`)1AB`)<2HZ```(*4`````((1`@`_`$(PF!*BH```@I``````
+M/P!",)D2HJ`2`,,D(1CC````8I0`````@A("`)H2HJ```&*4``````(1`@`_
+M`$(PFQ*BH```8Y``````@!@#`#P`8S`4`,8D(3#F````PI0`````@A,"`"48
+M8@"<$J.@``#"E``````"$@(`/P!",)T2HJ```,*4`````((0`@`_`$(PGA*B
+MH`$`,28%`"(N//]`%`L`""4```(\;'1")`GX0``E((`")9@``"6(```?`!8D
+M```"/```520#`%`F)2"``B,HT0()^*`"D`"F)Q\`0!!`&!$`D`"BEP`````A
+MF&("(2!P``(2`@`0$X*@)1B``)``HI,`````$1-BH`$`,28#`"(N[O]`%"4@
+M@`(!`&,N`@`"//W_0C0F$&("`0!"+"488@`,`&`4"0`0)````CP``$(D)2"`
+M`A!`!20)^$``)3#@`A(``!`E$(`""```$`@`$"0(`!`D```"/```0B0E((`"
+M$$`%)`GX0``E,.`"!`!`$@```CP``$(D"?A``"4@0`("`,`3)1``````T*^\
+M`+^/N`"^C[0`MX^P`+:/K`"UCZ@`M(^D`+./H`"RCYP`L8^8`+"/"`#@`\``
+MO2?H_[TG$`"_KP```CP``$(D"?A````````0`+^/``````@`X`,8`+TG``&E
+M,`<`H!```````!0")```PJ0V%0(D``#BI`@`X`,!``(D"`#@`R40```(`.`#
+M`0`").0!@HP``````0!"-.0!@JP`%`(D[`&"I#85`B3N`8*DX`&"C``````"
+M`$(T_O\#//__8S0D$$,``P`#).@!@Z1```,DZ@&#I-__`SS__V,T)!!#`+__
+M`SS__V,T)!A#`.`!@ZQ\$H*0``````<`0!#@`84D2!*`I`$``B1,$H*L@``"
+M/"408@#@`8*L#P`")!0`HJP!``(D"`#@`V@2@JP`````X/^])QP`OZ\8`+*O
+M%`"QKQ``L*\ED(``)8B@````$#P``!`F!``FC@GX``(L@`4T)2!``@P`)HX)
+M^``",(`%-"4@0`(0`":."?@``C2`!30E($`""``FC@GX``(X@`4T)2!``@``
+M)HX)^``")(`%-!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])]#_O2<H`+^O%`"E
+MK]P!@XP!``(D#@!B$````CP``$*,`````",0H@#`$`(`'`"BKP```CP``$*,
+M`````",0H@#`$`(`(`"BKP8``!`8`*6O__\")!P`HJ\@`**O`0`")!@`HJ^`
+M`0(\__]"-"00P@`0`**O```"/```0B0)^$``$`"E)R@`OX\`````"`#@`S``
+MO2?@_[TG&`"_KQ0`L:\0`+"O)8B`````$#P``!`F+(`%-`GX``(E,``````"
+M/```0B0E("`""?A```2`!300``,\)1!#`%__!CS__\8T)2`@`@2`!30)^``"
+M)#!&`"4@(`(D@`4T"?@``O__!C08`+^/%`"QCQ``L(\(`.`#(`"])]C_O2<@
+M`+^O'`"SKQ@`LJ\4`+&O$`"PKR68@``EB*``$@`BE@`````>`$`0)9!@`@``
+M`CP``$(D"?A```2`!31__P,\__]C-"000P`@``8\```0/```$"8E($`"!(`%
+M-`GX``(E,$8`)2!``A``)I8)^``"*(`%-"4@0`(2`":6"?@``DB`!304`":.
+M)2!``C2`!30)^``"P#`&``\``!````(\```"/```0B0E(&`""?A```2`!31?
+M_P8\___&-````SP``&,D)2!@`@2`!30)^&``)#!&`````CP``$(D)2!@`@``
+M)HX)^$``+(`%-````CP``$(D)2!@`@GX0``D@`4T@/\#/"000P`(`".6````
+M`"4P0P`8`"*6``````4`0!`$`$(D`!0"`'\``SPD$$,`)3#"`````CP``$(D
+M)2!@`@GX0``D@`4TT`%BE@`````$`$(L&`!`%``````:`"*6``````<`0C`3
+M`$`0__@#)/@30HX`````)#!#`!H`)98`````"`"B+`0`0!``$@4```=",`(`
+M`!`E,,(```?&-/@31JX```(\``!")"4@8`()^$``&(`%-"``OX\<`+./&`"R
+MCQ0`L8\0`+"/"`#@`R@`O2<```````````````#H_[TG$`"_KP```CP``$(D
+M"?A```A`!20K$`(`$`"_CP`````(`.`#&`"])^#_O2<<`+^O&`"RKQ0`L:\0
+M`+"O)9"``"6`H``EB$`"```"/```0B0)^$``'``%)"4@0`#__P(D!`""%`4!
+M`SP```"N(P``$"40```<$R*.`````"00@@"ZV&,T)!A#`'```CP@`$(T)!""
+M``0`0!````.N`$`"/"408@````*N!0"",`8`0!#`!8(P```"C@`````!`$(T
+M```"KL`%@C``````!0!`$`````````*.`````$``0C0```*N```"C@!``SPD
+M$$,``@!`$`$``B10$D2N'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TG'!."C```
+M```(`.`#`````-C_O2<D`+^O(`"TKQP`LZ\8`+*O%`"QKQ``L*\EF(``)8B@
+M`!P3=(X`````!@"!!B6`8`(```(\``!")"0`!20)^$``)3````4!`CRZV$(T
+M)#`B`@$`(C("`$`00``B,@4`QC05`$`0```"/"`3`HX``````@!`$`````!`
+M`,8T)!,"C@`````"`$`0```````!QC0H$P*.``````(`0!``````@`#&-"P3
+M`HX``````@!`$````CP`!,8T``!2)"4@8`()^$`"(``%)`4`(08<$Q&N)2!@
+M`B0`!20)^$`"`0`&)"40@`(D`+^/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#
+M*`"])P@`X`-```(DZ/^])___HS!``&(L"@!`$!``OZ]`&0,`')`%-````CP`
+M`$(D"?A``"$H90``@$,P`@!@%`$``B0E$```$`"_CP`````(`.`#&`"])^#_
+MO2<<`+^O&`"RKQ0`L:\0`+"O__^E,$``HBPM`$`0)9"``$")!0``D`4T```0
+M/```$"8A*"4""?@``B4P```$D`4T)2!``B$H)0()^``")3````B0!30E($`"
+M(2@E`@GX``(E,```#)`%-"4@0`(A*"4""?@``B4P```0D`4T)2!``B$H)0()
+M^``")3```!20!30E($`"(2@E`@GX``(E,```&)`%-"4@0`(A*"4""?@``B4P
+M```<D`4T)2!``B$H)0()^``")3````(``!`!``(D)1```!P`OX\8`+*/%`"Q
+MCQ``L(\(`.`#(`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR68@``E(,``
+M__^E,$``HRPK`&`0)1```!H`@!``````!0"2D```````DA(`!`""D``````E
+MD$("`P"&D```````-@8``@""D```````%`(`)3#"``$`@I```````!("`"4P
+MP@```(*0`````"4PP@!",`8`P!<2`"4PP@`#```00I`2`"60```E,```0(D%
+M`!B0!30``!`\```0)B4@8`()^``"(2@E`AR0!30E(&`"(2@E`@GX``(`@$8V
+M`0`")"``OX\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2?(_[TG-`"_KS``OJ\L
+M`+>O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6P@`!$`*>O2`"BC___
+MMS"JJ@0\`@!`%*JJA#0E(```0`#C+GD`8!`E$`````##D`````!U`&`4````
+M``(`PY0`````!0!C+'``8!0``````@#"E``````&`$(L!P!`%"7P```"`,*4
+M``````X`0BP"`$`4`0`>)`,`'B0$`,>0!0#"D```````$@(`)3CB``8`PI``
+M`````!0"`"4XX@`'`,*0```````6`@`E..(`)CCD``@`PY`)`,*0```````2
+M`@`EJ&(`)JBD`O__M3(*`-.0"P#"D```````$@(`)9AB`@P`PI```````!0"
+M`"688@(-`,*0```````6`@`EF&(")IAD`@X`PY`/`,*0```````2`@`EH&(`
+M)J"$`O__E#(0`-*0$0#"D```````$@(`)9!"`A(`PI```````!0"`"600@(3
+M`,*0```````6`@`ED$("`@#"E``````.`$(L`@!`$":01`+_`%(R0(D7``"0
+M!30``!`\```0)B4@P`(A*"4""?@``B4PX``$D`4T)2#``B$H)0()^``")3"@
+M`@B0!30E(,`"(2@E`@GX``(E,&`"#)`%-"4@P`(A*"4""?@``B4P@`(0D`4T
+M)2#``B$H)0()^``")3!``A20!30E(,`"(2@E`@GX``(E,,`#```"/```0B0E
+M(,`"1`"FCPGX0``E*.`"-`"_CS``OH\L`+>/*`"VCR0`M8\@`+2/'`"SCQ@`
+MLH\4`+&/$`"PCP@`X`,X`+TGZ/^])Q``OZ\3$X,D```"/```0B0E(*``)2A@
+M``GX0``&``8D$`"_CP`````(`.`#&`"])^C_O2<0`+^O```"/```0B03$X0D
+M"?A```8`!B0!``(D$`"_CP`````(`.`#&`"])^C_O2<0`+^O```"/```0B0E
+M(*`````%/+`4I20)^$``!@`&)!``OX\`````"`#@`Q@`O2<(`.`#)1```.#_
+MO2<8`+^O%`"QKQ``L*\E@(``)8C``(`H!0````(\``!")`GX0```8*4D```"
+M/```0B0E(``"`&P%)`,`!B0)^$```@`')`<`0!`E(``"```"/```0B0)^$``
+M`&@%)```(J8!``(D&`"_CQ0`L8\0`+"/"`#@`R``O2?__Z4P"`*"E``````'
+M`$40#``#)'(2@I0`````@`!",`(`0!0+``,D`P`#)`(`P!````````##K`@`
+MX`,E$```"`#@`P$``B3@_[TG'`"_KQ@`LJ\4`+&O$`"PKR60@`!($E"6````
+M`!P`$3*"B!$``@`0,BN`$`````(\``!")`GX0``E*"`")A!0`````SP``&,D
+M)2!``B4H(`()^&```0!&+!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])^#_O2<8
+M`+^O%`"QKQ``L*\EB(``)8"@`````CP``$(D"?A``!1`!21`@!```P`#)`08
+M`P(G&`,`)!!#``(`!B0$,`8"```#/```8R0E("`"%$`%)`GX8``E,$8``0`"
+M)!@`OX\4`+&/$`"PCP@`X`,@`+TGX/^])Q@`OZ\4`+&O$`"PKR6(@``E@*``
+M```"/```0B0)^$``%$`%)$"`$``#``8D!#`&`B<P!@````,\``!C)"4@(`(4
+M0`4D"?A@`"0P1@`!``(D&`"_CQ0`L8\0`+"/"`#@`R``O2?@_[TG'`"_KQ@`
+MLJ\4`+&O$`"PKR60@``EB*``)8#``````CP``$(D"?A``!A`!20!``,D!!@C
+M`B<8`P`D$$,``0`0,@2`,`(```,\``!C)"4@0`(80`4D"?A@`"4P4``!``(D
+M'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGZ/^])Q0`OZ\0`+"O)8"@``8``BX(
+M`$`0__\")````CP``$(D"?A``!Q`!20O`$(P!A`"`@$`0C`4`+^/$`"PCP@`
+MX`,8`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\ED(``)8"@`"6(P`````(\``!"
+M)`GX0``40`4D`"L0`$"`$``#``0D!"`$`B4@I``!``,\`(!C-"<89``D,$,`
+M)3#%``,`(!(`@,8T`0`"/"4PP@````(\``!")"4@0`()^$``%$`%)!P30XX`
+M`04\```"/```0B0E($`""?A``"4H90`<`+^/&`"RCQ0`L8\0`+"/"`#@`R``
+MO2?@_[TG&`"_KQ0`L:\0`+"O)8B``"6`H`````(\``!")`GX0``00`4D!@``
+M$B4P0``$``(D!@`"$M__`B0'```0(`#&-)__`B0&```0)##"`"0PP@`#```0
+M0`#&-+__`B0D,,(````"/```0B0E("`""?A``!!`!208`+^/%`"QCQ``L(\(
+M`.`#(`"])^C_O2<0`+^O```"/```0B0)^$``!(`%-(```SPD$$,``0!"+`(`
+M`R0C$&(`$`"_CP`````(`.`#&`"])^#_O2<8`+^O%`"QKQ``L*\EB(``)8"@
+M`````CP``$(D"?A```2`!30E&$``@``"/"008@`%`$`0`@`")`8``A8`````
+M"P``$``````!``(D"``"$@````"```8\```"/```0B0E("`"!(`%-`GX0``E
+M,&8`&`"_CQ0`L8\0`+"/"`#@`R``O2<(`.`#)1````@`X`,!`*(LX/^])QP`
+MOZ\8`+*O%`"QKQ``L*\EB(``___0,````CP``$(D.!,D)@GX0``&``8D.!,C
+MDCD3(I(``````!("`"488@`Z$R*2```````4`@`E&&(`.Q,FD@``````-@8`
+M```"/```4B0E("`""(`%-`GX0`(E,&8`/!,CDCT3(I(``````!("`"488@#_
+M/P8R`#0&`"4@(`(,@`4T"?A``B4P9@`,```6```"/```0B0E("`""?A```2`
+M!300``8\)2`@`@2`!30)^$`")3!&``T``!````````!")"4@(`()^$``!(`%
+M-.__!CS__\8T```#/```8R0E("`"!(`%-`GX8``D,$8`'`"_CQ@`LH\4`+&/
+M$`"PCP@`X`,@`+TGV/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6@@```
+M`!(\``!2)@GX0`)L@`4T)9A``"4@@`()^$`"<(`%-"6`0``E((`""?A``FR`
+M!30KF%,`(8`3`B6(````B!``)8```"48```E$`(")1@C`B0`OX\@`+2/'`"S
+MCQ@`LH\4`+&/$`"PCP@`X`,H`+TGZ/^])Q``OZ\```(\``!")`GX0`!L@`4T
+M$`"_CP`````(`.`#&`"])^C_O2<4`+^O$`"PKR6`@`````(\``!")`GX0``D
+M@`4T``$&/````SP``&,D)2```B2`!30)^&``)3!&`!0`OX\0`+"/"`#@`Q@`
+MO2?8_[TG(`"_KQP`LZ\8`+*O%`"QKQ``L*\EF(`````"/```0B0)^$``9)@%
+M-,*4`@#_`5(R``%",@,`0!```!$\_P%2.B>0$@```#$F)2!@`@GX(`)P@`4T
+M)8!``"4@8`()^"`";(`%-":``@(F$!("(`"_CQP`LX\8`+*/%`"QCQ``L(\(
+M`.`#*`"])^C_O2<4`+^O$`"PKR6`@`````(\``!")`GX0``@0`4DT`$#EO\`
+M0C`F&&(``0!B+!0`OX\0`+"/"`#@`Q@`O2?@_[TG'`"_KQ@`LJ\4`+&O$`"P
+MKR60@``E@*`````1/```,28)^"`"F(`%-````XX`````(1!#`````JXE($`"
+M"?@@`I2`!30$``..`````"$00P`$``*N)2!``@GX(`*<@`4T#``#C@`````A
+M$$,`#``"KB4@0`()^"`"D(`%-`@``XX`````(1!#``@``JXE($`""?@@`J"`
+M!300``..`````"$00P`0``*N'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGX/^]
+M)QP`OZ\8`+*O%`"QKQ``L*\EB(``)8"@``D``BX(`$`4)9`@`@```CP``$(D
+M"?A``/__!30K$%``!0!`$"4@(`+__P(D_!-"K@T``!`E$``````"/```0B0)
+M^$``)2@``@```SP``&,D)2`@`A"`!30)^&``)3!``/P34*X!``(D'`"_CQ@`
+MLH\4`+&/$`"PCP@`X`,@`+TGZ/^])Q0`OZ\0`+"O)8"``````CP``$(D"?A`
+M`!"`!30```,\``!C)"4@``()^&``__]%,!0`OX\0`+"/"`#@`Q@`O2?8_[TG
+M(`"_KQP`LZ\8`+*O%`"QKQ``L*\EB(``)9"@`"68(`(```(\``!")`GX0`#_
+M'P4D*Q!2``4`0!`E("`"__\")``48JX6```0)1```````CP``$(D"?A``!2`
+M!30E@$`````"/```0B0E("`""?A``"4H0`(`X`,D)(`#`O\?0C````,\``!C
+M)"4@(`(4@`4T"?A@`"4P`@(`%'*N`0`")"``OX\<`+./&`"RCQ0`L8\0`+"/
+M"`#@`R@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``%(`%-````SP`
+M`&,D)2```@GX8`#_'T4P%`"_CQ``L(\(`.`#&`"])_<3@I```````0!".`@`
+MX`,!`$(PX/^])QP`OZ\8`+*O%`"QKQ``L*\ED(``$@"@$"6(0`(```(\``!"
+M)`GX0``$@`4T__X0//__$#8```,\``!C)"4@(`($@`4T"?A@`"0P4`#T$R*.
+M`````"004``1```0]!,BK@```CP``$(D)2!``@GX0``$@`4T``$0/````SP`
+M`&,D)2!``@2`!30)^&``)3!0`/03(HX`````)1!0`/03(JX!``(D'`"_CQ@`
+MLH\4`+&/$`"PCP@`X`,@`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0`+"O)8B`
+M`"60H``EF"`"```"/```0B0)^$``_Q\%)"L04@`%`$`0)2`@`O__`B0$%&*N
+M&0``$"40``````(\``!")`GX0``4@`4T)8!``````CP``$(D)2`@`@GX0``E
+M*$`"`.`#//__8S0D@`,"`!0"`/\?`SPD$$,````#/```8R0E("`"%(`%-`GX
+M8``E,`("!!1RK@$``B0@`+^/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TGZ/^]
+M)Q0`OZ\0`+"O)8"``````CP``$(D"?A``!2`!30"+`(````"/```0B0E(``"
+M"?A``/\?I3`4`+^/$`"PCP@`X`,8`+TG"`#@`P$``B0(`.`#``````@`X`,E
+M$```"`#@`P`````(`.`#`````.C_O2<!``(D!0"B%!``OZ\'`,`4#0`")`4`
+M`!`E$``````"/```0B0)^$```````!``OX\`````"`#@`Q@`O2?@_[TG"P`"
+M)`8`HA`8`+^O'@`#)!(`HQ`E$```"0``$``````&`.8P^`&&K````CP``$(D
+M"?A``&B`!30(```0`0`")#``HH\`````$`"BKP```CP``$(D"?A````````8
+M`+^/``````@`X`,@`+TGX/^])Q@`OZ\P`**/-`"CCP`````0`**O```"/```
+M0B0)^$``%`"CKQ@`OX\`````"`#@`R``O2<``````````-C_O2<@`+^O'`"S
+MKQ@`LJ\4`+&O$`"PKR6(@``E@*`````"/```4B0)^$`"!(`%-`0`!CP```,\
+M``!S)"4@(`($@`4T"?A@`B4P1@`)```2)2`@`@GX0`($0`4D_/\&//__QC0E
+M("`"!$`%)`GX8`(D,$8`(`"_CQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])]#_
+MO2<L`+^O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKS$`H!`EB(`````"
+M/```0B0)^$``!$`%)/S_!CS__\8T```#/```8R0E("`"!$`%)`GX8``D,$8`
+M```"/```0B0)^$``T`<$)`H`$"0```(\``!2)`$`%CP```(\``!5)/S_%#S_
+M_Y0V```"/`L``!```%,D"?B@`L@`!"0E("`""?A``@1`!20E("`"!$`%)`GX
+M8`(D,%0`__\0)@@``!(E("`""?A``A!`!20D$%8`\/]`%``````#```6````
+M``\``!`E$``````"/```0B0E("`""?A```2`!33[_P8\___&-````SP``&,D
+M)2`@`@2`!30)^&``)#!&``$``B0L`+^/*`"VCR0`M8\@`+2/'`"SCQ@`LH\4
+M`+&/$`"PCP@`X`,P`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0`+"O)8B``"6`
+MH`````(\``!2)`GX0`($@`4T!``&/````SP``',D)2`@`@2`!30)^&`")3!&
+M``D``!(E("`""?A``@1`!23\_P8\___&-"4@(`($0`4D"?A@`B0P1@`@`+^/
+M'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\E
+MB*``)2C```$`$"0-`#`2)9"```8`(!(!``(\`@`")`X`(A(E$```$@``$```
+M```0CD(D"?A````````+```0)8!```$``CQ<CT(D"?A````````&```0-!-1
+MK@$``CR`C4(D"?A````````T$U&N)1```AP`OX\8`+*/%`"QCQ``L(\(`.`#
+M(`"])^C_O2<0`+^O```"/```0B0)^$``!$`%)`(4`@`#`$(P$`"_CP`````(
+M`.`#&`"])P````#H_[TG%`"_KP$``B0&`*(0$`"PKP(``B0&`*(0)1````L`
+M`!`````````"/`,``!```%`D```"/```4"0```(\``!")`GX0``E*``")1``
+M`A0`OX\0`+"/"`#@`Q@`O2?H_[TG$`"_KP```CP``$(D"?A```P`!200`+^/
+M``````@`X`,8`+TGZ/^])Q``OZ\E,*`````"/```0B0)^$``#``%)!``OX\`
+M````"`#@`Q@`O2?H_[TG$`"_KP```CP``$(D"``%)`GX0``$``8D$`"_CP``
+M```(`.`#&`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR68@`````(\``!"
+M)`@`!20)^$``(``&)"6```````(\``!2)````CP``%$D)2!@`@GX0`((``4D
+M!`!#,`<`8!`!``(D"?@@`@H`!"0!`!`FZ`,"*O7_0!0E$```(`"_CQP`LX\8
+M`+*/%`"QCQ``L(\(`.`#*`"])^C_O2<4`+^O$`"PKR6`@`````(\``!")`GX
+M0`!H@`4TO_\&)````SP``&,D)2```FB`!30)^&``)#!&`!0`OX\0`+"/"`#@
+M`Q@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``:(`%-````SP``&,D
+M)2```FB`!30)^&``0`!&-!0`OX\0`+"/"`#@`Q@`O2?@_[TG'`"_KQ@`LJ\4
+M`+&O$`"PKR6(@``E$*``)9#`````$#P``!`F4(`%-`GX``(E,$``)2`@`E2`
+M!30)^``")3!``AP`OX\8`+*/%`"QCQ``L(\(`.`#(`"])^#_O2<8`+^O%`"Q
+MKQ``L*\EB(``)8"@`$```RXA`&`0)1```"```BX0`$`4```"/```0B0)^$``
+M5(`%-.#_`R8!``8D!#!F`"<P!@````,\``!C)"4@(`)4@`4T"?A@`"0P1@`/
+M```0`0`")```0B0E("`""?A``%"`!30!``8D!#`&`B<P!@````,\``!C)"4@
+M(`)0@`4T"?A@`"0P1@`!``(D&`"_CQ0`L8\0`+"/"`#@`R``O2?@_[TG&`"_
+MKQ0`L:\0`+"O)8B``"6`H`!```,N'P!@$"40```@``(N#P!`%````CP``$(D
+M"?A``%2`!33@_P,F`0`&)`0P9@````,\``!C)"4@(`)4@`4T"?A@`"4P1@`.
+M```0`0`")```0B0E("`""?A``%"`!30!``8D!#`&`@```SP``&,D)2`@`E"`
+M!30)^&``)3!&``$``B08`+^/%`"QCQ``L(\(`.`#(`"])^C_O2<0`+^O```"
+M/```0B0)^$``3(`%-!``OX\`````"`#@`Q@`O2?H_[TG)3"@```"PC`$`$`0
+M$`"_K__]`B0D,,(`(`#&-````CP``$(D"?A``$R`!300`+^/``````@`X`,8
+M`+TG"P"@J`@`H+C_#\(P#P"BJ`P`HK@/`*.(#`"CF``````2`&84)1```"``
+MXC`'`$`0``````\`HH@,`**8```````@0C0/`**H#`"BN!<`H*@4`*"X%P"B
+MB!0`HI@`````$P"BJ!``HK@!``(D"`#@`P````#8_[TG(`"_KQP`LZ\8`+*O
+M%`"QKQ``L*\EF(``)8#``$``LH\`````)8B@`!<`(XH4`".:``````$`8S!]
+M`&`0#P`")!<`XH@4`.*8``````$`0C`&`$`4```"/```0B0)^$``#``%)'(`
+M4!`/``(D$P`BBA``(IH`````_P]",```0J87`#"*%``PFO\/`CP`@$(T)(`"
+M`L*#$`````(\``!")"4@8`()^$``;(`%-((:`@#__V,P_Q]B,"L04``$`$`0
+M`.!B)/__0C`"```0)8`"`B6``P+_?P(R`@!"I@0`0*(7`"**%``BF@`````"
+M`$(P*0!`%``````7`"**%``BF@`````$`$(P`P!`$`$``B0A```0!`!"HA<`
+M(HH4`"*:`````!``0C`&`$`0``````0`0I(`````"`!"-!8``!`$`$*B%P`B
+MBA0`(IH`````"`!",`8`0!``````!`!"D@`````$`$(T"P``$`0`0J($`$*2
+M``````(`0C0$`$*B%P`BBA0`(IH`````X`!",$(1`@`%`$*B$P`BBA``(IH`
+M````PA0"``8`0J(7`"**%``BF@```````4(P"`!`$/\``B07`"**%``BF@``
+M````?D(P0A("``(``!`'`$*B!P!"HA,`(HH0`"*:`````,(3`@`/`$(P"`!"
+MHA,`(HH0`"*:`````((3`@`!`$(P"0!"HA,`(HH0`"*:``````(3`@`!`$(P
+M"@!"HB40```@`+^/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TG````````````
+M````R/^])S0`OZ\P`+ZO+`"WKR@`MJ\D`+6O(`"TKQP`LZ\8`+*O%`"QKQ``
+ML*\ED(``);B@`"7PP`!$`*>O)9A``@(`PI<```````%",`4"0!`,``,D```"
+M/```0B0)^$``)2C``R6P0`#^`<`2#``#)`8``B0*`.(2!P#B+@8`0!`(``(D
+M`@#B+O8!0!````(\!0``$```0B3R`>(6#``#)````CP``$(D)2!``@GX0``0
+M0`4D8`!4,````CP``$(D)2!``@GX0``E*,`#Y0%`$`,``R03$V.2%!-BD@``
+M````$@(`)1AB`!438I(``````!0"`"488@`6$V:2```````V!@```!`\```0
+M)B4@0`(`@`4T"?@``B4P9@`7$V*2&!-FD@``````,@8`)2!``@2`!30)^``"
+M)3!&``$``CQPH$(D)2!``@GX0``E*.`"`0`")!H`XA(E($`"$P#@$@8``B0%
+M`.(2"``")"``XA(``!$\*P``$```,28``!`\```0)B4@0`(H``4D"?@``B4P
+M```E($`"$$`%)`GX``)`$`8D'0``$```$3P``!`\```0)B@`!20%```0`0`&
+M)```$#P``!`F*``%)"4P```)^``"```1/"4@0`(00`4D"?@``B00!B0-```0
+M```Q)@``$#P``!`F)2!``B@`!20)^``")3```"4@0`(00`4D"?@``D`0!B0`
+M`!$\```Q)B4@0`()^"`"$$`%)```$#P``!`F)2!``A!`!20)^``")3!4`#@3
+M8Y(Y$V*2```````2`@`E&&(`.A-BD@``````%`(`)1AB`#L39I(``````#8&
+M`"4@0`((@`4T"?@``B4P9@`\$V*2/1-FD@``````,@8`)2!``@R`!30)^``"
+M)3!&`"4@0`(E*```"?@``B4P```E($`"!``%)`GX``(E,```)2!``@P`!20)
+M^``")3```"4@0`()^"`"'``%)"4@0`(@``4D"?@``B4P```E($`")``%)`GX
+M``(E,```'!-@KB4@0`()^"`"+``%)"4@0`(P``4D"?@``@4`!B0E($`"-``%
+M)`GX``(%``8D)2!``D0`!20)^``""``&)"4@0`)(``4D"?@``@@`!B0E($`"
+M4``%)`GX``(E,```)2!``DP`!20)^``")3```"4@0`(,0`4D"?@``B4P```E
+M($`"0``%)`GX``(E,```)2!``O@39HX)^``"&(`%-"4@0`)(@`4T"?@``B4P
+M``````(\``!")"4@0`()^$``)2@``"4@0`)0@`4T"?@``B4P```E($`"5(`%
+M-`GX``(E,```)2!``EB`!30)^``")3```"4@0`)<@`4T"?@``B4P```E($`"
+M8(`%-`GX``(!``8D)2!``F2`!30)^``"`0`&)"4@0`)H@`4T"?@``B4P```E
+M($`"*(`%-`GX``(E,```)2!``BR`!30)^``")3```"4@0`)L@`4T"?@``B4P
+M```E($`",(`%-`GX``+__P8D)2!``C2`!30)^``"__\&)"4@0`(X@`4T"?@`
+M`@$`!B0E@``````"/,`4520```(\Q!14)````CP``%$DP!`0`"$050```$6,
+M`````$0`HH\`````!`!`$`"`HB0`$$(L!@!`%`````#`$!``(1!4````1HP)
+M^"`")2!``@$`$":G``(N[O]`%,`0$`````(\``!")"4@0`()^$``)2C``],`
+M0!`#``,D```1/```,28E($`""?@@`BB8!33__P,\_P!C-"000P!Y$F:2````
+M```R!@```!`\```0)B4@0`(HF`4T"?@``B4P1@!Z$F*2```````V`@``%`(`
+M)3#"`'L28Y(``````!(#`"4PP@`E($`"-)@%-`GX``(E,,,`)2!``@GX(`)$
+MF`4T?\`#)"000P!T$F:6`````$(P!@"`/\8P)2!``D28!30)^``")3!&`"4@
+M0`()^"`"2)@%-/S_`SS_#V,T)!!#`'029I8`````@#(&``,``SP`\&,T)###
+M`"4@0`)(F`4T"?@``B4P1@`E($`""?@@`F28!33X_P,\_P]C-"000P!X$F:2
+M```````S!@`'``,\`/!C-"0PPP`E($`"9)@%-`GX``(E,$8`)2!``@GX(`(0
+MF04T_/\#)"000P!T$F:6``````,`QC`E($`"$)D%-`GX``(E,$8``0`"/$BS
+M0B0E($`""?A``"4HP`)U`$`0`P`#)$0`I(\`````#@"`$```$#P$`,.2````
+M``(`8C`"`$`4_@!B,`0`PJ("`,*6``````(`PJ<$`,*2``````0`PJ,``!`\
+M```0)B4@0`(<F`4T"?@``@$`!B0```(\``!")`GX0`#H`P0D```"/```0B0E
+M($`""?A``&"8!30E($`"8)@%-`GX``(!`$8T```"/```0B0E($`"8)@%-`$`
+M!B0)^$``)3@``````CP``$(D)2!``@GX0``E*,`"!P!`%"6````"`,*7````
+M``(`0C0"`,*G/@``$`,``R0```(\``!1)"4@0`()^"`")2@``@$`$"8#``(J
+M^_]`%"4@0`),$D*.``````0`0!````(\``!")`GX0``E($`"```"/```0B0E
+M($`""?A``"2`!31__@8\___&-````SP``&,D)2!``B2`!30)^&``)#!&`/P3
+M98[__P(D!`"B$````CP``$(D"?A``"4@0`(`%&6.__\")`0`HA````(\``!"
+M)`GX0``E($`"!!1ECO__`B0$`*(0```"/```0B0)^$``)2!``O@!1HX`````
+M!0#`$"4@0`(```(\``!")`GX0`!H@`4TW`%7K@@``!`!``(D2`"DCP``````
+M`(*,``````(`0!`E$`````"#K#0`OX\P`+Z/+`"WCR@`MH\D`+6/(`"TCQP`
+MLX\8`+*/%`"QCQ``L(\(`.`#.`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O)9"`
+M`"6(H``E@$`"```"/```0B0)^$``!(`%-/__0S`!``(D&``B$@(`(BH%`$`0
+M``````\`(!(`````)P``$``````&``(D!0`B$@@``B09`"(2```"/"```!``
+M````]!,&C@`````E,&8`"@``$%$``SST$P:.`````"4P9@`%```04@`#//03
+M!HX`````)3!F`!0``SP```(\``!")"4@0`($@`4T"?A``"4PPP`*```0````
+M`/03!HX`````)3!F`!```SP``$(D)2!``@2`!30)^$``)3##`!P`OX\8`+*/
+M%`"QCQ``L(\(`.`#(`"])^C_O2<0`+^O`0`"/'"@0B3<`86,"?A````````0
+M`+^/``````@`X`,8`+TGZ/^])Q``OZ\!``(\U*9")`@`!20)^$``"@`&)!``
+MOX\`````"`#@`Q@`O2?@_[TG&`"_KQ0`L:\0`+"O)8B``````CP``$(D)2@`
+M``GX0``!``8D%`!`$`\`!20!``(\U*9")"4@(`()^$``($X&)`T`0!```!`\
+M```0)@GX``+H`P0D`0`"/-2F0B0E("`"'P`%)`GX0``@3@8D"?@``C0(!"0!
+M``(D&`"_CQ0`L8\0`+"/"`#@`R``O2?@_[TG&`"_KQ0`L:\0`+"O)8B``"6`
+MH`````(\``!")"4H```)^$```0`&)#,`0!``````!P``$B4P```"``*6````
+M`!``0C`#`$`0```"/`$`!B0```(\``!")"4@(`()^$``!)@%-`$``CS4ID(D
+M)2`@`@\`!20)^$``($X&)!X`0!`````````"/```0B0)^$``Z`,$)`$``CS4
+MID(D)2`@`A\`!20)^$``($X&)!(`0!`````````"/```0B0)^$``-`@$)```
+M`CP``$(D)2`@`B4H```)^$```0`&)`8`0!`E("`"`0`"/-2F0B0E*```"?A`
+M``H`!B08`+^/%`"QCQ``L(\(`.`#(`"])\#_O2<\`+^O.`"^KS0`MZ\P`+:O
+M+`"UKR@`M*\D`+.O(`"RKQP`L:\8`+"O);"``$0`I:\```(\``!")`GX0`!(
+M`*:O);A``+H`X!(``!$\```Q)B4@P`()^"`":(`%-```$CP``%(F)2#``FB`
+M!30)^$`"8`!&-"4@P`()^"`")(`%-!``HJ]__P8\___&-"4@P`(D@`4T"?A`
+M`B0P1@```!`\```0)@GX``*@#P0D)2#``@GX(`((F`4T``@&/"4@P`((F`4T
+M"?A``B4P1@`)^``""@`$)`$``CQ(LT(D)2#``@GX0``E*.`"D0!`$```````
+M``(\``!>)`GXP`/H`P0D```1/```,28E(,`""?@@`@B8!33_]Q(\__]2-@``
+M$#P``!`F)2#``@B8!30)^``")#!2`"4@P`()^"`"6)@%-"680``E(,`""?@@
+M`ER8!30EH$``)2#``@GX(`)HF`4T):A```/\!CS__\8T)#!F`OP#`CPE(,`"
+M6)@%-`GX``(E,,(`P/\&/'\`QC0D,(8"/P`"/(#`0C0E(,`"7)@%-`GX``(E
+M,,(`_O\&/!\`QC0D,*8")2#``FB8!30)^``"@!'&-`GXP`,4``0D)2#``@GX
+M(`((F`4T``@&/"4@P`((F`4T"?@``B4P1@`)^,`#"@`$)"4@P`+4F`4T"?@`
+M`B$`!B0E(,`""?@@`@B8!30E(,`"")@%-`GX``(D,%(`"?C``^@#!"0E(,`"
+M"?@@`F"8!30E(,`"8)@%-`GX``(!`$8T```"/```0B0E(,`"8)@%-`$`!B0)
+M^$``)3@``"4@P`)8F`4T"?@``B4P8`(E(,`"7)@%-`GX``(E,(`")2#``FB8
+M!30)^``")3"@`@```CP``%`D)2#``@GX``(E*.`"#@!`%``````)^,`#B!,$
+M)"4@P`()^``")2C@`@@`0!0```(\1`"CCP`````"`&*4``````(`0C0"`&*D
+M```"/```0B0E(,`""?A``&B`!32?_P8D```0/```$"8E(,`":(`%-`GX``(D
+M,$8`)2#``A``IH\)^``")(`%-`$``B1(`*./````````8JP\`+^/.`"^CS0`
+MMX\P`+:/+`"UCR@`M(\D`+./(`"RCQP`L8\8`+"/"`#@`T``O2?8_[TG(`"_
+MKQP`LZ\8`+*O%`"QKQ``L*\ED(``)8"@`"68P``"```6)8@``O__$20```(\
+M``!")"4@0`(`0`4D"?A``"4P``(```(\``!")`GX0``E(&`"#P`0,@```CP`
+M`$(D)2!``@!`!20/`"8R"?A``"4X``(EB$``!``",@@`0!0E$"`"```"/```
+M0B0E($`"%``%)`GX0``E,```)1`@`B``OX\<`+./&`"RCQ0`L8\0`+"/"`#@
+M`R@`O2?_`,8P)3@```H`!"0_``DD`0#*)&(0##S338PU`0`+)$`0!``#`$(D
+M_P!",`@`PA0J&`0`(1"D````0Y``````/`!I%"408``K```0`0`')$`0!``#
+M`$(D_P!","800@$!`$(L)!!#`!L`0!`A$*0```!#D#\`!R05`&<0`````"$0
+MA0#__TB0`````!``!Q$`````(Q!H`$`8`@`A&&(`@!@#`",88@``&0,`(QAB
+M`$`8`P#G`V(D&0!,`!`0``""$0(`(1!(``@`X`/_`$(P"0``$`$`!R0`````
+M!@#K%``````A$*0```!#D``````0`&D4)1!@`/__A"3(_X$$`````"4@```_
+M``8D(1"D````0Y``````!@!F%"408``!`(0D"P""*/C_0!0``````0`")`@`
+MX`,`````_P#&,/__"23__P@D)2```#\`"B3__PLD`P"C)"$0I````$*0````
+M`!H`2A``````+@#"$$`0!``A$*0```!"D``````K$$8``@!`$"$0I``E0(``
+M``!"D``````K$,(`#0!`$`$`A"3__X0D#0`+%25(@`!`$`D``P!")```XJ`A
+M$",!"`!"D``````(`.`#``````$`A"0+`((HW_]`%``````+`(,H`0!C."<0
+M"``!`$(L)!AB`/3_8!0_``(D"P""*!``0!0`````0!`(``,`0B0``.*@(1`%
+M`0L`0I``````"`#@`P`````#`$(D``#BH"$0A0`+`$*0``````@`X`,`````
+M(1`)`0,`0B0``.*@(1"H````1)``````(S#$`$`9!@`C&&8`@!@#`"$89@#`
+M&`,`(1"I````0I``````(Q!$`!H`8@`2&````@!`%``````-``<``P"E)"$0
+M)0$(`$20"``")2$HH@```**0`````",@@@`8`&0`$C```.<#QB1B$`(\TTU"
+M-!D`P@`0$```@A$"`````````*.0`````"$00P#_`$(P"`#@`P`````]`*(L
+M`@!`%``````\``4D_`&%I`@`X`,!``(DR/^])S0`OZ\P`+:O+`"UKR@`M*\D
+M`+.O(`"RKQP`L:\8`+"O)9B``"4XH``ED,``)2A@`G828I8``````A$"``<`
+M0C`/`$*B=A)BD@`````'`$(P$`!"H@``XY0`````SNMC))<`8RSX`&`0)1``
+M``@"8Y9^$J*0``````P`8A`E,```!@"D)`$`QB0$`,(L"`!`$`0``R0A$,0`
+M"`)CEG@20I``````]_]B%``````$``,DY0##$"40`````.*4`````,[K0B1F
+M9@,\9V9C-!@`0P`0&```@Q@#`,,7`@`C&&(`#`!B+`$`0BPC$&(`JJH#/*NJ
+M8S09`$,`$!@``$(8`P``````P!`#`",00P"`$`(`(1!#`"&(H@""$C$F(1#1
+M`!D`120``**0``````X`0J(6`"22`````/\`@S```**0`````"L00P`#`$`0
+M````````I)``````"0!$HB$0T0`9`$4D%P`DD@````#_`(,P``"BD``````K
+M$$,``P!`$````````*20``````@`1*(A$-$`&0!%)!@`))(`````_P"#,```
+MHI``````*Q!#``,`0!````````"DD``````'`$2B(1#1``$`$#S0J!`F)2!@
+M`B4H(`(9`$:0"?@``A``IR<EH$``)2!@`B4H(`()`$:2"?@``A$`IR<EL$``
+M)2!@`B4H(`((`$:2"?@``A(`IR<EJ$``)2!@`B4H(`('`$:2"?@``A,`IR<E
+M&$````)BC@````!N`$`00!`"`````SP,&F,D(1!#````1)0`````$`"BDP,`
+M@R0J$$,``P!`$`,``B0%```0$`"BHQ``HI,`````(Q!$`!``HJ,!``(\E*="
+M)"4@8`(0`*:3"?A``"4H(`(.`$*B`0`"/-"H0B0E(&`")2@@`@X`1I()^$``
+M%`"G)R6@0``0`*23`````/\`@S`1`**3`````"L00P`#`$`0`````!$`I),`
+M````$0"DHP$``CR4IT(D)2!@`A$`II,)^$``)2@@`@D`0J(!``(\T*A")"4@
+M8`(E*"`""0!&D@GX0``4`*<G);!``!``I),`````_P"#,!(`HI,`````*Q!#
+M``,`0!``````$@"DDP`````2`*2C`0`"/)2G0B0E(&`"$@"FDPGX0``E*"`"
+M"`!"H@$``CS0J$(D)2!@`B4H(`((`$:2"?A``!0`IR<EJ$``$`"DDP````#_
+M`(,P$P"BDP`````K$$,``P!`$``````3`*23`````!,`I*,!``(\E*=")"4@
+M8`(3`*:3"?A``"4H(`('`$*B`0`"/-"H0B0E(&`")2@@`@<`1I()^$``%`"G
+M)R480``0`**3`````$`0`@#^`6*F#@!"D@`````*`$*B"P!"H@P`0J(-`$*B
+M(Q"#`@``0J(C$)4"`0!"HB,0E@("`$*B!@!`H@4`0*($`$"B`P!`H@$``B0T
+M`+^/,`"VCRP`M8\H`+2/)`"SCR``LH\<`+&/&`"PCP@`X`,X`+TG>/^])X0`
+MOZ^``+2O?`"SKW@`LJ]T`+&O<`"PKR6@@``EB*`````0/```$"8H`*0G```%
+M/!@:I20)^``"1``&)!``I"<```4\^!FE)`GX``(1``8D`0`"/*2J0B0E((`"
+M)2@@`@GX0``0`*8GZ`!`$``````?`*.3`````/__8R0%`&,LX@!@$"40```@
+M`*.3`````/__8R0%`&,LW`!@$"6(```0`+(G```"/```4R0A@%$"```$D@GX
+M8`(%``4D```"H@$`(B;__U$P!P`B+OC_0!0A@%$"!P`1)!``LB<```(\``!3
+M)"&`40(```22"?A@`@8`!20```*B`0`B)O__43`/`"(N^/]`%"&`40(1`*23
+M`````$`9!`#@`&,P$`"BDP`````?`$(P)1AB`"@`HH\`````)1AB`"@`HZ\3
+M`*63`````,`9!0"``&,P$@"BDP````"`$`(`?`!","488@#"(`0``P"$,"48
+M9``L`**/`````"488@`L`*.O%`"DDP``````$00`\`!",$(H!0`/`*4P)1!%
+M`#``HX\`````)1!#`#``HJ\6`*63`````(`9!0#``&,P%0"BDP````!`$`(`
+M/@!","488@`"(00``0"$,"489``T`**/`````"488@`T`*.O%P"DDP````#`
+M$`0`^`!",((H!0`'`*4P)1!%`#@`HX\`````)1!#`#@`HJ\9`*63`````,`9
+M!0"``&,P&`"BDP````!`$`(`?@!","488@!"(00``0"$,"489``\`**/````
+M`"488@`\`*.O&@"DDP````!`$00`X`!",$(H!0`?`*4P)1!%`$``HX\`````
+M)1!#`$``HJ\;`*63`````,`0!0#X`$(PPB`$``<`A#`E$$0`1`"CCP`````E
+M$$,`1`"BKQP`HI,`````0!`"`'X`0C!"*04``0"E,"4010!(`*./`````"40
+M0P!(`**O'0"DDP````!`$00`X`!",$P`HX\`````)1!#`$P`HJ\>`*.3````
+M`,`0`P#X`$(PPB`$``<`A#`E$$0`4`"DCP`````E$$0`4`"BKT(9`P`!`&,P
+M5`"BCP`````E&&(`5`"CKP``$#P``!`F'P"DDPGX``(#``4DP!$"`(``0C!(
+M`*./`````"400P!(`**O'P"DDPGX``(#``4D0A`"``,`0C!,`*./`````"40
+M0P!,`**O(`"DDPGX``(#``4D@!`"`!P`0C!,`*./`````"400P!,`**O)8@`
+M`"@`L"<```(\``!2)(`0$0`A$`(")2"``@``1HP)^$`"G)@%-`$`(B;__U$P
+M$``B+O?_0!2`$!$`(1BB`P```CP``$(D)2"``B@`9HP)^$``U)@%-`$``B2$
+M`+^/@`"TCWP`LX]X`+*/=`"QCW``L(\(`.`#B`"])^#_O2<<`+^O&`"RKQ0`
+ML:\0`+"O)8B``"60H````$.6``````#L8R1F9@0\9V:$-!@`9``0(```@R`$
+M`,,?`P````(\``!")",@@P`)^$``!0`%)$`0`@```!`\```0)B4@(`*<F`4T
+M"?@``D$`1C0E("`"P)@%-`GX``(E,```-!(RK@$``B0<`+^/&`"RCQ0`L8\0
+M`+"/"`#@`R``O2?H_[TG$`"_KP```CP``$(D"?A``&28!33"%`(`_P%#,``!
+M8C`"`$`0_P%B."<8`@`E$&``$`"_CP`````(`.`#&`"])]C_O2<D`+^O(`"T
+MKQP`LZ\8`+*O%`"QKQ``L*\EB(``):"@`````CP``$(D"?A``&"8!30```,\
+M``!C)"4@(`)@F`4T"?A@``(`1C0```(\``!")"4@(`)@F`4T`@`&)`GX0``E
+M.```%P!`$"6```````(\``!3)````CP``%(D"?A@`N@#!"0)^$`")2`@`B4@
+M0``!`!`F%0`#*KG_@B@!`$(X)!AB`/7_8!2Y_X(H`P!`%"40```#```0%@"`
+MIA8`A*8!``(D)`"_CR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2<(`.`#
+M)1````@`X`,E$```````````````````Z/^])Q``OZ\E.*``)4"```,`XR@)
+M`&`0)1`````I!P`C**<`@"@%`"$H!0$```(\``!")`GX0`!`$Z4D$`"_CP``
+M```(`.`#&`"])^C_O2<0`+^O)4#``"4X@``#`*,H"@!@$"40````,04`(S#%
+M`(`P!@`A,.8````"/```0B0E*``!"?A``$`3QB00`+^/``````@`X`,8`+TG
+MV/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR68@``EB*```@`")`T`(A(E
+MH,```P`B+@8`0!`#``(D`0`")`@`(A(ED```)P``$/__`B0$`"(2`0`2)",`
+M`!#__P(D`@`2)``1$@`C$%(`@!`"`"&`@@!`$Q`F!``#C@`````9`&`4__\"
+M)````CP``$(D)2```@GX0``\``4D"P"`%@0`$:X+``(D#``"K@(``B04``*N
+M__\")!@``JX*``(D(``"I@<``!`B``*F```"/```0B0E(&`")2A``@GX0``E
+M,(`")1!``B0`OX\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TG`P"C+",`
+M8!`E$````!$%`",010"`$`(`(3""`$`3QB0$`,.,`````!H`8!`E$```!`#`
+MK`$``R0$&*,`)Q@#`"`3@HP`````)!!B`"`3@JPD$X*,`````"008@`D$X*L
+M*!."C``````D$&(`*!."K"P3@HP`````)!!B`"P3@JPP$X*,`````"088@`P
+M$X.L`0`")`@`X`,`````V/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR68
+M@``EH*``)8A@`C02)8X``````P"#+N,`8!`E$````!$4`",05`"`$`(`(9`B
+M`D`34B8$`$..`````-H`8!`E$```!`!$C@$``R36`(,4`0`")`(`HI0`````
+M$`!",#(`0!```!`\```0)B4@8`(0@`4T"?@``N`!!B0E(&`"%(`%-``(!CP)
+M^``"``C&-"4@8`(@@`4TW0$&/`GX``+/C\8T%`!"C@``````,0(`(S#"`$`Q
+M!@#@`<8DP#(&`"4@8`)`@`4T"?@``N`!QC0E(&`"1(`%-*X%!CP)^``"P`/&
+M-````CP``$(D)2!@`@GX0`!$F`4T@/\#)"000P`E(&`"1)@%-`GX``(X`$8T
+M)2!@`@28!30`;P8\"?@``B,@QC0R```0````````$"8E(&`"$(`%-`GX``)H
+M`08D)2!@`A2`!30`!`8\"?@``@`$QC0E(&`"((`%--T!!CP)^``"IX_&-!0`
+M0XX`````0!`#`"$00P``,0(`(S#"`,`P!@`P`L8DP#(&`"4@8`)`@`4T"?@`
+M`C`"QC0E(&`"1(`%--<$!CP)^``"F`/&-````CP``$(D)2!@`@GX0`!$F`4T
+M@/\#)"000P`E(&`"1)@%-`GX``(<`$8T)2!@`@28!30`;P8\"?@``B`0QC08
+M`$..__\")`,`8A`/``8D&`!&C@``````-08`(@!"E@``````$0(`\`!","4P
+MP@`@`$*6``````\`0C`E,,(`"``#/``@8S0```(\``!")"4@8`(<@`4T"?A`
+M`"4PPP`,`$*.``````$`0C`'`$`0`0`")`00@@(@$R..`````"400P`'```0
+M(!,BK@00@@(G$`(`(!,CC@`````D$$,`(!,BK@P`0HX``````0!",`<`0!`!
+M``(D!!""`B03(XX`````)1!#``<``!`D$R*N!!""`B<0`@`D$R..`````"00
+M0P`D$R*N#`!"C@`````"`$(P!P!`$`$``B0$$(("*!,CC@`````E$$,`!P``
+M$"@3(JX$$((")Q`"`"@3(XX`````)!!#`"@3(JX,`$*.``````0`0C`'`$`0
+M`0`")`00@@(L$R..`````"400P`'```0+!,BK@00@@(G$`(`+!,CC@`````D
+M$$,`+!,BK@P`0HX`````"`!",`<`0!`!``(D!!""`C`3(XX`````)1!#``<`
+M`!`P$R*N!!""`B<0`@`P$R..`````"000P`P$R*N`0`")"0`OX\@`+2/'`"S
+MCQ@`LH\4`+&/$`"PCP@`X`,H`+TGZ/^])Q``OZ\`$04`(Q!%`(`0`@`A$((`
+M1!-#C``````)`&`0`0`")`@`8A3__P(D```"/```0B0)^$``)2@```(``!``
+M````__\")!``OX\`````"`#@`Q@`O2?H_[TG$`"_KR4X@```$04`(Q!%`(`0
+M`@`A$.(`1!-#C`$``B0,`&(0)4#``!$`8!`E$```!`!B+`X`0!`E$``````"
+M/```0B0)^$``!``%)`@``!`!``(D```"/```0B0E(.``)2@```GX0``E,``!
+M`0`")!``OX\`````"`#@`Q@`O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKR60@```
+M``(\``!")`GX0``E@*``)8A``/]_!3S__Z4T```"/```0B0E($`""?A``"0H
+M)0(```(\``!")"4@0`()^$``9(`%-`8``!(E,$``)0`")",01@!"$`(`"P``
+M$"$PP@`"`,(L"`!`$/__QB0```(\``!")"4@0`()^$``)2@@`@P``!`E$```
+M```"/```0B0E($`""?A``&2`!30```(\``!")"4@0`()^$``)2@@`@$``B0<
+M`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?@_[TG&`"_KQ0`L:\0`+"O)8B````1
+M!0`C$$4`@!`"`"$0(@)$$T.,`0`")`H`8A````(\(@!@$"40```"``(D&`!B
+M$`,``B0*`&(0)1```!L``!````````!")"4@(`((``4D"?A```$`!B04```0
+M`0`")```$#P``!`F)2`@`@@`!20)^``"`@`&)"4@(`(H``4D"?@``@X`!B0(
+M```0`0`")````CP``$(D)2`@`B@`!20)^$``"@`&)`$``B08`+^/%`"QCQ``
+ML(\(`.`#(`"])^C_O2<0`+^O`!$%`",010"`$`(`(1""`$030XP`````"@!@
+M$`$``B0)`&(4)1```````CP``$(D"?A``!0`!20`>$(P`@``$,(2`@`E$```
+M$`"_CP`````(`.`#&`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@```
+M$04`(Q!%`(`0`@`A$"("1!-#C`$``B0(`&(0```"/"L`8!`E$````@`")"$`
+M8A`E$```)@``$````````$(D)2`@`@@`!20)^$``"``&)"6```````(\``!3
+M)````CP$```0``!2)`GX0`(*``0D`0`0)N@#`BH&`$`0)2`@`@GX8`(4``4D
+M`'A",/;_0!0````````"/```0B0E("`""``%)`GX0``E,```"```$.@#`BH`
+M``(\``!")"4@(`(L``4D!``&)`GX0``E.```(`"_CQP`LX\8`+*/%`"QCQ``
+ML(\(`.`#*`"])R4@P``0`*./(`"ICR0`JH\H`*B/`````/W_8B0"`$(L`@!`
+M%``,!CR`-@,`_P^$,!@`HH\`````@!0"`"4@@@``$P<``P`#/`#P8S0D$$,`
+M)2""``$``C$#`$`0)2"&```!`CPE(((`$``",0(`0!``(`(\)2""``(`0!$`
+M`@(\)2""``L`I*@(`*2X__\")`X`(A%`$PD`!P`#/`#@8S0D$$,`#P"BJ`P`
+MHK@+`**("`"BF`!``SPE$$,`"P"BJ`@`HK@$```0!``",0\`H*@,`*"X!``"
+M,1``0!!```,\"P"BB`@`HI@`````)1!#``L`HJ@(`**X#P"CB`P`HYCX_P0\
+M,`"BCP`````D$$0`)1AB``\`HZ@,`*.X"`#@`P$``B0(`.`#)1````L`HH@(
+M`**8`"`#/"400P`+`**H"`"BN`@`X`,`````$`"CCP`````'`.`0``````\`
+MHH@,`**8%`!@%"401@`2```0`!!"-``````,`&`0`````!0`HH\`````"P!#
+MB`@`0Y@`````"P"CJ`@`H[@/`*:H#`"FN`8``!`E$&``"P"@J`@`H+@`$,(T
+M#P"BJ`P`HK@7`*"H%`"@N!<`HH@4`**8`````!,`HJ@0`**X"`#@`P$``B07
+M`*.(%`"CF``````!`&,P1P!@$`\``B07`**(%`"BF`````#^'T(P``#"I!,`
+MHH@0`**8``````(4`@`"`,*D!`#`H!,`HH@0`**8``````$`0C`<`$`4````
+M`!,`HH@0`**8``````(`0C`"`$`0`0`")`0`PJ`3`**($`"BF``````(`$(P
+M!0!`$``````$`,*0``````(`0C0$`,*@$P"BB!``HI@`````!`!",`4`0!``
+M````!`#"D``````$`$(T!`#"H`L`HH@(`**8`````((4`@`/`$(P!0#"H!<`
+MHH@4`**8`````$(3`@`&`,*@$P"BB!``HI@```````]",`(2`@`'`,*@$P"B
+MB!``HI@`````\`!",`(1`@`(`,*@"@#`H`L`P*`E$```"`#@`P`````(`.`#
+M````````````````!`"BD``````(`$(T!`"BH`@`X`,E$`````````````#@
+M_[TG'`"_KQ@`LJ\4`+&O$`"PKR6(@`````(\``!")-"8!30)^$``%AP&)"6`
+M``````(\``!2)"4@(`*`F`4T"?A``@$`!CP!`!`F"``"*OK_0!0E("`"```"
+M/```0B0)^$```)P%-`(>`@`"(0,`#P!C,``9`P````(\``!")"4@@P`)^$``
+M"``%)!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])\#_O2<X`+^O-`"WKS``MJ\L
+M`+6O*`"TKR0`LZ\@`+*O'`"QKQ@`L*\EH*``):C``"6PX`!0`+>/__^1,```
+M`CP``$(D"?A``/`N!"0EF$``-@%@$@(`$"0ED&`"```"/```0B0E(&`"```%
+M/&`:I20)^$``<!(&)`P`=*X0`'6N%`!VKL@!<:;*`6"F/P`")/P!8J8``F"N
+MK"Y@KL@N8*X`!P(DT"YBKO__`B34+F*NV"YBKMPN8JX```(\``!")"4@8`()
+M^$``)2@``!<!0!`#`!`DR`%#EAOQ`C0.`&(4```0/```$"8E($`"`*(%-`GX
+M``(E,```)2!``GR8!30)^``"&0`&)````CP``$(D"?A``.@#!"0```(\``!"
+M)"4@0`()^$``($`%)/\`0S`"&0,`S`%#K@\`0C#0`4*F_O]C)`,`8RSX`&`0
+M#0`0)````CP``$(D)2!``@GX0``8F`4TT@%"I@$``CS\R$(D"?A``"4@0`+L
+M`$`0#@`0),P!0HX`````!`!"+`@`0!0```(\``!")"4@0`(`F`4T"?A```<`
+M!B0'```0```"/```0B0E($`"`)@%-`GX0`!'``8D```"/```0B0)^$``T`<$
+M)`$``CR@PD(D"?A``"4@0`+4`4*F\`!",!```R3.`$,4#0`0)````CP``$(D
+M)2!``L$`!20)^$``$`"F)\8`0!`(`!`D$`"BEP``````,$(LP0!`%`4`$"00
+M`**7`````'`28J8```(\``!")"4@0`()^$``$$`%)!@`0S#"&`,``@`")+0`
+M8A0*`!`D```"/```0B0E($`"/P`%)`GX0``0`*8GK`!`$`@`$"00`**7````
+M`'(28J8EH```)8```````CP``%$D)2!``L``!28)^"`"$`"F)YX`0!`!`!`F
+M$`"BEP`````FH(("0`,"+O;_0!0E($`"__\"-)8`@A8'`!`D"@`").838J8#
+M``(D\!5BIB6````&`&,F"P`$)$`0$``A$%``@!`"`"$04`"`$`(`(1!#`.@3
+M1*0!`!`F"@`"+O?_0!1`$!``)8```````CS0+$HD`@!I)@P`:"8+``8D"`!G
+M)D`0$``A*%,`(1A*````9)0`````^!6DI"$820#P%62D(1!0`(`0`@`A$%``
+M@!`"`"$82`"H%F:D(1!'`!`61J0!`!`F`P`"+N[_0!1`$!`````"/```0B0E
+M($`""?A``'`2929B`$`0"``0),P!0HX`````!`!"+"$`0!0`````BA)BE@``
+M```=`$`0```1/```,28E($`"`)@%-`GX(`('0`8D```0/```$"8)^``"T`<$
+M)`$``CR@PD(D"?A``"4@0`+6`4*F)2!``@"8!30)^"`"!P`&)`GX``+0!P0D
+MU@%"E@````#P`$(P(``#)`0`0Q`-`!`D/0``$`````"*$F"F```"/```0B0E
+M($`"OP`%)`GX0``0`*8G-`!`$`@`$"00`**7`````'028J8(`D*F```"/```
+M0B3``4*N`0`"/$S+0B0)^$``)2!``@```CP``$(D"?A``"4@0`(EH```)8``
+M`!\`%B0```(\``!5)`0`<28E($`"(RC0`@GXH`(0`*8G&`!`$$`8$``0`**7
+M`````"&@@@(A('$``A("`"@L@J`E&(``$`"BDP`````I+&*@`0`0)@,``B[M
+M_T`4`0"#+@(``CS]_T(T)A""`@$`0BPE&&(`!`!@%`D`$"0*```0)1!``@@`
+M$"0$`&`2```"/```0B0)^$``)2!@`@(`X!(E$`````#PKC@`OX\T`+>/,`"V
+MCRP`M8\H`+2/)`"SCR``LH\<`+&/&`"PCP@`X`-``+TGZ/^])Q0`OZ\0`+"O
+M)8"``````CP``$(D"?A``'`2!28```(\``!")`GX0``E(``"%`"_CQ``L(\(
+M`.`#&`"])Z#_O2=<`+^O6`"^KU0`MZ]0`+:O3`"UKT@`M*]$`+.O0`"RKSP`
+ML:\X`+"O):"```"``C00`**O()@"-!0`HJ]550(\555"-"``HJ^JJ@(\JJI"
+M-"0`HJ]F9@(\9F9"-"@`HJ^9F0(\F9E"-"P`HJ\EN```$`"B)S``HJ\8`+XG
+M@(`7`#``HX\`````(1!P````4HP`````)2"``@```SP``&,D"?A@`"4H0`(A
+M@-`#```"KB6(````%!$`)8!1`"4@@`(E*$`"```"/```0B0)^$``)3```B4@
+M@`(```,\``!C)`GX8``E*$`"`P!0$`$`,28P```0)1`````!(BKN_T`4`!01
+M`"6(```@`+,G```"/```5B0```(\``!5)(`0$0`A$&("``!0C``````E((`"
+M)2A``@GXP`(E,``")2"``@GXH`(E*$`"`P`"$@$`,288```0)1````0`(BKP
+M_T`4@!`1`(`0%P`P`*2/`````"$8@@`A$,(#``!EC```1HP```(\``!")`GX
+M0``E((`"`0#W)@(`XBJY_T`4@(`7`````CP``$(D"?A``&0`!"0!``(D7`"_
+MCU@`OH]4`+>/4`"VCTP`M8](`+2/1`"SCT``LH\\`+&/.`"PCP@`X`-@`+TG
+M__^E,``!HC`&`$`0.!,")```PJ34%P(D``#BI`@`X`,!``(D@`"B,`L`0!``
+M````BA*"E``````'`$`0``````@)`B0``,*DK`H")```XJ0(`.`#`0`")`@`
+MX`,E$```"`#@`P$``B30_[TG*`"_KR0`LZ\@`+*O'`"QKQ@`L*\EF(``)8A@
+M`B608`((`D.6`0`")`8`8A3@`5`F```"/```0B00``4D"?A``!``IB<$``"N
+MAA(BE@`````'`$`0`0`")`0``JYV$B*6``````(`0!0#``(D!``"KHH2(I8`
+M````!@!`$`@)`B0$``*.``````0`0C0$``*N"`D")!```J:L"@(D$@`"IC@3
+M`B0,``*FU!<")`X``J8```*.``````$``SP#`&,T)1!#``(``SPE$$,`"@`#
+M)`@``Z:```,D"@`#IM__`SS__V,T)!!#`+__`SS__V,T)!!#`````JYZ$B*6
+M``````T`0!````(\``!")"4@8`(/``4D"?A``$@21B8&`$`0`0`")$P20JX`
+M``*.@``#/"400P````*N#0`")!0``JX!``(D:!)"KB@`OX\D`+./(`"RCQP`
+ML8\8`+"/"`#@`S``O2<```````````````#@_[TG'`"_KQ@`LJ\4`+&O$`"P
+MKR60@``EB*`````0/```$"8$`":."?@``BB`!30E($`"#``FC@GX``(L@`4T
+M)2!``A``)HX)^``",(`%-"4@0`((`":."?@``C2`!30E($`"```FC@GX``(@
+M@`4T'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGT/^])R@`OZ\4`*6OW`&#C`$`
+M`B0)`&(0__\"-`T`8!````(\!@`")`D`8A`(``(D%`!B%`$`HB3__P(T'`"B
+MKP<``CS__T(T#0``$"``HJ\```(\``!"C``````C$*(`P!`"`!P`HJ\```(\
+M``!"C``````C$*(`P!`"`"``HJ\!`*(D&`"BKX`!`CS__T(T)!#"`!``HJ\`
+M``(\``!")`GX0``0`*4G*`"_CP`````(`.`#,`"])^#_O2<8`+^O%`"QKQ``
+ML*\EB(`````0/```$"8H@`4T"?@``B4P``````(\``!")"4@(`()^$``!(`%
+M-`0``SPE$$,`S_\&//__QC0E("`"!(`%-`GX``(D,$8`)2`@`B"`!30)^``"
+M__\&-!@`OX\4`+&/$`"PCP@`X`,@`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0
+M`+"O)8B``"60H``2`$*6`````!L`0!`EF"`"```"/```0B0)^$``!(`%-!``
+M!CP``!`\```0)B4@(`($@`4T"?@``B4P1@`E("`"$`!&E@GX``(D@`4T)2`@
+M`A(`1I8)^``".(`%-!0`1HXE("`",(`%-`GX``+`,`8`#P``$````CP```(\
+M``!")"4@(`()^$``!(`%-.__!CS__\8T```#/```8R0E("`"!(`%-`GX8``D
+M,$8````"/```0B0E("`"``!&C@GX0``H@`4T```"/```0B0E("`""?A``""`
+M!32`_P,\)!!#``@`0Y8`````)3!#`!@`0I8`````!0!`$`0`0B0`%`(`?P`#
+M/"000P`E,,(````0/```$"8E("`""?@``B"`!330+F:.__\"//\`0C0D,,(`
+M&@!"E@``````$@(``/]","4PP@#0+F:N)2`@`@GX``(8@`4T```"/```0B0E
+M("`""?A```1`!23__P,\)!!#`!P`1HX`````_?_&),`P!@#__\8P)2`@`@1`
+M!20)^``")3!&`"``OX\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2?H_[TG$`"_
+MKP```CP``$(D"?A```A`!20K$`(`$`"_CP`````(`.`#&`"])^#_O2<8`+^O
+M%`"QKQ``L*\EB(``)8"@`````CP``$(D"?A``,``!20E($``__\")`,`@A0E
+M$```00``$````*X%`0(\NMA"-"08@@`(``(\)!""``0`0!````.N`$`"/"40
+M8@````*N!0"",`8`0!#`!8(P```"C@`````!`$(T```"KL`%@C`&`$`0(`""
+M,````HX`````0`!"-````JX@`((P``````D`0!``````:!(BC@`````%`$`0
+M`$`#/````HX`````)1!#`````JX```*.`$`#/"000P`7`$`0```0/%`2)*X`
+M`!`F)2`@`@GX``+$``4D5!(BKB4@(`()^``"R``%)%@2(JXE("`""?@``LP`
+M!21<$B*N)2`@`@GX``+0``4D8!(BKB4@(`()^``"U``%)&02(JX!``(D&`"_
+MCQ0`L8\0`+"/"`#@`R``O2<X+(*,``````@`X`,`````V/^])R0`OZ\@`+2O
+M'`"SKQ@`LJ\4`+&O$`"PKR68@``EB*``."QTC@`````+`($&)8!@`@```CP`
+M`$(D)``%)`GX0``E,``````"/```0B0E(&`""?A``"0`!20%`0(\NMA"-"0P
+M(@)``"(R%0!`$`$`(C(\+`*.``````(`0!``````0`#&-$`L`HX``````@!`
+M$````````<8T1"P"C@`````"`$`0`````(``QC1(+`*.``````(`0!`!`"(R
+M``3&-`(`0!``0`(\!P#&-"00(@("`$`0"``"/"4PP@````(\``!2)"4@8`()
+M^$`"H``%)`4`(08X+!&N)2!@`B0`!20)^$`"`0`&)"40@`(D`+^/(`"TCQP`
+MLX\8`+*/%`"QCQ``L(\(`.`#*`"])P@`X`.```(DZ/^])___HS"``&(L"@!`
+M$!``OZ]`&0,`'(@%-````CP``$(D"?A``"$H90``@$,P`@!@%`$``B0E$```
+M$`"_CP`````(`.`#&`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O__^E,(``HBPM
+M`$`0)9"``$")!0``B`4T```0/```$"8A*"4""?@``B4P```$B`4T)2!``B$H
+M)0()^``")3````B(!30E($`"(2@E`@GX``(E,```#(@%-"4@0`(A*"4""?@`
+M`B4P```0B`4T)2!``B$H)0()^``")3```!2(!30E($`"(2@E`@GX``(E,```
+M&(@%-"4@0`(A*"4""?@``B4P```<B`4T)2!``B$H)0()^``")3````(``!`!
+M``(D)1```!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])]C_O2<@`+^O'`"SKQ@`
+MLJ\4`+&O$`"PKR68@``E(,``__^E,(``HRPK`&`0)1```!H`@!``````!0"2
+MD```````DA(`!`""D``````ED$("`P"&D```````-@8``@""D```````%`(`
+M)3#"``$`@I```````!("`"4PP@```(*0`````"4PP@!",`8`P!<2`"4PP@`#
+M```00I`2`"60```E,```0(D%`!B(!30``!`\```0)B4@8`()^``"(2@E`AR(
+M!30E(&`"(2@E`@GX``(`@$8V`0`")"``OX\<`+./&`"RCQ0`L8\0`+"/"`#@
+M`R@`O2?(_[TG-`"_KS``OJ\L`+>O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O
+M$`"PKR6P@`!$`*>O2`"BC___MS"JJ@0\`@!`%*JJA#0E(```@`#C+H@`8!`E
+M$`````##D`$``B0,`&(0`@!B*`4`0!``````"@!@$"40``!^```0``````4`
+M`B06`&(0)1```'D``!``````$P``$`4`'B0"`,.4``````4`8RQR`&`4````
+M``(`PI0`````!@!"+`D`0!0E\````@#"E``````.`$(L!`!`%`$`'B0"```0
+M`P`>)`<`'B0$`,>0!0#"D```````$@(`)3CB``8`PI```````!0"`"4XX@`'
+M`,*0```````6`@`E..(`)CCD``@`PY`)`,*0```````2`@`EJ&(`)JBD`O__
+MM3(*`-.0"P#"D```````$@(`)9AB`@P`PI```````!0"`"688@(-`,*0````
+M```6`@`EF&(")IAD`@X`PY`/`,*0```````2`@`EH&(`)J"$`O__E#(0`-*0
+M$0#"D```````$@(`)9!"`A(`PI```````!0"`"600@(3`,*0```````6`@`E
+MD$("`@#"E``````.`$(L`@!`$":01`+_`%(R0(D7``"(!30``!`\```0)B4@
+MP`(A*"4""?@``B4PX``$B`4T)2#``B$H)0()^``")3"@`@B(!30E(,`"(2@E
+M`@GX``(E,&`"#(@%-"4@P`(A*"4""?@``B4P@`(0B`4T)2#``B$H)0()^``"
+M)3!``A2(!30E(,`"(2@E`@GX``(E,,`#```"/```0B0E(,`"1`"FCPGX0``E
+M*.`"-`"_CS``OH\L`+>/*`"VCR0`M8\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`
+MX`,X`+TG`````.C_O2<0`+^O+"R#)````CP``$(D)2"@`"4H8``)^$``!@`&
+M)!``OX\`````"`#@`Q@`O2?H_[TG$`"_KP```CP``$(D+"R$)`GX0``&``8D
+M`0`")!``OX\`````"`#@`Q@`O2?H_[TG$`"_KP```CP``$(D)2"@````!3S@
+M+*4D"?A```8`!B00`+^/``````@`X`,8`+TG"`#@`R40``#@_[TG'`"_KQ@`
+MLJ\4`+&O$`"PKR6(@``E$*``)9#`````$#P``!`F`&`%)`GX``(E,$``)2`@
+M`@A@!20)^``"`0`&)````CP``$(D)2`@`@Q@!20#``8D"?A```(`!R0'`$`0
+M)2`@`@```CP``$(D"?A```1@!20``$*F`0`")!P`OX\8`+*/%`"QCQ``L(\(
+M`.`#(`"])___I3`(`H*4``````<`11`,``,D<A*"E`````"``$(P`@!`%`L`
+M`R0#``,D`@#`$````````,.L"`#@`R40``"&$H*4``````8`0!`E&```=A*"
+ME``````"`$`4`0`#)$,``R2*$H*4``````(`0!``````!`!C-`@`X`,E$&``
+MX/^])QP`OZ\8`+*O%`"QKQ``L*\ED(``2!)0E@`````<`!$R@H@1``(`$#(K
+M@!`````"/```0B0)^$``)2@@`@```CP``$(D)2!``@GX0```F`4T```#/```
+M8R0E($`"`)@%-`GX8```($8T```"/```0B0E($`""?A``"4H(`(F$%`````#
+M/```8R0E($`")2@@`@GX8``K,`(`'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TG
+MX/^])Q@`OZ\4`+&O$`"PKR6(@``E@*`````"/```0B0)^$``%$`%)$"`$``#
+M``8D!#`&`@```SP``&,D)2`@`A1`!20)^&``)3!&``$``B08`+^/%`"QCQ``
+ML(\(`.`#(`"])^#_O2<8`+^O%`"QKQ``L*\EB(``)8"@`````CP``$(D"?A`
+M`!1`!21`@!```P`&)`0P!@(G,`8````#/```8R0E("`"%$`%)`GX8``D,$8`
+M`0`")!@`OX\4`+&/$`"PCP@`X`,@`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\E
+MD(``)8B@`"6`P`````(\``!")`GX0``80`4D`0`#)`08(P(G&`,`)!!#``$`
+M$#($@#`"```#/```8R0E($`"&$`%)`GX8``E,%```0`")!P`OX\8`+*/%`"Q
+MCQ``L(\(`.`#(`"])^C_O2<4`+^O$`"PKR6`H``&``(N"`!`$/__`B0```(\
+M``!")`GX0``<0`4D+P!",`80`@(!`$(P%`"_CQ``L(\(`.`#&`"])^#_O2<8
+M`+^O%`"QKQ``L*\EB(``)8#``````CP``$(D"?A``!1`!23^_P,\_']C-"0P
+M0P`#```2`(#&-`$``CPE,,(````"/```0B0E("`""?A``!1`!20X+"..``$%
+M/````CP``$(D)2`@`@GX0``E*&4`&`"_CQ0`L8\0`+"/"`#@`R``O2?@_[TG
+M&`"_KQ0`L:\0`+"O)8B``"6`H`````(\``!")`GX0``00`4D\?\#/)__8S0D
+M$$,````#/.@L8R0'`!`R@(`0`"&``P(```:.```#/```8R0E("`"$$`%)`GX
+M8``E,$8`&`"_CQ0`L8\0`+"/"`#@`R``O2?@_[TG'`"_KQ@`LJ\4`+&O$`"P
+MKR6`@`#__](P```"/```0B0R+`0F"?A```8`!B0R+`.2,RP"D@``````$@(`
+M)1AB`#0L`I(``````!0"`"488@`U+`:2```````V!@```!$\```Q)B4@``((
+M@`4T"?@@`B4P9@`V+`:2-RP"D@``````$@(`)3#"`/\_4C(`E!(`)2```@R`
+M!30)^"`")3#2`!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])]C_O2<D`+^O(`"T
+MKQP`LZ\8`+*O%`"QKQ``L*\EH(`````2/```4B8)^$`"3(`%-"680``E((`"
+M"?A``E"`!30E@$``)2"``@GX0`),@`4T*YA3`"&`$P(EB````(@0`"6````E
+M&```)1`"`B48(P(D`+^/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])^C_
+MO2<0`+^O```"/```0B0)^$``3(`%-!``OX\`````"`#@`Q@`O2?H_[TG%`"_
+MKQ``L*\E@(`````"/```0B0)^$``((`%-``!!CP```,\``!C)"4@``(@@`4T
+M"?A@`"4P1@`4`+^/$`"PCP@`X`,8`+TGV/^])R``OZ\<`+.O&`"RKQ0`L:\0
+M`+"O)9B``````CP``$(D"?A``&28!33"E`(`_P%2,@`!0C(#`$`0```1//\!
+M4CHGD!(````Q)B4@8`()^"`"4(`%-"6`0``E(&`""?@@`DR`!30F@`(")A`2
+M`B``OX\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2?H_[TG%`"_KQ``L*\E@(``
+M```"/```0B0)^$``($`%)/\`0S`"&0,`#P!$,,P!`HX`````!@!#%"4H``#0
+M`0*6``````,`1!0E$*```0`%)"40H``4`+^/$`"PCP@`X`,8`+TGX/^])QP`
+MOZ\8`+*O%`"QKQ``L*\ED(``)8"@````$3P``#$F"?@@`I"`!30```..````
+M`"$00P````*N)2!``@GX(`*,@`4T!``#C@`````A$$,`!``"KB4@0`()^"`"
+ME(`%-`P``XX`````(1!#``P``JXE($`""?@@`HB`!30(``..`````"$00P`(
+M``*N)2!``@GX(`*8@`4T$``#C@`````A$$,`$``"KAP`OX\8`+*/%`"QCQ``
+ML(\(`.`#(`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O)8B``"6`H``)``(N"`!`
+M%"60(`(```(\``!")`GX0`#__P4T*Q!0``0`0!`E("`"U"Y0K@T``!`E$```
+M```"/```0B0)^$``)2@``@```SP``&,D)2`@`G`0!20)^&``)3!``-0N4*X!
+M``(D'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGZ/^])Q0`OZ\0`+"O)8"`````
+M`CP``$(D"?A``'`0!20```,\``!C)"4@``()^&``__]%,!0`OX\0`+"/"`#@
+M`Q@`O2?8_[TG(`"_KQP`LZ\8`+*O%`"QKQ``L*\EB(``)9"@`"68(`(```(\
+M``!")`GX0`#_'P4D*Q!2``4`0!`E("`"__\")-@N8JX6```0)1```````CP`
+M`$(D"?A``!2`!30E@$`````"/```0B0E("`""?A``"4H0`(`X`,D)(`#`O\?
+M0C````,\``!C)"4@(`(4@`4T"?A@`"4P`@+8+G*N`0`")"``OX\<`+./&`"R
+MCQ0`L8\0`+"/"`#@`R@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``
+M%(`%-````SP``&,D)2```@GX8`#_'T4P%`"_CQ``L(\(`.`#&`"])\LN@I``
+M`````0!".`@`X`,!`$(PX/^])QP`OZ\8`+*O%`"QKQ``L*\ED(``$@"@$"6(
+M0`(```(\``!")`GX0``$@`4T__X0//__$#8```,\``!C)"4@(`($@`4T"?A@
+M`"0P4`#(+B*.`````"004``1```0R"XBK@```CP``$(D)2!``@GX0``$@`4T
+M``$0/````SP``&,D)2!``@2`!30)^&``)3!0`,@N(HX`````)1!0`,@N(JX!
+M``(D'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGV/^])R``OZ\<`+.O&`"RKQ0`
+ML:\0`+"O)8B``"60H``EF"`"```"/```0B0)^$``_Q\%)"L04@`%`$`0)2`@
+M`O__`B3<+F*N&0``$"40``````(\``!")`GX0``4@`4T)8!``````CP``$(D
+M)2`@`@GX0``E*$`"`.`#//__8S0D@`,"`!0"`/\?`SPD$$,````#/```8R0E
+M("`"%(`%-`GX8``E,`("W"YRK@$``B0@`+^/'`"SCQ@`LH\4`+&/$`"PCP@`
+MX`,H`+TGZ/^])Q0`OZ\0`+"O)8"``````CP``$(D"?A``!2`!30"+`(````"
+M/```0B0E(``""?A``/\?I3`4`+^/$`"PCP@`X`,8`+TG"`#@`P$``B0(`.`#
+M``````@`X`,E$```"`#@`P`````(`.`#`````.C_O2<0`+^O```"/```0B0)
+M^$``')P%-/\`0C`0`+^/``````@`X`,8`+TGZ/^])Q``OZ\```(\``!")`GX
+M0`!8@`4T!P!",!``OX\`````"`#@`Q@`O2?H_[TG$`"_KP<`IC````(\``!"
+M)`GX0`!8@`4T$`"_CP`````(`.`#&`"])ZPN@HP`````"`#@`P````#H_[TG
+M$`"_KS02AHP``````P#`%`$``B0%```0K"Z%K````CP``$(D"?A````````0
+M`+^/``````@`X`,8`+TGZ/^])P$``B0)`*(4$`"_KP(`PBP*`$`4)1````4`
+M`R0'`,,4#0`")`4``!`E$``````"/```0B0)^$```````!``OX\`````"`#@
+M`Q@`O2?@_[TG&`"_KPL``B0)`*(4)1B```8`YC#X`6:L```"/```0B0)^$``
+M2(`%-`@``!`!``(D,`"BCP`````0`**O```"/```0B0)^$``)2!@`!@`OX\`
+M````"`#@`R``O2?@_[TG&`"_KS``HH\T`*./`````!``HJ\```(\``!")`GX
+M0``4`*.O*Q`"`!@`OX\`````"`#@`R``O2?0_[TG+`"_KR@`MJ\D`+6O(`"T
+MKQP`LZ\8`+*O%`"QKQ``L*\Q`*`0)8B``````CP``$(D"?A```1`!23\_P8\
+M___&-````SP``&,D)2`@`@1`!20)^&``)#!&`````CP``$(D"?A```H`!"0*
+M`!`D```"/```4B0!`!8\```"/```523\_Q0\__^4-@```CP+```0``!3)`GX
+MH`+(``0D)2`@`@GX0`($0`4D)2`@`@1`!20)^&`")#!4`/__$"8(```2)2`@
+M`@GX0`(00`4D)!!6`/#_0!0``````P``%@`````/```0)1```````CP``$(D
+M)2`@`@GX0``$@`4T^_\&//__QC0```,\``!C)"4@(`($@`4T"?A@`"0P1@`!
+M``(D+`"_CR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#,`"])]C_
+MO2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@``E@*`````"/```4B0)^$`"!(`%
+M-`0`!CP```,\``!S)"4@(`($@`4T"?A@`B4P1@`)```2)2`@`@GX0`($0`4D
+M_/\&//__QC0E("`"!$`%)`GX8`(D,$8`(`"_CQP`LX\8`+*/%`"QCQ``L(\(
+M`.`#*`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@``E@*`````"/```
+M4B0)^$`"!(`%-`0`!CP```,\``!S)"4@(`($@`4T"?A@`B4P1@`)```2)2`@
+M`@GX0`($0`4D_/\&//__QC0E("`"!$`%)`GX8`(D,$8`(`"_CQP`LX\8`+*/
+M%`"QCQ``L(\(`.`#*`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O)8B@`"4HP``!
+M`!`D#0`P$B60@``&`"`2`0`"/`(``B0.`"(2)1```!(``!``````$.9")`GX
+M0```````"P``$"6`0``!``(\7.=")`GX0```````!@``$*@N4:X!``(\[.="
+M)`GX0```````J"Y1KB40``(<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?H_[TG
+M$`"_KP```CP``$(D"?A```1`!20"%`(``P!",!``OX\`````"`#@`Q@`O2<`
+M````Z/^])Q0`OZ\"``(D$P"B$!``L*\#`*(L!@!`$`0``B0!``(D!P"B$"40
+M```2```0``````8`HA`E$```#@``$`````````(\!@``$```4"0```(\`P``
+M$```4"0```(\``!0)````CP``$(D"?A``"4H``(E$``"%`"_CQ``L(\(`.`#
+M&`"])P``````````Z/^])Q``OZ\```(\``!")`GX0``,``4D$`"_CP`````(
+M`.`#&`"])^C_O2<0`+^O)3"@`````CP``$(D"?A```P`!200`+^/``````@`
+MX`,8`+TGZ/^])Q``OZ\```(\``!")`@`!20)^$``!``&)!``OX\`````"`#@
+M`Q@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0(``4D"?A``"``!B0```(\
+M``!")"4@``((``4D!``&)`GX0``E.```*Q`"`!0`OX\0`+"/"`#@`Q@`O2?H
+M_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``2(`%--__!B0```,\``!C)"4@
+M``)(@`4T"?A@`"0P1@`4`+^/$`"PCP@`X`,8`+TGZ/^])Q0`OZ\0`+"O)8"`
+M`````CP``$(D"?A``$B`!30```,\``!C)"4@``)(@`4T"?A@`"``1C04`+^/
+M$`"PCP@`X`,8`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\EB(``)1"@`"60P```
+M`!`\```0)D"`!30)^``")3!``"4@(`)$@`4T"?@``B4P0`(<`+^/&`"RCQ0`
+ML8\0`+"/"`#@`R``O2?@_[TG&`"_KQ0`L:\0`+"O)8B``"6`H`!```,N(0!@
+M$"40```@``(N$`!`%````CP``$(D"?A``$2`!33@_P,F`0`&)`0P9@`G,`8`
+M```#/```8R0E("`"1(`%-`GX8``D,$8`#P``$`$``B0``$(D)2`@`@GX0`!`
+M@`4T`0`&)`0P!@(G,`8````#/```8R0E("`"0(`%-`GX8``D,$8``0`")!@`
+MOX\4`+&/$`"PCP@`X`,@`+TGX/^])Q@`OZ\4`+&O$`"PKR6(@``E@*``0``#
+M+A\`8!`E$```(``"+@\`0!0```(\``!")`GX0`!$@`4TX/\#)@$`!B0$,&8`
+M```#/```8R0E("`"1(`%-`GX8``E,$8`#@``$`$``B0``$(D)2`@`@GX0`!`
+M@`4T`0`&)`0P!@(```,\``!C)"4@(`)`@`4T"?A@`"4P1@`!``(D&`"_CQ0`
+ML8\0`+"/"`#@`R``O2?H_[TG$`"_KP```CP``$(D"?A``#R`!300`+^/````
+M``@`X`,8`+TGZ/^])Q``OZ\E,*`````"/```0B0)^$``/(`%-!``OX\`````
+M"`#@`Q@`O2<+`*"H"`"@N/\/PC`/`**H#`"BN`\`HX@,`*.8`````!(`9A0E
+M$```(`#B,`<`0!``````#P"BB`P`HI@``````"!"-`\`HJ@,`**X%P"@J!0`
+MH+@7`**(%`"BF``````3`**H$`"BN`$``B0(`.`#`````.#_O2<<`+^O&`"R
+MKQ0`L:\0`+"O)9#``#@`L8\`````)8"@`!<``XH4``.:``````$`8S!A`&`0
+M#P`")!<`XH@4`.*8``````$`0C`&`$`4```"/```0B0)^$``#``%)%8`4A`/
+M``(D$P`"BA```IH`````_P]",```(J87``**%``"F@````#"$P(`_Q]",`(`
+M(J8$`""B%P`"BA0``IH``````@!",!X`0!0`````%P`"BA0``IH`````!`!"
+M,`,`0!`!``(D%@``$`0`(J(7``**%``"F@`````0`$(P!@!`$``````$`"*2
+M``````@`0C0+```0!``BH@0`(I(``````@!"-`0`(J(7``**%``"F@````#@
+M`$(P0A$"``4`(J(3``**$``"F@````#"%`(`!@`BHA<``HH4``*:```````!
+M0C`(`$`0_P`")!<``HH4``*:``````!^0C!"$@(``@``$`<`(J('`"*B$P`"
+MBA```IH`````PA,"``\`0C`(`"*B$P`"BA```IH`````PA8"``<`0C`)`"*B
+M$P`"BA```IH``````A,"``$`0C`*`"*B)1```!P`OX\8`+*/%`"QCQ``L(\(
+M`.`#(`"])P``````````@/^])WP`OZ]X`+ZO=`"WKW``MJ]L`+6O:`"TKV0`
+MLZ]@`+*O7`"QKU@`L*\ED(``A`"EKR6PP`",`*>O):!``D@`H*],`*"O4`"@
+MKP(`PI8`````PA$"``$`0S`"`,*6```````!0C`%`$`0);@``!`#8!0,``,D
+M"```$``````"`,*6`````,(1`@`!`$(X`0!",`<#0!0,``,D`@#"E@````""
+M$0(``0!#,`(`PI8`````(`!",`4`0!``````_`)@%`P``R0)```0```"/`(`
+MPI8`````@A$"``$`0C@!`$(P\P)`%`P``R0```(\``!")"4@0`()^$``)2C`
+M`B7P0`#K`L`3#``#)`8``B2$`*./``````P`8A`'`&(L!@!`$`@``B0"`&(L
+MX0)`$`P``R0%```0`````(0`I(\`````VP*"%`P``R2,`**/`````"T`0!``
+M``(\``!0)"4@0`()^``"3(`%-$P`HJ\E($`""?@``E"`!310`**OS`%"C@``
+M```$`$(L!@!`%"6(```E($`""?@``D`1!20.```0$`"BKP```CP``%4D$`"S
+M)X"`$0`E($`""?B@`D`1!28A@'`"```"K@$`,28*`"(N^/]`%("`$0`$`,.3
+M``````(`8C`"`$`4_@!B,`0`PJ,"`,*7``````(`PJ8$`,*3``````0`PJ(`
+M``(\``!")"4@0`()^$``6(`%-"6H0``"`*`6```0/`$`%20``!`F)2!``@GX
+M``($@`4T``(#/"000P!$`**O)2!``@GX``(00`4D_@`#/&``8S0D$$,`0`"B
+MKR4@0`()^``"%$`%)#@`HJ\E($`""?@``AA`!20\`**O```"/```0B0"`,66
+M"?A``"4@0`*%`D`0`P`#)`(`PI8`````\`%#,,```B08`&(0P0!B*`8`0!!`
+M`0(DH``")!``8A`#``(D%```$``````%`&(04`$")`<`8A`"``0D#@``$```
+M```!``,D2`"CKPH``!`!`!<D2`"DKP<``!`!`!<D2`"BKP0``!`"`!<D!``#
+M)$@`HZ\"`!<DS`%"C@`````$`$(L"`!`%````CP``$(D)2!``@"8!30)^$``
+M!P`&)`8``!````````!")"4@0`(`F`4T"?A``$<`!B3,`4*.``````0`0BQ-
+M`$`4`0`"/`(`PY8`````@`!B,#0`0!`EB```<!*"E@`````!,$(L,`!`%```
+M`CP@`&(P!P!`$```$#QL$Y&6`````'`3DY8`````!@``$```$"9N$Y&6````
+M`'(3DY8````````0)B4@(`()^``"`P`%)"6(0``E(&`""?@``@,`!20```<\
+MS$;G)(`P%P`L`<4D(2BG````I(P__P,D)""#`(`9$0#``&,P)2"#````I*PX
+M`<8D(3#'````Q(SP_P,D)""#`((8$0`!`&,P0!`"``X`0C`E&&(`)2"#````
+MQ*PEB``````"/,Q&4"0```(\``!3)$`0$0`A$%$`@!@"`"$8<``A$%<`@!`"
+M`"$04````&6,``!&C`GX8`(E($`"`0`Q)AP`(B[S_T`40!`1``$``CP@"$(D
+M)2!``@GX0``E*,`")8@``````CP0+5`D```"/```4R2`$!$`(1!1`(`8`@`A
+M&'``2`"DCP`````A$$0`@!`"`"$04````&6,``!&C`GX8`(E($`"`0`Q)B,`
+M(B[Q_T`4@!`1`"6(``````(\)#50)````CP``%,D0!`1`"$040"`&`(`(1AP
+M`"$05P"`$`(`(1!0````98P``$:,"?A@`B4@0`(!`#$F0``B+O/_0!1`$!$`
+M)8@``````CS,+U`D```"/```4R3`$!$`(1!0````18P`````C`"BCP`````$
+M`$`0`("B)``00BP&`$`4`````,`0$0`A$%``!`!&C`GX8`(E($`"`0`Q)JL`
+M(B[N_T`4P!`1`,P!0HX`````!`!"+!X`0!```!$\```Q)B4@0`()^"`"'(`%
+M-`\``SS__V,T)!!#`-`!!CP``!`\```0)B4@0`(<@`4T"?@``B4P1@`E($`"
+M7``%)`GX``(E,```)2!``GB8!30)^``""``&)"4@0`()^"`"2(`%-"4@0`)(
+M@`4T"?@``@`$1C2,`*./`````"(`8!````(\``!0)"4@0`),`*:/"?@``DR`
+M!30E($`"4`"FCPGX``)0@`4TS`%"C@`````$`$(L!P!`%"6(```E($`"$`"F
+MCPGX``)`$04D#@``$``````0`+`G```"/```4R2`*!$`(1`%`B4@0`(``$:,
+M"?A@`D`1I20!`#$F"@`B+OC_0!2`*!$`+"R#DBTL@I(``````!("`"488@`N
+M+(*2```````4`@`E&&(`+RR&D@``````-@8````"/```4"0E($`"`(`%-`GX
+M``(E,&8`,"R&DC$L@I(``````!("`"4PP@`E($`"!(`%-$0`HH\)^``")3#"
+M``$``CP\*D(DA`"ECPGX0``E($`"```"/```420E($`""?@@`A!`!20E($`"
+M$$`%)$``HX\)^``")3!#`"4@0`(X`*:/"?@``A1`!20E($`"/`"FCPGX``(8
+M0`4D)2!``EB`!30)^``")3"@`C(L@Y(S+(*2```````2`@`E&&(`-"R"D@``
+M````%`(`)1AB`#4LAI(``````#8&`"4@0`((@`4T"?@``B4P9@`V+(*2-RR&
+MD@``````,@8`)2!``@R`!30)^``")3!&`"4@0`+0+H:."?@``AB`!30E($`"
+M@``%)`GX``+__P8DS`%#C@0``B0-`&(4```"/-`!0I8``````@!"+`<`0!`E
+M($`""?@@`A0`!20E($`"%``%)`GX``(`!$8T```"/```0B0E($`""?A``"4H
+MP`((`4`0`P`#)`8``B2$`*2/`````!@`@A`!``(\!`)"C@`````#`$(P$@!`
+M$````CP``$(D)2!``@GX0`!$F04T_]\#//__8S0D$$,`!`)&C@`````!`,8P
+M0#<&`````SP``&,D)2!``D29!30)^&``)3!&``$``CR8#4(D)2!``@GX0``E
+M*,`"`0`"/'`"0B0E($`""?A``"4HP`/A`$`0`P`#),@!0Y8;\0(T#`!B%```
+M`CP"`,*6`````(``0C`&`$`0```"/```0B0E($`""-@%-`GX0``"!08D```"
+M/```0B0E($`"')@%-`GX0``!``8D```"/```0B0E($`""?A``!29!33_/T,P
+M`@#"E@`````@`$(P"0!`$(`0`P`NN@,\HXMC-!D`0P`0$``````````````'
+M```0`B$"`,S,`CS-S$(T&0!B`!`0``#"(`(``````````CP``$(D"?A``&0`
+MA"0```(\``!")"4@0`()^$``8)@%-````SP``&,D)2!``F"8!30)^&```0!&
+M-````CP``$(D)2!``F"8!30!``8D"?A``"4X``````(\``!")"4@0`()^$``
+M)2C``PD`0!0``````@##E@`````@`&(P`@!`%`(`8C0"`,*FCP``$`,``R2P
+M+H*.``````D`0!````(\``!")"4@0`(@F04T`0`&/`GX0```\,8T`0`")+0N
+M@JXE@````0`3)````CP``%$D@"@0`"4@0`(`$*4D"?@@`@0P$P(!`!`F"@`"
+M*OC_0!0```(\)8``````420E($`""?@@`B4H``(!`!`F"@`"*OO_0!0E($`"
+M```"/```4"2D``4D`0`&/`GX``(!`,8T)2!``J@`!20)^``"`0`&)"4@0`*L
+M``4D"?@``@$`!B0```(\``!1)"4@0`()^"`"L!`%)"4@0`*P$`4D"?@``B4P
+M0``E($`"H``%)`@`!CP)^``"90G&-`@``CQE"4(T."R"KB4@0`()^"`"K``%
+M)`<`!CPE($`"K``%)`GX``(E,$8`!@`")(0`HX\`````"P!B%"4@0`()^"`"
+MH``%)"4@0`*@``4D"?@``@`01C0X+(*.```````00C0X+(*N3!)"C@`````$
+M`$`0```"/```0B0)^$``)2!``@```CP``$(D)2!``@GX0``@@`4T?_X&//__
+MQC0```,\``!C)"4@0`(@@`4T"?A@`"0P1@#4+H6.__\")`0`HA````(\``!"
+M)`GX0``E($`"V"Z%CO__`B0$`*(0```"/```0B0)^$``)2!``MPNA8[__P(D
+M!`"B$````CP``$(D"?A``"4@0`+X`4:.``````4`P!`E($`"```"/```0B0)
+M^$``2(`%-(0`I(\`````W`%$K@@``!`!``(DD`"DCP```````(*,``````(`
+M0!`E$`````"#K'P`OX]X`+Z/=`"WCW``MH]L`+6/:`"TCV0`LX]@`+*/7`"Q
+MCU@`L(\(`.`#@`"])^C_O2<0`+^O`0`"/*@!0B0)^$```@`%)!``OX\`````
+M"`#@`Q@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0E*```"?A```$`!B0-
+M`$`0``````$``CRH`4(D)2```@GX0``3``4D!@!`$`````````(\``!")`GX
+M0``T"`0D`0`")!0`OX\0`+"/"`#@`Q@`O2?@_[TG&`"_KQ0`L:\0`+"O)8B`
+M`/__L#````(\``!")"4H```)^$```0`&)'P`0!#P`0,RP``")"L`8A#!`&(H
+M"`!`$$`!`B2@``(D$@!B$+```B00`&(0`0`"/%L``!"H`4(D-P!B$$$!8B@&
+M`$`04`$")-```B0;`&(0`0`"/%(``!"H`4(D+@!B$`$``CQ.```0J`%")```
+M$#P``!`F)2`@`@28!30)^``")3```"4@(`(`H@4T"?@``@,`!B0E("`"?)@%
+M-`GX``(9``8D```"/```0B0)^$``+`$$)#D``!`!``(\```"/```4"0E("`"
+M!)@%-`GX``(E,```R`$CEA(``B0N`&(4)2`@`GR8!30)^``"&``&)````CP`
+M`$(D"?A``"P!!"0E("`"`*(%-`GX``("``8D(@``$`$``CP0``(R"`!`$```
+M`CP``$(D)2`@`@28!30)^$```P`&)`8``!````````!")"4@(`($F`4T"?A`
+M`"4P``#(`2.6$@`")`X`8A0``!`\```0)B4@(`)\F`4T"?@``A@`!B0```(\
+M``!")`GX0``L`00D)2`@`@"B!30)^``")3````$``CRH`4(D)2`@`@GX0``3
+M``4D$0!`$`````````(\``!")`GX0``T"`0D```"/```0B0E("`")2@```GX
+M0``!``8D!0!`$"4@(`(!``(\J`%")`GX0``E*```&`"_CQ0`L8\0`+"/"`#@
+M`R``O2?(_[TG-`"_KS``OJ\L`+>O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O
+M$`"PKR68@``EN*``)?#``````CP``$(D"?A``"6P8`(EH$``;`"`$@````"T
+M+L*.`````#<`0!````(\``!5)"4@8`()^*`"()D%-`$``SPD$$,`+P!`%"4@
+M8`*T+L"N"?B@`A"<!30ED$``)2!@`@GXH`(4G`4T)8!``"4@8`()^*`"&)P%
+M-"4P0``"(A(``A(0`"$@@@""*1``*Q`$`"L8!0`D$$,`&@!`$".(!@`:`"0"
+M$A````(`@!0`````#0`'`#\`43`:`$4"$H````(`H!0`````#0`'`,#_$"8?
+M`!`R)2!@`@GXH`(@F04T0!D1`"400P`E$%`````#/```8R0E(&`"()D%-`GX
+M8```"$8T`0`"/-@%0B0E(&`""?A``"4H@`(*`$`4``````(`XY8``````@!C
+M-`(`XZ8"`(.6`````/W_8S`B```0`@"#I@```CP``%`D)2!@`@GX``(E*(`"
+M$P!`%`$``CP```(\``!")`GX0`"($P0D)2!@`@GX``(E*(`""@!`%`$``CP"
+M`..6`````"``8C`#`$`4``````(`8C0"`.*F"0``$"40``!4)D(D"?A``"4@
+M8`*T+L*.``````$`0BP``,*O`0`")#0`OX\P`+Z/+`"WCR@`MH\D`+6/(`"T
+MCQP`LX\8`+*/%`"QCQ``L(\(`.`#.`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O
+M)9"``"6`H``"```6)8@``O__$20```(\``!")"4@0`()^$``#``%)````CP`
+M`$(D)2!``@!`!20)^$``)3```@```CP``$(D"?A```\`!"0#`!`R```"/```
+M0B0E($`"`$`%)`,`)C()^$``)3@``B6(0``!``(R"`!`%"40(`(```(\``!"
+M)"4@0`(4``4D"?A``"4P```E$"`"'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TG
+MV/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR68H`````(\``!")```998"
+M`&:6"?A``"6@@```%`(``R0"``(`8I8`````@`!",!0`0!!`@`0`(8`$`H"`
+M$`````(\"#E")"&``@(```(\``!")`0`!(X)^$``"``%)/\`4C!`D1(````"
+MC@``````$0(`"``$A@`````"```0)9!"`B60``"1`((H!`!`$````CP!`((P
+M"`!`$````CP``$(DZ/^$)`GX0``(``4D_P!1,`L``!`!``(DZ/^$),(7!``A
+M(((````"/```0B1#(`0`"?A```@`!23_`%$P)1```("($0!`$`(`)8@B`@$$
+M,3;_`$8R`#(&`/\`(C(``!`\```0)B4@@`*<F`4T"?@``B4PP@`"BA$``/]"
+M,O\`)C(E((`"T)@%-`GX``(E,$8`-!*3K@$``B0D`+^/(`"TCQP`LX\8`+*/
+M%`"QCQ``L(\(`.`#*`"])^C_O2<0`+^O```"/```0B0)^$``9)@%-,(4`@#_
+M`4,P``%B,`(`0!#_`6(X)Q@"`"408``0`+^/``````@`X`,8`+TGV/^])R0`
+MOZ\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6@@`#_`+,P`(P&``.,$0```!(\``!2
+M)@GX0`)DF`4T`/`#)"000P!`&A,```YC,"400P#_`3$R```0/```$"8E((`"
+M9)@%-`GX``(E,%$`)2"``@GX0`)@F`4T)2"``F"8!30)^``"`@!&-`0`8!(X
+M`!$DP!`3`",04P!`B@(`)8```````CP``%,D```"/`0``!```%(D"?A``B4@
+M(`(!`!`F/``"*@D`0!``````)2"``@GX8`)@F`4T`@!",/7_0!0\``(J`P!`
+M%``````%```0)1````$``CSH`T(D"?A``"4@@`(D`+^/(`"TCQP`LX\8`+*/
+M%`"QCQ``L(\(`.`#*`"])P(`HI0`````X`%#,,```B04`&(0`````,$`8B@&
+M`$`00`$")*```B0*`&(0``````@`X`,E$`````````T`8A0`````S!*"E```
+M```+```0``#"I,X2@I0`````!P``$```PJ30$H*4``````,``!```,*D"`#@
+M`R40```!``(D"`#@`P````#8_[TG(`"_KQP`L:\8`+"O)8B``"6`H``!``(\
+M4`5")`GX0``0`*8G&0!`$`````````(\``!")"4@(`()^$``8)@%-`$``CSH
+M`T(D"?A``"4@(`(E&$``$`"BAP`````J$$,`!0!`$``````"``*6``````(`
+M0C0"``*F%@`#IA``HH<`````*A!#``$`0C@@`+^/'`"QCQ@`L(\(`.`#*`"]
+M)]#_O2<L`+^O*`"TKR0`LZ\@`+*O'`"QKQ@`L*\ED(``S`%"C@`````$`$(L
+M)@!`$"6(H`````(\``!")`GX0```````(`!`$`$``CQ0!4(D)2!``B4H(`()
+M^$``$`"F)R4`0!`E@``````"/$PZ5"0!``(\+`13)"$0%`(E($`"``!%D`GX
+M8`(E,```)1A``!``HH<`````*A!#``,`0!```````@``$!8`(*86`".F`0`0
+M)@,``B[O_T`4!``"+@T``!`````````"/```0B0E($`""?A``&"8!30```,\
+M``!C)"4@0`)@F`4T"?A@``(`1C0!``(D+`"_CR@`M(\D`+./(`"RCQP`L8\8
+M`+"/"`#@`S``O2<```(\``"CE%`Z0I0`````*Q!#``P`0!0E(``````"/%`Z
+M0R0``*64`0"$)(`0!``A$$,```!"E``````K$$4`^?]`$`````````(\4#I"
+M)(`8!``A$$,``@!#E```````'`,``Q0#`%55!#Q6580T&`!$`!`0``##'P,`
+M(Q!#```4`@`(`.`#`Q0"`,#_O2<\`+^O.`"^KS0`MZ\P`+:O+`"UKR@`M*\D
+M`+.O(`"RKQP`L:\8`+"O0`"DKR6@@``"`*24`````(``@C`!`$(L`@`#)",8
+M8@#@`80PP``")&X`@A`0`*.OP0""*`8`0!!``0(DH``")%X`@A`E$```T```
+M$`````#.`((4)1``````HI0`````7_!").L$0BP'`$`0`````%03E98`````
+M5A.6E@`````C```0````````HI0`````=.M")/``0BP'`$`0`````%@3E98`
+M````6A.6E@`````7```0````````HI0`````A.I").$`0BP'`$`0`````%P3
+ME98`````7A.6E@`````+```0````````HI0`````719"+"6P```%`$`4):@`
+M`&`3E98`````8A.6E@````#8$I"6`````-X2GI8``````0#7+P``!CR@1<8D
+M$`"BCP````"`*`(`/`"D)"$@A@```(.,_^\"//__0C0D&&(`S!."E@``````
+M%P(`)1AB````@ZQ(`*0D(2"&````@XS_^P(\__]"-"088@#.$X*6`````(`6
+M`@`E&&(```"#K/P`I20A**8```"CC/?_`B0D&&(`RA."E@````#`$`(`)1AB
+M`!0``!```*.L9!.5E@````!F$Y:6`````-H2D)8`````X!*>E@`````*```0
+M`0#7+V@3E98`````:A.6E@````#<$I"6`````.(2GI8``````0#7+P``$CP`
+M`%(F)2```@GX0`($``4D```3/*!%<R80`*./`````("(`P"$`"4F(2BS````
+MI(P__P,D)""#`,`1`@"`&1<`)1!#`,``0C`E(((```"DK"4@``()^$`"!``%
+M))``,"8A@!,"```#COC_!"0D&&0`0A`"``<`0C`E&&(````#KB4@H`()^$`"
+M`P`%)````XY__P0D)!AD`,`1`@"``$(P)1AB`````ZXE(*`""?A``@,`!22<
+M`#`F(8`3`@```X[\_P0D)!AD`$(0`@`#`$(P)1AB`````ZXE(,`""?A``@,`
+M!20```..X_\$)"089`"`$`(`'`!","488@````.NS``Q)B&(,P(``"..]_\"
+M)"088@#`$!X`"`!","488@```".N)8```"6(8`(```(\``!2)$`0$``A$%``
+M@!@"`"$8<0`0`*2/`````"$01`"`$`(`(1!1`$``I(\``&6,``!&C`GX0`(!
+M`!`F&0`"+O'_0!1`$!``P"Z`K@$``B0\`+^/.`"^CS0`MX\P`+:/+`"UCR@`
+MM(\D`+./(`"RCQP`L8\8`+"/"`#@`T``O2?@_[TG'`"_KQ@`LJ\4`+&O$`"P
+MKR60@``"`,*4`````.`!0S#```(D#P!B$"4X0`+!`&(H!@!`$$`!`B2@``(D
+M!P!B$"40``!+```0`````$D`8A0E$```!```$"48```"```0`0`#)`(``R1`
+M&`,`!`#D)"$09`#F$D:4[!)"E`````"`$0(`)3#"`"$09`#R$D*4```````3
+M`@`E,,(`(1!D`/@20I0`````@!0"`"4PP@`A$&0`_A)"E```````%@(`)3#"
+M`"$09``$$U&4"A-"E`````"`$0(`)8@B`B$09``0$T*4```````3`@`EB"("
+M(1!D`!830I0`````@!0"`"6((@(A&&0`'!-BE```````%@(`)8@B`@$``B0'
+M`*(0``````@`H!`"``(D!0"B$"40```/```0``````(``!`EB,``)3`@`JPN
+MY:P``!`\```0)B4@0`()^``"8)D%-"4@0`)DF04T"?@``B4P(`(!``(D'`"_
+MCQ@`LH\4`+&/$`"PCP@`X`,@`+TGR/^])S0`OZ\P`+ZO+`"WKR@`MJ\D`+6O
+M(`"TKQP`LZ\8`+*O%`"QKQ``L*\EL(``/`"EKP(`HI0`````X`%#,,```B0A
+M`&(0);C``L$`8B@&`$`00`$")*```B09`&(0)1```.,``!``````X0!B%"40
+M```E\``````"/```0B0E(,`""?A``$29!33'_P,D)!!#`-`3YI8`````P#`&
+M`#@`QC````,\``!C)"4@P`)$F04T"?A@`"4P1@`$```0``````(``!`!`!XD
+M`@`>),P!PHX`````!`!"+`T`0!````(\``!")"4@P`()^$``$)D%-````SP`
+M`&,D)2#``A"9!30)^&```P!&-",``!```!,\``!")"4@P`()^$``$)D%-`;\
+M`R0D$$,`0(@>``0`\B8A&#("X!)CE```````&0,`)1!#````$#P``!`F)2#`
+M`A"9!30)^``"`0!&-````CP``$(DK"[ECCP`IH\)^$``)2#``B&(,@+($B:6
+M`````/\!QC`E(,`":)D%-`GX``(``L8T```3/```<R8E(,`""?A@`D28!31_
+MP`,D)!!#`$"0'@`"`/0F(1A4`J`29I0`````P#$&`(`_QC```!$\```Q)B4@
+MP`)$F`4T"?@@`B4P1@`E(,`""?A@`DB8!33\_P,\_P]C-"000P"H$E4F(1CU
+M`@``9I0``````#,&``,``SP`\&,T)###`"4@P`)(F`4T"?@@`B4P1@`E(,`"
+M"?A@`E"8!33__P,\)!!#`"$8UP/)$F.0```````:`P`E$$,`!@#P)B$8T`/`
+M$F:0)2#``E"8!30)^"`")3!&`"&@5`*X$H*6```````V`@``%`(`)3#"`"$0
+M5P+`$D.4```````2`P`E,,(`)2#``C28!30)^"`")3##`"4@P`()^&`"*)@%
+M-/__`SS_`&,T)!!#`"&`%0(```:6```````R!@`E(,`"*)@%-`GX(`(E,$8`
+M)2#``@GX8`)DF`4T^/\#//\/8S0D$$,`(9!7`K021I8``````#,&``<``SP`
+M\&,T)###`"4@P`)DF`4T"?@@`B4P1@!P$N*6``````,P0BP.`$`0`@`0),H!
+MPY8B$`(D&P!B%````CP\`*./``````(`8I0`````0`!",!0`0!````(\$@``
+M$`@`$"0\`*./````````8I0`````'P!","L8`@#V_T(D#0!"+`$`0C@D&&(`
+M!0!@$$`0'@`A$%<`)A-"E``````A@`("```"/```0B0E(,`""?A``"29!30!
+M_P,D)!!#`$`P$`#W`,8P```#/```8R0E(,`"))D%-`GX8``E,$8``0`")#0`
+MOX\P`+Z/+`"WCR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#.`"]
+M)^C_O2<0`+^O)3"@`$``PBP"`$`4)1C``#\``R3\`8.D```"/```0B0)^$``
+M/)D%-`$``B00`+^/``````@`X`,8`+TGP/^])SP`OZ\X`+2O-`"SKS``LJ\L
+M`+&O*`"PKR6@@``EF*```@!BE@````#@`4,PP``")!8`8A`E@(`"P0!B*`8`
+M0!!``0(DH``")!L`8A`E$```4P``$`````!1`&(4)1```.83`I8`````'`"B
+MI](3`B88`**OZ!,")B``HJ]*%Q*6`````!8``!!,%Q$F\!4"E@`````<`**G
+M\A4")A@`HJ\2%@(F(`"BKYP7$I8`````"P``$)X7$2;P%0*6`````!P`HJ?X
+M%0(F&`"BKZX6`B8@`**OO!<2E@````"^%Q$F`0`"/,030B0E((`"``!FE@GX
+M0``8`*4G```"/```0B0E((`""?A``"4H8`(E($``)1@``'03`I8`````&`!`
+M$"4H``!V$P*6``````4`0!```````P!$%``````0```0U!<%)@$`8R1T$P*6
+M`````"H08@`*`$`00!`#`"$04`!V$T*4`````/;_0!``````]/]$%(`1`P`A
+M$`("U!=%)!``LZ\!``(\]!A")"4@@`(E,"`""?A``/__1S(!``(D/`"_CS@`
+MM(\T`+./,`"RCRP`L8\H`+"/"`#@`T``O2?`_[TG/`"_KS@`OJ\T`+>O,`"V
+MKRP`M:\H`+2O)`"SKR``LJ\<`+&O&`"PKT``I*]$`*6O___6,"6X```_`!XD
+M```0/```$"8```0\D`"$)`GX``((`04D```$/!``A"0)^``"@``%)````CR8
+M`%4D@`"S)@$`$B0EB```0!`1`"$050```%*D`0!")O__4C`!`"(F__]1,$``
+M0B[X_T`40!`1`````CR0`$(D!@!1I`$``R0"`$.D/P`#)`0`0Z0&`$*4````
+M`!0`0!`EB````0`"/-@?5"0```(\D`!2)$"`$0`A$!4"``!%E$0`IH\)^(`"
+M)2#``B&`$P(```*F`0`B)O__43`&`$*6`````"L0(@+S_T`40(`1````9H8`
+M```````"/)8`0Y0`````0!`#`"$08@+^_T>$`````"(`8!`EB``````"/)``
+M2"1`$!$`(1!3````0X0`````*A##``,`0!0`````)3!@`"6X(`(&``*5````
+M`",040#__T(D__]2,!``0!)`$!(`(2!B`O[_@X0``(64``""A``````J$$,`
+M`@!`$`$`(B;^_X6D__]1,`8``I4`````*Q`B`N/_0!1`$!$````"/)8`0I0`
+M````$0!`$"6(``````(\E@!$E`````!`$!$`(1!3````0X0`````*A#C``,`
+M0!`!`"(F)3A@`"7P(`+__U$P*Q`D`O7_0!1`$!$`&0#").M1!#P?A80T&`!$
+M`!`8```#&0,`PQ<"`",88@!`$`,`(1!#`,`0`@`A$$,`0!0"``.$`@`EB```
+M&``$`A`@```#(00`PQ<"`",@@@`!`(0D$@"`&"60``````(\$`!%)!`0```#
+M$0(`PQ\0`",00P`!`$0D)1@@`@$`(B;__U$P0!@#`"$890`!`$(F__]2,"H0
+M1`+W_T`4``!WI````CR6`$*4`````$`0`@`A$&("_O]"A``````J$`("7`!`
+M$"60``````(\D`!4)`$``CQ$(E<D```"/!``5B0R``(F`!0"``.$`@`&`(*6
+M`````$`0`@`A$&("_O]"A``````J$`(")0!`$$`8$@!`$!(`(1!3````0X0`
+M````(Q@#`@(`0H0`````(Q`"`A@`8@`2&```&0!@&$`8$@````(\E@!"E```
+M``!`$`(`(1!B`O[_0H0`````*B`"`@$`0B8-`(`0__]2,$`0$@`A$%,```!#
+MA``````C&`,"`@!"A``````C$`("&`!B`!(8``#S_V`<`0!")D`8$@`A$',`
+M``!%E`(`1I0A&'4```!GE`````!`.`<``@!BE`````!`$`(`__]",!``HJ\4
+M`*"O__\$,@GXX`+__^<P`0!")/__0C!`&!$`(1AV`$(0`@```&*D__]","L0
+MP@,"`$`0`0`B)@``?J3__U$P!@""E@````!`$`(`(1!B`O[_0H0`````*A`"
+M`JW_0!0R``(F0``B+@T`0!````(\$`!$)$`0$0`A&$0`)1!@`/[_0I0`````
+M``!BI`$`(B;__U$P0``B+O?_0!1`$!$`@*$0-"60``````(\$`!1)````CP`
+M`%,D@!@2`"$0<0`"`$*4```````2`@#_`$(T`!0"`"$8<0```&:4```````R
+M!@#_`,8T___&,$``I(\E*``""?A@`B4P1@`!`$(F__]2,"``0B[K_T`4!``0
+M)CP`OX\X`+Z/-`"WCS``MH\L`+6/*`"TCR0`LX\@`+*/'`"QCQ@`L(\(`.`#
+M0`"])YC_O2=D`+^O8`"^KUP`MZ]8`+:O5`"UKU``M*],`+.O2`"RKT0`L:]`
+M`+"O:`"DKR6PH``EF,``___^,"P`I*\ED```);@``"6@```_``(D,`"BKS@`
+MH*]X`*./``````4`8H``````0!`"`/__0C`T`**O`@!BE````````4(P!0!`
+M$"6H``".$H:```````8``!````(\+`"DCP````"/$H:``````````CP``$(D
+M:`"DCW@`I8\)^$`````````6`@`#%@(`2@#`$CP`HJ\``,*6`````!0`0!`E
+M@```&`"D)T`8$``A&(,`P!`0`"$05@```$*4````````8J0!``(F__]0,`@`
+M`BX(`$`0)8@``L`0$``A$%8```!"E`````#P_T`40!@0`"6(``)X`*6/````
+M````I)0J`*(G$`"BKP$``CR4(T(D&`"E)R4P``()^$``*`"G)Q``(!(E@```
+M*`"CEQ@`HI<`````#`!B$`$``B88`*0G__]0,"L0$0(&`$`00!`0`"$0@@``
+M`$*4`````/C_8A0!``(F*`"CERH`HI<`````!P!B%,`0$`!X`*:/````````
+MPI0`````!@!B$,`0$``A$%8`!`!"C``````&`$`0`````,`0$``A$%8``@!"
+ME``````P`**O$`#`$R6````8`*0G0!@0`"$8@P"`$!``(1!0`$`0`@`A$%,`
+M"`!"E````````&*D`0`")O__4#`K$!X"]/]`%$`8$`!X`**/````````1)0J
+M`*(G$`"BKP$``CR4(T(D&`"E)R4PP`,)^$``*`"G)R6````H`*67*@"DEP(`
+M`!`8`*,G__]0,"L0'@(-`$`00!`0`"$08@```$*4``````(`HA1`$!``)9``
+M`B$08@```$*4`````/+_@A0!``(F):```B6```!X`*./``````(`8I0`````
+M0`!",`P`0!`%``(N%0!`%(`0$@`%``(D'P`"$@8``B0K``(2!P`")$,``A:`
+M$!(`-P``$"$04@`(``(N/@!`$````CR(.D(D@!@0`"$88@```&*,``````@`
+M0```````@!`2`"$04@!`$`(`(1!3``8`5Y0`````@!`4`"$05`!`$`(`(1!3
+M``8`590`````*0``$`````"`$!(`(1!2`$`0`@`A$%,`!`!7E`````"`$!0`
+M(1!4`$`0`@`A$%,`!`!5E``````;```0`````(`0$@`A$%(`0!`"`"$04P`"
+M`%>4`````(`0%``A$%0`0!`"`"$04P`"`%64``````T``!``````@!`2`"$0
+M4@!`$`(`(1!3````5Y0`````@!`4`"$05`!`$`(`(1!3````590`````>`"E
+MCP```````*24*`"EERH`II<0`+6O%`"@KP$``CQ$(D(D"?A``"4XX`(E($``
+M,`"FCP`````K$(8``@!`$"48P``E&(``__]D,'@`HX\``````@!BE``````0
+M`$(P$0!`$$`0$``L`*6/`````'`2HI0``````3!"+`H`0!1`$!``?A*CE```
+M``#__V(P*Q""``(`0!``````)1B``/__9#!`$!`````&/```QB0A*$8`-`"B
+MCSP`IH\`````(QA&`"H0@P`"`$`0`````"48@``7```6``"CI````SQX.F,D
+M:`"DCP```````H*,`````$`0`@`A$$,```!#E`````!`&`,````%/```I20`
+M`**4`````",00P``%`(``Q0"``,`0!PX`**O`0`&)#@`IJ]`$!`````#/```
+M8R0A*$,```"DE#@`HX\`````*A"#``(`0!`!``(F)1B``/__4#`(``(N4_]`
+M%```HZ0```0\``"$)```@I0L`*6/`````,0NHJP!``8D``#1,("'$0`&`(:4
+M`````#\`QC``-@8`)3`&`H"E$0`E,-0`!`""E``````_`$(P`!0"`"4PP@"`
+MFQ$`)3#3``(`@I0`````/P!",``2`@`E,,(`@(D1`"4PT0```(*4`````#\`
+M0C```!(\``!2)F@`I(\TF04T"?A``B4PP@````,\``!C)`X`8I0`````/P!"
+M,``6`@`E@`(")8`4`@P`8I0`````/P!",``4`@`E@`(")8`3`@H`8I0`````
+M/P!",``2`@`E@`(")8`1`@@`9I0`````/P#&,&@`I(\XF04T"?A``B4P!@(`
+M``(\``!")&@`I(\```8\``#&)```Q90)^$```````````SP``&,D``!BE&@`
+MI(\`````_@&"I&0`OX]@`+Z/7`"WCU@`MH]4`+6/4`"TCTP`LX](`+*/1`"Q
+MCT``L(\(`.`#:`"])ZC_O2=0`+^O3`"WKT@`MJ]$`+6O0`"TKSP`LZ\X`+*O
+M-`"QKS``L*\EJ,``__^7,/__MC`!``(\E"%")"4@X`(E*,`""?A``!@`IR<$
+M`$`0)2#@`A@`HI=-```0``````0`II8<`*(G$`"BKP$``CR4(T(D``"EC@GX
+M0``:`*<G&@"EER``HB<0`**O`0`0//`D$"8E(,`")3"@`@GX``(>`*<G'`"E
+MER0`HB<0`**O)2#``B4PH`()^``"(@"G)R8`LR<!`!`\E"$0)AH`I)<>`*67
+M)3"@`@GX``(E.&`"*`"R)QH`I)<@`*67)3"@`@GX``(E.$`"'@"EER``II<F
+M`*>7*`"BEP`````0`**O%`"@KP$`$3Q$(C$F"?@@`B4@P`(EH$``'`"DER(`
+MI9<E,*`""?@``B4X8`(<`*27)`"EER4PH`()^``")3A``B(`I9<D`*:7)@"G
+MER@`HI<`````$`"BKQ0`H*\)^"`")2#``AH`I9<<`*:7$`"BKQ0`H*\E(.`"
+M"?@@`B4X@`)0`+^/3`"WCT@`MH]$`+6/0`"TCSP`LX\X`+*/-`"QCS``L(\(
+M`.`#6`"])___A##__Z4P"`#(C``````$`,*4`````",`0!`E4``````"E0``
+M```9`$04`0!")0@`"24&``*5`````!,`0!`E&```!@`+)0``(I4`````!P!%
+M%$`0`P`A$$L`&`!"E````````.*D"`#@`P$``B0!`&(D__]#,`8``I4`````
+M*Q!B`/#_0!0"`"DE`0!")?__2C`$`,*4`````"L00@'?_T`4-``()0@`X`,E
+M$```%`"JC___A##__Z4P___&,/__YS`0`*B7`````&0`"208`.@`$A@``$<`
+M8!`E$````@!`$0`````!``DD.0#%$",0A0!`&`(`(1AB`,`8`P`A&&(`@!@#
+M`",0Q0`:`&(`$A@```(`0!0`````#0`'```<`P`#)`,`#0"!!``````(`$`1
+M)1#@`$`0!P`A$$<`P!`"`"$01P"`$`(``@``$/__0C#__T(P)@``$"480`!E
+M`((H#0!`%!@`B``(`$`1)1```4`0"``A$$@`P!`"`"$02`"`$`(``@``$/__
+M0C#__T(P%P``$"480``2&```9``")",01``8`$<`$A```"$88@``````&@!I
+M`!(8```"`"`5``````T`!P`)```0__]C,`<`0!$E&.``0!`#`"$00P#`$`(`
+M(1!#`(`0`@#__T,P)1!@``@`X`,`````$`"JC___QC!`$`8`(1"B`/[_2)0`
+M````__^$,$`0!``A$$0`P!`"`"$01`"`(`(```"CE`````!`$`,`(1!#`,`0
+M`@`A$$,`@!`"`/;_0B0K$((`"`!`$$`0"````**4````````XJ0``**4````
+M``@`X`,``$*E(1!(`,`0`@`A$$@`@!`"``H`0B0K$$0`$@!`$````````.BD
+M"`#@`P``2*4``"*5````````XJ0``"*5``````@`X`,``$*E```BE0``````
+M`.*D`@`BE0`````(`.`#``!"I1T`P!`E0```0!`(`"%(10```".5`````$`0
+M`P`A$$,`P!`"`"$00P"`$`(`(Q!$``D`0B03`$(LX_]`%``````"`".5````
+M`$`0`P`A$$,`P!`"`"$00P"`$`(`]O]")"L0@@#?_T`4`0`()2H0!@'F_T`4
+M0!`(``@`X`,`````X/^])Q@`OZ___X0P__^H,`@`Q8P`````!`#"E``````.
+M`$`0)1@`````HI0`````"@!($`$`8R0$`,:4`````"H09@`%`$`0-`"E)```
+MHI0`````^O](%`$`8R0&`*:4,`"BCP`````0`**O`0`"/)0C0B0)^$``"`"E
+M)!@`OX\`````"`#@`R``O2<```4\J#JE)`0`HXP`````$"R#K,`0`P`C$$,`
+M@!`"``@`I20A$$4`*"R"K`$``B0D+(*L%``")!PL@JPC``(D"`#@`R`L@JPT
+M$H*,``````(`0I0`````(`!",`@`0!`E0```'``#)$``!R1R``8D#`"@K'<`
+M`B0(```0$`"BK#(``R0E.```,@`&)!0``B0,`**L(P`")!``HJP$`*6,````
+M`"L0J``K&&4`)1!#``<`0!`E(```*Q"G`"L8Q0`E$$,``@!`$``````!``0D
+M"`#@`R40@`#H_[TG%`"_KQ``L*\E@(``Q"X&C@````!`,@8``'[&,````CP`
+M`$(D,)D%-`GX0```@,8T`0`"),`N`JX4`+^/$`"PCP@`X`,8`+TGX/^])QP`
+MOZ\8`+*O%`"QKQ``L*\E@(``)8@``A`L$B8D+`..`````"H`8!`E$```P"X#
+MC@$``B0D`&(4```"/```0B0E("`""?A``#"9!30E&$```(!B,!P`0!1"%@,`
+M!`!"KL`N`*X!``(\Q"5")"4@(`()^$``)2A``A,`0!0!``(\C"=")"4@(`()
+M^$``)2A``@T`0!`!``(\Q"=")"4@(`()^$``)2A``@<`0!@!``(\U"E")"4@
+M(`()^$``)2A``@(``B3`+@*NP"X"C@`````<`+^/&`"RCQ0`L8\0`+"/"`#@
+M`R``O2<$`*.,#`"BC``````K$$,`!@!`$"4@```0`**,`````"L08@`"`$`4
+M``````$`!"0(`.`#)1"``"4XH``4`..,`````'X`8!#__P(D``#DC`````#`
+M$`0`(Q!$`(`0`@````,\L#IC)"$00P`8`.*L!`#BC!``XXP`````*Q!#`"T`
+M0!0`````;0"`$/__`B0$`.*,``````@`XJP0`..,`````"L00P`A`$`4)4!@
+M````XHP`````'0!`$`````````(\J#I*)````CRP.DDD``#BC`````#__T8D
+M``#FK,`@!@`C((8`@"`$`"$0B@`8`.6,$`!#C`@`HHP`````(QAB`$`8`P`(
+M`.*,`````",00P`(`.*L(2")`"L02``#`$`4&`#DK.G_P!0`````"`#@`P$`
+M`B0$`..,#`#BC``````K$$,`/`!`%`````````(\J#I#C`````#__V,D``#D
+MC``````U`(,0_O\")`0`XXP`````"`#CK`P`XHP`````)4A``"L00P`I`$`4
+M`````````CRH.D.,`````/__8R0``.*,`````"4@0``K$$,`'P!`$````SPE
+M$&``J#I+)````CRP.DHDJ#IBC`````#__T@D`0"&)```YJS`(`8`(R"&`(`@
+M!``A$(L`&`#EC!``0XP(`**,`````",88@!`&`,`"`#BC``````C$$,`"`#B
+MK"$@B@`K$"(!!`!`%!@`Y*PK$,@`ZO]`%"4@P``(`.`#`@`")"40```(`.`#
+M`````!0`HHP`````%0!`$``````8`**,````````0I0`````T!."I!@`HHP`
+M`````@!"E`````#.$X*D&`"BC``````$`$*4`````,P3@J08`**,``````8`
+M0I0`````RA."I`@`X`,`````X/^])QP`OZ\8`+*O%`"QKQ``L*\ED(``)8B@
+M`"6`0`(```(\``!")`GX0``$@`4T__]#,`$``B0?`"(2`@`B*@4`0!``````
+M#P`@$@`````C```0``````8``B0%`"(2"``")!0`(A(`````'```$`````#(
+M+@:.`````"4P9@`%```0@0`#/,@N!HX`````)3!F`$(``SP```(\``!")"4@
+M0`($@`4T"?A``"4PPP`+```0`````,@N!HX`````)3!F`"```SP```(\``!"
+M)"4@0`($@`4T"?A``"4PPP`<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?H_[TG
+M$`"_KP$``CP\*D(DW`&%C`GX0```````$`"_CP`````(`.`#&`"])^#_O2<<
+M`+^O&`"RKQ0`L:\0`+"O)9"``````CP``$(D"?A``"6`H``EB$``_W\%//__
+MI30```(\``!")"4@0`()^$``)"@E`@```CP``$(D)2!``@GX0``P``4D)2!`
+M`/`#AC`&```2`C$&`"4``B0C$$8`0A`"``L``!`A,,(``@#"+`@`0!#__\8D
+M```"/```0B0E($`""?A``"4H(`(1```0)1````_\`R0D&(,``#$&`/`#QC``
+M``(\``!")"4@0`(P``4D"?A``"4P9@````(\``!")"4@0`()^$``)2@@`@$`
+M`B0<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?H_[TG$`"_KR4XH``E0(``"@#C
+M*`D`8!`E$````"D'`",HIP"`*`4`(2@%`0```CP``$(D"?A``%`LI200`+^/
+M``````@`X`,8`+TGZ/^])Q``OZ\E0,``)3B```H`HR@*`&`0)1`````Q!0`C
+M,,4`@#`&`"$PY@````(\``!")"4H``$)^$``4"S&)!``OX\`````"`#@`Q@`
+MO2?8_[TG)`"_KR``M*\<`+.O&`"RKQ0`L:\0`+"O)9B``"6(H``"``(D#0`B
+M$B6@P``#`"(N!@!`$`,``B0!``(D"0`B$O__`B0P```0``````L`(A((`!(D
+M+```$/__`B0'```0"0`2)%0L@HP``````P!`$"60```D```0)1`````1$@`C
+M$%(`@!`"`"&`@@!0+!`F!``#C@`````;`&`4__\")````CP``$(D)2```@GX
+M0``\``4D#0"`%@0`$:X+``(D#``"K@(``B04``*N__\")!@``J[_`P(D'``"
+MK@H``B0@``*F!P``$"(``J8```(\``!")"4@8`(E*$`""?A``"4P@`(E$$`"
+M)`"_CR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2?@_[TG'`"_KQ@`LJ\4
+M`+&O$`"PKR6`@``\+`*.`````/\#0C!$+`:.```````T!@#_`Q(\)##2````
+M$3P``#$FI``%)`GX(`(E,$8`0"P"C@````#_`T(P2"P&C@``````-`8`)##2
+M`"4@``*H``4D"?@@`B4P1@````(\``!")"4@``()^$``K``%)`#\`R0D$$,`
+M3"P&C@````#_`\8P)2```JP`!20)^"`")3!&`!P`OX\8`+*/%`"QCQ``L(\(
+M`.`#(`"])^C_O2<0`+^O)3B@`"4P@``*`.,L)@!@$"40````$0<`(Q!'`(`0
+M`@`A*,(`4"RE)`0`HXP`````'0!@$"40```$`*"L`0`#)`08XP`G&`,`/"S"
+MC``````D$&(`/"S"K$`LPHP`````)!!B`$`LPJQ$+,*,`````"008@!$+,*L
+M2"S"C``````D$&(`2"S"K$PLPHP`````)!AB``$``CPH+D(D"?A``$PLPZP!
+M``(D$`"_CP`````(`.`#&`"])]#_O2<L`+^O*`"VKR0`M:\@`+2O'`"SKQ@`
+MLJ\4`+&O$`"PKR6H@``EL*``):"@`C02I(X`````"@##+GP!8!`E$````!$6
+M`",05@"`$`(`(9B"`E`L<R8$`&..`````',!8!`!``(D&`!CCO__`B04`&(4
+M``````8`@!"@``,D`@""E`````"@`$(P`@!#$!\`!"0/``0D`0`')"L0Y``+
+M`$`0@(`6`$`0!P`!`$<T*Q#D`/W_0!1`$`<`!```$("`%@`8`&>.`````("`
+M%@#_`^<P'`!BC@````"`$@(`#P`#/`#\8S0D$$,`)3CB`!0`9HX``````#4&
+M`/`/`CPD,,(````"/```420E(*`"0!`%)@GX(`(E,.8`(@!FE@``````,08`
+M\`#&,"``8I8`````#P!","4PP@`(``(\`"!"-"4@H`*`$`4F"?@@`B4PP@`E
+M(*`"P`D%)@GX(`(`"`8DS`&BC@`````$`$(L!`!`$"4@H`(`$04F"?@@`@`!
+M!CPD`&*.`````!X`0!#_``,\@(`6`/__8S0D&$,`*`!FC@``````-@8````"
+M/```0B0E(*`"P`@%)@GX0``E,&8````"/```0B0E(*`""?A``,`)!28E&$``
+M*`!BC@`````"`$`0`0!F-`$!9C2`*!8````"/```0B0E(*`""?A``,`)I20P
+M`&*.``````L`0!"`*!8`_P`&//__QC0D,$8```$#/````CP``$(D)2"@`@`)
+MI20)^$``)3##`"P`8HX`````&0!`$("`%@`/``8\___&-"0P1@`0``,\```"
+M/```420E(*`"P!`%)@GX(`(E,,,`#`!BC@`````@`$(P"@!`$,`)$"8```(\
+M``!")"4@H`()^$``)2@``B4@H`(E*``""?@@`@`"1C0,`&*.`0`#/"000P`.
+M`$`0@(`6```1$"8```(\``!")"4@H`()^$``)2@``B``!CP```,\``!C)"4@
+MH`(E*``""?A@`"4P1@`,`&*.@``#/"000P`-`$`0@(`6```1$"8```(\``!"
+M)"4@H`()^$``)2@``@```SP``&,D)2"@`B4H``()^&````)&-`0`8XX"``(D
+M!0!B$`,``B0?`&(0@)`6`$D``!``````@(`6`,`)$"8```(\``!")"4@H`()
+M^$``)2@``@```SP``&,D)2"@`B4H``()^&``H@!&-,P!HHX`````!`!"+`(`
+M0!`E``,\)0$#/(`H%@````(\``!")"4@H`(`$:4D"?A``"4P8``M```0````
+M`,`)428```(\``!")"4@H`()^$``)2@@`@``$#P``!`F)2"@`B4H(`()^``"
+M8@)&-````CP```,\``!"C```8XP`````(Q!#`,PN@XX`````(QAB`````CP`
+M`$*,`````",88@"`&@,```$&/"4@H`(`"44F"?@``B4P9@#,`:*.``````0`
+M0BP"`$`0!``#/`0!`SR`*!8````"/```0B0E(*`"P`FE)`GX0``E,&``.`!B
+MC@`````!`$(P#@!`$("`%@``$1`F```"/```0B0E(*`""?A``"4H``(D``8\
+M```#/```8R0E(*`")2@``@GX8``E,$8`#`!BC@`````!`$(P!P!`$`$``B0$
+M$,("/"R#C@`````E$$,`!P``$#PL@JX$$,(")Q`"`#PL@XX`````)!!#`#PL
+M@JX,`&*.``````$`0C`'`$`0`0`")`00P@)`+(..`````"400P`'```00"R"
+MK@00P@(G$`(`0"R#C@`````D$$,`0"R"K@P`8HX``````@!",`<`0!`!``(D
+M!!#"`D0L@XX`````)1!#``<``!!$+(*N!!#"`B<0`@!$+(..`````"000P!$
+M+(*N#`!BC@`````$`$(P!P!`$`$``B0$$,("2"R#C@`````E$$,`!P``$$@L
+M@JX$$,(")Q`"`$@L@XX`````)!!#`$@L@JX,`&*.``````@`0C`'`$`0`0`"
+M)`00P@),+(..`````"400P`'```03"R"K@00P@(G$`(`3"R#C@`````D$$,`
+M3"R"K@$``CPH+D(D)2"@`@GX0``E*&`"`0`")"P`OX\H`+:/)`"UCR``M(\<
+M`+./&`"RCQ0`L8\0`+"/"`#@`S``O2?H_[TG$`"_KX`H!0````(\``!")`GX
+M0```"*4D$`"_CP`````(`.`#&`"])^C_O2<0`+^O@"@%`````CP``$(D"?A`
+M```(I20!``(D$`"_CP`````(`.`#&`"])^C_O2<0`+^O`0`&)`0PI@````(\
+M``!")`GX0`!`"`4D`0`")!``OX\`````"`#@`Q@`O2?8_[TG(`"_KQP`LZ\8
+M`+*O%`"QKQ``L*\EF(``)9"@`(`H$@````(\``!1)`GX(`(`"J4D`P!0,`D`
+M`!8E(&`""?@@`D`(!20!``,D!!A#`B000P`#`$`0)1```@$`$"0E$``"(`"_
+MCQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])]C_O2<D`+^O(`"TKQP`LZ\8`+*O
+M%`"QKQ``L*\ED(``)8B@``$`!B0```(\``!")(`(!20)^$``!#`F`B6`````
+M``(\``!4)````CP$```0``!3)`GX8`(*``0D`0`0)A`G`BH&`$`0```"/"4@
+M0`()^(`")2@@`O;_0!0```(\``!")"4@0`*`"`4D"?A``"4P```0)P(J)`"_
+MCR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2<8`**/(`"GCR0`HX\H`*2/
+M`````/\/QC"`%`(`)3#"`$`>`P`!`((P`P!`$"4PPP```0(\)3#"`!``@C`"
+M`$`0`"`"/"4PP@`$`((P`@!`$$```CPE,,(`(`"",`(`0!"```(\)3#"``L`
+MIJ@(`*:X$`"BCP````"`'@(``@"",`(`0!"```(\)1AB``\`HZ@,`*.X__\"
+M)`\`XA`/``,\#P"DB`P`I)A`$P<``.!C-"000P`E(((`#P"DJ`P`I+@+`**(
+M"`"BF`!``SPE$$,`"P"BJ`@`HK@(`.`#`0`")`@`X`,E$```"P"BB`@`HI@`
+M(`,\)1!#``L`HJ@(`**X"`#@`P`````0`*./``````<`X!``````#P"BB`P`
+MHI@4`&`4)1!&`!(``!``$$(T``````P`8!``````%`"BCP`````+`$.("`!#
+MF``````+`*.H"`"CN`\`IJ@,`*:X!@``$"408``+`*"H"`"@N``0PC0/`**H
+M#`"BN!<`H*@4`*"X%P"BB!0`HI@`````$P"BJ!``HK@(`.`#`0`")!<`HX@4
+M`*.8``````$`8S!:`&`0#P`")!<`HH@4`**8`````/X?0C!"$`(```#"I!,`
+MHH@0`**8``````(4`@`"`,*D!`#`H!,`HH@0`**8``````$`0C`<`$`4````
+M`!,`HH@0`**8``````(`0C`"`$`0`0`")`0`PJ`3`**($`"BF``````(`$(P
+M!0!`$``````$`,*0``````(`0C0$`,*@$P"BB!``HI@`````!`!",`4`0!``
+M````!`#"D``````$`$(T!`#"H`L`HH@(`**8`````((4`@`/`$(P!0#"H!<`
+MHH@4`**8`````$(3`@`&`,*@$P"BB!``HI@```````]",`(:`@`'`,.@$P"B
+MB!``HI@`````\`!",`(1`@`(`,*@$P"BB!``HI@``````/!",`(3`@`)`,*@
+M"@#`H/\`8C`#`$`0"P#`H`$`8B0'`,*@"`#"D``````%`$`0``````@`PI``
+M`````0!")`@`PJ`E$```"`#@`P`````(`.`#``````````"\+H*0``````@`
+M0C2\+H*@!`"BD``````(`$(T!`"BH+HN@I0```````"BI+PN@I``````!`"B
+MH+TN@I``````!0"BH`@`X`,E$````````.#_O2<8`+^O%`"QKQ``L*\EB(``
+M```0/```$":`0`4D2)(&/`GX``(`_,8T)2`@`H!`!222)`8\"?@``B1)QC0E
+M("`"@$`%)``H!CP)^``".0#&-"4@(`*`0`4D%E,&/`GX``(D",8T)2`@`H!`
+M!228Y08\"?@``GD%QC0E("`"@$`%)!T`!CP)^``"_^_&-"4@(`*`0`4DJAH&
+M/`GX``)`OL8T)2`@`H!`!200O@8\"?@``E15QC0E("`"@$`%)`X`!CP)^``"
+M!S#&-"4@(`*$0`4D"?@``B4P```8`+^/%`"QCQ``L(\(`.`#(`"])^#_O2<<
+M`+^O&`"RKQ0`L:\0`+"O)8B``````CP``$(DT)@%-`GX0``6'`8D)8``````
+M`CP``%(D)2`@`H"8!30)^$`"`0`&/`$`$"8(``(J^O]`%"4@(`(```(\``!"
+M)`GX0```G`4T`AX"``(A`P`/`&,P`!D#`````CP``$(D)2"#``GX0``(``4D
+M'`"_CQ@`LH\4`+&/$`"PCP@`X`,@`+TGB/^])W``OZ\E8(``)3B``<G_`B00
+M`**O%`"BKQ@`HJ\<`**OPO\")"``HJ_R_P(D*`"BKRP`HJ\P`**O-`"BK_3_
+M`B0X`**OP/\")$``HJ]$`**O2`"BKTP`HJ^Z_P(D4`"BK[+_`B18`**O7`"B
+MKV``HJ]D`**OL/\")&@`HJ\E*```$`"K)P0`YB0H`*HG0`"I)U@`J">`&`4`
+M(2!G`"$08P$``$*,`````"A&@JPA(&8`(1!#`0``0HP`````.$:"K"$@9P`A
+M$",!``!"C`````!01H*L(2!F`"$8`P$``&*,`````&!&@JP!`*4D!0"B*.C_
+M0!0```(\``!")"4@@`$)^$```0`%)'``OX\`````"`#@`W@`O2=`*`4`(2BF
+M`$`H!0`A**0`_A6BE``````(`.`#`````-#_O2<H`+^O)`"UKR``M*\<`+.O
+M&`"RKQ0`L:\0`+"O)8"``"60P``EF.``0`"TC___M3```!$\```Q)@``!3S0
+M.Z4D"?@@`G`2!B0,`!*N$``3KA0`%*[(`16FR@$`IC\``B3\`0*F``(`KKPO
+M`*[`+P"N``@"/,PO`JZ!!P(DU"\"KMPO`*X_``(\/S]"-.`O`JYD``(DY"\"
+MK@(``B3H+P*N__\")/@O`J[\+P*N`#`"KCPL!"8```4\4$ZE)`GX(`(&``8D
+M!#``HB@`OX\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#,`"])_\`A##_
+M`*4P)3```````CQ83DDD```"/%E.2"0```(\6DY')$`0!@`A&$8`(1!I````
+M0I``````"P!$%"$0:````$*0`````"L0H@`&`$`4(1!G````0Y``````*QAE
+M``4`8!`!``(D`0#&)`0`PBSL_T`4)1````@`X`,`````P/^])SP`OZ\X`+:O
+M-`"UKS``M*\L`+.O*`"RKR0`L:\@`+"O)9"@`"68P``EB.``4`"VC___D#``
+M``(\``!")`GX0`"H1@0D):!```0`@!8E*``"`@`#)!P"`!```,.N$`"QKQ0`
+MMJ\```(\``!")"4@@`(E,$`""?A``"4X8`(ED(`"```"/```0B0E((`")2@`
+M``GX0``!``8D&`!`$````CP``$(D)2!``@GX0``@0`4D_P!#,`(9`P#,`4.N
+M#P!",-`!0J8!``(\$#]"),P!1)+0`462"?A```````!Z`4`0```"/```0B0E
+M($`""?A``"4H```$`$`4```"/`,``B3F`0`0'`"BKP``0B0E($`""?A``!B8
+M!332`4*FS`%#C@D``B0(`&(0"@`")`L`8A0```(\T`%"E@`````$`$(L!@!`
+M$````CP!``(\4#M")`GX0``E($`"```"/```0B0)^$``)2!``@,`0!0.``(D
+MR@$`$!P`HJ_,`4*.``````4`0BP-`$`4```"/````CP``$(D)2!``@GX0``0
+M0`4D```#/```8R0E($`"$$`%)`GX8```$$8T```"/```0B0E($`"`)@%-`GX
+M0``'``8D```"/```0B0)^$``)2!``M0!0J;P`$,P,``")#X`8A`Q`&(H"`!`
+M$&```B00``(D.0!B$"```B0W`&(0``````T``!``````,P!B$&$`8B@&`$`0
+MH``")%```B0N`&(0``````0``!```````````"D`8A``````U`%"E@`````E
+M`$`4!0`"),P!0XX`````!P!B%$,``CS0`4.."0!"-`,`8A1&``(D&P``$-0!
+M0J;,`4*.``````<`0S@!`&,L"P!".`$`0BPE&&(``P!@$%$``B00```0U`%"
+MILP!0XX*``0D"@!D$`D``B0)`&(08@`")`X`9!0)``(DT`%"E@`````$`$(L
+M!0!`$`H``B1B``(DU`%"ILP!0XX*``(D%P!B$`D``B3,`4..`````!,`8A`*
+M``(D!@!B%`````#0`4*6``````0`0BP-`$`4```"/-0!0Y8`````\`!B,-#_
+M0B1``$(L!@!`$````CP/`&(P!0!"+.``0!0-``(D```"/```0B0E($`"P0`%
+M)`GX0``8`*8G2P%`$`@``B08`**7``````(P0BP$`$`0)2!``@4``B1$`0`0
+M'`"BKQ@`HI<`````<!*"I@```CP``$(D"?A``!!`!208`$,PPA@#``(``B01
+M`&(0`P`")`P`8A`)``(DS`%#C@`````+`&(0"@`")`<`8A0`````T`%"E@``
+M```$`$(L!0!`%````CP*``(D*`$`$!P`HJ\```(\``!")"4@0`(_``4D"?A`
+M`!@`IB<>`4`0)2!``A@`HI<`````<A*"I@```CP``$(D'``%)`GX0``8`*8G
+M%0%`$`@``B08`**7`````!$`0!`E($`"&`"BEP````#P_U$P`(L1`````CP`
+M`$(D&P`%)`GX0``8`*8G!@%`$`@``B08`**7`````"6((@("```00/\Q)D`#
+M$20E@```#P`@$B68``````(\``!5)"4@0`+```4F"?B@`A@`IB?T`$`0`0`0
+M)A@`HI<`````)IAB`BL0$0+V_T`4)2!``O__`C0#`&(2!P`").L``!`<`**O
+M"@`").83@J8#``(D\!6"IB6````&`(,F"P`$)$`0$``A$%``@!`"`"$04`"`
+M$`(`(1!#`.@31*0!`!`F"@`"+O?_0!1`$!``)8```````CQ`3DHD`@"()@``
+M`CQ(3DDD#`"')@L`!20(`(8F0!`0`"$@5``A&$H```!CE`````#X%8.D(2!(
+M`"$820```&.4`````/`5@Z0A$%``@!`"`"$04`"`$`(`(1A'`*@69:0A$$8`
+M$!9%I`$`$"8#``(NZ_]`%$`0$`````(\``!")"4@0`()^$``<!*%)K$`0!`(
+M``(D<!*"E@`````#4$(L%0!`$`H`!"3,`4..``````H`9!`)``(D"0!B$&@&
+M`B0-`&04`````-`!0I8`````!`!"+`@`0!``````:`8")``6@J:P!`(D!!:"
+MI@"``C0(%H*F_A6"IHH2@I8`````(P!`$!```R34`4*6`````/``0C`>`$,4
+M```1/```,28E($`"`)@%-`GX(`('0`8D```0/```$"8)^``"T`<$)````CP`
+M`$(D"?A``"4@0`+6`4*F)2!``@"8!30)^"`"!P`&)`GX``+0!P0DU@%"E@``
+M``#P`$(P(``#)`4`0Q````(\#0`")',``!`<`**O```"/```0B0E($`"OP`%
+M)`GX0``8`*8G:@!`$`@``B08`**7`````'02@J8(`D*F```"/```0B0)^$``
+M)2!``E\`0!`*``0DS`%#C@`````+`&00```"/`D``B0(`&(0```"/`@`9!0`
+M````T`%"E@`````$`$(L`P!`$````CP5```0``!"),P!0HX`````!P!#.`$`
+M8RP+`$(X`0!"+"488@`#`&`0```"/`H``!```$(DU`%"E@````#P`$(PT/]"
+M)$``0BP(`$`0```"/````CP``$(D)2!``@GX0``<`*4G!0``$````````$(D
+M)2!``@GX0``<`*4G,@!`$`````#$+(*.`````,`!0JX```(\``!")`GX0``E
+M($`")9@``"6````?`!4D```"/```420E($`"(RBP`@GX(`(8`*8G'@!`$$`8
+M$``8`**7`````"&88@(A('0``A("`#`L@J`E&(``&`"BDP`````Q+&*@`0`0
+M)@,``B[M_T`4`0!C+@(``CS]_T(T)A!B`@$`0BPE&&(`!`!@$`$``CP)``(D
+M"```$!P`HJ_D/$(D"?A``"4@0`(.```0)1!``@@``B0<`**O!`"`$@```CP`
+M`$(D"?A``"4@@`(%`,`2)1```!P`HH\```````#"KB40```\`+^/.`"VCS0`
+MM8\P`+2/+`"SCR@`LH\D`+&/(`"PCP@`X`-``+TGZ/^])Q0`OZ\0`+"O```"
+M/```0B0)^$``)8"``*@L`HX``````P!`$``````)^$``)2```@```CP``$(D
+M"?A``"4@``(```(\``!")"4@``(!``4D"?A```$`!B0```(\``!")"4@``()
+M^$``<!(%)@```CP``$(D"?A``"4@``(4`+^/$`"PCP@`X`,8`+TGH/^])UP`
+MOZ]8`+ZO5`"WKU``MJ],`+6O2`"TKT0`LZ]``+*O/`"QKS@`L*\EH(```(`"
+M-!``HJ\@F`(T%`"BKU55`CQ554(T(`"BKZJJ`CRJJD(T)`"BKV9F`CQF9D(T
+M*`"BKYF9`CR9F4(T+`"BKR6X```0`*(G,`"BKQ@`OB>`@!<`,`"CCP`````A
+M$'````!2C``````E((`"```#/```8R0)^&``)2A``B&`T`,```*N)8@````4
+M$0`E@%$`)2"``B4H0`(```(\``!")`GX0``E,``")2"``@```SP``&,D"?A@
+M`"4H0`(#`%`0`0`Q)C```!`E$`````$B*N[_0!0`%!$`)8@``"``LR<```(\
+M``!6)````CP``%4D@!`1`"$08@(``%",`````"4@@`(E*$`""?C``B4P``(E
+M((`""?B@`B4H0`(#``(2`0`Q)A@``!`E$```!``B*O#_0!2`$!$`@!`7`#``
+MI(\`````(1B"`"$0P@,``&6,``!&C````CP``$(D"?A``"4@@`(!`/<F`@#B
+M*KG_0!2`@!<````"/```0B0)^$``9``$)`$``B1<`+^/6`"^CU0`MX]0`+:/
+M3`"UCT@`M(]$`+./0`"RCSP`L8\X`+"/"`#@`V``O2?__Z4P``&B,`8`0!`S
+M$P(D``#"I-07`B0``.*D"`#@`P$``B2``*(P#P!`$`````"*$H*4``````8`
+M0!0("0(DC!*"E``````'`$`0``````@)`B0``,*DK`H")```XJ0(`.`#`0`"
+M)`@`X`,E$```T/^])R@`OZ\D`+.O(`"RKQP`L:\8`+"O)9"``"680`(EB$`"
+M$`"@IW`20I8``````5!"+`<`0!3@`5`FH`%"CLD`!20)^$``$`"F)VP!0!``
+M````U`%"E@````#P`$(P0``#)`(`0Q0`````AA)@IA``HI<`````#0!`%`<`
+M`B3,`4..``````D`8A0(``(DT`%#E@`````%`&(4!0`")!``HJ<!``(D=A)B
+MIG@28J;<`2..!@`")!,`8A!E<`(DR@$CE@`````/`&(4``````@"(Y8`````
+MG/]B)`(`0BP$`$`000`")`4`8B0&```0"`(BI@@"(Y8``````@!B%$,``B0(
+M`B*F!```KH828I8`````!P!`$`$``B0$``*N=A)BE@`````"`$`4`P`")`0`
+M`JZ*$F*6``````4`0!``````!``"C@`````$`$(T!``"KHP28I8`````#P!`
+M$!$.`B3*`2.6``````P`8A`("0(D!``#C@`````(`&(T!``"KG@28I8`````
+M!`!`%`@)`B0H`&(T!``"K@@)`B00``*FU`%"E@````#P`$(PT/]")$``0BP7
+M`$`4Q`D"),P!1(X`````!P"#.`$`8RP+`((X`0!"+"488@`.`&`4Q`D")`H`
+M`R0*`(,0"0`")`D`@A#$"0(D"0"#%*P*`B30`4*6``````0`0BP$`$`0K`H"
+M),0)`B0"```0$@`"IA(``J8S$P(D#``"IM07`B0.``*F```"CO^_`R0D$$,`
+M`(!"-````JX0`**7``````(`0C`.`$`4)2```,P!0XX`````!@!B+`@`0!`%
+M``(D"`!B%$`3!`#0`4*6``````0`0BP#`$`40!,$``$`!"1`$P0````#C@``
+M```F$$,``"!","888@#_^P(D)!AB```(8S00`**7`````$(0`@`!`$(X`0!"
+M,$`2`@`F$$,```)","888@````.NS`%"C@`````'`$(L`P!`%``08C0%```0
+M```"K@```H[_[P,D)!!#`````JX```*.``````,`0C0```*NT`$BE@`````"
+M`$(L!0!`$`L``B3,`4..`````"\`8A0`````$`"BEP`````!`$(P!P!`%"48
+M```$``*.``````D`0C`#`$`0@!`#``$``R2`$`,````#C@`````F$$,`!`!"
+M,"888@`0`**7`````,(0`@`!`$(X`0!",,`0`@`F$$,`"`!","888@````.N
+M$`"BEP`````$`$(P!P!`%"48```$``*.``````D`0C`#`$`0`!$#``$``R0`
+M$0,````#C@`````F$$,`$`!","888@"@`&,T```#K@```HX`````0`!#,"80
+M0P````*N.!-BC@`````%`$`0)1@``#P38HX``````P!`%``:`P`!``,D`!H#
+M`````HX`````)AAB```!8S`F$$,``0`#/"400P`"``,\)1!#``0``SPE$$,`
+M"``#/"400P````*NS`$CC@4``B0%`&(4"``")-`!(Y8`````!@!B$`````#,
+M`2*.``````8`0BP%`$`4`````````HX0``,\)1!#`````JX0`**7`````/`!
+M0C`#`$`0`A$"``,``!`(``*F"@`")`@``J80`**7``````#P0C`%`$`0`AL"
+M``$``B0$$&(``P``$`H``J:```(D"@`"IM0!0I8`````\`!",-#_0B1``$(L
+M"`!`$-__`SP```*.(``#/"400P!```,\)1!#``@``!````*N```"CO__8S0D
+M$$,`O_\#//__8S0D$$,````"KGH28I8`````#`!`$"4@0`*@`4*.#P`%)`GX
+M0`!($B8F!@!`$`$``B1,$B*N```"CH```SPE$$,````"KLP!0HX`````!0!"
+M+&@2(J[,`4..!0`")`4`8A0E(```T`%#E@D``B0&`&(0`````,P!0HX`````
+M!@!"+`,`0!0`%@0``0`$)``6!`````..`````"800P```00\)!!$`"888@``
+M``.N#P`")!0``JX!``(D*`"_CR0`LX\@`+*/'`"QCQ@`L(\(`.`#,`"])^#_
+MO2<8`+^O```"/```0B0)^$``$`"E)P$``B08`+^/``````@`X`,@`+TG`0`"
+M)`4`HA0!``(\```"/```0B0(`.`#<`""K(A10B0(`.`#<`""K`````#8_[TG
+M)`"_KR``LJ\<`+&O&`"PKR6`@``ED*`````"/```420$`$:."?@@`BB`!30E
+M(``"#`!&C@GX(`(L@`4T)2```A``1HX)^"`",(`%-"4@``((`$:."?@@`C2`
+M!30``$*.``$#/"000P`.`$`0```"/```0B0E(``""?A``!``I2<T$@*.)2``
+M`"4H```H`$2L+`!%K"4@``(@@`4T"?@@`@`!!CP```(\``!")"4@``(``$:.
+M"?A``""`!30D`+^/(`"RCQP`L8\8`+"/"`#@`R@`O2?0_[TG*`"_KQ0`I:_<
+M`8.,`0`")`D`8A#__P(T#0!@$````CP&``(D"0!B$`@``B04`&(4`0"B)/__
+M`C0<`**O!P`"//__0C0-```0(`"BKP```CP``$*,`````",0H@#`$`(`'`"B
+MKP```CP``$*,`````",0H@#`$`(`(`"BKP$`HB08`**O@`$"//__0C0D$,(`
+M$`"BKP```CP``$(D"?A``!``I2<H`+^/``````@`X`,P`+TGX/^])Q@`OZ\4
+M`+&O$`"PKR6(@````!`\```0)BB`!30)^``")3```````CP``$(D)2`@`@GX
+M0``$@`4T!``#/"400P#/_P8\___&-"4@(`($@`4T"?@``B0P1@`E("`"((`%
+M-`GX``+__P8T&`"_CQ0`L8\0`+"/"`#@`R``O2?0_[TG*`"_KR0`M:\@`+2O
+M'`"SKQ@`LJ\4`+&O$`"PKR6@@``EB*``$@`BE@`````;`$`0)9"``@```CP`
+M`$(D"?A```2`!300``8\```0/```$"8E((`"!(`%-`GX``(E,$8`)2"``A``
+M)I8)^``")(`%-"4@@`(2`":6"?@``CB`!304`":.)2"``C"`!30)^``"P#`&
+M``\``!````(\```"/```0B0E((`""?A```2`!33O_P8\___&-````SP``&,D
+M)2"``@2`!30)^&``)#!&`````CP``$(D)2"``@``)HX)^$``*(`%-````CP`
+M`$(D)2"``@GX0``@@`4T@/\#/"000P`(`".6`````"4P0P`8`"*6``````4`
+M0!`$`$(D`!0"`'\``SPD$$,`)3#"````$#P``!`F)2"``@GX``(@@`4TU"]&
+MCO__`CS_`$(T)##"`!H`(I8``````!("``#_0C`E,,(`U"]&KB4@@`()^``"
+M&(`%-`@`,Y8`````'``CC@`````K$&,"`@!`$``````EF&``#``RC@`````<
+M`"..`````"L00P("`$`0`````"608``$`'(6``````0`-8X#```0````````
+M-8X`````!``FC@````#]_\8DP#`&``<`$3S__S$V)##1`!@*`CP``!`\```0
+M)B4@@`+4@`4T"?@``B4PP@#]_Z8FP#`&`"0PT0``"@(\)2"``MB`!30)^``"
+M)3#"`/__8C(`-!(`)2"``MR`!30)^``")3!&`"@`OX\D`+6/(`"TCQP`LX\8
+M`+*/%`"QCQ``L(\(`.`#,`"])P````#@_[TG'`"_KQ@`LJ\4`+&O$`"PKR6(
+M@``E$*``)9#`````$#P``!`F`&`%)`GX``(E,$``)2`@`@A@!20)^``"`0`&
+M)````CP``$(D)2`@`@Q@!20#``8D"?A```(`!R0'`$`0)2`@`@```CP``$(D
+M"?A```1@!20``$*F`0`")!P`OX\8`+*/%`"QCQ``L(\(`.`#(`"])P``````
+M````X/^])Q@`OZ\4`+&O$`"PKR6(@``E@*`````"/```0B0)^$``%$`%)$"`
+M$``#``8D!#`&`@```SP``&,D)2`@`A1`!20)^&``)3!&``$``B08`+^/%`"Q
+MCQ``L(\(`.`#(`"])^#_O2<8`+^O%`"QKQ``L*\EB(``)8"@`````CP``$(D
+M"?A``!1`!21`@!```P`&)`0P!@(G,`8````#/```8R0E("`"%$`%)`GX8``D
+M,$8``0`")!@`OX\4`+&/$`"PCP@`X`,@`+TGX/^])QP`OZ\8`+*O%`"QKQ``
+ML*\ED(``)8B@`"6`P`````(\``!")`GX0``80`4D`0`#)`08(P(G&`,`)!!#
+M``$`$#($@#`"```#/```8R0E($`"&$`%)`GX8``E,%```0`")!P`OX\8`+*/
+M%`"QCQ``L(\(`.`#(`"])^C_O2<4`+^O$`"PKR6`H``&``(N"`!`$/__`B0`
+M``(\``!")`GX0``<0`4D+P!",`80`@(!`$(P%`"_CQ``L(\(`.`#&`"])^#_
+MO2<<`+^O&`"RKQ0`L:\0`+"O)9"``"6`H``EB,`````"/```0B0)^$``%$`%
+M)$`8$``#``0D!"!D``$``SP`\&,T)QAD`"0P0P``@Q``)3#0``,`(!(`@,8T
+M`0`"/"4PP@````(\``!")"4@0`()^$``%$`%)$0L0XX``04\```"/```0B0E
+M($`""?A``"4H90`<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2<`````Z/^])Q``
+MOZ\```(\``!")`GX0``(0`4D`0!".`$`0BP0`+^/``````@`X`,8`+TGT/^]
+M)RP`OZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O)9B``"6@H``EJ```
+M);!@`@```CP``%`D"?@``H``!22```,\)!!#`!<`0!`E(&`""?@``HP`!20E
+M&$````$"/"008@`"`$`0`"`"/"``%3PD$&(``@!`$$```CPEJ*("``0"/"00
+M8@`"`$`0@``"/"6HH@(``@0\)!!D``,`0!````(\):BD`@```CP``$(D)2!@
+M`@GX0`#```4D)9!``/__`B0#`$(6)1```%L``!```("N!0$"/+K80C0D&$("
+M"``"/"000@($`$`0``"#K@!``CPE$&(```""K@4`0C(&`$`0P`5",@``@HX`
+M`````0!"-```@J[`!4(R'0!`$```$#P``(*.`````$``0C0``(*N```0)B4@
+M8`()^``"Q``%)/\#1#"@1L..`````"4@@P#_`Q$\)!!1``(4`@`E$$0`H$;"
+MKB4@8`()^``"R``%)/\#1#"@1L..`````"4@@P`D$%$``A0"`"401`"@1L*N
+M(`!",@D`0!``````:!)BC@`````%`$`0`$`#/```@HX`````)1!#````@JX`
+M`(*.`````"40H@(``(*N`$`#/"000P`7`$`0```0/%`2<JX``!`F)2!@`@GX
+M``+$``4D5!)BKB4@8`()^``"R``%)%@28JXE(&`""?@``LP`!21<$F*N)2!@
+M`@GX``+0``4D8!)BKB4@8`()^``"U``%)&028JX!``(D+`"_CR@`MH\D`+6/
+M(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#,`"])T0L@HP`````"`#@`P````#0
+M_[TG*`"_KR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6@@``EB*``1"R5C@``
+M```+`*$&)9B``@```CP``$(D)``%)`GX0``E,``````"/```0B0E((`""?A`
+M`"0`!20%`0(\NMA"-"0P(@)``"(R%0!`$"6```#,+&*.``````(`0!``````
+M0`#&--`L8HX``````@!`$````````<8TU"QBC@`````"`$`0`````(``QC38
+M+&*.``````,`0!`!`"(R``3&-`$`(C("`$`0X`("/`<`QC0D$"("%@!`$(``
+M`CPE,,(`(``"/"00(@("`$`0``$"/"6``@)```(\)!`B`@(`0!``(`(\)8`"
+M`H```CPD$"("`@!`$``$`CPE@`("``(#/"00(P(#`$`0`$`"/"6``P(`0`(\
+M)!`B`@(`0!`(``(\)3#"`````CP``%(D)2"``@GX0`*@``4D```"/```0B0E
+M((`""?A``*P`!23_2`,\__]C-"000P`E((`"K``%)`GX0`(E,%``!0`A!D0L
+M<:XE((`")``%)`GX0`(!``8D)1"@`B@`OX\D`+6/(`"TCQP`LX\8`+*/%`"Q
+MCQ``L(\(`.`#,`"])P``````````Z@&"E``````(`.`#`````.C_O2<0`+^O
+M__^C,.H!@I0`````*Q!B``L`0!`E$```0!D#`!R(!30```(\``!")`GX0``A
+M*&4``(!#,`(`8!0!``(D)1```!``OX\`````"`#@`Q@`O2?(_[TG-`"_KS``
+MOJ\L`+>O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR68@`#__[4PZ@%C
+ME@`````K&*,"3@!@$"40``!`@14`%(@1-"&($0(```(\``!")`GX0``E*"`"
+M)9!``````CP``%0D)2!@`@"(`C0A*`(""?B``B4P```$B!XT)2!@`B$H'@()
+M^(`")3````B(%S0E(&`"(2@7`@GX@`(E,```#(@6-"4@8`(A*!8""?B``B4P
+M```0B`4T)2!@`B$H!0()^(`")3```"4@8`(E*"`""?B``@<`!B08B`4T)2!@
+M`B$H!0()^(`")3```!R(!30E(&`"(2@%`@GX@`(E,```!``")!H`0A8!``(D
+MS"]BC@`(`SPD$$,`%`!`$$``L";__Q`R0($0`"4@8`(`B`(T(2@"`@GX@`(E
+M,```)2!@`B$H'@()^(`")3```"4@8`(A*!<""?B``B4P```E(&`"(2@6`@GX
+M@`(E,````0`")#0`OX\P`+Z/+`"WCR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"Q
+MCQ``L(\(`.`#.`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR68@``E(,``
+M__^E,.H!8Y8`````*QBC`"L`8!`E$```&@"`$``````%`)*0``````"2$@`$
+M`(*0`````"600@(#`(:0```````V!@`"`(*0```````4`@`E,,(``0""D```
+M````$@(`)3#"````@I``````)3#"`$(P!@#`%Q(`)3#"``,``!!"D!(`)9``
+M`"4P``!`B04`&(@%-```$#P``!`F)2!@`@GX``(A*"4"'(@%-"4@8`(A*"4"
+M"?@``@"`1C8!``(D(`"_CQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])[#_O2=,
+M`+^O2`"^KT0`MZ]``+:O/`"UKS@`M*\T`+.O,`"RKRP`L:\H`+"O);"``"60
+MP`!<`*>O8`"BC___I3`0`*6O%`"VK^`!Q":JJ@4\`@!`%*JJI30E*```"@"#
+ME!``HH\`````*QA#`%4!8!`E$`````!#D@`````&`&(L4`%`$"40``````(\
+M<$Y")(`8`P`A&&(```!BC``````(`$````````4``R0R```0&`"CKP``@XP`
+M`````"!C,$`!8!`E$```!@`")"H``!`8`**O!``#)!@`HZ_,+\*.``@#/"00
+M0P`C`$`0`````!``HX\`````0`!B)`H`@Y0`````*A!#`!L`0!0E$```+`$`
+M$``````"`$.6``````4`8RPG`6`4)1````(`0I8`````!@!"+`\`0!08`*"O
+M`@!"E@`````.`$(L`0`#)`D`0!08`*.O`P`")`8``!`8`**O!P`#)`,``!`8
+M`*.O%`$`$"40```$`%>2!0!"D@``````$@(`);CB`@8`0I(``````!0"`"6X
+MX@('`$*2```````6`@`EN.(")KCE`@@`0Y()`$*2```````2`@`E\&(`)O#%
+M`___WC,*`%22"P!"D@``````$@(`):""`@P`0I(``````!0"`"6@@@(-`$*2
+M```````6`@`EH((")J"%`@X`0Y(/`$*2```````2`@`EJ&(`)JBE`O__M3(0
+M`%.2$0!"D@``````$@(`)9AB`A(`0I(``````!0"`"688@(3`$*2```````6
+M`@`EF&("`@!"E@`````.`$(L`@!`$":890+_`',R!``")!@`HX\`````J`!B
+M%``(`SS,+\*.`````"000P"C`$`0`(@%-!``HX\`````0`!B)/__0C`<`**O
+M0(D#````$#P``!`F)2#``B$H)0()^``")S`7``2(!30E(,`"(2@E`@GX``(G
+M,!X`"(@%-"4@P`(A*"4""?@``B4P@`(,B`4T)2#``B$H)0()^``")3"@`A"(
+M!30E(,`"(2@E`@GX``(E,&`"%(@%-"4@P`(A*"4""?@``@0`!B0```(\``!"
+M)!``I8]<`*:/"?A``"4@P`(4`$:2%0!"D@``````$@(`)3#"`!8`0I(`````
+M`!0"`"4PP@`7`$*2```````6`@`E,,(`&`!5DAD`0I(``````!("`"6HH@(:
+M`$*2```````4`@`EJ*("&P!"D@``````%@(`):BB`A0`HX\`````T"]BC```
+M```$`$(P&P!`$``````>`$.2'P!"D@``````$@(`)1!B`"``HJ\<`$.2'0!"
+MD@``````$@(`)1!B`"0`HJ\@`%22(0!"D@``````$@(`):""`B(`0I(`````
+M`!0"`"6@@@(C`$*2```````6`@`$```0):""`B6@```D`*"O(`"@KQP`HH\`
+M````0(D"``"($S0``!`\```0)B4@P`()^``"(2@S`@2($C0E(,`"(`"FCPGX
+M``(A*#(""(@%-"4@P`(A*"4""?@``B4PH`(,B`4T)2#``B0`IH\)^``"(2@E
+M`A"(!30E(,`"(2@E`@GX``(E,(`"%(@%-"4@P`(A*"4""?@``@<`!B08B`4T
+M)2#``B$H)0()^``")3```!R(!30E(,`"(2@E`@GX``(E,```$`"CCP````!`
+MB0,`)2#``B$H,P()^``")3#@`B4@P`(A*#(""?@``B4PP`,K```0`0`")!``
+MHH\`````0(D"``"(!30``!`\```0)B4@P`(A*"4""?@``B4PX`($B`4T)2#`
+M`B$H)0()^``")3#``PB(!30E(,`"(2@E`@GX``(E,(`"#(@%-"4@P`(A*"4"
+M"?@``B4PH`(0B`4T)2#``B$H)0()^``")3!@`A2(!30E(,`"&`"FCPGX``(A
+M*"4"```"/```0B00`*6/7`"FCPGX0``E(,`"`0`")$P`OX](`+Z/1`"WCT``
+MMH\\`+6/.`"TCS0`LX\P`+*/+`"QCR@`L(\(`.`#4`"])P``````````````
+M`.C_O2<0`+^O,"R#)````CP``$(D)2"@`"4H8``)^$``!@`&)!``OX\`````
+M"`#@`Q@`O2?H_[TG$`"_KP```CP``$(D,"R$)`GX0``&``8D`0`")!``OX\`
+M````"`#@`Q@`O2?H_[TG$`"_KSPL@R0```(\``!")"4@H``E*&``"?A```8`
+M!B00`+^/``````@`X`,8`+TGX/^])Q@`OZ\4`+&O$`"PKR6`@`````(\``!"
+M)#PL!"8)^$``!@`&)#PL`Y(]+`*2```````2`@`E&&(`/BP"D@``````%`(`
+M)1AB`#\L!I(``````#8&````$3P``#$F)2```N"`!30)^"`")3!F`$`L`I)!
+M+`:2```````R!@`E(``"Y(`%-`GX(`(E,$8``0`")!@`OX\4`+&/$`"PCP@`
+MX`,@`+TG__^E,`@"@I0`````!P!%$`P``R1R$H*4`````(``0C`"`$`4"P`#
+M)`,``R0"`,`0````````PZP(`.`#)1```"48@`"&$H*4``````8`0!`E*```
+M=A*"E``````"`$`4`0`%)$,`!22*$H*4``````(`0!``````!`"E-(P2@I0`
+M````"@!`$`````#*`6.4$0X")`8`8A``````>!*"E``````"`$`4"`"E-"``
+MI30(`.`#)1"@`.#_O2<<`+^O&`"RKQ0`L:\0`+"O)8"``$@2`I8`````'`!#
+M,(*0`P`"`$(P*X@"`*P!`HX`````"?A``"4H0`(```(\``!")"4@``()^$``
+M`)@%-````SP``&,D)2```@"8!30)^&```"!&-+`!`HXE(``""?A``"4H0`("
+M`%$0`0`F+B4P(`*X`0*.)2```@GX0``E*$`"'`"_CQ@`LH\4`+&/$`"PCP@`
+MX`,@`+TGX/^])Q@`OZ\4`+&O$`"PKR6(@``E@*`````"/```0B0)^$``$$`%
+M)/'_`SR?_V,T)!!#`````SR03F,D!P`0,H"`$``A@`,"```&C@```SP``&,D
+M)2`@`A!`!20)^&``)3!&`!@`OX\4`+&/$`"PCP@`X`,@`+TGX/^])QP`OZ\8
+M`+*O%`"QKQ``L*\E@(``___2,````CP``$(D-BP$)@GX0``&``8D-BP#DC<L
+M`I(``````!("`"488@`X+`*2```````4`@`E&&(`.2P&D@``````-@8````1
+M/```,28E(``""(`%-`GX(`(E,&8`.BP&DCLL`I(``````!("`"4PP@#_/U(R
+M`)02`"4@``(,@`4T"?@@`B4PT@`<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?8
+M_[TG)`"_KR``M*\<`+.O&`"RKQ0`L:\0`+"O):"`````$CP``%(F"?A``DR`
+M!30EF$``)2"``@GX0`)0@`4T)8!``"4@@`()^$`"3(`%-"N84P`A@!,")8@`
+M``"($``E@```)1@``"40`@(E&",")`"_CR``M(\<`+./&`"RCQ0`L8\0`+"/
+M"`#@`R@`O2?H_[TG$`"_KP```CP``$(D"?A``$R`!300`+^/``````@`X`,8
+M`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\ED(`````"/```0B0)^$``((`%-``!
+M`SPEB$,````0/```$"8E($`"((`%-`GX``(E,"`")2!``B"`!30)^``")3`@
+M`AP`OX\8`+*/%`"QCQ``L(\(`.`#(`"])^#_O2<8`+^O%`"QKQ``L*\EB(``
+M-!(BC@`````U`$`0``````(`0I0`````(`!",#``0!`E(`````"BC``````1
+M`$`0)8````0`IB0E*$``(1#$````0Y``````@`!B,`4`0!!_`&,P*Q!P``(`
+M0!0`````)8!@``$`A"0K$(4`]/]`%"$0Q`````(\``!")"4@(`()^$``!(`%
+M-`T``!(E&$``0A`0``,`0BP)`$`0```"/``"!CP``$(D)2`@`@2`!30)^$``
+M)3!F``D``!``````__T&//__QC0```(\``!")"4@(`($@`4T"?A``"0P9@`8
+M`+^/%`"QCQ``L(\(`.`#(`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR68
+M@`````(\``!")`GX0`!DF`4TPI0"`/\!4C(``4(R`P!`$```$3S_`5(Z)Y`2
+M````,28E(&`""?@@`E"`!30E@$``)2!@`@GX(`),@`4T)H`"`B80$@(@`+^/
+M'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TGZ/^])Q0`OZ\0`+"O)8"``````CP`
+M`$(D"?A``"!`!23_`$,P`AD#``\`1##,`0*.``````8`0Q0E*```T`$"E@``
+M```#`$04)1"@``$`!20E$*``%`"_CQ``L(\(`.`#&`"])^#_O2<<`+^O&`"R
+MKQ0`L:\0`+"O)9"``"6`H````!$\```Q)@GX(`*0@`4T```#C@`````A$$,`
+M```"KB4@0`()^"`"C(`%-`0``XX`````(1!#``0``JXE($`""?@@`I2`!30,
+M``..`````"$00P`,``*N)2!``@GX(`*(@`4T"``#C@`````A$$,`"``"KB4@
+M0`()^"`"F(`%-!```XX`````(1!#`!```JX<`+^/&`"RCQ0`L8\0`+"/"`#@
+M`R``O2<(`.`#`0`").C_O2<0`+^O```"/```0B0)^$``')P%-/\`0C`0`+^/
+M``````@`X`,8`+TGZ/^])Q``OZ\```(\``!")`GX0`!8@`4T!P!",!``OX\`
+M````"`#@`Q@`O2?H_[TG$`"_KP<`IC````(\``!")`GX0`!8@`4T$`"_CP``
+M```(`.`#&`"])[PO@HP`````"`#@`P````#H_[TG$`"_KS02AHP``````P#`
+M%`$``B0%```0O"^%K````CP``$(D"?A````````0`+^/``````@`X`,8`+TG
+M"`#@`P$``B3@_[TG'`"_KQ@`LJ\4`+&O$`"PKR6(@``E@*``!@`"+@@`0!0E
+MD"`"```"/```0B0)^$``__\%-"L04``%`$`0)2`@`O__`B3X+T*N#0``$"40
+M``````(\``!")`GX0``E*``"```#/```8R0E("`"<!`%)`GX8``E,$``^"]0
+MK@$``B0<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?H_[TG%`"_KQ``L*\E@(``
+M```"/```0B0)^$``<!`%)````SP``&,D)2```@GX8`#__T4P%`"_CQ``L(\(
+M`.`#&`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@``ED*``)9@@`@``
+M`CP``$(D"?A``/\_!20K$%(`!0!`$"4@(`+__P(D_"]BKA8``!`E$``````"
+M/```0B0)^$``%(`%-"6`0`````(\``!")"4@(`()^$``)2A``@#``R0D@`,"
+M_S]",````SP``&,D)2`@`A2`!30)^&``)3`"`OPO<JX!``(D(`"_CQP`LX\8
+M`+*/%`"QCQ``L(\(`.`#*`"])^C_O2<4`+^O$`"PKR6`@`````(\``!")`GX
+M0``4@`4T```#/```8R0E(``""?A@`/\_13`4`+^/$`"PCP@`X`,8`+TGSR^"
+MD``````!`$(X"`#@`P$`0C#@_[TG'`"_KQ@`LJ\4`+&O$`"PKR60@``2`*`0
+M)8A``@```CP``$(D"?A```2`!33__A`\__\0-@```SP``&,D)2`@`@2`!30)
+M^&``)#!0`,PO(HX`````)!!0`!$``!#,+R*N```"/```0B0E($`""?A```2`
+M!30``1`\```#/```8R0E($`"!(`%-`GX8``E,%``S"\BC@`````E$%``S"\B
+MK@$``B0<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?8_[TG(`"_KQP`LZ\8`+*O
+M%`"QKQ``L*\EB(``)9"@`"68(`(```(\``!")`GX0`#_/P4D*Q!2``4`0!`E
+M("`"__\")``P8JX9```0)1```````CP``$(D"?A``!2`!30E@$`````"/```
+M0B0E("`""?A``"4H0`(`P`,\__]C-"2``P(`%`(`_S\#/"000P````,\``!C
+M)"4@(`(4@`4T"?A@`"4P`@(`,'*N`0`")"``OX\<`+./&`"RCQ0`L8\0`+"/
+M"`#@`R@`O2?H_[TG%`"_KQ``L*\E@(`````"/```0B0)^$``%(`%-`(L`@``
+M``(\``!")"4@``()^$``_S^E,!0`OX\0`+"/"`#@`Q@`O2?8_[TG)`"_KR``
+MM*\<`+.O&`"RKQ0`L:\0`+"O)9"``"6@P`#__[$P)9A``H``(RX-`&`0#``"
+M)```$#P``!`F``0%)`GX``(E,"`")2!``@0$!20)^``"*S`4`"$0,P(X+U2@
+M)1```"0`OX\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TGV/^])R``OZ\<
+M`+.O&`"RKQ0`L:\0`+"O)9B``/\`L#!.`,`0.!)PHO\``C)+`$`00`$#)#02
+M8HX``````@!"E`````!``4(P1`!#%````CP``$(D"?A```$`!20E*$``-!)B
+MC@`````"`$*4``````!`0C`+`$`00A@%`!@``P(2,```0!`&`"$PP@`$`<8D
+M$I```"$04@!`$`(`&P``$*P-4B0T$F*.``````(`0I0``````(!",`L`0!""
+M&`4`&``#`A(P``!`$`8`(3#"`-(`QB02D```(1!2`$`0`@`*```02`U2)!@`
+M!0(2,```0!`&`"$PP@!H`<8D$I```"$04@!`$`(`8`Y2)!@`!0(2@```0!`0
+M`"&``@+H`Q`F_S\0,@``$3P``#$F)2!@`@GX(`)P$`4D)2!@`K`0!20)^"`"
+M)3!``@`T$``E(&`"%(`%-`GX(`(E,-``(`"_CQP`LX\8`+*/%`"QCQ``L(\(
+M`.`#*`"])^C_O2<0`+^O```"/```0B3<`86,"?A````````0`+^/``````@`
+MX`,8`+TG!@`#)`P`HQ`E$```DQ*"D``````'`$`0)1@``.@O@HP``````@!"
+M+`(`0!```````0`#)"408``(`.`#`````.#_O2<<`+^O&`"RKQ0`L:\0`+"O
+M```"/```0B0)^$``)9"``'D`0!````(\``!")"4@0`)PF`4T"?A``!\`!B34
+M`4*6`````/``0C#0_T(D0`!"+`(`0!04``8D&``&)```$3P``#$F)2!``@GX
+M(`+XF04T```0/```$"8E($`""?@``AR`!31_P`,D)!!#`"4@0`(<@`4T"?@@
+M`H``1C0E($`"!($%-`GX(`(]``8D)2!``@GX``(00`4D)2!``A!`!20)^"`"
+M`@!&-,P!1(X`````!P"#.`$`8RP+`((X`0!"+"488@`,`&`4"@`#)`H`@Q`)
+M``(D"0""$```$#PB`(,4`````-`!0I8`````!`!"+!X`0!```!`F```0/```
+M$"8E($`"=)@%-`GX``(F``8D)2!``GB8!30)^``"#0`&)"4@0`+PF04T"?@`
+M`@<`!B0E($`"])D%-`GX``(_``8D```"/```0B0E($`""?A``!!`!23__`,\
+M__]C-"000P`;```0``(&/```$"8E($`"=)@%-`GX``(*``8D)2!``GB8!30)
+M^``"#``&)"4@0`+PF04T"?@``@,`!B0E($`"])D%-`GX``(@``8D```"/```
+M0B0E($`""?A``!!`!23__`,\__]C-"000P```P8\)2!``A!`!20)^``")3!&
+M`$L``!`````````1/```,28E($`""?@@`A!`!23__`8\___&-```$#P``!`F
+M)2!``A!`!20)^``")#!&`"4@0`()^"`"$$`%)/W_!B0E($`"$$`%)`GX``(D
+M,$8`)2!``G"8!30)^``"'P`&)"4@0`)TF`4T"?@``G\`!B0E($`">)@%-`GX
+M``(.``8D)2!``O"9!30)^``"#``&)"4@0`+TF04T"?@``O\`!B34`4*6````
+M`/``0C#0_T(D0`!"+`(`0!0.``8D$@`&)````CP``$(D)2!``@GX0`#XF04T
+M```"/```0B0E($`""?A``!R`!31_P`,D)!A#`-0!0I8`````\`!",-#_0B1`
+M`$(L`@!`%(`39C2`#V8T```"/```0B0E($`""?A``!R`!30<`+^/&`"RCQ0`
+ML8\0`+"/"`#@`R``O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKP```CP``$(D"?A`
+M`"60@`!,`$`0```1/```,28E($`""?@@`A!`!23__`8\___&-```$#P``!`F
+M)2!``A!`!20)^``")#!&`"4@0`()^"`"$$`%)/W_!B0E($`"$$`%)`GX``(D
+M,$8`)2!``@2!!30)^``"`0`&)"4@0`()^"`"'(`%-'_``R0D&$,`U`%"E@``
+M``#P`$(PT/]")$``0BP"`$`4@!-F-(`/9C0``!`\```0)B4@0`()^``"'(`%
+M-"4@0`)PF`4T"?@``A\`!B0E($`"=)@%-`GX``)_``8D)2!``GB8!30)^``"
+M#@`&)"4@0`+PF04T"?@``@P`!B0E($`"])D%-`GX``+_``8DU`%"E@````#P
+M`$(PT/]")$``0BP"`$`4%``&)!@`!B0```(\``!")"4@0`()^$``^)D%-!P`
+MOX\8`+*/%`"QCQ``L(\(`.`#(`"])P```CP``*.4L$Y"E``````K$$,`#`!`
+M%"4@``````(\L$Y#)```I90!`(0D@!`$`"$00P```$*4`````"L010#Y_T`0
+M`````````CRP3D(D@!@$`"$00P`"`$*$``````@`X`,`````X/^])Q@`OZ\4
+M`+&O$`"PKR6`P``EB.``)3"``/__HR0=`&(LVP!`$.`!AR0```(\X$Y")(`8
+M`P`A&&(```!BC``````(`$````````(``B0.``(2`@`"+M,`0!0E$```!``"
+M+M``0!0-``(D!@`"+LT`0!0E$```?P`")`L``A(`````R```$`T``B0``.*,
+M```````@0C`"`$`0#0`#)"48``#````0)1!@`+X``!`E$```O```$B40```!
+M``(D!P`"%@````#,+\*,`````,(6`@`!`$(XLP``$`$`0C`&```2``````$`
+M`B0(``(2`````*P``!`,``(D``#BC``````"$P(`IP``$`$`0C#0+\*,````
+M`((0`@"B```0`0!",,P!@XP`````!@!B+)T`0!`E$```!0`"))H`8A0-``(D
+MT`&"E``````(`$(L`P!`$`````"3```0#0`"))$``!`E$```CP``$B40```!
+M``,DC``#%@P``B0```(\``!")`GX0``(H@4T0A,"``$`0CB$```0`0!",/@!
+M@HP````````BKG\``!`E$```?0``$B40```!``,D>@`#%@````#<+\*,=P``
+M$`$`0BP&```2``````$``B0&``(2`````'```!``````AA+"E&T``!`!`$(L
+MC!+"E`````!I`$`4)1```(H2PY0`````90!@$`$``B1C```0)1```&$``!(E
+M$````0`#)%X``Q8,``(DS"_"C`````#"%P(`60``$`$`0C@%```2`0`")`L`
+M`A(`````4P``$`P``B0``.*,$``#/"000P`"`$`0#0`#)"48``!+```0)1!@
+M`-`OPHP`````PA`"``$`0CA%```0`0!",.`OPHP`````/P!",```(JX_```0
+M)1```.`OPHP``````#]",`(2`@```"*N.```$"40```!``(D"``"$@`````S
+M```2)1````<``RXP`&`0#``")`8``!````(\&##"C``````!`$(X*0``$`$`
+M0C```$(D"?A````````E($``(P"`$`$``B3^_P,F!0!B+!\`0!`E$``````"
+M/%A/0B2`&`,`(1AB````8HP`````"`!````````)`(*0#0``$```(JX,`(*0
+M"@``$```(JX-`(*0!P``$```(JX+`(*0!```$```(JX*`(*0````````(JX&
+M```0)1```````CP``$(D)3```@GX0``E."`"&`"_CQ0`L8\0`+"/"`#@`R``
+MO2?8_[TG(`"_KQP`L:\8`+"O)8B``"6`X``E0"`"_O^C)!P`8BR:`$`0X`$D
+M)@```CR(3T(D@!@#`"$88@```&*,``````@`0```````!@``$@`(`SS,+P*-
+M`````"400P`&```0S"\"K<PO`HW_]P,\__]C-"000P#,+P*MC```$`$``B0`
+M`(.,```````08S"'`&`0)1````8``!+[_P,DT"\"C0`````D$$,`!0``$-`O
+M`JW0+P*-``````0`0C30+P*M```"/```0B0E("`"T"\&C0GX0``@@04T=```
+M$`$``B0```(\``!")"4@(`()^$``"*(%-`,``!(E,$```P``$``@QC3_WP(D
+M)##"`````CP``$(D)2`@`@GX0``(H@4T8@``$`$``B3X`3"N```"/```0B0E
+M("`"2(`%-`GX0``E,``"60``$`$``B0K$!``W"\"K54``!`!``(D!@``$@"`
+M`SS,+P*-`````"400P`&```0S"\"K<PO`HW_?P,\__]C-"000P#,+P*M1P``
+M$`$``B3T+P*%`````"&``@)```(N`@!`%!H``B0_`!`D!P"B%``_`C+@+P*-
+M`````"40`@(_`$(P!P``$.`O`JW@+P.-```````_8S`"$@(`)1!#`.`O`JT`
+M``(\``!")"4@(`+@+P:-"?A``.B`!30J```0`0`")`<`PBPG`$`0)1``````
+M`CQL3T(D@!@&`"$88@````(\``!")"4@(`(``&6,"?A``"4P``(;```0````
+M````@HP0``,\)!!#``X`0!``````!@``$O?_`R30+P*-``````@`0C0%```0
+MT"\"K=`O`HT`````)!!#`-`O`JT)```0`0`")#@`HH\`````$`"BKP```CP`
+M`$(D)2`@`@GX0``E.``"(`"_CQP`L8\8`+"/"`#@`R@`O2?@_[TG&`"_KS``
+MHH\T`*./`````!``HJ\```(\``!")`GX0``4`*.O*Q`"`!@`OX\`````"`#@
+M`R``O2<`````T/^])RP`OZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O
+M,0"@$"6(@`````(\``!")`GX0``$0`4D_/\&//__QC0```,\``!C)"4@(`($
+M0`4D"?A@`"0P1@````(\``!")`GX0``*``0D*``0)````CP``%(D`0`6/```
+M`CP``%4D_/\4//__E#8```(\"P``$```4R0)^*`",@`$)"4@(`()^$`"!$`%
+M)"4@(`($0`4D"?A@`B0P5`#__Q`F"```$B4@(`()^$`"$$`%)"005@#P_T`4
+M``````,``!8`````#P``$"40``````(\``!")"4@(`()^$``!(`%-/O_!CS_
+M_\8T```#/```8R0E("`"!(`%-`GX8``D,$8``0`")"P`OX\H`+:/)`"UCR``
+MM(\<`+./&`"RCQ0`L8\0`+"/"`#@`S``O2?8_[TG(`"_KQP`LZ\8`+*O%`"Q
+MKQ``L*\EB(``)8"@`````CP``%(D"?A``@2`!30$``8\```#/```<R0E("`"
+M!(`%-`GX8`(E,$8`"P``$B4@(`()^$`"!$`%)/S_`SS__V,T)!!#``$`!CPE
+M("`"!$`%)`GX8`(E,$8`(`"_CQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])]C_
+MO2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@``E@*`````"/```4B0)^$`"!(`%
+M-`0`!CP```,\``!S)"4@(`($@`4T"?A@`B4P1@`+```2)2`@`@GX0`($0`4D
+M_/\#//__8S0D$$,``@`&/"4@(`($0`4D"?A@`B4P1@`@`+^/'`"SCQ@`LH\4
+M`+&/$`"PCP@`X`,H`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\EB*``)2C```$`
+M$"0-`#`2)9"```8`(!("``(\`@`")`X`(A(E$```$@``$`````"0@4(D"?A`
+M```````+```0)8!```(``CS<@D(D"?A````````&```0N"]1K@(``CQT@T(D
+M"?A```````"X+U&N)1```AP`OX\8`+*/%`"QCQ``L(\(`.`#(`"])^C_O2<0
+M`+^O```"/```0B0)^$``!$`%)`(4`@`#`$(P$`"_CP`````(`.`#&`"])P``
+M``#H_[TG%`"_KP@``B0\`*(0$`"PKPD`HBP/`$`0``$")`(``B0Y`*(0`P"B
+M+`8`0!`$``(D`0`")!8`HA`E$```/P``$``````J`*(0)1```#L``!``````
+M,@"B$`$!HBP&`$`0``(")"```B0J`*(0)1```#(``!``````$`"B$``$`B08
+M`*(0)1```"P``!`````````"/```4"0T$H*,`````"$`0!```````@!"E```
+M````0$(P!`!`$`````````(\&0``$```4"0T$H*,``````(`0I0``````(!"
+M,!,`0!````(\```"/`\``!```%`D```"/`P``!```%`D```"/`D``!```%`D
+M```"/`8``!```%`D```"/`,``!```%`D```"/```4"0```(\``!")`GX0``E
+M*``")1```A0`OX\0`+"/"`#@`Q@`O2?H_[TG$`"_KP```CP``$(D"?A```P`
+M!200`+^/``````@`X`,8`+TGZ/^])Q``OZ\E,*`````"/```0B0)^$``#``%
+M)!``OX\`````"`#@`Q@`O2?H_[TG$`"_KP```CP``$(D"``%)`GX0``$``8D
+M$`"_CP`````(`.`#&`"])^C_O2<4`+^O$`"PKR6`@`````(\``!")`@`!20)
+M^$``(``&)````CP``$(D)2```@@`!20$``8D"?A``"4X```K$`(`%`"_CQ``
+ML(\(`.`#&`"])^C_O2<4`+^O$`"PKR6`@`````(\``!")`GX0`!(@`4TW_\&
+M)````SP``&,D)2```DB`!30)^&``)#!&`````CP``$(D"?A``"4@``(```(\
+M``!")"4@``()^$```0`%)!0`OX\0`+"/"`#@`Q@`O2?H_[TG%`"_KQ``L*\E
+M@(`````"/```0B0)^$``2(`%-````SP``&,D)2```DB`!30)^&``(`!&-```
+M`CP``$(D"?A``"4@``(4`+^/$`"PCP@`X`,8`+TGX/^])QP`OZ\8`+*O%`"Q
+MKQ``L*\EB(``)1"@`"60P````!`\```0)D"`!30)^``")3!``"4@(`)$@`4T
+M"?@``B4P0`(<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?@_[TG&`"_KQ0`L:\0
+M`+"O)8B``"6`H`!```,N(0!@$"40```@``(N$`!`%````CP``$(D"?A``$2`
+M!33@_P,F`0`&)`0P9@`G,`8````#/```8R0E("`"1(`%-`GX8``D,$8`#P``
+M$`$``B0``$(D)2`@`@GX0`!`@`4T`0`&)`0P!@(G,`8````#/```8R0E("`"
+M0(`%-`GX8``D,$8``0`")!@`OX\4`+&/$`"PCP@`X`,@`+TGX/^])Q@`OZ\4
+M`+&O$`"PKR6(@``E@*``0``#+A\`8!`E$```(``"+@\`0!0```(\``!")`GX
+M0`!$@`4TX/\#)@$`!B0$,&8````#/```8R0E("`"1(`%-`GX8``E,$8`#@``
+M$`$``B0``$(D)2`@`@GX0`!`@`4T`0`&)`0P!@(```,\``!C)"4@(`)`@`4T
+M"?A@`"4P1@`!``(D&`"_CQ0`L8\0`+"/"`#@`R``O2?@_[TG'`"_KQ@`LJ\4
+M`+&O$`"PKR6(@````!`\```0)@GX``(\@`4T)9!``"4@(`()^``"#($%-"48
+M0``@`&(P`@!`$`("`CP``E(V)!!B``,`0!`E$$`"``%2-B400`(<`+^/&`"R
+MCQ0`L8\0`+"/"`#@`R``O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKR60@``EB*``
+M```"/```0B0\@`4T"?A``/\`)C(``B(R`@!`$"6````@`!`D``$B,@(`0!`"
+M`@(\)8`"`@```CP``%$D)2!``@R!!30)^"`")3```@L``!(```(\``!")"4@
+M0`()^$``-``%)"4@0`(T``4D"?@@`A``1C0,```0````````0B0E($`""?A`
+M`#0`!23O_P8D```#/```8R0E($`"-``%)`GX8``D,$8`'`"_CQ@`LH\4`+&/
+M$`"PCP@`X`,@`+TG"P"@J`@`H+C_#\8P#P"FJ`P`IK@@`.<P!P#@$``````/
+M`**(#`"BF```````($(T#P"BJ`P`HK@7`*"H%`"@N!<`HH@4`**8`````!,`
+MHJ@0`**X"`#@`P$``B38_[TG(`"_KQP`LZ\8`+*O%`"QKQ``L*\EF(``)9#`
+M`$``L8\`````)8"@`!<``XH4``.:``````$`8S"(`&`0#P`")!<`XH@4`.*8
+M``````$`0C`&`$`4```"/```0B0)^$``#``%)'T`4A`/``(D$P`"BA```IH`
+M````_P]",```(J87``**%``"F@`````"%`(`_W]",`(`(J8$`""B$P`"BA``
+M`IH``````A4"`/\`0C`&`"*B`!8"``,6`@"`_P,D`@!#%``````&`""B%P`"
+MBA0``IH```````%",`@`0!#_``(D%P`"BA0``IH``````/Y",$(2`@`"```0
+M!P`BH@<`(J(3``**$``"F@````#"$P(`'P!",`@`(J(3``**$``"F@`````"
+M%P(`"0`BHA,``HH0``*:``````(3`@`!`$(P"@`BHA<``HH4``*:``````(`
+M0C!``$`4)1```!<``HH4``*:``````0`0C`&`$`0``````0`(I(``````0!"
+M-#0``!`$`"*B%P`"BA0``IH`````$`!",!D`0!``````!``BD@`````"`$(T
+M!``BHA<``HH4``*:``````#_0C`"$@(`!0`BHAPP8XX``````0!C+`4`0C@K
+M$`(`)!AB`!P`8!````(\``!")"4@8`()^$``)2@@`A<``!`E$```%P`"BA0`
+M`IH`````"`!",`8`0!``````!``BD@`````(`$(T"P``$`0`(J(7``**%``"
+MF@`````@`$(P!@!`$"40```$`"*2`````!``0C0$`"*B)1```"``OX\<`+./
+M&`"RCQ0`L8\0`+"/"`#@`R@`O2<`````H/^])UP`OZ]8`+ZO5`"WKU``MJ],
+M`+6O2`"TKT0`LZ]``+*O/`"QKS@`L*\ED(``9`"EKR6XP`!L`*>O)9A``@(`
+MXI8`````PA$"``$`0S`"`.*6```````!0C`%`$`0):```(D$8!0,``,D"```
+M$``````"`.*6`````,(1`@`!`$(X`0!",(`$0!0,``,D`@#BE@````""$0(`
+M`0!#,`(`XI8`````(`!",`4`0!``````=01@%`P``R0)```0```"/`(`XI8`
+M````@A$"``$`0C@!`$(P;`1`%`P``R0```(\``!")"4@0`(E*```"?A```$`
+M!B1K!$`0)2!``@```CP``$(D"?A``"4HX`(EJ$``702@$@P``R0&``(D9`"C
+MCP`````,`&(0!P!B+`8`0!`(``(D`@!B+%,$0!`,``,D!0``$`````!D`*2/
+M`````$T$@A0,``,D;`"ECP`````2`*`0```"/```0B0E($`""?A``$`1!20@
+M`**O```"/```0B0E($`""?A``"4HH`(```(\``!")"4@0`()^$``)2@```(`
+M`!``````(`"@K\P!1(X`````!P"#.`$`8RP+`((X`0!"+"488@`,`&`4"@`#
+M)`H`@Q`)``(D"`""$``````A`(,4```"/-`!0I8`````!`!"+!P`0!````(\
+M;`"BCP`````8`$`0```"/#021(X`````%0"`$```0B0``..6``""E``````/
+M`&(0```"/`(`XY8"`(*4\`%C,/`!0C`)`&(4```"/````CP``$(D)2!``@GX
+M0``E*.`"$`1`%`$``B0```(\``!")"4@0`()^$``6(`%-`,`0!0D`**O`0`#
+M)"0`HZ\``!`\```0)B4@0`()^``"!(`%-"`"`SPD$$,`+`"BKR4@0`()^``"
+M$$`%)/X``SQ@`&,T)!!#`"@`HJ\E($`""?@``A1`!208`**O)2!``@GX``(8
+M0`4D'`"BKP```CP``$(D9`"ECPGX0``E($`"```"/```0B0)^$``)2!``@``
+M`CP``$(D)2!``@GX0``E*.`"V0-`$`,``R0"`.*6`````/`!0S!``0(D(`!B
+M$$$!8B@/`$`0P`@"),```B0F`&(0P0!B*`8`0!#0``(DH``")!\`8A``````
+MQP,`$`P``R0B`&(0#``#),,#`!``````&0!B$,$(8B@&`$`00`D")%`!`B0-
+M`&(0#``#)+H#`!``````!0!B$%`)`B0'`&(0#``#)+0#`!```````0`$)#``
+MI*\1```0-`"DKP(`!20P`*6O`0`")`P``!`T`**O!P``$`,``R0$``4D,`"E
+MKP(``B0%```0-`"BKP4``R0P`*.O`@`$)#0`I*\```(\``!")"4@0`(`F`4T
+M"?A```<`!B0E@``````"/`!0420```(\``!>)````CP``%8D0!`0`"$04`#`
+M&`(`(1AQ`$`0`@`P`*6/`````"$010"`$`(`(1!1````98P``$:,"?C``R4@
+M0`(!`)0F/P"",@,`0!0`````"?C``@$`!"0!`!`F&0`"+NK_0!1`$!``)8``
+M`````CQ84E$D```"/```7B0```(\``!6),`0$``A$%$```!%C`````!L`**/
+M``````X`0!#`$!``__\$/.!_A#0A&*0`&0!C+`$`8SC__P0\+'^$-"$0I``)
+M`$(L`0!"."088@`+`&`0P!`0`"$040`$`$:,"?C``R4@0`(!`)0F/P"",@,`
+M0!0`````"?C``@$`!"0!`!`FQ``"+M__0!3`$!``K"QBCB4@0`(P`*6/-`"F
+MCPGX0``E.(`"`@#BE@``````P$(P!0!`$````CP``$(D)2!``@GX0``E*.`"
+MT@%"E@````!"`$(L6`!`%````CP``$(D)2!``BR8!30"``8\"?A```*@QC0`
+M`..6M`D")`\`8A1F9@(\DA)BDIP28Y8`````(Q!#`&9F`SQG9F,T&`!#`!`8
+M``!#&`,`PQ<"`",88@``'`,`"@``$`,D`P"2$F.29V9"-!@`8@`0$```0Q`"
+M`,,?`P`C$$,``!0"``,D`@`"`.*6`````-``0C#```,D$@!#%````CR2$F:2
+M`````",P!@"`,08`P`_&,",8!`"`'`,`_``"/"088@````(\``!")"4@0`),
+MF04T"?A``"4PPP`'```0```0/```0B0E($`"3)D%-`GX0``E,``````0/```
+M$"8E($`""?@``BBB!33__08D```1/```,28E($`"**(%-`GX(`(D,$8`)2!`
+M`@GX``(HH@4T_O\#//\#8S0D$$,`)2!``BBB!30)^"`"``A&-"4@0`)@@`4T
+M"?@@`@\`!B32`4*6`````$,`0BP'`$`4```"/```0B0E($`"5*(%-`GX0``E
+M,``````"/```0B0E($`">)@%-`GX0``.``8DS`%#C@H`!"0*`&00"0`")`@`
+M8A``````&P!D%````CS0`4*6``````0`0BP6`$`0```"/```XI8`````G@E#
+M.`$`8RRC"4(X`0!"+"488@`!`'`X```"/```0B0E($`""?A``$RB!30&`%`0
+M```"/```0B0E($`"3*(%-`GX0``E,``"```"/```0B0E($`")2B@`@GX0``0
+M`*8GK0)`$`,``R0&``(D9`"CCP`````(`&(0``````0"0HX`````!`!`$```
+M`CP``$(D"?A``"4@0`*X+&*.)2!``B4HH`(P`*./`````/__9C`)^$``$`"G
+M)Y<"0!`#``,D`@#BE@````!``$(P(@!`$`H`!"3,`4..``````\`9!`)``(D
+M#0!B$``````&`&04`````-`!0I8`````!`!"+`8`0!0`````<!)BE@`````#
+M4$(L#`!`%````CP"`.*6`````*``0C"@``,D!0!#$````CP``$(D)2!``@GX
+M0``E**`"```"/```0B0E($`""?A``"4HX`(```(\``!")"4@0`()^$``)2B@
+M`FH"0!`#``,D;`"DCP`````&`(`0```"/```0B0E($`"(`"FCPGX0`!`$04D
+M,"QCDC$L8I(``````!("`"488@`R+&*2```````4`@`E&&(`,RQFD@``````
+M-@8````0/```$"8E($`"`(`%-`GX``(E,&8`-"QFDC4L8I(``````!("`"4P
+MP@`L`*6/`````"4PQ0#,+V*.`````"4PP@"```(\)2!``@2`!30)^``")3#"
+M`````CP``$(D9`"ECPGX0``E($`"/"QCDCTL8I(``````!("`"488@`^+&*2
+M```````4`@`E&&(`/RQFD@``````-@8`)2!``N"`!30)^``")3!F`$`L8I)!
+M+&:2```````R!@`E($`"Y(`%-`GX``(E,$8````"/```0B0E($`""?A``!!`
+M!20E($`"$$`%)"@`HX\)^``")3!#`"4@0`(8`*:/"?@``A1`!20E($`"'`"F
+MCPGX``(80`4D)2!``B0`IH\)^``"6(`%-#8L8Y(W+&*2```````2`@`E&&(`
+M."QBD@``````%`(`)1AB`#DL9I(``````#8&`"4@0`((@`4T"?@``B4P9@`Z
+M+&*2.RQFD@``````,@8`)2!``@R`!30)^``")3!&`"4@0`+4+V:."?@``AB`
+M!30E($`"@``%)`GX``+__P8D```"/```0B0E($`""?A``"4HH`+E`4`0`P`#
+M)````CP``$(D)2!``C@219()^$```0`&)````CP``$(D)2!``@GX0``E*.`"
+MU`%"E@````#P`$(PT/]")$``0BP;`$`0```"/#021(X```````""C`#``SPD
+M$$,`$P!`$````CP"`)"4``````!`$#(!`!`N#``0)@``0B0E($`""?A``"28
+M!33P_P,D)!!#``\`$#(```,\``!C)"4@0`(DF`4T"?A@`"4P4`````(\``!"
+M)"4@0`()^$``%)D%-/\_4#`"`.*6`````"``0C`)`$`0@!`0`"ZZ`SRCBV,T
+M&0!#`!`0``````````````<``!`"@0(`S,P"/,W,0C09``("$!```,*``@``
+M```````"/```0B0E($`"')@%-`GX0``!``8D-!)"C@`````"`$*4``````!`
+M0C`)`$`40"`0`#020HX``````@!"E```````@$(P"`!`$````CR`(!`````"
+M/```0B0)^$``9`"$)`4``!````(\``!")`GX0`!D``0F```"/```0B0E($`"
+M"?A```B8!30EL$`````"/```0B0E($`"")@%-`GX0```.`8D)8```````CP`
+M`%0D```"/`,``!```%$D"?@@`L@`!"0E$``"%`!"*`<`0!`!`!`F)2!``@GX
+M@`(DG`4T$`!",/7_0!0````````"/```420E($`"")@%-`GX(`(E,,`"```"
+M/```4"0E($`""?@``F"8!30E($`"8)@%-`GX(`(#`$8T`@#BE@````"@`$(P
+MH``#)!<`0Q`"``(DP"]CC@`````3`&(0`````"4@0`()^``"()D%-"4@0`(@
+MF04T"?@@`@#P1C0E($`""?@``B"9!30!``8\)2!``B"9!30)^"`")3!&``$`
+M`B0"```0P"]BKL`O8*X```(\``!")`GX0``E($`")8````$`%"0```(\``!1
+M)(`H$``E($`"`!"E)`GX(`($,!0"`0`0)@H``BKY_T`4@"@0`*!&8*[H`4*6
+M``````P`0!`E@``````"/```420E($`""?@@`B4H``(!`!`FZ`%"E@`````J
+M$`("^?]`%"4@0`((``(\90E"-$0L8JX&``(D9`"CCP`````$`&(4```0/`@`
+M`CQE&4(T1"QBK@``$"8E($`"1"QFC@GX``*@``4D```"/```0B0E($`""?A`
+M`*P`!20'``8\)2!``JP`!20)^``")3!&`$P20HX`````!`!`$````CP``$(D
+M"?A``"4@0`(```(\``!")"4@0`)@F`4T`0`&)`GX0``E.``````"/```0B1D
+M`*6/"?A``"4@0`(```(\``!")"4@0`()^$``((`%-'_^!CS__\8T```#/```
+M8R0E($`"((`%-`GX8``D,$8`S`%#C@`````&`&(L"@!`$```$#P%``(D$@!B
+M%````CS0`4*6``````@`0BP-`$`4```"/```$#P``!`F)2!``AB!!30!``8\
+M"?@``JH`QC0E($`"'($%-`GX``(0,@8D```"/```0B0E($`""($%-`GX0`!2
+M``8D`@#BE@```````4(P!0!`$````CR.$F:"``````0``!```$(DCQ)F@@``
+M`````$(D)2!``@GX0``E*.`"`!8"``-&`@#@+V*.`````#\`0S#T+V6&````
+M`",090`&`*2"`````"L0@@`"`$`0`````"$8A0`%`**"`````$`0`@`C($@`
+M*Q"#``0`0!``````]"]BA@`````A&((`X"]BC@``````/T4P`BH%`/0O9H8`
+M````(Q"F``8`I((`````*Q""``(`0!``````(2B&``4`HH(`````0!`"`",@
+M2``K$(4`!`!`$`````#T+V*&`````"$H@@#B+V:6`````#\`QC#T+V>&````
+M`",0QP`&`*2"`````"L0@@`"`$`0`````"$PAP`%`**"`````$`0`@`C($@`
+M*Q"&``4`0!!``&(L]"]BA@`````A,((`0`!B+`(`0!1``*(L/P`#)`(`0!1`
+M`,(L/P`%)``````"`$`4`````#\`!B0_`&,P`!(%```_0C`E&&(``#0&`#\`
+M`CPD,,(````"/```4"0E($`"Z(`%-`GX``(E,&8`T"]FC@`````#`,`0)2!`
+M`@GX``(@@04T^"]ECO__`B0$`*(0```"/```0B0)^$``)2!``OPO98[__P(D
+M!`"B$````CP``$(D"?A``"4@0`(`,&6.__\")`0`HA````(\``!")`GX0``E
+M($`"^`%&C@`````%`,`0```"/```0B0E($`""?A``$B`!31D`*2/`````-P!
+M1*YL`*6/`````#$`H!`!``(D!`"CD@`````"`&(P`@!`%/X`8C`$`**B`@"B
+ME@`````"`.*F!`"BD@`````$`.*B!0"BD@`````%`.*B!@"BD@`````&`.*B
+M!P"BD@`````'`.*B-!)"CB4@```E*```,`!$K#0`1:P```(\``!")`GX0``E
+M($`"-!)$C@`````H`(*L+`"#K````CP``$(D)2!``@GX0``!``4D"```$`$`
+M`B1P`*6/````````HHP``````@!`$"40`````*.L7`"_CU@`OH]4`+>/4`"V
+MCTP`M8](`+2/1`"SCT``LH\\`+&/.`"PCP@`X`-@`+TGX/^])Q@`OZ\4`+&O
+M$`"PKR6(@``$`C".``````,``C(/`$`0```"/```0B0)^$``1)D%-/_?`SS_
+M_V,T)!!#``$`!C)`-P8````#/```8R0E("`"1)D%-`GX8``E,$8`#``",AL`
+M0!""$`(``0!",`X`0!0```(\``!")"4@(`()^$``T(`%-./_!B0```,\``!C
+M)"4@(`+0@`4T"?A@`"0P1@`+```0````````0B0E("`""?A``-"`!30```,\
+M``!C)"4@(`+0@`4T"?A@`!P`1C08`+^/%`"QCQ``L(\(`.`#(`"])^C_O2<0
+M`+^OM"R"C``````)^$```````"L0`@`0`+^/``````@`X`,8`+TGR/^])S0`
+MOZ\P`+:O+`"UKR@`M*\D`+.O(`"RKQP`L:\8`+"O)8B``"6HH``!`!0D```"
+M/```0B0)^$``);`@`B600``E@``````"/`(``!```%,D`0`0)N@!(I8`````
+M*Q`"`@8`0!`E("`""?A@`B4H``+W_T`0`````"6@``"C`(`2)1```````CP`
+M`$(D)2`@`GR9!30)^$```0`&)"6```````(\``!4)````CP$```0``!3)`GX
+M8`(%``0D`0`0)F0``BX'`$`0)2`@`@GX@`(@G`4T]_]`$&0``BX#`$`4)2`@
+M`HD``!`E$``````"/```0B0)^$``)2A``H,`0!`E("`"```"/```0B0)^$``
+M%)D%-/\_0S`"`$*6`````"``0C`)`$`0@!`#`"ZZ`SRCBV,T&0!#`!`0````
+M``````````<``!`"(0(`S,P"/,W,0C09`&(`$!```,(@`@`````````"/```
+M0B0)^$``9`"$)````CP``$(D)2`@`B4H0`()^$``$`"F)U\`0!`E("`"```"
+M/```0B1\F04T"?A``"4P```"`$*6`````$``0C`B`$`0"@`$),P!(XX`````
+M#P!D$`D``B0-`&(0``````8`9!0`````T`$BE@`````$`$(L!@!`%`````!P
+M$L*6``````-00BP,`$`4```"/`(`HI8`````H`!",*```R0%`$,0```"/```
+M0B0E("`""?A``"4H0`(```(\``!")"4@(`()^$``)2B@`@```CP``$(D)2`@
+M`@GX0`!@F`4T```#/```8R0E("`"8)@%-`GX8``"`$8T!`!#D@`````"`&(P
+M`@!`%/X`8C`$`$*B`@!"E@`````"`**F!`!"D@`````$`**B!0!"D@`````%
+M`**B!@!"D@`````&`**B!P!"D@`````'`**B-!(BCB4@```E*```,`!$K#0`
+M1:P```(\``!")`GX0``E("`"-!(DC@`````H`(*L+`"#K````CP``$(D)2`@
+M`@GX0``!``4D`0`")#0`OX\P`+:/+`"UCR@`M(\D`+./(`"RCQP`L8\8`+"/
+M"`#@`S@`O2?@_[TG&`"_KQ0`L:\0`+"O)8B``"6`H`````(\``!")`GX0``$
+M@`4T_/\#//__8S0D&$,``0`")#(``A("``(J!0!`$``````=```2```0/#,`
+M`!``````!@`")`4``A((``(D)P`"$@`````L```0``````$0!CP``!`\```0
+M)B4@(`($@`4T"?@``B4P9@````(\``!")"4@(`()^$``%``%)-__!B0E("`"
+M%``%)`GX``(D,$8`&0``$``````"$`8\```0)B4@(`($@`4T"?@``B4P9@``
+M``(\``!")"4@(`()^$``%``%)"4@(`(4``4D"?@``B``1C0(```0```````0
+M!CP```(\``!")"4@(`($@`4T"?A``"4P9@`8`+^/%`"QCQ``L(\(`.`#(`"]
+M)^C_O2<0`+^O`@`"/#BN0B0)^$```@`%)!``OX\`````"`#@`Q@`O2?H_[TG
+M%`"_KQ``L*\E@(`````"/```0B0E*```"?A```$`!B0%`$`0)2```@(``CPX
+MKD(D"?A``!,`!204`+^/$`"PCP@`X`,8`+TGT/^])R@`OZ\D`+6O(`"TKQP`
+MLZ\8`+*O%`"QKQ``L*\EF(``)8"@``(``CPXKD(D"?A``!,`!22[`$`0)2!@
+M`@```CP``$(D)2@```GX0``!``8DM`!`$"4@8`("``(\.*Y")`GX0``E*```
+MK@!`$`````"K```2"@`$),P!8XX`````"@!D$`D``B0(`&(0`````!$`9!0`
+M````T`%BE@`````$`$(L#`!`$``````"``.6`````"``8C`%`$`4"``5)-``
+M8S#```(D0`!B%`0`$20^```0ZP`1)-0!8I8`````\`!",-#_0B1``$(L"@!`
+M%`````#,`6*.``````<`0S@!`&,L"P!".`$`0BPE&&(`&`!@$``````"``.6
+M`````"``8C`%`$`4"``5)-``8S#```(D`P!B%``````C```0ZP`1)`(``I8`
+M`````$!",!X`0!3J`1$D`@`"E@``````@$(P&0!`%.H"$207```0Z@`1)`(`
+M`Y8`````(`!B,`4`0!0EJ```T`!C,,```B0#`&(4``````P``!"K`!$D`@`"
+ME@``````0$(P!P!`%*H!$20"``*6``````"`0C`"`$`4J@(1)*H`$20"``.6
+M`````$``8C`-`$`0(`!B,`0`0!30`&,PP``")`,`8A0`````!P``$`0`M38"
+M``*6`````$``0C`"`$`4``````$`M38"``*6```````!0C`"`$`4``````(`
+MM38"``*6`````!``0C`"`$`4`P`4)"6@``````(\``!")"4@8`()^$``?)@%
+M-"600``"``.6`````"``8C`%`$`4```"/-``8S#```(D%0!B%````CP``%`D
+M)2!@`@28!30)^``")3"``B4@8`(`H@4T"?@``B4PH`(>`%$2)2!@`GR8!30)
+M^``")3`@`@```CP``$(D"?A``"P!!"06```0`0`")`D`41(``$(D)2!@`GR8
+M!30)^$``)3`@`@```CP``$(D"?A``"P!!"0``!`\```0)B4@8`($F`4T"?@`
+M`B4P@`(E(&`"`*(%-`GX``(E,*`"`0`")"@`OX\D`+6/(`"TCQP`LX\8`+*/
+M%`"QCQ``L(\(`.`#,`"])\C_O2<T`+^O,`"^KRP`MZ\H`+:O)`"UKR``M*\<
+M`+.O&`"RKQ0`L:\0`+"O):"``#P`I:\EB,``);B``@```CP``$(D"?A`````
+M(*XEJ$``]P"@$@````#`+^..``````(`8C@!`$(L`0!C+"400P`"`$`0`0`"
+M)```(J[`+_".`0`")'P``A8```(\``!")"4@@`()^$``()D%-`$``SPD$$,`
+M=`!`%"60``#`+^"N```PK@```CP``%$D```"/```7B0E((`""?@@`A"<!30E
+MF$``)2"``@GX(`(4G`4T)8!``"4@@`()^"`"&)P%-"6P0``K$!,`*Q@0`"00
+M0P`.`$`4`B(3`"4@@`()^"`"()D%-"4@@`(@F04T`0`#/`GXP`,E,$,``0!2
+M)@H`0BKE_T`4)2"``@(B$P`"$A``(2""`,(I$``K&`0``@"B*`$`0C@D&&(`
+M:P!@$",0%@``%@(``Y8"`!H`1`(2$````@"`%``````-``<`)9!``.#_0BH#
+M`$`0(`!"*@4``!#@_Q(D``````(`0!0`````'P`2)!L`90(2$````@"@%```
+M```-``<`@/]3)/#_8BH#`$`0$`!B*@0``!#P_Q,D`P!`%```$3P/`!,D```1
+M/```,28E((`""?@@`B"9!30?^`,D)!!#`$`Q$@#@!\8P```0/```$"8E((`"
+M()D%-`GX``(E,$8`)2"``@GX(`(@F04TX/\#)"000P`?`&8R)2"``B"9!30)
+M^``")3!&`"4@@`()^"`"()D%-"4@@`(@F04T"?@``@`(1C0"``(DP"_BK@$`
+M`B00`**N%`"RHB4``!`5`+.B/`"CCP`````"`&*4`````*``0C"@``,D'0!#
+M$`(``B3`+^..`````!H`8A0```(\$`"BC@`````5`$`4```0/```$"8E((`"
+M"?@``B"9!30``!$\```Q)B4@@`(@F04T"?@@`@#P1C0E((`""?@``B"9!30!
+M``8\)2"``B"9!30)^"`")3!&``$``B3`+^*N```"/```0B0E((`""?A``"4H
+MH`("`**6``````(`0C`V`$`4```"/```0B0E((`""?A``&"8!30```,\``!C
+M)"4@@`)@F`4T"?A@``(`1C0\`**/``````(`190```````&B,`L`0!0`````
+MU`&"E@````#P`$(PT/]")$``0BPI`$`0`0`")$``HC`F`$`0`0`"),P!A(X`
+M````!P"#."L8`P`+`((X*Q`"`"088@`<`&`0"@`#)!H`@Q`)``(D&0""$`$`
+M`B0'`(,4`@`"/-`!@I8`````!`!"+!(`0!0!``(D`@`"/'C<0B0)^$``)2"`
+M`@P``!`!``(D/`"CCP`````"`&*4``````(`0C0"`&*D`@"BE@````#]_T(P
+M`@"BI@$``B0T`+^/,`"^CRP`MX\H`+:/)`"UCR``M(\<`+./&`"RCQ0`L8\0
+M`+"/"`#@`S@`O2?@_[TG'`"_KQ@`LJ\4`+&O$`"PKR6(@``E@*```@``%B60
+M``+__Q(DS`$CC@D``B0(`&(0"@`")`D`8A0```(\T`$BE@`````$`$(L!`!`
+M$````CSO_P(D)(`"`@```CP``$(D)2`@`@GX0``,``4D```"/```0B0E("`"
+M`$`%)`GX0``E,``"```"/```0B0)^$``#P`$)`,`$#(```(\``!")"4@(`(`
+M0`4D`P!&,@GX0``E.``")9!```$``C(4`$`4)1!``@```CP``$(D)2`@`A0`
+M!20)^$``)3```````CP``$(D)2`@`B4H```)^$```0`&)`4`0!````(\``!"
+M)"4@(`()^$``P``%)"400`(<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?H_[TG
+M$`"_KP```CP``$(D"?A``&28!33"%`(`_P%#,``!8C`"`$`0_P%B."<8`@`E
+M$&``$`"_CP`````(`.`#&`"])P(`HI0`````X`%#,,```B04`&(0`````,$`
+M8B@&`$`00`$")*```B0*`&(0``````@`X`,E$`````````T`8A0`````S!*"
+ME``````+```0``#"I,X2@I0`````!P``$```PJ30$H*4``````,``!```,*D
+M"`#@`R40```!``(D"`#@`P````#8_[TG)`"_KR``LJ\<`+&O&`"PKR60@``E
+MB*`````"/```0B0)^$``8)@%-`(`0C`;`$`4)8```````CP``$(D"?A``"4@
+M0`(E@$```@`"/*BO0B0E($`")2@@`@GX0``0`*8G#`!`$``````0`**'````
+M`"H04``(`$`0``````(`(I8``````@!"-`(`(J8"```0)8```"6````6`#"F
+M)1```B0`OX\@`+*/'`"QCQ@`L(\(`.`#*`"])]C_O2<@`+^O'`"SKQ@`LJ\4
+M`+&O$`"PKR6(@`#@`2*.``````0`0C`L`$`0)9@@`@``$#P``!`F(`0%)`GX
+M``(!``8D)2`@`@`&!20)^``")3```````CP``$(D)2`@`@GX0```!@4D)2`@
+M`@`&!20)^``""`!&-"4@(`($!@4D$``&/`GX``(!`L8T)2`@`B`&!20)^``"
+M)3```"6```````(\``!2)"4@(`(`!`4D"?A``B4P``(A$!,")2`@`C@O1I`)
+M^$`"!`0%)`$`$":```(J]?]`%"4@(`(@`+^/'`"SCQ@`LH\4`+&/$`"PCP@`
+MX`,H`+TGZ/^])Q``OZ\E:(``)2```/__RB3"4`H`___&)`<`QC`E2*``'@"@
+M&"58```!``PDP#@'`"%`R0`)``(M`P!`%`00#`$(``@D!!`,`?__0B0$&,P`
+M__]C)"800P`$$.(`@!@*`"$8;0```&.,`````"000P`&$.(`!A#"``008@$E
+M(((`(Q`&`2%88@$A$"8!^/]))"4P``#F_R`=`0!*)0```CP``$(D"?A`````
+M```0`+^/``````@`X`,8`+TGV/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O$`"P
+MKR68@``E@*```@#"E`````#@`4,PP``")`\`8A`EH&`"P0!B*`8`0!!``0(D
+MH``")`<`8A`E$```90``$`````!C`&(4)1````0``!`E&````@``$`$``R0"
+M``,D0!@#``0`A"8A$&0`YA)2E.P20I0`````@!$"`"600@(A$&0`\A)"E```
+M````$P(`)9!"`B$09`#X$D*4`````(`4`@`ED$("(1!D`/X20I0``````!8"
+M`"600@(A$&0`!!-1E`H30I0`````@!$"`"6((@(A$&0`$!-"E```````$P(`
+M)8@B`B$09``6$T*4`````(`4`@`EB"("(1AD`!P38I0``````!8"`"6((@(!
+M``(D!P`"$@`````(```2`@`")`4``A(E$```*0``$``````"```0)8A``B60
+M(`(.`#(6```"/```0B0E(&`""?A```BB!33_WP8D```#/```8R0E(&`""*(%
+M-`GX8``D,$8`#```$+POD*X``$(D)2!@`@GX0``(H@4T```#/```8R0E(&`"
+M"*(%-`GX8```($8TO"^0K@``$#P``!`F)2!@`F"9!30)^``")3!``B4@8`)D
+MF04T"?@``B4P(`(!``(D)`"_CR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`
+MO2?,`8.,"@`&)!L`9A``````"0`")!@`8A``````!@!F%`````#0`8*4````
+M``0`0BP2`$`4*``#),P!@HP`````!P!#.`$`8RP+`$(X`0!"+"488@`)`&`4
+M*``#)-0!@I0`````\`!",-#_0B1``$(L`@!`$"```R0H``,D``"BE``````;
+M`$,`$!````(`8!0`````#0`'`"L8`@#V_T(D#0!"+`$`0C@(`.`#)!!B`,#_
+MO2<\`+^O.`"^KS0`MZ\P`+:O+`"UKR@`M*\D`+.O(`"RKQP`L:\8`+"O):"`
+M`$0`I:\"`**4`````,(1`@`!`$(P$`"BKP(`HI0`````\`%#,$`!`B0?`&(0
+M):B``D$!8B@/`$`0P`@"),```B1*`&(0P0!B*`8`0!#0``(DH``")$,`8A`E
+M$```D`$`$`````!!`&(0)1```(P!`!``````/0!B$,$(8B@&`$`00`D")%`!
+M`B0'`&(0)1```(,!`!```````P!B$%`)`B1_`6(4)1```-0!@I8`````\`!"
+M,-#_0B1``$(L+`!`%"7P``#,`82.``````<`@S@K&`,`"P""."L0`@`D&&(`
+M(P!@$`H``R0A`(,0"0`")"``@A````(\!P"#%```0B30`8*6``````0`0BP9
+M`$`4```"/```0B0E((`""?A``$29!33'_P,D)!!#`"PLHXX```````!FA```
+M``#`,`8`.`#&,````SP``&,D)2"``D29!30)^&``)3!&``4``!````(\`@``
+M$`$`'B0"`!XD```"/```0B0E((`""?A``!"9!30&_`,D)!!#`$"('@`$`+(F
+M(1@R`N`28Y0``````!D#`"400P```!`\```0)B4@@`(0F04T"?@``@$`1C0`
+M``(\``!")+POI8Y$`*:/"?A``"4@@`(AB#("R!(FE@````#_`<8P)2"``FB9
+M!30)^``"``+&-'`2HI8``````%!"+!\`0!1`$!X`1`"CCP`````"`&*4````
+M`!``0C`8`$`00!`>`!``HH\`````0"`"`$`3@B0A$$("``!0E``````0`*./
+M`````$@38B0A&$("``!S@``````A$*("!@!6@`````!($X(D(1"B`@``5Y0`
+M````4!.$)!4``!`A(*0"`@"D)B$01`"@$E"4`````"$0U0/&$E.``````!``
+MHX\`````R!)B)"$0H@(!`%:``````$`8`P"H$F(D(1"B`@``5Y0`````,!-C
+M)"$@@P```(24`````!0`I*\``!(\``!2)B4@@`()^$`"1)@%-'_``R0D$$,`
+MP#$0`(`_QC```!$\```Q)B4@@`)$F`4T"?@@`B4P1@`E((`""?A``E"8!30`
+M_P,D)!!#`/\`9C(E((`"4)@%-`GX(`(E,$8`)2"``@GX0`)0F`4T__\3//\`
+M<S8D$%,``#(6``#_QC`E((`"4)@%-`GX(`(E,$8`)2"``@GX0`)(F`4T_/\#
+M//\/8S0D$$,``#,7``,``SP`\&,T)###`"4@@`)(F`4T"?@@`B4P1@!`@!X`
+M(1`5`KH20I0``````#8"```4`@`E,,(`(1`5`L`20Y0``````!(#`"4PP@`E
+M((`"-)@%-`GX(`(E,,,`)2"``@GX0`(HF`4T)!!3`"$8%0*N$F:4```````R
+M!@`E((`"*)@%-`GX(`(E,$8`)2"``@GX0`)DF`4T^/\#//\/8S0D$$,`(8`5
+M`K02!I8``````#,&``<``SP`\&,T)###`"4@@`)DF`4T"?@@`B4P1@!P$J*6
+M``````,P0BP.`$`0`@`0),H!@Y8B$`(D%@!B%````CQ$`*./``````(`8I0`
+M````0`!",`\`0!````(\#0``$`@`$"0```(\``!")$0`I8\)^$``)2"``@4`
+M0!!`$!X`(1!5`"830I0`````(8`"`@```CP``$(D)2"``@GX0``DF04T`?\#
+M)"000P!`,!``_@#&,````SP``&,D)2"``B29!30)^&``)3!&`$0`HX\`````
+M$`!BC``````'`$`0```1/!0`<(``````%0!R@``````-```0```Q)A``HH\`
+M````0!@"`+`38B0A$*("!@!0E`````"X$V,D(1BC`@(`<I0````````Q)B4@
+M@`()^"`"()D%-!_X`R0D$$,`0#$0`.`'QC```!`\```0)B4@@`(@F04T"?@`
+M`B4P1@`E((`""?@@`B"9!33@_P,D)!!#`!\`1C(E((`"()D%-`GX``(E,$8`
+M)2"``@GX(`(@F04T)2"``B"9!30)^``"``A&-'`2I)8``````4""+!X`0!0`
+M````1`"CCP`````"`&*4`````-``0C#0``,D!`!#%````CP`4((L$P!`%```
+M`CP``$(D)2"``@GX0``,H@4T`_\#//__8S0D$$,`%`"CCP````"`-`,`_``#
+M/"0PPP````,\``!C)"4@@`(,H@4T"?A@`"4P1@!P$J*6``````%00BP(`$`4
+M`0`")````CP``$(D)2"``N"9!30)^$``)3````$``B0\`+^/.`"^CS0`MX\P
+M`+:/+`"UCR@`M(\D`+./(`"RCQP`L8\8`+"/"`#@`T``O2>8_[TG9`"_KV``
+MOJ]<`+>O6`"VKU0`M:]0`+2O3`"SKT@`LJ]$`+&O0`"PKR6@@``E\*``$`"@
+MKQ0`H*\8`*"O'`"@KR``H*\D`*"O.`"@KSP`H*\!``,D*`"CIP(``B0J`**G
+M+`"BIRX`HZ<P`*.G,@"BIS0`HZ<"`,*7`````,(1`@`!`%,P``##EP<`8!(E
+MN```@!`#`"$00P!`$`(`**9")`@``!#__T(P@!`#`"$00P!`$`(`__\#/)A`
+M8S0A$$,`__]","600``X`,*7`````!\`0!0EB$```(`1-`(`PI<`````$`!"
+M,`(`0!!7``,DK@`#)"6````CL$,"`@``$"&H0P+__U`P!0`"+@\`0!`E((`"
+MQ`&"CB4H``()^$``)3!@`@"``S0(`$,0_S]#,"H0=@#S_T`4`0`")BH0HP+P
+M_T`4`0`")B6(8``X`-&G`(`"-&``(A8```(\``!2)"4@@`()^$`"()D%-`!`
+M`SPD$$,`?`%`$"4@@`()^$`"#)D%-/\`!CS__\8T```0/```$"8E((`"#)D%
+M-`GX``(D,$8`)2"``@GX0`(@F04T_X\&//__QC0E((`"#)D%-`GX``(D,$8`
+M)2"``J"9!30)^``")3```"4@@`*`F04T"?@``B4P```E((`""?A``H29!33P
+M_Q$\)2"``H29!30)^``")#!1`"4@@`*8F04T"?@``B4P```E((`""?A``IR9
+M!30E((`"G)D%-`GX``(D,%$`)2"``@"9!30)^``")3```"4@@`($F04T"?@`
+M`B4P```E((`"")D%-`GX``(E,```)2"``@GX0`(,F04T`,`1)"4@@`(,F04T
+M"?@``B0P40`E((`"B)D%-`GX``(E,```)2"``HR9!30)^``")3```"4@@`*0
+MF04T"?@``B4P```E((`""?A``I29!30E((`"E)D%-`GX``(D,%$`)0$`$```
+M```"`,*7`````/`!13#0``(D,`"B$",@,@+1`*(H!@!`$$`!`B3```(D%@"B
+M$$`1!``V```0(Q!$``4`HA!0`0(D)`"B$$`1!``P```0(Q!$`$"\!`#K40(\
+M'X5"-!@`X@(0$```PQ`"`,,?%P`CN$,`@Q(7`#P`HJ\U#`,D(0``$#@`HZ\`
+M*@0`3PD"/)4@0C08`*(`$!```$,0`@##'P4`(Q!#`#P`HJ]`O`0`ZU$"/!^%
+M0C08`.("$!```,,0`@##'Q<`([A#`#4,`B0-```0.`"BKP"\!`#K40(\'X5"
+M-!@`X@(0$```PQ`"`,,?%P`CN$,`@Q(7`#P`HJ]J&`,D.`"CKT`1!``C$$0`
+M@!`"`"$01`#`&0(`.`"DCP`````:`&0`$A````(`@!0`````#0`'`"480``/
+M`&(P!``()`,`0!0H`*4G`P`()#``I2=<```1)8````,Q`P`=`,DH`0`'),H`
+M(!$A$-``&0!$)"$`@BP.`$`0W_^#)!H`@B@&`$`4!!"'`!L`@B@1`$`4`0""
+M)/__@B0$$$<`$`"CCP`````E$$,`"0``$!``HJ\4`&(L!P!`$`$`@B0$$&<`
+M%`"CCP`````E$$,`%`"BKP$`@B00`$(L#`!`$/'_@B1`$!``(1!%````0Y1`
+M$`0``@!")`080P`8`**/`````"488@`J```0&`"CKQ``0BP,`$`0X?^")$`0
+M$``A$$4```!#E$`0!`#B_T(D!!A#`!P`HH\`````)1AB`!P``!`<`*.O$`!"
+M+`P`0!#1_X(D0!`0`"$010```$.40!`$`,+_0B0$&$,`(`"BCP`````E&&(`
+M#@``$"``HZ\'`$(L#`!`$`$``B9`$!``(1!%````0Y1`$`0`HO]")`080P`D
+M`**/`````"488@`D`*.O`0`")O__4#`J$`@"J?]`%````````!$\```Q)B4@
+M@`()^"`"#)D%-/\``SS__V,T)!!#``#_!CP``!`\```0)B4@@`(,F04T"?@`
+M`B4P1@`E((`""?@@`B"9!30`<`8\)2"``B"9!30)^``")3!&`#P`I8\`````
+M`#4%`/`_`CPD,,(`#P`2//__4C8D$/(")3#"``!``CPE((`"H)D%-`GX``(E
+M,,(`)2"``A``IH\)^``"@)D%-"4@@`()^"`"A)D%-/#_$SPD$%,`%`"FCP``
+M```D,-(`)2"``H29!30)^``")3!&`"4@@`(0`*:/"?@``IB9!30E((`""?@@
+M`IR9!30D$%,`%`"FCP`````D,-(`)2"``IR9!30)^``")3!&`"4@@`(8`*:/
+M"?@``@"9!30E((`"'`"FCPGX``($F04T)2"``B``IH\)^``"")D%-"4@@`()
+M^"`"#)D%-`#`$B0D$%(`)`"FCP````#_/\8P)2"``@R9!30)^``")3!&`"4@
+M@`(8`*:/"?@``HB9!30E((`"'`"FCPGX``*,F04T)2"``B``IH\)^``"D)D%
+M-"4@@`()^"`"E)D%-"004@`D`*:/`````/\_QC`E((`"E)D%-`GX``(E,$8`
+M9`"_CV``OH]<`+>/6`"VCU0`M8]0`+2/3`"SCT@`LH]$`+&/0`"PCP@`X`-H
+M`+TGV/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6@@``"`**4`````!``
+M0C`"`$`0`&0#/`#(`SP"`**4``````!`0C`#`$`0``````<``!!"&`,``@"B
+ME```````@$(P`@!`$`````""&`,```"BE``````;`&(`$A@```(`0!0`````
+M#0`'``<`8`0?`!,D__]S)@0`8!(&$&,"`0!",/O_0!``````)@`")".84P`7
+M``(D(Q!3``$`$"0$@%``(8!P`!@``B0C$%,`!H!0`/#_<R8``!$\```Q)B4@
+M@`()^"`"%)@%-`$``SS__V,T)!!#`$"$$````!(\``!2)B4@@`(4F`4T"?A`
+M`B4P4``E((`""?@@`A28!33^_P,\_Q]C-"000P!`FQ,``0`#/`#@8S0DF&,"
+M)2"``A28!30)^$`")3!3`"0`OX\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H
+M`+TGX/^])Q@`OZ]``*(L`@!`%"48@``_``4D_`%EI````CP``$(D)2!@`#02
+M98P)^$``$`"F)Q@`OX\`````"`#@`R``O2?`_[TG/`"_KS@`M*\T`+.O,`"R
+MKRP`L:\H`+"O)9"``"68H``EH,`````0/```$"9X1D2.?$9%C@GX``(EB$`"
+M@$9$)@GX``(@``4D_`%#EOP!0H8`````0`!"*`,`0!0`%`,`/P`#)``4`P`#
+M/`(`/P#C*`$`8SC__^(P`0!"+"488@`)`&`0```#/'A88R0``D*.`````$`0
+M`@`A$$,```!&A`,``!`!``(D)3````$``B00`**O(`"B)Q0`HJ\B`*(G&`"B
+MKP(``CP4RD(D)2!``@GX0``E*&`"VP!`$"4@0`(0`+2OO"PBCB``I2<B`*8G
+M"?A``"4X8`+3`$`0`````,P!1(X`````!P"#."L8`P`+`((X*Q`"`"088@`0
+M`&`0"@`#)`X`@Q`)``(D#0""$"6````&`(,4`````-`!0I8`````!`!"+`<`
+M0!0_``4DGD8BE@`````$`$(DGD8BIB6````_``4D0!`0`(!&0B0A("("``""
+ME/0O(Y8`````(1!#````@J3__T(P0`!"+`(`0!0```````"%I`$`$"80``(N
+M\?]`%$`0$`">$B*6``````(`0BQ"`$`0`````-(!0I8`````0@!"+",`0!#`
+M``,D`@!BE@````#0`$(P'@!#%+0)`B0``&.6``````X`8A1F9@(\DA(BDIP2
+M(Y8`````(Q!#`&9F`SQG9F,T&`!#`!`8``!#&`,`PQ<"`",88@`)```0__]E
+M,)(2(Y)G9D(T&`!B`!`0``!#$`(`PQ\#`",00P#__T4P`@`"/)C30B0)^$``
+M)2!``B6```"`H10T```"/```4R2`*!``>$8CC@`````A&*,``@!BE```````
+M$@(`_P!"-``4`@```&:4```````R!@#_`,8T___&,"4@0`(A*+0`"?A@`B4P
+M1@`!`!`F(``"*NS_0!2`*!``AD8FE@`````_`,8P`#8&`(1&(I8`````/P!"
+M,``4`@`E,,(`@D8BE@`````_`$(P`!("`"4PP@"`1B*6`````#\`0C```!`\
+M```0)B4@0`(TF04T"?@``B4PP@".1B:6`````#\`QC``-@8`C$8BE@`````_
+M`$(P`!0"`"4PP@"*1B*6`````#\`0C``$@(`)3#"`(A&(I8`````/P!","4@
+M0`(XF04T"?@``B4PP@"41B:6`````#\`QC``-@8`DD8BE@`````_`$(P`!0"
+M`"4PP@">1B*6`````#\`0C``$@(`)3#"`)!&(I8`````/P!","4@0`(TH@4T
+M"?@``B4PP@"<1B:6`````#\`QC``-@8`FD8BE@`````_`$(P`!0"`"4PP@"8
+M1B*6`````#\`0C``$@(`)3#"`)9&(I8`````/P!","4@0`(XH@4T"?@``B4P
+MP@#<+R*.``````(`0!1_``8D/P`&)````CP``$(D)2!``@GX0``\F04T`0`"
+M)#P`OX\X`+2/-`"SCS``LH\L`+&/*`"PCP@`X`-``+TGD/^])VP`OZ]H`+ZO
+M9`"WKV``MJ]<`+6O6`"TKU0`LZ]0`+*O3`"QKT@`L*]P`*2O):"@```T!@`#
+M-`8`.`"FKP`\!P`#/`<`/`"GKR6(@`"`1C,F/P`>)`4`@H(`````0!`"`/__
+M0C!``**OP?\")(@`HX\```````!BI(0`HH\```````!>I````CP``$(D"?A`
+M`#\`%23_`%(P)8```'``HX\`````=!-BE``````J`$`01`"@KP8`-R;X`%8R
+M0!`0`'`30B0A$.("``!#E``````;`&`0__]$,@<`9!"`*1````!"E``````'
+M`$(PX`!"-!,`@A0`````(2@E`@``A)8"``,\;-5C)`GX8`#4%Z4DX``$)`@`
+MQ!8E&$``__]B,"L0H@("`$`0`````"48H`(#```0__]U,`<``!`EJ$```0`0
+M)G03(I8`````*A`"`MO_0!1`$!```@""E@````#0`$(PP``#)#$`0Q3X`$(R
+M`0!2-'03(I8`````+0!`$"6````&`#<F^`!6,D`0$`!P$T(D(1#B`@``0Y0`
+M````&P!@$/__1#('`&00@"D0````0I0`````!P!",.``0C03`((4`````"$H
+M)0(``(26`@`#/&S58R0)^&``U!>E).``!"0(`,06)1A``/__8C`K$,(#`@!`
+M$``````E&,`#`P``$/__?C`*```0)?!```$`$"9T$R*6`````"H0`@+;_T`4
+M0!`0``(``!``````)?"@`@(`@I8```````%",`4`0!````(\CA(F@@`````$
+M```0``!")(\2)H(```````!")'``I(\)^$``)2B``@`6`@`#A@(``@"#E@``
+M``!``&(PP@!`$(``8C`+`$`0&`"B)YP7)Y80`**O`@`"/'C70B1P`*2/)2B`
+M`@GX0`">%R8F"0``$`````!*%R>6$`"BKP(``CQXUT(D<`"DCR4H@`()^$``
+M3!<F)D``HH\`````(QA0`"H0HP(#`$`0`!0#`"48H`(`%`,``S0"``(`@I8`
+M````$`!","``0!``````<!(BE@`````!,$(L"0!`%`````!^$B.6`````"H0
+MPP`#`$`0`!0#`"48P```%`,``S0"`'`2(I8``````$!"+`X`0!0``````@""
+ME@````"``$(P"0!`$`````"`$B.6`````"H0PP`#`$`0`!0#`"48P```%`,`
+M`S0"`!X`HY<`````*A##``,`0!``%`,`)1C````4`P`#%`(`1`"BKS@`HX\`
+M````0!`#`$0`I(\`````(Q""```4`@`#-`(`)Q`&`,,7`@`D,,(`/`"BCP``
+M```E&$``*A#"``,`0!``%`,`)1C````4`P"``*./`````%$`8!`#-`(`"`!F
+MI@8`9J8$`&:F`@!FI@``9J8<`*27`````/__@S#__\(P*Q!#``(`0!`E*,``
+M)2#```H`9*8:`*27`````/__@S```&*6`````"L00P`#`$`0````````9)8`
+M````#`!DIA@`I)<`````__^#,```8I8`````*Q!#``,`0!````````!DE@``
+M```.`&2F`!0$``,<`@!P$B*6``````!`0BP=`$`4``````(`@I8`````@`!"
+M,`@`0!`E(,``A!(BE@`````J$,(`"`!`$"40P``4```0'@!BIH(2(I8`````
+M*A""``X`0!0E$,```@""E@````"``$(P!`!`$`````"$$B*6!P``$!X`8J:"
+M$B*6!```$!X`8J8``&*6`````!X`8J:(`*2/````````@H0`````"0``$/`O
+M(JX8`*.7`````"H0PP`"`$`0)2C``"48P```%`,``QP"`(0`HH\```````!#
+MI(@`HX\```````!EI`(`@Y8`````(`!B,`0`0!30`&,PP``")'D`8A0`````
+MO!<GEB@`HB<0`**O`@`"/'C70B1P`*2/)2B``@GX0`"^%R8F0`"DCP`````C
+M&)``*A##`P,`0!``%`,`)1C``P`4`P`#-`(`+@"CEP`````J$,,`!0!`$```
+M```E&,``+@"CEP`````J$,,```````(`0!``````)1C``#@`I(\`````0!`$
+M`",08@``%`(``S0"`"<0!@##%P(`)##"`#P`HH\`````)1A``"H0P@`#`$`0
+M`!0#`"48P```%`,`@`"CCP`````E`&`0`S0"`"X`HY<`````*A##``(`0!``
+M````)1C``!``8Z8L`*.7`````"H0PP`"`$`0`````"48P``2`&.F`!0#``,L
+M`@`4`&.F*@"CEP`````J$,,``@!`$``````E&,``%@!CIA@`8Z8H`*.7````
+M`"H0PP`"`$`0`````"48P``:`&.F`!0#``,D`@`1```0'`!CIBP`HY<`````
+M*A##``,`0!``%`,`)1C````4`P`#+`(`*`"CEP`````J$,,``P!`$``4`P`E
+M&,```!0#``,D`@"$`*./````````8H0`````*A""``(`0!````````!DI(@`
+MI(\```````""A``````J$$4``@!`$````````(6D@`"BCP`````+`$`0`0`"
+M)(@`HX\```````!BA`````#(+R*NR"\BEG``I(\`````_@&"I`$``B1L`+^/
+M:`"^CV0`MX]@`+:/7`"UCU@`M(]4`+./4`"RCTP`L8](`+"/"`#@`W``O2>P
+M_[TG3`"_KT@`OJ]$`+>O0`"VKSP`M:\X`+2O-`"SKS``LJ\L`+&O*`"PKR6@
+M@`!4`*6OP"R"C@`````)^$``);C``$8`0!``````_`&#EOP!@H8`````0`!"
+M*`,`0!0`%`,`/P`#)``4`P`#G`(`/P!C*@$`8SC__V(R`0!"+"488@`)`&`0
+M```#/(188R0``H*.`````$`0`@`A$$,```!2A`,``!`EB```)9```"6(```J
+M`.`2`0`")"``MB<B`+4G`@`"/!3*7B3`$!$`5`"CCP`````A@&(`$`"@KQ0`
+MMJ\8`+6O)2"``B4H``(E,$`""?C``R4X8`(8`$`0`````"(`HH<&``."````
+M`"H00P`$`$`0`````"(`HI,`````!@`"HB``HH<'``."`````"H00P`$`$`0
+M`````"``HI,`````!P`"H@$`,28K$#<"WO]`%,`0$0`!``(D3`"_CT@`OH]$
+M`+>/0`"VCSP`M8\X`+2/-`"SCS``LH\L`+&/*`"PCP@`X`-0`+TGP/^])SP`
+MOZ\X`+*O-`"QKS``L*\ED*``)8"``)H2$88````````"/```0B00`*0G@$8%
+M)@GX0``@``8D"``))!``JB<(``TD/P`.)$`8"0`A&$,!``!BE``````C$%$`
+M``!BI"4X```E6```0&`)`"4P8````,*$``````(`000```````#`I`,`[10A
+M*$P!'0``$`\`!R0``*B4``"DA$`0!P`A$%``@$9#E``````!`.(D%`"#%/__
+M1S`$`(`4,P!B+0$``B4,```0``"BI`8`0!0```````#"E``````!`$(D!0``
+M$```PJ0``,*4`````/__0B0``,*D)3@```$`8B7__TLP$`#B+-G_0!1`$`D`
+M(1A"`0``8H0`````0`!"*`(`0!1`(`D```!NI"$0D`"`1D.4`````",8<@`G
+M$`,`PQ<"`"088@`A($0!``"$A'A&`HY`(`0`(2""`$`8`P`A&&(```!BE```
+M`````(*D`0`B)?__23`/`"(ML_]`%$`8"0`(``DD$`"D)T`0"0`A&%``(1""
+M````0I0`````@$9BI`$`(B7__TDP#P`B+?;_0!0`````/`"_CS@`LH\T`+&/
+M,`"PCP@`X`-``+TGP/^])SP`OZ\X`+*O-`"QKS``L*\EB*``__^2,```(I8`
+M````$P!`$"4P```8`*0G0!@&`"$8@P#`$`8`(1!1````0I0```````!BI`$`
+MQB0(`,(H"`!`$"6`P`#`$`8`(1!1````0I0`````\?]`%$`8!@`E@,``*@"B
+M)Q``HJ\```(\``!")"4@0`(8`*4G___&,`GX0``H`*<G$```&B4P```H`*.7
+M&`"BEP`````,`&(0`````!@`I"<!`,8D*A#0``8`0!!`$`8`(1""````0I0`
+M````^/]B%``````H`*.7*@"BEP`````#`&(4P!`&``8`<A``````(1!1``0`
+M0HP`````!@!`$,`0!@`A$%$``@!"E``````"```0`````#\``B0\`+^/.`"R
+MCS0`L8\P`+"/"`#@`T``O2?__X0P__^E,/__QC#__^<P$`"HEP`````8`.@`
+M$A@``"@`8!`E$```)`#%$``````C$(4`0!@"`"$88@#`&`,`(1AB`(`8`P`C
+M$,4`&@!B`!(8```"`$`4``````T`!P``'`,``R0#`!4`@`0E&.``90""*!(`
+M0!`E&``!&`"(`!(8``!D``(D(Q!$`!@`1P`2$```(1AB`.M1`CP?A4(T&`!B
+M`!`0``!#$0(`PQ\#`",00P`"```0__]#,"48X``E$&``"`#@`P````"X_[TG
+M1`"_KT``M*\\`+.O.`"RKS0`L:\P`+"O)9B@`"60P`!8`+2/___P,`\``!(E
+M(```&`"E)T`8!``A&*,`@!`$`"$01`!`$`(`(1!2``@`0I0```````!BI`$`
+MA"0J$)``]?]`%$`8!````&26*@"B)Q``HJ\```(\``!")!@`I2<E,``""?A`
+M`"@`IR<E0```)3@``"4@```H`*:7*@"EEP(``!`8`*,G`0"$)"H0D``-`$`0
+M0!`$`"$08@```$*4``````(`PA1`$`0`__^',"$08@```$*4`````/+_HA0`
+M````__^(,```9)8H`*67*@"FEX"(!P`AB"<"0(@1`"&(,@(&`">6@(`(`"&`
+M"`)`@!``(8`2`@8``I8"`!(\K-92)@GX0`(0`**O!@""I@``9)8H`*67*@"F
+MEP0`)Y8$``*6"?A``A``HJ\$`(*F``!DEB@`I9<J`*:7`@`GE@(``I8)^$`"
+M$`"BKP(`@J8``&26*`"EERH`II<``">6```"E@GX0`(0`**O``""ID0`OX]`
+M`+2//`"SCS@`LH\T`+&/,`"PCP@`X`-(`+TG$`"JC___QC#__X0P0!`$`"$0
+M1`#`$`(`(1!$`(`@`@!`,`8```"CE`````!`$`,`(1!#`,`0`@`A$$,`@!`"
+M`/;_0B0K$((`!@!`$"%`I@```**4````````0J4(`.`#``#BI/[_`Y4`````
+M0!`#`"$00P#`$`(`(1!#`(`0`@`*`$(D*Q!$`!``0!`K$*@`_O\"E0``````
+M`$*E"`#@`P``XJ0``$:E"`#@`P``YJ0``**4````````XJ0"`**4``````@`
+MX`,``$*E'@!`$``4!``#3`(```"FE```HX0`````0!`#`"$00P#`$`(`(1!#
+M`(`0`@`C$$D`"0!")!,`0BSG_T`4``````(`HY0`````0!`#`"$00P#`$`(`
+M(1!#`(`0`@#V_T(D*Q""`-__0!0``````@"E)"L0J`#E_T`4``````@`X`,`
+M````)3"``-0!PI0`````\`!",-#_0B1``$(L$P!`$!`LQ20```0\`%J$)`0`
+M@XP`````$"S#K,`0`P`A$$,`@!`"``@`A"0A$$0`+"S"K`$``B0H+,*L%``"
+M)!PLPJQ5``(D"`#@`R`LPJP```0\D%B$)`0`@XP```````"CK,`0`P`A$$,`
+M@!`"``@`A"0A$$0`'`"BK`$``B08`**L%``")`P`HJPC``(D"`#@`Q``HJSH
+M_[TG%`"_KQ``L*\E&(``U`%BE`````#P`$(PT/]")$``0BP7`$`0)8"@`+`L
+M8HP`````"?A```<`!20"``,\Y+%C)"4@0``!``4D)``&)`GX8``E.```)4@`
+M`&L`!R0E(````0`#)"8`0Q1K``8D4P`')%,`!B0W``(D(0``$!```JZP+&*,
+M)2!@``GX0``'``4D`@`#/.2Q8R0E($``!@`%)"4`!B0)^&``)3@``"480``E
+M2```/P`")`,`8A0$`&<D,@`')#\``B0"`&(0)2`@`4``!"0R`(8D/P`")`8`
+M8A0,``FN%``B)0P``JXC`((D`P``$!```JX%`,(D$``"K@0`!8X`````*Q"I
+M`"L8Y0`E$$,`!P!`$"5````K$*0`*QC%`"400P`#`$`0)1```0$`""0E$``!
+M%`"_CQ``L(\(`.`#&`"])^C_O2<4`+^O$`"PKR6`@`#T+P:&\"\"C@`````A
+M,,(`0#(&``!^QC````(\``!")#"9!30)^$```(#&-`$``B3$+P*N%`"_CQ``
+ML(\(`.`#&`"])^#_O2<<`+^O&`"RKQ0`L:\0`+"O)8B``"60(`(0+#`F*"PC
+MC@````!-`&`0)1```,0O(XX!``(D1P!B%````CP``$(D)2!``@GX0``PF04T
+M)1A```"`8C`_`$`40B8#`,(5`P`#`$(P`@`#)`\`0Q0$``2NT@%"E@````!"
+M`$(L!@!`%`````":$B*6`````"$01``%```0!``"K@0``HX`````!0!")`0`
+M`J[4`4*6`````/``0C#0_T(D0`!"+`T`0!`"``(\?.!")`GX0``E($`"!``$
+MCA0``XX`````*Q"#``,`0!0C$(,``@``$`0``JX$``"NQ"\@K@(``CPLVT(D
+M)2!``@GX0``E*``"$0!`%`(``CQ$WD(D)2!``@GX0``E*``""P!`$`(``CQ\
+MWD(D)2!``@GX0``E*``"!0!`&`(``B3$+R*N`0`")-@O(J[`+R"NQ"\BC@``
+M```<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2<$`*.,#`"BC``````K$$,`!@!`
+M$"4@```0`**,`````"L08@`"`$`4``````$`!"0(`.`#)1"``"4XH`#4`8*4
+M`````/``0C#0_T(D0`!"+````SP#`$`4`%IH)````CR06$@D``#DC`````#`
+M$`0`(1!$`(`0`@`A$`(!"`!")!P`XJP$`.*,$`#CC``````K$$,`*@!`%```
+M``!D`(`0__\")`0`XHP`````"`#BK!``XXP`````*Q!#`!X`0!0E2&````#B
+MC``````:`$`0````````XHP`````__]&)```YJS`(`8`(2"&`(`@!``A$(@`
+M'`#EC!@`0XP0`**,`````",88@!`&`,`"`#BC``````C$$,`"`#BK"$@!`$(
+M`(0D*Q!)``,`0!0<`.2LZ/_`%``````(`.`#`0`")`0`XXP,`.*,`````"L0
+M0P`W`$`4)1```````XT`````__]C)```Y(P`````,`"#$/[_`B0$`..,````
+M``@`XZP,`.*,`````"5(0``K$$,`)0!`%`````````.-`````/__8R0``.*,
+M`````"4@0``K$$,`'`!`$``````!`(8D``#FK,`@!@`A((8`@"`$`"$0B``<
+M`.6,&`!#C!``HHP`````(QAB`$`8`P`(`.*,`````",00P`(`.*L(2`$`0@`
+MA"0K$"(!!P!`%!P`Y*P```*-`````/__0B0K$,(`YO]`%"4@P``(`.`#`@`"
+M)`@`X`,`````V/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6(@``0+#(F
+M)"P@KK`L(HX`````"?A```<`!20"``,\Y+%T)"4@0``!``4D)``&)`GX@`(E
+M.```)9A```$``B0A`&(6)2`@`BPL(HX```````!0A`````"P+"*.``````GX
+M0``'``4D)2!```0`!20@``8D"?B``B4X```+`!,2)1A```<``!("``(D"0`"
+M$@,``B0+``(20!`#``H``!``````"```$!0`0*X&```0%`!#KD`0`P#[_T(D
+M`@``$!0`0JX4`$*N)`"_CR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2?@
+M_[TG'`"_KQ@`LJ\4`+&O$`"PKR60@``EB,``)8#@`````CP``$(D)2"@``GX
+M0``E*"`")3A``/__!B;",`8`__\0)B,`(!H'`!`R`0`))#``HH\`````P$`"
+M``@`"B0A&!$""0!B*`,`0!0$&&D`"``#)`08:0#__V,D!!`)`O__0B0F&&(`
+M!!@#`8`H!@`A*+(`)R`#````HHP`````)"""``00!P($$`(!)!!#`"401```
+M`**L(1`P`OC_420C$%`!!CA'`"6```#D_R`>`0#&)!P`OX\8`+*/%`"QCQ``
+ML(\(`.`#(`"])\#_O2<\`+^O.`"^KS0`MZ\P`+:O+`"UKR@`M*\D`+.O(`"R
+MKQP`L:\8`+"O)9"@``(`0I8``````$!",`4`0!`EL(`````"/```0B03```0
+M``(%)`(`0I8``````(!",`4`0!````(\``!")"4@P`(*```0``0%)`(`0I8`
+M````$`!",`(`0!0"``4D``$%)````CP``$(D)2#``@GX0``EB```)9A`````
+M8HX`````'0!`&````CP``%<D`(<5-````CP``%0D0(`1`"&`$0*`@!``(``0
+M)B&`<`(+``>2$`"@KR4@P`(E*&`""?C@`@X`!B0(``62`````(`H!0`E(,`"
+M(2BU``GX@`(E,$```0`Q)@``8HX`````*A`B`NK_0!1`@!$``@!"E@`````0
+M`$(P.P!`%````CP``$(D)2#``@GX0``(``4D)9A`````8HX`````,@!`&"6(
+M`````!X\`0`7)$`0$0`A$%$`@!`"`"``0B0A@&(""``"D@````"`$`(``(<#
+M-"&00P`%``*2`````!P`0!0```(\"P`'DA``H*\``%4D)2#``B4H8`()^*`"
+M#@`&)```U"<E(,`")2A``@GX@`(E,$``"0`"D@`````,`$`0@!`"`"&00@(+
+M``>2$`"WKR4@P`(E*&`""?B@`@X`!B0E(,`")2A``@GX@`(E,$```0`Q)@``
+M8HX`````*A`B`M/_0!1`$!$`/`"_CS@`OH\T`+>/,`"VCRP`M8\H`+2/)`"S
+MCR``LH\<`+&/&`"PCP@`X`-``+TGV/^])R0`OZ\@`+2O'`"SKQ@`LJ\4`+&O
+M$`"PKR6(@``E@*`````"/```0B0)^$``'(`%-(`_0S`"``*6``````!`0C`'
+M`$`0!`$3)(`?!SP;``(\$P`&)*P-$B0'```0%``4)-(`$R2`'P<\-@`"/`D`
+M!B1(#1(D"@`4)"4PPP`E,,(````0/```$"8E("`"'(`%-`GX``(E,,<`)2`@
+M`G`0!20)^``")3!@`B4@(`*P$`4D"?@``B4P0`(```(\``!")"4@(`()^$``
+M\!`%)/#_`SS_`V,T)!!#`(`R%``E("`"\!`%)`GX``(E,$8`)`"_CR``M(\<
+M`+./&`"RCQ0`L8\0`+"/"`#@`R@`O2?8_[TG)`"_KR``M*\<`+.O&`"RKQ0`
+ML:\0`+"O)9B``"6`H`!$+&.._W\%//__I30```(\``!")`GX0``D*&4`):!`
+M`````CP``$(D)2!@`@GX0``P``4D)2!``/`#D3`"B1$`!@``$B60(`(E``(D
+M(Q!1`$(0`@`$```0(9`B`@(`(BX!`$(L(Y!"`@H`41(/_`,D)!B#```Q$@#P
+M`\8P```"/```0B0E(&`",``%)`GX0``E,&8````"/```0B0E(&`""?A``"4H
+M@`(F$%$"*Q`"`"0`OX\@`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TGZ/^]
+M)Q``OZ\E.*``)4"``.@!@Y0`````*ACC``D`8!`E$````"D'`",HIP"`*`4`
+M(2@%`0```CP``$(D"?A``.`LI200`+^/``````@`X`,8`+TGZ/^])Q``OZ\E
+M0,``)3B``.@!@Y0`````*ABC``H`8!`E$````#$%`",PQ0"`,`8`(3#F````
+M`CP``$(D)2@``0GX0`#@+,8D$`"_CP`````(`.`#&`"])]#_O2<H`+^O)`"U
+MKR``M*\<`+.O&`"RKQ0`L:\0`+"O):"``"60H``EJ,``X`&#)@(``B00`$(2
+M"P`3)`,`0BX&`$`0`P`")`$``B0D`$(2__\")&0``!``````#0!"$@4``CP$
+M``(D$`!"$O__`B1=```0``````@`<90`````__\Q)@4``CS``$(T,```$"68
+M8@((`'&4`````/[_,2;``4(T*@``$"688@((`'&4`````/W_,28`$1$`(Q!1
+M`(`0`@`A$$0`Y"Q"C``````?`$`0`````$,``!#__P(D"`!BE``````4`$`0
+M)8@``.0L@HP`````#@!`$``````(`&:4!`"%)`$`,28J$"8""`!`$``1$0`C
+M$%$`@!`"`"$010#@+$*,`````/;_0!0`````"`!BE````````````P`B%@``
+M```G```0__\")``1$0`C$%$`@!`"`"&`@@#@+!`F!``#C@`````>`&`4__\"
+M)````CP``$(D)2```@GX0``\``4D#0"@%@0`$JX,`!.N`@`")!0``J[__P(D
+M&``"KO\#`B0<``*N"@`")"```J8B``*F"@``$#0``*XP`**.`````#0``JX`
+M``(\``!")"4@@`(E*"`""?A``"4PH`(E$"`"*`"_CR0`M8\@`+2/'`"SCQ@`
+MLH\4`+&/$`"PCP@`X`,P`+TGX/^])QP`OZ\8`+*O%`"QKQ``L*\E@(``S"P"
+MC@````#_`T(PU"P&C@``````-`8`_P,2/"0PT@```!$\```Q)J0`!20)^"`"
+M)3!&`-`L`HX`````_P-",-@L!HX``````#0&`"0PT@`E(``"J``%)`GX(`(E
+M,$8````"/```0B0E(``""?A``*P`!20`_`,D)!!#`-PL!HX`````_P/&,"4@
+M``*L``4D"?@@`B4P1@`<`+^/&`"RCQ0`L8\0`+"/"`#@`R``O2?H_[TG$`"_
+MKR4XH``E,(``Z`&#E``````K&.,`)@!@$"40````$0<`(Q!'`(`0`@`A*,(`
+MX"RE)`0`HXP`````'0!@$"40```$`*"L`0`#)`08XP`G&`,`S"S"C``````D
+M$&(`S"S"K-`LPHP`````)!!B`-`LPJS4+,*,`````"008@#4+,*LV"S"C```
+M```D$&(`V"S"K-PLPHP`````)!AB``(``CQ\Z4(D"?A``-PLPZP!``(D$`"_
+MCP`````(`.`#&`"])\C_O2<T`+^O,`"^KRP`MZ\H`+:O)`"UKR``M*\<`+.O
+M&`"RKQ0`L:\0`+"O)?"``"6XH``EF,`#-!+$CP````#H`<.7`````"L8XP)I
+M`6`0)1`````1%P`C$%<`@!`"`"&(8@+@+#$F!``CC@````!@`6`0`0`")!@`
+M(X[__P(D%`!B%``````&`(`0H``#)`(`@I0`````H`!",`(`0Q`?``0D#P`$
+M)`$`!R0K$.0`"P!`$("`%P!`$`<``0!'-"L0Y`#]_T`40!`'``0``!"`@!<`
+M&``GC@````"`@!<`_P/G,!P`(HX`````@!("``\``SP`_&,T)!!#`"4XX@`4
+M`":.```````U!@#P#P(\)##"`````CP``%4D)2#``T`0!28)^*`")3#F`"(`
+M)I8``````#$&`/``QC`@`"*6``````\`0C`E,,(`"``"/``@0C0E(,`#@!`%
+M)@GXH`(E,,(```@2)"0`(XX`````$`!@$``!%"3_``(\__]"-"008@`H`":.
+M```````V!@`E(,`#P`@%)@GXH`(E,$8`*``BC@`````"`$`0`0@2)`$)$B0P
+M`"*.``````L`0!"`*!<`_P`&//__QC0D,$8```$#/````CP``$(D)2#``P`)
+MI20)^$``)3##`(`0%P#`$$4D+``CC@\``CS__T(T`P!@$"0P8@`0``(\)3#"
+M`````CP``$(D"?A``"4@P`,P`"*.``````<`0!``````#``BC@`````@`$(P
+M`@!`$````````E(V#``BC@````!``$(P`P!`$/#_`B0DD$("`@!2-@\`0C(1
+M`$`0``````P`(HX```````%",`,`0!"__P(D`@``$$``4C8DD$("#``BC@``
+M``"``$(P`P!`$-__`B0"```0(`!2-B200@(,`"*.`0`#/"000P`"`$`0(``"
+M/"6@@@(,`"*.@``#/"000P`"`$`0```````"E#8,`"*.!``#/"000P`&`$`4
+M``````P`(HX"``,\)!!#``(`0!``````):"#`@P`(HX(``,\)!!#``(`0!``
+M`````$"4-@P`(HX0``,\)!!#``(`0!``````):"#`@0`(XX"``(D!0!B$`,`
+M`B0'`&(0`````"$``!``````H@!2-B4``CP=```0):""`C``(HX`````%P!`
+M%&(`4C8```(\```#/```0HP``&.,`````",00P#D+V:.`````",PP@````(\
+M``!"C``````C,,(`@#(&`(`H%P```0,\```"/```0B0E(,`#``FE)`GX0``E
+M,,,`!``"/"6@@@(X`"*.``````$`0C`"`$`0)``"/"6@@@*`@!<`P`D5)@``
+M`CP``%8D)2#``R4HH`()^,`")3!``B4@P`,`$04F"?C``B4P@`(T`"*.````
+M`!8`0!`E(,`#0#`7```+!20)^,`"4`#&)"4@P`,T`":."?C``@0+!20E(,`#
+M"`L%)`GXP`()``8D```"/```0B0E(,`#"?A``"4HH`(E(,`#)2B@`@GXP`(`
+M$$8T#``BC@`````!`$(P!P!`$`$``B0$$.("S"QCC@`````E$$,`!P``$,PL
+M8JX$$.(")Q`"`,PL8XX`````)!!#`,PL8JX,`"*.``````$`0C`'`$`0`0`"
+M)`00X@+0+&..`````"400P`'```0T"QBK@00X@(G$`(`T"QCC@`````D$$,`
+MT"QBK@P`(HX``````@!",`<`0!`!``(D!!#B`M0L8XX`````)1!#``<``!#4
+M+&*N!!#B`B<0`@#4+&..`````"000P#4+&*N#``BC@`````$`$(P!P!`$`$`
+M`B0$$.("V"QCC@`````E$$,`!P``$-@L8JX$$.(")Q`"`-@L8XX`````)!!#
+M`-@L8JX,`"*.``````@`0C`'`$`0`0`")`00X@+<+&..`````"400P`'```0
+MW"QBK@00X@(G$`(`W"QCC@`````D$$,`W"QBK@(``CQ\Z4(D)2#``PGX0``E
+M*"`"`0`")#0`OX\P`+Z/+`"WCR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``
+ML(\(`.`#.`"])^C_O2<0`+^O@"@%`````CP``$(D"?A````(I200`+^/````
+M``@`X`,8`+TGZ/^])Q``OZ^`*`4````"/```0B0)^$````BE)`$``B00`+^/
+M``````@`X`,8`+TGZ/^])Q``OZ\!``8D!#"F`````CP``$(D"?A``$`(!20!
+M``(D$`"_CP`````(`.`#&`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR68
+M@``ED*``@"@2`````CP``%$D"?@@`@`*I20#`%`P"0``%B4@8`()^"`"0`@%
+M)`$``R0$&$,")!!#``,`0!`E$``"`0`0)"40``(@`+^/'`"SCQ@`LH\4`+&/
+M$`"PCP@`X`,H`+TGR/^])S``OZ\L`+>O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4
+M`+&O$`"PKR60@``EN*```0`&)````CP``$(D@`@%)`GX0``$,.8"Z`,5)```
+M`CP``%$D```"/`0``!```%`D"?@``F0`!"3__[4F!0"@$B4@0`()^"`")2C@
+M`OC_0!0````````"/```0B0E($`""?A``"4HX`)I`$`0```"/,P!1(X`````
+M!P"#.`$`8RP+`((X`0!"+"488@`,`&`4"@`#)`H`@Q`)``(D"`""$`````!:
+M`(,4```"/-`!0I8`````!`!"+%4`0!````(\)8@``````CP``%0D```"/```
+M4R0!`!8\)2!``@GX@`),@`4T)8!``"4@0`(`@04T"@`&/`GX8`)D`,8T@H(0
+M`/__!C(E($`"_(`%-`GX8`(E,-8`)2!``@GX@`),@`4T@A("``0`4!`!`#$F
+M`@`B+NK_0!0E($`"```1/```,28E($`""?@@`DB`!31```8\```0/```$"8E
+M($`"2(`%-`GX``(E,$8````"/```0B0)^$``R``$)"4@0`()^"`"_(`%-/[_
+M!CS__\8T)2!``OR`!30)^``")#!&`&0`$"0```(\``!3)````CP#```0``!1
+M)`GX(`(*``0D)2!``@GX8`(E*.`"!`!`$````CS__Q`F]_\`%@```````$(D
+M)2!``@GX0`!(@`4TO_\&//__QC0```,\``!C)"4@0`)(@`4T"?A@`"0P1@``
+M``(\``!")"4@0`*`"`4D"?A``"4P```K$!4`,`"_CRP`MX\H`+:/)`"UCR``
+MM(\<`+./&`"RCQ0`L8\0`+"/"`#@`S@`O2<4`*./(`"ICR@`J(\L`*J/````
+M`/0O@H0`````(1AB`$``8BP"`$`4)3B@`#\``R3_#\(P`!P#`"4P0P`@``(Q
+M`@!`$(```CPE,,(`)`"BCP````!`%@(``!X#/"000P`E&,(``0`",0(`0!``
+M`0(\)1AB`!```C$"`$`0`"`"/"488@`+`..H"`#CN!``I8\``````"T%`#P`
+MI(\`````0"8$`#0`HX\`````0!\#`#@`HH\`````P!8"`"4HI``E**,`)2BB
+M``(``C$"`$`0``$"/"4HH@`/`.6H#`#EN!P`HH\``````!0"``\``SPD&$,`
+M0``",0(`0!```````(!C-!,`XZ@0`..X&`"BCP`````7`.*H%`#BN/__`B0/
+M`"(10!,)``\`Y(@,`.28#P`#/`#@8S0D$$,`)2""``\`Y*@,`.2X"P#BB`@`
+MXI@`0`,\)1!#``L`XJ@(`.*X#``",2(`0!``?P,\`/]C-`<80P$!`&,P'@!@
+M$"40```(``(Q*Q`"`,`7`@`+`..("`#CF``````E&&(`!``",0,`0!``````
+M0``"/"488@`+`..H"`#CN!,`XX@0`..8,`"BCP````#_?T(P)1AB`!,`XZ@0
+M`..X%P#BB!0`XI@`'0H`)1!#`!<`XJ@4`.*X`0`")`@`X`,`````%`"HCQP`
+MJ8\`````#P#@$``5!P`3`*.($`"CF/``!#PD$$0`)1AB``"`8S03`*.H$`"C
+MN!<`HH@4`**80!D&`"400P`7`**H%`"BN!$``!$`%@@`$P"CB!``HY@`#P0\
+M)!!$`"488@``@&,T$P"CJ!``H[@7`*.(%`"CF!``HH\`````@!("`"488@`7
+M`*.H%`"CN!``(!$`'PD`$P"BB!``HI@`````)1!#``"`0C03`**H$`"BN!<`
+MHX@4`*.8&`"BCP````#`$P(`)1AB`!<`HZ@4`*.X"`#@`P$``B0+`**("`"B
+MF``@`SPE$$,`"P"BJ`@`HK@(`.`#`````!``HX\4`*2/``````H`X!``````
+M#P"BB`P`HI@"`&`4)1!&```00C0/`**H#`"BN!P``!``````$0!@$"48```+
+M`*"H"`"@N`\`IJ@,`*:X$P""B!``@I@`````$P"BJ!``HK@7`(*(%`""F```
+M```7`**H%`"BN`H``!``````"P"CJ`@`H[@`$,(T#P"BJ`P`HK@3`*.H$`"C
+MN!<`HZ@4`*.X'P"@J!P`H+@?`**('`"BF``````;`**H&`"BN`@`X`,!``(D
+M'P"CB!P`HY@``````0!C,*H`8!`/``(D'P"BB!P`HI@`````_A]",$(0`@``
+M`,*D&P"BB!@`HI@``````A0"``(`PJ0$`,"@&P"BB!@`HI@``````0!",!P`
+M0!0`````&P"BB!@`HI@``````@!",`(`0!`!``(D!`#"H!L`HH@8`**8````
+M``@`0C`%`$`0``````0`PI```````@!"-`0`PJ`;`**(&`"BF``````$`$(P
+M!0!`$``````$`,*0``````0`0C0$`,*@'P"BB!P`HI@`````0A4"``,`0C`+
+M`,*@_P!#,`$``B06`&(0``````(`8B@%`$`0`@`")`L`8!``````(@``$```
+M````````$@!B$``````#``(D%0!B$``````:```0`````!<`HH@4`**8````
+M`!\`0C`4```0!0#"H!<`HH@4`**8`````.`#0C`,```00A$"`!<`HH@4`**8
+M``````!\0C`&```0@A("`!<`HH@4`**8`````,(3`@`?`$(P@`!"-`4`PJ`?
+M`**('`"BF`````!"$P(`!@#"H!L`HH@8`**8`````/``0C`"$0(`!P#"H!L`
+MHH@8`**8```````/0C`"$@(`"`#"H`L`PY`"``(D%0!B$``````#`&(H!@!`
+M$`,``B0!``(D&`!B$``````?```0```````````<`&(4`````!,`HX@0`*.8
+M``````(>`P`/`&,P"`#"D``````A$$,`"`#"H!,`HX@0`*.8``````(=`P`/
+M`&,P"`#"D``````A$$,`"`#"H!,`HX@0`*.8``````(<`P`/`&,P"`#"D```
+M```A$$,`"`#"H!L`HH@8`**8``````#P0C`"$P(`"0#"H!\`HX@<`*.8``$"
+M/"088@`!`&,L`@`")",00P`*`,*@)1````@`X`,```````"BC*!&@XP`````
+M)!!#````HJPG$`(`H$:#C``````D$$,`"`#@`Z!&@JP``````````.#_O2<8
+M`+^O%`"QKQ``L*\E@(`````"/```0B0)^$``A"P%)@``$3P``#$F)2```B2!
+M!30)^"`")3```"4@``(H@04T"?@@`B4P```E(``"0``%)`GX(`(E,```)2``
+M`C"!!30)^"`"`@`&/"4@``(X@04T"?@@`@`"!CP8`+^/%`"QCQ``L(\(`.`#
+M(`"])^#_O2<8`+^O%`"QKQ``L*\EB(`````0/```$"9```4D"?@``@8`!B0`
+M``(\``!")"4@(`()^$``A"PE)B4@(`(D@04T"?@``B4P```E("`"*($%-`GX
+M``(E,```&`"_CQ0`L8\0`+"/"`#@`R``O2<E.(``)3```$`0!@`A$$8`@!`"
+M`",01@#`$`(`(1!'`"@P1)0``*.4`````!P`@Q`E$,``0!`&`"$01@"`$`(`
+M(Q!&`,`0`@`H,$(D(1CB````8I0`````#0!`%`$`QB3__\8D``"BE```````
+M`&*D`@"BE``````"`&*D!`"BD``````$`&*@"`#@`R40P`!``,(LW/]`%```
+M```E$```"`#@`P`````D,(*,``````@`X`,`````Z/^])Q0`OZ\0`+"O)8"`
+M`````CP``$(D"?A``(0L!29(+`(F%`"_CQ``L(\(`.`#&`"])]C_O2<@`+^O
+M'`"SKQ@`LJ\4`+&O$`"PKR60@``EF*``)8A``N,!(I(``````0!",!PP(JX`
+M``(\``!")"@P)"8)^$```!8%)"4P```'``\D`@`.)/0!#23(``<D9``,)"@`
+M"R0'``HDOP`)/`S^*36_``@\./\(-<P!0HX`````!P!"+`@`0!!`$`8`(1!&
+M`(`0`@`C$$8`P!`"`"$040`'```0,#!/H"$01@"`$`(`(Q!&`,`0`@`A$%$`
+M,#!.H$`0!@`A$$8`@!`"`",01@#`(`(`!``E)B$0A0`X,$VL0#"#)"$0(P(`
+M`$>L(1BC````9ZQ(,(,D(1`C`@``3*PA$)$`4#!+K"$8HP```&JL,#"")"$0
+M(@($`$"@!0!`H```0Y```````@!#H`,`0*`<,"*.``````0`0!`A$(4`:#!)
+MK"$0D0!P,$BL`0#&)$``PBS(_T`4`````!PP(HX`````#@!`$```$#P``!`F
+M)2!``FPP)HX)^``"+($%-"4@0`)P,":."?@``C2!!30```(\``!")`GX0``E
+M($`"9``")`8`8!(@,"*N&#`BC@`````!`$(T!0``$!@P(JX8,"*._O\#)"00
+M0P`8,"*N(`"_CQP`LX\8`+*/%`"QCQ``L(\(`.`#*`"])^#_O2<8`+^O%`"Q
+MKQ``L*\EB(``'#`BC@`````-`$`0```"/```0B0)^$`````0/```$"8E("`"
+M+($%-`GX``(E,```)2`@`C2!!30)^``")3```!@`OX\4`+&/$`"PCP@`X`,@
+M`+TGF/^])V``OZ]<`+>O6`"VKU0`M:]0`+2O3`"SKT@`LJ]$`+&O0`"PKR6H
+M@``EH*`")#"7C@`````'`*(L]`%`$"40``````(\D%M")(`8!0`A&&(```!B
+MC``````(`$```````"6PP``%`,,LZ`%@$"40`````!(\``!2)B4@H`()^$`"
+M4)@%-`_P`SS__V,T)!!#`("`%@`A&!0"*$9FC```````-08`\`\#/"0PPP``
+M`!$\```Q)B4@H`)0F`4T"?@@`B4P1@`E(*`""?A``ER8!31_@`,D)!!#`"$8
+M%`)01F:,`````,`Q!@"`?\8P)2"@`ER8!30)^"`")3!&`"4@H`()^$`"7)@%
+M-,#_`SS_?V,T)!!#``0`DR8A&!,".$9FC`````#`,P8`/P`#/`"`8S0D,,,`
+M)2"@`ER8!30)^"`")3!&`"4@H`()^$`"6)@%-`/\`SS__V,T)!!#`"&`$P)@
+M1@:.`````(`T!@#\`P,\)###`"4@H`)8F`4T"?@@`B4P1@`)`.*2`````"L0
+M5@`&`$`0`````$@L@HX``````0!")`H``!!(+(*N"0#BD@`````K$,("!0!`
+M$`````!,+(*.``````$`0B1,+(*NC0$`$`D`]J)_``,D$`"CKS(``B04`**O
+M&`"CKR@``B0<`**O(`"CKTT``B0D`**O*`"CKT```B0L`**O'P`")#``HJ\0
+M``(D-`"BKS\``B0X`**O,``")#P`HJ\KF`8````"/```4B0E(*`""?A``FR8
+M!33@_P,\_S]C-"000P"`@!,`$`"C)R$8<````&:,`````(`S!@`?``,\`,!C
+M-"0PPP````,\``!Q)"4@H`)LF`4T"?@@`B4P1@`E(*`""?A``FR8!30?\`,\
+M__]C-"000P`8`*,G(1AP````9HP`````0#4&`.`/`SPD,,,`)2"@`FR8!30)
+M^"`")3!&`"4@H`()^$`":)@%-`'_`SS__V,T)!!#`"``HR<A&'````!FC```
+M``!`-`8`_@`#/"0PPP`E(*`":)@%-`GX(`(E,$8`)2"@`@GX0`)HF`4T_X`#
+M//__8S0D$$,`*`"C)R$8<````&:,```````V!@``?P,\)###`"4@H`)HF`4T
+M"?@@`B4P1@`E(*`""?A``FB8!33@_P,D)!!#`#``HR<A&'````!FC``````?
+M`,8P)2"@`FB8!30)^"`")3!&`"4@H`()^$`";)@%-/_``R0D$$,`.`"C)R$8
+M<````&:,```````R!@``/\8P)2"@`FR8!30)^"`")3!&``D`8!(E(*`""?A`
+M`FR8!30E(*`";)@%-`GX(`(!`$8T#0``$`$`8RX```(\``!")`GX0`!LF`4T
+M_O\&)````SP``&,D)2"@`FR8!30)^&``)#!&``$`8RX,`.*2`````/<`8A`!
+M``(D!@!@$@````!8+(*.``````$`0B0%```06"R"KEPL@HX``````0!")%PL
+M@JX!`&(NZ```$`P`XJ((``(D$`"BKP8``B04`**O*X`&`````CP``$(D)2"@
+M`@GX0``(H@4TP/\#)"000P"`(!``$`"C)R$89````&:,`````#\`QC````,\
+M``!C)"4@H`((H@4T"?A@`"4P1@`-`.*2`````,T``A(!``(D!@``$@````!@
+M+(*.``````$`0B0%```08"R"KF0L@HX``````0!")&0L@JZ_```0#0#PHA``
+MH*\$``(D%`"BKP@``B08`**O)8C```,`PRRW`&`0)1```````CP``$(D)2"@
+M`@GX0`!8F`4T_/\#//\/8S0D$$,`@!@1`"$8HP,0`&:,```````S!@`#``,\
+M`/!C-"0PPP````,\``!C)"4@H`)8F`4T"?A@`"4P1@`+`.*2`````"L040`&
+M`$`0`````&@L@HX``````0!")`H``!!H+(*N"P#BD@`````K$"("!0!`$```
+M``!L+(*.``````$`0B1L+(*NBP``$`L`\:(```(\<%M#)'!;0HP`````$`"B
+MKP0`8HP`````%`"BKP@`8HP`````&`"BKPP`8HP`````'`"BKQ``8HP`````
+M(`"BKQ0`8HP`````)`"BKQ@`8HP`````*`"BKQP`8HP`````+`"BKR6(P``(
+M`,,L;@!@$"40``````(\``!")"4@H`()^$``))D%-`'_`R0D$$,`@!@1`"$8
+MHP,0`&:,`````$`P!@#^`,8P```#/```8R0E(*`"))D%-`GX8``E,$8`"@#B
+MD@`````K$%$`!@!`$`````!0+(*.``````$`0B0*```04"R"K@H`XI(`````
+M*Q`B`@4`0!``````5"R"C@`````!`$(D5"R"KD4``!`*`/&B%0#`%/W_`R08
+M,(*.`````"000P`8,(*N```"/```0B0)^$``)2"@`@```CP``$(D"?A``"4@
+MH`+__@4D```#/```8R0E(*`""?A@`"0H10`P```0`0`")!@P@HX``````@!"
+M,"L`0!0!``(D'#""C@`````:`$`0```"/```0B0)^$``)2"@`O_^!20```,\
+M``!C)"4@H`()^&``)"A%````$#P``!`F)2"@`FPPAHX)^``"+($%-"4@H`)P
+M,(:."?@``C2!!30```(\``!")`GX0``E(*`""0``$````````$(D"?A``"4@
+MH`(```,\``!C)"4@H`()^&````%%-!@P@HX``````@!"-!@P@JX!``(D8`"_
+MCUP`MX]8`+:/5`"UCU``M(],`+./2`"RCT0`L8]``+"/"`#@`V@`O2?8_[TG
+M(`"_KQP`LZ\8`+*O%`"QKQ``L*\ED(``)#!1C@`````0`""N'#!"C@`````J
+M`$`0)9A``A0`(X[```(\*Q!#``,`0!#```(\`P``$$0`(*XC$$,`1``BKAP`
+M(X[```(\*A!#``,`0!#```(\`P``$$@`(*XC$$,`2``BK@``$#P``!`F)2!`
+M`D0`)HX)^``"+($%-"4@0`)(`":."?@``C2!!30E($`",($%-`GX``("``8\
+M)2!``CB!!30)^``"``(&/````CP``$(D)2!``@GX0`"$+&4F/``@KD``(*X@
+M`+^/'`"SCQ@`LH\4`+&/$`"PCP@`X`,H`+TGX/^])Q@`OZ\4`+&O$`"PKR6(
+M@``T$B6.`````!@P(HX``````P!",`,``R1L`$,4)3@@`B0P,(X`````"0`&
+MD@`````$`,(L!P!`$````CP``$(D`0`%)`GX0``!`,8D7P``$``````*``:2
+M"``"D@`````K$,(`"`!`$````CP``$(D)2`@`@4`!20)^$```0#&)%(``!``
+M````F"SCC`````!_`&(P0`!"+'\`8R0$`$`0PAD#`)@LXHP`````PAD"`"@`
+M`HX`````*A!#`!``0!``````#``"D@`````:`$`4)2`@`@``$#P``!`F`@`%
+M)`GX``(E,```)2`@`@4`!20)^``")3```#0``!``````)``"C@`````J$$,`
+M%@!`$````CP,``*2``````8`0!````(\``!")"4@(`("``4D"?A```$`!B0+
+M``:2``````(`PBPA`$`0```"/```0B0E("`"!``%)`GX0``!`,8D&@``$```
+M`````$(D"?A``"4@(`+^_T(D`@!"+!,`0!``````#``"D@`````&`$`4```"
+M/```0B0E("`"`@`%)`GX0``E,```"P`"D@`````&`$`0```"/```0B0E("`"
+M!``%)`GX0``E,```&`"_CQ0`L8\0`+"/"`#@`R``O2?@_[TG&`"_KQ0`L:\0
+M`+"O)8B``#02)8X`````&#`BC@`````#`$(P`P`#)#D`0Q0E."`")#`PC@``
+M```)``:2``````0`PBP'`$`0```"/```0B0!``4D"?A```$`QB0L```0````
+M`)@LXXP`````?P!B,$``0BQ_`&,D!`!`$,(9`P"8+.*,`````,(9`@`D``*.
+M`````"H00P`-`$`0```"/`L`!I(``````@#"+!@`0!````(\``!")"4@(`($
+M``4D"?A```$`QB01```0````````0B0)^$``)2`@`O[_0B0"`$(L"@!`$```
+M```+``*2``````8`0!````(\``!")"4@(`($``4D"?A``"4P```8`+^/%`"Q
+MCQ``L(\(`.`#(`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR6(@``E@*``
+M`@`"/(#\0B0T$B6."?A``"68(`)`&`(`(1AB`(`8`P`C&&(`P!@#`"&0(P(H
+M,%(F)#`RKMP!(XX!``(D!@!B%/W_`R08,"*.``````(`0C0%```0&#`BKA@P
+M8HX`````)!!#`!@P8J[<`2..`0`")"D`8A`E("`">"QBC@`````!`$(D>"QB
+MK@``$#P``!`F`0`%)`GX``(E,```)2`@`@4`!20)^``")3```"4@(`($``4D
+M"?@``B4P```E("`"`@`%)`GX``(E,```)2`@`@,`!20)^``")3```````CP`
+M`$(D"?A``"4@(`(```,\``!C)"4@(`()^&````%%-`(``CS\!T(D"?A``"4@
+M(`)@```0`````!@P(HX``````P!",`,``R1:`$,4`````!D``!(``!`\```0
+M)B4@(`()`$:2"?@``@$`!20E("`""@!&D@GX``(%``4D#`!&DB4@(`("``4D
+M"?@``@$`QBPE("`"#0!&D@GX``(#``4D)2`@`@L`1I()^``"!``%)!8``!``
+M```````0)B4@(`(!``4D"?@``@0`!B0E("`""`!&D@GX``(%``4D)2`@`@(`
+M!20)^``"`0`&)"4@(`(#``4D"?@``@$`!B0E("`"!``%)`GX``("``8D'#!B
+MC@`````:`$`0```"/```0B0)^$``)2`@`O_^!20```,\``!C)"4@(`()^&``
+M)"A%``(``CS\!T(D"?A``"4@(`(``!`\```0)B4@(`(P@04T"?@``@(`!CPE
+M("`".($%-`GX``(``@8\#@``$``````"``(\_`=")`GX0``E("`"```"/```
+M0B0)^$``)2`@`@```SP``&,D)2`@`@GX8````44T(`"_CQP`LX\8`+*/%`"Q
+MCQ``L(\(`.`#*`"])]C_O2<@`+^O'`"SKQ@`LJ\4`+&O$`"PKR60@``EB*``
+M)9A``@``$#P``!`F)($%-`GX``(E,```)2!``BB!!30)^``")3```````CP`
+M`$(D)2!``@GX0`"$+$4F```BC@````"8+$*N!``BC@````"<+$*N"``BC@``
+M``"@+$*N```0/```$"8E($`""?@``BR!!30EB$``)2!``@GX``(T@04T)2A`
+M`,```SPD$","`P!#$"00HP`P`$,4`````"0P<(X`````1``$C@`````C("0"
+M/``"C@`````C$((`<"QCC@`````A$$,`<"QBKCP`!*Y(``2.`````",@I`!`
+M``*.`````",0@@!T+&..`````"$00P!T+&*N0``$KCP``XX4``*.`````"L0
+M0P`$`$`0`@`"//P(0B0)^$``)2!``D```XX<``*.`````"L00P`&`$`0`@`"
+M/`(``CSP"D(D"?A``"4@0`("``(\_`=")`GX0``E($`"(`"_CQP`LX\8`+*/
+M%`"QCQ``L(\(`.`#*`"])^C_O2<4`+^O$`"PKR6`@``D,`:.``````4`HY`1
+M``(D&`!B%"4X``(\`,*,``````$`0B0\`,*L<"P"C@`````!`$(D<"P"KCP`
+MPXP4`,*,`````"L00P`B`$`0`@`"//P(0B0)^$````````(``CS\!T(D"?A`
+M`"4@``(9```0`````!D``B06`&(4`````$``PHP``````0!")$``PJQT+.*,
+M``````$`0B1T+.*L0`##C!P`PHP`````*Q!#``@`0!`"``(\\`I")`GX0``E
+M(``"`@`"//P'0B0)^$``)2```A0`OX\0`+"/"`#@`Q@`O2?H_[TG$`"_KR4H
+M@``D,(:,`````)@L@XP`````?P!B,$``0BQ_`&,D!`!`$,(9`P"8+**,````
+M`,(9`@`H`,*,`````"H00P`:`$`4`````"0`PHP`````*A!#``L`0!``````
+M#`#"D``````'`$`0```"/```0B0"``4D"?A```$`!B0<```0``````L`PY``
+M````!P!@$````CP``$(D!``%)`GX0`#__V8D$@``$``````*`,.0``````<`
+M8!````(\``!")`4`!20)^$``__]F)`@``!``````"0#&D``````$`,`0``!"
+M)`$`!20)^$``___&)!``OX\`````"`#@`Q@`O2?8_[TG(`"_KQP`LZ\8`+*O
+M%`"QKQ``L*\EB(`````0/```$"8)^``"[(`%-"680``E("`""?@``O"`!30E
+MD$``)2`@`@GX``+X@`4T)3!``"0P)8X`````.`"BC``````#`$`0*Q#"``<`
+M0!``````)1@``'PL(HX``````0!")!,``!!\+"*N.`"DC``````C(,0`-`"C
+MC``````C&$,",`"BC``````C$&("(QB#`",88@!37P(\*3E"-!@`8@`0$```
+M@Q,"`,,?`P`C&$,`.`"FK#``LZPT`+*L)1!@`"``OX\<`+./&`"RCQ0`L8\0
+M`+"/"`#@`R@`O2?0_[TG*`"_KR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR68
+M@``ED&`")#!QC@```````**,`````)@L8JX$`**,`````)PL8JX(`**,````
+M`,,`(!*@+&*N`@`"/'P20B0)^$```````"6`0``)``$&`````(`L8HX`````
+M`0!")(`L8JX"``(\_`=")`GX0``E(&`"$``BC@`````A$`("$``BKAPP0HX`
+M````20!`$````CP``$(D)2!@`@GX0`"$+$4F```0/```$"8E(&`""?@``BR!
+M!30EJ$``)2!@`@GX``(T@04T):!``$0`(HX`````*Q"B`@@`0!0E(&`"2``B
+MC@`````K$(("&P!`$``````*```0````````$#P``!`F1``FC@GX``(L@04T
+M)2!@`C"!!30)^``"`@`&/$@`)HX`````*Q"&`H0`0!```!`\```0)B4@8`()
+M^``"-($%-"4@8`(X@04T"?@``@`"!CQZ```0`````$0`)(X`````(R"D`CP`
+M(HX`````(Q""`'`L0XX`````(1!#`'`L0JX\`"2N2``DC@`````C((0"0``B
+MC@`````C$((`="Q#C@`````A$$,`="Q"KD``)*X8,&*.``````,`0C`#``,D
+M7@!#%``````@,$..`````(`0`P`A$$,`$``DC@`````K$$0`(@!`$&(0!3P8
+M`"*.`````!@`@@`2$```TTVE-``````9`$4`$!```((1`@`\`"..`````"L0
+M0P`L`$`4`@`"/"``(HX`````&`""`!(0`````````````!D`10`0$```@A$"
+M`$``(XX`````*Q!#`!T`0!0"``(\=!%")`GX0``E(&`"&0``$`(``CP0`"..
+M(#!"C@`````K$$,`+@!`$``````4`"*.`````!@`8@`2$```8A`#/---8S09
+M`$,`$!```((1`@`\`"..`````"L00P`*`$`0`@`"//P(0B0)^$``)2!@`@(`
+M`CS\!T(D"?A``"4@8`(7```0`````!``(HX<`"..`````!@`0P`2$```8A`#
+M/---8S09`$,`$!```((1`@!``"..`````"L00P`(`$`0`@`"//`*0B0)^$``
+M)2!@`@(``CS\!T(D"?A``"4@8`(H`+^/)`"UCR``M(\<`+./&`"RCQ0`L8\0
+M`+"/"`#@`S``O2<`````-!*"C````````$*4````````HJ0T$H.,``````0`
+M8I``````"`!"-`0`8J`$`**0``````@`0C0$`**@-!*"C``````"`$*4````
+M``(`HJ0T$H*,``````0`0I``````!`"BH#02@HP`````!0!"D``````%`**@
+M"`#@`R40``#(_[TG,`"_KRP`MZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0
+M`+"O):"``"6PH``EN,``)8#@`"6(``````(\L%M2)````CP``%4D```"/```
+M4R1`$!$`(1!1`,`8`@`A&'(`0!`"`"$05@"`$`(`(1!2````98P``$:,"?B@
+M`B4@@`(!`!`F/P`",@,`0!0`````"?A@`@$`!"0!`#$F#@`B+NS_0!1`$!$`
+M)8@``````CP`75(D```"/```520```(\``!3),`0$0`A&%(`)1!@````98P$
+M`$:,"?B@`B4@@`(!`!`F/P`",@,`0!0`````"?A@`@$`!"0!`#$F2``B+O'_
+M0!3`$!$`)8@``````CS88%(D```"/```520```(\``!3)$`0$0`A$%$`@!@"
+M`"$8<@`A$%<`@!`"`"$04@```&6,``!&C`GXH`(E((`"`0`0)C\``C(#`$`4
+M``````GX8`(!``0D`0`Q)D``(B[L_T`4`````#``OX\L`+>/*`"VCR0`M8\@
+M`+2/'`"SCQ@`LH\4`+&/$`"PCP@`X`,X`+TGV/^])R0`OZ\@`+2O'`"SKQ@`
+MLJ\4`+&O$`"PKR6@H`````(\``!")```A98"`(:6"?A``"68@```%`(``R0"
+M``(`@I8`````@`!","P`0!!`@`0`(8`$`H"`$`````(\3&=")"&``@(```(\
+M``!")`0`!(X)^$``"``%)/\`4C!`D1(````"C@``````$0(`)9!"`@@`$(8`
+M```````"/```0B0E(&`""?A```2B!30E.$````"#EK0)`B0(`&(4```"/```
+M0B0E(&`"!*(%-`GX0``0`.8T#```$)$``BKO_P8D``!")"4@8`($H@4T"?A`
+M`"0PY@`$```0D0`"*B6`@``ED```D0`"*@0`0!````(\`0`",@@`0!````(\
+M``!").C_!"8)^$``"``%)/\`43`+```0`0`").C_!";"%P0`(2""`````CP`
+M`$(D0R`$``GX0``(``4D_P!1,"40``"`B!$`0!`"`"6((@(!!#$V_P!&,@`R
+M!@#_`"(R```0/```$"8E(&`"G)@%-`GX``(E,,(``HH1``#_0C+_`"8R)2!@
+M`M"8!30)^``")3!&`#02=*X!``(D)`"_CR``M(\<`+./&`"RCQ0`L8\0`+"/
+M"`#@`R@`O2?L+X2,``````@`HBP4`$`0@!@%`````CR0:$(D(1AB````8HP`
+M````"`!````````(`.`#)1"```@`X`-$`((D"`#@`T@`@B0(`.`#3`"")`@`
+MX`-0`((D"`#@`Y0`@B0(`.`#)1```&C_O2>4`+^OD`"^KXP`MZ^(`+:OA`"U
+MKX``M*]\`+.O>`"RKW0`L:]P`+"OF`"DKYP`I:___]0P)9"```(`HI0`````
+M\`%#,,```B1A`&(0)9@``,$`8B@&`$`00`$")*```B1'`&(0)1```+H!`!``
+M`````P!B$%`!`B2V`6(4)1```)P`HX\```````!BE`````!?\$(DZP1"+`<`
+M0!`EB```5!-5E@````!6$U:6`````"<``!`E*`````!BE`````!TZT(D\`!"
+M+`<`0!`E*```6!-5E@````!:$U:6`````!L``!``````G`"CCP```````&*4
+M`````(3J0B3A`$(L!P!`$"6(``!<$U66`````%X35I8`````#0``$"4H````
+M`&*4`````%T60BPEL```!0!`%"6H``!@$U66`````&(35I8`````)8@``"4H
+M``#8$D*6`````&``HJ_>$D.6`````&0`HZ\!`&(L:`"BKRP30Y8`````*```
+M$&P`HZ]D$U66`````&835I8`````;!-%E@````!P$U&6`````-H20I8`````
+M8`"BK^`20Y8`````9`"CKP$`8BQH`**O+A-#E@`````4```0;`"CKV@3598`
+M````:A-6E@````!N$T66`````'(3498`````W!)"E@````!@`**OXA)#E@``
+M``!D`*.O`0!B+&@`HJ\P$T.6`````&P`HZ\E@```&`"D)P```CQ`7T8D@!@0
+M`"$8@P!`$!``(1!0`$`0`@`A$%0`@!`"`"$01@```$*,````````8JP!`!`F
+M$0`"+O/_0!2`&!``G`"CCP`````"`&*4`````(``0C`-`$`0```0/!``H*\`
+M`!`F&`"D)P,`!B0)^``"=P`')!``H*\8`*0G)2@@`@,`!B0)^``">@`')"6`
+M```8`+$G```"/```7B0```(\``!7)$`0$``A$%``P!`"`````SQ`7V,D(1!#
+M`(`8$``A&","F`"DCP``18P``&:,"?C``P$`<R8_`&(R`P!`%``````)^.`"
+M`0`$)`$`$"81``(N[/]`%$`0$``E@``````"/-AC420```(\``!>)````CP`
+M`%<DP!`0`"$840`E$&``F`"DCP``98P$`$:,"?C``P$`<R8_`&(R`P!`%```
+M```)^.`"`0`$)`$`$";Q_P`2```"/"6```#@8U$D```"/```7B0```(\``!7
+M)$`0$``A$%``P!@"`"$8<0!`$`(`(1!4`(`0`@`A$%$`F`"DCP``98P``$:,
+M"?C``P$`<R8_`&(R`P!`%``````)^.`"`0`$)`$`$";L_P`2```"/"6```#X
+M8U$D```"/```7B0```(\``!7)$`0$``A$%``P!@"`"$8<0!`$`(`(1!4`(`0
+M`@`A$%$`F`"DCP``98P``$:,"?C``P$`<R8_`&(R`P!`%``````)^.`"`0`$
+M)`$`$";L_P`2&`"D)R6```````(\$&1%)(`8$``A&(,`0!`0`"$04`!`$`(`
+M(1!4`(`0`@`A$$4```!"C````````&*L`0`0)A$``B[S_T`4@!@0`)P`HX\`
+M`````@!BE`````!``4(P0`$#)`\`0Q0#`!$DS!-%EA``L:\``!`\```0)A@`
+MI"<!``8D"?@``C,`!R3.$T66$`"QKQ@`I"<!``8D"?@``BT`!R00`*"O```0
+M/```$"88`*0G:`"ECP$`!B0)^``"7P`')!``H*\8`*0G8`"ECP0`!B0)^``"
+M8``')!``H*\8`*0G)2B@`@,`!B0)^``":``')!``H*\8`*0G)2C``@,`!B0)
+M^``":P`')"6```````(\$&17)!@`L2<```(\``!6)````CP``%4D0!`0`"$0
+M4`#`$`(`(1!7`(`8$``A&","F`"DCP``18P``&:,"?C``@$`<R8_`&(R`P!`
+M%``````)^*`"`0`$)`$`$"81``(N[O]`%$`0$``E@```&`"D)P```CRH944D
+M@!@0`"$8@P!`$!``(1!0`$`0`@`A$%0`@!`"`"$010```$*,````````8JP!
+M`!`F"``"+O+_0!0&``8D$`"@KP``$#P``!`F&`"D)VP`I8\)^``"'0`')!``
+MH*\8`*0G9`"ECP$`!B0)^``"!``'))P`HX\```````!BC`#``SPD$$,`'@!`
+M$"6```"<`*./``````(`8I0``````$!",`(`0!00`!$D'P`1)!``H*\``!`\
+M```0)A@`I"<?``4D!0`&)`GX``(3``<D$`"@KQ@`I"<E*"`"!0`&)`GX``(8
+M``<D$`"@KQ@`I"<#``4D`@`&)`GX``(Q``<D)8```````CRH958D&`"Q)P``
+M`CP``%4D```"/```5"1`$!``(1!0`,`0`@`A$%8`@!@0`"$8(P*8`*2/``!%
+MC```9HP)^*`"`0!S)C\`8C(#`$`4``````GX@`(!``0D`0`0)@@``B[N_T`4
+M0!`0`,0O0*X!``(DE`"_CY``OH^,`+>/B`"VCX0`M8^``+2/?`"SCW@`LH]T
+M`+&/<`"PCP@`X`.8`+TG__^$,/__I3#__\8P___G,!``J)<`````&`#H`!(8
+M```H`&`0)1```"0`Q1``````(Q"%`$`8`@`A&&(`P!@#`"$88@"`&`,`(Q#%
+M`!H`8@`2&````@!`%``````-``<``!P#``,D`P`5`(`$)1C@`&4`@B@2`$`0
+M)1@``1@`B``2&```9``")",01``8`$<`$A```"$88@#K40(\'X5"-!@`8@`0
+M$```0Q$"`,,?`P`C$$,``@``$/__0S`E&.``)1!@``@`X`,`````H/Z])UP!
+MOZ]8`;ZO5`&WKU`!MJ],`;6O2`&TKT0!LZ]``;*O/`&QKS@!L*\EN.``):"`
+M`#\``B0P`:*O`@#BE@````#P`4,PT``")"8`8A`E\```T0!B*`@`0!!0`0(D
+MH``")!@`8A#```(D'@!B$"40```B`0`0``````H`8A!1`6(H!@!`$$`)`B1`
+M`0(D!0!B$"40```9`0`0`````!<!8A0E$```YA."E@`````D`:*GTA.")B`!
+MHJ_H$X(F$```$"@!HJ_P%8*6`````"0!HJ?X%8(F(`&BKZX6@B8(```0*`&B
+MK_`5@I8`````)`&BI_(5@B8@`:*O$A:")B@!HJ\@`;4G```"/```0B08`*0G
+M"?A```@!!20@`+8GH`"S)P$`$B0EB```0!`1`"$05@```%*D`0!2)D``0BKZ
+M_T`4`0`Q)AX`L:<!``(D&@"BIS\``B0<`**G__\B,A$`0!`EB````@`"//`H
+M4B1`@!$`(1`6`@``Y)8``$64"?A``B4PH`(A@!,"```"I@$`,28>`**7````
+M`"H0(@+T_T`40(`1````9H8`````'@"BEP````!`$`(`(1!B`O[_1X0`````
+M"P``$"6(```A(&("_O^#A```A90``(*$`````"H00P`"`$`0`````/[_A:0!
+M`#$F'@"BEP`````J$"("$`!`$$`0$0`A$%,```!#A``````J$,,``P!`%```
+M```E,&``__\^,AX`HI<`````(Q!1`/__0B3__U(PX_]`%D`0$@`>`**7````
+M`!``0!`EB```)2!``$`0$0`A$%,```!#A``````J$.,`!`!`$``````E.&``
+M__\C,C`!HZ\!`#$F*A`D`O3_0!1`$!$`&0#").M1!#P?A80T&`!$`!`8```#
+M&0,`PQ<"`",88@!`$`,`(1!#`,`0`@`A$$,`0!0"``.$`@`ED```&``$`A`@
+M```#(00`PQ<"`",@@@`!`(0D$`"`&"6(```0$````Q$"`,,?$``C$$,``0!$
+M)"48(`(!`"(F__]1,'A&@HY`&`,`(1AB``$`4B8J$$0"]_]`%```?J0>`**7
+M`````"4@0`!`$`(`(1!B`O[_0H0`````*A`"`D``(RXD$$,`6@!`$"60```"
+M``(\]")5)#(``B8`%`(``X0"`"40@`!`$`(`(1!B`O[_0H0`````*A`"`B$`
+M0!!`&!(`0!`2`"$04P```$.$`````",8`P("`$*$`````",0`@(8`&(`$A@`
+M`!4`8!A`&!(`0!`$`"$08@+^_T*$`````"H@`@(-`(`0`0!2)D`0$@`A$%,`
+M``!#A``````C&`,"`@!"A``````C$`("&`!B`!(8``#S_V`<`````$`8$@`A
+M$',```!%E`(`1I0A&'8```!GE`````!`.`<``@!BE`````!`$`(`__]",!``
+MHJ___P0R"?B@`O__YS`!`$(D__]",'A&@XY`(!$`(1B#`$(0`@```&*D>$:"
+MC@`````A(((```""E#`!HX\`````*Q!B``(`0!`!`"(F``"#I/__43`>`*27
+M`````$`0!``A$&("_O]"A``````J$`("0``C+B000P"K_T`4,@`")D``(BX,
+M`$`0`````'A&@XY`$!$`(1!#`/[_0Y0```````!#I`$`(B;__U$P0``B+O;_
+M0!0`````]"^`I@$``B1<`;^/6`&^CU0!MX]0`;:/3`&UCT@!M(]$`;./0`&R
+MCSP!L8\X`;"/"`#@`V`!O2>H_[TG4`"_KTP`MZ](`+:O1`"UKT``M*\\`+.O
+M.`"RKS0`L:\P`+"O):C``/__ES#__[8P`@`"/*`J0B0E(.`")2C``@GX0``8
+M`*<G!`!`$"4@X`(8`**72@``$``````$`*:6'`"B)Q``HJ\```(\``!")```
+MI8X)^$``&@"G)QH`I9<@`*(G$`"BKP(`$#Q,*Q`F)2#``B4PH`()^``"'@"G
+M)QP`I9<D`*(G$`"BKR4@P`(E,*`""?@``B(`IR<F`+,G`@`0/*`J$"8:`*27
+M'@"EER4PH`()^``")3A@`B@`LB<:`*27(`"EER4PH`()^``")3A``AX`I9<@
+M`*:7)@"GER@`HI<`````$`"BKP(`$3ST(C$F"?@@`B4@P`(EH$``'`"DER(`
+MI9<E,*`""?@``B4X8`(<`*27)`"EER4PH`()^``")3A``B(`I9<D`*:7)@"G
+MER@`HI<`````$`"BKPGX(`(E(,`"&@"EEQP`II<0`**O)2#@`@GX(`(E.(`"
+M4`"_CTP`MX](`+:/1`"UCT``M(\\`+./.`"RCS0`L8\P`+"/"`#@`U@`O2?_
+M_X0P__^E,`@`R(P`````!`#"E``````B`$`0)5```````I4`````&`!$%```
+M```(``DE!@`"E0`````3`$`0)1@```8`"R4``"*5``````D`110!`&,D__]C
+M)$`0`P`A$$L`&`!"E````````.*D"`#@`P$``B0&``*5`````"H08@#P_T`4
+M`@`I)0$`2B4$`,*4`````"H00@'@_T`4-``()0@`X`,E$```X/^])Q@`OZ__
+M_X0P__^H,`@`Q8P`````!`#"E``````/`$`0)1@`````HI0`````"P!($```
+M```$`,:4``````$`8R0J$&8`!0!`$#0`I20``**4`````/G_2!0`````!@"F
+ME#``HH\`````$`"BKP```CP``$(D"?A```@`I208`+^/``````@`X`,@`+TG
+MZ/^])Q0`OZ\0`+"O)8"``'A&!(X`````!0"`$````CP``$(D"?A```````!X
+M1@"N["\$C@`````%`(`0```"/```0B0)^$```````.PO`*X4`+^/$`"PCP@`
+MX`,8`+TG"`#@`P$``B0```(\``"CE+!H0I0`````*Q!#``P`0!0E(``````"
+M/+!H0R0``*64`0"$)(`0!``A$$,```!"E``````K$$4`^?]`$`````````(\
+ML&A")(`8!``A$$,``@!"A``````(`.`#`````.#_O2<8`+^O%`"QKQ``L*\E
+MB*``)8"``````CP``$(D"?A``+0`!"0E&$``"@!@$.PO`ZZ```(D?$8"K@``
+M`CP``$(D"?A``(``!"0E&$``!`!@%'A&`ZX"``,D&@``$```(ZX"``(\W"M"
+M)*@L`JX"``(\@!=")*PL`JX"``(\!!M")+`L`JX"``(\*!E")+0L`JX"``(\
+M;!M")+@L`JX"``(\P"-")+PL`JX"``(\/"Q"),`L`JX"``(\1"Q"),0L`JX!
+M``(D&`"_CQ0`L8\0`+"/"`#@`R``O2<``````````,C_O2<P`+^O+`"WKR@`
+MMJ\D`+6O(`"TKQP`LZ\8`+*O%`"QKQ``L*\EH(``);"@`"6XP``E@.``)8@`
+M`````CS@:%(D```"/```520```(\``!3)$`0$0`A$%$`P!@"`"$8<@!`$`(`
+M(1!6`(`0`@`A$%(```!EC```1HP)^*`")2"``@$`$"8_``(R`P!`%``````)
+M^&`"`0`$)`$`,280`"(N[/]`%$`0$0`EB``````"/&!J4B0```(\``!5)```
+M`CP``%,DP!`1`"$84@`E$&````!EC`0`1HP)^*`")2"``@$`$"8_``(R`P!`
+M%``````)^&`"`0`$)`$`,29%`"(N\?]`%,`0$0`EB``````"/(AL4B0```(\
+M``!5)````CP``%,D0!`1`"$040"`&`(`(1AR`"$05P"`$`(`(1!2````98P`
+M`$:,"?B@`B4@@`(!`!`F/P`",@,`0!0`````"?A@`@$`!"0!`#$F0``B+NS_
+M0!0`````,`"_CRP`MX\H`+:/)`"UCR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@
+M`S@`O2?0_[TG*`"_KR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6@@``EF*``
+M):@`````998`````P!*B+$@`0!`E@```</>D)&9F!CQG9L8T&`"&`!`8``!#
+M&`,`PQ<$`",88@"`$`,`(1!#``D`@A10]Z0D0!`%`.#N4208`"8"$!```(,0
+M`@##'Q$`%```$".(0P!F9@8\9V;&-!@`A@`0&```0Q@#`,,7!``C&&(`@!`#
+M`"$00P"X`((4)1```$`0!0"@[E$D&``F`A`0``"#$`(`PQ\1`".(0P`!`!4D
+M@(@1`````CP``$(D_P`D,@GX0``(``4D)8A``````CP``$(D)2"``@GX0``$
+MH@4T)3A`````8Y:T"0(D"`!B%````CP``$(D)2"``@2B!30)^$``$`#F-(8`
+M`!``D1$`[_\&)```0B0E((`"!*(%-`GX0``D,.8`?@``$`"1$0```&26S,P"
+M/,W,0C09`((`$!```((0`@"`&`(`(1AB`",8@P#__V,P`@`")!L`8A0\%8(L
+M&0!`$```$#P``&.6`````/[_8R3__V,P@!`#`"$00P!`$`(`__\#/(!$8S0A
+M$$,`ZU$$/!^%A#08`$0`$"```,,@!`##%P(`(R""````$"8!`(0D"?@``@@`
+M!20EB$``4P``$"4@``#,S`,\S<QC-!D`@P`0&````AD#`(`0`P`A$$,`@!`"
+M`",0@@#__T(P$@!`%``4@BP0`$`40.V")&9F!#QG9H0T&`!$`!`@``##(`0`
+MPQ<"`",@@@```!`\```0)H`@!``)^``""``%)"6(0``V```0`P`$)```9);,
+MS`,\S<QC-!D`@P`0&```PA@#`(`0`P`A$$,`0!`"`",0@@#__T(P$`!`%$#M
+M@B1F9@0\9V:$-!@`1``0(```@R`$`,,7`@`C(((````0/```$"9`(`0`"?@`
+M`@@`!20EB$``&@``$`(`!"3,S`,\S<QC-!D`@P`0&```@A@#`(`0`P`A$$,`
+M(Q""`/__0C`E`$`4)1```$#MA"1F9@(\9V9"-!@`@@`0$```0Q`"`,,G!```
+M`!`\```0)B,@1``)^``""``%)"6(0``!``0D"?@``@(`!20E@$```)$1`(`0
+M$``ED$("0!`5`"600@(!$%(V```0/```$"8E((`"G)@%-`GX``+_`$8R`I(2
+M`"4@@`+8F`4T"?@``G\`1C(T$I.N`0`")"@`OX\D`+6/(`"TCQP`LX\8`+*/
+M%`"QCQ``L(\(`.`#,`"])^POA(P`````__^C)`<`8BP2`$`0@!@#`````CRX
+M=$(D(1AB````8HP`````"`!````````(`.`#)1"```@`X`,$`((D"`#@`P@`
+M@B0(`.`##`"")`@`X`.L`((D"`#@`R40``"H_[TG5`"_KU``OJ],`+>O2`"V
+MKT0`M:]``+2O/`"SKS@`LJ\T`+&O,`"PKU@`I*\E\*``)8#@`/__UC`EH(``
+M'`"@KR``H*\D`*"O*`"@K^PODXX`````$"R7)@(`PI<`````\`%#,-```B1:
+M`&(0):@``-$`8B@(`$`04`$")*```B1(`&(0P``")%(`8A`E$```)`(`$```
+M```*`&(040%B*`8`0!``"`(D0`$")`4`8A`E$```&P(`$``````9`F(4)1``
+M````PI<`````7_!").L$0BP(`$`0`````%03@I8`````'`"BKU83@Y8`````
+M)@``$"``HZ\``,*7`````'3K0B3P`$(L"`!`$`````!8$X*6`````!P`HJ]:
+M$X.6`````!D``!`@`*.O``#"EP````"$ZD(DX0!"+`@`0!``````7!."E@``
+M```<`**O7A.#E@`````,```0(`"CKP``PI<`````719"+`<`0!0`````8!."
+ME@`````<`**O8A.#E@`````@`*.OWA*%E@`````L$X*6`````!8``!`8`**O
+M;!.#E@`````D`*.O<!."E@`````H`**OX!*%E@`````N$X.6``````H``!`8
+M`*.O;A."E@`````D`**O*`"BK^(2A98`````,!.#E@`````8`*.O)2``````
+M`CR(;T8D@!`$`"$08@+`&`0`(1AF``0`8XP!`(0D^?^`$```0ZPE(```!`!F
+M)@```CR0;T<D@!`$`"$0P@!`&`0`(1AD`$`8`P`A&'8`@!@#`"$89P```&.,
+M`0"$)/7_@!```$.L)2```````CRH;T8D@!`$`"$04P!`&`0`(1AD`$`8`P`A
+M&'8`@!@#`"$89@```&.,`0"$)/7_@!`(`$.L)2````0`9B8```(\P&]')(`8
+M!``A&&8`0!`$`"$01`!`$`(`(1!6`(`0`@`A$$<```!"C``````(`&*L`0"$
+M)"@`@BSR_T`4#`!Q)A``H*\```(\``!2)"4@(`(!``8D"?A``BX!!R0```66
+M$`"@KR4@(`("``8D"?A``@X!!R0"``66$`"@KR4@(`("``8D"?A``@$!!R0"
+M`,*7`````$``0C`Q`$`0`P`0)!P`XHX``````@!%A!``L*\E("`"`0`&)`GX
+M0`*H``<D'`#BC@`````$`$6$$`"PKR4@(`(!``8D"?A``JD`!R0<`.*.````
+M``8`1800`+"O)2`@`@$`!B0)^$`"J@`')!P`XHX`````"`!%A!``L*\E("`"
+M`0`&)`GX0`*N``<D'`#BC@`````*`$6$$`"PKR4@(`(!``8D"?A``J\`!R0<
+M`.*.``````P`1800`+"O)2`@`@$`!B0)^$`"L``')`(`PI<`````@`!",!$`
+M0!`,`'$F$`"@KP``$#P``!`F)2`@`B0`I8\#``8D"?@``A\!!R00`*"O)2`@
+M`B@`I8\#``8D"?@``B(!!R0/```0`````!``H*\``!`\```0)B4@(`(<`*6/
+M`P`&)`GX``(7`0<D$`"@KR4@(`(@`*6/`P`&)`GX``(:`0<D6`"CCP````#4
+M`6*4`````/``0C#0_T(D0`!"+"P`0!``````U`%DE``````U`(,X`0!C+$4`
+M@C@!`$(L)1AB``8`8!0,`'(F1@`")`,`@A`V``(D'`""%``````"`!$D$`"Q
+MKP``$#P``!`F)2!``@(`!20"``8D"?@``EH`!R00`+&O)2!``@(`!20"``8D
+M"?@``EP`!R00`+&O)2!``@(`!20"``8D"?@``EX`!R00`+&O)2!``@(`!20!
+M``8D"?@``OX`!R18`*./`````-(!8I0`````0@!"+"4`0!0E(```#`!R)@$`
+M`B00`**O```0/```$"8E($`"`0`%)`$`!B0)^``"&0$')`,`$200`+&O)2!`
+M`@$`!20"``8D"?@``@$`!R00`+&O)2!``@$`!20"``8D"?@``@,`!R00`+&O
+M)2!``@$`!20!``8D"?@``HL`!R00`+&O)2!``@$`!20!``8D"?@``HP`!R0E
+M(```!`!E)@```CR`<T8D@!@$`"$890!`$`0`(1!$`$`0`@`A$%8`@!`"`"$0
+M1@```$*,`````*@`8JP!`(0D#0""+/+_0!0``````@#"EP````!``$(P"@!`
+M$*P`9"8<`.*.````````1800`*"O```"/```0B0"``8D"?A``"4`!R00`*"O
+M```"/```0B2L`&0F&`"ECP8`!B0)^$``#@`')```PH\`P`,\)!!#`!<`0!`E
+M@````@#"EP``````0$(P`@!`%`@`$B0/`!(DK`!Q)A``H*\``!`\```0)B4@
+M(`(/``4D!``&)`GX``(Z``<D$`"@KR4@(`(E*$`"!``&)`GX``)&``<D)8``
+M`````CR(;U8D```"/```4B0```(\``!1),`8$``A&'8`@!`0`"$08@)8`*2/
+M``!EC```1HP)^$`"`0"U)C\`HC(#`$`4``````GX(`(!``0D`0`0)O#_`!(`
+M``(\)8```)!O5R0$`'$F```"/```5B0```(\``!2)$`0$``A$%``P!`"`"$0
+M5P"`&!``(1@C`E@`I(\``$6,``!FC`GXP`(!`+4F/P"B,@,`0!0`````"?A`
+M`@$`!"0!`!`F[O\`$@```CPE@```J&]6)````CP``%(D```"/```421`$!``
+M(1!0`,`0`@`A$%8`@!@0`"$8<P!8`*2/``!%C`@`9HP)^$`"`0"U)C\`HC(#
+M`$`4``````GX(`(!``0D`0`0)N[_`!(```(\)8```,!O5R0$`'$F```"/```
+M5B0```(\``!2)$`0$``A$%``P!`"`"$05P"`&!``(1AQ`%@`I(\``$6,"`!F
+MC`GXP`(!`+4F/P"B,@,`0!0`````"?A``@$`!"0!`!`F*``"+N[_0!1`$!``
+M)8```````CR`<U8D!`!Q)@```CP``%,D```"/```4B1`$!``(1!0`,`0`@`A
+M$%8`@!@0`"$8<0!8`*2/``!%C*@`9HP)^&`"`0"U)C\`HC(#`$`4``````GX
+M0`(!``0D`0`0)@T``B[N_T`40!`0`,0O@*X!``(D5`"_CU``OH],`+>/2`"V
+MCT0`M8]``+2//`"SCS@`LH\T`+&/,`"PCP@`X`-8`+TGT/N])RP$OZ\H!+ZO
+M)`2WKR`$MJ\<!+6O&`2TKQ0$LZ\0!+*O#`2QKP@$L*\T!*6O.`2FKSP$IZ_D
+M`Z2OU`&"E`````#P`$(PT/]")$``0BP2`$`0`0`#)-0!A)0`````-0"#.`$`
+M8RQ%`((X`0!"+"488@`'`&`4`@`")$8``B0#`((0-@`")`0`@A0!``,D`@`"
+M)`(``!#H`Z*OZ`.CKQ@`I"?L`Z2O/`2CCP`````"`&*4`````/`!0S#0``(D
+M+@!B$`````#1`&(H"0!`$%`!`B2@``(D'@!B$`````#```(D)0!B$`````#F
+M`0`0)1`````````,`&(0`````%$!8B@&`$`0``@")$`!`B0&`&(0`````-L!
+M`!`E$````````!\`8A0`````Y`.DCP````#4'X0D\`.DK^0#HX\`````V!)B
+ME``````7```0`````.0#I(\`````X!^$)/`#I*_D`Z./`````-H28I0`````
+M#0``$`````#D`Z2/`````.P?A"3P`Z2OY`.CCP````#<$F*4``````,``!``
+M````N`$`$"40``#P`Z2/``````8`@Y0`````)!A#`+$!8!`E$```.`2CCP``
+M`````&*$`````$`4`@`#%`(`^`.BKS0$I(\```````""A`````!`%`(``Q0"
+M`/0#HJ^MW@(TT`.BI](#HJ<E\```\`.BCP`````&`$24`````"60``#0`Z,G
+M!Q!$`@$`0C`'`$`8`@#"+Y,!0!`E$```0!`>`"$08@```%*D`0#>)P$`4B8$
+M`$(N]/]`%`<01`(\!*./````````9)3P`Z*/``````0`1I3<`Z(G$`"BKP(`
+M`CS414(D\`.CCP```````&6,"?A``.`#IR?@`[2/W`.BCP`````K$%0`B0!`
+M%"7P```@`;8G```"/```5R0X`;4G4`.D)_P#I*]0`:(G``2BKX`0%``A$%0`
+M@!`"`"$05`"`$`(`\`.DCP`````(`(.,`````"&80P#2`Z.7K=X"-"8`8A0E
+M(,`"T`.REP````"`@!(`(8`2`H"`$``A$'`"!@!2E``````E@$``0(@2``@`
+M!28)^.`")3`@`B4@H`(0``4F"?C@`B4P(`("`&>&_`.BCP`````0`**O)2!`
+M`B4HP`("``,\F$9C)`GX8``E,*`"0P%`$,`A'@``!**/`````"$@1`!0`Z4G
+M"?C@`H``!B1(```0`0#>)]`#LI<`````@(`2`"&`$@*`@!``(1!P`@8`4I0`
+M````)8!``$"($@`(``4F"?C@`B4P(`(E(*`"$``%)@GXX`(E,"`"`@!GAOP#
+MHX\`````$`"CKR4@0`(E*,`"`@`#/)A&8R0)^&``)3"@`AX!0!#`(1X```2B
+MCP`````A($0`_`.ECPGXX`*```8DT@.REP````"`@!(`(8`2`H"`$``A$'`"
+M!@!2E``````E@$``0(@2`"4@P`((``4F"?C@`B4P(`(E(*`"$``%)@GXX`(E
+M,"`"`@!GAOP#HX\`````$`"CKR4@0`(E*,`"`@`#/)A&8R0)^&``)3"@`OH`
+M0!#`(1X`4`*B)R$@1`!0`Z4G"?C@`H``!B0!`-XG`0"4)MP#HH\`````*Q!4
+M`(+_0!"`$!0`X`.EC_`#HH\```````!$C$`0!0`A$$0```!6E`````#<`Z./
+M`````$`0`P`A$$0```!5E``````C\&4`T@.CEZW>`C0Z`&(4)9```%`!L2>`
+MH1X``@`"/&A%5R0@`+,G/`2CCP```````&240(`2`"$0,`(``$>$(1"2`D`0
+M`@`A$"("``!"A``````0`**O)2C``@GXX`(E,*`"(8!P`@```J8!`%(F0`!"
+M+NS_0!0"``(\"$A").0#HX\`````>$9EC`GX0``@`*0GPA\"`"$88@!#&`,`
+M-`2DCP```````(.DG@"BEP``````%`(``QP"`,(7`@`A&&(`0Q@#`.P#HH\`
+M``````!#I#@$I(\```````"#I-`#HI=`!*./````````8J29```0`@!BI%`!
+MM">`\1X`!`2^KP(``CQH15<D(`"^)U`"LR<\!**/````````1)1`B!(`(1"1
+M`@``1X0$!*./`````"&`<@!`@!``(1"0`@``0H0`````$`"BKR4HP`()^.`"
+M)3"@`B$8T0,``&*D/`2BCP```````$24(1!Q`@``1X0A@'`"```"A@`````0
+M`**O)2C``@GXX`(E,*`"(1BQ`Z``8J0!`%(F0`!"+MS_0!0"``(DZ`.CCP``
+M```K`&(4`@`"/$A)0B0@`*0GH`"E)^0#HX\`````>$9FC`GX0`#8`Z<GPA\"
+M`"$88@!#&`,`-`2DCP```````(.DV`.BEP``````%`(``QP"`,(7`@`A&&(`
+M0Q@#`.P#HH\```````!#I)X`HI<``````!0"``,<`@#"%P(`(1AB`$,8`P`X
+M!*2/````````@Z30`Z*70`2CCP```````&*DT@.BEP`````_```0`@!BI!X!
+MHX?T`Z2/`````"H09``;`$`4`@`"//@#I(\`````*A!D`!8`0!0"``(\"$A"
+M).0#HX\`````>$9EC`GX0`"@`*0GT@.CET`$I(\```````"#I`(`@Z3"'P(`
+M(1AB`$,8`P`T!**/````````0Z0>`:*7`````!4``!``%`(`"$A").0#HX\`
+M````>$9EC`GX0``@`*0GT`.CET`$I(\```````"#I`(`@Z3"'P(`(1AB`$,8
+M`P`T!**/````````0Z2>`**7```````4`@`#'`(`PA<"`"$88@!#&`,`[`.D
+MCP```````(.D.`2BCP```````$.D.`2DCP```````(.4/P`")",00P#D`Z./
+M`````/0O8J0!``(D+`2_CR@$OH\D!+>/(`2VCQP$M8\8!+2/%`2SCQ`$LH\,
+M!+&/"`2PCP@`X`,P!+TG__^(,/__I3#__\8P`#P'`!``HX<`````$@#%$`,D
+M!P`C$`4!&`!#`!(0```C&,@``````!@`9``2&```(1!#`",8Q0`:`$,`$A``
+M``(`8!0`````#0`'```4`@`(`.`#`Q0"``@`X`,E$(``$`"IC___QC#__X0P
+M0!`&`"%`H@```**4`````"L0@@`$`$`0````````(*T(`.`#``#@K/[_`I4`
+M````*Q""``X`0!0E&*``___")```(JT(`.`#``#BK$,0`@```"*M"`#@`P``
+MXJQ#$`(```#BK`$`0B0(`.`#```BK2L0:``.`$`0````````8I0`````\?]$
+M$",090`"`&*4`````"L0@@#P_T`4(Q!E``(`8R0K$&@`]/]`%``````(`.`#
+M`````,#_O2<\`+^O.`"^KS0`MZ\P`+:O+`"UKR@`M*\D`+.O(`"RKQP`L:\8
+M`+"O):"@`"6PP`!0`+6/__^$,``\!P`#E`<`)9@```$`$20"`(,L.P!@%"40
+M```E@```__^7)`(``CQH15XD0!`1`"$05````$*4`````"L04``)`$`00"`3
+M`"H0-P('`$`0(1"4``$`8B;__U,P`0`B)O__43!`(!,`(1"4````191`&!$`
+M(1!T````1I0A()8```"'A"$8=@```&*$`````!``HJ\)^,`#)2```D`8$``A
+M&'4```!BI``4`@`#%`(`*A!2``X`0!0!``(F0``"+@L`0!`!``(F)1```@$`
+M`R;__W`P0!`"`"$050```%*D0``"+OG_0!0E$``"`0`")O__4#!```(NS?]`
+M%$`0$0`!``(D/`"_CS@`OH\T`+>/,`"VCRP`M8\H`+2/)`"SCR``LH\<`+&/
+M&`"PCP@`X`-``+TG?@"&E'X`@H0``(.$`````",00P!_`$(H!`!`%(+_PB0`
+M%`(``P``$`-,`@```(F$`````'X`AX0`````___B)"5`0``J$$<`#@!`$#\`
+M!B3__\(D`!0"``,T`@!`$`8`(1!$````0X0`````*A@#`2<0!@#"%P(`)!AB
+M`/3_8!0`````)1C``#\`""3__V(D)3!```0``!#__T(P`QP"`/__9B3__\(P
+M/P!"+`<`0!!`$`,`(1!$````0H0`````*A!'`/7_0!``%`8`#P!@%$`0"``8
+M```%)1`@`4`0"``A$$4``@!#E````````$.D__\")0`4`@`#1`(`]_\!!240
+M(`$,```0`````"$010```$.D_O_B)``4`@`#/`(`__\")0`4`@`#1`(`U_\!
+M!0`````E$"`!"`#@`P````!^`(B4?@""A```HX0`````(Q!#`'\`0B@%`$`4
+M0``+)(+_`B4`%`(``P``$`-D`@```*R$`````'X`B80`````__\B)2500``J
+M$$D`#@!`$#\`""3__P(E`!0"``-$`@!`$`@`(1!$````0X0`````*AA#`2<0
+M"`#"%P(`)!AB`/7_8!3__P(E?@"BE````````.*D/P`*)```XH0`````*A!)
+M``8`0!#__P(Q`0!"+"L8"P`D$$,`!P!`$``````E6```)2"@``,``!`_``@D
+M`!0"``-$`@`)```9__\",4`0"``A$$0```!"A``````J$$D`]O]`$/__`B7_
+M_P(Q`0!"+`$`8RTD$$,`#P!`$$`0"@`8`$`%)1"``4`0"@`A$$8``@!#E```
+M`````$.D__]")0`4`@`#5`(`]_]!!240@`$,```0`````"$01@`E&&@!``!#
+MI/[_(B4`%`(``TP"`/__0B4`%`(``U0"`,G_004E$(`!"`#@`P````#H_[TG
+M%`"_KQ``L*\E@(``>$8$C@`````%`(`0```"/```0B0)^$```````'A&`*[L
+M+P2.``````4`@!````(\``!")`GX0```````["\`KA0`OX\0`+"/"`#@`Q@`
+MO2<$`*2$`````"4P```!``<D!`"H)(`0!P`A$$<`@!`"`"$8`@$``&*4````
+M`"H01``$`$`0`````"4PX````&2$``````$`YR0$`.(H\O]`%(`0!P"`&`8`
+M(1AF`(`8`P`(`*(D(2!B``@`B(0`````(1!#````280``````0`')(`0!@`A
+M$$8`0!@"``@`I20A$&<`0#`"`"$0Q0`(`$2$`````"H0B``$`$`0(1"F`"5`
+M@````$F$``````$`YR0$`.(H\O]`%$`0"0`C$`(!`!0"``@`X`,#%`(`T/^]
+M)RP`OZ\H`+:O)`"UKR``M*\<`+.O&`"RKQ0`L:\0`+"O):B``"6@H``EL.``
+M``#`I`(`@I8`````0`%",$`!`R0'`$,4)2B@`MP?J(X`````V!^GE@`````<
+M```0)1````(`@I8`````T`!",,``0S@!`&,LT`!".`$`0BPE&&(`!P!@$"40
+M``#T'ZB,`````/`?IY0`````#```$``````"`(.6`````*``8S"@``0DJ`!D
+M%`$``B3H'ZB,`````.0?IY0`````)1````````"@`.`8````````@Y8```*5
+M`````"L08@`:`$`4)2"@`H`0!P`A$$<`@!`"`"$01P"`$`(`(1`"`:S_0I0`
+M````*Q!#`!8`0!`E2```@"@'`"$HIP"`*`4`(2BG`(`H!0`A*`4!KO^BE```
+M`````,*D`@`"/"A+0B0E(*`">P``$*S_I20"``*5````````PJ0"``(\*$M"
+M)'0``!`E*``!%P#@$"4@`````(.6```"E0`````K$$,`$@!`$(`0!``E2(``
+M`0"$)"H0AP`-`$`0@!`$`"$01`"`$`(`(1!$`(`0`@`A$$@```"#E@``0I0`
+M````*Q!#`/'_0!0`````@!`$`"$01`"`$`(`(1!$`(`0`@`A*$@```"RE(`0
+M"0`A$$D`@!`"`"$020"`$`(`(9A(````9Y8`````(Y!'`CH`0!H``````@"C
+MA`(`9(8`````(QAD````@I8`````(Q!'`!@`8@`2&``````````````8`)(`
+M$B```"$89```````&@!R`!(8```"`$`6``````T`!P``'@,``QX#````PZ0"
+M`!$\*$LQ)@GX(`(E(*`")8!``"4@H`()^"`")2A@`B.``@(E(*`""?@@`B4H
+M8`(``(.6``!DE@`````C&&0`&``#`A*``````````````!@`4@`2$```(8`"
+M`@`````:`!("$H````(`0!8`````#0`'``"&$``#AA````#0IA<``!`!``(D
+M@!`$`"$01`"`$`(`(1!$`(`0`@`A*$@```"#E@``HI0`````"P!B%"4@H`("
+M`**4````````PJ0"``(\*$M")`GX0`````````#"I@(``!`!``(D)1```"P`
+MOX\H`+:/)`"UCR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`S``O2?(_[TG-`"_
+MKS``MJ\L`+6O*`"TKR0`LZ\@`+*O'`"QKQ@`L*\EL(``):B@`"60P``!`!,D
+M&`!`$B6(```"``(\!$Q4),`0$0`A@*(")2#``B4H``(0`*8G"?B``A(`IR<(
+M`$`0`````!``HI,`````!@`"HA(`HI,``````@``$`<``J(EF````0`Q)BL0
+M,@+M_T`4P!`1`"408`(T`+^/,`"VCRP`M8\H`+2/)`"SCR``LH\<`+&/&`"P
+MCP@`X`,X`+TGX/^])Q@`OZ\4`+&O$`"PKR6(H``E@(`````"/```0B0)^$``
+MX``$)"480``*`&`0["\#KH```B1\1@*N```"/```0B0)^$``@``$)"480``$
+M`&`4>$8#K@(``R0<```0```CKD```B1\1@*N`@`"/,A*0B2H+`*N`@`"/)`M
+M0B2L+`*N`@`"//0R0B2P+`*N`@`"/#@O0B2T+`*N`@`"/%@S0B2X+`*N`@`"
+M/+`\0B2\+`*N`@`"/(1/0B3`+`*N```"/```0B3$+`*N`0`")!@`OX\4`+&/
+M$`"PCP@`X`,@`+TG`````,C_O2<P`+^O+`"WKR@`MJ\D`+6O(`"TKQP`LZ\8
+M`+*O%`"QKQ``L*\EH(``);"@`"6XP``E@.``)8@``````CS@=%(D```"/```
+M520```(\``!3)$`0$0`A$%$`P!@"`"$8<@!`$`(`(1!6`(`0`@`A$%(```!E
+MC```1HP)^*`")2"``@$`$"8_``(R`P!`%``````)^&`"`0`$)`$`,280`"(N
+M[/]`%$`0$0`EB``````"/&!V4B0```(\``!5)````CP``%,DP!`1`"$84@`E
+M$&````!EC`0`1HP)^*`")2"``@$`$"8_``(R`P!`%``````)^&`"`0`$)`$`
+M,2:+`"(N\?]`%,`0$0`EB``````"/+AZ4B0```(\``!5)````CP``%,D0!`1
+M`"$040"`&`(`(1AR`"$05P"`$`(`(1!2````98P``$:,"?B@`B4@@`(!`!`F
+M/P`",@,`0!0`````"?A@`@$`!"0!`#$F0``B+NS_0!0`````,`"_CRP`MX\H
+M`+:/)`"UCR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`S@`O2?0_[TG*`"_KR0`
+MM:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6@@``EF*``):@`````998`````P!*B
+M+$@`0!`E@```</>D)&9F!CQG9L8T&`"&`!`8``!#&`,`PQ<$`",88@"`$`,`
+M(1!#``D`@A10]Z0D0!`%`.#N4208`"8"$!```(,0`@##'Q$`%```$".(0P!F
+M9@8\9V;&-!@`A@`0&```0Q@#`,,7!``C&&(`@!`#`"$00P"X`((4)1```$`0
+M!0"@[E$D&``F`A`0``"#$`(`PQ\1`".(0P`!`!4D@(@1`````CP``$(D_P`D
+M,@GX0``(``4D)8A``````CP``$(D)2"``@GX0``$H@4T)3A`````8Y:T"0(D
+M"`!B%````CP``$(D)2"``@2B!30)^$``$`#F-(8``!``D1$`[_\&)```0B0E
+M((`"!*(%-`GX0``D,.8`?@``$`"1$0```&26S,P"/,W,0C09`((`$!```((0
+M`@"`&`(`(1AB`",8@P#__V,P`@`")!L`8A0\%8(L&0!`$```$#P``&.6````
+M`/[_8R3__V,P@!`#`"$00P!`$`(`__\#/(!$8S0A$$,`ZU$$/!^%A#08`$0`
+M$"```,,@!`##%P(`(R""````$"8!`(0D"?@``@@`!20EB$``4P``$"4@``#,
+MS`,\S<QC-!D`@P`0&````AD#`(`0`P`A$$,`@!`"`",0@@#__T(P$@!`%``4
+M@BP0`$`40.V")&9F!#QG9H0T&`!$`!`@``##(`0`PQ<"`",@@@```!`\```0
+M)H`@!``)^``""``%)"6(0``V```0`P`$)```9);,S`,\S<QC-!D`@P`0&```
+MPA@#`(`0`P`A$$,`0!`"`",0@@#__T(P$`!`%$#M@B1F9@0\9V:$-!@`1``0
+M(```@R`$`,,7`@`C(((````0/```$"9`(`0`"?@``@@`!20EB$``&@``$`(`
+M!"3,S`,\S<QC-!D`@P`0&```@A@#`(`0`P`A$$,`(Q""`/__0C`E`$`4)1``
+M`$#MA"1F9@(\9V9"-!@`@@`0$```0Q`"`,,G!````!`\```0)B,@1``)^``"
+M"``%)"6(0``!``0D"?@``@(`!20E@$```)$1`(`0$``ED$("0!`5`"600@(!
+M$%(V```0/```$"8E((`"G)@%-`GX``+_`$8R`I(2`"4@@`+8F`4T"?@``G\`
+M1C(T$I.N`0`")"@`OX\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#,`"]
+M)\#_O2<\`+^O.`"^KS0`MZ\P`+:O+`"UKR@`M*\D`+.O(`"RKQP`L:\8`+"O
+M):B``/__U#`E\*`"["_2CP`````"`**4`````/`!0S#```(D$P!B$"68``#!
+M`&(H!@!`$-```B2@``(D!P!B$"40``#N```0``````D`8A`E$```Z@``$```
+M``!D$\67`````&83UI<`````!@``$"4@``!H$\67`````&H3UI<`````)2``
+M`````CRX?48D@!`$`"$00@+`&`0`(1AF``0`8XP!`(0D^?^`$```0ZPE(```
+M!`!&)@```CS`?4<D@!`$`"$0P@!`&`0`(1AD`$`8`P`A&'0`@!@#`"$89P``
+M`&.,`0"$)/7_@!```$.L)2```````CS8?48D@!`$`"$04@!`&`0`(1AD`$`8
+M`P`A&'0`@!@#`"$89@```&.,`0"$)/7_@!`(`$.L)2````0`1B8```(\\'U'
+M)(`8!``A&&8`0!`$`"$01`!`$`(`(1!4`(`0`@`A$$<```!"C``````(`&*L
+M`0"$)!L`@BSR_T`4#`!1)A``H*\``!`\```0)B4@(`(#``8D"?@``J@`!R00
+M`*"O)2`@`B4HP`(#``8D"?@``J4`!R0E(````0`"/'B`122`&`0`(1AR`$`0
+M!``A$$0`0!`"`"$05`"`$`(`(1!%````0HP`````>`!BK`$`A"0#`((L\_]`
+M%(`8!``E@``````"/+A]5B0```(\``!4)````CP``%$DP!@0`"$8=@"`$!``
+M(1!"`@``98P``$:,"?B``B4@H`(!`',F/P!B,@,`0!0`````"?@@`@$`!"0!
+M`!`F\/\`$@```CPE@```P'U7)`0`428```(\``!6)````CP``%0D0!`0`"$0
+M4`#`$`(`(1!7`(`8$``A&","``!%C```9HP)^,`")2"@`@$`<R8_`&(R`P!`
+M%``````)^(`"`0`$)`$`$";N_P`2```"/"6```#8?58D```"/```5"0```(\
+M``!1)$`0$``A$%``P!`"`"$05@"`&!``(1AR````18P(`&:,"?B``B4@H`(!
+M`',F/P!B,@,`0!0`````"?@@`@$`!"0!`!`F[O\`$@```CPE@```\'U7)`0`
+M428```(\``!6)````CP``%0D0!`0`"$04`#`$`(`(1!7`(`8$``A&'$```!%
+MC`@`9HP)^,`")2"@`@$`<R8_`&(R`P!`%``````)^(`"`0`$)`$`$"8;``(N
+M[O]`%$`0$``E@````0`"/'B`5B0```(\``!4)````CP``%$D0!`0`"$04`#`
+M$`(`(1!6`(`8$``A&'(```!%C'@`9HP)^(`")2"@`@$`<R8_`&(R`P!`%```
+M```)^"`"`0`$)`$`$"8#``(N[O]`%$`0$`#$+\"O`0`")#P`OX\X`+Z/-`"W
+MCS``MH\L`+6/*`"TCR0`LX\@`+*/'`"QCQ@`L(\(`.`#0`"])^POA(P`````
+M__^C)`<`8BP2`$`0@!@#``$``CS`@$(D(1AB````8HP`````"`!````````(
+M`.`#)1"```@`X`,$`((D"`#@`P@`@B0(`.`##`"")`@`X`-X`((D"`#@`R40
+M```0`*F/`"0$`/__QC`#)`0`0!`&`"%`H@```**4`````"H0@@`$`$`0````
+M````(*T(`.`#``#@K/[_`I4`````*A""``X`0!0E&*``___")```(JT(`.`#
+M``#BK$,0`@```"*M"`#@`P``XJQ#$`(```#BK`$`0B0(`.`#```BK2L0:``.
+M`$`0````````8I0`````\?]$$",090`"`&*4`````"H0@@#P_T`4(Q!E``(`
+M8R0K$&@`]/]`%``````(`.`#`````+C_O2=$`+^O0`"^KSP`MZ\X`+:O-`"U
+MKS``M*\L`+.O*`"RKR0`L:\@`+"O2`"DKR60X`!8`+2/8`"^CP`L!0`#+`4`
+M`#0&``,T!@!<`+.7`````$`4!0`#A`(`)8@```(`8RY=`&`4)1```",0Q0#_
+M_T(P*Q!1`%@`0!0!``(D`@`"/%1;5R3__W8F(Q#%`/__53`<`*(G$`"BKR4@
+M``(E*$`")3!@`@GXX`(8`*<G'`"BCP`````"`$`4`0`")!P`HJ\8`**/````
+M``8`5A1`(`(`_O]B)A@`HJ\8`**/`````$`@`@`A&)(`'`"BCP````!`$`(`
+M(1!2````8X0``$*$``````0`8A0A$)0```!#E"$``!``````&`"FCP````!`
+M,`8`(1#2````1X0`````(R@'`AP`HX\`````0!@#`"$0=````$*4`````!@`
+MH@`2*```(1AR````9(0`````(QB0`"$PU````,*4`````!@`8@`2&```(2BC
+M`",@AP`:`*0`$B@```(`@!0`````#0`'`/__HS!(`*2/`````(`1!``A$%$`
+M0!`"`"$07@```$.D`0`B)O__43`"``(F`!0"``.$`@`K$+$"L?]`$!P`HB<!
+M``(D1`"_CT``OH\\`+>/.`"VCS0`M8\P`+2/+`"SCR@`LH\D`+&/(`"PCP@`
+MX`-(`+TG__^(,/__I3#__\8P`#P'`!``HX<`````$@#%$`,D!P`C$`4!&`!#
+M`!(0```C&,@``````!@`9``2&```(1!#`",8Q0`:`$,`$A````(`8!0`````
+M#0`'```4`@`(`.`#`Q0"``@`X`,E$(``B/^])W0`OZ]P`+ZO;`"WKV@`MJ]D
+M`+6O8`"TKUP`LZ]8`+*O5`"QKU``L*\EN,``__^E,#@`I:___^<P/`"GKZ0L
+ME(P`````0`"@KP`D!0`4`.:6,`"B)Q``HJ\"``(\5%M")`,D!``E*.`""?A`
+M`#0`IR<EF```(`"B)T@`HJ\,`/XF*`"C)T0`HZ\#``(D(T!3`$`0"``A$$@`
+MP#@"`#0`HX\`````0!`#`"$00P``&0(`(1!#`$`0`@`A,.(`&`#%)"$0Y0((
+M`%64`````,@`H!(`````0`"MCP````!`(`T`D`"BCP`````A&((`(1#E`@8`
+M0I0```````!BI$@`HX\`````(2AD`"$0W@`@`$24````````I*0P`*./````
+M`$`0`P`A$$,``!D"`"$00P!`$`(`(1#B`"$07@``)`0``R0$`"``0Y0@`$*$
+M`````"H01``"`$`0````````HZ1``*2/`````$`H!`!(`*>/`````"$@Y0``
+M`(*4```````4`@`#'`(`PA<"`"$88@!#&`,```"#I$0`K8\`````(3"E`4`@
+M"``A((@`@"`$`#0`HX\`````0!`#`"$00P``&0(`(1!#`"$0@@`A$%4`0!`"
+M`"$07@`>`$64````````Q:0P`*./`````$`0`P`A$$,``!D"`"$00P`A(((`
+M(2"5`$`@!``A()X``"P%``,L!0`>`(.4'@""A``````J$$4``@!`$```````
+M`,.D0`"BCP````!`B`(`1`"CCP`````AD'$```!"E@``````%`(``S0"`,(7
+M`@`A,,(`0S`&````1J9(`*2/`````"&(D0```"6&-`"BCP````!`.`(`(3CB
+M```1!P`A..(`0#@'`$"`"``A@`@"P(`0`"$X\``A./<`(@#B)!``HJ\4`+6O
+M&`"TKT``I(\"``T\'%RM)0GXH`$L`.<D```EA@``1H8P`**/`````$`X`@`A
+M..(``!$'`"$XX@!`.`<`(3CP`"$X]P`B`.(D$`"BKQ0`M:\``H(F&`"BKT``
+MI(\"``,\'%QC)`GX8``L`.<D``!#E@``(I8`````(QAB`/__8S`J`&`0)8@`
+M`$``I(\`````@+$$`$`8!``H`*(G(:A#`"``HB<AD$,`-`"BCP````!`$`(`
+M(1#B`@``190P`**/`````$`0`@`A$.("``!&E"&`T0)`@!``(1"0`@``1X0A
+M$!0"``)"A``````0`**O.`"DCP(`#3PH7JTE"?B@`2&`%`(`!`*F`0`Q)@``
+MHI8``$.6`````",00P#__T(P*Q`B`N#_0!0`````0`"BCP`````!`$(D0`"B
+MKP$`<R8$`&(N)/]`%`,``B0@`*.7B`"BCP```````$.D)9@``$``HX\`````
+ML@!@$"6(```H`*PG(`"K)T``I(\`````__^")`L`8A9`&!,`0!`3`(P`I8\`
+M````(1A%`"$0@@$``$*4``````0`0B0.```0``!BI(P`IX\`````(2!G`"$0
+M@P$``$*$(1AK``(`8X0`````(1!#`,(?`@`A$$,`0Q`"````@J0-`&`2)2``
+M`$`8$P",`*V/`````"$0HP'^_T24(1AC`0``8H0`````(R""`#P`HH\`````
+M(R""`,`9$P`A$'0`)1A```($0I0`!&.4`````",00P#__T8P`@#`%"40P``!
+M``(D%P"!!"4P0`#`$1,```1")"$H@@(8`(8`$A``````HY0`````(1AB```<
+M`P`#'`,`0!`1`)0`IX\`````(1!'``,`8`0!`#$F`@``$```0Z0``$"D`0"$
+M).__@`08`(8`0!@3`"$0@P$``$B$(1!C`0``0H0`````(T`"`8P`K8\`````
+M(1AM````990\`*./`````"$HHP`C**(`)4@``2L0J0`#`$`0`!0)`"5(H```
+M%`D`)1A```,4`@`J$((`$@!`$(`1$P"`.1,``S0#`$`8$0"4`*V/`````"$8
+M;0`A$.0`0!`"`"$05```!$*4````````8J0!`(0D*A"&`//_0!0!`#$F@!$3
+M`"$02`!`&`(`(1AT`"408`#^`V.4_`-"E``````C&&(`__]F,`(`P!0E$,``
+M`0`")"4P0``K$"4!(@!`$``4!0`#%`(`*A""`!X`0!"`$1,`(1!(`$`0`@#^
+M`T(D(4""`G\`"B0`%`4``SP"`",8B0`8`&8`$A@``````I4`````(1!#```4
+M`@`#'`(`0!`1`)0`K8\`````(2A-`(``8B@#`$`0`0`Q)@(``!```*.D``"J
+MI`$`A"0J$(<`[/]`%",8B0`!`',F0`"CCP`````K$&,"4O]`%``````$`&(N
+M#0!`$(``(BY`$!,`C`"DCP`````A$$0`_O]#E````````$.D`0!S)@0`8B[W
+M_T`40!`3`(``(BX+`$`00!`1`)0`I8\`````(1!%`/[_0Y0```````!#I`$`
+M,2:``"(N]_]`%$`0$0!T`+^/<`"^CVP`MX]H`+:/9`"UCV``M(]<`+./6`"R
+MCU0`L8]0`+"/"`#@`W@`O2>P_[TG3`"_KT@`MJ]$`+6O0`"TKSP`LZ\X`+*O
+M-`"QKS``L*\ED(``)9C@`"6@0`)X1E6.``````(`8I8`````T`!",,``0S@!
+M`&,LT`!".`$`0BPE&&(`"`!@%/PG428"`&.6`````*``8S"@``0DZ".1)F4`
+M9!0E$``````0/```$"8E($`""?@``FRB!30/`%8P``!EEB@`HB<0`**O(`"B
+M)Q0`HJ]@`**/`````!@`HJ\<`+6O`@`"/)1>0B0E($`")3`@`@GX0``E.,`"
+M)2!``@GX``)8H@4T__\#//\_8S0D$$,`'``FE@````#__\8D@#,&``#`QC``
+M``,\``!C)"4@0`)8H@4T"?A@`"4P1@`H`*.7*`"BAP`````#`$`0(Q`#``(`
+M`!#T+X*F]"^`IH"B$30E@``````"/```4R3`&!``(1AU````9Y`"`&*0````
+M```2`@`E..(`!`!BD```````%`(`)3CB``8`9I```````#8&`"4@0`(E*"`"
+M"?A@`B4PY@`!`!`F(``"+NO_0!0$`#$F(`"FEP``````,08`\`/&,"4PQ@(B
+M`**7`````(`2`@``_$(P)3#"`"0`HI<``````!0"`#\``SPD$$,`)3#"`"8`
+MHY<`````@!T#`,`/`CPD&&(````"/```0B0E($`";*(%-`GX0``E,,,``0`"
+M)$P`OX](`+:/1`"UCT``M(\\`+./.`"RCS0`L8\P`+"/"`#@`U``O2?H_[TG
+M%`"_KQ``L*\E@(``>$8$C@`````%`(`0```"/```0B0)^$```````'A&`*[L
+M+P2.``````4`@!````(\``!")`GX0```````["\`KJ0L!(X`````!0"`$```
+M`CP``$(D"?A```````"D+`"N%`"_CQ``L(\(`.`#&`"])R4@```#``<D"`"F
+M)`P`I20C&.0`0!`#`"$00P#`&`(`(1##````0I0`````!@!`$`$`A"0A$&4`
+M"`!"A``````(`.`#__^$)`0`@BSQ_T`4(QCD`"40````%`(`"`#@`P,4`@`E
+M,```"`"G)`P`I21`$`8`(2!&`,`0!``A$.(```!#E``````)`&`0`0#&)(`0
+M!``A$$,`0!`"`"$010`&`$*$``````@`X`/__\8D!`#"+.[_0!0E$````!0"
+M``@`X`,#%`(`R/^])S0`OZ\P`+ZO+`"WKR@`MJ\D`+6O(`"TKQP`LZ\8`+*O
+M%`"QKQ``L*\EJ(``);"@`"6XP``E\.``)3"@`@``X*8"`,*6`````-``0C#`
+M`$,X`0!C+-``0C@!`$(L)1AB``@`8!3\)Z4F`@##E@````"@`&,PH``$).@C
+MQ22R`&04)1```!0`II0`````&`"Q)*T`P!`E$`````#$E@``(I8`````*Q""
+M`!0`0!0"``(\0!`&`"$01@``&0(`(1!#`$`0`@`A$"("FO]"E``````K$$0`
+M$P!`$"4H``!`@`8`(8`&`B408``A@`("0(`0`"&`,`*$```0FO\0)C1I0B0E
+M(*`""?A``"4H(`(``.*F`@`"/-!H0B0E(*`"A```$"4H(`(7`,`0)2``````
+MPY8``"*6`````"L00P`2`$`00!`$`"4H@``!`(0D*A"&``T`0!!`$`0`(1!$
+M```9`@`A$$,`0!`"`"$040```,.6``!"E``````K$$,`\?]`%`````!`$`0`
+M(1!$```9`@`A$$,`0!`"`"&@40```)*60!`%`"$010``&0(`(1!#`$`0`@`A
+MF%$```!BE@`````CD$("10!`&@`````"`!$\-&DQ)B4@H`()^"`")2B``B6`
+M0``E(*`""?@@`B4H8`(C@`(")2"@`@GX(`(E*&`"``##E@``9)8`````(QAD
+M`!@``P(2@``````````````8`%(`$A```"&``@(`````&@`2`A*````"`$`6
+M``````T`!P``AA```X80````\*8"`!$\T&@Q)B4@H`()^"`")2B``B6`0``E
+M(*`""?@@`B4H8`(C@`(")2"@`@GX(`(E*&`"``##E@``9)8`````(QAD`!@`
+M`P(2@``````````````8`%(`$A```"&``@(`````&@`2`A*````"`$`6````
+M``T`!P``AA```X80````T*<<```0`0`")$`0!``A$$0``!D"`"$00P!`$`(`
+M(8!1````PY8```*6`````!``8A0``````@`"/#1I0B0E(*`""?A``"4H``(`
+M`.*F`@`"/-!H0B0E(*`")2@``@GX0`````````#"IP(``!`!``(D)1```#0`
+MOX\P`+Z/+`"WCR@`MH\D`+6/(`"TCQP`LX\8`+*/%`"QCQ``L(\(`.`#.`"]
+M)\C_O2<T`+^O,`"VKRP`M:\H`+2O)`"SKR``LJ\<`+&O&`"PKR6P@``EJ*``
+M)9#```$`$R08`$`2)8@```(``CR8:50DP!`1`"&`H@(E(,`")2@``A``IB<)
+M^(`"$@"G)P@`0!``````$`"BDP`````&``*B$@"BDP`````"```0!P`"HB68
+M```!`#$F*Q`R`NW_0!3`$!$`)1!@`C0`OX\P`+:/+`"UCR@`M(\D`+./(`"R
+MCQP`L8\8`+"/"`#@`S@`O2?@_[TG&`"_KQ0`L:\0`+"O)8B@`"6`@`````(\
+M``!")`GX0`"$``0D)1A``!$`8!#L+P.N``$")'Q&`JX```(\``!")`GX0```
+M`00D)1A```@`8!!X1@.N```"/```0B0)^$````8$)"480``$`&`4I"P#K@(`
+M`R0:```0```CK@(``CQ0:$(DJ"P"K@(``CPP44(DK"P"K@(``CSP6D(DL"P"
+MK@(``CS84D(DM"P"K@(``CR45D(DN"P"K@(``CP<9D(DO"P"K@(``CP4;4(D
+MP"P"K@```CP``$(DQ"P"K@$``B08`+^/%`"QCQ``L(\(`.`#(`"])\C_O2<P
+M`+^O+`"WKR@`MJ\D`+6O(`"TKQP`LZ\8`+*O%`"QKQ``L*\EH(``);"@`"6X
+MP``E@.``)8@```$``CS@@%(D```"/```520```(\``!3)$`0$0`A$%$`P!@"
+M`"$8<@!`$`(`(1!6`(`0`@`A$%(```!EC```1HP)^*`")2"``@$`$"8_``(R
+M`P!`%``````)^&`"`0`$)`$`,28>`"(N[/]`%$`0$0`EB````0`"/+"#4B0`
+M``(\``!5)````CP``%,DP!`1`"$84@`E$&````!EC`0`1HP)^*`")2"``@$`
+M$"8_``(R`P!`%``````)^&`"`0`$)`$`,2:``"(N\?]`%,`0$0`EB````0`"
+M/+"'4B0```(\``!5)````CP``%,D0!`1`"$040"`&`(`(1AR`"$05P"`$`(`
+M(1!2````98P``$:,"?B@`B4@@`(!`!`F/P`",@,`0!0`````"?A@`@$`!"0!
+M`#$F0``B+NS_0!0`````,`"_CRP`MX\H`+:/)`"UCR``M(\<`+./&`"RCQ0`
+ML8\0`+"/"`#@`S@`O2?0_[TG*`"_KR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"P
+MKR6@@``EF*``):@`````998`````P!*B+$@`0!`E@```</>D)&9F!CQG9L8T
+M&`"&`!`8``!#&`,`PQ<$`",88@"`$`,`(1!#``D`@A10]Z0D0!`%`.#N4208
+M`"8"$!```(,0`@##'Q$`%```$".(0P!F9@8\9V;&-!@`A@`0&```0Q@#`,,7
+M!``C&&(`@!`#`"$00P"P`((4)1```$`0!0"@[E$D&``F`A`0``"#$`(`PQ\1
+M`".(0P`!`!4D@(@1`````CP``$(D_P`D,@GX0``(``4D)8A``````CP``$(D
+M)2"``@GX0``$H@4T)3A`````8Y:T"0(D"`!B%````CP``$(D)2"``@2B!30)
+M^$``$`#F-'X``!``D1$`[_\&)```0B0E((`"!*(%-`GX0``D,.8`=@``$`"1
+M$0```&26S,P"/,W,0C09`((`$!```((0`@"`&`(`(1AB`",8@P#__V,P`@`"
+M)!L`8A0\%8(L&0!`$```$#P``&.6`````/[_8R3__V,P@!`#`"$00P!`$`(`
+M__\#/(!$8S0A$$,`ZU$$/!^%A#08`$0`$"```,,@!`##%P(`(R""````$"8!
+M`(0D"?@``@@`!20EB$``2P``$"4@``#,S`,\S<QC-!D`@P`0&````AD#`(`0
+M`P`A$$,`@!`"`",0@@#__T(P#@!`%``4@BP,`$`40.V")&9F!#QG9H0T&`!$
+M`!`@``##(`0`PQ<"`",@@@```!`\```0)BX``!"`(`0```!DELS,`SS-S&,T
+M&0"#`!`8``#"&`,`@!`#`"$00P!`$`(`(Q""`/__0C`,`$`40.V")&9F!#QG
+M9H0T&`!$`!`@``"#(`0`PQ<"`",@@@```!`\```0)A8``!!`(`0`S,P#/,W,
+M8S09`(,`$!@``((8`P"`$`,`(1!#`",0@@#__T(P)0!`%"40``!`[80D9F8"
+M/&=F0C08`((`$!```$,0`@##)P0````0/```$"8C($0`"?@``@@`!20EB$``
+M`0`$)`GX``("``4D)8!```"1$0"`$!``)9!"`D`0%0`ED$("`1!2-@``$#P`
+M`!`F)2"``IR8!30)^``"_P!&,@*2$@`E((`"V)@%-`GX``)_`$8R-!*3K@$`
+M`B0H`+^/)`"UCR``M(\<`+./&`"RCQ0`L8\0`+"/"`#@`S``O2?`_[TG/`"_
+MKS@`OJ\T`+>O,`"VKRP`M:\H`+2O)`"SKR``LJ\<`+&O&`"PKR6X@`#__]4P
+M):#@`B5````EL```)4@``"7P``#L+Y*.``````(`HI0`````\`%#,-```B1$
+M`&(0)9@``-$`8B@(`$`00`$")*```B0X`&(0P``")#P`8A`E$```50$`$```
+M```#`&(04`$")%$!8A0E$`````"BE`````!?\$(DZP1"+`<`0!`E(```5!.(
+ME@````!6$Y:6`````#(``!`!``(\``"BE`````!TZT(D\`!"+`<`0!`!``(\
+M6!.(E@````!:$Y:6`````"8``!````````"BE`````"$ZD(DX0!"+`<`0!`E
+M(```7!.(E@````!>$Y:6`````!H``!`!``(\``"BE`````!=%D(L$P!`%`$`
+M`CQ@$XB6`````&(3EI8`````#P``$`````!D$XF6`````&83GI8`````"```
+M$"4@``!H$XF6`````&H3GI8``````@``$"4@```E(````0`"/+"*1B2`$`0`
+M(1!"`L`8!``A&&8`!`!CC`$`A"3Y_X`0``!#K"4@```$`$8F`0`"/+B*1R2`
+M$`0`(1#"`$`8!``A&&0`0!@#`"$8=0"`&`,`(1AG````8XP!`(0D]?^`$```
+M0ZPE(````0`"/-"*1B2`$`0`(1!2`$`8!``A&&0`0!@#`"$8=0"`&`,`(1AF
+M````8XP!`(0D]?^`$`@`0ZPE(```!`!&)@$``CSHBD<D@!@$`"$89@!`$`0`
+M(1!$`$`0`@`A$%4`@!`"`"$01P```$*,``````@`8JP!`(0D)0""+/+_0!0`
+M`````@"BE`````"``$(P,0!`$`P`4280`*"O```0/```$"8E("`")2@@`0,`
+M!B0)^``"\0`')!``H*\E("`")2C``P,`!B0)^``"[@`')`(``B00`**O)2`@
+M`@$`!20!``8D"?@``B,!!R3,`>.."0`")`@`8A`*``(D)0!B%"4@``#0`>*6
+M``````0`0BPA`$`0`0`"/````CP``$(D!@`$)`GX0``#``4D`P`#)!``HZ\`
+M``,\``!C)`P`1"8E*$```P`&)`GX8`"#``<D$```$"4@```0`*"O```0/```
+M$"8E("`")2@``0,`!B0)^``"]P`')!``H*\E("`")2C``@,`!B0)^``"]``'
+M)"4@```!``(\8(Y%)(`8!``A&'(`0!`$`"$01`!`$`(`(1!5`(`0`@`A$$4`
+M``!"C`````"@`&*L`0"$)`,`@BSS_T`4@!@$`"6````!``(\L(I6)````CP`
+M`%4D```"/```423`&!``(1AV`(`0$``A$$("``!EC```1HP)^*`")2#@`@$`
+M<R8_`&(R`P!`%``````)^"`"`0`$)`$`$";P_P`2`0`"/"6```"XBEXD!`!1
+M)@```CP``%8D```"/```521`$!``(1!0`,`0`@`A$%X`@!@0`"$8(P(``$6,
+M``!FC`GXP`(E(.`"`0!S)C\`8C(#`$`4``````GXH`(!``0D`0`0)N[_`!(!
+M``(\)8```-"*5B0```(\``!5)````CP``%$D0!`0`"$04`#`$`(`(1!6`(`8
+M$``A&'(```!%C`@`9HP)^*`")2#@`@$`<R8_`&(R`P!`%``````)^"`"`0`$
+M)`$`$";N_P`2`0`"/"6```#HBEXD!`!1)@```CP``%8D```"/```521`$!``
+M(1!0`,`0`@`A$%X`@!@0`"$8<0```$6,"`!FC`GXP`(E(.`"`0!S)C\`8C(#
+M`$`4``````GXH`(!``0D`0`0)B4``B[N_T`40!`0`"6````!``(\8(Y6)```
+M`CP``%4D```"/```421`$!``(1!0`,`0`@`A$%8`@!@0`"$8<@```$6,H`!F
+MC`GXH`(E(.`"`0!S)C\`8C(#`$`4``````GX(`(!``0D`0`0)@,``B[N_T`4
+M0!`0`,0O@*X!``(D/`"_CS@`OH\T`+>/,`"VCRP`M8\H`+2/)`"SCR``LH\<
+M`+&/&`"PCP@`X`-``+TG["^$C`````#__Z,D!P!B+!(`0!"`&`,``0`"/*B.
+M0B0A&&(```!BC``````(`$````````@`X`,E$(``"`#@`P0`@B0(`.`#"`""
+M)`@`X`,,`((D"`#@`Z``@B0(`.`#)1```!``J8\`)`0`___&,`,D!`!`$`8`
+M(4"B````HI0`````*A""``0`0!`````````@K0@`X`,``."L_O\"E0`````J
+M$((`#@!`%"48H`#__\(D```BK0@`X`,``.*L0Q`"````(JT(`.`#``#BK$,0
+M`@```.*L`0!")`@`X`,``"*M*Q!H``X`0!````````!BE`````#Q_T00(Q!E
+M``(`8I0`````*A""`/#_0!0C$&4``@!C)"L0:`#T_T`4``````@`X`,`````
+MN/^])T0`OZ]``+ZO/`"WKS@`MJ\T`+6O,`"TKRP`LZ\H`+*O)`"QKR``L*](
+M`*2O)9#@`%@`M(]@`+Z/`"P%``,L!0``-`8``S0&`%P`LY<`````0!0%``.$
+M`@`EB````@!C+ET`8!0E$```(Q#%`/__0C`K$%$`6`!`%`$``B0"``(\B'I7
+M)/__=B8C$,4`__]5,!P`HB<0`**O)2```B4H0`(E,&`""?C@`A@`IR<<`**/
+M``````(`0!0!``(D'`"BKQ@`HH\`````!@!6%$`@`@#^_V(F&`"BKQ@`HH\`
+M````0"`"`"$8D@`<`**/`````$`0`@`A$%(```!CA```0H0`````!`!B%"$0
+ME````$.4(0``$``````8`*:/`````$`P!@`A$-(```!'A``````C*`<"'`"C
+MCP````!`&`,`(1!T````0I0`````&`"B`!(H```A&'(```!DA``````C&)``
+M(3#4````PI0`````&`!B`!(8```A**,`(R"'`!H`I``2*````@"`%``````-
+M``<`__^C,$@`I(\`````@!$$`"$040!`$`(`(1!>````0Z0!`"(F__]1,`(`
+M`B8`%`(``X0"`"L0L0*Q_T`0'`"B)P$``B1$`+^/0`"^CSP`MX\X`+:/-`"U
+MCS``M(\L`+./*`"RCR0`L8\@`+"/"`#@`T@`O2?__X@P__^E,/__QC``/`<`
+M$`"CAP`````2`,40`R0'`",0!0$8`$,`$A```",8R```````&`!D`!(8```A
+M$$,`(QC%`!H`0P`2$````@!@%``````-``<``!0"``@`X`,#%`(`"`#@`R40
+M@`"(_[TG=`"_KW``OJ]L`+>O:`"VKV0`M:]@`+2O7`"SKU@`LJ]4`+&O4`"P
+MKR6XP`#__Z4P.`"EK___YS`\`*>OI"R4C`````!``*"O`"0%`!0`YI8P`*(G
+M$`"BKP(``CR(>D(D`R0$`"4HX`()^$``-`"G)R68```@`*(G2`"BKPP`_B8H
+M`*,G1`"CKP,``B0C0%,`0!`(`"$02`#`.`(`-`"CCP````!`$`,`(1!#```9
+M`@`A$$,`0!`"`"$PX@`8`,4D(1#E`@@`590`````R`"@$@````!``*V/````
+M`$`@#0"0`**/`````"$8@@`A$.4"!@!"E````````&*D2`"CCP`````A*&0`
+M(1#>`"``1)0```````"DI#``HX\`````0!`#`"$00P``&0(`(1!#`$`0`@`A
+M$.(`(1!>```D!``#)`0`(`!#E"``0H0`````*A!$``(`0!````````"CI$``
+MI(\`````0"@$`$@`IX\`````(2#E````@I0``````!0"``,<`@#"%P(`(1AB
+M`$,8`P```(.D1`"MCP`````A,*4!0"`(`"$@B`"`(`0`-`"CCP````!`$`,`
+M(1!#```9`@`A$$,`(1""`"$050!`$`(`(1!>`!X`190```````#%I#``HX\`
+M````0!`#`"$00P``&0(`(1!#`"$@@@`A()4`0"`$`"$@G@``+`4``RP%`!X`
+M@Y0>`(*$`````"H010`"`$`0````````PZ1``**/`````$"(`@!$`*./````
+M`"&0<0```$*6```````4`@`#-`(`PA<"`"$PP@!#,`8```!&ID@`I(\`````
+M(8B1````)88T`**/`````$`X`@`A..(``!$'`"$XX@!`.`<`0(`(`"&`"`+`
+M@!``(3CP`"$X]P`B`.(D$`"BKQ0`M:\8`+2O0`"DCP(`#3Q0>ZTE"?B@`2P`
+MYR0``"6&``!&AC``HH\`````0#@"`"$XX@``$0<`(3CB`$`X!P`A./``(3CW
+M`"(`XB00`**O%`"UKP`"@B88`**O0`"DCP(``SQ0>V,D"?A@`"P`YR0``$.6
+M```BE@`````C&&(`__]C,"H`8!`EB```0`"DCP````"`L00`0!@$`"@`HB<A
+MJ$,`(`"B)R&00P`T`**/`````$`0`@`A$.("``!%E#``HH\`````0!`"`"$0
+MX@(``$:4(8#1`D"`$``A$)`"``!'A"$0%`(``D*$`````!``HJ\X`*2/`@`-
+M/%Q]K24)^*`!(8`4`@`$`J8!`#$F``"BE@``0Y8`````(Q!#`/__0C`K$"("
+MX/]`%`````!``**/``````$`0B1``**O`0!S)@0`8BXD_T`4`P`")"``HY>(
+M`**/````````0Z0EF```0`"CCP````"R`&`0)8@``"@`K"<@`*LG0`"DCP``
+M``#__X(D"P!B%D`8$P!`$!,`C`"ECP`````A&$4`(1""`0``0I0`````!`!"
+M)`X``!```&*DC`"GCP`````A(&<`(1"#`0``0H0A&&L``@!CA``````A$$,`
+MPA\"`"$00P!#$`(```""I`T`8!(E(```0!@3`(P`K8\`````(1"C`?[_1)0A
+M&&,!``!BA``````C(((`/`"BCP`````C(((`P!D3`"$0=``E&$```@1"E``$
+M8Y0`````(Q!#`/__1C`"`,`4)1#```$``B07`($$)3!``,`1$P``!$(D(2B"
+M`A@`A@`2$`````"CE``````A&&(``!P#``,<`P!`$!$`E`"GCP`````A$$<`
+M`P!@!`$`,28"```0``!#I```0*0!`(0D[_^`!!@`A@!`&!,`(1"#`0``2(0A
+M$&,!``!"A``````C0`(!C`"MCP`````A&&T```!EE#P`HX\`````(2BC`",H
+MH@`E2``!*Q"I``,`0!``%`D`)4B@```4"0`E&$```Q0"`"H0@@`2`$`0@!$3
+M`(`Y$P`#-`,`0!@1`)0`K8\`````(1AM`"$0Y`!`$`(`(1!4```$0I0`````
+M``!BI`$`A"0J$(8`\_]`%`$`,2:`$1,`(1!(`$`8`@`A&'0`)1!@`/X#8Y3\
+M`T*4`````",88@#__V8P`@#`%"40P``!``(D)3!``"L0)0$B`$`0`!0%``,4
+M`@`J$((`'@!`$(`1$P`A$$@`0!`"`/X#0B0A0(("?P`*)``4!0`#/`(`(QB)
+M`!@`9@`2&``````"E0`````A$$,``!0"``,<`@!`$!$`E`"MCP`````A*$T`
+M@`!B*`,`0!`!`#$F`@``$```HZ0``*JD`0"$)"H0AP#L_T`4(QB)``$`<R9`
+M`*./`````"L08P)2_T`4``````0`8BX-`$`0@``B+D`0$P",`*2/`````"$0
+M1`#^_T.4````````0Z0!`',F!`!B+O?_0!1`$!,`@``B+@L`0!!`$!$`E`"E
+MCP`````A$$4`_O]#E````````$.D`0`Q)H``(B[W_T`40!`1`'0`OX]P`+Z/
+M;`"WCV@`MH]D`+6/8`"TCUP`LX]8`+*/5`"QCU``L(\(`.`#>`"])[#_O2=,
+M`+^O2`"VKT0`M:]``+2O/`"SKS@`LJ\T`+&O,`"PKR68@``EH.``)9!@`GA&
+M=8X``````@""E@````#0`$(PP`!#.`$`8RS0`$(X`0!"+"488@`(`&`4_"=Q
+M)@(`@I8`````H`!",*```R0"`$,0Z"-1)M0?428``!`\```0)B4@8`()^``"
+M;*(%-`\`5C```(66*`"B)Q``HJ\@`*(G%`"BKV``HH\`````&`"BKQP`M:\"
+M``(\R'U")"4@8`(E,"`""?A``"4XP`(E(&`""?@``EBB!33__P,\_S]C-"00
+M0P`<`":6`````/__QB2`,P8``,#&,````SP``&,D)2!@`EBB!30)^&``)3!&
+M`"@`HY<H`**'``````,`0!`C$`,``@``$/0O0J;T+T"F@*(1-"6```````(\
+M``!2),`8$``A&'4```!GD`(`8I```````!("`"4XX@`$`&*0```````4`@`E
+M..(`!@!FD```````-@8`)2!@`B4H(`()^$`")3#F``$`$"8@``(NZ_]`%`0`
+M,28@`*:7```````Q!@#P`\8P)3#&`B(`HI<`````@!("``#\0C`E,,(`)`"B
+MEP``````%`(`/P`#/"000P`E,,(`)@"CEP````"`'0,`P`\"/"088@````(\
+M``!")"4@8`)LH@4T"?A``"4PPP`!``(D3`"_CT@`MH]$`+6/0`"TCSP`LX\X
+M`+*/-`"QCS``L(\(`.`#4`"])^C_O2<4`+^O$`"PKR6`@`!X1@2.``````4`
+M@!````(\``!")`GX0```````>$8`KNPO!(X`````!0"`$````CP``$(D"?A`
+M``````#L+P"NI"P$C@`````%`(`0```"/```0B0)^$```````*0L`*X4`+^/
+M$`"PCP@`X`,8`+TG)2````,`!R0(`*8D#`"E)",8Y`!`$`,`(1!#`,`8`@`A
+M$,,```!"E``````&`$`0`0"$)"$090`(`$*$``````@`X`/__X0D!`""+/'_
+M0!0C&.0`)1`````4`@`(`.`#`Q0"`"4P```(`*<D#`"E)$`0!@`A($8`P!`$
+M`"$0X@```$.4``````D`8!`!`,8D@!`$`"$00P!`$`(`(1!%``8`0H0`````
+M"`#@`___QB0$`,(L[O]`%"40````%`(`"`#@`P,4`@#(_[TG-`"_KS``OJ\L
+M`+>O*`"VKR0`M:\@`+2O'`"SKQ@`LJ\4`+&O$`"PKR6H@``EL*``);C``"7P
+MX````."F`@#"E@````#0`$(PP`!#.`$`8RS0`$(X`0!"+"488@`(`&`4_">E
+M)@(`PI8`````H`!",*```R0"`$,0Z".%)-0?A204`*:4`````!@`L22M`,`0
+M)1``````Q)8``"*6`````"L0@@`4`$`4`P`"/$`0!@`A$$8``!D"`"$00P!`
+M$`(`(1`B`IK_0I0`````*Q!$`!,`0!`E*```0(`&`"&`!@(E$&``(8`"`D"`
+M$``A@#`"A```$)K_$"9HB$(D)2"@`@GX0``E*"`"``#BI@,``CP$B$(D)2"@
+M`H0``!`E*"`"%P#`$"4@`````,.6```BE@`````K$$,`$@!`$$`0!``E*(``
+M`0"$)"H0A@`-`$`00!`$`"$01```&0(`(1!#`$`0`@`A$%$```##E@``0I0`
+M````*Q!#`/'_0!0`````0!`$`"$01```&0(`(1!#`$`0`@`AH%$```"2ED`0
+M!0`A$$4``!D"`"$00P!`$`(`(9A1````8I8`````(Y!"`D4`0!H``````P`1
+M/&B(,28E(*`""?@@`B4H@`(E@$``)2"@`@GX(`(E*&`"(X`"`B4@H`()^"`"
+M)2A@`@``PY8``&26`````",89``8``,"$H``````````````&`!2`!(0```A
+M@`("`````!H`$@(2@````@!`%@`````-``<``(80``.&$````/"F`P`1/`2(
+M,28E(*`""?@@`B4H@`(E@$``)2"@`@GX(`(E*&`"(X`"`B4@H`()^"`")2A@
+M`@``PY8``&26`````",89``8``,"$H``````````````&`!2`!(0```A@`("
+M`````!H`$@(2@````@!`%@`````-``<``(80``.&$````-"G'```$`$``B1`
+M$`0`(1!$```9`@`A$$,`0!`"`"&`40```,.6```"E@`````0`&(4``````,`
+M`CQHB$(D)2"@`@GX0``E*``"``#BI@,``CP$B$(D)2"@`B4H``()^$``````
+M````PJ<"```0`0`")"40```T`+^/,`"^CRP`MX\H`+:/)`"UCR``M(\<`+./
+M&`"RCQ0`L8\0`+"/"`#@`S@`O2?(_[TG-`"_KS``MJ\L`+6O*`"TKR0`LZ\@
+M`+*O'`"QKQ@`L*\EL(``):B@`"60P``!`!,D&`!`$B6(```#``(\S(A4),`0
+M$0`A@*(")2#``B4H``(0`*8G"?B``A(`IR<(`$`0`````!``HI,`````!@`"
+MHA(`HI,``````@``$`<``J(EF````0`Q)BL0,@+M_T`4P!`1`"408`(T`+^/
+M,`"VCRP`M8\H`+2/)`"SCR``LH\<`+&/&`"PCP@`X`,X`+TGX/^])Q@`OZ\4
+M`+&O$`"PKR6(H``E@(`````"/```0B0)^$``K``$)"480``1`&`0["\#K@`!
+M`B1\1@*N```"/```0B0)^$````$$)"480``(`&`0>$8#K@```CP``$(D"?A`
+M```&!"0E&$``!`!@%*0L`ZX"``,D&@``$```(ZX#``(\A(=")*@L`JX"``(\
+MT&Y")*PL`JX"``(\)'I")+`L`JX"``(\>'!")+0L`JX"``(\%'1")+@L`JX#
+M``(\4(5")+PL`JX#``(\1(Q"),`L`JX```(\``!"),0L`JX!``(D&`"_CQ0`
+ML8\0`+"/"`#@`R``O2=!=&AE<F]S(#4R,3``````071H97)O<R`U,C$Q````
+M`$%T:&5R;W,@-3(Q,2`H1E!'02D`071H97)O<R`U,C$R("A&4$=!*0!!=&AE
+M<F]S(#4S,3(@5VE3;T,``$%T:&5R;W,@,C,Q-2!7:5-O0P``071H97)O<R`R
+M,S$W(%=I4V]#``!!=&AE<F]S(#(S,3,@5VE3;T,``$%T:&5R;W,@-30R-"\R
+M-#(T````071H97)O<R`U,C$R`````"A0%BQ8*````````!`,```D#```)`P`
+M`"P,```T#```4`P``%@,``!L#```_`X``(`,``"@#```(`T``,`,``#@#```
+M``T``#0-``#\#@``_`X``*0-``#$#0``Y`T``.P-``!(#```#`X``"P.``!,
+M#@``_`X``/P.``#$#@``_`X``,P.``#\#@``_`X``/P.``#H#@``H/^C_Y[_
+MH/^C_Z#_05(U,C$P``!!4C4R,3$``$%2-3(Q,@``4D8U,3$Q``!21C4Q,3(`
+M`%)&,C0Q,P``4D8U-#$S``!214=/4%-?1E5.0P````````````````````4`
+M"@`4`!X`,@!&`%4`6@!?`&0```````H`%``>`"@`,@`\`$8`4`!:`&0```#"
+M````Q````,4```#0````V@```.0```#"````PP```-0```#R````#0$``"@!
+M``#/````R@```````````````@!0(0$`0`$$`*``"`#``"``T`!``%`!````
+M```````D`9@9`"80!@``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````X=`````````````````````````````````````````````!D
+M=```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M________``````````````"8``!'````")@````````,F```IHZ$"1"8````
+MX#(]%)@``&L'```<F````````""8`````@("))@```X.```HF````0(""BR8
+M``#\;P,`,)@````````TF```#@X``#B8```'````/)@````!`@!`F`````!C
+MB428``"<%G(32)@``#.V&`!,F```/&&$$E"8``#@N.@-5)@``%E(!P!8F```
+MNKZ`?ER8``!>9CHQ8)@```@=``!DF````,X!`&B8``"009I`<)@```\```!T
+MF```@````'B8```$`````)D````````$F0````````B9````````#)D`````
+M@``0F0```P````";````````!)L``"`````(FP``$`````R;```P````$)L`
+M``@````4FP``*````!B;```H````')L```0````@FP``)````"2;```4````
+M*)L``#0````LFP``#````#";```L````-)L```(````XFP``(@```#R;```2
+M````0)L``#(```!$FP``"@```$B;```J````3)L```$```!0FP``(0```%2;
+M```1````6)L``#$```!<FP``"0```&";```I````9)L```4```!HFP``)0``
+M`&R;```5````<)L``#4```!TFP``#0```'B;```M````?)L```,```"`FP``
+M(P```(2;```3````B)L``#,```",FP``"P```)";```K````E)L```<```"8
+MFP``)P```)R;```7````H)L``#<```"DFP``#P```*B;```O````K)L``"\`
+M``"PFP``+P```+2;```O````N)L``"\```"\FP``+P```,";```O````Q)L`
+M`"\```#(FP``+P```,R;```O````T)L``"\```#4FP``+P```-B;```O````
+MW)L``"\```#@FP``+P```.2;```O````Z)L``"\```#LFP``+P```/";```O
+M````])L``"\```#XFP``+P```/R;```O`````)H``!T````$F@``70````B:
+M``"=````#)H``-T````0F@``'0$``!2:```A````&)H``&$````<F@``H0``
+M`"":``#A````))H``#$````HF@``<0```"R:``"Q````,)H``!P````TF@``
+M7````#B:```I````/)H``&D```!`F@``J0```$2:```@````2)H``!D```!,
+MF@``60```%":``"9````5)H``#````!8F@``!0```%R:```E````8)H``&4`
+M``!DF@``I0```&B:```H````;)H``&@```!PF@``'P```'2:```>````>)H`
+M`!@```!\F@``6````(":``"8````A)H```,```"(F@``!````(R:``!$````
+MD)H``(0```"4F@``$P```)B:```2````G)H``%(```"@F@``D@```*2:``#2
+M````J)H``"L```"LF@``*@```+":``!J````M)H``*H```"XF@``&P```+R:
+M```:````P)H``%H```#$F@``F@```,B:``#:````S)H```8```#0F@``!@``
+M`-2:```&````V)H```8```#<F@``!@```.":```&````Y)H```8```#HF@``
+M!@```.R:```&````\)H```8```#TF@``!@```/B:```&````_)H```8```#4
+MF```(````,R8```$````R)@```8!!@"<F```;0```,"8````````T)@``!0`
+M```)"0```````@(&!@8&!@8"`@```````P`&``D`/```````````````````
+M````````````````\````,P````````````````````*X@```"````H"```!
+M&````0```$`8!`````````4$5QD`)A`&````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````.3*````````````````````````````````
+M`````````````$3+````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````!L"8\)M`D`````````````________````````(````"``
+M``!`````0```````!@````8````&````````````,````!4````5````'0``
+M`!4```!`$```#_PO``_\+P`?_"\`#_PO`$00```/_"\`#_PO`!_\+P`/_"\`
+M2!````_\+P`/_"\`'_PO``_\+P!,$```#_PO``_\+P`?_"\`#_PO`%`0```/
+M_"\`#_PO`!_\+P`/_"\`5!````_\+P`/_"\`'_PO``_\+P!8$```#_PO``_\
+M+P`?_"\`#_PO`%P0```/_"\`#_PO`!_\+P`/_"\`8!````_\+P`/_"\`'_PO
+M``_\+P!D$```#_PO``_\+P`?_"\`#_PO`'`0``!H`0``X`$``+@!``!H`0``
+M,!```#`"``#@`0``L````#`"``"P$```F`T``(`1``!('P``F`T``/`0``#@
+MH```:$`!`(!8``#@H```%(`````$``0`"``(`#``(``$``0<@```IX^-#L^/
+MC0Z5CV`!IX^-#@28`````````P``````````````()@````"`@(``@("``(!
+M`@`"`@(DF```#@X```X.```'!P``#@X``"B8```!``(*`0`""@```04!``(*
+M-)@```X.```.#@``#@X```X.```XF```!P````<````+````"P```$28``"<
+M%G(3I19R$Z@6<A.<%G(32)@``&>Z&`!GNA@`:;H8`&FZ&`!0F```X+0H#."T
+M*`S@M"@,X+0H#%B8```N#8!^+@V`?BX-P'XN#8!^7)@``%Y=-S%>73<Q7ETZ
+M,5Y=-S%@F```$+T``!"]```XO0``$+T``&28````S@$``,X!``#.`0``S@$`
+M%)D``!`G```0)P``?!4``!`G```8F0``D`$``)`!``"$````D`$``$29```@
+M$.!O(!#@;R`)X&\@$.!O@*$``/\4_P7_%/\%_Q3_!?\9_P74F```$````!0`
+M```0````$`````P`````````*````)R<A(0L````?'Q\?#0````%````0```
+M``````!$````"````$@````(````3````!````!0`````````%0````?````
+M``@````````$"`````````@(````````#`@````````0"````````!0(````
+M````&`@````````<"````````"`(````````)`@````````P$@````````2`
+M````````"(`````````,@````````!B`````````)(`````````H@```,```
+M`"R```#__P<`,(```/___P$T@```,0```#B`````````/(````````!`@```
+M`````$2````"````2(````````!4@````````%B`````````")@````````,
+MF```DY"$+1"8````X#)]%)@``&L/```<F````````"R8``#^;P(`,)@`````
+M```\F`````$"`$"8``!Z`6H@3)@``#QAA!)4F```60@``&B8``"009I`;)@`
+M`(&P#`5PF```#P```'28``"`````>)@```P`````F0````````29````````
+M")D````````,F0````"``!"9```!````')D``"H)```@F0```````"29```%
+MB@4`*)D```$````LF0```````#"9````````-)D````````XF0```````#R9
+M```_````0)D```0```!(F0```````$R9````````4)D```````!4F0``3/%0
+M75B9```8````7)D``(YJ2P"$H0``_P7_!HBA``#_!_\'C*$``/\(_PB0H0``
+M_PG_"92A``#_"O\*F*$``/\+_PN<H0``_PS_#*"A``#_#?\-I*$``/\._P^H
+MH0``_Q+_$JRA``#_$_\4L*$``/\5_Q:TH0``_Q?_&;BA``#_&O\;O*$``/\=
+M_Q[`H0``_R#_(\2A``#_)?\GR*$``/\I_RS,H0``_R__,="A``#_-/\WU*$`
+M`/\Z_SK8H0``_SK_.MRA``#_.O\ZX*$``/\Z_SKDH0``_SK_.NBA``#_.O\Z
+M[*$``/\Z_SKPH0``_SK_.O2A``#_.O\Z^*$``/\Z_SK\H0``_SK_.@";````
+M````!)L``"`````(FP``$`````R;```P````$)L```@````4FP``*````!B;
+M```$````')L``"0````@FP``%````"2;```T````*)L```P````LFP``+```
+M`#";```"````-)L``"(````XFP``$@```#R;```R````0)L```H```!$FP``
+M*@```$B;```&````3)L``"8```!0FP``%@```%2;```V````6)L```X```!<
+MFP``+@```&";```!````9)L``"$```!HFP``$0```&R;```Q````<)L```D`
+M``!TFP``*0```'B;```%````?)L``"4```"`FP``%0```(2;```U````B)L`
+M``T```",FP``+0```)";```#````E)L``",```"8FP``$P```)R;```S````
+MH)L```L```"DFP``*P```*B;```K````K)L``"L```"PFP``*P```+2;```K
+M````N)L``"L```"\FP``*P```,";```K````Q)L``"L```#(FP``*P```,R;
+M```K````T)L``"L```#4FP``*P```-B;```K````W)L``"L```#@FP``*P``
+M`.2;```K````Z)L``"L```#LFP``*P```/";```K````])L``"L```#XFP``
+M`@```/R;```6````U)@``"````#8F```:!!@``":``"I`0````````2:``#I
+M`0``0`````B:```I````@`````R:``!I````4`$``!":``"9`0``D`$``!2:
+M``#9`0``T`$``!B:```9````$````!R:``!9````1````"":``"9````A```
+M`"2:``"E`0``2`$``"B:``#E`0``B`$``"R:```E````R`$``#":``#(`0``
+M%````#2:```(````0@```#B:``!(````@@```#R:``"(````>`$``$":``"8
+M`0``N`$``$2:``#8`0``^`$``$B:```8````$@```$R:``!8````4@```%":
+M``"8````D@```%2:``"D`0``?`$``%B:``#D`0``O`$``%R:```D````_`$`
+M`&":``!D````"@```&2:``"D````2@```&B:``#D````B@```&R:```*`0``
+M6@$``'":``!*`0``F@$``'2:``"*`0``V@$``'B:``#*`0``#@```'R:```*
+M````3@```(":``!*````C@```(2:``"*````7@$``(B:``"Z`0``G@$``(R:
+M``#Z`0``W@$``)":```Z````"0```)2:``!Z````20```)B:``"&`0``B0``
+M`)R:``#&`0``>0$``*":```&````N0$``*2:``!&````^0$``*B:``"&````
+M.0```*R:``#&````>0```+":``#&````N0```+2:``#&````O0$``+B:``#&
+M````_0$``+R:``#&````/0```,":``#&````?0```,2:``#&````O0```,B:
+M``#&````_0```,R:``#&````_0```-":``#&````_0```-2:``#&````_0``
+M`-B:``#&````_0```-R:``#&````_0```.":``#&````_0```.2:``#&````
+M_0```.B:``#&````_0```.R:``#&````_0```/":``#&````_0```/2:``#&
+M````_0```/B:``#&````_0```/R:``#&````_0````$```!&````8`````$`
+M``!&````80````$```!&````8@````$```!&````8P````$```!&````9```
+M``$```!&````90````$```!&````9@````$```!&````9P````$```!&````
+M:`````$```!&````:0````$```!&````:@````$```!&````:P````$```!&
+M````;`````$```!&````=`````$```!&````=`````$```!&````=`````$`
+M``!&````=`````$```!&````=`````$```!&````=`````$```!&````=```
+M``$```!&````=`````$```!&````=0````$```!&````=@````$```!&````
+M=P````$```!&````>`````$```!&````>0````$```!&````>@````$```!&
+M````>P````$```!&````?`````$```!&````?0````$```!&````?@````$`
+M``!&````?P````$```!&````@`````$```!$````?`````$```!&````B```
+M``$```!&````C`````$```!&````D`````$```!&````E`````$```!&````
+MF`````$```!&````G`````$```!&````H`````$```!&````I`````$```!&
+M````J`````$```!&````K`````$```!&````L`````$```!&````M``````"
+M!P">%@L`8A8*`#H6"0`<%@@`ZA4'`)H5!0!*%00``Q4"`%D4``````$````#
+M``8`"0`_`````````"`<`0`@'`$`6!P!`%@<`0"0'`$`D!P!`,@<`0#('`$`
+M"0````0````$``$``0`!``8```!&1S@`````````````````!`````$``0`$
+M````1D<W``````````````````,``0`!``$``P```$9'-@``````````````
+M```$```````!``$```!&1S4`````````````````!``!``$`````````1D<T
+M``````````````````0````!````_O___T9',P`````````````````#``$`
+M`0```/W___]&1S(`````````````````!`````````#\____1D<Q````````
+M``````````(``0`!````^O___T9',```````````````````````````````
+M```````````````````````````````````4$%09`"80!@``````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````^`0``````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````;`F/";0)```("6P)M`D``/_______P``
+M!0(/!P(/"@`/"0`/````````````````Z&$!`'AA`0"$80$`0&(!`*1A`0`T
+M8@$`````````````````(````"````!`````0```````!@````8````&`)X6
+M"P!B%@H`.A8)`!P6"`#J%0<`FA4%`$H5!``#%0(`610``+@+`0``````````
+M`!Q[`0"$>P$`L'L!`&1^`0`X?`$`9'X!`&1^`0!D?@$`9'X!`&1^`0!L?`$`
+M9'X!`&1^`0!D?@$`9'X!`(!\`0"@?`$`9'X!`/!\`0`8?0$`9'X!`/1[`0!D
+M?@$`9'X!`&1^`0!H?0$`@'T!`&1^`0"<?0$``````"!^`0`L?@$`.'X!`$1^
+M`0!0?@$```````8````!`````@````,````$````!0```-A^`0`0?P$`'($!
+M`'!_`0`<@0$`'($!`!R!`0`<@0$`'($!`+A_`0`<@0$`'($!`!R!`0`<@0$`
+MW'\!`!R!`0`<@0$`['\!`-2``0`<@0$`'($!`!R!`0`<@0$`'($!`"2``0`D
+M@`$`'($!`)B``0```````````$`0```/_"\`#_PO`!_\+P`/_"\`#_PO`$00
+M```/_"\`#_PO`!_\+P`/_"\`#_PO`$@0```/_"\`#_PO`!_\+P`/_"\`#_PO
+M`$P0```/_"\`#_PO`!_\+P`/_"\`#_PO`%`0```/_"\`#_PO`!_\+P`/_"\`
+M#_PO`%00```/_"\`#_PO`!_\+P`/_"\`#_PO`%@0```/_"\`#_PO`!_\+P`/
+M_"\`#_PO`%P0```/_"\`#_PO`!_\+P`/_"\`#_PO`&`0```/_"\`#_PO`!_\
+M+P`/_"\`#_PO`&00```/_"\`#_PO`!_\+P`/_"\`#_PO`#`0```P`@``X`$`
+M`+````!@`0``X`$``'`0``!H`0``X`$``+@!``",`0``X`$``+`0``!@#@``
+M@!$``!P?```X/@``@!$``/`0``#@H```:$`!`(!8``#@L```:$`!`!2```#H
+M`^@#X`;@!B`$(`1`"$`(X`;@!@28`````````P```````````````P```""8
+M`````@("``("`@`"`0(``@("``("`B28```.#@``#@X```<'```.#@``#@X`
+M`$28```<%G(3)1QR$R(7<A.B%G(3)1QR$V"8```0G0``$)T``!B=```8G0``
+M$)T``&28````S@$``,X!``#.`0``S@$``,X!`&B8``"009I`D$&:0)!!FD"0
+M09I`D$&:0!B9``"X`0``N`$``(0````(`0``N`$``"29```%B@40!8H%$`6*
+M!1`%B@40!8H%$#"B```````````````````(`0````````P`````````-```
+M``4```!``````````$0````(````2`````@```!,````$````%``````````
+M5````!\`````"`````````0(````````"`@````````,"````````!`(````
+M````%`@````````8"````````!P(````````(`@````````D"````````'`2
+M````````.!````````!X$````````+@0````````^!`````````X$0``````
+M`'@1````````N!$```````#X$0```````#@2````````>!(```````"X$@``
+M`````/@2````````.!,```````!X$P```````+@3````````^!,````````X
+M%````````'@4````````N!0```````#X%````````#@5````````>!4`````
+M``"X%0```````/@5````````.!8```````!X%@```````+@6````````^!8`
+M```````X%P```````'@7````````N!<```````#X%P```````#P0````````
+M?!````````"\$````````/P0````````/!$```````!\$0```````+P1````
+M````_!$````````\$@```````'P2````````O!(```````#\$@```````#P3
+M````````?!,```````"\$P```````/P3````````/!0```````!\%```````
+M``2`````````"(`````````,@````````""`````````)(`````````H@```
+M,````"R```#__P<`,(```/___P$T@```,0```#B`````````/(````````!(
+M@````````%2`````````6(````````!<@```C\</`,"````:,((JQ(```.`!
+MW`7(@```$"=`'\R``````/0!T(```!P>``#4@```JJH"`-B```!550`"W(``
+M``````#@@```_____^2```#__P``Z(````````#L@````````/"`````````
+M](````````#X@````````/R```"(`````(<````````$AP``C`````B'``#D
+M````#(<``-4"```0AP```````!2'````````&(<``*`````<AP``R0$``""'
+M```L````)(<``"P````HAP``,````"R'```\````,(<``"P````TAP``+```
+M`#B'```P````/(<``#P```!`AP```````$2'````````2(<```````!,AP``
+M`````%"'````````5(<```````!8AP```````%R'````````8(<``-4```!D
+MAP``WP```&B'```"`0``;(<``#H!``!PAP``=0```'2'``!_````>(<``*(`
+M``!\AP````````"!```"``$`!($```$````(@0``P`````R!````````$($`
+M`&@!```4@0```````,"'`````0(#Q(<```0%!@?(AP``"`D*"\R'```,#0X/
+MT(<``!`1$A/4AP``%!46%]B'```8&1H;W(<``!P='A_@AP````$"`^2'```$
+M!08'Z(<```@)"@OLAP``#`T.#_"'```0$1(3](<``!05%A?XAP``&!D:&_R'
+M```<'1X?#)@``!F.A*T0F````.`H?128``!KGPJ<')@```````!`F```>@%J
+M(%28``!9"````)D````````$F0````````B9````````#)D`````@``0F0``
+M`0```!R9``"`#```()D`````$`4HF0```0```"R9```$````-)D``"(@'QXX
+MF0``#0P+"CR9```_````2)D``!*R@))4F0``B.%075R9``".:DL`:)D``,X#
+M``!PF0``%;4O&7B9```!````?)D````````0H@``,V.``!2B```0;!``&*(`
+M`&!`G``@H@``QC"(`22B````!```+*(````````TH@``("`@(#BB```@("`@
+M0*(``"`*23A$H@``MGL``$BB``#\/_\/`)L````````HFP``#````#B;```2
+M````9)L``"$```",FP``+0```)R;```S```````#``8`"0`_```````#``8`
+M"0`_````"0````0````$``$``0`!````````````!@```$9'.```````````
+M```````$`````0`!````````````!````$9'-P`````````````````#``$`
+M`0`!`````````````P```$9'-@`````````````````$```````!````````
+M`````0```$9'-0`````````````````$``$``0```````````````````$9'
+M-``````````````````$`````0``````````````_O___T9',P``````````
+M```````#``$``0``````````````_?___T9',@`````````````````$````
+M````````````````_/___T9',0`````````````````"``$``0``````````
+M````^O___T9',```````````````````````````````````````````````
+M```````````````````(`````0````,````````````````````&````1D<W
+M``````````````````(`````````````````````````1D<V````````````
+M``````$```````````````````#]____1D<U````````````````````````
+M``````````````#Z____1D<T`````````````````````0`!````````````
+M``#X____1D<S`````````````````````0`!`````0`!``````#V____1D<R
+M`````````````````````0````$``0`!``````#S____1D<Q````````````
+M`````````0````$``0````$```#P____1D<P````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````(````$````!@````@````*````#```
+M``X````0````S`<"`"0``@"<`0(`,`0"`-0$`@"D!0(`O`8"```````P````
+M%8```!6````5@```%8```!6````<@```IX^-$L\/B`F5#^`$JP_@$L\/B`DH
+MF````0`""@$``@H``0$%`0`""@$``@HTF```#@X```X.```.#@``#@X```X.
+M```XF```!P````<````+````"P````L```!(F```6MH8`%K:&`!IRA@`:<H8
+M`&G*&`!0F```X+3H#>"TZ`W@M.@-X+3H#>"TZ`U8F```+@V`?BX-@'XN3>A^
+M+DWH?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F8W,5YA-S%LF```@;`,!8&P#`6!
+ML`P%@+`,!8"P#`44F0``$"<``!`G``!\%0``^"H``!`G``!$F0``(!"X]R`0
+MN/<@#;CW(!"X]R`0N/<,H@``:D$L9&I!+&1J04!D:D%`9&I!0&0<H@``"H"#
+M&`J`@Q@*@',8"H"#&`J`@Q@P$@````````B8````````+)@``/XO`@`\F```
+M``$"`$R8```\8802,)D``(-(``!`F0``!````%B9``#_````=)D```````#X
+MF0``&`````2B````````"*(``(AG/M`HH@``M0$``#RB``"OB<@3!)L``"``
+M```(FP``$`````R;```P````$)L```@````4FP``*````!B;```$````')L`
+M`"0````@FP``%````"2;```T````+)L``"P````PFP```@```#2;```B````
+M/)L``#(```!`FP``"@```$2;```J````2)L```8```!,FP``)@```%";```6
+M````5)L``#8```!8FP``#@```%R;```N````8)L```$```!HFP``$0```&R;
+M```Q````<)L```D```!TFP``*0```'B;```%````?)L``"4```"`FP``%0``
+M`(2;```U````B)L```T```"0FP```P```)2;```C````F)L``!,```"@FP``
+M"P```*2;```K````J)L``"L```"LFP``*P```+";```K````M)L``"L```"X
+MFP``*P```+R;```K````P)L``"L```#$FP``*P```,B;```K````S)L``"L`
+M``#0FP``*P```-2;```K````V)L``"L```#<FP``*P```.";```K````Y)L`
+M`"L```#HFP``*P```.R;```K````\)L``"L```#TFP``*P```/B;```"````
+M_)L``!8```"<F`````````````````````````````"<F```````````````
+M``````````````"<F`````````````````````````````"<F```````````
+M``````````````````"<F`````````````````````````````"<F```````
+M``````````````````````"<F`````````````````````````````"<F```
+M``````````````````````````"<F`````````````````````````````"<
+MF`````````````````````````````"<F```````````````````````````
+M``"<F``````X````.````#@````X````.`"<F```````````````````````
+M``````"<F`````````````````````````````"<F`````````````#`````
+M@````(````"<F```^0`$`/D`!`#_``0`_0`$`/T`!`#4F``````````````$
+M````!`````0`````F@``J0$````````$F@``Z0$``$`````(F@``*0```(``
+M```,F@``:0```%`!```0F@``F0$``)`!```4F@``V0$``-`!```8F@``&0``
+M`!`````<F@``60```$0````@F@``F0```(0````DF@``I0$``$@!```HF@``
+MY0$``(@!```LF@``)0```,@!```PF@``R`$``!0````TF@``"````$(````X
+MF@``2````((````\F@``B````'@!``!`F@``F`$``+@!``!$F@``V`$``/@!
+M``!(F@``&````!(```!,F@``6````%(```!0F@``F````)(```!4F@``I`$`
+M`'P!``!8F@``Y`$``+P!``!<F@``)````/P!``!@F@``9`````H```!DF@``
+MI````$H```!HF@``Y````(H```!LF@``"@$``%H!``!PF@``2@$``)H!``!T
+MF@``B@$``-H!``!XF@``R@$```X```!\F@``"@```$X```"`F@``2@```(X`
+M``"$F@``B@```%X!``"(F@``N@$``)X!``",F@``^@$``-X!``"0F@``.@``
+M``D```"4F@``>@```$D```"8F@``A@$``(D```"<F@``Q@$``'D!``"@F@``
+M!@```+D!``"DF@``1@```/D!``"HF@``A@```#D```"LF@``Q@```'D```"P
+MF@``Q@```+D```"TF@``Q@```+T!``"XF@``Q@```/T!``"\F@``Q@```#T`
+M``#`F@``Q@```'T```#$F@``Q@```+T```#(F@``Q@```/T```#,F@``Q@``
+M`/T```#0F@``Q@```/T```#4F@``Q@```/T```#8F@``Q@```/T```#<F@``
+MQ@```/T```#@F@``Q@```/T```#DF@``Q@```/T```#HF@``Q@```/T```#L
+MF@``Q@```/T```#PF@``Q@```/T```#TF@``Q@```/T```#XF@``Q@```/T`
+M``#\F@``Q@```/T```#4F```(````-28```0````%````!`````0````%```
+M`-B8``!H$&``:!!@`&@08`!H$&``:!!@`)R8````````````````````````
+M`````)R8`````````````````````````````)R8````````````````````
+M`````````)R8`````````````````````````````)R8````````````````
+M`````````````)R8```````0````$````!`````0````$)R8```````$````
+M!`````0````$````!)R8`````````````````````````````)R8````````
+M`````````````````````)R8`````````````````````````````)R8````
+M``````````````H``````````)R8``#``#@`@``X`,``.`+``#@`P``X`)R8
+M```&``(`!@`"``8````&``(`!@`"`)R8``")````B0```(D```")````B0``
+M`)R8``"@````H````*````"@````H````)R8```'``0`!P`$``<`!``'``0`
+M!P`$`-28```:````&@```!H````:````&@```)R8``!`````2````$````!`
+M````0````)R8```0````$````!`````0````$````)R8```(````"`````@`
+M```(````"````)R8``!/````3P```$\```!/````3P```)R8``#Q````\0``
+M`&$```#Q````\0```)R8``!/D```3Y```$R0``!/D```3Y```)R8``!:$@``
+M6A(``)H2``!:$@``6A(``,R8```.````#@````\````.````#@````$```!&
+M````8`````$```!&````80````$```!&````8@````$```!&````8P````$`
+M``!&````9`````$```!&````90````$```!&````9@````$```!&````9P``
+M``$```!&````:`````$```!&````:0````$```!&````:@````$```!&````
+M:P````$```!&````;`````$```!&````=`````$```!&````=`````$```!&
+M````=`````$```!&````=`````$```!&````=`````$```!&````=`````$`
+M``!&````=`````$```!&````=`````$```!&````=0````$```!&````=@``
+M``$```!&````=P````$```!&````>`````$```!&````>0````$```!&````
+M>@````$```!&````>P````$```!&````?`````$```!&````?0````$```!&
+M````?@````$```!&````?P````$```!&````@`````$```!$````?`````$`
+M``!&````B`````$```!&````C`````$```!&````D`````$```!&````E```
+M``$```!&````F`````$```!&````G`````$```!&````H`````$```!&````
+MI`````$```!&````J`````$```!&````K`````$```!&````L`````$```!&
+M````M````#0;`@`\&P(`1!L"`$P;`@!D&P(`9!L"`%0;`@!<&P(`GA8&`&(6
+M!``Z%@,`'!8"`.H5`0":%0``2A4```,5`0!9%`,`N`L%````````````,```
+M`!6````5@```%8```!6````5@```'(```*>3C1+/$X@)E1/@!*L3X!+/$X@)
+M*)@```$``@H!``(*``$"!0$``@H!``(*-)@```X.```.#@``#@X```X.```.
+M#@``.)@```<````'````"P````L````+````2)@``&W:&`!MVA@`=<H8`'7*
+M&`!URA@`4)@``."TZ`W@M.@-X+3H#>"TZ`W@M.@-6)@``"X-@'XN#8!^+@WH
+M?BX-Z'XN#8!^7)@``%YF-S%>9C<Q7F8W,5YF-S%>9C<Q;)@``(&P#`6!L`P%
+M@;`,!8&P#`6!L`P%%)D``-`'``#0!P``3`0``)@(``#0!P``1)D``"`0N/<@
+M$+CW$`VX]Q`0N/<0$+CW!*(`````````````"`````@````(````"*(``(AG
+MOM:(9[[6B&<^T(AG/M"(9S[0#*(``$`!+&1``2QD8,%"9&#!0F1@P4)D'*(`
+M``J`@Q@*@(,8"H!S&`J`@Q@*@(,8,!(````````(F````````"R8``#^+P(`
+M/)@````!`@!,F```/&&$$C"9``""2```0)D```0```!8F0``_P```'29````
+M````**(``+4!```\H@``KXG($P2;```!````")L```(````,FP```P```!";
+M```$````%)L```4````8FP``"````!R;```)````()L```H````DFP``"P``
+M`"R;```-````,)L``!`````TFP``$0```#R;```3````0)L``!0```!$FP``
+M%0```$B;```8````3)L``!D```!0FP``&@```%2;```;````6)L``!P```!<
+MFP``'0```&";```@````:)L``"(```!LFP``(P```'";```D````=)L``"4`
+M``!XFP``*````'R;```I````@)L``"H```"$FP``*P```(B;```L````D)L`
+M`#````"4FP``,0```)B;```R````H)L``#0```"DFP``-0```*B;```U````
+MK)L``#4```"PFP``-0```+2;```U````N)L``#4```"\FP``-0```,";```U
+M````Q)L``#4```#(FP``-0```,R;```U````T)L``#4```#4FP``-0```-B;
+M```U````W)L``#4```#@FP``-0```.2;```U````Z)L``#4```#LFP``-0``
+M`/";```U````])L``#4```#XFP``$````/R;```:`````)H```<````'````
+M!)H``$<```!'````")H``(<```"'````#)H``*`!``"@`0``$)H``.`!``#@
+M`0``%)H``"`````@````&)H``&````!@````')H``*$!``"A`0``()H``.$!
+M``#A`0``))H``"$````A````*)H``&$```!A````+)H``&(!``!B`0``,)H`
+M`*(!``"B`0``-)H``.(!``#B`0``.)H``"(````B````/)H``&(```!B````
+M0)H``&,!``!C`0``1)H``*,!``"C`0``2)H``.,!``#C`0``3)H``",````C
+M````4)H``&,```!C````5)H``(0!``"$`0``6)H``,0!``#$`0``7)H```0`
+M```$````8)H``.H!```+````9)H``"H```!+````:)H``&H```"+````;)H`
+M`*H```"L`0``<)H``*L!``#L`0``=)H``.L!```L````>)H``"L````2````
+M?)H``&L```!2````@)H``*L```"2````A)H``*P!``"3`0``B)H``.P!``#3
+M`0``C)H``"P````3````D)H``#H```!3````E)H``'H```"3````F)H``+H`
+M``"4`0``G)H``+L!``#4`0``H)H``/L!```4````I)H``#L````Z````J)H`
+M`'L```!Z````K)H``+L```"Z````L)H``+P!``"[`0``M)H``/P!``#[`0``
+MN)H``#P````[````O)H``'P```![````P)H``+P```"[````Q)H``/P```"\
+M`0``R)H``/P```#\`0``S)H``/P````\````T)H``/P```!\````U)H``/P`
+M``"\````V)H``/P```#\````W)H``/P```#\````X)H``/P```#\````Y)H`
+M`/P```#\````Z)H``/P```#\````[)H``/P```#\````\)H``/P```#\````
+M])H``/P```#\````^)H``/P```#\````_)H``/P```#\````U)@``"````#0
+MF```"`0&`P@$!P,(!`8#"`0&`P@$!P/<F```P""@`,`@H`#`(.``P"#@`,`@
+MX`"<F```````#P````\````/````#P````^<F```````````````````````
+M``````"<F`````"`````@````(````"`````@`"<F``````J````*@```"H`
+M```J````*@"<F``````!`````0````$````!`````0"<F```````````````
+M``````````````"<F``````8````&````!@````8````&`"<F`````!@````
+M8````&X```!N````;@"<F`````#'````QP```,<```#'````QP"<F`````!+
+M````2P```$L```!+````2P"<F`````!(!```2`0``$@$``!(!```2`2<F```
+M``!,````3````$P```!,````3`"<F`````#D````Y````.0```#D````Y`"<
+MF`````````````````````````````"<F`````#\````_````/P```#\````
+M_`"<F`````#_````_P```/\```#_````_P"<F``````_!```/P0``#\$```_
+M!```/P2<F``````,````#`````P````,````#`"<F``````9`@``&0(``!D"
+M```9`@``&0*<F``````D````)````"0````D````)`"<F`````"T````M```
+M`+0```"T````M`"<F`````"9````F0```)D```"9````F0"<F`````!0````
+M4````%````!0````4`"<F``````J````*@```"H````J````*@"<F``````2
+M````$@```!(````2````$@"<F``````RP```,L```#+````RP```,L"<F```
+M``!T`0``=`$``'0!``!T`0``=`&<F``````1````$0```!$````1````$0"<
+MF``````HA@``*(8``"B&```HA@``*(:<F`````"$,0``A#$``(0Q``"$,0``
+MA#&<F```@`#R`(``\@"``/(`@`#R`(``\@"<F```&0`G`!D`)P`9`"<`&0`G
+M`!D`)P"<F````P````,````#`````P````,```"<F```````````````````
+M``````````"<F```L@```+(```"R````L@```+(```"<F```A""P`(0@L`"$
+M(+``A""P`(0@L`"<F```I"5!`*0E00"D)4$`I"5!`*0E00"<F```()(1`""2
+M$0`@DA$`()(1`""2$0"<F````$@:``!(&@``2!H``$@:``!(&@#8F```,`(+
+M`#`""P`P`@L`,`(+`#`""P"<F```E````)0```"4````E````)0```"<F```
+MD0```)$```"1````D0```)$```"<F```$@```!(````2````$@```!(```"<
+MF```@````(````"`````@````(````"<F```V0```-D```#9````V0```-D`
+M``"<F```8````&````!@````8````&````"<F```\````/````#P````\```
+M`/````"<F```H@```*(```"B````H@```*(```"<F```4@```%(```!2````
+M4@```%(```"<F```U````-0```#4````U````-0```"<F```S!0``,P4``#,
+M%```S!0``,P4``"<F```C`0``(P$``",!```C`0``(P$``#$F````P````,`
+M```#`````P````,````H,P(`,#,"`#@S`@!0,P(`4#,"`$`S`@!(,P(`````
+M````````````,````!4````5````%0```!4````5````'(```*>3C1+/$X@)
+ME1/@!*L3X!+/$X@)*)@```$``@H!``(*```"!0$``@H!``(*-)@````.````
+M#@````X````.````#@``.)@```(````"````"@````H````*````2)@``&W:
+M&`!MVA@`9&H:`&1J&@!D:AH`4)@``."TZ`W@M.@-VK#H#=JPF`S:L.@-6)@`
+M`"X-@'XN#8!^+@WH?BX-R'XN#8!^7)@``%YF-S%>9C<Q7F8W,5Y@.3%>9C<Q
+M;)@``(&P#`6!L`P%@;`,!8&P#`6!L`P%%)D``-`'``#0!P``3`0``)@(``#0
+M!P``1)D````0N/<`$+CW``VX]P`0N/<`$+CW!*(`````````````````````
+M````````"*(``(AGOM:(9[[6B&<^T(AG/M"(9S[0#*(``$`!+`!``2P`0,%"
+M`$#!0@!`P4(`'*(```J`@Q@*@(,8"H!C&`J`@Q@*@(,8,!(``.`#``!@@```
+M#P```!B!````````'($````````@@0```````"2!````````*($````````L
+M@0```````#"!````````-($````````X@0```````#R!````````0($``*@`
+M`(!$@0````````B8````````+)@```"@```\F`````0@`$R8```\(X02<)@`
+M`!\```!TF```@````'B8```.````6)D``/\```"`F0```````(29`````(`"
+MH)D```````#@F0```````.29``"JJJJJZ)D``'AD1CSLF0``J@```/"9```,
+M````])D``/\```#XF0``%````"BB``"U"0``/*(``*^)R)-,H@```0```%"B
+M````H```5*(```````!8H@``@%/'#%RB```!#P\/8*(```$/:5]DH@``$8I!
+M`&BB````````;*(``&K!,`QPH@``(`B"`'2B``"J?!L`>*(``,XYYQQ\H@``
+MS@$7!0"C``````$8!*,```(F`S`(HP``!CX'2`RC```*3`M6$*,```]@&F04
+MHP``&VY/>!BC``!:?(^&'*,``%N&SXX@HP``#Y=/G22C``"/H<^E**,``!^O
+M7[4LHP``G[G?O3"C```_QW_--*,``+_1_]4XHP```````#RC````````0*,`
+M``````!$HP```````$BC``#___\_3*,``/___S]0HP``____/U2C``#__P,`
+M6*,``!^JJ'E<HP``#T)L!F"C```'(B@/9*,``(468!=HHP``!!&`'VRC```#
+M#*`W<*,``(,(Q#]THP```PC`5WBC``""!MA??*,``(($X'^`HP``NGL\?X2C
+M``#P?S#S!)L```$````(FP```@````R;```#````$)L```0````4FP``!0``
+M`!B;```(````')L```D````@FP``"@```"2;```+````+)L```T````PFP``
+M$````#2;```1````/)L``!,```!`FP``%````$2;```5````2)L``!@```!,
+MFP``&0```%";```:````5)L``!L```!8FP``'````%R;```=````8)L``"``
+M``!HFP``(@```&R;```C````<)L``"0```!TFP``)0```'B;```H````?)L`
+M`"D```"`FP``*@```(2;```K````B)L``"P```"0FP``,````)2;```Q````
+MF)L``#(```"@FP``-````*2;```U````J)L``#4```"LFP``-0```+";```U
+M````M)L``#4```"XFP``-0```+R;```U````P)L``#4```#$FP``-0```,B;
+M```U````S)L``#4```#0FP``-0```-2;```U````V)L``#4```#<FP``-0``
+M`.";```U````Y)L``#4```#HFP``-0```.R;```U````\)L``#4```#TFP``
+M-0```/B;```0````_)L``!H`````F@`````````````$F@```````$`````(
+MF@```````(`````,F@```````($!```0F@```````,$!```4F@````````$`
+M```8F@```````$$````<F@```````($````@F@```````&@!```DF@``````
+M`*@!```HF@```````.@!```LF@```````"@````PF@```````&@````TF@``
+M`````(D!```XF@```````,D!```\F@````````D```!`F@```````$D```!$
+MF@```````(D```!(F@```````)`!``!,F@```````-`!``!0F@```````!``
+M``!4F@```````%````!8F@```````)````!<F@```````)$!``!@F@``````
+M`-$!``!DF@```````!$```!HF@```````%$```!LF@```````)$```!PF@``
+M`````'@!``!TF@```````+@!``!XF@```````/@!``!\F@```````#@```"`
+MF@```````'@```"$F@```````)D!``"(F@```````-D!``",F@```````!D`
+M``"0F@```````%D```"4F@```````)D```"8F@```````-D```"<F@``````
+M`/D```"@F@```````/D```"DF@```````/D```"HF@```````/D```"LF@``
+M`````/D```"PF@```````/D```"TF@```````/D```"XF@```````/D```"\
+MF@```````/D```#`F@```````/D```#$F@```````/D```#(F@```````/D`
+M``#,F@```````/D```#0F@```````/D```#4F@```````/D```#8F@``````
+M`/D```#<F@```````/D```#@F@```````/D```#DF@```````/D```#HF@``
+M`````/D```#LF@```````/D```#PF@```````/D```#TF@```````/D```#X
+MF@```````/D```#\F@```````/D```#4F```(````-"8```(%``""!0!`@@4
+M``((%``""!0!`MR8``#`(*``P""@`,`@X`#`(.``P"#@`)R8``````#P````
+M\````/````#P````\)R8`````````````````````````````)R8```````#
+M`````P````,````#`````YR8`````````````````````````````)R8````
+M`````````````````````````)R8`````````````````````````````)R8
+M`````````````````````````````)R8````````````````````````````
+M`)R8`````$!```!`0```0$```$!```!`0)R8``````5E```%90``!64```5E
+M```%99R8`````````````````````````````)R8````````````````````
+M`````````)R8`````$(```!"````0@```$(```!"`)R8`````+4```"U````
+MM0```+4```"U`)R8``````,````#`````P````,````#`)R8`````/<```#W
+M````]P```/<```#W`)R8`````)T```"=````G0```)T```"=`)R8`````"(`
+M```B````(@```"(````B`)R8`````"($```B!```(@0``"($```B!)R8```8
+M`",`&``C`!@`(P`8`",`&``C`)R8`````"@````H`&``*`!@`"@`8``H`)R8
+M``#``%``P`!0`,,`4`##`%``PP!0`)R8``!_``0`?P`$`'\`!`!_``0`?P`$
+M`)R8``!8!```6`0``%@$``!8!```6`0``)R8````````````````````````
+M`````)R8````P````,````#`````P````,```-B8```P`D``,`)``#`"0``P
+M`D``,`)``)R8````9````&0```!D````9````&0``)R8````"`````@````(
+M````"`````@``,R8```.````#@````X````.````#@```"1;`@`L6P(`-%L"
+M`$Q;`@!,6P(`/%L"`$1;`@``````,````!4````5````%0```!4````5````
+M'(```*>3C1+/$X@)E1/@!*L3X!+/$X@)*)@```$``@H!``(*``$"!0$``@H!
+M``(*-)@```X.```.#@``#@X```X.```.#@``.)@```<````'````"P````L`
+M```+````2)@``&'Z&`!A^A@`8QH:`&,:&@!C&AH`4)@``."TF`S@M)@,VK"8
+M#-JPF`S:L)@,6)@``"X-R'XN#<A^+@W(?BX-R'XN#<A^7)@``%Y@.3%>8#DQ
+M7F`Y,5Y@.3%>8#DQ;)@``(&P#`6!L`P%@;`,!8&P#`6!L`P%%)D``-`'``#0
+M!P``3`0``)@(``#0!P``1)D````0N/<`$+CW``VX]P`0N/<`$+CW!*(`````
+M````````````````````````"*(``(AGOM:(9[[6B&<^T(AG/M"(9S[0#*(`
+M`.#!+@#@P2X`(,$J`"#!*@`@P2H`'*(```J`@Q@*@(,8"H!C&`J`@Q@*@(,8
+M`*,``````1@```$8```!&````1@```$8!*,```(F`S`")@,P`B8#,`(F`S`"
+M)@,P"*,```8^!T@&/@=(!CX'2`8^!T@&/@=(#*,```I,"U8*3`M6"DP+5@I,
+M"U8*3`M6$*,```]@&F0/8!ID#V`:9`]@&F0/8!ID%*,``!MN3W@;;D]X&VY/
+M>!MN3W@;;D]X&*,``%I\CX9:?(^&6GR/AEI\CX9:?(^&'*,``%N&SY!;AL^0
+M6X;/CEN&SXY;AL^.(*,```^73YT/ET^=#Y=/FP^73YL/ET^;)*,``(^CSZ>/
+MH\^GCY_/HX^?SZ./G\^C**,``!^O7[4?KU^U'Z]?LQ^O7[,?KU^S+*,``)^Y
+MW[V?N=^]G[G?NY^YW[N?N=^[,*,``#_%?\L_Q7_+/\=_RS_'?\L_QW_+-*,`
+M`+_1_]6_T?_5O]'_T[_1_]._T?_3,!(``.`#``!H0```$````&"````/````
+MG(````````"@@````````!B!````````'($````````@@0```````"2!````
+M````*($````````L@0```````#"!````````-($````````X@0```````#R!
+M````````0($``/D#`(!$@0````````B8````````+)@```"@```\F`````0@
+M`$R8```\(X02<)@``!\```!TF```@````'B8```.````6)D``/\?"`"`F0``
+M`````(29`````(`"H)D```````#@F0```````.29``"JJJJJZ)D``'AD1CSL
+MF0``J@```/"9```,````])D``/\```#XF0``%````"BB``"U"0``/*(``*^)
+MR)-,H@```0```%"B````H```5*(```````!8H@``@%/'#%RB```!#P\/8*(`
+M``$/:5]DH@``$8I!`&BB````````;*(``&K!,`QPH@``(`B"`'2B``"J?!L(
+M>*(``,XYYQQ\H@``S@$7!3BC````````/*,```````!`HP```````$2C````
+M````2*,``/___S],HP``____/U"C``#___\_5*,``/__`P!8HP``'ZJH>5RC
+M```/0FP&8*,```<B*`]DHP``A19@%VBC```$$8`?;*,```,,H#=PHP``@PC$
+M/W2C```#",!7>*,``((&V%]\HP``@@3@?X"C``"Z>SQ_A*,``/!_,/,$FP``
+M`0````B;```"````#)L```,````0FP``!````!2;```%````&)L```@````<
+MFP``"0```"";```*````))L```L````LFP``#0```#";```0````-)L``!$`
+M```\FP``$P```$";```4````1)L``!4```!(FP``&````$R;```9````4)L`
+M`!H```!4FP``&P```%B;```<````7)L``!T```!@FP``(````&B;```B````
+M;)L``",```!PFP``)````'2;```E````>)L``"@```!\FP``*0```(";```J
+M````A)L``"L```"(FP``+````)";```P````E)L``#$```"8FP``,@```*";
+M```T````I)L``#4```"HFP``-0```*R;```U````L)L``#4```"TFP``-0``
+M`+B;```U````O)L``#4```#`FP``-0```,2;```U````R)L``#4```#,FP``
+M-0```-";```U````U)L``#4```#8FP``-0```-R;```U````X)L``#4```#D
+MFP``-0```.B;```U````[)L``#4```#PFP``-0```/2;```U````^)L``!``
+M``#\FP``&@````":``````````````2:``!`````0`````B:``"`````@```
+M``R:``"A`0``80$``!":``#A`0``H0$``!2:```A````X0$``!B:``!A````
+M(0```!R:``"(`0``80```"":``#(`0``B`$``"2:```(````R`$``"B:``!(
+M````"````"R:``"(````2````#":``"I`0``B````#2:``#I`0``:0$``#B:
+M```I````J0$``#R:``!I````Z0$``$":``#0`0``*0```$2:```0````:0``
+M`$B:``!0````D`$``$R:``"0````T`$``%":``"Q`0``$````%2:``#Q`0``
+M4````%B:```Q````D````%R:``!Q````<0$``&":``"X`0``L0$``&2:``#X
+M`0``\0$``&B:```X````,0```&R:``!X````<0```'":``"9`0``F`$``'2:
+M``#9`0``V`$``'B:```9````&````'R:``!9````6````(":``"9````F```
+M`(2:``#9````>0$``(B:``#Y````N0$``(R:``#Y````^0$``)":``#Y````
+M.0```)2:``#Y````>0```)B:``#Y````N0```)R:``#Y````^0```*":``#Y
+M````^0```*2:``#Y````^0```*B:``#Y````^0```*R:``#Y````^0```+":
+M``#Y````^0```+2:``#Y````^0```+B:``#Y````^0```+R:``#Y````^0``
+M`,":``#Y````^0```,2:``#Y````^0```,B:``#Y````^0```,R:``#Y````
+M^0```-":``#Y````^0```-2:``#Y````^0```-B:``#Y````^0```-R:``#Y
+M````^0```.":``#Y````^0```.2:``#Y````^0```.B:``#Y````^0```.R:
+M``#Y````^0```/":``#Y````^0```/2:``#Y````^0```/B:``#Y````^0``
+M`/R:``#Y````^0```-28```@````T)@```@````(````"`````@````(````
+MW)@``,``H`#``*``P`#@`,``X`#``.``G)@``````#,````S````,P```#,`
+M```SG)@```````$````!`````0````$````!G)@`````````````````````
+M````````G)@`````````````````````````````G)@`````````````````
+M````````````G)@``````!\````?````'P```!\````?G)@`````````````
+M````````````````G)@`````N````+@```"X````N````+@`G)@`````MP``
+M`+<```"W````MP```+<`G)@`````A````(0```"$````A````(0`G)@`````
+MF````)@```"8````F````)@`G)@`````P````,````#`````P````,``G)@`
+M````_P```/\```#_````_P```/\`G)@`````_P```/\```#_````_P```/\`
+MG)@`````_P```/\```#_````_P```/\`G)@`````_P```/\```#_````_P``
+M`/\`G)@`````UP```-<```#7````UP```-<`G)@`````80```&$```!A````
+M80```&$`G)@`````_@```/X```#^````_@```/X`G)@`````W@```-X```#>
+M````W@```-X`G)@`````?P```'\```!_````?P```'\`G)@`````/00``#T$
+M```]!```/00``#T$G)@`````=P```'<```!W````=P```'<`G)@`````1```
+M`$0```!$````1````$0`G)@`````F````)@```"8````F````)@`G)@``(``
+M$`"``!``@``0`(``$`"``!``G)@``#3`!0`TP`4`-,`%`#3`!0`TP`4`G)@`
+M`/``,0#P`#$`\``Q`/``,0#P`#$`G)@``!\!#``?`0P`'P$,`!\!#``?`0P`
+MG)@``$``40!``%$`0`!1`$``40!``%$`G)@``-H`4`#:`%``V@!0`-H`4`#:
+M`%``G)@`````````````````````````````G)@``$1```!$0```1$```$1`
+M``!$0```G)@`````````````````````````````G)@``,!@``#`8```P&``
+M`,!@``#`8```G)@````L````+````#8````V````+```R)@```,$```#!```
+M`P0```,$```#!```G)@```!D````9````&0```!D````9```G)@````(````
+M"`````@````(````"```S)@```X````.````#@````X````.````6'H"`&!Z
+M`@!H>@(`@'H"`(!Z`@!P>@(`>'H"`````````````````#`N.2XR,"XS````
+M`&`!``!H`0``<`$``'@!``"``0``B`$``)`!``"8`0```````(@!\`#S`(D!
+M@`"#`(H!\@#U`(L!]@#W`(P!\0#T`(T!@0"$`(\!@@"%````90````$```#_
+M____@````/____\`````2E```+0/````````:@````$```#_____@````/__
+M__\`````2E```+0/````````0`#P`/,`B('P`/,`00"``(,`B8&``(,`2`#R
+M`/4`BH'R`/4`0P#V`/<`BX'V`/<`2@#Q`/0`C('Q`/0`2P"!`(0`C8&!`(0`
+M3`""`(4`CX&"`(4`"`E$"04&*"@```````````````````````````````"%
+M"84)!08H*````````````````````````````````(4)A0D4!B@H````````
+M````````````````````````A0F%"1(&*"@````````````$````````````
+M``````#0":P*!08H*`````````````````````````````````@)1`D%!A0%
+M````````````````````````````````"`E$"10`%`4`````````````````
+M``````````````!L":@)!084!0```````````````````````````````&P)
+MJ`D4`!0%``````````!`````````````````````;`FH"1X`%`4`````````
+M``````````````````````!L"9X)&P84!0``````````````````````````
+M`````&P)G@D4`!0%``````````!`````````````````````@`F*"10`%`4`
+M``````````````````````````````"9":@)%``4!0``````````````````
+M`````````````-`)K`H%!A0%````````````````````````````````HPFH
+M"10`%`4``````````"`@```````````````````("40)%``4!0``````````
+M`````````````````````&P);`D4`!0%````````````````````````````
+M````<0F`"10`%`4```````````````````````````````"%"8H)%``4!0``
+M`````````````````````````````(\)F0D4`!0%````````````````````
+M````````````G@F>"10`%`4```````````````````````````````"C":,)
+M%``4!0````````````0``````(```````````*,)HPD4`!0%````````````
+M````````@```````````J`FH"10`%`4````````````$``````"`````````
+M``"H":@)%``4!0```````````````````(````````````@)1`D%!A0%````
+M````````````````````````````"`E$"10`%`4`````````````````````
+M``````````!L":@)!084!0```````````````````````````````&P)J`D4
+M`!0%```````````@````````````````````;`FH"1X`%`4`````````````
+M``````````````````!L"9X)&P84!0``````````````````````````````
+M`&P)G@D4`!0%```````````@````````````````````@`F*"10`%`4`````
+M``````````````````````````"9":@)%``4!0``````````````````````
+M`````````*,)J`D4`!0%```````````@(```````````````````M`FT"04&
+M%`4```````````````````````````````"T";0)%``4!0``````````("@`
+M`````````````````-`)K`H%!A0%````````````````````````````````
+M"`E$"10`%`4```````````````````````````````!L"6P)%``4!0``````
+M`````````````````````````'$)@`D4`!0%````````````````````````
+M````````A0F*"10`%`4```````````````````````````````"/"9D)%``4
+M!0```````````````````````````````)X)G@D4`!0%````````````````
+M````````````````HPFC"10`%`4````````````$``````"```````````"C
+M":,)%``4!0```````````````````(```````````*@)J`D4`!0%````````
+M````!```````@```````````J`FH"10`%`4```````````````````"`````
+M``````"T";0)%``4!0````````````0``````(```````````+0)M`D4`!0%
+M````````````````````@```````````"A1:%`4&*"@`````````````````
+M``````````````""%-(4!08H*`$``````````````````````````````/H4
+M<A4%!B@H````````````````````````````````FA42%@4&*"@!````````
+M```````````````````````>%$84!08H*```````````````````````````
+M`````&X4OA0%!B@H`0``````````````````````````````YA1>%04&*"@`
+M``````````````````````````````"&%286!08H*`$`````````````````
+M`````````````%`4>!01!B@H````````````````````````````````4!1X
+M%!<&*"@```````````````````````````````!:%%H4$08H*```````````
+M`````````````````````%H46A07`"@H````````````````````````````
+M````H!2@%!<&*"@!``````````(```````````````````"@%*`4%`8H*`$`
+M`````````@```````````````````((4@A01`"@H`0`````````"````````
+M````````````JA2J%!0`*"@!``````````(```````````````````""%*H4
+M%``H*`$``````````@```````````````````((4JA07!B@H`0`````````"
+M````````````````````I!4<%A0&*"@!``````````(`````````````````
+M``"`%J@6%``H*````````````````````````````````(`6J!8>!B@H````
+M````````````````````````````A1:M%AX&*"@`````````````````````
+M``````````!:%((4#P`H*`,```````````0``````````````````*H4JA02
+M`"@H`P``````````!```````````````````I!4<%A0`*"@#```````````$
+M``````````````````"`%J@6%``H*`````````````0`````````````````
+M`#,3/1,7``H%```````````0`````````!``````````1Q-1$Q<`"@4`````
+M`````!``````````$``````````X$W03%P`4%```````````$``````````'
+M`````````$X3>Q,;!@4%```````````!````````````````````41-Y$QX&
+M"@4```````````$```````````````````!6$W03(084!0```````````0``
+M`````````````````*L3L!,7``H%```````````0``````````P`````````
+ML!/8$Q<`%!0``````````!```````````@````````"_$[\3%P`*!0``````
+M````$``````````,```````````4>!0%!A04````````````````````````
+M````````,A1N%!<`%!0``````````!@``````````0`````````R%&X4%``4
+M%```````````&``````````!`````````#P4>!0/`!04```````````%````
+M````````````````/!1X%!$&%!0```````````$``````````0`````````\
+M%'@4$@`4%```````````!0```````````````````#P4>!04`!04````````
+M```%````````````````````/!1X%!<`%!0```````````4`````````````
+M```````\%'@4%P84%````````````0```````````````````#P4R!04!A04
+M`@`````````$````````````````````>!2@%!<`%!0!``````````4`````
+M``````````````",%*`4%P`4%`,`````````!0```````````````````(P4
+MR!02`!04`P`````````%````````````````````C!3(%!0`%!0'````````
+M``6```````````````````",%,@4%`84%`,``````````0`````````"````
+M`````(P4R!07!A04`P`````````!``````````(`````````C!3(%!<&%!0#
+M``````````$```````````````````",%,@4'@`4%```````````````````
+M`````````````(P41!8%!A04`P``````````````````````````````H!3(
+M%!$&%!0#``````````$```````````````````!\%?05'@84%`(`````````
+M!````````````````````'P51!84!A04`P`````````!``````````0`````
+M````?!5$%AL`%!0#``````````4```````````````````!\%406'@`4%`,`
+M````````!0```````````````````'P51!87`!04!P`````````!@```````
+M````````````<1:M%A<`%!0```````````````````````````````!Q%JT6
+M'@84%````````````````````````````````'$6K18>!A04`@`````````$
+M````````````````````<1;!%@4&%!0`````````````````````````````
+M``!Q%L$6$0`4%````````````````````````````````'$6P184`!04````
+M````````````````````````````<1;!%AX`%!0`````````````````````
+M``````````!Q%L$6'@84%``````````````````````#`````````'$6P18>
+M!A04````````````````````````````````.!-T$QX`%!0````````````$
+M``````````````````"P$]@3'@`4%`````````````0`````````````````
+M`#(4;A0>`!04`P``````````!```````````````````/!1X%!X`%!0#````
+M```````$``````````````````",%,@4'@`4%`,```````````0`````````
+M`````````'$6P18>`!04````````````!```````````````````?!5$%AX`
+M%!0#```````````$``````````````````",%,@4'@`4%```````````````
+M`````````````````#P4>!0>`!04````````````````````````````````
+MP1;!%AX`%!0````````````$`````````````````````/\!_P$`````````
+M````_________W\```````````,`F`&9`0````````````#_________?P``
+M````````!P"8`3`+`````````````/________]_```````````(`)@!,`P`
+M````````````_________W\``````````"``(`$0"@````````````#_____
+M____?P``````````(0`@`9D!`````````````/________]_```````````B
+M`"`!,`P`````````````_________W\``````````#H`8`$0"@``````````
+M``#_________?P``````````.P!@`9D!`````````````/________]_````
+M```````2`&4!$`H```,`````````_________W\``````````#<`,`&9`0``
+M`P````````#_________?P``````````-0`P`ID!```#`````````/______
+M__]_```````````V`#`#F0$```,`````````_________W\``````````#``
+M,`29`0```P````````#_________?P``````````.0`P!9D!```#````````
+M`/________]_```````````T`#`&F0$```,`````````_________W\`````
+M`````#(`,`.9`0```P````````#_________?P``````````,0`P`YD!````
+M`````````/________]_```````````1`!`!F0$`````````````________
+M_W\``````````!``$`$0"@````````````#_________?P``````````4@!0
+M`9D!`````````````/________]_``````````!%`%`"F0$`````````````
+M_________W\``````````$<`4`.9`0````````````#_________?P``````
+M````0@!0!)D!`````````````/________]_``````````!8`%`%F0$`````
+M````````_________W\``````````%L`4`:9`0````````````#_________
+M?P``````````70!0")D!`````````````/________]_``````````!>`%`)
+MF0$`````````````_________W\``````````%``4`,0"@````````````#_
+M________?P``````````50!0`3`,`````````````/________]_````````
+M``!6`%`",`P`````````````_________W\``````````$D`4`)0#0``````
+M``````#_________?P``````````0`!``4`*``!&````!````"@`````````
+MB`$```````!!`$`!0`H``$<````$````:`````````")`0```````$@`0`$0
+M"@``1@````0````(`````````(H!````````2@!``4`*``!&````!`````@8
+M````````C`$```````!+`$`!0`H``$8````$````"&````````"-`0``````
+M`$P`0`%0"@``1@````0````(`````````(\!````````0P!``D`*``!'````
+M!````'``````````BP$```````#P`$`#0`H``$8````$````(```````````
+M`````````(``0`-`"@``1P````0```!@`````````*</````````\0!``T`*
+M``!&````!``````8``````````````````"!`$`#0`H``$8````$`````&``
+M``````"H#P```````((`0`-0"@``1@````0``````````````*D/````````
+M\@!``Q`*``!&````!`````````````````````````"#`$`$0`H``$<````$
+M````8(````````"J#P```````/0`0`1`"@``1@````0`````F```````````
+M````````A`!`!$`*``!&````!`````#@````````JP\```````"%`$`$4`H`
+M`$8````$`````(````````"L#P```````/4`0`00"@``1@````0`````@```
+M````````````````A@!`!4`*``!'````!````&"`````````K0\```````"'
+M`$`%0`H``$8````$`````.````````"N#P```````(@`0`50"@``1@````0`
+M````@````````*\/````````B0!`!D`*``!'````!````&@`````````L`\`
+M``````"*`$`&0`H``$8````$````"&````````"Q#P```````(L`0`90"@``
+M1@````0````(`````````+(/````````C`!`!T`*``!'````!````&B`````
+M````LP\```````"-`$`'0`H``$8````$````".````````"T#P```````(X`
+M0`=0"@``1@````0````(@````````+4/````````CP!`"$`*``!'````!```
+M`&B`````````M@\```````"0`$`(0`H``$8````$````".````````"W#P``
+M`````)$`0`A0"@``1@````0````(@````````+@/````````]@!`"4`*``!'
+M````!````&"```````````````````#W`$`+0`H``$<````$````8(``````
+M`````````````&``8`!@``````````````#_________?P``````````80!A
+M`&$````#`````````/________]_``````````!B`&(`8@````(`````````
+M_________W\``````````&,`8P!C``````````````#_________?P``````
+M````9`!D`&0````#`````````/________]_``````````!E`&4`90````,`
+M````````_________W\``````````&8`9@!F``````````````#_________
+M?P``````````9P!G`&<``````````````/________]_``````````!H`&@`
+M:```````````````_________W\``````````&D`:0!I`````P````````#_
+M________?P``````````:@!J`&H````#`````````/________]_````````
+M``#_`0```0````$````!````6!L`````$``!`````0````$```!8&P``"``#
+M``$``````````0```%@;```,``,``0`````````!````6!L``"``1P``````
+M``````````!8&P``,P`P``$``````````0```%@;```D`"$``0````$````!
+M````6!L``"@`-P`!``````````$```!8&P``'P`P``$````!`````0```%@;
+M```P`%L``0`````````!````6!L``'```P`!``````````$```!8&P``.``W
+M``$``````````0```%@;``!4`%4``0````$````!````6!L``$0`50`!````
+M`0````$```!8&P``3``[``$``````````````%@;``!@`%(``0````$````!
+M````6!L``&0`-``!``````````$```!8&P``?``@``$````!`````0```%@;
+M``"8`%L``0````$````!````6!L``)P`4@`!`````0````$```!8&P``J@`0
+M``$``````````0```%@;``"\``,``0`````````!````6!L``+\`-@`!````
+M``````$```!8&P``Q``W``$````!`````0```%@;``#+`#<``0`````````!
+M````6!L``-``-P`!``````````$```!8&P``U@`0``$````!`````0```%@;
+M``#:``,`````````````````6!L``#(#-@`!``````````$```!8&P``W@`#
+M``$``````````0```%@;``#I`#<``0`````````!````6!L``/8`-P`!````
+M``````$```!8&P``^@`W``$``````````0```%@;``#_`#8``0`````````!
+M````6!L```P!,``!`````0````$```!8&P``%`$W``$``````````0```%@;
+M```L`3<``0`````````!````6!L``$`!$``!`````0````$```!8&P``5`$#
+M``$``````````0```%@;``!8`2$``0````$````!````6!L``%P!-P`!````
+M``````$```!8&P``8`$W``$``````````0```%@;``!D`5L``0`````````!
+M````6!L``&@!4@`!``````````$```!8&P``;`%2``$````!`````0```%@;
+M``!T`3<``0`````````!````6!L``'@!`P`!``````````$```!8&P``?`$W
+M``$``````````0```%@;``"(`4```0``````````````6!L``(D!00`!````
+M``````````!8&P``B@%(``$``````````````%@;``"+`4,``0``````````
+M````6!L``(P!2@`!``````````````!8&P``C0%+``$``````````````%@;
+M``"/`4P``0``````````````6!L``*</@``!``````````````!8&P``J`^!
+M``$``````````````%@;``"I#X(``0``````````````6!L``*H/@P`!````
+M``````````!8&P``JP^$``$``````````````%@;``"L#X4``0``````````
+M````6!L``*T/A@`!``````````````!8&P``K@^'``$``````````````%@;
+M``"O#X@``0``````````````6!L``+`/B0`!``````````````!8&P``L0^*
+M``$``````````````%@;``"R#XL``0``````````````6!L``+,/C``!````
+M``````````!8&P``M`^-``$``````````````%@;``"U#XX``0``````````
+M````6!L``+8/CP`!``````````````!8&P``MP^0``$``````````````%@;
+M``"X#Y$``0``````````````6!L``)`!0@`!``````````$```!8&P``C@$#
+M``$``````````0```%@;``"8`44``0````$````!````6!L``)H!10`!````
+M``````````!8&P``FP%%``$``````````````%@;``"<`5X``0``````````
+M````6!L``)X!`P`!``````````$```!8&P``K`$W``$``````````0```%@;
+M``"F`0,``0`````````!````6!L``+8!-P`!``````````$```!8&P``N`$W
+M``$``````````0```%@;``"Z`3<``0`````````!````6!L``+X!(0`!````
+M`0````$```!8&P``)P,#``$``````````0```%@;``#*`5T``0``````````
+M````6!L``-8!-P`!``````````$```!8&P``Y`$0``$````!`````0```%@;
+M``#L`3```0````$````!````6!L``/@!`P`!``````````$```!8&P``$`(W
+M``$``````````0```%@;```J`B(``0`````````!````6!L``$("-P`!````
+M``````$```!8&P````);``$``````````0```%@;``!*`@,``0`````````!
+M````6!L``$\"$``!`````0````$```!8&P``7`)2``$``````````0```%@;
+M``!@`CL``0````$````!````6!L``&@"-P`!``````````$```!8&P``;`(W
+M``$``````````0```%@;``!V`A```0````$````!````6!L``'H"`P`!````
+M``````$```!8&P``@@(#``$``````````0```%@;``"#`@,``0`````````!
+M````6!L``*H"(0`!``````````$```!8&P``O@);``$````!`````0```%@;
+M``"_`C<``0`````````!````6!L``,$"-P`!``````````$```!8&P``Q@([
+M``$``````````0```%@;``#4`C<``0`````````!````6!L``/`"-P`!````
+M``````$```!8&P``]`(W``$``````````0```%@;``#X`@,``0`````````!
+M````6!L``)X`4``!`````0````$```!8&P``_`(#``$``````````0```%@;
+M```,`S```0`````````!````6!L``!0#-@`!``````````$```!8&P``&`,V
+M``$``````````0```%@;```D`P,``0`````````!````6!L``!`#`P`!````
+M``````$```!8&P``.@,W``$``````````0```%@;``!(`Q```0````$````!
+M````P18``$H#$@`!`````0````$```!8&P``6@,1``$``````````0```%@;
+M``!<`SH``0````$````!````6!L``%X#5@`!``````````$```!8&P``P`(#
+M``$``````````0```%@;``!W`P,``0`````````!````6!L``,P"`P`!````
+M``````$```!8&P```````/\!$````````0``````````````````````````
+M``````(`""```````````````/\`````````````````````$20`````````
+M````````!10```````````````````4"```````````````````3````````
+M````````````4`$0````````````````````````````````````````````
+M``$`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``!0`A`````````````````````````````````````````````$````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````%`#$```
+M````````````````````````````````````````$`@`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````4`00````````````
+M````````````````````````````@```@```````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````!0!1``````````````````````
+M``````````````````````!`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````%`&,````````@`````````#````````````
+M`````````(!``(`````````````````("0``````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````4`@P`````````````````````````````P``````````
+M```$``$`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````!0"3````````(`````````!``````````#````````````!"`0````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````#`!
+M,````````@`````````$``````````,```````````!`@```"```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````,`(P```````"
+M``````````0``````````P``````````0```````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````P`S````````(`````````
+M!``````````#````````````0`````@`````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````#`$,````````@`````````$````````
+M``,``````````$`@````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````,`4P```````"``````````0``````````P``````
+M````$```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````P!C````````(`````````!``````````#````````````$0`!
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`!`!$````````````````````````````````````````"```0`"````````
+M```````$$@``````````````````$2``````````````````````````````
+M````````````````````````````````````````````````````(`$0````
+M``````````````````````````````````````("``0`````````````````
+M```````````````````2(```````````````````````````````````````
+M``````````````````````````````````````````!@`1````````$`````
+M`````P`````````````````````@@$```@``````````````Q!``````````
+M`````````"$$````````````````````````````````````````````````
+M`````````````````````````````````&4!$````````0`````````#````
+M````````````````.```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````0`%```````````````````@``````````@``
+M````````!```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````!``D``````````````````$``````````"`````````,<%
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````$`#0```````````````````@`````````(``````````(``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````0`1`
+M```````$``````````"``````````@``````````@$``````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````!`!4````````0`
+M`````````(`````````"``````````"`0``"````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````$`&0``````````````````(
+M``````````(``````````(@`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````0`=````````$``````````B`````````
+M`@``````````A$``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````!`"$````````0`````````"(`````````"````````
+M``"$0``"````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````$`)0```````````````````@`````````(`````````QX$`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M0`M````````$``````````"``````````@````````#'@4``````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!0#?\`````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````H````````````````````*
+M`````````````````````````````````````````#`*_P``````````````
+M``"```````````,`````````````````````````````````````````````
+M``````````````````````````````$````````````````````!````````
+M```````````$````````````````````,`LP```````````````````!````
+M`````P``````````````````````````````````````````````````````
+M``````````````````"`````````````````````@```````````````````
+M``0````````````````````P##````````````````````(````````#````
+M````````````````````````````````````````````````````````````
+M`````````!`````````````````````0````````````````````!```````
+M`````````````!`*$```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M(````````````````````"`````````````````````$````````````````
+M````0`I``````````````````&!X`````````@``````````````````````
+M``````````````````````````````````````````````````!`"@``````
+M````````````0`0```````````````````0```````````````````!0"D``
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````@`````````````````
+M```(````````````````````!````````````````````)D!,```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"`````````````````````@`````
+M```````````````$````````````````````8`#_```````#```````````$
+M````````"````````````````.`#``````````````#``@``````````````
+M````````````````````````P*\``````````````````/`+````````````
+M``````@```````````````````!F`/\```````,```````````0````````(
+M````````````````X`,``````````````,`"````````````````````````
+M``````````````#`!P``````````````````\`$`````````````````"```
+M`````````````````&<`_P```````P``````````!`````````@`````````
+M``````#@`P``````````````P`(`````````````````````````````````
+M`````,`O``````````````````#P"P`````````````````(````````````
+M````````:`#_```````#```````````$````````"````````````````.`#
+M``````````````#``@``````````````````````````````````````P%<`
+M`````````````````/`5``````````````````@```````````````````!A
+M`/\```````,```````````0````````0````````````````X`,`````````
+M``````````````````````````````````````````````#`KP``````````
+M````````\`L`````````````````"````````````````````&(`_P``````
+M`P``````````!````````!````````````````#@`P``````````````P`(`
+M`````````````````````````````````````,"O``````````````````#P
+M"P`````````````````(````````````````````8P#_```````#````````
+M```$````````"````````````````.`!``````````````#``@``````````
+M````````````````````````````P"\``````````````````/`+````````
+M``````````@```````````````````!D`/\```````,```````````0`````
+M```0```````````````(`!P``````````````,`"````````````````````
+M``````````````````#`!P``````````````````\`$`````````````````
+M"````````````````````&4`_P```````P``````````!````````!``````
+M``````````"$"```````````````````````````````````````````````
+M`````````,!7``````````````````#P%0`````````````````(````````
+M````````````:0#_```````#```````````$````````$```````````````
+M`,`#``````````````#``@``````````````````````````````````````
+MP`<``````````````````/`!``````````````````@`````````````````
+M``!J`/\```````,```````````0````````0````````````````P`,`````
+M``````````````````````````````````````````````````#`+P``````
+M````````````\`L`````````````````"````````````````````)@!_P``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````(````
+M```````````````````````````````````````````!`W`7"P",```````!
+M`R@C#P`2```````!`^`N"@"8`@`````!`U!&#@`D`@`````!`\!="0"P!```
+M```!`Z",#0!(!``````!`X"["`!@!``````!`_#2#`!L!```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````(````````````````````````````````````````````
+M```!`G`7"P",```````!`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D
+M`@`````!`L!="0"P!``````!`J",#0!(!``````!`H"["`!@!``````!`O#2
+M#`!L!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````0`````````````
+M``````````````````````````````````$`Z`,+`((```````$`T`<*!(0!
+M``````$`?!4)!(L!``````$`^"H(!)8!````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````@```````````````````````````````````````````````$#<!<+
+M`(P```````$#*",/`!(```````$#X"X*`)@"``````$#4$8.`"0"``````$#
+MP%T)`+`$``````$#H(P-`$@$``````$#@+L(`&`$``````$#\-(,`&P$````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````@`````````````````````````````````
+M``````````````$"<!<+`(P```````$"*",/`!(```````$"X"X*`)@"````
+M``$"4$8.`"0"``````$"P%T)`+`$``````$"H(P-`$@$``````$"@+L(`&`$
+M``````$"\-(,`&P$````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````"<F```````
+M``````"<F`````````````"<F`````````````"<F`````````````"<F```
+M``````````"<F```````$````!"<F```````!`````2<F`````````````"<
+MF`````````````"<F`````````````"<F`````````````J<F```@``X`(``
+M.`*<F```!@`"``8```"<F```D@```)(```"<F```H````*````"<F```!P`$
+M``<`!`#4F```&@```!H```"<F```2````$@```"<F```$````!````"<F```
+M"`````@```"<F```#P````\```"<F```\@```&(```"<F```3Y```$R0``"<
+MF```6A(``)H2``#,F```#@````\````$H@`````````````(H@``1D8^4$9&
+M/E`,H@``;$&`9&Q!@&00H@```Z"9`0.@F0$4H@``$-9,!!#63`08H@``0`"`
+M$T``@!,<H@``8`#@&V``X!L@H@``"H!3#`J`4PPDH@``.]\4`#O?%``HH@``
+MM0$``+4!```LH@``(````"````"<F`````````````"<F`````````````"<
+MF`````````````"<F`````````````"<F`````````````"<F```````````
+M``"<F`````````````"<F`````````````"<F`````````````"<F```````
+M``````"<F`````````````"<F``````X````.`"<F`````````````"<F```
+M``````````"<F`````````````"<F```^0`$`/D`!`#4F`````````0`````
+M````#0```````````````````````````````````````````````03Z``,`
+M@0!D`F0"`03T`0<`@0#)`<D!`03H`P(`@@'D`.0``030!P8`A`*@`*```02X
+M"P$`A@.,`(P``0)P%PL`C`0\`#P``0(H(P\`$@0\`#P``0+@+@H`F`8P`#``
+M`0)01@X`)`8P`#```0+`70D`,`@L`"P``0*@C`T`2`@L`"P``0*`NP@`8`@L
+M`"P``0+PT@P`;`@L`"P`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````#```````````````````````````````````
+M`````````````0#H`QL`@@```````0#0!QH$A`$``````0!\%1D$BP(`````
+M`0#X*A@$E@,```````)P%PL`#`0```````(H(P\`$@0``````0+@+@H`&`8`
+M`````0)01@X`)`8``````0+`70D`,`@``````0*@C`T`2`@``````0*`NP@`
+M8`@``````0+PT@P`;`@`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````!```````````````
+M`````````````````````````````````0#H`QL`@@```````0#0!QH$A`$`
+M`````0!\%1D$BP$``````0#X*A@$E@$`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"````````````````````````````````````````````````0-P%PL`
+MC````````0,H(P\`$@```````0/@+@H`F`(``````0-01@X`)`(``````0/`
+M70D`L`0``````0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`;`0`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````!P``````````````````````````````````
+M`````````````0-P%PL`C````````0/@+@H`F`(``````0-01@X`)`(`````
+M`0/`70D`L`,``````0.@C`T`2`,``````0.`NP@`8`,``````0/PT@P`;`,`
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````"```````````````
+M`````````````````````````````````0+<!0L`@P```````0+*"`\`!```
+M`````0*X"PH`A@(``````0*4$0X`"0(``````0)P%PD`C`0``````0(H(PT`
+M$@0``````0+@+@@`&`0``````0*\-`P`&P0`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"````````````````````````````````````````````````0*X"PL`
+MA@```````0*4$0\`"0```````0)P%PH`C`(``````0(H(PX`$@(``````0+@
+M+@D`F`0``````0)01@T`)`0``````0+`70@`,`0``````0)X:0P`-@0`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````"```````````````````````````````````
+M`````````````0)P%PL`C````````0(H(P\`$@```````0+@+@H`F`(`````
+M`0)01@X`)`(``````0+`70D`L`0``````0*@C`T`2`0``````0*`NP@`8`0`
+M`````0+PT@P`;`0`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````"``````````!````
+M,#$N,#$````(``````````$````P,2XP,0````@``````````0```#`Q+C`Q
+M````"``````````!````,#$N,#$````(``````````$````P,2XP,0````@`
+M`````````0```#`Q+C`Q````"``````````!````,#$N,#$````(````````
+M``$````P,2XP,0````@``````````0```#`Q+C`Q````"``````````!````
+M,#$N,#$````(``````````$````P,2XP,0````@``````````0```#`Q+C`Q
+M````"``````````!````,#$N,#$````(``````````$````P,2XP,0````@`
+M`````````0```#`Q+C`Q````"``````````!````,#$N,#$````(````````
+M``$````P,2XP,0````@``````````0```#`Q+C`Q````"``````````!````
+M,#$N,#$````(``````````$````P,2XP,0````@``````````0```#`Q+C`Q
+M````"``````````!````,#$N,#$````(``````````$````P,2XP,0````@`
+M`````````0```#`Q+C`Q````"``````````!````,#$N,#$````(````````
+M``$````P,2XP,0````@``````````0```#`Q+C`Q````"``````````!````
+M,#$N,#$````(``````````$````P,2XP,0````@``````````0```#`Q+C`Q
+M````"``````````!````,#$N,#$````(``````````$````P,2XP,0````@`
+M`````````0```#`Q+C`Q````"``````````!````,#$N,#$````(````````
+M``$````P,2XP,0````@``````````0```#`Q+C`Q````"``````````!````
+M,#$N,#$````(``````````$````P,2XP,0````@``````````0```#`Q+C`Q
+M````"``````````!````,#$N,#$````(``````````$````P,2XP,0````@`
+M`````````0```#`Q+C`Q````"``````````!````,#$N,#$````(````````
+M``$````P,2XP,0````@``````````0```#`Q+C`Q````"``````````!````
+M,#$N,#$````(``````````$````P,2XP,0````@``````````0```#`Q+C`Q
+M````"``````````!````,#$N,#$````(``````````$````P,2XP,0````@`
+M`````````0```#`Q+C`Q````"``````````!````,#$N,#$`````+G-Y;71A
+M8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5G:6YF;P`N<F5L82YT97AT`"YR96PN
+M=&5X=``N<F5L82YR;V1A=&$`+G)E;"YR;V1A=&$`+G)E;&$N9&%T80`N<F5L
+M+F1A=&$`+F1A=&$Q`"YB<W,`+FYO=&4`````````````````````````````
+M`````````````````````````````!L````&``!P`@`````````T````&```
+M````````````!````!@````I`````0````8`````````4`````".`@``````
+M`````!``````````+P````D```````````````RE`P!8;```#P````(````$
+M````"````"0````$``````````````!D$00```````\````"````!`````P`
+M```^`````0````(`````````4(X"`-".`````````````!``````````1@``
+M``D``````````````&01!``8#@``#P````4````$````"````#D````$````
+M``````````!\'P0```````\````%````!`````P```!7`````0````,`````
+M````(!T#`$!5`````````````!``````````70````D``````````````'P?
+M!`!`````#P````@````$````"````%(````$``````````````"\'P0`````
+M``\````(````!`````P```!G`````0````,`````````8'(#````````````
+M`````!``````````;@````@````#`````````&!R`P"@`0`````````````0
+M`````````',````'``````````````!@<@,`$`0``````````````0``````
+M```1`````P``````````````<'8#`'D```````````````$``````````0``
+M``(``````````````)1Y`P"0&0``$`````@````$````$`````D````#````
+M```````````DDP,`Z!$``````````````0``````````````````````````
+M`````````````````````P`"``````````````````,`!0``````````````
+M```#``@``````````````````P`,``````````````````,``0``````````
+M```````#``L``````````````````P`-``$```!(S0``N````!(``@`,````
+M'+4```@````2``(`%P```(Q^`0#$`@``$@`"`"(```!\B0``P````!(``@`M
+M````K*$!`#@#```2``(`.``````[`0!,````$@`"`$,```"DL@$`#`(``!(`
+M`@!.````K'8``-@!```2``(`60```.@.`@"8`0``$@`"`&0````$/P``I`$`
+M`!$`"`!O````=(<!`%@````2``(`>@```,AZ``!,````$@`"`(4```"T90``
+M0`$``!(``@"0````L$X``*0!```1``@`FP```&QU`0!`````$@`"`*8```"8
+M;@$`+````!(``@"Q````P%T!`!`````2``(`O````'`Y`0"$`0``$@`"`,<`
+M```420$`Z`$``!(``@#2````"`\``+@````2``(`W0```*`F`0#L````$@`"
+M`.@```!\!@$`&`$``!(``@#S````5.(``,`````2``(`_@```.#I```H````
+M$@`"``D!``!4NP``7````!(``@`4`0``:'H!`&@````2``(`'P$``+`X`0`(
+M````$@`"`"H!``!`60$`,````!(``@`U`0``Y*0!`#0!```2``(`0`$``!P*
+M``!T````$@`"`$L!```@/@$`\````!(``@!6`0``$-,```@````2``(`80$`
+M`,#W`0#(````$@`"`&P!``!XP```"````!(``@!W`0``".H``"P````2``(`
+M@@$``"05```(`@``$@`"`)T!``"<4P``I`$``!$`"`"H`0``5'`!`,`````2
+M``(`LP$``!B]``#4````$@`"`+X!``!<!```,````!(``@#)`0``@/L!`)``
+M```2``(`U`$`````````````$````/4!``"(@P``C````!(``@```@``R',!
+M`'@!```2``(`"P(``$!S`0"(````$@`"`!8"``!@*P$```$``!(``@`A`@``
+MF(<``$`````2``(`+`(``.S;``"(````$@`"`#<"```4XP``S````!(``@!"
+M`@``K"P!`%`````2``(`30(``%38```T````$@`"`%@"``!L<0$`P````!(`
+M`@!C`@``H,```)@````2``(`;@(``!2"``!\````$@`"`'D"``!\M0``4```
+M`!(``@"$`@``:&<!`*@````2``(`CP(``'3E``!@````$@`"`)H"```4<0$`
+M1````!(``@"E`@``=&\!`)P````2``(`L`(``$`\`0"D````$@`"`+L"``!`
+MI@$`3````!(``@#&`@``P'H```@````2``(`T0(``"QR`0#,````$@`"`-P"
+M``!`;```T`<``!(``@#G`@``Y.0``$`````2``(`\@(``*QJ`0"0````$@`"
+M`/T"``"\`P``H````!(``@`(`P``$'`!`$0````2``(`$P,``,S<`0!X`0``
+M$@`"`!X#``!D5P$`:````!(``@`I`P``[+`!`/@````2``(`-`,``,"&``!,
+M````$@`"`#\#``!DTP``\````!(``@!*`P``J-D``+0````2``(`50,``.BS
+M``!$````$@`"`&`#``#0Y0$`]````!(``@!K`P``<*,``&0#```2``(`=@,`
+M`(",```(````$@`"`($#``#$Y@$`5````!(``@",`P``<+<``.0#```2``(`
+MEP,```0"``"L`0``$@`"`*8#``"HQ0$`;`0``!(``@"Q`P``X(0!`%`!```2
+M``(`O`,``'SD```L````$@`"`,<#``!LX@$`5`(``!(``@#2`P``^'@!`'`!
+M```2``(`W0,``%B&`0`L````$@`"`.@#``"P`P``#````!(``@#S`P``.-X`
+M`"@````2``(`_@,``/PL`0`L`0``$@`"``D$``!@+`$`3````!(``@`4!```
+MV/P``&P````2``(`'P0``!!T```H````$@`"`"H$```,AP``C````!(``@`U
+M!```C`0``)0"```2``(`2P0``&2O`0!$````$@`"`%8$```XP0``.`$``!(`
+M`@!A!```.(D``$0````2``(`;`0``%#0```L````$@`"`'<$```8I@$`*```
+M`!(``@""!```O!$!`$0````2``(`C00``-!@`0#T!0``$@`"`)@$``#86P$`
+M$````!(``@"C!```!'P``/0````2``(`K@0```#.``"`````$@`"`+D$``!8
+M_P$`:````!(``@#$!```*%X!`*P!```2``(`SP0``$#D```(````$@`"`-H$
+M``#8@@``L````!(``@#E!```-"L!`"P````2``(`\`0``)`_`0#T"```$@`"
+M`/L$``"`X0$`[````!(``@`&!0``D&X!``@````2``(`$04``"38```P````
+M$@`"`!P%``#@B`$`L````!(``@`G!0``%+4```@````2``(`,@4``,3T`0#\
+M`0``$@`"`#T%``!@[0``=````!(``@!(!0``Q(```'0````2``(`4P4``/AR
+M`0!(````$@`"`%X%``"$2`$`D````!(``@!I!0``-#8!`#`````2``(`=`4`
+M`!#\`0!P````$@`"`'\%`````````````!(```",!0``U+8``)P````2``(`
+MEP4``/"4``!T````$@`"`*(%``"@]P$`(````!(``@"M!0``*/T!`!`````2
+M``(`N`4``-1K`0`(`0``$@`"`,,%``"8!P``%`(``!(``@#4!0``#.L!`"0&
+M```2``(`WP4``-B'``#$````$@`"`.H%``!,O@``"`$``!(``@#U!0``,.0`
+M``@````2``(```8``,1N`0`L````$@`"``L&``"`$`(`]````!(``@`6!@``
+MV),``+`````2``(`(08``.!1`0#8````$@`"`"P&```8TP``3````!(``@`W
+M!@``>/\``#`"```2``(`0@8``"RT``#H````$@`"`$T&``!@O`$`G`<``!(`
+M`@!8!@``Y(H!`%P````2``(`8P8``%"!`0`\````$@`"`&X&``#4[0``U`$`
+M`!(``@!Y!@``K'4!`$P#```2``(`A`8``&#@``"8````$@`"`(\&``!0Y```
+M+````!(``@":!@``T'H!`+P#```2``(`I08``'#G`0`,`@``$@`"`+`&``#`
+M_P$`/`@``!(``@"[!@``).4``%`````2``(`Q@8``(#"```8````$@`"`-$&
+M``"H>0``$````!(``@#<!@``@,X``-`!```2``(`YP8``'AI`0!X````$@`"
+M`/(&``!`C0``.````!(``@#]!@``V&T"`/@````2``(`"`<``'",```(````
+M$@`"`!,'```<;P$`$````!(``@`>!P``:&T!`&0````2``(`*0<``&A+``"D
+M`0``$0`(`#0'```8-P$`N````!(``@`_!P```!<"`(`````2``(`2@<``)2*
+M``#`````$@`"`%4'```TZ@``+````!(``@!@!P``9)4``%`"```2``(`:P<`
+M`("A`0`L````$@`"`'8'```$9P$`,````!(``@"!!P``\&D!`+P````2``(`
+MC`<``&S]`0#L`0``$@`"`)<'``"DH0``+````!(``@"B!P``2)$``"P````2
+M``(`K0<``.B$```@`0``$@`"`+@'``"PE```0````!(``@##!P``R&@!`+``
+M```2``(`S@<``-BI`0!@!```$@`"`-D'``!`\@$`A`(``!(``@#D!P``^$,`
+M`*0!```1``@`[P<``/A\``!H`@``$@`"`/H'``!@5@``B````!(``@`%"```
+M,+4``$P````2``(`$`@``(B4```H````$@`"`!L(`````````````!`````[
+M"```P)<``+`(```2``(`1@@````````)````$0`(`%8(``"PM`$`L````!(`
+M`@!A"```7-H``&0````2``(`;`@```B-`@#X````$@`"`'<(``#\2@$`<```
+M`!(``@"""```9&L!`'`````2``(`C0@``(B,```(````$@`"`)@(```PL`$`
+MO````!(``@"C"```..0```@````2``(`K@@``!SI```P````$@`"`+D(``!4
+MU```]````!(``@#$"```+&\!`$`````2``(`SP@`````````````$@```-X(
+M```HVP``?````!(``@#I"```#$T``*0!```1``@`]`@``*R$`0`P````$@`"
+M`/\(``!P4P$`@````!(``@`*"0``E`<!`(P````2``(`%0D``'BA```L````
+M$@`"`"`)```\X0``P````!(``@`K"0``Z%L!`-`!```2``(`-@D``/A1``"D
+M`0``$0`(`$$)``!`=0$`+````!(``@!,"0``J-T``)`````2``(`5PD```B*
+M`0#<````$@`"`&()```8#`(`T`(``!(``@!M"0``2-4``*0"```2``(`>`D`
+M`'R2``!(````$@`"`(,)```HV0``0````!(``@"."0``"`P!`)`!```2``(`
+MF0D``(BJ```<````$@`"`*0)```HB`$`N````!(``@"O"0``5%```*0!```1
+M``@`N@D``,#:``!H````$@`"`,4)``#LW```O````!(``@#0"0``"(8``)``
+M```2``(`VPD``%SQ`0`P````$@`"`.8)`````````````!(```#U"0``N#@!
+M`"`````2``(```H``#1G`0`T````$@`"``L*``"4?P``,````!(``@`6"@``
+M6'$!`!0````2``(`(0H``"CD```(````$@`"`"P*``!0:`$`>````!(``@`W
+M"@``5$(``*0!```1``@`0@H```SM```H````$@`"`$T*``!\T```5`$``!(`
+M`@!8"@``I`$``&`````2``(`9@H``&`]``"D`0``$0`(`'$*``!<[```L```
+M`!(``@!\"@``T-$``!`````2``(`APH```P````D````$0`(`)D*```4A```
+M/````!(``@"D"@``X(0```@````2``(`KPH``-!=`0!8````$@`"`+H*``#L
+MCP``H````!(``@#%"@``>!,"`(0#```2``(`T`H``(R0```P````$@`"`-L*
+M``!`X@``%````!(``@#F"@``!(<!`'`````2``(`\0H``$1D```,`0``$@`"
+M`/P*```P\0$`+````!(``@`'"P``I.L``+@````2``(`$@L``.#C``!(````
+M$@`"`!T+``"PA@$`5````!(``@`H"P``9#8!`#0````2``(`,PL``!CG`0!8
+M````$@`"`#X+``#\X0``1````!(``@!)"P``_,,!`&@!```2``(`5`L``.#1
+M```P`0``$@`"`%\+``#8.`$`F````!(``@!J"P``L$```*0!```1``@`=0L`
+M`#"2``!,````$@`"`(`+```X_0$`-````!(``@"+"P``O'@``.P````2``(`
+ME@L``,"0``!@````$@`"`*$+``"P+P$`6`8``!(``@"L"P``T(P``'`````2
+M``(`MPL``("*```4````$@`"`,(+``#P4P$`;`(``!(``@#-"P``P.0!`!`!
+M```2``(`V`L``#3M```L````$@`"`.,+``!090``9````!(``@#N"P``D%@!
+M`*P````2``(`^0L``*`3``#$````$@`"``0,``#D"P``)`,``!(``@`/#```
+M`%<!`&0````2``(`&@P``%2+``#,````$@`"`"4,```@D0``*````!(``@`P
+M#```?-H!`+`````2``(`.PP``*R!``!H````$@`"`$8,``!DQ0$`1````!(`
+M`@!1#```H%(``$P````2``(`7`P``"`'``!X````$@`"`&<,```0:`$`0```
+M`!(``@!R#``````````````2````@@P````2`0#$`0``$@`"`(T,``"0>```
+M+````!(``@"8#```P/8!`.`````2``(`HPP``)""``!(````$@`"`*X,``#4
+M7P$`_````!(``@"Y#```G-\``,0````2``(`Q`P``-`W`0#@````$@`"`,\,
+M`````````````!````#O#```D`H``%0!```2``(`^@P```"```!\````$@`"
+M``4-``!\@```0````!(``@`0#0``:-D``$`````2``(`&PT``!1[``#P````
+M$@`"`"8-``!TW```>````!(``@`Q#0``;$L!`!P&```2``(`/`T``*CD```L
+M````$@`"`$<-``!`BP$`?`(``!(``@!2#0``:(P```@````2``(`70T``&!_
+M```T````$@`"`&@-``#8A```"````!(``@!S#0`````````````2````@0T`
+M`/#7```T````$@`"`(P-``"T$`````$``!(``@"7#0``D(P``$`````2``(`
+MH@T``$CK``!<````$@`"`*T-``#4Y0``/````!(``@"X#0``8*(``!`!```2
+M``(`PPT``,22``!<````$@`"`,X-``!0A```B````!(``@#9#0``T&8!`#0`
+M```2``(`Y`T``(2&`0`L````$@`"`.\-``"8H`$`Z````!(``@#Z#0``I-L`
+M`$@````2``(`!0X``$A8`0!(````$@`"`!`.``!@M0$```<``!(``@`;#@``
+MF(8``"@````2``(`)@X``%#I``"(````$@`"`#$.``!@W@``3````!(``@`\
+M#@``5+\``"0!```2``(`1PX``)#8``"8````$@`"`%(.``!(Y```"````!(`
+M`@!=#@``S+4```@!```2``(`:`X``,1)``"D`0``$0`(`',.``#X?P``"```
+M`!(``@!^#@``B-@```@````2``(`B0X``"QV``"`````$@`"`)0.``"X>0``
+M"`$``!(``@"?#@``S%<!`'P````2``(`J@X``&04``#`````$@`"`+4.``!,
+M^P$`+````!(``@#`#@``;&\!``@````2``(`RPX``#C?``!D````$@`"`-8.
+M```LV0$`4`$``!(``@#A#@``?.@``*`````2``(`[`X``+#O````#0``$@`"
+M`/<.```@2```I`$``!$`"``"#P``M%$!`"@````2``(`#0\``#B!``!T````
+M$@`"`!@/``"L"0``<````!(``@`C#P``Q'\``#0````2``(`+@\``(CX`0#$
+M`@``$@`"`#D/``!$Z@$`R````!(``@!$#P``=)$``"P````2``(`3P\``/C@
+M``!$````$@`"`%H/```PA@$`*````!(``@!E#P``H)$``)`````2``(`<`\`
+M`!!U``"(````$@`"`'L/```\B@``1````!(``@"&#P``O,@``$`````2``(`
+MD0\``+01``#L`0``$@`"`)P/``#T.@$`"````!(``@"G#P``L+L``(0````2
+M``(`L@\``+3J``!,````$@`"`+T/``!XC```"````!(``@#(#P``\"X!`,``
+M```2``(`TP\``,R'`0!<````$@`"`-X/``"L+`(`W````!(``@#I#P``((P`
+M`$@````2``(`]`\``/1F``!(````$@`"`/\/```@7```)`@``!(``@`5$```
+MD(D!`'@````2``(`(!```""3``"X````$@`"`"L0``#`C0$`V!(``!(``@`V
+M$```<%D!`&@"```2``(`01```)@V`0"`````$@`"`$P0````ZP``2````!(`
+M`@!7$```-+P``.0````2``(`8A````A2``"8````$@`"`&T0``"`P```(```
+M`!(``@!X$```T*$``)`````2``(`@Q```&#J``!4````$@`"`(X0``"P_```
+M*````!(``@"9$```F'4``)0````2``(`I!```'#"```(````$@`"`*\0``"<
+MB```G````!(``@"Z$```?"4!`$@````2``(`Q1````R$`0"@````$@`"`-`0
+M``#,;0$`Q````!(``@#;$```K-X``(P````2``(`YA```$3#``!X!0``$@`"
+M`/$0```8KP``,`0``!(``@#\$```\&X!`"P````2``(`!Q$```@V`0`L````
+M$@`"`!(1``!(4`(`Y````!(``@`=$0``W&P!`(P````2``(`*!$``&!6`0"8
+M````$@`"`#,1``",I@$`3`,``!(``@`^$0``C/$!`#0````2``(`21$`````
+M````````$@```%L1``#`S```B````!(``@!F$0``N%(!`+@````2``(`<1$`
+M````````````$@```((1``"\@```"````!(``@"-$0``U.0``!`````2``(`
+MF!$``.R]``!@````$@`"`*,1```\:P$`*````!(``@"N$0``"-(!`)`!```2
+M``(`N1$``$3]```T`@``$@`"`,01``#450``C````!(``@#=$0``P/$!`(``
+M```2``(``'IZ,#`U8C4X-#8`>GHP,#)D8C$Q8P!Z>C`R9&)F.#<U`'IZ,#)D
+M8F(Q8C(`>GHP,F1B,C`U,P!Z>C`P,F1B830R`'IZ,&9B8C%E,V8`>GHP8C<Y
+M96$Y-`!Z>C`U8CAC-C5A`'IZ,#`U8C0P860`>GHP-6(Y-#)E9`!Z>C!D.&1C
+M-C)C`'IZ,#`Q.68T-S``>GHP,F1D.30R9`!Z>C`R9&)E-S-D`'IZ,#`U8C8Y
+M,F(`>GHP8C9D,C,R-0!Z>C`P-6(X-3-D`'IZ,#`Q-F0Y,F4`>GHP8V9B,3@W
+M-0!Z>C`P,F1B,S%C`'IZ,#)D86)B86,`>GHP,F1B8S@U,0!Z>C`P,&(V8S8X
+M`'IZ,#`P8C9B9C@`>GHP,&(V8V8U90!Z>C`Q-F4Q9&9D`'IZ,&(V9C4P8C@`
+M>GHP-F4P831F90!Z>C`P-C=D,F(Q`'IZ,#`R9&)C-C$`>GHP8C9C83,R-0!Z
+M>C`P-6(V8V9D`'IZ,#$V93!D9F0`>GHP,#!B-F8V.`!A=&A?:&%L7W!R;V-E
+M<W-?;F]I<V5F;&]O<@!Z>C`P-6(T.&%D`'IZ,#)D8F8Q8C(`>GHP,#5B.#AC
+M8@!Z>C`S,V5C.&)F`'IZ,&1B-#(U8S4`871H7VAA;%]D;6%?8F5A8V]N7W)E
+M<W!O;G-E7W1I;64`>GHP,&(V9C$V,0!Z>C`V93`P8CAA`'IZ,#)D8F9C,60`
+M>GHP9&,T93,Y,`!Z>C!D869E9#@V`'IZ,#!B-F4R-V$`>GHP,F1B8F%B,@!Z
+M>C!B-F0Q969F`'IZ,#$V9#DP9&0`>GHP,F1B93@U,0!Z>C`P-6(V-&9D`'IZ
+M,#`P8C9D-3(`>GHP8C9C.65F9@!Z>C`Q-F4P,&1D`'IZ,#)D8F0X-S4`>GHP
+M,F1B,S%B,@!Z>C`P8C<P.3(S`'IZ,#!B-F0T-3``>GHP,#!B-F0Q9`!Z>C!B
+M-F,R,S(U`'IZ,#)D8F1A8C(`>GHP,#`U8C8S,@!Z>C`V9&5D9#DS`'IZ,#`Q
+M-F1A-3``>GHP,#`V-V0S,@!Z>C`P8C9D.3(S`'IZ,#`R9&(U,6,`>GHP,39D
+M8V)F90!Z>C`P8C<P,30U`'IZ,#`Q-F1F,F,`>GHP8C=F860S90!Z>C`Q-F0Y
+M.3(P`'IZ,#)D8C%B86,`>GHP9&,V93,Y,`!Z>C`U8C<P,64P`'IZ,#`P8C9B
+M,3``>GHP8C<P.65F9@!Z>C`Q-F1F.#EB`&%T:%]H86Q?871T86-H`'IZ,#9E
+M,&9C,&0`>GHP,39D86(R9`!Z>C`R9&(Q,S5D`'IZ,&4P-#8X-&(`>GHP,39E
+M,CDQ9`!Z>C`P,&(V9F4X`'IZ,#!C9F(S93``>GHP,#$V9#DT.`!Z>C`Q-F4R
+M,#EB`'IZ,&(W,#%E9F8`>GHP,#!B-F,Y9`!Z>C`P,#5B-6$R`'IZ,#)D8C$W
+M,&$`871H7VAA;%]C;VUP=71E='AT:6UE`'IZ,#)D8C5B86,`>GHP,#5B.#$S
+M9`!Z>C`P8C9C.3(S`'IZ,&(V8C4P8C@`>GHP,#5B-V8Y9`!Z>C!B-S`Q9#`R
+M`'IZ,#9D9F8T-&$`>GHP,F1B-3<V,P!Z>C`V965A9C8P`'IZ,&4P,#=C83$`
+M>GHP,#)D868V,@!Z>C!B.#-A9#-E`'IZ,#`P8C9B.3``>GHP,39D.65F80!Z
+M>C`Q-F1E,#4Q`'IZ,#`P-6(V8C(`>GHP-6(W9C$Q-`!Z>C`T864P,S%F`'IZ
+M,#)D8F1D9F0`>GHP,#4T-V9E9`!Z>C`P8C9B9C5E`'IZ,#!B-S$W-V0`>GHP
+M,&(W,&8S9`!Z>C`Q-F0X.3(P`'IZ,#)D8C%A8C(`>GHP,#`U8C8R,@!Z>C`P
+M,&(V9C<X`'IZ,&(V.6(P-V,`871H7VAA;%]F<F5E`'IZ,#5B-SEB,6(`>GHP
+M,&(W,#<S9`!Z>C`R9&)E8F)D`'IZ,&(U93,Q-3(`>GHP,39D9F)F,0!A=&A?
+M:&%L7VUH>C)I965E`'IZ,#$V93$X.6(`>GHP9&,R835C-0!Z>C`P,F1C-C!B
+M`'IZ,#9D9C!B.&$`>GHP,F1B,S,U9`!Z>C!B-F,U,V$T`'IZ,&8U-&0Q8C``
+M>GHP8C9F9#,V,P!Z>C!D.61C-C)C`'IZ,#5B-S0Q93``>GHP,F1A.6)A8P!Z
+M>C!D8S(Q9#-A`'IZ,#!B-S$W,V0`>GHP,39D.60T,0!Z>C`P-6(X-&9D`'IZ
+M,#`U8CAA8F0`>GHP,&(W,#$R,P!Z>C`P-6(V-3)B`'IZ,#)D8C,X-S4`>GHP
+M,39E,S`Y8@!Z>C`P-6(V,&(R`'IZ,#)D8C$X-S4`>GHP,#)D8C@T,@!Z>C`R
+M9&(Q-S8S`'IZ,&(W9&5A.30`>GHP,&(W,#$V,0!Z>C`Q-F0W9#0Q`'IZ,#`Q
+M-F-D,S(`>GHP-F1E,&(X80!Z>C`V9#ED9#DS`'IZ,&1B,V5D.#8`>GHP,#5B
+M-#AE9`!Z>C`P,F1C.#!B`'IZ,#`R9&)C-#(`>GHP,F1B83@U,0!Z>C`R9&(S
+M,V5D`'IZ,#`U8C@P9F0`>GHP,#5B-V8R90!Z>C`R9&)F9&9D`'IZ,#$V938T
+M.&$`>GHP,#)D869F,@!Z>C`P-6(W-SED`'IZ,#`P8C9E93@`>GHP,39E-#0X
+M80!Z>C`P8C9F-F)C`'IZ,#$V9&$Y,C``>GHP-6(W.#%E,`!Z>C`P,F1C83!B
+M`'IZ,#`U8C0T860`>GHP-F1D9C0T80!Z>C!F86,P8SEB`'IZ,&(V9CEE9F8`
+M>GHP,&(V8S9B8P!A=&A?:&%L7V%D9&ET:6]N86Q?<W=B85]B86-K;V9F`'IZ
+M,#`P,F1B.3(`871H7VAA;%]V97)S:6]N`'IZ,#)D8F%C,F4`>GHP,F1B-SEA
+M90!Z>C`P,39E-3,R`'IZ,&(V8V8P,#D`>GHP,#$V93$R8P!Z>C`P,39D.64T
+M`'IZ,#`P,F1A96$`>GHP,#5B-6-B,@!Z>C`Q-F1A,C4Q`'IZ,#9F-F%F-C``
+M>GHP-F1F9&0Y,P!A=&A?:&%L7VUA;&QO8P!Z>C`P,&(V9&0R`'IZ,#)D9#DR
+M860`>GHP,39D8C(U,0!Z>C!E,3`W8V$Q`'IZ,#!B-F,W-64`>GHP,39D9#`U
+M,0!Z>C`R9&)D,6(R`'IZ,#)D8S$W-C,`>GHP8C8Y,&0V9`!Z>C`Q-F1F,#4Q
+M`'IZ,#`Q-F0Y-3``>GHP,&(W,#9B8P!Z>C`P,39D.#<R`'IZ,#9D968T-&$`
+M>GHP-6(X8S)E9`!Z>C`V9F(Y-#=B`'IZ,&5B8C%E,V8`>GHP8C9F.60P,@!Z
+M>C!D,31D,6(P`'IZ,&(T.#`S,64`>GHP,39D8F)F90!Z>C`Q-F4U-#AA`'IZ
+M,#`Q-F0X-3``>GHP,#!B-F9F.`!A=&A?:&%L7VUE;6-P>0!Z>C`R9&)C8F)D
+M`'IZ,#$V9&$P9&0`>GHP,F1B8F1F9`!Z>C`R9&(R.#4Q`'IZ,#)D8F1C,60`
+M>GHP-F1B,&-F,@!Z>C`Q-F5B.6%D`'IZ,#!B-F-E8F,`>GHP9#DT.#1A,0!A
+M=&A?:&%L7W!R;V)E`'IZ,#$V96$Y860`>GHP9F0T9#%B,`!Z>C`R9&(S-S8S
+M`&%T:%]H86Q?8G5I;&1O<'1S`'IZ,#)D868S-60`>GHP-F1D9&0Y,P!Z>C!D
+M861C-C)C`'IZ,#$V9&8R-3$`>GHP,#!B-F,Q,`!Z>C`Q-F0Y,C4Q`'IZ,#)D
+M8C`X-3$`>GHP8C<R,6%E9`!Z>C`V-V-F8V%E`'IZ,#`P8C9C9C@`>GHP8SDT
+M9#%B,`!Z>C`R9&%F86(R`'IZ,#5B.3)A960`>GHP,#5B.&-C8@!Z>C!B-F0Y
+M969F`'IZ,#)D8C$Q8C(`>GHP,F1B9F9B,0!Z>C`R9&)F-S8S`'IZ,#`U8C8X
+M9F0`>GHP,#5B-#1E9`!Z>C!B-S$Q865D`'IZ,&(U93,Q-C``>GHP9#@T.#1A
+M,0!Z>C`Q-F0X8C)D`'IZ,#$V93`X.6(`>GHP,F1B8C@W-0!Z>C`R9&%E.#4Q
+M`'IZ,&(X,65A.30`>GHP,39D96,Q9@!Z>C`P8C9F96)C`'IZ,&4X.30Y,#<`
+M>GHP,&(V96$W80!Z>C`S,V4X9F)F`'IZ,&-F834X-S4`>GHP,F1B.3EA90!Z
+M>C`R9&(Y86(R`'IZ,#`P8C9B93@`>GHP9&4V.#,W9@!Z>C`Q-F1A8F9E`'IZ
+M,&(W,#ED,#(`>GHP-C=D,C5E,@!Z>C`Q.68S83`Q`'IZ,#<P,SDT-V(`871H
+M7VAA;%]M96UZ97)O`'IZ,#9D9F9C,&0`>GHP8C8W-3!B.`!Z>C`Q-F4R9&9D
+M`'IZ,#`P8C9D,C(`>GHP-F9E868V,`!Z>C!D8S1A-6,U`'IZ,#!B-S!F-V0`
+M871H7VAA;%]S=U]B96%C;VY?<F5S<&]N<V5?=&EM90!Z>C`Y9C8T8C9A`'IZ
+M,#`U8C8U-V$`>GHP-F8S.30W8@!Z>C`V9&$P8V8R`'IZ,&(W8F%D,V4`>GHP
+M,&(V9CDV,0!Z>C!B-CDW,V)C`'IZ,#)D8F0S-60`>GHP,#5B.#AF9`!Z>C`R
+M9&)B8S%D`'IZ,#)D869D9F0`>GHP-F0W9&0Y,P!A=&A?:&%L7V1E;&%Y`'IZ
+M,#)D8C%D9F0`>GHP-C=D,F8T,0!Z>C`R9&%F.#<U`'IZ,&(W961E-F0`>GHP
+M,39D.&0T,0!Z>C`P,F1A93DR`'IZ,&(W861E-F0`>GHP,F1B8C,U9`!Z>C`R
+M9&(S9&9D`'IZ,#)D8C4S960`>GHP,39D8V5A90!Z>C`P,&(V9&$R`'IZ,#`P
+M8C9E,C(`>GHP-6(X,#`T,0!Z>C`P,39D.#0X`'IZ,#$V9#EB,F0`>GHP,#$V
+M93`R8P!Z>C`P8C<P-S=D`'IZ,#`U8C8Y-V$`>GHP,#$V9&%E-`!Z>C`Q-F4Q
+M,#EB`'IZ,#`U8C1A,F0`>GHP,39D93!D9`!Z>C`Q-F1F,&1D`'IZ,&1F,#=C
+M83$`>GHP,F1B9#<V,P!Z>C`P,&(V934R`'IZ,#8W9#!C-#<`>GHP-6(V8S9D
+M8@!Z>C!C,S$U96(U`'IZ,&1B,65D.#8`>GHP-F0T,#9E,`!Z>C`Q-F4P,C4Q
+M`'IZ,#`P,F1B8C(`>GHP,#)D9#@V9`!Z>C`P,39E,31D`'IZ,#)D8C4Y864`
+M>GHP,#8W9#(R,0!Z>C`Q-F0X,&1D`'IZ,#`U8C@Y,V0`>GHP-6(X,6(Q8@!Z
+M>C`R9&(Q,V5D`'IZ,#!B-F0Q,C,`>GHP,#!B-F-E.`!Z>C`U8CAA865D`'IZ
+M,&(V960S-C,`>GHP,F1A9C%B,@!Z>C`P,#5B-64R`'IZ,#,S96)F8F8`>GHP
+M-6(V.#9D8@!Z>C`P,&(V968X`'IZ,&(W,3EA960`>GHP,#5B-3AB,@!Z>C`U
+M8C=D8C%B`'IZ,&(X,F1E-F0`>GHP,#$V9#<S,@!Z>C`R9&%D86(R`'IZ,&8T
+M-64V93,`871H7VAA;%]I;FET7V-H86YN96QS`'IZ,#!B-F0V8F,`>GHP8S$T
+M9#%B,`!Z>C`P,#)D8F0R`'IZ,&1A-#@T83$`>GHP,39E,&(X-P!Z>C`U8CDP
+M,F5D`'IZ,&1C,F4S.3``>GHP838P9#$T-0!Z>C`R9&)A8F)D`'IZ,#`P8C9C
+M,60`>GHP-6(X96%E9`!Z>C`P-6(W8CED`'IZ,#`U8C4T-#8`>GHP-6(V-#9D
+M8@!Z>C`P8C9F.3(S`'IZ,&1D-C@S-V8`>GHP,39E,3(U,0!Z>C!D8S9A-6,U
+M`'IZ,#)D8C,W,&$`>GHP,#`U8C8W,@!Z>C`V9&5F8S!D`'IZ,#)D8F8S-60`
+M>GHP,#!B-F,W.`!Z>C`P,39D.#,R`'IZ,#)D8C4W,&$`>GHP,#5B-F0W80!Z
+M>C`P,F1B,CDR`'IZ,#`U8CDP8V(`871H7VAA;%]R96=?=W)I=&4`>GHP8C9F
+M-3,V,P!Z>C`P-6(U8S0V`&%T:%]H86Q?<F5G7W)E860`>GHP-F0Y,&-F,@!Z
+M>C`V9#AD9#DS`'IZ,#$V9&9B.#<`>GHP,#$V9&$T.`!Z>C!B-C8S,6$X`'IZ
+M,#`R9&(P.3(`871H7VAA;%]G971W:7)E;&5S<VUO9&5S`'IZ,#$V93%B.#<`
+M"`````4"```0````!@(``(P````%`@``E`````8"``#(````!0(``-`````&
+M`@``^`````4"`````0``!@(``$0!```%`@``3`$```8"``!4`0``!0(``%P!
+M```&`@``:`$```4"``"X````!0(``'`!```&`@``=`$```4"``!,````!0(`
+M`'P!```&`@``@`$```4"``!\````!0(``(@!```&`@``C`$```4"```@`0``
+M!0(``#0````%`@``E`$```8"``#8`0``!0$``-P!```&`0``\`(```5V``#T
+M`@``!G8```@#```%A`$`/`(```6$`0`,`P``!H0!`"`#```%1P``)`,```9'
+M``#T`P``!9`!`/@#```&D`$`_`,```4U`0``!```!C4!`.`'```%O```Y`<`
+M``:\``"P"```!;P``+0(```&O```R`D```4>`0#,"0``!AX!`-@)```%`@``
+MW`D```8"``#P"0``!0(``/0)```&`@``.`H```4>`0`\"@``!AX!`$@*```%
+M`@``3`H```8"``!@"@``!0(``&0*```&`@``"`L```5F```,"P``!F8``/`+
+M```%`@``]`L```8"```,$```!9`!`!`0```&D`$`U!````4!```L$0``!@$`
+M`'P4```%_0``@!0```;]``"D%```!1X!`*@4```&'@$`S!0```4"``#0%```
+M!@(``'05```%`@``>!4```8"``"8%0``!1X!`)P5```&'@$`1!<```4"``!,
+M%P``!@(``%`7```%`@``5!<```8"```,&P``!0$``!`;```&`0``L!L```7-
+M``"T&P``!LT``#@A```%`0``:"$```8!``"0(@``!2`!`,`A```%(`$`E"(`
+M``8@`0#@)0``!0$``.0E```&`0``%"8```4!```8)@``!@$``)0F```%@P``
+MF"8```:#```$*```!0$```@H```&`0``$"@```4!```4*```!@$``.`H```%
+M`0``2"@```4!``#D*```!@$``"0S```%S0``*#,```;-``!4,P``!2`!`%@S
+M```&(`$`@#,```4!``"$,P``!@$``+0S```%`0``N#,```8!``#(,P``!0$`
+M`,PS```&`0``)#0```4@`0`H-```!B`!`%0T```%`0``6#0```8!``"(-```
+M!0$``(PT```&`0``G#0```4!``"@-```!@$``/@T```%(`$`_#0```8@`0`H
+M-0``!0$``"PU```&`0``7#4```4!``!@-0``!@$``'`U```%`0``=#4```8!
+M``"8-0``!8,``)PU```&@P``(#8```4!```D-@``!@$``%@V```%`0``7#8`
+M``8!```H-P``!0$``"PW```&`0``Z#H```4!``#L.@``!@$``%P[```%`0``
+M8#L```8!``#P0```!0$``/1````&`0``^$````4!``#\0```!@$``"1"```%
+M`@``*$(```8"```X0@``!0(``#Q"```&`@``+$0```4!```P1```!@$``!Q2
+M```%`0``(%(```8!```T4@``!0$``#A2```&`0``3%(```4!``!04@``!@$`
+M`&12```%`0``:%(```8!``!\4@``!0$``(!2```&`0``S%(```4!``#04@``
+M!@$``)!3```%`0``E%,```8!``"T4P``!0,``+A3```&`P``]%,```4#``#X
+M4P``!@,``%!4```%`0``5%0```8!``"@5```!0,``*14```&`P``G%4```4!
+M``"@50``!@$``/!5```%`0``]%4```8!```(5@``!0$```Q6```&`0``*%8`
+M``4!```L5@``!@$``&Q6```%`0``<%8```8!``#P5@``!0,``/16```&`P``
+M/%<```4!``!`5P``!@$``%Q7```%`0``8%<```8!``!X5P``!0,``'Q7```&
+M`P``Y%<```4#``#H5P``!@,``.Q7```%Y@``\%<```;F``!,6```!0,``%18
+M```&`P``[%@```4!``#P6```!@$``$Q9```%`0``"%D```4!```,60``!@$`
+M`"19```%`0``*%D```8!``!860``!0,``%Q9```&`P``W%D```4#``#@60``
+M!@,``.19```%`P``Z%D```8#``",6@``!0$``)!:```&`0``@%P```4!``"$
+M7```!@$``)A<```%`0``G%P```8!``"X7```!0$``+Q<```&`0``W%P```4!
+M``"T7```!0$``.!<```&`0``[%P```4!``#P7```!@$```Q=```%`0``$%T`
+M``8!```L70``!0$``#!=```&`0``J%T```4!``"P70``!@$``!1>```%`@``
+M&%X```8"```<7@``!0(``.!B```%`@``(%X```8"``#<7@``!0,``/!>```&
+M`P``#%\```4#```07P``!@,``#!?```%`P``-%\```8#``#,7@``!0,``%!?
+M```&`P``;%\```4#``!T7P``!@,``*1>```%`P``@%\```8#``"47P``!0$`
+M`)A?```&`0``M%\```4!``"X7P``!@$``.A?```%`0``[%\```8!```(80``
+M!2`!``QA```&(`$`Y&(```4"``#H8@``!@(```1C```%`0``#&,```8!```<
+M8P``!0$``"1C```&`0``%&8```7]``!<90``!?T``&!E```&_0``Y&4```4!
+M``#H90``!@$``(!F```%_0``A&8```;]``#\9@``!?T```!G```&_0``T&@`
+M``4!``#4:```!@$``*!I```%`0``:&D```4!``!0:0``!0$``!!I```%`0``
+M[&@```4!``!P:0``!@$``'AI```%`0``@&D```8!``"P:0``!0$``+1I```&
+M`0``$&H```4#```8:@``!@,``!QJ```%`P``(&H```8#```D:@``!0,``"AJ
+M```&`P``+&H```4!```P:@``!@$``/QJ```%`P``!&L```8#```(:P``!0,`
+M``QK```&`P``$&L```4#```4:P``!@,``!AK```%`0``'&L```8!``#(:P``
+M!0$``,QK```&`0```&P```4!```$;```!@$``!AL```%`0``'&P```8!``"`
+M;```!<T``(1L```&S0``H&P```7F``"D;```!N8``*QL```%`@``L&P```8"
+M````;0``!3L!``1M```&.P$`)&T```60`0`H;0``!I`!`&1N```%C0$`5&T`
+M``6-`0!8;0``!HT!`'!M```%C0$`=&T```:-`0"8;0``!9`!`)QM```&D`$`
+MJ&T```4O``"L;0``!B\``-1M```%C0$`V&T```:-`0#L;0``!2H!`/!M```&
+M*@$`'&X```4J`0`@;@``!BH!`$AN```%*@$`3&X```8J`0"4;@``!2H!`)AN
+M```&*@$`X&X```4J`0#D;@``!BH!`+AO```%>P``O&\```9[``#D<@``!0$`
+M`.AR```&`0```',```4J`0`$<P``!BH!`'QS```%C0$`@',```:-`0"H<P``
+M!8T!`*QS```&C0$`Q',```6#``#(<P``!H,``!AT```%@P``''0```:#``!,
+M=P``!8T!`"QU```%C0$`,'4```:-`0"P=0``!3$``+1U```&,0``R'4```4H
+M`0#,=0``!B@!``QV```%8P$`$'8```9C`0!`=@``!8T!`$1V```&C0$`5'8`
+M``60`0!8=@``!I`!`-QV```%D`$`X'8```:0`0#\=@``!8T!``!W```&C0$`
+M4'<```60`0!4=P``!I`!`&QW```%C0$`<'<```:-`0"$=P``!8T!`(AW```&
+MC0$`G'<```60`0"@=P``!I`!`.1W```%C0$`Z'<```:-`0!4>```!8T!`%AX
+M```&C0$`F'@```60`0"<>```!I`!`-QX```%D`$`X'@```:0`0`@>@``!8T!
+M`.QY```%C0$`\'D```:-`0!L>@``!8T!`'1Z```&C0$`Y'H```60`0#H>@``
+M!I`!`$![```%C0$`1'L```:-`0"P?```!8T!`+1\```&C0$`G'X```6-`0"@
+M?@``!HT!`!A_```%;P``''\```9O``!L?P``!>8``'!_```&Y@``G'\```7F
+M``"@?P``!N8``,Q_```%Y@``T'\```;F``#8?P``!0(``-Q_```&`@``'(``
+M``60`0`@@```!I`!`"R````%2@``,(````9*``!0@```!9`!`%2````&D`$`
+M](````4D`0#X@```!B0!``B!```%=```#($```9T``!0@0``!9`!`%2!```&
+MD`$`?($```6-`0"`@0``!HT!`,2!```%D`$`R($```:0`0#D@0``!8T!`.B!
+M```&C0$`-((```60`0`X@@``!I`!`%R"```%C0$`8((```:-`0"L@@``!9`!
+M`+""```&D`$`^((```60`0#\@@``!I`!`$"#```%C0$`1(,```:-`0!<@P``
+M!4\!`&"#```&3P$`H(,```60`0"D@P``!I`!`.R#```%C0$`\(,```:-`0`<
+MA```!9`!`""$```&D`$`:(0```60`0!LA```!I`!`*R$```%C0$`L(0```:-
+M`0`$A0``!>8```B%```&Y@``2(4```6-`0!,A0``!HT!`)"%```%D`$`E(4`
+M``:0`0#`A0``!I`!`-B%```%C0$`W(4```:-`0`HA@``!9`!`"R&```&D`$`
+MH(8```60`0"DA@``!I`!`-"&```%D`$`U(8```:0`0#DA@``!8T!`.B&```&
+MC0$`*(<```60`0`LAP``!I`!`$B'```%D`$`5(<```:0`0"HAP``!9`!`*R'
+M```&D`$`](<```60`0#XAP``!I`!`,2(```%)0``R(@```8E``#PB```!5L!
+M`/2(```&6P$``(D```6-`0`$B0``!HT!`$B)```%D`$`3(D```:0`0!8B0``
+M!24``%R)```&)0``H(D```4E``"DB0``!B4``,R)```%D`$`T(D```:0`0#@
+MB0``!5L!`.2)```&6P$``(H```6-`0`$B@``!HT!`$R*```%D`$`4(H```:0
+M`0!<B@``!24``&"*```&)0``M(H```60`0"XB@``!I`!`,R*```%C0$`T(H`
+M``:-`0#XB@``!9`!`/R*```&D`$`$(L```6-`0`4BP``!HT!`'B+```%)0``
+M?(L```8E``"DBP``!9`!`*B+```&D`$`N(L```5;`0"\BP``!EL!`.2+```%
+MC0$`Z(L```:-`0`PC```!9`!`#2,```&D`$`1(P```4E``!(C```!B4``+",
+M```%%@$`M(P```86`0#\C```!8T!``"-```&C0$`((T```4;```DC0``!AL`
+M`%B-```%-P$`7(T```8W`0"@C0``!9`!`*2-```&D`$`M(T```6-`0"XC0``
+M!HT!`#R.```%D`$`0(X```:0`0!4C@``!8T!`%B.```&C0$`;(X```4U`0!P
+MC@``!C4!`(".```%D`$`A(X```:0`0",C@``!34!`)".```&-0$`G(X```6-
+M`0"DC@``!HT!`/R.```%D`$``(\```:0`0`8CP``!8T!`!R/```&C0$`?(\`
+M``60`0"`CP``!I`!`)"/```%C0$`E(\```:-`0`8D```!0$``#"0```&`0``
+M1)````4!``!(D```!@$``%R0```%`0``8)````8!``"4D```!9`!`)B0```&
+MD`$`Z)````41``#PD```!A$``/20```%\0``^)````;Q``#\D```!2D!``"1
+M```&*0$`*)$```60`0`LD0``!I`!`%21```%C0$`6)$```:-`0!\D0``!8T!
+M`("1```&C0$`O)$```6-`0#`D0``!HT!`-21```%D`$`V)$```:0`0#<D0``
+M!34!`."1```&-0$`0)(```60`0!$D@``!I`!`%22```%C0$`6)(```:-`0",
+MD@``!9`!`)"2```&D`$`G)(```6-`0"@D@``!HT!`.22```%C0$`Z)(```:-
+M`0!,DP``!9`!`%"3```&D`$`;),```6-`0!PDP``!HT!`(R3```&D`$`J),`
+M``6-`0"LDP``!HT!``24```%D`$`")0```:0`0`@E```!8T!`"24```&C0$`
+M0)0```:0`0!8E```!8T!`%R4```&C0$`D)0```60`0"4E```!I`!`-"4```%
+MC0$`U)0```:-`0"\E0``!9`!`,"5```&D`$``)8```60`0`$E@``!I`!`!28
+M```%_0``&)@```;]```XI@``!9`!`#"9```%D`$`3)@```60`0!4F```!I`!
+M`&"8```%D`$`9)@```:0`0!XF```!3L!`'R8```&.P$`V*````6-`0!@G@``
+M!8T!`,28```%C0$`R)@```:-`0#\F```!0$```"9```&`0``E)D```60`0`X
+MF0``!I`!`#R9```%C0$`0)D```:-`0!LF0``!8T!`'"9```&C0$`@)D```6-
+M`0"$F0``!HT!`&B9```%D`$`K)D```:0`0"PF0``!8T!`+29```&C0$`V)D`
+M``60`0#<F0``!I`!`.R9```%C0$`\)D```:-`0!PFP``!;8``'2;```&M@``
+M6)P```4"``!<G```!@(``&"<```%`@``9)P```8"``!HG```!8T!`&R<```&
+MC0$`P)P```6%`0#$G```!H4!`-R<```%D`$`X)P```:0`0`(G0``!8T!``R=
+M```&C0$`.)X```4!```\G@``!@$``)2>```%C0$`F)X```:-`0"LG@``!34!
+M`+">```&-0$`O)X```60`0#`G@``!I`!`.">```%2@``Y)X```9*``#\G@``
+M!90```"?```&E```,)\```57```TGP``!E<``&"?```%?@``9)\```9^``!P
+MGP``!9`!`'2?```&D`$`C)\```6-`0"0GP``!HT!`+"?```%?P$`M)\```9_
+M`0#,GP``!0L``-"?```&"P``Z)\```48`0#LGP``!A@!``B@```%C0$`#*``
+M``:-`0"0H```!9`!`)2@```&D`$`'*$```6-`0`@H0``!HT!`*RB```%C0$`
+M3*$```:-`0"`H0``!0$``(2A```&`0``K*$```4!``"PH0``!@$``.2A```%
+M^```Z*$```;X````H@``!0$```2B```&`0``&*(```4U`0`<H@``!C4!`"BB
+M```%`0``+*(```8!``!XH@``!?@``'RB```&^```M*(```6-`0"XH@``!HT!
+M`,BB```%`0``S*(```8!``#HH@``!34!`.RB```&-0$`^*(```4!``#\H@``
+M!@$``!BC```%-0$`'*,```8U`0`HHP``!?@``"RC```&^```2*,```4!``!,
+MHP``!@$``*2C```%_0``J*,```;]``"\HP``!9`!`,"C```&D`$`T*,```6-
+M`0#4HP``!HT!`!"D```%-0$`%*0```8U`0!(I```!0$``$RD```&`0``9*0`
+M``4U`0!HI```!C4!`'2D```%D`$`>*0```:0`0"0I```!8T!`)2D```&C0$`
+MN*4```5*``"\I0``!DH```2F```%E```"*8```:4``!4I@``!9`!`%BF```&
+MD`$`;*8```6-`0!PI@``!HT!``2G```%C0$`"*<```:-`0`<IP``!34!`""G
+M```&-0$`,*<```5*```TIP``!DH``%RG```%C0$`8*<```:-`0!PK```!0$`
+M`'2L```&`0``Z*P```4"``#LK```!@(``"BM```%`0``+*T```8!``!$K0``
+M!0$``$BM```&`0``D*T```4!``"4K0``!@$``*RM```%`0``L*T```8!``#X
+MK0``!0$``/RM```&`0``%*X```4!```8K@``!@$``&"N```%`0``9*X```8!
+M``!\K@``!0$``("N```&`0``/*\```7F``!`KP``!N8``$BO```%`@``3*\`
+M``8"``!<KP``!0(``&"O```&`@``;*\```4!``!PKP``!@$``,"O```%+P``
+MQ*\```8O``#XKP``!2\``/RO```&+P``6+(```4O``!<L@``!B\``-2R```%
+MC0$`V+(```:-`0`,LP``!8T!`!"S```&C0$`B+,```4O``",LP``!B\``*"S
+M```%C0$`I+,```:-`0#PLP``!9`!`/2S```&D`$`4+0```60`0!4M```!I`!
+M`&"T```%C0$`9+0```:-`0!XM```!4H``'RT```&2@``G+0```4U`0"@M```
+M!C4!`*2T```%4@``J+0```92``!<M0``!68!`&"U```&9@$`J+4```45`0"L
+MM0``!A4!`%2V```%(`$`6+8```8@`0"8M@``!;T``)RV```&O0``\+<```6-
+M`0#TMP``!HT!`'"X```%D`$`=+@```:0`0"$O@``!8T!`+BX```&C0$`/+D`
+M``60`0!`N0``!I`!`,2Y```%C0$`R+D```:-`0"$NP``!9`!`(B[```&D`$`
+M\+L```6-`0#TNP``!HT!``B\```%C0$`#+P```:-`0!,O```!:$``%"\```&
+MH0``:+P```5/`0!LO```!D\!`'R\```%D`$`@+P```:0`0"XO```!4\!`+R\
+M```&3P$`U+P```6-`0#8O```!HT!`.B\```%3P$`[+P```9/`0!(O0``!8T!
+M`'"]```&C0$`C+T```6-`0"0O0``!HT!`+R]```%C0$`P+T```:-`0`<O@``
+M!9`!`""^```&D`$`I+X```:-`0"\O@``!9`!`,"^```&D`$`Q+X```4U`0#,
+MO@``!C4!`/R^```%C0$``+\```:-`0`<OP``!4H``""_```&2@``N,(```6-
+M`0"\P@``!HT!`-#"```%C0$`U,(```:-`0#XP@``!9`!`/S"```&D`$`&,,`
+M``4O```<PP``!B\``(##```%S0``A,,```;-``"@PP``!>8``*3#```&Y@``
+MK,,```4"``"PPP``!@(``/S#```%E@$``,0```:6`0`DQ```!8T!`"C$```&
+MC0$`\,0```4U`0!,Q```!34!`%#$```&-0$`7,0```60`0!@Q```!I`!`)3$
+M```%D`$`F,0```:0`0"LQ```!0$``+#$```&`0``U,0```6-`0#8Q```!HT!
+M`/3$```&C0$`",4```4U`0`,Q0``!C4!`!C%```%`0``',4```8!```\Q0``
+M!4@!`$#%```&2`$`?,4```60`0"`Q0``!I`!`*3%```%2`$`J,4```9(`0#8
+MQ0``!4@!`-S%```&2`$`:,8```4"``!LQ@``!@(``-#&```%>`$`U,8```9X
+M`0`,QP``!8T!`!#'```&C0$`),<```4U`0`HQP``!C4!`#3'```%`0``.,<`
+M``8!``"$QP``!4@!`(C'```&2`$`M,<```72``"XQP``!M(``,#'```%`0``
+MQ,<```8!``#0QP``!8`!`-3'```&@`$`[,<```5(`0#PQP``!D@!`'3(```%
+M90$`>,@```9E`0#,R```!1T!`-#(```&'0$`W,@```6#``#@R```!H,``)C)
+M```%D`$`G,D```:0`0#$R0``!8T!`,C)```&C0$`V,D```60`0#<R0``!I`!
+M``S*```%C0$`$,H```:-`0`4R@``!9`!`!C*```&D`$`@,H```6-`0"$R@``
+M!HT!`*#*```%-0$`I,H```8U`0"`RP``!=T``(3+```&W0``5,P```5(`0!8
+MS```!D@!`!3/```%C0$`W,P```6-`0#@S```!HT!`)C-```%,0``:,T```4Q
+M``"<S0``!C$``+#-```%*`$`M,T```8H`0#@S0``!8X!`.3-```&C@$`%,X`
+M``6-`0`8S@``!HT!`"C.```%D`$`+,X```:0`0"PS@``!9`!`+3.```&D`$`
+MQ,X```6-`0#(S@``!HT!`!C/```%D`$`',\```:0`0`TSP``!8T!`#C/```&
+MC0$`3,\```6-`0!0SP``!HT!`&3/```%D`$`:,\```:0`0"LSP``!8T!`+#/
+M```&C0$`],\```60`0#XSP``!I`!`%C0```%D`$`7-````:0`0"4T```!9`!
+M`)C0```&D`$`7-$```60`0!DT0``!I`!`!32```%C0$`&-(```:-`0`HT@``
+M!9`!`"S2```&D`$`P-(```6-`0#$T@``!HT!`#33```%D`$`.-,```:0`0"0
+MTP``!8T!`)33```&C0$``-4```6-`0`$U0``!HT!`"C7```%C0$`+-<```:-
+M`0"DUP``!<L``*C7```&RP``_-<```7F````V```!N8``"S8```%Y@``,-@`
+M``;F``!<V```!>8``&#8```&Y@``:-@```4"``!LV```!@(``+#8```%C0$`
+MM-@```:-`0#4V```!4H``-C8```&2@``^-@```60`0#\V```!I`!`-C9```%
+MX@``W-D```;B``#HV0``!9`!`.S9```&D`$`_-D```6-`0``V@``!HT!`!3:
+M```%00$`&-H```9!`0`LV@``!3<``##:```&-P``=-H```60`0!XV@``!I`!
+M`)#:```%C0$`E-H```:-`0#8V@``!9`!`-S:```&D`$`^-H```6-`0#\V@``
+M!HT!`$C;```%D`$`3-L```:0`0!PVP``!8T!`'3;```&C0$`P-L```60`0#$
+MVP``!I`!``3<```%D`$`"-P```:0`0`PW```!8T!`#3<```&C0$`3-P```4&
+M`0!0W```!@8!`(S<```%D`$`D-P```:0`0"HW```!0(``*S<```&`@``P-P`
+M``6-`0#$W```!HT!``C=```%Y@``#-T```;F``!,W0``!8T!`%#=```&C0$`
+MR-T```60`0#,W0``!I`!`$#>```%D`$`1-X```:0`0!PW@``!9`!`'3>```&
+MD`$`A-X```6-`0"(W@``!HT!`,C>```%D`$`S-X```:0`0#HW@``!9`!`/3>
+M```&D`$`2-\```60`0!,WP``!I`!`+C?```%D`$`O-\```:0`0"(X```!24`
+M`(S@```&)0``L.````5;`0"TX```!EL!`,#@```%C0$`Q.````:-`0`(X0``
+M!9`!``SA```&D`$`&.$```4E```<X0``!B4``&#A```%)0``9.$```8E``",
+MX0``!9`!`)#A```&D`$`H.$```5;`0"DX0``!EL!`,#A```%C0$`Q.$```:-
+M`0`,X@``!9`!`!#B```&D`$`'.(```4E```@X@``!B4``'3B```%D`$`>.(`
+M``:0`0",X@``!8T!`)#B```&C0$`N.(```60`0"\X@``!I`!`-#B```%C0$`
+MU.(```:-`0`XXP``!24``#SC```&)0``9.,```60`0!HXP``!I`!`'CC```%
+M6P$`?.,```9;`0"DXP``!8T!`*CC```&C0$`\.,```60`0#TXP``!I`!``3D
+M```%)0``".0```8E``!8Y```!9`!`%SD```&D`$`A.0```60`0"(Y```!I`!
+M`+3D```%C0$`N.0```:-`0`$Y0``!=X```CE```&W@``5.4```46`0!8Y0``
+M!A8!`)#E```%C0$`E.4```:-`0"TY0``!1L``+CE```&&P``[.4```4W`0#P
+MY0``!C<!`#SF```%D`$`0.8```:0`0!4Y@``!8T!`%CF```&C0$`;.8```4U
+M`0!PY@``!C4!`(#F```%D`$`A.8```:0`0",Y@``!34!`)#F```&-0$`G.8`
+M``6-`0"DY@``!HT!`/SF```%D`$``.<```:0`0`8YP``!8T!`!SG```&C0$`
+M?.<```60`0"`YP``!I`!`)#G```%C0$`E.<```:-`0`,Z```!9`!`!#H```&
+MD`$`(.@```6-`0`DZ```!HT!`*CH```%`0``P.@```8!``#4Z```!0$``-CH
+M```&`0``[.@```4!``#PZ```!@$``"3I```%D`$`*.D```:0`0"4Z0``!;H`
+M`)SI```&N@``H.D```4(`0"HZ0``!@@!`*SI```%[0``L.D```;M``"TZ0``
+M!2D!`+CI```&*0$`Z.D```60`0#LZ0``!I`!`!3J```%C0$`&.H```:-`0`\
+MZ@``!8T!`$#J```&C0$`<.H```6-`0!TZ@``!HT!`(3J```%2@``B.H```9*
+M``#$Z@``!9`!`,CJ```&D`$`V.H```6-`0#<Z@``!HT!`!#K```%D`$`%.L`
+M``:0`0`@ZP``!8T!`"3K```&C0$`:.L```6-`0!LZP``!HT!`-#K```%D`$`
+MU.L```:0`0#PZP``!8T!`/3K```&C0$`$.P```:0`0`L[```!8T!`##L```&
+MC0$`B.P```60`0",[```!I`!`*3L```%C0$`J.P```:-`0#$[```!I`!`-SL
+M```%C0$`X.P```:-`0`4[0``!9`!`!CM```&D`$`0.T```6-`0!$[0``!HT!
+M`"3N```%D`$`*.X```:0`0"<\```!?T``'SP```%_0``H/````;]````$0$`
+M!9`!`.00`0`%D`$`"/$```60`0`,\0``!I`!`%CQ```%D`$`7/$```:0`0"\
+M\0``!9`!`,#Q```&D`$`V/$```60`0#@\0``!I`!`#CR```%E@$`//(```:6
+M`0#D\@``!8T!`.CR```&C0$`\/@```6-`0`$\P``!HT!`!P#`0`%+P``=/,`
+M``8O``!<\P``!2\``(CS```&+P``J/,```4#``!0\P``!0,``*SS```&`P``
+M#/0```4#```0]```!@,``!3T```%C0$`&/0```:-`0!8]```!0$``"CS```%
+M`0``7/0```8!``!P]```!0(``'3T```&`@``>/0```6-`0!\]```!HT!`,CT
+M```%`@``S/0```8"``#0]```!8T!`-3T```&C0$`&/4```4"```<]0``!@(`
+M`"#U```%C0$`)/4```:-`0"(]0``!9`!`(SU```&D`$`K/4```6-`0"P]0``
+M!HT!``SV```%C0$`$/8```:-`0!D]@``!8T!`&CV```&C0$`Q/8```6-`0#(
+M]@``!HT!``3W```%`0``"/<```8!```8]P``!9`!`!SW```&D`$`+/@```4A
+M`0#\]P``!2$!`##X```&(0$`;/@```60`0!P^```!I`!`)SX```%C0$`H/@`
+M``:-`0"T^```!0$``%CX```%`0``N/@```8!``#(^```!0$``,SX```&`0``
+M!/D```6-`0`(^0``!HT!`!SY```%C0$`(/D```:-`0`T^0``!9`!`#CY```&
+MD`$`F/D```4U`0"<^0``!C4!`*CY```%D`$`K/D```:0`0"\^0``!8T!`,#Y
+M```&C0$`U/D```5*``#8^0``!DH``/#Y```%'0``]/D```8=```X^@``!8T!
+M`#SZ```&C0$`9/H```6-`0!H^@``!HT!`(SZ```%#0$`E/H```8-`0"T^@``
+M!8T!`+CZ```&C0$`[/H```60`0#P^@``!I`!`)C[```%40``G/L```91``"H
+M^P``!9`!`*S[```&D`$`Q/L```6-`0#(^P``!HT!`.C[```%F@``[/L```::
+M```$_```!=0```C\```&U```(/P```4X```D_```!C@``$#\```%C0$`1/P`
+M``:-`0#`_0``!0$``)S]```%`0``N/P```4!``"\_```!@$``.C\```%5@$`
+M[/P```96`0`$_0``!0$```C]```&`0``(/T```4U`0`D_0``!C4!`%S]```%
+M5@$`8/T```96`0"$_@``!0$``*3]```&`0``*/X```4!``#(_0``!@$``-#]
+M```%`0``V/T```8!``#<_0``!8T!`.#]```&C0$`%/X```4U`0`8_@``!C4!
+M`"S^```%C0$`,/X```:-`0!@_@``!34!`&3^```&-0$`D/X```6-`0"4_@``
+M!HT!`+#^```&C0$`T/X```6-`0#4_@``!HT!`.C^```%-0$`[/X```8U`0`(
+M_P``!0$```S_```&`0``)/\```4U`0`H_P``!C4!`#3_```%5@$`./\```96
+M`0!4_P``!0$``%C_```&`0``L/\```7]``"T_P``!OT``-C_```%D`$`W/\`
+M``:0`0"<``$`!8T!`*```0`&C0$`M``!``4!``"X``$`!@$``/0``0`%'0``
+M^``!``8=```0`0$`!34!`!0!`0`&-0$`,`$!``4!```,`0$`!0$``%@!`0`&
+M`0``T`$!``60`0#4`0$`!I`!`.0!`0`%C0$`Z`$!``:-`0#\`0$`!34!```"
+M`0`&-0$`$`(!``5*```4`@$`!DH``#P"`0`%C0$`0`(!``:-`0"0`@$`!8D`
+M`)0"`0`&B0``S`(!``4"``#0`@$`!@(``-@"`0`%+P``W`(!``8O```H`P$`
+M!2\``"P#`0`&+P``5`,!``4O``!8`P$`!B\``(P#`0`%C0$`D`,!``:-`0#P
+M`P$`!9`!`/0#`0`&D`$`6`0!``60`0!<!`$`!I`!`(`$`0`%C0$`A`0!``:-
+M`0#,!`$`!9`!`-`$`0`&D`$`U`0!``4U`0#<!`$`!C4!`"`%`0`%`0``)`4!
+M``8!``#P!0$`!0$``/0%`0`&`0``"`8!``60`0`,!@$`!I`!`!P&`0`%`0``
+M(`8!``8!``"P!@$`!6\!`+0&`0`&;P$`Q`8!``4!``#(!@$`!@$``.0&`0`%
+M`@``Z`8!``8"``#L!@$`!0$``/`&`0`&`0``1`<!``60`0!(!P$`!I`!`%@'
+M`0`%C0$`7`<!``:-`0"4!P$`!0(``)P'`0`&`@``L`<!``4"``"T!P$`!@(`
+M`-P'`0`%`@``X`<!``8"``!P"0$`!0,``'0)`0`&`P``5`H!``4O``!8"@$`
+M!B\``&@*`0`%`P``;`H!``8#``"$"P$`!8T!`(@+`0`&C0$`6`T!``6-`0!<
+M#0$`!HT!`!`.`0`%D`$`%`X!``:0`0`\#@$`!8T!`$`.`0`&C0$`>`X!``60
+M`0!\#@$`!I`!`(P.`0`%C0$`D`X!``:-`0"H#@$`!9`!`*P.`0`&D`$`X`X!
+M``6-`0#D#@$`!HT!`/@.`0`%W@``_`X!``;>```P#P$`!9`!`#0/`0`&D`$`
+M:`\!``6-`0!L#P$`!HT!`$P1`0`%D`$`4!$!``:0`0!P$0$`!8T!`'01`0`&
+MC0$`W!$!``6-`0#@$0$`!HT!`.02`0`%`0``Z!(!``8!``#\$@$`!10````3
+M`0`&%```B!,!``4!``",$P$`!@$```04`0`%(`$`"!0!``8@`0`,%`$`!00`
+M`!`4`0`&!```'!0!``4$```@%`$`!@0``"P4`0`%!```,!0!``8$``!H%`$`
+M!00``&P4`0`&!```E!0!``4!``"8%`$`!@$``)P4`0`%!```H!0!``8$``#H
+M%`$`!00``.P4`0`&!```#!4!``4$```0%0$`!@0``)`5`0`%!```E!4!``8$
+M``"D%0$`!00``*@5`0`&!```0!8!``4$``!$%@$`!@0``(06`0`%!```B!8!
+M``8$``"L%@$`!00``+`6`0`&!```M!8!``4!``"X%@$`!@$``+P6`0`%!```
+MP!8!``8$```D%P$`!00``"@7`0`&!```(!@!``4$```D&`$`!@0``%P8`0`%
+M!```8!@!``8$``!D&`$`!8T!`&@8`0`&C0$`G!D!``43`0"(&0$`!1,!`*`9
+M`0`&$P$`.!H!``4!```\&@$`!@$``$`;`0`%`0``1!L!``8!````'`$`!0(`
+M``0<`0`&`@``%!T!``4!```8'0$`!@$``*`=`0`%!```I!T!``8$``#4'0$`
+M!0(``-@=`0`&`@```!X!``4$```$'@$`!@0``#`>`0`%!```-!X!``8$``!H
+M'@$`!00``&P>`0`&!```[!X!``6-`0#P'@$`!HT!``0?`0`%!```"!\!``8$
+M``!P'P$`!6P``'0?`0`&;```?!\!``4$``"`'P$`!@0``)`?`0`%!```E!\!
+M``8$```,(`$`!0$``!`@`0`&`0``1"`!``4!``!((`$`!@$``&0@`0`%`0``
+M:"`!``8!``"<(`$`!0$``*`@`0`&`0``["`!``4!``#P(`$`!@$``%PE`0`%
+M`0``8"4!``8!``!\)0$`!0(``(`E`0`&`@``="8!``6-`0!X)@$`!HT!`-PF
+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
+M`0#("`(`!H(!`$@)`@`%G@``3`D"``:>``!X"0(`!9X``'P)`@`&G@``Y`D"
+M``6>``#H"0(`!IX``#`*`@`%G@``-`H"``:>``!8"@(`!9X``%P*`@`&G@``
+MD`L"``4>`0!X"@(`!AX!`*`*`@`%G@``I`H"``:>``#$"@(`!9X``,@*`@`&
+MG@``/`L"``6>``!`"P(`!IX``*0+`@`%G@``J`L"``:>```@"@(`!1X!`,0+
+M`@`&'@$`[`L"``6>``#P"P(`!IX``#@,`@`%`0``/`P"``8!``#`#`(`!9X`
+M`,0,`@`&G@``%`T"``5Q`0`8#0(`!G$!`"0-`@`%V0``*`T"``;9```(%@(`
+M!0$``+P5`@`%`0``0!`"``4!```X#0(`!0$``#P-`@`&`0``;`T"``6>``!P
+M#0(`!IX``-`-`@`&G@``,`X"``5Q`0`T#@(`!G$!`$0.`@`%V0``2`X"``;9
+M``!8#@(`!0$``%P.`@`&`0``:`X"``6-`0!L#@(`!HT!`)@.`@`%`0``G`X"
+M``8!``"H#@(`!7$!`*P.`@`&<0$`N`X"``79``"\#@(`!MD```P/`@`%C0$`
+M$`\"``:-`0`P#P(`!8(!`#0/`@`&@@$`:`\"``60`0!L#P(`!I`!`!P0`@`%
+M`0``(!`"``8!``!$$`(`!0$``$@0`@`&`0``5!`"``4!``!8$`(`!@$``-P0
+M`@`%`0``X!`"``8!``#L$`(`!0$``/`0`@`&`0``1!$"``4!``!($0(`!@$`
+M`%01`@`%`0``6!$"``8!``#D$0(`!9X``.@1`@`&G@``#!("``6>```0$@(`
+M!IX``#02`@`%G@``.!("``:>``!<$@(`!IX``)@2`@`%D`$`G!("``:0`0#0
+M$P(`!0$``-03`@`&`0``_!,"``4!````%`(`!@$``"@4`@`%@@$`+!0"``:"
+M`0`\%`(`!9`!`$`4`@`&D`$`E!0"``6-`0"8%`(`!HT!`,@4`@`%C0$`S!0"
+M``:-`0#T%0(`!0$``/@5`@`&`0``6!8"``4!``!<%@(`!@$``&@6`@`%`0``
+M;!8"``8!``"X%@(`!0$``+P6`@`&`0``R!8"``4!``#,%@(`!@$``+P7`@`%
+M`@``P!<"``8"``#$%P(`!8T!`,@7`@`&C0$`S!<"``4U`0#0%P(`!C4!`#`8
+M`@`%`@``-!@"``8"```X&`(`!8T!`#P8`@`&C0$`0!@"``4U`0!$&`(`!C4!
+M`)`8`@`%`@``E!@"``8"``"8&`(`!8T!`)P8`@`&C0$`H!@"``4U`0"D&`(`
+M!C4!`$@9`@`%B0``3!D"``:)``"$&0(`!0(``(@9`@`&`@``.!H"``4O``"0
+M&0(`!2\``)09`@`&+P``Q!D"``60`0#(&0(`!I`!`.@9`@`%C0$`[!D"``:-
+M`0`,&@(`!HT!`$0:`@`%+P``2!H"``8O``!P&@(`!2\``'0:`@`&+P``J!H"
+M``6-`0"L&@(`!HT!`!@;`@`%`@``'!L"``8"``"4'0(`!0(``)@=`@`&`@``
+M\!T"``5W``#X'0(`!G<``"P>`@`%C0$`,!X"``:-`0`T'@(`!34!`#@>`@`&
+M-0$`2!X"``4"``!,'@(`!@(``)@>`@`%`@``G!X"``8"``"@'@(`!8T!`*0>
+M`@`&C0$`J!X"``4U`0"L'@(`!C4!`.P>`@`%`@``]!X"``8"``#X'@(`!8T!
+M`/P>`@`&C0$``!\"``4U`0`$'P(`!C4!`%@?`@`%`@``8!\"``8"``!D'P(`
+M!8T!`&@?`@`&C0$`;!\"``4U`0!P'P(`!C4!`,P?`@`%`@``T!\"``8"```X
+M(`(`!7<``#P@`@`&=P``;"`"``5W``!P(`(`!G<``-0@`@`%`@``V"`"``8"
+M``#@(`(`!8T!`.0@`@`&C0$`Z"`"``4U`0#L(`(`!C4!`$@A`@`%`@``3"$"
+M``8"``"0(0(`!7<``)0A`@`&=P```"("``5W```$(@(`!G<``%`B`@`%`@``
+M5"("``8"``!<(@(`!8T!`&`B`@`&C0$`9"("``4U`0!H(@(`!C4!`,@D`@`%
+M(`$`S"0"``8@`0`H)0(`!0$``"PE`@`&`0``'"<"``4!```@)P(`!@$``"0I
+M`@`%`0``*"D"``8!``!<*0(`!54!`&`I`@`&50$`?"D"``4!``"`*0(`!@$`
+M`+0I`@`%`0``N"D"``8!````*@(`!0$```0J`@`&`0``O"L"``55`0#`*P(`
+M!E4!`/@K`@`%@P``_"L"``:#```8+`(`!8,``!PL`@`&@P``1"P"``4"``!,
+M+`(`!@(``&`L`@`%`@``9"P"``8"``",+`(`!0(``)`L`@`&`@``Q"P"``7-
+M``#(+`(`!LT``.@L`@`%S0``["P"``;-```0+0(`!0$``!0M`@`&`0``'"T"
+M``4!```@+0(`!@$``"@M`@`%`0``+"T"``8!```T+0(`!0$``#@M`@`&`0``
+M0"T"``4!``!$+0(`!@$``$PM`@`%`0``4"T"``8!``!8+0(`!0$``%PM`@`&
+M`0``9"T"``4!``!H+0(`!@$``,PM`@`%`@``T"T"``8"``#4+0(`!8T!`-@M
+M`@`&C0$`W"T"``4U`0#@+0(`!C4!`$`N`@`%`@``1"X"``8"``!(+@(`!8T!
+M`$PN`@`&C0$`4"X"``4U`0!4+@(`!C4!`*`N`@`%`@``I"X"``8"``"H+@(`
+M!8T!`*PN`@`&C0$`L"X"``4U`0"T+@(`!C4!`!@P`@`%+P``'#`"``8O```P
+M,`(`!9`!`#0P`@`&D`$`5#`"``6-`0!8,`(`!HT!`'@P`@`&C0$`S#`"``4O
+M```4,0(`!B\``(0Q`@`%+P``B#$"``8O``#T,0(`!2\``/@Q`@`&+P``7#("
+M``4O``!@,@(`!B\``)PR`@`%C0$`H#("``:-`0`,,P(`!0(``!`S`@`&`@``
+M6#4"``4"``!<-0(`!@(``(@U`@`%`@``C#4"``8"``#$-0(`!0(``,@U`@`&
+M`@``!#8"``4"```(-@(`!@(``$PV`@`%=P``4#8"``9W``"`-P(`!7<``(0W
+M`@`&=P``P#<"``5W``#$-P(`!G<``%@X`@`%=P``7#@"``9W``#D.`(`!7<`
+M`.@X`@`&=P``;#D"``4"``!P.0(`!@(``-0Y`@`%=P``V#D"``9W``#L.0(`
+M!7<``/`Y`@`&=P``/#H"``5W``!`.@(`!G<``'0Z`@`%`@``>#H"``8"``!\
+M.@(`!8T!`(`Z`@`&C0$`A#H"``4U`0"(.@(`!C4!`,PZ`@`%`@``U#H"``8"
+M``#<.@(`!8T!`.`Z`@`&C0$`Y#H"``4U`0#H.@(`!C4!`#0[`@`%`@``/#L"
+M``8"``!`.P(`!8T!`$0[`@`&C0$`2#L"``4U`0!,.P(`!C4!`)@[`@`%`@``
+MH#L"``8"``"H.P(`!8T!`*P[`@`&C0$`L#L"``4U`0"T.P(`!C4!``P\`@`%
+M`@``$#P"``8"```8/`(`!8T!`!P\`@`&C0$`(#P"``4U`0`D/`(`!C4!`#`_
+M`@`%`0``-#\"``8!``!H/P(`!>8``&P_`@`&Y@``&$`"``4!```<0`(`!@$`
+M`*Q``@`%`0``L$`"``8!```\00(`!0$``$!!`@`&`0``V$$"``4!``#<00(`
+M!@$``#1"`@`%`0``.$("``8!``#`0@(`!0$``,1"`@`&`0``<$,"``4!``!T
+M0P(`!@$``$1$`@`%`0``2$0"``8!```P1`(`!0$``)Q$`@`&`0``^$8"``4!
+M``#\1@(`!@$``.1*`@`%@P``Z$H"``:#```$2P(`!8,```A+`@`&@P``2$T"
+M``4!``!,30(`!@$``&A-`@`%`0``;$T"``8!``!\3@(`!0$``(!.`@`&`0``
+M/$\"``4!``!`3P(`!@$``,!/`@`%`0``Q$\"``8!``!@4`(`!<T``&10`@`&
+MS0``A%`"``7-``"(4`(`!LT``+10`@`%`0``N%`"``8!``#`4`(`!0$``,10
+M`@`&`0``S%`"``4!``#04`(`!@$``-A0`@`%`0``W%`"``8!``#D4`(`!0$`
+M`.A0`@`&`0``\%`"``4!``#T4`(`!@$``/Q0`@`%`0```%$"``8!```(40(`
+M!2$```Q1`@`&(0``;%$"``4"``!P40(`!@(``'11`@`%C0$`>%$"``:-`0!\
+M40(`!34!`(!1`@`&-0$`X%$"``4"``#D40(`!@(``.A1`@`%C0$`[%$"``:-
+M`0#P40(`!34!`/11`@`&-0$`0%("``4"``!$4@(`!@(``$A2`@`%C0$`3%("
+M``:-`0!04@(`!34!`%12`@`&-0$`N%,"``4O``"\4P(`!B\``-!3`@`%D`$`
+MU%,"``:0`0#T4P(`!8T!`/A3`@`&C0$`&%0"``:-`0!L5`(`!2\``+14`@`&
+M+P``)%4"``4O```H50(`!B\``)15`@`%+P``F%4"``8O``#\50(`!2\```!6
+M`@`&+P``/%8"``6-`0!`5@(`!HT!`$A7`@`%`@``3%<"``8"``!X5P(`!0(`
+M`'Q7`@`&`@``M%<"``4"``"X5P(`!@(``/17`@`%`@``^%<"``8"```\6`(`
+M!7<``$!8`@`&=P``<%@"``4"``!T6`(`!@(``+A8`@`%`@``O%@"``8"``#`
+M6`(`!8T!`,18`@`&C0$`R%@"``4U`0#,6`(`!C4!`!!9`@`%`@``&%D"``8"
+M```@60(`!8T!`"19`@`&C0$`*%D"``4U`0`L60(`!C4!`'A9`@`%`@``@%D"
+M``8"``"$60(`!8T!`(A9`@`&C0$`C%D"``4U`0"060(`!C4!`-Q9`@`%`@``
+MY%D"``8"``#L60(`!8T!`/!9`@`&C0$`]%D"``4U`0#X60(`!C4!`%!:`@`%
+M`@``5%H"``8"``!86@(`!8T!`%Q:`@`&C0$`8%H"``4U`0!D6@(`!C4!``A;
+M`@`%`@``#%L"``8"``"<7`(`!0$``*!<`@`&`0``\%X"``4!``#T7@(`!@$`
+M`%1A`@`%`0``6&$"``8!``"H80(`!0$``*QA`@`&`0``0&("``4!``!$8@(`
+M!@$``)AF`@`%D`$`G&8"``:0`0#49@(`!0$``-AF`@`&`0``&&<"``6-`0`<
+M9P(`!HT!`%AG`@`%C0$`7&<"``:-`0`,:`(`!8T!`!!H`@`&C0$`;&@"``6#
+M``!P:`(`!H,``(QH`@`%@P``D&@"``:#``"L:`(`!8,``+!H`@`&@P``2&H"
+M``4!``"8:@(`!@$``*QJ`@`%`0``L&H"``8!``!H:P(`!0$``&QK`@`&`0``
+M[&L"``4!``#P:P(`!@$``*1L`@`%`0``J&P"``8!``"\;`(`!0$``,!L`@`&
+M`0``4&T"``4!``!4;0(`!@$``/!M`@`%S0``]&T"``;-```4;@(`!<T``!AN
+M`@`&S0``,&X"``7-```T;@(`!LT``%AN`@`%`0``7&X"``8!``!D;@(`!0$`
+M`&AN`@`&`0``<&X"``4!``!T;@(`!@$``'QN`@`%`0``@&X"``8!``"(;@(`
+M!0$``(QN`@`&`0``E&X"``4!``"8;@(`!@$``*!N`@`%`0``I&X"``8!``"L
+M;@(`!2$``+!N`@`&(0``#&\"``4"```0;P(`!@(``!1O`@`%C0$`&&\"``:-
+M`0`<;P(`!34!`"!O`@`&-0$`@&\"``4"``"$;P(`!@(``(AO`@`%C0$`C&\"
+M``:-`0"0;P(`!34!`)1O`@`&-0$`X&\"``4"``#D;P(`!@(``.AO`@`%C0$`
+M[&\"``:-`0#P;P(`!34!`/1O`@`&-0$`6'$"``4O``!<<0(`!B\``'!Q`@`%
+MD`$`='$"``:0`0"4<0(`!8T!`)AQ`@`&C0$`N'$"``:-`0`,<@(`!2\``%1R
+M`@`&+P``Q'("``4O``#(<@(`!B\``"1S`@`%+P``*',"``8O``!\<P(`!2\`
+M`(!S`@`&+P``O',"``6-`0#`<P(`!HT!`*1U`@`%`@``5'4"``4"``!`=0(`
+M!0(``/AT`@`%`@``X'0"``4"``"H=0(`!@(``-1U`@`%`@``V'4"``8"```0
+M=@(`!0(``!1V`@`&`@``4'8"``4"``!4=@(`!@(``*QV`@`%=P``L'8"``9W
+M```H=P(`!2\``"QW`@`&+P``1'<"``5W``!(=P(`!G<``&QW`@`%=P``<'<"
+M``9W``"D=P(`!0(``"1W`@`%`@``J'<"``8"``#L=P(`!0(``/!W`@`&`@``
+M]'<"``6-`0#X=P(`!HT!`/QW`@`%-0$``'@"``8U`0!$>`(`!0(``$QX`@`&
+M`@``5'@"``6-`0!8>`(`!HT!`%QX`@`%-0$`8'@"``8U`0"L>`(`!0(``+1X
+M`@`&`@``N'@"``6-`0"\>`(`!HT!`,!X`@`%-0$`Q'@"``8U`0`0>0(`!0(`
+M`!AY`@`&`@``('D"``6-`0`D>0(`!HT!`"AY`@`%-0$`+'D"``8U`0"$>0(`
+M!0(``(AY`@`&`@``C'D"``6-`0"0>0(`!HT!`)1Y`@`%-0$`F'D"``8U`0`\
+M>@(`!0(``$!Z`@`&`@``T'L"``4!``#4>P(`!@$``"1^`@`%`0``*'X"``8!
+M``"(@`(`!0$``(R``@`&`0``W(`"``4!``#@@`(`!@$``'2!`@`%`0``>($"
+M``8!``#,A0(`!9`!`-"%`@`&D`$`"(8"``4!```,A@(`!@$``$R&`@`%C0$`
+M4(8"``:-`0",A@(`!8T!`)"&`@`&C0$`0(<"``6-`0!$AP(`!HT!`*"'`@`%
+M@P``I(<"``:#``#`AP(`!8,``,2'`@`&@P``X(<"``6#``#DAP(`!H,``'B)
+M`@`%`0``R(D"``8!``#<B0(`!0$``.")`@`&`0``F(H"``4!``"<B@(`!@$`
+M`!R+`@`%`0``((L"``8!``#4BP(`!0$``-B+`@`&`0``[(L"``4!``#PBP(`
+M!@$``(",`@`%`0``A(P"``8!```@C0(`!<T``"2-`@`&S0``1(T"``7-``!(
+MC0(`!LT``&"-`@`%S0``9(T"``;-``"(C0(`!0$``(R-`@`&`0``E(T"``4!
+M``"8C0(`!@$``*"-`@`%`0``I(T"``8!``"LC0(`!0$``+"-`@`&`0``N(T"
+M``4!``"\C0(`!@$``,2-`@`%`0``R(T"``8!``#0C0(`!0$``-2-`@`&`0``
+MW(T"``4A``#@C0(`!B$``,@````"`0``S`````(!``#0`````@$``-0````"
+M`0``V`````(!``#<`````@$``.`````"`0``Y`````(!``#H`````@$``.P`
+M```"`0``\`````(!``#T`````@$``/@````"`0``_`````(!`````0```@$`
+M``0!```"`0``"`$```(!```,`0```@$``!`!```"`0``%`$```(!```8`0``
+M`@$``!P!```"`0``(`$```(!```D`0```@$``"@!```"`0``+`$```(!```P
+M`0```@$``#0!```"`0``.`$```(!```\`0```@$``$`!```"`0``1`$```(!
+M``!(`0```@$``$P!```"`0``4`$```(!``!H`@```@P!`&P"```"9```<`(`
+M``+```!T`@```K,``'@"```">@$`?`(```+3``"``@```E0``(0"```"WP``
+MB`(```*@``",`@```G<!`)`"```"2@$`E`(```*]``"8`@```CX``)P"```"
+MA```H`(```)7``"D`@```B```*@"```":`$`K`(```*3`0"P`@```BX``+0"
+M```"C```N`(```)'`0"\`@```BD``,`"```"/```Q`(```)H``#(`@```GX!
+M`,P"```">0$`T`(```(9`0#4`@```K0``-@"```"7P$`W`(```)B`0#@`@``
+M`@D!`.0"```"W```Z`(```(\`0#L`@```I```/`"```"<@$`]`(```*^``#X
+M`@```K8``/P"```"A0````,```*N```$`P```E4```@#```"QP``#`,```(X
+M`0`0`P```@X!`!0#```"I```&`,```(S`0`<`P```ND``"`#```"7`$`)`,`
+M``),`0`H`P```BL!`"P#```",@``,`,```*U```T`P```EH!`#@#```"&P$`
+M/`,```(D`0!``P```CT``$0#```"=```2`,```)$`0!,`P```N0``%`#```"
+M3P``5`,```(V``!8`P```HL``%P#```""0``8`,```+U``!D`P```CT!`&@#
+M```"-`$`;`,```+V``!P`P```G\!`'0#```":0``>`,```(+``!\`P```F0!
+M`(`#```"K```A`,```(/`0"(`P```A@!`(P#```";@$`D`,```(R`0"4`P``
+M`J8``)@#```"10``G`,```(M`0"@`P```A,``*0#```"NP``J`,```)O``"L
+M`P```O@``+`#```"^@``M`,```)1`0"X`P```F,!`+P#```"?0$`P`,```(/
+M``#$`P```DX!`,@#```"(@$`S`,```(+`0#0`P```J$``-0#```"3P$`V`,`
+M``(!``#<`P```I$!`.`#```"*@$`Z`,```):`0#L`P```AL!`/`#```")`$`
+M]`,```(]``#X`P```G0``/P#```"`0``B!H```)%`0",&@```F4!`)`:```"
+M5P$`E!H```)\`0"8&@```F,``)P:```"=0``H!H```*3``"D&@```FP``*@:
+M```"#0``K!H```(U``"P&@```F$``+0:```"8@``N!H```(Y``"\&@```FL!
+M`,`:```"#0$`Q!H```*'`0#(&@```H$``,P:```"=0$`T!H```("`0#4&@``
+M`JH``-@:```")P$`W!H```(B``#@&@```@<!`.0:```"&0``Z!H```)G`0#L
+M&@```N<``/`:```"'P``]!H```(J``#X&@```JT``/P:```">P$``!L```)I
+M`0`$&P```G8!``@;```".0$`#!L```+R```0&P```O\``!0;```"[@``&!L`
+M``(2`0`<&P```GT``"`;```"F```)!L```)S```H&P```DD!`"P;```"GP``
+M,!L```)````T&P```CH!`#@;```"-@$`/!L```)Y``!`&P```CH``$0;```"
+M30$`2!L```+=``!,&P```BX!`%`;```"XP``5!L```+#``!8&P```N(``%P;
+M```"00$`8!L```+.``!D&P```C<``&@;```"8```;!L```+8``!P&P```D8!
+M`'0;```"5`$`>!L```(F`0!\&P```AP``(`;```"6P``A!L```(P`0"(&P``
+M`I(!`(P;```"2```D!L```*:``"4&P```F`!`)@;```"U```G!L```($`0"@
+M&P```AX``*0;```"^P``J!L```(X``"L&P```@`!`+`;```"ZP``M!L```*-
+M``"X&P```B<``+P;```"4```P!L```*2``#$&P```ML``,@;```"RP``S!L`
+M``)6`0#0&P```LH``-0;```"40$`V!L```*.`0#<&P```@@``.`;```"H@``
+MY!L```)P``#H&P```FH``.P;```"[P``\!L```+S``#T&P```@8!`/@;```"
+M`0``_!L```(L`0``'````D@!``@<```"PP``#!P```+B```0'````D$!`!0<
+M```"S@``&!P```(W```<'````@$``(@Z```"`0``C#H```(!``"0.@```@$`
+M`)0Z```"`0``F#H```(!``"<.@```@$``*`Z```"`0``I#H```(!``#X.P``
+M`EH``/P[```"@````#P```)S`0`$/````FL```@\```"1```##P```+7```0
+M/````K@``!0\```"'`$`&#P```*K```</````E,``"`\```"G0``)#P```)6
+M```H/````@,!`"P\```"7@$`,#P```**```T/````OX``#@\```"Y0``/#P`
+M``*8`0!`/````HP!`$0\```"N0``2#P```)\``!,/````B,!`%`\```"*```
+M5#P```)=`0!8/````E(!`%P\```"A@``8#P```)A`0!D/````EX``&@\```"
+M/P$`;#P```(!`0!P/````OP``'0\```"$@``>#P```)L`0!\/````GH``(`\
+M```"X```A#P```)Q`0"(/````MD``(P\```"E@``D#P```(Q`0"4/````OD`
+M`)@\```"$```G#P```*<``"@/````@H``*0\```"EP``J#P```(^`0"L/```
+M`K```+`\```"Z```M#P```(_``"X/````A\!`+P\```"HP``P#P```*Q``#$
+M/````A<!`,@\```"30``S#P```)"`0#0/````E`!`-0\```"%`$`V#P```*4
+M`0#</````DD``.`\```"Q@``Y#P```*H``#H/````H(!`.P\```"3```\#P`
+M``*.``#T/````H8!`/@\```"IP``_#P```+,````/0```D(```0]```"2P``
+M"#T```(M```,/0```D$``!`]```".P``%#T```+J```8/0```D8``!P]```"
+M?P``(#T```(T```D/0```C,``"@]```"&```+#T```)R```P/0```O<``#0]
+M```";0``.#T```(E`0`\/0```H$!`$`]```"T```1#T```)1`0!(/0```I$`
+M`$P]```"CP$`4#T```(0`0!4/0```M$``%@]```"(P``7#T```)T`0!@/0``
+M`FX``&0]```"U0``:#T```+%``!L/0```NP``'`]```"B@$`>#T```(7`0!\
+M/0```DT``(`]```"0@$`A#T```)0`0"(/0```A0!`(P]```"E0$`E#T```(!
+M``!P3@```@$``'1.```"`0``>$X```(!``!\3@```@$``(!.```"`0``A$X`
+M``(!``#@3@```@$``.1.```"`0``Z$X```(!``#L3@```@$``/!.```"`0``
+M]$X```(!``#X3@```@$``/Q.```"`0```$\```(!```$3P```@$```A/```"
+M`0``#$\```(!```03P```@$``!1/```"`0``&$\```(!```<3P```@$``"!/
+M```"`0``)$\```(!```H3P```@$``"Q/```"`0``,$\```(!```T3P```@$`
+M`#A/```"`0``/$\```(!``!`3P```@$``$1/```"`0``2$\```(!``!,3P``
+M`@$``%!/```"`0``6$\```(!``!<3P```@$``&!/```"`0``9$\```(!``!H
+M3P```@$``(A/```"`0``C$\```(!``"03P```@$``)1/```"`0``F$\```(!
+M``"<3P```@$``*!/```"`0``I$\```(!``"H3P```@$``*Q/```"`0``L$\`
+M``(!``"T3P```@$``+A/```"`0``O$\```(!``#`3P```@$``,1/```"`0``
+MR$\```(!``#,3P```@$``-!/```"`0``U$\```(!``#83P```@$``-Q/```"
+M`0``X$\```(!``#D3P```@$``.A/```"`0``[$\```(!``#P3P```@$``/1/
+M```"`0``D%L```(!``"46P```@$``)A;```"`0``G%L```(!``"@6P```@$`
+M`*1;```"`0``J%L```(!``"0:````@$``)1H```"`0``F&@```(!``"<:```
+M`@$``*!H```"`0``I&@```(!``"H:````@$``*QH```"`0``N'0```(!``"\
+M=````@$``,!T```"`0``Q'0```(!``#(=````@$``,QT```"`0``T'0```(!
+M``#`@````@$``,2````"`0``R(````(!``#,@````@$``-"````"`0``U(``
+M``(!``#8@````@$``*B.```"`0``K(X```(!``"PC@```@$``+2.```"`0``
+MN(X```(!``"\C@```@$``,".```"`0``#`````("```0`````@(``!0````"
+K`@``&`````("```<`````@(``"`````"`@``)`````("```H`````@(`````
+`
+end
diff --git a/sys/contrib/dev/ath/public/mips1-le-elf.inc b/sys/contrib/dev/ath/public/mips1-le-elf.inc
new file mode 100644
index 0000000..e416725
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips1-le-elf.inc
@@ -0,0 +1,72 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/mips1-le-elf.inc#2 $
+#
+
+#
+# Configuration for building little-endian MIPS1 using the 5.01
+# linux-mips.org toolchain (manually moved to /pub/gnu from
+# /pub/gnu/local where rpm --prefix=/pub/gnu bogusly installs them).
+
+#
+# http://www.linux-mips.org/toolchain.html
+#
+# /pub/gnu/bin/mips-linux-gcc -v
+# Reading specs from /pub/gnu/bin/../lib/gcc-lib/mips-linux/2.96-mips3264-000710/specs
+# gcc version 2.96-mips3264-000710
+# /pub/gnu/bin/mips-linux-as -v
+# GNU assembler version 2.12.90.0.7 (mips-linux) using BFD version 2.12.90.0.7 20020423
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/mips-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EL
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+COPTS+= -G 0 -EL -mno-abicalls -fno-pic -mips1 -Wa,--trap \
+ -fno-strict-aliasing -fno-common -fomit-frame-pointer -mlong-calls
diff --git a/sys/contrib/dev/ath/public/mips1-le-elf.opt_ah.h b/sys/contrib/dev/ath/public/mips1-le-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mips1-le-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/mipsisa32-be-elf.hal.o.uu b/sys/contrib/dev/ath/public/mipsisa32-be-elf.hal.o.uu
new file mode 100644
index 0000000..c01cd5f
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mipsisa32-be-elf.hal.o.uu
@@ -0,0 +1,6260 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/mipsisa32-be-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`0`````````````!``@````!`````````````WL4(````0`T````
+M```H``\`#.#_`_P```````````````````````!_[S"$__\D`@!8$((`5SP"
+M```H@@!9$$``("0"$0<H@@`<$$``#R0"`%(H@@`:$$``4CP"```H@@`3$$``
+M*"0"`!,H@@`1$$``/#P"```D`@`'4((`-SP"```#X``(```0+1""`#L\`@``
+M*((`4Q!```8D`@!7)`(`'%""`#T\`@```^``"```$"U0@@`Q/`(```/@``@`
+M`!`M$((`)3P"```H@A$($$``$20"$1,D`@"1$((`*SP"```H@@"2$$``!R0"
+M$!0D@O]Z+$(``E!``"P``!`M"```5CP"``!0@@`F/`(```/@``@``!`M$((`
+M(CP"```H@A$4$$``!C0"\!,D`A$24((`##P"```#X``(```0+1""``P\`@``
+M-`+Q&U""``<\`@```^``"```$"T#X``()$(`@`/@``@D0@!P`^``""1"`0@#
+MX``()$(`\`/@``@D0@"0`^``""1"`-@#X``()$(`P`/@``@D0@!(`^``""1"
+M`*@#X``()$(`8`/@``@`````)[W_\/^_```PA/__)`(6C!""``8PI?__-`*G
+M)Q""``,D`A"W%((`!@``&"T\`@``)$(```!`^`D`H"`M`$`8+0!@$"W?OP``
+M`^``"">]`!`GO?_P,(3__R0"`@<0@@`Y_[\``"B"`@@00``4)`(1$RB"`!,0
+M0``))`(`$RB"`!$00``N/`(``"0"``<0@@`N/`(```@``+D``!@M$((`)3P"
+M```D@O_F+$(``U!``"L``!@M"```KB0$`!,0@@`=/`(``"B"$1000``,-`+Q
+M&R0"$0<0@@`;*((1"%!```,D`A$2"```JR0"$!00@@`3/`(```@``+D``!@M
+M4((`#SP"````1!`J%$``!C0"_QDT`O`3$((`!SP"```(``"Y```8+52"``T`
+M`!@M)`0`$SP"```(``"U)$(```@``+4D0@``/`(``"1"````0/@)``````@`
+M`+L`0!@M)`(``:T"```08``0`&`0+91B`<BD8@`(E&(!RJ1B``J,8@',K&(`
+M')1B`="D8@`@E&(!TJ1B`"*48@'4I&(`))1B`=:D8@`F`&`0+=^_```#X``(
+M)[T`$*R%`=@#X``()`(``2>]_\#_OP`X_[8`,/^U`"C_M``@_[,`&/^R`!#_
+ML0`(_[````"`H"T`H)@M`,"0+0#@B"T``(`M/`(``"16```\`@``)%4```*`
+M("T"P/@)`F`H+0!2$"0040`()`,``0*@^`DD!``*)A```2H"`^A40/_V`H`@
+M+0``&"T`8!`MW[\`.-^V`##?M0`HW[0`(-^S`!C?L@`0W[$`"-^P```#X``(
+M)[T`0```,"T0H``(```8+0`#$$`P@P`!`$,8)23&``$`Q1`K%$#_^@`$($(#
+MX``(`&`0+3#G__\`!Q!``$<0(0`"$(``11`AE$D`)A$@`)(``!`M``<00`!'
+M$"$``A"``$40(9!#`"4D`@`"$&(`)"AB``,00``%)`(``Q!@``H`````"``!
+MH```,"T08@!=``D0P"0"``108@!K``D0@`@``:```#`M$0``""0$`,``!Q!`
+M`$<0(0`"$(``11`AD$(`*51```$D!`!@``88P``&$@``0Q`C``(0@`!#$"$`
+M`A#``$D`&P``$!)1(``!``<`#0"","$(``&@),8`"HR"$C100``6C(02-(1"
+M``($0P`3C(02-``)$0```A`\``(0/CP#$&(T8TW3`$,`'```$!(``B&^``88
+MP`!D$"$D0@`5`$0`&P``$!)0@``!``<`#0`"$0`(``&@)$8`D!"``!<`"1"`
+ME((``C!"0`!00``3``D0@``)$,```A`\``(0/CP#$&(T8TW3`$,`'```$!(`
+M`B&^``88P`!D$"$D0@`5`$0`&P``$!)0@``!``<`#0`"$,`(``&@)$8`2``"
+M$#P``A`^/`,08C1C3=,`0P`<```0$@`"(;X`!AC``&00(21"`!4`1``;```0
+M$E"```$`!P`-``(0@`@``:`D1@`D``(0/``"$#X\`Q!B-&--TP!#`!P``!`2
+M``(AO@`&&,``9!`A)$(`%0!$`!L``!`24(```0`'``T``A"`"``!H"1&`!8`
+M`A`\``(0/CP#$&(T8TW3`$,`'```$!(``B&^``88P`!D$"$D0@`5`$0`&P``
+M$!)0@``!``<`#0`"&(`M(@/H%$```B1F`+TD9@!<,,+__P/@``@`````E*(`
+M`C!"`"`40``4)`0``I2B``(P0@#0)`,`P!!#``\D!``#E*(``C!"`-`D`P#0
+M$$,`"B0$``24H@`",$(`$!1```8D!``!E*(``C!""``40``")`0`!0``("T#
+MX``(`(`0+2>]_^#_OP`0_[$`"/^P````H(@M,,(`@!!```D`P(`M)`()M!"B
+M`&XD`P`.+*()M%1``!XF(_:9"``"(B8B]C`PP@$`$$``$R0"";0\`@``)$(`
+M``!`^`D`````$$``!C("`4`F(NRS+$(`,11``"4`$1"`,@(!0!!``%$F(NQX
+M+B(3B51``$XF(O!@"``"+"8B['@0H@!2)`,`#BRB";000``++*(3B"8C]ID\
+M`F9F-$)F9P!B`!P``!`2``(0/P`"$$,``Q_#"``"-`!#&",00``[)B+L>#P"
+M```D0@```$#X"0`````00``G+B(3)28B[+,L0@`Q$$``(RXB$R4`$1"``%$0
+M(0`"($``$1`\``(0/C0%S,P`!2PX-*7,S0!%`!P``!`2``(0O@`"&(``8A@A
+M)B+__A1B``<\`O__-$(_#0""$"$``A`\``(0/@@``AH`10`<-$(_"`""$"$`
+M`A`\``(0/C0#S,P``QPX-&/,S0!#`!P``!`2``(0O@@``C0`0!@M5$```R8B
+M]C`(``(L)B+P8``"$#P``A`^-`/,S``#'#@T8\S-`$,`'```$!(``A$^"``"
+M-"1#``\``A`\``(0/C0#S,P``QPX-&/,S0!#`!P``!`2``(8O@!@$"W?OP`0
+MW[$`"-^P```#X``()[T`(">]__#_OP`(_[````"@@"V,A1(T$*``##P"```D
+M0@```$#X"0`````\`P``)&,!(`!#$"&00@```@(`&```$!((``)2W[\`"``0
+M$$``4!`A``(0@`!0$",``A!`W[\`"-^P```#X``()[T`$">]__#_OP`(_[``
+M``"@@"V,A1(T$*``#CP"```D0@```$#X"0`````\`P``)&,!(`!#$"&00@``
+M`@(`&U!```$`!P`-```0$@@``G+?OP`(`!`0/``"$#XT`[HN``,<.#1CBZ,`
+M0P`<```0$@`"$3[?OP`(W[````/@``@GO0`0)[W_P/^_`##_M0`H_[0`(/^S
+M`!C_L@`0_[$`"/^P````@*`MD*(`!!1``"\`H)`M``"8+20#__\"4Q`AH$,`
+M!"9S``$J8@`@%$#__`)3$"&.0@``&$``)```F"T\`@``)%4````3@$`"$X`A
+M`!"`@`(2@"$F!``@D((`")"1``L"0A@AH',`!)"#``D`0Q`E`D(0(:!3``0F
+M$``H`H`@+0)`*"TD!@`.`B`X+0*@^`D``$`MI@(`!`*`("T"0"@M)`8`#@(@
+M."T"H/@))`@``:8"``8F<P`!CD(```)B$"H40/_A`!.`0-^_`##?M0`HW[0`
+M(-^S`!C?L@`0W[$`"-^P```#X``()[T`0"RB`",00`!=)(@!X``%$(`\`P``
+M)&,!*`!#$"&,0@```$``"``````(``+*E((""(T"`````A'",$(``0/@``@L
+M0@`!E0(`"JSB```#X``(```0+0@``LJ5`@`(C0(```@``PL``A."C0(````"
+M$\(P0@`!%$``/20#``T(``,3```8+8T"```(``,+``(70HT"```(``,+``(7
+M`HT"```(``,+``(6P@@``LJ,@@'X)`(``5#"_^2$@@'\$,``,```$"TD`@`"
+M4,+_WY2"`?XD`@`#4,+_W(R"`@`#X``()`(`#8T"```(``,+``(30HT"```(
+M``,+``(3`HT"```(``,+``(5PHT"```(``,+``(2@HT"```(``,+``(20B0"
+M``%0P@`.C((23%#```:-`@``)`(``E#"_\.4@A)(`^``""0"``T``A(""``#
+M$#!"``$#X``()`(`#8R"$F@00``")`,`#0``&"T#X``(`&`0+0@``LJ-`@`4
+M)`(`#`/@``@`````)`(`&1"B`!(LH@`:$$``!B0"`!XD`@`/$*(`!R0"``,(
+M``,Y`````%"B`!*LAQ)H"``#.0`````4P@`0+.(`!1!```X`````"``#-ZR'
+M`@`D`@`!$,(`!@`'$"LD`@`"4,(`!*2'$D@(``,Y`````*R"$DP#X``()`(`
+M`1$```,`````)`(`#*T"```#X``(```0+2>]_[#_OP!(_[X`0/^W`#C_M@`P
+M_[4`*/^T`"#_LP`8_[(`$/^Q``C_L````("@+0"@N"T`P/`M`."0+0#`B"TL
+MX@`(%$``&P``L"T\`@``)%4````6$(``5Q`AE%```)13``(`$!0``%,0):XB
+M```F,0`$)E+__`*`("T"H/@)`@`H+:XB```F,0`$)A``!`)P$"L40``$)E+_
+M_"Y"``000/_V`H`@+2Y"``@00/_I)M8``0(^$"/?OP!(W[X`0-^W`#C?M@`P
+MW[4`*-^T`"#?LP`8W[(`$-^Q``C?L````^``"">]`%`GO?_P_[\`"/^P```D
+M`@`-$*(`$@$@@"THH@`.4$``!20"`!T0H``*)((!R`@``Z<``!@M$*(`$22"
+M$E`D`@`>$*(`$0``&"T(``.H`&`0+:T"```(``.6)`(`$`#`*"V-!@``/`(`
+M`"1"#/P`0/@)C2<```@``Z:N`@``K0(```@``Y8D`@`8%.``!B0"``2M(@``
+MC0,``(R"`@0(``.FK&(``!3B``0``!@MC,(``*R"`@0D`P`!`&`0+=^_``C?
+ML````^``"">]`!",H@`$$$``8@``&"V,P@``K*(``(S"``2LH@`(C,(`"*RB
+M``R,P@`,K*(`$(S#`!`D`O__$&(`!2QB`0!00``!)`,`_P@``\&LHP`4)`(`
+M`JRB`!2,PP`4)`+__Q!B`!`L8@0!%$```@!@("TD!`0`)`(``:RB`!@`1!`K
+M$$``"B0#``$``Q!`-$,``0!D$"L40/_]``,00`@``]:LHP`8C,(`%*RB`!B,
+MPP`8)`+__Q!B`!`L8@0!%$```@!@("TD!`0`)`(``:RB`!P`1!`K$$``"B0#
+M``$``Q!`-$,``0!D$"L40/_]``,00`@``^NLHP`<)`(#_ZRB`!R4P@`<$$``
+M!R0"``J4PP`<+&(`$%!```$D`P`/"``#]:2C`""DH@`@E,(`'A!```<D`@`*
+ME,,`'BQB`!!00``!)`,`#P@``_^DHP`BI*(`(HS"`""LH@`DC,(`)*RB`"B,
+MP@`HK*(`+(S"`"RLH@`PC,,`!"0"``048@`&)`,``8RC``0D`@`!4&(``:RC
+M`#@D`P`!`^``"`!@$"V,P@`$$$``'@``&"V,P@`,K*(`"(S"``"LH@``C,(`
+M"*RB``2,P@`,K*(`"(S"`!"LH@`,C,(`%*RB`!",P@`8K*(`%(S"`!RLH@`8
+ME,(`(*2B`!R4P@`BI*(`'HS"`"2LH@`@C,(`**RB`"2,P@`LK*(`*(S"`#"L
+MH@`L)`,``0/@``@`8!`M)[W_X/^_`!C_L@`0_[$`"/^P````@)`M/`(``"1"
+M````0/@)`*"`+0!`B"T2(``7```0+88B`!940``0EB(`%@)`("T\`@``)$(`
+M``!`^`D"`"@M``*`0#P"```D0@&X`@*`(8Y"`<`"0"`M`$#X"0(@*"T(``14
+ME@,``)8C`!@`0Q`A``(4```"%`/?OP`8W[(`$-^Q``C?L````^``"">]`"`G
+MO?^@_[\`6/^^`%#_MP!(_[8`0/^U`#C_M``P_[,`*/^R`"#_L0`8_[``$`"`
+MF"VOH``$KZ``````N"T``+`MC((2,!!``$(``)`M/`(``"1>`;@`$A&``F(0
+M(211`C"&(@`6!$$`-98P`!8"8"`M/`,``"1C````8/@)`B`H+0!`H"T``A!`
+M`%X0(915```"%8`ACF(!P`)@("T`0/@)`B`H+0!0$"$``A0```*$`Y8B``(P
+M0@$`$$``#X^C``0"%Q`J4$``'B92``$"`+@MCF(!P`)@("T`0/@)`B`H+98C
+M`!8`0Q`A`J(0(P`"%``(``2L``*T`P(#$"I00``0)E(``:^P``0`%(!``AZ`
+M(8YB`<`"8"`M`$#X"0(@*"V6(P`6`$,0(98#````8A@C``,<```#'`.OHP``
+M)E(``8YB$C`"0A`K%$#_PP`2$8```)`M`!(1@`)B$"$D40(PAB(`%@1#``XF
+M4@`!CF(!P`)@("T`0/@)`B`H+0!`("V6(@`",$(!`!1```,`EA@ACZ(```""
+M&"&F(P`8)E(``2I"`$!40/_L`!(1@-^_`%C?O@!0W[<`2-^V`$#?M0`XW[0`
+M,-^S`"C?L@`@W[$`&-^P`!`#X``()[T`8#"E__^4@@``+$(P`A!```0PQO__
+M/`(```@`!-XD2@'(/`(``"1*`>```"`M)`D`9#P(4>LU"(4?``000`!*$"&4
+M0@```$8`&```&!(!(A`C``````!%`!@``!`2`&(8(0``````:``<```0$@`"
+M$#\``A%#``,?PP!#$".DX@``)(0``2B"``L40/_K).<``@/@``@`````,*7_
+M_R0"`/\0H@`3)`,`_Y2"```L0C`#$$``"P`%$(`LH@`_%$``!``%$(``11`A
+M"``%#B1"%2(`11`A``(00`@`!0XD0A/L`$40(21"$L`P0O__`$`8+0/@``@`
+M8!`M,*7__R0"`/\0H@`()`,`_Y2"```L0C`#4$```B2B"/PDH@E@,$+__P!`
+M&"T#X``(`&`0+2>]_\#_OP`X_[0`,/^S`"C_L@`@_[$`&/^P`!``@(`ME*(`
+M`"Q"0``40``'`*"0+92B`"Y00``%ED(``)2B`!800`"-)`,``99"```L0C`#
+M%$``&R03`5"60@%V$$``=0``B"T"8"@M)F(``3!3__^.`@&@`@`@+0!`^`D#
+MH#`M$$``?0``&"T`$1A``'(8(9>B`````A("I&(!8I.B``&D8@%D)C$``I9"
+M`78"(A`J%$#_[0)@*"T(``6LED(!=B03`0&.`@&@`@`@+20%`0``0/@)`Z`P
+M+1!``&<``!@MEZ,````#$D*F0@%B``,0@C!"`'^F0@%D``,90#!C`'^F0P%F
+M`F`H+29B``$P4___C@(!H`(`("T`0/@)`Z`P+1!``%4``!@MEZ,````#(L*6
+M0@%F`$00):9"`68``Q$",$(`?Z9"`6@``QC`,&,`?Z9#`6H"8"@M)F(``3!3
+M__^.`@&@`@`@+0!`^`D#H#`M$$``00``&"V7HP````,C0I9"`6H`1!`EID(!
+M:@`#$8(P0@!_ID(!;``#&$`P8P!_ID,!;@)@*"TF8@`!,%/__XX"`:`"`"`M
+M`$#X"0.@,"T00``M```8+9>C`````R/"ED(!;@!$$"6F0@%N``,2`C!"`'^F
+M0@%P``,00C!"`'^F0@%R``,9@#!C`'^F0P%T`F`H+8X"`:`"`"`M`$#X"0.@
+M,"T00``8```8+9>C`````QJ"ED(!=`!#$"6F0@%TED(!=A!```\``(@M/`(`
+M`"14$^B64P%V`!&`0`(2@"$F$`%@E@4``@*`^`D"0"`MI@(``B8Q``$",Q`J
+M%$#_]P`1@$`D`P`!`&`0+=^_`#C?M``PW[,`*-^R`"#?L0`8W[``$`/@``@G
+MO0!`)[W_X/^_`!C_L@`0_[$`"/^P````P(`ME+$`%`"@D"T`$2"``)$@(0`$
+M((``D2`A`!$00"1"``,``A""`((@(3P"```D0@```$#X"0`$((``0!@M$&``
+M/P``$"VN`P```!$00"1"``,``A""``(0@`!B$"&N`@`(IA$`!!(@`#0``#`M
+M)`<`!"0(``..!`````880`!D("&.!0`(``80@`!&$"$``A"``$80(0`"$(``
+M11`A`'(8(91C``"D0P``I(,`````("T`!A"``$80(0`"$(``1A`A``(H@(X"
+M``@`HA`A``08@`!D&"$``QB``&(0(:1$``2.`@`(`*(0(0!B&"$DA``!*((`
+M!!1`__.D8``&C@,`"``&$(``1A`A``(0@`!&$"$``A"``$,8(:1G``:.`P`(
+M`$,0(:1(`$(DQ@`!`-$0*E1`_]&.!```)`(``=^_`!C?L@`0W[$`"-^P```#
+MX``()[T`(">]__``H$@ME*(`%J3"``8D`MZMIZ(``*>B``(``!@ME,4`!@``
+M("T`A1`',$(``1A```<H8@`"$$``M```."T``Q!``%T0(:1$```D8P`!)(0`
+M`2B"``040/_T`(40!Y4B`!2DP@`$,$+__Q!``*<``#@ME,(`!!!``*,``$`M
+M)`H`!``(&$``:!@A``,8@`!H&"$``QA``2,8(21G`!B,Q``(``@0@`!($"$`
+M`A"``$@0(0`"$(``1"`AE&,`&*2#``",PP`(`$,0(93C`!*D0P`"```@+0`(
+M$(``2!`A``(0@`!($"$``BB`C,(`"`"B$"$`!!B``&08(0`#&(``8A@A)(0`
+M`2B"``040/_WI&``!I>C``(T`MZM5&(`(HS$``B7I`````@8@`!H&"$``QB`
+M`&@8(0`$$(``1!`A`$,0(0`"$(",PP`(`$,0(21$``2DB@`"E.(``J2"``24
+MXP`&`$,0(:2"``:4XP`*`$,0(:2"``B4XP`.`$,0(:2"``J4X@`$I((`#)3B
+M``BD@@`.E.(`#*2"`!"4X@`0"``&WJ2"`!(`""B``*@H(0`%*(``J"@A``4H
+M@`"D("&7HP````,0@`!#$"$``A"``$00(93C``*D0P`(C,0`"`"D("&7HP`"
+M``,0@`!#$"$``A"``$00(20#`!2D0P`(C,0`"`"D("&7HP`"``,0@`!#$"$`
+M`A"``$00(20#`".D0P`*C,0`"`"D("&7HP`"``,0@`!#$"$``A"``$00(20#
+M`#^D0P`,EZ0````$$(``1!`A``(0@`"B("&,P@`(`((@(22$``2DB@`"E((`
+M!)3C``8`0Q`AI((`!I3C``H`0Q`AI((`")3C``X`0Q`AI((`"I3B``2D@@`,
+ME.(`"*2"``Z4X@`,I((`$)3B`!"D@@`2EZ0``@`$$(``1!`A``(0@`"B("&,
+MP@`(`((@(22$``0D`@`#I((``I3B`!2D@@`,E.(`%J2"``Z4X@`8I((`$"4(
+M``&4P@`$`0(0*A1`_V$`"!A`)`<``0#@$"T#X``()[T`$">]_G#_OP&`_[<!
+M>/^V`7#_M0%H_[0!8/^S`5C_L@%0_[$!2/^P`4``@(@M`*"@+202`5```*@M
+M)`(``1*B`#```)@M*J(``A!```4D`@`"4J``!Y:"`!8(``@=```8+5*B`#R6
+M@@`<"``'4```&"U00`$5)K4``2IB``H00`!+/!<```)`*"TF4@`!CB(!H`(@
+M("T`0/@)`Z`P+1!``0X``!@MDZ4``1"@`$``$X!``AV`(29S``$F]A/H`L#X
+M"0*`("VF`@`(EZ(````"*@(0H``V`!.`0`(=@"$F<P`!`L#X"0*`("VF`@`(
+M*F(`"A1`_^4"0"@M"``'4R>D`""6@@`:4$``\":U``$``(`M)`0`_P`0$$``
+M5!`A)$,!4)1B``001``%`!,00`!=$"&48P`$I$,`""9S``$F$``!*@(``Q1`
+M__0`$!!`"``'4R>D`"!00`#<)K4``0``@"TD!`#_`!`00`!4$"$D0P%(E&(`
+M!A!$``4`$Q!``%T0(91C``:D0P`()G,``280``$J`@`#%$#_]``0$$`(``=3
+M)Z0`(`@`"!X`8!`M)Z0`(#P"```D0@```$#X"20%`1RGLP`T&F``I```@"T`
+M$!!``%T8(91D``BD9``@`%`0(0`"$(``4!`A``(00`!=$"&D1``X`D`H+292
+M``&.(@&@`B`@+0!`^`D#H#`M$$``L@``&"T`$!A``'`8(0`#&(``<!@A``,8
+M0`!]&"&3I``!EZ(````"$$`P0@$``((@(Z1D`#R7H@````(B`@`"$\(``A(`
+M`((@(Z1D`$`"0"@M)E(``8XB`:`"("`M`$#X"0.@,"T00`"8```8+0`0&$``
+M<!@A``,8@`!P&"$``QA``'T8(9.D``&7H@````(00#!"`0``@B`CI&0`1)>B
+M`````B("``(3P@`"$@``@B`CI&0`2`)`*"TF4@`!CB(!H`(@("T`0/@)`Z`P
+M+1!``'X``!@M`!`80`!P&"$``QB``'`8(0`#&$``?1@AEZ(``#!"`!^D8@`^
+M)&,`0)>B`````A%",$(`'Z1B``*7H@````(2@C!"`!^D8@`&`D`H+292``&.
+M(@&@`B`@+0!`^`D#H#`M$$``9```&"T`$!A``'`8(0`#&(``<!@A``,80`!]
+M&"$D8P!(DZ0``9>B`````A!`,$(!``""(".D9``$EZ(````"(@(``A/"``(2
+M``""(".D9``&`D`H+292``&.(@&@`B`@+0!`^`D#H#`M$$``20``&"T`$!!`
+M`%`0(0`"$(``4!`A``(00`!=("&3HP`!EZ(````"$$`P0@$``&(8(Z2#`%"6
+M@@``+$)``Q1```@`$!A`E((`2*2"`$J7H@````(2`C!"`#\(``?YI((`.@!P
+M&"$``QB``'`8(0`#&$``?1@AEZ(````"(@(``A/"``(2``""(".D9`!*)`(`
+M`:1B`#HF$``!`A,0*A1`_U\`$!!``!4P0`#4$"&40@!HIZ(`-@#5,"$`!C"`
+M`H8P(23&#60"("`M/`(``"1"%Q@`0/@))Z4`(!!``!(``!@M`!4P0`#5,"$`
+M!C"``H8P(23&#60"("`M/`(``"1"&(0`0/@))Z4`(!!```8``!@M)K4``2JB
+M``,40/[;)`(``20#``$`8!`MW[\!@-^W`7C?M@%PW[4!:-^T`6#?LP%8W[(!
+M4-^Q`4C?L`%``^``"">]`9`GO?_@_[\`&/^R`!#_L0`(_[````"@B"T``(`M
+M/`(``"12````$!!``%`0(0`"$(`"(A`AC$0-9%"```0F$``!`D#X":Q`#60F
+M$``!*@(``U1`__4`$!!`W[\`&-^R`!#?L0`(W[````/@``@GO0`@`(!`+3"E
+M__^DA0`4E(,`%C!B``$00``"``!(+20)``$``Q!",$(``1!```0``Q"")2(`
+M`3!)__\``Q"",$(``1!```0``Q#")2(``3!)__\``Q#",$(``1!```(E(@`!
+M,$G__Q"@`!(``#@M``<00`!&&"&49````$@8(:1D````1Q`A``(9``!#$"$`
+M`A!``$@0(:1$`!BD20`:).(``3!'__\`Y1`K%$#_\0`'$$`#X``(`````">]
+M_X#_OP!X_[X`</^W`&C_M@!@_[4`6/^T`%#_LP!(_[(`0/^Q`#C_L``P`("8
+M+0"@H"T`P+@MKZ<`(`$`J"TQ-@#_,/'__Q$``#\``)`M/`(``"1>%$@"("@M
+M)B(``3!1__^.8@&@`F`@+0!`^`D#H#`M$$`!K```&"V3I0`!$*``,@+@("T6
+MP``+`D"`+29"``$P4O__`!"`0`(=@"$\`P``)&,3Z`!@^`D"@"`M"``(J:8"
+M``@F0@`!,%+__P`0@$`"'8`ADZ4``0/`^`D"@"`MI@(`")>B`````BH"$*``
+M&@+@("T6P``+`D"`+29"``$P4O__`!"`0`(=@"$\`P``)&,3Z`!@^`D"@"`M
+M"``(PJ8"``@F0@`!,%+__P`0@$`"'8`AEZ4````%*@(#P/@)`H`@+:8"``@"
+M51`K%$#_Q@(@*"T"X"`M`D`H+3P"```D0B$4`$#X"2>F``@`%1!"CZ,`(`!B
+M$"$P4?__EN(`%!!``6L``)`M`!(00`!2$"$``AD``$,0(0`"$$`"XA`A)%``
+M&)8"``(00``Y+$(``@(@*"TF(@`!,%'__XYB`:`"8"`M`$#X"0.@,"T00`%9
+M```8+9>B```P0@`?I@(`#)>B`````A%",$(`?Z8"``27H@````(3`J8"`#P"
+M("@M)B(``3!1__^.8@&@`F`@+0!`^`D#H#`M$$`!1@``&"V7H@``,$(`/Z8"
+M`!27H@````(1@C!"``^F`@!$EZ(````"$H*F`@`<`B`H+28B``$P4?__CF(!
+MH`)@("T`0/@)`Z`P+1!``3,``!@MEZ(``#!"``^F`@!,EZ(````"$0(P0@`_
+MI@(`))8"``(L0@`"5$``198#``*7H@````(2@C!"`!^F`@`.EZ(````"$\*F
+M`@`&`B`H+28B``$P4?__CF(!H`)@("T`0/@)`Z`P+1!``1@``!@MEZ,``#!C
+M`#\``QA`E@(`!@!#$"6F`@`&EZ(````"$8(P0@`/I@(`/I>B`````A*"I@(`
+M%@(@*"TF(@`!,%'__XYB`:`"8"`M`$#X"0.@,"T00`$"```8+9>B```P0@`/
+MI@(`1I>B`````A$",$(`/Z8"`!Z7H@````(2@C!"``^F`@!.EZ(````"$X*F
+M`@`F`B`H+28B``$P4?__CF(!H`)@("T`0/@)`Z`P+1!``.L``!@MEZ,``#!C
+M``\``QB`E@(`)@!#$"4(``ESI@(`)B0"``%48@`8E@(``I>B`````A*",$(`
+M#Z8"`%27H@````(3@J8"`"P"("@M)B(``3!1__^.8@&@`F`@+0!`^`D#H#`M
+M$$``T0``&"V7HP``,&,`#P`#&("6`@`L`$,0):8"`"R6`@`"+$(``U1``#>6
+M`P`"EZ(````"$0(P0@`?I@(`$)>B`````A)"I@(`"`(@*"TF(@`!,%'__XYB
+M`:`"8"`M`$#X"0.@,"T00`"W```8+9>B```P0@`/I@(`0)>B`````A$",$(`
+M/Z8"`!B7H@````(2@C!"``^F`@!(EZ(````"$X*F`@`@`B`H+28B``$P4?__
+MCF(!H`)@("T`0/@)`Z`P+1!``*```!@MEZ,``#!C``\``QB`E@(`(`!#$"6F
+M`@`@EZ(````"$0(P0@`/I@(`4)>B`````A(",$(`/P@`";BF`@`H)`(``E1B
+M``J6`@`"EZ(````"$0(P0@`/I@(`5I>B`````A(",$(`/Z8"`"Z6`@`"+$(`
+M!%1``&*6`P`"EZ(````"$X*F`@`2`B`H+28B``$P4?__CF(!H`)@("T`0/@)
+M`Z`P+1!``'8``!@MEZ,``#!C``<``QB`E@(`$@!#$"6F`@`2EZ(````"$,(P
+M0@!_I@(`"I>B`````A*",$(`#Z8"`$*7H@````(3@J8"`!H"("@M)B(``3!1
+M__^.8@&@`F`@+0!`^`D#H#`M$$``7```&"V7HP``,&,`#P`#&("6`@`:`$,0
+M):8"`!J7H@````(1`C!"``^F`@!*EZ(````"$@(P0@`_I@(`(I>B`````A."
+MI@(`4@(@*"TF(@`!,%'__XYB`:`"8"`M`$#X"0.@,"T00`!"```8+9>C```P
+M8P`#``,8@)8"`%(`0Q`EI@(`4I>B`````A"",$(`/Z8"`"J7H@````(2`C!"
+M``^F`@!:EZ(````"$P*F`@`R`B`H+28B``$P4?__CF(!H`)@("T`0/@)`Z`P
+M+1!``"@``!@MEZ,``#!C``,``QD`E@(`,@!#$"4(``HVI@(`,B0"``,48@`8
+M)D(``9>B`````A."I@(`6`(@*"TF(@`!,%'__XYB`:`"8"`M`$#X"0.@,"T0
+M0``2```8+9>B```P0@`#``(0@)8#`%@`8A@EI@,`6)>B`````A"",$(`/Z8"
+M`#`F0@`!,%+__Y;B`!0"0A`K%$#^F``2$$`D`P`!`&`0+=^_`'C?O@!PW[<`
+M:-^V`&#?M0!8W[0`4-^S`$C?L@!`W[$`.-^P`#`#X``()[T`@`"`0"V4H@`4
+MI((`%)2)`!8Q(@`!$$```@``:"TD#0`!``D00C!"``$00``$``D0@B6B``$P
+M3?__``D0@C!"``$00``$``D0PB6B``$P3?__``D0PC!"``%00``$E*(`%"6B
+M``$P3?__E*(`%!!``#8``%`M)`P`!"0+``$D#@`%``H00`!%&"&49````$@8
+M(:1D````2A`A``(9``!#$"$``A!``$@0(:1$`!BD30`<```X+0``("T`"A!`
+M`$H0(0!#$"$``C!```000`!$$"$``A#``,(0(0!(&"$`B1`',$(``1!```>D
+M9``>).(``3!'__\4ZP`)I&P`(`@`"I&D;@`@``000`!$$"$``A#``,(0(0!(
+M$"&D0``@)((``3!$__\L@@`$%$#_Z``$$$`E0@`!,$K__Y2B`!0!0A`K%$#_
+MT``*$$`#X``(`````">]__``H'@M)`+>K:>B``"GH@`"IZ(`!*>B``8``'`M
+ME,0`%@``4"TD!0`#`*H8(P!D$`<P0@`!$$``!B5"``$`#A!``%T0(:1#```E
+MS@`!)4(``3!*__\M0@`$%$#_]`"J&".5X@`4I,(`%#!"__\00`!&``!H+0`-
+M$$``31`A``(9``!#$"$``A!``>(8(21K`!@`1A`AE&,`&*1#`!@1P``T``!0
+M+0`-$$``31`A``(9``!#$"$``F!```H@0`"=$"&40P````,00`!#$"$``A#`
+M`8(0(0!&$"$D2``>`(L@(82"``P``A"`I0(`#I2"``2E`@`$)`<``94"``(`
+M0$@M`.(0*Q!``!8E0@`!``<H0`"H*"$`!QB``&H8(0`#&$``:Q@AA&0`-``$
+M($"4H@`,`$00(:2B``Z4H@`"E&,`#`!#$"&DH@`$).(``3!'__\`Z1`K%$#_
+M[@`'*$`E0@`!,$K__P%.$"L40/_4``H@0"6B``$P3?__E,(`%`&B$"L40/^]
+M``T00"0"``$#X``()[T`$">]_[#_OP!`_[4`./^T`##_LP`H_[(`(/^Q`!C_
+ML``0`("@+0"@@"T\`@``)$(!^&A#``!L0P`'LZ,``+>C``<``*@M/`(``"1"
+M````0/@))`0$%!!``(0`0(@ME@(`%A!``"N6$P#0`B`@+3P"```D0@```$#X
+M"20%!!26`@!HIB(`%@*`("T"`"@M`B`P+0)@."TD"``*/`(``"1"(<P`0/@)
+M``!(+1!``&HF$@UDE@(`:*9"`!8"0"`M/`(``"1"*2@`0/@)`B`H+0*`("T"
+M("@M/`(``"1"*G@`0/@)`D`P+1!``%L`````EB(`&@`"$$``71`AE$/__I8B
+M`!0`0P`8```0$@)BF"$F<P`%E@(`&E!``"R6`@`<`B`@+3P"```D0@```$#X
+M"20%!!26`@!JIB(`%@*`("T"`"@M`B`P+0)@."TD"``$/`(``"1"(<P`0/@)
+M)`D``1!``#TF$A%XE@(`:J9"`!8"0"`M/`(``"1"*2@`0/@)`B`H+0*`("T"
+M("@M/`(``"1"*G@`0/@)`D`P+1!``"X`````EB(`&@`"$$``71`AE$/__I8B
+M`!0`0P`8```0$@)BF"$F<P`"E@(`'%!``"(D%0`!`B`@+3P"```D0@```$#X
+M"20%!!26`@!LIB(`%@*`("T"`"@M`B`P+0)@."TD"``$/`(``"1"(<P`0/@)
+M)`D``A!``!`F$A6,E@(`;*9"`!8"0"`M/`(``"1"*2@`0/@)`B`H+0*`("T"
+M("@M/`(``"1"*G@`0/@)`D`P+51```$D%0`!$B``!#P"```D0@```$#X"0(@
+M("T"H!`MW[\`0-^U`#C?M``PW[,`*-^R`"#?L0`8W[``$`/@``@GO0!0)[W_
+MH/^_`%C_O@!0_[<`2/^V`$#_M0`X_[0`,/^S`"C_L@`@_[$`&/^P`!``@)`M
+ME*(``"Q"0``40``(`*"8+92C`"XD`@`!5&(`!99B```\`@``"``+RR1"&YR6
+M8@``+$)0`!1```T``*@MEF,`+B0"``)48@`*EF(```)`("T"8"@M/`(``"1"
+M+!``0/@)``````@`#(4`0!@MEF(``"Q",`,00``")!$!4"01`0`D`@`!$J(`
+M#RJB``(00``%)`(``A*@``<F,0`%"``,A0``&"U2H@`/EF(`'`@`"_0``!@M
+MEG8!=B9P`7@(``OV)G<!8I9B`!I00`":)K4``28Q`#>6=@.`)G`$/@@`"_8F
+M=P.(4$``DR:U``$F,0!&EG8#@"9P`Z((``OV)G<#@@@`#(8`8!`M$L``B0``
+MH"T\`@``)%X34``4$$``5Q`AE$(``*8"```"("@M)C$``8Y"`:`"0"`M`$#X
+M"0.@,"T00`"````8+9>B`````A*"I@(`!)>B`````A$",$(`/Z8"``*7H@``
+M``(0@#!"`#^F`@`>`B`H+28Q``&.0@&@`D`@+0!`^`D#H#`M$$``;0``&"V7
+MHP````,;@I8"`!X`0Q`EI@(`'I>B`````A(",$(`/Z8"`""7H@````(0@C!"
+M`#^F`@`BEZ(````"$0`P0@`_I@(`)`(@*"TF,0`!CD(!H`)`("T`0/@)`Z`P
+M+1!``%0``!@MEZ,````#&P*6`@`D`$,0):8"`"27H@````(1@C!"`#^F`@`F
+MEZ(``#!"`#^F`@`H`B`H+28Q``&.0@&@`D`@+0!`^`D#H#`M$$``0```&"V7
+MH@````(2@J8"`"J7H@````(1`C!"`#^F`@`LEZ(````"$(`P0@`_I@(`+@(@
+M*"TF,0`!CD(!H`)`("T`0/@)`Z`P+1!``"T``!@MEZ,````#&X*6`@`N`$,0
+M):8"`"Z7H@````(2`C!"`#^F`@`PEZ(````"$((P0@`_I@(`,I8%``*6!@`$
+M)@<`"`/`^`D"8"`ME@(`!@!`,"T00``.```H+0`%($``D"`AA(,`'@`#$$``
+M0Q`A``(0P`!#$"$``A!`I((`'B2E``$`IA`J%$#_]0`%($`FE``!`I80*A1`
+M_WLF$``T)K4``2JB``-40/]-EF(``"0#``$`8!`MW[\`6-^^`%#?MP!(W[8`
+M0-^U`#C?M``PW[,`*-^R`"#?L0`8W[``$`/@``@GO0!@)[W_H/^_`%C_O@!0
+M_[<`2/^V`$#_M0`X_[0`,/^S`"C_L@`@_[$`&/^P`!``@)@M`*"(+0``J"V6
+M(@``+$)``%1```26(@``EB(`)`@`#*LD4O^K+$(P`Q!```(D$@%0)!(!`"0"
+M``$2H@`/*J(``A!```4D`@`"$J``!R92`%4(``TN```8+5*B``^6(@`<"``,
+MRP``&"TD%P`()C`$W`@`#,TF-@3:EB(`&E!``&PFM0`!)E(`9207``(F,`5.
+M"``,S28V!4Q00`!E)K4``292`&DD%P`#)C`%+@@`#,TF-@4L"``-+P!@$"VF
+MP```$N``6@``H"T\`@``)%X3Z`)`*"TF4@`!CF(!H`)@("T`0/@)`Z`P+1!`
+M`%4``!@MEB(``"Q",`,40``#EZ(```@`#.$``A("``(20J8"``B6!0`(4*``
+M0B:4``$6H``%/`,```/`^`D"("`M"``,[Z8"``@D8Q1(`&#X"0(@("VF`@`(
+MEB(``"Q",`,40``'EZ(````"$((P0@`_I@(`!I>B```(``S^``(1```"$,(P
+M0@`_I@(`!I>B`````A#`,$(`/Z8"``0"0"@M)E(``8YB`:`"8"`M`$#X"0.@
+M,"T00``G```8+98B```L0C`#%$``"Y>C`````QL"E@(`!`!#$"6F`@`$EZ(`
+M```"$8(P0@`_I@(``@@`#2"7H@````,;0I8"``0`0Q`EI@(`!)>B`````A'"
+M,$(`/Z8"``*7H@````(00C!"`#^F`@``EL(``"1"``&FP@``)I0``0*7$"H4
+M0/^J)A``"B:U``$JH@`#5$#_=98B```D`P`!`&`0+=^_`%C?O@!0W[<`2-^V
+M`$#?M0`XW[0`,-^S`"C?L@`@W[$`&-^P`!`#X``()[T`8">]_Z#_OP!8_[X`
+M4/^W`$C_M@!`_[4`./^T`##_LP`H_[(`(/^Q`!C_L``0`("@+0"@J"V4H@``
+M+$)``!1```0DLP5DE+(`)`@`#50F4@`:E*(``"Q",`,00``")!(!OR02`6^6
+MH@$$$$``Z@``N"T`%Q!``%40(91"`0840``&EJ(``"Q",`-40`#=)E(`!P@`
+M#CLF4@`(+$(P`Q1``#,``(@M`D`H+292``&.@@&@`H`@+0!`^`D#H#`M$$``
+MU@``&"T`$1C``',8(9>B`````A("I&(``).B``&D8@`()C$``BHB``@40/_O
+M`D`H+0``B"TF4@`!CH(!H`*`("T`0/@)`Z`P+1!``,,``!@M`!$@P`"3("&7
+MHP````,2`C!"`#^D@@`"``,;@C!C``&L@P`$)(0`")>B```P0@`_I((``I>B
+M`````A&",$(``:R"``0F,0`"*B(`"!1`_^4"0"@M"``.&```B"T"0"@M)E(`
+M`8Z"`:`"@"`M`$#X"0.@,"T00`"D```8+9>C`````Q)"IF(````#$((P0@!_
+MIF(`"``#&4`P8P!_IF,`$`)`*"TF4@`!CH(!H`*`("T`0/@)`Z`P+1!``),`
+M`!@MEZ,````#(L*68@`0`$00):9B`!```Q$",$(`?Z9B`!@``QC`,&,`?Z9C
+M`"`"0"@M)E(``8Z"`:`"@"`M`$#X"0.@,"T00`"````8+9>C`````R-"EF(`
+M(`!$$"6F8@`@``,1@C!"`'^F8@`H``,80#!C`'^F8P`P`D`H+292``&.@@&@
+M`H`@+0!`^`D#H#`M$$``;0``&"V7HP````,CPI9B`#``1!`EIF(`,``#$@(P
+M0@!_IF(`.``#$((P0@`_IF(``@`#&0`P8P`_IF,`"@)`*"TF4@`!CH(!H`*`
+M("T`0/@)`Z`P+1!``%<``!@MEZ,````#(P*68@`*`$00):9B``H``QF",&,`
+M/Z9C`!*7H@``,$(`/Z9B`!H"0"@M)E(``8Z"`:`"@"`M`$#X"0.@,"T00`!$
+M```8+9>C`````Q*"IF(`(@`#$0(P0@`_IF(`*@`#&(`P8P`_IF,`,@)`*"TF
+M4@`!CH(!H`*`("T`0/@)`Z`P+1!``#,``!@MEZ(````"(X*68P`R`&08):9C
+M`#(``A(",$(`/Z9B`#H``(@M`!<00`!5$"$D5@$`/`(``"1>$^@`$1#``%,0
+M(8A#``"80P`#4&``%B8Q``&6P@`&,$(`!Q!```4`$8#`)`,``Q1#``@"$X`A
+M`!&`P`(3@"&6!0```\#X"0*@("T(``XWI@(``)8%```\`P``)&,42`!@^`D"
+MH"`MI@(``"8Q``$J(@`(%$#_Y``1$,`F]P`!EJ(!!`+B$"H40/\8)G,`0"0#
+M``$`8!`MW[\`6-^^`%#?MP!(W[8`0-^U`#C?M``PW[,`*-^R`"#?L0`8W[``
+M$`/@``@GO0!@)[W_H/^_`%#_MP!(_[8`0/^U`#C_M``P_[,`*/^R`"#_L0`8
+M_[``$`"`F"TD`@`/I*(`*J2B`"R4H@``+$(P`Q1```4`H)`M/`(``"15`A@(
+M``YG)`(`(#P"```D50(`)`(`$*9"`02.8@&@`F`@+8ZE````0/@)`Z`P+1!`
+M`VFOH``$EZ,````#$\*F0@`&``,3@C!"``&F0@`*``,2PC!"``>F0@`,``,1
+M`C!"`'^F0@`.ED(``"Q"0`!40``#)`(``0`#$,(P0@`!ID(`")>C`````Q""
+M,$(``:9"`!P``QA",&,``:9#`!J7H@``,$(``:9"`!:.L0`$`B`H+28Q``&.
+M8@&@`F`@+0!`^`D#H#`M$$`#0Z^@``27H@````(2`J)"`!Z3H@`!HD(`'Y9"
+M```L0D``%$``-```H"T"("@M)C$``8YB`:`"8"`M`$#X"0.@,"T00`,RKZ``
+M!)>C`````Q."ID(`+@`#$T(P0@`!KD(`R``#&P(P8P`!KD,`S)>B```P0@__
+MID(`,`(@*"TF,0`!CF(!H`)@("T`0/@)`Z`P+1!``QZOH``$EZ(``#!"#_^F
+M0@`DEZ(````"$X(P0@`!HD(`(Y9"```L0E``%$``#0``H"TF,0`"CF(!H`)@
+M("T"("@M`$#X"0.@,"T00`,+KZ``!)>B`````A$"ID(`T```H"TD%@`"/`(`
+M`"17%$@`%!"``%40(8Q1``@"("@M)C$``8YB`:`"8"`M`$#X"0.@,"T00`+Y
+MKZ``!``4&$``<A@AEZ(````"$@(P0@!_I&(`,I>B`````A"",$(`/Z1B`#B7
+MH@````(1`#!"`#^D8@!T`B`H+28Q``&.8@&@`F`@+0!`^`D#H#`M$$`"XZ^@
+M``0`%"!``)(@(22%`'"7HP````,;`I2B``0`0Q`EI*(`!)>B`````A&",$(`
+M/Z2"`'J7H@``,$(`/Z2"`(`"("@M)C$``8YB`:`"8"`M`$#X"0.@,"T00`+,
+MKZ``!``4&$``<A@AEZ(````"$H*D8@"&EZ(````"$0(P0@`_I&(`C)>B````
+M`A"`,$(`/Z1B`)("("@M)C$``8YB`:`"8"`M`$#X"0.@,"T00`*WKZ``!``4
+M($``DB`A)(4`CI>C`````QN"E*(`!`!#$"6DH@`$EZ(````"$@(P0@`_I((`
+MF)>B`````A"",$(`/Z2"`)Z7H@````(1`#!"`#^D@@"D`B`H+28Q``&.8@&@
+M`F`@+0!`^`D#H#`M$$`"FZ^@``0`%"!``)(@(22%`*"7HP````,;`I2B``0`
+M0Q`EI*(`!)>B`````A&",$(`/Z2"`*J7H@``,$(`/Z2"`+`"("@M)C$``8YB
+M`:`"8"`M`$#X"0.@,"T00`*$KZ``!`*2$"&7HP````,:`J!#`%8D`@`!$H(`
+M%2J"``(00``%`````!*```>7H@``"``/FP(@*"T2E@`5EZ(```@`#WT`````
+M``(90C!C``>F0P#P``(8@C!C``>F0P#R``(00#!"``<(``]]ID(`[)>B````
+M`A$",$(`!Z9"`/27H@``,$(`!P@`#WVF0@#V``(1`C!"``>F0@#XEZ(``#!"
+M``>F0@#Z%H``'0(@*"TF,0`!CF(!H`)@("T`0/@)`Z`P+1!``E*OH``$EZ,`
+M```#(\*60@#L`$00):9"`.P``Q,",$(`!Z9"`.X``Q)",$(`!Z9"`.@``Q&"
+M,$(`!Z9"`.H``QC",&,`!Z9#`.27H@``,$(`!Z9"`.8"("@M)C$``8YB`:`"
+M8"`M`$#X"0.@,"T00`(VKZ``!``4&$``<A@AEZ(````"$@*D8@`^DZ(``:1B
+M`$0"("@M)C$``8YB`:`"8"`M`$#X"0.@,"T00`(GKZ``!``4&$``<A@AEZ(`
+M```"$@*D8@!*DZ(``:1B`%`"("@M)C$``8YB`:`"8"`M`$#X"0.@,"T00`(8
+MKZ``!`*2&"&7H@````(2`J!B`%D`%!!``%(0(21#`%B3I``!,(+__S!"`(`0
+M0``$I&0`!#B"`/\``A`GI&(`!`(@*"TF,0`!CF(!H`)@("T`0/@)`Z`P+1!`
+M`@&OH``$`!080`!R&"&7H@````(10C!"`/^D8@!BEZ(````"$$(P0@`/I&(`
+M:)>B```P0@`!I&(`;I9"```L0D``5$``#I9"```2@``%EZ(``%*6``<``A-"
+M"``/]99"`````A-",$(``0@`#_2F0@`F,$(``:9"`"B60@``+$(P`U1``"Z6
+M0@```B`H+28Q``&.8@&@`F`@+0!`^`D#H#`M$$`!V*^@``0`%!!``%(0(9>C
+M`````QF",&,`?Z1#`+8D`@`!$H(`"RJ"``(00``%`````%*``!:7H@``"``0
+M)99"``!2E@`+EZ(```@`$"660@``EZ(``#!"``>F0@#\EZ(````"$,(P0@`'
+M"``0)*9"`0`P0@`'ID(`_I>B`````A#",$(`!P@`$"2F0@$",$(`/Z9"`!*6
+M0@``+$(P!!1``"T`%!!``!080`!R&"&7H@````(30J1B`+P"("@M)C$``8YB
+M`:`"8"`M`$#X"0.@,"T00`&CKZ``!``4($``DB`A)(0`N)>C`````QC`,&,`
+M.)2"``0`0Q`E%I8`":2"``27HP````,0PJ)"`"*60@``+$)`!A1```(``Q+"
+MID(`+!:``!*60@``+$)``%1```^60@``EZ,````#$@(P0@`_ID(!1@`#&,(P
+M8P`?"``06:9#`4H`4A`A)`,`"J1#`+PD`@`/HD(`(I9"```L0D``5$``[":4
+M``$D`@`!$H(`"RJ"``(00``%`````%*``*J60@``"``12":4``$2E@`I`B`H
+M+0@`$4@FE``!`B`H+28Q``&.8@&@`F`@+0!`^`D#H#`M$$`!9J^@``27L```
+M,@4`_P+@^`D"0"`MID(!5``0@@("0"`M`N#X"0(`*"VF0@%6`B`H+8YB`:`"
+M8"`M`$#X"0.@,"T00`%5KZ``!)>P```R!0#_`N#X"0)`("VF0@%8ED(``"Q"
+M0`%40`"])I0``0`0$@(P0@`_"``11Z9"`,0F,0`!CF(!H`)@("T`0/@)`Z`P
+M+1!``4&OH``$E[```#(%`/\"X/@)`D`@+:9"`4X`$(("`D`@+0+@^`D"`"@M
+MID(!4`(@*"TF,0`!CF(!H`)@("T`0/@)`Z`P+1!``2^OH``$EZ(``#!"`'^F
+M0@`0EZ(````"$<(P0@`_ID(`%`(@*"TF,0`!CF(!H`)@("T`0/@)`Z`P+1!`
+M`2"OH``$E[```#(%`/\"X/@)`D`@+:9"`5*60@``+$)``11```0"("@M`!`2
+M`C!"`#^F0@#&)C$``8YB`:`"8"`M`$#X"0.@,"T00`$-KZ``!)>B`````A%"
+M,$(`/Z9"`4B7H@``,$(`'Z9"`4R60@``+$)``E1``',FE``!`B`H+28Q``&.
+M8@&@`F`@+0!`^`D#H#`M$$``^J^@``23H@`!ID(`*I9"```L0E``5$``92:4
+M``&7HP````,2`C!"`'^F0@#6``,;PJ9#`-H"("@M)C$``8YB`:`"8"`M`$#X
+M"0.@,"T00`#FKZ``!)>D```P@P`?``,80)9"`-H`0Q`EID(`V@`$$4(P0@`_
+MID(`X@`$(L*B1`#=`B`H+8YB`:`"8"`M`$#X"0.@,"T00`#4KZ``!)>D```P
+M@P`'``,90))"`-T`0Q`EHD(`W0`$(,((`!%'HD0`WRQ"0`%40``Y)I0``0(@
+M*"TF,0`!CF(!H`)@("T`0/@)`Z`P+1!``,"OH``$EZ(``#!"`#^F0@#"ED(`
+M`"Q"4`!40``J)I0``9>C`````Q&",$(`?Z9"`-0``QM"ID,`V`(@*"TF,0`!
+MCF(!H`)@("T`0/@)`Z`P+1!``*NOH``$EZ0``#"#``<``QC`ED(`V`!#$"6F
+M0@#8``00PC!"`#^F0@#@``0B0J)$`-P"("@MCF(!H`)@("T`0/@)`Z`P+1!`
+M`)FOH``$EZ0``#"#``$``QG`DD(`W`!#$"6B0@#<``0@0J)$`-XFE``!*H(`
+M`Q1`_8L`%!"`ED(``"Q",`,00``>)`(`!(YB`:`"8"`M)`4`[`!`^`D#H#`M
+M$$``@J^@``27H@``,$(`!Z9"`/R7H@````(0PC!"``>F0@$`CF(!H`)@("TD
+M!0#M`$#X"0.@,"T00`!TKZ``!)>B```P0@`'ID(`_I>B`````A#",$(`!Z9"
+M`0(D`@`$ID(!8"0"``&F0@%>ID(!7*9``5J.L0`4ED(!!!!``!4``*`M`B`H
+M+28Q``&.8@&@`F`@+0!`^`D#H#`M$$``6Z^@``0`%!A``'(8(9>B`````A("
+MI&(!!I.B``&D8@$()I0``I9"`00"@A`J%$#_[@(@*"V60@``+$)0`U1``!V6
+M0@````"@+8YB`:`"8"`M`B`H+0!`^`D#H#`M$$``0Z^@``0`%!"``%(0(9>C
+M``"D0P..)B4`!8YB`:`"8"`M`$#X"0.@,"T00``XKZ``!``4$(``4A`AEZ,`
+M`*1#`Y`FE``!*H(`!11`_^<F,0`!ED(``"Q",`-00``'ED(``"0"_\JF0@!<
+M)`+__Z9"`%ZF0@!@ED(``"Q",`-00``'ED(``"0"``^F0@!$)`(`'*9"`$:F
+M0@!(ED(``"Q"0``40``$CF(!H`)@("T(`!'#)`4`R@)@("TD!0#/`$#X"0.@
+M,"T00``1KZ``!)>B``"F0@`8ED(`%A1```LD`@`!ED(``"Q"0``40``$ED(`
+M&``"$L,(`!'4,$(``0`"$\*F0@`6)`(``:^B``2/H@`$W[\`4-^W`$C?M@!`
+MW[4`.-^T`##?LP`HW[(`(-^Q`!C?L``0`^``"">]`&`GO?_@_[\`$/^Q``C_
+ML````("`+3P"```D0CDX`$#X"0"@B"T00``<```8+0(`("T\`@``)$(4?`!`
+M^`D"("@M$$``%0``&"T"`"`M/`(``"1"+J``0/@)`B`H+1!```X``!@M`@`@
+M+3P"```D0C)(`$#X"0(@*"T00``'```8+0(`("T\`@``)$(T[`!`^`D"("@M
+M`$`8+0!@$"W?OP`0W[$`"-^P```#X``()[T`(">]__#_OP``E*(``"Q"0``4
+M0``)W[\``)2C`"XD`@`!%&(`!3P"```D0B"D`$#X"0````#?OP```^``"">]
+M`!"4@P``E*(``%1B``64A```E(0``C"$P?"4H@`",$+!\`""(",#X``(`(`0
+M+92"`@@#X``(,$*__P``&"T``Q#``$00(=Q"```40``&```H+21C``$H8@`"
+M5$#_^0`#$,`D!0`!`^``"`"@$"TGO?_P_[\``#P"```D0DBH`$#X"0``````
+M0"`M``(4``1!`!$``!@M,(1__SP"```D1@G@``,0@`!#$"$``A"``$80(91"
+M```01``3)`4``21C``$L8@"#%$#_]P`#$(`(`!)@```H+3P"```D1@`X``,1
+M0`!&$"&40@``$$0`!B0%``$D8P`!+&(`2Q1`__D``Q%````H+0"@$"W?OP``
+M`^``"">]`!`GO?_P_[\`"/^P```PL/__$@``)B0%``$\`@``)$)(J`!`^`D`
+M`````$`P+0`"%``$00`')`(!_SP"__\T0G__`,(0)`("$"8(`!*/+$4``1#"
+M`!8D!0`!5,```P``("T(`!*0`*`0+3P"```D1PG@``00@`!$$"$``A"``$<8
+M(91B``!44``%)(0``91B``(01@`&)`4``22$``$L@@"#%$#_]``$$(```"@M
+M`*`0+=^_``C?L````^``"">]`!`GO?_@_[\`&/^R`!#_L0`(_[````"@B"V,
+M@@&<`$#X"0#`D"T`0(`M,$(`0A!```<R`@`@CB(`"!1```0R`@`@)`+_O0("
+M@"0R`@`@$$``!S("``B.(@`,%$``!#("``@D`O_?`@*`)#("``@00``',@(`
+M`8XB``040``$,@(``20"__<"`H`D,@(``1!```H"`!`M/`(``"1"2+0`0/@)
+M)D0`(!!```0"`!`M)`+__@("@"0"`!`MW[\`&-^R`!#?L0`(W[````/@``@G
+MO0`@)[W_8/^_`)C_L@"0_[$`B/^P`(``@(@M,*3__SP"```D0DPT`$#X"0``
+MD"T00``1`$"`+0(@("T`0"@M-`;_?SP"```D0DW0`$#X"0.@."T00``)`D`0
+M+0(@("T"`"@M/`(``"1"2E``0/@)`Z`P+0!`D"T"0!`MW[\`F-^R`)#?L0"(
+MW[``@`/@``@GO0"@)[W_\/^_``C_L```/`(``"1"2*@`0/@)`("`+0!`&"TD
+M`@`2$&(`"RAB`!,00``%)`(!_U!@``J6`P(*"``3"```*"T08@`%-`*#2E1B
+M``@``"@M"``3""0%``&6`P(*)`(#2A!B``(D!0`!```H+0"@$"W?OP`(W[``
+M``/@``@GO0`0,(3__P``*"T\`@``)$8)X``%$(``11`A``(0@`!&$"&40P``
+M$&0`!@`````DI0`!+*(`@U1`__<`!1"````0+0/@``@`````)[W_X/^_`!#_
+ML0`(/`(``"1"2*@`0/@)_[````!`B"T``A0`!$$`"0``("TR,'__/`(``"1"
+M3#0`0/@)`@`@+11``!,"`!`M```@+3P"```D10`X``010`!%&"&48@``5%$`
+M!B2$``&48@`8%$``!P!`@"TD!`!+)(0``2R"`$L40/_U``010```@"T"`!`M
+MW[\`$-^Q``C?L````^``"">]`"`GO?_P_[\```"@."T``!@M/`(``"1&)&``
+M`Q'``$8H(92B``!41``*)&,``5#@``PD`@`!`.`@+3P"```D0@```$#X"20&
+M`(`(`!-@)`(``2QB`#$40/_Q``,1P```$"W?OP```^``"">]`!`0@``.```H
+M+0``&"T\`@``)$8`.``#$4``1A`AE$(``!!$``8D!0`!)&,``2QB`$M40/_Y
+M``,10```*"T#X``(`*`0+2>]_[#_OP!`_[<`./^V`##_M0`H_[0`(/^S`!C_
+ML@`0_[$`"/^P````@+@M`*"0+0#@H"TPT?__``"8+0``J"V4H@``%$``%P``
+ML"T\`@``)$)(J`!`^`D``````$"`+0`"%``$0``/`@`@+3P"```D0DT@`$#X
+M"0``*"T40``*`@`@+3P"```D0DV,`$#X"0(`("U00``$ED0``@@`$YX"`"`M
+MED0``C""_P`40`!$```P+0``."T\`@``)$4`.``&$4``11@AE&(``!1$``,D
+MQ@`!`&"H+20'``$LP@!+$$``!0````!0X/_V``810`@`$[4R(@"`$.``1@``
+M$"TR(@"`%$```S(B`("6I``"GK,`"!!```,``#`MEJ0`!)ZS``P``#@M/`(`
+M`"1("9@`!A#``$80(0`"$(``2"@AE*(``!1$``<DQ@`!CN,!V(RB``048@`#
+M``````"@L"TD!P`!+,(``A!```4`````4.#_\``&$,`(`!/7,B(`@!#@`!`\
+M`@``,B(`@!1```8R(@"`GL(`"`)BF"2>P@`,`F*8)3(B`(!00``&/`(``)["
+M`!`"8I@DGL(`%`)BF"4\`@``)$)-(`!`^`D"@"@M`$`X+1#@``\``!`MWH(`
+M$-ZC`!``0Q`D_H(`$)9"``(P0O\`%$``!R0"``$28``&W[\`0``3$#P``A`_
+MKH(`&"0"``'?OP!`W[<`.-^V`##?M0`HW[0`(-^S`!C?L@`0W[$`"-^P```#
+MX``()[T`4`2!``(`@!@M)(,`/P`#&8,D`@`!`((0%``#&,``91@AW&,```!#
+M$"0``A`K``(0/`/@``@``A`_,.<`_Q#@`!,`@!@M$*``"P``("T`9!`AD$(`
+M`!!'``T`````$$``!0`````DA``!`(40*Q1`__@`9!`A$(4`!0!D$"&@1P``
+MC,(``"1"``&LP@```^``"``````GO?XP_[\!R/^^`<#_MP&X_[8!L/^U`:C_
+MM`&@_[,!F/^R`9#_L0&(_[`!@`"`B"T`H*@M`,"8+:^G`4@!`+@M`2#P+:^J
+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
+M$"W?OP'(W[X!P-^W`;C?M@&PW[4!J-^T`:#?LP&8W[(!D-^Q`8C?L`&``^``
+M"">]`="4IP`"C(82-!#```DPY\'PE,,``)2B```48@`&)(@",)3#``(P8L'P
+M4$<`$I#"``0DB`(PC(02,%"``"```!@ME*4````$$$,``A&``0(P(93"````
+MHA`C%$``$`````"4PP`",&+!\%1'``J4P@`"D,(`!#!"``%00``0`,`8+3!B
+M``(40``-```8+0@`%C@`P!@M,$+!\`#B$"-80``$``0@0R3(`$`DA/__``0@
+M0U2`_^4`!!!#```8+0/@``@`8!`M)[W_\/^_``C_L```/`(``"1"````0/@)
+M`,"`+1!```D``!@M@$(`&@`"$$`"`A`C``(6```"%@,$00`"`$`8+0``&"T`
+M8!`MW[\`"-^P```#X``()[T`$">]_]#_OP`@_[,`&/^R`!#_L0`(_[````"`
+M@"T`H(@ME((""A1``"0D$P#_/`(``"122*@"0/@)`````#!"`/`D`P!@4$,`
+M!Y8B``("0/@)`@`@+20#`9E40P`8`@`@+98B``(P0@"@)`,`H!!#`"4D$P#A
+MEB(``C!"`-`D`P#`$$,`("03`.*6(@`",$(`T"0#`-`00P`;)!,`Y)8B``(P
+M0@%0)`,!4!!#`!8D$P#C"``6D203`.`"`"`M/`(``"1"````0/@)`B`H+1!`
+M``TD`P#`C%,`()8B``(P0@#`%$,`"0)@$"TR8P`/)`(``11B``4"8!`M)`+_
+M\`)BF"0V<P`"`F`0+=^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`GO?_P
+M_[\``#P"```D0@```$#X"0`````00``$```8+8Q"`!P``A"#,$,``0!@$"W?
+MOP```^``"">]`!`GO?_`_[\`./^V`##_M0`H_[0`(/^S`!C_L@`0_[$`"/^P
+M````P)`M`."P+0"`H"TDM?__$J``&P"&F"$"DQ`K$$``%0)@B"T",H`C`@`@
+M+0+`^`D"("@M6$``$":U__\"("`M`D`H+9(#``"0@@``H@(``"80``&@@P``
+M)*7__Q2@__DDA``!`C*((P*1$"M40/_N`C*`(R:U__\6H/_G`G*8(=^_`#C?
+MM@`PW[4`*-^T`"#?LP`8W[(`$-^Q``C?L````^``"">]`$`GO?_0_[\`(/^Q
+M`!C_L``0`("`+0"`B"V,@@&@)`4`P0!`^`DGI@`"$$``%P``&"V7H@`"+$)`
+M`!!```(D!0#*)`4`SXXB`:`"("`M`$#X"0.@,"T00``,```8+9>B``(L0D``
+M5$``!8>B``"7H@````(2PP@`%OLP0@`!``(7PJX"$CR.`Q(\`&`0+=^_`"#?
+ML0`8W[``$`/@``@GO0`P)[W_\/^_``C_L```/`(``"1"2*@`0/@)`("`+0!`
+M&"TD`@!($&(`)3P"```H8@!)$$``"S0"@8TH8@!"$$``'"0"`$,H8@!`$$``
+M'#P"``!08``0E@,""@@`%S<``!`M`$,0*A1``!(T`H&/-`*!B`!B$"H00``1
+M/`(``"1B_[8L0@`#4$``$@``$"T(`!<R/`(``"AB`8@40``-```0+2AB`8X4
+M0``%/`(``"0"`8]48@`'```0+3P"```D0EML`$#X"0(`("T(`!<XW[\`"-^_
+M``C?L````^``"">]`!`GO?_0_[\`*/^R`"#_L0`8_[``$`"`D"TPL/__`("(
+M+8R"`:`D!0#!`$#X"0.@,"T00``@W[\`*```&"T\`@``)$4\X``#$$``0Q`A
+M``(00`!%("&4@@``5%``$B1C``&7H@``+$)0`U!```,``Q!`"``7792"``(`
+M0Q`A``(00`!%$"&40@`$IB(""#P"```D0DQ\`$#X"0)`("T(`!=GIB(""BQB
+M``X40/_G``,00-^_`"C?L@`@W[$`&-^P`!`#X``()[T`,">]_]#_OP`H_[(`
+M(/^Q`!C_L``0`("0+3"P__\`@(@MC((!H"0%`,$`0/@)`Z`P+1!``"#?OP`H
+M```8+3P"```D13TX``,00`!#$"$``A!``$4@(92"``!44``2)&,``9>B```L
+M0E`#4$```P`#$$`(`!>/E((``@!#$"$``A!``$40(91"``2F(@((/`(``"1"
+M3'P`0/@)`D`@+0@`%YFF(@(*+&(`!Q1`_^<``Q!`W[\`*-^R`"#?L0`8W[``
+M$`/@``@GO0`P)[W_X/^_`!#_L0`(_[```#P"```D0EP,`$#X"0"`@"T00``2
+MW[\`$(X"`>0P0@`!$$``#]^Q``B6!0((4*``!98%`@H"`"`M/`(```@`%[<D
+M0ESL`@`@+3P"```D0EVT`$#X"0````#?OP`0W[$`"-^P```#X``()[T`(">]
+M_R#_OP#0_[<`R/^V`,#_M0"X_[0`L/^S`*C_L@"@_[$`F/^P`)``H*`M`,"H
+M+0#@L"T!`+@M,)+__SP"```D0@```$#X"20$%`@`0(@M$$`!?200``(`0)@M
+M`$`@+3P%```DI0)0/`(``"1"````0/@))`82<*XT``RN-0`0KC8`%*8R`<BF
+M(`'*)`(`/*8B`?RN(`(`)`(``ZXB$S2N(!/T)`('`*XB$_@D`O__KB(3_*XB
+M%`"N(A0$`B`@+3P"```D0@```$#X"0``*"T00`%=)!```R0"``&N(@',`B`@
+M+3P0```F$````@#X"20%0"`P0@#_IB(!T`(@("T"`/@)-`68&*8B`=*F(`'6
+M`B`@+30%F-`\`@``)$(```!`^`DD!AP6``"0+3P"```D4````F`@+30%F(`"
+M`/@)/`8``292``$N0@`$%$#_^@)@("T\$```)A````(`^`DT!9P```(7`@!`
+M("T\`@``)$(```!`^`DD!0`$)$(``:9B`=0"8"`M`@#X"20%0!``0*`M-$8`
+M`0)@("T\`@``)$(```!`^`DD!4`0`F`@+20%`#T\`@``)$(```!`^`DGI@"`
+M$$`!&B00``B7HP"`)`):I11B`18D$``$`F`@+20%`#\\`@``)$(```!`^`DG
+MI@"`$$`!#B00``B7H@"`IB(2<@)@("TD!0#!/`(``"1"````0/@))Z8`@!!`
+M`00D$``(EZ(`@``"$P*F(A)P,$/__R0"``$48@#])!``!0``J"T``)`M/`(`
+M`"10```F10#``!(00`.B,"$"`/@)`F`@+1!``/$`$A!``%T0(91"```"HJ@F
+M)E(``2Y"`$`40/_T)D4`P#0"__\6H@#H)!``!P)@("TD!0"_/`(``"1"````
+M0/@))Z8`@!!``.`D$``(DZ(`@:9B`@B7H@`$IB(2=)>B``:F(A)VDZ(`":(B
+M$GB7H@`(``(2`J(B$GF3H@`+HB(2>Y>B``H``A("HB(2>I>B``P``A("HB(2
+M?I.B``VB(A)_EZ(`#@`"$@*B(A*`DZ(`#Z(B$H&3H@`1,$(``:(B$GR7H@`0
+M``(00C!"``>B(A)]/`(``"1"``"N8@'```"0+20&``D`$AC``'(8(P`#&(``
+M<A@A`B,8(21E$H(`!B!``)T@(92"`````A*"H&(2@I2"`````A$",$(`/Z"B
+M``N4@@````(0@#!"`#R4@P`"``,;@@!#$"6@H@`!E((``@`"$@(P0@`_H*(`
+M#)2"``(``A"",$(`/Z"B``*4@@`"``(1`#!"`#"4@P`$``,;`@!#$"6@H@`-
+ME((`!``"$8(P0@`_H*(``Y""``4P0@`_H*(`#I2"``8``A*"H*(`!)2"``8`
+M`A$",$(`/Z"B``^4@@`&``(0@#!"`#R4@P`(``,;@@!#$"6@H@`%E((`"``"
+M$@(P0@`_H*(`$)2"``@``A"",$(`/Z"B``:4@@`(``(1`#!"`#"4@P`*``,;
+M`@!#$"6@H@`1E((`"@`"$8(P0@`_H*(`!Y""``LP0@`_H*(`$I2"``P``A*"
+MH*(`")2"``P``A$",$(`/Z"B`!.4@@`,``(0@#!"`#R4@P`.``,;@@!#$"6@
+MH@`)E((`#@`"$@(P0@`_H*(`%)2"``X``A"",$(`/Z"B``J4@@`.``(1`#!"
+M`#"4@P`0``,;`@!#$"6@H@`5E((`$``"$8(P0@`_H*(`%I""`!$P0@`_H*(`
+M%Y2"`!(``A*"H*(`&)2"`!(``A$",$(`/Z"B`!F4@@`2``(0@#!"`#R4@P`4
+M``,;@@!#$"6@H@`:E((`%``"$@(P0@`_H*(`&Y2"`!0``A"",$(`/Z"B`!PF
+M4@`!+D(`!11`_W,DQ@`+/`(``"1"9>``0/@)`F`@+0``J"T``)`M)!8`'SP"
+M```D4````M(H(P)@("T"`/@))Z8`@!!``!J7H@"``J*H(0`2&$``<1@A``(2
+M`J!B$Q.3H@"!H&(3%"92``$N0@`#5$#_\0+2*",2H``$/`(``C1"__T6H@`#
+M`F`@+0@`&4HD$``))`5`$#P"```D0@```$#X"0*`,"T(`!E8`F`0+0@`&5`D
+M$``()!``"`)@("TD!4`0/`(``"1"````0/@)`H`P+1(@``0\`@``)$(```!`
+M^`D"("`M5N```:[P`````!`MW[\`T-^W`,C?M@#`W[4`N-^T`+#?LP"HW[(`
+MH-^Q`)C?L`"0`^``"">]`.`GO?_P_[\``#P"```D0@```$#X"0````#?OP``
+M`^``"">]`!`PI0$`$*``!@``$"TD`A0`I,(``"0"%3:DX@``)`(``0/@``@`
+M`````^``""0"``$DA0'@C*(`!#1"``&LH@`$)`(4`*2B``PD`A4VI*(`#HR#
+M`>`\`D```&(8)3P"__\T0G__`&(8)*R#`>`D`@`#I*(`""0"`$"DH@`*C((!
+MX"0#^_\`0Q`D)`/]_P!#&"2L@P'@D((2?%!```<D`@`/I(`22"0"``&L@A),
+M-&(!`*R"`>`D`@`/K*(`%"0"``$#X``(K((2:">]_^#_OP`8_[(`$/^Q``C_
+ML````("0+0"@B"TT!8`L/!```"80```"`/@)CB8`!`)`("TT!8`P`@#X"8XF
+M``P"0"`M-`6`-`(`^`F.)@`0`D`@+30%@#@"`/@)CB8`"`)`("TT!8`D`@#X
+M"8XF``#?OP`8W[(`$-^Q``C?L````^``"">]`"`GO?_0_[\`(*^E``2,@P'<
+M)`(``1!B``P\`@``C$(```"B$",``A#`KZ(`##P"``",0@```*(0(P`"$,"O
+MH@`0"``9UZ^E``@D`O__KZ(`#*^B`!`D`@`!KZ(`"#P"`8`T0O__`,(0)*^B
+M```\`@``)$(```!`^`D#H"@MW[\`(`/@``@GO0`P)[W_X/^_`!#_L0`(_[``
+M``"`B"TT!8`L/!```"80```"`/@)```P+0(@("T\`@``)$(```!`^`DT!8`$
+M/`,`$`!#$"4\`_]?-&/__P!#$"0"("`M-`6`!`(`^`D`0#`M`B`@+30%@"0"
+M`/@)-`;__]^_`!#?L0`(W[````/@``@GO0`@)[W_T/^_`"#_LP`8_[(`$/^Q
+M``C_L````("0+0"@B"V4H@`2$$``'P"`F"T\`@``)$(```!`^`DT!8`$/`/_
+M?S1C__\`0Q`D/`,`(`!#$"4"0"`M-`6`!#P0```F$````@#X"0!`,"V6)@`0
+M`D`@+0(`^`DT!8`HEB8`$@)`("T"`/@)-`6`2(XF`!0`!C#``D`@+0(`^`DT
+M!8`T"``:.@)`("T\`@``)$(```!`^`DT!8`$/`/_7S1C__\`0Q`D`D`@+0!`
+M,"T\`@``)$(```!`^`DT!8`$`D`@+30%@"P\`@``)$(```!`^`F.)@```D`@
+M+3P"```D0@```$#X"30%@"0\`_^``$,0))8C``H`0S`EEB(`&!!```8"0"`M
+M)$(`!``"%``\`P!_`$,0)`#","4\`@``)$(```!`^`DT!8`DED(!T"Q"``04
+M0``5W[\`()8E`!HPH@`'4$``$M^S`!B.8A/X)`/X_P!#&"0LH@`($$``!#1F
+M!P``!1(`,$('``!B,"6N9A/X`D`@+3P"```D0@```$#X"30%@!C?OP`@W[,`
+M&-^R`!#?L0`(W[````/@``@GO0`P)[W_\/^_```\`@``)$(```!`^`DD!4`(
+M``(0*]^_```#X``()[T`$">]_^#_OP`8_[(`$/^Q``C_L````("0+0"@@"T\
+M`@``)$(```!`^`DD!0`<`$`@+20"__]4@@`$CD,3'*X````(`!JK```0+0"#
+M&"0\`@$%-$+8N@!B&"0\`@!P-$(`(`""$"000``$K@,``#P"0```8A`EK@(`
+M`#""``400``%,((%P(X"```T0@`!K@(``#""!<`00``$C@(``#1"`$"N`@``
+MC@(``#P#0```0Q`D5$```:Y$$E`D`@`!W[\`&-^R`!#?L0`(W[````/@``@G
+MO0`@`^``"(R"$QPGO?_0_[\`*/^T`"#_LP`8_[(`$/^Q``C_L````("0+0"@
+M@"V,E!,<!H$`!@"`B"TD!0`D/`(``"1"````0/@)```P+3P"`04T0MBZ`@(P
+M)#("``%40``!-,8`!3("`$`00``.`D`@+8XB$R!40``!-,8`0(XB$R140``!
+M-,8!`(XB$RA40``!-,8`@(XB$RQ40``!-,8$``)`("T\`@``)%,```)@^`DD
+M!0`@!@$`!:XP$QP"0"`M)`4`)`)@^`DD!@`!`H`0+=^_`"C?M``@W[,`&-^R
+M`!#?L0`(W[````/@``@GO0`P`^``""0"`$`GO?_P,*7__RRB`$`00``+_[\`
+M```%*4`T`I`<`*(H(3P"```D0@```$#X"0`````P0H``%$```B0#``$``!@M
+M`&`0+=^_```#X``()[T`$">]_^#_OP`8_[(`$/^Q``C_L````("0+3"E__\L
+MH@!`$$``+0``&"T`!8E`-`60``(E*"$\$```)A````(`^`D``#`M-`60!`(E
+M*"$"0"`M`@#X"0``,"TT!9`(`B4H(0)`("T"`/@)```P+30%D`P")2@A`D`@
+M+0(`^`D``#`M-`60$`(E*"$"0"`M`@#X"0``,"TT!9`4`B4H(0)`("T"`/@)
+M```P+30%D!@")2@A`D`@+0(`^`D``#`M-`*0'`(BB"$"0"`M`B`H+0(`^`D`
+M`#`M)`,``0!@$"W?OP`8W[(`$-^Q``C?L````^``"">]`"`GO?_0_[\`(/^S
+M`!C_L@`0_[$`"/^P````@)@M`,`8+3"E__\LH@!`$$``)0``("U0P``4``"0
+M+9#2``4`$I(`D,(`!`)"D"60Q@`#``8V`)!B``(``A0``,(P)9!B``$``A(`
+M`,(P)9!B````PC`E``8P0@`2%\``PC`E"``;8@`2D$(``#`M``6)0#0%D!@"
+M)2@A/!```"80```"`/@)`F`@+30"D!P"(H@A-D:```)@("T"`/@)`B`H+20$
+M``$`@!`MW[\`(-^S`!C?L@`0W[$`"-^P```#X``()[T`,">]_Z#_OP!8_[X`
+M4/^W`$C_M@!`_[4`./^T`##_LP`H_[(`(/^Q`!C_L``0`("@+0#@\"TPM?__
+M/`2JJA4```(TA*JJ```@+2ZB`$`00`!M```8+9#"```40`!K`&`0+93"``(L
+M0@`%%$``9P!@$"V4P@`"+$(`!A1```BOH```E,(``BQ"``XD`P`!%$```Z^C
+M```D`@`#KZ(``)#'``20P@`%``(2``#B."60P@`&``(4``#B."60P@`'``(6
+M``#B."4`Y#@FD,(`"0`"$@"0PP`(`$.X)0+DN"8R]___D-,`"I#"``L``A(`
+M`F*8)9#"``P``A0``F*8)9#"``T``A8``F*8)0)DF":0P@`/``(2`)##``X`
+M0[`E`L2P)C+6__^0T@`0D,(`$0`"$@`"0I`ED,(`$@`"%``"0I`ED,(`$P`"
+M%@`"0I`EE,(``BQ"``X00``"`D20)C)2`/\`%8E`-`60``(E*"$"@"`M/!``
+M`"80```"`/@)`.`P+30%D`0")2@A`H`@+0(`^`D"X#`M-`60"`(E*"$"@"`M
+M`@#X"0)@,"TT!9`,`B4H(0*`("T"`/@)`L`P+30%D!`")2@A`H`@+0(`^`D"
+M0#`M-`*0%`(BB"$"@"`M`B`H+0(`^`F/I@```H`@+0*@*"T\`@``)$(```!`
+M^`D#P#`M`$`8+0!@$"W?OP!8W[X`4-^W`$C?M@!`W[4`.-^T`##?LP`HW[(`
+M(-^Q`!C?L``0`^``"">]`&`GO?_P_[\```"`$"T`H"`M)$(3$P!`*"T\`@``
+M)$(```!`^`DD!@`&W[\```/@``@GO0`0)[W_\/^_```DA!,3/`(``"1"````
+M0/@))`8`!B0"``'?OP```^``"">]`!`GO?_P_[\```"@("T\!0``)*44P#P"
+M```D0@```$#X"20&``;?OP```^``"">]`!`#X``(```0+2>]_^#_OP`0_[$`
+M"/^P````@(`M`,"(+0`%*(`\`@``)$(```!`^`DDI6```@`@+20%;``D!@`#
+M/`(``"1"````0/@))`<``A!```@``!@M`@`@+3P"```D0@```$#X"20%:`"F
+M(@``)`,``0!@$"W?OP`0W[$`"-^P```#X``()[T`(#"E__^4@@(($$4`!B0#
+M``R4@A)R,$(`@!1```(D`P`+)`,``U3```&LPP```^``"```$"T#X``()`(`
+M`2>]_^#_OP`8_[(`$/^Q``C_L````("0+920$D@R$0`<`!&(@S(0``(`$(!#
+M/`(``"1"````0/@)`B`H+0!0$"8L0@`!`D`@+0!`,"T\`@``)$(```!`^`D"
+M("@MW[\`&-^R`!#?L0`(W[````/@``@GO0`@)[W_X/^_`!#_L0`(_[````"`
+MB"T`H(`M/`(``"1"````0/@))`5`%``0@$`D`P`#`@,8!``#&"<`0Q`D)`,`
+M`@(#&`0`0Q`E`B`@+0!`,"T\`@``)$(```!`^`DD!4`4)`(``=^_`!#?L0`(
+MW[````/@``@GO0`@)[W_X/^_`!#_L0`(_[````"`B"T`H(`M/`(``"1"````
+M0/@))`5`%``0@$`D`P`#`@,8!``#&"<`0Q`D`B`@+0!`,"T\`@``)$(```!`
+M^`DD!4`4)`(``=^_`!#?L0`(W[````/@``@GO0`@)[W_X/^_`!C_L@`0_[$`
+M"/^P````@)`M`*"(+0#`@"T\`@``)$(```!`^`DD!4`8)`,``0(C&`0``Q@G
+M`$,0)#(0``$",(`$`%`0)0)`("T`0#`M/`(``"1"````0/@))`5`&"0"``'?
+MOP`8W[(`$-^Q``C?L````^``"">]`"`GO?_P_[\`"/^P````H(`M+*(`!A!`
+M``@D`___/`(``"1"````0/@))`5`'#!"`"\"`A`&,$,``0!@$"W?OP`(W[``
+M``/@``@GO0`0)[W_X/^_`!C_L@`0_[$`"/^P````@)`M`*"`+0#`B"T\`@``
+M)$(```!`^`DD!4`4`$`P+0`0(P``$(!`)`(``P("$`0`@A`E/`,``31C@```
+M0Q`G`,(P)`#$,"42(``#-,:``#P"``$`PC`E`D`@+3P"```D0@```$#X"20%
+M0!2.11,</`(!``"B*"4\`@``)$(```!`^`D"0"`MW[\`&-^R`!#?L0`(W[``
+M``/@``@GO0`@)[W_X/^_`!#_L0`(_[````"`B"T`H(`M/`(``"1"````0/@)
+M)`5`$`!`,"T2```))`+_GR0"``16`@`%-,8`("0"_]\`PC`D"``=*#3&`$`D
+M`O^_`,(P)`(@("T\`@``)$(```!`^`DD!4`0W[\`$-^Q``C?L````^``"">]
+M`"`GO?_P_[\``#P"```D0@```$#X"30%@`0\`P"``$,0)"Q"``$D`P`"`&(0
+M(]^_```#X``()[T`$">]_^#_OP`0_[$`"/^P````@(@M`*"`+3P"```D0@``
+M`$#X"30%@`0`0!@M/`(`@`!B$"100``")`(``20"``(2`@`'/`8`@`!F,"4"
+M("`M/`(``"1"````0/@)-`6`!-^_`!#?L0`(W[````/@``@GO0`@`^``"```
+M$"T#X``(+*(``2>]_^#_OP`8_[(`$/^Q``C_L````("(+3#0__\DA!,X/`(`
+M`"1"````0/@))`8`!I(F$SB2(A,Y``(2``#","62(A,Z``(4``#","62(A,[
+M``(6``#","4"("`M/`(``"12```"0/@)-`6`")(F$ST`!C(`DB(3/`#","4R
+M`C__``(4``#","4"("`M`D#X"30%@`P6```-`B`@+3P"```D0@```$#X"30%
+M@`0\`P`0`$,0)0(@("TT!8`$`D#X"0!`,"T(`!VBW[\`&#P"```D0@```$#X
+M"30%@`0\`__O-&/__P!#$"0"("`M`$`P+3P"```D0@```$#X"30%@`3?OP`8
+MW[(`$-^Q``C?L````^``"">]`"`GO?_0_[\`(/^S`!C_L@`0_[$`"/^P````
+M@(`M/!$``"8Q```"(/@)-`6`;`!`D"T"`"`M`B#X"30%@'``0)@M`@`@+0(@
+M^`DT!8!L`%*0*Q)```(`0!@M)G,``0`3$#P``Q@\``,8/@!#$"7?OP`@W[,`
+M&-^R`!#?L0`(W[````/@``@GO0`P)[W_\/^_```\`@``)$(```!`^`DT!8!L
+MW[\```/@``@GO0`0)[W_\/^_``C_L````("`+3P"```D0@```$#X"30%@"0\
+M`P$``$,0)0(`("T`0#`M/`(``"1"````0/@)-`6`)-^_``C?L````^``"">]
+M`!`GO?_0_[\`(/^S`!C_L@`0_[$`"/^P````@)@M/`(``"1"````0/@)-`68
+M9``"E,(R4@'_,D(!`!!```,"8"`M.E(!_P`2D"<\$0``)C$```(@^`DT!8!P
+M`$"`+0)@("T"(/@)-`6`;`("@"8"$H`F`@`0+=^_`"#?LP`8W[(`$-^Q``C?
+ML````^``"">]`#`GO?_P_[\`"/^P``"4D`'0/`(``"1"````0/@))`5`(#!"
+M`/\"`A`F+%```0(`$"W?OP`(W[````/@``@GO0`0)[W_X/^_`!C_L@`0_[$`
+M"/^P````@)`M`*"`+3P1```F,0```B#X"30%@)B.`P```$,0(:X"```"0"`M
+M`B#X"30%@)2.`P`$`$,0(:X"``0"0"`M`B#X"30%@)R.`P`,`$,0(:X"``P"
+M0"`M`B#X"30%@)".`P`(`$,0(:X"``@"0"`M`B#X"30%@*".`P`0`$,0(:X"
+M`!#?OP`8W[(`$-^Q``C?L````^``"">]`"`GO?_@_[\`&/^R`!#_L0`(_[``
+M``"`@"T`H(@M+*(`"11```@`@)`M/`(``"1"````0/@)-`7__P!1$"L00``%
+M`@`@+20"__^N0A/\"``>9P``$"T\`@``)$(```!`^`D"("@M`@`@+0!`,"T\
+M`@``)$(```!`^`DT!8`0KA$3_"0"``'?OP`8W[(`$-^Q``C?L````^``"">]
+M`"`GO?_P_[\`"/^P````@(`M/`(``"1"````0/@)-`6`$#!"__\`0"@M/`(`
+M`"1"````0/@)`@`@+=^_``C?L````^``"">]`!`GO?_0_[\`(/^S`!C_L@`0
+M_[$`"/^P````@(@M`*"0+3P"```D0@```$#X"20%'_\`4A`K$$``!"0"__^N
+M(A0`"``>J```$"T"("`M/`(``"1"````0/@)-`6`%`!`@"TD`N```@*`)`(@
+M("T\`@``)$(```!`^`D"0"@M,$(?_P("@"4"("`M-`6`%#P"```D0@```$#X
+M"0(`,"VN,A0`)`(``=^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`GO?_P
+M_[\`"/^P````@(`M/`(``"1"````0/@)-`6`%#!"'_\`0"@M/`(``"1"````
+M0/@)`@`@+=^_``C?L````^``"">]`!"`@A/T.$(``0/@``@P0@`!)[W_X/^_
+M`!C_L@`0_[$`"/^P````@(@M$*``$0"`D"T\`@``)$(```!`^`DT!8`$/!#^
+M_S80__\`4!`D`B`@+0!`,"T\`@``)$(```!`^`DT!8`$CB(3]`@`'NL`4!`D
+M/`(``"1"````0/@)-`6`!#P0`0``4!`E`B`@+0!`,"T\`@``)$(```!`^`DT
+M!8`$CB(3]`!0$"6N0A/T)`(``=^_`!C?L@`0W[$`"-^P```#X``()[T`(">]
+M_]#_OP`@_[,`&/^R`!#_L0`(_[````"`B"T`H)`M/`(``"1"````0/@))`4?
+M_P!2$"L00``$)`+__ZXB%`0(`!\?```0+0(@("T\`@``)$(```!`^`DT!8`4
+M`$"`+3P"X``T0O__`@*`)`(@("T\`@``)$(```!`^`D"0"@M``(4`#P#'_\`
+M0Q`D`@*`)0(@("TT!8`4/`(``"1"````0/@)`@`P+:XR%`0D`@`!W[\`(-^S
+M`!C?L@`0W[$`"-^P```#X``()[T`,">]__#_OP`(_[````"`@"T\`@``)$(`
+M``!`^`DT!8`4/`,?_P!#$"0``A0"`$`H+3P"```D0@```$#X"0(`("W?OP`(
+MW[````/@``@GO0`0`^``""0"``$#X``(``````/@``@``!`M`^``"``````#
+MX``(`````">]__`D`@`!%*(`!?^_```4P``')`(`#0@`'U```!`M/`(``"1"
+M````0/@)`````-^_```#X``()[T`$">]__`D`@`+$*(`!O^_```D`@`>$*(`
+M#P``&"T(`!]D/`(``##F``:LA@'X/`(``"1"````0/@)-`6`:`@`'V@D`P`!
+M)$(```!`^`D``````$`8+0!@$"W?OP```^``"">]`!`GO?_P_[\``#P"```D
+M0@```$#X"0````#?OP```^``"">]`!`GO?_0_[\`(/^S`!C_L@`0_[$`"/^P
+M````@(@M`*"`+3P"```D4P```F#X"30%@`0\`P`$`$,0)0(@("T`0#`M/`(`
+M`"12```"0/@)-`6`!!(```S?OP`@`B`@+0)@^`DD!4`$/`/__#1C__\`0Q`D
+M`B`@+20%0`0"0/@)`$`P+=^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`G
+MO?_`_[\`./^V`##_M0`H_[0`(/^S`!C_L@`0_[$`"/^P```0H``U`("`+3P"
+M```D0@```$#X"20%0`0\`__\-&/__P!#$"0"`"`M`$`P+3P"```D0@```$#X
+M"20%0`0\`@``)$(```!`^`DD!`?0)!$`"CP"```D4P``/!8``3P"```D50``
+M/!+__#92__\\`@``)%0```(`("T"8/@))`5`$`!6$"000``0``````*@^`DD
+M!`#(`@`@+0)@^`DD!4`$`%(0)`(`("TD!4`$`H#X"0!`,"TF,?__%B#_[P(`
+M("T(`!_J```0+18@``0"`"`M"``?Z@``$"T"`"`M/`(``"1"````0/@)-`6`
+M!#P#__LT8___`$,0)`(`("T`0#`M/`(``"1"````0/@)-`6`!"0"``'?OP`X
+MW[8`,-^U`"C?M``@W[,`&-^R`!#?L0`(W[````/@``@GO0!`)[W_T/^_`"#_
+MLP`8_[(`$/^Q``C_L````("(+0"@@"T\`@``)%,```)@^`DT!8`$/`,`!`!#
+M$"4"("`M`$`P+3P"```D4@```D#X"30%@`02```,W[\`(`(@("T"8/@))`5`
+M!#P#__PT8___`$,0)`(@("TD!4`$`D#X"0!`,"W?OP`@W[,`&-^R`!#?L0`(
+MW[````/@``@GO0`P)[W_X/^_`!C_L@`0_[$`"/^P````H(`M`,`H+201``$2
+M$0`-`("0+1(```4D`@`"$@(`#```$"T(`"`]W[\`&#P"```D0GYP`$#X"0``
+M```(`"`Z`$"(+3P"```(`"`V)$)_T#P"```D0GW4`$#X"0`````(`"`[KE`3
+M-*Y0$S0"(!`MW[\`&-^R`!#?L0`(W[````/@``@GO0`@)[W_\/^_```\`@``
+M)$(```!`^`DD!4`$/`,``P!#$"0``A0"W[\```/@``@GO0`0)[W_\/^_``@D
+M`@`!$*(`!O^P```D`@`"4*(`!CP"```(`"!=```0+3P"```(`"!?)%````@`
+M(%\D4```"``@9=^_``@\`@``)$(```!`^`D"`"@M`@`0+=^_``C?L````^``
+M"">]`!`GO?_P_[\``#P"```D0@```$#X"20%``S?OP```^``"">]`!`GO?_P
+M_[\```"@,"T\`@``)$(```!`^`DD!0`,W[\```/@``@GO0`0)[W_\/^_```D
+M!0`(/`(``"1"````0/@))`8`!-^_```#X``()[T`$">]_]#_OP`@_[,`&/^R
+M`!#_L0`(_[````"`B"TD!0`(/`(``"1"````0/@))`8`(```@"T\`@``)%,`
+M`#P"```D4@```B`@+0)@^`DD!0`(,$(`!!!```@D`P`!`D#X"20$``HF$``!
+M*@(#Z%1`__8"("`M```8+0!@$"W?OP`@W[,`&-^R`!#?L0`(W[````/@``@G
+MO0`P)[W_\/^_``C_L````("`+3P"```D0@```$#X"30%@&@D`_^_`$,0)`(`
+M("T`0#`M/`(``"1"````0/@)-`6`:-^_``C?L````^``"">]`!`GO?_P_[\`
+M"/^P````@(`M/`(``"1"````0/@)-`6`:#1"`$`"`"`M`$`P+3P"```D0@``
+M`$#X"30%@&C?OP`(W[````/@``@GO0`0)[W_X/^_`!C_L@`0_[$`"/^P````
+M@(@M`*`0+0#`D"TT!8!0/!```"80```"`/@)`$`P+0(@("TT!8!4`@#X"0)`
+M,"W?OP`8W[(`$-^Q``C?L````^``"">]`"`GO?_@_[\`$/^Q``C_L````("(
+M+0"@@"TLH@!`$$``'```&"TLH@`@%$``"SP"```D0@```$#X"30%@%0D!@`!
+M`@8P!``&,"<`1C`D`B`@+0@`(0@T!8!4)$(```!`^`DT!8!0)`8``0(&,`0`
+M!C`G`$8P)`(@("TT!8!0/`(``"1"````0/@)`````"0#``$`8!`MW[\`$-^Q
+M``C?L````^``"">]`"`GO?_@_[\`$/^Q``C_L````("(+0"@@"TLH@!`$$``
+M&@``&"TLH@`@%$``"CP"```D0@```$#X"30%@%0D!@`!`@8P!`!&,"4"("`M
+M"``A,#0%@%0D0@```$#X"30%@%`D!@`!`@8P!`!&,"4"("`M-`6`4#P"```D
+M0@```$#X"0`````D`P`!`&`0+=^_`!#?L0`(W[````/@``@GO0`@)[W_\/^_
+M```\`@``)$(```!`^`DT!8!,W[\```/@``@GO0`0)[W_\/^_```PH@(`$$``
+M!`"@,"TD`OW_`*(P)#3&`"`\`@``)$(```!`^`DT!8!,W[\```/@``@GO0`0
+MJ*``"+B@``LPP@__J*(`#+BB``^(H@`,F*(`#Q1&``\``!@M,.(`(%!```<`
+M`!`MB*(`#)BB``\T0B``J*(`#+BB``\``!`MJ*(`%+BB`!>HH@`0N*(`$R0#
+M``$#X``(`&`0+2>]_]#_OP`@_[,`&/^R`!#_L0`(_[````"`F"T`P(`M`2"(
+M+0"@D"V(H@`4F*(`%S!"``$00`!E)`,`#XCB`!28X@`7,$(``11```8\`@``
+M)$(```!`^`DD!0`,$%``6R0#``^*0@`0FD(`$S!"#_^F(@``BE``%)I0`!<\
+M`@__-$*```("@"0`$(/"`F`@+3P"```D0@```$#X"30%@&P``AJ",&/__S!B
+M'_\`4!`K4$``!`(#@"4D8N``,$+__P("@"4R`G__IB(``J(@``2*0@`4FD(`
+M%S!"``(40``=`````(I"`!2:0@`7,$(`!!1```\D`@`!BD(`%)I"`!<P0@`0
+M$$``!`````"2(@`$"``AN#1"``B*0@`4FD(`%S!"``@00``$DB(`!#1"``0(
+M`"'!HB(`!#1"``*B(@`$BD(`%)I"`!<P0@#@``(10J(B``6*0@`0FD(`$P`"
+M%,*B(@`&BD(`%)I"`!<P0@$`4$``!20"__^*0@`4FD(`%S!"?@```A)"HB(`
+M!XI"`!":0@`3``(3PC!"``^B(@`(BD(`$)I"`!,``A.#,$(``:(B``F*0@`0
+MFD(`$P`"$P,P0@`!HB(`"@``&"T`8!`MW[\`(-^S`!C?L@`0W[$`"-^P```#
+MX``()[T`,">]_Z#_OP!8_[X`4/^W`$C_M@!`_[4`./^T`##_LP`H_[(`(/^Q
+M`!C_L``0`("0+0"@L"T`P*@MKZ<```$`\"T`@)@ME,(``C!"`0`00`'G)`,`
+M##P"```D0@```$#X"0#`*"T`0+@M$$`!X"0#``PD`@`&$L(`"B["``<00``&
+M)`(`""["``(00`'8`D`@+0@`(A$\`@``%L(!U"0#``P"0"`M/`(``"1"````
+M0/@))`5`$#!4`&`"0"`M/`(``"1"````0/@)`J`H+1!``<<D`P`#DF83$Y)B
+M$Q0``A(``,(P)9)B$Q4``A0``,(P)9)B$Q8``A8``,(P)0)`("T\$```)A``
+M``(`^`DT!8``DF83&``&,@"28A,7`,(P)0)`("T"`/@)-`6`!`)`("T\`@`!
+M)$*/R`!`^`D"P"@M)`(``1+"``P"0"`M$L``!R0"``82P@`2)`(`"%+"`!$D
+M!0`H"``B6SP1```D!0`H"``B1R0&``$D!0`H```P+3P0```F$````@#X"0``
+M```"0"`M)`5`$`@`(E<D!A`D)`4`*#P0```F$````@#X"0``,"T"0"`M)`5`
+M$"0&$$`"`/@)``````)`("T\$0``)C$```(@^`DD!4`0`%00)0)`("TD!4`0
+M/!```"80```"`/@)`$`P+9)F$SB28A,Y``(2``#","628A,Z``(4``#","62
+M8A,[``(6``#","4"0"`M`@#X"30%@`B29A,]``8R`))B$SP`PC`E`D`@+0(`
+M^`DT!8`,`D`@+0``*"T"`/@)```P+0)`("TD!0`$`@#X"0``,"T"0"`M)`4`
+M#`(`^`D``#`M`D`@+0(@^`DD!0`<`D`@+20%`"`"`/@)```P+0)`("TD!0`D
+M`@#X"0``,"VN8!,<`D`@+0(@^`DD!0`L`D`@+20%`#`"`/@))`8`!0)`("TD
+M!0`T`@#X"20&``4"0"`M)`4`1`(`^`DD!@`(`D`@+20%`$@"`/@))`8`"`)`
+M("TD!0!0`@#X"0``,"T"0"`M)`4`3`(`^`D``#`M`D`@+20%0`P"`/@)```P
+M+0)`("TD!0!``@#X"0``,"T"0"`M-`6`&`(`^`F.9A/X`D`@+30%@$@"`/@)
+M```P+0)`("T\`@``)$(```!`^`D``"@M`D`@+30%@%`"`/@)```P+0)`("TT
+M!8!4`@#X"0``,"T"0"`M-`6`6`(`^`D``#`M`D`@+30%@%P"`/@)```P+0)`
+M("TT!8!@`@#X"20&``$"0"`M-`6`9`(`^`DD!@`!`D`@+30%@&@"`/@)```P
+M+0)`("TT!8`H`@#X"0``,"T"0"`M-`6`+`(`^`D``#`M`D`@+30%@&P"`/@)
+M```P+0)`("TT!8`P`@#X"20&__\"0"`M-`6`-`(`^`DD!O__`D`@+30%@#@"
+M`/@))`8``0``@"T\`@``)%$4R#P"```D5````!`0P`!1$"&,10``CZ(``!!`
+M``0DHH``+$(0`%1```<F$``!`!`0P`!1$"$"0"`M`H#X"8Q&``0F$``!+@(`
+MIQ1`__``$!#``D`@+3P"```D0@```$#X"0*@*"T00`#0)`,``P)`("T\$0``
+M)C$```(@^`DT!9@H/`/__S1C`/\`0Q`DDF,2>0`#&@``0Q`E`D`@+30%F"@\
+M$```)A````(`^`D`0#`MDF(2>@`"-@```A0``,(P)9)C$GL``Q(``,(P)0##
+M,"4"0"`M`@#X"30%F#0"0"`M`B#X"30%F$0D`\!_`$,0))9C$G0``QA",&,_
+M@`!#$"4"0"`M-`681`(`^`D`0#`M`D`@+0(@^`DT!9A(/`/__#1C#_\`0Q`D
+MEF02=``$(H`\`P`#-&/P``"#("0`1!`E`D`@+30%F$@"`/@)`$`P+0)`("T"
+M(/@)-`689#P#__@T8P__`$,0)))D$G@`!",`/`,`!S1C\```@R`D`$00)0)`
+M("TT!9AD`@#X"0!`,"T"0"`M`B#X"30%F1`D`__\`$,0))9C$G0P8P`#`$,0
+M)0)`("TT!9D0`@#X"0!`,"T"0"`M/`(``21"H1P`0/@)`N`H+1!``'0D`P`#
+MCZ(``!!```T"0"`MDN(`!#!"``)40``%EN(``I+B``0P0@#^HN(`!);B``*F
+MH@`"DN(`!**B``0"0"`M-`68'#P0```F$````@#X"20&``$\`@``)$(```!`
+M^`DD!`/H`D`@+3P"```D0@```$#X"30%F&`T0@`!`D`@+30%F&`"`/@)`$`P
+M+0)`("TT!9A@)`8``3P"```D0@```$#X"0``."T"0"`M/`(``"1"````0/@)
+M`N`H+11```8``(`MEJ(``C1"``*FH@`""``CXB0#``,\`@``)%$```)`("T"
+M(/@)`@`H+280``$J`@`#%$#_^P)`("V.0A),$$``!SP"```\`@``)$(```!`
+M^`D"0"`M`D`@+3P"```D0@```$#X"30%@"0\`_Y_-&/__P!#$"0"0"`M`$`P
+M+3P"```D0@```$#X"30%@"2.91/\)`+__Q"B``0\`@``)$(```!`^`D"0"`M
+MCF44`"0"__\0H@`$/`(``"1"````0/@)`D`@+8YE%`0D`O__$*(`!#P"```D
+M0@```$#X"0)`("V.1@'X4,``!ZY6`=P"0"`M/`(``"1"````0/@)-`6`:*Y6
+M`=P(`"/F)`(``8_"``!40``!K\,`````$"W?OP!8W[X`4-^W`$C?M@!`W[4`
+M.-^T`##?LP`HW[(`(-^Q`!C?L``0`^``"">]`&`GO?_@_[\`&/^R`!#_L0`(
+M_[````"`D"T`H(`M/`(``"1"````0/@)-`6`!#!#__\D`@`!4@(`%HY&$_0J
+M`@`"4$``!20"``82```-W[\`&`@`)"3?L@`04@(`!HY&$_0D`@`($@(`#=^_
+M`!@(`"0DW[(`$`!F,"4(`"0</`(`48Y&$_0`9C`E"``D'#P"`%(`9C`E"``D
+M'#P"`!2.1A/T`&8P)3P"`!``PC`E`D`@+3P"```D0@```$#X"30%@`3?OP`8
+MW[(`$-^Q``C?L````^``"">]`"`GO?_P_[\``#P"``$D0H_(`$#X"8R%`=S?
+MOP```^``"">]`!`GO?_P_[\``"0%``@\`@`!)$*6'`!`^`DD!@`*W[\```/@
+M``@GO0`0)[W_X/^_`!#_L0`(_[````"`B"T``"@M/`(``"1"````0/@))`8`
+M`1!``!8``!@M`B`@+20%``\\`@`!)$*6'`!`^`DD!DX@$$``#@``&"T\$```
+M)A````(`^`DD!`/H`B`@+20%`!\\`@`!)$*6'`!`^`DD!DX@`@#X"20$"#0D
+M`P`!`&`0+=^_`!#?L0`(W[````/@``@GO0`@)[W_X/^_`!#_L0`(_[````"`
+MB"T`H(`M```H+3P"```D0@```$#X"20&``$00``S```8+1(```4``#`ME@(`
+M`C!"`!!40``!)`8``0(@("T\`@``)$(```!`^`DT!9@$`B`@+20%``\\`@`!
+M)$*6'`!`^`DD!DX@$$``(```&"T\`@``)$(```!`^`DD!`/H`B`@+20%`!\\
+M`@`!)$*6'`!`^`DD!DX@$$``%```&"T\`@``)$(```!`^`DD!`@T`B`@+0``
+M*"T\`@``)$(```!`^`DD!@`!$$``"```&"T"("`M```H+3P"``$D0I8<`$#X
+M"20&``H`0!@M`&`0+=^_`!#?L0`(W[````/@``@GO0`@)[W_H/^_`%C_O@!0
+M_[<`2/^V`$#_M0`X_[0`,/^S`"C_L@`@_[$`&/^P`!``@+`MKZ4``#P"```D
+M0@```$#X":^F``0`0+@M$$``P```&"T"P"`M/!(``"92```"0/@)-`6`:#1"
+M`&`"P"`M-`6`:#P1```F,0```B#X"0!`,"T"P"`M`D#X"30%@"0`0*@M/`;_
+M?S3&__\`1C`D`L`@+0(@^`DT!8`D/!```"80```"`/@))`0/H`+`("T"0/@)
+M-`68"#P#"```0Q`E`L`@+30%F`@"(/@)`$`P+0(`^`DD!``*`L`@+3P"``$D
+M0J$<`$#X"0+@*"T00`"4```8+3P"```D7@```\#X"20$`^@"P"`M/!$``"8Q
+M```"(/@)-`68"#P2]_\V4O__`%(0)`+`("TT!9@(/!```"80```"`/@)`$`P
+M+0+`("T"(/@)-`686`!`F"T"P"`M`B#X"30%F%P`0*`M`L`@+0(@^`DT!9AH
+MKZ(`"#P&_`,TQO__`F8P)#P"`_P`PC`E`L`@+0(`^`DT!9A8/`;_P#3&`'\"
+MAC`D/`(`/S1"P(``PC`E`L`@+0(`^`DT!9A</`;__C3&`!^/H@`(`$8P)#3&
+M$8`"P"`M`@#X"30%F&@#P/@))`0`%`+`("T"(/@)-`68"#P#"```0Q`E`L`@
+M+30%F`@"`/@)`$`P+0/`^`DD!``*`L`@+30%F-0"`/@))`8`(0+`("T"(/@)
+M-`68"`!2$"0"P"`M-`68"`(`^`D`0#`M`\#X"20$`^@"P"`M`B#X"30%F&`T
+M0@`!`L`@+30%F&`"`/@)`$`P+0+`("TT!9A@)`8``3P"```D0@```$#X"0``
+M."T"P"`M-`686`(`^`D"8#`M`L`@+30%F%P"`/@)`H`P+0+`("TT!9AH`@#X
+M"8^F``@"P"`M/`(``"10```"`/@)`N`H+11```P"P"`M`\#X"20$$X@"P"`M
+M`@#X"0+@*"T40``%`L`@+8^C``"48@`"-$(``J1B``(\`@``)$(```!`^`DT
+M!8!H)`/_GP!#$"0"P"`M-`6`:#P0```F$````@#X"0!`,"T"P"`M-`6`)`(`
+M^`D"H#`M)`(``8^C``2L8@``)`,``0!@$"W?OP!8W[X`4-^W`$C?M@!`W[4`
+M.-^T`##?LP`HW[(`(-^Q`!C?L``0`^``"">]`&`GO?_`_[\`,/^S`"C_L@`@
+M_[$`&/^P`!``@)`M`*"`+0#`B"T4H``"`*`0+20"__^OH@```D`@+20%0``\
+M`@``)%,```)@^`D"`#`M/`(``"1"````0/@)`B`@+3(0``^/H@``,$(`#Z^B
+M```"0"`M)`5``(^F```\`@``)$(```!`^`D"`#@M`$"(+3("``040``1`B`0
+M+20"`!6OH@``DZ8``).B``$``A(``,(P)9.B``(``A0``,(P)9.B``,``A8`
+M`,(P)0)`("T"8/@))`4`%`(@$"W?OP`PW[,`*-^R`"#?L0`8W[``$`/@``@G
+MO0!`,,8`_P``."TD!``*)`L`/R3)``$D"@`!``000"1"``,P0@#_%,(`!P`$
+M$$``I!`AD$(``!1+`#<`0!@M"``E^R0'``$D0@`#,$(`_Q4B`!T`````&(``
+M&P"D$"&00P``)`<`/U!G`!TD!P`!D$C__U$'`!HD!P`!`&@8(P`#$$``0Q`A
+M``(0@`!#$",``A$``$,0(P`"$$`D0@/G``(8/``#&#X\`A!B-$)-TP!B`!P`
+M`!@2``,9O@!H$"$(`"8),$,`_U3J``8DA/__`*00(9!"```42P`/`$`8+22$
+M__\$@?_.``000```("TD!@`_`*00(9!"```41@`&`$`8+22$``$H@@`+5$#_
+M^@"D$"$D`P`!`^``"`!@$"T`H$@M,,,`_R0+__\D!?__``!`+20*`#\!*"`A
+MD((``%!*`!,E"``!4$,`(P`($$``0Q`K5$```0$`*"T!*#`AD,(```!B$"M0
+M0``))0@``20"__\4H@`)`0!8+0`($$`D0@`#H.(```@`)EZ0Q``+*0(`"Q1`
+M_^D!*"`A*0(`"Q1``!$`JQ`A)`+__Q"B`"\D!``_*0(`"U1```L`JQ`A``40
+M0"1"``.@X@```240(0@`)EZ01``+)$(``Z#B```(`"9>D(0`"R1"``.@X@``
+M`24H(9"F````9A`C``(90`!B&",``QB``&(8(0`#&,`!*R`AD((```!&$",`
+M8@`:```8$E!```$`!P`-D((`"Y"D``L`1!`C`&(`&```$!(D0@/G``(0/``"
+M$#X\`Q!B-&--TP!#`!P``!`2``(1OI"C``L`0Q`A,$0`_P/@``@`@!`M+*(`
+M/5!```$D!0`\I(4!_`/@``@D`@`!)[W_L/^_`$C_M@!`_[4`./^T`##_LP`H
+M_[(`(/^Q`!C_L``0`("8+0"@&"T`P(@M`(`H+92"$G8``A$",$(`!Z#"``^0
+M@A)W,$(`!Z#"`!"48@``)$+KSC!"__\L0@"7$$``T@``("T``#`MEF0""`#%
+M$"&00A)^$((`!B0"``0DQ@`!+,(`!!1`__H`Q1`A)`(`!!#"`,4``"`ME&,`
+M`"1CZ\X\`F9F-$)F9P!B`!P``!`2``(0/P`"$(,``Q_#`$,8(RQB``Q00``!
+M)&/__P`#$#P``A`^-`.JJ@`#'#@T8ZJK`$,`'```$!(``AA^``,0P`!#$",`
+M`A"``$,0(0"BD"$F4A*"`D8H(9"B`!FB(@`.DD0`%C"#`/^0H@`9`$,0*U1`
+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
+M```\`@``)$(```!`^`DT!9AD``(<PC!C`?\P8@$`$$``!`!@$"TX8@'_``(8
+M)P!@$"W?OP```^``"">]`!`GO?_0_[\`*/^T`"#_LP`8_[(`$/^Q``C_L```
+M`("(+0"@H"T\`@``)$(```!`^`DT!9A@-$(``@(@("T`0#`M/`(``"1"````
+M0/@)-`688`(@("TT!9A@)`8``CP"```D0@```$#X"0``."T00``8```8+0``
+M@"T\`@``)%,``#P"```D4@```F#X"20$`^@"0/@)`B`@+0!`&"TF$``!*@(`
+M%1!```,H8O^Y$$#_]@`````H8O^Y5$``!*:#`!:F@``6"``HM0``&"TD`P`!
+M`&`0+=^_`"C?M``@W[,`&-^R`!#?L0`(W[````/@``@GO0`P`^``"```$"T#
+MX``(```0+2>]__#_OP```*`8+2BB``,00``*```H+0`#*0``HR@C``4H@`"%
+M*"$\`@``)$(```!`^`DDI1-``$`H+0"@$"W?OP```^``"">]`!`GO?_P_[\`
+M``#`0"THH@`#$$``"P``&"T`!3$``,4P(P`&,(``AC`A),830#P"```D0@``
+M`$#X"0$`*"T`0!@M`&`0+=^_```#X``()[T`$">]_]#_OP`H_[0`(/^S`!C_
+ML@`0_[$`"/^P````@)`M`*"(+20"``(0H@`-`,"@+2RB``,00``&)`(``R0"
+M``$0H@`+)`/__P@`*2<`8!`M$*(`!20#__\(`"DG`&`0+0@`*08D$P`""``I
+M!B03``$``)@M`!,1``!3$",``A"``(*`(280$T".`@`$%$``&20#__\"`"`M
+M/`(``"1"````0/@))`4`/!:```NN$0`$)`(`"ZX"``PD`@`"K@(`%"0"__^N
+M`@`8)`(`"J8"`"`(`"DEI@(`(@)`("T"8"@M/`(``"1"````0/@)`H`P+0)@
+M&"T`8!`MW[\`*-^T`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`LH@`#$$``
+M'0``,"T`!1$``$40(P`"$(``@A@A)&,30(QB``000``5`````*Q@``0D`P`!
+M`*,8!``#&">,@A,@`&(0)*R"$R",@A,D`&(0)*R"$R2,@A,H`&(0)*R"$RB,
+M@A,L`&(0)*R"$RR,@A,P`&(8)*R#$S`D!@`!`^``"`#`$"TGO?_0_[\`*/^T
+M`"#_LP`8_[(`$/^Q``C_L````("(+0"@H"T`@)@MC(42-"Z"``,00`#)```@
+M+0`4$0``5!`C``(0@`(BD"$F4A-`CD(`!!!``,(`@!`MCD,`!"0"``$48@"]
+M)`0``92B``(P0@`0$$``,`(@("TT!8`0/!```"80```"`/@))`8!X`(@("TT
+M!8`4/`8(``(`^`DTQ@@``B`@+30%@"`\!@'=`@#X"33&C\^.0@`4``(Q``#"
+M,",`!C%`),8!X``&,L`TQ@'@`B`@+0(`^`DT!8!``B`@+30%@$0\!@6N`@#X
+M"33&`\`"("`M/`(``"1"````0/@)-`681"0#_X``0Q`D-$(`.`(@("TT!9A$
+M`@#X"0!`,"T"("`M-`68!#P&;P`(`"G--,8@(S0%@!`\$```)A````(`^`DD
+M!@%H`B`@+30%@!0\!@0``@#X"33&!``"("`M-`6`(#P&`=T"`/@)-,:/IXY#
+M`!0``Q!``$,0(0`",0``PC`C``8PP"3&`C``!C+`-,8",`(@("T"`/@)-`6`
+M0`(@("TT!8!$/`8$UP(`^`DTQ@.8`B`@+3P"```D0@```$#X"30%F$0D`_^`
+M`$,0)#1"`!P"("`M-`681`(`^`D`0#`M`B`@+30%F`0\!F\`-,80(`(`^`D`
+M````CD,`&"0"__\08@`")`8`#XY&`!@`!C4`ED(`(@`"$0`P0@#P`,(P)99"
+M`"`P0@`/`,(P)3P"``@T0B```,(P)0(@("T\`@``)$(```!`^`DT!8`<CD(`
+M##!"``$00``%)`(``0*"$`2.8Q,@"``I\`!#$"4"@A`$``(0)XYC$R``0Q`D
+MKF(3((Y"``PP0@`!$$``!20"``$"@A`$CF,3)`@`*?T`0Q`E`H(0!``"$">.
+M8Q,D`$,0)*YB$R2.0@`,,$(``A!```4D`@`!`H(0!(YC$R@(`"H*`$,0)0*"
+M$`0``A`GCF,3*`!#$"2N8A,HCD(`##!"``000``%)`(``0*"$`2.8Q,L"``J
+M%P!#$"4"@A`$``(0)XYC$RP`0Q`DKF(3+(Y"``PP0@`($$``!20"``$"@A`$
+MCF,3,`@`*B0`0Q`E`H(0!``"$">.8Q,P`$,0)*YB$S`D!``!`(`0+=^_`"C?
+MM``@W[,`&-^R`!#?L0`(W[````/@``@GO0`P)[W_\/^_````!1D``&48(P`#
+M&(``@Q`AC$,31!!@``DD`@`!5&(`""0"__\\`@``)$(```!`^`D``"@M"``J
+M0M^_```D`O__W[\```/@``@GO0`0)[W_\/^_````!1$``$40(P`"$(``@A`A
+MC$,31"0"``%08@`)```H+1!@``P``!`M+&(`!%!```D``!`M)`4`!`@`*E<\
+M`@``/`(``"1"````0/@)`````"0"``'?OP```^``"">]`!`GO?_@_[\`&/^R
+M`!#_L0`(_[````"`B"T\`@``)$(```!`^`D`H(`M`$"0+3P%?_\TI?__`$4H
+M)#P"```D0@```$#X"0(@("T"("`M/`(``"1"````0/@)-`6`9!(```8`0#`M
+M)`(`)0!&$",``A!""``JA@#","$L0@`"$$``""3&__\"("`M/`(``"1"````
+M0/@)`D`H+0@`*I$``!`M`B`@+3P"```D0@```$#X"30%@&0"("`M/`(``"1"
+M````0/@)`D`H+20"``'?OP`8W[(`$-^Q``C?L````^``"">]`"`GO?_@_[\`
+M$/^Q``C_L`````41``!%$",``A"``((0(8Q#$T0D`@`!$&(`"P"`B"T08``<
+M```0+20"``)08@`3)`4`*"0"``,08@`&)`4`"`@`*L```!`M)`4`"`@`*KLD
+M!@`!/!```"80```"`/@))`8``@(@("TD!0`H`@#X"20&``X(`"K`)`(``20&
+M``H\`@``)$(```!`^`D`````)`(``=^_`!#?L0`(W[````/@``@GO0`@)[W_
+M\/^_````!1D``&48(P`#&(``@Q`AC$,31!!@``H``!`M)`(``51B``<``!`M
+M/`(``"1"````0/@))`4`%#!">````A+"W[\```/@``@GO0`0)[W_T/^_`"#_
+MLP`8_[(`$/^Q``C_L`````41``!%$",``A"``((0(8Q#$T0D`@`!$&(`"`"`
+M@"T08``J```0+20"``(08@`@)`4`+`@`*Q,``!`M)`4`"#P"```D0@```$#X
+M"20&``@``(@M/`(``"13```\`@``)%(```(`("T"8/@))`4`%#!">``00``'
+M`@`@+0)`^`DD!``*)C$``2HB`^@40/_V`@`@+20%``@\`@``)$(```!`^`D`
+M`#`M"``K$RHB`^@D!@`$/`(``"1"````0/@)```X+0@`*Q3?OP`@W[\`(-^S
+M`!C?L@`0W[$`"-^P```#X``()[T`,(^L``"/JP`()0+__2Q"``(40``"/`D,
+M```(3H`PQ`__``H4@`""("4`!QL`/`(``S1"\```8A@D`(,@)3%B``$00``#
+M`(D@)3P"`0``@B`E,6(`$!!```2/H@`$/`(@``""("6/H@`$$$```CP"`@``
+M@B`EJ*0`"+BD``LD`O__$8(`#@`,&T`\`@`'-$+@``!B&"2HHP`,N*,`#XBB
+M``B8H@`+/`-```!#$"6HH@`(N*(`"P@`*TPQ8@`$J*``#+B@``\Q8@`$$$``
+M#CP#`$"(H@`(F*(`"P!#$"6HH@`(N*(`"XBD``R8I``/CZ(`$#P#__@`0Q`D
+M`((@):BD``RXI``/`^``""0"``$#X``(```0+8BB``B8H@`+/`,@``!#$"6H
+MH@`(`^``"+BB``L0X``'`````(BB``R8H@`/%0``#P!&$"4(`"MZ-$(0`%$`
+M``DTPA``B2(`")DB``NHH@`(N*(`"ZBF``RXI@`/"``K?0``$"VHH``(N*``
+M"ZBB``RXH@`/```0+:BB`!2XH@`7J*(`$+BB`!,#X``()`(``8BB`!28H@`7
+M,$(``1!``#LD`P`/B*(`%)BB`!<P0A_^I,(``(BB`!"8H@`3``(4`J3"``*@
+MP``$B*(`$)BB`!,P0@`!%$``%P````"(H@`0F*(`$S!"``(00``")`(``:#"
+M``2(H@`0F*(`$S!"``@00``$`````)#"``0T0@`"H,(`!(BB`!"8H@`3,$(`
+M!!!```0`````D,(`!#1"``2@P@`$B*(`")BB``L``A2",$(`#Z#"``6(H@`4
+MF*(`%P`"$T*@P@`&B*(`$)BB`!,P0@\```(2`J#"``>(H@`0F*(`$S!"`/``
+M`A$"H,(`"*#```J@P``+```8+0/@``@`8!`M`^``"`````"0H@`$-$(`"*"B
+M``0#X``(```0+2>]_^#_OP`8_[(`$/^Q``C_L````("(+30%F-`\`@``)$(`
+M``!`^`DD!AP6``"`+3P"```D4@```B`@+30%F(`"0/@)/`8``280``$J`@`(
+M%$#_^@(@("T\`@``)$(```!`^`DT!9P```(6`@`"&0(P0@`/``(1``!B$"4`
+M0"`M/`(``"1"````0/@))`4`"-^_`!C?L@`0W[$`"-^P```#X``()[T`(">]
+M_Z#_OP!0_[<`2/^V`$#_M0`X_[0`,/^S`"C_L@`@_[$`&/^P`!``H*`M`,"H
+M+0#@L"T!`+@M,)'__SP"```D0@```$#X"20$+O``0)`M$$`!'B00``(`0)@M
+M`$`@+3P%```DI1IP/`(``"1"````0/@))`82<*Y4``RN50`0KE8`%*91`<BF
+M0`'*)`(`/Z9"`?RN0`(`KD`NK*Y`+L@D`@<`KD(NT"0"__^N0B[4KD(NV*Y"
+M+MP"0"`M/`(``"1"````0/@)```H+1!``/\D$``#ED,!R#0"\1M48@`0`F`@
+M+0)`("TT!:(`/!```"80```"`/@)```P+0)`("TT!9A\`@#X"20&`!D\`@``
+M)$(```!`^`DD!`/H`F`@+3P"```D0@```$#X"20%0"`P0P#_``,1`JYB`<PP
+M8P`/IF,!T"1"__XL0@`#$$``WR00``T"8"`M/`(``"1"````0/@)-`68&*9B
+M`=(\`@`!)$*U,`!`^`D"8"`M$$``TR00``Z.8@',+$(`!!1```0"8"`M-`68
+M``@`+%\D!@`'-`68`"0&`$<\`@``)$(```!`^`DD$``-/`(``"1"````0/@)
+M)`0'T#P"``$D0J\L`$#X"0)@("VF8@'4,$+__S!"`/`D`P`0%$,`N`)@("TD
+M!0#!/`(``"1"````0/@)`Z`P+1!``+$D$``(EZ(``"Q",``40`"M)!``!9>B
+M``"F0A)P`F`@+3P"```D0@```$#X"20%0!`P0P`8``,8PB0"``(48@"A)!``
+M"@)@("TD!0`_/`(``"1"````0/@)`Z`P+1!``)DD$``(EZ(``*9"$G(``(@M
+M``"`+3P"```D5```)@4`P`)@("T"@/@)`Z`P+1!``(R7H@```B*()B80``$N
+M`@-`%$#_]R8%`,`T`O__%B(`A200``<D`@`*ID(3YB0"``.F0A7P``"`+20#
+M``L`$!!``%`0(0`"$(``4!`A``(0@`!2$"&D0Q/N)A```2X"``H40/_W`!`0
+M0```@"T\`@``)$8LX"0%``L`$!!``%(@(0!&&"&48P``I(,5^*2#%?(`4!`A
+M``(0@`!0$"$``A"``%(0(:1%%K2D1188)A```2X"``,40/_Q`!`00"9%$G`\
+M`@``)$(```!`^`D"8"`M$$``6"00``B.8@',+$(`!%1``""F0!**ED(2BE!`
+M`!VF0!**`F`@+30%F``\$0``)C$```(@^`DD!D`'/!```"80```"`/@))`0'
+MT#P"``$D0J\L`$#X"0)@("VF8@'6`F`@+30%F``"(/@))`8`!P(`^`DD!`?0
+MEF(!UC!"`/`D`P`@%$,`-R00``T(`"SU`F`@+0)@("TD!0"_/`(``"1"````
+M0/@)`Z`P+1!``"TD$``(EZ(``*9"$G2F8@((/`(``"1"``"N8@'`/`(``21"
+MMS``0/@)`F`@+3P"```D0@```$#X"0)@("T``(@M``"`+205`!\\`@``)%0`
+M``*P*","8"`M`H#X"0.@,"T00``3EZ(```(BB"$`$!A``'(8(0`"$@*@8BPL
+MDZ(``:!B+"TF$``!+@(``Q1`__$"L"@C$B``!#P"``(T0O_]%B(`#`)@("T(
+M`"TH)!``"200``@20``$/`(``"1"````0/@)`D`@+5;@``&N\``````@+0"`
+M$"W?OP!0W[<`2-^V`$#?M0`XW[0`,-^S`"C?L@`@W[$`&-^P`!`#X``()[T`
+M8">]__#_OP`(_[````"`@"T\`@``)$(```!`^`DDA1)P/`(``"1"````0/@)
+M`@`@+=^_``C?L````^``"">]`!`GO?^0_[\`:/^^`&#_MP!8_[8`4/^U`$C_
+MM`!`_[,`./^R`##_L0`H_[``(`"`F"T\`@``)$(LZ&A#``!L0P`'LZ,``+>C
+M``<\`@``)$(L\&A#``!L0P`':$0`"&Q$``^SHP`0MZ,`%[.D`!BWI``?``#P
+M+3P"```D5@``/`(``"17````'H"``AV`(8X2```"8"`M`L#X"0)`*"VN`@`(
+M``"(+0`1%```48`E`F`@+0)`*"T"X/@)`@`P+0)@("T"P/@)`D`H+110`"D`
+M`!@M)C$``2HB`0`40/_S`!$4````B"T\`@``)%4``#P"```D5````!$0@`!=
+M$"&,4``0`F`@+0)`*"T"H/@)`@`P+0)@("T"@/@)`D`H+18"`!0``!@M)C$`
+M`2HB``040/_R`!$0@``>$(``71`A`F`@+8Q%```"X/@)C$8`""?>``$KP@`"
+M%$#_S``>@(`\`@``)$(```!`^`DD!`!D)`,``0!@$"W?OP!HW[X`8-^W`%C?
+MM@!0W[4`2-^T`$#?LP`XW[(`,-^Q`"C?L``@`^``"">]`'`PI?__,*(!`%!`
+M``4PH@"`)`(3.*3"```(`"W%)`(7U!!```H`````E((2BA!```<`````)`()
+M"*3"```D`@JLI.(```/@``@D`@`!`^``"```$"T#X``()`(``2>]_\#_OP`P
+M_[,`*/^R`"#_L0`8_[``$`"`F"T`@(@M`("0+92#`@@D`@`!%&(`!B20`>`D
+M!0`0/`(``"1"````0/@)`Z`P+:X```26(A*&4$``"98B$HHD`@`!K@(`!)8B
+M$G940``$EB(2BB0"``.N`@`$EB(2BA!```4D`@D(C@(`!#1"``2N`@`$)`()
+M"*8"`!`D`@JLI@(`$B0"$SBF`@`,)`(7U*8"``Z.`P``/`*```!B&"4\`D``
+M-$+```!B&"4D`@`*I@(`""0"`("F`@`*)`+[_P!B&"0D`OW_`&(8)*X#``"6
+M(A)Z$$``#R0"``TF1A)(`F`@+3P"```D0@```$#X"20%``\00``')`(`#20"
+M``&N0A),C@(``#1"`0"N`@``)`(`#:X"`!0D`@`!KD(2:-^_`##?LP`HW[(`
+M(-^Q`!C?L``0`^``"">]`$`GO?_@_[\`&/^R`!#_L0`(_[````"`D"T`H(@M
+M-`6`*#P0```F$````@#X"8XF``0"0"`M-`6`+`(`^`F.)@`,`D`@+30%@#`"
+M`/@)CB8`$`)`("TT!8`T`@#X"8XF``@"0"`M-`6`(`(`^`F.)@``W[\`&-^R
+M`!#?L0`(W[````/@``@GO0`@)[W_T/^_`""OI0`$C(,!W"0"``$08@`)-`+_
+M_Q!@``P\`@``)`(`!A!B``@D`@`(5&(`$22B``$T`O__KZ(`##P"``<(`"Y?
+M-$+__SP"``",0@```*(0(P`"$,"OH@`,/`(``(Q"````HA`C``(0P*^B`!`D
+MH@`!KZ(`"#P"`8`T0O__`,(0)*^B```\`@``)$(```!`^`D#H"@MW[\`(`/@
+M``@GO0`P)[W_X/^_`!#_L0`(_[````"`B"TT!8`H/!```"80```"`/@)```P
+M+0(@("T\`@``)$(```!`^`DT!8`$/`,`!`!#$"4\`__/-&/__P!#$"0"("`M
+M-`6`!`(`^`D`0#`M`B`@+30%@"`"`/@)-`;__]^_`!#?L0`(W[````/@``@G
+MO0`@)[W_T/^_`"#_LP`8_[(`$/^Q``C_L````("(+0"@D"V4H@`2$$``'`"`
+MF"T\`@``)$(```!`^`DT!8`$/`,`$`!#$"4"("`M-`6`!#P0```F$````@#X
+M"0!`,"V61@`0`B`@+0(`^`DT!8`DED8`$@(@("T"`/@)-`6`.(Y&`!0`!C#`
+M`B`@+0(`^`DT!8`P"``NP@(@("T\`@``)$(```!`^`DT!8`$/`/_[S1C__\`
+M0Q`D`B`@+0!`,"T\`@``)$(```!`^`DT!8`$`B`@+30%@"@\`@``)$(```!`
+M^`F.1@```B`@+3P"```D0@```$#X"30%@"`\`_^``$,0))9#``H`0S`EED(`
+M&!!```8"("`M)$(`!``"%``\`P!_`$,0)`#","4\$```)A````(`^`DT!8`@
+MCF8NT#P"__\T0@#_`,(P))9"`!H``A(`,$+_``#","6N9B[0`B`@+0(`^`DT
+M!8`8`B`@+3P"```D0@```$#X"20%0`0\`___`$,0)(Y#`!PD8__]``,8P#!C
+M__\`0Q`E`B`@+20%0`0"`/@)`$`P+=^_`"#?LP`8W[(`$-^Q``C?L````^``
+M"">]`#`GO?_P_[\``#P"```D0@```$#X"20%0`@``A`KW[\```/@``@GO0`0
+M)[W_X/^_`!#_L0`(_[````"`B"T`H(`M/`(``"1"````0/@))`4`P`!`("TD
+M`O__5((`!#P"`06N````"``O50``$"TT0MBZ`((8)#P"``@`@A`D$$``!*X#
+M```\`D```&(0):X"```P@@`%$$``!3""!<".`@``-$(``:X"```P@@7`$$``
+M!3""`"".`@``-$(`0*X"```P@@`@4$``"(X"``".(A)H$$``!8X"```\`T``
+M`$,0):X"``".`@``/`-```!#$"000``9)`(``:XD$E`"("`M/!```"80```"
+M`/@))`4`Q*XB$E0"("`M`@#X"20%`,BN(A)8`B`@+0(`^`DD!0#,KB(27`(@
+M("T"`/@))`4`T*XB$F`"("`M`@#X"20%`-2N(A)D)`(``=^_`!#?L0`(W[``
+M``/@``@GO0`@`^``"(R"+#@GO?_0_[\`*/^T`"#_LP`8_[(`$/^Q``C_L```
+M`("0+0"@@"V,E"PX!H$`"P"`B"TD!0`D/`(``"1"````0/@)```P+0)`("T\
+M`@``)$(```!`^`DD!0`D/`(!!31"V+H"`C`D,@(`0!!```XR`@`!CB(L/%1`
+M``$TQ@!`CB(L0%1```$TQ@$`CB(L1%1```$TQ@"`CB(L2%1```$TQ@0`,@(`
+M`51```$TQ@`'/`)```("$"000``#`D`@+3P"``@`PC`E/`(``"13```"8/@)
+M)`4`H`8!``6N,"PX`D`@+20%`"0"8/@))`8``0*`$"W?OP`HW[0`(-^S`!C?
+ML@`0W[$`"-^P```#X``()[T`,`/@``@D`@"`)[W_\#"E__\LH@"`$$``"_^_
+M````!2E`-`*('`"B*"$\`@``)$(```!`^`D`````,$*``!1```(D`P`!```8
+M+0!@$"W?OP```^``"">]`!`GO?_@_[\`&/^R`!#_L0`(_[````"`D"TPI?__
+M+*(`@!!``"T``!@M``6)0#0%B``")2@A/!```"80```"`/@)```P+30%B`0"
+M)2@A`D`@+0(`^`D``#`M-`6("`(E*"$"0"`M`@#X"0``,"TT!8@,`B4H(0)`
+M("T"`/@)```P+30%B!`")2@A`D`@+0(`^`D``#`M-`6(%`(E*"$"0"`M`@#X
+M"0``,"TT!8@8`B4H(0)`("T"`/@)```P+30"B!P"(H@A`D`@+0(@*"T"`/@)
+M```P+20#``$`8!`MW[\`&-^R`!#?L0`(W[````/@``@GO0`@)[W_T/^_`"#_
+MLP`8_[(`$/^Q``C_L````("8+0#`&"TPI?__+*(`@!!``"4``"`M4,``%```
+MD"V0T@`%`!*2`)#"``0"0I`ED,8``P`&-@"08@`"``(4``#","608@`!``(2
+M``#","608@```,(P)0`&,$(`$A?``,(P)0@`,!4`$I!"```P+0`%B4`T!8@8
+M`B4H(3P0```F$````@#X"0)@("TT`H@<`B*((39&@``"8"`M`@#X"0(@*"TD
+M!``!`(`0+=^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`GO?^@_[\`6/^^
+M`%#_MP!(_[8`0/^U`#C_M``P_[,`*/^R`"#_L0`8_[``$`"`H"T`X/`M,+?_
+M_SP$JJH5```"-(2JJ@``("TNX@"`$$``>P``&"V0PP``)`(``1!B`!DD`@`%
+M*&(``A!```4D`@`%4&``!Y3"``((`#"Z```8+1!B`!(``!@M"``PNP!@$"TL
+M0@`%%$``:0``&"V4P@`"+$(`!A1```NOH```E,(``BQ"``XD`P`!%$``!J^C
+M```D`@`#"``P8*^B```D`P`'KZ,``)#'``20P@`%``(2``#B."60P@`&``(4
+M``#B."60P@`'``(6``#B."4`Y#@FD,(`"0`"$@"0PP`(`$.P)0+$L"8RUO__
+MD-,`"I#"``L``A(``F*8)9#"``P``A0``F*8)9#"``T``A8``F*8)0)DF":0
+MP@`/``(2`)##``X`0Z@E`J2H)C*U__^0T@`0D,(`$0`"$@`"0I`ED,(`$@`"
+M%``"0I`ED,(`$P`"%@`"0I`EE,(``BQ"``X00``"`D20)C)2`/\`%XE`-`6(
+M``(E*"$"@"`M/!```"80```"`/@)`.`P+30%B`0")2@A`H`@+0(`^`D"P#`M
+M-`6("`(E*"$"@"`M`@#X"0)@,"TT!8@,`B4H(0*`("T"`/@)`J`P+30%B!`"
+M)2@A`H`@+0(`^`D"0#`M-`*(%`(BB"$"@"`M`B`H+0(`^`F/I@```H`@+0+@
+M*"T\`@``)$(```!`^`D#P#`M`$`8+0!@$"W?OP!8W[X`4-^W`$C?M@!`W[4`
+M.-^T`##?LP`HW[(`(-^Q`!C?L``0`^``"">]`&`GO?_P_[\```"`$"T`H"`M
+M)$(L+`!`*"T\`@``)$(```!`^`DD!@`&W[\```/@``@GO0`0)[W_\/^_```D
+MA"PL/`(``"1"````0/@))`8`!B0"``'?OP```^``"">]`!`GO?_P_[\```"@
+M("T\!0``)*4M`#P"```D0@```$#X"20&``;?OP```^``"">]`!`#X``(```0
+M+2>]_^#_OP`8_[(`$/^Q``C_L````("(+0"@$"T`P)`M)`5@`#P0```F$```
+M`@#X"0!`,"T"("`M)`5@"`(`^`DD!@`!`B`@+20%8`PD!@`#/`(``"1"````
+M0/@))`<``A!```@``!@M`B`@+3P"```D0@```$#X"20%8`2F0@``)`,``0!@
+M$"W?OP`8W[(`$-^Q``C?L````^``"">]`"`PI?__E((""!!%``8D`P`,E((2
+M<C!"`(`40``")`,`"R0#``-4P``!K,,```/@``@``!`ME((2AA!```4``!@M
+ME((2=A1```(D`P`!)`,`0Y2"$HI40``!-&,`!`/@``@`8!`M)[W_X/^_`!C_
+ML@`0_[$`"/^P````@)`ME)`22#(1`!P`$8B#,A```@`0@$,\`@``)$(```!`
+M^`D"("@M`D`@+3P"```D0@```$#X"30%F``T0B```D`@+0!`,"T\`@``)$(`
+M``!`^`DT!9@``D`@+3P"```D0@```$#X"0(@*"T`4!`F``(0*P)`("T`0#`M
+M/`(``"1"````0/@)`B`H+=^_`!C?L@`0W[$`"-^P```#X``()[T`(">]_^#_
+MOP`0_[$`"/^P````@(@M`*"`+3P"```D0@```$#X"20%0!0`$(!`)`,``P(#
+M&`0`0Q`E`B`@+0!`,"T\`@``)$(```!`^`DD!4`4)`(``=^_`!#?L0`(W[``
+M``/@``@GO0`@)[W_X/^_`!#_L0`(_[````"`B"T`H(`M/`(``"1"````0/@)
+M)`5`%``0@$`D`P`#`@,8!``#&"<`0Q`D`B`@+0!`,"T\`@``)$(```!`^`DD
+M!4`4)`(``=^_`!#?L0`(W[````/@``@GO0`@)[W_X/^_`!C_L@`0_[$`"/^P
+M````@)`M`*"(+0#`@"T\`@``)$(```!`^`DD!4`8)`,``0(C&`0``Q@G`$,0
+M)#(0``$",(`$`%`0)0)`("T`0#`M/`(``"1"````0/@))`5`&"0"``'?OP`8
+MW[(`$-^Q``C?L````^``"">]`"`GO?_P_[\`"/^P````H(`M+*(`!A!```@D
+M`___/`(``"1"````0/@))`5`'#!"`"\"`A`&,$,``0!@$"W?OP`(W[````/@
+M``@GO0`0)[W_X/^_`!#_L0`(_[````"`B"T`P(`M/`(``"1"````0/@))`5`
+M%`!`,"T\`O_^-$)__`#","02```#-,:``#P"``$`PC`E`B`@+3P"```D0@``
+M`$#X"20%0!2.)2PX/`(!``"B*"4\`@``)$(```!`^`D"("`MW[\`$-^Q``C?
+ML````^``"">]`"`GO?_@_[\`$/^Q``C_L````("(+0"@@"T\`@``)$(```!`
+M^`DD!4`0/`/_\31C_Y\`0Q`D,A``!P`0@(`\`P``)&,M"`(#@"&.`P```$,0
+M)0(@("T`0#`M/`(``"1"````0/@))`5`$-^_`!#?L0`(W[````/@``@GO0`@
+M)[W_X/^_`!C_L@`0_[$`"/^P````@(`M,-'__R2$+#(\`@``)$(```!`^`DD
+M!@`&D@8L,I("+#,``A(``,(P)9("+#0``A0``,(P)9("+#4``A8``,(P)0(`
+M("T\$@``)E(```)`^`DT!8`(D@8L-P`&,@"2`BPV`,(P)3(Q/_\`$8P``-$P
+M)0(`("T"0/@)-`6`#-^_`!C?L@`0W[$`"-^P```#X``()[T`(">]_]#_OP`@
+M_[,`&/^R`!#_L0`(_[````"`@"T\$0``)C$```(@^`DT!8!,`$"0+0(`("T"
+M(/@)-`6`4`!`F"T"`"`M`B#X"30%@$P`4I`K$D```@!`&"TF<P`!`!,0/``#
+M&#P``Q@^`$,0)=^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`GO?_P_[\`
+M`#P"```D0@```$#X"30%@$S?OP```^``"">]`!`GO?_P_[\`"/^P````@(`M
+M/`(``"1"````0/@)-`6`(#P#`0``0Q`E`@`@+0!`,"T\`@``)$(```!`^`DT
+M!8`@W[\`"-^P```#X``()[T`$">]_]#_OP`@_[,`&/^R`!#_L0`(_[````"`
+MF"T\`@``)$(```!`^`DT!9AD``*4PC)2`?\R0@$`$$```P)@("TZ4@'_`!*0
+M)SP1```F,0```B#X"30%@%``0(`M`F`@+0(@^`DT!8!,`@*`)@(2@"8"`!`M
+MW[\`(-^S`!C?L@`0W[$`"-^P```#X``()[T`,">]__#_OP`(_[````"`@"T\
+M`@``)$(```!`^`DD!4`@,$(`_P`"&0(P10`/C@(!S!1#``0``"`ME@(!T%!%
+M``$D!``!`(`0+=^_``C?L````^``"">]`!`GO?_@_[\`&/^R`!#_L0`(_[``
+M``"`D"T`H(`M/!$``"8Q```"(/@)-`6`D(X#````0Q`AK@(```)`("T"(/@)
+M-`6`C(X#``0`0Q`AK@(`!`)`("T"(/@)-`6`E(X#``P`0Q`AK@(`#`)`("T"
+M(/@)-`6`B(X#``@`0Q`AK@(`"`)`("T"(/@)-`6`F(X#`!``0Q`AK@(`$-^_
+M`!C?L@`0W[$`"-^P```#X``()[T`(">]_^#_OP`8_[(`$/^Q``C_L````("(
+M+0"@@"TLH@`)%$``"`"`D"T\`@``)$(```!`^`DT!?__`%`0*Q!```0"("`M
+MKE`NU`@`,O8``!`M/`(``"1"````0/@)`@`H+0(@("T`0#`M/`(``"1"````
+M0/@))`40<*XP+M0D`@`!W[\`&-^R`!#?L0`(W[````/@``@GO0`@)[W_\/^_
+M``C_L````("`+3P"```D0@```$#X"20%$'`P0O__`$`H+3P"```D0@```$#X
+M"0(`("W?OP`(W[````/@``@GO0`0)[W_T/^_`"#_LP`8_[(`$/^Q``C_L```
+M`("(+0"@D"T\`@``)$(```!`^`DD!1__`%(0*Q!```0D`O__KB(NV`@`,S<`
+M`!`M`B`@+3P"```D0@```$#X"30%@!0`0(`M)`+@``("@"0"("`M/`(``"1"
+M````0/@)`D`H+3!"'_\"`H`E`B`@+30%@!0\`@``)$(```!`^`D"`#`MKC(N
+MV"0"``'?OP`@W[,`&-^R`!#?L0`(W[````/@``@GO0`P)[W_\/^_``C_L```
+M`("`+3P"```D0@```$#X"30%@!0P0A__`$`H+3P"```D0@```$#X"0(`("W?
+MOP`(W[````/@``@GO0`0@((NR#A"``$#X``(,$(``2>]_^#_OP`8_[(`$/^Q
+M``C_L````("(+1"@`!$`@)`M/`(``"1"````0/@)-`6`!#P0_O\V$/__`%`0
+M)`(@("T`0#`M/`(``"1"````0/@)-`6`!(XB+L@(`#-Z`%`0)#P"```D0@``
+M`$#X"30%@`0\$`$``%`0)0(@("T`0#`M/`(``"1"````0/@)-`6`!(XB+L@`
+M4!`EKD(NR"0"``'?OP`8W[(`$-^Q``C?L````^``"">]`"`GO?_0_[\`(/^S
+M`!C_L@`0_[$`"/^P````@(@M`*"0+3P"```D0@```$#X"20%'_\`4A`K$$``
+M!"0"__^N(B[<"``SK@``$"T"("`M/`(``"1"````0/@)-`6`%`!`@"T\`N``
+M-$+__P("@"0"("`M/`(``"1"````0/@)`D`H+0`"%``\`Q__`$,0)`("@"4"
+M("`M-`6`%#P"```D0@```$#X"0(`,"VN,B[<)`(``=^_`"#?LP`8W[(`$-^Q
+M``C?L````^``"">]`#`GO?_P_[\`"/^P````@(`M/`(``"1"````0/@)-`6`
+M%#P#'_\`0Q`D``(4`@!`*"T\`@``)$(```!`^`D"`"`MW[\`"-^P```#X``(
+M)[T`$`/@``@D`@`!`^``"``````#X``(```0+0/@``@``````^``"``````G
+MO?_P_[\``#P"```D0@```$#X"30%G!PP0@#_W[\```/@``@GO0`0)[W_\/^_
+M```\`@``)$(```!`^`DT!8!8,$(`!]^_```#X``()[T`$">]__#_OP``,*8`
+M!SP"```D0@```$#X"30%@%C?OP```^``"">]`!`#X``(C((NK">]__#_OP``
+MC(82-%3```0\`@``K(4NK`@`,_XD`@`!)$(```!`^`D`````W[\```/@``@G
+MO0`0)[W_\"0"``$4H@`)_[\``"S"``(40``+```8+20"``44P@`()`,`#0@`
+M-!(``!@M/`(``"1"````0/@)``````!`&"T`8!`MW[\```/@``@GO0`0)[W_
+M\"0"``L4H@`)_[\``##F``:LA@'X/`(``"1"````0/@)-`6`2`@`-"8D`@`!
+M/`(``"1"````0/@)`````-^_```#X``()[T`$">]__#_OP``/`(``"1"````
+M0/@)```````"$"O?OP```^``"">]`!`GO?_`_[\`./^V`##_M0`H_[0`(/^S
+M`!C_L@`0_[$`"/^P```0H``U`("`+3P"```D0@```$#X"20%0`0\`__\-&/_
+M_P!#$"0"`"`M`$`P+3P"```D0@```$#X"20%0`0\`@``)$(```!`^`DD!``*
+M)!$`"CP"```D4P``/!8``3P"```D50``/!+__#92__\\`@``)%0```(`("T"
+M8/@))`5`$`!6$"000``0``````*@^`DD!`#(`@`@+0)@^`DD!4`$`%(0)`(`
+M("TD!4`$`H#X"0!`,"TF,?__%B#_[P(`("T(`#2!```0+18@``0"`"`M"``T
+M@0``$"T"`"`M/`(``"1"````0/@)-`6`!#P#__LT8___`$,0)`(`("T`0#`M
+M/`(``"1"````0/@)-`6`!"0"``'?OP`XW[8`,-^U`"C?M``@W[,`&-^R`!#?
+ML0`(W[````/@``@GO0!`)[W_T/^_`"#_LP`8_[(`$/^Q``C_L````("(+0"@
+M@"T\`@``)%,```)@^`DT!8`$/`,`!`!#$"4"("`M`$`P+3P"```D4@```D#X
+M"30%@`02```,W[\`(`(@("T"8/@))`5`!#P#__PT8___`$,0)`(@("TD!4`$
+M`D#X"0!`,"W?OP`@W[,`&-^R`!#?L0`(W[````/@``@GO0`P)[W_T/^_`"#_
+MLP`8_[(`$/^Q``C_L````("(+0"@@"T\`@``)%,```)@^`DT!8`$/`,`!`!#
+M$"4"("`M`$`P+3P"```D4@```D#X"30%@`02```,W[\`(`(@("T"8/@))`5`
+M!#P#__PT8___`$,0)`(@("TD!4`$`D#X"0!`,"W?OP`@W[,`&-^R`!#?L0`(
+MW[````/@``@GO0`P)[W_X/^_`!C_L@`0_[$`"/^P````H(`M`,`H+201``$2
+M$0`-`("0+1(```4D`@`"$@(`#```$"T(`#3[W[\`&#P"``$D0M#,`$#X"0``
+M```(`#3X`$"(+3P"``$(`#3T)$+2+#P"``$D0M+(`$#X"0`````(`#3YKE`N
+MJ*Y0+J@"(!`MW[\`&-^R`!#?L0`(W[````/@``@GO0`@)[W_\/^_```\`@``
+M)$(```!`^`DD!4`$/`,``P!#$"0``A0"W[\```/@``@GO0`0)[W_\/^_``@D
+M`@`"$*(`$_^P```LH@`#$$``!B0"``0D`@`!$*(`!P``$"T(`#4KW[\`"!"B
+M``8``!`M"``U*]^_``@\`@``"``U)210```\`@``"``U)210```\`@``)%``
+M`#P"```D0@```$#X"0(`*"T"`!`MW[\`"-^P```#X``()[T`$">]__#_OP``
+M/`(``"1"````0/@))`4`#-^_```#X``()[T`$">]__#_OP```*`P+3P"```D
+M0@```$#X"20%``S?OP```^``"">]`!`GO?_P_[\``"0%``@\`@``)$(```!`
+M^`DD!@`$W[\```/@``@GO0`0)[W_\/^_``C_L````("`+20%``@\`@``)$(`
+M``!`^`DD!@`@`@`@+20%``@D!@`$/`(``"1"````0/@)```X+0`"$"O?OP`(
+MW[````/@``@GO0`0)[W_\/^_``C_L````("`+3P"```D0@```$#X"30%@$@D
+M`__?`$,0)`(`("T`0#`M/`(``"1"````0/@)-`6`2-^_``C?L````^``"">]
+M`!`GO?_P_[\`"/^P````@(`M/`(``"1"````0/@)-`6`2#1"`"`"`"`M`$`P
+M+3P"```D0@```$#X"30%@$C?OP`(W[````/@``@GO0`0)[W_X/^_`!C_L@`0
+M_[$`"/^P````@(@M`*`0+0#`D"TT!8!`/!```"80```"`/@)`$`P+0(@("TT
+M!8!$`@#X"0)`,"W?OP`8W[(`$-^Q``C?L````^``"">]`"`GO?_@_[\`$/^Q
+M``C_L````("(+0"@@"TLH@!`$$``'```&"TLH@`@%$``"SP"```D0@```$#X
+M"30%@$0D!@`!`@8P!``&,"<`1C`D`B`@+0@`-;TT!8!$)$(```!`^`DT!8!`
+M)`8``0(&,`0`!C`G`$8P)`(@("TT!8!`/`(``"1"````0/@)`````"0#``$`
+M8!`MW[\`$-^Q``C?L````^``"">]`"`GO?_@_[\`$/^Q``C_L````("(+0"@
+M@"TLH@!`$$``&@``&"TLH@`@%$``"CP"```D0@```$#X"30%@$0D!@`!`@8P
+M!`!&,"4"("`M"``UY30%@$0D0@```$#X"30%@$`D!@`!`@8P!`!&,"4"("`M
+M-`6`0#P"```D0@```$#X"0`````D`P`!`&`0+=^_`!#?L0`(W[````/@``@G
+MO0`@)[W_\/^_```\`@``)$(```!`^`DT!8`\W[\```/@``@GO0`0)[W_\/^_
+M````H#`M/`(``"1"````0/@)-`6`/-^_```#X``()[T`$*B@``BXH``+,,(/
+M_ZBB``RXH@`/B*(`#)BB``\41@`/```8+3#B`"!00``'```0+8BB``R8H@`/
+M-$(@`*BB``RXH@`/```0+:BB`!2XH@`7J*(`$+BB`!,D`P`!`^``"`!@$"TG
+MO?_@_[\`&/^R`!#_L0`(_[````#`D"T!((`M`*"(+8BB`!28H@`7,$(``1!`
+M`$PD`P`/B.(`%)CB`!<P0@`!%$``!CP"```D0@```$#X"20%``P04@!")`,`
+M#XHB`!":(@`3,$(/_Z8"``"*(@`4FB(`%P`"$\(P0A__I@(``J(```2*(@`4
+MFB(`%S!"``(40``5`````(HB`!2:(@`7,$(`!!1```<D`@`!BB(`%)HB`!<P
+M0@`0$$``!)("``0T0@`("``V5J("``0T0@`"H@(`!(HB`!2:(@`7,$(`X``"
+M$4*B`@`%BB(`$)HB`!,``A3"H@(`!HHB`!2:(@`7,$(!`%!```4D`O__BB(`
+M%)HB`!<P0GX```(20J("``>*(@`0FB(`$P`"$\(P0@`/H@(`"(HB`!":(@`3
+M``(6PC!"``>B`@`)BB(`$)HB`!,``A,#,$(``:("``H``!@M`&`0+=^_`!C?
+ML@`0W[$`"-^P```#X``()[T`(">]_V#_OP"8_[X`D/^W`(C_M@"`_[4`>/^T
+M`'#_LP!H_[(`8/^Q`%C_L`!0`("0+0"@\"T`P*`M`."X+:^H`"@`@*@MKZ``
+M0*^@`$2OH`!(E,,``C!B`0`00``#``"P+0@`-I@``Q'#E,(``@`"$<,X0@`!
+M,$(``11``M\D`P`,EH,``C!B`"!00``#EH(``@@`-J,``Q&#``(1@SA"``$P
+M0@`!%$`"U"0#``P"0"`M/`(``"1"````0/@)`H`H+:^B`#000`+,)`,`#"0"
+M``83P@`*+\(`!Q!```8D`@`(+\(``A!``L6/I``H"``VN@`````7P@+`)`,`
+M#!+@`"T"0"`M/`(``"10```"`/@)-`6`3*^B`$0"0"`M`@#X"30%@%"OH@!(
+MCD(!S"Q"``140``&``"(+0)`("T"`/@))`410`@`-MJOH@``/`(``"13````
+M$2B``+V`(22E$4`"8/@)`D`@+:X"```F,0`!+B(`"A1`__@`$2B`CZ,`-)!B
+M``0P0@`"%$``!8^D`#208@`$,$(`_J!B``2/I``TE((``J:"``*0@@`$HH(`
+M!`)`("T\`@``)$(```!`^`DT!8!8%$```Z^B`$PD`@`!KZ(`3`)`("T\$```
+M)A````(`^`DT!8`$KZ(`/#P"`@"/HP`\`&(8)*^C`#P"0"`M`@#X"20%0!"O
+MH@`X/`(`_C1"`&"/I``X`((@)*^D`#@"0"`M`@#X"20%0!2OH@`L`D`@+0(`
+M^`DD!4`8KZ(`,):%``(\`@``)$(```!`^`D"0"`M$$`":"0#``.6@@`",$,!
+M\"0"`,`08@`6*&(`P1!```8D`@%`)`(`H!!B``\D!``#"``W,(Y"`<P08@`%
+M)`(!4!!B``8D`P`""``W,(Y"`<PD`@`!"``W**^B`$"OHP!`"``W+R06``$(
+M`#<NKZ0`0"0"``2OH@!`)!8``HY"`<PL0@`$%$``!`)`("TT!9@`"``W."0&
+M``<T!9@`)`8`1SP"```D0@```$#X"0````".0@',+$(`!!1``$0"0"`MEH,`
+M`C!B`(`00``L``"(+9:B$G`L0C`!%$``*3P"```P8@`@4$``!):Q$VZ6L1-L
+M"``W3Y:S$W"6LQ-R`B`@+3P0```F$````@#X"20%``,`0(@M`F`@+0(`^`DD
+M!0`#`$"8+0`6*(`\`@``)$)%L`"B*"&,HP$L)`+_/P!B&"0`$1&`,$(`P`!B
+M&"6LHP$LC*0!."0"__``@B`D`!$8@C!C``$`$Q!`,$(`#@!B&"4`@R`EK*0!
+M.```B"T\`@``)%!%L#P"```D4P```!$00`!1$"$``AB``'`8(0!6$"$``A"`
+M`%`0(0)`("V,90```F#X"8Q&```F,0`!+B(`'!1`__,`$1!``D`@+3P"``$D
+M0O%\`$#X"0*`*"T``(@M/`(``"10+2@\`@``)%,````1$(``41`A``(8@`!P
+M&"&/I`!``$00(0`"$(``4!`A`D`@+8QE```"8/@)C$8``"8Q``$N(@`C%$#_
+M\@`1$(```(@M/`(``"10-4`\`@``)%,````1$$``41`A``(8@`!P&"$`5A`A
+M``(0@`!0$"$"0"`MC&4```)@^`F,1@``)C$``2XB`$`40/_S`!$00```B"T\
+M`@``)%`OZ#P"```D4P```!$0P`!0$"$2X``%C$4``"2B@``L0A``5$``!R8Q
+M``$`$1#``%`0(0)`("T"8/@)C$8`!"8Q``$N(@"K%$#_\0`1$,".0@',+$(`
+M!!!``!\"0"`M/!$``"8Q```"(/@)-`6`'#P&``\TQO__`$8P)#P"`=``PC`E
+M`D`@+3P0```F$````@#X"30%@!P"0"`M)`4`7`(`^`D``#`M`D`@+30%F'@"
+M`/@))`8`"`)`("T"(/@)-`6`2#1"!``"0"`M-`6`2`(`^`D`0#`M4N``(I*F
+M+"P"0"`M-`6`3#P"```D4````@#X"8^F`$0"0"`M-`6`4`(`^`F/I@!(CD(!
+MS"Q"``040``'``"(+0)`("TD!1%``@#X"8^F```(`#@+DJ8L+#P"```D4```
+M`!$0@"1%$4``71`A`D`@+0(`^`F,1@``)C$``2XB``H40/_X`!$0@)*F+"R2
+MHBPM``(2``#","62HBPN``(4``#","62HBPO``(6``#","4"0"`M/`(``"10
+M```"`/@)-`6``)*F+#$`!C(`DJ(L,`#","6/H@`\`,(P)0)`("T"`/@)-`6`
+M!`)`("T\`@`!)$(/(`!`^`D#P"@M`D`@+3P"```D40```B#X"20%0!"/HP`X
+M`$,0)0)`("TD!4`0`@#X"0!`,"T"0"`M)`5`%`(`^`F/I@`L`D`@+20%0!@"
+M`/@)CZ8`,`)`("TT!8!8`@#X"8^F`$R2IBPRDJ(L,P`"$@``PC`EDJ(L-``"
+M%```PC`EDJ(L-0`"%@``PC`E`D`@+0(`^`DT!8`(DJ8L-P`&,@"2HBPV`,(P
+M)0)`("T"`/@)-`6`#`)`("TT!8`8`@#X"8ZF+M`"0"`M)`4`@`(`^`DD!O__
+MCD,!S"0"``048@`.`D`@+99"`=`L0@`"$$``"SP"```"0"`M`B#X"20%`!0T
+M0@0``D`@+20%`!0"`/@)`$`P+0)`("T\`@``)$(```!`^`D"@"@M$$`!"20#
+M``,D`@`&$\(`&`)`("V.0@($,$(``Q!``!4\`@`!`D`@+3P"```D0@```$#X
+M"30%F40\`]__-&/__P!#$"2.0P($,&,``0`#'T``0Q`E`D`@+0!`,"T\`@``
+M)$(```!`^`DT!9E$`D`@+3P"``$D0O8(`$#X"0*`*"T"0"`M/`(``21"[`P`
+M0/@)CZ4`-!!``.0D`P`#ED,!R#0"\1L48@`,`D`@+9:"``(P0@"`4$``"30%
+MF!P"0"`M-`78"#P"```D0@```$#X"20&!0("0"`M-`68'#P"```D0@```$#X
+M"20&``$"0"`M/`(``"1"````0/@)-`69%#!#/_^6@@`",$(`(!!```L``Q`\
+M``,0@#!"__PT`[HN``,<.#1CBZ,`0P`<```0$@`"$3X(`#C&)$0`9``"$#XT
+M`\S,``,<.#1CS,T`0P`<```0$@`"$/XD1`!D/`(``"1"````0/@)``````)`
+M("T\`@``)$(```!`^`DT!9A@-$(``0)`("T`0#`M/`(``"1"````0/@)-`68
+M8`)`("TT!9A@)`8``3P"```D0@```$#X"0``."T"0"`M/`(``"1"````0/@)
+MCZ4`-%1```F.HBZPEH(``C!"`"`40`"2)`,``Y:"``(T0@`""``Y>::"``(0
+M0``+``"`+0)`("TT!9D@/`8``3P"```D0@```$#X"33&\``D`@`!KJ(NM```
+M@"TD$P`!/`(``"11````$"B`)*40``(3,`0"(/@)`D`@+280``$J`@`*%$#_
+M^0`0*(```(`M/`(``"11```"0"`M`B#X"0(`*"TF$``!*@(`"A1`__L"0"`M
+M)`4`I#P&``$\`@``)%````(`^`DTQ@`!`D`@+20%`*@"`/@))`8``0)`("TD
+M!0"L`@#X"20&``$"0"`M/`(``"11```"(/@))`40L`)`("TD!1"P`@#X"0!`
+M,"T"0"`M)`4`H#P&``@"`/@)-,8)93P"``@T0@EEKJ(L.`)`("T"(/@))`4`
+MK#P#``<`0Q`E`D`@+20%`*P"`/@)`$`P+20"``97P@`-CD(23`)`("T"(/@)
+M)`4`H#1"$``"0"`M)`4`H`(`^`D`0#`MCJ(L.#1"$`"NHBPXCD(23!!```8"
+M0"`M/`(``"1"````0/@)`D`@+0)`("T\`@``)$(```!`^`DT!8`@/`/^?S1C
+M__\`0Q`D`D`@+0!`,"T\`@``)$(```!`^`DT!8`@CJ4NU"0"__\0H@`$/`(`
+M`"1"````0/@)`D`@+8ZE+M@D`O__$*(`!#P"```D0@```$#X"0)`("V.I2[<
+M)`+__Q"B``0\`@``)$(```!`^`D"0"`MCD8!^%#```>N7@'<`D`@+3P"```D
+M0@```$#X"30%@$BN7@'<"``Y?B0"``&/I``HC((``%1```&L@P`````0+=^_
+M`)C?O@"0W[<`B-^V`(#?M0!XW[0`<-^S`&C?L@!@W[$`6-^P`%`#X``()[T`
+MH">]__#_OP``/`(``21"ZP@`0/@))`4``M^_```#X``()[T`$">]__#_OP`(
+M_[````"`@"T``"@M/`(``"1"````0/@))`8``1!```T``!@M`@`@+3P"``$D
+M0NL(`$#X"20%`!,00``&```8+3P"```D0@```$#X"20$"#0D`P`!`&`0+=^_
+M``C?L````^``"">]`!`GO?_@_[\`$/^Q``C_L````("(+3"P__\``"@M/`(`
+M`"1"````0/@))`8``1!``'L``!@M,@,!\"0"`,`08@`K*&(`P1!```@D`@%`
+M)`(`H!!B`!(D`@"P$&(`$0(@("T(`#H?/`(``1!B`#4H8@%!$$``!B0"`5`D
+M`@#0$&(`&P(@("T(`#H?/`(``1!B`"P"("`M"``Z'SP"``$"("`M-`68!#P0
+M```F$````@#X"0``,"T"("`M-`6B``(`^`DD!@`#`B`@+30%F'P"`/@))`8`
+M&3P"```D0@```$#X"20$`2P(`#H>`B`@+0(@("TT!9@$/`(``"10```"`/@)
+M```P+98C`<@D`@`2%&(`*P(@("TT!9A\`@#X"20&`!@\`@``)$(```!`^`DD
+M!`$L`B`@+30%H@`(`#H;)`8``C("`!`00``$`B`@+30%F`0(`#H')`8``S0%
+MF`0``#`M/`(``"1"````0/@)`````)8C`<@D`@`2%&(`$`(@("TT!9A\/!``
+M`"80```"`/@))`8`&#P"```D0@```$#X"20$`2P"("`M-`6B````,"T"`/@)
+M``````(@("T\`@`!)$+K"`!`^`DD!0`3$$``$P``&"T\`@``)$(```!`^`DD
+M!`@T`B`@+0``*"T\`@``)$(```!`^`DD!@`!$$``!P``&"T"("`M/`(``21"
+MZP@`0/@)```H+0!`&"T`8!`MW[\`$-^Q``C?L````^``"">]`"`GO?^P_[\`
+M2/^^`$#_MP`X_[8`,/^U`"C_M``@_[,`&/^R`!#_L0`(_[````"`B"T`H)@M
+M`,"X+3P"```D0@```$#X"0"`H"T`0)`M$D``9@``$"V.(BZT$$``-P(@("T\
+M`@``)%4```*@^`DT!9D@/`,``0!#$"040``O`B`@+:X@+K0"H/@)-`6<$`!`
+ML"T"("`M`J#X"30%G!0`0(`M`B`@+0*@^`DT!9P8`$`8+0`6($(`$!!"`((@
+M(0`$$<(`0"`M$$``&P`0*8)0H``:`B`@+0`#\",#P@`:```0$E"```$`!P`-
+M,%X`/P+%`!H``(`24*```0`'``TR$``?`B`@+0*@^`DT!9D@`!X90`!#$"4`
+M4!`E-$((``(@("T`0#`M/`(``"1"````0/@)-`69(`(@("T\`@`!)$+O-`!`
+M^`D"0"@M5$``"`(@("V68@`"-$(``J9B``*60@`",$+__0@`.JVF0@`"/`(`
+M`"10```"`/@)`D`H+11``!,\`@`!/`(``"1"````0/@))`03B`(@("T"`/@)
+M`D`H+11```H\`@`!EF(``C!"`"!40``-```0+99B``(T0@`"IF(``@@`.K8`
+M`!`M)$(+Q`!`^`D"("`MCH(NM"Q"``&NX@``)`(``=^_`$C?O@!`W[<`.-^V
+M`##?M0`HW[0`(-^S`!C?L@`0W[$`"-^P```#X``()[T`4">]_\#_OP`P_[,`
+M*/^R`"#_L0`8_[``$`"`B"T`H(`M%*```@"@$"TD`O__KZ(```(@("T\`@``
+M)$(```!`^`DD!0`,`B`@+20%0``\`@``)%,```)@^`D"`#`M/`(``"1"````
+M0/@))`0`#S(0``./H@``,$(``Z^B```"("`M)`5``(^F```\`@``)$(```!`
+M^`D"`#@M`$"0+3("``$40``1`D`0+20"`!6OH@``DZ8``).B``$``A(``,(P
+M)9.B``(``A0``,(P)9.B``,``A8``,(P)0(@("T"8/@))`4`%`)`$"W?OP`P
+MW[,`*-^R`"#?L0`8W[``$`/@``@GO0!`)[W_T/^_`"C_M``@_[,`&/^R`!#_
+ML0`(_[````"`H"T`H)@ME*4``#P"```D0@```$#X"99F``(``A0```(D`Y9B
+M``(P0@"`$$``$@``D"T`!(!``@2`(0`0@(`\`@``)$(Y)`("@"&.!``$/`(`
+M`"1"````0/@))`4`"#!2`/\`$I%`C@(````"$0`"0I`EA@0`""B"`)%00``$
+M)(3_Z#""``$00``()(3_Z#P"```D0@```$#X"20%``@P40#_"``[/B0"``$`
+M!!?"`((@(0`$($,\`@``)$(```!`^`DD!0`(,%$`_P``$"T`$8B```(00`(B
+MB"4V,00!,D8`_P`&,@`R(@#_`,(P)0*`("T\$```)A````(`^`DT!9B<`!&*
+M`C)&_P`R(@#_`,(P)0*`("T"`/@)-`68T*Z3$C0D`@`!W[\`*-^T`"#?LP`8
+MW[(`$-^Q``C?L````^``"">]`#`GO?_P_[\``#P"```D0@```$#X"30%F&0`
+M`AS",&,!_S!B`0`00``$`&`0+3AB`?\``A@G`&`0+=^_```#X``()[T`$">]
+M_]#_OP`H_[0`(/^S`!C_L@`0_[$`"/^P````@)`M,+,`_P`&A```$(0#/!$`
+M`"8Q```"(/@)-`689"0#\```0Q`D`!,:0#!C#@``0Q`E,A`!_P!0$"4"0"`M
+M-`689#P0```F$````@#X"0!`,"T"0"`M`B#X"30%F&`T0@`"`D`@+30%F&`"
+M`/@)`$`P+1)@``0D%``X`!,0P`!3$",``J)```"`+3P"```D4P``/`(``"11
+M```"0"`M`F#X"30%F&`P0@`"$$``""H"`#P"(/@)`H`@+280``$J`@`\5$#_
+M]@)`("TJ`@`\$$``!@``&"T\`@`!)$+M<`!`^`D"0"`M`$`8+0!@$"W?OP`H
+MW[0`(-^S`!C?L@`0W[$`"-^P```#X``()[T`,)2B``(P0P'@)`(`P%!B``R4
+M@A+0*&(`P1!```8D`@%`)`(`H%!B``:4@A+.`^``"```$"U48@`%```0+92"
+M$LRDP@```^``""0"``$#X``(`````">]_]#_OP`@_[$`&/^P`!``@(@M`*"`
+M+3P"``$D0N[@`$#X"0.@,"T00``6```8+0(@("T\`@``)$(```!`^`DT!9A@
+M/`(``21"[7``0/@)`B`@+0!`&"V'H@```$,0*E!```6F`P`6E@(``C1"``*F
+M`@`"I@,`%H>B````0Q`J.$,``0!@$"W?OP`@W[$`&-^P`!`#X``()[T`,">]
+M_\#_OP`X_[0`,/^S`"C_L@`@_[$`&/^P`!``@(`MC((!S"Q"``000``D`*"0
+M+3P"```D0@```$#X"0`````00``?`@`@+0)`*"T\`@`!)$+NX`!`^`D#H#`M
+M$$``)```&"T``(@M/`(``"14.F@\`@`!)%/MM`(T$"&010```@`@+0)@^`D`
+M`#`M`$`8+8>B````0Q`J4$```J9#`!:F0``6)C$``2XB``,00``0+B,`!`@`
+M/!,"-!`A`@`@+3P"```D0@```$#X"30%F&`T0@`"`@`@+0!`,"T\`@``)$(`
+M``!`^`DT!9A@)`,``0!@$"W?OP`XW[0`,-^S`"C?L@`@W[$`&-^P`!`#X``(
+M)[T`0```("V4HP``/`(``)1".G``0Q`K%$``"@!@*"T\`@``)$,Z<"2$``$`
+M!!"``$,0(91"````11`K4$#_^R2$``$`!!B`/`(``"1".G``8A@AE&4``@`%
+M+```!20#``00N`!$$"T``ADX`$,0+0`"&C@`0Q`M``(<.`!#$"T`1!`M``(0
+M/P`%+\,`11`C``(4``/@``@``A0#)[W_H/^_`%C_O@!0_[<`2/^V`$#_M0`X
+M_[0`,/^S`"C_L@`@_[$`&/^P`!``@/`ME*(``C!"`(`L4P`!)`(``@!3F".4
+MH@`",$,!X"0"`,`08@!2`("@+2AB`,$00``&)`(!0"0"`*!08@!'E)839`@`
+M/2,``!`M%&(`I0``$"V4H@``)$+P7S!"__\L0@3K4$``!)2B``"4EA-4"``\
+MEY2"$U8D0NMT,$+__RQ"`/!00``$E*(``)26$U@(`#R>E(036B1"ZH0P0O__
+M+$(`X5!```64H@``E)837)2"$UX(`#RAKZ(`!"Q"%EU40``%KZ``!)26$V"4
+MA!-B"``\H:^D``0``+`MEI42V):"$MZOH@``+%<``0`3((`\`@``)$)'``""
+M("&,@P`\/`+O_S1"__\`8A@DEH(3S``"%P``8A@EK(,`/(R#`$@\`OO_-$+_
+M_P!B&"26@A/.``(6@`!B&"6L@P!(C(,`_"0"__<`8A@DEH(3R@`"$,``8A@E
+M"``\S:R#`/R4A!-FKZ0`!)?5$MH(`#S+E\(2X)26$VB4A!-JKZ0`!)?5$MR7
+MPA+BKZ(``"Q7``$`$XB`/`(``"1"1P`"(H@ACC``A"0"_S\"`H`D`J`@+3P2
+M```F4@```D#X"20%``0``A'``!<9@`!#$"4P0@#``@*`):XP`(2.,`"0)`+_
+M^`("@"0"H"`M`D#X"20%``0``A!",$(`!P("@"6N,`"0)`+_?P("@"0"P"`M
+M`D#X"20%``,``A'`,$(`@`("@"6N,`"0CC``G"0"__P"`H`D`L`@+0)`^`DD
+M!0`#``(00C!"``,"`H`EKC``G"0"_^,"`H`DCZ0`!`)`^`DD!0`#``(0@#!"
+M`!P"`H`EKC``G(XC`,PD`O_W`&(8)(^D````!!#`,$(`"`!B&"6N(P#,``"`
+M+3P"```D44<`/`(``"12````$!!``%`0(0`"&(``<1@A`%,0(0`"$(``41`A
+M`\`@+8QE```"0/@)C$8``"80``$N`@`9%$#_\P`0$$"N@"[`)`(``=^_`%C?
+MO@!0W[<`2-^V`$#?M0`XW[0`,-^S`"C?L@`@W[$`&-^P`!`#X``()[T`8">]
+M_^#_OP`8_[(`$/^Q``C_L````("0+0"`."V4P@`",$0!X"0"`,`0@@`.*((`
+MP1!```8D`@%`)`(`H!""``<``!`M"``]?=^_`!@0@@`&```8+0@`/7P``!`M
+M"``]220#``$D`P`"``,80`!G&"&49A+JE&(2\``"$8``PC`EE&(2]@`"$P``
+MPC`EE&(2_``"%(``PC`EE&(3`@`"%@``PC`EE'$3")1B$PX``A&``B*()91B
+M$Q0``A,``B*()91B$QH``A2``B*()91B$R```A8``B*()20"``%0H@`*`,"(
+M+5"@``FLY2ZL)`(``A2B``,``!`M"``]<0(@,"T(`#U]W[\`&*SE+JP"0"`M
+M/!```"80```"`/@)-`698`)`("TT!9ED`@#X"0(@,"TD`@`!W[\`&-^R`!#?
+ML0`(W[````/@``@GO0`@)[W_L/^_`$#_MP`X_[8`,/^U`"C_M``@_[,`&/^R
+M`!#_L0`(_[````"`H"T`H+`ME*(``C!#`>`D`@#`$&(`(`"`J"TH8@#!$$``
+M!B0"`4`D`@"@$&(`&```$"T(`#YIW[\`0%1B`,P``!`M``"X+3P"```D0@``
+M`$#X"30%F40D`__'`$,0)):#$]```QC`,&,`.`!#$"4"@"`M`$`P+3P"```D
+M0@```$#X"30%F40(`#VTCH(!S`@`/;,D%P`!)!<``HZ"`<PL0@`$$$``#@*`
+M("T\`@``)$(```!`^`DT!9D0-$(``P*`("T`0#`M/`(``"1"````0/@)-`69
+M$`@`/>,"@"`M/`(``"1"````0/@)-`69$"0#_`8`0Q`D`!>(0`(UB"&6(Q+D
+M``,9``!#$"4T0@`!`H`@+30%F1`\$```)A````(`^`D`0#`M`H`@+8ZE+JP\
+M`@``)$(```!`^`D"P#`MEB82S##&`?\TQ@(``H`@+0(`^`DT!9EH`H`@+3P2
+M```F4@```D#X"30%F$0D`\!_`$,0)``7@$`"%8`AE@,2H@`#&<`P8S^``$,0
+M)0*`("TT!9A$/!$``"8Q```"(/@)`$`P+0*`("T"0/@)-`682#P#__PT8P__
+M`$,0)"83$JB6!!*H``0C`#P#``,T8_```(,@)`!$$"4"@"`M-`682`(@^`D`
+M0#`M`H`@+0)`^`DT!9A0/`/__P!#$"0"]2`AD(,2R0`#&@``0Q`ED(,2Q@!#
+M$"4"@"`M-`684`(@^`D`0#`ME@(2N@`"-@```A0``,(P)98#$L```Q(``,(P
+M)0##,"4"@"`M`B#X"30%F#0"@"`M`D#X"30%F"@\`___-&,`_P!#$"268P`&
+M``,:``!#$"4"@"`M-`68*`(@^`D`0#`M`H`@+0)`^`DT!9AD/`/_^#1C#_\`
+M0Q`DE@02M``$(P`\`P`'-&/P``"#("0`1!`E`H`@+30%F&0"(/@)`$`P+9:B
+M$G`L0C`#$$``"R00``*6@P'*)`(0(A1B`!0"@"`MEL(``C!"`$!40``0)!``
+M"`@`/ED\`@``EL(``#!"`!\00``*`H`@+21"__8L0@`-%$``!SP"````%Q!`
+M`%40(91"$R8"`H`A`H`@+3P"```D0@```$#X"30%F20D`_\!`$,0)``0&$`P
+M8P#W`$,0)0*`("T`0#`M/`(``"1"````0/@)-`69)"0"``'?OP!`W[<`.-^V
+M`##?M0`HW[0`(-^S`!C?L@`0W[$`"-^P```#X``()[T`4">]__#_OP```*`P
+M+2RB`$`40``"`*`8+20#`#^D@P'\/`(``"1"````0/@)-`69/"0"``'?OP``
+M`^``"">]`!`GO?_`_[\`./^T`##_LP`H_[(`(/^Q`!C_L``0`("(+0"@D"V4
+MH@`",$,!X"0"`,`08@`4`("`+2AB`,$00``&)`(!0"0"`*`08@`7```0+0@`
+M/M[?OP`X%&(`0P``$"V4@A/FIZ(`!"2"$]*OH@``)((3Z*^B``B4E!=*"``^
+MN223%TR4@A7PIZ(`!"2"%?*OH@``)((6$J^B``B4E!><"``^N223%YZ4@A7P
+MIZ(`!"2"%?BOH@``)((6KJ^B``B4E!>\"``^N223%[X"`A`A"``^U21%%]26
+M1@```B`@+3P"``$D0ON4`$#X"0.@*"T"("`M/`(``"1"````0/@)`D`H+0!`
+M,"T``!@ME@(3=!!```T``"@M`$`@+0`#$$``4!`AE$(3=E!```0D8P`!$$;_
+MY@`#$8`D8P`!`&00*A1`__<``Q!`,H?__P(@("T"8#`M/`(``21"`!0`0/@)
+M`D!`+20"``'?OP`XW[0`,-^S`"C?L@`@W[$`&-^P`!`#X``()[T`0">]_Z#_
+MOP!8_[X`4/^W`$C_M@!`_[4`./^T`##_LP`H_[(`(/^Q`!C_L``0KZ0```"@
+ML"TPU?__KZ``!"0>`#\\!```)(0``#P0```F$````@#X"20%`0@\!```)(0!
+M"`(`^`DD!0"`/`(``"17``@F\P"`)!$``0``D"T`$A!``%<0(:11```F(@`!
+M,%'__R9"``$P4O__+B(`0!1`__@`$A!`/`(``"1"``"D4@`&)`,``:1#``(D
+M`P`_I$,`!#)"__\00``3``"0+3P"``$D5`98/`(``"11````$A!``%.`(0!7
+M$"&410```J`@+0*`^`D"P#`MI@(``"9"``$P4O__EB(`!@)"$"L40/_T`!(0
+M0(9F```\`@``E$,`!@`#$$``4Q`AA$?__A!@`!X``)`M/`(``"1(````$A!`
+M`%,0(81#````PQ`J5$``!)4"``8`8#`MK[(`!)4"``8`4A`C)$+__S!1__\2
+M(``.`!$00`!3("&$@__^A((```!#$"H00``"E(4``*2%__XF0@`!,%+__Y4"
+M``8"0A`K%$#_YP`2$$`\`@``E$(`!A!```\``)`M/`(``)1$``8`$A!``%,0
+M(81#````XQ`J$$```R9"``$`8#@M`D#P+3!2__\"1!`K%$#_]@`2$$`DPP`9
+M/`11ZS2$A1\`9``<```0$@`"$#\``A$#``,?PP!#$",``AA``&(8(0`#&,``
+M8A@A``,<0``#A`,``)`M`@`0+0!$`!P``!`2``(0/P`"$0,``Q_#`$,0(R1"
+M``$80``5``"(+3P"```D10$(```0$@`"$#\``A$#`!`?PP!#$",D1``!`D`0
+M+29#``$P<O__``(00`!%$"&/HP`$I$,``"8B``$P4?__`B00*A1`__8"0!`M
+M/`(``)1"``8``A!``%,0(81"__X"`A`J$$``/0``B"T\`@``)%0``#P"``$D
+M5@A\/`(``"15`0@F`@`R``(4```"A`.6@@`&``(00`!3$"&$0O_^"``_IP("
+M("HP4?__$(``"@`1$$``4Q`AA$,```(#&".$0@`"`@(0(P!B`!@``!@2'&#_
+M]28B``$R!/__`!$00`!3&"&490``E&8``@!7$"&41P````<X0##G__^42``"
+M``A`0#$(__\"P/@)``!(+21"``$P0O__`!(80`!U&"$``A!"I&(``#!"__\#
+MPA`K5$```:1^```F0@`!,%+__Y:"``8``A!``%,0(81"__X"`A`J%$#_S"8"
+M`#(N0@!`$$``"SP"```D1`$(`!(00`!$$"&40__^I$,``"9"``$P4O__+D(`
+M0!1`__D`$A!`-!"A@```B"T\`@``)%,!"#P"```D4@```!$0@`!3$"&41@`"
+M``8R`#3&`/\`!C0`E$(````"$@`T0@#_,$+__P#","6/I````D#X"0(`*"TF
+M(@`!,%'__RXB`"`40/_N)A``!-^_`%C?O@!0W[<`2-^V`$#?M0`XW[0`,-^S
+M`"C?L@`@W[$`&-^P`!`#X``()[T`8">]_W#_OP"(_[X`@/^W`'C_M@!P_[4`
+M:/^T`&#_LP!8_[(`4/^Q`$C_L`!``(#P+0"@J"T`P)`M`0"(+3#S__^OI``8
+MKZ``'*^@`""OH``D)`(`/Z^B`"BOH``P/`(``"16`8B!`@`%``(00#!"__^O
+MH@`LE0(``C!"`0`00``%``"X+0@`0"R`AA*."`!`D*^P`"2/HP`8@&82CP/`
+M("T\`@``)$(```!`^`D"("@M``(6```"%@,2H``SKZ(`-```@"T`$!#``%48
+M(91B```00``)`!`00`!=$"&48P``I$,`""8"``$P4/__+@(`"!1`__4`$!#`
+M`@"@+98D```GI0`(`@`P+0.@."T\`@`!)$()>`!`^`DGJ``"$H``"P``@"V7
+MHP```!`00`!=$"&40@`($&(`!28"``$P4/__`A00*Q1`__D`$!!`EZ,``)>B
+M``(48@`$`!`0P)8B```08@`%`!`0P`!5$"&,0@`$$$``!0``````$!#``%40
+M(91"``*OH@`H$F``#@``@"T`$!A``'T8(0`0$(``4!`A``(00`!2$"&40@`(
+MI&(`""8"``$P4/__`A,0*Q1`__4`$!A`EB0``">E``@"8#`M`Z`X+3P"``$D
+M0@EX`$#X"2>H``(28``1``"`+9>D``"7HP`"`!`00`!=$"&40@`(4((``:^P
+M`!P`$!!``%T0(91"``@08O^=)@(``3!0__\"$Q`K%$#_]``0$$```(`MEB(`
+M`C!"`$`00``V+@(`""X"``500``,)`(`!8^E`!P`!1"``$40(0`"$$``4A`A
+ME$(`!J^B`""/I@`D``80@`@`0-T`1A`A5@(`#"0"``:/HP`<``,0@`!#$"$`
+M`A!``%(0(91"``2OH@`@CZ4`)``%$(`(`$#K`$40(58"``PD`@`'CZ8`'``&
+M$(``1A`A``(00`!2$"&40@`"KZ(`((^C`"0``Q"`"`!`^0!#$"%6`@!-EB0`
+M`(^E`!P`!1"``$40(0`"$$``4A`AE$(``*^B`""/I@`D``80@`@`00<`1A`A
+M4$``0)8D````$!"`/`,``"1C.J0`0Q`AC$(```!```@`````CZ,`'``#$(``
+M0Q`A``(00`!2$"&40@`&KZ(`((^E`"0`!1"``$40(0`"$$``4A`A"`!!"I17
+M``:/I@`<``80@`!&$"$``A!``%(0(91"``2OH@`@CZ,`)``#$(``0Q`A``(0
+M0`!2$"$(`$$*E%<`!(^E`!P`!1"``$40(0`"$$``4A`AE$(``J^B`""/I@`D
+M``80@`!&$"$``A!``%(0(0@`00J45P`"CZ,`'``#$(``0Q`A``(00`!2$"&4
+M0@``KZ(`((^E`"0`!1"``$40(0`"$$``4A`AE%<``)8D``"7I0``EZ8``H^G
+M`"`"X$`M/`(``21""'P`0/@)``!(+0!`("V/I@`H`$80*Q!```(`P!@M`(`8
+M+98B``(P0@`0$$``##!D__^/HP`8E&(2<"Q",`$40``(`!`00)1C$GXP8O__
+M`((0*U1```$`@!@M,&3__P`0$$``5B@ACZ8`+(^B`#0`PA@C`(,0*E1```$`
+M@!@M%@``$*2C``"/PP(```,80#P"```D0CJ8`&(8(91C`````QA`EL(```!#
+M$",``A0```(4`QQ```.OH@`P)`,``:^C`#``$!!``%8H(92D``"/HP`P`(,0
+M*E1```$`@!@M)@(``3!0__\N`@`(%$#_1:2C``"6P@``CZ4`&*RB+L0``#`M
+M,-$``0`1AX"6Q@`&,,8`/P`&-@`"!C`E`!&E@`#4,"66P@`$,$(`/P`"%```
+MPC`E`!&;@`#3,"66P@`",$(`/P`"$@``PC`E`!&)@`#1,"66P@``,$(`/P#"
+M,"4#P"`M/!(``"92```"0/@)-`69-);"``XP0@`_``(6``("@"4"%(`EEL(`
+M##!"`#\``A0``@*`)0(3@"66P@`*,$(`/P`"$@`"`H`E`A&`)9;"``@P0@`_
+M`@*`)0/`("TT!9DX`D#X"0(`,"V6Q0``/`(``"1"````0/@)`\`@+9;"``"G
+MP@'^W[\`B-^^`(#?MP!XW[8`<-^U`&C?M`!@W[,`6-^R`%#?L0!(W[``0`/@
+M``@GO0"0)[W_D/^_`&#_MP!8_[8`4/^U`$C_M`!`_[,`./^R`##_L0`H_[``
+M(`#`J"TPE___,+;__P+@("T"P"@M/`(``21"!_``0/@)`Z`X+11``$>7H@``
+MEJ8`!`+@("V.I0``)Z<``CP"``$D0@EX`$#X"2>H``27I0`"`L`@+0*@,"TG
+MIP`&/!```280"IP"`/@))Z@`")>E``0"P"`M`J`P+2>G``H"`/@))Z@`#)>D
+M``*7I0`&)[,`#@*@,"T\$``!)A`'\`(`^`D"8#@MEZ0``I>E``@GL@`0`J`P
+M+0(`^`D"0#@MEZ4`!I>F``B7IP`.EZ@`$`+`("T\$0`!)C$(?`(@^`D``$@M
+M`$"@+9>D``27I0`*`J`P+0(`^`D"8#@MEZ0`!)>E``P"H#`M`@#X"0)`."V7
+MI0`*EZ8`#)>G``Z7J``0`L`@+0(@^`D``$@MEZ4``I>F``0"X"`M`H`X+0!`
+M0"T"(/@)``!(+=^_`&#?MP!8W[8`4-^U`$C?M`!`W[,`.-^R`##?L0`HW[``
+M(`/@``@GO0!P,(3__S"E__^,R``(E,(`!!!``!P``%`ME0(``!1$`!0E0@`!
+M)0,`")4"``800``/``!(+91B``!410`')2(``0`)$$``2!`AE$(`'J3B```#
+MX``()`(``3!)__^5`@`&`2(0*Q1`__,D8P`")4(``3!*__^4P@`$`4(0*Q1`
+M_^8E"``T`^``"```$"TP@___,*7__S#&__\PZO__,0C__R0+`&0!2``8```0
+M$A!``#0``#@M52```20+``$0Q0`G`&48(P`#$$``0Q`A``(0P`!#$"$``A"`
+M`,48(P!#`!H``!`24&```0`'``T``A0```(D`P2!``,H@@!E"`!"5#%'__\4
+M0``(`(@`&!$@`!PQ!___``@00`!($"$``A#`"`!"6@!($"$``!`2)`,`9`!D
+M&",`:@`8```8$@!#$"$``````$L`&@``$!)18``!``<`#0@`0EPP1___`4`X
+M+1$@``<```````H00`!*$"$``A#``$H0(0`"$(`P1___`^``"`#@$"TPQO__
+M``800`!%$"&42?_^,(3__P`$$$``1!`A``(0P`!$$"$``B"`E*,````#$$``
+M0Q`A``(0P`!#$"$``A"`)$+_]@""$"M00``%``D00)2B``"DX@``"`!"@Y2B
+M````21`A``(0P`!)$"$``A"`)$(`"@!$$"L00``,`````*3I```#X``(I0D`
+M`*3B``"5(@```^``"*4"``"5(@``I.(```@`0H.5(@`"$,``&P``4"T`"A!`
+M`$5((94C`````Q!``$,0(0`"$,``0Q`A``(0@`!$$",D0@`)+$(`$U1`_^J5
+M(@``E2,``@`#$$``0Q`A``(0P`!#$"$``A"`)$+_]@""$"L40/_D)4H``0%&
+M$"H40/_H``H00`/@``@`````)[W_\/^_```PA/__,*7__XS#``B4P@`$`$!(
+M+1!```<``#`ME&(``!!%``0DQ@`!`,D0*A1`__LD8P`T)&4`"#P"``$D0@EX
+M`$#X"91F``;?OP```^``"">]`!`DABP0/`4``"2E.LB,HP`$K(,L$``#$,``
+M0Q`C``(0@"2E``@`11`AK,(`&"0"``&LP@`4)`(`%*S"``PD`@`C`^``"*S"
+M`!",@A(TE$(``C!"`"`00``'``!`+20&`!PD!`!`)`<`<JR@``P(`$+A)`(`
+M=R0&`#(``"`M)`<`,B0"`!2LH@`,)`(`(ZRB`!",I0`$`*@0*Q1```0``!@M
+M`,40*Q!```<``````*00*U1```0D`P`!`.40*U1```$D`P`!`^``"`!@$"TG
+MO?_P_[\`"/^P````@(`MC(8NQ``&,D`PQGX`-,:``#P"```D0@```$#X"30%
+MF3`D`@`!K@(NP-^_``C?L````^``"">]`!`GO?_@_[\`&/^R`!#_L0`(_[``
+M``"`@"TDD2P0CB(`%!!``"P``!@MC(,NP"0"``%48@`HC@,NP#P"```D0@``
+M`$#X"30%F3``0!@M,$*``%1``"".`R[```,60JXB``2N`"[``@`@+3P"``$D
+M0@M``$#X"0(@*"U40``6C@,NP`(`("T\`@`!)$(,_`!`^`D"("@M4$``#XX#
+M+L`"`"`M/`(``21"#2P`0/@)`B`H+1A```<"`"`M/`(``21"#MP`0/@)`B`H
+M+20"``*N`B[`C@,NP`!@$"W?OP`8W[(`$-^Q``C?L````^``"">]`"",HP`$
+MC*(`#`!#$"L00``%```@+8RB`!``8A`K%$```@`````D!``!`^``"`"`$"V,
+MH@`4$$``:"0&__^,I`````00P`!$$",``A"`/`,``"1C.M``0Q`AK*(`&(RB
+M``2,HP`0`$,0*U1``">,HP`$$(``60````",H@`$K*(`"(RC`!``0Q`K%$``
+M'0!@."V,H@``$$``4"0&``$\`@``)$DZR#P"```D2#K0C*(``"1&__^LI@``
+M``8@P`"&(",`!""``(D0(8RC`!B,0@`0C&,`"`!#$",``A!`C*,`"`!B&".L
+MHP`(`(@@(0!G&"L48``#K*0`&%3`_^V,H@``"`!#M20&``&,H@`,`$,0*Q1`
+M`#$``#`M/`(``(Q".L@D0O__C*,``!!B`"LD!O_^C*,`!*RC``B,H@`,`$!`
+M+0!#$"L40``D)`8``CP"``",0SK()&/__XRB````0"`M`$,0*Q!``!P`````
+M/`(``"1*.L@\`@``)$DZT`!@."TDA@`!K*8````&(,``AB`C``0@@`"*$"&,
+MHP`8C$(`$(QC``@`0Q`C``(00(RC``@`8A@CK*,`"`")("$!`Q@K%&``!*RD
+M`!@`QQ`K%$#_[`#`("TD!@`"`^``"`#`$"V,H@`4$$``#0````",H@`8E$(`
+M`*2"$]",H@`8E$(``J2"$\Z,H@`8E$(`!*2"$\R,H@`8E$(`!J2"$\H#X``(
+M`````">]_^#_OP`8_[(`$/^Q``C_L````("0+0"@@"T`@(@M/`(``"1"````
+M0/@)-`6`!#!#__\D`@`!$@(`%2H"``)00``%)`(`!A(```W?OP`8"`!#]]^R
+M`!!2`@`&CD8NR"0"``@2`@`*W[\`&`@`0_??L@`0`&8P)0@`0^\\`@"!CD8N
+MR`!F,"4(`$/O/`(`0HXF+L@`9C`E/`(`(`#","4"0"`M/`(``"1"````0/@)
+M-`6`!-^_`!C?L@`0W[$`"-^P```#X``()[T`(">]__#_OP``/`(``21"#R``
+M0/@)C(4!W-^_```#X``()[T`$">]_^#_OP`8_[(`$/^Q``C_L````("(+3P"
+M```D0@```$#X"0"@@"T`0)`M/`5__S2E__\`12@D/`(``"1"````0/@)`B`@
+M+0(@("T\`@``)$(```!`^`DD!0`P`$`@+3!#`_`2```&``,9`B0"`"4`0Q`C
+M``(00@@`1"X`8A@A+&(``A!```@D8___`B`@+3P"```D0@```$#X"0)`*"T(
+M`$0^```0+20&_`\`AC`D``,1`#!"`_``PC`E`B`@+3P"```D0@```$#X"20%
+M`#`"("`M/`(``"1"````0/@)`D`H+20"``'?OP`8W[(`$-^Q``C?L````^``
+M"">]`"`GO?_P_[\```"@&"THH@`*$$``"@``*"T``RD``*,H(P`%*(``A2@A
+M/`(``"1"````0/@))*4L4`!`*"T`H!`MW[\```/@``@GO0`0)[W_\/^_````
+MP$`M**(`"A!```L``!@M``4Q``#%,",`!C"``(8P(23&+%`\`@``)$(```!`
+M^`D!`"@M`$`8+0!@$"W?OP```^``"">]`!`GO?_0_[\`*/^T`"#_LP`8_[(`
+M$/^Q``C_L````("0+0"@B"TD`@`"$*(`#0#`H"TLH@`#$$``!B0"``,D`@`!
+M$*(`"P``F"T(`$2N)`/__Q"B``4D`___"`!$KP!@$"T(`$2,)!,`"0@`1(PD
+M$P`(C((L5!1``"4``!@M"`!$C0`3$0``$Q$``%,0(P`"$(``@H`A)A`L4(X"
+M``040``;)`/__P(`("T\`@``)$(```!`^`DD!0`\%H``#:X1``0D`@`+K@(`
+M#"0"``*N`@`4)`+__ZX"`!@D`@/_K@(`'"0"``JF`@`@"`!$K:8"`"("0"`M
+M`F`H+3P"```D0@```$#X"0*`,"T"8!@M`&`0+=^_`"C?M``@W[,`&-^R`!#?
+ML0`(W[````/@``@GO0`P)[W_X/^_`!C_L@`0_[$`"/^P````@(`MC(8L/##&
+M`_^,@BQ$``(4`#P2`_\`4A`D`,(P)3P1```F,0```B#X"20%`*2.!BQ`,,8#
+M_XX"+$@``A0``%(0)`#","4"`"`M`B#X"20%`*@"`"`M/`(``"1"````0/@)
+M)`4`K"0#_```0Q`DC@,L3#!C`_\`0Q`E`@`@+20%`*P"(/@)`$`P+=^_`!C?
+ML@`0W[$`"-^P```#X``()[T`(">]__#_OP``+*(`"A!``"$``!@M``41``!%
+M$",``A"``((X(23G+%",X@`$$$``&@!@$"VLX``$)`,``0"C&`0``Q@GC((L
+M/`!B$"2L@BP\C((L0`!B$"2L@BQ`C((L1`!B$"2L@BQ$C((L2`!B$"2L@BQ(
+MC((L3`!B&"2L@RQ,/`(``21"$MP`0/@)`.`H+20#``$`8!`MW[\```/@``@G
+MO0`0)[W_P/^_`##_M0`H_[0`(/^S`!C_L@`0_[$`"/^P````@)@M`*"@+0"`
+MJ"V,A!(T+*(`"A!``5P``!@M``41``!%$",``A"``F*0(292+%".0@`$$$`!
+M5"0#``&.0P`8)`+__U1B`!..1@`8$(``!20#`*"4@@`",$(`H!!#``(D!``?
+M)`0`#R0&``$`Q!`K$$``"0`4@(``!A!`-$8``0#$$"L40/_]``800`@`13P`
+M%("``!2`@"8%$$`PQ@/_CD,`'``#&H`\`@`/-$+\``!B&"0`PS`ECD(`%``"
+M%0`\`P_P`$,0)`#","4\`@``)%$```(@^`D"8"`M)@40@)9&`"(`!C$`,,8`
+M\)9"`"`P0@`/`,(P)3P"``@T0B```,(P)0(@^`D"8"`M)@4)P`)@("T"(/@)
+M)`8(`(YB`<PL0@`$4$``!HY"`"0F!1$``F`@+0(@^`D\!@$`CD(`)%!``!Z.
+M0@`P`!2`@"8%",`\!@#_-,;__P!&,"2.0@`H``(6``#","4\`@``)$(```!`
+M^`D"8"`M)A`)P`)@("T\`@``)$(```!`^`D"`"@M-$8``8Y"`"A40``!-,8!
+M```4*(`DI0G`/`(``"1"````0/@)`F`@+8Y"`#!00``-CD(`+``4*(`DI0D`
+M/`8`_S3&__\`1C`D/`(!``#","4\`@``)$(```!`^`D"8"`MCD(`+%!``!R.
+M0@`,`!2`@"8%$,`\!@`/-,;__P!&,"0\`@`0`,(P)3P"```D40```B#X"0)@
+M("V.0@`,,$(`(%!```V.0@`,)A`)P`)@("T\`@``)$(```!`^`D"`"@M-$("
+M``)@("T"`"@M`B#X"0!`,"V.0@`,/`,``0!#$"100``1CD(`#``4@(`F$!$`
+M`F`@+3P"```D0@```$#X"0(`*"T\`P`@`$,0)0)@("T`0#`M/`(``"1"````
+M0/@)`@`H+8Y"``P\`P"``$,0)%!``!".0P`$`!2`@"80$0`"8"`M/`(``"1"
+M````0/@)`@`H+31"`@`"8"`M`$`P+3P"```D0@```$#X"0(`*"V.0P`$)`(`
+M`A!B``4D`@`#4&(`&0`4B(`(`$8?CD(`.``4@(`F$`G``F`@+3P"```D0@``
+M`$#X"0(`*"TT0@"B`F`@+0!`,"T\`@``)$(```!`^`D"`"@MCF(!S"Q"``00
+M0``"/`,`)3P#`24`%"B`"`!&&22E$0`F,`G``F`@+3P"```D0@```$#X"0(`
+M*"TT0@)B`F`@+0(`*"T\$```)A````(`^`D`0#`M/`(``(Q#```\`@``C$(`
+M``!B&"..HB[,`$,8(SP"``",0@```&(8(P`#&H`F,0D`/`8!``!F,"4"8"`M
+M`@#X"0(@*"V.8@',+$(`!!!```(\`P`$/`,!!``4*(`DI0G``F`@+3P"```D
+M0@```$#X"0!@,"V.0@`X,$(``5!``!&.0@`,`!2`@"80$0`"8"`M/`(``"1"
+M````0/@)`@`H+3P#`"0`0Q`E`F`@+0!`,"T\`@``)$(```!`^`D"`"@MCD(`
+M##!"``$00``%)`(``0*"$`2.HRP\"`!&/0!#$"4"@A`$``(0)XZC+#P`0Q`D
+MKJ(L/(Y"``PP0@`!$$``!20"``$"@A`$CJ,L0`@`1DH`0Q`E`H(0!``"$">.
+MHRQ``$,0)*ZB+$".0@`,,$(``A!```4D`@`!`H(0!(ZC+$0(`$97`$,0)0*"
+M$`0``A`GCJ,L1`!#$"2NHBQ$CD(`##!"``000``%)`(``0*"$`2.HRQ("`!&
+M9`!#$"4"@A`$``(0)XZC+$@`0Q`DKJ(L2(Y"``PP0@`($$``!20"``$"@A`$
+MCJ,L3`@`1G$`0Q`E`H(0!``"$">.HRQ,`$,0)*ZB+$P"8"`M/`(``21"$MP`
+M0/@)`D`H+20#``$`8!`MW[\`,-^U`"C?M``@W[,`&-^R`!#?L0`(W[````/@
+M``@GO0!`)[W_\/^_````!2B`/`(``"1"````0/@))*4(`-^_```#X``()[T`
+M$">]__#_OP````4H@#P"```D0@```$#X"22E"``D`@`!W[\```/@``@GO0`0
+M)[W_\/^_```D!@`!`*8P!#P"```D0@```$#X"20%"$`D`@`!W[\```/@``@G
+MO0`0)[W_T/^_`"#_LP`8_[(`$/^Q``C_L````("8+0"@B"T`!2B`/`(``"12
+M```"0/@))*4*`#!0``,6```*`@`0+0)@("T"0/@))`4(0"0#``$"(Q@$`$,0
+M)%1```$D$``!`@`0+=^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`GO?_0
+M_[\`*/^T`"#_LP`8_[(`$/^Q``C_L````("0+0"@B"TD!@`!`*8P!#P"```D
+M0@```$#X"20%"(```(`M/`(``"14```\`@``)%,```)`("T"@/@)`B`H+1!`
+M``<"0"`M`F#X"20$``HF$``!*@(G$!1`__<"0"`M)`4(@#P"```D0@```$#X
+M"0``,"TJ`B<0W[\`*-^T`"#?LP`8W[(`$-^Q``C?L````^``"">]`#"/I``(
+M,,8/_P`*5(``RC`ECZ(`!``"%D``PC`E,((``1!```./HP``/`(!``#","4P
+M@@`0$$``!#""``0\`B```,(P)3""``000``$,((`(#P"`$``PC`E,((`(!!`
+M``(\`@"``,(P):BF``BXI@`+,((``A!```,`"$:`/`(`@`$"0"6HJ``,N*@`
+M#R0"__\08@`/``,;0(BD``R8I``//`(`#S1"X```8A@D`(,@):BD``RXI``/
+MB*(`")BB``L\`T```$,0):BB``BXH@`+`^``""0"``$#X``(```0+8BB``B8
+MH@`+/`,@``!#$"6HH@`(`^``"+BB``L0X``'`````(BB``R8H@`/%0``#P!&
+M$"4(`$=#-$(0`%$```DTPA``B2(`")DB``NHH@`(N*(`"ZBF``RXI@`/"`!'
+M1@``$"VHH``(N*``"ZBB``RXH@`/```0+:BB`!2XH@`7J*(`$+BB`!,#X``(
+M)`(``8BB`!28H@`7,$(``1!``$HD`P`/B*(`%)BB`!<P0A_^``(00J3"``"(
+MH@`0F*(`$P`"%`*DP@`"H,``!(BB`!"8H@`3,$(``11``!<`````B*(`$)BB
+M`!,P0@`"$$```B0"``&@P@`$B*(`$)BB`!,P0@`($$``!`````"0P@`$-$(`
+M`J#"``2(H@`0F*(`$S!"``000``$`````)#"``0T0@`$H,(`!(BB``B8H@`+
+M``(4@C!"``^@P@`%B*(`%)BB`!<``A-"H,(`!HBB`!"8H@`3,$(/```"&@*@
+MPP`'B*(`$)BB`!,P0@#P``(1`J#"``B(H@`0F*(`$S!"\````A,"H,(`":#`
+M``HP8@#_$$```Z#```LD8@`!H,(`!Y#"``@00``$```8+9#"``@D0@`!H,(`
+M"`/@``@`8!`M`^``"`````"0@BZ\-$(`"*""+KR0H@`$-$(`"*"B``24@BZZ
+MI*(``)""+KR@H@`$D((NO:"B``4#X``(```0+2>]_^#_OP`0_[$`"/^P````
+M@(@M)`5`@#P&DD@\$```)A````(`^`DTQOP``B`@+20%0(`\!B22`@#X"33&
+M220"("`M)`5`@#P&*``"`/@)-,8`.0(@("TD!4"`/`93%@(`^`DTQ@@D`B`@
+M+20%0(`\!N68`@#X"33&!7D"("`M)`5`@#P&`!T"`/@)-,;O_P(@("TD!4"`
+M/`8:J@(`^`DTQKY``B`@+20%0(`\!KX0`@#X"33&550"("`M)`5`@#P&``X"
+M`/@)-,8P!P(@("TD!4"$`@#X"0``,"W?OP`0W[$`"-^P```#X``()[T`(">]
+M_^#_OP`8_[(`$/^Q``C_L````("(+30%F-`\`@``)$(```!`^`DD!AP6``"`
+M+3P"```D4@```B`@+30%F(`"0/@)/`8``280``$J`@`(%$#_^@(@("T\`@``
+M)$(```!`^`DT!9P```(6`@`"&0(P0@`/``(1``!B$"4`0"`M/`(``"1"````
+M0/@))`4`"-^_`!C?L@`0W[$`"-^P```#X``()[T`(">]_Y#_OP!@`(`X+0"`
+M,"T\`@``)$).:&A#``!L0P`':$0`"&Q$``^,10`0LZ,``+>C``>SI``(MZ0`
+M#Z^E`!`\`@``)$).@&A#``!L0P`':$0`"&Q$``^,10`0LZ,`&+>C`!^SI``@
+MMZ0`)Z^E`"@\`@``)$).F&A#``!L0P`':$0`"&Q$``^,10`0LZ,`,+>C`#>S
+MI``XMZ0`/Z^E`$`\`@``)$).L&A#``!L0P`':$0`"&Q$``^,10`0LZ,`2+>C
+M`$^SI`!0MZ0`5Z^E`%@``"@M``40@`!&("$`71`AC$,``*R#1BB,0P`8K(-&
+M/(Q#`#"L@T90C$(`2*R"1F0DI0`!**(`!11`__,`!1"``.`@+3P"```D0@``
+M`$#X"20%``'?OP!@`^``"">]`'``!2A``*8H(0`%*$``I"@A`^``")2B%?XG
+MO?_`_[\`,/^U`"C_M``@_[,`&/^R`!#_L0`(_[````"`@"T`P)@M`."@+0$`
+MJ"TPL?__/`4``"2E.^@\$@``)E(```)`^`DD!A)PKA,`#*X4`!"N%0`4IA$!
+MR*8``<HD`@`_I@(!_*X``@"N`"^\K@`OP#P""`"N`B_,)`('@:X"+]2N`"_<
+M/`(`/S1"/S^N`B_@)`(`9*X"+^0D`@`"K@(OZ"0"__^N`B_XK@(O_*X",``F
+M!"P\/`4``"2E3L@"0/@))`8`!J(`,`3?OP`PW[4`*-^T`"#?LP`8W[(`$-^Q
+M``C?L````^``"">]`$`PA`#_,*4`_P``,"T\`@``)$=.T``&$$``1A`A`$<8
+M(9!B``!41``*),8``9!B``$`HA`K5$``!B3&``&08@`"`$40*Q!```8D`P`!
+M),8``2S"``140/_P``800```&"T#X``(`&`0+2>]_[#_OP!(_[8`0/^U`#C_
+MM``P_[,`*/^R`"#_L0`8_[``$`"@B"T`P)`M`."8+0$`J"TPD/__/`(``"1"
+M````0/@))`1&J!1```,`0*`M"`!*K20"``(`0"`M`@`H+0(@,"T"0#@M`F!`
+M+3P"```D0@```$#X"0*@2"T"@)`M`H`@+0``*"T\`@``)$(```!`^`DD!@`!
+M$$``&`*`("T\`@``)$(```!`^`DD!4`@,$,`_P`#$0*N@@',,&(`#Z:"`="2
+MA`'//`(``21"(H``0/@)DH4!T1!``;0D`@`-`H`@+3P"```D0@```$#X"0``
+M*"T40``#`H`@+0@`2J4D`@`#/`(``"1"````0/@)-`68&*:"`=*.@P',)`(`
+M"1!B``<D`@`*%&(`"CP"``"6@@'0+$(`!!!```8\`@``/`(``21"'K``0/@)
+M`D`@+3P"```D0@```$#X"0)`("U40``#CD(!S`@`2J4D`@`.+$(`!11```T"
+M0"`M/`(``"1"````0/@))`5`$#1"$``"0"`M`$`P+3P"```D0@```$#X"20%
+M0!`"0"`M-`68`#P"```D0@```$#X"20&``<\`@``)$(```!`^`D"0"`MID(!
+MU#!"__\P0P#P)`(`,!!B`#4H8@`Q$$``!B0"`&`D`@`0$&(`,"0"`"`(`$E`
+M`````!!B`"PH8@!A4$```B0"`*`D`@!0$&(`*(Y#`<R60@'4%$``)0`````D
+M`@`%%&(`#20"``?>0@'0)`/__P`#&#P`0Q`D/`,`"31C`$,``Q@\5$,``XY#
+M`<P(`$EG)`(`1B0"``<08@`2)`(`420"``M48@`#CD,!S`@`26<D`@!1)`0`
+M"A!D``DD`@`)$&(`""0"`&)49``)CD,!S)9"`=`L0@`$4$``!8Y#`<PD`@!B
+MID(!U(Y#`<PD!``*$&0`$R0"``E08@`2`D`@+51D``:60P'4ED(!T"Q"``04
+M0``,`D`@+99#`=0P8@#P)$+_T"Q"`$`00``&`D`@+3!B``\H0@`%%$`!*"0"
+M``T"0"`M)`4`P3P"```D0@```$#X"0.@,"T00`$?EZ(``"Q",`)00``#EZ(`
+M``@`2J4D`@`%IH(2<`)`("T\`@``)$(```!`^`DD!4`0,$,`&``#&,(D`@`"
+M$&(`#R0"``,08@$.)`(`"HY#`<PD`@`)$&(`"20"``I48@$)KZ(`!)9"`=`L
+M0@`$%$``!`)`("T(`$JE)`(`"@)`("TD!0`_/`(``"1"````0/@)`Z`P+1!`
+M`/HD`@`(EZ(``*:"$G("0"`M)`4`'#P"```D0@```$#X"0.@,"T00`#OEZ(`
+M`!!```TD$P-`,%/_\``3FP`"0"`M)`4`&SP"```D0@```$#X"0.@,"T00`#C
+MEZ(```)BF"4F<_]```"`+1)@``X``(@M/`(``"16```F!0#``D`@+0+`^`D#
+MH#`M$$``UI>B```"(H@F)A```0(3$"L40/_W)@4`P#0"__\6(@#/)`(`!R0"
+M``JF@A/F)`(``Z:"%?```(`M)`,`"P`0$$``4!`A``(0@`!0$"$``A"``%00
+M(:1#$^XF$``!+@(`"A1`__<`$!!```"`+3P"```D1TY8/`(``"1&3F`D!0`+
+M`!`00`!4("$`1Q@AE&,``*2#%?@`1A@AE&,``*2#%?(`4!`A``(0@`!0$"$`
+M`A"``%00(:1%%K2D1188)A```2X"``,40/_O`!`00":%$G`\`@``)$(```!`
+M^`D"0"`M$$``GB0"``B6@A)P+$)0`U!``!66@A**CD,!S"0$``H09``))`(`
+M"1!B``@D`@9H5&0`#9:"$HJ60@'0+$(`!%!```F6@A**)`(&:*:"%@`D`@2P
+MIH(6!"0"@`"F@A8(IH(5_I:"$HH00``>)`,`$)9"`=0P0@#P%$,`&P)`("TT
+M!9@`/!$``"8Q```"(/@))`9`!SP0```F$````@#X"20$!]`\`@``)$(```!`
+M^`D"0"`MID(!U@)`("TT!9@``B#X"20&``<"`/@))`0'T)9"`=8P0@#P)`,`
+M(!1#`&<D`@`-`D`@+20%`+\\`@``)$(```!`^`D#H#`M$$``7R0"``B7H@``
+MIH(2=*9"`@@\`@``)$(```!`^`D"0"`M$$``520$``J.0P',4&0`"P)`("TD
+M`@`)4&(`"`)`("T49``*)`(`!Y9"`=`L0@`$4$``!B0"``<"0"`M)Z4`!#P"
+M```(`$IW)$(``!!B``4"0"`M)`(`"U1B``:60@'4`D`@+2>E``0\`@``"`!*
+M=R1"```P0@#P)$+_T"Q"`$`00``%`D`@+2>E``0\`@``"`!*=R1"```GI0`$
+M/`(``"1"````0/@)`````!!``"P`````CH(LQ*Y"`<`\`@``)$(```!`^`D"
+M0"`M``"(+0``@"TD$P`?/`(``"16```"<"@C`D`@+0+`^`D#H#`M$$``&9>B
+M```"(H@A`!`80`!T&"$``A("H&(L,).B``&@8BPQ)A```2X"``,40/_Q`G`H
+M(Q(@``TD`@`)/`(``C1"__U6(@`#/`(``0@`2J4D`@`))$(@2`!`^`D"0"`M
+M"`!*KP)`$"TD`@`(KZ(`!!*```0\`@``)$(```!`^`D"@"`M$J```H^B``2N
+MH@`````0+=^_`$C?M@!`W[4`.-^T`##?LP`HW[(`(-^Q`!C?L``0`^``"">]
+M`%`GO?_P_[\`"/^P```\`@``)$(```!`^`D`@(`MC@(LJ%!```0\`@```$#X
+M"0(`("T\`@``)$(```!`^`D"`"`M`@`@+20%``$\`@``)$(```!`^`DD!@`!
+M)@42<#P"```D0@```$#X"0(`("T\`@``)$(```!`^`D"`"`MW[\`"-^P```#
+MX``()[T`$">]_Y#_OP!H_[X`8/^W`%C_M@!0_[4`2/^T`$#_LP`X_[(`,/^Q
+M`"C_L``@`("8+3P"```D0D[@:$,``&Q#``>SHP``MZ,`!SP"```D0D[H:$,`
+M`&Q#``=H1``(;$0`#[.C`!"WHP`7LZ0`&+>D`!\``/`M/`(``"16```\`@``
+M)%<````>@(`"'8`ACA(```)@("T"P/@)`D`H+:X"``@``(@M`!$4``!1@"4"
+M8"`M`D`H+0+@^`D"`#`M`F`@+0+`^`D"0"@M%%``*0``&"TF,0`!*B(!`!1`
+M__,`$10```"(+3P"```D50``/`(``"14````$1"``%T0(8Q0`!`"8"`M`D`H
+M+0*@^`D"`#`M`F`@+0*`^`D"0"@M%@(`%```&"TF,0`!*B(`!!1`__(`$1"`
+M`!X0@`!=$"$"8"`MC$4```+@^`F,1@`()]X``2O"``(40/_,`!Z`@#P"```D
+M0@```$#X"20$`&0D`P`!`&`0+=^_`&C?O@!@W[<`6-^V`%#?M0!(W[0`0-^S
+M`#C?L@`PW[$`*-^P`"`#X``()[T`<#"E__\PH@$`4$``!3"B`(`D`A,SI,(`
+M``@`2UDD`A?4$$``#@````#<@A*()`/__P`#&#P``QPZ`$,0)!!```<`````
+M)`()"*3"```D`@JLI.(```/@``@D`@`!`^``"```$"TGO?_`_[\`,/^S`"C_
+ML@`@_[$`&/^P`!``@(@M`("8+0"`D"VGH```E((2<"Q"4`$40``'))`!X(R"
+M`:`D!0#)`$#X"0.@,"T00`$_```8+98B`=0P0@#P)`,`0%!#``&F8!*&EZ(`
+M`%1```^.0P'<CB,!S"0"``=48@`+CD,!W)8C`=`D`@`(5&(`!XY#`=PD`@`%
+MIZ(``"0"``&F8A)VIF(2>(Y#`=PD`@`&$&(`$20"<&660P'*5&(`#ZX```26
+M0P(()&+_G#!"__\L0@`"4$```Y9#`@@(`$N:)&(`!20"`$%48@`$K@``!"0"
+M`$.F0@((K@``!)9B$H900``)EF(2BB0"``&N`@`$EF(2=E1```268A**)`(`
+M`ZX"``268A**4$``!99B$HR.`@`$-$(`!*X"``268A*,$$``#B0""0B60P'*
+M)`(.$1!B``HD`@D(C@,`!#1B``BN`@`$EF(2>!1```0D`@D(-&(`**X"``0D
+M`@D(I@(`$)8B`=0P0@#P)$+_T"Q"`$`40``4)`()Q(XC`<PD`@`'$&(`$"0"
+M"<0D`@`+$&(`#"0$``H09``+)`()Q"0"``D08@`()`()Q!1D``8D`@JLEB(!
+MT"Q"``100``")`(*K"0""<2F`@`2)`(3,Z8"``PD`A?4I@(`#HX#```\`O_]
+M-$+__P!B&"0\`@`!`&(8):X#``"7H@``,$(``A1```T``!@MCB0!S"R"``90
+M0``))`,``20"``44@@`'``,<@)8B`=`L0@`$5$``!(X$```D`P`!``,<@(X$
+M```\`O_[-$+__P""("0`@R`E/`+_WS1"__\`@B`D/`(`$`""("67H@````(0
+M0SA"``$P0@`!``(5@#P#_[\T8___`(,@)`""("6N!```CB(!S"Q"``=40``%
+MC@,``#P"``@`@A`E"`!,$ZX"```\`O_W-$+__P!B&"2N`P``C@(``#P#@```
+M0Q`E/`-```!#$"6N`@``ED(!T"Q"``(00``&EZ(``(XC`<PD`@`+5&(`+(X"
+M``"7H@``,$(``11```4``!@MC@(`!#!"``E40``!)`,``0`#'T".!```/`+?
+M_S1"__\`@B`D`(,@)9>E````!1##.$(``3!"``$``A<`/`/O_S1C__\`@R`D
+M`((@):X$```PI0`$%*``!0``("V.`@`$,$(`"51```$D!``!``0FP(X"```\
+M`_?_-&/__P!#$"0`1!`E/`,$``!#$"4\`P$``$,0):X"``".`@``/`/]_S1C
+M__\`0Q`DK@(``(YB$S@00``$```@+8YB$SP40``#``0EP"0$``$`!"7`C@(`
+M`#P#_W\T8___`$,0)`!$$"4T0O``K@(``(Y#`<PD`@`%5&(`!HY"`<R60P'0
+M)`(`"%!B``:.`@``CD(!S"Q"``840``%EZ(``(X"```T0@@`K@(``)>B```P
+M0@'P4$```B0"``H``A$#I@(`")>B```P0O``4$``!"0"`(```AL#)`(``0!B
+M$`2F`@`*EB(!U#!"`/`D0O_0+$(`0!!```..`@``"`!,B#1"!@`D`_O_`$,0
+M)"0#_?\`0Q`DK@(``)9B$GI00``.CB(!S"9&$DB.(@&@`B`@+0!`^`DD!0`/
+M4$``!XXB`<PD`@`!KD(23(X"```T0@$`K@(``(XB`<PL0P`%KD,2:"0#``44
+M0P`%```@+98C`=`D`@`)4&(`!B0$``&.(@',+$(`!A1```,`!"'`)`0``0`$
+M(<".`@``)`/_?P!#$"0`1!`EK@(``"0"``^N`@`4)`,``0!@$"W?OP`PW[,`
+M*-^R`"#?L0`8W[``$`/@``@GO0!`)[W_X/^_`!`\`@``)$(```!`^`D#H"@M
+M)`(``=^_`!`#X``()[T`("0"``%4H@`$/`(``3P"```(`$S))$(``"1",N`#
+MX``(K((`<">]_]#_OP`H_[(`(/^Q`!C_L``0`("`+0"@B"TT!8`H/`(``"12
+M```"0/@)CB8`!`(`("TT!8`L`D#X"8XF``P"`"`M-`6`,`)`^`F.)@`0`@`@
+M+30%@#0"0/@)CB8`"(XB```\`P$``$,0)!!```P"`"`M/`(``"1"````0/@)
+M`Z`H+8X"$C3\0``H`@`@+30%@"`"0/@)/`8!``(`("TT!8`@/`(``"1"````
+M0/@)CB8``-^_`"C?L@`@W[$`&-^P`!`#X``()[T`,">]_]#_OP`@KZ4`!(R#
+M`=PD`@`!$&(`"30"__\08``,/`(``"0"``808@`()`(`"%1B`!$DH@`!-`+_
+M_Z^B``P\`@`'"`!-&C1"__\\`@``C$(```"B$",``A#`KZ(`##P"``",0@``
+M`*(0(P`"$,"OH@`0)*(``:^B``@\`@&`-$+__P#"$"2OH@``/`(``"1"````
+M0/@)`Z`H+=^_`"`#X``()[T`,">]_^#_OP`0_[$`"/^P````@(@M-`6`*#P0
+M```F$````@#X"0``,"T"("`M/`(``"1"````0/@)-`6`!#P#``0`0Q`E/`/_
+MSS1C__\`0Q`D`B`@+30%@`0"`/@)`$`P+0(@("TT!8`@`@#X"30&___?OP`0
+MW[$`"-^P```#X``()[T`(">]_\#_OP`P_[4`*/^T`"#_LP`8_[(`$/^Q``C_
+ML````("0+0"@B"V4H@`2$$``'`"`F"T\`@``)$(```!`^`DT!8`$/`,`$`!#
+M$"4"0"`M-`6`!#P0```F$````@#X"0!`,"V6)@`0`D`@+0(`^`DT!8`DEB8`
+M$@)`("T"`/@)-`6`.(XF`!0`!C#``D`@+0(`^`DT!8`P"`!-?P)`("T\`@``
+M)$(```!`^`DT!8`$/`/_[S1C__\`0Q`D`D`@+0!`,"T\`@``)$(```!`^`DT
+M!8`$`D`@+30%@"@\`@``)$(```!`^`F.)@```D`@+3P"```D0@```$#X"30%
+M@"`\`_^``$,0))8C``H`0S`EEB(`&!!```8"0"`M)$(`!``"%``\`P!_`$,0
+M)`#","4\$```)A````(`^`DT!8`@CF8OU#P"__\T0@#_`,(P))8B`!H``A(`
+M,$+_``#","6N9B_4`D`@+0(`^`DT!8`8EC,`"HXC`!P"8Q`K5$```0!@F"V.
+M-``,CB,`'`*#$"M40``!`&"@+59T``*.-0``CC4`!(XF``0DQO_]``8PP#P0
+M``<V$/__`-`P)#P""A@`PC`E`D`@+3P1```F,0```B#X"30%@-0FIO_]``8P
+MP`#0,"0\`@H``,(P)0)`("T"(/@)-`6`V#)F__\`%!0``,(P)0)`("T"(/@)
+M-`6`W-^_`##?M0`HW[0`(-^S`!C?L@`0W[$`"-^P```#X``()[T`0">]_^#_
+MOP`8_[(`$/^Q``C_L````("(+0"@$"T`P)`M)`5@`#P0```F$````@#X"0!`
+M,"T"("`M)`5@"`(`^`DD!@`!`B`@+20%8`PD!@`#/`(``"1"````0/@))`<`
+M`A!```@``!@M`B`@+3P"```D0@```$#X"20%8`2F0@``)`,``0!@$"W?OP`8
+MW[(`$-^Q``C?L````^``"">]`"`GO?_@_[\`$/^Q``C_L````("(+0"@@"T\
+M`@``)$(```!`^`DD!4`4`!"`0"0#``,"`Q@$`$,0)0(@("T`0#`M/`(``"1"
+M````0/@))`5`%"0"``'?OP`0W[$`"-^P```#X``()[T`(">]_^#_OP`0_[$`
+M"/^P````@(@M`*"`+3P"```D0@```$#X"20%0!0`$(!`)`,``P(#&`0``Q@G
+M`$,0)`(@("T`0#`M/`(``"1"````0/@))`5`%"0"``'?OP`0W[$`"-^P```#
+MX``()[T`(">]_^#_OP`8_[(`$/^Q``C_L````("0+0"@B"T`P(`M/`(``"1"
+M````0/@))`5`&"0#``$"(Q@$``,8)P!#$"0R$``!`C"`!`!0$"4"0"`M`$`P
+M+3P"```D0@```$#X"20%0!@D`@`!W[\`&-^R`!#?L0`(W[````/@``@GO0`@
+M)[W_\/^_``C_L````*"`+2RB``800``()`/__SP"```D0@```$#X"20%0!PP
+M0@`O`@(0!C!#``$`8!`MW[\`"-^P```#X``()[T`$">]_^#_OP`8_[(`$/^Q
+M``C_L````("0+0"@@"T`P(@M/`(``"1"````0/@))`5`%`!`,"T`$!!`)`,`
+M`P!#&`0\`@`!-$+P``!B&"<`PS`D`!"#``#0,"42(``#-,:``#P"``$`PC`E
+M`D`@+3P"```D0@```$#X"20%0!2.12Q$/`(!``"B*"4\`@``)$(```!`^`D"
+M0"`MW[\`&-^R`!#?L0`(W[````/@``@GO0`@)[W_\/^_```\`@``)$(```!`
+M^`DD!4`(.$(``2Q"``'?OP```^``"">]`!`GO?_`_[\`./^V`##_M0`H_[0`
+M(/^S`!C_L@`0_[$`"/^P````@)@M`*"@+0``L"T`@*@M/`(``"10```"`/@)
+M)`4`@`!`D"T\`@"``D(0)!!``!@"8"`M`@#X"20%`(P`0!@M/`(!``!B$"14
+M0``!/!8`(#P"(```8A`D$$``!#P"!``\`@!``L*P)3P"!```8A`D$$```SP$
+M`@`\`@"``L*P)0!D$"140``!`L2P)0)@("T\`@``)$(```!`^`DD!0#``$"0
+M+20"__]60@`$/`(!!:Z````(`$\I```0+31"V+H"0A@D/`(`"`)"$"000``$
+MKH,``#P"0```8A`EKH(``#)"``400``%,D(%P(Z"```T0@`!KH(``#)"!<`0
+M0``<,D(`((Z"```T0@!`KH(```)@("T\$```)A````(`^`DD!0#$,$0#_XZC
+M1J``@R`E/!$#_P!1$"0``A0"`$00):ZB1J`"8"`M`@#X"20%`,@P1`/_CJ-&
+MH`"#("4`41`D``(4`@!$$"6NHD:@,D(`(%!```B.@@``CF(2:!!```6.@@``
+M/`-```!#$"6N@@``CH(```+"$"6N@@``/`-```!#$"000``9)`(``:YR$E`"
+M8"`M/!```"80```"`/@))`4`Q*YB$E0"8"`M`@#X"20%`,BN8A)8`F`@+0(`
+M^`DD!0#,KF(27`)@("T"`/@))`4`T*YB$F`"8"`M`@#X"20%`-2N8A)D)`(`
+M`=^_`#C?M@`PW[4`*-^T`"#?LP`8W[(`$-^Q``C?L````^``"">]`$`#X``(
+MC((L1">]_\#_OP`P_[4`*/^T`"#_LP`8_[(`$/^Q``C_L````("(+0"@@"V,
+ME2Q$!J$`"P"`H"TD!0`D/`(``"1"````0/@)```P+0(@("T\`@``)$(```!`
+M^`DD!0`D/`(!!31"V+H"`C`D,@(`0!!```T``)@MCH(LS%1```$TQ@!`CH(L
+MT%1```$TQ@$`CH(LU%1```$TQ@"`CH(LV%1```$TQ@0`,@(``51```$TQ@`'
+M/`("X`("$"000``9/`)``#P"`(``PC`E/`(`(`("$"000``$/`(`0#P"`0`"
+M8I@E/`(`0`("$"000``$/`(`@#P"(``"8I@E/`(`@`("$"000``#/`,"`#P"
+M!``"8I@E`@,0)%1```$"8Y@E/`)```("$"000``#`B`@+3P"``@`PC`E/`(`
+M`"12```"0/@))`4`H`(@("T\`@``)$(```!`^`DD!0"L/`-(_S1C__\`0Q`D
+M`%,0)0(@("TD!0"L`D#X"0!`,"T&`0`%KI`L1`(@("TD!0`D`D#X"20&``$"
+MH!`MW[\`,-^U`"C?M``@W[,`&-^R`!#?L0`(W[````/@``@GO0!``^``")2"
+M`>HGO?_P_[\``#"E__^4@@'J`*(0*Q!```P``!@M``4I0#0"B!P`HB@A/`(`
+M`"1"````0/@)`````#!"@``40``")`,``0``&"T`8!`MW[\```/@``@GO0`0
+M)[W_L/^_`$C_O@!`_[<`./^V`##_M0`H_[0`(/^S`!C_L@`0_[$`"/^P````
+M@)@M,+3__Y2"`>H"@A`K$$``40``&"T`%(%`-!&(%`(1B"$\`@``)$(```!`
+M^`D"("@M`$"0+30"B``"`B@A`F`@+3P"```D50```J#X"0``,"TT'H@$`AXH
+M(0)@("T"H/@)```P+307B`@"%R@A`F`@+0*@^`D``#`M-!:(#`(6*"$"8"`M
+M`J#X"0``,"TT!8@0`@4H(0)@("T"H/@)```P+0)@("T"("@M`J#X"20&``<T
+M!8@8`@4H(0)@("T"H/@)```P+30"B!P"`H`A`F`@+0(`*"T"H/@)```P+20"
+M``060@`<)`,``8YB+\P\`P@``$,0)!!``!<D`P`!)I``0#(0__\`$(%`-`*(
+M``("*"$"8"`M`J#X"0``,"T"'B@A`F`@+0*@^`D``#`M`A<H(0)@("T"H/@)
+M```P+0(6@"$"8"`M`@`H+0*@^`D``#`M)`,``0!@$"W?OP!(W[X`0-^W`#C?
+MM@`PW[4`*-^T`"#?LP`8W[(`$-^Q``C?L````^``"">]`%`GO?_0_[\`(/^S
+M`!C_L@`0_[$`"/^P````@)@M`,`8+3"E__^4@@'J`*(0*Q!``"4``"`M4,``
+M%```D"V0T@`%`!*2`)#"``0"0I`ED,8``P`&-@"08@`"``(4``#","608@`!
+M``(2``#","608@```,(P)0`&,$(`$A?``,(P)0@`4$P`$I!"```P+0`%B4`T
+M!8@8`B4H(3P0```F$````@#X"0)@("TT`H@<`B*((39&@``"8"`M`@#X"0(@
+M*"TD!``!`(`0+=^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`GO?^0_[\`
+M:/^^`&#_MP!8_[8`4/^U`$C_M`!`_[,`./^R`##_L0`H_[``(`"`H"T`P)`M
+MKZ<``#"V__^OI``$)(0!X#P%JJH5```"-*6JJ@``*"V4@@`*`L(0*Q!``2\`
+M`!@MDD,``"QB``900`$K```8+0`#$(`\`P``)&-.^`!#$"&,0@```$``"```
+M```(`%"K)`(`!8R"`````A2",$(``1!``1T``!@M"`!0KB0#``8D`@`$KZ(`
+M#(Z"+\P\`P@``$,0)%!``!Z27@`$)L(`0)2#``H`0Q`J$$`!#P``&"T(`%"S
+MDEX`!)9"``(L0@`%%$`!"0``&"V60@`"+$(`!A1```ZOH``,ED(``BQ"``XD
+M`P`!%$``":^C``PD`@`#"`!0LJ^B``PD`P`'"`!0LJ^C``P(`%&I```8+9)>
+M``220@`%``(2``/"\"620@`&``(4``/"\"620@`'``(6``/"\"4#Q?`FDD(`
+M"0`"$@"20P`(`$,0)0!%$"8P0O__KZ(`"))5``J20@`+``(2``*BJ"620@`,
+M``(4``*BJ"620@`-``(6``*BJ"4"I:@FDD(`#P`"$@"20P`.`$.X)0+EN"8R
+M]___DE,`$))"`!$``A(``F*8)9)"`!(``A0``F*8)9)"`!,``A8``F*8)99"
+M``(L0@`.$$```@)EF"8R<P#_)`(`!(^C``P48@":`!:)0(Z"+\P\`P@``$,0
+M)!!``)8T!8@`)L(`0#!"__^OH@`0`!:)0`(E*"$`'C`G/!```"80```"`/@)
+M`H`@+30%B`0")2@ACZ(`"``","<"`/@)`H`@+30%B`@")2@A`H`@+0(`^`D"
+MH#`M-`6(#`(E*"$"@"`M`@#X"0+@,"TT!8@0`B4H(0*`("T"`/@)`F`P+30"
+MB!0"(H@A`H`@+0(@*"T"`/@))`8`!`*`("T"P"@M/`(``"1"````0/@)CZ8`
+M`))&`!220@`5``(2``#","620@`6``(4``#","620@`7``(6``#","6250`8
+MDD(`&0`"$@`"HJ@EDD(`&@`"%``"HJ@EDD(`&P`"%@`"HJ@ECZ,`!(QB+]`P
+M0@`$4$``%@``N"V20@`?``(2`))#`!X`0Q`EKZ(`%))"`!T``A(`DD,`'`!#
+M$"6OH@`8DE<`())"`"$``A(``N*X)9)"`"(``A0``N*X)9)"`",``A8`"`!1
+M2`+BN"6OH``8KZ``%(^B`!```H%`-!*(``(2*"$\$0``)C$```(@^`D"@"`M
+M-!.(!`(3*"$"@"`M`B#X"8^F`!0T!8@(`@4H(0*`("T"(/@)`J`P+30%B`P"
+M!2@A`H`@+0(@^`F/I@`8-`6($`(%*"$"@"`M`B#X"0+@,"TT!8@4`@4H(0*`
+M("T"(/@))`8`!S0%B!@"!2@A`H`@+0(@^`D``#`M-`*('`("@"$"@"`M`@`H
+M+0(@^`D``#`M`!:!0`(2D"$"@"`M`D`H+0(@^`D#P#`M`A.`(0*`("T"`"@M
+M`B#X"8^F``@(`%&I)`,``30%B``")2@A`H`@+3P0```F$````@#X"0/`,"TT
+M!8@$`B4H(0*`("T"`/@)CZ8`"#0%B`@")2@A`H`@+0(`^`D"H#`M-`6(#`(E
+M*"$"@"`M`@#X"0+@,"TT!8@0`B4H(0*`("T"`/@)`F`P+30"B!0"(H@A`H`@
+M+0(@*"T"`/@)CZ8`#`*`("T"P"@M/`(``"1"````0/@)CZ8``"0#``$`8!`M
+MW[\`:-^^`&#?MP!8W[8`4-^U`$C?M`!`W[,`.-^R`##?L0`HW[``(`/@``@G
+MO0!P)[W_\/^_````@!`M`*`@+21"+#``0"@M/`(``"1"````0/@))`8`!M^_
+M```#X``()[T`$">]__#_OP``)(0L,#P"```D0@```$#X"20&``8D`@`!W[\`
+M``/@``@GO0`0)[W_\/^_````@!`M`*`@+21"+#P`0"@M/`(``"1"````0/@)
+M)`8`!M^_```#X``()[T`$">]_^#_OP`0_[$`"/^P````@(`M)(0L/#P"```D
+M0@```$#X"20&``:2!BP\D@(L/0`"$@``PC`ED@(L/@`"%```PC`ED@(L/P`"
+M%@``PC`E`@`@+3P1```F,0```B#X"30%@."2!BQ!``8R`)("+$``PC`E`@`@
+M+0(@^`DT!8#D)`(``=^_`!#?L0`(W[````/@``@GO0`@,*7__Y2"`@@010`&
+M)`,`#)2"$G(P0@"`%$```B0#``LD`P`#5,```:S#```#X``(```0+0"`&"V4
+M@A*&$$``!0``*"V4@A)V%$```B0%``$D!0!#E((2BE1```$TI0`$E((2C!!`
+M``D`````E&,!RB0"#A$08@`%`````)2"$G@40``"-*4`"#2E`"`#X``(`*`0
+M+2>]_^#_OP`8_[(`$/^Q``C_L````("`+921$D@"(!`M,C$`'``1B(,P4@`"
+M`!*00XR"`:P`0/@)`B`H+0(`("T\`@``)$(```!`^`DT!9@`-$(@``(`("T`
+M0#`M/`(``"1"````0/@)-`68`(X"`;`"`"`M`$#X"0(@*"T04@`"+D8``0)`
+M,"V.`@&X`@`@+0!`^`D"("@MW[\`&-^R`!#?L0`(W[````/@``@GO0`@)[W_
+MX/^_`!#_L0`(_[````"`B"T`H(`M/`(``"1"````0/@))`5`$#P#__$T8_^?
+M`$,0)#(0``<`$("`/`,``"1C3Q`"`X`AC@,```!#$"4"("`M`$`P+3P"```D
+M0@```$#X"20%0!#?OP`0W[$`"-^P```#X``()[T`(">]_^#_OP`8_[(`$/^Q
+M``C_L````("`+3#1__\DA"PV/`(``"1"````0/@))`8`!I(&+#:2`BPW``(2
+M``#","62`BPX``(4``#","62`BPY``(6``#","4"`"`M/!(``"92```"0/@)
+M-`6`")(&+#L`!C(`D@(L.@#","4R,3__`!&,``#1,"4"`"`M`D#X"30%@`S?
+MOP`8W[(`$-^Q``C?L````^``"">]`"`GO?_0_[\`(/^S`!C_L@`0_[$`"/^P
+M````@(`M/!$``"8Q```"(/@)-`6`3`!`D"T"`"`M`B#X"30%@%``0)@M`@`@
+M+0(@^`DT!8!,`%*0*Q)```(`0!@M)G,``0`3$#P``Q@\``,8/@!#$"7?OP`@
+MW[,`&-^R`!#?L0`(W[````/@``@GO0`P)[W_\/^_```\`@``)$(```!`^`DT
+M!8!,W[\```/@``@GO0`0)[W_X/^_`!C_L@`0_[$`"/^P````@)`M/`(``"1"
+M````0/@)-`6`(`!`B"T\`@$``B*()0)`("TT!8`@/!```"80```"`/@)`B`P
+M+0)`("TT!8`@`@#X"0(@,"W?OP`8W[(`$-^Q``C?L````^``"">]`"`GO?_@
+M_[\`$/^Q``C_L```C((2-!!``"T`@(`ME$(``C!"`"!00``JW[\`$```("V,
+MH@``$$``#P``B"V,I@```*00(9!#``2`0@`$!$,`!B2$``$P8P!_`'$0*U!`
+M``$`8(@M)(0``0"&$"L40/_U`*00(0(`("T\`@``)$(```!`^`DT!8`$$B``
+M"`!`&"T`$1!"+$(``U!```4\!OW_/`8"``@`4Q(`9C`E/`;]_S3&__\`9C`D
+M`@`@+3P"```D0@```$#X"30%@`3?OP`0W[$`"-^P```#X``()[T`(">]_]#_
+MOP`@_[,`&/^R`!#_L0`(_[````"`F"T\`@``)$(```!`^`DT!9AD``*4PC)2
+M`?\R0@$`$$```P)@("TZ4@'_`!*0)SP1```F,0```B#X"30%@%``0(`M`F`@
+M+0(@^`DT!8!,`@*`)@(2@"8"`!`MW[\`(-^S`!C?L@`0W[$`"-^P```#X``(
+M)[T`,">]__#_OP`(_[````"`@"T\`@``)$(```!`^`DD!4`@,$(`_P`"&0(P
+M10`/C@(!S!1#``0``"`ME@(!T%!%``$D!``!`(`0+=^_``C?L````^``"">]
+M`!`GO?_@_[\`&/^R`!#_L0`(_[````"`D"T`H(`M/!$``"8Q```"(/@)-`6`
+MD(X#````0Q`AK@(```)`("T"(/@)-`6`C(X#``0`0Q`AK@(`!`)`("T"(/@)
+M-`6`E(X#``P`0Q`AK@(`#`)`("T"(/@)-`6`B(X#``@`0Q`AK@(`"`)`("T"
+M(/@)-`6`F(X#`!``0Q`AK@(`$-^_`!C?L@`0W[$`"-^P```#X``()[T`(`/@
+M``@D`@`!)[W_\/^_```\`@``)$(```!`^`DT!9P<,$(`_]^_```#X``()[T`
+M$">]__#_OP``/`(``"1"````0/@)-`6`6#!"``??OP```^``"">]`!`GO?_P
+M_[\``#"F``<\`@``)$(```!`^`DT!8!8W[\```/@``@GO0`0`^``"(R"+[PG
+MO?_P_[\``(R&$C14P``$/`(``*R%+[P(`%.O)`(``21"````0/@)`````-^_
+M```#X``()[T`$`/@``@D`@`!)[W_X/^_`!C_L@`0_[$`"/^P````@(`M`*"(
+M+2RB``840``(`("0+3P"```D0@```$#X"30%__\`41`K$$``!0(`("TD`O__
+MKD(O^`@`4]4``!`M/`(``"1"````0/@)`B`H+0(`("T`0#`M/`(``"1"````
+M0/@))`40<*X1+_@D`@`!W[\`&-^R`!#?L0`(W[````/@``@GO0`@)[W_\/^_
+M``C_L````("`+3P"```D0@```$#X"20%$'`P0O__`$`H+3P"```D0@```$#X
+M"0(`("W?OP`(W[````/@``@GO0`0)[W_T/^_`"#_LP`8_[(`$/^Q``C_L```
+M`("(+0"@D"T\`@``)$(```!`^`DD!3__`%(0*Q!```0D`O__KB(O_`@`5!8`
+M`!`M`B`@+3P"```D0@```$#X"30%@!0`0(`M)`+```("@"0"("`M/`(``"1"
+M````0/@)`D`H+3!"/_\"`H`E`B`@+30%@!0\`@``)$(```!`^`D"`#`MKC(O
+M_"0"``'?OP`@W[,`&-^R`!#?L0`(W[````/@``@GO0`P)[W_\/^_``C_L```
+M`("`+3P"```D0@```$#X"30%@!0P0C__`$`H+3P"```D0@```$#X"0(`("W?
+MOP`(W[````/@``@GO0`0@((OS#A"``$#X``(,$(``2>]_^#_OP`8_[(`$/^Q
+M``C_L````("(+1"@`!$`@)`M/`(``"1"````0/@)-`6`!#P0_O\V$/__`%`0
+M)`(@("T`0#`M/`(``"1"````0/@)-`6`!(XB+\P(`%19`%`0)#P"```D0@``
+M`$#X"30%@`0\$`$``%`0)0(@("T`0#`M/`(``"1"````0/@)-`6`!(XB+\P`
+M4!`EKD(OS"0"``'?OP`8W[(`$-^Q``C?L````^``"">]`"`GO?_0_[\`(/^S
+M`!C_L@`0_[$`"/^P````@(@M`*"0+3P"```D0@```$#X"20%/_\`4A`K$$``
+M!"0"__^N(C``"`!4C0``$"T"("`M/`(``"1"````0/@)-`6`%`!`@"T\`L``
+M-$+__P("@"0"("`M/`(``"1"````0/@)`D`H+0`"%``\`S__`$,0)`("@"4"
+M("`M-`6`%#P"```D0@```$#X"0(`,"VN,C``)`(``=^_`"#?LP`8W[(`$-^Q
+M``C?L````^``"">]`#`GO?_P_[\`"/^P````@(`M/`(``"1"````0/@)-`6`
+M%#P#/_\`0Q`D``(4`@!`*"T\`@``)$(```!`^`D"`"`MW[\`"-^P```#X``(
+M)[T`$">]_]#_OP`H_[0`(/^S`!C_L@`0_[$`"/^P````@(@M`,"8+3"R__\N
+M0@"`$$``#20#``PD!00`/!```"80```"`/@)`D`P+0`3,"L"("`M`@#X"20%
+M!`0"41`AH%,O.```&"T`8!`MW[\`*-^T`"#?LP`8W[(`$-^Q``C?L````^``
+M"">]`#`GO?_0_[\`(/^S`!C_L@`0_[$`"/^P````@)`M,+``_Q#``$F@D!(X
+M,@(`_Q!``$??OP`@C((2-)1"``(P0@%`)`,!0%1#`$+?LP`8/`(``"1"````
+M0/@))`4``0!`*"V.0A(TE$(``C!"0`!00``,CD(2-``%&$("`P`8```P$@`&
+M$$``PC`A),8!!```F!(`4Q`A``(00`@`50@D4PVLA$(``@1!``P"!0`8``48
+M@@(#`!@``#`2``800`#","$DQ@#2``"8$@!3$"$``A!`"`!5""13#4@``#`2
+M``800`#","$DQ@%H``"8$@!3$"$``A!`)%,.8`(%`!@``(`2`!`00`("@"$F
+M$`/H,A`__P)`("T\$0``)C$```(@^`DD!1!P`D`@+20%$+`"(/@)`F`P+0`0
+M-```T#`E`D`@+0(@^`DT!8`4W[\`(-^S`!C?L@`0W[$`"-^P```#X``()[T`
+M,">]__#_OP``/`(``"1"````0/@)C(4!W-^_```#X``()[T`$"0"``80H@`(
+M```8+9""$I,00``%`````(R"+^@L0@`"5$```20#``$#X``(`&`0+2>]_^#_
+MOP`8_[(`$/^Q``C_L```/`(``"1"````0/@)`("0+1!``'D"0"`M-`68<#P"
+M```D0@```$#X"20&`!^60@'4,$(`\"1"_]`L0@!`%$```B0&`!0D!@`8`D`@
+M+3P1```F,0```B#X"30%F?@"0"`M/!```"80```"`/@)-`6`'"0#P'\`0Q`D
+M-$(`@`)`("TT!8`<`B#X"0!`,"T"0"`M-`6!!`(@^`DD!@`]`D`@+0(`^`DD
+M!4`0-$(``@)`("TD!4`0`B#X"0!`,"V.0P',)`(`!Q!B`!`"0"`M)`(`"Q!B
+M``PD!``*4&0`"P)`("TD`@`)4&(`"`)`("T49``A`D`@+99"`=`L0@`$4$``
+M'C0%F'0"0"`M-`68=#P0```F$````@#X"20&`"8"0"`M-`68>`(`^`DD!@`-
+M`D`@+30%F?`"`/@))`8`!P)`("TT!9GT`@#X"20&`#\"0"`M/`(``"1"````
+M0/@))`5`$#P#_/\T8___`$,0)`@`5;0\`P(`-`68=#P0```F$````@#X"20&
+M``H"0"`M-`68>`(`^`DD!@`,`D`@+30%F?`"`/@))`8``P)`("TT!9GT`@#X
+M"20&`"`"0"`M/`(``"1"````0/@))`5`$#P#_/\T8___`$,0)#P#`P``0Q`E
+M`D`@+20%0!`"`/@)`$`P+0@`5@;?OP`8/!$``"8Q```"(/@))`5`$#P#_/\T
+M8___`$,0)`)`("TD!4`0/!```"80```"`/@)`$`P+0)`("T"(/@))`5`$"0#
+M__T`0Q`D`D`@+20%0!`"`/@)`$`P+0)`("TT!9AP`@#X"20&`!\"0"`M-`68
+M=`(`^`DD!@!_`D`@+30%F'@"`/@))`8`#@)`("TT!9GP`@#X"20&``P"0"`M
+M-`69]`(`^`DD!@#_ED(!U#!"`/`D0O_0+$(`0!1```(D!@`.)`8`$@)`("T\
+M`@``)$(```!`^`DT!9GX`D`@+3P"```D0@```$#X"30%@!P`0!@M)`+`?P!B
+M&"260@'4,$(`\"1"_]`L0@!`%$```C1F$X`T9@^``D`@+3P"```D0@```$#X
+M"30%@!S?OP`8W[(`$-^Q``C?L````^``"">]`"`GO?_@_[\`&/^R`!#_L0`(
+M_[```#P"```D0@```$#X"0"`D"T00`!/W[\`&`)`("T\$0``)C$```(@^`DD
+M!4`0/`/\_S1C__\`0Q`D`D`@+20%0!`\$```)A````(`^`D`0#`M`D`@+0(@
+M^`DD!4`0)`/__0!#$"0"0"`M)`5`$`(`^`D`0#`M`D`@+30%@00"`/@))`8`
+M`0)`("T"(/@)-`6`'`!`&"TD`L!_`&(8))9"`=0P0@#P)$+_T"Q"`$`40``"
+M-&83@#1F#X`"0"`M/!```"80```"`/@)-`6`'`)`("TT!9AP`@#X"20&`!\"
+M0"`M-`68=`(`^`DD!@!_`D`@+30%F'@"`/@))`8`#@)`("TT!9GP`@#X"20&
+M``P"0"`M-`69]`(`^`DD!@#_ED(!U#!"`/`D0O_0+$(`0!1```(D!@`4)`8`
+M&`)`("T\`@``)$(```!`^`DT!9GXW[\`&-^R`!#?L0`(W[````/@``@GO0`@
+M```@+92C```\`@``E$)/,`!#$"L40``*`&`H+3P"```D0T\P)(0``0`$$(``
+M0Q`AE$(```!%$"M00/_[)(0``0`$$(`\`P``)&-/,`!#$"$#X``(A$(``B>]
+M_^#_OP`0_[$`"/^P````P(`M`."(+0"`."TLH@`>$$``JR2&`>``!1"`/`,`
+M`"1C3UP`0Q`AC$(```!```@`````)`(``E("``V,P@``+@(``A1``*0``!@M
+M+@(`!!1```DN`@`&%$``GR0"`'\2`@">`&`0+0@`5SDD`P`-"`!6^@`"%(((
+M`%<Y)`,`#1(``)4``!@M)`(``18"``0`````C((OS`@`5Q0``A;#4@``!HS"
+M```D`@`!4@(`!8SB+]`(`%<Y)`,`#`@`5Q4``A3""`!7%0`"$(.,@P',+&(`
+M!A!``'\``!`M)`(`!11B`'PD`@`-E((!T"Q"``A00`!X```0+0@`5S@D`@`-
+M$@``=0``&"TD`@`!%@(`.CP"```D0@```$#X"30%H@@(`%<4``(30P@`5S",
+M@@'X$@``:0``&"TD`@`!5@(`9P!@$"T(`%;=C((OW%(```:4@A*&)`(``1("
+M``4D`P`!"`!7.@!@$"T(`%<Y+$,``=R"$H@D`___``,8/``#'#H`0Q`D+$(`
+M`0`"&#P``Q@_"`!7.@!@$"T2``!/```8+20"``%6`@!,)`,`#(R"+\P``A`G
+M"`!7.0`"'\)2```&C,(``"0"``%2`@`)C((OT`@`5SDD`P`,``(2PC!"``$0
+M0``])`,`#0@`5SD``!@M"`!7%``"$,,(`%<Y)`,`#(R"+^`(`%<P,$(`/XR"
+M+^`P0C\`"`!7,``"$@(D`@`!4@(`"(R",!@2```K```8+2X"``<00``H)`,`
+M#`@`5Q<\`@``.$(``0@`5SDP0P`!)$(```!`^`D``````$`@+1!``!TD`P`!
+M+@(`!Q!``!H``!@M`!`0@#P#```D8T_4`$,0(8Q"````0``(``````@`5S"0
+M@@`)"`!7,)""``P(`%<PD((`#0@`5S"0@@`+D((`"JXB```(`%<Y```8+0(`
+M,"T\`@``)$(```!`^`D"(#@M`$`8+0!@$"W?OP`0W[$`"-^P```#X``()[T`
+M(">]_^#_OP`0_[$`"/^P````@(`M`."(+0"`2"TLH@`>$$``>"2$`>``!1"`
+M/`,``"1C4`P`0Q`AC$(```!```@`````4.``!(X#+\R.`B_,"`!7ACP#"``(
+M`%>*/`+W_XR"`````A3",$(``1!``&L``!@M$.``!(X"+]`D`__["`!78@!#
+M$"0T0@`$K2(OT`(`("TT!8$@"`!7>8TF+]`"`"`M/`(``"1"````0/@)-`6B
+M"!(@``,`0#`M"`!7<C1&(``D`M__`,(P)`(`("T(`%=Y-`6B"*X'`?@"`"`M
+M-`6`2`#@,"T\`@``)$(```!`^`D`````"`!7QB0#``$`!Q`K"`!7OJX"+]Q0
+MX``&C@,OS(X"+\P\`X```$,0)0@`5[ZM(B_,/`)__S1"__\`8A@D"`!7OJTC
+M+\R&`B_T`.*((2XB`$!00``!)!$`/R0"`!I4H@`%C2,OX(TB+^`"(A`E"`!7
+MGC!"`#\P8S\`,B(_```"$@(`0Q`EK2(OX`(`("TT!8#H"`!7>8TF+^`LP@`'
+M$$``(0``&"T`!A"`/`,``"1C3_``0Q`A`@`@+8Q%```\`@``)$(```!`^`D`
+MX#`M"`!7Q@!`&"V,@@````(2PC!"``%00``+`@`@+1#@``..`B_0"`!7O31"
+M``@D`__W`$,0)*TB+]`(`%?&)`,``0(`("T\`@``)$(```!`^`D"(#@M`$`8
+M+0!@$"W?OP`0W[$`"-^P```#X``()[T`(">]__#_OP``/`(``"1"````0/@)
+M```````"$"O?OP```^``"">]`!`GO?_`_[\`./^V`##_M0`H_[0`(/^S`!C_
+ML@`0_[$`"/^P```0H``U`("`+3P"```D0@```$#X"20%0`0\`__\-&/__P!#
+M$"0"`"`M`$`P+3P"```D0@```$#X"20%0`0\`@``)$(```!`^`DD!``*)!$`
+M*#P"```D4P``/!8``3P"```D50``/!+__#92__\\`@``)%0```(`("T"8/@)
+M)`5`$`!6$"000``0``````*@^`DD!``R`@`@+0)@^`DD!4`$`%(0)`(`("TD
+M!4`$`H#X"0!`,"TF,?__%B#_[P(`("T(`%@D```0+18@``0"`"`M"`!8)```
+M$"T"`"`M/`(``"1"````0/@)-`6`!#P#__LT8___`$,0)`(`("T`0#`M/`(`
+M`"1"````0/@)-`6`!"0"``'?OP`XW[8`,-^U`"C?M``@W[,`&-^R`!#?L0`(
+MW[````/@``@GO0!`)[W_T/^_`"#_LP`8_[(`$/^Q``C_L````("(+0"@@"T\
+M`@``)%(```)`^`DT!8`$/`,`!`!#$"4"("`M`$`P+3P"```D4P```F#X"30%
+M@`02```.W[\`(`(@("T"0/@))`5`!#P#__PT8___`$,0)#P#``$`0Q`E`B`@
+M+20%0`0"8/@)`$`P+=^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`GO?_0
+M_[\`(/^S`!C_L@`0_[$`"/^P````@(@M`*"`+3P"```D4@```D#X"30%@`0\
+M`P`$`$,0)0(@("T`0#`M/`(``"13```"8/@)-`6`!!(```[?OP`@`B`@+0)`
+M^`DD!4`$/`/__#1C__\`0Q`D/`,``@!#$"4"("`M)`5`!`)@^`D`0#`MW[\`
+M(-^S`!C?L@`0W[$`"-^P```#X``()[T`,">]_^#_OP`8_[(`$/^Q``C_L```
+M`*"`+0#`*"TD$0`!$A$`#0"`D"T2```%)`(``A("``P``!`M"`!8HM^_`!@\
+M`@`!)$)?6`!`^`D`````"`!8GP!`B"T\`@`!"`!8FR1"8+@\`@`!)$)A7`!`
+M^`D`````"`!8H*Y0+[BN4"^X`B`0+=^_`!C?L@`0W[$`"-^P```#X``()[T`
+M(">]__#_OP``/`(``"1"````0/@))`5`!#P#``,`0Q`D``(4`M^_```#X``(
+M)[T`$">]__#_OP`()`(`"!"B`#/_L```+*(`"1!```\D`@$`)`(``A"B`#`L
+MH@`#$$``!B0"``0D`@`!$*(`%@``$"T(`%D!W[\`"!"B`"$``!`M"`!9`=^_
+M``@0H@`I+*(!`1!```8D`@(`)`(`(!"B`"$``!`M"`!9`=^_``@0H@`C)`($
+M`!"B`"0``!`M"`!9`=^_``@\`@``)%```(R"$C100``@/`(``)1"``(P0D``
+M%$``%SP"``",@A(TA$(``@1#`!@\`@``"`!8^CP"```\`@``"`!8^R10```\
+M`@``"`!8^R10```\`@``"`!8^R10```\`@``"`!8^R10```\`@``"`!8^R10
+M```\`@``"`!8^R10```\`@``)%```#P"```D0@```$#X"0(`*"T"`!`MW[\`
+M"-^P```#X``()[T`$">]__#_OP``/`(``"1"````0/@))`4`#-^_```#X``(
+M)[T`$">]__#_OP```*`P+3P"```D0@```$#X"20%``S?OP```^``"">]`!`G
+MO?_P_[\``"0%``@\`@``)$(```!`^`DD!@`$W[\```/@``@GO0`0)[W_\/^_
+M``C_L````("`+20%``@\`@``)$(```!`^`DD!@`@`@`@+20%``@D!@`$/`(`
+M`"1"````0/@)```X+0`"$"O?OP`(W[````/@``@GO0`0)[W_\/^_``C_L```
+M`("`+3P"```D0@```$#X"30%@$@D`__?`$,0)`(`("T`0#`M/`(``"1"````
+M0/@)-`6`2#P"```D0@```$#X"0(`("T"`"`M/`(``"1"````0/@))`4``=^_
+M``C?L````^``"">]`!`GO?_P_[\`"/^P````@(`M/`(``"1"````0/@)-`6`
+M2#1"`"`"`"`M`$`P+3P"```D0@```$#X"30%@$@\`@``)$(```!`^`D"`"`M
+MW[\`"-^P```#X``()[T`$">]_^#_OP`8_[(`$/^Q``C_L````("(+0"@$"T`
+MP)`M-`6`0#P0```F$````@#X"0!`,"T"("`M-`6`1`(`^`D"0#`MW[\`&-^R
+M`!#?L0`(W[````/@``@GO0`@)[W_X/^_`!#_L0`(_[````"`B"T`H(`M+*(`
+M0!!``!P``!@M+*(`(!1```L\`@``)$(```!`^`DT!8!$)`8``0(&,`0`!C`G
+M`$8P)`(@("T(`%F@-`6`1"1"````0/@)-`6`0"0&``$"!C`$``8P)P!&,"0"
+M("`M-`6`0#P"```D0@```$#X"0`````D`P`!`&`0+=^_`!#?L0`(W[````/@
+M``@GO0`@)[W_X/^_`!#_L0`(_[````"`B"T`H(`M+*(`0!!``!H``!@M+*(`
+M(!1```H\`@``)$(```!`^`DT!8!$)`8``0(&,`0`1C`E`B`@+0@`6<@T!8!$
+M)$(```!`^`DT!8!`)`8``0(&,`0`1C`E`B`@+30%@$`\`@``)$(```!`^`D`
+M````)`,``0!@$"W?OP`0W[$`"-^P```#X``()[T`(">]_^#_OP`8_[(`$/^Q
+M``C_L````("(+3P0```F$````@#X"30%@#P`0)`M`B`@+0(`^`DT!8$,`$`8
+M+3!"`"!40``!-E("`#P"`@(`8A`D5$```392`0`"0!`MW[\`&-^R`!#?L0`(
+MW[````/@``@GO0`@)[W_X/^_`!C_L@`0_[$`"/^P````@)`M`*"`+3"F`/\\
+M`@``)$(```!`^`DT!8`\,@("`!!```(``(@M)!$`(#("`0`00``#`D`@+3P"
+M`@("(H@E-`6!##P"```D4````@#X"0(@,"T2(``,`D`@+3P"```D0@```$#X
+M"20%`#0T0@`0`D`@+20%`#0"`/@)`$`P+0@`6B3?OP`8/`(``"1"````0/@)
+M)`4`-"0#_^\`0Q`D`D`@+0!`,"T\`@``)$(```!`^`DD!0`TW[\`&-^R`!#?
+ML0`(W[````/@``@GO0`@J*``"+B@``LPQ@__J*8`#+BF``\PYP`@4.``!P``
+M$"V(H@`,F*(`#S1"(`"HH@`,N*(`#P``$"VHH@`4N*(`%ZBB`!"XH@`3`^``
+M""0"``$GO?_0_[\`(/^S`!C_L@`0_[$`"/^P````@)@M`,"0+0$@B"T`H(`M
+MB*(`%)BB`!<P0@`!$$``;B0#``^(X@`4F.(`%S!"``$40``&/`(``"1"````
+M0/@))`4`#!!2`&0D`P`/B@(`$)H"`!,P0@__IB(``(H"`!2:`@`7``(4`C!"
+M?_^F(@`"HB``!(H"`!":`@`3``(5`C!"`/^B(@`&``(6```"%@,D`_^`4$,`
+M`:(@``:*`@`4F@(`%S!"`0!00``%)`+__XH"`!2:`@`7,$+^```"$D*B(@`'
+MB@(`$)H"`!,``A/",$(`'Z(B``B*`@`0F@(`$P`"%P*B(@`)B@(`$)H"`!,`
+M`A,#,$(``:(B``J*`@`4F@(`%S!"``(40``S```8+8H"`!2:`@`7,$(`!!!`
+M``0`````DB(`!`@`6K<T0@`!B@(`%)H"`!<P0@`0$$``%0````"2(@`$-$(`
+M`J(B``2*!0`4F@4`%S"E_P``!2H"HB4`!8YB,!P40``;```8+20"``40H@`8
+M`F`@+3P"```D0@```$#X"0(@*"T(`%JY```8+8H"`!2:`@`7,$(`"!!```0`
+M````DB(`!`@`6K<T0@`(B@(`%)H"`!<P0@`@$$``!0``&"V2(@`$-$(`$*(B
+M``0``!@M`&`0+=^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`GO?]P_[\`
+MB/^^`(#_MP!X_[8`</^U`&C_M`!@_[,`6/^R`%#_L0!(_[``0`"`D"T`H/`M
+M`,"8+:^G``BOJ``,`("H+93#``(P8@$`$$```P``B"T(`%K;``,1PY3"``(`
+M`A'#.$(``3!"``$40`0D)`,`#)9C``(P8@`@4$```Y9B``((`%KF``,1@P`"
+M$8,X0@`!,$(``51`!!DD`P`,`D`@+0``*"T\`@``)$(```!`^`DD!@`!$$`$
+M%@``&"T"0"`M/`(``"1"````0/@)`F`H+:^B`!@00`0))`,`#"0"``83P@`*
+M+\(`!Q!```8D`@`(+\(``A!`!`*/I``,"`!;!J^@`!P7P@/])`,`#*^@`!R/
+MH@`(4$``$HY#`<P"0"`M/`(``"1"````0/@))`410*^B`!P"0"`M/`(``"1"
+M````0/@)CZ4`&`)`("T\`@``)$(```!`^`D``"@MCD,!S"0"``<08@`-)`(`
+M"Q!B``LD!``*$&0`"20"``E08@`(CZ,`"!1D`!P"0"`MED(!T"Q"``000``9
+M/`(``(^C``@08``5`D`@+8Y$$C10@``2`D`@+99C``"4@@``4&(`#@)`("V6
+M8P`",&,!\)2"``(P0@'P%&(`"`)`("T\`@``)$(```!`^`D"8"@M%$`#R"0#
+M``$"0"`M/`(``"1"````0/@)-`6`6!1```.OH@`@)`0``:^D`"`"0"`M/!``
+M`"80```"`/@)-`6`!*^B`"@\`@(@CZ4`*`"B*"2OI0`H`D`@+0(`^`DD!4`0
+MKZ(`)#P"`/XT0@!@CZ<`)`#B."2OIP`D`D`@+0(`^`DD!4`4KZ(`$`)`("T"
+M`/@))`5`&*^B`!0"0"`M/`(``"1"````0/@)`\`H+3P"```D0@```$#X"0)`
+M("T"0"`M/`(``"1"````0/@)`F`H+1!``X\D`P`#EF(``C!#`?`D`@%`$&(`
+M'2AB`4$00``/)`((P"0"`,`08@`C*&(`P1!```8D`@#0)`(`H!!B`!DD`P`,
+M"`!?`H^D``P08@`?)`,`#`@`7P*/I``,$&(`%BAB",%00``#)`()0`@`6Y`D
+M`@%0$&(`!20""5`08@`&)`(``@@`7P$D`P`,)`D``0@`6Z*OJ0`LKZ(`+`@`
+M6Z<D`P`!)`0``Z^D`"PD!0`""`!;J*^E`#`D!P`$KZ<`+"0)``((`%NHKZD`
+M,"0"``6OH@`L)`,``J^C`#`"0"`M-`68`#P"```D0@```$#X"20&``<``(`M
+M/`(``"144(@\`@``)%8``#P"```D5P```!`00`!0$"$``AC``'08(0`"$$"/
+MI``L`$00(0`"$(``5!`A`D`@+8QE```"P/@)C$8``"8Q``$R(@`_5$``!"80
+M``$"X/@))`0``280``$N`@`9%$#_ZP`0$$```(`M/`(``"164N`\%/__-I1_
+MX#P7__\V]W\L`!`0P`!6$"&/IP`($.``"8Q%````M!`A+$(`&51``!4F$``!
+M`+<0(2Q"``E40``1)A```0`0$,``5A`A`D`@+3P)```E*0```2#X"8Q&``0F
+M,0`!,B(`/U1```8F$``!/`(``"1"````0/@))`0``280``$N`@#$%$#_X@`0
+M$,".HBRL`D`@+8^E`"R/I@`P`$#X"0(@."V68@`",$)``!1```4"0"`MAF(`
+M`@1#``>60@'2`D`@+3P"```D0@```$#X"0)@*"V60@'2+$(`0E1``%.60@'2
+M`D`@+30%F"P\!@`"/`(``"1"````0/@)-,:@`I9C```D`@FT%&(`#I*C$I*6
+MHA*<`&(8(SP"9F8T0F9G`&(`'```$!(``A`_``(00P`#'\,`0Q`C``(4``@`
+M7"@``B0#/`)F9C1"9F<`8@`<```0$@`"$'X``Q_#`$,@(Y9B``(P0@#0)`,`
+MP%1#``T"0"`MDJ82D@`&,",`!C&`,,8/P``$$",``A2`/`,`_`!#$"0`PC`E
+M`D`@+0@`7#LT!9E,-`693```,"T\`@``)$(```!`^`D\$````D`@+280```"
+M`/@)-`6B*"0#_?\`0Q`D`D`@+30%HB@\$0``)C$```(@^`D`0#`M`D`@+0(`
+M^`DT!:(H/`/__C1C`_\`0Q`D-$((``)`("TT!:(H`B#X"0!`,"T"0"`M-`6`
+M8`(@^`DD!@`/ED(!TBQ"`$,40``'`D`@+30%HE0\`@``)$(```!`^`D``#`M
+M`D`@+30%F'@\`@``)$(```!`^`DD!@`.CD,!S"0$``H09``))`(`"5!B``B6
+M8P``%&0`&@)`("V60@'0+$(`!!!``!>/I0`8EF,``"0""9X08@`$)!```20"
+M":,48@`#`D`@+0``@"T"0"`M/`(``"1"````0/@)-`6B3!!0``8"0"`M-`6B
+M3#P"```D0@```$#X"0(`,"T"0"`MCZ4`&#P"```D0@```$#X"0.@,"T00`)Q
+M)`,``R0"``83P@`)CZ(`+(Y"`@000``&CZ(`+#P"```D0@```$#X"0)`("V/
+MH@`L,$;__XZB++@"0"`MCZ4`&`!`^`D#H#@M$$`"7B0#``.68@`",$(`0!!`
+M`"`"0"`MCD,!S"0$``H09``-)`(`"5!B``R68@`"5&0`!I:B$G"60@'0+$(`
+M!%1```:68@`"EJ(2<"Q"4`,40``+`D`@+99B``(P0@"@)`,`H!!#``4"0"`M
+M/`(``"1"````0/@)CZ4`&`)`("T\`@``)$(```!`^`D"8"@M`D`@+3P"```D
+M0@```$#X"8^E`!@00`(U)`,``X^C``A08``(DJ8L,`)`("TD!1%`/`(``"1"
+M````0/@)CZ8`')*F+#"2HBPQ``(2``#","62HBPR``(4``#","62HBPS``(6
+M``#","4"0"`M/!```"80```"`/@)-`6``)*F+#4`!C(`DJ(L-`#","6/I``H
+M`,0P)8ZB+\P`PC`E/`(`@`#","4"0"`M`@#X"30%@`0"0"`M/`(``"1"````
+M0/@)`\`H+9*F+#R2HBP]``(2``#","62HBP^``(4``#","62HBP_``(6``#"
+M,"4"0"`M`@#X"30%@."2IBQ!``8R`)*B+$``PC`E`D`@+0(`^`DT!8#D`D`@
+M+3P"```D0@```$#X"20%0!"/I0`D`$40)0)`("TD!4`0`@#X"0!`,"T"0"`M
+M)`5`%`(`^`F/I@`0`D`@+20%0!@"`/@)CZ8`%`)`("TT!8!8`@#X"8^F`""2
+MIBPVDJ(L-P`"$@``PC`EDJ(L.``"%```PC`EDJ(L.0`"%@``PC`E`D`@+0(`
+M^`DT!8`(DJ8L.P`&,@"2HBPZ`,(P)0)`("T"`/@)-`6`#`)`("TT!8`8`@#X
+M"8ZF+]0"0"`M)`4`@`(`^`DD!O__`D`@+3P"```D0@```$#X"8^E`!@00`&]
+M)`,``Y)%$C@"0"`M/`(``"1"````0/@))`8``0)`("T\`@``)$(```!`^`D"
+M8"@MED(!U#!"`/`D0O_0+$(`0!!``!X"0"`MCD,2-)1B``(P0D``5$``!8Y"
+M$C2$8@`"!$$`%SP"``".0A(TE%```C(00``N$``!)A``#`)`("T\`@``)$(`
+M``!`^`DT!9@D)`/_\`!#$"0R$``/`%`0)0)`("T`0#`M/`(``"1"````0/@)
+M-`68)`)`("T\`@``)$(```!`^`DT!9D4,%`__Y9B``(P0@`@$$``"P`0$#P`
+M$!"`,$+__#0#NBX``QPX-&.+HP!#`!P``!`2``*!/@@`78X"0"`M``(0/C0#
+MS,P``QPX-&/,S0!#`!P``!`2``*`_@)`("TT!9@</`(``"1"````0/@))`8`
+M`8Y"$C240@`",$)``!1```8`$"!`CD(2-(1"``($00`#)@0`9``0((`DA`!D
+M/`(``"1"````0/@)``"`+0)`("T\`@``)$(```!`^`DT!9@(`$"P+0)`("TT
+M!9@(/`(``"1"````0/@))`8X`#P"```D5```/`(```@`7;4D40```B#X"20$
+M`,@"`!`M*$(`%!!```<F$``!`D`@+0*`^`DT!9PD,$(`$!1`__4``````D`@
+M+30%F`@\`@``)%````(`^`D"P#`M`D`@+3P"```D40```B#X"30%F&`T0@`#
+M`D`@+30%F&`"`/@)`$`P+99B``(P0@"@)`,`H!!#`!<D`@`"CJ,OP!!B`!0"
+M0"`M`B#X"30%F2`T0O```D`@+30%F2`"`/@)`$`P+0)`("T"(/@)-`69(#P#
+M``$`0Q`E`D`@+30%F2`"`/@)`$`P+20"``$(`%WKKJ(OP*Z@+\`\`@``)$(`
+M``!`^`D"0"`M``"`+204``$\`@``)%$````0*(`DI1```A0P!`(@^`D"0"`M
+M)A```2H"``H40/_Y`!`H@*Z@1J"60@'H$$``"P``@"T\`@``)%$```)`("T"
+M(/@)`@`H+280``&60@'H`@(0*A1`__H"0"`M/`(`"#1""66NHBQ$)`(`!A?"
+M``0"0"`M/`(`"#1"&66NHBQ$)`4`H#P0```F$````@#X"8ZF+$0"0"`M/`(`
+M`"1"````0/@))`4`K#P#``<`0Q`E`D`@+20%`*P"`/@)`$`P+8Y"$DP00``&
+M`D`@+3P"```D0@```$#X"0)`("T"0"`M-`688"0&``$\`@``)$(```!`^`D`
+M`#@M`D`@+3P"```D0@```$#X"0/`*"T"0"`M/`(``"1"````0/@)-`6`(#P#
+M_G\T8___`$,0)`)`("T`0#`M/`(``"1"````0/@)-`6`((Y#`<PL8@`&$$``
+M!R0"``448@`1`D`@+99"`=`L0@`(%$``#C0%@0@"0"`M-`6!&#P&``$\$```
+M)A````(`^`DTQ@"J`D`@+30%@1P"`/@))`8R$`)`("TT!8$(/`(``"1"````
+M0/@))`8`4I9B``(P0@$`4$```H*F$H^"IA*.`D`@+3P"```D0@```$#X"0)@
+M*"T``A8```)&`XZB+^`P1@`_AJ0O]`#$$"./I0`8@*,`!@!B$"M40``!`&0P
+M(8^G`!B`X@`%``(00`!(&",`9A`K4$``!(ZB+^"&HB_T`&(P(8ZB+^`P1#\`
+M``0B`H:E+_0`A1`CCZD`&($C``8`8A`K5$```0!E("&/HP`8@&(`!0`"$$``
+M2!@C`&00*U!```26HR_@AJ(O]`!B("&6HR_@,&,`/X:G+_0`9Q`CCZD`&($E
+M``8`HA`K5$```0"G&"&/I0`8@*(`!0`"$$``2"@C`*,0*Q!```0LP@!`AJ(O
+M]`"B&"$LP@!`4$```20&`#\L@@!`4$```20$`#\L8@!`4$```20#`#\PQ@`_
+M``02`#!"/P``PC`E``,4`#P#`#\`0Q`D`,(P)0)`("T\`@``)%````(`^`DT
+M!8#HCJ8OT%#```6.I2_X`D`@+0(`^`DT!8$@CJ4O^"0"__\0H@`$/`(``"1"
+M````0/@)`D`@+8ZE+_PD`O__$*(`!#P"```D0@```$#X"0)`("V.I3``)`+_
+M_Q"B``0\`@``)$(```!`^`D"0"`MCD8!^%#```>N7@'<`D`@+3P"```D0@``
+M`$#X"30%@$BN7@'<CZ<`"!#@`"@D`P`!CZD`&)$B``0P0@`"5$``!8^C`!B1
+M(@`$,$(`_J$B``2/HP`8E&(``J9B``*08@`$HF(`!)!B``6B8@`%D&(`!J)B
+M``:08@`'HF(`!XY"$C3\0``PCE`2-#P"```D0@```$#X"0)`("W^`@`H`D`@
+M+3P"```D0@```$#X"20%``$(`%\&)`,``8^D``R,@@``5$```:R#`````!@M
+M`&`0+=^_`(C?O@"`W[<`>-^V`'#?M0!HW[0`8-^S`%C?L@!0W[$`2-^P`$`#
+MX``()[T`D">]_^#_OP`0_[$`"/^P``",D`($,@(``Q!``!$`@(@M/`(``"1"
+M````0/@)-`691#P#W_\T8___`$,0)#(#``$``Q]``$,0)0(@("T`0#`M/`(`
+M`"1"````0/@)-`691#("``P00``8W[\`$``"$((P0@`!%$``"`(@("T\`@``
+M)$(```!`^`DT!8#0)`/_XP@`7SX`0Q`D/`(``"1"````0/@)-`6`T#1"`!P"
+M("`M`$`P+3P"```D0@```$#X"30%@-#?OP`0W[$`"-^P```#X``()[T`(">]
+M__#_OP``C((LM`!`^`D```````(0*]^_```#X``()[T`$">]_[#_OP!(_[8`
+M0/^U`#C_M``P_[,`*/^R`"#_L0`8_[``$`"`B"T`H*@M)!,``3P"```D0@``
+M`$#X"0"`L"T`0*`MEB(!Z!!```P``(`M/`(``"12```"("`M`D#X"0(`*"T4
+M0``))A```98B`>@"`A`K%$#_^0(@("T28`"?```8+0@`7W<"("`M"`!?<0``
+MF"TT!9E\/`(``"1"````0/@))`8``0``@"T\`@``)%,``#P"```D4@```B`@
+M+0)@^`DT!9P@%$``""X"`&0"0/@))`0`!280``$N`@!D5$#_]P(@("TN`@!D
+M$$``@P``&"T"("`M/`(``"1"````0/@)`H`H+1!``'P``!@M`B`@+3P"```D
+M0@```$#X"30%F10P0S__EH(``C!"`"`00``+``,0/``#$(`P0O_\-`.Z+@`#
+M'#@T8XNC`$,`'```$!(``A$^"`!?LB1$`&0``A`^-`/,S``#'#@T8\S-`$,`
+M'```$!(``A#^)$0`9#P"```D0@```$#X"0`````"("`M`H`H+3P"```D0@``
+M`$#X"0.@,"T00`!4```8+0(@("TT!9E\/`(``"1"````0/@)```P+9:"``(P
+M0@!`$$``(`(@("V.(P',)`0`"A!D``TD`@`)4&(`#):B``)49``&EL(2<)8B
+M`=`L0@`$5$``!I:B``*6PA)P+$)0`Q1```L"("`MEJ(``C!"`*`D`P"@$$,`
+M!0(@("T\`@``)$(```!`^`D"@"@M`B`@+3P"```D0@```$#X"0*@*"T"("`M
+M/`(``"1"````0/@)-`688#1"``("("`M`$`P+3P"```D0@```$#X"30%F&"2
+M@@`$,$(``E1```66@@`"DH(`!#!"`/ZB@@`$EH(``J:B``*2@@`$HJ(`!)*"
+M``6BH@`%DH(`!J*B``:2@@`'HJ(`!XXB$C3\0``PCC`2-#P"```D0@```$#X
+M"0(@("W^`@`H`B`@+3P"```D0@```$#X"20%``$D`P`!`&`0+=^_`$C?M@!`
+MW[4`.-^T`##?LP`HW[(`(-^Q`!C?L``0`^``"">]`%`GO?_@_[\`$/^Q``C_
+ML````("(+0"@@"T\`@``)$(```!`^`DT!8`$`$`8+3P"__PT0O__`&(8)"0"
+M``$2`@`N*@(``E!```4D`@`&$@``&#P&$`((`&!BW[\`$!("``8\!A`!)`(`
+M"!("`"/?OP`0"`!@8]^Q``@`9C`E`B`@+3P0```F$````@#X"30%@`0"("`M
+M/`(``"1"````0/@))`4`%"0#_]\(`&!4`$,0)`!F,"4"("`M/!```"80```"
+M`/@)-`6`!`(@("T\`@``)$(```!`^`DD!0`4-$(`(`(@("TD!0`4`@#X"0!`
+M,"T(`&!BW[\`$#P&$```9C`E`B`@+3P"```D0@```$#X"30%@`3?OP`0W[$`
+M"-^P```#X``()[T`(">]__#_OP``/`(``B1"B2@`0/@))`4``M^_```#X``(
+M)[T`$">]__#_OP`(_[````"`@"T``"@M/`(``"1"````0/@))`8``1!```<`
+M`!@M`@`@+3P"``(D0HDH`$#X"20%`!,`0!@M`&`0+=^_``C?L````^``"">]
+M`!`GO?_`_[\`,/^U`"C_M``@_[,`&/^R`!#_L0`(_[````"`B"T`H(`M/`(`
+M`B1"B2@`0/@))`4`$Q!``*4``!@M`B`@+0``*"T\`@``)$(```!`^`DD!@`!
+M$$``G0``&"T"("`M/`(``B1"B2@`0/@)```H+1!``)8``!@M$@``DR0$``J.
+M(P',$&0`"20"``E08@`(E@,``E1D``^6(@'4EB(!T"Q"``100``+EB(!U)8#
+M``(P8@`@%$``&B05``@P8P#0)`(`P!1B`#`D%``$"`!@Z"04`.LP0@#P)$+_
+MT"Q"`$!40``(E@,``HXC`<PD`@`'$&(``R0"``M48@`3E@,``I8#``(P8@`@
+M%$``!205``@P8P#0)`(`P%1B``.6`@`""`!@Z"04`.LP0D``%$``%B04`>J&
+M`@`"!$``$R04`NH(`&#H)!0`ZC!B`"`40``%``"H+3!C`-`D`@#`5&(``Y8"
+M``((`&#H)!0`JS!"0``40``%)!0!JH8"``($0``")!0"JB04`*J6`P`",&(`
+M0%!```J6`@`",&(`(%1```HVM0`$,&,`T"0"`,!48@`#E@(``@@`8/@VM0`$
+M,$(`0%!```$VM0`!E@(``C!"`0!00``!-K4``I8"``(P0@`0%$```B03``,`
+M`)@M`B`@+3P"```D0@```$#X"30%F'P`0)`ME@,``C!B`"`40``$,&,`T"0"
+M`,`48@`6``````(@("TT!9@$/`(``"10```"`/@)`F`P+0(@("TT!:(``@#X
+M"0*@,"T25``?`B`@+30%F'P"`/@)`H`P+3P"```D0@```$#X"20$`2P(`&$Y
+M)`,``1)4``H"("`M-`68?#P"```D0@```$#X"0*`,"T\`@``)$(```!`^`DD
+M!`$L`B`@+30%F`0\$```)A````(`^`D"8#`M`B`@+30%H@`"`/@)`J`P+20#
+M``$`8!`MW[\`,-^U`"C?M``@W[,`&-^R`!#?L0`(W[````/@``@GO0!`)[W_
+ML/^_`$C_O@!`_[<`./^V`##_M0`H_[0`(/^S`!C_L@`0_[$`"/^P````@)`M
+M`*"X+0#`@"T`@+`M/`(``"1"````0/@)K,````!`F"T28`#F```0+8Y#+\`D
+M`@`"$&(`!"0"``%48``%CM$OP"0"``&N`@``CM$OP"0"``%6(@![EN(``@)`
+M("T\`@``)$(```!`^`DT!9D@/`,``0!#$"140`!REN(``J[`+\"N$0````"H
+M+3P"```D40```D`@+0(@^`DT!9P0`$"@+0)`("T"(/@)-`6<%`!`@"T"0"`M
+M`B#X"30%G!@2@``#`$#P+18``!$`%"!"`D`@+0(@^`DT!9D@/`,``0!#$"4"
+M0"`M`$`P+3P"```D0@```$#X"30%F2`FM0`!*J(`"A1`_^0"0"`M`!0@0@`0
+M$$(`@B`A``09PA!@`&H`$"G"**(``E1``&@"0"`M`!X0(P`"%@```JX#`J,`
+M&@``$!)08``!``<`#0``J!(H0O_@$$```RJB`"`(`&&I)!7_X%!```$D%0`?
+M`H4`&P``$!)0H``!``<`#214_X`J@O_P$$```RJ"`!`(`&&U)!3_\%!```$D
+M%``/`D`@+3P1```F,0```B#X"30%F2`D`_@?`$,0)``5&4`P8P?@`$,0)0)`
+M("TT!9D@/!```"80```"`/@)`$`P+0)`("T"(/@)-`69("0#_^``0Q`D,H,`
+M'P!#$"4"0"`M-`69(`(`^`D`0#`M`D`@+0(@^`DT!9D@-$((``)`("TT!9D@
+M`@#X"0!`,"TD`@`"KL(OP"0"``&N8@`0HG4`%`@`8@"B=``5,$(`H"0#`*`0
+M0P`>)`(``H[#+\`48@`<`D`@+8YB`!`40``:/`(```)`("T\$0``)C$```(@
+M^`DT!9D@-$+P``)`("TT!9D@/!```"80```"`/@)`$`P+0)`("T"(/@)-`69
+M(#P#``$`0Q`E`D`@+30%F2`"`/@)`$`P+20"``&NPB_``D`@+3P"```D0@``
+M`$#X"0)@*"V68@`",$(``E1``#"6X@`"`D`@+3P"```D0@```$#X"30%F&`T
+M0@`"`D`@+0!`,"T\`@``)$(```!`^`DT!9A@EN4``C"B`0!40``+CD,!S)9"
+M`=0P0@#P)$+_T"Q"`$`00``@)`(``3"B`$`00``=)`(``8Y#`<PD`@`'$&(`
+M&"0"``L08@`6)`0`"A!D`!0D`@`)$&(`$R0"``$49``&/`(``I9"`=`L0@`$
+M5$``#20"``$\`@`")$*RG`!`^`D"0"`M"`!B/B0"``$T0@`"IN(``I9B``(P
+M0O_]IF(``B0"``'?OP!(W[X`0-^W`#C?M@`PW[4`*-^T`"#?LP`8W[(`$-^Q
+M``C?L````^``"">]`%`GO?_`_[\`,/^S`"C_L@`@_[$`&/^P`!``@(@M`*"`
+M+12@``(`H!`M)`+__Z^B``".(P',)`(`"1!B``<D`@`*%&(`"`(@("V6(@'0
+M+$(`!!!```4\`@``)`+_[P("@"0"("`M/`(``"1"````0/@))`4`#`(@("TD
+M!4``/`(``"13```"8/@)`@`P+3P"```D0@```$#X"20$``^/H@``,$(``Z^B
+M```R$``#`B`@+20%0`"/I@``/`(``"1"````0/@)`@`X+0!`D"TR`@`!%$``
+M'P)`$"TD`@`4-$(``:^B``"3I@``DZ(``0`"$@``PC`EDZ(``@`"%```PC`E
+MDZ(``P`"%@``PC`E`B`@+0)@^`DD!0`4`B`@+0``*"T\`@``)$(```!`^`DD
+M!@`!$$``!P)`$"T"("`M/`(``"1"````0/@))`4`P`)`$"W?OP`PW[,`*-^R
+M`"#?L0`8W[``$`/@``@GO0!`)[W_\/^_```\`@``)$(```!`^`DT!9AD``(<
+MPC!C`?\P8@$`$$``!`!@$"TX8@'_``(8)P!@$"W?OP```^``"">]`!"4H@`"
+M,$,!X"0"`,!08@`,E((2T"AB`,$00``&)`(!0"0"`*!08@`&E((2S@/@``@`
+M`!`M5&(`!0``$"V4@A+,I,(```/@``@D`@`!`^``"``````GO?_0_[\`*/^R
+M`"#_L0`8_[``$`"`D"T`H(@M/`(``"1"````0/@)-`688#!"``(40``7``"`
+M+3P"```D0@```$#X"0)`("T`0(`M`D`@+0(@*"T\`@`")$**V`!`^`D#H#`M
+M4$``"0``@"V'H@```%`0*E!```:F,``6EB(``C1"``*F(@`"``"`+:8P`!8"
+M`!`MW[\`*-^R`"#?L0`8W[``$`/@``@GO0`P)[W_T/^_`"#_LP`8_[(`$/^Q
+M``C_L````("(+=R"`>```A=^,$(``1!``"T`@)@M)`4$(#P0```F$````@#X
+M"20&``$"("`M)`4&``(`^`D``#`M`B`@+3P"```D0@```$#X"20%!@`T0@`(
+M`B`@+20%!@`"`/@)`$`P+0(@("TD!08$/`8`$`(`^`DTQ@(!`B`@+20%!B`"
+M`/@)```P+0``@"T\`@``)%(```(@("TD!00``D#X"0(`,"T"$Q`AD$8O.`(@
+M("T"0/@))`4$!"80``$J`@"`%$#_]0(@("W?OP`@W[,`&-^R`!#?L0`(W[``
+M``/@``@GO0`P)[W_\/^_````@&@M```@+23*__\`"E#"),;__S#&``<`H$@M
+M&*``'```6"TD#``!``<XP`#)0"$M`@`)4$```20(``@!#!`$)$+__P#,&`0D
+M8___`$,0)@#B$`0`"AB``&T8(8QC````0Q`D`.(0!@#"$`8!8A`$`((@)0$&
+M$",!8E@A`280(21)__@``#`M'2#_Z"5*``$\`@``)$(```!`^`D`````W[\`
+M``/@``@GO0`0)[W_T/^_`"C_M``@_[,`&/^R`!#_L0`(_[````"`D"T`@*`M
+ME,(``C!$`>`D`@#`$((`#P"@F"TH@@#!$$``!B0"`4`D`@"@$((`!P``$"T(
+M`&/'W[\`*!""``8``!@M"`!CQ@``$"T(`&-_)`,``20#``(``QA``'08(91P
+M$NJ48A+P``(1@`("@"648A+V``(3``("@"648A+\``(4@`("@"648A,"``(6
+M``("@"64<1,(E&(3#@`"$8`"(H@EE&(3%``"$P`"(H@EE&(3&@`"%(`"(H@E
+ME&(3(``"%@`"(H@E)`(``5)B``D"`(@M$F``!R0"``(68@`#```0+0@`8Z8"
+M((`M"`!CQ]^_`"@6,``(`D`@+3P"```D0@```$#X"30%H@@D`]__"`!CM`!#
+M$"0\`@``)$(```!`^`DT!:((-$(@``)`("T`0#`M/`(``"1"````0/@)-`6B
+M"*Z3+[P"0"`M`@`P+3P0```F$````@#X"30%F6`"0"`M-`699`(`^`D"(#`M
+M)`(``=^_`"C?M``@W[,`&-^R`!#?L0`(W[````/@``@GO0`PC(,!S"0&``H0
+M9@`5)`(`"5!B`!0D`P`H%&8`!R0"``>4@@'0+$(`!!1```XD`P`HC(,!S"0"
+M``<08@`))`(`"Q!B``@D`P`HE((!U#!"`/`D0O_0+$(`0!!```(D`P`@)`,`
+M*```("V4H@```$,`&P``$!!08``!``<`#1!```<`````4&```0`'``TD0O_V
+M+$(`#5!```$D!``!`^``"`"`$"TGO?^@_[\`6/^^`%#_MP!(_[8`0/^U`#C_
+MM``P_[,`*/^R`"#_L0`8_[``$`"`H"T`H+@M`("H+92V``(`%K'#E*(``C!#
+M`?`D`@%`$&(`'#+6``$H8@%!$$``#R0"",`D`@#`$&(`1"AB`,$00``&)`(`
+MT"0"`*`08@`\```0+0@`97G?OP!8$&(`.P``$"T(`&5YW[\`6!!B`#<H8@C!
+M4$```R0""4`(`&0E)`(!4!!B``,D`@E0%&(!4@``$"VOH```EH(!U#!"`/`D
+M0O_0+$(`0!1``"L"@"`MCH,!S"0"``<08@`G)`(`"Q!B`"0D!``*$&0`(B0"
+M``E08@`A`H`@+11D``8"@"`MEH(!T"Q"``040``</`(```*`("T\`@``)$(`
+M``!`^`DT!9E$)`/_QP!#$"2.HRPLA&,````#&,`P8P`X`$,0)0*`("T`0#`M
+M/`(``"1"````0/@)-`691`@`9%@"@"`M)`(``0@`9%>OH@``)`,``J^C```"
+M@"`M/`(``"1"````0/@)-`69$"0#_`8`0Q`DCZ0````$B$`"-8@AEB,2Y``#
+M&0``0Q`E-$(``0*`("TT!9D0/!```"80```"`/@)`$`P+0*`("V.I2^\/`(`
+M`"1"````0/@)`N`P+98F$LPPQ@'_-,8"``*`("T"`/@)-`69:):B$G`L0E``
+M%$``$8^C``"6X@`",$(`$!!```X``Q!``!880`!U&"&4<!-$`M40(21"$TB`
+M4P`$@%X`!I1B$TBOH@`$E&,34`@`9)BOHP`(``,00`!5$"&44!*B`'40(8!3
+M$L8"U1`A@%X2R0`6$$``51`AE$02J*^D``240A,RKZ(`"`*`("T\$@``)E(`
+M``)`^`DT!9A$)`/`?P!#$"0`$!G`,&,_@`!#$"4"@"`M-`681#P1```F,0``
+M`B#X"0!`,"T"@"`M`D#X"30%F%`D`_\``$,0)#)C`/\`0Q`E`H`@+30%F%`"
+M(/@)`$`P+0*`("T"0/@)-`684#P3__\V<P#_`%,0)``>&@`P8_\``$,0)0*`
+M("TT!9A0`B#X"0!`,"T"@"`M`D#X"30%F$@\`__\-&,/_P!#$"2/HP`$``,C
+M`#P#``,T8_```(,@)`!$$"4"@"`M-`682`(@^`D`0#`MCZ0````$@$`"%8`A
+ME@(2N@`"-@```A0``,(P)98#$L```Q(``,(P)0##,"4"@"`M`B#X"30%F#0"
+M@"`M`D#X"30%F"@`4Q`DE@,2K@`#&@``0Q`E`H`@+30%F"@"(/@)`$`P+0*`
+M("T"0/@)-`689#P#__@T8P__`$,0))8$$K0`!",`/`,`!S1C\```@R`D`$00
+M)0*`("TT!9AD`B#X"0!`,"V6HA)P+$(P`Q!```LD$``"EH,!RB0"$"(48@`3
+M`H`@+9;B``(P0@!`5$``#R00``@(`&44/`(```*`("T\`@``)$(```!`^`D"
+MX"@M$$``!@*`("V/HP````,00`!5$"&40A,F`@*`(3P"```D0@```$#X"30%
+MF20D`_\!`$,0)``0&$`P8P#^`$,0)0*`("T`0#`M/`(``"1"````0/@)-`69
+M)([B`!`00``$`!800(+P`!0(`&4K@O(`%0!5$"&44!.VE%(3N@*`("T\$0``
+M)C$```(@^`DT!9D@)`/X'P!#$"0`$!E`,&,'X`!#$"4"@"`M-`69(#P0```F
+M$````@#X"0!`,"T"@"`M`B#X"30%F2`D`__@`$,0)#)#`!\`0Q`E`H`@+30%
+MF2`"`/@)`$`P+0*`("T"(/@)-`69(#1""``"@"`M-`69(`(`^`D`0#`MEJ02
+M<"R"0`%40``=EJ(2<);B``(P0@#0)`,`T%1#``4"@"`M+()0`%1``!66HA)P
+M`H`@+3P"```D0@```$#X"30%H@P\`_\#-&/__P!#$"2/I``(``0<@#P$`/P`
+M9!@D`$,0)0*`("T`0#`M/`(``"1"````0/@)-`6B#):B$G`L0E`!%$``""0"
+M``$"@"`M-`69X#P"```D0@```$#X"0``,"TD`@`!W[\`6-^^`%#?MP!(W[8`
+M0-^U`#C?M``PW[,`*-^R`"#?L0`8W[``$`/@``@GO0!@)[W_</^_`(C_O@"`
+M_[<`>/^V`'#_M0!H_[0`8/^S`%C_L@!0_[$`2/^P`$``@*`M`*"H+?^@``#_
+MH``(_Z``$*^@`"BOH``LKZ``,#P"```D0ED`:$,``&Q#``>SHP`8MZ,`'SP"
+M```D0ED(B$,``)A#``.$1``$JZ,`(+NC`".GI``DEK$``@`1B<,R,0`!$B``
+M!Y:C`````Q"``$,0(0`"$$`D0J8H"`!EM3!6__\``Q"``$,0(0`"$$`D0D"8
+M,%;__I:B`#@40``A`$"0+0@`9;PT$H``"`!EUP!@D"V6H@`",$(`$!!```(D
+M`P!7)`,`K@``@"TT'H```L.8(P+#N"&.@@'$`H`@+0(`*"T`0/@)`B`P+5!>
+M``VFL@`X,$,__P!S$"H40``$)@(``0+C$"H00/_H)@(``3!0__\N`@`%5$#_
+M\(Z"`<2FL@`X-`*``%9"`&.6H@`"`H`@+3P"```D4@```D#X"30%F2`\`T``
+M`$,0)!!``8K?OP"(`H`@+0)`^`DT!9D,/`,`_S1C__\`0Q`D`H`@+30%F0P\
+M$```)A````(`^`D`0#`M`H`@+0)`^`DT!9D@`$`P+3P"C_\T0O__`,(P)`*`
+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
+M$"0`$I-`/`,``31CX``"0Y`D`%(0)0)@("TT!9@4`@#X"0!`,"W?OP`@W[,`
+M&-^R`!#?L0`(W[````/@``@GO0`P)[W_X/^_`!`LH@!`%$```@"`&"TD!0`_
+MI&4!_`!@("V,91(T/`(``"1"````0/@)`Z`P+=^_`!`#X``()[T`(">]_\#_
+MOP`X_[0`,/^S`"C_L@`@_[$`&/^P`!``@(@M`*"8+0#`H"T`@)`MC(1&>#P0
+M```F$````@#X"8XE1GPF)$:``@#X"20%`""&(@'\*$(`0!1```*6(P'\)`,`
+M/P`#%````CP#*.(`/U!```2.(P(`%.``!P``,"V.(P(```,80#P"```D0ED0
+M`&(8(81F```"("`M`F`H+20(``$#H$@M/`(``B1"HRP`0/@))ZH``A!``+H`
+M`!@MCD(LO`(@("T#H"@M)Z8``@)@."T`0/@)`H!`+1!``+$``!@MCB,!S"0"
+M``<08@`0)`(`"Q!B``XD!``*$&0`#"0"``D08@`+``"`+51D``:60D:>EB(!
+MT"Q"``140``&ED0O])9"1IXD0@`$ID)&G@``@"V61"_T)`4`/P`0$$``4A@A
+ME&)&@`!$$"&D8D:`,$+__RQ"`$!00``!I&5&@"80``$N`@`0%$#_]0`0$$"6
+M0A*>+$(``E!``#N61D:&EB(!TBQ"`$(00``@``"`+99B``(P0@#0)`,`P!1#
+M`!PT%*&`EF,``"0"";048@`-DD,2DI9"$IP`8A@C/`)F9C1"9F<`8@`<```0
+M$@`"$#\``A!#``,?PP!#$",(`&A7,$7__SP"9F8T0F9G`&(`'```$!(``BA^
+M/`(``B1"JJ0`0/@)`B`@+0``@"TT%*&`/`(``"13````$!B``'0H(8Y"1G@`
+M8A@AE&8``@`&,@`TQ@#_``8T`)1B`````A(`-$(`_S!"__\`PC`E`F#X"0(@
+M("TF$``!*@(`(!1`_^\`$!B`ED9&AC#&`#\`!C8`ED)&A#!"`#\``A0``,(P
+M)99"1H(P0@`_``(2``#","660D:`,$(`/P#","4"("`M/!```"80```"`/@)
+M-`69-)9&1HXPQ@`_``8V`)9"1HPP0@`_``(4``#","660D:*,$(`/P`"$@``
+MPC`EED)&B#!"`#\`PC`E`B`@+0(`^`DT!9DXED9&E##&`#\`!C8`ED)&DC!"
+M`#\``A0``,(P)99"1IXP0@`_``(2``#","660D:0,$(`/P#","4"("`M`@#X
+M"30%HC261D:<,,8`/P`&-@"60D::,$(`/P`"%```PC`EED)&F#!"`#\``A(`
+M`,(P)99"1I8P0@`_`,(P)0(@("T"`/@)-`6B.(Y"+]P40``")`8`?R0&`#\"
+M("`M/`(``"1"````0/@)-`69/"0#``$`8!`MW[\`.-^T`##?LP`HW[(`(-^Q
+M`!C?L``0`^``"">]`$`GO?]P_[\`B/^^`(#_MP!X_[8`</^U`&C_M`!@_[,`
+M6/^R`%#_L0!(_[``0`"`L"T`H)@MKZ@`**^I`"ROJ@`P``8T```&-`.OI@`@
+M``<\```'/`.OIP`D`("(+20>`#^OO@`T@*(`!0`"$$`P0O__KZ(`."0"_\&E
+M0@``CZ,`-(^B`"RD0P``/`(``"1"````0/@)))5&@#!2`/\``(`MEL(3=!!`
+M`"2OH``\,E3__S)7`/@`$!!``%$0(91"$W900``9)A```1!4``0P0@`'-$(`
+MX%9"`!0F$``!`!`1@`(B$"$D11?4/`,``B1CK$``8/@)EF0``"0$`.`6Y``'
+M`$`8+3!"__\#PA`K5$```0/`&"T(`&D4,'[__P@`:1D`0/`M)A```98B$W0"
+M`A`J%$#_X0`0$$"68@`",$(`T"0#`,!40P`MK[X`-#)"`/@T4@`!EB(3=!!`
+M`"@``(`M,E3__S)7`/@`$!!``%$0(91"$W900``;)A```1!4``0P0@`'-$(`
+MX%9"`!8F$``!`!`1@`(B$"$D11?4/`,``B1CK$``8/@)EF0``"0$`.`6Y``)
+M`$`8+3!"__^/I``T`((0*U1```$`@!@M,&/__P@`:4.OHP`T"`!I2J^B`#0F
+M$``!EB(3=`("$"I40/_?`!`00`@`:4N68@`"EF(``C!"`0!00``"@B82CX(F
+M$HX"P"`M/`(``"1"````0/@)`F`H+0`"%@```H8#EF,``C!B`$`00`",,&(`
+M(#!B`(!00``$)B873"8F%YX(`&EAEB<7G)8G%TH"P"`M`F`H+3P"``(D0JWX
+M`$#X"0.@0"V/H@`X`%`8(P/#$"I40``!`\`8+0`#%````C0#EF(``C!"`!`0
+M0``:EZ,`!I8B$G`L0C`!5$``")8B$G"6(Q)^`,,0*E1```$`P!@M``,4```"
+M-`.6(A)P+$)``!1```R7HP`&EF(``C!"`(`00``)`,,0*I8C$H``PQ`J5$``
+M`0#`&"T``Q0```(T`Y>C``8`PQ`J5$```0#`&"T``Q0```(4`Z^B`#R/HP`@
+M``,00(^D`#P`@A`C``(4```"-`,$P0`"`,`0+0``$"T``A0```(T`X^B`"0`
+M0!@M`,(0*E1```$`P!@M``,4`(^C`"@08``T``(T`Z:F``BFI@`&IJ8`!*:F
+M``*FI@``EZ0`!#"#__\PPO__`$,0*Q!```(`P"@M`,`@+::D``J7I``",(/_
+M_Y:B````0Q`K5$```9:D``"FI``,EZ0``#"#__^6H@```$,0*U1```&6I```
+MIJ0`#@`$%````AP#EB(2<"Q"0`!40``.EJ(``)9B``(P0@"`4$```I8B$H*6
+M(A*$`,(0*A1```8`P!`MEF(``C!"`(!00``"EB(2@I8B$H2FH@`>CZ0`,(2"
+M```(`&G?KB(O\)>C````PQ`J$$```@#`*"T`P!@M``,4```"'`./H@`LI$,`
+M`(^C`#"D90``EF,``C!B`"`40``$,&,`T"0"`,`48@!;CZ(`*"8F%[Z6)Q>\
+M`L`@+0)@*"T\`@`")$*M^`!`^`DGJ``0CZ0`.`"0&"./I``T`(,0*E1```&/
+MHP`T``,4```"-`.7HP`6`,,0*E1```$`P!@MCZ0`(``$$$``8A`C``(4```"
+M-`,$P0`"`,`0+0``$"T``A0```(T`X^B`"0`0!@M`,(0*E1```$`P!@M``,4
+M`(^C`"@08``=``(T`Y>C`!8`PQ`J5$```0#`&"VFHP`0EZ,`%`##$"I40``!
+M`,`8+::C`!(``Q0```(L`Z:C`!27HP`2`,,0*E1```$`P!@MIJ,`%J:C`!B7
+MHP`0`,,0*E1```$`P!@MIJ,`&@`#%````B0#"`!J.::C`!R7HP`4`,,0*E1`
+M``$`P!@M``,4```"+`.7HP`0`,,0*E1```$`P!@M``,4```")`./HP`LA&(`
+M``""$"I40``!I&0``(^D`#"$@@```$40*E1```&DA0``CZ(`*!!```<D`@`!
+MCZ,`,(1B``"N(B_(EB(ORJ;"`?XD`@`!W[\`B-^^`(#?MP!XW[8`<-^U`&C?
+MM`!@W[,`6-^R`%#?L0!(W[``0`/@``@GO0"0)[W_H/^_`%#_MP!(_[8`0/^U
+M`#C_M``P_[,`*/^R`"#_L0`8_[``$`"`D"T`H*@MC((LP`!`^`D`P*`M$$``
+M-0``&"V&0@'\*$(`0!1```*60P'\)`,`/P`#%````IP#*F(`/U!```2.0P(`
+M%F``!P``N"V.0P(```,80#P"```D0ED@`&(8(81W```2@``@``"(+3P"``(D
+M5J,L`!$0P`*B@"$"0"`M`@`H+0+@,"T"8#@M``!`+0.@2"T"P/@))ZH``A!`
+M`!,``!@MAZ(``H(#``8`0Q`J$$``!(>B``"3H@`#H@(`!H>B``""`P`'`$,0
+M*A!```,F,0`!DZ(``:("``<"-!`K%$#_Y0`1$,`D`P`!`&`0+=^_`%#?MP!(
+MW[8`0-^U`#C?M``PW[,`*-^R`"#?L0`8W[``$`/@``@GO0!@)[W_P/^_`#C_
+ML@`P_[$`*/^P`"``H)`M`("`+821$IHDA4:``Z`@+3P"```D0@```$#X"20&
+M`"`D"``()`L`""0,`#\`"!A``'T8(91B````41`CI&(`````("T``%`M``A(
+M0`!@."V$X@``!$(``:3@```4BP`#`3T8(0@`:N$D!``/A&4````$$$``4!`A
+ME$)&@!2B`!"49@``%*``!"U"`#,DP@`!"`!JVZ1B```40``#E.(```@`:MHD
+M0@`!)$+__Z3B`````"`M)4(``0@`:N$P2O__)((``3!$__\L@@`05$#_X83B
+M````"!!``%T8(81B```H0@!`4$```:1L````"!!``%`0(91%1H``LB@C!*(`
+M`0``*"T`"!!``%T0(81#``".!$9X``,80`!D&"$`!1!``$00(91"``"D8@``
+M)0(``3!(__\M`@`/%$#_O0`(&$`D"``(``@00`!0&"$`71`AE$(``*1B1H`E
+M`@`!,$C__RT"``]40/_X``@00-^_`#C?L@`PW[$`*-^P`"`#X``()[T`0">]
+M_\#_OP`X_[(`,/^Q`"C_L``@`*"`+3"2__\``#`M``80P`!0&"&48@``$$``
+M"``&$$``71`AE&,``*1#```DQ@`!*,(`"!1`__8`!A#``,"(+3#&__\"0"`M
+M`Z`H+2>G`!`\`@``)$(```!`^`DGJ``2&B``#0``,"V7HP`0EZ(``!!B``N7
+MH@`2),8``0#1$"H00``%``800`!=$"&40@``5&+_^B3&``&7HP`0EZ(`$A1B
+M``,`!A#`4'(`!P!0$"$`4!`AC$(`!!!```0D!0`_``80P`!0$"&410`"`*`0
+M+=^_`#C?L@`PW[$`*-^P`"`#X``()[T`0#"$__\PI?__,,;__S#G__\Q"/__
+M`.@`&```$!(00``E```8+1#%`",`X!@M`(48(P`#$$``0Q`A``(0P`!#$"$`
+M`A"``,48(P!#`!H``!`24&```0`'``T``A0```(D`P2``!0`X!@M*((`91!`
+M`!$!`!@M`(@`&```&!(D`@!D`$00(P!'`!@``!`2`&(8(3P"4>LT0H4?`&(`
+M'```$!(``A`_``(10P`#'\,`0Q`C,$/__P/@``@`8!`M)[W_H/^_`%C_M@!0
+M_[4`2/^T`$#_LP`X_[(`,/^Q`"C_L``@`*"H+0#`D"T!`+`M,/#__Q(```T`
+M`"`M``080`!]&"$`!!"``$00(0`"$$``4A`AE$(`"*1B```DA``!`)`0*A1`
+M__8`!!A`EJ0```.@*"T"`#`M)Z<`$#P"```D0@```$#X"2>H`!(``#`M```@
+M+1(``!(``$`MEZ4`$)>C`!(`!!!``%T0(91"``!0H@`!,(;__P`$$$``71`A
+ME$(``%1B``,DA``!"`!KMC"(__\`D!`J%$#_\P`$$$"6I```E[,`$)>T`!(`
+M!HB``B:((0`1B$`",H@AEB<`!@`(@(`""(`A`!"`0`(2@"&6"``&/!(``B92
+MK3P"8"@M`D#X"0*`,"VFP@`&EJ0``)8G``26"``$`F`H+0)`^`D"@#`MIL(`
+M!):D``"6)P`"E@@``@)@*"T"0/@)`H`P+:;"``*6I```EB<``)8(```"8"@M
+M`D#X"0*`,"VFP@``W[\`6-^V`%#?M0!(W[0`0-^S`#C?L@`PW[$`*-^P`"`#
+MX``()[T`8##&__\PA/__``000`!$$"$``A#``$00(0`"((``!C!`E*,````#
+M$$``0Q`A``(0P`!#$"$``A"`)$+_]@""$"L00``#`*8P(0@`;`>4H@``E,/_
+M_@`#$$``0Q`A``(0P`!#$"$``A"`)$(`"@!$$"L00``,`*80*Y3"__ZE`@``
+M`^``"*3B``"E"0```^``"*3I``"DX@``E*(``@/@``BE`@``$$``&P`$%```
+M`E0#A*,````#$$``0Q`A``(0P`!#$"$``A"``$H0(R1"``DL0@`3%$#_[)2I
+M``"4HP`"``,00`!#$"$``A#``$,0(0`"$(`D0O_V`((0*U1`_^64H@``)*4`
+M`@"F$"M40/_IA*,```/@``@``````(`H+92"`=0P0@#P)$+_T"Q"`$`00``1
+M)(8L$#P$```DA%J@C(,`!*RC+!```Q#``$,0(0`"$(`DA``(`$00(:S"`!PD
+M`@`!K,(`&"0"`!2LP@`,"`!L520"`%4\!```)(19,(R#``2LPP````,0P`!#
+M$"$``A"`)(0`"`!$$"&LP@`<)`(``:S"`!@D`@`4K,(`#"0"`",#X``(K,(`
+M$">]__#_OP`(_[```)2"`=0P0@#P)$+_T"Q"`$`00``6`*"`+8R"++``0/@)
+M)`4`!P!`("TD!0`!)`8`)#P"``(D0HS4`$#X"0``."T``$@M)`@`:P``."TD
+M`P`!%$,`)20&`&LD"`!3)`8`4R0"`#<(`&R4K@(`$(R"++``0/@))`4`!P!`
+M("TD!0`&)`8`)3P"``(D0HS4`$#X"0``."T`0"`M)$@`!"0"`#\4@@`#``!(
+M+20(`#(D`@`_$((``@$@."TD!P!`).8`,B0"`#\4@@`"`2`8+24C`!2N`P`,
+M)`(`/Q""``(DP__Q),,`!:X#`!".!0`$`*D0*Q1```0``!@M`040*Q!```D`
+M8!`M`*<0*U1```4D`P`!`,40*Q!```,`8!`M)`,``0!@$"W?OP`(W[````/@
+M``@GO0`0)[W_\/^_``C_L````("`+82&+_2,@B_P`,(P(0`&,D`PQGX`-,:`
+M`#P"```D0@```$#X"30%F3`D`@`!K@(OQ-^_``C?L````^``"">]`!`GO?_@
+M_[\`&/^R`!#_L0`(_[````"`@"T`@)`M))$L$(XB`!@00`!(```8+8R#+\0D
+M`@`!5&(`1(X#+\0\`@``)$(```!`^`DT!9DP`$`8+3!"@`!40``\C@,OQ``#
+M)D(``Q7",$(``R0#``(40P`*KB0`!)8"`=(L0@!"5$``!(XB``26`A*:"`!L
+MX`!$$"$D0@`%KB(`!)9"`=0P0@#P)$+_T"Q"`$!00``-K@`OQ#P"``(D0K8D
+M`$#X"0)`("V.)``$CB,`%`"#$"M40``#KB``!`"#$".N(@`$K@`OQ`)`("T\
+M`@`")$*Q7`!`^`D"("@M5$``%(X#+\0"0"`M/`(``B1"M%``0/@)`B`H+5!`
+M``V.`R_$`D`@+3P"``(D0K2``$#X"0(@*"T80``%)`(``JX"+\0D`@`!K@(O
+MV*X`+\".`R_$`&`0+=^_`!C?L@`0W[$`"-^P```#X``()[T`((RC``2,H@`,
+M`$,0*Q!```4``"`MC*(`$`!B$"L40``"`````"0$``$#X``(`(`0+92"`=0P
+M0@#P)$+_T"Q"`$`00``$/`(``#P"```(`&TJ)$=:H"1'63",I`````00P`!$
+M$"$``A"``.(0(21"``BLH@`<C*(`!(RC`!``0Q`K5$``(XRC``00@`!0)`;_
+M_XRB``2LH@`(C*,`$`!#$"L40``9`&!`+8RB```00`!')`8``8RB```D1O__
+MK*8````&$,``1A`A``(0@`!'$"&,I``<C$,`&(R$`!``9!@C``,80(RD``@`
+M@R`CK*0`""1"``@`B"`K%(```ZRB`!Q4P/_MC*(```@`;8<D!@`!C*(`#`!#
+M$"L40``L```P+8SB```D0O__C*,``!!B`"<D!O_^C*,`!*RC``B,H@`,`$!`
+M+0!#$"L40``@)`8``HSC```D8___C*(```!`("T`0Q`K$$``&0`````DA@`!
+MK*8````&$,``1A`A``(0@`!'$"&,I``<C$,`&(R$`!``9!@C``,80(RD``@`
+M@R`CK*0`""1"``@!!"`K%(``!JRB`!R,X@``)$+__P#"$"L40/_J`,`@+20&
+M``(#X``(`,`0+2>]_]#_OP`H_[0`(/^S`!C_L@`0_[$`"/^P````@(`M))(L
+M$*Y``!2,@BRP`$#X"20%``<`0"`M)`4``20&`"0\`@`")%.,U`)@^`D``#@M
+M`$"(+20"``$6(@`=W[\`*(Y"`!R$5```C@(LL`(`("T`0/@))`4`!P!`("TD
+M!0`$)`8`(`)@^`D``#@M$I$`#@!`&"U2@``-KD``%"0"``(2@@`&``,00"0"
+M``,2@@`%W[\`*`@`;;[?M``@"`!MNR1"__L``Q!`KD(`%-^_`"C?M``@W[,`
+M&-^R`!#?L0`(W[````/@``@GO0`P)[W_T/^_`"#_LP`8_[(`$/^Q``C_L```
+M`("0+0"@("T`P(@M`."`+0$`F"T\`@``)$(```!`^`D`P"@M`$`X+28&__\`
+M!C#")A#__QH@`!\R$``')`D``0`30,`D"@`(`A$8(2AB``E00``!)`,`"`!I
+M&`0D8___`@D0!"1"__\`8A@F`0,8!``&*(``LB@A``,@)XRB````@B`D`@<0
+M!`$"$`0`0Q`D`$00):RB```",!`A)%'_^`%0$",`1S@&``"`+1X@_^8DQ@`!
+MW[\`(-^S`!C?L@`0W[$`"-^P```#X``()[T`,">]_[#_OP!(_[X`0/^W`#C_
+MM@`P_[4`*/^T`"#_LP`8_[(`$/^Q``C_L````("8+92B``(P0D``$$```P"@
+MH"T(`&X:)`4"`(2B``($0P`#E*(``@@`;AHD!00`,$(`$!1```(D!0`")`4!
+M``)@("T\`@``)$(```!`^`D``)`M`$"(+8Q"```80``;/`(``"17```T%H<`
+M/`(``"15````$H!``A*`(0`0@(`"$8`A)A``()('``L"8"`M`B`H+20&``X"
+MX/@)``!`+9(%``@`!2B``+8H(0)@("T"H/@)`$`P+292``&.(@```D(0*A1`
+M_^P`$H!`EH(``C!"`!`40``YW[\`2`)@("T\`@``)$(```!`^`DD!0`(`$"(
+M+8Q"```80``O``"0+307AP`\'@```!(00`!2$"$``A"``%$0(210`""2`@`(
+M``(0@`!7H"&2`@`%5$``'B92``&2!P`+`F`@+0(@*"TD!@`./`(``"16```"
+MP/@)``!`+0)@("T"@"@M)]4```*@^`D`0#`MD@(`"5!```XF4@`!``(0@`*"
+MH"&2!P`+`F`@+0(@*"TD!@`.`L#X"20(``$"8"`M`H`H+0*@^`D`0#`M)E(`
+M`8XB```"0A`J%$#_U@`2$$#?OP!(W[X`0-^W`#C?M@`PW[4`*-^T`"#?LP`8
+MW[(`$-^Q``C?L````^``"">]`%`GO?_0_[\`*/^T`"#_LP`8_[(`$/^Q``C_
+ML````("(+0"@@"T\`@``)$(```!`^`DT!8`<,$8_@)8"``(P0D``4$``""03
+M`-(D$P$$/`0?@#P"`!LD`P`3)!(-K`@`;J$D%``4/`0?@#P"`#8D`P`))!(-
+M2"04``H`9C`E`,(P)0#$,"4"("`M/!```"80```"`/@)-`6`'`(@("TD!1!P
+M`@#X"0)@,"T"("`M)`40L`(`^`D"0#`M`B`@+3P"```D0@```$#X"20%$/`\
+M`__P-&,#_P!#$"0`%!J``$,0)0(@("TD!1#P`@#X"0!`,"W?OP`HW[0`(-^S
+M`!C?L@`0W[$`"-^P```#X``()[T`,">]_]#_OP`H_[0`(/^S`!C_L@`0_[$`
+M"/^P````H(`MC(4L1#P"?_\T0O__`*(H)#P"```D0@```$#X"0"`F"T`0*`M
+M`F`@+3P"```D0@```$#X"20%`#``0!@M,%$#\``1B0(2```&`B"0+20"`"4`
+M41`C``(00@@`;NH"(I`A+B(``E!```$F,O__$E$`"B0&_`\`9C`D`!(1`#!"
+M`_``PC`E`F`@+3P"```D0@```$#X"20%`#`"8"`M/`(``"1"````0/@)`H`H
+M+0)1$"8``A`KW[\`*-^T`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`GO?_P
+M_[\```"@&"V4@@'H`*(0*A!```H``"@M``,I``"C*",`!2B``(4H(3P"```D
+M0@```$#X"22E+.``0"@M`*`0+=^_```#X``()[T`$">]__#_OP```,!`+92"
+M`>@`HA`J$$``"P``&"T`!3$``,4P(P`&,(``AC`A),8LX#P"```D0@```$#X
+M"0$`*"T`0!@M`&`0+=^_```#X``()[T`$">]_\#_OP`P_[4`*/^T`"#_LP`8
+M_[(`$/^Q``C_L````("8+0"@D"T`P*`M)(,!X"0"``(0H@`/)!4`"RRB``,0
+M0``&)`(``R0"``%0H@`>E&(`"`@`;Y@D`___$*(`"B0"``10H@`.E'$`"`@`
+M;W(D`___E'$`""8Q__\\`@`%"`!O4S1"`,"4<0`()C'__CP"``4T0@'`"`!O
+M=`*BJ"4F,?_]`!$1``!1$",``A"``$00(8Q"+.040``\)`/__P@`;W4`$1$`
+M`$`H+1!```P``(@M`!$1``!1$",``A"``$00(8Q"+.100``&E&(`""8Q``$"
+M)1`J%$#_]P`1$0"48@`($B(`*20#__\(`&]U`!$1``@`;YD`8!`M`!$1``!1
+M$",``A"``(*`(280+.".`@`$%$``'20#__\"`"`M/`(``"1"````0/@))`4`
+M/!:```VN$@`$KA4`#"0"``*N`@`4)`+__ZX"`!@D`@/_K@(`'"0"``JF`@`@
+MI@(`(@@`;Y>N```TCH(`,*X"`#0"8"`M`B`H+3P"```D0@```$#X"0*`,"T"
+M(!@M`&`0+=^_`##?M0`HW[0`(-^S`!C?L@`0W[$`"-^P```#X``()[T`0">]
+M_^#_OP`8_[(`$/^Q``C_L````("`+8R&+,PPQ@/_C((LU``"%``\$@/_`%(0
+M)`#","4\$0``)C$```(@^`DD!0"DC@8LT##&`_^.`BS8``(4``!2$"0`PC`E
+M`@`@+0(@^`DD!0"H`@`@+3P"```D0@```$#X"20%`*PD`_P``$,0)(X#+-PP
+M8P/_`$,0)0(`("TD!0"L`B#X"0!`,"W?OP`8W[(`$-^Q``C?L````^``"">]
+M`"`GO?_P_[\``)2"`>@`HA`K$$``(0``&"T`!1$``$40(P`"$(``@C@A).<L
+MX(SB``000``:`&`0+:S@``0D`P`!`*,8!``#&">,@BS,`&(0)*R"+,R,@BS0
+M`&(0)*R"+-",@BS4`&(0)*R"+-2,@BS8`&(0)*R"+-B,@BS<`&(8)*R#+-P\
+M`@`")$*^B`!`^`D`X"@M)`,``0!@$"W?OP```^``"">]`!`GO?^P_[\`0/^W
+M`#C_M@`P_[4`*/^T`"#_LP`8_[(`$/^Q``C_L````("0+0"@F"T`@*`MC(02
+M-)9"`>@`HA`K$$`!/```&"T`!1$``$40(P`"$(`"0H@A)C$LX(XB``000`$T
+M)`,``8XC`!@D`O__5&(`$XXF`!@0@``%)`,`H)2"``(P0@"@$$,``B0$`!\D
+M!``/)`8``0#$$"L00``)`!.`@``&$$`T1@`!`,00*Q1`__T`!A!`"`!P*P`3
+M@(``$X"`)@400##&`_^.(P`<``,:@#P"``\T0OP``&(8)`##,"6.(@`4``(5
+M`#P##_``0Q`D`,(P)3P"```D50```J#X"0)`("TF!1"`EB8`(@`&,0`PQ@#P
+MEB(`(#!"``\`PC`E/`(`"#1"(```PC`E`J#X"0)`("TD%@@`CB(`)!!```XD
+M%P$`)@4(P#P&`/\TQO__`$8P)(XB`"@``A8``,(P)0*@^`D"0"`MCB(`*!!`
+M``(D%@@!)!8)`8XB`#!00``-`!,0@``3*(`DI0D`/`8`_S3&__\`1C`D/`(!
+M``#","4\`@``)$(```!`^`D"0"`M`!,0@"1%$,".(P`L/`(`#S1"__\08``#
+M`&(P)#P"`!``PC`E/`(``"1"````0/@)`D`@+8XB`#`00``%CB(`##!"`"!4
+M0``!-M8"`(XB``PP0@!`$$``!3+"``\D`O_P`L*P)#;6``(RP@`/$$``#XXB
+M``PP0@$`$$```R0"_[\(`'"*-M8`0`+"L"2.(@`,,$(`@!!```,D`O_?"`!P
+MD3;6`"`"PK`DCB(`##P#``$`0Q`D4$``!(XB``P\`@`@`N*X)8XB``P\`P"`
+M`$,0)%1```$V]P(`CB(`##P#``0`0Q`D5$``!P+CN"6.(@`,/`,``@!#$"10
+M0``#CB(`#`+CN"6.(@`,/`,`"`!#$"140``!-O=``(XB``P\`P`0`$,0)%1`
+M``$"X[@ECB,`!"0"``)08@`&-M8`HB0"``-08@`%CB(`,`@`<-6.(@`X"`!P
+MTSP"`"440``4-M8`8CP"``",0P``/`(``(Q"````8A@CCH8OY`##,",\`@``
+MC$(```#",",`!C*``!,H@"2E"0`\`@$``,(P)3P"```D0@```$#X"0)`("T\
+M`@`$`N*X)8XB`#@P0@`!$$```P`3@(`\`@`D`N*X)285"<`"0"`M`L`P+3P"
+M```D5@```L#X"0*@*"TF$!$``D`@+0(`*"T"P/@)`N`P+8XB`#100``9CB(`
+M#``3,$`DQ@!0`D`@+0+`^`DD!0L``D`@+20%"P0"P/@)CB8`-`)`("TD!0L(
+M`L#X"20&``D"0"`M/`(``"1"````0/@)`J`H+31"$``"0"`M`J`H+0+`^`D`
+M0#`MCB(`##!"``$00``%)`(``0)B$`2.@RS,"`!Q#`!#$"4"8A`$``(0)XZ#
+M+,P`0Q`DKH(LS(XB``PP0@`!$$``!20"``$"8A`$CH,LT`@`<1D`0Q`E`F(0
+M!``"$">.@RS0`$,0)*Z"+-".(@`,,$(``A!```4D`@`!`F(0!(Z#+-0(`'$F
+M`$,0)0)B$`0``A`GCH,LU`!#$"2N@BS4CB(`##!"``000``%)`(``0)B$`2.
+M@RS8"`!Q,P!#$"4"8A`$``(0)XZ#+-@`0Q`DKH(LV(XB``PP0@`($$``!20"
+M``$"8A`$CH,LW`@`<4``0Q`E`F(0!``"$">.@RS<`$,0)*Z"+-P"0"`M/`(`
+M`B1"OH@`0/@)`B`H+20#``$`8!`MW[\`0-^W`#C?M@`PW[4`*-^T`"#?LP`8
+MW[(`$-^Q``C?L````^``"">]`%`GO?_P_[\````%*(`\`@``)$(```!`^`DD
+MI0@`W[\```/@``@GO0`0)[W_\/^_````!2B`/`(``"1"````0/@))*4(`"0"
+M``'?OP```^``"">]`!`GO?_P_[\``"0&``$`IC`$/`(``"1"````0/@))`4(
+M0"0"``'?OP```^``"">]`!`GO?_0_[\`(/^S`!C_L@`0_[$`"/^P````@)@M
+M`*"(+0`%*(`\`@``)%(```)`^`DDI0H`,%```Q8```H"`!`M`F`@+0)`^`DD
+M!0A`)`,``0(C&`0`0Q`D5$```200``$"`!`MW[\`(-^S`!C?L@`0W[$`"-^P
+M```#X``()[T`,">]_[#_OP!`_[<`./^V`##_M0`H_[0`(/^S`!C_L@`0_[$`
+M"/^P````@)`M`*"8+20&``$`IC`$/`(``"1"````0/@))`4(@"05`^@\`@``
+M)%$``#P"```D4````D`@+0(@^`D"8"@M$$``!@)`("T"`/@))`0`9":U__\6
+MH/_X`D`@+3P"```D0@```$#X"0)@*"T00`!H`D`@+8Y#`<PD`@`'$&(`#20"
+M``L08@`+)`0`"A!D``DD`@`)4&(`"```B"T49`!<`D`@+99"`=`L0@`$4$``
+M620%"(```(@M/`(``"16```\`@``)%0``#P7``$"0"`M`L#X"30%@$P`0(`M
+M`D`@+30%@0`\!@`*`H#X"33&`&0`$(*",@;__P#7,"4"0"`M`H#X"30%@/P"
+M0"`M`L#X"30%@$P``A*"$%``!0)`("TF,0`!+B(``A1`_^D`````/!$``"8Q
+M```"(/@)-`6`2#P#`$``0Q`E`D`@+30%@$@\$```)A````(`^`D`0#`M/`(`
+M`"1"````0/@))`0`R`)`("T"(/@)-`6`_#P#__XT8___`$,0)`)`("TT!8#\
+M`@#X"0!`,"TD$`!D/`(``"14```\`@``"`!R#B11```2```)`D`@+0(@^`DD
+M!``*`D`@+0*`^`D"8"@M%$#_^"80__\"0"`M/`(``"1"````0/@)-`6`2#P#
+M_[\T8___`$,0)`)`("T`0#`M/`(``"1"````0/@)-`6`2`)`("TD!0B`/`(`
+M`"1"````0/@)```P+0`5$"O?OP!`W[<`.-^V`##?M0`HW[0`(-^S`!C?L@`0
+MW[$`"-^P```#X``()[T`4(^M``"/K``(CZX`#(2"+_0!(D@A+2(`0!1```(`
+MH#@M)`D`/S#"#_\`"1P``$,P)3&"`"`00``$CZ(`!#P"`(``PC`ECZ(`!``"
+M%D`\`QX``$,0)`#"&"4Q@@`!$$``!#&"`!`\`@$``&(8)3&"`!`00``"/`(@
+M``!B&"6HXP`(N.,`"P`(+0"/I``<``0F0(^C`!0``Q]`CZ(`&``"%L``I"@E
+M`*,H)0"B*"4Q@@`"$$```CP"`0``HB@EJ.4`#+CE``\`"Q0`/`,`#P!#6"0Q
+M@@!`5$```35K@`"HZP`0N.L`$ZCJ`!2XZ@`7)`+__Q&B``\`#1M`B.0`#)CD
+M``\\`@`/-$+@``!B&"0`@R`EJ.0`#+CD``^(X@`(F.(`"SP#0```0Q`EJ.(`
+M"+CB``LQ@@`,4$``(R0#``$\`G\`-$+_``'"$`<P0@`!$$``'0``&"V(Y``(
+MF.0`"S&"``@40``"/`.`````&"TQ@@`$4$``!`"#$"4\`@!``&(8)0"#$"6H
+MX@`(N.(`"XCC`!"8XP`3CZ(`$#!"?_\`8A@EJ.,`$+CC`!.(X@`4F.(`%P`.
+M'0``0Q`EJ.(`%+CB`!<D`P`!`^``"`!@$"T0X``/``<5`(BC`!"8HP`3/`0`
+M\`!$$"0`8A@E-&.``*BC`!"XHP`3B*(`%)BB`!<`!AE``$,0):BB`!2XH@`7
+M$2``#P`)%@"(HP`0F*,`$SP$#P``1!`D`&(8)31C@`"HHP`0N*,`$XBB`!28
+MH@`7``@:@`!#$"6HH@`4N*(`%Q%@``T`"Q\`B*(`$)BB`!,`0Q`E-$*``*BB
+M`!"XH@`3B*(`%)BB`!<`"AO``$,0):BB`!2XH@`7`^``""0"``&(H@`(F*(`
+M"SP#(```0Q`EJ*(`"`/@``BXH@`+$.``"@````"(H@`,F*(`#Q4```(`1A`E
+M-$(0`*BB``RXH@`/"`!S`@``$"T1```/```8+:B@``BXH``+J*8`#+BF``^)
+M(@`0F2(`$ZBB`!"XH@`3B2(`%)DB`!>HH@`4N*(`%P@`<P(``!`MJ*,`"+BC
+M``LTPA``J*(`#+BB``^HHP`0N*,`$ZBC`!2XHP`7```0+:BB`!RXH@`?J*(`
+M&+BB`!L#X``()`(``8BB`!R8H@`?,$(``1!``)$D`P`/B*(`')BB`!\P0A_^
+M``(00J3"``"(H@`8F*(`&P`"%`*DP@`"H,``!(BB`!B8H@`;,$(``11``!<`
+M````B*(`&)BB`!LP0@`"$$```B0"``&@P@`$B*(`&)BB`!LP0@`($$``!```
+M``"0P@`$-$(``J#"``2(H@`8F*(`&S!"``000``$`````)#"``0T0@`$H,(`
+M!(BB`!R8H@`?``(50C!"``.@P@`+,$,`_R0"``$08@`3`````"AB``)00``%
+M)`(``A!@``H`````"`!S7@`````08@`/`````"0"``,08@`1``````@`<UX`
+M````B*(`%)BB`!<(`'-=,$(`'XBB`!28H@`7,$(#X`@`<UL``A%"B*(`%)BB
+M`!<P0GP`"`!S6P`"$H*(H@`4F*(`%P`"$\(P0@`?)`/_@`!#$"6@P@`%B*(`
+M')BB`!\``A-"H,(`!HBB`!B8H@`;,$(`\``"$0*@P@`'B*(`&)BB`!LP0@\`
+M``(2`J#"``B0PP`+)`(``A!B`!(`````*&(``Q!```8D`@`#)`(``1!B`!,`
+M````"`!SCP`````48@`6`````(BC`!"8HP`3``,>`C!C``^0P@`(`$,0(:#"
+M``B(HP`0F*,`$P`#'0(P8P`/D,(`"`!#$"&@P@`(B*,`$)BC`!,``QP",&,`
+M#Y#"``@`0Q`AH,(`"(BB`!B8H@`;,$+P```"$P*@P@`)B*,`')BC`!\\`@$`
+M`&(8)"QC``$D`@`"`$,0(Z#"``H``!@M`^``"`!@$"V,H@``C(-&H`!#$"2L
+MH@````(0)XR#1J``0Q`D`^``"*R"1J`GO?_@_[\`$/^Q``C_L````("(+3P"
+M```D0@```$#X"22%+(0"("`M-`6!)#P0```F$````@#X"0``,"T"("`M-`6!
+M*`(`^`D``#`M`B`@+20%`$`"`/@)```P+0(@("TT!8$P`@#X"3P&``("("`M
+M-`6!.`(`^`D\!@(`W[\`$-^Q``C?L````^``"">]`"`GO?_@_[\`$/^Q``C_
+ML````("(+20%`$`\$```)A````(`^`DD!@`&)B4LA#P"```D0@```$#X"0(@
+M("T"("`M-`6!)`(`^`D``#`M`B`@+30%@2@"`/@)```P+=^_`!#?L0`(W[``
+M``/@``@GO0`@```P+0`&$$``1A`A``(0@`!&$",``A#``$00(91#,"B4H@``
+M$&(`%P#`."T`!A!``$80(0`"$(``1A`C``(0P`!$&"&48C`H%$``"21G,"B4
+MH@``I&(P*)2B``*DX@`"D*(`!*#B``0(`'0)`,`X+23&``$LP@!`5$#_XP`&
+M$$```#@M`^``"`#@$"T#X``(C((P)">]__#_OP`(_[````"`@"T\`@``)$(`
+M``!`^`DDA2R$)A`L2`(`$"W?OP`(W[````/@``@GO0`0)[W_T/^_`"#_LP`8
+M_[(`$/^Q``C_L````("0+0"@F"T`@(@MW((!X``"$?XP0@`!K((P'"2$,"@\
+M`@``)$(```!`^`DD!18````H+20.``<D#0`")`P!]"0&`,@D"P!D)`H`*"0)
+M``<\"`"_-0C^##P'`+\TY_\XCD(!S"Q"``<00``(``400`!%$"$``A"``$40
+M(P`"$,``41`A"`!T2J!.,#``11`A``(0@`!%$",``A#``%$0(:!-,#``!1!`
+M`$40(0`"$(``11`C``(0P`!1("&LC#`\K(8P0*R&,$2LBS!(K(HP4*R),$PD
+M@C`PH$``!*!```60@S`PH$,``J!```..(C`<$$```R2E``&LB#!LK(<P<"RB
+M`$!40/_7CD(!S(XB,!P00``0)`(`9`)`("TT!8$L/!```"80```"`/@)CB8P
+M;`)`("TT!8$T`@#X"8XF,'`\`@``)$(```!`^`D"0"`M)`(`9!)@``2N(C`@
+MCB(P&`@`='XT0@`!CB(P&"0#__X`0Q`DKB(P&-^_`"#?LP`8W[(`$-^Q``C?
+ML````^``"">]`#`GO?_@_[\`$/^Q``C_L```C((P'!!```X`@(@M/`(``"1"
+M````0/@)/!````(@("TT!8$L)A````(`^`D``#`M`B`@+30%@30"`/@)```P
+M+=^_`!#?L0`(W[````/@``@GO0`@)[W_D/^_`&C_M@!@_[4`6/^T`%#_LP!(
+M_[(`0/^Q`#C_L``P`("8+0"`H"V,E3`D+*(`!Q!``=8``!@M``40@#P#```D
+M8UQX`$,0(8Q"````0``(``````#`L"TLP@`%$$`!RP``&"T\$@``)E(```)`
+M^`DT!9A0/`/P#S1C__\`0Q`D`!:(@`(SB"&.(T8H``,=`#P$#_``9!@D`$,0
+M)0)@("TT!9A0/!```"80```"`/@)`$`P+0)@("T"0/@)-`687"0#@'\`0Q`D
+MCB-&4``#&<`P8W^``$,0)0)@("TT!9A<`@#X"0!`,"T"8"`M`D#X"30%F%P\
+M`__`-&-__P!#$"2.)$8\``0CP#P#`#\T8X```(,@)`!$$"4"8"`M-`687`(`
+M^`D`0#`M`F`@+0)`^`DT!9A8/`/\`S1C__\`0Q`DCB-&9``#'(`\!`/\`&08
+M)`!#$"4"8"`M-`686`(`^`D`0#`MDJ(`"0!6$"M00``%DJ(`"8YB+$@D0@`!
+M"`!U!ZYB+$@"PA`K4$`!?Z*V``F.8BQ,)$(``:YB+$P(`':"HK8`"3P"```D
+M0EP0:$,``&Q#``>SHP``MZ,`!SP"```D0EP8:$,``&Q#``>SHP`(MZ,`#SP"
+M```D0EP@:$,``&Q#``>SHP`0MZ,`%SP"```D0EPH:$,``&Q#``>SHP`8MZ,`
+M'SP"```D0EPP:$,``&Q#``>SHP`@MZ,`)SP"```D0EPX:$,``&Q#``>SHP`H
+MMZ,`+P`&L"L"8"`M/`(``"12```"0/@)-`68;#P#_^`T8S__`$,0)``6@(`"
+M'8`AC@0````$(X`\`P`?-&/```"#("0`1!`E`F`@+0!`,"T\`@``)%$```(@
+M^`DT!9AL`F`@+0)`^`DT!9AL/`/P'S1C__\`0Q`DC@,`"``#'4`\!`_@`&08
+M)`!#$"4"8"`M-`68;`(@^`D`0#`M`F`@+0)`^`DT!9AH/`/_`31C__\`0Q`D
+MC@,`$``#'$`\!`#^`&08)`!#$"4"8"`M-`68:`(@^`D`0#`M`F`@+0)`^`DT
+M!9AH/`.`_S1C__\`0Q`DC@,`&``#'@`\!'\``&08)`!#$"4"8"`M-`68:`(@
+M^`D`0#`M`F`@+0)`^`DT!9AH)`/_X`!#$"2.`P`@,&,`'P!#$"4"8"`M-`68
+M:`(@^`D`0#`M`F`@+0)`^`DT!9AL)`/`_P!#$"2.`P`H``,:`#!C/P``0Q`E
+M`F`@+30%F&P"(/@)`$`P+1+```H"8"`M`D#X"30%F&PT0@`!`F`@+30%F&P"
+M(/@)`$`P+0@`=:(NPP`!/`(``"1"````0/@)-`68;"0#__X`0Q`D`F`@+0!`
+M,"T\`@``)$(```!`^`DT!9AL+L,``9*B``P08@#?)`,``5+```6.@BQ<CH(L
+M6"1"``$(`'6MKH(L6"1"``&N@BQ<+L(``0@`=H*BH@`,/`(``"1"7$!H0P``
+M;$,`![.C``"WHP`'``:`*P)@("T\`@``)$(```!`^`DT!:(()`/_P`!#$"0`
+M$!B``'T8(8QC```P8P`_`$,0)0)@("T`0#`M/`(``"1"````0/@)-`6B")*B
+M``T2`@"X)`,``5(```6.8BQDCF(L8"1"``$(`'74KF(L8"1"``&N8BQD"`!V
+M@J*P``T\`@``)$)<2&A#``!L0P`'C$0`"+.C``"WHP`'KZ0`"`#`@"TLP@`#
+M$$``H@``&"T"8"`M/`(``"1"````0/@)-`686#P#__PT8P__`$,0)``0&(``
+M?1@AC&0````$(P`\`P`#-&/P``"#("0`1!`E`F`@+0!`,"T\`@``)$(```!`
+M^`DT!9A8DJ(`"P!0$"M00``%DJ(`"XYB+&@D0@`!"`!V!JYB+&@"`A`K4$``
+M@**P``N.8BQL)$(``:YB+&P(`':"HK``"SP"```D0EQ8:$,``&Q#``=H1``(
+M;$0`#VA%`!!L10`7:$<`&&Q'`!^SHP``MZ,`![.D``BWI``/LZ4`$+>E`!>S
+MIP`8MZ<`'P#`@"TLP@`($$``9@``&"T"8"`M/`(``"1"````0/@)-`69)"0#
+M_P$`0Q`D`!`8@`!]&"&,8P````,80#!C`/X`0Q`E`F`@+0!`,"T\`@``)$(`
+M``!`^`DT!9DDDJ(`"@!0$"M00``%DJ(`"HYB+%`D0@`!"`!V/ZYB+%`"`A`K
+M4$``1Z*P``J.8BQ4)$(``:YB+%0(`':"HK``"A3``!6,@C`8)`/__0!#$"2L
+M@C`8/`(``"1"````0/@)`````#P"```D0@```$#X"0)@("TD`_[_`$,0)`!`
+M*"T\`@``)$(```!`^`D"8"`M"`!V@R0#``$P0@`"%$``*B0#``&,@C`<$$``
+M&CP"```D0@```$#X"3P0```D`_[_`$,0)`!`*"T\`@``)$(```!`^`D"8"`M
+M`F`@+30%@2PF$````@#X"8YF,&P"8"`M-`6!-`(`^`F.9C!P/`(``"1"````
+M0/@)`F`@+0@`=H".@C`8)$(```!`^`D`````-$(!``!`*"T\`@``)$(```!`
+M^`D"8"`MCH(P&#1"``*N@C`8)`,``0!@$"W?OP!HW[8`8-^U`%C?M`!0W[,`
+M2-^R`$#?L0`XW[``,`/@``@GO0!P)[W_T/^_`"#_LP`8_[(`$/^Q``C_L```
+M`("0+8R1,"2N(``0C((P'!!``"H`@)@MCB,`%#P"`,``0Q`K$$```SP"`,`(
+M`':CKB``1`!#$".N(@!$CB,`'#P"`,``0Q`J$$```SP"`,`(`':LKB``2`!#
+M$".N(@!(`D`@+30%@2P\$```)A````(`^`F.)@!$`D`@+30%@30"`/@)CB8`
+M2`)`("TT!8$P`@#X"3P&``("0"`M-`6!.`(`^`D\!@(`)F4LA#P"```D0@``
+M`$#X"0)`("VN(``\KB``0-^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`G
+MO?_@_[\`$/^Q``C_L````("(+8R",!@P0@`#)`,``Q1#`%F,A1(TC)`P))(&
+M``DLP@`$4$``!)(&``HDQ@`!"`!W*B0%``&2`@`(`,(0*U!```2,@RR8),8`
+M`0@`=RHD!0`%,&(`?RQ"`$!40``$C((LF"1C`'\(`';M``,9P@`"&<*.`@`H
+M`$,0*E!``!".`@`DD@(`#%1``!J2!@`+`B`@+20%``(\$```)A````(`^`D`
+M`#`M`B`@+20%``4"`/@)```P+0@`=R_?OP`0`$,0*A!``!(\`@``D@(`#%!`
+M``B2!@`+`B`@+20%``(\`@``)$(```!`^`DD!@`!D@8`"RS"``(00``@W[\`
+M$"3&``$"("`M"`!W*B0%``0D0@```$#X"0(@("TD0O_^+$(``A!``!7?OP`0
+MD@(`#%1```B2`@`+`B`@+20%``(\`@``)$(```!`^`D``#`MD@(`"Q!```G?
+MOP`0`B`@+20%``0``#`M/`(``"1"````0/@)`````-^_`!#?L0`(W[````/@
+M``@GO0`@)[W_X/^_`!#_L0`(_[````"`@"V,@C`8,$(``R0#``,40P`NC(42
+M-(R1,"22)@`)+,(`!%!```2,@RR8),8``0@`=V8D!0`!,&(`?RQ"`$!40``$
+MC((LF"1C`'\(`'=-``,9P@`"&<*.(@`D`$,0*A!```D\`@``DB8`"RS"``(0
+M0``7W[\`$"3&``$"`"`M"`!W9B0%``0D0@```$#X"0(`("TD0O_^+$(``A!`
+M``S?OP`0DB(`"Q!```K?L0`(`@`@+20%``0``#`M/`(``"1"````0/@)````
+M`-^_`!#?L0`(W[````/@``@GO0`@)[W_T/^_`"#_LP`8_[(`$/^Q``C_L```
+M`("(+0"@@"T`@)@M/`(``B1"SZ``0/@)C(42-``"&$``8A@A``,8@`!B&",`
+M`QC``B.0(292,"BN,C`DCB,!W"0"``$48@`#CB(P&`@`=XPT0@`")`/__0!#
+M$"2N(C`8CB,!W"0"``$08@`I`B`@+8YB+'@D0@`!KF(L>"0%``$\$```)A``
+M``(`^`D``#`M`B`@+20%``4"`/@)```P+0(@("TD!0`$`@#X"0``,"T"("`M
+M)`4``@(`^`D``#`M`B`@+20%``,"`/@)```P+3P"```D0@```$#X"0(@("TT
+M0@$``$`H+3P"```D0@```$#X"0(@("T\`@`")$+:.`!`^`D"("`M"`!X&-^_
+M`"".(C`8,$(``R0#``,40P!;W[\`(!(``!<"("`MDD8`"3P0```F$````@#X
+M"20%``&21@`*`B`@+0(`^`DD!0`%DD8`#"S&``$"("`M`@#X"20%``*21@`-
+M`B`@+0(`^`DD!0`#DD8`"P(@("T(`'?J)`4`!"0%``$\$```)A````(`^`DD
+M!@`$DD8`"`(@("T"`/@))`4`!0(@("TD!0`"`@#X"20&``$"("`M)`4``P(`
+M^`DD!@`!`B`@+20%``0D!@`"`@#X"0````".8C`<$$``'#P"``(\`@``)$(`
+M``!`^`D"("`M)`/^_P!#$"0`0"@M/`(``"1"````0/@)`B`@+3P"``(D0MHX
+M`$#X"0(@("T"("`M-`6!,#P0```F$````@#X"3P&``("("`M-`6!.`(`^`D\
+M!@(`"`!X&-^_`"`D0MHX`$#X"0(@("T\`@``)$(```!`^`D"("`M-$(!``!`
+M*"T\`@``)$(```!`^`D"("`MW[\`(-^S`!C?L@`0W[$`"-^P```#X``()[T`
+M,">]_]#_OP`@_[,`&/^R`!#_L0`(_[````"`D"T`H(@M`("8+30%@20\$```
+M)A````(`^`D``#`M`D`@+30%@2@"`/@)```P+29%+(0\`@``)$(```!`^`D"
+M0"`M:B(``&XB``>.(P`(LD(LF+9"+)^N0RR@`D`@+3P0```F$````@#X"30%
+M@2P`0(@M`D`@+0(`^`DT!8$T`$`H+3P#`,`"(Q`D$$,``P"C$"040P`IW[\`
+M((YP,"2.!`!$`B0@(XX"`#P`@A`CCF,L<`!#$"&N8BQPK@0`/(X$`$@`I"`C
+MC@(`0`""$"..8RQT`$,0(:YB+'2N!`!`C@,`/(X"`!0`0Q`K4$``!HX#`$`\
+M`@`")$+;,`!`^`D"0"`MC@,`0(X"`!P`0Q`K$$``!CP"``(\`@`")$+<S`!`
+M^`D"0"`M/`(``B1"VC@`0/@)`D`@+=^_`"#?LP`8W[(`$-^Q``C?L````^``
+M"">]`#`GO?_P_[\`"/^P````@(`MD*,`!20"`!$48@`/C(8P)(S"`#PD0@`!
+MK,(`/(R"+'`D0@`!K((L<(S#`#R,P@`4`$,0*Q!``!O?OP`(/`(``@@`>)\D
+M0MLP)`(`&11B`!7?OP`(C,(`0"1"``&LP@!`C((L="1"``&L@BQTC,,`0(S"
+M`!P`0Q`K4$``"]^P```\`@`")$+<S`!`^`D`````/`(``B1"VC@`0/@)`@`@
+M+=^_``C?L````^``"">]`!`GO?_P_[\``(R#+)@P8@!_+$(`0!1```2,A3`D
+M)&,`?P@`>+4``QG"C((LF``"&<*,H@`H`$,0*E1``!"0I@`*C*(`)`!#$"I0
+M0``'D*8`"Y"B``Q00``$D*8`"R0%``((`'C1)`8``5#```20I@`*),;__P@`
+M>-$D!0`$4,``!)"F``DDQO__"`!XT20%``40P``(W[\``"3&__\D!0`!/`(`
+M`"1"````0/@)`````-^_```#X``()[T`$">]_]#_OP`@_[,`&/^R`!#_L0`(
+M_[````"`B"T\$```)A````(`^`DT!8#L`$"8+0(@("T"`/@)-`6`\`!`D"T"
+M("`M`@#X"30%@/@`0#`MCB4P)(RB`#@00``%```8+0#"$"M00``&C*0`.```
+M&"V.(BQ\)$(``0@`>0>N(BQ\`,0@(XRC`#0"0Q@CC*(`,`)B$",`@Q@C`&(8
+M(SP"7U,T0CDI`&(`'```$!(``A`_``(3@P`#'\,`0Q@CK*8`.*RS`#"LL@`T
+M`&`0+=^_`"#?LP`8W[(`$-^Q``C?L````^``"">]`#`GO?_`_[\`,/^U`"C_
+MM``@_[,`&/^R`!#_L0`(_[````"`D"V,D3`D:*(``&RB``>,HP`(L((LF+2"
+M+)^L@RR@$B``K0"`F"T\`@`")$+C8`!`^`D`````!$$`"`!`@"V.0BR`)$(`
+M`:Y"+(`\`@`")$+:.`!`^`D"0"`MCB(`$`("$"&N(@`0CF(P'%!``$2.0C`8
+M)F4LA#P"```D0@```$#X"0)`("T"0"`M/!```"80```"`/@)-`6!+`!`H"T"
+M0"`M`@#X"30%@30`0*@MCB(`1`*"$"M40``&CB8`1(XB`$@"HA`K4$``'8XD
+M`$2.)@!$`H80*U!```N.)@!(`D`@+3P0```F$````@#X"30%@2P"0"`M-`6!
+M,`(`^`D\!@`"CB8`2`*F$"M00`!SW[\`,`)`("T\$```)A````(`^`DT!8$T
+M`D`@+30%@3@"`/@)/`8"``@`>='?OP`P`H0@(XXB`#P`@A`CCF,L<`!#$"&N
+M8BQPKB0`/(XD`$@"I"`CCB(`0`""$"..8RQT`$,0(:YB+'2N)`!`CD(P&#!"
+M``,D`P`#%$,`5-^_`#".8S`@``,0@`!#$"&.)``0`$00*U!``!^.(P`0CB(`
+M&`""`!@``!`2``(0/``"$#X\!1!B-*5-TP!%`!P``!`2``(1OHXC`#P`0Q`K
+M%$``.SP"``*.(@`@`((`&```$!(``A`\``(0/@!%`!P``!`2``(1OHXC`$``
+M0Q`K5$``+SP"``("0"`M/`(``@@`><HD0N*DCF(P(`!#$"L00``KW[\`,(XB
+M`!0`8@`8```0$@`"$#P``A`^/`,08C1C3=,`0P`<```0$@`"$;Z.(P`\`$,0
+M*U!```6.(@`0`D`@+3P"``((`'G*)$+;,(XC`!P`0P`8```0$@`"$#P``A`^
+M/`,08C1C3=,`0P`<```0$@`"$;Z.(P!``$,0*Q!```O?OP`P`D`@+3P"``(D
+M0MS,`$#X"0`````\`@`")$+:.`!`^`D"0"`MW[\`,-^U`"C?M``@W[,`&-^R
+M`!#?L0`(W[````/@``@GO0!`C((2-)1"``"DH@``C(,2-)!B``0T0@`(H&(`
+M!)"B``0T0@`(H*(`!(R"$C240@`"I*(``HR"$C200@`$H*(`!(R"$C200@`%
+MH*(`!0/@``@``!`M)[W_L/^_`$#_MP`X_[8`,/^U`"C_M``@_[,`&/^R`!#_
+ML0`(_[````"`D"T`H*`M`,"P+0#@@"T``(@M/`(``"137)@\`@``)%4``#P"
+M```D5P```!$00`!1$"$``AC``',8(0`"$$``5!`A``(0@`!3$"$"0"`MC&4`
+M``*@^`F,1@``)A```3("`#]40``$)C$``0+@^`DD!``!)C$``2XB``X40/_L
+M`!$00```B"T\`@``)%1=Z#P"```D4P``/`(``"15````$1#``%00(0)`("V,
+M10```F#X"8Q&``0F$``!,@(`/U1```0F,0`!`J#X"20$``$F,0`!+B(`2!1`
+M__(`$1#```"(+3P"```D4V'`/`(``"14```\`@``)%4````1$$``41`A``(8
+M@`!S&"$`5A`A``(0@`!3$"$"0"`MC&4```*`^`F,1@``)A```3("`#]40``$
+M)C$``0*@^`DD!``!)C$``2XB`$!40/_M`!$00-^_`$#?MP`XW[8`,-^U`"C?
+MM``@W[,`&-^R`!#?L0`(W[````/@``@GO0!0)[W_T/^_`"C_M``@_[,`&/^R
+M`!#_L0`(_[````"`H"T`H)@ME*4``#P"```D0@```$#X"99F``(``A0```(D
+M`Y9B``(P0@"`$$``)0"`@"T`!(!``@2`(0`0@(`\`@``)$)H-`("@"&.!``$
+M/`(``"1"````0/@))`4`"#!2`/\`$I%`C@(````"$0`"0I`EAA``"`*`("T\
+M`@``)$(```!`^`DT!:($`$`@+99C```D`@FT$&(``S2&`!`D!O_O`(8P)`*`
+M("T\`@``)$(```!`^`DT!:($"`!ZD2H"`)$``)`M*@(`D1!```0F!/_H,@(`
+M`5!```@`!!?"/`(``"1"````0/@))`4`"#!1`/\(`'JE)`(``0""("$`!"!#
+M/`(``"1"````0/@))`4`"#!1`/\``!`M`!&(@``"$$`"(H@E-C$$`3)&`/\`
+M!C(`,B(`_P#","4"@"`M/!```"80```"`/@)-`68G``1B@(R1O\`,B(`_P#"
+M,"4"@"`M`@#X"30%F-"NDQ(T)`(``=^_`"C?M``@W[,`&-^R`!#?L0`(W[``
+M``/@``@GO0`P+*(`"!!``!2,A"_L``40@#P#```D8VEX`$,0(8Q"````0``(
+M``````/@``@`@!`M`^``""2"`$0#X``()((`2`/@``@D@@!,`^``""2"`%`#
+MX``()((`E`/@``@``!`M)[W_4/^_`*C_O@"@_[<`F/^V`)#_M0"(_[0`@/^S
+M`'C_L@!P_[$`:/^P`&``@)`M`*#P+3#4__\`@+@ME*(``C!#`?`D`@#`$&(`
+M20``B"TH8@#!$$``!B0"`4`D`@"@4&(`-I2"$V0(`'R#```0+1!B``,D`@%0
+M%&(!B0``$"V7P@``)$+P7S!"__\L0@3K4$``!9?"``"6XA-4KZ(`6`@`>QV6
+MXA-6)$+K=#!"__\L0@#P4$``!9?"``"6XA-8KZ(`6`@`>QV6XA-:)$+JA#!"
+M__\L0@#A4$``!9?"``"6XA-<KZ(`6`@`>QV6XA->+$(6751```:OH`!<EN(3
+M8*^B`%B6XA-B"`![(*^B`%ROH`!8``"8+0``*"V6XA+8KZ(`2);B$MZOH@!,
+M+$(``:^B`%`(`'M$EN(3+*^B`%B4@A-FKZ(`7)2%$VR4DQ-PE((2VJ^B`$B4
+M@A+@KZ(`3"Q"``&OH@!0"`![1)2"$RZ4@A-HKZ(`6)2"$VJOH@!<E(43;I23
+M$W*4@A+<KZ(`2)2"$N*OH@!,+$(``:^B`%"4@A,PKZ(`5```@"T\`@``)$1@
+M*``0&(``?1@A`!`00`!0$"$``A!``%00(0`"$(``1!`AC$(``*QB```F$``!
+M+@(`$11`__0`$!B`E\(``C!"`(`00``/``"`+0.@("TD!@`#)`<`=SP0```F
+M$````@#X"0``0"T#H"`M`F`H+20&``,D!P!Z`@#X"0``0"T``(`M/`(``"15
+M8"@\`@``)%,``#P"```D5@```!`00`!0$"$``A#``%40(0`0&(``?1@A`D`@
+M+8Q%```"8/@)C&8``"8Q``$R(@`_5$``!"80``$"P/@))`0``280``$N`@`1
+M%$#_[@`0$$```(`M/`(``"159,`\`@``)%,``#P"```D5@```!`0P`!5$"$"
+M0"`MC$4```)@^`F,1@`$)C$``3(B`#]40``$)A```0+`^`DD!``!)A```1(`
+M__,`$!#```"`+3P"```D4V3(/`(``"15```\`@``)%8````0$$``4!`A``(8
+MP`!S&"$``A!``%00(0`"$(``4Q`A`D`@+8QE```"H/@)C$8``"8Q``$R(@`_
+M5$``!"80``$"P/@))`0``280``$2`/_M`!`00```@"T\`@``)%-DX#P"```D
+M50``/`(``"16````$!!``%`0(0`"&,``<Q@A``(00`!4$"$``A"``%,0(0)`
+M("V,90```J#X"8Q&```F,0`!,B(`/U1```0F$``!`L#X"20$``$F$``!$@#_
+M[0`0$$```(`M/`(``"1$9/@`$!B``'T8(0`0$$``4!`A``(00`!4$"$``A"`
+M`$00(8Q"``"L8@``)A```2X"`!$40/_T`!`8@)?"``(P0@%`)`,!0!1#``\#
+MH"`MEN43S"0&``$D!P`S/!```"80```"`/@))`@``Y;E$\X#H"`M)`8``20'
+M`"T"`/@))`@``P.@("V/I0!0)`8``20'`%\\$```)A````(`^`D``$`M`Z`@
+M+8^E`$@D!@`$)`<`8`(`^`D``$`M`Z`@+8^E`%@D!@`#)`<`:`(`^`D``$`M
+M`Z`@+8^E`%PD!@`#)`<`:P(`^`D``$`M``"`+3P"```D563X/`(``"13```\
+M`@``)%8````0$$``4!`A``(0P`!5$"$`$!B``'T8(0)`("V,10```F#X"8QF
+M```F,0`!,B(`/U1```0F$``!`L#X"20$``$F$``!+@(`$11`_^X`$!!```"`
+M+3P"```D1&:0`!`8@`!]&"$`$!!``%`0(0`"$$``5!`A``(0@`!$$"&,0@``
+MK&(``"80``$N`@`(%$#_]``0&(`#H"`MCZ4`5"0&``8D!P`=/!```"80```"
+M`/@)``!`+0.@("V/I0!,)`8``20'``0"`/@)``!`+8?"``($0``%E\(``C!"
+M0``00``;``"`+9?"``(P0D``%$```B03`!`D$P`?`Z`@+20%`!\D!@`%)`<`
+M$SP0```F$````@#X"0``0"T#H"`M`F`H+20&``4D!P`8`@#X"0``0"T#H"`M
+M)`4``R0&``(D!P`Q`@#X"0``0"T``(`M/`(``"149I`\`@``)%,``#P"```D
+M50```!`00`!0$"$``A#``%00(0`0&(``?1@A`D`@+8Q%```"8/@)C&8``"8Q
+M``$R(@`_5$``!"80``$"H/@))`0``280``$N`@`(%$#_[@`0$$"NX"_$)`(`
+M`=^_`*C?O@"@W[<`F-^V`)#?M0"(W[0`@-^S`'C?L@!PW[$`:-^P`&`#X``(
+M)[T`L#"$__\PI?__,,;__S#G__\Q"/__`.@`&```$!(00``E```8+1#%`",`
+MX!@M`(48(P`#$$``0Q`A``(0P`!#$"$``A"``,48(P!#`!H``!`24&```0`'
+M``T``A0```(D`P2``!0`X!@M*((`91!``!$!`!@M`(@`&```&!(D`@!D`$00
+M(P!'`!@``!`2`&(8(3P"4>LT0H4?`&(`'```$!(``A`_``(10P`#'\,`0Q`C
+M,$/__P/@``@`8!`M)[W^D/^_`6C_O@%@_[<!6/^V`5#_M0%(_[0!0/^S`3C_
+ML@$P_[$!*/^P`2``X*@M`("@+:^@`1B4X@`",$,!\"0"`-`08@`?)!X`/RAB
+M`-$00``))`(!4"0"`*!08@`4E((5\"0"`,!08@`7EH(5\`@`?<T``!`M4&(`
+M"):"$^8H8@%14$```B0""4`D`@%`5&(`Z@``$"V6@A/FIZ(!#":"$]*OH@$(
+M"`!\]":"$^BGH@$,)((5^*^B`0@(`'ST)((6KI:"%?"GH@$,)H(5\J^B`0@F
+M@A82KZ(!$">W`0@#H"`M/`(``"1"````0/@))`4!"">V``@GLP"()!```0``
+MB"T`$1!``%80(:10```F$``!*@(`0!1`__HF,0`!I[$`!B0"``&GH@`")`(`
+M/Z>B``0R(O__$$``$```B"T\`@`")%+W9``1$$``4X`AEJ0```!6$"&410``
+M`D#X"0+@,"VF`@``)C$``9>B``8"(A`J%$#_]0`1$$"&9@``EZ,`!@`#$$``
+M4Q`AA$?__A!@`!P``(@M`!$00`!3$"&$0P```,,0*A1```67H@`&`&`P+3(B
+M__^OH@$8EZ(`!@!1$",D0O__,%#__Q(```T`$!!``%,@(82#__Z$@@```$,0
+M*A!```*4A0``I(7__B8Q``&7H@`&`B(0*A1`_^<`$1!`EZ(`!A!```X``(@M
+M`$`@+0`1$$``4Q`AA$,```#C$"I00``$)C$``0!@."TR/O__)C$``0(D$"H4
+M0/_V`!$00"3#`!D\!%'K-(2%'P!D`!P``!`2``(0/P`"$0,``Q_#`$,0(P`"
+M&$``8A@A``,8P`!B&"$``QQ```.,`P``@"T"(!`M`$0`'```$!(``A`_``(1
+M`P`#'\,`0Q`C)$(``1A``!,``)`M```0$@`"$#\``A$#`!$?PP!#$",D1``!
+M`D`0+29#``$P<O__CH-&>``"$$``0Q`ACZ,!&*1#```F$``!`@00*A1`__8"
+M0!`MEZ(`!@`"$$``4Q`AA$+__@(B$"H00``]``"`+2Y"`$`00``Z/`(``B15
+M\CPF(@`R``(4```"C`.7H@`&``(00`!3$"&$0O_^`B(@*A"```H`$!!``%,0
+M(81#```"(Q@CA$(``@(B$",`8@`8```8$EQ@__8F$``!,B3__P`0$$``4Q@A
+ME&4``)1F``(`5A`AE$<````'.$`PY___E$@``@`(0$`"H/@),0C__R1"``$P
+M0O__CH-&>``2($``@Q@A``(00J1B``".@D9X`((@(92"```#PA`K5$```:2>
+M```F0@`!,%+__Y>B``8``A!``%,0(81"__X"(A`J$$```RY"`$`40/_*)B(`
+M,BY"`$!00``,IH`O](Z#1G@`$A!``$,0(91#__ZD0P``)D(``3!2__\N0@!`
+M5$#_^(Z#1GBF@"_T)`(``=^_`6C?O@%@W[<!6-^V`5#?M0%(W[0!0-^S`3C?
+ML@$PW[$!*-^P`2`#X``()[T!<">]_Y#_OP!@_[<`6/^V`%#_M0!(_[0`0/^S
+M`#C_L@`P_[$`*/^P`"``P*@M,)?__S"V__\"X"`M`L`H+3P"``(D0OCP`$#X
+M"0.@."T40`!$EZ(``):F``0"X"`MCJ4``">G``(\`@``)$(```!`^`DGJ``$
+MEZ4``@+`("T"H#`M)Z<`!CP0``(F$/ET`@#X"2>H``B7I0`$`L`@+0*@,"TG
+MIP`*`@#X"2>H``R7I``"EZ4`!B>S``X"H#`M/!```B80^/`"`/@)`F`X+9>D
+M``*7I0`()[(`$`*@,"T"`/@)`D`X+9>E``:7I@`(EZ<`#I>H`!`\$0`")C'R
+M/`(@^`D"P"`M`$"@+9>D``27I0`*`J`P+0(`^`D"8#@MEZ0`!)>E``P"H#`M
+M`@#X"0)`."V7I0`*EZ8`#)>G``Z7J``0`B#X"0+`("V7I0`"EZ8`!`+@("T"
+M@#@M`B#X"0!`0"W?OP!@W[<`6-^V`%#?M0!(W[0`0-^S`#C?L@`PW[$`*-^P
+M`"`#X``()[T`<#"$__\PI?__C,@`")3"``000``:``!0+94"``!41``3)4H`
+M`24#``B5`@`&$$``#@``2"V48@``5$4`!R4I``$`"1!``$@0(91"`!ZDX@``
+M`^``""0"``&5`@`&`2(0*A1`__0D8P`")4H``93"``0!0A`J%$#_Z"4(`#0#
+MX``(```0+2>]__#_OP``,(3__S"E__^,PP`(E,(`!`!`2"T00``'```P+91B
+M```010`$),8``0#)$"H40/_[)&,`-"1E``@\`@``)$(```!`^`F49@`&W[\`
+M``/@``@GO0`0)[W_\/^_``C_L````("`+8R$1GA0@``'C@0O[#P"```D0@``
+M`$#X"0````"N`$9XC@0O[!"```??OP`(/`(``"1"````0/@)`````*X`+^S?
+MOP`(W[````/@``@GO0`0`^``""0"``$``"`ME*,``#P"``"40FF8`$,0*Q1`
+M``H`8"@M/`(``"1#:9@DA``!``00@`!#$"&40@```$40*U!`__LDA``!``00
+M@#P#```D8VF8`$,0(0/@``B$0@`")[W_X/^_`!#_L0`(_[````"@B"T`@(`M
+M/`(``"1"````0/@))`0`M!!```FN`B_L)`(`@*X"1GP\`@``)$(```!`^`DD
+M!`"`%$``!:X"1G@D`@`"KB(```@`?M4``!`M/`(``B1"^="N`BRH/`(``B1"
+MY[BN`BRL/`(``B1"ZPRN`BRP/`(``B1"Z5RN`BRT/`(``B1"ZVRN`BRX/`(`
+M`B1"\OBN`BR\/`(``B1"^C"N`BS`/`(``B1"^CBN`BS$)`(``=^_`!#?L0`(
+MW[````/@``@GO0`@)[W_L/^_`$#_MP`X_[8`,/^U`"C_M``@_[,`&/^R`!#_
+ML0`(_[````"`D"T`H*`M`,"P+0#@@"T``(@M/`(``"13:<@\`@``)%4``#P"
+M```D5P```!$00`!1$"$``AC``',8(0`"$$``5!`A``(0@`!3$"$"0"`MC&4`
+M``*@^`F,1@``)A```3("`#]40``$)C$``0+@^`DD!``!)C$``2XB`!`40/_L
+M`!$00```B"T\`@``)%1K2#P"```D4P``/`(``"15````$1#``%00(0)`("V,
+M10```F#X"8Q&``0F$``!,@(`/U1```0F,0`!`J#X"20$``$F,0`!+B(`111`
+M__(`$1#```"(+3P"```D4VUP/`(``"14```\`@``)%4````1$$``41`A``(8
+M@`!S&"$`5A`A``(0@`!3$"$"0"`MC&4```*`^`F,1@``)A```3("`#]40``$
+M)C$``0*@^`DD!``!)C$``2XB`$!40/_M`!$00-^_`$#?MP`XW[8`,-^U`"C?
+MM``@W[,`&-^R`!#?L0`(W[````/@``@GO0!0)[W_P/^_`##_M0`H_[0`(/^S
+M`!C_L@`0_[$`"/^P````@*`M`*"8+0``J"V4I0``+*(2P!!``$@``(`M)*3W
+M<#P&9F8TQF9G`(8`'```$!(``A`_``(00P`$'\,`0Q`C``(8@`!B&"%4@P`*
+MEF4````%$$`D4N[@`D8`'```$!(``A`_``(0@P`2'\,(`']^`$.0(R2D]U`\
+M!F9F-,9F9P"&`!P``!`2``(0/P`"$$,`!!_#`$,0(P`"&(``8A@A%(,`P@``
+M$"T`!1!`)%+NH`)&`!P``!`2``(0/P`"$(,`$A_#`$.0(R05``$`$I"`,E(`
+M_P)`("T\`@``)$(```!`^`DD!0`(`$"0+0*`("T\`@``)$(```!`^`DT!:($
+M`$`@+99C```D`@FT$&(``S2&`!`D!O_O`(8P)`*`("T\`@``)$(```!`^`DT
+M!:($"`"`)``2B0"69```,(/__S0"S,P``A0X-$+,S0!B`!P``!@2``,8O@`#
+M$(``0Q`A`((0(S!"__\D`P`"%$,`'3""__\L@A4\$$``&C""__^68@``)$+_
+M_C!"__\``AB``&(8(0`#&$`\`O__-$)$@`!B&"$\!%'K-(2%'P!D`!P``"`2
+M``0@/P`$(,,``Q_#`(,@(R2$``$\$```)A````(`^`DD!0`(`$"0+0@`@"``
+M`"`M-`/,S``#'#@T8\S-`$,`'```$!(``A$^``(8@`!B&"$``QB``(,8(S!C
+M__]48``5EF0``"R"%`!40``2EF0``"2"[4`\!&9F-(1F9P!$`!P``"`2``0@
+M/P`$(,,``A?#`((@(P`$((`\$```)A````(`^`DD!0`(`$"0+0@`@"`D!``#
+M,(+__S0#S,P``QPX-&/,S0!#`!P``!`2``(0_@`"&(``8A@A``,80`"#&",P
+M8___5&``$I9D```D@NU`/`1F9C2$9F<`1``<```@$@`$(#\`!""#``(7PP""
+M(",`!"!`/!```"80```"`/@))`4`"`!`D"T(`(`@)`0``C""__\T`\S,``,<
+M.#1CS,T`0P`<```0$@`"$+X``AB``&(8(0"#&",P8___%&``)@``$"TD@NU`
+M/`1F9C2$9F<`1``<```@$@`$(#\`!"!#``(7PP""(",\$```)A````(`^`DD
+M!0`(`$"0+20$``$"`/@))`4``@!`@"T`$HD``!`0@`(BB"4`%1!``B*()38Q
+M$`$R)@#_`H`@+3P0```F$````@#X"30%F)P`$8H",B8`?P*`("T"`/@)-`68
+MV*Z3$C0D`@`!W[\`,-^U`"C?M``@W[,`&-^R`!#?L0`(W[````/@``@GO0!`
+M+*(`"!!``!*,A"_L``40@#P#```D8W6@`$,0(8Q"````0``(``````/@``@`
+M@!`M`^``""2"``0#X``()((`"`/@``@D@@`,`^``""2"`*P#X``(```0+2>]
+M_Y#_OP!H_[X`8/^W`%C_M@!0_[4`2/^T`$#_LP`X_[(`,/^Q`"C_L``@`("@
+M+0"@L"VOIP``,-7__P"`N"VOH``(KZ``#*^@`!"OH``4C)(O["2>+!"4H@`"
+M,$,!\"0"`-`08@`_``"8+2AB`-$00``))`(!4"0"`*!08@`SE((3;"0"`,!0
+M8@`WEN(3;@@`@F0``!`M$&(`!BAB`5%00``")`((`"0"`4`48@'C```0+9;"
+M```D0O!?,$+__RQ"!.M00``%EL(``);B$U2OH@`("`"`I);B$U8D0NMT,$+_
+M_RQ"`/!00``%EL(``);B$UBOH@`("`"`I);B$UHD0NJ$,$+__RQ"`.%00``%
+MEL(``);B$UROH@`("`"`I);B$UXL0A9=5$``!I;E$MZ6XA-@KZ(`");B$V*O
+MH@`,EN42W@@`@+.6XA,LKZ(`$)2"$W"OH@`4E(42X`@`@+.4@A,NEN(3;J^B
+M`!2OH@`0EN42XI;B$S"OH@`$```@+3P"```D1G!P``00@`!2$"$`!!C``&88
+M(8QC``0DA``!$(#_^:Q#`````"`M/`(``"1&<'@`!!"``%(0(0`$&$``9!@A
+M``,80`!U&"$``QB``&88(8QC```DA``!$(#_]:Q#``0``"`M/`(``"1&<)``
+M!!"``%(0(0`$&$``9!@A``,80`!U&"$``QB``&88(8QC```DA``!$(#_]:Q#
+M``@``"`M/`(``"1&<*@`!!B``'(8(0`$$$``1!`A``(00`!5$"$``A"``$80
+M(8Q"``"L8@`,)(0``2R"`"@40/_T``08@"90``P"`"`M)`8``20'`2X\`@``
+M)%$```(@^`D``$`MCZ(``)1%```"`"`M)`8``B0'`0X"(/@)``!`+8^B``"4
+M10`"`@`@+20&``(D!P$!`B#X"0``0"V6P@`",$(`0%!``"R6P@`"C\(`'(1%
+M``("`"`M)`8``20'`*@"(/@))`@``X_"`!R$10`$`@`@+20&``$D!P"I`B#X
+M"20(``./P@`<A$4`!@(`("TD!@`!)`<`J@(@^`DD"``#C\(`'(1%``@"`"`M
+M)`8``20'`*X"(/@))`@``X_"`!R$10`*`@`@+20&``$D!P"O`B#X"20(``./
+MP@`<A$4`#`(`("TD!@`!)`<`L`(@^`DD"``#EL(``C!"`(`00``.)E$`#`(@
+M("V/I0`0)`8``R0'`1\\$```)A````(`^`D``$`M`B`@+8^E`!0D!@`#"`"!
+M3R0'`2("("`MCZ4`""0&``,D!P$7/!```"80```"`/@)``!`+0(@("V/I0`,
+M)`8``R0'`1H"`/@)``!`+9:#`=0P8@#P)$+_T"Q"`$!00``FEH(!TB0"`#40
+M8@`')`(`11!B``4D`@!&$&(``R0"`#948@`=EH(!TB91``P"("`M)`4``B0&
+M``(D!P!:/!```"80```"`/@))`@``@(@("TD!0`")`8``B0'`%P"`/@))`@`
+M`@(@("TD!0`")`8``B0'`%X"`/@))`@``@(@("TD!0`")`8``20'`/X"`/@)
+M)`@``I:"`=(L0@!"%$``(P``("TF40`,`B`@+20%``$D!@`!)`<!&3P0```F
+M$````@#X"20(``$"("`M)`4``20&``(D!P`!`@#X"20(``,"("`M)`4``20&
+M``(D!P`#`@#X"20(``,"("`M)`4``20&``$D!P"+`@#X"20(``,"("`M)`4`
+M`20&``$D!P",`@#X"20(``,``"`M/`(``"1%=&@`!!B``'(8(0`$$$``1!`A
+M``(00`!5$"$``A"``$40(8Q"``"L8@"L)(0``2R"``T40/_T``08@);"``(P
+M0@!`$$``"B9$`*R/P@`<A$4``"0&``(D!P`E/`(``"1"````0/@)``!`+29$
+M`*R/I0`$)`8`!B0'``X\`@``)$(```!`^`D``$`MEL(``C!"0`!40``%EL(`
+M`H;"``($00`6``"`+9;"``(P0D``%$```B05``@D%0`/)E$`K`(@("TD!0`/
+M)`8`!"0'`#H\$```)A````(`^`D``$`M`B`@+0*@*"TD!@`$)`<`1@(`^`D`
+M`$`M``"`+3P"```D57!P/`(``"11```\`@``)%8````0$,``51`A`!`8@`!R
+M&"$"@"`MC$4```(@^`F,9@``)G,``3)B`#]40``$)A```0+`^`DD!``!)A``
+M`1(`__$`$!#```"`+3P"```D57!X/`(``"11```\`@``)%8````0$$``4!`A
+M``(0P`!5$"$`$!B``'(8(0*`("V,10```B#X"8QF``0F<P`!,F(`/U1```0F
+M$``!`L#X"20$``$F$``!$@#_[P`0$$```(`M/`(``"15<)`\`@``)%$``#P"
+M```D5@```!`00`!0$"$``A#``%40(0`0&(``<A@A`H`@+8Q%```"(/@)C&8`
+M""9S``$R8@`_5$``!"80``$"P/@))`0``280``$2`/_O`!`00```@"T\`@``
+M)%5PJ#P"```D40``/`(``"16````$!!``%`0(0`"$,``51`A`!`8@`!R&"$"
+M@"`MC$4```(@^`F,9@`,)G,``3)B`#]40``$)A```0+`^`DD!``!)A```2X"
+M`"@40/_N`!`00```@"T\`@``)%5T:#P"```D40``/`(``"16````$!!``%`0
+M(0`"$,``51`A`!`8@`!R&"$"@"`MC$4```(@^`F,9@"L)G,``3)B`#]40``$
+M)A```0+`^`DD!``!)A```2X"``T40/_N`!`00*[@+\0D`@`!W[\`:-^^`&#?
+MMP!8W[8`4-^U`$C?M`!`W[,`.-^R`##?L0`HW[``(`/@``@GO0!P)[W[P/^_
+M!#C_O@0P_[<$*/^V!"#_M008_[0$$/^S!`C_L@0`_[$#^/^P`_"OI0/(KZ8#
+MS*^H`]"OI`/4E(,!U#!B`/`D0O_0+$(`0!!```T`X/`M)`(`-1!B``<D`@!%
+M$&(`!20"`$808@`#)`(`-A1B``4D`P`!)`(``@@`@I.OH@/8)`,``:^C`]B7
+MP@`",$,!\"0"`-`08@`9*&(`T1!```@D`@%0)`(`H!!B`!`D`@#`$&(`$@``
+M("T(`(0$`(`0+1!B``8H8@%14$```B0""``D`@%`5&(!7```("V/I`/4))<?
+MU`@`@K.4@Q+8CZ(#U"17'^`(`(*SE$,2VH^C`]0D=Q_LE&,2W);B``8`8A`D
+M$$`!30``("V/I`/,A((````"%$```A0#KZ(#X(^C`\B$8@````(40``"%`.O
+MH@/<)`+>K:>B`[BGH@.Z``"H+9;C``8``)`M`D,0!S!"``$80``'+J(``A!`
+M`3<``"`M`!400`!=$"&D4@.X)K4``292``$N0@`$%$#_]`)#$`>7Q```EN8`
+M!([E```GIP/`/`(``B1"$*@`0/@))Z@#Q(^S`\"/H@/$`%,0*Q1``&\``*@M
+M/`(``"16````$Q"``%,0(0`"$(``4Q`A``(0@([C``@`0Z`AEZ,#NC0"WJT4
+M8@`>E[(#N``2@(`"$H`A`!"`@`(4@"&6$@`&)@4`"``2B$`GI`$(`L#X"0(@
+M,"TF$``0)Z0!(`(`*"T"P/@)`B`P+8:'``("0"`M)Z4!"">F`2`\`P`")&,1
+M2`!@^`DGJ`,X$$``_```("T`%2'`)Z(!.`@`@T@`1"`A`!*`@`(2@"$`$("`
+M`A2`(982``8F!0`(`!*(0">D`0@"P/@)`B`P+280`!`GI`$@`@`H+0+`^`D"
+M(#`MAH<``@)`("TGI0$()Z8!(#P#``(D8Q%(`&#X"2>H`S@00`#?```@+0`5
+M(<`GH@$X`$0@(2>E`S@"P/@))`8`@)>R`[H`$H"``A*`(0`0@(`"%(`AEA(`
+M!B8%``@`$HA`)Z0!"`+`^`D"(#`M)A``$">D`2`"`"@M`L#X"0(@,"V&AP`"
+M`D`@+2>E`0@GI@$@/`,``B1C$4@`8/@))Z@#.!!``+\``"`M`!41P">D`C@`
+M@B`A)Z4#.`+`^`DD!@"`)G,``8^B`\0`4Q`K$$#_E2:U``&/I0/`CN0````%
+M$$``1!`AE%0``(^C`\0``Q!``$00(913````9:@CEZ,#NC0"WJT48@`M``"0
+M+0`5B8`\`@`")%400``2@$`"'8`AE\0``(8'`3@",A`A``(00`!=$"&$2`$X
+M`H`H+0*@^`D"8#`MI@(`""92``$N0@!`%$#_\@`2@$"/H@/4C$5&>#P"``(D
+M0A*P`$#X"2>D``@`0!@M``(7P@!B$"$``A!#CZ,#R*1B``"7H@"&``(4```"
+M'`,``A?"`&(8(0`#&$.GHP``CZ0#S*2#``"7H@.XCZ,#T`@`@\FD8@```!6Q
+M@#P"``(D51!``!*(0`(]B"&7Q```AB<!.`+2@"$`$(!``AV`(88(`3@"@"@M
+M`J#X"0)@,"VF(@`(E\0``(8G`CB&"`(X`H`H+0*@^`D"8#`MIB(`B"92``$N
+M0@!`%$#_ZP`2B$`D`@`"CZ0#V!2"`"2'HP$&)Z0`"">E`(B/H@/4C$9&>#P"
+M``(D0A/P`$#X"2>G``(`0!@M``(7P@!B$"$``A!#CZ,#R*1B``"7H@`"``(4
+M```"'`,``A?"`&(8(0`#&$.GHP``EZ(`A@`"%````AP#``(7P@!B&"$``QA#
+MCZ0#S*2#``"7H@.XCZ,#T*1B``"7H@.Z"`"#_*1B``*/I`/<`&00*A1``!6/
+MI`/@`&00*A1``!./H@/4C$5&>#P"``(D0A*P`$#X"2>D`(@`0!@MEZ(#NH^D
+M`]"D@@``I((``@`#%\(`8A`A``(00X^C`\BD8@``"`"#])>B`0:/H@/4C$5&
+M>#P"``(D0A*P`$#X"2>D``@`0!@MEZ(#N(^D`]"D@@``I((``@`#%\(`8A`A
+M``(00X^C`\BD8@``EZ(`A@`"%````AP#``(7P@!B&"$``QA#IZ,``(^D`\RD
+M@P``CZ(#S)1#```D`@`_`$,0(X^C`]2D8B_T)`0``0"`$"W?OP0XW[X$,-^W
+M!"C?M@0@W[4$&-^T!!#?LP0(W[($`-^Q`_C?L`/P`^``"">]!$`PB?__,*7_
+M_S#&__\`!SP```<D`P`(1```"$0#$,4`$`"`$"T!)1@C`&@`&```&!(`R1`C
+M``````!$`!@``!`2`&(8(0#%$",`8@`:```8$E!```$`!P`-``,<```#%`,#
+MX``(`````##&__\PA/__``800`"B2"&4H@```((0*U!```25(O_^K0````/@
+M``BLX````((0*U1```P`J1`K"`"$.R3"__\``A!#K0(```/@``BLX@````(0
+M0ZSB```D0@`!`^``"*T"```00``,`*`8+91B```01/_S`&40(Y1B``(`@A`K
+M%$#_\P!E$",D8P`"`&D0*U1`__>48@```^``"``````GO?^P_[\`2/^^`$#_
+MMP`X_[8`,/^U`"C_M``@_[,`&/^R`!#_L0`(_[````"@B"T`P*@M`0"8+3"$
+M__\`!SP```>4`P``L"TD%``!+((``A1``#@``!@M``"`+227__\\`@`")%X0
+M0``4$$``41`AE$(```!0$"L00``)`!8@0`*7$"H00``'`)$0(2;"``$P5O__
+M)H(``3!4__\`%B!``)$0(91%````%!A``'$0(91&````E2`AA(<```!U&"&$
+M:````\#X"0(`("T`$!A``',8(:1B`````A0```(4`P!2$"H40``.)@(``2X"
+M`$`00``+)@(``0(`$"TF`P`!,'#__P`"$$``4Q`AI%(``"X"`$`40/_Y`@`0
+M+28"``$P4/__+@(`0!1`_]``%!!`)`,``0!@$"W?OP!(W[X`0-^W`#C?M@`P
+MW[4`*-^T`"#?LP`8W[(`$-^Q``C?L````^``"">]`%"$@@!^A(,```!#$",H
+M0@!_%$``!92&`'XDPO^"``(4``@`A+<``DP#A(D``(2&`'XDPO__`$`X+0!&
+M$"H00``,)`,`/R1B__\``A0```(<`P`#$$``1!`AA$(```#B$"I00``$`,`X
+M+01A__<D8O__`,`X+20(`#\D8O__`$`P+3!"__\L0@`_$$``$0`#$$``1!`A
+MA$(```!'$"H40``,``84```"'`,D9O__,,+__RQ"`#\00``&``,00`!$$"&$
+M0@```$<0*A!`__8`!A0`%&``#@`($$`%```7`2`0+0`($$``11`AE$,``J1#
+M```E`O__``(4```"1`,%`__Y``@00`/@``@!(!`M`$40(:1#```DXO_^``(4
+M```"/`,E`O__``(4```"1`,%`__3)&+__P$@$"T#X``(`````"0+`$"$@@!^
+MA*,```!#$",H0@!_%$``!92(`'XE`O^"``(4``@`A0@``FP#A*T``(2)`'XE
+M(O__`$!`+0!)$"H00``,)`,`/R1B__\``A0```(<`P`#$$``1!`AA$(```$"
+M$"I00``$E*(`?@1A__<D8O__E*(`?J3B````8$`M)`H`/R0,`$"$X@```$D0
+M*E!```8``%@M%0``!@`````5;``$````````6"T`H"`M)`@`/QD```\`"!!`
+M`$00(81"````21`J%$``"B4"__\``A0```)$`QD```8`"!!``$00(81"````
+M21`J$$#_^"4"__\5```0``H00!5@``\`1A`A!4``&`&@$"T`"A!``$80(91#
+M``*D0P``)4+__P`"%````E0#!4/_^0`*$$`#X``(`:`0+0!&$"$!"Q@EI$,`
+M`"4B__X``A0```),`R5"__\``A0```)4`P5#_\N$X@```:`0+0/@``@`````
+M)[W_\/^_``C_L````("`+8R$1GA0@``'C@0O[#P"```D0@```$#X"0````"N
+M`$9XC@0O[!"```??OP`(/`(``"1"````0/@)`````*X`+^S?OP`(W[````/@
+M``@GO0`0A*8`!```0"TD!``!``00@`!$$"$``A"``$48(91B``0`1A`J4$``
+M!"2$``$`@$`MA&8`!"2$``$H@@`$%$#_]``$$(``"!"``$@0(0`"$(``11`A
+MA$<`$(1)``@D!``!``@0@`!($"$``D!``000(0`"$$``13`AA,,`$`!G$"H0
+M0``#)(0``0!@."V$R0`(*((`!%1`__8!!!`A``D00`#B$",``A0``^``"``"
+M%`,GO?_`_[\`./^V`##_M0`H_[0`(/^S`!C_L@`0_[$`"/^P````@*`M`*"0
+M+0#@L"VDP```ED(``C!"`4`D`P%`%$,`!0"`*"TD@A_4C$@`"`@`A<241P`$
+MED(``C!#`-`D`@#`$&(``R0"`-!48@`%ED(``B2B']2,2``@"`"%Q)1'`!PP
+M0@"@)`,`H!1#`(\D!``!)H(?U(Q(`!241P`0&.``B@``("V60P``E0(```!B
+M$"M40``,ED(````'$(``1Q`A``(0@`!'$"$``A"``$@0(91"_ZP`0Q`K$$``
+M$@``2"V60@``E0,```!#$"M00``&``<H@)4"``*DP@```H`@+0@`ADD!`"@M
+M`*<H(0`%*(``IR@A``4H@`"H*"$(`(9&)*7_K!#@`!0``"`MED,``)4"````
+M0Q`K$$``#P!@*"T`@$@M)(0``0"'$"H00``*``00@`!$$"$``A"``$00(0`"
+M$(``2!`AE$(```!%$"M40/_T`(!(+0`$$(``1!`A``(0@`!$$"$``A"``$@H
+M(92S````"1"``$D0(0`"$(``21`A``(0@`!(J"&6IP```F>8(QI@`#(`!!"`
+MA*,``H:D``(`9!@CED(```!'$",`8@`8```8$@```````````),`&```(!(`
+M9!@A``````!S`!H``!@24F```0`'``T``QX```,>`Z3#```\$0`")C$5P`(@
+M^`D"@"`M`$"`+0*`("T"(/@)`J`H+0("@".60@``EJ,```!#$","`@`8``"`
+M$@*`("T"(/@)`J`H+0!3`!@``!`2`@*`(0`````"$P`:``"`$E)@``$`!P`-
+M`!"&```0A@,(`(9.IM````!$$"$``A"``$00(0`"$(``2"@AED,``)2B```4
+M8@`*```@+92B``*DP@```H`@+3P"``(D0A7``$#X"0````"FP@``)`0``0"`
+M$"W?OP`XW[8`,-^U`"C?M``@W[,`&-^R`!#?L0`(W[````/@``@GO0!`)[W_
+ML/^_`$C_M@!`_[4`./^T`##_LP`H_[(`(/^Q`!C_L``0`("@+0"@F"T`P)`M
+M)!8``1#``!0``(@M/`(``B15%G``$1#``F*`(0*`("T"`"@M`Z`P+0*@^`DG
+MIP`"4$``!0``L"V3H@`!H@(`!I.B``.B`@`')C$``0(R$"L40/_Q`!$0P`+`
+M$"W?OP!(W[8`0-^U`#C?M``PW[,`*-^R`"#?L0`8W[``$`/@``@GO0!0)[W_
+MX/^_`!#_L0`(_[````"@B"T`@(`M/`(``"1"````0/@))`0`X!!```FN`B_L
+M)`(`@*X"1GP\`@``)$(```!`^`DD!`"`%$``!:X"1G@D`@`"KB(```@`AKH`
+M`!`M)`(`0*X"1GP\`@`")$(58*X"+*@\`@`")$+[:*X"+*P\`@`")$(`_*X"
+M++`\`@`")$+]#*X"++0\`@`")$(!5*X"++@\`@`")$()P*X"++P\`@`")$(9
+M:*X"+,`\`@``)$(``*X"+,0D`@`!W[\`$-^Q``C?L````^``"">]`"`GO?^P
+M_[\`0/^W`#C_M@`P_[4`*/^T`"#_LP`8_[(`$/^Q``C_L````("0+0"@H"T`
+MP+`M`."`+0``B"T\`@``)%-UP#P"```D50``/`(``"17````$1!``%$0(0`"
+M&,``<Q@A``(00`!4$"$``A"``%,0(0)`("V,90```J#X"8Q&```F$``!,@(`
+M/U1```0F,0`!`N#X"20$``$F,0`!+B(`$!1`_^P`$1!```"(+3P"```D5'=`
+M/`(``"13```\`@``)%4````1$,``5!`A`D`@+8Q%```"8/@)C$8`!"80``$R
+M`@`_5$``!"8Q``$"H/@))`0``28Q``$N(@"+%$#_\@`1$,```(@M/`(``"13
+M>Y@\`@``)%0``#P"```D50```!$00`!1$"$``AB``',8(0!6$"$``A"``%,0
+M(0)`("V,90```H#X"8Q&```F$``!,@(`/U1```0F,0`!`J#X"20$``$F,0`!
+M+B(`0%1`_^T`$1!`W[\`0-^W`#C?M@`PW[4`*-^T`"#?LP`8W[(`$-^Q``C?
+ML````^``"">]`%`GO?_`_[\`,/^U`"C_M``@_[,`&/^R`!#_L0`(_[````"`
+MH"T`H)@M``"H+92E```LHA+`$$``2```@"TDI/=P/`9F9C3&9F<`A@`<```0
+M$@`"$#\``A!#``0?PP!#$",``AB``&(8(52#``J690````400"12[N`"1@`<
+M```0$@`"$#\``A"#`!(?PP@`AV,`0Y`C)*3W4#P&9F8TQF9G`(8`'```$!(`
+M`A`_``(00P`$'\,`0Q`C``(8@`!B&"$4@P#"```0+0`%$$`D4NZ@`D8`'```
+M$!(``A`_``(0@P`2'\,`0Y`C)!4``0`2D(`R4@#_`D`@+3P"```D0@```$#X
+M"20%``@`0)`M`H`@+3P"```D0@```$#X"30%H@0`0"`MEF,``"0"";008@`#
+M-(8`$"0&_^\`AC`D`H`@+3P"```D0@```$#X"30%H@0(`(@)`!*)`)9D```P
+M@___-`+,S``"%#@T0LS-`&(`'```&!(``QB^``,0@`!#$"$`@A`C,$+__R0#
+M``(40P`=,(+__RR"%3P00``:,(+__Y9B```D0O_^,$+__P`"&(``8A@A``,8
+M0#P"__\T0D2``&(8(3P$4>LTA(4?`&0`'```(!(`!"`_``0@PP`#'\,`@R`C
+M)(0``3P0```F$````@#X"20%``@`0)`M"`"(!0``("TT`\S,``,<.#1CS,T`
+M0P`<```0$@`"$3X``AB``&(8(0`#&(``@Q@C,&/__U1@`!669```+((4`%1`
+M`!*69```)(+M0#P$9F8TA&9G`$0`'```(!(`!"`_``0@PP`"%\,`@B`C``0@
+M@#P0```F$````@#X"20%``@`0)`M"`"(!20$``,P@O__-`/,S``#'#@T8\S-
+M`$,`'```$!(``A#^``(8@`!B&"$``QA``(,8(S!C__]48``2EF0``"2"[4`\
+M!&9F-(1F9P!$`!P``"`2``0@/P`$((,``A?#`((@(P`$($`\$```)A````(`
+M^`DD!0`(`$"0+0@`B`4D!``",(+__S0#S,P``QPX-&/,S0!#`!P``!`2``(0
+MO@`"&(``8A@A`(,8(S!C__\48``F```0+22"[4`\!&9F-(1F9P!$`!P``"`2
+M``0@/P`$($,``A?#`((@(SP0```F$````@#X"20%``@`0)`M)`0``0(`^`DD
+M!0`"`$"`+0`2B0``$!"``B*()0`5$$`"(H@E-C$0`3(F`/\"@"`M/!```"80
+M```"`/@)-`68G``1B@(R)@!_`H`@+0(`^`DT!9C8KI,2-"0"``'?OP`PW[4`
+M*-^T`"#?LP`8W[(`$-^Q``C?L````^``"">]`$`GO?^P_[\`0/^W`#C_M@`P
+M_[4`*/^T`"#_LP`8_[(`$/^Q``C_L````("H+3#4__\`@+@M``"8+92B``(P
+M0P'P)`(`P!!B`!",DB_L*&(`P1!```8D`@#0)`(`H!!B``<``!`M"`"))M^_
+M`$`08@`&```0+0@`B2;?OP!`E(439`@`B$B4EA-FEN43:);V$VH``"`M/`(`
+M`"1&?I@`!!"``%(0(0`$&,``9A@AC&,`!"2$``$0@/_YK$,`````("T\`@``
+M)$9^H``$$(``4A`A``080`!D&"$``QA``'08(0`#&(``9A@AC&,``"2$``$0
+M@/_UK$,`!```("T\`@``)$9^N``$$(``4A`A``080`!D&"$``QA``'08(0`#
+M&(``9A@AC&,``"2$``$0@/_UK$,`"```("T\`@``)$9^T``$&(``<A@A``00
+M0`!$$"$``A!``%00(0`"$(``1A`AC$(``*QB``PDA``!+((`&Q1`__0`!!B`
+M)E$`#`(@("TD!@`#)`<`J#P0```F$````@#X"0``0"T"("`M`L`H+20&``,D
+M!P"E`@#X"0``0"T``"`M/`(``21%@5@`!!B``'(8(0`$$$``1!`A``(00`!4
+M$"$``A"``$40(8Q"``"L8@!X)(0``2R"``,40/_T``08@```@"T\`@``)%1^
+MF#P"```D40``/`(``"16````$!#``%00(0`0&(``<A@A`J`@+8Q%```"(/@)
+MC&8``"9S``$R8@`_5$``!"80``$"P/@))`0``280``$2`/_Q`!`0P```@"T\
+M`@``)%1^H#P"```D40``/`(``"16````$!!``%`0(0`"$,``5!`A`!`8@`!R
+M&"$"H"`MC$4```(@^`F,9@`$)G,``3)B`#]40``$)A```0+`^`DD!``!)A``
+M`1(`_^\`$!!```"`+3P"```D5'ZX/`(``"11```\`@``)%8````0$$``4!`A
+M``(0P`!4$"$`$!B``'(8(0*@("V,10```B#X"8QF``@F<P`!,F(`/U1```0F
+M$``!`L#X"20$``$F$``!$@#_[P`0$$```(`M/`(``"14?M`\`@``)%$``#P"
+M```D5@```!`00`!0$"$``A#``%00(0`0&(``<A@A`J`@+8Q%```"(/@)C&8`
+M#"9S``$R8@`_5$``!"80``$"P/@))`0``280``$N`@`;%$#_[@`0$$```(`M
+M/`(``214@5@\`@``)%$``#P"```D5@```!`00`!0$"$``A#``%00(0`0&(``
+M<A@A`J`@+8Q%```"(/@)C&8`>"9S``$R8@`_5$``!"80``$"P/@))`0``280
+M``$N`@`#%$#_[@`0$$"NX"_$)`(``=^_`$#?MP`XW[8`,-^U`"C?M``@W[,`
+M&-^R`!#?L0`(W[````/@``@GO0!0+*(`"!!``!*,A"_L``40@#P#``$D8X&@
+M`$,0(8Q"````0``(``````/@``@`@!`M`^``""2"``0#X``()((`"`/@``@D
+M@@`,`^``""2"`'@#X``(```0+0`$)``PQO__``0D`P`&$$``HD@AE*(```""
+M$"I00``$E2+__JT````#X``(K.````""$"I40``,`*D0*P@`B5@DPO__``(0
+M0ZT"```#X``(K.(````"$$.LX@``)$(``0/@``BM`@``$$``#`"@&"V48@``
+M$$3_\P!E$".48@`"`((0*A1`__,`91`C)&,``@!I$"M40/_WE&(```/@``@`
+M````)[W_H/^_`%C_O@!0_[<`2/^V`$#_M0`X_[0`,/^S`"C_L@`@_[$`&/^P
+M`!``@/`M`."(+0$`H"T!0+@M``4L```%+`,`!C0```8T`S$S__\`!11```*$
+M`P``D"TN8@`"%$``30``&"T`Q1`C,$+__P!2$"L40`!')G;__P#%$",P5?__
+M`@`@+0(@*"T"8#`M`Z`X+3P"``(D0B48`$#X"2>H``2/H@`$%$``!(^B```D
+M`@`!KZ(`!(^B```45@`$CZ(``"9B__ZOH@``CZ(````"($``D1@ACZ(`!``"
+M$$``41`AA&,``(1"```48@`$CZ8```"4$"$(`(G'E$,````&,$``T1`AA$<`
+M``('*"./H@`$``(00`!4&"&48P```*,`&```*!(`41`AA$0```"0$",`U#`A
+ME,,```!#`!@``!`2`*(H(0"'(",`I``:```H$E"```$`!P`-,*/__P`>$8``
+M4A`A``(00`!7$"&D0P``)D(``3!2__\F`@`"``(4```"A`,"LA`K$$#_O@(`
+M("TD`P`!`&`0+=^_`%C?O@!0W[<`2-^V`$#?M0`XW[0`,-^S`"C?L@`@W[$`
+M&-^P`!`#X``()[T`8#")__\PI?__,,;__P`'/```!R0#``A$```(1`,0Q0`0
+M`(`0+0$E&",`:``8```8$@#)$",``````$0`&```$!(`8A@A`,40(P!B`!H`
+M`!@24$```0`'``T``QP```,4`P/@``@`````)[W_@/^_`'C_O@!P_[<`:/^V
+M`&#_M0!8_[0`4/^S`$C_L@!`_[$`./^P`#``P)@MKZ@`(*^I`"2OJ@`H`6#P
+M+3"E__^OI0`8,.?__Z^G`!R,E2RDKZ``+``%)```!"0#E,8`%`)@*"TGIP`0
+M/`(``B1")1@`0/@))Z@`%```L"TD`@`#`%8X(X^B`!```AA``&(8(0`#$0``
+M8A@A``,80``'$$``1Q`A``(PP`!F&"$`<R@AE+(`(%)``)DFU@`!CZ(`+``"
+M($"/H@`H`((8(92B`!ZD8@```)U`(92D`"RE!```CZ,`%``#$$``0Q`A``(9
+M``!#$"$``A!``$80(0!3$"$`!"0```0D`Y1#`"R$0@`L`$00*E1```&E`P``
+MCZ,`+``#$$``73`AE,(````"%````AP#``(7P@!B&"$``QA#I,,``(^C`!``
+M`Q!``$,0(0`"&0``0Q`A``<@0`"'("$`!""``$00(0!2$"$``A!``%,0(91%
+M`"JDQ0`(CZ,`%``#$$``0Q`A``(9``!#$"$`1!`A`%(0(0`"$$``4Q`A``4L
+M```%+`.40P`JA$(`*@!%$"I40``!I,,`"(^D`"P`!(A``CV((98B``@``A0`
+M``(T`P`"%\(`PC`A``8P0Z8F``B&)0``CZ(`$``"0$`!`D`A``@1``$"0"$`
+M"$!```>`0`('@"$`$(#``1!`(0$30"$E!P`L)0@`(H^D`"P"0$@M/`,``B1C
+M);P`8/@)`J!0+88E``"&)@`(CZ(`%``"0$`!`D`A``@1``$"0"$`"$!``1!`
+M(0$30"$E!P`L)0@`(H^D`"P"0$@M/`,``B1C);P`8/@))JH"`)8B``B6(P``
+M`$,0(S!"__\00``?``"(+8^D`"P`!*&`/`(``B17)X@`!!!``%V0(0*1@"$`
+M$(!``A6`(8^B`!```A!``%,0(91%``"/H@`4``(00`!3$"&41@``A@<``(8(
+M`@`"X/@)CZ0`&*8"!``F,0`!ED(`")9#````0Q`C,$+__P(B$"L40/_J`I&`
+M(8^F`"PDQ@`!KZ8`+";6``$NP@`$%$#_5R0"``.7H@``CZ,`(*1B`````+`M
+MCZ0`+!"``(X``(@MCZ8`+"3"__\6P@`)`!880``6$$"/I``D`$08(0!=$"&4
+M0@`()$(`!`@`BN2D8@``CZ8`)`!F("$`?1@AA&(`"(1C``(`0Q`A``(?P@!#
+M$"$``A!#I((``!+```H``"@M`!800(^D`"0`1!@AE&/__@!=$"&$0@```&(8
+M(X^F`!P`9B@C`!81P`!5$"&40P0"E$($``!B&",P9___%.```@#@$"TD`@`!
+M!*$`$@!`."T`%A'``%4P(0"G`!@``!`2E,,$``!B&"$``QP```,<`P`1$$``
+M7A`A)C$``01A``(`8"`M```@+22E``$$H/_RI$0````6$$``71@AA&0`"(1C
+M````@R`CCZ8`)`!&$"&40@``CZ8`'`!&$"$`0T@C`200*Q!```(`@$`M`2!`
+M+0`(%```0!@M``(4`P"B$"H00``-`!8Y@``#-`,`$1A``'X8(0#E$"$``A!`
+M`%40(91"!`"D8@``)*4``0"F$"H40/_V)C$``0`6$8``1!`A``(00`!5$"&4
+M0P/^E$(#_`!B&",P9___%.```@#@$"TD`@`!`$`X+0$)$"M00``=)M8``0`)
+M%````A0#`*(0*A!``!<`%A&``$00(0`"$$``52`A``D4```"3`,`J!@C`&<`
+M&```&!*4@@/^`$,0(0`"%````AP#`!$00`!>,"$H8@"`%$```B8Q``$D`P!_
+M)*4``0"I$"H40/_PI,,``";6``&/HP`L`L,0*U1`_W6/I@`L+L(`!!!```LN
+M(@"``!800(^D`"0`1!`AE$/__J1#```FU@`!+L(`!!1`__D`%A!`+B(`@!!`
+M``K?OP!X`!$00`!>$"&40__^I$,``"8Q``$N(@"`%$#_^@`1$$#?OP!XW[X`
+M<-^W`&C?M@!@W[4`6-^T`%#?LP!(W[(`0-^Q`#C?L``P`^``"">]`(`GO?^@
+M_[\`4/^W`$C_M@!`_[4`./^T`##_LP`H_[(`(/^Q`!C_L``0`("0+0#@B"T!
+M`+`M`("H+93B``(P0P#0)`(`P!!B``2,E$9X)`(`T%1B``.4X@`""`"+G":S
+M)_PP0@"@)`,`H!!#``,DDR/H"`"+]```$"T"0"`M/!```"80```"`/@)-`6B
+M;#!7``^6)0```D`@+0)@,"T"X#@M`Z!`+2>I``@"P%`M/`(``B1")_``0/@)
+M`H!8+0)`("T"`/@)-`6B6#P#__\T8S__`$,0))9C`!PD8___``,;@#!CP```
+M0Q`E`D`@+0!`,"T\`@``)$(```!`^`DT!:)8AZ(``!!```27HP````,0(P@`
+MB\6FHB_TIJ`O]#01HH```(`M/`(``"13````$!C``'08(9!F``&08@`#``(2
+M``#","608@`%``(4``#","608@`'``(6``#","4"0"`M`F#X"0(@*"TF$``!
+M+@(`(!1`_^XF,0`$EZ8`"``&,0`PQ@/P`N8P)9>B``H``A*`,$+\``#","67
+MH@`,``(4`#P#`#\`0Q`D`,(P)9>B``X``A6`/`,/P`!#$"0`PC`E`D`@+3P"
+M```D0@```$#X"30%HFPD`@`!W[\`4-^W`$C?M@!`W[4`.-^T`##?LP`HW[(`
+M(-^Q`!C?L``0`^``"">]`&`GO?_P_[\`"/^P````@(`MC(1&>%"```>.!"_L
+M/`(``"1"````0/@)`````*X`1GB.!"_L4(``!XX$+*0\`@``)$(```!`^`D`
+M````K@`O[(X$+*00@``'W[\`"#P"```D0@```$#X"0````"N`"RDW[\`"-^P
+M```#X``()[T`$```("TD!@`#`,00(P`"&$``8A@A``,8P`!E&"&48@`(4$``
+M`R2$``$#X``(A&(`%"R"``140/_U`,00(P``$"T``A0``^``"``"%`,``"`M
+M``000`!$,"$`!A#``$40(91#``A08``')(0``0`&$(``0Q`A``(00`!%$"$#
+MX``(A$(`$BR"``140/_R``000```$"T``A0``^``"``"%`,GO?^P_[\`2/^^
+M`$#_MP`X_[8`,/^U`"C_M``@_[,`&/^R`!#_L0`(_[````"`F"T`H)`M`,"H
+M+:3```"4H@`",$,`T"0"`,`08@`$`."X+20"`-!48@`#E*(``@@`C&4DA2?\
+M,$(`H"2%(^@D`P"@%$,`H0``,"V4I``4)+$`&!"``)T``#`MED4``)8B````
+MHA`K5$``#)9"````!!!``$00(0`"&0``0Q`A``(00`!1$"&40O^:`$40*Q!`
+M`!8`````ED(``)8C````0Q`K$$``"@`$@$`"8"`M/`(``B1",,@`0/@)`B`H
+M+::B```"8"`M"`",_P(@*"T"!(`A`!`1``("@"$`$(!``C"`(0@`C/<F$/^:
+M$(``%```*"V60P``EB(```!#$"L00``/`&`X+0"@,"TDI0`!`*00*A!```H`
+M!1!``$40(0`"&0``0Q`A``(00`!1$"&40@```$<0*U1`__0`H#`M``400`!%
+M$"$``AD``$,0(0`"$$``4?`AE]0````&$$``1A`A``(9``!#$"$``A!``%&P
+M(9;"```"@J`C&H``.P)@("T\$0`")C$PR`(@^`D#P"@M`$"`+0)@("T"(/@)
+M`L`H+0("@".60@``EL,```!#$","`@`8``"`$@)@("T"(/@)`L`H+0!4`!@`
+M`!`2`@*`(0`````"%``:``"`$E*```$`!P`-`!"&```0A@.FL````F`@+3P1
+M``(F,3!\`B#X"0/`*"T`0(`M`F`@+0(@^`D"P"@M`@*`(Y9"``"6PP```$,0
+M(P("`!@``(`2`F`@+0(@^`D"P"@M`%0`&```$!("`H`A``````(4`!H``(`2
+M4H```0`'``T`$(8``!"&`P@`C02F\`````400`!%$"$``AD``$,0(0`"$$``
+M48`AED,``)8"```48@`/```P+0)@("T\`@`")$(PR`!`^`D"`"@MIJ(```)@
+M("T"`"@M/`(``B1",'P`0/@)`````*;B```D!@`!`,`0+=^_`$C?O@!`W[<`
+M.-^V`##?M0`HW[0`(-^S`!C?L@`0W[$`"-^P```#X``()[T`4">]_[#_OP!(
+M_[8`0/^U`#C_M``P_[,`*/^R`"#_L0`8_[``$`"`H"T`H)@M`,"0+206``$0
+MP``4``"(+3P"``(D53$<`!$0P`)B@"$"@"`M`@`H+0.@,"T"H/@))Z<``E!`
+M``4``+`MDZ(``:("``:3H@`#H@(`!R8Q``$",A`K%$#_\0`1$,`"P!`MW[\`
+M2-^V`$#?M0`XW[0`,-^S`"C?L@`@W[$`&-^P`!`#X``()[T`4">]_^#_OP`0
+M_[$`"/^P````H(@M`("`+3P"```D0@```$#X"20$`(000``/K@(O["0"`0"N
+M`D9\/`(``"1"````0/@))`0!`!!```>N`D9X/`(``"1"````0/@))`0&`!1`
+M``6N`BRD)`(``JXB```(`(UV```0+3P"``(D0B_\K@(LJ#P"``(D0AK\K@(L
+MK#P"``(D0B3`K@(LL#P"``(D0AR@K@(LM#P"``(D0B"0K@(LN#P"``(D0BWX
+MK@(LO#P"``(D0C1(K@(LP#P"```D0@``K@(LQ"0"``'?OP`0W[$`"-^P```#
+MX``()[T`(">]_[#_OP!`_[<`./^V`##_M0`H_[0`(/^S`!C_L@`0_[$`"/^P
+M````@)`M`*"@+0#`L"T`X(`M``"(+3P"``$D4X'`/`(``"15```\`@``)%<`
+M```1$$``41`A``(8P`!S&"$``A!``%00(0`"$(``4Q`A`D`@+8QE```"H/@)
+MC$8``"80``$R`@`_5$``!"8Q``$"X/@))`0``28Q``$N(@`>%$#_[``1$$``
+M`(@M/`(``214A)`\`@``)%,``#P"```D50```!$0P`!4$"$"0"`MC$4```)@
+M^`F,1@`$)A```3("`#]40``$)C$``0*@^`DD!``!)C$``2XB`(`40/_R`!$0
+MP```B"T\`@`!)%.(D#P"```D5```/`(``"15````$1!``%$0(0`"&(``<Q@A
+M`%80(0`"$(``4Q`A`D`@+8QE```"@/@)C$8``"80``$R`@`_5$``!"8Q``$"
+MH/@))`0``28Q``$N(@!`5$#_[0`1$$#?OP!`W[<`.-^V`##?M0`HW[0`(-^S
+M`!C?L@`0W[$`"-^P```#X``()[T`4">]_\#_OP`P_[4`*/^T`"#_LP`8_[(`
+M$/^Q``C_L````("@+0"@F"T``*@ME*4``"RB$L`00`!(``"`+22D]W`\!F9F
+M-,9F9P"&`!P``!`2``(0/P`"$$,`!!_#`$,0(P`"&(``8A@A5(,`"I9E````
+M!1!`)%+NX`)&`!P``!`2``(0/P`"$(,`$A_#"`".'P!#D",DI/=0/`9F9C3&
+M9F<`A@`<```0$@`"$#\``A!#``0?PP!#$",``AB``&(8(12#`+8``!`M``40
+M0"12[J`"1@`<```0$@`"$#\``A"#`!(?PP!#D",D%0`!`!*0@#)2`/\"0"`M
+M/`(``"1"````0/@))`4`"`!`D"T"@"`M/`(``"1"````0/@)-`6B!`!`("V6
+M8P``)`()M!!B``,TA@`0)`;_[P"&,"0"@"`M/`(``"1"````0/@)-`6B!`@`
+MCKD`$HD`EF0``#"#__\T`LS,``(4.#1"S,T`8@`<```8$@`#&+X``Q"``$,0
+M(0""$",P0O__)`,``A1#`!TP@O__+((5/!!``!HP@O__EF(``"1"__XP0O__
+M``(8@`!B&"$``QA`/`+__S1"1(``8A@A/`11ZS2$A1\`9``<```@$@`$(#\`
+M!"##``,?PP"#(",DA``!/!```"80```"`/@))`4`"`!`D"T(`(ZU```@+30#
+MS,P``QPX-&/,S0!#`!P``!`2``(1/@`"&(``8A@A``,8@`"#&",P8___5&``
+M#Y9D```L@A0`5$``#)9D```D@NU`/`1F9C2$9F<`1``<```@$@`$(#\`!"##
+M``(7PP""(",(`(ZO``0@@#""__\T`\S,``,<.#1CS,T`0P`<```0$@`"$/X`
+M`AB``&(8(0`#&$``@Q@C,&/__U1@``R69```)(+M0#P$9F8TA&9G`$0`'```
+M(!(`!"`_``0@@P`"%\,`@B`C"`".KP`$($`P@O__-`/,S``#'#@T8\S-`$,`
+M'```$!(``A"^``(8@`!B&"$`@Q@C,&/__Q1@`"8``!`M)(+M0#P$9F8TA&9G
+M`$0`'```(!(`!"`_``0@0P`"%\,`@B`C/!```"80```"`/@))`4`"`!`D"TD
+M!``!`@#X"20%``(`0(`M`!*)```0$(`"(H@E`!400`(BB"4V,1`!,B8`_P*`
+M("T\$```)A````(`^`DT!9B<`!&*`C(F`'\"@"`M`@#X"30%F-BNDQ(T)`(`
+M`=^_`##?M0`HW[0`(-^S`!C?L@`0W[$`"-^P```#X``()[T`0">]_[#_OP!(
+M_[X`0/^W`#C_M@`P_[4`*/^T`"#_LP`8_[(`$/^Q``C_L````("@+3#5__\`
+M@+@M``!`+0``\"T``#@M``"P+0``F"V4H@`",$,!\"0"`-`08@`QC)(O["AB
+M`-$00``()`(!0"0"`*`08@`H)`(`P!!B`"D``!`M"`"0+=^_`$@08@`#)`(!
+M4!1B`3,``!`ME*(``"1"\%\P0O__+$($ZU!```24H@``EN@35`@`CQZ6_A-6
+M)$+K=#!"__\L0@#P4$``!)2B``"6Z!-8"`"/'I;^$UHD0NJ$,$+__RQ"`.%0
+M0``$E*(``);H$UP(`(\>EOX37BQ"%ET40``*```@+9;H$V`(`(\?EOX38I2'
+M$V0(`(\>E)839I;G$VB6]A-J```@+3P"``$D1HN0``00@`!2$"$`!!C``&88
+M(8QC``0DA``!$(#_^:Q#`````"`M/`(``21&BY@`!!"``%(0(0`$&$``9!@A
+M``,80`!U&"$``QB``&88(8QC```DA``!$(#_]:Q#``0``"`M/`(``21&B[``
+M!!"``%(0(0`$&$``9!@A``,80`!U&"$``QB``&88(8QC```DA``!$(#_]:Q#
+M``@``"`M/`(``21&B\@`!!B``'(8(0`$$$``1!`A``(00`!5$"$``A"``$80
+M(8Q"``"L8@`,)(0``2R"`"440/_T``08@)2B``(P0@"`$$``+B91``P"("`M
+M`.`H+20&``,D!P#Q/!```"80```"`/@)``!`+0(@("T"P"@M)`8``R0'`.X"
+M`/@)``!`+0(@("TD!0`!)`8``20'`2,"`/@))`@``HZ#`<PD`@`)$&(`!R0"
+M``H48@`C```@+9:"`=`L0@`$$$``(#P"``$D!``&/`(``"1"````0/@))`4`
+M`R9$``P`0"@M)`8``R0'`(,\`@``)$(```!`^`DD"``#"`"/F```("T"("`M
+M`0`H+20&``,D!P#W/!```"80```"`/@)``!`+0(@("T#P"@M)`8``R0'`/0"
+M`/@)``!`+0``("T\`@`!)$6/0``$&(``<A@A``000`!$$"$``A!``%40(0`"
+M$(``11`AC$(``*QB`*`DA``!+((``Q1`__0`!!B```"`+3P"``$D58N0/`(`
+M`"11```\`@``)%8````0$,``51`A`!`8@`!R&"$"@"`MC$4```(@^`F,9@``
+M)G,``3)B`#]40``$)A```0+`^`DD!``!)A```1(`__$`$!#```"`+3P"``$D
+M58N8/`(``"11```\`@``)%8````0$$``4!`A``(0P`!5$"$`$!B``'(8(0*`
+M("V,10```B#X"8QF``0F<P`!,F(`/U1```0F$``!`L#X"20$``$F$``!$@#_
+M[P`0$$```(`M/`(``215B[`\`@``)%$``#P"```D5@```!`00`!0$"$``A#`
+M`%40(0`0&(``<A@A`H`@+8Q%```"(/@)C&8`""9S``$R8@`_5$``!"80``$"
+MP/@))`0``280``$2`/_O`!`00```@"T\`@`!)%6+R#P"```D40``/`(``"16
+M````$!!``%`0(0`"$,``51`A`!`8@`!R&"$"@"`MC$4```(@^`F,9@`,)G,`
+M`3)B`#]40``$)A```0+`^`DD!``!)A```2X"`"440/_N`!`00```@"T\`@`!
+M)%6/0#P"```D40``/`(``"16````$!!``%`0(0`"$,``51`A`!`8@`!R&"$"
+M@"`MC$4```(@^`F,9@"@)G,``3)B`#]40``$)A```0+`^`DD!``!)A```2X"
+M``,40/_N`!`00*[@+\0D`@`!W[\`2-^^`$#?MP`XW[8`,-^U`"C?M``@W[,`
+M&-^R`!#?L0`(W[````/@``@GO0!0+*(`"!!``!*,A"_L``40@#P#``$D8X^(
+M`$,0(8Q"````0``(``````/@``@`@!`M`^``""2"``0#X``()((`"`/@``@D
+M@@`,`^``""2"`*`#X``(```0+0`$)``PQO__``0D`P`&$$``HD@AE*(```""
+M$"I00``$E2+__JT````#X``(K.````""$"I40``,`*D0*P@`D&`DPO__``(0
+M0ZT"```#X``(K.(````"$$.LX@``)$(``0/@``BM`@``$$``#`"@&"V48@``
+M$$3_\P!E$".48@`"`((0*A1`__,`91`C)&,``@!I$"M40/_WE&(```/@``@`
+M````)[W_H/^_`%C_O@!0_[<`2/^V`$#_M0`X_[0`,/^S`"C_L@`@_[$`&/^P
+M`!``@/`M`."(+0$`H"T!0+@M``4L```%+`,`!C0```8T`S$S__\`!11```*$
+M`P``D"TN8@`"%$``30``&"T`Q1`C,$+__P!2$"L40`!')G;__P#%$",P5?__
+M`@`@+0(@*"T"8#`M`Z`X+3P"``(D0D$X`$#X"2>H``2/H@`$%$``!(^B```D
+M`@`!KZ(`!(^B```45@`$CZ(``"9B__ZOH@``CZ(````"($``D1@ACZ(`!``"
+M$$``41`AA&,``(1"```48@`$CZ8```"4$"$(`)#/E$,````&,$``T1`AA$<`
+M``('*"./H@`$``(00`!4&"&48P```*,`&```*!(`41`AA$0```"0$",`U#`A
+ME,,```!#`!@``!`2`*(H(0"'(",`I``:```H$E"```$`!P`-,*/__P`>$8``
+M4A`A``(00`!7$"&D0P``)D(``3!2__\F`@`"``(4```"A`,"LA`K$$#_O@(`
+M("TD`P`!`&`0+=^_`%C?O@!0W[<`2-^V`$#?M0`XW[0`,-^S`"C?L@`@W[$`
+M&-^P`!`#X``()[T`8#")__\PI?__,,;__P`'/```!R0#``A$```(1`,0Q0`0
+M`(`0+0$E&",`:``8```8$@#)$",``````$0`&```$!(`8A@A`,40(P!B`!H`
+M`!@24$```0`'``T``QP```,4`P/@``@`````)[W_@/^_`'C_O@!P_[<`:/^V
+M`&#_M0!8_[0`4/^S`$C_L@!`_[$`./^P`#``P)@MKZ@`(*^I`"2OJ@`H`6#P
+M+3"E__^OI0`8,.?__Z^G`!R,E2RDKZ``+``%)```!"0#E,8`%`)@*"TGIP`0
+M/`(``B1"03@`0/@))Z@`%```L"TD`@`#`%8X(X^B`!```AA``&(8(0`#$0``
+M8A@A``,80``'$$``1Q`A``(PP`!F&"$`<R@AE+(`(%)``)DFU@`!CZ(`+``"
+M($"/H@`H`((8(92B`!ZD8@```)U`(92D`"RE!```CZ,`%``#$$``0Q`A``(9
+M``!#$"$``A!``$80(0!3$"$`!"0```0D`Y1#`"R$0@`L`$00*E1```&E`P``
+MCZ,`+``#$$``73`AE,(````"%````AP#``(7P@!B&"$``QA#I,,``(^C`!``
+M`Q!``$,0(0`"&0``0Q`A``<@0`"'("$`!""``$00(0!2$"$``A!``%,0(91%
+M`"JDQ0`(CZ,`%``#$$``0Q`A``(9``!#$"$`1!`A`%(0(0`"$$``4Q`A``4L
+M```%+`.40P`JA$(`*@!%$"I40``!I,,`"(^D`"P`!(A``CV((98B``@``A0`
+M``(T`P`"%\(`PC`A``8P0Z8F``B&)0``CZ(`$``"0$`!`D`A``@1``$"0"$`
+M"$!```>`0`('@"$`$(#``1!`(0$30"$E!P`L)0@`(H^D`"P"0$@M/`,``B1C
+M0=P`8/@)`J!0+88E``"&)@`(CZ(`%``"0$`!`D`A``@1``$"0"$`"$!``1!`
+M(0$30"$E!P`L)0@`(H^D`"P"0$@M/`,``B1C0=P`8/@))JH"`)8B``B6(P``
+M`$,0(S!"__\00``?``"(+8^D`"P`!*&`/`(``B170Z@`!!!``%V0(0*1@"$`
+M$(!``A6`(8^B`!```A!``%,0(91%``"/H@`4``(00`!3$"&41@``A@<``(8(
+M`@`"X/@)CZ0`&*8"!``F,0`!ED(`")9#````0Q`C,$+__P(B$"L40/_J`I&`
+M(8^F`"PDQ@`!KZ8`+";6``$NP@`$%$#_5R0"``.7H@``CZ,`(*1B`````+`M
+MCZ0`+!"``(X``(@MCZ8`+"3"__\6P@`)`!880``6$$"/I``D`$08(0!=$"&4
+M0@`()$(`!`@`D>RD8@``CZ8`)`!F("$`?1@AA&(`"(1C``(`0Q`A``(?P@!#
+M$"$``A!#I((``!+```H``"@M`!800(^D`"0`1!@AE&/__@!=$"&$0@```&(8
+M(X^F`!P`9B@C`!81P`!5$"&40P0"E$($``!B&",P9___%.```@#@$"TD`@`!
+M!*$`$@!`."T`%A'``%4P(0"G`!@``!`2E,,$``!B&"$``QP```,<`P`1$$``
+M7A`A)C$``01A``(`8"`M```@+22E``$$H/_RI$0````6$$``71@AA&0`"(1C
+M````@R`CCZ8`)`!&$"&40@``CZ8`'`!&$"$`0T@C`200*Q!```(`@$`M`2!`
+M+0`(%```0!@M``(4`P"B$"H00``-`!8Y@``#-`,`$1A``'X8(0#E$"$``A!`
+M`%40(91"!`"D8@``)*4``0"F$"H40/_V)C$``0`6$8``1!`A``(00`!5$"&4
+M0P/^E$(#_`!B&",P9___%.```@#@$"TD`@`!`$`X+0$)$"M00``=)M8``0`)
+M%````A0#`*(0*A!``!<`%A&``$00(0`"$$``52`A``D4```"3`,`J!@C`&<`
+M&```&!*4@@/^`$,0(0`"%````AP#`!$00`!>,"$H8@"`%$```B8Q``$D`P!_
+M)*4``0"I$"H40/_PI,,``";6``&/HP`L`L,0*U1`_W6/I@`L+L(`!!!```LN
+M(@"``!800(^D`"0`1!`AE$/__J1#```FU@`!+L(`!!1`__D`%A!`+B(`@!!`
+M``K?OP!X`!$00`!>$"&40__^I$,``"8Q``$N(@"`%$#_^@`1$$#?OP!XW[X`
+M<-^W`&C?M@!@W[4`6-^T`%#?LP!(W[(`0-^Q`#C?L``P`^``"">]`(`GO?^@
+M_[\`4/^W`$C_M@!`_[4`./^T`##_LP`H_[(`(/^Q`!C_L``0`("0+0#@B"T!
+M`+@M`("H+93B``(P0P#0)`(`P!!B``2,E$9X)`(`T%1B``.4X@`""`"2HR:S
+M)_PP0@"@)`,`H!!#``(DDR/H)),?U`)`("T\$```)A````(`^`DT!:)L,%8`
+M#Y8E```"0"`M`F`P+0+`."T#H$`M)ZD`"`+@4"T\`@`")$)$$`!`^`D"@%@M
+M`D`@+0(`^`DT!:)8/`/__S1C/_\`0Q`DEF,`'"1C__\``QN`,&/```!#$"4"
+M0"`M`$`P+3P"```D0@```$#X"30%HEB'H@``$$``!)>C`````Q`C"`"2S*:B
+M+_2FH"_T-!&B@```@"T\`@``)%,````0&,``=!@AD&8``9!B``,``A(``,(P
+M)9!B``4``A0``,(P)9!B``<``A8``,(P)0)`("T"8/@)`B`H+280``$N`@`@
+M%$#_[B8Q``27I@`(``8Q`##&`_`"QC`EEZ(`"@`"$H`P0OP``,(P)9>B``P`
+M`A0`/`,`/P!#$"0`PC`EEZ(`#@`"%8`\`P_``$,0)`#","4"0"`M/`(``"1"
+M````0/@)-`6B;"0"``'?OP!0W[<`2-^V`$#?M0`XW[0`,-^S`"C?L@`@W[$`
+M&-^P`!`#X``()[T`8">]__#_OP`(_[````"`@"V,A$9X4(``!XX$+^P\`@``
+M)$(```!`^`D`````K@!&>(X$+^Q0@``'C@0LI#P"```D0@```$#X"0````"N
+M`"_LC@0LI!"```??OP`(/`(``"1"````0/@)`````*X`+*3?OP`(W[````/@
+M``@GO0`0```@+20&``,`Q!`C``(80`!B&"$``QC``&48(91B``A00``#)(0`
+M`0/@``B$8@`4+((`!%1`__4`Q!`C```0+0`"%``#X``(``(4`P``("T`!!!`
+M`$0P(0`&$,``11`AE$,`"%!@``<DA``!``80@`!#$"$``A!``$40(0/@``B$
+M0@`2+((`!%1`__(`!!!````0+0`"%``#X``(``(4`R>]_[#_OP!(_[X`0/^W
+M`#C_M@`P_[4`*/^T`"#_LP`8_[(`$/^Q``C_L````("8+0"@D"T`P+`MI,``
+M`)2B``(P0P#0)`(`P!!B``0`X/`M)`(`T%1B``.4H@`""`"3;"2%)_PP0@"@
+M)`,`H!!#``(DA2/H)(4?U)2D`!0DL0`8$(``G0``,"V610``EB(```"B$"M4
+M0``,ED(````$$$``1!`A``(9``!#$"$``A!``%$0(91"_YH`11`K$$``%@``
+M``"60@``EB,```!#$"L00``*``2`0`)@("T\`@`")$),Y`!`^`D"("@MIL(`
+M``)@("T(`)0&`B`H+0($@"$`$!$``@*`(0`0@$`",(`A"`"3_B80_YH0@``4
+M```H+99#``"6(@```$,0*Q!```\`8#@M`*`P+22E``$`I!`J$$``"@`%$$``
+M11`A``(9``!#$"$``A!``%$0(91"````1Q`K5$#_]`"@,"T`!1!``$40(0`"
+M&0``0Q`A``(00`!1N"&6]`````800`!&$"$``AD``$,0(0`"$$``4:@AEJ(`
+M``*"H",:@``[`F`@+3P1``(F,4SD`B#X"0+@*"T`0(`M`F`@+0(@^`D"H"@M
+M`@*`(Y9"``"6HP```$,0(P("`!@``(`2`F`@+0(@^`D"H"@M`%0`&```$!("
+M`H`A``````(4`!H``(`24H```0`'``T`$(8``!"&`Z;0```"8"`M/!$``B8Q
+M3)@"(/@)`N`H+0!`@"T"8"`M`B#X"0*@*"T"`H`CED(``):C````0Q`C`@(`
+M&```@!("8"`M`B#X"0*@*"T`5``8```0$@("@"$``````A0`&@``@!)2@``!
+M``<`#0`0A@``$(8#"`"4"Z?0````!1!``$40(0`"&0``0Q`A``(00`!1@"&6
+M0P``E@(``!1B``\``#`M`F`@+3P"``(D0DSD`$#X"0(`*"VFP@```F`@+0(`
+M*"T\`@`")$),F`!`^`D`````I\(``"0&``$`P!`MW[\`2-^^`$#?MP`XW[8`
+M,-^U`"C?M``@W[,`&-^R`!#?L0`(W[````/@``@GO0!0)[W_L/^_`$C_M@!`
+M_[4`./^T`##_LP`H_[(`(/^Q`!C_L``0`("@+0"@F"T`P)`M)!8``1#``!0`
+M`(@M/`(``B1533@`$1#``F*`(0*`("T"`"@M`Z`P+0*@^`DGIP`"4$``!0``
+ML"V3H@`!H@(`!I.B``.B`@`')C$``0(R$"L40/_Q`!$0P`+`$"W?OP!(W[8`
+M0-^U`#C?M``PW[,`*-^R`"#?L0`8W[``$`/@``@GO0!0)[W_X/^_`!#_L0`(
+M_[````"@B"T`@(`M/`(``"1"````0/@))`0`K!!```^N`B_L)`(!`*X"1GP\
+M`@``)$(```!`^`DD!`$`$$``!ZX"1G@\`@``)$(```!`^`DD!`8`%$``!:X"
+M+*0D`@`"KB(```@`E'T``!`M/`(``B1"3!BN`BRH/`(``B1"->RN`BRL/`(`
+M`B1"0."N`BRP/`(``B1"-Y"N`BRT/`(``B1".U"N`BRX/`(``B1"2ABN`BR\
+M/`(``B1"4&2N`BS`/`(``"1"``"N`BS$)`(``=^_`!#?L0`(W[````/@``@G
+MO0`@`````$%2-3(Q,```05(U,C$Q``!!4C4R,3(``%)&-3$Q,0``4D8U,3$R
+M``!21C(T,3,``%)&-30Q,P``4D5'3U!37T953D,``````$%T:&5R;W,@,C,Q
+M,R!7:5-O0P```````$%T:&5R;W,@-3(Q,@````!!=&AE<F]S(#4R,3$`````
+M071H97)O<R`U,C$P`````$%T:&5R;W,@-3,Q,B!7:5-O0P```````$%T:&5R
+M;W,@-30R-"\R-#(T`````````$%T:&5R;W,@,C,Q-R!7:5-O0P```````$%T
+M:&5R;W,@,C,Q-2!7:5-O0P```````$%T:&5R;W,@-3(Q,B`H1E!'02D`````
+M`$%T:&5R;W,@-3(Q,2`H1E!'02D``````"A0%BQ8*``````+"```##0```PT
+M```,-```"Q````PT```+)```"S0```Q<```+/```"T@```N(```+9```"W``
+M``M\```+D```#%P```Q<```+Q```"]````PT```+W```##0```OH```+]```
+M#`````Q<```,7```##0```Q<```,/```#%P```Q<```,7```#%0`````_Z#_
+MH_^>_Z#_H_^@``````````4`"@`4`!X`,@!&`%4`6@!?`&0```````H`%``>
+M`"@`,@`\`$8`4`!:`&0````$``8`"0`,````P@```,0```#%````T````-H`
+M``#D````P@```,,```#4````\@```0T```$H````SP```,H``B%0``$!0``$
+M`*``"`#``"``T`!``5`9F`$D!A`F````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````&6P````````````````````````````````
+M`````````````&78````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````________`````)@`````1P``F`@```````"8#`F$CJ8``)@0
+M/3+@````F!0```=K``"8'````````)@@`@("````F"0```X.``"8*`H"`@$`
+M`)@L``-O_```F#````````"8-```#@X``)@X````!P``F#P``@$```"80(EC
+M`````)A$$W(6G```F$@`&+8S``"83!*$83P``)A0#>BXX```F%0`!TA9``"8
+M6'Z`OKH``)A<,3IF7@``F&```!T(``"89``!S@```)AH0)I!D```F'`````/
+M``"8=````(```)AX````!```F0````````"9!````````)D(````````F0P`
+M@`````"9$`````,``)L`````````FP0````@``";"````!```)L,````,```
+MFQ`````(``";%````"@``)L8````*```FQP````$``";(````"0``)LD````
+M%```FR@````T``";+`````P``)LP````+```FS0````"``";.````"(``)L\
+M````$@``FT`````R``";1`````H``)M(````*@``FTP````!``";4````"$`
+M`)M4````$0``FU@````Q``";7`````D``)M@````*0``FV0````%``";:```
+M`"4``)ML````%0``FW`````U``";=`````T``)MX````+0``FWP````#``";
+M@````",``)N$````$P``FX@````S``";C`````L``)N0````*P``FY0````'
+M``";F````"<``)N<````%P``FZ`````W``";I`````\``)NH````+P``FZP`
+M```O``";L````"\``)NT````+P``F[@````O``";O````"\``)O`````+P``
+MF\0````O``";R````"\``)O,````+P``F]`````O``";U````"\``)O8````
+M+P``F]P````O``";X````"\``)OD````+P``F^@````O``";[````"\``)OP
+M````+P``F_0````O``";^````"\``)O\````+P``F@`````=``":!````%T`
+M`)H(````G0``F@P```#=``":$````1T``)H4````(0``FA@```!A``":'```
+M`*$``)H@````X0``FB0````Q``":*````'$``)HL````L0``FC`````<``":
+M-````%P``)HX````*0``FCP```!I``":0````*D``)I$````(```FD@````9
+M``":3````%D``)I0````F0``FE0````P``":6`````4``)I<````)0``FF``
+M``!E``":9````*4``)IH````*```FFP```!H``":<````!\``)IT````'@``
+MFG@````8``":?````%@``)J`````F```FH0````#``":B`````0``)J,````
+M1```FI````"$``":E````!,``)J8````$@``FIP```!2``":H````)(``)JD
+M````T@``FJ@````K``":K````"H``)JP````:@``FK0```"J``":N````!L`
+M`)J\````&@``FL````!:``":Q````)H``)K(````V@``FLP````&``":T```
+M``8``)K4````!@``FM@````&``":W`````8``)K@````!@``FN0````&``":
+MZ`````8``)KL````!@``FO`````&``":]`````8``)KX````!@``FOP````&
+M``"8U````"```)C,````!```F,@`!@$&``"8G````&T``)C`````````F-``
+M```4"0D```````("!@8&!@8&`@(``````````````P`&``D`/```````````
+M````````````````````````\````,P````````````````````*````````
+MX@H``"`!```"`0``&$````````08`````!E7!`4&$"8`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````MM0`````````````````
+M````````````````````````````MR@`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````);`F/";0`````@````)@@55555:JJJJIF
+M9F9FF9F9F?_______P```````````"`````@````0````$``!@````8````&
+M```````P````%0```!4````=````%0``$$``+_P/`"_\#P`O_!\`+_P/```0
+M1``O_`\`+_P/`"_\'P`O_`\``!!(`"_\#P`O_`\`+_P?`"_\#P``$$P`+_P/
+M`"_\#P`O_!\`+_P/```04``O_`\`+_P/`"_\'P`O_`\``!!4`"_\#P`O_`\`
+M+_P?`"_\#P``$%@`+_P/`"_\#P`O_!\`+_P/```07``O_`\`+_P/`"_\'P`O
+M_`\``!!@`"_\#P`O_`\`+_P?`"_\#P``$&0`+_P/`"_\#P`O_!\`+_P/```0
+M<````6@```'@```!N````6@``!`P```",````>````"P```",```$+````V8
+M```1@```'T@```V8```0\```H.```4!H``!8@```H.```(`4!``$``@`"``@
+M`#``!``$````@!P.C8^G#HV/SP%@CY4.C8^G``"8!``````````#````````
+M`````)@@`@("``("`@`"`0(``@("````F"0```X.```.#@``!P<```X.``"8
+M*`H"``$*`@`!!0$```H"``$``)@T```.#@``#@X```X.```.#@``F#@````'
+M````!P````L````+``"81!-R%IP3<A:E$W(6J!-R%IP``)A(`!BZ9P`8NF<`
+M&+II`!BZ:0``F%`,*+3@#"BTX`PHM.`,*+3@``"86'Z`#2Y^@`TN?L`-+GZ`
+M#2X``)A<,3==7C$W75XQ.EU>,3==7@``F&```+T0``"]$```O3@``+T0``"8
+M9``!S@```<X```'.```!S@```)D4```G$```)Q```!5\```G$```F1@```&0
+M```!D````(0```&0``"91&_@$"!OX!`@;^`)(&_@$"```*&`!?\4_P7_%/\%
+M_Q3_!?\9_P``F-0````0````%````!`````0``````````P`````````*(2$
+MG)P````L?'Q\?````#0````%````0`````````!$````"````$@````(````
+M3````!````!0`````````%0````?```(``````````@$````````"`@`````
+M```(#`````````@0````````"!0````````(&`````````@<````````""``
+M```````()````````!(P````````@`0```````"`"````````(`,````````
+M@!@```````"`)````````(`H````,```@"P`!___``"`,`'___\``(`T````
+M,0``@#@```````"`/````````(!`````````@$0````"``"`2````````(!4
+M````````@%@```````"8"````````)@,+820DP``F!!],N````"8%```#VL`
+M`)@<````````F"P``F_^``"8,````````)@\``(!````F$`@:@%Z``"83!*$
+M83P``)A4```(60``F&A`FD&0``"8;`4,L($``)AP````#P``F'0```"```"8
+M>`````P``)D`````````F00```````"9"````````)D,`(``````F1`````!
+M``"9'```"2H``)D@````````F20`!8H%``"9*`````$``)DL````````F3``
+M``````"9-````````)DX````````F3P````_``"90`````0``)E(````````
+MF4P```````"94````````)E475#Q3```F5@````8``"97`!+:HX``*&$!O\%
+M_P``H8@'_P?_``"AC`C_"/\``*&0"?\)_P``H90*_PK_``"AF`O_"_\``*&<
+M#/\,_P``H:`-_PW_``"AI`__#O\``*&H$O\2_P``H:P4_Q/_``"AL!;_%?\`
+M`*&T&?\7_P``H;@;_QK_``"AO![_'?\``*'`(_\@_P``H<0G_R7_``"AR"S_
+M*?\``*',,?\O_P``H=`W_S3_``"AU#K_.O\``*'8.O\Z_P``H=PZ_SK_``"A
+MX#K_.O\``*'D.O\Z_P``H>@Z_SK_``"A[#K_.O\``*'P.O\Z_P``H?0Z_SK_
+M``"A^#K_.O\``*'\.O\Z_P``FP````````";!````"```)L(````$```FPP`
+M```P``";$`````@``)L4````*```FQ@````$``";'````"0``)L@````%```
+MFR0````T``";*`````P``)LL````+```FS`````"``";-````"(``)LX````
+M$@``FSP````R``";0`````H``)M$````*@``FT@````&``";3````"8``)M0
+M````%@``FU0````V``";6`````X``)M<````+@``FV`````!``";9````"$`
+M`)MH````$0``FVP````Q``";<`````D``)MT````*0``FW@````%``";?```
+M`"4``)N`````%0``FX0````U``";B`````T``)N,````+0``FY`````#``";
+ME````",``)N8````$P``FYP````S``";H`````L``)ND````*P``FZ@````K
+M``";K````"L``)NP````*P``F[0````K``";N````"L``)N\````*P``F\``
+M```K``";Q````"L``)O(````*P``F\P````K``";T````"L``)O4````*P``
+MF]@````K``";W````"L``)O@````*P``F^0````K``";Z````"L``)OL````
+M*P``F_`````K``";]````"L``)OX`````@``F_P````6``"8U````"```)C8
+M`&`0:```F@````&I````````F@0```'I````0```F@@````I````@```F@P`
+M``!I```!4```FA````&9```!D```FA0```'9```!T```FA@````9````$```
+MFAP```!9````1```FB````"9````A```FB0```&E```!2```FB@```'E```!
+MB```FBP````E```!R```FC````'(````%```FC0````(````0@``FC@```!(
+M````@@``FCP```"(```!>```FD````&8```!N```FD0```'8```!^```FD@`
+M```8````$@``FDP```!8````4@``FE````"8````D@``FE0```&D```!?```
+MFE@```'D```!O```FEP````D```!_```FF````!D````"@``FF0```"D````
+M2@``FF@```#D````B@``FFP```$*```!6@``FG````%*```!F@``FG0```&*
+M```!V@``FG@```'*````#@``FGP````*````3@``FH````!*````C@``FH0`
+M``"*```!7@``FH@```&Z```!G@``FHP```'Z```!W@``FI`````Z````"0``
+MFI0```!Z````20``FI@```&&````B0``FIP```'&```!>0``FJ`````&```!
+MN0``FJ0```!&```!^0``FJ@```"&````.0``FJP```#&````>0``FK````#&
+M````N0``FK0```#&```!O0``FK@```#&```!_0``FKP```#&````/0``FL``
+M``#&````?0``FL0```#&````O0``FL@```#&````_0``FLP```#&````_0``
+MFM````#&````_0``FM0```#&````_0``FM@```#&````_0``FMP```#&````
+M_0``FN````#&````_0``FN0```#&````_0``FN@```#&````_0``FNP```#&
+M````_0``FO````#&````_0``FO0```#&````_0``FO@```#&````_0``FOP`
+M``#&````_0````$```!&`&````````$```!&`&$```````$```!&`&(`````
+M``$```!&`&,```````$```!&`&0```````$```!&`&4```````$```!&`&8`
+M``````$```!&`&<```````$```!&`&@```````$```!&`&D```````$```!&
+M`&H```````$```!&`&L```````$```!&`&P```````$```!&`'0```````$`
+M``!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'0`````
+M``$```!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'4`
+M``````$```!&`'8```````$```!&`'<```````$```!&`'@```````$```!&
+M`'D```````$```!&`'H```````$```!&`'L```````$```!&`'P```````$`
+M``!&`'T```````$```!&`'X```````$```!&`'\```````$```!&`(``````
+M``$```!$`'P```````$```!&`(@```````$```!&`(P```````$```!&`)``
+M``````$```!&`)0```````$```!&`)@```````$```!&`)P```````$```!&
+M`*````````$```!&`*0```````$```!&`*@```````$```!&`*P```````$`
+M``!&`+````````$```!&`+0````"!P``````%IX`"Q9B``H6.@`)%AP`"!7J
+M``<5F@`%%4H`!!4#``(460```````0````,`!@`)`#\````!`TP``0-,``$#
+MA``!`X0``0.\``$#O``!`_0``0/T``````````D````$``0``0`!``$````&
+M1D<X```````````````````$`````0`!````!$9'-P``````````````````
+M`P`!``$``0````-&1S8```````````````````0```````$````!1D<U````
+M```````````````$``$``0```````$9'-```````````````````!`````$`
+M`/____Y&1S,```````````````````,``0`!``#____]1D<R````````````
+M```````$````````_____$9',0```````````````````@`!``$``/____I&
+M1S```````````````````````````````````````````````````````!E4
+M$!0&$"8`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``$A>```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````);`F/";0`
+M``D("6P)M```____R?___\G____)____R?___\(`````____\O____+____R
+M____\O____0`````____P/___\#____`____P/___[H`````____LO___[+_
+M__^R____LO___[``````________```%`@\'`@\*``\)``\```````"`````
+MF"!55555JJJJJF9F9F:9F9F9``%"=``!0A@``4(@``%"P``!0CP``4*T````
+M`````"`````@````0````$``!@````8````&```6G@`+%F(`"A8Z``D6'``(
+M%>H`!Q6:``452@`$%0,``A19```+N``!```````!7,P``5I```%:C``!6JP`
+M`5S,``%;#``!7,P``5S,``%<S``!7,P``5S,``%;-``!7,P``5S,``%<S``!
+M7,P``5L\``%;6``!7,P``5ND``%;R``!7,P``5K8``%<S``!7,P``5S,``%<
+M#``!7!@``5S,``%<*``!7,0``5S$``%<G``!7*0``5RL``%<M``!7+P`````
+M````!@````$````"`````P````0````%``%?```!7P```5U```%=7``!7P``
+M`5V<``%?```!7P```5\```%?```!7P```5W4``%?```!7P```5\```%?```!
+M7?P``5\```%?```!7@@``5[(``%?```!7P```5\```%?```!7P```5XX``%>
+M.``!7P```5Z,````````$$``+_P/`"_\#P`O_!\`+_P/`"_\#P``$$0`+_P/
+M`"_\#P`O_!\`+_P/`"_\#P``$$@`+_P/`"_\#P`O_!\`+_P/`"_\#P``$$P`
+M+_P/`"_\#P`O_!\`+_P/`"_\#P``$%``+_P/`"_\#P`O_!\`+_P/`"_\#P``
+M$%0`+_P/`"_\#P`O_!\`+_P/`"_\#P``$%@`+_P/`"_\#P`O_!\`+_P/`"_\
+M#P``$%P`+_P/`"_\#P`O_!\`+_P/`"_\#P``$&``+_P/`"_\#P`O_!\`+_P/
+M`"_\#P``$&0`+_P/`"_\#P`O_!\`+_P/`"_\#P``$#````(P```!X````+``
+M``%@```!X```$'````%H```!X````;@```&,```!X```$+````Y@```1@```
+M'QP``#XX```1@```$/```*#@``%`:```6(```+#@``%`:```@!0#Z`/H!N`&
+MX`0@!"`(0`A`!N`&X```F`0``````````P```````````````P``F"`"`@(`
+M`@("``(!`@`"`@(``@("````F"0```X.```.#@``!P<```X.```.#@``F$03
+M<A8<$W(<)1-R%R(3<A:B$W(<)0``F&```)T0``"=$```G1@``)T8``"=$```
+MF&0``<X```'.```!S@```<X```'.````F&A`FD&00)I!D$":09!`FD&00)I!
+MD```F1@```&X```!N````(0```$(```!N```F200!8H%$`6*!1`%B@40!8H%
+M$`6*!0``HC````````````````````$(``````````P`````````-`````4`
+M``!``````````$0````(````2`````@```!,````$````%``````````5```
+M`!\```@`````````"`0````````("`````````@,````````"!`````````(
+M%`````````@8````````"!P````````((`````````@D````````$G``````
+M```0.````````!!X````````$+@````````0^````````!$X````````$7@`
+M```````1N````````!'X````````$C@````````2>````````!*X````````
+M$O@````````3.````````!-X````````$[@````````3^````````!0X````
+M````%'@````````4N````````!3X````````%3@````````5>````````!6X
+M````````%?@````````6.````````!9X````````%K@````````6^```````
+M`!<X````````%W@````````7N````````!?X````````$#P````````0?```
+M`````!"\````````$/P````````1/````````!%\````````$;P````````1
+M_````````!(\````````$GP````````2O````````!+\````````$SP`````
+M```3?````````!.\````````$_P````````4/````````!1\````````@`0`
+M``````"`"````````(`,````````@"````````"`)````````(`H````,```
+M@"P`!___``"`,`'___\``(`T````,0``@#@```````"`/````````(!(````
+M````@%0```````"`6````````(!<``_'CP``@,`J@C`:``"`Q`7<`>```(#(
+M'T`G$```@,P!]`````"`T```'AP``(#4``*JJ@``@-@"`%55``"`W```````
+M`(#@_____P``@.0``/__``"`Z````````(#L````````@/````````"`]```
+M`````(#X````````@/P```"(``"'`````````(<$````C```AP@```#D``"'
+M#````M4``(<0````````AQ0```````"'&````*```(<<```!R0``AR`````L
+M``"')````"P``(<H````,```ARP````\``"',````"P``(<T````+```AS@`
+M```P``"'/````#P``(=`````````AT0```````"'2````````(=,````````
+MAU````````"'5````````(=8````````AUP```````"'8````-4``(=D````
+MWP``AV@```$"``"';````3H``(=P````=0``AW0```!_``"'>````*(``(=\
+M````````@0```0`"``"!!`````$``($(````P```@0P```````"!$````6@`
+M`($4````````A\`#`@$```"'Q`<&!00``(?("PH)"```A\P/#@T,``"'T!,2
+M$1```(?4%Q85%```A]@;&AD8``"'W!\>'1P``(?@`P(!````A^0'!@4$``"'
+MZ`L*"0@``(?L#PX-#```A_`3$A$0``"']!<6%10``(?X&QH9&```A_P?'AT<
+M``"8#*V$CAD``)@0?2C@````F!2<"I]K``"8'````````)A`(&H!>@``F%0`
+M``A9``"9`````````)D$````````F0@```````"9#`"``````)D0`````0``
+MF1P```R```"9(`40`````)DH`````0``F2P````$``"9-!X?("(``)DX"@L,
+M#0``F3P````_``"92)*`LA(``)E475#AB```F5P`2VJ.``"9:````\X``)EP
+M&2^U%0``F7@````!``"9?````````*(0`(!C,P``HA0`$&P0``"B&`"<0&``
+M`*(@`8@PQ@``HB0```0```"B+````````*(T("`@(```HC@@("`@``"B0#A)
+M"B```*)$``![M@``HD@/_S_\``";`````````)LH````#```FS@````2``";
+M9````"$``)N,````+0``FYP````S``$``@`"``$``0`"``$```````,`!@`)
+M`#\````````````#``8`"0`_````````````"0````0`!``!``$``0``````
+M````````!D9'.```````````````````!`````$``0``````````````!$9'
+M-P```````````````````P`!``$``0```````````````T9'-@``````````
+M````````!````````0```````````````49'-0``````````````````!``!
+M``$``````````````````$9'-```````````````````!`````$`````````
+M````_____D9',P```````````````````P`!``$`````````````_____49'
+M,@``````````````````!```````````````````_____$9',0``````````
+M`````````@`!``$`````````````____^D9',```````````````````````
+M```````````````````````````````````````````````(`````0`#````
+M```````````````````&1D<W```````````````````"````````````````
+M````````1D<V```````````````````!``````````````````#____]1D<U
+M``````````````````````````````````````#____Z1D<T````````````
+M``````````$``0````````````#____X1D<S``````````````````````$`
+M`0````$``0````#____V1D<R``````````````````````$````!``$``0``
+M``#____S1D<Q``````````````````````$````!``$````!``#____P1D<P
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````'\`
+M```R````?P```"@```!_````30```'\```!`````'P```!`````_````,```
+M``@````&``````````0````(``````````(````$````!@````@````*````
+M#`````X````0``':"``!TM0``=0D``'6P``!UU@``=@@``'9!``````````P
+M``"`%0``@!4``(`5``"`%0``@!4``(`<$HV/IPF(#\\$X`^5$N`/JPF(#\\`
+M`)@H"@(``0H"``$%`0$`"@(``0H"``$``)@T```.#@``#@X```X.```.#@``
+M#@X``)@X````!P````<````+````"P````L``)A(`!C:6@`8VEH`&,II`!C*
+M:0`8RFD``)A0#>BTX`WHM.`-Z+3@#>BTX`WHM.```)A8?H`-+GZ`#2Y^Z$TN
+M?NA-+GZ`#2X``)A<,3=F7C$W9EXQ-V9>,3=F7C$W85X``)AL!0RP@04,L($%
+M#+"!!0RP@`4,L(```)D4```G$```)Q```!5\```J^```)Q```)E$][@0(/>X
+M$"#WN`T@][@0(/>X$"```*(,9"Q!:F0L06ID0$%J9$!!:F1`06H``*(<&(.`
+M"AB#@`H8<X`*&(.`"AB#@`H``!(P````````F`@```````"8+``"+_X``)@\
+M``(!````F$P2A&$\``"9,```2(,``)E`````!```F5@```#_``"9=```````
+M`)GX````&```H@0```````"B"-`^9X@``*(H```!M0``HCP3R(FO``";!```
+M`"```)L(````$```FPP````P``";$`````@``)L4````*```FQ@````$``";
+M'````"0``)L@````%```FR0````T``";+````"P``)LP`````@``FS0````B
+M``";/````#(``)M`````"@``FT0````J``";2`````8``)M,````)@``FU``
+M```6``";5````#8``)M8````#@``FUP````N``";8`````$``)MH````$0``
+MFVP````Q``";<`````D``)MT````*0``FW@````%``";?````"4``)N`````
+M%0``FX0````U``";B`````T``)N0`````P``FY0````C``";F````!,``)N@
+M````"P``FZ0````K``";J````"L``)NL````*P``F[`````K``";M````"L`
+M`)NX````*P``F[P````K``";P````"L``)O$````*P``F\@````K``";S```
+M`"L``)O0````*P``F]0````K``";V````"L``)O<````*P``F^`````K``";
+MY````"L``)OH````*P``F^P````K``";\````"L``)OT````*P``F_@````"
+M``";_````!8``)B<`````````````````````````````)B<````````````
+M`````````````````)B<`````````````````````````````)B<````````
+M`````````````````````)B<`````````````````````````````)B<````
+M`````````````````````````)B<`````````````````````````````)B<
+M`````````````````````````````)B<````````````````````````````
+M`)B<`````````````````````````````)B<````````````````````````
+M`````)B<`#@````X````.````#@````X`````)B<````````````````````
+M`````````)B<`````````````````````````````)B<``````````````#`
+M````@````(```)B<``0`^0`$`/D`!`#_``0`_0`$`/T``)C4````````````
+M```$````!`````0``)H````!J0```````)H$```!Z0```$```)H(````*0``
+M`(```)H,````:0```5```)H0```!F0```9```)H4```!V0```=```)H8````
+M&0```!```)H<````60```$0``)H@````F0```(0``)HD```!I0```4@``)HH
+M```!Y0```8@``)HL````)0```<@``)HP```!R````!0``)HT````"````$(`
+M`)HX````2````((``)H\````B````7@``)I````!F````;@``)I$```!V```
+M`?@``)I(````&````!(``)I,````6````%(``)I0````F````)(``)I4```!
+MI````7P``)I8```!Y````;P``)I<````)````?P``)I@````9`````H``)ID
+M````I````$H``)IH````Y````(H``)IL```!"@```5H``)IP```!2@```9H`
+M`)IT```!B@```=H``)IX```!R@````X``)I\````"@```$X``)J`````2@``
+M`(X``)J$````B@```5X``)J(```!N@```9X``)J,```!^@```=X``)J0````
+M.@````D``)J4````>@```$D``)J8```!A@```(D``)J<```!Q@```7D``)J@
+M````!@```;D``)JD````1@```?D``)JH````A@```#D``)JL````Q@```'D`
+M`)JP````Q@```+D``)JT````Q@```;T``)JX````Q@```?T``)J\````Q@``
+M`#T``)K`````Q@```'T``)K$````Q@```+T``)K(````Q@```/T``)K,````
+MQ@```/T``)K0````Q@```/T``)K4````Q@```/T``)K8````Q@```/T``)K<
+M````Q@```/T``)K@````Q@```/T``)KD````Q@```/T``)KH````Q@```/T`
+M`)KL````Q@```/T``)KP````Q@```/T``)KT````Q@```/T``)KX````Q@``
+M`/T``)K\````Q@```/T``)C4````(```F-0````0````%````!`````0````
+M%```F-@`8!!H`&`0:`!@$&@`8!!H`&`0:```F)P`````````````````````
+M````````F)P`````````````````````````````F)P`````````````````
+M````````````F)P`````````````````````````````F)P`````````````
+M````````````````F)P0````$````!`````0````$```````F)P$````!```
+M``0````$````!```````F)P`````````````````````````````F)P`````
+M````````````````````````F)P`````````````````````````````F)P`
+M``````````H`````````````````F)P`.`#``#@`@`(X`,``.`#``#@`P```
+MF)P``@`&``(`!@````8``@`&``(`!@``F)P```")````B0```(D```")````
+MB0``F)P```"@````H````*````"@````H```F)P`!``'``0`!P`$``<`!``'
+M``0`!P``F-0````:````&@```!H````:````&@``F)P```!`````2````$``
+M``!`````0```F)P````0````$````!`````0````$```F)P````(````"```
+M``@````(````"```F)P```!/````3P```$\```!/````3P``F)P```#Q````
+M\0```&$```#Q````\0``F)P``)!/``"03P``D$P``)!/``"03P``F)P``!):
+M```26@``$IH``!):```26@``F,P````.````#@````\````.````#@````$`
+M``!&`&````````$```!&`&$```````$```!&`&(```````$```!&`&,`````
+M``$```!&`&0```````$```!&`&4```````$```!&`&8```````$```!&`&<`
+M``````$```!&`&@```````$```!&`&D```````$```!&`&H```````$```!&
+M`&L```````$```!&`&P```````$```!&`'0```````$```!&`'0```````$`
+M``!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'0`````
+M``$```!&`'0```````$```!&`'0```````$```!&`'4```````$```!&`'8`
+M``````$```!&`'<```````$```!&`'@```````$```!&`'D```````$```!&
+M`'H```````$```!&`'L```````$```!&`'P```````$```!&`'T```````$`
+M``!&`'X```````$```!&`'\```````$```!&`(````````$```!$`'P`````
+M``$```!&`(@```````$```!&`(P```````$```!&`)````````$```!&`)0`
+M``````$```!&`)@```````$```!&`)P```````$```!&`*````````$```!&
+M`*0```````$```!&`*@```````$```!&`*P```````$```!&`+````````$`
+M``!&`+0````!ZS0``>L\``'K1``!ZTP``>MD``'K9``!ZU0``>M<%IX`!A9B
+M``06.@`#%AP``A7J``$5F@``%4H``!4#``$460`#"[@`!0``````````````
+M,```@!4``(`5``"`%0``@!4``(`5``"`'!*-DZ<)B!//!.`3E1+@$ZL)B!//
+M``"8*`H"``$*`@`!!0(!``H"``$*`@`!``"8-```#@X```X.```.#@``#@X`
+M``X.``"8.`````<````'````"P````L````+``"82``8VFT`&-IM`!C*=0`8
+MRG4`&,IU``"84`WHM.`-Z+3@#>BTX`WHM.`-Z+3@``"86'Z`#2Y^@`TN?N@-
+M+G[H#2Y^@`TN``"87#$W9EXQ-V9>,3=F7C$W9EXQ-V9>``"8;`4,L($%#+"!
+M!0RP@04,L($%#+"!``"9%```!]````?0```$3```")@```?0``"91/>X$"#W
+MN!`@][@-$/>X$!#WN!`0``"B!```````````````"`````@````(``"B"-:^
+M9XC6OF>(T#YGB-`^9XC0/F>(``"B#&0L`4!D+`%`9$+!8&1"P6!D0L%@``"B
+M'!B#@`H8@X`*&'.`"AB#@`H8@X`*```2,````````)@(````````F"P``B_^
+M``"8/``"`0```)A,$H1A/```F3```$B"``"90`````0``)E8````_P``F70`
+M``````"B*````;4``*(\$\B)KP``FP0````!``";"`````(``)L,`````P``
+MFQ`````$``";%`````4``)L8````"```FQP````)``";(`````H``)LD````
+M"P``FRP````-``";,````!```)LT````$0``FSP````3``";0````!0``)M$
+M````%0``FT@````8``";3````!D``)M0````&@``FU0````;``";6````!P`
+M`)M<````'0``FV`````@``";:````"(``)ML````(P``FW`````D``";=```
+M`"4``)MX````*```FWP````I``";@````"H``)N$````*P``FX@````L``";
+MD````#```)N4````,0``FY@````R``";H````#0``)ND````-0``FZ@````U
+M``";K````#4``)NP````-0``F[0````U``";N````#4``)N\````-0``F\``
+M```U``";Q````#4``)O(````-0``F\P````U``";T````#4``)O4````-0``
+MF]@````U``";W````#4``)O@````-0``F^0````U``";Z````#4``)OL````
+M-0``F_`````U``";]````#4``)OX````$```F_P````:``":``````<````'
+M``":!````$<```!'``":"````(<```"'``":#````:````&@``":$````>``
+M``'@``":%````"`````@``":&````&````!@``":'````:$```&A``":(```
+M`>$```'A``":)````"$````A``":*````&$```!A``":+````6(```%B``":
+M,````:(```&B``":-````>(```'B``":.````"(````B``":/````&(```!B
+M``":0````6,```%C``":1````:,```&C``":2````>,```'C``":3````",`
+M```C``":4````&,```!C``":5````80```&$``":6````<0```'$``":7```
+M``0````$``":8````>H````+``":9````"H```!+``"::````&H```"+``":
+M;````*H```&L``":<````:L```'L``":=````>L````L``":>````"L````2
+M``":?````&L```!2``":@````*L```"2``":A````:P```&3``":B````>P`
+M``'3``":C````"P````3``":D````#H```!3``":E````'H```"3``":F```
+M`+H```&4``":G````;L```'4``":H````?L````4``":I````#L````Z``":
+MJ````'L```!Z``":K````+L```"Z``":L````;P```&[``":M````?P```'[
+M``":N````#P````[``":O````'P```![``":P````+P```"[``":Q````/P`
+M``&\``":R````/P```'\``":S````/P````\``":T````/P```!\``":U```
+M`/P```"\``":V````/P```#\``":W````/P```#\``":X````/P```#\``":
+MY````/P```#\``":Z````/P```#\``":[````/P```#\``":\````/P```#\
+M``":]````/P```#\``":^````/P```#\``":_````/P```#\``"8U````"``
+M`)C0`P8$"`,'!`@#!@0(`P8$"`,'!`@``)C<`*`@P`"@(,``X"#``.`@P`#@
+M(,```)B<#P````\````/````#P````\``````)B<````````````````````
+M`````````)B<`(````"`````@````(````"``````)B<`"H````J````*@``
+M`"H````J`````)B<``$````!`````0````$````!`````)B<````````````
+M`````````````````)B<`!@````8````&````!@````8`````)B<`&````!@
+M````;@```&X```!N`````)B<`,<```#'````QP```,<```#'`````)B<`$L`
+M``!+````2P```$L```!+`````)B<!$@```1(```$2```!$@```1(`````)B<
+M`$P```!,````3````$P```!,`````)B<`.0```#D````Y````.0```#D````
+M`)B<`````````````````````````````)B<`/P```#\````_````/P```#\
+M`````)B<`/\```#_````_P```/\```#_`````)B<!#\```0_```$/P``!#\`
+M``0_`````)B<``P````,````#`````P````,`````)B<`AD```(9```"&0``
+M`AD```(9`````)B<`"0````D````)````"0````D`````)B<`+0```"T````
+MM````+0```"T`````)B<`)D```"9````F0```)D```"9`````)B<`%````!0
+M````4````%````!0`````)B<`"H````J````*@```"H````J`````)B<`!(`
+M```2````$@```!(````2`````)B<P#(``,`R``#`,@``P#(``,`R`````)B<
+M`70```%T```!=````70```%T`````)B<`!$````1````$0```!$````1````
+M`)B<AB@``(8H``"&*```AB@``(8H`````)B<,80``#&$```QA```,80``#&$
+M`````)B<`/(`@`#R`(``\@"``/(`@`#R`(```)B<`"<`&0`G`!D`)P`9`"<`
+M&0`G`!D``)B<`````P````,````#`````P````,``)B<````````````````
+M`````````````)B<````L@```+(```"R````L@```+(``)B<`+`@A`"P((0`
+ML""$`+`@A`"P((0``)B<`$$EI`!!):0`026D`$$EI`!!):0``)B<`!&2(``1
+MDB``$9(@`!&2(``1DB```)B<`!I(```:2```&D@``!I(```:2````)C8``L"
+M,``+`C``"P(P``L",``+`C```)B<````E````)0```"4````E````)0``)B<
+M````D0```)$```"1````D0```)$``)B<````$@```!(````2````$@```!(`
+M`)B<````@````(````"`````@````(```)B<````V0```-D```#9````V0``
+M`-D``)B<````8````&````!@````8````&```)B<````\````/````#P````
+M\````/```)B<````H@```*(```"B````H@```*(``)B<````4@```%(```!2
+M````4@```%(``)B<````U````-0```#4````U````-0``)B<```4S```%,P`
+M`!3,```4S```%,P``)B<```$C```!(P```2,```$C```!(P``)C$`````P``
+M``,````#`````P````,``@%,``(!)``"`2P``@$T``(!3``"`4P``@$\``(!
+M1````#`````5````%0```!4````5````%0``@!P2C9.G"8@3SP3@$Y42X!.K
+M"8@3SP``F"@*`@`!"@(``04"```*`@`!"@(``0``F#0```X````.````#@``
+M``X````.````F#@````"`````@````H````*````"@``F$@`&-IM`!C:;0`:
+M:F0`&FID`!IJ9```F%`-Z+3@#>BTX`WHL-H,F+#:#>BPV@``F%A^@`TN?H`-
+M+G[H#2Y^R`TN?H`-+@``F%PQ-V9>,3=F7C$W9EXQ.6!>,3=F7@``F&P%#+"!
+M!0RP@04,L($%#+"!!0RP@0``F10```?0```'T```!$P```B8```'T```F43W
+MN!``][@0`/>X#0#WN!``][@0````H@0`````````````````````````````
+MH@C6OF>(UKYGB-`^9XC0/F>(T#YGB```H@P`+`%``"P!0`!"P4``0L%``$+!
+M0```HAP8@X`*&(.`"AAC@`H8@X`*&(.`"@``$C````/@``"`8`````\``($8
+M````````@1P```````"!(````````($D````````@2@```````"!+```````
+M`($P````````@30```````"!.````````($\````````@4"```"H``"!1```
+M`````)@(````````F"P``*````"8/``@!````)A,$H0C/```F'`````?``"8
+M=````(```)AX````#@``F5@```#_``"9@````````)F$`H``````F:``````
+M``"9X````````)GDJJJJJ@``F>@\1F1X``"9[````*H``)GP````#```F?0`
+M``#_``"9^````!0``*(H```)M0``HCR3R(FO``"B3`````$``*)0``"@````
+MHE0```````"B6`S'4X```*)<#P\/`0``HF!?:0\!``"B9`!!BA$``*)H````
+M````HFP,,,%J``"B<`""""```*)T`!M\J@``HG@<YSG.``"B?`47`<X``*,`
+M&`$`````HP0P`R8"``"C"$@'/@8``*,,5@M,"@``HQ!D&F`/``"C%'A/;AL`
+M`*,8AH]\6@``HQR.SX9;``"C()U/EP\``*,DI<^ACP``HRBU7Z\?``"C++W?
+MN9\``*,PS7_'/P``HS35_]&_``"C.````````*,\````````HT````````"C
+M1````````*-(/____P``HTP_____``"C4#____\``*-4``/__P``HUAYJ*H?
+M``"C7`9L0@\``*-@#R@B!P``HV078!:%``"C:!^`$00``*-L-Z`,`P``HW`_
+MQ`B#``"C=%?`"`,``*-X7]@&@@``HWQ_X`2"``"C@'\\>[H``*.$\S!_\```
+MFP0````!``";"`````(``)L,`````P``FQ`````$``";%`````4``)L8````
+M"```FQP````)``";(`````H``)LD````"P``FRP````-``";,````!```)LT
+M````$0``FSP````3``";0````!0``)M$````%0``FT@````8``";3````!D`
+M`)M0````&@``FU0````;``";6````!P``)M<````'0``FV`````@``";:```
+M`"(``)ML````(P``FW`````D``";=````"4``)MX````*```FWP````I``";
+M@````"H``)N$````*P``FX@````L``";D````#```)N4````,0``FY@````R
+M``";H````#0``)ND````-0``FZ@````U``";K````#4``)NP````-0``F[0`
+M```U``";N````#4``)N\````-0``F\`````U``";Q````#4``)O(````-0``
+MF\P````U``";T````#4``)O4````-0``F]@````U``";W````#4``)O@````
+M-0``F^0````U``";Z````#4``)OL````-0``F_`````U``";]````#4``)OX
+M````$```F_P````:``":``````````````":!`````````!```":"```````
+M``"```":#`````````&!``":$`````````'!``":%``````````!``":&```
+M``````!!``":'`````````"!``":(`````````%H``":)`````````&H``":
+M*`````````'H``":+``````````H``":,`````````!H``":-`````````&)
+M``":.`````````')``":/``````````)``":0`````````!)``":1```````
+M``")``":2`````````&0``":3`````````'0``":4``````````0``":5```
+M``````!0``":6`````````"0``":7`````````&1``":8`````````'1``":
+M9``````````1``"::`````````!1``":;`````````"1``":<`````````%X
+M``":=`````````&X``":>`````````'X``":?``````````X``":@```````
+M``!X``":A`````````&9``":B`````````'9``":C``````````9``":D```
+M``````!9``":E`````````"9``":F`````````#9``":G`````````#Y``":
+MH`````````#Y``":I`````````#Y``":J`````````#Y``":K`````````#Y
+M``":L`````````#Y``":M`````````#Y``":N`````````#Y``":O```````
+M``#Y``":P`````````#Y``":Q`````````#Y``":R`````````#Y``":S```
+M``````#Y``":T`````````#Y``":U`````````#Y``":V`````````#Y``":
+MW`````````#Y``":X`````````#Y``":Y`````````#Y``":Z`````````#Y
+M``":[`````````#Y``":\`````````#Y``":]`````````#Y``":^```````
+M``#Y``":_`````````#Y``"8U````"```)C0`@`4"`(!%`@"`!0(`@`4"`(!
+M%`@``)C<`*`@P`"@(,``X"#``.`@P`#@(,```)B<\````/````#P````\```
+M`/```````)B<`````````````````````````````)B<`P````,````#````
+M`P````,``````)B<`````````````````````````````)B<````````````
+M`````````````````)B<`````````````````````````````)B<````````
+M`````````````````````)B<`````````````````````````````)B<0$``
+M`$!```!`0```0$```$!``````)B<904``&4%``!E!0``904``&4%`````)B<
+M`````````````````````````````)B<````````````````````````````
+M`)B<`$(```!"````0@```$(```!"`````)B<`+4```"U````M0```+4```"U
+M`````)B<``,````#`````P````,````#`````)B<`/<```#W````]P```/<`
+M``#W`````)B<`)T```"=````G0```)T```"=`````)B<`"(````B````(@``
+M`"(````B`````)B<!"(```0B```$(@``!"(```0B`````)B<`",`&``C`!@`
+M(P`8`",`&``C`!@``)B<`"@````H````*`!@`"@`8``H`&```)B<`%``P`!0
+M`,``4`##`%``PP!0`,,``)B<``0`?P`$`'\`!`!_``0`?P`$`'\``)B<```$
+M6```!%@```18```$6```!%@``)B<`````````````````````````````)B<
+M``#`````P````,````#`````P````)C8`$`",`!``C``0`(P`$`",`!``C``
+M`)B<``!D````9````&0```!D````9````)B<```(````"`````@````(````
+M"````)C,````#@````X````.````#@````X``B40``(DZ``")/```B3X``(E
+M$``")1```B4```(E"````#`````5````%0```!4````5````%0``@!P2C9.G
+M"8@3SP3@$Y42X!.K"8@3SP``F"@*`@`!"@(``04"`0`*`@`!"@(``0``F#0`
+M``X.```.#@``#@X```X.```.#@``F#@````'````!P````L````+````"P``
+MF$@`&/IA`!CZ80`:&F,`&AIC`!H:8P``F%`,F+3@#)BTX`R8L-H,F+#:#)BP
+MV@``F%A^R`TN?L@-+G[(#2Y^R`TN?L@-+@``F%PQ.6!>,3E@7C$Y8%XQ.6!>
+M,3E@7@``F&P%#+"!!0RP@04,L($%#+"!!0RP@0``F10```?0```'T```!$P`
+M``B8```'T```F43WN!``][@0`/>X#0#WN!``][@0````H@0`````````````
+M````````````````H@C6OF>(UKYGB-`^9XC0/F>(T#YGB```H@P`+L'@`"[!
+MX``JP2``*L$@`"K!(```HAP8@X`*&(.`"AAC@`H8@X`*&(.`"@``HP`8`0``
+M&`$``!@!```8`0``&`$`````HP0P`R8",`,F`C`#)@(P`R8",`,F`@``HPA(
+M!SX&2`<^!D@'/@9(!SX&2`<^!@``HPQ6"TP*5@M,"E8+3`I6"TP*5@M,"@``
+MHQ!D&F`/9!I@#V0:8`]D&F`/9!I@#P``HQ1X3VX;>$]N&WA/;AMX3VX;>$]N
+M&P``HQB&CWQ:AH]\6H:/?%J&CWQ:AH]\6@``HQR0SX9;D,^&6X[/AEN.SX9;
+MCL^&6P``HR"=3Y</G4^7#YM/EP^;3Y</FT^7#P``HR2GSZ./I\^CCZ//GX^C
+MSY^/H\^?CP``HRBU7Z\?M5^O'[-?KQ^S7Z\?LU^O'P``HRR]W[F?O=^YG[O?
+MN9^[W[F?N]^YGP``HS#+?\4_RW_%/\M_QS_+?\<_RW_'/P``HS35_]&_U?_1
+MO]/_T;_3_]&_T__1OP``$C````/@``!`:````!```(!@````#P``@)P`````
+M``"`H````````($8````````@1P```````"!(````````($D````````@2@`
+M``````"!+````````($P````````@30```````"!.````````($\````````
+M@4"```/Y``"!1````````)@(````````F"P``*````"8/``@!````)A,$H0C
+M/```F'`````?``"8=````(```)AX````#@``F5@`"!__``"9@````````)F$
+M`H``````F:````````"9X````````)GDJJJJJ@``F>@\1F1X``"9[````*H`
+M`)GP````#```F?0```#_``"9^````!0``*(H```)M0``HCR3R(FO``"B3```
+M``$``*)0``"@````HE0```````"B6`S'4X```*)<#P\/`0``HF!?:0\!``"B
+M9`!!BA$``*)H````````HFP,,,%J``"B<`""""```*)T"!M\J@``HG@<YSG.
+M``"B?`47`<X``*,X````````HSP```````"C0````````*-$````````HT@_
+M____``"C3#____\``*-0/____P``HU0``___``"C6'FHJA\``*-<!FQ"#P``
+MHV`/*"('``"C9!=@%H4``*-H'X`1!```HVPWH`P#``"C<#_$"(,``*-T5\`(
+M`P``HWA?V`:"``"C?'_@!((``*.`?SQ[N@``HX3S,'_P``";!`````$``)L(
+M`````@``FPP````#``";$`````0``)L4````!0``FQ@````(``";'`````D`
+M`)L@````"@``FR0````+``";+`````T``)LP````$```FS0````1``";/```
+M`!,``)M`````%```FT0````5``";2````!@``)M,````&0``FU`````:``";
+M5````!L``)M8````'```FUP````=``";8````"```)MH````(@``FVP````C
+M``";<````"0``)MT````)0``FW@````H``";?````"D``)N`````*@``FX0`
+M```K``";B````"P``)N0````,```FY0````Q``";F````#(``)N@````-```
+MFZ0````U``";J````#4``)NL````-0``F[`````U``";M````#4``)NX````
+M-0``F[P````U``";P````#4``)O$````-0``F\@````U``";S````#4``)O0
+M````-0``F]0````U``";V````#4``)O<````-0``F^`````U``";Y````#4`
+M`)OH````-0``F^P````U``";\````#4``)OT````-0``F_@````0``";_```
+M`!H``)H``````````````)H$````0````$```)H(````@````(```)H,```!
+MH0```6$``)H0```!X0```:$``)H4````(0```>$``)H8````80```"$``)H<
+M```!B````&$``)H@```!R````8@``)HD````"````<@``)HH````2`````@`
+M`)HL````B````$@``)HP```!J0```(@``)HT```!Z0```6D``)HX````*0``
+M`:D``)H\````:0```>D``)I````!T````"D``)I$````$````&D``)I(````
+M4````9```)I,````D````=```)I0```!L0```!```)I4```!\0```%```)I8
+M````,0```)```)I<````<0```7$``)I@```!N````;$``)ID```!^````?$`
+M`)IH````.````#$``)IL````>````'$``)IP```!F0```9@``)IT```!V0``
+M`=@``)IX````&0```!@``)I\````60```%@``)J`````F0```)@``)J$````
+MV0```7D``)J(````^0```;D``)J,````^0```?D``)J0````^0```#D``)J4
+M````^0```'D``)J8````^0```+D``)J<````^0```/D``)J@````^0```/D`
+M`)JD````^0```/D``)JH````^0```/D``)JL````^0```/D``)JP````^0``
+M`/D``)JT````^0```/D``)JX````^0```/D``)J\````^0```/D``)K`````
+M^0```/D``)K$````^0```/D``)K(````^0```/D``)K,````^0```/D``)K0
+M````^0```/D``)K4````^0```/D``)K8````^0```/D``)K<````^0```/D`
+M`)K@````^0```/D``)KD````^0```/D``)KH````^0```/D``)KL````^0``
+M`/D``)KP````^0```/D``)KT````^0```/D``)KX````^0```/D``)K\````
+M^0```/D``)C4````(```F-`````(````"`````@````(````"```F-P`H`#`
+M`*``P`#@`,``X`#``.``P```F)PS````,P```#,````S````,P``````F)P!
+M`````0````$````!`````0``````F)P`````````````````````````````
+MF)P`````````````````````````````F)P`````````````````````````
+M````F)P?````'P```!\````?````'P``````F)P`````````````````````
+M````````F)P`N````+@```"X````N````+@`````F)P`MP```+<```"W````
+MMP```+<`````F)P`A````(0```"$````A````(0`````F)P`F````)@```"8
+M````F````)@`````F)P`P````,````#`````P````,``````F)P`_P```/\`
+M``#_````_P```/\`````F)P`_P```/\```#_````_P```/\`````F)P`_P``
+M`/\```#_````_P```/\`````F)P`_P```/\```#_````_P```/\`````F)P`
+MUP```-<```#7````UP```-<`````F)P`80```&$```!A````80```&$`````
+MF)P`_@```/X```#^````_@```/X`````F)P`W@```-X```#>````W@```-X`
+M````F)P`?P```'\```!_````?P```'\`````F)P$/0``!#T```0]```$/0``
+M!#T`````F)P`=P```'<```!W````=P```'<`````F)P`1````$0```!$````
+M1````$0`````F)P`F````)@```"8````F````)@`````F)P`$`"``!``@``0
+M`(``$`"``!``@```F)P`!<`T``7`-``%P#0`!<`T``7`-```F)P`,0#P`#$`
+M\``Q`/``,0#P`#$`\```F)P`#`$?``P!'P`,`1\`#`$?``P!'P``F)P`40!`
+M`%$`0`!1`$``40!``%$`0```F)P`4`#:`%``V@!0`-H`4`#:`%``V@``F)P`
+M````````````````````````````F)P``$!$``!`1```0$0``$!$``!`1```
+MF)P`````````````````````````````F)P``&#```!@P```8,```&#```!@
+MP```F)P``"P````L````-@```#8````L````F,@```0#```$`P``!`,```0#
+M```$`P``F)P``&0```!D````9````&0```!D````F)P```@````(````"```
+M``@````(````F,P````.````#@````X````.````#@`"03```D$(``)!$``"
+M01@``D$P``)!,``"02```D$H,"XY+C(P+C,````````````````````(````
+M$````!@````@````*````#`````X``````````````'_`?\`````````````
+M?_________\````````````#`9@!F0````````````!__________P``````
+M``````<!F`LP`````````````'__________````````````"`&8##``````
+M````````?_________\````````````@`2`*$`````````````!_________
+M_P```````````"$!(`&9`````````````'__________````````````(@$@
+M##``````````````?_________\````````````Z`6`*$`````````````!_
+M_________P```````````#L!8`&9`````````````'__________````````
+M````$@%E"A````````,`````?_________\````````````W`3`!F0``````
+M`P````!__________P```````````#4",`&9```````#`````'__________
+M````````````-@,P`9D```````,`````?_________\````````````P!#`!
+MF0```````P````!__________P```````````#D%,`&9```````#`````'__
+M________````````````-`8P`9D```````,`````?_________\`````````
+M```R`S`!F0```````P````!__________P```````````#$#,`&9````````
+M`````'__________````````````$0$0`9D`````````````?_________\`
+M```````````0`1`*$`````````````!__________P```````````%(!4`&9
+M`````````````'__________````````````10)0`9D`````````````?___
+M______\```````````!'`U`!F0````````````!__________P``````````
+M`$($4`&9`````````````'__________````````````6`50`9D`````````
+M````?_________\```````````!;!E`!F0````````````!__________P``
+M`````````%T(4`&9`````````````'__________````````````7@E0`9D`
+M````````````?_________\```````````!0`U`*$`````````````!_____
+M_____P```````````%4!4`PP`````````````'__________````````````
+M5@)0##``````````````?_________\```````````!)`E`-4```````````
+M``!__________P```````````$`!0`I```````!&````!``````````H`8@`
+M````````00%`"D```````$<````$`````````&@!B0````````!(`4`*$```
+M````1@````0`````````"`&*`````````$H!0`I```````!&````!```````
+M`!@(`8P`````````2P%`"D```````$8````$````````8`@!C0````````!,
+M`4`*4```````1@````0`````````"`&/`````````$,"0`I```````!'````
+M!`````````!P`8L`````````\`-`"D```````$8````$`````````"``````
+M``````"``T`*0```````1P````0`````````8`^G`````````/$#0`I`````
+M``!&````!````````!@`````````````@0-`"D```````$8````$````````
+M8``/J`````````""`T`*4```````1@````0```````````^I`````````/(#
+M0`H0``````!&````!```````````````````````@P1`"D```````$<````$
+M````````@&`/J@````````#T!$`*0```````1@````0```````"8````````
+M`````(0$0`I```````!&````!````````.``#ZL`````````A01`"E``````
+M`$8````$````````@``/K`````````#U!$`*$```````1@````0```````"`
+M`````````````(8%0`I```````!'````!````````(!@#ZT`````````AP5`
+M"D```````$8````$````````X``/K@````````"(!4`*4```````1@````0`
+M``````"```^O`````````(D&0`I```````!'````!`````````!H#[``````
+M````B@9`"D```````$8````$````````8`@/L0````````"+!D`*4```````
+M1@````0`````````"`^R`````````(P'0`I```````!'````!````````(!H
+M#[,`````````C0=`"D```````$8````$````````X`@/M`````````".!T`*
+M4```````1@````0```````"`"`^U`````````(\(0`I```````!'````!```
+M`````(!H#[8`````````D`A`"D```````$8````$````````X`@/MP``````
+M``"1"$`*4```````1@````0```````"`"`^X`````````/8)0`I```````!'
+M````!````````(!@````````````]PM`"D```````$<````$````````@&``
+M``````````!@`&``8`````````````!__________P```````````&$`80!A
+M```````#`````'__________````````````8@!B`&(```````(`````?___
+M______\```````````!C`&,`8P````````````!__________P``````````
+M`&0`9`!D```````#`````'__________````````````90!E`&4```````,`
+M````?_________\```````````!F`&8`9@````````````!__________P``
+M`````````&<`9P!G`````````````'__________````````````:`!H`&@`
+M````````````?_________\```````````!I`&D`:0```````P````!_____
+M_____P```````````&H`:@!J```````#`````'__________````````````
+M90```````?____\```"`_____P````!*4```#[0`````````:@```````?__
+M__\```"`_____P````!*4```#[0````````!_P```````0````$````!&U@`
+M`````!`````!`````0````$;6`````@``P````$``````````1M8````#``#
+M`````0`````````!&U@````@`$<````````````````;6````#,`,`````$`
+M`````````1M8````)``A`````0````$````!&U@````H`#<````!````````
+M``$;6````!\`,`````$````!`````1M8````,`!;`````0`````````!&U@`
+M``!P``,````!``````````$;6````#@`-P````$``````````1M8````5`!5
+M`````0````$````!&U@```!$`%4````!`````0````$;6````$P`.P````$`
+M`````````!M8````8`!2`````0````$````!&U@```!D`#0````!````````
+M``$;6````'P`(`````$````!`````1M8````F`!;`````0````$````!&U@`
+M``"<`%(````!`````0````$;6````*H`$`````$``````````1M8````O``#
+M`````0`````````!&U@```"_`#8````!``````````$;6````,0`-P````$`
+M```!`````1M8````RP`W`````0`````````!&U@```#0`#<````!````````
+M``$;6````-8`$`````$````!`````1M8````V@`#````````````````&U@`
+M``,R`#8````!``````````$;6````-X``P````$``````````1M8````Z0`W
+M`````0`````````!&U@```#V`#<````!``````````$;6````/H`-P````$`
+M`````````1M8````_P`V`````0`````````!&U@```$,`#`````!`````0``
+M``$;6````10`-P````$``````````1M8```!+``W`````0`````````!&U@`
+M``%``!`````!`````0````$;6````50``P````$``````````1M8```!6``A
+M`````0````$````!&U@```%<`#<````!``````````$;6````6``-P````$`
+M`````````1M8```!9`!;`````0`````````!&U@```%H`%(````!````````
+M``$;6````6P`4@````$````!`````1M8```!=``W`````0`````````!&U@`
+M``%X``,````!``````````$;6````7P`-P````$``````````1M8```!B`!`
+M`````0``````````&U@```&)`$$````!```````````;6````8H`2`````$`
+M`````````!M8```!BP!#`````0``````````&U@```&,`$H````!````````
+M```;6````8T`2P````$``````````!M8```!CP!,`````0``````````&U@`
+M``^G`(`````!```````````;6```#Z@`@0````$``````````!M8```/J0""
+M`````0``````````&U@```^J`(,````!```````````;6```#ZL`A`````$`
+M`````````!M8```/K`"%`````0``````````&U@```^M`(8````!````````
+M```;6```#ZX`AP````$``````````!M8```/KP"(`````0``````````&U@`
+M``^P`(D````!```````````;6```#[$`B@````$``````````!M8```/L@"+
+M`````0``````````&U@```^S`(P````!```````````;6```#[0`C0````$`
+M`````````!M8```/M0".`````0``````````&U@```^V`(\````!````````
+M```;6```#[<`D`````$``````````!M8```/N`"1`````0``````````&U@`
+M``&0`$(````!``````````$;6````8X``P````$``````````1M8```!F`!%
+M`````0````$````!&U@```&:`$4````!```````````;6````9L`10````$`
+M`````````!M8```!G`!>`````0``````````&U@```&>``,````!````````
+M``$;6````:P`-P````$``````````1M8```!I@`#`````0`````````!&U@`
+M``&V`#<````!``````````$;6````;@`-P````$``````````1M8```!N@`W
+M`````0`````````!&U@```&^`"$````!`````0````$;6````R<``P````$`
+M`````````1M8```!R@!=`````0``````````&U@```'6`#<````!````````
+M``$;6````>0`$`````$````!`````1M8```![``P`````0````$````!&U@`
+M``'X``,````!``````````$;6````A``-P````$``````````1M8```"*@`B
+M`````0`````````!&U@```)"`#<````!``````````$;6````@``6P````$`
+M`````````1M8```"2@`#`````0`````````!&U@```)/`!`````!`````0``
+M``$;6````EP`4@````$``````````1M8```"8``[`````0````$````!&U@`
+M``)H`#<````!``````````$;6````FP`-P````$``````````1M8```"=@`0
+M`````0````$````!&U@```)Z``,````!``````````$;6````H(``P````$`
+M`````````1M8```"@P`#`````0`````````!&U@```*J`"$````!````````
+M``$;6````KX`6P````$````!`````1M8```"OP`W`````0`````````!&U@`
+M``+!`#<````!``````````$;6````L8`.P````$``````````1M8```"U``W
+M`````0`````````!&U@```+P`#<````!``````````$;6````O0`-P````$`
+M`````````1M8```"^``#`````0`````````!&U@```">`%`````!`````0``
+M``$;6````OP``P````$``````````1M8```##``P`````0`````````!&U@`
+M``,4`#8````!``````````$;6````Q@`-@````$``````````1M8```#)``#
+M`````0`````````!&U@```,0``,````!``````````$;6````SH`-P````$`
+M`````````1M8```#2``0`````0````$````!%L$```-*`!(````!`````0``
+M``$;6````UH`$0````$``````````1M8```#7``Z`````0````$````!&U@`
+M``->`%8````!``````````$;6````L```P````$``````````1M8```#=P`#
+M`````0`````````!&U@```+,``,````!``````````$;6````````!,S$ST7
+M``H%````````````````````$!``````````$T<341<`"@4`````````````
+M```````0$``````````3.!-T%P`4%````````````````````!`'````````
+M`!-.$WL;!@4%`````````````````````0``````````$U$3>1X&"@4`````
+M```````````````!```````````35A-T(084!0````````````````````$`
+M`````````!.K$[`7``H%````````````````````$`P`````````$[`3V!<`
+M%!0````````````````````0`@`````````3OQ._%P`*!0``````````````
+M`````!`,`````````!0`%'@%!A04````````````````````````````````
+M%#(4;A<`%!0````````````````````8`0`````````4,A1N%``4%```````
+M`````````````!@!`````````!0\%'@/`!04````````````````````!0``
+M````````%#P4>!$&%!0````````````````````!`0`````````4/!1X$@`4
+M%`````````````````````4``````````!0\%'@4`!04````````````````
+M````!0``````````%#P4>!<`%!0````````````````````%```````````4
+M/!1X%P84%`````````````````````$``````````!0\%,@4!A04````````
+M``(`````````!```````````%'@4H!<`%!0``````````0`````````%````
+M```````4C!2@%P`4%``````````#``````````4``````````!2,%,@2`!04
+M``````````,`````````!0``````````%(P4R!0`%!0`````````!P``````
+M`(`%```````````4C!3(%`84%``````````#``````````$"`````````!2,
+M%,@7!A04``````````,``````````0(`````````%(P4R!<&%!0`````````
+M`P`````````!```````````4C!3('@`4%```````````````````````````
+M`````!2,%D0%!A04``````````,`````````````````````%*`4R!$&%!0`
+M`````````P`````````!```````````5?!7T'@84%``````````"````````
+M``0``````````!5\%D04!A04``````````,``````````00`````````%7P6
+M1!L`%!0``````````P`````````%```````````5?!9$'@`4%``````````#
+M``````````4``````````!5\%D07`!04``````````<```````"``0``````
+M````%G$6K1<`%!0````````````````````````````````6<1:M'@84%```
+M`````````````````````````````!9Q%JT>!A04``````````(`````````
+M!```````````%G$6P04&%!0````````````````````````````````6<1;!
+M$0`4%````````````````````````````````!9Q%L$4`!04````````````
+M````````````````````%G$6P1X`%!0`````````````````````````````
+M```6<1;!'@84%``````````````````````#`````````!9Q%L$>!A04````
+M````````````````````````````$S@3=!X`%!0```````````````````0`
+M```````````3L!/8'@`4%```````````````````!````````````!0R%&X>
+M`!04``````````,````````$````````````%#P4>!X`%!0``````````P``
+M``````0````````````4C!3('@`4%``````````#````````!```````````
+M`!9Q%L$>`!04```````````````````$````````````%7P61!X`%!0`````
+M`````P````````0````````````4C!3('@`4%```````````````````````
+M`````````!0\%'@>`!04````````````````````````````````%L$6P1X`
+M%!0```````````````````0````````````4"A1:!08H*```````````````
+M`````````````````!2"%-(%!B@H``````````$`````````````````````
+M%/H5<@4&*"@````````````````````````````````5FA82!08H*```````
+M```!`````````````````````!0>%$8%!B@H````````````````````````
+M````````%&X4O@4&*"@``````````0`````````````````````4YA5>!08H
+M*````````````````````````````````!6&%B8%!B@H``````````$`````
+M````````````````%%`4>!$&*"@````````````````````````````````4
+M4!1X%P8H*````````````````````````````````!1:%%H1!B@H````````
+M````````````````````````%%H46A<`*"@`````````````````````````
+M```````4H!2@%P8H*``````````!``````````(``````````!2@%*`4!B@H
+M``````````$``````````@``````````%((4@A$`*"@``````````0``````
+M```"```````````4JA2J%``H*``````````!``````````(``````````!2"
+M%*H4`"@H``````````$``````````@``````````%((4JA<&*"@`````````
+M`0`````````"```````````5I!8<%`8H*``````````!``````````(`````
+M`````!:`%J@4`"@H````````````````````````````````%H`6J!X&*"@`
+M```````````````````````````````6A1:M'@8H*```````````````````
+M`````````````!1:%((/`"@H``````````,````````$````````````%*H4
+MJA(`*"@``````````P````````0````````````5I!8<%``H*``````````#
+M````````!````````````!:`%J@4`"@H```````````````````$````````
+M````"0@)1`4&%`4````````````````````````````````)"`E$%``4!0``
+M``````````````````````````````EL":@%!A0%````````````````````
+M````````````"6P)J!0`%`4````````````````````@```````````);`FH
+M'@`4!0````````````````````````````````EL"9X;!A0%````````````
+M````````````````````"6P)GA0`%`4````````````````````@````````
+M```)@`F*%``4!0````````````````````````````````F9":@4`!0%````
+M````````````````````````````":,)J!0`%`4``````````````````"`@
+M```````````)M`FT!084!0````````````````````````````````FT";04
+M`!0%```````````````````H(```````````"=`*K`4&%`4`````````````
+M```````````````````)"`E$%``4!0``````````````````````````````
+M``EL"6P4`!0%````````````````````````````````"7$)@!0`%`4`````
+M```````````````````````````)A0F*%``4!0``````````````````````
+M``````````F/"9D4`!0%````````````````````````````````"9X)GA0`
+M%`4````````````````````````````````)HPFC%``4!0``````````@```
+M````!`````````````FC":,4`!0%``````````"`````````````````````
+M":@)J!0`%`4``````````(````````0````````````)J`FH%``4!0``````
+M````@`````````````````````FT";04`!0%``````````"````````$````
+M````````";0)M!0`%`4``````````(`````````````````````)"`E$!084
+M!0````````````````````````````````D("404`!0%````````````````
+M````````````````"6P)J`4&%`4````````````````````````````````)
+M;`FH%``4!0```````````````````$````````````EL":@>`!0%````````
+M````````````````````````"6P)GAL&%`4`````````````````````````
+M```````);`F>%``4!0```````````````````$````````````F`"8H4`!0%
+M````````````````````````````````"9D)J!0`%`4`````````````````
+M```````````````)T`JL!084!0````````````````````````````````FC
+M":@4`!0%```````````````````@(```````````"0@)1!0`%`4`````````
+M```````````````````````);`EL%``4!0``````````````````````````
+M``````EQ"8`4`!0%````````````````````````````````"84)BA0`%`4`
+M```````````````````````````````)CPF9%``4!0``````````````````
+M``````````````F>"9X4`!0%````````````````````````````````":,)
+MHQ0`%`4``````````(````````0````````````)HPFC%``4!0``````````
+M@`````````````````````FH":@4`!0%``````````"````````$````````
+M````":@)J!0`%`4``````````(`````````````````````)"`E$!08H*```
+M``````````````````````````````F%"84%!B@H````````````````````
+M````````````"84)A10&*"@````````````````````````````````)A0F%
+M$@8H*```````````````````!`````````````G0"JP%!B@H````````````
+M`````````````````````?\0`````````````````0``````````````````
+M```````@"``"`````````````````````/\`````````````````)!$`````
+M```````````````4!0```````````````````@4````````````````````3
+M```````````!4!```````````````````````````````````````````0``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``)0$```````````````````````````````````````````!```````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````U`0````
+M```````````````````````````````````````($```````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````$4!``````````````
+M`````````````````````````````(```(``````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````50$```````````````````````
+M````````````````````0```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````!E`P`````````````````@`````````#````
+M``````````"``$"````````````````````)"```````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````(4#`````````````````````````````````#````````
+M`0`$````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````E0,`````````````````(`````````!`````,`````````$"`$````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````3`P
+M`````````````````@`````````$`````P``````"```@$``````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````",#``````````
+M```````"``````````0````#`````````````$``````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````,P,`````````````````(`
+M````````!`````,```````@```!`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````!#`P`````````````````@`````````$
+M`````P```````````"!`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````%,#`````````````````"``````````0````#````
+M`````````!``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````8P,`````````````````(`````````!`````,``````````0`1
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`1`0``````````````````````````````````````````(``0`@````````
+M```````````2!```````````````````(!$`````````````````````````
+M```````````````````````````````````````````````````!(!``````
+M````````````````````````````````````!``"`@``````````````````
+M```````````````````````@$@``````````````````````````````````
+M``````````````````````````````````````````%@$```````````````
+M``$``````````P`````````````"`$"`(```````````````````$,0`````
+M``````````````0A````````````````````````````````````````````
+M`````````````````````````````````640`````````````````0``````
+M```#````````````````````.```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````!0$````````````````````````````@````"
+M``````````````0`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````)`0```````````````````````````$`````(`````````
+M````!<<`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````T!``````````````````````````(```````@````````````"`````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````$0$``
+M```````````````$````````@``````"````````````0(``````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````5`0```````````
+M``````0```````"```````(``````````@!`@```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````!D!`````````````````````
+M```````(`````@````````````"(````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````'0$`````````````````$````````@`@`
+M```"````````````0(0`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````A`0`````````````````0```````"`"`````(`````
+M`````@!`A```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````"4!``````````````````````````(```````@````````````"!
+MQP``````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````+
+M0$`````````````````$````````@``````"````````````0(''````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````U0_P``````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````H`````````````
+M```````*````````````````````````````````"C#_````````````````
+M``````````"``````P``````````````````````````````````````````
+M```````````````````````````````````!`````````````````````0``
+M```````````````````$```````````+,#``````````````````````````
+M`0`````#````````````````````````````````````````````````````
+M``````````````````````````"`````````````````````@```````````
+M``````````0```````````PP,``````````````````````````"``````,`
+M````````````````````````````````````````````````````````````
+M`````````````````!`````````````````````0````````````````````
+M!```````````"A`0````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````(````````````````````"`````````````````````$````````
+M```*0$``````````````````````````>&`````"````````````````````
+M``````````````````````````````````````````````````````````I`
+M```````````````````$0`````````````````````0```````````I00```
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````@`````````
+M```````````(````````````````````!````````````9DP````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````"```````````````````
+M``@````````````````````$````````````8/\````````````````#````
+M````!``````(```````#X````````````````````````L``````````````
+M````````````````````````````K\````````````````````OP````````
+M``````````````@```````````!F_P````````````````,````````$````
+M``@```````/@```````````````````````"P```````````````````````
+M```````````````````'P````````````````````?``````````````````
+M````"````````````&?_`````````````````P````````0`````"```````
+M`^````````````````````````+`````````````````````````````````
+M`````````"_````````````````````+\``````````````````````(````
+M````````:/\````````````````#````````!``````(```````#X```````
+M`````````````````L``````````````````````````````````````````
+M5\```````````````````!7P``````````````````````@```````````!A
+M_P````````````````,````````$`````!````````/@````````````````
+M``````````````````````````````````````````````````"OP```````
+M````````````"_``````````````````````"````````````&+_````````
+M`````````P````````0`````$````````^````````````````````````+`
+M`````````````````````````````````````````*_`````````````````
+M```+\``````````````````````(````````````8_\````````````````#
+M````````!``````(```````!X````````````````````````L``````````
+M````````````````````````````````+\````````````````````OP````
+M``````````````````@```````````!D_P````````````````,````````$
+M`````!```````!P`"``````````````````````"P```````````````````
+M```````````````````````'P````````````````````?``````````````
+M````````"````````````&7_`````````````````P````````0`````$```
+M````"(0`````````````````````````````````````````````````````
+M`````````````%?````````````````````5\``````````````````````(
+M````````````:?\````````````````#````````!``````0```````#P```
+M`````````````````````L``````````````````````````````````````
+M````!\````````````````````'P``````````````````````@`````````
+M``!J_P````````````````,````````$`````!````````/`````````````
+M```````````````````````````````````````````````````````OP```
+M````````````````"_``````````````````````"````````````9C_````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````0`#P`/.!B`#P`/,`
+M00"``(.!B0"``(,`2`#R`/6!B@#R`/4`0P#V`/>!BP#V`/<`2@#Q`/2!C`#Q
+M`/0`2P"!`(2!C0"!`(0`3`""`(6!CP""`(4``````8@`\`#S`8D`@`"#`8H`
+M\@#U`8L`]@#W`8P`\0#T`8T`@0"$`8\`@@"%````````````"```````````
+M`````````````````````````````````0(7<`L`C````````0(C*`\`$@``
+M`````0(NX`H`F`(``````0)&4`X`)`(``````0)=P`D`L`0``````0*,H`T`
+M2`0``````0*[@`@`8`0``````0+2\`P`;`0`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````@```````````````````````````````````````````$#
+M%W`+`(P```````$#(R@/`!(```````$#+N`*`)@"``````$#1E`.`"0"````
+M``$#7<`)`+`$``````$#C*`-`$@$``````$#NX`(`&`$``````$#TO`,`&P$
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````(````````````````````
+M```````````````````````!`A=P"P",```````!`B,H#P`2```````!`B[@
+M"@"8`@`````!`D90#@`D`@`````!`EW`"0"P!``````!`HR@#0!(!``````!
+M`KN`"`!@!``````!`M+P#`!L!```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"````````````````````````````````````````````0,7<`L`C```
+M`````0,C*`\`$@```````0,NX`H`F`(``````0-&4`X`)`(``````0-=P`D`
+ML`0``````0.,H`T`2`0``````0.[@`@`8`0``````0/2\`P`;`0`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````0`````````````````````````````
+M``````````````$``^@+`((```````$`!]`*!(0!``````$`%7P)!(L!````
+M``$`*O@(!)8!````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````*($````
+M`````````*((4#Y&1E`^1D8``*(,9(!!;&2`06P``*(0`9F@`P&9H`,``*(4
+M!$S6$`1,UA```*(8$X``0!.``$```*(<&^``8!O@`&```*(@#%.`"@Q3@`H`
+M`*(D`!3?.P`4WSL``*(H```!M0```;4``*(L````(````"```)B<````````
+M`````)B<`````````````)B<`````````````)B<`````````````)B<````
+M`````````)B<`````````````)B<`````````````)B<`````````````)B<
+M`````````````)B<`````````````)B<`````````````)B<`#@````X````
+M`)B<`````````````)B<`````````````)B<`````````````)B<``0`^0`$
+M`/D``)C4``````````0``)B<`````````````)B<`````````````)B<````
+M`````````)B<`````````````)B<`````````````)B<$````!```````)B<
+M!`````0``````)B<`````````````)B<`````````````)B<````````````
+M`)B<``````H``````)B<`#@`@`(X`(```)B<``(`!@````8``)B<````D@``
+M`)(``)B<````H````*```)B<``0`!P`$``<``)C4````&@```!H``)B<````
+M2````$@``)B<````$````!```)B<````"`````@``)B<````#P````\``)B<
+M````\@```&(``)B<``"03P``D$P``)B<```26@``$IH``)C,````#@````\`
+M````````"````````````````````````````````````````````0(7<`L`
+MC````````0(C*`\`$@```````0(NX`H`F`(``````0)&4`X`)`(``````0)=
+MP`D`L`0``````0*,H`T`2`0``````0*[@`@`8`0``````0+2\`P`;`0`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````@`````````````````````````
+M``````````````````$""[@+`(8```````$"$90/``D```````$"%W`*`(P"
+M``````$"(R@.`!("``````$"+N`)`)@$``````$"1E`-`"0$``````$"7<`(
+M`#`$``````$":7@,`#8$````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````(
+M```````````````````````````````````````````!`@7<"P"#```````!
+M`@C*#P`$```````!`@NX"@"&`@`````!`A&4#@`)`@`````!`A=P"0",!```
+M```!`B,H#0`2!``````!`B[@"``8!``````!`C2\#``;!```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````!P``````````````````````````````````
+M`````````0,7<`L`C````````0,NX`H`F`(``````0-&4`X`)`(``````0-=
+MP`D`L`,``````0.,H`T`2`,``````0.[@`@`8`,``````0/2\`P`;`,`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````@`````````
+M``````````````````````````````````$#%W`+`(P```````$#(R@/`!(`
+M``````$#+N`*`)@"``````$#1E`.`"0"``````$#7<`)`+`$``````$#C*`-
+M`$@$``````$#NX`(`&`$``````$#TO`,`&P$````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````$```````````````````````````````````````````!
+M``/H&P""```````!``?0&@2$`0`````!`!5\&02+`0`````!`"KX&`26`0``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````#```````````````````
+M`````````````````````````0`#Z!L`@@```````0`'T!H$A`$``````0`5
+M?!D$BP(``````0`J^!@$E@,```````(7<`L`#`0```````(C*`\`$@0`````
+M`0(NX`H`&`8``````0)&4`X`)`8``````0)=P`D`,`@``````0*,H`T`2`@`
+M`````0*[@`@`8`@``````0+2\`P`;`@`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````T```````````````````````````````````````````$$`/H#`($`
+M`F0"9`$$`?0'`($``<D!R0$$`^@"`((!`.0`Y`$$!]`&`(0"`*``H`$$"[@!
+M`(8#`(P`C`$"%W`+`(P$`#P`/`$"(R@/`!($`#P`/`$"+N`*`)@&`#``,`$"
+M1E`.`"0&`#``,`$"7<`)`#`(`"P`+`$"C*`-`$@(`"P`+`$"NX`(`&`(`"P`
+M+`$"TO`,`&P(`"P`+```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```=````'P````"`````____\```````````````$````!T````?`````(``
+M``#____P```````````````0````'0```!\`````````````````````````
+M```````````=````'P````"`?P``____^```````````````0````!T````?
+M````````````````````````````````````'0```!\`````````````````
+M```````````````````=````'P``````````````````````````````````
+M`!T````?`````(`#``#____P```````````````@````'0```!\`````@`$`
+M`/____@``````````````!`````=````'P````"``0``____^```````````
+M````$````!T````?`````(`_``#____P``````````````!`````'0```!\`
+M```````````````````````````````````=````'P``````````````````
+M`````````````````!T````?```,_,#_``#____X``````````````!0````
+M'0```!\`````@`$``/____@``````````````!`````=````'P``````````
+M`````````````````````````!T````?````````````````````````````
+M````````'0```!\`````@`<``/____@``````````````"`````=````'P``
+M``#`_P``____^```````````````8````!T````?```34```````````````
+M````````````````'0```!\``!/H```````````````````````````````=
+M````'P``%$@``````````````````````````````!T````?```4?(`?``#_
+M___X``````````````!`````'0```!\``!<8@`<``/____@`````````````
+M`"`````=````'P``&(0`````````````````````````$````!T````?```;
+MG(#_``#____P``````````````&0````'0```!\``""D@`<``/____@`````
+M`````````"`````=````'P``(10``````````````````````````````!T`
+M```?```AS,#_``#____X``````````````"`````'0```!\``"DH````````
+M```````````````````````=````'P``*G@`````````````````````````
+M$````!T````?```L$(`_``#____P``````````````!0````'0```!\``"Z@
+MP/\``/____@``````````````&`````=````'P``,DC`_P``____^```````
+M````````8````!T````?```T[,#_``#____X``````````````!@````'0``
+M`!\``#DX@/\``/____```````````````&`````=````'P````"``P``____
+M\```````````````(````!T````?`````(````#____P```````````````0
+M````'0```!\``$A\```````````````````````````````=````'P``2*@`
+M`````````````````````````````!T````?``!(M```````````````````
+M````````````'0```!\``$CH@````/____```````````````!`````=````
+M'P``29"``0``____^```````````````$````!T````?``!*4(`'``#____X
+M```````````````@````'0```!\`````@`<``/____@``````````````*``
+M```=````'P````"``0``____^```````````````$````!T````?``!,-```
+M````````````````````````````'0```!\``$Q\@`,``/____``````````
+M`````"`````=````'P``32"`````____\```````````````$````!T````?
+M``!-C```````````````````````````````'0```!\``$W0@/\``/____``
+M`````````````%`````=````'P``4!``````````````````````````````
+M`!T````?``!02```````````````````````````````'0```!\`````P/\`
+M`/____@``````````````=`````=````'P``````````````````````````
+M`````````!T````?`````(`!``#____X```````````````0````'0```!\`
+M````@`\``/____```````````````#`````=````'P````"`````____\```
+M````````````$````!T````?``!:H(!_``#____X``````````````!`````
+M'0```!\``%ML@`,``/____```````````````#`````=````'P``7`R``0``
+M____^```````````````$````!T````?``!<[(`'``#____X````````````
+M```P````'0```!\``%VT@`<``/____@``````````````#`````=````'P``
+M7GR``P``____\```````````````(````!T````?`````(#_``#____P````
+M``````````#@````'0```!\`````@````/____```````````````!`````=
+M````'P``9;```````````````````````````````!T````?``!EV```````
+M````````````````````````'0```!\``&7@````````````````````````
+M```````=````'P````"`!P``____^```````````````(````!T````?````
+M`(````#____P```````````````P````'0```!\`````@`,``/____``````
+M`````````"`````=````'P````"`#P``____\```````````````,````!T`
+M```?`````(````#____P```````````````0````'0```!\`````@`<``/__
+M__@``````````````"`````=````'P``````````````````````````````
+M`````!T````?`````(`?``#____X```````````````P````'0```!\`````
+M```````````````````````````````=````'P````"`````____\```````
+M````````$````!T````?`````(`'``#____X```````````````@````'0``
+M`!\`````@`\``/____```````````````#`````=````'P````#`_P``____
+M^```````````````8````!T````?`````(````#____P```````````````0
+M````'0```!\`````@````/____```````````````!`````=````'P````"`
+M````____\```````````````$````!T````?````````````````````````
+M````````````'0```!\`````@`,``/____```````````````"`````=````
+M'P```````````````````````````````````!T````?````````````````
+M````````````````````'0```!\`````@`<``/____@``````````````"``
+M```=````'P````"``P``____\```````````````(````!T````?`````(`#
+M``#____P```````````````@````'0```!\`````@`<``/____@`````````
+M`````"`````=````'P````"``0``____^```````````````$````!T````?
+M`````(`'``#____X```````````````@````'0```!\`````@`,``/____``
+M`````````````"`````=````'P````"`````____\```````````````$```
+M`!T````?`````(`#``#____P```````````````@````'0```!\`````````
+M```````````````````````````=````'P``````````````````````````
+M`````````!T````?`````(`'``#____X```````````````@````'0```!\`
+M````@`\``/____```````````````#`````=````'P````"`````____\```
+M````````````$````!T````?`````(`!``#____X```````````````0````
+M'0```!\`````@`\``/____```````````````#`````=````'P````"``0``
+M____^```````````````$````!T````?`````(`'``#____X````````````
+M```@````'0```!\`````@`<``/____@``````````````"`````=````'P``
+M``"``0``____^```````````````$````!T````?`````(`/``#____P````
+M```````````P````'0```!\`````@`$``/____@``````````````!`````=
+M````'P```````````````````````````````````!T````?`````(`'``#_
+M___X```````````````@````'0```!\`````@`\``/____``````````````
+M`#`````=````'P````"``0``____^```````````````$````!T````?````
+M````````````````````````````````'0```!\`````````````````````
+M```````````````=````'P```````````````````````````````````!T`
+M```?````````````````````````````````````'0```!\`````````````
+M```````````````````````=````'P````"`````____\```````````````
+M$````!T````?`````(````#____P```````````````0````'0```!\`````
+M@````/____```````````````!`````=````'P``?=2`#P``____\```````
+M````````,````!T````?``!^<(!_``#____X``````````````!`````'0``
+M`!\``'_0@`\``/____```````````````#`````=````'P````"`!P``____
+M^```````````````(````!T````?`````(````#____P```````````````0
+M````'0```!\`````@`$``/____@``````````````!`````=````'P````"`
+M````____\```````````````$````!T````?`````(````#____P````````
+M```````0````'0```!\`````@````/____```````````````!`````=````
+M'P````"`#P``____\```````````````,````!T````?`````(`!``#____X
+M```````````````0````'0```!\`````@`$``/____@``````````````!``
+M```=````'P````"`!P``____^```````````````(````!T````?`````(`#
+M``#____P```````````````@````'0```!\`````@`,``/____``````````
+M`````"`````=````'P````"`````____\```````````````$````!T````?
+M`````(````#____P```````````````0````'0```!\`````````````````
+M```````````````````=````'P````"`#P``____\```````````````,```
+M`!T````?`````,#_``#____X``````````````!@````'0```!\``(_(@`<`
+M`/____@``````````````"`````=````'P````"`````____\```````````
+M````$````!T````?`````(````#____P```````````````0````'0```!\`
+M````@`,``/____```````````````"`````=````'P````"``P``____\```
+M````````````(````!T````?`````,#_``#____X``````````````!@````
+M'0```!\``)8<@`\``/____```````````````$`````=````'P``EQ``````
+M`````````````````````````!T````?``"8+```````````````````````
+M````````'0```!\````````````````````````````````````=````'P``
+MF9B`?P``____^```````````````4````!T````?`````(`/``#____P````
+M``````````"0````'0```!\``*$<@`<``/____@``````````````"`````=
+M````'P````"`````____\```````````````$````!T````?`````(`?``#_
+M___X```````````````P````'0```!\`````````````````````````````
+M```````=````'P```````````````````````````````````!T````?````
+M`(````#____P```````````````0````'0```!\`````@````/____``````
+M`````````!`````=````'P````"`'P``____^```````````````,````!T`
+M```?````````````````````````````````````'0```!\`````@!\``/__
+M__@``````````````#`````=````'P````"`````____\```````````````
+M$````!T````?`````(````#____P```````````````0````'0```!\`````
+M@`<``/____@``````````````"`````=````'P````"``P``____\```````
+M````````(````!T````?`````(````#____P```````````````0````'0``
+M`!\`````@`\``/____```````````````#`````=````'P``````````````
+M`````````````````````!T````?````````````````````````````````
+M````'0```!\````````````````````````````````````=````'P``````
+M`````````````````````````````!T````?````````````````````````
+M````````````'0```!\````````````````````````````````````=````
+M'P```````````````````````````````````!T````?``"O+(`'``#____X
+M```````````````@````'0```!\`````@/\``/____```````````````&``
+M```=````'P````"``0``____^```````````````$````!T````?``"U,,#_
+M``#____X``````````````!P````'0```!\``+;4````````````````````
+M```````````=````'P``MR@``````````````````````````````!T````?
+M``"W,(`/``#____P``````````````!`````'0```!\`````@`<``/____@`
+M`````````````"`````=````'P````"`````____\```````````````,```
+M`!T````?`````(`#``#____P```````````````@````'0```!\`````@`\`
+M`/____```````````````#`````=````'P````"`````____\```````````
+M````$````!T````?`````(`#``#____P```````````````@````'0```!\`
+M```````````````````````````````````=````'P````"`'P``____^```
+M````````````,````!T````?````````````````````````````````````
+M'0```!\`````@````/____```````````````!`````=````'P````"`!P``
+M____^```````````````(````!T````?`````(`/``#____P````````````
+M```P````'0```!\`````P/\``/____@``````````````&`````=````'P``
+M``"`````____\```````````````$````!T````?`````(````#____P````
+M```````````0````'0```!\`````@````/____```````````````!`````=
+M````'P```````````````````````````````````!T````?`````(`'``#_
+M___X```````````````@````'0```!\`````````````````````````````
+M```````=````'P```````````````````````````````````!T````?````
+M`(`'``#____X```````````````@````'0```!\`````@`,``/____``````
+M`````````"`````=````'P````"``P``____\```````````````(````!T`
+M```?`````(`'``#____X```````````````@````'0```!\`````@`$``/__
+M__@``````````````!`````=````'P````"``P``____\```````````````
+M(````!T````?`````(`#``#____P```````````````@````'0```!\`````
+M@`<``/____@``````````````"`````=````'P````"`#P``____\```````
+M````````,````!T````?`````(````#____P```````````````0````'0``
+M`!\`````@`$``/____@``````````````!`````=````'P````"`#P``____
+M\```````````````,````!T````?`````(`!``#____X```````````````0
+M````'0```!\`````@`<``/____@``````````````"`````=````'P````"`
+M!P``____^```````````````(````!T````?`````(`!``#____X````````
+M```````0````'0```!\`````@`\``/____```````````````#`````=````
+M'P````"``0``____^```````````````$````!T````?````````````````
+M````````````````````'0```!\`````@`<``/____@``````````````"``
+M```=````'P````"`#P``____\```````````````,````!T````?`````(`!
+M``#____X```````````````0````'0```!\`````````````````````````
+M```````````=````'P```````````````````````````````````!T````?
+M````````````````````````````````````'0```!\`````````````````
+M```````````````````=````'P``````````````````````````````````
+M`!T````?`````(````#____P```````````````0````'0```!\`````@```
+M`/____```````````````!`````=````'P````"`````____\```````````
+M````$````!T````?````````````````````````````````````'0```!\`
+M````@````/____```````````````!`````=````'P````"`````____\```
+M````````````$````!T````?`````(````#____P```````````````0````
+M'0```!\`````@````/____```````````````!`````=````'P``T,R`?P``
+M____^```````````````0````!T````?``#2+(`/``#____P````````````
+M```P````'0```!\``-+(@`\``/____```````````````#`````=````'P``
+M``"`!P``____^```````````````(````!T````?`````(````#____P````
+M```````````0````'0```!\`````@`$``/____@``````````````!`````=
+M````'P````"`````____\```````````````$````!T````?`````(````#_
+M___P```````````````0````'0```!\`````@````/____``````````````
+M`!`````=````'P````"``0``____^```````````````$````!T````?````
+M`(`!``#____X```````````````0````'0```!\`````@`$``/____@`````
+M`````````!`````=````'P````"`!P``____^```````````````(````!T`
+M```?`````(`#``#____P```````````````@````'0```!\`````@`,``/__
+M__```````````````"`````=````'P````"`````____\```````````````
+M$````!T````?`````(````#____P```````````````0````'0```!\`````
+M```````````````````````````````=````'P````"`!P``____^```````
+M````````(````!T````?`````,#_``#____X``````````````"@````'0``
+M`!\`````@````/____```````````````!`````=````'P````"``0``____
+M^```````````````$````!T````?`````(`#``#____P```````````````@
+M````'0```!\`````P/\``/____@``````````````%`````=````'P``ZPB`
+M#P``____\```````````````0````!T````?``#L#(`?``#____X````````
+M```````P````'0```!\``.UP@````/____```````````````!`````=````
+M'P``[;2`'P``____^```````````````,````!T````?``#NX```````````
+M````````````````````'0```!\``.\T@`,``/____```````````````#``
+M```=````'P````"`'P``____^```````````````0````!T````?````````
+M````````````````````````````'0```!\``/%\P/\``/____@`````````
+M`````&`````=````'P````"`!P``____^```````````````(````!T````?
+M``#V"(#_``#____P``````````````!0````'0```!\`````@````/____``
+M`````````````!`````=````'P````"`'P``____^```````````````0```
+M`!T````?``#[E,#_``#____X``````````````!@````'0```!\``0`4P/\`
+M`/____@``````````````)`````=````'P`!!EB`_P``____\```````````
+M````<````!T````?``$'\```````````````````````````````'0```!\`
+M`0A\```````````````````````````````=````'P`!"7@`````````````
+M`````````````````!T````?``$*G(````#____P```````````````0````
+M'0```!\````````````````````````````````````=````'P`!"T``````
+M`````````````````````````!T````?``$+Q(`!``#____X````````````
+M```0````'0```!\`````@`<``/____@``````````````"`````=````'P`!
+M#/P``````````````````````````````!T````?``$-+```````````````
+M````````````````'0```!\``0[<```````````````````````````````=
+M````'P`!#R"`!P``____^```````````````(````!T````?`````(````#_
+M___P```````````````0````'0```!\`````@`<``/____@`````````````
+M`"`````=````'P````"`````____\```````````````$````!T````?````
+M`(````#____P```````````````0````'0```!\`````@!\``/____@`````
+M`````````#`````=````'P`!$MR`!P``____^```````````````(````!T`
+M```?`````(````#____P```````````````0````'0```!\`````@#\``/__
+M__```````````````$`````=````'P````"`````____\```````````````
+M$````!T````?`````(````#____P```````````````0````'0```!\`````
+M@````/____```````````````!`````=````'P````"`#P``____\```````
+M````````,````!T````?`````(`?``#____X```````````````P````'0``
+M`!\````````````````````````````````````=````'P``````````````
+M`````````````````````!T````?````````````````````````````````
+M````'0```!\````````````````````````````````````=````'P``````
+M`````````````````````````````!T````?````````````````````````
+M````````````'0```!\````````````````````````````````````=````
+M'P`!'K"``P``____\```````````````(````!T````?`````(`'``#____X
+M```````````````@````'0```!\``2!(@````/____```````````````'``
+M```=````'P`!(7@``````````````````````````````!T````?`````(`_
+M``#____P``````````````!`````'0```!\``2*`````````````````````
+M```````````=````'P````"`?P``____^```````````````4````!T````?
+M`````(`!``#____X```````````````0````'0```!\`````P/\``/____@`
+M`````````````'`````=````'P``````````````````````````````````
+M`!T````?`````(`/``#____P``````````````!`````'0```!\``3+@@```
+M`/____```````````````"`````=````'P``````````````````````````
+M`````````!T````?`````(`'``#____X```````````````P````'0```!\`
+M````@````/____```````````````#`````=````'P````"``P``____\```
+M````````````(````!T````?`````(`_``#____P``````````````!`````
+M'0```!\`````@`<``/____@``````````````"`````=````'P````"``P``
+M____\```````````````(````!T````?`````(`#``#____P````````````
+M```@````'0```!\`````@`<``/____@``````````````"`````=````'P``
+M``"``0``____^```````````````$````!T````?`````(`'``#____X````
+M```````````@````'0```!\`````@````/____```````````````!`````=
+M````'P````"`?P``____^```````````````0````!T````?````````````
+M````````````````````````'0```!\`````@#\``/____``````````````
+M`$`````=````'P```````````````````````````````````!T````?````
+M`(````#____P```````````````0````'0```!\`````P/\``/____@`````
+M`````````%`````=````'P````"`#P``____\```````````````,````!T`
+M```?`````,#_``#____X``````````````!P````'0```!\`````@````/__
+M__```````````````!`````=````'P````"`````____\```````````````
+M$````!T````?`````(````#____P```````````````0````'0```!\`````
+M@`,``/____```````````````"`````=````'P``````````````````````
+M`````````````!T````?````````````````````````````````````'0``
+M`!\`````@`<``/____@``````````````"`````=````'P````"``P``____
+M\```````````````(````!T````?`````(`'``#____X```````````````@
+M````'0```!\`````@`\``/____```````````````#`````=````'P````"`
+M````____\```````````````$````!T````?`````(`'``#____X````````
+M```````@````'0```!\`````@`,``/____```````````````"`````=````
+M'P````"`#P``____\```````````````,````!T````?`````(`!``#____X
+M```````````````0````'0```!\`````@`<``/____@``````````````"``
+M```=````'P```````````````````````````````````!T````?`````(``
+M``#____P```````````````0````'0```!\`````@````/____``````````
+M`````!`````=````'P````"`````____\```````````````$````!T````?
+M````````````````````````````````````'0```!\`````@````/____``
+M`````````````!`````=````'P``````````````````````````````````
+M`!T````?`````(`'``#____X```````````````@````'0```!\`````@`$`
+M`/____@``````````````!`````=````'P````"`#P``____\```````````
+M````,````!T````?`````(`!``#____X```````````````0````'0```!\`
+M```````````````````````````````````=````'P````"`!P``____^```
+M````````````(````!T````?`````(`/``#____P```````````````P````
+M'0```!\`````@`$``/____@``````````````!`````=````'P````"`'P``
+M____^```````````````,````!T````?`````(`/``#____P````````````
+M```P````'0```!\`````@````/____```````````````!`````=````'P``
+M`````````````````````````````````!T````?`````(`'``#____X````
+M```````````@````'0```!\`````@`<``/____@``````````````"`````=
+M````'P```````````````````````````````````!T````?`````(`#``#_
+M___P```````````````@````'0```!\`````@`,``/____``````````````
+M`"`````=````'P````"`````____\```````````````$````!T````?``%?
+M6(!_``#____X``````````````!`````'0```!\``6"X@`\``/____``````
+M`````````#`````=````'P`!85R`#P``____\```````````````,````!T`
+M```?`````(`'``#____X```````````````@````'0```!\`````@````/__
+M__```````````````!`````=````'P````"``0``____^```````````````
+M$````!T````?`````(````#____P```````````````0````'0```!\`````
+M@````/____```````````````!`````=````'P````"`````____\```````
+M````````$````!T````?`````(`!``#____X```````````````0````'0``
+M`!\`````@`$``/____@``````````````!`````=````'P````"``0``____
+M^```````````````$````!T````?`````(`'``#____X```````````````@
+M````'0```!\`````@`,``/____```````````````"`````=````'P````"`
+M`P``____\```````````````(````!T````?`````(`'``#____X````````
+M```````@````'0```!\`````@`<``/____@``````````````"`````=````
+M'P```````````````````````````````````!T````?`````(`/``#____P
+M```````````````P````'0```!\`````P/\``/____@``````````````)``
+M```=````'P````"``P``____\```````````````(````!T````?`````(``
+M``#____P```````````````0````'0```!\`````@'\``/____@`````````
+M`````%`````=````'P````"``P``____\```````````````(````!T````?
+M`````(````#____P```````````````0````'0```!\`````@`$``/____@`
+M`````````````!`````=````'P````"`/P``____\```````````````0```
+M`!T````?`````,#_``#____X``````````````!0````'0```!\``8DH@`\`
+M`/____```````````````$`````=````'P````"`````____\```````````
+M````$````!T````?``&*V```````````````````````````````'0```!\`
+M````@`<``/____@``````````````#`````=````'P````"`#P``____\```
+M````````````,````!T````?``&,U(````#____P```````````````0````
+M'0```!\`````@!\``/____@``````````````#`````=````'P``````````
+M`````````````````````````!T````?`````,#_``#____X````````````
+M``!@````'0```!\`````P/\``/____@``````````````)`````=````'P``
+M``"`#P``____\```````````````,````!T````?`````(````#____P````
+M```````````@````'0```!\`````@!\``/____@``````````````$`````=
+M````'P`!HRS`_P``____^```````````````D````!T````?`````(#_``#_
+M___P``````````````!@````'0```!\``:JD@`<``/____@`````````````
+M`$`````=````'P`!K$"`!P``____^```````````````0````!T````?``&M
+M/```````````````````````````````'0```!\``:WX@'\``/____@`````
+M`````````&`````=````'P```````````````````````````````````!T`
+M```?````````````````````````````````````'0```!\``;%<@`$``/__
+M__@``````````````!`````=````'P`!LIR``0``____^```````````````
+M$````!T````?`````(`'``#____X```````````````@````'0```!\``;10
+M```````````````````````````````=````'P`!M(``````````````````
+M`````````````!T````?``&V)(`?``#____X```````````````P````'0``
+M`!\`````@`\``/____```````````````#`````=````'P````#`_P``____
+M^```````````````4````!T````?`````(`?``#____X```````````````P
+M````'0```!\`````@!\``/____@``````````````#`````=````'P````"`
+M````____\```````````````$````!T````?`````(````#____P````````
+M```````0````'0```!\`````@#\``/____```````````````$`````=````
+M'P`!OHB`!P``____^```````````````(````!T````?`````(````#____P
+M```````````````0````'0```!\`````@/\``/____```````````````%``
+M```=````'P````"`````____\```````````````$````!T````?`````(``
+M``#____P```````````````0````'0```!\`````@````/____``````````
+M`````!`````=````'P````"`#P``____\```````````````,````!T````?
+M`````(#_``#____P``````````````!0````'0```!\`````````````````
+M```````````````````=````'P``````````````````````````````````
+M`!T````?````````````````````````````````````'0```!\`````````
+M```````````````````````````=````'P``````````````````````````
+M`````````!T````?````````````````````````````````````'0```!\`
+M````@`,``/____```````````````"`````=````'P````"``P``____\```
+M````````````(````!T````?``'/H```````````````````````````````
+M'0```!\````````````````````````````````````=````'P````"``0``
+M____^```````````````$````!T````?`````(`/``#____P````````````
+M```P````'0```!\`````@`,``/____```````````````"`````=````'P``
+M``"`?P``____^```````````````<````!T````?``':.(`/``#____P````
+M```````````P````'0```!\``=LP@`,``/____```````````````"`````=
+M````'P`!W,R``P``____\```````````````(````!T````?`````(`/``#_
+M___P```````````````P````'0```!\`````@`\``/____``````````````
+M`#`````=````'P````"``0``____^```````````````$````!T````?``'B
+MI(````#____P```````````````0````'0```!\``>-@@`\``/____``````
+M`````````#`````=````'P````"`/P``____\```````````````0````!T`
+M```?````````````````````````````````````'0```!\``>>X@/\``/__
+M__```````````````%`````=````'P`!Z5R`'P``____^```````````````
+M,````!T````?``'K#```````````````````````````````'0```!\``>ML
+MP/\``/____@``````````````+`````=````'P`!\CP`````````````````
+M`````````````!T````?``'R^,#_``#____X``````````````%P````'0``
+M`!\``?=D@/\``/____```````````````'`````=````'P`!^/``````````
+M`````````````````````!T````?``'Y=(````#____P```````````````0
+M````'0```!\``?G0@`$``/____@``````````````!`````=````'P`!^C``
+M`````````````````````````````!T````?``'Z.```````````````````
+M````````````'0```!\`````@`,``/____```````````````"`````=````
+M'P`!^VB`_P``____\```````````````4````!T````?``']#(`_``#____P
+M``````````````!`````'0```!\``@#\````````````````````````````
+M```=````'P`"`53`_P``____^```````````````<````!T````?``()P,#_
+M``#____X``````````````1`````'0```!\``A!`````````````````````
+M```````````=````'P`"$*@``````````````````````````````!T````?
+M``(12,#_``#____X``````````````!0````'0```!\``A*P````````````
+M```````````````````=````'P`"$_``````````````````````````````
+M`!T````?``(58(`!``#____X```````````````0````'0```!\``A7`````
+M```````````````````````````=````'P`"%G"`?P``____^```````````
+M````0````!T````?``(9:(!_``#____X``````````````!0````'0```!\`
+M````@`,``/____```````````````"`````=````'P`"&OR`_P``____\```
+M````````````4````!T````?``(<H(`_``#____P``````````````!`````
+M'0```!\``B"0@/\``/____```````````````%`````=````'P`"),``````
+M`````````````````````````!T````?``(E&```````````````````````
+M````````'0```!\``B6\P/\``/____@``````````````&`````=````'P`"
+M)X@``````````````````````````````!T````?``(G\,#_``#____X````
+M``````````"`````'0```!\``BWX@/\``/____```````````````&`````=
+M````'P`"+_R``0``____^```````````````$````!T````?``(P?```````
+M````````````````````````'0```!\``C#(````````````````````````
+M```````=````'P`",1S`_P``____^```````````````4````!T````?``(T
+M2(!_``#____X``````````````!0````'0```!\`````@`,``/____``````
+M`````````"`````=````'P`"->R`_P``____\```````````````4````!T`
+M```?``(WD(`_``#____P``````````````!`````'0```!\``CM0P/\``/__
+M__@``````````````%`````=````'P`"0.``````````````````````````
+M`````!T````?``)!.```````````````````````````````'0```!\``D'<
+MP/\``/____@``````````````&`````=````'P`"0Z@`````````````````
+M`````````````!T````?``)$$,#_``#____X``````````````"`````'0``
+M`!\``DH8@/\``/____```````````````&`````=````'P`"3!B``0``____
+M^```````````````$````!T````?``),F```````````````````````````
+M````'0```!\``DSD```````````````````````````````=````'P`"33C`
+M_P``____^```````````````4````!T````?``)09(!_``#____X````````
+M``````!0````'0```!\`````@`,``/____```````````````"`````=````
+M'P`N<WEM=&%B`"YS=')T86(`+G-H<W1R=&%B`"YR96=I;F9O`"YR96PN=&5X
+M=``N<F5L+G)O9&%T80`N<F5L+F1A=&$`+F)S<P`N<F5L+G!D<@`N;61E8G5G
+M+FUE86)I-C0`````````````````````````````````````````````````
+M````````````&W````8``````````````#0````8```````````````$````
+M`0```"@````!````!@````````!,``)2"```````````````!``````````D
+M````"0````````````.HY```?-@````-`````@````0````(````,@````$`
+M```"```````"4E@``(^H```````````````(`````````"X````)````````
+M````!"6\```.6`````T````$````!`````@````^`````0````,```````+B
+M````57````````````````@`````````.@````D````````````$-!0```!`
+M````#0````8````$````"````$0````(`````P```````S=P```!F```````
+M````````"`````````!-`````0````````````,W<```0T``````````````
+M``0`````````20````D````````````$-%0``!#0````#0````D````$````
+M"````%(````!`````````````WJP`````````````````````0`````````1
+M`````P````````````-ZL````&(```````````````$``````````0````(`
+M```````````#?6P``!F0````#@````@````$````$`````D````#````````
+M`````Y;\```1Z````````````````0``````````````````````````````
+M`````````````P```@````````````````,```0````````````````#```&
+M`````````````````P``"`````````````````,```$````````````````#
+M```)`````````````````P``"P````$``+D,`````!(```(````,``"C````
+M```2```"````%P`!7/P`````$@```@```"(``'G\`````!(```(````M``%]
+M2``````2```"````.``!'G@`````$@```@```$,``8V(`````!(```(```!.
+M``!H#``````2```"````60`!X'@`````$@```@```&0``#UH```!I!$```8`
+M``!O``%E3``````2```"````>@``:[P`````$@```@```(4``%E``````!(`
+M``(```"0``!-*````:01```&````FP`!5+``````$@```@```*8``4X0````
+M`!(```(```"Q``$^C``````2```"````O``!'3``````$@```@```,<``2MP
+M`````!(```(```#2```,:``````2```"````W0`!#`P`````$@```@```.@`
+M`._0`````!(```(```#S``#-4``````2```"````_@``U+@`````$@```@``
+M`0D``*B\`````!(```(```$4``%9I``````2```"```!'P`!')@`````$@``
+M`@```2H``3I(`````!(```(```$U``&`<``````2```"```!0```"50`````
+M$@```@```4L``2&0`````!(```(```%6``"^@``````2```"```!80`!RW0`
+M````$@```@```6P``*UT`````!(```(```%W``#4W``````2```"```!@@``
+M$70`````$@```@```9T``$@P```!I!$```8```&H``%/M``````2```"```!
+MLP``JEP`````$@```@```;X```/P`````!(```(```')``'.H``````2```"
+M```!U```````````$````````?4``'1(`````!(```(```(```%3*``````2
+M```"```""P`!4J``````$@```@```A8``1`0`````!(```(```(A``!X*```
+M```2```"```"+```QQ``````$@```@```C<``,X(`````!(```(```)"``$1
+M7``````2```"```"30``PWP`````$@```@```E@``5#,`````!(```(```)C
+M``"MF``````2```"```";@``<L@`````$@```@```GD``*-4`````!(```(`
+M``*$``%';``````2```"```"CP``T%@`````$@```@```IH``5!T`````!(`
+M``(```*E``%.T``````2```"```"L``!'Z``````$@```@```KL``8&\````
+M`!(```(```+&``!KM``````2```"```"T0`!480`````$@```@```MP``%[X
+M`````!(```(```+G``#/S``````2```"```"\@`!2G``````$@```@```OT`
+M``-(`````!(```(```,(``%/;``````2```"```#$P`!LNP`````$@```@``
+M`QX``3A@`````!(```(```,I``&+V``````2```"```#-```=T@`````$@``
+M`@```S\``+[8`````!(```(```-*``#$N``````2```"```#50``H<``````
+M$@```@```V```;L<`````!(```(```-K``"2G``````2```"```#=@``?0``
+M````$@```@```X$``;P0`````!(```(```.,``"E0``````2```"```#EP``
+M`=@`````$@```@```Z8``9]H`````!(```(```.Q``%BS``````2```"```#
+MO```SW0`````$@```@```\<``;?X`````!(```(```/2``%8+``````2```"
+M```#W0`!9#0`````$@```@```^@```,\`````!(```(```/S``#)3``````2
+M```"```#_@`!$:P`````$@```@``!`D``1$0`````!(```(```04``#F3```
+M```2```"```$'P``98P`````$@```@``!"H``'>8`````!(```(```0U```$
+M(``````2```"```$2P`!BI0`````$@```@``!%8``*X,`````!(```(```1A
+M``!YM``````2```"```$;```N_P`````$@```@``!'<``8&8`````!(```(`
+M``2"``#YS``````2```"```$C0`!08@`````$@```@``!)@``3S,`````!(`
+M``(```2C``!M```````2```"```$K@``N;0`````$@```@``!+D``=(8````
+M`!(```(```3$``$^[``````2```"```$SP``SSP`````$@```@``!-H``'.4
+M`````!(```(```3E``$/[``````2```"```$\``!(N@`````$@```@``!/L`
+M`;<0`````!(```(```4&``%."``````2```"```%$0``PU``````$@```@``
+M!1P``6:L`````!(```(```4G``"B^``````2```"```%,@`!R,P`````$@``
+M`@``!3T``-@,`````!(```(```5(``!Q<``````2```"```%4P`!4E``````
+M$@```@``!5X``2KD`````!(```(```5I``$:,``````2```"```%=``!SS``
+M````$@```@``!7\``````````!````````6,``"DO``````2```"```%EP``
+MA4P`````$@```@``!:(``<M8`````!(```(```6M``'0+``````2```"```%
+MN``!2Y``````$@```@``!<,```;P`````!(```(```74``&_Z``````2```"
+M```%WP``>&@`````$@```@``!>H``*MH`````!(```(```7U``#/+``````2
+M```"```&```!3C@`````$@```@``!@L``>'D`````!(```(```86``"$3```
+M```2```"```&(0`!,RP`````$@```@``!BP``+Z(`````!(```(```8W``#H
+M\``````2```"```&0@``H@0`````$@```@``!DT``980`````!(```(```98
+M``%HI``````2```"```&8P`!7S``````$@```@``!FX``-AP`````!(```(`
+M``9Y``%4X``````2```"```&A```RU@`````$@```@``!H\``,],`````!(`
+M``(```::``%9_``````2```"```&I0`!O+0`````$@```@``!K```=)\````
+M`!(```(```:[``#0!``````2```"```&Q@``KQ@`````$@```@``!M$``&K$
+M`````!(```(```;<``"Z.``````2```"```&YP`!24@`````$@```@``!O(`
+M`'VP`````!(```(```;]``(T_``````2```"```'"```?/``````$@```@``
+M!Q,``4Z(`````!(```(```<>``%-```````2```"```'*0``4'@```&D$0``
+M!@``!S0``1L,`````!(```(```<_``'G9``````2```"```'2@``>Q0`````
+M$@```@``!U4``-4$`````!(```(```=@``"%L``````2```"```':P`!?20`
+M````$@```@``!W8``4<,`````!(```(```>!``%)Q``````2```"```'C``!
+MT&P`````$@```@``!Y<``)#$`````!(```(```>B``"!Q``````2```"```'
+MK0``=80`````$@```@``![@``(40`````!(```(```?#``%(F``````2```"
+M```'S@`!A0P`````$@```@``!]D``<90`````!(```(```?D``!`N````:01
+M```&```'[P``;>``````$@```@``!_H``$NP`````!(```(```@%``"C"```
+M```2```"```($```A.P`````$@```@``"!L``````````!````````@[``"'
+MG``````2```"```(1@`````````)$0``!@``"%8``8\X`````!(```(```AA
+M``#%<``````2```"```(;``"41@`````$@```@``"'<``2T4`````!(```(`
+M``B"``%+'``````2```"```(C0``?0@`````$@```@``")@``8LL`````!(`
+M``(```BC``#/-``````2```"```(K@``U```````$@```@``"+D``+_,````
+M`!(```(```C$``%.D``````2```"```(SP``````````$```````"-X``,9$
+M`````!(```(```CI``!.T````:01```&```(]``!8IP`````$@```@``"/\`
+M`32@`````!(```(```D*``#PY``````2```"```)%0``D*``````$@```@``
+M"2```,PX`````!(```(```DK``$\U``````2```"```)-@``2=@```&D$0``
+M!@``"4$``52,`````!(```(```E,``#(Q``````2```"```)5P`!9\``````
+M$@```@``"6(``=V\`````!(```(```EM``#`K``````2```"```)>```@OP`
+M````$@```@``"8,``,14`````!(```(```F.``#TO``````2```"```)F0``
+MF8``````$@```@``":0``68$`````!(```(```FO``!+@````:01```&```)
+MN@``Q=@`````$@```@``"<4``,@8`````!(```(```G0``!VG``````2```"
+M```)VP`!Q70`````$@```@``">8``````````!````````GU``$<H``````2
+M```"```*```!1S@`````$@```@``"@L``'!,`````!(```(```H6``%0O```
+M```2```"```*(0``SR0`````$@```@``"BP``4@X`````!(```(```HW``!"
+M8````:01```&```*0@``U\``````$@```@``"DT``+PD`````!(```(```I8
+M```!B``````2```"```*9@``/Q````&D$0``!@``"G$``-<@`````!(```(`
+M``I\``"]:``````2```"```*AP```!`````D$0``!@``"ID``'3(`````!(`
+M``(```JD``!U?``````2```"```*KP`!/I0`````$@```@``"KH``(!L````
+M`!(```(```K%``'D2``````2```"```*T```@0@`````$@```@``"ML``,U`
+M`````!(```(```KF``%DV``````2```"```*\0``6"0`````$@```@``"OP`
+M`<5,`````!(```(```L'``#6>``````2```"```+$@``SM0`````$@```@``
+M"QT``62$`````!(```(```LH``$:7``````2```"```+,P`!O&``````$@``
+M`@``"SX``,SX`````!(```(```M)``&=X``````2```"```+5```O7``````
+M$@```@``"U\``1R\`````!(```(```MJ``!$"````:01```&```+=0``@JP`
+M````$@```@``"X```=`T`````!(```(```N+``!I\``````2```"```+E@``
+M@3@`````$@```@``"Z$``10X`````!(```(```NL``!]3``````2```"```+
+MMP``>P0`````$@```@``"\(``34D`````!(```(```O-``&Z#``````2```"
+M```+V```U^0`````$@```@``"^,``%CH`````!(```(```ON``$YF``````2
+M```"```+^0``$$@`````$@```@``#`0```K@`````!(```(```P/``$W^```
+M```2```"```,&@``>\P`````$@```@``#"4``(&@`````!(```(```PP``&P
+MO``````2```"```,.P``<EP`````$@```@``#$8``9\H`````!(```(```Q1
+M``!(/``````2```"```,7```!HP`````$@```@``#&<``4@$`````!(```(`
+M``QR```````````0```````,@@``^@P`````$@```@``#(T``&G(`````!(`
+M``(```R8``'*F``````2```"```,HP``<T@`````$@```@``#*X``4"D````
+M`!(```(```RY``#*J``````2```"```,Q``!&\``````$@```@``#,\`````
+M`````!````````SO```)U``````2```"```,^@``<+``````$@```@``#04`
+M`'$T`````!(```(```T0``#$B``````2```"```-&P``;`P`````$@```@``
+M#28``,><`````!(```(```TQ``$M>``````2```"```-/```SYP`````$@``
+M`@``#4<``6CT`````!(```(```U2``!\Z``````2```"```-70``<!@`````
+M$@```@``#6@``'5T`````!(```(```US```````````0```````-@0``PQP`
+M````$@```@``#8P```WD`````!(```(```V7``!]$``````2```"```-H@``
+MUAP`````$@```@``#:T``-"D`````!(```(```VX``"1B``````2```"```-
+MPP``@T@`````$@```@``#<X``'4``````!(```(```W9``%&V``````2```"
+M```-Y``!9%P`````$@```@``#>\``7Q,`````!(```(```WZ``#&Q``````2
+M```"```.!0`!.4P`````$@```@``#A```8_<`````!(```(```X;``!W)```
+M```2```"```.)@``U#``````$@```@``#C$``,EP`````!(```(```X\``"L
+M:``````2```"```.1P``P[0`````$@```@``#E(``,]$`````!(```(```Y=
+M``"CI``````2```"```.:```4B````&D$0``!@``#G,``'"H`````!(```(`
+M``Y^``##K``````2```"```.B0``9X@`````$@```@``#I0``&K,`````!(`
+M``(```Z?``$XS``````2```"```.J@``$-``````$@```@``#K4``<Y\````
+M`!(```(```[```%.R``````2```"```.RP``RE``````$@```@``#M8``:^@
+M`````!(```(```[A``#39``````2```"```.[```V>P`````$@```@``#O<`
+M`%/(```!I!$```8```\"``$S"``````2```"```/#0``<>0`````$@```@``
+M#Q@```CH`````!(```(```\C``!P>``````2```"```/+@`!S"``````$@``
+M`@``#SD``;]``````!(```(```]$``"![``````2```"```/3P``R_``````
+M$@```@``#UH``600`````!(```(```]E``""%``````2```"```/<```9G@`
+M````$@```@``#WL``'J\`````!(```(```^&``"T\``````2```"```/D0``
+M#K``````$@```@``#YP``1YP`````!(```(```^G``"I$``````2```"```/
+ML@``U8``````$@```@``#[T``'SX`````!(```(```_(``$3E``````2```"
+M```/TP`!9:@`````$@```@``#]X``?J0`````!(```(```_I``!\F``````2
+M```"```/]```6F0`````$@```@``#_\``%"D`````!(```(``!`5``%G3```
+M```2```"```0(```@Z0`````$@```@``$"L``6L$`````!(```(``!`V``$Z
+M=``````2```"```000`!&HP`````$@```@``$$P``-70`````!(```(``!!7
+M``"I>``````2```"```08@``1XP`````$@```@``$&T``*U\`````!(```(`
+M`!!X``"0[``````2```"```0@P``U2P`````$@```@``$(X``.8H`````!(`
+M``(``!"9``!G```````2```"```0I```KQ``````$@```@``$*\``'D8````
+M`!(```(``!"Z``$*^``````2```"```0Q0`!8@``````$@```@``$-```4U8
+M`````!(```(``!#;``#)P``````2```"```0Y@``K]0`````$@```@``$/$`
+M`)UP`````!(```(``!#\``%.8``````2```"```1!P`!&@@`````$@```@``
+M$1(``AH<`````!(```(``!$=``%,<``````2```"```1*``!-U@`````$@``
+M`@``$3,``8(4`````!(```(``!$^``'%H``````2```"```120``````````
+M$```````$5L``+B$`````!(```(``!%F``$S^``````2```"```1<0``````
+M````$```````$8(``'%H`````!(```(``!&-``#/Q``````2```"```1F```
+MJQ0`````$@```@``$:,``4KX`````!(```(``!&N``&I8``````2```"```1
+MN0``YKP`````$@```@``$<0``$L@`````!(```(``!'=``'%T``````2```"
+M`'IZ,#`U8C4X-#8`>GHP,#)D8C$Q8P!Z>C`R9&)F.#<U`'IZ,#)D8F(Q8C(`
+M>GHP,F1B,C`U,P!Z>C`P,F1B830R`'IZ,&9B8C%E,V8`>GHP8C<Y96$Y-`!Z
+M>C`U8CAC-C5A`'IZ,#`U8C0P860`>GHP-6(Y-#)E9`!Z>C!D.&1C-C)C`'IZ
+M,#`Q.68T-S``>GHP,F1D.30R9`!Z>C`R9&)E-S-D`'IZ,#`U8C8Y,F(`>GHP
+M8C9D,C,R-0!Z>C`P-6(X-3-D`'IZ,#`Q-F0Y,F4`>GHP8V9B,3@W-0!Z>C`P
+M,F1B,S%C`'IZ,#)D86)B86,`>GHP,F1B8S@U,0!Z>C`P,&(V8S8X`'IZ,#`P
+M8C9B9C@`>GHP,&(V8V8U90!Z>C`Q-F4Q9&9D`'IZ,&(V9C4P8C@`>GHP-F4P
+M831F90!Z>C`P-C=D,F(Q`'IZ,#`R9&)C-C$`>GHP8C9C83,R-0!Z>C`P-6(V
+M8V9D`'IZ,#$V93!D9F0`>GHP,#!B-F8V.`!A=&A?:&%L7W!R;V-E<W-?;F]I
+M<V5F;&]O<@!Z>C`P-6(T.&%D`'IZ,#)D8F8Q8C(`>GHP,#5B.#AC8@!Z>C`S
+M,V5C.&)F`'IZ,&1B-#(U8S4`871H7VAA;%]D;6%?8F5A8V]N7W)E<W!O;G-E
+M7W1I;64`>GHP,&(V9C$V,0!Z>C`V93`P8CAA`'IZ,#)D8F9C,60`>GHP9&,T
+M93,Y,`!Z>C!D869E9#@V`'IZ,#!B-F4R-V$`>GHP,F1B8F%B,@!Z>C!B-F0Q
+M969F`'IZ,#$V9#DP9&0`>GHP,F1B93@U,0!Z>C`P-6(V-&9D`'IZ,#`P8C9D
+M-3(`>GHP8C9C.65F9@!Z>C`Q-F4P,&1D`'IZ,#)D8F0X-S4`>GHP,F1B,S%B
+M,@!Z>C`P8C<P.3(S`'IZ,#!B-F0T-3``>GHP,#!B-F0Q9`!Z>C!B-F,R,S(U
+M`'IZ,#)D8F1A8C(`>GHP,#`U8C8S,@!Z>C`V9&5D9#DS`'IZ,#`Q-F1A-3``
+M>GHP,#`V-V0S,@!Z>C`P8C9D.3(S`'IZ,#`R9&(U,6,`>GHP,39D8V)F90!Z
+M>C`P8C<P,30U`'IZ,#`Q-F1F,F,`>GHP8C=F860S90!Z>C`Q-F0Y.3(P`'IZ
+M,#)D8C%B86,`>GHP9&,V93,Y,`!Z>C`U8C<P,64P`'IZ,#`P8C9B,3``>GHP
+M8C<P.65F9@!Z>C`Q-F1F.#EB`&%T:%]H86Q?871T86-H`'IZ,#9E,&9C,&0`
+M>GHP,39D86(R9`!Z>C`R9&(Q,S5D`'IZ,&4P-#8X-&(`>GHP,39E,CDQ9`!Z
+M>C`P,&(V9F4X`'IZ,#!C9F(S93``>GHP,#$V9#DT.`!Z>C`Q-F4R,#EB`'IZ
+M,&(W,#%E9F8`>GHP,#!B-F,Y9`!Z>C`P,#5B-6$R`'IZ,#)D8C$W,&$`871H
+M7VAA;%]C;VUP=71E='AT:6UE`'IZ,#)D8C5B86,`>GHP,#5B.#$S9`!Z>C`P
+M8C9C.3(S`'IZ,&(V8C4P8C@`>GHP,#5B-V8Y9`!Z>C!B-S`Q9#`R`'IZ,#9D
+M9F8T-&$`>GHP,F1B-3<V,P!Z>C`V965A9C8P`'IZ,&4P,#=C83$`>GHP,#)D
+M868V,@!Z>C!B.#-A9#-E`'IZ,#`P8C9B.3``>GHP,39D.65F80!Z>C`Q-F1E
+M,#4Q`'IZ,#`P-6(V8C(`>GHP-6(W9C$Q-`!Z>C`T864P,S%F`'IZ,#)D8F1D
+M9F0`>GHP,#4T-V9E9`!Z>C`P8C9B9C5E`'IZ,#!B-S$W-V0`>GHP,&(W,&8S
+M9`!Z>C`Q-F0X.3(P`'IZ,#)D8C%A8C(`>GHP,#`U8C8R,@!Z>C`P,&(V9C<X
+M`'IZ,&(V.6(P-V,`871H7VAA;%]F<F5E`'IZ,#5B-SEB,6(`>GHP,&(W,#<S
+M9`!Z>C`R9&)E8F)D`'IZ,&(U93,Q-3(`>GHP,39D9F)F,0!A=&A?:&%L7VUH
+M>C)I965E`'IZ,#$V93$X.6(`>GHP9&,R835C-0!Z>C`P,F1C-C!B`'IZ,#9D
+M9C!B.&$`>GHP,F1B,S,U9`!Z>C!B-F,U,V$T`'IZ,&8U-&0Q8C``>GHP8C9F
+M9#,V,P!Z>C!D.61C-C)C`'IZ,#5B-S0Q93``>GHP,F1A.6)A8P!Z>C!D8S(Q
+M9#-A`'IZ,#!B-S$W,V0`>GHP,39D.60T,0!Z>C`P-6(X-&9D`'IZ,#`U8CAA
+M8F0`>GHP,&(W,#$R,P!Z>C`P-6(V-3)B`'IZ,#)D8C,X-S4`>GHP,39E,S`Y
+M8@!Z>C`P-6(V,&(R`'IZ,#)D8C$X-S4`>GHP,#)D8C@T,@!Z>C`R9&(Q-S8S
+M`'IZ,&(W9&5A.30`>GHP,&(W,#$V,0!Z>C`Q-F0W9#0Q`'IZ,#`Q-F-D,S(`
+M>GHP-F1E,&(X80!Z>C`V9#ED9#DS`'IZ,&1B,V5D.#8`>GHP,#5B-#AE9`!Z
+M>C`P,F1C.#!B`'IZ,#`R9&)C-#(`>GHP,F1B83@U,0!Z>C`R9&(S,V5D`'IZ
+M,#`U8C@P9F0`>GHP,#5B-V8R90!Z>C`R9&)F9&9D`'IZ,#$V938T.&$`>GHP
+M,#)D869F,@!Z>C`P-6(W-SED`'IZ,#`P8C9E93@`>GHP,39E-#0X80!Z>C`P
+M8C9F-F)C`'IZ,#$V9&$Y,C``>GHP-6(W.#%E,`!Z>C`P,F1C83!B`'IZ,#`U
+M8C0T860`>GHP-F1D9C0T80!Z>C!F86,P8SEB`'IZ,&(V9CEE9F8`>GHP,&(V
+M8S9B8P!A=&A?:&%L7V%D9&ET:6]N86Q?<W=B85]B86-K;V9F`'IZ,#`P,F1B
+M.3(`871H7VAA;%]V97)S:6]N`'IZ,#)D8F%C,F4`>GHP,F1B-SEA90!Z>C`P
+M,39E-3,R`'IZ,&(V8V8P,#D`>GHP,#$V93$R8P!Z>C`P,39D.64T`'IZ,#`P
+M,F1A96$`>GHP,#5B-6-B,@!Z>C`Q-F1A,C4Q`'IZ,#9F-F%F-C``>GHP-F1F
+M9&0Y,P!A=&A?:&%L7VUA;&QO8P!Z>C`P,&(V9&0R`'IZ,#)D9#DR860`>GHP
+M,39D8C(U,0!Z>C!E,3`W8V$Q`'IZ,#!B-F,W-64`>GHP,39D9#`U,0!Z>C`R
+M9&)D,6(R`'IZ,#)D8S$W-C,`>GHP8C8Y,&0V9`!Z>C`Q-F1F,#4Q`'IZ,#`Q
+M-F0Y-3``>GHP,&(W,#9B8P!Z>C`P,39D.#<R`'IZ,#9D968T-&$`>GHP-6(X
+M8S)E9`!Z>C`V9F(Y-#=B`'IZ,&5B8C%E,V8`>GHP8C9F.60P,@!Z>C!D,31D
+M,6(P`'IZ,&(T.#`S,64`>GHP,39D8F)F90!Z>C`Q-F4U-#AA`'IZ,#`Q-F0X
+M-3``>GHP,#!B-F9F.`!A=&A?:&%L7VUE;6-P>0!Z>C`R9&)C8F)D`'IZ,#$V
+M9&$P9&0`>GHP,F1B8F1F9`!Z>C`R9&(R.#4Q`'IZ,#)D8F1C,60`>GHP-F1B
+M,&-F,@!Z>C`Q-F5B.6%D`'IZ,#!B-F-E8F,`>GHP9#DT.#1A,0!A=&A?:&%L
+M7W!R;V)E`'IZ,#$V96$Y860`>GHP9F0T9#%B,`!Z>C`R9&(S-S8S`&%T:%]H
+M86Q?8G5I;&1O<'1S`'IZ,#)D868S-60`>GHP-F1D9&0Y,P!Z>C!D861C-C)C
+M`'IZ,#$V9&8R-3$`>GHP,#!B-F,Q,`!Z>C`Q-F0Y,C4Q`'IZ,#)D8C`X-3$`
+M>GHP8C<R,6%E9`!Z>C`V-V-F8V%E`'IZ,#`P8C9C9C@`>GHP8SDT9#%B,`!Z
+M>C`R9&%F86(R`'IZ,#5B.3)A960`>GHP,#5B.&-C8@!Z>C!B-F0Y969F`'IZ
+M,#)D8C$Q8C(`>GHP,F1B9F9B,0!Z>C`R9&)F-S8S`'IZ,#`U8C8X9F0`>GHP
+M,#5B-#1E9`!Z>C!B-S$Q865D`'IZ,&(U93,Q-C``>GHP9#@T.#1A,0!Z>C`Q
+M-F0X8C)D`'IZ,#$V93`X.6(`>GHP,F1B8C@W-0!Z>C`R9&%E.#4Q`'IZ,&(X
+M,65A.30`>GHP,39D96,Q9@!Z>C`P8C9F96)C`'IZ,&4X.30Y,#<`>GHP,&(V
+M96$W80!Z>C`S,V4X9F)F`'IZ,&-F834X-S4`>GHP,F1B.3EA90!Z>C`R9&(Y
+M86(R`'IZ,#`P8C9B93@`>GHP9&4V.#,W9@!Z>C`Q-F1A8F9E`'IZ,&(W,#ED
+M,#(`>GHP-C=D,C5E,@!Z>C`Q.68S83`Q`'IZ,#<P,SDT-V(`871H7VAA;%]M
+M96UZ97)O`'IZ,#9D9F9C,&0`>GHP8C8W-3!B.`!Z>C`Q-F4R9&9D`'IZ,#`P
+M8C9D,C(`>GHP-F9E868V,`!Z>C!D8S1A-6,U`'IZ,#!B-S!F-V0`871H7VAA
+M;%]S=U]B96%C;VY?<F5S<&]N<V5?=&EM90!Z>C`Y9C8T8C9A`'IZ,#`U8C8U
+M-V$`>GHP-F8S.30W8@!Z>C`V9&$P8V8R`'IZ,&(W8F%D,V4`>GHP,&(V9CDV
+M,0!Z>C!B-CDW,V)C`'IZ,#)D8F0S-60`>GHP,#5B.#AF9`!Z>C`R9&)B8S%D
+M`'IZ,#)D869D9F0`>GHP-F0W9&0Y,P!A=&A?:&%L7V1E;&%Y`'IZ,#)D8C%D
+M9F0`>GHP-C=D,F8T,0!Z>C`R9&%F.#<U`'IZ,&(W961E-F0`>GHP,39D.&0T
+M,0!Z>C`P,F1A93DR`'IZ,&(W861E-F0`>GHP,F1B8C,U9`!Z>C`R9&(S9&9D
+M`'IZ,#)D8C4S960`>GHP,39D8V5A90!Z>C`P,&(V9&$R`'IZ,#`P8C9E,C(`
+M>GHP-6(X,#`T,0!Z>C`P,39D.#0X`'IZ,#$V9#EB,F0`>GHP,#$V93`R8P!Z
+M>C`P8C<P-S=D`'IZ,#`U8C8Y-V$`>GHP,#$V9&%E-`!Z>C`Q-F4Q,#EB`'IZ
+M,#`U8C1A,F0`>GHP,39D93!D9`!Z>C`Q-F1F,&1D`'IZ,&1F,#=C83$`>GHP
+M,F1B9#<V,P!Z>C`P,&(V934R`'IZ,#8W9#!C-#<`>GHP-6(V8S9D8@!Z>C!C
+M,S$U96(U`'IZ,&1B,65D.#8`>GHP-F0T,#9E,`!Z>C`Q-F4P,C4Q`'IZ,#`P
+M,F1B8C(`>GHP,#)D9#@V9`!Z>C`P,39E,31D`'IZ,#)D8C4Y864`>GHP,#8W
+M9#(R,0!Z>C`Q-F0X,&1D`'IZ,#`U8C@Y,V0`>GHP-6(X,6(Q8@!Z>C`R9&(Q
+M,V5D`'IZ,#!B-F0Q,C,`>GHP,#!B-F-E.`!Z>C`U8CAA865D`'IZ,&(V960S
+M-C,`>GHP,F1A9C%B,@!Z>C`P,#5B-64R`'IZ,#,S96)F8F8`>GHP-6(V.#9D
+M8@!Z>C`P,&(V968X`'IZ,&(W,3EA960`>GHP,#5B-3AB,@!Z>C`U8C=D8C%B
+M`'IZ,&(X,F1E-F0`>GHP,#$V9#<S,@!Z>C`R9&%D86(R`'IZ,&8T-64V93,`
+M871H7VAA;%]I;FET7V-H86YN96QS`'IZ,#!B-F0V8F,`>GHP8S$T9#%B,`!Z
+M>C`P,#)D8F0R`'IZ,&1A-#@T83$`>GHP,39E,&(X-P!Z>C`U8CDP,F5D`'IZ
+M,&1C,F4S.3``>GHP838P9#$T-0!Z>C`R9&)A8F)D`'IZ,#`P8C9C,60`>GHP
+M-6(X96%E9`!Z>C`P-6(W8CED`'IZ,#`U8C4T-#8`>GHP-6(V-#9D8@!Z>C`P
+M8C9F.3(S`'IZ,&1D-C@S-V8`>GHP,39E,3(U,0!Z>C!D8S9A-6,U`'IZ,#)D
+M8C,W,&$`>GHP,#`U8C8W,@!Z>C`V9&5F8S!D`'IZ,#)D8F8S-60`>GHP,#!B
+M-F,W.`!Z>C`P,39D.#,R`'IZ,#)D8C4W,&$`>GHP,#5B-F0W80!Z>C`P,F1B
+M,CDR`'IZ,#`U8CDP8V(`871H7VAA;%]R96=?=W)I=&4`>GHP8C9F-3,V,P!Z
+M>C`P-6(U8S0V`&%T:%]H86Q?<F5G7W)E860`>GHP-F0Y,&-F,@!Z>C`V9#AD
+M9#DS`'IZ,#$V9&9B.#<`>GHP,#$V9&$T.`!Z>C!B-C8S,6$X`'IZ,#`R9&(P
+M.3(`871H7VAA;%]G971W:7)E;&5S<VUO9&5S`'IZ,#$V93%B.#<`````U```
+M`00```"<```"!0```%0```(%```!-````@8```$(```"!0```$@```(%```!
+M/````@8```$D```"!0```40```(&```!&````@4```%,```"!@```(P```(%
+M````9````@4```%4```"!@```-@```(%```!7````@8```"T```"!0```60`
+M``(&````#````@4```%L```"!@```'P```(%```!=````@8```#P```"!0``
+M`.````(%````,````@4```%\```"!@```;0```$%```!N````08```(<```!
+M!````CP```$$```";````00```)\```!!````J0```$$```"O````00```*X
+M``!V!0```J```'8%```"2```=@4```(H``!V!0```L```'8&```"Q````00`
+M``*(``&$!0```G@``80%```"#``!A`4```+(``&$!@```LP``$<%```"&```
+M1P4```+0``!'!@```MP```$$```#@``!D`4```.$``&0!@```X@``34%```#
+MC``!-08```1P```!!```!(P```$$```$Y````00```5$```!!```!:0```$$
+M```%Z````00```8L```!!```!R@```$$```'/```O`4```=```"\!@``!WP`
+M``$$```'N````00```?(``"\!0``!\P``+P&```(0````00```AP```!!```
+M"(````$$```(J````00```D```$>!0``"00``1X&```)$````@4```D4```"
+M!@``"2@```$$```);``!'@4```EP``$>!@``"7P```(%```)@````@8```F<
+M```!!```"C```&8%```*-```9@8```KP```"!0``"O0```(&```+"````00`
+M``LT```!!```"T````$$```+7````00```MH```!!```"W0```$$```+@```
+M`00```N(```!!```"\@```$$```+U````00```O@```!!```"^P```$$```+
+M^````00```PL```!!```#%0```$$```,B````00```R8```!!```#+````$$
+M```,T````00```U(``&0!0``#4P``9`&```.$````00```XL```!!```#C@`
+M``$$```.2````04```Y,```!!@``#E@```$$```.9````00```Z````!!```
+M#O0```$$```/2````00```^<```!!```#\@```$$```/\````00``!#H``#]
+M!0``$.P``/T&```1%``!'@4``!$8``$>!@``$2@```(%```1+````@8``!%$
+M```!!```$<````(%```1Q````@8``!'D``$>!0``$>@``1X&```29````00`
+M`!-H```!!```$V0```(%```3;````@8``!-P```"!0``$W0```(&```4&```
+M`00``!0H```!!```%30```$$```6N````04``!:\```!!@``%U@``,T%```7
+M7```S08``!HD```!!```&_0```$$```<!````00``!P<```!!0``'%0```$&
+M```<E````00``!SH```!!```'3@```$$```=0````00``!U,``$@!0``'5``
+M`2`&```?J````00``"`8```!!0``(!P```$&```@2````04``"!,```!!@``
+M(,```(,%```@Q```@P8``"(<```!!0``(B````$&```B;````04``")P```!
+M!@``(GP```$$```BS````04``"+0```!!@``(MP```$$```C'````04``",@
+M```!!@``)6````$$```FK````00``"AL```!!```*B0```$$```L.````@4`
+M`"P\```"!@``+%0``,T%```L6```S08``"Q\``$@!0``+(```2`&```LJ```
+M`04``"RL```!!@``+,P```$%```LT````08``"SD```!!0``+.@```$&```M
+M,``!(`4``"TT``$@!@``+5P```$%```M8````08``"V````!!0``+80```$&
+M```MF````04``"V<```!!@``+>0``2`%```MZ``!(`8``"X0```!!0``+A0`
+M``$&```N-````04``"XX```!!@``+DP```$%```N4````08``"YH``"#!0``
+M+FP``(,&```N]````00``"[P```!!0``+O@```$&```O)````04``"\H```!
+M!@``+S0```$$```O;````00``"]\```!!```+XP```$$```OK````00``"_(
+M```!!```+]````$$```OX````04``"_D```!!@``,I0```$$```RR````00`
+M`#+8```!!```,N@```$$```S"````00``#,D```!!```,RP```$$```S0```
+M`04``#-$```!!@``,W@```$$```SI````00``#.8```!!0``,ZP```$&```S
+MW````00``#10```!!```-30```$$```U?````00``#90```!!```.&P```$%
+M```X<````08``#B\```!!```.,@```$%```XS````08``#F````"!0``.80`
+M``(&```YB````00``#F0```"!0``.90```(&```[2````04``#M,```!!@``
+M/7P```$$```]C````00``#VT```!!```/=0```$$```_L````00``#_````!
+M!```0#0```$$``!`1````00``$!D```!!```0(````$$``!!2````00``$&0
+M```!!```0:````$$``!".````00``$0L```!!```1OP```$$``!'1````00`
+M`$>@```!!0``1Z0```$&``!'O````04``$?````!!@``1]@```$%``!'W```
+M`08``$?T```!!0``1_@```$&``!($````04``$@4```!!@``2&````$%``!(
+M9````08``$CP```!!0``2/0```$&``!)%````P4``$D8```#!@``24@```$$
+M``!)4````P4``$E4```#!@``2:@```$%``!)K````08``$G8```!!```2?``
+M``$$``!)^````P4``$G\```#!@``2N0```$%``!*Z````08``$L\```!!0``
+M2T````$&``!+8````04``$MD```!!@``2X````$%``!+A````08``$N\```!
+M!0``2\````$&``!+[````00``$P$```!!```3#P```,%``!,0````P8``$R(
+M```!!0``3(P```$&``!,K````04``$RP```!!@``3,@```,%``!,S````P8`
+M`$TP```#!0``330```,&``!-6```Y@4``$U<``#F!@``36@```$$``!-F```
+M`P4``$V<```#!@``3AP```$%``!.(````08``$X\```!!0``3WP```$%``!/
+M5````04``$Y````!!@``3E0```$%``!.6````08``$YL```!!```3H@```,%
+M``!.C````P8``$[````!!```3O@```,%``!._````P8``$](```!!```3Y``
+M``$%``!/E````08``%$````!!0``400```$&``!1&````04``%$<```!!@``
+M43P```$%``!10````08``%%<```!!0``430```$%``!18````08``%%L```!
+M!0``47````$&``!1E````04``%&8```!!@``4;@```$%``!1O````08``%($
+M```!!0``4@@```$&``!25````@4``%)8```"!@``4N0```$$``!3#````00`
+M`%,<```!!```4RP```,%``!3,````P8``%,\```!!```4TP```,%``!34```
+M`P8``%-8```!!```4VP```,%``!3<````P8``%-\```!!```4Y````,%``!3
+ME````P8``%.@```!!```4[0```,%``!3N````P8``%/````!!```4]````,%
+M``!3U````P8``%/H```!!0``4^P```$&``!4"````04``%0,```!!@``5#P`
+M``$%``!40````08``%5```$@!0``540``2`&``!5>````00``%70```!!```
+M5MP```(%``!6X````@8``%<<```!!0``5R````$&``!7&````04``%<H```!
+M!@``6+````$$``!8]```_04``%CX``#]!@``66P```$%``!9<````08``%GP
+M```!!```6?P``/T%``!:````_08``%IL``#]!0``6G```/T&``!;X````00`
+M`%P8```!!0``7!P```$&``!<9````00``%R8```!!```7,0```$%``!<M```
+M`04``%R<```!!0``7(0```$%``!<6````04``%PT```!!0``7,@```$&``!<
+MU````00``%TH```#!0``72P```,&``!=7````00``%UX```!!0``77P```$&
+M``!=B````00``%WP```#!0``7?0```,&``!>)````00``%Y````!!0``7D0`
+M``$&``!>4````00``%Z,```!!0``7I````$&``!>R````00``%[$```!!0``
+M7LP```$&``!>U````04``%[8```!!@``7S0``,T%``!?.```S08``%]8```"
+M!0``7UP```(&``!?8```Y@4``%]D``#F!@``7[@``3L%``!?O``!.P8``%_<
+M``&0!0``7^```9`&``!@$``!C04``&`4``&-!@``8"0``8T%``!@*``!C08`
+M`&!,``&0!0``8%```9`&``!@9```+P4``&!H```O!@``8)0``8T%``!@F``!
+MC08``&"L``$J!0``8+```2H&``!@W``!*@4``&#@``$J!@``800``2H%``!A
+M"``!*@8``&%```$J!0``840``2H&``!AE``!*@4``&&8``$J!@``8C```'L%
+M``!B-```>P8``&1\```!!0``9(````$&``!DF``!*@4``&2<``$J!@``9/@`
+M``$$``!E!``!C04``&4(``&-!@``910```$$``!E'````00``&4P``&-!0``
+M930``8T&``!E1```@P4``&5(``"#!@``990``(,%``!EF```@P8``&:8``&-
+M!0``9IP``8T&``!G&```,04``&<<```Q!@``9RP``2@%``!G,``!*`8``&=`
+M```!!```9VP``6,%``!G<``!8P8``&>@``&-!0``9Z0``8T&``!GM``!D`4`
+M`&>X``&0!@``:#@``9`%``!H/``!D`8``&AD``&-!0``:&@``8T&``!HJ```
+M`00``&BP``&0!0``:+0``9`&``!HU``!C04``&C8``&-!@``:.P``8T%``!H
+M\``!C08``&D```&0!0``:00``9`&``!I0``!C04``&E$``&-!@``:9P``8T%
+M``!IH``!C08``&G0``&0!0``:=0``9`&``!J#``!D`4``&H0``&0!@``:C``
+M``$$``!K```!C04``&L$``&-!@``:V@``8T%``!K;``!C08``&O<``&0!0``
+M:^```9`&``!L0``!C04``&Q$``&-!@``;7P```$$``!ME``!C04``&V8``&-
+M!@``;U```8T%``!O5``!C08``&_0``!O!0``;]0``&\&``!P,```Y@4``'`T
+M``#F!@``<%@``.8%``!P7```Y@8``'"$```"!0``<(@```(&``!PC```Y@4`
+M`'"0``#F!@``<,P``9`%``!PT``!D`8``'#H``!*!0``<.P``$H&``!Q!``!
+MD`4``'$(``&0!@``<9P``20%``!QH``!)`8``'&\``!T!0``<<```'0&``!Q
+M_``!D`4``'(```&0!@``<C0``8T%``!R.``!C08``')T``&0!0``<G@``9`&
+M``!RH``!C04``'*D``&-!@``<N@``9`%``!R[``!D`8``',<``&-!0``<R``
+M`8T&``!S9``!D`4``'-H``&0!@``<[0``9`%``!SN``!D`8``'0$``&-!0``
+M=`@``8T&``!T(``!3P4``'0D``%/!@``=&```9`%``!T9``!D`8``'20```!
+M!```=*0``8T%``!TJ``!C08``'30``&0!0``=-0``9`&``!U&``!D`4``'4<
+M``&0!@``=5```8T%``!U5``!C08``'6D``#F!0``=:@``.8&``!UX``!C04`
+M`'7D``&-!@``=B```9`%``!V)``!D`8``'9(```!!```=E```9`%``!V5``!
+MD`8``'9T``&-!0``=G@``8T&``!VN``!D`4``':\``&0!@``=RP``9`%``!W
+M,``!D`8``'=8``&0!0``=UP``9`&``!W>``!C04``'=\``&-!@``=[0``9`%
+M``!WN``!D`8``'?@``&0!0``=^0``9`&``!X.``!D`4``'@\``&0!@``>(0`
+M`9`%``!XB``!D`8``'E````E!0``>40``"4&``!Y9````00``'EL``%;!0``
+M>7```5L&``!YA``!C04``'F(``&-!@``><0``9`%``!YR``!D`8``'G<```E
+M!0``>>```"4&``!Z'```)04``'H@```E!@``>CP```$$``!Z2``!D`4``'I,
+M``&0!@``>F@``5L%``!Z;``!6P8``'J(``&-!0``>HP``8T&``!ZS``!D`4`
+M`'K0``&0!@``>N0``"4%``!ZZ```)08``'LT``&0!0``>S@``9`&``![6``!
+MC04``'M<``&-!@``>VP```$$``![=``!D`4``'MX``&0!@``>Y0``8T%``![
+MF``!C08``'OL```E!0``>_```"4&``!\#````00``'P8``&0!0``?!P``9`&
+M``!\/``!6P4``'Q```%;!@``?&0``8T%``!\:``!C08``'RH``&0!0``?*P`
+M`9`&``!\R```)04``'S,```E!@``?2@```$$``!],``!%@4``'TT``$6!@``
+M?6@```$$``!]>``!C04``'U\``&-!@``?8@```$$``!];```&P4``'V0```;
+M!@``?;@``3<%``!]O``!-P8``'WT``&0!0``??@``9`&``!^%``!C04``'X8
+M``&-!@``?IP``9`%``!^H``!D`8``'[```&-!0``?L0``8T&``!^T``!-04`
+M`'[4``$U!@``?N0``9`%``!^Z``!D`8``'[P``$U!0``?O0``34&``!_```!
+MC04``'\$``&-!@``?U0```$$``!_9````00``']P``&0!0``?W0``9`&``!_
+ME``!C04``'^8``&-!@``?_```9`%``!_]``!D`8``(`0``&-!0``@!0``8T&
+M``"`I````00``("L```!!0``@+````$&``"`O````00``(#(```!!```@,0`
+M``$%``"`S````08``(#0```!!0``@-0```$&``"`X````00``($0``&0!0``
+M@10``9`&``"!6````00``(%D```!!```@6```!$%``"!:```$08``(%L```!
+M!```@50``/$%``"!<```\08``(%T```!!```@7P``2D%``"!@``!*08``(&H
+M``&0!0``@:P``9`&``"!T``!C04``('4``&-!@``@?@``8T%``"!_``!C08`
+M`((T``&-!0``@C@``8T&``""2``!D`4``(),``&0!@``@E```34%``""5``!
+M-08``(*\``&0!0``@L```9`&``""W``!C04``(+@``&-!@``@PP``9`%``"#
+M$``!D`8``(,H``&-!0``@RP``8T&``"#;``!C04``(-P``&-!@``@]```9`%
+M``"#U``!D`8``(/T```!!```@_P``9`&``"$(``!C04``(0D``&-!@``A'@`
+M`9`%``"$?``!D`8``(28```!!```A*```9`&``"$P``!C04``(3$``&-!@``
+MA/0``9`%``"$^``!D`8``(4P``&-!0``A30``8T&``"%_``!D`4``(8```&0
+M!@``AD```9`%``"&1``!D`8``(;````!!```AN````$$``"'\```_04``(?T
+M``#]!@``B"P```$$``"(0``!D`4``(Z\``&0!0``B00``9`%``"(,``!D`4`
+M`(A$``&0!@``B%@``3L%``"(7``!.P8``(B<``&-!0``B*```8T&``"(S```
+M`04``(C0```!!@``B0````$$``")#````00``(D<``&-!0``B2```8T&``")
+M-````00``(E```&-!0``B40``8T&``"):``!D`4``(EL``&0!@``B80``8T%
+M``")B``!C08``(KT``"V!0``BO@``+8&``"+V````@4``(O<```"!@``B^``
+M`8T%``"+Y``!C08``(PT``&%!0``C#@``84&``",4``!D`4``(Q4``&0!@``
+MC(```8T%``",A``!C08``(VD```!!0``C:@```$&``"-_``!C04``(X```&-
+M!@``C@P``34%``".$``!-08``(X@``&0!0``CB0``9`&``".4```2@4``(Y4
+M``!*!@``CF0``)0%``".:```E`8``(Z(```!!```CI```%<%``".E```5P8`
+M`([```!^!0``CL0``'X&``".U``!D`4``([8``&0!@``CO@``8T%``"._``!
+MC08``(\4``%_!0``CQ@``7\&``"/,```"P4``(\T```+!@``CTP``1@%``"/
+M4``!&`8``(]L``&-!0``CW```8T&``"/@````00``(_D``&0!0``C^@``9`&
+M``"0&````00``)`T```!!```D$````$$``"04````00``)!<```!!```D'@`
+M`8T%``"0?``!C08``)"H```!!0``D*P```$&``"0T````04``)#4```!!@``
+MD00``/@%``"1"```^`8``)$D```!!0``D2@```$&``"1/``!-04``)%```$U
+M!@``D50```$%``"16````08``)&D``#X!0``D:@``/@&``"1V``!C04``)'<
+M``&-!@``D?````$%``"1]````08``)((``$U!0``D@P``34&``"2(````04`
+M`)(D```!!@``DC@``34%``"2/``!-08``))0``#X!0``DE0``/@&``"2<```
+M`04``))T```!!@``DM```/T%``"2U```_08``)+P``&0!0``DO0``9`&``"3
+M#``!C04``),0``&-!@``DT0``34%``"32``!-08``).$```!!0``DX@```$&
+M``"3G``!-04``).@``$U!@``D[```9`%``"3M``!D`8``)/4``&-!0``D]@`
+M`8T&``"5$```2@4``)44``!*!@``E50``)0%``"56```E`8``)68``&0!0``
+ME9P``9`&``"5N``!C04``)6\``&-!@``EE@``8T%``"67``!C08``)9H``$U
+M!0``EFP``34&``"6E```2@4``):8``!*!@``ETP```$$``"7S````00``)B4
+M```!!```F-P```$$``"8[````00``)L8```!!0``FQP```$&``";@````@4`
+M`)N$```"!@``FZ0```$$``";O````04``)O````!!@``F]P```$%``";X```
+M`08``)P4```!!0``G!@```$&``"<-````04``)PX```!!@``G&P```$%``"<
+M<````08``)R,```!!0``G)````$&``"<Q````04``)S(```!!@``G.0```$%
+M``"<Z````08``)V4```"!0``G9@```(&``"=G```Y@4``)V@``#F!@``G;``
+M``(%``"=M````@8``)W(```!!0``G<P```$&``">%```+P4``)X8```O!@``
+MGD@``"\%``">3```+P8``*!````O!0``H$0``"\&``"@J``!C04``*"L``&-
+M!@``H.@``8T%``"@[``!C08``*%@```O!0``H60``"\&``"A@``!C04``*&$
+M``&-!@``H<@``9`%``"AS``!D`8``*(H``&0!0``HBP``9`&``"B1``!C04`
+M`*)(``&-!@``HF```$H%``"B9```2@8``*)\``$U!0``HH```34&``"BA```
+M4@4``**(``!2!@``HL@```$$``"C,``!9@4``*,T``%F!@``HX```14%``"C
+MA``!%08``*/L```!!```H_P```$$``"D!````00``*0,```!!```I#P``2`%
+M``"D0``!(`8``*1T```!!```I(0``+T%``"DB```O08``*6\``&-!0``J50`
+M`8T%``"EP``!C08``*8T``&0!0``IC@``9`&``"F;````00``*9X``&-!0``
+MIGP``8T&``"F^``!D`4``*;\``&0!@``IX```8T%``"GA``!C08``*>H```!
+M!```I]P```$$``"H$````00``*A$```!!```J'@```$$``"HZ``!D`4``*CL
+M``&0!@``J/@```$$``"I4````00``*E8``&-!0``J5P``8T&``"ID```H04`
+M`*F4``"A!@``J;```4\%``"IM``!3P8``*G$``&0!0``J<@``9`&``"IZ```
+M`00``*H```%/!0``J@0``4\&``"J$````00``*H<``&-!0``JB```8T&``"J
+M,``!3P4``*HT``%/!@``JJP```$$``"JN````00``*K```&-!0``JL0``8T&
+M``"JX````00``*KL``&-!0``JO```8T&``"K1``!D`4``*M(``&0!@``J[0`
+M``$$``"KP``!C04``*O$``&-!@``J]0``9`%``"KV``!D`8``*O<``$U!0``
+MJ^```34&``"L&``!C04``*P<``&-!@``K"@```$$``"L-```2@4``*PX``!*
+M!@``K$0```$$``"M'````00``*VP```!!```K=@```$$``"O2``!C04``*],
+M``&-!@``KUP``8T%``"O8``!C08``*^$``&0!0``KX@``9`&``"OK```+P4`
+M`*^P```O!@``L!```,T%``"P%```S08``+`T```"!0``L#@```(&``"P/```
+MY@4``+!```#F!@``L)```98%``"PE``!E@8``+#```&-!0``L,0``8T&``"P
+MX``!-04``+#D``$U!@``L/0``9`%``"P^``!D`8``+$L``&0!0``L3```9`&
+M``"Q0````04``+%$```!!@``L6P```$$``"Q?``!C04``+&```&-!@``L8P`
+M`34%``"QD``!-08``+&<```!!0``L:````$&``"QR``!2`4``+',``%(!@``
+ML?P``9`%``"R```!D`8``+(H``%(!0``LBP``4@&``"R4``!2`4``+)4``%(
+M!@``LM@```(%``"RW````@8``+,L``%X!0``LS```7@&``"S:``!C04``+-L
+M``&-!@``LW@``34%``"S?``!-08``+.(```!!0``LXP```$&``"SR````00`
+M`+/8``%(!0``L]P``4@&``"S_```T@4``+0```#2!@``M`@```$%``"T#```
+M`08``+08``&`!0``M!P``8`&``"T-``!2`4``+0X``%(!@``M)0```$$``"T
+MI``!904``+2H``%E!@``M0```1T%``"U!``!'08``+40``"#!0``M10``(,&
+M``"U8````@4``+5D```"!@``M7@```(%``"U?````@8``+6D``&0!0``M:@`
+M`9`&``"UK``!C04``+6P``&-!@``MA0``8T%``"V&``!C08``+8<``&0!0``
+MMB```9`&``"VC``!-04``+:0``$U!@``MNP```$$``"W:```W04``+=L``#=
+M!@``N"P``4@%``"X,``!2`8``+BD``&-!0``N*@``8T&``"Y4````00``+E8
+M```Q!0``N2P``#$%``"Y7```,08``+EL``$H!0``N7```2@&``"YF``!C@4`
+M`+F<``&.!@``N<P``8T%``"YT``!C08``+G@``&0!0``N>0``9`&``"Z9``!
+MD`4``+IH``&0!@``NH0``8T%``"ZB``!C08``+K(```!!```NM```9`%``"Z
+MU``!D`8``+KT``&-!0``NO@``8T&``"[#``!C04``+L0``&-!@``NR```9`%
+M``"[)``!D`8``+M@``&-!0``NV0``8T&``"[I``!D`4``+NH``&0!@``O`0`
+M`9`%``"\"``!D`8``+P\``&0!0``O$```9`&``"\8````00``+S\``&0!0``
+MO0```9`&``"]I``!C04``+VH``&-!@``O;@``9`%``"]O``!D`8``+XT``&-
+M!0``OC@``8T&``"^J``!D`4``+ZL``&0!@``OPP``8T%``"_$``!C08``,!(
+M```!!```P&```8T%``#`9``!C08``,$D```!!```P30```$$``#!<````00`
+M`,)4``&-!0``PE@``8T&``#"U```RP4``,+8``#+!@``PS0``.8%``##.```
+MY@8``,-<``#F!0``PV```.8&``##B````@4``,.,```"!@``PY```.8%``##
+ME```Y@8``,/8``&-!0``P]P``8T&``#$!```2@4``,0(``!*!@``Q"```9`%
+M``#$)``!D`8``,3D``#B!0``Q.@``.(&``#$^``!D`4``,3\``&0!@``Q10`
+M`8T%``#%&``!C08``,4H``%!!0``Q2P``4$&``#%2```-P4``,5,```W!@``
+MQ8@``9`%``#%C``!D`8``,6P``&-!0``Q;0``8T&``#%\``!D`4``,7T``&0
+M!@``QAP``8T%``#&(``!C08``,9D``&0!0``QF@``9`&``#&F``!C04``,:<
+M``&-!@``QN```9`%``#&Y``!D`8``,<H``&0!0``QRP``9`&``#'7``!C04`
+M`,=@``&-!@``QW@``08%``#'?``!!@8``,>T``&0!0``Q[@``9`&``#'V```
+M`@4``,?<```"!@``Q_0``8T%``#'^``!C08``,@X``#F!0``R#P``.8&``#(
+M=``!C04``,AX``&-!@``R.```9`%``#(Y``!D`8``,E4``&0!0``R5@``9`&
+M``#)@``!D`4``,F$``&0!@``R:```8T%``#)I``!C08``,G<``&0!0``R>``
+M`9`&``#*"``!D`4``,H,``&0!@``RF```9`%``#*9``!D`8``,K$``&0!0``
+MRL@``9`&``#+@```)04``,N$```E!@``RZ````$$``#+J``!6P4``,NL``%;
+M!@``R\```8T%``#+Q``!C08``,P```&0!0``S`0``9`&``#,&```)04``,P<
+M```E!@``S%@``"4%``#,7```)08``,QX```!!```S(0``9`%``#,B``!D`8`
+M`,RD``%;!0``S*@``5L&``#,Q``!C04``,S(``&-!@``S0@``9`%``#-#``!
+MD`8``,T@```E!0``S20``"4&``#-<``!D`4``,UT``&0!@``S90``8T%``#-
+MF``!C08``,VH```!!```S;```9`%``#-M``!D`8``,W0``&-!0``S=0``8T&
+M``#.*```)04``,XL```E!@``SD@```$$``#.5``!D`4``,Y8``&0!@``SG@`
+M`5L%``#.?``!6P8``,Z@``&-!0``SJ0``8T&``#.Y``!D`4``,[H``&0!@``
+MSP0``"4%``#/"```)08``,]4``&0!0``SU@``9`&``#/?``!D`4``,^```&0
+M!@``SZ@``8T%``#/K``!C08``,_D```!!```S]P``-X%``#/[```W@8``-`L
+M```!!```T#0``18%``#0.``!%@8``-!P``&-!0``T'0``8T&``#0@````00`
+M`-"(```;!0``T(P``!L&``#0K``!-P4``-"P``$W!@``T/@``9`%``#0_``!
+MD`8``-$<``&-!0``T2```8T&``#1+``!-04``-$P``$U!@``T4```9`%``#1
+M1``!D`8``-%,``$U!0``T5```34&``#17``!C04``-%@``&-!@``T;````$$
+M``#1P````00``-',``&0!0``T=```9`&``#1\``!C04``-'T``&-!@``TDP`
+M`9`%``#24``!D`8``-)L``&-!0``TG```8T&``#2Z``!D`4``-+L``&0!@``
+MTP@``8T%``#3#``!C08``-.<```!!```TZ0```$%``#3J````08``-.T```!
+M!```T\````$$``#3O````04``-/$```!!@``T\@```$%``#3S````08``-/8
+M```!!```U`@``9`%``#4#``!D`8``-1<```!!```U&P```$$``#4>````00`
+M`-1T``"Z!0``U'P``+H&``#4A````00``-2```$(!0``U(@``0@&``#4C```
+M[04``-20``#M!@``U)0``2D%``#4F``!*08``-3```&0!0``U,0``9`&``#4
+MZ``!C04``-3L``&-!@``U1```8T%``#5%``!C08``-5```&-!0``U40``8T&
+M``#57```2@4``-5@``!*!@``U9```9`%``#5E``!D`8``-6P``&-!0``U;0`
+M`8T&``#5X``!D`4``-7D``&0!@``U?P``8T%``#6```!C08``-9```&-!0``
+MUD0``8T&``#6I``!D`4``-:H``&0!@``UL@```$$``#6T``!D`8``-;T``&-
+M!0``UO@``8T&``#73``!D`4``-=0``&0!@``UVP```$$``#7=``!D`8``->4
+M``&-!0``UY@``8T&``#7R``!D`4``-?,``&0!@``U_```8T%``#7]``!C08`
+M`-BT``&0!0``V+@``9`&``#9-````00``-I,```!!```VGP```$$``#:G```
+M_04``-J@``#]!@``VM@```$$``#:\``!D`4``/E(``&0!0``^2@``9`%``#:
+M]``!D`8``-LP```!!```VS@``9`%``#;/``!D`8``-N@``&0!0``VZ0``9`&
+M``#;Q``!D`4``-O(``&0!@``W#```98%``#<-``!E@8``-QP```!!```W(@`
+M``$$``#<E````00``-R@```!!```W*@```$$``#<T````00``-S@``&-!0``
+MW.0``8T&``#=,````00``-U````O!0``W40``"\&``#=:````P4``-T<```#
+M!0``W6P```,&``#=O````P4``-W````#!@``W<0``8T%``#=R``!C08``-X,
+M```!!0``WA````$&``#>(````@4``-XD```"!@``WB@``8T%``#>+``!C08`
+M`-YT```"!0``WG@```(&``#>?``!C04``-Z```&-!@``WL0```(%``#>R```
+M`@8``-[,``&-!0``WM```8T&``#?*``!D`4``-\L``&0!@``WU```8T%``#?
+M5``!C08``-^P``&-!0``W[0``8T&``#?\````00``-_X``&-!0``W_P``8T&
+M``#@5``!C04``.!8``&-!@``X(P```$%``#@D````08``."@``&0!0``X*0`
+M`9`&``#AK``!(04``.&$``$A!0``X;```2$&``#AY``!D`4``.'H``&0!@``
+MXA@``8T%``#B'``!C08``.(L```!!0``X=P```$%``#B,````08``.)````!
+M!0``XD0```$&``#B@``!C04``.*$``&-!@``XI@``8T%``#BG``!C08``.*L
+M``&0!0``XK```9`&``#B\````00``.,8``$U!0``XQP``34&``#C+``!D`4`
+M`.,P``&0!@``XT@``8T%``#C3``!C08``.-D``!*!0``XV@``$H&``#C>```
+M'04``.-\```=!@``XZ@```$$``#CQ``!C04``./(``&-!@``X^0``8T%``#C
+MZ``!C08``.04``$-!0``Y!@``0T&``#D0``!C04``.1$``&-!@``Y'0``9`%
+M``#D>``!D`8``.4<``!1!0``Y2```%$&``#E,``!D`4``.4T``&0!@``Y50`
+M`8T%``#E6``!C08``.5P``":!0``Y70``)H&``#EC```U`4``.60``#4!@``
+MY:@``#@%``#EK```.`8``.7(``&-!0``Y<P``8T&``#EW````00``.8P```!
+M!0``YU0```$%``#G1````04``.<@```!!0``YC0```$&``#F8``!5@4``.9D
+M``%6!@``YGP```$%``#F@````08``.:4``$U!0``YI@``34&``#FV``!5@4`
+M`.;<``%6!@``YQP```$$``#G0````00``.=0```!!```YV```8T%``#G9``!
+MC08``.>0``$U!0``YY0``34&``#GH````00``.>P``&-!0``Y[0``8T&``#G
+MW``!-04``.?@``$U!@``Y_0```$$``#H#````00``.@<``&-!0``Z"```8T&
+M``#H0``!C04``.A$``&-!@``Z%```34%``#H5``!-08``.AX```!!0``Z'P`
+M``$&``#HD``!-04``.B4``$U!@``Z*@``58%``#HK``!5@8``.C$```!!0``
+MZ,@```$&``#I*```_04``.DL``#]!@``Z5```9`%``#I5``!D`8``.H4``&-
+M!0``ZA@``8T&``#J*````04``.HL```!!@``ZE0```$$``#J7```'04``.I@
+M```=!@``ZG0``34%``#J>``!-08``.JT```!!```ZI0```$%``#J<````04`
+M`.J\```!!@``ZSP``9`%``#K0``!D`8``.M4``&-!0``ZU@``8T&``#K9``!
+M-04``.MH``$U!@``ZY```$H%``#KE```2@8``.PT``")!0``[#@``(D&``#L
+M:````@4``.QL```"!@``['@``"\%``#L?```+P8``.RX```O!0``[+P``"\&
+M``#LS````00``.S@```O!0``[.0``"\&``#M'``!C04``.T@``&-!@``[7@`
+M`9`%``#M?``!D`8``.W@``&0!0``[>0``9`&``#N%``!C04``.X8``&-!@``
+M[EP``9`%``#N8``!D`8``.YD``$U!0``[F@``34&``#NJ````04``.ZL```!
+M!@``[TP```$%``#O4````08``.]H``&0!0``[VP``9`&``#O>````04``.]\
+M```!!@``\````6\%``#P!``!;P8``/`<```!!0``\"````$&``#P.````@4`
+M`/`\```"!@``\$````$%``#P1````08``/"$```!!```\)```9`%``#PE``!
+MD`8``/"L``&-!0``\+```8T&``#P[````@4``/#P```"!@``\0````(%``#Q
+M!````@8``/$H```"!0``\2P```(&``#Q[````00``/(8```!!```\C@```$$
+M``#R7````00``/)X```!!```\I@```,%``#RG````P8``/+\```!!```\Q``
+M``$$``#S.````P4``/,\```#!@``\U0``"\%``#S6```+P8``/0X```#!0``
+M]#P```,&``#T0``!C04``/1$``&-!@``]0````$$``#U$````00``/48```!
+M!```];0```$$``#UO````00``/7,``&-!0``]=```8T&``#V9````00``/9X
+M``&0!0``]GP``9`&``#VJ``!C04``/:L``&-!@``]K@```$$``#VP````00`
+M`/;<``&0!0``]N```9`&``#V^``!C04``/;\``&-!@``]P@```$$``#W$``!
+MD`4``/<4``&0!@``]T@``8T%``#W3``!C08``/=@``#>!0``]V0``-X&``#W
+MC``!D`4``/>0``&0!@``]\0``8T%``#WR``!C08``/DD```!!```^6```9`%
+M``#Y9``!D`8``/F,``&-!0``^9```8T&``#Y[``!C04``/GP``&-!@``^EP`
+M``$$``#ZB````00``/JL```!!```^M````$$``#ZW````00``/KL```!!0``
+M^O````$&``#[````%`4``/L$```4!@``^V````$%``#[9````08``/O4```$
+M!0``^]@```0&``#[W``!(`4``/O@``$@!@``^^P```0%``#[\```!`8``/O\
+M```$!0``_`````0&``#\.```!`4``/P\```$!@``_&````$%``#\9````08`
+M`/QH```$!0``_&P```0&``#\K```!`4``/RP```$!@``_,@```0%``#\S```
+M!`8``/T\```$!0``_4````0&``#]3```!`4``/U0```$!@``_>P```0%``#]
+M\```!`8``/X\```$!0``_D````0&``#^7```!`4``/Y@```$!@``_F0```$%
+M``#^:````08``/YL```$!0``_G````0&``#^D````00``/]4```$!0``_U@`
+M``0&``#_B```!`4``/^,```$!@``_Y```8T%``#_E``!C08``0!P```$!0`!
+M`'0```0&``$`F````00``0"@```!!``!`+0``1,%``$`N``!$P8``0$@```!
+M!0`!`20```$&``$!Z````04``0'L```!!@`!`H0```$$``$"N````00``0+L
+M```!!``!`R````$$``$#-````@4``0,X```"!@`!`WP```$$``$#M````00`
+M`0/L```!!``!!#P```$%``$$0````08``030```"!0`!!-0```(&``$%I``!
+MC04``06H``&-!@`!!A```&P%``$&%```;`8``0:4```!!0`!!I@```$&``$&
+MO````04``0;````!!@`!!MP```$%``$&X````08``0<4```!!0`!!Q@```$&
+M``$'4````04``0=4```!!@`!".P```$$``$)$````00``0E$```!!``!"=``
+M``$$``$*'````00``0K<```!!0`!"N````$&``$*_````@4``0L````"!@`!
+M"V0```$$``$+Y``!C04``0OH``&-!@`!#$0``9`%``$,2``!D`8``0QT```!
+M!0`!#'@```$&``$,D````04``0R4```!!@`!#*P```$%``$,L````08``0S$
+M```!!0`!#,@```$&``$-2````@4``0U,```"!@`!#9@```(%``$-G````@8`
+M`0V@```"!0`!#:0```(&``$-_````00``0X4```"!0`!#A@```(&``$.2```
+M`@4``0Y,```"!@`!#F@```(%``$.;````@8``0YP```"!0`!#G0```(&``$/
+M0``!D`4``0]$``&0!@`!#W````$$``$/C````00``0^8```!!``!#Z@```$$
+M``$/Q``!C04``0_(``&-!@`!#_0```$%``$/^````08``1`H``#S!0`!$"P`
+M`/,&``$02``!!@4``1!,``$&!@`!$%P``9`%``$08``!D`8``1"(```!!``!
+M$*```08%``$0I``!!@8``1"P```!!``!$-```8T%``$0U``!C08``1#D``$&
+M!0`!$.@``08&``$1.``!9@4``1$\``%F!@`!$8@``14%``$1C``!%08``1'T
+M```!!``!$@0```$$``$2#````00``1(4```!!``!$B@```$$``$25``!(`4`
+M`1)8``$@!@`!$I0```$$``$2I```8@4``1*H``!B!@`!$Q```8T%``$3%``!
+MC08``1-(``&0!0`!$TP``9`&``$4%````04``108```!!@`!%.0```$$``$5
+M)``!C04``14H``&-!@`!%<```8T%``$5Q``!C08``178``&0!0`!%=P``9`&
+M``$6```!C04``18$``&-!@`!%C@``8T%``$6/``!C08``19P``&-!0`!%G0`
+M`8T&``$6F``!D`4``1:<``&0!@`!%MP``9`%``$6X``!D`8``1;\``&-!0`!
+M%P```8T&``$7+``!D`4``1<P``&0!@`!%T@``8T%``$73``!C08``1=P```!
+M!``!%X0``9`%``$7B``!D`8``1>@``&-!0`!%Z0``8T&``$7R````00``1?8
+M``&0!0`!%]P``9`&``$7]``!C04``1?X``&-!@`!&`0``2@%``$8"``!*`8`
+M`1@,```Q!0`!&!```#$&``$8(```OP4``1@D``"_!@`!&&@``8T%``$8;``!
+MC08``1B4``&0!0`!&)@``9`&``$8M``!C04``1BX``&-!@`!&-P```$$``$9
+M$````00``1E$```!!``!&7@```$$``$9K````00``1G,```!!0`!&=````$&
+M``$:%``!D`4``1H8``&0!@`!&CP``8T%``$:0``!C08``1IL``&-!0`!&G``
+M`8T&``$:L``!D`4``1JT``&0!@`!&S@``8T%``$;/``!C08``1M,``%U!0`!
+M&U```74&``$;5``!-04``1M8``$U!@`!&XP``8T%``$;D``!C08``1S4```!
+M!``!'/P```$$``$>S``!C04``1[0``&-!@`!'[P``8T%``$?P``!C08``1_0
+M``&-!0`!']0``8T&``$?^``!D`4``1_\``&0!@`!("```"\%``$@)```+P8`
+M`2!8```"!0`!(%P```(&``$@B````@4``2",```"!@`!(+@```(%``$@O```
+M`@8``2#H```"!0`!(.P```(&``$A7```L@4``2%@``"R!@`!(<0```(%``$A
+MR````@8``2',``#F!0`!(=```.8&``$B2````@4``2),```"!@`!(HP```(%
+M``$BD````@8``2,@``#-!0`!(R0``,T&``$C.````00``2-4```F!0`!(U@`
+M`"8&``$C<``!@04``2-T``&!!@`!(X@``9`%``$CC``!D`8``2.P```!!0`!
+M([0```$&``$CS``!BP4``2/0``&+!@`!(^0```$$``$C[``!D`4``2/P``&0
+M!@`!)"@```$%``$D+````08``20X```:!0`!)"0``!H%``$D%```&@4``20\
+M```:!@`!)%````$$``$D9``!D`4``21H``&0!@`!)(```8T%``$DA``!C08`
+M`228``&-!0`!))P``8T&``$DJ```0P4``22L``!#!@`!).0```$$``$E1```
+M`00``25D```!!``!)@```8H%``$F!``!B@8``28D```!!``!)C0``9`%``$F
+M.``!D`8``2:(```!!``!)I@``8H%``$FG``!B@8``2;```&*!0`!)L0``8H&
+M``$F\``!B@4``2;T``&*!@`!)QP``8H%``$G(``!B@8``2>D```"!0`!)Z@`
+M``(&``$GK````@4``2>P```"!@`!*`@``7@%``$H#``!>`8``2B<``&-!0`!
+M**```8T&``$HK``!-04``2BP``$U!@`!*+P``$,%``$HP```0P8``2D$``&*
+M!0`!*0@``8H&``$I*``!+P4``2DL``$O!@`!*7P```$$``$I>```Q`4``2F`
+M``#$!@`!*:0```$$``$IH```I04``2FH``"E!@`!*<@```$$``$IQ``!B`4`
+M`2G,``&(!@`!*=0``6T%``$IV``!;08``2GT``$:!0`!*?@``1H&``$J$``!
+MB@4``2H4``&*!@`!*G0```$$``$J<````04``2I\```!!@`!*H@```$$``$J
+MG```@`4``2J@``"`!@`!*O```'$%``$J]```<08``2L4``!$!0`!*P@``$0%
+M``$K&```1`8``2LL``&!!0`!*S```8$&``$K0``!'04``2M$``$=!@`!*U``
+M`(,%``$K5```@P8``2N@```"!0`!*Z0```(&``$KN````@4``2N\```"!@`!
+M*^0``9`%``$KZ``!D`8``2OL``&-!0`!*_```8T&``$L5``!C04``2Q8``&-
+M!@`!+%P``9`%``$L8``!D`8``2S,``$U!0`!+-```34&``$M+````00``2Y0
+M```!!``!,#0```$$``$R"````00``3+H``"K!0`!,NP``*L&``$S&````00`
+M`3,4``&,!0`!,QP``8P&``$S$````04``3,@```!!@`!,TP``8T%``$S4``!
+MC08``3.@``"K!0`!,Z0``*L&``$ST``!C04``3/4``&-!@`!-#P```$$``$T
+M1```,04``308```Q!0`!-$@``#$&``$T6``!*`4``31<``$H!@`!-(0``)$%
+M``$TB```D08``32X``&-!0`!-+P``8T&``$TS``!D`4``330``&0!@`!-5@`
+M`9`%``$U7``!D`8``35X``&-!0`!-7P``8T&``$UO````00``37$``&0!0`!
+M-<@``9`&``$UZ``!C04``37L``&-!@`!-@```8T%``$V!``!C08``384``&0
+M!0`!-A@``9`&``$V5``!C04``398``&-!@`!-NP``8T%``$V\``!C08``3=\
+M``&-!0`!-X```8T&``$WJ```2@4``3>L``!*!@`!-\0``9`%``$WR``!D`8`
+M`3@0``&0!0`!.!0``9`&``$X.``!C04``3@\``&-!@`!.'@``9`%``$X?``!
+MD`8``3BD``&-!0`!.*@``8T&``$X[``!D`4``3CP``&0!@`!.2```8T%``$Y
+M)``!C08``3EH``&0!0`!.6P``9`&``$YN``!D`4``3F\``&0!@`!.@0``8T%
+M``$Z"``!C08``3H@``#5!0`!.B0``-4&``$Z4``!D`4``3I4``&0!@`!.J@`
+M`9`%``$ZK``!D`8``3LH``&0!0`!.RP``9`&``$[3````00``3NL``&0!0`!
+M.[```9`&``$\3``!D`4``3Q0``&0!@`!/0P``8T%``$]$``!C08``3T@``&0
+M!0`!/20``9`&``$^"``!C04``3X,``&-!@`!/AP``9`%``$^(``!D`8``3Z\
+M``&0!0`!/L```9`&``$_/``!D`4``3]```&0!@`!/UP``8T%``$_8``!C08`
+M`4$D```!!``!03P``8T%``%!0``!C08``4(````"!0`!0@0```(&``%"&```
+M`00``4(T```!!``!0FP```$$``%"K````00``4*X```!!``!0L````$$``%#
+MS``!C04``4/0``&-!@`!1%```24%``%$5``!)08``440```!!``!13```8T%
+M``%%-``!C08``47\```!!``!1A```8T%``%&%``!C08``4:0``$E!0`!1I0`
+M`24&``%&\```Y@4``4;T``#F!@`!1Q@``.8%``%''```Y@8``4=0``#F!0`!
+M1U0``.8&``%'A```Y@4``4>(``#F!@`!1\```8T%``%'Q``!C08``4C8``&0
+M!0`!2-P``9`&``%(]``!C04``4CX``&-!@`!26```9`%``%)9``!D`8``4F$
+M```"!0`!28@```(&``%)H``!C04``4FD``&-!@`!2>0``.8%``%)Z```Y@8`
+M`4H@``&-!0`!2B0``8T&``%*C``!D`4``4J0``&0!@`!2P```9`%``%+!``!
+MD`8``4LT``&0!0`!2S@``9`&``%+6``!C04``4M<``&-!@`!3`@``9`%``%,
+M#``!D`8``4PT```!!``!3$P``8T%``%,4``!C08``4R,``&0!0`!3)```9`&
+M``%,N``!D`4``4R\``&0!@`!31```9`%``%-%``!D`8``4UT``&0!0`!37@`
+M`9`&``%.&``!D`4``4X<``&0!@`!3D```9`%``%.1``!D`8``4YL``&-!0`!
+M3G```8T&``%.J````00``4Z@```.!0`!3K````X&``%.^```)04``4[\```E
+M!@`!3QP```$$``%/)``!6P4``4\H``%;!@`!3SP``8T%``%/0``!C08``4]\
+M``&0!0`!3X```9`&``%/E```)04``4^8```E!@`!3]0``"4%``%/V```)08`
+M`4_T```!!``!4````9`%``%0!``!D`8``5`@``%;!0`!4"0``5L&``%00``!
+MC04``5!$``&-!@`!4(0``9`%``%0B``!D`8``5"<```E!0`!4*```"4&``%0
+M[``!D`4``5#P``&0!@`!41```8T%``%1%``!C08``5$D```!!``!42P``9`%
+M``%1,``!D`8``5%,``&-!0`!45```8T&``%1I```)04``5&H```E!@`!4<0`
+M``$$``%1T``!D`4``5'4``&0!@`!4?0``5L%``%1^``!6P8``5(<``&-!0`!
+M4B```8T&``%28``!D`4``5)D``&0!@`!4H```"4%``%2A```)08``5+8``&-
+M!0`!4MP``8T&``%3=``!6P4``5-X``%;!@`!4\````$$``%3^````00``50\
+M``&-!0`!5$```8T&``%4E```)`4``528```D!@`!5/0``!8%``%4^```%@8`
+M`540``&-!0`!510``8T&``%50``!C04``55$``&-!@`!550``9`%``%56``!
+MD`8``58```&-!0`!5@0``8T&``%61``!D`4``59(``&0!@`!5F````$$``%6
+M;``!C04``59P``&-!@`!5K```9`%``%6M``!D`8``5;D```!!``!5NP``9`%
+M``%6\``!D`8``5<0``&-!0`!5Q0``8T&``%7M``!C04``5>X``&-!@`!5\@`
+M`9`%``%7S``!D`8``5@$``&-!0`!6`@``8T&``%80```%@4``5A$```6!@`!
+M6%P``9`%``%88``!D`8``5B```&-!0`!6(0``8T&``%8_``!C04``5D```&-
+M!@`!67P``8T%``%9@``!C08``5FL```"!0`!6;````(&``%9P````@4``5G$
+M```"!@`!6>@```(%``%9[````@8``5HH```"!0`!6BP```(&``%:=````00`
+M`5I\```!!``!6H0```$$``%:I````00``5K````!!``!6L@```$$``%:T```
+M`00``5L$```!!``!6QP``9`%``%;(``!D`8``5LL```!!``!6S0```$$``%;
+M4````00``5ML```!!``!6W0```$$``%;G````00``5O````!!``!6]P```$$
+M``%;]````00``5O\```!!``!7`0```$$``%<$````00``5P@```!!``!7$@`
+M``$$``%<5````00``5Q,``"'!0`!7%P``(<&``%<A````@4``5R(```"!@`!
+M7)P```$$``%<I````00``5RL```!!``!7+0```$$``%<Q````00``5S0``$6
+M!0`!7-0``18&``%=*````@4``5TL```"!@`!74P```$$``%=5````00``5U\
+M```!!``!790```$$``%=H``!D`4``5VD``&0!@`!7;@```$$``%=S````00`
+M`5WD``&-!0`!7>@``8T&``%=]````00``5X````!!``!7AP```$$``%>,```
+M`00``5Y@```!!``!7H0```$$``%>G````@4``5Z@```"!@`!7K```)X%``%>
+MM```G@8``5[````!!``!7N0```$$``%>^````00``5\$```;!0`!7P@``!L&
+M``%?.``!-P4``5\\``$W!@`!7X0``9`%``%?B``!D`8``5^H``&-!0`!7ZP`
+M`8T&``%?N``!-04``5^\``$U!@`!7\P``9`%``%?T``!D`8``5_8``$U!0`!
+M7]P``34&``%?Z``!C04``5_L``&-!@`!8#P```$$``%@3````00``6!8``&0
+M!0`!8%P``9`&``%@?``!C04``6"```&-!@`!8-@``9`%``%@W``!D`8``6#X
+M``&-!0`!8/P``8T&``%A?``!D`4``6&```&0!@`!89P``8T%``%AH``!C08`
+M`6(X```!!``!8D````$%``%B1````08``6)0```!!``!8EP```$$``%B6```
+M`04``6)@```!!@`!8F0```$%``%B:````08``6)T```!!``!8J0``9`%``%B
+MJ``!D`8``6,,```!!``!8QP```$$``%C0````00``6-8```!!``!8V```"P%
+M``%C9```+`8``6.4```!!``!8Z````$$``%CG```J04``6.D``"I!@`!8ZP`
+M``$$``%CJ``!2P4``6.P``%+!@`!8[@```$$``%CM```SP4``6.\``#/!@`!
+M8\0```$$``%CP```%04``6/(```5!@`!8]````$$``%CS``!6`4``6/4``%8
+M!@`!8]P```$$``%CV```U@4``6.```#6!0`!8^```-8&``%CY```X04``6.8
+M``#A!0`!8^@``.$&``%C[``!*04``6.0``$I!0`!8W```2D%``%C\``!*08`
+M`608``&0!0`!9!P``9`&``%D0``!C04``61$``&-!@`!9&@``8T%``%D;``!
+MC08``628``&-!0`!9)P``8T&``%DM```2@4``62X``!*!@`!9.@``9`%``%D
+M[``!D`8``64(``&-!0`!90P``8T&``%E&```,`4``64<```P!@`!92P``-H%
+M``%E,```V@8``65<``&0!0`!96```9`&``%E>``!C04``65\``&-!@`!98@`
+M`((%``%EC```@@8``67,``&-!0`!9=```8T&``%F,``!D`4``68T``&0!@`!
+M9E0```$$``%F7``!D`8``6:```&-!0`!9H0``8T&``%FV``!D`4``6;<``&0
+M!@`!9O@```$$``%G```!D`8``6<@``&-!0`!9R0``8T&``%G9``!D`4``6=H
+M``&0!@`!9^```8T%``%GY``!C08``6@8``&-!0`!:!P``8T&``%H,``!D`4`
+M`6@T``&0!@`!:%0```$$``%H7``!D`4``6A@``&0!@`!:'P``8T%``%H@``!
+MC08``6E```&0!0`!:40``9`&``%J-````00``6J(``"/!0`!:HP``(\&``%J
+MF````00``6JX```!!``!:U@```$$``%KB````00``6NL``&!!0`!:[```8$&
+M``%KR```_04``6O,``#]!@`!;`0```$$``%L*``!D`4``908``&0!0`!D/0`
+M`9`%``&)?``!D`4``75T``&0!0`!;*```9`%``%L+``!D`8``6Q```#(!0`!
+MAZ```,@%``%L1```R`8``6Q4``#:!0`!;%@``-H&``%LY```#`4``6SH```,
+M!@`!;0```9`%``%M!``!D`8``6TD``&0!0`!;2@``9`&``%MD```704``6V4
+M``!=!@`!;:```$P%``%MI```3`8``6VT``&+!0`!;;@``8L&``%N"````00`
+M`6X8```!!``!;C````$$``%N2````00``6Y4```!!``!;F````$$``%N=```
+M`00``6Z(```!!``!;J@``8T%``%NK``!C08``6Z\```"!0`!;L````(&``%N
+MQ``!C04``6[(``&-!@`!;LP``34%``%NT``!-08``6\T```"!0`!;S@```(&
+M``%OC``!C04``6^0``&-!@`!;ZP``34%``%OL``!-08``7`$``$1!0`!<`@`
+M`1$&``%P,``!C04``7`T``&-!@`!<'P```$$``%PW````00``7#L``&-!0`!
+M</```8T&``%P^``!D`4``7$```&0!@`!<1P``8T%``%Q(``!C08``7%\``&-
+M!0`!<8```8T&``%QE``!C04``7&8``&-!@`!<?@``9`%``%Q_``!D`8``7(4
+M``&-!0`!<A@``8T&``%R+```604``7(P``!9!@`!<EP``4`%``%R8``!0`8`
+M`7+T``"5!0`!<O@``)4&``%S"``!!04``7,,``$%!@`!<QP``4,%``%S(``!
+M0P8``7-(``&-!0`!<TP``8T&``%SA``!C04``7.(``&-!@`!<\P``"0%``%S
+MT```)`8``70P``&0!0`!=#0``9`&``%T_```KP4``74```"O!@`!=1P``#,%
+M``%U(```,P8``74P``!<!0`!=30``%P&``%UD``!D`4``764``&0!@`!=;@`
+M`8T%``%UO``!C08``77,``&0!0`!==```9`&``%V$````00``78\``&-!0`!
+M=D```8T&``%V>``!-04``79\``$U!@`!=HP``9`%``%VD``!D`8``7:H``&-
+M!0`!=JP``8T&``%VN``!D`4``7:\``&0!@`!=L0```$$``%VP``!-04``7;(
+M``$U!@`!=P0``8T%``%W"``!C08``7<8``&0!0`!=QP``9`&``%WH````00`
+M`7>L``!.!0`!=[```$X&``%WQ``!C04``7?(``&-!@`!>````(H%``%X!```
+MB@8``7A0``&-!0`!>%0``8T&``%X9``!D`4``7AH``&0!@`!>)@``+<%``%X
+MG```MP8``7BT``!*!0`!>+@``$H&``%XR```F04``7C,``"9!@`!>-P``9`%
+M``%XX``!D`8``7D```&-!0`!>00``8T&``%Y1``!C04``7E(``&-!@`!>6P`
+M`8T%``%Y<``!C08``7F4``$3!0`!>9@``1,&``%ZT``!C04``7K4``&-!@`!
+M>P0``$(%``%["```0@8``7L@```M!0`!>R0``"T&``%[/```1@4``7M```!&
+M!@`!>UP``8T%``%[8``!C08``7O4``!)!0`!>]@``$D&``%[[``!604``7OP
+M``%9!@`!>_P```$$``%\;``!D`4``7QP``&0!@`!?)P``8T%``%\H``!C08`
+M`7S(``&0!0`!?,P``9`&``%\W````00``7SD``&0!0`!?.@``9`&``%]```!
+MC04``7T$``&-!@`!?7@``/T%``%]?```_08``7V8``&8!0`!?9P``9@&``%]
+MS````00``7W4```!!``!?>```8T%``%]Y``!C08``7WT``&0!0`!??@``9`&
+M``%]_``!-04``7X```$U!@`!?D```*\%``%^1```KP8``7Y<``&0!0`!?F``
+M`9`&``%^H````00``7[(``$U!0`!?LP``34&``%^X```604``7[D``!9!@`!
+M?P```8T%``%_!``!C08``7]T``"5!0`!?W@``)4&``%_B``!!04``7^,``$%
+M!@`!?YP``9`%``%_H``!D`8``7^X``&-!0`!?[P``8T&``&`&```204``8`<
+M``!)!@`!@#```5D%``&`-``!608``8"(``&0!0`!@(P``9`&``&`Q````00`
+M`8#@```!!``!@/```8T%``&`]``!C08``8$$``&0!0`!@0@``9`&``&!&```
+M`00``8$H``&-!0`!@2P``8T&``&!/``!D`4``8%```&0!@`!@6````$$``&!
+M=``!C04``8%X``&-!@`!@:````$%``&!I````08``8'0``&!!0`!@=0``8$&
+M``&![````04``8'P```!!@`!@CP```$%``&"0````08``8)<``&!!0`!@F``
+M`8$&``&">````04``8)\```!!@`!@N0```$$``&#.````00``8-8```!!``!
+M@WP```$$``&#S````00``80(``&0!0`!A`P``9`&``&$0``!C04``81$``&-
+M!@`!A'0``34%``&$>``!-08``82$```!!``!A)@``8T%``&$G``!C08``82H
+M``$U!0`!A*P``34&``&$P``!C04``83$``&-!@`!A4@``/T%``&%3```_08`
+M`868``&0!0`!A9P``9`&``&%Q``!D`4``87(``&0!@`!AB0``8T%``&&*``!
+MC08``8:4```!!``!AL0```$$``&&V``!D`4``8;<``&0!@`!AP0``8T%``&'
+M"``!C08``8=T```!!``!AZ@``9`%``&'K``!D`8``8?$``&-!0`!A\@``8T&
+M``&(!```R`4``8@(``#(!@`!B"@``9`%``&(+``!D`8``8A$``&-!0`!B$@`
+M`8T&``&(R````04``8BT```!!0`!B,P```$&``&(V````00``8F,``&0!0`!
+MB9```9`&``&)I``!C04``8FH``&-!@`!B;0``34%``&)N``!-08``8G@``!*
+M!0`!B>0``$H&``&*2``!@04``8I,``&!!@`!BF0``9`%``&*:``!D`8``8J<
+M``&0!0`!BJ```9`&``&+2``!D`4``8M,``&0!@`!BV0``&<%``&+:```9P8`
+M`8N````!!0`!BX0```$&``&,#``!C04``8P0``&-!@`!C#```9`%``&,-``!
+MD`8``8Q\``&-!0`!C(```8T&``&-;```+P4``8UP```O!@`!C=@```$$``&-
+MZ````00``8WP```!!``!CH@```$$``&.D````00``8Z@``&0!0`!CJ0``9`&
+M``&.M````00``8Z\``&0!0`!CL```9`&``&.V``!C04``8[<``&-!@`!CO0`
+M`8T%``&.^``!C08``9!<```!!``!D&P```$$``&0A````00``9#\``&0!0`!
+MD0```9`&``&1,``!C04``9$T``&-!@`!D4````$$``&13````00``9%@``&0
+M!0`!D60``9`&``&1G``!C04``9&@``&-!@`!D;0```X%``&1N```#@8``9(D
+M```!!``!DF0``9`%``&2:``!D`8``9*0``&-!0`!DI0``8T&``&4%````00`
+M`90@``#"!0`!E"0``,(&``&43``!D`4``910``&0!@`!E'@``8T%``&4?``!
+MC08``928```!!``!E+```9`%``&4M``!D`8``93<``&-!0`!E.```8T&``&5
+M;``!D`4``95P``&0!@`!E:0``8T%``&5J``!C08``97,``&-!0`!E=```8T&
+M``&67````@4``99@```"!@`!EG0```(%``&6>````@8``9:X```!!``!EN``
+M``$$``&6Z````00``9=P``&0!0`!EW0``9`&``&7L``!C04``9>T``&-!@`!
+MF.P```$$``&9'````00``9DT```!!``!F7P```$$``&9[````00``9IP```!
+M!``!FK0```$$``&:U````00``9LH```!!``!FUP```$$``&;D````00``9O@
+M``&0!0`!F^0``9`&``&<#``!C04``9P0``&-!@`!GB````$$``&>E``!D`4`
+M`9Z8``&0!@`!GL```8T%``&>Q``!C08``9],``!9!0`!GU```%D&``&?F``!
+M(`4``9^<``$@!@`!G^P```(%``&?\````@8``:`,```!!0`!H!````$&``&A
+M0````00``:%<```!!0`!H6````$&``&A=``!C04``:%X``&-!@`!H@0``8T%
+M``&B"``!C08``:+T``&-!0`!HO@``8T&``&CM```%`4``:.X```4!@`!I!0`
+M``$%``&D&````08``:1````!!``!I$@```$$``&DR````04``:3,```!!@`!
+MI/P```$$``&E!````00``:4@```!!``!I4```1,%``&E1``!$P8``:5X```!
+M!``!I8P```$%``&ED````08``:=8```!!``!I[@```$%``&GO````08``:BL
+M```!!``!J=P```(%``&IX````@8``:GT```!!0`!J?@```$&``&JS```Y@4`
+M`:K0``#F!@`!JR````$$``&K3````00``:M<```!!``!JW0```$$``&LI``!
+M504``:RH``%5!@`!KG0``54%``&N>``!508``:[$```!!``!KPP```$%``&O
+M$````08``:_H```!!``!L-@```(%``&PW````@8``;$0```!!``!L1@```(%
+M``&Q'````@8``;&8```!!0`!L9P```$&``&QS````00``;'L```!!0`!L?``
+M``$&``&RQ``!C04``;+(``&-!@`!LR@``9`%``&S+``!D`8``;-T```!!``!
+MLYP```$%``&SH````08``;/0```!!0`!L]0```$&``&S[````04``;/P```!
+M!@`!M`@```$%``&T#````08``;2<```!!``!M)@```(%``&TH````@8``;24
+M```"!0`!M*0```(&``&U6````00``;9D```!!0`!MF@```$&``&VV````00`
+M`;;@```!!``!MSP``"\%``&W0```+P8``;@X```!!``!N$P```$$``&X:```
+M6@4``;AL``!:!@`!N(0``&8%``&XB```9@8``;B0``&-!0`!N)0``8T&``&Y
+M!```6@4``;D(``!:!@`!N6@``&8%``&Y;```9@8``;DH``&-!0`!N8```8T&
+M``&Z,``!D`4``;HT``&0!@`!NF@```$$``&ZE``!C04``;J8``&-!@`!NL@`
+M`9`%``&ZS``!D`8``;M,``#5!0`!NU```-4&``&[9``!D`4``;MH``&0!@`!
+MNY0```$$``&[Q``!C04``;O(``&-!@`!N]@``-4%``&[W```U08``;P\``%F
+M!0`!O$```68&``&\D``!%04``;R4``$5!@`!O0@```$$``&](````00``;TT
+M```!!``!O4P```$$``&]=````00``;W````!!``!O<@```$$``&]]``!(`4`
+M`;WX``$@!@`!OC0```$$``&^3```5@4``;Y0``!6!@`!OKP``8T%``&^P``!
+MC08``;[T``&0!0`!OO@``9`&``&_Q````04``;_(```!!@`!P*````$$``'`
+MX``!C04``<#D``&-!@`!P8P``8T%``'!D``!C08``<'```&-!0`!P<0``8T&
+M``'"'````00``<(X```!!``!PN0```$$``'"[````00``<+\``$H!0`!PP``
+M`2@&``'#!```,04``<,(```Q!@`!PQ@``+\%``'#'```OP8``<,X``&-!0`!
+MPSP``8T&``'#=``!C04``<-X``&-!@`!P]P``9`%``'#X``!D`8``<08```!
+M!``!Q$P```$$``'$@````00``<2T```!!``!Q.@```$$``'%"````04``<4,
+M```!!@`!Q5@``9`%``'%7``!D`8``<6```&-!0`!Q80``8T&``'%L``!C04`
+M`<6T``&-!@`!Q?0``9`%``'%^``!D`8``<:(``&-!0`!QHP``8T&``'&G``!
+MF`4``<:@``&8!@`!QJ0``34%``'&J``!-08``<;4``&8!0`!QM@``9@&``''
+M,``!D`4``<<T``&0!@`!QS@``8T%``''/``!C08``<>H``&0!0`!QZP``9`&
+M``''R``!C04``<?,``&-!@`!Q]@``34%``''W``!-08``<@4``&8!0`!R!@`
+M`9@&``'((````00``<@<``$U!0`!R"0``34&``'(4``!D`4``<A4``&0!@`!
+MR'0``8T%``'(>``!C08``<B,``&-!0`!R)```8T&``'+F````00``<O8```!
+M!``!S0````$$``'-'````00``<TL```!!``!S4````$$``'-5````00``<W8
+M```!!``!SK0``8(%``'.N``!@@8``<[,``&-!0`!SM```8T&``'/2``!C04`
+M`<],``&-!@`!SUP``8(%``'/8``!@@8``=`(```!!``!T$0``8(%``'02``!
+M@@8``="D``$@!0`!T*@``2`&``'1"````00``=&D``&-!0`!T:@``8T&``'1
+MQ```,`4``='(```P!@`!T>0```$$``'2-```@@4``=(X``""!@`!TD```8T%
+M``'23``!C08``=*\```"!0`!TL````(&``'2Y``!D`4``=+H``&0!@`!TR0`
+M`8T%``'3*``!C08``=/\```!!``!U!P```$$``'4)````@4``=0H```"!@`!
+MU#P```(%``'40````@8``=14```"!0`!U%@```(&``'4;````@4``=1P```"
+M!@`!U(0```(%``'4B````@8``=2<```"!0`!U*````(&``'4O``!D`4``=3`
+M``&0!@`!U0```8T%``'5!``!C08``=9,```!!``!UE0``9`%``'66``!D`8`
+M`=9T``&-!0`!UG@``8T&``'6I````00``=:X```!!``!UL````(%``'6Q```
+M`@8``=;@``&0!0`!UN0``9`&``'7%``!C04``=<8``&-!@`!UT````$$``'7
+M4````00``==8```"!0`!UUP```(&``'7C``!D`4``=>0``&0!@`!U]```8T%
+M``'7U``!C08``=?X```!!``!V!@```$$``'8(````@4``=@D```"!@`!V'P`
+M`9`%``'8@``!D`8``=BT``&-!0`!V+@``8T&``'8W````00``=C\```!!``!
+MV1@``'$%``'9'```<08``=DH``%Q!0`!V2P``7$&``'91```V04``=E(``#9
+M!@`!V50```$$``'9<``!<04``=ET``%Q!@`!V8P``-D%``'9D```V08``=E\
+M``&-!0`!V:0``8T&``'9P```,`4``=G$```P!@`!V=````$$``'9V``!<08`
+M`=GL``#9!0`!V?```-D&``':?````00``=J@```!!``!VK@``8T%``':O``!
+MC08``=K\``&"!0`!VP```8(&``';<````00``=N,```!!``!VZ@```$$``';
+MV```G@4``=O<``">!@`!V_@```$$``'<(```G@4``=PD``">!@`!W$@```$$
+M``'=0``!'@4``=Q0``$>!@`!W(```)X%``'<A```G@8``=RH``">!0`!W*P`
+M`)X&``'=#````00``=TH```!!``!W5P```$$``'<"``!'@4``=UD``$>!@`!
+MW9@``)X%``'=G```G@8``=W@```!!0`!W>0```$&``'>(````00``=Y4``">
+M!0`!WE@``)X&``'>I``!<04``=ZH``%Q!@`!WKP``-D%``'>P```V08``=[,
+M```!!0`!YD@```$%``'AI````04``=^X```!!0`!WM````$&``'>W````00`
+M`=\$``">!0`!WP@``)X&``'?4````00``=]<``">!0`!WV```)X&``'?O``!
+M<04``=_```%Q!@`!W]@``-D%``'?W```V08``=_H```!!0`!W^P```$&``'@
+M```!C04``>`$``&-!@`!X"````$$``'F>````04``>`H```!!@`!X#0``7$%
+M``'@.``!<08``>!,``#9!0`!X%```-D&``'@H``!C04``>"D``&-!@`!X,0`
+M`8(%``'@R``!@@8``>#P``&0!0`!X/0``9`&``'AA````04``>&(```!!@`!
+MX:@```$%``'AK````08``>&X```!!0`!X;P```$&``'B-````00``>;8```!
+M!0`!XC@```$&``'B=````04``>)X```!!@`!XH0```$%``'BB````08``>+$
+M```!!``!XP0```$$``'C&````00``>,L```!!``!XT0``)X%``'C2```G@8`
+M`>-\``&0!0`!XX```9`&``'CV````00``>20```!!0`!Y)0```$&``'DM```
+M`04``>2X```!!@`!Y.```8(%``'DY``!@@8``>3T``&0!0`!Y/@``9`&``'E
+M3``!C04``>50``&-!@`!Y8```8T%``'EA``!C08``>6@```!!``!YH0```$$
+M``'F@````04``>:(```!!@`!YMP```$$``'B,````04``>;@```!!@`!YR``
+M``$%``'G)````08``><P```!!0`!YS0```$&``'G]````@4``>?X```"!@`!
+MY_P``8T%``'H```!C08``>@$``$U!0`!Z`@``34&``'H:````@4``>AL```"
+M!@`!Z'```8T%``'H=``!C08``>AX``$U!0`!Z'P``34&``'HQ````@4``>C(
+M```"!@`!Z,P``8T%``'HT``!C08``>C4``$U!0`!Z-@``34&``'IA```B04`
+M`>F(``")!@`!Z;@```(%``'IO````@8``>G(```O!0`!Z<P``"\&``'I]``!
+MD`4``>GX``&0!@`!ZB0``8T%``'J*``!C08``>HT```!!``!ZE@``"\%``'J
+M7```+P8``>IL```!!``!ZGP``"\%``'J@```+P8``>JX``&-!0`!ZKP``8T&
+M``'K'````@4``>L@```"!@`!Z]0```$$``'L#````00``>PP```!!``![%0`
+M``$$``'L=````00``>R@```!!``![-0```$$``'M&````@4``>T<```"!@`!
+M[70``'<%``'M>```=P8``>V@```"!0`![:0```(&``'MJ``!C04``>VL``&-
+M!@`![;```34%``'MM``!-08``>X,```"!0`![A````(&``'N%``!C04``>X8
+M``&-!@`![AP``34%``'N(``!-08``>YD```"!0`![F@```(&``'N;``!C04`
+M`>YP``&-!@`![G0``34%``'N>``!-08``>[4```"!0`![M@```(&``'NW``!
+MC04``>[@``&-!@`![N0``34%``'NZ``!-08``>]$```"!0`![T@```(&``'O
+MI```=P4``>^H``!W!@`![]P``'<%``'OX```=P8``?`X```"!0`!\#P```(&
+M``'P0``!C04``?!$``&-!@`!\$@``34%``'P3``!-08``?"D```"!0`!\*@`
+M``(&``'P]```=P4``?#X``!W!@`!\5@``'<%``'Q7```=P8``?&<```"!0`!
+M\:````(&``'QI``!C04``?&H``&-!@`!\:P``34%``'QL``!-08``?-H```!
+M!``!\Z````$$``'SM````00``?/<``$@!0`!\^```2`&``'T.````04``?0\
+M```!!@`!]A````$%``'V%````08``?>@```!!0`!]Z0```$&``'WR``!504`
+M`??,``%5!@`!]^@```$%``'W[````08``?@@```!!0`!^"0```$&``'X6```
+M`04``?A<```!!@`!^;0``54%``'YN``!508``?GL``"#!0`!^?```(,&``'Z
+M#```@P4``?H0``"#!@`!^D````(%``'Z1````@8``?I4```"!0`!^E@```(&
+M``'Z?````@4``?J````"!@`!^J@``,T%``'ZK```S08``?K(``#-!0`!^LP`
+M`,T&``'ZZ````00``?KP```!!0`!^O0```$&``'Z_````04``?L````!!@`!
+M^P@```$%``'[#````08``?L4```!!0`!^Q@```$&``'[(````04``?LD```!
+M!@`!^RP```$%``'[,````08``?LX```!!0`!^SP```$&``'[1````04``?M(
+M```!!@`!^Z0```(%``'[J````@8``?NL``&-!0`!^[```8T&``'[M``!-04`
+M`?NX``$U!@`!_!@```(%``'\'````@8``?P@``&-!0`!_"0``8T&``'\*``!
+M-04``?PL``$U!@`!_'0```(%``'\>````@8``?Q\``&-!0`!_(```8T&``'\
+MA``!-04``?R(``$U!@`!_9@```$$``'^!```+P4``?X(```O!@`!_AP``9`%
+M``'^(``!D`8``?Y,``&-!0`!_E```8T&``'^7````00``?[T```O!0`!_O@`
+M`"\&``'_"````00``?]X```O!0`!_WP``"\&``'_C````00``?_T```O!0`!
+M__@``"\&``(`"````00``@!H```O!0`"`&P``"\&``(`K``!C04``@"P``&-
+M!@`"`0P```(%``(!$````@8``@'D```!!``"`B@```$$``("3````00``@)P
+M```!!``"`I@```$$``("L````00``@+4```"!0`"`M@```(&``(#`````@4`
+M`@,$```"!@`"`SP```(%``(#0````@8``@-X```"!0`"`WP```(&``(#R```
+M=P4``@/,``!W!@`"!.@``'<%``($[```=P8``@4$```!!``"!1P``'<%``(%
+M(```=P8``@64``!W!0`"!9@``'<&``(&$```=P4``@84``!W!@`"!H0```(%
+M``(&B````@8``@;D``!W!0`"!N@``'<&``('!```=P4``@<(``!W!@`"!U@`
+M`'<%``('7```=P8``@>$```"!0`"!X@```(&``('C``!C04``@>0``&-!@`"
+M!Y0``34%``('F``!-08``@?D```"!0`"!^@```(&``('[``!C04``@?P``&-
+M!@`"!_0``34%``('^``!-08``@A,```"!0`""%````(&``((5``!C04``@A8
+M``&-!@`""%P``34%``((8``!-08``@BT```"!0`""+@```(&``((O``!C04`
+M`@C```&-!@`"",0``34%``((R``!-08``@D@```"!0`""20```(&``()*``!
+MC04``@DL``&-!@`""3```34%``()-``!-08``@H\```!!``""GP```$$``(*
+MJ````00``@JX```!!``""V0```$%``(+:````08``@N(``#F!0`""XP``.8&
+M``(,"````04``@P,```!!@`"#"@```$$``(,?````04``@R````!!@`"#/P`
+M``$%``(-`````08``@U\```!!0`"#8````$&``(-S````04``@W0```!!@`"
+M#B````$$``(.+````04``@XP```!!@`"#K````$%``(.M````08``@\D```!
+M!``"#TP```$%``(/4````08``@^$```!!``"#Y0```$%``(/F````08``A#@
+M```!!``"$:@```$%``(1K````08``A+0```!!``"%!0```$$``(5?```@P4`
+M`A6```"#!@`"%9P``(,%``(5H```@P8``A;````!!``"%NP```$$``(7=```
+M`00``A>0```!!``"&(````$%``(8A````08``ACL```!!``"&20```$%``(9
+M*````08``AFD```!!0`"&:@```$&``(:-```S04``AHX``#-!@`"&E0``,T%
+M``(:6```S08``AIT```!!``"&H0```$%``(:B````08``AJ0```!!0`"&I0`
+M``$&``(:G````04``AJ@```!!@`"&J@```$%``(:K````08``AJT```!!0`"
+M&K@```$&``(:P````04``AK$```!!@`"&LP```$%``(:T````08``AK8```A
+M!0`"&MP``"$&``(;.````@4``AL\```"!@`"&T```8T%``(;1``!C08``AM(
+M``$U!0`"&TP``34&``(;K````@4``ANP```"!@`"&[0``8T%``(;N``!C08`
+M`AN\``$U!0`"&\```34&``(<"````@4``AP,```"!@`"'!```8T%``(<%``!
+MC08``AP8``$U!0`"'!P``34&``(=+````00``AV8```O!0`"'9P``"\&``(=
+ML``!D`4``AVT``&0!@`"'>```8T%``(=Y``!C08``AWP```!!``"'H@``"\%
+M``(>C```+P8``AZ<```!!``"'PP``"\%``(?$```+P8``A\@```!!``"'X@`
+M`"\%``(?C```+P8``A^<```!!``"'_P``"\%``(@````+P8``B!```&-!0`"
+M($0``8T&``(@]````00``B$$```!!``"(1````$$``(A)````@4``B$H```"
+M!@`"(5````(%``(A5````@8``B&,```"!0`"(9````(&``(AR````@4``B',
+M```"!@`"(A@``'<%``(B'```=P8``B)$```"!0`"(D@```(&``(BB````@4`
+M`B*,```"!@`"(I```8T%``(BE``!C08``B*8``$U!0`"(IP``34&``(BZ```
+M`@4``B+L```"!@`"(O```8T%``(B]``!C08``B+X``$U!0`"(OP``34&``(C
+M4````@4``B-4```"!@`"(U@``8T%``(C7``!C08``B-@``$U!0`"(V0``34&
+M``(CN````@4``B.\```"!@`"(\```8T%``(CQ``!C08``B/(``$U!0`"(\P`
+M`34&``(D)````@4``B0H```"!@`")"P``8T%``(D,``!C08``B0T``$U!0`"
+M)#@``34&``(DT````@4``B34```"!@`")50```$$``(F4````04``B94```!
+M!@`")K0```$$``(H7````04``BA@```!!@`"*A@```$%``(J'````08``BI@
+M```!!0`"*F0```$&``(JD````04``BJ4```!!@`"*V````$$``(N4````00`
+M`BYH```!!``"+G0``9`%``(N>``!D`8``BZD```!!0`"+J@```$&``(NZ``!
+MC04``B[L``&-!@`"+P@```$$``(O'``!C04``B\@``&-!@`"+[P``8T%``(O
+MP``!C08``C`8``"#!0`",!P``(,&``(P.```@P4``C`\``"#!@`",%@``(,%
+M``(P7```@P8``C%X```!!``",?@```$%``(Q_````08``C(0```!!``",BP`
+M``$$``(RS````04``C+0```!!@`",T````$%``(S1````08``C.L```!!``"
+M,^````$%``(SY````08``C/\```!!0`"-`````$&``(TA````04``C2(```!
+M!@`"-10``,T%``(U&```S08``C4T``#-!0`"-3@``,T&``(U3```S04``C50
+M``#-!@`"-6P```$$``(U=````04``C5X```!!@`"-8````$%``(UA````08`
+M`C6,```!!0`"-9````$&``(UF````04``C6<```!!@`"-:0```$%``(UJ```
+M`08``C6P```!!0`"-;0```$&``(UO````04``C7````!!@`"-<@``"$%``(U
+MS```(08``C8H```"!0`"-BP```(&``(V,``!C04``C8T``&-!@`"-C@``34%
+M``(V/``!-08``C:<```"!0`"-J````(&``(VI``!C04``C:H``&-!@`"-JP`
+M`34%``(VL``!-08``C;X```"!0`"-OP```(&``(W```!C04``C<$``&-!@`"
+M-P@``34%``(W#``!-08``C@<```!!``".(@``"\%``(XC```+P8``CB@``&0
+M!0`".*0``9`&``(XT``!C04``CC4``&-!@`"..````$$``(Y>```+P4``CE\
+M```O!@`".8P```$$``(Y^````00``CI<```!!``".KP``"\%``(ZP```+P8`
+M`CL```&-!0`".P0``8T&``([T````00``CP$```!!``"/"0```$$``(\1```
+M`00``CQ<```!!``"/&@```$$``(\?````@4``CR````"!@`"/*@```(%``(\
+MK````@8``CSD```"!0`"/.@```(&``(](````@4``CTD```"!@`"/8```'<%
+M``(]A```=P8``CWL```O!0`"/?```"\&``(^#```=P4``CX0``!W!@`"/AP`
+M``$$``(^-```=P4``CXX``!W!@`"/F````(%``(]Y````@4``CYD```"!@`"
+M/J0```(%``(^J````@8``CZL``&-!0`"/K```8T&``(^M``!-04``CZX``$U
+M!@`"/P0```(%``(_"````@8``C\,``&-!0`"/Q```8T&``(_%``!-04``C\8
+M``$U!@`"/VP```(%``(_<````@8``C]T``&-!0`"/W@``8T&``(_?``!-04`
+M`C^```$U!@`"/]0```(%``(_V````@8``C_<``&-!0`"/^```8T&``(_Y``!
+M-04``C_H``$U!@`"0$````(%``)`1````@8``D!(``&-!0`"0$P``8T&``)`
+M4``!-04``D!4``$U!@`"0/````(%``)`]````@8``D%T```!!``"0G````$%
+M``)"=````08``D+4```!!``"1'P```$%``)$@````08``D8X```!!0`"1CP`
+M``$&``)&@````04``D:$```!!@`"1K````$%``)&M````08``D>````!!``"
+M2G````$$``)*D``!D`4``DJ4``&0!@`"2L````$%``)*Q````08``DL$``&-
+M!0`"2P@``8T&``)+)````00``DLX``&-!0`"2SP``8T&``)+V``!C04``DO<
+M``&-!@`"3#0``(,%``),.```@P8``DQ4``"#!0`"3%@``(,&``),=```@P4`
+M`DQX``"#!@`"390```$$``).%````04``DX8```!!@`"3BP```$$``).2```
+M`00``D[H```!!0`"3NP```$&``)/7````04``D]@```!!@`"3\@```$$``)/
+M_````04``E`````!!@`"4!@```$%``)0'````08``E"@```!!0`"4*0```$&
+M``)1,```S04``E$T``#-!@`"45```,T%``)15```S08``E%H``#-!0`"46P`
+M`,T&``)1B````00``E&0```!!0`"490```$&``)1G````04``E&@```!!@`"
+M4:@```$%``)1K````08``E&T```!!0`"4;@```$&``)1P````04``E'$```!
+M!@`"4<P```$%``)1T````08``E'8```!!0`"4=P```$&``)1Y```(04``E'H
+M```A!@```2@```$"```!+````0(```$P```!`@```30```$"```!.````0(`
+M``$\```!`@```4````$"```!1````0(```%(```!`@```4P```$"```!4```
+M`0(```%4```!`@```5@```$"```!7````0(```%@```!`@```60```$"```!
+M:````0(```%L```!`@```7````$"```!=````0(```%X```!`@```7P```$"
+M```!@````0(```&$```!`@```8@```$"```!C````0(```&0```!`@```90`
+M``$"```!F````0(```&<```!`@```:````$"```!I````0(```&H```!`@``
+M`:P```$"```!L````0(```)X``$,`@```GP``&0"```"@```P`(```*$``"S
+M`@```H@``7H"```"C```TP(```*0``!4`@```I0``-\"```"F```H`(```*<
+M``%W`@```J```4H"```"I```O0(```*H```^`@```JP``(0"```"L```5P(`
+M``*T```@`@```K@``6@"```"O``!DP(```+````N`@```L0``(P"```"R``!
+M1P(```+,```I`@```M```#P"```"U```:`(```+8``%^`@```MP``7D"```"
+MX``!&0(```+D``"T`@```N@``5\"```"[``!8@(```+P``$)`@```O0``-P"
+M```"^``!/`(```+\``"0`@```P```7("```#!```O@(```,(``"V`@```PP`
+M`(4"```#$```K@(```,4``!5`@```Q@``,<"```#'``!.`(```,@``$.`@``
+M`R0``*0"```#*``!,P(```,L``#I`@```S```5P"```#-``!3`(```,X``$K
+M`@```SP``#("```#0```M0(```-$``%:`@```T@``1L"```#3``!)`(```-0
+M```]`@```U0``'0"```#6``!1`(```-<``#D`@```V```$\"```#9```-@(`
+M``-H``"+`@```VP```D"```#<```]0(```-T``$]`@```W@``30"```#?```
+M]@(```.```%_`@```X0``&D"```#B```"P(```.,``%D`@```Y```*P"```#
+ME``!#P(```.8``$8`@```YP``6X"```#H``!,@(```.D``"F`@```Z@``$4"
+M```#K``!+0(```.P```3`@```[0``+L"```#N```;P(```.\``#X`@```\``
+M`/H"```#Q``!40(```/(``%C`@```\P``7T"```#T```#P(```/4``%.`@``
+M`]@``2("```#W``!"P(```/@``"A`@```^0``4\"```#Z````0(```/L``&1
+M`@```_```2H"```#^``!6@(```/\``$;`@``!````20"```$!```/0(```0(
+M``!T`@``!`P```$"```:F``!10(``!J<``%E`@``&J```5<"```:I``!?`(`
+M`!JH``!C`@``&JP``'4"```:L```DP(``!JT``!L`@``&K@```T"```:O```
+M-0(``!K```!A`@``&L0``&("```:R```.0(``!K,``%K`@``&M```0T"```:
+MU``!AP(``!K8``"!`@``&MP``74"```:X``!`@(``!KD``"J`@``&N@``2<"
+M```:[```(@(``!KP``$'`@``&O0``!D"```:^``!9P(``!K\``#G`@``&P``
+M`!\"```;!```*@(``!L(``"M`@``&PP``7L"```;$``!:0(``!L4``%V`@``
+M&Q@``3D"```;'```\@(``!L@``#_`@``&R0``.X"```;*``!$@(``!LL``!]
+M`@``&S```)@"```;-```<P(``!LX``%)`@``&SP``)\"```;0```0`(``!M$
+M``$Z`@``&T@``38"```;3```>0(``!M0```Z`@``&U0``4T"```;6```W0(`
+M`!M<``$N`@``&V```.,"```;9```PP(``!MH``#B`@``&VP``4$"```;<```
+MS@(``!MT```W`@``&W@``&`"```;?```V`(``!N```%&`@``&X0``50"```;
+MB``!)@(``!N,```<`@``&Y```%L"```;E``!,`(``!N8``&2`@``&YP``$@"
+M```;H```F@(``!ND``%@`@``&Z@``-0"```;K``!!`(``!NP```>`@``&[0`
+M`/L"```;N```.`(``!N\``$``@``&\```.L"```;Q```C0(``!O(```G`@``
+M&\P``%`"```;T```D@(``!O4``#;`@``&]@``,L"```;W``!5@(``!O@``#*
+M`@``&^0``5$"```;Z``!C@(``!OL```(`@``&_```*("```;]```<`(``!OX
+M``!J`@``&_P``.\"```<````\P(``!P$``$&`@``'`@```$"```<#``!+`(`
+M`!P0``%(`@``'!@``,,"```<'```X@(``!P@``%!`@``'"0``,X"```<*```
+M-P(``!PL```!`@``.J0```$"```ZJ````0(``#JL```!`@``.K````$"```Z
+MM````0(``#JX```!`@``.KP```$"```ZP````0(``#P0``!:`@``/!0``(`"
+M```\&``!<P(``#P<``!K`@``/"```$0"```\)```UP(``#PH``"X`@``/"P`
+M`1P"```\,```JP(``#PT``!3`@``/#@``)T"```\/```5@(``#Q```$#`@``
+M/$0``5X"```\2```B@(``#Q,``#^`@``/%```.4"```\5``!F`(``#Q8``&,
+M`@``/%P``+D"```\8```?`(``#QD``$C`@``/&@``"@"```\;``!70(``#QP
+M``%2`@``/'0``(8"```\>``!80(``#Q\``!>`@``/(```3\"```\A``!`0(`
+M`#R(``#\`@``/(P``!("```\D``!;`(``#R4``!Z`@``/)@``.`"```\G``!
+M<0(``#R@``#9`@``/*0``)8"```\J``!,0(``#RL``#Y`@``/+```!`"```\
+MM```G`(``#RX```*`@``/+P``)<"```\P``!/@(``#S$``"P`@``/,@``.@"
+M```\S```/P(``#S0``$?`@``/-0``*,"```\V```L0(``#S<``$7`@``/.``
+M`$T"```\Y``!0@(``#SH``%0`@``/.P``10"```\\``!E`(``#ST``!)`@``
+M//@``,8"```\_```J`(``#T```&"`@``/00``$P"```]"```C@(``#T,``&&
+M`@``/1```*<"```]%```S`(``#T8``!"`@``/1P``$L"```](```+0(``#TD
+M``!!`@``/2@``#L"```]+```Z@(``#TP``!&`@``/30``'\"```].```-`(`
+M`#T\```S`@``/4```!@"```]1```<@(``#U(``#W`@``/4P``&T"```]4``!
+M)0(``#U4``&!`@``/5@``-`"```]7``!40(``#U@``"1`@``/60``8\"```]
+M:``!$`(``#UL``#1`@``/7```","```]=``!=`(``#UX``!N`@``/7P``-4"
+M```]@```Q0(``#V$``#L`@``/8@``8H"```]D``!%P(``#V4``!-`@``/9@`
+M`4("```]G``!4`(``#V@``$4`@``/:0``94"```]K````0(``$[X```!`@``
+M3OP```$"``!/`````0(``$\$```!`@``3P@```$"``!/#````0(``$]<```!
+M`@``3V````$"``!/9````0(``$]H```!`@``3VP```$"``!/<````0(``$]T
+M```!`@``3W@```$"``!/?````0(``$^````!`@``3X0```$"``!/B````0(`
+M`$^,```!`@``3Y````$"``!/E````0(``$^8```!`@``3YP```$"``!/H```
+M`0(``$^D```!`@``3Z@```$"``!/K````0(``$^P```!`@``3[0```$"``!/
+MN````0(``$^\```!`@``3\````$"``!/Q````0(``$_(```!`@``3\P```$"
+M``!/T````0(``$_4```!`@``3]@```$"``!/W````0(``$_@```!`@``3^0`
+M``$"``!/Z````0(``$_L```!`@``4`P```$"``!0$````0(``%`4```!`@``
+M4!@```$"``!0'````0(``%`@```!`@``4"0```$"``!0*````0(``%`L```!
+M`@``4#````$"``!0-````0(``%`X```!`@``4#P```$"``!00````0(``%!$
+M```!`@``4$@```$"``!03````0(``%!0```!`@``4%0```$"``!06````0(`
+M`%!<```!`@``4&````$"``!09````0(``%!H```!`@``4&P```$"``!0<```
+M`0(``%!T```!`@``4'@```$"``!0?````0(``%"````!`@``7'@```$"``!<
+M?````0(``%R````!`@``7(0```$"``!<B````0(``%R,```!`@``7)````$"
+M``!I>````0(``&E\```!`@``:8````$"``!IA````0(``&F(```!`@``:8P`
+M``$"``!ID````0(``&F4```!`@``=:````$"``!UI````0(``'6H```!`@``
+M=:P```$"``!UL````0(``'6T```!`@``=;@```$"``!UO````0(``(&@```!
+M`@``@:0```$"``"!J````0(``(&L```!`@``@;````$"``"!M````0(``(&X
+M```!`@``@;P```$"``"/B````0(``(^,```!`@``CY````$"``"/E````0(`
+M`(^8```!`@``CYP```$"``"/H````0(``(^D```!`@```!````("````%```
+M`@(````8```"`@```!P```("````(````@(````D```"`@```"@```("````
+M+````@(````````!`@```"```/`"````0```6`(```!@``!?`@```(```$H"
+M````H```+P(```#```!F`@```.```1X"```!````B0(```$@``%;`@```4``
+M`"4"```!8``!*0(```&```$6`@```:```!L"```!P````0(```'@``$W`@``
+M`@```68"```"(``!%0(```)```%1`@```F```"L"```"@````0(```*@```!
+M`@```L````$"```"X````0(```,````!`@```R````$"```#0````0(```-@
+M```!`@```X````$"```#H````0(```/````!`@```^````$"```$`````0(`
+M``0@```!`@``!$````$"```$8````0(```2````!`@``!*```7@"```$P``!
+M'0(```3@```!`@``!0````$"```%(````0(```5````!`@``!6````$"```%
+M@````0(```6@``&7`@``!<```+P"```%X````0(```8````!`@``!B````$"
+M```&0````0(```9@```!`@``!H````$"```&H````0(```;```%P`@``!N``
+M`/T"```'```!$P(```<@```4`@``!T```6\"```'8````0(```>````!`@``
+M!Z````$"```'P````0(```?@```!`@``"`````$"```((```1P(```A```!D
+M`@``"&````$"```(@````0(```B@```!`@``",```6,"```(X``!?0(```D`
+M``%.`@``"2````\"```)0``!(@(```E@``$+`@``"8```*$"```)H``!3P(`
+M``G```!%`@``">```!,"```*```!+0(```H@``!O`@``"D```+L"```*8``!
+M,P(```J```#I`@``"J```5P"```*P``!3`(```K@``$J`@``"P```2L"```+
+M(``!D0(```M```!^`@``"V```5H"```+@``!&P(```N@```]`@``"\```20"
+M```+X```=`(```P````R`@``#"```/4"```,0``!/0(```Q@``$T`@``#(``
+M`/8"```,H```M0(```S```#D`@``#.```40"```-````3P(```T@``!E`@``
+M#4```#8"```-8```BP(```V```%_`@``#:```&D"```-P```"P(```W@``%D
+M`@``#@```0\"```.(```K`(```Y```$8`@``#F```6X"```.@``!,@(```Z@
+M``"F`@``#L```6H"```.X```50(```\```#'`@``#R```3@"```/0``!#@(`
+M``]@``"D`@``#X````$"```/H````0(```_````!`@``#^```/@"```0````
+M^@(``!`@``$,`@``$$```1D"```08```M`(``!"```%?`@``$*```6("```0
+MP``!"0(``!#@``#<`@``$0```3P"```1(``!<@(``!%```"0`@``$6```+X"
+M```1@```M@(``!&@``"%`@``$<```*X"```1X```P`(``!(````!`@``$B``
+M`-,"```20```LP(``!)@``%Z`@``$H```3L"```2H```5`(``!+````!`@``
+M$N````$"```3`````0(``!,@``#?`@``$T````$"```38``!A0(``!.````!
+M`@``$Z```%("```3P```E`(``!/@``![`@``%`````D"```4(```O0(``!1`
+M```^`@``%&```4H"```4@```A`(``!2@``!7`@``%,```"`"```4X``!:`(`
+M`!4```%W`@``%2```"X"```50``!DP(``!5@``",`@``%8```4<"```5H```
+M*0(``!7```%Y`@``%>```#P"```6````:`(``!8@``%^`@``%D```*`"```6
+M8````0(``!:```&$`@``%J```64"```6P````0(``!;@```!`@``%P````$"
+M```7(````0(``!=```&.`@``%V````@"```7@```<`(``!>@``"B`@``%\``
+M`&H"```7X```[P(``!@```#S`@``&"```08"```80```)P(``!A@``"2`@``
+M&(```%`"```8H```RP(``!C```#;`@``&.```38"```9````>0(``!D@```Z
+M`@``&4```4T"```98``!2`(``!F```#=`@``&:```2P"```9P```40(``!G@
+M``##`@``&@```.("```:(```S@(``!I```%!`@``&F```#<"```:@``!+@(`
+M`!J@``#C`@``&L```-@"```:X```8`(``!L```%&`@``&R```8,"```;0``!
+M5`(``!M@``$F`@``&X```)H"```;H``!8`(``!O```#4`@``&^```00"```<
+M````^P(``!P@```>`@``'$```#@"```<8``!``(``!R```#K`@``'*```(T"
+M```<P```R0(``!S@``!S`@``'0```4D"```=(```FP(``!U```!;`@``'6``
+M`3`"```=@``!D@(``!V@``!(`@``'<```)\"```=X```0`(``!X```$Z`@``
+M'B````$"```>0````0(``!Y@```!`@``'H```58"```>H```R@(``![```%%
+M`@``'N```!\"```?````*@(``!\@``"M`@``'T```7L"```?8``!:0(``!^`
+M``%V`@``'Z```3D"```?P```_P(``!_@``#R`@``(````.X"```@(``!$@(`
+M`"!```!]`@``(&```)@"```@@``!5P(``""@``%\`@``(,```&,"```@X``!
+ME@(``"$```"3`@``(2````$"```A0````0(``"%@```!`@``(8````$"```A
+MH````0(``"'````!`@``(>```!T"```B````T@(``"(@```!`@``(D```-X"
+M```B8````0(``"*```!L`@``(J```2$"```BP````0(``"+@```!`@``(P``
+M``$"```C(````0(``"-````!`@``(V````$"```C@````0(``".@``&``@``
+M(\````$"```CX````0(``"0````<`@``)"````$"```D0````0(``"1@```!
+M`@``)(````$"```DH```=0(``"3````U`@``).```&("```E````.0(``"4@
+M``!A`@``)4````$"```E8``!:P(``"6```$-`@``):```8<"```EP```@0(`
+M`"7@``$"`@``)@```74"```F(```J@(``"9```$G`@``)F```"("```F@```
+MYP(``":@``$'`@``)L```!D"```FX``!9P(``"<````-`@``)R````$"```G
+M0```0P(``"=@```!`@``)X````$"```GH```)@(``"?````!`@``)^```'8"
+M```H````@`(``"@@```:`@``*$```,4"```H8``!+P(``"B````!`@``**``
+M`5D"```HP```D0(``"C@``&/`@``*0```-$"```I(``!$`(``"E```&*`@``
+M*6```1<"```I@```30(``"F@``%0`@``*<```4("```IX``!%`(``"H````C
+M`@``*B```70"```J0```;@(``"I@``#5`@``*H```!@"```JH```]P(``"K`
+M``!R`@``*N```24"```K````;0(``"L@``$^`@``*T```+`"```K8```Z`(`
+M`"N````_`@``*Z```1\"```KP```[`(``"O@``"W`@``+````*,"```L(```
+ML0(``"Q```!)`@``+&```90"```L@```Q@(``"R@``"(`@``+,```8D"```L
+MX```J`(``"T```&"`@``+2```'@"```M0```%P(``"U@``".`@``+8```88"
+M```MH```IP(``"W```#,`@``+>```5,"```N````0@(``"X@``!+`@``+D``
+M`"T"```N8```00(``"Z```#J`@``+J```#L"```NP```1@(``"[@``!_`@``
+M+P```#0"```O(```,P(``"]```#7`@``+V```!8"```O@```F0(``"^@``!=
+M`@``+\```"$"```OX```G`(``#`````*`@``,"```)<"```P0````0(``#!@
+M```!`@``,(````$"```PH``!@0(``##```#0`@``,.```%H"```Q```!80(`
+M`#$@``!>`@``,4```3\"```Q8``!`0(``#&```#\`@``,:```!("```QP``!
+M;`(``#'@``#@`@``,@```'H"```R(``!<0(``#)```#9`@``,F```)8"```R
+M@``!,0(``#*@``%S`@``,L```4`"```RX```KP(``#,````,`@``,R```"0"
+M```S0```:P(``#-@``!$`@``,X```8L"```SH```N`(``#/````!`@``,^``
+M`&<"```T`````0(``#0@``#(`@``-$```$X"```T8````0(``#2````.`@``
+M-*```,("```TP``!0P(``#3@``"5`@``-0```04"```U(``!'`(``#5```!9
+M`@``-6````$"```U@``!E0(``#6@```!`@``-<````$"```UX````0(``#8`
+M```!`@``-B```54"```V0``!&@(``#9@```!`@``-H````$"```VH```3`(`
+M`#;````!`@``-N````$"```W`````0(``#<@``!W`@``-T```%P"```W8``!
+M$0(``#>```!3`@``-Z```%8"```WP``!`P(``#?@``"=`@``.`````$"```X
+M(``!7@(``#A```"*`@``.&```/X"```X@```Y0(``#B@``&,`@``.,```9@"
+M```XX```N0(``#D```!\`@``.2```2,"```Y0```A@(``#E@```H`@``.8``
+M`5T"```YH``!4@(``#G````P`@``.>```(("```Z`````0(``#H@``"'`@``
+M.D```0H"```Z8```L@(``#J```!Q`@``.J```)X"```ZP````0(``#K@```!
+M`@``.P````$"```[(```V@(``#M````0`@``.V```(\"```[@````0(``#N@
+M```!`@``.\```/D"```[X```JP(``#P````!`@``/"````$"```\0````0(`
+M`#Q@```!`@``/(````$"```\H````0(``#S````!`@``/.````$"```]````
+M`0(``#T@```!`@``/4````$"```]8````0(``#V```%M`@``/:````$"```]
+MP````0(``#W@```!`@``/@````$"```^(````0(``#Y````!`@``/F````$"
+M```^@````0(``#Z@```!`@``/L````$"```^X````0(``#\````!`@``/R``
+M``$"```_0````0(``#]@``&(`@``/X````$"```_H````0(``#_````!`@``
+M/^````$"``!``````0(``$`@```!`@``0$````$"``!`8````0(``$"````!
+M`@``0*````$"``!`P````0(``$#@```!`@``00````$"``!!(````0(``$%`
+M``"E`@``06````$"``!!@````0(``$&@```!`@``0<````$"``!!X````0(`
+M`$(````!`@``0B````$"``!"0````0(``$)@```!`@``0H````$"``!"H```
+B`0(``$+````!`@``0N````$"``!#`````0(``$,@``#$`@``
+`
+end
diff --git a/sys/contrib/dev/ath/public/mipsisa32-be-elf.inc b/sys/contrib/dev/ath/public/mipsisa32-be-elf.inc
new file mode 100644
index 0000000..fd34646
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mipsisa32-be-elf.inc
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/mipsisa32-be-elf.inc#2 $
+#
+
+#
+# Compilation configuration for building big-endian mipsisa32-elf.
+#
+
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=mipsisa32-elf
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/mipsisa32-elf-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS+= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -G 0 -mno-abicalls -fno-pic -march=r4600 -Wa,--trap \
+ -fno-strict-aliasing -fno-common -fomit-frame-pointer -mlong-calls \
+ -isystem ${KERNELPATH}/include
+
diff --git a/sys/contrib/dev/ath/public/mipsisa32-be-elf.opt_ah.h b/sys/contrib/dev/ath/public/mipsisa32-be-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mipsisa32-be-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/mipsisa32-le-elf.hal.o.uu b/sys/contrib/dev/ath/public/mipsisa32-le-elf.hal.o.uu
new file mode 100644
index 0000000..4dabe27
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mipsisa32-le-elf.hal.o.uu
@@ -0,0 +1,6257 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/mipsisa32-le-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$!`0````````````$`"``!``````````````!D>@,``0``(#0`````
+M`"@`#P`,`/P#_^``````````````````````[W\``/__A#!8``(D5P""$```
+M`CQ9`((H(`!`$`<1`B0<`((H#P!`$%(``B0:`((H4@!`$````CP3`((H*`!`
+M$!,``B01`((H/`!`$````CP'``(D-P""4````CP(`.`#+1```#L`@A````(\
+M4P""*`8`0!!7``(D'``")#T`@E````(\"`#@`RT0```Q`()0```"/`@`X`,M
+M$```)0""$````CP($8(H$0!`$!,1`B21``(D*P""$````CR2`((H!P!`$!00
+M`B1Z_X(D`@!"+"P`0%`M$```5@``"````CPF`()0```"/`@`X`,M$```(@""
+M$````CP4$8(H!@!`$!/P`C02$0(D#`""4````CP(`.`#+1````P`@A````(\
+M&_$"-`<`@E````(\"`#@`RT0```(`.`#@`!")`@`X`-P`$(D"`#@`P@!0B0(
+M`.`#\`!")`@`X`.0`$(D"`#@`]@`0B0(`.`#P`!")`@`X`-(`$(D"`#@`Z@`
+M0B0(`.`#8`!")`@`X`,`````\/^])P``O____X0PC!8")`8`@A#__Z4P)Z<"
+M-`,`@A"W$`(D!@""%"T8``````(\``!")`GX0``M(*``+1A``"T08````+_?
+M"`#@`Q``O2?P_[TG__^$,`<"`B0Y`((0``"__P@"@B@4`$`0$Q$")!,`@B@)
+M`$`0$P`")!$`@B@N`$`0```"/`<``B0N`((0```"/+D```@M&```)0""$```
+M`CSF_X(D`P!"+"L`0%`M&```K@``"!,`!"0=`((0```"/!01@B@,`$`0&_$"
+M-`<1`B0;`((0"!&"*`,`0%`2$0(DJP``"!00`B03`((0```"/+D```@M&```
+M#P""4````CPJ$$0`!@!`%!G_`C03\`(T!P""$````CRY```(+1@```T`@E0M
+M&```$P`$)````CRU```(``!")+4```@``$(D```"/```0B0)^$```````+L`
+M``@M&$```0`")````JT0`&`0+1!@`,@!8I0(`&*DR@%BE`H`8J3,`6*,'`!B
+MK-`!8I0@`&*DT@%BE"(`8J34`6*4)`!BI-8!8I0F`&*D+1!@````O]\(`.`#
+M$`"])]@!A:P(`.`#`0`"),#_O2<X`+__,`"V_R@`M?\@`+3_&`"S_Q``LO\(
+M`+'_``"P_RV@@``MF*``+9#``"V(X``M@``````"/```5B0```(\``!5)"T@
+M@`()^,`"+2A@`B004@`(`%$0`0`#)`GXH`(*``0D`0`0)N@#`BKV_T!4+2"`
+M`BT8```M$&``.`"_WS``MM\H`+7?(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#
+M0`"])RTP```(`*`0+1@``$`0`P`!`(,P)1A#``$`QB0K$,4`^O]`%$(@!``(
+M`.`#+1!@`/__YS!`$`<`(1!'`(`0`@`A$$4`)@!)E)(`(!$M$```0!`'`"$0
+M1P"`$`(`(1!%`"4`0Y`"``(D)`!B$`,`8B@%`$`0`P`")`H`8!``````H`$`
+M""TP``!=`&(0P!`)``0``B1K`&)0@!`)`*`!``@M,```"```$<``!"1`$`<`
+M(1!'`(`0`@`A$$4`*0!"D`$`0%1@``0DP!@&```2!@`C$$,`@!`"`"$00P#`
+M$`(`&P!)`!(0```!`"!1#0`'`"$P@@"@`0`("@#&)#02@HP6`$!0-!*$C`(`
+M0H03`$,$-!*$C``1"0`\$`(`/A`"`&(0`SS336,T'`!#`!(0``"^(0(`P!@&
+M`"$09``5`$(D&P!$`!(0```!`(!0#0`'```1`@"@`0`(D`!&)!<`@!"`$`D`
+M`@""E`!`0C`3`$!0@!`)`,`0"0`\$`(`/A`"`&(0`SS336,T'`!#`!(0``"^
+M(0(`P!@&`"$09``5`$(D&P!$`!(0```!`(!0#0`'`,`0`@"@`0`(2`!&)#P0
+M`@`^$`(`8A`#/---8S0<`$,`$A```+XA`@#`&`8`(1!D`!4`0B0;`$0`$A``
+M``$`@%`-``<`@!`"`*`!``@D`$8D/!`"`#X0`@!B$`,\TTUC-!P`0P`2$```
+MOB$"`,`8!@`A$&0`%0!")!L`1``2$````0"`4`T`!P"`$`(`H`$`"!8`1B0\
+M$`(`/A`"`&(0`SS336,T'`!#`!(0``"^(0(`P!@&`"$09``5`$(D&P!$`!(0
+M```!`(!0#0`'`(`8`@#H`R(M`@!`%+T`9B1<`&8D___",`@`X`,``````@"B
+ME"``0C`4`$`4`@`$)`(`HI30`$(PP``#)`\`0Q`#``0D`@"BE-``0C#0``,D
+M"@!#$`0`!"0"`**4$`!",`8`0!0!``0D`@"BE``(0C`"`$`4!0`$)"T@```(
+M`.`#+1"``.#_O2<0`+__"`"Q_P``L/\MB*``@`#",`D`0!`M@,``M`D")&X`
+MHA`.``,DM`FB+!X`0%29]B,F(@(`"##V(B8``<(P$P!`$+0)`B0```(\``!"
+M)`GX0```````!@!`$$`!`C*S["(F,0!"+"4`0!2`$!$`0`$",E$`0!!X["(F
+MB1,B+DX`0%1@\"(F+`(`"'CL(B92`*(0#@`#)+0)HBP+`$`0B!.B+)GV(R9F
+M9@(\9V9"-!P`8@`2$```/Q`"`$,0`@##'P,`-`(`"",80P`[`$`0>.PB)@``
+M`CP``$(D"?A````````G`$`0)1,B+K/L(B8Q`$(L(P!`$"43(BZ`$!$`(1!1
+M`$`@`@`\$!$`/A`"`,S,!30X+`4`S<RE-!P`10`2$```OA`"`(`8`@`A&&(`
+M_O\B)@<`8A3__P(\#3]"-"$0@@`\$`(`/A`"`!H"``@<`$4`"#]"-"$0@@`\
+M$`(`/A`"`,S,`S0X'`,`S<QC-!P`0P`2$```OA`"`#0"``@M&$```P!`5##V
+M(B8L`@`(8/`B)CP0`@`^$`(`S,P#-#@<`P#-S&,T'`!#`!(0```^$0(`-`(`
+M"`\`0R0\$`(`/A`"`,S,`S0X'`,`S<QC-!P`0P`2$```OA@"`"T08``0`+_?
+M"`"QWP``L-\(`.`#(`"])_#_O2<(`+__``"P_RV`H``T$H6,#`"@$````CP`
+M`$(D"?A```````````,\(`%C)"$00P```$*0&``"`A(0``!2`@`("`"_WT`0
+M$``A$%``@!`"`",04`!`$`(`"`"_WP``L-\(`.`#$`"])_#_O2<(`+__``"P
+M_RV`H``T$H6,#@"@$````CP``$(D"?A```````````,\(`%C)"$00P```$*0
+M&P`"`@$`0%`-``<`$A```'("``@(`+_?/!`0`#X0`@`NN@,T.!P#`*.+8S0<
+M`$,`$A```#X1`@`(`+_?``"PWP@`X`,0`+TGP/^])S``O_\H`+7_(`"T_Q@`
+ML_\0`++_"`"Q_P``L/\MH(``!`"BD"\`0!0MD*``+9@``/__`R0A$%,"!`!#
+MH`$`<R8@`&(J_/]`%"$04P(``$*.)`!`&"V8``````(\``!5)$"`$P`A@!,"
+M@(`0`"&`$@(@``0F"`""D`L`D9`A&$("!`!SH`D`@Y`E$$,`(1!"`@0`4Z`H
+M`!`F+2"``BTH0`(.``8D+3@@`@GXH`(M0```!``"IBT@@`(M*$`"#@`&)"TX
+M(`()^*`"`0`()`8``J8!`',F``!"CBH08@+A_T`40(`3`#``O]\H`+7?(`"T
+MWQ@`L]\0`++?"`"QWP``L-\(`.`#0`"])R,`HBQ;`$`0X`&()(`0!0````,\
+M*`%C)"$00P```$*,"`!```````#)`@`("`*"E`,``I$!`$(P"`#@`P$`0BP*
+M``*5``#BK`@`X`,M$```R0(`"`@``I4```*-"0,`"$(4`@`"``*5`0!",#T`
+M0!0-``,D$0,`""T8``````*-"0,`"((0`@````*-"0,`",(0`@````*-"0,`
+M"`(1`@#)`@`(^`&"C`$``B3E_\)0_`&"A#``P!`M$````@`").#_PE#^`8*4
+M`P`")-W_PE```H*,"`#@`PT``B0```*-"0,`"((4`@````*-"0,`",(4`@``
+M``*-"0,`"`(2`@````*-"0,`"$(5`@````*-"0,`"((5`@`!``(D#@#"4$P2
+M@HP&`,!0```"C0(``B3$_\)02!*"E`@`X`,-``(DPA4"``X#``@!`$(P"`#@
+M`PT``B1H$H*,`@!`$`T``R0M&```"`#@`RT08`#)`@`(%``"C0P``B0(`.`#
+M`````!D``B02`*(0&@"B+`8`0!`>``(D#P`")`<`HA`#``(D-P,`"``````2
+M`*)0:!*'K#<#``@`````$`#"%`4`XBP.`$`0`````#4#``@``H>L`0`")`8`
+MPA`K$`<``@`")`0`PE!($H>D-P,`"`````!,$H*L"`#@`P$``B0#```1````
+M``P``B0```*M"`#@`RT0``"P_[TG2`"__T``OO\X`+?_,`"V_R@`M?\@`+3_
+M&`"S_Q``LO\(`+'_``"P_RV@@``MN*``+?#``"V0X``MB,``"`#B+!L`0!0M
+ML``````"/```522`$!8`(1!7````4)0"`%.4`!00`"404P```"*N!``Q)OS_
+M4B8M((`""?B@`BTH``(``"*N!``Q)@0`$"8K$'`"!`!`%/S_4B8$`$(N]O]`
+M$"T@@`((`$(NZ?]`$`$`UB8C$#X"2`"_WT``OM\X`+??,`"VWR@`M=\@`+3?
+M&`"SWQ``LM\(`+'?``"PWP@`X`-0`+TG\/^])P@`O_\``+#_#0`")!(`HA`M
+M@"`!#@"B*`4`0%`=``(D"@"@$,@!@B2E`P`(+1@``!$`HA!0$H(D'@`")!$`
+MHA`M&```I@,`""T08`````*ME`,`"!```B0M*,`````&C0```CST#$(D"?A`
+M````)XVD`P`(```"K@```JV4`P`(&``")`8`X!0$``(D```BK0```XT$`H*,
+MI`,`"```8JP$`.(4+1@`````PHP$`H*L`0`#)"T08``(`+_?``"PWP@`X`,0
+M`+TG!`"BC&(`0!`M&`````#"C```HJP$`,*,"`"BK`@`PHP,`**L#`#"C!``
+MHJP0`,.,__\")`4`8A```6(L`0!`4/\``R2_`P`(%`"CK`(``B04`**L%`##
+MC/__`B00`&(0`01B+`(`0!0M(&````0$)`$``B08`**L*Q!$``H`0!`!``,D
+M0!`#``$`0S0K$&0`_?]`%$`0`P#4`P`(&`"CK!0`PHP8`**L&`##C/__`B00
+M`&(0`01B+`(`0!0M(&````0$)`$``B0<`**L*Q!$``H`0!`!``,D0!`#``$`
+M0S0K$&0`_?]`%$`0`P#I`P`('`"CK/\#`B0<`**L'`#"E`<`0!`*``(D'`##
+ME!``8BP!`$!0#P`#)/,#``@@`*.D(`"BI!X`PI0'`$`0"@`")!X`PY00`&(L
+M`0!`4`\``R3]`P`((@"CI"(`HJ0@`,*,)`"BK"0`PHPH`**L*`#"C"P`HJPL
+M`,*,,`"BK`0`PXP$``(D!@!B%`$``R0$`*.,`0`")`$`8E`X`*.L`0`#)`@`
+MX`,M$&``!`#"C!X`0!`M&```#`#"C`@`HJP``,*,``"BK`@`PHP$`**L#`#"
+MC`@`HJP0`,*,#`"BK!0`PHP0`**L&`#"C!0`HJP<`,*,&`"BK"``PI0<`**D
+M(@#"E!X`HJ0D`,*,(`"BK"@`PHPD`**L+`#"C"@`HJPP`,*,+`"BK`$``R0(
+M`.`#+1!@`.#_O2<8`+__$`"R_P@`L?\``+#_+9"``````CP``$(D"?A``"V`
+MH``MB$``%P`@$BT0```6`"*&$`!`5!8`(I8M($`"```"/```0B0)^$``+2@`
+M`D"``@````(\N`%")"&``@+``4*.+2!``@GX0``M*"`"4@0`"````Y88`".6
+M(1!#```4`@`#%`(`&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TGH/^])U@`O_]0
+M`+[_2`"W_T``MO\X`+7_,`"T_R@`L_\@`++_&`"Q_Q``L/\MF(``!`"@KP``
+MH*\MN```+;```#`2@HQ"`$`0+9```````CRX`5XD@!$2`"$08@(P`E$D%@`B
+MAC4`0006`#"6+2!@`@```SP``&,D"?A@`"TH(`(MH$``0!`"`"$07@```%64
+M(8`5`L`!8HXM(&`""?A``"TH(`(A$%```!0"``.$`@`"`"*6``%",`\`0!`$
+M`*./*A`7`AX`0%`!`%(F+;@``L`!8HXM(&`""?A``"TH(`(6`".6(1!#`",0
+MH@(`%`(`J@0`"`.T`@`J$`,"$`!`4`$`4B8$`+"O0(`4`"&`'@+``6*.+2!@
+M`@GX0``M*"`"%@`CEB$00P````.6(QAB```<`P`#'`,```"CKP$`4B8P$F*.
+M*Q!"`L/_0!2`$1(`+9```(`1$@`A$&(",`)1)!8`(H8.`$,$`0!2)L`!8HXM
+M(&`""?A``"TH(`(M($```@`BE@`!0C`#`$`4(1B6````HH\A&((`&``CI@$`
+M4B9``$(J[/]`5(`1$@!8`+_?4`"^WT@`M]]``+;?.`"UWS``M-\H`+/?(`"R
+MWQ@`L=\0`+#?"`#@`V``O2?__Z4P``""E`(P0BP$`$`0___&,````CS<!``(
+MR`%*)````CS@`4HD+2```&0`"23K40@\'X4(-4`0!``A$$H```!"E!@`1@`2
+M&```(Q`B`0`````8`$4`$A```"$88@``````'`!H`!(0```_$`(`0Q$"`,,?
+M`P`C$$,```#BI`$`A"0+`((HZ_]`%`(`YR0(`.`#`````/__I3#_``(D$P"B
+M$/\``R0``(*4`S!"+`L`0!"`$`4`/P"B+`0`0!2`$`4`(1!%``P%``@B%4(D
+M(1!%`$`0`@`,!0`([!-")"$010#`$D(D__]","T80``(`.`#+1!@`/__I3#_
+M``(D"`"B$/\``R0``(*4`S!"+`(`0%#\"*(D8`FB)/__0C`M&$``"`#@`RT0
+M8`#`_[TG.`"__S``M/\H`+/_(`"R_Q@`L?\0`+#_+8"`````HI0`0$(L!P!`
+M%"V0H``N`**4!0!`4```0I86`**4C0!`$`$``R0``$*6`S!"+!L`0!10`1,D
+M=@%"EG4`0!`MB```+2A@`@$`8B;__U,PH`$"CBT@``()^$``+3"@`WT`0!`M
+M&```0!@1`"$8<@```**7`A("`&(!8J0``**39`%BI`(`,29V`4*6*A`B`NW_
+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
+MH`,.`4`0+1@`````I9-``*`00(`3`"&`'0(!`',FX!/V)@GXP`(M((`""``"
+MI@``HI<"*@(`-@"@$$"`$P`A@!T"`0!S)@GXP`(M((`""``"I@H`8BKE_T`4
+M+2A``E$'``@@`*0G&@""EO``0%`!`+4F+8```/\`!"1`$!``(1!4`%`!0R0$
+M`&*4!0!$$$`0$P`A$%T`!`!CE`@`0Z0!`',F`0`0)@,``BKT_T`40!`0`%$'
+M``@@`*0GW`!`4`$`M28M@```_P`$)$`0$``A$%0`2`%#)`8`8I0%`$000!`3
+M`"$070`&`&.4"`!#I`$`<R8!`!`F`P`"*O3_0!1`$!``40<`""``I"<<"``(
+M+1!@`"``I"<```(\``!")`GX0``<`04D-`"SIZ0`8!HM@```0!`0`"$870`(
+M`&24(`!DI"$04`"`$`(`(1!0`$`0`@`A$%T`.`!$I"TH0`(!`%(FH`$BCBT@
+M(`()^$``+3"@`[(`0!`M&```0!@0`"$8<`"`&`,`(1AP`$`8`P`A&'T```"D
+MDP``HI=`$`(```%",",@@@`\`&2D``"BEP(B`@#"$P(``!("`",@@@!``&2D
+M+2A``@$`4B:@`2*.+2`@`@GX0``M,*`#F`!`$"T8``!`&!``(1AP`(`8`P`A
+M&'``0!@#`"$8?0```*23``"BET`0`@```4(P(R""`$0`9*0``**7`B("`,(3
+M`@``$@(`(R""`$@`9*0M*$`"`0!2)J`!(HXM("`""?A``"TPH`-^`$`0+1@`
+M`$`8$``A&'``@!@#`"$8<`!`&`,`(1A]````HI<?`$(P/@!BI$``8R0``**7
+M0A$"`!\`0C`"`&*D``"BEX(2`@`?`$(P!@!BI"TH0`(!`%(FH`$BCBT@(`()
+M^$``+3"@`V0`0!`M&```0!@0`"$8<`"`&`,`(1AP`$`8`P`A&'T`2`!C)```
+MI),``**70!`"```!0C`C(((`!`!DI```HI<"(@(`PA,"```2`@`C(((`!@!D
+MI"TH0`(!`%(FH`$BCBT@(`()^$``+3"@`TD`0!`M&```0!`0`"$04`"`$`(`
+M(1!0`$`0`@`A(%T```"CDP``HI=`$`(```%",",88@!0`(.D``""E@-`0BP(
+M`$`40!@0`$@`@I1*`(*D``"BEP(2`@`_`$(P]P<`"#H`@J0A&'``@!@#`"$8
+M<`!`&`,`(1A]````HI<"(@(`PA,"```2`@`C(((`2@!DI`$``B0Z`&*D`0`0
+M)BH0$P)?_T`40!`0`$`P%0`A$-0`:`!"E#8`HJ<A,-4`@#`&`"$PA@)D#<8D
+M+2`@`@```CP0%T(D"?A``"``I2<2`$`0+1@``$`P%0`A,-4`@#`&`"$PA@)D
+M#<8D+2`@`@```CQ\&$(D"?A``"``I2<&`$`0+1@```$`M28#`*(JV_Y`%`$`
+M`B0!``,D+1!@`(`!O]]X`;??<`&VWV@!M=]@`;3?6`&SWU`!LM](`;'?0`&P
+MWP@`X`.0`;TGX/^])Q@`O_\0`++_"`"Q_P``L/\MB*``+8```````CP``%(D
+M0!`0`"$04`"`$`(`(1`B`F0-1(P$`(!0`0`0)@GX0`)D#4"L`0`0)@,``BKU
+M_T!40!`0`!@`O]\0`++?"`"QWP``L-\(`.`#(`"])RU`@`#__Z4P%`"%I!8`
+M@Y0!`&(P`@!`$"U(```!``DD0A`#``$`0C`$`$`0@A`#``$`(B7__TDP@A`#
+M``$`0C`$`$`0PA`#``$`(B7__TDPPA`#``$`0C`"`$`0`0`B)?__23`2`*`0
+M+3@``$`0!P`A&$8```!DE"$82````&2D(1!'```9`@`A$$,`0!`"`"$02``8
+M`$2D&@!)I`$`XB3__T<P*Q#E`/'_0!1`$`<`"`#@`P````"`_[TG>`"__W``
+MOO]H`+?_8`"V_U@`M?]0`+3_2`"S_T``LO\X`+'_,`"P_RV8@``MH*``+;C`
+M`"``IZ\MJ``!_P`V,?__\3`_```1+9```````CQ`%%XD+2@@`@$`(B;__U$P
+MH`%BCBT@8`()^$``+3"@`ZP!0!`M&`````"EDS(`H!`M(.`""P#`%BV`0`(!
+M`$(F__]2,$"`$``A@!T"```#/.`38R0)^&``+2"``J<(``@(``*F`0!")O__
+M4C!`@!``(8`=`@``I9,)^,`#+2"``@@``J8``**7`BH"`!H`H!`M(.`""P#`
+M%BV`0`(!`$(F__]2,$"`$``A@!T"```#/.`38R0)^&``+2"``L`(``@(``*F
+M`0!")O__4C!`@!``(8`=`@``I9<"*@4`"?C``RT@@`((``*F*Q!5`L;_0!0M
+M*"`"+2#@`BTH0`(```(\#"%")`GX0``(`*8G0A`5`"``HX\A$&(`__]1,!0`
+MXI9K`4`0+9```$`0$@`A$%(``!D"`"$00P!`$`(`(1#B`A@`4"0"``*6.0!`
+M$`(`0BPM*"`"`0`B)O__43"@`6*.+2!@`@GX0``M,*`#60%`$"T8`````**7
+M'P!",`P``J8``**70A$"`'\`0C`$``*F``"BEP(3`@`\``*F+2@@`@$`(B;_
+M_U$PH`%BCBT@8`()^$``+3"@`T8!0!`M&`````"BES\`0C`4``*F``"BEX(1
+M`@`/`$(P1``"I@``HI>"$@(`'``"IBTH(`(!`"(F__]1,*`!8HXM(&`""?A`
+M`"TPH`,S`4`0+1@`````HI</`$(P3``"I@``HI<"$0(`/P!","0``J8"``*6
+M`@!"+$4`0%0"``.6``"BEX(2`@`?`$(P#@`"I@``HI?"$P(`!@`"IBTH(`(!
+M`"(F__]1,*`!8HXM(&`""?A``"TPH`,8`4`0+1@`````HY<_`&,P0!@#``8`
+M`I8E$$,`!@`"I@``HI>"$0(`#P!",#X``J8``**7@A("`!8``J8M*"`"`0`B
+M)O__43"@`6*.+2!@`@GX0``M,*`#`@%`$"T8`````**7#P!",$8``J8``**7
+M`A$"`#\`0C`>``*F``"BEX(2`@`/`$(P3@`"I@``HI>"$P(`)@`"IBTH(`(!
+M`"(F__]1,*`!8HXM(&`""?A``"TPH`/K`$`0+1@`````HY</`&,P@!@#`"8`
+M`I8E$$,`<0D`""8``J8!``(D&`!B5`(``I8``**7@A("``\`0C!4``*F``"B
+MEX(3`@`L``*F+2@@`@$`(B;__U$PH`%BCBT@8`()^$``+3"@`]$`0!`M&```
+M``"CEP\`8S"`&`,`+``"EB400P`L``*F`@`"E@,`0BPW`$!4`@`#E@``HI<"
+M$0(`'P!",!```J8``**70A("``@``J8M*"`"`0`B)O__43"@`6*.+2!@`@GX
+M0``M,*`#MP!`$"T8`````**7#P!",$```J8``**7`A$"`#\`0C`8``*F``"B
+MEX(2`@`/`$(P2``"I@``HI>"$P(`(``"IBTH(`(!`"(F__]1,*`!8HXM(&`"
+M"?A``"TPH`.@`$`0+1@`````HY</`&,P@!@#`"```I8E$$,`(``"I@``HI<"
+M$0(`#P!",%```J8``**7`A("`#\`0C"V"0`(*``"I@(``B0*`&)4`@`"E@``
+MHI<"$0(`#P!",%8``J8``**7`A("`#\`0C`N``*F`@`"E@0`0BQB`$!4`@`#
+ME@``HI>"$P(`$@`"IBTH(`(!`"(F__]1,*`!8HXM(&`""?A``"TPH`-V`$`0
+M+1@`````HY<'`&,P@!@#`!(``I8E$$,`$@`"I@``HI?"$`(`?P!",`H``J8`
+M`**7@A("``\`0C!"``*F``"BEX(3`@`:``*F+2@@`@$`(B;__U$PH`%BCBT@
+M8`()^$``+3"@`UP`0!`M&`````"CEP\`8S"`&`,`&@`"EB400P`:``*F``"B
+MEP(1`@`/`$(P2@`"I@``HI<"$@(`/P!","(``J8``**7@A,"`%(``J8M*"`"
+M`0`B)O__43"@`6*.+2!@`@GX0``M,*`#0@!`$"T8`````*.7`P!C,(`8`P!2
+M``*6)1!#`%(``J8``**7@A`"`#\`0C`J``*F``"BEP(2`@`/`$(P6@`"I@``
+MHI<"$P(`,@`"IBTH(`(!`"(F__]1,*`!8HXM(&`""?A``"TPH`,H`$`0+1@`
+M````HY<#`&,P`!D#`#(``I8E$$,`-`H`"#(``J8#``(D&`!B%`$`0B8``**7
+M@A,"`%@``J8M*"`"`0`B)O__43"@`6*.+2!@`@GX0``M,*`#$@!`$"T8````
+M`**7`P!",(`0`@!8``.6)1AB`%@``Z8``**7@A`"`#\`0C`P``*F`0!")O__
+M4C`4`.*6*Q!"`IC^0!1`$!(``0`#)"T08`!X`+_?<`"^WV@`M]]@`+;?6`"U
+MWU``M-](`+/?0`"RWS@`L=\P`+#?"`#@`X``O2<M0(``%`"BE!0`@J06`(F4
+M`0`B,0(`0!`M:````0`-)$(0"0`!`$(P!`!`$((0"0`!`*(E__]-,((0"0`!
+M`$(P!`!`$,(0"0`!`*(E__]-,,(0"0`!`$(P!`!`4!0`HI0!`*(E__]-,!0`
+MHI0V`$`0+5````0`#"0!``LD!0`.)$`0"@`A&$4```!DE"$82````&2D(1!*
+M```9`@`A$$,`0!`"`"$02``8`$2D'`!-I"TX```M(```0!`*`"$02@`A$$,`
+M0#`"`$`0!``A$$0`P!`"`"$0P@`A&$@`!Q")``$`0C`'`$`0'@!DI`$`XB3_
+M_T<P"0#K%"``;*2/"@`((`!NI$`0!``A$$0`P!`"`"$0P@`A$$@`(`!`I`$`
+M@B3__T0P!`""+.C_0!1`$`0``0!")?__2C`4`**4*Q!"`=#_0!1`$`H`"`#@
+M`P````#P_[TG+7B@`*W>`B0``**G`@"BIP0`HJ<&`**G+7```!8`Q)0M4```
+M`P`%)",8J@`'$&0``0!",`8`0!`!`$(E0!`.`"$070```$.D`0#.)0$`0B7_
+M_THP!`!"+?3_0!0C&*H`%`#BE10`PJ3__T(P1@!`$"UH``!`$`T`(1!-```9
+M`@`A$$,`0!`"`"$8X@$8`&LD(1!&`!@`8Y08`$.D-`#`$2U0``!`$`T`(1!-
+M```9`@`A$$,`0&`"`$`@"@`A$)T```!#E$`0`P`A$$,`P!`"`"$0@@$A$$8`
+M'@!()"$@BP`,`(*$@!`"``X``J4$`(*4!``"I0$`!R0"``*5+4A``"L0X@`6
+M`$`0`0!")4`H!P`A**@`@!@'`"$8:@!`&`,`(1AK`#0`9(1`(`0`#`"BE"$0
+M1``.`**D`@"BE`P`8Y0A$$,`!`"BI`$`XB3__T<P*Q#I`.[_0!1`*`<``0!"
+M)?__2C`K$$X!U/]`%$`@"@`!`*(E__]-,!0`PI0K$*(!O?]`%$`0#0`!``(D
+M"`#@`Q``O2>P_[TG0`"__S@`M?\P`+3_*`"S_R``LO\8`+'_$`"P_RV@@``M
+M@*`````"//@!0B0'`$-H``!#;`<`H[,``*.W+:@``````CP``$(D"?A``!0$
+M!"2$`$`0+8A``!8``I8K`$`0T``3EBT@(`(```(\``!")`GX0``4!`4D:``"
+MEA8`(J8M((`"+2@``BTP(`(M.&`""@`()````CS$(4(D"?A``"U(``!J`$`0
+M9`T2)F@``I86`$*F+2!``@```CP@*4(D"?A``"TH(`(M((`"+2@@`@```CQP
+M*D(D"?A``"TP0`);`$`0`````!H`(I9`$`(`(1!=`/[_0Y04`"*6&`!#`!(0
+M```AF&("!0!S)AH``I8L`$!0'``"EBT@(`(```(\``!")`GX0``4!`4D:@`"
+MEA8`(J8M((`"+2@``BTP(`(M.&`"!``()````CS$(4(D"?A```$`"20]`$`0
+M>!$2)FH``I86`$*F+2!``@```CP@*4(D"?A``"TH(`(M((`"+2@@`@```CQP
+M*D(D"?A``"TP0`(N`$`0`````!H`(I9`$`(`(1!=`/[_0Y04`"*6&`!#`!(0
+M```AF&("`@!S)AP``I8B`$!0`0`5)"T@(`(```(\``!")`GX0``4!`4D;``"
+MEA8`(J8M((`"+2@``BTP(`(M.&`"!``()````CS$(4(D"?A```(`"200`$`0
+MC!42)FP``I86`$*F+2!``@```CP@*4(D"?A``"TH(`(M((`"+2@@`@```CQP
+M*D(D"?A``"TP0`(!`$!4`0`5)`0`(!(```(\``!")`GX0``M("`"+1"@`D``
+MO]\X`+7?,`"TWR@`L]\@`++?&`"QWQ``L-\(`.`#4`"])Z#_O2=8`+__4`"^
+M_T@`M_]``+;_.`"U_S``M/\H`+/_(`"R_Q@`L?\0`+#_+9"`````HI0`0$(L
+M"`!`%"V8H``N`*.4`0`")`4`8E0``&*6```"/,D+``B4&T(D``!BE@!00BP-
+M`$`4+:@``"X`8Y8"``(D"@!B5```8I8M($`"+2A@`@```CP(+$(D"?A`````
+M``"##``(+1A`````8I8#,$(L`@!`$%`!$20``1$D`0`")`\`HA("`*(J!0!`
+M$`(``B0'`*`2!0`Q)H,,``@M&```#P"B4AP`8I;R"P`(+1@``'8!=I9X`7`F
+M]`L`"&(!=R8:`&*6F@!`4`$`M28W`#$F@`-VECX$<";T"P`(B`-W)I,`0%`!
+M`+4F1@`Q)H`#=I:B`W`F]`L`"((#=R:$#``(+1!@`(D`P!(MH``````"/$@3
+M7B1`$!0`(1!7````0I0```*F+2@@`@$`,2:@`4*.+2!``@GX0``M,*`#@`!`
+M$"T8`````**7@A("``0``J8``**7`A$"`#\`0C`"``*F``"BEX`0`@`_`$(P
+M'@`"IBTH(`(!`#$FH`%"CBT@0`()^$``+3"@`VT`0!`M&`````"CEX(;`P`>
+M``*6)1!#`!X``J8``**7`A("`#\`0C`@``*F``"BEX(0`@`_`$(P(@`"I@``
+MHI<`$0(`/P!","0``J8M*"`"`0`Q)J`!0HXM($`""?A``"TPH`-4`$`0+1@`
+M````HY<"&P,`)``"EB400P`D``*F``"BEX(1`@`_`$(P)@`"I@``HI<_`$(P
+M*``"IBTH(`(!`#$FH`%"CBT@0`()^$``+3"@`T``0!`M&`````"BEX(2`@`J
+M``*F``"BEP(1`@`_`$(P+``"I@``HI>`$`(`/P!","X``J8M*"`"`0`Q)J`!
+M0HXM($`""?A``"TPH`,M`$`0+1@`````HY>"&P,`+@`"EB400P`N``*F``"B
+MEP(2`@`_`$(P,``"I@``HI>"$`(`/P!",#(``J8"``66!``&E@@`!R8)^,`#
+M+2!@`@8``I8M,$``#@!`$"TH``!`(`4`(2"0`!X`@X1`$`,`(1!#`,`0`@`A
+M$$,`0!`"`!X`@J0!`*4D*A"F`/7_0!1`(`4``0"4)BH0E@)[_T`4-``0)@$`
+MM28#`*(J3?]`5```8I8!``,D+1!@`%@`O]]0`+[?2`"WWT``MM\X`+7?,`"T
+MWR@`L]\@`++?&`"QWQ``L-\(`.`#8`"])Z#_O2=8`+__4`"^_T@`M_]``+;_
+M.`"U_S``M/\H`+/_(`"R_Q@`L?\0`+#_+9B``"V(H``MJ``````BE@!`0BP$
+M`$!4```BEB0`(I:I#``(J_]2)`,P0BP"`$`04`$2)``!$B0!``(D#P"B$@(`
+MHBH%`$`0`@`")`<`H!)5`%(F+`T`""T8```/`*)2'``BELD,``@M&```"``7
+M)-P$,";+#``(V@0V)AH`(I9L`$!0`0"U)F4`4B8"`!<D3@4P)LL,``A,!38F
+M90!`4`$`M29I`%(F`P`7)"X%,";+#``(+`4V)BT-``@M$&````#`IEH`X!(M
+MH``````"/.`37B0M*$`"`0!2)J`!8HXM(&`""?A``"TPH`-5`$`0+1@`````
+M(I8#,$(L`P!`%```HI??#``(`A("`$(2`@`(``*F"``%ED(`H%`!`)0F!0"@
+M%@```SP)^,`#+2`@`NT,``@(``*F0!1C)`GX8``M("`""``"I@``(I8#,$(L
+M!P!`%```HI>"$`(`/P!",`8``J8``**7_`P`"``1`@#"$`(`/P!",`8``J8`
+M`**7P!`"`#\`0C`$``*F+2A``@$`4B:@`6*.+2!@`@GX0``M,*`#)P!`$"T8
+M`````"*6`S!"+`L`0!0``*.7`AL#``0``I8E$$,`!``"I@``HI>"$0(`/P!"
+M,`(``J8>#0`(``"BET(;`P`$``*6)1!#``0``J8``**7PA$"`#\`0C`"``*F
+M``"BET(0`@`_`$(P```"I@``PI8!`$(D``#"I@$`E"8J$)<"JO]`%`H`$"8!
+M`+4F`P"B*G7_0%0``"*6`0`#)"T08`!8`+_?4`"^WT@`M]]``+;?.`"UWS``
+MM-\H`+/?(`"RWQ@`L=\0`+#?"`#@`V``O2>@_[TG6`"__U``OO](`+?_0`"V
+M_S@`M?\P`+3_*`"S_R``LO\8`+'_$`"P_RV@@``MJ*````"BE`!`0BP$`$`4
+M9`6S)"0`LI12#0`(&@!2)@``HI0#,$(L`@!`$+\!$B1O`1(D!`&BEND`0!`M
+MN```0!`7`"$050`&`4*4!@!`%```HI8#,$(LW`!`5`<`4B8X#@`("`!2)@,P
+M0BPS`$`4+8@``"TH0`(!`%(FH`&"CBT@@`()^$``+3"@`]4`0!`M&```P!@1
+M`"$8<P```**7`A("````8J0``**3"`!BI`(`,28(`"(J[_]`%"TH0`(MB```
+M`0!2)J`!@HXM((`""?A``"TPH`/"`$`0+1@``,`@$0`A(),```"CEP(2`P`_
+M`$(P`@""I((;`P`!`&,P!`"#K`@`A"0``**7/P!",`(`@J0``**7@A$"``$`
+M0C`$`(*L`@`Q)@@`(BKE_T`4+2A``A8.``@MB```+2A``@$`4B:@`8*.+2"`
+M`@GX0``M,*`#HP!`$"T8`````*.70A(#````8J:"$`,`?P!",`@`8J9`&0,`
+M?P!C,!``8Z8M*$`"`0!2)J`!@HXM((`""?A``"TPH`.2`$`0+1@`````HY?"
+M(@,`$`!BEB401``0`&*F`A$#`'\`0C`8`&*FP!@#`'\`8S`@`&.F+2A``@$`
+M4B:@`8*.+2"``@GX0``M,*`#?P!`$"T8`````*.70B,#`"``8I8E$$0`(`!B
+MIH(1`P!_`$(P*`!BID`8`P!_`&,P,`!CIBTH0`(!`%(FH`&"CBT@@`()^$``
+M+3"@`VP`0!`M&`````"CE\(C`P`P`&*6)1!$`#``8J8"$@,`?P!",#@`8J:"
+M$`,`/P!",`(`8J8`&0,`/P!C,`H`8Z8M*$`"`0!2)J`!@HXM((`""?A``"TP
+MH`-6`$`0+1@`````HY<"(P,`"@!BEB401``*`&*F@AD#`#\`8S`2`&.F``"B
+MES\`0C`:`&*F+2A``@$`4B:@`8*.+2"``@GX0``M,*`#0P!`$"T8`````*.7
+M@A(#`"(`8J8"$0,`/P!","H`8J:`&`,`/P!C,#(`8Z8M*$`"`0!2)J`!@HXM
+M((`""?A``"TPH`,R`$`0+1@`````HI>"(P(`,@!CEB489``R`&.F`A("`#\`
+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
+M8HXM(&`""?A``"TPH`,X`$`0!`"@KX`0%``A$%(```"CEY`#0Z0!`)0F!0""
+M*N?_0!0!`#$F``!"E@,P0BP'`$!0``!"ELK_`B1<`$*F__\")%X`0J9@`$*F
+M``!"E@,P0BP'`$!0``!"E@\``B1$`$*F'``")$8`0J9(`$*F``!"E@!`0BP$
+M`$`4H`%BCBT@8`+`$0`(R@`%)"T@8`+/``4D"?A``"TPH`,1`$`0!`"@KP``
+MHI<8`$*F%@!"E@L`0!0!``(D``!"E@!`0BP$`$`4&`!"EL,2`@#1$0`(`0!"
+M,,(3`@`6`$*F`0`")`0`HJ\$`**/4`"_WT@`M]]``+;?.`"UWS``M-\H`+/?
+M(`"RWQ@`L=\0`+#?"`#@`V``O2?@_[TG$`"__P@`L?\``+#_+8"``````CPL
+M.4(D"?A``"V(H``<`$`0+1@``"T@``(```(\=!1")`GX0``M*"`"%0!`$"T8
+M```M(``"```"/)@N0B0)^$``+2@@`@X`0!`M&```+2```@```CQ`,D(D"?A`
+M`"TH(`('`$`0+1@``"T@``(```(\Y#1")`GX0``M*"`"+1A``"T08``0`+_?
+M"`"QWP``L-\(`.`#(`"])_#_O2<``+__``"BE`!`0BP)`$`4``"_WRX`HY0!
+M``(D!0!B%````CR<($(D"?A``````````+_?"`#@`Q``O2<``(.4``"BE`4`
+M8E0``(24`@"$E/#!A#`"`**4\,%",",@@@`(`.`#+1"```@"@I0(`.`#_[]"
+M,"T8``#`$`,`(1!$````0MP&`$`4+2@```$`8R0"`&(H^?]`5,`0`P`!``4D
+M"`#@`RT0H`#P_[TG``"__P```CR<2$(D"?A````````M($```!0"`!$`000M
+M&```_W^$,````CS@"48D@!`#`"$00P"`$`(`(1!&````0I03`$00`0`%)`$`
+M8R2#`&(L]_]`%(`0`P!=$@`(+2@``````CPX`$8D0!$#`"$01@```$*4!@!$
+M$`$`!20!`&,D2P!B+/G_0!1`$0,`+2@``"T0H````+_?"`#@`Q``O2?P_[TG
+M"`"__P``L/___[`P)@``$@$`!20```(\G$A")`GX0```````+3!````4`@`'
+M`$$$_P$")/__`CS_?T(T)!#"`"80`@*,$@`(`0!%+!8`PA`!``4D`P#`5"T@
+M``"-$@`(+1"@`````CS@"4<D@!`$`"$01`"`$`(`(1A'````8I0%`%!4`0"$
+M)`(`8I0&`$80`0`%)`$`A"2#`((L]/]`%(`0!``M*```+1"@``@`O]\``+#?
+M"`#@`Q``O2?@_[TG&`"__Q``LO\(`+'_``"P_RV(H`"<`8*,"?A``"V0P``M
+M@$``0@!",`<`0!`@``(R"``BC@0`0!0@``(RO?\")"2``@(@``(R!P!`$`@`
+M`C(,`"*.!`!`%`@``C+?_P(D)(`"`@@``C('`$`0`0`",@0`(HX$`$`4`0`"
+M,O?_`B0D@`("`0`",@H`0!`M$``"```"/*A(0B0)^$``(`!$)@0`0!`M$``"
+M_O\")"2``@(M$``"&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TG8/^])Y@`O_^0
+M`++_B`"Q_X``L/\MB(``__^D,````CPH3$(D"?A``"V0```1`$`0+8!``"T@
+M(`(M*$``?_\&-````CS$34(D"?A``"TXH`,)`$`0+1!``BT@(`(M*``"```"
+M/$1*0B0)^$``+3"@`RV00``M$$`"F`"_WY``LM^(`+'?@`"PWP@`X`.@`+TG
+M\/^])P@`O_\``+#_```"/)Q(0B0)^$``+8"``"T80``2``(D"P!B$!,`8B@%
+M`$`0_P$")`H`8%`*`@.6!1,`""TH```%`&(02H,"-`@`8E0M*```!1,`"`$`
+M!20*`@.62@,")`(`8A`!``4D+2@``"T0H``(`+_?``"PWP@`X`,0`+TG__^$
+M,"TH``````(\X`E&)(`0!0`A$$4`@!`"`"$01@```$.4!@!D$``````!`*4D
+M@P"B+/?_0%2`$`4`+1````@`X`,`````X/^])Q``O_\(`+'_```"/)Q(0B0)
+M^$````"P_RV(0```%`(`"0!!!"T@``#_?S`R```"/"A,0B0)^$``+2```A,`
+M0!0M$``"+2```````CPX`$4D0!$$`"$810```&*4!@!15`$`A"08`&*4!P!`
+M%"V`0`!+``0D`0"$)$L`@BSU_T`40!$$`"V````M$``"$`"_WP@`L=\``+#?
+M"`#@`R``O2?P_[TG``"__RTXH``M&``````"/&`D1B3`$0,`(2A&````HI0*
+M`$14`0!C)`P`X%`!``(D+2#@`````CP``$(D"?A``(``!B1=$P`(`0`")#$`
+M8BSQ_T`4P!$#`"T0`````+_?"`#@`Q``O2<.`(`0+2@``"T8``````(\.`!&
+M)$`1`P`A$$8```!"E`8`1!`!``4D`0!C)$L`8BSY_T!40!$#`"TH```(`.`#
+M+1"@`+#_O2=``+__.`"W_S``MO\H`+7_(`"T_Q@`L_\0`++_"`"Q_P``L/\M
+MN(``+9"@`"V@X`#__]$P+9@``"VH`````**4%P!`%"VP``````(\G$A")`GX
+M0```````+8!````4`@`/`$`$+2```@```CP434(D"?A``"TH```*`$`4+2``
+M`@```CR`34(D"?A``"T@``($`$!0`@!$EIL3``@M(``"`@!$E@#_@C!$`$`4
+M+3```"TX``````(\.`!%)$`1!@`A&$4```!BE`,`1!0!`,8D+:A@``$`!R1+
+M`,(L!0!`$`````#V_^!00!$&`+(3``B``"(R1@#@$"T0``"``"(R`P!`%(``
+M(C("`*26"`"SG@,`0!`M,```!`"DE@P`LYXM.``````"/)@)2"3`$`8`(1!&
+M`(`0`@`A*$@```"BE`<`1!0!`,8DV`'CC@0`HHP#`&(4`````"VPH``!``<D
+M`@#"+`4`0!``````\/_@4,`0!@#4$P`(@``B,A``X!````(\@``B,@8`0!2`
+M`"(R"`#"GB288@(,`,*>)9AB`H``(C(&`$!0```"/!``PIXDF&("%`#"GB68
+M8@(```(\%$U")`GX0``M*(`"+3A```\`X!`M$```$`""WA``H]XD$$,`$`""
+M_@(`0I8`_T(P!P!`%`$``B0&`&`20`"_WSP0$P`_$`(`&`""K@$``B1``+_?
+M.`"WWS``MM\H`+7?(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#4`"])P(`@00M
+M&(``/P"#)(,9`P`!``(D%!""`,`8`P`A&&4```!CW"000P`K$`(`/!`"``@`
+MX`,_$`(`_P#G,!,`X!`M&(``"P"@$"T@```A$&0```!"D`T`1Q``````!0!`
+M$``````!`(0D*Q"%`/C_0!0A$&0`!0"%$"$09````$>@``#"C`$`0B0``,*L
+M"`#@`P`````P_KTGR`&__\`!OO^X`;?_L`&V_Z@!M?^@`;3_F`&S_Y`!LO^(
+M`;'_@`&P_RV(@``MJ*``+9C``$@!IZ\MN``!+?`@`4P!JJ___W`QT`&VEU@;
+M`B14`:*O,`*4)````CS<2$(D"?A``"V0``"Y`4`0+1@``````CQP3$(D"?A`
+M`"T@(`(*`B*F__]",`L`0!0```(\+2`@`@```CR$24(D"?A``"TH``*J`4`0
+M+1@``/\_`C(*`B*F```"/'A>0B0)^$``+2`@`@```CPH3$(D"?A```H"))8M
+M@$``G0%`$"T8```M("`"+2A``'__!C0```(\Q$U")`GX0``M.*`#E`%`$"T8
+M```M("`"+2@``H``!B0```(\Q$U")`GX0`"``*<GBP%`$"T8```(`*+?!0!"
+M,`$`0%0!`!(D"`"BWP(`0C`!`$!4`@`2)`P"(HX!`$)6#`(RKBT@(`(M*``"
+M```"/$1*0B0)^$``+3"@`U`!HJ_4`:*/`P!`%$$`8BX0`!"65`&PKP(`0!18
+M`:"O0``3).`!(M[X&@(`/Q@#``$`8S!H`:.ON!("`#\0`@`!`$(P9`&BKP``
+M`CPX`E`D&``")BL0`@(C`4`06`&BCP```I8D$,("&0%`4`0`$"8```*64`&C
+MCR000P`4`4!0!``0)@(`!9:8`2*.+2`@`@(!IB<)^$````&G)PP!0%`$`!`F
+M```#E@0``B0I`&)0@`"C)P4`8B@)`$`0(``")`$``B0<`&)0<`&]KP(`!"01
+M`&10<`&]K[85``@$`!`F+@!B$(``I"<A`&(H!@!`$$```B0(``(D'P!B$(``
+MHB>V%0`(!``0)BP`8E!P`;VOMA4`"`0`$"8P`*(G;`&BKP```SS`&F,D>`&C
+MKP(`HI/X%``(`P!"-"``I"=L`:2O```"/"`40B1X`:*O^!0`"`(`HI-P`:.O
+MT`"D)VP!I*\```(\`!Y")'@!HJ^"`**3^!0`"`$`0C1P`:*OX`"C)VP!HZ\`
+M``(\("%")'@!HJ^"`**3^!0`"`(`0C1P`:2O\`"B)VP!HJ\```(\P"-")'@!
+MHJ_W%``(@@"BDT``HR=L`:.O```$/,`:A"1X`:2O`@"BDP0`0C1@`:*O```"
+M/*A(0B0)^$``;`&DC[@`0%0$`!`F7`&@KUP!I(\```,\!%!C)`GX8`!L`:6/
+MJP!`$%P!I(]`$00`>`&CCR$08@!T`:*O&`!'D"T@X`(M*,`#```"/#Q00B0)
+M^$``3`&FCW0!HX\``'*4`@!BE"L04@":`$`47`&DCP(!HI<K$$("C@!`%'0!
+MHX\``:*7*Q!2`(L`0%0'`&*0=`&DCP8`@I`*``,D!0!#%'0!HX]H`:2/@P"`
+M4`<`8I!T`:./!@!BD`4`!"0%`$04=`&CCV0!HH][`$!0!P!BD'0!HX\'`&*0
+M(1!"`L(?`@`A$$,`0Q`"`%0!I(\*`(,D*AAB`&\`8!1T`:./6`&CCRL0<P!^
+M`$`06`&BCW0!I(\0`(+<!0!!!'`!HX_8`:*/9`!`$'0!HX]P`:./&`!BC(``
+M0C`$`$`0!@`")-P!(XY<`&(0=`&CCP@!I"<```(\``!")`GX0`!```4D"`&R
+MIP(``I8*`:*G=`&DCP8`@Y`%``0D!0!D$`H`!"0&`&00`$!"-&05``AT`:./
+M"@&BEP"``R0E$$,`"@&BIW0!HX\$`&*0#0&BHP4`8I`B`:*C<`&DCQ@`@HPD
+M`:*O8`&BCR@!HJ\0`&+<$`"#W"000P`$`$!0"@&BEPH!HI=V%0`(``)"-/_]
+M0C`*`:*G=`&CCP@`8MQP`:2/"`"#W"000P`#`$!0#`&@HP(``B0,`:*C=`&C
+MCP@`8MQP`:2/"`"#W"000P`"`$(P!0!`$'`!HX\,`:*3"`!"-`P!HJ-P`:./
+M&`!BC$``0C`%`$`06`&DCPP!HI,$`$(T#`&BHU@!I(^`&00`(1AT``@!HM\`
+M`&+\$`&BWP@`8OP8`:+?$`!B_"`!HM\8`&+\*`&BWR``8OPP`:+?*`!B_#@!
+MHM\P`&+\0`&BWS@`8OP!`(0D6`&DKW0!HX\'`&*0(1!"`O__4C`"`&*4*Q!2
+M`&K_0!`"`:*77`&DCP$`A"2``((H3/]`%%P!I*\$`!`F```"/%`"0B0K$`("
+MX?Y`5````I98`:*/.`!`4%@!HH]!`$(L`P!`%"T@@`)```,D6`&CKU@!I8]`
+M``8D```'/````CR<6D(D"?A``'!(YR18`:2/,!(DKA(`@!@M*```P"`%`"$@
+ME0"`&04`(1AT````8I0``(*D`@!BE`(`@J0$`&*0!`""H`4`8I`%`(*@`0"E
+M)%@!HX\J$*,`\?]`%,`@!0"\`2*.+2`@`BTHH`()^$``6`&FCU@!I(\.`(`8
+M+2@``(`A!0`A()0`P!`%`"$050`&`$.0!@"#H`<`0I`'`(*@`0"E)%@!HX\J
+M$*,`]?]`%(`A!0!8`:*/2`&DCP``@JP*`B*6&``BIE@!I(\K&`0`+1!@`,@!
+MO]_``;[?N`&WW[`!MM^H`;7?H`&TWY@!L]^0`;+?B`&QWX`!L-\(`.`#T`&]
+M)P(`IY0T$H:,"0#`$/#!YS```,.4``"BE`8`8A0P`H@D`@##E/#!8C`2`$=0
+M!`#"D#`"B"0P$H2,(`"`4"T8`````*640Q`$`(`1`@`A,`(!``#"E",0H@`0
+M`$`4``````(`PY3PP6(P"@!'5`(`PI0$`,*0`0!",!``0%`M&,```@!B,`T`
+M0!0M&```-Q8`""T8P`#PP4(P(Q#B``0`0%A#(`0`0`#()/__A"1#(`0`Y?^`
+M5$,0!``M&```"`#@`RT08`#P_[TG"`"__P``L/\```(\``!")`GX0``M@,``
+M"0!`$"T8```:`$*`0!`"`",0`@(`%@(``Q8"``(`000M&$``+1@``"T08``(
+M`+_?``"PWP@`X`,0`+TGT/^])R``O_\8`+/_$`"R_P@`L?\``+#_+8"``"V(
+MH``*`H*4)`!`%/\`$R0```(\G$A2)`GX0`(`````\`!",&```R0'`$-0`@`B
+ME@GX0`(M(``"F0$#)!@`0U0M(``"`@`BEJ``0C"@``,D)0!#$.$`$R0"`"*6
+MT`!",,```R0@`$,0X@`3)`(`(I;0`$(PT``#)!L`0Q#D`!,D`@`BEE`!0C!0
+M`0,D%@!#$.,`$R20%@`(X``3)"T@``(```(\``!")`GX0``M*"`"#0!`$,``
+M`R0@`%.,`@`BEL``0C`)`$,4+1!@`@\`8S(!``(D!0!B%"T08`+P_P(D))AB
+M`@(`<S8M$&`"(`"_WQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])_#_O2<``+__
+M```"/```0B0)^$````````0`0!`M&```'`!"C(,0`@`!`$,P+1!@````O]\(
+M`.`#$`"])\#_O2<X`+__,`"V_R@`M?\@`+3_&`"S_Q``LO\(`+'_``"P_RV0
+MP``ML.``+:"``/__M20;`*`2(9B&`"L0DP(5`$`0+8A@`B.`,@(M(``""?C`
+M`BTH(`(0`$!8__^U)BT@(`(M*$`"```#D@``@I````*B`0`0)@``@Z#__Z4D
+M^?^@%`$`A"0CB#("*Q"1`N[_0%0C@#("__^U)N?_H!8AF'(".`"_WS``MM\H
+M`+7?(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#0`"])]#_O2<@`+__&`"Q_Q``
+ML/\M@(``+8B``*`!@HS!``4D"?A```(`IB<7`$`0+1@```(`HI<`0$(L`@!`
+M$,H`!23/``4DH`$BCBT@(`()^$``+3"@`PP`0!`M&````@"BEP!`0BP%`$!4
+M``"BAP``HI?#$@(`^A8`"`$`0C#"%P(`/!("KCP2`XXM$&``(`"_WQ@`L=\0
+M`+#?"`#@`S``O2?P_[TG"`"__P``L/\```(\G$A")`GX0``M@(``+1A``$@`
+M`B0E`&(0```"/$D`8B@+`$`0C8$"-$(`8B@<`$`00P`")$``8B@<`$`0```"
+M/!``8%`*`@.6-A<`""T0```J$$,`$@!`%(^!`C2(@0(T*A!B`!$`0!````(\
+MMO]B)`,`0BP2`$!0+1```#$7``@```(\B`%B*`T`0!0M$```C@%B*`4`0!0`
+M``(\CP$")`<`8E0M$``````"/&A;0B0)^$``+2```C<7``@(`+_?"`"_WP``
+ML-\(`.`#$`"])]#_O2<H`+__(`"R_Q@`L?\0`+#_+9"``/__L#`MB(``H`&"
+MC,$`!20)^$``+3"@`R``0!`H`+_?+1@``````CS@/$4D0!`#`"$00P!`$`(`
+M(2!%````@I02`%!4`0!C)```HI<#4$(L`P!`4$`0`P!<%P`(`@""E"$00P!`
+M$`(`(1!%``0`0I0(`B*F```"/'!,0B0)^$``+2!``F87``@*`B*F#@!B+.?_
+M0!1`$`,`*`"_WR``LM\8`+'?$`"PWP@`X`,P`+TGT/^])R@`O_\@`++_&`"Q
+M_Q``L/\MD(``__^P,"V(@`"@`8*,P0`%)`GX0``M,*`#(`!`$"@`O]\M&```
+M```"/#@]121`$`,`(1!#`$`0`@`A($4```""E!(`4%0!`&,D``"BEP-00BP#
+M`$!00!`#`(X7``@"`(*4(1!#`$`0`@`A$$4`!`!"E`@"(J8```(\<$Q")`GX
+M0``M($`"F!<`"`H"(J8'`&(LY_]`%$`0`P`H`+_?(`"RWQ@`L=\0`+#?"`#@
+M`S``O2?@_[TG$`"__P@`L?\``+#_```"/`A<0B0)^$``+8"``!(`0!`0`+_?
+MY`$"C@$`0C`/`$`0"`"QWP@"!98%`*!0"@(%EBT@``(```(\MA<`".A<0B0M
+M(``"```"/+!=0B0)^$```````!``O]\(`+'?``"PWP@`X`,@`+TG(/^])]``
+MO__(`+?_P`"V_[@`M?^P`+3_J`"S_Z``LO^8`+'_D`"P_RV@H``MJ,``+;#@
+M`"VX``'__Y(P```"/```0B0)^$``"!0$)"V(0`!]`4`0`@`0)"V80``M($``
+M```%/%`"I20```(\``!")`GX0`!P$@8D#``TKA``-:X4`#:NR`$RILH!(*8\
+M``(D_`$BI@`"(*X#``(D-!,BKO03(*X`!P(D^!,BKO__`B3\$R*N`!0BK@04
+M(JXM("`"```"/```0B0)^$``+2@``%T!0!`#`!`D`0`"),P!(JXM("`"```0
+M/```$"8)^``"($`%)/\`0C#0`2*F+2`@`@GX``(8F`4TT@$BIM8!(*8M("`"
+MT)@%-````CP``$(D"?A``!8<!B0MD``````"/```4"0M(&`"@)@%-`GX``(!
+M``8\`0!2)@0`0B[Z_T`4+2!@`@``$#P``!`F"?@``@"<!30"%P(`+2!`````
+M`CP``$(D"?A```0`!20!`$(DU`%BIBT@8`()^``"$$`%)"V@0``!`$8T+2!@
+M`@```CP``$(D"?A``!!`!20M(&`"/0`%)````CP``$(D"?A``(``IB<:`4`0
+M"``0)(``HY>E6@(D%@%B%`0`$"0M(&`"/P`%)````CP``$(D"?A``(``IB<.
+M`4`0"``0)(``HI=R$B*F+2!@`L$`!20```(\``!")`GX0`"``*8G!`%`$`@`
+M$"2``**7`A,"`'`2(J;__T,P`0`")/T`8A0%`!`D+:@``"V0``````(\``!0
+M),``129`$!(`(3"B`PGX``(M(&`"\0!`$$`0$@`A$%T```!"E":HH@(!`%(F
+M0`!"+O3_0!3``$4F__\"-.@`HA8'`!`D+2!@`K\`!20```(\``!")`GX0`"`
+M`*8GX`!`$`@`$"2``**3"`)BI@0`HI=T$B*F!@"BEW82(J8(`**3>!(BH@@`
+MHI<"$@(`>1(BH@H`HI-[$B*B"@"BEP(2`@!Z$B*B#`"BEP(2`@!^$B*B#`"B
+MDW\2(J(.`**7`A("`(`2(J(.`**3@1(BHA``HI,!`$(P?!(BHA``HI="$`(`
+M!P!",'T2(J(```(\``!"),`!8JXMD```"0`&),`8$@`C&'(`@!@#`"$8<@`A
+M&","@A)E)$`@!@`A()T```""E((2`@""$F*@``""E`(1`@`_`$(P"P"BH```
+M@I2`$`(`/`!",`(`@Y2"&P,`)1!#``$`HJ`"`(*4`A("`#\`0C`,`**@`@""
+ME((0`@`_`$(P`@"BH`(`@I0`$0(`,`!",`0`@Y0"&P,`)1!#``T`HJ`$`(*4
+M@A$"`#\`0C`#`**@!`""D#\`0C`.`**@!@""E((2`@`$`**@!@""E`(1`@`_
+M`$(P#P"BH`8`@I2`$`(`/`!",`@`@Y2"&P,`)1!#``4`HJ`(`(*4`A("`#\`
+M0C`0`**@"`""E((0`@`_`$(P!@"BH`@`@I0`$0(`,`!",`H`@Y0"&P,`)1!#
+M`!$`HJ`*`(*4@A$"`#\`0C`'`**@"@""D#\`0C`2`**@#`""E((2`@`(`**@
+M#`""E`(1`@`_`$(P$P"BH`P`@I2`$`(`/`!",`X`@Y2"&P,`)1!#``D`HJ`.
+M`(*4`A("`#\`0C`4`**@#@""E((0`@`_`$(P"@"BH`X`@I0`$0(`,`!",!``
+M@Y0"&P,`)1!#`!4`HJ`0`(*4@A$"`#\`0C`6`**@$`""D#\`0C`7`**@$@""
+ME((2`@`8`**@$@""E`(1`@`_`$(P&0"BH!(`@I2`$`(`/`!",!0`@Y2"&P,`
+M)1!#`!H`HJ`4`(*4`A("`#\`0C`;`**@%`""E((0`@`_`$(P'`"BH`$`4B8%
+M`$(N<_]`%`L`QB0```(\W&5")`GX0``M(&`"+:@``"V0```?`!8D```"/```
+M4"0C*-("+2!@`@GX``*``*8G&@!`$(``HI<AJ*("0!@2`"$8<0`"$@(`$Q-B
+MH(``HI,4$V*@`0!2)@,`0B[Q_T!4(RC2`@0`H!("``(\_?]"-`,`HA8M(&`"
+M21D`"`D`$"000`4D```"/```0B0)^$``+3"``E<9``@M$&`"3QD`"`@`$"0(
+M`!`D+2!@`A!`!20```(\``!")`GX0``M,(`"!``@$@```CP``$(D"?A``"T@
+M(`(!`.!6``#PKBT0``#0`+_?R`"WW\``MM^X`+7?L`"TWZ@`L]^@`++?F`"Q
+MWY``L-\(`.`#X`"])_#_O2<``+__```"/```0B0)^$``````````O]\(`.`#
+M$`"])P`!I3`&`*`0+1`````4`B0``,*D-A4")```XJ0!``(D"`#@`P`````(
+M`.`#`0`").`!A20$`**,`0!"-`0`HJP`%`(D#`"BI#85`B0.`**DX`&#C`(`
+M8S3^_P(\__]"-"088@#@`8.L`P`")`@`HJ1```(D"@"BI.`!@XS?_P(\__]"
+M-"088@"__P(\__]"-"088@#@`8.L?!*"D`@`0%`/``(D2!*`I`$``B1,$H*L
+M@``"/"408@#@`8*L#P`")!0`HJP!``(D"`#@`V@2@JS@_[TG&`"__Q``LO\(
+M`+'_``"P_RV0@``MB*``+(`%-```$#P``!`F"?@``@0`)HXM($`",(`%-`GX
+M``(,`":.+2!``C2`!30)^``"$``FCBT@0`(X@`4T"?@``@@`)HXM($`")(`%
+M-`GX``(``":.&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TGT/^])R``O_\$`*6O
+MW`&#C`$``B0,`&(0```"/```0HPC$*(`P!`"``P`HJ\```(\``!"C",0H@#`
+M$`(`$`"BK]@9``@(`*6O__\")`P`HJ\0`**O`0`")`@`HJ^``0(\__]"-"00
+MP@```**O```"/```0B0)^$``+2B@`R``O]\(`.`#,`"])^#_O2<0`+__"`"Q
+M_P``L/\MB(``+(`%-```$#P``!`F"?@``BTP```M("`"```"/```0B0)^$``
+M!(`%-!```SPE$$,`7_\#//__8S0D$$,`+2`@`@2`!30)^``"+3!``"T@(`(D
+M@`4T"?@``O__!C00`+_?"`"QWP``L-\(`.`#(`"])]#_O2<@`+__&`"S_Q``
+MLO\(`+'_``"P_RV0@``MB*``$@"BE!\`0!`MF(`````"/```0B0)^$``!(`%
+M-'__`SS__V,T)!!#`"```SPE$$,`+2!``@2`!30``!`\```0)@GX``(M,$``
+M$``FEBT@0`()^``"*(`%-!(`)I8M($`""?@``DB`!304`":.P#`&`"T@0`()
+M^``"-(`%-#L:``@M($`"```"/```0B0)^$``!(`%-%__`SS__V,T)!!#`"T@
+M0`(M,$`````"/```0B0)^$``!(`%-"T@0`(L@`4T```"/```0B0)^$`````F
+MCBT@0`(```(\``!")`GX0``D@`4T@/\#/"000P`(`".6)3!#`!@`(I8&`$`0
+M+2!``@0`0B0`%`(`?P`#/"000P`E,,(````"/```0B0)^$``)(`%--`!0I8$
+M`$(L%0!`%"``O]\:`"66!P"B,!(`0%`8`+/?^!-BCO_X`R0D&$,`"`"B+`0`
+M0!``!V8T`!(%```'0C`E,&(`^!-FKBT@0`(```(\``!")`GX0``8@`4T(`"_
+MWQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])_#_O2<``+__```"/```0B0)^$``
+M"$`%)"L0`@```+_?"`#@`Q``O2?@_[TG&`"__Q``LO\(`+'_``"P_RV0@``M
+M@*`````"/```0B0)^$``'``%)"T@0`#__P(D!`""5!P30XX```"NK!H`""T0
+M```D&(,`!0$"/+K80C0D&&(`<``"/"``0C0D$((`!`!`$````ZX`0`(\)1!B
+M`````JX%`((P!0!`$,`%@C````*.`0!"-````J[`!8(P!`!`$````HY``$(T
+M```"K@```HX`0`,\)!!#``$`0%10$D2N`0`")!@`O]\0`++?"`"QWP``L-\(
+M`.`#(`"])P@`X`,<$X*,T/^])R@`O_\@`+3_&`"S_Q``LO\(`+'_``"P_RV0
+M@``M@*``'!.4C`8`@08MB(``)``%)````CP``$(D"?A``"TP```%`0(\NMA"
+M-"0P`@(!``(R`0!`5`4`QC1```(R#@!`$"T@0`(@$R*.`0!`5$``QC0D$R*.
+M`0!`5``!QC0H$R*.`0!`5(``QC0L$R*.`0!`5``$QC0M($`"```"/```4R0)
+M^&`"(``%)`4``08<$S"N+2!``B0`!20)^&`"`0`&)"T0@`(H`+_?(`"TWQ@`
+ML]\0`++?"`"QWP``L-\(`.`#,`"])P@`X`-```(D\/^])___I3!``*(L"P!`
+M$```O_]`*04`')`"-"$HH@````(\``!")`GX0````````(!",`(`0!0!``,D
+M+1@``"T08````+_?"`#@`Q``O2?@_[TG&`"__Q``LO\(`+'_``"P_RV0@`#_
+M_Z4P0`"B+"T`0!`M&```0(D%``"0!30A*"4"```0/```$"8)^``"+3````20
+M!30A*"4"+2!``@GX``(M,```")`%-"$H)0(M($`""?@``BTP```,D`4T(2@E
+M`BT@0`()^``"+3```!"0!30A*"4"+2!``@GX``(M,```%)`%-"$H)0(M($`"
+M"?@``BTP```8D`4T(2@E`BT@0`()^``"+3```!R0`C0AB"("+2!``BTH(`()
+M^``"+3````$``R0M$&``&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TGT/^])R``
+MO_\8`+/_$`"R_P@`L?\``+#_+9B``"T8P`#__Z4P0`"B+"4`0!`M(```%`#`
+M4"V0```%`-*0`)(2``0`PI`ED$("`P#&D``V!@`"`&*0`!0"`"4PP@`!`&*0
+M`!("`"4PP@```&*0)3#"`$(P!@#`%Q(`)3#"`&,;``A"D!(`+3```$")!0`8
+MD`4T(2@E`@``$#P``!`F"?@``BT@8`(<D`(T(8@B`@"`1C8M(&`""?@``BTH
+M(`(!``0D+1"``"``O]\8`+/?$`"RWP@`L=\``+#?"`#@`S``O2>@_[TG6`"_
+M_U``OO](`+?_0`"V_S@`M?\P`+3_*`"S_R``LO\8`+'_$`"P_RV@@``M\.``
+M__^U,*JJ!#P"```5JJJ$-"T@``!``*(N;0!`$"T8`````,*0:P!`%"T08``"
+M`,*4!0!"+&<`0!0M$&```@#"E`8`0BP(`$`4``"@KP(`PI0.`$(L`0`#)`,`
+M0!0``*.O`P`")```HJ\$`,>0!0#"D``2`@`E..(`!@#"D``4`@`E..(`!P#"
+MD``6`@`E..(`)CCD``D`PI``$@(`"`##D"6X0P`FN.0"___W,@H`TY`+`,*0
+M`!("`"688@(,`,*0`!0"`"688@(-`,*0`!8"`"688@(FF&0"#P#"D``2`@`.
+M`,.0);!#`":PQ`+__]8R$`#2D!$`PI``$@(`)9!"`A(`PI``%`(`)9!"`A,`
+MPI``%@(`)9!"`@(`PI0.`$(L`@!`$":01`+_`%(R0(D5``"0!30A*"4"+2"`
+M`@``$#P``!`F"?@``BTPX``$D`4T(2@E`BT@@`()^``"+3#@`@B0!30A*"4"
+M+2"``@GX``(M,&`"#)`%-"$H)0(M((`""?@``BTPP`(0D`4T(2@E`BT@@`()
+M^``"+3!``A20`C0AB"("+2"``BTH(`()^``"``"FCRT@@`(M**`"```"/```
+M0B0)^$``+3#``RT80``M$&``6`"_WU``OM](`+??0`"VWS@`M=\P`+3?*`"S
+MWR``LM\8`+'?$`"PWP@`X`-@`+TG\/^])P``O_\M$(``+2"@`!,30B0M*$``
+M```"/```0B0)^$``!@`&)```O]\(`.`#$`"])_#_O2<``+__$Q.$)````CP`
+M`$(D"?A```8`!B0!``(D``"_WP@`X`,0`+TG\/^])P``O_\M(*`````%/,`4
+MI20```(\``!")`GX0``&``8D``"_WP@`X`,0`+TG"`#@`RT0``#@_[TG$`"_
+M_P@`L?\``+#_+8"``"V(P`"`*`4````"/```0B0)^$```&"E)"T@``(`;`4D
+M`P`&)````CP``$(D"?A```(`!R0(`$`0+1@``"T@``(```(\``!")`GX0```
+M:`4D```BI@$``R0M$&``$`"_WP@`L=\``+#?"`#@`R``O2?__Z4P"`*"E`8`
+M11`,``,D<A*"E(``0C`"`$`4"P`#)`,``R0!`,!4``##K`@`X`,M$```"`#@
+M`P$``B3@_[TG&`"__Q``LO\(`+'_``"P_RV0@`!($I"4'``1,H.($0`"`!`R
+M0X`0`````CP``$(D"?A``"TH(`(F$%```0!"+"T@0`(M,$`````"/```0B0)
+M^$``+2@@`A@`O]\0`++?"`"QWP``L-\(`.`#(`"])^#_O2<0`+__"`"Q_P``
+ML/\MB(``+8"@`````CP``$(D"?A``!1`!21`@!```P`#)`08`P(G&`,`)!!#
+M``(``R0$&`,")1!#`"T@(`(M,$`````"/```0B0)^$``%$`%)`$``B00`+_?
+M"`"QWP``L-\(`.`#(`"])^#_O2<0`+__"`"Q_P``L/\MB(``+8"@`````CP`
+M`$(D"?A``!1`!21`@!```P`#)`08`P(G&`,`)!!#`"T@(`(M,$`````"/```
+M0B0)^$``%$`%)`$``B00`+_?"`"QWP``L-\(`.`#(`"])^#_O2<8`+__$`"R
+M_P@`L?\``+#_+9"``"V(H``M@,`````"/```0B0)^$``&$`%)`$``R0$&","
+M)Q@#`"000P`!`!`R!(`P`B404``M($`"+3!``````CP``$(D"?A``!A`!20!
+M``(D&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TG\/^])P@`O_\``+#_+8"@``8`
+MHBP(`$`0__\#)````CP``$(D"?A``!Q`!20O`$(P!A`"`@$`0S`M$&``"`"_
+MWP``L-\(`.`#$`"])^#_O2<8`+__$`"R_P@`L?\``+#_+9"``"V`H``MB,``
+M```"/```0B0)^$``%$`%)"TP0```(Q``0(`0``,``B0$$`(")1""``$``SP`
+M@&,T)Q!#`"0PP@`E,,0``P`@$@"`QC0!``(\)3#"`"T@0`(```(\``!")`GX
+M0``40`4D'!-%C@`!`CPE**(````"/```0B0)^$``+2!``A@`O]\0`++?"`"Q
+MWP``L-\(`.`#(`"])^#_O2<0`+__"`"Q_P``L/\MB(``+8"@`````CP``$(D
+M"?A``!!`!20M,$``"0``$I__`B0$``(D!0`"5B``QC3?_P(D)##"`"D=``A`
+M`,8TO_\")"0PP@`M("`"```"/```0B0)^$``$$`%)!``O]\(`+'?``"PWP@`
+MX`,@`+TG\/^])P``O_\```(\``!")`GX0``$@`4T@``#/"000P`!`$(L`@`#
+M)",08@```+_?"`#@`Q``O2?@_[TG$`"__P@`L?\``+#_+8B``"V`H`````(\
+M``!")`GX0``$@`4T+1A``(```CPD$&(``@!`4`$``B0"``(D!P`"$H``!CPE
+M,&8`+2`@`@```CP``$(D"?A```2`!300`+_?"`"QWP``L-\(`.`#(`"])P@`
+MX`,M$```"`#@`P$`HBS@_[TG&`"__Q``LO\(`+'_``"P_RV(@`#__]`P.!.$
+M)````CP``$(D"?A```8`!B0X$R:2.1,BD@`2`@`E,,(`.A,BD@`4`@`E,,(`
+M.Q,BD@`6`@`E,,(`+2`@`@```CP``%(D"?A``@B`!30]$R:2`#(&`#P3(I(E
+M,,(`_S\",@`4`@`E,,(`+2`@`@GX0`(,@`4T#0``%BT@(`(```(\``!")`GX
+M0``$@`4T$``#/"400P`M("`"!(`%-`GX0`(M,$``HQT`"!@`O]\```(\``!"
+M)`GX0``$@`4T[_\#//__8S0D$$,`+2`@`BTP0`````(\``!")`GX0``$@`4T
+M&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TGT/^])R``O_\8`+/_$`"R_P@`L?\`
+M`+#_+8"`````$3P``#$F"?@@`FR`!30MD$``+2```@GX(`)P@`4T+9A``"T@
+M``()^"`";(`%-"N04@`"`$`2+1A```$`<R8\$!,`/!@#`#X8`P`E$$,`(`"_
+MWQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])_#_O2<``+__```"/```0B0)^$``
+M;(`%-```O]\(`.`#$`"])_#_O2<(`+__``"P_RV`@`````(\``!")`GX0``D
+M@`4T``$#/"400P`M(``"+3!``````CP``$(D"?A``"2`!30(`+_?``"PWP@`
+MX`,0`+TGT/^])R``O_\8`+/_$`"R_P@`L?\``+#_+9B``````CP``$(D"?A`
+M`&28!33"E`(`_P%2,@`!0C(#`$`0+2!@`O\!4CHGD!(````1/```,28)^"`"
+M<(`%-"V`0``M(&`""?@@`FR`!30F@`(")H`2`BT0``(@`+_?&`"SWQ``LM\(
+M`+'?``"PWP@`X`,P`+TG\/^])P@`O_\``+#_T`&0E````CP``$(D"?A``"!`
+M!23_`$(P)A`"`@$`4"PM$``""`"_WP``L-\(`.`#$`"])^#_O2<8`+__$`"R
+M_P@`L?\``+#_+9"``"V`H````!$\```Q)@GX(`*8@`4T```#CB$00P````*N
+M+2!``@GX(`*4@`4T!``#CB$00P`$``*N+2!``@GX(`*<@`4T#``#CB$00P`,
+M``*N+2!``@GX(`*0@`4T"``#CB$00P`(``*N+2!``@GX(`*@@`4T$``#CB$0
+M0P`0``*N&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TGX/^])Q@`O_\0`++_"`"Q
+M_P``L/\M@(``+8B@``D`HBP(`$`4+9"``````CP``$(D"?A``/__!30K$%$`
+M!0!`$"T@``+__P(D_!-"KF@>``@M$``````"/```0B0)^$``+2@@`BT@``(M
+M,$`````"/```0B0)^$``$(`%-/P3$:X!``(D&`"_WQ``LM\(`+'?``"PWP@`
+MX`,@`+TG\/^])P@`O_\``+#_+8"``````CP``$(D"?A``!"`!33__T(P+2A`
+M`````CP``$(D"?A``"T@``((`+_?``"PWP@`X`,0`+TGT/^])R``O_\8`+/_
+M$`"R_P@`L?\``+#_+8B``"V0H`````(\``!")`GX0`#_'P4D*Q!2``0`0!#_
+M_P(D`!0BKJD>``@M$```+2`@`@```CP``$(D"?A``!2`!30M@$```.`")"2`
+M`@(M("`"```"/```0B0)^$``+2A``O\?0C`E@`("+2`@`A2`!30```(\``!"
+M)`GX0``M,``"`!0RK@$``B0@`+_?&`"SWQ``LM\(`+'?``"PWP@`X`,P`+TG
+M\/^])P@`O_\``+#_+8"``````CP``$(D"?A``!2`!33_'T(P+2A``````CP`
+M`$(D"?A``"T@``((`+_?``"PWP@`X`,0`+TG]Q."@`$`0C@(`.`#`0!",.#_
+MO2<8`+__$`"R_P@`L?\``+#_+8B``!$`H!`MD(`````"/```0B0)^$``!(`%
+M-/_^$#S__Q`V)!!0`"T@(`(M,$`````"/```0B0)^$``!(`%-/03(H[L'@`(
+M)!!0`````CP``$(D"?A```2`!30``1`\)1!0`"T@(`(M,$`````"/```0B0)
+M^$``!(`%-/03(HXE$%``]!-"K@$``B08`+_?$`"RWP@`L=\``+#?"`#@`R``
+MO2?0_[TG(`"__Q@`L_\0`++_"`"Q_P``L/\MB(``+9"@`````CP``$(D"?A`
+M`/\?!20K$%(`!`!`$/__`B0$%"*N(!\`""T0```M("`"```"/```0B0)^$``
+M%(`%-"V`0```X`(\__]"-"2``@(M("`"```"/```0B0)^$``+2A``@`4`@#_
+M'P,\)!!#`"6``@(M("`"%(`%-````CP``$(D"?A``"TP``($%#*N`0`")"``
+MO]\8`+/?$`"RWP@`L=\``+#?"`#@`S``O2?P_[TG"`"__P``L/\M@(`````"
+M/```0B0)^$``%(`%-/\?`SPD$$,``A0"`"TH0`````(\``!")`GX0``M(``"
+M"`"_WP``L-\(`.`#$`"])P@`X`,!``(D"`#@`P`````(`.`#+1````@`X`,`
+M````"`#@`P````#P_[TG`0`")`4`HA0``+__!P#`%`T``B11'P`(+1``````
+M`CP``$(D"?A``````````+_?"`#@`Q``O2?P_[TG"P`")`8`HA```+__'@`"
+M)`\`HA`M&```91\`"````CP&`.8P^`&&K````CP``$(D"?A``&B`!31I'P`(
+M`0`#)```0B0)^$```````"T80``M$&````"_WP@`X`,0`+TG\/^])P``O_\`
+M``(\``!")`GX0`````````"_WP@`X`,0`+TGT/^])R``O_\8`+/_$`"R_P@`
+ML?\``+#_+8B``"V`H`````(\``!3)`GX8`($@`4T!``#/"400P`M("`"+3!`
+M`````CP``%(D"?A``@2`!30,```2(`"_WRT@(`()^&`"!$`%)/S_`SS__V,T
+M)!!#`"T@(`($0`4D"?A``BTP0``@`+_?&`"SWQ``LM\(`+'?``"PWP@`X`,P
+M`+TGP/^])S@`O_\P`+;_*`"U_R``M/\8`+/_$`"R_P@`L?\``+#_-0"@$"V`
+M@`````(\``!")`GX0``$0`4D_/\#//__8S0D$$,`+2```BTP0`````(\``!"
+M)`GX0``$0`4D```"/```0B0)^$``T`<$)`H`$20```(\``!3)`$`%CP```(\
+M``!5)/S_$CS__U(V```"/```5"0M(``""?A@`A!`!20D$%8`$`!`$``````)
+M^*`"R``$)"T@``()^&`"!$`%)"004@`M(``"!$`%)`GX@`(M,$``__\Q)N__
+M(!8M(``"ZQ\`""T0```$`"`6+2```NL?``@M$```+2```@```CP``$(D"?A`
+M``2`!33[_P,\__]C-"000P`M(``"+3!``````CP``$(D"?A```2`!30!``(D
+M.`"_WS``MM\H`+7?(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#0`"])]#_O2<@
+M`+__&`"S_Q``LO\(`+'_``"P_RV(@``M@*`````"/```4R0)^&`"!(`%-`0`
+M`SPE$$,`+2`@`BTP0`````(\``!2)`GX0`($@`4T#```$B``O]\M("`""?A@
+M`@1`!23\_P,\__]C-"000P`M("`"!$`%)`GX0`(M,$``(`"_WQ@`L]\0`++?
+M"`"QWP``L-\(`.`#,`"])^#_O2<8`+__$`"R_P@`L?\``+#_+8"@`"THP``!
+M`!$D#0`1$BV0@``%```2`@`")`P``A(M$```/B``"!@`O]\```(\='Y")`GX
+M0```````.R``""V(0`````(\-R``"-1_0B0```(\V'U")`GX0```````/"``
+M"#034*XT$U"N+1`@`A@`O]\0`++?"`"QWP``L-\(`.`#(`"])_#_O2<``+__
+M```"/```0B0)^$``!$`%)`,``SPD$$,``A0"````O]\(`.`#$`"])_#_O2<(
+M`+__`0`")`8`HA```+#_`@`")`8`HE````(\7B``""T0``````(\8"``"```
+M4"1@(``(``!0)&8@``@(`+_?```"/```0B0)^$``+2@``BT0``((`+_?``"P
+MWP@`X`,0`+TG\/^])P``O_\```(\``!")`GX0``,``4D``"_WP@`X`,0`+TG
+M\/^])P``O_\M,*`````"/```0B0)^$``#``%)```O]\(`.`#$`"])_#_O2<`
+M`+__"``%)````CP``$(D"?A```0`!B0``+_?"`#@`Q``O2?0_[TG(`"__Q@`
+ML_\0`++_"`"Q_P``L/\MB(``"``%)````CP``$(D"?A``"``!B0M@``````"
+M/```4R0```(\``!2)"T@(`()^&`""``%)`0`0C`(`$`0`0`#)`GX0`(*``0D
+M`0`0)N@#`BKV_T!4+2`@`BT8```M$&``(`"_WQ@`L]\0`++?"`"QWP``L-\(
+M`.`#,`"])_#_O2<(`+__``"P_RV`@`````(\``!")`GX0`!H@`4TO_\#)"00
+M0P`M(``"+3!``````CP``$(D"?A``&B`!30(`+_?``"PWP@`X`,0`+TG\/^]
+M)P@`O_\``+#_+8"``````CP``$(D"?A``&B`!31``$(T+2```BTP0`````(\
+M``!")`GX0`!H@`4T"`"_WP``L-\(`.`#$`"])^#_O2<8`+__$`"R_P@`L?\`
+M`+#_+8B``"T0H``MD,``4(`%-```$#P``!`F"?@``BTP0``M("`"5(`%-`GX
+M``(M,$`"&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TGX/^])Q``O_\(`+'_``"P
+M_RV(@``M@*``0`"B+!P`0!`M&```(`"B+`L`0!0```(\``!")`GX0`!4@`4T
+M`0`&)`0P!@(G,`8`)#!&`"T@(`()(0`(5(`%-```0B0)^$``4(`%-`$`!B0$
+M,`8")S`&`"0P1@`M("`"4(`%-````CP``$(D"?A````````!``,D+1!@`!``
+MO]\(`+'?``"PWP@`X`,@`+TGX/^])Q``O_\(`+'_``"P_RV(@``M@*``0`"B
+M+!H`0!`M&```(`"B+`H`0!0```(\``!")`GX0`!4@`4T`0`&)`0P!@(E,$8`
+M+2`@`C$A``A4@`4T``!")`GX0`!0@`4T`0`&)`0P!@(E,$8`+2`@`E"`!30`
+M``(\``!")`GX0````````0`#)"T08``0`+_?"`"QWP``L-\(`.`#(`"])_#_
+MO2<``+__```"/```0B0)^$``3(`%-```O]\(`.`#$`"])_#_O2<``+__``*B
+M,`0`0!`M,*``__T")"0PH@`@`,8T```"/```0B0)^$``3(`%-```O]\(`.`#
+M$`"])PL`H*@(`*"X_P_",`\`HJ@,`**X#P"BB`P`HI@/`$84+1@``"``XC`'
+M`$!0+1````\`HH@,`**8`"!"-`\`HJ@,`**X+1```!<`HJ@4`**X$P"BJ!``
+MHK@!``,D"`#@`RT08`#0_[TG(`"__Q@`L_\0`++_"`"Q_P``L/\MF(``+8#`
+M`"V((`$MD*``%P"BB!0`HI@!`$(P90!`$`\``R07`.*(%`#BF`$`0C`&`$`4
+M```"/```0B0)^$``#``%)%L`4!`/``,D$P!"BA``0IK_#T(P```BIA<`4(H4
+M`%":_P\"/`"`0C0D@`("PH,0`"T@8`(```(\``!")`GX0`!L@`4T@AH"`/__
+M8S#_'V(P*Q!0``0`0%`E@`,"`.!B)/__0C`E@`("_W\",@(`(J8$`""B%P!"
+MBA0`0IH"`$(P'0!`%``````7`$**%`!"F@0`0C`/`$`4`0`")!<`0HH4`$*:
+M$`!",`0`0!``````!``BDKDA``@(`$(T%P!"BA0`0IH(`$(P!`!`$`0`(I($
+M`$(TPB$`"`0`(J("`$(T!``BHA<`0HH4`$*:X`!",$(1`@`%`"*B$P!"BA``
+M0IK"%`(`!@`BHA<`0HH4`$*:``%",`4`0%#__P(D%P!"BA0`0IH`?D(P0A("
+M``<`(J(3`$**$`!"FL(3`@`/`$(P"``BHA,`0HH0`$*:@Q,"``$`0C`)`"*B
+M$P!"BA``0IH#$P(``0!",`H`(J(M&```+1!@`"``O]\8`+/?$`"RWP@`L=\`
+M`+#?"`#@`S``O2>@_[TG6`"__U``OO](`+?_0`"V_S@`M?\P`+3_*`"S_R``
+MLO\8`+'_$`"P_RV0@``ML*``+:C`````IZ\M\``!+9B```(`PI0``4(PYP%`
+M$`P``R0```(\``!")`GX0``M*,``+;A``.`!0!`,``,D!@`")`H`PA('`,(N
+M!@!`$`@``B0"`,(NV`%`$"T@0`(2(@`(```"/-0!PA8,``,D+2!``@```CP`
+M`$(D"?A``!!`!21@`%0P+2!``@```CP``$(D"?A``"THH`+'`4`0`P`#)!,3
+M9I(4$V*2`!("`"4PP@`5$V*2`!0"`"4PP@`6$V*2`!8"`"4PP@`M($`"```0
+M/```$"8)^``"`(`%-!@39I(`,@8`%Q-BDB4PP@`M($`""?@``@2`!30M($`"
+M`0`"/,R/0B0)^$``+2C``@$``B0,`,(2+2!``@<`P!(&``(D$@#"$@@``B01
+M`,)2*``%)%PB``@``!$\*``%)$@B``@!``8D*``%)"TP`````!`\```0)@GX
+M``(`````+2!``A!`!218(@`()!`&)"@`!20``!`\```0)@GX``(M,```+2!`
+M`A!`!21`$`8D"?@``@`````M($`"```1/```,28)^"`"$$`%)"405``M($`"
+M$$`%)```$#P``!`F"?@``BTP0``X$V:2.1-BD@`2`@`E,,(`.A-BD@`4`@`E
+M,,(`.Q-BD@`6`@`E,,(`+2!``@GX``((@`4T/1-FD@`R!@`\$V*2)3#"`"T@
+M0`()^``"#(`%-"T@0`(M*```"?@``BTP```M($`"!``%)`GX``(M,```+2!`
+M`@P`!20)^``"+3```"T@0`()^"`"'``%)"T@0`(@``4D"?@``BTP```M($`"
+M)``%)`GX``(M,```'!-@KBT@0`()^"`"+``%)"T@0`(P``4D"?@``@4`!B0M
+M($`"-``%)`GX``(%``8D+2!``D0`!20)^``""``&)"T@0`)(``4D"?@``@@`
+M!B0M($`"4``%)`GX``(M,```+2!``DP`!20)^``"+3```"T@0`(,0`4D"?@`
+M`BTP```M($`"0``%)`GX``(M,```+2!``AB`!30)^``"^!-FCBT@0`)(@`4T
+M"?@``BTP```M($`"```"/```0B0)^$``+2@``"T@0`)0@`4T"?@``BTP```M
+M($`"5(`%-`GX``(M,```+2!``EB`!30)^``"+3```"T@0`)<@`4T"?@``BTP
+M```M($`"8(`%-`GX``(!``8D+2!``F2`!30)^``"`0`&)"T@0`)H@`4T"?@`
+M`BTP```M($`"*(`%-`GX``(M,```+2!``BR`!30)^``"+3```"T@0`)L@`4T
+M"?@``BTP```M($`",(`%-`GX``+__P8D+2!``C2`!30)^``"__\&)"T@0`(X
+M@`4T"?@``@$`!B0M@``````"/,@4420```(\``!4),`0$``A$%$```!%C```
+MHH\$`$`0`("B)``00BP'`$!4`0`0)L`0$``A$%$`+2!``@GX@`($`$:,`0`0
+M)J<``B[P_T`4P!`0`"T@0`(```(\``!")`GX0``M**`"T`!`$`,``R0M($`"
+M```1/```,28)^"`"*)@%-/__`SS_`&,T)!!#`'D28Y(`&@,`)1!#`"T@0`(H
+MF`4T```0/```$"8)^``"+3!``'H28I(`-@(``!0"`"4PP@![$F.2`!(#`"4P
+MP@`E,,,`+2!``@GX``(TF`4T+2!``@GX(`)$F`4T?\`#)"000P!T$F.60A@#
+M`(`_8S`E$$,`+2!``D28!30)^``"+3!``"T@0`()^"`"2)@%-/S_`SS_#V,T
+M)!!#`'029):`(@0``P`#/`#P8S0D((,`)1!$`"T@0`)(F`4T"?@``BTP0``M
+M($`""?@@`F28!33X_P,\_P]C-"000P!X$F22`",$``<``SP`\&,T)""#`"40
+M1``M($`"9)@%-`GX``(M,$``+2!``@GX(`(0F04T_/\#)"000P!T$F.6`P!C
+M,"400P`M($`"$)D%-`GX``(M,$``+2!``@$``CSPH$(D"?A``"THX`)T`$`0
+M`P`#)```HH\-`$`0+2!``@0`XI("`$(P!0!`5`(`XI8$`.*2_@!",`0`XJ("
+M`.*6`@"BI@0`XI($`**B+2!``AR8!30``!`\```0)@GX``(!``8D```"/```
+M0B0)^$``Z`,$)"T@0`(```(\``!")`GX0`!@F`4T`0!"-"T@0`)@F`4T"?@`
+M`BTP0``M($`"8)@%-`$`!B0```(\``!")`GX0``M.```+2!``@```CP``$(D
+M"?A``"THX`(&`$`4+8````(`HI8"`$(T`@"BIN,C``@#``,D```"/```420M
+M($`""?@@`BTH``(!`!`F`P`"*OO_0!0M($`"3!)"C@<`0!````(\```"/```
+M0B0)^$``+2!``BT@0`(```(\``!")`GX0``D@`4T?_X#//__8S0D$$,`+2!`
+M`BTP0`````(\``!")`GX0``D@`4T_!-ECO__`B0$`*(0```"/```0B0)^$``
+M+2!``@`498[__P(D!`"B$````CP``$(D"?A``"T@0`($%&6.__\")`0`HA``
+M``(\``!")`GX0``M($`"^`%&C@<`P%#<`5:N+2!``@```CP``$(D"?A``&B`
+M!33<`5:NYR,`"`$``B0``,*/`0!`5```PZ\M$```6`"_WU``OM](`+??0`"V
+MWS@`M=\P`+3?*`"SWR``LM\8`+'?$`"PWP@`X`-@`+TGX/^])Q@`O_\0`++_
+M"`"Q_P``L/\MD(``+8"@`````CP``$(D"?A```2`!33__T,P`0`")!8``E+T
+M$T:.`@`"*@4`0%`&``(D#0``$A@`O]\E)``($`"RWP8``E+T$T:."``")`T`
+M`A(8`+_?)20`"!``LM\E,&8`'20`"%$``CST$T:.)3!F`!TD``A2``(\)3!F
+M`!TD``@4``(\]!-&CB4P9@`0``(\)3#"`"T@0`(```(\``!")`GX0``$@`4T
+M&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TG\/^])P``O_\!``(\S(]")`GX0`#<
+M`86,``"_WP@`X`,0`+TG\/^])P``O_\(``4D`0`"/""60B0)^$``"@`&)```
+MO]\(`.`#$`"])^#_O2<0`+__"`"Q_P``L/\MB(``+2@``````CP``$(D"?A`
+M``$`!B06`$`0+1@``"T@(`(/``4D`0`"/""60B0)^$``($X&)`X`0!`M&```
+M```0/```$"8)^``"Z`,$)"T@(`(?``4D`0`"/""60B0)^$``($X&)`GX``(T
+M"`0D`0`#)"T08``0`+_?"`"QWP``L-\(`.`#(`"])^#_O2<0`+__"`"Q_P``
+ML/\MB(``+8"@`"TH``````(\``!")`GX0``!``8D,P!`$"T8```%```2+3``
+M``(``I80`$(P`0!`5`$`!B0M("`"```"/```0B0)^$``!)@%-"T@(`(/``4D
+M`0`"/""60B0)^$``($X&)"``0!`M&``````"/```0B0)^$``Z`,$)"T@(`(?
+M``4D`0`"/""60B0)^$``($X&)!0`0!`M&``````"/```0B0)^$``-`@$)"T@
+M(`(M*``````"/```0B0)^$```0`&)`@`0!`M&```+2`@`BTH```!``(\()9"
+M)`GX0``*``8D+1A``"T08``0`+_?"`"QWP``L-\(`.`#(`"])Z#_O2=8`+__
+M4`"^_T@`M_]``+;_.`"U_S``M/\H`+/_(`"R_Q@`L?\0`+#_+;"`````I:\`
+M``(\``!")`GX0``$`*:O+;A``,``0!`M&```+2#``@``$CP``%(F"?A``FB`
+M!31@`$(T+2#``FB`!30``!$\```Q)@GX(`(M,$``+2#``@GX0`(D@`4T+:A`
+M`'__!CS__\8T)#!&`"T@P`()^"`")(`%-```$#P``!`F"?@``J`/!"0M(,`"
+M"?A``@B8!30`"`,\)1!#`"T@P`((F`4T"?@@`BTP0``)^``""@`$)"T@P`(!
+M``(\\*!")`GX0``M*.`"E`!`$"T8``````(\``!>)`GXP`/H`P0D+2#``@``
+M$3P``#$F"?@@`@B8!33_]Q(\__]2-B004@`M(,`"")@%-```$#P``!`F"?@`
+M`BTP0``M(,`""?@@`EB8!30MF$``+2#``@GX(`)<F`4T+:!``"T@P`()^"`"
+M:)@%-`@`HJ\#_`8\___&-"0P9@+\`P(\)3#"`"T@P`()^``"6)@%-,#_!CQ_
+M`,8T)#"&`C\``CR`P$(T)3#"`"T@P`()^``"7)@%-/[_!CP?`,8T"`"BCR0P
+M1@"`$<8T+2#``@GX``)HF`4T"?C``Q0`!"0M(,`""?@@`@B8!30`"`,\)1!#
+M`"T@P`((F`4T"?@``BTP0``)^,`#"@`$)"T@P`+4F`4T"?@``B$`!B0M(,`"
+M"?@@`@B8!30D$%(`+2#``@B8!30)^``"+3!```GXP`/H`P0D+2#``@GX(`)@
+MF`4T`0!"-"T@P`)@F`4T"?@``BTP0``M(,`"8)@%-`$`!B0```(\``!")`GX
+M0``M.```+2#``EB8!30)^``"+3!@`BT@P`)<F`4T"?@``BTP@`(M(,`":)@%
+M-`GX``((`*:/+2#``@```CP``%`D"?@``BTHX`(,`$`4+2#``@GXP`.($P0D
+M+2#``@GX``(M*.`"!0!`%"T@P`(``*./`@!BE`(`0C0"`&*D```"/```0B0)
+M^$``:(`%-)__`R0D$$,`+2#``FB`!30``!`\```0)@GX``(M,$``+2#``B2`
+M!30)^``"+3"@`@$``B0$`*./``!BK`$``R0M$&``6`"_WU``OM](`+??0`"V
+MWS@`M=\P`+3?*`"SWR``LM\8`+'?$`"PWP@`X`-@`+TGT/^])R``O_\8`+/_
+M$`"R_P@`L?\``+#_+9"``"V(H``MF,```@"@%"V`H`#__Q`D+2!``@!`!20`
+M``(\``!")`GX0``M,"`"```"/```0B0)^$``+2!@`@\`,3(/`!`R+2!``@!`
+M!20M,``"```"/```0B0)^$``+3@@`BV`0``$`"(R"`!`%"T0``(M($`"%``%
+M)````CP``$(D"?A``"TP```M$``"(`"_WQ@`L]\0`++?"`"QWP``L-\(`.`#
+M,`"])_\`QC`M.```"@`$)#\`"R0!`,DD`0`*)$`0!``#`$(D_P!",`<`PA1`
+M$`0`(1"D````0I`W`$L4+1A``/`E``@!``<D`P!")/\`0C`=`"(5`````!L`
+M@!@A$*0```!#D#\`!R0=`&=0`0`')/__2)`:``=1`0`')",8:`!`$`,`(1!#
+M`(`0`@`C$$,``!$"`",00P!`$`(`YP-")#P8`@`^&`,`8A`"/---0C0<`&(`
+M$A@``+X9`P`A$&@`_B4`"/\`0S`&`.I4__^$)"$0I````$*0#P!+%"T80`#_
+M_X0DSO^!!$`0!``M(```/P`&)"$0I````$*0!@!&%"T80``!`(0D"P""*/K_
+M0%0A$*0``0`#)`@`X`,M$&``+4B@`/\`PS#__PLD__\%)"U````_``HD(2`H
+M`0``@I`3`$I0`0`()2,`0U!`$`@`*Q!#``$`0%0M*``!(3`H`0``PI`K$&(`
+M"0!`4`$`""7__P(D"0"B%"U8``%`$`@``P!")```XJ!3)@`("P#$D`L``BGI
+M_T`4(2`H`0L``BD1`$`4(1"K`/__`B0O`*(0/P`$)`L``BD+`$!4(1"K`$`0
+M!0`#`$(D``#BH"$0)0%3)@`("P!$D`,`0B0``.*@4R8`"`L`A)`#`$(D``#B
+MH"$H)0$``*:0(Q!F`$`9`@`C&&(`@!@#`"$88@#`&`,`(2`K`0``@I`C$$8`
+M&@!B`!(8```!`$!0#0`'``L`@I`+`*20(Q!$`!@`8@`2$```YP-")#P0`@`^
+M$`(`8A`#/---8S0<`$,`$A```+X1`@`+`*.0(1!#`/\`1#`(`.`#+1"``#T`
+MHBP!`$!0/``%)/P!A:0(`.`#`0`")+#_O2=(`+__0`"V_S@`M?\P`+3_*`"S
+M_R``LO\8`+'_$`"P_RV8@``M&*``+8C``"TH@`!V$H*4`A$"``<`0C`/`,*@
+M=A*"D`<`0C`0`,*@``!BE,[K0B3__T(PEP!"+-(`0!`M(```+3````@"9)8A
+M$,4`?A)"D`8`@A`$``(D`0#&)`0`PBSZ_T`4(1#%``0``B3%`,(0+2``````
+M8Y3.ZV,D9F8"/&=F0C0<`&(`$A```#\0`@"#$`(`PQ\#`",80P`,`&(L`0!`
+M4/__8R0\$`,`/A`"`*JJ`S0X'`,`JZIC-!P`0P`2$```?A@"`,`0`P`C$$,`
+M@!`"`"$00P`AD*(`@A)2)B$H1@(9`**0#@`BHA8`1)+_`(,P&0"BD"L00P`!
+M`$!4&0"DD`D`)*(A*$8"%P!$DO\`@S`9`**0*Q!#``$`0%09`*20"``DHB$H
+M1@(8`$22_P"#,!D`HI`K$$,``0!`5!D`I)`'`"2B(1!&`AD`1I`M(&`"+2A`
+M`@$`$#P`F!`F"?@``BTXH`,MH$``"0`FDBT@8`(M*$`""?@``@$`IR<ML$``
+M"``FDBT@8`(M*$`""?@``@(`IR<MJ$``!P`FDBT@8`(M*$`""?@``@,`IR<`
+M`F..8`!@$"T@0`!`&`,````"/!@:0B0A&&(```!DE```HI,#`(,D*A!#``,`
+M0%```**3X28`"`,``B0C$$0```"BHP``II,M(&`"`0`"/.260B0)^$``+2A`
+M`@X`(J+_`$8P+2!@`BTH0`(!``(\`)A")`GX0``$`*<G+:!`````I)/_`(,P
+M`0"BDRL00P`!`$!4`0"DDP$`I*/_`(8P+2!@`@$``CSDED(D"?A``"TH0`()
+M`"*B_P!&,"T@8`(M*$`"`0`"/`"80B0)^$``!`"G)RVP0````*23_P"#,`(`
+MHI,K$$,``0!`5`(`I),"`*2C_P"&,"T@8`(!``(\Y)9")`GX0``M*$`""``B
+MHO\`1C`M(&`"+2A``@$``CP`F$(D"?A```0`IR<MJ$````"DD_\`@S`#`**3
+M*Q!#``$`0%0#`*23`P"DH_\`AC`M(&`"`0`"/.260B0)^$``+2A``@<`(J+_
+M`$8P+2!@`BTH0`(!``(\`)A")`GX0``$`*<G+2!`````HI-`$`(`_@%BI@X`
+M(I(*`"*B"P`BH@P`(J(-`"*B(Q"$`@``(J(C$)4"`0`BHB,0E@("`"*B!@`@
+MH@4`(*($`""B`P`@H@$`!"0M$(``2`"_WT``MM\X`+7?,`"TWR@`L]\@`++?
+M&`"QWQ``L-\(`.`#4`"])W#_O2>``+__>`"S_W``LO]H`+'_8`"P_RV8@``M
+MB*``&`"D)P``!3PH&J4D```0/```$"8)^``"1``&)"T@H`,```4\`!JE)`GX
+M``(1``8D+2!@`BTH(`(!``(\;)E")`GX0``M,*`#R`!`$"T8```/`**3__]"
+M)/\`0C`%`$(LPP!`$"T08``0`**3__]")/\`0C`%`$(LO0!`$"T08``MB```
+M```"/```4B0A@+$#```$D@GX0`(%``4D```"H@$`(B;__U$P!P`B+OC_0!0A
+M@+$#!P`1)````CP``%(D(8"Q`P``!)()^$`"!@`%)````J(!`"(F__]1,`\`
+M(B[X_T`4(8"Q`P$`I)-`&00`X`!C,```HI,?`$(P)1AB`!@`HH\E&&(`&`"C
+MKP,`I9/`&04`@`!C,`(`HI.`$`(`?`!","488@#"(`0``P"$,"489``<`**/
+M)1AB`!P`HZ\$`*23`!$$`/``0C!"*`4`#P"E,"4010`@`*./)1!#`"``HJ\&
+M`*63@!D%`,``8S`%`**30!`"`#X`0C`E&&(``B$$``$`A#`E&&0`)`"BCR48
+M8@`D`*.O!P"DD\`0!`#X`$(P@B@%``<`I3`E$$4`*`"CCR400P`H`**O"0"E
+MD\`9!0"``&,P"`"BDT`0`@!^`$(P)1AB`$(A!``!`(0P)1AD`"P`HH\E&&(`
+M+`"CKPH`I)-`$00`X`!",$(H!0`?`*4P)1!%`#``HX\E$$,`,`"BKPL`I9/`
+M$`4`^`!",,(@!``'`(0P)1!$`#0`HX\E$$,`-`"BKPP`HI-`$`(`?@!",$(I
+M!0`!`*4P)1!%`#@`HX\E$$,`.`"BKPT`I)-`$00`X`!",#P`HX\E$$,`/`"B
+MKPX`HY/`$`,`^`!",,(@!``'`(0P)1!$`$``I(\E$$0`0`"BKT(9`P`!`&,P
+M1`"BCR488@!$`*.O#P"DDP``$#P``!`F"?@``@,`!23`$0(`@`!",#@`HX\E
+M$$,`.`"BKP\`I),)^``"`P`%)$(0`@`#`$(P/`"CCR400P`\`**O$`"DDPGX
+M``(#``4D@!`"`!P`0C`\`*./)1!#`#P`HJ\MB``````"/```4"2`$!$`(1!=
+M`"T@8`*<F`4T"?@``A@`1HP!`"(F__]1,!``(B[W_T`4@!`1`"$070`M(&`"
+M&`!&C````CP``$(D"?A``-28!30!``,D+1!@`(``O]]X`+/?<`"RWV@`L=]@
+M`+#?"`#@`Y``O2?@_[TG&`"__Q``LO\(`+'_``"P_RV(@``MD*````"BE`#L
+M0B1F9@0\9V:$-!P`1``2(```/R`$`(,@!`##%P(`(R""`````CP``$(D"?A`
+M``4`!21`$`(`00!"-"T@(`*<F`4T```0/```$"8)^``"+3!``"T@(`+`F`4T
+M"?@``BTP```T$C*N`0`")!@`O]\0`++?"`"QWP``L-\(`.`#(`"])_#_O2<`
+M`+__```"/```0B0)^$``9)@%-,(<`@#_`6,P``%B,`0`0!`M$&``_P%B."<8
+M`@`M$&````"_WP@`X`,0`+TGT/^])R@`O_\@`+3_&`"S_Q``LO\(`+'_``"P
+M_RV(@``MH*`````"/```0B0)^$``8)@%-`(`0C0M("`"+3!``````CP``$(D
+M"?A``&"8!30M("`"8)@%-`(`!B0```(\``!")`GX0``M.```&`!`$"T8```M
+M@``````"/```4R0```(\``!2)`GX8`+H`P0D"?A``BT@(`(M&$```0`0)A4`
+M`BH#`$`0N?]B*/;_0!``````N?]B*`0`0%06`(.F%@"`IJHH``@M&````0`#
+M)"T08``H`+_?(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])P@`X`,M$```
+M"`#@`RT0``#P_[TG``"__RT8H``#`*(H"@!`$"TH````*0,`(RBC`(`H!0`A
+M*(4````"/```0B0)^$``0!.E)"TH0``M$*````"_WP@`X`,0`+TG\/^])P``
+MO_\M0,```P"B*`L`0!`M&````#$%`",PQ0"`,`8`(3"&`$`3QB0```(\``!"
+M)`GX0``M*``!+1A``"T08````+_?"`#@`Q``O2?0_[TG*`"__R``M/\8`+/_
+M$`"R_P@`L?\``+#_+9"``"V(H``"``(D#0"B$"V@P``#`*(L!@!`$`,``B0!
+M``(D"P"B$/__`R0<*0`(+1!@``4`HA#__P,D'"D`""T08`#[*``(`@`3)/LH
+M``@!`!,D+9@````1$P`C$%,`@!`"`"&`@@!`$Q`F!``"CAD`0!3__P,D+2``
+M`@```CP``$(D"?A``#P`!20+`(`6!``1K@L``B0,``*N`@`")!0``J[__P(D
+M&``"K@H``B0@``*F&BD`""(``J8M($`"+2A@`@```CP``$(D"?A``"TP@`(M
+M&&`"+1!@`"@`O]\@`+3?&`"SWQ``LM\(`+'?``"PWP@`X`,P`+TG`P"B+!T`
+M0!`M,````!$%`",010"`$`(`(1B"`$`38R0$`&*,%0!`$``````$`&"L`0`#
+M)`08HP`G&`,`(!."C"008@`@$X*L)!."C"008@`D$X*L*!."C"008@`H$X*L
+M+!."C"008@`L$X*L,!."C"088@`P$X.L`0`&)`@`X`,M$,``T/^])R@`O_\@
+M`+3_&`"S_Q``LO\(`+'_``"P_RV(@``MH*``+9B``#02A8P#`((NR0!`$"T@
+M````$10`(Q!4`(`0`@`AD"("0!-2)@0`0H["`$`0+1"```0`0XX!``(DO0!B
+M%`$`!"0"`**4$`!",#``0!`M("`"$(`%-```$#P``!`F"?@``N`!!B0M("`"
+M%(`%-``(!CP)^``"``C&-"T@(`(@@`4TW0$&/`GX``+/C\8T%`!"C@`Q`@`C
+M,,(`0#$&`.`!QB3`,@8`X`'&-"T@(`()^``"0(`%-"T@(`)$@`4TK@4&/`GX
+M``+``\8T+2`@`@```CP``$(D"?A``$28!32`_P,D)!!#`#@`0C0M("`"1)@%
+M-`GX``(M,$``+2`@`@28!30`;P8\PBD`"",@QC00@`4T```0/```$"8)^``"
+M:`$&)"T@(`(4@`4T``0&/`GX``(`!,8T+2`@`B"`!33=`08\"?@``J>/QC04
+M`$..0!`#`"$00P``,0(`(S#"`,`P!@`P`L8DP#(&`#`"QC0M("`""?@``D"`
+M!30M("`"1(`%--<$!CP)^``"F`/&-"T@(`(```(\``!")`GX0`!$F`4T@/\#
+M)"000P`<`$(T+2`@`D28!30)^``"+3!``"T@(`($F`4T`&\&/"`0QC0)^``"
+M`````!@`0X[__P(D`@!B$`\`!B08`$:.`#4&`"(`0I8`$0(`\`!","4PP@`@
+M`$*6#P!","4PP@`(``(\`"!"-"4PP@`M("`"```"/```0B0)^$``'(`%-`P`
+M0HX!`$(P!0!`$`$``B0$$(("(!-CCN4I``@E$$,`!!""`B<0`@`@$V..)!!#
+M`"`38JX,`$*.`0!",`4`0!`!``(D!!""`B038X[R*0`()1!#``00@@(G$`(`
+M)!-CCB000P`D$V*N#`!"C@(`0C`%`$`0`0`")`00@@(H$V.._RD`""400P`$
+M$((")Q`"`"@38XXD$$,`*!-BK@P`0HX$`$(P!0!`$`$``B0$$(("+!-CC@PJ
+M``@E$$,`!!""`B<0`@`L$V..)!!#`"P38JX,`$*."`!",`4`0!`!``(D!!""
+M`C`38XX9*@`()1!#``00@@(G$`(`,!-CCB000P`P$V*N`0`$)"T0@``H`+_?
+M(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])_#_O2<``+__`!D%`",890"`
+M&`,`(1"#`$030XP)`&`0`0`")`@`8E3__P(D```"/```0B0)^$``+2@``#<J
+M``@``+_?__\")```O]\(`.`#$`"])_#_O2<``+__`!$%`",010"`$`(`(1""
+M`$030XP!``(D"0!B4"TH```,`&`0+1````0`8BP)`$!0+1````0`!21,*@`(
+M```"/````CP``$(D"?A````````!``(D``"_WP@`X`,0`+TGX/^])Q@`O_\0
+M`++_"`"Q_P``L/\MB(`````"/```0B0)^$``+8"@`"V00`#_?P4\__^E-"0H
+M10````(\``!")`GX0``M("`"+2`@`@```CP``$(D"?A``&2`!30&```2+3!`
+M`"4``B0C$$8`0A`"`'LJ``@A,,(``@!"+`@`0!#__\8D+2`@`@```CP``$(D
+M"?A``"TH0`*&*@`(+1```"T@(`(```(\``!")`GX0`!D@`4T+2`@`@```CP`
+M`$(D"?A``"TH0`(!``(D&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TGX/^])Q``
+MO_\(`+'_``"P_P`1!0`C$$4`@!`"`"$0@@!$$T.,`0`")`L`8A`MB(``'`!@
+M$"T0```"``(D$P!B4"@`!20#``(D!@!B$`@`!22U*@`(+1````@`!22P*@`(
+M`0`&)```$#P``!`F"?@``@(`!B0M("`"*``%)`GX``(.``8DM2H`"`$``B0*
+M``8D```"/```0B0)^$````````$``B00`+_?"`"QWP``L-\(`.`#(`"])_#_
+MO2<``+__`!D%`",890"`&`,`(1"#`$030XP*`&`0+1````$``B0'`&)4+1``
+M`````CP``$(D"?A``!0`!20`>$(PPA("````O]\(`.`#$`"])]#_O2<@`+__
+M&`"S_Q``LO\(`+'_``"P_P`1!0`C$$4`@!`"`"$0@@!$$T.,`0`")`@`8A`M
+M@(``*@!@$"T0```"``(D(`!B$"P`!20(*P`(+1````@`!20```(\``!")`GX
+M0``(``8D+8@``````CP``%,D```"/```4B0M(``""?A@`A0`!20`>$(P!P!`
+M$"T@``()^$`""@`$)`$`,2;H`R(J]O]`%"T@``((``4D```"/```0B0)^$``
+M+3````@K``CH`R(J!``&)````CP``$(D"?A``"TX```)*P`((`"_WR``O]\8
+M`+/?$`"RWP@`L=\``+#?"`#@`S``O2<``*R/"`"KC_W_`B4"`$(L`@!`%``,
+M"3R`3@@`_P_$,(`4"@`E(((``!L'``,``CP`\$(T)!AB`"4@@P`!`&(Q`P!`
+M$"4@B0```0(\)2""`!``8C$$`$`0!`"BCP`@`CPE(((`!`"BCP(`0!```@(\
+M)2""``L`I*@(`*2X__\")`X`@A%`&PP`!P`"/`#@0C0D&&(`#P"CJ`P`H[@+
+M`**("`"BF`!``SPE$$,`"P"BJ`@`HKA!*P`(!`!B,0\`H*@,`*"X!`!B,0X`
+M0!!```,\"P"BB`@`HI@E$$,`"P"BJ`@`HK@/`*2(#`"DF!``HH_X_P,\)!!#
+M`"4@@@`/`*2H#`"DN`@`X`,!``(D"`#@`RT0```+`**("`"BF``@`SPE$$,`
+M"P"BJ`@`X`,(`**X!P#@$``````/`**(#`"BF`\``!4E$$8`;RL`"``00C0)
+M``!1`!#"-`L`(HD(`"*9"P"BJ`@`HK@/`*:H#`"FN'(K``@M$```"P"@J`@`
+MH+@/`**H#`"BN"T0```7`**H%`"BN!,`HJ@0`**X"`#@`P$``B07`**(%`"B
+MF`$`0C`[`$`0#P`#)!<`HH@4`**8_A]",```PJ03`**($`"BF`(4`@`"`,*D
+M!`#`H!,`HH@0`**8`0!",!<`0!0`````$P"BB!``HI@"`$(P`@!`$`$``B0$
+M`,*@$P"BB!``HI@(`$(P!`!`$``````$`,*0`@!"-`0`PJ`3`**($`"BF`0`
+M0C`$`$`0``````0`PI`$`$(T!`#"H`L`HH@(`**8@A0"``\`0C`%`,*@%P"B
+MB!0`HIA"$P(`!@#"H!,`HH@0`**8``]",`(2`@`'`,*@$P"BB!``HICP`$(P
+M`A$"``@`PJ`*`,"@"P#`H"T8```(`.`#+1!@``@`X`,`````!`"BD`@`0C0$
+M`**@"`#@`RT0``#@_[TG&`"__Q``LO\(`+'_``"P_RV(@`#0F`4T```"/```
+M0B0)^$``%AP&)"V```````(\``!2)"T@(`*`F`4T"?A``@$`!CP!`!`F"``"
+M*OK_0!0M("`"```"/```0B0)^$```)P%-`(6`@`"&0(`#P!",``1`@`E$&(`
+M+2!``````CP``$(D"?A```@`!208`+_?$`"RWP@`L=\``+#?"`#@`R``O2>@
+M_[TG4`"__T@`M_]``+;_.`"U_S``M/\H`+/_(`"R_Q@`L?\0`+#_+:"@`"VH
+MP``ML.``+;@``?__D3````(\``!")`GX0`#P+@0D+9!``!X!0!`"`!`D+9A`
+M`"T@0`````4\<!JE)````CP``$(D"?A``'`2!B0,`%2N$`!5KA0`5J[(`5&F
+MR@%`IC\``B3\`4*F``)`KJPN0*[(+D"N``<")-`N0J[__P(DU"Y"KM@N0J[<
+M+D*N+2!``@```CP``$(D"?A``"TH``#_`$`0`P`0),@!0Y8;\0(T$`!B5"T@
+M8`(M($`"`*(%-```$#P``!`F"?@``BTP```M($`"?)@%-`GX``(9``8D```"
+M/```0B0)^$``Z`,$)"T@8`(```(\``!")`GX0``@0`4D_P!#,`(1`P#,`6*N
+M#P!C,-`!8Z;^_T(D`P!"+-\`0!`-`!`D+2!@`@```CP``$(D"?A``!B8!332
+M`6*F`0`"/`2U0B0)^$``+2!@`M,`0!`.`!`DS`%BC@0`0BP$`$`4+2!@`@"8
+M!314+``(!P`&)`"8!31'``8D```"/```0B0)^$``#0`0)````CP``$(D"?A`
+M`-`'!"0!``(\`*]")`GX0``M(&`"U`%BIO__0C#P`$(P$``#)+@`0Q0M(&`"
+MP0`%)````CP``$(D"?A``"TPH`.Q`$`0"``0)```HI<`,$(LK0!`%`4`$"0`
+M`**7<!)"IBT@8`(```(\``!")`GX0``00`4D&`!#,,(8`P`"``(DH0!B%`H`
+M$"0M(&`"/P`%)````CP``$(D"?A``"TPH`.9`$`0"``0)```HI=R$D*F+8@`
+M`"V```````(\``!4),``!28M(&`""?B``BTPH`.,`$`0``"BER:((@(!`!`F
+M0`,"+O?_0!3```4F__\"-(4`(A8'`!`D"@`").830J8#``(D\!5"IBV````+
+M``,D0!`0`"$04`"`$`(`(1!0`(`0`@`A$%(`[A-#I`$`$"8*``(N]_]`%$`0
+M$``M@``````"/.`L1B0+``4D0!`0`"$@4@`A&$8```!CE/@5@Z3R%8.D(1!0
+M`(`0`@`A$%``@!`"`"$04@"T%D6D&!9%I`$`$"8#``(N\?]`%$`0$`!P$D4F
+M```"/```0B0)^$``+2!@`E@`0!`(`!`DS`%BC@0`0BP@`$!4BA)`IHH20I8=
+M`$!0BA)`IBT@8`(`F`4T```1/```,28)^"`"!T`&)```$#P``!`F"?@``M`'
+M!"0!``(\`*]")`GX0``M(&`"U@%BIBT@8`(`F`4T"?@@`@<`!B0)^``"T`<$
+M)-8!8I;P`$(P(``#)#<`0Q0-`!`DZBP`""T@8`(M(&`"OP`%)````CP``$(D
+M"?A``"TPH`,M`$`0"``0)```HI=T$D*F"`)BI@```CP``$(DP`%BK@$``CP$
+MMT(D"?A``"T@8`(```(\``!")`GX0``M(&`"+8@``"V````?`!4D```"/```
+M5"0C*+`"+2!@`@GX@`(M,*`#$P!`$```HI<AB"("0!@0`"$8<@`"$@(`+"QB
+MH```HI,M+&*@`0`0)@,``B[Q_T`4(RBP`@0`(!("``(\_?]"-`P`(A8M(&`"
+M'2T`"`D`$"0(`!`D!`!`$@```CP``$(D"?A``"T@0`(!`.!6``#PKBT@```M
+M$(``4`"_WT@`M]]``+;?.`"UWS``M-\H`+/?(`"RWQ@`L=\0`+#?"`#@`V``
+MO2?P_[TG"`"__P``L/\M@(`````"/```0B0)^$``<!*%)````CP``$(D"?A`
+M`"T@``((`+_?``"PWP@`X`,0`+TGD/^])V@`O_]@`+[_6`"W_U``MO](`+7_
+M0`"T_S@`L_\P`++_*`"Q_R``L/\MF(`````"/.@L0B0'`$-H``!#;`<`H[,`
+M`*.W```"//`L0B0'`$-H``!#;`\`1&@(`$1L%P"CLQ``H[<?`*2S&`"DMRWP
+M``````(\``!6)````CP``%<D@(`>`"&`'0(``!*.+2!@`@GXP`(M*$`""``"
+MKBV(````%!$`)8!1`"T@8`(M*$`""?C@`BTP``(M(&`""?C``BTH0`(I`%`4
+M+1@```$`,28``2(J\_]`%``4$0`MB``````"/```520```(\``!4)(`0$0`A
+M$%T`$`!0C"T@8`(M*$`""?B@`BTP``(M(&`""?B``BTH0`(4``(6+1@```$`
+M,28$`"(J\O]`%(`0$0"`$!X`(1!=`"T@8`(``$6,"?C@`@@`1HP!`-XG`@#"
+M*\S_0!2`@!X````"/```0B0)^$``9``$)`$``R0M$&``:`"_WV``OM]8`+??
+M4`"VWT@`M=]``+3?.`"SWS``LM\H`+'?(`"PWP@`X`-P`+TG__^E,``!HC`%
+M`$!0@`"B,#@3`B0``,*DNBT`"-07`B0*`$`0`````(H2@I0'`$`0``````@)
+M`B0``,*DK`H")```XJ0(`.`#`0`")`@`X`,M$```"`#@`P$``B3`_[TG,`"_
+M_R@`L_\@`++_&`"Q_Q``L/\MF(``+8B``"V0@``(`H.4`0`")`8`8A3@`9`D
+M$``%)````CP``$(D"?A``"TPH`,$``"NAA(BE@D`0%"*$B*6`0`")`0``JYV
+M$B*6!`!`5(H2(I8#``(D!``"KHH2(I8%`$`0"`D")`0``HX$`$(T!``"K@@)
+M`B00``*FK`H")!(``J8X$P(D#``"IM07`B0.``*F```#C@$``CP#`$(T)1AB
+M``(``CPE&&(`"@`")`@``J:```(D"@`"IM__`CS__T(T)!AB`+__`CS__T(T
+M)!AB`````ZYZ$B*6$`!`$`T``B1($D8F+2!@`@```CP``$(D"?A```\`!20(
+M`$`0#0`")`$``B1,$D*N```"CH```SPE$$,````"K@T``B04``*N`0`")&@2
+M0JXP`+_?*`"SWR``LM\8`+'?$`"PWP@`X`-``+TGX/^])Q@`O_\0`++_"`"Q
+M_P``L/\MD(``+8B@`"B`!30``!`\```0)@GX``($`":.+2!``BR`!30)^``"
+M#``FCBT@0`(P@`4T"?@``A``)HXM($`"-(`%-`GX``((`":.+2!``B"`!30)
+M^``"```FCA@`O]\0`++?"`"QWP``L-\(`.`#(`"])]#_O2<@`+__!`"EK]P!
+M@XP!``(D"0!B$/__`C0,`&`0```"/`8``B0(`&(0"``")!$`8E0!`*(D__\"
+M-`P`HJ\'``(\5RX`"/__0C0```(\``!"C",0H@#`$`(`#`"BKP```CP``$*,
+M(Q"B`,`0`@`0`**O`0"B)`@`HJ^``0(\__]"-"00P@```**O```"/```0B0)
+M^$``+2B@`R``O]\(`.`#,`"])^#_O2<0`+__"`"Q_P``L/\MB(``*(`%-```
+M$#P``!`F"?@``BTP```M("`"```"/```0B0)^$``!(`%-`0``SPE$$,`S_\#
+M//__8S0D$$,`+2`@`@2`!30)^``"+3!``"T@(`(@@`4T"?@``O__!C00`+_?
+M"`"QWP``L-\(`.`#(`"])]#_O2<@`+__&`"S_Q``LO\(`+'_``"P_RV(@``M
+MD*``$@"BE!P`0!`MF(`````"/```0B0)^$``!(`%-!```SPE$$,`+2`@`@2`
+M!30``!`\```0)@GX``(M,$``$`!&EBT@(`()^``")(`%-!(`1I8M("`""?@`
+M`CB`!304`$:.P#`&`"T@(`()^``",(`%-+HN``@M("`"```"/```0B0)^$``
+M!(`%-.__`SS__V,T)!!#`"T@(`(M,$`````"/```0B0)^$``!(`%-"T@(`(H
+M@`4T```"/```0B0)^$````!&CBT@(`(```(\``!")`GX0``@@`4T@/\#/"00
+M0P`(`$.6)3!#`!@`0I8&`$`0+2`@`@0`0B0`%`(`?P`#/"000P`E,,(````0
+M/```$"8)^``"((`%--`N9H[__P(\_P!"-"0PP@`:`$*6`!("``#_0C`E,,(`
+MT"YFKBT@(`()^``"&(`%-"T@(`(```(\``!")`GX0``$0`4D__\#/"000P`<
+M`$.._?]C),`8`P#__V,P)1!#`"T@(`($0`4D"?@``BTP0``@`+_?&`"SWQ``
+MLM\(`+'?``"PWP@`X`,P`+TG\/^])P``O_\```(\``!")`GX0``(0`4D*Q`"
+M````O]\(`.`#$`"])^#_O2<0`+__"`"Q_P``L/\MB(``+8"@`````CP``$(D
+M"?A``,``!20M($``__\")`0`@E0%`0(\````KDTO``@M$```NMA"-"08@@`(
+M``(\)!""``0`0!````.N`$`"/"408@````*N!0"",`4`0!#`!8(P```"C@$`
+M0C0```*NP`6",`4`0!`@`((P```"CD``0C0```*N(`"",`@`0%````*.:!(B
+MC@4`0!````*.`$`#/"400P````*N```"C@!``SPD$$,`&0!`$`$``B10$B2N
+M+2`@`@``$#P``!`F"?@``L0`!214$B*N+2`@`@GX``+(``4D6!(BKBT@(`()
+M^``"S``%)%P2(JXM("`""?@``M``!21@$B*N+2`@`@GX``+4``4D9!(BK@$`
+M`B00`+_?"`"QWP``L-\(`.`#(`"])P@`X`,X+(*,T/^])R@`O_\@`+3_&`"S
+M_Q``LO\(`+'_``"P_RV0@``M@*``."R4C`L`@08MB(``)``%)````CP``$(D
+M"?A``"TP```M($`"```"/```0B0)^$``)``%)`4!`CRZV$(T)#`"`D```C(.
+M`$`0`0`",CPL(HX!`$!40`#&-$`L(HX!`$!4``'&-$0L(HX!`$!4@`#&-$@L
+M(HX!`$!4``3&-`$``C(!`$!4!P#&-`!``CPD$`("`P!`$"T@0`((``(\)3#"
+M`````CP``%,D"?A@`J``!20%``$&."PPKBT@0`(D``4D"?A@`@$`!B0M$(`"
+M*`"_WR``M-\8`+/?$`"RWP@`L=\``+#?"`#@`S``O2<(`.`#@``")/#_O2?_
+M_Z4P@`"B+`L`0!```+__0"D%`!R(`C0A**(````"/```0B0)^$````````"`
+M0C`"`$`4`0`#)"T8```M$&````"_WP@`X`,0`+TGX/^])Q@`O_\0`++_"`"Q
+M_P``L/\MD(``__^E,(``HBPM`$`0+1@``$")!0``B`4T(2@E`@``$#P``!`F
+M"?@``BTP```$B`4T(2@E`BT@0`()^``"+3````B(!30A*"4"+2!``@GX``(M
+M,```#(@%-"$H)0(M($`""?@``BTP```0B`4T(2@E`BT@0`()^``"+3```!2(
+M!30A*"4"+2!``@GX``(M,```&(@%-"$H)0(M($`""?@``BTP```<B`(T(8@B
+M`BT@0`(M*"`""?@``BTP```!``,D+1!@`!@`O]\0`++?"`"QWP``L-\(`.`#
+M(`"])]#_O2<@`+__&`"S_Q``LO\(`+'_``"P_RV8@``M&,``__^E,(``HBPE
+M`$`0+2```!0`P%`MD```!0#2D`"2$@`$`,*0)9!"`@,`QI``-@8``@!BD``4
+M`@`E,,(``0!BD``2`@`E,,(```!BD"4PP@!",`8`P!<2`"4PP@`-,``(0I`2
+M`"TP``!`B04`&(@%-"$H)0(``!`\```0)@GX``(M(&`"'(@"-"&((@(`@$8V
+M+2!@`@GX``(M*"`"`0`$)"T0@``@`+_?&`"SWQ``LM\(`+'?``"PWP@`X`,P
+M`+TGH/^])U@`O_]0`+[_2`"W_T``MO\X`+7_,`"T_R@`L_\@`++_&`"Q_Q``
+ML/\MH(``+?#@`/__MS"JJ@0\`@``%:JJA#0M(```@`#B+GL`0!`M&`````##
+MD`$``B09`&(0!0`")`(`8B@%`$`0!0`")`<`8%`"`,*4LC``""T8```2`&(0
+M+1@``+,P``@M$&``!0!"+&D`0!0M&````@#"E`8`0BP+`$`4``"@KP(`PI0.
+M`$(L`0`#)`8`0!0``*.O`P`")%@P``@``**O!P`#)```HZ\$`,>0!0#"D``2
+M`@`E..(`!@#"D``4`@`E..(`!P#"D``6`@`E..(`)CCD``D`PI``$@(`"`##
+MD"6P0P`FL,0"___6,@H`TY`+`,*0`!("`"688@(,`,*0`!0"`"688@(-`,*0
+M`!8"`"688@(FF&0"#P#"D``2`@`.`,.0):A#`":HI`+__[4R$`#2D!$`PI``
+M$@(`)9!"`A(`PI``%`(`)9!"`A,`PI``%@(`)9!"`@(`PI0.`$(L`@!`$":0
+M1`+_`%(R0(D7``"(!30A*"4"+2"``@``$#P``!`F"?@``BTPX``$B`4T(2@E
+M`BT@@`()^``"+3#``@B(!30A*"4"+2"``@GX``(M,&`"#(@%-"$H)0(M((`"
+M"?@``BTPH`(0B`4T(2@E`BT@@`()^``"+3!``A2(`C0AB"("+2"``BTH(`()
+M^``"``"FCRT@@`(M*.`"```"/```0B0)^$``+3#``RT80``M$&``6`"_WU``
+MOM](`+??0`"VWS@`M=\P`+3?*`"SWR``LM\8`+'?$`"PWP@`X`-@`+TG\/^]
+M)P``O_\M$(``+2"@`"PL0B0M*$`````"/```0B0)^$``!@`&)```O]\(`.`#
+M$`"])_#_O2<``+__+"R$)````CP``$(D"?A```8`!B0!``(D``"_WP@`X`,0
+M`+TG\/^])P``O_\M(*`````%/``MI20```(\``!")`GX0``&``8D``"_WP@`
+MX`,0`+TG"`#@`RT0``#@_[TG&`"__Q``LO\(`+'_``"P_RV(@``M$*``+9#`
+M``!@!20``!`\```0)@GX``(M,$``+2`@`@A@!20)^``"`0`&)"T@(`(,8`4D
+M`P`&)````CP``$(D"?A```(`!R0(`$`0+1@``"T@(`(```(\``!")`GX0``$
+M8`4D``!"I@$``R0M$&``&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TG__^E,`@"
+M@I0&`$40#``#)'(2@I2``$(P`@!`%`L``R0#``,D`0#`5```PZP(`.`#+1``
+M`(82@I0%`$`0+1@``'82@I0"`$`4`0`#)$,``R2*$H*4`0!`5`0`8S0(`.`#
+M+1!@`.#_O2<8`+__$`"R_P@`L?\``+#_+9"``$@2D)0<`!$R@X@1``(`$#)#
+M@!`````"/```0B0)^$``+2@@`BT@0`(```(\``!")`GX0```F`4T`"!"-"T@
+M0`(M,$`````"/```0B0)^$```)@%-"T@0`(```(\``!")`GX0``M*"`")A!0
+M`"L0`@`M($`"+3!``````CP``$(D"?A``"TH(`(8`+_?$`"RWP@`L=\``+#?
+M"`#@`R``O2?@_[TG$`"__P@`L?\``+#_+8B``"V`H`````(\``!")`GX0``4
+M0`4D0(`0``,``R0$&`,")1!#`"T@(`(M,$`````"/```0B0)^$``%$`%)`$`
+M`B00`+_?"`"QWP``L-\(`.`#(`"])^#_O2<0`+__"`"Q_P``L/\MB(``+8"@
+M`````CP``$(D"?A``!1`!21`@!```P`#)`08`P(G&`,`)!!#`"T@(`(M,$``
+M```"/```0B0)^$``%$`%)`$``B00`+_?"`"QWP``L-\(`.`#(`"])^#_O2<8
+M`+__$`"R_P@`L?\``+#_+9"``"V(H``M@,`````"/```0B0)^$``&$`%)`$`
+M`R0$&",")Q@#`"000P`!`!`R!(`P`B404``M($`"+3!``````CP``$(D"?A`
+M`!A`!20!``(D&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TG\/^])P@`O_\``+#_
+M+8"@``8`HBP(`$`0__\#)````CP``$(D"?A``!Q`!20O`$(P!A`"`@$`0S`M
+M$&``"`"_WP``L-\(`.`#$`"])^#_O2<0`+__"`"Q_P``L/\MB(``+8#`````
+M`CP``$(D"?A``!1`!20M,$``_O\"//Q_0C0D,,(``P``$@"`QC0!``(\)3#"
+M`"T@(`(```(\``!")`GX0``40`4D."PEC@`!`CPE**(````"/```0B0)^$``
+M+2`@`A``O]\(`+'?``"PWP@`X`,@`+TGX/^])Q``O_\(`+'_``"P_RV(@``M
+M@*`````"/```0B0)^$``$$`%)/'_`SR?_V,T)!!#``<`$#*`@!`````#/`@M
+M8R0A@`,"```#CB400P`M("`"+3!``````CP``$(D"?A``!!`!200`+_?"`"Q
+MWP``L-\(`.`#(`"])^#_O2<8`+__$`"R_P@`L?\``+#_+8"``/__T3`R+(0D
+M```"/```0B0)^$``!@`&)#(L!I(S+`*2`!("`"4PP@`T+`*2`!0"`"4PP@`U
+M+`*2`!8"`"4PP@`M(``"```2/```4B8)^$`""(`%-#<L!I(`,@8`-BP"DB4P
+MP@#_/S$R`(P1`"4PT0`M(``""?A``@R`!308`+_?$`"RWP@`L=\``+#?"`#@
+M`R``O2?0_[TG(`"__Q@`L_\0`++_"`"Q_P``L/\M@(`````1/```,28)^"`"
+M3(`%-"V00``M(``""?@@`E"`!30MF$``+2```@GX(`),@`4T*Y!2``(`0!(M
+M&$```0!S)CP0$P`\&`,`/A@#`"400P`@`+_?&`"SWQ``LM\(`+'?``"PWP@`
+MX`,P`+TG\/^])P``O_\```(\``!")`GX0`!,@`4T``"_WP@`X`,0`+TG\/^]
+M)P@`O_\``+#_+8"``````CP``$(D"?A``""`!30``0,\)1!#`"T@``(M,$``
+M```"/```0B0)^$``((`%-`@`O]\``+#?"`#@`Q``O2?0_[TG(`"__Q@`L_\0
+M`++_"`"Q_P``L/\MF(`````"/```0B0)^$``9)@%-,*4`@#_`5(R``%",@,`
+M0!`M(&`"_P%2.B>0$@```!$\```Q)@GX(`)0@`4T+8!``"T@8`()^"`"3(`%
+M-":``@(F@!("+1```B``O]\8`+/?$`"RWP@`L=\``+#?"`#@`S``O2?P_[TG
+M"`"__P``L/\M@(`````"/```0B0)^$``($`%)/\`0C`"&0(`#P!%,,P!`HX$
+M`$,4+2```-`!`I8!`$50`0`$)"T0@``(`+_?``"PWP@`X`,0`+TGX/^])Q@`
+MO_\0`++_"`"Q_P``L/\MD(``+8"@````$3P``#$F"?@@`I"`!30```..(1!#
+M`````JXM($`""?@@`HR`!30$``..(1!#``0``JXM($`""?@@`I2`!30,``..
+M(1!#``P``JXM($`""?@@`HB`!30(``..(1!#``@``JXM($`""?@@`IB`!300
+M``..(1!#`!```JX8`+_?$`"RWP@`L=\``+#?"`#@`R``O2?@_[TG&`"__Q``
+MLO\(`+'_``"P_RV(@``M@*``"0"B+`@`0!0MD(`````"/```0B0)^$``__\%
+M-"L04``$`$`0+2`@`M0N4*[N,@`(+1```````CP``$(D"?A``"TH``(M("`"
+M+3!``````CP``$(D"?A``'`0!234+C"N`0`")!@`O]\0`++?"`"QWP``L-\(
+M`.`#(`"])_#_O2<(`+__``"P_RV`@`````(\``!")`GX0`!P$`4D__]","TH
+M0`````(\``!")`GX0``M(``""`"_WP``L-\(`.`#$`"])]#_O2<@`+__&`"S
+M_Q``LO\(`+'_``"P_RV(@``MD*`````"/```0B0)^$``_Q\%)"L04@`$`$`0
+M__\")-@N(JXO,P`(+1```"T@(`(```(\``!")`GX0``4@`4T+8!```#@`B0D
+M@`("+2`@`@```CP``$(D"?A``"TH0`+_'T(P)8`"`BT@(`(4@`4T```"/```
+M0B0)^$``+3```M@N,JX!``(D(`"_WQ@`L]\0`++?"`"QWP``L-\(`.`#,`"]
+M)_#_O2<(`+__``"P_RV`@`````(\``!")`GX0``4@`4T_Q]","TH0`````(\
+M``!")`GX0``M(``""`"_WP``L-\(`.`#$`"])\LN@H`!`$(X"`#@`P$`0C#@
+M_[TG&`"__Q``LO\(`+'_``"P_RV(@``1`*`0+9"``````CP``$(D"?A```2`
+M!33__A`\__\0-B004``M("`"+3!``````CP``$(D"?A```2`!33(+B*.<C,`
+M""004`````(\``!")`GX0``$@`4T``$0/"404``M("`"+3!``````CP``$(D
+M"?A```2`!33(+B*.)1!0`,@N0JX!``(D&`"_WQ``LM\(`+'?``"PWP@`X`,@
+M`+TGT/^])R``O_\8`+/_$`"R_P@`L?\``+#_+8B``"V0H`````(\``!")`GX
+M0`#_'P4D*Q!2``0`0!#__P(DW"XBKJ8S``@M$```+2`@`@```CP``$(D"?A`
+M`!2`!30M@$```.`"//__0C0D@`("+2`@`@```CP``$(D"?A``"TH0`(`%`(`
+M_Q\#/"000P`E@`("+2`@`A2`!30```(\``!")`GX0``M,``"W"XRK@$``B0@
+M`+_?&`"SWQ``LM\(`+'?``"PWP@`X`,P`+TG\/^])P@`O_\``+#_+8"`````
+M`CP``$(D"?A``!2`!33_'P,\)!!#``(4`@`M*$`````"/```0B0)^$``+2``
+M`@@`O]\``+#?"`#@`Q``O2<(`.`#`0`")`@`X`,`````"`#@`RT0```(`.`#
+M``````@`X`,`````\/^])P``O_\```(\``!")`GX0``<G`4T_P!",```O]\(
+M`.`#$`"])_#_O2<``+__```"/```0B0)^$``6(`%-`<`0C```+_?"`#@`Q``
+MO2?P_[TG``"__P<`IC````(\``!")`GX0`!8@`4T``"_WP@`X`,0`+TG"`#@
+M`ZPN@HSP_[TG``"__S02AHP$`,!4```"/*PNA:SV,P`(`0`")```0B0)^$``
+M````````O]\(`.`#$`"])_#_O2<!``(D"0"B%```O_\"`,(L"P!`%"T8```%
+M``(D"`#"%`T``R0*-``(+1@``````CP``$(D"?A````````M&$``+1!@````
+MO]\(`.`#$`"])_#_O2<+``(D"0"B%```O_\&`.8P^`&&K````CP``$(D"?A`
+M`$B`!30>-``(`0`")````CP``$(D"?A``````````+_?"`#@`Q``O2?P_[TG
+M``"__P```CP``$(D"?A````````K$`(```"_WP@`X`,0`+TGP/^])S@`O_\P
+M`+;_*`"U_R``M/\8`+/_$`"R_P@`L?\``+#_-0"@$"V`@`````(\``!")`GX
+M0``$0`4D_/\#//__8S0D$$,`+2```BTP0`````(\``!")`GX0``$0`4D```"
+M/```0B0)^$``"@`$)`H`$20```(\``!3)`$`%CP```(\``!5)/S_$CS__U(V
+M```"/```5"0M(``""?A@`A!`!20D$%8`$`!`$``````)^*`"R``$)"T@``()
+M^&`"!$`%)"004@`M(``"!$`%)`GX@`(M,$``__\Q)N__(!8M(``">30`""T0
+M```$`"`6+2```GDT``@M$```+2```@```CP``$(D"?A```2`!33[_P,\__]C
+M-"000P`M(``"+3!``````CP``$(D"?A```2`!30!``(D.`"_WS``MM\H`+7?
+M(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#0`"])]#_O2<@`+__&`"S_Q``LO\(
+M`+'_``"P_RV(@``M@*`````"/```4R0)^&`"!(`%-`0``SPE$$,`+2`@`BTP
+M0`````(\``!2)`GX0`($@`4T#```$B``O]\M("`""?A@`@1`!23\_P,\__]C
+M-"000P`M("`"!$`%)`GX0`(M,$``(`"_WQ@`L]\0`++?"`"QWP``L-\(`.`#
+M,`"])]#_O2<@`+__&`"S_Q``LO\(`+'_``"P_RV(@``M@*`````"/```4R0)
+M^&`"!(`%-`0``SPE$$,`+2`@`BTP0`````(\``!2)`GX0`($@`4T#```$B``
+MO]\M("`""?A@`@1`!23\_P,\__]C-"000P`M("`"!$`%)`GX0`(M,$``(`"_
+MWQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])^#_O2<8`+__$`"R_P@`L?\``+#_
+M+8"@`"THP``!`!$D#0`1$BV0@``%```2`@`")`P``A(M$```\S0`"!@`O]\!
+M``(\K-!")`GX0```````\#0`""V(0``!``(\[#0`"`S20B0!``(\J-)")`GX
+M0```````\30`"*@N4*ZH+E"N+1`@`A@`O]\0`++?"`"QWP``L-\(`.`#(`"]
+M)_#_O2<``+__```"/```0B0)^$``!$`%)`,``SPD$$,``A0"````O]\(`.`#
+M$`"])_#_O2<(`+__`@`")!,`HA```+#_`P"B+`8`0!`$``(D`0`")`<`HA`M
+M$```(S4`"`@`O]\&`*(0+1```",U``@(`+_?```"/!TU``@``%`D```"/!TU
+M``@``%`D```"/```4"0```(\``!")`GX0``M*``"+1```@@`O]\``+#?"`#@
+M`Q``O2?P_[TG``"__P```CP``$(D"?A```P`!20``+_?"`#@`Q``O2?P_[TG
+M``"__RTPH`````(\``!")`GX0``,``4D``"_WP@`X`,0`+TG\/^])P``O_\(
+M``4D```"/```0B0)^$``!``&)```O]\(`.`#$`"])_#_O2<(`+__``"P_RV`
+M@``(``4D```"/```0B0)^$``(``&)"T@``((``4D!``&)````CP``$(D"?A`
+M`"TX```K$`(`"`"_WP``L-\(`.`#$`"])_#_O2<(`+__``"P_RV`@`````(\
+M``!")`GX0`!(@`4TW_\#)"000P`M(``"+3!``````CP``$(D"?A``$B`!30(
+M`+_?``"PWP@`X`,0`+TG\/^])P@`O_\``+#_+8"``````CP``$(D"?A``$B`
+M!30@`$(T+2```BTP0`````(\``!")`GX0`!(@`4T"`"_WP``L-\(`.`#$`"]
+M)^#_O2<8`+__$`"R_P@`L?\``+#_+8B``"T0H``MD,``0(`%-```$#P``!`F
+M"?@``BTP0``M("`"1(`%-`GX``(M,$`"&`"_WQ``LM\(`+'?``"PWP@`X`,@
+M`+TGX/^])Q``O_\(`+'_``"P_RV(@``M@*``0`"B+!P`0!`M&```(`"B+`L`
+M0!0```(\``!")`GX0`!$@`4T`0`&)`0P!@(G,`8`)#!&`"T@(`*U-0`(1(`%
+M-```0B0)^$``0(`%-`$`!B0$,`8")S`&`"0P1@`M("`"0(`%-````CP``$(D
+M"?A````````!``,D+1!@`!``O]\(`+'?``"PWP@`X`,@`+TGX/^])Q``O_\(
+M`+'_``"P_RV(@``M@*``0`"B+!H`0!`M&```(`"B+`H`0!0```(\``!")`GX
+M0`!$@`4T`0`&)`0P!@(E,$8`+2`@`MTU``A$@`4T``!")`GX0`!`@`4T`0`&
+M)`0P!@(E,$8`+2`@`D"`!30```(\``!")`GX0````````0`#)"T08``0`+_?
+M"`"QWP``L-\(`.`#(`"])_#_O2<``+__```"/```0B0)^$``/(`%-```O]\(
+M`.`#$`"])_#_O2<``+__+3"@`````CP``$(D"?A``#R`!30``+_?"`#@`Q``
+MO2<+`*"H"`"@N/\/PC`/`**H#`"BN`\`HH@,`**8#P!&%"T8```@`.(P!P!`
+M4"T0```/`**(#`"BF``@0C0/`**H#`"BN"T0```7`**H%`"BN!,`HJ@0`**X
+M`0`#)`@`X`,M$&``X/^])Q@`O_\0`++_"`"Q_P``L/\MD,``+8`@`2V(H``7
+M`**(%`"BF`$`0C!,`$`0#P`#)!<`XH@4`.*8`0!",`8`0!0```(\``!")`GX
+M0``,``4D0@!2$`\``R03`"**$``BFO\/0C````*F%P`BBA0`(IK"$P(`_Q]"
+M,`(``J8$``"B%P`BBA0`(IH"`$(P%0!`%``````7`"**%``BF@0`0C`'`$`4
+M`0`")!<`(HH4`"*:$`!",`0`0!`$``*2"`!"-$XV``@$``*B`@!"-`0``J(7
+M`"**%``BFN``0C!"$0(`!0`"HA,`(HH0`"*:PA0"``8``J(7`"**%``BF@`!
+M0C`%`$!0__\")!<`(HH4`"*:`'Y",$(2`@`'``*B$P`BBA``(IK"$P(`#P!"
+M,`@``J(3`"**$``BFL(6`@`'`$(P"0`"HA,`(HH0`"*:`Q,"``$`0C`*``*B
+M+1@``"T08``8`+_?$`"RWP@`L=\``+#?"`#@`R``O2=@_[TGF`"__Y``OO^(
+M`+?_@`"V_W@`M?]P`+3_:`"S_V``LO]8`+'_4`"P_RV0@``M\*``+:#``"VX
+MX``H`*BO+:B``$``H*]$`*"O2`"@KP(`PY0``6(P`P!`$"VP``"0-@`(PQ$#
+M``(`PI3#$0(``0!".`$`0C#?`D`4#``#)`(`@Y8@`&(P`P!`4`(`@I:;-@`(
+M@Q$#`(,1`@`!`$(X`0!",-0"0!0,``,D+2!``@```CP``$(D"?A``"TH@`(T
+M`**OS`)`$`P``R0&``(D"@#"$P<`PB\&`$`0"``")`(`PB_%`D`0*`"DC[(V
+M``@`````P`+"%PP``R0M`.`2+2!``@```CP``%`D"?@``DR`!31$`**O+2!`
+M`@GX``)0@`4T2`"BK\P!0HX$`$(L!@!`5"V(```M($`""?@``D`1!232-@`(
+M``"BKP```CP``%,D@"@1`"&`O0!`$:4D"?A@`BT@0`(```*N`0`Q)@H`(B[X
+M_T`4@"@1`#0`HX\$`&*0`@!",`4`0!0T`*2/!`!BD/X`0C`$`&*@-`"DCP(`
+M@I0"`(*F!`""D`0`@J(M($`"```"/```0B0)^$``6(`%-`,`0!1,`**O`0`"
+M)$P`HJ\M($`"```0/```$"8)^``"!(`%-#P`HJ\``@(\/`"CCR088@`\`*.O
+M+2!``@GX``(00`4D.`"BK_X``CQ@`$(T.`"DCR0@@@`X`*2O+2!``@GX``(4
+M0`4D+`"BKRT@0`()^``"&$`%)#``HJ\"`(66```"/```0B0)^$``+2!``F@"
+M0!`#``,D`@""EO`!0S#```(D%@!B$,$`8B@&`$`00`$")*```B0/`&(0`P`$
+M)"@W``C,`4*.!0!B$%`!`B0&`&(0`@`#)"@W``C,`4*.`0`")"`W``A``**O
+M0`"CKR<W``@!`!8D)C<`"$``I*\$``(D0`"BKP(`%B3,`4*.!`!"+`0`0!0M
+M($`"`)@%-#`W``@'``8D`)@%-$<`!B0```(\``!")`GX0```````S`%"C@0`
+M0BQ$`$`4+2!``@(`@Y:``&(P+`!`$"V(``!P$J*6`3!"+"D`0!0```(\(`!B
+M,`0`0%!N$[&6;!.QED<W``AP$[.6<A.SEBT@(`(``!`\```0)@GX``(#``4D
+M+8A``"T@8`()^``"`P`%)"V80`"`*!8````"/+!%0B0A**(`+`&CC#__`B0D
+M&&(`@!$1`,``0C`E&&(`+`&CK#@!I(SP_P(D)"""`((8$0`!`&,P0!`3``X`
+M0C`E&&(`)2"#`#@!I*PMB``````"/+!%4"0```(\``!3)$`0$0`A$%$`@!@"
+M`"$8<``A$%8`@!`"`"$04``M($`"``!EC`GX8`(``$:,`0`Q)AP`(B[S_T`4
+M0!`1`"T@0`(!``(\)/%")`GX0``M*(`"+8@``````CPH+5`D```"/```4R2`
+M$!$`(1!1`(`8`@`A&'``0`"DCR$01`"`$`(`(1!0`"T@0`(``&6,"?A@`@``
+M1HP!`#$F(P`B+O+_0!2`$!$`+8@``````CQ`-5`D```"/```4R1`$!$`(1!1
+M`(`8`@`A&'``(1!6`(`0`@`A$%``+2!``@``98P)^&`"``!&C`$`,29``"(N
+M\_]`%$`0$0`MB``````"/.@O4"0```(\``!3),`0$0`A$%``!0#@$@``18P`
+M@*(D`!!"+`<`0%0!`#$FP!`1`"$04``M($`""?A@`@0`1HP!`#$FJP`B+O'_
+M0!3`$!$`S`%"C@0`0BP?`$`0+2!``@``$3P``#$F"?@@`AR`!30/``8\___&
+M-"0P1@#0`0(\)3#"`"T@0`(``!`\```0)@GX``(<@`4T+2!``EP`!20)^``"
+M+3```"T@0`)XF`4T"?@``@@`!B0M($`""?@@`DB`!30`!$(T+2!``DB`!30)
+M^``"+3!``"(`X%(L+*:2+2!``DR`!30```(\``!0)`GX``)$`*:/+2!``E"`
+M!30)^``"2`"FC\P!0HX$`$(L!P!`%"V(```M($`"0!$%)`GX``(``*:/`S@`
+M""PLII(```(\``!0)(`0$0!`$44D(1!=`"T@0`()^``"``!&C`$`,28*`"(N
+M^/]`%(`0$0`L+*:2+2RBD@`2`@`E,,(`+BRBD@`4`@`E,,(`+RRBD@`6`@`E
+M,,(`+2!``@```CP``%`D"?@``@"`!30Q+*:2`#(&`#`LHI(E,,(`/`"BCR4P
+MP@`M($`""?@``@2`!30M($`"`0`"/,@.0B0)^$``+2C``RT@0`(```(\``!1
+M)`GX(`(00`4D.`"CCR400P`M($`"$$`%)`GX``(M,$``+2!``A1`!20)^``"
+M+`"FCRT@0`(80`4D"?@``C``IH\M($`"6(`%-`GX``),`*:/,BRFDC,LHI(`
+M$@(`)3#"`#0LHI(`%`(`)3#"`#4LHI(`%@(`)3#"`"T@0`()^``""(`%-#<L
+MII(`,@8`-BRBDB4PP@`M($`""?@``@R`!30M($`"&(`%-`GX``+0+J:.+2!`
+M`H``!20)^``"__\&),P!0XX$``(D#@!B%"T@0`+0`4*6`@!"+`L`0!````(\
+M+2!``@GX(`(4``4D``1"-"T@0`(4``4D"?@``BTP0``M($`"```"/```0B0)
+M^$``+2B``@D!0!`#``,D!@`")!@`PA,M($`"!`)"C@,`0C`5`$`0`0`"/"T@
+M0`(```(\``!")`GX0`!$F04T_]\#//__8S0D$$,`!`)#C@$`8S!`'P,`)1!#
+M`"T@0`(M,$`````"/```0B0)^$``1)D%-"T@0`(!``(\L/5")`GX0``M*(`"
+M+2!``@$``CRTZT(D"?A``#0`I8_D`$`0`P`#),@!0Y8;\0(T#`!B%"T@0`("
+M`(*6@`!",`D`0%`<F`4T+2!``@C8!30```(\``!")`GX0``"!08D+2!``AR8
+M!30```(\``!")`GX0``!``8D+2!``@```CP``$(D"?A``!29!33_/T,P`@""
+MEB``0C`+`$`0/!`#`(`0`P#\_T(P+KH#-#@<`P"CBV,T'`!#`!(0```^$0(`
+MOC@`"&0`1"0^$`(`S,P#-#@<`P#-S&,T'`!#`!(0``#^$`(`9`!$)````CP`
+M`$(D"?A````````M($`"```"/```0B0)^$``8)@%-`$`0C0M($`"+3!`````
+M`CP``$(D"?A``&"8!30M($`"8)@%-`$`!B0```(\``!")`GX0``M.```+2!`
+M`@```CP``$(D"?A``#0`I8\)`$!4L"ZBC@(`@I8@`$(PD@!`%`,``R0"`(*6
+M`@!"-'$Y``@"`(*F"P!`$"V````M($`"()D%-`$`!CP```(\``!")`GX0```
+M\,8T`0`")+0NHJXM@````0`3)````CP``%$D@"@0```0I20$,!,""?@@`BT@
+M0`(!`!`F"@`"*OG_0!2`*!``+8```````CP``%$D+2!``@GX(`(M*``"`0`0
+M)@H``BK[_T`4+2!``J0`!20!``8\```"/```4"0)^``"`0#&-"T@0`*H``4D
+M"?@``@$`!B0M($`"K``%)`GX``(!``8D+2!``@```CP``%$D"?@@`K`0!20M
+M($`"L!`%)`GX``(M,$``+2!``J``!20(``8\"?@``F4)QC0(``(\90E"-#@L
+MHJXM($`""?@@`JP`!20'``,\)1!#`"T@0`*L``4D"?@``BTP0``&``(D#0#"
+M5TP20HXM($`""?@@`J``!20`$$(T+2!``J``!20)^``"+3!``#@LHHX`$$(T
+M."RBKDP20HX&`$`0+2!``@```CP``$(D"?A``"T@0`(M($`"```"/```0B0)
+M^$``((`%-'_^`SS__V,T)!!#`"T@0`(M,$`````"/```0B0)^$``((`%--0N
+MI8[__P(D!`"B$````CP``$(D"?A``"T@0`+8+J6.__\")`0`HA````(\``!"
+M)`GX0``M($`"W"ZECO__`B0$`*(0```"/```0B0)^$``+2!``O@!1HX'`,!0
+MW`%>KBT@0`(```(\``!")`GX0`!(@`4TW`%>KG8Y``@!``(D*`"DCP``@HP!
+M`$!4``"#K"T0``"8`+_?D`"^WX@`M]^``+;?>`"UWW``M-]H`+/?8`"RWU@`
+ML=]0`+#?"`#@`Z``O2?P_[TG``"__P$``CSHZD(D"?A```(`!20``+_?"`#@
+M`Q``O2?P_[TG"`"__P``L/\M@(``+2@``````CP``$(D"?A```$`!B0-`$`0
+M+1@``"T@``(!``(\Z.I")`GX0``3``4D!@!`$"T8``````(\``!")`GX0``T
+M"`0D`0`#)"T08``(`+_?``"PWP@`X`,0`+TGX/^])Q``O_\(`+'_``"P_RV(
+M@`#__[`P+2@``````CP``$(D"?A```$`!B1[`$`0+1@``/`!`S+```(D*P!B
+M$,$`8B@(`$`00`$")*```B02`&(0L``")!$`8A`M("`"%SH`"`$``CPU`&(0
+M00%B*`8`0!!0`0(DT``")!L`8A`M("`"%SH`"`$``CPL`&(0+2`@`A<Z``@!
+M``(\+2`@`@28!30``!`\```0)@GX``(M,```+2`@`@"B!30)^``"`P`&)"T@
+M(`)\F`4T"?@``AD`!B0```(\``!")`GX0``L`00D%CH`""T@(`(M("`"!)@%
+M-````CP``%`D"?@``BTP``#(`2.6$@`")"L`8A0M("`"?)@%-`GX``(8``8D
+M```"/```0B0)^$``+`$$)"T@(`(`H@4T$SH`"`(`!B00``(R!`!`$"T@(`($
+MF`4T_SD`"`,`!B0$F`4T+3```````CP``$(D"?A```````#(`2.6$@`")!``
+M8A0M("`"?)@%-```$#P``!`F"?@``A@`!B0```(\``!")`GX0``L`00D+2`@
+M`@"B!30M,```"?@``@`````M("`"`0`"/.CJ0B0)^$``$P`%)!,`0!`M&```
+M```"/```0B0)^$``-`@$)"T@(`(M*``````"/```0B0)^$```0`&)`<`0!`M
+M&```+2`@`@$``CSHZD(D"?A``"TH```M&$``+1!@`!``O]\(`+'?``"PWP@`
+MX`,@`+TGL/^])T@`O_]``+[_.`"W_S``MO\H`+7_(`"T_Q@`L_\0`++_"`"Q
+M_P``L/\MB(``+9B@`"VXP`````(\``!")`GX0``MH(``+9!``&8`0!(M$```
+MM"XBCC<`0!`M("`"```"/```520)^*`"()D%-`$``SPD$$,`+P!`%"T@(`*T
+M+B"N"?B@`A"<!30ML$``+2`@`@GXH`(4G`4T+8!``"T@(`()^*`"&)P%-"T8
+M0`!"(!8`0A`0`"$@@@#"$00`+2!``!L`0!""*1``&@"@4"T@(`(C\`,`&@#"
+M`Q(0```!`(!0#0`'`#\`7C`:`,4"$H````$`H%`-``<`'P`0,BT@(`()^*`"
+M()D%-$`9'@`E$$,`)1!0```(0C0M("`"+3!``````CP``$(D"?A``""9!30M
+M("`"`0`"/-SN0B0)^$``+2A``@@`0%0M("`"`@!BE@(`0C0"`&*F`@!"EOW_
+M0C"E.@`(`@!"I@```CP``%`D"?@``BTH0`(3`$`4`0`"/````CP``$(D"?A`
+M`(@3!"0M("`""?@``BTH0`(*`$`4`0`"/`(`8I8@`$(P#0!`5"T0```"`&*6
+M`@!"-`(`8J:N.@`(+1```&P+0B0)^$``+2`@`K0N@HX!`$(L``#BK@$``B1(
+M`+_?0`"^WS@`M]\P`+;?*`"UWR``M-\8`+/?$`"RWP@`L=\``+#?"`#@`U``
+MO2?@_[TG&`"__Q``LO\(`+'_``"P_RV0@``MB*```@"@%"V`H`#__Q`D+2!`
+M`@```CP``$(D"?A```P`!20M($`"`$`%)````CP``$(D"?A``"TP(`(```(\
+M``!")`GX0``/``0D`P`Q,@,`$#(M($`"`$`%)"TP``(```(\``!")`GX0``M
+M."`"+8!```$`(C((`$`4+1```BT@0`(4``4D```"/```0B0)^$``+3```"T0
+M``(8`+_?$`"RWP@`L=\``+#?"`#@`R``O2?0_[TG*`"__R``M/\8`+/_$`"R
+M_P@`L?\``+#_+:"``"V8H````*64```"/```0B0)^$```@!FE@`4`@`#)`(`
+M`@!BEH``0C`2`$`0+9```$"`!``A@`0"@(`0`````CPD.4(D(8`"`@0`!(X`
+M``(\``!")`GX0``(``4D_P!2,$"1$@````*.`!$"`"600@((``2&D0""*`0`
+M0%#H_X0D`0"",`@`0!#H_X0D```"/```0B0)^$``"``%)/\`43`H.P`(`0`"
+M),(7!``A(((`0R`$`````CP``$(D"?A```@`!23_`%$P+1```("($0!`$`(`
+M)8@B`@$$,3;_`$8R`#(&`/\`(C(E,,(`+2"``@``$#P``!`F"?@``IR8!30"
+MBA$``/]&,O\`(C(E,,(`+2"``@GX``+0F`4T-!*3K@$``B0H`+_?(`"TWQ@`
+ML]\0`++?"`"QWP``L-\(`.`#,`"])_#_O2<``+__```"/```0B0)^$``9)@%
+M-,(<`@#_`6,P``%B,`0`0!`M$&``_P%B."<8`@`M$&````"_WP@`X`,0`+TG
+MT/^])R@`O_\@`+3_&`"S_Q``LO\(`+'_``"P_RV0@`#_`+,P`(0&``.$$```
+M`!$\```Q)@GX(`)DF`4T`/`#)"000P!`&A,```YC,"400P#_`1`R)1!0`"T@
+M0`)DF`4T```0/```$"8)^``"+3!``"T@0`()^"`"8)@%-`(`0C0M($`"8)@%
+M-`GX``(M,$``!`!@$C@`%"3`$!,`(Q!3`$"B`@`M@``````"/```4R0```(\
+M``!1)"T@0`()^&`"8)@%-`(`0C`(`$`0/``"*@GX(`(M((`"`0`0)CP``BKV
+M_T!4+2!``CP``BH&`$`0+1@```$``CP8[4(D"?A``"T@0`(M&$``+1!@`"@`
+MO]\@`+3?&`"SWQ``LM\(`+'?``"PWP@`X`,P`+TG`@"BE.`!0S#```(D#`!B
+M4-`2@I3!`&(H!@!`$$`!`B2@``(D!@!B4,X2@I0(`.`#+1````4`8E0M$```
+MS!*"E```PJ0(`.`#`0`")`@`X`,`````T/^])R``O_\8`+'_$`"P_RV(@``M
+M@*```0`"/(CN0B0)^$``+3"@`Q8`0!`M&```+2`@`@```CP``$(D"?A``&"8
+M!30!``(\&.U")`GX0``M("`"+1A`````HH<J$$,`!0!`4!8``Z8"``*6`@!"
+M-`(``J86``.F``"BARH00P`!`$,X+1!@`"``O]\8`+'?$`"PWP@`X`,P`+TG
+MP/^])S@`O_\P`+3_*`"S_R``LO\8`+'_$`"P_RV`@`#,`8*,!`!"+"0`0!`M
+MD*`````"/```0B0)^$```````!\`0!`M(``"+2A``@$``CR([D(D"?A``"TP
+MH`,D`$`0+1@``"V(``````(\:#I4)`$``CQ<[5,D(1`T`@``19`M(``""?A@
+M`BTP```M&$````"BARH00P`"`$!0%@!#IA8`0*8!`#$F`P`B+A``0!`$`",N
+M_3L`""$0-`(M(``"```"/```0B0)^$``8)@%-`(`0C0M(``"+3!``````CP`
+M`$(D"?A``&"8!30!``,D+1!@`#@`O]\P`+3?*`"SWR``LM\8`+'?$`"PWP@`
+MX`-``+TG+2``````HY0```(\<#I"E"L00P`*`$`4+2A@`````CQP.D,D`0"$
+M)(`0!``A$$,```!"E"L010#[_T!0`0"$)(`8!`````(\<#I")"$88@`"`&64
+M`"P%``,D!0"X$`0`+1!$`#@9`@`M$$,`.!H"`"T00P`X'`(`+1!#`"T01``_
+M$`(`PR\%`",010``%`(`"`#@`P,4`@"@_[TG6`"__U``OO](`+?_0`"V_S@`
+MM?\P`+3_*`"S_R``LO\8`+'_$`"P_RWP@``"`**4@`!",`$`4RP"``(D(YA3
+M``(`HI3@`4,PP``")%(`8A`MH(``P0!B*`8`0!!``0(DH``")$<`8E!D$Y:4
+M#3T`""T0``"E`&(4+1``````HI1?\$(D__]",.L$0BP$`$!0``"BE%03EI2!
+M/``(5A."E'3K0B3__T(P\`!"+`0`0%```**46!.6E(@\``A:$X24A.I")/__
+M0C#A`$(L!0!`4```HI1<$Y:47A."E(L\``@$`**O719"+`4`0%0$`*"O8!.6
+ME&(3A)2+/``(!`"DKRVP``#8$I66WA*"E@``HJ\!`%<L@"`3`````CP`1T(D
+M(2""`#P`@XS_[P(\__]"-"088@#,$X*6`!<"`"488@`\`(.L2`"#C/_[`CS_
+M_T(T)!AB`,X3@I:`%@(`)1AB`$@`@ZS\`(.,]_\")"088@#*$X*6P!`"`"48
+M8@"W/``(_`"#K&83A)0$`*2OVA+5E[4\``C@$L*7:!.6E&H3A)0$`*2OW!+5
+ME^(2PI<``**O`0!7+("($P````(\`$=")"&((@*$`#"./_\")"2``@(M(*`"
+M```2/```4B8)^$`"!``%),`1`@"`&1<`)1!#`,``0C`E@`("A``PKI``,([X
+M_P(D)(`"`BT@H`()^$`"!``%)$(0`@`'`$(P)8`"`I``,*Y__P(D)(`"`BT@
+MP`()^$`"`P`%),`1`@"``$(P)8`"`I``,*Z<`#"._/\")"2``@(M(,`""?A`
+M`@,`!21"$`(``P!","6``@*<`#"NX_\")"2``@($`*2/"?A``@,`!22`$`(`
+M'`!","6``@*<`#"NS``CCO?_`B0D&&(```"DC\`0!``(`$(P)1AB`,P`(ZXM
+M@``````"/`!'420```(\``!2)$`0$``A$%``@!@"`"$8<0`A$%,`@!`"`"$0
+M40`M(,`#``!EC`GX0`(``$:,`0`0)AD``B[S_T`40!`0`,`N@*X!``(D6`"_
+MWU``OM](`+??0`"VWS@`M=\P`+3?*`"SWR``LM\8`+'?$`"PWP@`X`-@`+TG
+MX/^])Q@`O_\0`++_"`"Q_P``L/\MD(``+3B```(`PI3@`40PP``")`X`@A#!
+M`((H!@!`$$`!`B2@``(D!P""$"T0``!G/0`(&`"_WP8`@A`M&```9CT`""T0
+M```S/0`(`0`#)`(``R1`&`,`(1AG`.H29I3P$F*4@!$"`"4PP@#V$F*4`!,"
+M`"4PP@#\$F*4@!0"`"4PP@`"$V*4`!8"`"4PP@`($W&4#A-BE(`1`@`EB"("
+M%!-BE``3`@`EB"("&A-BE(`4`@`EB"("(!-BE``6`@`EB"("`0`")`H`HE`M
+MB,``"0"@4*PNY:P"``(D`P"B%"T0``!;/0`(+3`@`F<]``@8`+_?K"[EK"T@
+M0`(``!`\```0)@GX``)@F04T+2!``F29!30)^``"+3`@`@$``B08`+_?$`"R
+MWP@`L=\``+#?"`#@`R``O2>P_[TG0`"__S@`M_\P`+;_*`"U_R``M/\8`+/_
+M$`"R_P@`L?\``+#_+:"``"VPH``"`**4X`%#,,```B0@`&(0+:B``,$`8B@&
+M`$`00`$")*```B08`&(0+1```%,^``A``+_?S`!B5"T0```MN``````"/```
+M0B0)^$``1)D%-,?_`R0D$$,`T!.#EL`8`P`X`&,P)1!#`"T@@`(M,$`````"
+M/```0B0)^$``1)D%-)X]``C,`8*.G3T`"`$`%R0"`!<DS`&"C@0`0BP.`$`0
+M+2"``@```CP``$(D"?A``!"9!30#`$(T+2"``BTP0`````(\``!")`GX0``0
+MF04TS3T`""T@@`(```(\``!")`GX0``0F04T!OP#)"000P!`B!<`(8@U`N02
+M(Y8`&0,`)1!#``$`0C0M((`"$)D%-```$#P``!`F"?@``BTP0``M((`"K"ZE
+MC@```CP``$(D"?A``"TPP`+,$B:6_P'&,``"QC0M((`""?@``FB9!30M((`"
+M```2/```4B8)^$`"1)@%-'_``R0D$$,`0(`7`"&`%0*B$@.6P!D#`(`_8S`E
+M$$,`+2"``D28!30``!$\```Q)@GX(`(M,$``+2"``@GX0`)(F`4T_/\#//\/
+M8S0D$$,`J!(3)J@2!)8`(P0``P`#/`#P8S0D((,`)1!$`"T@@`)(F`4T"?@@
+M`BTP0``M((`""?A``E"8!33__P,\)!!#`"$@]0+)$H.0`!H#`"400P#&$H.0
+M)1!#`"T@@`)0F`4T"?@@`BTP0`"Z$@*6`#8"```4`@`E,,(`P!(#E@`2`P`E
+M,,(`)3##`"T@@`()^"`"-)@%-"T@@`()^$`"*)@%-/__`SS_`&,T)!!#``8`
+M8Y8`&@,`)1!#`"T@@`(HF`4T"?@@`BTP0``M((`""?A``F28!33X_P,\_P]C
+M-"000P"T$@26`",$``<``SP`\&,T)""#`"401``M((`"9)@%-`GX(`(M,$``
+M<!*BE@,P0BP+`$`0`@`0),H!@Y8B$`(D%`!B%"T@@`("`,*60`!",!``0%0(
+M`!`D0SX`"````CP``,*6'P!",`H`0!`M((`"]O]")`T`0BP'`$`4```"/$`0
+M%P`A$%4`)A-"E"&``@(M((`"```"/```0B0)^$``))D%-`'_`R0D$$,`0!@0
+M`/<`8S`E$$,`+2"``BTP0`````(\``!")`GX0``DF04T`0`")$``O]\X`+??
+M,`"VWR@`M=\@`+3?&`"SWQ``LM\(`+'?``"PWP@`X`-0`+TG\/^])P``O_\M
+M,*``0`"B+`(`0!0M&*``/P`#)/P!@Z0```(\``!")`GX0``\F04T`0`")```
+MO]\(`.`#$`"])\#_O2<X`+__,`"T_R@`L_\@`++_&`"Q_Q``L/\MB(``+9"@
+M``(`HI3@`4,PP``")!0`8A`M@(``P0!B*`8`0!!``0(DH``")!<`8A`M$```
+MR#X`"#@`O]]#`&(4+1```.83@I0$`**GTA.")```HJ_H$X(D"`"BKTH7E)2C
+M/@`(3!>3)/`5@I0$`**G\A6")```HJ\2%H(D"`"BKYP7E)2C/@`(GA>3)/`5
+M@I0$`**G^!6")```HJ^N%H(D"`"BK[P7E)2C/@`(OA>3)"$0`@*_/@`(U!=%
+M)```1I8M("`"`0`"/#S[0B0)^$``+2B@`RT@(`(```(\``!")`GX0``M*$`"
+M+3!``"T8``!T$P*6#0!`$"TH```M($``0!`#`"$04`!V$T*4!`!`4`$`8R3F
+M_T80@!$#``$`8R0J$&0`]_]`%$`0`P#__X<R+2`@`BTP8`(!``(\O/]")`GX
+M0``M0$`"`0`")#@`O]\P`+3?*`"SWR``LM\8`+'?$`"PWP@`X`-``+TGH/^]
+M)U@`O_]0`+[_2`"W_T``MO\X`+7_,`"T_R@`L_\@`++_&`"Q_Q``L/\``*2O
+M+;"@`/__U3`$`*"O/P`>)```!#P``(0D```0/```$"8)^``""`$%)```!#P(
+M`80D"?@``H``!20```(\"`!7)(``\R8!`!$D+9```$`0$@`A$%<```!1I`$`
+M(B;__U$P`0!")O__4C!``"(N^/]`%$`0$@````(\``!")`8`4J0!``,D`@!#
+MI#\``R0$`$.D__]",A,`0!`MD````0`"/``&5"0```(\``!1)$`0$@`A@%,`
+M(1!7````190M(*`""?B``BTPP`(```*F`0!")O__4C`&`"*6*Q!"`O3_0!1`
+M$!(```!FA@```CP&`$.40!`#`"$04P#^_T>$'@!@$"V0``````(\``!()$`0
+M$@`A$%,```!#A"H0PP`$`$!4!@`"E2TP8``$`+*O!@`"E2,04@#__T(D__]1
+M,`X`(!)`$!$`(2!3`/[_@X0``(*$*A!#``(`0!```(64_O^%I`$`0B;__U(P
+M!@`"E2L00@+G_T`40!`2`````CP&`$*4#P!`$"V0``````(\!@!$E$`0$@`A
+M$%,```!#A"H0XP`#`$`0`0!")BTX8``M\$`"__]2,"L01`+V_T`40!`2`!D`
+MPR3K400\'X6$-!P`9``2$```/Q`"``,1`@##'P,`(Q!#`$`8`@`A&&(`P!@#
+M`"$88@!`'`,``X0#`"V0```M$``"'`!$`!(0```_$`(``Q$"`,,?`P`C$$,`
+M`0!")!4`0!@MB``````"/`@!1202$```/Q`"``,1`@##'Q``(Q!#``$`1"0M
+M$$`"`0!#)O__<C!`$`(`(1!%``0`HX\``$.D`0`B)O__43`J$"0"]O]`%"T0
+M0`(```(\!@!"E$`0`@`A$%,`_O]"A"H0`@(]`$`0+8@``````CP``%0D`0`"
+M/"0(5B0```(\"`%5)#(``B8`%`(``X0"``8`@I9`$`(`(1!3`/[_0H21/P`(
+M*B`"`O__43`*`(`00!`1`"$04P```$.$(Q@#`@(`0H0C$`("&`!B`!(8``#U
+M_V`<`0`B)O__!#)`$!$`(1A3````990"`&:4(1!7````1Y1`.`<`___G,`(`
+M2)1`0`@`__\(,0GXP`(M2````0!")/__0C!`&!(`(1AU`$(0`@```&*D__]"
+M,"L0P@,!`$!4``!^I`$`0B;__U(P!@""ED`0`@`A$%,`_O]"A"H0`@+,_T`4
+M,@`")D``0BX+`$`0```"/`@!1"1`$!(`(1!$`/[_0Y0``$.D`0!")O__4C!`
+M`$(N^?]`%$`0$@"`H1`T+8@``````CP(`5,D```"/```4B2`$!$`(1!3``(`
+M1I0`,@8`_P#&-``T!@```$*4`!("`/\`0C3__T(P)3#"````I(\)^$`"+2@`
+M`@$`(B;__U$P(``B+N[_0!0$`!`F6`"_WU``OM](`+??0`"VWS@`M=\P`+3?
+M*`"SWR``LM\8`+'?$`"PWP@`X`-@`+TG</^])X@`O_^``+[_>`"W_W``MO]H
+M`+7_8`"T_U@`L_]0`++_2`"Q_T``L/\M\(``+:B@`"V0P``MB``!___S,!@`
+MI*\<`*"O(`"@KR0`H*\_``(D*`"BKS``H*\```(\B`%6)`4``H%`$`(`__]"
+M,"P`HJ\"``*5``%",`4`0!`MN```%D``"(X2AH!Z0``()`"PKQ@`HX^/$F:`
+M+2#``P```CP``$(D"?A``"TH(`(`%@(``Q8"`#,`H!(T`**O+8```,`0$``A
+M&%4```!BE`D`0!!`$!``(1!=````8Y0(`$.D`0`")O__4#`(``(N]?]`%,`0
+M$``MH``"```DE@@`I2<M,``"+3B@`P$``CP@"4(D"?A```(`J"<+`(`2+8``
+M````HY=`$!``(1!=``@`0I0%`&(0`0`")O__4#`K$!0"^?]`%$`0$````*.7
+M`@"BEP0`8A3`$!`````BE@4`8A#`$!``(1!5``0`0HP%`$`0`````,`0$``A
+M$%4``@!"E"@`HJ\.`&`2+8```$`8$``A&'T`@!`0`"$04`!`$`(`(1!2``@`
+M0I0(`&*D`0`")O__4#`K$!,"]?]`%$`8$````"26"`"E)RTP8`(M.*`#`0`"
+M/"`)0B0)^$```@"H)Q$`8!(M@`````"DEP(`HY=`$!``(1!=``@`0I0!`()0
+M'`"PKT`0$``A$%T`"`!"E)W_8A`!``(F__]0,"L0$P+T_T`40!`0`"V````"
+M`"*60`!",#8`0!`(``(N!0`"+@P`0%`%``(D'`"ECX`0!0`A$$4`0!`"`"$0
+M4@`&`$*4(`"BKR0`IH^`$`8`QT``""$01@`,``)6!@`")!P`HX^`$`,`(1!#
+M`$`0`@`A$%(`!`!"E"``HJ\D`*6/@!`%`-5```@A$$4`#``"5@<``B0<`*:/
+M@!`&`"$01@!`$`(`(1!2``(`0I0@`**O)`"CCX`0`P#C0``((1!#`$T``E8`
+M`"26'`"ECX`0!0`A$$4`0!`"`"$04@```$*4(`"BKR0`IH^`$`8`\4``""$0
+M1@!``$!0```DEH`0$`````,\I#IC)"$00P```$*,"`!````````<`*./@!`#
+M`"$00P!`$`(`(1!2``8`0I0@`**O)`"ECX`0!0`A$$4`0!`"`"$04@#T0``(
+M!@!7E!P`IH^`$`8`(1!&`$`0`@`A$%(`!`!"E"``HJ\D`*./@!`#`"$00P!`
+M$`(`(1!2`/1```@$`%>4'`"ECX`0!0`A$$4`0!`"`"$04@`"`$*4(`"BKR0`
+MIH^`$`8`(1!&`$`0`@`A$%(`]$``"`(`5Y0<`*./@!`#`"$00P!`$`(`(1!2
+M````0I0@`**O)`"ECX`0!0`A$$4`0!`"`"$04@```%>4```DE@``I9<"`*:7
+M(`"GCRU`X`(!``(\)`A")`GX0``M2```+2!``"@`IH\K$$8``@!`$"T8P``M
+M&(```@`BEA``0C`,`$`0__]D,!@`HX]P$F*4`3!"+`@`0!1`$!``?A)CE/__
+M8C`K$((``0!`5"T8@`#__V0P0!`0`"$H5@`L`*:/-`"BCR,8P@`J$(,``0!`
+M5"T8@``0```6``"CI``"PX]`&`,````"/)@Z0B0A&&(```!CE$`8`P```,*6
+M(Q!#```4`@`#%`(``P!`'#``HJ\!``,D,`"CKT`0$``A*%8```"DE#``HX\J
+M$(,``0!`5"T8@``!``(F__]0,`@``BY%_T`4``"CI```PI88`*6/Q"ZBK"TP
+M```!`-$P@(<1``8`QI8_`,8P`#8&`"4P!@*`I1$`)3#4``0`PI8_`$(P`!0"
+M`"4PP@"`FQ$`)3#3``(`PI8_`$(P`!("`"4PP@"`B1$`)3#1````PI8_`$(P
+M)3#"`"T@P`,``!(\``!2)@GX0`(TF04T#@#"EC\`0C``%@(`)8`"`B6`%`(,
+M`,*6/P!",``4`@`E@`(")8`3`@H`PI8_`$(P`!("`"6``@(E@!$""`#"EC\`
+M0C`E@`("+2#``SB9!30)^$`"+3```@``Q98```(\``!")`GX0``M(,`#``#"
+MEOX!PJ>(`+_?@`"^WW@`M]]P`+;?:`"UWV``M-]8`+/?4`"RWT@`L=]``+#?
+M"`#@`Y``O2>0_[TG8`"__U@`M_]0`+;_2`"U_T``M/\X`+/_,`"R_R@`L?\@
+M`+#_+:C``/__ES#__[8P+2#@`BTHP`(!``(\F`=")`GX0``M.*`#1P!`%```
+MHI<$`*:6+2#@`@``I8X"`*<G`0`"/"`)0B0)^$``!`"H)P(`I9<M(,`"+3"@
+M`@8`IR<!`!`\1`H0)@GX``((`*@G!`"EERT@P`(M,*`""@"G)PGX``(,`*@G
+M`@"DEP8`I9<.`+,G+3"@`@$`$#R8!Q`F"?@``BTX8`("`*27"`"EEQ``LB<M
+M,*`""?@``BTX0`(&`*67"`"FEPX`IY<0`*B7+2#``@$`$3PD"#$F"?@@`BU(
+M```MH$``!`"DEPH`I9<M,*`""?@``BTX8`($`*27#`"EERTPH`()^``"+3A`
+M`@H`I9<,`*:7#@"GEQ``J)<M(,`""?@@`BU(```"`*67!`"FERT@X`(M.(`"
+M+4!```GX(`(M2```8`"_WU@`M]]0`+;?2`"UWT``M-\X`+/?,`"RWR@`L=\@
+M`+#?"`#@`W``O2?__X0P__^E,`@`R(P$`,*4'`!`$"U0``````*5%`!$%`$`
+M0B4(``,E!@`"E0\`0!`M2`````!BE`<`150!`"(E0!`)`"$02``>`$*4``#B
+MI`@`X`,!``(D__]),`8``I4K$"(!\_]`%`(`8R0!`$(E__]*,`0`PI0K$$(!
+MYO]`%#0`""4(`.`#+1```/__@S#__Z4P___&,/__ZC#__P@Q9``+)!@`2`$2
+M$```-`!`$"TX```!`"!5`0`+)"<`Q1`C&&4`0!`#`"$00P#`$`(`(1!#`(`0
+M`@`C&,4`&@!#`!(0```!`&!0#0`'```4`@`#)`(``P"!!&4`@B@^0@`(__]'
+M,0@`0!08`(@`'``@$?__!S%`$`@`(1!(`,`0`@!$0@`((1!(`!(0``!D``,D
+M(QAD`!@`:@`2&```(1!#```````:`$L`$A````$`8%$-``<`1D(`"/__1S`M
+M.$`!!P`@$0````!`$`H`(1!*`,`0`@`A$$H`@!`"`/__1S`(`.`#+1#@`/__
+MQC!`$`8`(1!%`/[_293__X0P0!`$`"$01`#`$`(`(1!$`(`@`@```*.40!`#
+M`"$00P#`$`(`(1!#`(`0`@#V_T(D*Q""``4`0%!`$`D```"BE```XJ1M0@`(
+M``"BE"$020#`$`(`(1!)`(`0`@`*`$(D*Q!$``P`0!````````#II`@`X`,`
+M``FE``#BI```(I4(`.`#```"I0``(I4``.*D;4(`"`(`(I4;`,`0+5```$`0
+M"@`A2$4````CE4`0`P`A$$,`P!`"`"$00P"`$`(`(Q!$``D`0B03`$(LZO]`
+M5```(I4"`".50!`#`"$00P#`$`(`(1!#`(`0`@#V_T(D*Q""`.3_0!0!`$HE
+M*A!&`>C_0!1`$`H`"`#@`P````#P_[TG``"_____A##__Z4P"`##C`0`PI0M
+M2$``!P!`$"TP`````&*4!`!%$`$`QB0J$,D`^_]`%#0`8R0(`&4D`0`"/"`)
+M0B0)^$``!@!FE```O]\(`.`#$`"])Q`LAB0```4\R#JE)`0`HXP0+(.LP!`#
+M`",00P"`$`(`"`"E)"$010`8`,*L`0`")!0`PJP4``(D#`#"K",``B0(`.`#
+M$`#"K#02@HP"`$*4(`!",`<`0!`M0```'``&)$``!"1R``<D#`"@K,M"``AW
+M``(D,@`&)"T@```R``<D%``")`P`HJPC``(D$`"BK`0`I8PK$*@`!`!`%"T8
+M```K$,4`!P!`$``````K$*0`!`!`5`$``R0K$.4``0!`5`$``R0(`.`#+1!@
+M`/#_O2<(`+__``"P_RV`@`#$+H:,0#(&``!^QC``@,8T```"/```0B0)^$``
+M,)D%-`$``B3`+@*N"`"_WP``L-\(`.`#$`"])^#_O2<8`+__$`"R_P@`L?\`
+M`+#_+8"``!`LD204`"*.+`!`$"T8``#`+H.,`0`")"@`8E3`+@..```"/```
+M0B0)^$``,)D%-"T80```@$(P(`!`5,`N`XY"%@,`!``BKL`N`*XM(``"`0`"
+M/.@*0B0)^$``+2@@`A8`0%3`+@..+2```@$``CRD#$(D"?A``"TH(`(/`$!0
+MP"X#CBT@``(!``(\U`Q")`GX0``M*"`"!P!`&"T@``(!``(\A`Y")`GX0``M
+M*"`"`@`"),`N`J[`+@..+1!@`!@`O]\0`++?"`"QWP``L-\(`.`#(`"])P0`
+MHXP,`**,*Q!#``4`0!`M(```$`"BC"L08@`"`$`4``````$`!"0(`.`#+1"`
+M`!0`HHQH`$`0__\&)```I(S`$`0`(Q!$`(`0`@````,\T#IC)"$00P`8`**L
+M!`"BC!``HXPK$$,`)P!`5`0`HXQ9`(`0``````0`HHP(`**L$`"CC"L00P`=
+M`$`4+3A@````HHQ0`$`0`0`&)````CS(.DDD```"/-`Z2"0``**,__]&)```
+MIJS`(`8`(R"&`(`@!``A$(D`&`"CC!``0HP(`&.,(Q!#`$`0`@`(`*.,(QAB
+M``@`HZPA((@`*QAG``,`8!08`*2L[?_`5```HHR?0P`(`0`&)`P`HHPK$$,`
+M,0!`%"TP``````(\R#I"C/__0B0``*.,*P!B$/[_!B0$`*.,"`"CK`P`HHPM
+M0$``*Q!#`"0`0!0"``8D```"/,@Z0XS__V,D``"BC"T@0``K$$,`'`!`$```
+M``````(\R#I*)````CS0.DDD+3A@``$`AB0``*:LP"`&`",@A@"`(`0`(1"*
+M`!@`HXP0`$*,"`!CC",00P!`$`(`"`"CC",88@`(`*.L(2")`"L8`P$$`&`4
+M&`"DK"L0QP#L_T`4+2#```(`!B0(`.`#+1#``!0`HHP-`$`0`````!@`HHP`
+M`$*4T!."I!@`HHP"`$*4SA."I!@`HHP$`$*4S!."I!@`HHP&`$*4RA."I`@`
+MX`,`````X/^])Q@`O_\0`++_"`"Q_P``L/\MD(``+8"@`"V(@`````(\``!"
+M)`GX0``$@`4T__]#,`$``B05``(2`@`"*@4`0%`&``(D#0``$A@`O]_A0P`(
+M$`"RWP8``E+(+D:."``")`H``A(8`+_?X4,`"!``LM\E,&8`V4,`"($``CS(
+M+D:.)3!F`-E#``A"``(\R"XFCB4P9@`@``(\)3#"`"T@0`(```(\``!")`GX
+M0``$@`4T&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TG\/^])P``O_\!``(\R`Y"
+M)`GX0`#<`86,``"_WP@`X`,0`+TGX/^])Q@`O_\0`++_"`"Q_P``L/\MB(``
+M```"/```0B0)^$``+8"@`"V00`#_?P4\__^E-"0H10````(\``!")`GX0``M
+M("`"+2`@`@```CP``$(D"?A``#``!20M($``\`-#,`8``!("&0,`)0`")",0
+M0P!"$`(`&$0`""$88@`"`&(L"`!`$/__8R0M("`"```"/```0B0)^$``+2A`
+M`BA$``@M$```#_P&)"0PA@``$0,`\`-","4PP@`M("`"```"/```0B0)^$``
+M,``%)"T@(`(```(\``!")`GX0``M*$`"`0`")!@`O]\0`++?"`"QWP``L-\(
+M`.`#(`"])_#_O2<``+__+1B@``H`HB@*`$`0+2@````I`P`C**,`@"@%`"$H
+MA0````(\``!")`GX0`!0+*4D+2A``"T0H````+_?"`#@`Q``O2?P_[TG``"_
+M_RU`P``*`*(H"P!`$"T8````,04`(S#%`(`P!@`A,(8`4"S&)````CP``$(D
+M"?A``"TH``$M&$``+1!@````O]\(`.`#$`"])]#_O2<H`+__(`"T_Q@`L_\0
+M`++_"`"Q_P``L/\MD(``+8B@``(``B0-`*(0+:#```,`HBP&`$`0`P`")`$`
+M`B0+`*(0+9@``)A$``C__P,D!0"B$/__`R291``(+1!@`'9$``@)`!,D=D0`
+M"`@`$R14+(*,)0!`%"T8``!W1``(`!$3```1$P`C$%,`@!`"`"&`@@!0+!`F
+M!``"CAL`0!3__P,D+2```@```CP``$(D"?A``#P`!20-`(`6!``1K@L``B0,
+M``*N`@`")!0``J[__P(D&``"KO\#`B0<``*N"@`")"```J:71``((@`"IBT@
+M0`(M*&`"```"/```0B0)^$``+3"``BT88`(M$&``*`"_WR``M-\8`+/?$`"R
+MWP@`L=\``+#?"`#@`S``O2?@_[TG&`"__Q``LO\(`+'_``"P_RV`@``\+(:,
+M_P/&,$0L@HP`%`(`_P,2/"004@`E,,(````1/```,28)^"`"I``%)$`L!H[_
+M`\8P2"P"C@`4`@`D$%(`)3#"`"T@``()^"`"J``%)"T@``(```(\``!")`GX
+M0`"L``4D`/P#)"000P!,+`.._P-C,"400P`M(``"K``%)`GX(`(M,$``&`"_
+MWQ``LM\(`+'?``"PWP@`X`,@`+TG\/^])P``O_\*`*(L(0!`$"T8````$04`
+M(Q!%`(`0`@`A.((`4"SG)`0`XHP:`$`0+1!@``0`X*P!``,D!!BC`"<8`P`\
+M+(*,)!!B`#PL@JQ`+(*,)!!B`$`L@JQ$+(*,)!!B`$0L@JQ(+(*,)!!B`$@L
+M@JQ,+(*,)!AB`$PL@ZP!``(\A!)")`GX0``M*.```0`#)"T08````+_?"`#@
+M`Q``O2?`_[TG,`"__R@`M?\@`+3_&`"S_Q``LO\(`+'_``"P_RV8@``MH*``
+M+:B``#02A(P*`*(L7`%`$"T8````$04`(Q!%`(`0`@`AD&("4"Q2)@0`0HY4
+M`4`0`0`#)!@`0X[__P(D$P!B5!@`1HX%`(`0H``#)`(`@I2@`$(P`@!#$!\`
+M!"0/``0D`0`&)"L0Q``)`$`0@(`4`$`0!@`!`$8T*Q#$`/W_0!1`$`8`)D4`
+M"("`%`"`@!0`0!`%)O\#QC`<`$..@!H#``\``CP`_$(T)!AB`"4PPP`4`$*.
+M`!4"`/`/`SPD$$,`)3#"`````CP``%$D"?@@`BT@8`*`$`4F(@!&E@`Q!@#P
+M`,8P(`!"E@\`0C`E,,(`"``"/``@0C0E,,(`"?@@`BT@8`+`"04F+2!@`@GX
+M(`(`"`8DS`%BC@0`0BP&`$!0)`!"C@`1!28M(&`""?@@`@`!!CPD`$*.'@!`
+M4#``0HZ`@!0`P`@%)O\`!CS__\8T)#!&`"@`0HX`%@(`)3#"`````CP``$(D
+M"?A``"T@8`+`"1`F+2!@`@```CP``$(D"?A``"TH``(!`$8T*`!"C@$`0%0`
+M`<8T@"@4`,`)I20```(\``!")`GX0``M(&`",`!"C@T`0%`L`$*.@"@4```)
+MI23_``8\___&-"0P1@```0(\)3#"`````CP``$(D"?A``"T@8`(L`$*.'`!`
+M4`P`0HZ`@!0`P!`%)@\`!CS__\8T)#!&`!```CPE,,(````"/```420)^"`"
+M+2!@`@P`0HX@`$(P#0!`4`P`0H[`"1`F+2!@`@```CP``$(D"?A``"TH``(`
+M`D(T+2!@`BTH``()^"`"+3!```P`0HX!``,\)!!#`!$`0%`,`$*.@(`4```1
+M$"8M(&`"```"/```0B0)^$``+2@``B```SPE$$,`+2!@`BTP0`````(\``!"
+M)`GX0``M*``"#`!"CH```SPD$$,`$`!`4`0`0XZ`@!0``!$0)BT@8`(```(\
+M``!")`GX0``M*``"``)"-"T@8`(M,$`````"/```0B0)^$``+2@``@0`0XX"
+M``(D!0!B$`,``B09`&)0@(@4``E&``@X`$*.@(`4`,`)$"8M(&`"```"/```
+M0B0)^$``+2@``J(`0C0M(&`"+3!``````CP``$(D"?A``"TH``+,`6*.!`!"
+M+`(`0!`E``,\)0$#/(`H%``#1@`(`!&E),`),"8M(&`"```"/```0B0)^$``
+M+2@``F("0C0M(&`"+2@``@``$#P``!`F"?@``BTP0`````(\``!#C````CP`
+M`$*,(QAB`,PNHHXC&$,````"/```0HPC&&(`@!H#```),28``08\)3!F`"T@
+M8`()^``"+2@@`LP!8HX$`$(L`@!`$`0``SP$`0,\@"@4`,`)I20M(&`"```"
+M/```0B0)^$``+3!@`#@`0HX!`$(P$0!`4`P`0HZ`@!0``!$0)BT@8`(```(\
+M``!")`GX0``M*``")``#/"400P`M(&`"+3!``````CP``$(D"?A``"TH``(,
+M`$*.`0!",`4`0!`!``(D!!""`CPLHXXG1@`()1!#``00@@(G$`(`/"RCCB00
+M0P`\+**N#`!"C@$`0C`%`$`0`0`")`00@@)`+*..-$8`""400P`$$((")Q`"
+M`$`LHXXD$$,`0"RBK@P`0HX"`$(P!0!`$`$``B0$$(("1"RCCD%&``@E$$,`
+M!!""`B<0`@!$+*..)!!#`$0LHJX,`$*.!`!",`4`0!`!``(D!!""`D@LHXY.
+M1@`()1!#``00@@(G$`(`2"RCCB000P!(+**N#`!"C@@`0C`%`$`0`0`")`00
+M@@),+*..6T8`""400P`$$((")Q`"`$PLHXXD$$,`3"RBKBT@8`(!``(\A!)"
+M)`GX0``M*$`"`0`#)"T08``P`+_?*`"UWR``M-\8`+/?$`"RWP@`L=\``+#?
+M"`#@`T``O2?P_[TG``"__X`H!0````(\``!")`GX0```"*4D``"_WP@`X`,0
+M`+TG\/^])P``O_^`*`4````"/```0B0)^$````BE)`$``B0``+_?"`#@`Q``
+MO2?P_[TG``"__P$`!B0$,*8````"/```0B0)^$``0`@%)`$``B0``+_?"`#@
+M`Q``O2?0_[TG(`"__Q@`L_\0`++_"`"Q_P``L/\MF(``+8B@`(`H!0````(\
+M``!2)`GX0`(`"J4D`P!0,`H``!8M$``"+2!@`@GX0`)`"`4D`0`#)`08(P(D
+M$$,``0!`5`$`$"0M$``"(`"_WQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])]#_
+MO2<H`+__(`"T_Q@`L_\0`++_"`"Q_P``L/\MD(``+8B@``$`!B0$,*8````"
+M/```0B0)^$``@`@%)"V```````(\``!4)````CP``%,D+2!``@GX@`(M*"`"
+M!P!`$"T@0`()^&`""@`$)`$`$"80)P(J]_]`%"T@0`*`"`4D```"/```0B0)
+M^$``+3```!`G`BHH`+_?(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])P@`
+MI(__#\8P@%0*`"4PR@`$`**/0!8"`"4PP@`!`((P`P!`$```HX\``0(\)3#"
+M`!``@C`$`$`0!`"",``@`CPE,,(`!`"",`0`0!`@`((P0``"/"4PP@`@`((P
+M`@!`$(```CPE,,(`"P"FJ`@`IK@"`((P`P!`$(!&"`"```(\)4`"`0\`J*@,
+M`*BX__\")`\`8A!`&P,`#P"DB`P`I)@/``(\`.!"-"088@`E((,`#P"DJ`P`
+MI+@+`**("`"BF`!``SPE$$,`"P"BJ`@`HK@(`.`#`0`")`@`X`,M$```"P"B
+MB`@`HI@`(`,\)1!#``L`HJ@(`.`#"`"BN`<`X!``````#P"BB`P`HI@/```5
+M)1!&`"U'``@`$$(T"0``40`0PC0+`"*)"``BF0L`HJ@(`**X#P"FJ`P`IK@P
+M1P`(+1````L`H*@(`*"X#P"BJ`P`HK@M$```%P"BJ!0`HK@3`**H$`"BN`@`
+MX`,!``(D%P"BB!0`HI@!`$(P2@!`$`\``R07`**(%`"BF/X?0C!"$`(```#"
+MI!,`HH@0`**8`A0"``(`PJ0$`,"@$P"BB!``HI@!`$(P%P!`%``````3`**(
+M$`"BF`(`0C`"`$`0`0`")`0`PJ`3`**($`"BF`@`0C`$`$`0``````0`PI`"
+M`$(T!`#"H!,`HH@0`**8!`!",`0`0!``````!`#"D`0`0C0$`,*@"P"BB`@`
+MHIB"%`(`#P!",`4`PJ`7`**(%`"BF$(3`@`&`,*@$P"BB!``HI@`#T(P`AH"
+M``<`PZ`3`**($`"BF/``0C`"$0(`"`#"H!,`HH@0`**8`/!",`(3`@`)`,*@
+M"@#`H/\`8C`#`$`0"P#`H`$`8B0'`,*@"`#"D`0`0!`M&```"`#"D`$`0B0(
+M`,*@"`#@`RT08``(`.`#`````+PN@I`(`$(TO"Z"H`0`HI`(`$(T!`"BH+HN
+M@I0``**DO"Z"D`0`HJ"]+H*0!0"BH`@`X`,M$```X/^])Q``O_\(`+'_``"P
+M_RV(@`"`0`4D2)(&/```$#P``!`F"?@``@#\QC0M("`"@$`%))(D!CP)^``"
+M)$G&-"T@(`*`0`4D`"@&/`GX``(Y`,8T+2`@`H!`!2064P8\"?@``B0(QC0M
+M("`"@$`%))CE!CP)^``">07&-"T@(`*`0`4D'0`&/`GX``+_[\8T+2`@`H!`
+M!22J&@8\"?@``D"^QC0M("`"@$`%)!"^!CP)^``"5%7&-"T@(`*`0`4D#@`&
+M/`GX``(',,8T+2`@`H1`!20)^``"+3```!``O]\(`+'?``"PWP@`X`,@`+TG
+MX/^])Q@`O_\0`++_"`"Q_P``L/\MB(``T)@%-````CP``$(D"?A``!8<!B0M
+M@``````"/```4B0M("`"@)@%-`GX0`(!``8\`0`0)@@``BKZ_T`4+2`@`@``
+M`CP``$(D"?A```"<!30"%@(``AD"``\`0C``$0(`)1!B`"T@0`````(\``!"
+M)`GX0``(``4D&`"_WQ``LM\(`+'?``"PWP@`X`,@`+TGD/^])V``O_\M.(``
+M+3"``````CQH3D(D!P!#:```0VP/`$1H"`!$;!``18P'`*.S``"CMP\`I+,(
+M`*2W$`"EKP```CR`3D(D!P!#:```0VP/`$1H"`!$;!``18P?`*.S&`"CMR<`
+MI+,@`*2W*`"EKP```CR83D(D!P!#:```0VP/`$1H"`!$;!``18PW`*.S,`"C
+MMS\`I+,X`*2W0`"EKP```CRP3D(D!P!#:```0VP/`$1H"`!$;!``18Q/`*.S
+M2`"CMU<`I+-0`*2W6`"EKRTH``"`$`4`(2!&`"$070```$.,*$:#K!@`0XP\
+M1H.L,`!#C%!&@ZQ(`$*,9$:"K`$`I20%`*(H\_]`%(`0!0`M(.`````"/```
+M0B0)^$```0`%)&``O]\(`.`#<`"])T`H!0`A**8`0"@%`"$HI``(`.`#_A6B
+ME,#_O2<P`+__*`"U_R``M/\8`+/_$`"R_P@`L?\``+#_+8"``"V8P``MH.``
+M+:@``?__L3````4\Z#NE)```$CP``%(F"?A``G`2!B0,`!.N$``4KA0`%:[(
+M`1&FR@$`IC\``B3\`0*F``(`KKPO`*[`+P"N``@"/,PO`JZ!!P(DU"\"KMPO
+M`*X_``(\/S]"-.`O`JYD``(DY"\"K@(``B3H+P*N__\")/@O`J[\+P*N`#`"
+MKCPL!"8```4\R$ZE)`GX0`(&``8D!#``HC``O]\H`+7?(`"TWQ@`L]\0`++?
+M"`"QWP``L-\(`.`#0`"])_\`A##_`*4P+3```````CS03D<D0!`&`"$01@`A
+M&$<```!BD`H`1%0!`,8D`0!BD"L0H@`&`$!4`0#&)`(`8I`K$$4`!@!`$`$`
+M`R0!`,8D!`#"+/#_0%1`$`8`+1@```@`X`,M$&``L/^])T@`O_]``+;_.`"U
+M_S``M/\H`+/_(`"R_Q@`L?\0`+#_+8B@`"V0P``MF.``+:@``?__D#````(\
+M``!")`GX0`"H1@0D`P!`%"V@0`"32@`(`@`")"T@0``M*``"+3`@`BTX0`(M
+M0&`"```"/```0B0)^$``+4B@`BV0@`(M((`"+2@``````CP``$(D"?A```$`
+M!B08`$`0+2"``@```CP``$(D"?A``"!`!23_`$,P`A$#`,P!@JX/`&(PT`&"
+MILP!A)(!``(\*")")`GX0`#0`862L`%`$`T``B0M((`"```"/```0B0)^$``
+M+2@```,`0!0M((`"BTH`"`,``B0```(\``!")`GX0``8F`4TT@&"ILP!@XX)
+M``(D!P!B$`H``B0*`&(4```"/-`!@I8$`$(L!@!`$````CP!``(\6!Y")`GX
+M0``M($`"```"/```0B0)^$``+2!``@,`0%3,`4*.BTH`"`X``B0%`$(L#0!`
+M%"T@0`(```(\``!")`GX0``00`4D`!!"-"T@0`(M,$`````"/```0B0)^$``
+M$$`%)"T@0`(`F`4T```"/```0B0)^$``!P`&)````CP``$(D"?A``"T@0`+4
+M`4*F__]",/``0S`P``(D,0!B$#$`8B@&`$`08``")!```B0L`&(0(``")"I)
+M``@`````*`!B$&$`8B@"`$!0H``")%```B0D`&(0S`%#CM0!0I8A`$`4````
+M``4``B0)`&(4!P`")-`!0YY#``(\"0!"-`,`8E3,`4..34D`"$8``B0'``(D
+M$@!B$%$``B0+``(D`P!B5,P!0XY-20`(40`")`H`!"0)`&00"0`")`@`8A!B
+M``(D"0!D5,P!0X[0`4*6!`!"+`4`0%#,`4..8@`")-0!0J;,`4.."@`$)!,`
+M9!`)``(D$@!B4"T@0`(&`&14U`%#EM`!0I8$`$(L#`!`%"T@0`+4`4.6\`!B
+M,-#_0B1``$(L!@!`$"T@0`(/`&(P!0!"*"@!0!0-``(D+2!``L$`!20```(\
+M``!")`GX0``M,*`#'P%`$```HI<",$(L`P!`4```HI>+2@`(!0`")'`2@J8M
+M($`"```"/```0B0)^$``$$`%)!@`0S#"&`,``@`")`\`8A`#``(D#@%B$`H`
+M`B3,`4.."0`")`D`8A`*``(D"0%B5`0`HJ_0`4*6!`!"+`0`0!0M($`"BTH`
+M"`H``B0M($`"/P`%)````CP``$(D"?A``"TPH`/Z`$`0"``")```HI=R$H*F
+M+2!``AP`!20```(\``!")`GX0``M,*`#[P!`$```HI<-`$`00`,3)/#_4S``
+MFQ,`+2!``AL`!20```(\``!")`GX0``M,*`#XP!`$```HI<EF&("0/]S)BV`
+M```.`&`2+8@``````CP``%8DP``%)BT@0`()^,`"+3"@`]8`0!```**7)H@B
+M`@$`$"8K$!,"]_]`%,``!2;__P(TSP`B%@<``B0*``(DYA."I@,``B3P%8*F
+M+8````L``R1`$!``(1!0`(`0`@`A$%``@!`"`"$05`#N$T.D`0`0)@H``B[W
+M_T`40!`0`"V```````(\6$Y')````CQ@3D8D"P`%)$`0$``A(%0`(1A'````
+M8Y3X%8.D(1A&````8Y3R%8.D(1!0`(`0`@`A$%``@!`"`"$05`"T%D6D&!9%
+MI`$`$"8#``(N[_]`%$`0$`!P$H4F```"/```0B0)^$``+2!``IX`0!`(``(D
+M<!*"E@-00BP5`$!0BA*"ELP!0XX*``0D"0!D$`D``B0(`&(0:`8")`T`9%2*
+M$H*6T`%"E@0`0BP)`$!0BA*"EF@&`B0`%H*FL`0")`06@J8`@`(D"!:"IOX5
+M@J:*$H*6'@!`$!```R34`4*6\`!",!L`0Q0M($`"`)@%-```$3P``#$F"?@@
+M`@=`!B0``!`\```0)@GX``+0!P0D```"/```0B0)^$``+2!``M8!0J8M($`"
+M`)@%-`GX(`('``8D"?@``M`'!"36`4*6\`!","```R1G`$,4#0`")"T@0`*_
+M``4D```"/```0B0)^$``+3"@`U\`0!`(``(D``"BEW02@J8(`D*F```"/```
+M0B0)^$``+2!``E4`0!`*``0DS`%#C@L`9%`M($`""0`")`@`8E`M($`""@!D
+M%`<``B30`4*6!`!"+`8`0%`'``(D+2!``@0`I2<```(\74H`"```0B0%`&(0
+M+2!``@L``B0&`&)4U`%"EBT@0`($`*4G```"/%U*``@``$(D\`!",-#_0B1`
+M`$(L!0!`$"T@0`($`*4G```"/%U*``@``$(D!`"E)P```CP``$(D"?A`````
+M```L`$`0`````,0L@H[``4*N```"/```0B0)^$``+2!``BV(```M@```'P`3
+M)````CP``%8D(RAP`BT@0`()^,`"+3"@`QD`0!```**7(8@B`D`8$``A&'0`
+M`A("`#`L8J```**3,2QBH`$`$"8#``(N\?]`%",H<`(-`"`2"0`")`(``CS]
+M_T(T`P`B5@$``CR+2@`("0`")/`?0B0)^$``+2!``I5*``@M$$`""``")`0`
+MHJ\$`(`2```"/```0B0)^$``+2"``@(`H!($`**/``"BKBT0``!(`+_?0`"V
+MWS@`M=\P`+3?*`"SWR``LM\8`+'?$`"PWP@`X`-0`+TG\/^])P@`O_\``+#_
+M```"/```0B0)^$``+8"``*@L`HX$`$!0```"/`GX0``M(``"```"/```0B0)
+M^$``+2```BT@``(!``4D```"/```0B0)^$```0`&)'`2!28```(\``!")`GX
+M0``M(``"```"/```0B0)^$``+2```@@`O]\``+#?"`#@`Q``O2>0_[TG:`"_
+M_V``OO]8`+?_4`"V_T@`M?]``+3_.`"S_S``LO\H`+'_(`"P_RV8@`````(\
+MX$Y")`<`0V@``$-L!P"CLP``H[<```(\Z$Y")`<`0V@``$-L#P!$:`@`1&P7
+M`*.S$`"CMQ\`I+,8`*2W+?```````CP``%8D```"/```5R2`@!X`(8`=`@``
+M$HXM(&`""?C``BTH0`((``*N+8@````4$0`E@%$`+2!@`BTH0`()^.`"+3``
+M`BT@8`()^,`"+2A``BD`4!0M&````0`Q)@`!(BKS_T`4`!01`"V(``````(\
+M``!5)````CP``%0D@!`1`"$070`0`%",+2!@`BTH0`()^*`"+3```BT@8`()
+M^(`"+2A``A0``A8M&````0`Q)@0`(BKR_T`4@!`1`(`0'@`A$%T`+2!@`@``
+M18P)^.`""`!&C`$`WB<"`,(KS/]`%("`'@````(\``!")`GX0`!D``0D`0`#
+M)"T08`!H`+_?8`"^WU@`M]]0`+;?2`"UWT``M-\X`+/?,`"RWR@`L=\@`+#?
+M"`#@`W``O2?__Z4P``&B,`4`0%"``*(P,Q,")```PJ0_2P`(U!<")`X`0!``
+M````B!*"W/__`R0\&`,`.AP#`"000P`'`$`0``````@)`B0``,*DK`H")```
+MXJ0(`.`#`0`")`@`X`,M$```P/^])S``O_\H`+/_(`"R_Q@`L?\0`+#_+8B`
+M`"V8@``MD(````"@IW`2@I0!4$(L!P!`%.`!D"2@`8*,R0`%)`GX0``M,*`#
+M.@%`$"T8``#4`2*6\`!",$```R0!`$-0AA)@I@``HI</`$!4W`%#CLP!(XX'
+M``(D"P!B5-P!0X[0`2.6"``")`<`8E3<`4..!0`")```HJ<!``(D=A)BIG@2
+M8J;<`4..!@`")!$`8A!E<`(DR@%#E@\`8E0$``"N"`)#EIS_8B3__T(P`@!"
+M+`,`0%`(`D.6@$L`"`4`8B1!``(D!`!B5`0``*Y#``(D"`)"I@0``*Z&$F*6
+M"0!`4(H28I8!``(D!``"KG828I8$`$!4BA)BE@,``B0$``*NBA)BE@4`0%",
+M$F*6!``"C@0`0C0$``*NC!)BE@X`0!`("0(DR@%#EA$.`B0*`&(0"`D")`0`
+M`XX(`&(T!``"KG@28I8$`$`4"`D")"@`8C0$``*N"`D")!```J;4`2*6\`!"
+M,-#_0B1``$(L%`!`%,0)`B3,`2..!P`")!``8A#$"0(D"P`")`P`8A`*``0D
+M"P!D$,0)`B0)``(D"`!B$,0)`B0&`&04K`H")-`!(I8$`$(L`@!`4*P*`B3$
+M"0(D$@`"IC,3`B0,``*FU!<")`X``J8```*._[\#)"000P``@$(T```"K@``
+MHI<"`$(P#0!`%"T@``#,`2..!@!B+`D`0%`!``0D!0`")`<`8A1`(P0`T`$B
+ME@0`0BP$`$!4```#C@$`!"1`(P0````#CO_?`B0D&&(`)1AD`/_[`B0D&&(`
+M``AC-```HI=#$`(``0!".`$`0C!`$@(`__T$)"089``E&&(````#KLP!(HX'
+M`$(L`P!`5````H[O2P`(`!!B-/_O`R0D$$,````"K@```HX#`$(T```"KM`!
+M0I8"`$(L!@!`$```HI?,`2.."P`")"8`8E0```*.``"BEP$`0C`%`$`4+2``
+M``0``HX)`$(P`0!`5`$`!"2`(`0````#COO_`B0D&&(`)1AD````I9?#$`4`
+M`0!".`$`0C#`$`(`]_\$)"089``E&&(````#K@0`I3`%`*`4+1@```0``HX)
+M`$(P`0!`5`$``R0`$0,````#CN__!"0D&&0`)1AB`*``8S0```.N```"CK__
+M`R0D$$,````"KC@38HX$`$`0+2```#P38HX#`$`4`"($``$`!"0`(@0````"
+MCO_^`R0D$$,`)1!$``$``SPE$$,``@`#/"400P`$``,\)1!#``@``SPE$$,`
+M```"KLP!0XX%``(D!@!B5,P!0H[0`4.6"``")`8`8E````*.S`%"C@8`0BP&
+M`$`4``"BEP```HX0``,\)1!#`````JX``**7\`%",`(`0%`*``(D`Q$"``@`
+M`J8``**7`/!",`0`0%"```(D`QL"``$``B0$$&(`"@`"IM0!(I;P`$(PT/]"
+M)$``0BP&`$`0```"CB```SPE$$,`0``#/&=,``@E$$,`W_\#//__8S0D$$,`
+MO_\#//__8S0D$$,````"KGH28I8/`$!0S`$BCD@21B:@`2*.+2`@`@GX0``/
+M``4D"`!`4,P!(HX!``(D3!)"K@```HZ```,\)1!#`````J[,`2*.!0!#+&@2
+M0ZX%``,D!0!#%"T@``#0`2.6"0`")`8`8E`!``0DS`$BC@8`0BP#`$`4`"8$
+M``$`!"0`)@0````#CO_^`CS__T(T)!AB`"489`````.N#P`")!0``JX!``,D
+M+1!@`#``O]\H`+/?(`"RWQ@`L=\0`+#?"`#@`T``O2?@_[TG$`"__P```CP`
+M`$(D"?A``"THH`,!``(D$`"_WP@`X`,@`+TG`0`")`0`HE0!``(\```"/*I,
+M``@``$(D9#)")`@`X`-P`(*LT/^])R@`O_\@`++_&`"Q_Q``L/\M@(``+8B@
+M`"B`!30```(\``!2)`GX0`($`":.+2```BR`!30)^$`"#``FCBT@``(P@`4T
+M"?A``A``)HXM(``"-(`%-`GX0`((`":.```BC@`!`SPD$$,`#`!`$"T@``(`
+M``(\``!")`GX0``M**`#-!("CB@`0/PM(``"((`%-`GX0`(``08\+2```B"`
+M!30```(\``!")`GX0````":.*`"_WR``LM\8`+'?$`"PWP@`X`,P`+TGT/^]
+M)R``O_\$`*6OW`&#C`$``B0)`&(0__\"-`P`8!````(\!@`")`@`8A`(``(D
+M$0!B5`$`HB3__P(T#`"BKP<``CS[3``(__]"-````CP``$*,(Q"B`,`0`@`,
+M`**O```"/```0HPC$*(`P!`"`!``HJ\!`*(D"`"BKX`!`CS__T(T)!#"````
+MHJ\```(\``!")`GX0``M**`#(`"_WP@`X`,P`+TGX/^])Q``O_\(`+'_``"P
+M_RV(@``H@`4T```0/```$"8)^``"+3```"T@(`(```(\``!")`GX0``$@`4T
+M!``#/"400P#/_P,\__]C-"000P`M("`"!(`%-`GX``(M,$``+2`@`B"`!30)
+M^``"__\&-!``O]\(`+'?``"PWP@`X`,@`+TGP/^])S``O_\H`+7_(`"T_Q@`
+ML_\0`++_"`"Q_P``L/\MD(``+8B@`!(`HI0<`$`0+9B``````CP``$(D"?A`
+M``2`!300``,\)1!#`"T@0`($@`4T```0/```$"8)^``"+3!``!``)I8M($`"
+M"?@``B2`!302`":6+2!``@GX``(X@`4T%``FCL`P!@`M($`""?@``C"`!31@
+M30`(+2!``@```CP``$(D"?A```2`!33O_P,\__]C-"000P`M($`"+3!`````
+M`CP``$(D"?A```2`!30M($`"*(`%-````CP``$(D"?A`````)HXM($`"```"
+M/```0B0)^$``((`%-(#_`SPD$$,`"``CEB4P0P`8`"*6!@!`$"T@0`($`$(D
+M`!0"`'\``SPD$$,`)3#"````$#P``!`F"?@``B"`!334+V:.__\"//\`0C0D
+M,,(`&@`BE@`2`@``_T(P)3#"`-0O9JXM($`""?@``AB`!30(`#.6'``CCBL0
+M8P(!`$!4+9A@``P`-(X<`"..*Q"#`@$`0%0MH&```@!T5@``-8X$`#6.!``F
+MCOW_QB3`,`8`!P`0//__$#8D,-``&`H"/"4PP@`M($`"```1/```,28)^"`"
+MU(`%-/W_IB;`,`8`)##0```*`CPE,,(`+2!``@GX(`+8@`4T__]F,@`4%``E
+M,,(`+2!``@GX(`+<@`4T,`"_WR@`M=\@`+3?&`"SWQ``LM\(`+'?``"PWP@`
+MX`-``+TGX/^])Q@`O_\0`++_"`"Q_P``L/\MB(``+1"@`"V0P```8`4D```0
+M/```$"8)^``"+3!``"T@(`((8`4D"?@``@$`!B0M("`"#&`%)`,`!B0```(\
+M``!")`GX0``"``<D"`!`$"T8```M("`"```"/```0B0)^$``!&`%)```0J8!
+M``,D+1!@`!@`O]\0`++?"`"QWP``L-\(`.`#(`"])^#_O2<0`+__"`"Q_P``
+ML/\MB(``+8"@`````CP``$(D"?A``!1`!21`@!```P`#)`08`P(E$$,`+2`@
+M`BTP0`````(\``!")`GX0``40`4D`0`")!``O]\(`+'?``"PWP@`X`,@`+TG
+MX/^])Q``O_\(`+'_``"P_RV(@``M@*`````"/```0B0)^$``%$`%)$"`$``#
+M``,D!!@#`B<8`P`D$$,`+2`@`BTP0`````(\``!")`GX0``40`4D`0`")!``
+MO]\(`+'?``"PWP@`X`,@`+TGX/^])Q@`O_\0`++_"`"Q_P``L/\MD(``+8B@
+M`"V`P`````(\``!")`GX0``80`4D`0`#)`08(P(G&`,`)!!#``$`$#($@#`"
+M)1!0`"T@0`(M,$`````"/```0B0)^$``&$`%)`$``B08`+_?$`"RWP@`L=\`
+M`+#?"`#@`R``O2?P_[TG"`"__P``L/\M@*``!@"B+`@`0!#__P,D```"/```
+M0B0)^$``'$`%)"\`0C`&$`("`0!#,"T08``(`+_?``"PWP@`X`,0`+TGX/^]
+M)Q@`O_\0`++_"`"Q_P``L/\MD(``+8"@`"V(P`````(\``!")`GX0``40`4D
+M+3!``$`0$``#``,D!!A#``$``CP`\$(T)QAB`"0PPP``@Q``)3#0``,`(!(`
+M@,8T`0`"/"4PP@`M($`"```"/```0B0)^$``%$`%)$0L18X``0(\)2BB````
+M`CP``$(D"?A``"T@0`(8`+_?$`"RWP@`L=\``+#?"`#@`R``O2?P_[TG``"_
+M_P```CP``$(D"?A```A`!20!`$(X`0!"+```O]\(`.`#$`"])\#_O2<X`+__
+M,`"V_R@`M?\@`+3_&`"S_Q``LO\(`+'_``"P_RV8@``MH*``+;```"VH@```
+M``(\``!0)`GX``*```4D+9!``(```CPD$$("&`!`$"T@8`()^``"C``%)"T8
+M0````0(\)!!B``$`0%0@`!8\`"`"/"008@`$`$`0``0"/$```CPEL,("``0"
+M/"008@`#`$`0``($/(```CPEL,(")!!D``$`0%0EL,0"+2!@`@```CP``$(D
+M"?A``,``!20MD$``__\")`0`0E8%`0(\``"`K@I/``@M$```NMA"-"080@((
+M``(\)!!"`@0`0!```(.N`$`"/"408@```(*N!0!",@4`0!#`!4(R``""C@$`
+M0C0``(*NP`5",AP`0!`@`$(R``""CD``0C0``(*N+2!@`@``$#P``!`F"?@`
+M`L0`!23_`T0PH$:CCB4@@P#_`Q$\)!!1``(4`@`E$$0`H$:BKBT@8`()^``"
+MR``%)/\#1#"@1J..)2"#`"0040`"%`(`)1!$`*!&HJX@`$(R"`!`4```@HYH
+M$F*.!0!`$```@HX`0`,\)1!#````@JX``(*.)1#"`@``@JX`0`,\)!!#`!D`
+M0!`!``(D4!)RKBT@8`(``!`\```0)@GX``+$``4D5!)BKBT@8`()^``"R``%
+M)%@28JXM(&`""?@``LP`!21<$F*N+2!@`@GX``+0``4D8!)BKBT@8`()^``"
+MU``%)&028JX!``(D.`"_WS``MM\H`+7?(`"TWQ@`L]\0`++?"`"QWP``L-\(
+M`.`#0`"])P@`X`-$+(*,P/^])S``O_\H`+7_(`"T_Q@`L_\0`++_"`"Q_P``
+ML/\MB(``+8"@`$0LE8P+`*$&+:"``"0`!20```(\``!")`GX0``M,```+2`@
+M`@```CP``$(D"?A``"0`!20%`0(\NMA"-"0P`@)```(R#0!`$"V8``#,+(*.
+M`0!`5$``QC30+(*.`0!`5``!QC34+(*.`0!`5(``QC38+(*.`0!`5``$QC0!
+M``(R`0!`5`<`QC3@`@(\)!`"`AD`0!``0`(\@``"/"4PP@`@``(\)!`"`@0`
+M0!!```(\``$"/"688@)```(\)!`"`@0`0!"```(\`"`"/"688@*```(\)!`"
+M`@,`0!```@,\``0"/"688@(D$`,"`0!`5"688P(`0`(\)!`"`@,`0!`M("`"
+M"``"/"4PP@````(\``!2)`GX0`*@``4D+2`@`@```CP``$(D"?A``*P`!23_
+M2`,\__]C-"000P`E$%,`+2`@`JP`!20)^$`"+3!```4``09$+)"N+2`@`B0`
+M!20)^$`"`0`&)"T0H`(P`+_?*`"UWR``M-\8`+/?$`"RWP@`L=\``+#?"`#@
+M`T``O2<(`.`#Z@&"E/#_O2<``+____^E,.H!@I0K$*(`#`!`$"T8``!`*04`
+M'(@"-"$HH@````(\``!")`GX0````````(!",`(`0!0!``,D+1@``"T08```
+M`+_?"`#@`Q``O2>P_[TG2`"__T``OO\X`+?_,`"V_R@`M?\@`+3_&`"S_Q``
+MLO\(`+'_``"P_RV8@`#__[0PZ@&"E"L0@@)1`$`0+1@``$"!%``4B!$T(8@1
+M`@```CP``$(D"?A``"TH(`(MD$```(@"-"$H`@(M(&`"```"/```520)^*`"
+M+3````2('C0A*!X"+2!@`@GXH`(M,```"(@7-"$H%P(M(&`""?B@`BTP```,
+MB!8T(2@6`BT@8`()^*`"+3```!"(!30A*`4"+2!@`@GXH`(M,```+2!@`BTH
+M(`()^*`"!P`&)!B(!30A*`4"+2!@`@GXH`(M,```'(@"-"&``@(M(&`"+2@`
+M`@GXH`(M,```!``")!P`0A8!``,DS"]BC@`(`SPD$$,`%P!`$`$``R1``)`F
+M__\0,D"!$```B`(T(2@"`BT@8`()^*`"+3```"$H'@(M(&`""?B@`BTP```A
+M*!<"+2!@`@GXH`(M,```(8`6`BT@8`(M*``""?B@`BTP```!``,D+1!@`$@`
+MO]]``+[?.`"WWS``MM\H`+7?(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#4`"]
+M)]#_O2<@`+__&`"S_Q``LO\(`+'_``"P_RV8@``M&,``__^E,.H!@I0K$*(`
+M)0!`$"T@```4`,!0+9````4`TI``DA(`!`#"D"600@(#`,:0`#8&``(`8I``
+M%`(`)3#"``$`8I``$@(`)3#"````8I`E,,(`0C`&`,`7$@`E,,(`+5``"$*0
+M$@`M,```0(D%`!B(!30A*"4"```0/```$"8)^``"+2!@`AR(`C0AB"("`(!&
+M-BT@8`()^``"+2@@`@$`!"0M$(``(`"_WQ@`L]\0`++?"`"QWP``L-\(`.`#
+M,`"])Y#_O2=H`+__8`"^_U@`M_]0`+;_2`"U_T``M/\X`+/_,`"R_R@`L?\@
+M`+#_+:"``"V0P````*>O__^V,`0`I*_@`80DJJH%/`(``!6JJJ4T+2@```H`
+M@I0K$,("+P%`$"T8`````$.2!@!B+"L!0%`M&```@!`#`````SSX3F,D(1!#
+M````0HP(`$```````(Q0``@%``(D``""C$(3`@`!`$(P'0%`$"T8``"/4``(
+M!@`#)`0``B0,`**OS"^"C@`(`SPD$$,`'@!`4`0`7I)``,(F"@"#E"H00P`/
+M`4`0+1@``)10``@$`%Z2`@!"E@4`0BP)`4`4+1@```(`0I8&`$(L#@!`%`P`
+MH*\"`$*6#@!"+`$``R0)`$`4#`"CKP,``B234``(#`"BKP<``R234``(#`"C
+MKXI1``@M&```!`!>D@4`0I(`$@(`)?#"`P8`0I(`%`(`)?#"`P<`0I(`%@(`
+M)?#"`R;PQ0,)`$*2`!("``@`0Y(E$$,`)A!%`/__0C`(`**O"@!5D@L`0I(`
+M$@(`):BB`@P`0I(`%`(`):BB`@T`0I(`%@(`):BB`B:HI0(/`$*2`!("``X`
+M0Y(EN$,`)KCE`O__]S(0`%.2$0!"D@`2`@`EF&("$@!"D@`4`@`EF&("$P!"
+MD@`6`@`EF&("`@!"E@X`0BP"`$`0)IAE`O\`<S($``(D#`"CCYH`8A1`B18`
+MS"^"C@`(`SPD$$,`E@!`$`"(!31``,(F__]",!``HJ]`B18`(2@E`B<P'@``
+M`!`\```0)@GX``(M((`"!(@%-"$H)0((`**/)S`"``GX``(M((`""(@%-"$H
+M)0(M((`""?@``BTPH`(,B`4T(2@E`BT@@`()^``"+3#@`A"(!30A*"4"+2"`
+M`@GX``(M,&`"%(@"-"&((@(M((`"+2@@`@GX``($``8D+2"``BTHP`(```(\
+M``!")`GX0````*:/%`!&DA4`0I(`$@(`)3#"`!8`0I(`%`(`)3#"`!<`0I(`
+M%@(`)3#"`!@`59(9`$*2`!("`"6HH@(:`$*2`!0"`"6HH@(;`$*2`!8"`"6H
+MH@($`*./T"]BC`0`0C`6`$!0+;@``!\`0I(`$@(`'@!#DB400P`4`**O'0!"
+MD@`2`@`<`$.2)1!#`!@`HJ\@`%>2(0!"D@`2`@`EN.("(@!"D@`4`@`EN.("
+M(P!"D@`6`@`I40`();CB`A@`H*\4`*"O$`"BCT"!`@``B!(T(2@2`@``$3P`
+M`#$F"?@@`BT@@`($B!,T(2@3`BT@@`()^"`"%`"FCPB(!30A*`4"+2"``@GX
+M(`(M,*`"#(@%-"$H!0(M((`""?@@`A@`IH\0B`4T(2@%`BT@@`()^"`"+3#@
+M`A2(!30A*`4"+2"``@GX(`('``8D&(@%-"$H!0(M((`""?@@`BTP```<B`(T
+M(8`"`BT@@`(M*``""?@@`BTP``!`@18`(9`2`BT@@`(M*$`""?@@`BTPP`,A
+M@!,"+2"``BTH``()^"`""`"FCXI1``@!``,D`(@%-"$H)0(M((`"```0/```
+M$"8)^``"+3#``P2(!30A*"4"+2"``@GX``((`*:/"(@%-"$H)0(M((`""?@`
+M`BTPH`(,B`4T(2@E`BT@@`()^``"+3#@`A"(!30A*"4"+2"``@GX``(M,&`"
+M%(@"-"&((@(M((`"+2@@`@GX``(,`*:/+2"``BTHP`(```(\``!")`GX0```
+M`*:/`0`#)"T08`!H`+_?8`"^WU@`M]]0`+;?2`"UWT``M-\X`+/?,`"RWR@`
+ML=\@`+#?"`#@`W``O2?P_[TG``"__RT0@``M(*``,"Q")"TH0`````(\``!"
+M)`GX0``&``8D``"_WP@`X`,0`+TG\/^])P``O_\P+(0D```"/```0B0)^$``
+M!@`&)`$``B0``+_?"`#@`Q``O2?P_[TG``"__RT0@``M(*``/"Q")"TH0```
+M``(\``!")`GX0``&``8D``"_WP@`X`,0`+TGX/^])Q``O_\(`+'_``"P_RV`
+M@``\+(0D```"/```0B0)^$``!@`&)#PL!I(]+`*2`!("`"4PP@`^+`*2`!0"
+M`"4PP@`_+`*2`!8"`"4PP@`M(``"```1/```,28)^"`"X(`%-$$L!I(`,@8`
+M0"P"DB4PP@`M(``""?@@`N2`!30!``(D$`"_WP@`L=\``+#?"`#@`R``O2?_
+M_Z4P"`*"E`8`11`,``,D<A*"E(``0C`"`$`4"P`#)`,``R0!`,!4``##K`@`
+MX`,M$```+1B``(82@I0%`$`0+2@``'82@I0"`$`4`0`%)$,`!22*$H*4`0!`
+M5`0`I32,$H*4"0!`$`````#*`6.4$0X")`4`8A``````>!*"E`(`0!0(`*4T
+M(`"E-`@`X`,M$*``X/^])Q@`O_\0`++_"`"Q_P``L/\M@(``2!*1E"T0(`(<
+M`#$R@X@1``(`4C!#D!(`K`&"C`GX0``M*"`"+2```@```CP``$(D"?A```"8
+M!30`($(T+2```BTP0`````(\``!")`GX0```F`4TL`$"CBT@``()^$``+2@@
+M`@(`4A`!`$8N+3!``K@!`HXM(``""?A``"TH(`(8`+_?$`"RWP@`L=\``+#?
+M"`#@`R``O2?@_[TG$`"__P@`L?\``+#_+8B``"V`H`````(\``!")`GX0``0
+M0`4D\?\#/)__8S0D$$,`!P`0,H"`$`````,\$$]C)"&``P(```..)1!#`"T@
+M(`(M,$`````"/```0B0)^$``$$`%)!``O]\(`+'?``"PWP@`X`,@`+TGX/^]
+M)Q@`O_\0`++_"`"Q_P``L/\M@(``___1,#8LA"0```(\``!")`GX0``&``8D
+M-BP&DC<L`I(`$@(`)3#"`#@L`I(`%`(`)3#"`#DL`I(`%@(`)3#"`"T@``(`
+M`!(\``!2)@GX0`((@`4T.RP&D@`R!@`Z+`*2)3#"`/\_,3(`C!$`)3#1`"T@
+M``()^$`"#(`%-!@`O]\0`++?"`"QWP``L-\(`.`#(`"])]#_O2<@`+__&`"S
+M_Q``LO\(`+'_``"P_RV`@````!$\```Q)@GX(`),@`4T+9!``"T@``()^"`"
+M4(`%-"V80``M(``""?@@`DR`!30KD%(``@!`$BT80``!`',F/!`3`#P8`P`^
+M&`,`)1!#`"``O]\8`+/?$`"RWP@`L=\``+#?"`#@`S``O2?P_[TG``"__P``
+M`CP``$(D"?A``$R`!30``+_?"`#@`Q``O2?@_[TG&`"__Q``LO\(`+'_``"P
+M_RV0@`````(\``!")`GX0``@@`4T+8A````!`CPEB"("+2!``B"`!30``!`\
+M```0)@GX``(M,"`"+2!``B"`!30)^``"+3`@`A@`O]\0`++?"`"QWP``L-\(
+M`.`#(`"])^#_O2<0`+__"`"Q_P``L/\T$H*,+0!`$"V`@``"`$*4(`!","H`
+M0%`0`+_?+2``````HHP/`$`0+8@`````IHPA$*0`!`!#D`0`0H`&`$,$`0"$
+M)'\`8S`K$'$``0!`4"V(8``!`(0D*Q"&`/7_0!0A$*0`+2```@```CP``$(D
+M"?A```2`!30(`"`2+1A``$(0$0`#`$(L!0!`4/_]!CP``@8\\U(`""4P9@#_
+M_08\___&-"0P9@`M(``"```"/```0B0)^$``!(`%-!``O]\(`+'?``"PWP@`
+MX`,@`+TGT/^])R``O_\8`+/_$`"R_P@`L?\``+#_+9B``````CP``$(D"?A`
+M`&28!33"E`(`_P%2,@`!0C(#`$`0+2!@`O\!4CHGD!(````1/```,28)^"`"
+M4(`%-"V`0``M(&`""?@@`DR`!30F@`(")H`2`BT0``(@`+_?&`"SWQ``LM\(
+M`+'?``"PWP@`X`,P`+TG\/^])P@`O_\``+#_+8"``````CP``$(D"?A``"!`
+M!23_`$(P`AD"``\`13#,`0*.!`!#%"T@``#0`0*6`0!%4`$`!"0M$(``"`"_
+MWP``L-\(`.`#$`"])^#_O2<8`+__$`"R_P@`L?\``+#_+9"``"V`H````!$\
+M```Q)@GX(`*0@`4T```#CB$00P````*N+2!``@GX(`*,@`4T!``#CB$00P`$
+M``*N+2!``@GX(`*4@`4T#``#CB$00P`,``*N+2!``@GX(`*(@`4T"``#CB$0
+M0P`(``*N+2!``@GX(`*8@`4T$``#CB$00P`0``*N&`"_WQ``LM\(`+'?``"P
+MWP@`X`,@`+TG"`#@`P$``B3P_[TG``"__P```CP``$(D"?A``!R<!33_`$(P
+M``"_WP@`X`,0`+TG\/^])P``O_\```(\``!")`GX0`!8@`4T!P!",```O]\(
+M`.`#$`"])_#_O2<``+__!P"F,````CP``$(D"?A``%B`!30``+_?"`#@`Q``
+MO2<(`.`#O"^"C/#_O2<``+__-!*&C`0`P%0```(\O"^%K)!3``@!``(D``!"
+M)`GX0`````````"_WP@`X`,0`+TG"`#@`P$``B3@_[TG&`"__Q``LO\(`+'_
+M``"P_RV`@``MB*``!@"B+`@`0!0MD(`````"/```0B0)^$``__\%-"L040`%
+M`$`0+2```O__`B3X+T*NME,`""T0``````(\``!")`GX0``M*"`"+2```BTP
+M0`````(\``!")`GX0`!P$`4D^"\1K@$``B08`+_?$`"RWP@`L=\``+#?"`#@
+M`R``O2?P_[TG"`"__P``L/\M@(`````"/```0B0)^$``<!`%)/__0C`M*$``
+M```"/```0B0)^$``+2```@@`O]\``+#?"`#@`Q``O2?0_[TG(`"__Q@`L_\0
+M`++_"`"Q_P``L/\MB(``+9"@`````CP``$(D"?A``/\_!20K$%(`!`!`$/__
+M`B3\+R*N]U,`""T0```M("`"```"/```0B0)^$``%(`%-"V`0```P`(D)(`"
+M`BT@(`(```(\``!")`GX0``M*$`"_S]","6``@(M("`"%(`%-````CP``$(D
+M"?A``"TP``+\+S*N`0`")"``O]\8`+/?$`"RWP@`L=\``+#?"`#@`S``O2?P
+M_[TG"`"__P``L/\M@(`````"/```0B0)^$``%(`%-/\_0C`M*$`````"/```
+M0B0)^$``+2```@@`O]\``+#?"`#@`Q``O2?/+X*``0!".`@`X`,!`$(PX/^]
+M)Q@`O_\0`++_"`"Q_P``L/\MB(``$0"@$"V0@`````(\``!")`GX0``$@`4T
+M__X0//__$#8D$%``+2`@`BTP0`````(\``!")`GX0``$@`4TS"\BCCI4``@D
+M$%`````"/```0B0)^$``!(`%-``!$#PE$%``+2`@`BTP0`````(\``!")`GX
+M0``$@`4TS"\BCB404`#,+T*N`0`")!@`O]\0`++?"`"QWP``L-\(`.`#(`"]
+M)]#_O2<@`+__&`"S_Q``LO\(`+'_``"P_RV(@``MD*`````"/```0B0)^$``
+M_S\%)"L04@`$`$`0__\")``P(JYN5``(+1```"T@(`(```(\``!")`GX0``4
+M@`4T+8!```#``CS__T(T)(`"`BT@(`(```(\``!")`GX0``M*$`"`!0"`/\_
+M`SPD$$,`)8`"`BT@(`(4@`4T```"/```0B0)^$``+3```@`P,JX!``(D(`"_
+MWQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])_#_O2<(`+__``"P_RV`@`````(\
+M``!")`GX0``4@`4T_S\#/"000P`"%`(`+2A``````CP``$(D"?A``"T@``((
+M`+_?``"PWP@`X`,0`+TGT/^])R@`O_\@`+3_&`"S_Q``LO\(`+'_``"P_RV(
+M@``MF,``__^R,(``0BX-`$`0#``#)``$!20``!`\```0)@GX``(M,$`"*S`3
+M`"T@(`()^``"!`0%)"$040(X+U.@+1@``"T08``H`+_?(`"TWQ@`L]\0`++?
+M"`"QWP``L-\(`.`#,`"])]#_O2<@`+__&`"S_Q``LO\(`+'_``"P_RV0@`#_
+M`+`P20#`$#@2D*#_``(R1P!`$"``O]\T$H*,`@!"E$`!0C!``0,D0@!#5!@`
+ML]\```(\``!")`GX0``!``4D+2A``#020HX"`$*4`$!",`P`0%`T$D*.0A@%
+M`!@``P(2,```0!`&`"$PP@`$`<8D$I@``"$04P!`$`(`Z50`"*P-4R0"`$*$
+M#`!!!!@`!0*"&`4`&``#`A(P``!`$`8`(3#"`-(`QB02F```(1!3`$`0`@#I
+M5``(2`U3)!(P``!`$`8`(3#"`&@!QB02F```(1!3`$`0`@!@#E,D&``%`A*`
+M``!`$!``(8`"`N@#$";_/Q`R+2!``@``$3P``#$F"?@@`G`0!20M($`"L!`%
+M)`GX(`(M,&`"`#00`"4PT``M($`""?@@`A2`!30@`+_?&`"SWQ``LM\(`+'?
+M``"PWP@`X`,P`+TG\/^])P``O_\```(\``!")`GX0`#<`86,``"_WP@`X`,0
+M`+TG!@`")`@`HA`M&```DQ*"D`4`0!``````Z"^"C`(`0BP!`$!4`0`#)`@`
+MX`,M$&``X/^])Q@`O_\0`++_"`"Q_P``L/\```(\``!")`GX0``MD(``>0!`
+M$"T@0`)PF`4T```"/```0B0)^$``'P`&)-0!0I;P`$(PT/]")$``0BP"`$`4
+M%``&)!@`!B0M($`"```1/```,28)^"`"^)D%-"T@0`(``!`\```0)@GX``(<
+M@`4T?\`#)"000P"``$(T+2!``AR`!30)^"`"+3!``"T@0`($@04T"?@@`CT`
+M!B0M($`""?@``A!`!20"`$(T+2!``A!`!20)^"`"+3!``,P!0XX'``(D$`!B
+M$"T@0`(+``(D#`!B$`H`!"0+`&10+2!``@D``B0(`&)0+2!``B$`9!0M($`"
+MT`%"E@0`0BP>`$!0=)@%-"T@0`)TF`4T```0/```$"8)^``")@`&)"T@0`)X
+MF`4T"?@``@T`!B0M($`"\)D%-`GX``('``8D+2!``O29!30)^``"/P`&)"T@
+M0`(```(\``!")`GX0``00`4D__P#//__8S0D$$,`E54`"``"`SQTF`4T```0
+M/```$"8)^``""@`&)"T@0`)XF`4T"?@``@P`!B0M($`"\)D%-`GX``(#``8D
+M+2!``O29!30)^``"(``&)"T@0`(```(\``!")`GX0``00`4D__P#//__8S0D
+M$$,```,#/"400P`M($`"$$`%)`GX``(M,$``YU4`"!@`O]\``!$\```Q)@GX
+M(`(00`4D__P#//__8S0D$$,`+2!``A!`!20``!`\```0)@GX``(M,$``+2!`
+M`@GX(`(00`4D_?\#)"000P`M($`"$$`%)`GX``(M,$``+2!``G"8!30)^``"
+M'P`&)"T@0`)TF`4T"?@``G\`!B0M($`">)@%-`GX``(.``8D+2!``O"9!30)
+M^``"#``&)"T@0`+TF04T"?@``O\`!B34`4*6\`!",-#_0B1``$(L`@!`%`X`
+M!B02``8D+2!``@```CP``$(D"?A``/B9!30M($`"```"/```0B0)^$``'(`%
+M-"T80`!_P`(D)!AB`-0!0I;P`$(PT/]")$``0BP"`$`4@!-F-(`/9C0M($`"
+M```"/```0B0)^$``'(`%-!@`O]\0`++?"`"QWP``L-\(`.`#(`"])^#_O2<8
+M`+__$`"R_P@`L?\``+#_```"/```0B0)^$``+9"``$\`0!`8`+_?+2!``@``
+M$3P``#$F"?@@`A!`!23__`,\__]C-"000P`M($`"$$`%)```$#P``!`F"?@`
+M`BTP0``M($`""?@@`A!`!23]_P,D)!!#`"T@0`(00`4D"?@``BTP0``M($`"
+M!($%-`GX``(!``8D+2!``@GX(`(<@`4T+1A``'_``B0D&&(`U`%"EO``0C#0
+M_T(D0`!"+`(`0!2`$V8T@`]F-"T@0`(``!`\```0)@GX``(<@`4T+2!``G"8
+M!30)^``"'P`&)"T@0`)TF`4T"?@``G\`!B0M($`">)@%-`GX``(.``8D+2!`
+M`O"9!30)^``"#``&)"T@0`+TF04T"?@``O\`!B34`4*6\`!",-#_0B1``$(L
+M`@!`%!0`!B08``8D+2!``@```CP``$(D"?A``/B9!308`+_?$`"RWP@`L=\`
+M`+#?"`#@`R``O2<M(`````"CE````CPP3T*4*Q!#``H`0!0M*&`````"/#!/
+M0R0!`(0D@!`$`"$00P```$*4*Q!%`/O_0%`!`(0D@!`$`````SPP3V,D(1!#
+M``@`X`,"`$*$X/^])Q``O_\(`+'_``"P_RV`P``MB.``+3B``!X`HBRK`$`0
+MX`&&)(`0!0````,\7$]C)"$00P```$*,"`!````````"``(D#0`"4@``PHP"
+M``(NI`!`%"T8```$``(N"0!`%`8``BZ?`$`4?P`"))X``A(M$&``&E<`"`T`
+M`R3;5@`(0A,"`!I7``@-``,DE0``$BT8```!``(D!``"%@````#,+X*,]58`
+M",,6`@`&``!2``#"C`$``B0%``)2T"_BC!I7``@,``,D]E8`"`(3`@#V5@`(
+M@Q`"`,P!@XP&`&(L?P!`$"T0```%``(D?`!B%`T``B30`8*4"`!"+'@`0%`M
+M$```&5<`"`T``B1U```2+1@```$``B0Z``(6```"/```0B0)^$``"*(%-/56
+M``A#$P(`$5<`"/@!@HQI```2+1@```$``B1G``)6+1!@`+Y6``C<+X*,!@``
+M4H82@I0!``(D!0`"$@$``R0;5P`(+1!@`!I7``@!`$,LB!*"W/__`R0\&`,`
+M.AP#`"000P`!`$(L/!@"`#\8`P`;5P`(+1!@`$\``!(M&````0`")$P``E8,
+M``,DS"^"C"<0`@`:5P`(PA\"``8``%(``,*,`0`")`D``E+0+X*,&E<`"`P`
+M`R0"%0(``0!",#T`0!`-``,D&E<`""T8``#U5@`(PQ`"`!I7``@,``,DX"^"
+MC!%7``@_`$(PX"^"C``_0C`15P`(`A("``$``B0(``)2&#""C"L``!(M&```
+M!P`"+B@`0!`,``,D^%8`"````CP!`$(X&E<`"`$`0S```$(D"?A````````M
+M($``'0!`$`$``R0'``(N&@!`$"T8``"`$!`````#/-1/8R0A$$,```!"C`@`
+M0```````$5<`"`D`@I`15P`(#`""D!%7``@-`(*0$5<`"`L`@I`*`(*0```B
+MKAI7``@M&```+3```@```CP``$(D"?A``"TX(`(M&$``+1!@`!``O]\(`+'?
+M``"PWP@`X`,@`+TGX/^])Q``O_\(`+'_``"P_RV`@``MB.``+4B``!X`HBQX
+M`$`0X`&$)(`0!0````,\#%!C)"$00P```$*,"`!````````$`.!0S"\#CLPO
+M`HYG5P`(``@#/&M7``C_]P(\``""C`(3`@`!`$(P:P!`$"T8```$`.`0T"\"
+MCOO_`R1#5P`()!!#``0`0C30+R*M+2```B"!!31:5P`(T"\FC2T@``(```(\
+M``!")`GX0``(H@4T`P`@$BTP0`!35P`(`"!&-/_?`B0D,,(`+2```EI7``@(
+MH@4T^`$'KBT@``)(@`4T+3#@`````CP``$(D"?A```````"G5P`(`0`#)"L0
+M!P"?5P`(W"\"K@8`X%#,+P..S"\"C@"``SPE$$,`GU<`",PO(JW_?P(\__]"
+M-"088@"?5P`(S"\CK?0O`H8AB.(`0``B+@$`0%`_`!$D&@`")`4`HE3@+R.-
+MX"\BC240(@)_5P`(/P!",``_8S``/R(R`A("`"400P#@+R*M+2```NB`!31:
+M5P`(X"\FC0<`PBPA`$`0+1@``(`0!@````,\\$]C)"$00P`M(``"``!%C```
+M`CP``$(D"?A``"TPX`"G5P`(+1A`````@HP"%0(``0!",`L`0%`M(``"`P#@
+M$-`O`HZ>5P`("`!"-/?_`R0D$$,`T"\BK:=7``@!``,D+2```@```CP``$(D
+M"?A``"TX(`(M&$``+1!@`!``O]\(`+'?``"PWP@`X`,@`+TG\/^])P``O_\`
+M``(\``!")`GX0```````*Q`"````O]\(`.`#$`"])\#_O2<X`+__,`"V_R@`
+MM?\@`+3_&`"S_Q``LO\(`+'_``"P_S4`H!`M@(`````"/```0B0)^$``!$`%
+M)/S_`SS__V,T)!!#`"T@``(M,$`````"/```0B0)^$``!$`%)````CP``$(D
+M"?A```H`!"0H`!$D```"/```4R0!`!8\```"/```523\_Q(\__]2-@```CP`
+M`%0D+2```@GX8`(00`4D)!!6`!``0!``````"?B@`C(`!"0M(``""?A@`@1`
+M!20D$%(`+2```@1`!20)^(`"+3!``/__,2;O_R`6+2```@58``@M$```!``@
+M%BT@``(%6``(+1```"T@``(```(\``!")`GX0``$@`4T^_\#//__8S0D$$,`
+M+2```BTP0`````(\``!")`GX0``$@`4T`0`")#@`O]\P`+;?*`"UWR``M-\8
+M`+/?$`"RWP@`L=\``+#?"`#@`T``O2?0_[TG(`"__Q@`L_\0`++_"`"Q_P``
+ML/\MB(``+8"@`````CP``%(D"?A``@2`!30$``,\)1!#`"T@(`(M,$`````"
+M/```4R0)^&`"!(`%-`X``!(@`+_?+2`@`@GX0`($0`4D_/\#//__8S0D$$,`
+M`0`#/"400P`M("`"!$`%)`GX8`(M,$``(`"_WQ@`L]\0`++?"`"QWP``L-\(
+M`.`#,`"])]#_O2<@`+__&`"S_Q``LO\(`+'_``"P_RV(@``M@*`````"/```
+M4B0)^$`"!(`%-`0``SPE$$,`+2`@`BTP0`````(\``!3)`GX8`($@`4T#@``
+M$B``O]\M("`""?A``@1`!23\_P,\__]C-"000P`"``,\)1!#`"T@(`($0`4D
+M"?A@`BTP0``@`+_?&`"SWQ``LM\(`+'?``"PWP@`X`,P`+TGX/^])Q@`O_\0
+M`++_"`"Q_P``L/\M@*``+2C```$`$20-`!$2+9"```4``!("``(D#``"$BT0
+M``"#6``(&`"_WP$``CS<7D(D"?A```````"`6``(+8A```$``CQ\6``(/&!"
+M)`$``CS@8$(D"?A```````"!6``(N"]0KK@O4*XM$"`"&`"_WQ``LM\(`+'?
+M``"PWP@`X`,@`+TG\/^])P``O_\```(\``!")`GX0``$0`4D`P`#/"000P`"
+M%`(```"_WP@`X`,0`+TG\/^])P@`O_\(``(D,P"B$```L/\)`*(L#P!`$``!
+M`B0"``(D,`"B$`,`HBP&`$`0!``")`$``B06`*(0+1```.)8``@(`+_?(0"B
+M$"T0``#B6``("`"_WRD`HA`!`:(L!@!`$``"`B0@``(D(0"B$"T0``#B6``(
+M"`"_WR,`HA``!`(D)`"B$"T0``#B6``("`"_WP```CP``%`D-!*"C"``0%``
+M``(\`@!"E`!`0C`7`$`4```"/#02@HP"`$*$&`!#!````CS;6``(```"/```
+M`CS<6``(``!0)````CS<6``(``!0)````CS<6``(``!0)````CS<6``(``!0
+M)````CS<6``(``!0)````CS<6``(``!0)````CP``%`D```"/```0B0)^$``
+M+2@``BT0``((`+_?``"PWP@`X`,0`+TG\/^])P``O_\```(\``!")`GX0``,
+M``4D``"_WP@`X`,0`+TG\/^])P``O_\M,*`````"/```0B0)^$``#``%)```
+MO]\(`.`#$`"])_#_O2<``+__"``%)````CP``$(D"?A```0`!B0``+_?"`#@
+M`Q``O2?P_[TG"`"__P``L/\M@(``"``%)````CP``$(D"?A``"``!B0M(``"
+M"``%)`0`!B0```(\``!")`GX0``M.```*Q`"``@`O]\``+#?"`#@`Q``O2?P
+M_[TG"`"__P``L/\M@(`````"/```0B0)^$``2(`%--__`R0D$$,`+2```BTP
+M0`````(\``!")`GX0`!(@`4T```"/```0B0)^$``+2```BT@``(```(\``!"
+M)`GX0``!``4D"`"_WP``L-\(`.`#$`"])_#_O2<(`+__``"P_RV`@`````(\
+M``!")`GX0`!(@`4T(`!"-"T@``(M,$`````"/```0B0)^$``2(`%-````CP`
+M`$(D"?A``"T@``((`+_?``"PWP@`X`,0`+TGX/^])Q@`O_\0`++_"`"Q_P``
+ML/\MB(``+1"@`"V0P`!`@`4T```0/```$"8)^``"+3!``"T@(`)$@`4T"?@`
+M`BTP0`(8`+_?$`"RWP@`L=\``+#?"`#@`R``O2?@_[TG$`"__P@`L?\``+#_
+M+8B``"V`H`!``*(L'`!`$"T8```@`*(L"P!`%````CP``$(D"?A``$2`!30!
+M``8D!#`&`B<P!@`D,$8`+2`@`H%9``A$@`4T``!")`GX0`!`@`4T`0`&)`0P
+M!@(G,`8`)#!&`"T@(`)`@`4T```"/```0B0)^$````````$``R0M$&``$`"_
+MWP@`L=\``+#?"`#@`R``O2?@_[TG$`"__P@`L?\``+#_+8B``"V`H`!``*(L
+M&@!`$"T8```@`*(L"@!`%````CP``$(D"?A``$2`!30!``8D!#`&`B4P1@`M
+M("`"J5D`"$2`!30``$(D"?A``$"`!30!``8D!#`&`B4P1@`M("`"0(`%-```
+M`CP``$(D"?A````````!``,D+1!@`!``O]\(`+'?``"PWP@`X`,@`+TGX/^]
+M)Q@`O_\0`++_"`"Q_P``L/\MB(`````0/```$"8)^``"/(`%-"V00``M("`"
+M"?@``@R!!30M&$``(`!",`$`0%0``E(V`@("/"008@`!`$!4``%2-BT00`(8
+M`+_?$`"RWP@`L=\``+#?"`#@`R``O2?@_[TG&`"__Q``LO\(`+'_``"P_RV0
+M@``M@*``_P"F,````CP``$(D"?A``#R`!30``@(R`@!`$"V(```@`!$D``$"
+M,@,`0!`M($`"`@("/"6((@(,@04T```"/```4"0)^``"+3`@`@P`(!(M($`"
+M```"/```0B0)^$``-``%)!``0C0M($`"-``%)`GX``(M,$``!5H`"!@`O]\`
+M``(\``!")`GX0``T``4D[_\#)"000P`M($`"+3!``````CP``$(D"?A``#0`
+M!208`+_?$`"RWP@`L=\``+#?"`#@`R``O2<+`*"H"`"@N/\/QC`/`*:H#`"F
+MN"``YS`'`.!0+1````\`HH@,`**8`"!"-`\`HJ@,`**X+1```!<`HJ@4`**X
+M$P"BJ!``HK@(`.`#`0`")-#_O2<@`+__&`"S_Q``LO\(`+'_``"P_RV8@``M
+MD,``+8@@`2V`H``7`**(%`"BF`$`0C!N`$`0#P`#)!<`XH@4`.*8`0!",`8`
+M0!0```(\``!")`GX0``,``4D9`!2$`\``R03``**$``"FO\/0C```"*F%P`"
+MBA0``IH"%`(`_W]",`(`(J8$`""B$P`"BA```IH"%0(`_P!",`8`(J(`%@(`
+M`Q8"`(#_`R0!`$-0!@`@HA<``HH4``*:``%",`4`0%#__P(D%P`"BA0``IH`
+M_D(P0A("``<`(J(3``**$``"FL(3`@`?`$(P"``BHA,``HH0``*:`A<"``D`
+M(J(3``**$``"F@,3`@`!`$(P"@`BHA<``HH4``*:`@!",#,`0!0M&```%P`"
+MBA0``IH$`$(P!`!`$``````$`"*2F%H`"`$`0C07``**%``"FA``0C`5`$`0
+M``````0`(I("`$(T!``BHA<`!8H4``6:`/^E,`(J!0`%`"6B'#!BCAL`0!0M
+M&```!0`")!@`HA`M(&`"```"/```0B0)^$``+2@@`II:``@M&```%P`"BA0`
+M`IH(`$(P!`!`$``````$`"*2F%H`"`@`0C07``**%``"FB``0C`%`$`0+1@`
+M``0`(I(0`$(T!``BHBT8```M$&``(`"_WQ@`L]\0`++?"`"QWP``L-\(`.`#
+M,`"])W#_O2>(`+__@`"^_W@`M_]P`+;_:`"U_V``M/]8`+/_4`"R_T@`L?]`
+M`+#_+9"``"WPH``MF,``"`"GKPP`J*\MJ(```@##E``!8C`#`$`0+8@``+Q:
+M``C#$0,``@#"E,,1`@`!`$(X`0!","0$0!0,``,D`@!CEB``8C`#`$!0`@!B
+MEL=:``B#$0,`@Q$"``$`0C@!`$(P&01`5`P``R0M($`"+2@``````CP``$(D
+M"?A```$`!B06!$`0+1@``"T@0`(```(\``!")`GX0``M*&`"&`"BKPD$0!`,
+M``,D!@`")`H`PA,'`,(O!@!`$`@``B0"`,(O`@1`$`P`I(_G6@`('`"@K_T#
+MPA<,``,D'`"@KP@`HH\2`$!0S`%#CBT@0`(```(\``!")`GX0`!`$04D'`"B
+MKRT@0`(```(\``!")`GX0``8`*6/+2!``@```CP``$(D"?A``"TH``#,`4..
+M!P`")`T`8A`+``(D"P!B$`H`!"0)`&00"0`")`@`8E`(`*./'`!D%"T@0`+0
+M`4*6!`!"+!D`0!````(\"`"CCQ4`8!`M($`"-!)$CA(`@%`M($`"``!CE@``
+M@I0.`&)0+2!``@(`8Y;P`6,P`@""E/`!0C`(`&(4+2!``@```CP``$(D"?A`
+M`"TH8`+(`T`4`0`#)"T@0`(```(\``!")`GX0`!8@`4T`P!`%"``HJ\!``0D
+M(`"DKRT@0`(``!`\```0)@GX``($@`4T*`"BKR`"`CPH`*6/)"BB`"@`I:\M
+M($`""?@``A!`!20D`**O_@`"/&``0C0D`*>/)#CB`"0`IZ\M($`""?@``A1`
+M!200`**O+2!``@GX``(80`4D%`"BKRT@0`(```(\``!")`GX0``M*,`#```"
+M/```0B0)^$``+2!``BT@0`(```(\``!")`GX0``M*&`"CP-`$`,``R0"`&*6
+M\`%#,$`!`B0=`&(000%B*`\`0!#`"`(DP``")",`8A#!`&(H!@!`$-```B2@
+M``(D&0!B$`P``R3C7@`(#`"DCQ\`8A`,``,DXUX`"`P`I(\6`&(0P0AB*`,`
+M0%!`"0(D<5L`"%`!`B0%`&(04`D")`8`8A`"``(DXEX`"`P``R0!``DD@UL`
+M""P`J:\L`**OB%L`"`$``R0#``0D+`"DKP(`!22)6P`(,`"EKP0`!R0L`*>O
+M`@`))(E;``@P`*FO!0`")"P`HJ\"``,D,`"CKRT@0`(`F`4T```"/```0B0)
+M^$``!P`&)"V```````(\B%!4)````CP``%8D```"/```5R1`$!``(1!0`,`8
+M`@`A&'0`0!`"`"P`I(\A$$0`@!`"`"$05``M($`"``!EC`GXP`(``$:,`0`Q
+M)C\`(C($`$!4`0`0)@GXX`(!``0D`0`0)AD``B[K_T`40!`0`"V```````(\
+MX%)6)/__%#S@?Y0V__\7/"Q_]S;`$!``(1!6``@`IX\)`.`0``!%C"$0M``9
+M`$(L%0!`5`$`$"8A$+<`"0!"+!$`0%0!`!`FP!`0`"$05@`M($`"```)/```
+M*24)^"`!!`!&C`$`,28_`"(R!@!`5`$`$"8```(\``!")`GX0``!``0D`0`0
+M)L0``B[B_T`4P!`0`*PLHHXM($`"+`"ECS``IH\)^$``+3@@`@(`8I8`0$(P
+M!0!`%"T@0`("`&*&!P!#!-(!0I8M($`"```"/```0B0)^$``+2A@`M(!0I9"
+M`$(L4P!`5-(!0I8M($`"+)@%-`(`!CP```(\``!")`GX0``"H,8T``!CEK0)
+M`B0.`&(4DA*CDIP2HI8C&&(`9F8"/&=F0C0<`&(`$A```#\0`@!#$`(`PQ\#
+M`",00P``%`(`"5P`"`,D`@!F9@(\9V9"-!P`8@`2$```?A`"`,,?`P`C($,`
+M`@!BEM``0C#```,D#0!#5"T@0`*2$J:2(S`&`(`Q!@#`#\8P(Q`$`(`4`@#\
+M``,\)!!#`"4PP@`M($`"'%P`"$R9!31,F04T+3```````CP``$(D"?A`````
+M$#PM($`"```0)@GX``(HH@4T__T#)"000P`M($`"**(%-```$3P``#$F"?@@
+M`BTP0``M($`""?@``BBB!33^_P,\_P-C-"000P``"$(T+2!``BBB!30)^"`"
+M+3!``"T@0`)@@`4T"?@@`@\`!B32`4*60P!"+`<`0!0M($`"5*(%-````CP`
+M`$(D"?A``"TP```M($`">)@%-````CP``$(D"?A```X`!B3,`4.."@`$)`D`
+M9!`)``(D"`!B4```8Y8:`&04+2!``M`!0I8$`$(L%P!`$!@`I8\``&.6G@D"
+M)`0`8A`!`!`DHPD")`,`8A0M($`"+8```"T@0`(```(\``!")`GX0`!,H@4T
+M!@!0$"T@0`),H@4T```"/```0B0)^$``+3```BT@0`(8`*6/```"/```0B0)
+M^$``+3"@`W$"0!`#``,D!@`")`D`PA,L`**/!`)"C@8`0!`L`**/```"/```
+M0B0)^$``+2!``BP`HH___T8PN"RBCBT@0`(8`*6/"?A``"TXH`->`D`0`P`#
+M)`(`8I9``$(P(`!`$"T@0`+,`4.."@`$)`T`9!`)``(D#`!B4`(`8I8&`&14
+M<!*BEM`!0I8$`$(L!@!`5`(`8I9P$J*6`U!"+`L`0!0M($`"`@!BEJ``0C"@
+M``,D!0!#$"T@0`(```(\``!")`GX0``8`*6/+2!``@```CP``$(D"?A``"TH
+M8`(M($`"```"/```0B0)^$``&`"ECS4"0!`#``,D"`"CCP@`8%`P+*:2+2!`
+M`D`1!20```(\``!")`GX0``<`*:/,"RFDC$LHI(`$@(`)3#"`#(LHI(`%`(`
+M)3#"`#,LHI(`%@(`)3#"`"T@0`(``!`\```0)@GX``(`@`4T-2RFD@`R!@`T
+M+**2)3#"`"@`I(\E,,0`S"^BCB4PP@"```(\)3#"`"T@0`()^``"!(`%-"T@
+M0`(```(\``!")`GX0``M*,`#/"RFDCTLHI(`$@(`)3#"`#XLHI(`%`(`)3#"
+M`#\LHI(`%@(`)3#"`"T@0`()^``"X(`%-$$LII(`,@8`0"RBDB4PP@`M($`"
+M"?@``N2`!30M($`"```"/```0B0)^$``$$`%)"0`I8\E$$4`+2!``A!`!20)
+M^``"+3!``"T@0`(40`4D"?@``A``IH\M($`"&$`%)`GX``(4`*:/+2!``EB`
+M!30)^``"(`"FCS8LII(W+**2`!("`"4PP@`X+**2`!0"`"4PP@`Y+**2`!8"
+M`"4PP@`M($`""?@``@B`!30[+*:2`#(&`#HLHI(E,,(`+2!``@GX``(,@`4T
+M+2!``AB`!30)^``"U"^FCBT@0`*```4D"?@``O__!B0M($`"```"/```0B0)
+M^$``&`"EC[T!0!`#``,D.!)%DBT@0`(```(\``!")`GX0``!``8D+2!``@``
+M`CP``$(D"?A``"TH8`+4`4*6\`!",-#_0B1``$(L'@!`$"T@0`(T$D..`@!B
+ME`!`0C`%`$!4-!)"C@(`8H07`$$$```"/#020HX"`%"4`$`0,@$`$"X,`!`F
+M+2!``@```CP``$(D"?A``"28!33P_P,D)!!#``\`$#(E$%``+2!``BTP0```
+M``(\``!")`GX0``DF`4T+2!``@```CP``$(D"?A``!29!33_/U`P`@!BEB``
+M0C`+`$`0/!`0`(`0$`#\_T(P+KH#-#@<`P"CBV,T'`!#`!(0```^@0(`;UT`
+M""T@0`(^$`(`S,P#-#@<`P#-S&,T'`!#`!(0``#^@`(`+2!``AR8!30```(\
+M``!")`GX0``!``8D-!)"C@(`0I0`0$(P!@!`%$`@$``T$D*.`@!"A`,`001D
+M``0F@"`0`&0`A"0```(\``!")`GX0``M@```+2!``@```CP``$(D"?A```B8
+M!30ML$``+2!``@B8!30```(\``!")`GX0```.`8D```"/```5"0```(\EET`
+M"```420)^"`"R``$)"T0``(4`$(H!P!`$`$`$"8M($`""?B``B2<!300`$(P
+M]?]`%``````M($`"")@%-````CP``%`D"?@``BTPP`(M($`"```"/```420)
+M^"`"8)@%-`,`0C0M($`"8)@%-`GX``(M,$```@!BEJ``0C"@``,D%P!#$`(`
+M`B3`+Z..%`!B$"T@0`()^"`"()D%-`#P0C0M($`"()D%-`GX``(M,$``+2!`
+M`@GX(`(@F04T`0`#/"400P`M($`"()D%-`GX``(M,$```0`"),Q=``C`+Z*N
+MP"^@K@```CP``$(D"?A``"T@0`(M@````0`4)````CP``%$D@"@0```0I20$
+M,!0""?@@`BT@0`(!`!`F"@`"*OG_0!2`*!``H$:@KN@!0I8+`$`0+8``````
+M`CP``%$D+2!``@GX(`(M*``"`0`0)N@!0I8J$`("^O]`%"T@0`((``(\90E"
+M-$0LHJX&``(D!`#"%RT@0`((``(\91E"-$0LHJZ@``4D```0/```$"8)^``"
+M1"RFCBT@0`(```(\``!")`GX0`"L``4D!P`#/"400P`M($`"K``%)`GX``(M
+M,$``3!)"C@8`0!`M($`"```"/```0B0)^$``+2!``BT@0`)@F`4T`0`&)```
+M`CP``$(D"?A``"TX```M($`"```"/```0B0)^$``+2C``RT@0`(```(\``!"
+M)`GX0``@@`4T?_X#//__8S0D$$,`+2!``BTP0`````(\``!")`GX0``@@`4T
+MS`%#C@8`8BP'`$`0!0`")!$`8A0M($`"T`%"E@@`0BP.`$`4"($%-"T@0`(8
+M@04T`0`&/```$#P``!`F"?@``JH`QC0M($`"'($%-`GX``(0,@8D+2!``@B!
+M!30```(\``!")`GX0`!2``8D`@!BE@`!0C`"`$!0CQ*F@HX2IH(M($`"```"
+M/```0B0)^$``+2A@`@`6`@`#1@(`X"^BCC\`1C#T+Z2&(Q#$`!@`I8\&`*.`
+M*Q!B``$`0%0A,&0`&`"GCP4`XH!`$`(`(QA(`"L09@`$`$!0X"^BCO0OHH8A
+M,&(`X"^BC@`_1#`"(@0`]"^EAB,0A0`8`*F/!@`C@2L08@`!`$!4(2!E`!@`
+MHX\%`&*`0!`"`",82``K$&0`!`!`4.(OHY;T+Z*&(2!B`.(OHY8_`&,P]"^G
+MAB,09P`8`*F/!@`E@2L0H@`!`$!4(1BG`!@`I8\%`**`0!`"`",H2``K$*,`
+M!`!`$$``PBST+Z*&(1BB`$``PBP!`$!0/P`&)$``@BP!`$!0/P`$)$``8BP!
+M`$!0/P`#)#\`QC``$@0``#]","4PP@``%`,`/P`#/"000P`E,,(`+2!``@``
+M`CP``%`D"?@``NB`!330+Z:.!0#`4/@OI8XM($`""?@``B"!!33X+Z6.__\"
+M)`0`HA````(\``!")`GX0``M($`"_"^ECO__`B0$`*(0```"/```0B0)^$``
+M+2!``@`PI8[__P(D!`"B$````CP``$(D"?A``"T@0`+X`4:.!P#`4-P!7JXM
+M($`"```"/```0B0)^$``2(`%--P!7JX(`*>/*`#@$`$``R08`*F/!``BD0(`
+M0C`%`$!4&`"CCP0`(I'^`$(P!``BH1@`HX\"`&*4`@!BI@0`8I`$`&*B!0!B
+MD`4`8J(&`&*0!@!BH@<`8I`'`&*B-!)"CC``0/PT$E".```"/```0B0)^$``
+M+2!``B@``OXM($`"```"/```0B0)^$```0`%).=>``@!``,D#`"DCP``@HP!
+M`$!4``"#K"T8```M$&``B`"_WX``OM]X`+??<`"VWV@`M=]@`+3?6`"SWU``
+MLM](`+'?0`"PWP@`X`.0`+TGX/^])Q``O_\(`+'_``"P_P0"D(P#``(R$0!`
+M$"V(@`````(\``!")`GX0`!$F04T_]\#//__8S0D$$,``0`#,D`?`P`E$$,`
+M+2`@`BTP0`````(\``!")`GX0`!$F04T#``",A@`0!`0`+_?@A`"``$`0C`(
+M`$`4+2`@`@```CP``$(D"?A``-"`!33C_P,D'U\`""000P````(\``!")`GX
+M0`#0@`4T'`!"-"T@(`(M,$`````"/```0B0)^$``T(`%-!``O]\(`+'?``"P
+MWP@`X`,@`+TG\/^])P``O_^T+(*,"?A````````K$`(```"_WP@`X`,0`+TG
+ML/^])T@`O_]``+;_.`"U_S``M/\H`+/_(`"R_Q@`L?\0`+#_+8B``"VHH``!
+M`!,D```"/```0B0)^$``+;"``"V@0`#H`2*6#`!`$"V```````(\``!2)"T@
+M(`()^$`"+2@``@D`0!0!`!`FZ`$BEBL0`@+Y_T`4+2`@`I\`8!(M&```6%\`
+M""T@(`)27P`(+9@``'R9!30```(\``!")`GX0``!``8D+8```````CP``%,D
+M```"/```4B0M("`""?A@`B"<!30(`$`49``"+@GX0`(%``0D`0`0)F0``B[W
+M_T!4+2`@`F0``BZ#`$`0+1@``"T@(`(```(\``!")`GX0``M*(`"?`!`$"T8
+M```M("`"```"/```0B0)^$``%)D%-/\_0S`"`(*6(`!",`L`0!`\$`,`@!`#
+M`/S_0C`NN@,T.!P#`*.+8S0<`$,`$A```#X1`@"37P`(9`!$)#X0`@#,S`,T
+M.!P#`,W,8S0<`$,`$A```/X0`@!D`$0D```"/```0B0)^$```````"T@(`(M
+M*(`"```"/```0B0)^$``+3"@`U0`0!`M&```+2`@`GR9!30```(\``!")`GX
+M0``M,````@""ED``0C`@`$`0+2`@`LP!(XX*``0D#0!D$`D``B0,`&)0`@"B
+ME@8`9%1P$L*6T`$BE@0`0BP&`$!4`@"BEG`2PI8#4$(L"P!`%"T@(`("`**6
+MH`!",*```R0%`$,0+2`@`@```CP``$(D"?A``"TH@`(M("`"```"/```0B0)
+M^$``+2B@`BT@(`(```(\``!")`GX0`!@F`4T`@!"-"T@(`(M,$`````"/```
+M0B0)^$``8)@%-`0`@I("`$(P!0!`5`(`@I8$`(*2_@!",`0`@J("`(*6`@"B
+MI@0`@I($`**B!0""D@4`HJ(&`(*2!@"BH@<`@I('`**B-!(BCC``0/PT$C".
+M```"/```0B0)^$``+2`@`B@``OXM("`"```"/```0B0)^$```0`%)`$``R0M
+M$&``2`"_WT``MM\X`+7?,`"TWR@`L]\@`++?&`"QWQ``L-\(`.`#4`"])^#_
+MO2<0`+__"`"Q_P``L/\MB(``+8"@`````CP``$(D"?A```2`!30M&$``_/\"
+M//__0C0D&&(``0`")"X``A("``(J!0!`4`8``B08```2`A`&/$-@``@0`+_?
+M!@`"$@$0!CP(``(D(P`"$A``O]]$8``("`"QWR4P9@`M("`"```0/```$"8)
+M^``"!(`%-"T@(`(```(\``!")`GX0``4``4DW_\#)#5@``@D$$,`)3!F`"T@
+M(`(``!`\```0)@GX``($@`4T+2`@`@```CP``$(D"?A``!0`!20@`$(T+2`@
+M`A0`!20)^``"+3!``$-@``@0`+_?`!`&/"4P9@`M("`"```"/```0B0)^$``
+M!(`%-!``O]\(`+'?``"PWP@`X`,@`+TG\/^])P``O_\"``(\K(A")`GX0``"
+M``4D``"_WP@`X`,0`+TG\/^])P@`O_\``+#_+8"``"TH``````(\``!")`GX
+M0``!``8D!P!`$"T8```M(``"`@`"/*R(0B0)^$``$P`%)"T80``M$&``"`"_
+MWP``L-\(`.`#$`"])\#_O2<P`+__*`"U_R``M/\8`+/_$`"R_P@`L?\``+#_
+M+8B``"V`H``"``(\K(A")`GX0``3``4DI0!`$"T8```M("`"+2@``````CP`
+M`$(D"?A```$`!B2=`$`0+1@``"T@(`("``(\K(A")`GX0``M*```E@!`$"T8
+M``"3```2"@`$),P!(XX)`&00"0`")`@`8E`"``.6#P!D5-0!(I;0`2*6!`!"
+M+`L`0%#4`2*6`@`#EB``8C`:`$`4"``5)-``8S#```(D,`!B%`0`%"3)8``(
+MZP`4)/``0C#0_T(D0`!"+`@`0%0"``.6S`$CC@<``B0#`&(0"P`")!,`8E0"
+M``.6`@`#EB``8C`%`$`4"``5)-``8S#```(D`P!B5`(``I;)8``(ZP`4)`!`
+M0C`6`$`4Z@$4)`(``H83`$`$Z@(4),E@``CJ`!0D(`!B,`4`0!0MJ```T`!C
+M,,```B0#`&)4`@`"ELE@``BK`!0D`$!",`4`0!2J`10D`@`"A@(`0`2J`A0D
+MJ@`4)`(``Y9``&(P"@!`4`(``I8@`&(P"@!`5`0`M3;0`&,PP``")`,`8E0"
+M``*6V6``"`0`M39``$(P`0!`4`$`M38"``*6``%",`$`0%`"`+4V`@`"EA``
+M0C`"`$`4`P`3)"V8```M("`"```"/```0B0)^$``?)@%-"V00``"``.6(`!B
+M,`0`0!30`&,PP``")!8`8A0`````+2`@`@28!30```(\``!0)`GX``(M,&`"
+M+2`@`@"B!30)^``"+3"@`A\`5!(M("`"?)@%-`GX``(M,(`"```"/```0B0)
+M^$``+`$$)!IA``@!``,D"@!4$BT@(`)\F`4T```"/```0B0)^$``+3"``@``
+M`CP``$(D"?A``"P!!"0M("`"!)@%-```$#P``!`F"?@``BTP8`(M("`"`*(%
+M-`GX``(M,*`"`0`#)"T08``P`+_?*`"UWR``M-\8`+/?$`"RWP@`L=\``+#?
+M"`#@`T``O2>P_[TG2`"__T``OO\X`+?_,`"V_R@`M?\@`+3_&`"S_Q``LO\(
+M`+'_``"P_RV0@``MN*``+8#``"VP@`````(\``!")`GX0````,"L+9A``.8`
+M8!(M$```P"]#C@(``B0$`&(0`0`")`4`8%3`+]&.`0`")````J[`+]&.`0`"
+M)'L`(E8"`.*6+2!``@```CP``$(D"?A``""9!30!``,\)!!#`'(`0%0"`.*6
+MP"_`K@``$:XMJ``````"/```420M($`""?@@`A"<!30MH$``+2!``@GX(`(4
+MG`4T+8!``"T@0`()^"`"&)P%-`,`@!(M\$``$0``%D(@%``M($`""?@@`B"9
+M!30!``,\)1!#`"T@0`(M,$`````"/```0B0)^$``()D%-`$`M28*`*(JY/]`
+M%"T@0`)"(!0`0A`0`"$@@@#"&00`:@!@$,(I$``"`*(H:`!`5"T@0`(C$!X`
+M`!8"``.N`@`:`*,"$A````$`8%`-``<`$J@``.#_0B@#`$`0(`"B*HIA``C@
+M_Q4D`0!`4!\`%20;`(4"$A````$`H%`-``<`@/]4)/#_@BH#`$`0$`""*I9A
+M``CP_Q0D`0!`4`\`%"0M($`"```1/```,28)^"`"()D%-!_X`R0D$$,`0!D5
+M`.`'8S`E$$,`+2!``B"9!30``!`\```0)@GX``(M,$``+2!``@GX(`(@F04T
+MX/\#)"000P`?`(,R)1!#`"T@0`(@F04T"?@``BTP0``M($`""?@@`B"9!30`
+M"$(T+2!``B"9!30)^``"+3!```(``B3`+\*N`0`")!``8JX4`'6BX6$`"!4`
+M=**@`$(PH``#)!X`0Q`"``(DP"_#CAP`8A0M($`"$`!BCAH`0!0```(\+2!`
+M`@``$3P``#$F"?@@`B"9!30`\$(T+2!``B"9!30``!`\```0)@GX``(M,$``
+M+2!``@GX(`(@F04T`0`#/"400P`M($`"()D%-`GX``(M,$```0`"),`OPJXM
+M($`"```"/```0B0)^$``+2A@`@(`8I8"`$(P,`!`5`(`XI8M($`"```"/```
+M0B0)^$``8)@%-`(`0C0M($`"+3!``````CP``$(D"?A``&"8!30"`.66``&B
+M,`L`0%3,`4..U`%"EO``0C#0_T(D0`!"+"``0!`!``(D0`"B,!T`0!`!``(D
+MS`%#C@<``B08`&(0"P`")!8`8A`*``0D%`!D$`D``B03`&(0`0`")`8`9!0"
+M``(\T`%"E@0`0BP-`$!4`0`")`(``CSLL4(D"?A``"T@0`(?8@`(`0`")`(`
+M0C0"`.*F`@!BEOW_0C`"`&*F`0`")$@`O]]``+[?.`"WWS``MM\H`+7?(`"T
+MWQ@`L]\0`++?"`"QWP``L-\(`.`#4`"])^#_O2<8`+__$`"R_P@`L?\``+#_
+M+8B``"V`H``"`*`4+3"@`/__!B3,`2.."0`")`@`8A`MD,``"@`")`@`8A0M
+M("`"T`$BE@0`0BP%`$`0```"/.__`B0D@`("+2`@`@```CP``$(D"?A```P`
+M!20M("`"`$`%)````CP``$(D"?A``"TP``(```(\``!")`GX0``/``0D`P!2
+M,@,`$#(M("`"`$`%)"TP0`(```(\``!")`GX0``M.``"+9!```$``C(5`$`4
+M+1!``BT@(`(4``4D```"/```0B0)^$``+3```"T@(`(M*``````"/```0B0)
+M^$```0`&)`<`0!`M$$`"+2`@`@```CP``$(D"?A``,``!20M$$`"&`"_WQ``
+MLM\(`+'?``"PWP@`X`,@`+TG\/^])P``O_\```(\``!")`GX0`!DF`4TPAP"
+M`/\!8S```6(P!`!`$"T08`#_`6(X)Q@"`"T08````+_?"`#@`Q``O2<"`**4
+MX`%#,,```B0,`&)0T!*"E,$`8B@&`$`00`$")*```B0&`&)0SA*"E`@`X`,M
+M$```!0!B5"T0``#,$H*4``#"I`@`X`,!``(D"`#@`P````#0_[TG*`"__R``
+MLO\8`+'_$`"P_RV0@``MB*`````"/```0B0)^$``8)@%-`(`0C`7`$`4+8``
+M`````CP``$(D"?A``"T@0`(M@$``+2!``BTH(`("``(\)(I")`GX0``M,*`#
+M"0!`4"V``````**'*A!0``8`0%`6`#"F`@`BE@(`0C0"`"*F+8```!8`,*8M
+M$``"*`"_WR``LM\8`+'?$`"PWP@`X`,P`+TGT/^])R``O_\8`+/_$`"R_P@`
+ML?\``+#_+8B``.`!@MRX%P(`/Q`"``$`0C`M`$`0+9B``"`$!20``!`\```0
+M)@GX``(!``8D+2`@`@`&!20)^``"+3```"T@(`(```(\``!")`GX0```!@4D
+M"`!"-"T@(`(`!@4D"?@``BTP0``M("`"!`8%)!``!CP)^``"`0+&-"T@(`(@
+M!@4D"?@``BTP```M@``````"/```4B0M("`"``0%)`GX0`(M,``"(1`3`C@O
+M1I`M("`""?A``@0$!20!`!`F@``"*O7_0!0M("`"(`"_WQ@`L]\0`++?"`"Q
+MWP``L-\(`.`#,`"])_#_O2<``+__+6B``"T@``#__\HDPE`*`/__QB0'`,8P
+M+4B@`!P`H!@M6````0`,),`X!P`A0,D`"0`"+0$`0%`(``@D!!`,`?__0B0$
+M&,P`__]C)"800P`$$.(`@!@*`"$8;0```&.,)!!#``80X@`&$,(`!!!B`24@
+M@@`C$`8!(5AB`2$0)@'X_TDD+3```.C_(!T!`$HE```"/```0B0)^$``````
+M````O]\(`.`#$`"])]#_O2<H`+__(`"T_Q@`L_\0`++_"`"Q_P``L/\MD(``
+M+:"```(`PI3@`40PP``")`\`@A`MF*``P0""*`8`0!!``0(DH``")`<`@A`M
+M$```FV,`""@`O]\&`((0+1@``)IC``@M$```4V,`"`$``R0"``,D0!@#`"$8
+M=`#J$G"4\!)BE(`1`@`E@`("]A)BE``3`@`E@`("_!)BE(`4`@`E@`("`A-B
+ME``6`@`E@`(""!-QE`X38I2`$0(`)8@B`A038I0`$P(`)8@B`AH38I2`%`(`
+M)8@B`B`38I0`%@(`)8@B`@$``B0)`&)2+8@``@<`8!("``(D`P!B%BT0``!Z
+M8P`(+8`@`IMC``@H`+_?"``P%BT@0`(```(\``!")`GX0``(H@4T_]\#)(AC
+M``@D$$,````"/```0B0)^$``"*(%-``@0C0M($`"+3!``````CP``$(D"?A`
+M``BB!32\+Y.N+2!``BTP``(``!`\```0)@GX``)@F04T+2!``F29!30)^``"
+M+3`@`@$``B0H`+_?(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])\P!@XP*
+M``8D%0!F$`D``B04`&)0*``#)`<`9A0'``(DT`&"E`0`0BP.`$`4*``#),P!
+M@XP'``(D"0!B$`L``B0(`&(0*``#)-0!@I3P`$(PT/]")$``0BP"`$`0(``#
+M)"@``R0M(`````"BE!L`0P`0$````0!@4`T`!P`'`$`0``````$`8%`-``<`
+M]O]")`T`0BP!`$!0`0`$)`@`X`,M$(``H/^])U@`O_]0`+[_2`"W_T``MO\X
+M`+7_,`"T_R@`L_\@`++_&`"Q_Q``L/\MH(``+;B@`"VH@``"`+:4P[$6``(`
+MHI3P`4,P0`$")!P`8A`!`-8R00%B*`\`0!#`"`(DP``")$0`8A#!`&(H!@!`
+M$-```B2@``(D/`!B$"T0``!-90`(6`"_WSL`8A`M$```364`"%@`O]\W`&(0
+MP0AB*`,`0%!`"0(D^6,`"%`!`B0#`&(04`D")%(!8A0M$`````"@K]0!@I;P
+M`$(PT/]")$``0BPK`$`4+2"``LP!@XX'``(D)P!B$`L``B0D`&(0"@`$)"(`
+M9!`)``(D(0!B4"T@@`(&`&04+2"``M`!@I8$`$(L'`!`%````CPM((`"```"
+M/```0B0)^$``1)D%-,?_`R0D$$,`+"RCC@``8X3`&`,`.`!C,"400P`M((`"
+M+3!``````CP``$(D"?A``$29!30L9``(+2"``@$``B0K9``(``"BKP(``R0`
+M`*.O+2"``@```CP``$(D"?A``!"9!30&_`,D)!!#````I(]`B`0`(8@U`N02
+M(Y8`&0,`)1!#``$`0C0M((`"$)D%-```$#P``!`F"?@``BTP0``M((`"O"^E
+MC@```CP``$(D"?A``"TPX`+,$B:6_P'&,``"QC0M((`""?@``FB9!31P$J*6
+M`%!"+!$`0!0``*./`@#BEA``0C`.`$`00!`#`$`8%@`A&'4`1!-PE"$0U0)(
+M$T(D!`!3@`8`7H!($V*4!`"BKU`38Y1L9``("`"CKT`0`P`A$%4`HA)0E"$0
+M=0#&$E.`(1#5`LD27H!`$!8`(1!5`*@21)0$`*2O,A-"E`@`HJ\M((`"```2
+M/```4B8)^$`"1)@%-'_``R0D$$,`P!D0`(`_8S`E$$,`+2"``D28!30``!$\
+M```Q)@GX(`(M,$``+2"``@GX0`)0F`4T`/\#)"000P#_`&,R)1!#`"T@@`)0
+MF`4T"?@@`BTP0``M((`""?A``E"8!33__Q,\_P!S-B004P``&AX``/]C,"40
+M0P`M((`"4)@%-`GX(`(M,$``+2"``@GX0`)(F`4T_/\#//\/8S0D$$,`!`"C
+MCP`C`P`#``,\`/!C-"0@@P`E$$0`+2"``DB8!30)^"`"+3!`````I(]`@`0`
+M(8`5`KH2`I8`-@(``!0"`"4PP@#`$@.6`!(#`"4PP@`E,,,`+2"``@GX(`(T
+MF`4T+2"``@GX0`(HF`4T)!!3`*X2`Y8`&@,`)1!#`"T@@`(HF`4T"?@@`BTP
+M0``M((`""?A``F28!33X_P,\_P]C-"000P"T$@26`",$``<``SP`\&,T)""#
+M`"401``M((`"9)@%-`GX(`(M,$``<!*BE@,P0BP+`$`0`@`0),H!@Y8B$`(D
+M$P!B%"T@@`("`.*60`!",`\`0%0(`!`DZ&0`"````CPM((`"```"/```0B0)
+M^$``+2C@`@8`0!`M((`"``"CCT`0`P`A$%4`)A-"E"&``@(```(\``!")`GX
+M0``DF04T`?\#)"000P!`&!``_@!C,"400P`M((`"+3!``````CP``$(D"?A`
+M`"29!300`.*.!`!`$$`0%@`4`/""_V0`"!4`\H(A$%4`MA-0E+H34I0M((`"
+M```1/```,28)^"`"()D%-!_X`R0D$$,`0!D0`.`'8S`E$$,`+2"``B"9!30`
+M`!`\```0)@GX``(M,$``+2"``@GX(`(@F04TX/\#)"000P`?`$,R)1!#`"T@
+M@`(@F04T"?@``BTP0``M((`""?@@`B"9!30`"$(T+2"``B"9!30)^``"+3!`
+M`'`2I)8!0((L'0!`5'`2HI8"`.*6T`!",-```R0%`$-4+2"``@!0@BP5`$!4
+M<!*BEBT@@`(```(\``!")`GX0``,H@4T`_\#//__8S0D$$,`"`"DCX`<!`#\
+M``0\)!AD`"400P`M((`"+3!``````CP``$(D"?A```RB!31P$J*6`5!"+`@`
+M0!0!``(D+2"``N"9!30```(\``!")`GX0``M,````0`")%@`O]]0`+[?2`"W
+MWT``MM\X`+7?,`"TWR@`L]\@`++?&`"QWQ``L-\(`.`#8`"])W#_O2>(`+__
+M@`"^_W@`M_]P`+;_:`"U_V``M/]8`+/_4`"R_T@`L?]``+#_+:"``"VHH```
+M`*#_"`"@_Q``H/\H`*"O+`"@KS``H*\```(\`%E")`<`0V@``$-L'P"CLQ@`
+MH[<```(\"%E")`,`0X@``$.8!`!$A",`HZL@`*.[)`"DIP(`L9;#B1$``0`Q
+M,@<`(!(``*.6@!`#`"$00P!`$`(`**9")(EE``C__U8P@!`#`"$00P!`$`(`
+MF$!")/[_5C`X`**6(0!`%"V00`"090`(`(`2-*ME``@MD&```@"BEA``0C`"
+M`$`05P`#)*X``R0M@````(`>-".8PP(AN,,"Q`&"CBT@@`(M*``""?A``"TP
+M(`(-`%Y0.`"RIO\_0S`J$',`!`!`%`$``B8J$.,"Z/]`$`$``B;__U`P!0`"
+M+O#_0%3$`8*..`"RI@"``C1C`$)6`@"BEBT@@`(```(\``!2)`GX0`(@F04T
+M`$`#/"000P"*`4`0B`"_WRT@@`()^$`"#)D%-/\``SS__V,T)!!#`"T@@`(,
+MF04T```0/```$"8)^``"+3!``"T@@`()^$`"()D%-"TP0`#_CP(\__]"-"0P
+MP@`M((`""?@``@R9!30M((`"H)D%-`GX``(M,```+2"``H"9!30)^``"+3``
+M`"T@@`()^$`"A)D%-/#_$3PD$%$`+2"``H29!30)^``"+3!``"T@@`*8F04T
+M"?@``BTP```M((`""?A``IR9!30D$%$`+2"``IR9!30)^``"+3!``"T@@`(`
+MF04T"?@``BTP```M((`"!)D%-`GX``(M,```+2"``@B9!30)^``"+3```"T@
+M@`()^$`"#)D%-`#`$20D$%$`+2"``@R9!30)^``"+3!``"T@@`*(F04T"?@`
+M`BTP```M((`"C)D%-`GX``(M,```+2"``I"9!30)^``"+3```"T@@`()^$`"
+ME)D%-#QG``@D$%$`\`%%,-```B0]`*(0(R!6`M$`HB@&`$`00`$"),```B0;
+M`*(00!$$`&-F``@C$$0`!0"B$%`!`B0Q`*(00!$$`&-F``@C$$0`0!0$`"P`
+MHJ_K40(\'X5"-"P`HX\<`&(`$A```#\0`@##$`(`+`"EC\,?!0`C$$,`+`"B
+MKX,R`@`P`*:O-0P")&%F``@H`**O`!H$`#``HZ]/"0(\E2!"-#``HX\<`&(`
+M$A```#\0`@!#$`(`,`"EC\,?!0`C$$,`,`"BKT`T!``L`*:OZU$"/!^%0C0L
+M`*./'`!B`!(0```_$`(`PQ`"`,,?!@`C$$,`+`"BKS4,!21A9@`(*`"EKP`T
+M!``L`*:OZU$"/!^%0C0L`*./'`!B`!(0```_$`(`PQ`"`,,?!@`C$$,`+`"B
+MKX,J`@`P`*6O:A@&)"@`IJ]`$00`(Q!$`(`0`@`A$$0`P!D"`"@`I(\:`&0`
+M$A````$`@%`-``<`$A@```\`0C`$`$!0`P`&)`0`!B1S9@`(&`"H)R``J"=7
+M`,`0+8````,I`P`=`*<H`0`)),<`X!`A$+``&0!$)"$`@BP.`$`0W_^#)!H`
+M@B@#`$!0&P""*(=F``@$$(D`#P!`%`$`@B3__X(D!!!)````HX\E$$,`DF8`
+M"```HJ\4`&(L!@!`$`$`@B0$$&D`!`"CCR400P`$`**O`0"")!``0BP+`$`0
+M\?^")$`0$``A$$@```!#E$`0!``"`$(D!!A#``@`HH\E&&(`QF8`"`@`HZ\0
+M`$(L"P!`$.'_@B1`$!``(1!(````0Y1`$`0`XO]")`080P`,`**/)1AB`,9F
+M``@,`*.O$`!"+`L`0!#1_X(D0!`0`"$02````$.40!`$`,+_0B0$&$,`$`"B
+MCR488@#&9@`($`"CKP<`0BP+`$`0`0`")D`0$``A$$@```!#E$`0!`"B_T(D
+M!!A#`!0`HH\E&&(`%`"CKP$``B;__U`P*A`&`J[_0!0`````+2"``@``$CP`
+M`%(F"?A``@R9!33_``,\__]C-"000P``_P,\)1!#`"T@@`(,F04T```0/```
+M$"8)^``"+3!``"T@@`()^$`"()D%-"TP0```<`(\)3#"`"T@@`()^``"()D%
+M-#``I8\`-04`\#\"/"0PP@`/`!$\__\Q-BP`HX\D$'$`)3#"``!``CPE,,(`
+M+2"``@GX``*@F04T+2"``H"9!30)^``"``"FCRT@@`()^$`"A)D%-/#_$SPD
+M$%,`!`"CCR08<0`E$$,`+2"``H29!30)^``"+3!``"T@@`*8F04T"?@``@``
+MIH\M((`""?A``IR9!30D$%,`!`"CCR08<0`E$$,`+2"``IR9!30)^``"+3!`
+M`"T@@`(`F04T"?@``@@`IH\M((`"!)D%-`GX``(,`*:/+2"``@B9!30)^``"
+M$`"FCRT@@`()^$`"#)D%-`#`$20D$%$`%`"CC_\_8S`E$$,`+2"``@R9!30)
+M^``"+3!``"T@@`*(F04T"?@``@@`IH\M((`"C)D%-`GX``(,`*:/+2"``I"9
+M!30)^``"$`"FCRT@@`()^$`"E)D%-"0040`4`*./_S]C,"400P`M((`"E)D%
+M-`GX``(M,$``B`"_WX``OM]X`+??<`"VWV@`M=]@`+3?6`"SWU``LM](`+'?
+M0`"PWP@`X`.0`+TGT/^])R``O_\8`+/_$`"R_P@`L?\``+#_+9B```(`HI00
+M`$(P`@!`$`!D`SP`R`,\`@"BE`!`0C`#`$!0`@"BA&!G``A"&`,``0!"!((8
+M`P```**4&P!B`!(8```!`$!0#0`'`!\`$B0&$$,"`0!",`4`0!0F``(D__]2
+M)OO_0!8&$$,")@`")".04@`7``(D(Q!2``$`$"0$@%``(8!P`!@``B0C$%(`
+M!H!0`/#_4B8M(&`"```1/```,28)^"`"%)@%-`$``SS__V,T)!!#`$"$$``E
+M$%``+2!@`A28!30``!`\```0)@GX``(M,$``+2!@`@GX(`(4F`4T_O\#//\?
+M8S0D$$,`0),2``$``SP`X&,T))!#`B404@`M(&`"%)@%-`GX``(M,$``(`"_
+MWQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])^#_O2<0`+__0`"B+`(`0!0M&(``
+M/P`%)/P!9:0M(&``-!)EC````CP``$(D"?A``"TPH`,0`+_?"`#@`R``O2?`
+M_[TG.`"__S``M/\H`+/_(`"R_Q@`L?\0`+#_+8B``"V8H``MH,``+9"``'A&
+MA(P``!`\```0)@GX``)\1B6.@$8D)@GX``(@``4D_`$BAD``0B@"`$`4_`$C
+MEC\``R0`%`,``SP"`#\`XB@$`$!0``(CC@<`X!0M,`````(CCD`8`P````(\
+M$%E")"$88@```&:$+2`@`BTH8`(!``@D+4B@`P(``CQ\HD(D"?A```(`JB>Z
+M`$`0+1@``+PL0HXM("`"+2B@`P(`IB<M.&`""?A``"U`@`*Q`$`0+1@``,P!
+M(XX'``(D$`!B$`L``B0.`&(0"@`$)`P`9!`)``(D"P!B$"V````&`&14GD9"
+MEM`!(I8$`$(L!@!`5/0O1):>1D*6!`!"))Y&0J8M@```]"]$EC\`!21`$!``
+M(1A2`(!&8I0A$$0`@$9BI/__0C!``$(L`0!`4(!&9:0!`!`F$``"+O7_0!1`
+M$!``GA)"E@(`0BP[`$!0AD9&EM(!(I9"`$(L(`!`$"V````"`&*6T`!",,``
+M`R0<`$,4@*$4-```8Y:T"0(D#0!B%)(20Y*<$D*6(QAB`&9F`CQG9D(T'`!B
+M`!(0```_$`(`0Q`"`,,?`P`C$$,`*V@`"/__13!F9@(\9V9"-!P`8@`2$```
+M?B@"``(``CSTJ4(D"?A``"T@(`(M@```@*$4-````CP``%,D@!@0`"$H=`!X
+M1D*.(1AB``(`9I0`,@8`_P#&-``T!@```&*4`!("`/\`0C3__T(P)3#"``GX
+M8`(M("`"`0`0)B```BKO_T`4@!@0`(9&1I8_`,8P`#8&`(1&0I8_`$(P`!0"
+M`"4PP@""1D*6/P!",``2`@`E,,(`@$9"EC\`0C`E,,(`+2`@`@``$#P``!`F
+M"?@``C29!32.1D:6/P#&,``V!@",1D*6/P!",``4`@`E,,(`BD9"EC\`0C``
+M$@(`)3#"`(A&0I8_`$(P)3#"`"T@(`()^``".)D%-)1&1I8_`,8P`#8&`))&
+M0I8_`$(P`!0"`"4PP@">1D*6/P!",``2`@`E,,(`D$9"EC\`0C`E,,(`+2`@
+M`@GX``(TH@4TG$9&EC\`QC``-@8`FD9"EC\`0C``%`(`)3#"`)A&0I8_`$(P
+M`!("`"4PP@"61D*6/P!","4PP@`M("`""?@``CBB!33<+T*.`@!`%'\`!B0_
+M``8D+2`@`@```CP``$(D"?A``#R9!30!``,D+1!@`#@`O]\P`+3?*`"SWR``
+MLM\8`+'?$`"PWP@`X`-``+TG</^])X@`O_^``+[_>`"W_W``MO]H`+7_8`"T
+M_U@`L_]0`++_2`"Q_T``L/\ML(``+9B@`"@`J*\L`*FO,`"JKP`T!@`#-`8`
+M(`"FKP`\!P`#/`<`)`"GKRV(@``_`!XD-`"^KP4`HH!`$`(`__]",#@`HJ_!
+M_P(D``!"I30`HX\L`**/``!#I````CP``$(D"?A``(!&E23_`%(P+8```'03
+MPI8D`$`0/`"@K___5#+X`%<R0!`0`"$040!V$T*4&0!`4`$`$"8$`%00!P!"
+M,.``0C04`$)6`0`0)H`1$``A$"("U!=%)`(``SR0JV,D"?A@````9);@``0D
+M!P#D%BT80`#__T(P*Q#"`P$`0%0M&,`#Z&@`"/__?C#M:``(+?!```$`$"9T
+M$R*6*A`"`N'_0!1`$!```@!BEM``0C#```,D+0!#5#0`OJ_X`$(R`0!2-'03
+M(I8H`$`0+8```/__5#+X`%<R0!`0`"$040!V$T*4&P!`4`$`$"8$`%00!P!"
+M,.``0C06`$)6`0`0)H`1$``A$"("U!=%)`(``SR0JV,D"?A@````9);@``0D
+M"0#D%BT80`#__T(P-`"DCRL0@@`!`$!4+1B``/__8S`7:0`(-`"CKQYI``@T
+M`**O`0`0)G03(I8J$`("W_]`5$`0$``?:0`(`@!BE@(`8I8``4(P`@!`4(\2
+M)H*.$B:"+2#``@```CP``$(D"?A``"TH8`(`%@(``X8"``(`8Y9``&(PC`!`
+M$"``8C"``&(P!`!`4$P7)B:>%R8F-6D`")P7)Y9*%R>6+2#``BTH8`("``(\
+M2*U")`GX0``M0*`#.`"BCR,84``J$,,#`0!`5"T8P`,`%`,``S0"``(`8I80
+M`$(P&@!`$`8`HY=P$B*6`3!"+`@`0%1P$B*6?A(CEBH0PP`!`$!4+1C````4
+M`P`#-`(`<!(BE@!`0BP,`$`4!@"CEP(`8I:``$(P"0!`$"H0PP"`$B.6*A##
+M``$`0%0M&,```!0#``,T`@`&`*.7*A##``$`0%0M&,```!0#``,4`@`\`**O
+M(`"CCT`0`P`\`*2/(Q""```4`@`#-`(``@#!!"T0P``M$````!0"``,T`@`D
+M`**/+1A``"H0P@`!`$!4+1C````4`P`H`*./-`!@$`,T`@`(`*:F!@"FI@0`
+MIJ8"`*:F``"FI@0`I)?__X,P___","L00P`"`$`0+2C``"T@P``*`*2F`@"D
+ME___@S```**6*Q!#``$`0%0``*26#`"DI@``I)?__X,P``"BEBL00P`!`$!4
+M``"DE@X`I*8`%`0``QP"`'`2(I8`0$(L#@!`5```HI8"`&*6@`!",`(`0%""
+M$B*6A!(BEBH0P@`&`$`4+1#```(`8I:``$(P`@!`4((2(I:$$B*6'@"BIC``
+MI(\``(*$LVD`"/`O(JX``*.7*A##``(`0!`M*,``+1C````4`P`#'`(`+`"B
+MCP``0Z0P`*./``!EI`(`8Y8@`&(P!`!`%-``8S#```(D6P!B%"@`HH^^%R8F
+MO!<GEBT@P`(M*&`"`@`"/$BM0B0)^$``$`"H)S@`I(\C&)``-`"DCRH0@P`!
+M`$!4-`"CCP`4`P`#-`(`%@"CERH0PP`!`$!4+1C``"``I(]`$`0`(Q!B```4
+M`@`#-`(``@#!!"T0P``M$````!0"``,T`@`D`**/+1A``"H0P@`!`$!4+1C`
+M```4`P`H`*./'0!@$`,T`@`6`*.7*A##``$`0%0M&,``$`"CIA0`HY<J$,,`
+M`0!`5"T8P``2`*.F`!0#``,L`@`4`*.F$@"CERH0PP`!`$!4+1C``!8`HZ88
+M`*.F$`"CERH0PP`!`$!4+1C``!H`HZ8`%`,``R0"``UJ``@<`*.F%`"CERH0
+MPP`!`$!4+1C````4`P`#+`(`$`"CERH0PP`!`$!4+1C````4`P`#)`(`+`"C
+MCP``8H0J$((``0!`5```9*0P`*2/``""A"H010`!`$!4``"%I"@`HH\'`$`0
+M`0`")#``HX\``&*$R"\BKL@O(I;^`<*F`0`")(@`O]^``+[?>`"WWW``MM]H
+M`+7?8`"TWU@`L]]0`++?2`"QWT``L-\(`.`#D`"])Z#_O2=0`+__2`"W_T``
+MMO\X`+7_,`"T_R@`L_\@`++_&`"Q_Q``L/\MD(``+:B@`,`L@HP)^$``+:#`
+M`#4`0!`M&```_`%"AD``0B@"`$`4_`%#EC\``R0`%`,``YP"`#\`8BH$`$!0
+M``)#C@<`8!8MN`````)#CD`8`P````(\(%E")"$88@```'>$(`"`$BV(```"
+M``(\?*)6),`0$0`A@*("+2!``BTH``(M,.`"+3A@`BU````M2*`#"?C``@(`
+MJB<3`$`0+1@```(`HH<&``."*A!#``0`0!```**'`@"BDP8``J(``**'!P`#
+M@BH00P`#`$`0`0`Q)@``HI,'``*B*Q`T`N7_0!3`$!$``0`#)"T08`!0`+_?
+M2`"WWT``MM\X`+7?,`"TWR@`L]\@`++?&`"QWQ``L-\(`.`#8`"])\#_O2<X
+M`+__,`"R_R@`L?\@`+#_+9"@`"V`@`":$I&$@$:%)"T@H`,```(\``!")`GX
+M0``@``8D"``()`@`"R0_``PD0!@(`"$8?0```&*4(Q!1````8J0M(```+5``
+M`$!("``M.&````#BA`$`0@0``."D`P"+%"$8/0&U:@`(#P`$)```981`$`0`
+M(1!0`(!&0I00`*(4``!FE`0`H!0S`$(M`0#")*]J``@``&*D`P!`%```XI2N
+M:@`(`0!")/__0B0``.*D+2````$`0B6U:@`(__]*,`$`@B3__T0P$`""+.'_
+M0%0``.*$0!`(`"$870```&*$0`!"*`$`0%```&RD0!`(`"$04`"`1D64(RBR
+M``$`H@0M*```0!`(`"$070```$.$>$8$CD`8`P`A&&0`0!`%`"$01````$*4
+M``!BI`$``B7__T@P#P`"+;W_0!1`&`@`"``()$`0"``A&%``(1!=````0I2`
+M1F*D`0`")?__2#`/``(M^/]`5$`0"``X`+_?,`"RWR@`L=\@`+#?"`#@`T``
+MO2?`_[TG.`"__S``LO\H`+'_(`"P_RV`H`#__Y(P+3```,`0!@`A&%````!B
+ME`@`0!!`$`8`(1!=````8Y0``$.D`0#&)`@`PBCV_T`4P!`&`"V(P`#__\8P
+M+2!``BTHH`,0`*<G```"/```0B0)^$``$@"H)PT`(!HM,```$`"CEP``HI<+
+M`&(0$@"BEP$`QB0J$-$`!0!`$$`0!@`A$%T```!"E/K_8E0!`,8D$`"CEQ(`
+MHI<#`&(4P!`&``<`<E`A$%``(1!0``0`0HP$`$`0/P`%),`0!@`A$%```@!%
+ME"T0H``X`+_?,`"RWR@`L=\@`+#?"`#@`T``O2?__X0P__^E,/__QC#__^<P
+M__\(,1@`Z``2$```)0!`$"T8```C`,40+1C@`",8A0!`$`,`(1!#`,`0`@`A
+M$$,`@!`"`",8Q0`:`$,`$A````$`8%`-``<``!0"``,D`@`4`(`$+1C@`&4`
+M@B@1`$`0+1@``1@`B``2&```9``")",01``8`$<`$A```"$88@#K40(\'X5"
+M-!P`8@`2$```/Q`"`$,1`@##'P,`(Q!#`/__0S`(`.`#+1!@`*#_O2=8`+__
+M4`"V_T@`M?]``+3_.`"S_S``LO\H`+'_(`"P_RVHH``MD,``+;```?__\#`-
+M```2+2```$`8!``A&'T`@!`$`"$01`!`$`(`(1!2``@`0I0``&*D`0"$)"H0
+MD`#V_T`40!@$````I)8M**`#+3```A``IR<```(\``!")`GX0``2`*@G+3``
+M`"T@```2```2+4```!``I9<2`*.70!`$`"$070```$*4`0"B4/__AC!`$`0`
+M(1!=````0I0#`&)4`0"$)(IK``C__X@P*A"0`//_0!1`$`0```"DEA``LY<2
+M`+27@(@&`"&()@)`B!$`(8@R`@8`)Y:`@`@`(8`(`D"`$``A@!("!@`(E@(`
+M$CR,K%(F+2A@`@GX0`(M,(`"!@#"I@``I)8$`">6!``(EBTH8`()^$`"+3"`
+M`@0`PJ8``*26`@`GE@(`")8M*&`""?A``BTP@`("`,*F``"DE@``)Y8```B6
+M+2A@`@GX0`(M,(`"``#"IE@`O]]0`+;?2`"UWT``M-\X`+/?,`"RWR@`L=\@
+M`+#?"`#@`V``O2?__\8P__^$,$`0!``A$$0`P!`"`"$01`"`(`(`0#`&````
+MHY1`$`,`(1!#`,`0`@`A$$,`@!`"`/;_0B0K$((``P!`$"$PI@#;:P`(``"B
+ME/[_PY1`$`,`(1!#`,`0`@`A$$,`@!`"``H`0B0K$$0`#`!`$"L0I@#^_\*4
+M```"I0@`X`,``.*D```)I0@`X`,``.FD``#BI`(`HI0(`.`#```"I1L`0!``
+M%`0``U0"````HX1`$`,`(1!#`,`0`@`A$$,`@!`"`",02@`)`$(D$P!"+.S_
+M0!0``*F4`@"CE$`0`P`A$$,`P!`"`"$00P"`$`(`]O]")"L0@@#E_T!4``"B
+ME`(`I20K$*8`Z?]`5```HX0(`.`#`````"TH@`#4`8*4\`!",-#_0B1``$(L
+M$0!`$!`LAB0```0\H%J$)`0`@XP0+*.LP!`#`"$00P"`$`(`"`"$)"$01``<
+M`,*L`0`")!@`PJP4``(D#`#"K"EL``A5``(D```$/#!9A"0$`(.,``##K,`0
+M`P`A$$,`@!`"``@`A"0A$$0`'`#"K`$``B08`,*L%``")`P`PJPC``(D"`#@
+M`Q``PJSP_[TG"`"__P``L/_4`8*4\`!",-#_0B1``$(L%@!`$"V`H`"P+(*,
+M"?A```<`!20M($```0`%)"0`!B0"``(\)(Q")`GX0``M.```+4@``&L`""0M
+M.````0`#)"4`0Q1K``8D4P`()%,`!B0W``(D:&P`"!```JZP+(*,"?A```<`
+M!20M($``!@`%)"4`!B0"``(\)(Q")`GX0``M.```+2!```0`2"0_``(D`P""
+M%"U(```R``@D/P`")`(`@A`M."`!0``')#(`YB0_``(D`@""%"T8(`$4`",E
+M#``#KC\``B0"`((0\?_#)`4`PR00``.N!``%CBL0J0`$`$`4+1@``"L0!0$)
+M`$`0+1!@`"L0IP`%`$!4`0`#)"L0Q0`#`$`0+1!@``$``R0M$&``"`"_WP``
+ML-\(`.`#$`"])_#_O2<(`+__``"P_RV`@`#T+X:$\"^"C"$PP@!`,@8``'[&
+M,`"`QC0```(\``!")`GX0``PF04T`0`"),0O`JX(`+_?``"PWP@`X`,0`+TG
+MX/^])Q@`O_\0`++_"`"Q_P``L/\M@(``+9"``!`LD208`"*.2`!`$"T8``#$
+M+X.,`0`")$0`8E3$+P..```"/```0B0)^$``,)D%-"T80```@$(P/`!`5,0O
+M`XY")@,`PA4#``,`0C`"``,D"@!#%`0`)*[2`0*60@!"+`0`0%0$`"*.FA("
+MEK1L``@A$$0`!0!")`0`(J[4`4*6\`!",-#_0B1``$(L#0!`4,0O`*X"``(\
+M=+5")`GX0``M($`"!``DCA0`(XXK$(,``P!`5`0`(*XC$(,`!``BKL0O`*XM
+M($`"`@`"/*RP0B0)^$``+2@@`A0`0%3$+P..+2!``@(``CR@LT(D"?A``"TH
+M(`(-`$!0Q"\#CBT@0`("``(\T+-")`GX0``M*"`"!0!`&`(``B3$+P*N`0`"
+M)-@O`J[`+P"NQ"\#CBT08``8`+_?$`"RWP@`L=\``+#?"`#@`R``O2<$`*.,
+M#`"BC"L00P`%`$`0+2```!``HHPK$&(``@!`%``````!``0D"`#@`RT0@`#4
+M`8*4\`!",-#_0B1``$(L!`!`$````CP```(\_FP`"*!:1R0P64<D``"DC,`0
+M!``A$$0`@!`"`"$0X@`(`$(D'`"BK`0`HHP0`*.,*Q!#`",`0%0$`*.,4`"`
+M$/__!B0$`**,"`"BK!``HXPK$$,`&0!`%"U`8````**,1P!`$`$`!B0``**,
+M__]&)```IJS`$`8`(1!&`(`0`@`A$$<`'`"DC!@`0XP0`(2,(QAD`$`8`P`(
+M`*2,(R"#``@`I*P(`$(D*R"(``,`@!0<`**L[?_`5```HHQ;;0`(`0`&)`P`
+MHHPK$$,`+`!`%"TP`````.*,__]")```HXPG`&(0_O\&)`0`HXP(`*.L#`"B
+MC"U`0``K$$,`(`!`%`(`!B0``..,__]C)```HHPM($``*Q!#`!D`0!``````
+M`0"&)```IJS`$`8`(1!&`(`0`@`A$$<`'`"DC!@`0XP0`(2,(QAD`$`8`P`(
+M`*2,(R"#``@`I*P(`$(D*R`$`08`@!0<`**L``#BC/__0B0K$,(`ZO]`%"T@
+MP``"``8D"`#@`RT0P`#0_[TG*`"__R``M/\8`+/_$`"R_P@`L?\``+#_+8"`
+M`!`LDB04`$"NL"R"C`GX0``'``4D+2!```$`!20D``8D`@`"/"2,4R0)^&`"
+M+3@``"V(0``!``(D'0`B%B@`O]\<`$*.``!4A+`L`HXM(``""?A```<`!20M
+M($``!``%)"``!B0)^&`"+3@```X`D1(M&$``#0"`4A0`0*X"``(D!@""$D`0
+M`P`#``(D!0""$B@`O]^2;0`((`"TWX]M``C[_T(D0!`#`!0`0JXH`+_?(`"T
+MWQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])]#_O2<@`+__&`"S_Q``LO\(`+'_
+M``"P_RV0@``M(*``+8C``"V`X``MF``!```"/```0B0)^$``+2C``"TX0`#_
+M_P8FPC`&`/__$"8?`"`:!P`0,@$`"23`0!,`"``*)"$8$0()`&(H`0!`4`@`
+M`R0$&&D`__]C)`00"0+__T(D)AAB``08`P&`*`8`(2BR`"<@`P```**,)"""
+M``00!P($$`(!)!!#`"401````**L(1`P`OC_420C$%`!!CA'`"V```#F_R`>
+M`0#&)"``O]\8`+/?$`"RWP@`L=\``+#?"`#@`S``O2>P_[TG2`"__T``OO\X
+M`+?_,`"V_R@`M?\@`+3_&`"S_Q``LO\(`+'_``"P_RV8@``"`**4`$!",`,`
+M0!`MH*``[FT`"``"!20"`**$`P!#!`(`HI3N;0`(``0%)!``0C`"`$`4`@`%
+M)``!!20M(&`"```"/```0B0)^$``+9```"V(0````$*,&P!`&````CP``%<D
+M`(<6-````CP``%4D0(`2`"&`$@*`@!``(8`1`B``$"8+``>2+2!@`BTH(`(.
+M``8D"?C@`BU````(``62@"@%`"$HM@`M(&`""?B@`BTP0``!`%(F```BCBH0
+M0@+L_T`40(`2``(`@I80`$(P.0!`%$@`O]\M(&`"```"/```0B0)^$``"``%
+M)"V(0````$*,+P!`&"V0````AQ<T```>/$`0$@`A$%(`@!`"`"$040`@`%`D
+M"``"DH`0`@`AH%<`!0`"DAX`0%0!`%(F"P`'DBT@8`(M*"`"#@`&)````CP`
+M`%8D"?C``BU````M(&`"+2B``@``U2<)^*`"+3!```D``I(.`$!0`0!2)H`0
+M`@`AH((""P`'DBT@8`(M*"`"#@`&)`GXP`(!``@D+2!@`BTH@`()^*`"+3!`
+M``$`4B8``"*.*A!"`M;_0!1`$!(`2`"_WT``OM\X`+??,`"VWR@`M=\@`+3?
+M&`"SWQ``LM\(`+'?``"PWP@`X`-0`+TGT/^])R@`O_\@`+3_&`"S_Q``LO\(
+M`+'_``"P_RV(@``M@*`````"/```0B0)^$``'(`%-(`_1C`"``*6`$!",`@`
+M0%#2`!,D!`$3)(`?!#P;``(\$P`#)*P-$B1U;@`(%``4)(`?!#PV``(\"0`#
+M)$@-$B0*`!0D)3!F`"4PP@`E,,0`+2`@`@``$#P``!`F"?@``AR`!30M("`"
+M<!`%)`GX``(M,&`"+2`@`K`0!20)^``"+3!``BT@(`(```(\``!")`GX0`#P
+M$`4D\/\#//\#8S0D$$,`@!H4`"400P`M("`"\!`%)`GX``(M,$``*`"_WR``
+MM-\8`+/?$`"RWP@`L=\``+#?"`#@`S``O2?0_[TG*`"__R``M/\8`+/_$`"R
+M_P@`L?\``+#_+8"@`$0LA8S_?P(\__]"-"0HH@````(\``!")`GX0``MF(``
+M+:!``"T@8`(```(\``!")`GX0``P``4D+1A``/`#43`"B1$`!@``$BV0(`(E
+M``(D(Q!1`$(0`@"^;@`((9`B`@(`(BX!`$!0__\R)@H`41(/_`8D)#!F```1
+M$@#P`T(P)3#"`"T@8`(```(\``!")`GX0``P``4D+2!@`@```CP``$(D"?A`
+M`"TH@`(F$%$"*Q`"`"@`O]\@`+3?&`"SWQ``LM\(`+'?``"PWP@`X`,P`+TG
+M\/^])P``O_\M&*``Z`&"E"H0H@`*`$`0+2@````I`P`C**,`@"@%`"$HA0``
+M``(\``!")`GX0`#@+*4D+2A``"T0H````+_?"`#@`Q``O2?P_[TG``"__RU`
+MP`#H`8*4*A"B``L`0!`M&````#$%`",PQ0"`,`8`(3"&`.`LQB0```(\``!"
+M)`GX0``M*``!+1A``"T08````+_?"`#@`Q``O2?`_[TG,`"__R@`M?\@`+3_
+M&`"S_Q``LO\(`+'_``"P_RV8@``MD*``+:#``.`!@R0"``(D#P"B$`L`%20#
+M`*(L!@!`$`,``B0!``(D'@"B4`@`8I1L;P`(__\#)`H`HA`$``(D#@"B4`@`
+M<91&;P`(__\#)`@`<93__S$F!0`"/"=O``C``$(T"`!QE/[_,28%``(\P`%"
+M-$AO``@EJ*("_?\Q)@`1$0`C$%$`@!`"`"$01`#D+$*,/`!`%/__`R1);P`(
+M`!$1`"TH0``,`$`0+8@````1$0`C$%$`@!`"`"$01`#D+$*,!@!`4`@`8I0!
+M`#$F*A`E`O?_0!0`$1$`"`!BE"D`(A+__P,D26\`"``1$0!M;P`(+1!@```1
+M$0`C$%$`@!`"`"&`@@#@+!`F!``"CAT`0!3__P,D+2```@```CP``$(D"?A`
+M`#P`!20-`(`6!``2K@P`%:X"``(D%``"KO__`B08``*N_P,")!P``JX*``(D
+M(``"IB(``J9K;P`(-```KC``@HXT``*N+2!@`BTH(`(```(\``!")`GX0``M
+M,(`"+1@@`BT08``P`+_?*`"UWR``M-\8`+/?$`"RWP@`L=\``+#?"`#@`T``
+MO2?@_[TG&`"__Q``LO\(`+'_``"P_RV`@`#,+(:,_P/&,-0L@HP`%`(`_P,2
+M/"004@`E,,(````1/```,28)^"`"I``%)-`L!H[_`\8PV"P"C@`4`@`D$%(`
+M)3#"`"T@``()^"`"J``%)"T@``(```(\``!")`GX0`"L``4D`/P#)"000P#<
+M+`.._P-C,"400P`M(``"K``%)`GX(`(M,$``&`"_WQ``LM\(`+'?``"PWP@`
+MX`,@`+TG\/^])P``O__H`8*4*Q"B`"$`0!`M&````!$%`",010"`$`(`(3B"
+M`.`LYR0$`.*,&@!`$"T08``$`."L`0`#)`08HP`G&`,`S"R"C"008@#,+(*L
+MT"R"C"008@#0+(*LU"R"C"008@#4+(*LV"R"C"008@#8+(*LW"R"C"088@#<
+M+(.L`@`"/-B]0B0)^$``+2C@``$``R0M$&````"_WP@`X`,0`+TGL/^])T``
+MO_\X`+?_,`"V_R@`M?\@`+3_&`"S_Q``LO\(`+'_``"P_RV0@``MF*``+:"`
+M`#02A(SH`4*6*Q"B`#P!0!`M&````!$%`",010"`$`(`(8A"`N`L,28$`"*.
+M-`%`$`$``R08`"..__\")!,`8E08`":.!0"`$*```R0"`(*4H`!",`(`0Q`?
+M``0D#P`$)`$`!B0K$,0`"0!`$("`$P!`$`8``0!&-"L0Q`#]_T`40!`&`/]O
+M``B`@!,`@(`3`$`0!2;_`\8P'``CCH`:`P`/``(\`/Q"-"088@`E,,,`%``B
+MC@`5`@#P#P,\)!!#`"4PP@````(\``!5)`GXH`(M($`"@!`%)B(`)I8`,08`
+M\`#&,"``(I8/`$(P)3#"``@``CP`($(T)3#"``GXH`(M($`"``@6)"0`(HX.
+M`$`0``$7),`(!2;_``8\___&-"0P1@`H`"*.`!8"`"4PP@`)^*`"+2!``B@`
+M(HX"`$`0`0@6)`$)%B0P`"*.#0!`4(`0$P"`*!,```FE)/\`!CS__\8T)#!&
+M```!`CPE,,(````"/```0B0)^$``+2!``H`0$P#`$$4D+``CC@\``CS__T(T
+M`P!@$"0P8@`0``(\)3#"`````CP``$(D"?A``"T@0`(P`"*.!0!`$`P`(HX@
+M`$(P`0!`5``"UC8,`"*.0`!",`4`0!`/`,(R\/\")"2PP@("`-8V#P#",@\`
+M0!`,`"*.``%",`,`0!"__P(D7G``"$``UC8DL,("#``BCH``0C`#`$`0W_\"
+M)&5P``@@`-8V)+#"`@P`(HX!``,\)!!#``0`0%`,`"*.(``"/"6XX@(,`"*.
+M@``#/"000P`!`$!4``+W-@P`(HX$``,\)!!#``<`0%0EN.,"#``BC@(``SPD
+M$$,``P!`4`P`(HXEN.,"#``BC@@``SPD$$,``0!`5`!`]S8,`"*.$``#/"00
+M0P`!`$!4);CC`@0`(XX"``(D!@!B4*(`UC8#``(D!0!B4#``(HZI<``(.``B
+MCJ=P``@E``(\%`!`%&(`UC8```(\``!#C````CP``$*,(QAB`.0OAHXC,,,`
+M```"/```0HPC,,(`@#(&`(`H$P``":4D``$"/"4PP@````(\``!")`GX0``M
+M($`"!``"/"6XX@(X`"*.`0!",`,`0!"`@!,`)``"/"6XX@+`"14F+2!``BTP
+MP`(```(\``!6)`GXP`(M**`"`!$0)BT@0`(M*``""?C``BTPX`(T`"*.&0!`
+M4`P`(HY`,!,`4`#&)"T@0`()^,`"``L%)"T@0`($"P4D"?C``C0`)HXM($`"
+M"`L%)`GXP`()``8D+2!``@```CP``$(D"?A``"THH`(`$$(T+2!``BTHH`()
+M^,`"+3!```P`(HX!`$(P!0!`$`$``B0$$&("S"R#CN!P``@E$$,`!!!B`B<0
+M`@#,+(..)!!#`,PL@JX,`"*.`0!",`4`0!`!``(D!!!B`M`L@X[M<``()1!#
+M``008@(G$`(`T"R#CB000P#0+(*N#``BC@(`0C`%`$`0`0`")`008@+4+(..
+M^G``""400P`$$&(")Q`"`-0L@XXD$$,`U"R"K@P`(HX$`$(P!0!`$`$``B0$
+M$&("V"R#C@=Q``@E$$,`!!!B`B<0`@#8+(..)!!#`-@L@JX,`"*."`!",`4`
+M0!`!``(D!!!B`MPL@XX4<0`()1!#``008@(G$`(`W"R#CB000P#<+(*N+2!`
+M`@(``CS8O4(D"?A``"TH(`(!``,D+1!@`$``O]\X`+??,`"VWR@`M=\@`+3?
+M&`"SWQ``LM\(`+'?``"PWP@`X`-0`+TG\/^])P``O_^`*`4````"/```0B0)
+M^$````BE)```O]\(`.`#$`"])_#_O2<``+__@"@%`````CP``$(D"?A````(
+MI20!``(D``"_WP@`X`,0`+TG\/^])P``O_\!``8D!#"F`````CP``$(D"?A`
+M`$`(!20!``(D``"_WP@`X`,0`+TGT/^])R``O_\8`+/_$`"R_P@`L?\``+#_
+M+9B``"V(H`"`*`4````"/```4B0)^$`"``JE)`,`4#`*```6+1```BT@8`()
+M^$`"0`@%)`$``R0$&",")!!#``$`0%0!`!`D+1```B``O]\8`+/?$`"RWP@`
+ML=\``+#?"`#@`S``O2>P_[TG0`"__S@`M_\P`+;_*`"U_R``M/\8`+/_$`"R
+M_P@`L?\``+#_+9"``"V8H``!``8D!#"F`````CP``$(D"?A``(`(!23H`Q4D
+M```"/```420```(\``!0)"T@0`()^"`"+2A@`@8`0!`M($`""?@``F0`!"3_
+M_[4F^/^@%BT@0`(```(\``!")`GX0``M*&`":`!`$"T@0`+,`4..!P`")`T`
+M8A`+``(D"P!B$`H`!"0)`&00"0`")`@`8E`MB```7`!D%"T@0`+0`4*6!`!"
+M+%D`0%"`"`4D+8@``````CP``%8D```"/```5"0!`!<\+2!``@GXP`),@`4T
+M+8!``"T@0`(`@04T"@`&/`GX@`)D`,8T@H(0`/__!C(E,-<`+2!``@GX@`+\
+M@`4T+2!``@GXP`),@`4T@A("``4`4!`M($`"`0`Q)@(`(B[I_T`4````````
+M$3P``#$F"?@@`DB`!31```,\)1!#`"T@0`)(@`4T```0/```$"8)^``"+3!`
+M`````CP``$(D"?A``,@`!"0M($`""?@@`OR`!33^_P,\__]C-"000P`M($`"
+M_(`%-`GX``(M,$``9``0)````CP``%0D```"/.)Q``@``%$D"0``$BT@0`()
+M^"`""@`$)"T@0`()^(`"+2A@`OC_0!3__Q`F+2!``@```CP``$(D"?A``$B`
+M!32__P,\__]C-"000P`M($`"+3!``````CP``$(D"?A``$B`!30M($`"@`@%
+M)````CP``$(D"?A``"TP```K$!4`0`"_WS@`M]\P`+;?*`"UWR``M-\8`+/?
+M$`"RWP@`L=\``+#?"`#@`U``O2<``*V/"`"LCPP`KH_T+X*$(4@B`4``(BT"
+M`$`4+3B@`#\`"23_#\(P`!P)`"4P0P`@`((Q!`!`$`0`HH^```(\)3#"``0`
+MHH]`%@(``!X#/"000P`E&,(``0"",00`0!`0`((Q``$"/"488@`0`((Q`@!`
+M$``@`CPE&&(`"P#CJ`@`X[@`+0@`'`"DCT`F!``4`*./0!\#`!@`HH_`%@(`
+M)2BD`"4HHP`E**(``@"",0(`0!```0(\)2BB``\`Y:@,`.6X`!0+``\``SPD
+M6$,`0`"",0$`0%0`@&LU$P#KJ!``Z[@7`.JH%`#JN/__`B0/`*(10!L-``\`
+MY(@,`.28#P`"/`#@0C0D&&(`)2"#``\`Y*@,`.2X"P#BB`@`XI@`0`,\)1!#
+M``L`XJ@(`.*X#`"",2,`0%`!``,D`'\"/`#_0C0'$,(!`0!",!T`0!`M&```
+M"P#DB`@`Y)@(`((Q`@!`%`"``SPM&```!`"",00`0%`E$(,`0``"/"488@`E
+M$(,`"P#BJ`@`XK@3`..($`#CF!``HH__?T(P)1AB`!,`XZ@0`..X%P#BB!0`
+MXI@`'0X`)1!#`!<`XJ@4`.*X`0`#)`@`X`,M$&``#P#@$``5!P`3`*.($`"C
+MF/``!#PD$$0`)1AB``"`8S03`*.H$`"CN!<`HH@4`**80!D&`"400P`7`**H
+M%`"BN`\`(!$`%@D`$P"CB!``HY@`#P0\)!!$`"488@``@&,T$P"CJ!``H[@7
+M`**(%`"BF(`:"``E$$,`%P"BJ!0`HK@-`&`1`!\+`!,`HH@0`**8)1!#``"`
+M0C03`**H$`"BN!<`HH@4`**8P!L*`"400P`7`**H%`"BN`@`X`,!``(D"P"B
+MB`@`HI@`(`,\)1!#``L`HJ@(`.`#"`"BN`H`X!``````#P"BB`P`HI@"```5
+M)1!&```00C0/`**H#`"BN-9R``@M$```#P``$2T8```+`*"H"`"@N`\`IJ@,
+M`*:X$P`BB1``(ID3`**H$`"BN!<`(HD4`"*9%P"BJ!0`HKC6<@`(+1````L`
+MHZ@(`*.X`!#"-`\`HJ@,`**X$P"CJ!``H[@7`*.H%`"CN"T0```?`**H'`"B
+MN!L`HJ@8`**X"`#@`P$``B0?`**('`"BF`$`0C"1`$`0#P`#)!\`HH@<`**8
+M_A]",$(0`@```,*D&P"BB!@`HI@"%`(``@#"I`0`P*`;`**(&`"BF`$`0C`7
+M`$`4`````!L`HH@8`**8`@!",`(`0!`!``(D!`#"H!L`HH@8`**8"`!",`0`
+M0!``````!`#"D`(`0C0$`,*@&P"BB!@`HI@$`$(P!`!`$``````$`,*0!`!"
+M-`0`PJ`?`**('`"BF$(5`@`#`$(P"P#"H/\`0S`!``(D$P!B$``````"`&(H
+M!0!`4`(``B0*`&`0`````#)S``@`````#P!B$``````#``(D$0!B$``````R
+M<P`(`````!<`HH@4`**8,7,`"!\`0C`7`**(%`"BF.`#0C`O<P`(0A$"`!<`
+MHH@4`**8`'Q","]S``B"$@(`%P"BB!0`HIC"$P(`'P!",(#_`R0E$$,`!0#"
+MH!\`HH@<`**80A,"``8`PJ`;`**(&`"BF/``0C`"$0(`!P#"H!L`HH@8`**8
+M``]",`(2`@`(`,*@"P##D`(``B02`&(0``````,`8B@&`$`0`P`")`$``B03
+M`&(0`````&-S``@`````%@!B%``````3`*.($`"CF`(>`P`/`&,P"`#"D"$0
+M0P`(`,*@$P"CB!``HY@"'0,`#P!C,`@`PI`A$$,`"`#"H!,`HX@0`*.8`AP#
+M``\`8S`(`,*0(1!#``@`PJ`;`**(&`"BF`#P0C`"$P(`"0#"H!\`HX@<`*.8
+M``$"/"088@`!`&,L`@`")",00P`*`,*@+1@```@`X`,M$&````"BC*!&@XPD
+M$$,```"BK"<0`@"@1H.,)!!#``@`X`.@1H*LX/^])Q``O_\(`+'_``"P_RV(
+M@`````(\``!")`GX0`"$+(4D+2`@`B2!!30``!`\```0)@GX``(M,```+2`@
+M`BB!!30)^``"+3```"T@(`)```4D"?@``BTP```M("`",($%-`GX``("``8\
+M+2`@`CB!!30)^``"``(&/!``O]\(`+'?``"PWP@`X`,@`+TGX/^])Q``O_\(
+M`+'_``"P_RV(@`!```4D```0/```$"8)^``"!@`&)(0L)28```(\``!")`GX
+M0``M("`"+2`@`B2!!30)^``"+3```"T@(`(H@04T"?@``BTP```0`+_?"`"Q
+MWP``L-\(`.`#(`"])RTP``!`$`8`(1!&`(`0`@`C$$8`P!`"`"$01``H,$.4
+M``"BE!<`8A`M.,``0!`&`"$01@"`$`(`(Q!&`,`0`@`A&$0`*#!BE`D`0!0H
+M,&<D``"BE"@P8J0"`**4`@#BI`0`HI`$`.*@W7,`""TXP``!`,8D0`#"+./_
+M0%1`$`8`+3@```@`X`,M$.``"`#@`R0P@HSP_[TG"`"__P``L/\M@(`````"
+M/```0B0)^$``A"R%)$@L$"8M$``""`"_WP``L-\(`.`#$`"])]#_O2<@`+__
+M&`"S_Q``LO\(`+'_``"P_RV0@``MF*``+8B``.`!@MPX$@(`/Q`"``$`0C`<
+M,(*L*#"$)````CP``$(D"?A````6!20M*```!P`.)`(`#23T`0PDR``&)&0`
+M"R0H``HD!P`))+\`"#P,_@@UOP`'/#C_YS3,`4*.!P!"+`@`0!!`$`4`(1!%
+M`(`0`@`C$$4`P!`"`"$040`?=``(,#!.H"$010"`$`(`(Q!%`,`0`@`A$%$`
+M,#!-H$`0!0`A$$4`@!`"`",010#`$`(`(2!1`#PPC*Q`,(:L1#"&K$@PBZQ0
+M,(JL3#")K#`P@B0$`$"@!0!`H#`P@Y`"`$.@`P!`H!PP(HX#`$`0`0"E)&PP
+MB*QP,(>L0`"B+-?_0%3,`4*.'#`BCA``0!!D``(D+2!``BR!!30``!`\```0
+M)@GX``)L,":.+2!``C2!!30)^``"<#`FC@```CP``$(D"?A``"T@0`)D``(D
+M!`!@$B`P(JX8,"*.4W0`"`$`0C08,"*._O\#)"000P`8,"*N(`"_WQ@`L]\0
+M`++?"`"QWP``L-\(`.`#,`"])^#_O2<0`+__"`"Q_P``L/\<,(*,#@!`$"V(
+M@`````(\``!")`GX0````!`\+2`@`BR!!30``!`F"?@``BTP```M("`"-($%
+M-`GX``(M,```$`"_WP@`L=\``+#?"`#@`R``O2>0_[TG:`"__V``MO]8`+7_
+M4`"T_T@`L_]``++_.`"Q_S``L/\MF(``+:"``"0PE8P'`*(LU@%`$"T8``"`
+M$`4````#/'A<8R0A$$,```!"C`@`0```````+;#```4`PBS+`4`0+1@`````
+M$CP``%(F"?A``E"8!30/\`,\__]C-"000P"`B!8`(8@S`BA&(XX`'0,`\`\$
+M/"089``E$$,`+2!@`E"8!30``!`\```0)@GX``(M,$``+2!@`@GX0`)<F`4T
+M?X`#)"000P!01B..P!D#`(!_8S`E$$,`+2!@`ER8!30)^``"+3!``"T@8`()
+M^$`"7)@%-,#_`SS_?V,T)!!#`#Q&)([`(P0`/P`#/`"`8S0D((,`)1!$`"T@
+M8`)<F`4T"?@``BTP0``M(&`""?A``EB8!30#_`,\__]C-"000P!D1B..@!P#
+M`/P#!#PD&&0`)1!#`"T@8`)8F`4T"?@``BTP0``)`**2*Q!6``4`0%`)`**2
+M2"QBC@$`0B3<=``(2"QBKBL0P@)_`4!0"0"VHDPL8HX!`$(D3"QBKE=V``@)
+M`+:B```"/!!<0B0'`$-H``!#;`<`H[,``*.W```"/!A<0B0'`$-H``!#;`\`
+MH[,(`*.W```"/"!<0B0'`$-H``!#;!<`H[,0`*.W```"/"A<0B0'`$-H``!#
+M;!\`H[,8`*.W```"/#!<0B0'`$-H``!#;"<`H[,@`*.W```"/#A<0B0'`$-H
+M``!#;"\`H[,H`*.W*[`&`"T@8`(```(\``!2)`GX0`)LF`4TX/\#//\_8S0D
+M$$,`@(`6`"&`'0(```2.@",$`!\``SP`P&,T)""#`"401``M(&`"+3!`````
+M`CP``%$D"?@@`FR8!30M(&`""?A``FR8!30?\`,\__]C-"000P`(``..0!T#
+M`.`/!#PD&&0`)1!#`"T@8`)LF`4T"?@@`BTP0``M(&`""?A``FB8!30!_P,\
+M__]C-"000P`0``..0!P#`/X`!#PD&&0`)1!#`"T@8`)HF`4T"?@@`BTP0``M
+M(&`""?A``FB8!33_@`,\__]C-"000P`8``..`!X#``!_!#PD&&0`)1!#`"T@
+M8`)HF`4T"?@@`BTP0``M(&`""?A``FB8!33@_P,D)!!#`"```XX?`&,P)1!#
+M`"T@8`)HF`4T"?@@`BTP0``M(&`""?A``FR8!33_P`,D)!!#`"@``XX`&@,`
+M`#]C,"400P`M(&`";)@%-`GX(`(M,$``"@#`$BT@8`()^$`";)@%-`$`0C0M
+M(&`";)@%-`GX(`(M,$``=W4`"`$`PRX```(\``!")`GX0`!LF`4T_O\#)"00
+M0P`M(&`"+3!``````CP``$(D"?A``&R8!30!`,,N#`"BDM\`8A`!``,D!0#`
+M4EPL@HY8+(*.`0!")()U``A8+(*N`0!")%PL@JX!`,(N5W8`"`P`HJ(```(\
+M0%Q")`<`0V@``$-L!P"CLP``H[<K@`8`+2!@`@```CP``$(D"?A```BB!33`
+M_P,D)!!#`(`8$``A&'T```!CC#\`8S`E$$,`+2!@`BTP0`````(\``!")`GX
+M0``(H@4T#0"BDK@``A(!``,D!0``4F0L8HY@+&*.`0!")*EU``A@+&*N`0!"
+M)&0L8JY7=@`(#0"PH@```CQ(7$(D!P!#:```0VP(`$2,!P"CLP``H[<(`*2O
+M+8#```,`PBRB`$`0+1@``"T@8`(```(\``!")`GX0`!8F`4T_/\#//\/8S0D
+M$$,`@!@0`"$8?0```&2,`",$``,``SP`\&,T)""#`"401``M(&`"+3!`````
+M`CP``$(D"?A``%B8!30+`**2*Q!0``4`0%`+`**2:"QBC@$`0B3;=0`(:"QB
+MKBL0`@*``$!0"P"PHFPL8HX!`$(D;"QBKE=V``@+`+"B```"/%A<0B0'`$-H
+M``!#;`\`1&@(`$1L%P!%:!``16P?`$=H&`!';`<`H[,``*.W#P"DLP@`I+<7
+M`*6S$`"EMQ\`I[,8`*>W+8#```@`PBQF`$`0+1@``"T@8`(```(\``!")`GX
+M0``DF04T`?\#)"000P"`&!``(1A]````8XQ`&`,`_@!C,"400P`M(&`"+3!`
+M`````CP``$(D"?A``"29!30*`**2*Q!0``4`0%`*`**24"QBC@$`0B04=@`(
+M4"QBKBL0`@)'`$!0"@"PHE0L8HX!`$(D5"QBKE=V``@*`+"B%0#`%!@P@HS]
+M_P,D)!!#`!@P@JP```(\``!")`GX0``````````"/```0B0)^$``+2!@`O_^
+M`R0D$$,`+2A``````CP``$(D"?A``"T@8`)8=@`(`0`#)`(`0C`J`$`4`0`#
+M)!PP@HP:`$`0```"/```0B0)^$`````0//_^`R0D$$,`+2A``````CP``$(D
+M"?A``"T@8`(M(&`"+($%-```$"8)^``";#!FCBT@8`(T@04T"?@``G`P9HX`
+M``(\``!")`GX0``M(&`"578`"!@P@HX``$(D"?A``````````4(T+2A`````
+M`CP``$(D"?A``"T@8`(8,(*.`@!"-!@P@JX!``,D+1!@`&@`O]]@`+;?6`"U
+MWU``M-](`+/?0`"RWS@`L=\P`+#?"`#@`W``O2?0_[TG(`"__Q@`L_\0`++_
+M"`"Q_P``L/\MD(``)#"1C!``(*X<,(*,*@!`$"V8@``4`"..P``"/"L00P`#
+M`$`0P``"/'AV``A$`""N(Q!#`$0`(JX<`"..P``"/"H00P`#`$`0P``"/(%V
+M``A(`""N(Q!#`$@`(JXM($`"+($%-```$#P``!`F"?@``D0`)HXM($`"-($%
+M-`GX``)(`":.+2!``C"!!30)^``"`@`&/"T@0`(X@04T"?@``@`"!CR$+&4F
+M```"/```0B0)^$``+2!``CP`(*Y``""N(`"_WQ@`L]\0`++?"`"QWP``L-\(
+M`.`#,`"])^#_O2<0`+__"`"Q_P``L/\MB(``&#""C`,`0C`#``,D60!#%#02
+MA8PD,)","0`&D@0`PBP$`$!0"@`&D@$`QB3_=@`(`0`%)`@``I(K$,(`!`!`
+M4)@L@XP!`,8D_W8`"`4`!21_`&(P0`!"+`0`0%28+(*,?P!C),)V``C"&0,`
+MPAD"`"@``HXJ$$,`$`!`4"0``HX,``*2&@!`5`L`!I(M("`"`@`%)```$#P`
+M`!`F"?@``BTP```M("`"!0`%)`GX``(M,```!'<`"!``O]\J$$,`$@!`$```
+M`CP,``*2"`!`4`L`!I(M("`"`@`%)````CP``$(D"?A```$`!B0+``:2`@#"
+M+"``0!`0`+_?`0#&)"T@(`+_=@`(!``%)```0B0)^$``+2`@`O[_0B0"`$(L
+M%0!`$!``O]\,``*2"`!`5`L``I(M("`"`@`%)````CP``$(D"?A``"TP```+
+M``*2"0!`$!``O]\M("`"!``%)"TP``````(\``!")`GX0```````$`"_WP@`
+ML=\``+#?"`#@`R``O2?@_[TG$`"__P@`L?\``+#_+8"``!@P@HP#`$(P`P`#
+M)"X`0Q0T$H6,)#"1C`D`)I($`,(L!`!`4)@L@XP!`,8D.W<`"`$`!21_`&(P
+M0`!"+`0`0%28+(*,?P!C)")W``C"&0,`PAD"`"0`(HXJ$$,`"0!`$````CP+
+M`":2`@#"+!<`0!`0`+_?`0#&)"T@``([=P`(!``%)```0B0)^$``+2```O[_
+M0B0"`$(L#`!`$!``O]\+`"*2"@!`$`@`L=\M(``"!``%)"TP``````(\``!"
+M)`GX0```````$`"_WP@`L=\``+#?"`#@`R``O2?0_[TG(`"__Q@`L_\0`++_
+M"`"Q_P``L/\MB(``+8"@`"V8@``"``(\\,Y")`GX0``T$H6,0!@"`"$88@"`
+M&`,`(QAB`,`8`P`AD","*#!2)B0P,J[<`2..`0`")`,`8A08,"*.87<`"`(`
+M0C3]_P,D)!!#`!@P(J[<`2..`0`")"D`8A`M("`">"QBC@$`0B1X+&*N`0`%
+M)```$#P``!`F"?@``BTP```M("`"!0`%)`GX``(M,```+2`@`@0`!20)^``"
+M+3```"T@(`("``4D"?@``BTP```M("`"`P`%)`GX``(M,``````"/```0B0)
+M^$``+2`@`@`!0C0M*$`````"/```0B0)^$``+2`@`@(``CR,V4(D"?A``"T@
+M(`+M=P`((`"_WQ@P(HX#`$(P`P`#)%L`0Q0@`+_?%P``$BT@(`()`$:2```0
+M/```$"8)^``"`0`%)`H`1I(M("`""?@``@4`!20,`$:2`0#&+"T@(`()^``"
+M`@`%)`T`1I(M("`""?@``@,`!20+`$:2+2`@`K]W``@$``4D`0`%)```$#P`
+M`!`F"?@``@0`!B0(`$:2+2`@`@GX``(%``4D+2`@`@(`!20)^``"`0`&)"T@
+M(`(#``4D"?@``@$`!B0M("`"!``%)`(`!B0)^``"`````!PP8HX<`$`0`@`"
+M/````CP``$(D"?A``"T@(`+__@,D)!!#`"TH0`````(\``!")`GX0``M("`"
+M`@`"/(S90B0)^$``+2`@`BT@(`(P@04T```0/```$"8)^``"`@`&/"T@(`(X
+M@04T"?@``@`"!CSM=P`((`"_WXS90B0)^$``+2`@`@```CP``$(D"?A``"T@
+M(`(``4(T+2A``````CP``$(D"?A``"T@(`(@`+_?&`"SWQ``LM\(`+'?``"P
+MWP@`X`,P`+TGT/^])R``O_\8`+/_$`"R_P@`L?\``+#_+9"``"V(H``MF(``
+M)($%-```$#P``!`F"?@``BTP```M($`"*($%-`GX``(M,```A"Q%)@```CP`
+M`$(D"?A``"T@0`('`")J```B;@@`(XZ?+$*RF"Q"MJ`L0ZXM($`"```0/```
+M$"8)^``"+($%-"V(0``M($`""?@``C2!!30M*$``P``#/"00(P(#`$,0)!"C
+M`"D`0Q0@`+_?)#!PCD0`!(XC("0"/``"CB,0@@!P+&..(1!#`'`L8JX\``2N
+M2``$CB,@I`!```*.(Q""`'0L8XXA$$,`="QBKD``!*X\``..%``"CBL00P`&
+M`$!00``#C@(``CR$VD(D"?A``"T@0`)```..'``"CBL00P`&`$`0`@`"/`(`
+M`CP@W$(D"?A``"T@0`("``(\C-E")`GX0``M($`"(`"_WQ@`L]\0`++?"`"Q
+MWP``L-\(`.`#,`"])_#_O2<(`+__``"P_RV`@``%`*.0$0`")`\`8A0D,(:,
+M/`#"C`$`0B0\`,*L<"R"C`$`0B1P+(*L/`##C!0`PHPK$$,`&P!`$`@`O]\"
+M``(\='@`"(3:0B09``(D%0!B%`@`O]]``,*,`0!")$``PJQT+(*,`0!")'0L
+M@JQ``,.,'`#"C"L00P`+`$!0``"PWP(``CP@W$(D"?A````````"``(\C-E"
+M)`GX0``M(``""`"_WP``L-\(`.`#$`"])_#_O2<``+__F"R#C'\`8C!``$(L
+M!`!`%"0PA8Q_`&,DBG@`",(9`P"8+(*,PAD"`"@`HHPJ$$,`$`!`5`H`II`D
+M`**,*A!#``<`0%`+`*:0#`"BD`0`0%`+`*:0`@`%)*9X``@!``8D!`#`4`H`
+MII#__\8DIG@`"`0`!20$`,!0"0"FD/__QB2F>``(!0`%)`@`P!```+_?___&
+M)`$`!20```(\``!")`GX0`````````"_WP@`X`,0`+TGT/^])R``O_\8`+/_
+M$`"R_P@`L?\``+#_+8B`````$#P``!`F"?@``NR`!30MF$``+2`@`@GX``+P
+M@`4T+9!``"T@(`()^``"^(`%-"TP0``D,"6..`"BC`4`0!`M&```*Q#"``8`
+M0%`X`*2,+1@``'PL(HX!`$(DW'@`"'PL(JXC(,0`-`"CC",80P(P`**,(Q!B
+M`B,8@P`C&&(`4U\"/"DY0C0<`&(`$A```#\0`@"#$P(`PQ\#`",80P`X`*:L
+M,`"SK#0`LJPM$&``(`"_WQ@`L]\0`++?"`"QWP``L-\(`.`#,`"])\#_O2<P
+M`+__*`"U_R``M/\8`+/_$`"R_P@`L?\``+#_+9"``"0PD8P'`*)H``"B;`@`
+MHXR?+(*PF"R"M*`L@ZRM`"`2+9B```(``CRTXD(D"?A````````(`$$$+8!`
+M`(`L0HX!`$(D@"Q"K@(``CR,V4(D"?A``"T@0`(0`"*.(1`"`A``(JX<,&*.
+M1`!`4!@P0HZ$+&4F```"/```0B0)^$``+2!``BT@0`(``!`\```0)@GX``(L
+M@04T+:!``"T@0`()^``"-($%-"VH0`!$`"*.*Q""`@8`0%1$`":.2``BCBL0
+MH@(=`$!01``DCD0`)HXK$(8""P!`4$@`)HXM($`"```0/```$"8)^``"+($%
+M-"T@0`(P@04T"?@``@(`!CQ(`":.*Q"F`G,`0%`P`+_?+2!``@``$#P``!`F
+M"?@``C2!!30M($`".($%-`GX``(``@8\IGD`"#``O]\C((0"/``BCB,0@@!P
+M+&..(1!#`'`L8JX\`"2N2``DCB,@I`)``"*.(Q""`'0L8XXA$$,`="QBKD``
+M)*X8,$*.`P!",`,``R14`$,4,`"_WR`P8XZ`$`,`(1!#`!``)(XK$$0`'P!`
+M4!``(XX8`"*.&`""`!(0```\$`(`/A`"`&(0!3S33:4T'`!%`!(0``"^$0(`
+M/``CCBL00P`[`$`4`@`"/"``(HX8`((`$A```#P0`@`^$`(`'`!%`!(0``"^
+M$0(`0``CCBL00P`O`$!4`@`"/"T@0`("``(\GWD`"/CA0B0@,&*.*Q!#`"L`
+M0!`P`+_?%``BCA@`8@`2$```/!`"`#X0`@!B$`,\TTUC-!P`0P`2$```OA$"
+M`#P`(XXK$$,`!0!`4!``(HXM($`"`@`"/)]Y``B$VD(D'``CCA@`0P`2$```
+M/!`"`#X0`@!B$`,\TTUC-!P`0P`2$```OA$"`$``(XXK$$,`"P!`$#``O]\M
+M($`"`@`"/"#<0B0)^$````````(``CR,V4(D"?A``"T@0`(P`+_?*`"UWR``
+MM-\8`+/?$`"RWP@`L=\``+#?"`#@`T``O2<T$H*,``!"E```HJ0T$H.,!`!B
+MD`@`0C0$`&*@!`"BD`@`0C0$`**@-!*"C`(`0I0"`**D-!*"C`0`0I`$`**@
+M-!*"C`4`0I`%`**@"`#@`RT0``"P_[TG0`"__S@`M_\P`+;_*`"U_R``M/\8
+M`+/_$`"R_P@`L?\``+#_+9"``"V@H``ML,``+8#@`"V(``````(\F%Q3)```
+M`CP``%4D```"/```5R1`$!$`(1!1`,`8`@`A&',`0!`"`"$05`"`$`(`(1!3
+M`"T@0`(``&6,"?B@`@``1HP!`!`F/P`",@0`0%0!`#$F"?C@`@$`!"0!`#$F
+M#@`B+NS_0!1`$!$`+8@``````CSH750D```"/```4R0```(\``!5),`0$0`A
+M$%0`+2!``@``18P)^&`"!`!&C`$`$"8_``(R!`!`5`$`,28)^*`"`0`$)`$`
+M,29(`"(N\O]`%,`0$0`MB``````"/,!A4R0```(\``!4)````CP``%4D0!`1
+M`"$040"`&`(`(1AS`"$05@"`$`(`(1!3`"T@0`(``&6,"?B``@``1HP!`!`F
+M/P`",@0`0%0!`#$F"?B@`@$`!"0!`#$F0``B+NW_0%1`$!$`0`"_WS@`M]\P
+M`+;?*`"UWR``M-\8`+/?$`"RWP@`L=\``+#?"`#@`U``O2?0_[TG*`"__R``
+MM/\8`+/_$`"R_P@`L?\``+#_+:"``"V8H````*64```"/```0B0)^$```@!F
+ME@`4`@`#)`(``@!BEH``0C`E`$`0+8"``$"`!``A@`0"@(`0`````CPT:$(D
+M(8`"`@0`!(X```(\``!")`GX0``(``4D_P!2,$"1$@````*.`!$"`"600@((
+M`!"&+2"``@```CP``$(D"?A```2B!30M($````!CEK0)`B0#`&(0$`"&-.__
+M!B0D,(8`+2"``@```CP``$(D"?A```2B!31F>@`(D0`"*BV0``"1``(J!`!`
+M$.C_!"8!``(R"`!`4,(7!`````(\``!")`GX0``(``4D_P!1,'IZ``@!``(D
+M(2""`$,@!`````(\``!")`GX0``(``4D_P!1,"T0``"`B!$`0!`"`"6((@(!
+M!#$V_P!&,@`R!@#_`"(R)3#"`"T@@`(``!`\```0)@GX``*<F`4T`HH1``#_
+M1C+_`"(R)3#"`"T@@`()^``"T)@%-#02DZX!``(D*`"_WR``M-\8`+/?$`"R
+MWP@`L=\``+#?"`#@`S``O2<(`*(L%`!`$.POA(R`$`4````#/'AI8R0A$$,`
+M``!"C`@`0```````"`#@`RT0@``(`.`#1`"")`@`X`-(`((D"`#@`TP`@B0(
+M`.`#4`"")`@`X`.4`((D"`#@`RT0``!0_[TGJ`"__Z``OO^8`+?_D`"V_X@`
+MM?^``+3_>`"S_W``LO]H`+'_8`"P_RV0@``M\*``___4,"VX@``"`**4\`%#
+M,,```B1)`&(0+8@``,$`8B@&`$`00`$")*```B0V`&)09!."E%A\``@M$```
+M`P!B$%`!`B2)`6(4+1``````PI=?\$(D__]",.L$0BP%`$!0``#"EU03XI98
+M`**O\GH`"%83XI9TZT(D__]",/``0BP%`$!0``#"EU@3XI98`**O\GH`"%H3
+MXI:$ZD(D__]",.$`0BP%`$!0``#"EUP3XI98`**O\GH`"%X3XI9=%D(L!@!`
+M5%P`H*]@$^*66`"BKV(3XI;U>@`(7`"BKU@`H*\MF```+2@``-@2XI9(`**O
+MWA+BEDP`HJ\!`$(L4`"BKQE[``@L$^*66`"BKV83@I1<`**O;!.%E'`3DY3:
+M$H*42`"BK^`2@I1,`**O`0!"+%``HJ\9>P`(+A."E&@3@I18`**O:A."E%P`
+MHJ]N$X64<A.3E-P2@I1(`**OXA*"E$P`HJ\!`$(L4`"BKS`3@I14`**O+8``
+M`````CPH8$0D@!@0`"$8?0!`$!``(1!0`$`0`@`A$%0`@!`"`"$01````$*,
+M``!BK`$`$"81``(N]/]`%(`8$``"`,*7@`!",`\`0!`M@```+2"@`P,`!B1W
+M``<D```0/```$"8)^``"+4```"T@H`,M*&`"`P`&)'H`!R0)^``"+4```"V`
+M``````(\*&!5)````CP``%,D```"/```5B1`$!``(1!0`,`0`@`A$%4`@!@0
+M`"$8?0`M($`"``!%C`GX8`(``&:,`0`Q)C\`(C($`$!4`0`0)@GXP`(!``0D
+M`0`0)A$``B[N_T`40!`0`"V```````(\P&15)````CP``%,D```"/```5B3`
+M$!``(1!5`"T@0`(``$6,"?A@`@0`1HP!`#$F/P`B,@0`0%0!`!`F"?C``@$`
+M!"0!`!`F\_\`$L`0$``M@``````"/,AD4R0```(\``!5)````CP``%8D0!`0
+M`"$04`#`&`(`(1AS`$`0`@`A$%0`@!`"`"$04P`M($`"``!EC`GXH`(``$:,
+M`0`Q)C\`(C($`$!4`0`0)@GXP`(!``0D`0`0)NW_`!)`$!``+8```````CS@
+M9%,D```"/```520```(\``!6)$`0$``A$%``P!@"`"$8<P!`$`(`(1!4`(`0
+M`@`A$%,`+2!``@``98P)^*`"``!&C`$`,28_`"(R!`!`5`$`$"8)^,`"`0`$
+M)`$`$";M_P`20!`0`"V```````(\^&1$)(`8$``A&'T`0!`0`"$04`!`$`(`
+M(1!4`(`0`@`A$$0```!"C```8JP!`!`F$0`"+O3_0!2`&!```@#"ET`!0C!`
+M`0,D#P!#%"T@H`/,$^66`0`&)#,`!R0``!`\```0)@GX``(#``@DSA/EEBT@
+MH`,!``8D+0`')`GX``(#``@D+2"@`U``I8\!``8D7P`')```$#P``!`F"?@`
+M`BU````M(*`#2`"ECP0`!B1@``<D"?@``BU````M(*`#6`"ECP,`!B1H``<D
+M"?@``BU````M(*`#7`"ECP,`!B1K``<D"?@``BU````M@``````"//AD520`
+M``(\``!3)````CP``%8D0!`0`"$04`#`$`(`(1!5`(`8$``A&'T`+2!``@``
+M18P)^&`"``!FC`$`,28_`"(R!`!`5`$`$"8)^,`"`0`$)`$`$"81``(N[O]`
+M%$`0$``M@``````"/)!F1"2`&!``(1A]`$`0$``A$%``0!`"`"$05`"`$`(`
+M(1!$````0HP``&*L`0`0)@@``B[T_T`4@!@0`"T@H`-4`*6/!@`&)!T`!R0`
+M`!`\```0)@GX``(M0```+2"@`TP`I8\!``8D!``')`GX``(M0````@#"AP4`
+M0`0"`,*7`$!",!L`0!`M@````@#"EP!`0C`"`$`4$``3)!\`$R0M(*`#'P`%
+M)`4`!B03``<D```0/```$"8)^``"+4```"T@H`,M*&`"!0`&)!@`!R0)^``"
+M+4```"T@H`,#``4D`@`&)#$`!R0)^``"+4```"V```````(\D&94)````CP`
+M`%,D```"/```521`$!``(1!0`,`0`@`A$%0`@!@0`"$8?0`M($`"``!%C`GX
+M8`(``&:,`0`Q)C\`(C($`$!4`0`0)@GXH`(!``0D`0`0)@@``B[N_T`40!`0
+M`,0OX*X!``(DJ`"_WZ``OM^8`+??D`"VWX@`M=^``+3?>`"SWW``LM]H`+'?
+M8`"PWP@`X`.P`+TG__^$,/__I3#__\8P___G,/__"#$8`.@`$A```"4`0!`M
+M&```(P#%$"T8X``C&(4`0!`#`"$00P#`$`(`(1!#`(`0`@`C&,4`&@!#`!(0
+M```!`&!0#0`'```4`@`#)`(`%`"`!"T8X`!E`((H$0!`$"T8``$8`(@`$A@`
+M`&0``B0C$$0`&`!'`!(0```A&&(`ZU$"/!^%0C0<`&(`$A```#\0`@!#$0(`
+MPQ\#`",00P#__T,P"`#@`RT08`"0_KTG:`&__V`!OO]8`;?_4`&V_T@!M?]`
+M`;3_.`&S_S`!LO\H`;'_(`&P_RVHX``MH(``&`&@KP(`XI3P`4,PT``")!\`
+M8A`_`!XDT0!B*`D`0!!0`0(DH``")!0`8E#P%8*4P``")!<`8E#P%8*6HGT`
+M""T0```(`&)0YA."EE$!8B@"`$!00`D")$`!`B3J`&)4+1```.83@I8,`:*G
+MTA.")@@!HJ_)?``(Z!.")@P!HJ?X%8(D"`&BK\E\``BN%H(D\!6"E@P!HJ?R
+M%8(F"`&BKQ(6@B80`:*O"`&W)RT@H`,```(\``!")`GX0``(`04D"`"V)X@`
+MLR<!`!`D+8@``$`0$0`A$%8```!0I`$`$"9```(J^O]`%`$`,28&`+&G`0`"
+M)`(`HJ<_``(D!`"BI___(C(0`$`0+8@```(``CRX]E(D0!`1`"&`4P```*26
+M(1!6````190)^$`"+3#@`@```J8!`#$F!@"BERH0(@+U_T`40!`1````9H8&
+M`*.70!`#`"$04P#^_T>$'`!@$"V(``!`$!$`(1!3````0X0J$,,`!0!`%`8`
+MHI<M,&``__\B,A@!HJ\&`**7(Q!1`/__0B3__U`P#0``$D`0$``A(%,`_O^#
+MA```@H0J$$,``@!`$```A93^_X6D`0`Q)@8`HI<J$"("Y_]`%$`0$0`&`**7
+M#@!`$"V(```M($``0!`1`"$04P```$.$*A#C``0`0%`!`#$F+3A@`/__/C(!
+M`#$F*A`D`O;_0!1`$!$`&0##).M1!#P?A80T'`!D`!(0```_$`(``Q$"`,,?
+M`P`C$$,`0!@"`"$88@#`&`,`(1AB`$`<`P`#C`,`+8```"T0(`(<`$0`$A``
+M`#\0`@`#$0(`PQ\#`",00P`!`$(D$P!`&"V0```2$```/Q`"``,1`@##'Q$`
+M(Q!#``$`1"0M$$`"`0!#)O__<C!X1H..0!`"`"$00P`8`:./``!#I`$`$"8J
+M$`0"]O]`%"T00`(&`**70!`"`"$04P#^_T*$*A`B`CT`0!`M@```0`!"+CH`
+M0!`"``(\D/%5)#(`(B8`%`(``XP"``8`HI=`$`(`(1!3`/[_0H0J("(""@"`
+M$$`0$``A$%,```!#A",8(P("`$*$(Q`B`A@`8@`2&```]O]@7`$`$";__R0R
+M0!`0`"$84P```&64`@!FE"$05@```$>40#@'`/__YS`"`$B40$`(``GXH`+_
+M_P@Q`0!")/__0C!X1H..0"`2`"$8@P!"$`(```!BI'A&@HXA(((```""E"L0
+MP@,!`$!4``">I`$`0B;__U(P!@"BET`0`@`A$%,`_O]"A"H0(@(#`$`00`!"
+M+LK_0!0R`"(F0`!"+@P`0%#T+X"F>$:#CD`0$@`A$$,`_O]#E```0Z0!`$(F
+M__]2,$``0B[X_T!4>$:#CO0O@*8!``(D:`&_WV`!OM]8`;??4`&VWT@!M=]`
+M`;3?.`&SWS`!LM\H`;'?(`&PWP@`X`-P`;TGD/^])V``O_]8`+?_4`"V_T@`
+MM?]``+3_.`"S_S``LO\H`+'_(`"P_RVHP`#__Y<P__^V,"T@X`(M*,`"`@`"
+M/$3X0B0)^$``+3B@`T0`0!0``**7!`"FEBT@X`(``*6.`@"G)P```CP``$(D
+M"?A```0`J"<"`*67+2#``BTPH`(&`*<G`@`0/,CX$"8)^``""`"H)P0`I9<M
+M(,`"+3"@`@H`IR<)^``"#`"H)P(`I)<&`*67#@"S)RTPH`("`!`\1/@0)@GX
+M``(M.&`"`@"DEP@`I9<0`+(G+3"@`@GX``(M.$`"!@"EEP@`II<.`*>7$`"H
+MEP(`$3R0\3$F"?@@`BT@P`(MH$``!`"DEPH`I9<M,*`""?@``BTX8`($`*27
+M#`"EERTPH`()^``"+3A``@H`I9<,`*:7#@"GEQ``J)<)^"`"+2#``@(`I9<$
+M`*:7+2#@`BTX@`()^"`"+4!``&``O]]8`+??4`"VWT@`M=]``+3?.`"SWS``
+MLM\H`+'?(`"PWP@`X`-P`+TG__^$,/__I3`(`,B,!`#"E!H`0!`M4``````"
+ME1,`1%0!`$HE"``#)08``I4.`$`0+4@`````8I0'`$54`0`I)4`0"0`A$$@`
+M'@!"E```XJ0(`.`#`0`")`8``I4J$"(!]/]`%`(`8R0!`$HE!`#"E"H00@'H
+M_T`4-``()0@`X`,M$```\/^])P``O____X0P__^E,`@`PXP$`,*4+4A```<`
+M0!`M,`````!BE`0`11`!`,8D*A#)`/O_0!0T`&,D"`!E)````CP``$(D"?A`
+M``8`9I0``+_?"`#@`Q``O2?P_[TG"`"__P``L/\M@(``>$:$C`<`@%#L+P2.
+M```"/```0B0)^$```````'A&`*[L+P2.!P"`$`@`O]\```(\``!")`GX0```
+M````["\`K@@`O]\``+#?"`#@`Q``O2<(`.`#`0`")"T@`````*.4```"/)AI
+M0I0K$$,`"@!`%"TH8`````(\F&E#)`$`A"2`$`0`(1!#````0I0K$$4`^_]`
+M4`$`A"2`$`0````#/)AI8R0A$$,`"`#@`P(`0H3@_[TG$`"__P@`L?\``+#_
+M+8B@`"V`@`````(\``!")`GX0`"T``0D"0!`$.PO`JZ```(D?$8"K@```CP`
+M`$(D"?A``(``!"0%`$`4>$8"K@(``B0``"*NJGX`""T0```"``(\)/E")*@L
+M`JX"``(\#.=")*PL`JX"``(\8.I")+`L`JX"``(\L.A")+0L`JX"``(\P.I"
+M)+@L`JX"``(\3/)")+PL`JX"``(\A/E"),`L`JX"``(\C/E"),0L`JX!``(D
+M$`"_WP@`L=\``+#?"`#@`R``O2>P_[TG0`"__S@`M_\P`+;_*`"U_R``M/\8
+M`+/_$`"R_P@`L?\``+#_+9"``"V@H``ML,``+8#@`"V(``````(\R&E3)```
+M`CP``%4D```"/```5R1`$!$`(1!1`,`8`@`A&',`0!`"`"$05`"`$`(`(1!3
+M`"T@0`(``&6,"?B@`@``1HP!`!`F/P`",@0`0%0!`#$F"?C@`@$`!"0!`#$F
+M$``B+NS_0!1`$!$`+8@``````CQ(:U0D```"/```4R0```(\``!5),`0$0`A
+M$%0`+2!``@``18P)^&`"!`!&C`$`$"8_``(R!`!`5`$`,28)^*`"`0`$)`$`
+M,29%`"(N\O]`%,`0$0`MB``````"/'!M4R0```(\``!4)````CP``%4D0!`1
+M`"$040"`&`(`(1AS`"$05@"`$`(`(1!3`"T@0`(``&6,"?B``@``1HP!`!`F
+M/P`",@0`0%0!`#$F"?B@`@$`!"0!`#$F0``B+NW_0%1`$!$`0`"_WS@`M]\P
+M`+;?*`"UWR``M-\8`+/?$`"RWP@`L=\``+#?"`#@`U``O2?`_[TG,`"__R@`
+MM?\@`+3_&`"S_Q``LO\(`+'_``"P_RV@@``MF*``+:@`````I93`$J(L2`!`
+M$"V```!P]Z0D9F8&/&=FQC0<`(8`$A```#\0`@!#$`(`PQ\$`",00P"`&`(`
+M(1AB``H`@U0``&660!`%`.#N4B0<`$8"$A```#\0`@"#$`(`PQ\2`%-_``@C
+MD$,`4/>D)&9F!CQG9L8T'`"&`!(0```_$`(`0Q`"`,,?!``C$$,`@!@"`"$8
+M8@#"`(,4+1```$`0!0"@[E(D'`!&`A(0```_$`(`@Q`"`,,?$@`CD$,``0`5
+M)("0$@#_`%(R+2!``@```CP``$(D"?A```@`!20MD$``+2"``@```CP``$(D
+M"?A```2B!30M($````!CEK0)`B0#`&(0$`"&-.__!B0D,(8`+2"``@```CP`
+M`$(D"?A```2B!33Y?P`(`(D2````9);__X,PS,P"-#@4`@#-S$(T'`!B`!(8
+M``"^&`,`@!`#`"$00P`C$((`__]",`(``R0=`$,4__^",#P5@BP:`$`0__^"
+M,```8I;^_T(D__]",(`8`@`A&&(`0!@#`/__`CR`1$(T(1AB`.M1!#P?A80T
+M'`!D`!(@```_(`0`PR`$`,,?`P`C((,``0"$)```$#P``!`F"?@``@@`!20M
+MD$``]7\`""T@``#,S`,T.!P#`,W,8S0<`$,`$A```#X1`@"`&`(`(1AB`(`8
+M`P`C&(,`__]C,!4`8%0``&26`!2"+!(`0%0``&260.V")&9F!#QG9H0T'`!$
+M`!(@```_(`0`PR`$`,,7`@`C(((`@"`$````$#P``!`F"?@``@@`!20MD$``
+M]7\`"`,`!"3__X(PS,P#-#@<`P#-S&,T'`!#`!(0``#^$`(`@!@"`"$88@!`
+M&`,`(QB#`/__8S`2`&!4``!DED#M@B1F9@0\9V:$-!P`1``2(```/R`$`(,@
+M!`##%P(`(R""`$`@!````!`\```0)@GX``((``4D+9!``/5_``@"``0D__^"
+M,,S,`S0X'`,`S<QC-!P`0P`2$```OA`"`(`8`@`A&&(`(QB#`/__8S`F`&`4
+M+1```$#M@B1F9@0\9V:$-!P`1``2(```/R`$`$,@!`##%P(`(R""````$#P`
+M`!`F"?@``@@`!20MD$```0`$)`GX``("``4D+8!```")$@"`$!``)8@B`D`0
+M%0`EB"("`1`Q-O\`)C(M((`"```0/```$"8)^``"G)@%-`**$0!_`"8R+2"`
+M`@GX``+8F`4T-!*3K@$``B0P`+_?*`"UWR``M-\8`+/?$`"RWP@`L=\``+#?
+M"`#@`T``O2<(`*(L$@!`$.POA(R`$`4````#/*!U8R0A$$,```!"C`@`0```
+M````"`#@`RT0@``(`.`#!`"")`@`X`,(`((D"`#@`PP`@B0(`.`#K`"")`@`
+MX`,M$```D/^])V@`O_]@`+[_6`"W_U``MO](`+7_0`"T_S@`L_\P`++_*`"Q
+M_R``L/\MH(``+;"@````IZ___]4P+;B```@`H*\,`*"O$`"@KQ0`H*_L+Y*,
+M$"R>)`(`HI3P`4,PT``")#\`8A`MF```T0!B*`D`0!!0`0(DH``")#,`8E!L
+M$X*4P``")#<`8E!N$^*6.8(`""T0```&`&(040%B*`(`0%``"`(D0`$").,!
+M8A0M$`````#"EE_P0B3__T(PZP1"+`4`0%```,*65!/BE@@`HJ]Y@``(5A/B
+MEG3K0B3__T(P\`!"+`4`0%```,*66!/BE@@`HJ]Y@``(6A/BEH3J0B3__T(P
+MX0!"+`4`0%```,*67!/BE@@`HJ]Y@``(7A/BEET60BP&`$!4WA+EEF`3XI8(
+M`**O8A/BE@P`HJ_>$N66B(``""P3XI80`**O<!."E!0`HJ_@$H64B(``""X3
+M@I1N$^*6%`"BKQ``HJ_B$N66,!/BE@0`HJ\M(``````"/'!P1B2`$`0`(1!2
+M`,`8!``A&&8`!`!CC`$`A"3Y_X`0``!#K"T@``````(\>'!&)(`0!``A$%(`
+M0!@$`"$89`!`&`,`(1AU`(`8`P`A&&8```!CC`$`A"3U_X`0!`!#K"T@````
+M``(\D'!&)(`0!``A$%(`0!@$`"$89`!`&`,`(1AU`(`8`P`A&&8```!CC`$`
+MA"3U_X`0"`!#K"T@``````(\J'!&)(`8!``A&'(`0!`$`"$01`!`$`(`(1!5
+M`(`0`@`A$$8```!"C`P`8JP!`(0D*`""+/3_0!2`&`0`#`!0)BT@``(!``8D
+M+@$')````CP``%$D"?@@`BU``````**/``!%E"T@``("``8D#@$')`GX(`(M
+M0`````"BCP(`190M(``"`@`&)`$!!R0)^"`"+4````(`PI9``$(P+`!`4`(`
+MPI8<`,*/`@!%A"T@``(!``8DJ``')`GX(`(#``@D'`#"CP0`180M(``"`0`&
+M)*D`!R0)^"`"`P`()!P`PH\&`$6$+2```@$`!B2J``<D"?@@`@,`""0<`,*/
+M"`!%A"T@``(!``8DK@`')`GX(`(#``@D'`#"CPH`180M(``"`0`&)*\`!R0)
+M^"`"`P`()!P`PH\,`$6$+2```@$`!B2P``<D"?@@`@,`""0"`,*6@`!",`X`
+M0!`,`%$F+2`@`A``I8\#``8D'P$')```$#P``!`F"?@``BU````M("`"%`"E
+MCP,`!B0D@0`((@$')"T@(`((`*6/`P`&)!<!!R0``!`\```0)@GX``(M0```
+M+2`@`@P`I8\#``8D&@$')`GX``(M0```U`&#EO``8C#0_T(D0`!"+"8`0%#2
+M`8*6-0`")`<`8A!%``(D!0!B$$8``B0#`&(0-@`")!T`8E32`8*6#`!1)BT@
+M(`("``4D`@`&)%H`!R0``!`\```0)@GX``("``@D+2`@`@(`!20"``8D7``'
+M)`GX``("``@D+2`@`@(`!20"``8D7@`')`GX``("``@D+2`@`@(`!20!``8D
+M_@`')`GX``("``@DT@&"ED(`0BPC`$`4+2````P`428M("`"`0`%)`$`!B09
+M`0<D```0/```$"8)^``"`0`()"T@(`(!``4D`@`&)`$`!R0)^``"`P`()"T@
+M(`(!``4D`@`&)`,`!R0)^``"`P`()"T@(`(!``4D`0`&)(L`!R0)^``"`P`(
+M)"T@(`(!``4D`0`&)(P`!R0)^``"`P`()"T@``````(\:'1%)(`8!``A&'(`
+M0!`$`"$01`!`$`(`(1!5`(`0`@`A$$4```!"C*P`8JP!`(0D#0""+/3_0!2`
+M&`0``@#"ED``0C`*`$`0K`!$)AP`PH\``$6$`@`&)"4`!R0```(\``!")`GX
+M0``M0```K`!$)@0`I8\&``8D#@`')````CP``$(D"?A``"U````"`,*6`$!"
+M,`4`0%0"`,*6`@#"AA8`000M@````@#"E@!`0C`"`$`4"``5)`\`%22L`%$F
+M+2`@`@\`!20$``8D.@`')```$#P``!`F"?@``BU````M("`"+2B@`@0`!B1&
+M``<D"?@``BU````M@``````"/'!P520```(\``!1)````CP``%8DP!`0`"$0
+M50"`&!``(1AR`"T@@`(``$6,"?@@`@``9HP!`',F/P!B,@0`0%0!`!`F"?C`
+M`@$`!"0!`!`F\?\`$L`0$``M@``````"/'AP520```(\``!1)````CP``%8D
+M0!`0`"$04`#`$`(`(1!5`(`8$``A&'(`+2"``@``18P)^"`"!`!FC`$`<R8_
+M`&(R!`!`5`$`$"8)^,`"`0`$)`$`$";O_P`20!`0`"V```````(\D'!5)```
+M`CP``%$D```"/```5B1`$!``(1!0`,`0`@`A$%4`@!@0`"$8<@`M((`"``!%
+MC`GX(`((`&:,`0!S)C\`8C($`$!4`0`0)@GXP`(!``0D`0`0)N__`!)`$!``
+M+8```````CRH<%4D```"/```420```(\``!6)$`0$``A$%``P!`"`"$050"`
+M&!``(1AR`"T@@`(``$6,"?@@`@P`9HP!`',F/P!B,@0`0%0!`!`F"?C``@$`
+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
+MO]\P!+[?*`2WWR`$MM\8!+7?$`2TWP@$L]\`!++?^`.QW_`#L-\(`.`#0`2]
+M)___B3#__Z4P___&,``\!P`#)`<``$0(``-$"``0`,40+1"``",8)0$8`&@`
+M$A@``",0R0``````&`!$`!(0```A&&(`(Q#%`!H`8@`2&````0!`4`T`!P``
+M'`,``Q0#``@`X`,`````___&,/__A#!`$`8`(4BB````HI0K$((`!`!`4/[_
+M(I4```"M"`#@`P``X*PK$((`#`!`5"L0J0`0A``(___")$,0`@````*M"`#@
+M`P``XJQ#$`(```#BK`$`0B0(`.`#```"K0P`0!`M&*````!BE//_1!`C$&4`
+M`@!BE"L0@@#S_T`4(Q!E``(`8R0K$&D`]_]`5```8I0(`.`#`````+#_O2=(
+M`+__0`"^_S@`M_\P`+;_*`"U_R``M/\8`+/_$`"R_P@`L?\``+#_+8B@`"VH
+MP``MF``!__^$,``\!P`#E`<`+;````$`%"0"`((L.`!`%"T8```M@```__^7
+M)`(``CR4#UXD0!`4`"$040```$*4*Q!0``D`0!!`(!8`*A"7`@<`0!`A$)$`
+M`0#")O__5C`!`((F__]4,$`@%@`A$)$```!%E$`8%``A$'$```!&E"$@E0``
+M`(>$(1AU````:(0)^,`#+2```D`8$``A&',```!BI``4`@`#%`(`*A!2``X`
+M0!0!``(F0``"+@L`0!`!``(F+1```@$``R;__W`P0!`"`"$04P```%*D0``"
+M+OG_0!0M$``"`0`")O__4#!```(NT/]`%$`0%``!``,D+1!@`$@`O]]``+[?
+M.`"WWS``MM\H`+7?(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#4`"])WX`@H0`
+M`(.$(Q!#`'\`0B@%`$`4?@"&E(+_PB0`%`(`C(0`"`-,`@```(F$?@"&A/__
+MPB0M.$``*A!&``P`0!`_``,D__]B)``4`@`#'`(`0!`#`"$01````$*$*A#B
+M``0`0%`M.,``]_]A!/__8B0M.,``/P`()/__8B0M,$``__]",#\`0BP1`$`0
+M0!`#`"$01````$*$*A!'``P`0!0`%`8``QP"`/__9B3__\(P/P!"+`8`0!!`
+M$`,`(1!$````0H0J$$<`]O]`$``4!@`.`&`40!`(`!<```4M$"`!0!`(`"$0
+M10`"`$.4``!#I/__`B4`%`(``T0"`/G_`P5`$`@`"`#@`RT0(`$A$$4```!#
+MI/[_XB0`%`(``SP"`/__`B4`%`(``T0"`-/_`P7__V(D+1`@`0@`X`,`````
+M0``+)'X`@H0``*.$(Q!#`'\`0B@%`$`4?@"(E(+_`B4`%`(`W80`"`-L`@``
+M`*V$?@")A/__(B4M0$``*A!)``P`0!`_``,D__]B)``4`@`#'`(`0!`#`"$0
+M1````$*$*A`"`00`0%!^`**4]_]A!/__8B1^`**4``#BI"U`8``_``HD0``,
+M)```XH0J$$D`!@!`4"U8```&```5``````0`;!4`````+5@``"T@H``_``@D
+M#P``&4`0"``A$$0```!"A"H020`*`$`4__\")0`4`@`#1`(`!@``&4`0"``A
+M$$0```!"A"H020#X_T`0__\")1```!5`$`H`#P!@%2$01@`8`$`%+1"@`4`0
+M"@`A$$8``@!#E```0Z3__T(E`!0"``-4`@#Y_T,%0!`*``@`X`,M$*`!(1!&
+M`"48"P$``$.D_O\B)0`4`@`#3`(`__]")0`4`@`#5`(`R_]#!0``XH0M$*`!
+M"`#@`P````#P_[TG"`"__P``L/\M@(``>$:$C`<`@%#L+P2.```"/```0B0)
+M^$```````'A&`*[L+P2.!P"`$`@`O]\```(\``!")`GX0```````["\`K@@`
+MO]\``+#?"`#@`Q``O2<$`*:$+4````$`!"2`$`0`(1!$`(`0`@`A&$4`!`!B
+ME"H01@`$`$!0`0"$)"U`@``$`&:$`0"$)`0`@BCT_T`4@!`$`(`0"``A$$@`
+M@!`"`"$010`0`$>$"`!)A`$`!"2`$`@`(1!(`$!``@`A$`0!0!`"`"$P10`0
+M`,.$*A!G``,`0!`!`(0D+3A@``@`R80$`((H]O]`5"$0!`%`$`D`(Q#B```4
+M`@`(`.`#`Q0"`,#_O2<X`+__,`"V_R@`M?\@`+3_&`"S_Q``LO\(`+'_``"P
+M_RV@@``MD*``+;#@````P*0"`$*60`%",$`!`R0%`$,4+2B``-0?@B0(`$B,
+MF84`"`0`1Y0"`$*6T`!#,,```B0#`&(0T``")`4`8E0"`$*6U!^B)"``2(R9
+MA0`('`!'E*``0C"@``,DCP!#%`$`!"34'X(F%`!(C!``1Y2*`.`8+2``````
+M0Y8```*5*Q!B``P`0%0``$*6@!`'`"$01P"`$`(`(1!'`(`0`@`A$$@`K/]"
+ME"L00P`2`$`0+4@`````0I8```.5*Q!#``8`0%"`*`<``@`"E0``PJ0M((`"
+M'H8`""TH``$A**<`@"@%`"$HIP"`*`4`(2BH`!N&``BL_Z4D%`#@$"T@````
+M`$.6```"E2L00P`/`$`0+2A@`"U(@``!`(0D*A"'``H`0!"`$`0`(1!$`(`0
+M`@`A$$0`@!`"`"$02````$*4*Q!%`/3_0%0M2(``@!`$`"$01`"`$`(`(1!$
+M`(`0`@`A*$@```"SE(`0"0`A$$D`@!`"`"$020"`$`(`(:A(````IY8CF&<"
+M,@!@&H`0!``"`*.$`@"DAB,89````$*6(Q!'`!@`8@`2&``````````````8
+M`),`$B```"$89```````&@!S`!(8```!`&!2#0`'```>`P`#'@,```##I`(`
+M$3P4%3$F"?@@`BT@@`(M@$``+2"``@GX(`(M**`"(X`"`@``0I8``*.6(Q!#
+M`!@``@(2@```+2"``@GX(`(M**`"&`!3`!(0```A@`("`````!H`$P(2@```
+M`0!@4@T`!P``AA```X80`".&``@``-"F(1!$`(`0`@`A$$0`@!`"`"$H2```
+M`$.6``"BE`H`8A0M(````@"BE```PJ0M((`"`@`"/!050B0)^$``````````
+MPJ8!``0D+1"``#@`O]\P`+;?*`"UWR``M-\8`+/?$`"RWP@`L=\``+#?"`#@
+M`T``O2>P_[TG2`"__T``MO\X`+7_,`"T_R@`L_\@`++_&`"Q_Q``L/\MH(``
+M+9B@`"V0P``!`!8D%`#`$"V(```"``(\Q!55),`0$0`A@&("+2"``BTH``(M
+M,*`#"?B@`@(`IR<%`$!0+;``````HI,&``*B`@"BDP<``J(!`#$F*Q`R`O'_
+M0!3`$!$`+1#``D@`O]]``+;?.`"UWS``M-\H`+/?(`"RWQ@`L=\0`+#?"`#@
+M`U``O2?@_[TG$`"__P@`L?\``+#_+8B@`"V`@`````(\``!")`GX0`#@``0D
+M"0!`$.PO`JZ```(D?$8"K@```CP``$(D"?A``(``!"0%`$`4>$8"K@(``B0`
+M`"*NCX8`""T0``!```(D?$8"K@(``CRT%$(DJ"P"K@(``CR\^D(DK"P"K@(`
+M`CQ0`$(DL"P"K@(``CQ@_$(DM"P"K@(``CRH`$(DN"P"K@(``CP4"4(DO"P"
+MK@(``CR\&$(DP"P"K@```CP``$(DQ"P"K@$``B00`+_?"`"QWP``L-\(`.`#
+M(`"])[#_O2=``+__.`"W_S``MO\H`+7_(`"T_Q@`L_\0`++_"`"Q_P``L/\M
+MD(``+:"@`"VPP``M@.``+8@``````CS`=5,D```"/```520```(\``!7)$`0
+M$0`A$%$`P!@"`"$8<P!`$`(`(1!4`(`0`@`A$%,`+2!``@``98P)^*`"``!&
+MC`$`$"8_``(R!`!`5`$`,28)^.`"`0`$)`$`,280`"(N[/]`%$`0$0`MB```
+M```"/$!W5"0```(\``!3)````CP``%4DP!`1`"$05``M($`"``!%C`GX8`($
+M`$:,`0`0)C\``C($`$!4`0`Q)@GXH`(!``0D`0`Q)HL`(B[R_T`4P!`1`"V(
+M``````(\F'M3)````CP``%0D```"/```521`$!$`(1!1`(`8`@`A&',`(1!6
+M`(`0`@`A$%,`+2!``@``98P)^(`"``!&C`$`$"8_``(R!`!`5`$`,28)^*`"
+M`0`$)`$`,29``"(N[?]`5$`0$0!``+_?.`"WWS``MM\H`+7?(`"TWQ@`L]\0
+M`++?"`"QWP``L-\(`.`#4`"])\#_O2<P`+__*`"U_R``M/\8`+/_$`"R_P@`
+ML?\``+#_+:"``"V8H``MJ`````"EE,`2HBQ(`$`0+8```'#WI"1F9@8\9V;&
+M-!P`A@`2$```/Q`"`$,0`@##'P0`(Q!#`(`8`@`A&&(`"@"#5```999`$`4`
+MX.Y2)!P`1@(2$```/Q`"`(,0`@##'Q(`.(<`"".00P!0]Z0D9F8&/&=FQC0<
+M`(8`$A```#\0`@!#$`(`PQ\$`",00P"`&`(`(1AB`,(`@Q0M$```0!`%`*#N
+M4B0<`$8"$A```#\0`@"#$`(`PQ\2`".00P`!`!4D@)`2`/\`4C(M($`"```"
+M/```0B0)^$``"``%)"V00``M((`"```"/```0B0)^$``!*(%-"T@0````&.6
+MM`D")`,`8A`0`(8T[_\&)"0PA@`M((`"```"/```0B0)^$``!*(%--Z'``@`
+MB1(```!DEO__@S#,S`(T.!0"`,W,0C0<`&(`$A@``+X8`P"`$`,`(1!#`",0
+M@@#__T(P`@`#)!T`0Q3__X(P/!6"+!H`0!#__X(P``!BEO[_0B3__T(P@!@"
+M`"$88@!`&`,`__\"/(!$0C0A&&(`ZU$$/!^%A#0<`&0`$B```#\@!`##(`0`
+MPQ\#`",@@P`!`(0D```0/```$"8)^``""``%)"V00`#:AP`(+2```,S,`S0X
+M'`,`S<QC-!P`0P`2$```/A$"`(`8`@`A&&(`@!@#`",8@P#__V,P%0!@5```
+M9)8`%((L$@!`5```9)9`[8(D9F8$/&=FA#0<`$0`$B```#\@!`##(`0`PQ<"
+M`",@@@"`(`0````0/```$"8)^``""``%)"V00`#:AP`(`P`$)/__@C#,S`,T
+M.!P#`,W,8S0<`$,`$A```/X0`@"`&`(`(1AB`$`8`P`C&(,`__]C,!(`8%0`
+M`&260.V")&9F!#QG9H0T'`!$`!(@```_(`0`@R`$`,,7`@`C(((`0"`$````
+M$#P``!`F"?@``@@`!20MD$``VH<`"`(`!"3__X(PS,P#-#@<`P#-S&,T'`!#
+M`!(0``"^$`(`@!@"`"$88@`C&(,`__]C,"8`8!0M$```0.V")&9F!#QG9H0T
+M'`!$`!(@```_(`0`0R`$`,,7`@`C(((````0/```$"8)^``""``%)"V00``!
+M``0D"?@``@(`!20M@$```(D2`(`0$``EB"("0!`5`"6((@(!$#$V_P`F,BT@
+M@`(``!`\```0)@GX``*<F`4T`HH1`'\`)C(M((`""?@``MB8!30T$I.N`0`"
+M)#``O]\H`+7?(`"TWQ@`L]\0`++?"`"QWP``L-\(`.`#0`"])[#_O2=``+__
+M.`"W_S``MO\H`+7_(`"T_Q@`L_\0`++_"`"Q_P``L/\MJ(``___4,"VX@``M
+MF````@"BE/`!0S#```(D$`!B$.PODHS!`&(H!@!`$-```B2@``(D!P!B$"T0
+M``#[B``(0`"_WP8`8A`M$```^X@`"$``O]]D$X64'8@`"&83EI1H$^66:A/V
+MEBT@``````(\F'Y&)(`0!``A$%(`P!@$`"$89@`$`&.,`0"$)/G_@!```$.L
+M+2```````CR@?D8D@!`$`"$04@!`&`0`(1AD`$`8`P`A&'0`@!@#`"$89@``
+M`&.,`0"$)/7_@!`$`$.L+2```````CRX?D8D@!`$`"$04@!`&`0`(1AD`$`8
+M`P`A&'0`@!@#`"$89@```&.,`0"$)/7_@!`(`$.L+2```````CS0?D8D@!@$
+M`"$8<@!`$`0`(1!$`$`0`@`A$%0`@!`"`"$01@```$*,#`!BK`$`A"0;`((L
+M]/]`%(`8!``,`%$F+2`@`@,`!B2H``<D```0/```$"8)^``"+4```"T@(`(M
+M*,`"`P`&)*4`!R0)^``"+4```"T@```!``(\6(%%)(`8!``A&'(`0!`$`"$0
+M1`!`$`(`(1!4`(`0`@`A$$4```!"C'@`8JP!`(0D`P""+/3_0!2`&`0`+8``
+M`````CR8?E0D```"/```420```(\``!6),`0$``A$%0`@!@0`"$8<@`M(*`"
+M``!%C`GX(`(``&:,`0!S)C\`8C($`$!4`0`0)@GXP`(!``0D`0`0)O'_`!+`
+M$!``+8```````CR@?E0D```"/```420```(\``!6)$`0$``A$%``P!`"`"$0
+M5`"`&!``(1AR`"T@H`(``$6,"?@@`@0`9HP!`',F/P!B,@0`0%0!`!`F"?C`
+M`@$`!"0!`!`F[_\`$D`0$``M@``````"/+A^5"0```(\``!1)````CP``%8D
+M0!`0`"$04`#`$`(`(1!4`(`8$``A&'(`+2"@`@``18P)^"`""`!FC`$`<R8_
+M`&(R!`!`5`$`$"8)^,`"`0`$)`$`$";O_P`20!`0`"V```````(\T'Y4)```
+M`CP``%$D```"/```5B1`$!``(1!0`,`0`@`A$%0`@!@0`"$8<@`M(*`"``!%
+MC`GX(`(,`&:,`0!S)C\`8C($`$!4`0`0)@GXP`(!``0D`0`0)AL``B[N_T`4
+M0!`0`"V````!``(\6(%4)````CP``%$D```"/```5B1`$!``(1!0`,`0`@`A
+M$%0`@!@0`"$8<@`M(*`"``!%C`GX(`)X`&:,`0!S)C\`8C($`$!4`0`0)@GX
+MP`(!``0D`0`0)@,``B[N_T`40!`0`,0OX*X!``(D0`"_WS@`M]\P`+;?*`"U
+MWR``M-\8`+/?$`"RWP@`L=\``+#?"`#@`U``O2<(`*(L$@!`$.POA(R`$`4`
+M`0`#/*"!8R0A$$,```!"C`@`0```````"`#@`RT0@``(`.`#!`"")`@`X`,(
+M`((D"`#@`PP`@B0(`.`#>`"")`@`X`,M$````"0$`/__QC`#)`0`0!`&`"%(
+MH@```**4*A""``0`0%#^_R*5````K0@`X`,``."L*A""``P`0%0K$*D`+8D`
+M"/__PB1#$`(````"K0@`X`,``.*L0Q`"````XJP!`$(D"`#@`P```JT,`$`0
+M+1B@````8I3S_T00(Q!E``(`8I0J$((`\_]`%",090`"`&,D*Q!I`/?_0%0`
+M`&*4"`#@`P````"@_[TG6`"__U``OO](`+?_0`"V_S@`M?\P`+3_*`"S_R``
+MLO\8`+'_$`"P_RWP@``MB.``+:```2VX0`$`+`4``RP%```T!@`#-`8`__\S
+M,4`4!0`#A`(`+9````(`8BY-`$`4+1@``",0Q0#__T(P*Q!2`$<`0!3__W8F
+M(Q#%`/__53`M(``"+2@@`BTP8`(M.*`#`@`"/&PD0B0)^$``!`"H)P0`HH\$
+M`$`4``"BCP$``B0$`**O``"BCP0`5A0``**/_O]B)@``HJ\``**/0"`"`"$8
+MD0`$`**/0!`"`"$040```&.$``!"A`0`8A0``*:/(1"4`)R)``@``$.40#`&
+M`"$0T0```$>$(R@'`@0`HH]`$`(`(1A4````8Y08`*,`$B@``"$040```$2$
+M(Q"0`"$PU````,.4&`!#`!(0```A**(`(R"'`!H`I``2*````0"`4`T`!P#_
+M_Z,P@!$>`"$04@!`$`(`(1!7````0Z0!`$(F__]2,`(``B8`%`(``X0"`"L0
+ML@*^_T`0+2```@$``R0M$&``6`"_WU``OM](`+??0`"VWS@`M=\P`+3?*`"S
+MWR``LM\8`+'?$`"PWP@`X`-@`+TG__^),/__I3#__\8P`#P'``,D!P``1`@`
+M`T0(`!``Q1`M$(``(Q@E`1@`:``2&```(Q#)```````8`$0`$A```"$88@`C
+M$,4`&@!B`!(8```!`$!0#0`'```<`P`#%`,`"`#@`P````"`_[TG>`"__W``
+MOO]H`+?_8`"V_U@`M?]0`+3_2`"S_T``LO\X`+'_,`"P_RV8P``@`*BO)`"I
+MKR@`JJ\M\&`!__^E,!@`I:___^<P'`"GKZ0LE8PL`*"O`"0%``,D!``4`,:4
+M+2A@`A``IR<"``(\;"1")`GX0``4`*@G+;````,``B0C.%8`$`"BCT`8`@`A
+M&&(``!$#`"$88@!`&`,`0!`'`"$01P#`,`(`(1AF`"$H<P`@`+*4F0!`4@$`
+MUB8L`**/0"`"`"@`HH\A&((`'@"BE```8J0A0)T`+`"DE```!*44`*./0!`#
+M`"$00P``&0(`(1!#`$`0`@`A$$8`(1!3```D!``#)`0`+`!#E"P`0H0J$$0`
+M`0!`5````Z4L`*./0!`#`"$P70```,*4`!0"``,<`@#"%P(`(1AB`$,8`P``
+M`,.D$`"CCT`0`P`A$$,``!D"`"$00P!`(`<`(2"'`(`@!``A$$0`(1!2`$`0
+M`@`A$%,`*@!%E`@`Q:04`*./0!`#`"$00P``&0(`(1!#`"$01``A$%(`0!`"
+M`"$04P``+`4``RP%`"H`0Y0J`$*$*A!%``$`0%0(`,.D+`"DCT"(!``AB#T"
+M"``BE@`4`@`#-`(`PA<"`"$PP@!#,`8`"``FI@``)880`**/0$`"`"%``@$`
+M$0@`(4`"`4!`"`!`@`<`(8`'`L"`$``A0!`!(4`3`2P`!R4B``@E+`"DCRU(
+M0`("``,\$"5C)`GX8``M4*`"```EA@@`)H84`**/0$`"`"%``@$`$0@`(4`"
+M`4!`"``A0!`!(4`3`2P`!R4B``@E+`"DCRU(0`("``,\$"5C)`GX8````JHF
+M"``BE@``(Y8C$$,`__]",!\`0!`MB```+`"DCX"A!``"``(\W"97)$`0!``A
+MD%T`(8"1`D"`$``A@!4"$`"BCT`0`@`A$%,```!%E!0`HH]`$`(`(1!3````
+M1I0```>&``((A@GXX`(8`*2/``0"I@$`,28(`$*6``!#EB,00P#__T(P*Q`B
+M`NK_0!0A@)$"+`"FCP$`QB0L`*:O`0#6)@0`PBY7_T`4`P`")```HI<@`*./
+M``!BI"VP```L`*2/C@"`$"V(```L`*:/___")`D`PA9`&!8`0!`6`"0`I(\A
+M&$0`(1!=``@`0I0$`$(DN8H`"```8J0D`*:/(2!F`"$8?0`(`&*$`@!CA"$0
+M0P#"'P(`(1!#`$,0`@```(*D"@#`$BTH``!`$!8`)`"DCR$81`#^_V.4(1!=
+M````0H0C&&(`'`"FCR,H9@#`$18`(1!5``($0Y0`!$*4(QAB`/__9S`"`.`4
+M+1#@``$``B02`*$$+3A``,`1%@`A,%4`&`"G`!(0````!,.4(1AB```<`P`#
+M'`,`0!`1`"$07@`!`#$F`@!A!"T@8``M(````0"E)/+_H`0``$2D0!`6`"$8
+M70`(`&2$``!CA",@@P`D`*:/(1!&````0I0<`*:/(1!&`"-(0P`K$"0!`@!`
+M$"U`@``M0"`!`!0(`"T80``#%`(`*A"B``T`0!"`.18``S0#`$`8$0`A&'X`
+M(1#E`$`0`@`A$%4```1"E```8J0!`*4D*A"F`/;_0!0!`#$F@!$6`"$01`!`
+M$`(`(1!5`/X#0Y3\`T*4(QAB`/__9S`"`.`4+1#@``$``B0M.$``*Q`)`1T`
+M0%`!`-8F`!0)``,4`@`J$*(`%P!`$(`1%@`A$$0`0!`"`"$@50``%`D``TP"
+M`",8J``8`&<`$A@``/X#@I0A$$,``!0"``,<`@!`$!$`(3!>`(``8B@"`$`4
+M`0`Q)G\``R0!`*4D*A"I`/#_0!0``,.D`0#6)BP`HX\K$,,"=?]`5"P`IH\$
+M`,(N"P!`$(``(BY`$!8`)`"DCR$01`#^_T.4``!#I`$`UB8$`,(N^?]`%$`0
+M%@"``"(N"@!`$'@`O]]`$!$`(1!>`/[_0Y0``$.D`0`Q)H``(B[Z_T`40!`1
+M`'@`O]]P`+[?:`"WWV``MM]8`+7?4`"TWT@`L]]``++?.`"QWS``L-\(`.`#
+M@`"])Z#_O2=0`+__2`"W_T``MO\X`+7_,`"T_R@`L_\@`++_&`"Q_Q``L/\M
+MD(``+8C@`"VP``$MJ(```@#BE-``0S#```(D!`!B$'A&E(S0``(D`P!B5`(`
+MXI1QBP`(_">S)J``0C"@``,D`P!#$.@CDR3)BP`(+1```"T@0`(``!`\```0
+M)@GX``)LH@4T#P!7,```)98M($`"+3!@`BTXX`(M0*`#"`"I)RU0P`("``(\
+M1"=")`GX0``M6(`"+2!``@GX``)8H@4T__\#//\_8S0D$$,`'`!CEO__8R2`
+M&P,``,!C,"400P`M($`"+3!``````CP``$(D"?A``%BB!30``**'!`!`$```
+MHY<C$`,`FHL`"/0OHJ;T+Z"F@*(1-"V```````(\``!3),`8$``A&'0```!F
+MD`(`8I``$@(`)3#"``0`8I``%`(`)3#"``8`8I``%@(`)3#"`"T@0`()^&`"
+M+2@@`@$`$"8@``(N[O]`%`0`,28(`*:7`#$&`/`#QC`E,.8""@"BEX`2`@``
+M_$(P)3#"``P`HI<`%`(`/P`#/"000P`E,,(`#@"BEX`5`@#`#P,\)!!#`"4P
+MP@`M($`"```"/```0B0)^$``;*(%-`$``B10`+_?2`"WWT``MM\X`+7?,`"T
+MWR@`L]\@`++?&`"QWQ``L-\(`.`#8`"])_#_O2<(`+__``"P_RV`@`!X1H2,
+M!P"`4.PO!(X```(\``!")`GX0```````>$8`KNPO!(X'`(!0I"P$C@```CP`
+M`$(D"?A```````#L+P"NI"P$C@<`@!`(`+_?```"/```0B0)^$```````*0L
+M`*X(`+_?``"PWP@`X`,0`+TG+2````,`!B0C$,0`0!@"`"$88@#`&`,`(1AE
+M``@`8I0#`$!0`0"$)`@`X`,4`&*$!`""+/7_0%0C$,0`+1`````4`@`(`.`#
+M`Q0"`"T@``!`$`0`(3!$`,`0!@`A$$4`"`!#E`<`8%`!`(0D@!`&`"$00P!`
+M$`(`(1!%``@`X`,2`$*$!`""+/+_0%1`$`0`+1`````4`@`(`.`#`Q0"`+#_
+MO2=(`+__0`"^_S@`M_\P`+;_*`"U_R``M/\8`+/_$`"R_P@`L?\``+#_+9B`
+M`"V0H``MJ,````#`I`(`HI30`$,PP``")`0`8A`MN.``T``")`,`8E0"`**4
+M.HP`"/PGA22@`$(PZ".%)*```R2A`$,4+3```!0`I)08`+$DG0"`$"TP````
+M`$66```BEBL0H@`,`$!4``!"ED`0!``A$$0``!D"`"$00P!`$`(`(1!1`)K_
+M0I0K$$4`%@!`$````````$*6```CEBL00P`*`$`00(`$`"T@8`("``(\'#!"
+M)`GX0``M*"`"``"BIBT@8`+4C``(+2@@`B&`!`(`$1``(8`"`D"`$``A@#`"
+MS(P`")K_$"84`(`0+2@`````0Y8``"*6*Q!#``\`0!`M.&``+3"@``$`I20J
+M$*0`"@!`$$`0!0`A$$4``!D"`"$00P!`$`(`(1!1````0I0K$$<`]/]`5"TP
+MH`!`$`4`(1!%```9`@`A$$,`0!`"`"'P40```-270!`&`"$01@``&0(`(1!#
+M`$`0`@`AL%$```#"EB.@@@([`(`:+2!@`@(`$3P<,#$F"?@@`BTHP`,M@$``
+M+2!@`@GX(`(M*,`"(X`"`@``0I8``,.6(Q!#`!@``@(2@```+2!@`@GX(`(M
+M*,`"&`!4`!(0```A@`("`````!H`%`(2@````0"`4@T`!P``AA```X80````
+ML*8M(&`"`@`1/-`O,28)^"`"+2C``RV`0``M(&`""?@@`BTHP`(C@`("``!"
+ME@``PY8C$$,`&``"`A*````M(&`""?@@`BTHP`(8`%0`$A```"&``@(`````
+M&@`4`A*````!`(!2#0`'``"&$``#AA``V8P`"```\*9`$`4`(1!%```9`@`A
+M$$,`0!`"`"&`40```$.6```"E@\`8A0M,```+2!@`@(``CP<,$(D"?A``"TH
+M``(``**F+2!@`BTH``("``(\T"]")`GX0`````````#BI@$`!B0M$,``2`"_
+MWT``OM\X`+??,`"VWR@`M=\@`+3?&`"SWQ``LM\(`+'?``"PWP@`X`-0`+TG
+ML/^])T@`O_]``+;_.`"U_S``M/\H`+/_(`"R_Q@`L?\0`+#_+:"``"V8H``M
+MD,```0`6)!0`P!`MB````@`"/'`P523`$!$`(8!B`BT@@`(M*``"+3"@`PGX
+MH`("`*<G!0!`4"VP`````**3!@`"H@(`HI,'``*B`0`Q)BL0,@+Q_T`4P!`1
+M`"T0P`)(`+_?0`"VWS@`M=\P`+3?*`"SWR``LM\8`+'?$`"PWP@`X`-0`+TG
+MX/^])Q``O_\(`+'_``"P_RV(H``M@(`````"/```0B0)^$``A``$)`\`0!#L
+M+P*N``$")'Q&`JX```(\``!")`GX0````00D!P!`$'A&`JX```(\``!")`GX
+M0```!@0D!0!`%*0L`JX"``(D```BKDN-``@M$````@`"/%`O0B2H+`*N`@`"
+M/%`:0B2L+`*N`@`"/!0D0B2P+`*N`@`"//0;0B2T+`*N`@`"/.0?0B2X+`*N
+M`@`"/$PM0B2\+`*N`@`"/)PS0B3`+`*N```"/```0B3$+`*N`0`")!``O]\(
+M`+'?``"PWP@`X`,@`+TGL/^])T``O_\X`+?_,`"V_R@`M?\@`+3_&`"S_Q``
+MLO\(`+'_``"P_RV0@``MH*``+;#``"V`X``MB````0`"/,"!4R0```(\``!5
+M)````CP``%<D0!`1`"$040#`&`(`(1AS`$`0`@`A$%0`@!`"`"$04P`M($`"
+M``!EC`GXH`(``$:,`0`0)C\``C($`$!4`0`Q)@GXX`(!``0D`0`Q)AX`(B[L
+M_T`40!`1`"V(```!``(\D(14)````CP``%,D```"/```523`$!$`(1!4`"T@
+M0`(``$6,"?A@`@0`1HP!`!`F/P`",@0`0%0!`#$F"?B@`@$`!"0!`#$F@``B
+M+O+_0!3`$!$`+8@```$``CR0B%,D```"/```5"0```(\``!5)$`0$0`A$%$`
+M@!@"`"$8<P`A$%8`@!`"`"$04P`M($`"``!EC`GX@`(``$:,`0`0)C\``C($
+M`$!4`0`Q)@GXH`(!``0D`0`Q)D``(B[M_T!40!`1`$``O]\X`+??,`"VWR@`
+MM=\@`+3?&`"SWQ``LM\(`+'?``"PWP@`X`-0`+TGP/^])S``O_\H`+7_(`"T
+M_Q@`L_\0`++_"`"Q_P``L/\MH(``+9B@`"VH`````*64P!*B+$@`0!`M@```
+M</>D)&9F!CQG9L8T'`"&`!(0```_$`(`0Q`"`,,?!``C$$,`@!@"`"$88@`*
+M`(-4``!EED`0!0#@[E(D'`!&`A(0```_$`(`@Q`"`,,?$@#TC0`((Y!#`%#W
+MI"1F9@8\9V;&-!P`A@`2$```/Q`"`$,0`@##'P0`(Q!#`(`8`@`A&&(`M@"#
+M%"T0``!`$`4`H.Y2)!P`1@(2$```/Q`"`(,0`@##'Q(`(Y!#``$`%22`D!(`
+M_P!2,BT@0`(```(\``!")`GX0``(``4D+9!``"T@@`(```(\``!")`GX0``$
+MH@4T+2!`````8Y:T"0(D`P!B$!``AC3O_P8D)#"&`"T@@`(```(\``!")`GX
+M0``$H@4TCHX`"`")$@```&26__^#,,S,`C0X%`(`S<Q"-!P`8@`2&```OA@#
+M`(`0`P`A$$,`(Q""`/__0C`"``,D'0!#%/__@C`\%8(L&@!`$/__@C```&*6
+M_O]")/__0C"`&`(`(1AB`$`8`P#__P(\@$1"-"$88@#K400\'X6$-!P`9``2
+M(```/R`$`,,@!`##'P,`(R"#``$`A"0``!`\```0)@GX``((``4D+9!``(J.
+M``@M(```S,P#-#@<`P#-S&,T'`!#`!(0```^$0(`@!@"`"$88@"`&`,`(QB#
+M`/__8S`/`&!4``!DE@`4@BP,`$!4``!DED#M@B1F9@0\9V:$-!P`1``2(```
+M/R`$`,,@!`##%P(`(R""`(2.``B`(`0`__^",,S,`S0X'`,`S<QC-!P`0P`2
+M$```_A`"`(`8`@`A&&(`0!@#`",8@P#__V,P#`!@5```9)9`[8(D9F8$/&=F
+MA#0<`$0`$B```#\@!`"#(`0`PQ<"`",@@@"$C@`(0"`$`/__@C#,S`,T.!P#
+M`,W,8S0<`$,`$A```+X0`@"`&`(`(1AB`",8@P#__V,P)@!@%"T0``!`[8(D
+M9F8$/&=FA#0<`$0`$B```#\@!`!#(`0`PQ<"`",@@@```!`\```0)@GX``((
+M``4D+9!```$`!"0)^``"`@`%)"V`0```B1(`@!`0`"6((@)`$!4`)8@B`@$0
+M,3;_`"8R+2"``@``$#P``!`F"?@``IR8!30"BA$`?P`F,BT@@`()^``"V)@%
+M-#02DZX!``(D,`"_WR@`M=\@`+3?&`"SWQ``LM\(`+'?``"PWP@`X`-``+TG
+ML/^])T@`O_]``+[_.`"W_S``MO\H`+7_(`"T_Q@`L_\0`++_"`"Q_P``L/\M
+MH(``___5,"VX@``M0```+?```"TX```ML```+9@```(`HI3P`4,PT``")#$`
+M8A#L+Y*,T0!B*`@`0!!``0(DH``")"@`8A#```(D*0!B$"T0```"D``(2`"_
+MWP,`8A!0`0(D,P%B%"T0`````**47_!")/__0C#K!$(L!`!`4```HI14$^B6
+M\XX`"%83_I9TZT(D__]",/``0BP$`$!0``"BE%@3Z);SC@`(6A/^EH3J0B3_
+M_T(PX0!"+`0`0%```**47!/HEO..``A>$_Z6719"+`H`0!0M(```8!/HEO2.
+M``AB$_Z69!.'E/..``AF$Y:4:!/GEFH3]I8M(````0`"/)"+1B2`$`0`(1!2
+M`,`8!``A&&8`!`!CC`$`A"3Y_X`0``!#K"T@```!``(\F(M&)(`0!``A$%(`
+M0!@$`"$89`!`&`,`(1AU`(`8`P`A&&8```!CC`$`A"3U_X`0!`!#K"T@```!
+M``(\L(M&)(`0!``A$%(`0!@$`"$89`!`&`,`(1AU`(`8`P`A&&8```!CC`$`
+MA"3U_X`0"`!#K"T@```!``(\R(M&)(`8!``A&'(`0!`$`"$01`!`$`(`(1!5
+M`(`0`@`A$$8```!"C`P`8JP!`(0D)0""+/3_0!2`&`0``@"BE(``0C`N`$`0
+M#`!1)BT@(`(M*.```P`&)/$`!R0``!`\```0)@GX``(M0```+2`@`BTHP`(#
+M``8D[@`')`GX``(M0```+2`@`@$`!20!``8D(P$')`GX``("``@DS`&#C@D`
+M`B0'`&(0"@`")",`8A0M(```T`&"E@0`0BP@`$`0`0`"/`8`!"0```(\``!"
+M)`GX0``#``4D#`!$)BTH0``#``8D@P`')````CP``$(D"?A```,`""1MCP`(
+M+2```"T@(`(M*``!`P`&)/<`!R0``!`\```0)@GX``(M0```+2`@`BTHP`,#
+M``8D]``')`GX``(M0```+2````$``CQ`CT4D@!@$`"$8<@!`$`0`(1!$`$`0
+M`@`A$%4`@!`"`"$010```$*,H`!BK`$`A"0#`((L]/]`%(`8!``M@````0`"
+M/)"+520```(\``!1)````CP``%8DP!`0`"$050"`&!``(1AR`"T@@`(``$6,
+M"?@@`@``9HP!`',F/P!B,@0`0%0!`!`F"?C``@$`!"0!`!`F\?\`$L`0$``M
+M@````0`"/)B+520```(\``!1)````CP``%8D0!`0`"$04`#`$`(`(1!5`(`8
+M$``A&'(`+2"``@``18P)^"`"!`!FC`$`<R8_`&(R!`!`5`$`$"8)^,`"`0`$
+M)`$`$";O_P`20!`0`"V````!``(\L(M5)````CP``%$D```"/```5B1`$!``
+M(1!0`,`0`@`A$%4`@!@0`"$8<@`M((`"``!%C`GX(`((`&:,`0!S)C\`8C($
+M`$!4`0`0)@GXP`(!``0D`0`0)N__`!)`$!``+8````$``CS(BU4D```"/```
+M420```(\``!6)$`0$``A$%``P!`"`"$050"`&!``(1AR`"T@@`(``$6,"?@@
+M`@P`9HP!`',F/P!B,@0`0%0!`!`F"?C``@$`!"0!`!`F)0`"+N[_0!1`$!``
+M+8````$``CQ`CU4D```"/```420```(\``!6)$`0$``A$%``P!`"`"$050"`
+M&!``(1AR`"T@@`(``$6,"?@@`J``9HP!`',F/P!B,@0`0%0!`!`F"?C``@$`
+M!"0!`!`F`P`"+N[_0!1`$!``Q"_@K@$``B1(`+_?0`"^WS@`M]\P`+;?*`"U
+MWR``M-\8`+/?$`"RWP@`L=\``+#?"`#@`U``O2<(`*(L$@!`$.POA(R`$`4`
+M`0`#/(B/8R0A$$,```!"C`@`0```````"`#@`RT0@``(`.`#!`"")`@`X`,(
+M`((D"`#@`PP`@B0(`.`#H`"")`@`X`,M$````"0$`/__QC`#)`0`0!`&`"%(
+MH@```**4*A""``0`0%#^_R*5````K0@`X`,``."L*A""``P`0%0K$*D`-9``
+M"/__PB1#$`(````"K0@`X`,``.*L0Q`"````XJP!`$(D"`#@`P```JT,`$`0
+M+1B@````8I3S_T00(Q!E``(`8I0J$((`\_]`%",090`"`&,D*Q!I`/?_0%0`
+M`&*4"`#@`P````"@_[TG6`"__U``OO](`+?_0`"V_S@`M?\P`+3_*`"S_R``
+MLO\8`+'_$`"P_RWP@``MB.``+:```2VX0`$`+`4``RP%```T!@`#-`8`__\S
+M,4`4!0`#A`(`+9````(`8BY-`$`4+1@``",0Q0#__T(P*Q!2`$<`0!3__W8F
+M(Q#%`/__53`M(``"+2@@`BTP8`(M.*`#`@`"/(Q`0B0)^$``!`"H)P0`HH\$
+M`$`4``"BCP$``B0$`**O``"BCP0`5A0``**/_O]B)@``HJ\``**/0"`"`"$8
+MD0`$`**/0!`"`"$040```&.$``!"A`0`8A0``*:/(1"4`*20``@``$.40#`&
+M`"$0T0```$>$(R@'`@0`HH]`$`(`(1A4````8Y08`*,`$B@``"$040```$2$
+M(Q"0`"$PU````,.4&`!#`!(0```A**(`(R"'`!H`I``2*````0"`4`T`!P#_
+M_Z,P@!$>`"$04@!`$`(`(1!7````0Z0!`$(F__]2,`(``B8`%`(``X0"`"L0
+ML@*^_T`0+2```@$``R0M$&``6`"_WU``OM](`+??0`"VWS@`M=\P`+3?*`"S
+MWR``LM\8`+'?$`"PWP@`X`-@`+TG__^),/__I3#__\8P`#P'``,D!P``1`@`
+M`T0(`!``Q1`M$(``(Q@E`1@`:``2&```(Q#)```````8`$0`$A```"$88@`C
+M$,4`&@!B`!(8```!`$!0#0`'```<`P`#%`,`"`#@`P````"`_[TG>`"__W``
+MOO]H`+?_8`"V_U@`M?]0`+3_2`"S_T``LO\X`+'_,`"P_RV8P``@`*BO)`"I
+MKR@`JJ\M\&`!__^E,!@`I:___^<P'`"GKZ0LE8PL`*"O`"0%``,D!``4`,:4
+M+2A@`A``IR<"``(\C$!")`GX0``4`*@G+;````,``B0C.%8`$`"BCT`8`@`A
+M&&(``!$#`"$88@!`&`,`0!`'`"$01P#`,`(`(1AF`"$H<P`@`+*4F0!`4@$`
+MUB8L`**/0"`"`"@`HH\A&((`'@"BE```8J0A0)T`+`"DE```!*44`*./0!`#
+M`"$00P``&0(`(1!#`$`0`@`A$$8`(1!3```D!``#)`0`+`!#E"P`0H0J$$0`
+M`0!`5````Z4L`*./0!`#`"$P70```,*4`!0"``,<`@#"%P(`(1AB`$,8`P``
+M`,.D$`"CCT`0`P`A$$,``!D"`"$00P!`(`<`(2"'`(`@!``A$$0`(1!2`$`0
+M`@`A$%,`*@!%E`@`Q:04`*./0!`#`"$00P``&0(`(1!#`"$01``A$%(`0!`"
+M`"$04P``+`4``RP%`"H`0Y0J`$*$*A!%``$`0%0(`,.D+`"DCT"(!``AB#T"
+M"``BE@`4`@`#-`(`PA<"`"$PP@!#,`8`"``FI@``)880`**/0$`"`"%``@$`
+M$0@`(4`"`4!`"`!`@`<`(8`'`L"`$``A0!`!(4`3`2P`!R4B``@E+`"DCRU(
+M0`("``,\,$%C)`GX8``M4*`"```EA@@`)H84`**/0$`"`"%``@$`$0@`(4`"
+M`4!`"``A0!`!(4`3`2P`!R4B``@E+`"DCRU(0`("``,\,$%C)`GX8````JHF
+M"``BE@``(Y8C$$,`__]",!\`0!`MB```+`"DCX"A!``"``(\_$)7)$`0!``A
+MD%T`(8"1`D"`$``A@!4"$`"BCT`0`@`A$%,```!%E!0`HH]`$`(`(1!3````
+M1I0```>&``((A@GXX`(8`*2/``0"I@$`,28(`$*6``!#EB,00P#__T(P*Q`B
+M`NK_0!0A@)$"+`"FCP$`QB0L`*:O`0#6)@0`PBY7_T`4`P`")```HI<@`*./
+M``!BI"VP```L`*2/C@"`$"V(```L`*:/___")`D`PA9`&!8`0!`6`"0`I(\A
+M&$0`(1!=``@`0I0$`$(DP9$`"```8J0D`*:/(2!F`"$8?0`(`&*$`@!CA"$0
+M0P#"'P(`(1!#`$,0`@```(*D"@#`$BTH``!`$!8`)`"DCR$81`#^_V.4(1!=
+M````0H0C&&(`'`"FCR,H9@#`$18`(1!5``($0Y0`!$*4(QAB`/__9S`"`.`4
+M+1#@``$``B02`*$$+3A``,`1%@`A,%4`&`"G`!(0````!,.4(1AB```<`P`#
+M'`,`0!`1`"$07@`!`#$F`@!A!"T@8``M(````0"E)/+_H`0``$2D0!`6`"$8
+M70`(`&2$``!CA",@@P`D`*:/(1!&````0I0<`*:/(1!&`"-(0P`K$"0!`@!`
+M$"U`@``M0"`!`!0(`"T80``#%`(`*A"B``T`0!"`.18``S0#`$`8$0`A&'X`
+M(1#E`$`0`@`A$%4```1"E```8J0!`*4D*A"F`/;_0!0!`#$F@!$6`"$01`!`
+M$`(`(1!5`/X#0Y3\`T*4(QAB`/__9S`"`.`4+1#@``$``B0M.$``*Q`)`1T`
+M0%`!`-8F`!0)``,4`@`J$*(`%P!`$(`1%@`A$$0`0!`"`"$@50``%`D``TP"
+M`",8J``8`&<`$A@``/X#@I0A$$,``!0"``,<`@!`$!$`(3!>`(``8B@"`$`4
+M`0`Q)G\``R0!`*4D*A"I`/#_0!0``,.D`0#6)BP`HX\K$,,"=?]`5"P`IH\$
+M`,(N"P!`$(``(BY`$!8`)`"DCR$01`#^_T.4``!#I`$`UB8$`,(N^?]`%$`0
+M%@"``"(N"@!`$'@`O]]`$!$`(1!>`/[_0Y0``$.D`0`Q)H``(B[Z_T`40!`1
+M`'@`O]]P`+[?:`"WWV``MM]8`+7?4`"TWT@`L]]``++?.`"QWS``L-\(`.`#
+M@`"])Z#_O2=0`+__2`"W_T``MO\X`+7_,`"T_R@`L_\@`++_&`"Q_Q``L/\M
+MD(``+8C@`"VX``$MJ(```@#BE-``0S#```(D!`!B$'A&E(S0``(D`P!B5`(`
+MXI1XD@`(_">S)J``0C"@``,D`@!#$.@CDR34'Y,D+2!``@``$#P``!`F"?@`
+M`FRB!30/`%8P```EEBT@0`(M,&`"+3C``BU`H`,(`*DG+5#@`@(``CQD0T(D
+M"?A``"U8@`(M($`""?@``EBB!33__P,\_S]C-"000P`<`&.6__]C)(`;`P``
+MP&,P)1!#`"T@0`(M,$`````"/```0B0)^$``6*(%-```HH<$`$`0``"CER,0
+M`P"AD@`(]"^BIO0OH*:`HA$T+8```````CP``%,DP!@0`"$8=````&:0`@!B
+MD``2`@`E,,(`!`!BD``4`@`E,,(`!@!BD``6`@`E,,(`+2!``@GX8`(M*"`"
+M`0`0)B```B[N_T`4!``Q)@@`II<`,08`\`/&,"4PQ@(*`**7@!("``#\0C`E
+M,,(`#`"BEP`4`@`_``,\)!!#`"4PP@`.`**7@!4"`,`/`SPD$$,`)3#"`"T@
+M0`(```(\``!")`GX0`!LH@4T`0`")%``O]](`+??0`"VWS@`M=\P`+3?*`"S
+MWR``LM\8`+'?$`"PWP@`X`-@`+TG\/^])P@`O_\``+#_+8"``'A&A(P'`(!0
+M["\$C@```CP``$(D"?A```````!X1@"N["\$C@<`@%"D+`2.```"/```0B0)
+M^$```````.PO`*ZD+`2.!P"`$`@`O]\```(\``!")`GX0```````I"P`K@@`
+MO]\``+#?"`#@`Q``O2<M(````P`&)",0Q`!`&`(`(1AB`,`8`P`A&&4`"`!B
+ME`,`0%`!`(0D"`#@`Q0`8H0$`((L]?]`5",0Q``M$````!0"``@`X`,#%`(`
+M+2```$`0!``A,$0`P!`&`"$010`(`$.4!P!@4`$`A"2`$`8`(1!#`$`0`@`A
+M$$4`"`#@`Q(`0H0$`((L\O]`5$`0!``M$````!0"``@`X`,#%`(`L/^])T@`
+MO_]``+[_.`"W_S``MO\H`+7_(`"T_Q@`L_\0`++_"`"Q_P``L/\MF(``+9"@
+M`"VPP````,"D`@"BE-``0S#```(D!`!B$"WPX`#0``(D`P!B5`(`HI1!DP`(
+M_">%)*``0C"@``,D`@!#$.@CA234'X4D%`"DE!@`L22=`(`0+3``````198`
+M`"*6*Q"B``P`0%0``$*60!`$`"$01```&0(`(1!#`$`0`@`A$%$`FO]"E"L0
+M10`6`$`0````````0I8``".6*Q!#``H`0!!`@`0`+2!@`@(``CPX3$(D"?A`
+M`"TH(`(``,*F+2!@`MN3``@M*"`"(8`$`@`1$``A@`("0(`0`"&`,`+3DP`(
+MFO\0)A0`@!`M*`````!#E@``(I8K$$,`#P!`$"TX8``M,*```0"E)"H0I``*
+M`$`00!`%`"$010``&0(`(1!#`$`0`@`A$%$```!"E"L01P#T_T!4+3"@`$`0
+M!0`A$$4``!D"`"$00P!`$`(`(;A1````])9`$`8`(1!&```9`@`A$$,`0!`"
+M`"&H40```**6(Z""`CL`@!HM(&`"`@`1/#A,,28)^"`"+2C@`BV`0``M(&`"
+M"?@@`BTHH`(C@`("``!"E@``HY8C$$,`&``"`A*````M(&`""?@@`BTHH`(8
+M`%0`$A```"&``@(`````&@`4`A*````!`(!2#0`'``"&$``#AA````#0IBT@
+M8`("`!$\[$LQ)@GX(`(M*.`"+8!``"T@8`()^"`"+2B@`B.``@(``$*6``"C
+MEB,00P`8``("$H```"T@8`()^"`"+2B@`A@`5``2$```(8`"`@`````:`!0"
+M$H````$`@%(-``<``(80``.&$`#@DP`(``#0IT`0!0`A$$4``!D"`"$00P!`
+M$`(`(8!1````0Y8```*6#P!B%"TP```M(&`"`@`"/#A,0B0)^$``+2@``@``
+MPJ8M(&`"+2@``@(``CSL2T(D"?A``````````,*G`0`&)"T0P`!(`+_?0`"^
+MWS@`M]\P`+;?*`"UWR``M-\8`+/?$`"RWP@`L=\``+#?"`#@`U``O2>P_[TG
+M2`"__T``MO\X`+7_,`"T_R@`L_\@`++_&`"Q_Q``L/\MH(``+9B@`"V0P``!
+M`!8D%`#`$"V(```"``(\C$Q5),`0$0`A@&("+2"``BTH``(M,*`#"?B@`@(`
+MIR<%`$!0+;``````HI,&``*B`@"BDP<``J(!`#$F*Q`R`O'_0!3`$!$`+1#`
+M`D@`O]]``+;?.`"UWS``M-\H`+/?(`"RWQ@`L=\0`+#?"`#@`U``O2?@_[TG
+M$`"__P@`L?\``+#_+8B@`"V`@`````(\``!")`GX0`"L``0D#P!`$.PO`JX`
+M`0(D?$8"K@```CP``$(D"?A````!!"0'`$`0>$8"K@```CP``$(D"?A````&
+M!"0%`$`4I"P"K@(``B0``"*N4I0`""T0```"``(\;$M")*@L`JX"``(\0#5"
+M)*PL`JX"``(\-$!")+`L`JX"``(\Y#9")+0L`JX"``(\I#I")+@L`JX"``(\
+M;$E")+PL`JX"``(\N$]"),`L`JX```(\``!"),0L`JX!``(D$`"_WP@`L=\`
+M`+#?"`#@`R``O2=!4C4R,3```$%2-3(Q,0``05(U,C$R``!21C4Q,3$``%)&
+M-3$Q,@``4D8R-#$S``!21C4T,3,``%)%1T]04U]&54Y#``````!!=&AE<F]S
+M(#(S,3,@5VE3;T,```````!!=&AE<F]S(#4R,3(`````071H97)O<R`U,C$Q
+M`````$%T:&5R;W,@-3(Q,`````!!=&AE<F]S(#4S,3(@5VE3;T,```````!!
+M=&AE<F]S(#4T,C0O,C0R-`````````!!=&AE<F]S(#(S,3<@5VE3;T,`````
+M``!!=&AE<F]S(#(S,34@5VE3;T,```````!!=&AE<F]S(#4R,3(@*$901T$I
+M``````!!=&AE<F]S(#4R,3$@*$901T$I```````H4!8L6"@```@+```L#```
+M+`P``"P,```0"P``+`P``"`+```P"P``5`P``#@+``!$"P``@`L``%P+``!H
+M"P``=`L``(@+``!4#```5`P``+P+``#("P``+`P``-0+```L#```X`L``.P+
+M``#X"P``5`P``%0,```L#```5`P``#0,``!4#```5`P``%0,``!,#```````
+M`*#_H_^>_Z#_H_^@_P````````4`"@`4`!X`,@!&`%4`6@!?`&0```````H`
+M%``>`"@`,@`\`$8`4`!:`&0````$``8`"0`,`,(```#$````Q0```-````#:
+M````Y````,(```##````U````/(````-`0``*`$``,\```#*`````@!0(0$`
+M0`$$`*``"`#``"``T`!``%`!)`&8&0`F$`8`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````K&4`````````````````````````````
+M````````````````U&4`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````/_______P```)@``$<````(F`````````R8``"FCH0)
+M$)@```#@,CT4F```:P<``!R8````````()@````"`@(DF```#@X``"B8```!
+M`@(*+)@``/QO`P`PF````````#28```.#@``.)@```<````\F`````$"`$"8
+M`````&.)1)@``)P6<A-(F```,[88`$R8```\88024)@``."XZ`U4F```64@'
+M`%B8``"ZOH!^7)@``%YF.C%@F```"!T``&28````S@$`:)@``)!!FD!PF```
+M#P```'28``"`````>)@```0`````F0````````29````````")D````````,
+MF0````"``!"9```#`````)L````````$FP``(`````B;```0````#)L``#``
+M```0FP``"````!2;```H````&)L``"@````<FP``!````"";```D````))L`
+M`!0````HFP``-````"R;```,````,)L``"P````TFP```@```#B;```B````
+M/)L``!(```!`FP``,@```$2;```*````2)L``"H```!,FP```0```%";```A
+M````5)L``!$```!8FP``,0```%R;```)````8)L``"D```!DFP``!0```&B;
+M```E````;)L``!4```!PFP``-0```'2;```-````>)L``"T```!\FP```P``
+M`(";```C````A)L``!,```"(FP``,P```(R;```+````D)L``"L```"4FP``
+M!P```)B;```G````G)L``!<```"@FP``-P```*2;```/````J)L``"\```"L
+MFP``+P```+";```O````M)L``"\```"XFP``+P```+R;```O````P)L``"\`
+M``#$FP``+P```,B;```O````S)L``"\```#0FP``+P```-2;```O````V)L`
+M`"\```#<FP``+P```.";```O````Y)L``"\```#HFP``+P```.R;```O````
+M\)L``"\```#TFP``+P```/B;```O````_)L``"\`````F@``'0````2:``!=
+M````")H``)T````,F@``W0```!":```=`0``%)H``"$````8F@``80```!R:
+M``"A````()H``.$````DF@``,0```"B:``!Q````+)H``+$````PF@``'```
+M`#2:``!<````.)H``"D````\F@``:0```$":``"I````1)H``"````!(F@``
+M&0```$R:``!9````4)H``)D```!4F@``,````%B:```%````7)H``"4```!@
+MF@``90```&2:``"E````:)H``"@```!LF@``:````'":```?````=)H``!X`
+M``!XF@``&````'R:``!8````@)H``)@```"$F@```P```(B:```$````C)H`
+M`$0```"0F@``A````)2:```3````F)H``!(```"<F@``4@```*":``"2````
+MI)H``-(```"HF@``*P```*R:```J````L)H``&H```"TF@``J@```+B:```;
+M````O)H``!H```#`F@``6@```,2:``":````R)H``-H```#,F@``!@```-":
+M```&````U)H```8```#8F@``!@```-R:```&````X)H```8```#DF@``!@``
+M`.B:```&````[)H```8```#PF@``!@```/2:```&````^)H```8```#\F@``
+M!@```-28```@````S)@```0```#(F```!@$&`)R8``!M````P)@```````#0
+MF```%`````D)```````"`@8&!@8&!@("`````````````P`&``D`/```````
+M`````````````````````````````````/````#,````````````````````
+M"N(````@```*`@```1@```$```!`&`0````````%!%<9`"80!@``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````"HM@``````````````
+M``````````````````````````````#\M@``````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````;`F/";0)````@```()@``%55556J
+MJJJJ9F9F9IF9F9G_______\````````@````(````$````!````````&````
+M!@````8`,````!4````5````'0```!4```!`$```#_PO``_\+P`?_"\`#_PO
+M`$00```/_"\`#_PO`!_\+P`/_"\`2!````_\+P`/_"\`'_PO``_\+P!,$```
+M#_PO``_\+P`?_"\`#_PO`%`0```/_"\`#_PO`!_\+P`/_"\`5!````_\+P`/
+M_"\`'_PO``_\+P!8$```#_PO``_\+P`?_"\`#_PO`%P0```/_"\`#_PO`!_\
+M+P`/_"\`8!````_\+P`/_"\`'_PO``_\+P!D$```#_PO``_\+P`?_"\`#_PO
+M`'`0``!H`0``X`$``+@!``!H`0``,!```#`"``#@`0``L````#`"``"P$```
+MF`T``(`1``!('P``F`T``/`0``#@H```:$`!`(!8``#@H```%(`````$``0`
+M"``(`#``(``$``0<@```IX^-#L^/C0Z5CV`!IX^-#@28`````````P``````
+M````````()@````"`@(``@("``(!`@`"`@(DF```#@X```X.```'!P``#@X`
+M`"B8```!``(*`0`""@```04!``(*-)@```X.```.#@``#@X```X.```XF```
+M!P````<````+````"P```$28``"<%G(3I19R$Z@6<A.<%G(32)@``&>Z&`!G
+MNA@`:;H8`&FZ&`!0F```X+0H#."T*`S@M"@,X+0H#%B8```N#8!^+@V`?BX-
+MP'XN#8!^7)@``%Y=-S%>73<Q7ETZ,5Y=-S%@F```$+T``!"]```XO0``$+T`
+M`&28````S@$``,X!``#.`0``S@$`%)D``!`G```0)P``?!4``!`G```8F0``
+MD`$``)`!``"$````D`$``$29```@$.!O(!#@;R`)X&\@$.!O@*$``/\4_P7_
+M%/\%_Q3_!?\9_P74F```$````!0````0````$``````````,`````````"@`
+M``"<G(2$+````'Q\?'PT````!0```$``````````1`````@```!(````"```
+M`$P````0````4`````````!4````'P`````(````````!`@````````("```
+M``````P(````````$`@````````4"````````!@(````````'`@````````@
+M"````````"0(````````,!(````````$@`````````B`````````#(``````
+M```8@````````"2`````````*(```#`````L@```__\'`#"```#___\!-(``
+M`#$````X@````````#R`````````0(````````!$@````@```$B`````````
+M5(````````!8@`````````B8````````#)@``).0A"T0F````.`R?128``!K
+M#P``')@````````LF```_F\"`#"8````````/)@````!`@!`F```>@%J($R8
+M```\88025)@``%D(``!HF```D$&:0&R8``"!L`P%<)@```\```!TF```@```
+M`'B8```,`````)D````````$F0````````B9````````#)D`````@``0F0``
+M`0```!R9```J"0``()D````````DF0``!8H%`"B9```!````+)D````````P
+MF0```````#29````````.)D````````\F0``/P```$"9```$````2)D`````
+M``!,F0```````%"9````````5)D``$SQ4%U8F0``&````%R9``".:DL`A*$`
+M`/\%_P:(H0``_P?_!XRA``#_"/\(D*$``/\)_PF4H0``_PK_"IBA``#_"_\+
+MG*$``/\,_PR@H0``_PW_#:2A``#_#O\/J*$``/\2_Q*LH0``_Q/_%+"A``#_
+M%?\6M*$``/\7_QFXH0``_QK_&[RA``#_'?\>P*$``/\@_R/$H0``_R7_)\BA
+M``#_*?\LS*$``/\O_S'0H0``_S3_-]2A``#_.O\ZV*$``/\Z_SK<H0``_SK_
+M.N"A``#_.O\ZY*$``/\Z_SKHH0``_SK_.NRA``#_.O\Z\*$``/\Z_SKTH0``
+M_SK_.OBA``#_.O\Z_*$``/\Z_SH`FP````````2;```@````")L``!`````,
+MFP``,````!";```(````%)L``"@````8FP``!````!R;```D````()L``!0`
+M```DFP``-````"B;```,````+)L``"P````PFP```@```#2;```B````.)L`
+M`!(````\FP``,@```$";```*````1)L``"H```!(FP``!@```$R;```F````
+M4)L``!8```!4FP``-@```%B;```.````7)L``"X```!@FP```0```&2;```A
+M````:)L``!$```!LFP``,0```'";```)````=)L``"D```!XFP``!0```'R;
+M```E````@)L``!4```"$FP``-0```(B;```-````C)L``"T```"0FP```P``
+M`)2;```C````F)L``!,```"<FP``,P```*";```+````I)L``"L```"HFP``
+M*P```*R;```K````L)L``"L```"TFP``*P```+B;```K````O)L``"L```#`
+MFP``*P```,2;```K````R)L``"L```#,FP``*P```-";```K````U)L``"L`
+M``#8FP``*P```-R;```K````X)L``"L```#DFP``*P```.B;```K````[)L`
+M`"L```#PFP``*P```/2;```K````^)L```(```#\FP``%@```-28```@````
+MV)@``&@08```F@``J0$````````$F@``Z0$``$`````(F@``*0```(`````,
+MF@``:0```%`!```0F@``F0$``)`!```4F@``V0$``-`!```8F@``&0```!``
+M```<F@``60```$0````@F@``F0```(0````DF@``I0$``$@!```HF@``Y0$`
+M`(@!```LF@``)0```,@!```PF@``R`$``!0````TF@``"````$(````XF@``
+M2````((````\F@``B````'@!``!`F@``F`$``+@!``!$F@``V`$``/@!``!(
+MF@``&````!(```!,F@``6````%(```!0F@``F````)(```!4F@``I`$``'P!
+M``!8F@``Y`$``+P!``!<F@``)````/P!``!@F@``9`````H```!DF@``I```
+M`$H```!HF@``Y````(H```!LF@``"@$``%H!``!PF@``2@$``)H!``!TF@``
+MB@$``-H!``!XF@``R@$```X```!\F@``"@```$X```"`F@``2@```(X```"$
+MF@``B@```%X!``"(F@``N@$``)X!``",F@``^@$``-X!``"0F@``.@````D`
+M``"4F@``>@```$D```"8F@``A@$``(D```"<F@``Q@$``'D!``"@F@``!@``
+M`+D!``"DF@``1@```/D!``"HF@``A@```#D```"LF@``Q@```'D```"PF@``
+MQ@```+D```"TF@``Q@```+T!``"XF@``Q@```/T!``"\F@``Q@```#T```#`
+MF@``Q@```'T```#$F@``Q@```+T```#(F@``Q@```/T```#,F@``Q@```/T`
+M``#0F@``Q@```/T```#4F@``Q@```/T```#8F@``Q@```/T```#<F@``Q@``
+M`/T```#@F@``Q@```/T```#DF@``Q@```/T```#HF@``Q@```/T```#LF@``
+MQ@```/T```#PF@``Q@```/T```#TF@``Q@```/T```#XF@``Q@```/T```#\
+MF@``Q@```/T````!````1@```&`````!````1@```&$````!````1@```&(`
+M```!````1@```&,````!````1@```&0````!````1@```&4````!````1@``
+M`&8````!````1@```&<````!````1@```&@````!````1@```&D````!````
+M1@```&H````!````1@```&L````!````1@```&P````!````1@```'0````!
+M````1@```'0````!````1@```'0````!````1@```'0````!````1@```'0`
+M```!````1@```'0````!````1@```'0````!````1@```'0````!````1@``
+M`'4````!````1@```'8````!````1@```'<````!````1@```'@````!````
+M1@```'D````!````1@```'H````!````1@```'L````!````1@```'P````!
+M````1@```'T````!````1@```'X````!````1@```'\````!````1@```(``
+M```!````1````'P````!````1@```(@````!````1@```(P````!````1@``
+M`)`````!````1@```)0````!````1@```)@````!````1@```)P````!````
+M1@```*`````!````1@```*0````!````1@```*@````!````1@```*P````!
+M````1@```+`````!````1@```+0``````@<``````)X6"P!B%@H`.A8)`!P6
+M"`#J%0<`FA4%`$H5!``#%0(`610``````0````,`!@`)`#\```#T`@$`]`(!
+M`"P#`0`L`P$`9`,!`&0#`0"<`P$`G`,!```````)````!`````0``0`!``$`
+M!@```$9'.``````````````````$`````0`!``0```!&1S<`````````````
+M`````P`!``$``0`#````1D<V``````````````````0```````$``0```$9'
+M-0`````````````````$``$``0````````!&1S0`````````````````!```
+M``$```#^____1D<S``````````````````,``0`!````_?___T9',@``````
+M```````````$`````````/S___]&1S$``````````````````@`!``$```#Z
+M____1D<P````````````````````````````````````````````````````
+M```4$%09`"80!@``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````"`A`0``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````;`F/
+M";0)```("6P)M`D``,G____)____R?___\G____"____`````/+____R____
+M\O____+____T____`````,#____`____P/___\#___^Z____`````++___^R
+M____LO___[+___^P____`````/_______P``!0(/!P(/"@`/"0`/``````"`
+M```@F```55555:JJJJIF9F9FF9F9F?A!`0"<00$`I$$!`$1"`0#`00$`.$(!
+M```````@````(````$````!````````&````!@````8`GA8+`&(6"@`Z%@D`
+M'!8(`.H5!P":%04`2A4$``,5`@!9%```N`L!``````!07`$`Q%D!`!!:`0`P
+M6@$`4%P!`)!:`0!07`$`4%P!`%!<`0!07`$`4%P!`+A:`0!07`$`4%P!`%!<
+M`0!07`$`P%H!`-Q:`0!07`$`*%L!`$Q;`0!07`$`7%H!`%!<`0!07`$`4%P!
+M`)!;`0"<6P$`4%P!`*Q;`0!(7`$`2%P!`"!<`0`H7`$`,%P!`#A<`0!`7`$`
+M``````8````!`````@````,````$````!0```(1>`0"$7@$`Q%P!`.!<`0"$
+M7@$`(%T!`(1>`0"$7@$`A%X!`(1>`0"$7@$`6%T!`(1>`0"$7@$`A%X!`(1>
+M`0"`70$`A%X!`(1>`0",70$`3%X!`(1>`0"$7@$`A%X!`(1>`0"$7@$`O%T!
+M`+Q=`0"$7@$`$%X!``````!`$```#_PO``_\+P`?_"\`#_PO``_\+P!$$```
+M#_PO``_\+P`?_"\`#_PO``_\+P!($```#_PO``_\+P`?_"\`#_PO``_\+P!,
+M$```#_PO``_\+P`?_"\`#_PO``_\+P!0$```#_PO``_\+P`?_"\`#_PO``_\
+M+P!4$```#_PO``_\+P`?_"\`#_PO``_\+P!8$```#_PO``_\+P`?_"\`#_PO
+M``_\+P!<$```#_PO``_\+P`?_"\`#_PO``_\+P!@$```#_PO``_\+P`?_"\`
+M#_PO``_\+P!D$```#_PO``_\+P`?_"\`#_PO``_\+P`P$```,`(``.`!``"P
+M````8`$``.`!``!P$```:`$``.`!``"X`0``C`$``.`!``"P$```8`X``(`1
+M```<'P``.#X``(`1``#P$```X*```&A``0"`6```X+```&A``0`4@```Z`/H
+M`^`&X`8@!"`$0`A`".`&X`8$F`````````,```````````````,````@F```
+M``("`@`"`@(``@$"``("`@`"`@(DF```#@X```X.```'!P``#@X```X.``!$
+MF```'!9R$R4<<A,B%W(3HA9R$R4<<A-@F```$)T``!"=```8G0``&)T``!"=
+M``!DF````,X!``#.`0``S@$``,X!``#.`0!HF```D$&:0)!!FD"009I`D$&:
+M0)!!FD`8F0``N`$``+@!``"$````"`$``+@!```DF0``!8H%$`6*!1`%B@40
+M!8H%$`6*!1`PH@``````````````````"`$````````,`````````#0````%
+M````0`````````!$````"````$@````(````3````!````!0`````````%0`
+M```?``````@````````$"`````````@(````````#`@````````0"```````
+M`!0(````````&`@````````<"````````"`(````````)`@```````!P$@``
+M`````#@0````````>!````````"X$````````/@0````````.!$```````!X
+M$0```````+@1````````^!$````````X$@```````'@2````````N!(`````
+M``#X$@```````#@3````````>!,```````"X$P```````/@3````````.!0`
+M``````!X%````````+@4````````^!0````````X%0```````'@5````````
+MN!4```````#X%0```````#@6````````>!8```````"X%@```````/@6````
+M````.!<```````!X%P```````+@7````````^!<````````\$````````'P0
+M````````O!````````#\$````````#P1````````?!$```````"\$0``````
+M`/P1````````/!(```````!\$@```````+P2````````_!(````````\$P``
+M`````'P3````````O!,```````#\$P```````#P4````````?!0````````$
+M@`````````B`````````#(`````````@@````````"2`````````*(```#``
+M```L@```__\'`#"```#___\!-(```#$````X@````````#R`````````2(``
+M``````!4@````````%B`````````7(```(_'#P#`@```&C""*L2```#@`=P%
+MR(```!`G0!_,@`````#T`="````<'@``U(```*JJ`@#8@```554``MR`````
+M````X(```/_____D@```__\``.B`````````[(````````#P@````````/2`
+M````````^(````````#\@```B`````"'````````!(<``(P````(AP``Y```
+M``R'``#5`@``$(<````````4AP```````!B'``"@````'(<``,D!```@AP``
+M+````"2'```L````*(<``#`````LAP``/````#"'```L````-(<``"P````X
+MAP``,````#R'```\````0(<```````!$AP```````$B'````````3(<`````
+M``!0AP```````%2'````````6(<```````!<AP```````&"'``#5````9(<`
+M`-\```!HAP```@$``&R'```Z`0``<(<``'4```!TAP``?P```'B'``"B````
+M?(<`````````@0```@`!``2!```!````"($``,`````,@0```````!"!``!H
+M`0``%($```````#`AP````$"`\2'```$!08'R(<```@)"@O,AP``#`T.#]"'
+M```0$1(3U(<``!05%A?8AP``&!D:&]R'```<'1X?X(<````!`@/DAP``!`4&
+M!^B'```("0H+[(<```P-#@_PAP``$!$2$_2'```4%187^(<``!@9&AO\AP``
+M'!T>'PR8```9CH2M$)@```#@*'T4F```:Y\*G!R8````````0)@``'H!:B!4
+MF```60@```"9````````!)D````````(F0````````R9`````(``$)D```$`
+M```<F0``@`P``""9`````!`%*)D```$````LF0``!````#29```B(!\>.)D`
+M``T,"PH\F0``/P```$B9```2LH"25)D``(CA4%U<F0``CFI+`&B9``#.`P``
+M<)D``!6U+QEXF0```0```'R9````````$*(``#-C@``4H@``$&P0`!BB``!@
+M0)P`(*(``,8PB`$DH@````0``"RB````````-*(``"`@("`XH@``("`@($"B
+M```@"DDX1*(``+9[``!(H@``_#__#P";````````*)L```P````XFP``$@``
+M`&2;```A````C)L``"T```"<FP``,P````$``@`"``$``0`"``$```````,`
+M!@`)`#\````````````#``8`"0`_``````````D````$````!``!``$``0``
+M``````````8```!&1S@`````````````````!`````$``0````````````0`
+M``!&1S<``````````````````P`!``$``0````````````,```!&1S8`````
+M````````````!````````0````````````$```!&1S4`````````````````
+M!``!``$```````````````````!&1S0`````````````````!`````$`````
+M`````````/[___]&1S,``````````````````P`!``$``````````````/W_
+M__]&1S(`````````````````!````````````````````/S___]&1S$`````
+M`````````````@`!``$``````````````/K___]&1S``````````````````
+M````````````````````````````````````````````````"`````$````#
+M````````````````````!@```$9'-P`````````````````"````````````
+M`````````````$9'-@`````````````````!````````````````````_?__
+M_T9'-0``````````````````````````````````````^O___T9'-```````
+M``````````````$``0``````````````^/___T9',P``````````````````
+M``$``0````$``0``````]O___T9',@````````````````````$````!``$`
+M`0``````\____T9',0````````````````````$````!``$````!````\/__
+M_T9',```````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!_
+M````,@```'\````H````?P```$T```!_````0````!\````0````/P```#``
+M```(````!@`````````$````"``````````"````!`````8````(````"@``
+M``P````.````$````%S9`0`HT@$`>-,!`!36`0"LU@$`=-<!`%C8`0``````
+M,````!6````5@```%8```!6````5@```'(```*>/C1+/#X@)E0_@!*L/X!+/
+M#X@)*)@```$``@H!``(*``$!!0$``@H!``(*-)@```X.```.#@``#@X```X.
+M```.#@``.)@```<````'````"P````L````+````2)@``%K:&`!:VA@`:<H8
+M`&G*&`!IRA@`4)@``."TZ`W@M.@-X+3H#>"TZ`W@M.@-6)@``"X-@'XN#8!^
+M+DWH?BY-Z'XN#8!^7)@``%YF-S%>9C<Q7F8W,5YF-S%>83<Q;)@``(&P#`6!
+ML`P%@;`,!8"P#`6`L`P%%)D``!`G```0)P``?!4``/@J```0)P``1)D``"`0
+MN/<@$+CW(`VX]R`0N/<@$+CW#*(``&I!+&1J02QD:D%`9&I!0&1J04!D'*(`
+M``J`@Q@*@(,8"H!S&`J`@Q@*@(,8,!(````````(F````````"R8``#^+P(`
+M/)@````!`@!,F```/&&$$C"9``"#2```0)D```0```!8F0``_P```'29````
+M````^)D``!@````$H@````````BB``"(9S[0**(``+4!```\H@``KXG($P2;
+M```@````")L``!`````,FP``,````!";```(````%)L``"@````8FP``!```
+M`!R;```D````()L``!0````DFP``-````"R;```L````,)L```(````TFP``
+M(@```#R;```R````0)L```H```!$FP``*@```$B;```&````3)L``"8```!0
+MFP``%@```%2;```V````6)L```X```!<FP``+@```&";```!````:)L``!$`
+M``!LFP``,0```'";```)````=)L``"D```!XFP``!0```'R;```E````@)L`
+M`!4```"$FP``-0```(B;```-````D)L```,```"4FP``(P```)B;```3````
+MH)L```L```"DFP``*P```*B;```K````K)L``"L```"PFP``*P```+2;```K
+M````N)L``"L```"\FP``*P```,";```K````Q)L``"L```#(FP``*P```,R;
+M```K````T)L``"L```#4FP``*P```-B;```K````W)L``"L```#@FP``*P``
+M`.2;```K````Z)L``"L```#LFP``*P```/";```K````])L``"L```#XFP``
+M`@```/R;```6````G)@`````````````````````````````G)@`````````
+M````````````````````G)@`````````````````````````````G)@`````
+M````````````````````````G)@`````````````````````````````G)@`
+M````````````````````````````G)@`````````````````````````````
+MG)@`````````````````````````````G)@`````````````````````````
+M````G)@`````````````````````````````G)@`````````````````````
+M````````G)@`````.````#@````X````.````#@`G)@`````````````````
+M````````````G)@`````````````````````````````G)@`````````````
+MP````(````"`````G)@``/D`!`#Y``0`_P`$`/T`!`#]``0`U)@`````````
+M````!`````0````$`````)H``*D!````````!)H``.D!``!`````")H``"D`
+M``"`````#)H``&D```!0`0``$)H``)D!``"0`0``%)H``-D!``#0`0``&)H`
+M`!D````0````')H``%D```!$````()H``)D```"$````))H``*4!``!(`0``
+M*)H``.4!``"(`0``+)H``"4```#(`0``,)H``,@!```4````-)H```@```!"
+M````.)H``$@```""````/)H``(@```!X`0``0)H``)@!``"X`0``1)H``-@!
+M``#X`0``2)H``!@````2````3)H``%@```!2````4)H``)@```"2````5)H`
+M`*0!``!\`0``6)H``.0!``"\`0``7)H``"0```#\`0``8)H``&0````*````
+M9)H``*0```!*````:)H``.0```"*````;)H```H!``!:`0``<)H``$H!``":
+M`0``=)H``(H!``#:`0``>)H``,H!```.````?)H```H```!.````@)H``$H`
+M``".````A)H``(H```!>`0``B)H``+H!``">`0``C)H``/H!``#>`0``D)H`
+M`#H````)````E)H``'H```!)````F)H``(8!``")````G)H``,8!``!Y`0``
+MH)H```8```"Y`0``I)H``$8```#Y`0``J)H``(8````Y````K)H``,8```!Y
+M````L)H``,8```"Y````M)H``,8```"]`0``N)H``,8```#]`0``O)H``,8`
+M```]````P)H``,8```!]````Q)H``,8```"]````R)H``,8```#]````S)H`
+M`,8```#]````T)H``,8```#]````U)H``,8```#]````V)H``,8```#]````
+MW)H``,8```#]````X)H``,8```#]````Y)H``,8```#]````Z)H``,8```#]
+M````[)H``,8```#]````\)H``,8```#]````])H``,8```#]````^)H``,8`
+M``#]````_)H``,8```#]````U)@``"````#4F```$````!0````0````$```
+M`!0```#8F```:!!@`&@08`!H$&``:!!@`&@08`"<F```````````````````
+M``````````"<F`````````````````````````````"<F```````````````
+M``````````````"<F`````````````````````````````"<F```````````
+M``````````````````"<F```````$````!`````0````$````!"<F```````
+M!`````0````$````!`````2<F`````````````````````````````"<F```
+M``````````````````````````"<F`````````````````````````````"<
+MF``````````````````*``````````"<F```P``X`(``.`#``#@"P``X`,``
+M.`"<F```!@`"``8``@`&````!@`"``8``@"<F```B0```(D```")````B0``
+M`(D```"<F```H````*````"@````H````*````"<F```!P`$``<`!``'``0`
+M!P`$``<`!`#4F```&@```!H````:````&@```!H```"<F```0````$@```!`
+M````0````$````"<F```$````!`````0````$````!````"<F```"`````@`
+M```(````"`````@```"<F```3P```$\```!/````3P```$\```"<F```\0``
+M`/$```!A````\0```/$```"<F```3Y```$^0``!,D```3Y```$^0``"<F```
+M6A(``%H2``":$@``6A(``%H2``#,F```#@````X````/````#@````X````!
+M````1@```&`````!````1@```&$````!````1@```&(````!````1@```&,`
+M```!````1@```&0````!````1@```&4````!````1@```&8````!````1@``
+M`&<````!````1@```&@````!````1@```&D````!````1@```&H````!````
+M1@```&L````!````1@```&P````!````1@```'0````!````1@```'0````!
+M````1@```'0````!````1@```'0````!````1@```'0````!````1@```'0`
+M```!````1@```'0````!````1@```'0````!````1@```'4````!````1@``
+M`'8````!````1@```'<````!````1@```'@````!````1@```'D````!````
+M1@```'H````!````1@```'L````!````1@```'P````!````1@```'T````!
+M````1@```'X````!````1@```'\````!````1@```(`````!````1````'P`
+M```!````1@```(@````!````1@```(P````!````1@```)`````!````1@``
+M`)0````!````1@```)@````!````1@```)P````!````1@```*`````!````
+M1@```*0````!````1@```*@````!````1@```*P````!````1@```+`````!
+M````1@```+0```"(Z@$`D.H!`)CJ`0"@Z@$`N.H!`+CJ`0"HZ@$`L.H!`)X6
+M!@!B%@0`.A8#`!P6`@#J%0$`FA4``$H5```#%0$`610#`+@+!0``````````
+M`#`````5@```%8```!6````5@```%8```!R```"GDXT2SQ.("943X`2K$^`2
+MSQ.("2B8```!``(*`0`""@`!`@4!``(*`0`""C28```.#@``#@X```X.```.
+M#@``#@X``#B8```'````!P````L````+````"P```$B8``!MVA@`;=H8`'7*
+M&`!URA@`=<H8`%"8``#@M.@-X+3H#>"TZ`W@M.@-X+3H#5B8```N#8!^+@V`
+M?BX-Z'XN#>A^+@V`?ER8``!>9C<Q7F8W,5YF-S%>9C<Q7F8W,6R8``"!L`P%
+M@;`,!8&P#`6!L`P%@;`,!129``#0!P``T`<``$P$``"8"```T`<``$29```@
+M$+CW(!"X]Q`-N/<0$+CW$!"X]P2B``````````````@````(````"`````BB
+M``"(9[[6B&>^UHAG/M"(9S[0B&<^T`RB``!``2QD0`$L9&#!0F1@P4)D8,%"
+M9!RB```*@(,8"H"#&`J`<Q@*@(,8"H"#&#`2````````")@````````LF```
+M_B\"`#R8`````0(`3)@``#QAA!(PF0``@D@``$"9```$````6)D``/\```!T
+MF0```````"BB``"U`0``/*(``*^)R!,$FP```0````B;```"````#)L```,`
+M```0FP``!````!2;```%````&)L```@````<FP``"0```"";```*````))L`
+M``L````LFP``#0```#";```0````-)L``!$````\FP``$P```$";```4````
+M1)L``!4```!(FP``&````$R;```9````4)L``!H```!4FP``&P```%B;```<
+M````7)L``!T```!@FP``(````&B;```B````;)L``",```!PFP``)````'2;
+M```E````>)L``"@```!\FP``*0```(";```J````A)L``"L```"(FP``+```
+M`)";```P````E)L``#$```"8FP``,@```*";```T````I)L``#4```"HFP``
+M-0```*R;```U````L)L``#4```"TFP``-0```+B;```U````O)L``#4```#`
+MFP``-0```,2;```U````R)L``#4```#,FP``-0```-";```U````U)L``#4`
+M``#8FP``-0```-R;```U````X)L``#4```#DFP``-0```.B;```U````[)L`
+M`#4```#PFP``-0```/2;```U````^)L``!````#\FP``&@````":```'````
+M!P````2:``!'````1P````B:``"'````AP````R:``"@`0``H`$``!":``#@
+M`0``X`$``!2:```@````(````!B:``!@````8````!R:``"A`0``H0$``"":
+M``#A`0``X0$``"2:```A````(0```"B:``!A````80```"R:``!B`0``8@$`
+M`#":``"B`0``H@$``#2:``#B`0``X@$``#B:```B````(@```#R:``!B````
+M8@```$":``!C`0``8P$``$2:``"C`0``HP$``$B:``#C`0``XP$``$R:```C
+M````(P```%":``!C````8P```%2:``"$`0``A`$``%B:``#$`0``Q`$``%R:
+M```$````!````&":``#J`0``"P```&2:```J````2P```&B:``!J````BP``
+M`&R:``"J````K`$``'":``"K`0``[`$``'2:``#K`0``+````'B:```K````
+M$@```'R:``!K````4@```(":``"K````D@```(2:``"L`0``DP$``(B:``#L
+M`0``TP$``(R:```L````$P```)":```Z````4P```)2:``!Z````DP```)B:
+M``"Z````E`$``)R:``"[`0``U`$``*":``#[`0``%````*2:```[````.@``
+M`*B:``![````>@```*R:``"[````N@```+":``"\`0``NP$``+2:``#\`0``
+M^P$``+B:```\````.P```+R:``!\````>P```,":``"\````NP```,2:``#\
+M````O`$``,B:``#\````_`$``,R:``#\````/````-":``#\````?````-2:
+M``#\````O````-B:``#\````_````-R:``#\````_````.":``#\````_```
+M`.2:``#\````_````.B:``#\````_````.R:``#\````_````/":``#\````
+M_````/2:``#\````_````/B:``#\````_````/R:``#\````_````-28```@
+M````T)@```@$!@,(!`<#"`0&`P@$!@,(!`<#W)@``,`@H`#`(*``P"#@`,`@
+MX`#`(.``G)@```````\````/````#P````\````/G)@`````````````````
+M````````````G)@`````@````(````"`````@````(``G)@`````*@```"H`
+M```J````*@```"H`G)@``````0````$````!`````0````$`G)@`````````
+M````````````````````G)@`````&````!@````8````&````!@`G)@`````
+M8````&````!N````;@```&X`G)@`````QP```,<```#'````QP```,<`G)@`
+M````2P```$L```!+````2P```$L`G)@`````2`0``$@$``!(!```2`0``$@$
+MG)@`````3````$P```!,````3````$P`G)@`````Y````.0```#D````Y```
+M`.0`G)@`````````````````````````````G)@`````_````/P```#\````
+M_````/P`G)@`````_P```/\```#_````_P```/\`G)@`````/P0``#\$```_
+M!```/P0``#\$G)@`````#`````P````,````#`````P`G)@`````&0(``!D"
+M```9`@``&0(``!D"G)@`````)````"0````D````)````"0`G)@`````M```
+M`+0```"T````M````+0`G)@`````F0```)D```"9````F0```)D`G)@`````
+M4````%````!0````4````%``G)@`````*@```"H````J````*@```"H`G)@`
+M````$@```!(````2````$@```!(`G)@`````,L```#+````RP```,L```#+`
+MG)@`````=`$``'0!``!T`0``=`$``'0!G)@`````$0```!$````1````$0``
+M`!$`G)@`````*(8``"B&```HA@``*(8``"B&G)@`````A#$``(0Q``"$,0``
+MA#$``(0QG)@``(``\@"``/(`@`#R`(``\@"``/(`G)@``!D`)P`9`"<`&0`G
+M`!D`)P`9`"<`G)@```,````#`````P````,````#````G)@`````````````
+M````````````````G)@``+(```"R````L@```+(```"R````G)@``(0@L`"$
+M(+``A""P`(0@L`"$(+``G)@``*0E00"D)4$`I"5!`*0E00"D)4$`G)@``""2
+M$0`@DA$`()(1`""2$0`@DA$`G)@```!(&@``2!H``$@:``!(&@``2!H`V)@`
+M`#`""P`P`@L`,`(+`#`""P`P`@L`G)@``)0```"4````E````)0```"4````
+MG)@``)$```"1````D0```)$```"1````G)@``!(````2````$@```!(````2
+M````G)@``(````"`````@````(````"`````G)@``-D```#9````V0```-D`
+M``#9````G)@``&````!@````8````&````!@````G)@``/````#P````\```
+M`/````#P````G)@``*(```"B````H@```*(```"B````G)@``%(```!2````
+M4@```%(```!2````G)@``-0```#4````U````-0```#4````G)@``,P4``#,
+M%```S!0``,P4``#,%```G)@``(P$``",!```C`0``(P$``",!```Q)@```,`
+M```#`````P````,````#````H``"`'@``@"```(`B``"`*```@"@``(`D``"
+M`)@``@`P````%0```!4````5````%0```!4````<@```IY.-$L\3B`F5$^`$
+MJQ/@$L\3B`DHF````0`""@$``@H```(%`0`""@$``@HTF`````X````.````
+M#@````X````.```XF````@````(````*````"@````H```!(F```;=H8`&W:
+M&`!D:AH`9&H:`&1J&@!0F```X+3H#>"TZ`W:L.@-VK"8#-JPZ`U8F```+@V`
+M?BX-@'XN#>A^+@W(?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F`Y,5YF-S%LF```
+M@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,!```F`@``-`'``!$
+MF0```!"X]P`0N/<`#;CW`!"X]P`0N/<$H@``````````````````````````
+M```(H@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``0`$L`$`!+`!`P4(`0,%"
+M`$#!0@`<H@``"H"#&`J`@Q@*@&,8"H"#&`J`@Q@P$@``X`,``&"````/````
+M&($````````<@0```````""!````````)($````````H@0```````"R!````
+M````,($````````T@0```````#B!````````/($```````!`@0``J```@$2!
+M````````")@````````LF````*```#R8````!"``3)@``#PCA!)PF```'P``
+M`'28``"`````>)@```X```!8F0``_P```("9````````A)D`````@`*@F0``
+M`````."9````````Y)D``*JJJJKHF0``>&1&/.R9``"J````\)D```P```#T
+MF0``_P```/B9```4````**(``+4)```\H@``KXG(DTRB```!````4*(```"@
+M``!4H@```````%BB``"`4\<,7*(```$/#P]@H@```0]I7V2B```1BD$`:*(`
+M``````!LH@``:L$P#'"B```@"((`=*(``*I\&P!XH@``SCGG''RB``#.`1<%
+M`*,``````1@$HP```B8#,`BC```&/@=(#*,```I,"U80HP``#V`:9!2C```;
+M;D]X&*,``%I\CX8<HP``6X;/CB"C```/ET^=)*,``(^ASZ4HHP``'Z]?M2RC
+M``"?N=^],*,``#_'?\TTHP``O]'_U3BC````````/*,```````!`HP``````
+M`$2C````````2*,``/___S],HP``____/U"C``#___\_5*,``/__`P!8HP``
+M'ZJH>5RC```/0FP&8*,```<B*`]DHP``A19@%VBC```$$8`?;*,```,,H#=P
+MHP``@PC$/W2C```#",!7>*,``((&V%]\HP``@@3@?X"C``"Z>SQ_A*,``/!_
+M,/,$FP```0````B;```"````#)L```,````0FP``!````!2;```%````&)L`
+M``@````<FP``"0```"";```*````))L```L````LFP``#0```#";```0````
+M-)L``!$````\FP``$P```$";```4````1)L``!4```!(FP``&````$R;```9
+M````4)L``!H```!4FP``&P```%B;```<````7)L``!T```!@FP``(````&B;
+M```B````;)L``",```!PFP``)````'2;```E````>)L``"@```!\FP``*0``
+M`(";```J````A)L``"L```"(FP``+````)";```P````E)L``#$```"8FP``
+M,@```*";```T````I)L``#4```"HFP``-0```*R;```U````L)L``#4```"T
+MFP``-0```+B;```U````O)L``#4```#`FP``-0```,2;```U````R)L``#4`
+M``#,FP``-0```-";```U````U)L``#4```#8FP``-0```-R;```U````X)L`
+M`#4```#DFP``-0```.B;```U````[)L``#4```#PFP``-0```/2;```U````
+M^)L``!````#\FP``&@````":``````````````2:````````0`````B:````
+M````@`````R:````````@0$``!":````````P0$``!2:`````````0```!B:
+M````````00```!R:````````@0```"":````````:`$``"2:````````J`$`
+M`"B:````````Z`$``"R:````````*````#":````````:````#2:````````
+MB0$``#B:````````R0$``#R:````````"0```$":````````20```$2:````
+M````B0```$B:````````D`$``$R:````````T`$``%":````````$````%2:
+M````````4````%B:````````D````%R:````````D0$``&":````````T0$`
+M`&2:````````$0```&B:````````40```&R:````````D0```'":````````
+M>`$``'2:````````N`$``'B:````````^`$``'R:````````.````(":````
+M````>````(2:````````F0$``(B:````````V0$``(R:````````&0```)":
+M````````60```)2:````````F0```)B:````````V0```)R:````````^0``
+M`*":````````^0```*2:````````^0```*B:````````^0```*R:````````
+M^0```+":````````^0```+2:````````^0```+B:````````^0```+R:````
+M````^0```,":````````^0```,2:````````^0```,B:````````^0```,R:
+M````````^0```-":````````^0```-2:````````^0```-B:````````^0``
+M`-R:````````^0```.":````````^0```.2:````````^0```.B:````````
+M^0```.R:````````^0```/":````````^0```/2:````````^0```/B:````
+M````^0```/R:````````^0```-28```@````T)@```@4``((%`$""!0``@@4
+M``((%`$"W)@``,`@H`#`(*``P"#@`,`@X`#`(.``G)@``````/````#P````
+M\````/````#PG)@`````````````````````````````G)@```````,````#
+M`````P````,````#G)@`````````````````````````````G)@`````````
+M````````````````````G)@`````````````````````````````G)@`````
+M````````````````````````G)@`````````````````````````````G)@`
+M````0$```$!```!`0```0$```$!`G)@`````!64```5E```%90``!64```5E
+MG)@`````````````````````````````G)@`````````````````````````
+M````G)@`````0@```$(```!"````0@```$(`G)@`````M0```+4```"U````
+MM0```+4`G)@``````P````,````#`````P````,`G)@`````]P```/<```#W
+M````]P```/<`G)@`````G0```)T```"=````G0```)T`G)@`````(@```"(`
+M```B````(@```"(`G)@`````(@0``"($```B!```(@0``"($G)@``!@`(P`8
+M`",`&``C`!@`(P`8`",`G)@`````*````"@`8``H`&``*`!@`"@`G)@``,``
+M4`#``%``PP!0`,,`4`##`%``G)@``'\`!`!_``0`?P`$`'\`!`!_``0`G)@`
+M`%@$``!8!```6`0``%@$``!8!```G)@`````````````````````````````
+MG)@```#`````P````,````#`````P```V)@``#`"0``P`D``,`)``#`"0``P
+M`D``G)@```!D````9````&0```!D````9```G)@````(````"`````@````(
+M````"```S)@```X````.````#@````X````.````9"0"`#PD`@!$)`(`3"0"
+M`&0D`@!D)`(`5"0"`%PD`@`P````%0```!4````5````%0```!4````<@```
+MIY.-$L\3B`F5$^`$JQ/@$L\3B`DHF````0`""@$``@H``0(%`0`""@$``@HT
+MF```#@X```X.```.#@``#@X```X.```XF```!P````<````+````"P````L`
+M``!(F```8?H8`&'Z&`!C&AH`8QH:`&,:&@!0F```X+28#."TF`S:L)@,VK"8
+M#-JPF`Q8F```+@W(?BX-R'XN#<A^+@W(?BX-R'Y<F```7F`Y,5Y@.3%>8#DQ
+M7F`Y,5Y@.3%LF```@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,
+M!```F`@``-`'``!$F0```!"X]P`0N/<`#;CW`!"X]P`0N/<$H@``````````
+M```````````````````(H@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``X,$N
+M`.#!+@`@P2H`(,$J`"#!*@`<H@``"H"#&`J`@Q@*@&,8"H"#&`J`@Q@`HP``
+M```!&````1@```$8```!&````1@$HP```B8#,`(F`S`")@,P`B8#,`(F`S`(
+MHP``!CX'2`8^!T@&/@=(!CX'2`8^!T@,HP``"DP+5@I,"U8*3`M6"DP+5@I,
+M"U80HP``#V`:9`]@&F0/8!ID#V`:9`]@&F04HP``&VY/>!MN3W@;;D]X&VY/
+M>!MN3W@8HP``6GR/AEI\CX9:?(^&6GR/AEI\CX8<HP``6X;/D%N&SY!;AL^.
+M6X;/CEN&SXX@HP``#Y=/G0^73YT/ET^;#Y=/FP^73YLDHP``CZ//IX^CSZ>/
+MG\^CCY_/HX^?SZ,HHP``'Z]?M1^O7[4?KU^S'Z]?LQ^O7[,LHP``G[G?O9^Y
+MW[V?N=^[G[G?NY^YW[LPHP``/\5_RS_%?\L_QW_+/\=_RS_'?\LTHP``O]'_
+MU;_1_]6_T?_3O]'_T[_1_],P$@``X`,``&A````0````8(````\```"<@```
+M`````*"`````````&($````````<@0```````""!````````)($````````H
+M@0```````"R!````````,($````````T@0```````#B!````````/($`````
+M``!`@0``^0,`@$2!````````")@````````LF````*```#R8````!"``3)@`
+M`#PCA!)PF```'P```'28``"`````>)@```X```!8F0``_Q\(`("9````````
+MA)D`````@`*@F0```````."9````````Y)D``*JJJJKHF0``>&1&/.R9``"J
+M````\)D```P```#TF0``_P```/B9```4````**(``+4)```\H@``KXG(DTRB
+M```!````4*(```"@``!4H@```````%BB``"`4\<,7*(```$/#P]@H@```0]I
+M7V2B```1BD$`:*(```````!LH@``:L$P#'"B```@"((`=*(``*I\&PAXH@``
+MSCGG''RB``#.`1<%.*,````````\HP```````$"C````````1*,```````!(
+MHP``____/TRC``#___\_4*,``/___S]4HP``__\#`%BC```?JJAY7*,```]"
+M;`9@HP``!R(H#V2C``"%%F`7:*,```01@!]LHP```PR@-W"C``"#",0_=*,`
+M``,(P%=XHP``@@;87WRC``""!.!_@*,``+I[/'^$HP``\'\P\P2;```!````
+M")L```(````,FP```P```!";```$````%)L```4````8FP``"````!R;```)
+M````()L```H````DFP``"P```"R;```-````,)L``!`````TFP``$0```#R;
+M```3````0)L``!0```!$FP``%0```$B;```8````3)L``!D```!0FP``&@``
+M`%2;```;````6)L``!P```!<FP``'0```&";```@````:)L``"(```!LFP``
+M(P```'";```D````=)L``"4```!XFP``*````'R;```I````@)L``"H```"$
+MFP``*P```(B;```L````D)L``#````"4FP``,0```)B;```R````H)L``#0`
+M``"DFP``-0```*B;```U````K)L``#4```"PFP``-0```+2;```U````N)L`
+M`#4```"\FP``-0```,";```U````Q)L``#4```#(FP``-0```,R;```U````
+MT)L``#4```#4FP``-0```-B;```U````W)L``#4```#@FP``-0```.2;```U
+M````Z)L``#4```#LFP``-0```/";```U````])L``#4```#XFP``$````/R;
+M```:`````)H`````````````!)H``$````!`````")H``(````"`````#)H`
+M`*$!``!A`0``$)H``.$!``"A`0``%)H``"$```#A`0``&)H``&$````A````
+M')H``(@!``!A````()H``,@!``"(`0``))H```@```#(`0``*)H``$@````(
+M````+)H``(@```!(````,)H``*D!``"(````-)H``.D!``!I`0``.)H``"D`
+M``"I`0``/)H``&D```#I`0``0)H``-`!```I````1)H``!````!I````2)H`
+M`%````"0`0``3)H``)````#0`0``4)H``+$!```0````5)H``/$!``!0````
+M6)H``#$```"0````7)H``'$```!Q`0``8)H``+@!``"Q`0``9)H``/@!``#Q
+M`0``:)H``#@````Q````;)H``'@```!Q````<)H``)D!``"8`0``=)H``-D!
+M``#8`0``>)H``!D````8````?)H``%D```!8````@)H``)D```"8````A)H`
+M`-D```!Y`0``B)H``/D```"Y`0``C)H``/D```#Y`0``D)H``/D````Y````
+ME)H``/D```!Y````F)H``/D```"Y````G)H``/D```#Y````H)H``/D```#Y
+M````I)H``/D```#Y````J)H``/D```#Y````K)H``/D```#Y````L)H``/D`
+M``#Y````M)H``/D```#Y````N)H``/D```#Y````O)H``/D```#Y````P)H`
+M`/D```#Y````Q)H``/D```#Y````R)H``/D```#Y````S)H``/D```#Y````
+MT)H``/D```#Y````U)H``/D```#Y````V)H``/D```#Y````W)H``/D```#Y
+M````X)H``/D```#Y````Y)H``/D```#Y````Z)H``/D```#Y````[)H``/D`
+M``#Y````\)H``/D```#Y````])H``/D```#Y````^)H``/D```#Y````_)H`
+M`/D```#Y````U)@``"````#0F```"`````@````(````"`````@```#<F```
+MP`"@`,``H`#``.``P`#@`,``X`"<F```````,P```#,````S````,P```#.<
+MF````````0````$````!`````0````&<F```````````````````````````
+M``"<F`````````````````````````````"<F```````````````````````
+M``````"<F```````'P```!\````?````'P```!^<F```````````````````
+M``````````"<F`````"X````N````+@```"X````N`"<F`````"W````MP``
+M`+<```"W````MP"<F`````"$````A````(0```"$````A`"<F`````"8````
+MF````)@```"8````F`"<F`````#`````P````,````#`````P`"<F`````#_
+M````_P```/\```#_````_P"<F`````#_````_P```/\```#_````_P"<F```
+M``#_````_P```/\```#_````_P"<F`````#_````_P```/\```#_````_P"<
+MF`````#7````UP```-<```#7````UP"<F`````!A````80```&$```!A````
+M80"<F`````#^````_@```/X```#^````_@"<F`````#>````W@```-X```#>
+M````W@"<F`````!_````?P```'\```!_````?P"<F``````]!```/00``#T$
+M```]!```/02<F`````!W````=P```'<```!W````=P"<F`````!$````1```
+M`$0```!$````1`"<F`````"8````F````)@```"8````F`"<F```@``0`(``
+M$`"``!``@``0`(``$`"<F```-,`%`#3`!0`TP`4`-,`%`#3`!0"<F```\``Q
+M`/``,0#P`#$`\``Q`/``,0"<F```'P$,`!\!#``?`0P`'P$,`!\!#`"<F```
+M0`!1`$``40!``%$`0`!1`$``40"<F```V@!0`-H`4`#:`%``V@!0`-H`4`"<
+MF`````````````````````````````"<F```1$```$1```!$0```1$```$1`
+M``"<F`````````````````````````````"<F```P&```,!@``#`8```P&``
+M`,!@``"<F````"P````L````-@```#8````L``#(F````P0```,$```#!```
+M`P0```,$``"<F````&0```!D````9````&0```!D``"<F`````@````(````
+M"`````@````(``#,F```#@````X````.````#@````X```"$0`(`7$`"`&1`
+M`@!L0`(`A$`"`(1``@!T0`(`?$`"`#`N.2XR,"XS````````````````"```
+M`!`````8````(````"@````P````.`````````````````#_`?\!````````
+M`````/________]_```````````#`)@!F0$`````````````_________W\`
+M``````````<`F`$P"P````````````#_________?P``````````"`"8`3`,
+M`````````````/________]_```````````@`"`!$`H`````````````____
+M_____W\``````````"$`(`&9`0````````````#_________?P``````````
+M(@`@`3`,`````````````/________]_```````````Z`&`!$`H`````````
+M````_________W\``````````#L`8`&9`0````````````#_________?P``
+M````````$@!E`1`*```#`````````/________]_```````````W`#`!F0$`
+M``,`````````_________W\``````````#4`,`*9`0```P````````#_____
+M____?P``````````-@`P`YD!```#`````````/________]_```````````P
+M`#`$F0$```,`````````_________W\``````````#D`,`69`0```P``````
+M``#_________?P``````````-``P!ID!```#`````````/________]_````
+M```````R`#`#F0$```,`````````_________W\``````````#$`,`.9`0``
+M``````````#_________?P``````````$0`0`9D!`````````````/______
+M__]_```````````0`!`!$`H`````````````_________W\``````````%(`
+M4`&9`0````````````#_________?P``````````10!0`ID!````````````
+M`/________]_``````````!'`%`#F0$`````````````_________W\`````
+M`````$(`4`29`0````````````#_________?P``````````6`!0!9D!````
+M`````````/________]_``````````!;`%`&F0$`````````````________
+M_W\``````````%T`4`B9`0````````````#_________?P``````````7@!0
+M"9D!`````````````/________]_``````````!0`%`#$`H`````````````
+M_________W\``````````%4`4`$P#`````````````#_________?P``````
+M````5@!0`C`,`````````````/________]_``````````!)`%`"4`T`````
+M````````_________W\``````````$``0`%`"@``1@````0````H````````
+M`(@!````````00!``4`*``!'````!````&@`````````B0$```````!(`$`!
+M$`H``$8````$````"`````````"*`0```````$H`0`%`"@``1@````0````(
+M&````````(P!````````2P!``4`*``!&````!`````A@````````C0$`````
+M``!,`$`!4`H``$8````$````"`````````"/`0```````$,`0`)`"@``1P``
+M``0```!P`````````(L!````````\`!``T`*``!&````!````"``````````
+M``````````"``$`#0`H``$<````$````8`````````"G#P```````/$`0`-`
+M"@``1@````0`````&```````````````````@0!``T`*``!&````!`````!@
+M````````J`\```````""`$`#4`H``$8````$``````````````"I#P``````
+M`/(`0`,0"@``1@````0`````````````````````````@P!`!$`*``!'````
+M!````&"`````````J@\```````#T`$`$0`H``$8````$`````)@`````````
+M`````````(0`0`1`"@``1@````0`````X````````*L/````````A0!`!%`*
+M``!&````!`````"`````````K`\```````#U`$`$$`H``$8````$`````(``
+M`````````````````(8`0`5`"@``1P````0```!@@````````*T/````````
+MAP!`!4`*``!&````!`````#@````````K@\```````"(`$`%4`H``$8````$
+M`````(````````"O#P```````(D`0`9`"@``1P````0```!H`````````+`/
+M````````B@!`!D`*``!&````!`````A@````````L0\```````"+`$`&4`H`
+M`$8````$````"`````````"R#P```````(P`0`=`"@``1P````0```!H@```
+M`````+,/````````C0!`!T`*``!&````!`````C@````````M`\```````".
+M`$`'4`H``$8````$````"(````````"U#P```````(\`0`A`"@``1P````0`
+M``!H@````````+8/````````D`!`"$`*``!&````!`````C@````````MP\`
+M``````"1`$`(4`H``$8````$````"(````````"X#P```````/8`0`E`"@``
+M1P````0```!@@```````````````````]P!`"T`*``!'````!````&"`````
+M``````````````!@`&``8```````````````_________W\``````````&$`
+M80!A`````P````````#_________?P``````````8@!B`&(````"````````
+M`/________]_``````````!C`&,`8P``````````````_________W\`````
+M`````&0`9`!D`````P````````#_________?P``````````90!E`&4````#
+M`````````/________]_``````````!F`&8`9@``````````````________
+M_W\``````````&<`9P!G``````````````#_________?P``````````:`!H
+M`&@``````````````/________]_``````````!I`&D`:0````,`````````
+M_________W\``````````&H`:@!J`````P````````#_________?P``````
+M````90````$```#_____@````/____\`````2E```+0/````````:@````$`
+M``#_____@````/____\`````2E```+0/````````_P$```$````!`````0``
+M`%@;`````!```0````$````!````6!L```@``P`!``````````$```!8&P``
+M#``#``$``````````0```%@;```@`$<`````````````````6!L``#,`,``!
+M``````````$```!8&P``)``A``$````!`````0```%@;```H`#<``0``````
+M```!````6!L``!\`,``!`````0````$```!8&P``,`!;``$``````````0``
+M`%@;``!P``,``0`````````!````6!L``#@`-P`!``````````$```!8&P``
+M5`!5``$````!`````0```%@;``!$`%4``0````$````!````6!L``$P`.P`!
+M``````````````!8&P``8`!2``$````!`````0```%@;``!D`#0``0``````
+M```!````6!L``'P`(``!`````0````$```!8&P``F`!;``$````!`````0``
+M`%@;``"<`%(``0````$````!````6!L``*H`$``!``````````$```!8&P``
+MO``#``$``````````0```%@;``"_`#8``0`````````!````6!L``,0`-P`!
+M`````0````$```!8&P``RP`W``$``````````0```%@;``#0`#<``0``````
+M```!````6!L``-8`$``!`````0````$```!8&P``V@`#````````````````
+M`%@;```R`S8``0`````````!````6!L``-X``P`!``````````$```!8&P``
+MZ0`W``$``````````0```%@;``#V`#<``0`````````!````6!L``/H`-P`!
+M``````````$```!8&P``_P`V``$``````````0```%@;```,`3```0````$`
+M```!````6!L``!0!-P`!``````````$```!8&P``+`$W``$``````````0``
+M`%@;``!``1```0````$````!````6!L``%0!`P`!``````````$```!8&P``
+M6`$A``$````!`````0```%@;``!<`3<``0`````````!````6!L``&`!-P`!
+M``````````$```!8&P``9`%;``$``````````0```%@;``!H`5(``0``````
+M```!````6!L``&P!4@`!`````0````$```!8&P``=`$W``$``````````0``
+M`%@;``!X`0,``0`````````!````6!L``'P!-P`!``````````$```!8&P``
+MB`%```$``````````````%@;``")`4$``0``````````````6!L``(H!2``!
+M``````````````!8&P``BP%#``$``````````````%@;``",`4H``0``````
+M````````6!L``(T!2P`!``````````````!8&P``CP%,``$`````````````
+M`%@;``"G#X```0``````````````6!L``*@/@0`!``````````````!8&P``
+MJ0^"``$``````````````%@;``"J#X,``0``````````````6!L``*L/A``!
+M``````````````!8&P``K`^%``$``````````````%@;``"M#X8``0``````
+M````````6!L``*X/AP`!``````````````!8&P``KP^(``$`````````````
+M`%@;``"P#XD``0``````````````6!L``+$/B@`!``````````````!8&P``
+ML@^+``$``````````````%@;``"S#XP``0``````````````6!L``+0/C0`!
+M``````````````!8&P``M0^.``$``````````````%@;``"V#X\``0``````
+M````````6!L``+</D``!``````````````!8&P``N`^1``$`````````````
+M`%@;``"0`4(``0`````````!````6!L``(X!`P`!``````````$```!8&P``
+MF`%%``$````!`````0```%@;``":`44``0``````````````6!L``)L!10`!
+M``````````````!8&P``G`%>``$``````````````%@;``">`0,``0``````
+M```!````6!L``*P!-P`!``````````$```!8&P``I@$#``$``````````0``
+M`%@;``"V`3<``0`````````!````6!L``+@!-P`!``````````$```!8&P``
+MN@$W``$``````````0```%@;``"^`2$``0````$````!````6!L``"<#`P`!
+M``````````$```!8&P``R@%=``$``````````````%@;``#6`3<``0``````
+M```!````6!L``.0!$``!`````0````$```!8&P``[`$P``$````!`````0``
+M`%@;``#X`0,``0`````````!````6!L``!`"-P`!``````````$```!8&P``
+M*@(B``$``````````0```%@;``!"`C<``0`````````!````6!L````"6P`!
+M``````````$```!8&P``2@(#``$``````````0```%@;``!/`A```0````$`
+M```!````6!L``%P"4@`!``````````$```!8&P``8`([``$````!`````0``
+M`%@;``!H`C<``0`````````!````6!L``&P"-P`!``````````$```!8&P``
+M=@(0``$````!`````0```%@;``!Z`@,``0`````````!````6!L``(("`P`!
+M``````````$```!8&P``@P(#``$``````````0```%@;``"J`B$``0``````
+M```!````6!L``+X"6P`!`````0````$```!8&P``OP(W``$``````````0``
+M`%@;``#!`C<``0`````````!````6!L``,8".P`!``````````$```!8&P``
+MU`(W``$``````````0```%@;``#P`C<``0`````````!````6!L``/0"-P`!
+M``````````$```!8&P``^`(#``$``````````0```%@;``">`%```0````$`
+M```!````6!L``/P"`P`!``````````$```!8&P``#`,P``$``````````0``
+M`%@;```4`S8``0`````````!````6!L``!@#-@`!``````````$```!8&P``
+M)`,#``$``````````0```%@;```0`P,``0`````````!````6!L``#H#-P`!
+M``````````$```!8&P``2`,0``$````!`````0```,$6``!*`Q(``0````$`
+M```!````6!L``%H#$0`!``````````$```!8&P``7`,Z``$````!`````0``
+M`%@;``!>`U8``0`````````!````6!L``,`"`P`!``````````$```!8&P``
+M=P,#``$``````````0```%@;``#,`@,``0`````````!````6!L````````S
+M$ST3%P`*!0``````````$``````````0`````````$<341,7``H%````````
+M```0`````````!``````````.!-T$Q<`%!0``````````!``````````!P``
+M``````!.$WL3&P8%!0```````````0```````````````````%$3>1,>!@H%
+M```````````!````````````````````5A-T$R$&%`4```````````$`````
+M``````````````"K$[`3%P`*!0``````````$``````````,`````````+`3
+MV!,7`!04```````````0``````````(`````````OQ._$Q<`"@4`````````
+M`!``````````#```````````%'@4!084%```````````````````````````
+M`````#(4;A07`!04```````````8``````````$`````````,A1N%!0`%!0`
+M`````````!@``````````0`````````\%'@4#P`4%```````````!0``````
+M`````````````#P4>!01!A04```````````!``````````$`````````/!1X
+M%!(`%!0```````````4````````````````````\%'@4%``4%```````````
+M!0```````````````````#P4>!07`!04```````````%````````````````
+M````/!1X%!<&%!0```````````$````````````````````\%,@4%`84%`(`
+M````````!````````````````````'@4H!07`!04`0`````````%````````
+M````````````C!2@%!<`%!0#``````````4```````````````````",%,@4
+M$@`4%`,`````````!0```````````````````(P4R!04`!04!P`````````%
+M@```````````````````C!3(%!0&%!0#``````````$``````````@``````
+M``",%,@4%P84%`,``````````0`````````"`````````(P4R!07!A04`P``
+M```````!````````````````````C!3(%!X`%!0`````````````````````
+M``````````",%$06!084%`,``````````````````````````````*`4R!01
+M!A04`P`````````!````````````````````?!7T%1X&%!0"``````````0`
+M``````````````````!\%406%`84%`,``````````0`````````$````````
+M`'P51!8;`!04`P`````````%````````````````````?!5$%AX`%!0#````
+M``````4```````````````````!\%406%P`4%`<``````````8``````````
+M`````````'$6K187`!04````````````````````````````````<1:M%AX&
+M%!0```````````````````````````````!Q%JT6'@84%`(`````````!```
+M`````````````````'$6P18%!A04````````````````````````````````
+M<1;!%A$`%!0```````````````````````````````!Q%L$6%``4%```````
+M`````````````````````````'$6P18>`!04````````````````````````
+M````````<1;!%AX&%!0``````````````````````P````````!Q%L$6'@84
+M%````````````````````````````````#@3=!,>`!04````````````!```
+M````````````````L!/8$QX`%!0````````````$```````````````````R
+M%&X4'@`4%`,```````````0``````````````````#P4>!0>`!04`P``````
+M````!```````````````````C!3(%!X`%!0#```````````$````````````
+M``````!Q%L$6'@`4%`````````````0``````````````````'P51!8>`!04
+M`P``````````!```````````````````C!3(%!X`%!0`````````````````
+M```````````````\%'@4'@`4%````````````````````````````````,$6
+MP18>`!04````````````!```````````````````"A1:%`4&*"@`````````
+M``````````````````````""%-(4!08H*`$`````````````````````````
+M`````/H4<A4%!B@H````````````````````````````````FA42%@4&*"@!
+M```````````````````````````````>%$84!08H*```````````````````
+M`````````````&X4OA0%!B@H`0``````````````````````````````YA1>
+M%04&*"@```````````````````````````````"&%286!08H*`$`````````
+M`````````````````````%`4>!01!B@H````````````````````````````
+M````4!1X%!<&*"@```````````````````````````````!:%%H4$08H*```
+M`````````````````````````````%H46A07`"@H````````````````````
+M````````````H!2@%!<&*"@!``````````(```````````````````"@%*`4
+M%`8H*`$``````````@```````````````````((4@A01`"@H`0`````````"
+M````````````````````JA2J%!0`*"@!``````````(`````````````````
+M``""%*H4%``H*`$``````````@```````````````````((4JA07!B@H`0``
+M```````"````````````````````I!4<%A0&*"@!``````````(`````````
+M``````````"`%J@6%``H*````````````````````````````````(`6J!8>
+M!B@H````````````````````````````````A1:M%AX&*"@`````````````
+M``````````````````!:%((4#P`H*`,```````````0`````````````````
+M`*H4JA02`"@H`P``````````!```````````````````I!4<%A0`*"@#````
+M```````$``````````````````"`%J@6%``H*`````````````0`````````
+M``````````@)1`D%!A0%````````````````````````````````"`E$"10`
+M%`4```````````````````````````````!L":@)!084!0``````````````
+M`````````````````&P)J`D4`!0%```````````@````````````````````
+M;`FH"1X`%`4```````````````````````````````!L"9X)&P84!0``````
+M`````````````````````````&P)G@D4`!0%```````````@````````````
+M````````@`F*"10`%`4```````````````````````````````"9":@)%``4
+M!0```````````````````````````````*,)J`D4`!0%```````````@(```
+M````````````````M`FT"04&%`4```````````````````````````````"T
+M";0)%``4!0``````````("@``````````````````-`)K`H%!A0%````````
+M````````````````````````"`E$"10`%`4`````````````````````````
+M``````!L"6P)%``4!0```````````````````````````````'$)@`D4`!0%
+M````````````````````````````````A0F*"10`%`4`````````````````
+M``````````````"/"9D)%``4!0```````````````````````````````)X)
+MG@D4`!0%````````````````````````````````HPFC"10`%`4`````````
+M```$``````"```````````"C":,)%``4!0```````````````````(``````
+M`````*@)J`D4`!0%````````````!```````@```````````J`FH"10`%`4`
+M``````````````````"```````````"T";0)%``4!0````````````0`````
+M`(```````````+0)M`D4`!0%````````````````````@```````````"`E$
+M"04&%`4````````````````````````````````("40)%``4!0``````````
+M`````````````````````&P)J`D%!A0%````````````````````````````
+M````;`FH"10`%`4``````````$````````````````````!L":@)'@`4!0``
+M`````````````````````````````&P)G@D;!A0%````````````````````
+M````````````;`F>"10`%`4``````````$````````````````````"`"8H)
+M%``4!0```````````````````````````````)D)J`D4`!0%````````````
+M````````````````````T`FL"@4&%`4`````````````````````````````
+M``"C":@)%``4!0``````````("````````````````````@)1`D4`!0%````
+M````````````````````````````;`EL"10`%`4`````````````````````
+M``````````!Q"8`)%``4!0```````````````````````````````(4)B@D4
+M`!0%````````````````````````````````CPF9"10`%`4`````````````
+M``````````````````">"9X)%``4!0``````````````````````````````
+M`*,)HPD4`!0%````````````!```````@```````````HPFC"10`%`4`````
+M``````````````"```````````"H":@)%``4!0````````````0``````(``
+M`````````*@)J`D4`!0%````````````````````@```````````"`E$"04&
+M*"@```````````````````````````````"%"84)!08H*```````````````
+M`````````````````(4)A0D4!B@H````````````````````````````````
+MA0F%"1(&*"@````````````$``````````````````#0":P*!08H*```````
+M`````````````````````````/\!$````````0``````````````````````
+M``````````(`""```````````````/\`````````````````````$20`````
+M````````````!10```````````````````4"```````````````````3````
+M````````````````4`$0````````````````````````````````````````
+M``````$`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````!0`A`````````````````````````````````````````````$````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````%`#
+M$```````````````````````````````````````````$`@`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````4`00````````
+M````````````````````````````````@```@```````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````!0!1``````````````````
+M``````````````````````````!`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````%`&,````````@`````````#````````
+M`````````````(!``(`````````````````("0``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````4`@P`````````````````````````````P``````
+M```````$``$`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````!0"3````````(`````````!``````````#````````````!"`0
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`#`!,````````@`````````$``````````,```````````!`@```"```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````,`(P````
+M```"``````````0``````````P``````````0```````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````P`S````````(`````
+M````!``````````#````````````0`````@`````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````#`$,````````@`````````$````
+M``````,``````````$`@````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````,`4P```````"``````````0``````````P``
+M````````$```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````P!C````````(`````````!``````````#````````````
+M$0`!````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````!`!$````````````````````````````````````````"```0`"````
+M```````````$$@``````````````````$2``````````````````````````
+M````````````````````````````````````````````````````````(`$0
+M``````````````````````````````````````````("``0`````````````
+M```````````````````````2(```````````````````````````````````
+M``````````````````````````````````````````````!@`1````````$`
+M`````````P`````````````````````@@$```@``````````````Q!``````
+M`````````````"$$````````````````````````````````````````````
+M`````````````````````````````````````&4!$````````0`````````#
+M````````````````````.```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````0`%```````````````````@`````````
+M`@``````````!```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````!``D``````````````````$``````````"````````
+M`,<%````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````$`#0```````````````````@`````````(``````````(``````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M0`1````````$``````````"``````````@``````````@$``````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!`!4``````
+M``0``````````(`````````"``````````"`0``"````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````$`&0```````````````
+M```(``````````(``````````(@`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````0`=````````$``````````B`````
+M`````@``````````A$``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````!`"$````````0`````````"(`````````"````
+M``````"$0``"````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````$`)0```````````````````@`````````(`````````QX$`
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````0`M````````$``````````"``````````@````````#'@4``````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````!0#?\`
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````H`````````````````
+M```*`````````````````````````````````````````#`*_P``````````
+M``````"```````````,`````````````````````````````````````````
+M``````````````````````````````````$````````````````````!````
+M```````````````$````````````````````,`LP```````````````````!
+M`````````P``````````````````````````````````````````````````
+M``````````````````````"`````````````````````@```````````````
+M``````0````````````````````P##````````````````````(````````#
+M````````````````````````````````````````````````````````````
+M`````````````!`````````````````````0````````````````````!```
+M`````````````````!`*$```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````(````````````````````"`````````````````````$````````````
+M````````0`I``````````````````&!X`````````@``````````````````
+M``````````````````````````````````````````````````````!`"@``
+M````````````````0`0```````````````````0```````````````````!0
+M"D``````````````````````````````````````````````````````````
+M``````````````````````````````````````````````@`````````````
+M```````(````````````````````!````````````````````)D!,```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````"`````````````````````@`
+M```````````````````$````````````````````8`#_```````#````````
+M```$````````"````````````````.`#``````````````#``@``````````
+M````````````````````````````P*\``````````````````/`+````````
+M``````````@```````````````````!F`/\```````,```````````0`````
+M```(````````````````X`,``````````````,`"````````````````````
+M``````````````````#`!P``````````````````\`$`````````````````
+M"````````````````````&<`_P```````P``````````!`````````@`````
+M``````````#@`P``````````````P`(`````````````````````````````
+M`````````,`O``````````````````#P"P`````````````````(````````
+M````````````:`#_```````#```````````$````````"```````````````
+M`.`#``````````````#``@``````````````````````````````````````
+MP%<``````````````````/`5``````````````````@`````````````````
+M``!A`/\```````,```````````0````````0````````````````X`,`````
+M``````````````````````````````````````````````````#`KP``````
+M````````````\`L`````````````````"````````````````````&(`_P``
+M`````P``````````!````````!````````````````#@`P``````````````
+MP`(``````````````````````````````````````,"O````````````````
+M``#P"P`````````````````(````````````````````8P#_```````#````
+M```````$````````"````````````````.`!``````````````#``@``````
+M````````````````````````````````P"\``````````````````/`+````
+M``````````````@```````````````````!D`/\```````,```````````0`
+M```````0```````````````(`!P``````````````,`"````````````````
+M``````````````````````#`!P``````````````````\`$`````````````
+M````"````````````````````&4`_P```````P``````````!````````!``
+M``````````````"$"```````````````````````````````````````````
+M`````````````,!7``````````````````#P%0`````````````````(````
+M````````````````:0#_```````#```````````$````````$```````````
+M`````,`#``````````````#``@``````````````````````````````````
+M````P`<``````````````````/`!``````````````````@`````````````
+M``````!J`/\```````,```````````0````````0````````````````P`,`
+M``````````````````````````````````````````````````````#`+P``
+M````````````````\`L`````````````````"````````````````````)@!
+M_P``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`#P`/,`B('P
+M`/,`00"``(,`B8&``(,`2`#R`/4`BH'R`/4`0P#V`/<`BX'V`/<`2@#Q`/0`
+MC('Q`/0`2P"!`(0`C8&!`(0`3`""`(4`CX&"`(4``````(@!\`#S`(D!@`"#
+M`(H!\@#U`(L!]@#W`(P!\0#T`(T!@0"$`(\!@@"%``````````@`````````
+M``````````````````````````````````````$"<!<+`(P```````$"*",/
+M`!(```````$"X"X*`)@"``````$"4$8.`"0"``````$"P%T)`+`$``````$"
+MH(P-`$@$``````$"@+L(`&`$``````$"\-(,`&P$````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````(````````````````````````````````````````````
+M```!`W`7"P",```````!`R@C#P`2```````!`^`N"@"8`@`````!`U!&#@`D
+M`@`````!`\!="0"P!``````!`Z",#0!(!``````!`X"["`!@!``````!`_#2
+M#`!L!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````"```````````````````
+M`````````````````````````````0)P%PL`C````````0(H(P\`$@``````
+M`0+@+@H`F`(``````0)01@X`)`(``````0+`70D`L`0``````0*@C`T`2`0`
+M`````0*`NP@`8`0``````0+PT@P`;`0`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````@```````````````````````````````````````````````$#<!<+
+M`(P```````$#*",/`!(```````$#X"X*`)@"``````$#4$8.`"0"``````$#
+MP%T)`+`$``````$#H(P-`$@$``````$#@+L(`&`$``````$#\-(,`&P$````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````$````````````````````````````
+M```````````````````!`.@#"P""```````!`-`'"@2$`0`````!`'P5"02+
+M`0`````!`/@J"`26`0``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````!*(`
+M````````````"*(``$9&/E!&1CY0#*(``&Q!@&1L08!D$*(```.@F0$#H)D!
+M%*(``!#63`00UDP$&*(``$``@!-``(`3'*(``&``X!M@`.`;(*(```J`4PP*
+M@%,,)*(``#O?%``[WQ0`**(``+4!``"U`0``+*(``"`````@````G)@`````
+M````````G)@`````````````G)@`````````````G)@`````````````G)@`
+M````````````G)@`````````````G)@`````````````G)@`````````````
+MG)@`````````````G)@`````````````G)@`````````````G)@`````.```
+M`#@`G)@`````````````G)@`````````````G)@`````````````G)@``/D`
+M!`#Y``0`U)@````````$````G)@`````````````G)@`````````````G)@`
+M````````````G)@`````````````G)@`````````````G)@``````!`````0
+MG)@```````0````$G)@`````````````G)@`````````````G)@`````````
+M````G)@````````````*G)@``(``.`"``#@"G)@```8``@`&````G)@``)(`
+M``"2````G)@``*````"@````G)@```<`!``'``0`U)@``!H````:````G)@`
+M`$@```!(````G)@``!`````0````G)@```@````(````G)@```\````/````
+MG)@``/(```!B````G)@``$^0``!,D```G)@``%H2``":$@``S)@```X````/
+M``````````@```````````````````````````````````````````````$"
+M<!<+`(P```````$"*",/`!(```````$"X"X*`)@"``````$"4$8.`"0"````
+M``$"P%T)`+`$``````$"H(P-`$@$``````$"@+L(`&`$``````$"\-(,`&P$
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(````````````````````````
+M```````````````````````!`K@+"P"&```````!`I01#P`)```````!`G`7
+M"@",`@`````!`B@C#@`2`@`````!`N`N"0"8!``````!`E!&#0`D!``````!
+M`L!="``P!``````!`GAI#``V!```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M"````````````````````````````````````````````````0+<!0L`@P``
+M`````0+*"`\`!````````0*X"PH`A@(``````0*4$0X`"0(``````0)P%PD`
+MC`0``````0(H(PT`$@0``````0+@+@@`&`0``````0*\-`P`&P0`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````<`````````````````````````````````
+M``````````````$#<!<+`(P```````$#X"X*`)@"``````$#4$8.`"0"````
+M``$#P%T)`+`#``````$#H(P-`$@#``````$#@+L(`&`#``````$#\-(,`&P#
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````(````````
+M```````````````````````````````````````!`W`7"P",```````!`R@C
+M#P`2```````!`^`N"@"8`@`````!`U!&#@`D`@`````!`\!="0"P!``````!
+M`Z",#0!(!``````!`X"["`!@!``````!`_#2#`!L!```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````!```````````````````````````````````````````
+M`````0#H`QL`@@```````0#0!QH$A`$``````0!\%1D$BP$``````0#X*A@$
+ME@$`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````P`````````````````
+M``````````````````````````````$`Z`,;`((```````$`T`<:!(0!````
+M``$`?!49!(L"``````$`^"H8!)8#```````"<!<+``P$```````"*",/`!($
+M``````$"X"X*`!@&``````$"4$8.`"0&``````$"P%T)`#`(``````$"H(P-
+M`$@(``````$"@+L(`&`(``````$"\-(,`&P(````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````-```````````````````````````````````````````````!!/H`
+M`P"!`&0"9`(!!/0!!P"!`,D!R0$!!.@#`@""`>0`Y``!!-`'!@"$`J``H``!
+M!+@+`0"&`XP`C``!`G`7"P",!#P`/``!`B@C#P`2!#P`/``!`N`N"@"8!C``
+M,``!`E!&#@`D!C``,``!`L!="0`P""P`+``!`J",#0!(""P`+``!`H"["`!@
+M""P`+``!`O#2#`!L""P`+```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````'0```!\`````````````@/#___\``````````!`````=````'P``````
+M``````"`\/___P``````````$````!T````?````````````````````````
+M````````````'0```!\```````````!_@/C___\``````````$`````=````
+M'P```````````````````````````````````!T````?````````````````
+M````````````````````'0```!\`````````````````````````````````
+M```=````'P````````````.`\/___P``````````(````!T````?````````
+M`````8#X____```````````0````'0```!\````````````!@/C___\`````
+M`````!`````=````'P```````````#^`\/___P``````````0````!T````?
+M````````````````````````````````````'0```!\`````````````````
+M```````````````````=````'P```/0,`````/_`^/___P``````````4```
+M`!T````?`````````````8#X____```````````0````'0```!\`````````
+M```````````````````````````=````'P``````````````````````````
+M`````````!T````?````````````!X#X____```````````@````'0```!\`
+M``````````#_P/C___\``````````&`````=````'P```$@3````````````
+M`````````````````!T````?````X!,`````````````````````````````
+M'0```!\```!`%``````````````````````````````=````'P```'04````
+M`!^`^/___P``````````0````!T````?````$!<`````!X#X____````````
+M```@````'0```!\```!\&````````````````````````!`````=````'P``
+M`)0;`````/^`\/___P``````````D`$``!T````?````G"``````!X#X____
+M```````````@````'0```!\````,(0`````````````````````````````=
+M````'P```,0A`````/_`^/___P``````````@````!T````?````("D`````
+M````````````````````````'0```!\```!P*@``````````````````````
+M`!`````=````'P````@L`````#^`\/___P``````````4````!T````?````
+MF"X`````_\#X____``````````!@````'0```!\```!`,@````#_P/C___\`
+M`````````&`````=````'P```.0T`````/_`^/___P``````````8````!T`
+M```?````+#D`````_X#P____``````````!@````'0```!\````````````#
+M@/#___\``````````"`````=````'P````````````"`\/___P``````````
+M$````!T````?````<$@`````````````````````````````'0```!\```"<
+M2``````````````````````````````=````'P```*A(````````````````
+M`````````````!T````?````W$@``````(#P____```````````0````'0``
+M`!\```"$20`````!@/C___\``````````!`````=````'P```$1*``````>`
+M^/___P``````````(````!T````?````````````!X#X____``````````"@
+M````'0```!\````````````!@/C___\``````````!`````=````'P```"A,
+M`````````````````````````````!T````?````<$P``````X#P____````
+M```````@````'0```!\````430``````@/#___\``````````!`````=````
+M'P```(!-`````````````````````````````!T````?````Q$T`````_X#P
+M____``````````!0````'0```!\````$4```````````````````````````
+M```=````'P```#Q0`````````````````````````````!T````?````````
+M````_\#X____``````````#0`0``'0```!\`````````````````````````
+M```````````=````'P````````````&`^/___P``````````$````!T````?
+M````````````#X#P____```````````P````'0```!\`````````````@/#_
+M__\``````````!`````=````'P```)Q:`````'^`^/___P``````````0```
+M`!T````?````:%L``````X#P____```````````P````'0```!\````(7```
+M```!@/C___\``````````!`````=````'P```.A<``````>`^/___P``````
+M````,````!T````?````L%T`````!X#X____```````````P````'0```!\`
+M``!X7@`````#@/#___\``````````"`````=````'P```````````/^`\/__
+M_P``````````X````!T````?`````````````(#P____```````````0````
+M'0```!\```"L90`````````````````````````````=````'P```-1E````
+M`````````````````````````!T````?````W&4`````````````````````
+M````````'0```!\````````````'@/C___\``````````"`````=````'P``
+M``````````"`\/___P``````````,````!T````?`````````````X#P____
+M```````````@````'0```!\````````````/@/#___\``````````#`````=
+M````'P````````````"`\/___P``````````$````!T````?````````````
+M!X#X____```````````@````'0```!\`````````````````````````````
+M```````=````'P```````````!^`^/___P``````````,````!T````?````
+M````````````````````````````````'0```!\`````````````@/#___\`
+M`````````!`````=````'P````````````>`^/___P``````````(````!T`
+M```?````````````#X#P____```````````P````'0```!\```````````#_
+MP/C___\``````````&`````=````'P````````````"`\/___P``````````
+M$````!T````?`````````````(#P____```````````0````'0```!\`````
+M````````@/#___\``````````!`````=````'P``````````````````````
+M`````````````!T````?`````````````X#P____```````````@````'0``
+M`!\````````````````````````````````````=````'P``````````````
+M`````````````````````!T````?````````````!X#X____```````````@
+M````'0```!\````````````#@/#___\``````````"`````=````'P``````
+M``````.`\/___P``````````(````!T````?````````````!X#X____````
+M```````@````'0```!\````````````!@/C___\``````````!`````=````
+M'P````````````>`^/___P``````````(````!T````?`````````````X#P
+M____```````````@````'0```!\`````````````@/#___\``````````!``
+M```=````'P````````````.`\/___P``````````(````!T````?````````
+M````````````````````````````'0```!\`````````````````````````
+M```````````=````'P````````````>`^/___P``````````(````!T````?
+M````````````#X#P____```````````P````'0```!\`````````````@/#_
+M__\``````````!`````=````'P````````````&`^/___P``````````$```
+M`!T````?````````````#X#P____```````````P````'0```!\`````````
+M```!@/C___\``````````!`````=````'P````````````>`^/___P``````
+M````(````!T````?````````````!X#X____```````````@````'0```!\`
+M```````````!@/C___\``````````!`````=````'P````````````^`\/__
+M_P``````````,````!T````?`````````````8#X____```````````0````
+M'0```!\````````````````````````````````````=````'P``````````
+M``>`^/___P``````````(````!T````?````````````#X#P____````````
+M```P````'0```!\````````````!@/C___\``````````!`````=````'P``
+M`````````````````````````````````!T````?````````````````````
+M````````````````'0```!\````````````````````````````````````=
+M````'P```````````````````````````````````!T````?````````````
+M````````````````````````'0```!\`````````````@/#___\`````````
+M`!`````=````'P````````````"`\/___P``````````$````!T````?````
+M`````````(#P____```````````0````'0```!\```#8?0`````/@/#___\`
+M`````````#`````=````'P```'1^`````'^`^/___P``````````0````!T`
+M```?````U'\`````#X#P____```````````P````'0```!\````````````'
+M@/C___\``````````"`````=````'P````````````"`\/___P``````````
+M$````!T````?`````````````8#X____```````````0````'0```!\`````
+M````````@/#___\``````````!`````=````'P````````````"`\/___P``
+M````````$````!T````?`````````````(#P____```````````0````'0``
+M`!\````````````/@/#___\``````````#`````=````'P````````````&`
+M^/___P``````````$````!T````?`````````````8#X____```````````0
+M````'0```!\````````````'@/C___\``````````"`````=````'P``````
+M``````.`\/___P``````````(````!T````?`````````````X#P____````
+M```````@````'0```!\`````````````@/#___\``````````!`````=````
+M'P````````````"`\/___P``````````$````!T````?````````````````
+M````````````````````'0```!\````````````/@/#___\``````````#``
+M```=````'P```````````/_`^/___P``````````8````!T````?````S(\`
+M````!X#X____```````````@````'0```!\`````````````@/#___\`````
+M`````!`````=````'P````````````"`\/___P``````````$````!T````?
+M`````````````X#P____```````````@````'0```!\````````````#@/#_
+M__\``````````"`````=````'P```````````/_`^/___P``````````8```
+M`!T````?````()8`````#X#P____```````````P````'0```!\```#DE@``
+M```````````````````````````=````'P````"8````````````````````
+M`````````!T````?````````````````````````````````````'0```!\`
+M``!LF0````!_@/C___\``````````%`````=````'P````````````^`\/__
+M_P``````````D````!T````?````\*``````!X#X____```````````@````
+M'0```!\`````````````@/#___\``````````!`````=````'P``````````
+M`!^`^/___P``````````,````!T````?````````````````````````````
+M````````'0```!\````````````````````````````````````=````'P``
+M``````````"`\/___P``````````$````!T````?`````````````(#P____
+M```````````0````'0```!\````````````?@/C___\``````````#`````=
+M````'P```````````````````````````````````!T````?````````````
+M'X#X____```````````P````'0```!\`````````````@/#___\`````````
+M`!`````=````'P````````````"`\/___P``````````$````!T````?````
+M````````!X#X____```````````@````'0```!\````````````#@/#___\`
+M`````````"`````=````'P````````````"`\/___P``````````$````!T`
+M```?````````````#X#P____```````````P````'0```!\`````````````
+M```````````````````````=````'P``````````````````````````````
+M`````!T````?````````````````````````````````````'0```!\`````
+M```````````````````````````````=````'P``````````````````````
+M`````````````!T````?````````````````````````````````````'0``
+M`!\````````````````````````````````````=````'P````"O``````>`
+M^/___P``````````(````!T````?````````````_X#P____``````````!@
+M````'0```!\````````````!@/C___\``````````!`````=````'P````2U
+M`````/_`^/___P``````````<````!T````?````J+8`````````````````
+M````````````'0```!\```#\M@`````````````````````````````=````
+M'P````2W``````^`\/___P``````````0````!T````?````````````!X#X
+M____```````````@````'0```!\`````````````@/#___\``````````#``
+M```=````'P````````````.`\/___P``````````(````!T````?````````
+M````#X#P____```````````P````'0```!\`````````````@/#___\`````
+M`````!`````=````'P````````````.`\/___P``````````(````!T````?
+M````````````````````````````````````'0```!\````````````?@/C_
+M__\``````````#`````=````'P``````````````````````````````````
+M`!T````?`````````````(#P____```````````0````'0```!\`````````
+M```'@/C___\``````````"`````=````'P````````````^`\/___P``````
+M````,````!T````?````````````_\#X____``````````!@````'0```!\`
+M````````````@/#___\``````````!`````=````'P````````````"`\/__
+M_P``````````$````!T````?`````````````(#P____```````````0````
+M'0```!\````````````````````````````````````=````'P``````````
+M``>`^/___P``````````(````!T````?````````````````````````````
+M````````'0```!\````````````````````````````````````=````'P``
+M``````````>`^/___P``````````(````!T````?`````````````X#P____
+M```````````@````'0```!\````````````#@/#___\``````````"`````=
+M````'P````````````>`^/___P``````````(````!T````?````````````
+M`8#X____```````````0````'0```!\````````````#@/#___\`````````
+M`"`````=````'P````````````.`\/___P``````````(````!T````?````
+M````````!X#X____```````````@````'0```!\````````````/@/#___\`
+M`````````#`````=````'P````````````"`\/___P``````````$````!T`
+M```?`````````````8#X____```````````0````'0```!\````````````/
+M@/#___\``````````#`````=````'P````````````&`^/___P``````````
+M$````!T````?````````````!X#X____```````````@````'0```!\`````
+M```````'@/C___\``````````"`````=````'P````````````&`^/___P``
+M````````$````!T````?````````````#X#P____```````````P````'0``
+M`!\````````````!@/C___\``````````!`````=````'P``````````````
+M`````````````````````!T````?````````````!X#X____```````````@
+M````'0```!\````````````/@/#___\``````````#`````=````'P``````
+M``````&`^/___P``````````$````!T````?````````````````````````
+M````````````'0```!\````````````````````````````````````=````
+M'P```````````````````````````````````!T````?````````````````
+M````````````````````'0```!\`````````````````````````````````
+M```=````'P````````````"`\/___P``````````$````!T````?````````
+M`````(#P____```````````0````'0```!\`````````````@/#___\`````
+M`````!`````=````'P```````````````````````````````````!T````?
+M`````````````(#P____```````````0````'0```!\`````````````@/#_
+M__\``````````!`````=````'P````````````"`\/___P``````````$```
+M`!T````?`````````````(#P____```````````0````'0```!\```"LT```
+M``!_@/C___\``````````$`````=````'P````S2``````^`\/___P``````
+M````,````!T````?````J-(`````#X#P____```````````P````'0```!\`
+M```````````'@/C___\``````````"`````=````'P````````````"`\/__
+M_P``````````$````!T````?`````````````8#X____```````````0````
+M'0```!\`````````````@/#___\``````````!`````=````'P``````````
+M``"`\/___P``````````$````!T````?`````````````(#P____````````
+M```0````'0```!\````````````!@/C___\``````````!`````=````'P``
+M``````````&`^/___P``````````$````!T````?`````````````8#X____
+M```````````0````'0```!\````````````'@/C___\``````````"`````=
+M````'P````````````.`\/___P``````````(````!T````?````````````
+M`X#P____```````````@````'0```!\`````````````@/#___\`````````
+M`!`````=````'P````````````"`\/___P``````````$````!T````?````
+M````````````````````````````````'0```!\````````````'@/C___\`
+M`````````"`````=````'P```````````/_`^/___P``````````H````!T`
+M```?`````````````(#P____```````````0````'0```!\````````````!
+M@/C___\``````````!`````=````'P````````````.`\/___P``````````
+M(````!T````?````````````_\#X____``````````!0````'0```!\```#H
+MZ@`````'@/C___\``````````"`````=````'P```+3K`````!^`^/___P``
+M````````,````!T````?````&.T``````(#P____```````````0````'0``
+M`!\```!<[0`````?@/C___\``````````#`````=````'P```(CN````````
+M`````````````````````!T````?````W.X``````X#P____```````````P
+M````'0```!\````````````?@/C___\``````````$`````=````'P``````
+M`````````````````````````````!T````?````)/$`````_\#X____````
+M``````!@````'0```!\````````````'@/C___\``````````"`````=````
+M'P```+#U`````/^`\/___P``````````4````!T````?`````````````(#P
+M____```````````0````'0```!\````````````?@/C___\``````````$``
+M```=````'P```#S[`````/_`^/___P``````````8````!T````?````O/\`
+M````_\#X____``````````"0````'0```!\`````!@$```#_@/#___\`````
+M`````'`````=````'P```)@'`0```````````````````````````!T````?
+M````)`@!````````````````````````````'0```!\````@"0$`````````
+M```````````````````=````'P```$0*`0````"`\/___P``````````$```
+M`!T````?````````````````````````````````````'0```!\```#H"@$`
+M```````````````````````````=````'P```&P+`0````&`^/___P``````
+M````$````!T````?````````````!X#X____```````````@````'0```!\`
+M``"D#`$````````````````````````````=````'P```-0,`0``````````
+M`````````````````!T````?````A`X!````````````````````````````
+M'0```!\```#(#@$````'@/C___\``````````"`````=````'P``````````
+M``"`\/___P``````````$````!T````?````````````!X#X____````````
+M```@````'0```!\`````````````@/#___\``````````!`````=````'P``
+M``````````"`\/___P``````````$````!T````?````````````'X#X____
+M```````````P````'0```!\```"$$@$````'@/C___\``````````"`````=
+M````'P````````````"`\/___P``````````$````!T````?````````````
+M/X#P____``````````!`````'0```!\`````````````@/#___\`````````
+M`!`````=````'P````````````"`\/___P``````````$````!T````?````
+M`````````(#P____```````````0````'0```!\````````````/@/#___\`
+M`````````#`````=````'P```````````!^`^/___P``````````,````!T`
+M```?````````````````````````````````````'0```!\`````````````
+M```````````````````````=````'P``````````````````````````````
+M`````!T````?````````````````````````````````````'0```!\`````
+M```````````````````````````````=````'P``````````````````````
+M`````````````!T````?````````````````````````````````````'0``
+M`!\```!8'@$````#@/#___\``````````"`````=````'P````````````>`
+M^/___P``````````(````!T````?````\!\!`````(#P____``````````!P
+M````'0```!\````@(0$````````````````````````````=````'P``````
+M`````#^`\/___P``````````0````!T````?````*"(!````````````````
+M````````````'0```!\```````````!_@/C___\``````````%`````=````
+M'P````````````&`^/___P``````````$````!T````?````````````_\#X
+M____``````````!P````'0```!\`````````````````````````````````
+M```=````'P````````````^`\/___P``````````0````!T````?````9#(!
+M`````(#P____```````````@````'0```!\`````````````````````````
+M```````````=````'P````````````>`^/___P``````````,````!T````?
+M`````````````(#P____```````````P````'0```!\````````````#@/#_
+M__\``````````"`````=````'P```````````#^`\/___P``````````0```
+M`!T````?````````````!X#X____```````````@````'0```!\`````````
+M```#@/#___\``````````"`````=````'P````````````.`\/___P``````
+M````(````!T````?````````````!X#X____```````````@````'0```!\`
+M```````````!@/C___\``````````!`````=````'P````````````>`^/__
+M_P``````````(````!T````?`````````````(#P____```````````0````
+M'0```!\```````````!_@/C___\``````````$`````=````'P``````````
+M`````````````````````````!T````?````````````/X#P____````````
+M``!`````'0```!\````````````````````````````````````=````'P``
+M``````````"`\/___P``````````$````!T````?````````````_\#X____
+M``````````!0````'0```!\````````````/@/#___\``````````#`````=
+M````'P```````````/_`^/___P``````````<````!T````?````````````
+M`(#P____```````````0````'0```!\`````````````@/#___\`````````
+M`!`````=````'P````````````"`\/___P``````````$````!T````?````
+M`````````X#P____```````````@````'0```!\`````````````````````
+M```````````````=````'P```````````````````````````````````!T`
+M```?````````````!X#X____```````````@````'0```!\````````````#
+M@/#___\``````````"`````=````'P````````````>`^/___P``````````
+M(````!T````?````````````#X#P____```````````P````'0```!\`````
+M````````@/#___\``````````!`````=````'P````````````>`^/___P``
+M````````(````!T````?`````````````X#P____```````````@````'0``
+M`!\````````````/@/#___\``````````#`````=````'P````````````&`
+M^/___P``````````$````!T````?````````````!X#X____```````````@
+M````'0```!\````````````````````````````````````=````'P``````
+M``````"`\/___P``````````$````!T````?`````````````(#P____````
+M```````0````'0```!\`````````````@/#___\``````````!`````=````
+M'P```````````````````````````````````!T````?`````````````(#P
+M____```````````0````'0```!\`````````````````````````````````
+M```=````'P````````````>`^/___P``````````(````!T````?````````
+M`````8#X____```````````0````'0```!\````````````/@/#___\`````
+M`````#`````=````'P````````````&`^/___P``````````$````!T````?
+M````````````````````````````````````'0```!\````````````'@/C_
+M__\``````````"`````=````'P````````````^`\/___P``````````,```
+M`!T````?`````````````8#X____```````````0````'0```!\`````````
+M```?@/C___\``````````#`````=````'P````````````^`\/___P``````
+M````,````!T````?`````````````(#P____```````````0````'0```!\`
+M```````````````````````````````````=````'P````````````>`^/__
+M_P``````````(````!T````?````````````!X#X____```````````@````
+M'0```!\````````````````````````````````````=````'P``````````
+M``.`\/___P``````````(````!T````?`````````````X#P____````````
+M```@````'0```!\`````````````@/#___\``````````!`````=````'P``
+M`-Q>`0```'^`^/___P``````````0````!T````?````/&`!````#X#P____
+M```````````P````'0```!\```#@8`$````/@/#___\``````````#`````=
+M````'P````````````>`^/___P``````````(````!T````?````````````
+M`(#P____```````````0````'0```!\````````````!@/C___\`````````
+M`!`````=````'P````````````"`\/___P``````````$````!T````?````
+M`````````(#P____```````````0````'0```!\`````````````@/#___\`
+M`````````!`````=````'P````````````&`^/___P``````````$````!T`
+M```?`````````````8#X____```````````0````'0```!\````````````!
+M@/C___\``````````!`````=````'P````````````>`^/___P``````````
+M(````!T````?`````````````X#P____```````````@````'0```!\`````
+M```````#@/#___\``````````"`````=````'P````````````>`^/___P``
+M````````(````!T````?````````````!X#X____```````````@````'0``
+M`!\````````````````````````````````````=````'P````````````^`
+M\/___P``````````,````!T````?````````````_\#X____``````````"0
+M````'0```!\````````````#@/#___\``````````"`````=````'P``````
+M``````"`\/___P``````````$````!T````?````````````?X#X____````
+M``````!0````'0```!\````````````#@/#___\``````````"`````=````
+M'P````````````"`\/___P``````````$````!T````?`````````````8#X
+M____```````````0````'0```!\````````````_@/#___\``````````$``
+M```=````'P```````````/_`^/___P``````````4````!T````?````K(@!
+M````!X#X____```````````@````'0```!\`````````````@/#___\`````
+M`````!`````=````'P```"2*`0```````````````````````````!T````?
+M````````````!X#X____```````````P````'0```!\````````````/@/#_
+M__\``````````#`````=````'P```"2,`0````"`\/___P``````````$```
+M`!T````?````````````'X#X____```````````P````'0```!\`````````
+M```````````````````````````=````'P```````````/_`^/___P``````
+M````8````!T````?````````````_\#X____``````````"0````'0```!\`
+M```````````/@/#___\``````````#`````=````'P````````````"`\/__
+M_P``````````(````!T````?````````````'X#X____``````````!`````
+M'0```!\```!\H@$```#_P/C___\``````````)`````=````'P``````````
+M`/^`\/___P``````````8````!T````?````]*D!````!X#X____````````
+M``!`````'0```!\```"0JP$````'@/C___\``````````$`````=````'P``
+M`(RL`0```````````````````````````!T````?````2*T!````?X#X____
+M``````````!@````'0```!\````````````````````````````````````=
+M````'P```````````````````````````````````!T````?````K+`!````
+M`8#X____```````````0````'0```!\```#LL0$````!@/C___\`````````
+M`!`````=````'P````````````>`^/___P``````````(````!T````?````
+MH+,!````````````````````````````'0```!\```#0LP$`````````````
+M```````````````=````'P```'2U`0```!^`^/___P``````````,````!T`
+M```?````````````#X#P____```````````P````'0```!\```````````#_
+MP/C___\``````````%`````=````'P```````````!^`^/___P``````````
+M,````!T````?````````````'X#X____```````````P````'0```!\`````
+M````````@/#___\``````````!`````=````'P````````````"`\/___P``
+M````````$````!T````?````````````/X#P____``````````!`````'0``
+M`!\```#8O0$````'@/C___\``````````"`````=````'P````````````"`
+M\/___P``````````$````!T````?````````````_X#P____``````````!0
+M````'0```!\`````````````@/#___\``````````!`````=````'P``````
+M``````"`\/___P``````````$````!T````?`````````````(#P____````
+M```````0````'0```!\````````````/@/#___\``````````#`````=````
+M'P```````````/^`\/___P``````````4````!T````?````````````````
+M````````````````````'0```!\`````````````````````````````````
+M```=````'P```````````````````````````````````!T````?````````
+M````````````````````````````'0```!\`````````````````````````
+M```````````=````'P```````````````````````````````````!T````?
+M`````````````X#P____```````````@````'0```!\````````````#@/#_
+M__\``````````"`````=````'P```/#.`0``````````````````````````
+M`!T````?````````````````````````````````````'0```!\`````````
+M```!@/C___\``````````!`````=````'P````````````^`\/___P``````
+M````,````!T````?`````````````X#P____```````````@````'0```!\`
+M``````````!_@/C___\``````````'`````=````'P```(S9`0````^`\/__
+M_P``````````,````!T````?````A-H!`````X#P____```````````@````
+M'0```!\````@W`$````#@/#___\``````````"`````=````'P``````````
+M``^`\/___P``````````,````!T````?````````````#X#P____````````
+M```P````'0```!\````````````!@/C___\``````````!`````=````'P``
+M`/CA`0````"`\/___P``````````$````!T````?````M.(!````#X#P____
+M```````````P````'0```!\````````````_@/#___\``````````$`````=
+M````'P```````````````````````````````````!T````?````#.<!````
+M_X#P____``````````!0````'0```!\```"PZ`$````?@/C___\`````````
+M`#`````=````'P```&#J`0```````````````````````````!T````?````
+MP.H!````_\#X____``````````"P````'0```!\```"0\0$`````````````
+M```````````````=````'P```$SR`0```/_`^/___P``````````<`$``!T`
+M```?````N/8!````_X#P____``````````!P````'0```!\```!$^`$`````
+M```````````````````````=````'P```,CX`0````"`\/___P``````````
+M$````!T````?````)/D!`````8#X____```````````0````'0```!\```"$
+M^0$````````````````````````````=````'P```(SY`0``````````````
+M`````````````!T````?`````````````X#P____```````````@````'0``
+M`!\```"\^@$```#_@/#___\``````````%`````=````'P```&#\`0```#^`
+M\/___P``````````0````!T````?````4``"````````````````````````
+M````'0```!\```"H``(```#_P/C___\``````````'`````=````'P```!0)
+M`@```/_`^/___P``````````0`0``!T````?````E`\"````````````````
+M````````````'0```!\```#\#P(````````````````````````````=````
+M'P```)P0`@```/_`^/___P``````````4````!T````?````!!("````````
+M````````````````````'0```!\```!$$P(`````````````````````````
+M```=````'P```+04`@````&`^/___P``````````$````!T````?````%!4"
+M````````````````````````````'0```!\```#$%0(```!_@/C___\`````
+M`````$`````=````'P```+P8`@```'^`^/___P``````````4````!T````?
+M`````````````X#P____```````````@````'0```!\```!0&@(```#_@/#_
+M__\``````````%`````=````'P```/0;`@```#^`\/___P``````````0```
+M`!T````?````Y!\"````_X#P____``````````!0````'0```!\````4)`(`
+M```````````````````````````=````'P```&PD`@``````````````````
+M`````````!T````?````$"4"````_\#X____``````````!@````'0```!\`
+M``#<)@(````````````````````````````=````'P```$0G`@```/_`^/__
+M_P``````````@````!T````?````3"T"````_X#P____``````````!@````
+M'0```!\```!0+P(````!@/C___\``````````!`````=````'P```-`O`@``
+M`````````````````````````!T````?````'#`"````````````````````
+M````````'0```!\```!P,`(```#_P/C___\``````````%`````=````'P``
+M`)PS`@```'^`^/___P``````````4````!T````?`````````````X#P____
+M```````````@````'0```!\```!`-0(```#_@/#___\``````````%`````=
+M````'P```.0V`@```#^`\/___P``````````0````!T````?````I#H"````
+M_\#X____``````````!0````'0```!\````T0`(`````````````````````
+M```````=````'P```(Q``@```````````````````````````!T````?````
+M,$$"````_\#X____``````````!@````'0```!\```#\0@(`````````````
+M```````````````=````'P```&1#`@```/_`^/___P``````````@````!T`
+M```?````;$D"````_X#P____``````````!@````'0```!\```!L2P(````!
+M@/C___\``````````!`````=````'P```.Q+`@``````````````````````
+M`````!T````?````.$P"````````````````````````````'0```!\```",
+M3`(```#_P/C___\``````````%`````=````'P```+A/`@```'^`^/___P``
+M````````4````!T````?`````````````X#P____```````````@````'0``
+M`!\`````+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5G:6YF;P`N<F5L
+M+G1E>'0`+G)E;"YR;V1A=&$`+G)E;"YD871A`"YB<W,`+G)E;"YP9'(`+FUD
+M96)U9RYM96%B:38T````````````````````````````````````````````
+M`````````````!L````&``!P```````````T````&```````````````!```
+M``$````H`````0````8`````````3````%Q1`@````````````0`````````
+M)`````D``````````````#2H`P`(?0``#0````(````$````"````#(````!
+M`````@````````"H40(`J(\`````````````"``````````N````"0``````
+M````````/"4$`%@.```-````!`````0````(````/@````$````#````````
+M`%#A`@!P50`````````````(`````````#H````)``````````````"4,P0`
+M0`````T````&````!`````@```!$````"`````,`````````P#8#`)@!````
+M``````````@`````````30````$``````````````,`V`P!`0P``````````
+M```$`````````$D````)``````````````#4,P0`T!````T````)````!```
+M``@```!2`````0```````````````'H#``````````````````$`````````
+M$0````,```````````````!Z`P!B```````````````!``````````$````"
+M``````````````"\?`,`D!D```X````(````!````!`````)`````P``````
+M````````3)8#`.@1``````````````$`````````````````````````````
+M``````````````````,``@`````````````````#``0`````````````````
+M`P`&``````````````````,`"``````````````````#``$`````````````
+M`````P`)``````````````````,`"P`!````[+@````````2``(`#````-2B
+M````````$@`"`!<```"`7`$``````!(``@`B`````'H````````2``(`+0``
+M`,Q\`0``````$@`"`#@````@'@$``````!(``@!#````V(P!```````2``(`
+M3@```!!H````````$@`"`%D```#,WP$``````!(``@!D````:#T``*0!```1
+M``8`;P```-!D`0``````$@`"`'H```#`:P```````!(``@"%````/%D`````
+M```2``(`D````"A-``"D`0``$0`&`)L````T5`$``````!(``@"F````E$T!
+M```````2``(`L0```!`^`0``````$@`"`+P```#8'`$``````!(``@#'````
+M""L!```````2``(`T@```&`,````````$@`"`-T```"T"P$``````!(``@#H
+M````>.\````````2``(`\P```##-````````$@`"`/X```"8U````````!(`
+M`@`)`0``D*@````````2``(`%`$``"A9`0``````$@`"`!\!``!`'`$`````
+M`!(``@`J`0``S#D!```````2``(`-0$``/1_`0``````$@`"`$`!``!4"0``
+M`````!(``@!+`0``."$!```````2``(`5@$``&"^````````$@`"`&$!``#$
+MR@$``````!(``@!L`0``2*T````````2``(`=P$``+S4````````$@`"`((!
+M``!L$0```````!(``@"=`0``,$@``*0!```1``8`J`$``#A/`0``````$@`"
+M`+,!```PJ@```````!(``@"^`0``\`,````````2``(`R0$``/#-`0``````
+M$@`"`-0!`````````````!````#U`0``3'0````````2``(```(``*Q2`0``
+M````$@`"``L"```D4@$``````!(``@`6`@``N`\!```````2``(`(0(``"QX
+M````````$@`"`"P"``#PQ@```````!(``@`W`@``Z,T````````2``(`0@(`
+M``01`0``````$@`"`$T"``!<PP```````!(``@!8`@``4%`!```````2``(`
+M8P(``&RM````````$@`"`&X"``#,<@```````!(``@!Y`@``**,````````2
+M``(`A`(``/!&`0``````$@`"`(\"```XT````````!(``@":`@``^$\!````
+M```2``(`I0(``%1.`0``````$@`"`+`"``!('P$``````!(``@"[`@``0($!
+M```````2``(`Q@(``+AK````````$@`"`-$"```(40$``````!(``@#<`@``
+M]%X````````2``(`YP(``*S/````````$@`"`/("``#T20$``````!(``@#]
+M`@``2`,````````2``(`"`,``/!.`0``````$@`"`!,#```\L@$``````!(`
+M`@`>`P``Y#<!```````2``(`*0,``"2+`0``````$@`"`#0#``!,=P``````
+M`!(``@`_`P``N+X````````2``(`2@,``)C$````````$@`"`%4#``"4H0``
+M`````!(``@!@`P``;+H!```````2``(`:P,``*"2````````$@`"`'8#```$
+M?0```````!(``@"!`P``8+L!```````2``(`C`,``!2E````````$@`"`)<#
+M``#8`0```````!(``@"F`P``N)X!```````2``(`L0,``%!B`0``````$@`"
+M`+P#``!4SP```````!(``@#'`P``2+<!```````2``(`T@,``+!7`0``````
+M$@`"`-T#``"X8P$``````!(``@#H`P``/`,````````2``(`\P,``"S)````
+M````$@`"`/X#``!4$0$``````!(``@`)!```N!`!```````2``(`%`0``"SF
+M````````$@`"`!\$``"(90```````!(``@`J!```G'<````````2``(`-00`
+M`"`$````````$@`"`$L$``#@B0$``````!(``@!6!```X*T````````2``(`
+M800``+AY````````$@`"`&P$``#<NP```````!(``@!W!```'($!```````2
+M``(`@@0``'3Y````````$@`"`(T$```,00$``````!(``@"8!```4#P!````
+M```2``(`HP0```1M````````$@`"`*X$``"4N0```````!(``@"Y!```;-$!
+M```````2``(`Q`0``'`^`0``````$@`"`,\$```<SP```````!(``@#:!```
+MF',````````2``(`Y00``)0/`0``````$@`"`/`$``"0(@$``````!(``@#[
+M!```8+8!```````2``(`!@4``(Q-`0``````$@`"`!$%```PPP```````!(`
+M`@`<!0``,&8!```````2``(`)P4``,RB````````$@`"`#(%```<R`$`````
+M`!(``@`]!0``[-<````````2``(`2`4``'1Q````````$@`"`%,%``#440$`
+M`````!(``@!>!0``?"H!```````2``(`:04``-@9`0``````$@`"`'0%``"`
+MS@$``````!(``@!_!0`````````````0````C`4``)"D````````$@`"`)<%
+M``!0A0```````!(``@"B!0``J,H!```````2``(`K04``'S/`0``````$@`"
+M`+@%```42P$``````!(``@##!0``\`8````````2``(`U`4``#B_`0``````
+M$@`"`-\%``!L>````````!(``@#J!0``/*L````````2``(`]04```S/````
+M````$@`"```&``"\30$``````!(``@`+!@``..$!```````2``(`%@8``%"$
+M````````$@`"`"$&``"P,@$``````!(``@`L!@``:+X````````2``(`-P8`
+M`-#H````````$@`"`$(&``#8H0```````!(``@!-!@``8)4!```````2``(`
+M6`8``"AH`0``````$@`"`&,&``"T7@$``````!(``@!N!@``4-@````````2
+M``(`>08``&14`0``````$@`"`(0&```XRP```````!(``@"/!@``+,\`````
+M```2``(`F@8``(!9`0``````$@`"`*4&```$O`$``````!(``@"P!@``T-$!
+M```````2``(`NP8``.3/````````$@`"`,8&``#LK@```````!(``@#1!@``
+MR&H````````2``(`W`8``!BZ````````$@`"`.<&``#,2`$``````!(``@#R
+M!@``M'T````````2``(`_08``%`T`@``````$@`"``@'``#T?````````!(`
+M`@`3!P``#$X!```````2``(`'@<``(1,`0``````$@`"`"D'``!X4```I`$`
+M`!$`!@`T!P``M!H!```````2``(`/P<``+CF`0``````$@`"`$H'```8>P``
+M`````!(``@!5!P``Y-0````````2``(`8`<``+2%````````$@`"`&L'``"H
+M?`$``````!(``@!V!P``D$8!```````2``(`@0<``$A)`0``````$@`"`(P'
+M``"\SP$``````!(``@"7!P``R)`````````2``(`H@<``,B!````````$@`"
+M`*T'``"(=0```````!(``@"X!P``%(4````````2``(`PP<``!Q(`0``````
+M$@`"`,X'``"0A`$``````!(``@#9!P``H,4!```````2``(`Y`<``+A```"D
+M`0``$0`&`.\'``#D;0```````!(``@#Z!P``I$L````````2``(`!0@``-RB
+M````````$@`"`!`(``#PA````````!(``@`;"``````````````0````.P@`
+M`*"'````````$@`"`$8(````````"0```!$`!@!6"```B(X!```````2``(`
+M80@``%#%````````$@`"`&P(``!L4`(``````!(``@!W"```K"P!```````2
+M``(`@@@``*!*`0``````$@`"`(T(```,?0```````!(``@"8"```>(H!````
+M```2``(`HP@``!3/````````$@`"`*X(``#@TP```````!(``@"Y"```K+\`
+M```````2``(`Q`@``!1.`0``````$@`"`,\(`````````````!````#>"```
+M),8````````2``(`Z0@``-!.``"D`0``$0`&`/0(```@8@$``````!(``@#_
+M"```)#0!```````2``(`"@D``(SP````````$@`"`!4)``"DD````````!(`
+M`@`@"0``&,P````````2``(`*PD``%@\`0``````$@`"`#8)``#820``I`$`
+M`!$`!@!!"0``$%0!```````2``(`3`D``*3(````````$@`"`%<)``!$9P$`
+M`````!(``@!B"0``$-T!```````2``(`;0D``(S`````````$@`"`'@)````
+M@P```````!(``@"#"0``-,0````````2``(`C@D``&3T````````$@`"`)D)
+M``!4F0```````!(``@"D"0``B&4!```````2``(`KPD``(!+``"D`0``$0`&
+M`+H)``"XQ0```````!(``@#%"0``^,<````````2``(`T`D``*!V````````
+M$@`"`-L)``#$Q`$``````!(``@#F"0`````````````0````]0D``$@<`0``
+M````$@`"```*``"\1@$``````!(``@`+"@``4'`````````2``(`%@H``$!0
+M`0``````$@`"`"$*```$SP```````!(``@`L"@``O$<!```````2``(`-PH`
+M`&!"``"D`0``$0`&`$(*``"@UP```````!(``@!-"@``!+P````````2``(`
+M6`H``(@!````````$@`"`&8*```0/P``I`$``!$`!@!Q"@```-<````````2
+M``(`?`H``$B]````````$@`"`(<*```0````)````!$`!@"9"@``S'0`````
+M```2``(`I`H``(!U````````$@`"`*\*```8/@$``````!(``@"Z"@``<(``
+M```````2``(`Q0H``)SC`0``````$@`"`-`*```,@0```````!(``@#;"@``
+M(,T````````2``(`Y@H``%QD`0``````$@`"`/$*```@6````````!(``@#\
+M"@``G,0!```````2``(`!PL``%C6````````$@`"`!(+``"TS@```````!(`
+M`@`="P``"&0!```````2``(`*`L```0:`0``````$@`"`#,+``"PNP$`````
+M`!(``@`^"P``V,P````````2``(`20L``#"=`0``````$@`"`%0+``!0O0``
+M`````!(``@!?"P``9!P!```````2``(`:@L```A$``"D`0``$0`&`'4+``"P
+M@@```````!(``@"`"P``A,\!```````2``(`BPL``/1I````````$@`"`)8+
+M```\@0```````!(``@"A"P``X!,!```````2``(`K`L``%!]````````$@`"
+M`+<+```(>P```````!(``@#""P``J#0!```````2``(`S0L``%RY`0``````
+M$@`"`-@+``#$UP```````!(``@#C"P``Y%@````````2``(`[@L``!PY`0``
+M````$@`"`/D+``!`$````````!(``@`$#```X`H````````2``(`#PP``'PW
+M`0``````$@`"`!H,``#0>P```````!(``@`E#```I($````````2``(`,`P`
+M``RP`0``````$@`"`#L,``!@<@```````!(``@!&#```>)X!```````2``(`
+M40P``#!(````````$@`"`%P,``",!@```````!(``@!G#```B$<!```````2
+M``(`<@P`````````````$````((,``"T^0```````!(``@"-#```S&D`````
+M```2``(`F`P``.C)`0``````$@`"`*,,``!,<P```````!(``@"N#```*$`!
+M```````2``(`N0P``(C*````````$@`"`,0,``!H&P$``````!(``@#/#```
+M```````````0````[PP``-0)````````$@`"`/H,``"T<````````!(``@`%
+M#0``.'$````````2``(`$`T``&C$````````$@`"`!L-```0;````````!(`
+M`@`F#0``?,<````````2``(`,0T``!`M`0``````$@`"`#P-``!\SP``````
+M`!(``@!'#0``>&@!```````2``(`4@T``.Q\````````$@`"`%T-```<<```
+M`````!(``@!H#0``>'4````````2``(`<PT`````````````$````($-``#\
+MP@```````!(``@",#0``W`T````````2``(`EPT``!1]````````$@`"`*(-
+M``#\U0```````!(``@"M#0``A-`````````2``(`N`T``(R1````````$@`"
+M`,,-``!,@P```````!(``@#.#0``!'4````````2``(`V0T``%Q&`0``````
+M$@`"`.0-``#@8P$``````!(``@#O#0``T'L!```````2``(`^@T``*3&````
+M````$@`"``4.``#0.`$``````!(``@`0#@``+(\!```````2``(`&PX``"AW
+M````````$@`"`"8.```0U````````!(``@`Q#@``4,D````````2``(`/`X`
+M`#RL````````$@`"`$<.``"4PP```````!(``@!2#@``),\````````2``(`
+M70X``'BC````````$@`"`&@.```@4@``I`$``!$`!@!S#@``K'`````````2
+M``(`?@X``(S#````````$@`"`(D.``",9P```````!(``@"4#@``T&H`````
+M```2``(`GPX``%`X`0``````$@`"`*H.``#($````````!(``@"U#@``S,T!
+M```````2``(`P`X``$Q.`0``````$@`"`,L.```PR@```````!(``@#6#@``
+M\*X!```````2``(`X0X``$33````````$@`"`.P.``#,V0```````!(``@#W
+M#@``R%,``*0!```1``8``@\``(PR`0``````$@`"``T/``#H<0```````!(`
+M`@`8#P``Z`@````````2``(`(P\``'QP````````$@`"`"X/``!PRP$`````
+M`!(``@`Y#P``D+X!```````2``(`1`\``/"!````````$@`"`$\/``#0RP``
+M`````!(``@!:#P``E&,!```````2``(`90\``!B"````````$@`"`'`/``!\
+M9@```````!(``@![#P``P'H````````2``(`A@\``,2T````````$@`"`)$/
+M``"H#@```````!(``@"<#P``&!X!```````2``(`IP\``.2H````````$@`"
+M`+(/``!@U0```````!(``@"]#P``_'P````````2``(`R`\``#P3`0``````
+M$@`"`-,/```L90$``````!(``@#>#P``Y/D!```````2``(`Z0\``)Q\````
+M````$@`"`/0/``!@6@```````!(``@#_#P``F%`````````2``(`%1```-!F
+M`0``````$@`"`"`0``"H@P```````!(``@`K$```B&H!```````2``(`-A``
+M`/@Y`0``````$@`"`$$0```T&@$``````!(``@!,$```L-4````````2``(`
+M5Q```$RI````````$@`"`&(0``"`1P```````!(``@!M$```4*T````````2
+M``(`>!```/"0````````$@`"`(,0```,U0```````!(``@".$```".8`````
+M```2``(`F1````1G````````$@`"`*00``#DK@```````!(``@"O$```''D`
+M```````2``(`NA```*`*`0``````$@`"`,40``"$80$``````!(``@#0$```
+MW$P!```````2``(`VQ```*#)````````$@`"`.80``"HKP```````!(``@#Q
+M$```1)T````````2``(`_!```.1-`0``````$@`"``<1``"P&0$``````!(`
+M`@`2$0``<!D"```````2``(`'1$``/1+`0``````$@`"`"@1``#<-@$`````
+M`!(``@`S$0``F($!```````2``(`/A$``/#$`0``````$@`"`$D1````````
+M`````!````!;$0``9+@````````2``(`9A$``'PS`0``````$@`"`'$1````
+M`````````!````""$0``;'$````````2``(`C1$``*3/````````$@`"`)@1
+M``#HJ@```````!(``@"C$0``?$H!```````2``(`KA$``+"H`0``````$@`"
+M`+D1``"<Y@```````!(``@#$$0``%$L````````2``(`W1$``"#%`0``````
+M$@`"``!Z>C`P-6(U.#0V`'IZ,#`R9&(Q,6,`>GHP,F1B9C@W-0!Z>C`R9&)B
+M,6(R`'IZ,#)D8C(P-3,`>GHP,#)D8F$T,@!Z>C!F8F(Q93-F`'IZ,&(W.65A
+M.30`>GHP-6(X8S8U80!Z>C`P-6(T,&%D`'IZ,#5B.30R960`>GHP9#AD8S8R
+M8P!Z>C`P,3EF-#<P`'IZ,#)D9#DT,F0`>GHP,F1B93<S9`!Z>C`P-6(V.3)B
+M`'IZ,&(V9#(S,C4`>GHP,#5B.#4S9`!Z>C`P,39D.3)E`'IZ,&-F8C$X-S4`
+M>GHP,#)D8C,Q8P!Z>C`R9&%B8F%C`'IZ,#)D8F,X-3$`>GHP,#!B-F,V.`!Z
+M>C`P,&(V8F8X`'IZ,#!B-F-F-64`>GHP,39E,61F9`!Z>C!B-F8U,&(X`'IZ
+M,#9E,&$T9F4`>GHP,#8W9#)B,0!Z>C`P,F1B8S8Q`'IZ,&(V8V$S,C4`>GHP
+M,#5B-F-F9`!Z>C`Q-F4P9&9D`'IZ,#`P8C9F-C@`871H7VAA;%]P<F]C97-S
+M7VYO:7-E9FQO;W(`>GHP,#5B-#AA9`!Z>C`R9&)F,6(R`'IZ,#`U8C@X8V(`
+M>GHP,S-E8SAB9@!Z>C!D8C0R-6,U`&%T:%]H86Q?9&UA7V)E86-O;E]R97-P
+M;VYS95]T:6UE`'IZ,#!B-F8Q-C$`>GHP-F4P,&(X80!Z>C`R9&)F8S%D`'IZ
+M,&1C-&4S.3``>GHP9&%F960X-@!Z>C`P8C9E,C=A`'IZ,#)D8F)A8C(`>GHP
+M8C9D,65F9@!Z>C`Q-F0Y,&1D`'IZ,#)D8F4X-3$`>GHP,#5B-C1F9`!Z>C`P
+M,&(V9#4R`'IZ,&(V8SEE9F8`>GHP,39E,#!D9`!Z>C`R9&)D.#<U`'IZ,#)D
+M8C,Q8C(`>GHP,&(W,#DR,P!Z>C`P8C9D-#4P`'IZ,#`P8C9D,60`>GHP8C9C
+M,C,R-0!Z>C`R9&)D86(R`'IZ,#`P-6(V,S(`>GHP-F1E9&0Y,P!Z>C`P,39D
+M834P`'IZ,#`P-C=D,S(`>GHP,&(V9#DR,P!Z>C`P,F1B-3%C`'IZ,#$V9&-B
+M9F4`>GHP,&(W,#$T-0!Z>C`P,39D9C)C`'IZ,&(W9F%D,V4`>GHP,39D.3DR
+M,`!Z>C`R9&(Q8F%C`'IZ,&1C-F4S.3``>GHP-6(W,#%E,`!Z>C`P,&(V8C$P
+M`'IZ,&(W,#EE9F8`>GHP,39D9C@Y8@!A=&A?:&%L7V%T=&%C:`!Z>C`V93!F
+M8S!D`'IZ,#$V9&%B,F0`>GHP,F1B,3,U9`!Z>C!E,#0V.#1B`'IZ,#$V93(Y
+M,60`>GHP,#!B-F9E.`!Z>C`P8V9B,V4P`'IZ,#`Q-F0Y-#@`>GHP,39E,C`Y
+M8@!Z>C!B-S`Q969F`'IZ,#`P8C9C.60`>GHP,#`U8C5A,@!Z>C`R9&(Q-S!A
+M`&%T:%]H86Q?8V]M<'5T971X=&EM90!Z>C`R9&(U8F%C`'IZ,#`U8C@Q,V0`
+M>GHP,&(V8SDR,P!Z>C!B-F(U,&(X`'IZ,#`U8C=F.60`>GHP8C<P,60P,@!Z
+M>C`V9&9F-#1A`'IZ,#)D8C4W-C,`>GHP-F5E868V,`!Z>C!E,#`W8V$Q`'IZ
+M,#`R9&%F-C(`>GHP8C@S860S90!Z>C`P,&(V8CDP`'IZ,#$V9#EE9F$`>GHP
+M,39D93`U,0!Z>C`P,#5B-F(R`'IZ,#5B-V8Q,30`>GHP-&%E,#,Q9@!Z>C`R
+M9&)D9&9D`'IZ,#`U-#=F960`>GHP,&(V8F8U90!Z>C`P8C<Q-S=D`'IZ,#!B
+M-S!F,V0`>GHP,39D.#DR,`!Z>C`R9&(Q86(R`'IZ,#`P-6(V,C(`>GHP,#!B
+M-F8W.`!Z>C!B-CEB,#=C`&%T:%]H86Q?9G)E90!Z>C`U8C<Y8C%B`'IZ,#!B
+M-S`W,V0`>GHP,F1B96)B9`!Z>C!B-64S,34R`'IZ,#$V9&9B9C$`871H7VAA
+M;%]M:'HR:65E90!Z>C`Q-F4Q.#EB`'IZ,&1C,F$U8S4`>GHP,#)D8S8P8@!Z
+M>C`V9&8P8CAA`'IZ,#)D8C,S-60`>GHP8C9C-3-A-`!Z>C!F-31D,6(P`'IZ
+M,&(V9F0S-C,`>GHP9#ED8S8R8P!Z>C`U8C<T,64P`'IZ,#)D83EB86,`>GHP
+M9&,R,60S80!Z>C`P8C<Q-S-D`'IZ,#$V9#ED-#$`>GHP,#5B.#1F9`!Z>C`P
+M-6(X86)D`'IZ,#!B-S`Q,C,`>GHP,#5B-C4R8@!Z>C`R9&(S.#<U`'IZ,#$V
+M93,P.6(`>GHP,#5B-C!B,@!Z>C`R9&(Q.#<U`'IZ,#`R9&(X-#(`>GHP,F1B
+M,3<V,P!Z>C!B-V1E83DT`'IZ,#!B-S`Q-C$`>GHP,39D-V0T,0!Z>C`P,39C
+M9#,R`'IZ,#9D93!B.&$`>GHP-F0Y9&0Y,P!Z>C!D8C-E9#@V`'IZ,#`U8C0X
+M960`>GHP,#)D8S@P8@!Z>C`P,F1B8S0R`'IZ,#)D8F$X-3$`>GHP,F1B,S-E
+M9`!Z>C`P-6(X,&9D`'IZ,#`U8C=F,F4`>GHP,F1B9F1F9`!Z>C`Q-F4V-#AA
+M`'IZ,#`R9&%F9C(`>GHP,#5B-S<Y9`!Z>C`P,&(V964X`'IZ,#$V930T.&$`
+M>GHP,&(V9C9B8P!Z>C`Q-F1A.3(P`'IZ,#5B-S@Q93``>GHP,#)D8V$P8@!Z
+M>C`P-6(T-&%D`'IZ,#9D9&8T-&$`>GHP9F%C,&,Y8@!Z>C!B-F8Y969F`'IZ
+M,#!B-F,V8F,`871H7VAA;%]A9&1I=&EO;F%L7W-W8F%?8F%C:V]F9@!Z>C`P
+M,#)D8CDR`&%T:%]H86Q?=F5R<VEO;@!Z>C`R9&)A8S)E`'IZ,#)D8C<Y864`
+M>GHP,#$V934S,@!Z>C!B-F-F,#`Y`'IZ,#`Q-F4Q,F,`>GHP,#$V9#EE-`!Z
+M>C`P,#)D865A`'IZ,#`U8C5C8C(`>GHP,39D83(U,0!Z>C`V9C9A9C8P`'IZ
+M,#9D9F1D.3,`871H7VAA;%]M86QL;V,`>GHP,#!B-F1D,@!Z>C`R9&0Y,F%D
+M`'IZ,#$V9&(R-3$`>GHP93$P-V-A,0!Z>C`P8C9C-S5E`'IZ,#$V9&0P-3$`
+M>GHP,F1B9#%B,@!Z>C`R9&,Q-S8S`'IZ,&(V.3!D-F0`>GHP,39D9C`U,0!Z
+M>C`P,39D.34P`'IZ,#!B-S`V8F,`>GHP,#$V9#@W,@!Z>C`V9&5F-#1A`'IZ
+M,#5B.&,R960`>GHP-F9B.30W8@!Z>C!E8F(Q93-F`'IZ,&(V9CED,#(`>GHP
+M9#$T9#%B,`!Z>C!B-#@P,S%E`'IZ,#$V9&)B9F4`>GHP,39E-30X80!Z>C`P
+M,39D.#4P`'IZ,#`P8C9F9C@`871H7VAA;%]M96UC<'D`>GHP,F1B8V)B9`!Z
+M>C`Q-F1A,&1D`'IZ,#)D8F)D9F0`>GHP,F1B,C@U,0!Z>C`R9&)D8S%D`'IZ
+M,#9D8C!C9C(`>GHP,39E8CEA9`!Z>C`P8C9C96)C`'IZ,&0Y-#@T83$`871H
+M7VAA;%]P<F]B90!Z>C`Q-F5A.6%D`'IZ,&9D-&0Q8C``>GHP,F1B,S<V,P!A
+M=&A?:&%L7V)U:6QD;W!T<P!Z>C`R9&%F,S5D`'IZ,#9D9&1D.3,`>GHP9&%D
+M8S8R8P!Z>C`Q-F1F,C4Q`'IZ,#`P8C9C,3``>GHP,39D.3(U,0!Z>C`R9&(P
+M.#4Q`'IZ,&(W,C%A960`>GHP-C=C9F-A90!Z>C`P,&(V8V8X`'IZ,&,Y-&0Q
+M8C``>GHP,F1A9F%B,@!Z>C`U8CDR865D`'IZ,#`U8CAC8V(`>GHP8C9D.65F
+M9@!Z>C`R9&(Q,6(R`'IZ,#)D8F9F8C$`>GHP,F1B9C<V,P!Z>C`P-6(V.&9D
+M`'IZ,#`U8C0T960`>GHP8C<Q,6%E9`!Z>C!B-64S,38P`'IZ,&0X-#@T83$`
+M>GHP,39D.&(R9`!Z>C`Q-F4P.#EB`'IZ,#)D8F(X-S4`>GHP,F1A93@U,0!Z
+M>C!B.#%E83DT`'IZ,#$V9&5C,68`>GHP,&(V9F5B8P!Z>C!E.#DT.3`W`'IZ
+M,#!B-F5A-V$`>GHP,S-E.&9B9@!Z>C!C9F$U.#<U`'IZ,#)D8CDY864`>GHP
+M,F1B.6%B,@!Z>C`P,&(V8F4X`'IZ,&1E-C@S-V8`>GHP,39D86)F90!Z>C!B
+M-S`Y9#`R`'IZ,#8W9#(U93(`>GHP,3EF,V$P,0!Z>C`W,#,Y-#=B`&%T:%]H
+M86Q?;65M>F5R;P!Z>C`V9&9F8S!D`'IZ,&(V-S4P8C@`>GHP,39E,F1F9`!Z
+M>C`P,&(V9#(R`'IZ,#9F96%F-C``>GHP9&,T835C-0!Z>C`P8C<P9C=D`&%T
+M:%]H86Q?<W=?8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP.68V-&(V80!Z>C`P
+M-6(V-3=A`'IZ,#9F,SDT-V(`>GHP-F1A,&-F,@!Z>C!B-V)A9#-E`'IZ,#!B
+M-F8Y-C$`>GHP8C8Y-S-B8P!Z>C`R9&)D,S5D`'IZ,#`U8C@X9F0`>GHP,F1B
+M8F,Q9`!Z>C`R9&%F9&9D`'IZ,#9D-V1D.3,`871H7VAA;%]D96QA>0!Z>C`R
+M9&(Q9&9D`'IZ,#8W9#)F-#$`>GHP,F1A9C@W-0!Z>C!B-V5D939D`'IZ,#$V
+M9#AD-#$`>GHP,#)D864Y,@!Z>C!B-V%D939D`'IZ,#)D8F(S-60`>GHP,F1B
+M,V1F9`!Z>C`R9&(U,V5D`'IZ,#$V9&-E864`>GHP,#!B-F1A,@!Z>C`P,&(V
+M93(R`'IZ,#5B.#`P-#$`>GHP,#$V9#@T.`!Z>C`Q-F0Y8C)D`'IZ,#`Q-F4P
+M,F,`>GHP,&(W,#<W9`!Z>C`P-6(V.3=A`'IZ,#`Q-F1A930`>GHP,39E,3`Y
+M8@!Z>C`P-6(T83)D`'IZ,#$V9&4P9&0`>GHP,39D9C!D9`!Z>C!D9C`W8V$Q
+M`'IZ,#)D8F0W-C,`>GHP,#!B-F4U,@!Z>C`V-V0P8S0W`'IZ,#5B-F,V9&(`
+M>GHP8S,Q-65B-0!Z>C!D8C%E9#@V`'IZ,#9D-#`V93``>GHP,39E,#(U,0!Z
+M>C`P,#)D8F(R`'IZ,#`R9&0X-F0`>GHP,#$V93$T9`!Z>C`R9&(U.6%E`'IZ
+M,#`V-V0R,C$`>GHP,39D.#!D9`!Z>C`P-6(X.3-D`'IZ,#5B.#%B,6(`>GHP
+M,F1B,3-E9`!Z>C`P8C9D,3(S`'IZ,#`P8C9C93@`>GHP-6(X86%E9`!Z>C!B
+M-F5D,S8S`'IZ,#)D868Q8C(`>GHP,#`U8C5E,@!Z>C`S,V5B9F)F`'IZ,#5B
+M-C@V9&(`>GHP,#!B-F5F.`!Z>C!B-S$Y865D`'IZ,#`U8C4X8C(`>GHP-6(W
+M9&(Q8@!Z>C!B.#)D939D`'IZ,#`Q-F0W,S(`>GHP,F1A9&%B,@!Z>C!F-#5E
+M-F4S`&%T:%]H86Q?:6YI=%]C:&%N;F5L<P!Z>C`P8C9D-F)C`'IZ,&,Q-&0Q
+M8C``>GHP,#`R9&)D,@!Z>C!D830X-&$Q`'IZ,#$V93!B.#<`>GHP-6(Y,#)E
+M9`!Z>C!D8S)E,SDP`'IZ,&$V,&0Q-#4`>GHP,F1B86)B9`!Z>C`P,&(V8S%D
+M`'IZ,#5B.&5A960`>GHP,#5B-V(Y9`!Z>C`P-6(U-#0V`'IZ,#5B-C0V9&(`
+M>GHP,&(V9CDR,P!Z>C!D9#8X,S=F`'IZ,#$V93$R-3$`>GHP9&,V835C-0!Z
+M>C`R9&(S-S!A`'IZ,#`P-6(V-S(`>GHP-F1E9F,P9`!Z>C`R9&)F,S5D`'IZ
+M,#`P8C9C-S@`>GHP,#$V9#@S,@!Z>C`R9&(U-S!A`'IZ,#`U8C9D-V$`>GHP
+M,#)D8C(Y,@!Z>C`P-6(Y,&-B`&%T:%]H86Q?<F5G7W=R:71E`'IZ,&(V9C4S
+M-C,`>GHP,#5B-6,T-@!A=&A?:&%L7W)E9U]R96%D`'IZ,#9D.3!C9C(`>GHP
+M-F0X9&0Y,P!Z>C`Q-F1F8C@W`'IZ,#`Q-F1A-#@`>GHP8C8V,S%A.`!Z>C`P
+M,F1B,#DR`&%T:%]H86Q?9V5T=VER96QE<W-M;V1E<P!Z>C`Q-F4Q8C@W`-0`
+M```$`0``G`````4"``!4````!0(``#0!```&`@``"`$```4"``!(````!0(`
+M`#P!```&`@``)`$```4"``!$`0``!@(``!@!```%`@``3`$```8"``",````
+M!0(``&0````%`@``5`$```8"``#8````!0(``%P!```&`@``M`````4"``!D
+M`0``!@(```P````%`@``;`$```8"``!\````!0(``'0!```&`@``\`````4"
+M``#@````!0(``#`````%`@``?`$```8"``"T`0``!0$``+@!```&`0``'`(`
+M``0!```\`@``!`$``&P"```$`0``?`(```0!``"D`@``!`$``+P"```$`0``
+MN`(```5V``"@`@``!78``$@"```%=@``*`(```5V``#``@``!G8``,0"```$
+M`0``B`(```6$`0!X`@``!80!``P"```%A`$`R`(```:$`0#,`@``!4<``!@"
+M```%1P``T`(```9'``#<`@``!`$``(`#```%D`$`A`,```:0`0"(`P``!34!
+M`(P#```&-0$`<`0```0!``",!```!`$``.0$```$`0``1`4```0!``"D!0``
+M!`$``.@%```$`0``+`8```0!```H!P``!`$``#P'```%O```0`<```:\``!\
+M!P``!`$``+@'```$`0``R`<```6\``#,!P``!KP``$`(```$`0``<`@```0!
+M``"`"```!`$``*@(```$`0````D```4>`0`$"0``!AX!`!`)```%`@``%`D`
+M``8"```H"0``!`$``&P)```%'@$`<`D```8>`0!\"0``!0(``(`)```&`@``
+MG`D```0!```P"@``!68``#0*```&9@``\`H```4"``#T"@``!@(```@+```$
+M`0``,`L```0!```\"P``!`$``%0+```$`0``8`L```0!``!L"P``!`$``'@+
+M```$`0``@`L```0!``#`"P``!`$``,P+```$`0``V`L```0!``#D"P``!`$`
+M`/`+```$`0``)`P```0!``!,#```!`$``(`,```$`0``D`P```0!``"H#```
+M!`$``,@,```$`0``0`T```60`0!$#0``!I`!``@.```$`0``)`X```0!```P
+M#@``!`$``$`.```%`0``1`X```8!``!0#@``!`$``%P.```$`0``>`X```0!
+M``#L#@``!`$``$`/```$`0``E`\```0!``#`#P``!`$``.@/```$`0``X!``
+M``7]``#D$```!OT```P1```%'@$`$!$```8>`0`@$0``!0(``"01```&`@``
+M/!$```0!``"X$0``!0(``+P1```&`@``W!$```4>`0#@$0``!AX!`%P2```$
+M`0``8!,```0!``!<$P``!0(``&03```&`@``:!,```4"``!L$P``!@(``!`4
+M```$`0``(!0```0!```L%0``!`$``+`6```%`0``M!8```8!``!0%P``!<T`
+M`%07```&S0``'!H```0!``#L&P``!`$``/P;```$`0``%!P```4!``!,'```
+M!@$``(P<```$`0``X!P```0!```P'0``!`$``#@=```$`0``1!T```4@`0!(
+M'0``!B`!`*`?```$`0``$"````4!```4(```!@$``$`@```%`0``1"````8!
+M``"X(```!8,``+P@```&@P``%"(```4!```8(@``!@$``&0B```%`0``:"(`
+M``8!``!T(@``!`$``,0B```%`0``R"(```8!``#4(@``!`$``!0C```%`0``
+M&",```8!``!8)0``!`$``*0F```$`0``9"@```0!```<*@``!`$``#`L```%
+M`@``-"P```8"``!,+```!<T``%`L```&S0``="P```4@`0!X+```!B`!`*`L
+M```%`0``I"P```8!``#$+```!0$``,@L```&`0``W"P```4!``#@+```!@$`
+M`"@M```%(`$`+"T```8@`0!4+0``!0$``%@M```&`0``>"T```4!``!\+0``
+M!@$``)`M```%`0``E"T```8!``#<+0``!2`!`.`M```&(`$`""X```4!```,
+M+@``!@$``"PN```%`0``,"X```8!``!$+@``!0$``$@N```&`0``8"X```6#
+M``!D+@``!H,``.PN```$`0``Z"X```4!``#P+@``!@$``!PO```%`0``("\`
+M``8!```L+P``!`$``&0O```$`0``="\```0!``"$+P``!`$``*0O```$`0``
+MP"\```0!``#(+P``!`$``-@O```%`0``W"\```8!``",,@``!`$``,`R```$
+M`0``T#(```0!``#@,@``!`$````S```$`0``'#,```0!```D,P``!`$``#@S
+M```%`0``/#,```8!``!P,P``!`$``)PS```$`0``D#,```4!``"D,P``!@$`
+M`-0S```$`0``2#0```0!```L-0``!`$``'0U```$`0``2#8```0!``!D.```
+M!0$``&@X```&`0``L#@```0!``"\.```!0$``,`X```&`0``=#D```4"``!X
+M.0``!@(``'PY```$`0``A#D```4"``"(.0``!@(``#P[```%`0``0#L```8!
+M``!P/0``!`$``(`]```$`0``J#T```0!``#(/0``!`$``*0_```$`0``M#\`
+M``0!```H0```!`$``#A````$`0``6$````0!``!T0```!`$``#Q!```$`0``
+MA$$```0!``"400``!`$``"Q"```$`0``($0```0!``#P1@``!`$``#A'```$
+M`0``E$<```4!``"81P``!@$``+!'```%`0``M$<```8!``#,1P``!0$``-!'
+M```&`0``Z$<```4!``#L1P``!@$```1(```%`0``"$@```8!``!42```!0$`
+M`%A(```&`0``Y$@```4!``#H2```!@$```A)```%`P``#$D```8#```\20``
+M!`$``$1)```%`P``2$D```8#``"<20``!0$``*!)```&`0``S$D```0!``#D
+M20``!`$``.Q)```%`P``\$D```8#``#82@``!0$``-Q*```&`0``,$L```4!
+M```T2P``!@$``%1+```%`0``6$L```8!``!T2P``!0$``'A+```&`0``L$L`
+M``4!``"T2P``!@$``.!+```$`0``^$L```0!```P3```!0,``#1,```&`P``
+M?$P```4!``"`3```!@$``*!,```%`0``I$P```8!``"\3```!0,``,!,```&
+M`P``)$T```4#```H30``!@,``$Q-```%Y@``4$T```;F``!<30``!`$``(Q-
+M```%`P``D$T```8#```03@``!0$``!1.```&`0``,$X```4!``!P3P``!0$`
+M`$A/```%`0``-$X```8!``!(3@``!0$``$Q.```&`0``8$X```0!``!\3@``
+M!0,``(!.```&`P``M$X```0!``#L3@``!0,``/!.```&`P``/$\```0!``"$
+M3P``!0$``(A/```&`0``]%````4!``#X4```!@$```Q1```%`0``$%$```8!
+M```P40``!0$``#11```&`0``4%$```4!```H40``!0$``%11```&`0``8%$`
+M``4!``!D40``!@$``(A1```%`0``C%$```8!``"L40``!0$``+!1```&`0``
+M^%$```4!``#\40``!@$``%!2```%`@``5%(```8"``#@4@``!`$```A3```$
+M`0``&%,```0!```H4P``!0,``"Q3```&`P``.%,```0!``!(4P``!0,``$Q3
+M```&`P``5%,```0!``!H4P``!0,``&Q3```&`P``>%,```0!``",4P``!0,`
+M`)!3```&`P``G%,```0!``"P4P``!0,``+13```&`P``O%,```0!``#,4P``
+M!0,``-!3```&`P``Y%,```4!``#H4P``!@$```14```%`0``"%0```8!```X
+M5```!0$``#Q4```&`0``/%4```4@`0!`50``!B`!`'15```$`0``S%4```0!
+M``#85@``!0(``-Q6```&`@``&%<```4!```<5P``!@$``!17```%`0``)%<`
+M``8!``"L6```!`$``/!8```%_0``]%@```;]``!H60``!0$``&Q9```&`0``
+M[%D```0!``#X60``!?T``/Q9```&_0``:%H```7]``!L6@``!OT``-Q;```$
+M`0``%%P```4!```87```!@$``&!<```$`0``E%P```0!``#`7```!0$``+!<
+M```%`0``F%P```4!``"`7```!0$``%1<```%`0``,%P```4!``#$7```!@$`
+M`-!<```$`0``)%T```4#```H70``!@,``%A=```$`0``=%T```4!``!X70``
+M!@$``(1=```$`0``[%T```4#``#P70``!@,``"!>```$`0``/%X```4!``!`
+M7@``!@$``$Q>```$`0``B%X```4!``",7@``!@$``,1>```$`0``P%X```4!
+M``#(7@``!@$``-!>```%`0``U%X```8!```P7P``!<T``#1?```&S0``5%\`
+M``4"``!87P``!@(``%Q?```%Y@``8%\```;F``"T7P``!3L!`+A?```&.P$`
+MV%\```60`0#<7P``!I`!``Q@```%C0$`$&````:-`0`@8```!8T!`"1@```&
+MC0$`2&````60`0!,8```!I`!`&!@```%+P``9&````8O``"08```!8T!`)1@
+M```&C0$`J&````4J`0"L8```!BH!`-A@```%*@$`W&````8J`0``80``!2H!
+M``1A```&*@$`/&$```4J`0!`80``!BH!`)!A```%*@$`E&$```8J`0`L8@``
+M!7L``#!B```&>P``>&0```4!``!\9```!@$``)1D```%*@$`F&0```8J`0#T
+M9```!`$```!E```%C0$`!&4```:-`0`090``!`$``!AE```$`0``+&4```6-
+M`0`P90``!HT!`$!E```%@P``1&4```:#``"090``!8,``)1E```&@P``G&8`
+M``6-`0"@9@``!HT!`!QG```%,0``(&<```8Q```P9P``!2@!`#1G```&*`$`
+M1&<```0!``!P9P``!6,!`'1G```&8P$`I&<```6-`0"H9P``!HT!`+AG```%
+MD`$`O&<```:0`0`\:```!9`!`$!H```&D`$`:&@```6-`0!L:```!HT!`*QH
+M```$`0``M&@```60`0"X:```!I`!`-AH```%C0$`W&@```:-`0#P:```!8T!
+M`/1H```&C0$`!&D```60`0`(:0``!I`!`$1I```%C0$`2&D```:-`0"@:0``
+M!8T!`*1I```&C0$`U&D```60`0#8:0``!I`!`!!J```%D`$`%&H```:0`0`T
+M:@``!`$```1K```%C0$`"&L```:-`0!L:P``!8T!`'!K```&C0$`X&L```60
+M`0#D:P``!I`!`$1L```%C0$`2&P```:-`0"`;0``!`$``)AM```%C0$`G&T`
+M``:-`0!4;P``!8T!`%AO```&C0$`U&\```5O``#8;P``!F\``#1P```%Y@``
+M.'````;F``!<<```!>8``&!P```&Y@``B'````4"``",<```!@(``)!P```%
+MY@``E'````;F``#0<```!9`!`-1P```&D`$`['````5*``#P<```!DH```AQ
+M```%D`$`#'$```:0`0"@<0``!20!`*1Q```&)`$`P'$```5T``#$<0``!G0`
+M``!R```%D`$`!'(```:0`0`X<@``!8T!`#QR```&C0$`>'(```60`0!\<@``
+M!I`!`*1R```%C0$`J'(```:-`0#L<@``!9`!`/!R```&D`$`(',```6-`0`D
+M<P``!HT!`&AS```%D`$`;',```:0`0"X<P``!9`!`+QS```&D`$`"'0```6-
+M`0`,=```!HT!`"1T```%3P$`*'0```9/`0!D=```!9`!`&AT```&D`$`E'0`
+M``0!``"H=```!8T!`*QT```&C0$`U'0```60`0#8=```!I`!`!QU```%D`$`
+M('4```:0`0!4=0``!8T!`%AU```&C0$`J'4```7F``"L=0``!N8``.1U```%
+MC0$`Z'4```:-`0`D=@``!9`!`"AV```&D`$`3'8```0!``!4=@``!9`!`%AV
+M```&D`$`>'8```6-`0!\=@``!HT!`+QV```%D`$`P'8```:0`0`P=P``!9`!
+M`#1W```&D`$`7'<```60`0!@=P``!I`!`'QW```%C0$`@'<```:-`0"X=P``
+M!9`!`+QW```&D`$`Y'<```60`0#H=P``!I`!`#QX```%D`$`0'@```:0`0"(
+M>```!9`!`(QX```&D`$`1'D```4E``!(>0``!B4``&AY```$`0``<'D```5;
+M`0!T>0``!EL!`(AY```%C0$`C'D```:-`0#(>0``!9`!`,QY```&D`$`X'D`
+M``4E``#D>0``!B4``"!Z```%)0``)'H```8E``!`>@``!`$``$QZ```%D`$`
+M4'H```:0`0!L>@``!5L!`'!Z```&6P$`C'H```6-`0"0>@``!HT!`-!Z```%
+MD`$`U'H```:0`0#H>@``!24``.QZ```&)0``.'L```60`0`\>P``!I`!`%Q[
+M```%C0$`8'L```:-`0!P>P``!`$``'A[```%D`$`?'L```:0`0"8>P``!8T!
+M`)Q[```&C0$`\'L```4E``#T>P``!B4``!!\```$`0``''P```60`0`@?```
+M!I`!`$!\```%6P$`1'P```9;`0!H?```!8T!`&Q\```&C0$`K'P```60`0"P
+M?```!I`!`,Q\```%)0``T'P```8E```L?0``!`$``#1]```%%@$`.'T```86
+M`0!L?0``!`$``'Q]```%C0$`@'T```:-`0",?0``!`$``'!]```%&P``E'T`
+M``8;``"\?0``!3<!`,!]```&-P$`^'T```60`0#\?0``!I`!`!A^```%C0$`
+M''X```:-`0"@?@``!9`!`*1^```&D`$`Q'X```6-`0#(?@``!HT!`-1^```%
+M-0$`V'X```8U`0#H?@``!9`!`.Q^```&D`$`]'X```4U`0#X?@``!C4!``1_
+M```%C0$`"'\```:-`0!8?P``!`$``&A_```$`0``='\```60`0!X?P``!I`!
+M`)A_```%C0$`G'\```:-`0#T?P``!9`!`/A_```&D`$`%(````6-`0`8@```
+M!HT!`*B````$`0``L(````4!``"T@```!@$``,"````$`0``S(````0!``#(
+M@```!0$``-"````&`0``U(````4!``#8@```!@$``.2````$`0``%($```60
+M`0`8@0``!I`!`%R!```$`0``:($```0!``!D@0``!1$``&R!```&$0``<($`
+M``0!``!8@0``!?$``'2!```&\0``>($```0!``"`@0``!2D!`(2!```&*0$`
+MK($```60`0"P@0``!I`!`-2!```%C0$`V($```:-`0#\@0``!8T!``""```&
+MC0$`.((```6-`0`\@@``!HT!`$R"```%D`$`4((```:0`0!4@@``!34!`%B"
+M```&-0$`P((```60`0#$@@``!I`!`.""```%C0$`Y((```:-`0`0@P``!9`!
+M`!2#```&D`$`+(,```6-`0`P@P``!HT!`'"#```%C0$`=(,```:-`0#4@P``
+M!9`!`-B#```&D`$`^(,```0!````A```!I`!`"2$```%C0$`*(0```:-`0!\
+MA```!9`!`("$```&D`$`G(0```0!``"DA```!I`!`,2$```%C0$`R(0```:-
+M`0#XA```!9`!`/R$```&D`$`-(4```6-`0`XA0``!HT!``"&```%D`$`!(8`
+M``:0`0!$A@``!9`!`$B&```&D`$`Q(8```0!``#DA@``!`$``/2'```%_0``
+M^(<```;]```PB```!`$``$2(```%D`$`P(X```60`0`(B0``!9`!`#2(```%
+MD`$`2(@```:0`0!<B```!3L!`&"(```&.P$`H(@```6-`0"DB```!HT!`-"(
+M```%`0``U(@```8!```$B0``!`$``!")```$`0``((D```6-`0`DB0``!HT!
+M`#B)```$`0``1(D```6-`0!(B0``!HT!`&R)```%D`$`<(D```:0`0"(B0``
+M!8T!`(R)```&C0$`^(H```6V``#\B@``!K8``-R+```%`@``X(L```8"``#D
+MBP``!8T!`.B+```&C0$`.(P```6%`0`\C```!H4!`%2,```%D`$`6(P```:0
+M`0"$C```!8T!`(B,```&C0$`J(T```4!``"LC0``!@$```".```%C0$`!(X`
+M``:-`0`0C@``!34!`!2.```&-0$`)(X```60`0`HC@``!I`!`%2.```%2@``
+M6(X```9*``!HC@``!90``&R.```&E```C(X```0!``"4C@``!5<``)B.```&
+M5P``Q(X```5^``#(C@``!GX``-B.```%D`$`W(X```:0`0#\C@``!8T!``"/
+M```&C0$`&(\```5_`0`<CP``!G\!`#2/```%"P``.(\```8+``!0CP``!1@!
+M`%2/```&&`$`<(\```6-`0!TCP``!HT!`(2/```$`0``Z(\```60`0#LCP``
+M!I`!`!R0```$`0``.)````0!``!$D```!`$``%20```$`0``8)````0!``!\
+MD```!8T!`("0```&C0$`K)````4!``"PD```!@$``-20```%`0``V)````8!
+M```(D0``!?@```R1```&^```*)$```4!```LD0``!@$``$"1```%-0$`1)$`
+M``8U`0!8D0``!0$``%R1```&`0``J)$```7X``"LD0``!O@``-R1```%C0$`
+MX)$```:-`0#TD0``!0$``/B1```&`0``#)(```4U`0`0D@``!C4!`"22```%
+M`0``*)(```8!```\D@``!34!`$"2```&-0$`5)(```7X``!8D@``!O@``'22
+M```%`0``>)(```8!``#4D@``!?T``-B2```&_0``])(```60`0#XD@``!I`!
+M`!"3```%C0$`%),```:-`0!(DP``!34!`$R3```&-0$`B),```4!``",DP``
+M!@$``*"3```%-0$`I),```8U`0"TDP``!9`!`+B3```&D`$`V),```6-`0#<
+MDP``!HT!`!25```%2@``&)4```9*``!8E0``!90``%R5```&E```G)4```60
+M`0"@E0``!I`!`+R5```%C0$`P)4```:-`0!8E@``!8T!`%R6```&C0$`:)8`
+M``4U`0!LE@``!C4!`(R6```%2@``D)8```9*``"TE@``!8T!`+B6```&C0$`
+M()<```0!``"@EP``!`$``&B8```$`0``L)@```0!``#`F```!`$``.R:```%
+M`0``\)H```8!``!4FP``!0(``%B;```&`@``>)L```0!``"0FP``!0$``)2;
+M```&`0``L)L```4!``"TFP``!@$``.B;```%`0``[)L```8!```(G```!0$`
+M``R<```&`0``0)P```4!``!$G```!@$``&"<```%`0``9)P```8!``"8G```
+M!0$``)R<```&`0``N)P```4!``"\G```!@$``&B=```%`@``;)T```8"``!P
+MG0``!>8``'2=```&Y@``A)T```4"``"(G0``!@(``)R=```%`0``H)T```8!
+M``#HG0``!2\``.R=```&+P``')X```4O```@G@``!B\``!2@```%+P``&*``
+M``8O``!\H```!8T!`("@```&C0$`O*````6-`0#`H```!HT!`#2A```%+P``
+M.*$```8O``!4H0``!8T!`%BA```&C0$`G*$```60`0"@H0``!I`!`/RA```%
+MD`$``*(```:0`0`8H@``!8T!`!RB```&C0$`-*(```5*```XH@``!DH``%"B
+M```%-0$`5*(```8U`0!8H@``!5(``%RB```&4@``G*(```0!```$HP``!68!
+M``BC```&9@$`5*,```45`0!8HP``!A4!`,"C```$`0``T*,```0!``#8HP``
+M!`$``."C```$`0``$*0```4@`0`4I```!B`!`$BD```$`0``6*0```6]``!<
+MI```!KT``)"E```%C0$`**D```6-`0"4I0``!HT!``BF```%D`$`#*8```:0
+M`0!`I@``!`$``$RF```%C0$`4*8```:-`0#,I@``!9`!`-"F```&D`$`5*<`
+M``6-`0!8IP``!HT!`'RG```$`0``L*<```0!``#DIP``!`$``!BH```$`0``
+M3*@```0!``"\J```!9`!`,"H```&D`$`S*@```0!```DJ0``!`$``"RI```%
+MC0$`,*D```:-`0!DJ0``!:$``&BI```&H0``A*D```5/`0"(J0``!D\!`)BI
+M```%D`$`G*D```:0`0"\J0``!`$``-2I```%3P$`V*D```9/`0#DJ0``!`$`
+M`/"I```%C0$`]*D```:-`0`$J@``!4\!``BJ```&3P$`@*H```0!``",J@``
+M!`$``)2J```%C0$`F*H```:-`0"TJ@``!`$``,"J```%C0$`Q*H```:-`0`8
+MJP``!9`!`!RK```&D`$`B*L```0!``"4JP``!8T!`)BK```&C0$`J*L```60
+M`0"LJP``!I`!`+"K```%-0$`M*L```8U`0#LJP``!8T!`/"K```&C0$`_*L`
+M``0!```(K```!4H```RL```&2@``&*P```0!``#PK```!`$``(2M```$`0``
+MK*T```0!```<KP``!8T!`""O```&C0$`,*\```6-`0`TKP``!HT!`%BO```%
+MD`$`7*\```:0`0"`KP``!2\``(2O```&+P``Y*\```7-``#HKP``!LT```BP
+M```%`@``#+````8"```0L```!>8``!2P```&Y@``9+````66`0!HL```!I8!
+M`)2P```%C0$`F+````:-`0"TL```!34!`+BP```&-0$`R+````60`0#,L```
+M!I`!``"Q```%D`$`!+$```:0`0`4L0``!0$``!BQ```&`0``0+$```0!``!0
+ML0``!8T!`%2Q```&C0$`8+$```4U`0!DL0``!C4!`'"Q```%`0``=+$```8!
+M``"<L0``!4@!`*"Q```&2`$`T+$```60`0#4L0``!I`!`/RQ```%2`$``+(`
+M``9(`0`DL@``!4@!`"BR```&2`$`K+(```4"``"PL@``!@(```"S```%>`$`
+M!+,```9X`0`\LP``!8T!`$"S```&C0$`3+,```4U`0!0LP``!C4!`%RS```%
+M`0``8+,```8!``"<LP``!`$``*RS```%2`$`L+,```9(`0#0LP``!=(``-2S
+M```&T@``W+,```4!``#@LP``!@$``.RS```%@`$`\+,```:``0`(M```!4@!
+M``RT```&2`$`:+0```0!``!XM```!64!`'RT```&90$`U+0```4=`0#8M```
+M!AT!`.2T```%@P``Z+0```:#```TM0``!0(``#BU```&`@``3+4```4"``!0
+MM0``!@(``'BU```%D`$`?+4```:0`0"`M0``!8T!`(2U```&C0$`Z+4```6-
+M`0#LM0``!HT!`/"U```%D`$`]+4```:0`0!@M@``!34!`&2V```&-0$`P+8`
+M``0!```\MP``!=T``$"W```&W0``"+@```5(`0`,N```!D@!`(2X```%C0$`
+MB+@```:-`0`PN0``!`$``#BY```%,0``#+D```4Q```\N0``!C$``$RY```%
+M*`$`4+D```8H`0!XN0``!8X!`'RY```&C@$`K+D```6-`0"PN0``!HT!`,"Y
+M```%D`$`Q+D```:0`0!$N@``!9`!`$BZ```&D`$`9+H```6-`0!HN@``!HT!
+M`*BZ```$`0``L+H```60`0"TN@``!I`!`-2Z```%C0$`V+H```:-`0#LN@``
+M!8T!`/"Z```&C0$``+L```60`0`$NP``!I`!`$"[```%C0$`1+L```:-`0"$
+MNP``!9`!`(B[```&D`$`Y+L```60`0#HNP``!I`!`!R\```%D`$`(+P```:0
+M`0!`O```!`$``-R\```%D`$`X+P```:0`0"$O0``!8T!`(B]```&C0$`F+T`
+M``60`0"<O0``!I`!`!2^```%C0$`&+X```:-`0"(O@``!9`!`(R^```&D`$`
+M[+X```6-`0#PO@``!HT!`"C````$`0``0,````6-`0!$P```!HT!``3!```$
+M`0``%,$```0!``!0P0``!`$``#3"```%C0$`.,(```:-`0"TP@``!<L``+C"
+M```&RP``%,,```7F```8PP``!N8``#S#```%Y@``0,,```;F``!HPP``!0(`
+M`&S#```&`@``<,,```7F``!TPP``!N8``+C#```%C0$`O,,```:-`0#DPP``
+M!4H``.C#```&2@```,0```60`0`$Q```!I`!`,3$```%X@``R,0```;B``#8
+MQ```!9`!`-S$```&D`$`],0```6-`0#XQ```!HT!``C%```%00$`#,4```9!
+M`0`HQ0``!3<``"S%```&-P``:,4```60`0!LQ0``!I`!`)#%```%C0$`E,4`
+M``:-`0#0Q0``!9`!`-3%```&D`$`_,4```6-`0``Q@``!HT!`$3&```%D`$`
+M2,8```:0`0!XQ@``!8T!`'S&```&C0$`P,8```60`0#$Q@``!I`!``C'```%
+MD`$`#,<```:0`0`\QP``!8T!`$#'```&C0$`6,<```4&`0!<QP``!@8!`)3'
+M```%D`$`F,<```:0`0"XQP``!0(``+S'```&`@``U,<```6-`0#8QP``!HT!
+M`!C(```%Y@``',@```;F``!4R```!8T!`%C(```&C0$`P,@```60`0#$R```
+M!I`!`#3)```%D`$`.,D```:0`0!@R0``!9`!`&3)```&D`$`@,D```6-`0"$
+MR0``!HT!`+S)```%D`$`P,D```:0`0#HR0``!9`!`.S)```&D`$`0,H```60
+M`0!$R@``!I`!`*3*```%D`$`J,H```:0`0!@RP``!24``&3+```&)0``@,L`
+M``0!``"(RP``!5L!`(S+```&6P$`H,L```6-`0"DRP``!HT!`.#+```%D`$`
+MY,L```:0`0#XRP``!24``/S+```&)0``.,P```4E```\S```!B4``%C,```$
+M`0``9,P```60`0!HS```!I`!`(3,```%6P$`B,P```9;`0"DS```!8T!`*C,
+M```&C0$`Z,P```60`0#LS```!I`!``#-```%)0``!,T```8E``!0S0``!9`!
+M`%3-```&D`$`=,T```6-`0!XS0``!HT!`(C-```$`0``D,T```60`0"4S0``
+M!I`!`+#-```%C0$`M,T```:-`0`(S@``!24```S.```&)0``*,X```0!```T
+MS@``!9`!`#C.```&D`$`6,X```5;`0!<S@``!EL!`(#.```%C0$`A,X```:-
+M`0#$S@``!9`!`,C.```&D`$`Y,X```4E``#HS@``!B4``#3/```%D`$`.,\`
+M``:0`0!<SP``!9`!`&#/```&D`$`B,\```6-`0",SP``!HT!`,3/```$`0``
+MO,\```7>``#,SP``!MX```S0```$`0``%-````46`0`8T```!A8!`%#0```%
+MC0$`5-````:-`0!@T```!`$``&C0```%&P``;-````8;``",T```!3<!`)#0
+M```&-P$`V-````60`0#<T```!I`!`/S0```%C0$``-$```:-`0`,T0``!34!
+M`!#1```&-0$`(-$```60`0`DT0``!I`!`"S1```%-0$`,-$```8U`0`\T0``
+M!8T!`$#1```&C0$`D-$```0!``"@T0``!`$``*S1```%D`$`L-$```:0`0#0
+MT0``!8T!`-31```&C0$`+-(```60`0`PT@``!I`!`$S2```%C0$`4-(```:-
+M`0#(T@``!9`!`,S2```&D`$`Z-(```6-`0#LT@``!HT!`'S3```$`0``A-,`
+M``4!``"(TP``!@$``)33```$`0``H-,```0!``"<TP``!0$``*33```&`0``
+MJ-,```4!``"LTP``!@$``+C3```$`0``Z-,```60`0#LTP``!I`!`#S4```$
+M`0``3-0```0!``!8U```!`$``%34```%N@``7-0```:Z``!DU```!`$``&#4
+M```%"`$`:-0```8(`0!LU```!>T``'#4```&[0``=-0```4I`0!XU```!BD!
+M`*#4```%D`$`I-0```:0`0#(U```!8T!`,S4```&C0$`\-0```6-`0#TU```
+M!HT!`"#5```%C0$`)-4```:-`0`\U0``!4H``$#5```&2@``<-4```60`0!T
+MU0``!I`!`)#5```%C0$`E-4```:-`0#`U0``!9`!`,35```&D`$`W-4```6-
+M`0#@U0``!HT!`"#6```%C0$`)-8```:-`0"$U@``!9`!`(C6```&D`$`J-8`
+M``0!``"PU@``!I`!`-36```%C0$`V-8```:-`0`LUP``!9`!`##7```&D`$`
+M3-<```0!``!4UP``!I`!`'37```%C0$`>-<```:-`0"HUP``!9`!`*S7```&
+MD`$`T-<```6-`0#4UP``!HT!`)38```%D`$`F-@```:0`0`4V0``!`$``"S:
+M```$`0``7-H```0!``!\V@``!?T``(#:```&_0``N-H```0!``#0V@``!9`!
+M`/#X```%D`$`T/@```60`0#4V@``!I`!`!#;```$`0``&-L```60`0`<VP``
+M!I`!`(#;```%D`$`A-L```:0`0"DVP``!9`!`*C;```&D`$`$-P```66`0`4
+MW```!I8!`%#<```$`0``:-P```0!``!TW```!`$``(#<```$`0``B-P```0!
+M``"PW```!`$``,#<```%C0$`Q-P```:-`0`0W0``!`$``"#=```%+P``)-T`
+M``8O``!(W0``!0,``/S<```%`P``3-T```8#``"<W0``!0,``*#=```&`P``
+MI-T```6-`0"HW0``!HT!`.S=```%`0``\-T```8!````W@``!0(```3>```&
+M`@``"-X```6-`0`,W@``!HT!`%3>```%`@``6-X```8"``!<W@``!8T!`&#>
+M```&C0$`I-X```4"``"HW@``!@(``*S>```%C0$`L-X```:-`0`(WP``!9`!
+M``S?```&D`$`,-\```6-`0`TWP``!HT!`)#?```%C0$`E-\```:-`0#0WP``
+M!`$``-C?```%C0$`W-\```:-`0`TX```!8T!`#C@```&C0$`;.````4!``!P
+MX```!@$``(#@```%D`$`A.````:0`0",X0``!2$!`&3A```%(0$`D.$```8A
+M`0#$X0``!9`!`,CA```&D`$`^.$```6-`0#\X0``!HT!``SB```%`0``O.$`
+M``4!```0X@``!@$``"#B```%`0``).(```8!``!@X@``!8T!`&3B```&C0$`
+M>.(```6-`0!\X@``!HT!`(SB```%D`$`D.(```:0`0#0X@``!`$``/CB```%
+M-0$`_.(```8U`0`,XP``!9`!`!#C```&D`$`*.,```6-`0`LXP``!HT!`$3C
+M```%2@``2.,```9*``!8XP``!1T``%SC```&'0``B.,```0!``"DXP``!8T!
+M`*CC```&C0$`Q.,```6-`0#(XP``!HT!`/3C```%#0$`^.,```8-`0`@Y```
+M!8T!`"3D```&C0$`5.0```60`0!8Y```!I`!`/SD```%40```.4```91```0
+MY0``!9`!`!3E```&D`$`-.4```6-`0`XY0``!HT!`%#E```%F@``5.4```::
+M``!LY0``!=0``'#E```&U```B.4```4X``",Y0``!C@``*CE```%C0$`K.4`
+M``:-`0"\Y0``!`$``!#F```%`0``-.<```4!```DYP``!0$```#G```%`0``
+M%.8```8!``!`Y@``!58!`$3F```&5@$`7.8```4!``!@Y@``!@$``'3F```%
+M-0$`>.8```8U`0"XY@``!58!`+SF```&5@$`_.8```0!```@YP``!`$``##G
+M```$`0``0.<```6-`0!$YP``!HT!`'#G```%-0$`=.<```8U`0"`YP``!`$`
+M`)#G```%C0$`E.<```:-`0"\YP``!34!`,#G```&-0$`U.<```0!``#LYP``
+M!`$``/SG```%C0$``.@```:-`0`@Z```!8T!`"3H```&C0$`,.@```4U`0`T
+MZ```!C4!`%CH```%`0``7.@```8!``!PZ```!34!`'3H```&-0$`B.@```56
+M`0",Z```!E8!`*3H```%`0``J.@```8!```(Z0``!?T```SI```&_0``,.D`
+M``60`0`TZ0``!I`!`/3I```%C0$`^.D```:-`0`(Z@``!0$```SJ```&`0``
+M-.H```0!```\Z@``!1T``$#J```&'0``5.H```4U`0!8Z@``!C4!`)3J```$
+M`0``=.H```4!``!0Z@``!0$``)SJ```&`0``%.L```60`0`8ZP``!I`!`"SK
+M```%C0$`,.L```:-`0`\ZP``!34!`$#K```&-0$`8.L```5*``!DZP``!DH`
+M`(CK```%C0$`C.L```:-`0#<ZP``!8D``.#K```&B0``$.P```4"```4[```
+M!@(``"#L```%+P``).P```8O``!@[```!2\``&3L```&+P``=.P```0!``"(
+M[```!2\``(SL```&+P``Q.P```6-`0#([```!HT!`"#M```%D`$`).T```:0
+M`0"([0``!9`!`(SM```&D`$`O.T```6-`0#`[0``!HT!``3N```%D`$`".X`
+M``:0`0`,[@``!34!`!#N```&-0$`4.X```4!``!4[@``!@$``/3N```%`0``
+M^.X```8!```0[P``!9`!`!3O```&D`$`(.\```4!```D[P``!@$``*CO```%
+M;P$`K.\```9O`0#$[P``!0$``,CO```&`0``X.\```4"``#D[P``!@(``.CO
+M```%`0``[.\```8!```L\```!`$``#CP```%D`$`//````:0`0!4\```!8T!
+M`%CP```&C0$`E/````4"``"8\```!@(``*CP```%`@``K/````8"``#0\```
+M!0(``-3P```&`@``E/$```0!``#`\0``!`$``.#Q```$`0``!/(```0!```@
+M\@``!`$``$#R```%`P``1/(```8#``"D\@``!`$``+CR```$`0``X/(```4#
+M``#D\@``!@,``/SR```%+P```/,```8O``#@\P``!0,``.3S```&`P``Z/,`
+M``6-`0#L\P``!HT!`*CT```$`0``N/0```0!``#`]```!`$``%SU```$`0``
+M9/4```0!``!T]0``!8T!`'CU```&C0$`#/8```0!```@]@``!9`!`"3V```&
+MD`$`4/8```6-`0!4]@``!HT!`&#V```$`0``:/8```0!``"$]@``!9`!`(CV
+M```&D`$`H/8```6-`0"D]@``!HT!`+#V```$`0``N/8```60`0"\]@``!I`!
+M`/#V```%C0$`]/8```:-`0`(]P``!=X```SW```&W@``-/<```60`0`X]P``
+M!I`!`&SW```%C0$`</<```:-`0#,^```!`$```CY```%D`$`#/D```:0`0`T
+M^0``!8T!`#CY```&C0$`E/D```6-`0"8^0``!HT!``3Z```$`0``,/H```0!
+M``!4^@``!`$``'CZ```$`0``A/H```0!``"4^@``!0$``)CZ```&`0``J/H`
+M``44``"L^@``!A0```C[```%`0``#/L```8!``!\^P``!00``(#[```&!```
+MA/L```4@`0"(^P``!B`!`)3[```%!```F/L```8$``"D^P``!00``*C[```&
+M!```X/L```4$``#D^P``!@0```C\```%`0``#/P```8!```0_```!00``!3\
+M```&!```5/P```4$``!8_```!@0``'#\```%!```=/P```8$``#D_```!00`
+M`.C\```&!```]/P```4$``#X_```!@0``)3]```%!```F/T```8$``#D_0``
+M!00``.C]```&!```!/X```4$```(_@``!@0```S^```%`0``$/X```8!```4
+M_@``!00``!C^```&!```./X```0!``#\_@``!00```#_```&!```,/\```4$
+M```T_P``!@0``#C_```%C0$`//\```:-`0`8``$`!00``!P``0`&!```0``!
+M``0!``!(``$`!`$``%P``0`%$P$`8``!``83`0#(``$`!0$``,P``0`&`0``
+MD`$!``4!``"4`0$`!@$``"P"`0`$`0``8`(!``0!``"4`@$`!`$``,@"`0`$
+M`0``W`(!``4"``#@`@$`!@(``"0#`0`$`0``7`,!``0!``"4`P$`!`$``.0#
+M`0`%`0``Z`,!``8!``!X!`$`!0(``'P$`0`&`@``3`4!``6-`0!0!0$`!HT!
+M`+@%`0`%;```O`4!``9L```\!@$`!0$``$`&`0`&`0``9`8!``4!``!H!@$`
+M!@$``(0&`0`%`0``B`8!``8!``"\!@$`!0$``,`&`0`&`0``^`8!``4!``#\
+M!@$`!@$``)0(`0`$`0``N`@!``0!``#L"`$`!`$``'@)`0`$`0``Q`D!``0!
+M``"$"@$`!0$``(@*`0`&`0``I`H!``4"``"H"@$`!@(```P+`0`$`0``C`L!
+M``6-`0"0"P$`!HT!`.P+`0`%D`$`\`L!``:0`0`<#`$`!0$``"`,`0`&`0``
+M.`P!``4!```\#`$`!@$``%0,`0`%`0``6`P!``8!``!L#`$`!0$``'`,`0`&
+M`0``\`P!``4"``#T#`$`!@(``$`-`0`%`@``1`T!``8"``!(#0$`!0(``$P-
+M`0`&`@``I`T!``0!``"\#0$`!0(``,`-`0`&`@``\`T!``4"``#T#0$`!@(`
+M`!`.`0`%`@``%`X!``8"```8#@$`!0(``!P.`0`&`@``Z`X!``60`0#L#@$`
+M!I`!`!@/`0`$`0``-`\!``0!``!`#P$`!`$``%`/`0`$`0``;`\!``6-`0!P
+M#P$`!HT!`)P/`0`%`0``H`\!``8!``#0#P$`!?,``-0/`0`&\P``\`\!``4&
+M`0#T#P$`!@8!``00`0`%D`$`"!`!``:0`0`P$`$`!`$``$@0`0`%!@$`3!`!
+M``8&`0!8$`$`!`$``'@0`0`%C0$`?!`!``:-`0",$`$`!08!`)`0`0`&!@$`
+MX!`!``5F`0#D$`$`!F8!`#`1`0`%%0$`-!$!``85`0"<$0$`!`$``*P1`0`$
+M`0``M!$!``0!``"\$0$`!`$``-`1`0`$`0``_!$!``4@`0``$@$`!B`!`#P2
+M`0`$`0``3!(!``5B``!0$@$`!F(``+@2`0`%C0$`O!(!``:-`0#P$@$`!9`!
+M`/02`0`&D`$`O!,!``4!``#`$P$`!@$``(P4`0`$`0``S!0!``6-`0#0%`$`
+M!HT!`&@5`0`%C0$`;!4!``:-`0"`%0$`!9`!`(05`0`&D`$`J!4!``6-`0"L
+M%0$`!HT!`.`5`0`%C0$`Y!4!``:-`0`8%@$`!8T!`!P6`0`&C0$`0!8!``60
+M`0!$%@$`!I`!`(06`0`%D`$`B!8!``:0`0"D%@$`!8T!`*@6`0`&C0$`U!8!
+M``60`0#8%@$`!I`!`/`6`0`%C0$`]!8!``:-`0`8%P$`!`$``"P7`0`%D`$`
+M,!<!``:0`0!(%P$`!8T!`$P7`0`&C0$`<!<!``0!``"`%P$`!9`!`(07`0`&
+MD`$`G!<!``6-`0"@%P$`!HT!`*P7`0`%*`$`L!<!``8H`0"T%P$`!3$``+@7
+M`0`&,0``R!<!``6_``#,%P$`!K\``!`8`0`%C0$`%!@!``:-`0`\&`$`!9`!
+M`$`8`0`&D`$`7!@!``6-`0!@&`$`!HT!`(08`0`$`0``N!@!``0!``#L&`$`
+M!`$``"`9`0`$`0``5!D!``0!``!T&0$`!0$``'@9`0`&`0``O!D!``60`0#`
+M&0$`!I`!`.09`0`%C0$`Z!D!``:-`0`4&@$`!8T!`!@:`0`&C0$`6!H!``60
+M`0!<&@$`!I`!`.`:`0`%C0$`Y!H!``:-`0#T&@$`!74!`/@:`0`&=0$`_!H!
+M``4U`0``&P$`!C4!`#0;`0`%C0$`.!L!``:-`0!\'`$`!`$``*0<`0`$`0``
+M=!X!``6-`0!X'@$`!HT!`&0?`0`%C0$`:!\!``:-`0!X'P$`!8T!`'P?`0`&
+MC0$`H!\!``60`0"D'P$`!I`!`,@?`0`%+P``S!\!``8O````(`$`!0(```0@
+M`0`&`@``,"`!``4"```T(`$`!@(``&`@`0`%`@``9"`!``8"``"0(`$`!0(`
+M`)0@`0`&`@``!"$!``6R```((0$`!K(``&PA`0`%`@``<"$!``8"``!T(0$`
+M!>8``'@A`0`&Y@``\"$!``4"``#T(0$`!@(``#0B`0`%`@``."(!``8"``#(
+M(@$`!<T``,PB`0`&S0``X"(!``0!``#\(@$`!28````C`0`&)@``&",!``6!
+M`0`<(P$`!H$!`#`C`0`%D`$`-",!``:0`0!8(P$`!0$``%PC`0`&`0``=",!
+M``6+`0!X(P$`!HL!`(PC`0`$`0``E",!``60`0"8(P$`!I`!`-`C`0`%`0``
+MU",!``8!``#@(P$`!1H``,PC`0`%&@``O",!``4:``#D(P$`!AH``/@C`0`$
+M`0``#"0!``60`0`0)`$`!I`!`"@D`0`%C0$`+"0!``:-`0!`)`$`!8T!`$0D
+M`0`&C0$`4"0!``5#``!4)`$`!D,``(PD`0`$`0``W"0!``0!``#\)`$`!`$`
+M`)@E`0`%B@$`G"4!``:*`0"\)0$`!`$``,PE`0`%D`$`T"4!``:0`0`@)@$`
+M!`$``#`F`0`%B@$`-"8!``:*`0!8)@$`!8H!`%PF`0`&B@$`B"8!``6*`0",
+M)@$`!HH!`+0F`0`%B@$`N"8!``:*`0`\)P$`!0(``$`G`0`&`@``1"<!``4"
+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
+M`0`$`0``*%H!``0!``!$6@$`!`$``$Q:`0`$`0``5%H!``0!``"(6@$`!`$`
+M`*!:`0`%D`$`I%H!``:0`0"P6@$`!`$``+A:`0`$`0``U%H!``0!``#P6@$`
+M!`$``/A:`0`$`0``(%L!``0!``!$6P$`!`$``&!;`0`$`0``>%L!``0!``"`
+M6P$`!`$``(A;`0`$`0``E%L!``0!``"D6P$`!`$``,Q;`0`$`0``V%L!``0!
+M``#06P$`!8<``.!;`0`&AP``"%P!``4"```,7`$`!@(``"!<`0`$`0``*%P!
+M``0!```P7`$`!`$``#A<`0`$`0``2%P!``0!``!47`$`!18!`%A<`0`&%@$`
+MK%P!``4"``"P7`$`!@(``-!<`0`$`0``V%P!``0!````70$`!`$``!A=`0`$
+M`0``)%T!``60`0`H70$`!I`!`#Q=`0`$`0``4%T!``0!``!H70$`!8T!`&Q=
+M`0`&C0$`>%T!``0!``"$70$`!`$``*!=`0`$`0``M%T!``0!``#D70$`!`$`
+M``A>`0`$`0``(%X!``4"```D7@$`!@(``#1>`0`%G@``.%X!``:>``!$7@$`
+M!`$``&A>`0`$`0``?%X!``0!``"(7@$`!1L``(Q>`0`&&P``O%X!``4W`0#`
+M7@$`!C<!``A?`0`%D`$`#%\!``:0`0`L7P$`!8T!`#!?`0`&C0$`/%\!``4U
+M`0!`7P$`!C4!`%!?`0`%D`$`5%\!``:0`0!<7P$`!34!`&!?`0`&-0$`;%\!
+M``6-`0!P7P$`!HT!`,!?`0`$`0``T%\!``0!``#<7P$`!9`!`.!?`0`&D`$`
+M`&`!``6-`0`$8`$`!HT!`%Q@`0`%D`$`8&`!``:0`0!\8`$`!8T!`(!@`0`&
+MC0$``&$!``60`0`$80$`!I`!`"!A`0`%C0$`)&$!``:-`0"\80$`!`$``,1A
+M`0`%`0``R&$!``8!``#480$`!`$``.!A`0`$`0``W&$!``4!``#D80$`!@$`
+M`.AA`0`%`0``[&$!``8!``#X80$`!`$``"AB`0`%D`$`+&(!``:0`0"08@$`
+M!`$``*!B`0`$`0``Q&(!``0!``#<8@$`!`$``.1B`0`%+```Z&(!``8L```8
+M8P$`!`$``"1C`0`$`0``(&,!``6I```H8P$`!JD``#!C`0`$`0``+&,!``5+
+M`0`T8P$`!DL!`#QC`0`$`0``.&,!``7/``!`8P$`!L\``$AC`0`$`0``1&,!
+M``45``!,8P$`!A4``%1C`0`$`0``4&,!``58`0!88P$`!E@!`&!C`0`$`0``
+M7&,!``76```$8P$`!=8``&1C`0`&U@``:&,!``7A```<8P$`!>$``&QC`0`&
+MX0``<&,!``4I`0`48P$`!2D!`/1B`0`%*0$`=&,!``8I`0"<8P$`!9`!`*!C
+M`0`&D`$`Q&,!``6-`0#(8P$`!HT!`.QC`0`%C0$`\&,!``:-`0`<9`$`!8T!
+M`"!D`0`&C0$`.&0!``5*```\9`$`!DH``&QD`0`%D`$`<&0!``:0`0",9`$`
+M!8T!`)!D`0`&C0$`G&0!``4P``"@9`$`!C```+!D`0`%V@``M&0!``;:``#@
+M9`$`!9`!`.1D`0`&D`$`_&0!``6-`0``90$`!HT!``QE`0`%@@``$&4!``:"
+M``!090$`!8T!`%1E`0`&C0$`M&4!``60`0"X90$`!I`!`-AE`0`$`0``X&4!
+M``:0`0`$9@$`!8T!``AF`0`&C0$`7&8!``60`0!@9@$`!I`!`'QF`0`$`0``
+MA&8!``:0`0"D9@$`!8T!`*AF`0`&C0$`Z&8!``60`0#L9@$`!I`!`&1G`0`%
+MC0$`:&<!``:-`0"<9P$`!8T!`*!G`0`&C0$`M&<!``60`0"X9P$`!I`!`-AG
+M`0`$`0``X&<!``60`0#D9P$`!I`!``!H`0`%C0$`!&@!``:-`0#$:`$`!9`!
+M`,AH`0`&D`$`N&D!``0!```,:@$`!8\``!!J`0`&CP``'&H!``0!```\:@$`
+M!`$``-QJ`0`$`0``#&L!``0!```P:P$`!8$!`#1K`0`&@0$`3&L!``7]``!0
+M:P$`!OT``(AK`0`$`0``K&L!``60`0!HDP$`!9`!`$20`0`%D`$`_(@!``60
+M`0#X=`$`!9`!`"1L`0`%D`$`L&L!``:0`0#$:P$`!<@``"2'`0`%R```R&L!
+M``;(``#8:P$`!=H``-QK`0`&V@``:&P!``4,``!L;`$`!@P``(1L`0`%D`$`
+MB&P!``:0`0"H;`$`!9`!`*QL`0`&D`$`%&T!``5=```8;0$`!ET``"1M`0`%
+M3```*&T!``9,```X;0$`!8L!`#QM`0`&BP$`C&T!``0!``"<;0$`!`$``+1M
+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
+M```PE@$`!`$``#B6`0`$`0``P)8!``60`0#$E@$`!I`!``"7`0`%C0$`!)<!
+M``:-`0`\F`$`!`$``&R8`0`$`0``A)@!``0!``#,F`$`!`$``#R9`0`$`0``
+MP)D!``0!```$F@$`!`$``"2:`0`$`0``>)H!``0!``"LF@$`!`$``.":`0`$
+M`0``,)L!``60`0`TFP$`!I`!`%R;`0`%C0$`8)L!``:-`0!PG0$`!`$``.2=
+M`0`%D`$`Z)T!``:0`0`0G@$`!8T!`!2>`0`&C0$`G)X!``59``"@G@$`!ED`
+M`.B>`0`%(`$`[)X!``8@`0`\GP$`!0(``$"?`0`&`@``7)\!``4!``!@GP$`
+M!@$``)"@`0`$`0``K*`!``4!``"PH`$`!@$``,2@`0`%C0$`R*`!``:-`0!4
+MH0$`!8T!`%BA`0`&C0$`1*(!``6-`0!(H@$`!HT!``2C`0`%%```"*,!``84
+M``!DHP$`!0$``&BC`0`&`0``D*,!``0!``"8HP$`!`$``!BD`0`%`0``'*0!
+M``8!``!,I`$`!`$``%2D`0`$`0``<*0!``0!``"0I`$`!1,!`)2D`0`&$P$`
+MR*0!``0!``#<I`$`!0$``."D`0`&`0``J*8!``0!```(IP$`!0$```RG`0`&
+M`0``_*<!``0!```LJ0$`!0(``#"I`0`&`@``1*D!``4!``!(J0$`!@$``!RJ
+M`0`%Y@``(*H!``;F``!PJ@$`!`$``)RJ`0`$`0``K*H!``0!``#$J@$`!`$`
+M`/2K`0`%50$`^*L!``95`0#$K0$`!54!`,BM`0`&50$`%*X!``0!``!<K@$`
+M!0$``&"N`0`&`0``.*\!``0!```HL`$`!0(``"RP`0`&`@``8+`!``0!``!H
+ML`$`!0(``&RP`0`&`@``Z+`!``4!``#LL`$`!@$``!RQ`0`$`0``/+$!``4!
+M``!`L0$`!@$``!2R`0`%C0$`&+(!``:-`0!XL@$`!9`!`'RR`0`&D`$`Q+(!
+M``0!``#LL@$`!0$``/"R`0`&`0``(+,!``4!```DLP$`!@$``#RS`0`%`0``
+M0+,!``8!``!8LP$`!0$``%RS`0`&`0``[+,!``0!``#HLP$`!0(``/"S`0`&
+M`@``Y+,!``4"``#TLP$`!@(``*BT`0`$`0``M+4!``4!``"XM0$`!@$``"BV
+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
+M`0`&<0$`0-D!``79``!$V0$`!MD``-#9`0`$`0``]-D!``0!```,V@$`!8T!
+M`!#:`0`&C0$`4-H!``6"`0!4V@$`!H(!`,3:`0`$`0``X-H!``0!``#\V@$`
+M!`$``"S;`0`%G@``,-L!``:>``!,VP$`!`$``'3;`0`%G@``>-L!``:>``"<
+MVP$`!`$``)3<`0`%'@$`I-L!``8>`0#4VP$`!9X``-C;`0`&G@``_-L!``6>
+M````W`$`!IX``&#<`0`$`0``?-P!``0!``"PW`$`!`$``%S;`0`%'@$`N-P!
+M``8>`0#LW`$`!9X``/#<`0`&G@``--T!``4!```XW0$`!@$``'3=`0`$`0``
+MJ-T!``6>``"LW0$`!IX``/C=`0`%<0$`_-T!``9Q`0`0W@$`!=D``!3>`0`&
+MV0``(-X!``4!``"<Y0$`!0$``/C@`0`%`0``#-\!``4!```DW@$`!@$``##>
+M`0`$`0``6-X!``6>``!<W@$`!IX``*3>`0`$`0``L-X!``6>``"TW@$`!IX`
+M`!#?`0`%<0$`%-\!``9Q`0`LWP$`!=D``##?`0`&V0``/-\!``4!``!`WP$`
+M!@$``%3?`0`%C0$`6-\!``:-`0!TWP$`!`$``,SE`0`%`0``?-\!``8!``"(
+MWP$`!7$!`(S?`0`&<0$`H-\!``79``"DWP$`!MD``/3?`0`%C0$`^-\!``:-
+M`0`8X`$`!8(!`!S@`0`&@@$`1.`!``60`0!(X`$`!I`!`-C@`0`%`0``W.`!
+M``8!``#\X`$`!0$```#A`0`&`0``#.$!``4!```0X0$`!@$``(CA`0`$`0``
+M+.8!``4!``",X0$`!@$``,CA`0`%`0``S.$!``8!``#8X0$`!0$``-SA`0`&
+M`0``&.(!``0!``!8X@$`!`$``&SB`0`$`0``@.(!``0!``"8X@$`!9X``)SB
+M`0`&G@``T.(!``60`0#4X@$`!I`!`"SC`0`$`0``Y.,!``4!``#HXP$`!@$`
+M``CD`0`%`0``#.0!``8!```TY`$`!8(!`#CD`0`&@@$`2.0!``60`0!,Y`$`
+M!I`!`*#D`0`%C0$`I.0!``:-`0#4Y`$`!8T!`-CD`0`&C0$`].0!``0!``#8
+MY0$`!`$``-3E`0`%`0``W.4!``8!```PY@$`!`$``(3A`0`%`0``-.8!``8!
+M``!TY@$`!0$``'CF`0`&`0``A.8!``4!``"(Y@$`!@$``$CG`0`%`@``3.<!
+M``8"``!0YP$`!8T!`%3G`0`&C0$`6.<!``4U`0!<YP$`!C4!`+SG`0`%`@``
+MP.<!``8"``#$YP$`!8T!`,CG`0`&C0$`S.<!``4U`0#0YP$`!C4!`!CH`0`%
+M`@``'.@!``8"```@Z`$`!8T!`"3H`0`&C0$`*.@!``4U`0`LZ`$`!C4!`-CH
+M`0`%B0``W.@!``:)```,Z0$`!0(``!#I`0`&`@``'.D!``4O```@Z0$`!B\`
+M`$CI`0`%D`$`3.D!``:0`0!XZ0$`!8T!`'SI`0`&C0$`B.D!``0!``"LZ0$`
+M!2\``+#I`0`&+P``P.D!``0!``#0Z0$`!2\``-3I`0`&+P``#.H!``6-`0`0
+MZ@$`!HT!`'#J`0`%`@``=.H!``8"```HZP$`!`$``&#K`0`$`0``A.L!``0!
+M``"HZP$`!`$``,CK`0`$`0``].L!``0!```H[`$`!`$``&SL`0`%`@``<.P!
+M``8"``#([`$`!7<``,SL`0`&=P``].P!``4"``#X[`$`!@(``/SL`0`%C0$`
+M`.T!``:-`0`$[0$`!34!``CM`0`&-0$`8.T!``4"``!D[0$`!@(``&CM`0`%
+MC0$`;.T!``:-`0!P[0$`!34!`'3M`0`&-0$`N.T!``4"``"\[0$`!@(``,#M
+M`0`%C0$`Q.T!``:-`0#([0$`!34!`,SM`0`&-0$`*.X!``4"```L[@$`!@(`
+M`##N`0`%C0$`-.X!``:-`0`X[@$`!34!`#SN`0`&-0$`F.X!``4"``"<[@$`
+M!@(``/CN`0`%=P``_.X!``9W```P[P$`!7<``#3O`0`&=P``C.\!``4"``"0
+M[P$`!@(``)3O`0`%C0$`F.\!``:-`0"<[P$`!34!`*#O`0`&-0$`^.\!``4"
+M``#\[P$`!@(``$CP`0`%=P``3/`!``9W``"L\`$`!7<``+#P`0`&=P``\/`!
+M``4"``#T\`$`!@(``/CP`0`%C0$`_/`!``:-`0``\0$`!34!``3Q`0`&-0$`
+MO/(!``0!``#T\@$`!`$```CS`0`$`0``,/,!``4@`0`T\P$`!B`!`(SS`0`%
+M`0``D/,!``8!``!D]0$`!0$``&CU`0`&`0``]/8!``4!``#X]@$`!@$``!SW
+M`0`%50$`(/<!``95`0`\]P$`!0$``$#W`0`&`0``=/<!``4!``!X]P$`!@$`
+M`*SW`0`%`0``L/<!``8!```(^0$`!54!``SY`0`&50$`0/D!``6#``!$^0$`
+M!H,``&#Y`0`%@P``9/D!``:#``"4^0$`!0(``)CY`0`&`@``J/D!``4"``"L
+M^0$`!@(``-#Y`0`%`@``U/D!``8"``#\^0$`!<T```#Z`0`&S0``'/H!``7-
+M```@^@$`!LT``#SZ`0`$`0``1/H!``4!``!(^@$`!@$``%#Z`0`%`0``5/H!
+M``8!``!<^@$`!0$``&#Z`0`&`0``:/H!``4!``!L^@$`!@$``'3Z`0`%`0``
+M>/H!``8!``"`^@$`!0$``(3Z`0`&`0``C/H!``4!``"0^@$`!@$``)CZ`0`%
+M`0``G/H!``8!``#X^@$`!0(``/SZ`0`&`@```/L!``6-`0`$^P$`!HT!``C[
+M`0`%-0$`#/L!``8U`0!L^P$`!0(``'#[`0`&`@``=/L!``6-`0!X^P$`!HT!
+M`'S[`0`%-0$`@/L!``8U`0#(^P$`!0(``,S[`0`&`@``T/L!``6-`0#4^P$`
+M!HT!`-C[`0`%-0$`W/L!``8U`0#L_`$`!`$``%C]`0`%+P``7/T!``8O``!P
+M_0$`!9`!`'3]`0`&D`$`H/T!``6-`0"D_0$`!HT!`+#]`0`$`0``2/X!``4O
+M``!,_@$`!B\``%S^`0`$`0``S/X!``4O``#0_@$`!B\``.#^`0`$`0``2/\!
+M``4O``!,_P$`!B\``%S_`0`$`0``O/\!``4O``#`_P$`!B\``````@`%C0$`
+M!``"``:-`0!@``(`!0(``&0``@`&`@``.`$"``0!``!\`0(`!`$``*`!`@`$
+M`0``Q`$"``0!``#L`0(`!`$```0"`@`$`0``*`("``4"```L`@(`!@(``%0"
+M`@`%`@``6`("``8"``"0`@(`!0(``)0"`@`&`@``S`("``4"``#0`@(`!@(`
+M`!P#`@`%=P``(`,"``9W```\!`(`!7<``$`$`@`&=P``6`0"``0!``!P!`(`
+M!7<``'0$`@`&=P``Z`0"``5W``#L!`(`!G<``&0%`@`%=P``:`4"``9W``#8
+M!0(`!0(``-P%`@`&`@``.`8"``5W```\!@(`!G<``%@&`@`%=P``7`8"``9W
+M``"L!@(`!7<``+`&`@`&=P``V`8"``4"``#<!@(`!@(``.`&`@`%C0$`Y`8"
+M``:-`0#H!@(`!34!`.P&`@`&-0$`.`<"``4"```\!P(`!@(``$`'`@`%C0$`
+M1`<"``:-`0!(!P(`!34!`$P'`@`&-0$`H`<"``4"``"D!P(`!@(``*@'`@`%
+MC0$`K`<"``:-`0"P!P(`!34!`+0'`@`&-0$`"`@"``4"```,"`(`!@(``!`(
+M`@`%C0$`%`@"``:-`0`8"`(`!34!`!P(`@`&-0$`=`@"``4"``!X"`(`!@(`
+M`'P(`@`%C0$`@`@"``:-`0"$"`(`!34!`(@(`@`&-0$`D`D"``0!``#0"0(`
+M!`$``/P)`@`$`0``#`H"``0!``"X"@(`!0$``+P*`@`&`0``W`H"``7F``#@
+M"@(`!N8``%P+`@`%`0``8`L"``8!``!\"P(`!`$``-`+`@`%`0``U`L"``8!
+M``!0#`(`!0$``%0,`@`&`0``T`P"``4!``#4#`(`!@$``"`-`@`%`0``)`T"
+M``8!``!T#0(`!`$``(`-`@`%`0``A`T"``8!```$#@(`!0$```@.`@`&`0``
+M>`X"``0!``"@#@(`!0$``*0.`@`&`0``V`X"``0!``#H#@(`!0$``.P.`@`&
+M`0``-!`"``0!``#\$`(`!0$````1`@`&`0``)!("``0!``!H$P(`!`$``-`4
+M`@`%@P``U!0"``:#``#P%`(`!8,``/04`@`&@P``%!8"``0!``!`%@(`!`$`
+M`,@6`@`$`0``Y!8"``0!``#4%P(`!0$``-@7`@`&`0``0!@"``0!``!X&`(`
+M!0$``'P8`@`&`0``^!@"``4!``#\&`(`!@$``(@9`@`%S0``C!D"``;-``"H
+M&0(`!<T``*P9`@`&S0``R!D"``0!``#8&0(`!0$``-P9`@`&`0``Y!D"``4!
+M``#H&0(`!@$``/`9`@`%`0``]!D"``8!``#\&0(`!0$````:`@`&`0``"!H"
+M``4!```,&@(`!@$``!0:`@`%`0``&!H"``8!```@&@(`!0$``"0:`@`&`0``
+M+!H"``4A```P&@(`!B$``(P:`@`%`@``D!H"``8"``"4&@(`!8T!`)@:`@`&
+MC0$`G!H"``4U`0"@&@(`!C4!```;`@`%`@``!!L"``8"```(&P(`!8T!``P;
+M`@`&C0$`$!L"``4U`0`4&P(`!C4!`%P;`@`%`@``8!L"``8"``!D&P(`!8T!
+M`&@;`@`&C0$`;!L"``4U`0!P&P(`!C4!`(`<`@`$`0``[!P"``4O``#P'`(`
+M!B\```0=`@`%D`$`"!T"``:0`0`T'0(`!8T!`#@=`@`&C0$`1!T"``0!``#<
+M'0(`!2\``.`=`@`&+P``\!T"``0!``!@'@(`!2\``&0>`@`&+P``=!X"``0!
+M``#<'@(`!2\``.`>`@`&+P``\!X"``0!``!0'P(`!2\``%0?`@`&+P``E!\"
+M``6-`0"8'P(`!HT!`$@@`@`$`0``6"`"``0!``!D(`(`!`$``'@@`@`%`@``
+M?"`"``8"``"D(`(`!0(``*@@`@`&`@``X"`"``4"``#D(`(`!@(``!PA`@`%
+M`@``("$"``8"``!L(0(`!7<``'`A`@`&=P``F"$"``4"``"<(0(`!@(``-PA
+M`@`%`@``X"$"``8"``#D(0(`!8T!`.@A`@`&C0$`["$"``4U`0#P(0(`!C4!
+M`#PB`@`%`@``0"("``8"``!$(@(`!8T!`$@B`@`&C0$`3"("``4U`0!0(@(`
+M!C4!`*0B`@`%`@``J"("``8"``"L(@(`!8T!`+`B`@`&C0$`M"("``4U`0"X
+M(@(`!C4!``PC`@`%`@``$","``8"```4(P(`!8T!`!@C`@`&C0$`'","``4U
+M`0`@(P(`!C4!`'@C`@`%`@``?","``8"``"`(P(`!8T!`(0C`@`&C0$`B","
+M``4U`0",(P(`!C4!`"0D`@`%`@``*"0"``8"``"H)`(`!`$``*0E`@`%`0``
+MJ"4"``8!```()@(`!`$``+`G`@`%`0``M"<"``8!``!L*0(`!0$``'`I`@`&
+M`0``M"D"``4!``"X*0(`!@$``.0I`@`%`0``Z"D"``8!``"T*@(`!`$``*0M
+M`@`$`0``O"T"``0!``#(+0(`!9`!`,PM`@`&D`$`^"T"``4!``#\+0(`!@$`
+M`#PN`@`%C0$`0"X"``:-`0!<+@(`!`$``'`N`@`%C0$`="X"``:-`0`0+P(`
+M!8T!`!0O`@`&C0$`;"\"``6#``!P+P(`!H,``(PO`@`%@P``D"\"``:#``"L
+M+P(`!8,``+`O`@`&@P``S#`"``0!``!,,0(`!0$``%`Q`@`&`0``9#$"``0!
+M``"`,0(`!`$``"`R`@`%`0``)#("``8!``"4,@(`!0$``)@R`@`&`0```#,"
+M``0!```T,P(`!0$``#@S`@`&`0``4#,"``4!``!4,P(`!@$``-@S`@`%`0``
+MW#,"``8!``!H-`(`!<T``&PT`@`&S0``B#0"``7-``",-`(`!LT``*`T`@`%
+MS0``I#0"``;-``#`-`(`!`$``,@T`@`%`0``S#0"``8!``#4-`(`!0$``-@T
+M`@`&`0``X#0"``4!``#D-`(`!@$``.PT`@`%`0``\#0"``8!``#X-`(`!0$`
+M`/PT`@`&`0``!#4"``4!```(-0(`!@$``!`U`@`%`0``%#4"``8!```<-0(`
+M!2$``"`U`@`&(0``?#4"``4"``"`-0(`!@(``(0U`@`%C0$`B#4"``:-`0",
+M-0(`!34!`)`U`@`&-0$`\#4"``4"``#T-0(`!@(``/@U`@`%C0$`_#4"``:-
+M`0``-@(`!34!``0V`@`&-0$`3#8"``4"``!0-@(`!@(``%0V`@`%C0$`6#8"
+M``:-`0!<-@(`!34!`&`V`@`&-0$`<#<"``0!``#<-P(`!2\``.`W`@`&+P``
+M]#<"``60`0#X-P(`!I`!`"0X`@`%C0$`*#@"``:-`0`T.`(`!`$``,PX`@`%
+M+P``T#@"``8O``#@.`(`!`$``$PY`@`$`0``L#D"``0!```0.@(`!2\``!0Z
+M`@`&+P``5#H"``6-`0!8.@(`!HT!`"0[`@`$`0``6#L"``0!``!X.P(`!`$`
+M`)@[`@`$`0``L#L"``0!``"\.P(`!`$``-`[`@`%`@``U#L"``8"``#\.P(`
+M!0(````\`@`&`@``.#P"``4"```\/`(`!@(``'0\`@`%`@``>#P"``8"``#4
+M/`(`!7<``-@\`@`&=P``0#T"``4O``!$/0(`!B\``&`]`@`%=P``9#T"``9W
+M``!P/0(`!`$``(@]`@`%=P``C#T"``9W``"T/0(`!0(``#@]`@`%`@``N#T"
+M``8"``#X/0(`!0(``/P]`@`&`@```#X"``6-`0`$/@(`!HT!``@^`@`%-0$`
+M##X"``8U`0!8/@(`!0(``%P^`@`&`@``8#X"``6-`0!D/@(`!HT!`&@^`@`%
+M-0$`;#X"``8U`0#`/@(`!0(``,0^`@`&`@``R#X"``6-`0#,/@(`!HT!`-`^
+M`@`%-0$`U#X"``8U`0`H/P(`!0(``"P_`@`&`@``,#\"``6-`0`T/P(`!HT!
+M`#@_`@`%-0$`/#\"``8U`0"4/P(`!0(``)@_`@`&`@``G#\"``6-`0"@/P(`
+M!HT!`*0_`@`%-0$`J#\"``8U`0!$0`(`!0(``$A``@`&`@``R$`"``0!``#$
+M00(`!0$``,A!`@`&`0``*$("``0!``#00P(`!0$``-1#`@`&`0``C$4"``4!
+M``"010(`!@$``-1%`@`%`0``V$4"``8!```$1@(`!0$```A&`@`&`0``U$8"
+M``0!``#$20(`!`$``.1)`@`%D`$`Z$D"``:0`0`42@(`!0$``!A*`@`&`0``
+M6$H"``6-`0!<2@(`!HT!`'A*`@`$`0``C$H"``6-`0"02@(`!HT!`"Q+`@`%
+MC0$`,$L"``:-`0"(2P(`!8,``(Q+`@`&@P``J$L"``6#``"L2P(`!H,``,A+
+M`@`%@P``S$L"``:#``#H3`(`!`$``&A-`@`%`0``;$T"``8!``"`30(`!`$`
+M`)Q-`@`$`0``/$X"``4!``!`3@(`!@$``+!.`@`%`0``M$X"``8!```<3P(`
+M!`$``%!/`@`%`0``5$\"``8!``!L3P(`!0$``'!/`@`&`0``]$\"``4!``#X
+M3P(`!@$``(10`@`%S0``B%`"``;-``"D4`(`!<T``*A0`@`&S0``O%`"``7-
+M``#`4`(`!LT``-Q0`@`$`0``Y%`"``4!``#H4`(`!@$``/!0`@`%`0``]%`"
+M``8!``#\4`(`!0$```!1`@`&`0``"%$"``4!```,40(`!@$``!11`@`%`0``
+M&%$"``8!```@40(`!0$``"11`@`&`0``+%$"``4!```P40(`!@$``#A1`@`%
+M(0``/%$"``8A```H`0```@$``"P!```"`0``,`$```(!```T`0```@$``#@!
+M```"`0``/`$```(!``!``0```@$``$0!```"`0``2`$```(!``!,`0```@$`
+M`%`!```"`0``5`$```(!``!8`0```@$``%P!```"`0``8`$```(!``!D`0``
+M`@$``&@!```"`0``;`$```(!``!P`0```@$``'0!```"`0``>`$```(!``!\
+M`0```@$``(`!```"`0``A`$```(!``"(`0```@$``(P!```"`0``D`$```(!
+M``"4`0```@$``)@!```"`0``G`$```(!``"@`0```@$``*0!```"`0``J`$`
+M``(!``"L`0```@$``+`!```"`0``>`(```(,`0!\`@```F0``(`"```"P```
+MA`(```*S``"(`@```GH!`(P"```"TP``D`(```)4``"4`@```M\``)@"```"
+MH```G`(```)W`0"@`@```DH!`*0"```"O0``J`(```(^``"L`@```H0``+`"
+M```"5P``M`(```(@``"X`@```F@!`+P"```"DP$`P`(```(N``#$`@```HP`
+M`,@"```"1P$`S`(```(I``#0`@```CP``-0"```":```V`(```)^`0#<`@``
+M`GD!`.`"```"&0$`Y`(```*T``#H`@```E\!`.P"```"8@$`\`(```()`0#T
+M`@```MP``/@"```"/`$`_`(```*0`````P```G(!``0#```"O@``"`,```*V
+M```,`P```H4``!`#```"K@``%`,```)5```8`P```L<``!P#```".`$`(`,`
+M``(.`0`D`P```J0``"@#```",P$`+`,```+I```P`P```EP!`#0#```"3`$`
+M.`,```(K`0`\`P```C(``$`#```"M0``1`,```):`0!(`P```AL!`$P#```"
+M)`$`4`,```(]``!4`P```G0``%@#```"1`$`7`,```+D``!@`P```D\``&0#
+M```"-@``:`,```*+``!L`P```@D``'`#```"]0``=`,```(]`0!X`P```C0!
+M`'P#```"]@``@`,```)_`0"$`P```FD``(@#```""P``C`,```)D`0"0`P``
+M`JP``)0#```"#P$`F`,```(8`0"<`P```FX!`*`#```",@$`I`,```*F``"H
+M`P```D4``*P#```"+0$`L`,```(3``"T`P```KL``+@#```";P``O`,```+X
+M``#``P```OH``,0#```"40$`R`,```)C`0#,`P```GT!`-`#```"#P``U`,`
+M``).`0#8`P```B(!`-P#```""P$`X`,```*A``#D`P```D\!`.@#```"`0``
+M[`,```*1`0#P`P```BH!`/@#```"6@$`_`,```(;`0``!````B0!``0$```"
+M/0``"`0```)T```,!````@$``)@:```"10$`G!H```)E`0"@&@```E<!`*0:
+M```"?`$`J!H```)C``"L&@```G4``+`:```"DP``M!H```)L``"X&@```@T`
+M`+P:```"-0``P!H```)A``#$&@```F(``,@:```".0``S!H```)K`0#0&@``
+M`@T!`-0:```"AP$`V!H```*!``#<&@```G4!`.`:```"`@$`Y!H```*J``#H
+M&@```B<!`.P:```"(@``\!H```('`0#T&@```AD``/@:```"9P$`_!H```+G
+M````&P```A\```0;```"*@``"!L```*M```,&P```GL!`!`;```":0$`%!L`
+M``)V`0`8&P```CD!`!P;```"\@``(!L```+_```D&P```NX``"@;```"$@$`
+M+!L```)]```P&P```I@``#0;```"<P``.!L```))`0`\&P```I\``$`;```"
+M0```1!L```(Z`0!(&P```C8!`$P;```">0``4!L```(Z``!4&P```DT!`%@;
+M```"W0``7!L```(N`0!@&P```N,``&0;```"PP``:!L```+B``!L&P```D$!
+M`'`;```"S@``=!L```(W``!X&P```F```'P;```"V```@!L```)&`0"$&P``
+M`E0!`(@;```")@$`C!L```(<``"0&P```EL``)0;```",`$`F!L```*2`0"<
+M&P```D@``*`;```"F@``I!L```)@`0"H&P```M0``*P;```"!`$`L!L```(>
+M``"T&P```OL``+@;```".```O!L```(``0#`&P```NL``,0;```"C0``R!L`
+M``(G``#,&P```E```-`;```"D@``U!L```+;``#8&P```LL``-P;```"5@$`
+MX!L```+*``#D&P```E$!`.@;```"C@$`[!L```((``#P&P```J(``/0;```"
+M<```^!L```)J``#\&P```N\````<```"\P``!!P```(&`0`('````@$```P<
+M```"+`$`$!P```)(`0`8'````L,``!P<```"X@``(!P```)!`0`D'````LX`
+M`"@<```"-P``+!P```(!``"D.@```@$``*@Z```"`0``K#H```(!``"P.@``
+M`@$``+0Z```"`0``N#H```(!``"\.@```@$``,`Z```"`0``$#P```):```4
+M/````H```!@\```"<P$`'#P```)K```@/````D0``"0\```"UP``*#P```*X
+M```L/````AP!`#`\```"JP``-#P```)3```X/````IT``#P\```"5@``0#P`
+M``(#`0!$/````EX!`$@\```"B@``3#P```+^``!0/````N4``%0\```"F`$`
+M6#P```*,`0!</````KD``&`\```"?```9#P```(C`0!H/````B@``&P\```"
+M70$`<#P```)2`0!T/````H8``'@\```"80$`?#P```)>``"`/````C\!`(0\
+M```"`0$`B#P```+\``",/````A(``)`\```";`$`E#P```)Z``"8/````N``
+M`)P\```"<0$`H#P```+9``"D/````I8``*@\```",0$`K#P```+Y``"P/```
+M`A```+0\```"G```N#P```(*``"\/````I<``,`\```"/@$`Q#P```*P``#(
+M/````N@``,P\```"/P``T#P```(?`0#4/````J,``-@\```"L0``W#P```(7
+M`0#@/````DT``.0\```"0@$`Z#P```)0`0#L/````A0!`/`\```"E`$`]#P`
+M``))``#X/````L8``/P\```"J````#T```*"`0`$/0```DP```@]```"C@``
+M##T```*&`0`0/0```J<``!0]```"S```&#T```)"```</0```DL``"`]```"
+M+0``)#T```)!```H/0```CL``"P]```"Z@``,#T```)&```T/0```G\``#@]
+M```"-```/#T```(S``!`/0```A@``$0]```"<@``2#T```+W``!,/0```FT`
+M`%`]```")0$`5#T```*!`0!8/0```M```%P]```"40$`8#T```*1``!D/0``
+M`H\!`&@]```"$`$`;#T```+1``!P/0```B,``'0]```"=`$`>#T```)N``!\
+M/0```M4``(`]```"Q0``A#T```+L``"(/0```HH!`)`]```"%P$`E#T```)-
+M``"8/0```D(!`)P]```"4`$`H#T```(4`0"D/0```I4!`*P]```"`0``^$X`
+M``(!``#\3@```@$```!/```"`0``!$\```(!```(3P```@$```Q/```"`0``
+M7$\```(!``!@3P```@$``&1/```"`0``:$\```(!``!L3P```@$``'!/```"
+M`0``=$\```(!``!X3P```@$``'Q/```"`0``@$\```(!``"$3P```@$``(A/
+M```"`0``C$\```(!``"03P```@$``)1/```"`0``F$\```(!``"<3P```@$`
+M`*!/```"`0``I$\```(!``"H3P```@$``*Q/```"`0``L$\```(!``"T3P``
+M`@$``+A/```"`0``O$\```(!``#`3P```@$``,1/```"`0``R$\```(!``#,
+M3P```@$``-!/```"`0``U$\```(!``#83P```@$``-Q/```"`0``X$\```(!
+M``#D3P```@$``.A/```"`0``[$\```(!```,4````@$``!!0```"`0``%%``
+M``(!```84````@$``!Q0```"`0``(%````(!```D4````@$``"A0```"`0``
+M+%````(!```P4````@$``#10```"`0``.%````(!```\4````@$``$!0```"
+M`0``1%````(!``!(4````@$``$Q0```"`0``4%````(!``!44````@$``%A0
+M```"`0``7%````(!``!@4````@$``&10```"`0``:%````(!``!L4````@$`
+M`'!0```"`0``=%````(!``!X4````@$``'Q0```"`0``@%````(!``!X7```
+M`@$``'Q<```"`0``@%P```(!``"$7````@$``(A<```"`0``C%P```(!``"0
+M7````@$``'AI```"`0``?&D```(!``"`:0```@$``(1I```"`0``B&D```(!
+M``",:0```@$``)!I```"`0``E&D```(!``"@=0```@$``*1U```"`0``J'4`
+M``(!``"L=0```@$``+!U```"`0``M'4```(!``"X=0```@$``+QU```"`0``
+MH($```(!``"D@0```@$``*B!```"`0``K($```(!``"P@0```@$``+2!```"
+M`0``N($```(!``"\@0```@$``(B/```"`0``C(\```(!``"0CP```@$``)2/
+M```"`0``F(\```(!``"<CP```@$``*"/```"`0``I(\```(!```0`````@(`
+M`!0````"`@``&`````("```<`````@(``"`````"`@``)`````("```H````
+M`@(``"P````"`@````````(!```@`````O```$`````"6```8`````)?``"`
+M`````DH``*`````"+P``P`````)F``#@`````AX!```!```"B0``(`$```);
+M`0!``0```B4``&`!```"*0$`@`$```(6`0"@`0```AL``,`!```"`0``X`$`
+M``(W`0```@```F8!`"`"```"%0$`0`(```)1`0!@`@```BL``(`"```"`0``
+MH`(```(!``#``@```@$``.`"```"`0````,```(!```@`P```@$``$`#```"
+M`0``8`,```(!``"``P```@$``*`#```"`0``P`,```(!``#@`P```@$````$
+M```"`0``(`0```(!``!`!````@$``&`$```"`0``@`0```(!``"@!````G@!
+M`,`$```"'0$`X`0```(!````!0```@$``"`%```"`0``0`4```(!``!@!0``
+M`@$``(`%```"`0``H`4```*7`0#`!0```KP``.`%```"`0````8```(!```@
+M!@```@$``$`&```"`0``8`8```(!``"`!@```@$``*`&```"`0``P`8```)P
+M`0#@!@```OT````'```"$P$`(`<```(4``!`!P```F\!`&`'```"`0``@`<`
+M``(!``"@!P```@$``,`'```"`0``X`<```(!````"````@$``"`(```"1P``
+M0`@```)D``!@"````@$``(`(```"`0``H`@```(!``#`"````F,!`.`(```"
+M?0$```D```).`0`@"0```@\``$`)```"(@$`8`D```(+`0"`"0```J$``*`)
+M```"3P$`P`D```)%``#@"0```A,````*```"+0$`(`H```)O``!`"@```KL`
+M`&`*```",P$`@`H```+I``"@"@```EP!`,`*```"3`$`X`H```(J`0``"P``
+M`BL!`"`+```"D0$`0`L```)^``!@"P```EH!`(`+```"&P$`H`L```(]``#`
+M"P```B0!`.`+```"=`````P```(R```@#````O4``$`,```"/0$`8`P```(T
+M`0"`#````O8``*`,```"M0``P`P```+D``#@#````D0!```-```"3P``(`T`
+M``)E``!`#0```C8``&`-```"BP``@`T```)_`0"@#0```FD``,`-```""P``
+MX`T```)D`0``#@```@\!`"`.```"K```0`X```(8`0!@#@```FX!`(`.```"
+M,@$`H`X```*F``#`#@```FH!`.`.```"50````\```+'```@#P```C@!`$`/
+M```"#@$`8`\```*D``"`#P```@$``*`/```"`0``P`\```(!``#@#P```O@`
+M```0```"^@``(!````(,`0!`$````AD!`&`0```"M```@!````)?`0"@$```
+M`F(!`,`0```""0$`X!````+<````$0```CP!`"`1```"<@$`0!$```*0``!@
+M$0```KX``(`1```"M@``H!$```*%``#`$0```JX``.`1```"P````!(```(!
+M```@$@```M,``$`2```"LP``8!(```)Z`0"`$@```CL!`*`2```"5```P!(`
+M``(!``#@$@```@$````3```"`0``(!,```+?``!`$P```@$``&`3```"A0$`
+M@!,```(!``"@$P```E(``,`3```"E```X!,```)[````%````@D``"`4```"
+MO0``0!0```(^``!@%````DH!`(`4```"A```H!0```)7``#`%````B```.`4
+M```":`$``!4```)W`0`@%0```BX``$`5```"DP$`8!4```*,``"`%0```D<!
+M`*`5```"*0``P!4```)Y`0#@%0```CP````6```":```(!8```)^`0!`%@``
+M`J```&`6```"`0``@!8```*$`0"@%@```F4!`,`6```"`0``X!8```(!````
+M%P```@$``"`7```"`0``0!<```*.`0!@%P```@@``(`7```"<```H!<```*B
+M``#`%P```FH``.`7```"[P```!@```+S```@&````@8!`$`8```")P``8!@`
+M``*2``"`&````E```*`8```"RP``P!@```+;``#@&````C8!```9```">0``
+M(!D```(Z``!`&0```DT!`&`9```"2`$`@!D```+=``"@&0```BP!`,`9```"
+M40``X!D```+#````&@```N(``"`:```"S@``0!H```)!`0!@&@```C<``(`:
+M```"+@$`H!H```+C``#`&@```M@``.`:```"8````!L```)&`0`@&P```H,!
+M`$`;```"5`$`8!L```(F`0"`&P```IH``*`;```"8`$`P!L```+4``#@&P``
+M`@0!```<```"^P``(!P```(>``!`'````C@``&`<```"``$`@!P```+K``"@
+M'````HT``,`<```"R0``X!P```)S````'0```DD!`"`=```"FP``0!T```);
+M``!@'0```C`!`(`=```"D@$`H!T```)(``#`'0```I\``.`=```"0````!X`
+M``(Z`0`@'@```@$``$`>```"`0``8!X```(!``"`'@```E8!`*`>```"R@``
+MP!X```)%`0#@'@```A\````?```"*@``(!\```*M``!`'P```GL!`&`?```"
+M:0$`@!\```)V`0"@'P```CD!`,`?```"_P``X!\```+R````(````NX``"`@
+M```"$@$`0"````)]``!@(````I@``(`@```"5P$`H"````)\`0#`(````F,`
+M`.`@```"E@$``"$```*3```@(0```@$``$`A```"`0``8"$```(!``"`(0``
+M`@$``*`A```"`0``P"$```(!``#@(0```AT````B```"T@``("(```(!``!`
+M(@```MX``&`B```"`0``@"(```)L``"@(@```B$!`,`B```"`0``X"(```(!
+M````(P```@$``"`C```"`0``0",```(!``!@(P```@$``(`C```"`0``H",`
+M``*``0#`(P```@$``.`C```"`0```"0```(<```@)````@$``$`D```"`0``
+M8"0```(!``"`)````@$``*`D```"=0``P"0```(U``#@)````F(````E```"
+M.0``("4```)A``!`)0```@$``&`E```":P$`@"4```(-`0"@)0```H<!`,`E
+M```"@0``X"4```("`0``)@```G4!`"`F```"J@``0"8```(G`0!@)@```B(`
+M`(`F```"YP``H"8```('`0#`)@```AD``.`F```"9P$``"<```(-```@)P``
+M`@$``$`G```"0P``8"<```(!``"`)P```@$``*`G```")@``P"<```(!``#@
+M)P```G8````H```"@```("@```(:``!`*````L4``&`H```"+P$`@"@```(!
+M``"@*````ED!`,`H```"D0``X"@```*/`0``*0```M$``"`I```"$`$`0"D`
+M``**`0!@*0```A<!`(`I```"30``H"D```)0`0#`*0```D(!`.`I```"%`$`
+M`"H```(C```@*@```G0!`$`J```";@``8"H```+5``"`*@```A@``*`J```"
+M]P``P"H```)R``#@*@```B4!```K```";0``("L```(^`0!`*P```K```&`K
+M```"Z```@"L```(_``"@*P```A\!`,`K```"[```X"L```*W````+````J,`
+M`"`L```"L0``0"P```))``!@+````I0!`(`L```"Q@``H"P```*(``#`+```
+M`HD!`.`L```"J````"T```*"`0`@+0```G@``$`M```"%P``8"T```*.``"`
+M+0```H8!`*`M```"IP``P"T```+,``#@+0```E,!```N```"0@``("X```)+
+M``!`+@```BT``&`N```"00``@"X```+J``"@+@```CL``,`N```"1@``X"X`
+M``)_````+P```C0``"`O```",P``0"\```+7``!@+P```A8``(`O```"F0``
+MH"\```)=``#`+P```B$``.`O```"G````#````(*```@,````I<``$`P```"
+M`0``8#````(!``"`,````@$``*`P```"@0$`P#````+0``#@,````EH````Q
+M```"80$`(#$```)>``!`,0```C\!`&`Q```"`0$`@#$```+\``"@,0```A(`
+M`,`Q```";`$`X#$```+@````,@```GH``"`R```"<0$`0#(```+9``!@,@``
+M`I8``(`R```",0$`H#(```)S`0#`,@```D`!`.`R```"KP```#,```(,```@
+M,P```B0``$`S```":P``8#,```)$``"`,P```HL!`*`S```"N```P#,```(!
+M``#@,P```F<````T```"`0``(#0```+(``!`-````DX``&`T```"`0``@#0`
+M``(.``"@-````L(``,`T```"0P$`X#0```*5````-0```@4!`"`U```"'`$`
+M0#4```)9``!@-0```@$``(`U```"E0$`H#4```(!``#`-0```@$``.`U```"
+M`0```#8```(!```@-@```E4!`$`V```"&@$`8#8```(!``"`-@```@$``*`V
+M```"3```P#8```(!``#@-@```@$````W```"`0``(#<```)W``!`-P```EP`
+M`&`W```"$0$`@#<```)3``"@-P```E8``,`W```"`P$`X#<```*=````.```
+M`@$``"`X```"7@$`0#@```**``!@.````OX``(`X```"Y0``H#@```*,`0#`
+M.````I@!`.`X```"N0```#D```)\```@.0```B,!`$`Y```"A@``8#D```(H
+M``"`.0```ET!`*`Y```"4@$`P#D```(P``#@.0```H(````Z```"`0``(#H`
+M``*'``!`.@```@H!`&`Z```"L@``@#H```)Q``"@.@```IX``,`Z```"`0``
+MX#H```(!````.P```@$``"`[```"V@``0#L```(0``!@.P```H\``(`[```"
+M`0``H#L```(!``#`.P```OD``.`[```"JP```#P```(!```@/````@$``$`\
+M```"`0``8#P```(!``"`/````@$``*`\```"`0``P#P```(!``#@/````@$`
+M```]```"`0``(#T```(!``!`/0```@$``&`]```"`0``@#T```)M`0"@/0``
+M`@$``,`]```"`0``X#T```(!````/@```@$``"`^```"`0``0#X```(!``!@
+M/@```@$``(`^```"`0``H#X```(!``#`/@```@$``.`^```"`0```#\```(!
+M```@/P```@$``$`_```"`0``8#\```*(`0"`/P```@$``*`_```"`0``P#\`
+M``(!``#@/P```@$```!````"`0``($````(!``!`0````@$``&!````"`0``
+M@$````(!``"@0````@$``,!````"`0``X$````(!````00```@$``"!!```"
+M`0``0$$```*E``!@00```@$``(!!```"`0``H$$```(!``#`00```@$``.!!
+M```"`0```$(```(!```@0@```@$``$!"```"`0``8$(```(!``"`0@```@$`
+I`*!"```"`0``P$(```(!``#@0@```@$```!#```"`0``($,```+$````
+`
+end
diff --git a/sys/contrib/dev/ath/public/mipsisa32-le-elf.inc b/sys/contrib/dev/ath/public/mipsisa32-le-elf.inc
new file mode 100644
index 0000000..81726b4
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mipsisa32-le-elf.inc
@@ -0,0 +1,74 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/mipsisa32-le-elf.inc#2 $
+#
+
+#
+# Compilation configuration for building little-endian mipsisa32-elf.
+#
+
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=mipsisa32-elf
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/mipsisa32-elf-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EL
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+COPTS+= -G 0 -EL -mno-abicalls -fno-pic -march=r4600 -Wa,--trap \
+ -fno-strict-aliasing -fno-common -fomit-frame-pointer -mlong-calls
diff --git a/sys/contrib/dev/ath/public/mipsisa32-le-elf.opt_ah.h b/sys/contrib/dev/ath/public/mipsisa32-le-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/mipsisa32-le-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/powerpc-be-eabi.hal.o.uu b/sys/contrib/dev/ath/public/powerpc-be-eabi.hal.o.uu
new file mode 100644
index 0000000..580af27
--- /dev/null
+++ b/sys/contrib/dev/ath/public/powerpc-be-eabi.hal.o.uu
@@ -0,0 +1,5415 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/powerpc-be-eabi.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`0`````````````!`!0````!`````````````O8L```````T````
+M```H``T`"CT@```Y*0!$+`,`6$&"`2Q!@0!@+`,`&T&!`#`L`P`:0(`!""P#
+M`!)!@0`8+`,`$4"``-0L`P`'08(`P$@``/@L`P`32```8"P#`%)!@@#$08$`
+M%#T@```Y*0!8+`,`'$@``)`L`P!708(`J$@``,@L`Q$'08(`A$&!`#0](```
+M.2D`;"P#`)%!@@"P08$`%#@#_WHH```!08$`G$@``(`L`Q`408(`A$@``(PL
+M`Q$308(`>$&!`!`L`Q$208(`2$@``'0X````8`#P$ST@```Y*0"`?`,``$&"
+M`&`X````8`#Q&ST@```Y*0"4?`,``$&"`$A(``!`/2```#DI`*A(```X/2``
+M`#DI`+A(```L/2```#DI`,A(```@/2```#DI`-Q(```4/2```#DI`/!(```(
+M.2```'TC2WA.@``@E"'_^'P(`J:0`0`,:&`6C"$@``!\"0$4:&FG)R%I``!]
+M*TD4?`M+>4""`!`X````+`,0MT""`!!\@R-X2__^A7Q@&WA\`P-X@`$`#'P(
+M`Z8X(0`(3H``()0A__A\"`*FD`$`#"P#`@=!@@"T08$`."P#`!)!@0`8+`,`
+M$4"``)@L`P`'08(`F$@``)PL`P`308(`?#@#_^8H```"08$`B$@``&@L`Q$3
+M08(`9$&!`"0L`Q$'08(`:$&!``PL`Q`42```1"P#$1)!@@!,2```6#@```!@
+M`/$;?`,``$&"`#A!@0`8.````&``\!-\`P``08(`'$@``#`X````8`#_&7P#
+M``!`H@`@.&``$T@```%(```@2````4@``!A(```!2```$#A@```X```!D`<`
+M`"P#``!!@@`\H`,!R+`#``B@`P'*L`,`"H`#`<R0`P`<H`,!T+`#`""@`P'2
+ML`,`(J`#`=2P`P`DH`,!UK`#`":``0`,?`@#IC@A``A.@``@D(,!V#A@``%.
+M@``@E"'_V'P(`J:380`4DX$`&).A`!R3P0`@D^$`))`!`"Q\>QMX?)PC>'R]
+M*WA\WC-X.^```']CVWA_A.-X2````7QCZ#@X```!?`/P`$&"`!PX8``*2```
+M`3O_``$L'P/G0('_U#@```!\`P-X@`$`+'P(`Z:#80`4@X$`&(.A`!R#P0`@
+M@^$`)#@A`"A.@``@.6```#@```!\`"!`0(``(%0`"#Q4:0?^?`!+>%1C^'XY
+M:P`!?`L@0$&`_^A\`P-X3H``('QJ&W@=)@`,?2DB%*%I`"8X8```+`L``$V"
+M`"`=)@`,?2DB%(@)`"4L```"08(`9$&!`!`L````08(`'$@``8`L```#08(!
+M#"P```1!@@$T2``!;#E``,`L!P``08(`'!TF``Q]*2(4B`D`*2P```!!@@`(
+M.4``8%2@&#@<``/H?`!;EGQJ`A0X8P`*2``!-($J$C0L"0``08(`0*@)``(L
+M````0*``-%5@(#8](!!B82E-TWP`2!94"=&^5*`8.'R@2A0XI0`5?*5+EE2I
+M(#8X:0"02```[(!J$C0L`P``08(`0*`#``)P"4``08(`-%5@&#@](!!B82E-
+MTWP`2!94"=&^5*`8.'R@2A0XI0`5?*5+EE2I&#@X:0!(2```I%5@$#H](!!B
+M82E-TWP`2!94"=&^5*`8.'R@2A0XI0`5?*5+EE2I$#HX:0`D2```=%5@&#@]
+M(!!B82E-TWP`2!94"=&^5*`8.'R@2A0XI0`5?*5+EE2I$#HX:0`62```1%5@
+M$#H](!!B82E-TWP`2!94"=&^5*`8.'R@2A0XI0`5?*5+EE2E$#HX90"]*`L#
+MYT"!`!`X90!<2```"#A@``!48P0^3H``(*`$``(X8``"<`D`($R"`""@!``"
+M<```T#A@``,L``#`38(`(*`$``)P``#0.&``!"P``-!-@@`@H`0``CA@``%P
+M"0`03((`(*`$``)P"0@`?&``)E1C'_Y\8P#05&,'N#AC``5.@``@E"'_Z'P(
+M`J:3P0`0D^$`%)`!`!Q\8!MX?)XC>'R_*WAPJ0"`08(`'#A@``XL!`FT08(!
+M/"@$";-`@0!@2``!`'"K`0!!H@!`2````2P#``!!@@`0.![LLR@``#!`@0"`
+M<^`!0'P``-!4``_^(3X3B#D@``!]*4D4?`M(.4""`+A(``#8.&``#BP$";1!
+M@@#@*`0)LT&!`"0Y/O:9/`!F9F``9F=\"0"6?``.<'TI_G!\:0!02```N"@$
+M$X=!H0"<?`,#>$@```$L`P``08(`8#@>[+,H```P08$`5!T^``H]8,S,86O,
+MS7P>6!94`/"^'```!7P`\%`L```"0*(`%#TI__\X:3\-?`-8%D@``!@]*?__
+M.&D_"#P`S,Q@`,S-?`,`%E0#\+Y(``!$*!X3)$"!``PY/O!@2```)#D^]C`\
+M`,S,8`#,S7TI`!95*>$^.&D`#T@``!@Y/NQX/`#,S&``S,U]*0`652/POH`!
+M`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A_^A\"`*FD^$`%)`!`!Q\GR-X@(,2
+M-!P?`!8L!```08(`&$@```$](```.2D``'P)&*Y\'P'6?`,#>(`!`!Q\"`.F
+M@^$`%#@A`!A.@``@E"'_Z'P(`J:3X0`4D`$`''R?(WB`@Q(T/`"Z+F``BZ-\
+M'P`65`#A/BP$``!!@@`82````3T@```Y*0``?`D8KGP?`Y9\`P-X@`$`''P(
+M`Z:#X0`4."$`&$Z``""4(?_8?`@"II-A`!23@0`8DZ$`')/!`""3X0`DD`$`
+M+'Q[&WA\GR-XB`0`!"P```!`@@"H.\```#@`__]]/_(4F`D`!#O>``$L'@`?
+M0('_\#O```"`'P``?!X``$"``'P?O@`,?[WZ%#N]`"")/0`(BYT`"WU_2A2;
+MRP`$B!T`"7TI`WA]/TH4F\D`!%><!#Y_8]MX?^3[>#B@``Y_AN-X..```$@`
+M``&P?0`,?V/;>'_D^W@XH``.?X;C>#C@``%(```!L'T`#CO>``&`'P``?!X`
+M`$&`_XR``0`L?`@#IH-A`!2#@0`8@Z$`'(/!`""#X0`D."$`*$Z``"`Y8P'@
+M*`0`(D&!`8P](```.2D`"%2`$#I\"0`N?`!*%'P)`Z9.@`0@H`,""$@``5R`
+M"P``<`D`@'P``"94`!_^2``!6*`+``I(``%`H`L`"$@``3B!*P``52F7_D@`
+M`#"`"P``<`N``'T@`"95*1_^?2D`T$@``02!*P``52D?_D@```R!*P``52DG
+M_GTI`-!(``#D@2L``%4I+_Y+___P@`,!^$@``.0L!0`!08(`)#@````H!0`!
+M08``X"P%``)!@@`8+`4``T&B`!A(``"0J`,!_$@``+2@`P'^2```K(`#`@!(
+M``"D@2L``%4IG_Y+__^<@2L``%4II_Y+__^0@2L``%4I3_Y+__^$@2L``%4I
+MM_Y+__]X@2L``%4IO_Y+__]L+`4``4&"`"0H!0`!08``$"P%``)!H@`<2```
+M(($K``!5*<?^2___1(`#$DQ(```8H`,22$@``#`X```-2```.(`#$FA\"_YP
+M?6D">'TI6%!]*?YP52D'MC@)``U(```8@`L`%)`&```X````2```"#@```Q\
+M`P-X3H``("P$`!E!@@`\*`0`&4&!`!`L!``/08(`%$@``&`L!``>08(`4$@`
+M`%0L!0`#0*(`3"@&``1!@0!$D,,"`$@``"0L!0`!08(`$"P%``)!@@`<2```
+M*#$F__]\"3$0D`,23#A@``%.@``@L,,22$O___20PQ)H2___["P'``!!@@`,
+M.```#)`'```X8```3H``()0A_]A\"`*FDP$`"),A``R300`0DV$`%).!`!B3
+MH0`<D\$`()/A`"20`0`L?'L;>'R9(WA\N"MX?-XS>'R]*W@[0```*`8`!T"!
+M`'!70!`Z?2#*%'_Y`BZCB0`"5^"`'GP`XWB0'0``.[T`!#O>__Q_8]MX?^3[
+M>$@```&0?0``.[T`!#O_``0[WO_\?3_@$#D@``!]*4D4(!X``WP``1!\``#0
+M?2L`.4""_\@[6@`!*!X`!T&!_YA\>.A0@`$`+'P(`Z:#`0`(@R$`#(-!`!"#
+M80`4@X$`&(.A`!R#P0`@@^$`)#@A`"A.@``@E"'_Z'P(`J:3X0`4D`$`''T?
+M0W@L!``-08(`.$&!`!`L!```08(`'$@``)`L!``=08(`."P$`!Y!@@!$2```
+M?#@#`<B0!P``.```$$@``"A\I"MX@*<``(#(``!+__ZYD'\``$@``$PX`Q)0
+MD`<``#@``!B0'P``2```."P&``!`@@`<.```!)`(``"!)P``@`,"!)`)``!(
+M```8.````"P&``1`H@`8@`4``)`#`@0X```!2```"#@```!\`P-X@`$`''P(
+M`Z:#X0`4."$`&$Z``""`!``$.&```"P```!-@@`@@`4``)`$``"`!0`$D`0`
+M"(`%``B0!``,@`4`#)`$`!"`!0`0+`#__T&"`!0H``#_0($`$#@``/](```(
+M.````I`$`!2`!0`4+`#__T&"`#A\"0-X*``$`$"!``@Y(`0`.````9`$`!A\
+M`$A`0(``(%0`"#Q@```!?`!(0$&`__1(```(@`4`%)`$`!B`!0`8+`#__T&"
+M`#A\"0-X*``$`$"!``@Y(`0`.````9`$`!Q\`$A`0(``(%0`"#Q@```!?`!(
+M0$&`__1(```(.``#_Y`$`!R@!0`<?`D#>4&"`!0H"0`/0($`$#@```](```(
+M.```"K`$`""@!0`>?`D#>4&"`!0H"0`/0($`$#@```](```(.```"K`$`"*`
+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
+M'0``*``__T"!`!"A/0`D.\G_JT@``""@'0``(\`P`G_>\1!_WO.X.`#_L'_>
+M`#@[W@%0+!H``4&"`#1!@0`0+!H``$&B`!1(``!D+!H``D&B`#Q(``!8.]X`
+M53L```@[_03<.ST$VD@``$R@'0`:+````$&B`;0[W@!E.P```CO]!4X[/05,
+M2```+*`=`!PL````0:(!E#O>`&D[```#._T%+CL]!2Q(```,.````$@``8@X
+M````L!D``#M@``!\&\``0*`!9'_$\W@[W@`!@!P!H'P)`Z9_@^-X.*$`"$Z`
+M!"$X````+`,``$&"`4R@'0``*``P`D"!`!"@`0`(5`#"/D@```R@`0`(5`"Z
+M?K`?``B@GP`(+`0``$&"`/PL&@``0((`$'^CZWA+_^+92```$*"?``A_H^MX
+M2__C&;!_``B@'0``*``P`D"!`!R@`0`(5`#VOK`?``:@`0`(5``FMD@``!B@
+M`0`(5`#NOK`?``:@`0`(5``>N+`?``1_Q/-X.]X``8`<`:!\"0.F?X/C>#BA
+M``A.@`0A.````"P#``!!@@"4H!T``"@`,`)`@0`PH2$`"%4IHSZ@'P`$?`!+
+M>+`?``2@`0`(5`#6OK`?``*@`0`(5``&OD@``"RA(0`(52F;?J`?``1\`$MX
+ML!\`!*`!``A4`,Z^L!\``J`!``A4`/Z^L!\``*$Y```Y*0`!L3D``#O_``H[
+M>P`!?!O``$&`_J0[6@`!+!H``D"!_=`X```!?`,#>(`!`#1\"`.F@P$`$(,A
+M`!2#00`8@V$`'(.!`""#H0`D@\$`*(/A`"PX(0`P3H``()0A_]!\"`*FDP$`
+M$),A`!2300`8DV$`').!`""3H0`DD\$`*)/A`"R0`0`T?'L;>'R:(W@[Q`5D
+MH`0``"@`/_]`@0`0HX0`)#N<`!I(```8H`0``#N``;\H`#`"08$`"#N``6\[
+M````H!H!!'P8``!`@`.05PD(/'TITA2@"0$&+````$""`""@&@``*``P`D"!
+M``P[G``(2``#5#N<``=(``-,H!H``"@`,`)`@0#(.^```'^$XW@[G``!@!L!
+MH'P)`Z9_8]MX.*$`"$Z`!"$X````+`,``$&"`RQ7ZQ@X?4OR%*`!``A4"<(^
+M?2OS+E0`!CZP"@`(._\``BP?``=`@?^T.^```'^$XW@[G``!@!L!H'P)`Z9_
+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
+M'@`6+````$""`"B@'@``*``__T"!`!"@'@`85`"O_D@```R@'@`85`"+_K`>
+M`!8Y8``!D6$`#(!A``R``0`T?`@#IH-!`!B#80`<@X$`((.A`"2#P0`H@^$`
+M+#@A`#!.@``@E"'_Z'P(`J:3P0`0D^$`%)`!`!Q\?QMX?)XC>$O_\0TX````
+M+`,``$&B`%Q_X_MX?\3S>$O_SMDX````+`,``$&B`$1_X_MX?\3S>$O_YHTX
+M````+`,``$&B`"Q_X_MX?\3S>$O_Z>DX````+`,``$&B`!1_X_MX?\3S>$O_
+M['5\8!MX?`,#>(`!`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A__A\"`*FD`$`
+M#*`$```H`#__0($`%*`$`"XL```!0*(`"$O_V1F``0`,?`@#IC@A``A.@``@
+MH2,``*`$``!\"0``0*(`'*!C``)P8\'PH`0``G``P?!\8!A03H``(*!C``"@
+M!```?&`84$Z``""@8P((<&.__TZ``"`Y8```56`8.'T@&A1\`P`N@2D`!#E`
+M``!\"$MY0((`%#EK``$L"P`!0('_W#E```%]0U-X3H``()0A__A\"`*FD`$`
+M#$O__[$Y8```/2```#DI``!P8(``0:(`-%1C!'X](```.2D``!P+`!1\"0(N
+M.4```7P`&`!!@@`X.6L``2@+`()`@?_D2```)%5@*#1\"0(N.4```7P`&`!!
+M@@`4.6L``2@+`$I`@?_D.4```'U#4WB``0`,?`@#IC@A``A.@``@E"'_Z'P(
+M`J:3X0`4D`$`''R?(W@Y8``!+`0``$&"`(!+__\15&`$7G_K`G@A*P``?6E9
+M%'!J@`!`@@!D:&D!_R%I``!]*TD4(4,``'P*&10Y8``!?2H#>4""`$0Y0```
+M/2```#DI```<"@`4?6!*%'P)`BY\`/@`0*(`%*`+``(Y8``!?``8`$&"`!0Y
+M2@`!*`H`@D"!_]0Y8```?6-;>(`!`!Q\"`.F@^$`%#@A`!A.@``@E"'_Z'P(
+M`J:3H0`,D\$`$)/A`!20`0`<?)XC>'R]*WB!(P&<?2D#IDZ`!"%\?QMX<&``
+M0D&"`!B`'@`(+````$""``PX`/^]?'\`.'/@`"!!@@`4@!X`#"P```!`@@`(
+M5_\&\G/@``A!@@`4@!X`!"P```!`@@`(5_\'=G/@``%!H@`8.'T`($O__@$L
+M`P``08(`"%?_`#Q_X_MX@`$`''P(`Z:#H0`,@\$`$(/A`!0X(0`83H``()0A
+M_VA\"`*FDZ$`C)/!`)"3X0"4D`$`G'Q^&W@[H```?(,C>$@``-U\?QMX+`,`
+M`$&"`#A_P_-X?^3[>#B@``!@I?]_.,$`"$@``CTL`P``0:(`&'_#\WA_Y/MX
+M.*$`"$O__NE\?1MX?Z/K>(`!`)Q\"`.F@Z$`C(/!`)"#X0"4."$`F$Z``""4
+M(?_H?`@"II/A`!20`0`<?'\;>$O__2DL`P`208(`+$&!`!`L`P``08(`*$@`
+M`#0L`P'_08(`'#@```!@`(-*?`,``$"B`!PX8``!2```&*`?`@HX8``!+``#
+M2D&"``@X8```@`$`''P(`Z:#X0`4."$`&$Z``"!\:!MX.6```#T@```Y20``
+M'`L`%'T@4A1\"@(N?2-+>'P`0`!-@@`@.6L``3A@```H"P""38$`($O__]B4
+M(?_H?`@"II.A``R3X0`4D`$`'$O__'5\?QMX<&"``$&B`!A4?01^?Z/K>$O_
+M_YDL`P``0*(`2#E@```](```.2D``%5@*#1]0$H4?`D"+GP`^`!`H@`8H`H`
+M&'P=`W@L````0((`&#E@`$LY:P`!*`L`2D"!_]`[H```?Z/K>(`!`!Q\"`.F
+M@Z$`#(/A`!0X(0`83H``()0A__A\"`*FD`$`#'R*(W@Y8```/2```#DI```O
+MA```56`X,'R`2A1\"0(N?``8`$"B`!Q!O@`0?4-3>#B@`(!(```!.&```4@`
+M`!0Y:P`!*`L`,$"!_\PX8```@`$`#'P(`Z8X(0`(3H``('QJ&W@X8```+`H`
+M`$V"`"`Y8```/2```#DI``!58"@T?`D"+CA@``%\`%``38(`(#EK``$X8```
+M*`L`2DV!`"!+___<E"'_R'P(`J:2X0`4DP$`&),A`!R300`@DV$`)).!`"B3
+MH0`LD\$`,)/A`#20`0`\?'@;>'R;(WA\NBMX?-DS>#N@```[P```.X```#K@
+M``"@!```+````$""`#Q+__KE?'\;>'!@@`!`@@`L.(```$O__N$L`P``0*(`
+M%'_C^WA+__\]+`,``$&"``Q_Z/MX2```"*$;``)Q`/\`0((!4#E@```X8```
+M/2```#E)``!58"@T?2!2%'P*`BY\`$``0*(`#'T\2W@X8``!.6L``2`+`$HX
+M````?``!%"#C``!])QD4?`=(.4""_\@X````+`,``$&"`6!S20"`0((`$*$<
+M``*#W``(.Z```'-*`(!!@@`0H1P`!(/<``P[H```.6```#A@```](```..D`
+M`!P+`"1]0#H4?`<"+GP`0`!`H@`<@!@!V($J``1\`$@`0*(`#'U74W@X8``!
+M.6L``2`+``$X````?``!%"%#``!]*AD4?`I(.4""_[@L`P``08(`;'-+`(!`
+M@@`P@5<`"#D@``!_JT@X?\Q0.'U]6WA]GF-X@5<`#'^K2WA_S%-X?7U;>'V>
+M8WAS0`"`08(`,(%7`!`Y(```?ZM(.'_,4#A]?5MX?9YC>(%7`!1_JTMX?\Q3
+M>'U]6WA]GF-X?0-#>'\DRWA+__U=.````"P#``!!@@!4@/D`$(%\`!"!&0`4
+M@!P`%'SI6#A]"@`XD3D`$)%9`!2@&P`"<`?_`'T@`"95*1_^?ZKS>7P``"94
+M`!_^(````7TK`#E!@@`(D]D`&#@```%\`P-X@`$`/'P(`Z:"X0`4@P$`&(,A
+M`!R#00`@@V$`)(.!`"B#H0`L@\$`,(/A`#0X(0`X3H``()0A_^A\"`*FDX$`
+M").A``R0`0`<?)PC>'Q]-G!_O0&45Z`P,GR@&%`X8```.(```4@```%7O1@X
+M?3WB%'P=X"Z!:0`$?&D`.'R*6#A]*5-X,`G__WQ@21"``0`<?`@#IH.!``B#
+MH0`,."$`&$Z``"`L!@``38(`(#D@``!\"2!`0(``)'P#2*Y\`#``38(`("P`
+M``!!@@`0.2D``7P)($!!@/_D?`D@`$V"`"!\PTFN@24``#DI``&1)0``3H``
+M()0A_DA\"`*FD<$!<)'A`722`0%XDB$!?))!`8"280&$DH$!B)*A`8R2P0&0
+MDN$!E),!`9B3(0&<DT$!H)-A`:23@0&HDZ$!K)/!`;"3X0&TD`$!O'Q_&WA\
+MFR-X?+HK>'S5,WA\]SMX?19#>'TX2WA]75-X@B$!R*,A`<(Z0!M8.X,",#O`
+M``!+__>Q.(```"P#``!!H@7H?^/[>$O_^M&P?P(*H!\""BP```!`@@`D?^/[
+M>'^DZWA+__@-.(```"P#``!!@@6X5Z`$OK`?`@I_X_MX2``,/:!_`@I+__I5
+M?'T;>#B````L`P``08(%D'_C^WA_I.MX.*```&"E_W\XP0`(2__[L3B````L
+M`P``0:(%;'_C^WA_I.MX.*``@#C!`(A+__N1.(```"P#``!!@@5,.2```(`!
+M`!1P"@`%?2!3>4&"``@[P``!.2```(`!`!14"@>\?2M3>4&"``@[P``"@!\"
+M#'P>``!!@@`(D]\"#'_C^WA_I.MX.*$`"$O_]_E\;QMX@`$!Q"P```!`@@`(
+MHET`$#I@```H&@!`0($`"#M``$"`'P'@5`FW_I$A`5A4`+_^D`$!5#T@```[
+MR0``/2```#DI`!A\'DA`0(`#T*`>``!_*P`Y0:(#L%0`!#Y\"7@Y0:(#I*">
+M``*!?P&8?6D#IG_C^W@XH0$*.,$!"$Z`!"$L`P``0:(#@*`>```L```$08(`
+MA$&!`!@L```!08(`6"P```)!@@`L2``#7"P``"!!@@"L08$`$"P```A!@@!\
+M2``#1"P``$!!@@"T2``#.#DA``B1(0%<.<$`.#T@```Y*0``D2$!8(@!``I@
+M```#2```K#EA``B180%<.<$`*#T@```Y*0``D2$!8(@!``I(``",.2$`B)$A
+M`5PYP0#8/2```#DI``"1(0%@B`$`BF````%(``!H.6$`B)%A`5PYP0#H/2``
+M`#DI``"1(0%@B`$`BF````)(``!$.2$`B)$A`5PYP0#X/2```#DI``"1(0%@
+MB`$`BD@``"`Y80`(D6$!7#G!`$@](```.2D``)$A`6"(`0`*8```!)`!`5!]
+MPW-X2__TU2P#``!`H@)8.@```'X#@WA]Q'-X2__[_2P#``!!H@(T5ATH-($A
+M`6!^B>H4B-0`&'[CNWA^Q+-X?P7#>$O__$6``0%@?[T"+J`4``)\`.A`08`"
+M`*`!`0I\`.A`0:$!W*`!`0A\`.A`08`!T(DT``9I(``*(6```'P+`12!80%8
+M?`M8>4"B`;1I(``%(6```'P+`12!(0%4?`E(>4"B`9R(%``'?!T"%'P`#G!\
+M``&4.3(`"GP`2`!!H0&`?!/00$"``;`Y(```@!0`$"P```!`H``(.2```2%Q
+M``!\"XD4?2L`.4"B`52!(0%<@`D`&'`+`(!!@@`0@!\!W"P```9!@@$X.&$!
+M$#B``$!(```!LZ$!$*`>``*P`0$2B!0`!BP```5!@@`8+```"D"B`""@`0$2
+M8`!``$@``!"@`0$29`#__V``@`"P`0$2B!0`!)@!`16(%``%F`$!*H$A`5R`
+M"0`8D`$!+(%A`5"180$P@/0`$(%I`!"!%``4@`D`%'SI6#A]"@`X?2!3>4&"
+M`!"@`0$28``"`$@```R@`0$25``%ZK`!`1*`]``(@2$!7(%I``B!%``,@`D`
+M#'SI6#A]"@`X.````GTK4WE`@@`(.````)@!`12!(0%<@10`#(`)``Q]"@`X
+M.2```%5*![Q]*U-Y08(`$(@!`11@```(F`$!%($A`5R`"0`8<`L`0$&"`!"(
+M`0$48```!)@!`1168S`R?&/B%#IS``$X@0$0.*``0$@```&(%``'?!T"%%0=
+M!#Z@%``"?`#H0$"`_@@Z$``!+!``?T"!_;0[W@`$/2```#DI`!A\'DA`08#\
+M."P3``!!@@#$*!,`0$"!``@Z8`!`?X/C>'YDFW@XH`!`/,```#C&``!(``.%
+MDG\2,#D```!\")@`0(``0%4*&#A]:MH450`P,GT@XA1\'`(N?`K;+J`)``*P
+M"P`"B`D`!)@+``2("0`%F`L`!3D(``%\")@`08#_R(`?`;Q\"0.F?^/[>']D
+MVWA^99MX3H`$(3D```!\")@`0(``,%4+,#)]:^(450D8.'TIVA2("0`&F`L`
+M!H@)``>8"P`'.0@``7P(F`!!@/_8DG4``*`?`@JP'P`8,!/__WR`F1!\@R-X
+M@`$!O'P(`Z:!P0%P@>$!=((!`7B"(0%\@D$!@()A`82"@0&(@J$!C(+!`9""
+MX0&4@P$!F(,A`9R#00&@@V$!I(.!`:B#H0&L@\$!L(/A`;0X(0&X3H``(*$$
+M``)Q",'P@6,2-"P+``!!@@!`H`L``*$D``!\`$@`0*(`,*$K``)Q(,'P?`!`
+M`$"B`""("P`$<`H``4&"`&0X8```<2```DR"`"!(``!4.2,",(!C$C`L`P``
+M08(`<*"$``!48"@R?6D"%'P)`BY\`"!10((`0*%+``)Q0,'P?`!``$"B`"2(
+M"P`$<`D``4&"`!`X8```<4```DR"`"!]8UMX3H``(*`+``)P`,'P?`!`4"P`
+M``!`@0`,.2L`0#AC__]\8PYQ0(+_G#A@``!.@``@E"'_Z'P(`J:3X0`4D`$`
+M''R_*WA(```!.````"P#``!!@@`HB`,`&GP`!W14``@\?`#X4#A@``!\``=U
+M08``"'P#`WA\8!MX?`,#>(`!`!Q\"`.F@^$`%#@A`!A.@``@E"'_Z'P(`J:3
+MH0`,D\$`$)/A`!20`0`<?'\;>'R=(W@[P`#_H`,""BP```!`@@"`2__ON51C
+M!C8L`P!@08(`%'_C^WA+_^^E+`,!F4"B`&"@'0`"<```H#O``.$L``"@08(`
+MB*`=``)P``#0.\``XBP``,!!@@!TH!T``G```-`[P`#D+```T$&"`&"@'0`"
+M<``!4&@>`5!_W@#0?][^<%?>!_H[W@#C2```0'_C^WA_I.MX2````2P#``!!
+M@@`L@\,`(*`=``)4``8R+```P$"B`!A7P`<^+````4"B``Q7W@`V8]X``G_#
+M\WB``0`<?`@#IH.A``R#P0`0@^$`%#@A`!A.@``@E"'_^'P(`J:0`0`,2```
+M`3@````L`P``08(`#(`#`!Q4`/?^?`,#>(`!``Q\"`.F."$`"$Z``""4(?_8
+M?`@"II,A``R300`0DV$`%).!`!B3H0`<D\$`()/A`"20`0`L?+TK>'S9,WA\
+M>QMX?X,J%#=$__]!@@!H?Y[C>'P<V$!`H0!0?_WP4'_C^WA_Q/-X?R@#IDZ`
+M`"$L`P``0($`-'_+\WA_J0.FB3\``(@+``"8'P``._\``9DK```Y:P`!0@#_
+MZ'_=\%!\'MA`08'_N'^<ZA0W6O__0(+_H(`!`"Q\"`.F@R$`#(-!`!"#80`4
+M@X$`&(.A`!R#P0`@@^$`)#@A`"A.@``@E"'_X'P(`J:3P0`8D^$`')`!`"1\
+M?QMX@`,!H'P)`Z8X@`#!.*$`"DZ`!"$X````+`,``$&"`&2@@0`*((0__WR$
+M(1!\A".X<(0`!3B$`,J`'P&@?`D#IG_C^W@XH0`(3H`$(3@````L`P``08(`
+M+*`!``HH`#__0($`$*`!``A4`*_^2```#*@!``A4``_^D!\2/(`?$CQ\`P-X
+M@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_Z'P(`J:3X0`4D`$`''Q_&WA+
+M_^T1+`,`2$&"`(A!@0`H+`,`04&!`!@L`P!`0(``="P#``!!@@!02```="P#
+M`$-(``!<.````&``@8U\`P``08$`)#@```!@`(&(?`,``$"``$`X`_^V*```
+M`D&!`$!(```P.````&``@8]\`P``2```'*`?`@HL``&(08``("P``8U`@0`,
+M+``!CT"B`!!_X_MX2__^I4@```@X8```@`$`''P(`Z:#X0`4."$`&$Z``""4
+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
+M"1,3B`$`B9@)$Q0[W@`!*!X``D"!_\`@&P``?2#9%#U@``)A:__]?V!:>"%@
+M``!\"P$4.T``"7TK`WE`@@`H?Z/K>#B`0!!_A>-X2````7^CZWA(``!`.T``
+M"$@``!@[0``(?Z/K>#B`0!!_A>-X2````2P?``!!@@`,?^/[>$@```$L&```
+M08(`")-8```X8```@`$`M'P(`Z:#`0"0@R$`E(-!`)B#80"<@X$`H(.A`*2#
+MP0"H@^$`K#@A`+!.@``@E"'_^'P(`J:0`0`,2````8`!``Q\"`.F."$`"$Z`
+M`"`X8```<(`!`$V"`"`X`!0`L`4``#@`%3:P!@``.&```4Z``"`X8``!3H``
+M(#DC`>"`"0`$8````9`)``0X`!0`L`D`##@`%3:P"0`.@`,!X&0`0`!4``1>
+MD`,!X#@```.P"0`(.```0+`)``J``P'@5`L%Z)%C`>"(`Q)\+````$&"`!PX
+M````L`,22#@```&0`Q),86`!`)`#`>`X```/D`D`%#@```&0`Q)H.&```4Z`
+M`""4(?_H?`@"II.!``B3H0`,D`$`''Q\&WA\G2-X.(```&"$@"R`O0`$2```
+M`7^#XW@X@```8(2`,("]``Q(```!?X/C>#B```!@A(`T@+T`$$@```%_@^-X
+M.(```&"$@#B`O0`(2````7^#XW@X@```8(2`)("]``!(```!@`$`''P(`Z:#
+M@0`(@Z$`##@A`!A.@``@E"'_V'P(`J:0`0`LD($`#(`#`=PL```!08(`-#T@
+M``"`"0``?``@4%0`&#B0`0`4/2```(`)``!\`"!05``8.)`!`!B0@0`02```
+M&#@`__^0`0`4D`$`&#@```&0`0`0/``!@&``__]\H``XD`$`"#B!``A(```!
+M@`$`+'P(`Z8X(0`H3H``()0A_^A\"`*FDZ$`#)`!`!Q\?1MX.(```&"$@"PX
+MH```2````7^CZW@X@```8(2`!$@```%D90`0/`#_7V``__]\I0`X?Z/K>#B`
+M``!@A(`$2````7^CZW@X@```8(2`)#B@``!@I?__2````8`!`!Q\"`.F@Z$`
+M##@A`!A.@``@E"'_Z'P(`J:3H0`,D\$`$)/A`!20`0`<?'X;>'R?(WA\?1MX
+MH`0`$BP```!!@@!H.(```&"$@`1(```!5&4"3F2E`"!_P_-X.(```&"$@`1(
+M```!H+\`$'_#\W@X@```8(2`*$@```&@OP`2?\/S>#B```!@A(!(2````8"_
+M`!14I1@X?\/S>#B```!@A(`T2```*#B```!@A(`$2````3P`_U]@`/__?&4`
+M.'_#\W@X@```8(2`!$@```%_P_-X.(```&"$@"R`OP``2````7_#\W@X@```
+M8(2`)$@```%48P`0H!\`"GQE`WBA/P`8+`D``$&"`!`X"0`$5`""7GRE`WA_
+MP_-X.(```&"$@"1(```!H!X!T"@```-`@0!`H)\`&G"```=!@@`T@!T3^%0)
+M!BA4@$5N?24#>"@$``=`@0`(824'`)"]$_A_P_-X.(```&"$@!A(```!@`$`
+M''P(`Z:#H0`,@\$`$(/A`!0X(0`83H``()0A__A\"`*FD`$`##B`0`A(```!
+M,2/__WP)&1!\`P-X@`$`#'P(`Z8X(0`(3H``()0A_^A\"`*FDZ$`#)/!`!"3
+MX0`4D`$`''Q]&WA\GR-X.(``'$@```$L`___0*(`%#@```"0'P``.&```$@`
+M`'"!/1,<?&E(.#P``05@`-BZ?2D`.)$_```\``!P8```('QK`#E!@@`,92!`
+M`)`?``!P8``%08(`$(`?``!@```!D!\``'!I!<!!@@`0@!\``&```$"0'P``
+M@!\``'0+0`!!@@`(D'T24#A@``&``0`<?`@#IH.A``R#P0`0@^$`%#@A`!A.
+M@``@@&,3'$Z``""4(?_H?`@"II.!``B3H0`,D\$`$)/A`!20`0`<?'T;>'R?
+M(WA\?AMX@X,3'"P<``!`H``0.(``)#B@``!(```!/``!!6``V+I_Y0`X<^``
+M`4&"``A@I0`%<^``0$&"`$2`'A,@+````$&"``A@I0!`@!X3)"P```!!@@`(
+M8*4!`(`>$R@L````08(`"&"E`("`'A,L+````$&"``A@I00`?Z/K>#B``"!(
+M```!D_X3'"P?``!`H``4?Z/K>#B``"0XH``!2````7^#XWB``0`<?`@#IH.!
+M``B#H0`,@\$`$(/A`!0X(0`83H``(#A@`$!.@``@E"'_^'P(`J:0`0`,*`0`
+M/T&A`"!4A"@T/(0``3B$D!Q(```!.````7!I@`!`@@`(.````'P#`WB``0`,
+M?`@#IC@A``A.@``@E"'_Z'P(`J:3H0`,D^$`%)`!`!Q\?QMX.````"@$`#]!
+MH0"05)TH-#^]``$XG9``.*```$@```$XG9`$?^/[>#B@``!(```!.)V0"'_C
+M^W@XH```2````3B=D`Q_X_MX.*```$@```$XG9`0?^/[>#B@``!(```!.)V0
+M%'_C^W@XH```2````3B=D!A_X_MX.*```$@```$[O9`<?^/[>'^DZW@XH```
+M2````3@```%\`P-X@`$`''P(`Z:#H0`,@^$`%#@A`!A.@``@E"'_Z'P(`J:3
+MH0`,D\$`$)/A`!20`0`<?'X;>#A@```H!``_08$`C#O@```Y(```+`4``$&"
+M`$R+Y0`%5_]`+H@%``1__P-XB24``U4IP`Z(!0`"5`"`'GTI`WB(!0`!5`!`
+M+GTI`WB(!0``?2D#>%4I^'Y7X/@`?2D#>%?_^'Y4G2@T/[T``3B=D!A_P_-X
+M?25+>$@```$[O9`<8^6``'_#\WA_I.MX2````3A@``&``0`<?`@#IH.A``R#
+MP0`0@^$`%#@A`!A.@``@E"'_R'P(`J:2X0`4DP$`&),A`!R300`@DV$`)).!
+M`"B3H0`LD\$`,)/A`#20`0`\?'P;>'R;(WA\V#-X,6?__WUK61`\`%558`!5
+M5GUK`#@]*ZJK.6FJJCA@```H!``_08$!B(@%```X8```+````$""`7B@!0`"
+M.&```"@```1`@0%HH`4``CK@```H```%0($`&*`%``(BX``-?O>Y$%;W![PZ
+M]P`!B44`!(@%``54`$`N?4H#>(@%``94`(`>?4H#>(@%``=4`,`.?4H#>'U*
+M6GB(!0`)5`!`+HDE``A\&4MX?SE:>%<Y!#Z+Q0`*B`4`"U0`0"Y_W@-XB`4`
+M#%0`@!Y_W@-XB`4`#50`P`Y_W@-X?]Y:>(@%``]4`$`NB24`#GP:2WA_6EIX
+M5UH$/HOE`!"(!0`15`!`+G__`WB(!0`25`"`'G__`WB(!0`35`#`#G__`WA_
+M_UIXH`4``B@```U!@0`(5_\&/E=]*#0_O0`!.)V0`'^#XWA]15-X2````3B=
+MD`1_@^-X?R7+>$@```$XG9`(?X/C>'_%\WA(```!.)V0#'^#XWA_1=-X2```
+M`3B=D!!_@^-X?^7[>$@```$[O9`4?X/C>'^DZWA^Y;MX2````7^#XWA_9-MX
+M?P7#>$@```&``0`\?`@#IH+A`!2#`0`8@R$`'(-!`""#80`D@X$`*(.A`"R#
+MP0`P@^$`-#@A`#A.@``@E"'_^'P(`J:0`0`,.2,3$WR#(WA])$MX.*``!D@`
+M``&``0`,?`@#IC@A``A.@``@E"'_^'P(`J:0`0`,.&,3$SB@``9(```!.&``
+M`8`!``Q\"`.F."$`"$Z``""4(?_X?`@"II`!``Q\@R-X/(```#B$```XH``&
+M2````8`!``Q\"`.F."$`"$Z``"`X8```3H``()0A_^A\"`*FD\$`$)/A`!20
+M`0`<?'\;>'R^*WA4A!`Z.(1@`$@```%_X_MX.(!L`#B@``,XP``"2````3@`
+M```L`P``0:(`&'_C^W@X@&@`2````;!^```X```!?`,#>(`!`!Q\"`.F@\$`
+M$(/A`!0X(0`83H``('QI&WB@`P((.&``#'P`(`!!@@`@H`D2<G`)`(!\8``F
+M5&,?_GQC`-!48P`X.&,`"RP%``!!@@`(D&4``#A@``!.@``@.&```4Z``""4
+M(?_8?`@"II-A`!23@0`8DZ$`')`!`"Q\>QMXHZ,22%>\]WY7O?_^?X3C>$@`
+M``%\9>IX(`4``'R@*11_8]MX?X3C>$@```&``0`L?`@#IH-A`!2#@0`8@Z$`
+M'#@A`"A.@``@E"'_Z'P(`J:3@0`(DZ$`#)`!`!Q\?!MX?)TC>#B`0!1(```!
+M5[T(/#B@``-\I>@P?&4H>#@```)\`.@P?*4#>'^#XW@X@$`42````3A@``&`
+M`0`<?`@#IH.!``B#H0`,."$`&$Z``""4(?_H?`@"II.!``B3H0`,D`$`''Q\
+M&WA\G2-X.(!`%$@```%7O0@\.*```WREZ#!\92AX?X/C>#B`0!1(```!.&``
+M`8`!`!Q\"`.F@X$`"(.A``PX(0`83H``()0A_]A\"`*FDV$`%).!`!B3H0`<
+MD`$`+'Q[&WA\G"-X?+TK>#B`0!A(```!.`#__EP`X#Y\90`X5[T'_G^]X#!\
+MI>MX?V/;>#B`0!A(```!.&```8`!`"Q\"`.F@V$`%(.!`!B#H0`<."$`*$Z`
+M`""4(?_H?`@"II/A`!20`0`<?)\C>#@`__\H!``%08$`&#B`0!Q(```!<&,`
+M+WQC_#!48`?^?`,#>(`!`!Q\"`.F@^$`%#@A`!A.@``@E"'_Z'P(`J:3@0`(
+MDZ$`#)/A`!20`0`<?'\;>'R=(WA\O"MX.(!`%$@```%7J6`F5[T(/#@```-\
+M`.@P?2``^%0`!%Q\90`X?*5+>&"E@``L'```08(`"&2E``%_X_MX.(!`%$@`
+M``&`GQ,<9(0!`'_C^WA(```!@`$`''P(`Z:#@0`(@Z$`#(/A`!0X(0`83H``
+M()0A_^A\"`*FD\$`$)/A`!20`0`<?'X;>'R?(W@X@$`02````51E!O`L'P``
+M08(`'%1E!O)@I0!`+!\`!$&"``Q@90`@5*4&L'_#\W@X@$`02````8`!`!Q\
+M"`.F@\$`$(/A`!0X(0`83H``()0A__A\"`*FD`$`##B```!@A(`$2````71@
+M`(!\8``F5&,?_B!C``*``0`,?`@#IC@A``A.@``@E"'_Z'P(`J:3P0`0D^$`
+M%)`!`!Q\?AMX?)\C>#B```!@A(`$2````71@`(!!@@`,+!\``D@```@L'P`!
+M08(`&&1E`(!_P_-X.(```&"$@`1(```!@`$`''P(`Z:#P0`0@^$`%#@A`!A.
+M@``@.&```$Z``"`@!```?(`A%'R#(WA.@``@E"'_Z'P(`J:3H0`,D^$`%)`!
+M`!Q\?QMX?+TK>#AC$S@XH``&2````8B_$SB('Q,Y5`!`+GRE`WB('Q,Z5`"`
+M'GRE`WB('Q,[5`#`#GRE`WA_X_MX.(```&"$@`A(```!B+\3/52E0"Z('Q,\
+M?*4#>%>@@)Y\I0-X?^/[>#B```!@A(`,2````2P=``!`@@`<?^/[>#B```!@
+MA(`$2````61E`!!(```8?^/[>#B```!@A(`$2````51E`Q1_X_MX.(```&"$
+M@`1(```!@`$`''P(`Z:#H0`,@^$`%#@A`!A.@``@E"'_V'P(`J:380`4DX$`
+M&).A`!R0`0`L?'P;>#B```!@A(!L2````7Q[&WA_@^-X.(```&"$@'!(```!
+M?'T;>'^#XW@X@```8(2`;$@```%\&Q@0?``!$'P`Z!`Y0```?&0;>#A@``!\
+M"QMX?4PC>'UC6WA]A&-X@`$`+'P(`Z:#80`4@X$`&(.A`!PX(0`H3H``()0A
+M__A\"`*FD`$`##B```!@A(!L2````8`!``Q\"`.F."$`"$Z``""4(?_H?`@"
+MII.A``R0`0`<?'T;>#B```!@A(`D2````61E`0!_H^MX.(```&"$@"1(```!
+M@`$`''P(`Z:#H0`,."$`&$Z``""4(?_H?`@"II.A``R3P0`0D^$`%)`!`!Q\
+M?AMX.(```&"$F&1(```!5']M_G/@`0!!@@`,:_\!_W__^/A_P_-X.(```&"$
+M@'!(```!?'T;>'_#\W@X@```8(2`;$@```%_O1IX?[WZ>'^CZWB``0`<?`@#
+MIH.A``R#P0`0@^$`%#@A`!A.@``@E"'_Z'P(`J:3H0`,D`$`'*.C`=`X@$`@
+M2````51C!CY_O1IX(!T``'^@Z11_H^MX@`$`''P(`Z:#H0`,."$`&$Z``""4
+M(?_H?`@"II.!``B3H0`,D`$`''Q\&WA\G2-X.(```&"$@)A(```!@!T``'QC
+M`A20?0``?X/C>#B```!@A("42````8`=``1\8P(4D'T`!'^#XW@X@```8(2`
+MG$@```&`'0`,?&,"%)!]``Q_@^-X.(```&"$@)!(```!@!T`"'QC`A20?0`(
+M?X/C>#B```!@A("@2````8`=`!!\8P(4D'T`$(`!`!Q\"`.F@X$`"(.A``PX
+M(0`83H``()0A_^A\"`*FDZ$`#)/!`!"3X0`4D`$`''Q_&WA\GB-X?'T;>"@$
+M``A`H0`8.(```&"$__](```!?!X80$"!`!0X`/__D!T3_#A@``!(```L?^/[
+M>'_$\WA(```!?&4;>'_C^W@X@```8(2`$$@```&3WQ/\.&```8`!`!Q\"`.F
+M@Z$`#(/!`!"#X0`4."$`&$Z``""4(?_H?`@"II.A``R0`0`<?'T;>#B```!@
+MA(`02````51D!#Y_H^MX2````8`!`!Q\"`.F@Z$`##@A`!A.@``@E"'_Z'P(
+M`J:3@0`(DZ$`#)/!`!"3X0`4D`$`''Q_&WA\GB-X.(`?_T@```%\'AA`0($`
+M%#@`__^0'Q0`.&```$@``$A_X_MX.(```&"$@!1(```!5'T`)'_C^WA_Q/-X
+M2````51C!/Y_O1MX?^/[>#B```!@A(`4?Z7K>$@```&3WQ0`.&```8`!`!Q\
+M"`.F@X$`"(.A``R#P0`0@^$`%#@A`!A.@``@E"'_Z'P(`J:3H0`,D`$`''Q]
+M&W@X@```8(2`%$@```%49`3^?Z/K>$@```&``0`<?`@#IH.A``PX(0`83H``
+M((AC$_1H8P`!5&,'_DZ``""4(?_H?`@"II/!`!"3X0`4D`$`''Q_&WA\?AMX
+M+`0``$&"`#`X@```8(2`!$@```%490(,?^/[>#B```!@A(`$2````8`?$_14
+M``(,2```+#B```!@A(`$2````61E`0!_X_MX.(```&"$@`1(```!@!\3]&0`
+M`0"0'A/T.&```8`!`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A_^A\"`*FDX$`
+M").A``R3P0`0D^$`%)`!`!Q\?QMX?)XC>#B`'_](```!?!X80$"!`!0X`/__
+MD!\4!#A@``!(``!(?^/[>#B```!@A(`42````51]!`1_X_MX?\3S>$@```%4
+M8X#>?[T;>'_C^W@X@```8(2`%'^EZWA(```!D]\4!#A@``&``0`<?`@#IH.!
+M``B#H0`,@\$`$(/A`!0X(0`83H``()0A_^A\"`*FDZ$`#)`!`!Q\?1MX.(``
+M`&"$@!1(```!5&2$_G^CZWA(```!@`$`''P(`Z:#H0`,."$`&$Z``"`X8``!
+M3H``($Z``"`X8```3H``($Z``"!.@``@E"'_^'P(`J:0`0`,?&`;>#$E__]]
+M*4D052D'MCAI``TL!``!08(`#'P#`WA(```!@`$`#'P(`Z8X(0`(3H``()0A
+M__A\"`*FD`$`#'QI&W@L!``+08(`%#A@```L!``>08(`+$@``"!4Q0=\D*,!
+M^#B```!@A(!H2````3A@``%(```,?2-+>$@```&``0`,?`@#IC@A``A.@``@
+ME"'_^'P(`J:0`0`,2````8`!``Q\"`.F."$`"$Z``""4(?_H?`@"II.A``R3
+MX0`4D`$`''Q_&WA\G2-X.(```&"$@`1(```!9&4`!'_C^W@X@```8(2`!$@`
+M``$L'0``0:(`('_C^W@X@$`$2````51E!!I_X_MX.(!`!$@```&``0`<?`@#
+MIH.A``R#X0`4."$`&$Z``""4(?_H?`@"II/!`!"3X0`4D`$`''Q_&W@L!```
+M08(`=#B`0`1(```!5&4$&G_C^W@X@$`$2````3A@!]!(```!.\``"G_C^W@X
+M@$`02````71@``%!@@`P.&``R$@```%_X_MX.(!`!$@```%4900:?^/[>#B`
+M0`1(```!-][__T""_\0X8```+!X``$&"`"Q_X_MX.(```&"$@`1(```!5&4#
+MF'_C^W@X@```8(2`!$@```$X8``!@`$`''P(`Z:#P0`0@^$`%#@A`!A.@``@
+ME"'_Z'P(`J:3H0`,D^$`%)`!`!Q\?QMX?)TC>#B```!@A(`$2````61E``1_
+MX_MX.(```&"$@`1(```!+!T``$&B`"!_X_MX.(!`!$@```%4900:?^/[>#B`
+M0`1(```!@`$`''P(`Z:#H0`,@^$`%#@A`!A.@``@E"'_Z'P(`J:3H0`,D\$`
+M$)/A`!20`0`<?)\C>'RD*WA\?AMX.Z```2P?``%!@@`D*!\``4&``!`L'P`"
+M08(`'$@``"!+__YU?'T;>$@``!Q+__\Y2```%$O__>E(```,.&```$@```R3
+M_A,T?Z/K>(`!`!Q\"`.F@Z$`#(/!`!"#X0`4."$`&$Z``""4(?_X?`@"II`!
+M``PX@$`$2````51CA[Z``0`,?`@#IC@A``A.@``@E"'_Z'P(`J:3X0`4D`$`
+M'"P$``%!@@`8/2```#OI```L!``"0:(`'$@``!`](```.^D``$@```PX8```
+M2```$'_D^WA(```!?^/[>(`!`!Q\"`.F@^$`%#@A`!A.@``@E"'_^'P(`J:0
+M`0`,.(``#$@```&``0`,?`@#IC@A``A.@``@E"'_^'P(`J:0`0`,?(4C>#B`
+M``Q(```!@`$`#'P(`Z8X(0`(3H``()0A__A\"`*FD`$`##B```@XH``$2```
+M`8`!``Q\"`.F."$`"$Z``""4(?_H?`@"II/!`!"3X0`4D`$`''Q^&W@X@``(
+M.*``($@```$[X```?\/S>#B```A(```!.````7!I``1!@@`<.&``"D@```$[
+M_P`!+!\#YT"!_]@X````?`,#>(`!`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A
+M_^A\"`*FDZ$`#)`!`!Q\?1MX.(```&"$@&A(```!5&4&L'^CZW@X@```8(2`
+M:$@```&``0`<?`@#IH.A``PX(0`83H``()0A_^A\"`*FDZ$`#)`!`!Q\?1MX
+M.(```&"$@&A(```!8&4`0'^CZW@X@```8(2`:$@```&``0`<?`@#IH.A``PX
+M(0`83H``()0A_^A\"`*FDX$`").A``R0`0`<?'T;>'R`(WA\O"MX.(```&"$
+M@%!\!0-X2````7^CZW@X@```8(2`5'^%XWA(```!@`$`''P(`Z:#@0`(@Z$`
+M##@A`!A.@``@E"'_Z'P(`J:3P0`0D^$`%)`!`!Q\?AMX?)\C>#A@```H!``_
+M08$`;"@$`!]`@0`T?\/S>#B```!@A(!42````3@?_^`XH/_^7*4`/GQE*#A_
+MP_-X.(```&"$@%1(```L?\/S>#B```!@A(!02````3B@__Y<I?@^?&4H.'_#
+M\W@X@```8(2`4$@```$X8``!@`$`''P(`Z:#P0`0@^$`%#@A`!A.@``@E"'_
+MZ'P(`J:3P0`0D^$`%)`!`!Q\?AMX?)\C>#A@```H!``_08$`;"@$`!]`@0`T
+M?\/S>#B```!@A(!42````3@?_^`XH``!?*4`,'QE*WA_P_-X.(```&"$@%1(
+M```L?\/S>#B```!@A(!02````3B@``%\I?@P?&4K>'_#\W@X@```8(2`4$@`
+M``$X8``!@`$`''P(`Z:#P0`0@^$`%#@A`!A.@``@E"'_^'P(`J:0`0`,.(``
+M`&"$@$Q(```!@`$`#'P(`Z8X(0`(3H``()0A__A\"`*FD`$`#'R%(WAP@`(`
+M08(`#%2%!>I@I0`@.(```&"$@$Q(```!@`$`#'P(`Z8X(0`(3H``(#@```"0
+M!``(5*`%/I`$``PX8```?``H`$RB`"!PP``@08(`$(`$``Q@`"``D`0`##@`
+M``"0!``4D`0`$#A@``%.@``@E"'_Z'P(`J:3@0`(DZ$`#)/!`!"3X0`4D`$`
+M''Q\&WA\ORMX?3Y+>'R=(WB`!``4.2``#W`+``%!@@$T@`8`%'`)``%`@@`8
+M.(``#$@```$Y(``/?`/X`$&"`12@'0`25``%/K`>``"`'0`45!^,_G^#XW@X
+M@```8(2`;$@```%48[0^5&`$_GP`^$!`@``4.`/@`%0`!#Y__P-X2```"'__
+M&WA7X`1^L!X``C@```"8'@`$@!T`%'`)``)`@@!@<`L`!$&"``PX```!2```
+M,(`=`!1P"0`008(`$(@>``1@```(2```&(`=`!1P"P`(08(`%(@>``1@```$
+MF!X`!$@``!R('@`$8````I@>``2`'0`45`#??I@>``6`'0`05`!N/I@>``:`
+M'0`4<`D!`$&"``Q4`+Z^2```"#@`__^8'@`'@!T`$%0`CSZ8'@`(@!T`$%0`
+ME_Z8'@`)@!T`$%0`I_Z8'@`*.2```'TC2WB``0`<?`@#IH.!``B#H0`,@\$`
+M$(/A`!0X(0`83H``()0A_\A\"`*F?8``)I+A`!23`0`8DR$`')-!`""380`D
+MDX$`*).A`"R3P0`PD^$`-)`!`#R1@0`0?'X;>'R:(WA\NRMX?-<S>'SX.WA\
+M?!MXH`4``CD@``QP"P$`08(&X'RD*WA(```!?'D;>#D@``PL`P``08(&R"P:
+M``9!@@`H*!H`!D&!`!`H&@`!08$`$$@``!0L&@`(08(`##D@``Q(``:<?\/S
+M>#B`0!!(```!5'\&='_#\WA_9-MX2````3D@``,L`P``08(&=(B\$Q.('!,4
+M5`!`+GRE`WB('!,55`"`'GRE`WB('!,65`#`#GRE`WA_P_-X.(```&"$@`!(
+M```!B+P3&%2E0"Z('!,7?*4#>'_#\W@X@```8(2`!$@```%_P_-X?T33>$@`
+M!F$L&@`!08(`,"@:``%!@``8+!H`!D&"`$`L&@`(08(`.$@``%1_P_-X.(``
+M*#B@``%(```0?\/S>#B``"@XH```2````7_#\W@X@$`0.*`0)$@``"!_P_-X
+M.(``*#B@``!(```!?\/S>#B`0!`XH!!`2````7_#\W@X@$`02````7QE^WA_
+MP_-X.(!`$$@```&(O!,XB!P3.50`0"Y\I0-XB!P3.E0`@!Y\I0-XB!P3.U0`
+MP`Y\I0-X?\/S>#B```!@A(`(2````8B\$SU4I4`NB!P3/'RE`WA_P_-X.(``
+M`&"$@`Q(```!?\/S>#B````XH```2````7_#\W@X@``$.*```$@```%_P_-X
+M.(``##B@``!(```!?\/S>#B``!Q(```!?\/S>#B``"`XH```2````7_#\W@X
+M@``D.*```$@```$X````D!P3''_#\W@X@``L2````7_#\W@X@``P.*``!4@`
+M``%_P_-X.(``-#B@``5(```!?\/S>#B``$0XH``(2````7_#\W@X@`!(.*``
+M"$@```%_P_-X.(``4#B@``!(```!?\/S>#B``$PXH```2````7_#\W@X@$`,
+M.*```$@```%_P_-X.(``0#B@``!(```!?\/S>#B```!@A(`8@+P3^$@```%_
+MP_-X.(```&"$@$@XH```2````7_#\W@X@```2````7_#\W@X@```8(2`4#B@
+M``!(```!?\/S>#B```!@A(!4.*```$@```%_P_-X.(```&"$@%@XH```2```
+M`7_#\W@X@```8(2`7#B@``!(```!?\/S>#B```!@A(!@.*```4@```%_P_-X
+M.(```&"$@&0XH``!2````7_#\W@X@```8(2`:#B@``!(```!?\/S>#B```!@
+MA(`H.*```$@```%_P_-X.(```&"$@"PXH```2````7_#\W@X@```8(2`;#B@
+M``!(```!?\/S>#B```!@A(`P.*#__T@```%_P_-X.(```&"$@#0XH/__2```
+M`7_#\W@X@```8(2`.#B@``%(```!.^```#T@```[J0``+A<``%?@&#A\G0`N
+M09(`$#@$@``H``__0($`&%?I&#A]*>H4@*D`!'_#\WA(```!._\``2@?`*9`
+M@?_,?\/S>']DVWA(```!.2```RP#``!!@@*@?\/S>#B```!@A)@H2````51E
+M!AZ('!)Y5`!`+GRE`WA_P_-X.(```&"$F"A(```!B!P2>E0%P`Y4`(`>?*4#
+M>(D\$GM5($`N?*4#>'RE2WA_P_-X.(```&"$F#1(```!?\/S>#B```!@A)A$
+M2````51E!F*@'!)T5`#\L'RE`WA_P_-X.(```&"$F$1(```!?\/S>#B```!@
+MA)A(2````51E!1J@'!)T5`!3IGRE`WA_P_-X.(```&"$F$A(```!?\/S>#B`
+M``!@A)AD2````51E!1B('!)X5`!C9GRE`WA_P_-X.(```&"$F&1(```!?\/S
+M>#B```!@A)D02````51E`#J@'!)T5``'OGRE`WA_P_-X.(```&"$F1!(```!
+M?\/S>'\DRWA(`!#9.2```RP#``!!@@%H+!<``$&"`"B(&0`$<`D``D""``Q4
+M```\F!D`!*`9``*P&P`"B!D`!)@;``1_P_-X.(```&"$F!PXH``!2````3A@
+M`^A(```!?\/S>#B```!@A)A@2````6!E``%_P_-X.(```&"$F&!(```!?\/S
+M>#B```!@A)A@.*```3C```!(```!?\/S>'\DRWA(```!.^```"P#``!`H@`8
+MH!L``F````*P&P`".2```T@``+A_P_-X?^3[>$@```$[_P`!+!\``D"!_^R`
+M'A),+````$&B``Q_P_-X2````7_#\W@X@```8(2`)$@```%490),?\/S>#B`
+M``!@A(`D2````8"<$_PL!/__08(`#'_#\WA(```!@)P4`"P$__]!@@`,?\/S
+M>$@```&`G!0$+`3__T&"``Q_P_-X2````8"^`?@L!0``0:(`%'_#\W@X@```
+M8(2`:$@```&37@'<.&```4@``!B`&```+````$&"``B1.```.&```(`!`#R!
+M@0`0?`@#IH+A`!2#`0`8@R$`'(-!`""#80`D@X$`*(.A`"R#P0`P@^$`-'V`
+M@2`X(0`X3H``()0A_^A\"`*FDZ$`#)/!`!"3X0`4D`$`''Q]&WA\GR-X.(``
+M`&"$@`1(```!5&,$/BP?``%!@@!(08$`$"P?``!!@@`L2```9"P?``9!@@`0
+M+!\`"$&"`#A(``!0@+T3]'QE*WADI0!12```,("]$_1\92MX9*4`4D@``""`
+MO1/T?&4K>&2E`!1(```0@+T3]'QE*WADI0`0?Z/K>#B```!@A(`$2````8`!
+M`!Q\"`.F@Z$`#(/!`!"#X0`4."$`&$Z``""4(?_X?`@"II`!``R`@P'<2___
+M+8`!``Q\"`.F."$`"$Z``""4(?_X?`@"II`!``PX@``(.*``"D@`!+V``0`,
+M?`@#IC@A``A.@``@E"'_Z'P(`J:3X0`4D`$`''Q_&W@X@```.*```4@```$X
+M````+`,``$&B`$1_X_MX.(``#SB@3B!(``1Q.````"P#``!!H@`H.&`#Z$@`
+M``%_X_MX.(``'SB@3B!(``1-.&`(-$@```$X```!?`,#>(`!`!Q\"`.F@^$`
+M%#@A`!A.@``@E"'_Z'P(`J:3P0`0D^$`%)`!`!Q\?AMX?)\C>#B````XH``!
+M2````3@````L`P``08(`J#B@```L'P``08(`%*`?``)P"0`008(`"#B@``%_
+MP_-X.(```&"$F`1(```!?\/S>#B```\XH$X@2``#N3@````L`P``0:(`8#A@
+M`^A(```!?\/S>#B``!\XH$X@2``#E3@````L`P``0:(`/#A@"#1(```!?\/S
+M>#B````XH``!2````3@````L`P``0:(`&'_#\W@X@```.*``"D@``U5\8!MX
+M?`,#>(`!`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A_]A\"`*FDP$`"),A``R3
+M00`0DV$`%).!`!B3H0`<D\$`()/A`"20`0`L?'\;>'R8(WA\N2MX2````7Q^
+M&W@X````+`,``$&"`K1_X_MX.(```&"$@&A(```!8&4`8'_C^W@X@```8(2`
+M:$@```%_X_MX.(```&"$@"1(```!?'H;>%1E`DY_X_MX.(```&"$@"1(```!
+M.&`/H$@```%_X_MX.(```&"$F`A(```!9&4(`'_C^W@X@```8(28"$@```$X
+M8``*2````7_C^WA_Q/-X2``+N3@````L`P``0:("'#A@`^A(```!?^/[>#B`
+M``!@A)@(2````51E`49_X_MX.(```&"$F`A(```!?^/[>#B```!@A)A82```
+M`7Q]&WA_X_MX.(```&"$F%Q(```!?'P;>'_C^W@X@```8(28:$@```%\>QMX
+M9Z4#_'_C^W@X@```8(286$@```%7A0929*4`/V"EP(!_X_MX.(```&"$F%Q(
+M```!5V4&W&"E$8!_X_MX.(```&"$F&A(```!.&``%$@```%_X_MX.(```&"$
+MF`A(```!9&4(`'_C^W@X@```8(28"$@```$X8``*2````7_C^W@X@```8(28
+MU#B@`"%(```!?^/[>#B```!@A)@(2````51E`49_X_MX.(```&"$F`A(```!
+M.&`#Z$@```%_X_MX.(```&"$F&!(```!8&4``7_C^W@X@```8(288$@```%_
+MX_MX.(```&"$F&`XH``!.,```$@```%_X_MX.(```&"$F%A_I>MX2````7_C
+M^W@X@```8(287'^%XWA(```!?^/[>#B```!@A)AH?V7;>$@```%_X_MX?\3S
+M>$@```$L`P``0*(`+#A@$XA(```!?^/[>'_$\WA(```!+`,``$""`!"@&``"
+M8````K`8``)_X_MX.(```&"$@&A(```!5&4&\'_C^W@X@```8(2`:$@```%_
+MX_MX.(```&"$@"1_1=-X2````3@```&0&0``?`,#>(`!`"Q\"`.F@P$`"(,A
+M``R#00`0@V$`%(.!`!B#H0`<@\$`((/A`"0X(0`H3H``()0A_^!\"`*FDZ$`
+M%)/!`!B3X0`<D`$`)'Q]&WA\GR-X?+XK>'R`(W@L!```0((`"#@`__^0`0`(
+M?Z/K>#B`0`!_Y?MX2````7_#\WA(```!5_\'/H`!``A4``<^D`$`"'^CZW@X
+M@$``?`4#>'_F^WA(```!?'X;>'/@``1`H@!$.```%9`!``B(H0`(.2$`"(@)
+M``%4`$`N?*4#>(@)``)4`(`>?*4#>(@)``-4`,`.?*4#>'^CZW@X@``42```
+M`7_#\WB``0`D?`@#IH.A`!2#P0`8@^$`'#@A`"!.@``@.4```#E@``HY!0`!
+M/.`08F#G3=-5:0@\.2D``U4I!CY\!4@`0*(`&'P$6*Y\`P-X+```/TR"`"!(
+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
+M0!XX56OO?GP`6WB!(0!$?`!+>)`!`$2(`0`45``.?%5*W_Y\`%-X@2$`2'P`
+M2WB0`0!(B4$`%55`+C2!(0!,?`!+>)`!`$R)80`656`>.%5*[WY\`%-X@2$`
+M4'P`2WB0`0!056O?_H`!`%1]:P-XD6$`5(AA`!<X@``#2````51C/C"``0!(
+M?&,#>)!A`$B(80`7.(```T@```%48_^^@`$`3'QC`WB080!,B&$`&#B```-(
+M```!5&,6^H`!`$Q\8P-XD&$`3#N@```[X0`(5ZD0.GTI^A2`J0`@?\/S>#B`
+M``!@A)B<2````3@=``%4'00^*!T`#T"!_]A7H!`Z?2$"%'_#\W@X@```8(28
+MU("I`"A(```!.````7P#`WB``0",?`@#IH.A`'R#P0"`@^$`A#@A`(A.@``@
+ME"'_Z'P(`J:3@0`(DZ$`#)`!`!Q\?1MX?)PC>*$D```Y*>P`/&!F9F!C9F=\
+M:1B6?&,6<'TI_G!\:1A0.(``!4@```%490@\8*4`07^CZW@X@```8(28G$@`
+M``%_H^MX.(```&"$F,`XH```2````9.=$C0X8``!@`$`''P(`Z:#@0`(@Z$`
+M##@A`!A.@``@E"'_^'P(`J:0`0`,.(```&"$F&1(```!5&-M_G!@`0!!@@`,
+M:&`!_WP#`/B``0`,?`@#IC@A``A.@``@E"'_Z'P(`J:3H0`,D\$`$)/A`!20
+M`0`<?'X;>'R=(W@X@```8(288$@```%@90`"?\/S>#B```!@A)A@2````7_#
+M\W@X@```8(288#B@``(XP```2````3@````L`P``08(`;#A@```[X```2```
+M&#A@`^A(```!?\/S>$@```$[_P`!.2```2P?`!1`@0`(.2```#@```$L`_^X
+M08$`"#@```!]*P`Y0(+_R"P#_[A`@0`4.````+`=`!8X````2```#+!]`!8X
+M```!?`,#>(`!`!Q\"`.F@Z$`#(/!`!"#X0`4."$`&$Z``"`X8```3H``(#A@
+M``!.@``@E"'_^'P(`J:0`0`,?&`;>#A@```L!``"0:$`&!R$`#Q\@"(4.(03
+M0'P#`WA(```!@`$`#'P(`Z8X(0`(3H``()0A__A\"`*FD`$`#'Q@&WA\JRMX
+M.&```"P$``)!H0`<'*0`/'R@*A0XI1-`?`,#>'UD6WA(```!@`$`#'P(`Z8X
+M(0`(3H``()0A_]A\"`*FDV$`%).!`!B3H0`<D\$`()/A`"20`0`L?'T;>'R>
+M(WA\O"MX+`0``D&"`"0H!``"08$`$"P$``%!@@`D2```*"P$``-!@@`02```
+M'#M@``)(```<.V```4@``!0[8```2```##A@__](``!T'!L`/'_C`A0[_Q-`
+M@!\`!#A@__\L````0((`6'_C^W@X@``\2````9/?``0L'```0*(`+#@```N0
+M'P`,.````I`?`!0X`/__D!\`&#@```JP'P`@L!\`(D@``!1_H^MX?V3;>'^%
+MXWA(```!?V/;>(`!`"Q\"`.F@V$`%(.!`!B#H0`<@\$`((/A`"0X(0`H3H``
+M(#E@```H!``"08$`<!P$`#Q](P(4.2D30(`)``0Y8```+````$&"`%0X````
+MD`D`!#D@__Y=*2`^@`,3('T@`#B0`Q,@@`,3)'T@`#B0`Q,D@`,3*'T@`#B0
+M`Q,H@`,3+'T@`#B0`Q,L@`,3,'TI`#B1(Q,P.6```7UC6WA.@``@E"'_Z'P(
+M`J:3@0`(DZ$`#)/!`!"3X0`4D`$`''Q_&WA\G"-X?'T;>($C$C0X8```*`0`
+M`D&!`PP<!``\?]\"%#O>$T"`'@`$.&```"P```!!@@+P@!X`!#A@``$L```!
+M0*("X*`)``)P"0`008(`Q'_C^W@X@```8(2`$#B@`>!(```!?^/[>#B```!@
+MA(`4/*`(`&"E"`!(```!?^/[>#B```!@A(`@/*`!W6"EC\](```!@+X`%!RE
+M`>`XI0'@5*58*&"E`>!_X_MX.(```&"$@$!(```!?^/[>#B```!@A(!$/*`%
+MKF"E`\!(```!?^/[>#B```!@A)A$2````51E`#!@I0`X?^/[>#B```!@A)A$
+M2````7_C^W@X@```8(28!#R@;P!@I2`C2```P'_C^W@X@```8(2`$#B@`6A(
+M```!?^/[>#B```!@A(`4/*`$`&"E!`!(```!?^/[>#B```!@A(`@/*`!W6"E
+MCZ=(```!@+X`%!RE`6@XI0(P5*58*&"E`C!_X_MX.(```&"$@$!(```!?^/[
+M>#B```!@A(!$/*`$UV"E`YA(```!?^/[>#B```!@A)A$2````51E`#!@I0`<
+M?^/[>#B```!@A)A$2````7_C^W@X@```8(28!#R@;P!@I1`@2````8`>`!@X
+MH``/+`#__T&"``B`O@`85*6@%J`>`")4`"8V?*4#>*`>`"!4``<^?*4#>&2E
+M``A@I2``?^/[>#B```!@A(`<2````8`>``QP"0`!08(`&#@```%\`.`P@3T3
+M('P`2WA(```4.`#__EP`X#Z!/1,@?`!(.)`=$R"`'@`,<`D``4&"`!@X```!
+M?`#@,($]$R1\`$MX2```%#@`__Y<`.`^@3T3)'P`2#B0'1,D@!X`#'`)``)!
+M@@`8.````7P`X#"!/1,H?`!+>$@``!0X`/_^7`#@/H$]$RA\`$@XD!T3*(`>
+M``QP"0`$08(`&#@```%\`.`P@3T3+'P`2WA(```4.`#__EP`X#Z!/1,L?`!(
+M.)`=$RR`'@`,<`D`"$&"`!@X```!?`#@,($]$S!\`$MX2```%#@`__Y<`.`^
+M@3T3,'P`2#B0'1,P.&```8`!`!Q\"`.F@X$`"(.A``R#P0`0@^$`%#@A`!A.
+M@``@E"'_^'P(`J:0`0`,'(0`/'TC(A2`"1-$+````$&"`!@L```!0*(`$#B`
+M``!(```!2```"#A@__^``0`,?`@#IC@A``A.@``@E"'_^'P(`J:0`0`,'(0`
+M/'R#(A2`!!-$+````4&"`!@H```!08``("@```-!@0`82```##B```!(```4
+M.(``!$@```PX8```2```#$@```$X8``!@`$`#'P(`Z8X(0`(3H``()0A_^A\
+M"`*FDZ$`#)/!`!"3X0`4D`$`''Q_&WA\G2-X2````7Q^&WA49`!^?^/[>$@`
+M``%_X_MX.(```&"$@&1(```!(`,`)50`^'Y\HP(4+!T``$""`"0XH___*`,`
+M`4&A`!A_X_MX?\3S>$@```$X8```2```)'_C^W@X@```8(2`9$@```%_X_MX
+M?\3S>$@```$X8``!@`$`''P(`Z:#H0`,@\$`$(/A`!0X(0`83H``()0A_^A\
+M"`*FD^$`%)`!`!Q\?QMX'(0`/'R#(A2`!!-$+````4&"`"`H```!08``3"P`
+M``)!@@`X+````T&"`!1(```X.(``"#B@``%(```T.(``"#B@``)(```!?^/[
+M>#B``"@XH``.2```&#B``"@XH``*2```##A@``!(```,2````3A@``&``0`<
+M?`@#IH/A`!0X(0`83H``()0A__A\"`*FD`$`#!R$`#Q](R(4@`D31"P```!!
+M@@`<+````4"B`!0X@``42````51CKSY(```(.&```(`!``Q\"`.F."$`"$Z`
+M`""4(?_H?`@"II/!`!"3X0`4D`$`''Q_&W@<A``\?(,B%(`$$T0L```!08(`
+M&"@```%!@`!\+````D&"`&!(``!P.(``"#B@``A(```!.\```'_C^W@X@``4
+M2````7!@>`!!@@`8.&``"D@```$[W@`!+!X#YT"!_]Q_X_MX.(``"#B@``!(
+M```!.&```2P>`^=`@0`@2```&#B``"PXH``$.,```$@```%(```(.&```(`!
+M`!Q\"`.F@\$`$(/A`!0X(0`83H``(($!``B!80`0.`?__3U`#``H```!0($`
+M"%3JT`I4H`4^52F0&GP`2WA4R6.F?`!+>'P%4WAQ8``!08(`"&2E`0!58,B$
+M?``K>($A``PQ2?__?.I)$%3IR`Q]*0-XD20`""P(__]!@@`850!K9)`$``QE
+M($``D`0`"$@```PX````D`0`#'%@``1!@@`D@`0`"&0``$"0!``(@`$`&%0`
+M`!B!)``,?`!+>)`$``PX8``!3H``(#A@``!.@``@@`0`"&0`(`"0!``(3H``
+M("P&``!!@@`@@20`#"%G``!\"SD45`!@)GTI*WA\`$MX2```*"P'``!!@@`4
+M@`@`")`$``B0I``,2```%#@```"0!``(8*`0`)`$``PX````D`0`%)`$`!`X
+M8``!3H``((`$`!0X8``/<`D``4V"`""@!``65``$_+`%``"@!``0L`4``C@`
+M``"8!0`$@`0`$'`)``%`@@!$<`D``D&"``PX```!F`4`!(`$`!!P"0`(08(`
+M$(@%``1@```"F`4`!(`$`!!P"0`$08(`$(@%``1@```$F`4`!(`$``A4`'<^
+MF`4`!8`$`!14`)X^F`4`!H`$`!!4`,<^F`4`!X`$`!!4`.<^F`4`"#@```"8
+M!0`*F`4`"SA@``!.@``@3H``((@$``1@```(F`0`!#A@``!.@``@E"'_Z'P(
+M`J:3P0`0D^$`%)`!`!Q\?AMX.(```&"$F-`XH!P62````3O@``!_P_-X.(``
+M`&"$F(`\H``!2````3O_``$L'P`'0('_Y'_#\W@X@```8(2<`$@```%48T8^
+M5&GA/E1@)C9](P-X.(``"$@```&``0`<?`@#IH/!`!"#X0`4."$`&$Z``""4
+M(?_0?`@"II,!`!"3(0`4DT$`&)-A`!R3@0`@DZ$`))/!`"B3X0`LD`$`-'QY
+M&WA\G"-X?+LK>'S:,WA\^#MX.&`N\$@```%\?QMX.Z```BP#``!!@@/\?'X;
+M>#R````XA```.*`2<$@```&3GP`,DW\`$)-?`!2S/P'(.````+`?`<HX```_
+ML!\!_#@```"0'P(`D!\NK)`?+L@X``<`D!\NT#@`__^0'R[4D!\NV)`?+MQ_
+MX_MX.(```$@```$[H``#+`,``$&"`XB@'P'(.2```&$I\1M\`$@`0*(`-'_C
+M^W@X@```8(2B`#B@``!(```!?^/[>#B```!@A)A\.*``&4@```$X8`/H2```
+M`7_#\W@X@$`@2````51C!CY4:>$^D3X!S%1@!SZP'@'0.2G__CN@``TH"0`"
+M08$#%'_#\W@X@```8(28&$@```&P?@'2?\/S>$@``X$[H``.+`,``$&"`NR`
+M'@',*````T"!`!A_P_-X.(```&"$F``XH``'2```%'_#\W@X@```8(28`#B@
+M`$=(```!.&`'T$@```%_P_-X2__]S;!^`=2@'@'45``&-CN@``TL```00*("
+MD'_#\W@X@`#!.*$`"$@```$[H``(+`,``$&"`G2@`0`(.Z``!2@`+_]`@0)D
+MH`$`"+`?$G!_P_-X.(!`$$@```%48^^^.Z``"BP#``)`H@)`?\/S>#B``#\X
+MH0`(2````3N@``@L`P``08(")*`!``BP'Q)R.X```#N@```XG0#`?\/S>#BA
+M``A(```!+`,``$&"`?B@`0`(?YP">#N]``$H'0,_0('_V#@```!@`/__.Z``
+M!WP<``!`@@'4.```"K`?$^8X```#L!\5\#N@```X```+'3T`-'TI^A2P"1/N
+M.[T``2@=``E`@?_L.Z```#T@```Y20``.6``"U>@"#Q](/H4.2D5\'P*`BZP
+M"0`(L`D``AT]`#1]*?H4L6D6M+%I%A@[O0`!*!T``D"!_]`XGQ)P?\/S>$@`
+M``$[H``(+`,``$&"`4B`'@',*````T"!`&R@'Q**+````$&B`&!_P_-X.(``
+M`&"$F``XH$`'2````3A@!]!(```!?\/S>$O__#&P?@'6?\/S>#B```!@A)@`
+M.*``!T@```$X8`?02````:`>`=94``8V.Z``#2P``"!`@@#82```##@```"P
+M'Q**?\/S>#B``+\XH0`(2````3N@``@L`P``08(`L*`!``BP'Q)TH!\2=+`>
+M`@@](```.2D``)$^`<!_P_-X2``"Y7_#\WA(```!.X```#N@```@G0`??\/S
+M>#BA``A(```!+`,``$&"`&"@`0`(?YP"%%>I"#Q]*?H45`#"/I@)+"R(`0`)
+MF`DL+3N]``$H'0`"0('_P"`<``!](.$4/6```F%K__U_@%IX(6```'P+`10[
+MH``)?\/S>'TK`WE!H@`L2```"#N@``@L'P``08(`#'_C^WA(```!+!@``$&"
+M``B3N```.&```(`!`#1\"`.F@P$`$(,A`!2#00`8@V$`'(.!`""#H0`D@\$`
+M*(/A`"PX(0`P3H``()0A_^A\"`*FDZ$`#)`!`!Q\?1MX.(,2<$@```%_H^MX
+M2````8`!`!Q\"`.F@Z$`##@A`!A.@``@E"'_N'P(`J:3`0`HDR$`+)-!`#"3
+M80`TDX$`.).A`#R3P0!`D^$`1)`!`$Q\?!MX/2```#DI$GB!20`$@2D``)$A
+M`!B100`</6```#DK$H"`"Q*`@6D`!(%)``B!*0`,D`$`")%A``R100`0D2$`
+M%#M````[`0`8.R$`(%==$#I_W<`N?[W*%'^#XWA_Q/-X2````9!]```[X```
+M5^"`'GP=^WA_@^-X?\3S>'^EZWA(```!?X/C>'_$\WA(```!.````'P#Z`!`
+M@@"`._\``2P?`/]`@?_(.^```#MA``A7X!`Z?[L`+G^#XWA_Q/-X?Z7K>$@`
+M``%_@^-X?\3S>$@```$X````?!T8`$""`#P[_P`!+!\``T"!_\A70!`Z?X/C
+M>'R8`"Y\N0`N2````3M:``$L&@`!0('_1#A@`&1(```!.````7P#`WB``0!,
+M?`@#IH,!`"B#(0`L@T$`,(-A`#2#@0`X@Z$`/(/!`$"#X0!$."$`2$Z``"!P
+M@`$`08(`%#@`$SBP!0``.``7U$@``"1P@`"`08(`**`#$HHL````08(`'#@`
+M"0BP!0``.``*K+`&```X8``!3H``(#A@``!.@``@.&```4Z``""4(?_@?`@"
+MII.!`!"3H0`4D\$`&)/A`!R0`0`D?'P;>'Q^&WA\?1MX.^,!X*`#`@@L```!
+M0*(`$#B``!`XH0`(2````3@```"0'P`$H!X2ABP```!!@@`@.````9`?``2@
+M'A)V+````$""``PX```#D!\`!*`>$HHL````08(`$(`?``1@```$D!\`!#@`
+M"0BP'P`0.``*K+`?`!(X`!,XL!\`##@`%]2P'P`.@!\``&0`P`!@`,``.2``
+M"K$_``@Y(`"`L3\`"E0`!>B0'P``H!X2>BP```!!H@`P.+T22'^#XW@X@``/
+M2````2P#``!!@@`8.````9`=$DR`'P``8``!`)`?```X```-D!\`%#@```&0
+M'1)H.&```8`!`"1\"`.F@X$`$(.A`!2#P0`8@^$`'#@A`"!.@``@E"'_Z'P(
+M`J:3@0`(DZ$`#)`!`!Q\?!MX?)TC>#B```!@A(`H@+T`!$@```%_@^-X.(``
+M`&"$@"R`O0`,2````7^#XW@X@```8(2`,("]`!!(```!?X/C>#B```!@A(`T
+M@+T`"$@```%_@^-X.(```&"$@""`O0``2````8`!`!Q\"`.F@X$`"(.A``PX
+M(0`83H``()0A_]A\"`*FD`$`+)"!``R``P'<+````4&"`!PH```!08``+"P`
+M``9!@@`D+```"$"B`$0X````8`#__Y`!`!0\```'8`#__T@``"@](```@`D`
+M`'P`(%!4`!@XD`$`%#T@``"`"0``?``@4%0`&#B0`0`8.`0``9`!`!`\``&`
+M8`#__WR@`#B0`0`(.($`"$@```&``0`L?`@#IC@A`"A.@``@E"'_Z'P(`J:3
+MH0`,D`$`''Q]&W@X@```8(2`*#B@``!(```!?Z/K>#B```!@A(`$2````61E
+M``14I0,2?Z/K>#B```!@A(`$2````7^CZW@X@```8(2`(#B@``!@I?__2```
+M`8`!`!Q\"`.F@Z$`##@A`!A.@``@E"'_Z'P(`J:3H0`,D\$`$)/A`!20`0`<
+M?'\;>'R>(WA\?1MXH`0`$BP```!!@@!D.(```&"$@`1(```!9&4`$'_C^W@X
+M@```8(2`!$@```&@O@`0?^/[>#B```!@A(`D2````:"^`!)_X_MX.(```&"$
+M@#A(```!@+X`%%2E&#A_X_MX.(```&"$@#!(```@.(```&"$@`1(```!5&4#
+M%'_C^W@X@```8(2`!$@```%_X_MX.(```&"$@"B`O@``2````7_C^W@X@```
+M8(2`($@```%48P`0H!X`"GQE`WBA/@`8+`D``$&"`!`X"0`$5`""7GRE`WA_
+MX_MX.(```&"$@"!(```!@+TNT%2E!AZ@'@`:5`!$+GRE`WB0O2[0?^/[>#B`
+M``!@A(`82````7_C^W@X@$`$2````51E`!Z!/@`<.2G__54I'#A\I4MX?^/[
+M>#B`0`1(```!@`$`''P(`Z:#H0`,@\$`$(/A`!0X(0`83H``()0A__A\"`*F
+MD`$`##B`0`A(```!,2/__WP)&1!\`P-X@`$`#'P(`Z8X(0`(3H``()0A_^A\
+M"`*FD\$`$)/A`!20`0`<?'X;>'R?(W@X@`#`2````2P#__]`H@`4.````)`?
+M```X8```2```T#P``05@`-BZ?&``.)`?``!T:0`(08(`#&0`0`"0'P``<&``
+M!4&"`!"`'P``8````9`?``!P:07`08(`$(`?``!@``!`D!\``'!@`"!!@@`<
+M@!X2:"P```!!@@`0@!\``&0`0`"0'P``@!\``'0)0`!!H@!8D'X24'_#\W@X
+M@`#$2````9!^$E1_P_-X.(``R$@```&0?A)8?\/S>#B``,Q(```!D'X27'_#
+M\W@X@`#02````9!^$F!_P_-X.(``U$@```&0?A)D.&```8`!`!Q\"`.F@\$`
+M$(/A`!0X(0`83H``((!C+#A.@``@E"'_Z'P(`J:3@0`(DZ$`#)/!`!"3X0`4
+MD`$`''Q]&WA\GR-X?'X;>(.#+#@L'```0*``'#B``"0XH```2````7^CZW@X
+M@``D2````3P``05@`-BZ?^4`.'/@`$!!@@!$@!XL/"P```!!@@`(8*4`0(`>
+M+$`L````08(`"&"E`0"`'BQ$+````$&"``A@I0"`@!XL2"P```!!@@`(8*4$
+M`'/@``%!@@`(8*4`!W?@0`!!@@`(9*4`"'^CZW@X@`"@2````9/^+#@L'P``
+M0*``%'^CZW@X@``D.*```4@```%_@^-X@`$`''P(`Z:#@0`(@Z$`#(/!`!"#
+MX0`4."$`&$Z``"`X8`"`3H``()0A__A\"`*FD`$`#"@$`']!H0`@5(0H-#R$
+M``$XA(@<2````3@```%P:8``0((`"#@```!\`P-X@`$`#'P(`Z8X(0`(3H``
+M()0A_^A\"`*FDZ$`#)/A`!20`0`<?'\;>#@````H!`!_0:$`D%2=*#0_O0`!
+M.)V(`#B@``!(```!.)V(!'_C^W@XH```2````3B=B`A_X_MX.*```$@```$X
+MG8@,?^/[>#B@``!(```!.)V($'_C^W@XH```2````3B=B!1_X_MX.*```$@`
+M``$XG8@8?^/[>#B@``!(```!.[V(''_C^WA_I.MX.*```$@```$X```!?`,#
+M>(`!`!Q\"`.F@Z$`#(/A`!0X(0`83H``()0A_^A\"`*FDZ$`#)/!`!"3X0`4
+MD`$`''Q^&W@X8```*`0`?T&!`(P[X```.2```"P%``!!@@!,B^4`!5?_0"Z(
+M!0`$?_\#>(DE``-5*<`.B`4``E0`@!Y]*0-XB`4``50`0"Y]*0-XB`4``'TI
+M`WA5*?A^5^#X`'TI`WA7__A^5)TH-#^]``$XG8@8?\/S>'TE2WA(```!.[V(
+M'&/E@`!_P_-X?Z3K>$@```$X8``!@`$`''P(`Z:#H0`,@\$`$(/A`!0X(0`8
+M3H``()0A_\A\"`*FDN$`%),!`!B3(0`<DT$`()-A`"23@0`HDZ$`+)/!`#"3
+MX0`TD`$`/'Q\&WA\F2-X?-@S>#%G__]]:UD0/`!556``559]:P`X/2NJJSEI
+MJJHX8```*`0`?T&!`;R(!0``+````4&"`"!!@0`0+````$&"`!Q(``!8+```
+M!4&"`$A(``!,.N``!4@``$R@!0`".&```"@```1`@0%\H`4``CK@```H```%
+M0($`+*`%``(BX``-?O>Y$%;W![PZ]P`!2```%#K@``=(```,.&```$@``42)
+M10`$B`4`!50`0"Y]2@-XB`4`!E0`@!Y]2@-XB`4`!U0`P`Y]2@-X?4I:>(@%
+M``E4`$`NB24`"'P:2WA_6EIX5UH$/HO%``J(!0`+5`!`+G_>`WB(!0`,5`"`
+M'G_>`WB(!0`-5`#`#G_>`WA_WEIXB`4`#U0`0"Z))0`.?!M+>'][6GA7>P0^
+MB^4`$(@%`!%4`$`N?_\#>(@%`!)4`(`>?_\#>(@%`!-4`,`.?_\#>'__6GB@
+M!0`"*```#4&!``A7_P8^5STH-#^]``$XG8@`?X/C>'U%4WA(```!.)V(!'^#
+MXWA_1=-X2````3B=B`A_@^-X?\7S>$@```$XG8@,?X/C>']EVWA(```!.)V(
+M$'^#XWA_Y?MX2````3N]B!1_@^-X?Z3K>'[ENWA(```!?X/C>'\DRWA_!<-X
+M2````8`!`#Q\"`.F@N$`%(,!`!B#(0`<@T$`((-A`"2#@0`H@Z$`+(/!`#"#
+MX0`T."$`.$Z``""4(?_X?`@"II`!``PY(RPL?(,C>'TD2W@XH``&2````8`!
+M``Q\"`.F."$`"$Z``""4(?_X?`@"II`!``PX8RPL.*``!D@```$X8``!@`$`
+M#'P(`Z8X(0`(3H``()0A__A\"`*FD`$`#'R#(W@\@```.(0``#B@``9(```!
+M@`$`#'P(`Z8X(0`(3H``(#A@``!.@``@E"'_Z'P(`J:3P0`0D^$`%)`!`!Q\
+M?QMX?(`C>'R^*W@X@&``?`4#>$@```%_X_MX.(!@"#B@``%(```!?^/[>#B`
+M8`PXH``#.,```D@```$X````+`,``$&B`!A_X_MX.(!@!$@```&P?@``.```
+M`7P#`WB``0`<?`@#IH/!`!"#X0`4."$`&$Z``"!\:1MXH`,""#A@``Q\`"``
+M08(`(*`)$G)P"0"`?&``)E1C'_Y\8P#05&,`.#AC``LL!0``08(`")!E```X
+M8```3H``(#D@``"@`Q*&+````$&"`!@Y(``!H`,2=BP```!`@@`(.2``0Z`#
+M$HHL````08(`"&$I``1](TMX3H``()0A_]A\"`*FDV$`%).!`!B3H0`<D`$`
+M+'Q\&WBCHQ)(5[OW?E>]__Y_9-MX2````7^#XW@X@```8(28`$@```%@92``
+M?X/C>#B```!@A)@`2````7^#XWA_9-MX2````7QEZG@Q)?__?`DI$'P%`WA_
+M@^-X?V3;>$@```&``0`L?`@#IH-A`!2#@0`8@Z$`'#@A`"A.@``@E"'_Z'P(
+M`J:3@0`(DZ$`#)`!`!Q\?!MX?)TC>#B`0!1(```!5[T(/#@```-\`.@P?&4#
+M>'^#XW@X@$`42````3A@``&``0`<?`@#IH.!``B#H0`,."$`&$Z``""4(?_H
+M?`@"II.!``B3H0`,D`$`''Q\&WA\G2-X.(!`%$@```%7O0@\.````WP`Z#!\
+M90!X?X/C>#B`0!1(```!.&```8`!`!Q\"`.F@X$`"(.A``PX(0`83H``()0A
+M_]A\"`*FDV$`%).!`!B3H0`<D`$`+'Q[&WA\G"-X?+TK>#B`0!A(```!.`#_
+M_EP`X#Y\90`X5[T'_G^]X#!\I>MX?V/;>#B`0!A(```!.&```8`!`"Q\"`.F
+M@V$`%(.!`!B#H0`<."$`*$Z``""4(?_H?`@"II/A`!20`0`<?)\C>#@`__\H
+M!``%08$`&#B`0!Q(```!<&,`+WQC_#!48`?^?`,#>(`!`!Q\"`.F@^$`%#@A
+M`!A.@``@E"'_Z'P(`J:3H0`,D^$`%)`!`!Q\?QMX?+TK>#B`0!1(```!/`#_
+M_F``?_Q\90`X8*6``"P=``!!@@`(9*4``7_C^W@X@$`42````8"?+#ADA`$`
+M?^/[>$@```&``0`<?`@#IH.A``R#X0`4."$`&$Z``""4(?_H?`@"II.!``B3
+MH0`,D`$`''Q\&WA\G2-X.(!`$$@```$\`/_Q8`#_GWQE`#A7O1;Z/2```#DI
+M``!\'4@N?*4#>'^#XW@X@$`02````8`!`!Q\"`.F@X$`"(.A``PX(0`83H``
+M()0A_^A\"`*FDX$`").A``R0`0`<?'T;>'R\*W@X8RPR.*``!D@```&(O2PR
+MB!TL,U0`0"Y\I0-XB!TL-%0`@!Y\I0-XB!TL-50`P`Y\I0-X?Z/K>#B```!@
+MA(`(2````8B]+#=4I4`NB!TL-GRE`WA7G(">?*7C>'^CZW@X@```8(2`#$@`
+M``&``0`<?`@#IH.!``B#H0`,."$`&$Z``""4(?_8?`@"II-A`!23@0`8DZ$`
+M')`!`"Q\?!MX.(```&"$@$Q(```!?'L;>'^#XW@X@```8(2`4$@```%\?1MX
+M?X/C>#B```!@A(!,2````7P;&!!\``$0?`#H$#E```!\9!MX.&```'P+&WA]
+M3"-X?6-;>'V$8WB``0`L?`@#IH-A`!2#@0`8@Z$`'#@A`"A.@``@E"'_^'P(
+M`J:0`0`,.(```&"$@$Q(```!@`$`#'P(`Z8X(0`(3H``()0A_^A\"`*FDZ$`
+M#)`!`!Q\?1MX.(```&"$@"!(```!9&4!`'^CZW@X@```8(2`($@```&``0`<
+M?`@#IH.A``PX(0`83H``()0A_^A\"`*FDZ$`#)/!`!"3X0`4D`$`''Q^&W@X
+M@```8(289$@```%4?VW^<^`!`$&"``QK_P'_?__X^'_#\W@X@```8(2`4$@`
+M``%\?1MX?\/S>#B```!@A(!,2````7^]&GA_O?IX?Z/K>(`!`!Q\"`.F@Z$`
+M#(/!`!"#X0`4."$`&$Z``""4(?_H?`@"II/A`!20`0`<?'\;>#B`0"!(```!
+M5&,&/E1IX3Y48P<^.6```(`?`<Q\`$@`0*(`%*`?`=!\`!@`0*(`"#E@``%]
+M8UMX@`$`''P(`Z:#X0`4."$`&$Z``""4(?_H?`@"II.!``B3H0`,D`$`''Q\
+M&WA\G2-X.(```&"$@)!(```!@!T``'QC`A20?0``?X/C>#B```!@A(",2```
+M`8`=``1\8P(4D'T`!'^#XW@X@```8(2`E$@```&`'0`,?&,"%)!]``Q_@^-X
+M.(```&"$@(A(```!@!T`"'QC`A20?0`(?X/C>#B```!@A("82````8`=`!!\
+M8P(4D'T`$(`!`!Q\"`.F@X$`"(.A``PX(0`83H``()0A_^A\"`*FDZ$`#)/!
+M`!"3X0`4D`$`''Q^&WA\GR-X?'T;>"@$``A`H0`8.(```&"$__](```!?!\8
+M0$"!`!"3_2[4.&```$@``"A_P_-X?^3[>$@```%\91MX?\/S>#B`$'!(```!
+MD_XNU#A@``&``0`<?`@#IH.A``R#P0`0@^$`%#@A`!A.@``@E"'_Z'P(`J:3
+MH0`,D`$`''Q]&W@X@!!P2````51D!#Y_H^MX2````8`!`!Q\"`.F@Z$`##@A
+M`!A.@``@E"'_Z'P(`J:3@0`(DZ$`#)/!`!"3X0`4D`$`''Q_&WA\GB-X.(`?
+M_T@```%\'AA`0($`%#@`__^0'R[8.&```$@``$A_X_MX.(```&"$@!1(```!
+M5'T`)'_C^WA_Q/-X2````51C!/Y_O1MX?^/[>#B```!@A(`4?Z7K>$@```&3
+MWR[8.&```8`!`!Q\"`.F@X$`"(.A``R#P0`0@^$`%#@A`!A.@``@E"'_Z'P(
+M`J:3H0`,D`$`''Q]&W@X@```8(2`%$@```%49`3^?Z/K>$@```&``0`<?`@#
+MIH.A``PX(0`83H``((AC+LAH8P`!5&,'_DZ``""4(?_H?`@"II/!`!"3X0`4
+MD`$`''Q_&WA\?AMX+`0``$&"`#`X@```8(2`!$@```%490(,?^/[>#B```!@
+MA(`$2````8`?+LA4``(,2```+#B```!@A(`$2````61E`0!_X_MX.(```&"$
+M@`1(```!@!\NR&0``0"0'B[(.&```8`!`!Q\"`.F@\$`$(/A`!0X(0`83H``
+M()0A_^A\"`*FDX$`").A``R3P0`0D^$`%)`!`!Q\?QMX?)XC>#B`'_](```!
+M?!X80$"!`!0X`/__D!\NW#A@``!(``!(?^/[>#B```!@A(`42````51]!`1_
+MX_MX?\3S>$@```%48X#>?[T;>'_C^W@X@```8(2`%'^EZWA(```!D]\NW#A@
+M``&``0`<?`@#IH.!``B#H0`,@\$`$(/A`!0X(0`83H``()0A_^A\"`*FDZ$`
+M#)`!`!Q\?1MX.(```&"$@!1(```!5&2$_G^CZWA(```!@`$`''P(`Z:#H0`,
+M."$`&$Z``"`X8``!3H``($Z``"`X8```3H``($Z``"!.@``@E"'_^'P(`J:0
+M`0`,.(```&"$G!Q(```!5&,&/H`!``Q\"`.F."$`"$Z``""4(?_X?`@"II`!
+M``PX@```8(2`6$@```%48P=^@`$`#'P(`Z8X(0`(3H``()0A__A\"`*FD`$`
+M#%2%!WXX@```8(2`6$@```&``0`,?`@#IC@A``A.@``@@&,NK$Z``""4(?_X
+M?`@"II`!``R`HQ(T+`4``$"B`!"0@RZL.&```4@```A(```!@`$`#'P(`Z8X
+M(0`(3H``()0A__A\"`*FD`$`#"P$``%`@@`@*`4``4"!`!`X8``-+`4`!4""
+M`!`X8```2```"$@```&``0`,?`@#IC@A``A.@``@E"'_^'P(`J:0`0`,+`0`
+M"T"B`"!4Q0=\D*,!^#B```!@A(!(2````3A@``%(```(2````8`!``Q\"`.F
+M."$`"$Z``""4(?_X?`@"II`!``Q(```!,2/__WP)&1!\`P-X@`$`#'P(`Z8X
+M(0`(3H``()0A_^A\"`*FD\$`$)/A`!20`0`<?'\;>"P$``!!@@!T.(!`!$@`
+M``%4900:?^/[>#B`0`1(```!.&``"D@```$[P``*?^/[>#B`0!!(```!=&``
+M`4&"`#`X8`#(2````7_C^W@X@$`$2````51E!!I_X_MX.(!`!$@```$WWO__
+M0(+_Q#A@```L'@``08(`+'_C^W@X@```8(2`!$@```%490.8?^/[>#B```!@
+MA(`$2````3A@``&``0`<?`@#IH/!`!"#X0`4."$`&$Z``""4(?_H?`@"II.A
+M``R3X0`4D`$`''Q_&WA\G2-X.(```&"$@`1(```!9&4`!'_C^W@X@```8(2`
+M!$@```$L'0``0:(`('_C^W@X@$`$2````51E!!I_X_MX.(!`!$@```&``0`<
+M?`@#IH.A``R#X0`4."$`&$Z``""4(?_H?`@"II.A``R3X0`4D`$`''Q_&WA\
+MG2-X.(```&"$@`1(```!9&4`!'_C^W@X@```8(2`!$@```$L'0``0:(`('_C
+M^W@X@$`$2````51E!!I_X_MX.(!`!$@```&``0`<?`@#IH.A``R#X0`4."$`
+M&$Z``""4(?_H?`@"II.A``R3P0`0D^$`%)`!`!Q\GR-X?*0K>'Q^&W@[H``!
+M+!\``4&"`"0H'P`!08``$"P?``)!@@`<2```($O__?U\?1MX2```'$O__L%(
+M```42___,4@```PX8```2```#)/^+JA_H^MX@`$`''P(`Z:#H0`,@\$`$(/A
+M`!0X(0`83H``()0A__A\"`*FD`$`##B`0`1(```!5&.'OH`!``Q\"`.F."$`
+M"$Z``""4(?_H?`@"II/A`!20`0`<+`0``D&"`#PH!``"08$`$"P$``%!@@`4
+M2```-"P$``1!@@`42```*#T@```[Z0``2```)#T@```[Z0``2```&#T@```[
+MZ0``2```##A@``!(```0?^3[>$@```%_X_MX@`$`''P(`Z:#X0`4."$`&$Z`
+M`""4(?_X?`@"II`!``PX@``,2````8`!``Q\"`.F."$`"$Z``""4(?_X?`@"
+MII`!``Q\A2-X.(``#$@```&``0`,?`@#IC@A``A.@``@E"'_^'P(`J:0`0`,
+M.(``"#B@``1(```!@`$`#'P(`Z8X(0`(3H``()0A_^A\"`*FDZ$`#)`!`!Q\
+M?1MX.(``"#B@`"!(```!?Z/K>#B```@XH``$.,```$@```$Q(___?`D9$'P#
+M`WB``0`<?`@#IH.A``PX(0`83H``()0A_^A\"`*FDZ$`#)`!`!Q\?1MX.(``
+M`&"$@$A(```!5&4&\G^CZW@X@```8(2`2$@```&``0`<?`@#IH.A``PX(0`8
+M3H``()0A_^A\"`*FDZ$`#)`!`!Q\?1MX.(```&"$@$A(```!8&4`('^CZW@X
+M@```8(2`2$@```&``0`<?`@#IH.A``PX(0`83H``()0A_^A\"`*FDX$`").A
+M``R0`0`<?'T;>'R`(WA\O"MX.(```&"$@$!\!0-X2````7^CZW@X@```8(2`
+M1'^%XWA(```!@`$`''P(`Z:#@0`(@Z$`##@A`!A.@``@E"'_Z'P(`J:3P0`0
+MD^$`%)`!`!Q\?AMX?)\C>#A@```H!``_08$`;"@$`!]`@0`T?\/S>#B```!@
+MA(!$2````3@?_^`XH/_^7*4`/GQE*#A_P_-X.(```&"$@$1(```L?\/S>#B`
+M``!@A(!`2````3B@__Y<I?@^?&4H.'_#\W@X@```8(2`0$@```$X8``!@`$`
+M''P(`Z:#P0`0@^$`%#@A`!A.@``@E"'_Z'P(`J:3P0`0D^$`%)`!`!Q\?AMX
+M?)\C>#A@```H!``_08$`;"@$`!]`@0`T?\/S>#B```!@A(!$2````3@?_^`X
+MH``!?*4`,'QE*WA_P_-X.(```&"$@$1(```L?\/S>#B```!@A(!`2````3B@
+M``%\I?@P?&4K>'_#\W@X@```8(2`0$@```$X8``!@`$`''P(`Z:#P0`0@^$`
+M%#@A`!A.@``@E"'_^'P(`J:0`0`,.(```&"$@#Q(```!@`$`#'P(`Z8X(0`(
+M3H``()0A__A\"`*FD`$`#'R%(W@X@```8(2`/$@```&``0`,?`@#IC@A``A.
+M@``@.````)`$``A4H`4^D`0`##A@``!\`"@`3*(`('#``"!!@@`0@`0`#&``
+M(`"0!``,.````)`$`!20!``0.&```4Z``""4(?_H?`@"II.A``R3P0`0D^$`
+M%)`!`!Q\O2MX?3]+>'R>(WB`!``4.2``#W`+``%!@@#D@`8`%'`)``%`H@`8
+M.(``#$@```$Y(``/?`/H`$&"`,2@'@`25``%/K`?``"`'@`45`",_K`?``(X
+M````F!\`!(`>`!1P"0`"0((`2'`+``1!@@`,.````4@``!B`'@`4<`D`$$&"
+M`!2('P`$8```")@?``1(```<B!\`!&````*8'P`$@!X`%%0`WWZ8'P`%@!X`
+M$%0`;CZ8'P`&@!X`%'`+`0!!@@`,5`"^OD@```@X`/__F!\`!X`>`!!4`(\^
+MF!\`"(`>`!!4`"]^F!\`"8`>`!!4`*?^F!\`"CD@``!](TMX@`$`''P(`Z:#
+MH0`,@\$`$(/A`!0X(0`83H``()0A_WA\"`*FD<$`0)'A`$22`0!(DB$`3))!
+M`%"280!4DH$`6)*A`%R2P0!@DN$`9),!`&B3(0!LDT$`<)-A`'23@0!XDZ$`
+M?)/!`("3X0"$D`$`C'Q^&WA\ER-X?+LK>'S8,WA\\SMX?'H;>#K````[@```
+M.B```#H```"@!0`"<`D!`$&"``QP"0"`2```%*`%``)4`,G^:````7`)``%`
+M@@!LH!L``G`)`"!!@@`,<`D`0$@``!2@&P`"5`#1OF@```%P"0`!0((`1'_#
+M\WA_9-MX2````7QT&W@Y(``,+`,``$&""2`L%P`&08(`*"@7``9!@0`0*!<`
+M`4&!`!!(```4+!<`"$&"``PY(``,2``(]"P8``!!H@"8?\/S>#B```!@A(!,
+M2````7QQ&WA_P_-X.(```&"$@%!(```!?'`;>(`>`<P[X```.R$`""@```-`
+MH0`8?\/S>#B`$4!(```!D&$`"$@``"17_1`Z.)T10'_#\WA(```!?'W)+CO_
+M``$H'P`)0('_Y(@4``1P"0`"0((`#%0``#R8%``$H!0``K`;``*(%``$F!L`
+M!'_#\W@X@```8(2`6$@```%\<AMX+`,``$""``@Z0``!?\/S>#B```!@A(`$
+M2````51Y`8Q_P_-X.(!`$$@```$\``#^8```8'QU`#A_P_-X.(!`%$@```%\
+M;QMX?\/S>#B`0!A(```!?&X;>*";``)_P_-X2````3D@``,L`P``08('U*`;
+M``)4``7V+```P$&"`$1!@0`0+```H$&"`#!(```\+``!0$&"`!`L``%008(`
+M$$@``"@ZP``!2```"#K```([@``!2```%#K```-(```(.L``!#N```*`'@',
+M*````T"!`!A_P_-X.(```&"$F``XH``'2```%'_#\W@X@```8(28`#B@`$=(
+M```!@!X!S"@```-`@0#,H3L``G$@`(!!@@"(H!H2<"@`,`!`@0!\<2``($&"
+M`!"C^A-LH[H3<$@```RC^A-NH[H3<G_C^W@X@``#2````7Q_&WA_H^MX.(``
+M`T@```%7BA`Z/2```#DI``!]2DH4@`H!+%0`!JY7Z38R?`!+>)`*`2R!*@$X
+M52D`-E?@]_Y4:P\\?`!;>'TI`WB1*@$X.^```#T@```[J0``'!\`#'R=`"X<
+M'P`#?`#B%%0`$#I\O0`N?\/S>$@```$[_P`!*!\`&T"!_]A_P_-X?V3;>$@`
+M$+4[X```/2```#NI```<'P`4?)T`+AP?``5\`+(45``0.GR]`"Y_P_-X2```
+M`3O_``$H'P`B0('_V#O@```](```.ZD``!P?``Q\G0`N'!\``WP`XA14`!`Z
+M?+T`+G_#\WA(```!._\``2@?`#]`@?_8.^```#T@```[B0``+!@``'^@`"97
+MX!@X?)P`+G^H`2!!@@`0.`2``"@`#_]`@0`85^D8.'TIXA2`J0`$?\/S>$@`
+M``$[_P`!*!\`JD"!_\B`'@',*````T&A`'1_P_-X.(```&"$@!Q(```!5&4#
+M/F2E`=!_P_-X.(```&"$@!Q(```!?\/S>#B``%PXH```2````7_#\W@X@```
+M8(28>#B@``A(```!?\/S>#B```!@A(!(2````6!E!`!_P_-X.(```&"$@$A(
+M```!+!@``$&B`'1_P_-X.(```&"$@$Q^)8MX2````7_#\W@X@```8(2`4'X%
+M@WA(```!@!X!S#O@```[H0`(*````T"A`!A_P_-X.(`10("A``A(```!2```
+M)%?I$#HXB1%`?*GH+G_#\WA(```!._\``2@?``E`@?_DB+HL+(@:+"U4`$`N
+M?*4#>(@:+"Y4`(`>?*4#>(@:+"]4`,`.?*4#>'_#\W@X@```8(2``$@```&(
+MNBPQ5*5`+H@:+#!\I0-X?*7+>'_#\W@X@```8(2`!$@```%_P_-X?N2[>$@`
+M*(5_P_-X.(!`$$@```%\9:MX?\/S>#B`0!!(```!?\/S>#B`0!1]Y7MX2```
+M`7_#\W@X@$`8?<5S>$@```%_P_-X.(```&"$@%A^19-X2````8BZ+#*(&BPS
+M5`!`+GRE`WB(&BPT5`"`'GRE`WB(&BPU5`#`#GRE`WA_P_-X.(```&"$@`A(
+M```!B+HL-U2E0"Z(&BPV?*4#>'_#\W@X@```8(2`#$@```%_P_-X.(```&"$
+M@!B`NB[02````7_#\W@X@`"`.*#__T@```&`'@',+```!$"B`"R@'@'0*```
+M`4&A`"!_P_-X.(``%$@```%@900`?\/S>#B``!1(```!?\/S>']DVWA(```!
+M.2```RP#``!!@@,T+!<`!D&"`$"`'@($<`D``T&B`#1_P_-X.(```&"$F41(
+M```!5&4`PH`>`@14`.B$?*4#>'_#\W@X@```8(291$@```%_P_-X?V3;>$@`
+M$4%_P_-X?H2C>$@`"(4Y(``#+`,``$&"`LR@'@'(.2```&$I\1M\`$@`0*(`
+M)*`;``)P"0"`0:(`&'_#\W@X@```8(38"#B@!0)(```!?\/S>#B```!@A)@<
+M.*```4@```%_P_-X.(```&"$F11(```!5&,$OJ`;``(](,S,82G,S7TC2!95
+M)>C^<`D`($&"`!A4:1`Z/`"Z+F``BZ-]*0`6527A/CAE`&1(```!?\/S>#B`
+M``!@A)A@2````6!E``%_P_-X.(```&"$F&!(```!?\/S>#B```!@A)A@.*``
+M`3C```!(```!?\/S>'Z$HWA(```!+`,``$"B`""@&P`"<`D`($""``Q@```"
+ML!L``CD@``-(``',@!HNL"P```!!H@`D?\/S>#B```!@A)D@/*```6"E\`!(
+M```!.````9`:+K0[X```.Z```5?D$#HXA!``?Z7X,'_#\WA(```!._\``2P?
+M``E`@?_D.^```'_#\WA_Y/MX2````3O_``$L'P`)0('_['_#\W@X@`"D/*``
+M`6"E``%(```!?\/S>#B``*@XH``!2````7_#\W@X@`"L.*```4@```%_P_-X
+M.(`0L$@```%\91MX?\/S>#B`$+!(```!?\/S>#B``*`\H``(8*4)94@```$\
+M```(8``)99`:+#A_P_-X.(``K$@```%D90`'?\/S>#B``*Q(```!+!<`!D"B
+M`"Q_P_-X.(``H$@```%@91``?\/S>#B``*!(```!@!HL.&``$`"0&BPX@!X2
+M3"P```!!H@`,?\/S>$@```%_P_-X.(```&"$@"!(```!5&4"3'_#\W@X@```
+M8(2`($@```&`FB[4+`3__T&"``Q_P_-X2````8":+M@L!/__08(`#'_#\WA(
+M```!@)HNW"P$__]!@@`,?\/S>$@```&`O@'X+`4``$&B`!1_P_-X.(```&"$
+M@$A(```!DOX!W#A@``%(```8@!,``"P```!!@@`(D3,``#A@``"``0",?`@#
+MIH'!`$"!X0!$@@$`2((A`$R"00!0@F$`5(*!`%B"H0!<@L$`8(+A`&2#`0!H
+M@R$`;(-!`'"#80!T@X$`>(.A`'R#P0"`@^$`A#@A`(A.@``@E"'_^'P(`J:0
+M`0`,.(```D@`!$F``0`,?`@#IC@A``A.@``@E"'_Z'P(`J:3X0`4D`$`''Q_
+M&W@X@```.*```4@```$X````+`,``$&B`"A_X_MX.(``$T@`!`$X````+`,`
+M`$&B`!`X8`@T2````3@```%\`P-X@`$`''P(`Z:#X0`4."$`&$Z``""4(?_H
+M?`@"II/!`!"3X0`4D`$`''Q_&WA\GB-X.(```#B@``%(```!.````"P#``!!
+M@@&<5\`%]BP``,!!@@"(08$`&"P``*!!@@`T+```L$&"`"Q(``$L+``!0$&"
+M`+A!@0`0+```T$&"`%Q(``$4+``!4$&"`*!(``$(?^/[>#B```!@A)@$.*``
+M`$@```%_X_MX.(```&"$H@`XH``#2````7_C^W@X@```8(28?#B@`!E(```!
+M.&`!+$@```%(``#`?^/[>#B```!@A)@$.*```$@```&@'P'(+```$D"B`*!_
+MX_MX.(```&"$F'PXH``82````3A@`2Q(```!?^/[>#B```!@A*(`.*```D@`
+M`&QSP``008(`&'_C^W@X@```8(28!#B@``-(```4?^/[>#B```!@A)@$.*``
+M`$@```&@'P'(+```$D"B`#1_X_MX.(```&"$F'PXH``82````3A@`2Q(```!
+M?^/[>#B```!@A*(`.*```$@```%_X_MX.(``$T@``D4X````+`,``$&B`#@X
+M8`@T2````7_C^W@X@```.*```4@```$X````+`,``$&B`!1_X_MX.(```$@`
+M`@E\8!MX?`,#>(`!`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A_]A\"`*FDR$`
+M#)-!`!"380`4DX$`&).A`!R3P0`@D^$`))`!`"Q\?QMX?)HC>'RY*WA\>QMX
+M2````7Q^&W@X8```+!X``$&"`7"`'RZT+````$&B`,Q_X_MX.(```&"$F2!(
+M```!=&,``4"B`+20?RZT?^/[>#B```!@A)P02````7Q\&WA_X_MX.(```&"$
+MG!1(```!?'T;>'_C^W@X@```8(2<&$@```%\:AMX5X#X?E>I^'Y\`$H45`O)
+M_E>CT;XP"___?2!9$#$#__]\"!D0?2@`.4&B`$A_J@#0?[U;UE>]!KY_G!O6
+M5YP&_G_C^W@X@```8(29($@```%7O2@T?&7K>'REXWA@I0@`?^/[>#B```!@
+MA)D@2````7_C^WA_Q/-X2``$32P#``!`@@`@H!H``F````*P&@`"H!X``E0`
+M!_JP'@`"2```2'_C^WA_Q/-X2````2P#``!`@@`\.&`3B$@```%_X_MX?\3S
+M>$@```$L`P``0((`(*`:``)P"``@0((`#&````*P&@`".&```$@``"!_X_MX
+M2``<F8`;+K0A````?`@!%)`9```X8``!@`$`+'P(`Z:#(0`,@T$`$(-A`!2#
+M@0`8@Z$`'(/!`""#X0`D."$`*$Z``""4(?_@?`@"II.A`!23P0`8D^$`')`!
+M`"1\?AMX?)\C>'R`(W@L!```0((`"#@`__^0`0`(?\/S>#B```Q(```!?\/S
+M>#B`0`!_Y?MX2````3A@``](```!5_\'OH`!``A4``>^D`$`"'_#\W@X@$``
+M?`4#>'_F^WA(```!?'T;>'/@``%`H@!$.```%9`!``B(H0`(.2$`"(@)``%4
+M`$`N?*4#>(@)``)4`(`>?*4#>(@)``-4`,`.?*4#>'_#\W@X@``42````7^C
+MZWB``0`D?`@#IH.A`!2#P0`8@^$`'#@A`"!.@``@E"'_Z'P(`J:3@0`(DZ$`
+M#)/!`!"3X0`4D`$`''Q\&WA\GB-XH(0``*"^``)(```!?'T'-*`>``([X```
+M?Z/K>'`)`(!!H@`T'[T`##T@```Y*0#D?[U*%(!]``0X@``(2````51_+/2`
+M'0``5``@-G__`WBH?0`(+`,`D$&!``QP8``!08(`'#AC_^@X@``(2````51]
+M!CXX```!2```(#AC_^A\8PYP?&,!E#B```A(```!5'T&/C@```!7O1`Z5``(
+M/'^]`WACO00!5^5$+E>@!CY\I0-X?X/C>#B```!@A)B<2````5?E!"Y7H,8^
+M?*4#>'^#XW@X@```8(28T$@```&3W!(T.&```8`!`!Q\"`.F@X$`"(.A``R#
+MP0`0@^$`%#@A`!A.@``@E"'_^'P(`J:0`0`,.(```&"$F&1(```!5&-M_G!@
+M`0!!@@`,:&`!_WP#`/B``0`,?`@#IC@A``A.@``@E"'_Z'P(`J:3@0`(DZ$`
+M#)/!`!"3X0`4D`$`''Q_&WA\GB-X?+TK>#B```!@A)AD2````51E`"97P$TL
+M?*4#>%>]!?Y\I>MX?^/[>#B```!@A)AD2````7_C^W@X@```8(288$@```%@
+M90`"?^/[>#B```!@A)A@2````3N``#@L'@``08(`"!^>#@`[H```?^/[>#B`
+M``!@A)A@2````7!@``)!@@`8?X/C>$@```$[O0`!+!T`.T"!_]@X8```+!T`
+M.T&A``Q_X_MX2__^^8`!`!Q\"`.F@X$`"(.A``R#P0`0@^$`%#@A`!A.@``@
+MH`0``E0`!?0L``#`08(`+$&!`!`L``"@08(`&$@``"PL``%`0*(`)*`#$LQ(
+M```0H`,2SD@```B@`Q+0L`4``#A@``%.@``@.&```$Z``""4(?_@?`@"II/!
+M`!B3X0`<D`$`)'Q^&WA\GR-X.*$`"$O__Y$X````+`,``$&B`%!_P_-X.(``
+M`&"$F&!(```!?\/S>$O__D&H`0`(?``8`$"``!"@'P`"8````K`?``*P?P`6
+M.2```:@!``A\`!@`0(``"#D@``!]($MX?`,#>(`!`"1\"`.F@\$`&(/A`!PX
+M(0`@3H``()0A_]!\"`*FDV$`').!`""3H0`DD\$`*)/A`"R0`0`T?'\;>'R=
+M(WB``P',*````T&!`(!(```!+`,``$&B`'1_X_MX?Z3K>#BA``A+__[-.```
+M`"P#``!!@@"`.\```#T@```[B0``.V```'R<\*Y_X_MX.*```$O__;&H`0`(
+M?``8`$"```RS?0`62```"+!]`!8[W@`!(!X``S@```!\``$4*!X``D&!`#!+
+M___`?^/[>#B```!@A)A@2````6!E``)_X_MX.(```&"$F&!(```!.````7P#
+M`WB``0`T?`@#IH-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`,$Z``"`Y0```H60`
+M`#T@``"@"0``?`L`0$&!`!PY*0``.4H``55`$#I\"0(N?`L`0$"!__!52Q`Z
+M/2```#DI``!]:TH4J`L``CQ@555@8U56?&`8EGP`_G!\8!A0?&,'-$Z``""4
+M(?_(?`@"II+!`!"2X0`4DP$`&),A`!R300`@DV$`)).!`"B3H0`LD\$`,)/A
+M`#20`0`\?'@;>'Q^&WB@!``"<`D`@'_@`"97_Q_^(_\``E0`!?0L``#`08(!
+M%$&!`!`L``"@08(`[$@``2`L``%`0*(!&*$D```Y*?!?*`D$ZD&!`!"C(Q-4
+MHL,35D@``%BA)```.2GK="@)`.]!@0`0HR,36*+#$UI(```\H20``#DIZH0H
+M"0#@08$`$*,C$URBPQ->2```(*`$```ZP```.R```"@`%EQ`@0`,HR,38*+#
+M$V*C?A+8HOX2WB`7``!_0+D45^L0.CT@```Y*0``?6M*%($K`#Q5*0$$H!X3
+MS%0`X`9]*0-XD2L`/($K`$A5*0&(H!X3SE0`T`I]*0-XD2L`2($K`/Q5*0=V
+MH!X3RE0`&#A]*0-XD2L`_$@``$2C(Q-DHL,39J-C$MJBXQ+@(3<``'])N11(
+M```HHR,3:*+#$VJC8Q+<HN,2XB`7``!_0+D42```##A@``!(``$,5_P0.CT@
+M```Y*0``?YQ*%(.\`(17O0:N?V/;>#B```1(```!5T`P,E1C/C!\8P-X?[T;
+M>).\`(2#O`"05[T`.']CVW@X@``$2````51C_WY_O1MXD[P`D%>]!FY_(\MX
+M.(```T@```%48SXP?[T;>).\`)"#O`"<5[T`.G\CRW@X@``#2````51C_[Y_
+MO1MXD[P`G%>]![1^P[-X.(```T@```%48Q;Z?[T;>).\`)R`'`#,5``'=E;I
+M'SA\`$MXD!P`S#N@```](```.XD``!P=``Q\G``N'!T``WP`^A14`!`Z?+P`
+M+G\#PWA(```!.[T``2@=`!A`@?_8.````)`>+L`X8``!@`$`/'P(`Z:"P0`0
+M@N$`%(,!`!B#(0`<@T$`((-A`"2#@0`H@Z$`+(/!`#"#X0`T."$`.$Z``""4
+M(?_H?`@"II/!`!"3X0`4D`$`''Q^&WA\:QMXH`4``E0`!?0L``#`08(`+$&!
+M`!`L``"@08(`&$@``+PY(```+``!0$&"`!1(``"L.2```4@```@Y(``"52D(
+M/'TI6A2@J1+JH`D2\%0`,#)\I0-XH`D2]E0`8"9\I0-XH`D2_%0`D!I\I0-X
+MH`D3`E0`P`Y\I0-XH^D3"*`)$PY4`#`R?_\#>*`)$Q14`&`F?_\#>*`)$QI4
+M`)`:?_\#>*`)$R!4`,`.?_\#>"P$``%!@@`8*`0``4&``"@L!``"08(`$$@`
+M`!1\ORMX2```%'_E^WA(```,.&```$@``#"0BRZL?\/S>#B```!@A)E@2```
+M`7_#\W@X@```8(299'_E^WA(```!.&```8`!`!Q\"`.F@\$`$(/A`!0X(0`8
+M3H``()0A_]A\"`*FDR$`#)-!`!"380`4DX$`&).A`!R3P0`@D^$`))`!`"Q\
+M?QMX?)HC>'Q^&WB@!``"5``%]"P``,!!@@!808$`$"P``*!!@@!$2```4"P`
+M`4!`H@!(.R```#B```!@A)E$2````51E!W*@'Q/05``>N'RE`WA_X_MX.(``
+M`&"$F41(```!2```'#L@``%(```4.R```D@```PX8```2``">(`?`<PH```#
+M08$`*'_C^W@X@```8(29$$@```%@90`#?^/[>#B```!@A)D02```;'_C^W@X
+M@```8(29$$@```$X`/P&?&4`.%<]"#Q_O?(4H!T2Y%0`(#9\I0-X8*4``7_C
+M^W@X@```8(29$$@```%_X_MX@)XNK']%TWA(```!H+T2S%2E!?Y@I0(`?^/[
+M>#B```!@A)EH2````7_C^W@X@```8(281$@```%4909B5ST(/'^]\A0[G1*@
+MH!P``E0`/+!\I0-X?^/[>#B```!@A)A$2````7_C^W@X@```8(282$@```%4
+M904:H!P`"%0`8Z9\I0-X?^/[>#B```!@A)A(2````7_C^W@X@```8(284$@`
+M``%490`>?3GR%(@)$LE4`$0N?*4#>(@)$L9\I0-X?^/[>#B```!@A)A02```
+M`3M]$K"@&P`*5`7`#E0`@!Y\I0-XH3T2P%4@0"Y\I0-X?*5+>'_C^W@X@```
+M8(28-$@```%_X_MX.(```&"$F"A(```!5&4&'J`<``Y4`$`N?*4#>'_C^W@X
+M@```8(28*$@```%_X_MX.(```&"$F&1(```!5&4%&*`;``14`&-F?*4#>'_C
+M^W@X@```8(289$@```$[H``"H!X2<"@`,`)!@0`DH!\!RBP`$")`H@!0H!H`
+M`G`)`$!!@@!$.Z``"$@``#RA.@``52D&_C%I__]\"TD0.2G_]B$I``Q]*4D0
+M?2D`T'P+2#E!@@`45RD(/'TI\A2@"1,F?[T"%'_C^W@X@```8(29)$@```%4
+M90?N5Z`(/'```/=\I0-X?^/[>#B```!@A)DD2````3A@``&``0`L?`@#IH,A
+M``R#00`0@V$`%(.!`!B#H0`<@\$`((/A`"0X(0`H3H``()0A__A\"`*FD`$`
+M#'R%(WA\@"-X*`0`/T"!``@X```_L`,!_#B```!@A)D\2````3A@``&``0`,
+M?`@#IC@A``A.@``@E"'_R'P(`J:300`@DV$`)).!`"B3H0`LD\$`,)/A`#20
+M`0`\?'T;>'R<(WA\?QMXH`0``E0`!?0L``#`08(`0$&!`!`L``"@08(`6$@`
+M`'@L``%`0*(`<*`#$^:P`0`,.`,3TI`!``@X`Q/HD`$`$*-#%TH[8Q=,2```
+M9*`#%?"P`0`,.`,5\I`!``@X`Q82D`$`$*-#%YP[8Q>>2```0*`#%?"P`0`,
+M.`,5^)`!``@X`Q:ND`$`$*-#%[P[8Q>^2```'#A@``!(``",56DP,GT_2A0[
+MR1?42```8*"\``!_H^MX.($`"$@``)4[P```?Z/K>'^$XWA(```!.6```*`?
+M$W1\'@``0(``,'P*`WA5:0@\?2GZ%*`)$W8L````08(`#'P`&`!!HO^D.6L`
+M`7P+4`!!@/_<5T8$/G^CZWA_Q/-X?V7;>'^'XWA(``0Y.&```8`!`#Q\"`.F
+M@T$`((-A`"2#@0`H@Z$`+(/!`#"#X0`T."$`.$Z``""4(?_(?`@"II+!`!"2
+MX0`4DP$`&),A`!R300`@DV$`)).!`"B3H0`LD\$`,)/A`#20`0`\?'<;>'R9
+M(WA\NBMX.L```#L``#\\8```.&,``#B``0A(```!/&```#AC```X@`"`2```
+M`3T@```[:0`(/2```#N)`(@[X``!.\```%?`"#Q_^P,N.!\``50?!#XX'@`!
+M5!X$/B@?`#]`@?_D/2```#DI``"SR0`&.````;`)``(X```_L`D`!#O```"@
+M"0`&*````$"!`#@](```.^D``%?="#Q\G=HN?T/3>'\ERWA(``A!?'WC+C@>
+M``%4'@0^H!\`!GP`\$!!@?_8J7P``#T@``"@"0`&5`D(/'TIXA2HZ?_^.\``
+M`"@```!`@0!L/2```#C)``!7P`@\?!P"KGP`6`!!@0`,?`L#>'_6\WBA)@`&
+M?3Y(4#DI__]Q/___08(`.%?@"#Q]`.(4J2C__GU<`BY]0`<T?`D``$"!``BQ
+M2/_^.!X``50>!#Z@!@`&?`#P0$&!_Z0[P```/2```*`)``8H````0($`,'P)
+M`WA7P`@\?!P"KGP`.`!`@0`,?`<#>'_8\W@X'@`!5!X$/GP)\$!!@?_<.6L`
+M&3T@4>MA*84??`M(EGP`)G!]:_YP?`L`4!P``#)\'0<T.\```'T]2)9]*29P
+M?Z#^<'P+`WA]($A0.^```#0)``%`@0!(/2```#E)```](%'K82F%'WT]2)9]
+M*29P?2M(4#EI``%_P/-X.3X``54^!#Y4``@\?LH#+C@?``%4'P0^?!]8`$&`
+M_^`[X```/2```*$I``95*0@\?2GB%*@)__Y\`.@`0($`T#T@```[20``.!T`
+M,GP=!S2A.@`&52D(/'TIXA2H"?_^?X#H`$@```PX'P`!5!\$/D"=`"17X`@\
+M?6#B%'T\`JY]*>A0J`L``GP`Z%!]:0'708'_V%>C!#Y7X`@\?2#B%'R<`BZ@
+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
+M@0`.H*$`$*#!`!:@X0`8?\/S>#D```!(``$A?'L;>*!A``R@@0`2?^7[>'^&
+MXWA(``!YH&$`#*"!`!1_Y?MX?Z;K>$@``&6@@0`2H*$`%*#!`!:@X0`8?\/S
+M>#D```!(``#9?&<;>*"!``J@H0`,?T/3>']FVW@Y````2```O8`!`$1\"`.F
+M@T$`*(-A`"R#@0`P@Z$`-(/!`#B#X0`\."$`0$Z``""!10`(.0```*`%``0H
+M````0($`>*`*``!\`!@`0*(`5#EJ``@Y(```H`H`!B@```!`@0!`H`L``'P`
+M(`!`H@`<52D(/'TI4A2@"0`>L`8``#A@``%.@``@.6L``C@)``%4"00^H`H`
+M!GP`2$!!@?_(.4H`-#@(``%4"`0^H`4`!'P`0$!!@?^0.&```$Z``"!\8!MX
+M.6``9#A@``!])CG738(`("P(``!!@@`(.6```7P%(`!!@@!D?`0`4!P``&1]
+M)"A0?`!+UGP`!S5`H``0?,DS>!P&`&1(```4+```9$"!`!Q\Z3MX'`<`9%0#
+M!#XL"```3((`($@``!A](#G6(```9'P`,=9]*0(4?2E;UE4C!#Y.@``@?,,S
+M>"P(``!-@@`@'`8`9%0#!#Y.@``@5*D(/'TI(A2A:?_^'&,`9*`$```=(`!D
+M.2G_]GP#2$!`@``0L`8``*`$``!(```H'2L`9#DI``I\`TA`0($`,+%F``"Q
+M9P``3H``(+`&``!\"B(NL`<``$Z``"!\!`(NL`8``*`*``)+___L.6```'P+
+M*`!,@``@56H(/'P*(BX=(`!D?2-(4#DI``DH"0`20*'_O'U`4WA]2B(4H2H`
+M`ATI`&0Y*?_V?`-(0$&@_[`Y:P`!?`LH`$R``"!+__^\E"'_^'P(`J:0`0`,
+M@24`"#E@``"@!0`$?`H#>'P+``!`@``@H`D``'P`(`!!@@`4.2D`-#EK``%\
+M"U``08#_Z#B)``B@J0`&2__^^8`!``Q\"`.F."$`"$Z``"`Y8RP0/2```(`)
+M``20`RP0'```'#T@```Y*0`(?`!*%)`+`!@X```!D`L`%#@``!20"P`,.```
+M(Y`+`!!.@``@@2,2-*`)``)P"0`@08(`(#D@```Y8``<.0``0#E``'*1)``,
+M.```=T@``"`Y(```.6``,CD````Y0``R.```%)`$``PX```CD`0`$("$``0X
+M8```?`D@$'P``1!\``#0?218$'TI21!]*0#0?`M+>4V"`"!\""`0?``!$'P`
+M`-!])%`0?2E)$'TI`-!\"TMY38(`(#A@``%.@``@E"'_Z'P(`J:3H0`,D`$`
+M''Q]&WB`HR[$5*5,;&"E@``X@```8(29,$@```$X```!D!TNP(`!`!Q\"`.F
+M@Z$`##@A`!A.@``@E"'_Z'P(`J:3H0`,D\$`$)/A`!20`0`<?'\;>#O#+!"`
+M'@`4.&```"P```!!@@"(@!\NP"P```%`H@!X?^/[>#B```!@A)DP2````7!I
+M@`!`H@!@5&`^?I`>``21/R[`?^/[>'_$\WA+__ZU+`,``$"B`$!_X_MX?\3S
+M>$@``%4L`P``0:(`+'_C^WA_Q/-X2```:2P#``!`@0`8?^/[>'_$\WA(``'U
+M.````I`?+L"`?R[`@`$`''P(`Z:#H0`,@\$`$(/A`!0X(0`83H``(#A@``"!
+M)``$@`0`#'P)`$!`@0`0@`0`$'P)`$!-@``@.&```4Z``""`!``4.&#__RP`
+M``!-@@`@@60``!P+`!P](```.2D`"'P`2A20!``8@20`!(`$`!!\"0!`08``
+MF#A@__\L"P``38(`(($D``21)``(@`0`$'P'`WA\"0!`08``;(`$```L````
+M08(`8#T@```XJ0``/2```#C)``B!)```.0G__Y$$```=2``<?2HJ%(%D`!B`
+M"0`0@2L`"'P)`%!4``@\@20`"'T@2%"1)``(?4HR%)%$`!A\"3A`08``#"P(
+M``!`@O^X.&```4Z``""!)``$@`0`##A@``!\"0!`38$`(#T@``"!*0``.2G_
+M_X`$```X8/_^?`!(`$V"`""!)``$D20`"(`$``Q\!@-X?`D`0$&!`(@](```
+M@2D``#DI__^`!```?`L#>'P`2$!`@`!L/2```#AI```](```.*D`"#T@``"!
+M*0``..G__SD+``&1!```'4@`''TJ&A2!9``8@`D`$($K``A\"0!05``(/($D
+M``A]($A0D20`"'U**A211``8?`DP0$&!`!!]"T-X?`@X0$&`_[@X8``"3H``
+M((`$`!0L````38(`(($D`!B@"0``L`,3T($D`!B@"0`"L`,3SH$D`!B@"0`$
+ML`,3S($D`!B@"0`&L`,3RDZ``""4(?_H?`@"II.A``R3P0`0D^$`%)`!`!Q\
+M?AMX?)\C>'Q]&W@X@```8(2`!$@```%48P0^+!\``4&"`$A!@0`0+!\``$&"
+M`"Q(``!4+!\`!D&"`!`L'P`(08(`*$@``$"`OB[(?&4K>&2E`(%(```@@+XN
+MR'QE*WADI0!"2```$("]+LA\92MX9*4`('_#\W@X@```8(2`!$@```&``0`<
+M?`@#IH.A``R#P0`0@^$`%#@A`!A.@``@E"'_^'P(`J:0`0`,@(,!W$O__SF`
+M`0`,?`@#IC@A``A.@``@E"'_Z'P(`J:3H0`,D\$`$)/A`!20`0`<?'\;>'R=
+M(WA(```!?'X;>%1D`'Y_X_MX2````7_C^W@X@``P2````51IYKXL'0``08(`
+M%"`)`"54`/A^?2D"%$@``"@H"0`!0($`##DI__](```8?^/[>'_$\WA(```!
+M.&```$@``"Q490<J52`EMGRE`WA_X_MX.(``,$@```%_X_MX?\3S>$@```$X
+M8``!@`$`''P(`Z:#H0`,@\$`$(/A`!0X(0`83H``()0A__A\"`*FD`$`#'Q@
+M&W@X8```+`0`"4&A`!@<A``\?(`B%#B$+%!\`P-X2````8`!``Q\"`.F."$`
+M"$Z``""4(?_X?`@"II`!``Q\8!MX?*LK>#A@```L!``)0:$`'!RD`#Q\H"H4
+M.*4L4'P#`WA]9%MX2````8`!``Q\"`.F."$`"$Z``""4(?_8?`@"II-A`!23
+M@0`8DZ$`')/!`""3X0`DD`$`+'Q]&WA\GB-X?+PK>'QI&W@L!``"08(`)"@$
+M``)!@0`0+`0``4&"`"1(```X+`0``T&"`!!(```L.V``"4@``"P[8``(2```
+M)#M@``"``RQ4.&```"P```!`@@"(2```##A@__](``!\'!L`/'_I`A0[_RQ0
+M@!\`!#A@__\L````0((`8'_C^W@X@``\2````9/?``0L'```0*(`-#@```N0
+M'P`,.````I`?`!0X`/__D!\`&#@``_^0'P`<.```"K`?`""P'P`B2```%'^C
+MZWA_9-MX?X7C>$@```%_8]MX@`$`+'P(`Z:#80`4@X$`&(.A`!R#P0`@@^$`
+M)#@A`"A.@``@E"'_Z'P(`J:3H0`,D`$`''Q]&WB`HRP\5*4%OH`#+$14`(&>
+M?*4#>#B``*1(```!@+TL0%2E!;Z`'2Q(5`"!GGRE`WA_H^MX.(``J$@```%_
+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
+M"`.F@Z$`#(/!`!"#X0`4."$`&$Z``""!`0`(@4$`$%2E!3Y5*9`:?*5+>(`!
+M``Q4`,@,?*4#>'%```%!@@`(9*4!`%5`R(1\`"MX54FB4GTI`WA52Y(0?6M+
+M>)%D``A4X-`*54FR$'TI`WB1)``,+`C__T&"`!A5`&LD?`!+>)`$``QE8$``
+MD`0`"#A@``%.@``@.&```$Z``""`!``(9``@`)`$``A.@``@+`8``$&"`""!
+M)``,(6<``'P+.114`&`F?2DK>'P`2WA(```H+`<``$&"`!2`"``(D`0`")"D
+M``Q(```4.````)`$``A@H!``D`0`##@```"0!``4D`0`$#A@``%.@``@@`0`
+M%#A@``]P"0`!38(`((`$`!14`/T^L`4``*`$`!"P!0`".````)@%``2`!``0
+M<`D``4""`$1P"0`"08(`##@```&8!0`$@`0`$'`)``A!@@`0B`4`!&````*8
+M!0`$@`0`$'`)``1!@@`0B`4`!&````28!0`$@`0`"%0`=SZ8!0`%@`0`%%0`
+MGCZ8!0`&@`0`$%0`QSZ8!0`'@`0`$%0`YSZ8!0`(@`0`$%0`ISZ8!0`).```
+M`)@%``J8!0`+B24`!RP)``!!@@`,.`D``9@%``>))0`(+`D``$&"``PX"0`!
+MF`4`"#A@``!.@``@3H``((@#+KQ@```(F`,NO(@$``1@```(F`0`!*`#+KJP
+M!```B`,NO)@$``2(`RZ]F`0`!3A@``!.@``@E"'_Z'P(`J:3H0`,D`$`''Q]
+M&W@X@$"`/*"22&"E_`!(```!?Z/K>#B`0(`\H"228*5))$@```%_H^MX.(!`
+M@#R@*`!@I0`Y2````7^CZW@X@$"`/*!3%F"E""1(```!?Z/K>#B`0(`\H.68
+M8*4%>4@```%_H^MX.(!`@#R@`!U@I>__2````7^CZW@X@$"`/*`:JF"EOD!(
+M```!?Z/K>#B`0(`\H+X08*555$@```%_H^MX.(!`@#R@``Y@I3`'2````7^C
+MZW@X@$"$.*```$@```&``0`<?`@#IH.A``PX(0`83H``()0A_^A\"`*FD\$`
+M$)/A`!20`0`<?'X;>#B```!@A)C0.*`<%D@```$[X```?\/S>#B```!@A)B`
+M/*```4@```$[_P`!+!\`!T"!_^1_P_-X.(```&"$G`!(```!5&-&/E1IX3Y4
+M8"8V?2,#>#B```A(```!@`$`''P(`Z:#P0`0@^$`%#@A`!A.@``@E"'_>'P(
+M`J:0`0",?&<;>#T@```Y:1)\@`D2?($K``2!2P`(@0L`#)`!``B1(0`,D4$`
+M$)$!`!2`"P`0D`$`&#T@```Y:1*0@`D2D($K``2!2P`(@0L`#)`!`"B1(0`L
+MD4$`,)$!`#2`"P`0D`$`.#T@```Y:1*D@`D2I($K``2!2P`(@0L`#)`!`$B1
+M(0!,D4$`4)$!`%2`"P`0D`$`6#T@```Y:1*X@`D2N($K``2!2P`(@0L`#)`!
+M`&B1(0!LD4$`<)$!`'2`"P`0D`$`>#E````Y`0`(54`0.GU@.A1]($(4?`@`
+M+I`+1BB`"0`@D`M&/(`)`$"0"T90@`D`8)`+1F0Y2@`!+`H`!$"!_\PX@``!
+M2````8`!`(Q\"`.F."$`B$Z``"!4A`@\?(0J%%2$"#Q\A!H4H&05_DZ``""4
+M(?_8?`@"II,A``R300`0DV$`%).!`!B3H0`<D`$`+'Q]&WA\F2-X?+PK>'S;
+M,WA\^CMX/(```#B$```XH!)P2````9.=``R3?0`0DUT`%+,]`<@[@```LYT!
+MRC@``#^P'0'\.2```)$]`@"1/2^\D3TOP#P`"`"0'2_,.``'@9`=+]21/2_<
+M/```/V``/S^0'2_@.```9)`=+^0X```"D!TOZ#@`__^0'2_XD!TO_)`=,``X
+M?2P\/(```#B$```XH``&2````9N=,`2``0`L?`@#IH,A``R#00`0@V$`%(.!
+M`!B#H0`<."$`*$Z``"`Y8```/2```#DI```<"P`#?4!*%'P)`*Y\`!@`0*(`
+M((@*``%\`"!`08$`%(@*``(Y0``!?``@0$"``!0Y:P`!*`L``T"!_\@Y0```
+M?4-3>$Z``""4(?_0?`@"II-!`!B380`<DX$`().A`"23P0`HD^$`+)`!`#1\
+M?QMX?)XC>'R]*WA\W#-X?/H[>#A@1JA(```!?'L;>#@```(L`P``08(&7'_D
+M^WA_Q?-X?Z;K>'^'XWA_2--X2````7]_VWA_8]MX.(```#B@``%(```!+`,`
+M`$&"`$Q_8]MX.(!`($@```%48P8^5&#A/I`;`<Q48`<^L!L!T(A[`<^(FP'1
+M2___`2P#``!!@@18?V/;>#B```!(```!+`,``$""``PX```#2``%N']CVW@X
+M@```8(28&$@```&P>P'2@!L!S"P```E!@@`8+```"D"B`!B@&P'0*````T&!
+M``Q_X_MX2__Z_7_C^WA(```!.```#BP#``!!@@5H@!\!S"@```1`H0`@?^/[
+M>#B`0!!(```!8&40`'_C^W@X@$`02````7_C^W@X@```8(28`#B@``=(```!
+M?^/[>$@```&P?P'4H!\!U%0`!C8L```P08(`P$&!`!0L```008(`M"P``"!(
+M```<+```8$&"`*1!@0`,+```4$@```@L``"@08(`D*`?`=0L````0((`A(`?
+M`<PL```%0*(`((`?`=`](``)82D`0WP`2`!`H@`,.```1D@``%B`'P',:`D`
+M!R%I``!]*TD4:```"R%@``!\"P$4?2L#>4&"``PX``!12```+(`?`<PO@``*
+M09X`'"P```E!@@`40)X`&*`?`=`H```#08$`##@``&*P'P'4@!\!S"^```I!
+MG@`\+```"4&"`#1`G@`0H!\!T"@```-`@0`DH!\!U%0)!C8Y*?_0*`D`/T&!
+M`!!4``<^+```!$"!`I1_X_MX.(``P3BA``A(```!+`,``$&"`_2@`0`(*``P
+M`4&!``PX```%2``#Y*`!``BP&Q)P?^/[>#B`0!!(```!5&/OOBP#``)!@@`T
+M+`,``T&"`"2`'P',+```"4&"`"`L```*0((`$*`?`=`H```#0($`##@```I(
+M``.4?^/[>#B``#\XH0`(2````2P#``!!@@-XH`$`"+`;$G)_X_MX.(``'#BA
+M``A(```!+`,``$&"`UB@`0`(.X`#0"P```!!H@`L5!QA'G_C^W@X@``;.*$`
+M"$@```$L`P``08(#+*`!``A_G`-X.YS_0#N@```[P```?!W@0$"@`#`XG@#`
+M?^/[>#BA``A(```!+`,``$&"`OB@`0`(?[T">#O>``%\'N!`08#_V#@```!@
+M`/__?!T``$&"``PX```'2``"T#@```JP&Q/F.````[`;%?`[P```.```"QT^
+M`#1]*=H4L`D3[CO>``$H'@`)0('_[#O````](```..D``#T@```Y"0``.4``
+M"U?+"#Q]*]H4.2D5\'P+.BZP"0`(?`M"+K`)``(=/@`T?2G:%+%)%K2Q2188
+M.]X``2@>``)`@?_,.)L2<'_C^WA(```!+`,``$&"`CB@&Q)P*`!0`D&!`$2`
+M'P',+X``"D&>`!PL```)08(`%$">`"R@'P'0*````T&!`"`X``9HL!L6`#@`
+M!+"P&Q8$.`"``+`;%@BP&Q7^H!L2BBP```!!@@!PH!\!U%0`!C8L```00*(`
+M8'_C^W@X@```8(28`#B@0`=(```!.&`'T$@```%_X_MX2````;!_`=9_X_MX
+M.(```&"$F``XH``'2````3A@!]!(```!H!\!UE0`!C8L```@08(`##@```U(
+M``%X?^/[>#B``+\XH0`(2````2P#``!!@@%<H`$`"+`;$G2@&Q)TL!\""'_C
+M^WA(```!+`,``$&"`3R`'P',+X``"D&>`!PL```)08(`%$">`""@'P'0*```
+M`T&!`!1_X_MX.($`#$@```%(``!H@!\!S&@)``<A:0``?2M)%&@```LA8```
+M?`L!%'TK`WE!H@`4?^/[>#B!``Q(```!2```-*$_`=15*08V.2G_T"@)`#]!
+M@0`4?^/[>#B!``Q(```!2```$'_C^W@X@0`,2````2P#``!!@@"D@!LLQ)`?
+M`<!_X_MX2````3N@```[P```()X`'W_C^W@XH0`(2````2P#``!!@@!LH`$`
+M"'^]`A17R0@\?2G:%%0`PCZ8"2PPB`$`"9@)+#$[W@`!*!X``D"!_\`A/0``
+M?`GI%#U@``)A:__]?ZE:>"%I``!]*TD4?`M+>4&"``PX```)2```&'_C^WA+
+M__<%?^/[>$@``#`X```(D`$`#"P;``!!@@`,?V/;>$@```$L&@``08(`#(`!
+M``R0&@``.&```(`!`#1\"`.F@T$`&(-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`
+M,$Z``""4(?_H?`@"II/A`!20`0`<?'\;>$@```&`'RRH+````$&B`!!_X_MX
+M?`@#IDZ``"%_X_MX2````7_C^W@X@``!.*```4@```$XGQ)P?^/[>$@```%_
+MX_MX2````8`!`!Q\"`.F@^$`%#@A`!A.@``@E"'_N'P(`J:3`0`HDR$`+)-!
+M`#"380`TDX$`.).A`#R3P0!`D^$`1)`!`$Q\?!MX/2```#DI$N"!20`$@2D`
+M`)$A`!B100`</6```#DK$NB`"Q+H@6D`!(%)``B!*0`,D`$`")%A``R100`0
+MD2$`%#M````[`0`8.R$`(%==$#I_W<`N?[W*%'^#XWA_Q/-X2````9!]```[
+MX```5^"`'GP=^WA_@^-X?\3S>'^EZWA(```!?X/C>'_$\WA(```!.````'P#
+MZ`!`@@"`._\``2P?`/]`@?_(.^```#MA``A7X!`Z?[L`+G^#XWA_Q/-X?Z7K
+M>$@```%_@^-X?\3S>$@```$X````?!T8`$""`#P[_P`!+!\``T"!_\A70!`Z
+M?X/C>'R8`"Y\N0`N2````3M:``$L&@`!0('_1#A@`&1(```!.````7P#`WB`
+M`0!,?`@#IH,!`"B#(0`L@T$`,(-A`#2#@0`X@Z$`/(/!`$"#X0!$."$`2$Z`
+M`"!P@`$`08(`%#@`$S.P!0``.``7U$@``#!P@`"`08(`-*`#$HHL````0((`
+M$*`#$HPL````08(`'#@`"0BP!0``.``*K+`&```X8``!3H``(#A@``!.@``@
+ME"'_X'P(`J:3@0`0DZ$`%)/!`!B3X0`<D`$`)'Q^&WA\?1MX?'P;>#OC`>`X
+M````L`$`"*`#$G`H`%``0*$`)(`#`:!\"0.F.(``R3BA``A.@`0A.````"P#
+M``!!@@08H!X!U%0`!C8L``!`0*(`##@```"P'1*&H`$`""P```!`@@`P@!X!
+MS"P```=`H@`DH!X!T"P```A`H@`8.```!;`!``@X```!L!T2=K`=$GB`'`'<
+M+```!D&"`#R@'`'*+`!P94"B`#"A/`((.`G_G"@```%!@0`,.`D`!4@``!2@
+M'`((+```04"B``PX``!#L!P""#@```"0'P`$H!T2ABP```!!@@`@.````9`?
+M``2@'1)V+````$""``PX```#D!\`!*`=$HHL````08(`$(`?``1@```$D!\`
+M!*`=$HPL````08(`,*`<`<HL``X108(`)($_``1A(``(D!\`!*`=$G@L````
+M0((`#&$@`"B0'P`$.``)"+`?`!"A/@'452D&-CDI_]`H"0`_0($`2(%^`<QI
+M8``'(2```'P)`11I:0`+(4D``'TJ211\"DMY0((`)"^+``I!G@`<+`L`"4&"
+M`!1`G@`8H!X!T"@```-!@0`,.``)Q$@```@X``JLL!\`$C@`$S.P'P`,.``7
+MU+`?``Z`'P``5``#VF0```&0'P``.6```*`!``AP"0`"0((`*(`>`<PH```%
+M08$`&"P```5`H@`4H!X!T"@```-`@0`(.6```8$_``!1:9-:52D"TJ`!``AH
+M```"5`#__F4I`!!0";)2D3\``(`>`<PH```&0($`#&4@``A(```,@!\``%0`
+M`U:0'P``@!\``&0`P`"0'P``H!P!T"@```%!@0`0@!X!S"P```M`H@!L.2``
+M`*`!``AP"@`!0((`%(`?``1P"P`)08(`"#D@``&`'P``42#HA*%A``AI:0`(
+M52GO_E$@X,:0'P``.2```'%@``1`@@`4@!\`!'`*``E!@@`(.2```8`?``!1
+M(-D(9``%`)`?``"`'P``5``!RI`?```Y(```@!T3."P```!!@@`0@!T3/"P`
+M``!`@@`(.2```8`?``!1(+H08`#P`)`?``"`'`',+```!4"B`!"@'`'0+```
+M"$&"`!"`'`',*```!4"!`!"`'P``8``(`)`?``"@`0`(<``!\$&"``Q\`"9P
+M2```"#@```JP'P`(H`$`"'``\`!!@@`4?`EF<#@```%\`$@P2```"#@``("P
+M'P`*H3X!U%4I!C8Y*?_0*`D`/T&!`!"`'P``8``&`$@```R`'P``5``%Z)`?
+M``"@'1)Z+````$&B`#@XO!)(@7X!H'UI`Z9_P_-X.(``#TZ`!"$L`P``08(`
+M&#@```&0'!),@!\``&```0"0'P``@!X!S"$@``0Y(```?2E)%)$\$F@Y(```
+M+```!4"B`!"@'@'0+```"4&"`!"`'@',*```!4"!``@Y(``!@!\``%$@/C"0
+M'P``.```#Y`?`!0X```!?`,#>(`!`"1\"`.F@X$`$(.A`!2#P0`8@^$`'#@A
+M`"!.@``@E"'_\'P(`J:0`0`4.($`"$@```$X8``!@`$`%'P(`Z8X(0`03H``
+M(#T@```Y*0``+`0``4&"``P](```.2D``)$C`'!.@``@E"'_X'P(`J:3P0`8
+MD^$`')`!`"1\?QMX?)XC>#B```!@A(`H@+X`!$@```%_X_MX.(```&"$@"R`
+MO@`,2````7_C^W@X@```8(2`,("^`!!(```!?^/[>#B```!@A(`T@+X`"$@`
+M``&`'@``=`D!`$&B`#A_X_MX.($`"$@```&!?Q(T.2```#E```"1*P`HD4L`
+M+'_C^W@X@```8(2`(#R@`0!(```!?^/[>#B```!@A(`@@+X``$@```&``0`D
+M?`@#IH/!`!B#X0`<."$`($Z``""4(?_8?`@"II`!`"R0@0`,@`,!W"P```%!
+M@@`<*````4&``"PL```&08(`)"P```A`H@!$.````&``__^0`0`4/```!V``
+M__](```H/2```(`)``!\`"!05``8.)`!`!0](```@`D``'P`(%!4`!@XD`$`
+M&#@$``&0`0`0/``!@&``__]\H``XD`$`"#B!``A(```!@`$`+'P(`Z8X(0`H
+M3H``()0A_^A\"`*FDZ$`#)`!`!Q\?1MX.(```&"$@"@XH```2````7^CZW@X
+M@```8(2`!$@```%D90`$5*4#$G^CZW@X@```8(2`!$@```%_H^MX.(```&"$
+M@"`XH```8*7__T@```&``0`<?`@#IH.A``PX(0`83H``()0A_]A\"`*FDV$`
+M%).!`!B3H0`<D\$`()/A`"20`0`L?'X;>'R?(WA\?1MXH`0`$BP```!!@@!D
+M.(```&"$@`1(```!9&4`$'_#\W@X@```8(2`!$@```&@OP`0?\/S>#B```!@
+MA(`D2````:"_`!)_P_-X.(```&"$@#A(```!@+\`%%2E&#A_P_-X.(```&"$
+M@#!(```@.(```&"$@`1(```!5&4#%'_#\W@X@```8(2`!$@```%_P_-X.(``
+M`&"$@"B`OP``2````7_#\W@X@```8(2`($@```%48P`0H!\`"GQE`WBA/P`8
+M+`D``$&"`!`X"0`$5`""7GRE`WA_P_-X.(```&"$@"!(```!@+TOU%2E!AZ@
+M'P`:5`!$+GRE`WB0O2_4?\/S>#B```!@A(`82````:._``J`'P`<?`#H0$"!
+M``A\'0-X@Y\`#(`?`!Q\`.!`0($`"'P<`WA\'>``0*(`#(-_``1(```(@W\`
+M`("_``0XI?_]5*4;>&2E"AA_P_-X.(```&"$@-1(```!.+O__52E&WADI0H`
+M?\/S>#B```!@A(#82````5>E!#Y7@(`>?*4#>'_#\W@X@```8(2`W$@```&`
+M`0`L?`@#IH-A`!2#@0`8@Z$`'(/!`""#X0`D."$`*$Z``""4(?_H?`@"II/!
+M`!"3X0`4D`$`''Q_&WA\@"-X?+XK>#B`8`!\!0-X2````7_C^W@X@&`(.*``
+M`4@```%_X_MX.(!@##B@``,XP``"2````3@````L`P``0:(`&'_C^W@X@&`$
+M2````;!^```X```!?`,#>(`!`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A_^A\
+M"`*FDX$`").A``R0`0`<?'P;>'R=(W@X@$`42````5>]"#PX```#?`#H,'QE
+M`WA_@^-X.(!`%$@```$X8``!@`$`''P(`Z:#@0`(@Z$`##@A`!A.@``@E"'_
+MZ'P(`J:3@0`(DZ$`#)`!`!Q\?!MX?)TC>#B`0!1(```!5[T(/#B@``-\I>@P
+M?&4H>'^#XW@X@$`42````3A@``&``0`<?`@#IH.!``B#H0`,."$`&$Z``""4
+M(?_8?`@"II-A`!23@0`8DZ$`')`!`"Q\>QMX?)PC>'R]*W@X@$`82````3@`
+M__Y<`.`^?&4`.%>]!_Y_O>`P?*7K>']CVW@X@$`82````3A@``&``0`L?`@#
+MIH-A`!2#@0`8@Z$`'#@A`"A.@``@E"'_Z'P(`J:3X0`4D`$`''R?(W@X`/__
+M*`0`!4&!`!@X@$`<2````7!C`"]\8_PP5&`'_GP#`WB``0`<?`@#IH/A`!0X
+M(0`83H``()0A_^A\"`*FDX$`").A``R3X0`4D`$`''Q_&WA\G2-X?+PK>#B`
+M0!1(```!5ZD(/#@```-\`$@P?```^%0`!1Q\90`X5[U@)GREZWA@I8``+!P`
+M`$&"``ADI0`!?^/[>#B`0!1(```!@)\L1&2$`0!_X_MX2````8`!`!Q\"`.F
+M@X$`"(.A``R#X0`4."$`&$Z``""4(?_X?`@"II`!``PX@$`(2````6AC``$@
+M`P``?&`9%(`!``Q\"`.F."$`"$Z``""4(?_8?`@"II-A`!23@0`8DZ$`')/!
+M`""3X0`DD`$`+'Q^&WA\G2-X.V```'Q\&W@X@`"`2````71@`(!!H@!`?\/S
+M>#B``(Q(```!=&`!`$&"``@_8``@=&D@`$&"``AG>P!`=&`$`$&"``AG>P"`
+M=&D"`$&"``AG>P(`?\/S>#B``,!(```!?'\;>"P#__]`H@`4.````)`=```X
+M8```2``!(#P``05@`-BZ?&``.)`=``!T:0`(08(`#&0`0`"0'0``<^``!4&"
+M`!"`'0``8````9`=``!SZ07`0:(`6(`=``!@``!`D!T``'_#\W@X@`#$2```
+M`51@!;Z!/$:@?`!+>%1CA;Y\8P-XD'Q&H'_#\W@X@`#(2````51@!;Z!/$:@
+M?`!+>%1CA;Y\8P-XD'Q&H'/@`"!!@@`<@!X2:"P```!!@@`0@!T``&0`0`"0
+M'0``@!T``']@`WB0'0``=`E``$&B`%B3_A)0?\/S>#B``,1(```!D'X25'_#
+M\W@X@`#(2````9!^$EA_P_-X.(``S$@```&0?A)<?\/S>#B``-!(```!D'X2
+M8'_#\W@X@`#42````9!^$F0X8``!@`$`+'P(`Z:#80`4@X$`&(.A`!R#P0`@
+M@^$`)#@A`"A.@``@@&,L1$Z``""4(?_8?`@"II-A`!23@0`8DZ$`')/!`""3
+MX0`DD`$`+'Q^&WA\GR-X?'P;>(-C+$0L&P``0*``'#B``"0XH```2````7_#
+M\W@X@``D2````3P``05@`-BZ?^4`.#N@``!SX`!`08(`1(`<+,PL````08(`
+M"&"E`$"`'"S0+````$&"``A@I0$`@!PLU"P```!!@@`(8*4`@(`<+-@L````
+M08(`"&"E!`!SX``!08(`"&"E``=WX`+@08(`.&2E`(!WX``@08(`"&>]`0!W
+MX`!`08(`"&>](`!WX`"`08(`"&>]!`!WX`(`08(`"&>]`@!WX$``08(`"&2E
+M``A_P_-X.(``H$@```%_P_-X.(``K$@```$\`$C_8`#__WQE`#A\I>MX?\/S
+M>#B``*Q(```!D_PL1"P?``!`H``4?\/S>#B``"0XH``!2````7]CVWB``0`L
+M?`@#IH-A`!2#@0`8@Z$`'(/!`""#X0`D."$`*$Z``""@8P'J3H``()0A__A\
+M"`*FD`$`#*`#`>I\`"!`0*$`(%2$*#0\A``!.(2('$@```$X```!<&F``$""
+M``@X````?`,#>(`!``Q\"`.F."$`"$Z``""4(?_8?`@"II-A`!23@0`8DZ$`
+M')/!`""3X0`DD`$`+'Q_&WA\GB-XH`,!ZCA@``!\`"!`0*$!#%2=*#0_O0`!
+M.YV(%'_C^WA_A.-X2````7Q[&W@XG8@`?^/[>#B@``!(```!.)V(!'_C^W@X
+MH```2````3B=B`A_X_MX.*```$@```$XG8@,?^/[>#B@``!(```!.)V($'_C
+M^W@XH```2````7_C^WA_A.-X.*``!T@```$XG8@8?^/[>#B@``!(```!.[V(
+M''_C^WA_I.MX.*```$@```$L&P`$0*(`8(`?+\QT"0@`0:(`5#N^`$!7O2KT
+M/[T``3B=B`!_X_MX.*```$@```$XG8@$?^/[>#B@``!(```!.)V("'_C^W@X
+MH```2````3N]B`Q_X_MX?Z3K>#B@``!(```!.&```8`!`"Q\"`.F@V$`%(.!
+M`!B#H0`<@\$`((/A`"0X(0`H3H``()0A_^A\"`*FDZ$`#)/!`!"3X0`4D`$`
+M''Q^&WB@`P'J.&```'P`($!`@0",.^```#D@```L!0``08(`3(OE``57_T`N
+MB`4`!'__`WB))0`#52G`#H@%``)4`(`>?2D#>(@%``%4`$`N?2D#>(@%``!]
+M*0-X52GX?E?@^`!]*0-X5__X?E2=*#0_O0`!.)V(&'_#\WA])4MX2````3N]
+MB!QCY8``?\/S>'^DZWA(```!.&```8`!`!Q\"`.F@Z$`#(/!`!"#X0`4."$`
+M&$Z``""4(?_(?`@"II*!``B2H0`,DL$`$)+A`!23`0`8DR$`')-!`""380`D
+MDX$`*).A`"R3P0`PD^$`-)`!`#Q\?AMX?)HC>'R_*WA\UC-X?'4;>#E#`>`Q
+M9___?6M9$#P`555@`%56?6L`.#TKJJLY::JJH`H`"CA@``!\`"!`0($$`(@%
+M```H```%08$`J#T@```Y*0``5``0.GP)`"Y\`$H4?`D#IDZ`!"`Z@``%2```
+MC(`*```X8```.H``!G0)``1`@@!X2``#N#J```2`'B_,=`D(`$&"`&0Y)`!`
+MH`H`"CA@``!\"0``0(`#E$@``$R@!0`".&```"@```1`@0.`H`4``CJ````H
+M```%0($`+*`%``(B@``-?I2A$%:4![PZE``!2```%#J```=(```,.&```$@`
+M`TB+'P`$B!\`!50`0"Y_&`-XB!\`!E0`@!Y_&`-XB!\`!U0`P`Y_&`-X?QA:
+M>(@?``E4`$`NB3\`"'P72WA^]UIX5O<$/HM_``J('P`+5`!`+G][`WB('P`,
+M5`"`'G][`WB('P`-5`#`#G][`WA_>UIXB!\`#U0`0"Z)/P`.?!E+>'\Y6GA7
+M.00^BY\`$(@?`!%4`$`N?YP#>(@?`!)4`(`>?YP#>(@?`!-4`,`.?YP#>'^<
+M6GB@'P`"*```#4&!``A7G`8^+!0`!$""`?R`'B_,=`D(`$&B`?`X&@!`5!0$
+M/E==*#0_O0`!.)V(`'\%P/A_P_-X2````3B=B`1^Y;CX?\/S>$@```$XG8@(
+M?\/S>']EVWA(```!.)V(#'_#\WA_)<MX2````3B=B!!_P_-X?X7C>$@```$[
+MO8@4?\/S>'^DZW@XH``$2````7_#\WA_1--X?L6S>$@```&(OP`4B!\`%50`
+M0"Y\I0-XB!\`%E0`@!Y\I0-XB!\`%U0`P`Y\I0-XBY\`&(@?`!E4`$`N?YP#
+M>(@?`!I4`(`>?YP#>(@?`!M4`,`.?YP#>(`5+]`[8```.L```#L@``!P"0`$
+M08(`3(@?`!]4`$`NB3\`'GP92WB('P`=5`!`+HD_`!Q\%DMXBW\`((@?`"%4
+M`$`N?WL#>(@?`")4`(`>?WL#>(@?`"-4`,`.?WL#>%:=*#0_O0`!.)V(`'_#
+M\WA(```!.)V(!'_#\WA_)<MX2````3B=B`A_P_-X?X7C>$@```$XG8@,?\/S
+M>'[%LWA(```!.)V($'_#\WA_9=MX2````3B=B!1_P_-X.*``!T@```$XG8@8
+M?\/S>#B@``!(```!.[V(''_#\WA_I.MX.*```$@```%772@T/[T``3B=B`!_
+MP_-X?P7#>$@```$[O8@$?\/S>'^DZWA^Y;MX2````4@``(!772@T/[T``3B=
+MB`!_P_-X?P7#>$@```$XG8@$?\/S>'[ENWA(```!.)V("'_#\WA_9=MX2```
+M`3B=B`Q_P_-X?R7+>$@```$XG8@0?\/S>'^%XWA(```!.[V(%'_#\WA_I.MX
+M?H6C>$@```%_P_-X?T33>'[%LWA(```!.&```8`!`#Q\"`.F@H$`"(*A``R"
+MP0`0@N$`%(,!`!B#(0`<@T$`((-A`"2#@0`H@Z$`+(/!`#"#X0`T."$`.$Z`
+M`""4(?_X?`@"II`!``PY(RPP?(,C>'TD2W@XH``&2````8`!``Q\"`.F."$`
+M"$Z``""4(?_X?`@"II`!``PX8RPP.*``!D@```$X8``!@`$`#'P(`Z8X(0`(
+M3H``()0A__A\"`*FD`$`##DC+#Q\@R-X?21+>#B@``9(```!@`$`#'P(`Z8X
+M(0`(3H``()0A_^A\"`*FDZ$`#)`!`!Q\?1MX.&,L/#B@``9(```!B+TL/(@=
+M+#U4`$`N?*4#>(@=+#Y4`(`>?*4#>(@=+#]4`,`.?*4#>'^CZW@X@```8(2`
+MX$@```&(O2Q!5*5`+H@=+$!\I0-X?Z/K>#B```!@A(#D2````3A@``&``0`<
+M?`@#IH.A``PX(0`83H``('QI&WB@`P((.&``#'P`(`!!@@`@H`D2<G`)`(!\
+M8``F5&,?_GQC`-!48P`X.&,`"RP%``!!@@`(D&4``#A@``!.@``@?&L;>#D@
+M``"@`Q*&+````$&"`!@Y(``!H`,2=BP```!`@@`(.2``0Z`#$HHL````08(`
+M"&$I``2@`Q*,+````$&"`"2@"P'*+``.$4&"`!AA*0`(H`,2>"P```!`@@`(
+M82D`('TC2WA.@``@E"'_Z'P(`J:3H0`,D\$`$)/A`!20`0`<?'\;>*/#$DA_
+MP/-X5][W?E0=__Z``P&L?`D#IG_$\WA.@`0A?^/[>#B```!@A)@`2````6!E
+M(`!_X_MX.(```&"$F`!(```!@!\!L'P)`Z9_X_MX?\3S>$Z`!"%KI0`!?`/H
+M`$&"``A_I>MX@!\!N'P)`Z9_X_MX?\3S>$Z`!"&``0`<?`@#IH.A``R#P0`0
+M@^$`%#@A`!A.@``@E"'_Z'P(`J:3@0`(DZ$`#)`!`!Q\?!MX?)TC>#B`0!!(
+M```!/`#_\6``_Y]\90`X5[T6^CT@```Y*0``?!U(+GRE`WA_@^-X.(!`$$@`
+M``&``0`<?`@#IH.!``B#H0`,."$`&$Z``""4(?_H?`@"II.!``B3H0`,D`$`
+M''Q]&WA\O"MX.&,L-CB@``9(```!B+TL-H@=+#=4`$`N?*4#>(@=+#A4`(`>
+M?*4#>(@=+#E4`,`.?*4#>'^CZW@X@```8(2`"$@```&(O2P[5*5`+H@=+#I\
+MI0-X5YR`GGREXWA_H^MX.(```&"$@`Q(```!@`$`''P(`Z:#@0`(@Z$`##@A
+M`!A.@``@E"'_V'P(`J:380`4DX$`&).A`!R0`0`L?'P;>#B```!@A(!,2```
+M`7Q[&WA_@^-X.(```&"$@%!(```!?'T;>'^#XW@X@```8(2`3$@```%\&Q@0
+M?``!$'P`Z!`Y0```?&0;>#A@``!\"QMX?4PC>'UC6WA]A&-X@`$`+'P(`Z:#
+M80`4@X$`&(.A`!PX(0`H3H``()0A__A\"`*FD`$`##B```!@A(!,2````8`!
+M``Q\"`.F."$`"$Z``""4(?_H?`@"II.!``B3H0`,D`$`''Q\&W@X@```8(2`
+M($@```%D?0$`?X/C>#B```!@A(`@?Z7K>$@```%_@^-X.(```&"$@"!_I>MX
+M2````8`!`!Q\"`.F@X$`"(.A``PX(0`83H``()0A_^A\"`*FD\$`$)/A`!20
+M`0`<?'\;>($C$C0L"0``08(`D*`)``)P"0`@08(`A#O````Y8```@`0``'P>
+M`$!`@``T?`H#>'TD6A2("0`$<`D`@$&B`!14``9^?`#P0$&```A\'@-X.6L`
+M`7P+4$!!@/_8?^/[>#B```!@A(`$2````2P>``!!@@`45\#X?F1E`@`H```"
+M0($`"%1E`<I_X_MX.(```&"$@`1(```!@`$`''P(`Z:#P0`0@^$`%#@A`!A.
+M@``@E"'_Z'P(`J:3H0`,D\$`$)/A`!20`0`<?'X;>#B```!@A)AD2````51_
+M;?YSX`$`08(`#&O_`?]___CX?\/S>#B```!@A(!02````7Q]&WA_P_-X.(``
+M`&"$@$Q(```!?[T:>'^]^GA_H^MX@`$`''P(`Z:#H0`,@\$`$(/A`!0X(0`8
+M3H``()0A_^A\"`*FD^$`%)`!`!Q\?QMX.(!`($@```%48P8^5&GA/E1C!SXY
+M8```@!\!S'P`2`!`H@`4H!\!T'P`&`!`H@`(.6```7UC6WB``0`<?`@#IH/A
+M`!0X(0`83H``()0A_^A\"`*FDX$`").A``R0`0`<?'P;>'R=(W@X@```8(2`
+MD$@```&`'0``?&,"%)!]``!_@^-X.(```&"$@(Q(```!@!T`!'QC`A20?0`$
+M?X/C>#B```!@A("42````8`=``Q\8P(4D'T`#'^#XW@X@```8(2`B$@```&`
+M'0`(?&,"%)!]``A_@^-X.(```&"$@)A(```!@!T`$'QC`A20?0`0@`$`''P(
+M`Z:#@0`(@Z$`##@A`!A.@``@.&```4Z``""4(?_X?`@"II`!``PX@```8(2<
+M'$@```%48P8^@`$`#'P(`Z8X(0`(3H``()0A__A\"`*FD`$`##B```!@A(!8
+M2````51C!WZ``0`,?`@#IC@A``A.@``@E"'_^'P(`J:0`0`,5(4'?CB```!@
+MA(!82````8`!``Q\"`.F."$`"$Z``""`8R^\3H``()0A__A\"`*FD`$`#("C
+M$C0L!0``0*(`$)"#+[PX8``!2```"$@```&``0`,?`@#IC@A``A.@``@.&``
+M`4Z``""4(?_H?`@"II.A``R3P0`0D^$`%)`!`!Q\?AMX?)\C>'Q]&W@H!``%
+M0*$`&#B```!@A/__2````7P?&$!`@0`4.`#__Y`=+_@X8```2```*'_#\WA_
+MY/MX2````7QE&WA_P_-X.(`0<$@```&3_B_X.&```8`!`!Q\"`.F@Z$`#(/!
+M`!"#X0`4."$`&$Z``""4(?_H?`@"II.A``R0`0`<?'T;>#B`$'!(```!5&0$
+M/G^CZWA(```!@`$`''P(`Z:#H0`,."$`&$Z``""4(?_H?`@"II.!``B3H0`,
+MD\$`$)/A`!20`0`<?'\;>'R>(W@X@#__2````7P>&$!`@0`4.`#__Y`?+_PX
+M8```2```2'_C^W@X@```8(2`%$@```%4?0`B?^/[>'_$\WA(```!5&,$OG^]
+M&WA_X_MX.(```&"$@!1_I>MX2````9/?+_PX8``!@`$`''P(`Z:#@0`(@Z$`
+M#(/!`!"#X0`4."$`&$Z``""4(?_H?`@"II.A``R0`0`<?'T;>#B```!@A(`4
+M2````51D!+Y_H^MX2````8`!`!Q\"`.F@Z$`##@A`!A.@``@B&,OS&AC``%4
+M8P?^3H``()0A_^A\"`*FD\$`$)/A`!20`0`<?'\;>'Q^&W@L!```08(`,#B`
+M``!@A(`$2````51E`@Q_X_MX.(```&"$@`1(```!@!\OS%0``@Q(```L.(``
+M`&"$@`1(```!9&4!`'_C^W@X@```8(2`!$@```&`'R_,9``!`)`>+\PX8``!
+M@`$`''P(`Z:#P0`0@^$`%#@A`!A.@``@E"'_Z'P(`J:3@0`(DZ$`#)/!`!"3
+MX0`4D`$`''Q_&WA\GB-X.(`__T@```%\'AA`0($`%#@`__^0'S``.&```$@`
+M`$A_X_MX.(```&"$@!1(```!5'T$`G_C^WA_Q/-X2````51C@)Y_O1MX?^/[
+M>#B```!@A(`4?Z7K>$@```&3WS``.&```8`!`!Q\"`.F@X$`"(.A``R#P0`0
+M@^$`%#@A`!A.@``@E"'_Z'P(`J:3H0`,D`$`''Q]&W@X@```8(2`%$@```%4
+M9(2^?Z/K>$@```&``0`<?`@#IH.A``PX(0`83H``()0A_^A\"`*FDX$`").A
+M``R3P0`0D^$`%)`!`!Q\?QMX?)XC>'R]*W@X8``,*`0`?T&!`#1_X_MX.(`$
+M`'_%\WA(```!,!W__WR@Z1!_X_MX.(`$!$@```%]/OH4FZDO.#A@``"``0`<
+M?`@#IH.!``B#H0`,@\$`$(/A`!0X(0`83H``()0A_^A\"`*FDZ$`#)/!`!"3
+MX0`4D`$`''Q_&WA\G2-XF)\2."P%``!!@@#HB`,2."P```!!@@#<@2,2-*`)
+M``)P``%`+``!0$"B`,@X@``!2````8$_$C2@"0`"<`E``$&"`"148/A^?+T!
+MUARE``,XI0$$?]T!UA_>``8[W@VL2```3($_$C2H"0`"+````$"@`"148/"^
+M?+T!UARE``,XI0#2?]T!UA_>``8[W@U(2```''R]&=8<I0`#.*4!:'_=&=8?
+MW@`&.]X.8'^]&=8?O0`#.[T#Z%>]!+Y_X_MX.(`0<$@```%_X_MX.(`0L'_%
+M\WA(```!5Z6`'GREZWA_X_MX.(```&"$@!1(```!@`$`''P(`Z:#H0`,@\$`
+M$(/A`!0X(0`83H``()0A__A\"`*FD`$`#("#`=Q(```!@`$`#'P(`Z8X(0`(
+M3H``(#@````L!``&08(`*#D@``"(`Q*3+````$&"`!2``R_H*````4&!``@Y
+M(``!?2!+>'P#`WA.@``@E"'_Z'P(`J:3X0`4D`$`''Q_&WA(```!+`,``$&"
+M`;1_X_MX.(```&"$F'`XH``?2````:"_`=14I08V.*7_T""E`#]\I2D05*4'
+M>CBE`!1_X_MX.(```&"$F?A(```!?^/[>#B```!@A(`<2````51E!F)@I0"`
+M?^/[>#B```!@A(`<2````7_C^W@X@```8(2!!#B@`#U(```!?^/[>#B`0!!(
+M```!8&4``G_C^W@X@$`02````8%_`<QI:0`'(`D``'T@211I8``+(4```'P*
+M`11]*@-Y0((`)"^+``I!G@`<+`L`"4&"`!1`G@!XH!\!T"@```-!@0!L?^/[
+M>#B```!@A)AT.*``)D@```%_X_MX.(```&"$F'@XH``-2````7_C^W@X@```
+M8(29\#B@``=(```!?^/[>#B```!@A)GT.*``/T@```%_X_MX.(!`$$@```%4
+M90(*9*4"`$@``&1_X_MX.(```&"$F'0XH``*2````7_C^W@X@```8(28>#B@
+M``Q(```!?^/[>#B```!@A)GP.*```T@```%_X_MX.(```&"$F?0XH``@2```
+M`7_C^W@X@$`02````61E`P!_X_MX.(!`$$@``0A_X_MX.(!`$$@```%490(*
+M?^/[>#B`0!!(```!?^/[>#B`0!!(```!5&4'^G_C^W@X@$`02````7_C^W@X
+M@```8(28<#B@`!](```!?^/[>#B```!@A)AT.*``?T@```%_X_MX.(```&"$
+MF'@XH``.2````7_C^W@X@```8(29\#B@``Q(```!?^/[>#B```!@A)GT.*``
+M_T@```&@OP'45*4&-CBE_]`@I0`_?*4I$%2E!WHXI0`.?^/[>#B```!@A)GX
+M2````7_C^W@X@```8(2`'$@```%48P9BH3\!U%4I!C8Y*?_08&43@"@)`#]`
+M@0`(8&4/@'_C^W@X@```8(2`'$@```&``0`<?`@#IH/A`!0X(0`83H``()0A
+M_^A\"`*FD^$`%)`!`!Q\?QMX2````2P#``!!H@$@?^/[>#B`0!!(```!5&4"
+M"G_C^W@X@$`02````7_C^W@X@$`02````51E!_I_X_MX.(!`$$@```%_X_MX
+M.(```&"$@00XH``!2````7_C^W@X@```8(2`'$@```%48P9BH3\!U%4I!C8Y
+M*?_08&43@"@)`#]`@0`(8&4/@'_C^W@X@```8(2`'$@```%_X_MX.(```&"$
+MF'`XH``?2````7_C^W@X@```8(28=#B@`'](```!?^/[>#B```!@A)AX.*``
+M#D@```%_X_MX.(```&"$F?`XH``,2````7_C^W@X@```8(29]#B@`/](```!
+MH+\!U%2E!C8XI?_0(*4`/WRE*1!4I0=Z.*4`%'_C^W@X@```8(29^$@```&`
+M`0`<?`@#IH/A`!0X(0`83H``(#E```"A9```/2```*`)``!\"P!`08$`'#DI
+M```Y2@`!54`0.GP)`BY\"P!`0('_\%5)$#H]8```.6L``'TI6A2H:0`"3H``
+M()0A_^A\"`*FD\$`$)/A`!20`0`<?+\K>'S>,WA\:AMX.6,!X"@$`!U!@0*<
+M/2```#DI`$Q4@!`Z?`D`+GP`2A1\"0.F3H`$("P%``)!@@`H*`4``D&``F@H
+M!0`$08``)"@%``5`@0)8+`4`?T&"`E!(```0@2L``%4I=_Y(``%L.2``#4@`
+M`E`Y(```+`4``$&"`D0L!0`!0*(`%(`#+\QL``@`5`DO_D@``BPL'P``08(`
+M$"P?``%!H@`42``!4(`+``!4"6_^2``"#(`*+]!4"??^2``"`(`#`<PH```%
+M08$`("P```5`H@`0H`,!T"@```=!@0`,.&``#4@``=0X8```2``!S#D@```L
+M!0``08(!Q"P%``%`@@#T.(```&"$H@A(```!5&.;?FAC``%4:0?^2``!H(`#
+M`?A(``%\.2```"P%``!!@@&,+`4``4"B`6R``R_<2```'"P%``!!@@`0+`4`
+M`4&"`!A(```TH`,2AB%@``!]*P$42``!6*`#$HPL````0((!-*`#$HHY(``!
+M+````$&"`3Q(``$@.2```4@``3`Y(```+`4``$&"`20L!0`!0((`5(`#+\Q\
+M``#X5`D/_D@``0PL!0``08(`$"P%``%!H@`D2```,($K``!5*:_^?2D`T'TI
+M_G!5*0>V.2D`#4@``-R``R_0:```"%0)[_Y(``#,.2``#$@``,2``R_@5``&
+MOD@``)R``R_@5`#&OD@``)`L!0`!08(`(#D@```H!0`!08``F#D@``PH!0`&
+M08$`C$@``!2``S`8:````50)!_Y(``!X2````3D@``$L`P``08(`:"@?``9!
+M@0!(/2```#DI`,17X!`Z?`D`+GP`2A1\"0.F3H`$((@#``E(```@B`,`#$@`
+M`!B(`P`-2```$(@#``M(```(B`,`"I`>```Y(```2```%'_E^WA_QO-X2```
+M`7QI&WA](TMX@`$`''P(`Z:#P0`0@^$`%#@A`!A.@``@E"'_Z'P(`J:3P0`0
+MD^$`%)`!`!Q\?QMX?-XS>'QJ&W@Y8P'@*`0`'4&!`;`](```.2D`_%2`$#I\
+M"0`N?`!*%'P)`Z9.@`0@+`8``$&"`!"``R_,9``(`$@``,2``R_,5``!1D@`
+M`+B`"P``.&```'0)``A!@@%P+`8``$&"`!"`'R_05``'N$@```R`'R_08```
+M!)`*+]!_X_MX.(```&"$@2"`JB_02```0#B```!@A*((2````6!E(``L'@``
+M0((`"%1E!.)_X_MX.(```&"$H@A(```4D-\!^#B```!@A(!(?,4S>$@```%(
+M``#D,2;__WP),1"0`R_<2```U"P&``!!@@`0@`,OS&0`@`!(```,@`,OS%0`
+M`'Z0"B_,2```L*@#+_1_Q@(4*!X`/T"!``@[P``_+`0`&D"B`!2`"B_@?\`#
+M>%0`!KY(```4@2HOX%4I!*Y7P,:^?`!+>)`*+^!_X_MX.(```&"$@.B`JB_@
+M2___=#A@```H!0`&0:$`9%2@$#I_X_MX/2```#DI``!\B0`N?,4S>$@```%(
+M``!$@`L``'`)"`!!@@`L+`8``$&"`!"``R_08```"$@```R``R_05``'=I`*
+M+]`X8``!2```$'_C^WA_QO-X2````8`!`!Q\"`.F@\$`$(/A`!0X(0`83H``
+M()0A__A\"`*FD`$`#$@```$Q(___?`D9$'P#`WB``0`,?`@#IC@A``A.@``@
+ME"'_Z'P(`J:3P0`0D^$`%)`!`!Q\?QMX+`0``$&"`'0X@$`$2````51E!!I_
+MX_MX.(!`!$@```$X8``*2````3O``"A_X_MX.(!`$$@```%T8``!08(`,#A@
+M`#)(```!?^/[>#B`0`1(```!5&4$&G_C^W@X@$`$2````3?>__]`@O_$.&``
+M`"P>``!!@@`L?^/[>#B```!@A(`$2````51E`YA_X_MX.(```&"$@`1(```!
+M.&```8`!`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A_^A\"`*FDZ$`#)/A`!20
+M`0`<?'\;>'R=(W@X@```8(2`!$@```%D90`$?^/[>#B```!@A(`$2````2P=
+M``!!H@`D?^/[>#B`0`1(```!5&4$&F2E``%_X_MX.(!`!$@```&``0`<?`@#
+MIH.A``R#X0`4."$`&$Z``""4(?_H?`@"II.A``R3X0`4D`$`''Q_&WA\G2-X
+M.(```&"$@`1(```!9&4`!'_C^W@X@```8(2`!$@```$L'0``0:(`)'_C^W@X
+M@$`$2````51E!!IDI0`"?^/[>#B`0`1(```!@`$`''P(`Z:#H0`,@^$`%#@A
+M`!A.@``@E"'_Z'P(`J:3H0`,D\$`$)/A`!20`0`<?)\C>'RD*WA\?AMX.Z``
+M`2P?``%!@@`D*!\``4&``!`L'P`"08(`'$@``"!+__WU?'T;>$@``!Q+__ZY
+M2```%$O__RU(```,.&```$@```R3_B^X?Z/K>(`!`!Q\"`.F@Z$`#(/!`!"#
+MX0`4."$`&$Z``""4(?_X?`@"II`!``PX@$`$2````51CA[Z``0`,?`@#IC@A
+M``A.@``@E"'_Z'P(`J:3X0`4D`$`'"P$``A!@@"D*`0`"$&!`"PL!``"08(`
+MH"@$``)!@0`0+`0``4&"`$1(``#(+`0`!$&"`&Q(``"\+`0!`$&"`)`H!`$`
+M08$`$"P$`"!!@@!T2```H"P$`@!!@@"`+`0$`$&"`(1(``",/2```#OI``"!
+M(Q(T+`D``$&"`("@"0`"<`E``$""`%2!(Q(TJ`D``BP```!`H`!D2```3#T@
+M```[Z0``2```5#T@```[Z0``2```2#T@```[Z0``2```/#T@```[Z0``2```
+M,#T@```[Z0``2```)#T@```[Z0``2```&#T@```[Z0``2```##A@``!(```0
+M?^3[>$@```%_X_MX@`$`''P(`Z:#X0`4."$`&$Z``""4(?_X?`@"II`!``PX
+M@``,2````8`!``Q\"`.F."$`"$Z``""4(?_X?`@"II`!``Q\A2-X.(``#$@`
+M``&``0`,?`@#IC@A``A.@``@E"'_^'P(`J:0`0`,.(``"#B@``1(```!@`$`
+M#'P(`Z8X(0`(3H``()0A_^A\"`*FDZ$`#)`!`!Q\?1MX.(``"#B@`"!(```!
+M?Z/K>#B```@XH``$.,```$@```$Q(___?`D9$'P#`WB``0`<?`@#IH.A``PX
+M(0`83H``()0A_^A\"`*FDZ$`#)`!`!Q\?1MX.(```&"$@$A(```!5&4&\G^C
+MZW@X@```8(2`2$@```%_H^MX2````7^CZW@X@``!2````8`!`!Q\"`.F@Z$`
+M##@A`!A.@``@E"'_Z'P(`J:3H0`,D`$`''Q]&W@X@```8(2`2$@```%@90`@
+M?Z/K>#B```!@A(!(2````7^CZWA(```!@`$`''P(`Z:#H0`,."$`&$Z``""4
+M(?_H?`@"II.!``B3H0`,D`$`''Q]&WA\@"-X?+PK>#B```!@A(!`?`4#>$@`
+M``%_H^MX.(```&"$@$1_A>-X2````8`!`!Q\"`.F@X$`"(.A``PX(0`83H``
+M()0A_^A\"`*FD\$`$)/A`!20`0`<?'X;>'R?(W@X8```*`0`/T&!`&PH!``?
+M0($`-'_#\W@X@```8(2`1$@```$X'__@.*#__ERE`#Y\92@X?\/S>#B```!@
+MA(!$2```+'_#\W@X@```8(2`0$@```$XH/_^7*7X/GQE*#A_P_-X.(```&"$
+M@$!(```!.&```8`!`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A_^A\"`*FD\$`
+M$)/A`!20`0`<?'X;>'R?(W@X8```*`0`/T&!`&PH!``?0($`-'_#\W@X@```
+M8(2`1$@```$X'__@.*```7RE`#!\92MX?\/S>#B```!@A(!$2```+'_#\W@X
+M@```8(2`0$@```$XH``!?*7X,'QE*WA_P_-X.(```&"$@$!(```!.&```8`!
+M`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A_^A\"`*FDZ$`#)/A`!20`0`<?'T;
+M>#B```!@A(`\2````7Q_&WA_H^MX.(```&"$@0Q(```!<&``($&"``AC_P(`
+M=&`"`D&"``AC_P$`?^/[>(`!`!Q\"`.F@Z$`#(/A`!0X(0`83H``()0A_^A\
+M"`*FDZ$`#)/!`!"3X0`4D`$`''Q]&WA\GR-X5(4&/CB```!@A(`\2````3O`
+M``!SX`(`08(`"#O``"!SX`$`08(`"&?>`@)_H^MX.(```&"$@0Q_Q?-X2```
+M`2P>``!!@@`8?Z/K>#B``#1(```!8&4`$$@``!1_H^MX.(``-$@```%490<T
+M?Z/K>#B``#1(```!@`$`''P(`Z:#H0`,@\$`$(/A`!0X(0`83H``(#@```"0
+M!``(5*`%/I`$``QPR0`@08(`#&``(`"0!``,.````)`$`!20!``0.&```4Z`
+M`""4(?_H?`@"II.!``B3H0`,D\$`$)/A`!20`0`<?'P;>'R]*WA]/TMX?)XC
+M>(`$`!0Y(``/<`L``4&"`42`!@`4<`D``4"B`!@X@``,2````3D@``]\`^@`
+M08(!)*`>`!)4``4^L!\``(`>`!14`(1^L!\``CD@``"9/P`$@!X`$%0`9CZ8
+M'P`&B!\`!BP``(!`H@`(F3\`!H`>`!1P"0$`08(`#%0`OGY(```(.`#__Y@?
+M``>`'@`05`"._I@?``B`'@`05``G/I@?``F`'@`05`"G_I@?``J`'@`4<`L`
+M`D""`)AP"0`$08(`$(@?``1@```!2```@(`>`!1P"P`008(`2(@?``1@```"
+MF!\`!(@>`!:8'P`%@3PP'"%I``!]*TD4:```!7P``-!4``_^?2L`.4&B`$1_
+M@^-X?^3[>$@```%(```T@!X`%'`)``A!@@`0B!\`!&````A(```8@!X`%'`+
+M`"!!@@`0B!\`!&```!"8'P`$.2```'TC2WB``0`<?`@#IH.!``B#H0`,@\$`
+M$(/A`!0X(0`83H``()0A_Z!\"`*FD<$`&)'A`!R2`0`@DB$`)))!`"B280`L
+MDH$`,)*A`#22P0`XDN$`/),!`$"3(0!$DT$`2)-A`$R3@0!0DZ$`5)/!`%B3
+MX0!<D`$`9'Q_&WA\F2-X?+XK>'S7,WA\^#MX?'H;>#N```"@!0`"<`D!`$&"
+M``QP"@"`2```%*`%``)4`,G^:````7`+``%`@@)\H!X``G`)`"!!@@`,<`H`
+M0$@``!2@'@`"5`#1OF@```%P"P`!0(("5'_C^W@X@```.*```4@```$X````
+M+`,``$&B#:Q_X_MX?\3S>$@```%\=!MX.2``#"P#``!!@@U\+!D`!D&"`"`H
+M&0`&08$`$"@9``%!@0($2```#"P9``A`H@'X.<```"P7``!!H@`L?^/[>#B`
+M$4!(```!?&X;>'_C^WA^A*-X2````7_C^W@X@```2````8%_`<QI8``'(2``
+M`'P)`11I:0`+(4D``'TJ211\"DMY0((`)"^+``I!G@`<+`L`"4&"`!1`G@!D
+MH!\!T"@```-!@0!8+!<``$&"`%"!?Q(T+`L``$&"`$2@'@``H2L``'P`2`!!
+M@@`TH!X``E0`!?:A*P`"52D%]GP`2`!`H@`<?^/[>'_$\WA(```!.````2P#
+M``!`@@R@?^/[>#B```!@A(!82````7QR&W@L`P``0((`"#I```%_X_MX.(``
+M`&"$@`1(```!='4"('_C^W@X@$`02````3P``/Y@``!@?',`.'_C^W@X@$`4
+M2````7QP&WA_X_MX.(!`&$@```%\;QMX?^/[>'\DRWA(```!?^/[>$@```%_
+MX_MX?\3S>$@```$Y(``#+`,``$&""_2@'@`"5``%]BP``4!!@@!408$`*"P`
+M`,!!@@!D08$`$"P``*!!@@!02```:"P``-!!@@!42```7"P`",!!@@!`08$`
+M#"P``5!(```0+``)0$&"`!`L``E008(`$$@``#0ZP``!2```"#K```(Z(``!
+M2```*#K```-(```0.L``!$@```@ZP``%.B```D@```PY(``,2``+7'_C^W@X
+M@```8(28`#B@``=(```!.Z```#T@```[:0``'!T`&'R;`"X<'0`&?`"R%%0`
+M$#I\NP`N?^/[>$@```$[G``!<X``/T"B``PX8``!2````3N]``$H'0`80('_
+MQ#N@```](```.VD``%>@&#A\FP`N+!<``$&"`#`])/__.`E_X"```!A\``$0
+M?```T#DI?RPA*0`(?2E)$'TI`-!\"D@Y08(`+%>I&#A]*=H4@*D`!'_C^WA(
+M```!.YP``7.``#]`H@`,.&```4@```$[O0`!*!T`PT"!_Y2`&BRL?`D#IG_C
+M^WA^Q+-X?B6+>'^&XWA.@`0AH!X``G`)0`!`@@`,<`J``$&B`!!_X_MX?\3S
+M>$@```&@'P'2*```04"A`1Q_X_MX.(```&"$F"P\H``"8*6@`D@```&@'@``
+M+``)M$"B`#").A*2H!H2G'T@2%`\`&9F8`!F9WP)`)9\``YP?2G^<'P)`%!\
+M"0<T2```((DZ$I(\`&9F8`!F9WP)`)9\``YP?2G^<'TI`%"@'@`"<```T"P`
+M`,!`H@`LB+H2DGRE`-!4I34R?`D`T%0`DAI\I0-X?^/[>#B```!@A)E,2```
+M%'_C^W@X@```8(293#B@``!(```!?^/[>#B```!@A*(H2````51E!>I_X_MX
+M.(```&"$HBA(```!?^/[>#B```!@A*(H2````51E!9Q@I0@`?^/[>#B```!@
+MA*(H2````7_C^W@X@```8(2`8#B@``](```!H!\!TB@``$)`H0`8?^/[>#B`
+M``!@A*)4.*```$@```%_X_MX.(```&"$F'@XH``.2````8`?`<PO@``*09X`
+M'"P```E!@@`40)X`9*`?`=`H```#08$`6*`>``!H"0F>(4D``'TJ211H``FC
+M(6```'P+`11]*0-X(`D``'^@211_X_MX.(```&"$HDQ(```!?`/H`$&"`!A_
+MX_MX.(```&"$HDQ_I>MX2````7_C^WA^A*-X.*$`"$@```$Y(``#+`,``$&"
+M"%@L&0`&08(`&(`?`@0L````0:(`#'_C^WA(```!5L4$/H`:++A\"0.F?^/[
+M>'Z$HW@XP0`(3H`$(3D@``,L`P``08((%*`>``)P"0!`08(`7(`?`<PO@``*
+M09X`*"P```E!@@`@0)X`$*`?`=`H```#0($`$*`:$G`H`%`"0($`(*`>``)P
+M``"@+```H$&"`!!_X_MX?H2C>$@```%_X_MX?\3S>$@```%_X_MX?H2C>$@`
+M``$Y(``#+`,``$&"!Y@L%P``0:(`%'_C^W@X@!%`?<5S>$@```&(NBPPB!HL
+M,50`0"Y\I0-XB!HL,E0`@!Y\I0-XB!HL,U0`P`Y\I0-X?^/[>#B```!@A(``
+M2````8BZ+#54I4`NB!HL-'RE`WA\I:MX@!HOS'RE`WADI0"`?^/[>#B```!@
+MA(`$2````7_C^WA_),MX2````8BZ+#R(&BP]5`!`+GRE`WB(&BP^5`"`'GRE
+M`WB(&BP_5`#`#GRE`WA_X_MX.(```&"$@.!(```!B+HL052E0"Z(&BQ`?*4#
+M>'_C^W@X@```8(2`Y$@```%_X_MX.(!`$$@```%\99MX?^/[>#B`0!!(```!
+M?^/[>#B`0!1^!8-X2````7_C^W@X@$`8?>5[>$@```%_X_MX.(```&"$@%A^
+M19-X2````8BZ+#:(&BPW5`!`+GRE`WB(&BPX5`"`'GRE`WB(&BPY5`#`#GRE
+M`WA_X_MX.(```&"$@`A(```!B+HL.U2E0"Z(&BPZ?*4#>'_C^W@X@```8(2`
+M#$@```%_X_MX.(```&"$@!B`NB_42````7_C^W@X@`"`.*#__T@```%_X_MX
+M?H2C>$@```$Y(``#+`,``$&"!="(GQ(X?^/[>#B@``%(```!?^/[>'_$\WA(
+M```!H3\!U%4I!C8Y*?_0*`D`/T&!`&"!/Q(TH`D``G`)0`!`@@`,<`J``$&B
+M`$B!/Q(TH`D``G`+0`!_H``F5[T?_CN]``Q_X_MX.(```&"$F"1(```!5&4`
+M-E>]!SY\I>MX?^/[>#B```!@A)@D2````7_C^W@X@```8(29%$@```%4?02^
+MH!X``G`)`"!!@@`<5ZD0.CP`NBY@`(NC?2D`%E4]X3Y(```4/`#,S&``S,U\
+M'0`65!WH_G_C^W@X@```8(28'#B@``%(```!@3\2-*`)``)7HP@\<`E``$""
+M`!R!/Q(TJ`D``CA]`&0L````0*``#%>C$#HX8P!D2````7_C^W@X@```8(28
+M"$@```%\?!MX?^/[>#B```!@A)@(.*`X`$@```$[H```2```##A@`,A(```!
+M?Z#K>#N]``$L```308$`''_C^W@X@```8(2<)$@```%P8``00(+_U'_C^W@X
+M@```8(28"'^%XWA(```!?^/[>#B```!@A)A@2````6!E``-_X_MX.(```&"$
+MF&!(```!H!X``G```*`L``"@08(`8(`:+\`L```"08(`5'_C^W@X@```8(29
+M($@```%@9?``?^/[>#B```!@A)D@2````7_C^W@X@```8(29($@```%D90`!
+M?^/[>#B```!@A)D@2````3@```%(```(.````)`:+\!_X_MX2````3N@```[
+M@``!5Z00.CB$$`!_A>@P?^/[>$@```$[O0`!+!T`"4"!_^0X````D!I&H#N@
+M``"@'P'H?!T``$"@`"!_X_MX?Z3K>$@```$[O0`!H!\!Z'P=``!!@/_H/```
+M"&``"660&BQ$+!D`!D"B`!`\```(8``999`:+$1_X_MX.(``H("Z+$1(```!
+M?^/[>#B``*Q(```!9&4`!W_C^W@X@`"L2````8`?$DPL````0:(`#'_C^WA(
+M```!?^/[>#B```!@A)A@.*```3C```!(```!?^/[>'\DRWA(```!?^/[>#B`
+M``!@A(`@2````51E`DQ_X_MX.(```&"$@"!(```!@!\!S"@```5!@0`8+```
+M!4"B`#R@'P'0*```!T"!`#!_X_MX.(```&"$@1@\H``!8*4`JD@```%_X_MX
+M.(```&"$@1PXH#(02````7_C^W@X@```8(2!"#B@`%)(```!H!X``G`)`0!!
+M@@`,B!H2CD@```B(&A*/?`4'='_C^WA_Q/-X2````7QC!W2`&B_@5`4&OJEZ
+M+_1]*RA0B!0`!GP`!W1\"0!`0($`"'R@6A2(%``%?``'=%0`"#Q]8P!0?`58
+M0$"!``RH&B_T?*L"%(`:+^!4"L:^J7HO]'TK4%"(%``&?``'='P)`$!`@0`(
+M?4!:%(@4``5\``=T5``(/'UC`%!\"EA`0($`#*@:+_1]2P(4@!HOX%0+AKZI
+M&B_T?2A84(@4``9\``=T?`D`0$"!``A]8$(4B!0`!7P`!W14``@\?&,`4'P+
+M&$!`@0`,J!HO]'UC`A0H!0`_0($`"#B@`#\H"@`_0($`"#E``#\H"P`_0($`
+M"#E@`#]4I0:^54!$KGRE`WA58(*>?*4#>'_C^W@X@```8(2`Z$@```&`NB_0
+M+`4``$&B`!1_X_MX.(```&"$@2!(```!@)HO^"P$__]!@@`,?^/[>$@```&`
+MFB_\+`3__T&"``Q_X_MX2````8":,``L!/__08(`#'_C^WA(```!@+\!^"P%
+M``!!H@`4?^/[>#B```!@A(!(2````9,_`=PL%P``08(`=(@4``1P"0`"0((`
+M#%0``#R8%``$H!0``K`>``*(%``$F!X`!(@4``68'@`%B!0`!I@>``:(%``'
+MF!X`!X%_$C0Y(```.4```)$K`#"12P`T@[\2-'_C^WA(```!D'T`*)"=`"Q_
+MX_MX.(```4@```$X```!2```&(`8```L````08(`")$X```X````?`,#>(`!
+M`&1\"`.F@<$`&('A`!R"`0`@@B$`)()!`"B"80`L@H$`,(*A`#2"P0`X@N$`
+M/(,!`$"#(0!$@T$`2(-A`$R#@0!0@Z$`5(/!`%B#X0!<."$`8$Z``""4(?_H
+M?`@"II/!`!"3X0`4D`$`''Q^&WB#XP($<^```T&B`"PX@```8(291$@```%4
+M90#"5^#HA'RE`WA_P_-X.(```&"$F41(```!<^``#$&"`$AP"0`$0((`''_#
+M\W@X@```8(2`T$@```%490>T2```&'_#\W@X@```8(2`T$@```%@90`<?\/S
+M>#B```!@A(#02````8`!`!Q\"`.F@\$`$(/A`!0X(0`83H``()0A__A\"`*F
+MD`$`#($C++1]*0.F3H`$(3$C__]\"1D0?`,#>(`!``Q\"`.F."$`"$Z``""4
+M(?_0?`@"II-!`!B380`<DX$`().A`"23P0`HD^$`+)`!`#1\?QMX?)LC>#O`
+M``%\>AMX2````7Q\&W@[H```H!\!Z'P=`$!`H``H?^/[>'^DZWA(```!+`,`
+M`$""`"0[O0`!H!\!Z'P=`$!!@/_@.````"P>``!!H@'P2```##O```!+___L
+M?^/[>#B```!@A)E\.*```4@```$[H```?^/[>#B```!@A)P@2````2P#``!`
+M@@`8.&``!4@```$[O0`!*!T`8T"!_]@X````*!T`8T&A`91_X_MX?X3C>$@`
+M``$X````+`,``$&B`7Q_X_MX.(```&"$F11(```!5&,$OJ`<``(](,S,82G,
+MS7TC2!95*>C^<`L`($&"`!A4:1`Z/`"Z+F``BZ-]*0`652GA/CAI`&1(```!
+M?^/[>'^$XW@XH0`(2````3@````L`P``0:(!%'_C^W@X@```8(29?#B@``!(
+M```!H!P``G`)`$!!@@!<@!\!S"^```I!G@`H+```"4&"`"!`G@`0H!\!T"@`
+M``-`@0`0H!H2<"@`4`)`@0`@H!L``G```*`L``"@08(`$'_C^WA_A.-X2```
+M`7_C^WA_9-MX2````7_C^W@X@```8(288$@```%@90`"?^/[>#B```!@A)A@
+M2````8@<``1P"0`"0((`#%0``#R8'``$H!P``K`;``*('``$F!L`!(@<``68
+M&P`%B!P`!I@;``:('``'F!L`!X%_$C0Y(```.4```)$K`#"12P`T@[\2-'_C
+M^WA(```!D'T`*)"=`"Q_X_MX.(```4@```$X```!?`,#>(`!`#1\"`.F@T$`
+M&(-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`,$Z``""4(?_H?`@"II/!`!"3X0`4
+MD`$`''Q^&WA\GR-X.(```&"$@`1(```!5&,$&BP?``%!@@"`08$`$"P?``!!
+M@@!$2```A"P?``9!@@`0+!\`"$&"`&!(``!P9&40`7_#\W@X@```8(2`!$@`
+M``%_P_-X.(``%$@```%490;R2```*&1E$`)_P_-X.(```&"$@`1(```!?\/S
+M>#B``!1(```!8&4`('_#\W@X@``42```%&1E$`!_P_-X.(```&"$@`1(```!
+M@`$`''P(`Z:#P0`0@^$`%#@A`!A.@``@E"'_^'P(`J:0`0`,.(```D@`!R&`
+M`0`,?`@#IC@A``A.@``@E"'_Z'P(`J:3X0`4D`$`''Q_&W@X@```.*```4@`
+M``$X````+`,``$&B`!1_X_MX.(``$T@`!ME\8!MX?`,#>(`!`!Q\"`.F@^$`
+M%#@A`!A.@``@E"'_V'P(`J:300`0DV$`%).!`!B3H0`<D\$`()/A`"20`0`L
+M?'X;>'R=(W@X@``32``&B3@````L`P``0:("A'_#\W@X@```.*```4@```$X
+M````+`,``$&B`FA_P_-X.(```$@`!E4X````+`,``$&"`E`L'0``08("1(`>
+M`<PO@``*09X`'"P```E!@@`40)X`-*`>`=`H```#08$`*#M```B@'0`"<`D`
+M($""`&QP``#0.V``!"P``,!`H@#42```6*$^`=15*08V.2G_T"@)`#]`@0`H
+M@!X!S&@)``<A:0``?2M)%&@```LA8```?`L!%'TK`WE!@@!0.T``"*`=``)P
+M"0`@0((`$'```-`L``#`0*(`##M@`.M(``!TH!T``CM@`>IP"4``0((`9*@=
+M``)\``#X?!O^<%=[`"P[>P+J2```3#M```"@'0`"<`L`($""`!!P``#0+```
+MP$"B``P[8`"K2```**`=``([8`&J<`E``$""`!BH'0`"?```^'P;_G!7>P`L
+M.WL"JJ`=``)P"P!`08(`('`)`"!`@@`0<```T"P``,!`H@`,8UH`!$@``!2@
+M'0`"<`D`0$""``AC6@`!H!T``G`+`0!`@@`(8UH``J`=``)P"0`0?^``)E?_
+M'_Y__P#05_\'^CO_``-_P_-X.(```&"$F'Q(```!?'P;>*`=``)P"0`@0((`
+M$'```-`L``#`0*(`5'_#\W@X@```8(28!'_E^WA(```!?\/S>#B```!@A*(`
+M?T73>$@```%\'-@`08(`<'_#\W@X@```8(28?']EVWA(```!.&`!+$@```%(
+M``!0?`/8`$&"`"!_P_-X.(```&"$F'Q_9=MX2````3A@`2Q(```!?\/S>#B`
+M``!@A)@$?^7[>$@```%_P_-X.(```&"$H@!_1=-X2````3@```%\`P-X@`$`
+M+'P(`Z:#00`0@V$`%(.!`!B#H0`<@\$`((/A`"0X(0`H3H``()0A_]A\"`*F
+MDP$`"),A``R300`0DV$`%).!`!B3H0`<D\$`()/A`"20`0`L?'T;>'R9(WA\
+MORMX?'H;>#@```"0!0``2````7Q\&W@X8```+!P``$&"`TB`'2_`:`D``B$)
+M``!]*$D4(4```'P*`11]*P-Y08(`##@```&0'P``@]HOP"P>``%`H@'$?Z/K
+M>#B```!@A)D@2````71C``%`@@&LD'HOP)/?```[P```?Z/K>#B```!@A)P0
+M2````7Q[&WA_H^MX.(```&"$G!1(```!?'\;>'^CZW@X@```8(2<&$@```%\
+M>!MX,1O__WP(V1`Q7___?2KY$'P+2#E`@@`T?Z/K>#B```!@A)D@2````61E
+M``%_H^MX.(```&"$F2!(```!.]X``2P>``E`@?^`5VGX?E?@^'Y]*0(452G)
+M_E?CR?XQ"?__?`A)$#E@``$L`P`!0:$`"#E@``!\"E@Y08(!8'P8`-!\'@=T
+M?]Y+UBP>_^!`@``,.\#_X$@``!`L'@`?0($`"#O``!]_^QN6.___@"P?__!`
+M@``,.^#_\$@``!`L'P`/0($`"#O@``]_H^MX.(```&"$F2!(```!5&4&Z%?`
+M+71\I0-X?Z/K>#B```!@A)D@2````7^CZW@X@```8(29($@```%490`T5^`&
+M_GRE`WA_H^MX.(```&"$F2!(```!?Z/K>#B```!@A)D@2````6!E"`!_H^MX
+M.(```&"$F2!(```!.````I`:+\`X```!D!P`$)O<`!2;_``52```?*`9``)P
+M``"@+```H$&"`&R`&B_`+````D"B`&"`'``0+````$"B`%1_H^MX.(```&"$
+MF2!(```!8&7P`'^CZW@X@```8(29($@```%_H^MX.(```&"$F2!(```!9&4`
+M`7^CZW@X@```8(29($@```$X```!D!HOP'^CZWA_A.-X2````:`<``)P"``"
+M0*(`J'^CZW@X@```8(288$@```%@90`"?Z/K>#B```!@A)A@2````:"9``)P
+M@`$`0((`(*$]`=15*08V.2G_T"@)`#]!@0!\<(@`0$&"`'2!?0',:6``!S%`
+M__]]*@$0?2!+>&EI``LQ2?__?0I)$'T)0WA\"$@Y08(`2"^+``I!G@!`+`L`
+M"4&"`#A`G@`0H!T!T"@```-`@0`H?Z/K>$@`)?5(```<H!D``F````*P&0`"
+MH!P``E0`!_JP'``".&```8`!`"Q\"`.F@P$`"(,A``R#00`0@V$`%(.!`!B#
+MH0`<@\$`((/A`"0X(0`H3H``()0A_^!\"`*FDZ$`%)/!`!B3X0`<D`$`)'Q^
+M&WA\GR-X?(`C>"P$``!`@@`(.`#__Y`!``B`'@',+```"4&"`!@L```*0*(`
+M%*`>`=`H```#08$`"%?_!S1_P_-X.(``#$@```%_P_-X.(!``'_E^WA(```!
+M.&``#T@```&``0`(5``'OI`!``A7_P>^?\/S>#B`0`!\!0-X?^;[>$@```%\
+M?1MX<^```4"B`&PX```48````9`!``B(H0`(.2$`"(@)``%4`$`N?*4#>(@)
+M``)4`(`>?*4#>(@)``-4`,`.?*4#>'_#\W@X@``42````7_#\W@X@```.*``
+M`4@```$L`P``0:(`$'_#\W@X@`#`2````7^CZWB``0`D?`@#IH.A`!2#P0`8
+M@^$`'#@A`"!.@``@E"'_^'P(`J:0`0`,.(```&"$F&1(```!5&-M_G!@`0!!
+M@@`,:&`!_WP#`/B``0`,?`@#IC@A``A.@``@H`0``E0`!?0L``#`08(`+$&!
+M`!`L``"@08(`&$@``"PL``%`0*(`)*`#$LQ(```0H`,2SD@```B@`Q+0L`4`
+M`#A@``%.@``@.&```$Z``""4(?_@?`@"II.A`!23P0`8D^$`')`!`"1\?1MX
+M?)XC>#B```!@A)A@2````3O@``!P8``"0*(`2'^CZWA(```!?'\;>'^CZWA_
+MQ/-X.*$`"$O__V$L`P``08(`'*@!``A\`/@`0(``%*`>``)@```"L!X``CO@
+M``"S_@`6?^/[>(`!`"1\"`.F@Z$`%(/!`!B#X0`<."$`($Z``""4(?_H?`@"
+MII.A``R3P0`0D^$`%)`!`!Q\?AMX?'T;>(`#`>!T"2``0:(`E#B`!"`XH``!
+M2````7_#\W@X@`8`.*```$@```%_P_-X.(`&`$@```%@90`(?\/S>#B`!@!(
+M```!?\/S>#B`!@0\H``08*4"`4@```%_P_-X.(`&(#B@``!(```!.^```'_#
+M\W@X@`0`?^7[>$@```%]/^H4B*DO.'_#\W@X@`0$2````3O_``$L'P!_0('_
+MU(`!`!Q\"`.F@Z$`#(/!`!"#X0`4."$`&$Z``""4(?_H?`@"II/!`!"3X0`4
+MD`$`''Q_&WA\GB-X.&```#CE__]4Y^C^.*7__U2E!WY\B"-X.8```"P$``!`
+M@0!L.(```53&&#A]14(4*`H`"$"!``@Y0``(?(E0,#DI__]\BR@P.6O__WTI
+M6GA]*3`P5.`0.GP?`"Y]*0`X?2DT,'TI+#!]*6`P?&-+>'P%4%!]C`(4?`@J
+M%#B@```XYP`!-0#_^$&!_Z1_Q/-X2````8`!`!Q\"`.F@\$`$(/A`!0X(0`8
+M3H``()0A_]A\"`*FDV$`%).!`!B3H0`<D\$`()/A`"20`0`L?'T;>'R<(WA\
+M>QMXH`4``E0`!?0L``#`08(`+$&!`!`L``"@08(`&$@``+PY(```+``!0$&"
+M`!1(``"L.2```4@```@Y(``"52D(/'TIVA2CR1+JH`D2\%0`,#)_W@-XH`D2
+M]E0`8"9_W@-XH`D2_%0`D!I_W@-XH`D3`E0`P`Y_W@-XH^D3"*`)$PY4`#`R
+M?_\#>*`)$Q14`&`F?_\#>*`)$QI4`)`:?_\#>*`)$R!4`,`.?_\#>"P<``%!
+M@@`8*!P``4&``"@L'``"08(`$$@``!1_W_-X2```%'_^^WA(```,.&```$@`
+M`'A\'_``0*(`''^CZW@X@```8(2B"$@```%4903B2```&'^CZW@X@```8(2B
+M"$@```%@92``?Z/K>#B```!@A*((2````9.;+[Q_H^MX.(```&"$F6!_Q?-X
+M2````7^CZW@X@```8(299'_E^WA(```!.&```8`!`"Q\"`.F@V$`%(.!`!B#
+MH0`<@\$`((/A`"0X(0`H3H``()0A__"``P',+P``"D&:`&0L```)?2``)I$A
+M``A!@@!40)H`$*`#`=`K@``#0)T`1(`#`<QH"0`'(6D``'TK211H```+(6``
+M`'P+`11]*P-X+XL``$">`!RA(P'452D&-CDI_]`Y8``@*XD`/T&=``@Y8``H
+MH20``'P)6Y9\`%G6?2!(4#`)__]\8$D0.2G_]B$I``Q]*4D0?2D`T'QC2#@X
+M(0`03H``()0A_\A\"`*FDL$`$)+A`!23`0`8DR$`')-!`""380`DDX$`*).A
+M`"R3P0`PD^$`-)`!`#Q\?QMX?)LC>'Q^&WB@!``"5!G/_E0`!?8L``%`08(`
+M4$&!`"@L``#`08(`Z$&!`!`L``"@08(`U$@``.`L``#008(`T$@``-0L``C`
+M08(`Q$&!``PL``%02```$"P`"4!!@@`,+``)4$"B`+`ZX```H3\!U%4I!C8Y
+M*?_0*`D`/T"!`*"!?P',:6``!S$@__]]"0$0?0!#>&EI``LQ"?__?4A)$'U)
+M4WA\"D@Y08(`="^+``I!G@!L+`L`"4&"`&1`G@`0H!\!T"@```-`@0!4?^/[
+M>#B```!@A)E$2````51E!W*!/BPLJ`D``%0`'KA\I0-X?^/[>#B```!@A)E$
+M2````4@``!PZX``!2```%#K@``)(```,.&```$@``]Q_X_MX.(```&"$F1!(
+M```!.`#\!GQE`#A6_0@\?[WR%*`=$N14`"`V?*4#>&"E``%_X_MX.(```&"$
+MF1!(```!?^/[>(">+[Q_9=MX2````:"]$LQ4I07^8*4"`'_C^W@X@```8(29
+M:$@```&@'A)P*`!/_T"!`$"@&P`"<`@`$$&"`#17*0@\?2GR%#E)$T"CJ@`$
+M?7GR%(@+$TQ\'`=TB`L33GP:!W2C"@`(HLD34$@``#A6Z0@\?2GR%*.I$J)]
+M-_(4B`D2QGP<!W1].?(4B`D2R7P:!W17*0@\?2GR%*,)$JBBR1,R?^/[>#B`
+M``!@A)A$2````51E!F)7H#RP?*4#>'_C^W@X@```8(281$@```%_X_MX.(``
+M`&"$F%!(```!5&4`+E>`!CY\I0-X?^/[>#B```!@A)A02````7_C^W@X@```
+M8(284$@```%4908>5T!$+GRE`WA_X_MX.(```&"$F%!(```!?^/[>#B```!@
+MA)A(2````51E!1I7`&.F?*4#>'_C^W@X@```8(282$@```%6_0@\?[WR%#N=
+M$K"@'``*5`7`#E0`@!Y\I0-XH3T2P%4@0"Y\I0-X?*5+>'_C^W@X@```8(28
+M-$@```%_X_MX.(```&"$F"A(```!5&4&'J`=$JY4`$`N?*4#>'_C^W@X@```
+M8(28*$@```%_X_MX.(```&"$F&1(```!5&4%&*`<``14`&-F?*4#>'_C^W@X
+M@```8(289$@```$[H``"H!X2<"@`,`)!@0`DH!\!RBP`$")`H@`\H!L``G`(
+M`$!!@@`P.Z``"$@``"A_X_MX?V3;>$@```$L`P``08(`%%;I"#Q]*?(4H`D3
+M)G^]`A1_X_MX.(```&"$F21(```!5&4'[E>@#CQ\I0-X?^/[>#B```!@A)DD
+M2````8`;`!`L````08(`&(@;`!1\'0=TB!L`%7P<!W1(```85RD(/'TI\A0Y
+M*1.PHZD`!J.)``I_X_MX.(```&"$F2!(```!5&4&Z%>@+71\I0-X?^/[>#B`
+M``!@A)D@2````7_C^W@X@```8(29($@```%490`T5X`&_GRE`WA_X_MX.(``
+M`&"$F2!(```!?^/[>#B```!@A)D@2````6!E"`!_X_MX.(```&"$F2!(```!
+MH3X2<"@)0`!`@0!(H!L``G```-`L``#00((`#"@)3_]`@0`P?^/[>#B```!@
+MA*(,2````51E`XY6P)(:?*4#>'_C^W@X@```8(2B#$@```&@'A)P*`!0`$"A
+M`!A_X_MX.(```&"$F>`XH```2````3A@``&``0`\?`@#IH+!`!""X0`4@P$`
+M&(,A`!R#00`@@V$`)(.!`"B#H0`L@\$`,(/A`#0X(0`X3H``()0A_Y!\"`*F
+MDD$`.))A`#R2@0!`DJ$`1)+!`$B2X0!,DP$`4),A`%2300!8DV$`7).!`&"3
+MH0!DD\$`:)/A`&R0`0!T?'P;>'R9(W@ZP```.N```#@```"0`0`(D`$`#)`!
+M`!"0`0`4.F```#J````Z0```/6```#DK"'B`"0`$D`$`+(`+"'B0`0`H/2``
+M`#EI"("`"0B`H2L`!)`!`!BQ(0`<H\0``J$D``!7WL__08(`$!TI``HY*:8H
+M2```#!TI``HY*4"853@$/J`9`#A\'P-X+````$""`(A(```,?'\;>$@``'@[
+MX```8_^``#D@`%>@&0`"<`L`$$&"``@Y(`"N.Z```#M@``!C>X``?TG`4'ZX
+M2A2`'`'$?`D#IG^#XWA_I.MX?\7S>$Z`!"%\`]@`08(`*%1C!+Y\&A@`08$`
+M#'P5&`!`H/^8.!T``50=!#XH'0`$0('_P+/Y`#@X````8`"``'P?``!`H@&<
+M?X/C>#B```!@A)D@2````71@0`!!H@54?X/C>#B```!@A)D,2````51E`CY_
+M@^-X.(```&"$F0Q(```!?X/C>#B```!@A)D@2````51E`0!_@^-X.(```&"$
+MF0Q(```!?X/C>#B```!@A)F@.*```$@```%_@^-X.(```&"$F8`XH```2```
+M`7^#XW@X@```8(29A$@```%490`6?X/C>#B```!@A)F$2````7^#XW@X@```
+M8(29F#B@``!(```!?X/C>#B```!@A)F<2````51E`!9_@^-X.(```&"$F9Q(
+M```!?X/C>#B```!@A)D`.*```$@```%_@^-X.(```&"$F00XH```2````7^#
+MXW@X@```8(29"#B@``!(```!?X/C>#B```!@A)D,2````51E`")_@^-X.(``
+M`&"$F0Q(```!?X/C>#B```!@A)F(.*```$@```%_@^-X.(```&"$F8PXH```
+M2````7^#XW@X@```8(29D#B@``!(```!?X/C>#B```!@A)F42````51E`")(
+M``/$?7CX4*`9``)4``7V+```T$&"`(Q!@0`0+```P$&"`$!(``"@+``!0$&"
+M`!`L``%008(`;$@``(Q5=(@</`!1ZV``A1]\%`"6?``><'Z)_G!^B0!0?I)6
+M<$@``#Q5<D`N/``)3V``()5\$@"6?``.<'Y)_G!^20!0572('#P`4>M@`(4?
+M?!0`EGP`'G!^B?YP?HD`4#I@##5(```H572`'CP`4>M@`(4??!0`EGP`'G!^
+MB?YP?HD`4'Z25G`Z8!AJ'`L#Z%0`(#9\`)O6.4``!#D!`"AP"0`/0((`##E`
+M``,Y`0`8.Z```'P=4`!`@`$H?`LF<#C@``$L"P`<08$"U'TKZA0Y*0`9*`D`
+M($&!`"A\X$@P+`D`&4"!`!0L"0`:0($`*#@)__]\X``P?!:S>$@``!@X"?_?
+M*```$T&!``Q\X``P?!>[>#@)``$H```/08$`*%>@"#Q\"`(N52D(/#DI``)\
+M`$@P@2$`"'P`2WB0`0`(2```D#@)__$H```/08$`*%>@"#Q\"`(N52D(/#DI
+M_^)\`$@P@2$`#'P`2WB0`0`,2```8#@)_^$H```/08$`*%>@"#Q\"`(N52D(
+M/#DI_\)\`$@P@2$`$'P`2WB0`0`02```,#@)_]$H```&08$`)%>@"#Q\"`(N
+M52D(/#DI_Z)\`$@P@2$`%'P`2WB0`0`4.!T``50=!#Y\'5``08#^Z'^#XW@X
+M@```8(29#$@```%D9?\`?X/C>#B```!@A)D,2````7^#XW@X@```8(29($@`
+M``%D97``?X/C>#B```!@A)D@2````59%H)96@`,^?*4#>&2E0`!_@^-X.(``
+M`&"$F:!(```!?X/C>#B```!@A)F`?L6S>$@```%_@^-X.(```&"$F81(```!
+M5&4`%E;]`SY\I>MX?X/C>#B```!@A)F$2````7^#XW@X@```8(29F'[%LWA(
+M```!?X/C>#B```!@A)F<2````51E`!9\I>MX?X/C>#B```!@A)F<2````7^#
+MXW@X@```8(29`("A``A(```!?X/C>#B```!@A)D$@*$`#$@```%_@^-X.(``
+M`&"$F0B`H0`02````7^#XW@X@```8(29#$@```%490`B@`$`%%0`!+Y\I0-X
+M?X/C>#B```!@A)D,2````7^#XW@X@```8(29B("A``A(```!?X/C>#B```!@
+MA)F,@*$`#$@```%_@^-X.(```&"$F9"`H0`02````7^#XW@X@```8(29E$@`
+M``%490`B@`$`%%0`!+Y\I0-X?X/C>#B```!@A)F42````8`!`'1\"`.F@D$`
+M.()A`#R"@0!`@J$`1(+!`$B"X0!,@P$`4(,A`%2#00!8@V$`7(.!`&"#H0!D
+M@\$`:(/A`&PX(0!P3H``()0A_^A\"`*FDX$`").A``R3X0`4D`$`''Q_&W@_
+MH&0`H`0``G`)`!!!@@`(/Z#(`*`$``)P"4``08(`#%>]^'Y(```4J`0``BP`
+M``!`H``(5[WPOJ`$``!\G0.6.X``'WR`Y#!P"0`!0((`##><__]`@O_P(YP`
+M)B`<`!<[H``!?[T`,'^DZA0@'``8?[T$,#N<__!_X_MX.(```&"$F!1(```!
+M5&4#_E>]B!Q\I>MX?^/[>#B```!@A)@42````7_C^W@X@```8(28%$@```%4
+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
+M00`XDV$`/).!`$"3H0!$D\$`2)/A`$R0`0!4?)XC>'R_*WA\W3-X?/<[>#E`
+M``!\"C``0(``*#D!``A52P@\'2H`"GTI^A2@"0`(?`M#+CE*``%\"N@`08#_
+MY*!^```X@0`(?Z7K>#C!`!@XX0`:2````3L@```[````.4```'P9Z`!`@`!(
+M.0$`"*%A`!BA(0`:54`(/'P(`BY\"P``0*(`"%58!#Y50`@\?`@"+GP)``!`
+MH@`,55D$/D@``!`Y2@`!?`KH`$&`_\R@?@``HV$`&*-!`!H?&``*?YCZ%*#<
+M``8?.0`*?[GZ%*#]``9_9-MX?T73>$O__H6P=P`&H'X``*#<``2@_0`$?V3;
+M>']%TWA+__YIL'<`!*!^``"@W``"H/T``G]DVWA_1=-X2__^3;!W``*@?@``
+M?-CZ+GSY^BY_9-MX?T73>$O__C&P=P``@`$`5'P(`Z:"X0`L@P$`,(,A`#2#
+M00`X@V$`/(.!`$"#H0!$@\$`2(/A`$PX(0!03H``(!QC`&14I0@\?60J%*`$
+M```=(`!D.2G_]GP#2$!!@``8H`O__AT@`&0Y*0`*?`-(0$"!`"2P!P``L`8`
+M`$Z``""@!```L`8``*`$``*P!P``3H``('P$6$!,@``@?&H'-*`$``!\"0<T
+M'2D`9'TJ2%`Y*0`)*`D`$D"A_[RA)``"'2D`9#DI__9\`TA`0:#_M#B$``)\
+M!%A`3(``($O__\0Y8RP0H2,!U%4I!C8Y*?_0*`D`/T&!`#P](```@`D`!)`#
+M+!`<```D/2```#DI``A\`$H4D`L`'#@```&0"P`8.```%)`+``PX``!52```
+M.#T@``"`"0`$D`L``!P``"0](```.2D`"'P`2A20"P`<.````9`+`!@X```4
+MD`L`##@``".0"P`03H``()0A_^A\"`*FD^$`%)`!`!Q\GR-XH2,!U%4I!C8Y
+M*?_0*`D`/T&!`$R!8RRP?6D#ICB```=.@`0A.(```3B@`"0XP```2__>D3D`
+M```Y(`!K.4```#E@`&LL`P`!0*(`A#D@`%,Y8`!3.```-T@``'"``RRP?`D#
+MICB```=.@`0A.(``!CB@`"4XP```2__>23D````Y(P`$+`,`/T"B``@Y(``R
+M?0I#>"P#`#]!@@`(.4``0#EJ`#)]`$-X+`,`/T"B``@X"``4D!\`##@+__$L
+M`P`_08(`"#@+``60'P`0@)\`!#A@``!\""`0?``!$'P``-!])$@0?2E)$'TI
+M`-!\"$MY08(`*'P*(!!\``$0?```T'TD6!!]*4D0?2D`T'P+2WE!@@`(.&``
+M`8`!`!Q\"`.F@^$`%#@A`!A.@``@E"'_Z'P(`J:3H0`,D`$`''Q]&WBHHR_T
+M@`,O\'RE`A14I4QL8*6``#B```!@A)DP2````3@```&0'2_$@`$`''P(`Z:#
+MH0`,."$`&$Z``""4(?_H?`@"II.!``B3H0`,D\$`$)/A`!20`0`<?'\;>'Q]
+M&W@[PRP0@!X`&#A@```L````08(!`(`?+\0L```!0*(`\'_C^W@X@```8(29
+M,$@```%P8(``0((`V%1I/GZ1/@`$5&!/OBP```)`H@`LH!\!TB@``$%`@0`4
+MH!\2FGP`2A20'@`$2```$($^``0Y*0`%D3X`!*$]`=15*08V.2G_T"@)`#]!
+MH0`L?Z/K>$@``E&!/@`$@!X`%'P)`$!!@``,?`!(4$@```@X````D!X`!#@`
+M``"0'R_$?Z/K>'_$\WA+__V-?'P;>"P#``!`H@!`?Z/K>'_$\WA(``!9+`,`
+M`$&B`"Q_H^MX?\3S>$@``&TL`P``0($`&#@```*0'R_$.````9`?+]B3GR_`
+M@'\OQ(`!`!Q\"`.F@X$`"(.A``R#P0`0@^$`%#@A`!A.@``@.&```($D``2`
+M!``,?`D`0$"!`!"`!``0?`D`0$V``"`X8``!3H``(*$C`=15*08V.2G_T#U@
+M```Y"P``*`D`/T"!``P](```.0D``(%D```=*P`D?2A*%#DI``B1)``<@20`
+M!(`$`!!\"0!`08``B#A@__\L"P``38(`(($D``21)``(@`0`$'P'`WA\"0!`
+M08``7(`$```L````08(`4($D```Y2?__D40``!UJ`"1]:T(4@20`'(`+`!B!
+M*0`0?`D`4%0`"#R!)``(?2!(4)$D``@Y:P`(D60`''P).$!!@``,+`H``$""
+M_[@X8``!3H``(($D``2`!``,.&```'P)`$!-@0`@@2@``#DI__^`!```.&#_
+M_GP`2`!-@@`@@20`!)$D``B`!``,?`<#>'P)`$!!@0!P@2@``#DI__^`!```
+M?`L#>'P`2$!`@`!8.4L``9%$```=:@`D?6M"%($D`!R`"P`8@2D`$'P)`%!4
+M``@\@20`"'T@2%"1)``(.6L`")%D`!Q\"3A`08$`&($H```Y*?__?4M3>'P*
+M2$!!@/^P.&```DZ``""4(?_H?`@"II.A``R3P0`0D^$`%)`!`!Q\?QMX.\,L
+M$#@```"0'@`4@`,LL'P)`Z8X@``'3H`$(3B```$XH``D.,```$O_V@$L`P`!
+M0*(`>($^`!RKJ0``@!\LL'P)`Z9_X_MX.(``!TZ`!"$X@``$.*``(#C```!+
+M_]G-+!T``4&"`"0X````*!T``4&``#0L'0`"08(`&"P=``-!@@`@2```))!^
+M`!1(```<5&D(/#DI__N1/@`42```#%1@"#R0'@`4@`$`''P(`Z:#H0`,@\$`
+M$(/A`!0X(0`83H``()0A_^A\"`*FDX$`").A``R3P0`0D^$`%)`!`!Q\?QMX
+M?+TK>'S<,WA\_CMX?(,C>'RD*WA(```!.1S__U4(Z/X[G/__5YP'?G^]ZWE`
+M@0!P.,```5?'&#A\'.H4+```"$"!``@X```(?,L`,#EK__]\R>`P.2G__WUK
+M2GA]:S@P50H0.GTJ^"Y]*5AX?&#@,'P`.#!\`%@X?`!+>'P*^2Y]/>(4(!P`
+M"'QC!#`[@```.0@``3>I__A!@?^@@`$`''P(`Z:#@0`(@Z$`#(/!`!"#X0`4
+M."$`&$Z``""4(?_8?`@"II-A`!23@0`8DZ$`')/!`""3X0`DD`$`+'Q\&WA\
+MFR-XH`0``G`)0`!!H@`,.(`"`$@``#2H!``"+````$"@``PX@`0`2```(*`$
+M``)P"0`0?(``)E2$'_Y\A`#05(0&/#B$``)(```!?'\;>#O```"``P``?!X`
+M`$"@`%0?O@`,?[WZ%#N]`""(W0`+?X/C>'_D^W@XH``...```$@```%\91MX
+MB)T`"%2$$#H\A``!.(2'`'^#XWA(```!.]X``8`?``!\'@``08#_M*`;``)P
+M"0`00*(`P'^#XW@X@``(2````7Q_&W@[P```@`,``'P>``!`@`"@'3X`#'TI
+M^A0[J0`@B3T`"%4I$#H]*0`!.VF'`(@=``4L````0*(`:(C=``M_@^-X?^3[
+M>#B@``XXX```2````7QE&WA_@^-X?V3;>$@```&('0`)+````$&B`#14`!`Z
+M?WL"%(C=``M_@^-X?^3[>#B@``XXX``!2````7QE&WA_@^-X?V3;>$@```$[
+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
+M```!.&```8`!``Q\"`.F."$`"$Z``""4(?_H?`@"II.A``R3P0`0D^$`%)`!
+M`!Q\?1MX?)XC>%2$$#HXA`H`2````7!_``-`H@`D?Z/K>#B`"$!(```!.```
+M`7P`\#!\:0`Y08(`"#O@``%_X_MX@`$`''P(`Z:#H0`,@\$`$(/A`!0X(0`8
+M3H``()0A_]A\"`*FDV$`%).!`!B3H0`<D\$`()/A`"20`0`L?'\;>'R>(W@X
+MH``!?*4@,#B`"(!(```!.V`#Z'_C^WA_Q/-X2````2P#``!!@@`4.&``9$@`
+M``$W>___0(+_X'_C^WA_Q/-X2````2P#``!!@@%<@7\!S&E@``<A(```?`D!
+M%&EI``LA20``?2I)%'P*2WE`@@`D+XL`"D&>`!PL"P`)08(`%$">`22@'P'0
+M*````T&!`1@[@```?^/[>#B```!@A(!,2````7Q]&WA_X_MX.(```&"$@0`\
+MH``*8*4`9$@```%7O;*^5Z4$/F2E``%_X_MX.(```&"$@/Q(```!?^/[>#B`
+M``!@A(!,2````51CLKY\`^@`08(`$#N<``$H'``!0('_E'_C^W@X@```8(2`
+M2$@```%D90!`?^/[>#B```!@A(!(2````3A@`,A(```!?^/[>#B```!@A(#\
+M2````51E!!Q_X_MX.(```&"$@/Q(```!.Z``9$@``!0WO?__08(`(#A@``I(
+M```!?^/[>'_$\WA(```!+`,``$""_^!_X_MX.(```&"$@$A(```!5&4"D'_C
+M^W@X@```8(2`2$@```%_X_MX.(`(@#B@``!(```!,!O__WQ@V1"``0`L?`@#
+MIH-A`!2#@0`8@Z$`'(/!`""#X0`D."$`*$Z``""4(?_HDX$`").A``R3P0`0
+MD^$`%'T^2WA]7U-X@Z$`((&!`"B#@0`LJ`,O]'T(`A0H"``_0($`"#D``#]4
+MH`4^50F`'GP`2WA5B9(0?2D#>(`!`"14`,C,?2D#>'&```%!@@`(92D!`%6&
+MR(1\QDMXD,0`"%3@H!:!00`\54K(#(%A`#15:^@$@2$`.%4IV`A5B+G.?`!3
+M>'P`6WA\`$MX?0@#>)$$``Q7Z8,>58!,('P`2WB0!``0D\0`%"P=__]!@@`8
+M5Z!K)'P`0WB0!``,9,!``)`$``AQB0`,08(`;#P`?P!@`/\`?`#F,#A@``!P
+M"0`!08(`6'&```A](``F52D?_GTI`-!5*0``/2F``%6`HE)\`$MX@20`"'P`
+M2WB0!``(@`$`,%0`!'Z!)``0?`!+>)`$`!!7@*`6@20`%'P`2WB0!``4.&``
+M`8.!``B#H0`,@\$`$(/A`!0X(0`83H``('TK2W@L!@``08(`*%3`HA:!)``0
+M?`!+>&``@`"0!``05*`H-($D`!1\`$MXD`0`%"P(``!!@@`H50#!#H$D`!!\
+M`$MX8`"``)`$`!!4X%`J@20`%'P`2WB0!``4+`H``$&"`"A50.`&@20`$'P`
+M2WA@`(``D`0`$%5@>""!)``4?`!+>)`$`!0X8``!3H``((`$``AD`"``D`0`
+M"$Z``"`L!@``08(`)($D``PA9P``?`LY%%0`8"9]*2MX?`!+>)`$``Q(``!$
+M+`<``$&"`"0X````D`0`")"D``R`"``0D`0`$(`(`!20!``42```'#D@``"1
+M)``(8*`0`)`$``R1)``0D20`%#@```"0!``<D`0`&#A@``%.@``@@`0`'#A@
+M``]P"0`!38(`((`$`!Q4`/T^L`4``*`$`!BP!0`".````)@%``2`!``8<`D`
+M`4""`$1P"0`"08(`##@```&8!0`$@`0`&'`)``A!@@`0B`4`!&````*8!0`$
+M@`0`&'`)``1!@@`0B`4`!&````28!0`$@`0`'%0`7[Z8!0`+B`4`"RP```%!
+M@@`T08$`$"P```!!@@`<2```4"P```)!@@`H+````T&"`"Q(```\B`0`%U0`
+M!OY(```L@`0`%%0`WOY(```8@`0`%%0`MOY(```,@`0`%%0`COYD`/__8`#_
+M@)@%``6`!``<5`">/I@%``:`!``85`#G/I@%``>`!``85`#'/I@%``B(!0`+
+M+````D&"`#!!@0`0+````4&"`#A(``!(+````T"B`$"!)``052E'/H@%``A\
+M`$H4F`4`"($D`!!5*6<^B`4`"'P`2A28!0`(@20`$%4IASZ(!0`(?`!*%)@%
+M``B`!``85`"G/I@%``F`!``<=`D!`'P``"94`!_^(````I@%``HX8```3H``
+M((`$``"!(T:@?`!(.)`$``"!(T:@?2``>)`#1J!.@``@E"'_Z'P(`J:3H0`,
+MD`$`''Q]&W@X@RR$2````7^CZW@X@```8(2!)#B@``!(```!?Z/K>#B```!@
+MA($H.*```$@```%_H^MX.(``0#B@``!(```!?Z/K>#B```!@A($P/*```D@`
+M``%_H^MX.(```&"$@3@\H`(`2````8`!`!Q\"`.F@Z$`##@A`!A.@``@E"'_
+MZ'P(`J:3H0`,D`$`''Q]&W@X@`!`.*``!D@```$XG2R$?Z/K>$@```%_H^MX
+M.(```&"$@20XH```2````7^CZW@X@```8(2!*#B@``!(```!@`$`''P(`Z:#
+MH0`,."$`&$Z``"!\:AMX.6```!TK`%A]*5(4H2DP**`$``!]8UMX?`D``$V"
+M`"`=*P!8?2E2%#DI,""@"0`(+````$"B`"2@!```L`D`"*`$``*P"0`*B`0`
+M!)@)``Q]8UMX3H``(#EK``$X8```*`L`/TV!`"!+__^<@&,P)$Z``""4(?_H
+M?`@"II.A``R0`0`<?'T;>#B#+(1(```!.[TL2'^CZWB``0`<?`@#IH.A``PX
+M(0`83H``()0A_]A\"`*FDT$`$)-A`!23@0`8DZ$`')/!`""3X0`DD`$`+'Q^
+M&WA\FB-X?'\;>(`#`>!4`,_^D`,P'#AC,"@X@!8`2````3E````[8``'.X``
+M`CN@`?0XX`#(.8``9#A@`"@X@``'.0```#R@`+]@I?X,/,``OV#&_SB`'@',
+M*```!D&!`!0=*@!8?2GZ%)MI,#!(```0'2H`6'TI^A2;B3`P'`H`6'U@^A0Y
+M*S`PDZD`#)#I`!"0Z0`4.2LP0)&)``B0:0`0D(D`##DK,""9"0`4F0D`%8@)
+M`!"8"0`2F0D`$X`?,!PL````08(`$#DK,&"0J0`,D,D`$#E*``$H"@`_0('_
+M>(`?,!PL````0:(`-'_#\W@X@```8(2!+("_,&Q(```!?\/S>#B```!@A($T
+M@+\P<$@```%_P_-X2````3@``&20'S`@+!H``$&"`!"`'S`88````4@```R`
+M'S`85```/)`?,!B``0`L?`@#IH-!`!"#80`4@X$`&(.A`!R#P0`@@^$`)#@A
+M`"A.@``@E"'_Z'P(`J:3X0`4D`$`''Q_&WB``S`<+````$&B`#!(```!?^/[
+M>#B```!@A($L.*```$@```%_X_MX.(```&"$@30XH```2````8`!`!Q\"`.F
+M@^$`%#@A`!A.@``@E"'_<'P(`J:380!\DX$`@).A`(23P0"(D^$`C)`!`)1\
+M?QMX?'X;>(.#,"0X8```*`0`!D&!!D@](```.2D`9%2`$#I\"0`N?`!*%'P)
+M`Z9.@`0@?+LK>#A@```H!0`$0:$&''_C^W@X@```8(284$@```%490,&5WT0
+M.G^]^A2`'48H5`"A%GRE`WA_X_MX.(```&"$F%!(```!?^/[>#B```!@A)A<
+M2````51E!F"`'4905``\<'RE`WA_X_MX.(```&"$F%Q(```!?^/[>#B```!@
+MA)A<2````51E!%*`'48\5`!ZH'RE`WA_X_MX.(```&"$F%Q(```!?^/[>#B`
+M``!@A)A82````51E`XJ`'49D5`"1FGRE`WA_X_MX.(```&"$F%A(```!B!P`
+M"7P;`$!`@0`4@3\L2#DI``&1/RQ(2```'(@<``E\&P!`0(``$($_+$PY*0`!
+MD3\L3)M\``E(``44/2```#DI``"!20`$@2D``)$A`#B100`\/2```#DI``B!
+M20`$@2D``)$A`$"100!$/2```#DI`!"!20`$@2D``)$A`$B100!,/2```#DI
+M`!B!20`$@2D``)$A`%"100!4/2```#DI`""!20`$@2D``)$A`%B100!</2``
+M`#DI`"B!20`$@2D``)$A`&"100!D,`7__W]@*1!_X_MX.(```&"$F&Q(```!
+M5&4$E%=]$#HY(0`X?!U(+E0`<N)\I0-X?^/[>#B```!@A)AL2````7_C^W@X
+M@```8(28;$@```%490+&.2$`0'P=2"Y4`*D4?*4#>'_C^W@X@```8(28;$@`
+M``%_X_MX.(```&"$F&A(```!5&4#SCDA`$A\'4@N5`"*''RE`WA_X_MX.(``
+M`&"$F&A(```!?^/[>#B```!@A)AH2````51E`@`Y(0!0?!U(+E0`P$Y\I0-X
+M?^/[>#B```!@A)AH2````7_C^W@X@```8(28:$@```%490`T.2$`6'P=2"Y4
+M``;^?*4#>'_C^W@X@```8(28:$@```%_X_MX.(```&"$F&Q(```!5&4&(CDA
+M`&!\'4@N5`!$KGRE`WA_X_MX.(```&"$F&Q(```!+!L``$&"`!Q_X_MX.(``
+M`&"$F&Q(```!8&4``4@``!A_X_MX.(```&"$F&Q(```!5&4`/'_C^W@X@```
+M8(28;$@```$OFP``?```)E0`__Z)/``,?`!(`$&"`N1!G@`4@3XL6#DI``&1
+M/BQ82```$($^+%PY*0`!D3XL7&M@``&8'``,2``"N#T@```Y*0`P@4D`!($I
+M``"1(0!HD4$`;#`%__]_H"D0?^/[>#B```!@A*((2````51E`#)7H!`Z.2$`
+M:'P)`"Y4``:^?*4#>'_C^W@X@```8(2B"$@```&('``-?!T``$&"`E0L'0``
+M08(`%($_+&`Y*0`!D3\L8$@``!"!/RQD.2D``9$_+&2;O``-2``"*#T@```Y
+M:0`X@`D`.($K``2!:P`(D`$`")$A``R180`0?+TK>#A@```H!0`"0:$!_'_C
+M^W@X@```8(286$@```%4904:5Z`0.CDA``A\"0`N5`!CIGRE`WA_X_MX.(``
+M`&"$F%A(```!B!P`"WP=`$!`@0`4@3\L:#DI``&1/RQH2```'(@<``M\'0!`
+M0(``$($_+&PY*0`!D3\L;)N\``M(``&$/6```#DK`$2`"P!$@6D`!(%)``B!
+M"0`,D`$`&)%A`!R100`@D0$`)(`)`!"!:0`4@4D`&($I`!R0`0`HD6$`+)%!
+M`#"1(0`T?+TK>#A@```H!0`'0:$!,'_C^W@X@```8(29)$@```%490?N5Z`0
+M.GTA`A2`"0`85``./'RE`WA_X_MX.(```&"$F21(```!B!P`"GP=`$!`@0`4
+M@3\L4#DI``&1/RQ02```'(@<``I\'0!`0(``$($_+%0Y*0`!D3\L5)N\``I(
+M``"X+`4``$"B`#"`'S`85``'^I`?,!A_X_MX2````7_C^WA(```!5&0&+'_C
+M^WA(```!2```A(`?,!AP"0`"0((`>(`?,!PL````08(`3'_C^WA(```!5&0&
+M+'_C^WA(```!?^/[>#B```!@A($L@+\P;$@```%_X_MX.(```&"$@32`OS!P
+M2````7_C^WA(```!2```&'_C^WA(```!8&0!`'_C^WA(```!@!XP&&````*0
+M'C`8.&```8`!`)1\"`.F@V$`?(.!`("#H0"$@\$`B(/A`(PX(0"03H``()0A
+M_^A\"`*FDZ$`#)/!`!"3X0`4D`$`''Q_&WA\?1MX@\,P)#E@``"1?@`0@`,P
+M'"P```!!@@"P@!X`%#T@`,!\`$A`0($`#)%^`$1(```4@3X`%#P``,!\"0!0
+MD!X`1(`>`!P](`#`?`!(`$"!``PX````2```$($^`!P\``#`?`D`4)`>`$A_
+MX_MX.(```&"$@2R`O@!$2````7_C^W@X@```8(2!-("^`$A(```!?^/[>#B`
+M``!@A($P/*```D@```%_X_MX.(```&"$@3@\H`(`2````3B=+(1_X_MX2```
+M`3@```"0'@`\D!X`0(`!`!Q\"`.F@Z$`#(/!`!"#X0`4."$`&$Z``""4(?_H
+M?`@"II/!`!"3X0`4D`$`''Q_&WB`@Q(T@`,P&%0`![XL```#0*(!((/#,"2(
+MO@`)*`4``T&A`!`XI0`!.(```4@``0"(O@`*B!X`"'P%`$!`H``0.*4``3B`
+M``5(``#D@2,LF%4@!GXY*0!_52G)_B@``#]!@0`,@`,LF%0)R?Z`'@`H?`D`
+M`$"!`"R('@`,+````$"B`$A_X_MX.(```CB@``!(```!?^/[>#B```5(``",
+M@!X`)'P)``!`@0`\B!X`#"P```!!H@`4?^/[>#B```(XH``!2````8B^``LH
+M!0`!0:$`8#BE``%_X_MX.(``!$@``$Q_X_MX2````3AC__XH`P`!08$`/(@>
+M``PL````0*(`%'_C^W@X@``".*```$@```&('@`++````$&B`!1_X_MX.(``
+M!#B@``!(```!@`$`''P(`Z:#P0`0@^$`%#@A`!A.@``@E"'_Z'P(`J:3P0`0
+MD^$`%)`!`!Q\?QMX@(,2-(`#,!A4``>^+````T"B`)B#PS`DB+X`"2@%``-!
+MH0`0.*4``3B```%(``!X@2,LF%4@!GXY*0!_52G)_B@``#]!@0`,@`,LF%0)
+MR?Z`'@`D?`D``$"!`""(O@`+*`4``4&A`$0XI0`!?^/[>#B```1(```P?^/[
+M>$@```$X8__^*`,``4&!`""('@`++````$&B`!1_X_MX.(``!#B@``!(```!
+M@`$`''P(`Z:#P0`0@^$`%#@A`!A.@``@E"'_Z'P(`J:3@0`(DZ$`#)/!`!"3
+MX0`4D`$`''Q_&WA\G"-X?'T;>("#$C1+__--'&,`6'_?&A0[WC`HD]\P)(`?
+M`=PL```!0*(`$(`?,!A@```"2```#(`?,!A4``?ZD!\P&(`?`=PL```!08(`
+M@($]+'@Y*0`!D3TL>'_C^W@X@``!.*```$@```%_X_MX.(``!3B@``!(```!
+M?^/[>#B```0XH```2````7_C^W@X@``".*```$@```%_X_MX.(```SB@``!(
+M```!?^/[>$@```%@9`$`?^/[>$@```%_X_MX2__[V4@``32`'S`85``'OBP`
+M``-`H@$D+!P``$&"`%R(O@`)?^/[>#B```%(```!B+X`"G_C^W@X@``%2```
+M`8B^``P@!0``?*`I%'_C^W@X@``"2````8B^``U_X_MX.(```T@```&(O@`+
+M?^/[>#B```1(``!0?^/[>#B```$XH``$2````8B^``A_X_MX.(``!4@```%_
+MX_MX.(```CB@``%(```!?^/[>#B```,XH``!2````7_C^W@X@``$.*```D@`
+M``&`'3`<+````$&"`$Q_X_MX2````51D!BQ_X_MX2````7_C^WA+__KM?^/[
+M>#B```!@A($P/*```D@```%_X_MX.(```&"$@3@\H`(`2````4@``"!_X_MX
+M2__ZN7_C^WA(```!8&0!`'_C^WA(```!@`$`''P(`Z:#@0`(@Z$`#(/!`!"#
+MX0`4."$`&$Z``""4(?_H?`@"II.!``B3H0`,D\$`$)/A`!20`0`<?'\;>'R=
+M(WA\?!MX.(```&"$@20XH```2````7_C^W@X@```8(2!*#B@``!(```!.)\L
+MA'_C^WA(```!@!T``($]``2!?0`(D!\LF)$_+)R1?RR@?^/[>#B```!@A($L
+M2````7Q^&WA_X_MX.(```&"$@31(```!5\`"$CT@`,!\`$@`08(`$%1@`A)\
+M`$@`0*(`@(.\,"2!?0!$?6OP4(`=`#Q\`%A0@3PL<'P`2A20'"QPD7T`/(%]
+M`$A]:QA0@!T`0'P`6%"!/"QT?`!*%)`<+'21?0!`@3T`/(`=`!1\"0!`0*$`
+M#'_C^WA+__J%@!T`0($]`!Q\`$A`0*$`#'_C^WA+__O-?^/[>$O_^5F``0`<
+M?`@#IH.!``B#H0`,@\$`$(/A`!0X(0`83H``()0A_^A\"`*FD^$`%)`!`!Q\
+M?QMX@6,P)(@$``4L```10*(`-($K`#PY*0`!D2L`/($C+'`Y*0`!D2,L<($K
+M`#R`"P`4?`D`0$"A`$Q+__GU2```/(@$``4L```90*(`.($K`$`Y*0`!D2L`
+M0($C+'0Y*0`!D2,L=($K`$"`"P`<?`D`0$"A`!!+__L9?^/[>$O_^*6``0`<
+M?`@#IH/A`!0X(0`83H``()0A__A\"`*FD`$`#("C,"2!(RR852`&?CDI`']5
+M*<G^*```/T&!``R``RR85`G)_H`%`"A\"0``08$`0(`%`"1\"0``0($`'(@%
+M``PL````0:(`$#B```(XH``!2```2(DE``LL"0``0:(`$#BI__\X@``$2```
+M,(DE``HL"0``0:(`$#BI__\X@``%2```&(BE``DL!0``0:(`$#BE__\X@``!
+M2````8`!``Q\"`.F."$`"$Z``""4(?_H?`@"II.A``R3P0`0D^$`%)`!`!Q\
+M?QMX.(```&"$@.Q(```!?'T;>'_C^W@X@```8(2`\$@```%\?AMX?^/[>#B`
+M``!@A(#X2````7QH&WB!7S`D@`H`."P```!!@@`,?``80$"!`!@X8```@3\L
+M?#DI``&1/RQ\2```/(%J`#A]:QA0@2H`-'TI\%"`"@`P?`#H4'QI6%!\8!A0
+M/`!?4V``.2E\`P"6?`!V<'QI_G!\:0!0D0H`.).J`#"3R@`T@`$`''P(`Z:#
+MH0`,@\$`$(/A`!0X(0`83H``()0A_]A\"`*FDV$`%).!`!B3H0`<D\$`()/A
+M`"20`0`L?'\;>'Q\&WB#HS`D@`0``($D``2!9``(D`,LF)$C+)R18RR@+!T`
+M`$&"`AA+__[5?'X;>"P#``!`H``8@3\L@#DI``&1/RR`?^/[>$O_]HF`'0`0
+M?!X"%)`=`!"`'#`<+````$&B`/0XG"R$?^/[>$@```%_X_MX.(```&"$@2Q(
+M```!?'X;>'_C^W@X@```8(2!-$@```%\>QMX@!T`1'P>`$!!@``0@!T`2'P#
+M`$!`@`!H@+T`1'P>*$!`H``H?^/[>#B```!@A($L2````7_C^W@X@```8(2!
+M,#R@``)(```!@+T`2'P;*$!`H`%4?^/[>#B```!@A($T2````7_C^W@X@```
+M8(2!.#R@`@!(```!2``!+(%]`$1]:_!0@!T`/'P`6%"!/"QP?`!*%)`<+'"1
+M?0`\@7T`2'UK&%"`'0!`?`!84($\+'1\`$H4D!PL=)%]`$"`'S`85``'OBP`
+M``-`H@#<@!PP(!P```6!?0`0?`L`0$"!`%"`'0`8?`L!UCU`$&)A2DW3?`!0
+M%E0`T;Z!/0`\?`D`0$&!`)R`'0`@?`L!UGP`4!94`-&^@3T`0'P)`$!!H0"`
+M?^/[>$O__(E(``!T@3T`$(`<,"!\"0!`0($`;(`=`!1\"0'6/2`08F$I3=-\
+M`$@65`#1OH$]`#Q\"0!`0*$`$'_C^WA+__7A2```-($]`!"`'0`<?2D!UCP`
+M$&)@`$W3?2D`%E4IT;Z`'0!`?`!(0$"A`!1_X_MX2__W#7_C^WA+__29@`$`
+M+'P(`Z:#80`4@X$`&(.A`!R#P0`@@^$`)#@A`"A.@``@@2,2-*`)``"P!```
+M@2,2-(@)``1@```(F`D`!(@$``1@```(F`0`!($C$C2@"0`"L`0``H$C$C2(
+M"0`$F`0`!($C$C2("0`%F`0`!3A@``!.@``@E"'_V'P(`J:300`0DV$`%).!
+M`!B3H0`<D\$`()/A`"20`0`L?'T;>'R;(WA\NBMX?-\S>#O````](```.XD`
+M`!P>`!A\G``N'!X`!GP`VA14`!`Z?+P`+G^CZWA(```!._\``7/@`#]`H@`,
+M.&```4@```$[W@`!*!X`#4"!_\0[P```/2```#N)``!7P!@X?2#B%'R<`"Z`
+MJ0`$?Z/K>$@```$[_P`!<^``/T"B``PX8``!2````3O>``$H'@!'0('_S#O`
+M```](```.XD``!P>``Q\G``N'!X``WP`TA14`!`Z?+P`+G^CZWA(```!._\`
+M`7/@`#]`H@`,.&```4@```$[W@`!*!X`/T"!_\2``0`L?`@#IH-!`!"#80`4
+M@X$`&(.A`!R#P0`@@^$`)#@A`"A.@``@E"'_Z'P(`J:3@0`(DZ$`#)/!`!"3
+MX0`4D`$`''Q^&WA\G"-XH(0``*"\``)(```!?&,'-*`<``)\?1MX.^```'`)
+M`(!!H@!H'Z,`##T@```Y*0#D?[U*%(!]``0X@``(2````51_+/2`'0``5``@
+M-G__`WBKO0`(?\/S>#B```!@A*($2````:`<``!@90`0+``)M$&"``A490<T
+M?\/S>#B```!@A*($2````2P=`)!!@0`,<Z```4&"`!PX??_H.(``"$@```%4
+M?08^.````4@``"`X??_H?&,.<'QC`90X@``(2````51]!CXX````5[T0.E0`
+M"#Q_O0-X8[T$`5?E1"Y7H`8^?*4#>'_#\W@X@```8(28G$@```%7Y00N5Z#&
+M/GRE`WA_P_-X.(```&"$F-!(```!DYX2-#A@``&``0`<?`@#IH.!``B#H0`,
+M@\$`$(/A`!0X(0`83H``((!C+^PH!``'08$`2#T@```Y*0S@5(`0.GP)`"Y\
+M`$H4?`D#IDZ`!"`X8P!$3H``(#AC`$A.@``@.&,`3$Z``"`X8P!03H``(#AC
+M`)1.@``@.&```$Z``""4(?]H?`@"II)!`&"280!DDH$`:)*A`&R2P0!PDN$`
+M=),!`'B3(0!\DT$`@)-A`(23@0"(DZ$`C)/!`)"3X0"4D`$`G'Q\&WA\F"-X
+M?+LK>'QY&W@[X```H`0``E0`!?8L``#`08(`W$&!`!`L``"@08(`J$@``/0L
+M``%`08(`#"P``5!`H@#DH3@``#DI\%\H"03J08$`$*+Y$U2BV1-62```6*$X
+M```Y*>MT*`D`[T&!`!"B^1-8HMD36D@``#RA.```.2GJA"@)`.!!@0`0HOD3
+M7*+9$UY(```@H!@``#K````ZX```*``67$"!``RB^1-@HMD38CO````X@```
+MHGD2V**Y$MX@%0``?H"I%*)9$RQ(``!<HN,39*+#$V:@@Q-LH\,3<*)C$MJB
+MHQ+@(34``'Z)J12B0Q,N2```-*+C$VBBPQ-JH(,3;J/#$W*B8Q+<HJ,2XB`5
+M``!^@*D4HD,3,$@```PX8```2``#U#N@```Y00`(/2```#EI``!7J1`Z'!T`
+M!GP`VA14`!`Z?`L`+GP)42X[O0`!*!T`$$"!_^"@&``"<`D`@$&B`#`X80`(
+M.*```SC``'<XX```2````3AA``A_Q/-X.*```SC``'HXX```2````3N@```]
+M(```.TD``#O!``@<'0`8?)H`+E>@$#I\O@`N?X/C>$@```$[_P`!<^``/T"B
+M``PX8``!2````3N]``$H'0`00('_S#N@```](```.\D``%>@&#A](/(4?)X`
+M+H"I``1_@^-X2````3O_``%SX``_0*(`##A@``%(```!-[T``4&"_]`[H```
+M/2```#O)```<'0`8?)X`+AP=``9\`-H45``0.GR^`"Y_@^-X2````3O_``%S
+MX``_0*(`##A@``%(```!-[T``4&"_\@[H```/2```#O)```<'0`8?)X`+AP=
+M``9\`-H45``0.GR^`"Y_@^-X2````3O_``%SX``_0*(`##A@``%(```!-[T`
+M`4&"_\@[H```.4$`"#T@```Y:0``5ZD0.AP=``9\`-H45``0.GP+`"Y\"5$N
+M.[T``2@=`!!`@?_@H!@``G```4`L``%`0*(`-*"9$\PX80`(.*```3C``#,X
+MX``#2````:"9$\XX80`(.*```3C``"TXX``#2````3AA``A^A*-X.*```3C`
+M`%\XX```2````3AA``A^9)MX.*``!#C``&`XX```2````3AA``A^Y+MX.*``
+M`SC``&@XX```2````3AA``A^Q+-X.*```SC``&LXX```2````3N@```](```
+M.TD``#O!``@<'0`8?)H`+E>@$#I\O@`N?X/C>$@```$[_P`!<^``/T"B``PX
+M8``!2````3N]``$H'0`00('_S#N@```Y00`(/2```#EI``!7J1`Z'!T`!GP`
+MVA14`!`Z?`L`+GP)42X[O0`!*!T`!T"!_^`X80`(?D23>#B@``8XP``=..``
+M`$@```$X80`(?J2K>#B@``$XP``$..```$@```&@&``"<`F``$""``QP"4``
+M08(`:*`8``)P"4``?Z``)E>]'_Y_O0#05[T'/CN]`!`X80`(.(``'SB@``4X
+MP``3..```$@```$X80`(?Z3K>#B@``4XP``8..```$@```$X80`(.(```SB@
+M``(XP``Q..```$@```$[H```/2```#MI```[P0`('!T`&'R;`"Y7H!`Z?+X`
+M+G^#XWA(```!._\``7/@`#]`H@`,.&```4@```$[O0`!*!T`!T"!_\PX````
+MD!DOQ#A@``&``0"<?`@#IH)!`&""80!D@H$`:(*A`&R"P0!P@N$`=(,!`'B#
+M(0!\@T$`@(-A`(2#@0"(@Z$`C(/!`)"#X0"4."$`F$Z``"!\8!MX.&```'TF
+M.==-@@`@?,,S>'P%(`!-@@`@?`0`4!P``&1])"A0?`!+UGP`!S5-@``@?.,[
+M>"P``&1-@0`@?2`YUB```&1\`#'6?2D"%#P`4>M@`(4??`D`EGP`+G!]*?YP
+M?`D`4%0#!#Y.@``@E"'^D'P(`J:2P0%(DN$!3),!`5"3(0%4DT$!6)-A`5R3
+M@0%@DZ$!9)/!`6B3X0%LD`$!='S9,WA\>QMX.L```#L``#^@!@`"5``%]BP`
+M`-!!@@!H08$`&"^``*!!G@!$+X``P$&>`%1(``!H+``!4$&"`!A!@0`,+X`!
+M0$@```@O@`E`0+X`3*`;$^:P`0$<.!L3TI`!`1@X&Q/H2```/*`#%?"P`0$<
+M.`,5^)`!`1@X`Q:N2```)*`;%?"P`0$<.!L5\I`!`1@X&Q822```##A@``!(
+M``+\D`$!(#KA`1@X80`(.(`!"$@```$[00`0.X$`D#O@``$[P```5\`(/'_Z
+M`RX[_P`!.]X``2P?`#]\```FD`$!*$"!_^2SP0`..````;`!``HX```_L`$`
+M##O```"@`0`.?YX``$"\`"Q7W0@\H'D``'R=TBY^Y;MX2``"N7Q]XRX[W@`!
+MH`$`#G^>``!!G/_<J7P``*`!``Y4"0@\?2GB%*CI__X[P```?YX``$"<`&17
+MP`@\?!P"KG^`6`!!G0`,?`L#>%?6!#ZA(0`.?3Y(4#DI__]5/P0^+Y\``$&>
+M`#17X`@\?0#B%*DH__Y]7`(N?4`'-'^)``!`G0`(L4C__CO>``&@`0`.?YX`
+M`$&<_Z0[P```H`$`#G^>``!`G``L?`D#>%?`"#Q\'`*N?X`X`$"=``Q\!P-X
+M5]@$/CO>``%_GD@`09S_X#EK`!D](%'K82F%'WP+2)9\`"9P?6O^<'P+`%`<
+M```R?!T'-#O@``!]/4B6?2DF<'^@_G!\"P-X?2!(4#O````X"0`!+X```$"=
+M`$`](%'K82F%'WT]2)9]*29P?2M(4#E)``%_R?-X.!X``50>!#Z!>T9X52D(
+M/'[)6RX[_P`!?Y]0`$&<_^`[X```2```L#@=`#)\'0<TH2$`#E4I"#Q]*>(4
+MJ`G__G^`Z`!(```(._\``4"=`"17X`@\?6#B%'T\`JY]*>A0J`L``GP`Z%!]
+M20'708'_W%>C!#Y7X`@\?2#B%'R<`BZ@J0`"?2#2%'S:`BY4Q@P\H.D``E3G
+M##Q+__QQ.&,``8$[1GA7RP@\5&/\?GQK2RZ!.T9X?`M*+GP`P$!]0``FD4$!
+M.$"!``A_"TLN.!X``50>!#ZA(0`.52D(/'TIXA0Y8``!J`G__GP`Z`!](``F
+MD2$!+$&!``@Y8```(!X`/S@```!\``$4?6D`.4""_QPKG@`_09T`*(%;1GA7
+MRP@\?2M2%*`)__Y\"U,N.!X``50>!#XKG@`_0)W_X#@```"P&R_T.&```8`!
+M`71\"`.F@L$!2(+A`4R#`0%0@R$!5(-!`5B#80%<@X$!8(.A`62#P0%H@^$!
+M;#@A`7!.@``@E"'_P'P(`J:300`HDV$`+).!`#"3H0`TD\$`.)/A`#R0`0!$
+M?'H;>'R>(WA\ORMX.,$`"$@``2DL`P``08(`#*!A``A(``#PH+\`!']#TWB`
+MGP``.,$`"CCA``Q(```!H($`"G_#\WA_Y?MX.,$`#CCA`!!(``%QH($`#'_#
+M\WA_Y?MX.,$`$CCA`!1(``%9H&$`"J"!``X[@0`6?^7[>'^&XWA(``"YH&$`
+M"J"!`!`[H0`8?^7[>'^FZWA(``"AH($`#J"A`!"@P0`6H.$`&'_#\WA+__JU
+M?'L;>*!A``R@@0`2?^7[>'^&XWA(``!QH&$`#*"!`!1_Y?MX?Z;K>$@``%V@
+M@0`2H*$`%*#!`!:@X0`8?\/S>$O_^G%\9QMXH($`"J"A``Q_0]-X?V;;>$O_
+M^EF``0!$?`@#IH-!`"B#80`L@X$`,(.A`#2#P0`X@^$`/#@A`$!.@``@@44`
+M"#D```"@!0`$?`@``$"``'"@"@``?``8`$"B`%`Y:@`(.2```*`*``9\"0``
+M0(``/*`+``!\`"``0*(`'%4I"#Q]*5(4H`D`'K`&```X8``!3H``(#EK``(Y
+M*0`!H`H`!GP)``!!@/_,.4H`-#D(``&@!0`$?`@``$&`_Y@X8```3H``()0A
+M__A\"`*FD`$`#($E``@Y8```H`4`!'P*`WA\"P``0(``(*`)``!\`"``08(`
+M%#DI`#0Y:P`!?`M0`$&`_^@XB0`(H*D`!D@```&``0`,?`@#IC@A``A.@``@
+ME"'_Z'P(`J:3X0`4D`$`''Q_&WB`8T9X+`,``$&B`!!(```!.````)`?1GB`
+M?R_L+`,``$&B`!!(```!.````)`?+^R``0`<?`@#IH/A`!0X(0`83H``(#A@
+M``%.@``@.4```*%D```](```H`D``'P+`$!!@0`<.2D``#E*``%50!`Z?`D"
+M+GP+`$!`@?_P54D0.CU@```Y:P``?2E:%*AI``).@``@E"'_Z'P(`J:3P0`0
+MD^$`%)`!`!Q\GB-X?'\;>#A@`+1(```!D'\O["P#``!!H@`@.```@)`?1GPX
+M8`"`2````9!_1G@L`P``0((`%#@```*0'@``.&```$@``&@](```.2D``)$_
+M+*@](```.2D``)$_+*P](```.2D``)$_++`](```.2D``)$_++0](```.2D`
+M`)$_++@](```.2D``)$_++P](```.2D``)$_+,`](```.2D``)$_+,0X8``!
+M@`$`''P(`Z:#P0`0@^$`%#@A`!A.@``@E"'_V'P(`J:300`0DV$`%).!`!B3
+MH0`<D\$`()/A`"20`0`L?'T;>'R;(WA\NBMX?-\S>#O````](```.XD``!P>
+M`!A\G``N'!X`!GP`VA14`!`Z?+P`+G^CZWA(```!._\``7/@`#]`H@`,.&``
+M`4@```$[W@`!*!X`#T"!_\0[P```/2```#N)``!7P!@X?2#B%'R<`"Z`J0`$
+M?Z/K>$@```$[_P`!<^``/T"B``PX8``!2````3O>``$H'@!$0('_S#O````]
+M(```.XD``!P>``Q\G``N'!X``WP`TA14`!`Z?+P`+G^CZWA(```!._\``7/@
+M`#]`H@`,.&```4@```$[W@`!*!X`/T"!_\2``0`L?`@#IH-!`!"#80`4@X$`
+M&(.A`!R#P0`@@^$`)#@A`"A.@``@E"'_V'P(`J:300`0DV$`%).!`!B3H0`<
+MD\$`()/A`"20`0`L?'P;>'R=(W@[0```.V```*%$```H"A*_08$`X#EJ]W`]
+M`&9F80AF9WP+0)9\``YP?6G^<'P)`%`<```%?`L``$""`"!520@\.\GNX'P>
+M0)9\`!9P?\G^<'_)`%!(``!0H00``#EH]U`]0&9F84IF9WP+4)9\``YP?6G^
+M<'P)`%`<```%.&```'P+``!`@@),50D(/#O)[J!\'E"6?``6<'_)_G!_R0!0
+M.T```5?>%CI_P_-X.(``"$@```%\?AMX?X/C>#B```!@A*($2````:`=``!@
+M90`0+``)M$&"``A490<T?X/C>#B```!@A*($2````4@``9RA)```/`#,S&``
+MS,U\"0`65`#POAP```5\`$A05``$/BP```)`H@!0*`D5.T&A`$@Y*?_^52D$
+M/ATI``H]*?__.2E$@#Q@4>M@8X4??&D8EGQC'G!]*?YP?&D84#AC``$X@``(
+M2````7Q^&W@X8```2``!'*$]```\`,S,8`#,S7P)`!94`.$^'```%'P`2%!4
+M``0^+````$""`$`H"1/_0*$`.#@)[4`\8&9F8&-F9WQ@&)9\8QYP?`#^<'Q@
+M&%!48Q`Z.(``"$@```%\?AMX.&```T@``+BA/0``/`#,S&``S,U\"0`65`#H
+M_AP```I\`$A05``$/BP```!`H@`X.`GM0#Q@9F9@8V9G?&`8EGQC%G!\`/YP
+M?&`84%1C"#PX@``(2````7Q^&W@X8``"2```7*$]```\`,S,8`#,S7P)`!94
+M`/"^'```!7P`2%!4``0^.&```"P```!`H@"$.`GM0#Q@9F9@8V9G?&`8EGQC
+M#G!\`/YP?&`84#B```A(```!?'X;>#A@``$X@``"2````7Q[&WA7WR`V5V`0
+M.G__`WA70`@\?_\#>&/_$`%7Y08^?X/C>#B```!@A)B<2````5?EQGY_@^-X
+M.(```&"$F-A(```!D[P2-#A@``&``0`L?`@#IH-!`!"#80`4@X$`&(.A`!R#
+MP0`@@^$`)#@A`"A.@``@@&,O["@$``=!@0!`/2```#DI"]A4@!`Z?`D`+GP`
+M2A1\"0.F3H`$(#AC``1.@``@.&,`"$Z``"`X8P`,3H``(#AC`*Q.@``@.&``
+M`$Z``""4(?^X?`@"II)!`!"280`4DH$`&)*A`!R2P0`@DN$`)),!`"B3(0`L
+MDT$`,)-A`#23@0`XDZ$`/)/!`$"3X0!$D`$`3'Q[&WA\F2-X?+PK>'S7,WA\
+M>AMX.F```#I````ZP```.H```(/C+^P[`RP0.\```*`$``)4``7V+```T$&"
+M`,!!@0`8+```H$&"`*`L``#`08(`K$@``+PL``%008(`&$&!``PL``%`2```
+M""P`"`!`H@"@H3D``#DI\%\H"03J08$`$*)Z$U2B6A-62```4*$Y```Y*>MT
+M*`D`[T&!`!"B>A-8HEH36D@``#2A.0``.2GJA"@)`.!!@0`0HGH37*):$UY(
+M```8H!D``"@`%EQ`@0`,HGH38*):$V*@FA+>HKH3+$@``#2BPQ-LHH,3<*"#
+M$N"BHQ,N2```(*+:$VY^U+-XH)H2XJ*Z$S!(```,.&```$@`!9@Y0```/2``
+M`#D)``!52Q`Z54D8.'TI0A2`"0`$?`OY+C5*``%!@O_H.6```#T@```Y20``
+M56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`ND`D`!#5K``%!@O_@.6```#T@```Y
+M20``56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`ND`D`"#5K``%!@O_@.6```#T@
+M```Y20``56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`ND`D`##EK``$H"P`G0('_
+MW#N_``Q_H^MX.*```3C``2XXX```2````:"7``!_H^MX.*```CC``0XXX```
+M2````:"7``)_H^MX.*```CC``0$XX```2````:`9``)P"0!`0:(`K($X`!RH
+MB0`"?Z/K>#B@``$XP`"H..```T@```&!.``<J(D`!'^CZW@XH``!.,``J3C@
+M``-(```!@3@`'*B)``9_H^MX.*```3C``*HXX``#2````8$X`!RHB0`(?Z/K
+M>#B@``$XP`"N..```T@```&!.``<J(D`"G^CZW@XH``!.,``KSC@``-(```!
+M@3@`'*B)``Q_H^MX.*```3C``+`XX``#2````:`9``)P"0"`08(`-#N_``Q_
+MH^MX?L2S>#B@``,XP`$?..```$@```%_H^MX?H2C>#B@``,XP`$B2```,#N_
+M``Q_H^MX?F2;>#B@``,XP`$7..```$@```%_H^MX?D23>#B@``,XP`$:..``
+M`$@```&A>P'456D&-CDI_]`H"0`_08$`F&E@`#4A(```?`D!%&EI`$4A20``
+M?2I)%'P*2WE`@@`4+`L`1D&"``PL"P`V0*(`:#N_``Q_H^MX.(```CB@``(X
+MP`!:..```D@```%_H^MX.(```CB@``(XP`!<..```D@```%_H^MX.(```CB@
+M``(XP`!>..```D@```%_H^MX.(```CB@``$XP`#^..```D@```&@&P'2*```
+M04"A`(`[OP`,?Z/K>#B```$XH``!.,`!&3C@``%(```!?Z/K>#B```$XH``"
+M.,```3C@``-(```!?Z/K>#B```$XH``".,```SC@``-(```!?Z/K>#B```$X
+MH``!.,``BSC@``-(```!?Z/K>#B```$XH``!.,``C#C@``-(```!.6```#T@
+M```Y20``56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`ND`D`K#EK``$H"P`,0('_
+MW*`9``)P"0!`0:(`(#A_`*R!.``<J(D``#B@``(XP``E..```$@```$X?P"L
+M?J2K>#B@``8XP``...```$@```&@&0`"<`E``$""``QP"H``0:(`5*`9``)P
+M"4``?Z``)E>]'_Y_O0#05[T'?CN]``@[GP"L?X/C>#B```\XH``$.,``.CC@
+M``!(```!?X/C>'^DZW@XH``$.,``1CC@``!(```!.Z```#T@```[B0``5Z`8
+M.'R<`"Y7H!`Z?+\`+G]CVWA(```!.]X``7/``#]`H@`,.&```4@```$WO0`!
+M08+_T#N@```](```.XD``!P=`!A\G``N5ZD0.GTI^A2`J0`$?V/;>$@```$[
+MW@`!<\``/T"B``PX8``!2````3>]``%!@O_,.Z```#T@```[B0``'!T`&'R<
+M`"Y7J1`Z?2GZ%("I``A_8]MX2````3O>``%SP``_0*(`##A@``%(```!-[T`
+M`4&"_\P[H```/2```#N)```<'0`8?)P`+E>I$#I]*?H4@*D`#']CVWA(```!
+M.]X``7/``#]`H@`,.&```4@```$[O0`!*!T`)T"!_\@[H```/2```#N)```<
+M'0`8?)P`+E>I$#I]*?H4@*D`K']CVWA(```!.]X``7/``#]`H@`,.&```4@`
+M``$[O0`!*!T`#$"!_\@X````D!HOQ#A@``&``0!,?`@#IH)!`!""80`4@H$`
+M&(*A`!R"P0`@@N$`)(,!`"B#(0`L@T$`,(-A`#2#@0`X@Z$`/(/!`$"#X0!$
+M."$`2$Z``""4(?O(?`@"II'!`_"1X0/TD@$#^)(A`_R2000`DF$$!)*!!`B2
+MH00,DL$$$)+A!!23`008DR$$')-!!""3800DDX$$*).A!"R3P00PD^$$-)`!
+M!#Q\D2-X?+(K>'S8,WA\]#MX?'<;>*%C`=15:08V.2G_T"@)`#]!@0!`:6``
+M-2$@``!\"0$4:6D`12%)``!]*DD4?`I+>4""`!0L"P!&08(`#"P+`#9`H@`0
+M.6```I%A`]Q(```,.````9`!`]PYP0`(H!@``E0`!?8L``#008(`4$&!`!@L
+M``"@08(`."P``,!!@@`\2```1"P``5!!@@`808$`#"P``4!(```(+``(`$"B
+M`"@[-Q_4H3<2V$@``"0[-Q_@H3<2VD@``!@[-Q_LH3<2W$@```PY0```2``$
+M3*`9``8Y0```?2L`.4&"!#RH$@``5``(/'P`!S20`0/DJ!$``%0`"#Q\``<T
+MD`$#X#@`WJVP`0/0L`$#TCM@``"A.0`&.^```#EA`]!](/XP<`H``4&"`!PY
+M0```*!L``4&!`^A78`@\?^L#+CM[``$[_P`!*!\``T"!_]2@>```H+D`!("9
+M```XP0/4..$#V$@`!$D[8```@T$#U(`!`]A\&@!`08$!F#IA`]`ZH0$0.L$!
+M,#GA`5`Z`0-0'3H`5(`9``A_R0(4H3,``C@```!@`-ZM?`D``$"B`&RCX0/0
+M'[\`%'^]\A2C_0`&.)T`"%?\"#Q^HZMX?X7C>$@```$[O0`0?L.S>'^DZWA_
+MA>-X2````:C>``)_X_MX?J2K>'[%LW@XX0-02``$03E````L`P``08(#%%=C
+M.#!\;QH42```W*/A`]`?OP`4?[WR%*/]``8XG0`(5_P(/'ZCJWA_A>-X2```
+M`3N]`!!^P[-X?Z3K>'^%XWA(```!J-X``G_C^WA^I*MX?L6S>#CA`U!(``/9
+M.4```"P#``!!@@*L5V,X,'QO&A1^!(-X.*``@$@```&C\P`"'[\`%'^]\A2C
+M_0`&.)T`"%?\"#Q^HZMX?X7C>$@```$[O0`0?L.S>'^DZWA_A>-X2````:C>
+M``)_X_MX?J2K>'[%LWA^!X-X2``#:3E````L`P``08("/%=@.#`X80)0?&,"
+M%#B!`U`XH`"`2````3M[``$[6@`!@`$#V'P:`$!`@?Z$@4$#U(%Y``!520@\
+M?TE:+H`!`]A4"0@\?\E:+G]J`%"A(0/2.````&``WJT[X```.R$`"'P)``!`
+MH@"`5WPP,E?]"#Q_O<H4H'@``*C=`4A]//H452D(/'TIRA2HZ0%(?T33>'_%
+M\WA(``(!L'T`"#O_``$H'P`_0('_R#AA`!"`ET9X2``#R7Q@#G!\``&4L!$`
+M`*@!`(Y\``YP?``!E+`.``"P$@``H`$#T+`4``"@%```2```N%?\"#Q_G,H4
+MH'@``*C<`4A7?3`R?[WZ%%>]"#Q_O<H4J/T!2']$TWA_Q?-X2``!A;!\``B@
+M>```J-P"2*C]`DA_1--X?\7S>$@``6FP?`"(._\``2@?`#]`@?^H@`$#W"P`
+M``)`H@!8.&$`$#B!`)"`MT9X.,$`"D@`!"5\8`YP?``!E+`1``"H`0`*?``.
+M<'P``92P#@``J`$`CGP`#G!\``&4L!(``*`!`]"P%```H`$#TK`4``)(``",
+MJ`$!#H$A`^!\`$@`08``0(%!`^1\`%``0:``-#AA`)"`ET9X2``"M:`!`]*P
+M%```H!0``+`4``)\8`YP?``!E+`1``"H`0$.2```,#AA`!"`ET9X2``"A:`!
+M`]"P%```H!0``+`4``)\8`YP?``!E+`1``"H`0".?``.<'P``92P#@``L!(`
+M`*`2```@```_L!<O]#E```%]0U-X@`$$/'P(`Z:!P0/P@>$#]((!`_B"(0/\
+M@D$$`()A!`2"@00(@J$$#(+!!!""X004@P$$&(,A!!R#000@@V$$)(.!!"B#
+MH00L@\$$,(/A!#0X(00X3H``('QI&WA\PS-X?`4@`$V"`"!\!$A0?``YUGTI
+M*%!]*3'6?`!*%'TD*%!\`$O6?`,'-$Z``"!4H`@\?60"%*`$``!\`P!`0(``
+M##@```!(```4H`O__GP#`$!!@``X.`7__Y`'``"0!@``3H``('P$2%!\``YP
+M2___['TD2%!]*0YPD28``#DI``&1)P``3H``('R)(WA\!%A`3(``(*`)``!\
+M`!@`0:+_R*`)``)\`P!`0:#_R#DI``)\"5A`3(``($O__]R4(?_8?`@"II,!
+M``B3(0`,DT$`$)-A`!23@0`8DZ$`')/!`""3X0`DD`$`+'QX&WA\G2-X?+HK
+M>'S<,WA\_CMX.R```#M@``$X8```*!@``4"!`*`[X```5V`(/'P=`BY\`/A`
+M0(``(#@8__]\&P``0(``%#@9``%4&00^.!L``50;!#Y7*0@\?(GJ+E=@"#Q\
+MO0(N?,G2KGSZ`JY_X_MX2__^G5?@"#Q\?@,N?!X"KGP`X`!!@``H*!\`/T&!
+M`"!_X/MX.3\``54_!#Y4``@\?YX#+B@?`#]`@?_H.!\``50?!#XH'P`_0('_
+M<#A@``&``0`L?`@#IH,!``B#(0`,@T$`$(-A`!2#@0`8@Z$`'(/!`""#X0`D
+M."$`*$Z``""A(P!^?2L'-*@#``!]8%A0.2G_@GTG!S0L"P!^08$`"*CC``"I
+M`P!^.2``/SE(__](```,.`G__WP)!S15(`@\?`,"KCE@``%\`%``08$`"#E@
+M``!]($CX5``/_GUF`#E`@O_4?0I#>#D``#\X"?__?`L#>%0`!#XH```^08$`
+M.%4@"#Q\`P*N?`!0`$&``"A]:0<T.6G__U5@!#XH```^08$`%%4@"#Q\`P*N
+M?`!0`$"`_^`L"0``0*(`+"P(``!!@`!`50L(/'TK(A2@"0`"?`LC+C@(__]\
+M"`<U0(#_Z$@``"!5``@\?20#+C@*__Y\"@<T.`C__WP(!S5`@/]P?.,[>$Z`
+M`""4(?_HD\$`$)/A`!0XX`!`H2,`?GTK!S2H!```?6!84#DI_X)]/P<T+`L`
+M?D&!``BKY```J8,`?CD@`#\Y3/__2```##@)__]\"0<T52`(/'P#`JXY8``!
+M?`!0`$&!``@Y8```?2!(^%0`#_Y]:``Y0(+_U*`$`'ZP!@``?2I+>#D``#]]
+MBV-XJ`8``'P`6`!`@``@(\H``'T^410OAP!`?```)E0`__Y]/@`Y08(`$#C@
+M``!\@R-X.4``/RP*``!`@0`P54`(/'P#`JY\`%@`08``(#@*__]\"@<U0($`
+M%%5`"#Q\`P*N?`!8`$"`_^@A*@``?`E1%"/'``!]/CD4?!Y(.4&B`"PL"```
+M08``1%4+"#Q]*RH4H`D``GP+*RXX"/__?`@'-4"`_^A(```D50D(/'U`.WA\
+M"2LN.`O__GP+!S0X"/__?`@'-4"`_SQ_X_MX@\$`$(/A`!0X(0`83H``()0A
+M_^A\"`*FD^$`%)`!`!Q\?QMX@&-&>"P#``!!H@`02````3@```"0'T9X@'\O
+M["P#``!!H@`02````3@```"0'R_L@`$`''P(`Z:#X0`4."$`&$Z``""I1``$
+M..```#E@``$=*P`4?2DB%*$I``15(`0^?`!0`$"```Q]9UMX?2H'-#EK``$L
+M"P`#0('_V!TG`!1]*2(4J0D`$*AI``@Y8``!'2<`"GP)6A14``@\?4`B%*@*
+M`!!\`$``0(``#'P(`WBH:@`(.6L``2P+``-`@?_85&,(/'QC0%!\8P<T3H``
+M()0A_]A\"`*FDP$`"),A``R300`0DV$`%).!`!B3H0`<D\$`()/A`"20`0`L
+M?'L;>'R>(WA\V#-X.^```+/E``"@'@`"<``!0"P``4!`H@`4.(,?U(/D``B@
+MA``$2```7*`>``)P``#0:`D`P"%I``!]*TD4:```T"%@``!\"P$4?2L#>4&"
+M`!0X@Q_4@^0`(*"$`!Q(```DH!X``G```*`X8``!+```H$"B`80XFQ_4@^0`
+M%*"$`!`X8```+`0``$"!`6RA?@``H!\``'P+`$!!@``8'20`5'TI^A2@"?^L
+M?`L`0$"!`#2@'@``H3\``!R$`%1\A/H4.(3_K'P`2$!`@`$4H!\``K`%``!_
+M8]MX?^3[>$@``0PY````.6```'P+(`!`@``XH!X``*$_``!\`$A`0($`*'P)
+M`WA]:%MX.6L``7P+(`!`@``4'`L`5'P?`BY\"0!`08'_Y!P+`%1\@/H4?Y\"
+M+A](`%1_.OH4?5KZ+G^*X%%`@0"`J20``JEY``)]*TA0H!X``'P*`%!]*0'6
+M?6OAUGTI6A1]*>/6?2D'=+$E``!_8]MX2__]R7Q]&WA_8]MX?R3+>$O__;E_
+MH^A0H!X``'TZ^BY\"0!0?[T!UG]CVWA_),MX2__]F7QCX=9_O1H4?[WCUG^]
+M!W2SN```2```-!P+`%1\@/H4H3X``'P?`BXX8```?`D``$"B`!R@!``"L`4`
+M`']CVWA+__U5L'@``#A@``&``0`L?`@#IH,!``B#(0`,@T$`$(-A`!2#@0`8
+M@Z$`'(/!`""#X0`D."$`*$Z``""4(?_0?`@"II-!`!B380`<DX$`().A`"23
+MP0`HD^$`+)`!`#1\>QMX?)PC>'R]*W@[0``!.\```'P>*$!`H`!,5\`8.'_\
+M`A1_8]MX?^3[>#BA``@XP0`*2__]32P#``!!@@`8B`$`"9@?``:(`0`+F!\`
+M!T@```@[0```.]X``7P>Z$!!@/^\?T/3>(`!`#1\"`.F@T$`&(-A`!R#@0`@
+M@Z$`)(/!`"B#X0`L."$`,$Z``""4(?_H?`@"II/!`!"3X0`4D`$`''R>(WA\
+M?QMX.&``X$@```&0?R_L+`,``$&B`"`X``"`D!]&?#A@`(!(```!D']&>"P#
+M``!`@@`4.````I`>```X8```2```<#@``$"0'T9\/2```#DI``"1/RRH/2``
+M`#DI``"1/RRL/2```#DI``"1/RRP/2```#DI``"1/RRT/2```#DI``"1/RRX
+M/2```#DI``"1/RR\/2```#DI``"1/RS`/2```#DI``"1/RS$.&```8`!`!Q\
+M"`.F@\$`$(/A`!0X(0`83H``()0A_]A\"`*FDT$`$)-A`!23@0`8DZ$`')/!
+M`""3X0`DD`$`+'Q]&WA\FR-X?+HK>'S?,W@[P```/2```#N)```<'@`8?)P`
+M+AP>``9\`-H45``0.GR\`"Y_H^MX2````3O_``%SX``_0*(`##A@``%(```!
+M.]X``2@>``]`@?_$.\```#T@```[B0``5\`8.'T@XA1\G``N@*D`!'^CZWA(
+M```!._\``7/@`#]`H@`,.&```4@```$[W@`!*!X`BD"!_\P[P```/2```#N)
+M```<'@`,?)P`+AP>``-\`-(45``0.GR\`"Y_H^MX2````3O_``%SX``_0*(`
+M##A@``%(```!.]X``2@>`#]`@?_$@`$`+'P(`Z:#00`0@V$`%(.!`!B#H0`<
+M@\$`((/A`"0X(0`H3H``()0A_]A\"`*FDT$`$)-A`!23@0`8DZ$`')/!`""3
+MX0`DD`$`+'Q\&WA\G2-X.T```#M@``"A1```*`H2OT&!`.`Y:O=P/0!F9F$(
+M9F=\"T"6?``.<'UI_G!\"0!0'```!7P+``!`@@`@54D(/#O)[N!\'D"6?``6
+M<'_)_G!_R0!02```4*$$```Y:/=0/4!F9F%*9F=\"U"6?``.<'UI_G!\"0!0
+M'```!3A@``!\"P``0(("3%4)"#P[R>Z@?!Y0EGP`%G!_R?YP?\D`4#M```%7
+MWA8Z?\/S>#B```A(```!?'X;>'^#XW@X@```8(2B!$@```&@'0``8&4`$"P`
+M";1!@@`(5&4'-'^#XW@X@```8(2B!$@```%(``&<H20``#P`S,Q@`,S-?`D`
+M%E0`\+X<```%?`!(4%0`!#XL```"0*(`4"@)%3M!H0!(.2G__E4I!#X=*0`*
+M/2G__SDI1(`\8%'K8&.%'WQI&)9\8QYP?2G^<'QI&%`X8P`!.(``"$@```%\
+M?AMX.&```$@``1RA/0``/`#,S&``S,U\"0`65`#A/AP``!1\`$A05``$/BP`
+M``!`@@!`*`D3_T"A`#@X">U`/&!F9F!C9F=\8!B6?&,><'P`_G!\8!A05&,0
+M.CB```A(```!?'X;>#A@``-(``"XH3T``#P`S,Q@`,S-?`D`%E0`Z/X<```*
+M?`!(4%0`!#XL````0*(`.#@)[4`\8&9F8&-F9WQ@&)9\8Q9P?`#^<'Q@&%!4
+M8P@\.(``"$@```%\?AMX.&```D@``%RA/0``/`#,S&``S,U\"0`65`#POAP`
+M``5\`$A05``$/CA@```L````0*(`A#@)[4`\8&9F8&-F9WQ@&)9\8PYP?`#^
+M<'Q@&%`X@``(2````7Q^&W@X8``!.(```D@```%\>QMX5]\@-E=@$#I__P-X
+M5T`(/'__`WAC_Q`!5^4&/G^#XW@X@```8(28G$@```%7Y<9^?X/C>#B```!@
+MA)C82````9.\$C0X8``!@`$`+'P(`Z:#00`0@V$`%(.!`!B#H0`<@\$`((/A
+M`"0X(0`H3H``()0A_]A\"`*FDR$`#)-!`!"380`4DX$`&).A`!R3P0`@D^$`
+M))`!`"Q\>QMX?+PK>'QZ&W@[P```@^,O[*`$``)4``7V+```P$&"`"Q!@0`0
+M+```H$&"`!1(```H+```T$&"`!1(```<H(,39*,C$V9(```8H)H3:*,Z$VI(
+M```,.&```$@``H@Y0```/2```#D)``!52Q`Z54D8.'TI0A2`"0`$?`OY+C5*
+M``%!@O_H.6```#T@```Y20``56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`ND`D`
+M!#5K``%!@O_@.6```#T@```Y20``56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`N
+MD`D`"#5K``%!@O_@.6```#T@```Y20``56D0.GTI^A0<"P`&?`#B%%0`$#I\
+M"@`ND`D`##EK``$H"P`:0('_W#N_``Q_H^MX.*```SC``*@XX```2````7^C
+MZWA_),MX.*```SC``*4XX```2````3E@```](```.4D``%5I$#I]*?H4'`L`
+M!GP`XA14`!`Z?`H`+I`)`'@Y:P`!*`L``D"!_]P[H```/2```#N)``!7H!@X
+M?)P`+E>@$#I\OP`N?V/;>$@```$[W@`!<\``/T"B``PX8``!2````3>]``%!
+M@O_0.Z```#T@```[B0``'!T`&'R<`"Y7J1`Z?2GZ%("I``1_8]MX2````3O>
+M``%SP``_0*(`##A@``%(```!-[T``4&"_\P[H```/2```#N)```<'0`8?)P`
+M+E>I$#I]*?H4@*D`"']CVWA(```!.]X``7/``#]`H@`,.&```4@```$WO0`!
+M08+_S#N@```](```.XD``!P=`!A\G``N5ZD0.GTI^A2`J0`,?V/;>$@```$[
+MW@`!<\``/T"B``PX8``!2````3N]``$H'0`:0('_R#N@```](```.XD``!P=
+M`!A\G``N5ZD0.GTI^A2`J0!X?V/;>$@```$[W@`!<\``/T"B``PX8``!2```
+M`3N]``$H'0`"0('_R#@```"0&B_$.&```8`!`"Q\"`.F@R$`#(-!`!"#80`4
+M@X$`&(.A`!R#P0`@@^$`)#@A`"A.@``@@&,O["@$``=!@0!`/2```#DI"^!4
+M@!`Z?`D`+GP`2A1\"0.F3H`$(#AC``1.@``@.&,`"$Z``"`X8P`,3H``(#AC
+M`'A.@``@.&```$Z``"!4H`@\?60"%*`$``!\`P``0(``##@```!(```4H`O_
+M_GP#``!!@``X.`7__Y`'``"0!@``3H``('P$2%!\``YP2___['TD2%!]*0YP
+MD28``#DI``&1)P``3H``('R)(WA\!%A`3(``(*`)``!\`!@`0:+_R*`)``)\
+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
+MWS-X?/H[>'Q[&WB#@T9XH`8``G```-!H"0#`(6D``'TK211H``#0(6```'P+
+M`10[PR?\?2L#>4""`!R@!@`"<```H#O#(^@X8```+```H$"B`3!_H^MX.(``
+M`&"$HFQ(```!5'D'/J"?``!_H^MX?\7S>'\FRW@XX0`(.0$`$'])TWA_BN-X
+M2__Z/7^CZW@X@```8(2B6$@```%4902>H3X`'#DI__]5*70B?*5+>'^CZW@X
+M@```8(2B6$@```&@`0`(+````$&"``Q\``#02```"#@```"P&R_T.\```&/>
+MHH`[X```5^`8.'T@XA1\O`(N5*4&/H@)``-4`$`N?*4#>(@)``54`(`>?*4#
+M>(@)``=4`,`.?*4#>'^CZWA_Q/-X2````3O>``0[_P`!*!\`'T"!_[2@H0`0
+M5*4EMG\E*W@Y(0`0H`D``E0`5"I\I0-XH`D`!%0`@IY\I0-XH`D`!E0`L1)\
+MI0-X?Z/K>#B```!@A*)L2````3A@``&``0`\?`@#IH,A`!R#00`@@V$`)(.!
+M`"B#H0`L@\$`,(/A`#0X(0`X3H``()0A_^A\"`*FD^$`%)`!`!Q\?QMX@&-&
+M>"P#``!!H@`02````3@```"0'T9X@'\O["P#``!!H@`02````3@```"0'R_L
+M@'\LI"P#``!!H@`02````3@```"0'RRD@`$`''P(`Z:#X0`4."$`&$Z``"`Y
+M(```(`D``QP``!A\8"(4H`,`""P```!!H@`,J&,`%$Z``"`Y*0`!.&```"@)
+M``--@0`@2___T#E@```=*P`8?2DB%*`)``@L````0:(`'!TK``Q]*0(452D(
+M/'TI(A2H:0`23H``(#EK``$X8```*`L``TV!`"!+___$E"'_R'P(`J:2P0`0
+MDN$`%),!`!B3(0`<DT$`()-A`"23@0`HDZ$`+)/!`#"3X0`TD`$`/'Q\&WA\
+MGR-X?+LK>'S8,W@[P```L\4``*`$``)P``#0:`D`P"%)``!]*DD4:```T"%`
+M``!\"@$4.(,G_'TJ`WE`@@`<H!\``G```*`X@R/H.&```"P``*!`H@&\HZ0`
+M%#O$`!@X8```+!T``$&"`:BA?P``H!X``'P+`$!!@``8'3T`9GTI\A2@"?^:
+M?`L`0$"!`#R@'P``H3X``!^]`&9_ONH4.[W_FGP`2$!`@`%$?X/C>'_$\WA+
+M__[1L'L``'^#XWA_Q/-X2``!0#D````Y8```?`OH`$"``#B@'P``H3X``'P`
+M2$!`@0`H?`D#>'UH6W@Y:P`!?`OH`$"``!0<"P!F?!X"+GP)`$!!@?_D'`L`
+M9G[`\A1_7@(N'R@`9G[Y\A1\&?(N?T#044"!`*A_@^-X?L2S>$O__E%\?1MX
+M?X/C>'[DNWA+__Y!?Z/H4*`?``!].?(N?`D`4'^]`=9_@^-X?N2[>$O__B%\
+M8]'6?[T:%'^]T]9_O0=TL[L``'^#XWA^Q+-X2__]R7Q]&WA_@^-X?N2[>$O_
+M_;E_H^A0H!\``'TY\BY\"0!0?[T!UG^#XWA^Y+MX2__]F7QCT=9_O1H4?[W3
+MUG^]!W2SN```2```0!P+`&9_H/(4H3\``'P>`BXX8```?`D``$"B`"A_@^-X
+M?Z3K>$O__9&P>P``?X/C>'^DZWA+__U)L'@``#A@``&``0`\?`@#IH+!`!""
+MX0`4@P$`&(,A`!R#00`@@V$`)(.!`"B#H0`L@\$`,(/A`#0X(0`X3H``()0A
+M_]!\"`*FDT$`&)-A`!R3@0`@DZ$`))/!`"B3X0`LD`$`-'Q[&WA\G"-X?+TK
+M>#M```$[P```?!XH0$"@`$Q7P!@X?_P"%']CVWA_Y/MX.*$`"#C!``I+__TI
+M+`,``$&"`!B(`0`)F!\`!H@!``N8'P`'2```"#M````[W@`!?![H0$&`_[Q_
+M0]-X@`$`-'P(`Z:#00`8@V$`'(.!`""#H0`D@\$`*(/A`"PX(0`P3H``()0A
+M_^A\"`*FD\$`$)/A`!20`0`<?)XC>'Q_&W@X8`"$2````9!_+^PL`P``0:(`
+M-#@``0"0'T9\.&`!`$@```&0?T9X+`,``$&B`!@X8`8`2````9!_+*0L`P``
+M0((`%#@```*0'@``.&```$@``&@](```.2D``)$_+*@](```.2D``)$_+*P]
+M(```.2D``)$_++`](```.2D``)$_++0](```.2D``)$_++@](```.2D``)$_
+M++P](```.2D``)$_+,`](```.2D``)$_+,0X8``!@`$`''P(`Z:#P0`0@^$`
+M%#@A`!A.@``@E"'_V'P(`J:300`0DV$`%).!`!B3H0`<D\$`()/A`"20`0`L
+M?'T;>'R;(WA\NBMX?-\S>#O````](```.XD``!P>`!A\G``N'!X`!GP`VA14
+M`!`Z?+P`+G^CZWA(```!._\``7/@`#]`H@`,.&```4@```$[W@`!*!X`'4"!
+M_\0[P```/2```#N)``!7P!@X?2#B%'R<`"Z`J0`$?Z/K>$@```$[_P`!<^``
+M/T"B``PX8``!2````3O>``$H'@!_0('_S#O````](```.XD``!P>``Q\G``N
+M'!X``WP`TA14`!`Z?+P`+G^CZWA(```!._\``7/@`#]`H@`,.&```4@```$[
+MW@`!*!X`/T"!_\2``0`L?`@#IH-!`!"#80`4@X$`&(.A`!R#P0`@@^$`)#@A
+M`"A.@``@E"'_V'P(`J:300`0DV$`%).!`!B3H0`<D\$`()/A`"20`0`L?'P;
+M>'R=(W@[0```.V```*%$```H"A*_08$`X#EJ]W`]`&9F80AF9WP+0)9\``YP
+M?6G^<'P)`%`<```%?`L``$""`"!520@\.\GNX'P>0)9\`!9P?\G^<'_)`%!(
+M``!0H00``#EH]U`]0&9F84IF9WP+4)9\``YP?6G^<'P)`%`<```%.&```'P+
+M``!`@@(L50D(/#O)[J!\'E"6?``6<'_)_G!_R0!0.T```5?>%CI_P_-X.(``
+M"$@```%\?AMX?X/C>#B```!@A*($2````:`=``!@90`0+``)M$&"``A490<T
+M?X/C>#B```!@A*($2````4@``7RA)```/`#,S&``S,U\"0`65`#POAP```5\
+M`$A05``$/BP```)`H@!0*`D5.T&A`$@Y*?_^52D$/ATI``H]*?__.2E$@#Q@
+M4>M@8X4??&D8EGQC'G!]*?YP?&D84#AC``$X@``(2````7Q^&W@X8```2```
+M_*$]```\`,S,8`#,S7P)`!94`.$^'```%'P`2%!4``0^+````$""`#`H"1/_
+M0*$`*#@)[4`\8&9F8&-F9WQ@&)9\8QYP?`#^<'Q@&%!48Q`Z2```F*$]```\
+M`,S,8`#,S7P)`!94`.C^'```"GP`2%!4``0^+````$"B`"@X">U`/&!F9F!C
+M9F=\8!B6?&,6<'P`_G!\8!A05&,(/$@``$RA/0``/`#,S&``S,U\"0`65`#P
+MOAP```5\`$A05``$/CA@```L````0*(`A#@)[4`\8&9F8&-F9WQ@&)9\8PYP
+M?`#^<'Q@&%`X@``(2````7Q^&W@X8``!.(```D@```%\>QMX5]\@-E=@$#I_
+M_P-X5T`(/'__`WAC_Q`!5^4&/G^#XW@X@```8(28G$@```%7Y<9^?X/C>#B`
+M``!@A)C82````9.\$C0X8``!@`$`+'P(`Z:#00`0@V$`%(.!`!B#H0`<@\$`
+M((/A`"0X(0`H3H``()0A_]A\"`*FDP$`"),A``R300`0DV$`%).!`!B3H0`<
+MD\$`()/A`"20`0`L?'P;>'R[*WA\>AMX.,```#L````XX```.R```#O```"#
+MXR_LH`0``E0`!?8L``#008(`I$&!`!@L``"@08(`C"P``,!!@@"02```F"P`
+M`4!!@@`,+``!4$"B`(BA)```.2GP7R@)!.I!@0`0H-H35*,:$U9(``!TH20`
+M`#DIZW0H"0#O08$`$*#:$UBC&A-:2```6*$D```Y*>J$*`D`X$&!`!"@VA-<
+MHQH37D@``#R@!```*``67$"!`#"@VA-@HQH38D@``"2@XQ-DHR,39D@``!B@
+M^A-HHSH3:D@```PX8```2``#*#E````](```.0D``%5+$#I521@X?2E"%(`)
+M``1\"_DN-4H``4&"_^@Y8```/2```#E)``!5:1`Z?2GZ%!P+``9\`-H45``0
+M.GP*`"Z0"0`$-6L``4&"_^`Y8```/2```#E)``!5:1`Z?2GZ%!P+``9\`-H4
+M5``0.GP*`"Z0"0`(-6L``4&"_^`Y8```/2```#E)``!5:1`Z?2GZ%!P+``9\
+M`-H45``0.GP*`"Z0"0`,.6L``2@+`"1`@?_<H`0``G`)`(!!@@"4.[\`#'^C
+MZWA\Y#MX.*```SC``/$XX```2````7^CZWA_),MX.*```SC``.XXX```2```
+M`7^CZW@X@``!.*```3C``2,XX``"2````8`<`<PL```)08(`&"P```I`H@!H
+MH!P!T"@```-!@0!<.&``!CB```-(```!?&0;>#A_``PXH``#.,``@SC@``-(
+M```T.[\`#'^CZWA\Q#-X.*```SC``/<XX```2````7^CZWA_!,-X.*```SC`
+M`/0XX```2````3E@```](```.4D``%5I$#I]*?H4'`L`!GP`VA14`!`Z?`H`
+M+I`)`*`Y:P`!*`L``D"!_]P[H```/2```#MI``!7H!@X?)L`+E>@$#I\OP`N
+M?X/C>$@```$[W@`!<\``/T"B``PX8``!2````3>]``%!@O_0.Z```#T@```[
+M:0``'!T`&'R;`"Y7J1`Z?2GZ%("I``1_@^-X2````3O>``%SP``_0*(`##A@
+M``%(```!-[T``4&"_\P[H```/2```#MI```<'0`8?)L`+E>I$#I]*?H4@*D`
+M"'^#XWA(```!.]X``7/``#]`H@`,.&```4@```$WO0`!08+_S#N@```](```
+M.VD``!P=`!A\FP`N5ZD0.GTI^A2`J0`,?X/C>$@```$[W@`!<\``/T"B``PX
+M8``!2````3N]``$H'0`D0('_R#N@```](```.VD``!P=`!A\FP`N5ZD0.GTI
+M^A2`J0"@?X/C>$@```$[W@`!<\``/T"B``PX8``!2````3N]``$H'0`"0('_
+MR#@```"0&B_$.&```8`!`"Q\"`.F@P$`"(,A``R#00`0@V$`%(.!`!B#H0`<
+M@\$`((/A`"0X(0`H3H``((!C+^PH!``'08$`0#T@```Y*0W(5(`0.GP)`"Y\
+M`$H4?`D#IDZ`!"`X8P`$3H``(#AC``A.@``@.&,`#$Z``"`X8P"@3H``(#A@
+M``!.@``@5*`(/'UD`A2@!```?`,``$"```PX````2```%*`+__Y\`P``08``
+M.#@%__^0!P``D`8``$Z``"!\!$A0?``.<$O__^Q])$A0?2D.<)$F```Y*0`!
+MD2<``$Z``"!\B2-X?`180$R``""@"0``?``8`$&B_\B@"0`"?`,``$&@_\@Y
+M*0`"?`E80$R``"!+___<E"'_P'P(`J:2X0`<DP$`(),A`"2300`HDV$`+).!
+M`#"3H0`TD\$`.)/A`#R0`0!$?'<;>'S>,WA\^SMX?1Q#>'TX2WA4@`@\?!\'
+M-#N@```X8```*`@``4"!`/1\!"A05``$/GP=`$!!@0#@.RC__WP$*%!4&@0^
+M?^/[>'_$\WA_A>-X.,$`"#CA``Q+__[E@`$`#"P```!`@@`,.````9`!``R`
+M`0`(?`#(`$"B``PX'/_^D`$`"(`!``A4"P@\@`$`#%0`"#Q]*_*N?!X"KGP)
+M``!`H@`,?2O:+D@``$2!`0`(50@(/'SH\JY])_A0@`$`#%0`"#Q]>P(N?2E9
+MUGU>`JY\'U!0?6C:+GP`6=9]*0(4?4=04'TI4]95*00^5N`P,GP`ZA14``@\
+M?3@#+C@=``%4'00^.!\``GP?!S1\'=!`0('_-#A@``&``0!$?`@#IH+A`!R#
+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
+M(0`<@T$`((-A`"2#@0`H@Z$`+(/!`#"#X0`T."$`.$Z``""4(?_0?`@"II-!
+M`!B380`<DX$`().A`"23P0`HD^$`+)`!`#1\>QMX?)PC>'R]*W@[0``!.\``
+M`'P>*$!`H`!,5\`8.'_\`A1_8]MX?^3[>#BA``@XP0`*2__]*2P#``!!@@`8
+MB`$`"9@?``:(`0`+F!\`!T@```@[0```.]X``7P>Z$!!@/^\?T/3>(`!`#1\
+M"`.F@T$`&(-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`,$Z``""4(?_H?`@"II/!
+M`!"3X0`4D`$`''R>(WA\?QMX.&``K$@```&0?R_L+`,``$&B`#0X``$`D!]&
+M?#A@`0!(```!D']&>"P#``!!H@`8.&`&`$@```&0?RRD+`,``$""`!0X```"
+MD!X``#A@``!(``!H/2```#DI``"1/RRH/2```#DI``"1/RRL/2```#DI``"1
+M/RRP/2```#DI``"1/RRT/2```#DI``"1/RRX/2```#DI``"1/RR\/2```#DI
+M``"1/RS`/2```#DI``"1/RS$.&```8`!`!Q\"`.F@\$`$(/A`!0X(0`83H``
+M(``````H4!8L6"@`````"10```I,```*4```"E0```DL```*7```"4@```E4
+M```*H```"60```ET```)N```"90```FD```)N```"=````K````*Q```"AP`
+M``HL```*F```"D````J@```*5```"F0```IT```*Z```"NP```JX```*]```
+M"L@```K\```+````"P0```KX_Z#_H_^>_Z#_H_^@````!0`*`!0`'@`R`$8`
+M50!:`%\`9`````H`%``>`"@`,@`\`$8`4`!:`&0`!``&``D`#````,(```#$
+M````Q0```-````#:````Y````,(```##````U````/(```$-```!*````,\`
+M``#*``(A4``!`4``!`"@``@`P``@`-``0`%0`````!F8`20&$"8`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````#_______\`````F`````!'``"8
+M"````````)@,"82.I@``F!`],N````"8%```!VL``)@<````````F"`"`@(`
+M``"8)```#@X``)@H"@("`0``F"P``V_\``"8,````````)@T```.#@``F#@`
+M```'``"8/``"`0```)A`B6,`````F$03<A:<``"82``8MC,``)A,$H1A/```
+MF%`-Z+C@``"85``'2%D``)A8?H"^N@``F%PQ.F9>``"88```'0@``)AD``'.
+M````F&A`FD&0``"8<`````\``)AT````@```F'@````$``"9`````````)D$
+M````````F0@```````"9#`"``````)D0`````P``FP````````";!````"``
+M`)L(````$```FPP````P``";$`````@``)L4````*```FQ@````H``";'```
+M``0``)L@````)```FR0````4``";*````#0``)LL````#```FS`````L``";
+M-`````(``)LX````(@``FSP````2``";0````#(``)M$````"@``FT@````J
+M``";3`````$``)M0````(0``FU0````1``";6````#$``)M<````"0``FV``
+M```I``";9`````4``)MH````)0``FVP````5``";<````#4``)MT````#0``
+MFW@````M``";?`````,``)N`````(P``FX0````3``";B````#,``)N,````
+M"P``FY`````K``";E`````<``)N8````)P``FYP````7``";H````#<``)ND
+M````#P``FZ@````O``";K````"\``)NP````+P``F[0````O``";N````"\`
+M`)N\````+P``F\`````O``";Q````"\``)O(````+P``F\P````O``";T```
+M`"\``)O4````+P``F]@````O``";W````"\``)O@````+P``F^0````O``";
+MZ````"\``)OL````+P``F_`````O``";]````"\``)OX````+P``F_P````O
+M``":`````!T``)H$````70``F@@```"=``":#````-T``)H0```!'0``FA0`
+M```A``":&````&$``)H<````H0``FB````#A``":)````#$``)HH````<0``
+MFBP```"Q``":,````!P``)HT````7```FC@````I``":/````&D``)I`````
+MJ0``FD0````@``":2````!D``)I,````60``FE````"9``":5````#```)I8
+M````!0``FEP````E``":8````&4``)ID````I0``FF@````H``":;````&@`
+M`)IP````'P``FG0````>``":>````!@``)I\````6```FH````"8``":A```
+M``,``)J(````!```FHP```!$``":D````(0``)J4````$P``FI@````2``":
+MG````%(``)J@````D@``FJ0```#2``":J````"L``)JL````*@``FK````!J
+M``":M````*H``)JX````&P``FKP````:``":P````%H``)K$````F@``FL@`
+M``#:``":S`````8``)K0````!@``FM0````&``":V`````8``)K<````!@``
+MFN`````&``":Y`````8``)KH````!@``FNP````&``":\`````8``)KT````
+M!@``FO@````&``":_`````8``)C4````(```F,P````$``"8R``&`08``)B<
+M````;0``F,````````"8T````!0)"0```````@(&!@8&!@8"`@`````#``8`
+M"0`\``````````````````````````#P````S`````````````````````H`
+M``````#B"@``(`$```(!```80```````!!@95P0%!A`F````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````"6P)CPFT`````(````"8(%55556JJJJJ
+M9F9F9IF9F9G_______\````````````@````(````$````!```8````&````
+M!@``````,````!4````5````'0```!4``!!``"_\#P`O_`\`+_P?`"_\#P``
+M$$0`+_P/`"_\#P`O_!\`+_P/```02``O_`\`+_P/`"_\'P`O_`\``!!,`"_\
+M#P`O_`\`+_P?`"_\#P``$%``+_P/`"_\#P`O_!\`+_P/```05``O_`\`+_P/
+M`"_\'P`O_`\``!!8`"_\#P`O_`\`+_P?`"_\#P``$%P`+_P/`"_\#P`O_!\`
+M+_P/```08``O_`\`+_P/`"_\'P`O_`\``!!D`"_\#P`O_`\`+_P?`"_\#P``
+M$'````%H```!X````;@```%H```0,````C````'@````L````C```!"P```-
+MF```$8```!](```-F```$/```*#@``%`:```6(```*#@``"`%`0`!``(``@`
+M(``P``0`!````(`<#HV/IPZ-C\\!8(^5#HV/IP``F`0``````````P``````
+M``````"8(`("`@`"`@(``@$"``("`@```)@D```.#@``#@X```<'```.#@``
+MF"@*`@`!"@(``04!```*`@`!``"8-```#@X```X.```.#@``#@X``)@X````
+M!P````<````+````"P``F$03<A:<$W(6I1-R%J@3<A:<``"82``8NF<`&+IG
+M`!BZ:0`8NFD``)A0#"BTX`PHM.`,*+3@#"BTX```F%A^@`TN?H`-+G[`#2Y^
+M@`TN``"87#$W75XQ-UU>,3I=7C$W75X``)A@``"]$```O1```+TX``"]$```
+MF&0``<X```'.```!S@```<X```"9%```)Q```"<0```5?```)Q```)D8```!
+MD````9````"$```!D```F41OX!`@;^`0(&_@"2!OX!`@``"A@`7_%/\%_Q3_
+M!?\4_P7_&?\``)C4````$````!0````0````$`````P`````````*(2$G)P`
+M```L?'Q\?````#0````%````0`````````!$````"````$@````(````3```
+M`!````!0`````````%0````?```(``````````@$````````"`@````````(
+M#`````````@0````````"!0````````(&`````````@<````````""``````
+M```()````````!(P````````@`0```````"`"````````(`,````````@!@`
+M``````"`)````````(`H````,```@"P`!___``"`,`'___\``(`T````,0``
+M@#@```````"`/````````(!`````````@$0````"``"`2````````(!4````
+M````@%@```````"8"````````)@,+820DP``F!!],N````"8%```#VL``)@<
+M````````F"P``F_^``"8,````````)@\``(!````F$`@:@%Z``"83!*$83P`
+M`)A4```(60``F&A`FD&0``"8;`4,L($``)AP````#P``F'0```"```"8>```
+M``P``)D`````````F00```````"9"````````)D,`(``````F1`````!``"9
+M'```"2H``)D@````````F20`!8H%``"9*`````$``)DL````````F3``````
+M``"9-````````)DX````````F3P````_``"90`````0``)E(````````F4P`
+M``````"94````````)E475#Q3```F5@````8``"97`!+:HX``*&$!O\%_P``
+MH8@'_P?_``"AC`C_"/\``*&0"?\)_P``H90*_PK_``"AF`O_"_\``*&<#/\,
+M_P``H:`-_PW_``"AI`__#O\``*&H$O\2_P``H:P4_Q/_``"AL!;_%?\``*&T
+M&?\7_P``H;@;_QK_``"AO![_'?\``*'`(_\@_P``H<0G_R7_``"AR"S_*?\`
+M`*',,?\O_P``H=`W_S3_``"AU#K_.O\``*'8.O\Z_P``H=PZ_SK_``"AX#K_
+M.O\``*'D.O\Z_P``H>@Z_SK_``"A[#K_.O\``*'P.O\Z_P``H?0Z_SK_``"A
+M^#K_.O\``*'\.O\Z_P``FP````````";!````"```)L(````$```FPP````P
+M``";$`````@``)L4````*```FQ@````$``";'````"0``)L@````%```FR0`
+M```T``";*`````P``)LL````+```FS`````"``";-````"(``)LX````$@``
+MFSP````R``";0`````H``)M$````*@``FT@````&``";3````"8``)M0````
+M%@``FU0````V``";6`````X``)M<````+@``FV`````!``";9````"$``)MH
+M````$0``FVP````Q``";<`````D``)MT````*0``FW@````%``";?````"4`
+M`)N`````%0``FX0````U``";B`````T``)N,````+0``FY`````#``";E```
+M`",``)N8````$P``FYP````S``";H`````L``)ND````*P``FZ@````K``";
+MK````"L``)NP````*P``F[0````K``";N````"L``)N\````*P``F\`````K
+M``";Q````"L``)O(````*P``F\P````K``";T````"L``)O4````*P``F]@`
+M```K``";W````"L``)O@````*P``F^0````K``";Z````"L``)OL````*P``
+MF_`````K``";]````"L``)OX`````@``F_P````6``"8U````"```)C8`&`0
+M:```F@````&I````````F@0```'I````0```F@@````I````@```F@P```!I
+M```!4```FA````&9```!D```FA0```'9```!T```FA@````9````$```FAP`
+M``!9````1```FB````"9````A```FB0```&E```!2```FB@```'E```!B```
+MFBP````E```!R```FC````'(````%```FC0````(````0@``FC@```!(````
+M@@``FCP```"(```!>```FD````&8```!N```FD0```'8```!^```FD@````8
+M````$@``FDP```!8````4@``FE````"8````D@``FE0```&D```!?```FE@`
+M``'D```!O```FEP````D```!_```FF````!D````"@``FF0```"D````2@``
+MFF@```#D````B@``FFP```$*```!6@``FG````%*```!F@``FG0```&*```!
+MV@``FG@```'*````#@``FGP````*````3@``FH````!*````C@``FH0```"*
+M```!7@``FH@```&Z```!G@``FHP```'Z```!W@``FI`````Z````"0``FI0`
+M``!Z````20``FI@```&&````B0``FIP```'&```!>0``FJ`````&```!N0``
+MFJ0```!&```!^0``FJ@```"&````.0``FJP```#&````>0``FK````#&````
+MN0``FK0```#&```!O0``FK@```#&```!_0``FKP```#&````/0``FL````#&
+M````?0``FL0```#&````O0``FL@```#&````_0``FLP```#&````_0``FM``
+M``#&````_0``FM0```#&````_0``FM@```#&````_0``FMP```#&````_0``
+MFN````#&````_0``FN0```#&````_0``FN@```#&````_0``FNP```#&````
+M_0``FO````#&````_0``FO0```#&````_0``FO@```#&````_0``FOP```#&
+M````_0````$```!&`&````````$```!&`&$```````$```!&`&(```````$`
+M``!&`&,```````$```!&`&0```````$```!&`&4```````$```!&`&8`````
+M``$```!&`&<```````$```!&`&@```````$```!&`&D```````$```!&`&H`
+M``````$```!&`&L```````$```!&`&P```````$```!&`'0```````$```!&
+M`'0```````$```!&`'0```````$```!&`'0```````$```!&`'0```````$`
+M``!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'4`````
+M``$```!&`'8```````$```!&`'<```````$```!&`'@```````$```!&`'D`
+M``````$```!&`'H```````$```!&`'L```````$```!&`'P```````$```!&
+M`'T```````$```!&`'X```````$```!&`'\```````$```!&`(````````$`
+M``!$`'P```````$```!&`(@```````$```!&`(P```````$```!&`)``````
+M``$```!&`)0```````$```!&`)@```````$```!&`)P```````$```!&`*``
+M``````$```!&`*0```````$```!&`*@```````$```!&`*P```````$```!&
+M`+````````$```!&`+0````"!P`6G@`+%F(`"A8Z``D6'``(%>H`!Q6:``45
+M2@`$%0,``A19```````!`````P`&``D`/P`````D"```)`P``"0L```D,```
+M)%```"14```D=```)'@````)````!``$``$``0`!````!D9'.```````````
+M````````!`````$``0````1&1S<```````````````````,``0`!``$````#
+M1D<V```````````````````$```````!`````49'-0``````````````````
+M!``!``$```````!&1S0```````````````````0````!``#____^1D<S````
+M```````````````#``$``0``_____49',@``````````````````!```````
+M`/____Q&1S$```````````````````(``0`!``#____Z1D<P````````````
+M````````````````````````````````````````````````&500%`80)@``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````EL"8\)M`D("6P)M/__
+M_\G____)____R?___\G____"____\O____+____R____\O____3____`____
+MP/___\#____`____NO___[+___^R____LO___[+___^P________!0(/!P(/
+M"@`/"0`/`````(````"8(%55556JJJJJ9F9F9IF9F9D```-X```#-````T``
+M``/$```#8````\0`````````(````"````!`````0``&````!@````8``!:>
+M``L68@`*%CH`"18<``@5Z@`'%9H`!15*``05`P`"%%D```NX``$````````4
+MA```$@P``!)0```2>```%)0``!+<```4G```%*```!2D```4J```%*P``!,D
+M```4M```%+@``!2\```4P```$T```!-@```4S```$[0``!/<```4V```$O``
+M`!3@```4Y```%.@``!0\```43```%/0``!1@```4?```%(```!1<```4:```
+M%'0``!2````4C``````````&`````0````(````#````!`````4``!:(```6
+MC```%0```!4D```6F```%7```!:@```6I```%J@``!:L```6L```%;0``!:X
+M```6O```%L```!;$```5X```%LP``!;0```5_```%J0``!;<```6X```%N0`
+M`!;H```6[```%CP``!9````6^```%IP``!!``"_\#P`O_`\`+_P?`"_\#P`O
+M_`\``!!$`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!(`"_\#P`O_`\`+_P?`"_\
+M#P`O_`\``!!,`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!0`"_\#P`O_`\`+_P?
+M`"_\#P`O_`\``!!4`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!8`"_\#P`O_`\`
+M+_P?`"_\#P`O_`\``!!<`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!@`"_\#P`O
+M_`\`+_P?`"_\#P`O_`\``!!D`"_\#P`O_`\`+_P?`"_\#P`O_`\``!`P```"
+M,````>````"P```!8````>```!!P```!:````>````&X```!C````>```!"P
+M```.8```$8```!\<```^.```$8```!#P``"@X``!0&@``%B```"PX``!0&@`
+M`(`4`^@#Z`;@!N`$(`0@"$`(0`;@!N```)@$``````````,`````````````
+M``,``)@@`@("``("`@`"`0(``@("``("`@```)@D```.#@``#@X```<'```.
+M#@``#@X``)A$$W(6'!-R'"43<A<B$W(6HA-R'"4``)A@``"=$```G1```)T8
+M``"=&```G1```)AD``'.```!S@```<X```'.```!S@```)AH0)I!D$":09!`
+MFD&00)I!D$":09```)D8```!N````;@```"$```!"````;@``)DD$`6*!1`%
+MB@40!8H%$`6*!1`%B@4``*(P```````````````````!"``````````,````
+M`````#0````%````0`````````!$````"````$@````(````3````!````!0
+M`````````%0````?```(``````````@$````````"`@````````(#```````
+M``@0````````"!0````````(&`````````@<````````""`````````()```
+M`````!)P````````$#@````````0>````````!"X````````$/@````````1
+M.````````!%X````````$;@````````1^````````!(X````````$G@`````
+M```2N````````!+X````````$S@````````3>````````!.X````````$_@`
+M```````4.````````!1X````````%+@````````4^````````!4X````````
+M%7@````````5N````````!7X````````%C@````````6>````````!:X````
+M````%O@````````7.````````!=X````````%[@````````7^````````!`\
+M````````$'P````````0O````````!#\````````$3P````````1?```````
+M`!&\````````$?P````````2/````````!)\````````$KP````````2_```
+M`````!,\````````$WP````````3O````````!/\````````%#P````````4
+M?````````(`$````````@`@```````"`#````````(`@````````@"0`````
+M``"`*````#```(`L``?__P``@#`!____``"`-````#$``(`X````````@#P`
+M``````"`2````````(!4````````@%@```````"`7``/QX\``(#`*H(P&@``
+M@,0%W`'@``"`R!]`)Q```(#,`?0`````@-```!X<``"`U``"JJH``(#8`@!5
+M50``@-P```````"`X/____\``(#D``#__P``@.@```````"`[````````(#P
+M````````@/0```````"`^````````(#\````B```AP````````"'!````(P`
+M`(<(````Y```APP```+5``"'$````````(<4````````AQ@```"@``"''```
+M`<D``(<@````+```AR0````L``"'*````#```(<L````/```AS`````L``"'
+M-````"P``(<X````,```ASP````\``"'0````````(=$````````AT@`````
+M``"'3````````(=0````````AU0```````"'6````````(=<````````AV``
+M``#5``"'9````-\``(=H```!`@``AVP```$Z``"'<````'4``(=T````?P``
+MAW@```"B``"'?````````($```$``@``@00````!``"!"````,```($,````
+M````@1````%H``"!%````````(?``P(!````A\0'!@4$``"'R`L*"0@``(?,
+M#PX-#```A]`3$A$0``"'U!<6%10``(?8&QH9&```A]P?'AT<``"'X`,"`0``
+M`(?D!P8%!```A^@+"@D(``"'[`\.#0P``(?P$Q(1$```A_07%A44``"'^!L:
+M&1@``(?\'QX='```F`RMA(X9``"8$'THX````)@4G`J?:P``F!P```````"8
+M0"!J`7H``)A4```(60``F0````````"9!````````)D(````````F0P`@```
+M``"9$`````$``)D<```,@```F2`%$`````"9*`````$``)DL````!```F30>
+M'R`B``"9.`H+#`T``)D\````/P``F4B2@+(2``"95%U0X8@``)E<`$MJC@``
+MF6@```/.``"9<!DOM14``)EX`````0``F7P```````"B$`"`8S,``*(4`!!L
+M$```HA@`G$!@``"B(`&(,,8``*(D```$````HBP```````"B-"`@("```*(X
+M("`@(```HD`X20H@``"B1```>[8``*)(#_\__```FP````````";*`````P`
+M`)LX````$@``FV0````A``";C````"T``)N<````,P`!``(``@`!``$``@`!
+M`````P`&``D`/P````,`!@`)`#\```````D````$``0``0`!``$`````````
+M``````9&1S@```````````````````0````!``$```````````````1&1S<`
+M``````````````````,``0`!``$```````````````-&1S8`````````````
+M``````0```````$```````````````%&1S4```````````````````0``0`!
+M``````````````````!&1S0```````````````````0````!````````````
+M`/____Y&1S,```````````````````,``0`!`````````````/____U&1S(`
+M``````````````````0``````````````````/____Q&1S$`````````````
+M``````(``0`!`````````````/____I&1S``````````````````````````
+M````````````````````````````````````````````"`````$``P``````
+M````````````````!D9'-P```````````````````@``````````````````
+M`````$9'-@```````````````````0``````````````````_____49'-0``
+M````````````````````````````````````____^D9'-```````````````
+M```````!``$`````````````____^$9',P`````````````````````!``$`
+M```!``$`````____]D9',@`````````````````````!`````0`!``$`````
+M____\T9',0`````````````````````!`````0`!`````0``____\$9',```
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````!_````
+M,@```'\````H````?P```$T```!_````0````!\````0````/P```#`````(
+M````!@`````````$````"`````(````$````!@````@````*````#`````X`
+M```0```*%````_0```4,```';```"`````BH```)>````#```(`5``"`%0``
+M@!4``(`5``"`%0``@!P2C8^G"8@/SP3@#Y42X`^K"8@/SP``F"@*`@`!"@(`
+M`04!`0`*`@`!"@(``0``F#0```X.```.#@``#@X```X.```.#@``F#@````'
+M````!P````L````+````"P``F$@`&-I:`!C:6@`8RFD`&,II`!C*:0``F%`-
+MZ+3@#>BTX`WHM.`-Z+3@#>BTX```F%A^@`TN?H`-+G[H32Y^Z$TN?H`-+@``
+MF%PQ-V9>,3=F7C$W9EXQ-V9>,3=A7@``F&P%#+"!!0RP@04,L($%#+"`!0RP
+M@```F10``"<0```G$```%7P``"KX```G$```F43WN!`@][@0(/>X#2#WN!`@
+M][@0(```H@QD+$%J9"Q!:F1`06ID0$%J9$!!:@``HAP8@X`*&(.`"AAS@`H8
+M@X`*&(.`"@``$C````````"8"````````)@L``(O_@``F#P``@$```"83!*$
+M83P``)DP``!(@P``F4`````$``"96````/\``)ET````````F?@````8``"B
+M!````````*((T#YGB```HB@```&U``"B/!/(B:\``)L$````(```FP@````0
+M``";#````#```)L0````"```FQ0````H``";&`````0``)L<````)```FR``
+M```4``";)````#0``)LL````+```FS`````"``";-````"(``)L\````,@``
+MFT`````*``";1````"H``)M(````!@``FTP````F``";4````!8``)M4````
+M-@``FU@````.``";7````"X``)M@`````0``FV@````1``";;````#$``)MP
+M````"0``FW0````I``";>`````4``)M\````)0``FX`````5``";A````#4`
+M`)N(````#0``FY`````#``";E````",``)N8````$P``FZ`````+``";I```
+M`"L``)NH````*P``FZP````K``";L````"L``)NT````*P``F[@````K``";
+MO````"L``)O`````*P``F\0````K``";R````"L``)O,````*P``F]`````K
+M``";U````"L``)O8````*P``F]P````K``";X````"L``)OD````*P``F^@`
+M```K``";[````"L``)OP````*P``F_0````K``";^`````(``)O\````%@``
+MF)P`````````````````````````````F)P`````````````````````````
+M````F)P`````````````````````````````F)P`````````````````````
+M````````F)P`````````````````````````````F)P`````````````````
+M````````````F)P`````````````````````````````F)P`````````````
+M````````````````F)P`````````````````````````````F)P`````````
+M````````````````````F)P`````````````````````````````F)P`.```
+M`#@````X````.````#@`````F)P`````````````````````````````F)P`
+M````````````````````````````F)P``````````````,````"`````@```
+MF)P`!`#Y``0`^0`$`/\`!`#]``0`_0``F-0```````````````0````$````
+M!```F@````&I````````F@0```'I````0```F@@````I````@```F@P```!I
+M```!4```FA````&9```!D```FA0```'9```!T```FA@````9````$```FAP`
+M``!9````1```FB````"9````A```FB0```&E```!2```FB@```'E```!B```
+MFBP````E```!R```FC````'(````%```FC0````(````0@``FC@```!(````
+M@@``FCP```"(```!>```FD````&8```!N```FD0```'8```!^```FD@````8
+M````$@``FDP```!8````4@``FE````"8````D@``FE0```&D```!?```FE@`
+M``'D```!O```FEP````D```!_```FF````!D````"@``FF0```"D````2@``
+MFF@```#D````B@``FFP```$*```!6@``FG````%*```!F@``FG0```&*```!
+MV@``FG@```'*````#@``FGP````*````3@``FH````!*````C@``FH0```"*
+M```!7@``FH@```&Z```!G@``FHP```'Z```!W@``FI`````Z````"0``FI0`
+M``!Z````20``FI@```&&````B0``FIP```'&```!>0``FJ`````&```!N0``
+MFJ0```!&```!^0``FJ@```"&````.0``FJP```#&````>0``FK````#&````
+MN0``FK0```#&```!O0``FK@```#&```!_0``FKP```#&````/0``FL````#&
+M````?0``FL0```#&````O0``FL@```#&````_0``FLP```#&````_0``FM``
+M``#&````_0``FM0```#&````_0``FM@```#&````_0``FMP```#&````_0``
+MFN````#&````_0``FN0```#&````_0``FN@```#&````_0``FNP```#&````
+M_0``FO````#&````_0``FO0```#&````_0``FO@```#&````_0``FOP```#&
+M````_0``F-0````@``"8U````!`````4````$````!`````4``"8V`!@$&@`
+M8!!H`&`0:`!@$&@`8!!H``"8G`````````````````````````````"8G```
+M``````````````````````````"8G`````````````````````````````"8
+MG`````````````````````````````"8G```````````````````````````
+M``"8G!`````0````$````!`````0``````"8G`0````$````!`````0````$
+M``````"8G`````````````````````````````"8G```````````````````
+M``````````"8G`````````````````````````````"8G```````````"@``
+M``````````````"8G``X`,``.`"``C@`P``X`,``.`#```"8G``"``8``@`&
+M````!@`"``8``@`&``"8G````(D```")````B0```(D```")``"8G````*``
+M``"@````H````*````"@``"8G``$``<`!``'``0`!P`$``<`!``'``"8U```
+M`!H````:````&@```!H````:``"8G````$````!(````0````$````!```"8
+MG````!`````0````$````!`````0``"8G`````@````(````"`````@````(
+M``"8G````$\```!/````3P```$\```!/``"8G````/$```#Q````80```/$`
+M``#Q``"8G```D$\``)!/``"03```D$\``)!/``"8G```$EH``!):```2F@``
+M$EH``!):``"8S`````X````.````#P````X````.`````0```$8`8```````
+M`0```$8`80```````0```$8`8@```````0```$8`8P```````0```$8`9```
+M`````0```$8`90```````0```$8`9@```````0```$8`9P```````0```$8`
+M:````````0```$8`:0```````0```$8`:@```````0```$8`:P```````0``
+M`$8`;````````0```$8`=````````0```$8`=````````0```$8`=```````
+M`0```$8`=````````0```$8`=````````0```$8`=````````0```$8`=```
+M`````0```$8`=````````0```$8`=0```````0```$8`=@```````0```$8`
+M=P```````0```$8`>````````0```$8`>0```````0```$8`>@```````0``
+M`$8`>P```````0```$8`?````````0```$8`?0```````0```$8`?@``````
+M`0```$8`?P```````0```$8`@````````0```$0`?````````0```$8`B```
+M`````0```$8`C````````0```$8`D````````0```$8`E````````0```$8`
+MF````````0```$8`G````````0```$8`H````````0```$8`I````````0``
+M`$8`J````````0```$8`K````````0```$8`L````````0```$8`M``````"
+M[````L0```+0```"W````O@```+\```"\````OP6G@`&%F(`!!8Z``,6'``"
+M%>H``16:```52@``%0,``119``,+N``%`````````#```(`5``"`%0``@!4`
+M`(`5``"`%0``@!P2C9.G"8@3SP3@$Y42X!.K"8@3SP``F"@*`@`!"@(``04"
+M`0`*`@`!"@(``0``F#0```X.```.#@``#@X```X.```.#@``F#@````'````
+M!P````L````+````"P``F$@`&-IM`!C:;0`8RG4`&,IU`!C*=0``F%`-Z+3@
+M#>BTX`WHM.`-Z+3@#>BTX```F%A^@`TN?H`-+G[H#2Y^Z`TN?H`-+@``F%PQ
+M-V9>,3=F7C$W9EXQ-V9>,3=F7@``F&P%#+"!!0RP@04,L($%#+"!!0RP@0``
+MF10```?0```'T```!$P```B8```'T```F43WN!`@][@0(/>X#1#WN!`0][@0
+M$```H@0```````````````@````(````"```H@C6OF>(UKYGB-`^9XC0/F>(
+MT#YGB```H@QD+`%`9"P!0&1"P6!D0L%@9$+!8```HAP8@X`*&(.`"AAS@`H8
+M@X`*&(.`"@``$C````````"8"````````)@L``(O_@``F#P``@$```"83!*$
+M83P``)DP``!(@@``F4`````$``"96````/\``)ET````````HB@```&U``"B
+M/!/(B:\``)L$`````0``FP@````"``";#`````,``)L0````!```FQ0````%
+M``";&`````@``)L<````"0``FR`````*``";)`````L``)LL````#0``FS``
+M```0``";-````!$``)L\````$P``FT`````4``";1````!4``)M(````&```
+MFTP````9``";4````!H``)M4````&P``FU@````<``";7````!T``)M@````
+M(```FV@````B``";;````",``)MP````)```FW0````E``";>````"@``)M\
+M````*0``FX`````J``";A````"L``)N(````+```FY`````P``";E````#$`
+M`)N8````,@``FZ`````T``";I````#4``)NH````-0``FZP````U``";L```
+M`#4``)NT````-0``F[@````U``";O````#4``)O`````-0``F\0````U``";
+MR````#4``)O,````-0``F]`````U``";U````#4``)O8````-0``F]P````U
+M``";X````#4``)OD````-0``F^@````U``";[````#4``)OP````-0``F_0`
+M```U``";^````!```)O\````&@``F@`````'````!P``F@0```!'````1P``
+MF@@```"'````AP``F@P```&@```!H```FA````'@```!X```FA0````@````
+M(```FA@```!@````8```FAP```&A```!H0``FB````'A```!X0``FB0````A
+M````(0``FB@```!A````80``FBP```%B```!8@``FC````&B```!H@``FC0`
+M``'B```!X@``FC@````B````(@``FCP```!B````8@``FD````%C```!8P``
+MFD0```&C```!HP``FD@```'C```!XP``FDP````C````(P``FE````!C````
+M8P``FE0```&$```!A```FE@```'$```!Q```FEP````$````!```FF````'J
+M````"P``FF0````J````2P``FF@```!J````BP``FFP```"J```!K```FG``
+M``&K```![```FG0```'K````+```FG@````K````$@``FGP```!K````4@``
+MFH````"K````D@``FH0```&L```!DP``FH@```'L```!TP``FHP````L````
+M$P``FI`````Z````4P``FI0```!Z````DP``FI@```"Z```!E```FIP```&[
+M```!U```FJ````'[````%```FJ0````[````.@``FJ@```![````>@``FJP`
+M``"[````N@``FK````&\```!NP``FK0```'\```!^P``FK@````\````.P``
+MFKP```!\````>P``FL````"\````NP``FL0```#\```!O```FL@```#\```!
+M_```FLP```#\````/```FM````#\````?```FM0```#\````O```FM@```#\
+M````_```FMP```#\````_```FN````#\````_```FN0```#\````_```FN@`
+M``#\````_```FNP```#\````_```FO````#\````_```FO0```#\````_```
+MFO@```#\````_```FOP```#\````_```F-0````@``"8T`,&!`@#!P0(`P8$
+M"`,&!`@#!P0(``"8W`"@(,``H"#``.`@P`#@(,``X"#```"8G`\````/````
+M#P````\````/``````"8G`````````````````````````````"8G`"`````
+M@````(````"`````@`````"8G``J````*@```"H````J````*@````"8G``!
+M`````0````$````!`````0````"8G`````````````````````````````"8
+MG``8````&````!@````8````&`````"8G`!@````8````&X```!N````;@``
+M``"8G`#'````QP```,<```#'````QP````"8G`!+````2P```$L```!+````
+M2P````"8G`1(```$2```!$@```1(```$2`````"8G`!,````3````$P```!,
+M````3`````"8G`#D````Y````.0```#D````Y`````"8G```````````````
+M``````````````"8G`#\````_````/P```#\````_`````"8G`#_````_P``
+M`/\```#_````_P````"8G`0_```$/P``!#\```0_```$/P````"8G``,````
+M#`````P````,````#`````"8G`(9```"&0```AD```(9```"&0````"8G``D
+M````)````"0````D````)`````"8G`"T````M````+0```"T````M`````"8
+MG`"9````F0```)D```"9````F0````"8G`!0````4````%````!0````4```
+M``"8G``J````*@```"H````J````*@````"8G``2````$@```!(````2````
+M$@````"8G,`R``#`,@``P#(``,`R``#`,@````"8G`%T```!=````70```%T
+M```!=`````"8G``1````$0```!$````1````$0````"8G(8H``"&*```AB@`
+M`(8H``"&*`````"8G#&$```QA```,80``#&$```QA`````"8G`#R`(``\@"`
+M`/(`@`#R`(``\@"```"8G``G`!D`)P`9`"<`&0`G`!D`)P`9``"8G`````,`
+M```#`````P````,````#``"8G`````````````````````````````"8G```
+M`+(```"R````L@```+(```"R``"8G`"P((0`L""$`+`@A`"P((0`L""$``"8
+MG`!!):0`026D`$$EI`!!):0`026D``"8G``1DB``$9(@`!&2(``1DB``$9(@
+M``"8G``:2```&D@``!I(```:2```&D@```"8V``+`C``"P(P``L",``+`C``
+M"P(P``"8G````)0```"4````E````)0```"4``"8G````)$```"1````D0``
+M`)$```"1``"8G````!(````2````$@```!(````2``"8G````(````"`````
+M@````(````"```"8G````-D```#9````V0```-D```#9``"8G````&````!@
+M````8````&````!@``"8G````/````#P````\````/````#P``"8G````*(`
+M``"B````H@```*(```"B``"8G````%(```!2````4@```%(```!2``"8G```
+M`-0```#4````U````-0```#4``"8G```%,P``!3,```4S```%,P``!3,``"8
+MG```!(P```2,```$C```!(P```2,``"8Q`````,````#`````P````,````#
+M```$I```!*P```2,```$F```!+0```2X```$K```!+@````P````%0```!4`
+M```5````%0```!4``(`<$HV3IPF($\\$X!.5$N`3JPF($\\``)@H"@(``0H"
+M``$%`@``"@(``0H"``$``)@T```.````#@````X````.````#@```)@X````
+M`@````(````*````"@````H``)A(`!C:;0`8VFT`&FID`!IJ9``::F0``)A0
+M#>BTX`WHM.`-Z+#:#)BPV@WHL-H``)A8?H`-+GZ`#2Y^Z`TN?L@-+GZ`#2X`
+M`)A<,3=F7C$W9EXQ-V9>,3E@7C$W9EX``)AL!0RP@04,L($%#+"!!0RP@04,
+ML($``)D4```'T```!]````1,```(F```!]```)E$][@0`/>X$`#WN`T`][@0
+M`/>X$````*($`````````````````````````````*((UKYGB-:^9XC0/F>(
+MT#YGB-`^9X@``*(,`"P!0``L`4``0L%``$+!0`!"P4```*(<&(.`"AB#@`H8
+M8X`*&(.`"AB#@`H``!(P```#X```@&`````/``"!&````````($<````````
+M@2````````"!)````````($H````````@2P```````"!,````````($T````
+M````@3@```````"!/````````(%`@```J```@40```````"8"````````)@L
+M``"@````F#P`(`0```"83!*$(SP``)AP````'P``F'0```"```"8>`````X`
+M`)E8````_P``F8````````"9A`*``````)F@````````F>````````"9Y*JJ
+MJJH``)GH/$9D>```F>P```"J``"9\`````P``)GT````_P``F?@````4``"B
+M*```";4``*(\D\B)KP``HDP````!``"B4```H````*)4````````HE@,QU.`
+M``"B7`\/#P$``*)@7VD/`0``HF0`08H1``"B:````````*)L###!:@``HG``
+M@@@@``"B=``;?*H``*)X'.<YS@``HGP%%P'.``"C`!@!`````*,$,`,F`@``
+MHPA(!SX&``"C#%8+3`H``*,09!I@#P``HQ1X3VX;``"C&(:/?%H``*,<CL^&
+M6P``HR"=3Y</``"C)*7/H8\``*,HM5^O'P``HRR]W[F?``"C,,U_QS\``*,T
+MU?_1OP``HS@```````"C/````````*-`````````HT0```````"C2#____\`
+M`*-,/____P``HU`_____``"C5``#__\``*-8>:BJ'P``HUP&;$(/``"C8`\H
+M(@<``*-D%V`6A0``HV@?@!$$``"C;#>@#`,``*-P/\0(@P``HW17P`@#``"C
+M>%_8!H(``*-\?^`$@@``HX!_/'NZ``"CA/,P?_```)L$`````0``FP@````"
+M``";#`````,``)L0````!```FQ0````%``";&`````@``)L<````"0``FR``
+M```*``";)`````L``)LL````#0``FS`````0``";-````!$``)L\````$P``
+MFT`````4``";1````!4``)M(````&```FTP````9``";4````!H``)M4````
+M&P``FU@````<``";7````!T``)M@````(```FV@````B``";;````",``)MP
+M````)```FW0````E``";>````"@``)M\````*0``FX`````J``";A````"L`
+M`)N(````+```FY`````P``";E````#$``)N8````,@``FZ`````T``";I```
+M`#4``)NH````-0``FZP````U``";L````#4``)NT````-0``F[@````U``";
+MO````#4``)O`````-0``F\0````U``";R````#4``)O,````-0``F]`````U
+M``";U````#4``)O8````-0``F]P````U``";X````#4``)OD````-0``F^@`
+M```U``";[````#4``)OP````-0``F_0````U``";^````!```)O\````&@``
+MF@``````````````F@0`````````0```F@@`````````@```F@P````````!
+M@0``FA`````````!P0``FA0``````````0``FA@`````````00``FAP`````
+M````@0``FB`````````!:```FB0````````!J```FB@````````!Z```FBP`
+M````````*```FC``````````:```FC0````````!B0``FC@````````!R0``
+MFCP`````````"0``FD``````````20``FD0`````````B0``FD@````````!
+MD```FDP````````!T```FE``````````$```FE0`````````4```FE@`````
+M````D```FEP````````!D0``FF`````````!T0``FF0`````````$0``FF@`
+M````````40``FFP`````````D0``FG`````````!>```FG0````````!N```
+MFG@````````!^```FGP`````````.```FH``````````>```FH0````````!
+MF0``FH@````````!V0``FHP`````````&0``FI``````````60``FI0`````
+M````F0``FI@`````````V0``FIP`````````^0``FJ``````````^0``FJ0`
+M````````^0``FJ@`````````^0``FJP`````````^0``FK``````````^0``
+MFK0`````````^0``FK@`````````^0``FKP`````````^0``FL``````````
+M^0``FL0`````````^0``FL@`````````^0``FLP`````````^0``FM``````
+M````^0``FM0`````````^0``FM@`````````^0``FMP`````````^0``FN``
+M````````^0``FN0`````````^0``FN@`````````^0``FNP`````````^0``
+MFO``````````^0``FO0`````````^0``FO@`````````^0``FOP`````````
+M^0``F-0````@``"8T`(`%`@"`10(`@`4"`(`%`@"`10(``"8W`"@(,``H"#`
+M`.`@P`#@(,``X"#```"8G/````#P````\````/````#P``````"8G```````
+M``````````````````````"8G`,````#`````P````,````#``````"8G```
+M``````````````````````````"8G`````````````````````````````"8
+MG`````````````````````````````"8G```````````````````````````
+M``"8G`````````````````````````````"8G$!```!`0```0$```$!```!`
+M0`````"8G&4%``!E!0``904``&4%``!E!0````"8G```````````````````
+M``````````"8G`````````````````````````````"8G`!"````0@```$(`
+M``!"````0@````"8G`"U````M0```+4```"U````M0````"8G``#`````P``
+M``,````#`````P````"8G`#W````]P```/<```#W````]P````"8G`"=````
+MG0```)T```"=````G0````"8G``B````(@```"(````B````(@````"8G`0B
+M```$(@``!"(```0B```$(@````"8G``C`!@`(P`8`",`&``C`!@`(P`8``"8
+MG``H````*````"@`8``H`&``*`!@``"8G`!0`,``4`#``%``PP!0`,,`4`##
+M``"8G``$`'\`!`!_``0`?P`$`'\`!`!_``"8G```!%@```18```$6```!%@`
+M``18``"8G`````````````````````````````"8G```P````,````#`````
+MP````,````"8V`!``C``0`(P`$`",`!``C``0`(P``"8G```9````&0```!D
+M````9````&0```"8G```"`````@````(````"`````@```"8S`````X````.
+M````#@````X````.```'W```!^0```?$```'T```!^P```?P```'Y```!_``
+M```P````%0```!4````5````%0```!4``(`<$HV3IPF($\\$X!.5$N`3JPF(
+M$\\``)@H"@(``0H"``$%`@$`"@(``0H"``$``)@T```.#@``#@X```X.```.
+M#@``#@X``)@X````!P````<````+````"P````L``)A(`!CZ80`8^F$`&AIC
+M`!H:8P`:&F,``)A0#)BTX`R8M.`,F+#:#)BPV@R8L-H``)A8?L@-+G[(#2Y^
+MR`TN?L@-+G[(#2X``)A<,3E@7C$Y8%XQ.6!>,3E@7C$Y8%X``)AL!0RP@04,
+ML($%#+"!!0RP@04,L($``)D4```'T```!]````1,```(F```!]```)E$][@0
+M`/>X$`#WN`T`][@0`/>X$````*($`````````````````````````````*((
+MUKYGB-:^9XC0/F>(T#YGB-`^9X@``*(,`"[!X``NP>``*L$@`"K!(``JP2``
+M`*(<&(.`"AB#@`H88X`*&(.`"AB#@`H``*,`&`$``!@!```8`0``&`$``!@!
+M`````*,$,`,F`C`#)@(P`R8",`,F`C`#)@(``*,(2`<^!D@'/@9(!SX&2`<^
+M!D@'/@8``*,,5@M,"E8+3`I6"TP*5@M,"E8+3`H``*,09!I@#V0:8`]D&F`/
+M9!I@#V0:8`\``*,4>$]N&WA/;AMX3VX;>$]N&WA/;AL``*,8AH]\6H:/?%J&
+MCWQ:AH]\6H:/?%H``*,<D,^&6Y#/AEN.SX9;CL^&6X[/AEL``*,@G4^7#YU/
+MEP^;3Y</FT^7#YM/EP\``*,DI\^CCZ?/HX^CSY^/H\^?CZ//GX\``*,HM5^O
+M'[5?KQ^S7Z\?LU^O'[-?KQ\``*,LO=^YG[W?N9^[W[F?N]^YG[O?N9\``*,P
+MRW_%/\M_Q3_+?\<_RW_'/\M_QS\``*,TU?_1O]7_T;_3_]&_T__1O]/_T;\`
+M`!(P```#X```0&@````0``"`8`````\``("<````````@*````````"!&```
+M`````($<````````@2````````"!)````````($H````````@2P```````"!
+M,````````($T````````@3@```````"!/````````(%`@``#^0``@40`````
+M``"8"````````)@L``"@````F#P`(`0```"83!*$(SP``)AP````'P``F'0`
+M``"```"8>`````X``)E8``@?_P``F8````````"9A`*``````)F@````````
+MF>````````"9Y*JJJJH``)GH/$9D>```F>P```"J``"9\`````P``)GT````
+M_P``F?@````4``"B*```";4``*(\D\B)KP``HDP````!``"B4```H````*)4
+M````````HE@,QU.```"B7`\/#P$``*)@7VD/`0``HF0`08H1``"B:```````
+M`*)L###!:@``HG``@@@@``"B=`@;?*H``*)X'.<YS@``HGP%%P'.``"C.```
+M`````*,\````````HT````````"C1````````*-(/____P``HTP_____``"C
+M4#____\``*-4``/__P``HUAYJ*H?``"C7`9L0@\``*-@#R@B!P``HV078!:%
+M``"C:!^`$00``*-L-Z`,`P``HW`_Q`B#``"C=%?`"`,``*-X7]@&@@``HWQ_
+MX`2"``"C@'\\>[H``*.$\S!_\```FP0````!``";"`````(``)L,`````P``
+MFQ`````$``";%`````4``)L8````"```FQP````)``";(`````H``)LD````
+M"P``FRP````-``";,````!```)LT````$0``FSP````3``";0````!0``)M$
+M````%0``FT@````8``";3````!D``)M0````&@``FU0````;``";6````!P`
+M`)M<````'0``FV`````@``";:````"(``)ML````(P``FW`````D``";=```
+M`"4``)MX````*```FWP````I``";@````"H``)N$````*P``FX@````L``";
+MD````#```)N4````,0``FY@````R``";H````#0``)ND````-0``FZ@````U
+M``";K````#4``)NP````-0``F[0````U``";N````#4``)N\````-0``F\``
+M```U``";Q````#4``)O(````-0``F\P````U``";T````#4``)O4````-0``
+MF]@````U``";W````#4``)O@````-0``F^0````U``";Z````#4``)OL````
+M-0``F_`````U``";]````#4``)OX````$```F_P````:``":````````````
+M``":!````$````!```":"````(````"```":#````:$```%A``":$````>$`
+M``&A``":%````"$```'A``":&````&$````A``":'````8@```!A``":(```
+M`<@```&(``":)`````@```'(``":*````$@````(``":+````(@```!(``":
+M,````:D```"(``":-````>D```%I``":.````"D```&I``":/````&D```'I
+M``":0````=`````I``":1````!````!I``":2````%````&0``":3````)``
+M``'0``":4````;$````0``":5````?$```!0``":6````#$```"0``":7```
+M`'$```%Q``":8````;@```&Q``":9````?@```'Q``"::````#@````Q``":
+M;````'@```!Q``":<````9D```&8``":=````=D```'8``":>````!D````8
+M``":?````%D```!8``":@````)D```"8``":A````-D```%Y``":B````/D`
+M``&Y``":C````/D```'Y``":D````/D````Y``":E````/D```!Y``":F```
+M`/D```"Y``":G````/D```#Y``":H````/D```#Y``":I````/D```#Y``":
+MJ````/D```#Y``":K````/D```#Y``":L````/D```#Y``":M````/D```#Y
+M``":N````/D```#Y``":O````/D```#Y``":P````/D```#Y``":Q````/D`
+M``#Y``":R````/D```#Y``":S````/D```#Y``":T````/D```#Y``":U```
+M`/D```#Y``":V````/D```#Y``":W````/D```#Y``":X````/D```#Y``":
+MY````/D```#Y``":Z````/D```#Y``":[````/D```#Y``":\````/D```#Y
+M``":]````/D```#Y``":^````/D```#Y``":_````/D```#Y``"8U````"``
+M`)C0````"`````@````(````"`````@``)C<`*``P`"@`,``X`#``.``P`#@
+M`,```)B<,P```#,````S````,P```#,``````)B<`0````$````!`````0``
+M``$``````)B<`````````````````````````````)B<````````````````
+M`````````````)B<`````````````````````````````)B<'P```!\````?
+M````'P```!\``````)B<`````````````````````````````)B<`+@```"X
+M````N````+@```"X`````)B<`+<```"W````MP```+<```"W`````)B<`(0`
+M``"$````A````(0```"$`````)B<`)@```"8````F````)@```"8`````)B<
+M`,````#`````P````,````#``````)B<`/\```#_````_P```/\```#_````
+M`)B<`/\```#_````_P```/\```#_`````)B<`/\```#_````_P```/\```#_
+M`````)B<`/\```#_````_P```/\```#_`````)B<`-<```#7````UP```-<`
+M``#7`````)B<`&$```!A````80```&$```!A`````)B<`/X```#^````_@``
+M`/X```#^`````)B<`-X```#>````W@```-X```#>`````)B<`'\```!_````
+M?P```'\```!_`````)B<!#T```0]```$/0``!#T```0]`````)B<`'<```!W
+M````=P```'<```!W`````)B<`$0```!$````1````$0```!$`````)B<`)@`
+M``"8````F````)@```"8`````)B<`!``@``0`(``$`"``!``@``0`(```)B<
+M``7`-``%P#0`!<`T``7`-``%P#0``)B<`#$`\``Q`/``,0#P`#$`\``Q`/``
+M`)B<``P!'P`,`1\`#`$?``P!'P`,`1\``)B<`%$`0`!1`$``40!``%$`0`!1
+M`$```)B<`%``V@!0`-H`4`#:`%``V@!0`-H``)B<````````````````````
+M`````````)B<``!`1```0$0``$!$``!`1```0$0``)B<````````````````
+M`````````````)B<``!@P```8,```&#```!@P```8,```)B<```L````+```
+M`#8````V````+````)C(```$`P``!`,```0#```$`P``!`,``)B<``!D````
+M9````&0```!D````9````)B<```(````"`````@````(````"````)C,````
+M#@````X````.````#@````X```CL```(]```"-0```C@```(_```"0````CT
+M```)`$%2-3(Q,```05(U,C$Q``!!4C4R,3(``%)&-3$Q,0``4D8U,3$R``!2
+M1C(T,3,``%)&-30Q,P``4D5'3U!37T953D,`071H97)O<R`R,S$S(%=I4V]#
+M``!!=&AE<F]S(#4T,C0O,C0R-````$%T:&5R;W,@,C,Q-R!7:5-O0P``071H
+M97)O<R`U,C$R("A&4$=!*0!!=&AE<F]S(#4R,3$@*$901T$I`$%T:&5R;W,@
+M-3(Q,`````!!=&AE<F]S(#4R,3$`````071H97)O<R`U,S$R(%=I4V]#``!!
+M=&AE<F]S(#(S,34@5VE3;T,``$%T:&5R;W,@-3(Q,@``````````,"XY+C(P
+M+C,```````````````@````0````&````"`````H````,````#@````````!
+M_P'_`````````````'__________`````````````P&8`9D`````````````
+M?_________\````````````'`9@+,`````````````!__________P``````
+M``````@!F`PP`````````````'__________````````````(`$@"A``````
+M````````?_________\````````````A`2`!F0````````````!_________
+M_P```````````"(!(`PP`````````````'__________````````````.@%@
+M"A``````````````?_________\````````````[`6`!F0````````````!_
+M_________P```````````!(!90H0```````#`````'__________````````
+M````-P$P`9D```````,`````?_________\````````````U`C`!F0``````
+M`P````!__________P```````````#8#,`&9```````#`````'__________
+M````````````,`0P`9D```````,`````?_________\````````````Y!3`!
+MF0```````P````!__________P```````````#0&,`&9```````#`````'__
+M________````````````,@,P`9D```````,`````?_________\`````````
+M```Q`S`!F0````````````!__________P```````````!$!$`&9````````
+M`````'__________````````````$`$0"A``````````````?_________\`
+M``````````!2`5`!F0````````````!__________P```````````$4"4`&9
+M`````````````'__________````````````1P-0`9D`````````````?___
+M______\```````````!"!%`!F0````````````!__________P``````````
+M`%@%4`&9`````````````'__________````````````6P90`9D`````````
+M````?_________\```````````!="%`!F0````````````!__________P``
+M`````````%X)4`&9`````````````'__________````````````4`-0"A``
+M````````````?_________\```````````!5`5`,,`````````````!_____
+M_____P```````````%8"4`PP`````````````'__________````````````
+M20)0#5``````````````?_________\```````````!``4`*0```````1@``
+M``0`````````*`&(`````````$$!0`I```````!'````!`````````!H`8D`
+M````````2`%`"A```````$8````$``````````@!B@````````!*`4`*0```
+M````1@````0````````8"`&,`````````$L!0`I```````!&````!```````
+M`&`(`8T`````````3`%`"E```````$8````$``````````@!CP````````!#
+M`D`*0```````1P````0`````````<`&+`````````/`#0`I```````!&````
+M!``````````@````````````@`-`"D```````$<````$`````````&`/IP``
+M``````#Q`T`*0```````1@````0````````8`````````````($#0`I`````
+M``!&````!````````&``#Z@`````````@@-`"E```````$8````$````````
+M```/J0````````#R`T`*$```````1@````0``````````````````````(,$
+M0`I```````!'````!````````(!@#ZH`````````]`1`"D```````$8````$
+M````````F`````````````"$!$`*0```````1@````0```````#@``^K````
+M`````(4$0`I0``````!&````!````````(``#ZP`````````]01`"A``````
+M`$8````$````````@`````````````"&!4`*0```````1P````0```````"`
+M8`^M`````````(<%0`I```````!&````!````````.``#ZX`````````B`5`
+M"E```````$8````$````````@``/KP````````")!D`*0```````1P````0`
+M````````:`^P`````````(H&0`I```````!&````!````````&`(#[$`````
+M````BP9`"E```````$8````$``````````@/L@````````",!T`*0```````
+M1P````0```````"`:`^S`````````(T'0`I```````!&````!````````.`(
+M#[0`````````C@=`"E```````$8````$````````@`@/M0````````"/"$`*
+M0```````1P````0```````"`:`^V`````````)`(0`I```````!&````!```
+M`````.`(#[<`````````D0A`"E```````$8````$````````@`@/N```````
+M``#V"4`*0```````1P````0```````"`8````````````/<+0`I```````!'
+M````!````````(!@````````````8`!@`&``````````````?_________\`
+M``````````!A`&$`80```````P````!__________P```````````&(`8@!B
+M```````"`````'__________````````````8P!C`&,`````````````?___
+M______\```````````!D`&0`9````````P````!__________P``````````
+M`&4`90!E```````#`````'__________````````````9@!F`&8`````````
+M````?_________\```````````!G`&<`9P````````````!__________P``
+M`````````&@`:`!H`````````````'__________````````````:0!I`&D`
+M``````,`````?_________\```````````!J`&H`:@```````P````!_____
+M_____P```````````&4```````'_____````@/____\`````2E````^T````
+M`````&H```````'_____````@/____\`````2E````^T`````````?\`````
+M``$````!`````1M8```````0`````0````$````!&U@````(``,````!````
+M``````$;6`````P``P````$``````````1M8````(`!'````````````````
+M&U@````S`#`````!``````````$;6````"0`(0````$````!`````1M8````
+M*``W`````0`````````!&U@````?`#`````!`````0````$;6````#``6P``
+M``$``````````1M8````<``#`````0`````````!&U@````X`#<````!````
+M``````$;6````%0`50````$````!`````1M8````1`!5`````0````$````!
+M&U@```!,`#L````!```````````;6````&``4@````$````!`````1M8````
+M9``T`````0`````````!&U@```!\`"`````!`````0````$;6````)@`6P``
+M``$````!`````1M8````G`!2`````0````$````!&U@```"J`!`````!````
+M``````$;6````+P``P````$``````````1M8````OP`V`````0`````````!
+M&U@```#$`#<````!`````0````$;6````,L`-P````$``````````1M8````
+MT``W`````0`````````!&U@```#6`!`````!`````0````$;6````-H``P``
+M`````````````!M8```#,@`V`````0`````````!&U@```#>``,````!````
+M``````$;6````.D`-P````$``````````1M8````]@`W`````0`````````!
+M&U@```#Z`#<````!``````````$;6````/\`-@````$``````````1M8```!
+M#``P`````0````$````!&U@```$4`#<````!``````````$;6````2P`-P``
+M``$``````````1M8```!0``0`````0````$````!&U@```%4``,````!````
+M``````$;6````5@`(0````$````!`````1M8```!7``W`````0`````````!
+M&U@```%@`#<````!``````````$;6````60`6P````$``````````1M8```!
+M:`!2`````0`````````!&U@```%L`%(````!`````0````$;6````70`-P``
+M``$``````````1M8```!>``#`````0`````````!&U@```%\`#<````!````
+M``````$;6````8@`0`````$``````````!M8```!B0!!`````0``````````
+M&U@```&*`$@````!```````````;6````8L`0P````$``````````!M8```!
+MC`!*`````0``````````&U@```&-`$L````!```````````;6````8\`3```
+M``$``````````!M8```/IP"``````0``````````&U@```^H`($````!````
+M```````;6```#ZD`@@````$``````````!M8```/J@"#`````0``````````
+M&U@```^K`(0````!```````````;6```#ZP`A0````$``````````!M8```/
+MK0"&`````0``````````&U@```^N`(<````!```````````;6```#Z\`B```
+M``$``````````!M8```/L`")`````0``````````&U@```^Q`(H````!````
+M```````;6```#[(`BP````$``````````!M8```/LP",`````0``````````
+M&U@```^T`(T````!```````````;6```#[4`C@````$``````````!M8```/
+MM@"/`````0``````````&U@```^W`)`````!```````````;6```#[@`D0``
+M``$``````````!M8```!D`!"`````0`````````!&U@```&.``,````!````
+M``````$;6````9@`10````$````!`````1M8```!F@!%`````0``````````
+M&U@```&;`$4````!```````````;6````9P`7@````$``````````!M8```!
+MG@`#`````0`````````!&U@```&L`#<````!``````````$;6````:8``P``
+M``$``````````1M8```!M@`W`````0`````````!&U@```&X`#<````!````
+M``````$;6````;H`-P````$``````````1M8```!O@`A`````0````$````!
+M&U@```,G``,````!``````````$;6````<H`70````$``````````!M8```!
+MU@`W`````0`````````!&U@```'D`!`````!`````0````$;6````>P`,```
+M``$````!`````1M8```!^``#`````0`````````!&U@```(0`#<````!````
+M``````$;6````BH`(@````$``````````1M8```"0@`W`````0`````````!
+M&U@```(``%L````!``````````$;6````DH``P````$``````````1M8```"
+M3P`0`````0````$````!&U@```)<`%(````!``````````$;6````F``.P``
+M``$````!`````1M8```":``W`````0`````````!&U@```)L`#<````!````
+M``````$;6````G8`$`````$````!`````1M8```">@`#`````0`````````!
+M&U@```*"``,````!``````````$;6````H,``P````$``````````1M8```"
+MJ@`A`````0`````````!&U@```*^`%L````!`````0````$;6````K\`-P``
+M``$``````````1M8```"P0`W`````0`````````!&U@```+&`#L````!````
+M``````$;6````M0`-P````$``````````1M8```"\``W`````0`````````!
+M&U@```+T`#<````!``````````$;6````O@``P````$``````````1M8````
+MG@!0`````0````$````!&U@```+\``,````!``````````$;6````PP`,```
+M``$``````````1M8```#%``V`````0`````````!&U@```,8`#8````!````
+M``````$;6````R0``P````$``````````1M8```#$``#`````0`````````!
+M&U@```,Z`#<````!``````````$;6````T@`$`````$````!`````1;!```#
+M2@`2`````0````$````!&U@```-:`!$````!``````````$;6````UP`.@``
+M``$````!`````1M8```#7@!6`````0`````````!&U@```+```,````!````
+M``````$;6````W<``P````$``````````1M8```"S``#`````0`````````!
+M&U@````````3,Q,]%P`*!0```````````````````!`0`````````!-'$U$7
+M``H%````````````````````$!``````````$S@3=!<`%!0`````````````
+M```````0!P`````````33A-[&P8%!0````````````````````$`````````
+M`!-1$WD>!@H%`````````````````````0``````````$U83="$&%`4`````
+M```````````````!```````````3JQ.P%P`*!0```````````````````!`,
+M`````````!.P$]@7`!04````````````````````$`(`````````$[\3OQ<`
+M"@4````````````````````0#``````````4`!1X!084%```````````````
+M`````````````````!0R%&X7`!04````````````````````&`$`````````
+M%#(4;A0`%!0````````````````````8`0`````````4/!1X#P`4%```````
+M``````````````4``````````!0\%'@1!A04`````````````````````0$`
+M````````%#P4>!(`%!0````````````````````%```````````4/!1X%``4
+M%`````````````````````4``````````!0\%'@7`!04````````````````
+M````!0``````````%#P4>!<&%!0````````````````````!```````````4
+M/!3(%`84%``````````"``````````0``````````!1X%*`7`!04````````
+M``$`````````!0``````````%(P4H!<`%!0``````````P`````````%````
+M```````4C!3($@`4%``````````#``````````4``````````!2,%,@4`!04
+M``````````<```````"`!0``````````%(P4R!0&%!0``````````P``````
+M```!`@`````````4C!3(%P84%``````````#``````````$"`````````!2,
+M%,@7!A04``````````,``````````0``````````%(P4R!X`%!0`````````
+M```````````````````````4C!9$!084%``````````#````````````````
+M`````!2@%,@1!A04``````````,``````````0``````````%7P5]!X&%!0`
+M`````````@`````````$```````````5?!9$%`84%``````````#````````
+M``$$`````````!5\%D0;`!04``````````,`````````!0``````````%7P6
+M1!X`%!0``````````P`````````%```````````5?!9$%P`4%``````````'
+M````````@`$``````````!9Q%JT7`!04````````````````````````````
+M````%G$6K1X&%!0````````````````````````````````6<1:M'@84%```
+M```````"``````````0``````````!9Q%L$%!A04````````````````````
+M````````````%G$6P1$`%!0````````````````````````````````6<1;!
+M%``4%````````````````````````````````!9Q%L$>`!04````````````
+M````````````````````%G$6P1X&%!0``````````````````````P``````
+M```6<1;!'@84%````````````````````````````````!,X$W0>`!04````
+M```````````````$````````````$[`3V!X`%!0```````````````````0`
+M```````````4,A1N'@`4%``````````#````````!````````````!0\%'@>
+M`!04``````````,````````$````````````%(P4R!X`%!0``````````P``
+M``````0````````````6<1;!'@`4%```````````````````!```````````
+M`!5\%D0>`!04``````````,````````$````````````%(P4R!X`%!0`````
+M```````````````````````````4/!1X'@`4%```````````````````````
+M`````````!;!%L$>`!04```````````````````$````````````%`H46@4&
+M*"@````````````````````````````````4@A32!08H*``````````!````
+M`````````````````!3Z%7(%!B@H````````````````````````````````
+M%9H6$@4&*"@``````````0`````````````````````4'A1&!08H*```````
+M`````````````````````````!1N%+X%!B@H``````````$`````````````
+M````````%.857@4&*"@````````````````````````````````5AA8F!08H
+M*``````````!`````````````````````!10%'@1!B@H````````````````
+M````````````````%%`4>!<&*"@````````````````````````````````4
+M6A1:$08H*````````````````````````````````!1:%%H7`"@H````````
+M````````````````````````%*`4H!<&*"@``````````0`````````"````
+M```````4H!2@%`8H*``````````!``````````(``````````!2"%((1`"@H
+M``````````$``````````@``````````%*H4JA0`*"@``````````0``````
+M```"```````````4@A2J%``H*``````````!``````````(``````````!2"
+M%*H7!B@H``````````$``````````@``````````%:06'!0&*"@`````````
+M`0`````````"```````````6@!:H%``H*```````````````````````````
+M`````!:`%J@>!B@H````````````````````````````````%H46K1X&*"@`
+M```````````````````````````````46A2"#P`H*``````````#````````
+M!````````````!2J%*H2`"@H``````````,````````$````````````%:06
+M'!0`*"@``````````P````````0````````````6@!:H%``H*```````````
+M````````!`````````````D("40%!A0%````````````````````````````
+M````"0@)1!0`%`4````````````````````````````````);`FH!084!0``
+M``````````````````````````````EL":@4`!0%````````````````````
+M(```````````"6P)J!X`%`4````````````````````````````````);`F>
+M&P84!0````````````````````````````````EL"9X4`!0%````````````
+M````````(```````````"8`)BA0`%`4`````````````````````````````
+M```)F0FH%``4!0````````````````````````````````FC":@4`!0%````
+M```````````````@(```````````";0)M`4&%`4`````````````````````
+M```````````)M`FT%``4!0``````````````````*"````````````G0"JP%
+M!A0%````````````````````````````````"0@)1!0`%`4`````````````
+M```````````````````);`EL%``4!0``````````````````````````````
+M``EQ"8`4`!0%````````````````````````````````"84)BA0`%`4`````
+M```````````````````````````)CPF9%``4!0``````````````````````
+M``````````F>"9X4`!0%````````````````````````````````":,)HQ0`
+M%`4``````````(````````0````````````)HPFC%``4!0``````````@```
+M``````````````````FH":@4`!0%``````````"````````$````````````
+M":@)J!0`%`4``````````(`````````````````````)M`FT%``4!0``````
+M````@```````!`````````````FT";04`!0%``````````"`````````````
+M````````"0@)1`4&%`4````````````````````````````````)"`E$%``4
+M!0````````````````````````````````EL":@%!A0%````````````````
+M````````````````"6P)J!0`%`4```````````````````!````````````)
+M;`FH'@`4!0````````````````````````````````EL"9X;!A0%````````
+M````````````````````````"6P)GA0`%`4```````````````````!`````
+M```````)@`F*%``4!0````````````````````````````````F9":@4`!0%
+M````````````````````````````````"=`*K`4&%`4`````````````````
+M```````````````)HPFH%``4!0``````````````````("````````````D(
+M"404`!0%````````````````````````````````"6P);!0`%`4`````````
+M```````````````````````)<0F`%``4!0``````````````````````````
+M``````F%"8H4`!0%````````````````````````````````"8\)F10`%`4`
+M```````````````````````````````)G@F>%``4!0``````````````````
+M``````````````FC":,4`!0%``````````"````````$````````````":,)
+MHQ0`%`4``````````(`````````````````````)J`FH%``4!0``````````
+M@```````!`````````````FH":@4`!0%``````````"`````````````````
+M````"0@)1`4&*"@````````````````````````````````)A0F%!08H*```
+M``````````````````````````````F%"844!B@H````````````````````
+M````````````"84)A1(&*"@```````````````````0````````````)T`JL
+M!08H*`````````````````````````````````'_$`````````````````$`
+M````````````````````````(`@``@````````````````````#_````````
+M`````````"01````````````````````%`4```````````````````(%````
+M````````````````$P```````````5`0````````````````````````````
+M``````````````$`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````"4!``````````````````````````````````````
+M``````0`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````-0$```````````````````````````````````````````"!``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M!%`0``````````````````````````````````````````"```"`````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````%4!``````
+M`````````````````````````````````````$``````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````90,```````````````
+M``(``````````P``````````````@`!`@```````````````````"0@`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"%`P````````````````````````
+M`````````P````````$`!```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````)4#`````````````````"``````````0````#
+M`````````!`@!```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````$P,`````````````````(`````````!`````,```````@`
+M`(!`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````C`P`````````````````@`````````$`````P````````````!`````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````#,#``
+M```````````````"``````````0````#```````(````0```````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````0P,```````````
+M``````(`````````!`````,````````````@0```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````!3`P`````````````````@``
+M```````$`````P`````````````0````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````&,#`````````````````"``````````0`
+M```#``````````$`$0``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````$0$```````````````````````````````````````
+M```"``$`(```````````````````$@0``````````````````"`1````````
+M````````````````````````````````````````````````````````````
+M`````````2`0``````````````````````````````````````````0``@(`
+M````````````````````````````````````````(!(`````````````````
+M```````````````````````````````````````````````````````````!
+M8!`````````````````!``````````,``````````````@!`@"``````````
+M`````````!#$```````````````````$(0``````````````````````````
+M``````````````````````````````````````````````````%E$```````
+M``````````$``````````P```````````````````#@`````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````4!`````````````````
+M```````````(`````@`````````````$````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````"0$``````````````````````````
+M`!`````"``````````````7'````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````-`0`````````````````````````"```````(`
+M````````````@```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````!$!`````````````````!````````(```````@``````````
+M`$"`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```%0$`````````````````$````````@``````"``````````(`0(``````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````9`0```
+M````````````````````````"`````(`````````````B```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````!T!`````````````
+M````!````````(`(`````@```````````$"$````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(0$`````````````````$````
+M````@`@````"``````````(`0(0`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````E`0`````````````````````````"`````
+M``(`````````````@<<`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````"T!`````````````````!````````(```````@``````
+M`````$"!QP``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````-4/\`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```*````````````````````"@````````````````````````````````HP
+M_P``````````````````````````@`````,`````````````````````````
+M`````````````````````````````````````````````````````0``````
+M``````````````$`````````````````````!```````````"S`P````````
+M``````````````````$``````P``````````````````````````````````
+M````````````````````````````````````````````@```````````````
+M`````(`````````````````````$```````````,,#``````````````````
+M`````````@`````#````````````````````````````````````````````
+M```````````````````````````````````0````````````````````$```
+M``````````````````0```````````H0$```````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````"`````````````````````@````````````
+M````````!```````````"D!``````````````````````````'A@`````@``
+M````````````````````````````````````````````````````````````
+M```````````````*0```````````````````!$`````````````````````$
+M```````````*4$``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````(````````````````````"`````````````````````0`````````
+M``&9,```````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````@`
+M```````````````````(````````````````````!````````````&#_````
+M`````````````P````````0`````"````````^``````````````````````
+M``+``````````````````````````````````````````*_`````````````
+M```````+\``````````````````````(````````````9O\`````````````
+M```#````````!``````(```````#X````````````````````````L``````
+M````````````````````````````````````!\````````````````````'P
+M``````````````````````@```````````!G_P````````````````,`````
+M```$``````@```````/@```````````````````````"P```````````````
+M```````````````````````````OP```````````````````"_``````````
+M````````````"````````````&C_`````````````````P````````0`````
+M"````````^````````````````````````+`````````````````````````
+M`````````````````%?````````````````````5\```````````````````
+M```(````````````8?\````````````````#````````!``````0```````#
+MX```````````````````````````````````````````````````````````
+M````````K\````````````````````OP``````````````````````@`````
+M``````!B_P````````````````,````````$`````!````````/@````````
+M```````````````"P`````````````````````````````````````````"O
+MP```````````````````"_``````````````````````"````````````&/_
+M`````````````````P````````0`````"````````>``````````````````
+M``````+``````````````````````````````````````````"_`````````
+M```````````+\``````````````````````(````````````9/\`````````
+M```````#````````!``````0```````<``@``````````````````````L``
+M````````````````````````````````````````!\``````````````````
+M``'P``````````````````````@```````````!E_P````````````````,`
+M```````$`````!````````B$````````````````````````````````````
+M``````````````````````````````!7P```````````````````%?``````
+M````````````````"````````````&G_`````````````````P````````0`
+M````$````````\````````````````````````+`````````````````````
+M``````````````````````?````````````````````!\```````````````
+M```````(````````````:O\````````````````#````````!``````0````
+M```#P```````````````````````````````````````````````````````
+M````````````+\````````````````````OP``````````````````````@`
+M``````````&8_P``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`$``\`#S@8@`\`#S`$$`@`"#@8D`@`"#`$@`\@#U@8H`\@#U`$,`]@#W@8L`
+M]@#W`$H`\0#T@8P`\0#T`$L`@0"$@8T`@0"$`$P`@@"%@8\`@@"%`8@`\`#S
+M`8D`@`"#`8H`\@#U`8L`]@#W`8P`\0#T`8T`@0"$`8\`@@"%```````(````
+M```````````````````````````````````````!`A=P"P",```````!`B,H
+M#P`2```````!`B[@"@"8`@`````!`D90#@`D`@`````!`EW`"0"P!``````!
+M`HR@#0!(!``````!`KN`"`!@!``````!`M+P#`!L!```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````(```````````````````````````````````````````!
+M`Q=P"P",```````!`R,H#P`2```````!`R[@"@"8`@`````!`T90#@`D`@``
+M```!`UW`"0"P!``````!`XR@#0!(!``````!`[N`"`!@!``````!`]+P#`!L
+M!```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(````````````````````````
+M```````````````````!`A=P"P",```````!`B,H#P`2```````!`B[@"@"8
+M`@`````!`D90#@`D`@`````!`EW`"0"P!``````!`HR@#0!(!``````!`KN`
+M"`!@!``````!`M+P#`!L!```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````(````
+M```````````````````````````````````````!`Q=P"P",```````!`R,H
+M#P`2```````!`R[@"@"8`@`````!`T90#@`D`@`````!`UW`"0"P!``````!
+M`XR@#0!(!``````!`[N`"`!@!``````!`]+P#`!L!```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````$```````````````````````````````````````````!
+M``/H"P""```````!``?0"@2$`0`````!`!5\"02+`0`````!`"KX"`26`0``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````*($`````````````*((4#Y&1E`^
+M1D8``*(,9(!!;&2`06P``*(0`9F@`P&9H`,``*(4!$S6$`1,UA```*(8$X``
+M0!.``$```*(<&^``8!O@`&```*(@#%.`"@Q3@`H``*(D`!3?.P`4WSL``*(H
+M```!M0```;4``*(L````(````"```)B<`````````````)B<````````````
+M`)B<`````````````)B<`````````````)B<`````````````)B<````````
+M`````)B<`````````````)B<`````````````)B<`````````````)B<````
+M`````````)B<`````````````)B<`#@````X`````)B<`````````````)B<
+M`````````````)B<`````````````)B<``0`^0`$`/D``)C4``````````0`
+M`)B<`````````````)B<`````````````)B<`````````````)B<````````
+M`````)B<`````````````)B<$````!```````)B<!`````0``````)B<````
+M`````````)B<`````````````)B<`````````````)B<``````H``````)B<
+M`#@`@`(X`(```)B<``(`!@````8``)B<````D@```)(``)B<````H````*``
+M`)B<``0`!P`$``<``)C4````&@```!H``)B<````2````$@``)B<````$```
+M`!```)B<````"`````@``)B<````#P````\``)B<````\@```&(``)B<``"0
+M3P``D$P``)B<```26@``$IH``)C,````#@````\````(````````````````
+M```````````````````````````!`A=P"P",```````!`B,H#P`2```````!
+M`B[@"@"8`@`````!`D90#@`D`@`````!`EW`"0"P!``````!`HR@#0!(!```
+M```!`KN`"`!@!``````!`M+P#`!L!```````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```(```````````````````````````````````````````!`@NX"P"&````
+M```!`A&4#P`)```````!`A=P"@",`@`````!`B,H#@`2`@`````!`B[@"0"8
+M!``````!`D90#0`D!``````!`EW`"``P!``````!`FEX#``V!```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````(````````````````````````````````````
+M```````!`@7<"P"#```````!`@C*#P`$```````!`@NX"@"&`@`````!`A&4
+M#@`)`@`````!`A=P"0",!``````!`B,H#0`2!``````!`B[@"``8!``````!
+M`C2\#``;!```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````'````````````````
+M```````````````````````````!`Q=P"P",```````!`R[@"@"8`@`````!
+M`T90#@`D`@`````!`UW`"0"P`P`````!`XR@#0!(`P`````!`[N`"`!@`P``
+M```!`]+P#`!L`P``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```(```````````````````````````````````````````!`Q=P"P",````
+M```!`R,H#P`2```````!`R[@"@"8`@`````!`T90#@`D`@`````!`UW`"0"P
+M!``````!`XR@#0!(!``````!`[N`"`!@!``````!`]+P#`!L!```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````$````````````````````````````````````
+M```````!``/H&P""```````!``?0&@2$`0`````!`!5\&02+`0`````!`"KX
+M&`26`0``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````,````````````````
+M```````````````````````````!``/H&P""```````!``?0&@2$`0`````!
+M`!5\&02+`@`````!`"KX&`26`P```````A=P"P`,!````````B,H#P`2!```
+M```!`B[@"@`8!@`````!`D90#@`D!@`````!`EW`"0`P"``````!`HR@#0!(
+M"``````!`KN`"`!@"``````!`M+P#`!L"```````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```-```````````````````````````````````````````!!`#Z`P"!``)D
+M`F0!!`'T!P"!``')`<D!!`/H`@""`0#D`.0!!`?0!@"$`@"@`*`!!`NX`0"&
+M`P",`(P!`A=P"P",!``\`#P!`B,H#P`2!``\`#P!`B[@"@"8!@`P`#`!`D90
+M#@`D!@`P`#`!`EW`"0`P"``L`"P!`HR@#0!("``L`"P!`KN`"`!@"``L`"P!
+M`M+P#`!L"``L`"P`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5L82YT97AT`"YR
+M96QA+G)O9&%T80`N<F]D871A+G-T<C$N-``N<F5L82YD871A`"YB<W,`+F-O
+M;6UE;G0`````````````````````````````````````````````````````
+M```````@`````0````8`````````-``"#9````````````````0`````````
+M&P````0````````````#,/0``&FH````"P````$````$````#````"L````!
+M`````@```````@W(``".-```````````````"``````````F````!```````
+M``````.:G```%80````+`````P````0````,````,P````$````R```````"
+MF_P```$````````````````$`````0```$<````!`````P```````IT```!5
+M*```````````````"`````````!"````!`````````````.P(````&`````+
+M````!@````0````,````30````@````#```````"\B@```&8````````````
+M```"`````````%(````!`````````````O(H```#J````````````````0``
+M```````1`````P````````````+UT````%L```````````````$`````````
+M`0````(````````````"^#0``"&`````#````(4````$````$`````D````#
+M`````````````QFT```7/0```````````````0``````````````````````
+M`````````````````````P```0````````````````,```,`````````````
+M```#```%`````0`````````&`0```P````P```"4````#`$```,````7````
+MH````!8!```#````(@```+8````6`0```P```"T```#4````&`$```,````X
+M````[````!@!```#````0P```#````E@`0``!@```$X```F0````2`$```8`
+M``!9```)V```"CP!```&````9```%!@```:@`0``!@```&\``!JX```#0`$`
+M``8```!Z```=^````R`!```&````A0``(1@```*@`0``!@```)```".X````
+MH`$```8```";```D6```&(`!```&````I@```0P````8`0```P```+$``$0`
+M````.`(```$```"\```\V````%0!```&````QP``/2P````J`0``!@```-(`
+M``$H```2<`$```,```#=``!?R````"0"```!````Z```7^P````(`@```0``
+M`/,``!.8````!@$```,```#^```3H```!3@!```#```!"0``&-@````1`0``
+M`P```10``!CJ````"@$```,```$?```8]````$0!```#```!*@``&3@``!)P
+M`0```P```34``*@$````3`(```$```%```"H4`````@"```!```!2P``*Z@`
+M```&`0```P```/,``"O(````!@$```,```%6```KT````"`!```#```!80``
+M*_````*\`0```P```6P``"ZL```%6`$```,```%W``!%C````5`!```&```!
+M@@``-`0```,``0```P```8T``$;<```!+`$```8```&8```W!````B@!```#
+M```!HP``.2P````#`0```P```:X``#DP````*`$```,```&Y`````````0@!
+M```(```!Q````0@```"``0``"````<\```&(````$`$```@```':```Y6```
+M``H!```#```!Y0``.80```$@`0```P```?```#JH```2<`$```,```'[``$%
+M<````!@"```!```"!@``31@````&`0```P```A$``$T>````!@$```,```(<
+M``!-=`````8!```#```")P``37H````,`0```P```C(``12`````*`(```$`
+M``(]``!-N````"`!```#```"2```3=@````L`0```P```E,``$Z8````'`$`
+M``,```)>``!/+````E@!```#```":0``480```8@`0```P```10``%>R````
+M"@$```,```)T``!7O`````H!```#```!Y0``5\@```%P`0```P```G\``%DX
+M```!<`$```,```**``!;*````5`!```#```"E0``7'@```)``0```P```J``
+M`%ZX```!F`$```,```*K``!@4````P`!```#```"M@``8U`````(`0```P``
+M`L$``&-8````&`$```,```+,``!C<````!@!```#```"UP``8X@```&8`0``
+M`P```N(``&4@````P`$```,```+M``&TN````3@"```!```"^```9>````(H
+M`0```P```P,``;7P```!8`(```$```,.``&W4````%@"```!```#&0`!MZ@`
+M``6(`@```0```R0``;V@```$"`(```$```,O``'#Z````%@"```!```#.@`!
+MQ$`````(`@```0```:X``&@H````+`$```,```-%``'$2````$@"```!```#
+M4```:%0```&``0```P```UL``&G4```"*`$```,```-F``!K_````P`!```#
+M```#<0``;OP````(`0```P```WP``&\$````&`$```,```.'``!O'````!@!
+M```#```#D@``;S0```/``0```P```YT``'+T```!.`$```,```.H``'%:```
+M`3@"```!```#LP`!QJ````,D`@```0```[X``<G$````4`(```$```/)``'*
+M%```!S@"```!```#U``!T4P```78`@```0```]\``=MT````6`(```$```/J
+M``'>M````+0"```!```#]0``=$P```&``0```P``!````'7,```$6`$```,`
+M``0+``!Z)````P`!```#```$%@``?20````(`0```P``!"$``'TL````&`$`
+M``,```0L``!]1````!@!```#```$-P``?5P```*(`0```P``!$(``'_D````
+M2`$```,```1-``'@2````3@"```!```$6``!X8````,D`@```0``!&,``>2D
+M```#.`(```$```1N``'GW````%`"```!```$>0`![X````'8`@```0``!(0`
+M`?%8````<`(```$```2/``'TQ````+0"```!```$F@``@$P```+0`0```P``
+M!*L``(,<```$``$```,```2V``"''````P`!```#```$P0``BAP````(`0``
+M`P``!,P``(HD````&`$```,```37``"*/````!@!```#```$X@``BE0```-X
+M`0```P``!.T``(W,````2`$```,```3X``'V9````3@"```!```%`P`!]YP`
+M``,$`@```0``!0X``?J@```$:`(```$```49``'_"````%`"```!```%)``"
+M!JP```'8`@```0``!2\``@B$````<`(```$```4Z``(+\````+0"```!````
+M`````````````P``!@````````````````,```@````````````````#```)
+M```%10``JB@```"D$@```0``!5```):<````"!(```$```5;``$ZP````?P2
+M```!```%9@``<KP```"H$@```0``!7$``59D```"E!(```$```5\````````
+M```0```````%A@`!`IP````X$@```0``!9$``64````!I!(```$```6<``!B
+M&````7@2```!```%IP`!KE0```%,$@```0``!;(``#U8```!I!$```8```6]
+M``%!L````%`2```!```%R```980```!($@```0``!=,``%10```!"!(```$`
+M``7>``!,]````:01```&```%Z0`!,Q0````X$@```0``!?0``2TP````+!(`
+M``$```7_``$>S`````@2```!```&"@`!`:@```#P$@```0``!A4``0X4```!
+M?!(```$```8@```*C````)`2```!```&*P``\R````#0$@```0``!C8``-JL
+M```!`!(```$```9!``"\X````)@2```!```&3```PNP````D$@```0``!E<`
+M`)P4````2!(```$```9B``$WB````$@2```!```&;0`!`3`````($@```0``
+M!G@``1L\````,!(```$```:#``%8^````-P2```!```&C@``!Y0```!<$@``
+M`0``!ID``06(````\!(```$```:D``"O&`````@2```!```&KP`!G&````!\
+M$@```0``!KH``)_8````"!(```$```;%``##$````"@2```!```&T```#WP`
+M``',$@```0``!NL``$@(```!I!$```8```;V``$NR````*@2```!```'`0``
+MG70```"<$@```0``!PP```-<````-!(```$```<7``&>F````)`2```!```'
+M(@``````````$```````!T,``&U0````;!(```$```=.``$QQ````2P2```!
+M```'60`!,4````"$$@```0``!V0``/;4````Q!(```$```=O``!PZ````$02
+M```!```'>@``MOP```!T$@```0``!X4``+UX````J!(```$```>0``#WV```
+M`$@2```!```'FP``LZP````P$@```0``!Z8``2_`````F!(```$```>Q``"?
+M\````&`2```!```'O```;`````!P$@```0``!\<``);D````2!(```$```?2
+M``$FG````)`2```!```'W0``OX0```!$$@```0``!^@``2]P````0!(```$`
+M``?S``$M_````)`2```!```'_@`!`[P```",$@```0``"`D``5GX````5!(`
+M``$```@4``!E?`````@2```!```('P`!,%@```"H$@```0``""H``%G````%
+MZ!(```$```@U``"_"````#@2```!```(0``!*9@```"4$@```0``"$L```+,
+M````D!(```$```A6``$NC````#P2```!```(80`!AO0```%4$@```0``"&P`
+M`1F0````7!(```$```AW``%C8````-@2```!```(@@``<!@```!($@```0``
+M"(T``*]H````S!(```$```B8``"T\````)@2```!```(HP``E6P````\$@``
+M`0``"*X``8YD````S!(```$```BY``"(4````S`2```!```(Q```=4@````$
+M$@```0``",\``8\P````1!(```$```C:``"8M````V`2```!```(Y0```9@`
+M``$H$@```0``"/0``748```#?!(```$```C_```````````0```````)!@`!
+M/V0```$H$@```0``"1$``+ZH````+!(```$```D<``&+L````<`2```!```)
+M)P`!-C@```%0$@```0``"3(``4"P````*!(```$```D]```"P`````P2```!
+M```)2```N0P````H$@```0``"5,``/@@```!)!(```$```E>``#WF````$`2
+M```!```):0``TE````!H$@```0``"70``%^H````(!(```$```E_``!P8```
+M`(@2```!```)B@```Y````'($@```0``":```6(X````/!(```$```FK``"@
+M4````+P2```!```)M@``<GP```!`$@```0``"<$``*R\````,!(```$```G,
+M``%9U````"02```!```)UP``XV0```!$$@```0``">(``2%4```$O!(```$`
+M``GM``$=4`````@2```!```)^```9I@```#,$@```0``"@,``*K,````>!(`
+M``$```H.``&AU````&`2```!```*&0`!'R````%D$@```0``"B0``+YT````
+M!!(```$```HO``!LO````)02```!```*.@``]K`````D$@```0``"D4``0;,
+M```&V!(```$```I0``&*U````-P2```!```*6P`!+2@````($@```0``"F8`
+M`+.`````+!(```$```IQ``%#!````*@2```!```*?```EI0````($@```0``
+M"H<``9I<```!9!(```$```J2``#&1````$02```!```*G0``:M@```!D$@``
+M`0``"J@``3$`````0!(```$```JS``$-I````'`2```!```*O@``_TP````L
+M$@```0``"LD``9\H````:!(```$```K4```````````0```````*X0``F#0`
+M``"`$@```0``"NP``'QH````1!(```$```KW``&<4````!`2```!```+`@`!
+MH``````($@```0``"PT``2J\````R!(```$```L8```%P````802```!```+
+M*0`!DJ````2\$@```0``"S0``'$L````O!(```$```L_``">7````,@2```!
+M```+2@``OF@````$$@```0``"U4``2U<````+!(```$```M@``&OH````*@2
+M```!```+:P``>UP```"H$@```0``"W8``13(````U!(```$```N!``"O(```
+M`$@2```!```+C```U*````'D$@```0``"Y<``)6H````[!(```$```NB``%L
+ML```!R`2```!```+K0`!1,P````T$@```0``"[@``3R\````+!(```$```O#
+M``#&B````302```!```+S@`!,TP```+L$@```0``"]D``+L@````C!(```$`
+M``OD``"^?````"P2```!```+[P`!-]````+P$@```0``"_H``8_````!L!(`
+M``$```P%``&B-```!J`2```!```,$```OT````!$$@```0``#!L``*$0````
+M%!(```$```PF``!DB`````@2```!```,,0``JT0```%X$@```0``##P``2B0
+M````:!(```$```Q'``!U[````"`2```!```,4@`!]7@```#L$@```0``#%T`
+M`'4\````!!(```$```QH``$MM`````@2```!```,<P`!+`P```!@$@```0``
+M#'X``%`\```!I!$```8```R)``$`'````)@2```!```,E``!M&0```!4$@``
+M`0``#)\``'.T````F!(```$```RJ``##.````"@2```!```,M0``?*P```&0
+M$@```0``#,```58P````-!(```$```S+``$F0````"P2```!```,U@`!*/@`
+M``"@$@```0``#.$``:!````!E!(```$```SL``"&L````"@2```!```,]P``
+M>00````H$@```0``#0(``&YX````Y!(```$```T-``!\+````#P2```!```-
+M&``!)]P```"T$@```0``#2,``5TX```#S!(```$```TN``&85````@@2```!
+M```-.0``0*````&D$0``!@``#40``&=D```"'!(```$```U/``!&_````'@2
+M```!```-6@``EJ0```!`$@```0``#64``'P$````*!(```$```UP````````
+M```0```````-D```?CP```>,$@```0``#9L`````````"1$```8```VK``%F
+MI````*@2```!```-M@``M8@```!<$@```0``#<$``@RD````[!(```$```W,
+M``$/D````%@2```!```-UP`!*E0```!H$@```0``#>(``'5,````!!(```$`
+M``WM``%BQ````)P2```!```-^```OFP````($@```0``#@,``,)`````*!(`
+M``$```X.``"P-````,P2```!```.&0`!+;P````X$@```0``#B0`````````
+M`!````````XS``"V0````'`2```!```./@``3I@```&D$0``!@``#DD``3\\
+M````*!(```$```Y4``$60````'@2```!```.7P``VZP```!@$@```0``#FH`
+M`(:,````)!(```$```YU``"[Z````*@2```!```.@``!'5@```%T$@```0``
+M#HL``$FL```!I!$```8```Z6``$R\````"02```!```.H0``N'@```"4$@``
+M`0``#JP``408````M!(```$```ZW``&L&````CP2```!```.P@``L0````)0
+M$@```0``#LT``'H0````2!(```$```[8``"T<````$02```!```.XP``WMP`
+M``%`$@```0``#NX``(YD````&!(```$```[Y``%"7````*@2```!```/!```
+M2U````&D$0``!@``#P\``+7D````7!(```$```\:``"WV````*`2```!```/
+M)0``;UP```"4$@```0``#S```9>$````+!(```$```\[```````````0````
+M```/2@`!`3@````0$@```0``#U4``29L````,!(```$```]@``!IL````"P2
+M```!```/:P`!+[`````0$@```0``#W8``+Y@````"!(```$```^!``$G<```
+M`&P2```!```/C```0D0```&D$0``!@``#Y<``,7P````*!(```$```^B``"L
+M[````2`2```!```/K0```4````!8$@```0``#[L``#[\```!I!$```8```_&
+M``#%2````*@2```!```/T0``K@P````($@```0``#]P````,````)!$```8`
+M``_N``!MO````#@2```!```/^0``;F@````0$@```0``$`0``1[4````3!(`
+M``$``!`/``!WS````(P2```!```0&@`!L>````*$$@```0``$"4``'A8````
+M*!(```$``!`P``"\T````!`2```!```0.P`!050```!<$@```0``$$8``%,<
+M````U!(```$``!!1``&77````"@2```!```07```Q*````"H$@```0``$&<`
+M`+X@````0!(```$``!!R``%!`````%02```!```0?0``_W@````P$@```0``
+M$(@``8]T````3!(```$``!"3``"\D````$`2```!```0G@`!<]````$($@``
+M`0``$*D``*X4```!!!(```$``!"T``$!2````&`2```!```0OP``0^@```&D
+M$0``!@``$,H``'G(````2!(```$``!#5``&@"````#@2```!```0X```8\``
+M``#($@```0``$.L``'B`````8!(```$``!#V``#Z=```!+`2```!```1`0``
+M=9````!<$@```0``$0P``'.D````$!(```$``!$7``$6N````?`2```!```1
+M(@`!C7````#T$@```0``$2T``,88````+!(```$``!$X``!3\````&`2```!
+M```10P`!&J@```"4$@```0``$4X```Y,````B!(```$``!%9```([````:`2
+M```!```19``!&30```!<$@```0``$6\``'1,````J!(```$``!%Z``!XX```
+M`"02```!```1A0`!A-@```",$@```0``$9```&ND````7!(```$``!&;``%T
+MV````$`2```!```1I@``0\@````X$@```0``$;$```58````:!(```$``!&\
+M``$G+````$02```!```1QP``````````$```````$=<``..H```!?!(```$`
+M`!'B``!CD````#`2```!```1[0`!F\````"0$@```0``$?@``&QP````3!(`
+M``$``!(#``$@A````-`2```!```2#@``NF0```"\$@```0``$AD``0"T````
+M?!(```$``!(D```````````0```````21```!_````#\$@```0``$D\``&H4
+M````>!(```$``!):``!JC````$02```!```290``M+0````\$@```0``$G``
+M`&7,````S!(```$``!)[``"W<````&@2```!```2A@`!#^@```28$@```0``
+M$I$``+[4````+!(```$``!*<``%%`````:`2```!```2IP``=30````($@``
+M`0``$K(``&F`````,!(```$``!*]``!N8`````@2```!```2R```````````
+M$```````$M8``+-0````,!(```$``!+A```,"````-02```!```2[```=5``
+M``!`$@```0``$O<``,1$````7!(```$``!,"``"_R````"P2```!```3#0``
+MAUP```#T$@```0``$Q@``'I8````7!(```$``!,C``!M]````&P2```!```3
+M+@`!)A`````P$@```0``$SD``4#8````*!(```$``!-$``%5@````+`2```!
+M```33P``MK````!,$@```0``$UH``1I<````3!(```$``!-E``%G3```!602
+M```!```3<```;_`````H$@```0``$WL``,)H````A!(```$``!.&``"Y-```
+M`$@2```!```3D0``GR0```"T$@```0``$YP``+/D````C!(```$``!.G``"^
+M>`````02```!```3L@``ERP```$($@```0``$[T``%'@```!I!$```8``!/(
+M``!J#`````@2```!```3TP``L]P````($@```0``$]X``&&8````@!(```$`
+M`!/I``!DD````.P2```!```3]``!&>P```!P$@```0``$_\```[4````J!(`
+M``$``!0*``&>>````"`2```!```4%0`!+?0````($@```0``%"```+H$````
+M8!(```$``!0K``&$.````*`2```!```4-@``P;0```",$@```0``%$$``,>\
+M```*<!(```$``!1,``!3A````:01```&```45P`!%*@````@$@```0``%&(`
+M`&L\````:!(```$``!1M```'1````%`2```!```4>```:=P````P$@```0``
+M%(,``9S<```!G!(```$``!2.``&1_````*02```!```4F0``>2P````H$@``
+M`0``%*0``+NL````/!(```$``!2O``%`C````"02```!```4N@``>50```!T
+M$@```0``%,4``&!\````E!(```$``!30``!S9````$`2```!```4VP``IE``
+M```X$@```0``%.8```S<```!<!(```$``!3Q``$"F`````02```!```4_```
+MG%P```!D$@```0``%0<``,.T````2!(```$``!42``!U0`````@2```!```5
+M'0``^=````"D$@```0``%2@``4(`````7!(```$``!4S``'$D````-@2```!
+M```5/@``=/0```!`$@```0``%4D``%58````.!(```$``!54``!,1```!M@2
+M```!```5:@`!0ZP```!L$@```0``%74``'JT````J!(```$``!6```%&H```
+M#N`2```!```5BP`!&VP```'D$@```0``%98``/^H````=!(```$``!6A``##
+M_````$@2```!```5K```G,````"T$@```0``%;<``$,H````H!(```$``!7"
+M``"?X````!`2```!```5S0``AM@```"$$@```0``%=@``,-@````5!(```$`
+M`!7C``#2+````"02```!```5[@``81````"($@```0``%?D``*$,````!!(`
+M``$``!8$``!QZ````)02```!```6#P``\?P```!`$@```0``%AH``3ZP````
+MC!(```$``!8E``$L;````+P2```!```6,```N7P```"($@```0``%CL``*&P
+M```$H!(```$``!9&``"1U````P@2```!```640`!+8@````L$@```0``%EP`
+M`/\D````*!(```$``!9G``'?:````.`2```!```6<@`!*X0```"($@```0``
+M%GT``1BH````C!(```$``!:(``%:3````NP2```!```6DP`!E[`````P$@``
+M`0``%IX``````````!```````!:P``"IE````)02```!```6NP`!%9P```"D
+M$@```0``%L8``````````!```````!;7``!JT`````@2```!```6X@``OP``
+M```($@```0``%NT``)X0````3!(```$``!;X``$J+````"@2```!```7`P`!
+M?C@```%4$@```0``%PX``-*X```!Z!(```$``!<9``!&=````(@2```!```7
+M,@`!E^````!T$@```0!Z>C`P,#$R,C$Q`'IZ,#`P,C<V.&,`>GHP,#!D.3!F
+M,`!Z>C`P,S8T-61D`'IZ,#!C9&8V8C8`>GHP,&-D9C9C,P!Z>C`P,6%C-C@S
+M`'IZ,#9B,60W,#,`>GHP,#`V-3,S,0!Z>C`P,6%A-C$S`'IZ,#,U-&1F-C,`
+M>GHP,#%A830Y,P!Z>C`P9#4Q.3`S`'IZ,&%A,F5B83``>GHP,#`Q86,R8@!Z
+M>C`P,#`P9#,U`'IZ,#`P,#8V,F,`>GHP,#`P-CDU90!Z>C`P,#8X,S1E`'IZ
+M,#`P,&(V9&4`>GHP8C9B9C`P.0!Z>C!B-64S,6$X`'IZ,#`P,#%A.#``>GHP
+M,#!B9#$Q-@!Z>C`U93AE-F,Q`'IZ,&5C,V(R,F4`>GHP,#<Q8F)B9`!Z>C`P
+M,#!B-F4V`'IZ,&(V8S<P,#D`>GHP8C8R,S%A.`!Z>C`P,#,S,#,R`'IZ,#`P
+M,&0R-#D`>GHP,#`R9&(W-0!Z>C`P,#5B-C<X`'IZ,#`P8C9D8S(`>GHP,#)D
+M.38U8P!Z>C`P,#)D83EB`'IZ,#`P-C,X-&0`>GHP,#`P930Y.`!Z>C`P,#8U
+M-#`Y`'IZ,#`P9#1E.#8`>GHP,#`V83,T,P!Z>C`P,#9D-3EC`'IZ,&5C,V(R
+M,S,`>GHP,#`Q.3@W8P!Z>C`P,#!B-F5E`'IZ,#!B-F1A,C@`>GHP,#`S,S`P
+M,`!Z>C`P,#,S,#`U`'IZ,#`Q.3@X,#``>GHP,#`P,3DV,0!Z>C!B-F8S8V-B
+M`'IZ,#`P,&0R-#@`>GHP,#`S,F0T9`!Z>C`P,#`Q.&5A`'IZ,#`P,F1B.34`
+M>GHP,#`U8C9B.`!Z>C!E8S-B,C)F`'IZ,#`Q.3AA8S``>GHP,#5B-V(X9@!Z
+M>C`P8C9D9F5F`'IZ,#`U8C4U868`>GHP-6(S,30V9@!Z>C`P-6(U-6-F`'IZ
+M,#`U8C4U968`>GHP,#5B-38P9@!Z>C`P-6(U-C9F`'IZ,#`U8C4V.&8`>GHP
+M,#)D8S(W-0!Z>C`P,3AE,6,P`'IZ,#`U8C9B,F4`>GHP,#)D83EF8@!Z>C`P
+M,F1B-C@U`'IZ,#)D8C@U,&0`>GHP,#`U8C1E,@!Z>C!B-3(S,6$X`'IZ,#!B
+M-F$W-64`>GHP,#5B-V(Y,`!Z>C`P8C9D9F8P`'IZ,#5B,S$T-S``>GHP,#5B
+M-35D,`!Z>C`P-6(U-68P`'IZ,#`U8C4V,3``>GHP,#5B-38W,`!Z>C`P-6(U
+M-CDP`'IZ,#`R9&,T-S4`>GHP,#5B-F8R90!Z>C`P,F1A8F9B`'IZ,#`R9&(X
+M.#4`>GHP,F1B834P9`!Z>C`P,#5B-3(R`'IZ,&(U-C,Q83@`>GHP,#5B-V(X
+M-0!Z>C`P8C9D9F4U`'IZ,#5B,S$T-C4`>GHP,#5B-35C-0!Z>C`P-6(U-64U
+M`'IZ,#`U8C4V,#4`>GHP,#5B-38V-0!Z>C`P-6(U-C@U`'IZ,#`R9&%E-S4`
+M>GHP,#5B-#,R90!Z>C`P,F1A,C@U`'IZ,#`R9#DU9F(`>GHP,F1A-#4P9`!Z
+M>C`P,39C8V$R`'IZ,&(R83,Q83@`87(U,C$R36]D97-?-30Q,P!Z>C`P8C9D
+M9F9D`'IZ,#5B,S$T-V0`>GHP,#5B-35D9`!Z>C`P-6(U-69D`'IZ,#`U8C4V
+M,60`>GHP,#5B-38W9`!Z>C`P-6(U-CED`'IZ,#`R9&1E-S4`>GHP,#5B83,R
+M90!Z>C`P,F1D,C@U`'IZ,#`R9&,U9F(`>GHP,F1D-#4P9`!Z>C`P,39E-&$R
+M`'IZ,&(X83,Q83@`>GHP,#5B-3@T-@!Z>C`P,F1B,3%C`'IZ,#)D8F8X-S4`
+M>GHP,F1B8C%B,@!Z>C`R9&(R,#4S`%]?87-H;&1I,P!Z>C`P,F1B830R`'IZ
+M,&9B8C%E,V8`>GHP8C<Y96$Y-`!Z>C`U8CAC-C5A`'IZ,#`U8C0P860`>GHP
+M-6(Y-#)E9`!Z>C!D.&1C-C)C`'IZ,#`Q.68T-S``>GHP,F1D.30R9`!Z>C`R
+M9&)E-S-D`'IZ,#`U8C8Y,F(`>GHP8C9D,C,R-0!Z>C`P-6(X-3-D`'IZ,#`Q
+M-F0Y,F4`>GHP8V9B,3@W-0!Z>C`P,F1B,S%C`'IZ,#)D86)B86,`>GHP,F1B
+M8S@U,0!Z>C`P,&(V8S8X`'IZ,#`P8C9B9C@`>GHP,&(V8V8U90!Z>C`Q-F4Q
+M9&9D`'IZ,&(V9C4P8C@`>GHP-F4P831F90!Z>C`P-C=D,F(Q`'IZ,#`R9&)C
+M-C$`>GHP8C9C83,R-0!Z>C`P-6(V8V9D`'IZ,#$V93!D9F0`>GHP,#!B-F8V
+M.`!A=&A?:&%L7W!R;V-E<W-?;F]I<V5F;&]O<@!Z>C`P-6(T.&%D`'IZ,#)D
+M8F8Q8C(`>GHP,#5B.#AC8@!Z>C`S,V5C.&)F`'IZ,&1B-#(U8S4`871H7VAA
+M;%]D;6%?8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP,&(V9C$V,0!Z>C`V93`P
+M8CAA`'IZ,#)D8F9C,60`>GHP9&,T93,Y,`!Z>C!D869E9#@V`'IZ,#!B-F4R
+M-V$`>GHP,F1B8F%B,@!Z>C!B-F0Q969F`'IZ,#$V9#DP9&0`>GHP,F1B93@U
+M,0!Z>C`P-6(V-&9D`'IZ,#`P8C9D-3(`>GHP8C9C.65F9@!Z>C`Q-F4P,&1D
+M`'IZ,#)D8F0X-S4`>GHP,F1B,S%B,@!Z>C`P8C<P.3(S`'IZ,#!B-F0T-3``
+M>GHP,#!B-F0Q9`!Z>C!B-F,R,S(U`'IZ,#)D8F1A8C(`>GHP,#`U8C8S,@!Z
+M>C`V9&5D9#DS`'IZ,#`Q-F1A-3``>GHP,#`V-V0S,@!Z>C`P8C9D.3(S`'IZ
+M,#`R9&(U,6,`>GHP,39D8V)F90!Z>C`P8C<P,30U`'IZ,#`Q-F1F,F,`>GHP
+M8C=F860S90!Z>C`Q-F0Y.3(P`'IZ,#)D8C%B86,`>GHP9&,V93,Y,`!Z>C`U
+M8C<P,64P`'IZ,#`P8C9B,3``>GHP8C<P.65F9@!Z>C`Q-F1F.#EB`&%T:%]H
+M86Q?871T86-H`'IZ,#9E,&9C,&0`;65M8W!Y`'IZ,#$V9&%B,F0`>GHP,F1B
+M,3,U9`!Z>C!E,#0V.#1B`'IZ,#$V93(Y,60`>GHP,#!B-F9E.`!Z>C`P8V9B
+M,V4P`'IZ,#`Q-F0Y-#@`>GHP,39E,C`Y8@!Z>C!B-S`Q969F`'IZ,#`P8C9C
+M.60`>GHP,#`U8C5A,@!Z>C`R9&(Q-S!A`&%T:%]H86Q?8V]M<'5T971X=&EM
+M90!Z>C`R9&(U8F%C`'IZ,#`U8C@Q,V0`>GHP,&(V8SDR,P!Z>C!B-F(U,&(X
+M`'IZ,#`U8C=F.60`>GHP8C<P,60P,@!Z>C`V9&9F-#1A`'IZ,#)D8C4W-C,`
+M>GHP-F5E868V,`!Z>C!E,#`W8V$Q`'IZ,#`R9&%F-C(`>GHP8C@S860S90!Z
+M>C`P,&(V8CDP`'IZ,#$V9#EE9F$`>GHP,39D93`U,0!Z>C`P,#5B-F(R`'IZ
+M,#5B-V8Q,30`>GHP-&%E,#,Q9@!Z>C`R9&)D9&9D`'IZ,#`U-#=F960`>GHP
+M,&(V8F8U90!Z>C`P8C<Q-S=D`'IZ,#!B-S!F,V0`>GHP,39D.#DR,`!Z>C`R
+M9&(Q86(R`'IZ,#`P-6(V,C(`>GHP,#!B-F8W.`!Z>C!B-CEB,#=C`&%T:%]H
+M86Q?9G)E90!Z>C`U8C<Y8C%B`'IZ,#!B-S`W,V0`>GHP,F1B96)B9`!Z>C!B
+M-64S,34R`'IZ,#$V9&9B9C$`871H7VAA;%]M:'HR:65E90!Z>C`Q-F4Q.#EB
+M`'IZ,&1C,F$U8S4`>GHP,#)D8S8P8@!Z>C`V9&8P8CAA`'IZ,#)D8C,S-60`
+M>GHP8C9C-3-A-`!Z>C!F-31D,6(P`'IZ,&(V9F0S-C,`>GHP9#ED8S8R8P!Z
+M>C`U8C<T,64P`'IZ,#)D83EB86,`>GHP9&,R,60S80!Z>C`P8C<Q-S-D`'IZ
+M,#$V9#ED-#$`>GHP,#5B.#1F9`!Z>C`P-6(X86)D`'IZ,#!B-S`Q,C,`>GHP
+M,#5B-C4R8@!Z>C`R9&(S.#<U`'IZ,#$V93,P.6(`>GHP,#5B-C!B,@!Z>C`R
+M9&(Q.#<U`'IZ,#`R9&(X-#(`>GHP,F1B,3<V,P!Z>C!B-V1E83DT`'IZ,#!B
+M-S`Q-C$`>GHP,39D-V0T,0!Z>C`P,39C9#,R`'IZ,#9D93!B.&$`>GHP-F0Y
+M9&0Y,P!Z>C!D8C-E9#@V`'IZ,#`U8C0X960`>GHP,#)D8S@P8@!Z>C`P,F1B
+M8S0R`'IZ,#)D8F$X-3$`>GHP,F1B,S-E9`!Z>C`P-6(X,&9D`'IZ,#`U8C=F
+M,F4`>GHP,F1B9F1F9`!Z>C`Q-F4V-#AA`'IZ,#`R9&%F9C(`>GHP,#5B-S<Y
+M9`!Z>C`P,&(V964X`'IZ,#$V930T.&$`>GHP,&(V9C9B8P!Z>C`Q-F1A.3(P
+M`'IZ,#5B-S@Q93``>GHP,#)D8V$P8@!Z>C`P-6(T-&%D`'IZ,#9D9&8T-&$`
+M>GHP9F%C,&,Y8@!Z>C!B-F8Y969F`'IZ,#!B-F,V8F,`871H7VAA;%]A9&1I
+M=&EO;F%L7W-W8F%?8F%C:V]F9@!Z>C`P,#)D8CDR`&%T:%]H86Q?=F5R<VEO
+M;@!Z>C`R9&)A8S)E`'IZ,#)D8C<Y864`>GHP,#$V934S,@!Z>C!B-F-F,#`Y
+M`'IZ,#`Q-F4Q,F,`>GHP,#$V9#EE-`!Z>C`P,#)D865A`'IZ,#`U8C5C8C(`
+M>GHP,39D83(U,0!Z>C`V9C9A9C8P`'IZ,#9D9F1D.3,`871H7VAA;%]M86QL
+M;V,`>GHP,#!B-F1D,@!Z>C`R9&0Y,F%D`'IZ,#$V9&(R-3$`>GHP93$P-V-A
+M,0!Z>C`P8C9C-S5E`'IZ,#$V9&0P-3$`>GHP,F1B9#%B,@!Z>C`R9&,Q-S8S
+M`'IZ,&(V.3!D-F0`>GHP,39D9C`U,0!Z>C`P,39D.34P`'IZ,#!B-S`V8F,`
+M>GHP,#$V9#@W,@!Z>C`V9&5F-#1A`'IZ,#5B.&,R960`>GHP-F9B.30W8@!Z
+M>C!E8F(Q93-F`'IZ,&(V9CED,#(`>GHP9#$T9#%B,`!Z>C!B-#@P,S%E`'IZ
+M,#$V9&)B9F4`>GHP,39E-30X80!Z>C`P,39D.#4P`'IZ,#`P8C9F9C@`871H
+M7VAA;%]M96UC<'D`>GHP,F1B8V)B9`!Z>C`Q-F1A,&1D`'IZ,#)D8F)D9F0`
+M>GHP,F1B,C@U,0!Z>C`R9&)D8S%D`'IZ,#9D8C!C9C(`>GHP,39E8CEA9`!Z
+M>C`P8C9C96)C`'IZ,&0Y-#@T83$`871H7VAA;%]P<F]B90!Z>C`Q-F5A.6%D
+M`'IZ,&9D-&0Q8C``>GHP,F1B,S<V,P!A=&A?:&%L7V)U:6QD;W!T<P!Z>C`R
+M9&%F,S5D`'IZ,#9D9&1D.3,`>GHP9&%D8S8R8P!Z>C`Q-F1F,C4Q`'IZ,#`P
+M8C9C,3``>GHP,39D.3(U,0!Z>C`R9&(P.#4Q`'IZ,&(W,C%A960`>GHP-C=C
+M9F-A90!Z>C`P,&(V8V8X`'IZ,&,Y-&0Q8C``>GHP,F1A9F%B,@!Z>C`U8CDR
+M865D`'IZ,#`U8CAC8V(`>GHP8C9D.65F9@!Z>C`R9&(Q,6(R`'IZ,#)D8F9F
+M8C$`>GHP,F1B9C<V,P!Z>C`P-6(V.&9D`'IZ,#`U8C0T960`>GHP8C<Q,6%E
+M9`!Z>C!B-64S,38P`'IZ,&0X-#@T83$`>GHP,39D.&(R9`!Z>C`Q-F4P.#EB
+M`'IZ,#)D8F(X-S4`>GHP,F1A93@U,0!Z>C!B.#%E83DT`'IZ,#$V9&5C,68`
+M>GHP,&(V9F5B8P!Z>C!E.#DT.3`W`'IZ,#!B-F5A-V$`>GHP,S-E.&9B9@!Z
+M>C!C9F$U.#<U`'IZ,#)D8CDY864`>GHP,F1B.6%B,@!Z>C`P,&(V8F4X`'IZ
+M,&1E-C@S-V8`>GHP,39D86)F90!Z>C!B-S`Y9#`R`'IZ,#8W9#(U93(`>GHP
+M,3EF,V$P,0!Z>C`W,#,Y-#=B`&%T:%]H86Q?;65M>F5R;P!Z>C`V9&9F8S!D
+M`'IZ,&(V-S4P8C@`>GHP,39E,F1F9`!Z>C`P,&(V9#(R`'IZ,#9F96%F-C``
+M>GHP9&,T835C-0!Z>C`P8C<P9C=D`&%T:%]H86Q?<W=?8F5A8V]N7W)E<W!O
+M;G-E7W1I;64`>GHP.68V-&(V80!Z>C`P-6(V-3=A`'IZ,#9F,SDT-V(`>GHP
+M-F1A,&-F,@!Z>C!B-V)A9#-E`'IZ,#!B-F8Y-C$`>GHP8C8Y-S-B8P!Z>C`R
+M9&)D,S5D`'IZ,#`U8C@X9F0`>GHP,F1B8F,Q9`!Z>C`R9&%F9&9D`'IZ,#9D
+M-V1D.3,`871H7VAA;%]D96QA>0!Z>C`R9&(Q9&9D`'IZ,#8W9#)F-#$`>GHP
+M,F1A9C@W-0!Z>C!B-V5D939D`'IZ,#$V9#AD-#$`>GHP,#)D864Y,@!Z>C!B
+M-V%D939D`'IZ,#)D8F(S-60`>GHP,F1B,V1F9`!Z>C`R9&(U,V5D`'IZ,#$V
+M9&-E864`>GHP,#!B-F1A,@!Z>C`P,&(V93(R`'IZ,#5B.#`P-#$`>GHP,#$V
+M9#@T.`!Z>C`Q-F0Y8C)D`'IZ,#`Q-F4P,F,`>GHP,&(W,#<W9`!Z>C`P-6(V
+M.3=A`'IZ,#`Q-F1A930`>GHP,39E,3`Y8@!Z>C`P-6(T83)D`'IZ,#$V9&4P
+M9&0`>GHP,39D9C!D9`!Z>C!D9C`W8V$Q`'IZ,#)D8F0W-C,`>GHP,#!B-F4U
+M,@!Z>C`V-V0P8S0W`'IZ,#5B-F,V9&(`>GHP8S,Q-65B-0!Z>C!D8C%E9#@V
+M`'IZ,#9D-#`V93``>GHP,39E,#(U,0!Z>C`P,#)D8F(R`'IZ,#`R9&0X-F0`
+M>GHP,#$V93$T9`!Z>C`R9&(U.6%E`'IZ,#`V-V0R,C$`>GHP,39D.#!D9`!Z
+M>C`P-6(X.3-D`'IZ,#5B.#%B,6(`>GHP,F1B,3-E9`!Z>C`P8C9D,3(S`'IZ
+M,#`P8C9C93@`>GHP-6(X86%E9`!Z>C!B-F5D,S8S`'IZ,#)D868Q8C(`>GHP
+M,#`U8C5E,@!Z>C`S,V5B9F)F`'IZ,#5B-C@V9&(`>GHP,#!B-F5F.`!Z>C!B
+M-S$Y865D`'IZ,#`U8C4X8C(`>GHP-6(W9&(Q8@!Z>C!B.#)D939D`'IZ,#`Q
+M-F0W,S(`>GHP,F1A9&%B,@!Z>C!F-#5E-F4S`&%T:%]H86Q?:6YI=%]C:&%N
+M;F5L<P!Z>C`P8C9D-F)C`'IZ,&,Q-&0Q8C``>GHP,#`R9&)D,@!Z>C!D830X
+M-&$Q`'IZ,#$V93!B.#<`>GHP-6(Y,#)E9`!Z>C!D8S)E,SDP`'IZ,&$V,&0Q
+M-#4`>GHP,F1B86)B9`!Z>C`P,&(V8S%D`'IZ,#5B.&5A960`>GHP,#5B-V(Y
+M9`!Z>C`P-6(U-#0V`'IZ,#5B-C0V9&(`>GHP,&(V9CDR,P!Z>C!D9#8X,S=F
+M`'IZ,#$V93$R-3$`>GHP9&,V835C-0!Z>C`R9&(S-S!A`'IZ,#`P-6(V-S(`
+M>GHP-F1E9F,P9`!Z>C`R9&)F,S5D`'IZ,#`P8C9C-S@`>GHP,#$V9#@S,@!Z
+M>C`R9&(U-S!A`'IZ,#`U8C9D-V$`>GHP,#)D8C(Y,@!Z>C`P-6(Y,&-B`&%T
+M:%]H86Q?<F5G7W=R:71E`'IZ,&(V9C4S-C,`>GHP,#5B-6,T-@!A=&A?:&%L
+M7W)E9U]R96%D`'IZ,#9D.3!C9C(`>GHP-F0X9&0Y,P!Z>C`Q-F1F8C@W`'IZ
+M,#`Q-F1A-#@`>GHP8C8V,S%A.`!Z>C`P,F1B,#DR`&%T:%]H86Q?9V5T=VER
+M96QE<W-M;V1E<P!Z>C`Q-F4Q8C@W``````````(```,&````1`````8```,$
+M````1````%8```,&````6````%H```,$````6````'X```,&````;````((`
+M``,$````;````,X```,&````@````-(```,$````@````.8```,&````E```
+M`.H```,$````E````/H```,&````J````/X```,$````J````08```,&````
+MN````0H```,$````N````1(```,&````R````18```,$````R````1X```,&
+M````W````2(```,$````W````2H```,&````\````2X```,$````\````DP`
+M`/4*`````````E0``@,*`````````EP``,4*`````````P@``@\*````````
+M`R```;0*````````!@@``3L*````````!H0``3L*````````!V@``9T*````
+M````!VX```0&````````!W(```0$````````!\0``9T*````````!\H```0&
+M````````!\X```0$````````")0``.4*````````"+```.4*````````"/H`
+M``(&````"```"/X```($````"```"Y0``@\*````````#O0``7P*````````
+M#QP``9T*````````#SH```4&````````#SX```4$````````#]H```4&````
+M````#]X```4$````````$````9T*````````$4X```8&````````$5(```8$
+M````````$5X```<&````````$6(```<$````````%1```4P*````````&C0`
+M`9\*````````'4```0(*````````)_8```(&````S```)_H```($````S```
+M*`8```($````S```*!0``4P*````````*#@``9\*````````*,P``9\*````
+M````*6```9\*````````*=```0(*````````-)8```D&````````-)H```D$
+M````````-*8```@&````````-*H```@$````````1)(```H&````````1)8`
+M``H$````````1*8```P&````````1*H```P$````````16H```P&````````
+M16X```P$````````1WX```P&````````1X(```P$````````1^X```H&````
+M````1_(```H$````````2%X``!(&````````2&(``!($````````2(@``64*
+M````````2,H```H&````````2,X```H$````````2:(```H&````````2:8`
+M``H$````````2B(```L&````````2B8```L$````````2[0``(H*````````
+M3@(``!,&````````3@8``!,$````````3@H``!,&````&```3@X``!,$````
+M&```3JH```X&````````3JX```X$````````3LX```T&````````3M(```T$
+M````````3NX```\&````````3O(```\$````````3Q(``!`&````````3Q8`
+M`!`$````````3S8``!$&````````3SH``!$$````````3U8```X&````````
+M3UH```X$````````4(```9\*````````4:@``-@*````````4=8``!,&````
+M&```4=H``!,$````&```4@8``!0&````````4@H``!0$````````5`0``7P*
+M````````500``7P*````````560``7P*````````6"(``!4&````````6"8`
+M`!4$````````6-X``!8&````````6.(``!8$````````6@0``4P*````````
+M6AX``!<&````````6B(``!<$````````6B@``64*````````6H```;H*````
+M````6J```@\*````````6K@``@\*````````6M@``@P*````````6O```@P*
+M````````6PP``@\*````````6Q@``*T*````````6RP``@\*````````6T``
+M`@P*````````6U```:D*````````6WP``:D*````````6Z```:D*````````
+M6^@``:D*````````7"P``:D*````````7+X``/H&````````7,(``/H$````
+M````7L0``:D*````````7S```@P*````````7U0``@P*````````7V0``0(*
+M````````7[0``0(*````````8*0``@P*````````8+@``@P*````````8,P`
+M`@P*````````8.```@P*````````8/0``@P*````````82X``*\&````````
+M83(``*\$````````84(``:<&````````848``:<$````````880``>(*````
+M````8;@``@P*````````8<@``@\*````````8>@``@P*````````8@```@P*
+M````````8E```@\*````````8F@``@P*````````8GP``@P*````````8I``
+M`@P*````````8K0``@\*````````8M```@P*````````8N0``@P*````````
+M8O0``@\*````````8R@``@P*````````8W```@P*````````8Z```@\*````
+M````8^0``@\*````````9,P``@P*````````93@``@P*````````950``@P*
+M````````9:0``@\*````````9@```@P*````````9A```@P*````````9B``
+M`@P*````````9C```@P*````````9D```@P*````````9E```@P*````````
+M9F```@P*````````9G0``@P*````````9RP``@P*````````9T```@P*````
+M````:.0``@P*````````:/0``@P*````````:00``@P*````````:10``@P*
+M````````:20``@P*````````:3@``@P*````````:4@``.X*````````:9P`
+M`64*````````:<0``64*````````:>X``!H&````````:?(``!H$````````
+M:?@``64*````````:C@``@\*````````:DP``,@*````````:F0``@\*````
+M````:P0``:,*````````:QP``/,*````````:UP``@\*````````:X0``@P*
+M````````:\0``@\*````````:^```@P*````````;"@``@\*````````;$P`
+M`@P*````````;)0``@\*````````;.0``@\*````````;2```@P*````````
+M;3```<X*````````;7```@\*````````;:```@P*````````;=```@\*````
+M````;A@``@\*````````;D0``@P*````````;IP``64*````````;M0``@P*
+M````````;OP``@P*````````;Q0``@\*````````;RP``@\*````````;T``
+M`@P*````````;X```@\*````````;Y0``@\*````````;Z@``@\*````````
+M<`0``@\*````````<#0``@\*````````<$@``@P*````````<(0``@\*````
+M````<*@``@\*````````<+P``@\*````````<0```@\*````````<5```@\*
+M````````<6P``@\*````````<8@``@\*````````<:0``@\*````````<<``
+M`@\*````````<AP``*,*````````<D```=H*````````<E0``@P*````````
+M<I@``@\*````````<J0``*,*````````<N0``*,*````````<PP``@\*````
+M````<QP``=H*````````<S@``@P*````````<X```@\*````````<XP``*,*
+M````````<^```@\*````````<_0``@P*````````=`P``@\*````````="``
+M`@P*````````='0``*,*````````=)P``@\*````````=*P``=H*````````
+M=,@``@P*````````=1```@\*````````=1P``*,*````````=7P``94*````
+M````=<@``@P*````````==@``)D*````````=?@``;8*````````=C```@\*
+M````````=D0``@P*````````=E@``@\*````````=F@``@P*````````=J@`
+M`@\*````````=K@``@P*````````=L```;0*````````=M```@\*````````
+M=N```;0*````````=NP``@\*````````=OP``@P*````````=R```@\*````
+M````=S0``@P*````````=W@``@\*````````=XP``@P*````````=Z```@\*
+M````````=[```@P*````````>&@``@\*````````>)H``7`&````````>)X`
+M`7`$````````>*X``(\&````````>+(``(\$````````>,0``:@*````````
+M>/```@\*````````>1@``@P*````````>4```@P*````````>70``@P*````
+M````>80``@\*````````>9@``;0*````````>>0``@\*````````>?@``@P*
+M````````>BP``@\*````````>D```@P*````````>H0``@P*````````>I@`
+M`@P*````````>O```@\*````````>R```@\*````````>SP``@P*````````
+M>Y@``@\*````````>\@``@\*````````>^0``@P*````````?!@``@\*````
+M````?%0``@P*````````?/@``@\*````````?2@``@\*````````?J```7P*
+M````````?N@``@\*````````?O@``;H*````````?SP``@P*````````?UP`
+M`@P*````````?ZP``@P*````````?\P``@P*````````?]P``@P*````````
+M?^@``@\*````````?_@``@P*````````@#```@P*````````@%```@P*````
+M````@&```@P*````````@'```@P*````````@(```@P*````````@(P``@\*
+M````````@)P``@P*````````@*P``@P*````````@,```@\*````````@-``
+M`@P*````````@.```@P*````````@/```@P*````````@0```@P*````````
+M@1```@P*````````@2```@P*````````@3```@P*````````@4```@P*````
+M````@50``@P*````````@6@``@P*````````@70``34*````````@8@``@P*
+M````````@9P``@P*````````@;```@P*````````@<0``@P*````````@=@`
+M`@P*````````@>P``@P*````````@@```@P*````````@A0``@P*````````
+M@B@``@P*````````@CP``@P*````````@E```@P*````````@F0``@P*````
+M````@G@``@P*````````@H(``!L&````````@H8``!L$````````@K0``@P*
+M````````@LP``@0*````````@N@``@\*````````@P@``@P*````````@S@`
+M`@P*````````@T@``@\*````````@V@``@P*````````@W@``@\*````````
+M@Y@``@P*````````@Z@``@\*````````@\@``@P*````````@]@``@\*````
+M````@_@``@P*````````A%```@P*````````A%@``;0*````````A&@``@\*
+M````````A'P``@P*````````A)0``,@*````````A*```1,*````````A,P`
+M`-4*````````A.P``/T*````````A/P``@\*````````A1```@P*````````
+MA20``?X*````````A3@``(@*````````A4P``9<*````````A6@``@P*````
+M````A?```@\*````````AFP``@P*````````AO0``7<*````````AR0``;0*
+M````````ASP``;0*````````AX```7<*````````A[@``@P*````````A]P`
+M`;0*````````B````;0*````````B!```7<*````````B(@``7P*````````
+MB*@``@\*````````B+P``@P*````````B,P``@\*````````B.0``@P*````
+M````B.P``;0*````````B/P``@\*````````B1```@P*````````B1@``;0*
+M````````B3@``;0*````````B4@``@\*````````B5P``@P*````````B6P`
+M`@\*````````B8```@\*````````B90``@\*````````B:P``@P*````````
+MB<@``@P*````````B>```@P*````````B>@``;0*````````B?@``@\*````
+M````B@P``@P*````````BA0``;0*````````BB@``@P*````````BC@``@\*
+M````````BDP``@P*````````BE0``;0*````````BF0``@\*````````BG@`
+M`@P*````````BI```,@*````````BJ0``@P*````````BK@``@P*````````
+MBLP``@P*````````BM@``1,*````````BN@``;0*````````BO0``1,*````
+M````BQ@``@\*````````BRP``@P*````````BT```@P*````````B\0``@P*
+M````````B\P``;0*````````B_```,@*````````C#P``@P*````````D"X`
+M`!T&````````D#(``!T$````````D?H``!X&````````D?X``!X$````````
+MD@0``64*````````D@X``!P&````````DA(``!P$````````DA@``64*````
+M````DG```*T*````````DI@``*T*````````E!P``*T*````````E#@``*T*
+M````````E%0``*T*````````E(@``@P*````````E+0``@P*````````E1P`
+M`*T*````````E30``@P*````````E4@``@P*````````E8```@\*````````
+ME=```@\*````````E>0``@P*````````E?P``,@*````````EAP``;0*````
+M````EB0``-`*````````EM```>4*````````EQ@``90*````````E\0``9\*
+M````````F`@``3P*````````F30``@P*````````F4P``@P*````````F60`
+M`@P*````````F8@``@P*````````F:```@P*````````F;```@\*````````
+MF<@``@P*````````F?0``@P*````````F@P``@P*````````FB0``@P*````
+M````FD@``@P*````````FF```@P*````````FG```@\*````````FH@``@P*
+M````````FJ```@P*````````FN@``@P*````````G$```@\*````````G*@`
+M`@P*````````G.```2`*````````G/```<X*````````G0```@\*````````
+MG2P``<X*````````G40``@P*````````G5```<X*````````G<P``@P*````
+M````G?0``@P*````````GCP``@\*````````GJ0``@P*````````GK0``@\*
+M````````GL0``;0*````````GN```@P*````````GP```,@*````````H4@`
+M`@P*````````H6```@P*````````H7P``@\*````````H90``*T*````````
+MH?0``4P*````````H@X``!\&````````HA(``!\$````````HA@``64*````
+M````HFP``A4*````````HJ```@P*````````HK0``@P*````````HKP``;0*
+M````````HL@``@\*````````HOP``@\*````````HT@``@P*````````HU``
+M`;0*````````HX```<<*````````H[```@\*````````H]```<<*````````
+MH_P``<<*````````I&8``"(&````````I&H``"($````````I*P``?<*````
+M````I.0``@P*````````I.P``;0*````````I0P``@P*````````I10``;0*
+M````````I40``<<*````````I68``5$&````````I6H``5$$````````I7P`
+M`?\*````````I90``<<*````````I@P``>0*````````IF@``9P*````````
+MIG```0(*````````IKH```(&```KL```IKX```($```KL```IM(```(&```K
+MN```IM8```($```KN```IMH```($```KN```IQ@``@\*````````IS@``@P*
+M````````IT0``@\*````````IWP``@P*````````IX@``@\*````````I[0`
+M`@P*````````I\@``;0*````````J)@``5P*````````J4```<<*````````
+MJ;P``@P*````````J=```@P*````````J>0``@P*````````J?@``@P*````
+M````J@P``@P*````````JG8``*\&````````JGH``*\$````````JHH``:<&
+M````````JHX``:<$````````JK@``@T*````````JNP``@P*````````JOP`
+M`@\*````````JQ0``@P*````````JRP``@P*````````JWP``@\*````````
+MJY```@P*````````JZ0``@P*````````J[@``@P*````````J]P``@\*````
+M````J_```@P*````````K`0``@P*````````K!0``@\*````````K$@``@P*
+M````````K'```@P*````````K'P``@\*````````K)P``@P*````````K,P`
+M`@\*````````K0P``@\*````````K:@``@\*````````K;@``@\*````````
+MK<@``@\*````````K=@``@\*````````K>@``@\*````````KE```@P*````
+M````KEP``@\*````````KM0``@P*````````KO```@P*````````KT```@\*
+M````````KYP``@P*````````KZP``@P*````````K[P``@P*````````K\P`
+M`@P*````````K]P``@P*````````K^P``@P*````````K_P``@P*````````
+ML!```@P*````````L,@``@P*````````L-P``@P*````````LK0``@P*````
+M````LL0``@P*````````LM0``@P*````````LN0``@P*````````LO0``@P*
+M````````LP@``@P*````````LQ@``4H*````````LVP``64*````````LY0`
+M`64*````````L[X``",&````````L\(``",$````````L\@``64*````````
+MM`P``@P*````````M!P``@P*````````M#```,@*````````M$@``@\*````
+M````M1P``6$*````````M2P``@\*````````M4```@P*````````M4P``<`*
+M````````M6@``+4*````````M:@``@\*````````M<0``@P*````````M@0`
+M`@\*````````MB```@P*````````MF@``@\*````````MHP``@P*````````
+MMM0``@\*````````MQP``@\*````````MT0``@P*````````MU0``84*````
+M````MY```@\*````````MZ8``"0&````````MZH``"0$````````M[P``@P*
+M````````M_P``64*````````N#0``@P*````````N%P``@P*````````N)P`
+M`@\*````````N+```@\*````````N,0``@\*````````N2```@\*````````
+MN5```@\*````````N60``@P*````````N:```@\*````````N<0``@\*````
+M````N=@``@\*````````NAP``@\*````````NH@``@\*````````NJ0``@\*
+M````````NL```@\*````````NMP``@\*````````NO@``@\*````````NU0`
+M`*,*````````NW0``=H*````````NX0``@P*````````N\0``@\*````````
+MN]```*,*````````O!```*,*````````O#@``@\*````````O$@``=H*````
+M````O&0``@P*````````O*P``@\*````````O+@``*,*````````O0P``@\*
+M````````O2```@P*````````O3@``@\*````````O4P``@P*````````O:``
+M`*,*````````O<@``@\*````````O=@``=H*````````O?0``@P*````````
+MOCP``@\*````````OD@``*,*````````OI```@\*````````OKP``@\*````
+M````ONP``@P*````````ORP``5T*````````OW```94*````````OZ@``@P*
+M````````O[0``)D*````````O]0``;8*````````P!@``@\*````````P"@`
+M`@P*````````P#```;0*````````P$```@\*````````P%```;0*````````
+MP%P``@\*````````P&P``@P*````````P)```@\*````````P*0``@P*````
+M````P.@``@\*````````P/P``@P*````````P1```@\*````````P2```@P*
+M````````P6```@\*````````P70``@P*````````P8@``@\*````````P9@`
+M`@P*````````PE```@\*````````PJ(``3D&````````PJ8``3D$````````
+MPJX``8<&````````PK(``8<$````````PKH``6P&````````PKX``6P$````
+M````PM```:@*````````POP``@\*````````PR0``@P*````````PTP``@P*
+M````````PWP``@P*````````PY```,@*````````P]```@\*````````P^0`
+M`@P*````````Q!@``@\*````````Q"P``@P*````````Q'```@P*````````
+MQ(0``@P*````````Q-P``@\*````````Q0P``@\*````````Q2@``@P*````
+M````Q80``@\*````````Q;0``@\*````````Q=```@P*````````Q@0``@\*
+M````````QC```@P*````````QLP``@\*````````R)```7P*````````R.0`
+M`@\*````````R/@``@\*````````R1P``@\*````````R30``@\*````````
+MR7@``@\*````````R9@``@\*````````R:@``@\*````````R<```@\*````
+M````R=```@\*````````R>```A4*````````RG@``@P*````````RL0``*T*
+M````````RM0``*T*````````RMX``"<&````````RN(``"<$````````RQX`
+M`"<&````````RR(``"<$````````RT```@P*````````RV(``"4&````````
+MRV8``"4$````````RX0``@P*````````RYH``"@&````````RYX``"@$````
+M````R[P``@P*````````R](``"8&````````R]8``"8$````````S`P``@P*
+M````````S#0``@\*````````S$P``@P*````````S%P``@P*````````S'``
+M`@P*````````S(```@\*````````S)0``@P*````````S+```@P*````````
+MS,0``@P*````````S.@``@P*````````S0```@P*````````S40``@P*````
+M````S6@``@P*````````S8```@\*````````S9```@P*````````S:```@P*
+M````````S;```@P*````````S<0``@P*````````S?P``@P*````````SAP`
+M`@P*````````SC```@P*````````SD```@P*````````SF0``@\*````````
+MSG0``@P*````````SH```:`*````````SK```@\*````````SM```@P*````
+M````SR@``@P*````````SSP``@P*````````STP``@\*````````SX@``;0*
+M````````SY@``@\*````````SZP``@P*````````S\0``,@*````````S]``
+M`)L*````````T!@``@P*````````T#P``@P*````````T%@``8P*````````
+MT'@``@P*````````T(@``@P*````````T)@``@P*````````T*0``@\*````
+M````T+0``@P*````````T,@``@P*````````T.```@\*````````T/```@P*
+M````````T00``@\*````````T10``@P*````````T30``,\*````````T40`
+M`@\*````````T5@``@P*````````T6P``1D*````````T8```5,*````````
+MT90``+8*````````T;```@P*````````TFP``=4*````````TI@``;0*````
+M````TMP``=4*````````TT0``@P*````````TU@``@P*````````TVP``@P*
+M````````TW0``;0*````````TXP``@P*````````TZP``@P*````````T[0`
+M`;0*````````T_@``@P*````````U!@``@P*````````U"```;0*````````
+MU#0``@P*````````U%0``;0*````````U&0``=4*````````U-@``7P*````
+M````U00``@\*````````U2```@\*````````U30``@\*````````U4@``@\*
+M````````U9P``@\*````````U;P``@P*````````U?@``)L*````````U@@`
+M`;0*````````UA0``)L*````````UL```@\*````````UM```@P*````````
+MUM@``;0*````````UOP``,@*````````UT@``@P*````````UY@``0@*````
+M````U[H``"H&````Y```U[X``"H$````Y```U\P``*T*````````U_P``*T*
+M````````V!P``*T*````````V%```@P*````````V&P``@P*````````V*P`
+M`@\*````````V00``@\*````````V2@``@P*````````V3@``@\*````````
+MV4P``@P*````````V7```@\*````````V8```;0*````````VE```@\*````
+M````VN```>X*````````VPX``"L&````````VQ(``"L$````````VV@``@\*
+M````````VWP``@P*````````V[8``"P&````````V[H``"P$````````V\8`
+M`"P$````````V^(``"P&````````V^8``"P$````````W08``"D&````````
+MW0H``"D$````````W:(``"D&````````W:8``"D$````````W;P``*T*````
+M````W>0``*T*````````W@```*T*````````WB```*T*````````WCP``*T*
+M````````WF8``"D&````````WFH``"D$````````WH@``@P*````````W^@`
+M`@P*````````W_P``@P*````````X(0``@\*````````X*0``@P*````````
+MX-P``@\*````````X0```@\*````````X3```@P*````````X4```5T*````
+M````X5P``@P*````````X6P``@\*````````X9@``@P*````````X:@``@\*
+M````````X<@``@P*````````X=@``@\*````````X@0``@P*````````XC@`
+M`@P*````````XD@``@\*````````XF@``@P*````````XG@``@\*````````
+MXI@``@P*````````XQ```@\*````````XS```@P*````````XY```@P*````
+M````Y*```)(*````````Y6X``"T&````````Y7(``"T$````````Y7@``9\*
+M````````Y7X``"X&````````Y8(``"X$````````Y8@``9\*````````Y8X`
+M`"T&````"```Y9(``"T$````"```Y98``"T&````B```Y9H``"T$````B```
+MY<8``"T&````````Y<H``"T$````````Y?(``"T&````````Y?8``"T$````
+M````YBH``"T&````!@``YBX``"T$````!@``YDH``"T&````````YDX``"T$
+M````````YK8``"T&````!@``YKH``"T$````!@``YSH``"X&````````YSX`
+M`"X$````````YX(``"T&````!@``YX8``"T$````!@``YYX``"T&````````
+MYZ(``"T$````````Z"8``"X&````````Z"H``"X$````````Z'(``"X&````
+M````Z'8``"X$````````Z*8``"X&````````Z*H``"X$````````Z-P``@P*
+M````````Z;8``"\&````````Z;H``"\$````````Z?0``9(*````````ZZH`
+M``(&```Y9```ZZX```($```Y9```[+8``#`&````````[+H``#`$````````
+M[7P``@P*````````[=@``@P*````````[>0``.L*````````\@(``#$&````
+M!```\@8``#$$````!```\A(``#$&````"```\A8``#$$````"```\P```@P*
+M````````\V@``@\*````````]#(``#$&````"```]#8``#$$````"```]((`
+M`#$&````````](8``#$$````````](H``#$&````"```](X``#$$````"```
+M]/H``#$&````````]/X``#$$````````]2X``#$&````````]3(``#$$````
+M````]4H``#$&````````]4X``#$$````````]5(``#$&````"```]58``#$$
+M````"```]5H``#$&````````]5X``#$$````````]B0``@\*````````]I``
+M`@P*````````]O0``7(*````````]P0``84*````````]Q```@\*````````
+M]T@``84*````````]V@``@P*````````]W0``84*````````]\0``>4*````
+M````^`P``90*````````^,P``9\*````````^1@``.$*````````^7```@P*
+M````````^9```@P*````````^9P``@\*````````^;@``@P*````````^T@`
+M`@P*````````^W```@P*````````^X```@P*````````^YP``@P*````````
+M^\@``@P*````````^]@``@\*````````^_P``@P*````````_"```@P*````
+M````_$0``@P*````````_&```@\*````````_'```@P*````````_)```@\*
+M````````_*```@P*````````_,```@\*````````_-```@P*````````_/P`
+M`@\*````````_0P``@P*````````_4```@\*````````_5```@P*````````
+M_58``:<&````````_5H``:<$````````_5X``*\&````````_6(``*\$````
+M````_7(``3X&````````_78``3X$````````_9```@P*````````_;0``@P*
+M````````_=0``@\*````````_>0``@P*````````_S@``@\*````````_V``
+M`@P*````````_Y```@P*````````_]```@\*````````_^0``@\*```````!
+M`$@``@P*```````!`%@``?0*```````!`&@``;0*```````!`(0``@P*````
+M```!`O0``@P*```````!`P@``@P*```````!`QP``@P*```````!`S```@P*
+M```````!`T0``@P*```````!`U@``@P*```````!`VP``@P*```````!`X``
+M`@P*```````!`Y0``@P*```````!`Z0``@P*```````!`^```@P*```````!
+M`_@``@P*```````!!!0``@\*```````!!"P``*T*```````!!%H```(&``!-
+M)``!!%X```($``!-)``!!&(```($``!-)``!!(H```(&``!-.``!!(X```($
+M``!-.``!!)(```($``!-.``!!+H```(&``!-3``!!+X```($``!-3``!!,(`
+M``($``!-3``!!.H```(&``!-8``!!.X```($``!-8``!!/(```($``!-8``!
+M!5P``3$*```````!!;X``#(&```````!!<(``#($```````!!<@``64*````
+M```!!D(``#8&```````!!D8``#8$```````!!DP``64*```````!!GX``#<&
+M```````!!H(``#<$```````!!P@``4P*```````!!S```*0*```````!!T0`
+M`@`*```````!!U@``@\*```````!!XP``@H*```````!!ZP``@\*```````!
+M!^```)@*```````!"`0``@\*```````!"!0``@P*```````!""@``@P*````
+M```!"#```,$*```````!"50``@D*```````!"80``@\*```````!"=```@D*
+M```````!"?```@D*```````!"AP``@D*```````!"E```@D*```````!"KX`
+M`#0&```````!"L(``#0$```````!"L8``#4&```````!"LH``#4$```````!
+M"Q```?<*```````!"Y0``@P*```````!"YP``;0*```````!"Z0``,$*````
+M```!"[P``@P*```````!"\0``;0*```````!"^P``@D*```````!#`P``:X*
+M```````!#$0``4,*```````!#'@``20*```````!#)P``@<*```````!#*P`
+M`>P*```````!#,0``9D*```````!#-P``@D*```````!#60``/\*```````!
+M#;@``/`*```````!#=@``,(*```````!#>@``@`*```````!#?0``9P*````
+M```!#?P``0(*```````!#D8```(&``!-B``!#DH```($``!-B``!#EX```(&
+M``!-D``!#F(```($``!-D``!#F8```($``!-D``!#J0``@\*```````!#L0`
+M`@P*```````!#M```@\*```````!#P@``@P*```````!#Q0``@\*```````!
+M#T```@P*```````!#U0``;0*```````!%)```2H*```````!%*H``@L&````
+M```!%*X``@L$```````!%+H``#@&```````!%+X``#@$```````!%/```@P*
+M```````!%00``@P*```````!%1@``@P*```````!%2P``@P*```````!%40`
+M`2H*```````!%6P``@P*```````!%8```@P*```````!%>H``*\&```````!
+M%>X``*\$```````!%?X``:<&```````!%@(``:<$```````!%BP``1`*````
+M```!%F```@P*```````!%G```@\*```````!%H@``@P*```````!%J```@P*
+M```````!%O@``@\*```````!%PP``@P*```````!%R```@P*```````!%S0`
+M`@P*```````!%U@``@\*```````!%VP``@P*```````!%X```@P*```````!
+M%Y```@\*```````!%\0``@P*```````!%^P``@P*```````!&$@``@P*````
+M```!&&0``@P*```````!&(```@P*```````!&-```@P*```````!&.```@P*
+M```````!&/0``,@*```````!&0P``@\*```````!&50``@\*```````!&7``
+M`@P*```````!&;```@\*```````!&<P``@P*```````!&A0``@\*```````!
+M&C@``@P*```````!&H```@\*```````!&M```@\*```````!&PP``@P*````
+M```!&QP``50*```````!&TP``@\*```````!&Z```@\*```````!&[0``@\*
+M```````!&_```@\*```````!'&```@\*```````!'(0``@\*```````!'.``
+M`@\*```````!'/```@\*```````!'0```@\*```````!'1```@\*```````!
+M'2```@\*```````!'9@``@P*```````!':0``@\*```````!'EP``@P*````
+M```!'F@``@\*```````!'H0``@P*```````!'J```@P*```````!'O@``@\*
+M```````!'VP``@\*```````!'X```@P*```````!'Y```@P*```````!'Z``
+M`@P*```````!'[```@P*```````!'\```@P*```````!']```@P*```````!
+M'^```@P*```````!'_0``@P*```````!("0``@P*```````!(#0``@P*````
+M```!($0``@P*```````!(%@``@P*```````!(1P``@P*```````!(3```@P*
+M```````!(>(```(&``!-H``!(>8```($``!-H``!(X```@P*```````!(Y``
+M`@P*```````!(Z```@P*```````!([```@P*```````!(\```@P*```````!
+M(]0``@P*```````!(^0``:0*```````!)*@``@P*```````!)+@``@P*````
+M```!),@``@P*```````!)-@``@P*```````!).@``@P*```````!)/@``@P*
+M```````!)0@``@P*```````!)1P``@P*```````!)30``@P*```````!)4@`
+M`@P*```````!)60``@P*```````!)70``@P*```````!)80``@P*```````!
+M)90``@P*```````!):0``@P*```````!);@``@P*```````!)<@``:0*````
+M```!)BP``64*```````!)E0``64*```````!)H@``64*```````!)K@``64*
+M```````!)O```@P*```````!)Q```@P*```````!*"0``@\*```````!*#@`
+M`@P*```````!*+```@\*```````!*,8``#D&```````!*,H``#D$```````!
+M*-P``@P*```````!*1P``64*```````!*50``@P*```````!*7P``@P*````
+M```!*;P``@\*```````!*=```@\*```````!*>0``@\*```````!*D```@\*
+M```````!*G0``@\*```````!*HP``@P*```````!*J```@P*```````!*SP`
+M`@\*```````!*V@``@P*```````!*Z@``@\*```````!*\P``@\*```````!
+M*^```@\*```````!+"0``@\*```````!+)```@\*```````!+*P``@\*````
+M```!+,@``@\*```````!+.0``@\*```````!+0```@\*```````!+40``@\*
+M```````!+7```@\*```````!+:```@P*```````!+>```(P*```````!+C``
+M`*,*```````!+E0``=H*```````!+F0``@P*```````!+J0``@\*```````!
+M+K```*,*```````!+O```*,*```````!+Q@``@\*```````!+R@``=H*````
+M```!+T0``@P*```````!+XP``@\*```````!+Y@``*,*```````!+^P``@\*
+M```````!,````@P*```````!,!@``@\*```````!,"P``@P*```````!,(``
+M`*,*```````!,*@``@\*```````!,+@``=H*```````!,-0``@P*```````!
+M,1P``@\*```````!,2@``*,*```````!,8```@P*```````!,90``@P*````
+M```!,A0``=H*```````!,J@``@P*```````!,K@``@P*```````!,M```@P*
+M```````!,P```*(*```````!,V```)0*```````!,WP``@P*```````!,Z@`
+M`@P*```````!,[@``@\*```````!,]```@P*```````!,^0``@P*```````!
+M,_```@\*```````!-````@P*```````!-%@``@P*```````!-&P``@P*````
+M```!-(```@P*```````!-)0``@P*```````!-*```@\*```````!-,```@P*
+M```````!--0``@P*```````!-.@``@P*```````!-/P``@P*```````!-0@`
+M`@\*```````!-20``@\*```````!-30``@P*```````!-4```@\*```````!
+M-5```@P*```````!-60``@P*```````!-7@``@P*```````!-8P``@P*````
+M```!-:```@P*```````!-;0``@P*```````!->```@P*```````!-?```@\*
+M```````!-B```@P*```````!-DP``)0*```````!-F```@\*```````!-G``
+M`@P*```````!-GP``@\*```````!-HP``@P*```````!-J```@P*```````!
+M-K```@\*```````!-N```@P*```````!-O0``@P*```````!-P@``@P*````
+M```!-QP``@P*```````!-S```@P*```````!-T0``@P*```````!-W```@P*
+M```````!-Y(``#H&```````!-Y8``#H$```````!-Z(``#H$```````!-[X`
+M`#H&```````!-\(``#H$```````!-_X```(&``!.!``!.`(```($``!.!``!
+M./0``@\*```````!.C```08*```````!.DH```(&``!.?``!.DX```($``!.
+M?``!.IP``94*```````!.NX```(&``!.M``!.O(```($``!.M``!.W0``@\*
+M```````!.Z@``@P*```````!/$X``#L&```````!/%(``#L$```````!/%P`
+M`1T*```````!/*```)D*```````!/,@``;8*```````!/0P``@\*```````!
+M/1P``@P*```````!/20``;0*```````!/30``@\*```````!/40``;0*````
+M```!/5```@\*```````!/6```@P*```````!/80``@\*```````!/9@``@P*
+M```````!/=P``@\*```````!/?```@P*```````!/@0``@\*```````!/A@`
+M`@P*```````!/E@``@\*```````!/FP``@P*```````!/H```@\*```````!
+M/I0``@P*```````!/TP``@\*```````!/]X``*H&```````!/^(``*H$````
+M```!0!(``2@&```````!0!8``2@$```````!0!X``<H&```````!0"(``<H$
+M```````!0"H``4X&```````!0"X``4X$```````!0#8``),&```````!0#H`
+M`),$```````!0$(``=<&```````!0$8``=<$```````!0$X``54&```````!
+M0%(``54$```````!0%H``6`&```````!0%X``6`$```````!0'```:@*````
+M```!0)P``@\*```````!0,0``@P*```````!0.P``@P*```````!01P``@P*
+M```````!03```,@*```````!07```@\*```````!080``@P*```````!08P`
+M`*X*```````!09@``5D*```````!0<P``@\*```````!0>```@P*```````!
+M0>@``0$*```````!0BP``@P*```````!0D```@P*```````!0I@``@\*````
+M```!0L@``@\*```````!0N0``@P*```````!0T```@\*```````!0W```@\*
+M```````!0XP``@P*```````!0\P``@\*```````!0^```@\*```````!1$0`
+M`@P*```````!1'0``@P*```````!1(@``@\*```````!1)P``@\*```````!
+M1*P``@P*```````!14P``@\*```````!1D```0X*```````!1VP``@`*````
+M```!1X0``7P*```````!1]```@\*```````!1^```4<*```````!1^P``5D*
+M```````!2'@``(D*```````!2)0``@\*```````!2+0``@\*```````!2,0`
+M`@\*```````!2-P``@\*```````!2.P``@\*```````!2/P``-P*```````!
+M200``,H*```````!21```@H*```````!2<@``@P*```````!2=(``#P&````
+M```!2=8``#P$```````!2?0``@P*```````!2@@``;0*```````!2AX``#T&
+M```````!2B(``#T$```````!2G```@P*```````!2H0``;0*```````!2LP`
+M`9`*```````!2O```@P*```````!2Y```@P*```````!2Z```@\*```````!
+M2[0``@P*```````!2\0``@\*```````!2]P``@P*```````!2_```@P*````
+M```!3!```@P*```````!3"0``@P*```````!3(```@\*```````!3)P``@P*
+M```````!3*P``-<*```````!3-0``;\*```````!350``10*```````!36``
+M`80*```````!36P``<(*```````!39```@P*```````!3<@``@P*```````!
+M3?@``@P*```````!3@0``*(*```````!3CP``@P*```````!3EP``@P*````
+M```!3F@``@\*```````!3G@``@P*```````!3H@``@P*```````!3I@``@P*
+M```````!3JP``@P*```````!3N0``@P*```````!3P0``@P*```````!3Q@`
+M`@P*```````!3R@``@P*```````!3S0``2X*```````!3U```+$*```````!
+M3UP``-L*```````!3[```@\*```````!3\P``@P*```````!3]P``@\*````
+M```!4"@``@P*```````!4%P``;0*```````!4&P``@\*```````!4(0``@P*
+M```````!4)0``;0*```````!4+0``@\*```````!4-```@P*```````!4.``
+M`@\*```````!4/0``@P*```````!42```@\*```````!430``@P*```````!
+M440``@\*```````!45@``@P*```````!47```,P*```````!48P``@P*````
+M```!4;P``0D*```````!4?P``@P*```````!4@@``@\*```````!4A@``@P*
+M```````!4BP``38*```````!4D0``,@*```````!4E```1@*```````!4F``
+M`@\*```````!4G0``@P*```````!4JP``@P*```````!4L```@P*```````!
+M4M0``@P*```````!4OP``9(*```````!5!0``@P*```````!5#```@P*````
+M```!5$0``,`*```````!5%@``*L*```````!5&P``,0*```````!5(@``@P*
+M```````!5/```,<*```````!500``=@*```````!5:P``@\*```````!5<@`
+M`@P*```````!5>@``@\*```````!5@```@\*```````!5A0``@P*```````!
+M5I@``7P*```````!5K@``A<*```````!5OP``@P*```````!5Q```@\*````
+M```!5R```;0*```````!5T0``2X*```````!5V```@\*```````!5YP``;0*
+M```````!5ZP``-<*```````!5\P``@P*```````!6"0``10*```````!6#``
+M`80*```````!6$```@\*```````!6%0``@P*```````!6+```,<*```````!
+M6,0``=@*```````!61P``@\*```````!66```@P*```````!66P``@\*````
+M```!68@``@P*```````!690``@\*```````!6;@``@P*```````!6A0``@`*
+M```````!6I@``@`*```````!7$P``@\*```````!7'P``@P*```````!7)``
+M`@P*```````!7*P``@P*```````!7+0``;0*```````!7-0``@P*```````!
+M7-P``;0*```````!7/```@P*```````!700``@P*```````!77P``7P*````
+M```!7=```@\*```````!7?0``@\*```````!7@@``@\*```````!7AP``@\*
+M```````!7D@``@\*```````!7EP``@P*```````!7O@``@\*```````!7Q0`
+M`@P*```````!7R0``@\*```````!7T```@P*```````!7U```@\*```````!
+M7V0``@P*```````!7[@``@\*```````!7\P``@P*```````!7]P``@\*````
+M```!7_```@P*```````!8`0``4<*```````!8"```@\*```````!8#0``@P*
+M```````!860``@\*```````!870``@P*```````!87P``;0*```````!8:``
+M`,@*```````!8?```@P*```````!8@```@`*```````!8A0``@\*```````!
+M8DP``@\*```````!8NP``@\*```````!8P```.8*```````!8Y0``@P*````
+M```!8Z0``@P*```````!8[```@\*```````!8\```@P*```````!8]0``@P*
+M```````!8^0``@P*```````!8_@``@P*```````!9`P``@P*```````!9.0`
+M`*T*```````!9B```@\*```````!9C@``@\*```````!9DP``@P*```````!
+M9F0``@P*```````!9G@``@P*```````!:%P``@\*```````!:(```@P*````
+M```!:*P``@\*```````!:-P``@P*```````!:.P``(P*```````!:0@``@P*
+M```````!:90``@\*```````!:;```@P*```````!:<```@\*```````!:=P`
+M`@P*```````!:>P``@\*```````!:@@``@P*```````!:A@``@\*```````!
+M:C0``@P*```````!:G```@P*```````!:H```@\*```````!:J```@P*````
+M```!:K```@\*```````!:M```@P*```````!:PP``4$*```````!:S0``@\*
+M```````!:U```@P*```````!:Y0``@\*```````!:[```@P*```````!:\``
+M`@\*```````!:]P``@P*```````!:^P``@\*```````!;````@P*```````!
+M;#0``@\*```````!;%```@P*```````!;'```@P*```````!;28```(&``!7
+MI``!;2H```($``!7I``!;38```($``!7I``!;3X```(&``!7K``!;4(```($
+M``!7K``!;48```($``!7K``!;BP``@\*```````!;D0``@\*```````!;E@`
+M`@P*```````!;F@``@\*```````!;GP``@P*```````!;I```@P*```````!
+M;J0``@P*```````!;K0``@\*```````!;L@``@P*```````!;MP``@P*````
+M```!;NP``@\*```````!;P```@P*```````!;Q0``@P*```````!;R@``@P*
+M```````!;SP``@P*```````!;TP``@\*```````!;V```@P*```````!;W0`
+M`@P*```````!;X@``@P*```````!;YP``@P*```````!;ZP``@\*```````!
+M<=@``@\*```````!<>P``@P*```````!<?P``@\*```````!<A```@P*````
+M```!<C```@P*```````!<D0``@P*```````!<E0``@\*```````!<G```@P*
+M```````!<H0``@P*```````!<I0``@\*```````!<JP``@P*```````!<L``
+M`@P*```````!<M0``@P*```````!<N@``@P*```````!<O@``@\*```````!
+M<Q@``@P*```````!<RP``@P*```````!<T```@P*```````!<U0``@P*````
+M```!<V0``@\*```````!<X0``@P*```````!='```@\*```````!=(P``@P*
+M```````!=)P``@\*```````!=+@``@P*```````!=00``-<*```````!=4P`
+M`9\*```````!=5@``9\*```````!=:(``#X&```````!=:8``#X$```````!
+M=T@``@P*```````!=Y```@P*```````!=\P``@P*```````!>`@``@P*````
+M```!>$0``@P*```````!>&@``@P*```````!>2P``)(*```````!>I@``9(*
+M```````!?LH``#\&```````!?LX``#\$```````!?\```64*```````!@9``
+M`=0*```````!@R```=0*```````!A/(``$$&````!``!A/8``$$$````!``!
+MA0(``$$&````"``!A08``$$$````"``!A2H``$`&````!``!A2X``$`$````
+M!``!A3H``$`&````"``!A3X``$`$````"``!AM0``@P*```````!AT0``@\*
+M```````!B'X``$$&```````!B((``$$$```````!B(X``$`&```````!B)(`
+M`$`$```````!BP@``*T*```````!C!P``-D*```````!C%0``.4*```````!
+MC'```@P*```````!C)@``-D*```````!C.P``.4*```````!C/P``@P*````
+M```!C2@``.4*```````!C3@``@P*```````!C9P``@\*```````!C?P``@P*
+M```````!C@P``@P*```````!CAP``@P*```````!CB@``@\*```````!CD``
+M`@P*```````!CI0``50*```````!CJ0``@\*```````!CNP``@P*```````!
+MCO@``50*```````!CU@``>4*```````!CZ0``90*```````!D.@``9\*````
+M```!D3P``-0*```````!D9P``@P*```````!D;P``@P*```````!D<@``@\*
+M```````!D>0``@P*```````!DX```@P*```````!DZ@``@P*```````!D]@`
+M`@P*```````!E!```@P*```````!E#@``@P*```````!E3X``:<&```````!
+ME4(``:<$```````!E48``*\&```````!E4H``*\$```````!E5H``3X&````
+M```!E5X``3X$```````!E7@``@P*```````!E:0``@P*```````!E;@``@P*
+M```````!E=@``@P*```````!E>@``@P*```````!E?@``@P*```````!E@0`
+M`@\*```````!EA0``@P*```````!EW```@\*```````!EY@``@P*```````!
+ME\@``@P*```````!F`@``@\*```````!F!P``@\*```````!F(@``@P*````
+M```!F)@``A<*```````!F*@``;0*```````!F+P``A<*```````!F1P``@\*
+M```````!F3@``@P*```````!F50``@P*```````!F60``@\*```````!F8P`
+M`@\*```````!F:```@P*```````!F:@``;0*```````!F;@``@\*```````!
+MF<P``@P*```````!F>0``;0*```````!F?```A<*```````!F@@``@\*````
+M```!FAP``@P*```````!FBP``@P*```````!GK```@$*```````!GL0``@P*
+M```````!GM@``@P*```````!GN@``@P*```````!GOP``@P*```````!GQ``
+M`@P*```````!GT0``@P*```````!GU```@$*```````!GV0``@P*```````!
+MGW@``@P*```````!H"```@$*```````!H(0``9\*```````!H60``@P*````
+M```!H7@``@P*```````!H8```*X*```````!H?0``0$*```````!H@@``@P*
+M```````!HAP``@P*```````!HFX```(&``!;#``!HG(```($``!;#``!HJ0`
+M`@\*```````!HLP``@P*```````!HMP``@\*```````!HOP``@P*```````!
+MHPP``@\*```````!HRP``@P*```````!HSP``@\*```````!HUP``@P*````
+M```!HYX```(&``!:J``!HZ(```($``!:J``!H[8```(&``!:L``!H[H```($
+M``!:L``!H\X```(&``!:N``!H](```($``!:N``!H^8```(&``!:P``!H^H`
+M``($``!:P``!H_X```(&``!:R``!I`(```($``!:R``!I!8```(&``!:T``!
+MI!H```($``!:T``!I$```@\*```````!I&@``@P*```````!I'@``@\*````
+M```!I)P``@P*```````!I*P``@\*```````!I-```@P*```````!I.```@\*
+M```````!I00``@P*```````!I10``@\*```````!I3@``@P*```````!I4@`
+M`@\*```````!I6P``@P*```````!I80``@\*```````!I9P``@\*```````!
+MI;```@P*```````!I?H```(&``!:V``!I?X```($``!:V``!IB0``@\*````
+M```!IDP``@P*```````!IHH```(&``!:X``!IHX```($``!:X``!II(```($
+M``!:X``!IL0``@\*```````!INP``@P*```````!IRX```(&``!:[``!IS(`
+M``($``!:[``!IS8```($``!:[``!IY```@\*```````!I[@``@P*```````!
+MJ!```/`*```````!J!@``?`*```````!J"0``5@*```````!J$@``?`*````
+M```!J%0``5@*```````!J&@``@P*```````!J'P``@P*```````!J(0``*X*
+M```````!J)```?`*```````!J)P``5@*```````!J6P``@P*```````!J8``
+M`@P*```````!J90``@P*```````!J:@``@P*```````!J;0``@$*```````!
+MJH@``1T*```````!JKP``1T*```````!JN```9T*```````!JP@``1T*````
+M```!JR0``1T*```````!J]0``9T*```````!J_P``1T*```````!K*```1T*
+M```````!K+```1T*```````!K,```1T*```````!K-```1T*```````!K.``
+M`1T*```````!K.@``?`*```````!K/0``5@*```````!K2@``1T*```````!
+MK3@``1T*```````!K5```1T*```````!K6```1T*```````!K8```1T*````
+M```!K9```1T*```````!K:```1T*```````!K;```1T*```````!K<```1T*
+M```````!K=0``?`*```````!K>```5@*```````!K?P``@P*```````!KA``
+M`@P*```````!KB0``?`*```````!KC```5@*```````!KH@``@P*```````!
+MKIP``@P*```````!KJ@``@$*```````!KM```@\*```````!KN0``@\*````
+M```!L.P``1T*```````!L20``@\*```````!L3@``@\*```````!L4P``@\*
+M```````!LG```@$*```````!LH```@\*```````!LI0``@\*```````!LLP`
+M`@P*```````!LN```@P*```````!LOP``@P*```````!LQ```@P*```````!
+MM/(``$(&```````!M/8``$($```````!M10``@P*```````!M2@``;0*````
+M```!M3X``$,&```````!M4(``$,$```````!M5@``@P*```````!M6P``;0*
+M```````!M8(``$4&```````!M88``$4$```````!M:0``@P*```````!M;@`
+M`;0*```````!MAP``0@*```````!MCX``$P&````Y``!MD(``$P$````Y``!
+MME```*T*```````!MG0``@\*```````!MI@``@P*```````!MK0``*T*````
+M```!MM0``*T*```````!MP@``@P*```````!MR0``@P*```````!MUX```(&
+M``!H"``!MV(```($``!H"``!N2(``$0&```````!N28``$0$```````!N6@`
+M`/8*```````!N8```/8*```````!N8H``$0&```````!N8X``$0$```````!
+MN:@``@P*```````!N;P``;0*```````!N=(``$8&```````!N=8``$8$````
+M```!N>P``@P*```````!N@```;0*```````!NA(``$<&```````!NA8``$<$
+M```````!NC0``@P*```````!ND@``;0*```````!NEH``$@&```````!NEX`
+M`$@$```````!NGP``@P*```````!NI```;0*```````!NJ8``$D&```````!
+MNJH``$D$```````!NO0``/8*```````!NPP``/8*```````!NR0``/8*````
+M```!NSP``/8*```````!NU0``/8*```````!NVP``/8*```````!NW8``$D&
+M```````!NWH``$D$```````!NY0``@P*```````!NZ@``;0*```````!N\(`
+M`$H&```````!N\8``$H$```````!O````/8*```````!O!@``/8*```````!
+MO&```/8*```````!O'@``/8*```````!O)```/8*```````!O)H``$H&````
+M```!O)X``$H$```````!O+@``@P*```````!O,P``;0*```````!OH@``9\*
+M```````!P@0``=0*```````!P]0``=0*```````!Q`@``0(*```````!Q"``
+M`0(*```````!Q%(``%,&```````!Q%8``%,$```````!Q&(``%,$```````!
+MQ'X``%,&```````!Q((``%,$```````!Q+```4P*```````!Q,P``4P*````
+M```!Q.X``%$&```````!Q/(``%$$```````!Q/H``$L&```````!Q/X``$L$
+M```````!Q08``$X&```````!Q0H``$X$```````!Q1(``$T&```````!Q18`
+M`$T$```````!Q1X``$\&```````!Q2(``$\$```````!Q2H``%`&```````!
+MQ2X``%`$```````!Q38``%(&```````!Q3H``%($```````!Q4(``%0&````
+M```!Q48``%0$```````!Q:(``%4&```````!Q:8``%4$```````!Q<0``@P*
+M```````!Q=@``;0*```````!Q>X``%8&```````!Q?(``%8$```````!Q@@`
+M`@P*```````!QAP``;0*```````!QC(``%<&```````!QC8``%<$```````!
+MQE0``@P*```````!QF@``;0*```````!QWP``*T*```````!QY```@\*````
+M```!Q[0``@P*```````!R"```*T*```````!R(0``*T*```````!R.```*T*
+M```````!R3P``*T*```````!R4P``*T*```````!R7P``@P*```````!R9``
+M`@P*```````!R=(```(&``!T+``!R=8```($``!T+``!RW8``%@&```````!
+MRWH``%@$```````!RYX``%D&```````!RZ(``%D$```````!R\X``%H&````
+M```!R](``%H$```````!R_X``%L&```````!S`(``%L$```````!S$```/8*
+M```````!S%@``/8*```````!S'```/8*```````!S)@``/8*```````!S+0`
+M`/8*```````!S-```/8*```````!S.P``/8*```````!S0@``/8*```````!
+MS20``/8*```````!S4P``/8*```````!S7P``/8*```````!S90``/8*````
+M```!S?0``/8*```````!S@P``/8*```````!SB0``/8*```````!SCP``/8*
+M```````!SF0``/8*```````!SGP``/8*```````!SI0``/8*```````!SJP`
+M`/8*```````!SL0``/8*```````!SLX``%P&```````!SM(``%P$```````!
+MSR```/8*```````!SS@``/8*```````!SX0``/8*```````!SYP``/8*````
+M```!SZ8``%@&```````!SZH``%@$```````!S\```@P*```````!S]0``;0*
+M```````!S^8``%D&```````!S^H``%D$```````!T`0``@P*```````!T!@`
+M`;0*```````!T"H``%H&```````!T"X``%H$```````!T$@``@P*```````!
+MT%P``;0*```````!T&X``%L&```````!T'(``%L$```````!T(P``@P*````
+M```!T*```;0*```````!T+8``%P&```````!T+H``%P$```````!T-0``@P*
+M```````!T.@``;0*```````!TWP``64*```````!TY```64*```````!T^0`
+M`64*```````!T_@``64*```````!U#```64*```````!U%0``64*```````!
+MU&@``64*```````!U*0``64*```````!VY0``0(*```````!VZP``0(*````
+M```!WX@``4P*```````!WZ0``4P*```````!W\X``&(&```````!W](``&($
+M```````!W]H``%T&```````!W]X``%T$```````!W^8``%\&```````!W^H`
+M`%\$```````!W_(``%X&```````!W_8``%X$```````!W_X``&`&```````!
+MX`(``&`$```````!X`H``&$&```````!X`X``&$$```````!X!8``&,&````
+M```!X!H``&,$```````!X"(``)\&```````!X"8``)\$```````!X((``&0&
+M```````!X(8``&0$```````!X*0``@P*```````!X+@``;0*```````!X,X`
+M`&4&```````!X-(``&4$```````!X.@``@P*```````!X/P``;0*```````!
+MX1(``&8&```````!X18``&8$```````!X30``@P*```````!X4@``;0*````
+M```!XEP``*T*```````!XG```@\*```````!XI0``@P*```````!XP```*T*
+M```````!XV0``*T*```````!X\```*T*```````!Y!P``*T*```````!Y"P`
+M`*T*```````!Y%P``@P*```````!Y'```@P*```````!Y3(``&<&```````!
+MY38``&<$```````!Y5H``&@&```````!Y5X``&@$```````!Y8H``&D&````
+M```!Y8X``&D$```````!Y;H``&H&```````!Y;X``&H$```````!Y?P``/8*
+M```````!YA0``/8*```````!YAX``&L&```````!YB(``&L$```````!YE(`
+M`&<&```````!YE8``&<$```````!YFP``@P*```````!YH```;0*```````!
+MYI(``&@&```````!YI8``&@$```````!YK```@P*```````!YL0``;0*````
+M```!YM8``&D&```````!YMH``&D$```````!YO0``@P*```````!YP@``;0*
+M```````!YQH``&H&```````!YQX``&H$```````!YS@``@P*```````!YTP`
+M`;0*```````!YV(``&L&```````!YV8``&L$```````!YX```@P*```````!
+MYY0``;0*```````!Y^H```(&``"`+``!Y^X```($``"`+``!\`P``@\*````
+M```!\$0``@\*```````!\&@``@P*```````!\-```@P*```````!\20``@P*
+M```````!\7@``0(*```````!\9```0(*```````!\:@``0(*```````!]9@`
+M`4P*```````!];0``4P*```````!]<@``4P*```````!]>H``'$&```````!
+M]>X``'$$```````!]?8``&P&```````!]?H``&P$```````!]@(``&\&````
+M```!]@8``&\$```````!]@X``&T&```````!]A(``&T$```````!]AH``&X&
+M```````!]AX``&X$```````!]B8``'`&```````!]BH``'`$```````!]C(`
+M`'(&```````!]C8``'($```````!]CX``)\&```````!]D(``)\$```````!
+M]IX``',&```````!]J(``',$```````!]L```@P*```````!]M0``;0*````
+M```!]NH``'0&```````!]NX``'0$```````!]P0``@P*```````!]Q@``;0*
+M```````!]RX``'4&```````!]S(``'4$```````!]U```@P*```````!]V0`
+M`;0*```````!^'@``*T*```````!^(P``@\*```````!^+```@P*```````!
+M^1P``*T*```````!^A@``*T*```````!^B@``*T*```````!^E@``@P*````
+M```!^FP``@P*```````!^[H``'8&```````!^[X``'8$```````!^^(``'<&
+M```````!^^8``'<$```````!_!(``'@&```````!_!8``'@$```````!_$(`
+M`'D&```````!_$8``'D$```````!_)0``/8*```````!_*P``/8*```````!
+M_,0``/8*```````!_/```*T*```````!_20``/8*```````!_3P``/8*````
+M```!_48``'H&```````!_4H``'H$```````!_7H``'8&```````!_7X``'8$
+M```````!_90``@P*```````!_:@``;0*```````!_;H``'<&```````!_;X`
+M`'<$```````!_=@``@P*```````!_>P``;0*```````!_?X``'@&```````!
+M_@(``'@$```````!_AP``@P*```````!_C```;0*```````!_D(``'D&````
+M```!_D8``'D$```````!_F```@P*```````!_G0``;0*```````!_HH``'H&
+M```````!_HX``'H$```````!_J@``@P*```````!_KP``;0*```````!_Q8`
+M``(&``".%``!_QH```($``".%``"!S@``@\*```````"!W```@\*```````"
+M!Y0``@P*```````"!_P``@P*```````""%```@P*```````""*0``0(*````
+M```""+P``0(*```````""-0``0(*```````"#,0``4P*```````"#.```4P*
+M```````"#/0``4P*```````"#18``(`&```````"#1H``(`$```````"#2(`
+M`'L&```````"#28``'L$```````"#2X``'X&```````"#3(``'X$```````"
+M#3H``'P&```````"#3X``'P$```````"#48``'T&```````"#4H``'T$````
+M```"#5(``'\&```````"#58``'\$```````"#5X``($&```````"#6(``($$
+M```````"#6H``)\&```````"#6X``)\$``````````@```$:```)%`````P`
+M``$:```*3````!````$:```*4````!0```$:```*5````!@```$:```)+```
+M`!P```$:```*7````"````$:```)2````"0```$:```)5````"@```$:```*
+MH````"P```$:```)9````#````$:```)=````#0```$:```)N````#@```$:
+M```)E````#P```$:```)I````$````$:```)N````$0```$:```)T````$@`
+M``$:```*P````$P```$:```*Q````%````$:```*'````%0```$:```*+```
+M`%@```$:```*F````%P```$:```*0````&````$:```*H````&0```$:```*
+M5````&@```$:```*9````&P```$:```*=````'````$:```*Z````'0```$:
+M```*[````'@```$:```*N````'P```$:```*]````(````$:```*R````(0`
+M``$:```*_````(@```$:```+`````(P```$:```+!````)````$:```*^```
+M`5```8L!`````````50``.,!`````````5@``3\!`````````5P``3(!````
+M`````6```?D!`````````60``5(!`````````6@``-(!`````````6P``5X!
+M`````````7```1\!`````````70``?8!`````````7@``<D!`````````7P`
+M`3P!`````````8```+P!`````````80``0,!`````````8@``-4!````````
+M`8P``)X!`````````9```><!`````````90``A(!`````````9@``*P!````
+M`````9P``0L!`````````:```<8!`````````:0``*<!`````````:@``+H!
+M`````````:P``.<!`````````;```?T!`````````;0``?@!`````````;@`
+M`9@!`````````;P``3,!`````````<```=X!`````````<0``>$!````````
+M`<@``8@!`````````<P``5L!`````````=```;L!`````````=0``0\!````
+M`````=@``?$!`````````=P``3T!`````````>```34!`````````>0``00!
+M`````````>@``2T!`````````>P``-,!`````````?```48!`````````?0`
+M`;<!`````````?@``8T!`````````?P``2,!`````````@```;(!````````
+M`@0``6@!`````````@@``=L!`````````@P``<L!`````````A```:H!````
+M`````A0``+`!`````````A@``30!`````````AP``=D!`````````B```9H!
+M`````````B0``:,!`````````B@``+L!`````````BP``/,!`````````C``
+M`<,!`````````C0``6,!`````````C@``,T!`````````CP``+0!````````
+M`D```0H!`````````D0``(8!`````````D@``70!`````````DP``;P!````
+M`````E```;,!`````````E0``74!`````````E@``?X!`````````EP``.@!
+M`````````F```(@!`````````F0``>,!`````````F@``2L!`````````FP`
+M`8X!`````````G```9<!`````````G0``>T!`````````G@``;$!````````
+M`GP``24!`````````H```,,!`````````H0``:P!`````````H@``)$!````
+M`````HP``3H!`````````I```.X!`````````I0``7<!`````````I@``7D!
+M`````````IP``=`!`````````J```>(!`````````J0``?P!`````````J@`
+M`(T!`````````JP``<T!`````````K```:$!`````````K0``8H!````````
+M`K@``2`!`````````KP``<X!`````````L```!@!`````````L0``A`!````
+M`````L@``:D!`````````M```=D!`````````M0``9H!`````````M@``:,!
+M`````````MP``+L!`````````N```/,!`````````N0``!D!````````&6``
+M`<0!````````&60``>0!````````&6@``=8!````````&6P``?L!````````
+M&7```.(!````````&70``/0!````````&7@``1(!````````&7P``.L!````
+M````&8```(L!````````&80``+,!````````&8@``.`!````````&8P``.$!
+M````````&9```+<!````````&90``>H!````````&9@``8P!````````&9P`
+M`@8!````````&:```0`!````````&:0``?0!````````&:@``8$!````````
+M&:P``2D!````````&;```:8!````````&;0``*`!````````&;@``88!````
+M````&;P``)<!````````&<```>8!````````&<0``68!````````&<@``)T!
+M````````&<P``*@!````````&=```2P!````````&=0``?H!````````&=@`
+M`>@!````````&=P``?4!````````&>```;@!````````&>0``7$!````````
+M&>@``7X!````````&>P``6T!````````&?```9$!````````&?0``/P!````
+M````&?@``1<!````````&?P``/(!````````&@```<@!````````&@0``1X!
+M````````&@@``+X!````````&@P``;D!````````&A```;4!````````&A0`
+M`/@!````````&A@``+@!````````&AP``<P!````````&B```5P!````````
+M&B0``:T!````````&B@``6(!````````&BP``4(!````````&C```6$!````
+M````&C0``<`!````````&C@``4T!````````&CP``+4!````````&D```-\!
+M````````&D0``5<!````````&D@``<4!````````&DP``=,!````````&E``
+M`:4!````````&E0``)H!````````&E@``-H!````````&EP``:\!````````
+M&F```A$!````````&F0``,8!````````&F@``1D!````````&FP``=\!````
+M````&G```5,!````````&G0``8,!````````&G@``)P!````````&GP``7H!
+M````````&H```+8!````````&H0``7\!````````&H@``6H!````````&HP`
+M`0P!````````&I```*4!````````&I0``,X!````````&I@``1$!````````
+M&IP``5H!````````&J```4H!````````&J0``=4!````````&J@``4D!````
+M````&JP``=`!````````&K```@T!````````&K0``(4!````````&K@``2$!
+M````````&KP``.\!````````&L```.D!````````&L0``6X!````````&L@`
+M`7(!````````&LP``84!````````&M```"`!````````&M0``:L!````````
+M&M@``<<!````````&N```4(!````````&N0``6$!````````&N@``<`!````
+M````&NP``4T!````````&O```+4!````````&O0``"$!````````.60```$:
+M``#KQ```.6@```$:``#KR```.6P```$:``#KZ```.7````$:``#K[```.70`
+M``$:``#L#```.7@```$:``#L$```.7P```$:``#L,```.8````$:``#L-```
+M.M```-D!````````.M0``/\!````````.M@``?(!````````.MP``.H!````
+M````.N```,(!````````.N0``58!````````.N@``3<!````````.NP``9L!
+M````````.O```2H!````````.O0``-$!````````.O@``1P!````````.OP`
+M`-0!````````.P```8(!````````.P0``=T!````````.P@``0D!````````
+M.PP``7T!````````.Q```60!````````.Q0``A<!````````.Q@``@L!````
+M````.QP``3@!````````.R```/L!````````.R0``:(!````````.R@``*8!
+M````````.RP``=P!````````.S```=$!````````.S0``04!````````.S@`
+M`>`!````````.SP``-T!````````.T```;X!````````.T0``8`!````````
+M.T@``7L!````````.TP``)`!````````.U```>L!````````.U0``/D!````
+M````.U@``5\!````````.UP``?`!````````.V```5@!````````.V0``14!
+M````````.V@``;`!````````.VP``7@!````````.W```(X!````````.W0`
+M`1L!````````.W@``(<!````````.WP``18!````````.X```;T!````````
+M.X0``2\!````````.X@``6<!````````.XP``+T!````````.Y```9X!````
+M````.Y0``2(!````````.Y@``3`!````````.YP``98!````````.Z```,L!
+M````````.Z0``<$!````````.Z@``<\!````````.ZP``9,!````````.[``
+M`A,!````````.[0``,<!````````.[@``44!````````.[P``2<!````````
+M.\```@$!````````.\0``,H!````````.\@``0T!````````.\P``@4!````
+M````.]```28!````````.]0``4L!````````.]@``,`!````````.]P``,D!
+M````````.^```*L!````````.^0``+\!````````.^@``+D!````````.^P`
+M`6D!````````._```,0!````````._0``/X!````````._@``+(!````````
+M._P``+$!````````/````)8!````````/`0``/$!````````/`@``78!````
+M````/`P``.P!````````/!```:0!````````/!0``@`!````````/!@``4\!
+M````````/!P``=`!````````/"```1`!````````/"0``@X!````````/"@`
+M`8\!````````/"P``5`!````````/#```*$!````````/#0``?,!````````
+M/#@``.T!````````/#P``50!````````/$```40!````````/$0``6L!````
+M````/$@``@D!````````/%```98!````````/%0``,L!````````/%@``<$!
+M````````/%P``<\!````````/&```9,!````````/&0``A0!````````/&P`
+M`#,!````````3:````$:``$B1```3:0```$:``$B````3:@```$:``$B#```
+M3:P```$:``$BD```3;````$:``$B+```3;0```$:``$BD```3@0```$:``$Z
+ME```3@@```$:``$X'```3@P```$:``$X8```3A````$:``$XB```3A0```$:
+M``$ZI```3A@```$:``$X[```3AP```$:``$ZK```3B````$:``$ZL```3B0`
+M``$:``$ZM```3B@```$:``$ZN```3BP```$:``$ZO```3C````$:``$Y-```
+M3C0```$:``$ZQ```3C@```$:``$ZR```3CP```$:``$ZS```3D````$:``$Z
+MT```3D0```$:``$Y4```3D@```$:``$Y<```3DP```$:``$ZW```3E````$:
+M``$YQ```3E0```$:``$Y[```3E@```$:``$ZZ```3EP```$:``$Y````3F``
+M``$:``$Z\```3F0```$:``$Z]```3F@```$:``$Z^```3FP```$:``$Z3```
+M3G````$:``$Z7```3G0```$:``$[!```3G@```$:``$Z<```3GP```$:``$Z
+MC```3H````$:``$ZD```3H0```$:``$Z;```3H@```$:``$Z>```3HP```$:
+M``$ZA```3I````$:``$ZD```3I0```$:``$ZG```3K0```$:``$\F```3K@`
+M``$:``$\G```3KP```$:``$[$```3L````$:``$[-```3L0```$:``$\J```
+M3L@```$:``$[@```3LP```$:``$\L```3M````$:``$\M```3M0```$:``$\
+MN```3M@```$:``$\O```3MP```$:``$\P```3N````$:``$[Q```3N0```$:
+M``$\R```3N@```$:``$\S```3NP```$:``$\T```3O````$:``$\U```3O0`
+M``$:``$[\```3O@```$:``$\W```3OP```$:``$\X```3P````$:``$\#```
+M3P0```$:``$\M```3P@```$:``$\[```3PP```$:``$\\```3Q````$:``$\
+M]```3Q0```$:``$\^```3Q@```$:``$\_```3QP```$:``$\3```3R````$:
+M``$\4```3R0```$:``$]"```3R@```$:``$\K```6PP```$:``&HK```6Q``
+M``$:``&BC```6Q0```$:``&CI```6Q@```$:``&F!```6QP```$:``&FF```
+M6R````$:``&G0```6R0```$:``&H$```:`@```$:``&WI```:`P```$:``&W
+M?```:!````$:``&WB```:!0```$:``&WE```:!@```$:``&WL```:!P```$:
+M``&WM```:"````$:``&WJ```:"0```$:``&WM```="P```$:``'*#```=#``
+M``$:``'*%```=#0```$:``')]```=#@```$:``'*````=#P```$:``'*'```
+M=$````$:``'*(```=$0```$:``'*%```=$@```$:``'*(```@"P```$:``'H
+M)```@#````$:``'H+```@#0```$:``'H#```@#@```$:``'H&```@#P```$:
+M``'H-```@$````$:``'H.```@$0```$:``'H+```@$@```$:``'H.```CA0`
+M``$:``'_4```CA@```$:``'_6```CAP```$:``'_.```CB````$:``'_1```
+MCB0```$:``'_8```CB@```$:``'_9```CBP```$:``'_6```CC````$:``'_
+M9`````P```,!`````````!````,!````"````!0```,!````$````!@```,!
+M````&````!P```,!````(````"````,!````*````"0```,!````,````"@`
+'``,!````.```
+`
+end
diff --git a/sys/contrib/dev/ath/public/powerpc-be-eabi.inc b/sys/contrib/dev/ath/public/powerpc-be-eabi.inc
new file mode 100644
index 0000000..5cb4cab
--- /dev/null
+++ b/sys/contrib/dev/ath/public/powerpc-be-eabi.inc
@@ -0,0 +1,76 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/powerpc-be-eabi.inc#2 $
+#
+
+#
+# Compilation configuration for building big-endian PowerPC/powerpc-eabi.
+#
+# Known to work on:
+# IBM 450EP
+
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=powerpc-eabi
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/powerpc-eabi-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -mbig-endian
+COPTS+= -msoft-float -ffixed-r2
diff --git a/sys/contrib/dev/ath/public/powerpc-be-eabi.opt_ah.h b/sys/contrib/dev/ath/public/powerpc-be-eabi.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/powerpc-be-eabi.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/powerpc-be-elf.hal.o.uu b/sys/contrib/dev/ath/public/powerpc-be-elf.hal.o.uu
new file mode 100644
index 0000000..6ea3de7
--- /dev/null
+++ b/sys/contrib/dev/ath/public/powerpc-be-elf.hal.o.uu
@@ -0,0 +1,5415 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/COPYRIGHT#1 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`0`````````````!`!0````!`````````````O8L```````T````
+M```H``T`"CT@```Y*0!$+`,`6$&"`2Q!@0!@+`,`&T&!`#`L`P`:0(`!""P#
+M`!)!@0`8+`,`$4"``-0L`P`'08(`P$@``/@L`P`32```8"P#`%)!@@#$08$`
+M%#T@```Y*0!8+`,`'$@``)`L`P!708(`J$@``,@L`Q$'08(`A$&!`#0](```
+M.2D`;"P#`)%!@@"P08$`%#@#_WHH```!08$`G$@``(`L`Q`408(`A$@``(PL
+M`Q$308(`>$&!`!`L`Q$208(`2$@``'0X````8`#P$ST@```Y*0"`?`,``$&"
+M`&`X````8`#Q&ST@```Y*0"4?`,``$&"`$A(``!`/2```#DI`*A(```X/2``
+M`#DI`+A(```L/2```#DI`,A(```@/2```#DI`-Q(```4/2```#DI`/!(```(
+M.2```'TC2WA.@``@E"'_\'P(`J:0`0`4:&`6C"$@``!\"0$4:&FG)R%I``!]
+M*TD4?`M+>4""`!`X````+`,0MT""`!!\@R-X2__^A7Q@&WA\`P-X@`$`%'P(
+M`Z8X(0`03H``()0A__!\"`*FD`$`%"P#`@=!@@"T08$`."P#`!)!@0`8+`,`
+M$4"``)@L`P`'08(`F$@``)PL`P`308(`?#@#_^8H```"08$`B$@``&@L`Q$3
+M08(`9$&!`"0L`Q$'08(`:$&!``PL`Q`42```1"P#$1)!@@!,2```6#@```!@
+M`/$;?`,``$&"`#A!@0`8.````&``\!-\`P``08(`'$@``#`X````8`#_&7P#
+M``!`H@`@.&``$T@```%(```@2````4@``!A(```!2```$#A@```X```!D`<`
+M`"P#``!!@@`\H`,!R+`#``B@`P'*L`,`"H`#`<R0`P`<H`,!T+`#`""@`P'2
+ML`,`(J`#`=2P`P`DH`,!UK`#`":``0`4?`@#IC@A`!!.@``@D(,!V#A@``%.
+M@``@E"'_T'P(`J:380`<DX$`().A`"23P0`HD^$`+)`!`#1\>QMX?)PC>'R]
+M*WA\WC-X.^```']CVWA_A.-X2````7QCZ#@X```!?`/P`$&"`!PX8``*2```
+M`3O_``$L'P/G0('_U#@```!\`P-X@`$`-'P(`Z:#80`<@X$`((.A`"2#P0`H
+M@^$`+#@A`#!.@``@.6```#@```!\`"!`0(``(%0`"#Q4:0?^?`!+>%1C^'XY
+M:P`!?`L@0$&`_^A\`P-X3H``('QJ&W@=)@`,?2DB%*%I`"8X8```+`L``$V"
+M`"`=)@`,?2DB%(@)`"4L```"08(`9$&!`!`L````08(`'$@``8`L```#08(!
+M#"P```1!@@$T2``!;#E``,`L!P``08(`'!TF``Q]*2(4B`D`*2P```!!@@`(
+M.4``8%2@&#@<``/H?`!;EGQJ`A0X8P`*2``!-($J$C0L"0``08(`0*@)``(L
+M````0*``-%5@(#8](!!B82E-TWP`2!94"=&^5*`8.'R@2A0XI0`5?*5+EE2I
+M(#8X:0"02```[(!J$C0L`P``08(`0*`#``)P"4``08(`-%5@&#@](!!B82E-
+MTWP`2!94"=&^5*`8.'R@2A0XI0`5?*5+EE2I&#@X:0!(2```I%5@$#H](!!B
+M82E-TWP`2!94"=&^5*`8.'R@2A0XI0`5?*5+EE2I$#HX:0`D2```=%5@&#@]
+M(!!B82E-TWP`2!94"=&^5*`8.'R@2A0XI0`5?*5+EE2I$#HX:0`62```1%5@
+M$#H](!!B82E-TWP`2!94"=&^5*`8.'R@2A0XI0`5?*5+EE2E$#HX90"]*`L#
+MYT"!`!`X90!<2```"#A@``!48P0^3H``(*`$``(X8``"<`D`($R"`""@!``"
+M<```T#A@``,L``#`38(`(*`$``)P``#0.&``!"P``-!-@@`@H`0``CA@``%P
+M"0`03((`(*`$``)P"0@`?&``)E1C'_Y\8P#05&,'N#AC``5.@``@E"'_X'P(
+M`J:3P0`8D^$`')`!`"1\8!MX?)XC>'R_*WAPJ0"`08(`'#A@``XL!`FT08(!
+M/"@$";-`@0!@2``!`'"K`0!!H@!`2````2P#``!!@@`0.![LLR@``#!`@0"`
+M<^`!0'P``-!4``_^(3X3B#D@``!]*4D4?`M(.4""`+A(``#8.&``#BP$";1!
+M@@#@*`0)LT&!`"0Y/O:9/`!F9F``9F=\"0"6?``.<'TI_G!\:0!02```N"@$
+M$X=!H0"<?`,#>$@```$L`P``08(`8#@>[+,H```P08$`5!T^``H]8,S,86O,
+MS7P>6!94`/"^'```!7P`\%`L```"0*(`%#TI__\X:3\-?`-8%D@``!@]*?__
+M.&D_"#P`S,Q@`,S-?`,`%E0#\+Y(``!$*!X3)$"!``PY/O!@2```)#D^]C`\
+M`,S,8`#,S7TI`!95*>$^.&D`#T@``!@Y/NQX/`#,S&``S,U]*0`652/POH`!
+M`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A_^!\"`*FD^$`')`!`"1\GR-X@(,2
+M-!P?`!8L!```08(`&$@```$](```.2D``'P)&*Y\'P'6?`,#>(`!`"1\"`.F
+M@^$`'#@A`"!.@``@E"'_X'P(`J:3X0`<D`$`)'R?(WB`@Q(T/`"Z+F``BZ-\
+M'P`65`#A/BP$``!!@@`82````3T@```Y*0``?`D8KGP?`Y9\`P-X@`$`)'P(
+M`Z:#X0`<."$`($Z``""4(?_0?`@"II-A`!R3@0`@DZ$`))/!`"B3X0`LD`$`
+M-'Q[&WA\GR-XB`0`!"P```!`@@"H.\```#@`__]]/_(4F`D`!#O>``$L'@`?
+M0('_\#O```"`'P``?!X``$"``'P?O@`,?[WZ%#N]`"")/0`(BYT`"WU_2A2;
+MRP`$B!T`"7TI`WA]/TH4F\D`!%><!#Y_8]MX?^3[>#B@``Y_AN-X..```$@`
+M``&P?0`,?V/;>'_D^W@XH``.?X;C>#C@``%(```!L'T`#CO>``&`'P``?!X`
+M`$&`_XR``0`T?`@#IH-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`,$Z``"`Y8P'@
+M*`0`(D&!`8P](```.2D`"%2`$#I\"0`N?`!*%'P)`Z9.@`0@H`,""$@``5R`
+M"P``<`D`@'P``"94`!_^2``!6*`+``I(``%`H`L`"$@``3B!*P``52F7_D@`
+M`#"`"P``<`N``'T@`"95*1_^?2D`T$@``02!*P``52D?_D@```R!*P``52DG
+M_GTI`-!(``#D@2L``%4I+_Y+___P@`,!^$@``.0L!0`!08(`)#@````H!0`!
+M08``X"P%``)!@@`8+`4``T&B`!A(``"0J`,!_$@``+2@`P'^2```K(`#`@!(
+M``"D@2L``%4IG_Y+__^<@2L``%4II_Y+__^0@2L``%4I3_Y+__^$@2L``%4I
+MM_Y+__]X@2L``%4IO_Y+__]L+`4``4&"`"0H!0`!08``$"P%``)!H@`<2```
+M(($K``!5*<?^2___1(`#$DQ(```8H`,22$@``#`X```-2```.(`#$FA\"_YP
+M?6D">'TI6%!]*?YP52D'MC@)``U(```8@`L`%)`&```X````2```"#@```Q\
+M`P-X3H``("P$`!E!@@`\*`0`&4&!`!`L!``/08(`%$@``&`L!``>08(`4$@`
+M`%0L!0`#0*(`3"@&``1!@0!$D,,"`$@``"0L!0`!08(`$"P%``)!@@`<2```
+M*#$F__]\"3$0D`,23#A@``%.@``@L,,22$O___20PQ)H2___["P'``!!@@`,
+M.```#)`'```X8```3H``()0A_]!\"`*FDP$`$),A`!2300`8DV$`').!`""3
+MH0`DD\$`*)/A`"R0`0`T?'L;>'R9(WA\N"MX?-XS>'R]*W@[0```*`8`!T"!
+M`'!70!`Z?2#*%'_Y`BZCB0`"5^"`'GP`XWB0'0``.[T`!#O>__Q_8]MX?^3[
+M>$@```&0?0``.[T`!#O_``0[WO_\?3_@$#D@``!]*4D4(!X``WP``1!\``#0
+M?2L`.4""_\@[6@`!*!X`!T&!_YA\>.A0@`$`-'P(`Z:#`0`0@R$`%(-!`!B#
+M80`<@X$`((.A`"2#P0`H@^$`+#@A`#!.@``@E"'_X'P(`J:3X0`<D`$`)'T?
+M0W@L!``-08(`.$&!`!`L!```08(`'$@``)`L!``=08(`."P$`!Y!@@!$2```
+M?#@#`<B0!P``.```$$@``"A\I"MX@*<``(#(``!+__ZYD'\``$@``$PX`Q)0
+MD`<``#@``!B0'P``2```."P&``!`@@`<.```!)`(``"!)P``@`,"!)`)``!(
+M```8.````"P&``1`H@`8@`4``)`#`@0X```!2```"#@```!\`P-X@`$`)'P(
+M`Z:#X0`<."$`($Z``""`!``$.&```"P```!-@@`@@`4``)`$``"`!0`$D`0`
+M"(`%``B0!``,@`4`#)`$`!"`!0`0+`#__T&"`!0H``#_0($`$#@``/](```(
+M.````I`$`!2`!0`4+`#__T&"`#A\"0-X*``$`$"!``@Y(`0`.````9`$`!A\
+M`$A`0(``(%0`"#Q@```!?`!(0$&`__1(```(@`4`%)`$`!B`!0`8+`#__T&"
+M`#A\"0-X*``$`$"!``@Y(`0`.````9`$`!Q\`$A`0(``(%0`"#Q@```!?`!(
+M0$&`__1(```(.``#_Y`$`!R@!0`<?`D#>4&"`!0H"0`/0($`$#@```](```(
+M.```"K`$`""@!0`>?`D#>4&"`!0H"0`/0($`$#@```](```(.```"K`$`"*`
+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
+M'0``*``__T"!`!"A/0`D.\G_JT@``""@'0``(\`P`G_>\1!_WO.X.`#_L'_>
+M`#@[W@%0+!H``4&"`#1!@0`0+!H``$&B`!1(``!D+!H``D&B`#Q(``!8.]X`
+M53L```@[_03<.ST$VD@``$R@'0`:+````$&B`;0[W@!E.P```CO]!4X[/05,
+M2```+*`=`!PL````0:(!E#O>`&D[```#._T%+CL]!2Q(```,.````$@``8@X
+M````L!D``#M@``!\&\``0*`!9'_$\W@[W@`!@!P!H'P)`Z9_@^-X.*$`"$Z`
+M!"$X````+`,``$&"`4R@'0``*``P`D"!`!"@`0`(5`#"/D@```R@`0`(5`"Z
+M?K`?``B@GP`(+`0``$&"`/PL&@``0((`$'^CZWA+_^+92```$*"?``A_H^MX
+M2__C&;!_``B@'0``*``P`D"!`!R@`0`(5`#VOK`?``:@`0`(5``FMD@``!B@
+M`0`(5`#NOK`?``:@`0`(5``>N+`?``1_Q/-X.]X``8`<`:!\"0.F?X/C>#BA
+M``A.@`0A.````"P#``!!@@"4H!T``"@`,`)`@0`PH2$`"%4IHSZ@'P`$?`!+
+M>+`?``2@`0`(5`#6OK`?``*@`0`(5``&OD@``"RA(0`(52F;?J`?``1\`$MX
+ML!\`!*`!``A4`,Z^L!\``J`!``A4`/Z^L!\``*$Y```Y*0`!L3D``#O_``H[
+M>P`!?!O``$&`_J0[6@`!+!H``D"!_=`X```!?`,#>(`!`#1\"`.F@P$`$(,A
+M`!2#00`8@V$`'(.!`""#H0`D@\$`*(/A`"PX(0`P3H``()0A_]!\"`*FDP$`
+M$),A`!2300`8DV$`').!`""3H0`DD\$`*)/A`"R0`0`T?'L;>'R:(W@[Q`5D
+MH`0``"@`/_]`@0`0HX0`)#N<`!I(```8H`0``#N``;\H`#`"08$`"#N``6\[
+M````H!H!!'P8``!`@`.05PD(/'TITA2@"0$&+````$""`""@&@``*``P`D"!
+M``P[G``(2``#5#N<``=(``-,H!H``"@`,`)`@0#(.^```'^$XW@[G``!@!L!
+MH'P)`Z9_8]MX.*$`"$Z`!"$X````+`,``$&"`RQ7ZQ@X?4OR%*`!``A4"<(^
+M?2OS+E0`!CZP"@`(._\``BP?``=`@?^T.^```'^$XW@[G``!@!L!H'P)`Z9_
+M8]MX.*$`"$Z`!"$X````+`,``$&"`MA7Z1@X?2GR%*%!``A52\:^L6D``E5`
+ME_Z0"0`$.2D`"%5*!KZQ20`"H`$`"%0`U_Z0"0`$._\``BP?``=`@?^<2``"
+M"'^$XW@[G``!@!L!H'P)`Z9_8]MX.*$`"$Z`!"$X````+`,``$&"`FR@`0`(
+M5`FZ?K$^``!4"?9^L3X`"%0`+G2P'@`0?X3C>#N<``&`&P&@?`D#IG]CVW@X
+MH0`(3H`$(3@````L`P``08("**$A``A5*ZK^H!X`$'P`6WBP'@`052#F?K`>
+M`!A5*1YXL3X`('^$XW@[G``!@!L!H'P)`Z9_8]MX.*$`"$Z`!"$X````+`,`
+M`$&"`=RA(0`(52N;?J`>`"!\`%MXL!X`(%4@UGZP'@`H52D.?+$^`#!_A.-X
+M.YP``8`;`:!\"0.F?V/;>#BA``A.@`0A.````"P#``!!@@&0H2$`"%4KB_Z@
+M'@`P?`!;>+`>`#!5(,9^L!X`.%4@]KZP'@`"52DFMK$^``I_A.-X.YP``8`;
+M`:!\"0.F?V/;>#BA``A.@`0A.````"P#``!!@@$\H6$`"%5JHSZ@'@`*?`!3
+M>+`>``I5:=:^L3X`$E5K!KZQ?@`:?X3C>#N<``&`&P&@?`D#IG]CVW@XH0`(
+M3H`$(3@````L`P``08(`\*`!``A4";*^L3X`(E0)YKZQ/@`J5``6NK`>`#)_
+MA.-X.YP``8`;`:!\"0.F?V/;>#BA``A.@`0A.````"P#``!!@@"LH`$`"%0+
+MD[ZA/@`R?2E;>+$^`#)4`,:^L!X`.CO@``!7"0@\?2G2%#LI`0!7_1@X?!WP
+M+BP```!!@@!,H!D`!G````=](``F52D?_F@```,A8```?`L!%'TK`WE!@@`4
+M?)WR+G]#TWA+_]W52```%%?]&#A\G?(N?T/3>$O_WA%\??,N._\``2P?``=`
+M@?^@.]X`0#L8``&@&@$$?!@``$&`_'@X```!?`,#>(`!`#1\"`.F@P$`$(,A
+M`!2#00`8@V$`'(.!`""#H0`D@\$`*(/A`"PX(0`P3H``()0A_]!\"`*FDT$`
+M&)-A`!R3@0`@DZ$`))/!`"B3X0`LD`$`-'Q\&WA\GB-X.```#[`$`"JP!``L
+MH`0``"@`,`)`@0`4/2```#M)```X```@2```$#T@```[20``.```$+`>`02`
+MF@``@!P!H'P)`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#``!!@@XDH2$`"%4@
+MB_ZP'@`&52"7_K`>``I5(*]^L!X`#%4@YGZP'@`.H!X``"@`/_]`@0`,52#O
+M_D@```@X```!L!X`"*%A``A5:??^L3X`'%5@__ZP'@`:56L'_K%^`!:#^@`$
+M?^3[>#O_``&!?`&@?6D#IG^#XW@XH0`(3H`$(3@```"0`0`,+`,``$&"#9B@
+M`0`(5`#"/I@>`!Z(`0`)F!X`'Z`>```H`#__0*$`V'_D^W@[_P`!@7P!H'UI
+M`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#``!!H@U,H6$`"%5ID[ZQ/@`N56F?
+M_I$^`,A58*?^D!X`S%5K!3ZQ?@`P?^3[>#O_``&!?`&@?6D#IG^#XW@XH0`(
+M3H`$(3@```"0`0`,+`,``$&"#/R@`0`(5`D%/K$^`"14`)?^F!X`(Z`>```H
+M`$__0*$`/#O_``*!?`&@?6D#IG^#XWA_Y/MX.*$`"$Z`!"$X````D`$`#"P#
+M``!!@@RPH`$`"%0`X3ZP'@#0.V```%=I$#I]*=(4@^D`"'_D^W@[_P`!@7P!
+MH'UI`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#``!!@@QH5VD(/'TI\A0Y:0`P
+MH`$`"%0`QGZP"P`"H`$`"%0`]KZP"P`(H`$`"%0`)K:P"0!T?^3[>#O_``&!
+M?`&@?6D#IG^#XW@XH0`(3H`$(3@```"0`0`,+`,``$&"#`Q7:P@\?6OR%#E+
+M`'"A(0`(52FC/J`*``1\`$MXL`H`!*`!``A4`-:^L`L`>J`!``A4``:^L`L`
+M@'_D^W@[_P`!@7P!H'UI`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#``!!@@NH
+M5VD(/'TI\A2@`0`(5`"ROK`)`(:@`0`(5`#FOK`)`(R@`0`(5``6NK`)`))_
+MY/MX._\``8%\`:!]:0.F?X/C>#BA``A.@`0A.````)`!``PL`P``08(+4%=K
+M"#Q]:_(4.4L`CJ$A``A5*9.^H`H`!'P`2WBP"@`$H`$`"%0`QKZP"P"8H`$`
+M"%0`]KZP"P">H`$`"%0`)K:P"P"D?^3[>#O_``&!?`&@?6D#IG^#XW@XH0`(
+M3H`$(3@```"0`0`,+`,``$&""N!7:P@\?6OR%#E+`*"A(0`(52FC/J`*``1\
+M`$MXL`H`!*`!``A4`-:^L`L`JJ`!``A4``:^L`L`L'_D^W@[_P`!@7P!H'UI
+M`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#``!!@@I\?3OR%*`!``A4`,(^F`D`
+M5BP;``%!@@!`08$`$"P;``!!@@`42```7"P;``)!@@!`2```4*`!``A4"=]^
+ML3X`\%0)]WZQ/@#R5``/?+`>`.Q(```PH`$`"%0)YWZQ/@#T5``'?K`>`/9(
+M```8H`$`"%0)YWZQ/@#X5``'?K`>`/HL&P``0((`;'_D^W@[_P`!@7P!H'UI
+M`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#``!!@@G(H4$`"%5+B_Z@'@#L?`!;
+M>+`>`.Q50*=^L!X`[E5`OWZP'@#H54#7?K`>`.I52>]^L3X`Y%5*!WZQ7@#F
+M?^3[>#O_``&!?`&@?6D#IG^#XW@XH0`(3H`$(3@```"0`0`,+`,``$&""6!7
+M:0@\?2GR%*`!``A4`,(^L`D`/H@!``FP"0!$?^3[>#O_``&!?`&@?6D#IG^#
+MXW@XH0`(3H`$(3@```"0`0`,+`,``$&""1A7:0@\?2GR%*`!``A4`,(^L`D`
+M2H@!``FP"0!0?^3[>#O_``&!?`&@?6D#IG^#XW@XH0`(3H`$(3@```"0`0`,
+M+`,``$&""-!]._(4H6$`"%5@PCZ8"0!95VD(/'TI\A0Y*0!056L&/K%I``R@
+M"0`,<`L`@$&"`!!H``#_?```^+`)``Q_Y/MX._\``8`<`:!\"0.F?X/C>#BA
+M``A.@`0A.````)`!``PL`P``08((:%=I"#Q]*?(4.2D`8*`!``A4`-X^L`D`
+M`J`!``A4`/\^L`D`"*`!``A4``?^L`D`#J`>```H`#__0($`-"P;``!!@@`0
+M+!L``D&"`!A(```@H`$`"%0`G_ZP'@`F2```$*`!``A4`)_^L!X`**`>```H
+M`#`"0*$`I'_D^W@[_P`!@7P!H'UI`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#
+M``!!@@?$5VD(/'TI\A2@`0`(5`#6?K`)`+8L&P`!08(`($&!`!`L&P``08(`
+M1$@``$PL&P`"08(`($@``$"@`0`(5`D'?K$^`/Q4`.]^L!X!`$@``"B@`0`(
+M5`D'?K$^`/Y4`.]^L!X!`D@``!"@`0`(5``&OK`>`!*@'@``*``P`T"A`+A7
+M:0@\?2GR%*`!``A4`)M^L`D`O'_D^W@[_P`!@7P!H'UI`Z9_@^-X.*$`"$Z`
+M!"$X````D`$`#"P#``!!@@<$5VL(/'UK\A0Y:P"PH2$`"%4I'KB@"P`,?`!+
+M>+`+``PL&P`"0*(`)*$A``A5(.C^F!X`(J`>```H`$`%0($`#%4@JOZP'@`L
+M+!L``$""`$"@'@``*``__T"!`#2@`0`(5`G&OK$^`494`.[^L!X!2D@``!Q7
+M:0@\?2GR%#@```JP"0"\.```#Y@>`"*@'@``*``__T"!`_PL&P`!08(`($&!
+M`!`L&P``08("[$@``^0L&P`"08(`N$@``]A_Y/MX._\``8%\`:!]:0.F?X/C
+M>#BA``A.@`0A.````)`!``PL`P``08(&'*"!``A\G2-X5(0&/G_#\WA+_]4-
+ML'X!5%>]QCY_P_-X?Z3K>$O_U/FP?@%6?^3[>(`<`:!\"0.F?X/C>#BA``A.
+M@`0A.````)`!``PL`P``08(%R*"!``A\GR-X5(0&/G_#\WA+_]2YL'X!6*`>
+M```H`$``0($#-%?@QKZP'@#$2``#*'_D^W@[_P`!@!P!H'P)`Z9_@^-X.*$`
+M"$Z`!"$X````D`$`#"P#``!!@@5LH($`"'R=(WA4A`8^?\/S>$O_U%VP?@%.
+M5[W&/G_#\WA_I.MX2__42;!^`5!_Y/MX._\``8`<`:!\"0.F?X/C>#BA``A.
+M@`0A.````)`!``PL`P``08(%%*`!``A4"09^L3X`$%0`SKZP'@`4?^3[>#O_
+M``&!?`&@?6D#IG^#XW@XH0`(3H`$(3@```"0`0`,+`,``$&"!-2@@0`(?)TC
+M>%2$!CY_P_-X2__3Q;!^`5*@'@``*`!``$"!``Q7H,:^L!X`QG_D^W@[_P`!
+M@!P!H'P)`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#``!!@@1\H`$`"%0)WKZQ
+M/@%(5``&_K`>`4R@'@``*`!``4"A`>Q_Y/MX._\``8%\`:!]:0.F?X/C>#BA
+M``A.@`0A.````)`!``PL`P``08($,(@!``FP'@`JH!X``"@`3_]`H0&LH`$`
+M"%0)QGZQ/@#65`"+_K`>`-I_Y/MX._\``8%\`:!]:0.F?X/C>#BA``A.@`0A
+M.````)`!``PL`P``08(#W*$A``A5*PZ\H!X`VGP`6WBP'@#:52#>OK`>`.)5
+M*:K^F3X`W7_D^WB!?`&@?6D#IG^#XW@XH0`(3H`$(3@```"0`0`,+`,``$&"
+M`Y"@`0`(5`LN-(D^`-U]*5MXF3X`W50`Z/Z8'@#?2``!`*`>```H`$``0*$`
+M]'_D^W@[_P`!@7P!H'UI`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#``!!@@,X
+MH`$`"'P)`WA4``:^L!X`PJ`>```H`$__0*$`K%4@!#Y4"=9^L3X`U%0`FWZP
+M'@#8?^3[>#O_``&!?`&@?6D#IG^#XW@XH0`(3H`$(3@```"0`0`,+`,``$&"
+M`MRA(0`(52L>N*`>`-A\`%MXL!X`V%4@[KZP'@#@52FZ?ID^`-Q_Y/MX@7P!
+MH'UI`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#``!!@@*0H`$`"%0+/C")/@#<
+M?2E;>)D^`-Q4`/A^F!X`WCM[``$L&P`"0('US*`>```H`#`"0:$`?(%\`:!]
+M:0.F?X/C>#B``.PXH0`(3H`$(3@```"0`0`,+`,``$&B`C2@`0`(5`D'?K$^
+M`/Q4`.]^L!X!`(%\`:!]:0.F?X/C>#B``.TXH0`(3H`$(3@```"0`0`,+`,`
+M`$&"`?B@`0`(5`D'?K$^`/Y4`.]^L!X!`C@```2P'@%@.````;`>`5ZP'@%<
+M.````+`>`5J#^@`4.V```*`>`01\&P``0*``7'_D^W@[_P`!@7P!H'UI`Z9_
+M@^-X.*$`"$Z`!"$X````D`$`#"P#``!!@@&(5VD(/'TI\A2@`0`(5`#"/K`)
+M`0:(`0`)L`D!"#M[``*@'@$$?!L``$&`_ZR@'@``*`!0`D"!`(@[8```@7P!
+MH'UI`Z9_@^-X?^3[>#BA``A.@`0A.````)`!``PL`P``08(!)%=I$#I]*?(4
+MH`$`"+`)`XXXGP`%@7P!H'UI`Z9_@^-X.*$`"$Z`!"$X````D`$`#"P#``!!
+M@@#L5VD0.GTI\A2@`0`(L`D#D#O_``$[>P`!+!L`!$"!_X2@'@``*``P`D&!
+M`!@X`/_*L!X`7#@`__^P'@!>L!X`8*`>```H`#`"08$`&#@```^P'@!$.```
+M'+`>`$:P'@!(H!X``"@`/_]`@0`8@7P!H'UI`Z9_@^-X.(``RD@``!2!?`&@
+M?6D#IG^#XW@X@`#/.*$`"$Z`!"$X````D`$`#"P#``!!@@!$H`$`"+`>`!B@
+M'@`6+````$""`"B@'@``*``__T"!`!"@'@`85`"O_D@```R@'@`85`"+_K`>
+M`!8Y8``!D6$`#(!A``R``0`T?`@#IH-!`!B#80`<@X$`((.A`"2#P0`H@^$`
+M+#@A`#!.@``@E"'_X'P(`J:3P0`8D^$`')`!`"1\?QMX?)XC>$O_\0TX````
+M+`,``$&B`%Q_X_MX?\3S>$O_SMDX````+`,``$&B`$1_X_MX?\3S>$O_YHTX
+M````+`,``$&B`"Q_X_MX?\3S>$O_Z>DX````+`,``$&B`!1_X_MX?\3S>$O_
+M['5\8!MX?`,#>(`!`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A__!\"`*FD`$`
+M%*`$```H`#__0($`%*`$`"XL```!0*(`"$O_V1F``0`4?`@#IC@A`!!.@``@
+MH2,``*`$``!\"0``0*(`'*!C``)P8\'PH`0``G``P?!\8!A03H``(*!C``"@
+M!```?&`84$Z``""@8P((<&.__TZ``"`Y8```56`8.'T@&A1\`P`N@2D`!#E`
+M``!\"$MY0((`%#EK``$L"P`!0('_W#E```%]0U-X3H``()0A__!\"`*FD`$`
+M%$O__[$Y8```/2```#DI``!P8(``0:(`-%1C!'X](```.2D``!P+`!1\"0(N
+M.4```7P`&`!!@@`X.6L``2@+`()`@?_D2```)%5@*#1\"0(N.4```7P`&`!!
+M@@`4.6L``2@+`$I`@?_D.4```'U#4WB``0`4?`@#IC@A`!!.@``@E"'_X'P(
+M`J:3X0`<D`$`)'R?(W@Y8``!+`0``$&"`(!+__\15&`$7G_K`G@A*P``?6E9
+M%'!J@`!`@@!D:&D!_R%I``!]*TD4(4,``'P*&10Y8``!?2H#>4""`$0Y0```
+M/2```#DI```<"@`4?6!*%'P)`BY\`/@`0*(`%*`+``(Y8``!?``8`$&"`!0Y
+M2@`!*`H`@D"!_]0Y8```?6-;>(`!`"1\"`.F@^$`'#@A`"!.@``@E"'_X'P(
+M`J:3H0`4D\$`&)/A`!R0`0`D?)XC>'R]*WB!(P&<?2D#IDZ`!"%\?QMX<&``
+M0D&"`!B`'@`(+````$""``PX`/^]?'\`.'/@`"!!@@`4@!X`#"P```!`@@`(
+M5_\&\G/@``A!@@`4@!X`!"P```!`@@`(5_\'=G/@``%!H@`8.'T`($O__@$L
+M`P``08(`"%?_`#Q_X_MX@`$`)'P(`Z:#H0`4@\$`&(/A`!PX(0`@3H``()0A
+M_V!\"`*FDZ$`E)/!`)B3X0"<D`$`I'Q^&W@[H```?(,C>$@``-U\?QMX+`,`
+M`$&"`#A_P_-X?^3[>#B@``!@I?]_.,$`"$@``CTL`P``0:(`&'_#\WA_Y/MX
+M.*$`"$O__NE\?1MX?Z/K>(`!`*1\"`.F@Z$`E(/!`)B#X0"<."$`H$Z``""4
+M(?_@?`@"II/A`!R0`0`D?'\;>$O__2DL`P`208(`+$&!`!`L`P``08(`*$@`
+M`#0L`P'_08(`'#@```!@`(-*?`,``$"B`!PX8``!2```&*`?`@HX8``!+``#
+M2D&"``@X8```@`$`)'P(`Z:#X0`<."$`($Z``"!\:!MX.6```#T@```Y20``
+M'`L`%'T@4A1\"@(N?2-+>'P`0`!-@@`@.6L``3A@```H"P""38$`($O__]B4
+M(?_@?`@"II.A`!23X0`<D`$`)$O__'5\?QMX<&"``$&B`!A4?01^?Z/K>$O_
+M_YDL`P``0*(`2#E@```](```.2D``%5@*#1]0$H4?`D"+GP`^`!`H@`8H`H`
+M&'P=`W@L````0((`&#E@`$LY:P`!*`L`2D"!_]`[H```?Z/K>(`!`"1\"`.F
+M@Z$`%(/A`!PX(0`@3H``()0A__!\"`*FD`$`%'R*(W@Y8```/2```#DI```O
+MA```56`X,'R`2A1\"0(N?``8`$"B`!Q!O@`0?4-3>#B@`(!(```!.&```4@`
+M`!0Y:P`!*`L`,$"!_\PX8```@`$`%'P(`Z8X(0`03H``('QJ&W@X8```+`H`
+M`$V"`"`Y8```/2```#DI``!58"@T?`D"+CA@``%\`%``38(`(#EK``$X8```
+M*`L`2DV!`"!+___<E"'_P'P(`J:2X0`<DP$`(),A`"2300`HDV$`+).!`#"3
+MH0`TD\$`.)/A`#R0`0!$?'@;>'R;(WA\NBMX?-DS>#N@```[P```.X```#K@
+M``"@!```+````$""`#Q+__KE?'\;>'!@@`!`@@`L.(```$O__N$L`P``0*(`
+M%'_C^WA+__\]+`,``$&"``Q_Z/MX2```"*$;``)Q`/\`0((!4#E@```X8```
+M/2```#E)``!58"@T?2!2%'P*`BY\`$``0*(`#'T\2W@X8``!.6L``2`+`$HX
+M````?``!%"#C``!])QD4?`=(.4""_\@X````+`,``$&"`6!S20"`0((`$*$<
+M``*#W``(.Z```'-*`(!!@@`0H1P`!(/<``P[H```.6```#A@```](```..D`
+M`!P+`"1]0#H4?`<"+GP`0`!`H@`<@!@!V($J``1\`$@`0*(`#'U74W@X8``!
+M.6L``2`+``$X````?``!%"%#``!]*AD4?`I(.4""_[@L`P``08(`;'-+`(!`
+M@@`P@5<`"#D@``!_JT@X?\Q0.'U]6WA]GF-X@5<`#'^K2WA_S%-X?7U;>'V>
+M8WAS0`"`08(`,(%7`!`Y(```?ZM(.'_,4#A]?5MX?9YC>(%7`!1_JTMX?\Q3
+M>'U]6WA]GF-X?0-#>'\DRWA+__U=.````"P#``!!@@!4@/D`$(%\`!"!&0`4
+M@!P`%'SI6#A]"@`XD3D`$)%9`!2@&P`"<`?_`'T@`"95*1_^?ZKS>7P``"94
+M`!_^(````7TK`#E!@@`(D]D`&#@```%\`P-X@`$`1'P(`Z:"X0`<@P$`((,A
+M`"2#00`H@V$`+(.!`#"#H0`T@\$`.(/A`#PX(0!`3H``()0A_^!\"`*FDX$`
+M$).A`!20`0`D?)PC>'Q]-G!_O0&45Z`P,GR@&%`X8```.(```4@```%7O1@X
+M?3WB%'P=X"Z!:0`$?&D`.'R*6#A]*5-X,`G__WQ@21"``0`D?`@#IH.!`!"#
+MH0`4."$`($Z``"`L!@``38(`(#D@``!\"2!`0(``)'P#2*Y\`#``38(`("P`
+M``!!@@`0.2D``7P)($!!@/_D?`D@`$V"`"!\PTFN@24``#DI``&1)0``3H``
+M()0A_D!\"`*FD<$!>)'A`7R2`0&`DB$!A))!`8B280&,DH$!D)*A`922P0&8
+MDN$!G),!`:"3(0&DDT$!J)-A`:R3@0&PDZ$!M)/!`;B3X0&\D`$!Q'Q_&WA\
+MFR-X?+HK>'S5,WA\]SMX?19#>'TX2WA]75-X@B$!T*,A`<HZ0!M8.X,",#O`
+M``!+__>Q.(```"P#``!!H@7H?^/[>$O_^M&P?P(*H!\""BP```!`@@`D?^/[
+M>'^DZWA+__@-.(```"P#``!!@@6X5Z`$OK`?`@I_X_MX2``,/:!_`@I+__I5
+M?'T;>#B````L`P``08(%D'_C^WA_I.MX.*```&"E_W\XP0`(2__[L3B````L
+M`P``0:(%;'_C^WA_I.MX.*``@#C!`(A+__N1.(```"P#``!!@@5,.2```(`!
+M`!1P"@`%?2!3>4&"``@[P``!.2```(`!`!14"@>\?2M3>4&"``@[P``"@!\"
+M#'P>``!!@@`(D]\"#'_C^WA_I.MX.*$`"$O_]_E\;QMX@`$!S"P```!`@@`(
+MHET`$#I@```H&@!`0($`"#M``$"`'P'@5`FW_I$A`5A4`+_^D`$!5#T@```[
+MR0``/2```#DI`!A\'DA`0(`#T*`>``!_*P`Y0:(#L%0`!#Y\"7@Y0:(#I*">
+M``*!?P&8?6D#IG_C^W@XH0$*.,$!"$Z`!"$L`P``0:(#@*`>```L```$08(`
+MA$&!`!@L```!08(`6"P```)!@@`L2``#7"P``"!!@@"L08$`$"P```A!@@!\
+M2``#1"P``$!!@@"T2``#.#DA``B1(0%<.<$`.#T@```Y*0``D2$!8(@!``I@
+M```#2```K#EA``B180%<.<$`*#T@```Y*0``D2$!8(@!``I(``",.2$`B)$A
+M`5PYP0#8/2```#DI``"1(0%@B`$`BF````%(``!H.6$`B)%A`5PYP0#H/2``
+M`#DI``"1(0%@B`$`BF````)(``!$.2$`B)$A`5PYP0#X/2```#DI``"1(0%@
+MB`$`BD@``"`Y80`(D6$!7#G!`$@](```.2D``)$A`6"(`0`*8```!)`!`5!]
+MPW-X2__TU2P#``!`H@)8.@```'X#@WA]Q'-X2__[_2P#``!!H@(T5ATH-($A
+M`6!^B>H4B-0`&'[CNWA^Q+-X?P7#>$O__$6``0%@?[T"+J`4``)\`.A`08`"
+M`*`!`0I\`.A`0:$!W*`!`0A\`.A`08`!T(DT``9I(``*(6```'P+`12!80%8
+M?`M8>4"B`;1I(``%(6```'P+`12!(0%4?`E(>4"B`9R(%``'?!T"%'P`#G!\
+M``&4.3(`"GP`2`!!H0&`?!/00$"``;`Y(```@!0`$"P```!`H``(.2```2%Q
+M``!\"XD4?2L`.4"B`52!(0%<@`D`&'`+`(!!@@`0@!\!W"P```9!@@$X.&$!
+M$#B``$!(```!LZ$!$*`>``*P`0$2B!0`!BP```5!@@`8+```"D"B`""@`0$2
+M8`!``$@``!"@`0$29`#__V``@`"P`0$2B!0`!)@!`16(%``%F`$!*H$A`5R`
+M"0`8D`$!+(%A`5"180$P@/0`$(%I`!"!%``4@`D`%'SI6#A]"@`X?2!3>4&"
+M`!"@`0$28``"`$@```R@`0$25``%ZK`!`1*`]``(@2$!7(%I``B!%``,@`D`
+M#'SI6#A]"@`X.````GTK4WE`@@`(.````)@!`12!(0%<@10`#(`)``Q]"@`X
+M.2```%5*![Q]*U-Y08(`$(@!`11@```(F`$!%($A`5R`"0`8<`L`0$&"`!"(
+M`0$48```!)@!`1168S`R?&/B%#IS``$X@0$0.*``0$@```&(%``'?!T"%%0=
+M!#Z@%``"?`#H0$"`_@@Z$``!+!``?T"!_;0[W@`$/2```#DI`!A\'DA`08#\
+M."P3``!!@@#$*!,`0$"!``@Z8`!`?X/C>'YDFW@XH`!`/,```#C&``!(``.%
+MDG\2,#D```!\")@`0(``0%4*&#A]:MH450`P,GT@XA1\'`(N?`K;+J`)``*P
+M"P`"B`D`!)@+``2("0`%F`L`!3D(``%\")@`08#_R(`?`;Q\"0.F?^/[>']D
+MVWA^99MX3H`$(3D```!\")@`0(``,%4+,#)]:^(450D8.'TIVA2("0`&F`L`
+M!H@)``>8"P`'.0@``7P(F`!!@/_8DG4``*`?`@JP'P`8,!/__WR`F1!\@R-X
+M@`$!Q'P(`Z:!P0%X@>$!?((!`8""(0&$@D$!B()A`8R"@0&0@J$!E(+!`9B"
+MX0&<@P$!H(,A`:2#00&H@V$!K(.!`;"#H0&T@\$!N(/A`;PX(0'`3H``(*$$
+M``)Q",'P@6,2-"P+``!!@@!`H`L``*$D``!\`$@`0*(`,*$K``)Q(,'P?`!`
+M`$"B`""("P`$<`H``4&"`&0X8```<2```DR"`"!(``!4.2,",(!C$C`L`P``
+M08(`<*"$``!48"@R?6D"%'P)`BY\`"!10((`0*%+``)Q0,'P?`!``$"B`"2(
+M"P`$<`D``4&"`!`X8```<4```DR"`"!]8UMX3H``(*`+``)P`,'P?`!`4"P`
+M``!`@0`,.2L`0#AC__]\8PYQ0(+_G#A@``!.@``@E"'_X'P(`J:3X0`<D`$`
+M)'R_*WA(```!.````"P#``!!@@`HB`,`&GP`!W14``@\?`#X4#A@``!\``=U
+M08``"'P#`WA\8!MX?`,#>(`!`"1\"`.F@^$`'#@A`"!.@``@E"'_X'P(`J:3
+MH0`4D\$`&)/A`!R0`0`D?'\;>'R=(W@[P`#_H`,""BP```!`@@"`2__ON51C
+M!C8L`P!@08(`%'_C^WA+_^^E+`,!F4"B`&"@'0`"<```H#O``.$L``"@08(`
+MB*`=``)P``#0.\``XBP``,!!@@!TH!T``G```-`[P`#D+```T$&"`&"@'0`"
+M<``!4&@>`5!_W@#0?][^<%?>!_H[W@#C2```0'_C^WA_I.MX2````2P#``!!
+M@@`L@\,`(*`=``)4``8R+```P$"B`!A7P`<^+````4"B``Q7W@`V8]X``G_#
+M\WB``0`D?`@#IH.A`!2#P0`8@^$`'#@A`"!.@``@E"'_\'P(`J:0`0`42```
+M`3@````L`P``08(`#(`#`!Q4`/?^?`,#>(`!`!1\"`.F."$`$$Z``""4(?_0
+M?`@"II,A`!2300`8DV$`').!`""3H0`DD\$`*)/A`"R0`0`T?+TK>'S9,WA\
+M>QMX?X,J%#=$__]!@@!H?Y[C>'P<V$!`H0!0?_WP4'_C^WA_Q/-X?R@#IDZ`
+M`"$L`P``0($`-'_+\WA_J0.FB3\``(@+``"8'P``._\``9DK```Y:P`!0@#_
+MZ'_=\%!\'MA`08'_N'^<ZA0W6O__0(+_H(`!`#1\"`.F@R$`%(-!`!B#80`<
+M@X$`((.A`"2#P0`H@^$`+#@A`#!.@``@E"'_X'P(`J:3P0`8D^$`')`!`"1\
+M?QMX@`,!H'P)`Z8X@`#!.*$`"DZ`!"$X````+`,``$&"`&2@@0`*((0__WR$
+M(1!\A".X<(0`!3B$`,J`'P&@?`D#IG_C^W@XH0`(3H`$(3@````L`P``08(`
+M+*`!``HH`#__0($`$*`!``A4`*_^2```#*@!``A4``_^D!\2/(`?$CQ\`P-X
+M@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3X0`<D`$`)'Q_&WA+
+M_^T1+`,`2$&"`(A!@0`H+`,`04&!`!@L`P!`0(``="P#``!!@@!02```="P#
+M`$-(``!<.````&``@8U\`P``08$`)#@```!@`(&(?`,``$"``$`X`_^V*```
+M`D&!`$!(```P.````&``@8]\`P``2```'*`?`@HL``&(08``("P``8U`@0`,
+M+``!CT"B`!!_X_MX2__^I4@```@X8```@`$`)'P(`Z:#X0`<."$`($Z``""4
+M(?_@?`@"II.A`!23P0`8D^$`')`!`"1\?1MX?)\C>'Q^&WB``P&@?`D#ICB`
+M`,$XH0`(3H`$(2P#``!!@@!D.6```#T@```Y20``'`L`!GT@4A1\"@(N?`#X
+M`$"B`#B@`0`(*`!0`D&!``R@"0`"2```$!TK``9]*5(4H`D`!+`>`@A_H^MX
+M2__O3;!^`@I(```0.6L``2@+``U`@?^P@`$`)'P(`Z:#H0`4@\$`&(/A`!PX
+M(0`@3H``()0A_^!\"`*FDZ$`%)/!`!B3X0`<D`$`)'Q]&WA\GR-X?'X;>(`#
+M`:!\"0.F.(``P3BA``A.@`0A+`,``$&"`&0Y8```/2```#E)```<"P`&?2!2
+M%'P*`BY\`/@`0*(`.*`!``@H`%`"08$`#*`)``)(```0'2L`!GTI4A2@"0`$
+ML!X""'^CZWA+_^Z1L'X""D@``!`Y:P`!*`L`!D"!_["``0`D?`@#IH.A`!2#
+MP0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3P0`8D^$`')`!`"1\?QMX2__]J2P#
+M``!!@@`T@!\!Y'`)``%!@@`HH)\"""P$``!!@@`0?^/[>$O__DE(```0H)\"
+M"G_C^WA+__[U@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_4'P(`J:3`0"0
+MDR$`E)-!`)B380"<DX$`H).A`*23P0"HD^$`K)`!`+1\>1MX?)XC>'R\*WA\
+MVS-X?/@[>#A@%`A(```!?'\;>#M```(L`P``08(%1'Q]&W@\@```.(0``#B@
+M$G!(```!D]\`#).?`!"3?P`4LS\!R#@```"P'P'*.```/+`?`?PY(```D3\"
+M`#@```.0'Q,TD3\3]#@`!P"0'Q/X.`#__Y`?$_R0'Q0`D!\4!'_C^W@X@```
+M2````3M```,L`P``08($S#@```&0'P',?^/[>#B`0"!(```!5&,&/K!_`=!_
+MX_MX.(```&"$F!A(```!L'\!TC@```"P'P'6?^/[>#B```!@A)C0.*`<%D@`
+M``$[P```?Z/K>#B```!@A)B`/*```4@```$[W@`!*!X``T"!_^1_H^MX.(``
+M`&"$G`!(```!5&,G/CB```1(```!.&,``;!]`=1_H^MX.(!`$$@```%\?!MX
+M8&4``7^CZW@X@$`02````7^CZW@X@``].*$`B$@```$[0``(+`,``$&"`^R@
+M`0"(.T``!"P`6J5`H@/<?Z/K>#B``#\XH0"(2````3M```@L`P``08(#P*`!
+M`(BP'Q)R?Z/K>#B``,$XH0"(2````3M```@L`P``08(#G*`!`(A4`*,^L!\2
+M<*`?$G`[0``%+````4""`X`[8```.\```#M!``@XG@#`5\4(/'RZ*A1_H^MX
+M2````2P#``!!@@-45\`(/'P:`BY_>P)X.]X``2@>`#]`@?_0.````&``__\[
+M0``'?!L``$"B`RQ_H^MX.(``OSBA`(A(```!.T``""P#``!!@@,0B`$`B;`=
+M`@B@`0`,L!\2=*`!``ZP'Q)VB`$`$9@?$GB@`0`05`#"/I@?$GF(`0`3F!\2
+M>Z`!`!)4`,(^F!\2>J`!`!14`,(^F!\2?H@!`!68'Q)_H`$`%E0`PCZ8'Q*`
+MB`$`%Y@?$H&(`0`95``'_I@?$GR@`0`85`#_?I@?$GT](```.2D``)$]`<`[
+MP```..``"3C!``@=/@`=?3]*%#D)$H)4Z@@\?6HR%'P*,BY4`+*^F`D2@GP*
+M,BY4`.:^F`@`"WTJ,BY5*1:ZH`L``E0`D[Y]*0-XF2@``:`+``)4`,:^F`@`
+M#*`+``)4`/:^F`@``J$K``)5*2:VH`L`!%0`HSY]*0-XF2@`#:`+``14`-:^
+MF`@``X@+``54``:^F`@`#J`+``94`+*^F`@`!*`+``94`.:^F`@`#Z$K``95
+M*1:ZH`L`"%0`D[Y]*0-XF2@`!:`+``A4`,:^F`@`$*`+``A4`/:^F`@`!J$K
+M``A5*2:VH`L`"E0`HSY]*0-XF2@`$:`+``I4`-:^F`@`!X@+``M4``:^F`@`
+M$J`+``Q4`+*^F`@`"*`+``Q4`.:^F`@`$Z$K``Q5*1:ZH`L`#E0`D[Y]*0-X
+MF2@`":`+``Y4`,:^F`@`%*`+``Y4`/:^F`@`"J$K``Y5*2:VH`L`$%0`HSY]
+M*0-XF2@`%:`+`!!4`-:^F`@`%H@+`!%4``:^F`@`%Z`+`!)4`+*^F`@`&*`+
+M`!)4`.:^F`@`&:$K`!)5*1:ZH`L`%%0`D[Y]*0-XF2@`&J`+`!14`,:^F`@`
+M&Z`+`!14`/:^F`@`'#O>``$XYP`+*!X`!$"!_C!_H^MX2``!23M@```[P```
+M()X`'W^CZW@XH0"(2````2P#``!!@@!PH`$`B'][`A17R0@\?2GZ%%0`PCZ8
+M"1,3B`$`B9@)$Q0[W@`!*!X``D"!_\`@&P``?2#9%#U@``)A:__]?V!:>"%@
+M``!\"P$4.T``"7TK`WE`@@`H?Z/K>#B`0!!_A>-X2````7^CZWA(``!`.T``
+M"$@``!@[0``(?Z/K>#B`0!!_A>-X2````2P?``!!@@`,?^/[>$@```$L&```
+M08(`")-8```X8```@`$`M'P(`Z:#`0"0@R$`E(-!`)B#80"<@X$`H(.A`*2#
+MP0"H@^$`K#@A`+!.@``@E"'_\'P(`J:0`0`42````8`!`!1\"`.F."$`$$Z`
+M`"`X8```<(`!`$V"`"`X`!0`L`4``#@`%3:P!@``.&```4Z``"`X8``!3H``
+M(#DC`>"`"0`$8````9`)``0X`!0`L`D`##@`%3:P"0`.@`,!X&0`0`!4``1>
+MD`,!X#@```.P"0`(.```0+`)``J``P'@5`L%Z)%C`>"(`Q)\+````$&"`!PX
+M````L`,22#@```&0`Q),86`!`)`#`>`X```/D`D`%#@```&0`Q)H.&```4Z`
+M`""4(?_@?`@"II.!`!"3H0`4D`$`)'Q\&WA\G2-X.(```&"$@"R`O0`$2```
+M`7^#XW@X@```8(2`,("]``Q(```!?X/C>#B```!@A(`T@+T`$$@```%_@^-X
+M.(```&"$@#B`O0`(2````7^#XW@X@```8(2`)("]``!(```!@`$`)'P(`Z:#
+M@0`0@Z$`%#@A`"!.@``@E"'_T'P(`J:0`0`TD($`#(`#`=PL```!08(`-#T@
+M``"`"0``?``@4%0`&#B0`0`4/2```(`)``!\`"!05``8.)`!`!B0@0`02```
+M&#@`__^0`0`4D`$`&#@```&0`0`0/``!@&``__]\H``XD`$`"#B!``A(```!
+M@`$`-'P(`Z8X(0`P3H``()0A_^!\"`*FDZ$`%)`!`"1\?1MX.(```&"$@"PX
+MH```2````7^CZW@X@```8(2`!$@```%D90`0/`#_7V``__]\I0`X?Z/K>#B`
+M``!@A(`$2````7^CZW@X@```8(2`)#B@``!@I?__2````8`!`"1\"`.F@Z$`
+M%#@A`"!.@``@E"'_X'P(`J:3H0`4D\$`&)/A`!R0`0`D?'X;>'R?(WA\?1MX
+MH`0`$BP```!!@@!H.(```&"$@`1(```!5&4"3F2E`"!_P_-X.(```&"$@`1(
+M```!H+\`$'_#\W@X@```8(2`*$@```&@OP`2?\/S>#B```!@A(!(2````8"_
+M`!14I1@X?\/S>#B```!@A(`T2```*#B```!@A(`$2````3P`_U]@`/__?&4`
+M.'_#\W@X@```8(2`!$@```%_P_-X.(```&"$@"R`OP``2````7_#\W@X@```
+M8(2`)$@```%48P`0H!\`"GQE`WBA/P`8+`D``$&"`!`X"0`$5`""7GRE`WA_
+MP_-X.(```&"$@"1(```!H!X!T"@```-`@0!`H)\`&G"```=!@@`T@!T3^%0)
+M!BA4@$5N?24#>"@$``=`@0`(824'`)"]$_A_P_-X.(```&"$@!A(```!@`$`
+M)'P(`Z:#H0`4@\$`&(/A`!PX(0`@3H``()0A__!\"`*FD`$`%#B`0`A(```!
+M,2/__WP)&1!\`P-X@`$`%'P(`Z8X(0`03H``()0A_^!\"`*FDZ$`%)/!`!B3
+MX0`<D`$`)'Q]&WA\GR-X.(``'$@```$L`___0*(`%#@```"0'P``.&```$@`
+M`'"!/1,<?&E(.#P``05@`-BZ?2D`.)$_```\``!P8```('QK`#E!@@`,92!`
+M`)`?``!P8``%08(`$(`?``!@```!D!\``'!I!<!!@@`0@!\``&```$"0'P``
+M@!\``'0+0`!!@@`(D'T24#A@``&``0`D?`@#IH.A`!2#P0`8@^$`'#@A`"!.
+M@``@@&,3'$Z``""4(?_@?`@"II.!`!"3H0`4D\$`&)/A`!R0`0`D?'T;>'R?
+M(WA\?AMX@X,3'"P<``!`H``0.(``)#B@``!(```!/``!!6``V+I_Y0`X<^``
+M`4&"``A@I0`%<^``0$&"`$2`'A,@+````$&"``A@I0!`@!X3)"P```!!@@`(
+M8*4!`(`>$R@L````08(`"&"E`("`'A,L+````$&"``A@I00`?Z/K>#B``"!(
+M```!D_X3'"P?``!`H``4?Z/K>#B``"0XH``!2````7^#XWB``0`D?`@#IH.!
+M`!"#H0`4@\$`&(/A`!PX(0`@3H``(#A@`$!.@``@E"'_\'P(`J:0`0`4*`0`
+M/T&A`"!4A"@T/(0``3B$D!Q(```!.````7!I@`!`@@`(.````'P#`WB``0`4
+M?`@#IC@A`!!.@``@E"'_X'P(`J:3H0`4D^$`')`!`"1\?QMX.````"@$`#]!
+MH0"05)TH-#^]``$XG9``.*```$@```$XG9`$?^/[>#B@``!(```!.)V0"'_C
+M^W@XH```2````3B=D`Q_X_MX.*```$@```$XG9`0?^/[>#B@``!(```!.)V0
+M%'_C^W@XH```2````3B=D!A_X_MX.*```$@```$[O9`<?^/[>'^DZW@XH```
+M2````3@```%\`P-X@`$`)'P(`Z:#H0`4@^$`'#@A`"!.@``@E"'_X'P(`J:3
+MH0`4D\$`&)/A`!R0`0`D?'X;>#A@```H!``_08$`C#O@```Y(```+`4``$&"
+M`$R+Y0`%5_]`+H@%``1__P-XB24``U4IP`Z(!0`"5`"`'GTI`WB(!0`!5`!`
+M+GTI`WB(!0``?2D#>%4I^'Y7X/@`?2D#>%?_^'Y4G2@T/[T``3B=D!A_P_-X
+M?25+>$@```$[O9`<8^6``'_#\WA_I.MX2````3A@``&``0`D?`@#IH.A`!2#
+MP0`8@^$`'#@A`"!.@``@E"'_P'P(`J:2X0`<DP$`(),A`"2300`HDV$`+).!
+M`#"3H0`TD\$`.)/A`#R0`0!$?'P;>'R;(WA\V#-X,6?__WUK61`\`%558`!5
+M5GUK`#@]*ZJK.6FJJCA@```H!``_08$!B(@%```X8```+````$""`7B@!0`"
+M.&```"@```1`@0%HH`4``CK@```H```%0($`&*`%``(BX``-?O>Y$%;W![PZ
+M]P`!B44`!(@%``54`$`N?4H#>(@%``94`(`>?4H#>(@%``=4`,`.?4H#>'U*
+M6GB(!0`)5`!`+HDE``A\&4MX?SE:>%<Y!#Z+Q0`*B`4`"U0`0"Y_W@-XB`4`
+M#%0`@!Y_W@-XB`4`#50`P`Y_W@-X?]Y:>(@%``]4`$`NB24`#GP:2WA_6EIX
+M5UH$/HOE`!"(!0`15`!`+G__`WB(!0`25`"`'G__`WB(!0`35`#`#G__`WA_
+M_UIXH`4``B@```U!@0`(5_\&/E=]*#0_O0`!.)V0`'^#XWA]15-X2````3B=
+MD`1_@^-X?R7+>$@```$XG9`(?X/C>'_%\WA(```!.)V0#'^#XWA_1=-X2```
+M`3B=D!!_@^-X?^7[>$@```$[O9`4?X/C>'^DZWA^Y;MX2````7^#XWA_9-MX
+M?P7#>$@```&``0!$?`@#IH+A`!R#`0`@@R$`)(-!`"B#80`L@X$`,(.A`#2#
+MP0`X@^$`/#@A`$!.@``@E"'_\'P(`J:0`0`4.2,3$WR#(WA])$MX.*``!D@`
+M``&``0`4?`@#IC@A`!!.@``@E"'_\'P(`J:0`0`4.&,3$SB@``9(```!.&``
+M`8`!`!1\"`.F."$`$$Z``""4(?_P?`@"II`!`!1\@R-X/(```#B$```XH``&
+M2````8`!`!1\"`.F."$`$$Z``"`X8```3H``()0A_^!\"`*FD\$`&)/A`!R0
+M`0`D?'\;>'R^*WA4A!`Z.(1@`$@```%_X_MX.(!L`#B@``,XP``"2````3@`
+M```L`P``0:(`&'_C^W@X@&@`2````;!^```X```!?`,#>(`!`"1\"`.F@\$`
+M&(/A`!PX(0`@3H``('QI&WB@`P((.&``#'P`(`!!@@`@H`D2<G`)`(!\8``F
+M5&,?_GQC`-!48P`X.&,`"RP%``!!@@`(D&4``#A@``!.@``@.&```4Z``""4
+M(?_0?`@"II-A`!R3@0`@DZ$`))`!`#1\>QMXHZ,22%>\]WY7O?_^?X3C>$@`
+M``%\9>IX(`4``'R@*11_8]MX?X3C>$@```&``0`T?`@#IH-A`!R#@0`@@Z$`
+M)#@A`#!.@``@E"'_X'P(`J:3@0`0DZ$`%)`!`"1\?!MX?)TC>#B`0!1(```!
+M5[T(/#B@``-\I>@P?&4H>#@```)\`.@P?*4#>'^#XW@X@$`42````3A@``&`
+M`0`D?`@#IH.!`!"#H0`4."$`($Z``""4(?_@?`@"II.!`!"3H0`4D`$`)'Q\
+M&WA\G2-X.(!`%$@```%7O0@\.*```WREZ#!\92AX?X/C>#B`0!1(```!.&``
+M`8`!`"1\"`.F@X$`$(.A`!0X(0`@3H``()0A_]!\"`*FDV$`').!`""3H0`D
+MD`$`-'Q[&WA\G"-X?+TK>#B`0!A(```!.`#__EP`X#Y\90`X5[T'_G^]X#!\
+MI>MX?V/;>#B`0!A(```!.&```8`!`#1\"`.F@V$`'(.!`""#H0`D."$`,$Z`
+M`""4(?_@?`@"II/A`!R0`0`D?)\C>#@`__\H!``%08$`&#B`0!Q(```!<&,`
+M+WQC_#!48`?^?`,#>(`!`"1\"`.F@^$`'#@A`"!.@``@E"'_X'P(`J:3@0`0
+MDZ$`%)/A`!R0`0`D?'\;>'R=(WA\O"MX.(!`%$@```%7J6`F5[T(/#@```-\
+M`.@P?2``^%0`!%Q\90`X?*5+>&"E@``L'```08(`"&2E``%_X_MX.(!`%$@`
+M``&`GQ,<9(0!`'_C^WA(```!@`$`)'P(`Z:#@0`0@Z$`%(/A`!PX(0`@3H``
+M()0A_^!\"`*FD\$`&)/A`!R0`0`D?'X;>'R?(W@X@$`02````51E!O`L'P``
+M08(`'%1E!O)@I0!`+!\`!$&"``Q@90`@5*4&L'_#\W@X@$`02````8`!`"1\
+M"`.F@\$`&(/A`!PX(0`@3H``()0A__!\"`*FD`$`%#B```!@A(`$2````71@
+M`(!\8``F5&,?_B!C``*``0`4?`@#IC@A`!!.@``@E"'_X'P(`J:3P0`8D^$`
+M')`!`"1\?AMX?)\C>#B```!@A(`$2````71@`(!!@@`,+!\``D@```@L'P`!
+M08(`&&1E`(!_P_-X.(```&"$@`1(```!@`$`)'P(`Z:#P0`8@^$`'#@A`"!.
+M@``@.&```$Z``"`@!```?(`A%'R#(WA.@``@E"'_X'P(`J:3H0`4D^$`')`!
+M`"1\?QMX?+TK>#AC$S@XH``&2````8B_$SB('Q,Y5`!`+GRE`WB('Q,Z5`"`
+M'GRE`WB('Q,[5`#`#GRE`WA_X_MX.(```&"$@`A(```!B+\3/52E0"Z('Q,\
+M?*4#>%>@@)Y\I0-X?^/[>#B```!@A(`,2````2P=``!`@@`<?^/[>#B```!@
+MA(`$2````61E`!!(```8?^/[>#B```!@A(`$2````51E`Q1_X_MX.(```&"$
+M@`1(```!@`$`)'P(`Z:#H0`4@^$`'#@A`"!.@``@E"'_T'P(`J:380`<DX$`
+M().A`"20`0`T?'P;>#B```!@A(!L2````7Q[&WA_@^-X.(```&"$@'!(```!
+M?'T;>'^#XW@X@```8(2`;$@```%\&Q@0?``!$'P`Z!`Y0```?&0;>#A@``!\
+M"QMX?4PC>'UC6WA]A&-X@`$`-'P(`Z:#80`<@X$`((.A`"0X(0`P3H``()0A
+M__!\"`*FD`$`%#B```!@A(!L2````8`!`!1\"`.F."$`$$Z``""4(?_@?`@"
+MII.A`!20`0`D?'T;>#B```!@A(`D2````61E`0!_H^MX.(```&"$@"1(```!
+M@`$`)'P(`Z:#H0`4."$`($Z``""4(?_@?`@"II.A`!23P0`8D^$`')`!`"1\
+M?AMX.(```&"$F&1(```!5']M_G/@`0!!@@`,:_\!_W__^/A_P_-X.(```&"$
+M@'!(```!?'T;>'_#\W@X@```8(2`;$@```%_O1IX?[WZ>'^CZWB``0`D?`@#
+MIH.A`!2#P0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3H0`4D`$`)*.C`=`X@$`@
+M2````51C!CY_O1IX(!T``'^@Z11_H^MX@`$`)'P(`Z:#H0`4."$`($Z``""4
+M(?_@?`@"II.!`!"3H0`4D`$`)'Q\&WA\G2-X.(```&"$@)A(```!@!T``'QC
+M`A20?0``?X/C>#B```!@A("42````8`=``1\8P(4D'T`!'^#XW@X@```8(2`
+MG$@```&`'0`,?&,"%)!]``Q_@^-X.(```&"$@)!(```!@!T`"'QC`A20?0`(
+M?X/C>#B```!@A("@2````8`=`!!\8P(4D'T`$(`!`"1\"`.F@X$`$(.A`!0X
+M(0`@3H``()0A_^!\"`*FDZ$`%)/!`!B3X0`<D`$`)'Q_&WA\GB-X?'T;>"@$
+M``A`H0`8.(```&"$__](```!?!X80$"!`!0X`/__D!T3_#A@``!(```L?^/[
+M>'_$\WA(```!?&4;>'_C^W@X@```8(2`$$@```&3WQ/\.&```8`!`"1\"`.F
+M@Z$`%(/!`!B#X0`<."$`($Z``""4(?_@?`@"II.A`!20`0`D?'T;>#B```!@
+MA(`02````51D!#Y_H^MX2````8`!`"1\"`.F@Z$`%#@A`"!.@``@E"'_X'P(
+M`J:3@0`0DZ$`%)/!`!B3X0`<D`$`)'Q_&WA\GB-X.(`?_T@```%\'AA`0($`
+M%#@`__^0'Q0`.&```$@``$A_X_MX.(```&"$@!1(```!5'T`)'_C^WA_Q/-X
+M2````51C!/Y_O1MX?^/[>#B```!@A(`4?Z7K>$@```&3WQ0`.&```8`!`"1\
+M"`.F@X$`$(.A`!2#P0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3H0`4D`$`)'Q]
+M&W@X@```8(2`%$@```%49`3^?Z/K>$@```&``0`D?`@#IH.A`!0X(0`@3H``
+M((AC$_1H8P`!5&,'_DZ``""4(?_@?`@"II/!`!B3X0`<D`$`)'Q_&WA\?AMX
+M+`0``$&"`#`X@```8(2`!$@```%490(,?^/[>#B```!@A(`$2````8`?$_14
+M``(,2```+#B```!@A(`$2````61E`0!_X_MX.(```&"$@`1(```!@!\3]&0`
+M`0"0'A/T.&```8`!`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A_^!\"`*FDX$`
+M$).A`!23P0`8D^$`')`!`"1\?QMX?)XC>#B`'_](```!?!X80$"!`!0X`/__
+MD!\4!#A@``!(``!(?^/[>#B```!@A(`42````51]!`1_X_MX?\3S>$@```%4
+M8X#>?[T;>'_C^W@X@```8(2`%'^EZWA(```!D]\4!#A@``&``0`D?`@#IH.!
+M`!"#H0`4@\$`&(/A`!PX(0`@3H``()0A_^!\"`*FDZ$`%)`!`"1\?1MX.(``
+M`&"$@!1(```!5&2$_G^CZWA(```!@`$`)'P(`Z:#H0`4."$`($Z``"`X8``!
+M3H``($Z``"`X8```3H``($Z``"!.@``@E"'_\'P(`J:0`0`4?&`;>#$E__]]
+M*4D052D'MCAI``TL!``!08(`#'P#`WA(```!@`$`%'P(`Z8X(0`03H``()0A
+M__!\"`*FD`$`%'QI&W@L!``+08(`%#A@```L!``>08(`+$@``"!4Q0=\D*,!
+M^#B```!@A(!H2````3A@``%(```,?2-+>$@```&``0`4?`@#IC@A`!!.@``@
+ME"'_\'P(`J:0`0`42````8`!`!1\"`.F."$`$$Z``""4(?_@?`@"II.A`!23
+MX0`<D`$`)'Q_&WA\G2-X.(```&"$@`1(```!9&4`!'_C^W@X@```8(2`!$@`
+M``$L'0``0:(`('_C^W@X@$`$2````51E!!I_X_MX.(!`!$@```&``0`D?`@#
+MIH.A`!2#X0`<."$`($Z``""4(?_@?`@"II/!`!B3X0`<D`$`)'Q_&W@L!```
+M08(`=#B`0`1(```!5&4$&G_C^W@X@$`$2````3A@!]!(```!.\``"G_C^W@X
+M@$`02````71@``%!@@`P.&``R$@```%_X_MX.(!`!$@```%4900:?^/[>#B`
+M0`1(```!-][__T""_\0X8```+!X``$&"`"Q_X_MX.(```&"$@`1(```!5&4#
+MF'_C^W@X@```8(2`!$@```$X8``!@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@
+ME"'_X'P(`J:3H0`4D^$`')`!`"1\?QMX?)TC>#B```!@A(`$2````61E``1_
+MX_MX.(```&"$@`1(```!+!T``$&B`"!_X_MX.(!`!$@```%4900:?^/[>#B`
+M0`1(```!@`$`)'P(`Z:#H0`4@^$`'#@A`"!.@``@E"'_X'P(`J:3H0`4D\$`
+M&)/A`!R0`0`D?)\C>'RD*WA\?AMX.Z```2P?``%!@@`D*!\``4&``!`L'P`"
+M08(`'$@``"!+__YU?'T;>$@``!Q+__\Y2```%$O__>E(```,.&```$@```R3
+M_A,T?Z/K>(`!`"1\"`.F@Z$`%(/!`!B#X0`<."$`($Z``""4(?_P?`@"II`!
+M`!0X@$`$2````51CA[Z``0`4?`@#IC@A`!!.@``@E"'_X'P(`J:3X0`<D`$`
+M)"P$``%!@@`8/2```#OI```L!``"0:(`'$@``!`](```.^D``$@```PX8```
+M2```$'_D^WA(```!?^/[>(`!`"1\"`.F@^$`'#@A`"!.@``@E"'_\'P(`J:0
+M`0`4.(``#$@```&``0`4?`@#IC@A`!!.@``@E"'_\'P(`J:0`0`4?(4C>#B`
+M``Q(```!@`$`%'P(`Z8X(0`03H``()0A__!\"`*FD`$`%#B```@XH``$2```
+M`8`!`!1\"`.F."$`$$Z``""4(?_@?`@"II/!`!B3X0`<D`$`)'Q^&W@X@``(
+M.*``($@```$[X```?\/S>#B```A(```!.````7!I``1!@@`<.&``"D@```$[
+M_P`!+!\#YT"!_]@X````?`,#>(`!`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A
+M_^!\"`*FDZ$`%)`!`"1\?1MX.(```&"$@&A(```!5&4&L'^CZW@X@```8(2`
+M:$@```&``0`D?`@#IH.A`!0X(0`@3H``()0A_^!\"`*FDZ$`%)`!`"1\?1MX
+M.(```&"$@&A(```!8&4`0'^CZW@X@```8(2`:$@```&``0`D?`@#IH.A`!0X
+M(0`@3H``()0A_^!\"`*FDX$`$).A`!20`0`D?'T;>'R`(WA\O"MX.(```&"$
+M@%!\!0-X2````7^CZW@X@```8(2`5'^%XWA(```!@`$`)'P(`Z:#@0`0@Z$`
+M%#@A`"!.@``@E"'_X'P(`J:3P0`8D^$`')`!`"1\?AMX?)\C>#A@```H!``_
+M08$`;"@$`!]`@0`T?\/S>#B```!@A(!42````3@?_^`XH/_^7*4`/GQE*#A_
+MP_-X.(```&"$@%1(```L?\/S>#B```!@A(!02````3B@__Y<I?@^?&4H.'_#
+M\W@X@```8(2`4$@```$X8``!@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_
+MX'P(`J:3P0`8D^$`')`!`"1\?AMX?)\C>#A@```H!``_08$`;"@$`!]`@0`T
+M?\/S>#B```!@A(!42````3@?_^`XH``!?*4`,'QE*WA_P_-X.(```&"$@%1(
+M```L?\/S>#B```!@A(!02````3B@``%\I?@P?&4K>'_#\W@X@```8(2`4$@`
+M``$X8``!@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_\'P(`J:0`0`4.(``
+M`&"$@$Q(```!@`$`%'P(`Z8X(0`03H``()0A__!\"`*FD`$`%'R%(WAP@`(`
+M08(`#%2%!>I@I0`@.(```&"$@$Q(```!@`$`%'P(`Z8X(0`03H``(#@```"0
+M!``(5*`%/I`$``PX8```?``H`$RB`"!PP``@08(`$(`$``Q@`"``D`0`##@`
+M``"0!``4D`0`$#A@``%.@``@E"'_X'P(`J:3@0`0DZ$`%)/!`!B3X0`<D`$`
+M)'Q\&WA\ORMX?3Y+>'R=(WB`!``4.2``#W`+``%!@@$T@`8`%'`)``%`@@`8
+M.(``#$@```$Y(``/?`/X`$&"`12@'0`25``%/K`>``"`'0`45!^,_G^#XW@X
+M@```8(2`;$@```%48[0^5&`$_GP`^$!`@``4.`/@`%0`!#Y__P-X2```"'__
+M&WA7X`1^L!X``C@```"8'@`$@!T`%'`)``)`@@!@<`L`!$&"``PX```!2```
+M,(`=`!1P"0`008(`$(@>``1@```(2```&(`=`!1P"P`(08(`%(@>``1@```$
+MF!X`!$@``!R('@`$8````I@>``2`'0`45`#??I@>``6`'0`05`!N/I@>``:`
+M'0`4<`D!`$&"``Q4`+Z^2```"#@`__^8'@`'@!T`$%0`CSZ8'@`(@!T`$%0`
+ME_Z8'@`)@!T`$%0`I_Z8'@`*.2```'TC2WB``0`D?`@#IH.!`!"#H0`4@\$`
+M&(/A`!PX(0`@3H``()0A_\!\"`*F?8``)I+A`!R3`0`@DR$`))-!`"B380`L
+MDX$`,).A`#23P0`XD^$`/)`!`$21@0`8?'X;>'R:(WA\NRMX?-<S>'SX.WA\
+M?!MXH`4``CD@``QP"P$`08(&X'RD*WA(```!?'D;>#D@``PL`P``08(&R"P:
+M``9!@@`H*!H`!D&!`!`H&@`!08$`$$@``!0L&@`(08(`##D@``Q(``:<?\/S
+M>#B`0!!(```!5'\&='_#\WA_9-MX2````3D@``,L`P``08(&=(B\$Q.('!,4
+M5`!`+GRE`WB('!,55`"`'GRE`WB('!,65`#`#GRE`WA_P_-X.(```&"$@`!(
+M```!B+P3&%2E0"Z('!,7?*4#>'_#\W@X@```8(2`!$@```%_P_-X?T33>$@`
+M!F$L&@`!08(`,"@:``%!@``8+!H`!D&"`$`L&@`(08(`.$@``%1_P_-X.(``
+M*#B@``%(```0?\/S>#B``"@XH```2````7_#\W@X@$`0.*`0)$@``"!_P_-X
+M.(``*#B@``!(```!?\/S>#B`0!`XH!!`2````7_#\W@X@$`02````7QE^WA_
+MP_-X.(!`$$@```&(O!,XB!P3.50`0"Y\I0-XB!P3.E0`@!Y\I0-XB!P3.U0`
+MP`Y\I0-X?\/S>#B```!@A(`(2````8B\$SU4I4`NB!P3/'RE`WA_P_-X.(``
+M`&"$@`Q(```!?\/S>#B````XH```2````7_#\W@X@``$.*```$@```%_P_-X
+M.(``##B@``!(```!?\/S>#B``!Q(```!?\/S>#B``"`XH```2````7_#\W@X
+M@``D.*```$@```$X````D!P3''_#\W@X@``L2````7_#\W@X@``P.*``!4@`
+M``%_P_-X.(``-#B@``5(```!?\/S>#B``$0XH``(2````7_#\W@X@`!(.*``
+M"$@```%_P_-X.(``4#B@``!(```!?\/S>#B``$PXH```2````7_#\W@X@$`,
+M.*```$@```%_P_-X.(``0#B@``!(```!?\/S>#B```!@A(`8@+P3^$@```%_
+MP_-X.(```&"$@$@XH```2````7_#\W@X@```2````7_#\W@X@```8(2`4#B@
+M``!(```!?\/S>#B```!@A(!4.*```$@```%_P_-X.(```&"$@%@XH```2```
+M`7_#\W@X@```8(2`7#B@``!(```!?\/S>#B```!@A(!@.*```4@```%_P_-X
+M.(```&"$@&0XH``!2````7_#\W@X@```8(2`:#B@``!(```!?\/S>#B```!@
+MA(`H.*```$@```%_P_-X.(```&"$@"PXH```2````7_#\W@X@```8(2`;#B@
+M``!(```!?\/S>#B```!@A(`P.*#__T@```%_P_-X.(```&"$@#0XH/__2```
+M`7_#\W@X@```8(2`.#B@``%(```!.^```#T@```[J0``+A<``%?@&#A\G0`N
+M09(`$#@$@``H``__0($`&%?I&#A]*>H4@*D`!'_#\WA(```!._\``2@?`*9`
+M@?_,?\/S>']DVWA(```!.2```RP#``!!@@*@?\/S>#B```!@A)@H2````51E
+M!AZ('!)Y5`!`+GRE`WA_P_-X.(```&"$F"A(```!B!P2>E0%P`Y4`(`>?*4#
+M>(D\$GM5($`N?*4#>'RE2WA_P_-X.(```&"$F#1(```!?\/S>#B```!@A)A$
+M2````51E!F*@'!)T5`#\L'RE`WA_P_-X.(```&"$F$1(```!?\/S>#B```!@
+MA)A(2````51E!1J@'!)T5`!3IGRE`WA_P_-X.(```&"$F$A(```!?\/S>#B`
+M``!@A)AD2````51E!1B('!)X5`!C9GRE`WA_P_-X.(```&"$F&1(```!?\/S
+M>#B```!@A)D02````51E`#J@'!)T5``'OGRE`WA_P_-X.(```&"$F1!(```!
+M?\/S>'\DRWA(`!#9.2```RP#``!!@@%H+!<``$&"`"B(&0`$<`D``D""``Q4
+M```\F!D`!*`9``*P&P`"B!D`!)@;``1_P_-X.(```&"$F!PXH``!2````3A@
+M`^A(```!?\/S>#B```!@A)A@2````6!E``%_P_-X.(```&"$F&!(```!?\/S
+M>#B```!@A)A@.*```3C```!(```!?\/S>'\DRWA(```!.^```"P#``!`H@`8
+MH!L``F````*P&P`".2```T@``+A_P_-X?^3[>$@```$[_P`!+!\``D"!_^R`
+M'A),+````$&B``Q_P_-X2````7_#\W@X@```8(2`)$@```%490),?\/S>#B`
+M``!@A(`D2````8"<$_PL!/__08(`#'_#\WA(```!@)P4`"P$__]!@@`,?\/S
+M>$@```&`G!0$+`3__T&"``Q_P_-X2````8"^`?@L!0``0:(`%'_#\W@X@```
+M8(2`:$@```&37@'<.&```4@``!B`&```+````$&"``B1.```.&```(`!`$2!
+M@0`8?`@#IH+A`!R#`0`@@R$`)(-!`"B#80`L@X$`,(.A`#2#P0`X@^$`/'V`
+M@2`X(0!`3H``()0A_^!\"`*FDZ$`%)/!`!B3X0`<D`$`)'Q]&WA\GR-X.(``
+M`&"$@`1(```!5&,$/BP?``%!@@!(08$`$"P?``!!@@`L2```9"P?``9!@@`0
+M+!\`"$&"`#A(``!0@+T3]'QE*WADI0!12```,("]$_1\92MX9*4`4D@``""`
+MO1/T?&4K>&2E`!1(```0@+T3]'QE*WADI0`0?Z/K>#B```!@A(`$2````8`!
+M`"1\"`.F@Z$`%(/!`!B#X0`<."$`($Z``""4(?_P?`@"II`!`!2`@P'<2___
+M+8`!`!1\"`.F."$`$$Z``""4(?_P?`@"II`!`!0X@``(.*``"D@`!+V``0`4
+M?`@#IC@A`!!.@``@E"'_X'P(`J:3X0`<D`$`)'Q_&W@X@```.*```4@```$X
+M````+`,``$&B`$1_X_MX.(``#SB@3B!(``1Q.````"P#``!!H@`H.&`#Z$@`
+M``%_X_MX.(``'SB@3B!(``1-.&`(-$@```$X```!?`,#>(`!`"1\"`.F@^$`
+M'#@A`"!.@``@E"'_X'P(`J:3P0`8D^$`')`!`"1\?AMX?)\C>#B````XH``!
+M2````3@````L`P``08(`J#B@```L'P``08(`%*`?``)P"0`008(`"#B@``%_
+MP_-X.(```&"$F`1(```!?\/S>#B```\XH$X@2``#N3@````L`P``0:(`8#A@
+M`^A(```!?\/S>#B``!\XH$X@2``#E3@````L`P``0:(`/#A@"#1(```!?\/S
+M>#B````XH``!2````3@````L`P``0:(`&'_#\W@X@```.*``"D@``U5\8!MX
+M?`,#>(`!`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A_]!\"`*FDP$`$),A`!23
+M00`8DV$`').!`""3H0`DD\$`*)/A`"R0`0`T?'\;>'R8(WA\N2MX2````7Q^
+M&W@X````+`,``$&"`K1_X_MX.(```&"$@&A(```!8&4`8'_C^W@X@```8(2`
+M:$@```%_X_MX.(```&"$@"1(```!?'H;>%1E`DY_X_MX.(```&"$@"1(```!
+M.&`/H$@```%_X_MX.(```&"$F`A(```!9&4(`'_C^W@X@```8(28"$@```$X
+M8``*2````7_C^WA_Q/-X2``+N3@````L`P``0:("'#A@`^A(```!?^/[>#B`
+M``!@A)@(2````51E`49_X_MX.(```&"$F`A(```!?^/[>#B```!@A)A82```
+M`7Q]&WA_X_MX.(```&"$F%Q(```!?'P;>'_C^W@X@```8(28:$@```%\>QMX
+M9Z4#_'_C^W@X@```8(286$@```%7A0929*4`/V"EP(!_X_MX.(```&"$F%Q(
+M```!5V4&W&"E$8!_X_MX.(```&"$F&A(```!.&``%$@```%_X_MX.(```&"$
+MF`A(```!9&4(`'_C^W@X@```8(28"$@```$X8``*2````7_C^W@X@```8(28
+MU#B@`"%(```!?^/[>#B```!@A)@(2````51E`49_X_MX.(```&"$F`A(```!
+M.&`#Z$@```%_X_MX.(```&"$F&!(```!8&4``7_C^W@X@```8(288$@```%_
+MX_MX.(```&"$F&`XH``!.,```$@```%_X_MX.(```&"$F%A_I>MX2````7_C
+M^W@X@```8(287'^%XWA(```!?^/[>#B```!@A)AH?V7;>$@```%_X_MX?\3S
+M>$@```$L`P``0*(`+#A@$XA(```!?^/[>'_$\WA(```!+`,``$""`!"@&``"
+M8````K`8``)_X_MX.(```&"$@&A(```!5&4&\'_C^W@X@```8(2`:$@```%_
+MX_MX.(```&"$@"1_1=-X2````3@```&0&0``?`,#>(`!`#1\"`.F@P$`$(,A
+M`!2#00`8@V$`'(.!`""#H0`D@\$`*(/A`"PX(0`P3H``()0A_^!\"`*FDZ$`
+M%)/!`!B3X0`<D`$`)'Q]&WA\GR-X?+XK>'R`(W@L!```0((`"#@`__^0`0`(
+M?Z/K>#B`0`!_Y?MX2````7_#\WA(```!5_\'/H`!``A4``<^D`$`"'^CZW@X
+M@$``?`4#>'_F^WA(```!?'X;>'/@``1`H@!$.```%9`!``B(H0`(.2$`"(@)
+M``%4`$`N?*4#>(@)``)4`(`>?*4#>(@)``-4`,`.?*4#>'^CZW@X@``42```
+M`7_#\WB``0`D?`@#IH.A`!2#P0`8@^$`'#@A`"!.@``@.4```#E@``HY!0`!
+M/.`08F#G3=-5:0@\.2D``U4I!CY\!4@`0*(`&'P$6*Y\`P-X+```/TR"`"!(
+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
+M0!XX56OO?GP`6WB!(0!$?`!+>)`!`$2(`0`45``.?%5*W_Y\`%-X@2$`2'P`
+M2WB0`0!(B4$`%55`+C2!(0!,?`!+>)`!`$R)80`656`>.%5*[WY\`%-X@2$`
+M4'P`2WB0`0!056O?_H`!`%1]:P-XD6$`5(AA`!<X@``#2````51C/C"``0!(
+M?&,#>)!A`$B(80`7.(```T@```%48_^^@`$`3'QC`WB080!,B&$`&#B```-(
+M```!5&,6^H`!`$Q\8P-XD&$`3#N@```[X0`(5ZD0.GTI^A2`J0`@?\/S>#B`
+M``!@A)B<2````3@=``%4'00^*!T`#T"!_]A7H!`Z?2$"%'_#\W@X@```8(28
+MU("I`"A(```!.````7P#`WB``0"4?`@#IH.A`(2#P0"(@^$`C#@A`)!.@``@
+ME"'_X'P(`J:3@0`0DZ$`%)`!`"1\?1MX?)PC>*$D```Y*>P`/&!F9F!C9F=\
+M:1B6?&,6<'TI_G!\:1A0.(``!4@```%490@\8*4`07^CZW@X@```8(28G$@`
+M``%_H^MX.(```&"$F,`XH```2````9.=$C0X8``!@`$`)'P(`Z:#@0`0@Z$`
+M%#@A`"!.@``@E"'_\'P(`J:0`0`4.(```&"$F&1(```!5&-M_G!@`0!!@@`,
+M:&`!_WP#`/B``0`4?`@#IC@A`!!.@``@E"'_X'P(`J:3H0`4D\$`&)/A`!R0
+M`0`D?'X;>'R=(W@X@```8(288$@```%@90`"?\/S>#B```!@A)A@2````7_#
+M\W@X@```8(288#B@``(XP```2````3@````L`P``08(`;#A@```[X```2```
+M&#A@`^A(```!?\/S>$@```$[_P`!.2```2P?`!1`@0`(.2```#@```$L`_^X
+M08$`"#@```!]*P`Y0(+_R"P#_[A`@0`4.````+`=`!8X````2```#+!]`!8X
+M```!?`,#>(`!`"1\"`.F@Z$`%(/!`!B#X0`<."$`($Z``"`X8```3H``(#A@
+M``!.@``@E"'_\'P(`J:0`0`4?&`;>#A@```L!``"0:$`&!R$`#Q\@"(4.(03
+M0'P#`WA(```!@`$`%'P(`Z8X(0`03H``()0A__!\"`*FD`$`%'Q@&WA\JRMX
+M.&```"P$``)!H0`<'*0`/'R@*A0XI1-`?`,#>'UD6WA(```!@`$`%'P(`Z8X
+M(0`03H``()0A_]!\"`*FDV$`').!`""3H0`DD\$`*)/A`"R0`0`T?'T;>'R>
+M(WA\O"MX+`0``D&"`"0H!``"08$`$"P$``%!@@`D2```*"P$``-!@@`02```
+M'#M@``)(```<.V```4@``!0[8```2```##A@__](``!T'!L`/'_C`A0[_Q-`
+M@!\`!#A@__\L````0((`6'_C^W@X@``\2````9/?``0L'```0*(`+#@```N0
+M'P`,.````I`?`!0X`/__D!\`&#@```JP'P`@L!\`(D@``!1_H^MX?V3;>'^%
+MXWA(```!?V/;>(`!`#1\"`.F@V$`'(.!`""#H0`D@\$`*(/A`"PX(0`P3H``
+M(#E@```H!``"08$`<!P$`#Q](P(4.2D30(`)``0Y8```+````$&"`%0X````
+MD`D`!#D@__Y=*2`^@`,3('T@`#B0`Q,@@`,3)'T@`#B0`Q,D@`,3*'T@`#B0
+M`Q,H@`,3+'T@`#B0`Q,L@`,3,'TI`#B1(Q,P.6```7UC6WA.@``@E"'_X'P(
+M`J:3@0`0DZ$`%)/!`!B3X0`<D`$`)'Q_&WA\G"-X?'T;>($C$C0X8```*`0`
+M`D&!`PP<!``\?]\"%#O>$T"`'@`$.&```"P```!!@@+P@!X`!#A@``$L```!
+M0*("X*`)``)P"0`008(`Q'_C^W@X@```8(2`$#B@`>!(```!?^/[>#B```!@
+MA(`4/*`(`&"E"`!(```!?^/[>#B```!@A(`@/*`!W6"EC\](```!@+X`%!RE
+M`>`XI0'@5*58*&"E`>!_X_MX.(```&"$@$!(```!?^/[>#B```!@A(!$/*`%
+MKF"E`\!(```!?^/[>#B```!@A)A$2````51E`#!@I0`X?^/[>#B```!@A)A$
+M2````7_C^W@X@```8(28!#R@;P!@I2`C2```P'_C^W@X@```8(2`$#B@`6A(
+M```!?^/[>#B```!@A(`4/*`$`&"E!`!(```!?^/[>#B```!@A(`@/*`!W6"E
+MCZ=(```!@+X`%!RE`6@XI0(P5*58*&"E`C!_X_MX.(```&"$@$!(```!?^/[
+M>#B```!@A(!$/*`$UV"E`YA(```!?^/[>#B```!@A)A$2````51E`#!@I0`<
+M?^/[>#B```!@A)A$2````7_C^W@X@```8(28!#R@;P!@I1`@2````8`>`!@X
+MH``/+`#__T&"``B`O@`85*6@%J`>`")4`"8V?*4#>*`>`"!4``<^?*4#>&2E
+M``A@I2``?^/[>#B```!@A(`<2````8`>``QP"0`!08(`&#@```%\`.`P@3T3
+M('P`2WA(```4.`#__EP`X#Z!/1,@?`!(.)`=$R"`'@`,<`D``4&"`!@X```!
+M?`#@,($]$R1\`$MX2```%#@`__Y<`.`^@3T3)'P`2#B0'1,D@!X`#'`)``)!
+M@@`8.````7P`X#"!/1,H?`!+>$@``!0X`/_^7`#@/H$]$RA\`$@XD!T3*(`>
+M``QP"0`$08(`&#@```%\`.`P@3T3+'P`2WA(```4.`#__EP`X#Z!/1,L?`!(
+M.)`=$RR`'@`,<`D`"$&"`!@X```!?`#@,($]$S!\`$MX2```%#@`__Y<`.`^
+M@3T3,'P`2#B0'1,P.&```8`!`"1\"`.F@X$`$(.A`!2#P0`8@^$`'#@A`"!.
+M@``@E"'_\'P(`J:0`0`4'(0`/'TC(A2`"1-$+````$&"`!@L```!0*(`$#B`
+M``!(```!2```"#A@__^``0`4?`@#IC@A`!!.@``@E"'_\'P(`J:0`0`4'(0`
+M/'R#(A2`!!-$+````4&"`!@H```!08``("@```-!@0`82```##B```!(```4
+M.(``!$@```PX8```2```#$@```$X8``!@`$`%'P(`Z8X(0`03H``()0A_^!\
+M"`*FDZ$`%)/!`!B3X0`<D`$`)'Q_&WA\G2-X2````7Q^&WA49`!^?^/[>$@`
+M``%_X_MX.(```&"$@&1(```!(`,`)50`^'Y\HP(4+!T``$""`"0XH___*`,`
+M`4&A`!A_X_MX?\3S>$@```$X8```2```)'_C^W@X@```8(2`9$@```%_X_MX
+M?\3S>$@```$X8``!@`$`)'P(`Z:#H0`4@\$`&(/A`!PX(0`@3H``()0A_^!\
+M"`*FD^$`')`!`"1\?QMX'(0`/'R#(A2`!!-$+````4&"`"`H```!08``3"P`
+M``)!@@`X+````T&"`!1(```X.(``"#B@``%(```T.(``"#B@``)(```!?^/[
+M>#B``"@XH``.2```&#B``"@XH``*2```##A@``!(```,2````3A@``&``0`D
+M?`@#IH/A`!PX(0`@3H``()0A__!\"`*FD`$`%!R$`#Q](R(4@`D31"P```!!
+M@@`<+````4"B`!0X@``42````51CKSY(```(.&```(`!`!1\"`.F."$`$$Z`
+M`""4(?_@?`@"II/!`!B3X0`<D`$`)'Q_&W@<A``\?(,B%(`$$T0L```!08(`
+M&"@```%!@`!\+````D&"`&!(``!P.(``"#B@``A(```!.\```'_C^W@X@``4
+M2````7!@>`!!@@`8.&``"D@```$[W@`!+!X#YT"!_]Q_X_MX.(``"#B@``!(
+M```!.&```2P>`^=`@0`@2```&#B``"PXH``$.,```$@```%(```(.&```(`!
+M`"1\"`.F@\$`&(/A`!PX(0`@3H``(($!``B!80`0.`?__3U`#``H```!0($`
+M"%3JT`I4H`4^52F0&GP`2WA4R6.F?`!+>'P%4WAQ8``!08(`"&2E`0!58,B$
+M?``K>($A``PQ2?__?.I)$%3IR`Q]*0-XD20`""P(__]!@@`850!K9)`$``QE
+M($``D`0`"$@```PX````D`0`#'%@``1!@@`D@`0`"&0``$"0!``(@`$`&%0`
+M`!B!)``,?`!+>)`$``PX8``!3H``(#A@``!.@``@@`0`"&0`(`"0!``(3H``
+M("P&``!!@@`@@20`#"%G``!\"SD45`!@)GTI*WA\`$MX2```*"P'``!!@@`4
+M@`@`")`$``B0I``,2```%#@```"0!``(8*`0`)`$``PX````D`0`%)`$`!`X
+M8``!3H``((`$`!0X8``/<`D``4V"`""@!``65``$_+`%``"@!``0L`4``C@`
+M``"8!0`$@`0`$'`)``%`@@!$<`D``D&"``PX```!F`4`!(`$`!!P"0`(08(`
+M$(@%``1@```"F`4`!(`$`!!P"0`$08(`$(@%``1@```$F`4`!(`$``A4`'<^
+MF`4`!8`$`!14`)X^F`4`!H`$`!!4`,<^F`4`!X`$`!!4`.<^F`4`"#@```"8
+M!0`*F`4`"SA@``!.@``@3H``((@$``1@```(F`0`!#A@``!.@``@E"'_X'P(
+M`J:3P0`8D^$`')`!`"1\?AMX.(```&"$F-`XH!P62````3O@``!_P_-X.(``
+M`&"$F(`\H``!2````3O_``$L'P`'0('_Y'_#\W@X@```8(2<`$@```%48T8^
+M5&GA/E1@)C9](P-X.(``"$@```&``0`D?`@#IH/!`!B#X0`<."$`($Z``""4
+M(?_0?`@"II,!`!"3(0`4DT$`&)-A`!R3@0`@DZ$`))/!`"B3X0`LD`$`-'QY
+M&WA\G"-X?+LK>'S:,WA\^#MX.&`N\$@```%\?QMX.Z```BP#``!!@@/\?'X;
+M>#R````XA```.*`2<$@```&3GP`,DW\`$)-?`!2S/P'(.````+`?`<HX```_
+ML!\!_#@```"0'P(`D!\NK)`?+L@X``<`D!\NT#@`__^0'R[4D!\NV)`?+MQ_
+MX_MX.(```$@```$[H``#+`,``$&"`XB@'P'(.2```&$I\1M\`$@`0*(`-'_C
+M^W@X@```8(2B`#B@``!(```!?^/[>#B```!@A)A\.*``&4@```$X8`/H2```
+M`7_#\W@X@$`@2````51C!CY4:>$^D3X!S%1@!SZP'@'0.2G__CN@``TH"0`"
+M08$#%'_#\W@X@```8(28&$@```&P?@'2?\/S>$@``X$[H``.+`,``$&"`NR`
+M'@',*````T"!`!A_P_-X.(```&"$F``XH``'2```%'_#\W@X@```8(28`#B@
+M`$=(```!.&`'T$@```%_P_-X2__]S;!^`=2@'@'45``&-CN@``TL```00*("
+MD'_#\W@X@`#!.*$`"$@```$[H``(+`,``$&"`G2@`0`(.Z``!2@`+_]`@0)D
+MH`$`"+`?$G!_P_-X.(!`$$@```%48^^^.Z``"BP#``)`H@)`?\/S>#B``#\X
+MH0`(2````3N@``@L`P``08(")*`!``BP'Q)R.X```#N@```XG0#`?\/S>#BA
+M``A(```!+`,``$&"`?B@`0`(?YP">#N]``$H'0,_0('_V#@```!@`/__.Z``
+M!WP<``!`@@'4.```"K`?$^8X```#L!\5\#N@```X```+'3T`-'TI^A2P"1/N
+M.[T``2@=``E`@?_L.Z```#T@```Y20``.6``"U>@"#Q](/H4.2D5\'P*`BZP
+M"0`(L`D``AT]`#1]*?H4L6D6M+%I%A@[O0`!*!T``D"!_]`XGQ)P?\/S>$@`
+M``$[H``(+`,``$&"`4B`'@',*````T"!`&R@'Q**+````$&B`&!_P_-X.(``
+M`&"$F``XH$`'2````3A@!]!(```!?\/S>$O__#&P?@'6?\/S>#B```!@A)@`
+M.*``!T@```$X8`?02````:`>`=94``8V.Z``#2P``"!`@@#82```##@```"P
+M'Q**?\/S>#B``+\XH0`(2````3N@``@L`P``08(`L*`!``BP'Q)TH!\2=+`>
+M`@@](```.2D``)$^`<!_P_-X2``"Y7_#\WA(```!.X```#N@```@G0`??\/S
+M>#BA``A(```!+`,``$&"`&"@`0`(?YP"%%>I"#Q]*?H45`#"/I@)+"R(`0`)
+MF`DL+3N]``$H'0`"0('_P"`<``!](.$4/6```F%K__U_@%IX(6```'P+`10[
+MH``)?\/S>'TK`WE!H@`L2```"#N@``@L'P``08(`#'_C^WA(```!+!@``$&"
+M``B3N```.&```(`!`#1\"`.F@P$`$(,A`!2#00`8@V$`'(.!`""#H0`D@\$`
+M*(/A`"PX(0`P3H``()0A_^!\"`*FDZ$`%)`!`"1\?1MX.(,2<$@```%_H^MX
+M2````8`!`"1\"`.F@Z$`%#@A`"!.@``@E"'_L'P(`J:3`0`PDR$`-)-!`#B3
+M80`\DX$`0).A`$23P0!(D^$`3)`!`%1\?!MX/2```#DI$GB!20`$@2D``)$A
+M`!B100`</6```#DK$H"`"Q*`@6D`!(%)``B!*0`,D`$`")%A``R100`0D2$`
+M%#M````[`0`8.R$`(%==$#I_W<`N?[W*%'^#XWA_Q/-X2````9!]```[X```
+M5^"`'GP=^WA_@^-X?\3S>'^EZWA(```!?X/C>'_$\WA(```!.````'P#Z`!`
+M@@"`._\``2P?`/]`@?_(.^```#MA``A7X!`Z?[L`+G^#XWA_Q/-X?Z7K>$@`
+M``%_@^-X?\3S>$@```$X````?!T8`$""`#P[_P`!+!\``T"!_\A70!`Z?X/C
+M>'R8`"Y\N0`N2````3M:``$L&@`!0('_1#A@`&1(```!.````7P#`WB``0!4
+M?`@#IH,!`#"#(0`T@T$`.(-A`#R#@0!`@Z$`1(/!`$B#X0!,."$`4$Z``"!P
+M@`$`08(`%#@`$SBP!0``.``7U$@``"1P@`"`08(`**`#$HHL````08(`'#@`
+M"0BP!0``.``*K+`&```X8``!3H``(#A@``!.@``@.&```4Z``""4(?_@?`@"
+MII.!`!"3H0`4D\$`&)/A`!R0`0`D?'P;>'Q^&WA\?1MX.^,!X*`#`@@L```!
+M0*(`$#B``!`XH0`(2````3@```"0'P`$H!X2ABP```!!@@`@.````9`?``2@
+M'A)V+````$""``PX```#D!\`!*`>$HHL````08(`$(`?``1@```$D!\`!#@`
+M"0BP'P`0.``*K+`?`!(X`!,XL!\`##@`%]2P'P`.@!\``&0`P`!@`,``.2``
+M"K$_``@Y(`"`L3\`"E0`!>B0'P``H!X2>BP```!!H@`P.+T22'^#XW@X@``/
+M2````2P#``!!@@`8.````9`=$DR`'P``8``!`)`?```X```-D!\`%#@```&0
+M'1)H.&```8`!`"1\"`.F@X$`$(.A`!2#P0`8@^$`'#@A`"!.@``@E"'_X'P(
+M`J:3@0`0DZ$`%)`!`"1\?!MX?)TC>#B```!@A(`H@+T`!$@```%_@^-X.(``
+M`&"$@"R`O0`,2````7^#XW@X@```8(2`,("]`!!(```!?X/C>#B```!@A(`T
+M@+T`"$@```%_@^-X.(```&"$@""`O0``2````8`!`"1\"`.F@X$`$(.A`!0X
+M(0`@3H``()0A_]!\"`*FD`$`-)"!``R``P'<+````4&"`!PH```!08``+"P`
+M``9!@@`D+```"$"B`$0X````8`#__Y`!`!0\```'8`#__T@``"@](```@`D`
+M`'P`(%!4`!@XD`$`%#T@``"`"0``?``@4%0`&#B0`0`8.`0``9`!`!`\``&`
+M8`#__WR@`#B0`0`(.($`"$@```&``0`T?`@#IC@A`#!.@``@E"'_X'P(`J:3
+MH0`4D`$`)'Q]&W@X@```8(2`*#B@``!(```!?Z/K>#B```!@A(`$2````61E
+M``14I0,2?Z/K>#B```!@A(`$2````7^CZW@X@```8(2`(#B@``!@I?__2```
+M`8`!`"1\"`.F@Z$`%#@A`"!.@``@E"'_X'P(`J:3H0`4D\$`&)/A`!R0`0`D
+M?'\;>'R>(WA\?1MXH`0`$BP```!!@@!D.(```&"$@`1(```!9&4`$'_C^W@X
+M@```8(2`!$@```&@O@`0?^/[>#B```!@A(`D2````:"^`!)_X_MX.(```&"$
+M@#A(```!@+X`%%2E&#A_X_MX.(```&"$@#!(```@.(```&"$@`1(```!5&4#
+M%'_C^W@X@```8(2`!$@```%_X_MX.(```&"$@"B`O@``2````7_C^W@X@```
+M8(2`($@```%48P`0H!X`"GQE`WBA/@`8+`D``$&"`!`X"0`$5`""7GRE`WA_
+MX_MX.(```&"$@"!(```!@+TNT%2E!AZ@'@`:5`!$+GRE`WB0O2[0?^/[>#B`
+M``!@A(`82````7_C^W@X@$`$2````51E`!Z!/@`<.2G__54I'#A\I4MX?^/[
+M>#B`0`1(```!@`$`)'P(`Z:#H0`4@\$`&(/A`!PX(0`@3H``()0A__!\"`*F
+MD`$`%#B`0`A(```!,2/__WP)&1!\`P-X@`$`%'P(`Z8X(0`03H``()0A_^!\
+M"`*FD\$`&)/A`!R0`0`D?'X;>'R?(W@X@`#`2````2P#__]`H@`4.````)`?
+M```X8```2```T#P``05@`-BZ?&``.)`?``!T:0`(08(`#&0`0`"0'P``<&``
+M!4&"`!"`'P``8````9`?``!P:07`08(`$(`?``!@``!`D!\``'!@`"!!@@`<
+M@!X2:"P```!!@@`0@!\``&0`0`"0'P``@!\``'0)0`!!H@!8D'X24'_#\W@X
+M@`#$2````9!^$E1_P_-X.(``R$@```&0?A)8?\/S>#B``,Q(```!D'X27'_#
+M\W@X@`#02````9!^$F!_P_-X.(``U$@```&0?A)D.&```8`!`"1\"`.F@\$`
+M&(/A`!PX(0`@3H``((!C+#A.@``@E"'_X'P(`J:3@0`0DZ$`%)/!`!B3X0`<
+MD`$`)'Q]&WA\GR-X?'X;>(.#+#@L'```0*``'#B``"0XH```2````7^CZW@X
+M@``D2````3P``05@`-BZ?^4`.'/@`$!!@@!$@!XL/"P```!!@@`(8*4`0(`>
+M+$`L````08(`"&"E`0"`'BQ$+````$&"``A@I0"`@!XL2"P```!!@@`(8*4$
+M`'/@``%!@@`(8*4`!W?@0`!!@@`(9*4`"'^CZW@X@`"@2````9/^+#@L'P``
+M0*``%'^CZW@X@``D.*```4@```%_@^-X@`$`)'P(`Z:#@0`0@Z$`%(/!`!B#
+MX0`<."$`($Z``"`X8`"`3H``()0A__!\"`*FD`$`%"@$`']!H0`@5(0H-#R$
+M``$XA(@<2````3@```%P:8``0((`"#@```!\`P-X@`$`%'P(`Z8X(0`03H``
+M()0A_^!\"`*FDZ$`%)/A`!R0`0`D?'\;>#@````H!`!_0:$`D%2=*#0_O0`!
+M.)V(`#B@``!(```!.)V(!'_C^W@XH```2````3B=B`A_X_MX.*```$@```$X
+MG8@,?^/[>#B@``!(```!.)V($'_C^W@XH```2````3B=B!1_X_MX.*```$@`
+M``$XG8@8?^/[>#B@``!(```!.[V(''_C^WA_I.MX.*```$@```$X```!?`,#
+M>(`!`"1\"`.F@Z$`%(/A`!PX(0`@3H``()0A_^!\"`*FDZ$`%)/!`!B3X0`<
+MD`$`)'Q^&W@X8```*`0`?T&!`(P[X```.2```"P%``!!@@!,B^4`!5?_0"Z(
+M!0`$?_\#>(DE``-5*<`.B`4``E0`@!Y]*0-XB`4``50`0"Y]*0-XB`4``'TI
+M`WA5*?A^5^#X`'TI`WA7__A^5)TH-#^]``$XG8@8?\/S>'TE2WA(```!.[V(
+M'&/E@`!_P_-X?Z3K>$@```$X8``!@`$`)'P(`Z:#H0`4@\$`&(/A`!PX(0`@
+M3H``()0A_\!\"`*FDN$`'),!`""3(0`DDT$`*)-A`"R3@0`PDZ$`-)/!`#B3
+MX0`\D`$`1'Q\&WA\F2-X?-@S>#%G__]]:UD0/`!556``559]:P`X/2NJJSEI
+MJJHX8```*`0`?T&!`;R(!0``+````4&"`"!!@0`0+````$&"`!Q(``!8+```
+M!4&"`$A(``!,.N``!4@``$R@!0`".&```"@```1`@0%\H`4``CK@```H```%
+M0($`+*`%``(BX``-?O>Y$%;W![PZ]P`!2```%#K@``=(```,.&```$@``42)
+M10`$B`4`!50`0"Y]2@-XB`4`!E0`@!Y]2@-XB`4`!U0`P`Y]2@-X?4I:>(@%
+M``E4`$`NB24`"'P:2WA_6EIX5UH$/HO%``J(!0`+5`!`+G_>`WB(!0`,5`"`
+M'G_>`WB(!0`-5`#`#G_>`WA_WEIXB`4`#U0`0"Z))0`.?!M+>'][6GA7>P0^
+MB^4`$(@%`!%4`$`N?_\#>(@%`!)4`(`>?_\#>(@%`!-4`,`.?_\#>'__6GB@
+M!0`"*```#4&!``A7_P8^5STH-#^]``$XG8@`?X/C>'U%4WA(```!.)V(!'^#
+MXWA_1=-X2````3B=B`A_@^-X?\7S>$@```$XG8@,?X/C>']EVWA(```!.)V(
+M$'^#XWA_Y?MX2````3N]B!1_@^-X?Z3K>'[ENWA(```!?X/C>'\DRWA_!<-X
+M2````8`!`$1\"`.F@N$`'(,!`""#(0`D@T$`*(-A`"R#@0`P@Z$`-(/!`#B#
+MX0`\."$`0$Z``""4(?_P?`@"II`!`!0Y(RPL?(,C>'TD2W@XH``&2````8`!
+M`!1\"`.F."$`$$Z``""4(?_P?`@"II`!`!0X8RPL.*``!D@```$X8``!@`$`
+M%'P(`Z8X(0`03H``()0A__!\"`*FD`$`%'R#(W@\@```.(0``#B@``9(```!
+M@`$`%'P(`Z8X(0`03H``(#A@``!.@``@E"'_X'P(`J:3P0`8D^$`')`!`"1\
+M?QMX?(`C>'R^*W@X@&``?`4#>$@```%_X_MX.(!@"#B@``%(```!?^/[>#B`
+M8`PXH``#.,```D@```$X````+`,``$&B`!A_X_MX.(!@!$@```&P?@``.```
+M`7P#`WB``0`D?`@#IH/!`!B#X0`<."$`($Z``"!\:1MXH`,""#A@``Q\`"``
+M08(`(*`)$G)P"0"`?&``)E1C'_Y\8P#05&,`.#AC``LL!0``08(`")!E```X
+M8```3H``(#D@``"@`Q*&+````$&"`!@Y(``!H`,2=BP```!`@@`(.2``0Z`#
+M$HHL````08(`"&$I``1](TMX3H``()0A_]!\"`*FDV$`').!`""3H0`DD`$`
+M-'Q\&WBCHQ)(5[OW?E>]__Y_9-MX2````7^#XW@X@```8(28`$@```%@92``
+M?X/C>#B```!@A)@`2````7^#XWA_9-MX2````7QEZG@Q)?__?`DI$'P%`WA_
+M@^-X?V3;>$@```&``0`T?`@#IH-A`!R#@0`@@Z$`)#@A`#!.@``@E"'_X'P(
+M`J:3@0`0DZ$`%)`!`"1\?!MX?)TC>#B`0!1(```!5[T(/#@```-\`.@P?&4#
+M>'^#XW@X@$`42````3A@``&``0`D?`@#IH.!`!"#H0`4."$`($Z``""4(?_@
+M?`@"II.!`!"3H0`4D`$`)'Q\&WA\G2-X.(!`%$@```%7O0@\.````WP`Z#!\
+M90!X?X/C>#B`0!1(```!.&```8`!`"1\"`.F@X$`$(.A`!0X(0`@3H``()0A
+M_]!\"`*FDV$`').!`""3H0`DD`$`-'Q[&WA\G"-X?+TK>#B`0!A(```!.`#_
+M_EP`X#Y\90`X5[T'_G^]X#!\I>MX?V/;>#B`0!A(```!.&```8`!`#1\"`.F
+M@V$`'(.!`""#H0`D."$`,$Z``""4(?_@?`@"II/A`!R0`0`D?)\C>#@`__\H
+M!``%08$`&#B`0!Q(```!<&,`+WQC_#!48`?^?`,#>(`!`"1\"`.F@^$`'#@A
+M`"!.@``@E"'_X'P(`J:3H0`4D^$`')`!`"1\?QMX?+TK>#B`0!1(```!/`#_
+M_F``?_Q\90`X8*6``"P=``!!@@`(9*4``7_C^W@X@$`42````8"?+#ADA`$`
+M?^/[>$@```&``0`D?`@#IH.A`!2#X0`<."$`($Z``""4(?_@?`@"II.!`!"3
+MH0`4D`$`)'Q\&WA\G2-X.(!`$$@```$\`/_Q8`#_GWQE`#A7O1;Z/2```#DI
+M``!\'4@N?*4#>'^#XW@X@$`02````8`!`"1\"`.F@X$`$(.A`!0X(0`@3H``
+M()0A_^!\"`*FDX$`$).A`!20`0`D?'T;>'R\*W@X8RPR.*``!D@```&(O2PR
+MB!TL,U0`0"Y\I0-XB!TL-%0`@!Y\I0-XB!TL-50`P`Y\I0-X?Z/K>#B```!@
+MA(`(2````8B]+#=4I4`NB!TL-GRE`WA7G(">?*7C>'^CZW@X@```8(2`#$@`
+M``&``0`D?`@#IH.!`!"#H0`4."$`($Z``""4(?_0?`@"II-A`!R3@0`@DZ$`
+M))`!`#1\?!MX.(```&"$@$Q(```!?'L;>'^#XW@X@```8(2`4$@```%\?1MX
+M?X/C>#B```!@A(!,2````7P;&!!\``$0?`#H$#E```!\9!MX.&```'P+&WA]
+M3"-X?6-;>'V$8WB``0`T?`@#IH-A`!R#@0`@@Z$`)#@A`#!.@``@E"'_\'P(
+M`J:0`0`4.(```&"$@$Q(```!@`$`%'P(`Z8X(0`03H``()0A_^!\"`*FDZ$`
+M%)`!`"1\?1MX.(```&"$@"!(```!9&4!`'^CZW@X@```8(2`($@```&``0`D
+M?`@#IH.A`!0X(0`@3H``()0A_^!\"`*FDZ$`%)/!`!B3X0`<D`$`)'Q^&W@X
+M@```8(289$@```%4?VW^<^`!`$&"``QK_P'_?__X^'_#\W@X@```8(2`4$@`
+M``%\?1MX?\/S>#B```!@A(!,2````7^]&GA_O?IX?Z/K>(`!`"1\"`.F@Z$`
+M%(/!`!B#X0`<."$`($Z``""4(?_@?`@"II/A`!R0`0`D?'\;>#B`0"!(```!
+M5&,&/E1IX3Y48P<^.6```(`?`<Q\`$@`0*(`%*`?`=!\`!@`0*(`"#E@``%]
+M8UMX@`$`)'P(`Z:#X0`<."$`($Z``""4(?_@?`@"II.!`!"3H0`4D`$`)'Q\
+M&WA\G2-X.(```&"$@)!(```!@!T``'QC`A20?0``?X/C>#B```!@A(",2```
+M`8`=``1\8P(4D'T`!'^#XW@X@```8(2`E$@```&`'0`,?&,"%)!]``Q_@^-X
+M.(```&"$@(A(```!@!T`"'QC`A20?0`(?X/C>#B```!@A("82````8`=`!!\
+M8P(4D'T`$(`!`"1\"`.F@X$`$(.A`!0X(0`@3H``()0A_^!\"`*FDZ$`%)/!
+M`!B3X0`<D`$`)'Q^&WA\GR-X?'T;>"@$``A`H0`8.(```&"$__](```!?!\8
+M0$"!`!"3_2[4.&```$@``"A_P_-X?^3[>$@```%\91MX?\/S>#B`$'!(```!
+MD_XNU#A@``&``0`D?`@#IH.A`!2#P0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3
+MH0`4D`$`)'Q]&W@X@!!P2````51D!#Y_H^MX2````8`!`"1\"`.F@Z$`%#@A
+M`"!.@``@E"'_X'P(`J:3@0`0DZ$`%)/!`!B3X0`<D`$`)'Q_&WA\GB-X.(`?
+M_T@```%\'AA`0($`%#@`__^0'R[8.&```$@``$A_X_MX.(```&"$@!1(```!
+M5'T`)'_C^WA_Q/-X2````51C!/Y_O1MX?^/[>#B```!@A(`4?Z7K>$@```&3
+MWR[8.&```8`!`"1\"`.F@X$`$(.A`!2#P0`8@^$`'#@A`"!.@``@E"'_X'P(
+M`J:3H0`4D`$`)'Q]&W@X@```8(2`%$@```%49`3^?Z/K>$@```&``0`D?`@#
+MIH.A`!0X(0`@3H``((AC+LAH8P`!5&,'_DZ``""4(?_@?`@"II/!`!B3X0`<
+MD`$`)'Q_&WA\?AMX+`0``$&"`#`X@```8(2`!$@```%490(,?^/[>#B```!@
+MA(`$2````8`?+LA4``(,2```+#B```!@A(`$2````61E`0!_X_MX.(```&"$
+M@`1(```!@!\NR&0``0"0'B[(.&```8`!`"1\"`.F@\$`&(/A`!PX(0`@3H``
+M()0A_^!\"`*FDX$`$).A`!23P0`8D^$`')`!`"1\?QMX?)XC>#B`'_](```!
+M?!X80$"!`!0X`/__D!\NW#A@``!(``!(?^/[>#B```!@A(`42````51]!`1_
+MX_MX?\3S>$@```%48X#>?[T;>'_C^W@X@```8(2`%'^EZWA(```!D]\NW#A@
+M``&``0`D?`@#IH.!`!"#H0`4@\$`&(/A`!PX(0`@3H``()0A_^!\"`*FDZ$`
+M%)`!`"1\?1MX.(```&"$@!1(```!5&2$_G^CZWA(```!@`$`)'P(`Z:#H0`4
+M."$`($Z``"`X8``!3H``($Z``"`X8```3H``($Z``"!.@``@E"'_\'P(`J:0
+M`0`4.(```&"$G!Q(```!5&,&/H`!`!1\"`.F."$`$$Z``""4(?_P?`@"II`!
+M`!0X@```8(2`6$@```%48P=^@`$`%'P(`Z8X(0`03H``()0A__!\"`*FD`$`
+M%%2%!WXX@```8(2`6$@```&``0`4?`@#IC@A`!!.@``@@&,NK$Z``""4(?_P
+M?`@"II`!`!2`HQ(T+`4``$"B`!"0@RZL.&```4@```A(```!@`$`%'P(`Z8X
+M(0`03H``()0A__!\"`*FD`$`%"P$``%`@@`@*`4``4"!`!`X8``-+`4`!4""
+M`!`X8```2```"$@```&``0`4?`@#IC@A`!!.@``@E"'_\'P(`J:0`0`4+`0`
+M"T"B`"!4Q0=\D*,!^#B```!@A(!(2````3A@``%(```(2````8`!`!1\"`.F
+M."$`$$Z``""4(?_P?`@"II`!`!1(```!,2/__WP)&1!\`P-X@`$`%'P(`Z8X
+M(0`03H``()0A_^!\"`*FD\$`&)/A`!R0`0`D?'\;>"P$``!!@@!T.(!`!$@`
+M``%4900:?^/[>#B`0`1(```!.&``"D@```$[P``*?^/[>#B`0!!(```!=&``
+M`4&"`#`X8`#(2````7_C^W@X@$`$2````51E!!I_X_MX.(!`!$@```$WWO__
+M0(+_Q#A@```L'@``08(`+'_C^W@X@```8(2`!$@```%490.8?^/[>#B```!@
+MA(`$2````3A@``&``0`D?`@#IH/!`!B#X0`<."$`($Z``""4(?_@?`@"II.A
+M`!23X0`<D`$`)'Q_&WA\G2-X.(```&"$@`1(```!9&4`!'_C^W@X@```8(2`
+M!$@```$L'0``0:(`('_C^W@X@$`$2````51E!!I_X_MX.(!`!$@```&``0`D
+M?`@#IH.A`!2#X0`<."$`($Z``""4(?_@?`@"II.A`!23X0`<D`$`)'Q_&WA\
+MG2-X.(```&"$@`1(```!9&4`!'_C^W@X@```8(2`!$@```$L'0``0:(`('_C
+M^W@X@$`$2````51E!!I_X_MX.(!`!$@```&``0`D?`@#IH.A`!2#X0`<."$`
+M($Z``""4(?_@?`@"II.A`!23P0`8D^$`')`!`"1\GR-X?*0K>'Q^&W@[H``!
+M+!\``4&"`"0H'P`!08``$"P?``)!@@`<2```($O__?U\?1MX2```'$O__L%(
+M```42___,4@```PX8```2```#)/^+JA_H^MX@`$`)'P(`Z:#H0`4@\$`&(/A
+M`!PX(0`@3H``()0A__!\"`*FD`$`%#B`0`1(```!5&.'OH`!`!1\"`.F."$`
+M$$Z``""4(?_@?`@"II/A`!R0`0`D+`0``D&"`#PH!``"08$`$"P$``%!@@`4
+M2```-"P$``1!@@`42```*#T@```[Z0``2```)#T@```[Z0``2```&#T@```[
+MZ0``2```##A@``!(```0?^3[>$@```%_X_MX@`$`)'P(`Z:#X0`<."$`($Z`
+M`""4(?_P?`@"II`!`!0X@``,2````8`!`!1\"`.F."$`$$Z``""4(?_P?`@"
+MII`!`!1\A2-X.(``#$@```&``0`4?`@#IC@A`!!.@``@E"'_\'P(`J:0`0`4
+M.(``"#B@``1(```!@`$`%'P(`Z8X(0`03H``()0A_^!\"`*FDZ$`%)`!`"1\
+M?1MX.(``"#B@`"!(```!?Z/K>#B```@XH``$.,```$@```$Q(___?`D9$'P#
+M`WB``0`D?`@#IH.A`!0X(0`@3H``()0A_^!\"`*FDZ$`%)`!`"1\?1MX.(``
+M`&"$@$A(```!5&4&\G^CZW@X@```8(2`2$@```&``0`D?`@#IH.A`!0X(0`@
+M3H``()0A_^!\"`*FDZ$`%)`!`"1\?1MX.(```&"$@$A(```!8&4`('^CZW@X
+M@```8(2`2$@```&``0`D?`@#IH.A`!0X(0`@3H``()0A_^!\"`*FDX$`$).A
+M`!20`0`D?'T;>'R`(WA\O"MX.(```&"$@$!\!0-X2````7^CZW@X@```8(2`
+M1'^%XWA(```!@`$`)'P(`Z:#@0`0@Z$`%#@A`"!.@``@E"'_X'P(`J:3P0`8
+MD^$`')`!`"1\?AMX?)\C>#A@```H!``_08$`;"@$`!]`@0`T?\/S>#B```!@
+MA(!$2````3@?_^`XH/_^7*4`/GQE*#A_P_-X.(```&"$@$1(```L?\/S>#B`
+M``!@A(!`2````3B@__Y<I?@^?&4H.'_#\W@X@```8(2`0$@```$X8``!@`$`
+M)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3P0`8D^$`')`!`"1\?AMX
+M?)\C>#A@```H!``_08$`;"@$`!]`@0`T?\/S>#B```!@A(!$2````3@?_^`X
+MH``!?*4`,'QE*WA_P_-X.(```&"$@$1(```L?\/S>#B```!@A(!`2````3B@
+M``%\I?@P?&4K>'_#\W@X@```8(2`0$@```$X8``!@`$`)'P(`Z:#P0`8@^$`
+M'#@A`"!.@``@E"'_\'P(`J:0`0`4.(```&"$@#Q(```!@`$`%'P(`Z8X(0`0
+M3H``()0A__!\"`*FD`$`%'R%(W@X@```8(2`/$@```&``0`4?`@#IC@A`!!.
+M@``@.````)`$``A4H`4^D`0`##A@``!\`"@`3*(`('#``"!!@@`0@`0`#&``
+M(`"0!``,.````)`$`!20!``0.&```4Z``""4(?_@?`@"II.A`!23P0`8D^$`
+M')`!`"1\O2MX?3]+>'R>(WB`!``4.2``#W`+``%!@@#D@`8`%'`)``%`H@`8
+M.(``#$@```$Y(``/?`/H`$&"`,2@'@`25``%/K`?``"`'@`45`",_K`?``(X
+M````F!\`!(`>`!1P"0`"0((`2'`+``1!@@`,.````4@``!B`'@`4<`D`$$&"
+M`!2('P`$8```")@?``1(```<B!\`!&````*8'P`$@!X`%%0`WWZ8'P`%@!X`
+M$%0`;CZ8'P`&@!X`%'`+`0!!@@`,5`"^OD@```@X`/__F!\`!X`>`!!4`(\^
+MF!\`"(`>`!!4`"]^F!\`"8`>`!!4`*?^F!\`"CD@``!](TMX@`$`)'P(`Z:#
+MH0`4@\$`&(/A`!PX(0`@3H``()0A_W!\"`*FD<$`2)'A`$R2`0!0DB$`5))!
+M`%B280!<DH$`8)*A`&22P0!HDN$`;),!`'"3(0!TDT$`>)-A`'R3@0"`DZ$`
+MA)/!`(B3X0",D`$`E'Q^&WA\ER-X?+LK>'S8,WA\\SMX?'H;>#K````[@```
+M.B```#H```"@!0`"<`D!`$&"``QP"0"`2```%*`%``)4`,G^:````7`)``%`
+M@@!LH!L``G`)`"!!@@`,<`D`0$@``!2@&P`"5`#1OF@```%P"0`!0((`1'_#
+M\WA_9-MX2````7QT&W@Y(``,+`,``$&""2`L%P`&08(`*"@7``9!@0`0*!<`
+M`4&!`!!(```4+!<`"$&"``PY(``,2``(]"P8``!!H@"8?\/S>#B```!@A(!,
+M2````7QQ&WA_P_-X.(```&"$@%!(```!?'`;>(`>`<P[X```.R$`""@```-`
+MH0`8?\/S>#B`$4!(```!D&$`"$@``"17_1`Z.)T10'_#\WA(```!?'W)+CO_
+M``$H'P`)0('_Y(@4``1P"0`"0((`#%0``#R8%``$H!0``K`;``*(%``$F!L`
+M!'_#\W@X@```8(2`6$@```%\<AMX+`,``$""``@Z0``!?\/S>#B```!@A(`$
+M2````51Y`8Q_P_-X.(!`$$@```$\``#^8```8'QU`#A_P_-X.(!`%$@```%\
+M;QMX?\/S>#B`0!A(```!?&X;>*";``)_P_-X2````3D@``,L`P``08('U*`;
+M``)4``7V+```P$&"`$1!@0`0+```H$&"`#!(```\+``!0$&"`!`L``%008(`
+M$$@``"@ZP``!2```"#K```([@``!2```%#K```-(```(.L``!#N```*`'@',
+M*````T"!`!A_P_-X.(```&"$F``XH``'2```%'_#\W@X@```8(28`#B@`$=(
+M```!@!X!S"@```-`@0#,H3L``G$@`(!!@@"(H!H2<"@`,`!`@0!\<2``($&"
+M`!"C^A-LH[H3<$@```RC^A-NH[H3<G_C^W@X@``#2````7Q_&WA_H^MX.(``
+M`T@```%7BA`Z/2```#DI``!]2DH4@`H!+%0`!JY7Z38R?`!+>)`*`2R!*@$X
+M52D`-E?@]_Y4:P\\?`!;>'TI`WB1*@$X.^```#T@```[J0``'!\`#'R=`"X<
+M'P`#?`#B%%0`$#I\O0`N?\/S>$@```$[_P`!*!\`&T"!_]A_P_-X?V3;>$@`
+M$+4[X```/2```#NI```<'P`4?)T`+AP?``5\`+(45``0.GR]`"Y_P_-X2```
+M`3O_``$H'P`B0('_V#O@```](```.ZD``!P?``Q\G0`N'!\``WP`XA14`!`Z
+M?+T`+G_#\WA(```!._\``2@?`#]`@?_8.^```#T@```[B0``+!@``'^@`"97
+MX!@X?)P`+G^H`2!!@@`0.`2``"@`#_]`@0`85^D8.'TIXA2`J0`$?\/S>$@`
+M``$[_P`!*!\`JD"!_\B`'@',*````T&A`'1_P_-X.(```&"$@!Q(```!5&4#
+M/F2E`=!_P_-X.(```&"$@!Q(```!?\/S>#B``%PXH```2````7_#\W@X@```
+M8(28>#B@``A(```!?\/S>#B```!@A(!(2````6!E!`!_P_-X.(```&"$@$A(
+M```!+!@``$&B`'1_P_-X.(```&"$@$Q^)8MX2````7_#\W@X@```8(2`4'X%
+M@WA(```!@!X!S#O@```[H0`(*````T"A`!A_P_-X.(`10("A``A(```!2```
+M)%?I$#HXB1%`?*GH+G_#\WA(```!._\``2@?``E`@?_DB+HL+(@:+"U4`$`N
+M?*4#>(@:+"Y4`(`>?*4#>(@:+"]4`,`.?*4#>'_#\W@X@```8(2``$@```&(
+MNBPQ5*5`+H@:+#!\I0-X?*7+>'_#\W@X@```8(2`!$@```%_P_-X?N2[>$@`
+M*(5_P_-X.(!`$$@```%\9:MX?\/S>#B`0!!(```!?\/S>#B`0!1]Y7MX2```
+M`7_#\W@X@$`8?<5S>$@```%_P_-X.(```&"$@%A^19-X2````8BZ+#*(&BPS
+M5`!`+GRE`WB(&BPT5`"`'GRE`WB(&BPU5`#`#GRE`WA_P_-X.(```&"$@`A(
+M```!B+HL-U2E0"Z(&BPV?*4#>'_#\W@X@```8(2`#$@```%_P_-X.(```&"$
+M@!B`NB[02````7_#\W@X@`"`.*#__T@```&`'@',+```!$"B`"R@'@'0*```
+M`4&A`"!_P_-X.(``%$@```%@900`?\/S>#B``!1(```!?\/S>']DVWA(```!
+M.2```RP#``!!@@,T+!<`!D&"`$"`'@($<`D``T&B`#1_P_-X.(```&"$F41(
+M```!5&4`PH`>`@14`.B$?*4#>'_#\W@X@```8(291$@```%_P_-X?V3;>$@`
+M$4%_P_-X?H2C>$@`"(4Y(``#+`,``$&"`LR@'@'(.2```&$I\1M\`$@`0*(`
+M)*`;``)P"0"`0:(`&'_#\W@X@```8(38"#B@!0)(```!?\/S>#B```!@A)@<
+M.*```4@```%_P_-X.(```&"$F11(```!5&,$OJ`;``(](,S,82G,S7TC2!95
+M)>C^<`D`($&"`!A4:1`Z/`"Z+F``BZ-]*0`6527A/CAE`&1(```!?\/S>#B`
+M``!@A)A@2````6!E``%_P_-X.(```&"$F&!(```!?\/S>#B```!@A)A@.*``
+M`3C```!(```!?\/S>'Z$HWA(```!+`,``$"B`""@&P`"<`D`($""``Q@```"
+ML!L``CD@``-(``',@!HNL"P```!!H@`D?\/S>#B```!@A)D@/*```6"E\`!(
+M```!.````9`:+K0[X```.Z```5?D$#HXA!``?Z7X,'_#\WA(```!._\``2P?
+M``E`@?_D.^```'_#\WA_Y/MX2````3O_``$L'P`)0('_['_#\W@X@`"D/*``
+M`6"E``%(```!?\/S>#B``*@XH``!2````7_#\W@X@`"L.*```4@```%_P_-X
+M.(`0L$@```%\91MX?\/S>#B`$+!(```!?\/S>#B``*`\H``(8*4)94@```$\
+M```(8``)99`:+#A_P_-X.(``K$@```%D90`'?\/S>#B``*Q(```!+!<`!D"B
+M`"Q_P_-X.(``H$@```%@91``?\/S>#B``*!(```!@!HL.&``$`"0&BPX@!X2
+M3"P```!!H@`,?\/S>$@```%_P_-X.(```&"$@"!(```!5&4"3'_#\W@X@```
+M8(2`($@```&`FB[4+`3__T&"``Q_P_-X2````8":+M@L!/__08(`#'_#\WA(
+M```!@)HNW"P$__]!@@`,?\/S>$@```&`O@'X+`4``$&B`!1_P_-X.(```&"$
+M@$A(```!DOX!W#A@``%(```8@!,``"P```!!@@`(D3,``#A@``"``0"4?`@#
+MIH'!`$B!X0!,@@$`4((A`%2"00!8@F$`7(*!`&""H0!D@L$`:(+A`&R#`0!P
+M@R$`=(-!`'B#80!\@X$`@(.A`(2#P0"(@^$`C#@A`)!.@``@E"'_\'P(`J:0
+M`0`4.(```D@`!$F``0`4?`@#IC@A`!!.@``@E"'_X'P(`J:3X0`<D`$`)'Q_
+M&W@X@```.*```4@```$X````+`,``$&B`"A_X_MX.(``$T@`!`$X````+`,`
+M`$&B`!`X8`@T2````3@```%\`P-X@`$`)'P(`Z:#X0`<."$`($Z``""4(?_@
+M?`@"II/!`!B3X0`<D`$`)'Q_&WA\GB-X.(```#B@``%(```!.````"P#``!!
+M@@&<5\`%]BP``,!!@@"(08$`&"P``*!!@@`T+```L$&"`"Q(``$L+``!0$&"
+M`+A!@0`0+```T$&"`%Q(``$4+``!4$&"`*!(``$(?^/[>#B```!@A)@$.*``
+M`$@```%_X_MX.(```&"$H@`XH``#2````7_C^W@X@```8(28?#B@`!E(```!
+M.&`!+$@```%(``#`?^/[>#B```!@A)@$.*```$@```&@'P'(+```$D"B`*!_
+MX_MX.(```&"$F'PXH``82````3A@`2Q(```!?^/[>#B```!@A*(`.*```D@`
+M`&QSP``008(`&'_C^W@X@```8(28!#B@``-(```4?^/[>#B```!@A)@$.*``
+M`$@```&@'P'(+```$D"B`#1_X_MX.(```&"$F'PXH``82````3A@`2Q(```!
+M?^/[>#B```!@A*(`.*```$@```%_X_MX.(``$T@``D4X````+`,``$&B`#@X
+M8`@T2````7_C^W@X@```.*```4@```$X````+`,``$&B`!1_X_MX.(```$@`
+M`@E\8!MX?`,#>(`!`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A_]!\"`*FDR$`
+M%)-!`!B380`<DX$`().A`"23P0`HD^$`+)`!`#1\?QMX?)HC>'RY*WA\>QMX
+M2````7Q^&W@X8```+!X``$&"`7"`'RZT+````$&B`,Q_X_MX.(```&"$F2!(
+M```!=&,``4"B`+20?RZT?^/[>#B```!@A)P02````7Q\&WA_X_MX.(```&"$
+MG!1(```!?'T;>'_C^W@X@```8(2<&$@```%\:AMX5X#X?E>I^'Y\`$H45`O)
+M_E>CT;XP"___?2!9$#$#__]\"!D0?2@`.4&B`$A_J@#0?[U;UE>]!KY_G!O6
+M5YP&_G_C^W@X@```8(29($@```%7O2@T?&7K>'REXWA@I0@`?^/[>#B```!@
+MA)D@2````7_C^WA_Q/-X2``$32P#``!`@@`@H!H``F````*P&@`"H!X``E0`
+M!_JP'@`"2```2'_C^WA_Q/-X2````2P#``!`@@`\.&`3B$@```%_X_MX?\3S
+M>$@```$L`P``0((`(*`:``)P"``@0((`#&````*P&@`".&```$@``"!_X_MX
+M2``<F8`;+K0A````?`@!%)`9```X8``!@`$`-'P(`Z:#(0`4@T$`&(-A`!R#
+M@0`@@Z$`)(/!`"B#X0`L."$`,$Z``""4(?_@?`@"II.A`!23P0`8D^$`')`!
+M`"1\?AMX?)\C>'R`(W@L!```0((`"#@`__^0`0`(?\/S>#B```Q(```!?\/S
+M>#B`0`!_Y?MX2````3A@``](```!5_\'OH`!``A4``>^D`$`"'_#\W@X@$``
+M?`4#>'_F^WA(```!?'T;>'/@``%`H@!$.```%9`!``B(H0`(.2$`"(@)``%4
+M`$`N?*4#>(@)``)4`(`>?*4#>(@)``-4`,`.?*4#>'_#\W@X@``42````7^C
+MZWB``0`D?`@#IH.A`!2#P0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3@0`0DZ$`
+M%)/!`!B3X0`<D`$`)'Q\&WA\GB-XH(0``*"^``)(```!?'T'-*`>``([X```
+M?Z/K>'`)`(!!H@`T'[T`##T@```Y*0#D?[U*%(!]``0X@``(2````51_+/2`
+M'0``5``@-G__`WBH?0`(+`,`D$&!``QP8``!08(`'#AC_^@X@``(2````51]
+M!CXX```!2```(#AC_^A\8PYP?&,!E#B```A(```!5'T&/C@```!7O1`Z5``(
+M/'^]`WACO00!5^5$+E>@!CY\I0-X?X/C>#B```!@A)B<2````5?E!"Y7H,8^
+M?*4#>'^#XW@X@```8(28T$@```&3W!(T.&```8`!`"1\"`.F@X$`$(.A`!2#
+MP0`8@^$`'#@A`"!.@``@E"'_\'P(`J:0`0`4.(```&"$F&1(```!5&-M_G!@
+M`0!!@@`,:&`!_WP#`/B``0`4?`@#IC@A`!!.@``@E"'_X'P(`J:3@0`0DZ$`
+M%)/!`!B3X0`<D`$`)'Q_&WA\GB-X?+TK>#B```!@A)AD2````51E`"97P$TL
+M?*4#>%>]!?Y\I>MX?^/[>#B```!@A)AD2````7_C^W@X@```8(288$@```%@
+M90`"?^/[>#B```!@A)A@2````3N``#@L'@``08(`"!^>#@`[H```?^/[>#B`
+M``!@A)A@2````7!@``)!@@`8?X/C>$@```$[O0`!+!T`.T"!_]@X8```+!T`
+M.T&A``Q_X_MX2__^^8`!`"1\"`.F@X$`$(.A`!2#P0`8@^$`'#@A`"!.@``@
+MH`0``E0`!?0L``#`08(`+$&!`!`L``"@08(`&$@``"PL``%`0*(`)*`#$LQ(
+M```0H`,2SD@```B@`Q+0L`4``#A@``%.@``@.&```$Z``""4(?_@?`@"II/!
+M`!B3X0`<D`$`)'Q^&WA\GR-X.*$`"$O__Y$X````+`,``$&B`%!_P_-X.(``
+M`&"$F&!(```!?\/S>$O__D&H`0`(?``8`$"``!"@'P`"8````K`?``*P?P`6
+M.2```:@!``A\`!@`0(``"#D@``!]($MX?`,#>(`!`"1\"`.F@\$`&(/A`!PX
+M(0`@3H``()0A_]!\"`*FDV$`').!`""3H0`DD\$`*)/A`"R0`0`T?'\;>'R=
+M(WB``P',*````T&!`(!(```!+`,``$&B`'1_X_MX?Z3K>#BA``A+__[-.```
+M`"P#``!!@@"`.\```#T@```[B0``.V```'R<\*Y_X_MX.*```$O__;&H`0`(
+M?``8`$"```RS?0`62```"+!]`!8[W@`!(!X``S@```!\``$4*!X``D&!`#!+
+M___`?^/[>#B```!@A)A@2````6!E``)_X_MX.(```&"$F&!(```!.````7P#
+M`WB``0`T?`@#IH-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`,$Z``"`Y0```H60`
+M`#T@``"@"0``?`L`0$&!`!PY*0``.4H``55`$#I\"0(N?`L`0$"!__!52Q`Z
+M/2```#DI``!]:TH4J`L``CQ@555@8U56?&`8EGP`_G!\8!A0?&,'-$Z``""4
+M(?_`?`@"II+!`!B2X0`<DP$`(),A`"2300`HDV$`+).!`#"3H0`TD\$`.)/A
+M`#R0`0!$?'@;>'Q^&WB@!``"<`D`@'_@`"97_Q_^(_\``E0`!?0L``#`08(!
+M%$&!`!`L``"@08(`[$@``2`L``%`0*(!&*$D```Y*?!?*`D$ZD&!`!"C(Q-4
+MHL,35D@``%BA)```.2GK="@)`.]!@0`0HR,36*+#$UI(```\H20``#DIZH0H
+M"0#@08$`$*,C$URBPQ->2```(*`$```ZP```.R```"@`%EQ`@0`,HR,38*+#
+M$V*C?A+8HOX2WB`7``!_0+D45^L0.CT@```Y*0``?6M*%($K`#Q5*0$$H!X3
+MS%0`X`9]*0-XD2L`/($K`$A5*0&(H!X3SE0`T`I]*0-XD2L`2($K`/Q5*0=V
+MH!X3RE0`&#A]*0-XD2L`_$@``$2C(Q-DHL,39J-C$MJBXQ+@(3<``'])N11(
+M```HHR,3:*+#$VJC8Q+<HN,2XB`7``!_0+D42```##A@``!(``$,5_P0.CT@
+M```Y*0``?YQ*%(.\`(17O0:N?V/;>#B```1(```!5T`P,E1C/C!\8P-X?[T;
+M>).\`(2#O`"05[T`.']CVW@X@``$2````51C_WY_O1MXD[P`D%>]!FY_(\MX
+M.(```T@```%48SXP?[T;>).\`)"#O`"<5[T`.G\CRW@X@``#2````51C_[Y_
+MO1MXD[P`G%>]![1^P[-X.(```T@```%48Q;Z?[T;>).\`)R`'`#,5``'=E;I
+M'SA\`$MXD!P`S#N@```](```.XD``!P=``Q\G``N'!T``WP`^A14`!`Z?+P`
+M+G\#PWA(```!.[T``2@=`!A`@?_8.````)`>+L`X8``!@`$`1'P(`Z:"P0`8
+M@N$`'(,!`""#(0`D@T$`*(-A`"R#@0`P@Z$`-(/!`#B#X0`\."$`0$Z``""4
+M(?_@?`@"II/!`!B3X0`<D`$`)'Q^&WA\:QMXH`4``E0`!?0L``#`08(`+$&!
+M`!`L``"@08(`&$@``+PY(```+``!0$&"`!1(``"L.2```4@```@Y(``"52D(
+M/'TI6A2@J1+JH`D2\%0`,#)\I0-XH`D2]E0`8"9\I0-XH`D2_%0`D!I\I0-X
+MH`D3`E0`P`Y\I0-XH^D3"*`)$PY4`#`R?_\#>*`)$Q14`&`F?_\#>*`)$QI4
+M`)`:?_\#>*`)$R!4`,`.?_\#>"P$``%!@@`8*`0``4&``"@L!``"08(`$$@`
+M`!1\ORMX2```%'_E^WA(```,.&```$@``#"0BRZL?\/S>#B```!@A)E@2```
+M`7_#\W@X@```8(299'_E^WA(```!.&```8`!`"1\"`.F@\$`&(/A`!PX(0`@
+M3H``()0A_]!\"`*FDR$`%)-!`!B380`<DX$`().A`"23P0`HD^$`+)`!`#1\
+M?QMX?)HC>'Q^&WB@!``"5``%]"P``,!!@@!808$`$"P``*!!@@!$2```4"P`
+M`4!`H@!(.R```#B```!@A)E$2````51E!W*@'Q/05``>N'RE`WA_X_MX.(``
+M`&"$F41(```!2```'#L@``%(```4.R```D@```PX8```2``">(`?`<PH```#
+M08$`*'_C^W@X@```8(29$$@```%@90`#?^/[>#B```!@A)D02```;'_C^W@X
+M@```8(29$$@```$X`/P&?&4`.%<]"#Q_O?(4H!T2Y%0`(#9\I0-X8*4``7_C
+M^W@X@```8(29$$@```%_X_MX@)XNK']%TWA(```!H+T2S%2E!?Y@I0(`?^/[
+M>#B```!@A)EH2````7_C^W@X@```8(281$@```%4909B5ST(/'^]\A0[G1*@
+MH!P``E0`/+!\I0-X?^/[>#B```!@A)A$2````7_C^W@X@```8(282$@```%4
+M904:H!P`"%0`8Z9\I0-X?^/[>#B```!@A)A(2````7_C^W@X@```8(284$@`
+M``%490`>?3GR%(@)$LE4`$0N?*4#>(@)$L9\I0-X?^/[>#B```!@A)A02```
+M`3M]$K"@&P`*5`7`#E0`@!Y\I0-XH3T2P%4@0"Y\I0-X?*5+>'_C^W@X@```
+M8(28-$@```%_X_MX.(```&"$F"A(```!5&4&'J`<``Y4`$`N?*4#>'_C^W@X
+M@```8(28*$@```%_X_MX.(```&"$F&1(```!5&4%&*`;``14`&-F?*4#>'_C
+M^W@X@```8(289$@```$[H``"H!X2<"@`,`)!@0`DH!\!RBP`$")`H@!0H!H`
+M`G`)`$!!@@!$.Z``"$@``#RA.@``52D&_C%I__]\"TD0.2G_]B$I``Q]*4D0
+M?2D`T'P+2#E!@@`45RD(/'TI\A2@"1,F?[T"%'_C^W@X@```8(29)$@```%4
+M90?N5Z`(/'```/=\I0-X?^/[>#B```!@A)DD2````3A@``&``0`T?`@#IH,A
+M`!2#00`8@V$`'(.!`""#H0`D@\$`*(/A`"PX(0`P3H``()0A__!\"`*FD`$`
+M%'R%(WA\@"-X*`0`/T"!``@X```_L`,!_#B```!@A)D\2````3A@``&``0`4
+M?`@#IC@A`!!.@``@E"'_P'P(`J:300`HDV$`+).!`#"3H0`TD\$`.)/A`#R0
+M`0!$?'T;>'R<(WA\?QMXH`0``E0`!?0L``#`08(`0$&!`!`L``"@08(`6$@`
+M`'@L``%`0*(`<*`#$^:P`0`,.`,3TI`!``@X`Q/HD`$`$*-#%TH[8Q=,2```
+M9*`#%?"P`0`,.`,5\I`!``@X`Q82D`$`$*-#%YP[8Q>>2```0*`#%?"P`0`,
+M.`,5^)`!``@X`Q:ND`$`$*-#%[P[8Q>^2```'#A@``!(``",56DP,GT_2A0[
+MR1?42```8*"\``!_H^MX.($`"$@``)4[P```?Z/K>'^$XWA(```!.6```*`?
+M$W1\'@``0(``,'P*`WA5:0@\?2GZ%*`)$W8L````08(`#'P`&`!!HO^D.6L`
+M`7P+4`!!@/_<5T8$/G^CZWA_Q/-X?V7;>'^'XWA(``0Y.&```8`!`$1\"`.F
+M@T$`*(-A`"R#@0`P@Z$`-(/!`#B#X0`\."$`0$Z``""4(?_`?`@"II+!`!B2
+MX0`<DP$`(),A`"2300`HDV$`+).!`#"3H0`TD\$`.)/A`#R0`0!$?'<;>'R9
+M(WA\NBMX.L```#L``#\\8```.&,``#B``0A(```!/&```#AC```X@`"`2```
+M`3T@```[:0`(/2```#N)`(@[X``!.\```%?`"#Q_^P,N.!\``50?!#XX'@`!
+M5!X$/B@?`#]`@?_D/2```#DI``"SR0`&.````;`)``(X```_L`D`!#O```"@
+M"0`&*````$"!`#@](```.^D``%?="#Q\G=HN?T/3>'\ERWA(``A!?'WC+C@>
+M``%4'@0^H!\`!GP`\$!!@?_8J7P``#T@``"@"0`&5`D(/'TIXA2HZ?_^.\``
+M`"@```!`@0!L/2```#C)``!7P`@\?!P"KGP`6`!!@0`,?`L#>'_6\WBA)@`&
+M?3Y(4#DI__]Q/___08(`.%?@"#Q]`.(4J2C__GU<`BY]0`<T?`D``$"!``BQ
+M2/_^.!X``50>!#Z@!@`&?`#P0$&!_Z0[P```/2```*`)``8H````0($`,'P)
+M`WA7P`@\?!P"KGP`.`!`@0`,?`<#>'_8\W@X'@`!5!X$/GP)\$!!@?_<.6L`
+M&3T@4>MA*84??`M(EGP`)G!]:_YP?`L`4!P``#)\'0<T.\```'T]2)9]*29P
+M?Z#^<'P+`WA]($A0.^```#0)``%`@0!(/2```#E)```](%'K82F%'WT]2)9]
+M*29P?2M(4#EI``%_P/-X.3X``54^!#Y4``@\?LH#+C@?``%4'P0^?!]8`$&`
+M_^`[X```/2```*$I``95*0@\?2GB%*@)__Y\`.@`0($`T#T@```[20``.!T`
+M,GP=!S2A.@`&52D(/'TIXA2H"?_^?X#H`$@```PX'P`!5!\$/D"=`"17X`@\
+M?6#B%'T\`JY]*>A0J`L``GP`Z%!]:0'708'_V%>C!#Y7X`@\?2#B%'R<`BZ@
+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
+M@0`.H*$`$*#!`!:@X0`8?\/S>#D```!(``$A?'L;>*!A``R@@0`2?^7[>'^&
+MXWA(``!YH&$`#*"!`!1_Y?MX?Z;K>$@``&6@@0`2H*$`%*#!`!:@X0`8?\/S
+M>#D```!(``#9?&<;>*"!``J@H0`,?T/3>']FVW@Y````2```O8`!`$1\"`.F
+M@T$`*(-A`"R#@0`P@Z$`-(/!`#B#X0`\."$`0$Z``""!10`(.0```*`%``0H
+M````0($`>*`*``!\`!@`0*(`5#EJ``@Y(```H`H`!B@```!`@0!`H`L``'P`
+M(`!`H@`<52D(/'TI4A2@"0`>L`8``#A@``%.@``@.6L``C@)``%4"00^H`H`
+M!GP`2$!!@?_(.4H`-#@(``%4"`0^H`4`!'P`0$!!@?^0.&```$Z``"!\8!MX
+M.6``9#A@``!])CG738(`("P(``!!@@`(.6```7P%(`!!@@!D?`0`4!P``&1]
+M)"A0?`!+UGP`!S5`H``0?,DS>!P&`&1(```4+```9$"!`!Q\Z3MX'`<`9%0#
+M!#XL"```3((`($@``!A](#G6(```9'P`,=9]*0(4?2E;UE4C!#Y.@``@?,,S
+M>"P(``!-@@`@'`8`9%0#!#Y.@``@5*D(/'TI(A2A:?_^'&,`9*`$```=(`!D
+M.2G_]GP#2$!`@``0L`8``*`$``!(```H'2L`9#DI``I\`TA`0($`,+%F``"Q
+M9P``3H``(+`&``!\"B(NL`<``$Z``"!\!`(NL`8``*`*``)+___L.6```'P+
+M*`!,@``@56H(/'P*(BX=(`!D?2-(4#DI``DH"0`20*'_O'U`4WA]2B(4H2H`
+M`ATI`&0Y*?_V?`-(0$&@_[`Y:P`!?`LH`$R``"!+__^\E"'_\'P(`J:0`0`4
+M@24`"#E@``"@!0`$?`H#>'P+``!`@``@H`D``'P`(`!!@@`4.2D`-#EK``%\
+M"U``08#_Z#B)``B@J0`&2__^^8`!`!1\"`.F."$`$$Z``"`Y8RP0/2```(`)
+M``20`RP0'```'#T@```Y*0`(?`!*%)`+`!@X```!D`L`%#@``!20"P`,.```
+M(Y`+`!!.@``@@2,2-*`)``)P"0`@08(`(#D@```Y8``<.0``0#E``'*1)``,
+M.```=T@``"`Y(```.6``,CD````Y0``R.```%)`$``PX```CD`0`$("$``0X
+M8```?`D@$'P``1!\``#0?218$'TI21!]*0#0?`M+>4V"`"!\""`0?``!$'P`
+M`-!])%`0?2E)$'TI`-!\"TMY38(`(#A@``%.@``@E"'_X'P(`J:3H0`4D`$`
+M)'Q]&WB`HR[$5*5,;&"E@``X@```8(29,$@```$X```!D!TNP(`!`"1\"`.F
+M@Z$`%#@A`"!.@``@E"'_X'P(`J:3H0`4D\$`&)/A`!R0`0`D?'\;>#O#+!"`
+M'@`4.&```"P```!!@@"(@!\NP"P```%`H@!X?^/[>#B```!@A)DP2````7!I
+M@`!`H@!@5&`^?I`>``21/R[`?^/[>'_$\WA+__ZU+`,``$"B`$!_X_MX?\3S
+M>$@``%4L`P``0:(`+'_C^WA_Q/-X2```:2P#``!`@0`8?^/[>'_$\WA(``'U
+M.````I`?+L"`?R[`@`$`)'P(`Z:#H0`4@\$`&(/A`!PX(0`@3H``(#A@``"!
+M)``$@`0`#'P)`$!`@0`0@`0`$'P)`$!-@``@.&```4Z``""`!``4.&#__RP`
+M``!-@@`@@60``!P+`!P](```.2D`"'P`2A20!``8@20`!(`$`!!\"0!`08``
+MF#A@__\L"P``38(`(($D``21)``(@`0`$'P'`WA\"0!`08``;(`$```L````
+M08(`8#T@```XJ0``/2```#C)``B!)```.0G__Y$$```=2``<?2HJ%(%D`!B`
+M"0`0@2L`"'P)`%!4``@\@20`"'T@2%"1)``(?4HR%)%$`!A\"3A`08``#"P(
+M``!`@O^X.&```4Z``""!)``$@`0`##A@``!\"0!`38$`(#T@``"!*0``.2G_
+M_X`$```X8/_^?`!(`$V"`""!)``$D20`"(`$``Q\!@-X?`D`0$&!`(@](```
+M@2D``#DI__^`!```?`L#>'P`2$!`@`!L/2```#AI```](```.*D`"#T@``"!
+M*0``..G__SD+``&1!```'4@`''TJ&A2!9``8@`D`$($K``A\"0!05``(/($D
+M``A]($A0D20`"'U**A211``8?`DP0$&!`!!]"T-X?`@X0$&`_[@X8``"3H``
+M((`$`!0L````38(`(($D`!B@"0``L`,3T($D`!B@"0`"L`,3SH$D`!B@"0`$
+ML`,3S($D`!B@"0`&L`,3RDZ``""4(?_@?`@"II.A`!23P0`8D^$`')`!`"1\
+M?AMX?)\C>'Q]&W@X@```8(2`!$@```%48P0^+!\``4&"`$A!@0`0+!\``$&"
+M`"Q(``!4+!\`!D&"`!`L'P`(08(`*$@``$"`OB[(?&4K>&2E`(%(```@@+XN
+MR'QE*WADI0!"2```$("]+LA\92MX9*4`('_#\W@X@```8(2`!$@```&``0`D
+M?`@#IH.A`!2#P0`8@^$`'#@A`"!.@``@E"'_\'P(`J:0`0`4@(,!W$O__SF`
+M`0`4?`@#IC@A`!!.@``@E"'_X'P(`J:3H0`4D\$`&)/A`!R0`0`D?'\;>'R=
+M(WA(```!?'X;>%1D`'Y_X_MX2````7_C^W@X@``P2````51IYKXL'0``08(`
+M%"`)`"54`/A^?2D"%$@``"@H"0`!0($`##DI__](```8?^/[>'_$\WA(```!
+M.&```$@``"Q490<J52`EMGRE`WA_X_MX.(``,$@```%_X_MX?\3S>$@```$X
+M8``!@`$`)'P(`Z:#H0`4@\$`&(/A`!PX(0`@3H``()0A__!\"`*FD`$`%'Q@
+M&W@X8```+`0`"4&A`!@<A``\?(`B%#B$+%!\`P-X2````8`!`!1\"`.F."$`
+M$$Z``""4(?_P?`@"II`!`!1\8!MX?*LK>#A@```L!``)0:$`'!RD`#Q\H"H4
+M.*4L4'P#`WA]9%MX2````8`!`!1\"`.F."$`$$Z``""4(?_0?`@"II-A`!R3
+M@0`@DZ$`))/!`"B3X0`LD`$`-'Q]&WA\GB-X?+PK>'QI&W@L!``"08(`)"@$
+M``)!@0`0+`0``4&"`"1(```X+`0``T&"`!!(```L.V``"4@``"P[8``(2```
+M)#M@``"``RQ4.&```"P```!`@@"(2```##A@__](``!\'!L`/'_I`A0[_RQ0
+M@!\`!#A@__\L````0((`8'_C^W@X@``\2````9/?``0L'```0*(`-#@```N0
+M'P`,.````I`?`!0X`/__D!\`&#@``_^0'P`<.```"K`?`""P'P`B2```%'^C
+MZWA_9-MX?X7C>$@```%_8]MX@`$`-'P(`Z:#80`<@X$`((.A`"2#P0`H@^$`
+M+#@A`#!.@``@E"'_X'P(`J:3H0`4D`$`)'Q]&WB`HRP\5*4%OH`#+$14`(&>
+M?*4#>#B``*1(```!@+TL0%2E!;Z`'2Q(5`"!GGRE`WA_H^MX.(``J$@```%_
+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
+M"`.F@Z$`%(/!`!B#X0`<."$`($Z``""!`0`(@4$`$%2E!3Y5*9`:?*5+>(`!
+M``Q4`,@,?*4#>'%```%!@@`(9*4!`%5`R(1\`"MX54FB4GTI`WA52Y(0?6M+
+M>)%D``A4X-`*54FR$'TI`WB1)``,+`C__T&"`!A5`&LD?`!+>)`$``QE8$``
+MD`0`"#A@``%.@``@.&```$Z``""`!``(9``@`)`$``A.@``@+`8``$&"`""!
+M)``,(6<``'P+.114`&`F?2DK>'P`2WA(```H+`<``$&"`!2`"``(D`0`")"D
+M``Q(```4.````)`$``A@H!``D`0`##@```"0!``4D`0`$#A@``%.@``@@`0`
+M%#A@``]P"0`!38(`((`$`!14`/T^L`4``*`$`!"P!0`".````)@%``2`!``0
+M<`D``4""`$1P"0`"08(`##@```&8!0`$@`0`$'`)``A!@@`0B`4`!&````*8
+M!0`$@`0`$'`)``1!@@`0B`4`!&````28!0`$@`0`"%0`=SZ8!0`%@`0`%%0`
+MGCZ8!0`&@`0`$%0`QSZ8!0`'@`0`$%0`YSZ8!0`(@`0`$%0`ISZ8!0`).```
+M`)@%``J8!0`+B24`!RP)``!!@@`,.`D``9@%``>))0`(+`D``$&"``PX"0`!
+MF`4`"#A@``!.@``@3H``((@#+KQ@```(F`,NO(@$``1@```(F`0`!*`#+KJP
+M!```B`,NO)@$``2(`RZ]F`0`!3A@``!.@``@E"'_X'P(`J:3H0`4D`$`)'Q]
+M&W@X@$"`/*"22&"E_`!(```!?Z/K>#B`0(`\H"228*5))$@```%_H^MX.(!`
+M@#R@*`!@I0`Y2````7^CZW@X@$"`/*!3%F"E""1(```!?Z/K>#B`0(`\H.68
+M8*4%>4@```%_H^MX.(!`@#R@`!U@I>__2````7^CZW@X@$"`/*`:JF"EOD!(
+M```!?Z/K>#B`0(`\H+X08*555$@```%_H^MX.(!`@#R@``Y@I3`'2````7^C
+MZW@X@$"$.*```$@```&``0`D?`@#IH.A`!0X(0`@3H``()0A_^!\"`*FD\$`
+M&)/A`!R0`0`D?'X;>#B```!@A)C0.*`<%D@```$[X```?\/S>#B```!@A)B`
+M/*```4@```$[_P`!+!\`!T"!_^1_P_-X.(```&"$G`!(```!5&-&/E1IX3Y4
+M8"8V?2,#>#B```A(```!@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_<'P(
+M`J:0`0"4?&<;>#T@```Y:1)\@`D2?($K``2!2P`(@0L`#)`!``B1(0`,D4$`
+M$)$!`!2`"P`0D`$`&#T@```Y:1*0@`D2D($K``2!2P`(@0L`#)`!`"B1(0`L
+MD4$`,)$!`#2`"P`0D`$`.#T@```Y:1*D@`D2I($K``2!2P`(@0L`#)`!`$B1
+M(0!,D4$`4)$!`%2`"P`0D`$`6#T@```Y:1*X@`D2N($K``2!2P`(@0L`#)`!
+M`&B1(0!LD4$`<)$!`'2`"P`0D`$`>#E````Y`0`(54`0.GU@.A1]($(4?`@`
+M+I`+1BB`"0`@D`M&/(`)`$"0"T90@`D`8)`+1F0Y2@`!+`H`!$"!_\PX@``!
+M2````8`!`)1\"`.F."$`D$Z``"!4A`@\?(0J%%2$"#Q\A!H4H&05_DZ``""4
+M(?_0?`@"II,A`!2300`8DV$`').!`""3H0`DD`$`-'Q]&WA\F2-X?+PK>'S;
+M,WA\^CMX/(```#B$```XH!)P2````9.=``R3?0`0DUT`%+,]`<@[@```LYT!
+MRC@``#^P'0'\.2```)$]`@"1/2^\D3TOP#P`"`"0'2_,.``'@9`=+]21/2_<
+M/```/V``/S^0'2_@.```9)`=+^0X```"D!TOZ#@`__^0'2_XD!TO_)`=,``X
+M?2P\/(```#B$```XH``&2````9N=,`2``0`T?`@#IH,A`!2#00`8@V$`'(.!
+M`""#H0`D."$`,$Z``"`Y8```/2```#DI```<"P`#?4!*%'P)`*Y\`!@`0*(`
+M((@*``%\`"!`08$`%(@*``(Y0``!?``@0$"``!0Y:P`!*`L``T"!_\@Y0```
+M?4-3>$Z``""4(?_0?`@"II-!`!B380`<DX$`().A`"23P0`HD^$`+)`!`#1\
+M?QMX?)XC>'R]*WA\W#-X?/H[>#A@1JA(```!?'L;>#@```(L`P``08(&7'_D
+M^WA_Q?-X?Z;K>'^'XWA_2--X2````7]_VWA_8]MX.(```#B@``%(```!+`,`
+M`$&"`$Q_8]MX.(!`($@```%48P8^5&#A/I`;`<Q48`<^L!L!T(A[`<^(FP'1
+M2___`2P#``!!@@18?V/;>#B```!(```!+`,``$""``PX```#2``%N']CVW@X
+M@```8(28&$@```&P>P'2@!L!S"P```E!@@`8+```"D"B`!B@&P'0*````T&!
+M``Q_X_MX2__Z_7_C^WA(```!.```#BP#``!!@@5H@!\!S"@```1`H0`@?^/[
+M>#B`0!!(```!8&40`'_C^W@X@$`02````7_C^W@X@```8(28`#B@``=(```!
+M?^/[>$@```&P?P'4H!\!U%0`!C8L```P08(`P$&!`!0L```008(`M"P``"!(
+M```<+```8$&"`*1!@0`,+```4$@```@L``"@08(`D*`?`=0L````0((`A(`?
+M`<PL```%0*(`((`?`=`](``)82D`0WP`2`!`H@`,.```1D@``%B`'P',:`D`
+M!R%I``!]*TD4:```"R%@``!\"P$4?2L#>4&"``PX``!12```+(`?`<PO@``*
+M09X`'"P```E!@@`40)X`&*`?`=`H```#08$`##@``&*P'P'4@!\!S"^```I!
+MG@`\+```"4&"`#1`G@`0H!\!T"@```-`@0`DH!\!U%0)!C8Y*?_0*`D`/T&!
+M`!!4``<^+```!$"!`I1_X_MX.(``P3BA``A(```!+`,``$&"`_2@`0`(*``P
+M`4&!``PX```%2``#Y*`!``BP&Q)P?^/[>#B`0!!(```!5&/OOBP#``)!@@`T
+M+`,``T&"`"2`'P',+```"4&"`"`L```*0((`$*`?`=`H```#0($`##@```I(
+M``.4?^/[>#B``#\XH0`(2````2P#``!!@@-XH`$`"+`;$G)_X_MX.(``'#BA
+M``A(```!+`,``$&"`UB@`0`(.X`#0"P```!!H@`L5!QA'G_C^W@X@``;.*$`
+M"$@```$L`P``08(#+*`!``A_G`-X.YS_0#N@```[P```?!W@0$"@`#`XG@#`
+M?^/[>#BA``A(```!+`,``$&"`OB@`0`(?[T">#O>``%\'N!`08#_V#@```!@
+M`/__?!T``$&"``PX```'2``"T#@```JP&Q/F.````[`;%?`[P```.```"QT^
+M`#1]*=H4L`D3[CO>``$H'@`)0('_[#O````](```..D``#T@```Y"0``.4``
+M"U?+"#Q]*]H4.2D5\'P+.BZP"0`(?`M"+K`)``(=/@`T?2G:%+%)%K2Q2188
+M.]X``2@>``)`@?_,.)L2<'_C^WA(```!+`,``$&"`CB@&Q)P*`!0`D&!`$2`
+M'P',+X``"D&>`!PL```)08(`%$">`"R@'P'0*````T&!`"`X``9HL!L6`#@`
+M!+"P&Q8$.`"``+`;%@BP&Q7^H!L2BBP```!!@@!PH!\!U%0`!C8L```00*(`
+M8'_C^W@X@```8(28`#B@0`=(```!.&`'T$@```%_X_MX2````;!_`=9_X_MX
+M.(```&"$F``XH``'2````3A@!]!(```!H!\!UE0`!C8L```@08(`##@```U(
+M``%X?^/[>#B``+\XH0`(2````2P#``!!@@%<H`$`"+`;$G2@&Q)TL!\""'_C
+M^WA(```!+`,``$&"`3R`'P',+X``"D&>`!PL```)08(`%$">`""@'P'0*```
+M`T&!`!1_X_MX.($`#$@```%(``!H@!\!S&@)``<A:0``?2M)%&@```LA8```
+M?`L!%'TK`WE!H@`4?^/[>#B!``Q(```!2```-*$_`=15*08V.2G_T"@)`#]!
+M@0`4?^/[>#B!``Q(```!2```$'_C^W@X@0`,2````2P#``!!@@"D@!LLQ)`?
+M`<!_X_MX2````3N@```[P```()X`'W_C^W@XH0`(2````2P#``!!@@!LH`$`
+M"'^]`A17R0@\?2G:%%0`PCZ8"2PPB`$`"9@)+#$[W@`!*!X``D"!_\`A/0``
+M?`GI%#U@``)A:__]?ZE:>"%I``!]*TD4?`M+>4&"``PX```)2```&'_C^WA+
+M__<%?^/[>$@``#`X```(D`$`#"P;``!!@@`,?V/;>$@```$L&@``08(`#(`!
+M``R0&@``.&```(`!`#1\"`.F@T$`&(-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`
+M,$Z``""4(?_@?`@"II/A`!R0`0`D?'\;>$@```&`'RRH+````$&B`!!_X_MX
+M?`@#IDZ``"%_X_MX2````7_C^W@X@``!.*```4@```$XGQ)P?^/[>$@```%_
+MX_MX2````8`!`"1\"`.F@^$`'#@A`"!.@``@E"'_L'P(`J:3`0`PDR$`-)-!
+M`#B380`\DX$`0).A`$23P0!(D^$`3)`!`%1\?!MX/2```#DI$N"!20`$@2D`
+M`)$A`!B100`</6```#DK$NB`"Q+H@6D`!(%)``B!*0`,D`$`")%A``R100`0
+MD2$`%#M````[`0`8.R$`(%==$#I_W<`N?[W*%'^#XWA_Q/-X2````9!]```[
+MX```5^"`'GP=^WA_@^-X?\3S>'^EZWA(```!?X/C>'_$\WA(```!.````'P#
+MZ`!`@@"`._\``2P?`/]`@?_(.^```#MA``A7X!`Z?[L`+G^#XWA_Q/-X?Z7K
+M>$@```%_@^-X?\3S>$@```$X````?!T8`$""`#P[_P`!+!\``T"!_\A70!`Z
+M?X/C>'R8`"Y\N0`N2````3M:``$L&@`!0('_1#A@`&1(```!.````7P#`WB`
+M`0!4?`@#IH,!`#"#(0`T@T$`.(-A`#R#@0!`@Z$`1(/!`$B#X0!,."$`4$Z`
+M`"!P@`$`08(`%#@`$S.P!0``.``7U$@``#!P@`"`08(`-*`#$HHL````0((`
+M$*`#$HPL````08(`'#@`"0BP!0``.``*K+`&```X8``!3H``(#A@``!.@``@
+ME"'_X'P(`J:3@0`0DZ$`%)/!`!B3X0`<D`$`)'Q^&WA\?1MX?'P;>#OC`>`X
+M````L`$`"*`#$G`H`%``0*$`)(`#`:!\"0.F.(``R3BA``A.@`0A.````"P#
+M``!!@@08H!X!U%0`!C8L``!`0*(`##@```"P'1*&H`$`""P```!`@@`P@!X!
+MS"P```=`H@`DH!X!T"P```A`H@`8.```!;`!``@X```!L!T2=K`=$GB`'`'<
+M+```!D&"`#R@'`'*+`!P94"B`#"A/`((.`G_G"@```%!@0`,.`D`!4@``!2@
+M'`((+```04"B``PX``!#L!P""#@```"0'P`$H!T2ABP```!!@@`@.````9`?
+M``2@'1)V+````$""``PX```#D!\`!*`=$HHL````08(`$(`?``1@```$D!\`
+M!*`=$HPL````08(`,*`<`<HL``X108(`)($_``1A(``(D!\`!*`=$G@L````
+M0((`#&$@`"B0'P`$.``)"+`?`!"A/@'452D&-CDI_]`H"0`_0($`2(%^`<QI
+M8``'(2```'P)`11I:0`+(4D``'TJ211\"DMY0((`)"^+``I!G@`<+`L`"4&"
+M`!1`G@`8H!X!T"@```-!@0`,.``)Q$@```@X``JLL!\`$C@`$S.P'P`,.``7
+MU+`?``Z`'P``5``#VF0```&0'P``.6```*`!``AP"0`"0((`*(`>`<PH```%
+M08$`&"P```5`H@`4H!X!T"@```-`@0`(.6```8$_``!1:9-:52D"TJ`!``AH
+M```"5`#__F4I`!!0";)2D3\``(`>`<PH```&0($`#&4@``A(```,@!\``%0`
+M`U:0'P``@!\``&0`P`"0'P``H!P!T"@```%!@0`0@!X!S"P```M`H@!L.2``
+M`*`!``AP"@`!0((`%(`?``1P"P`)08(`"#D@``&`'P``42#HA*%A``AI:0`(
+M52GO_E$@X,:0'P``.2```'%@``1`@@`4@!\`!'`*``E!@@`(.2```8`?``!1
+M(-D(9``%`)`?``"`'P``5``!RI`?```Y(```@!T3."P```!!@@`0@!T3/"P`
+M``!`@@`(.2```8`?``!1(+H08`#P`)`?``"`'`',+```!4"B`!"@'`'0+```
+M"$&"`!"`'`',*```!4"!`!"`'P``8``(`)`?``"@`0`(<``!\$&"``Q\`"9P
+M2```"#@```JP'P`(H`$`"'``\`!!@@`4?`EF<#@```%\`$@P2```"#@``("P
+M'P`*H3X!U%4I!C8Y*?_0*`D`/T&!`!"`'P``8``&`$@```R`'P``5``%Z)`?
+M``"@'1)Z+````$&B`#@XO!)(@7X!H'UI`Z9_P_-X.(``#TZ`!"$L`P``08(`
+M&#@```&0'!),@!\``&```0"0'P``@!X!S"$@``0Y(```?2E)%)$\$F@Y(```
+M+```!4"B`!"@'@'0+```"4&"`!"`'@',*```!4"!``@Y(``!@!\``%$@/C"0
+M'P``.```#Y`?`!0X```!?`,#>(`!`"1\"`.F@X$`$(.A`!2#P0`8@^$`'#@A
+M`"!.@``@E"'_\'P(`J:0`0`4.($`"$@```$X8``!@`$`%'P(`Z8X(0`03H``
+M(#T@```Y*0``+`0``4&"``P](```.2D``)$C`'!.@``@E"'_X'P(`J:3P0`8
+MD^$`')`!`"1\?QMX?)XC>#B```!@A(`H@+X`!$@```%_X_MX.(```&"$@"R`
+MO@`,2````7_C^W@X@```8(2`,("^`!!(```!?^/[>#B```!@A(`T@+X`"$@`
+M``&`'@``=`D!`$&B`#A_X_MX.($`"$@```&!?Q(T.2```#E```"1*P`HD4L`
+M+'_C^W@X@```8(2`(#R@`0!(```!?^/[>#B```!@A(`@@+X``$@```&``0`D
+M?`@#IH/!`!B#X0`<."$`($Z``""4(?_0?`@"II`!`#20@0`,@`,!W"P```%!
+M@@`<*````4&``"PL```&08(`)"P```A`H@!$.````&``__^0`0`4/```!V``
+M__](```H/2```(`)``!\`"!05``8.)`!`!0](```@`D``'P`(%!4`!@XD`$`
+M&#@$``&0`0`0/``!@&``__]\H``XD`$`"#B!``A(```!@`$`-'P(`Z8X(0`P
+M3H``()0A_^!\"`*FDZ$`%)`!`"1\?1MX.(```&"$@"@XH```2````7^CZW@X
+M@```8(2`!$@```%D90`$5*4#$G^CZW@X@```8(2`!$@```%_H^MX.(```&"$
+M@"`XH```8*7__T@```&``0`D?`@#IH.A`!0X(0`@3H``()0A_]!\"`*FDV$`
+M').!`""3H0`DD\$`*)/A`"R0`0`T?'X;>'R?(WA\?1MXH`0`$BP```!!@@!D
+M.(```&"$@`1(```!9&4`$'_#\W@X@```8(2`!$@```&@OP`0?\/S>#B```!@
+MA(`D2````:"_`!)_P_-X.(```&"$@#A(```!@+\`%%2E&#A_P_-X.(```&"$
+M@#!(```@.(```&"$@`1(```!5&4#%'_#\W@X@```8(2`!$@```%_P_-X.(``
+M`&"$@"B`OP``2````7_#\W@X@```8(2`($@```%48P`0H!\`"GQE`WBA/P`8
+M+`D``$&"`!`X"0`$5`""7GRE`WA_P_-X.(```&"$@"!(```!@+TOU%2E!AZ@
+M'P`:5`!$+GRE`WB0O2_4?\/S>#B```!@A(`82````:._``J`'P`<?`#H0$"!
+M``A\'0-X@Y\`#(`?`!Q\`.!`0($`"'P<`WA\'>``0*(`#(-_``1(```(@W\`
+M`("_``0XI?_]5*4;>&2E"AA_P_-X.(```&"$@-1(```!.+O__52E&WADI0H`
+M?\/S>#B```!@A(#82````5>E!#Y7@(`>?*4#>'_#\W@X@```8(2`W$@```&`
+M`0`T?`@#IH-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`,$Z``""4(?_@?`@"II/!
+M`!B3X0`<D`$`)'Q_&WA\@"-X?+XK>#B`8`!\!0-X2````7_C^W@X@&`(.*``
+M`4@```%_X_MX.(!@##B@``,XP``"2````3@````L`P``0:(`&'_C^W@X@&`$
+M2````;!^```X```!?`,#>(`!`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A_^!\
+M"`*FDX$`$).A`!20`0`D?'P;>'R=(W@X@$`42````5>]"#PX```#?`#H,'QE
+M`WA_@^-X.(!`%$@```$X8``!@`$`)'P(`Z:#@0`0@Z$`%#@A`"!.@``@E"'_
+MX'P(`J:3@0`0DZ$`%)`!`"1\?!MX?)TC>#B`0!1(```!5[T(/#B@``-\I>@P
+M?&4H>'^#XW@X@$`42````3A@``&``0`D?`@#IH.!`!"#H0`4."$`($Z``""4
+M(?_0?`@"II-A`!R3@0`@DZ$`))`!`#1\>QMX?)PC>'R]*W@X@$`82````3@`
+M__Y<`.`^?&4`.%>]!_Y_O>`P?*7K>']CVW@X@$`82````3A@``&``0`T?`@#
+MIH-A`!R#@0`@@Z$`)#@A`#!.@``@E"'_X'P(`J:3X0`<D`$`)'R?(W@X`/__
+M*`0`!4&!`!@X@$`<2````7!C`"]\8_PP5&`'_GP#`WB``0`D?`@#IH/A`!PX
+M(0`@3H``()0A_^!\"`*FDX$`$).A`!23X0`<D`$`)'Q_&WA\G2-X?+PK>#B`
+M0!1(```!5ZD(/#@```-\`$@P?```^%0`!1Q\90`X5[U@)GREZWA@I8``+!P`
+M`$&"``ADI0`!?^/[>#B`0!1(```!@)\L1&2$`0!_X_MX2````8`!`"1\"`.F
+M@X$`$(.A`!2#X0`<."$`($Z``""4(?_P?`@"II`!`!0X@$`(2````6AC``$@
+M`P``?&`9%(`!`!1\"`.F."$`$$Z``""4(?_0?`@"II-A`!R3@0`@DZ$`))/!
+M`"B3X0`LD`$`-'Q^&WA\G2-X.V```'Q\&W@X@`"`2````71@`(!!H@!`?\/S
+M>#B``(Q(```!=&`!`$&"``@_8``@=&D@`$&"``AG>P!`=&`$`$&"``AG>P"`
+M=&D"`$&"``AG>P(`?\/S>#B``,!(```!?'\;>"P#__]`H@`4.````)`=```X
+M8```2``!(#P``05@`-BZ?&``.)`=``!T:0`(08(`#&0`0`"0'0``<^``!4&"
+M`!"`'0``8````9`=``!SZ07`0:(`6(`=``!@``!`D!T``'_#\W@X@`#$2```
+M`51@!;Z!/$:@?`!+>%1CA;Y\8P-XD'Q&H'_#\W@X@`#(2````51@!;Z!/$:@
+M?`!+>%1CA;Y\8P-XD'Q&H'/@`"!!@@`<@!X2:"P```!!@@`0@!T``&0`0`"0
+M'0``@!T``']@`WB0'0``=`E``$&B`%B3_A)0?\/S>#B``,1(```!D'X25'_#
+M\W@X@`#(2````9!^$EA_P_-X.(``S$@```&0?A)<?\/S>#B``-!(```!D'X2
+M8'_#\W@X@`#42````9!^$F0X8``!@`$`-'P(`Z:#80`<@X$`((.A`"2#P0`H
+M@^$`+#@A`#!.@``@@&,L1$Z``""4(?_0?`@"II-A`!R3@0`@DZ$`))/!`"B3
+MX0`LD`$`-'Q^&WA\GR-X?'P;>(-C+$0L&P``0*``'#B``"0XH```2````7_#
+M\W@X@``D2````3P``05@`-BZ?^4`.#N@``!SX`!`08(`1(`<+,PL````08(`
+M"&"E`$"`'"S0+````$&"``A@I0$`@!PLU"P```!!@@`(8*4`@(`<+-@L````
+M08(`"&"E!`!SX``!08(`"&"E``=WX`+@08(`.&2E`(!WX``@08(`"&>]`0!W
+MX`!`08(`"&>](`!WX`"`08(`"&>]!`!WX`(`08(`"&>]`@!WX$``08(`"&2E
+M``A_P_-X.(``H$@```%_P_-X.(``K$@```$\`$C_8`#__WQE`#A\I>MX?\/S
+M>#B``*Q(```!D_PL1"P?``!`H``4?\/S>#B``"0XH``!2````7]CVWB``0`T
+M?`@#IH-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`,$Z``""@8P'J3H``()0A__!\
+M"`*FD`$`%*`#`>I\`"!`0*$`(%2$*#0\A``!.(2('$@```$X```!<&F``$""
+M``@X````?`,#>(`!`!1\"`.F."$`$$Z``""4(?_0?`@"II-A`!R3@0`@DZ$`
+M))/!`"B3X0`LD`$`-'Q_&WA\GB-XH`,!ZCA@``!\`"!`0*$!#%2=*#0_O0`!
+M.YV(%'_C^WA_A.-X2````7Q[&W@XG8@`?^/[>#B@``!(```!.)V(!'_C^W@X
+MH```2````3B=B`A_X_MX.*```$@```$XG8@,?^/[>#B@``!(```!.)V($'_C
+M^W@XH```2````7_C^WA_A.-X.*``!T@```$XG8@8?^/[>#B@``!(```!.[V(
+M''_C^WA_I.MX.*```$@```$L&P`$0*(`8(`?+\QT"0@`0:(`5#N^`$!7O2KT
+M/[T``3B=B`!_X_MX.*```$@```$XG8@$?^/[>#B@``!(```!.)V("'_C^W@X
+MH```2````3N]B`Q_X_MX?Z3K>#B@``!(```!.&```8`!`#1\"`.F@V$`'(.!
+M`""#H0`D@\$`*(/A`"PX(0`P3H``()0A_^!\"`*FDZ$`%)/!`!B3X0`<D`$`
+M)'Q^&WB@`P'J.&```'P`($!`@0",.^```#D@```L!0``08(`3(OE``57_T`N
+MB`4`!'__`WB))0`#52G`#H@%``)4`(`>?2D#>(@%``%4`$`N?2D#>(@%``!]
+M*0-X52GX?E?@^`!]*0-X5__X?E2=*#0_O0`!.)V(&'_#\WA])4MX2````3N]
+MB!QCY8``?\/S>'^DZWA(```!.&```8`!`"1\"`.F@Z$`%(/!`!B#X0`<."$`
+M($Z``""4(?_`?`@"II*!`!"2H0`4DL$`&)+A`!R3`0`@DR$`))-!`"B380`L
+MDX$`,).A`#23P0`XD^$`/)`!`$1\?AMX?)HC>'R_*WA\UC-X?'4;>#E#`>`Q
+M9___?6M9$#P`555@`%56?6L`.#TKJJLY::JJH`H`"CA@``!\`"!`0($$`(@%
+M```H```%08$`J#T@```Y*0``5``0.GP)`"Y\`$H4?`D#IDZ`!"`Z@``%2```
+MC(`*```X8```.H``!G0)``1`@@!X2``#N#J```2`'B_,=`D(`$&"`&0Y)`!`
+MH`H`"CA@``!\"0``0(`#E$@``$R@!0`".&```"@```1`@0.`H`4``CJ````H
+M```%0($`+*`%``(B@``-?I2A$%:4![PZE``!2```%#J```=(```,.&```$@`
+M`TB+'P`$B!\`!50`0"Y_&`-XB!\`!E0`@!Y_&`-XB!\`!U0`P`Y_&`-X?QA:
+M>(@?``E4`$`NB3\`"'P72WA^]UIX5O<$/HM_``J('P`+5`!`+G][`WB('P`,
+M5`"`'G][`WB('P`-5`#`#G][`WA_>UIXB!\`#U0`0"Z)/P`.?!E+>'\Y6GA7
+M.00^BY\`$(@?`!%4`$`N?YP#>(@?`!)4`(`>?YP#>(@?`!-4`,`.?YP#>'^<
+M6GB@'P`"*```#4&!``A7G`8^+!0`!$""`?R`'B_,=`D(`$&B`?`X&@!`5!0$
+M/E==*#0_O0`!.)V(`'\%P/A_P_-X2````3B=B`1^Y;CX?\/S>$@```$XG8@(
+M?\/S>']EVWA(```!.)V(#'_#\WA_)<MX2````3B=B!!_P_-X?X7C>$@```$[
+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
+M`0`D?'\;>($C$C0L"0``08(`D*`)``)P"0`@08(`A#O````Y8```@`0``'P>
+M`$!`@``T?`H#>'TD6A2("0`$<`D`@$&B`!14``9^?`#P0$&```A\'@-X.6L`
+M`7P+4$!!@/_8?^/[>#B```!@A(`$2````2P>``!!@@`45\#X?F1E`@`H```"
+M0($`"%1E`<I_X_MX.(```&"$@`1(```!@`$`)'P(`Z:#P0`8@^$`'#@A`"!.
+M@``@E"'_X'P(`J:3H0`4D\$`&)/A`!R0`0`D?'X;>#B```!@A)AD2````51_
+M;?YSX`$`08(`#&O_`?]___CX?\/S>#B```!@A(!02````7Q]&WA_P_-X.(``
+M`&"$@$Q(```!?[T:>'^]^GA_H^MX@`$`)'P(`Z:#H0`4@\$`&(/A`!PX(0`@
+M3H``()0A_^!\"`*FD^$`')`!`"1\?QMX.(!`($@```%48P8^5&GA/E1C!SXY
+M8```@!\!S'P`2`!`H@`4H!\!T'P`&`!`H@`(.6```7UC6WB``0`D?`@#IH/A
+M`!PX(0`@3H``()0A_^!\"`*FDX$`$).A`!20`0`D?'P;>'R=(W@X@```8(2`
+MD$@```&`'0``?&,"%)!]``!_@^-X.(```&"$@(Q(```!@!T`!'QC`A20?0`$
+M?X/C>#B```!@A("42````8`=``Q\8P(4D'T`#'^#XW@X@```8(2`B$@```&`
+M'0`(?&,"%)!]``A_@^-X.(```&"$@)A(```!@!T`$'QC`A20?0`0@`$`)'P(
+M`Z:#@0`0@Z$`%#@A`"!.@``@.&```4Z``""4(?_P?`@"II`!`!0X@```8(2<
+M'$@```%48P8^@`$`%'P(`Z8X(0`03H``()0A__!\"`*FD`$`%#B```!@A(!8
+M2````51C!WZ``0`4?`@#IC@A`!!.@``@E"'_\'P(`J:0`0`45(4'?CB```!@
+MA(!82````8`!`!1\"`.F."$`$$Z``""`8R^\3H``()0A__!\"`*FD`$`%("C
+M$C0L!0``0*(`$)"#+[PX8``!2```"$@```&``0`4?`@#IC@A`!!.@``@.&``
+M`4Z``""4(?_@?`@"II.A`!23P0`8D^$`')`!`"1\?AMX?)\C>'Q]&W@H!``%
+M0*$`&#B```!@A/__2````7P?&$!`@0`4.`#__Y`=+_@X8```2```*'_#\WA_
+MY/MX2````7QE&WA_P_-X.(`0<$@```&3_B_X.&```8`!`"1\"`.F@Z$`%(/!
+M`!B#X0`<."$`($Z``""4(?_@?`@"II.A`!20`0`D?'T;>#B`$'!(```!5&0$
+M/G^CZWA(```!@`$`)'P(`Z:#H0`4."$`($Z``""4(?_@?`@"II.!`!"3H0`4
+MD\$`&)/A`!R0`0`D?'\;>'R>(W@X@#__2````7P>&$!`@0`4.`#__Y`?+_PX
+M8```2```2'_C^W@X@```8(2`%$@```%4?0`B?^/[>'_$\WA(```!5&,$OG^]
+M&WA_X_MX.(```&"$@!1_I>MX2````9/?+_PX8``!@`$`)'P(`Z:#@0`0@Z$`
+M%(/!`!B#X0`<."$`($Z``""4(?_@?`@"II.A`!20`0`D?'T;>#B```!@A(`4
+M2````51D!+Y_H^MX2````8`!`"1\"`.F@Z$`%#@A`"!.@``@B&,OS&AC``%4
+M8P?^3H``()0A_^!\"`*FD\$`&)/A`!R0`0`D?'\;>'Q^&W@L!```08(`,#B`
+M``!@A(`$2````51E`@Q_X_MX.(```&"$@`1(```!@!\OS%0``@Q(```L.(``
+M`&"$@`1(```!9&4!`'_C^W@X@```8(2`!$@```&`'R_,9``!`)`>+\PX8``!
+M@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3@0`0DZ$`%)/!`!B3
+MX0`<D`$`)'Q_&WA\GB-X.(`__T@```%\'AA`0($`%#@`__^0'S``.&```$@`
+M`$A_X_MX.(```&"$@!1(```!5'T$`G_C^WA_Q/-X2````51C@)Y_O1MX?^/[
+M>#B```!@A(`4?Z7K>$@```&3WS``.&```8`!`"1\"`.F@X$`$(.A`!2#P0`8
+M@^$`'#@A`"!.@``@E"'_X'P(`J:3H0`4D`$`)'Q]&W@X@```8(2`%$@```%4
+M9(2^?Z/K>$@```&``0`D?`@#IH.A`!0X(0`@3H``()0A_^!\"`*FDX$`$).A
+M`!23P0`8D^$`')`!`"1\?QMX?)XC>'R]*W@X8``,*`0`?T&!`#1_X_MX.(`$
+M`'_%\WA(```!,!W__WR@Z1!_X_MX.(`$!$@```%]/OH4FZDO.#A@``"``0`D
+M?`@#IH.!`!"#H0`4@\$`&(/A`!PX(0`@3H``()0A_^!\"`*FDZ$`%)/!`!B3
+MX0`<D`$`)'Q_&WA\G2-XF)\2."P%``!!@@#HB`,2."P```!!@@#<@2,2-*`)
+M``)P``%`+``!0$"B`,@X@``!2````8$_$C2@"0`"<`E``$&"`"148/A^?+T!
+MUARE``,XI0$$?]T!UA_>``8[W@VL2```3($_$C2H"0`"+````$"@`"148/"^
+M?+T!UARE``,XI0#2?]T!UA_>``8[W@U(2```''R]&=8<I0`#.*4!:'_=&=8?
+MW@`&.]X.8'^]&=8?O0`#.[T#Z%>]!+Y_X_MX.(`0<$@```%_X_MX.(`0L'_%
+M\WA(```!5Z6`'GREZWA_X_MX.(```&"$@!1(```!@`$`)'P(`Z:#H0`4@\$`
+M&(/A`!PX(0`@3H``()0A__!\"`*FD`$`%("#`=Q(```!@`$`%'P(`Z8X(0`0
+M3H``(#@````L!``&08(`*#D@``"(`Q*3+````$&"`!2``R_H*````4&!``@Y
+M(``!?2!+>'P#`WA.@``@E"'_X'P(`J:3X0`<D`$`)'Q_&WA(```!+`,``$&"
+M`;1_X_MX.(```&"$F'`XH``?2````:"_`=14I08V.*7_T""E`#]\I2D05*4'
+M>CBE`!1_X_MX.(```&"$F?A(```!?^/[>#B```!@A(`<2````51E!F)@I0"`
+M?^/[>#B```!@A(`<2````7_C^W@X@```8(2!!#B@`#U(```!?^/[>#B`0!!(
+M```!8&4``G_C^W@X@$`02````8%_`<QI:0`'(`D``'T@211I8``+(4```'P*
+M`11]*@-Y0((`)"^+``I!G@`<+`L`"4&"`!1`G@!XH!\!T"@```-!@0!L?^/[
+M>#B```!@A)AT.*``)D@```%_X_MX.(```&"$F'@XH``-2````7_C^W@X@```
+M8(29\#B@``=(```!?^/[>#B```!@A)GT.*``/T@```%_X_MX.(!`$$@```%4
+M90(*9*4"`$@``&1_X_MX.(```&"$F'0XH``*2````7_C^W@X@```8(28>#B@
+M``Q(```!?^/[>#B```!@A)GP.*```T@```%_X_MX.(```&"$F?0XH``@2```
+M`7_C^W@X@$`02````61E`P!_X_MX.(!`$$@``0A_X_MX.(!`$$@```%490(*
+M?^/[>#B`0!!(```!?^/[>#B`0!!(```!5&4'^G_C^W@X@$`02````7_C^W@X
+M@```8(28<#B@`!](```!?^/[>#B```!@A)AT.*``?T@```%_X_MX.(```&"$
+MF'@XH``.2````7_C^W@X@```8(29\#B@``Q(```!?^/[>#B```!@A)GT.*``
+M_T@```&@OP'45*4&-CBE_]`@I0`_?*4I$%2E!WHXI0`.?^/[>#B```!@A)GX
+M2````7_C^W@X@```8(2`'$@```%48P9BH3\!U%4I!C8Y*?_08&43@"@)`#]`
+M@0`(8&4/@'_C^W@X@```8(2`'$@```&``0`D?`@#IH/A`!PX(0`@3H``()0A
+M_^!\"`*FD^$`')`!`"1\?QMX2````2P#``!!H@$@?^/[>#B`0!!(```!5&4"
+M"G_C^W@X@$`02````7_C^W@X@$`02````51E!_I_X_MX.(!`$$@```%_X_MX
+M.(```&"$@00XH``!2````7_C^W@X@```8(2`'$@```%48P9BH3\!U%4I!C8Y
+M*?_08&43@"@)`#]`@0`(8&4/@'_C^W@X@```8(2`'$@```%_X_MX.(```&"$
+MF'`XH``?2````7_C^W@X@```8(28=#B@`'](```!?^/[>#B```!@A)AX.*``
+M#D@```%_X_MX.(```&"$F?`XH``,2````7_C^W@X@```8(29]#B@`/](```!
+MH+\!U%2E!C8XI?_0(*4`/WRE*1!4I0=Z.*4`%'_C^W@X@```8(29^$@```&`
+M`0`D?`@#IH/A`!PX(0`@3H``(#E```"A9```/2```*`)``!\"P!`08$`'#DI
+M```Y2@`!54`0.GP)`BY\"P!`0('_\%5)$#H]8```.6L``'TI6A2H:0`"3H``
+M()0A_^!\"`*FD\$`&)/A`!R0`0`D?+\K>'S>,WA\:AMX.6,!X"@$`!U!@0*<
+M/2```#DI`$Q4@!`Z?`D`+GP`2A1\"0.F3H`$("P%``)!@@`H*`4``D&``F@H
+M!0`$08``)"@%``5`@0)8+`4`?T&"`E!(```0@2L``%4I=_Y(``%L.2``#4@`
+M`E`Y(```+`4``$&"`D0L!0`!0*(`%(`#+\QL``@`5`DO_D@``BPL'P``08(`
+M$"P?``%!H@`42``!4(`+``!4"6_^2``"#(`*+]!4"??^2``"`(`#`<PH```%
+M08$`("P```5`H@`0H`,!T"@```=!@0`,.&``#4@``=0X8```2``!S#D@```L
+M!0``08(!Q"P%``%`@@#T.(```&"$H@A(```!5&.;?FAC``%4:0?^2``!H(`#
+M`?A(``%\.2```"P%``!!@@&,+`4``4"B`6R``R_<2```'"P%``!!@@`0+`4`
+M`4&"`!A(```TH`,2AB%@``!]*P$42``!6*`#$HPL````0((!-*`#$HHY(``!
+M+````$&"`3Q(``$@.2```4@``3`Y(```+`4``$&"`20L!0`!0((`5(`#+\Q\
+M``#X5`D/_D@``0PL!0``08(`$"P%``%!H@`D2```,($K``!5*:_^?2D`T'TI
+M_G!5*0>V.2D`#4@``-R``R_0:```"%0)[_Y(``#,.2``#$@``,2``R_@5``&
+MOD@``)R``R_@5`#&OD@``)`L!0`!08(`(#D@```H!0`!08``F#D@``PH!0`&
+M08$`C$@``!2``S`8:````50)!_Y(``!X2````3D@``$L`P``08(`:"@?``9!
+M@0!(/2```#DI`,17X!`Z?`D`+GP`2A1\"0.F3H`$((@#``E(```@B`,`#$@`
+M`!B(`P`-2```$(@#``M(```(B`,`"I`>```Y(```2```%'_E^WA_QO-X2```
+M`7QI&WA](TMX@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3P0`8
+MD^$`')`!`"1\?QMX?-XS>'QJ&W@Y8P'@*`0`'4&!`;`](```.2D`_%2`$#I\
+M"0`N?`!*%'P)`Z9.@`0@+`8``$&"`!"``R_,9``(`$@``,2``R_,5``!1D@`
+M`+B`"P``.&```'0)``A!@@%P+`8``$&"`!"`'R_05``'N$@```R`'R_08```
+M!)`*+]!_X_MX.(```&"$@2"`JB_02```0#B```!@A*((2````6!E(``L'@``
+M0((`"%1E!.)_X_MX.(```&"$H@A(```4D-\!^#B```!@A(!(?,4S>$@```%(
+M``#D,2;__WP),1"0`R_<2```U"P&``!!@@`0@`,OS&0`@`!(```,@`,OS%0`
+M`'Z0"B_,2```L*@#+_1_Q@(4*!X`/T"!``@[P``_+`0`&D"B`!2`"B_@?\`#
+M>%0`!KY(```4@2HOX%4I!*Y7P,:^?`!+>)`*+^!_X_MX.(```&"$@.B`JB_@
+M2___=#A@```H!0`&0:$`9%2@$#I_X_MX/2```#DI``!\B0`N?,4S>$@```%(
+M``!$@`L``'`)"`!!@@`L+`8``$&"`!"``R_08```"$@```R``R_05``'=I`*
+M+]`X8``!2```$'_C^WA_QO-X2````8`!`"1\"`.F@\$`&(/A`!PX(0`@3H``
+M()0A__!\"`*FD`$`%$@```$Q(___?`D9$'P#`WB``0`4?`@#IC@A`!!.@``@
+ME"'_X'P(`J:3P0`8D^$`')`!`"1\?QMX+`0``$&"`'0X@$`$2````51E!!I_
+MX_MX.(!`!$@```$X8``*2````3O``"A_X_MX.(!`$$@```%T8``!08(`,#A@
+M`#)(```!?^/[>#B`0`1(```!5&4$&G_C^W@X@$`$2````3?>__]`@O_$.&``
+M`"P>``!!@@`L?^/[>#B```!@A(`$2````51E`YA_X_MX.(```&"$@`1(```!
+M.&```8`!`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A_^!\"`*FDZ$`%)/A`!R0
+M`0`D?'\;>'R=(W@X@```8(2`!$@```%D90`$?^/[>#B```!@A(`$2````2P=
+M``!!H@`D?^/[>#B`0`1(```!5&4$&F2E``%_X_MX.(!`!$@```&``0`D?`@#
+MIH.A`!2#X0`<."$`($Z``""4(?_@?`@"II.A`!23X0`<D`$`)'Q_&WA\G2-X
+M.(```&"$@`1(```!9&4`!'_C^W@X@```8(2`!$@```$L'0``0:(`)'_C^W@X
+M@$`$2````51E!!IDI0`"?^/[>#B`0`1(```!@`$`)'P(`Z:#H0`4@^$`'#@A
+M`"!.@``@E"'_X'P(`J:3H0`4D\$`&)/A`!R0`0`D?)\C>'RD*WA\?AMX.Z``
+M`2P?``%!@@`D*!\``4&``!`L'P`"08(`'$@``"!+__WU?'T;>$@``!Q+__ZY
+M2```%$O__RU(```,.&```$@```R3_B^X?Z/K>(`!`"1\"`.F@Z$`%(/!`!B#
+MX0`<."$`($Z``""4(?_P?`@"II`!`!0X@$`$2````51CA[Z``0`4?`@#IC@A
+M`!!.@``@E"'_X'P(`J:3X0`<D`$`)"P$``A!@@"D*`0`"$&!`"PL!``"08(`
+MH"@$``)!@0`0+`0``4&"`$1(``#(+`0`!$&"`&Q(``"\+`0!`$&"`)`H!`$`
+M08$`$"P$`"!!@@!T2```H"P$`@!!@@"`+`0$`$&"`(1(``",/2```#OI``"!
+M(Q(T+`D``$&"`("@"0`"<`E``$""`%2!(Q(TJ`D``BP```!`H`!D2```3#T@
+M```[Z0``2```5#T@```[Z0``2```2#T@```[Z0``2```/#T@```[Z0``2```
+M,#T@```[Z0``2```)#T@```[Z0``2```&#T@```[Z0``2```##A@``!(```0
+M?^3[>$@```%_X_MX@`$`)'P(`Z:#X0`<."$`($Z``""4(?_P?`@"II`!`!0X
+M@``,2````8`!`!1\"`.F."$`$$Z``""4(?_P?`@"II`!`!1\A2-X.(``#$@`
+M``&``0`4?`@#IC@A`!!.@``@E"'_\'P(`J:0`0`4.(``"#B@``1(```!@`$`
+M%'P(`Z8X(0`03H``()0A_^!\"`*FDZ$`%)`!`"1\?1MX.(``"#B@`"!(```!
+M?Z/K>#B```@XH``$.,```$@```$Q(___?`D9$'P#`WB``0`D?`@#IH.A`!0X
+M(0`@3H``()0A_^!\"`*FDZ$`%)`!`"1\?1MX.(```&"$@$A(```!5&4&\G^C
+MZW@X@```8(2`2$@```%_H^MX2````7^CZW@X@``!2````8`!`"1\"`.F@Z$`
+M%#@A`"!.@``@E"'_X'P(`J:3H0`4D`$`)'Q]&W@X@```8(2`2$@```%@90`@
+M?Z/K>#B```!@A(!(2````7^CZWA(```!@`$`)'P(`Z:#H0`4."$`($Z``""4
+M(?_@?`@"II.!`!"3H0`4D`$`)'Q]&WA\@"-X?+PK>#B```!@A(!`?`4#>$@`
+M``%_H^MX.(```&"$@$1_A>-X2````8`!`"1\"`.F@X$`$(.A`!0X(0`@3H``
+M()0A_^!\"`*FD\$`&)/A`!R0`0`D?'X;>'R?(W@X8```*`0`/T&!`&PH!``?
+M0($`-'_#\W@X@```8(2`1$@```$X'__@.*#__ERE`#Y\92@X?\/S>#B```!@
+MA(!$2```+'_#\W@X@```8(2`0$@```$XH/_^7*7X/GQE*#A_P_-X.(```&"$
+M@$!(```!.&```8`!`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A_^!\"`*FD\$`
+M&)/A`!R0`0`D?'X;>'R?(W@X8```*`0`/T&!`&PH!``?0($`-'_#\W@X@```
+M8(2`1$@```$X'__@.*```7RE`#!\92MX?\/S>#B```!@A(!$2```+'_#\W@X
+M@```8(2`0$@```$XH``!?*7X,'QE*WA_P_-X.(```&"$@$!(```!.&```8`!
+M`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A_^!\"`*FDZ$`%)/A`!R0`0`D?'T;
+M>#B```!@A(`\2````7Q_&WA_H^MX.(```&"$@0Q(```!<&``($&"``AC_P(`
+M=&`"`D&"``AC_P$`?^/[>(`!`"1\"`.F@Z$`%(/A`!PX(0`@3H``()0A_^!\
+M"`*FDZ$`%)/!`!B3X0`<D`$`)'Q]&WA\GR-X5(4&/CB```!@A(`\2````3O`
+M``!SX`(`08(`"#O``"!SX`$`08(`"&?>`@)_H^MX.(```&"$@0Q_Q?-X2```
+M`2P>``!!@@`8?Z/K>#B``#1(```!8&4`$$@``!1_H^MX.(``-$@```%490<T
+M?Z/K>#B``#1(```!@`$`)'P(`Z:#H0`4@\$`&(/A`!PX(0`@3H``(#@```"0
+M!``(5*`%/I`$``QPR0`@08(`#&``(`"0!``,.````)`$`!20!``0.&```4Z`
+M`""4(?_@?`@"II.!`!"3H0`4D\$`&)/A`!R0`0`D?'P;>'R]*WA]/TMX?)XC
+M>(`$`!0Y(``/<`L``4&"`42`!@`4<`D``4"B`!@X@``,2````3D@``]\`^@`
+M08(!)*`>`!)4``4^L!\``(`>`!14`(1^L!\``CD@``"9/P`$@!X`$%0`9CZ8
+M'P`&B!\`!BP``(!`H@`(F3\`!H`>`!1P"0$`08(`#%0`OGY(```(.`#__Y@?
+M``>`'@`05`"._I@?``B`'@`05``G/I@?``F`'@`05`"G_I@?``J`'@`4<`L`
+M`D""`)AP"0`$08(`$(@?``1@```!2```@(`>`!1P"P`008(`2(@?``1@```"
+MF!\`!(@>`!:8'P`%@3PP'"%I``!]*TD4:```!7P``-!4``_^?2L`.4&B`$1_
+M@^-X?^3[>$@```%(```T@!X`%'`)``A!@@`0B!\`!&````A(```8@!X`%'`+
+M`"!!@@`0B!\`!&```!"8'P`$.2```'TC2WB``0`D?`@#IH.!`!"#H0`4@\$`
+M&(/A`!PX(0`@3H``()0A_Z!\"`*FD<$`&)'A`!R2`0`@DB$`)))!`"B280`L
+MDH$`,)*A`#22P0`XDN$`/),!`$"3(0!$DT$`2)-A`$R3@0!0DZ$`5)/!`%B3
+MX0!<D`$`9'Q_&WA\F2-X?+XK>'S7,WA\^#MX?'H;>#N```"@!0`"<`D!`$&"
+M``QP"@"`2```%*`%``)4`,G^:````7`+``%`@@)\H!X``G`)`"!!@@`,<`H`
+M0$@``!2@'@`"5`#1OF@```%P"P`!0(("5'_C^W@X@```.*```4@```$X````
+M+`,``$&B#:Q_X_MX?\3S>$@```%\=!MX.2``#"P#``!!@@U\+!D`!D&"`"`H
+M&0`&08$`$"@9``%!@0($2```#"P9``A`H@'X.<```"P7``!!H@`L?^/[>#B`
+M$4!(```!?&X;>'_C^WA^A*-X2````7_C^W@X@```2````8%_`<QI8``'(2``
+M`'P)`11I:0`+(4D``'TJ211\"DMY0((`)"^+``I!G@`<+`L`"4&"`!1`G@!D
+MH!\!T"@```-!@0!8+!<``$&"`%"!?Q(T+`L``$&"`$2@'@``H2L``'P`2`!!
+M@@`TH!X``E0`!?:A*P`"52D%]GP`2`!`H@`<?^/[>'_$\WA(```!.````2P#
+M``!`@@R@?^/[>#B```!@A(!82````7QR&W@L`P``0((`"#I```%_X_MX.(``
+M`&"$@`1(```!='4"('_C^W@X@$`02````3P``/Y@``!@?',`.'_C^W@X@$`4
+M2````7QP&WA_X_MX.(!`&$@```%\;QMX?^/[>'\DRWA(```!?^/[>$@```%_
+MX_MX?\3S>$@```$Y(``#+`,``$&""_2@'@`"5``%]BP``4!!@@!408$`*"P`
+M`,!!@@!D08$`$"P``*!!@@!02```:"P``-!!@@!42```7"P`",!!@@!`08$`
+M#"P``5!(```0+``)0$&"`!`L``E008(`$$@``#0ZP``!2```"#K```(Z(``!
+M2```*#K```-(```0.L``!$@```@ZP``%.B```D@```PY(``,2``+7'_C^W@X
+M@```8(28`#B@``=(```!.Z```#T@```[:0``'!T`&'R;`"X<'0`&?`"R%%0`
+M$#I\NP`N?^/[>$@```$[G``!<X``/T"B``PX8``!2````3N]``$H'0`80('_
+MQ#N@```](```.VD``%>@&#A\FP`N+!<``$&"`#`])/__.`E_X"```!A\``$0
+M?```T#DI?RPA*0`(?2E)$'TI`-!\"D@Y08(`+%>I&#A]*=H4@*D`!'_C^WA(
+M```!.YP``7.``#]`H@`,.&```4@```$[O0`!*!T`PT"!_Y2`&BRL?`D#IG_C
+M^WA^Q+-X?B6+>'^&XWA.@`0AH!X``G`)0`!`@@`,<`J``$&B`!!_X_MX?\3S
+M>$@```&@'P'2*```04"A`1Q_X_MX.(```&"$F"P\H``"8*6@`D@```&@'@``
+M+``)M$"B`#").A*2H!H2G'T@2%`\`&9F8`!F9WP)`)9\``YP?2G^<'P)`%!\
+M"0<T2```((DZ$I(\`&9F8`!F9WP)`)9\``YP?2G^<'TI`%"@'@`"<```T"P`
+M`,!`H@`LB+H2DGRE`-!4I34R?`D`T%0`DAI\I0-X?^/[>#B```!@A)E,2```
+M%'_C^W@X@```8(293#B@``!(```!?^/[>#B```!@A*(H2````51E!>I_X_MX
+M.(```&"$HBA(```!?^/[>#B```!@A*(H2````51E!9Q@I0@`?^/[>#B```!@
+MA*(H2````7_C^W@X@```8(2`8#B@``](```!H!\!TB@``$)`H0`8?^/[>#B`
+M``!@A*)4.*```$@```%_X_MX.(```&"$F'@XH``.2````8`?`<PO@``*09X`
+M'"P```E!@@`40)X`9*`?`=`H```#08$`6*`>``!H"0F>(4D``'TJ211H``FC
+M(6```'P+`11]*0-X(`D``'^@211_X_MX.(```&"$HDQ(```!?`/H`$&"`!A_
+MX_MX.(```&"$HDQ_I>MX2````7_C^WA^A*-X.*$`"$@```$Y(``#+`,``$&"
+M"%@L&0`&08(`&(`?`@0L````0:(`#'_C^WA(```!5L4$/H`:++A\"0.F?^/[
+M>'Z$HW@XP0`(3H`$(3D@``,L`P``08((%*`>``)P"0!`08(`7(`?`<PO@``*
+M09X`*"P```E!@@`@0)X`$*`?`=`H```#0($`$*`:$G`H`%`"0($`(*`>``)P
+M``"@+```H$&"`!!_X_MX?H2C>$@```%_X_MX?\3S>$@```%_X_MX?H2C>$@`
+M``$Y(``#+`,``$&"!Y@L%P``0:(`%'_C^W@X@!%`?<5S>$@```&(NBPPB!HL
+M,50`0"Y\I0-XB!HL,E0`@!Y\I0-XB!HL,U0`P`Y\I0-X?^/[>#B```!@A(``
+M2````8BZ+#54I4`NB!HL-'RE`WA\I:MX@!HOS'RE`WADI0"`?^/[>#B```!@
+MA(`$2````7_C^WA_),MX2````8BZ+#R(&BP]5`!`+GRE`WB(&BP^5`"`'GRE
+M`WB(&BP_5`#`#GRE`WA_X_MX.(```&"$@.!(```!B+HL052E0"Z(&BQ`?*4#
+M>'_C^W@X@```8(2`Y$@```%_X_MX.(!`$$@```%\99MX?^/[>#B`0!!(```!
+M?^/[>#B`0!1^!8-X2````7_C^W@X@$`8?>5[>$@```%_X_MX.(```&"$@%A^
+M19-X2````8BZ+#:(&BPW5`!`+GRE`WB(&BPX5`"`'GRE`WB(&BPY5`#`#GRE
+M`WA_X_MX.(```&"$@`A(```!B+HL.U2E0"Z(&BPZ?*4#>'_C^W@X@```8(2`
+M#$@```%_X_MX.(```&"$@!B`NB_42````7_C^W@X@`"`.*#__T@```%_X_MX
+M?H2C>$@```$Y(``#+`,``$&"!="(GQ(X?^/[>#B@``%(```!?^/[>'_$\WA(
+M```!H3\!U%4I!C8Y*?_0*`D`/T&!`&"!/Q(TH`D``G`)0`!`@@`,<`J``$&B
+M`$B!/Q(TH`D``G`+0`!_H``F5[T?_CN]``Q_X_MX.(```&"$F"1(```!5&4`
+M-E>]!SY\I>MX?^/[>#B```!@A)@D2````7_C^W@X@```8(29%$@```%4?02^
+MH!X``G`)`"!!@@`<5ZD0.CP`NBY@`(NC?2D`%E4]X3Y(```4/`#,S&``S,U\
+M'0`65!WH_G_C^W@X@```8(28'#B@``%(```!@3\2-*`)``)7HP@\<`E``$""
+M`!R!/Q(TJ`D``CA]`&0L````0*``#%>C$#HX8P!D2````7_C^W@X@```8(28
+M"$@```%\?!MX?^/[>#B```!@A)@(.*`X`$@```$[H```2```##A@`,A(```!
+M?Z#K>#N]``$L```308$`''_C^W@X@```8(2<)$@```%P8``00(+_U'_C^W@X
+M@```8(28"'^%XWA(```!?^/[>#B```!@A)A@2````6!E``-_X_MX.(```&"$
+MF&!(```!H!X``G```*`L``"@08(`8(`:+\`L```"08(`5'_C^W@X@```8(29
+M($@```%@9?``?^/[>#B```!@A)D@2````7_C^W@X@```8(29($@```%D90`!
+M?^/[>#B```!@A)D@2````3@```%(```(.````)`:+\!_X_MX2````3N@```[
+M@``!5Z00.CB$$`!_A>@P?^/[>$@```$[O0`!+!T`"4"!_^0X````D!I&H#N@
+M``"@'P'H?!T``$"@`"!_X_MX?Z3K>$@```$[O0`!H!\!Z'P=``!!@/_H/```
+M"&``"660&BQ$+!D`!D"B`!`\```(8``999`:+$1_X_MX.(``H("Z+$1(```!
+M?^/[>#B``*Q(```!9&4`!W_C^W@X@`"L2````8`?$DPL````0:(`#'_C^WA(
+M```!?^/[>#B```!@A)A@.*```3C```!(```!?^/[>'\DRWA(```!?^/[>#B`
+M``!@A(`@2````51E`DQ_X_MX.(```&"$@"!(```!@!\!S"@```5!@0`8+```
+M!4"B`#R@'P'0*```!T"!`#!_X_MX.(```&"$@1@\H``!8*4`JD@```%_X_MX
+M.(```&"$@1PXH#(02````7_C^W@X@```8(2!"#B@`%)(```!H!X``G`)`0!!
+M@@`,B!H2CD@```B(&A*/?`4'='_C^WA_Q/-X2````7QC!W2`&B_@5`4&OJEZ
+M+_1]*RA0B!0`!GP`!W1\"0!`0($`"'R@6A2(%``%?``'=%0`"#Q]8P!0?`58
+M0$"!``RH&B_T?*L"%(`:+^!4"L:^J7HO]'TK4%"(%``&?``'='P)`$!`@0`(
+M?4!:%(@4``5\``=T5``(/'UC`%!\"EA`0($`#*@:+_1]2P(4@!HOX%0+AKZI
+M&B_T?2A84(@4``9\``=T?`D`0$"!``A]8$(4B!0`!7P`!W14``@\?&,`4'P+
+M&$!`@0`,J!HO]'UC`A0H!0`_0($`"#B@`#\H"@`_0($`"#E``#\H"P`_0($`
+M"#E@`#]4I0:^54!$KGRE`WA58(*>?*4#>'_C^W@X@```8(2`Z$@```&`NB_0
+M+`4``$&B`!1_X_MX.(```&"$@2!(```!@)HO^"P$__]!@@`,?^/[>$@```&`
+MFB_\+`3__T&"``Q_X_MX2````8":,``L!/__08(`#'_C^WA(```!@+\!^"P%
+M``!!H@`4?^/[>#B```!@A(!(2````9,_`=PL%P``08(`=(@4``1P"0`"0((`
+M#%0``#R8%``$H!0``K`>``*(%``$F!X`!(@4``68'@`%B!0`!I@>``:(%``'
+MF!X`!X%_$C0Y(```.4```)$K`#"12P`T@[\2-'_C^WA(```!D'T`*)"=`"Q_
+MX_MX.(```4@```$X```!2```&(`8```L````08(`")$X```X````?`,#>(`!
+M`&1\"`.F@<$`&('A`!R"`0`@@B$`)()!`"B"80`L@H$`,(*A`#2"P0`X@N$`
+M/(,!`$"#(0!$@T$`2(-A`$R#@0!0@Z$`5(/!`%B#X0!<."$`8$Z``""4(?_@
+M?`@"II/!`!B3X0`<D`$`)'Q^&WB#XP($<^```T&B`"PX@```8(291$@```%4
+M90#"5^#HA'RE`WA_P_-X.(```&"$F41(```!<^``#$&"`$AP"0`$0((`''_#
+M\W@X@```8(2`T$@```%490>T2```&'_#\W@X@```8(2`T$@```%@90`<?\/S
+M>#B```!@A(#02````8`!`"1\"`.F@\$`&(/A`!PX(0`@3H``()0A__!\"`*F
+MD`$`%($C++1]*0.F3H`$(3$C__]\"1D0?`,#>(`!`!1\"`.F."$`$$Z``""4
+M(?_0?`@"II-!`!B380`<DX$`().A`"23P0`HD^$`+)`!`#1\?QMX?)LC>#O`
+M``%\>AMX2````7Q\&W@[H```H!\!Z'P=`$!`H``H?^/[>'^DZWA(```!+`,`
+M`$""`"0[O0`!H!\!Z'P=`$!!@/_@.````"P>``!!H@'P2```##O```!+___L
+M?^/[>#B```!@A)E\.*```4@```$[H```?^/[>#B```!@A)P@2````2P#``!`
+M@@`8.&``!4@```$[O0`!*!T`8T"!_]@X````*!T`8T&A`91_X_MX?X3C>$@`
+M``$X````+`,``$&B`7Q_X_MX.(```&"$F11(```!5&,$OJ`<``(](,S,82G,
+MS7TC2!95*>C^<`L`($&"`!A4:1`Z/`"Z+F``BZ-]*0`652GA/CAI`&1(```!
+M?^/[>'^$XW@XH0`(2````3@````L`P``0:(!%'_C^W@X@```8(29?#B@``!(
+M```!H!P``G`)`$!!@@!<@!\!S"^```I!G@`H+```"4&"`"!`G@`0H!\!T"@`
+M``-`@0`0H!H2<"@`4`)`@0`@H!L``G```*`L``"@08(`$'_C^WA_A.-X2```
+M`7_C^WA_9-MX2````7_C^W@X@```8(288$@```%@90`"?^/[>#B```!@A)A@
+M2````8@<``1P"0`"0((`#%0``#R8'``$H!P``K`;``*('``$F!L`!(@<``68
+M&P`%B!P`!I@;``:('``'F!L`!X%_$C0Y(```.4```)$K`#"12P`T@[\2-'_C
+M^WA(```!D'T`*)"=`"Q_X_MX.(```4@```$X```!?`,#>(`!`#1\"`.F@T$`
+M&(-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`,$Z``""4(?_@?`@"II/!`!B3X0`<
+MD`$`)'Q^&WA\GR-X.(```&"$@`1(```!5&,$&BP?``%!@@"`08$`$"P?``!!
+M@@!$2```A"P?``9!@@`0+!\`"$&"`&!(``!P9&40`7_#\W@X@```8(2`!$@`
+M``%_P_-X.(``%$@```%490;R2```*&1E$`)_P_-X.(```&"$@`1(```!?\/S
+M>#B``!1(```!8&4`('_#\W@X@``42```%&1E$`!_P_-X.(```&"$@`1(```!
+M@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_\'P(`J:0`0`4.(```D@`!R&`
+M`0`4?`@#IC@A`!!.@``@E"'_X'P(`J:3X0`<D`$`)'Q_&W@X@```.*```4@`
+M``$X````+`,``$&B`!1_X_MX.(``$T@`!ME\8!MX?`,#>(`!`"1\"`.F@^$`
+M'#@A`"!.@``@E"'_T'P(`J:300`8DV$`').!`""3H0`DD\$`*)/A`"R0`0`T
+M?'X;>'R=(W@X@``32``&B3@````L`P``0:("A'_#\W@X@```.*```4@```$X
+M````+`,``$&B`FA_P_-X.(```$@`!E4X````+`,``$&"`E`L'0``08("1(`>
+M`<PO@``*09X`'"P```E!@@`40)X`-*`>`=`H```#08$`*#M```B@'0`"<`D`
+M($""`&QP``#0.V``!"P``,!`H@#42```6*$^`=15*08V.2G_T"@)`#]`@0`H
+M@!X!S&@)``<A:0``?2M)%&@```LA8```?`L!%'TK`WE!@@!0.T``"*`=``)P
+M"0`@0((`$'```-`L``#`0*(`##M@`.M(``!TH!T``CM@`>IP"4``0((`9*@=
+M``)\``#X?!O^<%=[`"P[>P+J2```3#M```"@'0`"<`L`($""`!!P``#0+```
+MP$"B``P[8`"K2```**`=``([8`&J<`E``$""`!BH'0`"?```^'P;_G!7>P`L
+M.WL"JJ`=``)P"P!`08(`('`)`"!`@@`0<```T"P``,!`H@`,8UH`!$@``!2@
+M'0`"<`D`0$""``AC6@`!H!T``G`+`0!`@@`(8UH``J`=``)P"0`0?^``)E?_
+M'_Y__P#05_\'^CO_``-_P_-X.(```&"$F'Q(```!?'P;>*`=``)P"0`@0((`
+M$'```-`L``#`0*(`5'_#\W@X@```8(28!'_E^WA(```!?\/S>#B```!@A*(`
+M?T73>$@```%\'-@`08(`<'_#\W@X@```8(28?']EVWA(```!.&`!+$@```%(
+M``!0?`/8`$&"`"!_P_-X.(```&"$F'Q_9=MX2````3A@`2Q(```!?\/S>#B`
+M``!@A)@$?^7[>$@```%_P_-X.(```&"$H@!_1=-X2````3@```%\`P-X@`$`
+M-'P(`Z:#00`8@V$`'(.!`""#H0`D@\$`*(/A`"PX(0`P3H``()0A_]!\"`*F
+MDP$`$),A`!2300`8DV$`').!`""3H0`DD\$`*)/A`"R0`0`T?'T;>'R9(WA\
+MORMX?'H;>#@```"0!0``2````7Q\&W@X8```+!P``$&"`TB`'2_`:`D``B$)
+M``!]*$D4(4```'P*`11]*P-Y08(`##@```&0'P``@]HOP"P>``%`H@'$?Z/K
+M>#B```!@A)D@2````71C``%`@@&LD'HOP)/?```[P```?Z/K>#B```!@A)P0
+M2````7Q[&WA_H^MX.(```&"$G!1(```!?'\;>'^CZW@X@```8(2<&$@```%\
+M>!MX,1O__WP(V1`Q7___?2KY$'P+2#E`@@`T?Z/K>#B```!@A)D@2````61E
+M``%_H^MX.(```&"$F2!(```!.]X``2P>``E`@?^`5VGX?E?@^'Y]*0(452G)
+M_E?CR?XQ"?__?`A)$#E@``$L`P`!0:$`"#E@``!\"E@Y08(!8'P8`-!\'@=T
+M?]Y+UBP>_^!`@``,.\#_X$@``!`L'@`?0($`"#O``!]_^QN6.___@"P?__!`
+M@``,.^#_\$@``!`L'P`/0($`"#O@``]_H^MX.(```&"$F2!(```!5&4&Z%?`
+M+71\I0-X?Z/K>#B```!@A)D@2````7^CZW@X@```8(29($@```%490`T5^`&
+M_GRE`WA_H^MX.(```&"$F2!(```!?Z/K>#B```!@A)D@2````6!E"`!_H^MX
+M.(```&"$F2!(```!.````I`:+\`X```!D!P`$)O<`!2;_``52```?*`9``)P
+M``"@+```H$&"`&R`&B_`+````D"B`&"`'``0+````$"B`%1_H^MX.(```&"$
+MF2!(```!8&7P`'^CZW@X@```8(29($@```%_H^MX.(```&"$F2!(```!9&4`
+M`7^CZW@X@```8(29($@```$X```!D!HOP'^CZWA_A.-X2````:`<``)P"``"
+M0*(`J'^CZW@X@```8(288$@```%@90`"?Z/K>#B```!@A)A@2````:"9``)P
+M@`$`0((`(*$]`=15*08V.2G_T"@)`#]!@0!\<(@`0$&"`'2!?0',:6``!S%`
+M__]]*@$0?2!+>&EI``LQ2?__?0I)$'T)0WA\"$@Y08(`2"^+``I!G@!`+`L`
+M"4&"`#A`G@`0H!T!T"@```-`@0`H?Z/K>$@`)?5(```<H!D``F````*P&0`"
+MH!P``E0`!_JP'``".&```8`!`#1\"`.F@P$`$(,A`!2#00`8@V$`'(.!`""#
+MH0`D@\$`*(/A`"PX(0`P3H``()0A_^!\"`*FDZ$`%)/!`!B3X0`<D`$`)'Q^
+M&WA\GR-X?(`C>"P$``!`@@`(.`#__Y`!``B`'@',+```"4&"`!@L```*0*(`
+M%*`>`=`H```#08$`"%?_!S1_P_-X.(``#$@```%_P_-X.(!``'_E^WA(```!
+M.&``#T@```&``0`(5``'OI`!``A7_P>^?\/S>#B`0`!\!0-X?^;[>$@```%\
+M?1MX<^```4"B`&PX```48````9`!``B(H0`(.2$`"(@)``%4`$`N?*4#>(@)
+M``)4`(`>?*4#>(@)``-4`,`.?*4#>'_#\W@X@``42````7_#\W@X@```.*``
+M`4@```$L`P``0:(`$'_#\W@X@`#`2````7^CZWB``0`D?`@#IH.A`!2#P0`8
+M@^$`'#@A`"!.@``@E"'_\'P(`J:0`0`4.(```&"$F&1(```!5&-M_G!@`0!!
+M@@`,:&`!_WP#`/B``0`4?`@#IC@A`!!.@``@H`0``E0`!?0L``#`08(`+$&!
+M`!`L``"@08(`&$@``"PL``%`0*(`)*`#$LQ(```0H`,2SD@```B@`Q+0L`4`
+M`#A@``%.@``@.&```$Z``""4(?_@?`@"II.A`!23P0`8D^$`')`!`"1\?1MX
+M?)XC>#B```!@A)A@2````3O@``!P8``"0*(`2'^CZWA(```!?'\;>'^CZWA_
+MQ/-X.*$`"$O__V$L`P``08(`'*@!``A\`/@`0(``%*`>``)@```"L!X``CO@
+M``"S_@`6?^/[>(`!`"1\"`.F@Z$`%(/!`!B#X0`<."$`($Z``""4(?_@?`@"
+MII.A`!23P0`8D^$`')`!`"1\?AMX?'T;>(`#`>!T"2``0:(`E#B`!"`XH``!
+M2````7_#\W@X@`8`.*```$@```%_P_-X.(`&`$@```%@90`(?\/S>#B`!@!(
+M```!?\/S>#B`!@0\H``08*4"`4@```%_P_-X.(`&(#B@``!(```!.^```'_#
+M\W@X@`0`?^7[>$@```%]/^H4B*DO.'_#\W@X@`0$2````3O_``$L'P!_0('_
+MU(`!`"1\"`.F@Z$`%(/!`!B#X0`<."$`($Z``""4(?_@?`@"II/!`!B3X0`<
+MD`$`)'Q_&WA\GB-X.&```#CE__]4Y^C^.*7__U2E!WY\B"-X.8```"P$``!`
+M@0!L.(```53&&#A]14(4*`H`"$"!``@Y0``(?(E0,#DI__]\BR@P.6O__WTI
+M6GA]*3`P5.`0.GP?`"Y]*0`X?2DT,'TI+#!]*6`P?&-+>'P%4%!]C`(4?`@J
+M%#B@```XYP`!-0#_^$&!_Z1_Q/-X2````8`!`"1\"`.F@\$`&(/A`!PX(0`@
+M3H``()0A_]!\"`*FDV$`').!`""3H0`DD\$`*)/A`"R0`0`T?'T;>'R<(WA\
+M>QMXH`4``E0`!?0L``#`08(`+$&!`!`L``"@08(`&$@``+PY(```+``!0$&"
+M`!1(``"L.2```4@```@Y(``"52D(/'TIVA2CR1+JH`D2\%0`,#)_W@-XH`D2
+M]E0`8"9_W@-XH`D2_%0`D!I_W@-XH`D3`E0`P`Y_W@-XH^D3"*`)$PY4`#`R
+M?_\#>*`)$Q14`&`F?_\#>*`)$QI4`)`:?_\#>*`)$R!4`,`.?_\#>"P<``%!
+M@@`8*!P``4&``"@L'``"08(`$$@``!1_W_-X2```%'_^^WA(```,.&```$@`
+M`'A\'_``0*(`''^CZW@X@```8(2B"$@```%4903B2```&'^CZW@X@```8(2B
+M"$@```%@92``?Z/K>#B```!@A*((2````9.;+[Q_H^MX.(```&"$F6!_Q?-X
+M2````7^CZW@X@```8(299'_E^WA(```!.&```8`!`#1\"`.F@V$`'(.!`""#
+MH0`D@\$`*(/A`"PX(0`P3H``()0A__"``P',+P``"D&:`&0L```)?2``)I$A
+M``A!@@!40)H`$*`#`=`K@``#0)T`1(`#`<QH"0`'(6D``'TK211H```+(6``
+M`'P+`11]*P-X+XL``$">`!RA(P'452D&-CDI_]`Y8``@*XD`/T&=``@Y8``H
+MH20``'P)6Y9\`%G6?2!(4#`)__]\8$D0.2G_]B$I``Q]*4D0?2D`T'QC2#@X
+M(0`03H``()0A_\!\"`*FDL$`&)+A`!R3`0`@DR$`))-!`"B380`LDX$`,).A
+M`#23P0`XD^$`/)`!`$1\?QMX?)LC>'Q^&WB@!``"5!G/_E0`!?8L``%`08(`
+M4$&!`"@L``#`08(`Z$&!`!`L``"@08(`U$@``.`L``#008(`T$@``-0L``C`
+M08(`Q$&!``PL``%02```$"P`"4!!@@`,+``)4$"B`+`ZX```H3\!U%4I!C8Y
+M*?_0*`D`/T"!`*"!?P',:6``!S$@__]]"0$0?0!#>&EI``LQ"?__?4A)$'U)
+M4WA\"D@Y08(`="^+``I!G@!L+`L`"4&"`&1`G@`0H!\!T"@```-`@0!4?^/[
+M>#B```!@A)E$2````51E!W*!/BPLJ`D``%0`'KA\I0-X?^/[>#B```!@A)E$
+M2````4@``!PZX``!2```%#K@``)(```,.&```$@``]Q_X_MX.(```&"$F1!(
+M```!.`#\!GQE`#A6_0@\?[WR%*`=$N14`"`V?*4#>&"E``%_X_MX.(```&"$
+MF1!(```!?^/[>(">+[Q_9=MX2````:"]$LQ4I07^8*4"`'_C^W@X@```8(29
+M:$@```&@'A)P*`!/_T"!`$"@&P`"<`@`$$&"`#17*0@\?2GR%#E)$T"CJ@`$
+M?7GR%(@+$TQ\'`=TB`L33GP:!W2C"@`(HLD34$@``#A6Z0@\?2GR%*.I$J)]
+M-_(4B`D2QGP<!W1].?(4B`D2R7P:!W17*0@\?2GR%*,)$JBBR1,R?^/[>#B`
+M``!@A)A$2````51E!F)7H#RP?*4#>'_C^W@X@```8(281$@```%_X_MX.(``
+M`&"$F%!(```!5&4`+E>`!CY\I0-X?^/[>#B```!@A)A02````7_C^W@X@```
+M8(284$@```%4908>5T!$+GRE`WA_X_MX.(```&"$F%!(```!?^/[>#B```!@
+MA)A(2````51E!1I7`&.F?*4#>'_C^W@X@```8(282$@```%6_0@\?[WR%#N=
+M$K"@'``*5`7`#E0`@!Y\I0-XH3T2P%4@0"Y\I0-X?*5+>'_C^W@X@```8(28
+M-$@```%_X_MX.(```&"$F"A(```!5&4&'J`=$JY4`$`N?*4#>'_C^W@X@```
+M8(28*$@```%_X_MX.(```&"$F&1(```!5&4%&*`<``14`&-F?*4#>'_C^W@X
+M@```8(289$@```$[H``"H!X2<"@`,`)!@0`DH!\!RBP`$")`H@`\H!L``G`(
+M`$!!@@`P.Z``"$@``"A_X_MX?V3;>$@```$L`P``08(`%%;I"#Q]*?(4H`D3
+M)G^]`A1_X_MX.(```&"$F21(```!5&4'[E>@#CQ\I0-X?^/[>#B```!@A)DD
+M2````8`;`!`L````08(`&(@;`!1\'0=TB!L`%7P<!W1(```85RD(/'TI\A0Y
+M*1.PHZD`!J.)``I_X_MX.(```&"$F2!(```!5&4&Z%>@+71\I0-X?^/[>#B`
+M``!@A)D@2````7_C^W@X@```8(29($@```%490`T5X`&_GRE`WA_X_MX.(``
+M`&"$F2!(```!?^/[>#B```!@A)D@2````6!E"`!_X_MX.(```&"$F2!(```!
+MH3X2<"@)0`!`@0!(H!L``G```-`L``#00((`#"@)3_]`@0`P?^/[>#B```!@
+MA*(,2````51E`XY6P)(:?*4#>'_C^W@X@```8(2B#$@```&@'A)P*`!0`$"A
+M`!A_X_MX.(```&"$F>`XH```2````3A@``&``0!$?`@#IH+!`!B"X0`<@P$`
+M((,A`"2#00`H@V$`+(.!`#"#H0`T@\$`.(/A`#PX(0!`3H``()0A_Y!\"`*F
+MDD$`.))A`#R2@0!`DJ$`1)+!`$B2X0!,DP$`4),A`%2300!8DV$`7).!`&"3
+MH0!DD\$`:)/A`&R0`0!T?'P;>'R9(W@ZP```.N```#@```"0`0`(D`$`#)`!
+M`!"0`0`4.F```#J````Z0```/6```#DK"'B`"0`$D`$`+(`+"'B0`0`H/2``
+M`#EI"("`"0B`H2L`!)`!`!BQ(0`<H\0``J$D``!7WL__08(`$!TI``HY*:8H
+M2```#!TI``HY*4"853@$/J`9`#A\'P-X+````$""`(A(```,?'\;>$@``'@[
+MX```8_^``#D@`%>@&0`"<`L`$$&"``@Y(`"N.Z```#M@``!C>X``?TG`4'ZX
+M2A2`'`'$?`D#IG^#XWA_I.MX?\7S>$Z`!"%\`]@`08(`*%1C!+Y\&A@`08$`
+M#'P5&`!`H/^8.!T``50=!#XH'0`$0('_P+/Y`#@X````8`"``'P?``!`H@&<
+M?X/C>#B```!@A)D@2````71@0`!!H@54?X/C>#B```!@A)D,2````51E`CY_
+M@^-X.(```&"$F0Q(```!?X/C>#B```!@A)D@2````51E`0!_@^-X.(```&"$
+MF0Q(```!?X/C>#B```!@A)F@.*```$@```%_@^-X.(```&"$F8`XH```2```
+M`7^#XW@X@```8(29A$@```%490`6?X/C>#B```!@A)F$2````7^#XW@X@```
+M8(29F#B@``!(```!?X/C>#B```!@A)F<2````51E`!9_@^-X.(```&"$F9Q(
+M```!?X/C>#B```!@A)D`.*```$@```%_@^-X.(```&"$F00XH```2````7^#
+MXW@X@```8(29"#B@``!(```!?X/C>#B```!@A)D,2````51E`")_@^-X.(``
+M`&"$F0Q(```!?X/C>#B```!@A)F(.*```$@```%_@^-X.(```&"$F8PXH```
+M2````7^#XW@X@```8(29D#B@``!(```!?X/C>#B```!@A)F42````51E`")(
+M``/$?7CX4*`9``)4``7V+```T$&"`(Q!@0`0+```P$&"`$!(``"@+``!0$&"
+M`!`L``%008(`;$@``(Q5=(@</`!1ZV``A1]\%`"6?``><'Z)_G!^B0!0?I)6
+M<$@``#Q5<D`N/``)3V``()5\$@"6?``.<'Y)_G!^20!0572('#P`4>M@`(4?
+M?!0`EGP`'G!^B?YP?HD`4#I@##5(```H572`'CP`4>M@`(4??!0`EGP`'G!^
+MB?YP?HD`4'Z25G`Z8!AJ'`L#Z%0`(#9\`)O6.4``!#D!`"AP"0`/0((`##E`
+M``,Y`0`8.Z```'P=4`!`@`$H?`LF<#C@``$L"P`<08$"U'TKZA0Y*0`9*`D`
+M($&!`"A\X$@P+`D`&4"!`!0L"0`:0($`*#@)__]\X``P?!:S>$@``!@X"?_?
+M*```$T&!``Q\X``P?!>[>#@)``$H```/08$`*%>@"#Q\"`(N52D(/#DI``)\
+M`$@P@2$`"'P`2WB0`0`(2```D#@)__$H```/08$`*%>@"#Q\"`(N52D(/#DI
+M_^)\`$@P@2$`#'P`2WB0`0`,2```8#@)_^$H```/08$`*%>@"#Q\"`(N52D(
+M/#DI_\)\`$@P@2$`$'P`2WB0`0`02```,#@)_]$H```&08$`)%>@"#Q\"`(N
+M52D(/#DI_Z)\`$@P@2$`%'P`2WB0`0`4.!T``50=!#Y\'5``08#^Z'^#XW@X
+M@```8(29#$@```%D9?\`?X/C>#B```!@A)D,2````7^#XW@X@```8(29($@`
+M``%D97``?X/C>#B```!@A)D@2````59%H)96@`,^?*4#>&2E0`!_@^-X.(``
+M`&"$F:!(```!?X/C>#B```!@A)F`?L6S>$@```%_@^-X.(```&"$F81(```!
+M5&4`%E;]`SY\I>MX?X/C>#B```!@A)F$2````7^#XW@X@```8(29F'[%LWA(
+M```!?X/C>#B```!@A)F<2````51E`!9\I>MX?X/C>#B```!@A)F<2````7^#
+MXW@X@```8(29`("A``A(```!?X/C>#B```!@A)D$@*$`#$@```%_@^-X.(``
+M`&"$F0B`H0`02````7^#XW@X@```8(29#$@```%490`B@`$`%%0`!+Y\I0-X
+M?X/C>#B```!@A)D,2````7^#XW@X@```8(29B("A``A(```!?X/C>#B```!@
+MA)F,@*$`#$@```%_@^-X.(```&"$F9"`H0`02````7^#XW@X@```8(29E$@`
+M``%490`B@`$`%%0`!+Y\I0-X?X/C>#B```!@A)F42````8`!`'1\"`.F@D$`
+M.()A`#R"@0!`@J$`1(+!`$B"X0!,@P$`4(,A`%2#00!8@V$`7(.!`&"#H0!D
+M@\$`:(/A`&PX(0!P3H``()0A_^!\"`*FDX$`$).A`!23X0`<D`$`)'Q_&W@_
+MH&0`H`0``G`)`!!!@@`(/Z#(`*`$``)P"4``08(`#%>]^'Y(```4J`0``BP`
+M``!`H``(5[WPOJ`$``!\G0.6.X``'WR`Y#!P"0`!0((`##><__]`@O_P(YP`
+M)B`<`!<[H``!?[T`,'^DZA0@'``8?[T$,#N<__!_X_MX.(```&"$F!1(```!
+M5&4#_E>]B!Q\I>MX?^/[>#B```!@A)@42````7_C^W@X@```8(28%$@```%4
+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
+M00`XDV$`/).!`$"3H0!$D\$`2)/A`$R0`0!4?)XC>'R_*WA\W3-X?/<[>#E`
+M``!\"C``0(``*#D!``A52P@\'2H`"GTI^A2@"0`(?`M#+CE*``%\"N@`08#_
+MY*!^```X@0`(?Z7K>#C!`!@XX0`:2````3L@```[````.4```'P9Z`!`@`!(
+M.0$`"*%A`!BA(0`:54`(/'P(`BY\"P``0*(`"%58!#Y50`@\?`@"+GP)``!`
+MH@`,55D$/D@``!`Y2@`!?`KH`$&`_\R@?@``HV$`&*-!`!H?&``*?YCZ%*#<
+M``8?.0`*?[GZ%*#]``9_9-MX?T73>$O__H6P=P`&H'X``*#<``2@_0`$?V3;
+M>']%TWA+__YIL'<`!*!^``"@W``"H/T``G]DVWA_1=-X2__^3;!W``*@?@``
+M?-CZ+GSY^BY_9-MX?T73>$O__C&P=P``@`$`5'P(`Z:"X0`L@P$`,(,A`#2#
+M00`X@V$`/(.!`$"#H0!$@\$`2(/A`$PX(0!03H``(!QC`&14I0@\?60J%*`$
+M```=(`!D.2G_]GP#2$!!@``8H`O__AT@`&0Y*0`*?`-(0$"!`"2P!P``L`8`
+M`$Z``""@!```L`8``*`$``*P!P``3H``('P$6$!,@``@?&H'-*`$``!\"0<T
+M'2D`9'TJ2%`Y*0`)*`D`$D"A_[RA)``"'2D`9#DI__9\`TA`0:#_M#B$``)\
+M!%A`3(``($O__\0Y8RP0H2,!U%4I!C8Y*?_0*`D`/T&!`#P](```@`D`!)`#
+M+!`<```D/2```#DI``A\`$H4D`L`'#@```&0"P`8.```%)`+``PX``!52```
+M.#T@``"`"0`$D`L``!P``"0](```.2D`"'P`2A20"P`<.````9`+`!@X```4
+MD`L`##@``".0"P`03H``()0A_^!\"`*FD^$`')`!`"1\GR-XH2,!U%4I!C8Y
+M*?_0*`D`/T&!`$R!8RRP?6D#ICB```=.@`0A.(```3B@`"0XP```2__>D3D`
+M```Y(`!K.4```#E@`&LL`P`!0*(`A#D@`%,Y8`!3.```-T@``'"``RRP?`D#
+MICB```=.@`0A.(``!CB@`"4XP```2__>23D````Y(P`$+`,`/T"B``@Y(``R
+M?0I#>"P#`#]!@@`(.4``0#EJ`#)]`$-X+`,`/T"B``@X"``4D!\`##@+__$L
+M`P`_08(`"#@+``60'P`0@)\`!#A@``!\""`0?``!$'P``-!])$@0?2E)$'TI
+M`-!\"$MY08(`*'P*(!!\``$0?```T'TD6!!]*4D0?2D`T'P+2WE!@@`(.&``
+M`8`!`"1\"`.F@^$`'#@A`"!.@``@E"'_X'P(`J:3H0`4D`$`)'Q]&WBHHR_T
+M@`,O\'RE`A14I4QL8*6``#B```!@A)DP2````3@```&0'2_$@`$`)'P(`Z:#
+MH0`4."$`($Z``""4(?_@?`@"II.!`!"3H0`4D\$`&)/A`!R0`0`D?'\;>'Q]
+M&W@[PRP0@!X`&#A@```L````08(!`(`?+\0L```!0*(`\'_C^W@X@```8(29
+M,$@```%P8(``0((`V%1I/GZ1/@`$5&!/OBP```)`H@`LH!\!TB@``$%`@0`4
+MH!\2FGP`2A20'@`$2```$($^``0Y*0`%D3X`!*$]`=15*08V.2G_T"@)`#]!
+MH0`L?Z/K>$@``E&!/@`$@!X`%'P)`$!!@``,?`!(4$@```@X````D!X`!#@`
+M``"0'R_$?Z/K>'_$\WA+__V-?'P;>"P#``!`H@!`?Z/K>'_$\WA(``!9+`,`
+M`$&B`"Q_H^MX?\3S>$@``&TL`P``0($`&#@```*0'R_$.````9`?+]B3GR_`
+M@'\OQ(`!`"1\"`.F@X$`$(.A`!2#P0`8@^$`'#@A`"!.@``@.&```($D``2`
+M!``,?`D`0$"!`!"`!``0?`D`0$V``"`X8``!3H``(*$C`=15*08V.2G_T#U@
+M```Y"P``*`D`/T"!``P](```.0D``(%D```=*P`D?2A*%#DI``B1)``<@20`
+M!(`$`!!\"0!`08``B#A@__\L"P``38(`(($D``21)``(@`0`$'P'`WA\"0!`
+M08``7(`$```L````08(`4($D```Y2?__D40``!UJ`"1]:T(4@20`'(`+`!B!
+M*0`0?`D`4%0`"#R!)``(?2!(4)$D``@Y:P`(D60`''P).$!!@``,+`H``$""
+M_[@X8``!3H``(($D``2`!``,.&```'P)`$!-@0`@@2@``#DI__^`!```.&#_
+M_GP`2`!-@@`@@20`!)$D``B`!``,?`<#>'P)`$!!@0!P@2@``#DI__^`!```
+M?`L#>'P`2$!`@`!8.4L``9%$```=:@`D?6M"%($D`!R`"P`8@2D`$'P)`%!4
+M``@\@20`"'T@2%"1)``(.6L`")%D`!Q\"3A`08$`&($H```Y*?__?4M3>'P*
+M2$!!@/^P.&```DZ``""4(?_@?`@"II.A`!23P0`8D^$`')`!`"1\?QMX.\,L
+M$#@```"0'@`4@`,LL'P)`Z8X@``'3H`$(3B```$XH``D.,```$O_V@$L`P`!
+M0*(`>($^`!RKJ0``@!\LL'P)`Z9_X_MX.(``!TZ`!"$X@``$.*``(#C```!+
+M_]G-+!T``4&"`"0X````*!T``4&``#0L'0`"08(`&"P=``-!@@`@2```))!^
+M`!1(```<5&D(/#DI__N1/@`42```#%1@"#R0'@`4@`$`)'P(`Z:#H0`4@\$`
+M&(/A`!PX(0`@3H``()0A_^!\"`*FDX$`$).A`!23P0`8D^$`')`!`"1\?QMX
+M?+TK>'S<,WA\_CMX?(,C>'RD*WA(```!.1S__U4(Z/X[G/__5YP'?G^]ZWE`
+M@0!P.,```5?'&#A\'.H4+```"$"!``@X```(?,L`,#EK__]\R>`P.2G__WUK
+M2GA]:S@P50H0.GTJ^"Y]*5AX?&#@,'P`.#!\`%@X?`!+>'P*^2Y]/>(4(!P`
+M"'QC!#`[@```.0@``3>I__A!@?^@@`$`)'P(`Z:#@0`0@Z$`%(/!`!B#X0`<
+M."$`($Z``""4(?_0?`@"II-A`!R3@0`@DZ$`))/!`"B3X0`LD`$`-'Q\&WA\
+MFR-XH`0``G`)0`!!H@`,.(`"`$@``#2H!``"+````$"@``PX@`0`2```(*`$
+M``)P"0`0?(``)E2$'_Y\A`#05(0&/#B$``)(```!?'\;>#O```"``P``?!X`
+M`$"@`%0?O@`,?[WZ%#N]`""(W0`+?X/C>'_D^W@XH``...```$@```%\91MX
+MB)T`"%2$$#H\A``!.(2'`'^#XWA(```!.]X``8`?``!\'@``08#_M*`;``)P
+M"0`00*(`P'^#XW@X@``(2````7Q_&W@[P```@`,``'P>``!`@`"@'3X`#'TI
+M^A0[J0`@B3T`"%4I$#H]*0`!.VF'`(@=``4L````0*(`:(C=``M_@^-X?^3[
+M>#B@``XXX```2````7QE&WA_@^-X?V3;>$@```&('0`)+````$&B`#14`!`Z
+M?WL"%(C=``M_@^-X?^3[>#B@``XXX``!2````7QE&WA_@^-X?V3;>$@```$[
+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
+M```!.&```8`!`!1\"`.F."$`$$Z``""4(?_@?`@"II.A`!23P0`8D^$`')`!
+M`"1\?1MX?)XC>%2$$#HXA`H`2````7!_``-`H@`D?Z/K>#B`"$!(```!.```
+M`7P`\#!\:0`Y08(`"#O@``%_X_MX@`$`)'P(`Z:#H0`4@\$`&(/A`!PX(0`@
+M3H``()0A_]!\"`*FDV$`').!`""3H0`DD\$`*)/A`"R0`0`T?'\;>'R>(W@X
+MH``!?*4@,#B`"(!(```!.V`#Z'_C^WA_Q/-X2````2P#``!!@@`4.&``9$@`
+M``$W>___0(+_X'_C^WA_Q/-X2````2P#``!!@@%<@7\!S&E@``<A(```?`D!
+M%&EI``LA20``?2I)%'P*2WE`@@`D+XL`"D&>`!PL"P`)08(`%$">`22@'P'0
+M*````T&!`1@[@```?^/[>#B```!@A(!,2````7Q]&WA_X_MX.(```&"$@0`\
+MH``*8*4`9$@```%7O;*^5Z4$/F2E``%_X_MX.(```&"$@/Q(```!?^/[>#B`
+M``!@A(!,2````51CLKY\`^@`08(`$#N<``$H'``!0('_E'_C^W@X@```8(2`
+M2$@```%D90!`?^/[>#B```!@A(!(2````3A@`,A(```!?^/[>#B```!@A(#\
+M2````51E!!Q_X_MX.(```&"$@/Q(```!.Z``9$@``!0WO?__08(`(#A@``I(
+M```!?^/[>'_$\WA(```!+`,``$""_^!_X_MX.(```&"$@$A(```!5&4"D'_C
+M^W@X@```8(2`2$@```%_X_MX.(`(@#B@``!(```!,!O__WQ@V1"``0`T?`@#
+MIH-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`,$Z``""4(?_@DX$`$).A`!23P0`8
+MD^$`''T^2WA]7U-X@Z$`*(&!`#"#@0`TJ`,O]'T(`A0H"``_0($`"#D``#]4
+MH`4^50F`'GP`2WA5B9(0?2D#>(`!`"Q4`,C,?2D#>'&```%!@@`(92D!`%6&
+MR(1\QDMXD,0`"%3@H!:!00!$54K(#(%A`#Q5:^@$@2$`0%4IV`A5B+G.?`!3
+M>'P`6WA\`$MX?0@#>)$$``Q7Z8,>58!,('P`2WB0!``0D\0`%"P=__]!@@`8
+M5Z!K)'P`0WB0!``,9,!``)`$``AQB0`,08(`;#P`?P!@`/\`?`#F,#A@``!P
+M"0`!08(`6'&```A](``F52D?_GTI`-!5*0``/2F``%6`HE)\`$MX@20`"'P`
+M2WB0!``(@`$`.%0`!'Z!)``0?`!+>)`$`!!7@*`6@20`%'P`2WB0!``4.&``
+M`8.!`!"#H0`4@\$`&(/A`!PX(0`@3H``('TK2W@L!@``08(`*%3`HA:!)``0
+M?`!+>&``@`"0!``05*`H-($D`!1\`$MXD`0`%"P(``!!@@`H50#!#H$D`!!\
+M`$MX8`"``)`$`!!4X%`J@20`%'P`2WB0!``4+`H``$&"`"A50.`&@20`$'P`
+M2WA@`(``D`0`$%5@>""!)``4?`!+>)`$`!0X8``!3H``((`$``AD`"``D`0`
+M"$Z``"`L!@``08(`)($D``PA9P``?`LY%%0`8"9]*2MX?`!+>)`$``Q(``!$
+M+`<``$&"`"0X````D`0`")"D``R`"``0D`0`$(`(`!20!``42```'#D@``"1
+M)``(8*`0`)`$``R1)``0D20`%#@```"0!``<D`0`&#A@``%.@``@@`0`'#A@
+M``]P"0`!38(`((`$`!Q4`/T^L`4``*`$`!BP!0`".````)@%``2`!``8<`D`
+M`4""`$1P"0`"08(`##@```&8!0`$@`0`&'`)``A!@@`0B`4`!&````*8!0`$
+M@`0`&'`)``1!@@`0B`4`!&````28!0`$@`0`'%0`7[Z8!0`+B`4`"RP```%!
+M@@`T08$`$"P```!!@@`<2```4"P```)!@@`H+````T&"`"Q(```\B`0`%U0`
+M!OY(```L@`0`%%0`WOY(```8@`0`%%0`MOY(```,@`0`%%0`COYD`/__8`#_
+M@)@%``6`!``<5`">/I@%``:`!``85`#G/I@%``>`!``85`#'/I@%``B(!0`+
+M+````D&"`#!!@0`0+````4&"`#A(``!(+````T"B`$"!)``052E'/H@%``A\
+M`$H4F`4`"($D`!!5*6<^B`4`"'P`2A28!0`(@20`$%4IASZ(!0`(?`!*%)@%
+M``B`!``85`"G/I@%``F`!``<=`D!`'P``"94`!_^(````I@%``HX8```3H``
+M((`$``"!(T:@?`!(.)`$``"!(T:@?2``>)`#1J!.@``@E"'_X'P(`J:3H0`4
+MD`$`)'Q]&W@X@RR$2````7^CZW@X@```8(2!)#B@``!(```!?Z/K>#B```!@
+MA($H.*```$@```%_H^MX.(``0#B@``!(```!?Z/K>#B```!@A($P/*```D@`
+M``%_H^MX.(```&"$@3@\H`(`2````8`!`"1\"`.F@Z$`%#@A`"!.@``@E"'_
+MX'P(`J:3H0`4D`$`)'Q]&W@X@`!`.*``!D@```$XG2R$?Z/K>$@```%_H^MX
+M.(```&"$@20XH```2````7^CZW@X@```8(2!*#B@``!(```!@`$`)'P(`Z:#
+MH0`4."$`($Z``"!\:AMX.6```!TK`%A]*5(4H2DP**`$``!]8UMX?`D``$V"
+M`"`=*P!8?2E2%#DI,""@"0`(+````$"B`"2@!```L`D`"*`$``*P"0`*B`0`
+M!)@)``Q]8UMX3H``(#EK``$X8```*`L`/TV!`"!+__^<@&,P)$Z``""4(?_@
+M?`@"II.A`!20`0`D?'T;>#B#+(1(```!.[TL2'^CZWB``0`D?`@#IH.A`!0X
+M(0`@3H``()0A_]!\"`*FDT$`&)-A`!R3@0`@DZ$`))/!`"B3X0`LD`$`-'Q^
+M&WA\FB-X?'\;>(`#`>!4`,_^D`,P'#AC,"@X@!8`2````3E````[8``'.X``
+M`CN@`?0XX`#(.8``9#A@`"@X@``'.0```#R@`+]@I?X,/,``OV#&_SB`'@',
+M*```!D&!`!0=*@!8?2GZ%)MI,#!(```0'2H`6'TI^A2;B3`P'`H`6'U@^A0Y
+M*S`PDZD`#)#I`!"0Z0`4.2LP0)&)``B0:0`0D(D`##DK,""9"0`4F0D`%8@)
+M`!"8"0`2F0D`$X`?,!PL````08(`$#DK,&"0J0`,D,D`$#E*``$H"@`_0('_
+M>(`?,!PL````0:(`-'_#\W@X@```8(2!+("_,&Q(```!?\/S>#B```!@A($T
+M@+\P<$@```%_P_-X2````3@``&20'S`@+!H``$&"`!"`'S`88````4@```R`
+M'S`85```/)`?,!B``0`T?`@#IH-!`!B#80`<@X$`((.A`"2#P0`H@^$`+#@A
+M`#!.@``@E"'_X'P(`J:3X0`<D`$`)'Q_&WB``S`<+````$&B`#!(```!?^/[
+M>#B```!@A($L.*```$@```%_X_MX.(```&"$@30XH```2````8`!`"1\"`.F
+M@^$`'#@A`"!.@``@E"'_<'P(`J:380!\DX$`@).A`(23P0"(D^$`C)`!`)1\
+M?QMX?'X;>(.#,"0X8```*`0`!D&!!D@](```.2D`9%2`$#I\"0`N?`!*%'P)
+M`Z9.@`0@?+LK>#A@```H!0`$0:$&''_C^W@X@```8(284$@```%490,&5WT0
+M.G^]^A2`'48H5`"A%GRE`WA_X_MX.(```&"$F%!(```!?^/[>#B```!@A)A<
+M2````51E!F"`'4905``\<'RE`WA_X_MX.(```&"$F%Q(```!?^/[>#B```!@
+MA)A<2````51E!%*`'48\5`!ZH'RE`WA_X_MX.(```&"$F%Q(```!?^/[>#B`
+M``!@A)A82````51E`XJ`'49D5`"1FGRE`WA_X_MX.(```&"$F%A(```!B!P`
+M"7P;`$!`@0`4@3\L2#DI``&1/RQ(2```'(@<``E\&P!`0(``$($_+$PY*0`!
+MD3\L3)M\``E(``44/2```#DI``"!20`$@2D``)$A`#B100`\/2```#DI``B!
+M20`$@2D``)$A`$"100!$/2```#DI`!"!20`$@2D``)$A`$B100!,/2```#DI
+M`!B!20`$@2D``)$A`%"100!4/2```#DI`""!20`$@2D``)$A`%B100!</2``
+M`#DI`"B!20`$@2D``)$A`&"100!D,`7__W]@*1!_X_MX.(```&"$F&Q(```!
+M5&4$E%=]$#HY(0`X?!U(+E0`<N)\I0-X?^/[>#B```!@A)AL2````7_C^W@X
+M@```8(28;$@```%490+&.2$`0'P=2"Y4`*D4?*4#>'_C^W@X@```8(28;$@`
+M``%_X_MX.(```&"$F&A(```!5&4#SCDA`$A\'4@N5`"*''RE`WA_X_MX.(``
+M`&"$F&A(```!?^/[>#B```!@A)AH2````51E`@`Y(0!0?!U(+E0`P$Y\I0-X
+M?^/[>#B```!@A)AH2````7_C^W@X@```8(28:$@```%490`T.2$`6'P=2"Y4
+M``;^?*4#>'_C^W@X@```8(28:$@```%_X_MX.(```&"$F&Q(```!5&4&(CDA
+M`&!\'4@N5`!$KGRE`WA_X_MX.(```&"$F&Q(```!+!L``$&"`!Q_X_MX.(``
+M`&"$F&Q(```!8&4``4@``!A_X_MX.(```&"$F&Q(```!5&4`/'_C^W@X@```
+M8(28;$@```$OFP``?```)E0`__Z)/``,?`!(`$&"`N1!G@`4@3XL6#DI``&1
+M/BQ82```$($^+%PY*0`!D3XL7&M@``&8'``,2``"N#T@```Y*0`P@4D`!($I
+M``"1(0!HD4$`;#`%__]_H"D0?^/[>#B```!@A*((2````51E`#)7H!`Z.2$`
+M:'P)`"Y4``:^?*4#>'_C^W@X@```8(2B"$@```&('``-?!T``$&"`E0L'0``
+M08(`%($_+&`Y*0`!D3\L8$@``!"!/RQD.2D``9$_+&2;O``-2``"*#T@```Y
+M:0`X@`D`.($K``2!:P`(D`$`")$A``R180`0?+TK>#A@```H!0`"0:$!_'_C
+M^W@X@```8(286$@```%4904:5Z`0.CDA``A\"0`N5`!CIGRE`WA_X_MX.(``
+M`&"$F%A(```!B!P`"WP=`$!`@0`4@3\L:#DI``&1/RQH2```'(@<``M\'0!`
+M0(``$($_+&PY*0`!D3\L;)N\``M(``&$/6```#DK`$2`"P!$@6D`!(%)``B!
+M"0`,D`$`&)%A`!R100`@D0$`)(`)`!"!:0`4@4D`&($I`!R0`0`HD6$`+)%!
+M`#"1(0`T?+TK>#A@```H!0`'0:$!,'_C^W@X@```8(29)$@```%490?N5Z`0
+M.GTA`A2`"0`85``./'RE`WA_X_MX.(```&"$F21(```!B!P`"GP=`$!`@0`4
+M@3\L4#DI``&1/RQ02```'(@<``I\'0!`0(``$($_+%0Y*0`!D3\L5)N\``I(
+M``"X+`4``$"B`#"`'S`85``'^I`?,!A_X_MX2````7_C^WA(```!5&0&+'_C
+M^WA(```!2```A(`?,!AP"0`"0((`>(`?,!PL````08(`3'_C^WA(```!5&0&
+M+'_C^WA(```!?^/[>#B```!@A($L@+\P;$@```%_X_MX.(```&"$@32`OS!P
+M2````7_C^WA(```!2```&'_C^WA(```!8&0!`'_C^WA(```!@!XP&&````*0
+M'C`8.&```8`!`)1\"`.F@V$`?(.!`("#H0"$@\$`B(/A`(PX(0"03H``()0A
+M_^!\"`*FDZ$`%)/!`!B3X0`<D`$`)'Q_&WA\?1MX@\,P)#E@``"1?@`0@`,P
+M'"P```!!@@"P@!X`%#T@`,!\`$A`0($`#)%^`$1(```4@3X`%#P``,!\"0!0
+MD!X`1(`>`!P](`#`?`!(`$"!``PX````2```$($^`!P\``#`?`D`4)`>`$A_
+MX_MX.(```&"$@2R`O@!$2````7_C^W@X@```8(2!-("^`$A(```!?^/[>#B`
+M``!@A($P/*```D@```%_X_MX.(```&"$@3@\H`(`2````3B=+(1_X_MX2```
+M`3@```"0'@`\D!X`0(`!`"1\"`.F@Z$`%(/!`!B#X0`<."$`($Z``""4(?_@
+M?`@"II/!`!B3X0`<D`$`)'Q_&WB`@Q(T@`,P&%0`![XL```#0*(!((/#,"2(
+MO@`)*`4``T&A`!`XI0`!.(```4@``0"(O@`*B!X`"'P%`$!`H``0.*4``3B`
+M``5(``#D@2,LF%4@!GXY*0!_52G)_B@``#]!@0`,@`,LF%0)R?Z`'@`H?`D`
+M`$"!`"R('@`,+````$"B`$A_X_MX.(```CB@``!(```!?^/[>#B```5(``",
+M@!X`)'P)``!`@0`\B!X`#"P```!!H@`4?^/[>#B```(XH``!2````8B^``LH
+M!0`!0:$`8#BE``%_X_MX.(``!$@``$Q_X_MX2````3AC__XH`P`!08$`/(@>
+M``PL````0*(`%'_C^W@X@``".*```$@```&('@`++````$&B`!1_X_MX.(``
+M!#B@``!(```!@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3P0`8
+MD^$`')`!`"1\?QMX@(,2-(`#,!A4``>^+````T"B`)B#PS`DB+X`"2@%``-!
+MH0`0.*4``3B```%(``!X@2,LF%4@!GXY*0!_52G)_B@``#]!@0`,@`,LF%0)
+MR?Z`'@`D?`D``$"!`""(O@`+*`4``4&A`$0XI0`!?^/[>#B```1(```P?^/[
+M>$@```$X8__^*`,``4&!`""('@`++````$&B`!1_X_MX.(``!#B@``!(```!
+M@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_X'P(`J:3@0`0DZ$`%)/!`!B3
+MX0`<D`$`)'Q_&WA\G"-X?'T;>("#$C1+__--'&,`6'_?&A0[WC`HD]\P)(`?
+M`=PL```!0*(`$(`?,!A@```"2```#(`?,!A4``?ZD!\P&(`?`=PL```!08(`
+M@($]+'@Y*0`!D3TL>'_C^W@X@``!.*```$@```%_X_MX.(``!3B@``!(```!
+M?^/[>#B```0XH```2````7_C^W@X@``".*```$@```%_X_MX.(```SB@``!(
+M```!?^/[>$@```%@9`$`?^/[>$@```%_X_MX2__[V4@``32`'S`85``'OBP`
+M``-`H@$D+!P``$&"`%R(O@`)?^/[>#B```%(```!B+X`"G_C^W@X@``%2```
+M`8B^``P@!0``?*`I%'_C^W@X@``"2````8B^``U_X_MX.(```T@```&(O@`+
+M?^/[>#B```1(``!0?^/[>#B```$XH``$2````8B^``A_X_MX.(``!4@```%_
+MX_MX.(```CB@``%(```!?^/[>#B```,XH``!2````7_C^W@X@``$.*```D@`
+M``&`'3`<+````$&"`$Q_X_MX2````51D!BQ_X_MX2````7_C^WA+__KM?^/[
+M>#B```!@A($P/*```D@```%_X_MX.(```&"$@3@\H`(`2````4@``"!_X_MX
+M2__ZN7_C^WA(```!8&0!`'_C^WA(```!@`$`)'P(`Z:#@0`0@Z$`%(/!`!B#
+MX0`<."$`($Z``""4(?_@?`@"II.!`!"3H0`4D\$`&)/A`!R0`0`D?'\;>'R=
+M(WA\?!MX.(```&"$@20XH```2````7_C^W@X@```8(2!*#B@``!(```!.)\L
+MA'_C^WA(```!@!T``($]``2!?0`(D!\LF)$_+)R1?RR@?^/[>#B```!@A($L
+M2````7Q^&WA_X_MX.(```&"$@31(```!5\`"$CT@`,!\`$@`08(`$%1@`A)\
+M`$@`0*(`@(.\,"2!?0!$?6OP4(`=`#Q\`%A0@3PL<'P`2A20'"QPD7T`/(%]
+M`$A]:QA0@!T`0'P`6%"!/"QT?`!*%)`<+'21?0!`@3T`/(`=`!1\"0!`0*$`
+M#'_C^WA+__J%@!T`0($]`!Q\`$A`0*$`#'_C^WA+__O-?^/[>$O_^5F``0`D
+M?`@#IH.!`!"#H0`4@\$`&(/A`!PX(0`@3H``()0A_^!\"`*FD^$`')`!`"1\
+M?QMX@6,P)(@$``4L```10*(`-($K`#PY*0`!D2L`/($C+'`Y*0`!D2,L<($K
+M`#R`"P`4?`D`0$"A`$Q+__GU2```/(@$``4L```90*(`.($K`$`Y*0`!D2L`
+M0($C+'0Y*0`!D2,L=($K`$"`"P`<?`D`0$"A`!!+__L9?^/[>$O_^*6``0`D
+M?`@#IH/A`!PX(0`@3H``()0A__!\"`*FD`$`%("C,"2!(RR852`&?CDI`']5
+M*<G^*```/T&!``R``RR85`G)_H`%`"A\"0``08$`0(`%`"1\"0``0($`'(@%
+M``PL````0:(`$#B```(XH``!2```2(DE``LL"0``0:(`$#BI__\X@``$2```
+M,(DE``HL"0``0:(`$#BI__\X@``%2```&(BE``DL!0``0:(`$#BE__\X@``!
+M2````8`!`!1\"`.F."$`$$Z``""4(?_@?`@"II.A`!23P0`8D^$`')`!`"1\
+M?QMX.(```&"$@.Q(```!?'T;>'_C^W@X@```8(2`\$@```%\?AMX?^/[>#B`
+M``!@A(#X2````7QH&WB!7S`D@`H`."P```!!@@`,?``80$"!`!@X8```@3\L
+M?#DI``&1/RQ\2```/(%J`#A]:QA0@2H`-'TI\%"`"@`P?`#H4'QI6%!\8!A0
+M/`!?4V``.2E\`P"6?`!V<'QI_G!\:0!0D0H`.).J`#"3R@`T@`$`)'P(`Z:#
+MH0`4@\$`&(/A`!PX(0`@3H``()0A_]!\"`*FDV$`').!`""3H0`DD\$`*)/A
+M`"R0`0`T?'\;>'Q\&WB#HS`D@`0``($D``2!9``(D`,LF)$C+)R18RR@+!T`
+M`$&"`AA+__[5?'X;>"P#``!`H``8@3\L@#DI``&1/RR`?^/[>$O_]HF`'0`0
+M?!X"%)`=`!"`'#`<+````$&B`/0XG"R$?^/[>$@```%_X_MX.(```&"$@2Q(
+M```!?'X;>'_C^W@X@```8(2!-$@```%\>QMX@!T`1'P>`$!!@``0@!T`2'P#
+M`$!`@`!H@+T`1'P>*$!`H``H?^/[>#B```!@A($L2````7_C^W@X@```8(2!
+M,#R@``)(```!@+T`2'P;*$!`H`%4?^/[>#B```!@A($T2````7_C^W@X@```
+M8(2!.#R@`@!(```!2``!+(%]`$1]:_!0@!T`/'P`6%"!/"QP?`!*%)`<+'"1
+M?0`\@7T`2'UK&%"`'0!`?`!84($\+'1\`$H4D!PL=)%]`$"`'S`85``'OBP`
+M``-`H@#<@!PP(!P```6!?0`0?`L`0$"!`%"`'0`8?`L!UCU`$&)A2DW3?`!0
+M%E0`T;Z!/0`\?`D`0$&!`)R`'0`@?`L!UGP`4!94`-&^@3T`0'P)`$!!H0"`
+M?^/[>$O__(E(``!T@3T`$(`<,"!\"0!`0($`;(`=`!1\"0'6/2`08F$I3=-\
+M`$@65`#1OH$]`#Q\"0!`0*$`$'_C^WA+__7A2```-($]`!"`'0`<?2D!UCP`
+M$&)@`$W3?2D`%E4IT;Z`'0!`?`!(0$"A`!1_X_MX2__W#7_C^WA+__29@`$`
+M-'P(`Z:#80`<@X$`((.A`"2#P0`H@^$`+#@A`#!.@``@@2,2-*`)``"P!```
+M@2,2-(@)``1@```(F`D`!(@$``1@```(F`0`!($C$C2@"0`"L`0``H$C$C2(
+M"0`$F`0`!($C$C2("0`%F`0`!3A@``!.@``@E"'_T'P(`J:300`8DV$`').!
+M`""3H0`DD\$`*)/A`"R0`0`T?'T;>'R;(WA\NBMX?-\S>#O````](```.XD`
+M`!P>`!A\G``N'!X`!GP`VA14`!`Z?+P`+G^CZWA(```!._\``7/@`#]`H@`,
+M.&```4@```$[W@`!*!X`#4"!_\0[P```/2```#N)``!7P!@X?2#B%'R<`"Z`
+MJ0`$?Z/K>$@```$[_P`!<^``/T"B``PX8``!2````3O>``$H'@!'0('_S#O`
+M```](```.XD``!P>``Q\G``N'!X``WP`TA14`!`Z?+P`+G^CZWA(```!._\`
+M`7/@`#]`H@`,.&```4@```$[W@`!*!X`/T"!_\2``0`T?`@#IH-!`!B#80`<
+M@X$`((.A`"2#P0`H@^$`+#@A`#!.@``@E"'_X'P(`J:3@0`0DZ$`%)/!`!B3
+MX0`<D`$`)'Q^&WA\G"-XH(0``*"\``)(```!?&,'-*`<``)\?1MX.^```'`)
+M`(!!H@!H'Z,`##T@```Y*0#D?[U*%(!]``0X@``(2````51_+/2`'0``5``@
+M-G__`WBKO0`(?\/S>#B```!@A*($2````:`<``!@90`0+``)M$&"``A490<T
+M?\/S>#B```!@A*($2````2P=`)!!@0`,<Z```4&"`!PX??_H.(``"$@```%4
+M?08^.````4@``"`X??_H?&,.<'QC`90X@``(2````51]!CXX````5[T0.E0`
+M"#Q_O0-X8[T$`5?E1"Y7H`8^?*4#>'_#\W@X@```8(28G$@```%7Y00N5Z#&
+M/GRE`WA_P_-X.(```&"$F-!(```!DYX2-#A@``&``0`D?`@#IH.!`!"#H0`4
+M@\$`&(/A`!PX(0`@3H``((!C+^PH!``'08$`2#T@```Y*0S@5(`0.GP)`"Y\
+M`$H4?`D#IDZ`!"`X8P!$3H``(#AC`$A.@``@.&,`3$Z``"`X8P!03H``(#AC
+M`)1.@``@.&```$Z``""4(?]@?`@"II)!`&B280!LDH$`<)*A`'22P0!XDN$`
+M?),!`("3(0"$DT$`B)-A`(R3@0"0DZ$`E)/!`)B3X0"<D`$`I'Q\&WA\F"-X
+M?+LK>'QY&W@[X```H`0``E0`!?8L``#`08(`W$&!`!`L``"@08(`J$@``/0L
+M``%`08(`#"P``5!`H@#DH3@``#DI\%\H"03J08$`$*+Y$U2BV1-62```6*$X
+M```Y*>MT*`D`[T&!`!"B^1-8HMD36D@``#RA.```.2GJA"@)`.!!@0`0HOD3
+M7*+9$UY(```@H!@``#K````ZX```*``67$"!``RB^1-@HMD38CO````X@```
+MHGD2V**Y$MX@%0``?H"I%*)9$RQ(``!<HN,39*+#$V:@@Q-LH\,3<*)C$MJB
+MHQ+@(34``'Z)J12B0Q,N2```-*+C$VBBPQ-JH(,3;J/#$W*B8Q+<HJ,2XB`5
+M``!^@*D4HD,3,$@```PX8```2``#U#N@```Y00`(/2```#EI``!7J1`Z'!T`
+M!GP`VA14`!`Z?`L`+GP)42X[O0`!*!T`$$"!_^"@&``"<`D`@$&B`#`X80`(
+M.*```SC``'<XX```2````3AA``A_Q/-X.*```SC``'HXX```2````3N@```]
+M(```.TD``#O!``@<'0`8?)H`+E>@$#I\O@`N?X/C>$@```$[_P`!<^``/T"B
+M``PX8``!2````3N]``$H'0`00('_S#N@```](```.\D``%>@&#A](/(4?)X`
+M+H"I``1_@^-X2````3O_``%SX``_0*(`##A@``%(```!-[T``4&"_]`[H```
+M/2```#O)```<'0`8?)X`+AP=``9\`-H45``0.GR^`"Y_@^-X2````3O_``%S
+MX``_0*(`##A@``%(```!-[T``4&"_\@[H```/2```#O)```<'0`8?)X`+AP=
+M``9\`-H45``0.GR^`"Y_@^-X2````3O_``%SX``_0*(`##A@``%(```!-[T`
+M`4&"_\@[H```.4$`"#T@```Y:0``5ZD0.AP=``9\`-H45``0.GP+`"Y\"5$N
+M.[T``2@=`!!`@?_@H!@``G```4`L``%`0*(`-*"9$\PX80`(.*```3C``#,X
+MX``#2````:"9$\XX80`(.*```3C``"TXX``#2````3AA``A^A*-X.*```3C`
+M`%\XX```2````3AA``A^9)MX.*``!#C``&`XX```2````3AA``A^Y+MX.*``
+M`SC``&@XX```2````3AA``A^Q+-X.*```SC``&LXX```2````3N@```](```
+M.TD``#O!``@<'0`8?)H`+E>@$#I\O@`N?X/C>$@```$[_P`!<^``/T"B``PX
+M8``!2````3N]``$H'0`00('_S#N@```Y00`(/2```#EI``!7J1`Z'!T`!GP`
+MVA14`!`Z?`L`+GP)42X[O0`!*!T`!T"!_^`X80`(?D23>#B@``8XP``=..``
+M`$@```$X80`(?J2K>#B@``$XP``$..```$@```&@&``"<`F``$""``QP"4``
+M08(`:*`8``)P"4``?Z``)E>]'_Y_O0#05[T'/CN]`!`X80`(.(``'SB@``4X
+MP``3..```$@```$X80`(?Z3K>#B@``4XP``8..```$@```$X80`(.(```SB@
+M``(XP``Q..```$@```$[H```/2```#MI```[P0`('!T`&'R;`"Y7H!`Z?+X`
+M+G^#XWA(```!._\``7/@`#]`H@`,.&```4@```$[O0`!*!T`!T"!_\PX````
+MD!DOQ#A@``&``0"D?`@#IH)!`&B"80!L@H$`<(*A`'2"P0!X@N$`?(,!`("#
+M(0"$@T$`B(-A`(R#@0"0@Z$`E(/!`)B#X0"<."$`H$Z``"!\8!MX.&```'TF
+M.==-@@`@?,,S>'P%(`!-@@`@?`0`4!P``&1])"A0?`!+UGP`!S5-@``@?.,[
+M>"P``&1-@0`@?2`YUB```&1\`#'6?2D"%#P`4>M@`(4??`D`EGP`+G!]*?YP
+M?`D`4%0#!#Y.@``@E"'^D'P(`J:2P0%(DN$!3),!`5"3(0%4DT$!6)-A`5R3
+M@0%@DZ$!9)/!`6B3X0%LD`$!='S9,WA\>QMX.L```#L``#^@!@`"5``%]BP`
+M`-!!@@!H08$`&"^``*!!G@!$+X``P$&>`%1(``!H+``!4$&"`!A!@0`,+X`!
+M0$@```@O@`E`0+X`3*`;$^:P`0$<.!L3TI`!`1@X&Q/H2```/*`#%?"P`0$<
+M.`,5^)`!`1@X`Q:N2```)*`;%?"P`0$<.!L5\I`!`1@X&Q822```##A@``!(
+M``+\D`$!(#KA`1@X80`(.(`!"$@```$[00`0.X$`D#O@``$[P```5\`(/'_Z
+M`RX[_P`!.]X``2P?`#]\```FD`$!*$"!_^2SP0`..````;`!``HX```_L`$`
+M##O```"@`0`.?YX``$"\`"Q7W0@\H'D``'R=TBY^Y;MX2``"N7Q]XRX[W@`!
+MH`$`#G^>``!!G/_<J7P``*`!``Y4"0@\?2GB%*CI__X[P```?YX``$"<`&17
+MP`@\?!P"KG^`6`!!G0`,?`L#>%?6!#ZA(0`.?3Y(4#DI__]5/P0^+Y\``$&>
+M`#17X`@\?0#B%*DH__Y]7`(N?4`'-'^)``!`G0`(L4C__CO>``&@`0`.?YX`
+M`$&<_Z0[P```H`$`#G^>``!`G``L?`D#>%?`"#Q\'`*N?X`X`$"=``Q\!P-X
+M5]@$/CO>``%_GD@`09S_X#EK`!D](%'K82F%'WP+2)9\`"9P?6O^<'P+`%`<
+M```R?!T'-#O@``!]/4B6?2DF<'^@_G!\"P-X?2!(4#O````X"0`!+X```$"=
+M`$`](%'K82F%'WT]2)9]*29P?2M(4#E)``%_R?-X.!X``50>!#Z!>T9X52D(
+M/'[)6RX[_P`!?Y]0`$&<_^`[X```2```L#@=`#)\'0<TH2$`#E4I"#Q]*>(4
+MJ`G__G^`Z`!(```(._\``4"=`"17X`@\?6#B%'T\`JY]*>A0J`L``GP`Z%!]
+M20'708'_W%>C!#Y7X`@\?2#B%'R<`BZ@J0`"?2#2%'S:`BY4Q@P\H.D``E3G
+M##Q+__QQ.&,``8$[1GA7RP@\5&/\?GQK2RZ!.T9X?`M*+GP`P$!]0``FD4$!
+M.$"!``A_"TLN.!X``50>!#ZA(0`.52D(/'TIXA0Y8``!J`G__GP`Z`!](``F
+MD2$!+$&!``@Y8```(!X`/S@```!\``$4?6D`.4""_QPKG@`_09T`*(%;1GA7
+MRP@\?2M2%*`)__Y\"U,N.!X``50>!#XKG@`_0)W_X#@```"P&R_T.&```8`!
+M`71\"`.F@L$!2(+A`4R#`0%0@R$!5(-!`5B#80%<@X$!8(.A`62#P0%H@^$!
+M;#@A`7!.@``@E"'_P'P(`J:300`HDV$`+).!`#"3H0`TD\$`.)/A`#R0`0!$
+M?'H;>'R>(WA\ORMX.,$`"$@``2DL`P``08(`#*!A``A(``#PH+\`!']#TWB`
+MGP``.,$`"CCA``Q(```!H($`"G_#\WA_Y?MX.,$`#CCA`!!(``%QH($`#'_#
+M\WA_Y?MX.,$`$CCA`!1(``%9H&$`"J"!``X[@0`6?^7[>'^&XWA(``"YH&$`
+M"J"!`!`[H0`8?^7[>'^FZWA(``"AH($`#J"A`!"@P0`6H.$`&'_#\WA+__JU
+M?'L;>*!A``R@@0`2?^7[>'^&XWA(``!QH&$`#*"!`!1_Y?MX?Z;K>$@``%V@
+M@0`2H*$`%*#!`!:@X0`8?\/S>$O_^G%\9QMXH($`"J"A``Q_0]-X?V;;>$O_
+M^EF``0!$?`@#IH-!`"B#80`L@X$`,(.A`#2#P0`X@^$`/#@A`$!.@``@@44`
+M"#D```"@!0`$?`@``$"``'"@"@``?``8`$"B`%`Y:@`(.2```*`*``9\"0``
+M0(``/*`+``!\`"``0*(`'%4I"#Q]*5(4H`D`'K`&```X8``!3H``(#EK``(Y
+M*0`!H`H`!GP)``!!@/_,.4H`-#D(``&@!0`$?`@``$&`_Y@X8```3H``()0A
+M__!\"`*FD`$`%($E``@Y8```H`4`!'P*`WA\"P``0(``(*`)``!\`"``08(`
+M%#DI`#0Y:P`!?`M0`$&`_^@XB0`(H*D`!D@```&``0`4?`@#IC@A`!!.@``@
+ME"'_X'P(`J:3X0`<D`$`)'Q_&WB`8T9X+`,``$&B`!!(```!.````)`?1GB`
+M?R_L+`,``$&B`!!(```!.````)`?+^R``0`D?`@#IH/A`!PX(0`@3H``(#A@
+M``%.@``@.4```*%D```](```H`D``'P+`$!!@0`<.2D``#E*``%50!`Z?`D"
+M+GP+`$!`@?_P54D0.CU@```Y:P``?2E:%*AI``).@``@E"'_X'P(`J:3P0`8
+MD^$`')`!`"1\GB-X?'\;>#A@`+1(```!D'\O["P#``!!H@`@.```@)`?1GPX
+M8`"`2````9!_1G@L`P``0((`%#@```*0'@``.&```$@``&@](```.2D``)$_
+M+*@](```.2D``)$_+*P](```.2D``)$_++`](```.2D``)$_++0](```.2D`
+M`)$_++@](```.2D``)$_++P](```.2D``)$_+,`](```.2D``)$_+,0X8``!
+M@`$`)'P(`Z:#P0`8@^$`'#@A`"!.@``@E"'_T'P(`J:300`8DV$`').!`""3
+MH0`DD\$`*)/A`"R0`0`T?'T;>'R;(WA\NBMX?-\S>#O````](```.XD``!P>
+M`!A\G``N'!X`!GP`VA14`!`Z?+P`+G^CZWA(```!._\``7/@`#]`H@`,.&``
+M`4@```$[W@`!*!X`#T"!_\0[P```/2```#N)``!7P!@X?2#B%'R<`"Z`J0`$
+M?Z/K>$@```$[_P`!<^``/T"B``PX8``!2````3O>``$H'@!$0('_S#O````]
+M(```.XD``!P>``Q\G``N'!X``WP`TA14`!`Z?+P`+G^CZWA(```!._\``7/@
+M`#]`H@`,.&```4@```$[W@`!*!X`/T"!_\2``0`T?`@#IH-!`!B#80`<@X$`
+M((.A`"2#P0`H@^$`+#@A`#!.@``@E"'_T'P(`J:300`8DV$`').!`""3H0`D
+MD\$`*)/A`"R0`0`T?'P;>'R=(W@[0```.V```*%$```H"A*_08$`X#EJ]W`]
+M`&9F80AF9WP+0)9\``YP?6G^<'P)`%`<```%?`L``$""`"!520@\.\GNX'P>
+M0)9\`!9P?\G^<'_)`%!(``!0H00``#EH]U`]0&9F84IF9WP+4)9\``YP?6G^
+M<'P)`%`<```%.&```'P+``!`@@),50D(/#O)[J!\'E"6?``6<'_)_G!_R0!0
+M.T```5?>%CI_P_-X.(``"$@```%\?AMX?X/C>#B```!@A*($2````:`=``!@
+M90`0+``)M$&"``A490<T?X/C>#B```!@A*($2````4@``9RA)```/`#,S&``
+MS,U\"0`65`#POAP```5\`$A05``$/BP```)`H@!0*`D5.T&A`$@Y*?_^52D$
+M/ATI``H]*?__.2E$@#Q@4>M@8X4??&D8EGQC'G!]*?YP?&D84#AC``$X@``(
+M2````7Q^&W@X8```2``!'*$]```\`,S,8`#,S7P)`!94`.$^'```%'P`2%!4
+M``0^+````$""`$`H"1/_0*$`.#@)[4`\8&9F8&-F9WQ@&)9\8QYP?`#^<'Q@
+M&%!48Q`Z.(``"$@```%\?AMX.&```T@``+BA/0``/`#,S&``S,U\"0`65`#H
+M_AP```I\`$A05``$/BP```!`H@`X.`GM0#Q@9F9@8V9G?&`8EGQC%G!\`/YP
+M?&`84%1C"#PX@``(2````7Q^&W@X8``"2```7*$]```\`,S,8`#,S7P)`!94
+M`/"^'```!7P`2%!4``0^.&```"P```!`H@"$.`GM0#Q@9F9@8V9G?&`8EGQC
+M#G!\`/YP?&`84#B```A(```!?'X;>#A@``$X@``"2````7Q[&WA7WR`V5V`0
+M.G__`WA70`@\?_\#>&/_$`%7Y08^?X/C>#B```!@A)B<2````5?EQGY_@^-X
+M.(```&"$F-A(```!D[P2-#A@``&``0`T?`@#IH-!`!B#80`<@X$`((.A`"2#
+MP0`H@^$`+#@A`#!.@``@@&,O["@$``=!@0!`/2```#DI"]A4@!`Z?`D`+GP`
+M2A1\"0.F3H`$(#AC``1.@``@.&,`"$Z``"`X8P`,3H``(#AC`*Q.@``@.&``
+M`$Z``""4(?^P?`@"II)!`!B280`<DH$`()*A`"22P0`HDN$`+),!`#"3(0`T
+MDT$`.)-A`#R3@0!`DZ$`1)/!`$B3X0!,D`$`5'Q[&WA\F2-X?+PK>'S7,WA\
+M>AMX.F```#I````ZP```.H```(/C+^P[`RP0.\```*`$``)4``7V+```T$&"
+M`,!!@0`8+```H$&"`*`L``#`08(`K$@``+PL``%008(`&$&!``PL``%`2```
+M""P`"`!`H@"@H3D``#DI\%\H"03J08$`$*)Z$U2B6A-62```4*$Y```Y*>MT
+M*`D`[T&!`!"B>A-8HEH36D@``#2A.0``.2GJA"@)`.!!@0`0HGH37*):$UY(
+M```8H!D``"@`%EQ`@0`,HGH38*):$V*@FA+>HKH3+$@``#2BPQ-LHH,3<*"#
+M$N"BHQ,N2```(*+:$VY^U+-XH)H2XJ*Z$S!(```,.&```$@`!9@Y0```/2``
+M`#D)``!52Q`Z54D8.'TI0A2`"0`$?`OY+C5*``%!@O_H.6```#T@```Y20``
+M56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`ND`D`!#5K``%!@O_@.6```#T@```Y
+M20``56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`ND`D`"#5K``%!@O_@.6```#T@
+M```Y20``56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`ND`D`##EK``$H"P`G0('_
+MW#N_``Q_H^MX.*```3C``2XXX```2````:"7``!_H^MX.*```CC``0XXX```
+M2````:"7``)_H^MX.*```CC``0$XX```2````:`9``)P"0!`0:(`K($X`!RH
+MB0`"?Z/K>#B@``$XP`"H..```T@```&!.``<J(D`!'^CZW@XH``!.,``J3C@
+M``-(```!@3@`'*B)``9_H^MX.*```3C``*HXX``#2````8$X`!RHB0`(?Z/K
+M>#B@``$XP`"N..```T@```&!.``<J(D`"G^CZW@XH``!.,``KSC@``-(```!
+M@3@`'*B)``Q_H^MX.*```3C``+`XX``#2````:`9``)P"0"`08(`-#N_``Q_
+MH^MX?L2S>#B@``,XP`$?..```$@```%_H^MX?H2C>#B@``,XP`$B2```,#N_
+M``Q_H^MX?F2;>#B@``,XP`$7..```$@```%_H^MX?D23>#B@``,XP`$:..``
+M`$@```&A>P'456D&-CDI_]`H"0`_08$`F&E@`#4A(```?`D!%&EI`$4A20``
+M?2I)%'P*2WE`@@`4+`L`1D&"``PL"P`V0*(`:#N_``Q_H^MX.(```CB@``(X
+MP`!:..```D@```%_H^MX.(```CB@``(XP`!<..```D@```%_H^MX.(```CB@
+M``(XP`!>..```D@```%_H^MX.(```CB@``$XP`#^..```D@```&@&P'2*```
+M04"A`(`[OP`,?Z/K>#B```$XH``!.,`!&3C@``%(```!?Z/K>#B```$XH``"
+M.,```3C@``-(```!?Z/K>#B```$XH``".,```SC@``-(```!?Z/K>#B```$X
+MH``!.,``BSC@``-(```!?Z/K>#B```$XH``!.,``C#C@``-(```!.6```#T@
+M```Y20``56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`ND`D`K#EK``$H"P`,0('_
+MW*`9``)P"0!`0:(`(#A_`*R!.``<J(D``#B@``(XP``E..```$@```$X?P"L
+M?J2K>#B@``8XP``...```$@```&@&0`"<`E``$""``QP"H``0:(`5*`9``)P
+M"4``?Z``)E>]'_Y_O0#05[T'?CN]``@[GP"L?X/C>#B```\XH``$.,``.CC@
+M``!(```!?X/C>'^DZW@XH``$.,``1CC@``!(```!.Z```#T@```[B0``5Z`8
+M.'R<`"Y7H!`Z?+\`+G]CVWA(```!.]X``7/``#]`H@`,.&```4@```$WO0`!
+M08+_T#N@```](```.XD``!P=`!A\G``N5ZD0.GTI^A2`J0`$?V/;>$@```$[
+MW@`!<\``/T"B``PX8``!2````3>]``%!@O_,.Z```#T@```[B0``'!T`&'R<
+M`"Y7J1`Z?2GZ%("I``A_8]MX2````3O>``%SP``_0*(`##A@``%(```!-[T`
+M`4&"_\P[H```/2```#N)```<'0`8?)P`+E>I$#I]*?H4@*D`#']CVWA(```!
+M.]X``7/``#]`H@`,.&```4@```$[O0`!*!T`)T"!_\@[H```/2```#N)```<
+M'0`8?)P`+E>I$#I]*?H4@*D`K']CVWA(```!.]X``7/``#]`H@`,.&```4@`
+M``$[O0`!*!T`#$"!_\@X````D!HOQ#A@``&``0!4?`@#IH)!`!B"80`<@H$`
+M((*A`"2"P0`H@N$`+(,!`#"#(0`T@T$`.(-A`#R#@0!`@Z$`1(/!`$B#X0!,
+M."$`4$Z``""4(?O`?`@"II'!`_B1X0/\D@$$`)(A!`22000(DF$$#)*!!!"2
+MH004DL$$&)+A!!R3`00@DR$$))-!!"B3800LDX$$,).A!#23P00XD^$$/)`!
+M!$1\D2-X?+(K>'S8,WA\]#MX?'<;>*%C`=15:08V.2G_T"@)`#]!@0!`:6``
+M-2$@``!\"0$4:6D`12%)``!]*DD4?`I+>4""`!0L"P!&08(`#"P+`#9`H@`0
+M.6```I%A`]Q(```,.````9`!`]PYP0`(H!@``E0`!?8L``#008(`4$&!`!@L
+M``"@08(`."P``,!!@@`\2```1"P``5!!@@`808$`#"P``4!(```(+``(`$"B
+M`"@[-Q_4H3<2V$@``"0[-Q_@H3<2VD@``!@[-Q_LH3<2W$@```PY0```2``$
+M3*`9``8Y0```?2L`.4&"!#RH$@``5``(/'P`!S20`0/DJ!$``%0`"#Q\``<T
+MD`$#X#@`WJVP`0/0L`$#TCM@``"A.0`&.^```#EA`]!](/XP<`H``4&"`!PY
+M0```*!L``4&!`^A78`@\?^L#+CM[``$[_P`!*!\``T"!_]2@>```H+D`!("9
+M```XP0/4..$#V$@`!$D[8```@T$#U(`!`]A\&@!`08$!F#IA`]`ZH0$0.L$!
+M,#GA`5`Z`0-0'3H`5(`9``A_R0(4H3,``C@```!@`-ZM?`D``$"B`&RCX0/0
+M'[\`%'^]\A2C_0`&.)T`"%?\"#Q^HZMX?X7C>$@```$[O0`0?L.S>'^DZWA_
+MA>-X2````:C>``)_X_MX?J2K>'[%LW@XX0-02``$03E````L`P``08(#%%=C
+M.#!\;QH42```W*/A`]`?OP`4?[WR%*/]``8XG0`(5_P(/'ZCJWA_A>-X2```
+M`3N]`!!^P[-X?Z3K>'^%XWA(```!J-X``G_C^WA^I*MX?L6S>#CA`U!(``/9
+M.4```"P#``!!@@*L5V,X,'QO&A1^!(-X.*``@$@```&C\P`"'[\`%'^]\A2C
+M_0`&.)T`"%?\"#Q^HZMX?X7C>$@```$[O0`0?L.S>'^DZWA_A>-X2````:C>
+M``)_X_MX?J2K>'[%LWA^!X-X2``#:3E````L`P``08("/%=@.#`X80)0?&,"
+M%#B!`U`XH`"`2````3M[``$[6@`!@`$#V'P:`$!`@?Z$@4$#U(%Y``!520@\
+M?TE:+H`!`]A4"0@\?\E:+G]J`%"A(0/2.````&``WJT[X```.R$`"'P)``!`
+MH@"`5WPP,E?]"#Q_O<H4H'@``*C=`4A]//H452D(/'TIRA2HZ0%(?T33>'_%
+M\WA(``(!L'T`"#O_``$H'P`_0('_R#AA`!"`ET9X2``#R7Q@#G!\``&4L!$`
+M`*@!`(Y\``YP?``!E+`.``"P$@``H`$#T+`4``"@%```2```N%?\"#Q_G,H4
+MH'@``*C<`4A7?3`R?[WZ%%>]"#Q_O<H4J/T!2']$TWA_Q?-X2``!A;!\``B@
+M>```J-P"2*C]`DA_1--X?\7S>$@``6FP?`"(._\``2@?`#]`@?^H@`$#W"P`
+M``)`H@!8.&$`$#B!`)"`MT9X.,$`"D@`!"5\8`YP?``!E+`1``"H`0`*?``.
+M<'P``92P#@``J`$`CGP`#G!\``&4L!(``*`!`]"P%```H`$#TK`4``)(``",
+MJ`$!#H$A`^!\`$@`08``0(%!`^1\`%``0:``-#AA`)"`ET9X2``"M:`!`]*P
+M%```H!0``+`4``)\8`YP?``!E+`1``"H`0$.2```,#AA`!"`ET9X2``"A:`!
+M`]"P%```H!0``+`4``)\8`YP?``!E+`1``"H`0".?``.<'P``92P#@``L!(`
+M`*`2```@```_L!<O]#E```%]0U-X@`$$1'P(`Z:!P0/X@>$#_((!!`""(00$
+M@D$$"()A!`R"@000@J$$%(+!!!B"X00<@P$$((,A!"2#000H@V$$+(.!!#"#
+MH00T@\$$.(/A!#PX(01`3H``('QI&WA\PS-X?`4@`$V"`"!\!$A0?``YUGTI
+M*%!]*3'6?`!*%'TD*%!\`$O6?`,'-$Z``"!4H`@\?60"%*`$``!\`P!`0(``
+M##@```!(```4H`O__GP#`$!!@``X.`7__Y`'``"0!@``3H``('P$2%!\``YP
+M2___['TD2%!]*0YPD28``#DI``&1)P``3H``('R)(WA\!%A`3(``(*`)``!\
+M`!@`0:+_R*`)``)\`P!`0:#_R#DI``)\"5A`3(``($O__]R4(?_0?`@"II,!
+M`!"3(0`4DT$`&)-A`!R3@0`@DZ$`))/!`"B3X0`LD`$`-'QX&WA\G2-X?+HK
+M>'S<,WA\_CMX.R```#M@``$X8```*!@``4"!`*`[X```5V`(/'P=`BY\`/A`
+M0(``(#@8__]\&P``0(``%#@9``%4&00^.!L``50;!#Y7*0@\?(GJ+E=@"#Q\
+MO0(N?,G2KGSZ`JY_X_MX2__^G5?@"#Q\?@,N?!X"KGP`X`!!@``H*!\`/T&!
+M`"!_X/MX.3\``54_!#Y4``@\?YX#+B@?`#]`@?_H.!\``50?!#XH'P`_0('_
+M<#A@``&``0`T?`@#IH,!`!"#(0`4@T$`&(-A`!R#@0`@@Z$`)(/!`"B#X0`L
+M."$`,$Z``""A(P!^?2L'-*@#``!]8%A0.2G_@GTG!S0L"P!^08$`"*CC``"I
+M`P!^.2``/SE(__](```,.`G__WP)!S15(`@\?`,"KCE@``%\`%``08$`"#E@
+M``!]($CX5``/_GUF`#E`@O_4?0I#>#D``#\X"?__?`L#>%0`!#XH```^08$`
+M.%4@"#Q\`P*N?`!0`$&``"A]:0<T.6G__U5@!#XH```^08$`%%4@"#Q\`P*N
+M?`!0`$"`_^`L"0``0*(`+"P(``!!@`!`50L(/'TK(A2@"0`"?`LC+C@(__]\
+M"`<U0(#_Z$@``"!5``@\?20#+C@*__Y\"@<T.`C__WP(!S5`@/]P?.,[>$Z`
+M`""4(?_@D\$`&)/A`!PXX`!`H2,`?GTK!S2H!```?6!84#DI_X)]/P<T+`L`
+M?D&!``BKY```J8,`?CD@`#\Y3/__2```##@)__]\"0<T52`(/'P#`JXY8``!
+M?`!0`$&!``@Y8```?2!(^%0`#_Y]:``Y0(+_U*`$`'ZP!@``?2I+>#D``#]]
+MBV-XJ`8``'P`6`!`@``@(\H``'T^410OAP!`?```)E0`__Y]/@`Y08(`$#C@
+M``!\@R-X.4``/RP*``!`@0`P54`(/'P#`JY\`%@`08``(#@*__]\"@<U0($`
+M%%5`"#Q\`P*N?`!8`$"`_^@A*@``?`E1%"/'``!]/CD4?!Y(.4&B`"PL"```
+M08``1%4+"#Q]*RH4H`D``GP+*RXX"/__?`@'-4"`_^A(```D50D(/'U`.WA\
+M"2LN.`O__GP+!S0X"/__?`@'-4"`_SQ_X_MX@\$`&(/A`!PX(0`@3H``()0A
+M_^!\"`*FD^$`')`!`"1\?QMX@&-&>"P#``!!H@`02````3@```"0'T9X@'\O
+M["P#``!!H@`02````3@```"0'R_L@`$`)'P(`Z:#X0`<."$`($Z``""I1``$
+M..```#E@``$=*P`4?2DB%*$I``15(`0^?`!0`$"```Q]9UMX?2H'-#EK``$L
+M"P`#0('_V!TG`!1]*2(4J0D`$*AI``@Y8``!'2<`"GP)6A14``@\?4`B%*@*
+M`!!\`$``0(``#'P(`WBH:@`(.6L``2P+``-`@?_85&,(/'QC0%!\8P<T3H``
+M()0A_]!\"`*FDP$`$),A`!2300`8DV$`').!`""3H0`DD\$`*)/A`"R0`0`T
+M?'L;>'R>(WA\V#-X.^```+/E``"@'@`"<``!0"P``4!`H@`4.(,?U(/D``B@
+MA``$2```7*`>``)P``#0:`D`P"%I``!]*TD4:```T"%@``!\"P$4?2L#>4&"
+M`!0X@Q_4@^0`(*"$`!Q(```DH!X``G```*`X8``!+```H$"B`80XFQ_4@^0`
+M%*"$`!`X8```+`0``$"!`6RA?@``H!\``'P+`$!!@``8'20`5'TI^A2@"?^L
+M?`L`0$"!`#2@'@``H3\``!R$`%1\A/H4.(3_K'P`2$!`@`$4H!\``K`%``!_
+M8]MX?^3[>$@``0PY````.6```'P+(`!`@``XH!X``*$_``!\`$A`0($`*'P)
+M`WA]:%MX.6L``7P+(`!`@``4'`L`5'P?`BY\"0!`08'_Y!P+`%1\@/H4?Y\"
+M+A](`%1_.OH4?5KZ+G^*X%%`@0"`J20``JEY``)]*TA0H!X``'P*`%!]*0'6
+M?6OAUGTI6A1]*>/6?2D'=+$E``!_8]MX2__]R7Q]&WA_8]MX?R3+>$O__;E_
+MH^A0H!X``'TZ^BY\"0!0?[T!UG]CVWA_),MX2__]F7QCX=9_O1H4?[WCUG^]
+M!W2SN```2```-!P+`%1\@/H4H3X``'P?`BXX8```?`D``$"B`!R@!``"L`4`
+M`']CVWA+__U5L'@``#A@``&``0`T?`@#IH,!`!"#(0`4@T$`&(-A`!R#@0`@
+M@Z$`)(/!`"B#X0`L."$`,$Z``""4(?_0?`@"II-!`!B380`<DX$`().A`"23
+MP0`HD^$`+)`!`#1\>QMX?)PC>'R]*W@[0``!.\```'P>*$!`H`!,5\`8.'_\
+M`A1_8]MX?^3[>#BA``@XP0`*2__]32P#``!!@@`8B`$`"9@?``:(`0`+F!\`
+M!T@```@[0```.]X``7P>Z$!!@/^\?T/3>(`!`#1\"`.F@T$`&(-A`!R#@0`@
+M@Z$`)(/!`"B#X0`L."$`,$Z``""4(?_@?`@"II/!`!B3X0`<D`$`)'R>(WA\
+M?QMX.&``X$@```&0?R_L+`,``$&B`"`X``"`D!]&?#A@`(!(```!D']&>"P#
+M``!`@@`4.````I`>```X8```2```<#@``$"0'T9\/2```#DI``"1/RRH/2``
+M`#DI``"1/RRL/2```#DI``"1/RRP/2```#DI``"1/RRT/2```#DI``"1/RRX
+M/2```#DI``"1/RR\/2```#DI``"1/RS`/2```#DI``"1/RS$.&```8`!`"1\
+M"`.F@\$`&(/A`!PX(0`@3H``()0A_]!\"`*FDT$`&)-A`!R3@0`@DZ$`))/!
+M`"B3X0`LD`$`-'Q]&WA\FR-X?+HK>'S?,W@[P```/2```#N)```<'@`8?)P`
+M+AP>``9\`-H45``0.GR\`"Y_H^MX2````3O_``%SX``_0*(`##A@``%(```!
+M.]X``2@>``]`@?_$.\```#T@```[B0``5\`8.'T@XA1\G``N@*D`!'^CZWA(
+M```!._\``7/@`#]`H@`,.&```4@```$[W@`!*!X`BD"!_\P[P```/2```#N)
+M```<'@`,?)P`+AP>``-\`-(45``0.GR\`"Y_H^MX2````3O_``%SX``_0*(`
+M##A@``%(```!.]X``2@>`#]`@?_$@`$`-'P(`Z:#00`8@V$`'(.!`""#H0`D
+M@\$`*(/A`"PX(0`P3H``()0A_]!\"`*FDT$`&)-A`!R3@0`@DZ$`))/!`"B3
+MX0`LD`$`-'Q\&WA\G2-X.T```#M@``"A1```*`H2OT&!`.`Y:O=P/0!F9F$(
+M9F=\"T"6?``.<'UI_G!\"0!0'```!7P+``!`@@`@54D(/#O)[N!\'D"6?``6
+M<'_)_G!_R0!02```4*$$```Y:/=0/4!F9F%*9F=\"U"6?``.<'UI_G!\"0!0
+M'```!3A@``!\"P``0(("3%4)"#P[R>Z@?!Y0EGP`%G!_R?YP?\D`4#M```%7
+MWA8Z?\/S>#B```A(```!?'X;>'^#XW@X@```8(2B!$@```&@'0``8&4`$"P`
+M";1!@@`(5&4'-'^#XW@X@```8(2B!$@```%(``&<H20``#P`S,Q@`,S-?`D`
+M%E0`\+X<```%?`!(4%0`!#XL```"0*(`4"@)%3M!H0!(.2G__E4I!#X=*0`*
+M/2G__SDI1(`\8%'K8&.%'WQI&)9\8QYP?2G^<'QI&%`X8P`!.(``"$@```%\
+M?AMX.&```$@``1RA/0``/`#,S&``S,U\"0`65`#A/AP``!1\`$A05``$/BP`
+M``!`@@!`*`D3_T"A`#@X">U`/&!F9F!C9F=\8!B6?&,><'P`_G!\8!A05&,0
+M.CB```A(```!?'X;>#A@``-(``"XH3T``#P`S,Q@`,S-?`D`%E0`Z/X<```*
+M?`!(4%0`!#XL````0*(`.#@)[4`\8&9F8&-F9WQ@&)9\8Q9P?`#^<'Q@&%!4
+M8P@\.(``"$@```%\?AMX.&```D@``%RA/0``/`#,S&``S,U\"0`65`#POAP`
+M``5\`$A05``$/CA@```L````0*(`A#@)[4`\8&9F8&-F9WQ@&)9\8PYP?`#^
+M<'Q@&%`X@``(2````7Q^&W@X8``!.(```D@```%\>QMX5]\@-E=@$#I__P-X
+M5T`(/'__`WAC_Q`!5^4&/G^#XW@X@```8(28G$@```%7Y<9^?X/C>#B```!@
+MA)C82````9.\$C0X8``!@`$`-'P(`Z:#00`8@V$`'(.!`""#H0`D@\$`*(/A
+M`"PX(0`P3H``()0A_]!\"`*FDR$`%)-!`!B380`<DX$`().A`"23P0`HD^$`
+M+)`!`#1\>QMX?+PK>'QZ&W@[P```@^,O[*`$``)4``7V+```P$&"`"Q!@0`0
+M+```H$&"`!1(```H+```T$&"`!1(```<H(,39*,C$V9(```8H)H3:*,Z$VI(
+M```,.&```$@``H@Y0```/2```#D)``!52Q`Z54D8.'TI0A2`"0`$?`OY+C5*
+M``%!@O_H.6```#T@```Y20``56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`ND`D`
+M!#5K``%!@O_@.6```#T@```Y20``56D0.GTI^A0<"P`&?`#B%%0`$#I\"@`N
+MD`D`"#5K``%!@O_@.6```#T@```Y20``56D0.GTI^A0<"P`&?`#B%%0`$#I\
+M"@`ND`D`##EK``$H"P`:0('_W#N_``Q_H^MX.*```SC``*@XX```2````7^C
+MZWA_),MX.*```SC``*4XX```2````3E@```](```.4D``%5I$#I]*?H4'`L`
+M!GP`XA14`!`Z?`H`+I`)`'@Y:P`!*`L``D"!_]P[H```/2```#N)``!7H!@X
+M?)P`+E>@$#I\OP`N?V/;>$@```$[W@`!<\``/T"B``PX8``!2````3>]``%!
+M@O_0.Z```#T@```[B0``'!T`&'R<`"Y7J1`Z?2GZ%("I``1_8]MX2````3O>
+M``%SP``_0*(`##A@``%(```!-[T``4&"_\P[H```/2```#N)```<'0`8?)P`
+M+E>I$#I]*?H4@*D`"']CVWA(```!.]X``7/``#]`H@`,.&```4@```$WO0`!
+M08+_S#N@```](```.XD``!P=`!A\G``N5ZD0.GTI^A2`J0`,?V/;>$@```$[
+MW@`!<\``/T"B``PX8``!2````3N]``$H'0`:0('_R#N@```](```.XD``!P=
+M`!A\G``N5ZD0.GTI^A2`J0!X?V/;>$@```$[W@`!<\``/T"B``PX8``!2```
+M`3N]``$H'0`"0('_R#@```"0&B_$.&```8`!`#1\"`.F@R$`%(-!`!B#80`<
+M@X$`((.A`"2#P0`H@^$`+#@A`#!.@``@@&,O["@$``=!@0!`/2```#DI"^!4
+M@!`Z?`D`+GP`2A1\"0.F3H`$(#AC``1.@``@.&,`"$Z``"`X8P`,3H``(#AC
+M`'A.@``@.&```$Z``"!4H`@\?60"%*`$``!\`P``0(``##@```!(```4H`O_
+M_GP#``!!@``X.`7__Y`'``"0!@``3H``('P$2%!\``YP2___['TD2%!]*0YP
+MD28``#DI``&1)P``3H``('R)(WA\!%A`3(``(*`)``!\`!@`0:+_R*`)``)\
+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
+MWS-X?/H[>'Q[&WB#@T9XH`8``G```-!H"0#`(6D``'TK211H``#0(6```'P+
+M`10[PR?\?2L#>4""`!R@!@`"<```H#O#(^@X8```+```H$"B`3!_H^MX.(``
+M`&"$HFQ(```!5'D'/J"?``!_H^MX?\7S>'\FRW@XX0`(.0$`$'])TWA_BN-X
+M2__Z/7^CZW@X@```8(2B6$@```%4902>H3X`'#DI__]5*70B?*5+>'^CZW@X
+M@```8(2B6$@```&@`0`(+````$&"``Q\``#02```"#@```"P&R_T.\```&/>
+MHH`[X```5^`8.'T@XA1\O`(N5*4&/H@)``-4`$`N?*4#>(@)``54`(`>?*4#
+M>(@)``=4`,`.?*4#>'^CZWA_Q/-X2````3O>``0[_P`!*!\`'T"!_[2@H0`0
+M5*4EMG\E*W@Y(0`0H`D``E0`5"I\I0-XH`D`!%0`@IY\I0-XH`D`!E0`L1)\
+MI0-X?Z/K>#B```!@A*)L2````3A@``&``0!$?`@#IH,A`"2#00`H@V$`+(.!
+M`#"#H0`T@\$`.(/A`#PX(0!`3H``()0A_^!\"`*FD^$`')`!`"1\?QMX@&-&
+M>"P#``!!H@`02````3@```"0'T9X@'\O["P#``!!H@`02````3@```"0'R_L
+M@'\LI"P#``!!H@`02````3@```"0'RRD@`$`)'P(`Z:#X0`<."$`($Z``"`Y
+M(```(`D``QP``!A\8"(4H`,`""P```!!H@`,J&,`%$Z``"`Y*0`!.&```"@)
+M``--@0`@2___T#E@```=*P`8?2DB%*`)``@L````0:(`'!TK``Q]*0(452D(
+M/'TI(A2H:0`23H``(#EK``$X8```*`L``TV!`"!+___$E"'_P'P(`J:2P0`8
+MDN$`'),!`""3(0`DDT$`*)-A`"R3@0`PDZ$`-)/!`#B3X0`\D`$`1'Q\&WA\
+MGR-X?+LK>'S8,W@[P```L\4``*`$``)P``#0:`D`P"%)``!]*DD4:```T"%`
+M``!\"@$4.(,G_'TJ`WE`@@`<H!\``G```*`X@R/H.&```"P``*!`H@&\HZ0`
+M%#O$`!@X8```+!T``$&"`:BA?P``H!X``'P+`$!!@``8'3T`9GTI\A2@"?^:
+M?`L`0$"!`#R@'P``H3X``!^]`&9_ONH4.[W_FGP`2$!`@`%$?X/C>'_$\WA+
+M__[1L'L``'^#XWA_Q/-X2``!0#D````Y8```?`OH`$"``#B@'P``H3X``'P`
+M2$!`@0`H?`D#>'UH6W@Y:P`!?`OH`$"``!0<"P!F?!X"+GP)`$!!@?_D'`L`
+M9G[`\A1_7@(N'R@`9G[Y\A1\&?(N?T#044"!`*A_@^-X?L2S>$O__E%\?1MX
+M?X/C>'[DNWA+__Y!?Z/H4*`?``!].?(N?`D`4'^]`=9_@^-X?N2[>$O__B%\
+M8]'6?[T:%'^]T]9_O0=TL[L``'^#XWA^Q+-X2__]R7Q]&WA_@^-X?N2[>$O_
+M_;E_H^A0H!\``'TY\BY\"0!0?[T!UG^#XWA^Y+MX2__]F7QCT=9_O1H4?[W3
+MUG^]!W2SN```2```0!P+`&9_H/(4H3\``'P>`BXX8```?`D``$"B`"A_@^-X
+M?Z3K>$O__9&P>P``?X/C>'^DZWA+__U)L'@``#A@``&``0!$?`@#IH+!`!B"
+MX0`<@P$`((,A`"2#00`H@V$`+(.!`#"#H0`T@\$`.(/A`#PX(0!`3H``()0A
+M_]!\"`*FDT$`&)-A`!R3@0`@DZ$`))/!`"B3X0`LD`$`-'Q[&WA\G"-X?+TK
+M>#M```$[P```?!XH0$"@`$Q7P!@X?_P"%']CVWA_Y/MX.*$`"#C!``I+__TI
+M+`,``$&"`!B(`0`)F!\`!H@!``N8'P`'2```"#M````[W@`!?![H0$&`_[Q_
+M0]-X@`$`-'P(`Z:#00`8@V$`'(.!`""#H0`D@\$`*(/A`"PX(0`P3H``()0A
+M_^!\"`*FD\$`&)/A`!R0`0`D?)XC>'Q_&W@X8`"$2````9!_+^PL`P``0:(`
+M-#@``0"0'T9\.&`!`$@```&0?T9X+`,``$&B`!@X8`8`2````9!_+*0L`P``
+M0((`%#@```*0'@``.&```$@``&@](```.2D``)$_+*@](```.2D``)$_+*P]
+M(```.2D``)$_++`](```.2D``)$_++0](```.2D``)$_++@](```.2D``)$_
+M++P](```.2D``)$_+,`](```.2D``)$_+,0X8``!@`$`)'P(`Z:#P0`8@^$`
+M'#@A`"!.@``@E"'_T'P(`J:300`8DV$`').!`""3H0`DD\$`*)/A`"R0`0`T
+M?'T;>'R;(WA\NBMX?-\S>#O````](```.XD``!P>`!A\G``N'!X`!GP`VA14
+M`!`Z?+P`+G^CZWA(```!._\``7/@`#]`H@`,.&```4@```$[W@`!*!X`'4"!
+M_\0[P```/2```#N)``!7P!@X?2#B%'R<`"Z`J0`$?Z/K>$@```$[_P`!<^``
+M/T"B``PX8``!2````3O>``$H'@!_0('_S#O````](```.XD``!P>``Q\G``N
+M'!X``WP`TA14`!`Z?+P`+G^CZWA(```!._\``7/@`#]`H@`,.&```4@```$[
+MW@`!*!X`/T"!_\2``0`T?`@#IH-!`!B#80`<@X$`((.A`"2#P0`H@^$`+#@A
+M`#!.@``@E"'_T'P(`J:300`8DV$`').!`""3H0`DD\$`*)/A`"R0`0`T?'P;
+M>'R=(W@[0```.V```*%$```H"A*_08$`X#EJ]W`]`&9F80AF9WP+0)9\``YP
+M?6G^<'P)`%`<```%?`L``$""`"!520@\.\GNX'P>0)9\`!9P?\G^<'_)`%!(
+M``!0H00``#EH]U`]0&9F84IF9WP+4)9\``YP?6G^<'P)`%`<```%.&```'P+
+M``!`@@(L50D(/#O)[J!\'E"6?``6<'_)_G!_R0!0.T```5?>%CI_P_-X.(``
+M"$@```%\?AMX?X/C>#B```!@A*($2````:`=``!@90`0+``)M$&"``A490<T
+M?X/C>#B```!@A*($2````4@``7RA)```/`#,S&``S,U\"0`65`#POAP```5\
+M`$A05``$/BP```)`H@!0*`D5.T&A`$@Y*?_^52D$/ATI``H]*?__.2E$@#Q@
+M4>M@8X4??&D8EGQC'G!]*?YP?&D84#AC``$X@``(2````7Q^&W@X8```2```
+M_*$]```\`,S,8`#,S7P)`!94`.$^'```%'P`2%!4``0^+````$""`#`H"1/_
+M0*$`*#@)[4`\8&9F8&-F9WQ@&)9\8QYP?`#^<'Q@&%!48Q`Z2```F*$]```\
+M`,S,8`#,S7P)`!94`.C^'```"GP`2%!4``0^+````$"B`"@X">U`/&!F9F!C
+M9F=\8!B6?&,6<'P`_G!\8!A05&,(/$@``$RA/0``/`#,S&``S,U\"0`65`#P
+MOAP```5\`$A05``$/CA@```L````0*(`A#@)[4`\8&9F8&-F9WQ@&)9\8PYP
+M?`#^<'Q@&%`X@``(2````7Q^&W@X8``!.(```D@```%\>QMX5]\@-E=@$#I_
+M_P-X5T`(/'__`WAC_Q`!5^4&/G^#XW@X@```8(28G$@```%7Y<9^?X/C>#B`
+M``!@A)C82````9.\$C0X8``!@`$`-'P(`Z:#00`8@V$`'(.!`""#H0`D@\$`
+M*(/A`"PX(0`P3H``()0A_]!\"`*FDP$`$),A`!2300`8DV$`').!`""3H0`D
+MD\$`*)/A`"R0`0`T?'P;>'R[*WA\>AMX.,```#L````XX```.R```#O```"#
+MXR_LH`0``E0`!?8L``#008(`I$&!`!@L``"@08(`C"P``,!!@@"02```F"P`
+M`4!!@@`,+``!4$"B`(BA)```.2GP7R@)!.I!@0`0H-H35*,:$U9(``!TH20`
+M`#DIZW0H"0#O08$`$*#:$UBC&A-:2```6*$D```Y*>J$*`D`X$&!`!"@VA-<
+MHQH37D@``#R@!```*``67$"!`#"@VA-@HQH38D@``"2@XQ-DHR,39D@``!B@
+M^A-HHSH3:D@```PX8```2``#*#E````](```.0D``%5+$#I521@X?2E"%(`)
+M``1\"_DN-4H``4&"_^@Y8```/2```#E)``!5:1`Z?2GZ%!P+``9\`-H45``0
+M.GP*`"Z0"0`$-6L``4&"_^`Y8```/2```#E)``!5:1`Z?2GZ%!P+``9\`-H4
+M5``0.GP*`"Z0"0`(-6L``4&"_^`Y8```/2```#E)``!5:1`Z?2GZ%!P+``9\
+M`-H45``0.GP*`"Z0"0`,.6L``2@+`"1`@?_<H`0``G`)`(!!@@"4.[\`#'^C
+MZWA\Y#MX.*```SC``/$XX```2````7^CZWA_),MX.*```SC``.XXX```2```
+M`7^CZW@X@``!.*```3C``2,XX``"2````8`<`<PL```)08(`&"P```I`H@!H
+MH!P!T"@```-!@0!<.&``!CB```-(```!?&0;>#A_``PXH``#.,``@SC@``-(
+M```T.[\`#'^CZWA\Q#-X.*```SC``/<XX```2````7^CZWA_!,-X.*```SC`
+M`/0XX```2````3E@```](```.4D``%5I$#I]*?H4'`L`!GP`VA14`!`Z?`H`
+M+I`)`*`Y:P`!*`L``D"!_]P[H```/2```#MI``!7H!@X?)L`+E>@$#I\OP`N
+M?X/C>$@```$[W@`!<\``/T"B``PX8``!2````3>]``%!@O_0.Z```#T@```[
+M:0``'!T`&'R;`"Y7J1`Z?2GZ%("I``1_@^-X2````3O>``%SP``_0*(`##A@
+M``%(```!-[T``4&"_\P[H```/2```#MI```<'0`8?)L`+E>I$#I]*?H4@*D`
+M"'^#XWA(```!.]X``7/``#]`H@`,.&```4@```$WO0`!08+_S#N@```](```
+M.VD``!P=`!A\FP`N5ZD0.GTI^A2`J0`,?X/C>$@```$[W@`!<\``/T"B``PX
+M8``!2````3N]``$H'0`D0('_R#N@```](```.VD``!P=`!A\FP`N5ZD0.GTI
+M^A2`J0"@?X/C>$@```$[W@`!<\``/T"B``PX8``!2````3N]``$H'0`"0('_
+MR#@```"0&B_$.&```8`!`#1\"`.F@P$`$(,A`!2#00`8@V$`'(.!`""#H0`D
+M@\$`*(/A`"PX(0`P3H``((!C+^PH!``'08$`0#T@```Y*0W(5(`0.GP)`"Y\
+M`$H4?`D#IDZ`!"`X8P`$3H``(#AC``A.@``@.&,`#$Z``"`X8P"@3H``(#A@
+M``!.@``@5*`(/'UD`A2@!```?`,``$"```PX````2```%*`+__Y\`P``08``
+M.#@%__^0!P``D`8``$Z``"!\!$A0?``.<$O__^Q])$A0?2D.<)$F```Y*0`!
+MD2<``$Z``"!\B2-X?`180$R``""@"0``?``8`$&B_\B@"0`"?`,``$&@_\@Y
+M*0`"?`E80$R``"!+___<E"'_P'P(`J:2X0`<DP$`(),A`"2300`HDV$`+).!
+M`#"3H0`TD\$`.)/A`#R0`0!$?'<;>'S>,WA\^SMX?1Q#>'TX2WA4@`@\?!\'
+M-#N@```X8```*`@``4"!`/1\!"A05``$/GP=`$!!@0#@.RC__WP$*%!4&@0^
+M?^/[>'_$\WA_A>-X.,$`"#CA``Q+__[E@`$`#"P```!`@@`,.````9`!``R`
+M`0`(?`#(`$"B``PX'/_^D`$`"(`!``A4"P@\@`$`#%0`"#Q]*_*N?!X"KGP)
+M``!`H@`,?2O:+D@``$2!`0`(50@(/'SH\JY])_A0@`$`#%0`"#Q]>P(N?2E9
+MUGU>`JY\'U!0?6C:+GP`6=9]*0(4?4=04'TI4]95*00^5N`P,GP`ZA14``@\
+M?3@#+C@=``%4'00^.!\``GP?!S1\'=!`0('_-#A@``&``0!$?`@#IH+A`!R#
+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
+M(0`D@T$`*(-A`"R#@0`P@Z$`-(/!`#B#X0`\."$`0$Z``""4(?_0?`@"II-!
+M`!B380`<DX$`().A`"23P0`HD^$`+)`!`#1\>QMX?)PC>'R]*W@[0``!.\``
+M`'P>*$!`H`!,5\`8.'_\`A1_8]MX?^3[>#BA``@XP0`*2__]*2P#``!!@@`8
+MB`$`"9@?``:(`0`+F!\`!T@```@[0```.]X``7P>Z$!!@/^\?T/3>(`!`#1\
+M"`.F@T$`&(-A`!R#@0`@@Z$`)(/!`"B#X0`L."$`,$Z``""4(?_@?`@"II/!
+M`!B3X0`<D`$`)'R>(WA\?QMX.&``K$@```&0?R_L+`,``$&B`#0X``$`D!]&
+M?#A@`0!(```!D']&>"P#``!!H@`8.&`&`$@```&0?RRD+`,``$""`!0X```"
+MD!X``#A@``!(``!H/2```#DI``"1/RRH/2```#DI``"1/RRL/2```#DI``"1
+M/RRP/2```#DI``"1/RRT/2```#DI``"1/RRX/2```#DI``"1/RR\/2```#DI
+M``"1/RS`/2```#DI``"1/RS$.&```8`!`"1\"`.F@\$`&(/A`!PX(0`@3H``
+M(``````H4!8L6"@`````"10```I,```*4```"E0```DL```*7```"4@```E4
+M```*H```"60```ET```)N```"90```FD```)N```"=````K````*Q```"AP`
+M``HL```*F```"D````J@```*5```"F0```IT```*Z```"NP```JX```*]```
+M"L@```K\```+````"P0```KX_Z#_H_^>_Z#_H_^@````!0`*`!0`'@`R`$8`
+M50!:`%\`9`````H`%``>`"@`,@`\`$8`4`!:`&0`!``&``D`#````,(```#$
+M````Q0```-````#:````Y````,(```##````U````/(```$-```!*````,\`
+M``#*``(A4``!`4``!`"@``@`P``@`-``0`%0`````!F8`20&$"8`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````#_______\`````F`````!'``"8
+M"````````)@,"82.I@``F!`],N````"8%```!VL``)@<````````F"`"`@(`
+M``"8)```#@X``)@H"@("`0``F"P``V_\``"8,````````)@T```.#@``F#@`
+M```'``"8/``"`0```)A`B6,`````F$03<A:<``"82``8MC,``)A,$H1A/```
+MF%`-Z+C@``"85``'2%D``)A8?H"^N@``F%PQ.F9>``"88```'0@``)AD``'.
+M````F&A`FD&0``"8<`````\``)AT````@```F'@````$``"9`````````)D$
+M````````F0@```````"9#`"``````)D0`````P``FP````````";!````"``
+M`)L(````$```FPP````P``";$`````@``)L4````*```FQ@````H``";'```
+M``0``)L@````)```FR0````4``";*````#0``)LL````#```FS`````L``";
+M-`````(``)LX````(@``FSP````2``";0````#(``)M$````"@``FT@````J
+M``";3`````$``)M0````(0``FU0````1``";6````#$``)M<````"0``FV``
+M```I``";9`````4``)MH````)0``FVP````5``";<````#4``)MT````#0``
+MFW@````M``";?`````,``)N`````(P``FX0````3``";B````#,``)N,````
+M"P``FY`````K``";E`````<``)N8````)P``FYP````7``";H````#<``)ND
+M````#P``FZ@````O``";K````"\``)NP````+P``F[0````O``";N````"\`
+M`)N\````+P``F\`````O``";Q````"\``)O(````+P``F\P````O``";T```
+M`"\``)O4````+P``F]@````O``";W````"\``)O@````+P``F^0````O``";
+MZ````"\``)OL````+P``F_`````O``";]````"\``)OX````+P``F_P````O
+M``":`````!T``)H$````70``F@@```"=``":#````-T``)H0```!'0``FA0`
+M```A``":&````&$``)H<````H0``FB````#A``":)````#$``)HH````<0``
+MFBP```"Q``":,````!P``)HT````7```FC@````I``":/````&D``)I`````
+MJ0``FD0````@``":2````!D``)I,````60``FE````"9``":5````#```)I8
+M````!0``FEP````E``":8````&4``)ID````I0``FF@````H``":;````&@`
+M`)IP````'P``FG0````>``":>````!@``)I\````6```FH````"8``":A```
+M``,``)J(````!```FHP```!$``":D````(0``)J4````$P``FI@````2``":
+MG````%(``)J@````D@``FJ0```#2``":J````"L``)JL````*@``FK````!J
+M``":M````*H``)JX````&P``FKP````:``":P````%H``)K$````F@``FL@`
+M``#:``":S`````8``)K0````!@``FM0````&``":V`````8``)K<````!@``
+MFN`````&``":Y`````8``)KH````!@``FNP````&``":\`````8``)KT````
+M!@``FO@````&``":_`````8``)C4````(```F,P````$``"8R``&`08``)B<
+M````;0``F,````````"8T````!0)"0```````@(&!@8&!@8"`@`````#``8`
+M"0`\``````````````````````````#P````S`````````````````````H`
+M``````#B"@``(`$```(!```80```````!!@95P0%!A`F````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````"6P)CPFT`````(````"8(%55556JJJJJ
+M9F9F9IF9F9G_______\````````````@````(````$````!```8````&````
+M!@``````,````!4````5````'0```!4``!!``"_\#P`O_`\`+_P?`"_\#P``
+M$$0`+_P/`"_\#P`O_!\`+_P/```02``O_`\`+_P/`"_\'P`O_`\``!!,`"_\
+M#P`O_`\`+_P?`"_\#P``$%``+_P/`"_\#P`O_!\`+_P/```05``O_`\`+_P/
+M`"_\'P`O_`\``!!8`"_\#P`O_`\`+_P?`"_\#P``$%P`+_P/`"_\#P`O_!\`
+M+_P/```08``O_`\`+_P/`"_\'P`O_`\``!!D`"_\#P`O_`\`+_P?`"_\#P``
+M$'````%H```!X````;@```%H```0,````C````'@````L````C```!"P```-
+MF```$8```!](```-F```$/```*#@``%`:```6(```*#@``"`%`0`!``(``@`
+M(``P``0`!````(`<#HV/IPZ-C\\!8(^5#HV/IP``F`0``````````P``````
+M``````"8(`("`@`"`@(``@$"``("`@```)@D```.#@``#@X```<'```.#@``
+MF"@*`@`!"@(``04!```*`@`!``"8-```#@X```X.```.#@``#@X``)@X````
+M!P````<````+````"P``F$03<A:<$W(6I1-R%J@3<A:<``"82``8NF<`&+IG
+M`!BZ:0`8NFD``)A0#"BTX`PHM.`,*+3@#"BTX```F%A^@`TN?H`-+G[`#2Y^
+M@`TN``"87#$W75XQ-UU>,3I=7C$W75X``)A@``"]$```O1```+TX``"]$```
+MF&0``<X```'.```!S@```<X```"9%```)Q```"<0```5?```)Q```)D8```!
+MD````9````"$```!D```F41OX!`@;^`0(&_@"2!OX!`@``"A@`7_%/\%_Q3_
+M!?\4_P7_&?\``)C4````$````!0````0````$`````P`````````*(2$G)P`
+M```L?'Q\?````#0````%````0`````````!$````"````$@````(````3```
+M`!````!0`````````%0````?```(``````````@$````````"`@````````(
+M#`````````@0````````"!0````````(&`````````@<````````""``````
+M```()````````!(P````````@`0```````"`"````````(`,````````@!@`
+M``````"`)````````(`H````,```@"P`!___``"`,`'___\``(`T````,0``
+M@#@```````"`/````````(!`````````@$0````"``"`2````````(!4````
+M````@%@```````"8"````````)@,+820DP``F!!],N````"8%```#VL``)@<
+M````````F"P``F_^``"8,````````)@\``(!````F$`@:@%Z``"83!*$83P`
+M`)A4```(60``F&A`FD&0``"8;`4,L($``)AP````#P``F'0```"```"8>```
+M``P``)D`````````F00```````"9"````````)D,`(``````F1`````!``"9
+M'```"2H``)D@````````F20`!8H%``"9*`````$``)DL````````F3``````
+M``"9-````````)DX````````F3P````_``"90`````0``)E(````````F4P`
+M``````"94````````)E475#Q3```F5@````8``"97`!+:HX``*&$!O\%_P``
+MH8@'_P?_``"AC`C_"/\``*&0"?\)_P``H90*_PK_``"AF`O_"_\``*&<#/\,
+M_P``H:`-_PW_``"AI`__#O\``*&H$O\2_P``H:P4_Q/_``"AL!;_%?\``*&T
+M&?\7_P``H;@;_QK_``"AO![_'?\``*'`(_\@_P``H<0G_R7_``"AR"S_*?\`
+M`*',,?\O_P``H=`W_S3_``"AU#K_.O\``*'8.O\Z_P``H=PZ_SK_``"AX#K_
+M.O\``*'D.O\Z_P``H>@Z_SK_``"A[#K_.O\``*'P.O\Z_P``H?0Z_SK_``"A
+M^#K_.O\``*'\.O\Z_P``FP````````";!````"```)L(````$```FPP````P
+M``";$`````@``)L4````*```FQ@````$``";'````"0``)L@````%```FR0`
+M```T``";*`````P``)LL````+```FS`````"``";-````"(``)LX````$@``
+MFSP````R``";0`````H``)M$````*@``FT@````&``";3````"8``)M0````
+M%@``FU0````V``";6`````X``)M<````+@``FV`````!``";9````"$``)MH
+M````$0``FVP````Q``";<`````D``)MT````*0``FW@````%``";?````"4`
+M`)N`````%0``FX0````U``";B`````T``)N,````+0``FY`````#``";E```
+M`",``)N8````$P``FYP````S``";H`````L``)ND````*P``FZ@````K``";
+MK````"L``)NP````*P``F[0````K``";N````"L``)N\````*P``F\`````K
+M``";Q````"L``)O(````*P``F\P````K``";T````"L``)O4````*P``F]@`
+M```K``";W````"L``)O@````*P``F^0````K``";Z````"L``)OL````*P``
+MF_`````K``";]````"L``)OX`````@``F_P````6``"8U````"```)C8`&`0
+M:```F@````&I````````F@0```'I````0```F@@````I````@```F@P```!I
+M```!4```FA````&9```!D```FA0```'9```!T```FA@````9````$```FAP`
+M``!9````1```FB````"9````A```FB0```&E```!2```FB@```'E```!B```
+MFBP````E```!R```FC````'(````%```FC0````(````0@``FC@```!(````
+M@@``FCP```"(```!>```FD````&8```!N```FD0```'8```!^```FD@````8
+M````$@``FDP```!8````4@``FE````"8````D@``FE0```&D```!?```FE@`
+M``'D```!O```FEP````D```!_```FF````!D````"@``FF0```"D````2@``
+MFF@```#D````B@``FFP```$*```!6@``FG````%*```!F@``FG0```&*```!
+MV@``FG@```'*````#@``FGP````*````3@``FH````!*````C@``FH0```"*
+M```!7@``FH@```&Z```!G@``FHP```'Z```!W@``FI`````Z````"0``FI0`
+M``!Z````20``FI@```&&````B0``FIP```'&```!>0``FJ`````&```!N0``
+MFJ0```!&```!^0``FJ@```"&````.0``FJP```#&````>0``FK````#&````
+MN0``FK0```#&```!O0``FK@```#&```!_0``FKP```#&````/0``FL````#&
+M````?0``FL0```#&````O0``FL@```#&````_0``FLP```#&````_0``FM``
+M``#&````_0``FM0```#&````_0``FM@```#&````_0``FMP```#&````_0``
+MFN````#&````_0``FN0```#&````_0``FN@```#&````_0``FNP```#&````
+M_0``FO````#&````_0``FO0```#&````_0``FO@```#&````_0``FOP```#&
+M````_0````$```!&`&````````$```!&`&$```````$```!&`&(```````$`
+M``!&`&,```````$```!&`&0```````$```!&`&4```````$```!&`&8`````
+M``$```!&`&<```````$```!&`&@```````$```!&`&D```````$```!&`&H`
+M``````$```!&`&L```````$```!&`&P```````$```!&`'0```````$```!&
+M`'0```````$```!&`'0```````$```!&`'0```````$```!&`'0```````$`
+M``!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'4`````
+M``$```!&`'8```````$```!&`'<```````$```!&`'@```````$```!&`'D`
+M``````$```!&`'H```````$```!&`'L```````$```!&`'P```````$```!&
+M`'T```````$```!&`'X```````$```!&`'\```````$```!&`(````````$`
+M``!$`'P```````$```!&`(@```````$```!&`(P```````$```!&`)``````
+M``$```!&`)0```````$```!&`)@```````$```!&`)P```````$```!&`*``
+M``````$```!&`*0```````$```!&`*@```````$```!&`*P```````$```!&
+M`+````````$```!&`+0````"!P`6G@`+%F(`"A8Z``D6'``(%>H`!Q6:``45
+M2@`$%0,``A19```````!`````P`&``D`/P`````D"```)`P``"0L```D,```
+M)%```"14```D=```)'@````)````!``$``$``0`!````!D9'.```````````
+M````````!`````$``0````1&1S<```````````````````,``0`!``$````#
+M1D<V```````````````````$```````!`````49'-0``````````````````
+M!``!``$```````!&1S0```````````````````0````!``#____^1D<S````
+M```````````````#``$``0``_____49',@``````````````````!```````
+M`/____Q&1S$```````````````````(``0`!``#____Z1D<P````````````
+M````````````````````````````````````````````````&500%`80)@``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````EL"8\)M`D("6P)M/__
+M_\G____)____R?___\G____"____\O____+____R____\O____3____`____
+MP/___\#____`____NO___[+___^R____LO___[+___^P________!0(/!P(/
+M"@`/"0`/`````(````"8(%55556JJJJJ9F9F9IF9F9D```-X```#-````T``
+M``/$```#8````\0`````````(````"````!`````0``&````!@````8``!:>
+M``L68@`*%CH`"18<``@5Z@`'%9H`!15*``05`P`"%%D```NX``$````````4
+MA```$@P``!)0```2>```%)0``!+<```4G```%*```!2D```4J```%*P``!,D
+M```4M```%+@``!2\```4P```$T```!-@```4S```$[0``!/<```4V```$O``
+M`!3@```4Y```%.@``!0\```43```%/0``!1@```4?```%(```!1<```4:```
+M%'0``!2````4C``````````&`````0````(````#````!`````4``!:(```6
+MC```%0```!4D```6F```%7```!:@```6I```%J@``!:L```6L```%;0``!:X
+M```6O```%L```!;$```5X```%LP``!;0```5_```%J0``!;<```6X```%N0`
+M`!;H```6[```%CP``!9````6^```%IP``!!``"_\#P`O_`\`+_P?`"_\#P`O
+M_`\``!!$`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!(`"_\#P`O_`\`+_P?`"_\
+M#P`O_`\``!!,`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!0`"_\#P`O_`\`+_P?
+M`"_\#P`O_`\``!!4`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!8`"_\#P`O_`\`
+M+_P?`"_\#P`O_`\``!!<`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!@`"_\#P`O
+M_`\`+_P?`"_\#P`O_`\``!!D`"_\#P`O_`\`+_P?`"_\#P`O_`\``!`P```"
+M,````>````"P```!8````>```!!P```!:````>````&X```!C````>```!"P
+M```.8```$8```!\<```^.```$8```!#P``"@X``!0&@``%B```"PX``!0&@`
+M`(`4`^@#Z`;@!N`$(`0@"$`(0`;@!N```)@$``````````,`````````````
+M``,``)@@`@("``("`@`"`0(``@("``("`@```)@D```.#@``#@X```<'```.
+M#@``#@X``)A$$W(6'!-R'"43<A<B$W(6HA-R'"4``)A@``"=$```G1```)T8
+M``"=&```G1```)AD``'.```!S@```<X```'.```!S@```)AH0)I!D$":09!`
+MFD&00)I!D$":09```)D8```!N````;@```"$```!"````;@``)DD$`6*!1`%
+MB@40!8H%$`6*!1`%B@4``*(P```````````````````!"``````````,````
+M`````#0````%````0`````````!$````"````$@````(````3````!````!0
+M`````````%0````?```(``````````@$````````"`@````````(#```````
+M``@0````````"!0````````(&`````````@<````````""`````````()```
+M`````!)P````````$#@````````0>````````!"X````````$/@````````1
+M.````````!%X````````$;@````````1^````````!(X````````$G@`````
+M```2N````````!+X````````$S@````````3>````````!.X````````$_@`
+M```````4.````````!1X````````%+@````````4^````````!4X````````
+M%7@````````5N````````!7X````````%C@````````6>````````!:X````
+M````%O@````````7.````````!=X````````%[@````````7^````````!`\
+M````````$'P````````0O````````!#\````````$3P````````1?```````
+M`!&\````````$?P````````2/````````!)\````````$KP````````2_```
+M`````!,\````````$WP````````3O````````!/\````````%#P````````4
+M?````````(`$````````@`@```````"`#````````(`@````````@"0`````
+M``"`*````#```(`L``?__P``@#`!____``"`-````#$``(`X````````@#P`
+M``````"`2````````(!4````````@%@```````"`7``/QX\``(#`*H(P&@``
+M@,0%W`'@``"`R!]`)Q```(#,`?0`````@-```!X<``"`U``"JJH``(#8`@!5
+M50``@-P```````"`X/____\``(#D``#__P``@.@```````"`[````````(#P
+M````````@/0```````"`^````````(#\````B```AP````````"'!````(P`
+M`(<(````Y```APP```+5``"'$````````(<4````````AQ@```"@``"''```
+M`<D``(<@````+```AR0````L``"'*````#```(<L````/```AS`````L``"'
+M-````"P``(<X````,```ASP````\``"'0````````(=$````````AT@`````
+M``"'3````````(=0````````AU0```````"'6````````(=<````````AV``
+M``#5``"'9````-\``(=H```!`@``AVP```$Z``"'<````'4``(=T````?P``
+MAW@```"B``"'?````````($```$``@``@00````!``"!"````,```($,````
+M````@1````%H``"!%````````(?``P(!````A\0'!@4$``"'R`L*"0@``(?,
+M#PX-#```A]`3$A$0``"'U!<6%10``(?8&QH9&```A]P?'AT<``"'X`,"`0``
+M`(?D!P8%!```A^@+"@D(``"'[`\.#0P``(?P$Q(1$```A_07%A44``"'^!L:
+M&1@``(?\'QX='```F`RMA(X9``"8$'THX````)@4G`J?:P``F!P```````"8
+M0"!J`7H``)A4```(60``F0````````"9!````````)D(````````F0P`@```
+M``"9$`````$``)D<```,@```F2`%$`````"9*`````$``)DL````!```F30>
+M'R`B``"9.`H+#`T``)D\````/P``F4B2@+(2``"95%U0X8@``)E<`$MJC@``
+MF6@```/.``"9<!DOM14``)EX`````0``F7P```````"B$`"`8S,``*(4`!!L
+M$```HA@`G$!@``"B(`&(,,8``*(D```$````HBP```````"B-"`@("```*(X
+M("`@(```HD`X20H@``"B1```>[8``*)(#_\__```FP````````";*`````P`
+M`)LX````$@``FV0````A``";C````"T``)N<````,P`!``(``@`!``$``@`!
+M`````P`&``D`/P````,`!@`)`#\```````D````$``0``0`!``$`````````
+M``````9&1S@```````````````````0````!``$```````````````1&1S<`
+M``````````````````,``0`!``$```````````````-&1S8`````````````
+M``````0```````$```````````````%&1S4```````````````````0``0`!
+M``````````````````!&1S0```````````````````0````!````````````
+M`/____Y&1S,```````````````````,``0`!`````````````/____U&1S(`
+M``````````````````0``````````````````/____Q&1S$`````````````
+M``````(``0`!`````````````/____I&1S``````````````````````````
+M````````````````````````````````````````````"`````$``P``````
+M````````````````!D9'-P```````````````````@``````````````````
+M`````$9'-@```````````````````0``````````````````_____49'-0``
+M````````````````````````````````````____^D9'-```````````````
+M```````!``$`````````````____^$9',P`````````````````````!``$`
+M```!``$`````____]D9',@`````````````````````!`````0`!``$`````
+M____\T9',0`````````````````````!`````0`!`````0``____\$9',```
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````!_````
+M,@```'\````H````?P```$T```!_````0````!\````0````/P```#`````(
+M````!@`````````$````"`````(````$````!@````@````*````#`````X`
+M```0```*%````_0```4,```';```"`````BH```)>````#```(`5``"`%0``
+M@!4``(`5``"`%0``@!P2C8^G"8@/SP3@#Y42X`^K"8@/SP``F"@*`@`!"@(`
+M`04!`0`*`@`!"@(``0``F#0```X.```.#@``#@X```X.```.#@``F#@````'
+M````!P````L````+````"P``F$@`&-I:`!C:6@`8RFD`&,II`!C*:0``F%`-
+MZ+3@#>BTX`WHM.`-Z+3@#>BTX```F%A^@`TN?H`-+G[H32Y^Z$TN?H`-+@``
+MF%PQ-V9>,3=F7C$W9EXQ-V9>,3=A7@``F&P%#+"!!0RP@04,L($%#+"`!0RP
+M@```F10``"<0```G$```%7P``"KX```G$```F43WN!`@][@0(/>X#2#WN!`@
+M][@0(```H@QD+$%J9"Q!:F1`06ID0$%J9$!!:@``HAP8@X`*&(.`"AAS@`H8
+M@X`*&(.`"@``$C````````"8"````````)@L``(O_@``F#P``@$```"83!*$
+M83P``)DP``!(@P``F4`````$``"96````/\``)ET````````F?@````8``"B
+M!````````*((T#YGB```HB@```&U``"B/!/(B:\``)L$````(```FP@````0
+M``";#````#```)L0````"```FQ0````H``";&`````0``)L<````)```FR``
+M```4``";)````#0``)LL````+```FS`````"``";-````"(``)L\````,@``
+MFT`````*``";1````"H``)M(````!@``FTP````F``";4````!8``)M4````
+M-@``FU@````.``";7````"X``)M@`````0``FV@````1``";;````#$``)MP
+M````"0``FW0````I``";>`````4``)M\````)0``FX`````5``";A````#4`
+M`)N(````#0``FY`````#``";E````",``)N8````$P``FZ`````+``";I```
+M`"L``)NH````*P``FZP````K``";L````"L``)NT````*P``F[@````K``";
+MO````"L``)O`````*P``F\0````K``";R````"L``)O,````*P``F]`````K
+M``";U````"L``)O8````*P``F]P````K``";X````"L``)OD````*P``F^@`
+M```K``";[````"L``)OP````*P``F_0````K``";^`````(``)O\````%@``
+MF)P`````````````````````````````F)P`````````````````````````
+M````F)P`````````````````````````````F)P`````````````````````
+M````````F)P`````````````````````````````F)P`````````````````
+M````````````F)P`````````````````````````````F)P`````````````
+M````````````````F)P`````````````````````````````F)P`````````
+M````````````````````F)P`````````````````````````````F)P`.```
+M`#@````X````.````#@`````F)P`````````````````````````````F)P`
+M````````````````````````````F)P``````````````,````"`````@```
+MF)P`!`#Y``0`^0`$`/\`!`#]``0`_0``F-0```````````````0````$````
+M!```F@````&I````````F@0```'I````0```F@@````I````@```F@P```!I
+M```!4```FA````&9```!D```FA0```'9```!T```FA@````9````$```FAP`
+M``!9````1```FB````"9````A```FB0```&E```!2```FB@```'E```!B```
+MFBP````E```!R```FC````'(````%```FC0````(````0@``FC@```!(````
+M@@``FCP```"(```!>```FD````&8```!N```FD0```'8```!^```FD@````8
+M````$@``FDP```!8````4@``FE````"8````D@``FE0```&D```!?```FE@`
+M``'D```!O```FEP````D```!_```FF````!D````"@``FF0```"D````2@``
+MFF@```#D````B@``FFP```$*```!6@``FG````%*```!F@``FG0```&*```!
+MV@``FG@```'*````#@``FGP````*````3@``FH````!*````C@``FH0```"*
+M```!7@``FH@```&Z```!G@``FHP```'Z```!W@``FI`````Z````"0``FI0`
+M``!Z````20``FI@```&&````B0``FIP```'&```!>0``FJ`````&```!N0``
+MFJ0```!&```!^0``FJ@```"&````.0``FJP```#&````>0``FK````#&````
+MN0``FK0```#&```!O0``FK@```#&```!_0``FKP```#&````/0``FL````#&
+M````?0``FL0```#&````O0``FL@```#&````_0``FLP```#&````_0``FM``
+M``#&````_0``FM0```#&````_0``FM@```#&````_0``FMP```#&````_0``
+MFN````#&````_0``FN0```#&````_0``FN@```#&````_0``FNP```#&````
+M_0``FO````#&````_0``FO0```#&````_0``FO@```#&````_0``FOP```#&
+M````_0``F-0````@``"8U````!`````4````$````!`````4``"8V`!@$&@`
+M8!!H`&`0:`!@$&@`8!!H``"8G`````````````````````````````"8G```
+M``````````````````````````"8G`````````````````````````````"8
+MG`````````````````````````````"8G```````````````````````````
+M``"8G!`````0````$````!`````0``````"8G`0````$````!`````0````$
+M``````"8G`````````````````````````````"8G```````````````````
+M``````````"8G`````````````````````````````"8G```````````"@``
+M``````````````"8G``X`,``.`"``C@`P``X`,``.`#```"8G``"``8``@`&
+M````!@`"``8``@`&``"8G````(D```")````B0```(D```")``"8G````*``
+M``"@````H````*````"@``"8G``$``<`!``'``0`!P`$``<`!``'``"8U```
+M`!H````:````&@```!H````:``"8G````$````!(````0````$````!```"8
+MG````!`````0````$````!`````0``"8G`````@````(````"`````@````(
+M``"8G````$\```!/````3P```$\```!/``"8G````/$```#Q````80```/$`
+M``#Q``"8G```D$\``)!/``"03```D$\``)!/``"8G```$EH``!):```2F@``
+M$EH``!):``"8S`````X````.````#P````X````.`````0```$8`8```````
+M`0```$8`80```````0```$8`8@```````0```$8`8P```````0```$8`9```
+M`````0```$8`90```````0```$8`9@```````0```$8`9P```````0```$8`
+M:````````0```$8`:0```````0```$8`:@```````0```$8`:P```````0``
+M`$8`;````````0```$8`=````````0```$8`=````````0```$8`=```````
+M`0```$8`=````````0```$8`=````````0```$8`=````````0```$8`=```
+M`````0```$8`=````````0```$8`=0```````0```$8`=@```````0```$8`
+M=P```````0```$8`>````````0```$8`>0```````0```$8`>@```````0``
+M`$8`>P```````0```$8`?````````0```$8`?0```````0```$8`?@``````
+M`0```$8`?P```````0```$8`@````````0```$0`?````````0```$8`B```
+M`````0```$8`C````````0```$8`D````````0```$8`E````````0```$8`
+MF````````0```$8`G````````0```$8`H````````0```$8`I````````0``
+M`$8`J````````0```$8`K````````0```$8`L````````0```$8`M``````"
+M[````L0```+0```"W````O@```+\```"\````OP6G@`&%F(`!!8Z``,6'``"
+M%>H``16:```52@``%0,``119``,+N``%`````````#```(`5``"`%0``@!4`
+M`(`5``"`%0``@!P2C9.G"8@3SP3@$Y42X!.K"8@3SP``F"@*`@`!"@(``04"
+M`0`*`@`!"@(``0``F#0```X.```.#@``#@X```X.```.#@``F#@````'````
+M!P````L````+````"P``F$@`&-IM`!C:;0`8RG4`&,IU`!C*=0``F%`-Z+3@
+M#>BTX`WHM.`-Z+3@#>BTX```F%A^@`TN?H`-+G[H#2Y^Z`TN?H`-+@``F%PQ
+M-V9>,3=F7C$W9EXQ-V9>,3=F7@``F&P%#+"!!0RP@04,L($%#+"!!0RP@0``
+MF10```?0```'T```!$P```B8```'T```F43WN!`@][@0(/>X#1#WN!`0][@0
+M$```H@0```````````````@````(````"```H@C6OF>(UKYGB-`^9XC0/F>(
+MT#YGB```H@QD+`%`9"P!0&1"P6!D0L%@9$+!8```HAP8@X`*&(.`"AAS@`H8
+M@X`*&(.`"@``$C````````"8"````````)@L``(O_@``F#P``@$```"83!*$
+M83P``)DP``!(@@``F4`````$``"96````/\``)ET````````HB@```&U``"B
+M/!/(B:\``)L$`````0``FP@````"``";#`````,``)L0````!```FQ0````%
+M``";&`````@``)L<````"0``FR`````*``";)`````L``)LL````#0``FS``
+M```0``";-````!$``)L\````$P``FT`````4``";1````!4``)M(````&```
+MFTP````9``";4````!H``)M4````&P``FU@````<``";7````!T``)M@````
+M(```FV@````B``";;````",``)MP````)```FW0````E``";>````"@``)M\
+M````*0``FX`````J``";A````"L``)N(````+```FY`````P``";E````#$`
+M`)N8````,@``FZ`````T``";I````#4``)NH````-0``FZP````U``";L```
+M`#4``)NT````-0``F[@````U``";O````#4``)O`````-0``F\0````U``";
+MR````#4``)O,````-0``F]`````U``";U````#4``)O8````-0``F]P````U
+M``";X````#4``)OD````-0``F^@````U``";[````#4``)OP````-0``F_0`
+M```U``";^````!```)O\````&@``F@`````'````!P``F@0```!'````1P``
+MF@@```"'````AP``F@P```&@```!H```FA````'@```!X```FA0````@````
+M(```FA@```!@````8```FAP```&A```!H0``FB````'A```!X0``FB0````A
+M````(0``FB@```!A````80``FBP```%B```!8@``FC````&B```!H@``FC0`
+M``'B```!X@``FC@````B````(@``FCP```!B````8@``FD````%C```!8P``
+MFD0```&C```!HP``FD@```'C```!XP``FDP````C````(P``FE````!C````
+M8P``FE0```&$```!A```FE@```'$```!Q```FEP````$````!```FF````'J
+M````"P``FF0````J````2P``FF@```!J````BP``FFP```"J```!K```FG``
+M``&K```![```FG0```'K````+```FG@````K````$@``FGP```!K````4@``
+MFH````"K````D@``FH0```&L```!DP``FH@```'L```!TP``FHP````L````
+M$P``FI`````Z````4P``FI0```!Z````DP``FI@```"Z```!E```FIP```&[
+M```!U```FJ````'[````%```FJ0````[````.@``FJ@```![````>@``FJP`
+M``"[````N@``FK````&\```!NP``FK0```'\```!^P``FK@````\````.P``
+MFKP```!\````>P``FL````"\````NP``FL0```#\```!O```FL@```#\```!
+M_```FLP```#\````/```FM````#\````?```FM0```#\````O```FM@```#\
+M````_```FMP```#\````_```FN````#\````_```FN0```#\````_```FN@`
+M``#\````_```FNP```#\````_```FO````#\````_```FO0```#\````_```
+MFO@```#\````_```FOP```#\````_```F-0````@``"8T`,&!`@#!P0(`P8$
+M"`,&!`@#!P0(``"8W`"@(,``H"#``.`@P`#@(,``X"#```"8G`\````/````
+M#P````\````/``````"8G`````````````````````````````"8G`"`````
+M@````(````"`````@`````"8G``J````*@```"H````J````*@````"8G``!
+M`````0````$````!`````0````"8G`````````````````````````````"8
+MG``8````&````!@````8````&`````"8G`!@````8````&X```!N````;@``
+M``"8G`#'````QP```,<```#'````QP````"8G`!+````2P```$L```!+````
+M2P````"8G`1(```$2```!$@```1(```$2`````"8G`!,````3````$P```!,
+M````3`````"8G`#D````Y````.0```#D````Y`````"8G```````````````
+M``````````````"8G`#\````_````/P```#\````_`````"8G`#_````_P``
+M`/\```#_````_P````"8G`0_```$/P``!#\```0_```$/P````"8G``,````
+M#`````P````,````#`````"8G`(9```"&0```AD```(9```"&0````"8G``D
+M````)````"0````D````)`````"8G`"T````M````+0```"T````M`````"8
+MG`"9````F0```)D```"9````F0````"8G`!0````4````%````!0````4```
+M``"8G``J````*@```"H````J````*@````"8G``2````$@```!(````2````
+M$@````"8G,`R``#`,@``P#(``,`R``#`,@````"8G`%T```!=````70```%T
+M```!=`````"8G``1````$0```!$````1````$0````"8G(8H``"&*```AB@`
+M`(8H``"&*`````"8G#&$```QA```,80``#&$```QA`````"8G`#R`(``\@"`
+M`/(`@`#R`(``\@"```"8G``G`!D`)P`9`"<`&0`G`!D`)P`9``"8G`````,`
+M```#`````P````,````#``"8G`````````````````````````````"8G```
+M`+(```"R````L@```+(```"R``"8G`"P((0`L""$`+`@A`"P((0`L""$``"8
+MG`!!):0`026D`$$EI`!!):0`026D``"8G``1DB``$9(@`!&2(``1DB``$9(@
+M``"8G``:2```&D@``!I(```:2```&D@```"8V``+`C``"P(P``L",``+`C``
+M"P(P``"8G````)0```"4````E````)0```"4``"8G````)$```"1````D0``
+M`)$```"1``"8G````!(````2````$@```!(````2``"8G````(````"`````
+M@````(````"```"8G````-D```#9````V0```-D```#9``"8G````&````!@
+M````8````&````!@``"8G````/````#P````\````/````#P``"8G````*(`
+M``"B````H@```*(```"B``"8G````%(```!2````4@```%(```!2``"8G```
+M`-0```#4````U````-0```#4``"8G```%,P``!3,```4S```%,P``!3,``"8
+MG```!(P```2,```$C```!(P```2,``"8Q`````,````#`````P````,````#
+M```$I```!*P```2,```$F```!+0```2X```$K```!+@````P````%0```!4`
+M```5````%0```!4``(`<$HV3IPF($\\$X!.5$N`3JPF($\\``)@H"@(``0H"
+M``$%`@``"@(``0H"``$``)@T```.````#@````X````.````#@```)@X````
+M`@````(````*````"@````H``)A(`!C:;0`8VFT`&FID`!IJ9``::F0``)A0
+M#>BTX`WHM.`-Z+#:#)BPV@WHL-H``)A8?H`-+GZ`#2Y^Z`TN?L@-+GZ`#2X`
+M`)A<,3=F7C$W9EXQ-V9>,3E@7C$W9EX``)AL!0RP@04,L($%#+"!!0RP@04,
+ML($``)D4```'T```!]````1,```(F```!]```)E$][@0`/>X$`#WN`T`][@0
+M`/>X$````*($`````````````````````````````*((UKYGB-:^9XC0/F>(
+MT#YGB-`^9X@``*(,`"P!0``L`4``0L%``$+!0`!"P4```*(<&(.`"AB#@`H8
+M8X`*&(.`"AB#@`H``!(P```#X```@&`````/``"!&````````($<````````
+M@2````````"!)````````($H````````@2P```````"!,````````($T````
+M````@3@```````"!/````````(%`@```J```@40```````"8"````````)@L
+M``"@````F#P`(`0```"83!*$(SP``)AP````'P``F'0```"```"8>`````X`
+M`)E8````_P``F8````````"9A`*``````)F@````````F>````````"9Y*JJ
+MJJH``)GH/$9D>```F>P```"J``"9\`````P``)GT````_P``F?@````4``"B
+M*```";4``*(\D\B)KP``HDP````!``"B4```H````*)4````````HE@,QU.`
+M``"B7`\/#P$``*)@7VD/`0``HF0`08H1``"B:````````*)L###!:@``HG``
+M@@@@``"B=``;?*H``*)X'.<YS@``HGP%%P'.``"C`!@!`````*,$,`,F`@``
+MHPA(!SX&``"C#%8+3`H``*,09!I@#P``HQ1X3VX;``"C&(:/?%H``*,<CL^&
+M6P``HR"=3Y</``"C)*7/H8\``*,HM5^O'P``HRR]W[F?``"C,,U_QS\``*,T
+MU?_1OP``HS@```````"C/````````*-`````````HT0```````"C2#____\`
+M`*-,/____P``HU`_____``"C5``#__\``*-8>:BJ'P``HUP&;$(/``"C8`\H
+M(@<``*-D%V`6A0``HV@?@!$$``"C;#>@#`,``*-P/\0(@P``HW17P`@#``"C
+M>%_8!H(``*-\?^`$@@``HX!_/'NZ``"CA/,P?_```)L$`````0``FP@````"
+M``";#`````,``)L0````!```FQ0````%``";&`````@``)L<````"0``FR``
+M```*``";)`````L``)LL````#0``FS`````0``";-````!$``)L\````$P``
+MFT`````4``";1````!4``)M(````&```FTP````9``";4````!H``)M4````
+M&P``FU@````<``";7````!T``)M@````(```FV@````B``";;````",``)MP
+M````)```FW0````E``";>````"@``)M\````*0``FX`````J``";A````"L`
+M`)N(````+```FY`````P``";E````#$``)N8````,@``FZ`````T``";I```
+M`#4``)NH````-0``FZP````U``";L````#4``)NT````-0``F[@````U``";
+MO````#4``)O`````-0``F\0````U``";R````#4``)O,````-0``F]`````U
+M``";U````#4``)O8````-0``F]P````U``";X````#4``)OD````-0``F^@`
+M```U``";[````#4``)OP````-0``F_0````U``";^````!```)O\````&@``
+MF@``````````````F@0`````````0```F@@`````````@```F@P````````!
+M@0``FA`````````!P0``FA0``````````0``FA@`````````00``FAP`````
+M````@0``FB`````````!:```FB0````````!J```FB@````````!Z```FBP`
+M````````*```FC``````````:```FC0````````!B0``FC@````````!R0``
+MFCP`````````"0``FD``````````20``FD0`````````B0``FD@````````!
+MD```FDP````````!T```FE``````````$```FE0`````````4```FE@`````
+M````D```FEP````````!D0``FF`````````!T0``FF0`````````$0``FF@`
+M````````40``FFP`````````D0``FG`````````!>```FG0````````!N```
+MFG@````````!^```FGP`````````.```FH``````````>```FH0````````!
+MF0``FH@````````!V0``FHP`````````&0``FI``````````60``FI0`````
+M````F0``FI@`````````V0``FIP`````````^0``FJ``````````^0``FJ0`
+M````````^0``FJ@`````````^0``FJP`````````^0``FK``````````^0``
+MFK0`````````^0``FK@`````````^0``FKP`````````^0``FL``````````
+M^0``FL0`````````^0``FL@`````````^0``FLP`````````^0``FM``````
+M````^0``FM0`````````^0``FM@`````````^0``FMP`````````^0``FN``
+M````````^0``FN0`````````^0``FN@`````````^0``FNP`````````^0``
+MFO``````````^0``FO0`````````^0``FO@`````````^0``FOP`````````
+M^0``F-0````@``"8T`(`%`@"`10(`@`4"`(`%`@"`10(``"8W`"@(,``H"#`
+M`.`@P`#@(,``X"#```"8G/````#P````\````/````#P``````"8G```````
+M``````````````````````"8G`,````#`````P````,````#``````"8G```
+M``````````````````````````"8G`````````````````````````````"8
+MG`````````````````````````````"8G```````````````````````````
+M``"8G`````````````````````````````"8G$!```!`0```0$```$!```!`
+M0`````"8G&4%``!E!0``904``&4%``!E!0````"8G```````````````````
+M``````````"8G`````````````````````````````"8G`!"````0@```$(`
+M``!"````0@````"8G`"U````M0```+4```"U````M0````"8G``#`````P``
+M``,````#`````P````"8G`#W````]P```/<```#W````]P````"8G`"=````
+MG0```)T```"=````G0````"8G``B````(@```"(````B````(@````"8G`0B
+M```$(@``!"(```0B```$(@````"8G``C`!@`(P`8`",`&``C`!@`(P`8``"8
+MG``H````*````"@`8``H`&``*`!@``"8G`!0`,``4`#``%``PP!0`,,`4`##
+M``"8G``$`'\`!`!_``0`?P`$`'\`!`!_``"8G```!%@```18```$6```!%@`
+M``18``"8G`````````````````````````````"8G```P````,````#`````
+MP````,````"8V`!``C``0`(P`$`",`!``C``0`(P``"8G```9````&0```!D
+M````9````&0```"8G```"`````@````(````"`````@```"8S`````X````.
+M````#@````X````.```'W```!^0```?$```'T```!^P```?P```'Y```!_``
+M```P````%0```!4````5````%0```!4``(`<$HV3IPF($\\$X!.5$N`3JPF(
+M$\\``)@H"@(``0H"``$%`@$`"@(``0H"``$``)@T```.#@``#@X```X.```.
+M#@``#@X``)@X````!P````<````+````"P````L``)A(`!CZ80`8^F$`&AIC
+M`!H:8P`:&F,``)A0#)BTX`R8M.`,F+#:#)BPV@R8L-H``)A8?L@-+G[(#2Y^
+MR`TN?L@-+G[(#2X``)A<,3E@7C$Y8%XQ.6!>,3E@7C$Y8%X``)AL!0RP@04,
+ML($%#+"!!0RP@04,L($``)D4```'T```!]````1,```(F```!]```)E$][@0
+M`/>X$`#WN`T`][@0`/>X$````*($`````````````````````````````*((
+MUKYGB-:^9XC0/F>(T#YGB-`^9X@``*(,`"[!X``NP>``*L$@`"K!(``JP2``
+M`*(<&(.`"AB#@`H88X`*&(.`"AB#@`H``*,`&`$``!@!```8`0``&`$``!@!
+M`````*,$,`,F`C`#)@(P`R8",`,F`C`#)@(``*,(2`<^!D@'/@9(!SX&2`<^
+M!D@'/@8``*,,5@M,"E8+3`I6"TP*5@M,"E8+3`H``*,09!I@#V0:8`]D&F`/
+M9!I@#V0:8`\``*,4>$]N&WA/;AMX3VX;>$]N&WA/;AL``*,8AH]\6H:/?%J&
+MCWQ:AH]\6H:/?%H``*,<D,^&6Y#/AEN.SX9;CL^&6X[/AEL``*,@G4^7#YU/
+MEP^;3Y</FT^7#YM/EP\``*,DI\^CCZ?/HX^CSY^/H\^?CZ//GX\``*,HM5^O
+M'[5?KQ^S7Z\?LU^O'[-?KQ\``*,LO=^YG[W?N9^[W[F?N]^YG[O?N9\``*,P
+MRW_%/\M_Q3_+?\<_RW_'/\M_QS\``*,TU?_1O]7_T;_3_]&_T__1O]/_T;\`
+M`!(P```#X```0&@````0``"`8`````\``("<````````@*````````"!&```
+M`````($<````````@2````````"!)````````($H````````@2P```````"!
+M,````````($T````````@3@```````"!/````````(%`@``#^0``@40`````
+M``"8"````````)@L``"@````F#P`(`0```"83!*$(SP``)AP````'P``F'0`
+M``"```"8>`````X``)E8``@?_P``F8````````"9A`*``````)F@````````
+MF>````````"9Y*JJJJH``)GH/$9D>```F>P```"J``"9\`````P``)GT````
+M_P``F?@````4``"B*```";4``*(\D\B)KP``HDP````!``"B4```H````*)4
+M````````HE@,QU.```"B7`\/#P$``*)@7VD/`0``HF0`08H1``"B:```````
+M`*)L###!:@``HG``@@@@``"B=`@;?*H``*)X'.<YS@``HGP%%P'.``"C.```
+M`````*,\````````HT````````"C1````````*-(/____P``HTP_____``"C
+M4#____\``*-4``/__P``HUAYJ*H?``"C7`9L0@\``*-@#R@B!P``HV078!:%
+M``"C:!^`$00``*-L-Z`,`P``HW`_Q`B#``"C=%?`"`,``*-X7]@&@@``HWQ_
+MX`2"``"C@'\\>[H``*.$\S!_\```FP0````!``";"`````(``)L,`````P``
+MFQ`````$``";%`````4``)L8````"```FQP````)``";(`````H``)LD````
+M"P``FRP````-``";,````!```)LT````$0``FSP````3``";0````!0``)M$
+M````%0``FT@````8``";3````!D``)M0````&@``FU0````;``";6````!P`
+M`)M<````'0``FV`````@``";:````"(``)ML````(P``FW`````D``";=```
+M`"4``)MX````*```FWP````I``";@````"H``)N$````*P``FX@````L``";
+MD````#```)N4````,0``FY@````R``";H````#0``)ND````-0``FZ@````U
+M``";K````#4``)NP````-0``F[0````U``";N````#4``)N\````-0``F\``
+M```U``";Q````#4``)O(````-0``F\P````U``";T````#4``)O4````-0``
+MF]@````U``";W````#4``)O@````-0``F^0````U``";Z````#4``)OL````
+M-0``F_`````U``";]````#4``)OX````$```F_P````:``":````````````
+M``":!````$````!```":"````(````"```":#````:$```%A``":$````>$`
+M``&A``":%````"$```'A``":&````&$````A``":'````8@```!A``":(```
+M`<@```&(``":)`````@```'(``":*````$@````(``":+````(@```!(``":
+M,````:D```"(``":-````>D```%I``":.````"D```&I``":/````&D```'I
+M``":0````=`````I``":1````!````!I``":2````%````&0``":3````)``
+M``'0``":4````;$````0``":5````?$```!0``":6````#$```"0``":7```
+M`'$```%Q``":8````;@```&Q``":9````?@```'Q``"::````#@````Q``":
+M;````'@```!Q``":<````9D```&8``":=````=D```'8``":>````!D````8
+M``":?````%D```!8``":@````)D```"8``":A````-D```%Y``":B````/D`
+M``&Y``":C````/D```'Y``":D````/D````Y``":E````/D```!Y``":F```
+M`/D```"Y``":G````/D```#Y``":H````/D```#Y``":I````/D```#Y``":
+MJ````/D```#Y``":K````/D```#Y``":L````/D```#Y``":M````/D```#Y
+M``":N````/D```#Y``":O````/D```#Y``":P````/D```#Y``":Q````/D`
+M``#Y``":R````/D```#Y``":S````/D```#Y``":T````/D```#Y``":U```
+M`/D```#Y``":V````/D```#Y``":W````/D```#Y``":X````/D```#Y``":
+MY````/D```#Y``":Z````/D```#Y``":[````/D```#Y``":\````/D```#Y
+M``":]````/D```#Y``":^````/D```#Y``":_````/D```#Y``"8U````"``
+M`)C0````"`````@````(````"`````@``)C<`*``P`"@`,``X`#``.``P`#@
+M`,```)B<,P```#,````S````,P```#,``````)B<`0````$````!`````0``
+M``$``````)B<`````````````````````````````)B<````````````````
+M`````````````)B<`````````````````````````````)B<'P```!\````?
+M````'P```!\``````)B<`````````````````````````````)B<`+@```"X
+M````N````+@```"X`````)B<`+<```"W````MP```+<```"W`````)B<`(0`
+M``"$````A````(0```"$`````)B<`)@```"8````F````)@```"8`````)B<
+M`,````#`````P````,````#``````)B<`/\```#_````_P```/\```#_````
+M`)B<`/\```#_````_P```/\```#_`````)B<`/\```#_````_P```/\```#_
+M`````)B<`/\```#_````_P```/\```#_`````)B<`-<```#7````UP```-<`
+M``#7`````)B<`&$```!A````80```&$```!A`````)B<`/X```#^````_@``
+M`/X```#^`````)B<`-X```#>````W@```-X```#>`````)B<`'\```!_````
+M?P```'\```!_`````)B<!#T```0]```$/0``!#T```0]`````)B<`'<```!W
+M````=P```'<```!W`````)B<`$0```!$````1````$0```!$`````)B<`)@`
+M``"8````F````)@```"8`````)B<`!``@``0`(``$`"``!``@``0`(```)B<
+M``7`-``%P#0`!<`T``7`-``%P#0``)B<`#$`\``Q`/``,0#P`#$`\``Q`/``
+M`)B<``P!'P`,`1\`#`$?``P!'P`,`1\``)B<`%$`0`!1`$``40!``%$`0`!1
+M`$```)B<`%``V@!0`-H`4`#:`%``V@!0`-H``)B<````````````````````
+M`````````)B<``!`1```0$0``$!$``!`1```0$0``)B<````````````````
+M`````````````)B<``!@P```8,```&#```!@P```8,```)B<```L````+```
+M`#8````V````+````)C(```$`P``!`,```0#```$`P``!`,``)B<``!D````
+M9````&0```!D````9````)B<```(````"`````@````(````"````)C,````
+M#@````X````.````#@````X```CL```(]```"-0```C@```(_```"0````CT
+M```)`$%2-3(Q,```05(U,C$Q``!!4C4R,3(``%)&-3$Q,0``4D8U,3$R``!2
+M1C(T,3,``%)&-30Q,P``4D5'3U!37T953D,`071H97)O<R`R,S$S(%=I4V]#
+M``!!=&AE<F]S(#4T,C0O,C0R-````$%T:&5R;W,@,C,Q-R!7:5-O0P``071H
+M97)O<R`U,C$R("A&4$=!*0!!=&AE<F]S(#4R,3$@*$901T$I`$%T:&5R;W,@
+M-3(Q,`````!!=&AE<F]S(#4R,3$`````071H97)O<R`U,S$R(%=I4V]#``!!
+M=&AE<F]S(#(S,34@5VE3;T,``$%T:&5R;W,@-3(Q,@``````````,"XY+C(P
+M+C,```````````````@````0````&````"`````H````,````#@````````!
+M_P'_`````````````'__________`````````````P&8`9D`````````````
+M?_________\````````````'`9@+,`````````````!__________P``````
+M``````@!F`PP`````````````'__________````````````(`$@"A``````
+M````````?_________\````````````A`2`!F0````````````!_________
+M_P```````````"(!(`PP`````````````'__________````````````.@%@
+M"A``````````````?_________\````````````[`6`!F0````````````!_
+M_________P```````````!(!90H0```````#`````'__________````````
+M````-P$P`9D```````,`````?_________\````````````U`C`!F0``````
+M`P````!__________P```````````#8#,`&9```````#`````'__________
+M````````````,`0P`9D```````,`````?_________\````````````Y!3`!
+MF0```````P````!__________P```````````#0&,`&9```````#`````'__
+M________````````````,@,P`9D```````,`````?_________\`````````
+M```Q`S`!F0````````````!__________P```````````!$!$`&9````````
+M`````'__________````````````$`$0"A``````````````?_________\`
+M``````````!2`5`!F0````````````!__________P```````````$4"4`&9
+M`````````````'__________````````````1P-0`9D`````````````?___
+M______\```````````!"!%`!F0````````````!__________P``````````
+M`%@%4`&9`````````````'__________````````````6P90`9D`````````
+M````?_________\```````````!="%`!F0````````````!__________P``
+M`````````%X)4`&9`````````````'__________````````````4`-0"A``
+M````````````?_________\```````````!5`5`,,`````````````!_____
+M_____P```````````%8"4`PP`````````````'__________````````````
+M20)0#5``````````````?_________\```````````!``4`*0```````1@``
+M``0`````````*`&(`````````$$!0`I```````!'````!`````````!H`8D`
+M````````2`%`"A```````$8````$``````````@!B@````````!*`4`*0```
+M````1@````0````````8"`&,`````````$L!0`I```````!&````!```````
+M`&`(`8T`````````3`%`"E```````$8````$``````````@!CP````````!#
+M`D`*0```````1P````0`````````<`&+`````````/`#0`I```````!&````
+M!``````````@````````````@`-`"D```````$<````$`````````&`/IP``
+M``````#Q`T`*0```````1@````0````````8`````````````($#0`I`````
+M``!&````!````````&``#Z@`````````@@-`"E```````$8````$````````
+M```/J0````````#R`T`*$```````1@````0``````````````````````(,$
+M0`I```````!'````!````````(!@#ZH`````````]`1`"D```````$8````$
+M````````F`````````````"$!$`*0```````1@````0```````#@``^K````
+M`````(4$0`I0``````!&````!````````(``#ZP`````````]01`"A``````
+M`$8````$````````@`````````````"&!4`*0```````1P````0```````"`
+M8`^M`````````(<%0`I```````!&````!````````.``#ZX`````````B`5`
+M"E```````$8````$````````@``/KP````````")!D`*0```````1P````0`
+M````````:`^P`````````(H&0`I```````!&````!````````&`(#[$`````
+M````BP9`"E```````$8````$``````````@/L@````````",!T`*0```````
+M1P````0```````"`:`^S`````````(T'0`I```````!&````!````````.`(
+M#[0`````````C@=`"E```````$8````$````````@`@/M0````````"/"$`*
+M0```````1P````0```````"`:`^V`````````)`(0`I```````!&````!```
+M`````.`(#[<`````````D0A`"E```````$8````$````````@`@/N```````
+M``#V"4`*0```````1P````0```````"`8````````````/<+0`I```````!'
+M````!````````(!@````````````8`!@`&``````````````?_________\`
+M``````````!A`&$`80```````P````!__________P```````````&(`8@!B
+M```````"`````'__________````````````8P!C`&,`````````````?___
+M______\```````````!D`&0`9````````P````!__________P``````````
+M`&4`90!E```````#`````'__________````````````9@!F`&8`````````
+M````?_________\```````````!G`&<`9P````````````!__________P``
+M`````````&@`:`!H`````````````'__________````````````:0!I`&D`
+M``````,`````?_________\```````````!J`&H`:@```````P````!_____
+M_____P```````````&4```````'_____````@/____\`````2E````^T````
+M`````&H```````'_____````@/____\`````2E````^T`````````?\`````
+M``$````!`````1M8```````0`````0````$````!&U@````(``,````!````
+M``````$;6`````P``P````$``````````1M8````(`!'````````````````
+M&U@````S`#`````!``````````$;6````"0`(0````$````!`````1M8````
+M*``W`````0`````````!&U@````?`#`````!`````0````$;6````#``6P``
+M``$``````````1M8````<``#`````0`````````!&U@````X`#<````!````
+M``````$;6````%0`50````$````!`````1M8````1`!5`````0````$````!
+M&U@```!,`#L````!```````````;6````&``4@````$````!`````1M8````
+M9``T`````0`````````!&U@```!\`"`````!`````0````$;6````)@`6P``
+M``$````!`````1M8````G`!2`````0````$````!&U@```"J`!`````!````
+M``````$;6````+P``P````$``````````1M8````OP`V`````0`````````!
+M&U@```#$`#<````!`````0````$;6````,L`-P````$``````````1M8````
+MT``W`````0`````````!&U@```#6`!`````!`````0````$;6````-H``P``
+M`````````````!M8```#,@`V`````0`````````!&U@```#>``,````!````
+M``````$;6````.D`-P````$``````````1M8````]@`W`````0`````````!
+M&U@```#Z`#<````!``````````$;6````/\`-@````$``````````1M8```!
+M#``P`````0````$````!&U@```$4`#<````!``````````$;6````2P`-P``
+M``$``````````1M8```!0``0`````0````$````!&U@```%4``,````!````
+M``````$;6````5@`(0````$````!`````1M8```!7``W`````0`````````!
+M&U@```%@`#<````!``````````$;6````60`6P````$``````````1M8```!
+M:`!2`````0`````````!&U@```%L`%(````!`````0````$;6````70`-P``
+M``$``````````1M8```!>``#`````0`````````!&U@```%\`#<````!````
+M``````$;6````8@`0`````$``````````!M8```!B0!!`````0``````````
+M&U@```&*`$@````!```````````;6````8L`0P````$``````````!M8```!
+MC`!*`````0``````````&U@```&-`$L````!```````````;6````8\`3```
+M``$``````````!M8```/IP"``````0``````````&U@```^H`($````!````
+M```````;6```#ZD`@@````$``````````!M8```/J@"#`````0``````````
+M&U@```^K`(0````!```````````;6```#ZP`A0````$``````````!M8```/
+MK0"&`````0``````````&U@```^N`(<````!```````````;6```#Z\`B```
+M``$``````````!M8```/L`")`````0``````````&U@```^Q`(H````!````
+M```````;6```#[(`BP````$``````````!M8```/LP",`````0``````````
+M&U@```^T`(T````!```````````;6```#[4`C@````$``````````!M8```/
+MM@"/`````0``````````&U@```^W`)`````!```````````;6```#[@`D0``
+M``$``````````!M8```!D`!"`````0`````````!&U@```&.``,````!````
+M``````$;6````9@`10````$````!`````1M8```!F@!%`````0``````````
+M&U@```&;`$4````!```````````;6````9P`7@````$``````````!M8```!
+MG@`#`````0`````````!&U@```&L`#<````!``````````$;6````:8``P``
+M``$``````````1M8```!M@`W`````0`````````!&U@```&X`#<````!````
+M``````$;6````;H`-P````$``````````1M8```!O@`A`````0````$````!
+M&U@```,G``,````!``````````$;6````<H`70````$``````````!M8```!
+MU@`W`````0`````````!&U@```'D`!`````!`````0````$;6````>P`,```
+M``$````!`````1M8```!^``#`````0`````````!&U@```(0`#<````!````
+M``````$;6````BH`(@````$``````````1M8```"0@`W`````0`````````!
+M&U@```(``%L````!``````````$;6````DH``P````$``````````1M8```"
+M3P`0`````0````$````!&U@```)<`%(````!``````````$;6````F``.P``
+M``$````!`````1M8```":``W`````0`````````!&U@```)L`#<````!````
+M``````$;6````G8`$`````$````!`````1M8```">@`#`````0`````````!
+M&U@```*"``,````!``````````$;6````H,``P````$``````````1M8```"
+MJ@`A`````0`````````!&U@```*^`%L````!`````0````$;6````K\`-P``
+M``$``````````1M8```"P0`W`````0`````````!&U@```+&`#L````!````
+M``````$;6````M0`-P````$``````````1M8```"\``W`````0`````````!
+M&U@```+T`#<````!``````````$;6````O@``P````$``````````1M8````
+MG@!0`````0````$````!&U@```+\``,````!``````````$;6````PP`,```
+M``$``````````1M8```#%``V`````0`````````!&U@```,8`#8````!````
+M``````$;6````R0``P````$``````````1M8```#$``#`````0`````````!
+M&U@```,Z`#<````!``````````$;6````T@`$`````$````!`````1;!```#
+M2@`2`````0````$````!&U@```-:`!$````!``````````$;6````UP`.@``
+M``$````!`````1M8```#7@!6`````0`````````!&U@```+```,````!````
+M``````$;6````W<``P````$``````````1M8```"S``#`````0`````````!
+M&U@````````3,Q,]%P`*!0```````````````````!`0`````````!-'$U$7
+M``H%````````````````````$!``````````$S@3=!<`%!0`````````````
+M```````0!P`````````33A-[&P8%!0````````````````````$`````````
+M`!-1$WD>!@H%`````````````````````0``````````$U83="$&%`4`````
+M```````````````!```````````3JQ.P%P`*!0```````````````````!`,
+M`````````!.P$]@7`!04````````````````````$`(`````````$[\3OQ<`
+M"@4````````````````````0#``````````4`!1X!084%```````````````
+M`````````````````!0R%&X7`!04````````````````````&`$`````````
+M%#(4;A0`%!0````````````````````8`0`````````4/!1X#P`4%```````
+M``````````````4``````````!0\%'@1!A04`````````````````````0$`
+M````````%#P4>!(`%!0````````````````````%```````````4/!1X%``4
+M%`````````````````````4``````````!0\%'@7`!04````````````````
+M````!0``````````%#P4>!<&%!0````````````````````!```````````4
+M/!3(%`84%``````````"``````````0``````````!1X%*`7`!04````````
+M``$`````````!0``````````%(P4H!<`%!0``````````P`````````%````
+M```````4C!3($@`4%``````````#``````````4``````````!2,%,@4`!04
+M``````````<```````"`!0``````````%(P4R!0&%!0``````````P``````
+M```!`@`````````4C!3(%P84%``````````#``````````$"`````````!2,
+M%,@7!A04``````````,``````````0``````````%(P4R!X`%!0`````````
+M```````````````````````4C!9$!084%``````````#````````````````
+M`````!2@%,@1!A04``````````,``````````0``````````%7P5]!X&%!0`
+M`````````@`````````$```````````5?!9$%`84%``````````#````````
+M``$$`````````!5\%D0;`!04``````````,`````````!0``````````%7P6
+M1!X`%!0``````````P`````````%```````````5?!9$%P`4%``````````'
+M````````@`$``````````!9Q%JT7`!04````````````````````````````
+M````%G$6K1X&%!0````````````````````````````````6<1:M'@84%```
+M```````"``````````0``````````!9Q%L$%!A04````````````````````
+M````````````%G$6P1$`%!0````````````````````````````````6<1;!
+M%``4%````````````````````````````````!9Q%L$>`!04````````````
+M````````````````````%G$6P1X&%!0``````````````````````P``````
+M```6<1;!'@84%````````````````````````````````!,X$W0>`!04````
+M```````````````$````````````$[`3V!X`%!0```````````````````0`
+M```````````4,A1N'@`4%``````````#````````!````````````!0\%'@>
+M`!04``````````,````````$````````````%(P4R!X`%!0``````````P``
+M``````0````````````6<1;!'@`4%```````````````````!```````````
+M`!5\%D0>`!04``````````,````````$````````````%(P4R!X`%!0`````
+M```````````````````````````4/!1X'@`4%```````````````````````
+M`````````!;!%L$>`!04```````````````````$````````````%`H46@4&
+M*"@````````````````````````````````4@A32!08H*``````````!````
+M`````````````````!3Z%7(%!B@H````````````````````````````````
+M%9H6$@4&*"@``````````0`````````````````````4'A1&!08H*```````
+M`````````````````````````!1N%+X%!B@H``````````$`````````````
+M````````%.857@4&*"@````````````````````````````````5AA8F!08H
+M*``````````!`````````````````````!10%'@1!B@H````````````````
+M````````````````%%`4>!<&*"@````````````````````````````````4
+M6A1:$08H*````````````````````````````````!1:%%H7`"@H````````
+M````````````````````````%*`4H!<&*"@``````````0`````````"````
+M```````4H!2@%`8H*``````````!``````````(``````````!2"%((1`"@H
+M``````````$``````````@``````````%*H4JA0`*"@``````````0``````
+M```"```````````4@A2J%``H*``````````!``````````(``````````!2"
+M%*H7!B@H``````````$``````````@``````````%:06'!0&*"@`````````
+M`0`````````"```````````6@!:H%``H*```````````````````````````
+M`````!:`%J@>!B@H````````````````````````````````%H46K1X&*"@`
+M```````````````````````````````46A2"#P`H*``````````#````````
+M!````````````!2J%*H2`"@H``````````,````````$````````````%:06
+M'!0`*"@``````````P````````0````````````6@!:H%``H*```````````
+M````````!`````````````D("40%!A0%````````````````````````````
+M````"0@)1!0`%`4````````````````````````````````);`FH!084!0``
+M``````````````````````````````EL":@4`!0%````````````````````
+M(```````````"6P)J!X`%`4````````````````````````````````);`F>
+M&P84!0````````````````````````````````EL"9X4`!0%````````````
+M````````(```````````"8`)BA0`%`4`````````````````````````````
+M```)F0FH%``4!0````````````````````````````````FC":@4`!0%````
+M```````````````@(```````````";0)M`4&%`4`````````````````````
+M```````````)M`FT%``4!0``````````````````*"````````````G0"JP%
+M!A0%````````````````````````````````"0@)1!0`%`4`````````````
+M```````````````````);`EL%``4!0``````````````````````````````
+M``EQ"8`4`!0%````````````````````````````````"84)BA0`%`4`````
+M```````````````````````````)CPF9%``4!0``````````````````````
+M``````````F>"9X4`!0%````````````````````````````````":,)HQ0`
+M%`4``````````(````````0````````````)HPFC%``4!0``````````@```
+M``````````````````FH":@4`!0%``````````"````````$````````````
+M":@)J!0`%`4``````````(`````````````````````)M`FT%``4!0``````
+M````@```````!`````````````FT";04`!0%``````````"`````````````
+M````````"0@)1`4&%`4````````````````````````````````)"`E$%``4
+M!0````````````````````````````````EL":@%!A0%````````````````
+M````````````````"6P)J!0`%`4```````````````````!````````````)
+M;`FH'@`4!0````````````````````````````````EL"9X;!A0%````````
+M````````````````````````"6P)GA0`%`4```````````````````!`````
+M```````)@`F*%``4!0````````````````````````````````F9":@4`!0%
+M````````````````````````````````"=`*K`4&%`4`````````````````
+M```````````````)HPFH%``4!0``````````````````("````````````D(
+M"404`!0%````````````````````````````````"6P);!0`%`4`````````
+M```````````````````````)<0F`%``4!0``````````````````````````
+M``````F%"8H4`!0%````````````````````````````````"8\)F10`%`4`
+M```````````````````````````````)G@F>%``4!0``````````````````
+M``````````````FC":,4`!0%``````````"````````$````````````":,)
+MHQ0`%`4``````````(`````````````````````)J`FH%``4!0``````````
+M@```````!`````````````FH":@4`!0%``````````"`````````````````
+M````"0@)1`4&*"@````````````````````````````````)A0F%!08H*```
+M``````````````````````````````F%"844!B@H````````````````````
+M````````````"84)A1(&*"@```````````````````0````````````)T`JL
+M!08H*`````````````````````````````````'_$`````````````````$`
+M````````````````````````(`@``@````````````````````#_````````
+M`````````"01````````````````````%`4```````````````````(%````
+M````````````````$P```````````5`0````````````````````````````
+M``````````````$`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````"4!``````````````````````````````````````
+M``````0`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````-0$```````````````````````````````````````````"!``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M!%`0``````````````````````````````````````````"```"`````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````%4!``````
+M`````````````````````````````````````$``````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````90,```````````````
+M``(``````````P``````````````@`!`@```````````````````"0@`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"%`P````````````````````````
+M`````````P````````$`!```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````)4#`````````````````"``````````0````#
+M`````````!`@!```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````$P,`````````````````(`````````!`````,```````@`
+M`(!`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````C`P`````````````````@`````````$`````P````````````!`````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````#,#``
+M```````````````"``````````0````#```````(````0```````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````0P,```````````
+M``````(`````````!`````,````````````@0```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````!3`P`````````````````@``
+M```````$`````P`````````````0````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````&,#`````````````````"``````````0`
+M```#``````````$`$0``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````$0$```````````````````````````````````````
+M```"``$`(```````````````````$@0``````````````````"`1````````
+M````````````````````````````````````````````````````````````
+M`````````2`0``````````````````````````````````````````0``@(`
+M````````````````````````````````````````(!(`````````````````
+M```````````````````````````````````````````````````````````!
+M8!`````````````````!``````````,``````````````@!`@"``````````
+M`````````!#$```````````````````$(0``````````````````````````
+M``````````````````````````````````````````````````%E$```````
+M``````````$``````````P```````````````````#@`````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````4!`````````````````
+M```````````(`````@`````````````$````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````"0$``````````````````````````
+M`!`````"``````````````7'````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````-`0`````````````````````````"```````(`
+M````````````@```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````!$!`````````````````!````````(```````@``````````
+M`$"`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```%0$`````````````````$````````@``````"``````````(`0(``````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````9`0```
+M````````````````````````"`````(`````````````B```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````!T!`````````````
+M````!````````(`(`````@```````````$"$````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(0$`````````````````$````
+M````@`@````"``````````(`0(0`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````E`0`````````````````````````"`````
+M``(`````````````@<<`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````"T!`````````````````!````````(```````@``````
+M`````$"!QP``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````-4/\`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```*````````````````````"@````````````````````````````````HP
+M_P``````````````````````````@`````,`````````````````````````
+M`````````````````````````````````````````````````````0``````
+M``````````````$`````````````````````!```````````"S`P````````
+M``````````````````$``````P``````````````````````````````````
+M````````````````````````````````````````````@```````````````
+M`````(`````````````````````$```````````,,#``````````````````
+M`````````@`````#````````````````````````````````````````````
+M```````````````````````````````````0````````````````````$```
+M``````````````````0```````````H0$```````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````"`````````````````````@````````````
+M````````!```````````"D!``````````````````````````'A@`````@``
+M````````````````````````````````````````````````````````````
+M```````````````*0```````````````````!$`````````````````````$
+M```````````*4$``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````(````````````````````"`````````````````````0`````````
+M``&9,```````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````@`
+M```````````````````(````````````````````!````````````&#_````
+M`````````````P````````0`````"````````^``````````````````````
+M``+``````````````````````````````````````````*_`````````````
+M```````+\``````````````````````(````````````9O\`````````````
+M```#````````!``````(```````#X````````````````````````L``````
+M````````````````````````````````````!\````````````````````'P
+M``````````````````````@```````````!G_P````````````````,`````
+M```$``````@```````/@```````````````````````"P```````````````
+M```````````````````````````OP```````````````````"_``````````
+M````````````"````````````&C_`````````````````P````````0`````
+M"````````^````````````````````````+`````````````````````````
+M`````````````````%?````````````````````5\```````````````````
+M```(````````````8?\````````````````#````````!``````0```````#
+MX```````````````````````````````````````````````````````````
+M````````K\````````````````````OP``````````````````````@`````
+M``````!B_P````````````````,````````$`````!````````/@````````
+M```````````````"P`````````````````````````````````````````"O
+MP```````````````````"_``````````````````````"````````````&/_
+M`````````````````P````````0`````"````````>``````````````````
+M``````+``````````````````````````````````````````"_`````````
+M```````````+\``````````````````````(````````````9/\`````````
+M```````#````````!``````0```````<``@``````````````````````L``
+M````````````````````````````````````````!\``````````````````
+M``'P``````````````````````@```````````!E_P````````````````,`
+M```````$`````!````````B$````````````````````````````````````
+M``````````````````````````````!7P```````````````````%?``````
+M````````````````"````````````&G_`````````````````P````````0`
+M````$````````\````````````````````````+`````````````````````
+M``````````````````````?````````````````````!\```````````````
+M```````(````````````:O\````````````````#````````!``````0````
+M```#P```````````````````````````````````````````````````````
+M````````````+\````````````````````OP``````````````````````@`
+M``````````&8_P``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`$``\`#S@8@`\`#S`$$`@`"#@8D`@`"#`$@`\@#U@8H`\@#U`$,`]@#W@8L`
+M]@#W`$H`\0#T@8P`\0#T`$L`@0"$@8T`@0"$`$P`@@"%@8\`@@"%`8@`\`#S
+M`8D`@`"#`8H`\@#U`8L`]@#W`8P`\0#T`8T`@0"$`8\`@@"%```````(````
+M```````````````````````````````````````!`A=P"P",```````!`B,H
+M#P`2```````!`B[@"@"8`@`````!`D90#@`D`@`````!`EW`"0"P!``````!
+M`HR@#0!(!``````!`KN`"`!@!``````!`M+P#`!L!```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````(```````````````````````````````````````````!
+M`Q=P"P",```````!`R,H#P`2```````!`R[@"@"8`@`````!`T90#@`D`@``
+M```!`UW`"0"P!``````!`XR@#0!(!``````!`[N`"`!@!``````!`]+P#`!L
+M!```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(````````````````````````
+M```````````````````!`A=P"P",```````!`B,H#P`2```````!`B[@"@"8
+M`@`````!`D90#@`D`@`````!`EW`"0"P!``````!`HR@#0!(!``````!`KN`
+M"`!@!``````!`M+P#`!L!```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````(````
+M```````````````````````````````````````!`Q=P"P",```````!`R,H
+M#P`2```````!`R[@"@"8`@`````!`T90#@`D`@`````!`UW`"0"P!``````!
+M`XR@#0!(!``````!`[N`"`!@!``````!`]+P#`!L!```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````$```````````````````````````````````````````!
+M``/H"P""```````!``?0"@2$`0`````!`!5\"02+`0`````!`"KX"`26`0``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````*($`````````````*((4#Y&1E`^
+M1D8``*(,9(!!;&2`06P``*(0`9F@`P&9H`,``*(4!$S6$`1,UA```*(8$X``
+M0!.``$```*(<&^``8!O@`&```*(@#%.`"@Q3@`H``*(D`!3?.P`4WSL``*(H
+M```!M0```;4``*(L````(````"```)B<`````````````)B<````````````
+M`)B<`````````````)B<`````````````)B<`````````````)B<````````
+M`````)B<`````````````)B<`````````````)B<`````````````)B<````
+M`````````)B<`````````````)B<`#@````X`````)B<`````````````)B<
+M`````````````)B<`````````````)B<``0`^0`$`/D``)C4``````````0`
+M`)B<`````````````)B<`````````````)B<`````````````)B<````````
+M`````)B<`````````````)B<$````!```````)B<!`````0``````)B<````
+M`````````)B<`````````````)B<`````````````)B<``````H``````)B<
+M`#@`@`(X`(```)B<``(`!@````8``)B<````D@```)(``)B<````H````*``
+M`)B<``0`!P`$``<``)C4````&@```!H``)B<````2````$@``)B<````$```
+M`!```)B<````"`````@``)B<````#P````\``)B<````\@```&(``)B<``"0
+M3P``D$P``)B<```26@``$IH``)C,````#@````\````(````````````````
+M```````````````````````````!`A=P"P",```````!`B,H#P`2```````!
+M`B[@"@"8`@`````!`D90#@`D`@`````!`EW`"0"P!``````!`HR@#0!(!```
+M```!`KN`"`!@!``````!`M+P#`!L!```````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```(```````````````````````````````````````````!`@NX"P"&````
+M```!`A&4#P`)```````!`A=P"@",`@`````!`B,H#@`2`@`````!`B[@"0"8
+M!``````!`D90#0`D!``````!`EW`"``P!``````!`FEX#``V!```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````(````````````````````````````````````
+M```````!`@7<"P"#```````!`@C*#P`$```````!`@NX"@"&`@`````!`A&4
+M#@`)`@`````!`A=P"0",!``````!`B,H#0`2!``````!`B[@"``8!``````!
+M`C2\#``;!```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````'````````````````
+M```````````````````````````!`Q=P"P",```````!`R[@"@"8`@`````!
+M`T90#@`D`@`````!`UW`"0"P`P`````!`XR@#0!(`P`````!`[N`"`!@`P``
+M```!`]+P#`!L`P``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```(```````````````````````````````````````````!`Q=P"P",````
+M```!`R,H#P`2```````!`R[@"@"8`@`````!`T90#@`D`@`````!`UW`"0"P
+M!``````!`XR@#0!(!``````!`[N`"`!@!``````!`]+P#`!L!```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````$````````````````````````````````````
+M```````!``/H&P""```````!``?0&@2$`0`````!`!5\&02+`0`````!`"KX
+M&`26`0``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````,````````````````
+M```````````````````````````!``/H&P""```````!``?0&@2$`0`````!
+M`!5\&02+`@`````!`"KX&`26`P```````A=P"P`,!````````B,H#P`2!```
+M```!`B[@"@`8!@`````!`D90#@`D!@`````!`EW`"0`P"``````!`HR@#0!(
+M"``````!`KN`"`!@"``````!`M+P#`!L"```````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```-```````````````````````````````````````````!!`#Z`P"!``)D
+M`F0!!`'T!P"!``')`<D!!`/H`@""`0#D`.0!!`?0!@"$`@"@`*`!!`NX`0"&
+M`P",`(P!`A=P"P",!``\`#P!`B,H#P`2!``\`#P!`B[@"@"8!@`P`#`!`D90
+M#@`D!@`P`#`!`EW`"0`P"``L`"P!`HR@#0!("``L`"P!`KN`"`!@"``L`"P!
+M`M+P#`!L"``L`"P`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5L82YT97AT`"YR
+M96QA+G)O9&%T80`N<F]D871A+G-T<C$N-``N<F5L82YD871A`"YB<W,`+F-O
+M;6UE;G0`````````````````````````````````````````````````````
+M```````@`````0````8`````````-``"#9````````````````0`````````
+M&P````0````````````#,/0``&FH````"P````$````$````#````"L````!
+M`````@```````@W(``".-```````````````"``````````F````!```````
+M``````.:G```%80````+`````P````0````,````,P````$````R```````"
+MF_P```$````````````````$`````0```$<````!`````P```````IT```!5
+M*```````````````"`````````!"````!`````````````.P(````&`````+
+M````!@````0````,````30````@````#```````"\B@```&8````````````
+M```"`````````%(````!`````````````O(H```#J````````````````0``
+M```````1`````P````````````+UT````%L```````````````$`````````
+M`0````(````````````"^#0``"&`````#````(4````$````$`````D````#
+M`````````````QFT```7/0```````````````0``````````````````````
+M`````````````````````P```0````````````````,```,`````````````
+M```#```%`````0`````````&`0```P````P```"4````#`$```,````7````
+MH````!8!```#````(@```+8````6`0```P```"T```#4````&`$```,````X
+M````[````!@!```#````0P```#````E@`0``!@```$X```F0````2`$```8`
+M``!9```)V```"CP!```&````9```%!@```:@`0``!@```&\``!JX```#0`$`
+M``8```!Z```=^````R`!```&````A0``(1@```*@`0``!@```)```".X````
+MH`$```8```";```D6```&(`!```&````I@```0P````8`0```P```+$``$0`
+M````.`(```$```"\```\V````%0!```&````QP``/2P````J`0``!@```-(`
+M``$H```2<`$```,```#=``!?R````"0"```!````Z```7^P````(`@```0``
+M`/,``!.8````!@$```,```#^```3H```!3@!```#```!"0``&-@````1`0``
+M`P```10``!CJ````"@$```,```$?```8]````$0!```#```!*@``&3@``!)P
+M`0```P```34``*@$````3`(```$```%```"H4`````@"```!```!2P``*Z@`
+M```&`0```P```/,``"O(````!@$```,```%6```KT````"`!```#```!80``
+M*_````*\`0```P```6P``"ZL```%6`$```,```%W``!%C````5`!```&```!
+M@@``-`0```,``0```P```8T``$;<```!+`$```8```&8```W!````B@!```#
+M```!HP``.2P````#`0```P```:X``#DP````*`$```,```&Y`````````0@!
+M```(```!Q````0@```"``0``"````<\```&(````$`$```@```':```Y6```
+M``H!```#```!Y0``.80```$@`0```P```?```#JH```2<`$```,```'[``$%
+M<````!@"```!```"!@``31@````&`0```P```A$``$T>````!@$```,```(<
+M``!-=`````8!```#```")P``37H````,`0```P```C(``12`````*`(```$`
+M``(]``!-N````"`!```#```"2```3=@````L`0```P```E,``$Z8````'`$`
+M``,```)>``!/+````E@!```#```":0``480```8@`0```P```10``%>R````
+M"@$```,```)T``!7O`````H!```#```!Y0``5\@```%P`0```P```G\``%DX
+M```!<`$```,```**``!;*````5`!```#```"E0``7'@```)``0```P```J``
+M`%ZX```!F`$```,```*K``!@4````P`!```#```"M@``8U`````(`0```P``
+M`L$``&-8````&`$```,```+,``!C<````!@!```#```"UP``8X@```&8`0``
+M`P```N(``&4@````P`$```,```+M``&TN````3@"```!```"^```9>````(H
+M`0```P```P,``;7P```!8`(```$```,.``&W4````%@"```!```#&0`!MZ@`
+M``6(`@```0```R0``;V@```$"`(```$```,O``'#Z````%@"```!```#.@`!
+MQ$`````(`@```0```:X``&@H````+`$```,```-%``'$2````$@"```!```#
+M4```:%0```&``0```P```UL``&G4```"*`$```,```-F``!K_````P`!```#
+M```#<0``;OP````(`0```P```WP``&\$````&`$```,```.'``!O'````!@!
+M```#```#D@``;S0```/``0```P```YT``'+T```!.`$```,```.H``'%:```
+M`3@"```!```#LP`!QJ````,D`@```0```[X``<G$````4`(```$```/)``'*
+M%```!S@"```!```#U``!T4P```78`@```0```]\``=MT````6`(```$```/J
+M``'>M````+0"```!```#]0``=$P```&``0```P``!````'7,```$6`$```,`
+M``0+``!Z)````P`!```#```$%@``?20````(`0```P``!"$``'TL````&`$`
+M``,```0L``!]1````!@!```#```$-P``?5P```*(`0```P``!$(``'_D````
+M2`$```,```1-``'@2````3@"```!```$6``!X8````,D`@```0``!&,``>2D
+M```#.`(```$```1N``'GW````%`"```!```$>0`![X````'8`@```0``!(0`
+M`?%8````<`(```$```2/``'TQ````+0"```!```$F@``@$P```+0`0```P``
+M!*L``(,<```$``$```,```2V``"''````P`!```#```$P0``BAP````(`0``
+M`P``!,P``(HD````&`$```,```37``"*/````!@!```#```$X@``BE0```-X
+M`0```P``!.T``(W,````2`$```,```3X``'V9````3@"```!```%`P`!]YP`
+M``,$`@```0``!0X``?J@```$:`(```$```49``'_"````%`"```!```%)``"
+M!JP```'8`@```0``!2\``@B$````<`(```$```4Z``(+\````+0"```!````
+M`````````````P``!@````````````````,```@````````````````#```)
+M```%10``JB@```"D$@```0``!5```):<````"!(```$```5;``$ZP````?P2
+M```!```%9@``<KP```"H$@```0``!7$``59D```"E!(```$```5\````````
+M```0```````%A@`!`IP````X$@```0``!9$``64````!I!(```$```6<``!B
+M&````7@2```!```%IP`!KE0```%,$@```0``!;(``#U8```!I!$```8```6]
+M``%!L````%`2```!```%R```980```!($@```0``!=,``%10```!"!(```$`
+M``7>``!,]````:01```&```%Z0`!,Q0````X$@```0``!?0``2TP````+!(`
+M``$```7_``$>S`````@2```!```&"@`!`:@```#P$@```0``!A4``0X4```!
+M?!(```$```8@```*C````)`2```!```&*P``\R````#0$@```0``!C8``-JL
+M```!`!(```$```9!``"\X````)@2```!```&3```PNP````D$@```0``!E<`
+M`)P4````2!(```$```9B``$WB````$@2```!```&;0`!`3`````($@```0``
+M!G@``1L\````,!(```$```:#``%8^````-P2```!```&C@``!Y0```!<$@``
+M`0``!ID``06(````\!(```$```:D``"O&`````@2```!```&KP`!G&````!\
+M$@```0``!KH``)_8````"!(```$```;%``##$````"@2```!```&T```#WP`
+M``',$@```0``!NL``$@(```!I!$```8```;V``$NR````*@2```!```'`0``
+MG70```"<$@```0``!PP```-<````-!(```$```<7``&>F````)`2```!```'
+M(@``````````$```````!T,``&U0````;!(```$```=.``$QQ````2P2```!
+M```'60`!,4````"$$@```0``!V0``/;4````Q!(```$```=O``!PZ````$02
+M```!```'>@``MOP```!T$@```0``!X4``+UX````J!(```$```>0``#WV```
+M`$@2```!```'FP``LZP````P$@```0``!Z8``2_`````F!(```$```>Q``"?
+M\````&`2```!```'O```;`````!P$@```0``!\<``);D````2!(```$```?2
+M``$FG````)`2```!```'W0``OX0```!$$@```0``!^@``2]P````0!(```$`
+M``?S``$M_````)`2```!```'_@`!`[P```",$@```0``"`D``5GX````5!(`
+M``$```@4``!E?`````@2```!```('P`!,%@```"H$@```0``""H``%G````%
+MZ!(```$```@U``"_"````#@2```!```(0``!*9@```"4$@```0``"$L```+,
+M````D!(```$```A6``$NC````#P2```!```(80`!AO0```%4$@```0``"&P`
+M`1F0````7!(```$```AW``%C8````-@2```!```(@@``<!@```!($@```0``
+M"(T``*]H````S!(```$```B8``"T\````)@2```!```(HP``E6P````\$@``
+M`0``"*X``8YD````S!(```$```BY``"(4````S`2```!```(Q```=4@````$
+M$@```0``",\``8\P````1!(```$```C:``"8M````V`2```!```(Y0```9@`
+M``$H$@```0``"/0``748```#?!(```$```C_```````````0```````)!@`!
+M/V0```$H$@```0``"1$``+ZH````+!(```$```D<``&+L````<`2```!```)
+M)P`!-C@```%0$@```0``"3(``4"P````*!(```$```D]```"P`````P2```!
+M```)2```N0P````H$@```0``"5,``/@@```!)!(```$```E>``#WF````$`2
+M```!```):0``TE````!H$@```0``"70``%^H````(!(```$```E_``!P8```
+M`(@2```!```)B@```Y````'($@```0``":```6(X````/!(```$```FK``"@
+M4````+P2```!```)M@``<GP```!`$@```0``"<$``*R\````,!(```$```G,
+M``%9U````"02```!```)UP``XV0```!$$@```0``">(``2%4```$O!(```$`
+M``GM``$=4`````@2```!```)^```9I@```#,$@```0``"@,``*K,````>!(`
+M``$```H.``&AU````&`2```!```*&0`!'R````%D$@```0``"B0``+YT````
+M!!(```$```HO``!LO````)02```!```*.@``]K`````D$@```0``"D4``0;,
+M```&V!(```$```I0``&*U````-P2```!```*6P`!+2@````($@```0``"F8`
+M`+.`````+!(```$```IQ``%#!````*@2```!```*?```EI0````($@```0``
+M"H<``9I<```!9!(```$```J2``#&1````$02```!```*G0``:M@```!D$@``
+M`0``"J@``3$`````0!(```$```JS``$-I````'`2```!```*O@``_TP````L
+M$@```0``"LD``9\H````:!(```$```K4```````````0```````*X0``F#0`
+M``"`$@```0``"NP``'QH````1!(```$```KW``&<4````!`2```!```+`@`!
+MH``````($@```0``"PT``2J\````R!(```$```L8```%P````802```!```+
+M*0`!DJ````2\$@```0``"S0``'$L````O!(```$```L_``">7````,@2```!
+M```+2@``OF@````$$@```0``"U4``2U<````+!(```$```M@``&OH````*@2
+M```!```+:P``>UP```"H$@```0``"W8``13(````U!(```$```N!``"O(```
+M`$@2```!```+C```U*````'D$@```0``"Y<``)6H````[!(```$```NB``%L
+ML```!R`2```!```+K0`!1,P````T$@```0``"[@``3R\````+!(```$```O#
+M``#&B````302```!```+S@`!,TP```+L$@```0``"]D``+L@````C!(```$`
+M``OD``"^?````"P2```!```+[P`!-]````+P$@```0``"_H``8_````!L!(`
+M``$```P%``&B-```!J`2```!```,$```OT````!$$@```0``#!L``*$0````
+M%!(```$```PF``!DB`````@2```!```,,0``JT0```%X$@```0``##P``2B0
+M````:!(```$```Q'``!U[````"`2```!```,4@`!]7@```#L$@```0``#%T`
+M`'4\````!!(```$```QH``$MM`````@2```!```,<P`!+`P```!@$@```0``
+M#'X``%`\```!I!$```8```R)``$`'````)@2```!```,E``!M&0```!4$@``
+M`0``#)\``'.T````F!(```$```RJ``##.````"@2```!```,M0``?*P```&0
+M$@```0``#,```58P````-!(```$```S+``$F0````"P2```!```,U@`!*/@`
+M``"@$@```0``#.$``:!````!E!(```$```SL``"&L````"@2```!```,]P``
+M>00````H$@```0``#0(``&YX````Y!(```$```T-``!\+````#P2```!```-
+M&``!)]P```"T$@```0``#2,``5TX```#S!(```$```TN``&85````@@2```!
+M```-.0``0*````&D$0``!@``#40``&=D```"'!(```$```U/``!&_````'@2
+M```!```-6@``EJ0```!`$@```0``#64``'P$````*!(```$```UP````````
+M```0```````-D```?CP```>,$@```0``#9L`````````"1$```8```VK``%F
+MI````*@2```!```-M@``M8@```!<$@```0``#<$``@RD````[!(```$```W,
+M``$/D````%@2```!```-UP`!*E0```!H$@```0``#>(``'5,````!!(```$`
+M``WM``%BQ````)P2```!```-^```OFP````($@```0``#@,``,)`````*!(`
+M``$```X.``"P-````,P2```!```.&0`!+;P````X$@```0``#B0`````````
+M`!````````XS``"V0````'`2```!```./@``3I@```&D$0``!@``#DD``3\\
+M````*!(```$```Y4``$60````'@2```!```.7P``VZP```!@$@```0``#FH`
+M`(:,````)!(```$```YU``"[Z````*@2```!```.@``!'5@```%T$@```0``
+M#HL``$FL```!I!$```8```Z6``$R\````"02```!```.H0``N'@```"4$@``
+M`0``#JP``408````M!(```$```ZW``&L&````CP2```!```.P@``L0````)0
+M$@```0``#LT``'H0````2!(```$```[8``"T<````$02```!```.XP``WMP`
+M``%`$@```0``#NX``(YD````&!(```$```[Y``%"7````*@2```!```/!```
+M2U````&D$0``!@``#P\``+7D````7!(```$```\:``"WV````*`2```!```/
+M)0``;UP```"4$@```0``#S```9>$````+!(```$```\[```````````0````
+M```/2@`!`3@````0$@```0``#U4``29L````,!(```$```]@``!IL````"P2
+M```!```/:P`!+[`````0$@```0``#W8``+Y@````"!(```$```^!``$G<```
+M`&P2```!```/C```0D0```&D$0``!@``#Y<``,7P````*!(```$```^B``"L
+M[````2`2```!```/K0```4````!8$@```0``#[L``#[\```!I!$```8```_&
+M``#%2````*@2```!```/T0``K@P````($@```0``#]P````,````)!$```8`
+M``_N``!MO````#@2```!```/^0``;F@````0$@```0``$`0``1[4````3!(`
+M``$``!`/``!WS````(P2```!```0&@`!L>````*$$@```0``$"4``'A8````
+M*!(```$``!`P``"\T````!`2```!```0.P`!050```!<$@```0``$$8``%,<
+M````U!(```$``!!1``&77````"@2```!```07```Q*````"H$@```0``$&<`
+M`+X@````0!(```$``!!R``%!`````%02```!```0?0``_W@````P$@```0``
+M$(@``8]T````3!(```$``!"3``"\D````$`2```!```0G@`!<]````$($@``
+M`0``$*D``*X4```!!!(```$``!"T``$!2````&`2```!```0OP``0^@```&D
+M$0``!@``$,H``'G(````2!(```$``!#5``&@"````#@2```!```0X```8\``
+M``#($@```0``$.L``'B`````8!(```$``!#V``#Z=```!+`2```!```1`0``
+M=9````!<$@```0``$0P``'.D````$!(```$``!$7``$6N````?`2```!```1
+M(@`!C7````#T$@```0``$2T``,88````+!(```$``!$X``!3\````&`2```!
+M```10P`!&J@```"4$@```0``$4X```Y,````B!(```$``!%9```([````:`2
+M```!```19``!&30```!<$@```0``$6\``'1,````J!(```$``!%Z``!XX```
+M`"02```!```1A0`!A-@```",$@```0``$9```&ND````7!(```$``!&;``%T
+MV````$`2```!```1I@``0\@````X$@```0``$;$```58````:!(```$``!&\
+M``$G+````$02```!```1QP``````````$```````$=<``..H```!?!(```$`
+M`!'B``!CD````#`2```!```1[0`!F\````"0$@```0``$?@``&QP````3!(`
+M``$``!(#``$@A````-`2```!```2#@``NF0```"\$@```0``$AD``0"T````
+M?!(```$``!(D```````````0```````21```!_````#\$@```0``$D\``&H4
+M````>!(```$``!):``!JC````$02```!```290``M+0````\$@```0``$G``
+M`&7,````S!(```$``!)[``"W<````&@2```!```2A@`!#^@```28$@```0``
+M$I$``+[4````+!(```$``!*<``%%`````:`2```!```2IP``=30````($@``
+M`0``$K(``&F`````,!(```$``!*]``!N8`````@2```!```2R```````````
+M$```````$M8``+-0````,!(```$``!+A```,"````-02```!```2[```=5``
+M``!`$@```0``$O<``,1$````7!(```$``!,"``"_R````"P2```!```3#0``
+MAUP```#T$@```0``$Q@``'I8````7!(```$``!,C``!M]````&P2```!```3
+M+@`!)A`````P$@```0``$SD``4#8````*!(```$``!-$``%5@````+`2```!
+M```33P``MK````!,$@```0``$UH``1I<````3!(```$``!-E``%G3```!602
+M```!```3<```;_`````H$@```0``$WL``,)H````A!(```$``!.&``"Y-```
+M`$@2```!```3D0``GR0```"T$@```0``$YP``+/D````C!(```$``!.G``"^
+M>`````02```!```3L@``ERP```$($@```0``$[T``%'@```!I!$```8``!/(
+M``!J#`````@2```!```3TP``L]P````($@```0``$]X``&&8````@!(```$`
+M`!/I``!DD````.P2```!```3]``!&>P```!P$@```0``$_\```[4````J!(`
+M``$``!0*``&>>````"`2```!```4%0`!+?0````($@```0``%"```+H$````
+M8!(```$``!0K``&$.````*`2```!```4-@``P;0```",$@```0``%$$``,>\
+M```*<!(```$``!1,``!3A````:01```&```45P`!%*@````@$@```0``%&(`
+M`&L\````:!(```$``!1M```'1````%`2```!```4>```:=P````P$@```0``
+M%(,``9S<```!G!(```$``!2.``&1_````*02```!```4F0``>2P````H$@``
+M`0``%*0``+NL````/!(```$``!2O``%`C````"02```!```4N@``>50```!T
+M$@```0``%,4``&!\````E!(```$``!30``!S9````$`2```!```4VP``IE``
+M```X$@```0``%.8```S<```!<!(```$``!3Q``$"F`````02```!```4_```
+MG%P```!D$@```0``%0<``,.T````2!(```$``!42``!U0`````@2```!```5
+M'0``^=````"D$@```0``%2@``4(`````7!(```$``!4S``'$D````-@2```!
+M```5/@``=/0```!`$@```0``%4D``%58````.!(```$``!54``!,1```!M@2
+M```!```5:@`!0ZP```!L$@```0``%74``'JT````J!(```$``!6```%&H```
+M#N`2```!```5BP`!&VP```'D$@```0``%98``/^H````=!(```$``!6A``##
+M_````$@2```!```5K```G,````"T$@```0``%;<``$,H````H!(```$``!7"
+M``"?X````!`2```!```5S0``AM@```"$$@```0``%=@``,-@````5!(```$`
+M`!7C``#2+````"02```!```5[@``81````"($@```0``%?D``*$,````!!(`
+M``$``!8$``!QZ````)02```!```6#P``\?P```!`$@```0``%AH``3ZP````
+MC!(```$``!8E``$L;````+P2```!```6,```N7P```"($@```0``%CL``*&P
+M```$H!(```$``!9&``"1U````P@2```!```640`!+8@````L$@```0``%EP`
+M`/\D````*!(```$``!9G``'?:````.`2```!```6<@`!*X0```"($@```0``
+M%GT``1BH````C!(```$``!:(``%:3````NP2```!```6DP`!E[`````P$@``
+M`0``%IX``````````!```````!:P``"IE````)02```!```6NP`!%9P```"D
+M$@```0``%L8``````````!```````!;7``!JT`````@2```!```6X@``OP``
+M```($@```0``%NT``)X0````3!(```$``!;X``$J+````"@2```!```7`P`!
+M?C@```%4$@```0``%PX``-*X```!Z!(```$``!<9``!&=````(@2```!```7
+M,@`!E^````!T$@```0!Z>C`P,#$R,C$Q`'IZ,#`P,C<V.&,`>GHP,#!D.3!F
+M,`!Z>C`P,S8T-61D`'IZ,#!C9&8V8C8`>GHP,&-D9C9C,P!Z>C`P,6%C-C@S
+M`'IZ,#9B,60W,#,`>GHP,#`V-3,S,0!Z>C`P,6%A-C$S`'IZ,#,U-&1F-C,`
+M>GHP,#%A830Y,P!Z>C`P9#4Q.3`S`'IZ,&%A,F5B83``>GHP,#`Q86,R8@!Z
+M>C`P,#`P9#,U`'IZ,#`P,#8V,F,`>GHP,#`P-CDU90!Z>C`P,#8X,S1E`'IZ
+M,#`P,&(V9&4`>GHP8C9B9C`P.0!Z>C!B-64S,6$X`'IZ,#`P,#%A.#``>GHP
+M,#!B9#$Q-@!Z>C`U93AE-F,Q`'IZ,&5C,V(R,F4`>GHP,#<Q8F)B9`!Z>C`P
+M,#!B-F4V`'IZ,&(V8S<P,#D`>GHP8C8R,S%A.`!Z>C`P,#,S,#,R`'IZ,#`P
+M,&0R-#D`>GHP,#`R9&(W-0!Z>C`P,#5B-C<X`'IZ,#`P8C9D8S(`>GHP,#)D
+M.38U8P!Z>C`P,#)D83EB`'IZ,#`P-C,X-&0`>GHP,#`P930Y.`!Z>C`P,#8U
+M-#`Y`'IZ,#`P9#1E.#8`>GHP,#`V83,T,P!Z>C`P,#9D-3EC`'IZ,&5C,V(R
+M,S,`>GHP,#`Q.3@W8P!Z>C`P,#!B-F5E`'IZ,#!B-F1A,C@`>GHP,#`S,S`P
+M,`!Z>C`P,#,S,#`U`'IZ,#`Q.3@X,#``>GHP,#`P,3DV,0!Z>C!B-F8S8V-B
+M`'IZ,#`P,&0R-#@`>GHP,#`S,F0T9`!Z>C`P,#`Q.&5A`'IZ,#`P,F1B.34`
+M>GHP,#`U8C9B.`!Z>C!E8S-B,C)F`'IZ,#`Q.3AA8S``>GHP,#5B-V(X9@!Z
+M>C`P8C9D9F5F`'IZ,#`U8C4U868`>GHP-6(S,30V9@!Z>C`P-6(U-6-F`'IZ
+M,#`U8C4U968`>GHP,#5B-38P9@!Z>C`P-6(U-C9F`'IZ,#`U8C4V.&8`>GHP
+M,#)D8S(W-0!Z>C`P,3AE,6,P`'IZ,#`U8C9B,F4`>GHP,#)D83EF8@!Z>C`P
+M,F1B-C@U`'IZ,#)D8C@U,&0`>GHP,#`U8C1E,@!Z>C!B-3(S,6$X`'IZ,#!B
+M-F$W-64`>GHP,#5B-V(Y,`!Z>C`P8C9D9F8P`'IZ,#5B,S$T-S``>GHP,#5B
+M-35D,`!Z>C`P-6(U-68P`'IZ,#`U8C4V,3``>GHP,#5B-38W,`!Z>C`P-6(U
+M-CDP`'IZ,#`R9&,T-S4`>GHP,#5B-F8R90!Z>C`P,F1A8F9B`'IZ,#`R9&(X
+M.#4`>GHP,F1B834P9`!Z>C`P,#5B-3(R`'IZ,&(U-C,Q83@`>GHP,#5B-V(X
+M-0!Z>C`P8C9D9F4U`'IZ,#5B,S$T-C4`>GHP,#5B-35C-0!Z>C`P-6(U-64U
+M`'IZ,#`U8C4V,#4`>GHP,#5B-38V-0!Z>C`P-6(U-C@U`'IZ,#`R9&%E-S4`
+M>GHP,#5B-#,R90!Z>C`P,F1A,C@U`'IZ,#`R9#DU9F(`>GHP,F1A-#4P9`!Z
+M>C`P,39C8V$R`'IZ,&(R83,Q83@`87(U,C$R36]D97-?-30Q,P!Z>C`P8C9D
+M9F9D`'IZ,#5B,S$T-V0`>GHP,#5B-35D9`!Z>C`P-6(U-69D`'IZ,#`U8C4V
+M,60`>GHP,#5B-38W9`!Z>C`P-6(U-CED`'IZ,#`R9&1E-S4`>GHP,#5B83,R
+M90!Z>C`P,F1D,C@U`'IZ,#`R9&,U9F(`>GHP,F1D-#4P9`!Z>C`P,39E-&$R
+M`'IZ,&(X83,Q83@`>GHP,#5B-3@T-@!Z>C`P,F1B,3%C`'IZ,#)D8F8X-S4`
+M>GHP,F1B8C%B,@!Z>C`R9&(R,#4S`%]?87-H;&1I,P!Z>C`P,F1B830R`'IZ
+M,&9B8C%E,V8`>GHP8C<Y96$Y-`!Z>C`U8CAC-C5A`'IZ,#`U8C0P860`>GHP
+M-6(Y-#)E9`!Z>C!D.&1C-C)C`'IZ,#`Q.68T-S``>GHP,F1D.30R9`!Z>C`R
+M9&)E-S-D`'IZ,#`U8C8Y,F(`>GHP8C9D,C,R-0!Z>C`P-6(X-3-D`'IZ,#`Q
+M-F0Y,F4`>GHP8V9B,3@W-0!Z>C`P,F1B,S%C`'IZ,#)D86)B86,`>GHP,F1B
+M8S@U,0!Z>C`P,&(V8S8X`'IZ,#`P8C9B9C@`>GHP,&(V8V8U90!Z>C`Q-F4Q
+M9&9D`'IZ,&(V9C4P8C@`>GHP-F4P831F90!Z>C`P-C=D,F(Q`'IZ,#`R9&)C
+M-C$`>GHP8C9C83,R-0!Z>C`P-6(V8V9D`'IZ,#$V93!D9F0`>GHP,#!B-F8V
+M.`!A=&A?:&%L7W!R;V-E<W-?;F]I<V5F;&]O<@!Z>C`P-6(T.&%D`'IZ,#)D
+M8F8Q8C(`>GHP,#5B.#AC8@!Z>C`S,V5C.&)F`'IZ,&1B-#(U8S4`871H7VAA
+M;%]D;6%?8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP,&(V9C$V,0!Z>C`V93`P
+M8CAA`'IZ,#)D8F9C,60`>GHP9&,T93,Y,`!Z>C!D869E9#@V`'IZ,#!B-F4R
+M-V$`>GHP,F1B8F%B,@!Z>C!B-F0Q969F`'IZ,#$V9#DP9&0`>GHP,F1B93@U
+M,0!Z>C`P-6(V-&9D`'IZ,#`P8C9D-3(`>GHP8C9C.65F9@!Z>C`Q-F4P,&1D
+M`'IZ,#)D8F0X-S4`>GHP,F1B,S%B,@!Z>C`P8C<P.3(S`'IZ,#!B-F0T-3``
+M>GHP,#!B-F0Q9`!Z>C!B-F,R,S(U`'IZ,#)D8F1A8C(`>GHP,#`U8C8S,@!Z
+M>C`V9&5D9#DS`'IZ,#`Q-F1A-3``>GHP,#`V-V0S,@!Z>C`P8C9D.3(S`'IZ
+M,#`R9&(U,6,`>GHP,39D8V)F90!Z>C`P8C<P,30U`'IZ,#`Q-F1F,F,`>GHP
+M8C=F860S90!Z>C`Q-F0Y.3(P`'IZ,#)D8C%B86,`>GHP9&,V93,Y,`!Z>C`U
+M8C<P,64P`'IZ,#`P8C9B,3``>GHP8C<P.65F9@!Z>C`Q-F1F.#EB`&%T:%]H
+M86Q?871T86-H`'IZ,#9E,&9C,&0`;65M8W!Y`'IZ,#$V9&%B,F0`>GHP,F1B
+M,3,U9`!Z>C!E,#0V.#1B`'IZ,#$V93(Y,60`>GHP,#!B-F9E.`!Z>C`P8V9B
+M,V4P`'IZ,#`Q-F0Y-#@`>GHP,39E,C`Y8@!Z>C!B-S`Q969F`'IZ,#`P8C9C
+M.60`>GHP,#`U8C5A,@!Z>C`R9&(Q-S!A`&%T:%]H86Q?8V]M<'5T971X=&EM
+M90!Z>C`R9&(U8F%C`'IZ,#`U8C@Q,V0`>GHP,&(V8SDR,P!Z>C!B-F(U,&(X
+M`'IZ,#`U8C=F.60`>GHP8C<P,60P,@!Z>C`V9&9F-#1A`'IZ,#)D8C4W-C,`
+M>GHP-F5E868V,`!Z>C!E,#`W8V$Q`'IZ,#`R9&%F-C(`>GHP8C@S860S90!Z
+M>C`P,&(V8CDP`'IZ,#$V9#EE9F$`>GHP,39D93`U,0!Z>C`P,#5B-F(R`'IZ
+M,#5B-V8Q,30`>GHP-&%E,#,Q9@!Z>C`R9&)D9&9D`'IZ,#`U-#=F960`>GHP
+M,&(V8F8U90!Z>C`P8C<Q-S=D`'IZ,#!B-S!F,V0`>GHP,39D.#DR,`!Z>C`R
+M9&(Q86(R`'IZ,#`P-6(V,C(`>GHP,#!B-F8W.`!Z>C!B-CEB,#=C`&%T:%]H
+M86Q?9G)E90!Z>C`U8C<Y8C%B`'IZ,#!B-S`W,V0`>GHP,F1B96)B9`!Z>C!B
+M-64S,34R`'IZ,#$V9&9B9C$`871H7VAA;%]M:'HR:65E90!Z>C`Q-F4Q.#EB
+M`'IZ,&1C,F$U8S4`>GHP,#)D8S8P8@!Z>C`V9&8P8CAA`'IZ,#)D8C,S-60`
+M>GHP8C9C-3-A-`!Z>C!F-31D,6(P`'IZ,&(V9F0S-C,`>GHP9#ED8S8R8P!Z
+M>C`U8C<T,64P`'IZ,#)D83EB86,`>GHP9&,R,60S80!Z>C`P8C<Q-S-D`'IZ
+M,#$V9#ED-#$`>GHP,#5B.#1F9`!Z>C`P-6(X86)D`'IZ,#!B-S`Q,C,`>GHP
+M,#5B-C4R8@!Z>C`R9&(S.#<U`'IZ,#$V93,P.6(`>GHP,#5B-C!B,@!Z>C`R
+M9&(Q.#<U`'IZ,#`R9&(X-#(`>GHP,F1B,3<V,P!Z>C!B-V1E83DT`'IZ,#!B
+M-S`Q-C$`>GHP,39D-V0T,0!Z>C`P,39C9#,R`'IZ,#9D93!B.&$`>GHP-F0Y
+M9&0Y,P!Z>C!D8C-E9#@V`'IZ,#`U8C0X960`>GHP,#)D8S@P8@!Z>C`P,F1B
+M8S0R`'IZ,#)D8F$X-3$`>GHP,F1B,S-E9`!Z>C`P-6(X,&9D`'IZ,#`U8C=F
+M,F4`>GHP,F1B9F1F9`!Z>C`Q-F4V-#AA`'IZ,#`R9&%F9C(`>GHP,#5B-S<Y
+M9`!Z>C`P,&(V964X`'IZ,#$V930T.&$`>GHP,&(V9C9B8P!Z>C`Q-F1A.3(P
+M`'IZ,#5B-S@Q93``>GHP,#)D8V$P8@!Z>C`P-6(T-&%D`'IZ,#9D9&8T-&$`
+M>GHP9F%C,&,Y8@!Z>C!B-F8Y969F`'IZ,#!B-F,V8F,`871H7VAA;%]A9&1I
+M=&EO;F%L7W-W8F%?8F%C:V]F9@!Z>C`P,#)D8CDR`&%T:%]H86Q?=F5R<VEO
+M;@!Z>C`R9&)A8S)E`'IZ,#)D8C<Y864`>GHP,#$V934S,@!Z>C!B-F-F,#`Y
+M`'IZ,#`Q-F4Q,F,`>GHP,#$V9#EE-`!Z>C`P,#)D865A`'IZ,#`U8C5C8C(`
+M>GHP,39D83(U,0!Z>C`V9C9A9C8P`'IZ,#9D9F1D.3,`871H7VAA;%]M86QL
+M;V,`>GHP,#!B-F1D,@!Z>C`R9&0Y,F%D`'IZ,#$V9&(R-3$`>GHP93$P-V-A
+M,0!Z>C`P8C9C-S5E`'IZ,#$V9&0P-3$`>GHP,F1B9#%B,@!Z>C`R9&,Q-S8S
+M`'IZ,&(V.3!D-F0`>GHP,39D9C`U,0!Z>C`P,39D.34P`'IZ,#!B-S`V8F,`
+M>GHP,#$V9#@W,@!Z>C`V9&5F-#1A`'IZ,#5B.&,R960`>GHP-F9B.30W8@!Z
+M>C!E8F(Q93-F`'IZ,&(V9CED,#(`>GHP9#$T9#%B,`!Z>C!B-#@P,S%E`'IZ
+M,#$V9&)B9F4`>GHP,39E-30X80!Z>C`P,39D.#4P`'IZ,#`P8C9F9C@`871H
+M7VAA;%]M96UC<'D`>GHP,F1B8V)B9`!Z>C`Q-F1A,&1D`'IZ,#)D8F)D9F0`
+M>GHP,F1B,C@U,0!Z>C`R9&)D8S%D`'IZ,#9D8C!C9C(`>GHP,39E8CEA9`!Z
+M>C`P8C9C96)C`'IZ,&0Y-#@T83$`871H7VAA;%]P<F]B90!Z>C`Q-F5A.6%D
+M`'IZ,&9D-&0Q8C``>GHP,F1B,S<V,P!A=&A?:&%L7V)U:6QD;W!T<P!Z>C`R
+M9&%F,S5D`'IZ,#9D9&1D.3,`>GHP9&%D8S8R8P!Z>C`Q-F1F,C4Q`'IZ,#`P
+M8C9C,3``>GHP,39D.3(U,0!Z>C`R9&(P.#4Q`'IZ,&(W,C%A960`>GHP-C=C
+M9F-A90!Z>C`P,&(V8V8X`'IZ,&,Y-&0Q8C``>GHP,F1A9F%B,@!Z>C`U8CDR
+M865D`'IZ,#`U8CAC8V(`>GHP8C9D.65F9@!Z>C`R9&(Q,6(R`'IZ,#)D8F9F
+M8C$`>GHP,F1B9C<V,P!Z>C`P-6(V.&9D`'IZ,#`U8C0T960`>GHP8C<Q,6%E
+M9`!Z>C!B-64S,38P`'IZ,&0X-#@T83$`>GHP,39D.&(R9`!Z>C`Q-F4P.#EB
+M`'IZ,#)D8F(X-S4`>GHP,F1A93@U,0!Z>C!B.#%E83DT`'IZ,#$V9&5C,68`
+M>GHP,&(V9F5B8P!Z>C!E.#DT.3`W`'IZ,#!B-F5A-V$`>GHP,S-E.&9B9@!Z
+M>C!C9F$U.#<U`'IZ,#)D8CDY864`>GHP,F1B.6%B,@!Z>C`P,&(V8F4X`'IZ
+M,&1E-C@S-V8`>GHP,39D86)F90!Z>C!B-S`Y9#`R`'IZ,#8W9#(U93(`>GHP
+M,3EF,V$P,0!Z>C`W,#,Y-#=B`&%T:%]H86Q?;65M>F5R;P!Z>C`V9&9F8S!D
+M`'IZ,&(V-S4P8C@`>GHP,39E,F1F9`!Z>C`P,&(V9#(R`'IZ,#9F96%F-C``
+M>GHP9&,T835C-0!Z>C`P8C<P9C=D`&%T:%]H86Q?<W=?8F5A8V]N7W)E<W!O
+M;G-E7W1I;64`>GHP.68V-&(V80!Z>C`P-6(V-3=A`'IZ,#9F,SDT-V(`>GHP
+M-F1A,&-F,@!Z>C!B-V)A9#-E`'IZ,#!B-F8Y-C$`>GHP8C8Y-S-B8P!Z>C`R
+M9&)D,S5D`'IZ,#`U8C@X9F0`>GHP,F1B8F,Q9`!Z>C`R9&%F9&9D`'IZ,#9D
+M-V1D.3,`871H7VAA;%]D96QA>0!Z>C`R9&(Q9&9D`'IZ,#8W9#)F-#$`>GHP
+M,F1A9C@W-0!Z>C!B-V5D939D`'IZ,#$V9#AD-#$`>GHP,#)D864Y,@!Z>C!B
+M-V%D939D`'IZ,#)D8F(S-60`>GHP,F1B,V1F9`!Z>C`R9&(U,V5D`'IZ,#$V
+M9&-E864`>GHP,#!B-F1A,@!Z>C`P,&(V93(R`'IZ,#5B.#`P-#$`>GHP,#$V
+M9#@T.`!Z>C`Q-F0Y8C)D`'IZ,#`Q-F4P,F,`>GHP,&(W,#<W9`!Z>C`P-6(V
+M.3=A`'IZ,#`Q-F1A930`>GHP,39E,3`Y8@!Z>C`P-6(T83)D`'IZ,#$V9&4P
+M9&0`>GHP,39D9C!D9`!Z>C!D9C`W8V$Q`'IZ,#)D8F0W-C,`>GHP,#!B-F4U
+M,@!Z>C`V-V0P8S0W`'IZ,#5B-F,V9&(`>GHP8S,Q-65B-0!Z>C!D8C%E9#@V
+M`'IZ,#9D-#`V93``>GHP,39E,#(U,0!Z>C`P,#)D8F(R`'IZ,#`R9&0X-F0`
+M>GHP,#$V93$T9`!Z>C`R9&(U.6%E`'IZ,#`V-V0R,C$`>GHP,39D.#!D9`!Z
+M>C`P-6(X.3-D`'IZ,#5B.#%B,6(`>GHP,F1B,3-E9`!Z>C`P8C9D,3(S`'IZ
+M,#`P8C9C93@`>GHP-6(X86%E9`!Z>C!B-F5D,S8S`'IZ,#)D868Q8C(`>GHP
+M,#`U8C5E,@!Z>C`S,V5B9F)F`'IZ,#5B-C@V9&(`>GHP,#!B-F5F.`!Z>C!B
+M-S$Y865D`'IZ,#`U8C4X8C(`>GHP-6(W9&(Q8@!Z>C!B.#)D939D`'IZ,#`Q
+M-F0W,S(`>GHP,F1A9&%B,@!Z>C!F-#5E-F4S`&%T:%]H86Q?:6YI=%]C:&%N
+M;F5L<P!Z>C`P8C9D-F)C`'IZ,&,Q-&0Q8C``>GHP,#`R9&)D,@!Z>C!D830X
+M-&$Q`'IZ,#$V93!B.#<`>GHP-6(Y,#)E9`!Z>C!D8S)E,SDP`'IZ,&$V,&0Q
+M-#4`>GHP,F1B86)B9`!Z>C`P,&(V8S%D`'IZ,#5B.&5A960`>GHP,#5B-V(Y
+M9`!Z>C`P-6(U-#0V`'IZ,#5B-C0V9&(`>GHP,&(V9CDR,P!Z>C!D9#8X,S=F
+M`'IZ,#$V93$R-3$`>GHP9&,V835C-0!Z>C`R9&(S-S!A`'IZ,#`P-6(V-S(`
+M>GHP-F1E9F,P9`!Z>C`R9&)F,S5D`'IZ,#`P8C9C-S@`>GHP,#$V9#@S,@!Z
+M>C`R9&(U-S!A`'IZ,#`U8C9D-V$`>GHP,#)D8C(Y,@!Z>C`P-6(Y,&-B`&%T
+M:%]H86Q?<F5G7W=R:71E`'IZ,&(V9C4S-C,`>GHP,#5B-6,T-@!A=&A?:&%L
+M7W)E9U]R96%D`'IZ,#9D.3!C9C(`>GHP-F0X9&0Y,P!Z>C`Q-F1F8C@W`'IZ
+M,#`Q-F1A-#@`>GHP8C8V,S%A.`!Z>C`P,F1B,#DR`&%T:%]H86Q?9V5T=VER
+M96QE<W-M;V1E<P!Z>C`Q-F4Q8C@W``````````(```,&````1`````8```,$
+M````1````%8```,&````6````%H```,$````6````'X```,&````;````((`
+M``,$````;````,X```,&````@````-(```,$````@````.8```,&````E```
+M`.H```,$````E````/H```,&````J````/X```,$````J````08```,&````
+MN````0H```,$````N````1(```,&````R````18```,$````R````1X```,&
+M````W````2(```,$````W````2H```,&````\````2X```,$````\````DP`
+M`/4*`````````E0``@,*`````````EP``,4*`````````P@``@\*````````
+M`R```;0*````````!@@``3L*````````!H0``3L*````````!V@``9T*````
+M````!VX```0&````````!W(```0$````````!\0``9T*````````!\H```0&
+M````````!\X```0$````````")0``.4*````````"+```.4*````````"/H`
+M``(&````"```"/X```($````"```"Y0``@\*````````#O0``7P*````````
+M#QP``9T*````````#SH```4&````````#SX```4$````````#]H```4&````
+M````#]X```4$````````$````9T*````````$4X```8&````````$5(```8$
+M````````$5X```<&````````$6(```<$````````%1```4P*````````&C0`
+M`9\*````````'4```0(*````````)_8```(&````S```)_H```($````S```
+M*`8```($````S```*!0``4P*````````*#@``9\*````````*,P``9\*````
+M````*6```9\*````````*=```0(*````````-)8```D&````````-)H```D$
+M````````-*8```@&````````-*H```@$````````1)(```H&````````1)8`
+M``H$````````1*8```P&````````1*H```P$````````16H```P&````````
+M16X```P$````````1WX```P&````````1X(```P$````````1^X```H&````
+M````1_(```H$````````2%X``!(&````````2&(``!($````````2(@``64*
+M````````2,H```H&````````2,X```H$````````2:(```H&````````2:8`
+M``H$````````2B(```L&````````2B8```L$````````2[0``(H*````````
+M3@(``!,&````````3@8``!,$````````3@H``!,&````&```3@X``!,$````
+M&```3JH```X&````````3JX```X$````````3LX```T&````````3M(```T$
+M````````3NX```\&````````3O(```\$````````3Q(``!`&````````3Q8`
+M`!`$````````3S8``!$&````````3SH``!$$````````3U8```X&````````
+M3UH```X$````````4(```9\*````````4:@``-@*````````4=8``!,&````
+M&```4=H``!,$````&```4@8``!0&````````4@H``!0$````````5`0``7P*
+M````````500``7P*````````560``7P*````````6"(``!4&````````6"8`
+M`!4$````````6-X``!8&````````6.(``!8$````````6@0``4P*````````
+M6AX``!<&````````6B(``!<$````````6B@``64*````````6H```;H*````
+M````6J```@\*````````6K@``@\*````````6M@``@P*````````6O```@P*
+M````````6PP``@\*````````6Q@``*T*````````6RP``@\*````````6T``
+M`@P*````````6U```:D*````````6WP``:D*````````6Z```:D*````````
+M6^@``:D*````````7"P``:D*````````7+X``/H&````````7,(``/H$````
+M````7L0``:D*````````7S```@P*````````7U0``@P*````````7V0``0(*
+M````````7[0``0(*````````8*0``@P*````````8+@``@P*````````8,P`
+M`@P*````````8.```@P*````````8/0``@P*````````82X``*\&````````
+M83(``*\$````````84(``:<&````````848``:<$````````880``>(*````
+M````8;@``@P*````````8<@``@\*````````8>@``@P*````````8@```@P*
+M````````8E```@\*````````8F@``@P*````````8GP``@P*````````8I``
+M`@P*````````8K0``@\*````````8M```@P*````````8N0``@P*````````
+M8O0``@\*````````8R@``@P*````````8W```@P*````````8Z```@\*````
+M````8^0``@\*````````9,P``@P*````````93@``@P*````````950``@P*
+M````````9:0``@\*````````9@```@P*````````9A```@P*````````9B``
+M`@P*````````9C```@P*````````9D```@P*````````9E```@P*````````
+M9F```@P*````````9G0``@P*````````9RP``@P*````````9T```@P*````
+M````:.0``@P*````````:/0``@P*````````:00``@P*````````:10``@P*
+M````````:20``@P*````````:3@``@P*````````:4@``.X*````````:9P`
+M`64*````````:<0``64*````````:>X``!H&````````:?(``!H$````````
+M:?@``64*````````:C@``@\*````````:DP``,@*````````:F0``@\*````
+M````:P0``:,*````````:QP``/,*````````:UP``@\*````````:X0``@P*
+M````````:\0``@\*````````:^```@P*````````;"@``@\*````````;$P`
+M`@P*````````;)0``@\*````````;.0``@\*````````;2```@P*````````
+M;3```<X*````````;7```@\*````````;:```@P*````````;=```@\*````
+M````;A@``@\*````````;D0``@P*````````;IP``64*````````;M0``@P*
+M````````;OP``@P*````````;Q0``@\*````````;RP``@\*````````;T``
+M`@P*````````;X```@\*````````;Y0``@\*````````;Z@``@\*````````
+M<`0``@\*````````<#0``@\*````````<$@``@P*````````<(0``@\*````
+M````<*@``@\*````````<+P``@\*````````<0```@\*````````<5```@\*
+M````````<6P``@\*````````<8@``@\*````````<:0``@\*````````<<``
+M`@\*````````<AP``*,*````````<D```=H*````````<E0``@P*````````
+M<I@``@\*````````<J0``*,*````````<N0``*,*````````<PP``@\*````
+M````<QP``=H*````````<S@``@P*````````<X```@\*````````<XP``*,*
+M````````<^```@\*````````<_0``@P*````````=`P``@\*````````="``
+M`@P*````````='0``*,*````````=)P``@\*````````=*P``=H*````````
+M=,@``@P*````````=1```@\*````````=1P``*,*````````=7P``94*````
+M````=<@``@P*````````==@``)D*````````=?@``;8*````````=C```@\*
+M````````=D0``@P*````````=E@``@\*````````=F@``@P*````````=J@`
+M`@\*````````=K@``@P*````````=L```;0*````````=M```@\*````````
+M=N```;0*````````=NP``@\*````````=OP``@P*````````=R```@\*````
+M````=S0``@P*````````=W@``@\*````````=XP``@P*````````=Z```@\*
+M````````=[```@P*````````>&@``@\*````````>)H``7`&````````>)X`
+M`7`$````````>*X``(\&````````>+(``(\$````````>,0``:@*````````
+M>/```@\*````````>1@``@P*````````>4```@P*````````>70``@P*````
+M````>80``@\*````````>9@``;0*````````>>0``@\*````````>?@``@P*
+M````````>BP``@\*````````>D```@P*````````>H0``@P*````````>I@`
+M`@P*````````>O```@\*````````>R```@\*````````>SP``@P*````````
+M>Y@``@\*````````>\@``@\*````````>^0``@P*````````?!@``@\*````
+M````?%0``@P*````````?/@``@\*````````?2@``@\*````````?J```7P*
+M````````?N@``@\*````````?O@``;H*````````?SP``@P*````````?UP`
+M`@P*````````?ZP``@P*````````?\P``@P*````````?]P``@P*````````
+M?^@``@\*````````?_@``@P*````````@#```@P*````````@%```@P*````
+M````@&```@P*````````@'```@P*````````@(```@P*````````@(P``@\*
+M````````@)P``@P*````````@*P``@P*````````@,```@\*````````@-``
+M`@P*````````@.```@P*````````@/```@P*````````@0```@P*````````
+M@1```@P*````````@2```@P*````````@3```@P*````````@4```@P*````
+M````@50``@P*````````@6@``@P*````````@70``34*````````@8@``@P*
+M````````@9P``@P*````````@;```@P*````````@<0``@P*````````@=@`
+M`@P*````````@>P``@P*````````@@```@P*````````@A0``@P*````````
+M@B@``@P*````````@CP``@P*````````@E```@P*````````@F0``@P*````
+M````@G@``@P*````````@H(``!L&````````@H8``!L$````````@K0``@P*
+M````````@LP``@0*````````@N@``@\*````````@P@``@P*````````@S@`
+M`@P*````````@T@``@\*````````@V@``@P*````````@W@``@\*````````
+M@Y@``@P*````````@Z@``@\*````````@\@``@P*````````@]@``@\*````
+M````@_@``@P*````````A%```@P*````````A%@``;0*````````A&@``@\*
+M````````A'P``@P*````````A)0``,@*````````A*```1,*````````A,P`
+M`-4*````````A.P``/T*````````A/P``@\*````````A1```@P*````````
+MA20``?X*````````A3@``(@*````````A4P``9<*````````A6@``@P*````
+M````A?```@\*````````AFP``@P*````````AO0``7<*````````AR0``;0*
+M````````ASP``;0*````````AX```7<*````````A[@``@P*````````A]P`
+M`;0*````````B````;0*````````B!```7<*````````B(@``7P*````````
+MB*@``@\*````````B+P``@P*````````B,P``@\*````````B.0``@P*````
+M````B.P``;0*````````B/P``@\*````````B1```@P*````````B1@``;0*
+M````````B3@``;0*````````B4@``@\*````````B5P``@P*````````B6P`
+M`@\*````````B8```@\*````````B90``@\*````````B:P``@P*````````
+MB<@``@P*````````B>```@P*````````B>@``;0*````````B?@``@\*````
+M````B@P``@P*````````BA0``;0*````````BB@``@P*````````BC@``@\*
+M````````BDP``@P*````````BE0``;0*````````BF0``@\*````````BG@`
+M`@P*````````BI```,@*````````BJ0``@P*````````BK@``@P*````````
+MBLP``@P*````````BM@``1,*````````BN@``;0*````````BO0``1,*````
+M````BQ@``@\*````````BRP``@P*````````BT```@P*````````B\0``@P*
+M````````B\P``;0*````````B_```,@*````````C#P``@P*````````D"X`
+M`!T&````````D#(``!T$````````D?H``!X&````````D?X``!X$````````
+MD@0``64*````````D@X``!P&````````DA(``!P$````````DA@``64*````
+M````DG```*T*````````DI@``*T*````````E!P``*T*````````E#@``*T*
+M````````E%0``*T*````````E(@``@P*````````E+0``@P*````````E1P`
+M`*T*````````E30``@P*````````E4@``@P*````````E8```@\*````````
+ME=```@\*````````E>0``@P*````````E?P``,@*````````EAP``;0*````
+M````EB0``-`*````````EM```>4*````````EQ@``90*````````E\0``9\*
+M````````F`@``3P*````````F30``@P*````````F4P``@P*````````F60`
+M`@P*````````F8@``@P*````````F:```@P*````````F;```@\*````````
+MF<@``@P*````````F?0``@P*````````F@P``@P*````````FB0``@P*````
+M````FD@``@P*````````FF```@P*````````FG```@\*````````FH@``@P*
+M````````FJ```@P*````````FN@``@P*````````G$```@\*````````G*@`
+M`@P*````````G.```2`*````````G/```<X*````````G0```@\*````````
+MG2P``<X*````````G40``@P*````````G5```<X*````````G<P``@P*````
+M````G?0``@P*````````GCP``@\*````````GJ0``@P*````````GK0``@\*
+M````````GL0``;0*````````GN```@P*````````GP```,@*````````H4@`
+M`@P*````````H6```@P*````````H7P``@\*````````H90``*T*````````
+MH?0``4P*````````H@X``!\&````````HA(``!\$````````HA@``64*````
+M````HFP``A4*````````HJ```@P*````````HK0``@P*````````HKP``;0*
+M````````HL@``@\*````````HOP``@\*````````HT@``@P*````````HU``
+M`;0*````````HX```<<*````````H[```@\*````````H]```<<*````````
+MH_P``<<*````````I&8``"(&````````I&H``"($````````I*P``?<*````
+M````I.0``@P*````````I.P``;0*````````I0P``@P*````````I10``;0*
+M````````I40``<<*````````I68``5$&````````I6H``5$$````````I7P`
+M`?\*````````I90``<<*````````I@P``>0*````````IF@``9P*````````
+MIG```0(*````````IKH```(&```KL```IKX```($```KL```IM(```(&```K
+MN```IM8```($```KN```IMH```($```KN```IQ@``@\*````````IS@``@P*
+M````````IT0``@\*````````IWP``@P*````````IX@``@\*````````I[0`
+M`@P*````````I\@``;0*````````J)@``5P*````````J4```<<*````````
+MJ;P``@P*````````J=```@P*````````J>0``@P*````````J?@``@P*````
+M````J@P``@P*````````JG8``*\&````````JGH``*\$````````JHH``:<&
+M````````JHX``:<$````````JK@``@T*````````JNP``@P*````````JOP`
+M`@\*````````JQ0``@P*````````JRP``@P*````````JWP``@\*````````
+MJY```@P*````````JZ0``@P*````````J[@``@P*````````J]P``@\*````
+M````J_```@P*````````K`0``@P*````````K!0``@\*````````K$@``@P*
+M````````K'```@P*````````K'P``@\*````````K)P``@P*````````K,P`
+M`@\*````````K0P``@\*````````K:@``@\*````````K;@``@\*````````
+MK<@``@\*````````K=@``@\*````````K>@``@\*````````KE```@P*````
+M````KEP``@\*````````KM0``@P*````````KO```@P*````````KT```@\*
+M````````KYP``@P*````````KZP``@P*````````K[P``@P*````````K\P`
+M`@P*````````K]P``@P*````````K^P``@P*````````K_P``@P*````````
+ML!```@P*````````L,@``@P*````````L-P``@P*````````LK0``@P*````
+M````LL0``@P*````````LM0``@P*````````LN0``@P*````````LO0``@P*
+M````````LP@``@P*````````LQ@``4H*````````LVP``64*````````LY0`
+M`64*````````L[X``",&````````L\(``",$````````L\@``64*````````
+MM`P``@P*````````M!P``@P*````````M#```,@*````````M$@``@\*````
+M````M1P``6$*````````M2P``@\*````````M4```@P*````````M4P``<`*
+M````````M6@``+4*````````M:@``@\*````````M<0``@P*````````M@0`
+M`@\*````````MB```@P*````````MF@``@\*````````MHP``@P*````````
+MMM0``@\*````````MQP``@\*````````MT0``@P*````````MU0``84*````
+M````MY```@\*````````MZ8``"0&````````MZH``"0$````````M[P``@P*
+M````````M_P``64*````````N#0``@P*````````N%P``@P*````````N)P`
+M`@\*````````N+```@\*````````N,0``@\*````````N2```@\*````````
+MN5```@\*````````N60``@P*````````N:```@\*````````N<0``@\*````
+M````N=@``@\*````````NAP``@\*````````NH@``@\*````````NJ0``@\*
+M````````NL```@\*````````NMP``@\*````````NO@``@\*````````NU0`
+M`*,*````````NW0``=H*````````NX0``@P*````````N\0``@\*````````
+MN]```*,*````````O!```*,*````````O#@``@\*````````O$@``=H*````
+M````O&0``@P*````````O*P``@\*````````O+@``*,*````````O0P``@\*
+M````````O2```@P*````````O3@``@\*````````O4P``@P*````````O:``
+M`*,*````````O<@``@\*````````O=@``=H*````````O?0``@P*````````
+MOCP``@\*````````OD@``*,*````````OI```@\*````````OKP``@\*````
+M````ONP``@P*````````ORP``5T*````````OW```94*````````OZ@``@P*
+M````````O[0``)D*````````O]0``;8*````````P!@``@\*````````P"@`
+M`@P*````````P#```;0*````````P$```@\*````````P%```;0*````````
+MP%P``@\*````````P&P``@P*````````P)```@\*````````P*0``@P*````
+M````P.@``@\*````````P/P``@P*````````P1```@\*````````P2```@P*
+M````````P6```@\*````````P70``@P*````````P8@``@\*````````P9@`
+M`@P*````````PE```@\*````````PJ(``3D&````````PJ8``3D$````````
+MPJX``8<&````````PK(``8<$````````PKH``6P&````````PKX``6P$````
+M````PM```:@*````````POP``@\*````````PR0``@P*````````PTP``@P*
+M````````PWP``@P*````````PY```,@*````````P]```@\*````````P^0`
+M`@P*````````Q!@``@\*````````Q"P``@P*````````Q'```@P*````````
+MQ(0``@P*````````Q-P``@\*````````Q0P``@\*````````Q2@``@P*````
+M````Q80``@\*````````Q;0``@\*````````Q=```@P*````````Q@0``@\*
+M````````QC```@P*````````QLP``@\*````````R)```7P*````````R.0`
+M`@\*````````R/@``@\*````````R1P``@\*````````R30``@\*````````
+MR7@``@\*````````R9@``@\*````````R:@``@\*````````R<```@\*````
+M````R=```@\*````````R>```A4*````````RG@``@P*````````RL0``*T*
+M````````RM0``*T*````````RMX``"<&````````RN(``"<$````````RQX`
+M`"<&````````RR(``"<$````````RT```@P*````````RV(``"4&````````
+MRV8``"4$````````RX0``@P*````````RYH``"@&````````RYX``"@$````
+M````R[P``@P*````````R](``"8&````````R]8``"8$````````S`P``@P*
+M````````S#0``@\*````````S$P``@P*````````S%P``@P*````````S'``
+M`@P*````````S(```@\*````````S)0``@P*````````S+```@P*````````
+MS,0``@P*````````S.@``@P*````````S0```@P*````````S40``@P*````
+M````S6@``@P*````````S8```@\*````````S9```@P*````````S:```@P*
+M````````S;```@P*````````S<0``@P*````````S?P``@P*````````SAP`
+M`@P*````````SC```@P*````````SD```@P*````````SF0``@\*````````
+MSG0``@P*````````SH```:`*````````SK```@\*````````SM```@P*````
+M````SR@``@P*````````SSP``@P*````````STP``@\*````````SX@``;0*
+M````````SY@``@\*````````SZP``@P*````````S\0``,@*````````S]``
+M`)L*````````T!@``@P*````````T#P``@P*````````T%@``8P*````````
+MT'@``@P*````````T(@``@P*````````T)@``@P*````````T*0``@\*````
+M````T+0``@P*````````T,@``@P*````````T.```@\*````````T/```@P*
+M````````T00``@\*````````T10``@P*````````T30``,\*````````T40`
+M`@\*````````T5@``@P*````````T6P``1D*````````T8```5,*````````
+MT90``+8*````````T;```@P*````````TFP``=4*````````TI@``;0*````
+M````TMP``=4*````````TT0``@P*````````TU@``@P*````````TVP``@P*
+M````````TW0``;0*````````TXP``@P*````````TZP``@P*````````T[0`
+M`;0*````````T_@``@P*````````U!@``@P*````````U"```;0*````````
+MU#0``@P*````````U%0``;0*````````U&0``=4*````````U-@``7P*````
+M````U00``@\*````````U2```@\*````````U30``@\*````````U4@``@\*
+M````````U9P``@\*````````U;P``@P*````````U?@``)L*````````U@@`
+M`;0*````````UA0``)L*````````UL```@\*````````UM```@P*````````
+MUM@``;0*````````UOP``,@*````````UT@``@P*````````UY@``0@*````
+M````U[H``"H&````Y```U[X``"H$````Y```U\P``*T*````````U_P``*T*
+M````````V!P``*T*````````V%```@P*````````V&P``@P*````````V*P`
+M`@\*````````V00``@\*````````V2@``@P*````````V3@``@\*````````
+MV4P``@P*````````V7```@\*````````V8```;0*````````VE```@\*````
+M````VN```>X*````````VPX``"L&````````VQ(``"L$````````VV@``@\*
+M````````VWP``@P*````````V[8``"P&````````V[H``"P$````````V\8`
+M`"P$````````V^(``"P&````````V^8``"P$````````W08``"D&````````
+MW0H``"D$````````W:(``"D&````````W:8``"D$````````W;P``*T*````
+M````W>0``*T*````````W@```*T*````````WB```*T*````````WCP``*T*
+M````````WF8``"D&````````WFH``"D$````````WH@``@P*````````W^@`
+M`@P*````````W_P``@P*````````X(0``@\*````````X*0``@P*````````
+MX-P``@\*````````X0```@\*````````X3```@P*````````X4```5T*````
+M````X5P``@P*````````X6P``@\*````````X9@``@P*````````X:@``@\*
+M````````X<@``@P*````````X=@``@\*````````X@0``@P*````````XC@`
+M`@P*````````XD@``@\*````````XF@``@P*````````XG@``@\*````````
+MXI@``@P*````````XQ```@\*````````XS```@P*````````XY```@P*````
+M````Y*```)(*````````Y6X``"T&````````Y7(``"T$````````Y7@``9\*
+M````````Y7X``"X&````````Y8(``"X$````````Y8@``9\*````````Y8X`
+M`"T&````"```Y9(``"T$````"```Y98``"T&````B```Y9H``"T$````B```
+MY<8``"T&````````Y<H``"T$````````Y?(``"T&````````Y?8``"T$````
+M````YBH``"T&````!@``YBX``"T$````!@``YDH``"T&````````YDX``"T$
+M````````YK8``"T&````!@``YKH``"T$````!@``YSH``"X&````````YSX`
+M`"X$````````YX(``"T&````!@``YX8``"T$````!@``YYX``"T&````````
+MYZ(``"T$````````Z"8``"X&````````Z"H``"X$````````Z'(``"X&````
+M````Z'8``"X$````````Z*8``"X&````````Z*H``"X$````````Z-P``@P*
+M````````Z;8``"\&````````Z;H``"\$````````Z?0``9(*````````ZZH`
+M``(&```Y9```ZZX```($```Y9```[+8``#`&````````[+H``#`$````````
+M[7P``@P*````````[=@``@P*````````[>0``.L*````````\@(``#$&````
+M!```\@8``#$$````!```\A(``#$&````"```\A8``#$$````"```\P```@P*
+M````````\V@``@\*````````]#(``#$&````"```]#8``#$$````"```]((`
+M`#$&````````](8``#$$````````](H``#$&````"```](X``#$$````"```
+M]/H``#$&````````]/X``#$$````````]2X``#$&````````]3(``#$$````
+M````]4H``#$&````````]4X``#$$````````]5(``#$&````"```]58``#$$
+M````"```]5H``#$&````````]5X``#$$````````]B0``@\*````````]I``
+M`@P*````````]O0``7(*````````]P0``84*````````]Q```@\*````````
+M]T@``84*````````]V@``@P*````````]W0``84*````````]\0``>4*````
+M````^`P``90*````````^,P``9\*````````^1@``.$*````````^7```@P*
+M````````^9```@P*````````^9P``@\*````````^;@``@P*````````^T@`
+M`@P*````````^W```@P*````````^X```@P*````````^YP``@P*````````
+M^\@``@P*````````^]@``@\*````````^_P``@P*````````_"```@P*````
+M````_$0``@P*````````_&```@\*````````_'```@P*````````_)```@\*
+M````````_*```@P*````````_,```@\*````````_-```@P*````````_/P`
+M`@\*````````_0P``@P*````````_4```@\*````````_5```@P*````````
+M_58``:<&````````_5H``:<$````````_5X``*\&````````_6(``*\$````
+M````_7(``3X&````````_78``3X$````````_9```@P*````````_;0``@P*
+M````````_=0``@\*````````_>0``@P*````````_S@``@\*````````_V``
+M`@P*````````_Y```@P*````````_]```@\*````````_^0``@\*```````!
+M`$@``@P*```````!`%@``?0*```````!`&@``;0*```````!`(0``@P*````
+M```!`O0``@P*```````!`P@``@P*```````!`QP``@P*```````!`S```@P*
+M```````!`T0``@P*```````!`U@``@P*```````!`VP``@P*```````!`X``
+M`@P*```````!`Y0``@P*```````!`Z0``@P*```````!`^```@P*```````!
+M`_@``@P*```````!!!0``@\*```````!!"P``*T*```````!!%H```(&``!-
+M)``!!%X```($``!-)``!!&(```($``!-)``!!(H```(&``!-.``!!(X```($
+M``!-.``!!)(```($``!-.``!!+H```(&``!-3``!!+X```($``!-3``!!,(`
+M``($``!-3``!!.H```(&``!-8``!!.X```($``!-8``!!/(```($``!-8``!
+M!5P``3$*```````!!;X``#(&```````!!<(``#($```````!!<@``64*````
+M```!!D(``#8&```````!!D8``#8$```````!!DP``64*```````!!GX``#<&
+M```````!!H(``#<$```````!!P@``4P*```````!!S```*0*```````!!T0`
+M`@`*```````!!U@``@\*```````!!XP``@H*```````!!ZP``@\*```````!
+M!^```)@*```````!"`0``@\*```````!"!0``@P*```````!""@``@P*````
+M```!"#```,$*```````!"50``@D*```````!"80``@\*```````!"=```@D*
+M```````!"?```@D*```````!"AP``@D*```````!"E```@D*```````!"KX`
+M`#0&```````!"L(``#0$```````!"L8``#4&```````!"LH``#4$```````!
+M"Q```?<*```````!"Y0``@P*```````!"YP``;0*```````!"Z0``,$*````
+M```!"[P``@P*```````!"\0``;0*```````!"^P``@D*```````!#`P``:X*
+M```````!#$0``4,*```````!#'@``20*```````!#)P``@<*```````!#*P`
+M`>P*```````!#,0``9D*```````!#-P``@D*```````!#60``/\*```````!
+M#;@``/`*```````!#=@``,(*```````!#>@``@`*```````!#?0``9P*````
+M```!#?P``0(*```````!#D8```(&``!-B``!#DH```($``!-B``!#EX```(&
+M``!-D``!#F(```($``!-D``!#F8```($``!-D``!#J0``@\*```````!#L0`
+M`@P*```````!#M```@\*```````!#P@``@P*```````!#Q0``@\*```````!
+M#T```@P*```````!#U0``;0*```````!%)```2H*```````!%*H``@L&````
+M```!%*X``@L$```````!%+H``#@&```````!%+X``#@$```````!%/```@P*
+M```````!%00``@P*```````!%1@``@P*```````!%2P``@P*```````!%40`
+M`2H*```````!%6P``@P*```````!%8```@P*```````!%>H``*\&```````!
+M%>X``*\$```````!%?X``:<&```````!%@(``:<$```````!%BP``1`*````
+M```!%F```@P*```````!%G```@\*```````!%H@``@P*```````!%J```@P*
+M```````!%O@``@\*```````!%PP``@P*```````!%R```@P*```````!%S0`
+M`@P*```````!%U@``@\*```````!%VP``@P*```````!%X```@P*```````!
+M%Y```@\*```````!%\0``@P*```````!%^P``@P*```````!&$@``@P*````
+M```!&&0``@P*```````!&(```@P*```````!&-```@P*```````!&.```@P*
+M```````!&/0``,@*```````!&0P``@\*```````!&50``@\*```````!&7``
+M`@P*```````!&;```@\*```````!&<P``@P*```````!&A0``@\*```````!
+M&C@``@P*```````!&H```@\*```````!&M```@\*```````!&PP``@P*````
+M```!&QP``50*```````!&TP``@\*```````!&Z```@\*```````!&[0``@\*
+M```````!&_```@\*```````!'&```@\*```````!'(0``@\*```````!'.``
+M`@\*```````!'/```@\*```````!'0```@\*```````!'1```@\*```````!
+M'2```@\*```````!'9@``@P*```````!':0``@\*```````!'EP``@P*````
+M```!'F@``@\*```````!'H0``@P*```````!'J```@P*```````!'O@``@\*
+M```````!'VP``@\*```````!'X```@P*```````!'Y```@P*```````!'Z``
+M`@P*```````!'[```@P*```````!'\```@P*```````!']```@P*```````!
+M'^```@P*```````!'_0``@P*```````!("0``@P*```````!(#0``@P*````
+M```!($0``@P*```````!(%@``@P*```````!(1P``@P*```````!(3```@P*
+M```````!(>(```(&``!-H``!(>8```($``!-H``!(X```@P*```````!(Y``
+M`@P*```````!(Z```@P*```````!([```@P*```````!(\```@P*```````!
+M(]0``@P*```````!(^0``:0*```````!)*@``@P*```````!)+@``@P*````
+M```!),@``@P*```````!)-@``@P*```````!).@``@P*```````!)/@``@P*
+M```````!)0@``@P*```````!)1P``@P*```````!)30``@P*```````!)4@`
+M`@P*```````!)60``@P*```````!)70``@P*```````!)80``@P*```````!
+M)90``@P*```````!):0``@P*```````!);@``@P*```````!)<@``:0*````
+M```!)BP``64*```````!)E0``64*```````!)H@``64*```````!)K@``64*
+M```````!)O```@P*```````!)Q```@P*```````!*"0``@\*```````!*#@`
+M`@P*```````!*+```@\*```````!*,8``#D&```````!*,H``#D$```````!
+M*-P``@P*```````!*1P``64*```````!*50``@P*```````!*7P``@P*````
+M```!*;P``@\*```````!*=```@\*```````!*>0``@\*```````!*D```@\*
+M```````!*G0``@\*```````!*HP``@P*```````!*J```@P*```````!*SP`
+M`@\*```````!*V@``@P*```````!*Z@``@\*```````!*\P``@\*```````!
+M*^```@\*```````!+"0``@\*```````!+)```@\*```````!+*P``@\*````
+M```!+,@``@\*```````!+.0``@\*```````!+0```@\*```````!+40``@\*
+M```````!+7```@\*```````!+:```@P*```````!+>```(P*```````!+C``
+M`*,*```````!+E0``=H*```````!+F0``@P*```````!+J0``@\*```````!
+M+K```*,*```````!+O```*,*```````!+Q@``@\*```````!+R@``=H*````
+M```!+T0``@P*```````!+XP``@\*```````!+Y@``*,*```````!+^P``@\*
+M```````!,````@P*```````!,!@``@\*```````!,"P``@P*```````!,(``
+M`*,*```````!,*@``@\*```````!,+@``=H*```````!,-0``@P*```````!
+M,1P``@\*```````!,2@``*,*```````!,8```@P*```````!,90``@P*````
+M```!,A0``=H*```````!,J@``@P*```````!,K@``@P*```````!,M```@P*
+M```````!,P```*(*```````!,V```)0*```````!,WP``@P*```````!,Z@`
+M`@P*```````!,[@``@\*```````!,]```@P*```````!,^0``@P*```````!
+M,_```@\*```````!-````@P*```````!-%@``@P*```````!-&P``@P*````
+M```!-(```@P*```````!-)0``@P*```````!-*```@\*```````!-,```@P*
+M```````!--0``@P*```````!-.@``@P*```````!-/P``@P*```````!-0@`
+M`@\*```````!-20``@\*```````!-30``@P*```````!-4```@\*```````!
+M-5```@P*```````!-60``@P*```````!-7@``@P*```````!-8P``@P*````
+M```!-:```@P*```````!-;0``@P*```````!->```@P*```````!-?```@\*
+M```````!-B```@P*```````!-DP``)0*```````!-F```@\*```````!-G``
+M`@P*```````!-GP``@\*```````!-HP``@P*```````!-J```@P*```````!
+M-K```@\*```````!-N```@P*```````!-O0``@P*```````!-P@``@P*````
+M```!-QP``@P*```````!-S```@P*```````!-T0``@P*```````!-W```@P*
+M```````!-Y(``#H&```````!-Y8``#H$```````!-Z(``#H$```````!-[X`
+M`#H&```````!-\(``#H$```````!-_X```(&``!.!``!.`(```($``!.!``!
+M./0``@\*```````!.C```08*```````!.DH```(&``!.?``!.DX```($``!.
+M?``!.IP``94*```````!.NX```(&``!.M``!.O(```($``!.M``!.W0``@\*
+M```````!.Z@``@P*```````!/$X``#L&```````!/%(``#L$```````!/%P`
+M`1T*```````!/*```)D*```````!/,@``;8*```````!/0P``@\*```````!
+M/1P``@P*```````!/20``;0*```````!/30``@\*```````!/40``;0*````
+M```!/5```@\*```````!/6```@P*```````!/80``@\*```````!/9@``@P*
+M```````!/=P``@\*```````!/?```@P*```````!/@0``@\*```````!/A@`
+M`@P*```````!/E@``@\*```````!/FP``@P*```````!/H```@\*```````!
+M/I0``@P*```````!/TP``@\*```````!/]X``*H&```````!/^(``*H$````
+M```!0!(``2@&```````!0!8``2@$```````!0!X``<H&```````!0"(``<H$
+M```````!0"H``4X&```````!0"X``4X$```````!0#8``),&```````!0#H`
+M`),$```````!0$(``=<&```````!0$8``=<$```````!0$X``54&```````!
+M0%(``54$```````!0%H``6`&```````!0%X``6`$```````!0'```:@*````
+M```!0)P``@\*```````!0,0``@P*```````!0.P``@P*```````!01P``@P*
+M```````!03```,@*```````!07```@\*```````!080``@P*```````!08P`
+M`*X*```````!09@``5D*```````!0<P``@\*```````!0>```@P*```````!
+M0>@``0$*```````!0BP``@P*```````!0D```@P*```````!0I@``@\*````
+M```!0L@``@\*```````!0N0``@P*```````!0T```@\*```````!0W```@\*
+M```````!0XP``@P*```````!0\P``@\*```````!0^```@\*```````!1$0`
+M`@P*```````!1'0``@P*```````!1(@``@\*```````!1)P``@\*```````!
+M1*P``@P*```````!14P``@\*```````!1D```0X*```````!1VP``@`*````
+M```!1X0``7P*```````!1]```@\*```````!1^```4<*```````!1^P``5D*
+M```````!2'@``(D*```````!2)0``@\*```````!2+0``@\*```````!2,0`
+M`@\*```````!2-P``@\*```````!2.P``@\*```````!2/P``-P*```````!
+M200``,H*```````!21```@H*```````!2<@``@P*```````!2=(``#P&````
+M```!2=8``#P$```````!2?0``@P*```````!2@@``;0*```````!2AX``#T&
+M```````!2B(``#T$```````!2G```@P*```````!2H0``;0*```````!2LP`
+M`9`*```````!2O```@P*```````!2Y```@P*```````!2Z```@\*```````!
+M2[0``@P*```````!2\0``@\*```````!2]P``@P*```````!2_```@P*````
+M```!3!```@P*```````!3"0``@P*```````!3(```@\*```````!3)P``@P*
+M```````!3*P``-<*```````!3-0``;\*```````!350``10*```````!36``
+M`80*```````!36P``<(*```````!39```@P*```````!3<@``@P*```````!
+M3?@``@P*```````!3@0``*(*```````!3CP``@P*```````!3EP``@P*````
+M```!3F@``@\*```````!3G@``@P*```````!3H@``@P*```````!3I@``@P*
+M```````!3JP``@P*```````!3N0``@P*```````!3P0``@P*```````!3Q@`
+M`@P*```````!3R@``@P*```````!3S0``2X*```````!3U```+$*```````!
+M3UP``-L*```````!3[```@\*```````!3\P``@P*```````!3]P``@\*````
+M```!4"@``@P*```````!4%P``;0*```````!4&P``@\*```````!4(0``@P*
+M```````!4)0``;0*```````!4+0``@\*```````!4-```@P*```````!4.``
+M`@\*```````!4/0``@P*```````!42```@\*```````!430``@P*```````!
+M440``@\*```````!45@``@P*```````!47```,P*```````!48P``@P*````
+M```!4;P``0D*```````!4?P``@P*```````!4@@``@\*```````!4A@``@P*
+M```````!4BP``38*```````!4D0``,@*```````!4E```1@*```````!4F``
+M`@\*```````!4G0``@P*```````!4JP``@P*```````!4L```@P*```````!
+M4M0``@P*```````!4OP``9(*```````!5!0``@P*```````!5#```@P*````
+M```!5$0``,`*```````!5%@``*L*```````!5&P``,0*```````!5(@``@P*
+M```````!5/```,<*```````!500``=@*```````!5:P``@\*```````!5<@`
+M`@P*```````!5>@``@\*```````!5@```@\*```````!5A0``@P*```````!
+M5I@``7P*```````!5K@``A<*```````!5OP``@P*```````!5Q```@\*````
+M```!5R```;0*```````!5T0``2X*```````!5V```@\*```````!5YP``;0*
+M```````!5ZP``-<*```````!5\P``@P*```````!6"0``10*```````!6#``
+M`80*```````!6$```@\*```````!6%0``@P*```````!6+```,<*```````!
+M6,0``=@*```````!61P``@\*```````!66```@P*```````!66P``@\*````
+M```!68@``@P*```````!690``@\*```````!6;@``@P*```````!6A0``@`*
+M```````!6I@``@`*```````!7$P``@\*```````!7'P``@P*```````!7)``
+M`@P*```````!7*P``@P*```````!7+0``;0*```````!7-0``@P*```````!
+M7-P``;0*```````!7/```@P*```````!700``@P*```````!77P``7P*````
+M```!7=```@\*```````!7?0``@\*```````!7@@``@\*```````!7AP``@\*
+M```````!7D@``@\*```````!7EP``@P*```````!7O@``@\*```````!7Q0`
+M`@P*```````!7R0``@\*```````!7T```@P*```````!7U```@\*```````!
+M7V0``@P*```````!7[@``@\*```````!7\P``@P*```````!7]P``@\*````
+M```!7_```@P*```````!8`0``4<*```````!8"```@\*```````!8#0``@P*
+M```````!860``@\*```````!870``@P*```````!87P``;0*```````!8:``
+M`,@*```````!8?```@P*```````!8@```@`*```````!8A0``@\*```````!
+M8DP``@\*```````!8NP``@\*```````!8P```.8*```````!8Y0``@P*````
+M```!8Z0``@P*```````!8[```@\*```````!8\```@P*```````!8]0``@P*
+M```````!8^0``@P*```````!8_@``@P*```````!9`P``@P*```````!9.0`
+M`*T*```````!9B```@\*```````!9C@``@\*```````!9DP``@P*```````!
+M9F0``@P*```````!9G@``@P*```````!:%P``@\*```````!:(```@P*````
+M```!:*P``@\*```````!:-P``@P*```````!:.P``(P*```````!:0@``@P*
+M```````!:90``@\*```````!:;```@P*```````!:<```@\*```````!:=P`
+M`@P*```````!:>P``@\*```````!:@@``@P*```````!:A@``@\*```````!
+M:C0``@P*```````!:G```@P*```````!:H```@\*```````!:J```@P*````
+M```!:K```@\*```````!:M```@P*```````!:PP``4$*```````!:S0``@\*
+M```````!:U```@P*```````!:Y0``@\*```````!:[```@P*```````!:\``
+M`@\*```````!:]P``@P*```````!:^P``@\*```````!;````@P*```````!
+M;#0``@\*```````!;%```@P*```````!;'```@P*```````!;28```(&``!7
+MI``!;2H```($``!7I``!;38```($``!7I``!;3X```(&``!7K``!;4(```($
+M``!7K``!;48```($``!7K``!;BP``@\*```````!;D0``@\*```````!;E@`
+M`@P*```````!;F@``@\*```````!;GP``@P*```````!;I```@P*```````!
+M;J0``@P*```````!;K0``@\*```````!;L@``@P*```````!;MP``@P*````
+M```!;NP``@\*```````!;P```@P*```````!;Q0``@P*```````!;R@``@P*
+M```````!;SP``@P*```````!;TP``@\*```````!;V```@P*```````!;W0`
+M`@P*```````!;X@``@P*```````!;YP``@P*```````!;ZP``@\*```````!
+M<=@``@\*```````!<>P``@P*```````!<?P``@\*```````!<A```@P*````
+M```!<C```@P*```````!<D0``@P*```````!<E0``@\*```````!<G```@P*
+M```````!<H0``@P*```````!<I0``@\*```````!<JP``@P*```````!<L``
+M`@P*```````!<M0``@P*```````!<N@``@P*```````!<O@``@\*```````!
+M<Q@``@P*```````!<RP``@P*```````!<T```@P*```````!<U0``@P*````
+M```!<V0``@\*```````!<X0``@P*```````!='```@\*```````!=(P``@P*
+M```````!=)P``@\*```````!=+@``@P*```````!=00``-<*```````!=4P`
+M`9\*```````!=5@``9\*```````!=:(``#X&```````!=:8``#X$```````!
+M=T@``@P*```````!=Y```@P*```````!=\P``@P*```````!>`@``@P*````
+M```!>$0``@P*```````!>&@``@P*```````!>2P``)(*```````!>I@``9(*
+M```````!?LH``#\&```````!?LX``#\$```````!?\```64*```````!@9``
+M`=0*```````!@R```=0*```````!A/(``$$&````!``!A/8``$$$````!``!
+MA0(``$$&````"``!A08``$$$````"``!A2H``$`&````!``!A2X``$`$````
+M!``!A3H``$`&````"``!A3X``$`$````"``!AM0``@P*```````!AT0``@\*
+M```````!B'X``$$&```````!B((``$$$```````!B(X``$`&```````!B)(`
+M`$`$```````!BP@``*T*```````!C!P``-D*```````!C%0``.4*```````!
+MC'```@P*```````!C)@``-D*```````!C.P``.4*```````!C/P``@P*````
+M```!C2@``.4*```````!C3@``@P*```````!C9P``@\*```````!C?P``@P*
+M```````!C@P``@P*```````!CAP``@P*```````!CB@``@\*```````!CD``
+M`@P*```````!CI0``50*```````!CJ0``@\*```````!CNP``@P*```````!
+MCO@``50*```````!CU@``>4*```````!CZ0``90*```````!D.@``9\*````
+M```!D3P``-0*```````!D9P``@P*```````!D;P``@P*```````!D<@``@\*
+M```````!D>0``@P*```````!DX```@P*```````!DZ@``@P*```````!D]@`
+M`@P*```````!E!```@P*```````!E#@``@P*```````!E3X``:<&```````!
+ME4(``:<$```````!E48``*\&```````!E4H``*\$```````!E5H``3X&````
+M```!E5X``3X$```````!E7@``@P*```````!E:0``@P*```````!E;@``@P*
+M```````!E=@``@P*```````!E>@``@P*```````!E?@``@P*```````!E@0`
+M`@\*```````!EA0``@P*```````!EW```@\*```````!EY@``@P*```````!
+ME\@``@P*```````!F`@``@\*```````!F!P``@\*```````!F(@``@P*````
+M```!F)@``A<*```````!F*@``;0*```````!F+P``A<*```````!F1P``@\*
+M```````!F3@``@P*```````!F50``@P*```````!F60``@\*```````!F8P`
+M`@\*```````!F:```@P*```````!F:@``;0*```````!F;@``@\*```````!
+MF<P``@P*```````!F>0``;0*```````!F?```A<*```````!F@@``@\*````
+M```!FAP``@P*```````!FBP``@P*```````!GK```@$*```````!GL0``@P*
+M```````!GM@``@P*```````!GN@``@P*```````!GOP``@P*```````!GQ``
+M`@P*```````!GT0``@P*```````!GU```@$*```````!GV0``@P*```````!
+MGW@``@P*```````!H"```@$*```````!H(0``9\*```````!H60``@P*````
+M```!H7@``@P*```````!H8```*X*```````!H?0``0$*```````!H@@``@P*
+M```````!HAP``@P*```````!HFX```(&``!;#``!HG(```($``!;#``!HJ0`
+M`@\*```````!HLP``@P*```````!HMP``@\*```````!HOP``@P*```````!
+MHPP``@\*```````!HRP``@P*```````!HSP``@\*```````!HUP``@P*````
+M```!HYX```(&``!:J``!HZ(```($``!:J``!H[8```(&``!:L``!H[H```($
+M``!:L``!H\X```(&``!:N``!H](```($``!:N``!H^8```(&``!:P``!H^H`
+M``($``!:P``!H_X```(&``!:R``!I`(```($``!:R``!I!8```(&``!:T``!
+MI!H```($``!:T``!I$```@\*```````!I&@``@P*```````!I'@``@\*````
+M```!I)P``@P*```````!I*P``@\*```````!I-```@P*```````!I.```@\*
+M```````!I00``@P*```````!I10``@\*```````!I3@``@P*```````!I4@`
+M`@\*```````!I6P``@P*```````!I80``@\*```````!I9P``@\*```````!
+MI;```@P*```````!I?H```(&``!:V``!I?X```($``!:V``!IB0``@\*````
+M```!IDP``@P*```````!IHH```(&``!:X``!IHX```($``!:X``!II(```($
+M``!:X``!IL0``@\*```````!INP``@P*```````!IRX```(&``!:[``!IS(`
+M``($``!:[``!IS8```($``!:[``!IY```@\*```````!I[@``@P*```````!
+MJ!```/`*```````!J!@``?`*```````!J"0``5@*```````!J$@``?`*````
+M```!J%0``5@*```````!J&@``@P*```````!J'P``@P*```````!J(0``*X*
+M```````!J)```?`*```````!J)P``5@*```````!J6P``@P*```````!J8``
+M`@P*```````!J90``@P*```````!J:@``@P*```````!J;0``@$*```````!
+MJH@``1T*```````!JKP``1T*```````!JN```9T*```````!JP@``1T*````
+M```!JR0``1T*```````!J]0``9T*```````!J_P``1T*```````!K*```1T*
+M```````!K+```1T*```````!K,```1T*```````!K-```1T*```````!K.``
+M`1T*```````!K.@``?`*```````!K/0``5@*```````!K2@``1T*```````!
+MK3@``1T*```````!K5```1T*```````!K6```1T*```````!K8```1T*````
+M```!K9```1T*```````!K:```1T*```````!K;```1T*```````!K<```1T*
+M```````!K=0``?`*```````!K>```5@*```````!K?P``@P*```````!KA``
+M`@P*```````!KB0``?`*```````!KC```5@*```````!KH@``@P*```````!
+MKIP``@P*```````!KJ@``@$*```````!KM```@\*```````!KN0``@\*````
+M```!L.P``1T*```````!L20``@\*```````!L3@``@\*```````!L4P``@\*
+M```````!LG```@$*```````!LH```@\*```````!LI0``@\*```````!LLP`
+M`@P*```````!LN```@P*```````!LOP``@P*```````!LQ```@P*```````!
+MM/(``$(&```````!M/8``$($```````!M10``@P*```````!M2@``;0*````
+M```!M3X``$,&```````!M4(``$,$```````!M5@``@P*```````!M6P``;0*
+M```````!M8(``$4&```````!M88``$4$```````!M:0``@P*```````!M;@`
+M`;0*```````!MAP``0@*```````!MCX``$P&````Y``!MD(``$P$````Y``!
+MME```*T*```````!MG0``@\*```````!MI@``@P*```````!MK0``*T*````
+M```!MM0``*T*```````!MP@``@P*```````!MR0``@P*```````!MUX```(&
+M``!H"``!MV(```($``!H"``!N2(``$0&```````!N28``$0$```````!N6@`
+M`/8*```````!N8```/8*```````!N8H``$0&```````!N8X``$0$```````!
+MN:@``@P*```````!N;P``;0*```````!N=(``$8&```````!N=8``$8$````
+M```!N>P``@P*```````!N@```;0*```````!NA(``$<&```````!NA8``$<$
+M```````!NC0``@P*```````!ND@``;0*```````!NEH``$@&```````!NEX`
+M`$@$```````!NGP``@P*```````!NI```;0*```````!NJ8``$D&```````!
+MNJH``$D$```````!NO0``/8*```````!NPP``/8*```````!NR0``/8*````
+M```!NSP``/8*```````!NU0``/8*```````!NVP``/8*```````!NW8``$D&
+M```````!NWH``$D$```````!NY0``@P*```````!NZ@``;0*```````!N\(`
+M`$H&```````!N\8``$H$```````!O````/8*```````!O!@``/8*```````!
+MO&```/8*```````!O'@``/8*```````!O)```/8*```````!O)H``$H&````
+M```!O)X``$H$```````!O+@``@P*```````!O,P``;0*```````!OH@``9\*
+M```````!P@0``=0*```````!P]0``=0*```````!Q`@``0(*```````!Q"``
+M`0(*```````!Q%(``%,&```````!Q%8``%,$```````!Q&(``%,$```````!
+MQ'X``%,&```````!Q((``%,$```````!Q+```4P*```````!Q,P``4P*````
+M```!Q.X``%$&```````!Q/(``%$$```````!Q/H``$L&```````!Q/X``$L$
+M```````!Q08``$X&```````!Q0H``$X$```````!Q1(``$T&```````!Q18`
+M`$T$```````!Q1X``$\&```````!Q2(``$\$```````!Q2H``%`&```````!
+MQ2X``%`$```````!Q38``%(&```````!Q3H``%($```````!Q4(``%0&````
+M```!Q48``%0$```````!Q:(``%4&```````!Q:8``%4$```````!Q<0``@P*
+M```````!Q=@``;0*```````!Q>X``%8&```````!Q?(``%8$```````!Q@@`
+M`@P*```````!QAP``;0*```````!QC(``%<&```````!QC8``%<$```````!
+MQE0``@P*```````!QF@``;0*```````!QWP``*T*```````!QY```@\*````
+M```!Q[0``@P*```````!R"```*T*```````!R(0``*T*```````!R.```*T*
+M```````!R3P``*T*```````!R4P``*T*```````!R7P``@P*```````!R9``
+M`@P*```````!R=(```(&``!T+``!R=8```($``!T+``!RW8``%@&```````!
+MRWH``%@$```````!RYX``%D&```````!RZ(``%D$```````!R\X``%H&````
+M```!R](``%H$```````!R_X``%L&```````!S`(``%L$```````!S$```/8*
+M```````!S%@``/8*```````!S'```/8*```````!S)@``/8*```````!S+0`
+M`/8*```````!S-```/8*```````!S.P``/8*```````!S0@``/8*```````!
+MS20``/8*```````!S4P``/8*```````!S7P``/8*```````!S90``/8*````
+M```!S?0``/8*```````!S@P``/8*```````!SB0``/8*```````!SCP``/8*
+M```````!SF0``/8*```````!SGP``/8*```````!SI0``/8*```````!SJP`
+M`/8*```````!SL0``/8*```````!SLX``%P&```````!SM(``%P$```````!
+MSR```/8*```````!SS@``/8*```````!SX0``/8*```````!SYP``/8*````
+M```!SZ8``%@&```````!SZH``%@$```````!S\```@P*```````!S]0``;0*
+M```````!S^8``%D&```````!S^H``%D$```````!T`0``@P*```````!T!@`
+M`;0*```````!T"H``%H&```````!T"X``%H$```````!T$@``@P*```````!
+MT%P``;0*```````!T&X``%L&```````!T'(``%L$```````!T(P``@P*````
+M```!T*```;0*```````!T+8``%P&```````!T+H``%P$```````!T-0``@P*
+M```````!T.@``;0*```````!TWP``64*```````!TY```64*```````!T^0`
+M`64*```````!T_@``64*```````!U#```64*```````!U%0``64*```````!
+MU&@``64*```````!U*0``64*```````!VY0``0(*```````!VZP``0(*````
+M```!WX@``4P*```````!WZ0``4P*```````!W\X``&(&```````!W](``&($
+M```````!W]H``%T&```````!W]X``%T$```````!W^8``%\&```````!W^H`
+M`%\$```````!W_(``%X&```````!W_8``%X$```````!W_X``&`&```````!
+MX`(``&`$```````!X`H``&$&```````!X`X``&$$```````!X!8``&,&````
+M```!X!H``&,$```````!X"(``)\&```````!X"8``)\$```````!X((``&0&
+M```````!X(8``&0$```````!X*0``@P*```````!X+@``;0*```````!X,X`
+M`&4&```````!X-(``&4$```````!X.@``@P*```````!X/P``;0*```````!
+MX1(``&8&```````!X18``&8$```````!X30``@P*```````!X4@``;0*````
+M```!XEP``*T*```````!XG```@\*```````!XI0``@P*```````!XP```*T*
+M```````!XV0``*T*```````!X\```*T*```````!Y!P``*T*```````!Y"P`
+M`*T*```````!Y%P``@P*```````!Y'```@P*```````!Y3(``&<&```````!
+MY38``&<$```````!Y5H``&@&```````!Y5X``&@$```````!Y8H``&D&````
+M```!Y8X``&D$```````!Y;H``&H&```````!Y;X``&H$```````!Y?P``/8*
+M```````!YA0``/8*```````!YAX``&L&```````!YB(``&L$```````!YE(`
+M`&<&```````!YE8``&<$```````!YFP``@P*```````!YH```;0*```````!
+MYI(``&@&```````!YI8``&@$```````!YK```@P*```````!YL0``;0*````
+M```!YM8``&D&```````!YMH``&D$```````!YO0``@P*```````!YP@``;0*
+M```````!YQH``&H&```````!YQX``&H$```````!YS@``@P*```````!YTP`
+M`;0*```````!YV(``&L&```````!YV8``&L$```````!YX```@P*```````!
+MYY0``;0*```````!Y^H```(&``"`+``!Y^X```($``"`+``!\`P``@\*````
+M```!\$0``@\*```````!\&@``@P*```````!\-```@P*```````!\20``@P*
+M```````!\7@``0(*```````!\9```0(*```````!\:@``0(*```````!]9@`
+M`4P*```````!];0``4P*```````!]<@``4P*```````!]>H``'$&```````!
+M]>X``'$$```````!]?8``&P&```````!]?H``&P$```````!]@(``&\&````
+M```!]@8``&\$```````!]@X``&T&```````!]A(``&T$```````!]AH``&X&
+M```````!]AX``&X$```````!]B8``'`&```````!]BH``'`$```````!]C(`
+M`'(&```````!]C8``'($```````!]CX``)\&```````!]D(``)\$```````!
+M]IX``',&```````!]J(``',$```````!]L```@P*```````!]M0``;0*````
+M```!]NH``'0&```````!]NX``'0$```````!]P0``@P*```````!]Q@``;0*
+M```````!]RX``'4&```````!]S(``'4$```````!]U```@P*```````!]V0`
+M`;0*```````!^'@``*T*```````!^(P``@\*```````!^+```@P*```````!
+M^1P``*T*```````!^A@``*T*```````!^B@``*T*```````!^E@``@P*````
+M```!^FP``@P*```````!^[H``'8&```````!^[X``'8$```````!^^(``'<&
+M```````!^^8``'<$```````!_!(``'@&```````!_!8``'@$```````!_$(`
+M`'D&```````!_$8``'D$```````!_)0``/8*```````!_*P``/8*```````!
+M_,0``/8*```````!_/```*T*```````!_20``/8*```````!_3P``/8*````
+M```!_48``'H&```````!_4H``'H$```````!_7H``'8&```````!_7X``'8$
+M```````!_90``@P*```````!_:@``;0*```````!_;H``'<&```````!_;X`
+M`'<$```````!_=@``@P*```````!_>P``;0*```````!_?X``'@&```````!
+M_@(``'@$```````!_AP``@P*```````!_C```;0*```````!_D(``'D&````
+M```!_D8``'D$```````!_F```@P*```````!_G0``;0*```````!_HH``'H&
+M```````!_HX``'H$```````!_J@``@P*```````!_KP``;0*```````!_Q8`
+M``(&``".%``!_QH```($``".%``"!S@``@\*```````"!W```@\*```````"
+M!Y0``@P*```````"!_P``@P*```````""%```@P*```````""*0``0(*````
+M```""+P``0(*```````""-0``0(*```````"#,0``4P*```````"#.```4P*
+M```````"#/0``4P*```````"#18``(`&```````"#1H``(`$```````"#2(`
+M`'L&```````"#28``'L$```````"#2X``'X&```````"#3(``'X$```````"
+M#3H``'P&```````"#3X``'P$```````"#48``'T&```````"#4H``'T$````
+M```"#5(``'\&```````"#58``'\$```````"#5X``($&```````"#6(``($$
+M```````"#6H``)\&```````"#6X``)\$``````````@```$:```)%`````P`
+M``$:```*3````!````$:```*4````!0```$:```*5````!@```$:```)+```
+M`!P```$:```*7````"````$:```)2````"0```$:```)5````"@```$:```*
+MH````"P```$:```)9````#````$:```)=````#0```$:```)N````#@```$:
+M```)E````#P```$:```)I````$````$:```)N````$0```$:```)T````$@`
+M``$:```*P````$P```$:```*Q````%````$:```*'````%0```$:```*+```
+M`%@```$:```*F````%P```$:```*0````&````$:```*H````&0```$:```*
+M5````&@```$:```*9````&P```$:```*=````'````$:```*Z````'0```$:
+M```*[````'@```$:```*N````'P```$:```*]````(````$:```*R````(0`
+M``$:```*_````(@```$:```+`````(P```$:```+!````)````$:```*^```
+M`5```8L!`````````50``.,!`````````5@``3\!`````````5P``3(!````
+M`````6```?D!`````````60``5(!`````````6@``-(!`````````6P``5X!
+M`````````7```1\!`````````70``?8!`````````7@``<D!`````````7P`
+M`3P!`````````8```+P!`````````80``0,!`````````8@``-4!````````
+M`8P``)X!`````````9```><!`````````90``A(!`````````9@``*P!````
+M`````9P``0L!`````````:```<8!`````````:0``*<!`````````:@``+H!
+M`````````:P``.<!`````````;```?T!`````````;0``?@!`````````;@`
+M`9@!`````````;P``3,!`````````<```=X!`````````<0``>$!````````
+M`<@``8@!`````````<P``5L!`````````=```;L!`````````=0``0\!````
+M`````=@``?$!`````````=P``3T!`````````>```34!`````````>0``00!
+M`````````>@``2T!`````````>P``-,!`````````?```48!`````````?0`
+M`;<!`````````?@``8T!`````````?P``2,!`````````@```;(!````````
+M`@0``6@!`````````@@``=L!`````````@P``<L!`````````A```:H!````
+M`````A0``+`!`````````A@``30!`````````AP``=D!`````````B```9H!
+M`````````B0``:,!`````````B@``+L!`````````BP``/,!`````````C``
+M`<,!`````````C0``6,!`````````C@``,T!`````````CP``+0!````````
+M`D```0H!`````````D0``(8!`````````D@``70!`````````DP``;P!````
+M`````E```;,!`````````E0``74!`````````E@``?X!`````````EP``.@!
+M`````````F```(@!`````````F0``>,!`````````F@``2L!`````````FP`
+M`8X!`````````G```9<!`````````G0``>T!`````````G@``;$!````````
+M`GP``24!`````````H```,,!`````````H0``:P!`````````H@``)$!````
+M`````HP``3H!`````````I```.X!`````````I0``7<!`````````I@``7D!
+M`````````IP``=`!`````````J```>(!`````````J0``?P!`````````J@`
+M`(T!`````````JP``<T!`````````K```:$!`````````K0``8H!````````
+M`K@``2`!`````````KP``<X!`````````L```!@!`````````L0``A`!````
+M`````L@``:D!`````````M```=D!`````````M0``9H!`````````M@``:,!
+M`````````MP``+L!`````````N```/,!`````````N0``!D!````````&6``
+M`<0!````````&60``>0!````````&6@``=8!````````&6P``?L!````````
+M&7```.(!````````&70``/0!````````&7@``1(!````````&7P``.L!````
+M````&8```(L!````````&80``+,!````````&8@``.`!````````&8P``.$!
+M````````&9```+<!````````&90``>H!````````&9@``8P!````````&9P`
+M`@8!````````&:```0`!````````&:0``?0!````````&:@``8$!````````
+M&:P``2D!````````&;```:8!````````&;0``*`!````````&;@``88!````
+M````&;P``)<!````````&<```>8!````````&<0``68!````````&<@``)T!
+M````````&<P``*@!````````&=```2P!````````&=0``?H!````````&=@`
+M`>@!````````&=P``?4!````````&>```;@!````````&>0``7$!````````
+M&>@``7X!````````&>P``6T!````````&?```9$!````````&?0``/P!````
+M````&?@``1<!````````&?P``/(!````````&@```<@!````````&@0``1X!
+M````````&@@``+X!````````&@P``;D!````````&A```;4!````````&A0`
+M`/@!````````&A@``+@!````````&AP``<P!````````&B```5P!````````
+M&B0``:T!````````&B@``6(!````````&BP``4(!````````&C```6$!````
+M````&C0``<`!````````&C@``4T!````````&CP``+4!````````&D```-\!
+M````````&D0``5<!````````&D@``<4!````````&DP``=,!````````&E``
+M`:4!````````&E0``)H!````````&E@``-H!````````&EP``:\!````````
+M&F```A$!````````&F0``,8!````````&F@``1D!````````&FP``=\!````
+M````&G```5,!````````&G0``8,!````````&G@``)P!````````&GP``7H!
+M````````&H```+8!````````&H0``7\!````````&H@``6H!````````&HP`
+M`0P!````````&I```*4!````````&I0``,X!````````&I@``1$!````````
+M&IP``5H!````````&J```4H!````````&J0``=4!````````&J@``4D!````
+M````&JP``=`!````````&K```@T!````````&K0``(4!````````&K@``2$!
+M````````&KP``.\!````````&L```.D!````````&L0``6X!````````&L@`
+M`7(!````````&LP``84!````````&M```"`!````````&M0``:L!````````
+M&M@``<<!````````&N```4(!````````&N0``6$!````````&N@``<`!````
+M````&NP``4T!````````&O```+4!````````&O0``"$!````````.60```$:
+M``#KQ```.6@```$:``#KR```.6P```$:``#KZ```.7````$:``#K[```.70`
+M``$:``#L#```.7@```$:``#L$```.7P```$:``#L,```.8````$:``#L-```
+M.M```-D!````````.M0``/\!````````.M@``?(!````````.MP``.H!````
+M````.N```,(!````````.N0``58!````````.N@``3<!````````.NP``9L!
+M````````.O```2H!````````.O0``-$!````````.O@``1P!````````.OP`
+M`-0!````````.P```8(!````````.P0``=T!````````.P@``0D!````````
+M.PP``7T!````````.Q```60!````````.Q0``A<!````````.Q@``@L!````
+M````.QP``3@!````````.R```/L!````````.R0``:(!````````.R@``*8!
+M````````.RP``=P!````````.S```=$!````````.S0``04!````````.S@`
+M`>`!````````.SP``-T!````````.T```;X!````````.T0``8`!````````
+M.T@``7L!````````.TP``)`!````````.U```>L!````````.U0``/D!````
+M````.U@``5\!````````.UP``?`!````````.V```5@!````````.V0``14!
+M````````.V@``;`!````````.VP``7@!````````.W```(X!````````.W0`
+M`1L!````````.W@``(<!````````.WP``18!````````.X```;T!````````
+M.X0``2\!````````.X@``6<!````````.XP``+T!````````.Y```9X!````
+M````.Y0``2(!````````.Y@``3`!````````.YP``98!````````.Z```,L!
+M````````.Z0``<$!````````.Z@``<\!````````.ZP``9,!````````.[``
+M`A,!````````.[0``,<!````````.[@``44!````````.[P``2<!````````
+M.\```@$!````````.\0``,H!````````.\@``0T!````````.\P``@4!````
+M````.]```28!````````.]0``4L!````````.]@``,`!````````.]P``,D!
+M````````.^```*L!````````.^0``+\!````````.^@``+D!````````.^P`
+M`6D!````````._```,0!````````._0``/X!````````._@``+(!````````
+M._P``+$!````````/````)8!````````/`0``/$!````````/`@``78!````
+M````/`P``.P!````````/!```:0!````````/!0``@`!````````/!@``4\!
+M````````/!P``=`!````````/"```1`!````````/"0``@X!````````/"@`
+M`8\!````````/"P``5`!````````/#```*$!````````/#0``?,!````````
+M/#@``.T!````````/#P``50!````````/$```40!````````/$0``6L!````
+M````/$@``@D!````````/%```98!````````/%0``,L!````````/%@``<$!
+M````````/%P``<\!````````/&```9,!````````/&0``A0!````````/&P`
+M`#,!````````3:````$:``$B1```3:0```$:``$B````3:@```$:``$B#```
+M3:P```$:``$BD```3;````$:``$B+```3;0```$:``$BD```3@0```$:``$Z
+ME```3@@```$:``$X'```3@P```$:``$X8```3A````$:``$XB```3A0```$:
+M``$ZI```3A@```$:``$X[```3AP```$:``$ZK```3B````$:``$ZL```3B0`
+M``$:``$ZM```3B@```$:``$ZN```3BP```$:``$ZO```3C````$:``$Y-```
+M3C0```$:``$ZQ```3C@```$:``$ZR```3CP```$:``$ZS```3D````$:``$Z
+MT```3D0```$:``$Y4```3D@```$:``$Y<```3DP```$:``$ZW```3E````$:
+M``$YQ```3E0```$:``$Y[```3E@```$:``$ZZ```3EP```$:``$Y````3F``
+M``$:``$Z\```3F0```$:``$Z]```3F@```$:``$Z^```3FP```$:``$Z3```
+M3G````$:``$Z7```3G0```$:``$[!```3G@```$:``$Z<```3GP```$:``$Z
+MC```3H````$:``$ZD```3H0```$:``$Z;```3H@```$:``$Z>```3HP```$:
+M``$ZA```3I````$:``$ZD```3I0```$:``$ZG```3K0```$:``$\F```3K@`
+M``$:``$\G```3KP```$:``$[$```3L````$:``$[-```3L0```$:``$\J```
+M3L@```$:``$[@```3LP```$:``$\L```3M````$:``$\M```3M0```$:``$\
+MN```3M@```$:``$\O```3MP```$:``$\P```3N````$:``$[Q```3N0```$:
+M``$\R```3N@```$:``$\S```3NP```$:``$\T```3O````$:``$\U```3O0`
+M``$:``$[\```3O@```$:``$\W```3OP```$:``$\X```3P````$:``$\#```
+M3P0```$:``$\M```3P@```$:``$\[```3PP```$:``$\\```3Q````$:``$\
+M]```3Q0```$:``$\^```3Q@```$:``$\_```3QP```$:``$\3```3R````$:
+M``$\4```3R0```$:``$]"```3R@```$:``$\K```6PP```$:``&HK```6Q``
+M``$:``&BC```6Q0```$:``&CI```6Q@```$:``&F!```6QP```$:``&FF```
+M6R````$:``&G0```6R0```$:``&H$```:`@```$:``&WI```:`P```$:``&W
+M?```:!````$:``&WB```:!0```$:``&WE```:!@```$:``&WL```:!P```$:
+M``&WM```:"````$:``&WJ```:"0```$:``&WM```="P```$:``'*#```=#``
+M``$:``'*%```=#0```$:``')]```=#@```$:``'*````=#P```$:``'*'```
+M=$````$:``'*(```=$0```$:``'*%```=$@```$:``'*(```@"P```$:``'H
+M)```@#````$:``'H+```@#0```$:``'H#```@#@```$:``'H&```@#P```$:
+M``'H-```@$````$:``'H.```@$0```$:``'H+```@$@```$:``'H.```CA0`
+M``$:``'_4```CA@```$:``'_6```CAP```$:``'_.```CB````$:``'_1```
+MCB0```$:``'_8```CB@```$:``'_9```CBP```$:``'_6```CC````$:``'_
+M9`````P```,!`````````!````,!````"````!0```,!````$````!@```,!
+M````&````!P```,!````(````"````,!````*````"0```,!````,````"@`
+'``,!````.```
+`
+end
diff --git a/sys/contrib/dev/ath/public/powerpc-be-elf.inc b/sys/contrib/dev/ath/public/powerpc-be-elf.inc
new file mode 100644
index 0000000..e914738
--- /dev/null
+++ b/sys/contrib/dev/ath/public/powerpc-be-elf.inc
@@ -0,0 +1,72 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/powerpc-be-elf.inc#2 $
+#
+
+#
+# Compilation configuration for building big-endian PowerPC/powerpc-elf.
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=powerpc-elf
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/powerpc-elf-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -mbig-endian
+COPTS+= -msoft-float -ffixed-r2
diff --git a/sys/contrib/dev/ath/public/powerpc-be-elf.opt_ah.h b/sys/contrib/dev/ath/public/powerpc-be-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/powerpc-be-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/powerpc-le-eabi.hal.o.uu b/sys/contrib/dev/ath/public/powerpc-le-eabi.hal.o.uu
new file mode 100644
index 0000000..f9fcc02
--- /dev/null
+++ b/sys/contrib/dev/ath/public/powerpc-le-eabi.hal.o.uu
@@ -0,0 +1,5483 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/powerpc-le-eabi.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$!`0````````````$`%``!``````````````"T`0,``````#0`````
+M`"@`#0`*````(#U$`"DY6``#+"P!@D%@`(%!&P`#+#``@4$:``,L"`&`0!(`
+M`RP8`(%!$0`#+-0`@$`'``,LP`""0?@``$@3``,L8```2%(``RS$`()!%`"!
+M00``(#U8`"DY'``#+)```$A7``,LJ`""0<@``$@'$0,LA`""030`@4$``"`]
+M;``I.9$``RRP`()!%`"!07K_`S@!```HG`"!08```$@4$`,LA`""08P``$@3
+M$0,L>`""01``@4$2$0,L2`""070``$@````X$_``8```(#V``"DY```#?&``
+M@D$````X&_$`8```(#V4`"DY```#?$@`@D%```!(```@/:@`*3DX``!(```@
+M/;@`*3DL``!(```@/<@`*3D@``!(```@/=P`*3D4``!(```@/?``*3D(``!(
+M```@.7A+(WT@`(!.^/\AE*8""'P,``&0C!9@:```("$4`0E\)Z=I:```:2$4
+M22M]>4L+?!``@D`````XMQ`#+!``@D!X(X-\A?[_2W@;8'QX`P-\#``!@*8#
+M"'P(`"$X(`"`3OC_(92F`@A\#``!D`<"`RRT`()!.`"!01(``RP8`(%!$0`#
+M+)@`@$`'``,LF`""09P``$@3``,L?`""0>;_`S@"```HB`"!06@``$@3$0,L
+M9`""020`@4$'$0,L:`""00P`@4$4$`,L1```2!(1`RQ,`()!6```2````#@;
+M\0!@```#?#@`@D$8`(%!````.!/P`&````-\'`""03```$@````X&?\`8```
+M`WP@`*)`$P!@.`$``$@@``!(`0``2!@``$@!``!($```2```8#@!```X```'
+MD````RP\`()!R`$#H`@``[#*`0.@"@`#L,P!`X`<``.0T`$#H"```[#2`0.@
+M(@`#L-0!`Z`D``.PU@$#H"8``[`,``&`I@,(?`@`(3@@`(!.V`&#D`$`8#@@
+M`(!.V/\AE*8""'P4`&&3&`"!DQP`H9,@`,&3)`#ADRP``9!X&WM\>".<?'@K
+MO7QX,]Y\``#@.WC;8W]XXX1_`0``2#CH8WP!```X`/`#?!P`@D$*`&`X`0``
+M2`$`_SOG`Q\LU/^!0````#AX`P-\+``!@*8#"'P4`&&#&`"!@QP`H8,@`,&#
+M)`#A@R@`(3@@`(!.``!@.0```#A`(`!\(`"`0#P(`%3^!VE4>$L`?'[X8U0!
+M`&LY0"`+?.C_@$%X`P-\(`"`3G@;:GP,`"8=%"(I?28`::$``&`X```++"``
+M@DT,`"8=%"(I?24`"8@"```L9`""01``@4$````L'`""08`!`$@#```L#`&"
+M000``"PT`8)!;`$`2,``0#D```<L'`""00P`)AT4(BE]*0`)B````"P(`()!
+M8`!`.3@8H%3H`P`<EEL`?!0":GP*`&,X-`$`2#02*H$```DL0`""00(`":@`
+M```L-`"@0#8@8%5B$"`]TTTI819(`'R^T0E4.!B@5!1*H'P5`*4XEDNE?#8@
+MJ520`&DX[```2#02:H````,L0`""00(``Z``0`EP-`""03@88%5B$"`]TTTI
+M819(`'R^T0E4.!B@5!1*H'P5`*4XEDNE?#@8J51(`&DXI```2#H08%5B$"`]
+MTTTI819(`'R^T0E4.!B@5!1*H'P5`*4XEDNE?#H0J50D`&DX=```2#@88%5B
+M$"`]TTTI819(`'R^T0E4.!B@5!1*H'P5`*4XEDNE?#H0J506`&DX1```2#H0
+M8%5B$"`]TTTI819(`'R^T0E4.!B@5!1*H'P5`*4XEDNE?#H0I52]`&4XYP,+
+M*!``@4!<`&4X"```2```8#@^!&-4(`"`3@(`!*`"`&`X(``)<"``@DP"``2@
+MT```<`,`8#C````L(`""30(`!*#0``!P!`!@.-```"P@`()-`@`$H`$`8#@0
+M``EP(`""3`(`!*``"`EP)@!@?/X?8U30`&-\N`=C5`4`8S@@`(!.Z/\AE*8"
+M"'P0`,&3%`#ADQP``9!X&V!\>".>?'@KOWR``*EP'`""00X`8#BT"00L/`&"
+M0;,)!"A@`(%```$`2``!JW!``*)!`0``2````RP0`()!L^P>.#```"B``(%`
+M0`'@<]```'S^#P!4B!,^(0``(#D422E].4@+?+@`@D#8``!(#@!@.+0)!"S@
+M`()!LPD$*"0`@4&9]CXY9F8`/&=F`&"6``E\<`X`?'#^*7U0`&E\N```2(<3
+M!"B<`*%!>`,#?`$``$@```,L8`""0;/L'C@P```H5`"!00H`/AW,S&`]S<QK
+M8198'GR^\`!4!0``'%#P`'P"```L%`"B0/__*3T-/VDX%E@#?!@``$C__RD]
+M"#]I.,S,`#S-S`!@%@`#?+[P`U1$``!()!,>*`P`@4!@\#XY)```2##V/CG,
+MS``\S<P`8!8`*7T^X2E5#P!I.!@``$AX[#XYS,P`/,W,`&`6`"E]OO`C51P`
+M`8"F`PA\$`#!@Q0`X8,8`"$X(`"`3NC_(92F`@A\%`#ADQP``9!X(Y]\-!*#
+M@!8`'QP```0L&`""00$``$@``"`]```I.:X8"7S6`1]\>`,#?!P``8"F`PA\
+M%`#A@Q@`(3@@`(!.Z/\AE*8""'P4`.&3'``!D'@CGWPT$H.`+KH`/*.+`&`6
+M`!]\/N$`5```!"P8`()!`0``2```(#T``"DYKA@)?)8#'WQX`P-\'``!@*8#
+M"'P4`.&#&``A."``@$[8_R&4I@((?!0`89,8`(&3'`"ADR``P9,D`.&3+``!
+MD'@;>WQX(Y]\!``$B````"RH`()```#`.___`#@4\C]]!``)F`$`WCL?`!XL
+M\/^!0```P#L``!^````>?'P`@$`,`+X?%/J]?R``O3L(`#V)"P"=BQ1*?WT$
+M`,N;"0`=B'@#*7T42C]]!`#)FSX$G%=XVV-_>/OD?PX`H#AXXX9_``#@.`$`
+M`$@,`'VP>-MC?WC[Y'\.`*`X>..&?P$`X#@!``!(#@!]L`$`WCL``!^````>
+M?(S_@$$L``&`I@,(?!0`88,8`(&#'`"A@R``P8,D`.&#*``A."``@$[@`6,Y
+M(@`$*(P!@4$``"`]"``I.3H0@%0N``E\%$H`?*8#"7P@!(!."`(#H%P!`$@`
+M``N```$)="8``'S^'P!46`$`2`H`"Z!``0!("``+H#@!`$@``"N!_G\I53``
+M`$@```N``0`+="8`('W^'RE5T``I?00!`$@``"N!_O<I50P``$@``"N!_N\I
+M5=``*7WD``!(```K@?[G*57P__]+^`$#@.0``$@!``4L)`""00```#@!``4H
+MX`"`00(`!2P8`()!`P`%+!@`HD&0``!(_`$#J+0``$C^`0.@K```2``"`X"D
+M``!(```K@?YW*56<__]+```K@?YO*560__]+```K@?['*56$__]+```K@?Y?
+M*55X__]+```K@?Y7*55L__]+`0`%+"0`@D$!``4H$`"`00(`!2P<`*)!(```
+M2```*X'^3RE51/__2TP2`X`8``!(2!(#H#```$@-```X.```2&@2`X!P_@M\
+M>`)I?5!8*7UP_BE]M@<I50T`"3@8``!(%``+@```!I`````X"```2`P``#AX
+M`P-\(`"`3AD`!"P\`()!&0`$*!``@4$/``0L%`""06```$@>``0L4`""050`
+M`$@#``4L3`"B0`0`!BA$`(%!``+#D"0``$@!``4L$`""00(`!2P<`()!*```
+M2/__)C$0,0E\3!(#D`$`8#@@`(!.2!+#L/3__TMH$L.0[/__2P``!RP,`()!
+M#```.```!Y```&`X(`"`3MC_(92F`@A\"``!DPP`(9,0`$&3%`!ADQ@`@9,<
+M`*&3(`#!DR0`X9,L``&0>!M[?'@CF7QX*[A\>#/>?'@KO7P``$`[!P`&*'``
+M@4`Z$$!7%,H@?2X"^7\"`(FC'H#@5WCC`'P``!V0!`"]._S_WCMXVV-_>/OD
+M?P$``$@``'V0!`"].P0`_SO\_]X[$.`_?0``(#D422E]`P`>(!`!`'S0``!\
+M.0`K?<C_@D`!`%H[!P`>*)C_@4%0Z'A\+``!@*8#"'P(``&##``A@Q``08,4
+M`&&#&`"!@QP`H8,@`,&#)`#A@R@`(3@@`(!.Z/\AE*8""'P4`.&3'``!D'A#
+M'WT-``0L.`""01``@4$```0L'`""09```$@=``0L.`""01X`!"Q$`()!?```
+M2,@!`S@```>0$```."@``$AX*Z1\``"G@```R("Y_O]+``!_D$P``$A0$@,X
+M```'D!@``#@``!^0.```2```!BP<`()`!```.```")```">!!`(#@```"9`8
+M``!(````.`0`!BP8`*)````%@`0"`Y`!```X"```2````#AX`P-\'``!@*8#
+M"'P4`.&#&``A."``@$X$``2```!@.````"P@`()-```%@```!)`$``6`"``$
+MD`@`!8`,``20#``%@!``!)`0``6`__\`+!0`@D'_```H$`"!0/\``#@(``!(
+M`@``.!0`!)`4``6`__\`+#@`@D%X`PE\``0`*`@`@4``!"`Y`0``.!@`!)!`
+M2`!\(`"`0#P(`%0!``!@0$@`?/3_@$$(``!(%``%@!@`!)`8``6`__\`+#@`
+M@D%X`PE\``0`*`@`@4``!"`Y`0``.!P`!)!`2`!\(`"`0#P(`%0!``!@0$@`
+M?/3_@$$(``!(_P,`.!P`!)`<``6@>0,)?!0`@D$/``DH$`"!0`\``#@(``!(
+M"@``."``!+`>``6@>0,)?!0`@D$/``DH$`"!0`\``#@(``!("@``."(`!+`@
+M``6`)``$D"0`!8`H``20*``%@"P`!)`L``6`,``$D`0`!8`$```L%`"B0`0`
+M!(`!```L"`"B0#@`!)`!`&`X(`"`3@0`!8```&`X````+"``@DT,``6`"``$
+MD```!8````20"``%@`0`!)`,``6`"``$D!``!8`,``20%``%@!``!)`8``6`
+M%``$D!P`!8`8``20(``%H!P`!+`B``6@'@`$L"0`!8`@``20*``%@"0`!)`L
+M``6`*``$D#``!8`L``20`0!@."``@$[H_R&4I@((?`P`H9,0`,&3%`#ADQP`
+M`9!X&WY\>".=?`$``$AX&W]\``!@.```'RQ<`()!%@`?J````"Q``*)`>//#
+M?WCKI'\!``!(/`A]5,`!'H"F`PE\>//#?WC[Y'\A!(!.```@/0``*3DN2AU\
+M%`)C?#0'8WP4``!(%@`?H!@`/Z$42@!\-`<#?!P``8"F`PA\#`"A@Q``P8,4
+M`.&#&``A."``@$[(_R&4I@((?`P`H9(0`,&2%`#ADA@``9,<`"&3(`!!DR0`
+M89,H`(&3+`"ADS``P9,T`.&3/``!D'@;?'P``,`Z``"@.@```#L``"`[``#`
+M.S`2`X!``!Y\Y`"`0```(#T``.DZ,C#)5Q1*/'TP`ND[%@"_HP"`H'.T`*)!
+M>..#?WC[Y'\!``!(>!M[?#P(8%0N`E=_%-*]?\`!'("F`PE\>..#?WC[Y'\A
+M!(!.%.IC?#0'8WP"`!^@``$)<#@`@D$`P`-\:`"@0'@;>'S``7R!I@-I?7CC
+M@W]X^^1_(02`3A8`'Z`4`F-\4-!C?#0'>7P\``!(`+`#?#0`H$!X&W9\/`A]
+M5\`!'("F`PE\>..#?WC[Y'\A!(!.%@`?H!0"8WPNNAU\4``#?#0'%7P!`-X[
+M,!(<@$``'GPL_X!!``#`.S(PR5<42CQ],`+I.Q8`'Z@````L,`"@0,`!'("F
+M`PE\>..#?WC[Y'\A!(!.`@`?H!3*(WT``0MP"`""0!2J(WT8`#^Q`0#>.S\`
+M'BRT_X%`/``!@*8#"'P,`*&"$`#!@A0`X8(8``&#'``A@R``08,D`&&#*`"!
+M@RP`H8,P`,&#-`#A@S@`(3@@`(!.```#H```(#T```DY`3``*`P`@4```"`]
+M```).0``8#GK44`]'X5*83P(8%4N`@A\UBD@?60``"#6(0!\%`(I?990"7QP
+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
+M```X```#+$`%@D$(``&@_@8`5`P`';`(``&@?MX`5`0`';`(``&@/J,`5#P`
+M';!X\\1_`0`>.#X$'E2@`1R`I@,)?'CC@W\(`*$X(02`3@```#@```,L\`2"
+M00@``:"^!@!4%``=L`@``:`^UP!41``=L`@``:"^L@!4'``=L'CSQ'\!`!XX
+M/@0>5*`!'("F`PE\>..#?P@`H3@A!(!.````.````RR@!()!"``!H#X'`%1,
+M`!VP"``!H+[F`%0D`!VP`@`=H`$``"@4`:%`"``!H/ZV`%0.`!VP"``!H/Z+
+M`%0&`!VP>//$?P$`'C@^!!Y4H`$<@*8#"7QXXX-_"`"A."$$@$X````X```#
+M+#@$@D$(`"&A?`XI508`':!X2P!\!@`=L`@``:`^UP!4/@`=L`@``:"^L@!4
+M%@`=L'CSQ'\!`!XX/@0>5*`!'("F`PE\>..#?P@`H3@A!(!.````.````RS@
+M`X)!"``!H#X'`%1&`!VP"``!H+[F`%0>`!VP"``!H#ZW`%1.`!VP"``!H+Z3
+M`%0F`!VP>//$?P$`'C@^!!Y4H`$<@*8#"7QXXX-_"`"A."$$@$X````X```#
+M+(0#@D$(`"&ANA8I528`':!X2P!\)@`=L&@``$@"`!V@`0``+%P`HD`(``&@
+M/K<`5%0`';`(``&@OI,`5"P`';!X\\1_`0`>.#X$'E2@`1R`I@,)?'CC@W\(
+M`*$X(02`3@```#@```,L'`."00@`(:&Z%BE5+``=H'A+`'PL`!VP`@`=H`(`
+M`"C4`*%`"``!H/[F`%00`!VP"``!H'ZZ`%0(`!VP>//$?P$`'C@^!!Y4H`$<
+M@*8#"7QXXX-_"`"A."$$@$X````X```#++@"@D$(``&@/@<`5$``';`(``&@
+MON8`5!@`';`(``&@/K<`5$@`';`(``&@OI,`5"``';!X\\1_`0`>.#X$'E2@
+M`1R`I@,)?'CC@W\(`*$X(02`3@```#@```,L7`*"00@`(:&Z%BE5(``=H'A+
+M`'P@`!VP"``!H#[G`%10`!VP"``!H+[&`%0H`!VP*```2`(`':`"```L'`"B
+M0`@``:`^YP!45@`=L`@``:"^Q@!4+@`=L`(`':`#```H@`&A0`@``:"^DP!4
+M$@`=L'CSQ'\!`!XX/@0>5*`!'("F`PE\>..#?P@`H3@A!(!.````.````RS$
+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
+M(YU\``!`.P``':#_/P`H$`"!0"0`/:&K_\D[(```2```':`",,`C$/'>?[CS
+MWG^P_P`X.`#>?U`!WCL!`!HL-`""01``@4$``!HL%`"B060``$@"`!HL/`"B
+M05@``$A5`-X["```.]P$_3O:!#T[3```2!H`':`````LM`&B064`WCL"```[
+M3@7].TP%/3LL``!('``=H````"R4`:)!:0#>.P,``#LN!?T[+`4].PP``$@`
+M```XB`$`2````#@``!FP``!@.P#`&WQD`:!`>//$?P$`WCN@`1R`I@,)?'CC
+M@W\(`*$X(02`3@```#@```,L3`&"00``':`",``H$`"!0`@``:`^P@!4#```
+M2`@``:!^N@!4"``?L`@`GZ````0L_`""00``&BP0`()`>.NC?]'B_TL0``!(
+M"`"?H'CKHW\1X_]+"`!_L```':`",``H'`"!0`@``:"^]@!4!@`?L`@``:"V
+M)@!4&```2`@``:"^[@!4!@`?L`@``:"X'@!4!``?L'CSQ'\!`-X[H`$<@*8#
+M"7QXXX-_"`"A."$$@$X````X```#+)0`@D$``!V@`C``*#``@4`(`"&A/J,I
+M500`'Z!X2P!\!``?L`@``:"^U@!4`@`?L`@``:"^!@!4+```2`@`(:%^FRE5
+M!``?H'A+`'P$`!^P"``!H+[.`%0"`!^P"``!H+[^`%0``!^P```YH0$`*3D`
+M`#FQ"@#_.P$`>SL`P!M\I/Z`00$`6CL"`!HLT/V!0`$``#AX`P-\-``!@*8#
+M"'P0``&#%``A@Q@`08,<`&&#(`"!@R0`H8,H`,&#+`#A@S``(3@@`(!.T/\A
+ME*8""'P0``&3%``ADQ@`09,<`&&3(`"!DR0`H9,H`,&3+`#ADS0``9!X&WM\
+M>".:?&0%Q#L```2@_S\`*!``@4`D`(2C&@"<.Q@``$@```2@OP&`.P(P`"@(
+M`(%!;P&`.P```#L$`1J@```8?)`#@$`\"`E7%-(I?08!":`````L(`""0```
+M&J`",``H#`"!0`@`G#M4`P!(!P"<.TP#`$@``!J@`C``*,@`@4```.`[>..$
+M?P$`G#N@`1N`I@,)?'C;8W\(`*$X(02`3@```#@```,L+`."03@8ZU<4\DM]
+M"``!H#[""50N\RM]/@8`5`@`"K`"`/\[!P`?++3_@4```.`[>..$?P$`G#N@
+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
+MHRE5!``*H'A+`'P$``JP"``!H+[6`%2J``NP"``!H+X&`%2P``NP>/OD?P$`
+M_SN@`7R!I@-I?7CC@W\(`*$X(02`3@```#@,``&0```#+'P*@D$4\CM]"``!
+MH#["`%16``F8`0`;+$``@D$0`(%!```;+!0`@D%<``!(`@`;+$``@D%0``!(
+M"``!H'[?"53P`#ZQ?O<)5/(`/K%\#P!4[``>L#```$@(``&@?N<)5/0`/K%^
+M!P!4]@`>L!@``$@(``&@?N<)5/@`/K%^!P!4^@`>L```&RQL`()`>/OD?P$`
+M_SN@`7R!I@-I?7CC@W\(`*$X(02`3@```#@,``&0```#+,@)@D$(`$&A_HM+
+M5>P`'J!X6P!\[``>L'ZG0%7N`!ZP?K]`5>@`'K!^UT!5Z@`>L'[O257D`#ZQ
+M?@=*5>8`7K%X^^1_`0#_.Z`!?(&F`VE]>..#?P@`H3@A!(!.````.`P``9``
+M``,L8`F"03P(:5<4\BE]"``!H#["`%0^``FP"``!B$0`";!X^^1_`0#_.Z`!
+M?(&F`VE]>..#?P@`H3@A!(!.````.`P``9````,L&`F"03P(:5<4\BE]"``!
+MH#["`%1*``FP"``!B%``";!X^^1_`0#_.Z`!?(&F`VE]>..#?P@`H3@A!(!.
+M````.`P``9````,LT`B"013R.WT(`&&A/L)@55D`"9@\"&E7%/(I?5``*3D^
+M!FM5#`!IL0P`":"```MP$`""0?\``&CX``!\#``)L'C[Y'\!`/\[H`$<@*8#
+M"7QXXX-_"`"A."$$@$X````X#``!D````RQH"()!/`AI5Q3R*7U@`"DY"``!
+MH#[>`%0"``FP"``!H#[_`%0(``FP"``!H/X'`%0.``FP```>H/\_`"@T`(%`
+M```;+!``@D$"`!LL&`""02```$@(``&@_I\`5"8`'K`0``!("``!H/Z?`%0H
+M`!ZP```>H`(P`"BD`*%`>/OD?P$`_SN@`7R!I@-I?7CC@W\(`*$X(02`3@``
+M`#@,``&0```#+,0'@D$\"&E7%/(I?0@``:!^U@!4M@`)L`$`&RP@`()!$`"!
+M00``&RQ$`()!3```2`(`&RP@`()!0```2`@``:!^!PE4_``^L7[O`%0``1ZP
+M*```2`@``:!^!PE4_@`^L7[O`%0"`1ZP$```2`@``:"^!@!4$@`>L```'J`#
+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
+M``&@&``>L!8`'J`````L*`""0```'J#_/P`H$`"!0!@`'J#^KP!4#```2!@`
+M'J#^BP!4%@`>L`$`8#D,`&&1#`!A@#0``8"F`PA\&`!!@QP`88,@`(&#)`"A
+M@R@`P8,L`.&#,``A."``@$[H_R&4I@((?!``P9,4`.&3'``!D'@;?WQX(YY\
+M#?'_2P```#@```,L7`"B07C[XW]X\\1_T<[_2P```#@```,L1`"B07C[XW]X
+M\\1_C>;_2P```#@```,L+`"B07C[XW]X\\1_Z>G_2P```#@```,L%`"B07C[
+MXW]X\\1_=>S_2W@;8'QX`P-\'``!@*8#"'P0`,&#%`#A@Q@`(3@@`(!.^/\A
+ME*8""'P,``&0```$H/\_`"@4`(%`+@`$H`$``"P(`*)`#=G_2PP``8"F`PA\
+M"``A."``@$X``".A```$H```"7P<`*)``@!CH/#!8W`"``2@\,$`<%`88'P@
+M`(!.``!CH```!*!0&&!\(`"`3@@"8Z#_OV-P(`"`3@``8#DX&&!5%!H@?2X`
+M`WP$`"F!``!`.7E+"'P4`()``0!K.0$`"RS<_X%``0!`.7A30WT@`(!.^/\A
+ME*8""'P,``&0L?__2P``8#D``"`]```I.0"`8'`T`*)!?@1C5```(#T``"DY
+M%``+'"X""7P!`$`Y`!@`?#@`@D$!`&LY@@`+*.3_@4`D``!(-"A@52X""7P!
+M`$`Y`!@`?!0`@D$!`&LY2@`+*.3_@4```$`Y>%-#?0P``8"F`PA\"``A."``
+M@$[H_R&4I@((?!0`X9,<``&0>".??`$`8#D```0L@`""01'__TM>!&!4>`+K
+M?P``*R$466E]`(!J<&0`@D#_`6EH``!I(11)*WT``$,A%!D*?`$`8#EY`RI]
+M1`""0```0#D``"`]```I.10`"AP42F!]+@()?`#X`'P4`*)``@`+H`$`8#D`
+M&`!\%`""00$`2CF"``HHU/^!0```8#EX6V-]'``!@*8#"'P4`.&#&``A."``
+M@$[H_R&4I@((?`P`H9,0`,&3%`#ADQP``9!X(YY\>"N]?)P!(X&F`RE](02`
+M3G@;?WQ"`&!P&`""00@`'H`````L#`""0+W_`#@X`']\(`#@<Q0`@D$,`!Z`
+M````+`@`@D#R!O]7"`#@<Q0`@D$$`!Z`````+`@`@D!V!_]7`0#@<Q@`HD$@
+M`'TX`?[_2P```RP(`()!/`#_5WC[XW\<``&`I@,(?`P`H8,0`,&#%`#A@Q@`
+M(3@@`(!.:/\AE*8""'R,`*&3D`#!DY0`X9.<``&0>!M^?```H#MX(X-\W0``
+M2'@;?WP```,L.`""07CSPW]X^^1_``"@.'__I6`(`,$X/0(`2````RP8`*)!
+M>//#?WC[Y'\(`*$XZ?[_2W@;?7QXZZ-_G``!@*8#"'R,`*&#D`#!@Y0`X8.8
+M`"$X(`"`3NC_(92F`@A\%`#ADQP``9!X&W]\*?W_2Q(``RPL`()!$`"!00``
+M`RPH`()!-```2/\!`RP<`()!````.$J#`&````-\'`"B0`$`8#@8``!("@(?
+MH`$`8#A*`P`L"`""00``8#@<``&`I@,(?!0`X8,8`"$X(`"`3G@;:'P``&`Y
+M```@/0``23D4``L<%%(@?2X""GQX2R-]`$``?"``@DT!`&LY``!@.((`"R@@
+M`(%-V/__2^C_(92F`@A\#`"ADQ0`X9,<``&0=?S_2W@;?WP`@&!P&`"B07X$
+M?51XZZ-_F?__2P```RQ(`*)```!@.0``(#T``"DY-"A@511*0'TN`@E\`/@`
+M?!@`HD`8``J@>`,=?````"P8`()`2P!@.0$`:SE*``LHT/^!0```H#MXZZ-_
+M'``!@*8#"'P,`*&#%`#A@Q@`(3@@`(!.^/\AE*8""'P,``&0>".*?```8#D`
+M`"`]```I.0``A"\P.&!5%$J`?"X""7P`&`!\'`"B0!``OD%X4T-]@`"@.`$`
+M`$@!`&`X%```2`$`:SDP``LHS/^!0```8#@,``&`I@,(?`@`(3@@`(!.>!MJ
+M?```8#@```HL(`""30``8#D``"`]```I.30H8%4N`@E\`0!@.`!0`'P@`()-
+M`0!K.0``8#A*``LH(`"!3=S__TO(_R&4I@((?!0`X9(8``&3'``ADR``09,D
+M`&&3*`"!DRP`H9,P`,&3-`#ADSP``9!X&WA\>".;?'@KNGQX,]E\``#`.P``
+MH#L``(`[``#@.@``!*`````L/`""0.7Z_TMX&W]\`(!@<"P`@D```(`XX?[_
+M2P```RP4`*)`>/OC?SW__TL```,L#`""07C[Z'\(``!(`@`;H0#_`'%0`8)`
+M``!@.0``8#@``"`]``!).30H8%444B!]+@(*?`!``'P,`*)`>$L\?0$`8#@!
+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
+M_R&4I@((?`P`H9,0`,&3%`#ADQP``9!X&W]\>".=?/\`P#L*`@.@````+(``
+M@D"Y[_]+-@9C5&```RP4`()!>/OC?Z7O_TN9`0,L8`"B0`(`':"@``!PX0#`
+M.Z```"R(`()!`@`=H-```'#B`,`[P```+'0`@D$"`!V@T```<.0`P#O0```L
+M8`""00(`':!0`0!P4`$>:-``WG]P_MY_^@?>5^,`WCM```!(>/OC?WCKI'\!
+M``!(```#+"P`@D$@`,.#`@`=H#(&`%3````L&`"B0#X'P%<!```L#`"B0#8`
+MWE<"`-YC>//#?QP``8"F`PA\#`"A@Q``P8,4`.&#&``A."``@$[X_R&4I@((
+M?`P``9`!``!(````.````RP,`()!'``#@/[W`%1X`P-\#``!@*8#"'P(`"$X
+M(`"`3MC_(92F`@A\#``ADQ``09,4`&&3&`"!DQP`H9,@`,&3)`#ADRP``9!X
+M*[U\>#/9?'@;>WP4*H-___]$-V@`@D%XXYY_0-@<?%``H4!0\/U_>/OC?WCS
+MQ'^F`RA_(0"`3@```RPT`(%`>//+?Z8#J7\``#^)```+B```'Y@!`/\[```K
+MF0$`:SGH_P!"4/#=?T#8'GRX_X%!%.J<?___6C>@_X)`+``!@*8#"'P,`"&#
+M$`!!@Q0`88,8`(&#'`"A@R``P8,D`.&#*``A."``@$[@_R&4I@((?!@`P9,<
+M`.&3)``!D'@;?WR@`0.`I@,)?,$`@#@*`*$X(02`3@```#@```,L9`""00H`
+M@:#_/X0@$"&$?+@CA'P%`(1PR@"$.*`!'X"F`PE\>/OC?P@`H3@A!(!.````
+M.````RPL`()!"@`!H/\_`"@0`(%`"``!H/ZO`%0,``!("``!J/X/`%0\$A^0
+M/!(?@'@#`WPD``&`I@,(?!@`P8,<`.&#(``A."``@$[H_R&4I@((?!0`X9,<
+M``&0>!M_?!'M_TM(``,LB`""02@`@4%!``,L&`"!04```RQT`(!````#+%``
+M@D%T``!(0P`#+%P``$@````XC8$`8````WPD`(%!````.(B!`&````-\0`"`
+M0+;_`S@"```H0`"!03```$@````XCX$`8````WP<``!("@(?H(@!`"P@`(!!
+MC0$`+`P`@4"/`0`L$`"B0'C[XW^E_O]+"```2```8#@<``&`I@,(?!0`X8,8
+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
+M^BE]/L(`5!,3"9B(``&(%!,)F`$`WCL"`!XHP/^!0```&R`4V2!]`@!@/?W_
+M:V%X6F!_``!@(10!"WP)`$`[>0,K?2@`@D!XZZ-_$$"`.'CCA7\!``!(>.NC
+M?T```$@(`$`[&```2`@`0#MXZZ-_$$"`.'CCA7\!``!(```?+`P`@D%X^^-_
+M`0``2```&"P(`()!``!8DP``8#BT``&`I@,(?)```8.4`"&#F`!!@YP`88.@
+M`(&#I`"A@Z@`P8.L`.&#L``A."``@$[X_R&4I@((?`P``9`!``!(#``!@*8#
+M"'P(`"$X(`"`3@``8#@``8!P(`""30`4`#@```6P-A4`.```!K`!`&`X(`"`
+M3@$`8#@@`(!.X`$C.00`"8`!``!@!``)D``4`#@,``FP-A4`.`X`";#@`0.`
+M`@``8!P$`%3@`0.0`P``.`@`";!````X"@`)L.`!`X#0`@M4X`%CD7P2`X@`
+M```L'`""00```#A($@.P`0``.$P2`Y"``&!EX`$#D`\``#@4``F0`0``.&@2
+M`Y`!`&`X(`"`3NC_(92F`@A\"`"!DPP`H9,<``&0>!M\?'@CG7P``(`X+("$
+M8`0`O8`!``!(>..#?P``@#@P@(1@#`"]@`$``$AXXX-_``"`.#2`A&`0`+V`
+M`0``2'CC@W\``(`X.("$8`@`O8`!``!(>..#?P``@#@D@(1@``"]@`$``$@<
+M``&`I@,(?`@`@8,,`*&#&``A."``@$[8_R&4I@((?"P``9`,`(&0W`$#@`$`
+M`"PT`()!```@/0``"8!0(`!\.!@`5!0``9```"`]```)@%`@`'PX&`!4&``!
+MD!``@9`8``!(__\`.!0``9`8``&0`0``.!```9"``0`\__\`8#@`H'P(``&0
+M"`"!.`$``$@L``&`I@,(?"@`(3@@`(!.Z/\AE*8""'P,`*&3'``!D'@;?7P`
+M`(`X+("$8```H#@!``!(>.NC?P``@#@$@(1@`0``2!``961?_P`\__\`8#@`
+MI7QXZZ-_``"`.`2`A&`!``!(>.NC?P``@#@D@(1@``"@./__I6`!``!('``!
+M@*8#"'P,`*&#&``A."``@$[H_R&4I@((?`P`H9,0`,&3%`#ADQP``9!X&WY\
+M>".??'@;?7P2``2@````+&@`@D$``(`X!("$8`$``$A.`F54(`"E9'CSPW\`
+M`(`X!("$8`$``$@0`+^@>//#?P``@#@H@(1@`0``2!(`OZ!X\\-_``"`.$B`
+MA&`!``!(%`"_@#@8I51X\\-_``"`.#2`A&`H``!(``"`.`2`A&`!``!(7_\`
+M//__`&`X`&5\>//#?P``@#@$@(1@`0``2'CSPW\``(`X+("$8```OX`!``!(
+M>//#?P``@#@D@(1@`0``2!``8U0(`!^@>`-E?!@`/Z$```DL$`""000`"3A>
+M@@!4>`.E?'CSPW\``(`X)("$8`$``$C0`1Z@`P``*$``@4`:`)^@!P"`<#0`
+M@D'X$QV`*`8)5&Y%@%1X`R5]!P`$*`@`@4``!R5A^!.]D'CSPW\``(`X&("$
+M8`$``$@<``&`I@,(?`P`H8,0`,&#%`#A@Q@`(3@@`(!.^/\AE*8""'P,``&0
+M"$"`.`$``$C__R,Q$!D)?'@#`WP,``&`I@,(?`@`(3@@`(!.Z/\AE*8""'P,
+M`*&3$`#!DQ0`X9,<``&0>!M]?'@CGWP<`(`X`0``2/__`RP4`*)`````.```
+M'Y```&`X<```2!P3/8$X2&E\!0$`/+K8`&`X`"E]```_D7```#P@``!@.0!K
+M?`P`@D$`0"!E```?D`4`8'`0`()!```?@`$``&```!^0P`5I<!``@D$``!^`
+M0```8```'Y```!^``$`+=`@`@D%0$GV0`0!@.!P``8"F`PA\#`"A@Q``P8,4
+M`.&#&``A."``@$X<$V.`(`"`3NC_(92F`@A\"`"!DPP`H9,0`,&3%`#ADQP`
+M`9!X&WU\>".??'@;?GP<$X.#```<+!``H$`D`(`X``"@.`$``$@%`0`\NM@`
+M8#@`Y7\!`.!S"`""004`I6!``.!S1`""02`3'H`````L"`""04``I6`D$QZ`
+M````+`@`@D$``:5@*!,>@````"P(`()!@`"E8"P3'H`````L"`""00`$I6!X
+MZZ-_(`"`.`$``$@<$_Z3```?+!0`H$!XZZ-_)`"`.`$`H#@!``!(>..#?QP`
+M`8"F`PA\"`"!@PP`H8,0`,&#%`#A@Q@`(3@@`(!.0`!@."``@$[X_R&4I@((
+M?`P``9`_``0H(`"A030HA%0!`(0\')"$.`$``$@!```X`(!I<`@`@D`````X
+M>`,#?`P``8"F`PA\"``A."``@$[H_R&4I@((?`P`H9,4`.&3'``!D'@;?WP`
+M```X/P`$*)``H4$T*)U4`0"]/P"0G3@``*`X`0``2`20G3AX^^-_``"@.`$`
+M`$@(D)TX>/OC?P``H#@!``!(#)"=.'C[XW\``*`X`0``2!"0G3AX^^-_``"@
+M.`$``$@4D)TX>/OC?P``H#@!``!(&)"=.'C[XW\``*`X`0``2!R0O3MX^^-_
+M>.ND?P``H#@!``!(`0``.'@#`WP<``&`I@,(?`P`H8,4`.&#&``A."``@$[H
+M_R&4I@((?`P`H9,0`,&3%`#ADQP``9!X&WY\``!@.#\`!"B,`(%!``#@.P``
+M(#D```4L3`""004`Y8LN0/]7!``%B'@#_W\#`"6)#L`I50(`!8@>@`!4>`,I
+M?0$`!8@N0`!4>`,I?0``!8AX`RE]?O@I50#XX%=X`RE]?OC_5S0HG50!`+T_
+M&)"=.'CSPW]X2R5]`0``2!R0O3L`@.5C>//#?WCKI'\!``!(`0!@.!P``8"F
+M`PA\#`"A@Q``P8,4`.&#&``A."``@$[(_R&4I@((?!0`X9(8``&3'``ADR``
+M09,D`&&3*`"!DRP`H9,P`,&3-`#ADSP``9!X&WQ\>".;?'@SV'S__V<Q$%EK
+M?555`#Q650!@.`!K?:NJ*SVJJFDY``!@.#\`!"B(`8%!```%B```8#@````L
+M>`&"0`(`!:```&`X!```*&@!@4`"``6@``#@.@4``"@8`(%``@`%H`T`X"(0
+MN?=^O`?W5@$`]SH$`$6)!0`%B"Y``%1X`TI]!@`%B!Z``%1X`TI]!P`%B`[`
+M`%1X`TI]>%I*?0D`!8@N0`!4"``EB7A+&7QX6CE_/@0Y5PH`Q8L+``6(+D``
+M5'@#WG\,``6('H``5'@#WG\-``6(#L``5'@#WG]X6MY_#P`%B"Y``%0.`"6)
+M>$L:?'A:6G\^!%I7$`#EBQ$`!8@N0`!4>`/_?Q(`!8@>@`!4>`/_?Q,`!8@.
+MP`!4>`/_?WA:_W\"``6@#0``*`@`@4$^!O]7-"A]5P$`O3\`D)TX>..#?WA3
+M17T!``!(!)"=.'CC@W]XRR5_`0``2`B0G3AXXX-_>//%?P$``$@,D)TX>..#
+M?WC317\!``!($)"=.'CC@W]X^^5_`0``2!20O3MXXX-_>.ND?WB[Y7X!``!(
+M>..#?WC;9']XPP5_`0``2#P``8"F`PA\%`#A@A@``8,<`"&#(`!!@R0`88,H
+M`(&#+`"A@S``P8,T`.&#.``A."``@$[X_R&4I@((?`P``9`3$R,Y>".#?'A+
+M)'T&`*`X`0``2`P``8"F`PA\"``A."``@$[X_R&4I@((?`P``9`3$V,X!@"@
+M.`$``$@!`&`X#``!@*8#"'P(`"$X(`"`3OC_(92F`@A\#``!D'@C@WP``(`\
+M``"$.`8`H#@!``!(#``!@*8#"'P(`"$X(`"`3@``8#@@`(!.Z/\AE*8""'P0
+M`,&3%`#ADQP``9!X&W]\>"N^?#H0A%0`8(0X`0``2'C[XW\`;(`X`P"@.`(`
+MP#@!``!(````.````RP8`*)!>/OC?P!H@#@!``!(``!^L`$``#AX`P-\'``!
+M@*8#"'P0`,&#%`#A@Q@`(3@@`(!.>!MI?`@"`Z`,`&`X`"``?"``@D%R$@F@
+M@``)<"8`8'S^'V-4T`!C?#@`8U0+`&,X```%+`@`@D$``&60``!@."``@$X!
+M`&`X(`"`3MC_(92F`@A\%`!ADQ@`@9,<`*&3+``!D'@;>WQ($J.C?O>\5_[_
+MO5=XXX1_`0``2'CJ97P```4@%"F@?'C;8W]XXX1_`0``2"P``8"F`PA\%`!A
+M@Q@`@8,<`*&#*``A."``@$[H_R&4I@((?`@`@9,,`*&3'``!D'@;?'QX(YU\
+M%$"`.`$``$@\"+U7`P"@.##HI7QX*&5\`@``.##H`'QX`Z5\>..#?Q1`@#@!
+M``!(`0!@.!P``8"F`PA\"`"!@PP`H8,8`"$X(`"`3NC_(92F`@A\"`"!DPP`
+MH9,<``&0>!M\?'@CG7P40(`X`0``2#P(O5<#`*`X,.BE?'@H97QXXX-_%$"`
+M.`$``$@!`&`X'``!@*8#"'P(`(&##`"A@Q@`(3@@`(!.V/\AE*8""'P4`&&3
+M&`"!DQP`H9,L``&0>!M[?'@CG'QX*[U\&$"`.`$``$C^_P`X/N``7#@`97S^
+M![U7,."]?WCKI7QXVV-_&$"`.`$``$@!`&`X+``!@*8#"'P4`&&#&`"!@QP`
+MH8,H`"$X(`"`3NC_(92F`@A\%`#ADQP``9!X(Y]\__\`.`4`!"@8`(%!'$"`
+M.`$``$@O`&-P,/QC?/X'8%1X`P-\'``!@*8#"'P4`.&#&``A."``@$[H_R&4
+MI@((?`@`@9,,`*&3%`#ADQP``9!X&W]\>".=?'@KO'P40(`X`0``2"9@J5<\
+M"+U7`P``.##H`'SX`"!]7`0`5#@`97QX2Z5\`("E8```'"P(`()!`0"E9'C[
+MXW\40(`X`0``2!P3GX```81D>/OC?P$``$@<``&`I@,(?`@`@8,,`*&#%`#A
+M@Q@`(3@@`(!.Z/\AE*8""'P0`,&3%`#ADQP``9!X&WY\>".??!!`@#@!``!(
+M\`9E5```'RP<`()!\@9E5$``I6`$`!\L#`""02``96"P!J54>//#?Q!`@#@!
+M``!('``!@*8#"'P0`,&#%`#A@Q@`(3@@`(!.^/\AE*8""'P,``&0``"`.`2`
+MA&`!``!(@`!@="8`8'S^'V-4`@!C(`P``8"F`PA\"``A."``@$[H_R&4I@((
+M?!``P9,4`.&3'``!D'@;?GQX(Y]\``"`.`2`A&`!``!(@`!@=`P`@D$"`!\L
+M"```2`$`'RP8`()!@`!E9'CSPW\``(`X!("$8`$``$@<``&`I@,(?!``P8,4
+M`.&#&``A."``@$X``&`X(`"`3@``!"`4(8!\>".#?"``@$[H_R&4I@((?`P`
+MH9,4`.&3'``!D'@;?WQX*[U\.!-C.`8`H#@!``!(.!._B#D3'X@N0`!4>`.E
+M?#H3'X@>@`!4>`.E?#L3'X@.P`!4>`.E?'C[XW\``(`X"("$8`$``$@]$[^(
+M+D"E5#P3'XAX`Z5\GH"@5W@#I7QX^^-_``"`.`R`A&`!``!(```=+!P`@D!X
+M^^-_``"`.`2`A&`!``!($`!E9!@``$AX^^-_``"`.`2`A&`!``!(%`-E5'C[
+MXW\``(`X!("$8`$``$@<``&`I@,(?`P`H8,4`.&#&``A."``@$[8_R&4I@((
+M?!0`89,8`(&3'`"ADRP``9!X&WQ\``"`.&R`A&`!``!(>!M[?'CC@W\``(`X
+M<("$8`$``$AX&WU\>..#?P``@#AL@(1@`0``2!`8&WP0`0!\$.@`?```(#D`
+M`(`X>!LK?7@C#'QX6V-]>&.$?2P``8"F`PA\%`!A@Q@`@8,<`*&#*``A."``
+M@$[X_R&4I@((?`P``9```(`X;("$8`$``$@,``&`I@,(?`@`(3@@`(!.Z/\A
+ME*8""'P,`*&3'``!D'@;?7P``(`X)("$8`$``$@``65D>.NC?P``@#@D@(1@
+M`0``2!P``8"F`PA\#`"A@Q@`(3@@`(!.Z/\AE*8""'P,`*&3$`#!DQ0`X9,<
+M``&0>!M^?```@#ADF(1@`0``2/YM?U0``>!S#`""0?\!_VOX^/]_>//#?P``
+M@#AP@(1@`0``2'@;?7QX\\-_``"`.&R`A&`!``!(>!J]?WCZO7]XZZ-_'``!
+M@*8#"'P,`*&#$`#!@Q0`X8,8`"$X(`"`3NC_(92F`@A\#`"ADQP``9#0`:.C
+M($"`.`$``$@^!F-4>!J]?P``'2`4Z:!_>.NC?QP``8"F`PA\#`"A@Q@`(3@@
+M`(!.Z/\AE*8""'P(`(&3#`"ADQP``9!X&WQ\>".=?```@#B8@(1@`0``2```
+M'8`4`F-\``!]D'CC@W\``(`XE("$8`$``$@$`!V`%`)C?`0`?9!XXX-_``"`
+M.)R`A&`!``!(#``=@!0"8WP,`'V0>..#?P``@#B0@(1@`0``2`@`'8`4`F-\
+M"`!]D'CC@W\``(`XH("$8`$``$@0`!V`%`)C?!``?9`<``&`I@,(?`@`@8,,
+M`*&#&``A."``@$[H_R&4I@((?`P`H9,0`,&3%`#ADQP``9!X&W]\>".>?'@;
+M?7P(``0H&`"A0```@#C__X1@`0``2$`8'GP4`(%`__\`./P3'9```&`X+```
+M2'C[XW]X\\1_`0``2'@;97QX^^-_``"`.!"`A&`!``!(_!/?DP$`8#@<``&`
+MI@,(?`P`H8,0`,&#%`#A@Q@`(3@@`(!.Z/\AE*8""'P,`*&3'``!D'@;?7P`
+M`(`X$("$8`$``$@^!&14>.NC?P$``$@<``&`I@,(?`P`H8,8`"$X(`"`3NC_
+M(92F`@A\"`"!DPP`H9,0`,&3%`#ADQP``9!X&W]\>".>?/\?@#@!``!(0!@>
+M?!0`@4#__P`X`!0?D```8#A(``!(>/OC?P``@#@4@(1@`0``2"0`?51X^^-_
+M>//$?P$``$C^!&-4>!N]?WC[XW\``(`X%("$8'CKI7\!``!(`!3?DP$`8#@<
+M``&`I@,(?`@`@8,,`*&#$`#!@Q0`X8,8`"$X(`"`3NC_(92F`@A\#`"ADQP`
+M`9!X&WU\``"`.!2`A&`!``!(_@1D5'CKHW\!``!('``!@*8#"'P,`*&#&``A
+M."``@$[W$V.(`0!C:/X'8U0@`(!.Z/\AE*8""'P0`,&3%`#ADQP``9!X&W]\
+M>!M^?```!"PP`()!``"`.`2`A&`!``!(#`)E5'C[XW\``(`X!("$8`$``$CT
+M$Q^`#`(`5"P``$@``(`X!("$8`$``$@``65D>/OC?P``@#@$@(1@`0``2/03
+M'X```0!D]!,>D`$`8#@<``&`I@,(?!``P8,4`.&#&``A."``@$[H_R&4I@((
+M?`@`@9,,`*&3$`#!DQ0`X9,<``&0>!M_?'@CGGS_'X`X`0``2$`8'GP4`(%`
+M__\`.`04'Y```&`X2```2'C[XW\``(`X%("$8`$``$@$!'U4>/OC?WCSQ'\!
+M``!(WH!C5'@;O7]X^^-_``"`.!2`A&!XZZ5_`0``2`04WY,!`&`X'``!@*8#
+M"'P(`(&##`"A@Q``P8,4`.&#&``A."``@$[H_R&4I@((?`P`H9,<``&0>!M]
+M?```@#@4@(1@`0``2/Z$9%1XZZ-_`0``2!P``8"F`PA\#`"A@Q@`(3@@`(!.
+M`0!@."``@$X@`(!.``!@."``@$X@`(!.(`"`3OC_(92F`@A\#``!D'@;8'S_
+M_R4Q$$DI?;8'*54-`&DX`0`$+`P`@D%X`P-\`0``2`P``8"F`PA\"``A."``
+M@$[X_R&4I@((?`P``9!X&VE\"P`$+!0`@D$``&`X'@`$+"P`@D$@``!(?`?%
+M5/@!HY```(`X:("$8`$``$@!`&`X#```2'A+(WT!``!(#``!@*8#"'P(`"$X
+M(`"`3OC_(92F`@A\#``!D`$``$@,``&`I@,(?`@`(3@@`(!.Z/\AE*8""'P,
+M`*&3%`#ADQP``9!X&W]\>".=?```@#@$@(1@`0``2`0`961X^^-_``"`.`2`
+MA&`!``!(```=+"``HD%X^^-_!$"`.`$``$@:!&54>/OC?P1`@#@!``!('``!
+M@*8#"'P,`*&#%`#A@Q@`(3@@`(!.Z/\AE*8""'P0`,&3%`#ADQP``9!X&W]\
+M```$+'0`@D$$0(`X`0``2!H$951X^^-_!$"`.`$``$C0!V`X`0``2`H`P#MX
+M^^-_$$"`.`$``$@!`&!T,`""0<@`8#@!``!(>/OC?P1`@#@!``!(&@1E5'C[
+MXW\$0(`X`0``2/__WC?$_X)```!@.```'BPL`()!>/OC?P``@#@$@(1@`0``
+M2)@#951X^^-_``"`.`2`A&`!``!(`0!@.!P``8"F`PA\$`#!@Q0`X8,8`"$X
+M(`"`3NC_(92F`@A\#`"ADQ0`X9,<``&0>!M_?'@CG7P``(`X!("$8`$``$@$
+M`&5D>/OC?P``@#@$@(1@`0``2```'2P@`*)!>/OC?P1`@#@!``!(&@1E5'C[
+MXW\$0(`X`0``2!P``8"F`PA\#`"A@Q0`X8,8`"$X(`"`3NC_(92F`@A\#`"A
+MDQ``P9,4`.&3'``!D'@CGWQX*Z1\>!M^?`$`H#L!`!\L)`""00$`'R@0`(!!
+M`@`?+!P`@D$@``!(=?[_2W@;?7P<``!(.?__2Q0``$CI_?]+#```2```8#@,
+M``!(-!/^DWCKHW\<``&`I@,(?`P`H8,0`,&#%`#A@Q@`(3@@`(!.^/\AE*8"
+M"'P,``&0!$"`.`$``$B^AV-4#``!@*8#"'P(`"$X(`"`3NC_(92F`@A\%`#A
+MDQP``9`!``0L&`""00``(#T``.D[`@`$+!P`HD$0``!(```@/0``Z3L,``!(
+M``!@.!```$AX^^1_`0``2'C[XW\<``&`I@,(?!0`X8,8`"$X(`"`3OC_(92F
+M`@A\#``!D`P`@#@!``!(#``!@*8#"'P(`"$X(`"`3OC_(92F`@A\#``!D'@C
+MA7P,`(`X`0``2`P``8"F`PA\"``A."``@$[X_R&4I@((?`P``9`(`(`X!`"@
+M.`$``$@,``&`I@,(?`@`(3@@`(!.Z/\AE*8""'P0`,&3%`#ADQP``9!X&WY\
+M"`"`."``H#@!``!(``#@.WCSPW\(`(`X`0``2`$``#@$`&EP'`""00H`8#@!
+M``!(`0#_.^<#'RS8_X%`````.'@#`WP<``&`I@,(?!``P8,4`.&#&``A."``
+M@$[H_R&4I@((?`P`H9,<``&0>!M]?```@#AH@(1@`0``2+`&951XZZ-_``"`
+M.&B`A&`!``!('``!@*8#"'P,`*&#&``A."``@$[H_R&4I@((?`P`H9,<``&0
+M>!M]?```@#AH@(1@`0``2$``96!XZZ-_``"`.&B`A&`!``!('``!@*8#"'P,
+M`*&#&``A."``@$[H_R&4I@((?`@`@9,,`*&3'``!D'@;?7QX(X!\>"N\?```
+M@#A0@(1@>`,%?`$``$AXZZ-_``"`.%2`A&!XXX5_`0``2!P``8"F`PA\"`"!
+M@PP`H8,8`"$X(`"`3NC_(92F`@A\$`#!DQ0`X9,<``&0>!M^?'@CGWP``&`X
+M/P`$*&P`@4$?``0H-`"!0'CSPW\``(`X5("$8`$``$C@_Q\X_O^@.#X`I5PX
+M*&5\>//#?P``@#A4@(1@+```2'CSPW\``(`X4("$8`$``$C^_Z`X/OBE7#@H
+M97QX\\-_``"`.%"`A&`!``!(`0!@.!P``8"F`PA\$`#!@Q0`X8,8`"$X(`"`
+M3NC_(92F`@A\$`#!DQ0`X9,<``&0>!M^?'@CGWP``&`X/P`$*&P`@4$?``0H
+M-`"!0'CSPW\``(`X5("$8`$``$C@_Q\X`0"@.#``I7QX*V5\>//#?P``@#A4
+M@(1@+```2'CSPW\``(`X4("$8`$``$@!`*`X,/BE?'@K97QX\\-_``"`.%"`
+MA&`!``!(`0!@.!P``8"F`PA\$`#!@Q0`X8,8`"$X(`"`3OC_(92F`@A\#``!
+MD```@#A,@(1@`0``2`P``8"F`PA\"``A."``@$[X_R&4I@((?`P``9!X(X5\
+M``*`<`P`@D'J!854(`"E8```@#A,@(1@`0``2`P``8"F`PA\"``A."``@$X`
+M```X"``$F`D`!)@*``28"P`$F#X%J50,`*28/L(@50T`!)@````X#@`$F#Y&
+M*54/`"29#``DB0T`!(@N0`!4>$L`?`X`)(D>@"E5>`,I?0\`!(@.P`!4>$L`
+M?```8#@`*`!\(`"B3"``P'!,`()!#``DB0T`!(@N0`!4>$L`?`X`)(D>@"E5
+M>`,I?0\`!(@.P`!4>$L`?``@`&`,``28/L8)5`T`))D^A@E4#@`DF3Y&`%0/
+M``28````.!0`!)@5``28%@`$F!<`!)@0``28$0`$F!(`!)@3``28`0!@."``
+M@$[H_R&4I@((?`@`@9,,`*&3$`#!DQ0`X9,<``&0>!M\?'@KOGQX2SU]>".?
+M?!0`!(@/`"`Y`0`+<,@!@D$4``:(`0`)<!@`@D`,`(`X`0``2`\`(#D`\`-\
+MJ`&"01``/XD1`!^(+D4`5'A+`'P``!VP%``_B14`'X@N0`!4>$L`?!8`/XD>
+M@"E5>`,I?1<`'X@.P`!4>$L`?/Z,'E1XXX-_``"`.&R`A&`!``!(/K1C5/X$
+M8%1`\`!\%`"`0`#@`S@^!`!4>`/>?P@``$AX&]Y_?@3`5P(`';`````X!``=
+MF!0`/XD5`!^(+D``5'A+`'P6`#^)'H`I57@#*7T7`!^(#L``5'A+`'P"``EP
+M8`""0`0`"W`,`()!`0``.#```$@4`!^($``)<!``@D$$`!V("```8!@``$@4
+M`!^("``+<!0`@D$$`!V(!```8`0`'9@<``!(!``=B`(``&`$`!V8%``?B'[9
+M`%0%`!V8$@`?B!Z``%03`#^)#L`I57A+`'P^;@!4!@`=F!0`/XD5`!^(+D``
+M5'A+`'P6`#^)'H`I57@#*7T7`!^(#L``5'A+`'P``0EP#`""0;Z^`%0(``!(
+M__\`.`<`'9@1`!^(+D``5!(`/XD>@"E5>$L`?#Z/`%0(`!V8$0`?B/[7`%0)
+M`!V8$0`?B/[G`%0*`!V8```@.7A+(WT<``&`I@,(?`@`@8,,`*&#$`#!@Q0`
+MX8,8`"$X(`"`3LC_(92F`@A\)@"`?10`X9(8``&3'``ADR``09,D`&&3*`"!
+MDRP`H9,P`,&3-`#ADSP``9`0`(&1>!M^?'@CFGQX*[M\>#/7?'@[^'QX&WQ\
+M`@`%H`P`(#D``0MPX`:"07@KI'P!``!(>!MY?`P`(#D```,LR`:"008`&BPH
+M`()!!@`:*!``@4$!`!HH$`"!010``$@(`!HL#`""00P`(#F<!@!(>//#?Q!`
+M@#@!``!(=`9_5'CSPW]XVV1_`0``2`,`(#D```,L=`:"01,3O(@4$QR(+D``
+M5'@#I7P5$QR('H``5'@#I7P6$QR(#L``5'@#I7QX\\-_``"`.`"`A&`!``!(
+M&!.\B"Y`I507$QR(>`.E?'CSPW\``(`X!("$8`$``$AX\\-_>--$?V$&`$@!
+M`!HL,`""00$`&B@8`(!!!@`:+$``@D$(`!HL.`""050``$AX\\-_*`"`.`$`
+MH#@0``!(>//#?R@`@#@``*`X`0``2'CSPW\00(`X)!"@."```$AX\\-_*`"`
+M.```H#@!``!(>//#?Q!`@#A`$*`X`0``2'CSPW\00(`X`0``2'C[97QX\\-_
+M$$"`.`$``$@X$[R(.1,<B"Y``%1X`Z5\.A,<B!Z``%1X`Z5\.Q,<B`[``%1X
+M`Z5\>//#?P``@#@(@(1@`0``2#T3O(@N0*54/!,<B'@#I7QX\\-_``"`.`R`
+MA&`!``!(>//#?P``@#@``*`X`0``2'CSPW\$`(`X``"@.`$``$AX\\-_#`"`
+M.```H#@!``!(>//#?QP`@#@!``!(>//#?R``@#@``*`X`0``2'CSPW\D`(`X
+M``"@.`$``$@````X'!,<D'CSPW\L`(`X`0``2'CSPW\P`(`X!0"@.`$``$AX
+M\\-_-`"`.`4`H#@!``!(>//#?T0`@#@(`*`X`0``2'CSPW](`(`X"`"@.`$`
+M`$AX\\-_4`"`.```H#@!``!(>//#?TP`@#@``*`X`0``2'CSPW\,0(`X``"@
+M.`$``$AX\\-_0`"`.```H#@!``!(>//#?P``@#@8@(1@^!.\@`$``$AX\\-_
+M``"`.$B`A&```*`X`0``2'CSPW\``(`X`0``2'CSPW\``(`X4("$8```H#@!
+M``!(>//#?P``@#A4@(1@``"@.`$``$AX\\-_``"`.%B`A&```*`X`0``2'CS
+MPW\``(`X7("$8```H#@!``!(>//#?P``@#A@@(1@`0"@.`$``$AX\\-_``"`
+M.&2`A&`!`*`X`0``2'CSPW\``(`X:("$8```H#@!``!(>//#?P``@#@H@(1@
+M``"@.`$``$AX\\-_``"`."R`A&```*`X`0``2'CSPW\``(`X;("$8```H#@!
+M``!(>//#?P``@#@P@(1@__^@.`$``$AX\\-_``"`.#2`A&#__Z`X`0``2'CS
+MPW\``(`X.("$8`$`H#@!``!(``#@.P``(#T``*D[```7+C@8X%<N`)U\$`"2
+M00"`!#C_#P`H&`"!0#@8Z5<4ZBE]!`"I@'CSPW\!``!(`0#_.Z8`'RC,_X%`
+M>//#?WC;9'\!``!(`P`@.0```RR@`H)!>//#?P``@#@HF(1@`0``2!X&951Y
+M$AR(+D``5'@#I7QX\\-_``"`."B8A&`!``!(>A(<B`[`!50>@`!4>`.E?'L2
+M/(DN0"!5>`.E?'A+I7QX\\-_``"`.#28A&`!``!(>//#?P``@#A$F(1@`0``
+M2&(&951T$AR@L/P`5'@#I7QX\\-_``"`.$28A&`!``!(>//#?P``@#A(F(1@
+M`0``2!H%951T$AR@IE,`5'@#I7QX\\-_``"`.$B8A&`!``!(>//#?P``@#AD
+MF(1@`0``2!@%951X$AR(9F,`5'@#I7QX\\-_``"`.&28A&`!``!(>//#?P``
+M@#@0F81@`0``2#H`951T$AR@O@<`5'@#I7QX\\-_``"`.!"9A&`!``!(>//#
+M?WC+)'^E$`!(`P`@.0```RQH`8)!```7+"@`@D$$`!F(`@`)<`P`@D`\``!4
+M!``9F`(`&:`"`!NP!``9B`0`&YAX\\-_``"`.!R8A&`!`*`X`0``2.@#8#@!
+M``!(>//#?P``@#A@F(1@`0``2`$`96!X\\-_``"`.&"8A&`!``!(>//#?P``
+M@#A@F(1@`0"@.```P#@!``!(>//#?WC+)'\!``!(``#@.P```RP8`*)``@`;
+MH`(``&`"`!NP`P`@.;@``$AX\\-_>/OD?P$``$@!`/\[`@`?+.S_@4!,$AZ`
+M````+`P`HD%X\\-_`0``2'CSPW\``(`X)("$8`$``$A,`F54>//#?P``@#@D
+M@(1@`0``2/P3G(#__P0L#`""07CSPW\!``!(`!2<@/__!"P,`()!>//#?P$`
+M`$@$%)R`__\$+`P`@D%X\\-_`0``2/@!OH````4L%`"B07CSPW\``(`X:("$
+M8`$``$C<`5Z3`0!@.!@``$@``!B`````+`@`@D$``#B1``!@.#P``8`0`(&!
+MI@,(?!0`X8(8``&#'``A@R``08,D`&&#*`"!@RP`H8,P`,&#-`#A@R"!@'TX
+M`"$X(`"`3NC_(92F`@A\#`"ADQ``P9,4`.&3'``!D'@;?7QX(Y]\``"`.`2`
+MA&`!``!(/@1C5`$`'RQ(`()!$`"!00``'RPL`()!9```2`8`'RP0`()!"``?
+M+#@`@D%0``!(]!.]@'@K97Q1`*5D,```2/03O8!X*V5\4@"E9"```$CT$[V`
+M>"ME?!0`I600``!(]!.]@'@K97P0`*5D>.NC?P``@#@$@(1@`0``2!P``8"F
+M`PA\#`"A@Q``P8,4`.&#&``A."``@$[X_R&4I@((?`P``9#<`8.`+?__2PP`
+M`8"F`PA\"``A."``@$[X_R&4I@((?`P``9`(`(`X"@"@.+T$`$@,``&`I@,(
+M?`@`(3@@`(!.Z/\AE*8""'P4`.&3'``!D'@;?WP``(`X`0"@.`$``$@````X
+M```#+$0`HD%X^^-_#P"`."!.H#AQ!`!(````.````RPH`*)!Z`-@.`$``$AX
+M^^-_'P"`."!.H#A-!`!(-`A@.`$``$@!```X>`,#?!P``8"F`PA\%`#A@Q@`
+M(3@@`(!.Z/\AE*8""'P0`,&3%`#ADQP``9!X&WY\>".??```@#@!`*`X`0``
+M2````#@```,LJ`""00``H#@``!\L%`""00(`'Z`0``EP"`""00$`H#AX\\-_
+M``"`.`28A&`!``!(>//#?P\`@#@@3J`XN0,`2````#@```,L8`"B0>@#8#@!
+M``!(>//#?Q\`@#@@3J`XE0,`2````#@```,L/`"B030(8#@!``!(>//#?P``
+M@#@!`*`X`0``2````#@```,L&`"B07CSPW\``(`X"@"@.%4#`$AX&V!\>`,#
+M?!P``8"F`PA\$`#!@Q0`X8,8`"$X(`"`3MC_(92F`@A\"``!DPP`(9,0`$&3
+M%`!ADQ@`@9,<`*&3(`#!DR0`X9,L``&0>!M_?'@CF'QX*[E\`0``2'@;?GP`
+M```X```#++0"@D%X^^-_``"`.&B`A&`!``!(8`!E8'C[XW\``(`X:("$8`$`
+M`$AX^^-_``"`."2`A&`!``!(>!MZ?$X"951X^^-_``"`."2`A&`!``!(H`]@
+M.`$``$AX^^-_``"`.`B8A&`!``!(``AE9'C[XW\``(`X")B$8`$``$@*`&`X
+M`0``2'C[XW]X\\1_A0L`2````#@```,L'`*B0>@#8#@!``!(>/OC?P``@#@(
+MF(1@`0``2$8!951X^^-_``"`.`B8A&`!``!(>/OC?P``@#A8F(1@`0``2'@;
+M?7QX^^-_``"`.%R8A&`!``!(>!M\?'C[XW\``(`X:)B$8`$``$AX&WM\_`.E
+M9WC[XW\``(`X6)B$8`$``$A2!H57/P"E9(#`I6!X^^-_``"`.%R8A&`!``!(
+MW`9E5X`1I6!X^^-_``"`.&B8A&`!``!(%`!@.`$``$AX^^-_``"`.`B8A&`!
+M``!(``AE9'C[XW\``(`X")B$8`$``$@*`&`X`0``2'C[XW\``(`XU)B$8"$`
+MH#@!``!(>/OC?P``@#@(F(1@`0``2$8!951X^^-_``"`.`B8A&`!``!(Z`-@
+M.`$``$AX^^-_``"`.&"8A&`!``!(`0!E8'C[XW\``(`X8)B$8`$``$AX^^-_
+M``"`.&"8A&`!`*`X``#`.`$``$AX^^-_``"`.%B8A&!XZZ5_`0``2'C[XW\`
+M`(`X7)B$8'CCA7\!``!(>/OC?P``@#AHF(1@>-ME?P$``$AX^^-_>//$?P$`
+M`$@```,L+`"B0(@38#@!``!(>/OC?WCSQ'\!``!(```#+!``@D`"`!B@`@``
+M8`(`&+!X^^-_``"`.&B`A&`!``!(\`9E5'C[XW\``(`X:("$8`$``$AX^^-_
+M``"`."2`A&!XTT5_`0``2`$``#@``!F0>`,#?"P``8"F`PA\"``!@PP`(8,0
+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
+M^^-_``"`.$28A&`!``!(,`!E5#@`I6!X^^-_``"`.$28A&`!``!(>/OC?P``
+M@#@$F(1@`&^@/",@I6#```!(>/OC?P``@#@0@(1@:`&@.`$``$AX^^-_``"`
+M.!2`A&``!*`\``2E8`$``$AX^^-_``"`.""`A&#=`:`\IX^E8`$``$@4`+Z`
+M:`&E'#`"I3@H6*54,`*E8'C[XW\``(`X0("$8`$``$AX^^-_``"`.$2`A&#7
+M!*`\F`.E8`$``$AX^^-_``"`.$28A&`!``!(,`!E5!P`I6!X^^-_``"`.$28
+MA&`!``!(>/OC?P``@#@$F(1@`&^@/"`0I6`!``!(&``>@`\`H#C__P`L"`""
+M01@`OH`6H*54(@`>H#8F`%1X`Z5\(``>H#X'`%1X`Z5\"`"E9``@I6!X^^-_
+M``"`.!R`A&`!``!(#``>@`$`"7`8`()!`0``.##@`'P@$SV!>$L`?!0``$C^
+M_P`X/N``7"`3/8$X2`!\(!,=D`P`'H`!``EP&`""00$``#@PX`!\)!,]@7A+
+M`'P4``!(_O\`.#[@`%PD$SV!.$@`?"03'9`,`!Z``@`)<!@`@D$!```X,.``
+M?"@3/8%X2P!\%```2/[_`#@^X`!<*!,]@3A(`'PH$QV0#``>@`0`"7`8`()!
+M`0``.##@`'PL$SV!>$L`?!0``$C^_P`X/N``7"P3/8$X2`!\+!,=D`P`'H`(
+M``EP&`""00$``#@PX`!\,!,]@7A+`'P4``!(_O\`.#[@`%PP$SV!.$@`?#`3
+M'9`!`&`X'``!@*8#"'P(`(&##`"A@Q``P8,4`.&#&``A."``@$[X_R&4I@((
+M?`P``9`\`(0<%"(C?403"8`````L&`""00$``"P0`*)```"`.`$``$@(``!(
+M__]@.`P``8"F`PA\"``A."``@$[X_R&4I@((?`P``9`\`(0<%"*#?$03!(`!
+M```L&`""00$``"@@`(!!`P``*!@`@4$,``!(``"`.!0``$@$`(`X#```2```
+M8#@,``!(`0``2`$`8#@,``&`I@,(?`@`(3@@`(!.Z/\AE*8""'P,`*&3$`#!
+MDQ0`X9,<``&0>!M_?'@CG7P!``!(>!M^?'X`9%1X^^-_`0``2'C[XW\``(`X
+M9("$8`$``$@E``,@?O@`5!0"HWP``!TL)`""0/__HS@!``,H&`"A07C[XW]X
+M\\1_`0``2```8#@D``!(>/OC?P``@#AD@(1@`0``2'C[XW]X\\1_`0``2`$`
+M8#@<``&`I@,(?`P`H8,0`,&#%`#A@Q@`(3@@`(!.Z/\AE*8""'P4`.&3'``!
+MD'@;?WP\`(0<%"*#?$03!(`!```L(`""00$``"A,`(!!`@``+#@`@D$#```L
+M%`""03@``$@(`(`X`0"@.#0``$@(`(`X`@"@.`$``$AX^^-_*`"`.`X`H#@8
+M``!(*`"`.`H`H#@,``!(``!@.`P``$@!``!(`0!@.!P``8"F`PA\%`#A@Q@`
+M(3@@`(!.^/\AE*8""'P,``&0/`"$'!0B(WU$$PF`````+!P`@D$!```L%`"B
+M0!0`@#@!``!(/J]C5`@``$@``&`X#``!@*8#"'P(`"$X(`"`3NC_(92F`@A\
+M$`#!DQ0`X9,<``&0>!M_?#P`A!P4(H-\1!,$@`$``"P8`()!`0``*'P`@$$"
+M```L8`""07```$@(`(`X"`"@.`$``$@``,`[>/OC?Q0`@#@!``!(`'A@<!@`
+M@D$*`&`X`0``2`$`WCOG`QXLW/^!0'C[XW\(`(`X``"@.`$``$@!`&`XYP,>
+M+"``@4`8``!(+`"`.`0`H#@``,`X`0``2`@``$@``&`X'``!@*8#"'P0`,&#
+M%`#A@Q@`(3@@`(!."``!@1``08']_P<X``Q@/0$``"@(`(%`"M#K5#X%H%0:
+MD"E5>$L`?*9CR51X2P!\>%L`?`$`1W$(`()!``$`9(3(255X`RE]#``!@/__
+MX#`0`6=]#,A@57A+`'P(``28/L8)5`D`))D^A@E4"@`DF3Y&`%0+``28__\(
+M+'0`@D%D:PE5````.`P`!)@TQB!5#0`$F#Z$(%4.``28/D8I50\`))D(`"2)
+M"0`$B"Y``%1X2P!\"@`DB1Z`*55X`RE]"P`$B`[``%1X2P!\`$``9`@`!)@^
+MQ@E4"0`DF3Z&"50*`"29/D8`5`L`!)@8``!(````.`P`!)@-``28#@`$F`\`
+M!)@$`$EQG`""00@`)(D)``2(+D``5'A+`'P*`"2)'H`I57@#*7T+``2(#L``
+M5'A+`'Q```!D"``$F#[&"50)`"29/H8)5`H`))D^1@!4"P`$F`P`)(D-``2(
+M+D``5'A+`'P.`&2)'H!K57@#:WT/`"2)#L`I57A;*7T8``&`&```5'@#*7T,
+M`"29/L8@50T`!)@^AB!5#@`$F#Y&*54/`"29`0!@."``@$X``&`X(`"`3@@`
+M)(D)``2(+D``5'A+`'P*`"2)'H`I57@#*7T+``2(#L``5'A+`'P`(`!D"``$
+MF#[&"50)`"29/H8)5`H`))D^1@!4"P`$F"``@$X```8L8`""00P`)(D-``2(
+M+D``5'A+`'P.`"2)'H`I57@#*7T/``2(#L``5'A+`'P``&<A%#DK?29@*55X
+M*P!\>`,I?0P`))D^QB!5#0`$F#Z&(%4.``28/D8I50\`))F@``!(```'+&0`
+M@D$(`"B)"0`(B"Y``%1X2P!\"@`HB1Z`*55X`RE]"P`(B`[``%1X2P!\"``$
+MF#[&"50)`"29/H8)5`H`))D^1@!4"P`$F`P`I)@^QJ!4#0`$F#Z&H%0.``28
+M/D:@5#0``$@````X"``$F`D`!)@*``28"P`$F``0H&`,``28/L8)5`T`))D^
+MA@E4#@`DF3Y&`%0/``28````.!0`!)@5``28%@`$F!<`!)@0``28$0`$F!(`
+M!)@3``28`0!@."``@$X4``2(#P!@.`$`"7`@`()-%``DB14`!(@N0`!4>$L`
+M?/P$`%0```6P$@`DB1,`!(@N0`!4>$L`?`(`!;`````X!``%F!``)(D1``2(
+M+D``5'A+`'P2`"2)'H`I57@#*7T3``2(#L``5'A+`'P!``EP1`""0`(`"7`,
+M`()!`0``.`0`!9@0``2("``)<!``@D$$``6(`@``8`0`!9@0``2(!``)<!``
+M@D$$``6(!```8`0`!9@*``2(/O<`5`4`!9@5``2(+D``5!8`)(D>@"E5>$L`
+M?#Z>`%0&``68$0`$B#X'`%0'``68$``$B#[A`%0(``68````.`H`!9@+``68
+M``!@."``@$X@`(!.!``$B`@``&`$``28``!@."``@$[H_R&4I@((?!``P9,4
+M`.&3'``!D'@;?GP``(`XT)B$8!8<H#@!``!(``#@.WCSPW\``(`X@)B$8`$`
+MH#P!``!(`0#_.P<`'RSD_X%`>//#?P``@#@`G(1@`0``2#Y&8U0^X6E4-B9@
+M5'@#(WT(`(`X`0``2!P``8"F`PA\$`#!@Q0`X8,8`"$X(`"`3M#_(92F`@A\
+M$``!DQ0`(9,8`$&3'`!ADR``@9,D`*&3*`#!DRP`X9,T``&0>!MY?'@CG'QX
+M*[M\>#/:?'@[^'SP+F`X`0``2'@;?WP"`*`[```#+/P#@D%X&WY\``"`/```
+MA#AP$J`X`0``2`P`GY,0`'^3%`!?D\@!/[,````XR@$?L#\``#C\`1^P````
+M.``"'Y"L+A^0R"X?D``'`#C0+A^0__\`.-0N'Y#8+A^0W"X?D'C[XW\``(`X
+M`0``2`,`H#L```,LB`."0<@!'Z```"`Y&_$I80!(`'PT`*)`>/OC?P``@#@`
+MHH1@``"@.`$``$AX^^-_``"`.'R8A&`9`*`X`0``2.@#8#@!``!(>//#?R!`
+M@#@!``!(/@9C5#[A:53,`3Z1/@=@5-`!'K#^_RDY#0"@.P(`"2@4`X%!>//#
+M?P``@#@8F(1@`0``2-(!?K!X\\-_@0,`2`X`H#L```,L[`*"0<P!'H`#```H
+M&`"!0'CSPW\``(`X`)B$8`<`H#@4``!(>//#?P``@#@`F(1@1P"@.`$``$C0
+M!V`X`0``2'CSPW_-_?]+U`%^L-0!'J`V!@!4#0"@.Q```"R0`J)`>//#?\$`
+M@#@(`*$X`0``2`@`H#L```,L=`*"00@``:`%`*`[_R\`*&0"@4`(``&@<!(?
+ML'CSPW\00(`X`0``2+[O8U0*`*`[`@`#+$`"HD!X\\-_/P"`.`@`H3@!``!(
+M"`"@.P```RPD`H)!"``!H'(2'[```(`[``"@.\``G3AX\\-_"`"A.`$``$@`
+M``,L^`&"00@``:!X`IQ_`0"].S\#'2C8_X%`````./__`&`'`*`[```<?-0!
+M@D`*```XYA,?L`,``#CP%1^P``"@.PL``#@T`#T=%/HI?>X3";`!`+T["0`=
+M*.S_@4```*`[```@/0``23D+`&`Y/`B@5Q3Z('WP%2DY+@(*?`@`";`"``FP
+M-``]'13Z*7VT%FFQ&!9IL0$`O3L"`!THT/^!0'`2GSAX\\-_`0``2`@`H#L`
+M``,L2`&"0<P!'H`#```H;`"!0(H2'Z`````L8`"B07CSPW\``(`X`)B$8`=`
+MH#@!``!(T`=@.`$``$AX\\-_,?S_2]8!?K!X\\-_``"`.`"8A&`'`*`X`0``
+M2-`'8#@!``!(U@$>H#8&`%0-`*`[(```+-@`@D`,``!(````.(H2'[!X\\-_
+MOP"`.`@`H3@!``!("`"@.P```RRP`()!"``!H'02'[!T$A^@"`(>L```(#T`
+M`"DYP`$^D7CSPW_A`@!(>//#?P$``$@``(`[``"@.Q\`G2!X\\-_"`"A.`$`
+M`$@```,L8`""00@``:`4`IQ_/`BI5Q3Z*7T^P@!4+"P)F`@``8@M+`F8`0"]
+M.P(`'2C`_X%````<(!3A('T"`&`]_?]K87A:@'\``&`A%`$+?`D`H#MX\\-_
+M>0,K?2P`HD$(``!("`"@.P``'RP,`()!>/OC?P$``$@``!@L"`""00``N),`
+M`&`X-``!@*8#"'P0``&#%``A@Q@`08,<`&&#(`"!@R0`H8,H`,&#+`#A@S``
+M(3@@`(!.Z/\AE*8""'P,`*&3'``!D'@;?7QP$H,X`0``2'CKHW\!``!('``!
+M@*8#"'P,`*&#&``A."``@$ZH_R&4I@((?#P`(9-``$&31`!ADT@`@9-,`*&3
+M4`#!DU0`X9-<``&0>!M\?```(#UX$FDY>!()@`0`*X$(``&0#``AD0``8#V`
+M$BLY@!(+@`0`:8$(`$F!#``I@2@``9`L`&&1,`!!D30`(9$``"`["`!!.SH0
+M(%<4TJ!_+@#:?WCC@W]X\\1_`0``2!``?9```.`['H#@5WC['7QXXX-_>//$
+M?WCKI7\!``!(>..#?WCSQ'\!``!(````.`#H`WR(`()``0#_._\`'RS(_X%`
+M``#@.P@`83LZ$.E7%-HI?2``J8-XXX-_>//$?WCKI7\!``!(>..#?WCSQ'\!
+M``!(````.``8'7Q``()``0#_.P,`'RS$_X%`.A`@5Q32('UXXX-_+@":?!``
+MJ8`!``!(`0`Y.P$`&2P\_X%`9`!@.`$``$@!```X>`,#?%P``8"F`PA\/``A
+M@T``08-$`&&#2`"!@TP`H8-0`,&#5`#A@U@`(3@@`(!.``&`<!0`@D$X$P`X
+M```%L-07`#@D``!(@`"`<"@`@D&*$@.@````+!P`@D$("0`X```%L*P*`#@`
+M``:P`0!@."``@$X``&`X(`"`3@$`8#@@`(!.X/\AE*8""'P0`(&3%`"ADQ@`
+MP9,<`.&3)``!D'@;?'QX&WY\>!M]?.`!XSL(`@.@`0``+!``HD`0`(`X"`"A
+M.`$``$@````X!``?D(82'J`````L(`""00$``#@$`!^0=A(>H````"P,`()`
+M`P``.`0`'Y"*$AZ@````+!``@D$$`!^`!```8`0`'Y`("0`X$``?L*P*`#@2
+M`!^P.!,`.`P`'[#4%P`X#@`?L```'X`#``!@`P``9`H`(#D(`#^Q@``@.0H`
+M/['0`@!4```?D'H2'J`````L,`"B04@2O3AXXX-_#P"`.`$``$@```,L&`""
+M00$``#A,$AV0```?@(```&0``!^0#0``.!0`'Y`!```X:!(=D`$`8#@D``&`
+MI@,(?!``@8,4`*&#&`#!@QP`X8,@`"$X(`"`3NC_(92F`@A\"`"!DPP`H9,<
+M``&0>!M\?'@CG7P``(`X*("$8`0`O8`!``!(>..#?P``@#@L@(1@#`"]@`$`
+M`$AXXX-_``"`.#"`A&`0`+V``0``2'CC@W\``(`X-("$8`@`O8`!``!(>..#
+M?P``@#@@@(1@``"]@`$``$@<``&`I@,(?`@`@8,,`*&#&``A."``@$[8_R&4
+MI@((?"P``9`,`(&0W`$#@`$``"P<`()!`0``*"P`@$$&```L)`""00@``"Q$
+M`*)`````./__`&`4``&0!P``//__`&`H``!(```@/0``"8!0(`!\.!@`5!0`
+M`9```"`]```)@%`@`'PX&`!4&``!D`$`!#@0``&0@`$`//__`&`X`*!\"``!
+MD`@`@3@!``!(+``!@*8#"'PH`"$X(`"`3NC_(92F`@A\#`"ADQP``9!X&WU\
+M``"`."B`A&```*`X`0``2'CKHW\``(`X!("$8`$``$@$`&5D$@.E5'CKHW\`
+M`(`X!("$8`$``$AXZZ-_``"`.""`A&```*`X__^E8`$``$@<``&`I@,(?`P`
+MH8,8`"$X(`"`3NC_(92F`@A\#`"ADQ``P9,4`.&3'``!D'@;?WQX(YY\>!M]
+M?!(`!*`````L9`""00``@#@$@(1@`0``2!``961X^^-_``"`.`2`A&`!``!(
+M$`"^H'C[XW\``(`X)("$8`$``$@2`+Z@>/OC?P``@#@X@(1@`0``2!0`OH`X
+M&*54>/OC?P``@#@P@(1@(```2```@#@$@(1@`0``2!0#951X^^-_``"`.`2`
+MA&`!``!(>/OC?P``@#@H@(1@``"^@`$``$AX^^-_``"`.""`A&`!``!($`!C
+M5`@`'J!X`V5\&``^H0``"2P0`()!!``).%Z"`%1X`Z5\>/OC?P``@#@@@(1@
+M`0``2-`NO8`>!J54&@`>H"Y$`%1X`Z5\T"Z]D'C[XW\``(`X&("$8`$``$AX
+M^^-_!$"`.`$``$@>`&54'``^@?W_*3DX'"E5>$NE?'C[XW\$0(`X`0``2!P`
+M`8"F`PA\#`"A@Q``P8,4`.&#&``A."``@$[X_R&4I@((?`P``9`(0(`X`0``
+M2/__(S$0&0E\>`,#?`P``8"F`PA\"``A."``@$[H_R&4I@((?!``P9,4`.&3
+M'``!D'@;?GQX(Y]\P`"`.`$``$C__P,L%`"B0````#@``!^0``!@.-```$@%
+M`0`\NM@`8#@`8'P``!^0"`!I=`P`@D$`0`!D```?D`4`8'`0`()!```?@`$`
+M`&```!^0P`5I<!``@D$``!^`0```8```'Y`@`&!P'`""06@2'H`````L$`""
+M00``'X``0`!D```?D```'X``0`ET6`"B05`2?I!X\\-_Q`"`.`$``$A4$GZ0
+M>//#?\@`@#@!``!(6!)^D'CSPW_,`(`X`0``2%P2?I!X\\-_T`"`.`$``$A@
+M$GZ0>//#?]0`@#@!``!(9!)^D`$`8#@<``&`I@,(?!``P8,4`.&#&``A."``
+M@$XX+&.`(`"`3NC_(92F`@A\"`"!DPP`H9,0`,&3%`#ADQP``9!X&WU\>".?
+M?'@;?GPX+(.#```<+!P`H$`D`(`X``"@.`$``$AXZZ-_)`"`.`$``$@%`0`\
+MNM@`8#@`Y7]``.!S1`""03PL'H`````L"`""04``I6!`+!Z`````+`@`@D$`
+M`:5@1"P>@````"P(`()!@`"E8$@L'H`````L"`""00`$I6`!`.!S"`""00<`
+MI6``0.!W"`""00@`I61XZZ-_H`"`.`$``$@X+/Z3```?+!0`H$!XZZ-_)`"`
+M.`$`H#@!``!(>..#?QP``8"F`PA\"`"!@PP`H8,0`,&#%`#A@Q@`(3@@`(!.
+M@`!@."``@$[X_R&4I@((?`P``9!_``0H(`"A030HA%0!`(0\'(B$.`$``$@!
+M```X`(!I<`@`@D`````X>`,#?`P``8"F`PA\"``A."``@$[H_R&4I@((?`P`
+MH9,4`.&3'``!D'@;?WP````X?P`$*)``H4$T*)U4`0"]/P"(G3@``*`X`0``
+M2`2(G3AX^^-_``"@.`$``$@(B)TX>/OC?P``H#@!``!(#(B=.'C[XW\``*`X
+M`0``2!"(G3AX^^-_``"@.`$``$@4B)TX>/OC?P``H#@!``!(&(B=.'C[XW\`
+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
+M`*&#$`#!@Q0`X8,8`"$X(`"`3NC_(92F`@A\#`"ADQP``9!X&WU\``"`.!2`
+MA&`!``!(_H1D5'CKHW\!``!('``!@*8#"'P,`*&#&``A."``@$X!`&`X(`"`
+M3B``@$X``&`X(`"`3B``@$X@`(!.^/\AE*8""'P,``&0``"`.!R<A&`!``!(
+M/@9C5`P``8"F`PA\"``A."``@$[X_R&4I@((?`P``9```(`X6("$8`$``$A^
+M!V-4#``!@*8#"'P(`"$X(`"`3OC_(92F`@A\#``!D'X'A50``(`X6("$8`$`
+M`$@,``&`I@,(?`@`(3@@`(!.K"YC@"``@$[X_R&4I@((?`P``9`T$J.````%
+M+!``HD"L+H.0`0!@.`@``$@!``!(#``!@*8#"'P(`"$X(`"`3OC_(92F`@A\
+M#``!D`$`!"P@`()``0`%*!``@4`-`&`X!0`%+!``@D```&`X"```2`$``$@,
+M``&`I@,(?`@`(3@@`(!.^/\AE*8""'P,``&0"P`$+"``HD!\!\54^`&CD```
+M@#A(@(1@`0``2`$`8#@(``!(`0``2`P``8"F`PA\"``A."``@$[X_R&4I@((
+M?`P``9`!``!(__\C,1`9"7QX`P-\#``!@*8#"'P(`"$X(`"`3NC_(92F`@A\
+M$`#!DQ0`X9,<``&0>!M_?```!"QT`()!!$"`.`$``$@:!&54>/OC?P1`@#@!
+M``!("@!@.`$``$@*`,`[>/OC?Q!`@#@!``!(`0!@=#``@D'(`&`X`0``2'C[
+MXW\$0(`X`0``2!H$951X^^-_!$"`.`$``$C__]XWQ/^"0```8#@``!XL+`""
+M07C[XW\``(`X!("$8`$``$B8`V54>/OC?P``@#@$@(1@`0``2`$`8#@<``&`
+MI@,(?!``P8,4`.&#&``A."``@$[H_R&4I@((?`P`H9,4`.&3'``!D'@;?WQX
+M(YU\``"`.`2`A&`!``!(!`!E9'C[XW\``(`X!("$8`$``$@``!TL(`"B07C[
+MXW\$0(`X`0``2!H$951X^^-_!$"`.`$``$@<``&`I@,(?`P`H8,4`.&#&``A
+M."``@$[H_R&4I@((?`P`H9,4`.&3'``!D'@;?WQX(YU\``"`.`2`A&`!``!(
+M!`!E9'C[XW\``(`X!("$8`$``$@``!TL(`"B07C[XW\$0(`X`0``2!H$951X
+M^^-_!$"`.`$``$@<``&`I@,(?`P`H8,4`.&#&``A."``@$[H_R&4I@((?`P`
+MH9,0`,&3%`#ADQP``9!X(Y]\>"ND?'@;?GP!`*`[`0`?+"0`@D$!`!\H$`"`
+M00(`'RP<`()!(```2/W]_TMX&WU\'```2,'^_TL4``!(,?__2PP``$@``&`X
+M#```2*@N_I-XZZ-_'``!@*8#"'P,`*&#$`#!@Q0`X8,8`"$X(`"`3OC_(92F
+M`@A\#``!D`1`@#@!``!(OH=C5`P``8"F`PA\"``A."``@$[H_R&4I@((?!0`
+MX9,<``&0`@`$+#P`@D$"``0H$`"!00$`!"P4`()!-```2`0`!"P4`()!*```
+M2```(#T``.D[)```2```(#T``.D[&```2```(#T``.D[#```2```8#@0``!(
+M>/OD?P$``$AX^^-_'``!@*8#"'P4`.&#&``A."``@$[X_R&4I@((?`P``9`,
+M`(`X`0``2`P``8"F`PA\"``A."``@$[X_R&4I@((?`P``9!X(X5\#`"`.`$`
+M`$@,``&`I@,(?`@`(3@@`(!.^/\AE*8""'P,``&0"`"`.`0`H#@!``!(#``!
+M@*8#"'P(`"$X(`"`3NC_(92F`@A\#`"ADQP``9!X&WU\"`"`."``H#@!``!(
+M>.NC?P@`@#@$`*`X``#`.`$``$C__R,Q$!D)?'@#`WP<``&`I@,(?`P`H8,8
+M`"$X(`"`3NC_(92F`@A\#`"ADQP``9!X&WU\``"`.$B`A&`!``!(\@9E5'CK
+MHW\``(`X2("$8`$``$@<``&`I@,(?`P`H8,8`"$X(`"`3NC_(92F`@A\#`"A
+MDQP``9!X&WU\``"`.$B`A&`!``!((`!E8'CKHW\``(`X2("$8`$``$@<``&`
+MI@,(?`P`H8,8`"$X(`"`3NC_(92F`@A\"`"!DPP`H9,<``&0>!M]?'@C@'QX
+M*[Q\``"`.$"`A&!X`P5\`0``2'CKHW\``(`X1("$8'CCA7\!``!('``!@*8#
+M"'P(`(&##`"A@Q@`(3@@`(!.Z/\AE*8""'P0`,&3%`#ADQP``9!X&WY\>".?
+M?```8#@_``0H;`"!01\`!"@T`(%`>//#?P``@#A$@(1@`0``2.#_'SC^_Z`X
+M/@"E7#@H97QX\\-_``"`.$2`A&`L``!(>//#?P``@#A`@(1@`0``2/[_H#@^
+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
+M\\-_%`"`.`$``$AX\\-_>-MD?P$``$@#`"`Y```#+#0#@D$&`!<L0`""000"
+M'H`#``EP-`"B07CSPW\``(`X1)F$8`$``$C"`&54!`(>@(3H`%1X`Z5\>//#
+M?P``@#A$F81@`0``2'CSPW]XVV1_!1$`2'CSPW]XHX1^20@`2`,`(#D```,L
+MS`*"0<@!'J```"`Y&_$I80!(`'PD`*)``@`;H(``"7`8`*)!>//#?P``@#@(
+MV(1@`@6@.`$``$AX\\-_``"`.!R8A&`!`*`X`0``2'CSPW\``(`X%)F$8`$`
+M`$B^!&-4`@`;H,S,(#W-S"EA%D@C??[H)54@``EP&`""03H0:50NN@`\HXL`
+M8!8`*7T^X2559`!E.`$``$AX\\-_``"`.&"8A&`!``!(`0!E8'CSPW\``(`X
+M8)B$8`$``$AX\\-_``"`.&"8A&`!`*`X``#`.`$``$AX\\-_>*.$?@$``$@`
+M``,L(`"B0`(`&Z`@``EP#`""0`(``&`"`!NP`P`@.<P!`$BP+AJ`````+"0`
+MHD%X\\-_``"`.""9A&`!`*`\`/"E8`$``$@!```XM"X:D```X#L!`*`[.A#D
+M5P`0A#@P^*5_>//#?P$``$@!`/\["0`?+.3_@4```.`[>//#?WC[Y'\!``!(
+M`0#_.PD`'RSL_X%`>//#?Z0`@#@!`*`\`0"E8`$``$AX\\-_J`"`.`$`H#@!
+M``!(>//#?ZP`@#@!`*`X`0``2'CSPW^P$(`X`0``2'@;97QX\\-_L!"`.`$`
+M`$AX\\-_H`"`.`@`H#QE":5@`0``2`@``#QE"0!@."P:D'CSPW^L`(`X`0``
+M2`<`961X\\-_K`"`.`$``$@&`!<L+`"B0'CSPW^@`(`X`0``2``096!X\\-_
+MH`"`.`$``$@X+!J``!``8#@L&I!,$AZ`````+`P`HD%X\\-_`0``2'CSPW\`
+M`(`X(("$8`$``$A,`F54>//#?P``@#@@@(1@`0``2-0NFH#__P0L#`""07CS
+MPW\!``!(V"Z:@/__!"P,`()!>//#?P$``$C<+IJ`__\$+`P`@D%X\\-_`0``
+M2/@!OH````4L%`"B07CSPW\``(`X2("$8`$``$C<`?Z2`0!@.!@``$@``!.`
+M````+`@`@D$``#.1``!@.(P``8"F`PA\0`#!@40`X8%(``&"3``A@E``08)4
+M`&&"6`"!@EP`H8)@`,&"9`#A@F@``8-L`"&#<`!!@W0`88-X`(&#?`"A@X``
+MP8.$`.&#B``A."``@$[X_R&4I@((?`P``9`"`(`X200`2`P``8"F`PA\"``A
+M."``@$[H_R&4I@((?!0`X9,<``&0>!M_?```@#@!`*`X`0``2````#@```,L
+M*`"B07C[XW\3`(`X`00`2````#@```,L$`"B030(8#@!``!(`0``.'@#`WP<
+M``&`I@,(?!0`X8,8`"$X(`"`3NC_(92F`@A\$`#!DQ0`X9,<``&0>!M_?'@C
+MGGP``(`X`0"@.`$``$@````X```#+)P!@D'V!<!7P```+(@`@D$8`(%!H```
+M+#0`@D&P```L+`""02P!`$A``0`LN`""01``@4'0```L7`""010!`$A0`0`L
+MH`""00@!`$AX^^-_``"`.`28A&```*`X`0``2'C[XW\``(`X`**$8`,`H#@!
+M``!(>/OC?P``@#A\F(1@&0"@.`$``$@L`6`X`0``2,```$AX^^-_``"`.`28
+MA&```*`X`0``2,@!'Z`2```LH`"B0'C[XW\``(`X?)B$8!@`H#@!``!(+`%@
+M.`$``$AX^^-_``"`.`"BA&`"`*`X;```2!``P',8`()!>/OC?P``@#@$F(1@
+M`P"@.!0``$AX^^-_``"`.`28A&```*`X`0``2,@!'Z`2```L-`"B0'C[XW\`
+M`(`X?)B$8!@`H#@!``!(+`%@.`$``$AX^^-_``"`.`"BA&```*`X`0``2'C[
+MXW\3`(`X10(`2````#@```,L.`"B030(8#@!``!(>/OC?P``@#@!`*`X`0``
+M2````#@```,L%`"B07C[XW\``(`X"0(`2'@;8'QX`P-\'``!@*8#"'P0`,&#
+M%`#A@Q@`(3@@`(!.V/\AE*8""'P,`"&3$`!!DQ0`89,8`(&3'`"ADR``P9,D
+M`.&3+``!D'@;?WQX(YI\>"NY?'@;>WP!``!(>!M^?```8#@``!XL<`&"0;0N
+M'X`````LS`"B07C[XW\``(`X()F$8`$``$@!`&-TM`"B0+0N?Y!X^^-_``"`
+M.!"<A&`!``!(>!M\?'C[XW\``(`X%)R$8`$``$AX&WU\>/OC?P``@#@8G(1@
+M`0``2'@;:GQ^^(!7?OBI5Q1*`'S^R0M4OM&C5___"S`062!]__\#,1`9"'PY
+M`"A]2`"B0=``JG_66[U_O@:]5]8;G'_^!IQ7>/OC?P``@#@@F81@`0``2#0H
+MO5=XZV5\>..E?``(I6!X^^-_``"`.""9A&`!``!(>/OC?WCSQ'\1!`!(```#
+M+"``@D`"`!J@`@``8`(`&K`"`!Z@^@<`5`(`'K!(``!(>/OC?WCSQ'\!``!(
+M```#+#P`@D"($V`X`0``2'C[XW]X\\1_`0``2````RP@`()``@`:H"``"'`,
+M`()``@``8`(`&K```&`X(```2'C[XW]='`!(M"X;@````"$4`0A\```9D`$`
+M8#@L``&`I@,(?`P`(8,0`$&#%`!A@Q@`@8,<`*&#(`#!@R0`X8,H`"$X(`"`
+M3NC_(92F`@A\#`"ADQ``P9,4`.&3'``!D'@;?GQX(Y]\>".=?```!"P(`()`
+M__^@.WCSPW\,`(`X`0``2'CSPW\`0(`X>/OE?P$``$@/`&`X`0``2+X'_U>^
+M![U7>//#?P!`@#AXZZ5_>/OF?P$``$AX&WU\`0#@<Q0`HD!X\\-_%`"`.```
+MH#@!``!(>.NC?QP``8"F`PA\#`"A@Q``P8,4`.&#&``A."``@$[H_R&4I@((
+M?`@`@9,,`*&3$`#!DQ0`X9,<``&0>!M\?'@CGGP``(2@`@"^H`$``$@T!WU\
+M`@`>H```X#MXZZ-_@``)<#0`HD$,`+T?```@/>0`*3D42KU_!`!]@`@`@#@!
+M``!(]"Q_5```'8`V(`!4>`/_?P@`?:B0``,L#`"!00$`8'`<`()!Z/]C.`@`
+M@#@!``!(/@9]5`$``#@@``!(Z/]C.'`.8WR4`6-\"`"`.`$``$@^!GU4````
+M.#H0O5<\"`!4>`.]?P$$O6,N1.57/@:@5W@#I7QXXX-_``"`.)R8A&`!``!(
+M+@3E5S[&H%=X`Z5\>..#?P``@#C0F(1@`0``2#02W),!`&`X'``!@*8#"'P(
+M`(&##`"A@Q``P8,4`.&#&``A."``@$[X_R&4I@((?`P``9```(`X9)B$8`$`
+M`$C^;6-4``%@<`P`@D'_`6!H^``#?`P``8"F`PA\"``A."``@$[H_R&4I@((
+M?`@`@9,,`*&3$`#!DQ0`X9,<``&0>!M_?'@CGGQX*[U\``"`.&28A&`!``!(
+M)@!E5"Q-P%=X`Z5\_@6]5WCKI7QX^^-_``"`.&28A&`!``!(>/OC?P``@#A@
+MF(1@`0``2`(`96!X^^-_``"`.&"8A&`!``!(.`"`.P``'BP(`()!``Z>'P``
+MH#MX^^-_``"`.&"8A&`!``!(`@!@<!@`@D%XXX-_`0``2`$`O3L[`!TLV/^!
+M0```8#@[`!TL#`"A07C[XW_Y_O]+'``!@*8#"'P(`(&##`"A@Q``P8,4`.&#
+M&``A."``@$X"``2@]`4`5,```"PL`()!$`"!0:```"P8`()!+```2$`!`"PD
+M`*)`S!(#H!```$C.$@.@"```2-`2`Z````6P`0!@."``@$X``&`X(`"`3N#_
+M(92F`@A\&`#!DQP`X9,D``&0>!M^?'@CGWP(`*$XD?__2P```#@```,L4`"B
+M07CSPW\``(`X8)B$8`$``$AX\\-_0?[_2P@``:@`&`!\$`"`0`(`'Z`"``!@
+M`@`?L!8`?[`!`"`Y"``!J``8`'P(`(!````@.7A+('UX`P-\)``!@*8#"'P8
+M`,&#'`#A@R``(3@@`(!.T/\AE*8""'P<`&&3(`"!DR0`H9,H`,&3+`#ADS0`
+M`9!X&W]\>".=?,P!`X`#```H@`"!00$``$@```,L=`"B07C[XW]XZZ1_"`"A
+M.,W^_TL````X```#+(``@D$``,`[```@/0``B3L``&`[KO"<?'C[XW\``*`X
+ML?W_2P@``:@`&`!\#`"`0!8`?;,(``!(%@!]L`$`WCL#`!X@````.!0!`'P"
+M`!XH,`"!0<#__TMX^^-_``"`.&"8A&`!``!(`@!E8'C[XW\``(`X8)B$8`$`
+M`$@!```X>`,#?#0``8"F`PA\'`!A@R``@8,D`*&#*`#!@RP`X8,P`"$X(`"`
+M3@``0#D``&2A```@/0``":!```M\'`"!00``*3D!`$HY.A!`52X""7Q```M\
+M\/^!0#H02U4``"`]```I.11*:WT"``NH555@/%958V"6&&!\</X`?%`88'PT
+M!V-\(`"`3LC_(92F`@A\$`#!DA0`X9(8``&3'``ADR``09,D`&&3*`"!DRP`
+MH9,P`,&3-`#ADSP``9!X&WA\>!M^?`(`!*"```EP)@#@?_X?_U<"`/\C]`4`
+M5,```"P4`8)!$`"!0:```"SL`()!(`$`2$`!`"P8`:)````DH5_P*3GJ!`DH
+M$`"!0503(Z-6$\.B6```2```)*%TZRDY[P`)*!``@4%8$R.C6A/#HCP``$@`
+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
+M`,&3-`#ADSP``9!X&WU\>".<?'@;?WP"``2@]`4`5,```"Q``()!$`"!0:``
+M`"Q8`()!>```2$`!`"QP`*)`YA,#H`P``;#2$P,X"``!D.@3`S@0``&02A=#
+MHTP78SMD``!(\!4#H`P``;#R%0,X"``!D!(6`S@0``&0G!=#HYX78SM```!(
+M\!4#H`P``;#X%0,X"``!D*X6`S@0``&0O!=#H[X78SL<``!(``!@.(P``$@R
+M,&E5%$H_?=07R3M@``!(``"\H'CKHW\(`($XE0``2```P#MXZZ-_>..$?P$`
+M`$@``&`Y=!,?H```'GPP`(!`>`,*?#P(:544^BE]=A,)H````"P,`()!`!@`
+M?*3_HD$!`&LY`%`+?-S_@$$^!$97>.NC?WCSQ']XVV5_>..'?SD$`$@!`&`X
+M/``!@*8#"'P@`$&#)`!A@R@`@8,L`*&#,`#!@S0`X8,X`"$X(`"`3LC_(92F
+M`@A\$`#!DA0`X9(8``&3'``ADR``09,D`&&3*`"!DRP`H9,P`,&3-`#ADSP`
+M`9!X&W=\>".9?'@KNGP``,`Z/P``.P``8#P``&,X"`&`.`$``$@``&`\``!C
+M.(``@#@!``!(```@/0@`:3L``"`]B`").P$`X#L``,`[/`C`5RX#^W\!`!\X
+M/@0?5`$`'C@^!!Y4/P`?*.3_@4```"`]```I.08`R;,!```X`@`)L#\``#@$
+M``FP``#`.P8`":`````H.`"!0```(#T``.D[/`C=5R[:G7QXTT-_>,LE?T$(
+M`$@NXWU\`0`>.#X$'E0&`!^@0/``?-C_@4$``'RI```@/08`":`\"`E4%.(I
+M??[_Z:@``,`[````*&P`@4```"`]``#).#P(P%>N`AQ\`%@`?`P`@4%X`PM\
+M>//6?P8`)J%02#Y]__\I.?__/W$X`()!/`C@5Q3B`'W^_RBI+@)<?30'0'T`
+M``E\"`"!0/[_2+$!`!XX/@0>5`8`!J!`\`!\I/^!00``P#L``"`]!@`)H```
+M`"@P`(%`>`,)?#P(P%>N`AQ\`#@`?`P`@4!X`P=\>//8?P$`'C@^!!Y40/`)
+M?-S_@4$9`&LYZU$@/1^%*6&62`M\<"8`?'#^:WU0``M\,@``'#0''7P``,`[
+MED@]?7`F*7UP_J!_>`,+?%!(('T``.`[`0`)-$@`@4```"`]``!).>M1(#T?
+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
+M`@A\*`!!DRP`89,P`(&3-`"ADS@`P9,\`.&31``!D'@;>GQX(YY\>"N_?`@`
+MP3@U`0!(```#+`P`@D$(`&&@_```2`0`OZ!XTT-_``"?@`H`P3@,`.$X/0(`
+M2`H`@:!X\\-_>/OE?PX`P3@0`.$XY0(`2`P`@:!X\\-_>/OE?Q(`P3@4`.$X
+MS0(`2`H`8:`.`(&@%@"!.WC[Y7]XXX9_Q0``2`H`8:`0`(&@&`"A.WC[Y7]X
+MZZ9_K0``2`X`@:`0`*&@%@#!H!@`X:!X\\-_````.2$!`$AX&WM\#`!AH!(`
+M@:!X^^5_>..&?WD``$@,`&&@%`"!H'C[Y7]XZZ9_90``2!(`@:`4`*&@%@#!
+MH!@`X:!X\\-_````.=D``$AX&V=\"@"!H`P`H:!XTT-_>-MF?P```#F]``!(
+M1``!@*8#"'PH`$&#+`!A@S``@8,T`*&#.`#!@SP`X8-``"$X(`"`3@@`18$`
+M```Y!``%H````"AX`(%````*H``8`'Q4`*)`"`!J.0``(#D&``J@````*$``
+M@4````N@`"``?!P`HD`\""E5%%(I?1X`":````:P`0!@."``@$X"`&LY`0`)
+M.#X$"50&``J@0$@`?,C_@4$T`$HY`0`(.#X$"%0$``6@0$``?)#_@4$``&`X
+M(`"`3G@;8'QD`&`Y``!@.-<Y)GT@`()-```(+`@`@D$!`&`Y`"`%?&0`@D%0
+M``1\9```'%`H)'W62P!\-0<`?!``H$!X,\E\9``&'!0``$AD```L'`"!0'@[
+MZ7QD``<</@0#5```""P@`(),&```2-8Y('UD```@UC$`?!0"*7W66RE]/@0C
+M52``@$YX,\-\```(+"``@DUD``8</@0#5"``@$X\"*E4%"(I??[_::%D`&,<
+M```$H&0`(!WV_RDY0$@#?!``@$````:P```$H"@``$AD`"L="@`I.4!(`WPP
+M`(%```!FL0``9[$@`(!.```&L"XB"GP```>P(`"`3BX"!'P```:P`@`*H.S_
+M_TL``&`Y`"@+?"``@$P\"&I5+B(*?&0`(!U02"-]"0`I.1(`"2B\_Z%`>%-`
+M?10B2GT"`"JA9``I'?;_*3E`2`-\L/^@00$`:SD`*`M\(`"`3+S__TOX_R&4
+MI@((?`P``9`(`"6!``!@.00`!:!X`PI\```+?"``@$````F@`"``?!0`@D$T
+M`"DY`0!K.0!0"WSH_X!!"`").`8`J:#Y_O]+#``!@*8#"'P(`"$X(`"`3A`L
+M8SD``"`]!``)@!`L`Y`<```<```@/0@`*3D42@!\&``+D`$``#@4``N0%```
+M.`P`"Y`C```X$``+D"``@$XT$B.!`@`)H"``"7`@`()!```@.1P`8#E````Y
+M<@!`.0P`))%W```X(```2```(#DR`&`Y````.3(`0#D4```X#``$D",``#@0
+M``20!`"$@```8#@0(`E\$`$`?-```'P06"1]$$DI?=``*7UY2PM\(`""31`@
+M"'P0`0!\T```?!!0)'T022E]T``I?7E+"WP@`()-`0!@."``@$[H_R&4I@((
+M?`P`H9,<``&0>!M]?,0NHX!L3*54`("E8```@#@PF81@`0``2`$``#C`+AV0
+M'``!@*8#"'P,`*&#&``A."``@$[H_R&4I@((?`P`H9,0`,&3%`#ADQP``9!X
+M&W]\$"S#.Q0`'H```&`X````+(@`@D'`+A^``0``+'@`HD!X^^-_``"`.#"9
+MA&`!``!(`(!I<&``HD!^/F!4!``>D,`N/Y%X^^-_>//$?[7^_TL```,L0`"B
+M0'C[XW]X\\1_50``2````RPL`*)!>/OC?WCSQ']I``!(```#+!@`@4!X^^-_
+M>//$?_4!`$@"```XP"X?D,`N?X`<``&`I@,(?`P`H8,0`,&#%`#A@Q@`(3@@
+M`(!.``!@.`0`)($,``2`0``)?!``@4`0``2`0``)?"``@$T!`&`X(`"`3A0`
+M!(#__V`X````+"``@DT``&2!'``+'```(#T(`"DY%$H`?!@`!)`$`"2!$``$
+M@$``"7R8`(!!__]@.```"RP@`()-!``D@0@`))$0``2`>`,'?$``"7QL`(!!
+M```$@````"Q@`()!```@/0``J3@``"`]"`#).```)('__PDY```$D1P`2!T4
+M*BI]&`!D@1``"8`(`"N!4``)?#P(`%0(`"2!4$@@?0@`))$4,DI]&`!$D4`X
+M"7P,`(!!```(++C_@D`!`&`X(`"`3@0`)($,``2```!@.$``"7P@`(%-```@
+M/0``*8'__RDY```$@/[_8#@`2`!\(`""300`)($(`"21#``$@'@#!GQ```E\
+MB`"!00``(#T``"F!__\I.0``!(!X`PM\0$@`?&P`@$```"`]``!I.```(#T(
+M`*DX```@/0``*8'__^DX`0`+.0``!)$<`$@=%!HJ?1@`9($0``F`"``K@5``
+M"7P\"`!4"``D@5!(('T(`"21%"I*?1@`1)%`,`E\$`"!07A#"WU`.`A\N/^`
+M00(`8#@@`(!.%``$@````"P@`()-&``D@0``":#0$P.P&``D@0(`":#.$P.P
+M&``D@00`":#,$P.P&``D@08`":#*$P.P(`"`3NC_(92F`@A\#`"ADQ``P9,4
+M`.&3'``!D'@;?GQX(Y]\>!M]?```@#@$@(1@`0``2#X$8U0!`!\L2`""01``
+M@4$``!\L+`""050``$@&`!\L$`""00@`'RPH`()!0```2,@NOH!X*V5\@0"E
+M9"```$C(+KZ`>"ME?$(`I600``!(R"Z]@'@K97P@`*5D>//#?P``@#@$@(1@
+M`0``2!P``8"F`PA\#`"A@Q``P8,4`.&#&``A."``@$[X_R&4I@((?`P``9#<
+M`8.`.?__2PP``8"F`PA\"``A."``@$[H_R&4I@((?`P`H9,0`,&3%`#ADQP`
+M`9!X&W]\>".=?`$``$AX&WY\?@!D5'C[XW\!``!(>/OC?S``@#@!``!(ON9I
+M5```'2P4`()!)0`)('[X`%04`BE]*```2`$`"2@,`(%`__\I.1@``$AX^^-_
+M>//$?P$``$@``&`X+```2"H'952V)2!5>`.E?'C[XW\P`(`X`0``2'C[XW]X
+M\\1_`0``2`$`8#@<``&`I@,(?`P`H8,0`,&#%`#A@Q@`(3@@`(!.^/\AE*8"
+M"'P,``&0>!M@?```8#@)``0L&`"A03P`A!P4(H!\4"R$.'@#`WP!``!(#``!
+M@*8#"'P(`"$X(`"`3OC_(92F`@A\#``!D'@;8'QX*ZM\``!@.`D`!"P<`*%!
+M/`"D'!0JH'Q0+*4X>`,#?'A;9'T!``!(#``!@*8#"'P(`"$X(`"`3MC_(92F
+M`@A\%`!ADQ@`@9,<`*&3(`#!DR0`X9,L``&0>!M]?'@CGGQX*[Q\>!MI?`(`
+M!"PD`()!`@`$*!``@4$!``0L)`""03@``$@#``0L$`""02P``$@)`&`[+```
+M2`@`8#LD``!(``!@.U0L`X```&`X````+(@`@D`,``!(__]@.'P``$@\`!L<
+M%`+I?U`L_SL$`!^`__]@.````"Q@`()`>/OC?SP`@#@!``!(!`#?DP``'"PT
+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
+M`(%!4```+`@``$B@```LD`""0=0!'Z`````LA`""0,P!'X`%```L(`"B0-`!
+M'X!#`"`]"0`I80!(`'P,`*)`1@``.%@``$C,`1^`!P`):```:2$422M]"P``
+M:```8"$4`0M\>0,K?0P`@D%1```X+```2,P!'X`*`(`O'`">00D``"P4`()!
+M&`">0-`!'Z`#```H#`"!06(``#C4`1^PS`$?@`H`@"\\`)Y!"0``+#0`@D$0
+M`)Y`T`$?H`,``"@D`(%`U`$?H#8&"530_RDY/P`)*!``@4$^!P!4!```+)0"
+M@4!X^^-_P0"`.`@`H3@!``!(```#+/0#@D$(``&@`3``*`P`@4$%```XY`,`
+M2`@``:!P$ANP>/OC?Q!`@#@!``!(ON]C5`(``RPT`()!`P`#+"0`@D',`1^`
+M"0``+"``@D$*```L$`""0-`!'Z`#```H#`"!0`H``#B4`P!(>/OC?S\`@#@(
+M`*$X`0``2````RQX`X)!"``!H'(2&[!X^^-_'`"`.`@`H3@!``!(```#+%@#
+M@D$(``&@0`.`.P```"PL`*)!'F$<5'C[XW\;`(`X"`"A.`$``$@```,L+`."
+M00@``:!X`YQ_0/^<.P``H#L``,`[0.`=?#``H$#``)XX>/OC?P@`H3@!``!(
+M```#+/@"@D$(``&@>`*]?P$`WCM`X!Y\V/^`00```#C__P!@```=?`P`@D$'
+M```XT`(`2`H``#CF$QNP`P``./`5&[```,`["P``.#0`/AT4VBE][A,)L`$`
+MWCL)`!XH[/^!0```P#L``"`]``#I.```(#T```DY"P!`.3P(RU<4VBM]\!4I
+M.2XZ"WP(``FP+D(+?`(`";`T`#X=%-HI?;062;$8%DFQ`0#>.P(`'BC,_X%`
+M<!*;.'C[XW\!``!(```#+#@"@D%P$AN@`E``*$0`@4',`1^`"@"`+QP`GD$)
+M```L%`""02P`GD#0`1^@`P``*"``@4%H!@`X`!8;L+`$`#@$%ANP`(``.`@6
+M&[#^%1NPBA(;H````"QP`()!U`$?H#8&`%00```L8`"B0'C[XW\``(`X`)B$
+M8`=`H#@!``!(T`=@.`$``$AX^^-_`0``2-8!?[!X^^-_``"`.`"8A&`'`*`X
+M`0``2-`'8#@!``!(U@$?H#8&`%0@```L#`""00T``#AX`0!(>/OC?[\`@#@(
+M`*$X`0``2````RQ<`8)!"``!H'02&[!T$AN@"`(?L'C[XW\!``!(```#+#P!
+M@D',`1^`"@"`+QP`GD$)```L%`""02``GD#0`1^@`P``*!0`@4%X^^-_#`"!
+M.`$``$AH``!(S`$?@`<`"6@``&DA%$DK?0L``&@``&`A%`$+?'D#*WT4`*)!
+M>/OC?PP`@3@!``!(-```2-0!/Z$V!BE5T/\I.3\`"2@4`(%!>/OC?PP`@3@!
+M``!($```2'C[XW\,`($X`0``2````RRD`()!Q"P;@,`!'Y!X^^-_`0``2```
+MH#L``,`['P">('C[XW\(`*$X`0``2````RQL`()!"``!H!0"O7\\",E7%-HI
+M?3["`%0P+`F8"``!B#$L"9@!`-X[`@`>*,#_@4```#TA%.D)?`(`8#W]_VMA
+M>%JI?P``:2$422M]>4L+?`P`@D$)```X&```2'C[XW\%]_]+>/OC?S```$@(
+M```X#``!D```&RP,`()!>-MC?P$``$@``!HL#`""00P``8```!J0``!@.#0`
+M`8"F`PA\&`!!@QP`88,@`(&#)`"A@R@`P8,L`.&#,``A."``@$[H_R&4I@((
+M?!0`X9,<``&0>!M_?`$``$BH+!^`````+!``HD%X^^-_I@,(?"$`@$YX^^-_
+M`0``2'C[XW\!`(`X`0"@.`$``$AP$I\X>/OC?P$``$AX^^-_`0``2!P``8"F
+M`PA\%`#A@Q@`(3@@`(!.J/\AE*8""'P\`"&30`!!DT0`89-(`(&33`"ADU``
+MP9-4`.&37``!D'@;?'P``"`]X!)I.>`2"8`$`"N!"``!D`P`(9$``&`]Z!(K
+M.>@2"X`$`&F!"`!)@0P`*8$H``&0+`!AD3``09$T`"&1```@.P@`03LZ$"!7
+M%-*@?RX`VG]XXX-_>//$?P$``$@0`'V0``#@.QZ`X%=X^QU\>..#?WCSQ']X
+MZZ5_`0``2'CC@W]X\\1_`0``2````#@`Z`-\B`""0`$`_SO_`!\LR/^!0```
+MX#L(`&$[.A#I5Q3:*7T@`*F#>..#?WCSQ']XZZ5_`0``2'CC@W]X\\1_`0``
+M2````#@`&!U\0`""0`$`_SL#`!\LQ/^!0#H0(%<4TB!]>..#?RX`FGP0`*F`
+M`0``2`$`.3L!`!DL//^!0&0`8#@!``!(`0``.'@#`WQ<``&`I@,(?#P`(8-`
+M`$&#1`!A@T@`@8-,`*&#4`#!@U0`X8-8`"$X(`"`3@`!@'`4`()!,Q,`.```
+M!;#4%P`X,```2(``@'`T`()!BA(#H````"P0`()`C!(#H````"P<`()!"`D`
+M.```!;"L"@`X```&L`$`8#@@`(!.``!@."``@$[@_R&4I@((?!``@9,4`*&3
+M&`#!DQP`X9,D``&0>!M^?'@;?7QX&WQ\X`'C.P```#@(``&P<!(#H`!0`"@D
+M`*%`H`$#@*8#"7S)`(`X"`"A."$$@$X````X```#+!@$@D'4`1Z@-@8`5$``
+M`"P,`*)`````.(82';`(``&@````+#``@D#,`1Z`!P``+"0`HD#0`1Z@"```
+M+!@`HD`%```X"``!L`$``#AV$AVP>!(=L-P!'(`&```L/`""0<H!'*!E<``L
+M,`"B0`@"/*&<_PDX`0``*`P`@4$%``DX%```2`@"'*!!```L#`"B0$,``#@(
+M`ARP````.`0`'Y"&$AV@````+"``@D$!```X!``?D'82':`````L#`""0`,`
+M`#@$`!^0BA(=H````"P0`()!!``?@`0``&`$`!^0C!(=H````"PP`()!R@$<
+MH!$.`"PD`()!!``_@0@`(&$$`!^0>!(=H````"P,`()`*``@800`'Y`("0`X
+M$``?L-0!/J$V!BE5T/\I.3\`"2A(`(%`S`%^@0<`8&D``"`A%`$)?`L`:6D`
+M`$DA%$DJ?7E+"GPD`()`"@"++QP`GD$)``LL%`""01@`GD#0`1Z@`P``*`P`
+M@4'$"0`X"```2*P*`#@2`!^P,Q,`.`P`'[#4%P`X#@`?L```'X"@!`!4`(``
+M8```'Y```&`Y"``!H`(`"7`H`()`S`$>@`4``"@8`(%!!0``+!0`HD#0`1Z@
+M`P``*`@`@4`!`&`Y```_@:1L:5&H!2E5"``!H`(``&C^_P!4``@I8:Q-"5``
+M`#^1S`$>@`8``"@,`(%``!`@80P``$@``!^`)`4`5```'Y```!^``P``8```
+M'Y#0`1R@`0``*!``@4',`1Z`"P``+&P`HD```"`Y"``!H`$`"G`4`()`!``?
+M@`D`"W`(`()!`0`@.0``'X!Z%R!1"`!AH0@`:6G^[RE5.!\@40``'Y```"`Y
+M!`!@<10`@D`$`!^`"0`*<`@`@D$!`"`Y```?@/8F(%&@``!@```?D```'X"P
+M!@!4```?D```(#DX$QV`````+!``@D$\$QV`````+`@`@D`!`"`Y```?@.Y%
+M(%$/``!D```?D,P!'(`%```L$`"B0-`!'*`(```L$`""0<P!'(`%```H$`"!
+M0```'X`0``!D```?D`@``:#P`0!P#`""07`F`'P(``!("@``.`@`'[`(``&@
+M`/``<!0`@D%P9@E\`0``.#!(`'P(``!(@```.`H`'[#4`3ZA-@8I5=#_*3D_
+M``DH$`"!00``'X!@``!D#```2```'X#0`@!4```?D'H2':`````L.`"B04@2
+MO#B@`7Z!I@-I?7CSPW\/`(`X(02`3@```RP8`()!`0``.$P2')```!^`@```
+M9```'Y#,`1Z`!``@(0``(#D422E]:!(\D0``(#D%```L$`"B0-`!'J`)```L
+M$`""0<P!'H`%```H"`"!0`$`(#D``!^`SL$@40``'Y`/```X%``?D`$``#AX
+M`P-\)``!@*8#"'P0`(&#%`"A@Q@`P8,<`.&#(``A."``@$[H_R&4I@((?!P`
+M`9`(`($X`0``2`$`8#@<``&`I@,(?!@`(3@@`(!.```@/0``*3D!``0L#`""
+M00``(#T``"DY<``CD2``@$[8_R&4I@((?"``P9,D`.&3+``!D'@;?WQX(YY\
+M``"`."B`A&`$`+Z``0``2'C[XW\``(`X+("$8`P`OH`!``!(>/OC?P``@#@P
+M@(1@$`"^@`$``$AX^^-_``"`.#2`A&`(`+Z``0``2```'H```0ET.`"B07C[
+MXW\(`($X`0``2#02?X$``$`Y```@.2@`*Y$L`$N1>/OC?P``@#@@@(1@``&@
+M/`$``$AX^^-_``"`.""`A&```+Z``0``2"P``8"F`PA\(`#!@R0`X8,H`"$X
+M(`"`3MC_(92F`@A\+``!D`P`@9#<`0.``0``+!P`@D$!```H+`"`008``"PD
+M`()!"```+$0`HD`````X__\`8!0``9`'```\__\`8"@``$@``"`]```)@%`@
+M`'PX&`!4%``!D```(#T```F`4"``?#@8`%08``&0`0`$.!```9"``0`\__\`
+M8#@`H'P(``&0"`"!.`$``$@L``&`I@,(?"@`(3@@`(!.Z/\AE*8""'P,`*&3
+M'``!D'@;?7P``(`X*("$8```H#@!``!(>.NC?P``@#@$@(1@`0``2`0`9602
+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
+M``!('``!@*8#"'P4`.&#&``A."``@$[H_R&4I@((?!0`X9,<``&0>!M_?`$`
+M`$@```,L(`&B07C[XW\00(`X`0``2`H"951X^^-_$$"`.`$``$AX^^-_$$"`
+M.`$``$CZ!V54>/OC?Q!`@#@!``!(>/OC?P``@#@$@81@`0"@.`$``$AX^^-_
+M``"`.!R`A&`!``!(8@9C5-0!/Z$V!BE5T/\I.8`396`_``DH"`"!0(`/96!X
+M^^-_``"`.!R`A&`!``!(>/OC?P``@#APF(1@'P"@.`$``$AX^^-_``"`.'28
+MA&!_`*`X`0``2'C[XW\``(`X>)B$8`X`H#@!``!(>/OC?P``@#CPF81@#`"@
+M.`$``$AX^^-_``"`./29A&#_`*`X`0``2-0!OZ`V!J54T/^E.#\`I2`0*:5\
+M>@>E5!0`I3AX^^-_``"`./B9A&`!``!('``!@*8#"'P4`.&#&``A."``@$X`
+M`$`Y``!DH0``(#T```F@0``+?!P`@4$``"DY`0!*.3H00%4N`@E\0``+?/#_
+M@4`Z$$E5``!@/0``:SD46BE]`@!IJ"``@$[H_R&4I@((?!``P9,4`.&3'``!
+MD'@KOWQX,]Y\>!MJ?.`!8SD=``0HG`*!00``(#U,`"DY.A"`5"X`"7P42@!\
+MI@,)?"`$@$X"``4L*`""00(`!2AH`H!!!``%*"0`@$$%``4H6`*!0'\`!2Q0
+M`H)!$```2```*X'^GRE5;`$`2`T`(#E0`@!(```@.0``!2Q$`H)!`0`%+!0`
+MHD#,+P.```@`;/XO"50L`@!(```?+!``@D$!`!\L%`"B05`!`$@```N`_J<)
+M5`P"`$C0+PJ`_O<)5``"`$C,`0.`!0``*"``@4$%```L$`"B0-`!`Z`'```H
+M#`"!00T`8#C4`0!(``!@.,P!`$@``"`Y```%+,0!@D$!``4L]`""0```@#@(
+MHH1@`0``2'Z;8U0!`&-H_@=I5*`!`$CX`0.`?`$`2```(#D```4LC`&"00$`
+M!2QL`:)`W"\#@!P``$@```4L$`""00$`!2P8`()!-```2(82`Z```&`A%`$K
+M?5@!`$B,$@.@````+#0!@D"*$@.@`0`@.0```"P\`8)!(`$`2`$`(#DP`0!(
+M```@.0``!2PD`8)!`0`%+%0`@D#,+P.`^```?/X/"50,`0!(```%+!``@D$!
+M``4L)`"B03```$@``"N!_F<I5=``*7UP_BE]M@<I50T`*3G<``!(T"\#@`@`
+M`&C^[PE4S```2`P`(#G$``!(X"\#@+X&`%2<``!(X"\#@+[&`%20``!(`0`%
+M+"``@D$``"`Y`0`%*)@`@$$,`"`Y!@`%*(P`@4$4``!(&#`#@`$``&C^!PE4
+M>```2`$``$@!`"`Y```#+&@`@D$&`!\H2`"!00``(#W$`"DY.A#@5RX`"7P4
+M2@!\I@,)?"`$@$X)``.((```2`P``X@8``!(#0`#B!```$@+``.("```2`H`
+M`X@``!Z0```@.10``$AX^^5_>//&?P$``$AX&VE\>$LC?1P``8"F`PA\$`#!
+M@Q0`X8,8`"$X(`"`3NC_(92F`@A\$`#!DQ0`X9,<``&0>!M_?'@SWGQX&VI\
+MX`%C.1T`!"BP`8%!```@/?P`*3DZ$(!4+@`)?!1*`'RF`PE\(`2`3@``!BP0
+M`()!S"\#@``(`&3$``!(S"\#@$8!`%2X``!(```+@```8#@`$`EP<`&"00``
+M!BP0`()!T"\?@+@'`%0,``!(T"\?@`0``&#0+PJ0>/OC?P``@#@@@81@T"^J
+M@$```$@``(`X"**$8`$``$@`(&5@```>+`@`@D#B!&54>/OC?P``@#@(HH1@
+M%```2/@!WY```(`X2("$8'@SQ7P!``!(Y```2/__)C$0,0E\W"\#D-0``$@`
+M``8L$`""0<PO`X``@`!D#```2,PO`X!^``!4S"\*D+```$CT+P.H%`+&?S\`
+M'B@(`(%`/P#`.QH`!"P4`*)`X"\*@'@#P'^^!@!4%```2.`O*H&N!"E5OL;`
+M5WA+`'S@+PJ0>/OC?P``@#CH@(1@X"^J@'3__TL``&`X!@`%*&0`H4$Z$*!4
+M>/OC?P``(#T``"DY+@")?'@SQ7P!``!(1```2```"X`0``ET+`""00``!BP0
+M`()!T"\#@`@``&`,``!(T"\#@'8'`%30+PJ0`0!@.!```$AX^^-_>//&?P$`
+M`$@<``&`I@,(?!``P8,4`.&#&``A."``@$[X_R&4I@((?`P``9`!``!(__\C
+M,1`9"7QX`P-\#``!@*8#"'P(`"$X(`"`3NC_(92F`@A\$`#!DQ0`X9,<``&0
+M>!M_?```!"QT`()!!$"`.`$``$@:!&54>/OC?P1`@#@!``!("@!@.`$``$@H
+M`,`[>/OC?Q!`@#@!``!(`0!@=#``@D$R`&`X`0``2'C[XW\$0(`X`0``2!H$
+M951X^^-_!$"`.`$``$C__]XWQ/^"0```8#@``!XL+`""07C[XW\``(`X!("$
+M8`$``$B8`V54>/OC?P``@#@$@(1@`0``2`$`8#@<``&`I@,(?!``P8,4`.&#
+M&``A."``@$[H_R&4I@((?`P`H9,4`.&3'``!D'@;?WQX(YU\``"`.`2`A&`!
+M``!(!`!E9'C[XW\``(`X!("$8`$``$@``!TL)`"B07C[XW\$0(`X`0``2!H$
+M950!`*5D>/OC?P1`@#@!``!('``!@*8#"'P,`*&#%`#A@Q@`(3@@`(!.Z/\A
+ME*8""'P,`*&3%`#ADQP``9!X&W]\>".=?```@#@$@(1@`0``2`0`961X^^-_
+M``"`.`2`A&`!``!(```=+"0`HD%X^^-_!$"`.`$``$@:!&54`@"E9'C[XW\$
+M0(`X`0``2!P``8"F`PA\#`"A@Q0`X8,8`"$X(`"`3NC_(92F`@A\#`"ADQ``
+MP9,4`.&3'``!D'@CGWQX*Z1\>!M^?`$`H#L!`!\L)`""00$`'R@0`(!!`@`?
+M+!P`@D$@``!(]?W_2W@;?7P<``!(N?[_2Q0``$@M__]+#```2```8#@,``!(
+MN"_^DWCKHW\<``&`I@,(?`P`H8,0`,&#%`#A@Q@`(3@@`(!.^/\AE*8""'P,
+M``&0!$"`.`$``$B^AV-4#``!@*8#"'P(`"$X(`"`3NC_(92F`@A\%`#ADQP`
+M`9`(``0LI`""00@`!"@L`(%!`@`$+*``@D$"``0H$`"!00$`!"Q$`()!R```
+M2`0`!"QL`()!O```2``!!"R0`()!``$$*!``@4$@``0L=`""0:```$@``@0L
+M@`""00`$!"R$`()!C```2```(#T``.D[-!(C@0``"2R``()!`@`)H`!`"7!4
+M`()`-!(C@0(`":@````L9`"@0$P``$@``"`]``#I.U0``$@``"`]``#I.T@`
+M`$@``"`]``#I.SP``$@``"`]``#I.S```$@``"`]``#I.R0``$@``"`]``#I
+M.Q@``$@``"`]``#I.PP``$@``&`X$```2'C[Y'\!``!(>/OC?QP``8"F`PA\
+M%`#A@Q@`(3@@`(!.^/\AE*8""'P,``&0#`"`.`$``$@,``&`I@,(?`@`(3@@
+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
+M`(&2/`"ADD``P9)$`.&22``!DTP`(9-0`$&35`!ADU@`@9-<`*&38`#!DV0`
+MX9-L``&0>!M_?'@CF7QX*[Y\>#/7?'@[^'QX&WI\``"`.P(`!:```0EP#`""
+M08``"G`4``!(`@`%H/[)`%0!``!H`0`+<'P"@D`"`!Z@(``)<`P`@D%```IP
+M%```2`(`'J"^T0!4`0``:`$`"W!4`H)`>/OC?P``@#@!`*`X`0``2````#@`
+M``,LK`VB07C[XW]X\\1_`0``2'@;='P,`"`Y```#+'P-@D$&`!DL(`""008`
+M&2@0`(%!`0`9*`0"@4$,``!("``9+/@!HD```,`Y```7+"P`HD%X^^-_0!&`
+M.`$``$AX&VY\>/OC?WBCA'X!``!(>/OC?P``@#@!``!(S`%_@0<`8&D``"`A
+M%`$)?`L`:6D``$DA%$DJ?7E+"GPD`()`"@"++QP`GD$)``LL%`""060`GD#0
+M`1^@`P``*%@`@4$``!<L4`""0302?X$```LL1`""00``'J```"NA`$@`?#0`
+M@D$"`!Z@]@4`5`(`*Z'V!2E5`$@`?!P`HD!X^^-_>//$?P$``$@!```X```#
+M+*`,@D!X^^-_``"`.%B`A&`!``!(>!MR?````RP(`()``0!`.GC[XW\``(`X
+M!("$8`$``$@@`G5T>/OC?Q!`@#@!``!(_@``/&```&`X`'-\>/OC?Q1`@#@!
+M``!(>!MP?'C[XW\80(`X`0``2'@;;WQX^^-_>,LD?P$``$AX^^-_`0``2'C[
+MXW]X\\1_`0``2`,`(#D```,L]`N"00(`'J#V!0!40`$`+%0`@D$H`(%!P```
+M+&0`@D$0`(%!H```+%``@D%H``!(T```+%0`@D%<``!(P`@`+$``@D$,`(%!
+M4`$`+!```$A`"0`L$`""05`)`"P0`()!-```2`$`P#H(``!(`@#`.@$`(#HH
+M``!(`P#`.A```$@$`,`Z"```2`4`P#H"`"`Z#```2`P`(#E<"P!(>/OC?P``
+M@#@`F(1@!P"@.`$``$@``*`[```@/0``:3L8`!T<+@";?`8`'1P4L@!\.A``
+M5"X`NWQX^^-_`0``2`$`G#L_`(!S#`"B0`$`8#@!``!(`0"].Q@`'2C$_X%`
+M``"@.P``(#T``&D[.!B@5RX`FWP``!<L,`""0?__)#W@?PDX&```(!`!`'S0
+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
+M`!Z8-!)_@0``0#D``"`Y,``KD30`2Y$T$K^#>/OC?P$``$@H`'V0+`"=D'C[
+MXW\!`(`X`0``2`$``#@8``!(```8@````"P(`()!```XD0```#AX`P-\;``!
+M@*8#"'P@`,&!)`#A@2@``8(L`"&",`!!@C0`88(X`(&"/`"A@D``P8)$`.&"
+M2``!@TP`(8-0`$&#5`!A@U@`@8-<`*&#8`#!@V0`X8-H`"$X(`"`3NC_(92F
+M`@A\$`#!DQ0`X9,<``&0>!M^?`0"XX,#`.!S+`"B00``@#A$F81@`0``2,(`
+M952$Z.!7>`.E?'CSPW\``(`X1)F$8`$``$@,`.!S2`""000`"7`<`()`>//#
+M?P``@#C0@(1@`0``2+0'9508``!(>//#?P``@#C0@(1@`0``2!P`96!X\\-_
+M``"`.-"`A&`!``!('``!@*8#"'P0`,&#%`#A@Q@`(3@@`(!.^/\AE*8""'P,
+M``&0M"PC@:8#*7TA!(!.__\C,1`9"7QX`P-\#``!@*8#"'P(`"$X(`"`3LC_
+M(92F`@A\(`!!DR0`89,H`(&3+`"ADS``P9,T`.&3/``!D'@;?WQX(YM\`0#`
+M.W@;>GP!``!(>!M\?```H#OH`1^@0``=?"@`H$!X^^-_>.ND?P$``$@```,L
+M)`""0`$`O3OH`1^@0``=?.#_@$$````X```>+/`!HD$,``!(``#`.^S__TMX
+M^^-_``"`.'R9A&`!`*`X`0``2```H#MX^^-_``"`.""<A&`!``!(```#+!@`
+M@D`%`&`X`0``2`$`O3MC`!THV/^!0````#AC`!THE`&A07C[XW]XXX1_`0``
+M2````#@```,L?`&B07C[XW\``(`X%)F$8`$``$B^!&-4`@`<H,S,(#W-S"EA
+M%D@C??[H*54@``MP&`""03H0:50NN@`\HXL`8!8`*7T^X2E59`!I.`$``$AX
+M^^-_>..$?P@`H3@!``!(````.````RP4`:)!>/OC?P``@#A\F81@``"@.`$`
+M`$@"`!R@0``)<%P`@D',`1^`"@"`+R@`GD$)```L(`""01``GD#0`1^@`P``
+M*!``@4!P$AJ@`E``*"``@4`"`!N@H```<*```"P0`()!>/OC?WCCA'\!``!(
+M>/OC?WC;9'\!``!(>/OC?P``@#A@F(1@`0``2`(`96!X^^-_``"`.&"8A&`!
+M``!(!``<B`(`"7`,`()`/```5`0`')@"`!R@`@`;L`0`'(@$`!N8!0`<B`4`
+M&Y@&`!R(!@`;F`<`'(@'`!N8-!)_@0``0#D``"`Y,``KD30`2Y$T$K^#>/OC
+M?P$``$@H`'V0+`"=D'C[XW\!`(`X`0``2`$``#AX`P-\/``!@*8#"'P@`$&#
+M)`!A@R@`@8,L`*&#,`#!@S0`X8,X`"$X(`"`3NC_(92F`@A\$`#!DQ0`X9,<
+M``&0>!M^?'@CGWP``(`X!("$8`$``$@:!&-4`0`?+(``@D$0`(%!```?+$0`
+M@D&$``!(!@`?+!``@D$(`!\L8`""07```$@!$&5D>//#?P``@#@$@(1@`0``
+M2'CSPW\4`(`X`0``2/(&950H``!(`A!E9'CSPW\``(`X!("$8`$``$AX\\-_
+M%`"`.`$``$@@`&5@>//#?Q0`@#@4``!(`!!E9'CSPW\``(`X!("$8`$``$@<
+M``&`I@,(?!``P8,4`.&#&``A."``@$[X_R&4I@((?`P``9`"`(`X(0<`2`P`
+M`8"F`PA\"``A."``@$[H_R&4I@((?!0`X9,<``&0>!M_?```@#@!`*`X`0``
+M2````#@```,L%`"B07C[XW\3`(`XV08`2'@;8'QX`P-\'``!@*8#"'P4`.&#
+M&``A."``@$[8_R&4I@((?!``09,4`&&3&`"!DQP`H9,@`,&3)`#ADRP``9!X
+M&WY\>".=?!,`@#B)!@!(````.````RR$`J)!>//#?P``@#@!`*`X`0``2```
+M`#@```,L:`*B07CSPW\``(`X508`2````#@```,L4`*"00``'2Q$`H)!S`$>
+M@`H`@"\<`)Y!"0``+!0`@D$T`)Y`T`$>H`,``"@H`(%!"`!`.P(`':`@``EP
+M;`""0-```'`$`&`[P```+-0`HD!8``!(U`$^H38&*570_RDY/P`)*"@`@4#,
+M`1Z`!P`):```:2$422M]"P``:```8"$4`0M\>0,K?5``@D$(`$`[`@`=H"``
+M"7`0`()`T```<,```"P,`*)`ZP!@.W0``$@"`!V@Z@%@.P!`"7!D`()``@`=
+MJ/@``'QP_AM\+`![5^H">SM,``!(``!`.P(`':`@``MP$`""0-```'#````L
+M#`"B0*L`8#LH``!(`@`=H*H!8#L`0`EP&`""0`(`':CX``!\</X;?"P`>U>J
+M`GL[`@`=H$``"W`@`()!(``)<!``@D#0``!PP```+`P`HD`$`%IC%```2`(`
+M':!```EP"`""0`$`6F,"`!V@``$+<`@`@D`"`%IC`@`=H!``"7`F`.!__A__
+M5]``_W_Z!_]7`P#_.WCSPW\``(`X?)B$8`$``$AX&WQ\`@`=H"``"7`0`()`
+MT```<,```"Q4`*)`>//#?P``@#@$F(1@>/OE?P$``$AX\\-_``"`.`"BA&!X
+MTT5_`0``2`#8''QP`()!>//#?P``@#A\F(1@>-ME?P$``$@L`6`X`0``2%``
+M`$@`V`-\(`""07CSPW\``(`X?)B$8'C;97\!``!(+`%@.`$``$AX\\-_``"`
+M.`28A&!X^^5_`0``2'CSPW\``(`X`**$8'C317\!``!(`0``.'@#`WPL``&`
+MI@,(?!``08,4`&&#&`"!@QP`H8,@`,&#)`#A@R@`(3@@`(!.V/\AE*8""'P(
+M``&3#``ADQ``09,4`&&3&`"!DQP`H9,@`,&3)`#ADRP``9!X&WU\>".9?'@K
+MOWQX&WI\````.```!9`!``!(>!M\?```8#@``!PL2`."0<`O'8`"``EH```)
+M(11)*'T``$`A%`$*?'D#*WT,`()!`0``.```'Y#`+]J#`0`>+,0!HD!XZZ-_
+M``"`.""9A&`!``!(`0!C=*P!@D#`+WJ0``#?DP``P#MXZZ-_``"`.!"<A&`!
+M``!(>!M[?'CKHW\``(`X%)R$8`$``$AX&W]\>.NC?P``@#@8G(1@`0``2'@;
+M>'S__QLQ$-D(?/__7S$0^2I].4@+?#0`@D!XZZ-_``"`.""9A&`!``!(`0!E
+M9'CKHW\``(`X()F$8`$``$@!`-X["0`>+(#_@4!^^&E7?OC@5Q0"*7W^R2E5
+M_LGC5___"3$020A\`0!@.0$``RP(`*%!``!@.3E8"GQ@`8)!T``8?'0''GS6
+M2]Y_X/\>+`P`@$#@_\`[$```2!\`'BP(`(%`'P#`.Y8;^W^`__\[\/\?+`P`
+M@$#P_^`[$```2`\`'RP(`(%`#P#@.WCKHW\``(`X()F$8`$``$CH!F54="W`
+M5W@#I7QXZZ-_``"`.""9A&`!``!(>.NC?P``@#@@F81@`0``2#0`953^!N!7
+M>`.E?'CKHW\``(`X()F$8`$``$AXZZ-_``"`.""9A&`!``!(``AE8'CKHW\`
+M`(`X()F$8`$``$@"```XP"\:D`$``#@0`!R0%`#<FQ4`_)M\``!(`@`9H*``
+M`'"@```L;`""0<`O&H`"```L8`"B0!``'(`````L5`"B0'CKHW\``(`X()F$
+M8`$``$@`\&5@>.NC?P``@#@@F81@`0``2'CKHW\``(`X()F$8`$``$@!`&5D
+M>.NC?P``@#@@F81@`0``2`$``#C`+QJ0>.NC?WCCA'\!``!(`@`<H`(`"'"H
+M`*)`>.NC?P``@#A@F(1@`0``2`(`96!XZZ-_``"`.&"8A&`!``!(`@"9H``!
+M@'`@`()`U`$]H38&*570_RDY/P`)*'P`@4%``(AP=`""0<P!?8$'`&!I__]`
+M,1`!*GUX2R!]"P!I:?__23$020I]>$,)?3E("'Q(`()!"@"++T``GD$)``LL
+M.`""01``GD#0`1V@`P``*"@`@4!XZZ-_W24`2!P``$@"`!F@`@``8`(`&;`"
+M`!R@^@<`5`(`'+`!`&`X+``!@*8#"'P(``&##``A@Q``08,4`&&#&`"!@QP`
+MH8,@`,&#)`#A@R@`(3@@`(!.Z/\AE*8""'P,`*&3$`#!DQ0`X9,<``&0>!M^
+M?'@CGWQX(X5\```$+`@`@D#__Z`X>"N]?,P!'H`)```L&`""00H``"P4`*)`
+MT`$>H`,``"@(`(%!-`?_5WCSPW\,`(`X`0``2'CSPW\`0(`X>/OE?P$``$@/
+M`&`X`0``2+X'O5>^!_]7>//#?P!`@#AXZZ5_>/OF?P$``$AX&WU\`0#@<S@`
+MHD!X\\-_%`"`.```H#@!``!(>//#?P``@#@!`*`X`0``2````RP0`*)!>//#
+M?\``@#@!``!(>.NC?QP``8"F`PA\#`"A@Q``P8,4`.&#&``A."``@$[X_R&4
+MI@((?`P``9```(`X9)B$8`$``$C^;6-4``%@<`P`@D'_`6!H^``#?`P``8"F
+M`PA\"``A."``@$X"``2@]`4`5,```"PL`()!$`"!0:```"P8`()!+```2$`!
+M`"PD`*)`S!(#H!```$C.$@.@"```2-`2`Z````6P`0!@."``@$X``&`X(`"`
+M3N#_(92F`@A\%`"ADQ@`P9,<`.&3)``!D'@;?7QX(YY\``"`.&"8A&`!``!(
+M``#@.P(`8'!(`*)`>.NC?P$``$AX&W]\>.NC?WCSQ'\(`*$X8?__2P```RP<
+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
+M`Z5\>/OC?P``@#A(F(1@`0``2#P(_584\KU_L!*=.PH`'*`.P`54'H``5'@#
+MI7S`$CVA+D`@57@#I7QX2Z5\>/OC?P``@#@TF(1@`0``2'C[XW\``(`X*)B$
+M8`$``$@>!F54KA(=H"Y``%1X`Z5\>/OC?P``@#@HF(1@`0``2'C[XW\``(`X
+M9)B$8`$``$@8!654!``<H&9C`%1X`Z5\>/OC?P``@#ADF(1@`0``2`(`H#MP
+M$AZ@`C``*"0`@4'*`1^@(A``+#P`HD`"`!N@0``(<#``@D$(`*`[*```2'C[
+MXW]XVV1_`0``2````RP4`()!/`CI5A3R*7TF$PF@%`*]?WC[XW\``(`X))F$
+M8`$``$CN!V54/`Z@5W@#I7QX^^-_``"`."29A&`!``!($``;@````"P8`()!
+M%``;B'0''7P5`!N(=`<<?!@``$@\""E7%/(I?;`3*3D&`*FC"@")HWC[XW\`
+M`(`X()F$8`$``$CH!F54="V@5W@#I7QX^^-_``"`.""9A&`!``!(>/OC?P``
+M@#@@F81@`0``2#0`953^!H!7>`.E?'C[XW\``(`X()F$8`$``$AX^^-_``"`
+M.""9A&`!``!(``AE8'C[XW\``(`X()F$8`$``$AP$CZA`$`)*$@`@4`"`!N@
+MT```<-```"P,`()`_T\)*#``@4!X^^-_``"`.`RBA&`!``!(C@-E5!J2P%9X
+M`Z5\>/OC?P``@#@,HH1@`0``2'`2'J``4``H&`"A0'C[XW\``(`XX)F$8```
+MH#@!``!(`0!@.#P``8"F`PA\$`#!@A0`X8(8``&#'``A@R``08,D`&&#*`"!
+M@RP`H8,P`,&#-`#A@S@`(3@@`(!.B/\AE*8""'Q(`(&23`"ADE``P9)4`.&2
+M6``!DUP`(9-@`$&39`!ADV@`@9-L`*&3<`#!DW0`X9-\``&0>!M\?'@CF'P`
+M```X"``!D`P``9`8``&0'``!D"```9`D``&0``"@.@``P#H``(`Z``!@/7@(
+M*SEX"`N@`@!IH00`2:$&`"FA*``!L"H`8;$L`$&Q+@`AL0``(#V`"&DY@`@)
+MH`(`*Z$$`&NA.``!L#H`(;$\`&&Q`@"DHP``)*'_S[U7$`""00H`*1THIBDY
+M#```2`H`*1V80"DY/@0Y53@`&*!X`QY\````+(@`@D`,``!(>!M^?'@``$@`
+M`,`[`(#>8U<`(#D"`!B@$``+<`@`@D&N`"`Y``#@.P``8#L`@'MC4,A)?Q1*
+M^7[$`1R`I@,)?'CC@W]X^^1_>.NE?R$$@$X`V`-\*`""0;X$8U0`&!I\#`"!
+M00`8%WR8_Z!``0`?.#X$'U0$`!\HP/^!0#@`V+,````X`(``8```'GR<`:)`
+M>..#?P``@#@@F81@`0``2`!`8'1P!:)!>..#?P``@#@,F81@`0``2#X"951X
+MXX-_``"`.`R9A&`!``!(>..#?P``@#@@F81@`0``2``!951XXX-_``"`.`R9
+MA&`!``!(>..#?P``@#B@F81@``"@.`$``$AXXX-_``"`.("9A&```*`X`0``
+M2'CC@W\``(`XA)F$8`$``$@6`&54>..#?P``@#B$F81@`0``2'CC@W\``(`X
+MF)F$8```H#@!``!(>..#?P``@#B<F81@`0``2!8`951XXX-_``"`.)R9A&`!
+M``!(>..#?P``@#@`F81@``"@.`$``$AXXX-_``"`.`29A&```*`X`0``2'CC
+M@W\``(`X")F$8```H#@!``!(>..#?P``@#@,F81@`0``2"(`951XXX-_``"`
+M.`R9A&`!``!(>..#?P``@#B(F81@``"@.`$``$AXXX-_``"`.(R9A&```*`X
+M`0``2'CC@W\``(`XD)F$8```H#@!``!(>..#?P``@#B4F81@`0``2"(`953@
+M`P!(4/!Y?0(`&*#V!0!4T```+(P`@D$0`(%!P```+$``@D&@``!(0`$`+!``
+M@D%0`0`L;`""08P``$@<B'95ZU$`/!^%`&"6`!9\<!X`?'#^R7Y0`,E^<%;4
+M?CP``$@N0'153PD`/)4@`&"6`!1\<`X`?'#^B7Y0`(E^'(AV5>M1`#P?A0!@
+ME@`6?'`>`'QP_LE^4`#)?C4,H#HH``!('H!V5>M1`#P?A0!@E@`6?'`>`'QP
+M_LE^4`#)?G!6U'YJ&*`ZZ`,+'#8@`%36JP!\!```.2@`X3@/``EP#`""0`,`
+M`#DX`.$X``#@.P!`'WPX`8!`<"8*?`$`P#@<``HL\`*!013Z*GT9`&DY(``+
+M*#``@4$P6,!\&0`++!0`@4`:``LL.`"!0/__"S@P`,!\"``A@7A+`'P(``&0
+M(```2-__"S@3```H%`"!03``P'P,`"&!>$L`?`P``9`!``LX#P``*"@`@4$\
+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
+M``,L"`"B0!0`"#@,`!^0\?\+.#\``RP(`()!!0`+.!``'Y`$`)^```!@.!`@
+M"'P0`0!\T```?!!()'T022E]T``I?7E+"'PH`()!$"`*?!`!`'S0``!\$%@D
+M?1!)*7W0`"E]>4L+?`@`@D$!`&`X'``!@*8#"'P4`.&#&``A."``@$[H_R&4
+MI@((?`P`H9,<``&0>!M]?/0OHZCP+P.`%`*E?&Q,I50`@*5@``"`.#"9A&`!
+M``!(`0``.,0O'9`<``&`I@,(?`P`H8,8`"$X(`"`3NC_(92F`@A\"`"!DPP`
+MH9,0`,&3%`#ADQP``9!X&W]\>!M]?!`LPSL8`!Z```!@.````"P``8)!Q"\?
+M@`$``"SP`*)`>/OC?P``@#@PF81@`0``2`"`8'#8`()`?CYI5`0`/I&^3V!4
+M`@``+"P`HD#2`1^@00``*!0`@4":$A^@%$H`?`0`'I`0``!(!``^@04`*3D$
+M`#Z1U`$]H38&*570_RDY/P`)*"P`H4%XZZ-_40(`2`0`/H$4`!Z`0``)?`P`
+M@$%02`!\"```2````#@$`!Z0````.,0O'Y!XZZ-_>//$?XW]_TMX&WQ\```#
+M+$``HD!XZZ-_>//$?UD``$@```,L+`"B07CKHW]X\\1_;0``2````RP8`(%`
+M`@``.,0O'Y`!```XV"\?D,`OGY/$+W^`'``!@*8#"'P(`(&##`"A@Q``P8,4
+M`.&#&``A."``@$X``&`X!``D@0P`!(!```E\$`"!0!``!(!```E\(`"`30$`
+M8#@@`(!.U`$CH38&*570_RDY``!@/0``"SD_``DH#`"!0```(#T```DY``!D
+M@20`*QT42BA]"``I.1P`))$$`"2!$``$@$``"7R(`(!!__]@.```"RP@`()-
+M!``D@0@`))$0``2`>`,'?$``"7Q<`(!!```$@````"Q0`()!```D@?__23D`
+M`$21)`!J'11":WT<`"2!&``+@!``*8%0``E\/`@`5`@`)(%02"!]"``DD0@`
+M:SD<`&210#@)?`P`@$$```HLN/^"0`$`8#@@`(!.!``D@0P`!(```&`X0``)
+M?"``@4T``"B!__\I.0``!(#^_V`X`$@`?"``@DT$`"2!"``DD0P`!(!X`P=\
+M0``)?'``@4$``"B!__\I.0``!(!X`PM\0$@`?%@`@$`!`$LY``!$D20`:AT4
+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
+M2Z5\>//#?P$``$@P`!^`````+!0`@D$,`!^`(``)<`@`@D$``CEC#``?@$``
+M"W`,`()!-@`Y5P(`.6,/`"!S-`""00P`'X```0EP#`""04``.6,(``!(L`8Y
+M5PP`'X"```MP#`""02``.6,(``!(\@8Y5PP`'X`!``ET"`""02``&&<,`!^`
+M@``+=`@`@D$``AAC#``?@`0`"70,`()!!``89Q0``$@,`!^``@`+=`@`@D$"
+M`!AG#``?@`@`"70(`()!`$`88PP`'X`0``MT"`""01``&&<$`!^``@``+!``
+M@D$#```L%`""060``$BB`#EC)0`89U@``$AB`#EC,``?@````"Q$`*)````@
+M/0``:8$``"`]```)@%!88'WD+[N`4"BK?```(#T```F`4"B@?"I0I50Z$(17
+M``F$.``!I61X\\-_`0``2`0`&&<X`!^``0`)<`@`@D$D`!AG.A"=5\`)73MX
+M\\-_>--$?WC+)7\!``!(`!&].WCSPW]XZZ1_>,,%?P$``$@T`!^`````+%0`
+MHD$\"(574`"E.'CSPW\`"X`X`0``2'CSPW\$"X`X-`"_@`$``$AX\\-_"`N`
+M.`D`H#@!``!(>//#?WC31'\!``!(`!!E8'CSPW]XTT1_`0``2`P`'X`!``EP
+M&`""00$``#@PX`!\S"P[@7A+`'P4``!(_O\`.#[@`%S,+#N!.$@`?,PL&Y`,
+M`!^``0`+<!@`@D$!```X,.``?-`L.X%X2P!\%```2/[_`#@^X`!<T"P[@3A(
+M`'S0+!N0#``?@`(`"7`8`()!`0``.##@`'S4+#N!>$L`?!0``$C^_P`X/N``
+M7-0L.X$X2`!\U"P;D`P`'X`$``MP&`""00$``#@PX`!\V"P[@7A+`'P4``!(
+M_O\`.#[@`%S8+#N!.$@`?-@L&Y`,`!^`"``)<!@`@D$!```X,.``?-PL.X%X
+M2P!\%```2/[_`#@^X`!<W"P[@3A(`'S<+!N0>//#?WC[Y']-^O]+`0!@."P`
+M`8"F`PA\"``!@PP`(8,0`$&#%`!A@Q@`@8,<`*&#(`#!@R0`X8,H`"$X(`"`
+M3OC_(92F`@A\#``!D#H0A%0`"(0X`0``2`P``8"F`PA\"``A."``@$[X_R&4
+MI@((?`P``9`Z$(14``B$.`$``$@!`&`X#``!@*8#"'P(`"$X(`"`3OC_(92F
+M`@A\#``!D`$`H#@P(*5\0`B`.`$``$@!`&`X#``!@*8#"'P(`"$X(`"`3NC_
+M(92F`@A\#`"ADQ``P9,4`.&3'``!D'@;?7QX(YY\.A"$5``*A#@!``!(`P!_
+M<"0`HD!XZZ-_0`B`.`$``$@!```X,/``?#D`:7P(`()!`0#@.WC[XW\<``&`
+MI@,(?`P`H8,0`,&#%`#A@Q@`(3@@`(!.V/\AE*8""'P4`&&3&`"!DQP`H9,@
+M`,&3)`#ADRP``9!X&W]\>".>?`$`H#@P(*5\@`B`.`$``$CH`V`[>/OC?WCS
+MQ'\!``!(```#+!0`@D%D`&`X`0``2/__>S?@_X)`>/OC?WCSQ'\!``!(```#
+M+%P!@D',`7^!!P!@:0``("$4`0E\"P!I:0``22$422I]>4L*?"0`@D`*`(LO
+M'`">00D`"RP4`()!)`&>0-`!'Z`#```H&`&!00``@#MX^^-_``"`.$R`A&`!
+M``!(>!M]?'C[XW\``(`X`(&$8`H`H#QD`*5@`0``2+ZRO5<^!*57`0"E9'C[
+MXW\``(`X_("$8`$``$AX^^-_``"`.$R`A&`!``!(OK)C5`#H`WP0`()!`0"<
+M.P$`'"B4_X%`>/OC?P``@#A(@(1@`0``2$``961X^^-_``"`.$B`A&`!``!(
+MR`!@.`$``$AX^^-_``"`./R`A&`!``!('`1E5'C[XW\``(`X_("$8`$``$AD
+M`*`[%```2/__O3<@`()!"@!@.`$``$AX^^-_>//$?P$``$@```,LX/^"0'C[
+MXW\``(`X2("$8`$``$B0`F54>/OC?P``@#A(@(1@`0``2'C[XW^`"(`X``"@
+M.`$``$C__QLP$-E@?"P``8"F`PA\%`!A@Q@`@8,<`*&#(`#!@R0`X8,H`"$X
+M(`"`3NC_(90,`*&3$`#!DQ0`X9-X2R9]>%-??2``P8,H`(&!+`"A@_0O`Z@4
+M`@A]/P`(*`@`@4`_```Y/@6@5!Z`"55X2P!\$)*)57@#*7TD``&`S,@`5'@#
+M*7T!`(!Q"`""00`!*66$R(!5>$L`?`@`!)@^QPE4"0`DF3Z&"50*`"29/D8`
+M5`L`!)@6H.E4/``!@0S("%4T`$&!!.A*53@`88$(V&M5SKF`57A#*7UX4RE]
+M>%LI?7A+`'P^!@E4#``DF0``(#D-`"29-H8)5`X`))D^1@!4#P`$F!Z#Z5<@
+M3(!5>$L`?#X&"500`"29,,8)5!$`))D^A`E4$@`DF3Y&`%03``28%`#$F#[&
+MP%05``28/H;`5!8`!)@^1L!4%P`$F/__'BR8`()!#``DB0T`!(@N0`!4>$L`
+M?`X`)(D>@"E5>`,I?0\`!(@.P`!4>$L`?"1KR5=X2P!\#``$F#[&"50-`"29
+M/H8)5`X`))D^1@!4#P`$F`@`)(D)``2(+D``5'A+`'P*`"2)'H`I57@#*7T+
+M``2(#L``5'A+`'P`0`!D"``$F#[&"50)`"29/H8)5`H`))D^1@!4"P`$F`P`
+MB7$@`8)!`'\`/`#_`&`P[@!\``!@.`$`"7`,`8)!"``DB0D`!(@N0`!4>$L`
+M?`H`)(D>@"E5>`,I?0L`9(D.P&M5>$MK?0@`@'$F`"!]_A\I5=``*7T``"E5
+M`(`I/5*B@%5X2P!\>`-K?0@`9)D^QF!5"0`$F#Z&8%4*``28/D9K50L`9)D0
+M`"2)$0`$B"Y``%1X2P!\$@!DB1Z`:U5X`VM]$P`DB0[`*55X6RE],``!@'X$
+M`%1X`RE]$``DF3[&(%41``28/H8@51(`!)@^1BE5$P`DF10`)(D5``2(+D``
+M5'A+`'P6`"2)'H`I57@#*7T7``2(#L``5'A+`'P6H*E7>$L`?!0`!)@^Q@E4
+M%0`DF3Z&"506`"29/D8`5!<`!)@!`&`X#`"A@Q``P8,4`.&#&``A."``@$YX
+M2RM]```&+*``@D$0`"2)$0`$B"Y``%1X2P!\$@`DB1Z`*55X`RE]$P`$B`[`
+M`%1X2P!\%J+)5'A+`'P`@`!@$``$F#[&"501`"29/H8)5!(`))D^1@!4$P`$
+MF!0`)(D5``2(+D``5'A+`'P6`"2)'H`I57@#*7T7``2(#L``5'A+`'PT**E4
+M>$L`?!0`!)@^Q@E4%0`DF3Z&"506`"29/D8`5!<`!)@```@LH`""01``)(D1
+M``2(+D``5'A+`'P2`"2)'H`I57@#*7T3``2(#L``5'A+`'P.P0E5>$L`?`"`
+M`&`0``28/L8)5!$`))D^A@E4$@`DF3Y&`%03``28%``DB14`!(@N0`!4>$L`
+M?!8`)(D>@"E5>`,I?1<`!(@.P`!4>$L`?"I0Z51X2P!\%``$F#[&"505`"29
+M/H8)5!8`))D^1@!4%P`$F```"BR@`()!$``DB1$`!(@N0`!4>$L`?!(`)(D>
+M@"E5>`,I?1,`!(@.P`!4>$L`?`;@255X2P!\`(``8!``!)@^Q@E4$0`DF3Z&
+M"502`"29/D8`5!,`!)@4`"2)%0`$B"Y``%1X2P!\%@`DB1Z`*55X`RE]%P`$
+MB`[``%1X2P!\('AI57A+`'P4``28/L8)5!4`))D^A@E4%@`DF3Y&`%07``28
+M`0!@."``@$X(`"2)"0`$B"Y``%1X2P!\"@`DB1Z`*55X`RE]"P`$B`[``%1X
+M2P!\`"``9`@`!)@^Q@E4"0`DF3Z&"50*`"29/D8`5`L`!)@@`(!.```&+&``
+M@D$,`"2)#0`$B"Y``%1X2P!\#@`DB1Z`*55X`RE]#P`$B`[``%1X2P!\``!G
+M(10Y*WTF8"E5>"L`?'@#*7T,`"29/L8@50T`!)@^AB!5#@`$F#Y&*54/`"29
+M'`$`2```!RS``()!````.`@`!)@)``28"@`$F`L`!)@,`*28/L:@5`T`!)@^
+MAJ!4#@`$F#Y&H%0/``28$``HB1$`"(@N0`!4>$L`?!(`*(D>@"E5>`,I?1,`
+M"(@.P`!4>$L`?!``!)@^Q@E4$0`DF3Z&"502`"29/D8`5!,`!)@4`"B)%0`(
+MB"Y``%1X2P!\%@`HB1Z`*55X`RE]%P`(B`[``%1X2P!\%``$F#[&"505`"29
+M/H8)5!8`))D^1@!4%P`$F%@``$@``&`Y"`!DF0D`9)D*`&29"P!DF0`0H&`,
+M``28/L8)5`T`))D^A@E4#@`DF3Y&`%0/``28$`!DF1$`9)D2`&29$P!DF10`
+M9)D5`&29%@!DF1<`9)D````X'``$F!T`!)@>``28'P`$F!@`!)@9``28&@`$
+MF!L`!)@!`&`X(`"`3AP`!(@/`&`X`0`)<"``@DT<`"2)'0`$B"Y``%1X2P!\
+M/OT`5```!;`:`"2)&P`$B"Y``%1X2P!\`@`%L````#@$``68&``DB1D`!(@N
+M0`!4>$L`?!H`)(D>@"E5>`,I?1L`!(@.P`!4>$L`?`$`"7!$`()``@`)<`P`
+M@D$!```X!``%F!@`!(@(``EP$`""000`!8@"``!@!``%F!@`!(@$``EP$`""
+M000`!8@$``!@!``%F!X`!(B^WP!4"P`%F`L`!8@!```L-`""01``@4$````L
+M'`""06P``$@"```L-`""00,``"PX`()!6```2!0`!(C^!@!42```2!0`)(D5
+M``2(+D``5'A+`'S^W@!4*```2!4`!(C^]@!4'```2!4`!(@N0`!4%@`DB1Z`
+M*55X2P!\_HX`5/__`&2`_P!@!0`%F!T`!(@N0`!4'@`DB1Z`*55X2P!\/IX`
+M5`8`!9@8``2(/N$`5`<`!9@9``2(/@<`5`@`!9@+``6(`@``+#``@D$0`(%!
+M`0``+#@`@D%(``!(`P``+$``HD`3`"2)/@<I50@`!8@42@!\"``%F!(`)(D^
+MX2E5"``%B!1*`'P(``68$@`DB3X'*54(``6(%$H`?`@`!9@9``2(/N$`5`D`
+M!9@?``2(SL$`5```("$4`0E\`@``(`H`!9@``&`X(`"`3@``!("@1B.!.$@`
+M?```!)"@1B.!>``@?:!&`Y`@`(!.Z/\AE*8""'P,`*&3'``!D'@;?7R$+(,X
+M`0``2'CKHW\``(`X)(&$8```H#@!``!(>.NC?P``@#@H@81@``"@.`$``$AX
+MZZ-_0`"`.```H#@!``!(>.NC?P``@#@P@81@`@"@/`$``$AXZZ-_``"`.#B!
+MA&```J`\`0``2!P``8"F`PA\#`"A@Q@`(3@@`(!.Z/\AE*8""'P,`*&3'``!
+MD'@;?7Q``(`X!@"@.`$``$B$+)TX>.NC?P$``$AXZZ-_``"`."2!A&```*`X
+M`0``2'CKHW\``(`X*(&$8```H#@!``!('``!@*8#"'P,`*&#&``A."``@$YX
+M&VI\``!@.5@`*QT44BE]*#`IH0``!*!X6V-]```)?"``@DU8`"L=%%(I?2`P
+M*3D(``F@````+"0`HD````2@"``)L`(`!*`*``FP!``$B`P`"9AX6V-](`"`
+M3@$`:SD``&`X/P`+*"``@4V<__]+)#!C@"``@$[H_R&4I@((?`P`H9,<``&0
+M>!M]?(0L@S@!``!(2"R].WCKHW\<``&`I@,(?`P`H8,8`"$X(`"`3MC_(92F
+M`@A\$`!!DQ0`89,8`(&3'`"ADR``P9,D`.&3+``!D'@;?GQX(YI\>!M_?.`!
+M`X#^1P!4'#`#D"@P8S@`%H`X`0``2```0#D'`&`[`@"`._0!H#O(`.`X9`"`
+M.2@`8#@'`(`X````.;\`H#P,_J5@OP#`/#C_QF#,`1Z`!@``*!0`@4%8`"H=
+M%/HI?3`P:9L0``!(6``J'13Z*7TP,(F;6``*'!3Z8'TP,"LY#`"IDQ``Z9`4
+M`.F00#`K.0@`B9$0`&F0#`")D"`P*SD4``F9%0`)F1``"8@2``F8$P`)F1PP
+M'X`````L$`""06`P*SD,`*F0$`#)D`$`2CD_``HH>/^!0!PP'X`````L-`"B
+M07CSPW\``(`X+(&$8&PPOX`!``!(>//#?P``@#@T@81@<#"_@`$``$AX\\-_
+M`0``2&0``#@@,!^0```:+!``@D$8,!^``0``8`P``$@8,!^`/```5!@P'Y`L
+M``&`I@,(?!``08,4`&&#&`"!@QP`H8,@`,&#)`#A@R@`(3@@`(!.Z/\AE*8"
+M"'P4`.&3'``!D'@;?WP<,`.`````+#``HD$!``!(>/OC?P``@#@L@81@``"@
+M.`$``$AX^^-_``"`.#2!A&```*`X`0``2!P``8"F`PA\%`#A@Q@`(3@@`(!.
+M>/\AE*8""'QT`&&3>`"!DWP`H9.``,&3A`#ADXP``9!X&W]\>!M^?"0P@X,`
+M`&`X!@`$*#@&@4$``"`]9``I.3H0@%0N``E\%$H`?*8#"7P@!(!.>"N[?```
+M8#@$``4H#`:A07C[XW\``(`X4)B$8`$``$@&`V54.A!]5Q3ZO7\H1AV`%J$`
+M5'@#I7QX^^-_``"`.%"8A&`!``!(>/OC?P``@#A<F(1@`0``2&`&95101AV`
+M<#P`5'@#I7QX^^-_``"`.%R8A&`!``!(>/OC?P``@#A<F(1@`0``2%($950\
+M1AV`H'H`5'@#I7QX^^-_``"`.%R8A&`!``!(>/OC?P``@#A8F(1@`0``2(H#
+M951D1AV`FI$`5'@#I7QX^^-_``"`.%B8A&`!``!("0`<B$``&WP4`(%`2"P_
+M@0$`*3E(+#^1'```2`D`'(A``!M\$`"`0$PL/X$!`"DY3"P_D0D`?)L$!0!(
+M```@/0``:3D```F`!``K@0@``9`,`"&1```@/0@`:3D(``F`!``K@1@``9`<
+M`"&1```@/1``:3D0``F`!``K@2@``9`L`"&1```@/1@`:3D8``F`!``K@3@`
+M`9`\`"&1```@/2``:3D@``F`!``K@4@``9!,`"&1```@/2@`:3DH``F`!``K
+M@5@``9!<`"&1__\%,!`I8']X^^-_``"`.&R8A&`!``!(E`1E5#H08%<(`"$Y
+M%$J@?RX`"7SB<@!4>`.E?'C[XW\``(`X;)B$8`$``$AX^^-_``"`.&R8A&`!
+M``!(Q@)E5!``'8`4J0!4>`.E?'C[XW\``(`X;)B$8`$``$AX^^-_``"`.&B8
+MA&`!``!(S@-E5"``'8`<B@!4>`.E?'C[XW\``(`X:)B$8`$``$AX^^-_``"`
+M.&B8A&`!``!(``)E5#``'8!.P`!4>`.E?'C[XW\``(`X:)B$8`$``$AX^^-_
+M``"`.&B8A&`!``!(-`!E5$``'8#^!@!4>`.E?'C[XW\``(`X:)B$8`$``$AX
+M^^-_``"`.&R8A&`!``!((@9E5%``'8"N1`!4>`.E?'C[XW\``(`X;)B$8`$`
+M`$@``!LL'`""07C[XW\``(`X;)B$8`$``$@!`&5@&```2'C[XW\``(`X;)B$
+M8`$``$@\`&54>/OC?P``@#ALF(1@`0``2```FR\F``!\_O\`5`P`/(D`2`!\
+MY`*"010`GD%8+#Z!`0`I.5@L/I$0``!(7"P^@0$`*3E<+#Z1`0!@:PP`')BX
+M`@!(```@/3``:3DP``F`!``K@0@``9`,`"&1__\%,!`IH']X^^-_``"`.`BB
+MA&`!``!(,@!E5#H0H%<(`"$Y+@`)?+X&`%1X`Z5\>/OC?P``@#@(HH1@`0``
+M2`T`'(@``!U\5`*"00``'2P4`()!8"P_@0$`*3E@+#^1$```2&0L/X$!`"DY
+M9"P_D0T`O)LH`@!(```@/3@`:3DX``F`!``K@0@`:X$(``&0#``AD1``89%X
+M*[U\``!@.`(`!2C\`:%!>/OC?P``@#A8F(1@`0``2!H%950Z$*!7"``A.2X`
+M"7RF8P!4>`.E?'C[XW\``(`X6)B$8`$``$@+`!R(0``=?!0`@4!H+#^!`0`I
+M.6@L/Y$<``!("P`<B$``'7P0`(!`;"P_@0$`*3EL+#^1"P"\FX0!`$@``&`]
+M1``K.40`"X`$`&F!"`!)@0P`"8$(``&0#`!AD1``09$4``&1$``)@!0`:8$8
+M`$F!'``I@1@``9`<`&&1(`!!D20`(9%X*[U\``!@.`<`!2@P`:%!>/OC?P``
+M@#@DF81@`0``2.X'950Z$*!7"``A.2X`"7P\#@!4>`.E?'C[XW\``(`X))F$
+M8`$``$@*`!R(0``=?!0`@4!0+#^!`0`I.5`L/Y$<``!("@`<B$``'7P0`(!`
+M5"P_@0$`*3E4+#^1"@"\F[@``$@```4L,`"B0!@P'X#Z!P!4&#`?D'C[XW\!
+M``!(>/OC?P$``$@L!F14>/OC?P$``$B$``!(&#`?@`(`"7!X`()`'#`?@```
+M`"Q,`()!>/OC?P$``$@L!F14>/OC?P$``$AX^^-_``"`."R!A&!L,+^``0``
+M2'C[XW\``(`X-(&$8'`POX`!``!(>/OC?P$``$@8``!(>/OC?P$``$@``61@
+M>/OC?P$``$@8,!Z``@``8!@P'I`!`&`XC``!@*8#"'QT`&&#>`"!@WP`H8.`
+M`,&#A`#A@X@`(3@@`(!.Z/\AE*8""'P,`*&3$`#!DQ0`X9,<``&0>!M_?'@;
+M?7PD,,.#``!@.1``?I$<,`.`````++``@D$4`!Z`P``@/4!(`'P,`(%`1`!^
+MD10``$@4`#Z!P```/%``"7Q$`!Z0'``>@,``(#T`2`!\#`"!0````#@0``!(
+M'``^@<```#Q0``E\2``>D'C[XW\``(`X+(&$8$0`OH`!``!(>/OC?P``@#@T
+M@81@2`"^@`$``$AX^^-_``"`.#"!A&`"`*`\`0``2'C[XW\``(`X.(&$8``"
+MH#P!``!(A"R=.'C[XW\!``!(````.#P`'I!``!Z0'``!@*8#"'P,`*&#$`#!
+M@Q0`X8,8`"$X(`"`3NC_(92F`@A\$`#!DQ0`X9,<``&0>!M_?#02@X`8,`.`
+MO@<`5`,``"P@`:)`)###@PD`OH@#``4H$`"A00$`I3@!`(`X``$`2`H`OH@(
+M`!Z(0``%?!``H$`!`*4X!0"`..0``$B8+".!?@8@57\`*3G^R2E5/P``*`P`
+M@4&8+`.`_LD)5"@`'H````E\+`"!0`P`'H@````L2`"B0'C[XW\"`(`X``"@
+M.`$``$AX^^-_!0"`.(P``$@D`!Z````)?#P`@4`,`!Z(````+!0`HD%X^^-_
+M`@"`.`$`H#@!``!("P"^B`$`!2A@`*%!`0"E.'C[XW\$`(`X3```2'C[XW\!
+M``!(_O]C.`$``R@\`(%!#``>B````"P4`*)`>/OC?P(`@#@``*`X`0``2`L`
+M'H@````L%`"B07C[XW\$`(`X``"@.`$``$@<``&`I@,(?!``P8,4`.&#&``A
+M."``@$[H_R&4I@((?!``P9,4`.&3'``!D'@;?WPT$H.`&#`#@+X'`%0#```L
+MF`"B0"0PPX,)`+Z(`P`%*!``H4$!`*4X`0"`.'@``$B8+".!?@8@57\`*3G^
+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
+M`PA\%`#A@Q@`(3@@`(!.`0!@."``@$X``$`Y``!DH0``(#T```F@0``+?!P`
+M@4$``"DY`0!*.3H00%4N`@E\0``+?/#_@4`Z$$E5``!@/0``:SD46BE]`@!I
+MJ"``@$[H_R&4I@((?!``P9,4`.&3'``!D'@CGGQX&W]\M`!@.`$``$CL+W^0
+M```#+"``HD&````X?$8?D(``8#@!``!(>$9_D````RP4`()``@``.```'I``
+M`&`X:```2```(#T``"DYJ"P_D0``(#T``"DYK"P_D0``(#T``"DYL"P_D0``
+M(#T``"DYM"P_D0``(#T``"DYN"P_D0``(#T``"DYO"P_D0``(#T``"DYP"P_
+MD0``(#T``"DYQ"P_D0$`8#@<``&`I@,(?!``P8,4`.&#&``A."``@$[8_R&4
+MI@((?!``09,4`&&3&`"!DQP`H9,@`,&3)`#ADRP``9!X&WU\>".;?'@KNGQX
+M,]]\``#`.P``(#T``(D[&``>'"X`G'P&`!X<%-H`?#H0`%0N`+Q\>.NC?P$`
+M`$@!`/\[/P#@<PP`HD`!`&`X`0``2`$`WCL/`!XHQ/^!0```P#L``"`]``")
+M.S@8P%<4XB!]+@"<?`0`J8!XZZ-_`0``2`$`_SL_`.!S#`"B0`$`8#@!``!(
+M`0#>.T0`'BC,_X%```#`.P``(#T``(D[#``>'"X`G'P#`!X<%-(`?#H0`%0N
+M`+Q\>.NC?P$``$@!`/\[/P#@<PP`HD`!`&`X`0``2`$`WCL_`!XHQ/^!0"P`
+M`8"F`PA\$`!!@Q0`88,8`(&#'`"A@R``P8,D`.&#*``A."``@$[8_R&4I@((
+M?!``09,4`&&3&`"!DQP`H9,@`,&3)`#ADRP``9!X&WQ\>".=?```0#L``&`[
+M``!$H;\2"BC@`(%!</=J.69F`#UG9@AAED`+?'`.`'QP_FE]4``)?`4``!P`
+M``M\(`""0#P(257@[LD[ED`>?'`6`'QP_LE_4`#)?U```$@```2A4/=H.69F
+M0#UG9DIAEE`+?'`.`'QP_FE]4``)?`4``!P``&`X```+?$P"@D`\"`E5H.[)
+M.Y90'GQP%@!\</[)?U``R7\!`$`[.A;>5WCSPW\(`(`X`0``2'@;?GQXXX-_
+M``"`.`2BA&`!``!(```=H!``96"T"0`L"`""030'951XXX-_``"`.`2BA&`!
+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
+M`(`X`0``2'@;?GP``&`X_```2```/:',S``\S<P`8!8`"7P^X0!4%```'%!(
+M`'P^!`!4````+#``@D#_$PDH*`"A0$#M"3AF9F`\9V9C8)888'QP'F-\</X`
+M?%`88'PZ$&-4F```2```/:',S``\S<P`8!8`"7S^Z`!4"@``'%!(`'P^!`!4
+M````+"@`HD!`[0DX9F9@/&=F8V"6&&!\<!9C?'#^`'Q0&&!\/`AC5$P``$@`
+M`#VAS,P`/,W,`&`6``E\OO``5`4``!Q02`!\/@0`5```8#@````LA`"B0$#M
+M"3AF9F`\9V9C8)888'QP#F-\</X`?%`88'P(`(`X`0``2'@;?GP!`&`X`@"`
+M.`$``$AX&WM\-B#?5SH08%=X`_]_/`A`5W@#_W\!$/]C/@;E5WCC@W\``(`X
+MG)B$8`$``$A^QN57>..#?P``@#C8F(1@`0``2#02O),!`&`X+``!@*8#"'P0
+M`$&#%`!A@Q@`@8,<`*&#(`#!@R0`X8,H`"$X(`"`3MC_(92F`@A\"``!DPP`
+M(9,0`$&3%`!ADQ@`@9,<`*&3(`#!DR0`X9,L``&0>!M\?'@KNWQX&WI\``#`
+M.````#L``.`X```@.P``P#OL+^.#`@`$H/8%`%30```LI`""01@`@4&@```L
+MC`""0<```"R0`()!F```2$`!`"P,`()!4`$`+(@`HD```"2A7_`I.>H$"2@0
+M`(%!5!/:H%83&J-T``!(```DH73K*3GO``DH$`"!05@3VJ!:$QJC6```2```
+M)*&$ZBDYX``)*!``@4%<$]J@7A,:HSP``$@```2@7!8`*#``@4!@$]J@8A,:
+MHR0``$AD$^.@9A,CHQ@``$AH$_J@:A,ZHPP``$@``&`X*`,`2```0#D``"`]
+M```).3H02U4X&$E5%$(I?00`"8`N^0M\`0!*->C_@D$``&`Y```@/0``23DZ
+M$&E5%/HI?08`"QP4V@!\.A``5"X`"GP$``F0`0!K->#_@D$``&`Y```@/0``
+M23DZ$&E5%/HI?08`"QP4V@!\.A``5"X`"GP(``F0`0!K->#_@D$``&`Y```@
+M/0``23DZ$&E5%/HI?08`"QP4V@!\.A``5"X`"GP,``F0`0!K.20`"RC<_X%`
+M`@`$H(``"7"4`()!#`"_.WCKHW]X.^1\`P"@./$`P#@``.`X`0``2'CKHW]X
+MRR1_`P"@..X`P#@``.`X`0``2'CKHW\!`(`X`0"@.",!P#@"`.`X`0``2,P!
+M'(`)```L&`""00H``"QH`*)`T`$<H`,``"A<`(%!!@!@.`,`@#@!``!(>!MD
+M?`P`?S@#`*`X@P#`.`,`X#@T``!(#`"_.WCKHW]X,\1\`P"@./<`P#@``.`X
+M`0``2'CKHW]XPP1_`P"@./0`P#@``.`X`0``2```8#D``"`]``!).3H0:544
+M^BE]!@`+'!3:`'PZ$`!4+@`*?*``"9`!`&LY`@`+*-S_@4```*`[```@/0``
+M:3LX&*!7+@";?#H0H%<N`+]\>..#?P$``$@!`-X[/P#`<PP`HD`!`&`X`0``
+M2`$`O3?0_X)!``"@.P``(#T``&D[&``='"X`FWPZ$*E7%/HI?00`J8!XXX-_
+M`0``2`$`WCL_`,!S#`"B0`$`8#@!``!(`0"]-\S_@D$``*`[```@/0``:3L8
+M`!T<+@";?#H0J5<4^BE]"`"I@'CC@W\!``!(`0#>.S\`P',,`*)``0!@.`$`
+M`$@!`+TWS/^"00``H#L``"`]``!I.Q@`'1PN`)M\.A"I5Q3Z*7T,`*F`>..#
+M?P$``$@!`-X[/P#`<PP`HD`!`&`X`0``2`$`O3LD`!THR/^!0```H#L``"`]
+M``!I.Q@`'1PN`)M\.A"I5Q3Z*7V@`*F`>..#?P$``$@!`-X[/P#`<PP`HD`!
+M`&`X`0``2`$`O3L"`!THR/^!0````#C$+QJ0`0!@."P``8"F`PA\"``!@PP`
+M(8,0`$&#%`!A@Q@`@8,<`*&#(`#!@R0`X8,H`"$X(`"`3NPO8X`'``0H0`"!
+M00``(#W(#2DY.A"`5"X`"7P42@!\I@,)?"`$@$X$`&,X(`"`3@@`8S@@`(!.
+M#`!C."``@$Z@`&,X(`"`3@``8#@@`(!./`B@5!0"9'T```2@```#?`P`@$``
+M```X%```2/[_"Z````-\.`"`0?__!3@```>0```&D"``@$Y02`1\<`X`?.S_
+M_TM02"1]<`XI?0``)I$!`"DY```GD2``@$YX(XE\0%@$?"``@$P```F@`!@`
+M?,C_HD$"``F@```#?,C_H$$"`"DY0%@)?"``@$S<__]+P/\AE*8""'P<`.&2
+M(``!DR0`(9,H`$&3+`!ADS``@9,T`*&3.`#!DSP`X9-$``&0>!MW?'@SWGQX
+M._M\>$,<?7A+.'T\"(!4-`<??```H#L``&`X`0`(*/0`@4!0*`1\/@0`5$``
+M'7S@`(%!__\H.U`H!'P^!!I4>/OC?WCSQ']XXX5_"`#!.`P`X3CE_O]+#``!
+M@````"P,`()``0``.`P``9`(``&``,@`?`P`HD#^_QPX"``!D`@``8`\"`M4
+M#``!@#P(`%2N\BM]K@(>?```"7P,`*)`+MHK?40``$@(``&!/`@(5:[RZ'Q0
+M^"=]#``!@#P(`%0N`GM]UEDI?:X"7GU04!]\+MIH?=99`'P4`BE]4%!'?=93
+M*7T^!"E5,C#@5A3J`'P\"`!4+@,X?0$`'3@^!!U4`@`?.#0''WQ`T!U\-/^!
+M0`$`8#A$``&`I@,(?!P`X8(@``&#)``A@R@`08,L`&&#,`"!@S0`H8,X`,&#
+M/`#A@T``(3@@`(!.>!MI?'@SPWP`(`5\(`""35!(!'S6.0!\4"@I?=8Q*7T4
+M2@!\4"@D?=9+`'PT!P-\(`"`3I#_(92F`@A\-``ADC@`09(\`&&20`"!DD0`
+MH9)(`,&23`#ADE```9-4`"&36`!!DUP`89-@`(&39`"ADV@`P9-L`.&3=``!
+MD'@CE7QX*[]\>#/2?'@[\7QX0Q1]>$LS?7A36'VD+,.#``#@.C0'@WP4`*6@
+M>/OD?R@`P3@L`.$X/?W_2P``(#L(`,$Z`P!Y(R@``8!F```<&`!['11:`'P4
+M^B!](`!)HP``&BRL`8)!/`CJ5AX`":`NFPI\"``!.2P`":`N0PI\+``A@68`
+M*1T46BE]%/HI?:Y":GTL`"FA-`<@?0``"WP(`(%`+D,J?3P(Z584LDE]KK()
+M?'`.`'R4`0!\+K,)?"@`(8$S`"D=#`!['11:*7T4TBE]/`@I513Z*7TJ``F@
+M$``*L"P`(8$S`"D=%%HI?132*7T\""E5%/HI?1``:JDJ`"FA-`<@?0``"WP(
+M`(%`$``JL3P(_%84LKQ_$``=J'`.`'R4`0!\$``=L*ZRG'P0`+VH*`#A@&8`
+MYQP8`'L?%-KG?!3ZYWPL`,<X(@#G.'B[XWYXTTA_>//)?ZG\_TNNLIQ\$`"]
+MJ"P`X8!F`.<<%-KG?!3ZYWPL`,<X(@#G.'B[XWYXTTA_``(^.7G\_TL``&`[
+M$``=H"ZR/'U0``E\/@0`5$``&WQD`(!`"`!!.S(PZ584VBE]/`@I513RJ7\H
+M``&`/`@`5"X"GWPL``&`/`@`5"X"OWRN\LE\``+]J'BKHWZA_?]+``1]L`$`
+M>SL4TCQ]$``)H"[2/'U0``E\/@0`5$``&WRH_X!!`0#W.@$`.3L#`!DH+/Z!
+M0`@``:```!&P``!@.P``(#M`N!M\[`&`0`@`83C__Q<X```9?!P`HD`\""!7
+M%!H@?1``*:$$`"DY+@,T?20``$@\""M7%!HK?1``":@"`"FI%$H`?'`.`'R4
+M`0!\+J,+?```0#D``!DL'`""03P(*U<4HBM]_O\)H*X:*WU0``E\4`!2?3`X
+M*5<4\BE]`@0)H``$*:%0``E\`0`@.?__"'`(`()!>$,)?7A+*'T```HL0`"@
+M0#`X(%<4\N!\UD$*?``$)Z$4`BE]/`A@5Q3"8'T!`'L[````.#4'*7T(`(!!
+M>$L@?0``"[`!`$HUT/^`03P((%<4&B!]$`")J*X"(WU0((E\+@+T?!22YWQ0
+M..E\>".%?$`X!'P(`(%`>#OE?#0'H'QX`P9\```*?#``@$`R,"A7/`AK5Q12
+M*'T\""E5%/(I?0`$":`NPPM\`0!*.0$`>SL`,`I\W/^`03(P*5<4(BE]/`@I
+M513R*7W^`PF@_`,IH5``"7P!`"`Y__\(<`@`@D%X0PE]>$LH?4`H!WQD`(%`
+M-`?@?```"GQ8`(!`,C`@5Q0B`'P\"`!4%/+`?#0'YWQ04"5]UD$I??X#!J`4
+M2@!\-`<)?#P(8%<4PF!]`0![.WA+('U_``DL"`"!0'\``#@```NP`0!*.0`X
+M"GS$_X!!`0`Y.T"X&7P@_H!!`P`9*"``@4$\""M7%*(K??[_":`NHPM\`0`Y
+M.P,`&2CH_X%`?P`;*"``@4$\"&M7%,(K??[_":`NPPM\`0![.W\`&RCH_X%`
+M=``!@*8#"'PT`"&".`!!@CP`88)``(&"1`"A@D@`P8),`.&"4``!@U0`(8-8
+M`$&#7`!A@V``@8-D`*&#:`#!@VP`X8-P`"$X(`"`3L#_(92F`@A\)``ADR@`
+M09,L`&&3,`"!DS0`H9,X`,&3/`#ADT0``9!X&WU\>#/??'@[^7QX&WM\>$:#
+M@P(`!J#0``!PP``):```:2$422M]T```:```8"$4`0M\_"?#.WD#*WT<`()`
+M`@`&H*```'#H(\,[H```+`@`@D'4'\,[>.NC?P``@#ALHH1@`0``2#X'>E0`
+M`)^@>.NC?WCSQ7]XTT9_"`#A.!```3EXRRE_>..*?U7Z_TMXZZ-_``"`.%BB
+MA&`!``!(G@1E5!P`/J'__RDY(G0I57A+I7QXZZ-_``"`.%BBA&`!``!("``!
+MH````"P,`()!T```?`@``$@````X]"\;L```P#N`HMYC``#@.S@8X%<4XB!]
+MK@"\?`(`"8@N0`!4>`.E?`0`"8@>@`!4>`.E?`8`"8@.P`!4>`.E?'CKHW]X
+M\\1_`0``2`0`WCL!`/\['P`?*+C_@4`0`*&@MB6E5'@K17\2``&@*E0`5'@#
+MI7P4``&@GH(`5'@#I7P6``&@$K$`5'@#I7QXZZ-_``"`.&RBA&`!``!(`0!@
+M.$0``8"F`PA\)``A@R@`08,L`&&#,`"!@S0`H8,X`,&#/`#A@T``(3@@`(!.
+MZ/\AE*8""'P4`.&3'``!D'@;?WQX1F.````#+!``HD$!``!(````.'A&'Y#L
+M+W^````#+!``HD$!``!(````..PO'Y"D+'^````#+!``HD$!``!(````.*0L
+M'Y`<``&`I@,(?!0`X8,8`"$X(`"`3@``(#D#``D@&```'!0B8'P(``.@````
+M+`P`HD$4`&.H(`"`3@$`*3D``&`X`P`)*"``@4W0__]+``!@.1@`*QT4(BE]
+M"``)H````"P<`*)!#``K'10"*7T\""E5%"(I?1(`::@@`(!.`0!K.0``8#@#
+M``LH(`"!3<3__TO(_R&4I@((?!``P9(4`.&2&``!DQP`(9,@`$&3)`!ADR@`
+M@9,L`*&3,`#!DS0`X9,\``&0>!M\?'@CGGQX*[I\>#/7?```X#L``.6S`@`$
+MH-```'#```EH``!)(11)*GW0``!H``!`(10!"GS\)X,X>0,J?1P`@D`"`!Z@
+MH```<.@C@SB@```L"`""0=0?@S@4`*2C&`#D.P``8#@``!TLJ`&"00``?J$`
+M`!^@0``+?!@`@$%F`#T=%/HI?9K_":!```M\/`"!0```'J```#^A9@"]'Q3J
+MOW^:_[T[0$@`?$0!@$!XXX-_>/OD?]'^_TL``'JP>..#?WC[Y']``0!(````
+M.0``8#D`Z`M\.`"`0```'J```#^A0$@`?"@`@4!X`PE\>%MH?0$`:SD`Z`M\
+M%`"`0&8`"QPN`A]\0``)?.3_@4%F``L<%/K`?BX"?W]F`"@?%/H9?R[Z&7Q1
+MV&!_J`"!0'CC@W]XL\1^4?[_2W@;?7QXXX-_>,,$?T'^_TM0Z*-_```>H"[Z
+M.7U0``E\U@&]?WCC@W]XPP1_(?[_2];98WP4&KU_UMN]?W0'O7\``+JS>..#
+M?WBSQ'[)_?]+>!M]?'CC@W]XPP1_N?W_2U#HHW\``!Z@+OHY?5``"7S6`;U_
+M>..#?WC#!'^9_?]+UMEC?!0:O7_6V[U_=`>]?P``M[-```!(9@`+'!3ZH'\`
+M`#ZA+@(??```8#@```E\*`"B0'CC@W]XZZ1_D?W_2P``>K!XXX-_>.ND?TG]
+M_TL``'>P`0!@.#P``8"F`PA\$`#!@A0`X8(8``&#'``A@R``08,D`&&#*`"!
+M@RP`H8,P`,&#-`#A@S@`(3@@`(!.T/\AE*8""'P8`$&3'`!ADR``@9,D`*&3
+M*`#!DRP`X9,T``&0>!M[?'@CG'QX*[U\`0!`.P``P#M`*!Y\3`"@0#@8P%<4
+M`OQ_>-MC?WC[Y'\(`*$X"@#!."G]_TL```,L&`""00@``8@&`!^8"@`!B`<`
+M'Y@(``!(``!`.P$`WCM`Z!Y\O/^`07C30W\T``&`I@,(?!@`08,<`&&#(`"!
+M@R0`H8,H`,&#+`#A@S``(3@@`(!.Z/\AE*8""'P0`,&3%`#ADQP``9!X(YY\
+M>!M_?*P`8#@!``!(["]_D````RPT`*)!``$`.'Q&'Y```6`X`0``2'A&?Y``
+M``,L&`"B00`&8#@!``!(I"Q_D````RP4`()``@``.```'I```&`X:```2```
+M(#T``"DYJ"P_D0``(#T``"DYK"P_D0``(#T``"DYL"P_D0``(#T``"DYM"P_
+MD0``(#T``"DYN"P_D0``(#T``"DYO"P_D0``(#T``"DYP"P_D0``(#T``"DY
+MQ"P_D0$`8#@<``&`I@,(?!``P8,4`.&#&``A."``@$XH4!8L6"@``!0)``!,
+M"@``4`H``%0*```L"0``7`H``$@)``!4"0``H`H``&0)``!T"0``N`D``)0)
+M``"D"0``N`D``-`)``#`"@``Q`H``!P*```L"@``F`H``$`*``"@"@``5`H`
+M`&0*``!T"@``Z`H``.P*``"X"@``]`H``,@*``#\"@````L```0+``#X"@``
+MH/^C_Y[_H/^C_Z#_```%``H`%``>`#(`1@!5`%H`7P!D````"@`4`!X`*``R
+M`#P`1@!0`%H`9``$``8`"0`,`,(```#$````Q0```-````#:````Y````,(`
+M``##````U````/(````-`0``*`$``,\```#*`````@!0(0$`0`$$`*``"`#`
+M`"``T`!``%`!`````"0!F!D`)A`&````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````#_______\```"8``!'````")@````````,F```IHZ$"1"8````
+MX#(]%)@``&L'```<F````````""8`````@("))@```X.```HF````0(""BR8
+M``#\;P,`,)@````````TF```#@X``#B8```'````/)@````!`@!`F`````!C
+MB428``"<%G(32)@``#.V&`!,F```/&&$$E"8``#@N.@-5)@``%E(!P!8F```
+MNKZ`?ER8``!>9CHQ8)@```@=``!DF````,X!`&B8``"009I`<)@```\```!T
+MF```@````'B8```$`````)D````````$F0````````B9````````#)D`````
+M@``0F0```P````";````````!)L``"`````(FP``$`````R;```P````$)L`
+M``@````4FP``*````!B;```H````')L```0````@FP``)````"2;```4````
+M*)L``#0````LFP``#````#";```L````-)L```(````XFP``(@```#R;```2
+M````0)L``#(```!$FP``"@```$B;```J````3)L```$```!0FP``(0```%2;
+M```1````6)L``#$```!<FP``"0```&";```I````9)L```4```!HFP``)0``
+M`&R;```5````<)L``#4```!TFP``#0```'B;```M````?)L```,```"`FP``
+M(P```(2;```3````B)L``#,```",FP``"P```)";```K````E)L```<```"8
+MFP``)P```)R;```7````H)L``#<```"DFP``#P```*B;```O````K)L``"\`
+M``"PFP``+P```+2;```O````N)L``"\```"\FP``+P```,";```O````Q)L`
+M`"\```#(FP``+P```,R;```O````T)L``"\```#4FP``+P```-B;```O````
+MW)L``"\```#@FP``+P```.2;```O````Z)L``"\```#LFP``+P```/";```O
+M````])L``"\```#XFP``+P```/R;```O`````)H``!T````$F@``70````B:
+M``"=````#)H``-T````0F@``'0$``!2:```A````&)H``&$````<F@``H0``
+M`"":``#A````))H``#$````HF@``<0```"R:``"Q````,)H``!P````TF@``
+M7````#B:```I````/)H``&D```!`F@``J0```$2:```@````2)H``!D```!,
+MF@``60```%":``"9````5)H``#````!8F@``!0```%R:```E````8)H``&4`
+M``!DF@``I0```&B:```H````;)H``&@```!PF@``'P```'2:```>````>)H`
+M`!@```!\F@``6````(":``"8````A)H```,```"(F@``!````(R:``!$````
+MD)H``(0```"4F@``$P```)B:```2````G)H``%(```"@F@``D@```*2:``#2
+M````J)H``"L```"LF@``*@```+":``!J````M)H``*H```"XF@``&P```+R:
+M```:````P)H``%H```#$F@``F@```,B:``#:````S)H```8```#0F@``!@``
+M`-2:```&````V)H```8```#<F@``!@```.":```&````Y)H```8```#HF@``
+M!@```.R:```&````\)H```8```#TF@``!@```/B:```&````_)H```8```#4
+MF```(````,R8```$````R)@```8!!@"<F```;0```,"8````````T)@``!0`
+M```)"0```````@(&!@8&!@8"`@````,`!@`)`#P`````````````````````
+M``````````#P````S`````````````````````KB````(```"@(```$8```!
+M````0!@$```%!%<9`"80!@``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````;`F/";0)````@```()@``%55556JJJJJ9F9F9IF9F9G_______\`````
+M```@````(````$````!````````&````!@````8`,````!4````5````'0``
+M`!4```!`$```#_PO``_\+P`?_"\`#_PO`$00```/_"\`#_PO`!_\+P`/_"\`
+M2!````_\+P`/_"\`'_PO``_\+P!,$```#_PO``_\+P`?_"\`#_PO`%`0```/
+M_"\`#_PO`!_\+P`/_"\`5!````_\+P`/_"\`'_PO``_\+P!8$```#_PO``_\
+M+P`?_"\`#_PO`%P0```/_"\`#_PO`!_\+P`/_"\`8!````_\+P`/_"\`'_PO
+M``_\+P!D$```#_PO``_\+P`?_"\`#_PO`'`0``!H`0``X`$``+@!``!H`0``
+M,!```#`"``#@`0``L````#`"``"P$```F`T``(`1``!('P``F`T``/`0``#@
+MH```:$`!`(!8``#@H```%(`````$``0`"``(`#``(``$``0<@```IX^-#L^/
+MC0Z5CV`!IX^-#@28`````````P``````````````()@````"`@(``@("``(!
+M`@`"`@(DF```#@X```X.```'!P``#@X``"B8```!``(*`0`""@```04!``(*
+M-)@```X.```.#@``#@X```X.```XF```!P````<````+````"P```$28``"<
+M%G(3I19R$Z@6<A.<%G(32)@``&>Z&`!GNA@`:;H8`&FZ&`!0F```X+0H#."T
+M*`S@M"@,X+0H#%B8```N#8!^+@V`?BX-P'XN#8!^7)@``%Y=-S%>73<Q7ETZ
+M,5Y=-S%@F```$+T``!"]```XO0``$+T``&28````S@$``,X!``#.`0``S@$`
+M%)D``!`G```0)P``?!4``!`G```8F0``D`$``)`!``"$````D`$``$29```@
+M$.!O(!#@;R`)X&\@$.!O@*$``/\4_P7_%/\%_Q3_!?\9_P74F```$````!0`
+M```0````$`````P`````````*````)R<A(0L````?'Q\?#0````%````0```
+M``````!$````"````$@````(````3````!````!0`````````%0````?````
+M``@````````$"`````````@(````````#`@````````0"````````!0(````
+M````&`@````````<"````````"`(````````)`@````````P$@````````2`
+M````````"(`````````,@````````!B`````````)(`````````H@```,```
+M`"R```#__P<`,(```/___P$T@```,0```#B`````````/(````````!`@```
+M`````$2````"````2(````````!4@````````%B`````````")@````````,
+MF```DY"$+1"8````X#)]%)@``&L/```<F````````"R8``#^;P(`,)@`````
+M```\F`````$"`$"8``!Z`6H@3)@``#QAA!)4F```60@``&B8``"009I`;)@`
+M`(&P#`5PF```#P```'28``"`````>)@```P`````F0````````29````````
+M")D````````,F0````"``!"9```!````')D``"H)```@F0```````"29```%
+MB@4`*)D```$````LF0```````#"9````````-)D````````XF0```````#R9
+M```_````0)D```0```!(F0```````$R9````````4)D```````!4F0``3/%0
+M75B9```8````7)D``(YJ2P"$H0``_P7_!HBA``#_!_\'C*$``/\(_PB0H0``
+M_PG_"92A``#_"O\*F*$``/\+_PN<H0``_PS_#*"A``#_#?\-I*$``/\._P^H
+MH0``_Q+_$JRA``#_$_\4L*$``/\5_Q:TH0``_Q?_&;BA``#_&O\;O*$``/\=
+M_Q[`H0``_R#_(\2A``#_)?\GR*$``/\I_RS,H0``_R__,="A``#_-/\WU*$`
+M`/\Z_SK8H0``_SK_.MRA``#_.O\ZX*$``/\Z_SKDH0``_SK_.NBA``#_.O\Z
+M[*$``/\Z_SKPH0``_SK_.O2A``#_.O\Z^*$``/\Z_SK\H0``_SK_.@";````
+M````!)L``"`````(FP``$`````R;```P````$)L```@````4FP``*````!B;
+M```$````')L``"0````@FP``%````"2;```T````*)L```P````LFP``+```
+M`#";```"````-)L``"(````XFP``$@```#R;```R````0)L```H```!$FP``
+M*@```$B;```&````3)L``"8```!0FP``%@```%2;```V````6)L```X```!<
+MFP``+@```&";```!````9)L``"$```!HFP``$0```&R;```Q````<)L```D`
+M``!TFP``*0```'B;```%````?)L``"4```"`FP``%0```(2;```U````B)L`
+M``T```",FP``+0```)";```#````E)L``",```"8FP``$P```)R;```S````
+MH)L```L```"DFP``*P```*B;```K````K)L``"L```"PFP``*P```+2;```K
+M````N)L``"L```"\FP``*P```,";```K````Q)L``"L```#(FP``*P```,R;
+M```K````T)L``"L```#4FP``*P```-B;```K````W)L``"L```#@FP``*P``
+M`.2;```K````Z)L``"L```#LFP``*P```/";```K````])L``"L```#XFP``
+M`@```/R;```6````U)@``"````#8F```:!!@``":``"I`0````````2:``#I
+M`0``0`````B:```I````@`````R:``!I````4`$``!":``"9`0``D`$``!2:
+M``#9`0``T`$``!B:```9````$````!R:``!9````1````"":``"9````A```
+M`"2:``"E`0``2`$``"B:``#E`0``B`$``"R:```E````R`$``#":``#(`0``
+M%````#2:```(````0@```#B:``!(````@@```#R:``"(````>`$``$":``"8
+M`0``N`$``$2:``#8`0``^`$``$B:```8````$@```$R:``!8````4@```%":
+M``"8````D@```%2:``"D`0``?`$``%B:``#D`0``O`$``%R:```D````_`$`
+M`&":``!D````"@```&2:``"D````2@```&B:``#D````B@```&R:```*`0``
+M6@$``'":``!*`0``F@$``'2:``"*`0``V@$``'B:``#*`0``#@```'R:```*
+M````3@```(":``!*````C@```(2:``"*````7@$``(B:``"Z`0``G@$``(R:
+M``#Z`0``W@$``)":```Z````"0```)2:``!Z````20```)B:``"&`0``B0``
+M`)R:``#&`0``>0$``*":```&````N0$``*2:``!&````^0$``*B:``"&````
+M.0```*R:``#&````>0```+":``#&````N0```+2:``#&````O0$``+B:``#&
+M````_0$``+R:``#&````/0```,":``#&````?0```,2:``#&````O0```,B:
+M``#&````_0```,R:``#&````_0```-":``#&````_0```-2:``#&````_0``
+M`-B:``#&````_0```-R:``#&````_0```.":``#&````_0```.2:``#&````
+M_0```.B:``#&````_0```.R:``#&````_0```/":``#&````_0```/2:``#&
+M````_0```/B:``#&````_0```/R:``#&````_0````$```!&````8`````$`
+M``!&````80````$```!&````8@````$```!&````8P````$```!&````9```
+M``$```!&````90````$```!&````9@````$```!&````9P````$```!&````
+M:`````$```!&````:0````$```!&````:@````$```!&````:P````$```!&
+M````;`````$```!&````=`````$```!&````=`````$```!&````=`````$`
+M``!&````=`````$```!&````=`````$```!&````=`````$```!&````=```
+M``$```!&````=`````$```!&````=0````$```!&````=@````$```!&````
+M=P````$```!&````>`````$```!&````>0````$```!&````>@````$```!&
+M````>P````$```!&````?`````$```!&````?0````$```!&````?@````$`
+M``!&````?P````$```!&````@`````$```!$````?`````$```!&````B```
+M``$```!&````C`````$```!&````D`````$```!&````E`````$```!&````
+MF`````$```!&````G`````$```!&````H`````$```!&````I`````$```!&
+M````J`````$```!&````K`````$```!&````L`````$```!&````M``````"
+M!P">%@L`8A8*`#H6"0`<%@@`ZA4'`)H5!0!*%00``Q4"`%D4``````$````#
+M``8`"0`_````S",``-`C``#P(P``]",``!0D```8)```."0``#PD```)````
+M!`````0``0`!``$`!@```$9'.``````````````````$`````0`!``0```!&
+M1S<``````````````````P`!``$``0`#````1D<V``````````````````0`
+M``````$``0```$9'-0`````````````````$``$``0````````!&1S0`````
+M````````````!`````$```#^____1D<S``````````````````,``0`!````
+M_?___T9',@`````````````````$`````````/S___]&1S$`````````````
+M`````@`!``$```#Z____1D<P````````````````````````````````````
+M````````````````````````%!!4&0`F$`8`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````&P)CPFT"0@);`FT"<G____)____R?___\G____"____
+M\O____+____R____\O____3____`____P/___\#____`____NO___[+___^R
+M____LO___[+___^P____________!0(/!P(/"@`/"0`/````@```()@``%55
+M556JJJJJ9F9F9IF9F9EX`P``-`,``$`#``#$`P``8`,``,0#````````(```
+M`"````!`````0```````!@````8````&`)X6"P!B%@H`.A8)`!P6"`#J%0<`
+MFA4%`$H5!``#%0(`610``+@+`0``````@!0```@2``!,$@``=!(``)`4``#8
+M$@``F!0``)P4``"@%```I!0``*@4```@$P``L!0``+04``"X%```O!0``#P3
+M``!<$P``R!0``+`3``#8$P``U!0``.P2``#<%```X!0``.04```X%```2!0`
+M`/`4``!<%```>!0``'P4``!8%```9!0``'`4``!\%```B!0````````&````
+M`0````(````#````!`````4```"$%@``B!8``/P4```@%0``E!8``&P5``"<
+M%@``H!8``*06``"H%@``K!8``+`5``"T%@``N!8``+P6``#`%@``W!4``,@6
+M``#,%@``^!4``*`6``#8%@``W!8``.`6``#D%@``Z!8``#@6```\%@``]!8`
+M`)@6``!`$```#_PO``_\+P`?_"\`#_PO``_\+P!$$```#_PO``_\+P`?_"\`
+M#_PO``_\+P!($```#_PO``_\+P`?_"\`#_PO``_\+P!,$```#_PO``_\+P`?
+M_"\`#_PO``_\+P!0$```#_PO``_\+P`?_"\`#_PO``_\+P!4$```#_PO``_\
+M+P`?_"\`#_PO``_\+P!8$```#_PO``_\+P`?_"\`#_PO``_\+P!<$```#_PO
+M``_\+P`?_"\`#_PO``_\+P!@$```#_PO``_\+P`?_"\`#_PO``_\+P!D$```
+M#_PO``_\+P`?_"\`#_PO``_\+P`P$```,`(``.`!``"P````8`$``.`!``!P
+M$```:`$``.`!``"X`0``C`$``.`!``"P$```8`X``(`1```<'P``.#X``(`1
+M``#P$```X*```&A``0"`6```X+```&A``0`4@```Z`/H`^`&X`8@!"`$0`A`
+M".`&X`8$F`````````,```````````````,````@F`````("`@`"`@(``@$"
+M``("`@`"`@(DF```#@X```X.```'!P``#@X```X.``!$F```'!9R$R4<<A,B
+M%W(3HA9R$R4<<A-@F```$)T``!"=```8G0``&)T``!"=``!DF````,X!``#.
+M`0``S@$``,X!``#.`0!HF```D$&:0)!!FD"009I`D$&:0)!!FD`8F0``N`$`
+M`+@!``"$````"`$``+@!```DF0``!8H%$`6*!1`%B@40!8H%$`6*!1`PH@``
+M````````````````"`$````````,`````````#0````%````0`````````!$
+M````"````$@````(````3````!````!0`````````%0````?``````@`````
+M```$"`````````@(````````#`@````````0"````````!0(````````&`@`
+M```````<"````````"`(````````)`@```````!P$@```````#@0````````
+M>!````````"X$````````/@0````````.!$```````!X$0```````+@1````
+M````^!$````````X$@```````'@2````````N!(```````#X$@```````#@3
+M````````>!,```````"X$P```````/@3````````.!0```````!X%```````
+M`+@4````````^!0````````X%0```````'@5````````N!4```````#X%0``
+M`````#@6````````>!8```````"X%@```````/@6````````.!<```````!X
+M%P```````+@7````````^!<````````\$````````'P0````````O!``````
+M``#\$````````#P1````````?!$```````"\$0```````/P1````````/!(`
+M``````!\$@```````+P2````````_!(````````\$P```````'P3````````
+MO!,```````#\$P```````#P4````````?!0````````$@`````````B`````
+M````#(`````````@@````````"2`````````*(```#`````L@```__\'`#"`
+M``#___\!-(```#$````X@````````#R`````````2(````````!4@```````
+M`%B`````````7(```(_'#P#`@```&C""*L2```#@`=P%R(```!`G0!_,@```
+M``#T`="````<'@``U(```*JJ`@#8@```554``MR`````````X(```/_____D
+M@```__\``.B`````````[(````````#P@````````/2`````````^(``````
+M``#\@```B`````"'````````!(<``(P````(AP``Y`````R'``#5`@``$(<`
+M```````4AP```````!B'``"@````'(<``,D!```@AP``+````"2'```L````
+M*(<``#`````LAP``/````#"'```L````-(<``"P````XAP``,````#R'```\
+M````0(<```````!$AP```````$B'````````3(<```````!0AP```````%2'
+M````````6(<```````!<AP```````&"'``#5````9(<``-\```!HAP```@$`
+M`&R'```Z`0``<(<``'4```!TAP``?P```'B'``"B````?(<`````````@0``
+M`@`!``2!```!````"($``,`````,@0```````!"!``!H`0``%($```````#`
+MAP````$"`\2'```$!08'R(<```@)"@O,AP``#`T.#]"'```0$1(3U(<``!05
+M%A?8AP``&!D:&]R'```<'1X?X(<````!`@/DAP``!`4&!^B'```("0H+[(<`
+M``P-#@_PAP``$!$2$_2'```4%187^(<``!@9&AO\AP``'!T>'PR8```9CH2M
+M$)@```#@*'T4F```:Y\*G!R8````````0)@``'H!:B!4F```60@```"9````
+M````!)D````````(F0````````R9`````(``$)D```$````<F0``@`P``""9
+M`````!`%*)D```$````LF0``!````#29```B(!\>.)D```T,"PH\F0``/P``
+M`$B9```2LH"25)D``(CA4%U<F0``CFI+`&B9``#.`P``<)D``!6U+QEXF0``
+M`0```'R9````````$*(``#-C@``4H@``$&P0`!BB``!@0)P`(*(``,8PB`$D
+MH@````0``"RB````````-*(``"`@("`XH@``("`@($"B```@"DDX1*(``+9[
+M``!(H@``_#__#P";````````*)L```P````XFP``$@```&2;```A````C)L`
+M`"T```"<FP``,P````$``@`"``$``0`"``$````#``8`"0`_`````P`&``D`
+M/P````D````$````!``!``$``0````````````8```!&1S@`````````````
+M````!`````$``0````````````0```!&1S<``````````````````P`!``$`
+M`0````````````,```!&1S8`````````````````!````````0``````````
+M``$```!&1S4`````````````````!``!``$```````````````````!&1S0`
+M````````````````!`````$``````````````/[___]&1S,`````````````
+M`````P`!``$``````````````/W___]&1S(`````````````````!```````
+M`````````````/S___]&1S$``````````````````@`!``$`````````````
+M`/K___]&1S``````````````````````````````````````````````````
+M````````````````"`````$````#````````````````````!@```$9'-P``
+M```````````````"`````````````````````````$9'-@``````````````
+M```!````````````````````_?___T9'-0``````````````````````````
+M````````````^O___T9'-`````````````````````$``0``````````````
+M^/___T9',P````````````````````$``0````$``0``````]O___T9',@``
+M``````````````````$````!``$``0``````\____T9',0``````````````
+M``````$````!``$````!````\/___T9',```````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````!_````,@```'\````H````?P```$T```!_
+M````0````!\````0````/P```#`````(````!@`````````$````"`````(`
+M```$````!@````@````*````#`````X````0````!`H``/0#```,!0``7`<`
+M`/`'``"8"```:`D``#`````5@```%8```!6````5@```%8```!R```"GCXT2
+MSP^("94/X`2K#^`2SP^("2B8```!``(*`0`""@`!`04!``(*`0`""C28```.
+M#@``#@X```X.```.#@``#@X``#B8```'````!P````L````+````"P```$B8
+M``!:VA@`6MH8`&G*&`!IRA@`:<H8`%"8``#@M.@-X+3H#>"TZ`W@M.@-X+3H
+M#5B8```N#8!^+@V`?BY-Z'XN3>A^+@V`?ER8``!>9C<Q7F8W,5YF-S%>9C<Q
+M7F$W,6R8``"!L`P%@;`,!8&P#`6`L`P%@+`,!129```0)P``$"<``'P5``#X
+M*@``$"<``$29```@$+CW(!"X]R`-N/<@$+CW(!"X]PRB``!J02QD:D$L9&I!
+M0&1J04!D:D%`9!RB```*@(,8"H"#&`J`<Q@*@(,8"H"#&#`2````````")@`
+M```````LF```_B\"`#R8`````0(`3)@``#QAA!(PF0``@T@``$"9```$````
+M6)D``/\```!TF0```````/B9```8````!*(````````(H@``B&<^T"BB``"U
+M`0``/*(``*^)R!,$FP``(`````B;```0````#)L``#`````0FP``"````!2;
+M```H````&)L```0````<FP``)````"";```4````))L``#0````LFP``+```
+M`#";```"````-)L``"(````\FP``,@```$";```*````1)L``"H```!(FP``
+M!@```$R;```F````4)L``!8```!4FP``-@```%B;```.````7)L``"X```!@
+MFP```0```&B;```1````;)L``#$```!PFP``"0```'2;```I````>)L```4`
+M``!\FP``)0```(";```5````A)L``#4```"(FP``#0```)";```#````E)L`
+M`",```"8FP``$P```*";```+````I)L``"L```"HFP``*P```*R;```K````
+ML)L``"L```"TFP``*P```+B;```K````O)L``"L```#`FP``*P```,2;```K
+M````R)L``"L```#,FP``*P```-";```K````U)L``"L```#8FP``*P```-R;
+M```K````X)L``"L```#DFP``*P```.B;```K````[)L``"L```#PFP``*P``
+M`/2;```K````^)L```(```#\FP``%@```)R8````````````````````````
+M`````)R8`````````````````````````````)R8````````````````````
+M`````````)R8`````````````````````````````)R8````````````````
+M`````````````)R8`````````````````````````````)R8````````````
+M`````````````````)R8`````````````````````````````)R8````````
+M`````````````````````)R8`````````````````````````````)R8````
+M`````````````````````````)R8`````#@````X````.````#@````X`)R8
+M`````````````````````````````)R8````````````````````````````
+M`)R8`````````````,````"`````@````)R8``#Y``0`^0`$`/\`!`#]``0`
+M_0`$`-28``````````````0````$````!`````":``"I`0````````2:``#I
+M`0``0`````B:```I````@`````R:``!I````4`$``!":``"9`0``D`$``!2:
+M``#9`0``T`$``!B:```9````$````!R:``!9````1````"":``"9````A```
+M`"2:``"E`0``2`$``"B:``#E`0``B`$``"R:```E````R`$``#":``#(`0``
+M%````#2:```(````0@```#B:``!(````@@```#R:``"(````>`$``$":``"8
+M`0``N`$``$2:``#8`0``^`$``$B:```8````$@```$R:``!8````4@```%":
+M``"8````D@```%2:``"D`0``?`$``%B:``#D`0``O`$``%R:```D````_`$`
+M`&":``!D````"@```&2:``"D````2@```&B:``#D````B@```&R:```*`0``
+M6@$``'":``!*`0``F@$``'2:``"*`0``V@$``'B:``#*`0``#@```'R:```*
+M````3@```(":``!*````C@```(2:``"*````7@$``(B:``"Z`0``G@$``(R:
+M``#Z`0``W@$``)":```Z````"0```)2:``!Z````20```)B:``"&`0``B0``
+M`)R:``#&`0``>0$``*":```&````N0$``*2:``!&````^0$``*B:``"&````
+M.0```*R:``#&````>0```+":``#&````N0```+2:``#&````O0$``+B:``#&
+M````_0$``+R:``#&````/0```,":``#&````?0```,2:``#&````O0```,B:
+M``#&````_0```,R:``#&````_0```-":``#&````_0```-2:``#&````_0``
+M`-B:``#&````_0```-R:``#&````_0```.":``#&````_0```.2:``#&````
+M_0```.B:``#&````_0```.R:``#&````_0```/":``#&````_0```/2:``#&
+M````_0```/B:``#&````_0```/R:``#&````_0```-28```@````U)@``!``
+M```4````$````!`````4````V)@``&@08`!H$&``:!!@`&@08`!H$&``G)@`
+M````````````````````````````G)@`````````````````````````````
+MG)@`````````````````````````````G)@`````````````````````````
+M````G)@`````````````````````````````G)@``````!`````0````$```
+M`!`````0G)@```````0````$````!`````0````$G)@`````````````````
+M````````````G)@`````````````````````````````G)@`````````````
+M````````````````G)@`````````````````"@``````````G)@``,``.`"`
+M`#@`P``X`L``.`#``#@`G)@```8``@`&``(`!@````8``@`&``(`G)@``(D`
+M``")````B0```(D```")````G)@``*````"@````H````*````"@````G)@`
+M``<`!``'``0`!P`$``<`!``'``0`U)@``!H````:````&@```!H````:````
+MG)@``$````!(````0````$````!`````G)@``!`````0````$````!`````0
+M````G)@```@````(````"`````@````(````G)@``$\```!/````3P```$\`
+M``!/````G)@``/$```#Q````80```/$```#Q````G)@``$^0``!/D```3)``
+M`$^0``!/D```G)@``%H2``!:$@``FA(``%H2``!:$@``S)@```X````.````
+M#P````X````.`````0```$8```!@`````0```$8```!A`````0```$8```!B
+M`````0```$8```!C`````0```$8```!D`````0```$8```!E`````0```$8`
+M``!F`````0```$8```!G`````0```$8```!H`````0```$8```!I`````0``
+M`$8```!J`````0```$8```!K`````0```$8```!L`````0```$8```!T````
+M`0```$8```!T`````0```$8```!T`````0```$8```!T`````0```$8```!T
+M`````0```$8```!T`````0```$8```!T`````0```$8```!T`````0```$8`
+M``!U`````0```$8```!V`````0```$8```!W`````0```$8```!X`````0``
+M`$8```!Y`````0```$8```!Z`````0```$8```![`````0```$8```!\````
+M`0```$8```!]`````0```$8```!^`````0```$8```!_`````0```$8```"`
+M`````0```$0```!\`````0```$8```"(`````0```$8```",`````0```$8`
+M``"0`````0```$8```"4`````0```$8```"8`````0```$8```"<`````0``
+M`$8```"@`````0```$8```"D`````0```$8```"H`````0```$8```"L````
+M`0```$8```"P`````0```$8```"T````[`(``,0"``#0`@``W`(``/@"``#\
+M`@``\`(``/P"``">%@8`8A8$`#H6`P`<%@(`ZA4!`)H5``!*%0```Q4!`%D4
+M`P"X"P4``````#`````5@```%8```!6````5@```%8```!R```"GDXT2SQ.(
+M"943X`2K$^`2SQ.("2B8```!``(*`0`""@`!`@4!``(*`0`""C28```.#@``
+M#@X```X.```.#@``#@X``#B8```'````!P````L````+````"P```$B8``!M
+MVA@`;=H8`'7*&`!URA@`=<H8`%"8``#@M.@-X+3H#>"TZ`W@M.@-X+3H#5B8
+M```N#8!^+@V`?BX-Z'XN#>A^+@V`?ER8``!>9C<Q7F8W,5YF-S%>9C<Q7F8W
+M,6R8``"!L`P%@;`,!8&P#`6!L`P%@;`,!129``#0!P``T`<``$P$``"8"```
+MT`<``$29```@$+CW(!"X]Q`-N/<0$+CW$!"X]P2B``````````````@````(
+M````"`````BB``"(9[[6B&>^UHAG/M"(9S[0B&<^T`RB``!``2QD0`$L9&#!
+M0F1@P4)D8,%"9!RB```*@(,8"H"#&`J`<Q@*@(,8"H"#&#`2````````")@`
+M```````LF```_B\"`#R8`````0(`3)@``#QAA!(PF0``@D@``$"9```$````
+M6)D``/\```!TF0```````"BB``"U`0``/*(``*^)R!,$FP```0````B;```"
+M````#)L```,````0FP``!````!2;```%````&)L```@````<FP``"0```"";
+M```*````))L```L````LFP``#0```#";```0````-)L``!$````\FP``$P``
+M`$";```4````1)L``!4```!(FP``&````$R;```9````4)L``!H```!4FP``
+M&P```%B;```<````7)L``!T```!@FP``(````&B;```B````;)L``",```!P
+MFP``)````'2;```E````>)L``"@```!\FP``*0```(";```J````A)L``"L`
+M``"(FP``+````)";```P````E)L``#$```"8FP``,@```*";```T````I)L`
+M`#4```"HFP``-0```*R;```U````L)L``#4```"TFP``-0```+B;```U````
+MO)L``#4```#`FP``-0```,2;```U````R)L``#4```#,FP``-0```-";```U
+M````U)L``#4```#8FP``-0```-R;```U````X)L``#4```#DFP``-0```.B;
+M```U````[)L``#4```#PFP``-0```/2;```U````^)L``!````#\FP``&@``
+M``":```'````!P````2:``!'````1P````B:``"'````AP````R:``"@`0``
+MH`$``!":``#@`0``X`$``!2:```@````(````!B:``!@````8````!R:``"A
+M`0``H0$``"":``#A`0``X0$``"2:```A````(0```"B:``!A````80```"R:
+M``!B`0``8@$``#":``"B`0``H@$``#2:``#B`0``X@$``#B:```B````(@``
+M`#R:``!B````8@```$":``!C`0``8P$``$2:``"C`0``HP$``$B:``#C`0``
+MXP$``$R:```C````(P```%":``!C````8P```%2:``"$`0``A`$``%B:``#$
+M`0``Q`$``%R:```$````!````&":``#J`0``"P```&2:```J````2P```&B:
+M``!J````BP```&R:``"J````K`$``'":``"K`0``[`$``'2:``#K`0``+```
+M`'B:```K````$@```'R:``!K````4@```(":``"K````D@```(2:``"L`0``
+MDP$``(B:``#L`0``TP$``(R:```L````$P```)":```Z````4P```)2:``!Z
+M````DP```)B:``"Z````E`$``)R:``"[`0``U`$``*":``#[`0``%````*2:
+M```[````.@```*B:``![````>@```*R:``"[````N@```+":``"\`0``NP$`
+M`+2:``#\`0``^P$``+B:```\````.P```+R:``!\````>P```,":``"\````
+MNP```,2:``#\````O`$``,B:``#\````_`$``,R:``#\````/````-":``#\
+M````?````-2:``#\````O````-B:``#\````_````-R:``#\````_````.":
+M``#\````_````.2:``#\````_````.B:``#\````_````.R:``#\````_```
+M`/":``#\````_````/2:``#\````_````/B:``#\````_````/R:``#\````
+M_````-28```@````T)@```@$!@,(!`<#"`0&`P@$!@,(!`<#W)@``,`@H`#`
+M(*``P"#@`,`@X`#`(.``G)@```````\````/````#P````\````/G)@`````
+M````````````````````````G)@`````@````(````"`````@````(``G)@`
+M````*@```"H````J````*@```"H`G)@``````0````$````!`````0````$`
+MG)@`````````````````````````````G)@`````&````!@````8````&```
+M`!@`G)@`````8````&````!N````;@```&X`G)@`````QP```,<```#'````
+MQP```,<`G)@`````2P```$L```!+````2P```$L`G)@`````2`0``$@$``!(
+M!```2`0``$@$G)@`````3````$P```!,````3````$P`G)@`````Y````.0`
+M``#D````Y````.0`G)@`````````````````````````````G)@`````_```
+M`/P```#\````_````/P`G)@`````_P```/\```#_````_P```/\`G)@`````
+M/P0``#\$```_!```/P0``#\$G)@`````#`````P````,````#`````P`G)@`
+M````&0(``!D"```9`@``&0(``!D"G)@`````)````"0````D````)````"0`
+MG)@`````M````+0```"T````M````+0`G)@`````F0```)D```"9````F0``
+M`)D`G)@`````4````%````!0````4````%``G)@`````*@```"H````J````
+M*@```"H`G)@`````$@```!(````2````$@```!(`G)@`````,L```#+````R
+MP```,L```#+`G)@`````=`$``'0!``!T`0``=`$``'0!G)@`````$0```!$`
+M```1````$0```!$`G)@`````*(8``"B&```HA@``*(8``"B&G)@`````A#$`
+M`(0Q``"$,0``A#$``(0QG)@``(``\@"``/(`@`#R`(``\@"``/(`G)@``!D`
+M)P`9`"<`&0`G`!D`)P`9`"<`G)@```,````#`````P````,````#````G)@`
+M````````````````````````````G)@``+(```"R````L@```+(```"R````
+MG)@``(0@L`"$(+``A""P`(0@L`"$(+``G)@``*0E00"D)4$`I"5!`*0E00"D
+M)4$`G)@``""2$0`@DA$`()(1`""2$0`@DA$`G)@```!(&@``2!H``$@:``!(
+M&@``2!H`V)@``#`""P`P`@L`,`(+`#`""P`P`@L`G)@``)0```"4````E```
+M`)0```"4````G)@``)$```"1````D0```)$```"1````G)@``!(````2````
+M$@```!(````2````G)@``(````"`````@````(````"`````G)@``-D```#9
+M````V0```-D```#9````G)@``&````!@````8````&````!@````G)@``/``
+M``#P````\````/````#P````G)@``*(```"B````H@```*(```"B````G)@`
+M`%(```!2````4@```%(```!2````G)@``-0```#4````U````-0```#4````
+MG)@``,P4``#,%```S!0``,P4``#,%```G)@``(P$``",!```C`0``(P$``",
+M!```Q)@```,````#`````P````,````#````I`0``*P$``",!```F`0``+0$
+M``"X!```K`0``+@$```P````%0```!4````5````%0```!4````<@```IY.-
+M$L\3B`F5$^`$JQ/@$L\3B`DHF````0`""@$``@H```(%`0`""@$``@HTF```
+M``X````.````#@````X````.```XF````@````(````*````"@````H```!(
+MF```;=H8`&W:&`!D:AH`9&H:`&1J&@!0F```X+3H#>"TZ`W:L.@-VK"8#-JP
+MZ`U8F```+@V`?BX-@'XN#>A^+@W(?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F`Y
+M,5YF-S%LF```@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,!```
+MF`@``-`'``!$F0```!"X]P`0N/<`#;CW`!"X]P`0N/<$H@``````````````
+M```````````````(H@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``0`$L`$`!
+M+`!`P4(`0,%"`$#!0@`<H@``"H"#&`J`@Q@*@&,8"H"#&`J`@Q@P$@``X`,`
+M`&"````/````&($````````<@0```````""!````````)($````````H@0``
+M`````"R!````````,($````````T@0```````#B!````````/($```````!`
+M@0``J```@$2!````````")@````````LF````*```#R8````!"``3)@``#PC
+MA!)PF```'P```'28``"`````>)@```X```!8F0``_P```("9````````A)D`
+M````@`*@F0```````."9````````Y)D``*JJJJKHF0``>&1&/.R9``"J````
+M\)D```P```#TF0``_P```/B9```4````**(``+4)```\H@``KXG(DTRB```!
+M````4*(```"@``!4H@```````%BB``"`4\<,7*(```$/#P]@H@```0]I7V2B
+M```1BD$`:*(```````!LH@``:L$P#'"B```@"((`=*(``*I\&P!XH@``SCGG
+M''RB``#.`1<%`*,``````1@$HP```B8#,`BC```&/@=(#*,```I,"U80HP``
+M#V`:9!2C```;;D]X&*,``%I\CX8<HP``6X;/CB"C```/ET^=)*,``(^ASZ4H
+MHP``'Z]?M2RC``"?N=^],*,``#_'?\TTHP``O]'_U3BC````````/*,`````
+M``!`HP```````$2C````````2*,``/___S],HP``____/U"C``#___\_5*,`
+M`/__`P!8HP``'ZJH>5RC```/0FP&8*,```<B*`]DHP``A19@%VBC```$$8`?
+M;*,```,,H#=PHP``@PC$/W2C```#",!7>*,``((&V%]\HP``@@3@?X"C``"Z
+M>SQ_A*,``/!_,/,$FP```0````B;```"````#)L```,````0FP``!````!2;
+M```%````&)L```@````<FP``"0```"";```*````))L```L````LFP``#0``
+M`#";```0````-)L``!$````\FP``$P```$";```4````1)L``!4```!(FP``
+M&````$R;```9````4)L``!H```!4FP``&P```%B;```<````7)L``!T```!@
+MFP``(````&B;```B````;)L``",```!PFP``)````'2;```E````>)L``"@`
+M``!\FP``*0```(";```J````A)L``"L```"(FP``+````)";```P````E)L`
+M`#$```"8FP``,@```*";```T````I)L``#4```"HFP``-0```*R;```U````
+ML)L``#4```"TFP``-0```+B;```U````O)L``#4```#`FP``-0```,2;```U
+M````R)L``#4```#,FP``-0```-";```U````U)L``#4```#8FP``-0```-R;
+M```U````X)L``#4```#DFP``-0```.B;```U````[)L``#4```#PFP``-0``
+M`/2;```U````^)L``!````#\FP``&@````":``````````````2:````````
+M0`````B:````````@`````R:````````@0$``!":````````P0$``!2:````
+M`````0```!B:````````00```!R:````````@0```"":````````:`$``"2:
+M````````J`$``"B:````````Z`$``"R:````````*````#":````````:```
+M`#2:````````B0$``#B:````````R0$``#R:````````"0```$":````````
+M20```$2:````````B0```$B:````````D`$``$R:````````T`$``%":````
+M````$````%2:````````4````%B:````````D````%R:````````D0$``&":
+M````````T0$``&2:````````$0```&B:````````40```&R:````````D0``
+M`'":````````>`$``'2:````````N`$``'B:````````^`$``'R:````````
+M.````(":````````>````(2:````````F0$``(B:````````V0$``(R:````
+M````&0```)":````````60```)2:````````F0```)B:````````V0```)R:
+M````````^0```*":````````^0```*2:````````^0```*B:````````^0``
+M`*R:````````^0```+":````````^0```+2:````````^0```+B:````````
+M^0```+R:````````^0```,":````````^0```,2:````````^0```,B:````
+M````^0```,R:````````^0```-":````````^0```-2:````````^0```-B:
+M````````^0```-R:````````^0```.":````````^0```.2:````````^0``
+M`.B:````````^0```.R:````````^0```/":````````^0```/2:````````
+M^0```/B:````````^0```/R:````````^0```-28```@````T)@```@4``((
+M%`$""!0``@@4``((%`$"W)@``,`@H`#`(*``P"#@`,`@X`#`(.``G)@`````
+M`/````#P````\````/````#PG)@`````````````````````````````G)@`
+M``````,````#`````P````,````#G)@`````````````````````````````
+MG)@`````````````````````````````G)@`````````````````````````
+M````G)@`````````````````````````````G)@`````````````````````
+M````````G)@`````0$```$!```!`0```0$```$!`G)@`````!64```5E```%
+M90``!64```5EG)@`````````````````````````````G)@`````````````
+M````````````````G)@`````0@```$(```!"````0@```$(`G)@`````M0``
+M`+4```"U````M0```+4`G)@``````P````,````#`````P````,`G)@`````
+M]P```/<```#W````]P```/<`G)@`````G0```)T```"=````G0```)T`G)@`
+M````(@```"(````B````(@```"(`G)@`````(@0``"($```B!```(@0``"($
+MG)@``!@`(P`8`",`&``C`!@`(P`8`",`G)@`````*````"@`8``H`&``*`!@
+M`"@`G)@``,``4`#``%``PP!0`,,`4`##`%``G)@``'\`!`!_``0`?P`$`'\`
+M!`!_``0`G)@``%@$``!8!```6`0``%@$``!8!```G)@`````````````````
+M````````````G)@```#`````P````,````#`````P```V)@``#`"0``P`D``
+M,`)``#`"0``P`D``G)@```!D````9````&0```!D````9```G)@````(````
+M"`````@````(````"```S)@```X````.````#@````X````.````W`<``.0'
+M``#$!P``T`<``.P'``#P!P``Y`<``/`'```P````%0```!4````5````%0``
+M`!4````<@```IY.-$L\3B`F5$^`$JQ/@$L\3B`DHF````0`""@$``@H``0(%
+M`0`""@$``@HTF```#@X```X.```.#@``#@X```X.```XF```!P````<````+
+M````"P````L```!(F```8?H8`&'Z&`!C&AH`8QH:`&,:&@!0F```X+28#."T
+MF`S:L)@,VK"8#-JPF`Q8F```+@W(?BX-R'XN#<A^+@W(?BX-R'Y<F```7F`Y
+M,5Y@.3%>8#DQ7F`Y,5Y@.3%LF```@;`,!8&P#`6!L`P%@;`,!8&P#`44F0``
+MT`<``-`'``!,!```F`@``-`'``!$F0```!"X]P`0N/<`#;CW`!"X]P`0N/<$
+MH@`````````````````````````````(H@``B&>^UHAGOM:(9S[0B&<^T(AG
+M/M`,H@``X,$N`.#!+@`@P2H`(,$J`"#!*@`<H@``"H"#&`J`@Q@*@&,8"H"#
+M&`J`@Q@`HP`````!&````1@```$8```!&````1@$HP```B8#,`(F`S`")@,P
+M`B8#,`(F`S`(HP``!CX'2`8^!T@&/@=(!CX'2`8^!T@,HP``"DP+5@I,"U8*
+M3`M6"DP+5@I,"U80HP``#V`:9`]@&F0/8!ID#V`:9`]@&F04HP``&VY/>!MN
+M3W@;;D]X&VY/>!MN3W@8HP``6GR/AEI\CX9:?(^&6GR/AEI\CX8<HP``6X;/
+MD%N&SY!;AL^.6X;/CEN&SXX@HP``#Y=/G0^73YT/ET^;#Y=/FP^73YLDHP``
+MCZ//IX^CSZ>/G\^CCY_/HX^?SZ,HHP``'Z]?M1^O7[4?KU^S'Z]?LQ^O7[,L
+MHP``G[G?O9^YW[V?N=^[G[G?NY^YW[LPHP``/\5_RS_%?\L_QW_+/\=_RS_'
+M?\LTHP``O]'_U;_1_]6_T?_3O]'_T[_1_],P$@``X`,``&A````0````8(``
+M``\```"<@````````*"`````````&($````````<@0```````""!````````
+M)($````````H@0```````"R!````````,($````````T@0```````#B!````
+M````/($```````!`@0``^0,`@$2!````````")@````````LF````*```#R8
+M````!"``3)@``#PCA!)PF```'P```'28``"`````>)@```X```!8F0``_Q\(
+M`("9````````A)D`````@`*@F0```````."9````````Y)D``*JJJJKHF0``
+M>&1&/.R9``"J````\)D```P```#TF0``_P```/B9```4````**(``+4)```\
+MH@``KXG(DTRB```!````4*(```"@``!4H@```````%BB``"`4\<,7*(```$/
+M#P]@H@```0]I7V2B```1BD$`:*(```````!LH@``:L$P#'"B```@"((`=*(`
+M`*I\&PAXH@``SCGG''RB``#.`1<%.*,````````\HP```````$"C````````
+M1*,```````!(HP``____/TRC``#___\_4*,``/___S]4HP``__\#`%BC```?
+MJJAY7*,```]";`9@HP``!R(H#V2C``"%%F`7:*,```01@!]LHP```PR@-W"C
+M``"#",0_=*,```,(P%=XHP``@@;87WRC``""!.!_@*,``+I[/'^$HP``\'\P
+M\P2;```!````")L```(````,FP```P```!";```$````%)L```4````8FP``
+M"````!R;```)````()L```H````DFP``"P```"R;```-````,)L``!`````T
+MFP``$0```#R;```3````0)L``!0```!$FP``%0```$B;```8````3)L``!D`
+M``!0FP``&@```%2;```;````6)L``!P```!<FP``'0```&";```@````:)L`
+M`"(```!LFP``(P```'";```D````=)L``"4```!XFP``*````'R;```I````
+M@)L``"H```"$FP``*P```(B;```L````D)L``#````"4FP``,0```)B;```R
+M````H)L``#0```"DFP``-0```*B;```U````K)L``#4```"PFP``-0```+2;
+M```U````N)L``#4```"\FP``-0```,";```U````Q)L``#4```#(FP``-0``
+M`,R;```U````T)L``#4```#4FP``-0```-B;```U````W)L``#4```#@FP``
+M-0```.2;```U````Z)L``#4```#LFP``-0```/";```U````])L``#4```#X
+MFP``$````/R;```:`````)H`````````````!)H``$````!`````")H``(``
+M``"`````#)H``*$!``!A`0``$)H``.$!``"A`0``%)H``"$```#A`0``&)H`
+M`&$````A````')H``(@!``!A````()H``,@!``"(`0``))H```@```#(`0``
+M*)H``$@````(````+)H``(@```!(````,)H``*D!``"(````-)H``.D!``!I
+M`0``.)H``"D```"I`0``/)H``&D```#I`0``0)H``-`!```I````1)H``!``
+M``!I````2)H``%````"0`0``3)H``)````#0`0``4)H``+$!```0````5)H`
+M`/$!``!0````6)H``#$```"0````7)H``'$```!Q`0``8)H``+@!``"Q`0``
+M9)H``/@!``#Q`0``:)H``#@````Q````;)H``'@```!Q````<)H``)D!``"8
+M`0``=)H``-D!``#8`0``>)H``!D````8````?)H``%D```!8````@)H``)D`
+M``"8````A)H``-D```!Y`0``B)H``/D```"Y`0``C)H``/D```#Y`0``D)H`
+M`/D````Y````E)H``/D```!Y````F)H``/D```"Y````G)H``/D```#Y````
+MH)H``/D```#Y````I)H``/D```#Y````J)H``/D```#Y````K)H``/D```#Y
+M````L)H``/D```#Y````M)H``/D```#Y````N)H``/D```#Y````O)H``/D`
+M``#Y````P)H``/D```#Y````Q)H``/D```#Y````R)H``/D```#Y````S)H`
+M`/D```#Y````T)H``/D```#Y````U)H``/D```#Y````V)H``/D```#Y````
+MW)H``/D```#Y````X)H``/D```#Y````Y)H``/D```#Y````Z)H``/D```#Y
+M````[)H``/D```#Y````\)H``/D```#Y````])H``/D```#Y````^)H``/D`
+M``#Y````_)H``/D```#Y````U)@``"````#0F```"`````@````(````"```
+M``@```#<F```P`"@`,``H`#``.``P`#@`,``X`"<F```````,P```#,````S
+M````,P```#.<F````````0````$````!`````0````&<F```````````````
+M``````````````"<F`````````````````````````````"<F```````````
+M``````````````````"<F```````'P```!\````?````'P```!^<F```````
+M``````````````````````"<F`````"X````N````+@```"X````N`"<F```
+M``"W````MP```+<```"W````MP"<F`````"$````A````(0```"$````A`"<
+MF`````"8````F````)@```"8````F`"<F`````#`````P````,````#`````
+MP`"<F`````#_````_P```/\```#_````_P"<F`````#_````_P```/\```#_
+M````_P"<F`````#_````_P```/\```#_````_P"<F`````#_````_P```/\`
+M``#_````_P"<F`````#7````UP```-<```#7````UP"<F`````!A````80``
+M`&$```!A````80"<F`````#^````_@```/X```#^````_@"<F`````#>````
+MW@```-X```#>````W@"<F`````!_````?P```'\```!_````?P"<F``````]
+M!```/00``#T$```]!```/02<F`````!W````=P```'<```!W````=P"<F```
+M``!$````1````$0```!$````1`"<F`````"8````F````)@```"8````F`"<
+MF```@``0`(``$`"``!``@``0`(``$`"<F```-,`%`#3`!0`TP`4`-,`%`#3`
+M!0"<F```\``Q`/``,0#P`#$`\``Q`/``,0"<F```'P$,`!\!#``?`0P`'P$,
+M`!\!#`"<F```0`!1`$``40!``%$`0`!1`$``40"<F```V@!0`-H`4`#:`%``
+MV@!0`-H`4`"<F`````````````````````````````"<F```1$```$1```!$
+M0```1$```$1```"<F`````````````````````````````"<F```P&```,!@
+M``#`8```P&```,!@``"<F````"P````L````-@```#8````L``#(F````P0`
+M``,$```#!````P0```,$``"<F````&0```!D````9````&0```!D``"<F```
+M``@````(````"`````@````(``#,F```#@````X````.````#@````X```#L
+M"```]`@``-0(``#@"```_`@````)``#T"`````D``$%2-3(Q,```05(U,C$Q
+M``!!4C4R,3(``%)&-3$Q,0``4D8U,3$R``!21C(T,3,``%)&-30Q,P``4D5'
+M3U!37T953D,`071H97)O<R`R,S$S(%=I4V]#``!!=&AE<F]S(#4T,C0O,C0R
+M-````$%T:&5R;W,@,C,Q-R!7:5-O0P``071H97)O<R`U,C$R("A&4$=!*0!!
+M=&AE<F]S(#4R,3$@*$901T$I`$%T:&5R;W,@-3(Q,`````!!=&AE<F]S(#4R
+M,3$`````071H97)O<R`U,S$R(%=I4V]#``!!=&AE<F]S(#(S,34@5VE3;T,`
+M`$%T:&5R;W,@-3(Q,@``````````,"XY+C(P+C,```````````@````0````
+M&````"`````H````,````#@```````````#_`?\!`````````````/______
+M__]_```````````#`)@!F0$`````````````_________W\```````````<`
+MF`$P"P````````````#_________?P``````````"`"8`3`,````````````
+M`/________]_```````````@`"`!$`H`````````````_________W\`````
+M`````"$`(`&9`0````````````#_________?P``````````(@`@`3`,````
+M`````````/________]_```````````Z`&`!$`H`````````````________
+M_W\``````````#L`8`&9`0````````````#_________?P``````````$@!E
+M`1`*```#`````````/________]_```````````W`#`!F0$```,`````````
+M_________W\``````````#4`,`*9`0```P````````#_________?P``````
+M````-@`P`YD!```#`````````/________]_```````````P`#`$F0$```,`
+M````````_________W\``````````#D`,`69`0```P````````#_________
+M?P``````````-``P!ID!```#`````````/________]_```````````R`#`#
+MF0$```,`````````_________W\``````````#$`,`.9`0````````````#_
+M________?P``````````$0`0`9D!`````````````/________]_````````
+M```0`!`!$`H`````````````_________W\``````````%(`4`&9`0``````
+M``````#_________?P``````````10!0`ID!`````````````/________]_
+M``````````!'`%`#F0$`````````````_________W\``````````$(`4`29
+M`0````````````#_________?P``````````6`!0!9D!`````````````/__
+M______]_``````````!;`%`&F0$`````````````_________W\`````````
+M`%T`4`B9`0````````````#_________?P``````````7@!0"9D!````````
+M`````/________]_``````````!0`%`#$`H`````````````_________W\`
+M`````````%4`4`$P#`````````````#_________?P``````````5@!0`C`,
+M`````````````/________]_``````````!)`%`"4`T`````````````____
+M_____W\``````````$``0`%`"@``1@````0````H`````````(@!````````
+M00!``4`*``!'````!````&@`````````B0$```````!(`$`!$`H``$8````$
+M````"`````````"*`0```````$H`0`%`"@``1@````0````(&````````(P!
+M````````2P!``4`*``!&````!`````A@````````C0$```````!,`$`!4`H`
+M`$8````$````"`````````"/`0```````$,`0`)`"@``1P````0```!P````
+M`````(L!````````\`!``T`*``!&````!````"````````````````````"`
+M`$`#0`H``$<````$````8`````````"G#P```````/$`0`-`"@``1@````0`
+M````&```````````````````@0!``T`*``!&````!`````!@````````J`\`
+M``````""`$`#4`H``$8````$``````````````"I#P```````/(`0`,0"@``
+M1@````0`````````````````````````@P!`!$`*``!'````!````&"`````
+M````J@\```````#T`$`$0`H``$8````$`````)@``````````````````(0`
+M0`1`"@``1@````0`````X````````*L/````````A0!`!%`*``!&````!```
+M``"`````````K`\```````#U`$`$$`H``$8````$`````(``````````````
+M`````(8`0`5`"@``1P````0```!@@````````*T/````````AP!`!4`*``!&
+M````!`````#@````````K@\```````"(`$`%4`H``$8````$`````(``````
+M``"O#P```````(D`0`9`"@``1P````0```!H`````````+`/````````B@!`
+M!D`*``!&````!`````A@````````L0\```````"+`$`&4`H``$8````$````
+M"`````````"R#P```````(P`0`=`"@``1P````0```!H@````````+,/````
+M````C0!`!T`*``!&````!`````C@````````M`\```````".`$`'4`H``$8`
+M```$````"(````````"U#P```````(\`0`A`"@``1P````0```!H@```````
+M`+8/````````D`!`"$`*``!&````!`````C@````````MP\```````"1`$`(
+M4`H``$8````$````"(````````"X#P```````/8`0`E`"@``1P````0```!@
+M@```````````````````]P!`"T`*``!'````!````&"`````````````````
+M``!@`&``8```````````````_________W\``````````&$`80!A`````P``
+M``````#_________?P``````````8@!B`&(````"`````````/________]_
+M``````````!C`&,`8P``````````````_________W\``````````&0`9`!D
+M`````P````````#_________?P``````````90!E`&4````#`````````/__
+M______]_``````````!F`&8`9@``````````````_________W\`````````
+M`&<`9P!G``````````````#_________?P``````````:`!H`&@`````````
+M`````/________]_``````````!I`&D`:0````,`````````_________W\`
+M`````````&H`:@!J`````P````````#_________?P``````````90````$`
+M``#_____@````/____\`````2E```+0/````````:@````$```#_____@```
+M`/____\`````2E```+0/````````_P$```$````!`````0```%@;`````!``
+M`0````$````!````6!L```@``P`!``````````$```!8&P``#``#``$`````
+M`````0```%@;```@`$<`````````````````6!L``#,`,``!``````````$`
+M``!8&P``)``A``$````!`````0```%@;```H`#<``0`````````!````6!L`
+M`!\`,``!`````0````$```!8&P``,`!;``$``````````0```%@;``!P``,`
+M`0`````````!````6!L``#@`-P`!``````````$```!8&P``5`!5``$````!
+M`````0```%@;``!$`%4``0````$````!````6!L``$P`.P`!````````````
+M``!8&P``8`!2``$````!`````0```%@;``!D`#0``0`````````!````6!L`
+M`'P`(``!`````0````$```!8&P``F`!;``$````!`````0```%@;``"<`%(`
+M`0````$````!````6!L``*H`$``!``````````$```!8&P``O``#``$`````
+M`````0```%@;``"_`#8``0`````````!````6!L``,0`-P`!`````0````$`
+M``!8&P``RP`W``$``````````0```%@;``#0`#<``0`````````!````6!L`
+M`-8`$``!`````0````$```!8&P``V@`#`````````````````%@;```R`S8`
+M`0`````````!````6!L``-X``P`!``````````$```!8&P``Z0`W``$`````
+M`````0```%@;``#V`#<``0`````````!````6!L``/H`-P`!``````````$`
+M``!8&P``_P`V``$``````````0```%@;```,`3```0````$````!````6!L`
+M`!0!-P`!``````````$```!8&P``+`$W``$``````````0```%@;``!``1``
+M`0````$````!````6!L``%0!`P`!``````````$```!8&P``6`$A``$````!
+M`````0```%@;``!<`3<``0`````````!````6!L``&`!-P`!``````````$`
+M``!8&P``9`%;``$``````````0```%@;``!H`5(``0`````````!````6!L`
+M`&P!4@`!`````0````$```!8&P``=`$W``$``````````0```%@;``!X`0,`
+M`0`````````!````6!L``'P!-P`!``````````$```!8&P``B`%```$`````
+M`````````%@;``")`4$``0``````````````6!L``(H!2``!````````````
+M``!8&P``BP%#``$``````````````%@;``",`4H``0``````````````6!L`
+M`(T!2P`!``````````````!8&P``CP%,``$``````````````%@;``"G#X``
+M`0``````````````6!L``*@/@0`!``````````````!8&P``J0^"``$`````
+M`````````%@;``"J#X,``0``````````````6!L``*L/A``!````````````
+M``!8&P``K`^%``$``````````````%@;``"M#X8``0``````````````6!L`
+M`*X/AP`!``````````````!8&P``KP^(``$``````````````%@;``"P#XD`
+M`0``````````````6!L``+$/B@`!``````````````!8&P``L@^+``$`````
+M`````````%@;``"S#XP``0``````````````6!L``+0/C0`!````````````
+M``!8&P``M0^.``$``````````````%@;``"V#X\``0``````````````6!L`
+M`+</D``!``````````````!8&P``N`^1``$``````````````%@;``"0`4(`
+M`0`````````!````6!L``(X!`P`!``````````$```!8&P``F`%%``$````!
+M`````0```%@;``":`44``0``````````````6!L``)L!10`!````````````
+M``!8&P``G`%>``$``````````````%@;``">`0,``0`````````!````6!L`
+M`*P!-P`!``````````$```!8&P``I@$#``$``````````0```%@;``"V`3<`
+M`0`````````!````6!L``+@!-P`!``````````$```!8&P``N@$W``$`````
+M`````0```%@;``"^`2$``0````$````!````6!L``"<#`P`!``````````$`
+M``!8&P``R@%=``$``````````````%@;``#6`3<``0`````````!````6!L`
+M`.0!$``!`````0````$```!8&P``[`$P``$````!`````0```%@;``#X`0,`
+M`0`````````!````6!L``!`"-P`!``````````$```!8&P``*@(B``$`````
+M`````0```%@;``!"`C<``0`````````!````6!L````"6P`!``````````$`
+M``!8&P``2@(#``$``````````0```%@;``!/`A```0````$````!````6!L`
+M`%P"4@`!``````````$```!8&P``8`([``$````!`````0```%@;``!H`C<`
+M`0`````````!````6!L``&P"-P`!``````````$```!8&P``=@(0``$````!
+M`````0```%@;``!Z`@,``0`````````!````6!L``(("`P`!``````````$`
+M``!8&P``@P(#``$``````````0```%@;``"J`B$``0`````````!````6!L`
+M`+X"6P`!`````0````$```!8&P``OP(W``$``````````0```%@;``#!`C<`
+M`0`````````!````6!L``,8".P`!``````````$```!8&P``U`(W``$`````
+M`````0```%@;``#P`C<``0`````````!````6!L``/0"-P`!``````````$`
+M``!8&P``^`(#``$``````````0```%@;``">`%```0````$````!````6!L`
+M`/P"`P`!``````````$```!8&P``#`,P``$``````````0```%@;```4`S8`
+M`0`````````!````6!L``!@#-@`!``````````$```!8&P``)`,#``$`````
+M`````0```%@;```0`P,``0`````````!````6!L``#H#-P`!``````````$`
+M``!8&P``2`,0``$````!`````0```,$6``!*`Q(``0````$````!````6!L`
+M`%H#$0`!``````````$```!8&P``7`,Z``$````!`````0```%@;``!>`U8`
+M`0`````````!````6!L``,`"`P`!``````````$```!8&P``=P,#``$`````
+M`````0```%@;``#,`@,``0`````````!````6!L````````S$ST3%P`*!0``
+M````````$``````````0`````````$<341,7``H%```````````0````````
+M`!``````````.!-T$Q<`%!0``````````!``````````!P````````!.$WL3
+M&P8%!0```````````0```````````````````%$3>1,>!@H%```````````!
+M````````````````````5A-T$R$&%`4```````````$`````````````````
+M``"K$[`3%P`*!0``````````$``````````,`````````+`3V!,7`!04````
+M```````0``````````(`````````OQ._$Q<`"@4``````````!``````````
+M#```````````%'@4!084%````````````````````````````````#(4;A07
+M`!04```````````8``````````$`````````,A1N%!0`%!0``````````!@`
+M`````````0`````````\%'@4#P`4%```````````!0``````````````````
+M`#P4>!01!A04```````````!``````````$`````````/!1X%!(`%!0`````
+M``````4````````````````````\%'@4%``4%```````````!0``````````
+M`````````#P4>!07`!04```````````%````````````````````/!1X%!<&
+M%!0```````````$````````````````````\%,@4%`84%`(`````````!```
+M`````````````````'@4H!07`!04`0`````````%````````````````````
+MC!2@%!<`%!0#``````````4```````````````````",%,@4$@`4%`,`````
+M````!0```````````````````(P4R!04`!04!P`````````%@```````````
+M````````C!3(%!0&%!0#``````````$``````````@````````",%,@4%P84
+M%`,``````````0`````````"`````````(P4R!07!A04`P`````````!````
+M````````````````C!3(%!X`%!0```````````````````````````````",
+M%$06!084%`,``````````````````````````````*`4R!01!A04`P``````
+M```!````````````````````?!7T%1X&%!0"``````````0`````````````
+M``````!\%406%`84%`,``````````0`````````$`````````'P51!8;`!04
+M`P`````````%````````````````````?!5$%AX`%!0#``````````4`````
+M``````````````!\%406%P`4%`<``````````8```````````````````'$6
+MK187`!04````````````````````````````````<1:M%AX&%!0`````````
+M``````````````````````!Q%JT6'@84%`(`````````!```````````````
+M`````'$6P18%!A04````````````````````````````````<1;!%A$`%!0`
+M``````````````````````````````!Q%L$6%``4%```````````````````
+M`````````````'$6P18>`!04````````````````````````````````<1;!
+M%AX&%!0``````````````````````P````````!Q%L$6'@84%```````````
+M`````````````````````#@3=!,>`!04````````````!```````````````
+M````L!/8$QX`%!0````````````$```````````````````R%&X4'@`4%`,`
+M``````````0``````````````````#P4>!0>`!04`P``````````!```````
+M````````````C!3(%!X`%!0#```````````$``````````````````!Q%L$6
+M'@`4%`````````````0``````````````````'P51!8>`!04`P``````````
+M!```````````````````C!3(%!X`%!0`````````````````````````````
+M```\%'@4'@`4%````````````````````````````````,$6P18>`!04````
+M````````!```````````````````"A1:%`4&*"@`````````````````````
+M``````````""%-(4!08H*`$``````````````````````````````/H4<A4%
+M!B@H````````````````````````````````FA42%@4&*"@!````````````
+M```````````````````>%$84!08H*```````````````````````````````
+M`&X4OA0%!B@H`0``````````````````````````````YA1>%04&*"@`````
+M``````````````````````````"&%286!08H*`$`````````````````````
+M`````````%`4>!01!B@H````````````````````````````````4!1X%!<&
+M*"@```````````````````````````````!:%%H4$08H*```````````````
+M`````````````````%H46A07`"@H````````````````````````````````
+MH!2@%!<&*"@!``````````(```````````````````"@%*`4%`8H*`$`````
+M`````@```````````````````((4@A01`"@H`0`````````"````````````
+M````````JA2J%!0`*"@!``````````(```````````````````""%*H4%``H
+M*`$``````````@```````````````````((4JA07!B@H`0`````````"````
+M````````````````I!4<%A0&*"@!``````````(```````````````````"`
+M%J@6%``H*````````````````````````````````(`6J!8>!B@H````````
+M````````````````````````A1:M%AX&*"@`````````````````````````
+M``````!:%((4#P`H*`,```````````0``````````````````*H4JA02`"@H
+M`P``````````!```````````````````I!4<%A0`*"@#```````````$````
+M``````````````"`%J@6%``H*`````````````0```````````````````@)
+M1`D%!A0%````````````````````````````````"`E$"10`%`4`````````
+M``````````````````````!L":@)!084!0``````````````````````````
+M`````&P)J`D4`!0%```````````@````````````````````;`FH"1X`%`4`
+M``````````````````````````````!L"9X)&P84!0``````````````````
+M`````````````&P)G@D4`!0%```````````@````````````````````@`F*
+M"10`%`4```````````````````````````````"9":@)%``4!0``````````
+M`````````````````````*,)J`D4`!0%```````````@(```````````````
+M````M`FT"04&%`4```````````````````````````````"T";0)%``4!0``
+M````````("@``````````````````-`)K`H%!A0%````````````````````
+M````````````"`E$"10`%`4```````````````````````````````!L"6P)
+M%``4!0```````````````````````````````'$)@`D4`!0%````````````
+M````````````````````A0F*"10`%`4`````````````````````````````
+M``"/"9D)%``4!0```````````````````````````````)X)G@D4`!0%````
+M````````````````````````````HPFC"10`%`4````````````$``````"`
+M``````````"C":,)%``4!0```````````````````(```````````*@)J`D4
+M`!0%````````````!```````@```````````J`FH"10`%`4`````````````
+M``````"```````````"T";0)%``4!0````````````0``````(``````````
+M`+0)M`D4`!0%````````````````````@```````````"`E$"04&%`4`````
+M```````````````````````````("40)%``4!0``````````````````````
+M`````````&P)J`D%!A0%````````````````````````````````;`FH"10`
+M%`4``````````$````````````````````!L":@)'@`4!0``````````````
+M`````````````````&P)G@D;!A0%````````````````````````````````
+M;`F>"10`%`4``````````$````````````````````"`"8H)%``4!0``````
+M`````````````````````````)D)J`D4`!0%````````````````````````
+M````````T`FL"@4&%`4```````````````````````````````"C":@)%``4
+M!0``````````("````````````````````@)1`D4`!0%````````````````
+M````````````````;`EL"10`%`4```````````````````````````````!Q
+M"8`)%``4!0```````````````````````````````(4)B@D4`!0%````````
+M````````````````````````CPF9"10`%`4`````````````````````````
+M``````">"9X)%``4!0```````````````````````````````*,)HPD4`!0%
+M````````````!```````@```````````HPFC"10`%`4`````````````````
+M``"```````````"H":@)%``4!0````````````0``````(```````````*@)
+MJ`D4`!0%````````````````````@```````````"`E$"04&*"@`````````
+M``````````````````````"%"84)!08H*```````````````````````````
+M`````(4)A0D4!B@H````````````````````````````````A0F%"1(&*"@`
+M```````````$``````````````````#0":P*!08H*```````````````````
+M`````````````/\!$````````0````````````````````````````````(`
+M""```````````````/\`````````````````````$20`````````````````
+M!10```````````````````4"```````````````````3````````````````
+M````4`$0``````````````````````````````````````````````$`````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````!0`A``
+M```````````````````````````````````````````$````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````%`#$```````````
+M````````````````````````````````$`@`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````4`00````````````````````
+M````````````````````@```@```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````!0!1``````````````````````````````
+M``````````````!`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````%`&,````````@`````````#````````````````````
+M`(!``(`````````````````("0``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````4`@P`````````````````````````````P`````````````$``$`
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!0
+M"3````````(`````````!``````````#````````````!"`0````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````#`!,```````
+M`@`````````$``````````,```````````!`@```"```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````,`(P```````"````````
+M``0``````````P``````````0```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````P`S````````(`````````!```````
+M```#````````````0`````@`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````#`$,````````@`````````$``````````,`````
+M`````$`@````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````,`4P```````"``````````0``````````P``````````$```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```P!C````````(`````````!``````````#````````````$0`!````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````!`!$```
+M`````````````````````````````````````"```0`"```````````````$
+M$@``````````````````$2``````````````````````````````````````
+M````````````````````````````````````````````(`$0````````````
+M``````````````````````````````("``0`````````````````````````
+M```````````2(```````````````````````````````````````````````
+M``````````````````````````````````!@`1````````$``````````P``
+M```````````````````@@$```@``````````````Q!``````````````````
+M`"$$````````````````````````````````````````````````````````
+M`````````````````````````&4!$````````0`````````#````````````
+M````````.```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````0`%```````````````````@``````````@``````````
+M!```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````!``D``````````````````$``````````"`````````,<%````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````$`#
+M0```````````````````@`````````(``````````(``````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`1````````$
+M``````````"``````````@``````````@$``````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````!`!4````````0`````````
+M`(`````````"``````````"`0``"````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````$`&0``````````````````(````````
+M``(``````````(@`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````0`=````````$``````````B``````````@``````
+M````A$``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````!`"$````````0`````````"(`````````"``````````"$0``"
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`$`)0```````````````````@`````````(`````````QX$`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````0`M`````
+M```$``````````"``````````@````````#'@4``````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````!0#?\`````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````H````````````````````*````````
+M`````````````````````````````````#`*_P````````````````"`````
+M``````,`````````````````````````````````````````````````````
+M``````````````````````$````````````````````!````````````````
+M```$````````````````````,`LP```````````````````!`````````P``
+M````````````````````````````````````````````````````````````
+M``````````"`````````````````````@`````````````````````0`````
+M```````````````P##````````````````````(````````#````````````
+M````````````````````````````````````````````````````````````
+M`!`````````````````````0````````````````````!```````````````
+M`````!`*$```````````````````````````````````````````````````
+M````````````````````````````````````````````````````(```````
+M`````````````"`````````````````````$````````````````````0`I`
+M`````````````````&!X`````````@``````````````````````````````
+M``````````````````````````````````````````!`"@``````````````
+M````0`0```````````````````0```````````````````!0"D``````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````@````````````````````(````
+M````````````````!````````````````````)D!,```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````"`````````````````````@`````````````
+M```````$````````````````````8`#_```````#```````````$````````
+M"````````````````.`#``````````````#``@``````````````````````
+M````````````````P*\``````````````````/`+``````````````````@`
+M``````````````````!F`/\```````,```````````0````````(````````
+M````````X`,``````````````,`"````````````````````````````````
+M``````#`!P``````````````````\`$`````````````````"```````````
+M`````````&<`_P```````P``````````!`````````@```````````````#@
+M`P``````````````P`(``````````````````````````````````````,`O
+M``````````````````#P"P`````````````````(````````````````````
+M:`#_```````#```````````$````````"````````````````.`#````````
+M``````#``@``````````````````````````````````````P%<`````````
+M`````````/`5``````````````````@```````````````````!A`/\`````
+M``,```````````0````````0````````````````X`,`````````````````
+M``````````````````````````````````````#`KP``````````````````
+M\`L`````````````````"````````````````````&(`_P```````P``````
+M````!````````!````````````````#@`P``````````````P`(`````````
+M`````````````````````````````,"O``````````````````#P"P``````
+M```````````(````````````````````8P#_```````#```````````$````
+M````"````````````````.`!``````````````#``@``````````````````
+M````````````````````P"\``````````````````/`+````````````````
+M``@```````````````````!D`/\```````,```````````0````````0````
+M```````````(`!P``````````````,`"````````````````````````````
+M``````````#`!P``````````````````\`$`````````````````"```````
+M`````````````&4`_P```````P``````````!````````!``````````````
+M``"$"```````````````````````````````````````````````````````
+M`,!7``````````````````#P%0`````````````````(````````````````
+M````:0#_```````#```````````$````````$````````````````,`#````
+M``````````#``@``````````````````````````````````````P`<`````
+M`````````````/`!``````````````````@```````````````````!J`/\`
+M``````,```````````0````````0````````````````P`,`````````````
+M``````````````````````````````````````````#`+P``````````````
+M````\`L`````````````````"````````````````````)@!_P``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````0`#P`/,`B('P`/,`00"``(,`
+MB8&``(,`2`#R`/4`BH'R`/4`0P#V`/<`BX'V`/<`2@#Q`/0`C('Q`/0`2P"!
+M`(0`C8&!`(0`3`""`(4`CX&"`(4`B`'P`/,`B0&``(,`B@'R`/4`BP'V`/<`
+MC`'Q`/0`C0&!`(0`CP&"`(4````(````````````````````````````````
+M```````````````!`G`7"P",```````!`B@C#P`2```````!`N`N"@"8`@``
+M```!`E!&#@`D`@`````!`L!="0"P!``````!`J",#0!(!``````!`H"["`!@
+M!``````!`O#2#`!L!```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````(````````````
+M```````````````````````````````````!`W`7"P",```````!`R@C#P`2
+M```````!`^`N"@"8`@`````!`U!&#@`D`@`````!`\!="0"P!``````!`Z",
+M#0!(!``````!`X"["`!@!``````!`_#2#`!L!```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````(```````````````````````````````````````````````!`G`7
+M"P",```````!`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D`@`````!
+M`L!="0"P!``````!`J",#0!(!``````!`H"["`!@!``````!`O#2#`!L!```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````(````````````````````````````````
+M```````````````!`W`7"P",```````!`R@C#P`2```````!`^`N"@"8`@``
+M```!`U!&#@`D`@`````!`\!="0"P!``````!`Z",#0!(!``````!`X"["`!@
+M!``````!`_#2#`!L!```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````$````````````
+M```````````````````````````````````!`.@#"P""```````!`-`'"@2$
+M`0`````!`'P5"02+`0`````!`/@J"`26`0``````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````$H@`````````````(H@``1D8^4$9&/E`,H@``;$&`9&Q!@&00H@``
+M`Z"9`0.@F0$4H@``$-9,!!#63`08H@``0`"`$T``@!,<H@``8`#@&V``X!L@
+MH@``"H!3#`J`4PPDH@``.]\4`#O?%``HH@``M0$``+4!```LH@``(````"``
+M``"<F`````````````"<F`````````````"<F`````````````"<F```````
+M``````"<F`````````````"<F`````````````"<F`````````````"<F```
+M``````````"<F`````````````"<F`````````````"<F`````````````"<
+MF``````X````.`"<F`````````````"<F`````````````"<F```````````
+M``"<F```^0`$`/D`!`#4F`````````0```"<F`````````````"<F```````
+M``````"<F`````````````"<F`````````````"<F`````````````"<F```
+M````$````!"<F```````!`````2<F`````````````"<F`````````````"<
+MF`````````````"<F`````````````J<F```@``X`(``.`*<F```!@`"``8`
+M``"<F```D@```)(```"<F```H````*````"<F```!P`$``<`!`#4F```&@``
+M`!H```"<F```2````$@```"<F```$````!````"<F```"`````@```"<F```
+M#P````\```"<F```\@```&(```"<F```3Y```$R0``"<F```6A(``)H2``#,
+MF```#@````\````(````````````````````````````````````````````
+M```!`G`7"P",```````!`B@C#P`2```````!`N`N"@"8`@`````!`E!&#@`D
+M`@`````!`L!="0"P!``````!`J",#0!(!``````!`H"["`!@!``````!`O#2
+M#`!L!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(````````````````````````
+M```````````````````````!`K@+"P"&```````!`I01#P`)```````!`G`7
+M"@",`@`````!`B@C#@`2`@`````!`N`N"0"8!``````!`E!&#0`D!``````!
+M`L!="``P!``````!`GAI#``V!```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````(````
+M```````````````````````````````````````````!`MP%"P"#```````!
+M`LH(#P`$```````!`K@+"@"&`@`````!`I01#@`)`@`````!`G`7"0",!```
+M```!`B@C#0`2!``````!`N`N"``8!``````!`KPT#``;!```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````'````````````````````````````````````````````
+M```!`W`7"P",```````!`^`N"@"8`@`````!`U!&#@`D`@`````!`\!="0"P
+M`P`````!`Z",#0!(`P`````!`X"["`!@`P`````!`_#2#`!L`P``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(````````````````````````
+M```````````````````````!`W`7"P",```````!`R@C#P`2```````!`^`N
+M"@"8`@`````!`U!&#@`D`@`````!`\!="0"P!``````!`Z",#0!(!``````!
+M`X"["`!@!``````!`_#2#`!L!```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````$````
+M```````````````````````````````````````````!`.@#&P""```````!
+M`-`'&@2$`0`````!`'P5&02+`0`````!`/@J&`26`0``````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````,````````````````````````````````````````````
+M```!`.@#&P""```````!`-`'&@2$`0`````!`'P5&02+`@`````!`/@J&`26
+M`P```````G`7"P`,!````````B@C#P`2!``````!`N`N"@`8!@`````!`E!&
+M#@`D!@`````!`L!="0`P"``````!`J",#0!("``````!`H"["`!@"``````!
+M`O#2#`!L"```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````-````````````````````````
+M```````````````````````!!/H``P"!`&0"9`(!!/0!!P"!`,D!R0$!!.@#
+M`@""`>0`Y``!!-`'!@"$`J``H``!!+@+`0"&`XP`C``!`G`7"P",!#P`/``!
+M`B@C#P`2!#P`/``!`N`N"@"8!C``,``!`E!&#@`D!C``,``!`L!="0`P""P`
+M+``!`J",#0!(""P`+``!`H"["`!@""P`+``!`O#2#`!L""P`+```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S
+M+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#
+M.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``+G-Y;71A8@`N<W1R
+M=&%B`"YS:'-T<G1A8@`N<F5L82YT97AT`"YR96QA+G)O9&%T80`N<F]D871A
+M+G-T<C$N-``N<F5L82YD871A`"YB<W,`+F-O;6UE;G0`````````````````
+M```````````````````````````````````````@`````0````8`````````
+M-````!P9`@````````````0`````````&P````0``````````````'P\`P`4
+M:@``"P````$````$````#````"L````!`````@````````!0&0(`-(X`````
+M````````"``````````F````!```````````````D*8#`(05```+`````P``
+M``0````,````,P````$````R`````````(2G`@```0`````````````$````
+M`0```$<````!`````P````````"(J`(`*%4`````````````"`````````!"
+M````!```````````````%+P#`&`````+````!@````0````,````30````@`
+M```#`````````+#]`@"8`0`````````````"`````````%(````!````````
+M``````"P_0(`J`,``````````````0`````````1`````P``````````````
+M6`$#`%L```````````````$``````````0````(``````````````+P#`P"`
+M(0``#````(4````$````$`````D````#```````````````\)0,`/1<`````
+M`````````0```````````````````````````````````````````````P`!
+M``````````````````,``P`````````````````#``4``0`````````&````
+M`0`#``P```"4````#`````$``P`7````H````!8````!``,`(@```+8````6
+M`````0`#`"T```#4````&`````$``P`X````[````!@````!``,`0P```#``
+M``!@"0```0`&`$X```"0"0``2`````$`!@!9````V`D``#P*```!``8`9```
+M`!@4``"@!@```0`&`&\```"X&@``0`,```$`!@!Z````^!T``"`#```!``8`
+MA0```!@A``"@`@```0`&`)````"X(P``H`````$`!@";````6"0``(`8```!
+M``8`I@````P!```8`````0`#`+$````(1```.`````(``0"\````V#P``%0`
+M```!``8`QP```"P]```J`````0`&`-(````H`0``<!(```$``P#=````T%\`
+M`"0````"``$`Z````/1?```(`````@`!`/,```"8$P``!@````$``P#^````
+MH!,``#@%```!``,`"0$``-@8```1`````0`#`!0!``#J&```"@````$``P`?
+M`0``]!@``$0````!``,`*@$``#@9``!P$@```0`#`#4!``!0JP``3`````(`
+M`0!``0``G*L```@````"``$`2P$``*@K```&`````0`#`/,```#(*P``!@``
+M``$``P!6`0``T"L``"`````!``,`80$``/`K``"\`@```0`#`&P!``"L+@``
+M6`4```$``P!W`0``C$4``%`!```!``8`@@$```0T`````P```0`#`(T!``#<
+M1@``+`$```$`!@"8`0``!#<``"@"```!``,`HP$``"PY```#`````0`#`*X!
+M```P.0``*`````$``P"Y`0````````@!```!``@`Q`$```@!``"``````0`(
+M`,\!``"(`0``$`````$`"`#:`0``6#D```H````!``,`Y0$``(0Y```@`0``
+M`0`#`/`!``"H.@``<!(```$``P#[`0``N`L!`!@````"``$`!@(``!A-```&
+M`````0`#`!$"```>30``!@````$``P`<`@``=$T```8````!``,`)P(``'I-
+M```,`````0`#`#("``#$&@$`*`````(``0`]`@``N$T``"`````!``,`2`(`
+M`-A-```L`````0`#`%,"``"83@``'`````$``P!>`@``+$\``%@"```!``,`
+M:0(``(11```@!@```0`#`!0!``"R5P``"@````$``P!T`@``O%<```H````!
+M``,`Y0$``,A7``!P`0```0`#`'\"```X60``<`$```$``P"*`@``*%L``%`!
+M```!``,`E0(``'A<``!``@```0`#`*`"``"X7@``F`$```$``P"K`@``4&``
+M```#```!``,`M@(``%!C```(`````0`#`,$"``!88P``&`````$``P#,`@``
+M<&,``!@````!``,`UP(``(AC``"8`0```0`#`.("```@90``P`````$``P#M
+M`@``D,`!`#@!```"``$`^`(``.!E```H`@```0`#``,#``#(P0$`8`$```(`
+M`0`.`P``*,,!`%@````"``$`&0,``(##`0"(!0```@`!`"0#``!XR0$`"`0`
+M``(``0`O`P``P,\!`%@````"``$`.@,``!C0`0`(`````@`!`*X!```H:```
+M+`````$``P!%`P``(-`!`$@````"``$`4`,``%1H``"``0```0`#`%L#``#4
+M:0``*`(```$``P!F`P``_&L````#```!``,`<0,``/QN```(`````0`#`'P#
+M```$;P``&`````$``P"'`P``'&\``!@````!``,`D@,``#1O``#``P```0`#
+M`)T#``#T<@``.`$```$``P"H`P``0-$!`#@!```"``$`LP,``'C2`0`D`P``
+M`@`!`+X#``"<U0$`4`````(``0#)`P``[-4!`#@'```"``$`U`,``"3=`0#,
+M!0```@`!`-\#``!`YP$`6`````(``0#J`P``@.H!`+0````"``$`]0,``$QT
+M``"``0```0`#```$``#,=0``6`0```$``P`+!```)'H````#```!``,`%@0`
+M`"1]```(`````0`#`"$$```L?0``&`````$``P`L!```1'T``!@````!``,`
+M-P0``%Q]``"(`@```0`#`$($``#D?P``2`````$``P!-!```%.P!`#@!```"
+M``$`6`0``$SM`0`D`P```@`!`&,$``!P\`$`.`,```(``0!N!```J/,!`%``
+M```"``$`>00``#3[`0#0`0```@`!`(0$```$_0$`<`````(``0"/!```<``"
+M`+0````"``$`F@0``$R```#0`@```0`#`*L$```<@P````0```$``P"V!```
+M'(<````#```!``,`P00``!R*```(`````0`#`,P$```DB@``&`````$``P#7
+M!```/(H``!@````!``,`X@0``%2*``!X`P```0`#`.T$``#,C0``2`````$`
+M`P#X!```$`("`#@!```"``$``P4``$@#`@`$`P```@`!``X%``!,!@(`:`0`
+M``(``0`9!0``M`H"`%`````"``$`)`4``$`2`@#0`0```@`!`"\%```0%`(`
+M<`````(``0`Z!0``?!<"`+0````"``$``````````````````P`&````````
+M``````````,`"``````````````````#``D`104``'2M``"D````$@`!`%`%
+M``"@EP``"````!(``0!;!0```$$!`/P!```2``$`9@4``,!R``"H````$@`!
+M`'$%``"870$`E`(``!(``0!\!0`````````````0````A@4``.0(`0`X````
+M$@`!`)$%``#X:P$`I`$``!(``0"<!0``(&(``'@!```2``$`IP4``"RZ`0!,
+M`0``$@`!`+(%``!8/0``I`$``!$`!@"]!0``\$<!`%`````2``$`R`4``(QE
+M``!(````$@`!`-,%``!85```"`$``!(``0#>!0``]$P``*0!```1``8`Z04`
+M`%0Y`0`X````$@`!`/0%``!P,P$`+````!(``0#_!0``$"4!``@````2``$`
+M"@8``*0'`0`\`0``$@`!`!4&``!<%`$`>`$``!(``0`@!@``C`H``)`````2
+M``$`*P8``&#W``#0````$@`!`#8&``#LW@````$``!(``0!!!@``*,```)@`
+M```2``$`3`8``#3&```D````$@`!`%<&```8G0``2````!(``0!B!@``R#T!
+M`$@````2``$`;08``"0&`0`(````$@`!`'@&``"`(0$`,````!(``0"#!@``
+M+&`!`-P````2``$`C@8``)0'``!<````$@`!`)D&``#0"P$`\````!(``0"D
+M!@``9+(```@````2``$`KP8``+2F`0"H`0``$@`!`+H&``#4H0``"````!(`
+M`0#%!@``6,8``"@````2``$`T`8``'P/``#,`0``$@`!`.L&```(2```I`$`
+M`!$`!@#V!@``"#4!`*@````2``$``0<``'B>``"<````$@`!``P'``!<`P``
+M-````!(``0`7!P``@*H!`)`````2``$`(@<`````````````$````$,'``!8
+M;0``;````!(``0!.!P``!#@!`"P!```2``$`60<``(`W`0"$````$@`!`&0'
+M```4^P``Q````!(``0!O!P``['```$0````2``$`>@<``$BZ``!T````$@`!
+M`(4'``#`P```J````!(``0"0!P``&/P``$@````2``$`FP<``/BV```P````
+M$@`!`*8'````-@$`F````!(``0"Q!P``**(``"P!```2``$`O`<```AL``!P
+M````$@`!`,<'``#HEP``2````!(``0#2!P``X"P!`)`````2``$`W0<``,S"
+M``!$````$@`!`.@'``"P-0$`0````!(``0#S!P``/#0!`)`````2``$`_@<`
+M``0*`0",````$@`!``D(```L80$`5````!(``0`4"```A&4```@````2``$`
+M'P@``)@V`0"H````$@`!`"H(``#(60``Z`4``!(``0`U"```4,(``#@````2
+M``$`0`@``-PO`0"0````$@`!`$L(``#,`@``D````!(``0!6"```S#0!`#P`
+M```2``$`80@``!".`0!4`0``$@`!`&P(``#4'P$`7````!(``0!W"```6&H!
+M`-@````2``$`@@@``!QP``!(````$@`!`(T(``"TL@``S````!(``0"8"```
+M/+@``)@````2``$`HP@``'"6```\````$@`!`*X(``"`E0$`S````!(``0"Y
+M"```B(D``#`#```2``$`Q`@``$QU```$````$@`!`,\(``!,E@$`1````!(`
+M`0#:"```N)D``&`#```2``$`Y0@``)@!```H`0``$@`!`/0(```T?`$`?`,`
+M`!(``0#_"``````````````0````!@D``*1%`0`H`0``$@`!`!$)``#PP0``
+M+````!(``0`<"0``S)(!`,`!```2``$`)PD``'@\`0!0`0``$@`!`#()``#P
+M1@$`*````!(``0`]"0``P`(```P````2``$`2`D``%2\```H````$@`!`%,)
+M``!@_```)`$``!(``0!>"0``V/L``$`````2``$`:0D``,S6``!H````$@`!
+M`'0)``"P7P``(````!(``0!_"0``9'```(@````2``$`B@D``)`#``#(`0``
+M$@`!`*`)```P:0$`/````!(``0"K"0``5*,```@!```2``$`M@D``(!R``!`
+M````$@`!`,$)```(L```,````!(``0#,"0``"&$!`"0````2``$`UPD``*3G
+M``!$````$@`!`.()``"8)P$`O`0``!(``0#M"0``E",!``@````2``$`^`D`
+M`*!F``#,````$@`!``,*```8K@``>````!(``0`."@``O*T!`&`````2``$`
+M&0H``&0E`0!D`0``$@`!`"0*``"\P0``!````!(``0`O"@``Q&P``)0````2
+M``$`.@H``/#Z```D````$@`!`$4*```4#0$`V`8``!(``0!0"@``\)$!`-P`
+M```2``$`6PH``&@S`0`(````$@`!`&8*``#,M@``+````!(``0!Q"@``1$D!
+M`*@````2``$`?`H``)B7```(````$@`!`(<*``!XH0$`^`(``!(``0"2"@``
+MC,D``.0````2``$`G0H``.!J``!D````$@`!`*@*``!`-P$`0````!(``0"S
+M"@``[!,!`'`````2``$`O@H``(P#`0`L````$@`!`,D*```0JP$`:````!(`
+M`0#4"@`````````````0````X0H``#B9``"`````$@`!`.P*``!L?```Y```
+M`!(``0#W"@``:*8!`$P````2``$``@L``.BK`0`(````$@`!``T+``#\,`$`
+MR````!(``0`8"P``P`4``(0!```2``$`*0L``+R9`0"\!```$@`!`#0+```P
+M<0``O````!(``0`_"P``8)\``,@````2``$`2@L``+#!```$````$@`!`%4+
+M``"<,P$`+````!(``0!@"P``>+L!`*@````2``$`:PL``&![``"H````$@`!
+M`'8+```,&P$`U````!(``0"!"P``;+(``$@````2``$`C`L``!S9``#D`0``
+M$@`!`)<+``"LE@``[````!(``0"B"P``J',!`$0'```2``$`K0L```Q+`0"P
+M````$@`!`+@+``#\0@$`+````!(``0##"P``<,H``,@!```2``$`S@L``(PY
+M`0#L`@``$@`!`-D+``!HO@``C````!(``0#D"P``Q,$``"P````2``$`[PL`
+M`!`^`0#P`@``$@`!`/H+``#<E@$`L`$``!(``0`%#```'*X!`)`&```2``$`
+M$`P``(C"``!$````$@`!`!L,``!@I```%````!(``0`F#```D&0```@````2
+M``$`,0P``)"N``!X`0``$@`!`#P,``#4+@$`:````!(``0!'#```\'4``"``
+M```2``$`4@P``"0!`@#L````$@`!`%T,``!`=0``!````!(``0!H#```]#,!
+M``@````2``$`<PP``$PR`0!@````$@`!`'X,```\4```I`$``!$`!@")#```
+M7`0!`)@````2``$`E`P``#S``0!4````$@`!`)\,``"X<P``F````!(``0"J
+M#```@,8``"@````2``$`M0P``%!]```D`@``$@`!`,`,``!D70$`-````!(`
+M`0#+#```A"P!`"P````2``$`U@P``#PO`0"@````$@`!`.$,```HK`$`E`$`
+M`!(``0#L#```Z(<``"@````2``$`]PP```AY```H````$@`!``(-``"`;@``
+MY````!(``0`-#0``,'P``#P````2``$`&`T``"`N`0"T````$@`!`",-``!L
+M9`$`S`,``!(``0`N#0``<)\!``@"```2``$`.0T``*!```"D`0``$0`&`$0-
+M``!L9P``'`(``!(``0!/#0``!$<``'@````2``$`6@T``*B7``!`````$@`!
+M`&4-```(?```*````!(``0!P#0`````````````0````D`T``'1_``",!P``
+M$@`!`)L-````````"0```!$`!@"K#0``G&T!`*@````2``$`M@T``-2X``!<
+M````$@`!`,$-```P&`(`[````!(``0#,#0``U!4!`%@````2``$`UPT``)0P
+M`0!H````$@`!`.(-``!0=0``!````!(``0#M#0``O&D!`)P````2``$`^`T`
+M`+3!```(````$@`!``,.``"(Q0``*````!(``0`.#@``@+,``,P````2``$`
+M&0X``/PS`0`X````$@`!`"0.`````````````!`````S#@``C+D``'`````2
+M``$`/@X``)A.``"D`0``$0`&`$D.``!\10$`*````!(``0!4#@``A!P!`'@`
+M```2``$`7PX``.S?``!@````$@`!`&H.``#$AP``)````!(``0!U#@``,+\`
+M`*@````2``$`@`X``)PC`0!T`0``$@`!`(L.``"L20``I`$``!$`!@"6#@``
+M,#D!`"0````2``$`H0X``,2[``"0````$@`!`*P.``!82@$`M````!(``0"W
+M#@``\+<!`#P"```2``$`P@X``$RT``!0`@``$@`!`,T.```4>@``2````!(`
+M`0#8#@``O+<``$0````2``$`XPX``!SC``!``0``$@`!`.X.``!HCP``&```
+M`!(``0#Y#@``G$@!`*@````2``$`!`\``%!+``"D`0``$0`&``\/```PN0``
+M7````!(``0`:#P``)+L``*`````2``$`)0\``&1O``"0````$@`!`#`/``"@
+MG@$`+````!(``0`[#P`````````````0````2@\``"P&`0!,````$@`!`%4/
+M``"P+`$`,````!(``0!@#P``N&D``"P````2``$`:P\``/`U`0`0````$@`!
+M`'8/``"HP0``"````!(``0"!#P``M"T!`&P````2``$`C`\``$1"``"D`0``
+M$0`&`)</```XR0``*````!(``0"B#P``.+```"`!```2``$`K0\``$`!``!8
+M````$@`!`+L/``#\/@``I`$``!$`!@#&#P``D,@``*@````2``$`T0\``%BQ
+M```(````$@`!`-P/```,````)````!$`!@#N#P``Q&T``#@````2``$`^0\`
+M`'!N```0````$@`!``00```8)0$`3````!(``0`/$```T'<``(P````2``$`
+M&A```+B]`0"$`@``$@`!`"40``!<>```*````!(``0`P$```&,```!`````2
+M``$`.Q```)1'`0!<````$@`!`$80```D4P``U````!(``0!1$```>)X!`"@`
+M```2``$`7!```.C'``"H````$@`!`&<0``!HP0``0````!(``0!R$```0$<!
+M`%0````2``$`?1```+@#`0`P````$@`!`(@0``"0E@$`3````!(``0"3$```
+MV+\``$`````2``$`GA```.QZ`0`(`0``$@`!`*D0``!@L0``!`$``!(``0"T
+M$```>`8!`"P!```2``$`OQ```.A#``"D`0``$0`&`,H0``#,>0``2````!(`
+M`0#5$```\*L!`#@````2``$`X!```,AC``#(````$@`!`.L0``"$>```8```
+M`!(``0#V$```M/X``+`$```2``$``1$``)1U``!<````$@`!``P1``"H<P``
+M$````!(``0`7$0``_!P!`/`!```2``$`(A$``(R4`0#T````$@`!`"T1``!@
+MR0``+````!(``0`X$0``^%,``&`````2``$`0Q$``.P@`0"4````$@`!`$X1
+M``!,#@``B````!(``0!9$0``[`@``*`!```2``$`9!$``'@?`0!<````$@`!
+M`&\1``!0=```J````!(``0!Z$0``Y'@``"0````2``$`A1$``/2+`0",````
+M$@`!`)`1``"L:P``7````!(``0";$0``]'L!`$`````2``$`IA$``-!#```X
+M````$@`!`+$1``!8!0``:````!(``0"\$0``<"T!`$0````2``$`QQ$`````
+M````````$````-<1``#HYP``?`$``!(``0#B$0``F&,``#`````2``$`[1$`
+M`'"D`0#X`0``$@`!`/@1``!X;```3````!(``0`#$@``R"8!`-`````2``$`
+M#A(``*R]``"\````$@`!`!D2``#T!`$`,`$``!(``0`D$@`````````````0
+M````1!(``/`'``#\````$@`!`$\2```<:@``>````!(``0!:$@``E&H``$0`
+M```2``$`91(```"X```\````$@`!`'`2``#490``S````!(``0![$@``O+H`
+M`&@````2``$`AA(``"P6`0"8!```$@`!`)$2```<P@``+````!(``0"<$@``
+MO$L!`!@"```2``$`IQ(``#AU```(````$@`!`+(2``"(:0``,````!(``0"]
+M$@``:&X```@````2``$`R!(`````````````$````-82``"<M@``,````!(`
+M`0#A$@``"`P``-0````2``$`[!(``%1U``!`````$@`!`/<2``",QP``7```
+M`!(``0`"$P``$,,``"P````2``$`#1,``)2(``#T````$@`!`!@3``!<>@``
+M7````!(``0`C$P``_&T``&P````2``$`+A,``%0L`0`P````$@`!`#D3```8
+M1P$`*````!(``0!$$P``M%P!`+`````2``$`3Q,``/RY``!,````$@`!`%H3
+M``"@(`$`3````!(``0!E$P``1&X!`&0%```2``$`<!,``/1O```H````$@`!
+M`'L3``"PQ0``A````!(``0"&$P``?+P``$@````2``$`D1,``"B@``"L`0``
+M$@`!`)P3```PMP``C````!(``0"G$P``P,$```0````2``$`LA,``#"8```(
+M`0``$@`!`+T3``#@40``I`$``!$`!@#($P``%&H```@````2``$`TQ,``"BW
+M```(````$@`!`-X3``"@80``@````!(``0#I$P``F&0``.P````2``$`]!,`
+M`#`@`0!P````$@`!`/\3``#4#@``J````!(``0`*%```8*H!`"`````2``$`
+M%10``#0T`0`(````$@`!`"`4``!,O0``8````!(``0`K%```5(L!`*`````2
+M``$`-A0``/S$``",````$@`!`$$4```XS```<`H``!(``0!,%```A%,``*0!
+M```1``8`5Q0``.P:`0`@````$@`!`&(4``!$:P``:````!(``0!M%```1`<`
+M`%`````2``$`>!0``.1I```P````$@`!`(,4``!<J`$`!`(``!(``0".%```
+M&)D!`*0````2``$`F10``#!Y```H````$@`!`*04``#TO@``/````!(``0"O
+M%```S$8!`"0````2``$`NA0``%AY``!T````$@`!`,44``"$8```E````!(`
+M`0#0%```:',``$`````2``$`VQ0``*"I```X````$@`!`.84``#<#```<`$`
+M`!(``0#Q%```X`@!``0````2``$`_!0``&"=``!D````$@`!``<5``#\Q@``
+M2````!(``0`2%0``1'4```@````2``$`'14``!#^``"D````$@`!`"@5``!`
+M2`$`7````!(``0`S%0``:-`!`-@````2``$`/A4``/AT``!`````$@`!`$D5
+M``!@50``.````!(``0!4%0``3$P``-@&```2``$`:A4``.Q)`0!L````$@`!
+M`'45``"X>@``J````!(``0"`%0``U$T!`.`.```2``$`BQ4``+`A`0#D`0``
+M$@`!`)85``#H`P$`=````!(``0"A%0``1,<``$@````2``$`K!4``,2=``"T
+M````$@`!`+<5```P0P``H````!(``0#"%0``W*$``$P````2``$`S14``!"(
+M``"$````$@`!`-@5``"HQ@``5````!(``0#C%0``J-8``"0````2``$`[A4`
+M`!AA``"(````$@`!`/D5``!<I```!````!(``0`$%@``['$``)0````2``$`
+M#Q8``#SV``!`````$@`!`!H6``#P1`$`C````!(``0`E%@``K#(!`+P````2
+M``$`,!8``,2\``"(````$@`!`#L6````I0``H`0``!(``0!&%@``V)(```@#
+M```2``$`418``,@S`0`L````$@`!`%P6``!D`P$`*````!(``0!G%@``-.L!
+M`.`````2``$`<A8``,0Q`0"(````$@`!`'T6``#L'@$`C````!(``0"(%@``
+M@&$!`.P"```2``$`DQ8``,R>`0`P````$@`!`)X6`````````````!````"P
+M%@``X*P``)0````2``$`NQ8``.`;`0"D````$@`!`,86`````````````!``
+M``#7%@``V&H```@````2``$`XA8``$C"```(````$@`!`.T6```4GP``3```
+M`!(``0#X%@``;#`!`"@````2``$``Q<``%2%`0!4`0``$@`!``X7```TUP``
+MZ`$``!(``0`9%P``?$8``(@````2``$`,A<``/R>`0!T````$@`!``!Z>C`P
+M,#$R,C$Q`'IZ,#`P,C<V.&,`>GHP,#!D.3!F,`!Z>C`P,S8T-61D`'IZ,#!C
+M9&8V8C8`>GHP,&-D9C9C,P!Z>C`P,6%C-C@S`'IZ,#9B,60W,#,`>GHP,#`V
+M-3,S,0!Z>C`P,6%A-C$S`'IZ,#,U-&1F-C,`>GHP,#%A830Y,P!Z>C`P9#4Q
+M.3`S`'IZ,&%A,F5B83``>GHP,#`Q86,R8@!Z>C`P,#`P9#,U`'IZ,#`P,#8V
+M,F,`>GHP,#`P-CDU90!Z>C`P,#8X,S1E`'IZ,#`P,&(V9&4`>GHP8C9B9C`P
+M.0!Z>C!B-64S,6$X`'IZ,#`P,#%A.#``>GHP,#!B9#$Q-@!Z>C`U93AE-F,Q
+M`'IZ,&5C,V(R,F4`>GHP,#<Q8F)B9`!Z>C`P,#!B-F4V`'IZ,&(V8S<P,#D`
+M>GHP8C8R,S%A.`!Z>C`P,#,S,#,R`'IZ,#`P,&0R-#D`>GHP,#`R9&(W-0!Z
+M>C`P,#5B-C<X`'IZ,#`P8C9D8S(`>GHP,#)D.38U8P!Z>C`P,#)D83EB`'IZ
+M,#`P-C,X-&0`>GHP,#`P930Y.`!Z>C`P,#8U-#`Y`'IZ,#`P9#1E.#8`>GHP
+M,#`V83,T,P!Z>C`P,#9D-3EC`'IZ,&5C,V(R,S,`>GHP,#`Q.3@W8P!Z>C`P
+M,#!B-F5E`'IZ,#!B-F1A,C@`>GHP,#`S,S`P,`!Z>C`P,#,S,#`U`'IZ,#`Q
+M.3@X,#``>GHP,#`P,3DV,0!Z>C!B-F8S8V-B`'IZ,#`P,&0R-#@`>GHP,#`S
+M,F0T9`!Z>C`P,#`Q.&5A`'IZ,#`P,F1B.34`>GHP,#`U8C9B.`!Z>C!E8S-B
+M,C)F`'IZ,#`Q.3AA8S``>GHP,#5B-V(X9@!Z>C`P8C9D9F5F`'IZ,#`U8C4U
+M868`>GHP-6(S,30V9@!Z>C`P-6(U-6-F`'IZ,#`U8C4U968`>GHP,#5B-38P
+M9@!Z>C`P-6(U-C9F`'IZ,#`U8C4V.&8`>GHP,#)D8S(W-0!Z>C`P,3AE,6,P
+M`'IZ,#`U8C9B,F4`>GHP,#)D83EF8@!Z>C`P,F1B-C@U`'IZ,#)D8C@U,&0`
+M>GHP,#`U8C1E,@!Z>C!B-3(S,6$X`'IZ,#!B-F$W-64`>GHP,#5B-V(Y,`!Z
+M>C`P8C9D9F8P`'IZ,#5B,S$T-S``>GHP,#5B-35D,`!Z>C`P-6(U-68P`'IZ
+M,#`U8C4V,3``>GHP,#5B-38W,`!Z>C`P-6(U-CDP`'IZ,#`R9&,T-S4`>GHP
+M,#5B-F8R90!Z>C`P,F1A8F9B`'IZ,#`R9&(X.#4`>GHP,F1B834P9`!Z>C`P
+M,#5B-3(R`'IZ,&(U-C,Q83@`>GHP,#5B-V(X-0!Z>C`P8C9D9F4U`'IZ,#5B
+M,S$T-C4`>GHP,#5B-35C-0!Z>C`P-6(U-64U`'IZ,#`U8C4V,#4`>GHP,#5B
+M-38V-0!Z>C`P-6(U-C@U`'IZ,#`R9&%E-S4`>GHP,#5B-#,R90!Z>C`P,F1A
+M,C@U`'IZ,#`R9#DU9F(`>GHP,F1A-#4P9`!Z>C`P,39C8V$R`'IZ,&(R83,Q
+M83@`87(U,C$R36]D97-?-30Q,P!Z>C`P8C9D9F9D`'IZ,#5B,S$T-V0`>GHP
+M,#5B-35D9`!Z>C`P-6(U-69D`'IZ,#`U8C4V,60`>GHP,#5B-38W9`!Z>C`P
+M-6(U-CED`'IZ,#`R9&1E-S4`>GHP,#5B83,R90!Z>C`P,F1D,C@U`'IZ,#`R
+M9&,U9F(`>GHP,F1D-#4P9`!Z>C`P,39E-&$R`'IZ,&(X83,Q83@`>GHP,#5B
+M-3@T-@!Z>C`P,F1B,3%C`'IZ,#)D8F8X-S4`>GHP,F1B8C%B,@!Z>C`R9&(R
+M,#4S`%]?87-H;&1I,P!Z>C`P,F1B830R`'IZ,&9B8C%E,V8`>GHP8C<Y96$Y
+M-`!Z>C`U8CAC-C5A`'IZ,#`U8C0P860`>GHP-6(Y-#)E9`!Z>C!D.&1C-C)C
+M`'IZ,#`Q.68T-S``>GHP,F1D.30R9`!Z>C`R9&)E-S-D`'IZ,#`U8C8Y,F(`
+M>GHP8C9D,C,R-0!Z>C`P-6(X-3-D`'IZ,#`Q-F0Y,F4`>GHP8V9B,3@W-0!Z
+M>C`P,F1B,S%C`'IZ,#)D86)B86,`>GHP,F1B8S@U,0!Z>C`P,&(V8S8X`'IZ
+M,#`P8C9B9C@`>GHP,&(V8V8U90!Z>C`Q-F4Q9&9D`'IZ,&(V9C4P8C@`>GHP
+M-F4P831F90!Z>C`P-C=D,F(Q`'IZ,#`R9&)C-C$`>GHP8C9C83,R-0!Z>C`P
+M-6(V8V9D`'IZ,#$V93!D9F0`>GHP,#!B-F8V.`!A=&A?:&%L7W!R;V-E<W-?
+M;F]I<V5F;&]O<@!Z>C`P-6(T.&%D`'IZ,#)D8F8Q8C(`>GHP,#5B.#AC8@!Z
+M>C`S,V5C.&)F`'IZ,&1B-#(U8S4`871H7VAA;%]D;6%?8F5A8V]N7W)E<W!O
+M;G-E7W1I;64`>GHP,&(V9C$V,0!Z>C`V93`P8CAA`'IZ,#)D8F9C,60`>GHP
+M9&,T93,Y,`!Z>C!D869E9#@V`'IZ,#!B-F4R-V$`>GHP,F1B8F%B,@!Z>C!B
+M-F0Q969F`'IZ,#$V9#DP9&0`>GHP,F1B93@U,0!Z>C`P-6(V-&9D`'IZ,#`P
+M8C9D-3(`>GHP8C9C.65F9@!Z>C`Q-F4P,&1D`'IZ,#)D8F0X-S4`>GHP,F1B
+M,S%B,@!Z>C`P8C<P.3(S`'IZ,#!B-F0T-3``>GHP,#!B-F0Q9`!Z>C!B-F,R
+M,S(U`'IZ,#)D8F1A8C(`>GHP,#`U8C8S,@!Z>C`V9&5D9#DS`'IZ,#`Q-F1A
+M-3``>GHP,#`V-V0S,@!Z>C`P8C9D.3(S`'IZ,#`R9&(U,6,`>GHP,39D8V)F
+M90!Z>C`P8C<P,30U`'IZ,#`Q-F1F,F,`>GHP8C=F860S90!Z>C`Q-F0Y.3(P
+M`'IZ,#)D8C%B86,`>GHP9&,V93,Y,`!Z>C`U8C<P,64P`'IZ,#`P8C9B,3``
+M>GHP8C<P.65F9@!Z>C`Q-F1F.#EB`&%T:%]H86Q?871T86-H`'IZ,#9E,&9C
+M,&0`;65M8W!Y`'IZ,#$V9&%B,F0`>GHP,F1B,3,U9`!Z>C!E,#0V.#1B`'IZ
+M,#$V93(Y,60`>GHP,#!B-F9E.`!Z>C`P8V9B,V4P`'IZ,#`Q-F0Y-#@`>GHP
+M,39E,C`Y8@!Z>C!B-S`Q969F`'IZ,#`P8C9C.60`>GHP,#`U8C5A,@!Z>C`R
+M9&(Q-S!A`&%T:%]H86Q?8V]M<'5T971X=&EM90!Z>C`R9&(U8F%C`'IZ,#`U
+M8C@Q,V0`>GHP,&(V8SDR,P!Z>C!B-F(U,&(X`'IZ,#`U8C=F.60`>GHP8C<P
+M,60P,@!Z>C`V9&9F-#1A`'IZ,#)D8C4W-C,`>GHP-F5E868V,`!Z>C!E,#`W
+M8V$Q`'IZ,#`R9&%F-C(`>GHP8C@S860S90!Z>C`P,&(V8CDP`'IZ,#$V9#EE
+M9F$`>GHP,39D93`U,0!Z>C`P,#5B-F(R`'IZ,#5B-V8Q,30`>GHP-&%E,#,Q
+M9@!Z>C`R9&)D9&9D`'IZ,#`U-#=F960`>GHP,&(V8F8U90!Z>C`P8C<Q-S=D
+M`'IZ,#!B-S!F,V0`>GHP,39D.#DR,`!Z>C`R9&(Q86(R`'IZ,#`P-6(V,C(`
+M>GHP,#!B-F8W.`!Z>C!B-CEB,#=C`&%T:%]H86Q?9G)E90!Z>C`U8C<Y8C%B
+M`'IZ,#!B-S`W,V0`>GHP,F1B96)B9`!Z>C!B-64S,34R`'IZ,#$V9&9B9C$`
+M871H7VAA;%]M:'HR:65E90!Z>C`Q-F4Q.#EB`'IZ,&1C,F$U8S4`>GHP,#)D
+M8S8P8@!Z>C`V9&8P8CAA`'IZ,#)D8C,S-60`>GHP8C9C-3-A-`!Z>C!F-31D
+M,6(P`'IZ,&(V9F0S-C,`>GHP9#ED8S8R8P!Z>C`U8C<T,64P`'IZ,#)D83EB
+M86,`>GHP9&,R,60S80!Z>C`P8C<Q-S-D`'IZ,#$V9#ED-#$`>GHP,#5B.#1F
+M9`!Z>C`P-6(X86)D`'IZ,#!B-S`Q,C,`>GHP,#5B-C4R8@!Z>C`R9&(S.#<U
+M`'IZ,#$V93,P.6(`>GHP,#5B-C!B,@!Z>C`R9&(Q.#<U`'IZ,#`R9&(X-#(`
+M>GHP,F1B,3<V,P!Z>C!B-V1E83DT`'IZ,#!B-S`Q-C$`>GHP,39D-V0T,0!Z
+M>C`P,39C9#,R`'IZ,#9D93!B.&$`>GHP-F0Y9&0Y,P!Z>C!D8C-E9#@V`'IZ
+M,#`U8C0X960`>GHP,#)D8S@P8@!Z>C`P,F1B8S0R`'IZ,#)D8F$X-3$`>GHP
+M,F1B,S-E9`!Z>C`P-6(X,&9D`'IZ,#`U8C=F,F4`>GHP,F1B9F1F9`!Z>C`Q
+M-F4V-#AA`'IZ,#`R9&%F9C(`>GHP,#5B-S<Y9`!Z>C`P,&(V964X`'IZ,#$V
+M930T.&$`>GHP,&(V9C9B8P!Z>C`Q-F1A.3(P`'IZ,#5B-S@Q93``>GHP,#)D
+M8V$P8@!Z>C`P-6(T-&%D`'IZ,#9D9&8T-&$`>GHP9F%C,&,Y8@!Z>C!B-F8Y
+M969F`'IZ,#!B-F,V8F,`871H7VAA;%]A9&1I=&EO;F%L7W-W8F%?8F%C:V]F
+M9@!Z>C`P,#)D8CDR`&%T:%]H86Q?=F5R<VEO;@!Z>C`R9&)A8S)E`'IZ,#)D
+M8C<Y864`>GHP,#$V934S,@!Z>C!B-F-F,#`Y`'IZ,#`Q-F4Q,F,`>GHP,#$V
+M9#EE-`!Z>C`P,#)D865A`'IZ,#`U8C5C8C(`>GHP,39D83(U,0!Z>C`V9C9A
+M9C8P`'IZ,#9D9F1D.3,`871H7VAA;%]M86QL;V,`>GHP,#!B-F1D,@!Z>C`R
+M9&0Y,F%D`'IZ,#$V9&(R-3$`>GHP93$P-V-A,0!Z>C`P8C9C-S5E`'IZ,#$V
+M9&0P-3$`>GHP,F1B9#%B,@!Z>C`R9&,Q-S8S`'IZ,&(V.3!D-F0`>GHP,39D
+M9C`U,0!Z>C`P,39D.34P`'IZ,#!B-S`V8F,`>GHP,#$V9#@W,@!Z>C`V9&5F
+M-#1A`'IZ,#5B.&,R960`>GHP-F9B.30W8@!Z>C!E8F(Q93-F`'IZ,&(V9CED
+M,#(`>GHP9#$T9#%B,`!Z>C!B-#@P,S%E`'IZ,#$V9&)B9F4`>GHP,39E-30X
+M80!Z>C`P,39D.#4P`'IZ,#`P8C9F9C@`871H7VAA;%]M96UC<'D`>GHP,F1B
+M8V)B9`!Z>C`Q-F1A,&1D`'IZ,#)D8F)D9F0`>GHP,F1B,C@U,0!Z>C`R9&)D
+M8S%D`'IZ,#9D8C!C9C(`>GHP,39E8CEA9`!Z>C`P8C9C96)C`'IZ,&0Y-#@T
+M83$`871H7VAA;%]P<F]B90!Z>C`Q-F5A.6%D`'IZ,&9D-&0Q8C``>GHP,F1B
+M,S<V,P!A=&A?:&%L7V)U:6QD;W!T<P!Z>C`R9&%F,S5D`'IZ,#9D9&1D.3,`
+M>GHP9&%D8S8R8P!Z>C`Q-F1F,C4Q`'IZ,#`P8C9C,3``>GHP,39D.3(U,0!Z
+M>C`R9&(P.#4Q`'IZ,&(W,C%A960`>GHP-C=C9F-A90!Z>C`P,&(V8V8X`'IZ
+M,&,Y-&0Q8C``>GHP,F1A9F%B,@!Z>C`U8CDR865D`'IZ,#`U8CAC8V(`>GHP
+M8C9D.65F9@!Z>C`R9&(Q,6(R`'IZ,#)D8F9F8C$`>GHP,F1B9C<V,P!Z>C`P
+M-6(V.&9D`'IZ,#`U8C0T960`>GHP8C<Q,6%E9`!Z>C!B-64S,38P`'IZ,&0X
+M-#@T83$`>GHP,39D.&(R9`!Z>C`Q-F4P.#EB`'IZ,#)D8F(X-S4`>GHP,F1A
+M93@U,0!Z>C!B.#%E83DT`'IZ,#$V9&5C,68`>GHP,&(V9F5B8P!Z>C!E.#DT
+M.3`W`'IZ,#!B-F5A-V$`>GHP,S-E.&9B9@!Z>C!C9F$U.#<U`'IZ,#)D8CDY
+M864`>GHP,F1B.6%B,@!Z>C`P,&(V8F4X`'IZ,&1E-C@S-V8`>GHP,39D86)F
+M90!Z>C!B-S`Y9#`R`'IZ,#8W9#(U93(`>GHP,3EF,V$P,0!Z>C`W,#,Y-#=B
+M`&%T:%]H86Q?;65M>F5R;P!Z>C`V9&9F8S!D`'IZ,&(V-S4P8C@`>GHP,39E
+M,F1F9`!Z>C`P,&(V9#(R`'IZ,#9F96%F-C``>GHP9&,T835C-0!Z>C`P8C<P
+M9C=D`&%T:%]H86Q?<W=?8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP.68V-&(V
+M80!Z>C`P-6(V-3=A`'IZ,#9F,SDT-V(`>GHP-F1A,&-F,@!Z>C!B-V)A9#-E
+M`'IZ,#!B-F8Y-C$`>GHP8C8Y-S-B8P!Z>C`R9&)D,S5D`'IZ,#`U8C@X9F0`
+M>GHP,F1B8F,Q9`!Z>C`R9&%F9&9D`'IZ,#9D-V1D.3,`871H7VAA;%]D96QA
+M>0!Z>C`R9&(Q9&9D`'IZ,#8W9#)F-#$`>GHP,F1A9C@W-0!Z>C!B-V5D939D
+M`'IZ,#$V9#AD-#$`>GHP,#)D864Y,@!Z>C!B-V%D939D`'IZ,#)D8F(S-60`
+M>GHP,F1B,V1F9`!Z>C`R9&(U,V5D`'IZ,#$V9&-E864`>GHP,#!B-F1A,@!Z
+M>C`P,&(V93(R`'IZ,#5B.#`P-#$`>GHP,#$V9#@T.`!Z>C`Q-F0Y8C)D`'IZ
+M,#`Q-F4P,F,`>GHP,&(W,#<W9`!Z>C`P-6(V.3=A`'IZ,#`Q-F1A930`>GHP
+M,39E,3`Y8@!Z>C`P-6(T83)D`'IZ,#$V9&4P9&0`>GHP,39D9C!D9`!Z>C!D
+M9C`W8V$Q`'IZ,#)D8F0W-C,`>GHP,#!B-F4U,@!Z>C`V-V0P8S0W`'IZ,#5B
+M-F,V9&(`>GHP8S,Q-65B-0!Z>C!D8C%E9#@V`'IZ,#9D-#`V93``>GHP,39E
+M,#(U,0!Z>C`P,#)D8F(R`'IZ,#`R9&0X-F0`>GHP,#$V93$T9`!Z>C`R9&(U
+M.6%E`'IZ,#`V-V0R,C$`>GHP,39D.#!D9`!Z>C`P-6(X.3-D`'IZ,#5B.#%B
+M,6(`>GHP,F1B,3-E9`!Z>C`P8C9D,3(S`'IZ,#`P8C9C93@`>GHP-6(X86%E
+M9`!Z>C!B-F5D,S8S`'IZ,#)D868Q8C(`>GHP,#`U8C5E,@!Z>C`S,V5B9F)F
+M`'IZ,#5B-C@V9&(`>GHP,#!B-F5F.`!Z>C!B-S$Y865D`'IZ,#`U8C4X8C(`
+M>GHP-6(W9&(Q8@!Z>C!B.#)D939D`'IZ,#`Q-F0W,S(`>GHP,F1A9&%B,@!Z
+M>C!F-#5E-F4S`&%T:%]H86Q?:6YI=%]C:&%N;F5L<P!Z>C`P8C9D-F)C`'IZ
+M,&,Q-&0Q8C``>GHP,#`R9&)D,@!Z>C!D830X-&$Q`'IZ,#$V93!B.#<`>GHP
+M-6(Y,#)E9`!Z>C!D8S)E,SDP`'IZ,&$V,&0Q-#4`>GHP,F1B86)B9`!Z>C`P
+M,&(V8S%D`'IZ,#5B.&5A960`>GHP,#5B-V(Y9`!Z>C`P-6(U-#0V`'IZ,#5B
+M-C0V9&(`>GHP,&(V9CDR,P!Z>C!D9#8X,S=F`'IZ,#$V93$R-3$`>GHP9&,V
+M835C-0!Z>C`R9&(S-S!A`'IZ,#`P-6(V-S(`>GHP-F1E9F,P9`!Z>C`R9&)F
+M,S5D`'IZ,#`P8C9C-S@`>GHP,#$V9#@S,@!Z>C`R9&(U-S!A`'IZ,#`U8C9D
+M-V$`>GHP,#)D8C(Y,@!Z>C`P-6(Y,&-B`&%T:%]H86Q?<F5G7W=R:71E`'IZ
+M,&(V9C4S-C,`>GHP,#5B-6,T-@!A=&A?:&%L7W)E9U]R96%D`'IZ,#9D.3!C
+M9C(`>GHP-F0X9&0Y,P!Z>C`Q-F1F8C@W`'IZ,#`Q-F1A-#@`>GHP8C8V,S%A
+M.`!Z>C`P,F1B,#DR`&%T:%]H86Q?9V5T=VER96QE<W-M;V1E<P!Z>C`Q-F4Q
+M8C@W```````````&`P``1`````0````$`P``1````%0````&`P``6````%@`
+M```$`P``6````'P````&`P``;````(`````$`P``;````,P````&`P``@```
+M`-`````$`P``@````.0````&`P``E````.@````$`P``E````/@````&`P``
+MJ````/P````$`P``J`````0!```&`P``N`````@!```$`P``N````!`!```&
+M`P``R````!0!```$`P``R````!P!```&`P``W````"`!```$`P``W````"@!
+M```&`P``\````"P!```$`P``\````$P"```*]0```````%0"```*`P(`````
+M`%P"```*Q0````````@#```*#P(``````"`#```*M`$```````@&```*.P$`
+M`````(0&```*.P$``````&@'```*G0$``````&P'```&!````````'`'```$
+M!````````,0'```*G0$``````,@'```&!````````,P'```$!````````)0(
+M```*Y0```````+`(```*Y0```````/@(```&`@``"````/P(```$`@``"```
+M`)0+```*#P(``````/0.```*?`$``````!P/```*G0$``````#@/```&!0``
+M`````#P/```$!0```````-@/```&!0```````-P/```$!0`````````0```*
+MG0$``````$P1```&!@```````%`1```$!@```````%P1```&!P```````&`1
+M```$!P```````!`5```*3`$``````#`:```*GP$``````#P=```*`@$`````
+M`.PG```&`@``S````/`G```$`@``S````/0G```$`@``S````!PH```*3`$`
+M`````$`H```*GP$``````-0H```*GP$``````&@I```*GP$``````-@I```*
+M`@$``````)PT```&"0```````*`T```$"0```````*PT```&"````````+`T
+M```$"````````)A$```&"@```````)Q$```$"@```````*Q$```&#```````
+M`+!$```$#````````'!%```&#````````'1%```$#````````(1'```&#```
+M`````(A'```$#````````/1'```&"@```````/A'```$"@```````&1(```&
+M$@```````&A(```$$@```````)!(```*90$``````-!(```&"@```````-1(
+M```$"@```````*A)```&"@```````*Q)```$"@```````"A*```&"P``````
+M`"Q*```$"P```````+Q+```*B@````````A.```&$P````````Q.```$$P``
+M`````!!.```&$P``&````!1.```$$P``&````+!.```&#@```````+1.```$
+M#@```````-1.```&#0```````-A.```$#0```````/1.```&#P```````/A.
+M```$#P```````!A/```&$````````!Q/```$$````````#Q/```&$0``````
+M`$!/```$$0```````%Q/```&#@```````&!/```$#@```````(A0```*GP$`
+M`````+!1```*V````````-Q1```&$P``&````.!1```$$P``&`````Q2```&
+M%````````!!2```$%`````````Q4```*?`$```````Q5```*?`$``````&Q5
+M```*?`$``````"A8```&%0```````"Q8```$%0```````.18```&%@``````
+M`.A8```$%@````````Q:```*3`$``````"1:```&%P```````"A:```$%P``
+M`````#!:```*90$``````(A:```*N@$``````*A:```*#P(``````,!:```*
+M#P(``````.!:```*#`(``````/A:```*#`(``````!1;```*#P(``````"!;
+M```*K0```````#1;```*#P(``````$A;```*#`(``````%A;```*J0$`````
+M`(1;```*J0$``````*A;```*J0$``````/!;```*J0$``````#1<```*J0$`
+M`````,1<```&^@```````,A<```$^@```````,Q>```*J0$``````#A?```*
+M#`(``````%Q?```*#`(``````&Q?```*`@$``````+Q?```*`@$``````*Q@
+M```*#`(``````,!@```*#`(``````-1@```*#`(``````.A@```*#`(`````
+M`/Q@```*#`(``````#1A```&KP```````#AA```$KP```````$AA```&IP$`
+M`````$QA```$IP$``````(QA```*X@$``````,!A```*#`(``````-!A```*
+M#P(``````/!A```*#`(```````AB```*#`(``````%AB```*#P(``````'!B
+M```*#`(``````(1B```*#`(``````)AB```*#`(``````+QB```*#P(`````
+M`-AB```*#`(``````.QB```*#`(``````/QB```*#P(``````#!C```*#`(`
+M`````'AC```*#`(``````*AC```*#P(``````.QC```*#P(``````-1D```*
+M#`(``````$!E```*#`(``````%QE```*#`(``````*QE```*#P(```````AF
+M```*#`(``````!AF```*#`(``````"AF```*#`(``````#AF```*#`(`````
+M`$AF```*#`(``````%AF```*#`(``````&AF```*#`(``````'QF```*#`(`
+M`````#1G```*#`(``````$AG```*#`(``````.QH```*#`(``````/QH```*
+M#`(```````QI```*#`(``````!QI```*#`(``````"QI```*#`(``````$!I
+M```*#`(``````%!I```*[@```````*1I```*90$``````,QI```*90$`````
+M`/1I```&&@```````/AI```$&@````````!J```*90$``````$!J```*#P(`
+M`````%1J```*R````````&QJ```*#P(```````QK```*HP$``````"1K```*
+M\P```````&1K```*#P(``````(QK```*#`(``````,QK```*#P(``````.AK
+M```*#`(``````#!L```*#P(``````%1L```*#`(``````)QL```*#P(`````
+M`.QL```*#P(``````"AM```*#`(``````#AM```*S@$``````'AM```*#P(`
+M`````*AM```*#`(``````-AM```*#P(``````"!N```*#P(``````$QN```*
+M#`(``````*1N```*90$``````-QN```*#`(```````1O```*#`(``````!QO
+M```*#P(``````#1O```*#P(``````$AO```*#`(``````(AO```*#P(`````
+M`)QO```*#P(``````+!O```*#P(```````AP```*#P(``````#AP```*#P(`
+M`````$QP```*#`(``````(AP```*#P(``````*QP```*#P(``````,!P```*
+M#P(```````1Q```*#P(``````%1Q```*#P(``````'!Q```*#P(``````(QQ
+M```*#P(``````*AQ```*#P(``````,1Q```*#P(``````"!R```*HP``````
+M`$1R```*V@$``````%AR```*#`(``````)QR```*#P(``````*AR```*HP``
+M`````.AR```*HP```````!!S```*#P(``````"!S```*V@$``````#QS```*
+M#`(``````(1S```*#P(``````)!S```*HP```````.1S```*#P(``````/AS
+M```*#`(``````!!T```*#P(``````"1T```*#`(``````'AT```*HP``````
+M`*!T```*#P(``````+!T```*V@$``````,QT```*#`(``````!1U```*#P(`
+M`````"!U```*HP```````(!U```*E0$``````,QU```*#`(``````-QU```*
+MF0```````/QU```*M@$``````#1V```*#P(``````$AV```*#`(``````%QV
+M```*#P(``````&QV```*#`(``````*QV```*#P(``````+QV```*#`(`````
+M`,1V```*M`$``````-1V```*#P(``````.1V```*M`$``````/!V```*#P(`
+M``````!W```*#`(``````"1W```*#P(``````#AW```*#`(``````'QW```*
+M#P(``````)!W```*#`(``````*1W```*#P(``````+1W```*#`(``````&QX
+M```*#P(``````)QX```&<`$``````*!X```$<`$``````+!X```&CP``````
+M`+1X```$CP```````,AX```*J`$``````/1X```*#P(``````!QY```*#`(`
+M`````$1Y```*#`(``````'AY```*#`(``````(AY```*#P(``````)QY```*
+MM`$``````.AY```*#P(``````/QY```*#`(``````#!Z```*#P(``````$1Z
+M```*#`(``````(AZ```*#`(``````)QZ```*#`(``````/1Z```*#P(`````
+M`"1[```*#P(``````$![```*#`(``````)Q[```*#P(``````,Q[```*#P(`
+M`````.A[```*#`(``````!Q\```*#P(``````%A\```*#`(``````)Q]```*
+M#P(``````/A]```*#P(``````-A_```*?`$``````""````*#P(``````#"`
+M```*N@$``````'2````*#`(``````)2````*#`(``````.2````*#`(`````
+M``2!```*#`(``````!2!```*#`(``````""!```*#P(``````#"!```*#`(`
+M`````&B!```*#`(``````(B!```*#`(``````)B!```*#`(``````*B!```*
+M#`(``````+B!```*#`(``````,2!```*#P(``````-2!```*#`(``````.2!
+M```*#`(``````/B!```*#P(```````B"```*#`(``````!B"```*#`(`````
+M`"B"```*#`(``````#B"```*#`(``````$B"```*#`(``````%B"```*#`(`
+M`````&B"```*#`(``````'B"```*#`(``````(R"```*#`(``````*""```*
+M#`(``````*R"```*-0$``````,""```*#`(``````-2"```*#`(``````.B"
+M```*#`(``````/R"```*#`(``````!"#```*#`(``````"2#```*#`(`````
+M`#B#```*#`(``````$R#```*#`(``````&"#```*#`(``````'2#```*#`(`
+M`````(B#```*#`(``````)R#```*#`(``````+"#```*#`(``````+B#```&
+M&P```````+R#```$&P```````.R#```*#`(```````2$```*!`(``````""$
+M```*#P(``````$"$```*#`(``````'"$```*#`(``````("$```*#P(`````
+M`*"$```*#`(``````+"$```*#P(``````-"$```*#`(``````."$```*#P(`
+M``````"%```*#`(``````!"%```*#P(``````#"%```*#`(``````(B%```*
+M#`(``````)"%```*M`$``````*"%```*#P(``````+2%```*#`(``````,R%
+M```*R````````-B%```*$P$```````2&```*U0```````"2&```*_0``````
+M`#2&```*#P(``````$B&```*#`(``````%R&```*_@$``````'"&```*B```
+M`````(2&```*EP$``````*"&```*#`(``````"B'```*#P(``````*2'```*
+M#`(``````"R(```*=P$``````%R(```*M`$``````'2(```*M`$``````+B(
+M```*=P$``````/"(```*#`(``````!2)```*M`$``````#B)```*M`$`````
+M`$B)```*=P$``````,")```*?`$``````.")```*#P(``````/2)```*#`(`
+M``````2*```*#P(``````!R*```*#`(``````"2*```*M`$``````#2*```*
+M#P(``````$B*```*#`(``````%"*```*M`$``````'"*```*M`$``````("*
+M```*#P(``````)2*```*#`(``````*2*```*#P(``````+B*```*#P(`````
+M`,R*```*#P(``````.2*```*#`(```````"+```*#`(``````!B+```*#`(`
+M`````""+```*M`$``````#"+```*#P(``````$2+```*#`(``````$R+```*
+MM`$``````&"+```*#`(``````'"+```*#P(``````(2+```*#`(``````(R+
+M```*M`$``````)R+```*#P(``````+"+```*#`(``````,B+```*R```````
+M`-R+```*#`(``````/"+```*#`(```````2,```*#`(``````!",```*$P$`
+M`````"",```*M`$``````"R,```*$P$``````%",```*#P(``````&2,```*
+M#`(``````'B,```*#`(``````/R,```*#`(```````2-```*M`$``````""-
+M```*R````````#R-```*#`(``````#"1```&'0```````#21```$'0``````
+M`/R2```&'@````````"3```$'@````````B3```*90$``````!"3```&'```
+M`````!23```$'````````!R3```*90$``````'23```*K0```````)R3```*
+MK0```````""5```*K0```````#R5```*K0```````%B5```*K0```````(R5
+M```*#`(``````+B5```*#`(``````""6```*K0```````#B6```*#`(`````
+M`$R6```*#`(``````(26```*#P(``````-26```*#P(``````.B6```*#`(`
+M``````"7```*R````````""7```*M`$``````"B7```*T````````-27```*
+MY0$``````!R8```*E`$``````,B8```*GP$```````R9```*/`$``````#B:
+M```*#`(``````%":```*#`(``````&B:```*#`(``````(R:```*#`(`````
+M`*2:```*#`(``````+2:```*#P(``````,R:```*#`(``````/B:```*#`(`
+M`````!";```*#`(``````"B;```*#`(``````$R;```*#`(``````&2;```*
+M#`(``````'2;```*#P(``````(R;```*#`(``````*2;```*#`(``````.R;
+M```*#`(``````$2=```*#P(``````*R=```*#`(``````.2=```*(`$`````
+M`/2=```*S@$```````2>```*#P(``````#">```*S@$``````$B>```*#`(`
+M`````%2>```*S@$``````-">```*#`(``````/B>```*#`(``````$"?```*
+M#P(``````*B?```*#`(``````+B?```*#P(``````,B?```*M`$``````.2?
+M```*#`(```````2@```*R````````)BD```*#`(``````+"D```*#`(`````
+M`,RD```*#P(``````.2D```*K0```````$2E```*3`$``````%RE```&'P``
+M`````&"E```$'P```````&BE```*90$``````+RE```*%0(``````/"E```*
+M#`(```````2F```*#`(```````RF```*M`$``````!BF```*#P(``````$RF
+M```*#P(``````)BF```*#`(``````*"F```*M`$``````-"F```*QP$`````
+M``"G```*#P(``````""G```*QP$``````$RG```*QP$``````+2G```&(@``
+M`````+BG```$(@```````/RG```*]P$``````#2H```*#`(``````#RH```*
+MM`$``````%RH```*#`(``````&2H```*M`$``````)2H```*QP$``````+2H
+M```&40$``````+BH```$40$``````,RH```*_P$``````.2H```*QP$`````
+M`%RI```*Y`$``````+BI```*G`$``````,"I```*`@$```````2J```&`@``
+ML"L```BJ```$`@``L"L```RJ```$`@``L"L``!RJ```&`@``N"L``""J```$
+M`@``N"L``"2J```$`@``N"L``&"J```*#P(``````("J```*#`(``````(RJ
+M```*#P(``````,BJ```*#`(``````-2J```*#P(```````2K```*#`(`````
+M`!BK```*M`$``````.2K```*7`$``````(RL```*QP$```````BM```*#`(`
+M`````!RM```*#`(``````#"M```*#`(``````$2M```*#`(``````%BM```*
+M#`(``````,"M```&KP```````,2M```$KP```````-2M```&IP$``````-BM
+M```$IP$```````2N```*#0(``````#BN```*#`(``````$BN```*#P(`````
+M`&"N```*#`(``````'BN```*#`(``````,BN```*#P(``````-RN```*#`(`
+M`````/"N```*#`(```````2O```*#`(``````"BO```*#P(``````#RO```*
+M#`(``````%"O```*#`(``````&"O```*#P(``````)2O```*#`(``````+RO
+M```*#`(``````,BO```*#P(``````.BO```*#`(``````!BP```*#P(`````
+M`%BP```*#P(``````/2P```*#P(```````2Q```*#P(``````!2Q```*#P(`
+M`````"2Q```*#P(``````#2Q```*#P(``````)RQ```*#`(``````*BQ```*
+M#P(``````""R```*#`(``````#RR```*#`(``````(RR```*#P(``````.BR
+M```*#`(``````/BR```*#`(```````BS```*#`(``````!BS```*#`(`````
+M`"BS```*#`(``````#BS```*#`(``````$BS```*#`(``````%RS```*#`(`
+M`````!2T```*#`(``````"BT```*#`(```````"V```*#`(``````!"V```*
+M#`(``````""V```*#`(``````#"V```*#`(``````$"V```*#`(``````%2V
+M```*#`(``````&2V```*2@$``````+BV```*90$``````."V```*90$`````
+M``BW```&(P````````RW```$(P```````!2W```*90$``````%BW```*#`(`
+M`````&BW```*#`(``````'RW```*R````````)2W```*#P(``````&BX```*
+M80$``````'BX```*#P(``````(RX```*#`(``````)BX```*P`$``````+2X
+M```*M0```````/2X```*#P(``````!"Y```*#`(``````%"Y```*#P(`````
+M`&RY```*#`(``````+2Y```*#P(``````-BY```*#`(``````""Z```*#P(`
+M`````&BZ```*#P(``````)"Z```*#`(``````*"Z```*A0$``````-RZ```*
+M#P(``````/"Z```&)````````/2Z```$)`````````B[```*#`(``````$B[
+M```*90$``````("[```*#`(``````*B[```*#`(``````.B[```*#P(`````
+M`/R[```*#P(``````!"\```*#P(``````&B\```*#P(``````)B\```*#P(`
+M`````*R\```*#`(``````.B\```*#P(```````R]```*#P(``````""]```*
+M#P(``````&2]```*#P(``````-"]```*#P(``````.R]```*#P(```````B^
+M```*#P(``````"2^```*#P(``````$"^```*#P(``````)R^```*HP``````
+M`+R^```*V@$``````,R^```*#`(```````R_```*#P(``````!B_```*HP``
+M`````%B_```*HP```````("_```*#P(``````)"_```*V@$``````*R_```*
+M#`(``````/2_```*#P(```````#````*HP```````%3````*#P(``````&C`
+M```*#`(``````(#````*#P(``````)3````*#`(``````.C````*HP``````
+M`!#!```*#P(``````"#!```*V@$``````#S!```*#`(``````(3!```*#P(`
+M`````)#!```*HP```````-C!```*#P(```````3"```*#P(``````#3"```*
+M#`(``````'3"```*70$``````+C"```*E0$``````/#"```*#`(``````/S"
+M```*F0```````!S#```*M@$``````&##```*#P(``````'##```*#`(`````
+M`'C#```*M`$``````(C#```*#P(``````)C#```*M`$``````*3#```*#P(`
+M`````+3#```*#`(``````-C#```*#P(``````.S#```*#`(``````##$```*
+M#P(``````$3$```*#`(``````%C$```*#P(``````&C$```*#`(``````*C$
+M```*#P(``````+S$```*#`(``````-#$```*#P(``````.#$```*#`(`````
+M`)C%```*#P(``````.C%```&.0$``````.S%```$.0$``````/3%```&AP$`
+M`````/C%```$AP$```````#&```&;`$```````3&```$;`$``````!C&```*
+MJ`$``````$3&```*#P(``````&S&```*#`(``````)3&```*#`(``````,3&
+M```*#`(``````-C&```*R````````!C'```*#P(``````"S'```*#`(`````
+M`&#'```*#P(``````'3'```*#`(``````+C'```*#`(``````,S'```*#`(`
+M`````"3(```*#P(``````%3(```*#P(``````'#(```*#`(``````,S(```*
+M#P(``````/S(```*#P(``````!C)```*#`(``````$S)```*#P(``````'C)
+M```*#`(``````+3*```*#P(```````S-```*?`$``````&#-```*#P(`````
+M`'3-```*#P(``````)C-```*#P(``````+#-```*#P(``````/3-```*#P(`
+M`````!3.```*#P(``````"3.```*#P(``````#S.```*#P(``````$S.```*
+M#P(``````%S.```*%0(``````/3.```*#`(``````$#/```*K0```````%#/
+M```*K0```````%C/```&)P```````%S/```$)P```````)C/```&)P``````
+M`)S/```$)P```````+S/```*#`(``````-S/```&)0```````.#/```$)0``
+M``````#0```*#`(``````!30```&*````````!C0```$*````````#C0```*
+M#`(``````$S0```&)@```````%#0```$)@```````(C0```*#`(``````+#0
+M```*#P(``````,C0```*#`(``````-C0```*#`(``````.S0```*#`(`````
+M`/S0```*#P(``````!#1```*#`(``````"S1```*#`(``````$#1```*#`(`
+M`````&31```*#`(``````'S1```*#`(``````,#1```*#`(``````.31```*
+M#`(``````/S1```*#P(```````S2```*#`(``````!S2```*#`(``````"S2
+M```*#`(``````$#2```*#`(``````'C2```*#`(``````)C2```*#`(`````
+M`*S2```*#`(``````+S2```*#`(``````.#2```*#P(``````/#2```*#`(`
+M`````/S2```*H`$``````"S3```*#P(``````$S3```*#`(``````*33```*
+M#`(``````+C3```*#`(``````,C3```*#P(```````34```*M`$``````!34
+M```*#P(``````"C4```*#`(``````$#4```*R````````$S4```*FP``````
+M`)34```*#`(``````+C4```*#`(``````-34```*C`$``````/34```*#`(`
+M``````35```*#`(``````!35```*#`(``````"#5```*#P(``````##5```*
+M#`(``````$35```*#`(``````%S5```*#P(``````&S5```*#`(``````(#5
+M```*#P(``````)#5```*#`(``````+#5```*SP```````,#5```*#P(`````
+M`-35```*#`(``````.C5```*&0$``````/S5```*4P$``````!#6```*M@``
+M`````"S6```*#`(``````.C6```*U0$``````!37```*M`$``````%C7```*
+MU0$``````,#7```*#`(``````-37```*#`(``````.C7```*#`(``````/#7
+M```*M`$```````C8```*#`(``````"C8```*#`(``````##8```*M`$`````
+M`'38```*#`(``````)38```*#`(``````)S8```*M`$``````+#8```*#`(`
+M`````-#8```*M`$``````.#8```*U0$``````%39```*?`$``````(#9```*
+M#P(``````)S9```*#P(``````+#9```*#P(``````,39```*#P(``````!C:
+M```*#P(``````#C:```*#`(``````'3:```*FP```````(3:```*M`$`````
+M`)#:```*FP```````#C;```*#P(``````$C;```*#`(``````%#;```*M`$`
+M`````&S;```*R````````(C;```*#`(``````-C;```*"`$``````/C;```&
+M*@``Y````/S;```$*@``Y`````S<```*K0```````#S<```*K0```````%S<
+M```*K0```````)#<```*#`(``````*S<```*#`(``````.S<```*#P(`````
+M`$3=```*#P(``````&C=```*#`(``````'C=```*#P(``````(S=```*#`(`
+M`````+#=```*#P(``````,#=```*M`$``````)#>```*#P(``````"#?```*
+M[@$``````$S?```&*P```````%#?```$*P```````*C?```*#P(``````+S?
+M```*#`(``````/3?```&+````````/C?```$+`````````3@```$+```````
+M`"#@```&+````````"3@```$+````````$3A```&*0```````$CA```$*0``
+M`````.#A```&*0```````.3A```$*0```````/SA```*K0```````"3B```*
+MK0```````$#B```*K0```````&#B```*K0```````'SB```*K0```````*3B
+M```&*0```````*CB```$*0```````,CB```*#`(``````"CD```*#`(`````
+M`#SD```*#`(``````,3D```*#P(``````.3D```*#`(``````!SE```*#P(`
+M`````$#E```*#P(``````'#E```*#`(``````(#E```*70$``````)SE```*
+M#`(``````*SE```*#P(``````-CE```*#`(``````.CE```*#P(```````CF
+M```*#`(``````!CF```*#P(``````$3F```*#`(``````'CF```*#`(`````
+M`(CF```*#P(``````*CF```*#`(``````+CF```*#P(``````-CF```*#`(`
+M`````%#G```*#P(``````'#G```*#`(``````-#G```*#`(``````.#H```*
+MD@```````*SI```&+0```````+#I```$+0```````+CI```*GP$``````+SI
+M```&+@```````,#I```$+@```````,CI```*GP$``````,SI```&+0``"```
+M`-#I```$+0``"````-3I```&+0``B````-CI```$+0``B`````3J```&+0``
+M``````CJ```$+0```````##J```&+0```````#3J```$+0```````&CJ```&
+M+0``!@```&SJ```$+0``!@```(CJ```&+0```````(SJ```$+0```````/3J
+M```&+0``!@```/CJ```$+0``!@```'CK```&+@```````'SK```$+@``````
+M`,#K```&+0``!@```,3K```$+0``!@```-SK```&+0```````.#K```$+0``
+M`````&3L```&+@```````&CL```$+@```````+#L```&+@```````+3L```$
+M+@```````.3L```&+@```````.CL```$+@```````!SM```*#`(``````/3M
+M```&+P```````/CM```$+P```````#3N```*D@$``````.CO```&`@``9#D`
+M`.SO```$`@``9#D``/3P```&,````````/CP```$,````````+SQ```*#`(`
+M`````!CR```*#`(``````"3R```*ZP```````$#V```&,0``!````$3V```$
+M,0``!````%#V```&,0``"````%3V```$,0``"````$#W```*#`(``````*CW
+M```*#P(``````'#X```&,0``"````'3X```$,0``"````,#X```&,0``````
+M`,3X```$,0```````,CX```&,0``"````,SX```$,0``"````#CY```&,0``
+M`````#SY```$,0```````&SY```&,0```````'#Y```$,0```````(CY```&
+M,0```````(SY```$,0```````)#Y```&,0``"````)3Y```$,0``"````)CY
+M```&,0```````)SY```$,0```````&3Z```*#P(``````-#Z```*#`(`````
+M`#3[```*<@$``````$3[```*A0$``````%#[```*#P(``````(C[```*A0$`
+M`````*C[```*#`(``````+3[```*A0$```````3\```*Y0$``````$S\```*
+ME`$```````S]```*GP$``````%C]```*X0```````+#]```*#`(``````-#]
+M```*#`(``````-S]```*#P(``````/C]```*#`(``````(C_```*#`(`````
+M`+#_```*#`(``````,#_```*#`(``````-S_```*#`(```````@``0`*#`(`
+M`````!@``0`*#P(``````#P``0`*#`(``````&```0`*#`(``````(0``0`*
+M#`(``````*```0`*#P(``````+```0`*#`(``````-```0`*#P(``````.``
+M`0`*#`(````````!`0`*#P(``````!`!`0`*#`(``````#P!`0`*#P(`````
+M`$P!`0`*#`(``````(`!`0`*#P(``````)`!`0`*#`(``````)0!`0`&IP$`
+M`````)@!`0`$IP$``````)P!`0`&KP```````*`!`0`$KP```````+`!`0`&
+M/@$``````+0!`0`$/@$``````-`!`0`*#`(``````/0!`0`*#`(``````!0"
+M`0`*#P(``````"0"`0`*#`(``````'@#`0`*#P(``````*`#`0`*#`(`````
+M`-`#`0`*#`(``````!`$`0`*#P(``````"0$`0`*#P(``````(@$`0`*#`(`
+M`````)@$`0`*]`$``````*@$`0`*M`$``````,0$`0`*#`(``````#P)`0`*
+M#`(``````%`)`0`*#`(``````&0)`0`*#`(``````'@)`0`*#`(``````(P)
+M`0`*#`(``````*`)`0`*#`(``````+0)`0`*#`(``````,@)`0`*#`(`````
+M`-P)`0`*#`(``````.P)`0`*#`(``````"@*`0`*#`(``````$`*`0`*#`(`
+M`````%P*`0`*#P(``````'0*`0`*K0```````*`*`0`&`@``)$T``*0*`0`$
+M`@``)$T``*@*`0`$`@``)$T``-`*`0`&`@``.$T``-0*`0`$`@``.$T``-@*
+M`0`$`@``.$T````+`0`&`@``3$T```0+`0`$`@``3$T```@+`0`$`@``3$T`
+M`#`+`0`&`@``8$T``#0+`0`$`@``8$T``#@+`0`$`@``8$T``*0+`0`*,0$`
+M``````0,`0`&,@````````@,`0`$,@```````!`,`0`*90$``````(@,`0`&
+M-@```````(P,`0`$-@```````)0,`0`*90$``````,0,`0`&-P```````,@,
+M`0`$-P```````%`-`0`*3`$``````'@-`0`*I````````(P-`0`*``(`````
+M`*`-`0`*#P(``````-0-`0`*"@(``````/0-`0`*#P(``````"@.`0`*F```
+M`````$P.`0`*#P(``````%P.`0`*#`(``````'`.`0`*#`(``````'@.`0`*
+MP0```````)P/`0`*"0(``````,P/`0`*#P(``````!@0`0`*"0(``````#@0
+M`0`*"0(``````&00`0`*"0(``````)@0`0`*"0(```````01`0`&-```````
+M``@1`0`$-`````````P1`0`&-0```````!`1`0`$-0```````%@1`0`*]P$`
+M`````-P1`0`*#`(``````.01`0`*M`$``````.P1`0`*P0````````02`0`*
+M#`(```````P2`0`*M`$``````#02`0`*"0(``````%02`0`*K@$``````(P2
+M`0`*0P$``````,`2`0`*)`$``````.02`0`*!P(``````/02`0`*[`$`````
+M``P3`0`*F0$``````"03`0`*"0(``````*P3`0`*_P`````````4`0`*\```
+M`````"`4`0`*P@```````#`4`0`*``(``````#P4`0`*G`$``````$04`0`*
+M`@$``````(@4`0`&`@``B$T``(P4`0`$`@``B$T``)`4`0`$`@``B$T``*`4
+M`0`&`@``D$T``*04`0`$`@``D$T``*@4`0`$`@``D$T``.04`0`*#P(`````
+M``05`0`*#`(``````!`5`0`*#P(``````$P5`0`*#`(``````%@5`0`*#P(`
+M`````(@5`0`*#`(``````)P5`0`*M`$``````-0:`0`**@$``````.P:`0`&
+M"P(``````/`:`0`$"P(``````/P:`0`&.``````````;`0`$.````````#0;
+M`0`*#`(``````$@;`0`*#`(``````%P;`0`*#`(``````'`;`0`*#`(`````
+M`(@;`0`**@$``````+`;`0`*#`(``````,0;`0`*#`(``````"P<`0`&KP``
+M`````#`<`0`$KP```````$`<`0`&IP$``````$0<`0`$IP$``````'`<`0`*
+M$`$``````*0<`0`*#`(``````+0<`0`*#P(``````,P<`0`*#`(``````.0<
+M`0`*#`(``````#P=`0`*#P(``````%`=`0`*#`(``````&0=`0`*#`(`````
+M`'@=`0`*#`(``````)P=`0`*#P(``````+`=`0`*#`(``````,0=`0`*#`(`
+M`````-0=`0`*#P(```````@>`0`*#`(``````#`>`0`*#`(``````(P>`0`*
+M#`(``````*@>`0`*#`(``````,0>`0`*#`(``````!0?`0`*#`(``````"0?
+M`0`*#`(``````#@?`0`*R````````%`?`0`*#P(``````)@?`0`*#P(`````
+M`+0?`0`*#`(``````/0?`0`*#P(``````!`@`0`*#`(``````%@@`0`*#P(`
+M`````'P@`0`*#`(``````,0@`0`*#P(``````!0A`0`*#P(``````%`A`0`*
+M#`(``````&`A`0`*5`$``````)`A`0`*#P(``````.0A`0`*#P(``````/@A
+M`0`*#P(``````#0B`0`*#P(``````*0B`0`*#P(``````,@B`0`*#P(`````
+M`"0C`0`*#P(``````#0C`0`*#P(``````$0C`0`*#P(``````%0C`0`*#P(`
+M`````&0C`0`*#P(``````-PC`0`*#`(``````.@C`0`*#P(``````*`D`0`*
+M#`(``````*PD`0`*#P(``````,@D`0`*#`(``````.0D`0`*#`(``````#PE
+M`0`*#P(``````+`E`0`*#P(``````,0E`0`*#`(``````-0E`0`*#`(`````
+M`.0E`0`*#`(``````/0E`0`*#`(```````0F`0`*#`(``````!0F`0`*#`(`
+M`````"0F`0`*#`(``````#@F`0`*#`(``````&@F`0`*#`(``````'@F`0`*
+M#`(``````(@F`0`*#`(``````)PF`0`*#`(``````&`G`0`*#`(``````'0G
+M`0`*#`(``````"0H`0`&`@``H$T``"@H`0`$`@``H$T``,0I`0`*#`(`````
+M`-0I`0`*#`(``````.0I`0`*#`(``````/0I`0`*#`(```````0J`0`*#`(`
+M`````!@J`0`*#`(``````"@J`0`*I`$``````.PJ`0`*#`(``````/PJ`0`*
+M#`(```````PK`0`*#`(``````!PK`0`*#`(``````"PK`0`*#`(``````#PK
+M`0`*#`(``````$PK`0`*#`(``````&`K`0`*#`(``````'@K`0`*#`(`````
+M`(PK`0`*#`(``````*@K`0`*#`(``````+@K`0`*#`(``````,@K`0`*#`(`
+M`````-@K`0`*#`(``````.@K`0`*#`(``````/PK`0`*#`(```````PL`0`*
+MI`$``````'`L`0`*90$``````)@L`0`*90$``````,PL`0`*90$``````/PL
+M`0`*90$``````#0M`0`*#`(``````%0M`0`*#`(``````&@N`0`*#P(`````
+M`'PN`0`*#`(``````/0N`0`*#P(```````@O`0`&.0````````PO`0`$.0``
+M`````"`O`0`*#`(``````&`O`0`*90$``````)@O`0`*#`(``````,`O`0`*
+M#`(````````P`0`*#P(``````!0P`0`*#P(``````"@P`0`*#P(``````(`P
+M`0`*#P(``````+0P`0`*#P(``````,PP`0`*#`(``````.`P`0`*#`(`````
+M`'PQ`0`*#P(``````*@Q`0`*#`(``````.@Q`0`*#P(```````PR`0`*#P(`
+M`````"`R`0`*#P(``````&0R`0`*#P(``````-`R`0`*#P(``````.PR`0`*
+M#P(```````@S`0`*#P(``````"0S`0`*#P(``````$`S`0`*#P(``````(0S
+M`0`*#P(``````+`S`0`*#P(``````.`S`0`*#`(``````"`T`0`*C```````
+M`'`T`0`*HP```````)0T`0`*V@$``````*0T`0`*#`(``````.0T`0`*#P(`
+M`````/`T`0`*HP```````#`U`0`*HP```````%@U`0`*#P(``````&@U`0`*
+MV@$``````(0U`0`*#`(``````,PU`0`*#P(``````-@U`0`*HP```````"PV
+M`0`*#P(``````$`V`0`*#`(``````%@V`0`*#P(``````&PV`0`*#`(`````
+M`,`V`0`*HP```````.@V`0`*#P(``````/@V`0`*V@$``````!0W`0`*#`(`
+M`````%PW`0`*#P(``````&@W`0`*HP```````,`W`0`*#`(``````-0W`0`*
+M#`(``````%0X`0`*V@$``````.@X`0`*#`(``````/@X`0`*#`(``````!`Y
+M`0`*#`(``````$`Y`0`*H@```````*`Y`0`*E````````+PY`0`*#`(`````
+M`.@Y`0`*#`(``````/@Y`0`*#P(``````!`Z`0`*#`(``````"0Z`0`*#`(`
+M`````#`Z`0`*#P(``````$`Z`0`*#`(``````)@Z`0`*#`(``````*PZ`0`*
+M#`(``````,`Z`0`*#`(``````-0Z`0`*#`(``````.`Z`0`*#P(````````[
+M`0`*#`(``````!0[`0`*#`(``````"@[`0`*#`(``````#P[`0`*#`(`````
+M`$@[`0`*#P(``````&0[`0`*#P(``````'0[`0`*#`(``````(`[`0`*#P(`
+M`````)`[`0`*#`(``````*0[`0`*#`(``````+@[`0`*#`(``````,P[`0`*
+M#`(``````.`[`0`*#`(``````/0[`0`*#`(``````"`\`0`*#`(``````#`\
+M`0`*#P(``````&`\`0`*#`(``````(P\`0`*E````````*`\`0`*#P(`````
+M`+`\`0`*#`(``````+P\`0`*#P(``````,P\`0`*#`(``````.`\`0`*#`(`
+M`````/`\`0`*#P(``````"`]`0`*#`(``````#0]`0`*#`(``````$@]`0`*
+M#`(``````%P]`0`*#`(``````'`]`0`*#`(``````(0]`0`*#`(``````+`]
+M`0`*#`(``````-`]`0`&.@```````-0]`0`$.@```````.`]`0`$.@``````
+M`/P]`0`&.@`````````^`0`$.@```````#P^`0`&`@``!$X``$`^`0`$`@``
+M!$X``#0_`0`*#P(``````'!``0`*!@$``````(A``0`&`@``?$X``(Q``0`$
+M`@``?$X``-Q``0`*E0$``````"Q!`0`&`@``M$X``#!!`0`$`@``M$X``+1!
+M`0`*#P(``````.A!`0`*#`(``````(Q"`0`&.P```````)!"`0`$.P``````
+M`)Q"`0`*'0$``````.!"`0`*F0````````A#`0`*M@$``````$Q#`0`*#P(`
+M`````%Q#`0`*#`(``````&1#`0`*M`$``````'1#`0`*#P(``````(1#`0`*
+MM`$``````)!#`0`*#P(``````*!#`0`*#`(``````,1#`0`*#P(``````-A#
+M`0`*#`(``````!Q$`0`*#P(``````#!$`0`*#`(``````$1$`0`*#P(`````
+M`%A$`0`*#`(``````)A$`0`*#P(``````*Q$`0`*#`(``````,!$`0`*#P(`
+M`````-1$`0`*#`(``````(Q%`0`*#P(``````!Q&`0`&J@```````"!&`0`$
+MJ@```````%!&`0`&*`$``````%1&`0`$*`$``````%Q&`0`&R@$``````&!&
+M`0`$R@$``````&A&`0`&3@$``````&Q&`0`$3@$``````'1&`0`&DP``````
+M`'A&`0`$DP```````(!&`0`&UP$``````(1&`0`$UP$``````(Q&`0`&50$`
+M`````)!&`0`$50$``````)A&`0`&8`$``````)Q&`0`$8`$``````+!&`0`*
+MJ`$``````-Q&`0`*#P(```````1'`0`*#`(``````"Q'`0`*#`(``````%Q'
+M`0`*#`(``````'!'`0`*R````````+!'`0`*#P(``````,1'`0`*#`(`````
+M`,Q'`0`*K@```````-A'`0`*60$```````Q(`0`*#P(``````"!(`0`*#`(`
+M`````"A(`0`*`0$``````&Q(`0`*#`(``````(!(`0`*#`(``````-A(`0`*
+M#P(```````A)`0`*#P(``````"1)`0`*#`(``````(!)`0`*#P(``````+!)
+M`0`*#P(``````,Q)`0`*#`(```````Q*`0`*#P(``````"!*`0`*#P(`````
+M`(1*`0`*#`(``````+1*`0`*#`(``````,A*`0`*#P(``````-Q*`0`*#P(`
+M`````.Q*`0`*#`(```````A,`0`*#P(``````'1-`0`*#@$``````*!.`0`*
+M``(``````+A.`0`*?`$```````1/`0`*#P(``````!1/`0`*1P$``````"!/
+M`0`*60$``````*Q/`0`*B0```````,A/`0`*#P(``````.A/`0`*#P(`````
+M`/A/`0`*#P(``````!!0`0`*#P(``````"!0`0`*#P(``````#!0`0`*W```
+M`````#A0`0`*R@```````$10`0`*"@(``````/Q0`0`*#`(```````11`0`&
+M/`````````A1`0`$/````````"A1`0`*#`(``````#Q1`0`*M`$``````%!1
+M`0`&/0```````%11`0`$/0```````*11`0`*#`(``````+A1`0`*M`$`````
+M``!2`0`*D`$``````"12`0`*#`(``````,12`0`*#`(``````-12`0`*#P(`
+M`````.A2`0`*#`(``````/A2`0`*#P(``````!!3`0`*#`(``````"13`0`*
+M#`(``````$13`0`*#`(``````%A3`0`*#`(``````+13`0`*#P(``````-!3
+M`0`*#`(``````.!3`0`*UP````````A4`0`*OP$``````(A4`0`*%`$`````
+M`)14`0`*A`$``````*!4`0`*P@$``````,14`0`*#`(``````/Q4`0`*#`(`
+M`````"Q5`0`*#`(``````#A5`0`*H@```````'!5`0`*#`(``````)!5`0`*
+M#`(``````)Q5`0`*#P(``````*Q5`0`*#`(``````+Q5`0`*#`(``````,Q5
+M`0`*#`(``````.!5`0`*#`(``````!A6`0`*#`(``````#A6`0`*#`(`````
+M`$Q6`0`*#`(``````%Q6`0`*#`(``````&A6`0`*+@$``````(16`0`*L0``
+M`````)!6`0`*VP```````.16`0`*#P(```````!7`0`*#`(``````!!7`0`*
+M#P(``````%Q7`0`*#`(``````)!7`0`*M`$``````*!7`0`*#P(``````+A7
+M`0`*#`(``````,A7`0`*M`$``````.A7`0`*#P(```````18`0`*#`(`````
+M`!18`0`*#P(``````"A8`0`*#`(``````%18`0`*#P(``````&A8`0`*#`(`
+M`````'A8`0`*#P(``````(Q8`0`*#`(``````*18`0`*S````````,!8`0`*
+M#`(``````/!8`0`*"0$``````#!9`0`*#`(``````#Q9`0`*#P(``````$Q9
+M`0`*#`(``````&!9`0`*-@$``````'A9`0`*R````````(19`0`*&`$`````
+M`)19`0`*#P(``````*A9`0`*#`(``````.!9`0`*#`(``````/19`0`*#`(`
+M``````A:`0`*#`(``````#!:`0`*D@$``````$A;`0`*#`(``````&1;`0`*
+M#`(``````'A;`0`*P````````(Q;`0`*JP```````*!;`0`*Q````````+Q;
+M`0`*#`(``````"1<`0`*QP```````#A<`0`*V`$``````.!<`0`*#P(`````
+M`/Q<`0`*#`(``````!Q=`0`*#P(``````#1=`0`*#P(``````$A=`0`*#`(`
+M`````,Q=`0`*?`$``````.Q=`0`*%P(``````#!>`0`*#`(``````$1>`0`*
+M#P(``````%1>`0`*M`$``````'A>`0`*+@$``````)1>`0`*#P(``````-!>
+M`0`*M`$``````.!>`0`*UP````````!?`0`*#`(``````%A?`0`*%`$`````
+M`&1?`0`*A`$``````'1?`0`*#P(``````(A?`0`*#`(``````.1?`0`*QP``
+M`````/A?`0`*V`$``````%!@`0`*#P(``````)1@`0`*#`(``````*!@`0`*
+M#P(``````+Q@`0`*#`(``````,A@`0`*#P(``````.Q@`0`*#`(``````$AA
+M`0`*``(``````,QA`0`*``(``````(!C`0`*#P(``````+!C`0`*#`(`````
+M`,1C`0`*#`(``````.!C`0`*#`(``````.AC`0`*M`$```````AD`0`*#`(`
+M`````!!D`0`*M`$``````"1D`0`*#`(``````#AD`0`*#`(``````+!D`0`*
+M?`$```````1E`0`*#P(``````"AE`0`*#P(``````#QE`0`*#P(``````%!E
+M`0`*#P(``````'QE`0`*#P(``````)!E`0`*#`(``````"QF`0`*#P(`````
+M`$AF`0`*#`(``````%AF`0`*#P(``````'1F`0`*#`(``````(1F`0`*#P(`
+M`````)AF`0`*#`(``````.QF`0`*#P(```````!G`0`*#`(``````!!G`0`*
+M#P(``````"1G`0`*#`(``````#AG`0`*1P$``````%1G`0`*#P(``````&AG
+M`0`*#`(``````)AH`0`*#P(``````*AH`0`*#`(``````+!H`0`*M`$`````
+M`,QH`0`*R````````.AH`0`*#`(``````/AH`0`*``(```````QI`0`*#P(`
+M`````$1I`0`*#P(``````.1I`0`*#P(``````/AI`0`*Y@```````(QJ`0`*
+M#`(``````)QJ`0`*#`(``````*AJ`0`*#P(``````+AJ`0`*#`(``````,QJ
+M`0`*#`(``````-QJ`0`*#`(``````/!J`0`*#`(```````1K`0`*#`(`````
+M`-QK`0`*K0```````!AM`0`*#P(``````#!M`0`*#P(``````$1M`0`*#`(`
+M`````%QM`0`*#`(``````'!M`0`*#`(``````%1O`0`*#P(``````'AO`0`*
+M#`(``````*1O`0`*#P(``````-1O`0`*#`(``````.1O`0`*C`````````!P
+M`0`*#`(``````(QP`0`*#P(``````*AP`0`*#`(``````+AP`0`*#P(`````
+M`-1P`0`*#`(``````.1P`0`*#P(```````!Q`0`*#`(``````!!Q`0`*#P(`
+M`````"QQ`0`*#`(``````&AQ`0`*#`(``````'AQ`0`*#P(``````)AQ`0`*
+M#`(``````*AQ`0`*#P(``````,AQ`0`*#`(```````1R`0`*00$``````"QR
+M`0`*#P(``````$AR`0`*#`(``````(QR`0`*#P(``````*AR`0`*#`(`````
+M`+AR`0`*#P(``````-1R`0`*#`(``````.1R`0`*#P(``````/AR`0`*#`(`
+M`````"QS`0`*#P(``````$AS`0`*#`(``````&AS`0`*#`(``````!1T`0`&
+M`@``I%<``!AT`0`$`@``I%<``!QT`0`$`@``I%<``#QT`0`&`@``K%<``$!T
+M`0`$`@``K%<``$1T`0`$`@``K%<``#1U`0`*#P(``````$QU`0`*#P(`````
+M`&!U`0`*#`(``````'!U`0`*#P(``````(1U`0`*#`(``````)AU`0`*#`(`
+M`````*QU`0`*#`(``````+QU`0`*#P(``````-!U`0`*#`(``````.1U`0`*
+M#`(``````/1U`0`*#P(```````AV`0`*#`(``````!QV`0`*#`(``````#!V
+M`0`*#`(``````$1V`0`*#`(``````%1V`0`*#P(``````&AV`0`*#`(`````
+M`'QV`0`*#`(``````)!V`0`*#`(``````*1V`0`*#`(``````+1V`0`*#P(`
+M`````/!X`0`*#P(```````1Y`0`*#`(``````!1Y`0`*#P(``````"AY`0`*
+M#`(``````$AY`0`*#`(``````%QY`0`*#`(``````&QY`0`*#P(``````(QY
+M`0`*#`(``````*!Y`0`*#`(``````+!Y`0`*#P(``````-!Y`0`*#`(`````
+M`.1Y`0`*#`(``````/AY`0`*#`(```````QZ`0`*#`(``````!QZ`0`*#P(`
+M`````#QZ`0`*#`(``````%!Z`0`*#`(``````&1Z`0`*#`(``````'AZ`0`*
+M#`(``````(AZ`0`*#P(``````*AZ`0`*#`(``````(Q[`0`*#P(``````*A[
+M`0`*#`(``````+A[`0`*#P(``````-1[`0`*#`(``````"!\`0`*UP``````
+M`&A\`0`*GP$``````'1\`0`*GP$``````+Q\`0`&/@```````,!\`0`$/@``
+M`````&1^`0`*#`(``````*Q^`0`*#`(``````.A^`0`*#`(``````"1_`0`*
+M#`(``````&!_`0`*#`(``````(1_`0`*#`(``````$B``0`*D@```````+2!
+M`0`*D@$``````.2%`0`&/P```````.B%`0`$/P```````-R&`0`*90$`````
+M`*R(`0`*U`$``````#R*`0`*U`$```````R,`0`&00``!````!",`0`$00``
+M!````!R,`0`&00``"````"",`0`$00``"````$2,`0`&0```!````$B,`0`$
+M0```!````%2,`0`&0```"````%B,`0`$0```"````/"-`0`*#`(``````&".
+M`0`*#P(``````)B/`0`&00```````)R/`0`$00```````*B/`0`&0```````
+M`*R/`0`$0````````"22`0`*K0```````#B3`0`*V0```````'"3`0`*Y0``
+M`````(R3`0`*#`(``````+23`0`*V0````````B4`0`*Y0```````!B4`0`*
+M#`(``````$24`0`*Y0```````%24`0`*#`(``````+B4`0`*#P(``````!B5
+M`0`*#`(``````"B5`0`*#`(``````#B5`0`*#`(``````$25`0`*#P(`````
+M`%R5`0`*#`(``````+"5`0`*5`$``````,"5`0`*#P(```````B6`0`*#`(`
+M`````!26`0`*5`$``````'26`0`*Y0$``````,"6`0`*E`$```````28`0`*
+MGP$``````%B8`0`*U````````+B8`0`*#`(``````-B8`0`*#`(``````.28
+M`0`*#P(```````"9`0`*#`(``````)R:`0`*#`(``````,2:`0`*#`(`````
+M`/2:`0`*#`(``````"R;`0`*#`(``````%2;`0`*#`(``````%B<`0`&IP$`
+M`````%R<`0`$IP$``````&"<`0`&KP```````&2<`0`$KP```````'2<`0`&
+M/@$``````'B<`0`$/@$``````)2<`0`*#`(``````,"<`0`*#`(``````-2<
+M`0`*#`(``````/2<`0`*#`(```````2=`0`*#`(``````!2=`0`*#`(`````
+M`""=`0`*#P(``````#"=`0`*#`(``````(R>`0`*#P(``````+2>`0`*#`(`
+M`````.2>`0`*#`(``````"2?`0`*#P(``````#B?`0`*#P(``````*2?`0`*
+M#`(``````+2?`0`*%P(``````,2?`0`*M`$``````-B?`0`*%P(``````#B@
+M`0`*#P(``````%2@`0`*#`(``````'"@`0`*#`(``````("@`0`*#P(`````
+M`*B@`0`*#P(``````+R@`0`*#`(``````,2@`0`*M`$``````-2@`0`*#P(`
+M`````.B@`0`*#`(```````"A`0`*M`$```````RA`0`*%P(``````"2A`0`*
+M#P(``````#BA`0`*#`(``````$BA`0`*#`(``````)BJ`0`*`0(``````*RJ
+M`0`*#`(``````,"J`0`*#`(``````-"J`0`*#`(``````.2J`0`*#`(`````
+M`/BJ`0`*#`(``````"RK`0`*#`(``````#BK`0`*`0(``````$RK`0`*#`(`
+M`````&"K`0`*#`(```````BL`0`*`0(``````&RL`0`*GP$``````$RM`0`*
+M#`(``````&"M`0`*#`(``````&BM`0`*K@```````-RM`0`*`0$``````/"M
+M`0`*#`(```````2N`0`*#`(``````%2N`0`&`@``#%L``%BN`0`$`@``#%L`
+M`(RN`0`*#P(``````+2N`0`*#`(``````,2N`0`*#P(``````.2N`0`*#`(`
+M`````/2N`0`*#P(``````!2O`0`*#`(``````"2O`0`*#P(``````$2O`0`*
+M#`(``````(2O`0`&`@``J%H``(BO`0`$`@``J%H``(RO`0`$`@``J%H``)RO
+M`0`&`@``L%H``*"O`0`$`@``L%H``*2O`0`$`@``L%H``+2O`0`&`@``N%H`
+M`+BO`0`$`@``N%H``+RO`0`$`@``N%H``,RO`0`&`@``P%H``-"O`0`$`@``
+MP%H``-2O`0`$`@``P%H``.2O`0`&`@``R%H``.BO`0`$`@``R%H``.RO`0`$
+M`@``R%H``/RO`0`&`@``T%H```"P`0`$`@``T%H```2P`0`$`@``T%H``"BP
+M`0`*#P(``````%2P`0`*#`(``````&2P`0`*#P(``````(2P`0`*#`(`````
+M`)2P`0`*#P(``````+2P`0`*#`(``````,2P`0`*#P(``````.2P`0`*#`(`
+M`````/2P`0`*#P(``````!2Q`0`*#`(``````"2Q`0`*#P(``````$2Q`0`*
+M#`(``````%RQ`0`*#P(``````'2Q`0`*#P(``````(BQ`0`*#`(``````-"Q
+M`0`&`@``V%H``-2Q`0`$`@``V%H``-BQ`0`$`@``V%H``/RQ`0`*#P(`````
+M`"2R`0`*#`(``````&"R`0`&`@``X%H``&2R`0`$`@``X%H``&BR`0`$`@``
+MX%H``)RR`0`*#P(``````,2R`0`*#`(```````2S`0`&`@``[%H```BS`0`$
+M`@``[%H```RS`0`$`@``[%H``&BS`0`*#P(``````)"S`0`*#`(``````.BS
+M`0`*\````````/"S`0`*\`$``````/RS`0`*6`$``````""T`0`*\`$`````
+M`"RT`0`*6`$``````$"T`0`*#`(``````%2T`0`*#`(``````%RT`0`*K@``
+M`````&BT`0`*\`$``````'2T`0`*6`$``````$2U`0`*#`(``````%BU`0`*
+M#`(``````&RU`0`*#`(``````("U`0`*#`(``````(RU`0`*`0(``````&"V
+M`0`*'0$``````)2V`0`*'0$``````+BV`0`*G0$``````."V`0`*'0$`````
+M`/RV`0`*'0$``````*RW`0`*G0$``````-2W`0`*'0$``````'BX`0`*'0$`
+M`````(BX`0`*'0$``````)BX`0`*'0$``````*BX`0`*'0$``````+BX`0`*
+M'0$``````,"X`0`*\`$``````,RX`0`*6`$```````"Y`0`*'0$``````!"Y
+M`0`*'0$``````"BY`0`*'0$``````#BY`0`*'0$``````%BY`0`*'0$`````
+M`&BY`0`*'0$``````'BY`0`*'0$``````(BY`0`*'0$``````)BY`0`*'0$`
+M`````*RY`0`*\`$``````+BY`0`*6`$``````-2Y`0`*#`(``````.BY`0`*
+M#`(``````/RY`0`*\`$```````BZ`0`*6`$``````&"Z`0`*#`(``````'2Z
+M`0`*#`(``````("Z`0`*`0(``````*BZ`0`*#P(``````+RZ`0`*#P(`````
+M`,2\`0`*'0$``````/R\`0`*#P(``````!"]`0`*#P(``````"2]`0`*#P(`
+M`````$B^`0`*`0(``````%B^`0`*#P(``````&R^`0`*#P(``````*2^`0`*
+M#`(``````+B^`0`*#`(``````-2^`0`*#`(``````.B^`0`*#`(``````,C`
+M`0`&0@```````,S``0`$0@```````.S``0`*#`(```````#!`0`*M`$`````
+M`!3!`0`&0P```````!C!`0`$0P```````##!`0`*#`(``````$3!`0`*M`$`
+M`````%C!`0`&10```````%S!`0`$10```````'S!`0`*#`(``````)#!`0`*
+MM`$``````/3!`0`*"`$``````!3"`0`&3```Y````!C"`0`$3```Y````"C"
+M`0`*K0```````$S"`0`*#P(``````'#"`0`*#`(``````(S"`0`*K0``````
+M`*S"`0`*K0```````.#"`0`*#`(``````/S"`0`*#`(``````#3#`0`&`@``
+M"&@``#C#`0`$`@``"&@``/C$`0`&1````````/S$`0`$1````````$#%`0`*
+M]@```````%C%`0`*]@```````&#%`0`&1````````&3%`0`$1````````(#%
+M`0`*#`(``````)3%`0`*M`$``````*C%`0`&1@```````*S%`0`$1@``````
+M`,3%`0`*#`(``````-C%`0`*M`$``````.C%`0`&1P```````.S%`0`$1P``
+M``````S&`0`*#`(``````"#&`0`*M`$``````##&`0`&2````````#3&`0`$
+M2````````%3&`0`*#`(``````&C&`0`*M`$``````'S&`0`&20```````(#&
+M`0`$20```````,S&`0`*]@```````.3&`0`*]@```````/S&`0`*]@``````
+M`!3'`0`*]@```````"S'`0`*]@```````$3'`0`*]@```````$S'`0`&20``
+M`````%#'`0`$20```````&S'`0`*#`(``````(#'`0`*M`$``````)C'`0`&
+M2@```````)S'`0`$2@```````-C'`0`*]@```````/#'`0`*]@```````#C(
+M`0`*]@```````%#(`0`*]@```````&C(`0`*]@```````'#(`0`&2@``````
+M`'3(`0`$2@```````)#(`0`*#`(``````*3(`0`*M`$``````&#*`0`*GP$`
+M`````-S-`0`*U`$``````*S/`0`*U`$``````.#/`0`*`@$``````/C/`0`*
+M`@$``````"C0`0`&4P```````"S0`0`$4P```````#C0`0`$4P```````%30
+M`0`&4P```````%C0`0`$4P```````(C0`0`*3`$``````*30`0`*3`$`````
+M`,30`0`&40```````,C0`0`$40```````-#0`0`&2P```````-30`0`$2P``
+M`````-S0`0`&3@```````.#0`0`$3@```````.C0`0`&30```````.S0`0`$
+M30```````/30`0`&3P```````/C0`0`$3P````````#1`0`&4`````````31
+M`0`$4`````````S1`0`&4@```````!#1`0`$4@```````!C1`0`&5```````
+M`!S1`0`$5````````'C1`0`&50```````'S1`0`$50```````)S1`0`*#`(`
+M`````+#1`0`*M`$``````,31`0`&5@```````,C1`0`$5@```````.#1`0`*
+M#`(``````/31`0`*M`$```````C2`0`&5P````````S2`0`$5P```````"S2
+M`0`*#`(``````$#2`0`*M`$``````%33`0`*K0```````&C3`0`*#P(`````
+M`(S3`0`*#`(``````/C3`0`*K0```````%S4`0`*K0```````+C4`0`*K0``
+M`````!35`0`*K0```````"35`0`*K0```````%35`0`*#`(``````&C5`0`*
+M#`(``````*C5`0`&`@``+'0``*S5`0`$`@``+'0``$S7`0`&6````````%#7
+M`0`$6````````'37`0`&60```````'C7`0`$60```````*37`0`&6@``````
+M`*C7`0`$6@```````-37`0`&6P```````-C7`0`$6P```````!C8`0`*]@``
+M`````##8`0`*]@```````$C8`0`*]@```````'#8`0`*]@```````(S8`0`*
+M]@```````*C8`0`*]@```````,38`0`*]@```````.#8`0`*]@```````/S8
+M`0`*]@```````"39`0`*]@```````%39`0`*]@```````&S9`0`*]@``````
+M`,S9`0`*]@```````.39`0`*]@```````/S9`0`*]@```````!3:`0`*]@``
+M`````#S:`0`*]@```````%3:`0`*]@```````&S:`0`*]@```````(3:`0`*
+M]@```````)S:`0`*]@```````*3:`0`&7````````*C:`0`$7````````/C:
+M`0`*]@```````!#;`0`*]@```````%S;`0`*]@```````'3;`0`*]@``````
+M`'S;`0`&6````````(#;`0`$6````````)C;`0`*#`(``````*S;`0`*M`$`
+M`````+S;`0`&60```````,#;`0`$60```````-S;`0`*#`(``````/#;`0`*
+MM`$```````#<`0`&6@````````3<`0`$6@```````"#<`0`*#`(``````#3<
+M`0`*M`$``````$3<`0`&6P```````$C<`0`$6P```````&3<`0`*#`(`````
+M`'C<`0`*M`$``````(S<`0`&7````````)#<`0`$7````````*S<`0`*#`(`
+M`````,#<`0`*M`$``````$S?`0`*90$``````&#?`0`*90$``````+3?`0`*
+M90$``````,C?`0`*90$```````#@`0`*90$``````"3@`0`*90$``````#C@
+M`0`*90$``````'3@`0`*90$``````&#G`0`*`@$``````'CG`0`*`@$`````
+M`%3K`0`*3`$``````'#K`0`*3`$``````)CK`0`&8@```````)SK`0`$8@``
+M`````*3K`0`&70```````*CK`0`$70```````+#K`0`&7P```````+3K`0`$
+M7P```````+SK`0`&7@```````,#K`0`$7@```````,CK`0`&8````````,SK
+M`0`$8````````-3K`0`&80```````-CK`0`$80```````.#K`0`&8P``````
+M`.3K`0`$8P```````.SK`0`&GP```````/#K`0`$GP```````$SL`0`&9```
+M`````%#L`0`$9````````'#L`0`*#`(``````(3L`0`*M`$``````)CL`0`&
+M90```````)SL`0`$90```````+3L`0`*#`(``````,CL`0`*M`$``````-SL
+M`0`&9@```````.#L`0`$9@````````#M`0`*#`(``````!3M`0`*M`$`````
+M`"CN`0`*K0```````#SN`0`*#P(``````&#N`0`*#`(``````,SN`0`*K0``
+M`````##O`0`*K0```````(SO`0`*K0```````.CO`0`*K0```````/CO`0`*
+MK0```````"CP`0`*#`(``````#SP`0`*#`(``````/SP`0`&9P````````#Q
+M`0`$9P```````"3Q`0`&:````````"CQ`0`$:````````%3Q`0`&:0``````
+M`%CQ`0`$:0```````(3Q`0`&:@```````(CQ`0`$:@```````,CQ`0`*]@``
+M`````.#Q`0`*]@```````.CQ`0`&:P```````.SQ`0`$:P```````!SR`0`&
+M9P```````"#R`0`$9P```````#CR`0`*#`(``````$SR`0`*M`$``````%SR
+M`0`&:````````&#R`0`$:````````'SR`0`*#`(``````)#R`0`*M`$`````
+M`*#R`0`&:0```````*3R`0`$:0```````,#R`0`*#`(``````-3R`0`*M`$`
+M`````.3R`0`&:@```````.CR`0`$:@````````3S`0`*#`(``````!CS`0`*
+MM`$``````"SS`0`&:P```````##S`0`$:P```````$SS`0`*#`(``````&#S
+M`0`*M`$``````+3S`0`&`@``+(```+CS`0`$`@``+(```,#[`0`*#P(`````
+M`/C[`0`*#P(``````!S\`0`*#`(``````(#\`0`*#`(``````-#\`0`*#`(`
+M`````"3]`0`*`@$``````#S]`0`*`@$``````%3]`0`*`@$``````$0!`@`*
+M3`$``````&`!`@`*3`$``````'0!`@`*3`$``````)0!`@`&<0```````)@!
+M`@`$<0```````*`!`@`&;````````*0!`@`$;````````*P!`@`&;P``````
+M`+`!`@`$;P```````+@!`@`&;0```````+P!`@`$;0```````,0!`@`&;@``
+M`````,@!`@`$;@```````-`!`@`&<````````-0!`@`$<````````-P!`@`&
+M<@```````.`!`@`$<@```````.@!`@`&GP```````.P!`@`$GP```````$@"
+M`@`&<P```````$P"`@`$<P```````&P"`@`*#`(``````(`"`@`*M`$`````
+M`)0"`@`&=````````)@"`@`$=````````+`"`@`*#`(``````,0"`@`*M`$`
+M`````-@"`@`&=0```````-P"`@`$=0```````/P"`@`*#`(``````!`#`@`*
+MM`$``````"0$`@`*K0```````#@$`@`*#P(``````%P$`@`*#`(``````,@$
+M`@`*K0```````,0%`@`*K0```````-0%`@`*K0````````0&`@`*#`(`````
+M`!@&`@`*#`(``````&0'`@`&=@```````&@'`@`$=@```````(P'`@`&=P``
+M`````)`'`@`$=P```````+P'`@`&>````````,`'`@`$>````````.P'`@`&
+M>0```````/`'`@`$>0```````$`(`@`*]@```````%@(`@`*]@```````'`(
+M`@`*]@```````)P(`@`*K0```````-`(`@`*]@```````.@(`@`*]@``````
+M`/`(`@`&>@```````/0(`@`$>@```````"0)`@`&=@```````"@)`@`$=@``
+M`````$`)`@`*#`(``````%0)`@`*M`$``````&0)`@`&=P```````&@)`@`$
+M=P```````(0)`@`*#`(``````)@)`@`*M`$``````*@)`@`&>````````*P)
+M`@`$>````````,@)`@`*#`(``````-P)`@`*M`$``````.P)`@`&>0``````
+M`/`)`@`$>0````````P*`@`*#`(``````"`*`@`*M`$``````#0*`@`&>@``
+M`````#@*`@`$>@```````%0*`@`*#`(``````&@*`@`*M`$``````,`*`@`&
+M`@``%(X``,0*`@`$`@``%(X``,P2`@`*#P(```````03`@`*#P(``````"@3
+M`@`*#`(``````(P3`@`*#`(``````-P3`@`*#`(``````#`4`@`*`@$`````
+M`$@4`@`*`@$``````&`4`@`*`@$``````%`8`@`*3`$``````&P8`@`*3`$`
+M`````(`8`@`*3`$``````*`8`@`&@````````*08`@`$@````````*P8`@`&
+M>P```````+`8`@`$>P```````+@8`@`&?@```````+P8`@`$?@```````,08
+M`@`&?````````,@8`@`$?````````-`8`@`&?0```````-08`@`$?0``````
+M`-P8`@`&?P```````.`8`@`$?P```````.@8`@`&@0```````.P8`@`$@0``
+M`````/08`@`&GP```````/@8`@`$GP````````@````:`0``%`D```P````:
+M`0``3`H``!`````:`0``4`H``!0````:`0``5`H``!@````:`0``+`D``!P`
+M```:`0``7`H``"`````:`0``2`D``"0````:`0``5`D``"@````:`0``H`H`
+M`"P````:`0``9`D``#`````:`0``=`D``#0````:`0``N`D``#@````:`0``
+ME`D``#P````:`0``I`D``$`````:`0``N`D``$0````:`0``T`D``$@````:
+M`0``P`H``$P````:`0``Q`H``%`````:`0``'`H``%0````:`0``+`H``%@`
+M```:`0``F`H``%P````:`0``0`H``&`````:`0``H`H``&0````:`0``5`H`
+M`&@````:`0``9`H``&P````:`0``=`H``'`````:`0``Z`H``'0````:`0``
+M[`H``'@````:`0``N`H``'P````:`0``]`H``(`````:`0``R`H``(0````:
+M`0``_`H``(@````:`0````L``(P````:`0``!`L``)`````:`0``^`H``%`!
+M```!BP$``````%0!```!XP```````%@!```!/P$``````%P!```!,@$`````
+M`&`!```!^0$``````&0!```!4@$``````&@!```!T@```````&P!```!7@$`
+M`````'`!```!'P$``````'0!```!]@$``````'@!```!R0$``````'P!```!
+M/`$``````(`!```!O````````(0!```!`P$``````(@!```!U0```````(P!
+M```!G@```````)`!```!YP$``````)0!```!$@(``````)@!```!K```````
+M`)P!```!"P$``````*`!```!Q@$``````*0!```!IP```````*@!```!N@``
+M`````*P!```!YP```````+`!```!_0$``````+0!```!^`$``````+@!```!
+MF`$``````+P!```!,P$``````,`!```!W@$``````,0!```!X0$``````,@!
+M```!B`$``````,P!```!6P$``````-`!```!NP$``````-0!```!#P$`````
+M`-@!```!\0$``````-P!```!/0$``````.`!```!-0$``````.0!```!!`$`
+M`````.@!```!+0$``````.P!```!TP```````/`!```!1@$``````/0!```!
+MMP$``````/@!```!C0$``````/P!```!(P$````````"```!L@$```````0"
+M```!:`$```````@"```!VP$```````P"```!RP$``````!`"```!J@$`````
+M`!0"```!L````````!@"```!-`$``````!P"```!V0$``````"`"```!F@$`
+M`````"0"```!HP$``````"@"```!NP```````"P"```!\P```````#`"```!
+MPP$``````#0"```!8P$``````#@"```!S0```````#P"```!M````````$`"
+M```!"@$``````$0"```!A@```````$@"```!=`$``````$P"```!O`$`````
+M`%`"```!LP$``````%0"```!=0$``````%@"```!_@$``````%P"```!Z```
+M`````&`"```!B````````&0"```!XP$``````&@"```!*P$``````&P"```!
+MC@$``````'`"```!EP$``````'0"```![0$``````'@"```!L0$``````'P"
+M```!)0$``````(`"```!PP```````(0"```!K`$``````(@"```!D0``````
+M`(P"```!.@$``````)`"```![@```````)0"```!=P$``````)@"```!>0$`
+M`````)P"```!T`$``````*`"```!X@$``````*0"```!_`$``````*@"```!
+MC0```````*P"```!S0$``````+`"```!H0$``````+0"```!B@$``````+@"
+M```!(`$``````+P"```!S@$``````,`"```!&````````,0"```!$`(`````
+M`,@"```!J0$``````-`"```!V0$``````-0"```!F@$``````-@"```!HP$`
+M`````-P"```!NP```````.`"```!\P```````.0"```!&0```````&`9```!
+MQ`$``````&09```!Y`$``````&@9```!U@$``````&P9```!^P$``````'`9
+M```!X@```````'09```!]````````'@9```!$@$``````'P9```!ZP``````
+M`(`9```!BP```````(09```!LP```````(@9```!X````````(P9```!X0``
+M`````)`9```!MP```````)09```!Z@$``````)@9```!C`$``````)P9```!
+M!@(``````*`9```!``$``````*09```!]`$``````*@9```!@0$``````*P9
+M```!*0$``````+`9```!I@$``````+09```!H````````+@9```!A@$`````
+M`+P9```!EP```````,`9```!Y@$``````,09```!9@$``````,@9```!G0``
+M`````,P9```!J````````-`9```!+`$``````-09```!^@$``````-@9```!
+MZ`$``````-P9```!]0$``````.`9```!N`$``````.09```!<0$``````.@9
+M```!?@$``````.P9```!;0$``````/`9```!D0$``````/09```!_```````
+M`/@9```!%P$``````/P9```!\@`````````:```!R`$```````0:```!'@$`
+M``````@:```!O@````````P:```!N0$``````!`:```!M0$``````!0:```!
+M^````````!@:```!N````````!P:```!S`$``````"`:```!7`$``````"0:
+M```!K0$``````"@:```!8@$``````"P:```!0@$``````#`:```!80$`````
+M`#0:```!P`$``````#@:```!30$``````#P:```!M0```````$`:```!WP``
+M`````$0:```!5P$``````$@:```!Q0$``````$P:```!TP$``````%`:```!
+MI0$``````%0:```!F@```````%@:```!V@```````%P:```!KP$``````&`:
+M```!$0(``````&0:```!Q@```````&@:```!&0$``````&P:```!WP$`````
+M`'`:```!4P$``````'0:```!@P$``````'@:```!G````````'P:```!>@$`
+M`````(`:```!M@```````(0:```!?P$``````(@:```!:@$``````(P:```!
+M#`$``````)`:```!I0```````)0:```!S@```````)@:```!$0$``````)P:
+M```!6@$``````*`:```!2@$``````*0:```!U0$``````*@:```!20$`````
+M`*P:```!T`$``````+`:```!#0(``````+0:```!A0```````+@:```!(0$`
+M`````+P:```![P```````,`:```!Z0```````,0:```!;@$``````,@:```!
+M<@$``````,P:```!A0$``````-`:```!(````````-0:```!JP$``````-@:
+M```!QP$``````.`:```!0@$``````.0:```!80$``````.@:```!P`$`````
+M`.P:```!30$``````/`:```!M0```````/0:```!(0```````&0Y```:`0``
+M!/```&@Y```:`0``"/```&PY```:`0``*/```'`Y```:`0``+/```'0Y```:
+M`0``3/```'@Y```:`0``4/```'PY```:`0``</```(`Y```:`0``=/```-`Z
+M```!V0```````-0Z```!_P```````-@Z```!\@$``````-PZ```!Z@``````
+M`.`Z```!P@```````.0Z```!5@$``````.@Z```!-P$``````.PZ```!FP$`
+M`````/`Z```!*@$``````/0Z```!T0```````/@Z```!'`$``````/PZ```!
+MU``````````[```!@@$```````0[```!W0$```````@[```!"0$```````P[
+M```!?0$``````!`[```!9`$``````!0[```!%P(``````!@[```!"P(`````
+M`!P[```!.`$``````"`[```!^P```````"0[```!H@$``````"@[```!I@``
+M`````"P[```!W`$``````#`[```!T0$``````#0[```!!0$``````#@[```!
+MX`$``````#P[```!W0```````$`[```!O@$``````$0[```!@`$``````$@[
+M```!>P$``````$P[```!D````````%`[```!ZP$``````%0[```!^0``````
+M`%@[```!7P$``````%P[```!\`$``````&`[```!6`$``````&0[```!%0$`
+M`````&@[```!L`$``````&P[```!>`$``````'`[```!C@```````'0[```!
+M&P$``````'@[```!AP```````'P[```!%@$``````(`[```!O0$``````(0[
+M```!+P$``````(@[```!9P$``````(P[```!O0```````)`[```!G@$`````
+M`)0[```!(@$``````)@[```!,`$``````)P[```!E@$``````*`[```!RP``
+M`````*0[```!P0$``````*@[```!SP$``````*P[```!DP$``````+`[```!
+M$P(``````+0[```!QP```````+@[```!10$``````+P[```!)P$``````,`[
+M```!`0(``````,0[```!R@```````,@[```!#0$``````,P[```!!0(`````
+M`-`[```!)@$``````-0[```!2P$``````-@[```!P````````-P[```!R0``
+M`````.`[```!JP```````.0[```!OP```````.@[```!N0```````.P[```!
+M:0$``````/`[```!Q````````/0[```!_@```````/@[```!L@```````/P[
+M```!L0`````````\```!E@````````0\```!\0````````@\```!=@$`````
+M``P\```![````````!`\```!I`$``````!0\```!``(``````!@\```!3P$`
+M`````!P\```!T`$``````"`\```!$`$``````"0\```!#@(``````"@\```!
+MCP$``````"P\```!4`$``````#`\```!H0```````#0\```!\P$``````#@\
+M```![0```````#P\```!5`$``````$`\```!1`$``````$0\```!:P$`````
+M`$@\```!"0(``````%`\```!E@$``````%0\```!RP```````%@\```!P0$`
+M`````%P\```!SP$``````&`\```!DP$``````&0\```!%`(``````&P\```!
+M,P```````*!-```:`0``B"@!`*1-```:`0``1"@!`*A-```:`0``4"@!`*Q-
+M```:`0``U"@!`+!-```:`0``<"@!`+1-```:`0``U"@!``1.```:`0``U$`!
+M``A.```:`0``7#X!``Q.```:`0``H#X!`!!.```:`0``R#X!`!1.```:`0``
+MY$`!`!A.```:`0``+#\!`!Q.```:`0``[$`!`"!.```:`0``\$`!`"1.```:
+M`0``]$`!`"A.```:`0``^$`!`"Q.```:`0``_$`!`#!.```:`0``=#\!`#1.
+M```:`0``!$$!`#A.```:`0``"$$!`#Q.```:`0``#$$!`$!.```:`0``$$$!
+M`$1.```:`0``D#\!`$A.```:`0``L#\!`$Q.```:`0``'$$!`%!.```:`0``
+M!$`!`%1.```:`0``+$`!`%A.```:`0``*$$!`%Q.```:`0``0#\!`&!.```:
+M`0``,$$!`&1.```:`0``-$$!`&A.```:`0``.$$!`&Q.```:`0``C$`!`'!.
+M```:`0``G$`!`'1.```:`0``1$$!`'A.```:`0``L$`!`'Q.```:`0``S$`!
+M`(!.```:`0``T$`!`(1.```:`0``K$`!`(A.```:`0``N$`!`(Q.```:`0``
+MQ$`!`)!.```:`0``T$`!`)1.```:`0``W$`!`+1.```:`0``V$(!`+A.```:
+M`0``W$(!`+Q.```:`0``4$$!`,!.```:`0``=$$!`,1.```:`0``Z$(!`,A.
+M```:`0``P$$!`,Q.```:`0``\$(!`-!.```:`0``]$(!`-1.```:`0``^$(!
+M`-A.```:`0``_$(!`-Q.```:`0```$,!`.!.```:`0``!$(!`.1.```:`0``
+M"$,!`.A.```:`0``#$,!`.Q.```:`0``$$,!`/!.```:`0``%$,!`/1.```:
+M`0``,$(!`/A.```:`0``'$,!`/Q.```:`0``($,!``!/```:`0``3$(!``1/
+M```:`0``]$(!``A/```:`0``+$,!``Q/```:`0``,$,!`!!/```:`0``-$,!
+M`!1/```:`0``.$,!`!A/```:`0``/$,!`!Q/```:`0``C$(!`"!/```:`0``
+MD$(!`"1/```:`0``2$,!`"A/```:`0``[$(!``Q;```:`0``A+0!`!!;```:
+M`0``=*X!`!1;```:`0``C*\!`!A;```:`0``W+$!`!Q;```:`0``<+(!`"!;
+M```:`0``&+,!`"1;```:`0``Z+,!``AH```:`0``?,,!``QH```:`0``5,,!
+M`!!H```:`0``8,,!`!1H```:`0``;,,!`!AH```:`0``B,,!`!QH```:`0``
+MC,,!`"!H```:`0``@,,!`"1H```:`0``C,,!`"QT```:`0``Y-4!`#!T```:
+M`0``[-4!`#1T```:`0``S-4!`#AT```:`0``V-4!`#QT```:`0``]-4!`$!T
+M```:`0``^-4!`$1T```:`0``[-4!`$AT```:`0``^-4!`"R````:`0``\/,!
+M`#"````:`0``^/,!`#2````:`0``V/,!`#B````:`0``Y/,!`#R````:`0``
+M`/0!`$"````:`0``!/0!`$2````:`0``^/,!`$B````:`0``!/0!`!2.```:
+M`0``_`H"`!B.```:`0``!`L"`!R.```:`0``Y`H"`"".```:`0``\`H"`"2.
+M```:`0``#`L"`"B.```:`0``$`L"`"R.```:`0``!`L"`#".```:`0``$`L"
+M``P````!`P```````!`````!`P``"````!0````!`P``$````!@````!`P``
+M&````!P````!`P``(````"`````!`P``*````"0````!`P``,````"@````!
+'`P``.```````
+`
+end
diff --git a/sys/contrib/dev/ath/public/powerpc-le-eabi.inc b/sys/contrib/dev/ath/public/powerpc-le-eabi.inc
new file mode 100644
index 0000000..1d6a975
--- /dev/null
+++ b/sys/contrib/dev/ath/public/powerpc-le-eabi.inc
@@ -0,0 +1,75 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/powerpc-le-eabi.inc#2 $
+#
+
+#
+# Compilation configuration for building little-endian PowerPC/powerpc-eabi.
+#
+
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=powerpc-eabi
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/powerpc-eabi-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EL
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+COPTS+= -mlittle-endian
+# NB: explicitly disable multiple and string instructions for little-endian
+COPTS+= -msoft-float -ffixed-r2 -mno-multiple -mno-string
diff --git a/sys/contrib/dev/ath/public/powerpc-le-eabi.opt_ah.h b/sys/contrib/dev/ath/public/powerpc-le-eabi.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/powerpc-le-eabi.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/sh4-le-elf.hal.o.uu b/sys/contrib/dev/ath/public/sh4-le-elf.hal.o.uu
new file mode 100644
index 0000000..a74c9b0
--- /dev/null
+++ b/sys/contrib/dev/ath/public/sh4-le-elf.hal.o.uu
@@ -0,0 +1,4708 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/sh4-le-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$!`0````````````$`*@`!``````````````!LTP(``P```#0`````
+M`"@`#0`*`````````````````.8O36!8B'315(WS;ECA%S!&C1OA%S`CC5*(
+M&N$3,`*/$N'-H`D`%S`*C1'A$S`!BY:@"0`'B`&+@J`)`,.@`.%0H!.("0`)
+M``D`"0`)``D`"0`)``D`"0`)``D`"0`)`!"-4N$7,`N-'(A<T5^@"0`)``D`
+M"0`)``D`"0`)``D`5X@!BWR@"0"=H`#A"0`)``D`"0`)``D`"0`)``D`"0"5
+MD1`P3(T7,"J)D9(@,$S1`H\G,(B@$V`2C0-BB9$<,@'A%C+@B6N@"0`)``D`
+M"0`)``D`"0`)``D`"0`)``D`>)$0,&R-`.%NH!-@"0`)``D`"0`)``D`"0`)
+M``D`"0!ID1`P7(T7,`J-_W$0,">-`.%9H!-@"0`)``D`"0`)`##1$#`PT4Z)
+M,-$0,##12HD`X4F@$V`)``D`"0`)``D`+-%!H!-@"0`)``D`"0`)``D`"0`)
+M``D`"0`)``D`"0`ET3&@$V`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)`![1
+M(:`38`D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`%]$1H!-@"0`)``D`"0`)
+M``D`"0`)``D`"0`)``D`"0`0T0&@$V`38.-O"P#V;@<1D0!Z_Q00$Q$X````
+M3````&`````3\```=````!OQ``"(````G````*P```"\````T````.0````)
+M``D`"0`)``D`"0`)``D`"0`)``D`"0#F+R)/\VY-9!^1$#0I`A#1$#0I`1LB
+M*"(#CUUE%I$0-`Z+#-`+0%-D"Z`)``D`"0`)``D`"0`)``D`"0`)``D``.#C
+M;R9/"P#V;HP6MQ`)`">G````````"0`)``D`"0"&+^8O(D_S;DU@L)$0,'>-
+MXU@7,"2-$N$7,!&-$X@1X1,P78T'B&N)`.-[H`'A"0`)``D`"0`)``D`"0`)
+M``D`0(T#8N9R`N$6,FF-$^`ZH/Q_"0`)``D`"0`)``D`"0"&D1`P+HT7,!J-
+M]'$0,$>-%S!^D22/$#!\D1`P,(D`XU"@`>$)``D`"0`)``D`"0`)``D`"0`)
+M``D`"0`)``D`-=$0,!R-%S`TT0F-$#`TT1`P!XD`XS6@`>$)``D`"0`NCQ/@
+M_'\#9"[0':""+PD`"0`)``D`"0`)``D`"0`)`/Q_`V0HT`^@@B\)``D`"0`)
+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
+MX143"9`!X18$`>#C;PL`]F[@`0`4-A5X$&@0___^____W____[__``"```D`
+M"0`)``D`"0`)``D`"0`)``D`"0`)`.8O\VY%4163/#%14BP115$\,5-2+1%%
+M43PQ5%(N$451/#%24B\115$\,5)B*A'C;PL`]F[\?PD`"0`)``D`"0#F+R)/
+M['_S;E$>*9!.``&(%HU38A/1$F$8,B-A`^(M01,>$=$285-B&#(C80/B+4$4
+M'@J@4AX)``D`"0`)``D`_^$3'A0>`>$2'@C1:2$2+@?1"T'C911^XV\F3PL`
+M]F[<`0D```````````#__X`!``````D`"0`)``D`"0`)`.8O\VY%41&7?#$`
+MXBP115-\,S)1!M(K(0;2*2$2$T51?#$%TBH1XV\+`/9N_'\)````$`#__U__
+M__\```D`"0"&+^8O\VY39A)V86$8(2>-0VA%4VN7?#,R43C2*2$XTBLA$A-%
+M4GPR4V$0<1%A'6$;$D52,]$<,F%A'6$3$D52?#)540/C/4$>$A&@15$)``D`
+M"0`)``D`"0`)``D`"0!%4T21'#,R42?2*2$2$T51/9,\,5)B+!%%41PS.E(C
+MT1DB4E$=81LB4V$8<1%A'6`((`.-!'!_R2A`"R(J$R>030(#X18R'H]381IQ
+M$6,S8`?)""`7C8-G&Y$<-WY2&9$9(CUC!^$6,Q61(V`$C1L@,V`'R1A`*R`.
+M%T52!Y$<,@J0C@$7$N-O]FX+`/9H_'_0`;P1__@`!_01"0#__W__```@`#R`
+M``#__U__``"`_PD`"0`)``D`"0`)``D`"0#F+_-N15$'DBPQ$U$8(?_@"F#C
+M;PL`]F[\/PD`"0`)`.8O\VY%41=3,V#_B`B/,V(`X1(E(Z``X`D`"0`)``D`
+M()!.`1DB$=$9(A'1&",#C2(E$-$K(1(E,V`%R`*)4F`!RP(E#Y$8(P*)4F!`
+MRP(E4F((T1@B`8D&D#8$`>#C;PL`]FX8$<`%4!`)`+K8!0$@`'``````0`D`
+M"0`)``D`YB_S;@.03@#C;PL`]FX8$0D`"0`)``D`"0`)``D`"0#F+_-N4V,X
+MD$X&$48#C4-G15(`X1D2'=$S8C-@`<D((`*-&2(%X1LB,V!`R0@@%XDDD'X!
+M&"$!C4#A&R(?D'X!&"$!B1R1&R(;D'X!&"$!B1B1&R(7D'X!&"$!B121&R)%
+M42@1"9`10P.--@=%4@'A&1)C8.-O"P#V;A@1'!$@$0`!)!&``"@1``0)`+K8
+M!0$)``D`"0`)``D`"0`)``D`YB_S;D#@XV\+`/9N"0`)``D`"0`)``D`"0`)
+M``D`"0#F+UUE/^$6-0R-\VY%4E-A!>,]02PQ!=(L,1)B!-$8(@&/`>``X.-O
+M"P#V;AR0````@```"0`)``D`"0`)``D`YB]=8S_A%C,ZC?-N15$%XBU#/#$<
+MTBPQ`.=R(451/#$$<BPQ<B%%43PQ!'(L,7(A15$\,01R+#%R(451/#$$<BPQ
+M<B%%43PQ!'(L,7(A15$\,01R+#%R(451'#,+T1PS<B,.H`'@"0`)``D`"0`)
+M``D`"0`)``D`"0`)``D`"0``X.-O"P#V;@"0```<D```"0`)``D`"0`)``D`
+M"0`)`.8O\VY=8S_A%C,ZC0#@:"8FC6-A!7$081Q@&$!C801Q$&$<81L@8V$#
+M<1!A$V<8XBU'8V$"<1!A'&$H01LG8V$!<1!A'&$801LG8&$<81LG`4<#81_B
+M+4$;)P.@`4`)``#@`.=%407B+4,\,0;2+#%R(451'#,%T1PS!=$+(1(C`>#C
+M;PL`]FX8D```')````"````)``D`"0`)``D`"0"&+Y8OIB^V+\8OUB_F+R)/
+M\VYS;.A1&"%:VP&/76D`ZS_A%CD)C0#@8&$8(06+8V$"<1%B!.$6,@&)F:`)
+M`&-A`G$18@7A%C((CP#M8V$"<1%B#>$6,@&/`>T#[6-A!'$081QE8V$%<1!A
+M'&$801LE8V$&<1!A'&$H01LE8V$'<1!A&.(M01LENB5C80AQ$&(L8@%Q$&$<
+M81A!$VHK*KHJ.=,Y*F-A"G$081QG8V$+<1!A'&$801LG8V$,<1!A'&$H01LG
+M8V$-<1!A&.(M01LGNB=C80YQ$&(L8@%Q$&$<81A!$V@K*+HH.2AC81!Q$&$<
+M8&-A$7$081QA&$$;(&-A$G$081QA*$$;(&-A$W$081CB+4$;(&-A`G$18@WA
+M%C(!C;H@#&!%49-C!>(M0SPQ%M(L,5(A15$\,01R+#&B(451/#$$<BPQ<B%%
+M43PQ!'(L,8(A15$\,01R+#$"(451'#,+T1PSTB.390K0"T##9N-O)D_V;O9M
+M]FSV:_9J]FD+`/9HJJJJJO__````D```%)`````````)``D`"0`)`.8O(D_S
+M;D-B"9$<,E-D(V4#T`M`!N;C;R9/"P#V;@\1``````D`"0`)``D`"0`)``D`
+M"0`)``D`"0`)``D`"0#F+R)/\VX(D1PT!-`+0`;F`>#C;R9/"P#V;@\1````
+M`.8O(D_S;E-D`]4$T`M`!N;C;R9/"P#V;@01````````YB_S;@#@XV\+`/9N
+M"0`)``D`"0`)``D`"0`)``D`"0"&+Y8OYB\B3_-N0VAC:451"$4<-161'#52
+M81.5`^8*T`M``N<((`:-`."%40N2+#$141$I`>#C;R9/]F[V:0L`]F@`8`!L
+M_&<`````"0`)``D`"0`)``D`"0`)``D`"0#F+_-N7642D$T!'6%0,0>-#.$-
+MD$T`@,D((`&/"^$#X6@F`(D2)@#@XV\+`/9N"`)N$`D`"0`)``D`"0`)``D`
+MYB_S;@'@XV\+`/9N"0`)``D`"0`)``D`"0`)``D`"0"&+Y8OIB_F+R)/\VY#
+M:A>030B-:!SIB2D)20%(`>$9*`C0"T"398`PHV2390;1"T$I!N-O)D_V;O9J
+M]FD+`/9H2!`)````````````"0`)``D`"0`)``D`"0`)``D`"0#F+_-N15,.
+MD1PS7#4#XEU")V(V41DB`N%=01LB)A,!X.-O"P#V;OP_"0`)``D`"0`)``D`
+M"0`)``D`"0`)``D`YB_S;D53"Y$<,UPU`^%=01=A-E(I(183`>#C;PL`]F[\
+M/PD`"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)`.8O\VYC8$53#9$<,S=2
+M`>%=01=A&2(!R5U`"R(G$P'@XV\+`/9N_#\)``D`"0`)``D`"0`)``D`"0`)
+M``D`"0#F+P7A%C4+C?-N15$,DBPQ&%`OR5MA'4`#H`')"0`)`/_@XV\+`/9N
+M_#\)``D`"0`)``D`"0`)``D`"0`)``D`YB\B3_-N15$ADBPQ%E=38PSA'4-<
+M-0/A74$[(0W2*R$781DG.R<,T6@F`HT;)PO1&R=%40N2+#%V$0F03@4(T0C0
+M"T`;)>-O)D\+`/9N_#\8$0D``(`!``"```````$``````0`````)``D`"0`)
+M``D`"0`)``D`"0`)``D`"0#F+_-N15$EDBPQ%5=8)1F-G^%38`2($X\@X-_A
+M&2=`X1&@&R<)``D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`"R>_X1DG15$$
+MDBPQ=1'C;PL`]F[\/PD`"0`)``D`"0#F+_-N15$)DBPQ$E($T1@B*0`+8`)P
+MXV\+`/9N_'\)````@``)``D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`YB_S
+M;E-@15$5DBPQ$E,*T1@C!8T"B`2@"0`)``D`"0`!B`6)15(&D1PR`]$[(1(2
+MXV\+`/9N_'\``(``"0`)`.8O\VX`X.-O"P#V;@D`"0`)``D`"0`)``D`"0`)
+M``D`YB_S;E@E*0#C;PL`]FX)``D`"0`)``D`"0`)``D`"0"&+Y8OIB_F+R)/
+M\VY#:FUI1)%#:!PX@V0BT`M`!N:E4SV43#.`8BQB.I"L`1QA&$$;(@%PK`$<
+M82A!&R(!<*P!&.=]01LB(Q.E4TPS`7"L`BQB`7"L`1QA&$$K(9-B"$(M8BA"
+M"4(K(103F"D(BZ513#$24@S3.R(B$0B@"0`)`*53#)$<,S)1"-(I(1(3XV\F
+M3_9N]FKV:0L`]F@T$?Q_-1$)`````````!``___O_PD`"0`)``D`"0`)``D`
+M"0#F+_-N15$*TBPQ'%<=4AQ3<C,I`1@A*0$<,@#A`.039CLF(V=+)V-@<V'C
+M;PL`]FX\@```"0`)``D`"0`)``D`YB_S;D51`](L,1Q0XV\+`/9N"0`\@```
+M"0`)``D`"0#F+_-N15,'D1PS.E$#TBLA&A/C;PL`]F[\?PD``````>8O\VY%
+M40S2+#$:4NWA(V,=0P^2*2,.D1@C`8DJ(S=C15$&TBPQ'5`<41H@.B#C;PL`
+M]F[_`0`!/)@``#R```#F+_-N"Y!-`SUC15$(DBPQ&5$<81`S*0#C;PL`]F[0
+M`?P_"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`YB_S;D52$-,\,E)A
+M)U(L,1(E15$\,5%2%E$<,B$515$\,5-2&%$<,B,515$\,5)2%5$<,B(515$\
+M,512&5$<,B05XV\+`/9N?(````D`"0`)``D`"0`)``D`"0`)``D`AB^6+Z8O
+MYB\B3_-N0VA3:0CA%C4'CT-J$]44T`M`"0`&.0V/@V0<D/_A%@H2H`#@"0`)
+M``D`"0`)``D`"0`)``O0"T"39851#)(L,041")"6"`'@XV\F3_9N]FKV:0L`
+M]FCX$?Q_"0#__P`````````````)``D`"0`)``D`"0#F+R)/\VY%40B2+#$5
+M5030"T!=9>-O)D\+`/9N_'\)```````)``D`"0`)``D`"0`)``D`"0`)``D`
+M"0`)``D`AB^6+Z8OMB_&+^8O(D_S;E-L+Y49T`M`0VH&/!"/_^$ID!8*':``
+MX`D`"0`)``D`"0`)``D`"0`)``D`"0`)`*59&9$<.998%Y$9**-D#-`+0,-E
+M#I$9(`LHAAD+D,8*`>#C;R9/]F[V;/9K]FKV:0L`]FC_'_P1_'\`X```````
+M````"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)`.8O(D_S;D51"9(L,195
+M!Y$$T`M`&27C;R9/"P#V;OQ__Q\)```````)``D`"0`)``D`"0`)``D`"0`)
+M``D`"0#F+_-N!Y!.`.CA'$`!R@')XV\+`/9N\!$)``D`"0`)`.8O6"4<C?-N
+M15(JD1PR%M,B43DA$A(ED4-B'#(M41N@.2$)``D`"0`)``D`"0`)``D`"0`)
+M``D`"0`)``D`"0!%4@Z1'#()TR)1.R$2$@F10V(<,BU1.R$=$@'@XV\+`/9N
+M_'^\$0D`_____@````$)``D`"0`)``D`"0`)``D`AB^6+Z8OMB_&+^8O(D_S
+M;E-L,)49T`M`0VH&/!"/_^$JD!8*'J``X`D`"0`)``D`"0`)``D`"0`)``D`
+M"0`)`*59&I$<.998#=$9**-D#=`+0,-E*$`,T1D@"RB&&0N0Q@H!X.-O)D_V
+M;O9L]FOV:O9I"P#V:/\?`!+\?P````#__P#@````````_Q\)``D`"0`)``D`
+M"0`)``D`"0`)`.8O(D_S;D51"I(L,195!=$9)070"T`I1>-O)D\+`/9N_'\)
+M````_Q\`````"0`)``D`"0`)``D`"0`)``D`"0#F+_-N`>#C;PL`]FX)``D`
+M"0`)``D`"0`)``D`"0`)`.8O\V[C;PL`]FX)``D`"0`)``D`"0`)``D`"0`)
+M``D`YB_S;@#@XV\+`/9N"0`)``D`"0`)``D`"0`)``D`"0#F+_-NXV\+`/9N
+M"0`)``D`"0`)``D`"0`)``D`"0`)`.8O\V[C;PL`]FX)``D`"0`)``D`"0`)
+M``D`"0`)``D`YB\B3U-@`8@*C_-N:"8*CPW@"*``X`D`"0`)``D`"0`#T`M`
+M"0#C;R9/"P#V;@D```````D`"0`)``D`"0`)`.8O(D]38`N("HWS;AZ('(T`
+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
+MF````````````````````````/__?_X````````````````\@```"0`)``D`
+M"0`)``D`"0`)``D`"0`)``D`YB_S;D51"I(L,1)1'6((X18U3HD"QUP!'&$C
+M`0D`_']"8I24E)0BE((`"0`)``D`"0`)``D`"0`)``D`"0`)`$53.9$<,SB0
+M3@$K(1O2+Z`K(0D`"0`)``D`"0`)``D`15,ID1PS*)!.`2LA%-(?H"LA"0`)
+M``D`"0`)``D`"0!%4QF1'#,8D$X!*R$-T@^@*R$)``D`"0`)``D`"0`)`$53
+M"9$<,PB03@$K(0;2*R$2$^-O"P#V;OQ_\!$``%$```!2````%````!``"0`)
+M``D`"0`)``D`"0`)``D`"0#F+R)/\VX&D`/1"T%.!>-O)D\+`/9NW`%`@@``
+M"0`)`.8O(D_S;@CE`]`+0`KFXV\F3PL`]FX)`("&```)``D`AB^6+^8O(D_S
+M;D-I`.42T`M``>8((!6-`."39!B6#]`+0`_E""`-C0#@#=@1E`M("0"39`R6
+M"=`+0!_E"I0+2`D``>#C;R9/]F[V:0L`]F@@3N@#-`@)``````"`A@``````
+M``D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0"&+Y8OYB\B3_-N0VE3:`#E
+M(-`+0`'F""`SC0#@E5(>T1PRB"@'C0#C@V$"<1%@$,D((`")`>,R$I-D*)87
+MT`M`#^4((!V-`.`BE!71"T$)`)-D')81T`M`'^4((!&-`.`7E`_1"T$)`)-D
+M`.4)T`M``>8((`6-`."39`#E!]`+0`KFXV\F3_9N]FD+`/9H($[H`S0(````
+M`/R7``"`A@````````D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0"&+Y8O
+MIB^V+\8OUB_F+R)/]'_S;D-M4VM;T`M`8BX#;`@@(8T`X-516-(L,1M08,L+
+M$=52HY$<,BI:5=&I(1H25-B=E`M("0#54U/1'#,S45+2*R$3$PM("N339%#0
+M"T##90@@`H\`X'^@#'Z)E$G1"T$)`-522-,\,B-12=,Y(1,2U5-(V(PS-UDX
+M41$>.U(B'D;1F2%&TBLA%Q/54XPS1-'A4BDA1-(K(1@3U5.,,T+1XE(I(662
+M*R$;$S73"T,4Y-52--$<,B-1--,[(1,2,-(+0@KDU5$YTBPQ(>(F$=52+=,\
+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
+M`/9N"0`)``D`"0`)``D`"0`)``D`"0"&+Y8OIB^V+^8O(D_\?_-N0VM#:4-J
+M8Y%#:&*030`!B`2/'#@0Y370"T#C9@#A$1A8D)T!&"$'C0'A$1CP<)T!&"$!
+MCP/A$1A-D)T!&"$$C8-B@5`$RP$8@V(0<D21$2("<D*1$2+Z<D"1$2("<CZ1
+M$2*"82+2*R$BTBLA$BB#8@AR"N$1(@)R,I$1(H)A'M(I(1[2*2$2*"N0G0$8
+M(1&-#>$GD:-F'#:S9!G0"T`/Y0@@!HT!X1Z0%@J"8172*R$2*`WA%1@7D`'A
+M%@H!X`1^XV\F3_9N]FOV:O9I"P#V:.`!"`*"$(80"`FL"C@3U!>``'802!!,
+M$&@0"0```````P`!`````@#__]____^__P```````(``"0`)``D`"0#F+_-N
+M15$5DSPQ45(K$451/#%34BP115$\,512+1%%43PQ4E(N$451/#%28BD1XV\+
+M`/9N_'\)``D`"0`)``D`YB\B3^Q_\VY1'@B03@((X18R-8U380+'+`$C`0D`
+MW`%"(F!@8&!"8"(`"0`)``D`"0`)``D`"0`)``D`"0`)`!;1$QX6T1J@%!X)
+M``D`"0`)``D`"0`)``D`"0`)``D`$-$285-B&#(C80/@#4$3'@W1$F%38A@R
+M(V$-010>4V$!<1(>"=%I(1(N"=$+0>-E%'[C;R9/"P#V;@D`__\``/__!P``
+M`````````/__@`$`````"0`)``D`"0`)``D`YB_S;D51$9=\,0#B*Q%%4WPS
+M,E$&TBLA!M(I(1(315%\,072*1'C;PL`]F[\?PD````$`/__S____P``"0`)
+M`(8OYB_S;E-F$G9A81@A)XU#:$539Y=\,S)1--(K(1(315)\,E-A$'$181UA
+M&A)%4GPR86$=81\215)\,E51`^,]01T2%*!%40D`"0`)``D`"0`)``D`"0`)
+M``D`"0`)`$530)$<,S)1(=(I(1(315$YDSPQ4F(K$451'#,Y4AW1&2)241UA
+M&R)381AQ$6$=8`@@`XT$<'_)*$`+(BD3(Y&#9QPW=%,4T1DC4V$:<1%A'6$8
+M01'2*2$;(S0715$2DBPQ-Q%%4Q"1'#,R4@S1&2)74?UQ"$$<,1UA&R(B$^-O
+M]FX+`/9H_'^\+/P_```0`/__[_\``(#__P#__P#_`````/__"0`)``D`"0`)
+M``D`"0`)``D`"0`)``D`"0`)`.8O\VY%40>2+#$341@A_^`*8.-O"P#V;OP_
+M"0`)``D`YB_S;D513I(L,1%7<V#_B`:/<V(`X1(E0J``X`D`"0`CT1DB(]$8
+M)P.-(B4BT2LA$B5S8`7(`HE28`'+`B4SD1@G!(US8%)@0,L")7-@(,D((`>)
+M*9!.`1@A`XE281;2*R$2)5)B%-$8(AB-0V,=D1PS=1-%41:2+#$2418315$L
+M,1-1%Q-%42PQ%%$8$T51+#$541D315$L,191&A,!X.-O"P#V;KP`P`5H$#P0
+M"0"ZV`4!```(`````$`)``D`YB_S;@.03@#C;PL`]FXT*@D`"0`)``D`"0`)
+M``D`"0#F+_-N4V-!D$X&$48%C4-G15(`X1D215$942#1,V(S8$#)""`9C1DB
+M,9!^`1@A`8U`X1LB+)!^`1@A`8DID1LB*)!^`1@A`8DED1LB))!^`1@A`XTS
+M8""1&R(S8`')""`!C0?A&R(.T1@C`8D-T1LB15%\<2D1"9`10P.--@=%4@'A
+M&1)C8.-O"P#V;C0J."H\*@`!0"J``$0J``2ZV`4!````0```"``)``D`"0`)
+M``D`"0`)``D`"0`)``D`"0#F+_-N`I#C;PL`]FZ```D`"0`)``D`"0`)``D`
+M"0`)`.8O765_X18U#(WS;D524V$%XSU!+#$%TBPQ$F($T1@B`8\!X`#@XV\+
+M`/9N'(@```"````)``D`"0`)``D`"0#F+UUC?^$6,SJ-\VY%407B+4,\,1S2
+M+#$`YW(A15$\,01R+#%R(451/#$$<BPQ<B%%43PQ!'(L,7(A15$\,01R+#%R
+M(451/#$$<BPQ<B%%43PQ!'(L,7(A15$<,PO1'#-R(PZ@`>`)``D`"0`)``D`
+M"0`)``D`"0`)``D`"0`)``#@XV\+`/9N`(@``!R(```)``D`"0`)``D`"0`)
+M``D`YB_S;EUC?^$6,SJ-`.!H)B:-8V$%<1!A'&`80&-A!'$081QA&R!C80-Q
+M$&$39QCB+4=C80)Q$&$<82A!&R=C80%Q$&$<81A!&R=@81QA&R<!1P-A'^(M
+M01LG`Z`!0`D``.``YT51!>(M0SPQ!M(L,7(A15$<,P71'#,%T0LA$B,!X.-O
+M"P#V;AB(```<B````(````D`"0`)``D`"0`)`(8OEB^F+[8OQB_6+^8O(D_S
+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
+M(1(3XV\+`/9N_'_\/PD````$`/___/\)``D`"0`)`(8OEB^F+^8O(D_S;E-H
+M8V5#:H-@`8@CC0'IDC@0CP*(+HD`X#^@"0`)``D`"0`)``D`"0`)``D`"0`)
+M``D`"0`=T`M`"0`KH`-I"0`)``D`"0`)``D`"0`)``D`"0`)`!;1#J`)``D`
+M"0`)``D`"0`)``D`"0`)``D`"0`)``D`#]$+00D`"0`)``D`"0`)``D`"0`)
+M``D`"0`)``D`"0`(D(8*DV#C;R9/]F[V:O9I"P#V:*0L"0`@N0``X+D``""Z
+M```)``D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`YB_S;D51!I(L,1)0*4`#
+MR>-O"P#V;OP_"0`)``D`"0"&+^8O(D]38`*(.8WS;@+A%C4%C02(`8@2B0#@
+M1*`)`!Z)`.!`H`D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`'-@MH`D`"0`)
+M``D`"0`)``D`"0`)``D`"0`)``D`"0`5V!V@"0`)``D`"0`)``D`"0`)``D`
+M"0`)``D`"0`)``[8"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`!]$+
+M08-E@V#C;R9/]FX+`/9H"0``````````````````````"0`)``D`"0`)``D`
+M"0`)``D`"0`)``D`"0`)`.8O\VY%41-0XV\+`/9N"0`)``D`"0`)``D`"0`)
+M``D`YB_S;D514Q'C;PL`]FX)``D`"0`)``D`"0`)``D`"0#F+_-N15($X1(2
+MXV\+`/9N"0`)``D`"0`)``D`"0`)`.8O(D_S;D52(.$2$@CE!.8%T`M``.<(
+M("D!&"$I`.-O)D\+`/9N"0``````"0`)``D`"0`)``D`"0`)``D`"0#F+_-N
+M15,$T1PS,U'?XBDA$Q/C;PL`]FX\@```"0`)`.8O\VY%4032+#$34"#+`Q'C
+M;PL`]FX)`#R````)``D`YB_S;D51!-(L,5$115$L,6(1XV\+`/9N/(````D`
+M"0#F+_-N/^$6-22-`.`?X18U%HM%4A'1'#(B5U-CX',!X3U!%V%Y(1(2%*`!
+MX`D`"0`)``D`"0`)``D`"0`)``D`15(&T1PR(5<!X5U!%V%Y(1$2`>#C;PL`
+M]FX)`#R```#F+_-N/^$6-2.-`.`?X18U%HM%4A#1'#(B5U-CX',!X3U!>R$2
+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
+MF0``____WP#8````SP``_-<``/R7``#\F```HXLNN@D`"0`)``D`"0`)``D`
+M"0!NT14R"@()0@%"(V1LT0M!9'2546O2+#$94`'+"1&39&G5`>9IT`M``.>3
+M9&C0"T#M50@@%(^S8Z-A`G$18S-@(,D((`*/,V`"RP$AF*`#X@D`"0`)``D`
+M"0`)``D`"0"@D1PS/%$8(0B-`.B545G2+#%9TBD1`>$=$P#HDY8!YPGC@V$(
+M0952'#)L,G-AC4$2(@%X-SCUCX-A`.A/W`GJDV0+3(-E`7BG./J/DV2547QQ
+M2](J$951?'$!XBL1E5%\<2P1E5%ODBPQ'5(M$951?'%$TBD1:)&S9QPW+A>5
+M4GQR+%%`TSLA'!+J4`:("(N54GQR5Y,I43LA&1)^43LA'A=3D)X!&"$"B3C1
+M"T&39)533)$<,SE1-=(I(1D31Y"^`/^(`XT#93+0"T"39$"0O@#_B`.-`V4O
+MT`M`DV0YD+X`_X@#C0-E+-`+0)-D,I">`S@C`XF542G2+#$S$2N0ZE$6"1.@
+M`>`)``D`"0`)``D`"0`)``D`"0`)``D`"0!XX.X#,F$8(0")(B,`X%A^XV\F
+M3_9N]FWV;/9K]FKV:0L`]FA\+``0?!#\*4P0_'_0+-0LV"SX`=P!"0#-S,S,
+M`````#R8``!@F`````````````#\F````/`!```````!``$`90D(````!P``
+M````__]__@```````````````#R````)``D`"0`)``D`"0`)``D`"0`)``D`
+M"0`)``D`YB\B3_-N`]`+0`+EXV\F3PL`]FZ`S@``"0`)``D`"0"&+^8O(D_S
+M;D-H`.4+T`M``>8((`R-`."#9`G0"T`3Y0@@!8T`X`B4!M$+00D``>#C;R9/
+M]FX+`/9H-`@`````@,X````````)``D`"0`)``D`"0`)``D`"0`)``D`"0"&
+M+Y8OYB\B3_-N0VA=:0#E:=`+0`'F""`"CP#@OZ`)`,.1DV(9(L&1$#)9C1<R
+M%XW@<1`R-(T0<1`R,8F#9)B@"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)
+M``D`"0"ED1`R7(T7,@J-D'$0,C>-@V1^H`D`"0`)``D`"0`)`):1$#),C8-D
+M<Z`)``D`"0`)``D`"0`)``D`"0`)``D`A5%&TBPQ`.(B$8511-(L,0/B(1&%
+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
+MT1LC8V$(0452'#((D52@'#)`$/\#@!#P`,`)``C,`0`1P`@``0`)P!```@#\
+M#P``(`@``````?___P#__P\````0`````0```"````"`````)0`)``D`"0`)
+M``D`"0!C9PA'15)\,MV1'#(B8=N3.R$2(G#1$F)PT1)A&#+4D)X!$V,H,V[1
+M$F$8,PKA'4-%47PQRI(L,6K7,V)[(B(A:=/$D$X"`^$6,@")>R-C80A!15(<
+M,K:1'#(R(EY0`<D((`F-8V$(0452'#*PD1PR(F%>TSLA$B)34`')""`/C9-C
+MII$<,P'A;4$_4A"@*R$)``D`"0`)``D`"0`)``D`EY&38QPS`>%M01=A/U(I
+M(1\34U`!R0@@$HV38XJ1'#,!X6U!,%(3H"LA"0`)``D`"0`)``D`"0`)``D`
+M"0`)`'B1DV,<,P'A;4$783!2*2$0$U-0`LD((!*-DV-JD1PS`>%M03%2$Z`K
+M(0D`"0`)``D`"0`)``D`"0`)``D`"0!8D9-C'#,!X6U!%V$Q4BDA$1-34`3)
+M""`2C9-C2I$<,P'A;4$R4A.@*R$)``D`"0`)``D`"0`)``D`"0`)``D`.)&3
+M8QPS`>%M01=A,E(I(1(34U`(R0@@$HV38RJ1'#,!X6U!,U(3H"LA"0`)``D`
+M"0`)``D`"0`)``D`"0`)`!B1DV,<,P'A;4$783-2*2$3$P_1"T$)``'@XV\F
+M3_9N]FD+`/9HP`EB`L@L``G,`0`1_"D\*@D``````````````````````0``
+M!````"0`H.\```D`"0`)``D`"0`)`.8O\VX(14517#$$DBPQ$F#C;PL`]FX`
+M"`D`"0`)``D`YB_S;@A%15%<,062+#%B(0'@XV\+`/9N``@)``D`"0#F+_-N
+M15('D1PR`>%=01$2`>#C;PL`]FX\"`D`"0`)`.8O\VY380A!15,\,1"2+#$2
+M8`/)""`(CS-B"I$<,@'A74$A4B@A`(D!X.-O"P#V;@`*/`@)``D`"0`)``D`
+M"0"&+Y8OIB^V+\8OUB_F+R)/\VY#:5-J15(CD1PR`>%=01$2`.@0W1'<')N3
+M9`M-HV4((`2)"TP*Y`%XMSCUBY51#Y(L,0#B(1$,D8,Q*0#C;R9/]F[V;?9L
+M]FOV:O9I"P#V:'P(#R<)````````````"0`)``D`"0`)``D`"0`)`(8OEB_F
+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
+M``D`YB\B3_A_\VX$T`M`XV4!X`A^XV\F3PL`]FX)``````#F+U-@`8@+C_-N
+M0V((T0J@0'()``D`"0`)``D`"0`)`$-B0'(#T1P2XV\+`/9N"0``````(`L!
+M``D`"0`)``D`AB^6+Z8OMB_F+R)/^'_S;D-H4VE%42R:K#%14BL115&L,5-2
+M+!%%4:PQ5%(M$451K#%24BX14F$/V[@A"XD/T`M`XV46D(X#`.$`XAD3*A.%
+M4:PQN1&%40N2+#&28BD1"'[C;R9/]F[V:_9J]FD+`/9H_'\T$`D``````0``
+M``#F+R)/['_S;E$>")!.`@CA%C(UC5-A`L<L`2,!"0#<`4(B8&!@8$)@(@`)
+M``D`"0`)``D`"0`)``D`"0`)``D`%M$3'A;1&J`4'@D`"0`)``D`"0`)``D`
+M"0`)``D`"0`0T1)A4V(8,B-A`^`-01,>#=$285-B&#(C80U!%!Y380%Q$AX)
+MT6DA$BX)T0M!XV44?N-O)D\+`/9N"0#__P``__\'````````````__^``0``
+M```)``D`"0`)``D`"0#F+_-N15$1EWPQ`.(K$453?#,R40;2*R$&TBDA$A-%
+M47PQ!=(I$>-O"P#V;OQ_"0````0`___/____```)``D`AB_F+_-N4V82=F%A
+M&"$GC4-H15.5EWPS,E%+TBLA$A-%4GPR4V$0<1%A'6$:$D52?#)A81UA'Q)%
+M4GPR55$#XSU!'1(4H$51"0`)``D`"0`)``D`"0`)``D`"0`)``D`15-ND1PS
+M,E$XTBDA$A-%46>3/#%28BL115$<,SE2--$9(E)1'6$;(E-A&'$181U@""`#
+MC01P?\DH0`LB*1-1D8-G'#=U4RO1&2-381IQ$6$=81A!*-(I(1LC-1=%44"2
+M+#$W$5)1'6!7408Q`(L38%-65U%F,0"+$V9@,!"+45@0H%%1"0`)``D`"0`)
+M``D`"0`)``D`"0`)``D`"0`)`%)H45%%4Q77?#/]<1UA"$$<,1/2*R$6$T53
+M?#.#8?UQ'6$(01PQ#](K(1<315-\,PUA8V(H0BLA&!/C;_9N"P#V:/Q_O"T)
+M````$`#__^__``"`__\`__\`_P``O(``````&`H````*"0`)``D`"0`)``D`
+M"0`)``D`"0`)``D`AB^6+^8O(D_S;D-H8VE%41F2+#%1$451+#$!XB,1$Y4#
+MY@K0"T`"YP@@!HT`X(51"9(L,1)1$2D!X.-O)D_V;O9I"P#V:/Q?#&`)````
+M```)``D`"0`)``D`"0`)``D`YB_S;D53"I$<,UPU`^%=0392*R$6$P'@XV\+
+M`/9N_#_F+_-N15,+D1PS7#4#X5U!%V$V4BDA%A,!X.-O"P#V;OP_"0`)``D`
+M"0`)``D`"0`)``D`"0`)``D`"0`)``D`YB_S;F-@15,-D1PS-U(!X5U!%V$9
+M(@')74`+(B<3`>#C;PL`]F[\/PD`"0`)``D`"0`)``D`"0`)``D`"0`)`.8O
+M!>$6-0N-\VY%40R2+#$84"_)6V$=0`.@`<D)``D`_^#C;PL`]F[\/PD`"0`)
+M``D`"0`)``D`"0`)``D`"0#F+R)/\VY%42"2+#$64U-B+#(#X2U!#M(K(1=A
+M&2,,X1U%6R,+T6@F`HT;(PK1&R-%40N2+#$V$0F03@4'T0C0"T`;)>-O)D\+
+M`/9N_#]`*@#P`0``@``````!``````$`````"0`)``D`"0`)``D`"0`)``D`
+M"0`)``D`"0`)`.8O\VY%40:2+#$34`&(*0#C;PL`]F[\/PD`"0`)``D`AB^6
+M+Z8OMB_F+_-N0VE3:@#K0V=%41-B?'(A6$71&"@2B2121-$8(@")1-M$T1@B
+M`8E$T1LK1-$8(@&)/=$;*T+1&"(`B1LKE5%MDBPQ$5B#8/^(!(^#8@#A$BI=
+MH`#@.]$9(CO1&"@#C2(J.M$K(1(J@V`%R`*)HF`!RP(J5)$8*!Z-@V"B8$#+
+M`BJ544N43#$24TJ1'#=)E3-B62)X41LB+M9I(RE#*R,X%Y513#$341-B62([
+M(FDA*4$K(1@7@V`@R0@@!XDRD)X!&"$#B:)A(=(K(1(JHF&S8ALB'M$8(AF-
+M(BHDD9-C'#.%$Y51&I(L,1)1%A.542PQ$U$7$Y51+#$441@3E5$L,151&1.5
+M42PQ%E$:$P'@XV_V;O9K]FKV:0L`]FB\`,`%?$3_`V@0/!```(```````0``
+M(``````@``!```````0````"NM@%`0``"`````!```#_`^8O\VX#D$X`XV\+
+M`/9N0"H)``D`"0`)``D`"0`)``D`AB_F+_-N4V=BD$X($4@%C4-F15(`X1D2
+M15$943#1<V(9(G-@0,D((!F-`.51D&X!&"$!C4#A&R),D&X!&"$!B4F1&R)(
+MD&X!&"$!B461&R)$D&X!&"$#C7-@0)$;(G-@`<D((`&-!^$;(A[1&"<4B1W1
+M&R(=T1@G`8D=T1LE'=$8)P&)'-$;)1?1&"<!B1O1&R4;T1@G`(D;)1K1&"<!
+MB1G1&R)%47QQ*1%%4WQS/%$6TBDA6R$<$PJ0$4<#C78&15(!X1D2@V#C;_9N
+M"P#V:$`JR"K,*@`!T"J``-0J``2ZV`4!``#@`@``@````"```````0``0```
+M```@````!`````(```!````(`/___T@)``D`"0`)``D`"0`)``D`YB_S;@20
+M30`-8.-O"P#V;NH!"0`)``D`"0`)``D`"0#F+UUE%)!-`1UA5C$,C_-N15)3
+M807C/4$L,0;2+#$28@71&"(!CP'@`.#C;PL`]F[J`0D`'(@```"````)``D`
+MAB^6+Z8OMB_F+_-N765;D$T!'6%6,5"/`.!%45-C!>(M0S-B'#(IUR-A?#$2
+M8"C;O#(`YF(B15$\,2;:K#%B(451/#$DV9PQ8B%%43PQ(]B,,6(A15$\,2'2
+M+#%B(451/#%\,0?B(B%%43PQ'=(L,6(A15$<,QS1'#-B(P2('(\!X"*03@(9
+MT1@B%8U38D!R15$M8@A"+#((0BPQO#%B(451+#&L,6(A15$L,9PQ8B%%41PR
+MC#)B(@'@XV_V;O9K]FKV:0L`]FCJ`<@M%(@```"(```$B```"(@```R(```0
+MB```&(@``!R(```````("0`)``D`"0`)``D`"0`)`.8O\VY=8T^030$=838Q
+M2(\`X&@F-(UC805Q$&$<8!A`8V$$<1!A'&$;(&-A`W$081-G&.(M1V-A`G$0
+M81QA*$$;)V-A`7$081QA&$$;)V!A'&$;)P%'`V$?XBU!&R<1H`%`"0`)``D`
+M"0`)``D`"0`)``D`"0`)``D`"0`)``D``.``YT51!>(M0SPQ!](L,7(A15$<
+M,P;1'#,&T0LA$B,!X.-O"P#V;NH!"0`8B```'(@```"````)``D`"0`)`(8O
+MEB^F+[8OQB_6+^8O(D_T?_-N0VEC:'-F76H;D4-C'#/K41@A#-<!CT-M`.<S
+M80IQ$6$=8:8Q:8\`X(!A'&(%X18R`HL,?B*B"0`#QRPR+0$C`0D`X`&JJJJJ
+MJ@`J`$H`"@%J`.H`"0`)``D`"0`)``D`"0`)``D`"0`)``D`!>%]H!(N"0`)
+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
+M``D`"0`)``D`"0`)``D`"0`)``D`"0`=T`M`"0`KH`-I"0`)``D`"0`)``D`
+M"0`)``D`"0`)`!;1#J`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`#]$+
+M00D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`(D(8*DV#C;R9/]F[V:O9I
+M"P#V:+0M"0!@,`$`(#$!`&`Q`0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)
+M``D`YB_S;D51!I(L,1)0*4`#R>-O"P#V;OP_"0`)``D`"0"&+^8O(D]38`B(
+M>8WS;@CA%C4EC0*(`H\"X8&@"0`6-0Z-!(@!B#N-`.#-H`D`"0`)``D`"0`)
+M``D`"0`)``D`3HD`X,"@"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0"WD1`P
+M`H\6-7J@"0`(C2"(9HD`X*B@"0`)``D`"0`)`*B1$#`!BWN@"0"DD1`P&(D`
+MX)F@"0`)``D`"0`)``D`3]B9D$X!&"$;C0)Q$6*4D1@B98N0D$X!`G$18HZ1
+M&"(/B6V@"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)`$#8;:`)``D`"0`)
+M``D`"0`)``D`"0`)``D`"0`)``D`.=A=H`D`"0`)``D`"0`)``D`"0`)``D`
+M"0`)``D`"0`RV$V@"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)`"O8/:`)
+M``D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`)-@MH`D`"0`)``D`"0`)``D`
+M"0`)``D`"0`)``D`"0`=V!V@"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)
+M`!;8"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`#]$+08-E@V#C;R9/
+M]FX+`/9H``$``@`$-!``0`"`"0``````````````````````````````````
+M```````````````)``D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`YB_S;D51
+M$U#C;PL`]FX)``D`"0`)``D`"0`)``D`"0#F+_-N15%3$>-O"P#V;@D`"0`)
+M``D`"0`)``D`"0`)`.8O\VY%4@3A$A+C;PL`]FX)``D`"0`)``D`"0`)``D`
+MYB\B3_-N15(@X1(2".4$Y@70"T``YP@@*0$8(2D`XV\F3PL`]FX)```````)
+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
+MD1@B'HE,-"2@"0`\*OP_,BHX$-0!-!``0/\_/(``````````````````````
+M`,#\EP``_)@``*.++KK-S,S,"0`)`%"0K@$"<1%B39$8(@")"$0GT0M!9'2E
+M42;2+#$364.2(Q$!Z*51)-(L,1I0$,D((`^).I0>UPM'"0"#81/@!S$'C0%X
+MI5$<TBPQ&E`0R0@@[XNE41?2+#&3$:510'(L,1E0`\L)$;-A`G$18*#)'9$0
+M,#6-PV8:D1PV8%`"B"^)I5,.UWPS.5$-TBDA#=(K(1D3I5)\,BE1"],[(1D2
+M`>$AH!`6-!``@``XR`"@`+PM`````/R7``#\FP``_)@``/\/__\`\``````!
+M``D`"0`)``D`"0`)``D`"0`)``D`W)``X18,==$+0:-D`.C6EP'F">.#80A!
+MI5(<,GPR8V&-01(B`7@W./6/@V'(D`#A%@P`Z,60K0$=81,X"XD#::-D9],+
+M0X-E`7BC8)T!'6$3./:/HV2UD<-B'#)AT]-@!H@#CS$2JI$[(1$2I5%\<:F0
+MS@(I$:52?'(L45K3.R$<$J&0K@$8(02-HV17T0M!HV2C9%;5`>96T`M``.>C
+M9%71"T'39:53CY$<,SE14](I(1D3BI"N``7A%C`&C06(#8\'X8.0K0(6,@B+
+MI5%,TSPQ3-(G$:51/#%YDB@1I5%'TBPQ4N(C$;-A`G$18G"1&")OD`"+;I#,
+M!J-D0M`+0+-E#F1HD,X`/^,)(V60S0<S8G@RY%$&<1!A%C(!BQ-C?#/D405Q
+M$&$<,1-B2#(F,P.+(V-1D,T!'#--D,X!$V891C_A&284<,T'8V)X,N11!G$0
+M818R`8L39GPVY%$%<1!A'#$38D@R)C8#BR-F-)#-`1PV,)#.`1-G*4<_XBDG
+M%'#-!7-B6#+D409Q$&$6,@&+$V=<-^11!7$081PQ$V)(,B8W!8\_X1>0S0$C
+M9QPW/^$6,P"+/^,RH#_AO"T`$)Q$Z`$\*D`J3!#\?\P!T`$0,@`!BA"+$-PM
+M\"T``````````&4)"`````<``````&"8`````````````/__?_[\@```J@`!
+M```````)``D`"0`)``D`"0`)``D`"0`)`!8V`(L_YC_A%C<`BS_G/^`)(V-@
+M/\D80`LC<V`_R2A`"R.E44/2+#$[$7N0S@,X(P.)I5%`<BPQ.1%TD,X`_X@#
+MB0-E/-`+0*-D;9#.`/^(`XD#93G0"T"C9&:0S@#_B`.)`V4VT`M`HV1?D*X#
+M.",#B:51,](L,3,16)#6"N%1&"$UB>12!'(@81-@`LD((`*+$V#^R0`BLV("
+M<N11`G$181$B`G+D401Q$&$0(@%RY%$%<1!A$"(!<N11!G$081`B`7+D40=Q
+M$&$0(C"1HV<<-WY3`.$`XAL3+!-^6!K0"T"C9`D8&ABC9!C1"T$!Y0V@`>`)
+M``D`"0`)``D`"0!,X.X#,F$8(0")(B,`X"Q^XV\F3_9N]FWV;/9K]FKV:0L`
+M]FC,+?0M^"W\+?@!W`'\#PD`O(```````````````````#R`````````````
+M``D`"0`)``D`"0`)``D`"0#F+S:03@=S8`/)""`,C?-N15,8T1PS,E$7TBDA
+M<V`!R1WB+4`+(1(3<V`,R0@@'8T)0`')""`3BT53$-$<,S51X^(I(143$:`)
+M``D`"0`)``D`"0`)``D`"0`)``D`"0!%40;2+#$54!S+!1'C;PL`]FX$`CR9
+M``#____?O(```.8O(D\*D$X`"T#S;@@@*0$8(2D`XV\F3PL`]FZP*@D`AB^6
+M+Z8OMB_&+]8OYB\B3_!_\VY#:5-M`>PTT`M`0AX#'@#H7Y"=`1UA$C@-C0-J
+M+]N39`M+@V4((!&/`7B38*T!'6$2./6/DV3(+#:-`.`6H)51"0`)``D`"0`)
+M``D`\Z\`[`D`"0`)``D`"0`)``D`"0`)``D`"0`)``D`"0`<TBPQ`>(@$0#H
+M&]P;VV/JE5',,1E1&"$&CV/A"TL%Y`%XICCTCV/A%C@'C0#@DV03T`M`XU4(
+M(`*/`."NH!!^E5$0TBPQ%E(.D1DBXU$"<1%@(,D((".)"$(+T14R"@()0B*@
+M"4+H`?\_"0```````````'R9``#\FP````````````#\F```HXLNN@D`"0`)
+M``D`"0`)``D`"0`)``D`1M$5,@H""4(!0B-D1-$+061TDV3C54/0"T#C9@@@
+M;(T`X)510-(L,0#B(!'C40)Q$6!`R0@@(XEJD)X`"H@0C0F(#HT*B`6/`^%B
+MD)T"%C((C]-A7I'B4!T"7)$6,@R/DV3380)Q$6"@R561$#`#C9-D+M$+0>-5
+MDV0MT0M!TV6542S2+#$94`++"1'C4@1R(&$38`+)""`"BQ-@_LD`(M-B`G+C
+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
+MDE[1**`K*0D`"0`)``D`"0`)``D`"0`)``D`"0`)`&+G7%$8(1:/>RE5T1)B
+M5=$281@RC)"^`2@Q4](B8B@Q"N(M06-C"$-%4CPR@9,\,D[3.R$2(D71&RI>
+M4`')""`#C6-G2M$;*F-G"$=%47PQ<)`,,9(A15%\,6R2+#&B(5U1&"$6B452
+M9I,\,F-A'#%0<1$215$\,5U2(A%%43PQ">(C$451<V(<,@PR(F%4DSLA$B)3
+M4`')""`1C;-C39$<,P'A;4$S4A*@*R$)``D`"0`)``D`"0`)``D`"0`)`#R1
+MLV,<,P'A;4$783-2*2$3$U-0`<D((!*-LV,ND1PS`>%M0312$Z`K(0D`"0`)
+M``D`"0`)``D`"0`)``D`"0`<D;-C'#,!X6U!%V$T4BDA%!-34`+)""`RC;-C
+M#I$<,P'A;4$U4C.@*R$``@!`H@#@+0`)P`D`$?P*`!"\*@D````!````(```
+M`(`````$`````@````@````0````)0`````````````````````!```D``D`
+M"0`)``D`"0`)`%.1LV,<,P'A;4$78352*2$5$U-0!,D((!*-LV-%D1PS`>%M
+M0392$Z`K(0D`"0`)``D`"0`)``D`"0`)``D`"0`SD;-C'#,!X6U!%V$V4BDA
+M%A-34`C)""`2C;-C)9$<,P'A;4$W4A.@*R$)``D`"0`)``D`"0`)``D`"0`)
+M``D`$Y&S8QPS`>%M01=A-U(I(1<3!M$+00D``>#C;R9/]F[V:_9J]FD+`/9H
+MO"H`?`$`"0`)``D`"0`)``D`"0`)`.8O\VX(14517#$$DBPQ$F#C;PL`]FX`
+M"`D`"0`)``D`YB_S;@A%15%<,062+#%B(0'@XV\+`/9N``@)``D`"0#F+_-N
+M15('D1PR`>%=01$2`>#C;PL`]FX\"`D`"0`)`.8O\VY380A!15,\,1"2+#$2
+M8`/)""`(CS-B"I$<,@'A74$A4B@A`(D!X.-O"P#V;@`*/`@)``D`"0`)``D`
+M"0"&+Y8OIB^V+\8OUB_F+R)/\VY#:5-K15*$D1PR`>%=01$2@)Q"VD/8DV0+
+M2K-E""`&C9-D"TADY!!,]H^39)-D.]`+0+-E""!:B6V0G@`'B"D!"X@I`BLA
+M&"$,CP#G"H@(C0F(!HT*B$J/`^%=D)T"%C)%B0#G,-4PUC':,=@RT`'DE5$3
+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
+M.!?:@V0+2G-E#F#B80$A$MG#9`M)XU4#:,-D"TG390@XL6(M8M%A'6$8,B<(
+M&@C#9`M)TV7B4B<`&@$<.(-D"THC90YJX5$LH*$AP`#X):``Y"'0'0D`P/0!
+M`&#T`0``````"0`)``D`"0`)``D`"0`)``D`"0!FX1<#&@BL.+%B+6*!81UA
+M$#(5C\-D$-`+0(-EXF(!(L-D#M`+0(-EX5<!)PF@`>`)``D`"0`)``D`"0`)
+M``D``.`0?N-O)D_V;O9M]FSV:_9J]FD+`/9HP/0!`&#T`0"&+Y8OIB^V+\8O
+MUB_F+R)/^'_S;D-L4VMC:@'A`.EB.2.-$1[C;0)]DV$#XBU!LV@<.,-D@V7C
+M9A+1"T'39P@@#HT`XH-B!G+@81`B`7+080>@$"()``D`"0`)``D`"0`A'@%Y
+MHCG@CY-AX5`(?N-O)D_V;O9M]FSV:_9J]FD+`/9H"0`@]0$`"0`)``D`"0`)
+M``D`"0`)``D`"0`)``D`AB^6+Z8OYB\B3_-N4VI#:4210VA#E"70"T`<.`@@
+M$XT+&#V1DV@<.#N4(-`+0$\8""`)C0X8-9&3:#24&]`+0!PX""`,CPD8`N$2
+M*A^@`.`)``D`"0`)``D`"0`)``D`()&38APR$M$:$A+1&Q(2T1P2$M$=$A+1
+M'A(2T1\2$Y&38APR$-$0$A#1$1(!X.-O)D_V;O9J]FD+`/9HO"VL`#Q$``%\
+M*@`&O"H)``````#@\P$`P.(!`.#J`0#`XP$`H.8!`&#R`0"`]P$```````D`
+M"0`)``D`"0`)``D`"0`H4!8L6"B@_Z/_GO^@_Z/_H/\`````!0`*`!0`'@`R
+M`$8`50!:`%\`9`````H`%``>`"@`,@`\`$8`4`!:`&0`!``&``D`#`#"````
+MQ````,4```#0````V@```.0```#"````PP```-0```#R````#0$``"@!``#/
+M````R@````(`4"$!`$`!!`"@``@`P``@`-``0`!0`20!F!D`)A`&````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````*!A````````````
+M`````````````````````````````````.!A````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````#_______\```"8``!'````")@````````,F```IHZ$"1"8````X#(]
+M%)@``&L'```<F````````""8`````@("))@```X.```HF````0(""BR8``#\
+M;P,`,)@````````TF```#@X``#B8```'````/)@````!`@!`F`````!CB428
+M``"<%G(32)@``#.V&`!,F```/&&$$E"8``#@N.@-5)@``%E(!P!8F```NKZ`
+M?ER8``!>9CHQ8)@```@=``!DF````,X!`&B8``"009I`<)@```\```!TF```
+M@````'B8```$`````)D````````$F0````````B9````````#)D`````@``0
+MF0```P````";````````!)L``"`````(FP``$`````R;```P````$)L```@`
+M```4FP``*````!B;```H````')L```0````@FP``)````"2;```4````*)L`
+M`#0````LFP``#````#";```L````-)L```(````XFP``(@```#R;```2````
+M0)L``#(```!$FP``"@```$B;```J````3)L```$```!0FP``(0```%2;```1
+M````6)L``#$```!<FP``"0```&";```I````9)L```4```!HFP``)0```&R;
+M```5````<)L``#4```!TFP``#0```'B;```M````?)L```,```"`FP``(P``
+M`(2;```3````B)L``#,```",FP``"P```)";```K````E)L```<```"8FP``
+M)P```)R;```7````H)L``#<```"DFP``#P```*B;```O````K)L``"\```"P
+MFP``+P```+2;```O````N)L``"\```"\FP``+P```,";```O````Q)L``"\`
+M``#(FP``+P```,R;```O````T)L``"\```#4FP``+P```-B;```O````W)L`
+M`"\```#@FP``+P```.2;```O````Z)L``"\```#LFP``+P```/";```O````
+M])L``"\```#XFP``+P```/R;```O`````)H``!T````$F@``70````B:``"=
+M````#)H``-T````0F@``'0$``!2:```A````&)H``&$````<F@``H0```"":
+M``#A````))H``#$````HF@``<0```"R:``"Q````,)H``!P````TF@``7```
+M`#B:```I````/)H``&D```!`F@``J0```$2:```@````2)H``!D```!,F@``
+M60```%":``"9````5)H``#````!8F@``!0```%R:```E````8)H``&4```!D
+MF@``I0```&B:```H````;)H``&@```!PF@``'P```'2:```>````>)H``!@`
+M``!\F@``6````(":``"8````A)H```,```"(F@``!````(R:``!$````D)H`
+M`(0```"4F@``$P```)B:```2````G)H``%(```"@F@``D@```*2:``#2````
+MJ)H``"L```"LF@``*@```+":``!J````M)H``*H```"XF@``&P```+R:```:
+M````P)H``%H```#$F@``F@```,B:``#:````S)H```8```#0F@``!@```-2:
+M```&````V)H```8```#<F@``!@```.":```&````Y)H```8```#HF@``!@``
+M`.R:```&````\)H```8```#TF@``!@```/B:```&````_)H```8```#4F```
+M(````,R8```$````R)@```8!!@"<F```;0```,"8````````T)@``!0````)
+M"0```````@(&!@8&!@8"`@````,`!@`)`#P`````````````````````````
+M``````#P````S`````````````````````KB````(```"@(```$8```!````
+M0!@$```%!%<9`"80!@``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````#`I``````````````````````````````````````````````@
+MI0``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````;`F/";0)``#_______\````````@
+M````(````$````!````````&````!@````8`,````!4````5````'0```!4`
+M``!`$```#_PO``_\+P`?_"\`#_PO`$00```/_"\`#_PO`!_\+P`/_"\`2!``
+M``_\+P`/_"\`'_PO``_\+P!,$```#_PO``_\+P`?_"\`#_PO`%`0```/_"\`
+M#_PO`!_\+P`/_"\`5!````_\+P`/_"\`'_PO``_\+P!8$```#_PO``_\+P`?
+M_"\`#_PO`%P0```/_"\`#_PO`!_\+P`/_"\`8!````_\+P`/_"\`'_PO``_\
+M+P!D$```#_PO``_\+P`?_"\`#_PO`'`0``!H`0``X`$``+@!``!H`0``,!``
+M`#`"``#@`0``L````#`"``"P$```F`T``(`1``!('P``F`T``/`0``#@H```
+M:$`!`(!8``#@H```%(`````$``0`"``(`#``(``$``0<@```IX^-#L^/C0Z5
+MCV`!IX^-#@28`````````P``````````````()@````"`@(``@("``(!`@`"
+M`@(DF```#@X```X.```'!P``#@X``"B8```!``(*`0`""@```04!``(*-)@`
+M``X.```.#@``#@X```X.```XF```!P````<````+````"P```$28``"<%G(3
+MI19R$Z@6<A.<%G(32)@``&>Z&`!GNA@`:;H8`&FZ&`!0F```X+0H#."T*`S@
+MM"@,X+0H#%B8```N#8!^+@V`?BX-P'XN#8!^7)@``%Y=-S%>73<Q7ETZ,5Y=
+M-S%@F```$+T``!"]```XO0``$+T``&28````S@$``,X!``#.`0``S@$`%)D`
+M`!`G```0)P``?!4``!`G```8F0``D`$``)`!``"$````D`$``$29```@$.!O
+M(!#@;R`)X&\@$.!O@*$``/\4_P7_%/\%_Q3_!?\9_P74F```$````!0````0
+M````$`````P`````````*````)R<A(0L````?'Q\?#0````%````0```````
+M``!$````"````$@````(````3````!````!0`````````%0````?``````@`
+M```````$"`````````@(````````#`@````````0"````````!0(````````
+M&`@````````<"````````"`(````````)`@````````P$@````````2`````
+M````"(`````````,@````````!B`````````)(`````````H@```,````"R`
+M``#__P<`,(```/___P$T@```,0```#B`````````/(````````!`@```````
+M`$2````"````2(````````!4@````````%B`````````")@````````,F```
+MDY"$+1"8````X#)]%)@``&L/```<F````````"R8``#^;P(`,)@````````\
+MF`````$"`$"8``!Z`6H@3)@``#QAA!)4F```60@``&B8``"009I`;)@``(&P
+M#`5PF```#P```'28``"`````>)@```P`````F0````````29````````")D`
+M```````,F0````"``!"9```!````')D``"H)```@F0```````"29```%B@4`
+M*)D```$````LF0```````#"9````````-)D````````XF0```````#R9```_
+M````0)D```0```!(F0```````$R9````````4)D```````!4F0``3/%075B9
+M```8````7)D``(YJ2P"$H0``_P7_!HBA``#_!_\'C*$``/\(_PB0H0``_PG_
+M"92A``#_"O\*F*$``/\+_PN<H0``_PS_#*"A``#_#?\-I*$``/\._P^HH0``
+M_Q+_$JRA``#_$_\4L*$``/\5_Q:TH0``_Q?_&;BA``#_&O\;O*$``/\=_Q[`
+MH0``_R#_(\2A``#_)?\GR*$``/\I_RS,H0``_R__,="A``#_-/\WU*$``/\Z
+M_SK8H0``_SK_.MRA``#_.O\ZX*$``/\Z_SKDH0``_SK_.NBA``#_.O\Z[*$`
+M`/\Z_SKPH0``_SK_.O2A``#_.O\Z^*$``/\Z_SK\H0``_SK_.@";````````
+M!)L``"`````(FP``$`````R;```P````$)L```@````4FP``*````!B;```$
+M````')L``"0````@FP``%````"2;```T````*)L```P````LFP``+````#";
+M```"````-)L``"(````XFP``$@```#R;```R````0)L```H```!$FP``*@``
+M`$B;```&````3)L``"8```!0FP``%@```%2;```V````6)L```X```!<FP``
+M+@```&";```!````9)L``"$```!HFP``$0```&R;```Q````<)L```D```!T
+MFP``*0```'B;```%````?)L``"4```"`FP``%0```(2;```U````B)L```T`
+M``",FP``+0```)";```#````E)L``",```"8FP``$P```)R;```S````H)L`
+M``L```"DFP``*P```*B;```K````K)L``"L```"PFP``*P```+2;```K````
+MN)L``"L```"\FP``*P```,";```K````Q)L``"L```#(FP``*P```,R;```K
+M````T)L``"L```#4FP``*P```-B;```K````W)L``"L```#@FP``*P```.2;
+M```K````Z)L``"L```#LFP``*P```/";```K````])L``"L```#XFP```@``
+M`/R;```6````U)@``"````#8F```:!!@``":``"I`0````````2:``#I`0``
+M0`````B:```I````@`````R:``!I````4`$``!":``"9`0``D`$``!2:``#9
+M`0``T`$``!B:```9````$````!R:``!9````1````"":``"9````A````"2:
+M``"E`0``2`$``"B:``#E`0``B`$``"R:```E````R`$``#":``#(`0``%```
+M`#2:```(````0@```#B:``!(````@@```#R:``"(````>`$``$":``"8`0``
+MN`$``$2:``#8`0``^`$``$B:```8````$@```$R:``!8````4@```%":``"8
+M````D@```%2:``"D`0``?`$``%B:``#D`0``O`$``%R:```D````_`$``&":
+M``!D````"@```&2:``"D````2@```&B:``#D````B@```&R:```*`0``6@$`
+M`'":``!*`0``F@$``'2:``"*`0``V@$``'B:``#*`0``#@```'R:```*````
+M3@```(":``!*````C@```(2:``"*````7@$``(B:``"Z`0``G@$``(R:``#Z
+M`0``W@$``)":```Z````"0```)2:``!Z````20```)B:``"&`0``B0```)R:
+M``#&`0``>0$``*":```&````N0$``*2:``!&````^0$``*B:``"&````.0``
+M`*R:``#&````>0```+":``#&````N0```+2:``#&````O0$``+B:``#&````
+M_0$``+R:``#&````/0```,":``#&````?0```,2:``#&````O0```,B:``#&
+M````_0```,R:``#&````_0```-":``#&````_0```-2:``#&````_0```-B:
+M``#&````_0```-R:``#&````_0```.":``#&````_0```.2:``#&````_0``
+M`.B:``#&````_0```.R:``#&````_0```/":``#&````_0```/2:``#&````
+M_0```/B:``#&````_0```/R:``#&````_0````$```!&````8`````$```!&
+M````80````$```!&````8@````$```!&````8P````$```!&````9`````$`
+M``!&````90````$```!&````9@````$```!&````9P````$```!&````:```
+M``$```!&````:0````$```!&````:@````$```!&````:P````$```!&````
+M;`````$```!&````=`````$```!&````=`````$```!&````=`````$```!&
+M````=`````$```!&````=`````$```!&````=`````$```!&````=`````$`
+M``!&````=`````$```!&````=0````$```!&````=@````$```!&````=P``
+M``$```!&````>`````$```!&````>0````$```!&````>@````$```!&````
+M>P````$```!&````?`````$```!&````?0````$```!&````?@````$```!&
+M````?P````$```!&````@`````$```!$````?`````$```!&````B`````$`
+M``!&````C`````$```!&````D`````$```!&````E`````$```!&````F```
+M``$```!&````G`````$```!&````H`````$```!&````I`````$```!&````
+MJ`````$```!&````K`````$```!&````L`````$```!&````M``````"!P">
+M%@L`8A8*`#H6"0`<%@@`ZA4'`)H5!0!*%00``Q4"`%D4``````$````#``8`
+M"0`_````"0````0````$``$``0`!``8```!&1S@`````````````````!```
+M``$``0`$````1D<W``````````````````,``0`!``$``P```$9'-@``````
+M```````````$```````!``$```!&1S4`````````````````!``!``$`````
+M````1D<T``````````````````0````!````_O___T9',P``````````````
+M```#``$``0```/W___]&1S(`````````````````!`````````#\____1D<Q
+M``````````````````(``0`!````^O___T9',```````````````````````
+M````````````````````````````````%!!4&0`F$`8`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````@_0``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````&P)
+MCPFT"0@);`FT"?_______P4"#P<"#PH`#PD`#P```````"`````@````0```
+M`$````````8````&````!@">%@L`8A8*`#H6"0`<%@@`ZA4'`)H5!0!*%00`
+M`Q4"`%D4``"X"P$````````````&`````0````(````#````!`````4```!`
+M$```#_PO``_\+P`?_"\`#_PO``_\+P!$$```#_PO``_\+P`?_"\`#_PO``_\
+M+P!($```#_PO``_\+P`?_"\`#_PO``_\+P!,$```#_PO``_\+P`?_"\`#_PO
+M``_\+P!0$```#_PO``_\+P`?_"\`#_PO``_\+P!4$```#_PO``_\+P`?_"\`
+M#_PO``_\+P!8$```#_PO``_\+P`?_"\`#_PO``_\+P!<$```#_PO``_\+P`?
+M_"\`#_PO``_\+P!@$```#_PO``_\+P`?_"\`#_PO``_\+P!D$```#_PO``_\
+M+P`?_"\`#_PO``_\+P`P$```,`(``.`!``"P````8`$``.`!``!P$```:`$`
+M`.`!``"X`0``C`$``.`!``"P$```8`X``(`1```<'P``.#X``(`1``#P$```
+MX*```&A``0"`6```X+```&A``0`4@```Z`/H`^`&X`8@!"`$0`A`".`&X`8$
+MF`````````,```````````````,````@F`````("`@`"`@(``@$"``("`@`"
+M`@(DF```#@X```X.```'!P``#@X```X.``!$F```'!9R$R4<<A,B%W(3HA9R
+M$R4<<A-@F```$)T``!"=```8G0``&)T``!"=``!DF````,X!``#.`0``S@$`
+M`,X!``#.`0!HF```D$&:0)!!FD"009I`D$&:0)!!FD`8F0``N`$``+@!``"$
+M````"`$``+@!```DF0``!8H%$`6*!1`%B@40!8H%$`6*!1`PH@``````````
+M````````"`$````````,`````````#0````%````0`````````!$````"```
+M`$@````(````3````!````!0`````````%0````?``````@````````$"```
+M``````@(````````#`@````````0"````````!0(````````&`@````````<
+M"````````"`(````````)`@```````!P$@```````#@0````````>!``````
+M``"X$````````/@0````````.!$```````!X$0```````+@1````````^!$`
+M```````X$@```````'@2````````N!(```````#X$@```````#@3````````
+M>!,```````"X$P```````/@3````````.!0```````!X%````````+@4````
+M````^!0````````X%0```````'@5````````N!4```````#X%0```````#@6
+M````````>!8```````"X%@```````/@6````````.!<```````!X%P``````
+M`+@7````````^!<````````\$````````'P0````````O!````````#\$```
+M`````#P1````````?!$```````"\$0```````/P1````````/!(```````!\
+M$@```````+P2````````_!(````````\$P```````'P3````````O!,`````
+M``#\$P```````#P4````````?!0````````$@`````````B`````````#(``
+M```````@@````````"2`````````*(```#`````L@```__\'`#"```#___\!
+M-(```#$````X@````````#R`````````2(````````!4@````````%B`````
+M````7(```(_'#P#`@```&C""*L2```#@`=P%R(```!`G0!_,@`````#T`="`
+M```<'@``U(```*JJ`@#8@```554``MR`````````X(```/_____D@```__\`
+M`.B`````````[(````````#P@````````/2`````````^(````````#\@```
+MB`````"'````````!(<``(P````(AP``Y`````R'``#5`@``$(<````````4
+MAP```````!B'``"@````'(<``,D!```@AP``+````"2'```L````*(<``#``
+M```LAP``/````#"'```L````-(<``"P````XAP``,````#R'```\````0(<`
+M``````!$AP```````$B'````````3(<```````!0AP```````%2'````````
+M6(<```````!<AP```````&"'``#5````9(<``-\```!HAP```@$``&R'```Z
+M`0``<(<``'4```!TAP``?P```'B'``"B````?(<`````````@0```@`!``2!
+M```!````"($``,`````,@0```````!"!``!H`0``%($```````#`AP````$"
+M`\2'```$!08'R(<```@)"@O,AP``#`T.#]"'```0$1(3U(<``!05%A?8AP``
+M&!D:&]R'```<'1X?X(<````!`@/DAP``!`4&!^B'```("0H+[(<```P-#@_P
+MAP``$!$2$_2'```4%187^(<``!@9&AO\AP``'!T>'PR8```9CH2M$)@```#@
+M*'T4F```:Y\*G!R8````````0)@``'H!:B!4F```60@```"9````````!)D`
+M```````(F0````````R9`````(``$)D```$````<F0``@`P``""9`````!`%
+M*)D```$````LF0``!````#29```B(!\>.)D```T,"PH\F0``/P```$B9```2
+MLH"25)D``(CA4%U<F0``CFI+`&B9``#.`P``<)D``!6U+QEXF0```0```'R9
+M````````$*(``#-C@``4H@``$&P0`!BB``!@0)P`(*(``,8PB`$DH@````0`
+M`"RB````````-*(``"`@("`XH@``("`@($"B```@"DDX1*(``+9[``!(H@``
+M_#__#P";````````*)L```P````XFP``$@```&2;```A````C)L``"T```"<
+MFP``,P````$``@`"``$``0`"``$````#``8`"0`_`````P`&``D`/P````D`
+M```$````!``!``$``0````````````8```!&1S@`````````````````!```
+M``$``0````````````0```!&1S<``````````````````P`!``$``0``````
+M``````,```!&1S8`````````````````!````````0````````````$```!&
+M1S4`````````````````!``!``$```````````````````!&1S0`````````
+M````````!`````$``````````````/[___]&1S,``````````````````P`!
+M``$``````````````/W___]&1S(`````````````````!```````````````
+M`````/S___]&1S$``````````````````@`!``$``````````````/K___]&
+M1S``````````````````````````````````````````````````````````
+M````````"`````$````#````````````````````!@```$9'-P``````````
+M```````"`````````````````````````$9'-@`````````````````!````
+M````````````````_?___T9'-0``````````````````````````````````
+M````^O___T9'-`````````````````````$``0``````````````^/___T9'
+M,P````````````````````$``0````$``0``````]O___T9',@``````````
+M``````````$````!``$``0``````\____T9',0````````````````````$`
+M```!``$````!````\/___T9',```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````P````%8```!6````5@```%8```!6````<@```IX^-
+M$L\/B`F5#^`$JP_@$L\/B`DHF````0`""@$``@H``0$%`0`""@$``@HTF```
+M#@X```X.```.#@``#@X```X.```XF```!P````<````+````"P````L```!(
+MF```6MH8`%K:&`!IRA@`:<H8`&G*&`!0F```X+3H#>"TZ`W@M.@-X+3H#>"T
+MZ`U8F```+@V`?BX-@'XN3>A^+DWH?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F8W
+M,5YA-S%LF```@;`,!8&P#`6!L`P%@+`,!8"P#`44F0``$"<``!`G``!\%0``
+M^"H``!`G``!$F0``(!"X]R`0N/<@#;CW(!"X]R`0N/<,H@``:D$L9&I!+&1J
+M04!D:D%`9&I!0&0<H@``"H"#&`J`@Q@*@',8"H"#&`J`@Q@P$@````````B8
+M````````+)@``/XO`@`\F`````$"`$R8```\8802,)D``(-(``!`F0``!```
+M`%B9``#_````=)D```````#XF0``&`````2B````````"*(``(AG/M`HH@``
+MM0$``#RB``"OB<@3!)L``"`````(FP``$`````R;```P````$)L```@````4
+MFP``*````!B;```$````')L``"0````@FP``%````"2;```T````+)L``"P`
+M```PFP```@```#2;```B````/)L``#(```!`FP``"@```$2;```J````2)L`
+M``8```!,FP``)@```%";```6````5)L``#8```!8FP``#@```%R;```N````
+M8)L```$```!HFP``$0```&R;```Q````<)L```D```!TFP``*0```'B;```%
+M````?)L``"4```"`FP``%0```(2;```U````B)L```T```"0FP```P```)2;
+M```C````F)L``!,```"@FP``"P```*2;```K````J)L``"L```"LFP``*P``
+M`+";```K````M)L``"L```"XFP``*P```+R;```K````P)L``"L```#$FP``
+M*P```,B;```K````S)L``"L```#0FP``*P```-2;```K````V)L``"L```#<
+MFP``*P```.";```K````Y)L``"L```#HFP``*P```.R;```K````\)L``"L`
+M``#TFP``*P```/B;```"````_)L``!8```"<F```````````````````````
+M``````"<F`````````````````````````````"<F```````````````````
+M``````````"<F`````````````````````````````"<F```````````````
+M``````````````"<F`````````````````````````````"<F```````````
+M``````````````````"<F`````````````````````````````"<F```````
+M``````````````````````"<F`````````````````````````````"<F```
+M``````````````````````````"<F``````X````.````#@````X````.`"<
+MF`````````````````````````````"<F```````````````````````````
+M``"<F`````````````#`````@````(````"<F```^0`$`/D`!`#_``0`_0`$
+M`/T`!`#4F``````````````$````!`````0`````F@``J0$````````$F@``
+MZ0$``$`````(F@``*0```(`````,F@``:0```%`!```0F@``F0$``)`!```4
+MF@``V0$``-`!```8F@``&0```!`````<F@``60```$0````@F@``F0```(0`
+M```DF@``I0$``$@!```HF@``Y0$``(@!```LF@``)0```,@!```PF@``R`$`
+M`!0````TF@``"````$(````XF@``2````((````\F@``B````'@!``!`F@``
+MF`$``+@!``!$F@``V`$``/@!``!(F@``&````!(```!,F@``6````%(```!0
+MF@``F````)(```!4F@``I`$``'P!``!8F@``Y`$``+P!``!<F@``)````/P!
+M``!@F@``9`````H```!DF@``I````$H```!HF@``Y````(H```!LF@``"@$`
+M`%H!``!PF@``2@$``)H!``!TF@``B@$``-H!``!XF@``R@$```X```!\F@``
+M"@```$X```"`F@``2@```(X```"$F@``B@```%X!``"(F@``N@$``)X!``",
+MF@``^@$``-X!``"0F@``.@````D```"4F@``>@```$D```"8F@``A@$``(D`
+M``"<F@``Q@$``'D!``"@F@``!@```+D!``"DF@``1@```/D!``"HF@``A@``
+M`#D```"LF@``Q@```'D```"PF@``Q@```+D```"TF@``Q@```+T!``"XF@``
+MQ@```/T!``"\F@``Q@```#T```#`F@``Q@```'T```#$F@``Q@```+T```#(
+MF@``Q@```/T```#,F@``Q@```/T```#0F@``Q@```/T```#4F@``Q@```/T`
+M``#8F@``Q@```/T```#<F@``Q@```/T```#@F@``Q@```/T```#DF@``Q@``
+M`/T```#HF@``Q@```/T```#LF@``Q@```/T```#PF@``Q@```/T```#TF@``
+MQ@```/T```#XF@``Q@```/T```#\F@``Q@```/T```#4F```(````-28```0
+M````%````!`````0````%````-B8``!H$&``:!!@`&@08`!H$&``:!!@`)R8
+M`````````````````````````````)R8````````````````````````````
+M`)R8`````````````````````````````)R8````````````````````````
+M`````)R8`````````````````````````````)R8```````0````$````!``
+M```0````$)R8```````$````!`````0````$````!)R8````````````````
+M`````````````)R8`````````````````````````````)R8````````````
+M`````````````````)R8``````````````````H``````````)R8``#``#@`
+M@``X`,``.`+``#@`P``X`)R8```&``(`!@`"``8````&``(`!@`"`)R8``")
+M````B0```(D```")````B0```)R8``"@````H````*````"@````H````)R8
+M```'``0`!P`$``<`!``'``0`!P`$`-28```:````&@```!H````:````&@``
+M`)R8``!`````2````$````!`````0````)R8```0````$````!`````0````
+M$````)R8```(````"`````@````(````"````)R8``!/````3P```$\```!/
+M````3P```)R8``#Q````\0```&$```#Q````\0```)R8``!/D```3Y```$R0
+M``!/D```3Y```)R8``!:$@``6A(``)H2``!:$@``6A(``,R8```.````#@``
+M``\````.````#@````$```!&````8`````$```!&````80````$```!&````
+M8@````$```!&````8P````$```!&````9`````$```!&````90````$```!&
+M````9@````$```!&````9P````$```!&````:`````$```!&````:0````$`
+M``!&````:@````$```!&````:P````$```!&````;`````$```!&````=```
+M``$```!&````=`````$```!&````=`````$```!&````=`````$```!&````
+M=`````$```!&````=`````$```!&````=`````$```!&````=`````$```!&
+M````=0````$```!&````=@````$```!&````=P````$```!&````>`````$`
+M``!&````>0````$```!&````>@````$```!&````>P````$```!&````?```
+M``$```!&````?0````$```!&````?@````$```!&````?P````$```!&````
+M@`````$```!$````?`````$```!&````B`````$```!&````C`````$```!&
+M````D`````$```!&````E`````$```!&````F`````$```!&````G`````$`
+M``!&````H`````$```!&````I`````$```!&````J`````$```!&````K```
+M``$```!&````L`````$```!&````M````)X6!@!B%@0`.A8#`!P6`@#J%0$`
+MFA4``$H5```#%0$`610#`+@+!0``````,````!6````5@```%8```!6````5
+M@```'(```*>3C1+/$X@)E1/@!*L3X!+/$X@)*)@```$``@H!``(*``$"!0$`
+M`@H!``(*-)@```X.```.#@``#@X```X.```.#@``.)@```<````'````"P``
+M``L````+````2)@``&W:&`!MVA@`=<H8`'7*&`!URA@`4)@``."TZ`W@M.@-
+MX+3H#>"TZ`W@M.@-6)@``"X-@'XN#8!^+@WH?BX-Z'XN#8!^7)@``%YF-S%>
+M9C<Q7F8W,5YF-S%>9C<Q;)@``(&P#`6!L`P%@;`,!8&P#`6!L`P%%)D``-`'
+M``#0!P``3`0``)@(``#0!P``1)D``"`0N/<@$+CW$`VX]Q`0N/<0$+CW!*(`
+M````````````"`````@````(````"*(``(AGOM:(9[[6B&<^T(AG/M"(9S[0
+M#*(``$`!+&1``2QD8,%"9&#!0F1@P4)D'*(```J`@Q@*@(,8"H!S&`J`@Q@*
+M@(,8,!(````````(F````````"R8``#^+P(`/)@````!`@!,F```/&&$$C"9
+M``""2```0)D```0```!8F0``_P```'29````````**(``+4!```\H@``KXG(
+M$P2;```!````")L```(````,FP```P```!";```$````%)L```4````8FP``
+M"````!R;```)````()L```H````DFP``"P```"R;```-````,)L``!`````T
+MFP``$0```#R;```3````0)L``!0```!$FP``%0```$B;```8````3)L``!D`
+M``!0FP``&@```%2;```;````6)L``!P```!<FP``'0```&";```@````:)L`
+M`"(```!LFP``(P```'";```D````=)L``"4```!XFP``*````'R;```I````
+M@)L``"H```"$FP``*P```(B;```L````D)L``#````"4FP``,0```)B;```R
+M````H)L``#0```"DFP``-0```*B;```U````K)L``#4```"PFP``-0```+2;
+M```U````N)L``#4```"\FP``-0```,";```U````Q)L``#4```#(FP``-0``
+M`,R;```U````T)L``#4```#4FP``-0```-B;```U````W)L``#4```#@FP``
+M-0```.2;```U````Z)L``#4```#LFP``-0```/";```U````])L``#4```#X
+MFP``$````/R;```:`````)H```<````'````!)H``$<```!'````")H``(<`
+M``"'````#)H``*`!``"@`0``$)H``.`!``#@`0``%)H``"`````@````&)H`
+M`&````!@````')H``*$!``"A`0``()H``.$!``#A`0``))H``"$````A````
+M*)H``&$```!A````+)H``&(!``!B`0``,)H``*(!``"B`0``-)H``.(!``#B
+M`0``.)H``"(````B````/)H``&(```!B````0)H``&,!``!C`0``1)H``*,!
+M``"C`0``2)H``.,!``#C`0``3)H``",````C````4)H``&,```!C````5)H`
+M`(0!``"$`0``6)H``,0!``#$`0``7)H```0````$````8)H``.H!```+````
+M9)H``"H```!+````:)H``&H```"+````;)H``*H```"L`0``<)H``*L!``#L
+M`0``=)H``.L!```L````>)H``"L````2````?)H``&L```!2````@)H``*L`
+M``"2````A)H``*P!``"3`0``B)H``.P!``#3`0``C)H``"P````3````D)H`
+M`#H```!3````E)H``'H```"3````F)H``+H```"4`0``G)H``+L!``#4`0``
+MH)H``/L!```4````I)H``#L````Z````J)H``'L```!Z````K)H``+L```"Z
+M````L)H``+P!``"[`0``M)H``/P!``#[`0``N)H``#P````[````O)H``'P`
+M``![````P)H``+P```"[````Q)H``/P```"\`0``R)H``/P```#\`0``S)H`
+M`/P````\````T)H``/P```!\````U)H``/P```"\````V)H``/P```#\````
+MW)H``/P```#\````X)H``/P```#\````Y)H``/P```#\````Z)H``/P```#\
+M````[)H``/P```#\````\)H``/P```#\````])H``/P```#\````^)H``/P`
+M``#\````_)H``/P```#\````U)@``"````#0F```"`0&`P@$!P,(!`8#"`0&
+M`P@$!P/<F```P""@`,`@H`#`(.``P"#@`,`@X`"<F```````#P````\````/
+M````#P````^<F`````````````````````````````"<F`````"`````@```
+M`(````"`````@`"<F``````J````*@```"H````J````*@"<F``````!````
+M`0````$````!`````0"<F`````````````````````````````"<F``````8
+M````&````!@````8````&`"<F`````!@````8````&X```!N````;@"<F```
+M``#'````QP```,<```#'````QP"<F`````!+````2P```$L```!+````2P"<
+MF`````!(!```2`0``$@$``!(!```2`2<F`````!,````3````$P```!,````
+M3`"<F`````#D````Y````.0```#D````Y`"<F```````````````````````
+M``````"<F`````#\````_````/P```#\````_`"<F`````#_````_P```/\`
+M``#_````_P"<F``````_!```/P0``#\$```_!```/P2<F``````,````#```
+M``P````,````#`"<F``````9`@``&0(``!D"```9`@``&0*<F``````D````
+M)````"0````D````)`"<F`````"T````M````+0```"T````M`"<F`````"9
+M````F0```)D```"9````F0"<F`````!0````4````%````!0````4`"<F```
+M```J````*@```"H````J````*@"<F``````2````$@```!(````2````$@"<
+MF``````RP```,L```#+````RP```,L"<F`````!T`0``=`$``'0!``!T`0``
+M=`&<F``````1````$0```!$````1````$0"<F``````HA@``*(8``"B&```H
+MA@``*(:<F`````"$,0``A#$``(0Q``"$,0``A#&<F```@`#R`(``\@"``/(`
+M@`#R`(``\@"<F```&0`G`!D`)P`9`"<`&0`G`!D`)P"<F````P````,````#
+M`````P````,```"<F`````````````````````````````"<F```L@```+(`
+M``"R````L@```+(```"<F```A""P`(0@L`"$(+``A""P`(0@L`"<F```I"5!
+M`*0E00"D)4$`I"5!`*0E00"<F```()(1`""2$0`@DA$`()(1`""2$0"<F```
+M`$@:``!(&@``2!H``$@:``!(&@#8F```,`(+`#`""P`P`@L`,`(+`#`""P"<
+MF```E````)0```"4````E````)0```"<F```D0```)$```"1````D0```)$`
+M``"<F```$@```!(````2````$@```!(```"<F```@````(````"`````@```
+M`(````"<F```V0```-D```#9````V0```-D```"<F```8````&````!@````
+M8````&````"<F```\````/````#P````\````/````"<F```H@```*(```"B
+M````H@```*(```"<F```4@```%(```!2````4@```%(```"<F```U````-0`
+M``#4````U````-0```"<F```S!0``,P4``#,%```S!0``,P4``"<F```C`0`
+M`(P$``",!```C`0``(P$``#$F````P````,````#`````P````,````P````
+M%0```!4````5````%0```!4````<@```IY.-$L\3B`F5$^`$JQ/@$L\3B`DH
+MF````0`""@$``@H```(%`0`""@$``@HTF`````X````.````#@````X````.
+M```XF````@````(````*````"@````H```!(F```;=H8`&W:&`!D:AH`9&H:
+M`&1J&@!0F```X+3H#>"TZ`W:L.@-VK"8#-JPZ`U8F```+@V`?BX-@'XN#>A^
+M+@W(?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F`Y,5YF-S%LF```@;`,!8&P#`6!
+ML`P%@;`,!8&P#`44F0``T`<``-`'``!,!```F`@``-`'``!$F0```!"X]P`0
+MN/<`#;CW`!"X]P`0N/<$H@`````````````````````````````(H@``B&>^
+MUHAGOM:(9S[0B&<^T(AG/M`,H@``0`$L`$`!+`!`P4(`0,%"`$#!0@`<H@``
+M"H"#&`J`@Q@*@&,8"H"#&`J`@Q@P$@``X`,``&"````/````&($````````<
+M@0```````""!````````)($````````H@0```````"R!````````,($`````
+M```T@0```````#B!````````/($```````!`@0``J```@$2!````````")@`
+M```````LF````*```#R8````!"``3)@``#PCA!)PF```'P```'28``"`````
+M>)@```X```!8F0``_P```("9````````A)D`````@`*@F0```````."9````
+M````Y)D``*JJJJKHF0``>&1&/.R9``"J````\)D```P```#TF0``_P```/B9
+M```4````**(``+4)```\H@``KXG(DTRB```!````4*(```"@``!4H@``````
+M`%BB``"`4\<,7*(```$/#P]@H@```0]I7V2B```1BD$`:*(```````!LH@``
+M:L$P#'"B```@"((`=*(``*I\&P!XH@``SCGG''RB``#.`1<%`*,``````1@$
+MHP```B8#,`BC```&/@=(#*,```I,"U80HP``#V`:9!2C```;;D]X&*,``%I\
+MCX8<HP``6X;/CB"C```/ET^=)*,``(^ASZ4HHP``'Z]?M2RC``"?N=^],*,`
+M`#_'?\TTHP``O]'_U3BC````````/*,```````!`HP```````$2C````````
+M2*,``/___S],HP``____/U"C``#___\_5*,``/__`P!8HP``'ZJH>5RC```/
+M0FP&8*,```<B*`]DHP``A19@%VBC```$$8`?;*,```,,H#=PHP``@PC$/W2C
+M```#",!7>*,``((&V%]\HP``@@3@?X"C``"Z>SQ_A*,``/!_,/,$FP```0``
+M``B;```"````#)L```,````0FP``!````!2;```%````&)L```@````<FP``
+M"0```"";```*````))L```L````LFP``#0```#";```0````-)L``!$````\
+MFP``$P```$";```4````1)L``!4```!(FP``&````$R;```9````4)L``!H`
+M``!4FP``&P```%B;```<````7)L``!T```!@FP``(````&B;```B````;)L`
+M`",```!PFP``)````'2;```E````>)L``"@```!\FP``*0```(";```J````
+MA)L``"L```"(FP``+````)";```P````E)L``#$```"8FP``,@```*";```T
+M````I)L``#4```"HFP``-0```*R;```U````L)L``#4```"TFP``-0```+B;
+M```U````O)L``#4```#`FP``-0```,2;```U````R)L``#4```#,FP``-0``
+M`-";```U````U)L``#4```#8FP``-0```-R;```U````X)L``#4```#DFP``
+M-0```.B;```U````[)L``#4```#PFP``-0```/2;```U````^)L``!````#\
+MFP``&@````":``````````````2:````````0`````B:````````@`````R:
+M````````@0$``!":````````P0$``!2:`````````0```!B:````````00``
+M`!R:````````@0```"":````````:`$``"2:````````J`$``"B:````````
+MZ`$``"R:````````*````#":````````:````#2:````````B0$``#B:````
+M````R0$``#R:````````"0```$":````````20```$2:````````B0```$B:
+M````````D`$``$R:````````T`$``%":````````$````%2:````````4```
+M`%B:````````D````%R:````````D0$``&":````````T0$``&2:````````
+M$0```&B:````````40```&R:````````D0```'":````````>`$``'2:````
+M````N`$``'B:````````^`$``'R:````````.````(":````````>````(2:
+M````````F0$``(B:````````V0$``(R:````````&0```)":````````60``
+M`)2:````````F0```)B:````````V0```)R:````````^0```*":````````
+M^0```*2:````````^0```*B:````````^0```*R:````````^0```+":````
+M````^0```+2:````````^0```+B:````````^0```+R:````````^0```,":
+M````````^0```,2:````````^0```,B:````````^0```,R:````````^0``
+M`-":````````^0```-2:````````^0```-B:````````^0```-R:````````
+M^0```.":````````^0```.2:````````^0```.B:````````^0```.R:````
+M````^0```/":````````^0```/2:````````^0```/B:````````^0```/R:
+M````````^0```-28```@````T)@```@4``((%`$""!0``@@4``((%`$"W)@`
+M`,`@H`#`(*``P"#@`,`@X`#`(.``G)@``````/````#P````\````/````#P
+MG)@`````````````````````````````G)@```````,````#`````P````,`
+M```#G)@`````````````````````````````G)@`````````````````````
+M````````G)@`````````````````````````````G)@`````````````````
+M````````````G)@`````````````````````````````G)@`````0$```$!`
+M``!`0```0$```$!`G)@`````!64```5E```%90``!64```5EG)@`````````
+M````````````````````G)@`````````````````````````````G)@`````
+M0@```$(```!"````0@```$(`G)@`````M0```+4```"U````M0```+4`G)@`
+M`````P````,````#`````P````,`G)@`````]P```/<```#W````]P```/<`
+MG)@`````G0```)T```"=````G0```)T`G)@`````(@```"(````B````(@``
+M`"(`G)@`````(@0``"($```B!```(@0``"($G)@``!@`(P`8`",`&``C`!@`
+M(P`8`",`G)@`````*````"@`8``H`&``*`!@`"@`G)@``,``4`#``%``PP!0
+M`,,`4`##`%``G)@``'\`!`!_``0`?P`$`'\`!`!_``0`G)@``%@$``!8!```
+M6`0``%@$``!8!```G)@`````````````````````````````G)@```#`````
+MP````,````#`````P```V)@``#`"0``P`D``,`)``#`"0``P`D``G)@```!D
+M````9````&0```!D````9```G)@````(````"`````@````(````"```S)@`
+M``X````.````#@````X````.````,````!4````5````%0```!4````5````
+M'(```*>3C1+/$X@)E1/@!*L3X!+/$X@)*)@```$``@H!``(*``$"!0$``@H!
+M``(*-)@```X.```.#@``#@X```X.```.#@``.)@```<````'````"P````L`
+M```+````2)@``&'Z&`!A^A@`8QH:`&,:&@!C&AH`4)@``."TF`S@M)@,VK"8
+M#-JPF`S:L)@,6)@``"X-R'XN#<A^+@W(?BX-R'XN#<A^7)@``%Y@.3%>8#DQ
+M7F`Y,5Y@.3%>8#DQ;)@``(&P#`6!L`P%@;`,!8&P#`6!L`P%%)D``-`'``#0
+M!P``3`0``)@(``#0!P``1)D````0N/<`$+CW``VX]P`0N/<`$+CW!*(`````
+M````````````````````````"*(``(AGOM:(9[[6B&<^T(AG/M"(9S[0#*(`
+M`.#!+@#@P2X`(,$J`"#!*@`@P2H`'*(```J`@Q@*@(,8"H!C&`J`@Q@*@(,8
+M`*,``````1@```$8```!&````1@```$8!*,```(F`S`")@,P`B8#,`(F`S`"
+M)@,P"*,```8^!T@&/@=(!CX'2`8^!T@&/@=(#*,```I,"U8*3`M6"DP+5@I,
+M"U8*3`M6$*,```]@&F0/8!ID#V`:9`]@&F0/8!ID%*,``!MN3W@;;D]X&VY/
+M>!MN3W@;;D]X&*,``%I\CX9:?(^&6GR/AEI\CX9:?(^&'*,``%N&SY!;AL^0
+M6X;/CEN&SXY;AL^.(*,```^73YT/ET^=#Y=/FP^73YL/ET^;)*,``(^CSZ>/
+MH\^GCY_/HX^?SZ./G\^C**,``!^O7[4?KU^U'Z]?LQ^O7[,?KU^S+*,``)^Y
+MW[V?N=^]G[G?NY^YW[N?N=^[,*,``#_%?\L_Q7_+/\=_RS_'?\L_QW_+-*,`
+M`+_1_]6_T?_5O]'_T[_1_]._T?_3,!(``.`#``!H0```$````&"````/````
+MG(````````"@@````````!B!````````'($````````@@0```````"2!````
+M````*($````````L@0```````#"!````````-($````````X@0```````#R!
+M````````0($``/D#`(!$@0````````B8````````+)@```"@```\F`````0@
+M`$R8```\(X02<)@``!\```!TF```@````'B8```.````6)D``/\?"`"`F0``
+M`````(29`````(`"H)D```````#@F0```````.29``"JJJJJZ)D``'AD1CSL
+MF0``J@```/"9```,````])D``/\```#XF0``%````"BB``"U"0``/*(``*^)
+MR)-,H@```0```%"B````H```5*(```````!8H@``@%/'#%RB```!#P\/8*(`
+M``$/:5]DH@``$8I!`&BB````````;*(``&K!,`QPH@``(`B"`'2B``"J?!L(
+M>*(``,XYYQQ\H@``S@$7!3BC````````/*,```````!`HP```````$2C````
+M````2*,``/___S],HP``____/U"C``#___\_5*,``/__`P!8HP``'ZJH>5RC
+M```/0FP&8*,```<B*`]DHP``A19@%VBC```$$8`?;*,```,,H#=PHP``@PC$
+M/W2C```#",!7>*,``((&V%]\HP``@@3@?X"C``"Z>SQ_A*,``/!_,/,$FP``
+M`0````B;```"````#)L```,````0FP``!````!2;```%````&)L```@````<
+MFP``"0```"";```*````))L```L````LFP``#0```#";```0````-)L``!$`
+M```\FP``$P```$";```4````1)L``!4```!(FP``&````$R;```9````4)L`
+M`!H```!4FP``&P```%B;```<````7)L``!T```!@FP``(````&B;```B````
+M;)L``",```!PFP``)````'2;```E````>)L``"@```!\FP``*0```(";```J
+M````A)L``"L```"(FP``+````)";```P````E)L``#$```"8FP``,@```*";
+M```T````I)L``#4```"HFP``-0```*R;```U````L)L``#4```"TFP``-0``
+M`+B;```U````O)L``#4```#`FP``-0```,2;```U````R)L``#4```#,FP``
+M-0```-";```U````U)L``#4```#8FP``-0```-R;```U````X)L``#4```#D
+MFP``-0```.B;```U````[)L``#4```#PFP``-0```/2;```U````^)L``!``
+M``#\FP``&@````":``````````````2:``!`````0`````B:``"`````@```
+M``R:``"A`0``80$``!":``#A`0``H0$``!2:```A````X0$``!B:``!A````
+M(0```!R:``"(`0``80```"":``#(`0``B`$``"2:```(````R`$``"B:``!(
+M````"````"R:``"(````2````#":``"I`0``B````#2:``#I`0``:0$``#B:
+M```I````J0$``#R:``!I````Z0$``$":``#0`0``*0```$2:```0````:0``
+M`$B:``!0````D`$``$R:``"0````T`$``%":``"Q`0``$````%2:``#Q`0``
+M4````%B:```Q````D````%R:``!Q````<0$``&":``"X`0``L0$``&2:``#X
+M`0``\0$``&B:```X````,0```&R:``!X````<0```'":``"9`0``F`$``'2:
+M``#9`0``V`$``'B:```9````&````'R:``!9````6````(":``"9````F```
+M`(2:``#9````>0$``(B:``#Y````N0$``(R:``#Y````^0$``)":``#Y````
+M.0```)2:``#Y````>0```)B:``#Y````N0```)R:``#Y````^0```*":``#Y
+M````^0```*2:``#Y````^0```*B:``#Y````^0```*R:``#Y````^0```+":
+M``#Y````^0```+2:``#Y````^0```+B:``#Y````^0```+R:``#Y````^0``
+M`,":``#Y````^0```,2:``#Y````^0```,B:``#Y````^0```,R:``#Y````
+M^0```-":``#Y````^0```-2:``#Y````^0```-B:``#Y````^0```-R:``#Y
+M````^0```.":``#Y````^0```.2:``#Y````^0```.B:``#Y````^0```.R:
+M``#Y````^0```/":``#Y````^0```/2:``#Y````^0```/B:``#Y````^0``
+M`/R:``#Y````^0```-28```@````T)@```@````(````"`````@````(````
+MW)@``,``H`#``*``P`#@`,``X`#``.``G)@``````#,````S````,P```#,`
+M```SG)@```````$````!`````0````$````!G)@`````````````````````
+M````````G)@`````````````````````````````G)@`````````````````
+M````````````G)@``````!\````?````'P```!\````?G)@`````````````
+M````````````````G)@`````N````+@```"X````N````+@`G)@`````MP``
+M`+<```"W````MP```+<`G)@`````A````(0```"$````A````(0`G)@`````
+MF````)@```"8````F````)@`G)@`````P````,````#`````P````,``G)@`
+M````_P```/\```#_````_P```/\`G)@`````_P```/\```#_````_P```/\`
+MG)@`````_P```/\```#_````_P```/\`G)@`````_P```/\```#_````_P``
+M`/\`G)@`````UP```-<```#7````UP```-<`G)@`````80```&$```!A````
+M80```&$`G)@`````_@```/X```#^````_@```/X`G)@`````W@```-X```#>
+M````W@```-X`G)@`````?P```'\```!_````?P```'\`G)@`````/00``#T$
+M```]!```/00``#T$G)@`````=P```'<```!W````=P```'<`G)@`````1```
+M`$0```!$````1````$0`G)@`````F````)@```"8````F````)@`G)@``(``
+M$`"``!``@``0`(``$`"``!``G)@``#3`!0`TP`4`-,`%`#3`!0`TP`4`G)@`
+M`/``,0#P`#$`\``Q`/``,0#P`#$`G)@``!\!#``?`0P`'P$,`!\!#``?`0P`
+MG)@``$``40!``%$`0`!1`$``40!``%$`G)@``-H`4`#:`%``V@!0`-H`4`#:
+M`%``G)@`````````````````````````````G)@``$1```!$0```1$```$1`
+M``!$0```G)@`````````````````````````````G)@``,!@``#`8```P&``
+M`,!@``#`8```G)@````L````+````#8````V````+```R)@```,$```#!```
+M`P0```,$```#!```G)@```!D````9````&0```!D````9```G)@````(````
+M"`````@````(````"```S)@```X````.````#@````X````.````05(U,C$P
+M``!!4C4R,3$``$%2-3(Q,@``4D8U,3$Q``!21C4Q,3(``%)&,C0Q,P``4D8U
+M-#$S``!!=&AE<F]S(#(S,3,@5VE3;T,``$%T:&5R;W,@-30R-"\R-#(T````
+M071H97)O<R`R,S$W(%=I4V]#``!!=&AE<F]S(#4R,3(@*$901T$I`$%T:&5R
+M;W,@-3(Q,2`H1E!'02D`071H97)O<R`U,C$P`````$%T:&5R;W,@-3(Q,0``
+M``!!=&AE<F]S(#4S,3(@5VE3;T,``$%T:&5R;W,@,C,Q-2!7:5-O0P``071H
+M97)O<R`U,C$R`````#`N.2XR,"XS```````````(````$````!@````@````
+M*````#````````````#_`?\!`````````````/________]_``````,`F`&9
+M`0````````````#_________?P`````'`)@!,`L`````````````________
+M_W\`````"`"8`3`,`````````````/________]_`````"``(`$0"@``````
+M``````#_________?P`````A`"`!F0$`````````````_________W\`````
+M(@`@`3`,`````````````/________]_`````#H`8`$0"@````````````#_
+M________?P`````[`&`!F0$`````````````_________W\`````$@!E`1`*
+M```#`````````/________]_`````#<`,`&9`0```P````````#_________
+M?P`````U`#`"F0$```,`````````_________W\`````-@`P`YD!```#````
+M`````/________]_`````#``,`29`0```P````````#_________?P`````Y
+M`#`%F0$```,`````````_________W\`````-``P!ID!```#`````````/__
+M______]_`````#(`,`.9`0```P````````#_________?P`````Q`#`#F0$`
+M````````````_________W\`````$0`0`9D!`````````````/________]_
+M`````!``$`$0"@````````````#_________?P````!2`%`!F0$`````````
+M````_________W\`````10!0`ID!`````````````/________]_`````$<`
+M4`.9`0````````````#_________?P````!"`%`$F0$`````````````____
+M_____W\`````6`!0!9D!`````````````/________]_`````%L`4`:9`0``
+M``````````#_________?P````!=`%`(F0$`````````````_________W\`
+M````7@!0"9D!`````````````/________]_`````%``4`,0"@``````````
+M``#_________?P````!5`%`!,`P`````````````_________W\`````5@!0
+M`C`,`````````````/________]_`````$D`4`)0#0````````````#_____
+M____?P````!``$`!0`H``$8````$````*`````````"(`0``00!``4`*``!'
+M````!````&@`````````B0$``$@`0`$0"@``1@````0````(`````````(H!
+M``!*`$`!0`H``$8````$````"!@```````",`0``2P!``4`*``!&````!```
+M``A@````````C0$``$P`0`%0"@``1@````0````(`````````(\!``!#`$`"
+M0`H``$<````$````<`````````"+`0``\`!``T`*``!&````!````"``````
+M`````````(``0`-`"@``1P````0```!@`````````*</``#Q`$`#0`H``$8`
+M```$`````!@`````````````@0!``T`*``!&````!`````!@````````J`\`
+M`((`0`-0"@``1@````0``````````````*D/``#R`$`#$`H``$8````$````
+M````````````````@P!`!$`*``!'````!````&"`````````J@\``/0`0`1`
+M"@``1@````0`````F`````````````"$`$`$0`H``$8````$`````.``````
+M``"K#P``A0!`!%`*``!&````!`````"`````````K`\``/4`0`00"@``1@``
+M``0`````@`````````````"&`$`%0`H``$<````$````8(````````"M#P``
+MAP!`!4`*``!&````!`````#@````````K@\``(@`0`50"@``1@````0`````
+M@````````*\/``")`$`&0`H``$<````$````:`````````"P#P``B@!`!D`*
+M``!&````!`````A@````````L0\``(L`0`90"@``1@````0````(````````
+M`+(/``",`$`'0`H``$<````$````:(````````"S#P``C0!`!T`*``!&````
+M!`````C@````````M`\``(X`0`=0"@``1@````0````(@````````+4/``"/
+M`$`(0`H``$<````$````:(````````"V#P``D`!`"$`*``!&````!`````C@
+M````````MP\``)$`0`A0"@``1@````0````(@````````+@/``#V`$`)0`H`
+M`$<````$````8(``````````````]P!`"T`*``!'````!````&"`````````
+M`````&``8`!@``````````````#_________?P````!A`&$`80````,`````
+M````_________W\`````8@!B`&(````"`````````/________]_`````&,`
+M8P!C``````````````#_________?P````!D`&0`9`````,`````````____
+M_____W\`````90!E`&4````#`````````/________]_`````&8`9@!F````
+M``````````#_________?P````!G`&<`9P``````````````_________W\`
+M````:`!H`&@``````````````/________]_`````&D`:0!I`````P``````
+M``#_________?P````!J`&H`:@````,`````````_________W\`````90``
+M``$```#_____@````/____\`````2E```+0/````````:@````$```#_____
+M@````/____\`````2E```+0/````````_P$```$````!`````0```%@;````
+M`!```0````$````!````6!L```@``P`!``````````$```!8&P``#``#``$`
+M`````````0```%@;```@`$<`````````````````6!L``#,`,``!````````
+M``$```!8&P``)``A``$````!`````0```%@;```H`#<``0`````````!````
+M6!L``!\`,``!`````0````$```!8&P``,`!;``$``````````0```%@;``!P
+M``,``0`````````!````6!L``#@`-P`!``````````$```!8&P``5`!5``$`
+M```!`````0```%@;``!$`%4``0````$````!````6!L``$P`.P`!````````
+M``````!8&P``8`!2``$````!`````0```%@;``!D`#0``0`````````!````
+M6!L``'P`(``!`````0````$```!8&P``F`!;``$````!`````0```%@;``"<
+M`%(``0````$````!````6!L``*H`$``!``````````$```!8&P``O``#``$`
+M`````````0```%@;``"_`#8``0`````````!````6!L``,0`-P`!`````0``
+M``$```!8&P``RP`W``$``````````0```%@;``#0`#<``0`````````!````
+M6!L``-8`$``!`````0````$```!8&P``V@`#`````````````````%@;```R
+M`S8``0`````````!````6!L``-X``P`!``````````$```!8&P``Z0`W``$`
+M`````````0```%@;``#V`#<``0`````````!````6!L``/H`-P`!````````
+M``$```!8&P``_P`V``$``````````0```%@;```,`3```0````$````!````
+M6!L``!0!-P`!``````````$```!8&P``+`$W``$``````````0```%@;``!`
+M`1```0````$````!````6!L``%0!`P`!``````````$```!8&P``6`$A``$`
+M```!`````0```%@;``!<`3<``0`````````!````6!L``&`!-P`!````````
+M``$```!8&P``9`%;``$``````````0```%@;``!H`5(``0`````````!````
+M6!L``&P!4@`!`````0````$```!8&P``=`$W``$``````````0```%@;``!X
+M`0,``0`````````!````6!L``'P!-P`!``````````$```!8&P``B`%```$`
+M`````````````%@;``")`4$``0``````````````6!L``(H!2``!````````
+M``````!8&P``BP%#``$``````````````%@;``",`4H``0``````````````
+M6!L``(T!2P`!``````````````!8&P``CP%,``$``````````````%@;``"G
+M#X```0``````````````6!L``*@/@0`!``````````````!8&P``J0^"``$`
+M`````````````%@;``"J#X,``0``````````````6!L``*L/A``!````````
+M``````!8&P``K`^%``$``````````````%@;``"M#X8``0``````````````
+M6!L``*X/AP`!``````````````!8&P``KP^(``$``````````````%@;``"P
+M#XD``0``````````````6!L``+$/B@`!``````````````!8&P``L@^+``$`
+M`````````````%@;``"S#XP``0``````````````6!L``+0/C0`!````````
+M``````!8&P``M0^.``$``````````````%@;``"V#X\``0``````````````
+M6!L``+</D``!``````````````!8&P``N`^1``$``````````````%@;``"0
+M`4(``0`````````!````6!L``(X!`P`!``````````$```!8&P``F`%%``$`
+M```!`````0```%@;``":`44``0``````````````6!L``)L!10`!````````
+M``````!8&P``G`%>``$``````````````%@;``">`0,``0`````````!````
+M6!L``*P!-P`!``````````$```!8&P``I@$#``$``````````0```%@;``"V
+M`3<``0`````````!````6!L``+@!-P`!``````````$```!8&P``N@$W``$`
+M`````````0```%@;``"^`2$``0````$````!````6!L``"<#`P`!````````
+M``$```!8&P``R@%=``$``````````````%@;``#6`3<``0`````````!````
+M6!L``.0!$``!`````0````$```!8&P``[`$P``$````!`````0```%@;``#X
+M`0,``0`````````!````6!L``!`"-P`!``````````$```!8&P``*@(B``$`
+M`````````0```%@;``!"`C<``0`````````!````6!L````"6P`!````````
+M``$```!8&P``2@(#``$``````````0```%@;``!/`A```0````$````!````
+M6!L``%P"4@`!``````````$```!8&P``8`([``$````!`````0```%@;``!H
+M`C<``0`````````!````6!L``&P"-P`!``````````$```!8&P``=@(0``$`
+M```!`````0```%@;``!Z`@,``0`````````!````6!L``(("`P`!````````
+M``$```!8&P``@P(#``$``````````0```%@;``"J`B$``0`````````!````
+M6!L``+X"6P`!`````0````$```!8&P``OP(W``$``````````0```%@;``#!
+M`C<``0`````````!````6!L``,8".P`!``````````$```!8&P``U`(W``$`
+M`````````0```%@;``#P`C<``0`````````!````6!L``/0"-P`!````````
+M``$```!8&P``^`(#``$``````````0```%@;``">`%```0````$````!````
+M6!L``/P"`P`!``````````$```!8&P``#`,P``$``````````0```%@;```4
+M`S8``0`````````!````6!L``!@#-@`!``````````$```!8&P``)`,#``$`
+M`````````0```%@;```0`P,``0`````````!````6!L``#H#-P`!````````
+M``$```!8&P``2`,0``$````!`````0```,$6``!*`Q(``0````$````!````
+M6!L``%H#$0`!``````````$```!8&P``7`,Z``$````!`````0```%@;``!>
+M`U8``0`````````!````6!L``,`"`P`!``````````$```!8&P``=P,#``$`
+M`````````0```%@;``#,`@,``0`````````!````6!L``#,3/1,7``H%````
+M```````0`````````!````!'$U$3%P`*!0``````````$``````````0````
+M.!-T$Q<`%!0``````````!``````````!P```$X3>Q,;!@4%```````````!
+M``````````````!1$WD3'@8*!0```````````0``````````````5A-T$R$&
+M%`4```````````$``````````````*L3L!,7``H%```````````0````````
+M``P```"P$]@3%P`4%```````````$``````````"````OQ._$Q<`"@4`````
+M`````!``````````#``````4>!0%!A04```````````````````````````R
+M%&X4%P`4%```````````&``````````!````,A1N%!0`%!0``````````!@`
+M`````````0```#P4>!0/`!04```````````%```````````````\%'@4$084
+M%````````````0`````````!````/!1X%!(`%!0```````````4`````````
+M`````#P4>!04`!04```````````%```````````````\%'@4%P`4%```````
+M````!0``````````````/!1X%!<&%!0```````````$``````````````#P4
+MR!04!A04`@`````````$``````````````!X%*`4%P`4%`$`````````!0``
+M````````````C!2@%!<`%!0#``````````4``````````````(P4R!02`!04
+M`P`````````%``````````````",%,@4%``4%`<`````````!8``````````
+M````C!3(%!0&%!0#``````````$``````````@```(P4R!07!A04`P``````
+M```!``````````(```",%,@4%P84%`,``````````0``````````````C!3(
+M%!X`%!0``````````````````````````(P41!8%!A04`P``````````````
+M``````````"@%,@4$084%`,``````````0``````````````?!7T%1X&%!0"
+M``````````0``````````````'P51!84!A04`P`````````!``````````0`
+M``!\%406&P`4%`,`````````!0``````````````?!5$%AX`%!0#````````
+M``4``````````````'P51!87`!04!P`````````!@`````````````!Q%JT6
+M%P`4%```````````````````````````<1:M%AX&%!0`````````````````
+M`````````'$6K18>!A04`@`````````$``````````````!Q%L$6!084%```
+M````````````````````````<1;!%A$`%!0`````````````````````````
+M`'$6P184`!04``````````````````````````!Q%L$6'@`4%```````````
+M````````````````<1;!%AX&%!0``````````````````````P```'$6P18>
+M!A04```````````````````````````X$W03'@`4%`````````````0`````
+M````````L!/8$QX`%!0````````````$`````````````#(4;A0>`!04`P``
+M````````!``````````````\%'@4'@`4%`,```````````0`````````````
+MC!3(%!X`%!0#```````````$`````````````'$6P18>`!04````````````
+M!`````````````!\%406'@`4%`,```````````0`````````````C!3(%!X`
+M%!0``````````````````````````#P4>!0>`!04````````````````````
+M``````#!%L$6'@`4%`````````````0`````````````"A1:%`4&*"@`````
+M`````````````````````((4TA0%!B@H`0````````````````````````#Z
+M%'(5!08H*```````````````````````````FA42%@4&*"@!````````````
+M`````````````!X41A0%!B@H``````````````````````````!N%+X4!08H
+M*`$`````````````````````````YA1>%04&*"@`````````````````````
+M`````(85)A8%!B@H`0````````````````````````!0%'@4$08H*```````
+M````````````````````4!1X%!<&*"@``````````````````````````%H4
+M6A01!B@H``````````````````````````!:%%H4%P`H*```````````````
+M````````````H!2@%!<&*"@!``````````(``````````````*`4H!04!B@H
+M`0`````````"``````````````""%((4$0`H*`$``````````@``````````
+M````JA2J%!0`*"@!``````````(``````````````((4JA04`"@H`0``````
+M```"``````````````""%*H4%P8H*`$``````````@``````````````I!4<
+M%A0&*"@!``````````(``````````````(`6J!84`"@H````````````````
+M``````````"`%J@6'@8H*```````````````````````````A1:M%AX&*"@`
+M`````````````````````````%H4@A0/`"@H`P``````````!```````````
+M``"J%*H4$@`H*`,```````````0`````````````I!4<%A0`*"@#````````
+M```$`````````````(`6J!84`"@H````````````!``````````````("40)
+M!084!0``````````````````````````"`E$"10`%`4`````````````````
+M`````````&P)J`D%!A0%``````````````````````````!L":@)%``4!0``
+M````````(```````````````;`FH"1X`%`4`````````````````````````
+M`&P)G@D;!A0%``````````````````````````!L"9X)%``4!0``````````
+M(```````````````@`F*"10`%`4``````````````````````````)D)J`D4
+M`!0%``````````````````````````"C":@)%``4!0``````````("``````
+M````````M`FT"04&%`4``````````````````````````+0)M`D4`!0%````
+M```````@*`````````````#0":P*!084!0``````````````````````````
+M"`E$"10`%`4``````````````````````````&P);`D4`!0%````````````
+M``````````````!Q"8`)%``4!0``````````````````````````A0F*"10`
+M%`4``````````````````````````(\)F0D4`!0%````````````````````
+M``````">"9X)%``4!0``````````````````````````HPFC"10`%`4`````
+M```````$``````"``````*,)HPD4`!0%````````````````````@`````"H
+M":@)%``4!0````````````0``````(``````J`FH"10`%`4`````````````
+M``````"``````+0)M`D4`!0%````````````!```````@`````"T";0)%``4
+M!0```````````````````(``````"`E$"04&%`4`````````````````````
+M``````@)1`D4`!0%``````````````````````````!L":@)!084!0``````
+M````````````````````;`FH"10`%`4``````````$```````````````&P)
+MJ`D>`!0%``````````````````````````!L"9X)&P84!0``````````````
+M````````````;`F>"10`%`4``````````$```````````````(`)B@D4`!0%
+M``````````````````````````"9":@)%``4!0``````````````````````
+M````T`FL"@4&%`4``````````````````````````*,)J`D4`!0%````````
+M```@(``````````````("40)%``4!0``````````````````````````;`EL
+M"10`%`4``````````````````````````'$)@`D4`!0%````````````````
+M``````````"%"8H)%``4!0``````````````````````````CPF9"10`%`4`
+M`````````````````````````)X)G@D4`!0%````````````````````````
+M``"C":,)%``4!0````````````0``````(``````HPFC"10`%`4`````````
+M``````````"``````*@)J`D4`!0%````````````!```````@`````"H":@)
+M%``4!0```````````````````(``````"`E$"04&*"@`````````````````
+M`````````(4)A0D%!B@H``````````````````````````"%"84)%`8H*```
+M````````````````````````A0F%"1(&*"@````````````$````````````
+M`-`)K`H%!B@H``````````````````````````#_`1```0``````````````
+M`````````````@`((```````````````_P`````````````````````1)```
+M```````````````%%```````````````````!0(``````````````````!,`
+M``````````````````!0`1````````````````````````````````````$`
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!0
+M`A``````````````````````````````````!```````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````!0`Q``````````````````
+M```````````````0"```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````!0!!``````````````````````````````@```@```
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!0
+M!1``````````````````````````````````0```````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````!0!C```@`````````#````
+M````````````@$``@`````````````````@)````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````!0"#````````````````````````,````````$``$`
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!0
+M"3```@`````````$``````````,```````0@$```````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````P`3```@`````````$````
+M``````,``````$"````(````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````P`C```@`````````$``````````,`````0```````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````P
+M`S```@`````````$``````````,``````$`````(````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````P!#```@`````````$````
+M``````,`````0"``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````P!3```@`````````$``````````,`````$```````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````P
+M!C```@`````````$``````````,``````!$``0``````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````0`1``````````````````
+M````````````(``!``(```````````````02```````````````````1(```
+M````````````````````````````````````````````````````````````
+M```````````````````@`1````````````````````````````````("``0`
+M```````````````````````````````````2(```````````````````````
+M``````````````````````````````````````````````````````````!@
+M`1```0`````````#````````````````((!```(``````````````,00````
+M```````````````A!```````````````````````````````````````````
+M``````````````````````````````````````!E`1```0`````````#````
+M```````````X````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````!``4`````````````(``````````(`````!```````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!`
+M`D`````````````0``````````(```#'!0``````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````!``T``````````````@```
+M``````(`````@```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````!`!$``!```````````@`````````(`````@$``````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!`
+M!4``!```````````@`````````(`````@$```@``````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````!`!D`````````````(````
+M``````(`````B```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````!`!T``!``````````(@`````````(`````A$``````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!`
+M"$``!``````````(@`````````(`````A$```@``````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````!`"4``````````````@```
+M``````(```#'@0``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````!`"T``!```````````@`````````(```#'@4``````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!0
+M#?\`````````````````````````````````````````````````````````
+M```````````````````````````````````*````````````````````"@``
+M```````````````````````````````````````P"O\```````````"`````
+M``````,`````````````````````````````````````````````````````
+M`````````````````0````````````````````$```````````````````0`
+M```````````````````P"S```````````````0````````,`````````````
+M``````````````````````````````````````````````````````"`````
+M````````````````@`````````````````````0````````````````````P
+M##```````````````@````````,`````````````````````````````````
+M```````````````````````````````````0````````````````````$```
+M``````````````````0````````````````````0"A``````````````````
+M````````````````````````````````````````````````````````````
+M```````````````@````````````````````(`````````````````````0`
+M``````````````````!`"D````````````!@>`````````(`````````````
+M``````````````````````````````````````````````````````!`"@``
+M````````````````0`0```````````````````0```````````````````!0
+M"D``````````````````````````````````````````````````````````
+M```````````````````````````````````(````````````````````"```
+M``````````````````0```````````````````"9`3``````````````````
+M````````````````````````````````````````````````````````````
+M```````````````(````````````````````"`````````````````````0`
+M``````````````````!@`/\``P``````````!`````````@``````````.`#
+M``````````````#``@``````````````````````````````````````P*\`
+M`````````````````/`+``````````````````@```````````````````!F
+M`/\``P``````````!`````````@``````````.`#``````````````#``@``
+M````````````````````````````````````P`<``````````````````/`!
+M``````````````````@```````````````````!G`/\``P``````````!```
+M``````@``````````.`#``````````````#``@``````````````````````
+M````````````````P"\``````````````````/`+``````````````````@`
+M``````````````````!H`/\``P``````````!`````````@``````````.`#
+M``````````````#``@``````````````````````````````````````P%<`
+M`````````````````/`5``````````````````@```````````````````!A
+M`/\``P``````````!````````!```````````.`#````````````````````
+M````````````````````````````````````P*\``````````````````/`+
+M``````````````````@```````````````````!B`/\``P``````````!```
+M`````!```````````.`#``````````````#``@``````````````````````
+M````````````````P*\``````````````````/`+``````````````````@`
+M``````````````````!C`/\``P``````````!`````````@``````````.`!
+M``````````````#``@``````````````````````````````````````P"\`
+M`````````````````/`+``````````````````@```````````````````!D
+M`/\``P``````````!````````!``````````"``<``````````````#``@``
+M````````````````````````````````````P`<``````````````````/`!
+M``````````````````@```````````````````!E`/\``P``````````!```
+M`````!```````````(0(````````````````````````````````````````
+M````````````````P%<``````````````````/`5``````````````````@`
+M``````````````````!I`/\``P``````````!````````!```````````,`#
+M``````````````#``@``````````````````````````````````````P`<`
+M`````````````````/`!``````````````````@```````````````````!J
+M`/\``P``````````!````````!```````````,`#````````````````````
+M````````````````````````````````````P"\``````````````````/`+
+M``````````````````@```````````````````"8`?\`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````!``/``\P"(@?``\P!!`(``@P")@8``@P!(`/(`]0"*
+M@?(`]0!#`/8`]P"+@?8`]P!*`/$`]`",@?$`]`!+`($`A`"-@8$`A`!,`((`
+MA0"/@8(`A0"(`?``\P")`8``@P"*`?(`]0"+`?8`]P",`?$`]`"-`8$`A`"/
+M`8(`A0````@```````````````````````````````````````````````$"
+M<!<+`(P```````$"*",/`!(```````$"X"X*`)@"``````$"4$8.`"0"````
+M``$"P%T)`+`$``````$"H(P-`$@$``````$"@+L(`&`$``````$"\-(,`&P$
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````@`````````````````````````````
+M``````````````````$#<!<+`(P```````$#*",/`!(```````$#X"X*`)@"
+M``````$#4$8.`"0"``````$#P%T)`+`$``````$#H(P-`$@$``````$#@+L(
+M`&`$``````$#\-(,`&P$````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````@`````````
+M``````````````````````````````````````$"<!<+`(P```````$"*",/
+M`!(```````$"X"X*`)@"``````$"4$8.`"0"``````$"P%T)`+`$``````$"
+MH(P-`$@$``````$"@+L(`&`$``````$"\-(,`&P$````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````@```````````````````````````````````````````````$#
+M<!<+`(P```````$#*",/`!(```````$#X"X*`)@"``````$#4$8.`"0"````
+M``$#P%T)`+`$``````$#H(P-`$@$``````$#@+L(`&`$``````$#\-(,`&P$
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````0`````````````````````````````
+M``````````````````$`Z`,+`((```````$`T`<*!(0!``````$`?!4)!(L!
+M``````$`^"H(!)8!````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````2B````````
+M``````BB``!&1CY01D8^4`RB``!L08!D;$&`9!"B```#H)D!`Z"9`12B```0
+MUDP$$-9,!!BB``!``(`30`"`$QRB``!@`.`;8`#@&R"B```*@%,,"H!3#"2B
+M```[WQ0`.]\4`"BB``"U`0``M0$``"RB```@````(````)R8````````````
+M`)R8`````````````)R8`````````````)R8`````````````)R8````````
+M`````)R8`````````````)R8`````````````)R8`````````````)R8````
+M`````````)R8`````````````)R8`````````````)R8`````#@````X`)R8
+M`````````````)R8`````````````)R8`````````````)R8``#Y``0`^0`$
+M`-28````````!````)R8`````````````)R8`````````````)R8````````
+M`````)R8`````````````)R8`````````````)R8```````0````$)R8````
+M```$````!)R8`````````````)R8`````````````)R8`````````````)R8
+M````````````"IR8``"``#@`@``X`IR8```&``(`!@```)R8``"2````D@``
+M`)R8``"@````H````)R8```'``0`!P`$`-28```:````&@```)R8``!(````
+M2````)R8```0````$````)R8```(````"````)R8```/````#P```)R8``#R
+M````8@```)R8``!/D```3)```)R8``!:$@``FA(``,R8```.````#P````@`
+M``````````````````````````````````````````````$"<!<+`(P`````
+M``$"*",/`!(```````$"X"X*`)@"``````$"4$8.`"0"``````$"P%T)`+`$
+M``````$"H(P-`$@$``````$"@+L(`&`$``````$"\-(,`&P$````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````@`````````````````````````````````````````
+M``````$"N`L+`(8```````$"E!$/``D```````$"<!<*`(P"``````$"*",.
+M`!("``````$"X"X)`)@$``````$"4$8-`"0$``````$"P%T(`#`$``````$"
+M>&D,`#8$````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````@`````````````````````
+M``````````````````````````$"W`4+`(,```````$"R@@/``0```````$"
+MN`L*`(8"``````$"E!$.``D"``````$"<!<)`(P$``````$"*",-`!($````
+M``$"X"X(`!@$``````$"O#0,`!L$````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````<`
+M``````````````````````````````````````````````$#<!<+`(P`````
+M``$#X"X*`)@"``````$#4$8.`"0"``````$#P%T)`+`#``````$#H(P-`$@#
+M``````$#@+L(`&`#``````$#\-(,`&P#````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````@`````````````````````````````````````````
+M``````$#<!<+`(P```````$#*",/`!(```````$#X"X*`)@"``````$#4$8.
+M`"0"``````$#P%T)`+`$``````$#H(P-`$@$``````$#@+L(`&`$``````$#
+M\-(,`&P$````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````0`````````````````````
+M``````````````````````````$`Z`,;`((```````$`T`<:!(0!``````$`
+M?!49!(L!``````$`^"H8!)8!````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````P`
+M``````````````````````````````````````````````$`Z`,;`((`````
+M``$`T`<:!(0!``````$`?!49!(L"``````$`^"H8!)8#```````"<!<+``P$
+M```````"*",/`!($``````$"X"X*`!@&``````$"4$8.`"0&``````$"P%T)
+M`#`(``````$"H(P-`$@(``````$"@+L(`&`(``````$"\-(,`&P(````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````T`````````````````````````````````````````
+M``````$$^@`#`($`9`)D`@$$]`$'`($`R0')`0$$Z`,"`((!Y`#D``$$T`<&
+M`(0"H`"@``$$N`L!`(8#C`",``$"<!<+`(P$/``\``$"*",/`!($/``\``$"
+MX"X*`)@&,``P``$"4$8.`"0&,``P``$"P%T)`#`(+``L``$"H(P-`$@(+``L
+M``$"@+L(`&`(+``L``$"\-(,`&P(+``L````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'
+M3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'
+M3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'
+M3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'
+M3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'
+M3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'
+M3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'
+M3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'
+M3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'
+M3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'
+M3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS``!'0T,Z("A'3E4I(#,N,BXS
+M``!'0T,Z("A'3E4I(#,N,BXS```N<WEM=&%B`"YS=')T86(`+G-H<W1R=&%B
+M`"YR96QA+G1E>'0`+G)E;&$N<F]D871A`"YR;V1A=&$N<W1R,2XT`"YR96QA
+M+F1A=&$`+F)S<P`N8V]M;65N=```````````````````````````````````
+M`````````````````````"`````!````!@````````!``````/D!````````
+M````(``````````;````!`````````````````$#`+0D```+`````0````0`
+M```,````*P````$````"`````````$#Y`0#0A``````````````$````````
+M`"8````$``````````````"T)0,`0`X```L````#````!`````P````S````
+M`0```#(`````````$'X"`/0```````````````0````!````1P````$````#
+M``````````1_`@!D4``````````````$`````````$(````$````````````
+M``#T,P,`5`````L````&````!`````P```!-````"`````,`````````:,\"
+M`)@!``````````````(`````````4@````$``````````````&C/`@"H`P``
+M```````````!`````````!$````#```````````````0TP(`6P``````````
+M`````0`````````!`````@``````````````=-4"`*`9```,````!P````0`
+M```0````"0````,``````````````!3O`@#J$0`````````````!````````
+M```````````````````````````````````````#``$`````````````````
+M`P`#``````````````````,`!0`````````````````#``8`````````````
+M`````P`(``````````````````,`"0`!````H*8``+0````2``$`#`````"1
+M```,````$@`!`!<```#@+`$`)`,``!(``0`B````H'```(0````2``$`+0``
+M`*!(`0!@`@``$@`!`#@``````````````!````!"````X/H``#@````2``$`
+M30```,!4`0#$`0``$@`!`%@```"@8P``$`$``!(``0!C```````````````0
+M````;0```*";`0#L````$@`!`'@```"4.```I`$``!$`!@"#````H#4!`"@`
+M```2``$`C@```$!F```T````$@`!`)D```!@5@``X````!(``0"D````,$@`
+M`*0!```1``8`KP```,`D`0!,````$@`!`+H````@'P$`&````!(``0#%````
+M`!,!`!(````2``$`T````$#Y``!P`0``$@`!`-L```!`!0$`W````!(``0#F
+M````X`X``/8````2``$`\0````#J``"D````$@`!`/P```!`T@``O````!(`
+M`0`'`0``H+4``'`````2``$`$@$``$"\```.````$@`!`!T!``#@E0``2@``
+M`!(``0`H`0``X"<!`#P````2``$`,P$``&#W```,````$@`!`#X!``!`$`$`
+M&````!(``0!)`0```$L!`*`````2``$`5`$``,`)``!H````$@`!`%\!``!`
+M_0``M````!(``0!J`0``@*H```X````2``$`=0$```")`0#D`0``$@`!`(`!
+M``"@FP``#````!(``0"+`0``8+P```X````2``$`E@$````4``!H`0``$@`!
+M`+$!``!$0P``I`$``!$`!@"\`0``P"`!`(0````2``$`QP$``*"7``#(````
+M$@`!`-(!``"@!```)@```!(``0#=`0``P(T!`%@````2``$`Z`$`````````
+M````$`````D"``"@;```5@```!(``0`4`@``8",!`#P!```2``$`'P(``"`C
+M`0`V````$@`!`"H"```@[0``F````!(``0`U`@``0&\``"(````2``$`0`(`
+M`&"Q``!4````$@`!`$L"```@M@``C````!(``0!6`@```.X``#0````2``$`
+M80(``."N```@````$@`!`&P"``#`(0$`<````!(``0!W`@``()P``$8!```2
+M``$`@@(``*!K```H````$@`!`(T"``!@D0``-````!(``0"8`@``@!H!`'0`
+M```2``$`HP(``*"X```\````$@`!`*X"``!@(0$`*````!(``0"Y`@```"`!
+M`'0````2``$`Q`(``,#[``!H````$@`!`,\"``#`2P$`-````!(``0#:`@``
+M(&8```P````2``$`Y0(``$`B`0",````$@`!`/`"``"@6P``V`4``!(``0#[
+M`@``(+@``#@````2``$`!@,``.`<`0`T````$@`!`!$#``!`!```5````!(`
+M`0`<`P``@"`!`"0````2``$`)P,``$!S`0`$`0``$@`!`#(#````#P$`(@``
+M`!(``0`]`P``H%,!`'@````2``$`2`,``.!N```@````$@`!`%,#``#@J@``
+MD````!(``0!>`P```+```&P````2``$`:0,``."/```P````$@`!`'0#``"`
+M>0$`B````!(``0!_`P``H(0``-`!```2``$`B@,``&!S```*````$@`!`)4#
+M```@>@$`-````!(``0"@`P``0),``*`"```2``$`JP,``(`"``"0`0``$@`!
+M`+H#``"`8@$`#`,``!(``0#%`P`````````````0````S`,``*`R`0`$`@``
+M$@`!`-<#``#`MP``&````!(``0#B`P``('<!`(0!```2``$`[0,````G`0#4
+M````$@`!`/@#``#@-`$`#@```!(``0`#!```(`0``!(````2``$`#@0``,"R
+M```8````$@`!`!D$``!`[@``3`$``!(``0`D!```P.T``#`````2``$`+P0`
+M`,#*``!(````$@`!`#H$``"`80``&````!(``0!%!````&\``$`````2``$`
+M4`0``.`$``!(`@``$@`!`&8$```@4@$`,````!(``0!Q!```@)T``$@!```2
+M``$`?`0``&!P```D````$@`!`(<$`````````````!````"1!```P*@``!H`
+M```2``$`G`0``*!+`0`8````$@`!`*<$````VP``+````!(``0"R!```(!4!
+M`+0$```2``$`O00``,`1`0`0````$@`!`,@$```@9P``E````!(``0#3!```
+M8*<``#P````2``$`W@0``."0`0`\````$@`!`.D$``!@$P$`\````!(``0#T
+M!```8+<```H````2``$`_P0``"!L``!H````$@`!``H%````[0``'````!(`
+M`0`5!0``8/X``'`&```2``$`(`4``(!V`0"8````$@`!`"L%````'P$`#```
+M`!(``0`V!0``P*X``"`````2``$`004``&`V`0!<````$@`!`$P%``#@D```
+M#````!(``0!7!0``@(,!``@#```2``$`8@4``$"^``#@````$@`!`&T%``#`
+M:@``3````!(``0!X!0``X"(!`"@````2``$`@P4``.`$`0!@````$@`!`(X%
+M````]0``&@```!(``0"9!0``((X!`$0````2``$`I`4`````````````$```
+M`+$%``#@D@``6@```!(``0"\!0``8'D``.`````2``$`QP4``*"(`0!0````
+M$@`!`-(%````CP$`$````!(``0#=!0``@!T!`*`````2``$`Z`4``*`'``#(
+M`0``$@`!`/D%``#@?`$`D`0``!(``0`$!@``@&\``$P````2``$`#P8``."8
+M``#$````$@`!`!H&```@MP``"@```!(``0`E!@``0!\!`!@````2``$`,`8`
+M`*"<`0",````$@`!`#L&``"@>```7````!(``0!&!@``@`L!`(`````2``$`
+M408``*"J```T````$@`!`%P&````S0``>`$``!(``0!G!@``()```+0````2
+M``$`<@8``,!;`0",!0``$@`!`'T&``!@-P$`J````!(``0"(!@``(#`!`"P`
+M```2``$`DP8``""_```H`@``$@`!`)X&```@)0$`X`$``!(``0"I!@``X+,`
+M`'0````2``$`M`8``*"W```8````$@`!`+\&```@*`$`P`0``!(``0#*!@``
+MH'H!`%P!```2``$`U08``""1`0`L!0``$@`!`.`&``!@N```-````!(``0#K
+M!@```)\``!0````2``$`]@8``&!E```0````$@`!``$'``"@IP``!`$``!(`
+M`0`,!P``(!P!`#`````2``$`%P<``$!T```@````$@`!`"('``#@X0$`T```
+M`!(``0`M!P``(',```H````2``$`.`<``(`?`0`0````$@`!`$,'``!@'@$`
+M.@```!(``0!.!P``>$L``*0!```1``8`60<``(#U``!P````$@`!`&0'``"@
+MH`$`2@```!(``0!O!P``H'$``'`````2``$`>@<``("\```0````$@`!`(4'
+M``!`>@``M`(``!(``0"0!P``@$@!`!X````2``$`FP<``"`:`0`@````$@`!
+M`*8'``!@'`$`@````!(``0"Q!P``8(\!`&P!```2``$`O`<``$"#```<````
+M$@`!`,<'``!`=P``#@```!(``0#2!P``P&T``+`````2``$`W0<``"!Y```H
+M````$@`!`.@'``"@&P$`=````!(``0#S!P``P$X!`)0"```2``$`_@<``"""
+M`0!8`0``$@`!``D(``#<.P``I`$``!$`!@`4"```P&<``)@!```2``$`'P@`
+M`(!)``"(````$@`!`"H(```@D0``,````!(``0`U"````'D``!@````2``$`
+M0`@`````````````$````&`(````?0``*`4``!(``0!K"`````````D````1
+M``8`>P@``*!6`0"`````$@`!`(8(``"`L```(````!(``0"1"```(/@!`-``
+M```2``$`G`@``"`&`0!R````$@`!`*<(``!`'0$`)````!(``0"R"```@',`
+M``H````2``$`O0@``"!3`0!P````$@`!`,@(``!`MP``#````!(``0#3"```
+M0+L``!@````2``$`W@@``("K``"4````$@`!`.D(``"@'P$`.````!(``0#T
+M"``````````````0`````PD``."P```H````$@`!``X)``#420``I`$``!$`
+M!@`9"0``@#(!`!@````2``$`)`D``,`,`0`\````$@`!`"\)````TP``3```
+M`!(``0`Z"0``((,``!P````2``$`10D``*"T``"$````$@`!`%`)``#@$0$`
+M$`$``!(``0!;"0``Z$0``*0!```1``8`9@D``*`D`0`<````$@`!`'$)``"`
+ML@``-````!(``0!\"0```#<!`&`````2``$`APD``("9`0`8`@``$@`!`)()
+M```@K```8`(``!(``0"="0```'@``!P````2``$`J`D``("O```R````$@`!
+M`+,)``!@U@``C`$``!(``0"^"0``0(D``!P````2``$`R0D````V`0!@````
+M$@`!`-0)``",1@``I`$``!$`!@#?"0``H+```"(````2``$`Z@D```"R``"`
+M````$@`!`/4)``"`;@``-````!(``0``"@``H($!`!H````2``$`"PH`````
+M````````$````!H*``"`]P``4````!(``0`E"@``0!H!`"0````2``$`,`H`
+M`*!I```@````$@`!`#L*``"@(0$`&````!(``0!&"@```+<```P````2``$`
+M40H``$`;`0!@````$@`!`%P*``"`/0``I`$``!$`!@!G"@```+X``!@````2
+M``$`<@H``."H``"\````$@`!`'T*```@`@``6````!(``0"+"@``.#H``*0!
+M```1``8`E@H``*"]``!<````$@`!`*$*``"@J0``$````!(``0"L"@``#```
+M`"`````1``8`O@H```!M```D````$@`!`,D*``"@;0``#@```!(``0#4"@``
+M(!,!`#P````2``$`WPH``*!U``#$````$@`!`.H*``"@G@$`]`$``!(``0#U
+M"@``@'8``!@````2``$```L``("U```8````$@`!``L+``!@-0$`/````!(`
+M`0`6"P``0%4``-0````2``$`(0L``("!`0`8````$@`!`"P+``!`O0``8```
+M`!(``0`W"P``P+8``"P````2``$`0@L``"`U`0`L````$@`!`$T+```@]0``
+M&@```!(``0!8"P``8'H!`#@````2``$`8PL``$"U```H````$@`!`&X+``!@
+M80$`U````!(``0!Y"P``P*D``*@````2``$`A`L``.#W``!&`0``$@`!`(\+
+M```D/P``I`$``!$`!@":"P``X'<``!P````2``$`I0L``""/`0`L````$@`!
+M`+`+``#@9```>````!(``0"["P``H'8``(`````2``$`Q@L``(#P``!4!```
+M$@`!`-$+``#@<P``8````!(``0#<"P``@'$``!@````2``$`YPL````-`0!H
+M`0``$@`!`/(+``#`>`$`L````!(``0#]"P``(+X``!@````2``$`"`P``"!6
+M```T````$@`!`!,,``#`#P$`9````!(``0`>#````!,``%H````2``$`*0P`
+M```+``#.`P``$@`!`#0,``#@#@$`(````!(``0`_#```('(``(P````2``$`
+M2@P``"!W```.````$@`!`%4,``"@<0$`<````!(``0!@#```8&L``"(````2
+M``$`:PP``$!B`0`T````$@`!`'8,``!@1@``+````!(``0"!#```0`<``%P`
+M```2``$`C`P````;`0`R````$@`!`)<,`````````````!````"G#```0-L`
+M`.@!```2``$`L@P``,!D```:````$@`!`+T,``"@A@$`Z`$``!(``0#(#```
+MX&L``"H````2``$`TPP``&`4`0"X````$@`!`-X,``"`LP``3````!(``0#I
+M#````/8``%@!```2``$`]`P`````````````$````!0-``!`"@``N````!(`
+M`0`?#0```&H``$P````2``$`*@T``&!J```R````$@`!`#4-``#`KP``,@``
+M`!(``0!`#0``@&8``)`````2``$`2PT``,"Q```P````$@`!`%8-``"@!@$`
+M=`0``!(``0!A#0``X+<``!P````2``$`;`T``"`X`0"(`@``$@`!`'<-````
+M<P``#````!(``0""#0``8&D``"0````2``$`C0T``(!M```,````$@`!`)@-
+M`````````````!````"F#0``@*X``"0````2``$`L0T``&`0```8`0``$@`!
+M`+P-``"@<P``-````!(``0#'#0``(+T``!P````2``$`T@T``."X```L````
+M$@`!`-T-``#@@P``I````!(``0#H#0``('@``!P````2``$`\PT``$!M```\
+M````$@`!`/X-``#@&0$`)````!(``0`)#@```#4!`!`````2``$`%`X```!(
+M`0"`````$@`!`!\.```@L0``*@```!(``0`J#@``@`\!`"H````2``$`-0X`
+M`"!7`0"8!```$@`!`$`.``#`;@``&````!(``0!+#@``8+L``,0````2``$`
+M5@X``."R```@````$@`!`&$.``#`F0``T`$``!(``0!L#@``(*\``%`````2
+M``$`=PX``("W```*````$@`!`((.``"@D0``*`$``!(``0"-#@``'$T``*0!
+M```1``8`F`X``.!I```,````$@`!`*,.````KP``#````!(``0"N#@``8&,`
+M`#P````2``$`N0X``(!E``"0````$@`!`,0.``!`#P$`*````!(``0#/#@``
+M8!,``(P````2``$`V@X``*"-`0`@````$@`!`.4.``#@'P$`#````!(``0#P
+M#@``0+,``#H````2``$`^PX```!Q`0":````$@`!``8/``!@N@``Q````!(`
+M`0`1#P``8,$``"0)```2``$`'`\``,!.``"D`0``$0`&`"</``!`"P$`.```
+M`!(``0`R#P``(&L``"@````2``$`/0\``(`)```\````$@`!`$@/``#`:0``
+M(````!(``0!3#P```(L!`)0"```2``$`7@\``&!\`0!P````$@`!`&D/``!@
+M=P``$````!(``0!T#P``8+0``"0````2``$`?P\``,`T`0`.````$@`!`(H/
+M``"`=P``3````!(``0"5#P``H&(``#8````2``$`H`\``$!Q```H````$@`!
+M`*L/``"@HP``,````!(``0"V#P``@!$``'8!```2``$`P0\``,#Z```*````
+M$@`!`,P/``!`E@``J````!(``0#7#P``X+P``!P````2``$`X@\``$!S```,
+M````$@`!`.T/````\```<````!(``0#X#P``X#4!`!P````2``$``Q```,"Q
+M`0"L````$@`!``X0``#`<@``+````!(``0`9$```0%<``#`````2``$`)!``
+M``!.```J!P``$@`!`#H0``#`-@$`0````!(``0!%$```0'@``&`````2``$`
+M4!```,`Z`0`P#0``$@`!`%L0``!@$`$`8`$``!(``0!F$```0/4``#0````2
+M``$`<1````"]```<````$@`!`'P0````EP``D````!(``0"'$```X$4``&P`
+M```2``$`DA```,";``!0````$@`!`)T0``!@@P``9````!(``0"H$```H+P`
+M`"P````2``$`LQ```*#*```8````$@`!`+X0``#@8@``=````!(``0#)$```
+MX)X```H````2``$`U!```.!O``!T````$@`!`-\0```@Z0``-````!(``0#J
+M$```H#$!`,0````2``$`]1```*`>`0!,````$@`!```1````LP``0````!(`
+M`0`+$0``H)\``/0#```2``$`%A$``(",``#$`@``$@`!`"$1``!@'P$`'```
+M`!(``0`L$0``X/0``!@````2``$`-Q$``&#-`0"T````$@`!`$(1```@'@$`
+M0````!(``0!-$0``@`X!`%`````2``$`6!$```!,`0"L`@``$@`!`&,1``#`
+M@0$`&@```!(``0!N$0``8*8``#8````2``$`>1$````,`0"T````$@`!`(01
+M``"@:@``#````!(``0"/$0```+@``!`````2``$`FA$``("8``!,````$@`!
+M`*41```@'0$`&````!(``0"P$0``0&L!``@!```2``$`NQ$``"#+``#0`0``
+M$@`!`,81```@20``8````!(``0#?$0``X($!`#0````2``$``'IZ,#`U8C4X
+M-#8`>GHP,#)D8C$Q8P!Z>C`R9&)F.#<U`'IZ,#)D8F(Q8C(`>GHP,F1B,C`U
+M,P!?7V%S:&QD:3,`>GHP,#)D8F$T,@!Z>C!F8F(Q93-F`'IZ,&(W.65A.30`
+M7U]S9&EV<VDS`'IZ,#5B.&,V-6$`>GHP,#5B-#!A9`!Z>C`U8CDT,F5D`'IZ
+M,&0X9&,V,F,`>GHP,#$Y9C0W,`!Z>C`R9&0Y-#)D`'IZ,#)D8F4W,V0`>GHP
+M,#5B-CDR8@!Z>C!B-F0R,S(U`'IZ,#`U8C@U,V0`>GHP,#$V9#DR90!Z>C!C
+M9F(Q.#<U`'IZ,#`R9&(S,6,`>GHP,F1A8F)A8P!Z>C`R9&)C.#4Q`'IZ,#`P
+M8C9C-C@`>GHP,#!B-F)F.`!Z>C`P8C9C9C5E`'IZ,#$V93%D9F0`>GHP8C9F
+M-3!B.`!Z>C`V93!A-&9E`'IZ,#`V-V0R8C$`>GHP,#)D8F,V,0!Z>C!B-F-A
+M,S(U`'IZ,#`U8C9C9F0`>GHP,39E,&1F9`!Z>C`P,&(V9C8X`&%T:%]H86Q?
+M<')O8V5S<U]N;VES969L;V]R`'IZ,#`U8C0X860`>GHP,F1B9C%B,@!Z>C`P
+M-6(X.&-B`'IZ,#,S96,X8F8`>GHP9&(T,C5C-0!A=&A?:&%L7V1M85]B96%C
+M;VY?<F5S<&]N<V5?=&EM90!Z>C`P8C9F,38Q`'IZ,#9E,#!B.&$`>GHP,F1B
+M9F,Q9`!Z>C!D8S1E,SDP`'IZ,&1A9F5D.#8`>GHP,&(V93(W80!Z>C`R9&)B
+M86(R`'IZ,&(V9#%E9F8`>GHP,39D.3!D9`!Z>C`R9&)E.#4Q`'IZ,#`U8C8T
+M9F0`>GHP,#!B-F0U,@!Z>C!B-F,Y969F`'IZ,#$V93`P9&0`>GHP,F1B9#@W
+M-0!Z>C`R9&(S,6(R`'IZ,#!B-S`Y,C,`>GHP,&(V9#0U,`!Z>C`P,&(V9#%D
+M`'IZ,&(V8S(S,C4`>GHP,F1B9&%B,@!Z>C`P,#5B-C,R`'IZ,#9D961D.3,`
+M>GHP,#$V9&$U,`!Z>C`P,#8W9#,R`'IZ,#!B-F0Y,C,`>GHP,#)D8C4Q8P!Z
+M>C`Q-F1C8F9E`'IZ,#!B-S`Q-#4`>GHP,#$V9&8R8P!Z>C!B-V9A9#-E`'IZ
+M,#$V9#DY,C``>GHP,F1B,6)A8P!Z>C!D8S9E,SDP`'IZ,#5B-S`Q93``>GHP
+M,#!B-F(Q,`!Z>C!B-S`Y969F`'IZ,#$V9&8X.6(`871H7VAA;%]A='1A8V@`
+M>GHP-F4P9F,P9`!M96UC<'D`>GHP,39D86(R9`!Z>C`R9&(Q,S5D`'IZ,&4P
+M-#8X-&(`>GHP,39E,CDQ9`!Z>C`P,&(V9F4X`'IZ,#!C9F(S93``>GHP,#$V
+M9#DT.`!Z>C`Q-F4R,#EB`'IZ,&(W,#%E9F8`>GHP,#!B-F,Y9`!Z>C`P,#5B
+M-6$R`'IZ,#)D8C$W,&$`871H7VAA;%]C;VUP=71E='AT:6UE`'IZ,#)D8C5B
+M86,`>GHP,#5B.#$S9`!Z>C`P8C9C.3(S`%]?=61I=G-I,P!Z>C!B-F(U,&(X
+M`'IZ,#`U8C=F.60`>GHP8C<P,60P,@!Z>C`V9&9F-#1A`'IZ,#)D8C4W-C,`
+M>GHP-F5E868V,`!Z>C!E,#`W8V$Q`'IZ,#`R9&%F-C(`>GHP8C@S860S90!Z
+M>C`P,&(V8CDP`'IZ,#$V9#EE9F$`>GHP,39D93`U,0!Z>C`P,#5B-F(R`'IZ
+M,#5B-V8Q,30`>GHP-&%E,#,Q9@!Z>C`R9&)D9&9D`'IZ,#`U-#=F960`>GHP
+M,&(V8F8U90!Z>C`P8C<Q-S=D`'IZ,#!B-S!F,V0`>GHP,39D.#DR,`!Z>C`R
+M9&(Q86(R`'IZ,#`P-6(V,C(`>GHP,#!B-F8W.`!Z>C!B-CEB,#=C`&%T:%]H
+M86Q?9G)E90!Z>C`U8C<Y8C%B`'IZ,#!B-S`W,V0`>GHP,F1B96)B9`!Z>C!B
+M-64S,34R`'IZ,#$V9&9B9C$`871H7VAA;%]M:'HR:65E90!Z>C`Q-F4Q.#EB
+M`'IZ,&1C,F$U8S4`>GHP,#)D8S8P8@!Z>C`V9&8P8CAA`'IZ,#)D8C,S-60`
+M>GHP8C9C-3-A-`!Z>C!F-31D,6(P`'IZ,&(V9F0S-C,`>GHP9#ED8S8R8P!Z
+M>C`U8C<T,64P`'IZ,#)D83EB86,`>GHP9&,R,60S80!Z>C`P8C<Q-S-D`'IZ
+M,#$V9#ED-#$`>GHP,#5B.#1F9`!Z>C`P-6(X86)D`'IZ,#!B-S`Q,C,`>GHP
+M,#5B-C4R8@!Z>C`R9&(S.#<U`'IZ,#$V93,P.6(`>GHP,#5B-C!B,@!Z>C`R
+M9&(Q.#<U`'IZ,#`R9&(X-#(`>GHP,F1B,3<V,P!Z>C!B-V1E83DT`'IZ,#!B
+M-S`Q-C$`>GHP,39D-V0T,0!Z>C`P,39C9#,R`'IZ,#9D93!B.&$`>GHP-F0Y
+M9&0Y,P!Z>C!D8C-E9#@V`'IZ,#`U8C0X960`>GHP,#)D8S@P8@!Z>C`P,F1B
+M8S0R`'IZ,#)D8F$X-3$`>GHP,F1B,S-E9`!Z>C`P-6(X,&9D`'IZ,#`U8C=F
+M,F4`>GHP,F1B9F1F9`!Z>C`Q-F4V-#AA`'IZ,#`R9&%F9C(`>GHP,#5B-S<Y
+M9`!Z>C`P,&(V964X`'IZ,#$V930T.&$`>GHP,&(V9C9B8P!Z>C`Q-F1A.3(P
+M`'IZ,#5B-S@Q93``>GHP,#)D8V$P8@!Z>C`P-6(T-&%D`'IZ,#9D9&8T-&$`
+M>GHP9F%C,&,Y8@!Z>C!B-F8Y969F`'IZ,#!B-F,V8F,`871H7VAA;%]A9&1I
+M=&EO;F%L7W-W8F%?8F%C:V]F9@!Z>C`P,#)D8CDR`&%T:%]H86Q?=F5R<VEO
+M;@!Z>C`R9&)A8S)E`'IZ,#)D8C<Y864`>GHP,#$V934S,@!Z>C!B-F-F,#`Y
+M`'IZ,#`Q-F4Q,F,`>GHP,#$V9#EE-`!Z>C`P,#)D865A`'IZ,#`U8C5C8C(`
+M>GHP,39D83(U,0!Z>C`V9C9A9C8P`'IZ,#9D9F1D.3,`871H7VAA;%]M86QL
+M;V,`>GHP,#!B-F1D,@!Z>C`R9&0Y,F%D`'IZ,#$V9&(R-3$`>GHP93$P-V-A
+M,0!Z>C`P8C9C-S5E`'IZ,#$V9&0P-3$`>GHP,F1B9#%B,@!Z>C`R9&,Q-S8S
+M`'IZ,&(V.3!D-F0`>GHP,39D9C`U,0!Z>C`P,39D.34P`'IZ,#!B-S`V8F,`
+M>GHP,#$V9#@W,@!Z>C`V9&5F-#1A`'IZ,#5B.&,R960`>GHP-F9B.30W8@!Z
+M>C!E8F(Q93-F`'IZ,&(V9CED,#(`>GHP9#$T9#%B,`!Z>C!B-#@P,S%E`'IZ
+M,#$V9&)B9F4`>GHP,39E-30X80!Z>C`P,39D.#4P`'IZ,#`P8C9F9C@`871H
+M7VAA;%]M96UC<'D`>GHP,F1B8V)B9`!Z>C`Q-F1A,&1D`'IZ,#)D8F)D9F0`
+M>GHP,F1B,C@U,0!Z>C`R9&)D8S%D`'IZ,#9D8C!C9C(`>GHP,39E8CEA9`!Z
+M>C`P8C9C96)C`'IZ,&0Y-#@T83$`871H7VAA;%]P<F]B90!Z>C`Q-F5A.6%D
+M`'IZ,&9D-&0Q8C``>GHP,F1B,S<V,P!A=&A?:&%L7V)U:6QD;W!T<P!Z>C`R
+M9&%F,S5D`'IZ,#9D9&1D.3,`>GHP9&%D8S8R8P!Z>C`Q-F1F,C4Q`'IZ,#`P
+M8C9C,3``>GHP,39D.3(U,0!Z>C`R9&(P.#4Q`'IZ,&(W,C%A960`>GHP-C=C
+M9F-A90!Z>C`P,&(V8V8X`'IZ,&,Y-&0Q8C``>GHP,F1A9F%B,@!Z>C`U8CDR
+M865D`'IZ,#`U8CAC8V(`>GHP8C9D.65F9@!Z>C`R9&(Q,6(R`'IZ,#)D8F9F
+M8C$`>GHP,F1B9C<V,P!Z>C`P-6(V.&9D`'IZ,#`U8C0T960`>GHP8C<Q,6%E
+M9`!Z>C!B-64S,38P`'IZ,&0X-#@T83$`>GHP,39D.&(R9`!Z>C`Q-F4P.#EB
+M`'IZ,#)D8F(X-S4`>GHP,F1A93@U,0!Z>C!B.#%E83DT`'IZ,#$V9&5C,68`
+M>GHP,&(V9F5B8P!Z>C!E.#DT.3`W`'IZ,#!B-F5A-V$`>GHP,S-E.&9B9@!Z
+M>C!C9F$U.#<U`'IZ,#)D8CDY864`>GHP,F1B.6%B,@!Z>C`P,&(V8F4X`'IZ
+M,&1E-C@S-V8`>GHP,39D86)F90!Z>C!B-S`Y9#`R`'IZ,#8W9#(U93(`>GHP
+M,3EF,V$P,0!Z>C`W,#,Y-#=B`&%T:%]H86Q?;65M>F5R;P!Z>C`V9&9F8S!D
+M`'IZ,&(V-S4P8C@`>GHP,39E,F1F9`!Z>C`P,&(V9#(R`'IZ,#9F96%F-C``
+M>GHP9&,T835C-0!Z>C`P8C<P9C=D`&%T:%]H86Q?<W=?8F5A8V]N7W)E<W!O
+M;G-E7W1I;64`>GHP.68V-&(V80!Z>C`P-6(V-3=A`'IZ,#9F,SDT-V(`>GHP
+M-F1A,&-F,@!Z>C!B-V)A9#-E`'IZ,#!B-F8Y-C$`>GHP8C8Y-S-B8P!Z>C`R
+M9&)D,S5D`'IZ,#`U8C@X9F0`>GHP,F1B8F,Q9`!Z>C`R9&%F9&9D`'IZ,#9D
+M-V1D.3,`871H7VAA;%]D96QA>0!Z>C`R9&(Q9&9D`'IZ,#8W9#)F-#$`>GHP
+M,F1A9C@W-0!Z>C!B-V5D939D`'IZ,#$V9#AD-#$`>GHP,#)D864Y,@!Z>C!B
+M-V%D939D`'IZ,#)D8F(S-60`>GHP,F1B,V1F9`!Z>C`R9&(U,V5D`'IZ,#$V
+M9&-E864`>GHP,#!B-F1A,@!Z>C`P,&(V93(R`'IZ,#5B.#`P-#$`>GHP,#$V
+M9#@T.`!Z>C`Q-F0Y8C)D`'IZ,#`Q-F4P,F,`>GHP,&(W,#<W9`!Z>C`P-6(V
+M.3=A`'IZ,#`Q-F1A930`>GHP,39E,3`Y8@!Z>C`P-6(T83)D`'IZ,#$V9&4P
+M9&0`>GHP,39D9C!D9`!Z>C!D9C`W8V$Q`'IZ,#)D8F0W-C,`>GHP,#!B-F4U
+M,@!Z>C`V-V0P8S0W`'IZ,#5B-F,V9&(`>GHP8S,Q-65B-0!Z>C!D8C%E9#@V
+M`'IZ,#9D-#`V93``>GHP,39E,#(U,0!Z>C`P,#)D8F(R`'IZ,#`R9&0X-F0`
+M>GHP,#$V93$T9`!Z>C`R9&(U.6%E`'IZ,#`V-V0R,C$`>GHP,39D.#!D9`!Z
+M>C`P-6(X.3-D`'IZ,#5B.#%B,6(`>GHP,F1B,3-E9`!Z>C`P8C9D,3(S`'IZ
+M,#`P8C9C93@`>GHP-6(X86%E9`!Z>C!B-F5D,S8S`'IZ,#)D868Q8C(`>GHP
+M,#`U8C5E,@!Z>C`S,V5B9F)F`'IZ,#5B-C@V9&(`>GHP,#!B-F5F.`!Z>C!B
+M-S$Y865D`'IZ,#`U8C4X8C(`>GHP-6(W9&(Q8@!Z>C!B.#)D939D`'IZ,#`Q
+M-F0W,S(`>GHP,F1A9&%B,@!Z>C!F-#5E-F4S`&%T:%]H86Q?:6YI=%]C:&%N
+M;F5L<P!Z>C`P8C9D-F)C`'IZ,&,Q-&0Q8C``>GHP,#`R9&)D,@!Z>C!D830X
+M-&$Q`'IZ,#$V93!B.#<`>GHP-6(Y,#)E9`!Z>C!D8S)E,SDP`'IZ,&$V,&0Q
+M-#4`>GHP,F1B86)B9`!Z>C`P,&(V8S%D`'IZ,#5B.&5A960`>GHP,#5B-V(Y
+M9`!Z>C`P-6(U-#0V`'IZ,#5B-C0V9&(`>GHP,&(V9CDR,P!Z>C!D9#8X,S=F
+M`'IZ,#$V93$R-3$`>GHP9&,V835C-0!Z>C`R9&(S-S!A`'IZ,#`P-6(V-S(`
+M>GHP-F1E9F,P9`!Z>C`R9&)F,S5D`'IZ,#`P8C9C-S@`>GHP,#$V9#@S,@!Z
+M>C`R9&(U-S!A`'IZ,#`U8C9D-V$`>GHP,#)D8C(Y,@!Z>C`P-6(Y,&-B`'IZ
+M,&(V9C4S-C,`>GHP,#5B-6,T-@!Z>C`V9#DP8V8R`'IZ,#9D.&1D.3,`>GHP
+M,39D9F(X-P!Z>C`P,39D830X`'IZ,&(V-C,Q83@`>GHP,#)D8C`Y,@!A=&A?
+M:&%L7V=E='=I<F5L97-S;6]D97,`>GHP,39E,6(X-P```-@!```!`P``````
+M`-P!```!`P```````.`!```!`P```````.@!```!`P```````/`!```!`P``
+M`````/0!```!`P```````/@!```!`P```````/P!```!`P`````````"```!
+M`P````````0"```!`P```````'0"```!`0````````0$```!>0````````@$
+M```!AP$```````P$```!2````````)`$```!.`$``````"`'```!;```````
+M`%0)```!OP```````+0)```!(0$``````+@)```!`@```````!@*```!(0$`
+M`````!P*```!`@```````"`*```!;````````/0*```!:````````'01```!
+M`0```````.`3```!``$``````.03```!(0$``````.@3```!`@```````&`5
+M```!(0$``````&05```!`@```````.`5```!`@```````.05```!`@``````
+M`$09```!`0```````#P:```!T````````+@>```!`0```````(P@```!(P$`
+M`````&@A```!`0```````&PA```!`0```````-`A```!A@```````$@C```!
+M`0```````$PC```!`0```````&`E```!`0```````&0E```!`0```````%0M
+M```!`@```````%@M```!6P```````%PM```!T````````&`M```!(P$`````
+M`&0M```!`0```````&@M```!`0```````&PM```!`0```````'`M```!A@``
+M`````+PN```!`0```````,`N```!`0```````+PP```!`0```````$@S```!
+M`0```````$PS```!`0```````%`W```!`0```````%0W```!`0```````!@X
+M```!`@```````!PX```!`@````````1````!`0```````/!!```!`0``````
+M`#A&```!`0```````#Q&```!`0```````$!&```!`0```````$1&```!`0``
+M`````$A&```!`0```````(A&```!`0```````-!'```!`0```````-1'```!
+M!````````-A'```!!````````'!(```!`0```````'A(```!!`````````!)
+M```!`0```````'!)```!`0```````'A)```!`0```````'Q)```!`0``````
+M``!*```!`0```````%!*```!!````````,Q*```!`0```````-!*```!`0``
+M`````-1*```!!````````#!+```!!````````#1+```!Z0```````'!+```!
+M!````````$!-```!`0```````$1-```!`0```````$A-```!`0```````%!-
+M```!!````````%1-```!!````````+1-```!#````````*A/```!`0``````
+M`*Q/```!`0```````+!/```!`0```````+1/```!`0```````+A/```!`0``
+M`````,!/```!`0```````,1/```!`0```````,A/```!`@```````-A0```!
+M!````````-Q0```!!````````.!0```!!````````.10```!!````````.A0
+M```!!````````&A2```!!````````&Q2```!`0```````'!2```!`0``````
+M`'12```!`0```````'A2```!(P$``````.Q4```!`@```````/!4```!`0``
+M`````/14```!`0```````%!6```!``$``````#A7```!`0```````#Q7```!
+M``$``````&Q7```!``$``````+!9```!`0```````+Q9```!`0```````&1:
+M```!!````````&A:```!!````````&Q:```!`0```````"1;```!!```````
+M`"A;```!!````````"Q;```!`0```````(Q;```!`0```````)!;```!`0``
+M`````)1;```!`0```````)A=```!T````````)Q=```!`@```````*!=```!
+MZ0```````*1=```!/@$``````+Q=```!,````````,!=```!+0$``````/!?
+M```!?@```````&AA```!`0```````&QA```!+0$``````'1A```!A@``````
+M`)1A```!A@```````$1C```!,@```````$AC```!*P$``````%!C```!9@$`
+M`````%1I```!<@```````(!I```!Z0```````+QI```!Z0```````-AI```!
+M`@```````-QI```!Z0```````$AJ```!2P````````1K```!)P$```````AK
+M```!=P```````(1L```!4@$``````&1N```!Z0```````$QP```!)@``````
+M`%!P```!7@$``````(!P```!)@```````!QQ```!)@```````"!Q```!7@$`
+M`````&1Q```!)@```````)QR```!)@```````*1R```!7@$``````.AR```!
+M)@```````-!S```!&0$``````#QT```!'````````%QT```!.@$``````%!U
+M```!.`$``````%AV```!`0```````%QV```!`0```````&!V```!`0``````
+M`!1W```!$@```````!AW```!]````````!QW```!+`$``````,AW```!.`$`
+M`````$Q]```!``$``````/Q]```!/@$```````!^```!`0```````'B````!
+MN0```````'R````!`@```````("````!B`$``````/"!```!`0```````/B!
+M```!.`$```````2"```!2P````````B"```!EP````````R"```!6```````
+M`!""```!@0```````!B"```!@@$``````!R"```!"@```````"""```!&P$`
+M`````#B#```!`0```````%B#```!`0```````+B#```!^P```````+R#```!
+M`0```````,"#```!.`$``````'2$```!^P```````'R$```!`0```````("$
+M```!.`$``````"B&```!``$``````#2&```!.`$``````$"&```!`0``````
+M`&B&```!2P```````&R&```!EP```````."&```!.`$``````.2&```!2P``
+M`````"")```!$````````&B+```!`0```````&R+```!`@```````'"+```!
+M`0```````&",```!`0```````&2,```!`0```````"B/```!Z0```````"R/
+M```!`@```````#"/```!`@```````#2/```!`0```````#B/```!,```````
+M`+R/```!,````````,B0```!2P```````,R0```!.`$``````-"0```!4P``
+M`````$R1```!:0$``````)"1```!&`$``````,"2```!(P$``````,22```!
+MP````````("7```!I````````(B7```!4@$``````)R9```!.`$``````*"9
+M```!2P```````(2?```!,````````+R@```!T````````,"@```!`@``````
+M`,2@```!Z0```````,B@```!EP$``````-2@```!.`$``````-R@```!`0``
+M`````(RB```!.`$``````)"B```!`0```````)2B```!2P$``````)RB```!
+M`@```````*"B```!>P$``````'RC```!2P$``````("C```!U0```````(2C
+M```!`0```````(BC```!@P$``````)"C```!:`$``````,BC```!(`$`````
+M`,RC```!A@```````+BD```!.`$``````#RF```!X````````%"F```!2P$`
+M`````$2G```!,@```````$BG```!*P$``````%"G```!D`$``````'RN```!
+MS@```````*"N```!Z0```````-RN```!Z0```````/BN```!`@```````/RN
+M```!Z0```````&RO```!2P```````%RP```!Y0```````&2P```!1`$`````
+M`&BP```!.````````+"Q```!"0$``````.RQ```!`@```````'RR```!Z0``
+M`````$RT```!)@```````%"T```!7@$``````("T```!)@```````!RU```!
+M)@```````""U```!7@$``````&2U```!)@```````)RV```!)@```````*2V
+M```!7@$``````.BV```!)@```````%2X```!X0```````)"X```!&0$`````
+M`-BX```!'`````````BY```!.@$``````-"Y```!.`$``````!B[```!`0``
+M`````!R[```!`0```````""[```!`0```````!2\```!O0```````!B\```!
+M"P$``````!R\```!\````````""\```!+`$``````,B\```!2P```````!C"
+M```!``$``````!C$```!EP$``````$#&```!,````````$3&```!!```````
+M`$C&```!`0```````$S&```!`@```````%#&```!`@```````%3&```!`@``
+M`````$3(```!`0```````$S(```!)`$``````%C(```!`0```````%S(```!
+M`0```````$#*```!.`$``````$S*```!2P```````%#*```!'@```````%S*
+M```!$`$``````&S*```!4@```````'3*```!G0```````'C*```!UP``````
+M`'S*```!.0```````+3*```!`0```````/S*```!60$```````#+```!`0``
+M``````3+```!.`$``````-C,```!60$``````.C,```!.`$``````.S,```!
+M`0```````%3.```!``$``````&3.```!$````````&C.```!`0```````&S.
+M```!'@```````'#.```!.`$``````'3.```!`0```````.#.```!.`$`````
+M`.3.```!2P````````30```!C`````````C0```!`@````````S0```!,```
+M`````/C0```!.`$``````/S0```!`0```````!C2```!`0```````"#2```!
+M`0```````.C2```!<@$``````.S2```!`0```````/#2```!`@```````/32
+M```!`0```````$#3```!`@```````$33```!`@```````%#5```!!```````
+M`%36```!!````````%C6```!,````````-S:```!X0```````!S=```!`0``
+M`````"#=```!%0```````"3=```!`0```````/S>```!!0````````#?```!
+M(P$```````3?```!!0````````C?```!!0````````S?```!!0```````!#?
+M```!`0```````!3?```!!0```````!S?```!`0```````!S@```!!0``````
+M`"#@```!!0```````"SB```!%@$``````##B```!`0```````+CD```!`0``
+M`````+SD```!!0```````,#D```!`@```````,CD```!;P```````#SF```!
+M`0```````$#F```!`0```````$3F```!`0```````$CF```!`0```````+SG
+M```!$`````````SI```!`0```````%#I```!`@```````)3J```!`0``````
+M`)CJ```!`0```````)SJ```!`0```````*#J```!`0```````.CK```!`@``
+M`````.SK```!`@```````!CM```!`0```````*SM```!]@```````+3M```!
+M"0$``````.SM```!:0$``````##N```!&`$``````(3O```!(P$``````(CO
+M```!9````````&SP```!`0```````+CT```!*P$``````+ST```!,@``````
+M`,#T```!P@```````-#T```!`0```````.CU```!>`$``````.SU```!.`$`
+M`````"3\```!,`````````C]```!M0```````.#]```!Z0```````.3]```!
+M`@```````/#]```!`@```````$C^```!`@```````$S^```!`@```````%#^
+M```!`@```````,#_```!T````````,3_```!)P```````,C_```!A`$`````
+M`,S_```!`0```````-#_```!C@$``````-C_```!`0```````-S_```!&P``
+M`````.#_```!1````````(0!`0`!C0$``````!0#`0`!C0$``````!P#`0`!
+M`@```````"`#`0`!`@```````"0#`0`!>P$``````"P#`0`!.`$``````#`#
+M`0`!1````````*@$`0`!C0$``````*P$`0`!,@$``````+`$`0`!QP``````
+M`+0$`0`!J````````+@$`0`!BP$``````+P$`0`!<`$``````,`$`0`!'0$`
+M`````,@$`0`!`0```````,P$`0`!@P```````"P%`0`!=````````#`%`0`!
+M10```````#0%`0`!A`$``````#@%`0`!(`$``````#P%`0`!A@```````!@&
+M`0`!.`$``````#P+`0`!K@```````'`+`0`!CP$``````'0+`0`!`0``````
+M`/P+`0`!K@```````*0,`0`!,@```````*@,`0`!*P$``````+`,`0`!E```
+M`````,P.`0`!2P```````"`0`0`!V````````#@9`0`!*`$``````-`9`0`!
+M*`$````````:`0`!Z0```````#P:`0`!Z0```````&`:`0`!Z0```````.P:
+M`0`!Z0```````$P<`0`!`@```````-P<`0`!Z0```````-0?`0`!#@``````
+M`&P@`0`!)@```````'`@`0`!7@$``````*`@`0`!)@```````#PA`0`!)@``
+M`````$`A`0`!7@$``````(0A`0`!)@```````,`B`0`!)@```````,@B`0`!
+M7@$```````0C`0`!)@```````)@D`0`!7@$``````+@D`0`!)0```````.0F
+M`0`!%P```````,`G`0`!%P```````!0H`0`!`@```````!@H`0`!`@``````
+M`-@L`0`!B@```````-PL`0`!&0$``````/@O`0`!`@```````/PO`0`!H0``
+M```````P`0`!'````````$@P`0`!.@$```````PQ`0`!.`$``````%@R`0`!
+M`0```````%PR`0`!`0```````&`R`0`!`0```````(`T`0`!+0```````(0T
+M`0`!K````````(@T`0`!3@$``````(PT`0`!T@```````)`T`0`!%@``````
+M`)0T`0`!6P$``````)@T`0`!V0```````)PT`0`!Y````````*`T`0`!+`$`
+M`````$@U`0`!2P```````)0U`0`!,0```````)@U`0`!W0```````,0U`0`!
+MA0```````%0Z`0`!D@```````)0[`0`!A`$``````)@[`0`!``$``````%P]
+M`0`!RP```````&`]`0`!W0```````&0]`0`!"P```````'@]`0`!7P``````
+M`'P]`0`!30```````(`]`0`!C@$``````+@_`0`!`@```````+P_`0`!.`$`
+M`````,`_`0`!`@```````-`_`0`!%`$``````-!!`0`!6@```````-1!`0`!
+M0P$``````-A!`0`!F````````-Q!`0`!"`$``````.!!`0`!1@$``````.A!
+M`0`!)0```````'Q#`0`!L@```````(!#`0`!-````````(1#`0`!7@``````
+M`%!$`0`!.`$``````%Q&`0`!3P```````&!&`0`!C0```````&Q&`0`!N@``
+M`````'1&`0`!2P```````'A&`0`!G````````(A&`0`!%@$``````-A'`0`!
+M0P```````-Q'`0`!+@```````.!'`0`!1P```````.A'`0`!2@```````.Q'
+M`0`!7`$``````(Q)`0`!``$``````)!)`0`!F0$``````)Q)`0`!.`$`````
+M`*!)`0`!L@```````.!*`0`!.`$``````.1*`0`!6@```````.Q*`0`!F```
+M`````/!*`0`!"`$``````/A*`0`!2@```````/Q*`0`!7`$``````+1+`0`!
+M`0```````.Q+`0`!A`$``````/!+`0`!`0```````,1-`0`!`0```````,A-
+M`0`!A`$``````*A.`0`!.`$``````!Q0`0`!``$``````#!0`0`!$```````
+M`#10`0`!;````````$A1`0`!RP```````%!1`0`!`0```````/Q1`0`!.`$`
+M``````!2`0`!2P````````12`0`!A`$``````(A3`0`!:0```````(Q3`0`!
+M`0```````+Q4`0`!,````````!Q7`0`!;````````&!:`0`!#@```````*1;
+M`0`!Q0```````.!=`0`!6P```````.1=`0`!`@```````.A=`0`!`@``````
+M`!!@`0`!$````````"!B`0`!;````````'!B`0`!6@```````.AC`0`!(P$`
+M`````.QC`0`!`@```````/!C`0`!`0```````'1E`0`!`0```````&!G`0`!
+M%0```````&1G`0`!`0```````"AI`0`!%@$``````"QI`0`!`0```````+QJ
+M`0`!`0```````$!L`0`!`@```````$1L`0`!`0```````.!M`0`!Z0``````
+M`-1N`0`!6`$``````&QO`0`!$````````.QP`0`!6`$``````/!P`0`!`0``
+M``````AR`0`!`@````````QR`0`!`@```````/1R`0`!`0```````#1T`0`!
+M`0```````#AT`0`!`0```````#QT`0`!`0```````$!T`0`!`0```````&AU
+M`0`!`@```````&QU`0`!`@```````'QV`0`!`0```````!1W`0`!,```````
+M`)AX`0`!7````````)QX`0`!:`````````1Z`0`!V````````%!Z`0`!:0$`
+M`````)1Z`0`!&`$``````/1[`0`!(P$``````/A[`0`!5P```````,Q\`0`!
+M`0```````*"``0`!*P$``````*2``0`!,@```````*B``0`!P@```````&R!
+M`0`!`0```````%"#`0`!F0$``````%2#`0`!.`$```````B.`0`!A0$`````
+M`%R.`0`!A0$``````$B/`0`!A0$``````+B0`0`!(P$``````,B0`0`!,0``
+M`````!21`0`!A0```````#B6`0`!=````````#R6`0`!=`$``````$"6`0`!
+MW````````$B6`0`!,0```````"27`0`!A0$``````(R8`0`!H0```````)"8
+M`0`!(0$``````'B9`0`!(0$``````'R9`0`!H0```````#R;`0`!`0``````
+M`$";`0`!H0```````$2;`0`!=`$``````$B;`0`!W````````$R;`0`!`0``
+M`````(R;`0`!`0```````)";`0`!=`$``````)2;`0`!W````````'B<`0`!
+MA0$``````("<`0`!`0```````(2<`0`!`0```````(B<`0`!`0```````""=
+M`0`!`0```````"2=`0`!`0```````"B=`0`!`0```````.2=`0`!H0``````
+M`&R@`0`!`0```````'"@`0`!`0```````'2@`0`!A0$``````(B@`0`!`0``
+M`````(R@`0`!`0```````)"@`0`!`0```````-2A`0`!`@```````-BA`0`!
+M.`$``````-RA`0`!`@```````."A`0`!`@```````$2C`0`!C````````$BC
+M`0`!`@```````$RC`0`!,````````,"I`0`!`@```````,2I`0`!>@``````
+M`,BI`0`!.`$``````,RI`0`!`@```````-"I`0`!`@```````-2I`0`!`@``
+M`````-BI`0`!`@```````-RI`0`!`@```````(RJ`0`!$````````("M`0`!
+M(P$``````(2M`0`!`0```````)2N`0`!`0```````/"O`0`!`0```````/2O
+M`0`!6`$``````/BO`0`!`0```````/RO`0`!`0```````.RP`0`!6`$`````
+M`$BQ`0`!A@```````+2Q`0`!`@```````+BQ`0`!`@```````$BR`0`!T```
+M`````$RR`0`!`0```````%"R`0`!`0```````%2R`0`!`0```````%BR`0`!
+M`0```````%RR`0`!`0```````&"R`0`!`0```````&2R`0`!`0```````&BR
+M`0`!`0```````%2S`0`!`@```````%BS`0`!.`$``````%RS`0`!`@``````
+M`&"S`0`!`@```````#RU`0`!,````````%2V`0`!,````````'RZ`0`!`@``
+M`````("Z`0`!`@```````(2Z`0`!`@```````(BZ`0`!`@```````(RZ`0`!
+M>@```````'R\`0`!>@```````("\`0`!`@```````(B\`0`!`@```````(R\
+M`0`!.`$``````)"\`0`!`@```````(2]`0`!.`$``````(B]`0`!`@``````
+M`(R]`0`!`@```````)"]`0`!`@```````'#``0`!`0```````'3``0`!Z0``
+M`````'C``0`!`0```````(S"`0`!Z0```````)#"`0`!`0```````)3"`0`!
+M`0```````)C"`0`!`0```````&#$`0`!`0```````&3$`0`!`0```````&C$
+M`0`!`0````````C%`0`!`0```````&S%`0`!$`````````#'`0`!`0``````
+M`,C)`0`!A@```````$S,`0`!`0```````%#,`0`!$````````+C,`0`!`0``
+M`````$3-`0`!`0```````/#-`0`!T````````/3-`0`!`0```````/C-`0`!
+M`0```````/S-`0`!`0````````#.`0`!`0````````3.`0`!`0````````C.
+M`0`!`0````````S.`0`!`0```````!#.`0`!(@```````/3.`0`!`@``````
+M`/C.`0`!.`$``````/S.`0`!`@````````#/`0`!`@```````-S0`0`!,```
+M`````/31`0`!,````````*#4`0`!`@```````*34`0`!`@```````*C4`0`!
+M`@```````*S4`0`!`@```````+#4`0`!>@```````+34`0`!`@```````+C4
+M`0`!.`$``````(C7`0`!`0```````(S7`0`!$````````.S7`0`!$```````
+M`!3:`0`!`0```````!C:`0`!`0```````!S:`0`!`0```````+#=`0`!`0``
+M`````"#>`0`!A@```````,#@`0`!`0```````,3@`0`!`0```````,C@`0`!
+M$````````#CA`0`!`0```````#SA`0`!`0```````,3A`0`!`0```````(SB
+M`0`!T````````)#B`0`!`0```````)3B`0`!`0```````)CB`0`!`0``````
+M`)SB`0`!`0```````*#B`0`!`0```````*3B`0`!`0```````*CB`0`!`0``
+M`````*SB`0`!(@```````)3C`0`!`@```````)CC`0`!.`$``````)SC`0`!
+M`@```````*#C`0`!`@```````'3E`0`!,````````)3F`0`!,````````!SI
+M`0`!`@```````"#I`0`!`@```````"3I`0`!`@```````"CI`0`!`@``````
+M`"SI`0`!>@```````##I`0`!,````````+#J`0`!>@```````+3J`0`!`@``
+M`````+CJ`0`!`@```````+SJ`0`!.`$``````,#J`0`!`@```````,3J`0`!
+M`@```````,CJ`0`!`@```````*CM`0`!`0```````*SM`0`!$`````````SN
+M`0`!$````````#3P`0`!`0```````#CP`0`!`0```````#SP`0`!`0``````
+M`-#S`0`!`0```````$#T`0`!A@````````#W`0`!`0````````3W`0`!`0``
+M``````CW`0`!$````````'CW`0`!`0```````'SW`0`!`0````````3X`0`!
+M`0```````,SX`0`!T````````-#X`0`!`0```````-3X`0`!`0```````-CX
+M`0`!`0```````-SX`0`!`0```````.#X`0`!`0```````.3X`0`!`0``````
+M`.CX`0`!`0```````.SX`0`!(@```````,`````!#P$``````,0````!9@``
+M`````,@````!PP```````,P````!M@```````-`````!?0$``````-0````!
+MU@```````-@````!50```````-P````!X@```````.`````!HP```````.0`
+M```!>@$``````.@````!30$``````.P````!P````````/`````!/P``````
+M`/0````!AP```````/@````!6````````/P````!(0`````````!```!:P$`
+M``````0!```!E`$```````@!```!+P````````P!```!CP```````!`!```!
+M2@$``````!0!```!*@```````!@!```!/0```````!P!```!:@```````"`!
+M```!@0$``````"0!```!?`$``````"@!```!'`$``````"P!```!MP``````
+M`#`!```!8@$``````#0!```!90$``````#@!```!#`$``````#P!```!WP``
+M`````$`!```!/P$``````$0!```!DP```````$@!```!=0$``````$P!```!
+MP0```````%`!```!N0```````%0!```!B````````%@!```!L0```````%P!
+M```!5@```````&`!```!R@```````&0!```!.P$``````&@!```!$0$`````
+M`&P!```!IP```````'`!```!-@$``````'0!```![````````'@!```!7P$`
+M`````'P!```!3P$``````(`!```!+@$``````(0!```!,P```````(@!```!
+MN````````(P!```!70$``````)`!```!'@$``````)0!```!)P$``````)@!
+M```!/@```````)P!```!=P```````*`!```!1P$``````*0!```!YP``````
+M`*@!```!4````````*P!```!-P```````+`!```!C@```````+0!```!"```
+M`````+@!```!^````````+P!```!0`$``````,`!```!-P$``````,0!```!
+M^0```````,@!```!@@$``````,P!```!:P```````-`!```!"@```````-0!
+M```!9P$``````-@!```!KP```````-P!```!$@$``````.`!```!&P$`````
+M`.0!```!<0$``````.@!```!-0$``````.P!```!J0```````/`!```!1@``
+M`````/0!```!,`$``````/@!```!%````````/P!```!O@`````````"```!
+M<@````````0"```!^P````````@"```!_0````````P"```!5`$``````!`"
+M```!9@$``````!0"```!@`$``````!@"```!#P```````!P"```!40$`````
+M`"`"```!)0$``````"0"```!#@$``````"@"```!I````````"P"```!4@$`
+M`````#`"```!`0```````#0"```!D@$``````#@"```!+0$``````$`"```!
+M70$``````$0"```!'@$``````$@"```!)P$``````$P"```!/@```````%`"
+M```!=P```````%0"```!`0```````,P6```!2`$``````-`6```!:`$`````
+M`-06```!6@$``````-@6```!?P$``````-P6```!90```````.`6```!>```
+M`````.06```!E@```````.@6```!;P```````.P6```!#0```````/`6```!
+M-@```````/06```!8P```````/@6```!9````````/P6```!.@`````````7
+M```!;@$```````07```!$`$```````@7```!B@$```````P7```!A```````
+M`!`7```!>`$``````!07```!!0$``````!@7```!K0```````!P7```!*@$`
+M`````"`7```!(P```````"07```!"@$``````"@7```!&@```````"P7```!
+M:@$``````#`7```!Z@```````#07```!(````````#@7```!*P```````#P7
+M```!L````````$`7```!?@$``````$07```!;`$``````$@7```!>0$`````
+M`$P7```!/`$``````%`7```!]0```````%07```!`@$``````%@7```!\0``
+M`````%P7```!%0$``````&`7```!@````````&07```!FP```````&@7```!
+M=@```````&P7```!3`$``````'`7```!H@```````'07```!00```````'@7
+M```!/0$``````'P7```!.0$``````(`7```!?````````(07```!.P``````
+M`(@7```!4`$``````(P7```!X````````)`7```!,0$``````)07```!Y@``
+M`````)@7```!Q@```````)P7```!Y0```````*`7```!1`$``````*07```!
+MT0```````*@7```!.````````*P7```!8@```````+`7```!VP```````+07
+M```!20$``````+@7```!5P$``````+P7```!*0$``````,`7```!'0``````
+M`,07```!70```````,@7```!,P$``````,P7```!DP$``````-`7```!20``
+M`````-07```!G0```````-@7```!8P$``````-P7```!UP```````.`7```!
+M!P$``````.07```!'P```````.@7```!_@```````.P7```!.0```````/`7
+M```!`P$``````/07```![@```````/@7```!D````````/P7```!*```````
+M```8```!40````````08```!E0````````@8```!W@````````P8```!S@``
+M`````!`8```!60$``````!08```!S0```````!@8```!5`$``````!P8```!
+MD`$``````"`8```!!P```````"08```!I0```````"@8```!<P```````"P8
+M```!;0```````#`8```!\@```````#08```!]@```````#@8```!"0$`````
+M`#P8```!`0```````$`8```!+P$``````$08```!2P$``````$P8```!Q@``
+M`````%`8```!Y0```````%08```!1`$``````%@8```!T0```````%P8```!
+M.````````&`8```!`0```````/PU```!7``````````V```!@P````````0V
+M```!=@$```````@V```!;@````````PV```!10```````!`V```!V@``````
+M`!0V```!NP```````!@V```!'P$``````!PV```!K@```````"`V```!5```
+M`````"0V```!H````````"@V```!5P```````"PV```!!@$``````#`V```!
+M80$``````#0V```!C0```````#@V```!`0$``````#PV```!Z````````$`V
+M```!F0$``````$0V```!CP$``````$@V```!O````````$PV```!?P``````
+M`%`V```!)@$``````%0V```!*0```````%@V```!8`$``````%PV```!50$`
+M`````&`V```!B0```````&0V```!9`$``````&@V```!8````````&PV```!
+M0@$``````'`V```!!`$``````'0V```!_P```````'@V```!$P```````'PV
+M```!;P$``````(`V```!?0```````(0V```!XP```````(@V```!=`$`````
+M`(PV```!W````````)`V```!F0```````)0V```!-`$``````)@V```!_```
+M`````)PV```!$0```````*`V```!GP```````*0V```!"0```````*@V```!
+MF@```````*PV```!00$``````+`V```!LP```````+0V```!ZP```````+@V
+M```!0````````+PV```!(@$``````,`V```!I@```````,0V```!M```````
+M`,@V```!&@$``````,PV```!3@```````-`V```!10$``````-0V```!4P$`
+M`````-@V```!%P$``````-PV```!E0$``````.`V```!2@```````.0V```!
+MR0```````.@V```!JP```````.PV```!A0$``````/`V```!30```````/0V
+M```!D0```````/@V```!B0$``````/PV```!J@`````````W```!SP``````
+M``0W```!0P````````@W```!3`````````PW```!+@```````!`W```!0@``
+M`````!0W```!/````````!@W```![0```````!PW```!1P```````"`W```!
+M@@```````"0W```!-0```````"@W```!-````````"PW```!&0```````#`W
+M```!=0```````#0W```!^@```````#@W```!<````````#PW```!*`$`````
+M`$`W```!A`$``````$0W```!TP```````$@W```!5`$``````$PW```!E```
+M`````%`W```!D0$``````%0W```!$P$``````%@W```!U````````%PW```!
+M)````````&`W```!=P$``````&0W```!<0```````&@W```!V````````&PW
+M```!R````````'`W```![P```````'0W```!C0$``````'PW```!&@$`````
+M`(`W```!3@```````(0W```!10$``````(@W```!4P$``````(PW```!%P$`
+M`````)`W```!E@$``````)@W```!`0````````P````!`P```````!`````!
+M`P```````!0````!`P```````!@````!`P```````!P````!`P```````"``
+6```!`P```````"0````!`P``````````
+`
+end
diff --git a/sys/contrib/dev/ath/public/sh4-le-elf.inc b/sys/contrib/dev/ath/public/sh4-le-elf.inc
new file mode 100644
index 0000000..c20be96
--- /dev/null
+++ b/sys/contrib/dev/ath/public/sh4-le-elf.inc
@@ -0,0 +1,62 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/sh4-le-elf.inc#1 $
+#
+
+#
+# Compilation configuration for building little-endian SuperH/ELF.
+#
+
+#
+# Built with pre-packaged tools for RedHat 7.3:
+#
+# http://mirror.sh-linux.org/rpm-index-2003/i386/ByName.html`
+# binutils-sh-linux-2.13.90.0.18-1
+# gcc-sh-linux-3.2.3-3
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/sh-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+LDOPTS= -EL
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+COPTS+= -ml -m4 -mno-implicit-fp
diff --git a/sys/contrib/dev/ath/public/sh4-le-elf.opt_ah.h b/sys/contrib/dev/ath/public/sh4-le-elf.opt_ah.h
new file mode 100644
index 0000000..de94323
--- /dev/null
+++ b/sys/contrib/dev/ath/public/sh4-le-elf.opt_ah.h
@@ -0,0 +1,7 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
diff --git a/sys/contrib/dev/ath/public/sparc-be-elf.hal.o.uu b/sys/contrib/dev/ath/public/sparc-be-elf.hal.o.uu
new file mode 100644
index 0000000..c18d2b7
--- /dev/null
+++ b/sys/contrib/dev/ath/public/sparc-be-elf.hal.o.uu
@@ -0,0 +1,5504 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/COPYRIGHT#1 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`0`````````````!``(````!`````````````PVD```````T````
+M```H``T`"@``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````D2H@$)$R(!`#````@*(@6`*``%Z"$&``@*(@6#2``!\#
+M```$@*(@&Q2``!"`HB!2@*(@&C:``%0#````@*(@$A2``"N`HB`3@*(@$3:`
+M`$<#````@*(@!R*``$(#````$(``2H(0(``"@`!"@*(@4C2```:`HB!7`P``
+M`((08``0@``T@*(@'"*``#L#````$(``/H(0(`""$&$'@*(``0*``#`#````
+M%(``%0,```0#````@*(@D0*``#2"$&``@*(@D12```@#```$@@(_>H"@8`$X
+M@``M@A`@`!"``"@#````@A!@%("B``$B@``F`P```!"``"6"$"``FA!A$X"B
+M``TB@``@`P```!2```@9```\@A!A$H"B``$B@``3`P```!"``!F"$"``FA,@
+M$P,```"`H@`-`H``%((08`":$R$;`P```((08`"`H@`-`H``#@$````0@``,
+M@A`@`!"```J"$&``$(``"((08``#````$(``!8(08``0@``#@A!@`((08`"!
+MP^`(D!```9WCOYBQ+B`0L38@$`,```6"$&*,@AX``8"@``&:8#__`P``*8(0
+M8R>"'@`!@*```8)@/_^`DT`!,H``")$N8!`#```$@A!@MX"F``$2@``%D!`@
+M`)$N8!!___^&D3(@$(''X`B1Z``(G>._F)(0`!F4$``:EA``&Y`0`!BQ+B`0
+ML38@$("F(@<"@`!$F!``'("F(@<4@``4`P``!("F(!(4@``*@*8@$X"F(!$V
+M@``WD2H@$("F(`<B@``YD2H@$!"``#N0$"```H``*X(&/^:`H&`".(``-I`0
+M(``0@``FD!`@$YH081.`I@`-(H``(Y$J(!`T@``/`P``/)H080>`I@`-(H``
+M)I$J(!`$@``6@A!@%`,```2"$&$2@*8``2*``!J1*B`0$(``(9`0(`":$&$;
+M@*8`#2*``!21*B`0-(``"`,``#^"$&`3@*8``2*```J1*B`0$(``%9`0(`""
+M$&,9@*8``3*``!&0$"``D!`@$Y$J(!!`````D3(@$!"```Z`HB``0````)$R
+M(!`0@``*@*(@`)$J(!!`````D3(@$!"```6`HB``@A`@`<(C``"`HB```H``
+M$`$```#"$B'(PC(@",(2(<K",B`*P@(AS,(B(!S"$B'0PC(@(,(2(=+",B`B
+MPA(AU,(R("3"$B'6PC(@)H''X`B1Z``(TB(AV('#X`B0$"`!G>._F*(0`!B@
+M$"``D!``$4````"2$``9D`H`&H"B`!L"@``)L!`@`4````"0$"`*H`0@`8"D
+M(^<DO__VD!``$;`0(`"!Q^`(@>@``)H0(`"`HT`)&H``"9@0(`":`T`-@@H@
+M`9H30`&8`R`!@*,`"0J___N1,B`!@</@")`0``V=X[^8EA``&)@0`!NW+N`0
+MMS;@$((&P!N"`$`;@RA@`H(`0!G@$&`F@*0@``*``'RP$"``FRL@$)LS8!""
+M`T`-@@!`#8,H8`*"`$`9P@A@)8"@8`(B@``F`P``!!2```>`H&`#@*!@``*`
+M``J`IR``$(``:8(0(``"@`!0@*!@!`*``%F1+"`"$(``8X(0(``"@``,MA`@
+MP(,K(!"#,&`0F@!``9H#0`&;*V`"F@-`&<(+8"F`H&``,H```K80(&"#+J`#
+MD2Z@")`B``&1*B`"D`(``9$J(`-`````DA``$((&P`@0@`!,@@!@"H(08C3"
+M`L`!@*!@`"*``!$#```$PE!@`H"@8``V@``-`P``!)$L(`1`````DA`CZ)(0
+M``B#+J`#D`!`"$````"0`B`5@RH@!!"``#B"`&"0@A!B-/`"P`&`IB```H``
+M$I$L(`+:%B`"`P``$("+0`$"@``-`0```)$L(`-`````DA`CZ)(0``B#+J`#
+MD`!`"$````"0`B`5@RH@`Q"``"."`&!(0````)(0(^B2$``(@RZ@`Y``0`A`
+M````D`(@%8,J(`(0@``9@@!@))$L(`-`````DA`CZ)(0``B#+J`#D`!`"$``
+M``"0`B`5@RH@`A"```Z"`&`60````)(0(^B2$``(@RZ@`Y``0`A`````D`(@
+M%9$J(`*`I"/G"(```X("(+V"`B!<@RA@$+$P8!"!Q^`(@>@``,(28`*`B&`@
+M$H``%I`0(`+"$F`"@@A@T("@8,`"@``1D!`@`\(28`*""&#0@*!@T`*```R0
+M$"`$PA)@`H"(8!`2@``(D!`@`<(28`*""&@`@*```9!`/_^0"C_[D`(@!8'#
+MX`@!````G>._F(".H(`"@``*@(ZA`("F:;0"@`!4D!`@#H"F:;,H@``CD`9V
+MF1"``$>0!G8P`H``&8"F:;1`````D!``&("B(``"@``)@@ZA0`,___N"$&"S
+M@@9``8"@8#`(@``G@RY@`H(.H4"`H``!FD`@``,```2"$&.(@*!`&8)@/_^`
+MBT`!,H``-I`&<&`0@``R$3__^P*``#20$"`.@*9ILQB```8#```$D`9VF4``
+M``"2$"`%,(``+((08X>`ID`!&(``)1$___M`````D!``&("B(``"@``6`P``
+M!`,___N"$&"S@@9``8"@8#`X@``0`P``!(,N8`*"`$`9M`!``9`0`!E`````
+MDA`@!0,__\^`HB`"`H``!((08PT#/__/@A!C"!"```Z0!H`!@A!C)("F0`$H
+M@``$D`9V,!"```B0!G!@0````)(0(!00@``&D`(@#Y`2('B0!D`(0````)(0
+M(`6!Q^`(D>@`")WCOY@#```$@A!B--(&``&`HF```H``"I`0`!A``````0``
+M``,```""$&``T@A`"$````"0$``9,(``!H(&0!F"`$`9@RA@`H(@0!F0`$`!
+M@<?@")'H``B=X[^8`P``!((08C32!@`!@*)@``*```F0$``80`````$````#
+M````@A!@`-((0`@0@``$D!``&9`0`!F2$"`60`````$```"!Q^`(D>@`")WC
+MOYC"#F`$@*!@`!*``"ZD$"``FA`__X(&0!*D!*`!@*2@'P2___W:*&`$I!`@
+M`,(&0`"`I(`!%H``(Z`$@!*@!``2H2P@`J`$`!G:#"`HX@P@*X(+8/^"!D`!
+MY"A@!,(,("F:$T`!F@M@_YH&0`WD*V`$H@Q@_Y`0`!B2$``9E!`@#I80`!%`
+M````F!`@`-`T("R0$``8DA``&900(`Z6$``10````)@0(`'0-"`NI`2@`<(&
+M0`"`I(`!!K__X:`$@!*!Q^`(@>@``("B8"(8@`!EF`(AX(,J8`(;````FA-@
+M`,(#0`&!P$```0```!"``%K"$B((P@,``(,P8`>""&`!@*```1"``%B"8#__
+M$(``4L(3(`H0@`!0PA,@",(#```0@``*@S!@#L(#``"#,&`/@@A@`8"@``$0
+M@`!#@D`__\(#``"#,&`=@@A@`1"``#Z"(``!P@,``!"___R#,&`<P@,``!"_
+M__F#,&`;$(``.L("(?B`HJ`!(H``-\)2(?P*@``Y@A`@`("BH`("@``&@**@
+M`R*``##"`B(`$(``,H(0(`T0@``LPA(A_L(#```0O__F@S!@#<(#```0O__C
+M@S!@#,(#```0O__@@S!@%\(#```0O__=@S!@"L(#```0O__:@S!@"8"BH`$"
+M@``+`P``!"J```?"`P``@**@`B*```B"$&)($(``%X(0(`T0O__.@S!@"!"`
+M``B"$&),$(``#<(2``$0@``/@A`@#0,```2"$&)HP@(``8"@``&"8"``@@A_
+M\Q"```>"`&`-P@,@%,(BP``0@``#@A`@`((0(`R!P^`(D!```8"B8!DB@``3
+M@**@`1B```:`HF`>@*)@#P*```:`HR``,(``(`*``!J`HR``,(``'8"BH`,2
+M@``;@*,@`("BX`08@``8@*,@`!"``!36(B(``H``!8"BH`("@``)@*,@`#"`
+M`!"`H``+FD`@``,```2"$&),$(``"=HB``$#```$@A!B2!"```76,@`!`P``
+M!((08FC6(@`!$(``!I`0(`$"@``#@A`@#,(C``"0$"``@</@"`$```"=X[^8
+MI!``&+`0`!J`IN`'"(``'J80(`"#+.`"X!9``8(&0`'B$&`"@RP@$((00!'"
+M)@``L`8@!+8&__R0$``20````)(0`!#0)@``L`8@!*`$(`2V!O_\@*1`$()@
+M/_^`IN`#&(```YH0(`&:$"``@(A`#1*___.0$``2@*;@!QB__^:F!.`!L"8`
+M&H''X`B!Z```G>._F)`0`!B`IF`-`H``$Y(0`!J`IF`-%(``!X"F8!V`IF``
+M`H``"H(&(<@0@``DL!`@``*```Z`IF`>`H``$X"FX``0@``>L!`@`,(G```0
+M@``,@A`@$-0'``!____$U@=``!"``!70)T```P``!((08E""!@`!PB<``((0
+M(!@0@``.PB=``!*```B`IN`$@A`@!,(G0`#:!P``P@8B!!"```;"(T``$H``
+M!;`0(`#"!H``PB(B!+`0(`&!Q^`(@>@``,("8`2`H&```H``8I`0(`#"`H``
+MPB)``,("H`3"(F`(P@*@",(B8`S"`J`,PB)@$,("H!"`H'__`H``!H"@8/\X
+M@``%@A`@_Q"```3"(F`4@A`@`L(B8!3"`J`4@*!__P*``!"`H&0`"(```YH0
+M``&:$"0`@A`@`8"@0`T:@``*PB)@&((`0`&"$&`!@*!`#2J___Z"`$`!$(``
+M`\(B8!C"(F`8P@*@&("@?_\"@``0@*!D``B```.:$``!FA`D`((0(`&`H$`-
+M&H``"\(B8!R"`$`!@A!@`8"@0`TJO__^@@!``1"```3"(F`<@A`C_\(B8!S"
+M$J`<@*!@``*```?:$J`<@*!@#SB```*:$"`/$(``!-HR8"""$"`*PC)@(,(2
+MH!Z`H&```H``!]H2H!Z`H&`/.(```IH0(`\0@``$VC)@(H(0(`K",F`BP@*@
+M(,(B8"3"`J`DPB)@*,("H"C"(F`LP@*@+,(B8##"`J`$@*!@!!*```>0$"`!
+MP@)@!("@8`$B@``#PB)@.)`0(`&!P^`(`0```,("H`2`H&```H``'Y`0(`#"
+M`J`,PB)@",("@`#"(D``P@*@",(B8`3"`J`,PB)@",("H!#"(F`,P@*@%,(B
+M8!#"`J`8PB)@%,("H!S"(F`8PA*@(,(R8!S"$J`BPC)@'L("H"3"(F`@P@*@
+M*,(B8"3"`J`LPB)@*,("H##"(F`LD!`@`8'#X`@!````G>._F*00`!B0$``8
+M0````)(0`!FB$``(@*(@``*``!FP$"``PE(@%H"@8``R@``1PA(@%I`0`!)`
+M````DA``&:`"``C"!*'`D!``$I_`0`"2$``1`P```((08`#"$$`0D`(``9$J
+M(!`0@``&L3H@$-H2(!B"`$`-@RA@$+$X8!"!Q^`(@>@``)WCOYBZ$"``K!`@
+M`+@0(`"D$"```P``!((08C#"!@`!@*2``1J``#^J$"```P```*X08`"#+*`&
+M@@8``:(`8C#"5&`6@*!@`!:``"[@%&`6D!``&$````"2$``1IA``"(("``CH
+M%<`!H`0`%,(&(<"0$``8G\!``)(0`!'"%&`"@(AA``*``!"0`@`0FRH@$(,O
+M(!"`H$`-)(``&Z0$H`&X$``(P@8AP)`0`!B?P$``DA``$<(48!:0`@`!$(``
+M$:HE``B;*B`0@R]@$("@0`TD@``-I`2@`;H0``B@!,`3P@8AP)`0`!B?P$``
+MDA``$<(48!:0`@`!PA7`$*P@0`BD!*`!`P``!((08C#"!@`!@*2``0J__\F#
+M+*`&I!`@`(,M8!"A.&`0@RV@$*<X8!"#+*`&@@8``:(`8C#"5&`6@*!@`#:`
+M``^D!*`!P@8AP)`0`!B?P$``DA``$9$J(!"1.B`0PA1@`H"(80`2@``#F@(`
+M$)H"`!/:-&`8I`2@`8"DH#\$O__L@RR@!H''X`B!Z```G>._F-H6```#````
+MI!!@``,```R"$&`!@*-``0B```2P$"```P```*008`"#+J`0M3!@$(,N8!"S
+M,&`0@@8`&.(4@`&0$``10````)(0`!J@$``(D!`@9)`B`!%`````DA``&:`$
+M``B0$``00````)(0(&30-L``L`8@`8"F(`H$O__OM@;@`H''X`B!Z```@A``
+M")@0``F3*F`0DS)@$("B8/\"@``BD!`@_]H00``#```,@A!@`H"C0`$8@``4
+M@RL@$)LP8!"`HV`^"(``"H,P8!"#*V`"@@!`#1L```6:$V$B@@!`#8,H8!`0
+M@``0D3!@$)LH8`*:`T`!F@-`#0,```00@``'@A!C[(,P8!";*&`"F@-``0,`
+M``2"$&+`F@-``9LK8!"1,V`0@</@"`$```""$``(F!``"9,J8!"3,F`0@*)@
+M_P*```V0$"#_VA!``((#*6"#*&`0D3!@$`,```R"$&`"@*-``0B```2"`RC\
+M@RA@$)$P8!"!P^`(`0```)WCOY#:%D```P``#X(08_^`HT`!"(``"Z00`!C"
+M%F`N@*!@``*```@#```,PA9@%H"@8``"@`">L!`@`=H60``#```,@A!@`H"C
+M0`$(@``@HA`@`,(687:`I$`!%H``DZ`0(5"2$``0H`0@`9,J8!"3,F`0P@2A
+MH)`0`!*?P$``E`>_]H"B(``"@`")L!`@`)@$0!&8`P`9VA>_]H,K8!"#,&`8
+MPC,A8IH+8/_:,R%DH@1@`L(687:`I$`!!K__ZY(0`!`0@`!MHA`@`*`0(0'"
+M!*&@D!``$I(0(0"?P$``E`>_]H"B(``"@`!QL!`@`-H7O_:;*V`0@S-@&<(V
+M86*#,V`2@@A@?\(V862;,V`+F@M@?]HV86:2$``0H`0@`9,J8!"3,F`0P@2A
+MH)`0`!*?P$``E`>_]H"B(``"@`!<L!`@`-H7O_:;*V`0F3-@&\(686:"$$`,
+MPC9A9H,S8!2""&!_PC9A:)LS8`V:"V!_VC9A:I(0`!"@!"`!DRI@$),R8!#"
+M!*&@D!``$I_`0`"4![_V@*(@``*``$6P$"``VA>_]ILK8!"9,V`=PA9A:H(0
+M0`S"-F%J@S-@%H((8'_"-F%LFS-@#YH+8'_:-F%NDA``$*`$(`&3*F`0DS)@
+M$,($H:"0$``2G\!``)0'O_:`HB```H``+K`0(`#:%[_VFRM@$)DS8!_"%F%N
+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
+MPE=@#(,H8`+"-J`.PA=@!,(VH`3"%J`"NA```8,H8!"#,&`0@*(``1J``!ZP
+M$"`!@RL@$)\P8!"#+V`0LS!@$+LN(!"[-V`0M@=`';8&P!J[+V`"N@=`#[H'
+M0!VZ!T`-^%=@-+@'`!S"%N`,@@!`',(VX`["%N`"^A=@#((`0!W"-N`$@@8@
+M`;`0``&#*&`0@S!@$("@0!D*O__KNRX@$((#(`&8$``!@RA@$(,P8!"`H$`*
+M"K__R;LK(!""!"`!H!```8,H8!"#,&`0^A)@%("@0!T*O_^JNRP@$(''X`B1
+MZ"`!G>._D((0(`3"-[_P@A`@!L(WO_*"$"`)PC>_]((0(`S"-[_VIA`@`$``
+M``"0$"04@*(@``*``'N@$``(PA9@%H"@8``"@``EY!9@T$````"2$"04PA9@
+M:,(T(!:0$``8DA``&900`!"6$``2F!`@"G___2.:$"``@*(@``*``&6`I"``
+MH@9M9,(68&C"-&`6D!``$7___O>2$``0D!``&)(0`!!___]5E!``$8"B(``"
+M@`!8@*0@`,(4(!J"`$`!@@>``=(0?^Y`````T!0@%*0$@`BD!*`%PA9@&H"@
+M8``B@``IPA9@')`0`!!`````DA`D%,(68&K"-"`6D!``&)(0`!F4$``0EA``
+M$I@0(`1___S[FA`@`8"B(``"@``]@*0@``,```2"$&%XH@9``<(68&K"-&`6
+MD!``$7___LV2$``0D!``&)(0`!!___\KE!``$8"B(``"@``N@*0@`,(4(!J"
+M`$`!@@>``=(0?^Y`````T!0@%*0$@`BD!*`"PA9@'("@8``B@``AIA`@`9`0
+M`!!`````DA`D%,(68&S"-"`6D!``&)(0`!F4$``0EA``$I@0(`1___S1FA`@
+M`H"B(``"@``3@*0@``,```6"$&&,H@9``<(68&S"-&`6D!``$7___J.2$``0
+MD!``&)(0`!!___\!E!``$8"B(``"@``$@*0@`*80(`&`I"```H``!`$```!`
+M````D!``$(''X`B1Z``3G>._D-H60``#```/@A!C_X"C0`$(@``+I!``&,(6
+M8"Z`H&`!$H``"`,``!.0$``8?__[,Y(0`!D0@`#-L!``"`,``!."$&/_@*-`
+M`0B```NF$"``PA9@+H"@8`(R@``(VA9``)`0`!)___]<DA``&1"``+^P$``(
+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
+M?__\.I(0`!F`HB```H``&((0(`"0$``8?__S*9(0`!F`HB```H``$H(0(`"0
+M$``8?__YKY(0`!F`HB```H``#((0(`"0$``8?__ZAI(0`!F`HB```H``!H(0
+M(`"0$``8?__[&9(0`!F"$``(@<?@")'H``&=X[^8D!``&-H60``#```/@A!C
+M_X"C0`$(@``(DA``&<(68"Z`H&`!$H``!`$```!___8)`0````$```"!Q^`(
+M@>@``-H2``#"$D``@*-``3*```C0$@``T!(@`AL``#":$V'PD`H`#<(28`*"
+M"$`-@</@")`B``'0$B((`S__T('#X`B0*@`!F!`@`(,K(`/:`@`!@@(``<(`
+M8`2`DT`!$H``!Y80(`"8`R`!@*,@`02___B#*R`#EA`@`8'#X`B0$``+G>._
+MF'___^R0$``8@RH@$("@8``6@``5F!`@``,__^""*@`!&P```)H38`"#*&`0
+MES!@$(,K(`*"`$`,@RA@`L(30`&`H$`+`H``%K`0(`&8`R`!@*,@@@B___B#
+M*R`"$(``$+`0(``#````FA!@`(,J(!"1,&`0@RL@!<(30`&`H$`(`H``![`0
+M(`&8`R`!@*,@2@B___J#*R`%L!`@`(''X`B!Z```G>._F)`0`!B@$``9LRY@
+M$("F8``"@``PL!`@`7___[P!````@RH@$("@8``V@``*@S!@$)LL(!";,V`0
+M@@!``8,P8!&:&T`!@*``#1"``"*P8#__FAAA_X"@``V:8#__@*```8)@/_^`
+MDT`!$H``&K`0(`&6$"```P```)008`"#+"`0FS!@$(,J(!"1,&`0@RK@`H(`
+M0`N9*&`"PA*`#("C0`$R@``(E@+@`8(#``K"$&`"@*!`"`*```>P$"`!E@+@
+M`8"BX(((O__S@RK@`K`0(`"!Q^`(@>@``)WCOYC"!B&<G\!``)`0`!B`BB!"
+M`H``!K`0``C"!F`(@*!@`"*```*P"C^]@(X@(`*```>`CB`(P@9@#("@8``B
+M@``"L`X_WX".(`@"@``'@(X@`<(&8`2`H&``(H```K`./_>`CB`!`H``!P$`
+M``!___]TD`:@(("B(``R@``"L`X__H''X`B!Z```G>._&*(0`!BP$"``D2Y@
+M$$```#.1,B`0@*(@``*``!"R$``(H`>_>)`0`!&2$``9%0``/Y02HW]```"-
+MEA``$("B(``"@``&D!``$9(0`!E____)E!``$+`0``B!Q^`(@>@``)WCOYA_
+M__]/D!``&)$J(!"1,B`0@*(@$B*``!:P$"`!%(``!X"B(?^`HB``(H``#<(6
+M(@H0@``/L!`@``*```@#```@@A!C2H"B``$R@``)L!`@`!"```>P$"`!PA8B
+M"H"@8TH"@``#L!`@`;`0(`"!Q^`(@>@``)@0(``#````E!!@`)$J(!"7,B`0
+M@RL@`H(`0`R#*&`"VA*``8"C0`L"@``'D`!`"I@#(`&`HR""*+__^(,K(`*0
+M$"``@</@"`$```"=X[^8?___'I`0`!BB$``(@RQ@$("@8``6@``+F!`@`"$_
+M_^"@+$`0H2P@$*$T(!!____AD!``$("B(``2@``6F!`@``,```"6$&``@RQ@
+M$)$P8!";*R`%PA+`#8"@0`@R@``)F`,@`8(#0`O"$&`8@*!@`!*```B@$``!
+MF!`@2Y@#(`&`HR!*"+__])LK(`6@$"``@<?@")'H`!"=X[^8D!``&9H0(``#
+M````F!!@`),K8`?"$P`)@*!`&#*```F:`V`!@*(@``*```22`D`,0````)00
+M((`0@``&L!`@`8"C8#`(O__TDRM@![`0(`"!Q^`(@>@``)80``B`HN```H``
+M#Y`0(`":$"```P```)@08`"#*V`%PA,``8"@0`L"@``'D!`@`9H#8`&`HV!*
+M"+__^H,K8`60$"``@</@"`$```"=X[^8K!``&*00(`"F$"``J!`@`,(60`"`
+MH&``$H``%ZH0(`!___[%D!``&*(0``B1+&`0@*(@``:``!"A,B`0D!``$'__
+M_\62$"``@*(@`!*```B#+&`0?___UY`0`!"`HB``(H``!M068`*#+&`0$(``
+M`Y4P8!#4%F`"F!`@`)`0(``#```_@A!C`("*@`$"@``+$P```!"``%>0$``*
+MFRL@!<(2P`V`H$`*$H``!)@#(`&H`T`+D!`@`8"C($N:0"``@*``"()@/_^`
+MBT`!$K__])828`"`HB```H``7K`0(`"`CJ"`,H``"=05(`34%2`"P@4@"*00
+M(`"`CJ"``H``!J80``'4%2`$P@4@#*00(`"F$``!F!`@`)`0(``0@``1$P``
+M`(,K(`."`$`,FRA@`L(2P`V`H$`*$H``"I@#(`&6`T`+V@6AV,("X`2`HT`!
+M$H``!`$```"J$``+D!`@`8"C(`*:0"``@*``"()@/_^`BT`!$K__[)828`"`
+MHB``(H``')`0``J`CJ"`,H``#]@%8!#8!6`(FA``#)@0(`"D#(`,I@S`#=@%
+M8`R:$``,F!`@`*04@`R`CJ"``H``#*84P`W8!6`0FA``#)@0(`"D#(`,I@S`
+M#=@%8!2:$``,F!`@`*04@`RF%,`-D!``"G___UF2$``;@*(@``*``!6P$"``
+MV![@$-0=(!"8"P`*F@M`"]@^X!#:%F`"`P``/X(08P":"T`!@*``#8)@/_^`
+ME(`3`H```YH0(`":$"`!@(A`#3*```+F)N`8L!`@`8''X`B!Z```G>._F*$^
+M(!^A-"`:H`8`$*$\(`:#+"`&E"8``9`0(`!`````DA`@`:$L(`."!D`0V!A`
+M`)`*``R2"D`-D!(`"8"@``BP0"``@<?@"('H``"6BN#_`H``%YH0(`"`HT`)
+M&H``#@$```"8"N#_P@H`#8"@0`P"@``/@*!@``*```>`HT`)F@-@`8"C0`DJ
+MO__YP@H`#8"C0`D"@``&`0```-8J``W"`H``@@!@`<(B@`"!P^`(`0```)WC
+MOB#V)Z!0[`>@7.X'H&S@%Z!BYA>@9@,```:V$&-8I`8B,*(0(`!___X2D!``
+M&("B(``"@`&^@A`@`'___MN0$``8T#8B"I$J(!"`HB``$H``"Y,L(!"3,F`0
+M?__^+Y`0`!B`HB```H`!L8(0(``#/__P@BP``<(V(@I```,CD!``&'___K;0
+M%B(*H!``"("B(``"@`&F@A`@`)`0`!B2$``0%0``/Y02HW]___\0E@>_>("B
+M(``"@`&=@A`@`)`0`!B2$``0E!`@@'___PB6![[X@*(@``*``96"$"``V!^_
+M@)@+(`":"V`%@),`#3*```*B$"`!V!^_@)@+(`":"V`"@),`#3*```*B$"`"
+MP@8B#("D0`$R@``"XB8B#)`0`!B2$``0?__^,Y0'OWC0)[ZPP@>@:("@8``B
+M@``"]A0@$("FH$`(@``#J!`@`+00($#"!B'@ES!@"I8*X`'6)[Z8@S!@"8((
+M8`'")[Z<`P```*(08`""!&`8@*1``1J``3&`I2``VA1``((,P`V#*&`0@*!@
+M`"*``26B!&`$@RM@$(,P8!#8![ZP@(A`#"*``1^B!&`$TA1@`L(&(9B0$``8
+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
+M@*!@8`*```2`HB&9,H``&I`0`!C"%F`"@@A@H("@8*`"@``EH!`@X<(68`*"
+M"&#0@*!@P`*``""@$"#BPA9@`H((8-"`H&#0`H``&Z`0(.3"%F`"@@AA4((8
+M85"`H``!H&`@`*`,/_T0@``3H`0@XY`0`!A`````DA``&8"B(``"@``-`0``
+M`,(68`*""&#`@*!@P!*```C@`B`@@@P@#X"@8`$2@``$`0```*`,/_"@%"`"
+M@<?@")'H`!"=X[^8D!``&$````"2$``9@*(@``*```6P$"``P@(@'(,P8`*P
+M"&`!@<?@"('H``"=X[^8LH9__P*``!VD!@`:@*2`&`B``!>B$``2H"1`&I`0
+M`!"?QL``DA``$8"B(``D@``1LH9__Y@0`!&6$``:V@P``,(+``#"+```H`0@
+M`=HK``"6@O__$K__^I@#(`&B)$`:@*1`&#B__^Z@)$`:LH9__Q*__^>D!(`:
+M@<?@"('H``"=X[^0HA``&*`0`!C"!B&@D!``&)(0(,&?P$``E`>_]H"B(``"
+M@``AL!`@`-H7O_8#```/@A!C_X"@0`V20#__D@I@!9("8,K"!&&@D!``$9_`
+M0`"4![_T@*(@``*``!.P$"``VA>_]@,```^"$&/_@*-``2B```;:5[_TVA>_
+M])LS8`L0@``#F@M@`9LS8!\#```$@A!B/-HD``$#```$@A!B//`$``&!Q^`(
+M@>@``)WCOYA___M-D!``&)$J(!"1,B`0@*(@2`*``"4!````%(``#!L``""`
+MHB!!%(``'H"B($.`HB!`%H``'8"B(``B@``3PA8B"A"``!N0$"``@A-AC8"B
+M``$4@``*`P``(((388B`H@`!%H``$8("/[:`H&`".(``$)`0(``P@``,@A!A
+MCQ"```B`H@`!@*!AB`:```F0$"``@*!AC02```2`H&&/,H``!)`0(`!___^I
+MD!``&(''X`B1Z``(G>._D*`0`!C"!B&@D!``&)(0(,&?P$``E`>_]H"B(``"
+M@``BF!`@``,```"4$&``@RY@$+,P8!""`P`,@@!`#)8`0`'"$H`+@*!`&3*`
+M`!28`R`!VA>_]@,``!2"$&`"@*-``3B```6"`P`,@@+`"A"```;"$&`"@@!`
+M#((`0`&"`$`*PA!@!,(T(@A___O=D!``&!"```70-"(*@*,@#0B__^>"`P`,
+M@<?@"('H``"=X[^0H!``&,(&(:"0$``8DA`@P9_`0`"4![_V@*(@``*``"*8
+M$"```P```)008`"#+F`0LS!@$((#``R"`$`,E@!``<(2@`N`H$`9,H``%)@#
+M(`':%[_V`P``%((08`*`HT`!.(``!8(#``R"`L`*$(``!L(08`*"`$`,@@!`
+M`8(`0`K"$&`$PC0B"'__^[&0$``8$(``!=`T(@J`HR`&"+__YX(#``R!Q^`(
+M@>@``)WCOYA___]XD!``&("B(``"@``/`0```,(&(>2`B&`!`H``"P$```#2
+M%B((@*)@`"*```72%B(*?___FI`0`!@P@``#?___PY`0`!@!````@<?@"('H
+M``"=X[\0I!``&!$```5`````D!(@"*(0``B`HB```H`!D*`0(`*P$``($P``
+M`)(28``A```$0````)04(G#R)&`,]"1@$/8D8!3D-&'(P#1ARH(0(#S"-&'\
+MP"1B`)H4(S2"$"`#PB1`#8(4(_3`)$`!FA0C^((0)P#")$`-H!0C_)H0/__:
+M)$`0@@!M`-HD0`&"$&`$VB1``9`0`!%`````DA`@`("B(``"@`%MH!`@`X(0
+M(`'")&',D!``$1,``!!`````DA)@()`*(/_0-&'0D!``$2$``"9`````DA0@
+M&-`T8=+`-&'6D!``$9(4(-`5```'0````)02H!:V$"``D!``&)(4((!`````
+M%0``0+8&X`&`IN`#"+__^Y`0`!A`````$P``)Y$R(!Q`````DA`@!)`"(`'0
+M-B'4D!``&"$``!!`````DA0@$*00``B4$B`!D!``&$````"2%"`0D!``&)(0
+M(#U`````E`>_=H"B(``"@`$UH!`@"-H7OW8#```6@A!BI8"C0`$2@`$OH!`@
+M!)`0`!B2$"`_0````)0'OW:`HB```H`!**`0(`C"%[]V&P``!)H38G+"-$`-
+MD!``&)(0(,%`````E`>_=H"B(``"@`$=H!`@"-H7OW:;,V`,`P``!((08G#:
+M-$`!@*-@`1*``16@$"`%M!`@`+80(`"@![]XL@>_^)(&X,"4!L`;E`0`"D``
+M``"0$``8@*(@``*``0B"!L`;@@!`&<(0?X"V!N`!@*;@/PB___2T'H`!`P``
+M/X(08_^`IH`!$H``_J`0(`>0$``8DA`@OT````"4![]V@*(@``*``/>@$"`(
+MP@^_=\(V(@@;```$F!-B=,(7OWS"-$`,F!-B=L(7OW["-$`,F!-B>,(/OX'"
+M+$`,F!-B><(7OX"#,&`(PBQ`#)@38GO"#[^#PBQ`#)@38GK"%[^"@S!@",(L
+M0`R8$V)^PA>_A(,P8`C"+$`,F!-B?\(/OX7"+$`,F!-B@,(7OX:#,&`(PBQ`
+M#)@38H'"#[^'PBQ`#)@38GS"#[^)@@A@`<(L0`R:$V)]PA>_B(,P8`&""&`'
+MPBQ`#0,```""$&``PB8AP+80(`"4$"`)`P``!)(08H*;+N`#FB-`&YLK8`*:
+M`T`;F@1`#98#0`F8`H`*@@>_^)@#``'"$S^`@S!@"L(K0`G"$S^`@S!@!(((
+M8#_"*N`+PA,_@(,H8`*""&`\VA,_@ILS8`Z"$$`-PBK@`<(3/X*#,&`(@@A@
+M/\(JX`S"$S^"@S!@`H((8#_"*N`"PA,_@H,H8`2""&`PVA,_A)LS8`R"$$`-
+MPBK@#<(3/X2#,&`&@@A@/\(JX`/""S^%@@A@/\(JX`["$S^&@S!@"L(JX`3"
+M$S^&@S!@!(((8#_"*N`/PA,_AH,H8`*""&`\VA,_B)LS8`Z"$$`-PBK@!<(3
+M/XB#,&`(@@A@/\(JX!#"$S^(@S!@`H((8#_"*N`&PA,_B(,H8`2""&`PVA,_
+MBILS8`R"$$`-PBK@$<(3/XJ#,&`&@@A@/\(JX`?""S^+@@A@/\(JX!+"$S^,
+M@S!@"L(JX`C"$S^,@S!@!(((8#_"*N`3PA,_C(,H8`*""&`\VA,_CILS8`Z"
+M$$`-PBK@"<(3/XZ#,&`(@@A@/\(JX!3"$S^.@S!@`H((8#_"*N`*PA,_CH,H
+M8`2""&`PVA,_D)LS8`R"$$`-PBK@%<(3/Y"#,&`&@@A@/\(JX!;""S^1@@A@
+M/\(JX!?"$S^2@S!@"L(JX!C"$S^2@S!@!(((8#_"*N`9PA,_DH,H8`*""&`\
+MVA,_E)LS8`Z"$$`-PBK@&L(3/Y2#,&`(@@A@/\(JX!O"$S^4@S!@`H((8#_"
+M*N`<M@;@`8"FX`0(O_]SE`*@"T```%.0$``8M!`@`+80(``A```$LA0C$9(0
+M(!^2(D`;D!``&$````"4![]V@*(@``*``"+8%[]VF2L@$(,S(!"T!H`!F@;`
+M&YH#0!&"%",0@@-``9DS(!C8*&`#F@-`&<(/OW>V!N`!@*;@`@B__^O"*V`#
+M@*``&H)@/_\;``"_FA-C_9H>@`V`H``-FF`__X"00`T2@``,H!`@"9`0`!@3
+M```0DA)@$$````"4$``2$(``$Y`0`!@0@``(H!`@"*`0(`B0$``8$P``$)(2
+M8!!`````E!``$H"D8``"@``%@*<@`$````"0$``1@*<@`#*```+@)P``D!`@
+M`(''X`B1Z``(G>._F$````"0$``8`0```(''X`B!Z```@(IA``*```>0$"``
+M`P``!<(R@`""$&$VPC+``)`0(`&!P^`(`0```('#X`B0$"`!F`(AX,(#(`2"
+M$&`!PB,@!`,```7",R`,@A!A-L(S(`[:`B'@`Q```)H30`$#```@@BM``<(B
+M(>""$"`#PC,@"((0($#",R`*P@(AX(((>?_"(B'@&P``!((38GS""@`!@*!@
+M``*```N"$"`/@A-B2,`R``&:$V),@A`@`<(B``W"`B'@@A!A`,(B(>""$"`/
+MPB,@%)H0(`&"`&_Q@A!B:-HB``&!P^`(D!`@`9WCOYB0$``8(0``()(4("Q`
+M````U`9@!)`0`!B2%"`P0````-0&8`R0$``8DA0@-$````#4!F`0D!``&)(4
+M(#A`````U`9@")`0`!B2%"`D0````-0&0``!````@<?@"('H``"=X[^`\B>_
+MY,(&(=R`H&`!`H``#I`0`!@#````P@!@`((F0`&#*&`#PB>_[`,```#"`&``
+M@B9``8,H8`/")[_P$(``!_(GO^B"$#__PB>_[,(GO_""$"`!PB>_Z`,_G\""
+M+H`!PB>_X$````"2![_@`0```(''X`B!Z```G>._F)`0`!@A```@DA0@+$``
+M``"4$"``D!``&$````"2%"`$`P`$`)`2``$5`"@`E"H`"I`0`!A`````DA0@
+M!)`0`!B2%"`D%0``/T````"4$J/_`0```(''X`B!Z```G>._F,(68!*`H&``
+M`H``&J(0`!B0$``8(0``($````"2%"`$%0`@`)0J``H#``@`E!*``9`0`!A`
+M````DA0@!-068!"0$``80````)(4("C4%F`2D!``&$````"2%"!(U`9@%)4J
+MH`.0$``8$(``"I(4(#20$``8(0``($````"2%"`$%0`H`)0J``J0$``8DA0@
+M!$`````A```@D!``&)(4("Q`````U`9``)`0`!A`````DA0@)`,_X`"0"@`!
+MV@9@"`,``#^"$&/_F@M``<(68!B`H&```H``!Y02``V"`&`$@RA@$!L`'\""
+M"$`-E!*``9`0`!@3```@0````)(28"3"%B'0@*!@`PB``!<!````U!9@&H"*
+MH`<"@``3`P``!)@08_C"!$`,F@AX_X,JH`B""&<`@**@!PB```."$T`!@A-G
+M`,(D0`R0$``8$P``()(28!@#```$@A!C^$````#4!$`!`0```(''X`B!Z```
+MG>._F)`0`!@3```00````)(28`B`H``(D$`@`(''X`B1Z``(G>._F)`0`!A`
+M````DA`@'("B/_\2@``%`P``!,`F0``0@``DL!`@`((08QS:!@`!F@H`#0,`
+M07:"$&"ZF@M``0,`'`""$&`@@(H``0*```7:)D```Q```((30`'")D``@(H@
+M!0*```6`BB7`P@9``((08`'")D``(H``!MH&0`#"!D``@A!@0,(F0`#:!D``
+M`Q```("+0`$B@``&L!`@`0,```2"$&)0T"8``;`0(`&!Q^`(@>@```,```2"
+M$&,<@</@"-`"``&=X[^8`P``!((08QSB!@`!@*1@`!:```:@$``8D!``&)(0
+M("1`````E!`@``,`07:"$&"Z@(Y@`0*```.4#D`!E!*@!8".8$`"@``;D!``
+M&`,```2"$&,@P@0``8"@8``R@``"E!*@0`,```2"$&,DP@0``8"@8``R@``"
+ME!*A``,```2"$&,HP@0``8"@8``R@``"E!*@@`,```2"$&,LP@0``8"@8``R
+M@``"E!*D`)`0`!A`````DA`@(`,```2"$&,<@*9@`!:```;R)``!D!``&)(0
+M("1`````E!`@`8''X`B1Z``1@</@")`0($"=X[^8LRY@$),V8!"`HF`_&(``
+M"Y`0`!B3*F`%`P``)((08!Q`````D@)``0,``""`B@`!$H```[`0(`&P$"``
+M@<?@"('H``"=X[^8I!``&+,N8!"C-F`0@*1@/QB``"VP$"``HRQ@!2$``"22
+M!$`0D!``$D````"4$"``DA0@!)($0`F0$``20````)00(`"2%"`(D@1`"9`0
+M`!)`````E!`@`)(4(`R2!$`)D!``$D````"4$"``DA0@$)($0`F0$``20```
+M`)00(`"2%"`4D@1`"9`0`!)`````E!`@`)(4(!B2!$`)D!``$D````"4$"``
+MH!0@'*($0!"0$``2DA``$4````"4$"``L!`@`8''X`B!Z```G>._F*80`!BB
+M$``9LRY@$+,V8!"`IF`_&(``)[`0(`"D$"``@*:@``*``!24$"``Y`Z@!:4L
+MH`C"#J`$I!2``=0.H`.5*J`8P@Z@`H,H8!"4$H`!P@Z@`8,H8`B4$H`!P@Z`
+M`)02@`&5,J`!@RR@'Y02@`&E-*`!HRQ@$*,T8`LA```DDA0@&)($0`E`````
+MD!``$Z`4(!RB!$`0%0``()04@`J0$``30````)(0`!&P$"`!@<?@"('H``"=
+MX[^8I!``&0,JJJJ`IR``$H```Y808JJ6$"``@RR@$(,P8!"`H&`_&(``:9`0
+M(`#"#H``@*!@`!*``&4!````PA:@`H"@8`0(@`!A@*!@!0B```>R$"``PA:@
+M`H"@8`T(@``#LA`@`;(0(`/4#J`$P@Z@!8,H8`B4$H`!P@Z@!H,H8!"4$H`!
+MP@Z@!X,H8!B4$H`!E!J`"\(.H`F#*&`(V@Z@"*H30`&J'4`+&0``/Y@3(_^J
+M#4`,Y@Z@"L(.H`N#*&`(IA3``<(.H`R#*&`0IA3``<(.H`V#*&`8IA3``:8<
+MP`O"#J`/@RA@"-H.H`ZH$T`!J!T`"Z@-``SX#J`0P@Z@$8,H8`BX%P`!P@Z@
+M$H,H8!"X%P`!P@Z@$X,H8!BX%P`!PA:@`H"@8`T8@``#N!\`"[@/(/^E+*`0
+MI32@$*,LH`4A```DD@1`$$````"0$``8DA0@!)($0`F0$``80````)00`!62
+M%"`(D@1`"9`0`!A`````E!``$Y(4(`R2!$`)D!``&$````"4$``4DA0@$)($
+M0`F0$``80````)00`!R@%"`4H@1`$)`0`!B2$``10````)00`!F0$``8DA``
+M$D````"4$``;@<?@")'H``B=X[^8D!``&0,```2"$&,3D@8``4````"4$"`&
+M`0```(''X`B!Z```G>._F)(0`!D#```$@A!C$Y`&``%`````E!`@!H''X`B1
+MZ"`!G>._F)`0`!D3````DA)@`$````"4$"`&`0```(''X`B!Z```@</@")`0
+M(`"=X[^8H!``&),N8`(#```8D@)``4````"0$``8D!``&!,``!N4$"`#0```
+M`)80(`*`HB```H``![`0(`"0$``00````!,``!K0-H``L!`@`8''X`B!Z```
+MPA(B"),J8!"3,F`0@*!`"0*```J:$"`,`P``!((08G+"$@`!@@A@@("@``&:
+M0#__F@M_^)H#8`N`HJ```H```P$```#:(H``@</@")`0(`"!P^`(D!`@`9WC
+MOY@#```$@A!B2.`6``&B#"`<HSQ@`J`,(`*A/"`!D!``&$````"2$``1D!H`
+M$("@``B48#__D!``&$````"2$``1`0```(''X`B!Z```G>._F)`0`!@A```0
+M0````)(4(!2R!D`9E!`@`Y4J@!F4*@`*@A`@`H,H0!F4$H`!D!``&$````"2
+M%"`4@<?@")'H(`&=X[^8D!``&"$``!!`````DA0@%+(&0!F4$"`#E2J`&90J
+M``J0$``80````)(4(!2!Q^`(D>@@`9WCOYB0$``8(0``$$````"2%"`8@A`@
+M`8,H0!F4*@`!M`Z@`;4N@!F4$H`:D!``&$````"2%"`8@<?@")'H(`&=X[^8
+MD!``&("F8`48@``(L!`__Q,``!!`````DA)@')`*("^1,@`9L`H@`8''X`B!
+MZ```G>._F)`0`!@3```00````)(28!29+F`,L@9`&8(0(`.#*$`9@A,``1L`
+M`&""$$`-E"H``902@`P#```@@*:@``*```24$H`!`P``0)02@`&0$``8$P``
+M$$````"2$F`4`P``!((08QS2!@`!`P!``)(20`%`````D!``&`$```"!Q^`(
+M@>@``)WCOYB0$``8$P``$$````"2$F`0@*9@``*```B4"C^?E`H_WX"F8`0"
+M@``$E!*@0)02(""4"K^_D!``&!,``!!`````DA)@$`$```"!Q^`(@>@``)WC
+MOYB0$``8$P``($````"2$F`$`P`@`)`*``&`H``(L!`@`K!&/_^!Q^`(@>@`
+M`)WCOYB0$``8$P``($````"2$F`$`P`@`("*``$"@``&@*9@`8"F8`(2@``%
+M%0`@`#"```@"@``'%0`@`)02``J0$``8$P``($````"2$F`$`0```(''X`B!
+MZ```@</@")`0(`"`H``)@</@")!@/_^=X[^8DA``&2$```2B%",XD`8`$4``
+M``"4$"`&U`X`$8(4(SG"#@`!@RA@")02@`&"%",ZP@X``8,H8!"4$H`!@A0C
+M.\(.``&#*&`8E!*``9`0`!@C```@0````)(48`B:%",\H!0C/<(.`!"#*&`(
+MU`X`#902@`&U+J`0M3:@$`,___""+H`!@RA@$)02@`&0$``80````)(48`R`
+MIJ``$H``"9`0`!A`````DA1@!`,`!`"4$@`!D!``&!"```F2%&`$(0``($``
+M``"2%"`$%0`$`)0J``J0$``8DA0@!$`````!`````0```(''X`B!Z```G>._
+MF)`0`!@C```@0````)(48&RD$``(D!``&$````"2%&!PH!``")`0`!A`````
+MDA1@;("B`!*@0``0FA`@`)(0``B0$"``L!0`"+(30`F!Q^`(@>@``)WCOYB0
+M$``8$P``($````"2$F!L@<?@")'H``B=X[^8D!``&"$``"!`````DA0@)`,`
+M0`"4$@`!D!``&$````"2%"`D`0```(''X`B!Z```G>._F*00`!B0$``8$P``
+M)D````"2$F!DHS(@$Z(,8?^`C&$`,H```J(<?@"0$``2(0``($````"2%"!P
+ML!``")`0`!)`````DA0@;+`>``BP'@`1@<?@"('H``"=X[^8D!``&/`6(=`3
+M```00````)(28""0"B#_D!X`"("@``BP8#__@<?@"('H``"=X[^8D!``&"$`
+M`"!`````DA0@F,(&0`"0`@`!T"9``)`0`!A`````DA0@E,(&8`20`@`!T"9@
+M!)`0`!A`````DA0@G,(&8`R0`@`!T"9@#)`0`!A`````DA0@D,(&8`B0`@`!
+MT"9@")`0`!A`````DA0@H,(&8!"0`@`!T"9@$(''X`B!Z```G>._F("F8`@(
+M@``)H!``&)`0`!@3```_0````)(28_^`ID`("(``")`0`!B:$#__`P``!((0
+M8_S:)``!$(``#;`0(`!`````DA``&900``B0$``8$P``($````"2$F`0`P``
+M!((08_SR)@`!L!`@`8''X`B!Z```G>._F)`0`!@3```@0````)(28!`#```_
+M@A!C_Y(*``%`````D!``&(''X`B1Z``(G>._F)`0`!@3```'0````)(28_^`
+MID`("(``!IH0/_\#```%VB8``1"``!6P$"``D!``&",``"!`````DA1@%`,_
+M__B@"@`!D!``&$````"2$``9`S__^((J``&@%``!D!``&)(48!1`````E!``
+M$`,```7R)@`!L!`@`8''X`B!Z```G>._F)`0`!@3```@0````)(28!0#/__X
+MDBH``4````"0$``8@<?@")'H``@#```$@A!C]-`*``&0&B`!@</@")`*(`&=
+MX[^8@*9@``*``!&D$``8D!``&",``"!`````DA1@!"$_O_^@%"/_E`H`$)`0
+M`!A`````DA1@!!L```2:$V/TP@8`#1"```^""$`0D!``&"$``"!`````DA0@
+M!",`0`"4$@`1D!``&$````"2%"`$&P``!)H38_3"!@`-@A!`$<(D@`V!Q^`(
+MD>@@`9WCOYB0$``8$P``!T````"2$F/_@*9`"`B```>:$#__`P``!8(08`3:
+M)@`!$(``%[`0(`"0$``8(P``($````"2%&`4(0?_P*`J`!"0$``80````)(0
+M`!F1*B`0`P?_P)`*``&@%``(D!``&)(48!1`````E!``$`,```6"$&`$\B8`
+M`;`0(`&!Q^`(@>@``)WCOYB0$``8$P``($````"2$F`4`P?_P)(*``&3,F`0
+M0````)`0`!B!Q^`(D>@`"('#X`B0$"`!@</@"`$```"!P^`(D!`@`('#X`@!
+M````@</@"`$```"=X[^8D!``&)(0`!F4$``:@*9@`1*```>6$``;@*``&H)`
+M/_^""'_S$(``!)``8`U``````0```(''X`B1Z``(G>._F)(0`!F4$``:EA``
+M&X"F8`L"@``&F!``'("F8!X"@``-D!`@`#"```F4#N`&U"8A^)`0`!@3```@
+M0````)(28&@0@``$D!`@`4````"0$``8@<?@")'H``B=X[^8D!``&)(0`!F4
+M$``:EA``&Y@0`!Q`````FA``'8''X`B1Z``(G>._F)`0`!@A```@0````)(4
+M(`0#``$`E!(``9`0`!A`````DA0@!("F8``"@``*D!``&"$``!!`````DA0@
+M!!4``,"4*@`*D!``&$````"2%"`$`0```(''X`B!Z```G>._F("F8``"@``H
+MD!``&"$``!!`````DA0@!!4``,"4*@`*D!``&$````"2%"`$0````)`0)]"R
+M$"`*`S__/Z(08_^0$``80````)(4(!`#``!`@(H``0*``!"`IF``0````)`0
+M(,B0$``80````)(4(`24"@`1D!``&$````"2%"`$LH9__Q*___"0$``8$(``
+M#[`0(``2@``$D!``&!"```NP$"``(0``($````"2%"`$%0`!`)0J``J0$``8
+M0````)(4(`2P$"`!@<?@"('H``"=X[^8D!``&"$``"!`````DA0@!`,``0"4
+M$@`!D!``&$````"2%"`$@*9@``*```J0$``8(0``$$````"2%"`$%0``P)0J
+M``J0$``80````)(4(`0!````@<?@"('H``"=X[^8D!``&)(0`!JT$``8@*9@
+M`0*```VP$"`!@*9@`0J```:`IF`"`H``#`$````0@``2D!`@`'___Z4!````
+M$(``"K`0``A____6`0```!"```<#```$?___A0$````0@``#`P``!`,```2"
+M$&,T\B:``9`0`!B!Q^`(D>@`")WCOYB0$``8$P``$$````"2$F`$`P``P)`*
+M``&1,B`0@<?@")'H``B=X[^8@*9@`0*```B0$``8`P```("F8`("@``&L!!@
+M`!"```>2$"```P```+`08`!`````DA``&)(0`!B!Q^`(D>@`"9WCOYB0$``8
+M0````)(0(`R!Q^`(D>@`")WCOYB0$``8E!``&4````"2$"`,`0```(''X`B!
+MZ```G>._F)`0`!B2$"`(0````)00(`0!````@<?@"('H``"=X[^8HA``&)`0
+M`!B2$"`(0````)00(""@$"``D!``$4````"2$"`(@(H@!`*```FP$"`!0```
+M`)`0(`J@!"`!@*0CYR2___>0$``1L!`@`(''X`B!Z```G>._F)`0`!@A```@
+M0````)(4(&B4"C^_D!``&$````"2%"!H`0```(''X`B!Z```G>._F)`0`!@A
+M```@0````)(4(&B4$B!`D!``&$````"2%"!H`0```(''X`B!Z```G>._F)00
+M`!F0$``8(0``($````"2%"!0D!``&)(4(%1`````E!``&@$```"!Q^`(@>@`
+M`)WCOYBB$``8@*9@/QB``!FP$"``@*9@'PB```R0$``1(0``($````"2%"!4
+M@@9_X)00(`&5*H`!E"H`"I`0`!$0@``*DA0@5"$``"!`````DA0@4)00(`&5
+M*H`9E"H`"I`0`!&2%"!00````+`0(`&!Q^`(@>@``)WCOYBB$``8@*9@/QB`
+M`!FP$"``@*9@'PB```R0$``1(0``($````"2%"!4@@9_X)00(`&5*H`!E!(`
+M"I`0`!$0@``*DA0@5"$``"!`````DA0@4)00(`&5*H`9E!(`"I`0`!&2%"!0
+M0````+`0(`&!Q^`(@>@``)WCOYB0$``8$P``($````"2$F!,@<?@")'H``B=
+MX[^8D!``&(".8@`"@``$E!``&90.??^4$J`@$P``($````"2$F!,`0```(''
+MX`B!Z```P"I@",`J8`G`*F`*P"I@"X(*K__`*F`,P"I@#8,P8`C"*F`.F@J@
+M_]HJ8`^#*&`(FA-``8"C0`H2@``AD!`@`("*X"`B@``6P"I@%,(*8`R#*&`8
+MV@I@#9LK8!":$T`!P@I@#H,H8`B"$$`-V@I@#YH30`$#```(FA-``8,S8!C"
+M*F`,@S-@$,(J8`V#,V`(PBI@#MHJ8`_`*F`4P"I@%<`J8!;`*F`7P"I@$,`J
+M8!'`*F`2P"I@$Y`0(`&!P^`(`0```)WCOYBB$``8X`>@7,(.8!>`B&`!`H``
+M?[`0(`_"#N`7@(A@`3*```G"#F`2D!``$4````"2$"`,@*(`&@*``'6P$"`/
+MP@Y@$H,H8`C:#F`3@@AO`((00`W"-```P@Y@%(,H8!C:#F`5FRM@$)H30`'"
+M#F`6@RA@"((00`VW*&`$MS;@$Y`0`!$3```@0````)(28&R1,B`*`P``/YH0
+M8_^0"@`-`S__^((J``&`H$`;.H``!K86P`@#/__X@@(``8((0`VV%L`!`S__
+MX((NP`'"-"`"P"P@!,(.8!2#*&`8V@Y@%9LK8!":$T`!P@Y@%H,H8`B"$$`-
+MV@Y@%YH30`&`BV`",H``%]H.8!"`BV`$$H``#((0(`'"#F`7@(A@$`*```6`
+MB&`(P@P@!!"```6"$&`(`H``!<(,(`2"$&`$$(``!\(L(`2"$&`"PBP@!,(.
+M8!>#,&`%PBP@!=H.8!";*V`8P@Y@$8,H8!""$$`-@S!@$\(L(`;"#F`4@RA@
+M&-H.8!6;*V`0FA-``<(.8!:#*&`(@A!`#=H.8!>:$T`!@(MA``*```:"$#__
+M`P``'X(08@"""T`!@S!@"<(L(`?"#F`0@RA@&-H.8!&;*V`0FA-``<(.8!*#
+M*&`(@A!`#8,P8`^""&`/PBP@",(.8!*#,&`&@@A@`<(L(`G"#F`2@S!@!(((
+M8`'"+"`*L!`@`(''X`B!Z```G>._F*80`!C"%J`"@(AA``*``=B:$"`,D!``
+M&$````"2$``:J!``"("B(``"@`'1FA`@#("F8`8B@``,D!``&!B```>`IF`(
+M@*9@`1B``<F0$``8$(``!A,``!`2@`'%FA`@#)`0`!@3```00````)(28!"B
+M"B!@D!``&$````"2$``:@*(@``*``;J:$"`#(0``!((4(Q/4#,`!@A0C%,(,
+MP`&#*&`(E!*``8(4(Q7"#,`!@RA@$)02@`&"%",6P@S``8,H8!B4$H`!D!``
+M&$`````3```@FA0C%Z`4(QC"#,`0@RA@"-0,P`V4$H`!D!``&!,``"!`````
+MDA)@!)`0`!A```&BDA``&8"F8`$"@``-D!``&`J```B`IF`&`H``$X"F8`@B
+M@``2DA`@*!"``!LE```0DA`@*!"```24$"`!DA`@*)00(`!``````0```)`0
+M`!@3```0DA)@$!4```00@``*E!*@))(0("A`````E!`@`)`0`!@3```0DA)@
+M$!4```24$J!`0`````$```"0$``8)0``$$````"2%*`0E!(`$9`0`!A`````
+MDA2@$",```2"%&,XU`S``8(48SG"#,`!@RA@")02@`&"%&,ZP@S``8,H8!"4
+M$H`!@A1C.\(,P`&#*&`8E!*``9`0`!@A```@0````)(4(`B:%&,\@A1C/<(,
+MP`&#*&`(U`S`#902@`&0$``80````)(4(`R0$``8DA`@`$````"4$"``D!``
+M&)(0(`1`````E!`@`)`0`!B2$"`,0````)00(`"0$``80````)(0(!R0$``8
+MDA`@($````"4$"``D!``&)(0("1`````E!`@`((48QS`),`!D!``&$````"2
+M$"`LD!``&)(0(#!`````E!`@!9`0`!B2$"`T0````)00(`60$``8DA`@1$``
+M``"4$"`(D!``&)(0($A`````E!`@")`0`!B2$"!00````)00(`"0$``8DA`@
+M3$````"4$"``D!``&)(4H`Q`````E!`@`)`0`!B2$"!`0````)00(`"B%&/X
+MD!``&)(4(!A`````U`3`$9`0`!B2%"!(0````)00(`"0$``80````)(0(`"0
+M$``8DA0@4$````"4$"``D!``&)(4(%1`````E!`@`)`0`!B2%"!80````)00
+M(`"0$``8DA0@7$````"4$"``D!``&)(4(&!`````E!`@`9`0`!B2%"!D0```
+M`)00(`&0$``8DA0@:$````"4$"``D!``&)(4("A`````E!`@`)`0`!B2%"`L
+M0````)00(`"0$``8DA0@;$````"4$"``D!``&)(4(#!`````E!`__Y`0`!B2
+M%"`T0````)00/_^0$``8DA0@.$````"4$"`!H!`@``,```"B$&``@RP@`X"F
+MX``"@``'T@1``0,__^""`D`!@*!O_RB```B@!"`!@RP@`X(`0!'4`&`$0```
+M`)`0`!B@!"`!@*0@I@B___&#+"`#D!``&$````"2$``:@*(@``*``+Z:$"`#
+MD!``&"$``"9`````DA0@*`,__\""$&#_E`H``2,```2"%&)YP@S``8,H8`B4
+M$H`!D!``&$````"2%"`H@A1B>L(,P`&5*&`8@RA@$)02@`&"%&)[V@S``8,K
+M8`B4$H`!E!*`#9`0`!A`````DA0@-)`0`!A`````DA0@1`,___""$&!_E`H`
+M`:048G3:%,`2FS-@`0,```^"$&.`F@M``902@`V0$``80````)(4($20$``8
+M0````)(4($@5``#\E"H`"L(4P!*#*&`*&P``_(((0`V4$H`!D!``&$````"2
+M%"!(D!``&$````"2%"!D%0`!_)0J``JB%&)XP@S`$8,H8`P;``'\@@A`#902
+M@`&0$``80````)(4(&20$``80````)(4(1"4"C_\PA3`$H((8`.4$H`!D!``
+M&$````"2%"$0D!``&$``!#22$``4@*(@``*``&>:$"`#@*;@`"*```V0$``8
+MP@T@!("(8`(R@``%PA4@`H((?_["+2`$PA4@`L(VH`+"#2`$PBZ@!)`0`!@A
+M```FDA0@'$````"4$"`!0````)`0(^B0$``80````)(4(&"4$B`!D!``&$``
+M``"2%"!@D!``&)(4(&"4$"`!0````)80(`"0$``80````)(0`!2`HB``$H``
+M!Z`0(`#"%J`"@A!@`L(VH`(0@``\FA`@`Y`0`!A`````DA``$*`$(`&`I"`"
+M!+___)`0`!@#```$@A!B3,(&``&`H&```H``!B$``"!`````D!``&)`0`!@A
+M```@0````)(4("05`&``E"H`"I`0`!A`````DA0@)`,```2"$&/\T@3``8"B
+M?_\"@``%`P``!4````"0$``8`P``!=($P`&`HG__`H``!0,```5`````D!``
+M&`,```6"$&`$T@3``8"B?_\B@``%U`8A^$````"0$``8U`8A^("BH``B@``'
+M\B8AW)`0`!@3```@0````)(28&CR)B'<$(``![`0(`'"!P``@*!@`#*```+:
+M)P``L!`@`(''X`B!Z```G>._F)`0`!@3```@0````)(28`0#```_@A!C_X"F
+M8`$"@``9D`H``8"F8`$4@``&@*9@!H"F8``B@``.`P``!#"``"`"@``%@*9@
+M"`*``!0#```$,(``&P,```2"$&/TU`8``902``H0@``1`P`40((08_34!@`!
+ME!(`"A"```P#`!2``P``!((08_34!@`!E!(`"A"```8#``4`@A!C]-0&``&4
+M$@`*`P`$`)02@`&0$``8$P``($````"2$F`$`0```(''X`B!Z```G>._F)`0
+M`!A____+T@8AW`$```"!Q^`(@>@``)WCOYB0$``8DA`@"$```0:4$"`*@<?@
+M")'H``B=X[^8H!``&)`0`!B2$"``0````)00(`&`HB```H``%+`0(`"0$``0
+MDA`@#Q4``!-```#VE!*B(("B(``"@``,L!`@`$````"0$"/HD!``$)(0(!\5
+M```30```[)02HB!`````D!`H-+`0(`&!Q^`(@>@``)WCOYB0$``8DA`@`$``
+M``"4$"`!@*(@``*``"V"$"``@*9@``*```:4$"``PA9@`H"(8!`R@``"E!`@
+M`9`0`!@3```F0````)(28`20$``8DA`@#Q4``!-```#/E!*B(("B(``"@``:
+M@A`@`$````"0$"/HD!``&)(0(!\5```30```Q902HB"`HB```H``$((0(`!`
+M````D!`H-)`0`!B2$"``0````)00(`&`HB```H``!X(0(`"0$``8DA`@`$``
+M`+64$"`*@A``"(''X`B1Z``!G>._F*H0`!B0$``80````)(0`!FL$``(@*(@
+M``*``*>P$"``D!``%2$``"!`````DA0@:)02(&"0$``50````)(4(&B0$``5
+M0````)(4("2N$``(%0`@`)0J``J0$``50````)(4("1`````D!`OH)`0`!4A
+M```F0````)(4(`@#`@``E!(``9`0`!5`````DA0@"$````"0$"`*D!``%4``
+M`PB2$``6@*(@``*``(.P$"``0````)`0(^B0$``5(0``)D````"2%"`((SW_
+M_Z(48_^4"@`1D!``%4````"2%"`(D!``%4````"2%"!8I!``")`0`!5`````
+MDA0@7*80``B0$``50````)(4(&BH$``(%0#_`)0L@`H#`/\`E!*``9`0`!5`
+M````DA0@6!4_\`"4$J!_E`S`"@,`#_""$&"`E!*``9`0`!5`````DA0@7!4_
+M_X"4$J`?E`T`"C$```2"%B&`E!*``9`0`!5`````DA0@:$````"0$"`4D!``
+M%4````"2%"`(`P(``)02``&0$``50````)(4(`A`````D!`@"I`0`!62%"#4
+M0````)00("&0$``50````)(4(`B4"@`1D!``%4````"2%"`(0````)`0(^B0
+M$``50````)(4(&"4$B`!D!``%4````"2%"!@D!``%9(4(&"4$"`!0````)80
+M(`"0$``5DA0@6$````"4$``2D!``%9(4(%Q`````E!``$Y`0`!62%"!H0```
+M`)00`!20$``50````)(0`!:`HB``$H``#9`0`!5`````D!8CB)`0`!5`````
+MDA``%H"B(``2@``%D!``%<(68`*"$&`"PC9@`B$``"!`````DA0@:)0*/Y^0
+M$``50````)(4(&B0$``5DA0@)$````"4$``7@A`@`<(F@`"P$"`!@<?@"('H
+M``"=X[^0H!``&("F8``2@``#@A``&8(0/__")[_TD!``$!,``!!`````E!``
+M&4````"0$``:L@Y@#\('O_2""&`/PB>_])`0`!`3```0E!```4````"6$``9
+M@(Y@!!*``!&P$``(@A`@%<(GO_34#[_TP@^_]8,H8`B4$H`!P@^_]H,H8!"4
+M$H`!P@^_]X,H8!B4$H`!D!``$$````"2$"`4@<?@"('H``"=X[^8EA`@`)@0
+M(`JT#J#_E`:@`8(#``R"`&`#@@A@_X"F@`$2@``(@@,`#,(.0`R`H&`_$H``
+M.K`0``$0@``KEA`@`8(`8`.""&#_@AJ``8"@``&:8#__@SL@'X(@0`R#,&`?
+M@(M``0*``!J`HN`!T`Y`#("B(#\"@``4@@,`&>`(?_^`I"`_`H``&)80(`&0
+M(@`0@@(`"((`0`B#*&`"@B!`"(,H8`2"($`(@@!``9``8^=`````DA`CZ)`"
+M`!`0@``7L`H@_Q"```B6$"`!,H``!YB#/__"#D`,@*!@/Q*```^P$``!F(,_
+M_QR__\N"`P`,F!`@`,(.0`R`H&`_$H``![`0``&8`R`!@*,@"B2___O"#D`,
+ML!`@`8''X`B!Z```G>._F*`0`!F0$``:I!`__Z(0/_^R$"``F@Z@_\(,`!F`
+MH&`_`H``#X"C0`$"@``C@@9`&3B```*B$``9P@P`&8"C0`$Z@``(L@9@`8"D
+M?_\2@``(I!``&1"``!B"!D`9L@9@`8"F8`HDO__NP@P`&8"F8`H4@``#FA`@
+M`9H0(`"".``1@*```8)@/_^`BT`!$H``*;`0(#^`IF`*)(``#(($0!*"!$`1
+M@@!@`\(NP``0@``%@@0`$8(`8`/"+L``@@0`&1"``!SP"&`+@@!@`\(NP`"T
+M"B#_P@P`$;0F@`&1+J`%D"(`&I$J(`*0`@`:D2H@`](,`!)`````DB)``8($
+M`!+2"&`+@@0`$>`(8`N"#"#_0````)(B0`&T`B/GD!``&D````"2$"/HD`(`
+M$+`*(/^!Q^`(@>@``("B8#PX@``"DA`@/-(R(?R!P^`(D!`@`9WCOY"D$``8
+MHA``&!L```2:$V)VPA8`#8,P8`2""&`'PBZ@#YH&``W""V`!@@A@!\(NH!#:
+M%D```S__^H(08\Z:`T`!FRM@$)LS8!"`HV"6&(``PK`0(`"@$"```P``!)@0
+M8GC:%*((@@0`$8(`0`S""&`&@*-``0*```>`I"`$H`0@`8"D(`,(O__Y@@0`
+M$8"D(`0"@`"QL!`@`-`60``#/__Z@A!CSI`"``%`````DA`@"H"B(`R00C__
+M0````)(0(`.#*B`#@B!`"(,H8`*"`$`(L@1``0,```2"$&*"L@9``9@&0!#"
+M"R`9PBZ@#M8.8!::"N#_V`L@&8(+(/^`HT`!.(```I80``S6+J`)@@9`$-@.
+M8!>:"R#_U@A@&8(*X/^`HT`!.(```I@0``O8+J`(@@9`$-@.8!B:"R#_U@A@
+M&8(*X/^`HT`!.(```I@0``O8+J`'@@9`$-0(8!F0$``2DA``&7___U&6![_W
+MH!``"-0.H`F0$``2DA``&7___TN6![_VL!``"-0.H`B0$``2DA``&7___T66
+M![_UHA``"-0.H`>0$``2DA``&7___S^6![_TV@2B`("C8``"@`!4P@^_]P,`
+M``""$&``F@-`#=@/O_?6$$`-PA!`#8(`8`.`HP`!-H``!,(/O_<0@``#@A`@
+M`X(@0`O"+[_WU`^_]Y`0`!)___[@DA``&=`NH`Z4"B#_D!``$I(0`!E___\C
+ME@>_\]@/O_>:"R#_U@^_]H(*X/^`HT`!"(```Z`0``B8$``+V"^_]I0+(/^0
+M$``2?__^S9(0`!G0+J`)E`H@_Y`0`!*2$``9?___$)8'O_/8#[_WF@L@_]8/
+MO_6""N#_@*-``0B```.P$``(F!``"]@OO_64"R#_D!``$G___KJ2$``9T"Z@
+M")0*(/^0$``2DA``&7___OV6![_SV`^_]YH+(/_6#[_T@@K@_X"C0`$(@``#
+MHA``")@0``O8+[_TE`L@_Y`0`!)___ZGDA``&=`NH`>4"B#_D!``$I(0`!E_
+M__[JE@>_\\(/O_>"`$`!PC2A_L(.H`["+J`*PBZ@"\(NH`S"+J`-@B0`",(N
+M@`"")``1PBZ@`8(D`!C"+J`"P"Z@!L`NH`7`+J`$P"Z@`[`0(`&!Q^`(@>@`
+M`)WCOSBD$``8D`>_F!,```"2$F``0````)00($2@![_@D!``$!,```"2$F``
+M0````)00(!&0$``8DA``&7___QF4$``0@*(@``*``,RP$"``P@^_[X(`?_^"
+M"&#_@*!@!!B``,;"#[_P@@!__X((8/^`H&`$&(``P;(0(`"B![_XH2Y@$*$T
+M(!"@!$`0T`P_Z$````"2$"`%@@9@`;(0``&#*&`0@S!@$("@8`8(O__UT"P_
+MZ+(0(`>B![_XH2Y@$*$T(!"@!$`0T`P_Z$````"2$"`&@@9@`;(0``&#*&`0
+M@S!@$("@8`X(O__UT"P_Z-@/O^&;*R`%F@M@X,(/O^"""&`?FA-``<('OYB:
+M$T`!VB>_F-8/O^.;*N`'F@M@@,(/O^*#*&`"@@A@?)H30`&9,R`#F`L@`YH3
+M0`S"![^<FA-``=HGOYS8#[_D@RL@!(((8/"7,N`!E@K@#X(00`O:![^@@A!`
+M#<(GOZ#6#[_FFRK@!IH+8,#"#[_E@@!``8((8#Z:$T`!F3,@!)@+(`&:$T`,
+MP@>_I)H30`':)[^DV`^_YX,K(`.""&#XES+@`I8*X`>"$$`+V@>_J((00`W"
+M)[^HU@^_Z9LJX`>:"V"`P@^_Z((`0`&""&!^FA-``9DS(`68"R`!FA-`#,('
+MOZR:$T`!VB>_K-@/O^J#*R`%@@A@X)<RX`&6"N`?@A!`"]H'O[""$$`-PB>_
+ML-8/O^N#*N`#@@A@^)DS(`.8"R`'@A!`#-H'O[2"$$`-PB>_M,(/O^R"`$`!
+M@@A@?I<RX`66"N`!@A!`"]H'O[B"$$`-PB>_N-@/O^V#*R`%@@A@X-H'O[R"
+M$$`-PB>_O-H/O^Z#*V`#@@A@^)DS(`.8"R`'@A!`#-@'O\""$$`,PB>_P)LS
+M8`6:"V`!P@>_Q)H30`':)[_$T`^_[T````"2$"`#D2H@!Y`*((#"![^XD!(`
+M`=`GO[C0#[_O0````)(0(`.1,B`!D`H@`\('O[R0$@`!T">_O-`/O_!`````
+MDA`@`Y$J(`*0"B`<P@>_O)`2``'0)[^\LA`@`*('O_@A```F@RY@$(,P8`Z"
+M`$`1U`!_H)`0`!)`````DA0@G((&8`&R$``!@RA@$(,P8!"`H&`/"+__]8,N
+M8!"#,&`.@@>``9`0`!(3```FDA)@U$````#4`'^8L!`@`8''X`B!Z```G>._
+MF-`60``#/__[D`(``4````"2$"`*0````)(0(`64`@`(E!*@09`0`!@A```F
+M0````)(4()R0$``8DA0@P$````"4$"```P``!((08C3R)@`!@<?@")'H(`&=
+MX[^8D!``&!,``"9`````DA)@9)$R(!.0"B'_@(HA``*```.P$``(L!(^`+$N
+M(!"Q/B`0@<?@"('H``"=X[^8D!``&"$``"9`````DA0@8)02(`*0$``80```
+M`)(4(&"0$``8DA0@8)00(`)`````EA`@`("B(``"@``=@A`@`)`0(``0@``)
+MH!`@`$````"0$"/H0````)`0`!B1*B`0D3H@$*`$(`&`I"`4!(```YH0(`&:
+M$"``@*(_N!2```."$"`!@A`@`("+0`$2O__P@*(_N"2```70-F`6P#9@%A"`
+M``."$"``@A`@`8''X`B1Z``!@</@")`0(`"!P^`(D!`@`)WCOYB4$``:@*9@
+M`A2```N0$"``DRY@!)(B0!F3*F`"D@8`"0,```2"$&-`D@)``4````"0$``8
+M@<?@")'H``B=X[^8DA``&H"F8`(4@``+D!`@`)4N8`24(H`9E2J@`I0&``H#
+M```$@A!C0)0"@`%`````D!``&(''X`B1Z``(G>._F*00`!B`IF`"`H``#)`0
+M`!B`IF`"&(``!H"F8`.`IF`!`H``"K`0/_\P@``I`H``!;`0/_\P@``F$(``
+M!:(0(`(0@``#HA`@`:(0(`"#+&`$@B!`$8,H8`*@`@`!`P``!((08T"@!``!
+MP@0@!("@8``2@``7L!`__Y`0`!!`````DA`@/("FH``2@``,\B0@!((0(`O"
+M)"`,@A`@`L(D(!2"$#__PB0@&((0(`K"-"`@$(``!L(T("*0$``2DA``$4``
+M``"4$``:L!``$8''X`B!Z```@*)@`AB``">8$"``@RI@!((@0`F#*&`"F@(`
+M`0,```2"$&-`F@-``<(#8`2`H&```H``'`$```#`(V`$&0``!)83(R":$"`!
+MFRM`"9HX``W"`@`+@@M``<(B``N6$R,DP@(`"X(+0`'"(@`+EA,C*,("``N"
+M"T`!PB(`"Y83(RS"`@`+@@M``<(B``N8$R,PP@(`#)H+0`':(@`,F!`@`8'#
+MX`B0$``,G>._F*80`!BD$``8`P``!((08C3:!@`!@*9@`AB``,ZP$"``@RY@
+M!((@0!F#*&`"H@3``0,```2"$&-`H@1``<($8`2`H&```H``PX"@8`$2@`#!
+ML!`@`<(38`*`B&`0`H``+)`0`!,A```@DA0@$$````"4$"'@D!``$Y(4(!1`
+M````%0(``I`0`!.2%"`@%0!W8T````"4$J//P@1@%)4H8`24(H`!E2J@!90"
+MH>"5*J`+E!*AX)`0`!-`````DA0@0)`0`!.2%"!$%0%K@$````"4$J/`D!``
+M$R$``"9`````DA0@1)0*/X"4$J`XD!``$T````"2%"!$D!``$Y(4(`05&\`(
+M$(``+902H",A```@DA0@$$````"4$"%HD!``$Y(4(!1`````%0$``9`0`!.2
+M%"`@%0!W8T````"4$J.GV@1@%((#0`V"`$`-E2A@!)0B@`&5*J`#E`*B,)4J
+MH`N4$J(PD!``$T````"2%"!`D!``$Y(4($05`37`0````)02HYB0$``3(0``
+M)D````"2%"!$E`H_@)02H!R0$``30````)(4($20$``3DA0@!!4;P`24$J`@
+M0`````$```#"!&`8@*!__P*```.4$"`/U`1@&)4JH!3"%&`B@RA@!(((8/"4
+M$H`!PA1@((((8`^4$H`!`P`"")02@`&0$``3$P``($````"2$F`<P@1@#("(
+M8`$"@``(`P``!((08R":$"`!FRM`&=@$@`$0@``'FA-`#((08R":$"`!FRM`
+M&=@$@`&:*P`-VB2``<($8`R`B&`!`H``"`,```2"$&,DFA`@`9LK0!G8!(`!
+M$(``!YH30`R"$&,DFA`@`9LK0!G8!(`!FBL`#=HD@`'"!&`,@(A@`@*```@#
+M```$@A!C*)H0(`&;*T`9V`2``1"```>:$T`,@A!C*)H0(`&;*T`9V`2``9HK
+M``W:)(`!P@1@#("(8`0"@``(`P``!((08RR:$"`!FRM`&=@$@`$0@``'FA-`
+M#((08RR:$"`!FRM`&=@$@`&:*P`-VB2``<($8`R`B&`(`H``"`,```2"$&,P
+MFA`@`9LK0!G8!(`!$(``!YH30`R"$&,PFA`@`9LK0!G8!(`!FBL`#=HD@`&P
+M$"`!@<?@"('H``"=X[^8@RY@!((@0!F#*&`"@@8``1L```2:$V-`@@!`#<(`
+M8`2`H&```H``")`0`!B`H&`!,H``!I`0/_]`````DA`@`#"```*0$#__@<?@
+M")'H``B=X[^8D!``&(,N8`2"($`9@RA@`H(&``$;```$FA-C0((`0`W"`&`$
+M@*!@`0*```F4$``:@*!@`0J```FP$"``@*!@`QB```:2$"`$,(```I(0(`!`
+M````L!`@`8''X`B!Z```G>._F$````"0$``8H!``"!,@``"2*@`)0````)`0
+M`!B0$``8$P``($````"2$F!D@*9@``*```>`HB`!@A`@)8(@0`B#,&`!$(``
+M"90"``$8@``'E`(__Y`0`!A`````DA``$!"```JP$"``D!``&!,``"!`````
+MDA)@9)`0`!A`````DA``$+`0(`&!Q^`(@>@``)WCOYB#+F`$@B!`&8,H8`*"
+M!@`!&P``!)H38T""`$`-P@!@!("@8`$"@``+D!``&"J``!:P$"``@*!@`@*`
+M``^`H&`#`H``!Y(0(`@0@``/L!`@`)(0(`@0@``*E!`@`4````"4$"`"D!``
+M&)(0("@0@``$E!`@#I(0("B4$"`*0````+`0(`&!Q^`(@>@``)WCOYB#+F`$
+M@B!`&8,H8`*"!@`!&P``!)H38T""`$`-P@!@!("@8``"@``*D!``&("@8`$R
+M@``(L!`@`$````"2$"`4D3(@"Q"```.P"B`/L!`@`(''X`B!Z```G>._F(,N
+M8`2"($`9@RA@`H(&``$;```$FA-C0((`0`W"`&`$@*!@`0*```B0$``8"H``
+M(Y`0(`"`H&`"(H``')`0`!@P@``>DA`@"$````"4$"`(LA`@`"$``!Z0$``8
+M0````)(0(!2`B@`0`H``")`0`!A`````D!`@"K(&8`&`IF/G!+__]Y`0`!B2
+M$"`(0````)00(`"`IF/G!(``")`0(`$0@``&D!`@`)(0("R4$"`$0````)80
+M(`"!Q^`(D>@`")WCOYBZ$``:V@>@9-X'H&R"!S_]@*!@`0B```,U`P``M2\@
+M&K@/;__"!Z!<@RA@$K@7``&#+N`,.P``_(((0!VX%P`!@(O@`0*```2T%P`:
+M`P!``+06@`&#,^`$@@A@`8,H8!V"$$`:^@>@:("@`!VZ0"``NR]@&;H70`&#
+M-V`8L!```<(N8`B#-V`0@@A@_[00``'"+F`)@S=@"(((8/^X$``!PBY@"KH/
+M8/^V$``=@*-__P*``![Z+F`+@RM@#3L``?B""$`=P"Y@#+LP8!#Z+F`-@S!@
+M",(N8`[`+F`/@RX@&+H.H/^[+V`0NA=``8(/(/^#*&`(@A!`';H.X/^Z%T`!
+M`Q```+H70`&#-V`8PBY@"(,W8!#"+F`)@S=@",(N8`H0@``&^BY@"\`N8`S`
+M+F`-P"Y@#L`N8`^`B^`$`H``*3D__@#"#F`(@RA@&/H.8`F[+V`0NA=``<(.
+M8`J#*&`(@A!`'?H.8`NZ%T`!`P`0`+H70`&#-V`8PBY@"(,W8!#"+F`)@S=@
+M",(N8`KZ+F`+P@Y@#(,H8!CZ#F`-NR]@$+H70`'"#F`.@RA@"((00!WZ#F`/
+MNA=``<('H'2""$`<NA=``8,W8!C"+F`,@S=@$,(N8`V#-V`(PBY@#OHN8`^!
+MQ^`(D>@@`8'#X`B0$"``P@I@"(,H8!C:"F`)FRM@$)H30`'""F`*@RA@"((0
+M0`W:"F`+FA-``0,(``":$T`!@S-@&,(J8`B#,V`0PBI@"8,S8`C"*F`*@</@
+M"-HJ8`N`HN```H``&9`0``W""F`,@RA@&-H*8`V;*V`0FA-``<(*8`Z#*&`(
+M@A!`#=H*8`^:$T`!@*``#()@/_^#*&`,FA-`"H(00`V;,&`8VBI@#)LP8!#:
+M*F`-FS!@"-HJ8`X0@``JPBI@#X"C(``B@``;P"I@",(+8`B#*&`8V@M@"9LK
+M8!":$T`!P@H@"H,H8`B"$$`-V@H@"YH30`&#,V`8PBI@"(,S8!#"*F`)@S-@
+M",(J8`K:*F`+@S*@&,(J8`R#,J`0PBI@#8,RH`C"*F`.$(``#M0J8`_`*F`)
+MP"I@"L`J8`L;```$FA*`#8,S8!C"*F`,@S-@$,(J8`V#,V`(PBI@#MHJ8`_`
+M*F`4P"I@%<`J8!;`*F`7P"I@$,`J8!'`*F`2P"I@$X'#X`B0$"`!P@I@%X"(
+M8`$"@`!-D!`@#\(*8!2#*&`8V@I@%9LK8!":$T`!P@I@%H,H8`B"$$`-V@I@
+M%YH30`$#```'@A!C_IH+0`':,H``P@I@$-H*8!&#*&`(@A!`#<(RH`+`*J`$
+MP@I@$(,H8!C:"F`1FRM@$)H30`'""F`2@RA@"((00`W:"F`3FA-``8"+8`$R
+M@``6P@I@"8"+8`(B@``%P@I@$X(0(`'"*J`$P@I@$X"(8`@B@``&P@I@$\(*
+MH`2"$&`"PBJ@!,(*8!.`B&`$(H``!L(*8`G""J`$@A!@!,(JH`3""F`)@S!@
+M`H((8`_"*J`%P@I@%(,H8!C:"F`5FRM@$)H30`'""F`6@RA@"((00`V#,&`-
+MPBJ@!L(*8!*""&`/PBJ@!\(*8!.#,&`$PBJ@",`JH`K`*J`+D!`@`('#X`@!
+M````@</@"`$```#""F`$@A!@",(J8`2!P^`(D!`@`)WCOYB0$``8$P``)I(2
+M8-`5```'0````)02H!:@$"``(P``)I`0`!B2%&"`0````!4``$"@!"`!@*0@
+M!P2___N0$``80````!,``">1,B`8@S(@!)H*(`^;*V`$D!!`#4````"2$"`(
+M@<?@")'H``B=X[^0$0``"T````"0$B+PH!``"("B(``"@`$RHA`@`J00``@3
+M````DA)@`!4```1`````E!*B</(D(`ST)"`0]B0@%/`T(<C`-"'*@A`@/\(T
+M(?S`)"(`&P``"X(38JS`)``!@A-BR,`D``&8$V+0@A`G`,(D``R"$V+4F!`_
+M_]@D``&"$V+8V"0``9H38MS8)``-D!``$$````"2$"``@*(@``*``0^B$"`#
+MVA0AR`,``#R"$&$;@*-``3*```^0$``2D!``$!,``"B2$F(`0````)00(`"0
+M$``0$P``)I(28'Q`````E!`@&4````"0$"/HD!``$A,``!!`````DA)@()`*
+M(/^;,B`$VB2AS((*(`_"-*'0F@-__H"C8`(8@`#PHA`@#9`0`!(3```F0```
+M`)(28!C0-*'20```_Y`0`!*`HB```H``YJ(0(`["!*',D!``$A,``":`H&`#
+M&(``!900(`>0$``2$P``)I00($=`````HA`@#4````"0$"?0?___@Y`0`!+0
+M-*'4D`H@\("B(!`2@`#3@*0@`)`0`!*2$"#!0````)0'O_:`HB```H``RZ(0
+M(`C:%[_V`P``"X(08_^`HT`!"(``Q:(0(`7"%[_V&P``!)H38G#"-``-D!``
+M$A,``!!`````DA)@$)`*(!B1,B`#@*(@`A*``+BB$"`*D!``$I(0(#]`````
+ME`>_]H"B(``"@`"QHA`@"-H7O_8#```$@A!B<MHT``&V$"``HA`@`)($8,"0
+M$``20````)0'O_:`HB```H``H\(7O_:B!&`!@*1C/PB___>V'L`!`P``/X(0
+M8_^`IL`!$H``FZ(0(`>:$"`*`P``!((08^;:-``!FA`@`P,```6"$&'PVC0`
+M`:(0(``#```$F!!CZ)H0(`N"!$`1@@!`$8,H8`*"`$`1@RA@`H(`0!""`$`,
+MH@1@`8"D8`D(O__WVC!@!J(0(``#```%GA!A^`,```"V$&```P``!9(08?"0
+M$&*HEA`@"Y008A""!$`1F@!`$-@6P`'8,T`/F@-`"=@S8`*"`$`1@RA@`H(`
+M0!&#*&`"@@!`$)H`0`C6,V`,@@!`"J($8`&`I&`""+__\-8P8`@3```$DA)B
+M<)($``E`````D!``$H"B(``"@`!@HA`@",($H<R`H&`#"(``'@,```2"$&**
+MPA0``8"@8``"@``9`P``!)`0`!(3```F%0``$$````"4$J`'0````)`0)]!_
+M__[ZD!``$M`TH=:0$``2$P``)D````"4$"`'0````)`0)]#"%*'6@@A@\("@
+M8"`2@`!"HA`@#1"```60$``2@A!BBL`T``&0$``2DA`@OT````"4![_V@*(@
+M``*``#>B$"`(VA>_]@,```2"$&)TVC0``=HTH@@#````@A!@`,(DH<!```"M
+MD!``$D````"0$``2MA`@`*(0(``U```+LA:@*9(0(!^2(D`1D!``$D````"4
+M![_V@*(@``*``![8%[_VF2L@$(,S(!"V!L`!F@1`$9H#0!""%J`H@@-``9DS
+M(!C8*&`$F@-`&<(/O_>B!&`!@*1@`@B__^O"*V`$@*``&X)@/_\;``"_FA-C
+M_9H>P`V`H``-FF`__Z(0(`F`D$`-`H``#I`0`!(0@``$@*0@`*(0(`B`I"``
+M`H``!8"G(`!`````D!``$("G(``R@``"XB<``)`0(`"!Q^`(D>@`")WCOY@3
+M```$DA)B<)(&``E`````D!``&$````"0$``8`0```(''X`B!Z```G>._>*80
+M`!@#```@PB>_\`,``":"$&`@PB>_]`,5556"$&%5PB>_V`,JJJJ"$&*JPB>_
+MW`,9F9F"$&)FPB>_X`,F9F:"$&&9PB>_Y*H0(`"L![_XH2U@`J`$`!;D!#_X
+MD!``$T````"2$``2T"0_\*(0(`"#+&`0H!!`$9`0`!.2$``20````)00`!"0
+M$``30````)(0`!*`H@`0$H``)K`0(`"B!&`!@*1@_P2___.#+&`0HA`@`*@'
+MO_B#+&`"@@!`%.``?^"0$``3DA``$D````"4$``0D!``$T````"2$``2@*0`
+M"!*``!.P$"``H@1@`8"D8`,$O__R@RQ@`H,M8`*"`$`6D!``$](`?_A`````
+MU`!_\*H%8`&`I6`!!+__SJ$M8`)`````D!`@9+`0(`&!Q^`(@>@``("*80`"
+M@``(@A``"0,```2"$&,XPC*```,```40@``.@A!CU("(8(`B@``-D!`@``,`
+M``2"$&**PA(``8"@8``B@``'D!`@`((0*0C",H``@A`JK,(RP`"0$"`!@</@
+M"`$```"!P^`(D!`@`9WCOY"D$``8IA``&,(6(@B`H&`!$H``!J`&(>"0$``8
+MDA`@$$````"4![_TP"0@!!L```2"$V*&PA2``8"@8``"@``,`P``!((0(`'"
+M)"`$@A-B=L(4@`&`H&``$H``!0,```2"$"`#PB0@!`,```2"$&**PA2``8"@
+M8``"@``&@A`I",($(`2"$&`$PB0@!((0*0C"-"`0@A`JK,(T(!(#```$@A!C
+M.,(T(`P#```%@A!CU,(T(`["!```&R```((00`T;$```@A!`#1L``"""$$`-
+M&P``$((00`V:$"`*VC0@")H0((#:-"`*@@AY_\(D```C```$@A1B>L(4@`&`
+MH&```H``$8(0(`V4%&)(E`3`"I`0`!A`````DA`@#X"B(``"@``)@A`@#9H4
+M8DR"$"`!PB3`#<($``""$&$`PB0``((0(`W")"`4FA`@`8(`;_."$&)HVB3`
+M`8''X`B1Z"`!G>._F)`0`!@A```@DA0@*$````#4!F`$D!``&)(4("Q`````
+MU`9@#)`0`!B2%"`P0````-0&8!"0$``8DA0@-$````#4!F`(D!``&)(4("!`
+M````U`9```$```"!Q^`(@>@``)WCOX#R)[_DP@8AW("@8`$"@``*D!``&("@
+M8`$J@``.`P```("@8`8"@``*@*!@"#*``!."!F`!`P``/X(08__")[_L`P`!
+M_Q"```N"$&/_`P```,(`8`"")D`!@RA@`\(GO^P#````P@!@`((F0`&#*&`#
+MPB>_\((&8`'")[_H`S^?P((N@`'")[_@0````)('O^`!````@<?@"('H``"=
+MX[^8D!``&"$``""2%"`H0````)00(`"0$``80````)(4(`0#``$`D!(``14`
+M#`"4*@`*D!``&$````"2%"`$D!``&)(4("`5```_0````)02H_\!````@<?@
+M"('H``"=X[^8PA9@$H"@8``"@``8IA``&)`0`!@A```@0````)(4(`0#``0`
+ME!(``9`0`!A`````DA0@!-068!"0$``80````)(4("34%F`2D!``&$````"2
+M%"`XU`9@%)4JH`.0$``8$(``"I(4(#"0$``8(0``($````"2%"`$%0`$`)0J
+M``J0$``8DA0@!$`````A```@D!``&)(4("A`````U`9``)`0`!A`````DA0@
+M(`,_X`"0"@`!V@9@"`,``#^"$&/_F@M``<(68!B`H&```H``!Y02``V"`&`$
+M@RA@$!L`'\"""$`-E!*``9`0`!@C```@0````)(48"`9```+F!,BT-0$P`PE
+M/__`@A2@_Y0*@`'"%F`:@RA@""$``#^:%",`@@A`#902@`'4),`,D!``&$``
+M``"2%&`8D!``&",``!!`````DA1@!)0*`!+"!F`<@@!__8,H8`.@%"/_@@A`
+M$)02@`&0$``80````)(48`0!````@<?@"('H``"=X[^8D!``&!,``!!`````
+MDA)@"("@``B00"``@<?@")'H``B=X[^8D!``&$````"2$"#`@*(__Q*```4#
+M`$%VP"9``!"``$2P$"``@A!@NIH*``$#``(`@(H``0*```7:)D```Q```((3
+M0`'")D``@(H@!0*```6`BB7`P@9``((08`'")D```H``!8"*("#"!D``@A!@
+M0,(F0``B@``-V@9```,```2"$&)HP@8``8"@8``B@``'V@9``,(&0``;$```
+M@A!`#<(F0`#:!D```Q```("+0`$B@``?L!`@`2$```2"%")0T"8``:(4(E20
+M$``80````)(0(,30)@`1HA0B6)`0`!A`````DA`@R-`F`!&B%")<D!``&$``
+M``"2$"#,T"8`$:(4(F"0$``80````)(0(-#0)@`1H!0B9)`0`!A`````DA`@
+MU-`F`!"P$"`!@<?@"('H```#```+@A!@.('#X`C0`@`!G>._F`,```N"$&`X
+MX@8``8"D8``6@``)H!``&)`0`!B2$"`D0````)00(`"0$``80````)(0("0#
+M`$%V@A!@NH".8$`"@``:E`Y``0,```N"$&`\P@0``8"@8``R@``"E!*@0`,`
+M``N"$&!`P@0``8"@8``R@``"E!*A``,```N"$&!$P@0``8"@8``R@``"E!*@
+M@`,```N"$&!(P@0``8"@8``R@``"E!*D`(".8`$R@``"E!*@!P,0``"`CD`!
+M`H``!)`0`!@#``(`E!*``4````"2$""@`P``"X(08#B`IF``%H``!O(D``&0
+M$``8DA`@)$````"4$"`!@<?@")'H`!&!P^`(D!`@@)WCOYBS+F`0DS9@$("B
+M8'\8@``+D!``&),J8`4#```B@A!@'$````"2`D`!`P``(("*``$2@``#L!`@
+M`;`0(`"!Q^`(@>@``)WCOYBD$``8LRY@$*,V8!"`I&!_&(``+;`0(`"C+&`%
+M(0``(I($0!"0$``20````)00(`"2%"`$D@1`"9`0`!)`````E!`@`)(4(`B2
+M!$`)D!``$D````"4$"``DA0@#)($0`F0$``20````)00(`"2%"`0D@1`"9`0
+M`!)`````E!`@`)(4(!22!$`)D!``$D````"4$"``DA0@&)($0`F0$``20```
+M`)00(`"@%"`<H@1`$)`0`!*2$``10````)00(`"P$"`!@<?@"('H``"=X[^8
+MIA``&*(0`!FS+F`0LS9@$("F8'\8@``GL!`@`*00(`"`IJ```H``%)00(`#D
+M#J`%I2R@",(.H`2D%(`!U`Z@`Y4JH!C"#J`"@RA@$)02@`'"#J`!@RA@")02
+M@`'"#H``E!*``94RH`&#+*`?E!*``:4TH`&C+&`0HS1@"R$``"*2%"`8D@1`
+M"4````"0$``3H!0@'*($0!`5```@E!2`"I`0`!-`````DA``$;`0(`&!Q^`(
+M@>@``)WCOYBD$``9`RJJJH"G(``2@``#EA!BJI80(`"#+*`0@S!@$("@8'\8
+M@`!UD!`@`,(.@`"`H&`!`H``&;(0(`44@``&@*!@!8"@8``B@``&PA:@`C"`
+M`&H"@``0D!`@`#"``&>`H&`$"(``99`0(`#"%J`"@*!@!0B```FR$"``PA:@
+M`H"@8`T(@``%LA`@`1"```.R$"`#LA`@!]0.H`3"#J`%@RA@")02@`'"#J`&
+M@RA@$)02@`'"#J`'@RA@&)02@`&4&H`+P@Z@"8,H8`C:#J`(JA-``:H=0`L9
+M```_F!,C_ZH-0`SF#J`*P@Z@"X,H8`BF%,`!P@Z@#(,H8!"F%,`!P@Z@#8,H
+M8!BF%,`!IAS`"\(.H`^#*&`(V@Z@#J@30`&H'0`+J`T`#/@.H!#"#J`1@RA@
+M"+@7``'"#J`2@RA@$+@7``'"#J`3@RA@&+@7``'"%J`"@*!@#1B```.X'P`+
+MN`\@_Z4LH!"E-*`0HRR@!2$``"*2!$`00````)`0`!B2%"`$D@1`"9`0`!A`
+M````E!``%9(4(`B2!$`)D!``&$````"4$``3DA0@#)($0`F0$``80````)00
+M`!22%"`0D@1`"9`0`!A`````E!``'*`4(!2B!$`0D!``&)(0`!%`````E!``
+M&9`0`!B2$``20````)00`!N!Q^`(D>@`")WCOYB0$``9`P``"X(08"R2!@`!
+M0````)00(`8!````@<?@"('H``"=X[^8DA``&0,```N"$&`LD`8``4````"4
+M$"`&@<?@")'H(`&=X[^8D!``&1,```"2$F``0````)00(`8!````@<?@"('H
+M``"!P^`(D!`@`)WCOYBB$``8E!``&9`0`!A`````$P``&)`0`!@A```8DA0@
+M"$````"4$"`!D!``&)(4(`R4$"`#0````)80(`*`HB```H``"+`0(`"0$``1
+M$P``&$````"2$F`$T#:``+`0(`&!Q^`(@>@``,(2(@B3*F`0DS)@$("@0`D"
+M@``*FA`@#`,```2"$&)RPA(``8((8("`H``!FD`__YH+?_B:`V`+@**@``*`
+M``,!````VB*``('#X`B0$"``&0``!((3(H;"$@`!@*!@``*```B:$"``@A,B
+M=L(2``&`H&``$H```YH0(`&:$"!#`P``!((08HK"$@`!@*!@``*```,!````
+MFA-@!('#X`B0$``-G>._F`,```2"$&)(X!8``:(,(!RC/&`"H`P@`J$\(`&0
+M$``80````)(0`!&0$``80````!,``"8#```(E!(``9`0`!A`````$P``)I`0
+M`!A`````DA``$9`:`!"`H``(E$`@`)`0`!A`````DA``$0$```"!Q^`(@>@`
+M`)WCOYB0$``8(0``$$````"2%"`4L@9`&8(0(`.#*$`9E!(``9`0`!A`````
+MDA0@%(''X`B1Z"`!G>._F)`0`!@A```00````)(4(!2R!D`9@A`@`X,H0!F4
+M*@`!D!``&$````"2%"`4@<?@")'H(`&=X[^8D!``&"$``!!`````DA0@&((0
+M(`&#*$`9E"H``;0.H`&U+H`9E!*`&I`0`!A`````DA0@&(''X`B1Z"`!G>._
+MF)`0`!B`IF`%&(``"+`0/_\3```00````)(28!R0"B`OD3(`&;`*(`&!Q^`(
+M@>@``)WCOYB0$``8$P``$$````"2$F`4`S__GX(08_R4"@`!`P``(("FH``"
+M@``$E!*``0,``$"4$H`!D!``&!,``!!`````DA)@%`,```N"$&`XT@8``0,`
+M0`"2$D`!0````)`0`!@!````@<?@"('H``"=X[^8D!``&"$``!!`````DA0@
+M$`,__'^"$&.?E`H``;(.8`>S+F`"`P```((08`#"`$`9E!*``9`0`!A`````
+MDA0@$`$```"!Q^`(@>@``)WCOYB2$``9(0``"Z(4(#*0!@`10````)00(`;4
+M#@`1@A0@,\(.``&#*&`(E!*``8(4(#3"#@`!@RA@$)02@`&"%"`UP@X``8,H
+M8!B4$H`!D!``&",``"!`````DA1@")H4(#:@%"`WP@X`$(,H8`C4#@`-E!*`
+M`;4NH!*U-J`"E!*`&I`0`!A`````DA1@#`$```"!Q^`(@>@``)WCOYB0$``8
+M(P``($````"2%&!,I!``")`0`!A`````DA1@4*`0``B0$``80````)(48$R`
+MH@`2H$``$)H0(`"2$``(D!`@`+`4``BR$T`)@<?@"('H``"=X[^8D!``&!,`
+M`"!`````DA)@3(''X`B1Z``(G>._F)`0`!@A```@0````)(4("`#`$``E!(`
+M`9`0`!A`````DA0@(`$```"!Q^`(@>@``)WCOYBD$``8D!``&!,``"9`````
+MDA)@9*,R(!.B#&'_@(QA`#*```*B''X`D!``$B$``"!`````DA0@4+`0``B0
+M$``20````)(4($RP'@`(L!X`$8''X`B!Z```G>._F)`0`!@3```00````)(2
+M8""0"B#_F@H@#Y$R(`3"!B',@*!`"!*```>8$"``PA8AT("@0`T2@``#`0``
+M`)@0(`&!Q^`(D>@`#)WCOYB0$``8(0``($````"2%""0P@9``)`"``'0)D``
+MD!``&$````"2%"",P@9@!)`"``'0)F`$D!``&$````"2%""4P@9@#)`"``'0
+M)F`,D!``&$````"2%""(P@9@")`"``'0)F`(D!``&$````"2%""8P@9@$)`"
+M``'0)F`0@<?@"('H``"=X[^8@*9@"`B```F@$``8D!``&!,``#]`````DA)C
+M_X"F0`@(@``'D!``&`,```N"$&+4\B0``1"```VP$"``0````)(0`!F4$``(
+MD!``&!,```1`````DA)@<`,```N"$&+4\B8``;`0(`&!Q^`(@>@``)WCOYB0
+M$``8$P``!$````"2$F!P`P``/X(08_^2"@`!0````)`0`!B!Q^`(D>@`")WC
+MOYB0$``8$P``!T````"2$F/_@*9`"`B```>:$#__`P``"X(08MC:)@`!$(``
+M%K`0(`"0$``8(P``($````"2%&`4`S__^*`*``&0$``80````)(0`!D#/__X
+M@BH``:`4``&0$``8DA1@%$````"4$``0`P``"X(08MCR)@`!L!`@`8''X`B!
+MZ```G>._F)`0`!@3```@0````)(28!0#/__XDBH``4````"0$``8@<?@")'H
+M``@#```+@A!BR-`*``&0&B`!@</@")`*(`&=X[^8@*9@``*``!&D$``8D!``
+M&",``"!`````DA1@!"$_O_^@%"/_E`H`$)`0`!A`````DA1@!!L```N:$V+(
+MP@8`#1"```^""$`0D!``&"$``"!`````DA0@!",`0`"4$@`1D!``&$````"2
+M%"`$&P``"YH38LC"!@`-@A!`$<(D@`V!Q^`(D>@@`9WCOYB0$``8$P``!T``
+M``"2$F/_@*9`"`B```>:$#__`P``"X(08MS:)@`!$(``%[`0(`"0$``8(P``
+M($````"2%&`4(0?_P*`J`!"0$``80````)(0`!F1*B`0`P?_P)`*``&@%``(
+MD!``&)(48!1`````E!``$`,```N"$&+<\B8``;`0(`&!Q^`(@>@``)WCOYB0
+M$``8$P``($````"2$F`4`P?_P)(*``&3,F`00````)`0`!B!Q^`(D>@`"('#
+MX`B0$"`!@</@"`$```"!P^`(D!`@`('#X`@!````@</@"`$```"=X[^8D!``
+M&!,``"=`````DA)@')`*(/^!Q^`(D>@`")WCOYB0$``8$P``($````"2$F!8
+MD`H@!X''X`B1Z``(G>._F)`0`!B4#F`'$P``($````"2$F!8`0```(''X`B!
+MZ````P``"X(08JR!P^`(T`(``9WCOYB0$``8`P``!((08C34!@`!@**@`!*`
+M``>2$``9`P``"X(08JSR(@`!$(``!)`0(`%``````0```(''X`B1Z``(G>._
+MF)`0`!B2$``9E!``&H"F8`$2@``*EA``&X"FH`$(@``)D!`@`("FH`42@``&
+MD!`@#1"```20$"``0`````$```"!Q^`(D>@`")WCOYB0$``8DA``&900`!J6
+M$``;@*9@"Q*```F8$``<E`[@!M0F(?@3```@0````)(28$@0@``$D!`@`4``
+M```!````@<?@")'H``B=X[^8D!``&)(0`!F4$``:EA``&Y@0`!Q`````FA``
+M'8"@``BP0"``@<?@"('H``"=X[^8@*9@``*``"B0$``8(0``$$````"2%"`$
+M%0``P)0J``J0$``80````)(4(`1`````D!`@"K(0(`H#/_\_HA!C_Y`0`!A`
+M````DA0@$`,``$"`B@`!`H``$("F8`!`````D!`@R)`0`!A`````DA0@!)0*
+M`!&0$``80````)(4(`2RAG__$K__\)`0`!@0@``/L!`@`!*```20$``8$(``
+M"[`0(``A```@0````)(4(`05``$`E"H`"I`0`!A`````DA0@!+`0(`&!Q^`(
+M@>@``)WCOYB0$``8(0``($````"2%"`$`P`!`)02``&0$``80````)(4(`2`
+MIF```H``"I`0`!@A```00````)(4(`05``#`E"H`"I`0`!A`````DA0@!`$`
+M``"!Q^`(@>@``)WCOYB0$``8(0``($````"2%"`$`P`!`)02``&0$``80```
+M`)(4(`2`IF```H``"I`0`!@A```00````)(4(`05``#`E"H`"I`0`!A`````
+MDA0@!`$```"!Q^`(@>@``)WCOYB0$``8DA``&K00`!B`IF`!`H``#;`0(`&`
+MIF`!"H``!H"F8`("@``,`0```!"``!*0$"``?___C0$````0@``*L!``"'__
+M_[X!````$(``!P,```M____2`0```!"```,#```+`P``"X(08JCR)H`!D!``
+M&(''X`B1Z``(G>._F)`0`!@3```00````)(28`0#``#`D`H``9$R(!"!Q^`(
+MD>@`")WCOYB`IF`"`H``$I`0`!B`IF`"&(``!H"F8`2`IF`!`H``!I(0(``P
+M@``/`H``!I(0(``P@``,`P```!"```>P$&```P```!"```2P$&```P```+`0
+M8`!`````DA``&)(0`!B!Q^`(D>@`"9WCOYB0$``80````)(0(`R!Q^`(D>@`
+M")WCOYB0$``8E!``&4````"2$"`,`0```(''X`B!Z```G>._F)`0`!B2$"`(
+M0````)00(`0!````@<?@"('H``"=X[^8D!``&)(0(`A`````E!`@()`0`!B2
+M$"`(E!`@!$````"6$"``@*``"+!`(`"!Q^`(@>@``)WCOYB0$``8(0``($``
+M``"2%"!(E`H_WY`0`!A`````DA0@2`$```"!Q^`(@>@``)WCOYB0$``8(0``
+M($````"2%"!(E!(@()`0`!A`````DA0@2`$```"!Q^`(@>@``)WCOYB4$``9
+MD!``&"$``"!`````DA0@0)`0`!B2%"!$0````)00`!H!````@<?@"('H``"=
+MX[^8HA``&("F8#\8@``9L!`@`("F8!\(@``,D!``$2$``"!`````DA0@1((&
+M?^"4$"`!E2J``90J``J0$``1$(``"I(4($0A```@0````)(4($"4$"`!E2J`
+M&90J``J0$``1DA0@0$````"P$"`!@<?@"('H``"=X[^8HA``&("F8#\8@``9
+ML!`@`("F8!\(@``,D!``$2$``"!`````DA0@1((&?^"4$"`!E2J``902``J0
+M$``1$(``"I(4($0A```@0````)(4($"4$"`!E2J`&902``J0$``1DA0@0$``
+M``"P$"`!@<?@"('H``"=X[^8D!``&!,``"!`````DA)@/(''X`B1Z``(G>._
+MF)`0`!B4$``9$P``($````"2$F`\`0```(''X`B!Z```P"I@",`J8`G`*F`*
+MP"I@"X(*K__`*F`,P"I@#8,P8`C"*F`.F@J@_]HJ8`^#*&`(FA-``8"C0`H2
+M@``AD!`@`("*X"`B@``6P"I@%,(*8`R#*&`8V@I@#9LK8!":$T`!P@I@#H,H
+M8`B"$$`-V@I@#YH30`$#```(FA-``8,S8!C"*F`,@S-@$,(J8`V#,V`(PBI@
+M#MHJ8`_`*F`4P"I@%<`J8!;`*F`7P"I@$,`J8!'`*F`2P"I@$Y`0(`&!P^`(
+M`0```)WCOYB0$``8X`>@7,(.8!>`B&`!`H``9K`0(`_"#N`7@(A@`3*```C"
+M#F`20````)(0(`R`H@`:`H``7;`0(`_"#F`2@RA@"-H.8!.""&\`@A!`#<(T
+M``#"#F`4@RA@&-H.8!6;*V`0FA-``<(.8!:#*&`(@A!`#8,H8`2#,&`3PC0@
+M`L`L(`3"#F`4@RA@&-H.8!6;*V`0FA-``<(.8!:#*&`(@A!`#=H.8!>:$T`!
+M@(M@`C*``!+:#F`0@(M@!!*```>"$"`!P@Y@%X"(8!`"@``%P@P@!((08`@0
+M@``'PBP@!((08`+"+"`$P@Y@%X,P8`7"+"`%V@Y@$)LK8!C"#F`1@RA@$((0
+M0`V#,&`3PBP@!L(.8!2#*&`8V@Y@%9LK8!":$T`!P@Y@%H,H8`B"$$`-V@Y@
+M%YH30`&`BV$``H``!H(0/_\#```?@A!B`((+0`&#,&`)PBP@!\(.8!"#*&`8
+MV@Y@$9LK8!":$T`!P@Y@$H,H8`B"$$`-@S!@#X((8`_"+"`(P@Y@$(,P8`."
+M"&`'PBP@"<(.8!*#,&`$@@A@`<(L(`JP$"``@<?@"('H````````````````
+M`````````````````````````````)WCOV#X)Z!4IA``&*P0(`"J$"``P">_
+MQ,`GO\#"%J`"@(AA``*```2;*&`0$(``!8,S8!?"%J`"@S!@!X(88`&`B&`!
+M$H`"G)H0(`S"%J`"@(A@(`*```2;*&`0$(``!8,S8!;"%J`"@S!@!H(88`&`
+MB&`!$H`"D)H0(`R0$``80````)(0`!JN$``(@*(@``*``HF:$"`,@*9@!B*`
+M``N`IN``&(``!H"F8`B`IF`!&(`"@8"FX``P@``$$H`"?IH0(`R`IN```H``
+M*Y`0`!@A```@0````)(4($S0)[_$D!``&$````"2%"!0T">_P,(&(<R`H&`#
+M*(``"*(0(`"0$``8$P``!$````"2$F%`$(``#M`GO]"H![_X`P``!*0084"3
+M+&`"H`)`%)("0!)`````D!``&*($8`&`I&`)"+__^=`D/]C"#>`$@(A@`C*`
+M``7"%>`"@@A__L(MX`3"%>`"PC:@`L(-X`3"+J`$D!``&!,``"!`````DA)@
+M6("B(``2@``#N!``"+@0(`&0$``8$P``($````"2$F`$`P"``*@*``&0$``8
+M(0``$$````"2%"`0`P`_@((08&"Z"@`!D!``&$````"2%"`4T">_S)`0`!A`
+M````DA0@&-`GO\C2%J`"0````)`0`!B`HB```H`",)H0(`/"%J`"@@AA\("@
+M8,`B@``2K!`@!!2```>`H&%`@*!@H"*```VL$"`#$(``#<(&(<P"@``&@*!A
+M4"*```6L$"`"$(``!\(&(<RL$"`!$(```ZH0(`&J$"`"P@8AS)`0`!@3```F
+M@*!@`QB```64$"`'D!``&!,``":4$"!'0`````$```#"!B',@*!@`PB``$60
+M$``8V!:@`H"+((`"@``PHA`@`!<```2"$N)PVA3``0,```R`HT`!*(``*@,`
+M``"`BR`@(H``!@,```2"$N-LX!3``1"```6"$N-PFA!C;N`4P`V"$&-RXA3`
+M`9`0`!!`````DA`@`Z`0``B0$``10````)(0(`.6#6`#ERK@`@,```""$&``
+ME@+``=H"X2R:"W\_@RP@!H((8,":$T`!VB+A+-@"X3B8"S_PFS0@`IH+8`&"
+M`@`(@@A@#IH30`&8$P`-V"+A.*(0(``#````I!!@`*`-8`."!$`1@@!`$9LH
+M8`+2!(`-@@!`$(,H8`+4!(`!0````)`0`!BB!&`!@*1@&PB___:"!$`1D!``
+M&$``!!62$``:HA`@``,```"D$&``H`V@!X,L8`*"`$`1FRA@`M($@`V"`$`0
+M@RA@`M0$@`%`````D!``&*($8`&`I&`B"+__]H,L8`*B$"```P```*008`"@
+M#6`#@@1`$8(`0!&;*&`"T@2`#8(`0!"#*&`"U`2``4````"0$``8H@1@`8"D
+M8#\(O__V@@1`$:(0(``#````H!!@`(,L8`.`IN```H``!]($``$#/__@@@)`
+M`8"@;_\H@``(H@1@`8,L8`."`$`0U`!@!$````"0$``8H@1@`8"D8*H(O__Q
+M@RQ@`\(&(<R`H&`#&(``'H"FX`"0$``8(0``($````"2%"`<%3_\`)0J``H#
+M`'0`E!*``9`0`!A`````DA0@')`0`!B2$"!<0````)00(`"0$``8$P``)I(2
+M8'A`````E!`@")`0`!A`````DA0@2)02)`"0$``80````)(4($B`IN```H``
+M)"$```N0$``8(0``()(4($Q`````U`>_Q)`0`!B2%"!00````-0'O\#"!B',
+M@*!@`PB```FB$"``D!``&!,```22$F%`0````-0'O]`0@``0(0``"P,```2D
+M$&%`H`>_^(,L8`*2`$`2@@!`$-0`?]A`````D!``&*($8`&`I&`)"+__^8,L
+M8`(A```+@A0@+-0,P`&"%"`MP@S``8,H8`B4$H`!@A0@+L(,P`&#*&`0E!*`
+M`8(4("_"#,`!@RA@&)02@`&0$``80````!,``"":%"`P@A0@,<(,P`&#*&`(
+MU`S`#902@`&4$H`4D!``&"4``"!`````DA2@!)`0`!A```L!DA``&9`0`!@C
+M```00````)(48!"4$@`=D!``&$````"2%&`0D!``&)(48!1`````U`>_S)`0
+M`!B2%&`80````-0'O\B0$``8DA2@6$````"4$``<@A0@,M0,P`&"%"`SP@S`
+M`8,H8`B4$H`!@A0@-,(,P`&#*&`0E!*``8(4(#7"#,`!@RA@&)02@`&0$``8
+M0````)(4H`B:%"`V@A0@-\(,P`&#*&`(U`S`#902@`&0$``80````)(4H`R@
+M%"+0D!``&)(4H!A`````U`3`$)`0`!B2$""`0````)00/__"!B',@*!@!!*`
+M``V0$``8PA8AT("@8`$8@``)`0```$````"2$"`4E!(D`)`0`!A`````DA`@
+M%)`0`!A`````DA``&H"B(``"@`#AFA`@`X"F8`8"@``3D!``&,(&(@2`B&`#
+M`H``#P$````A```F0````)(4(405"```E"H`"L(&(@2""&`!@RA@'902@`&0
+M$``80````)(4(420$``80``$3Y(0`!J0$``80``!^)(0`!>`HB```H``Q9H0
+M(`/:%B'(`P``/((081N`HT`!$H``#)`0`!C"%J`"@(A@@`*```DA```FD!``
+M&!,``#:2$F`(0````)00)0*0$``8(0``)I(4(!Q`````E!`@`9`0`!A`````
+MDA0A%`,___"0*@`!PA:@`H"(8"`"@``$DA`@"I$J(`*2$"`60````"$``"9`
+M````D`(@9)`0`!A`````DA0@8)02(`&0$``80````)(4(&"0$``8DA0@8)00
+M(`%`````EA`@`)`0`!A`````DA``%X"B(``R@``*(0``"\(6H`*`B&`@$H``
+M!-H6H`*"$V`"PC:@`A"``(B:$"`#@A0BL,($P`&`H&``(H``"Z`0(`"0$``8
+M$P``)I(282!`````%0``?)H4(K2"$"`!PB3`#:`0(`"B$"`!DRP@`I(B<`"5
+M+$`00````)`0`!B@!"`!@*0@"02___J3+"`"H!`@`)`0`!A`````DA``$*`$
+M(`&`I"`)!+___)`0`!B2$""D%0``0$````"4$J`!D!``&)(0(*A`````E!`@
+M`9`0`!B2$""L0````)00(`&0$``8)0``!$````"2%*"PE!``")`0`!A`````
+MDA2@L)`0`!B2$""@(0`"`D````"4%"%E`P``"Z(08#B@%"%EX"3`$9`0`!A`
+M````DA`@K`,``<"4$@`!D!``&$````"2$""L@*9@!A*```T#```$D!``&$``
+M``"2$""@E!(`$I`0`!A`````DA`@H,($P!&"$$`2PB3`$0,```2"$&),P@8`
+M`8"@8``"@``%D!``&$````"0$``8D!``&"$``"!`````DA0@(!4`8`"4*@`*
+MD!``&$````"2%"`@`P``"X(08M32!,`!@*)__P*```4#```+0````)`0`!@#
+M```+@A!BV-($P`&`HG__`H``!0,```M`````D!``&`,```N"$&+<T@3``8"B
+M?_\B@``%U`8A^$````"0$``8U`8A^("BH``B@``'\B8AW)`0`!@3```@0```
+M`)(28$CR)B'<$(``"+`0(`'8!Z!4P@,``("@8``R@``"VB,``+`0(`"!Q^`(
+M@>@``)WCOYB0$``80```^I(0(`*!Q^`(D>@`")WCOYB@$``8D!``&)(0(`!`
+M````E!`@`8"B(``"@``+L!`@`)`0`!!```#LDA`@$X"B(``"@``%L!`@`$``
+M``"0$"@TL!`@`8''X`B!Z```G>._F)`0`!B2$"``0````)00(`&`HB```H``
+M;((0(`""#F'P@*!@P"*``">0$``8%(``"("@84"`H&"@`H``$("@8+`"@``/
+MD!``&#"``$T"@``O@*!A0!2```:`H&%0@*!@T`*``!B0$``8,(``10*``">0
+M$``8,(``0I`0`!@A```FDA0@!$````"4$"``D!``&!,``"B2$F(`0````)00
+M(`.0$``8DA0@?$````"4$"`90````)`0(2P0@``QD!``&"$``":2%"`$0```
+M`)00(`#"%B'(@*!@$A*``"F0$``8DA0@?$````"4$"`80````)`0(2R0$``8
+M$P``*)(28@`0@``<E!`@`H".8!`"@``&D!``&!,``":2$F`$$(``!900(`,3
+M```FDA)@!)00(`!``````0```,(6(<B`H&`2$H``#Y`0`!@3```FDA)@?$``
+M``"4$"`80````)`0(2R0$``8$P``*)(28@"4$"``0`````$```"0$``80```
+M@I(0(!.`HB```H``#X(0(`!`````D!`H-)`0`!B2$"``0````)00(`&`HB``
+M`H``!H(0(`"0$``80```<Y(0(`""$``(@<?@")'H``&=X[^8J!``&*80`!B0
+M$``80````)(0`!FD$``(@*(@``*``&2P$"```P``"Z`08K3"!0`0@*!@``*`
+M`#20$``4*P``)D````"2%6$@`P``0("*``$2@``MD!``%,`E`!`A```G0```
+M`)(4(!"L$``(D!``%$````"2%"`4HA``")`0`!1`````DA0@&(,UH`&;-&`!
+M@@!`#9,P8`>C-&`&@*``"9I`(`"`H``1@D`@`("+0`$B@``5D!``%+`@``A`
+M````D!``&+`*(#^0$``60````)(0`!&@"B`?D!``%$````"2%6$@@RX@!902
+M``&4$H`0E!*H`)`0`!1`````DA5A()`0`!1```$$DA``$H"B(``2@``)D!``
+M%,(68`*"$&`"PC9@`L(4H`*""'_]$(``%<(TH`)`````DA``$H"B(``2@``2
+M$0``!$````"0$B.(D!``%$````"2$``2@*(@`!*```H!````PA9@`H"(8"`2
+M@``$VA9@`H(38`+"-F`"$(``"[`0(`!```@"D!``%`,```N"$&*TP@3``8"@
+M``&"8#__PB:``+`0(`&!Q^`(@>@``)WCOY"`IF``$H```X(0`!F"$#__PB>_
+M])`0`!A`````DA`@#)`0`!@3```00````)00`!E`````D!`@#[(.8`/"![_T
+M@@A@`\(GO_20$``8$P``$)00``%`````EA``&8".8`$2@``1H!``"((0(!7"
+M)[_TU`^_],(/O_6#*&`(E!*``<(/O_:#*&`0E!*``<(/O_>#*&`8E!*``9`0
+M`!A`````DA`@%(''X`B1Z``0G>._F-(60`#4%F`"0````)`0`!B:$``(PA9@
+M`H"(8(`"@``3IA`@`(,J(!"E.&`0H`2`$J`$`!*A+"`"(P```*(48`"D!``1
+MT`2@!$````"2$"`(I@H@_Z<LX`7"!``1@RA@!*84P`':%*`(F2M@$(,[(!"`
+MH&"0%(``!I$K8!"#,R`0@(A@`2*```F1.B`0D3H@$)`"/^A`````DA`@"*(*
+M(/\0@``*@A`@`9`"/^B#,B`?D`(``9$Z(`%`````DA`@"*(*(/^"$"``HRQ@
+M`H(`0`&B%$`!HA1D`90,X/^5*J`(@@Q@_Y02@`&0$``8(0``)D````"2%""<
+MHS1@"!4``#^4$J,`E`S`"H(,8/^4$H`!D!``&$````"2%"#0`P``!((08C3R
+M)@`!@<?@")'H(`&=X[^8D!``&!,``"9`````DA)@9)$R(!.0"B'_@(HA``*`
+M``.P$``(L!(^`+$N(!"Q/B`0@<?@"('H``"=X[^8D!``&"$``"9`````DA0@
+M9)0*,`"B#F#_@RQ@"8((;@"4$H`!M`ZA_Y02@!J0$``80````)(4(&20$``8
+M0````)(4(&"4$B`"D!``&$````"2%"!@@*1@``*```:T$"`XM`Y@_X,NH`."
+M($`:M2A@":`0(``C```FD!``&$````"2%&!@@(H@`@*```J`I"`[0````)`0
+M`!J@!"`!@*0@.R2___>0$``8$(``"K`0(``$@``$`0```!"```:P$"``?___
+MP)`0`!B1*B`0L3H@$(''X`B!Z```PA)@`H((8>"`H&#`(H``$`,```04@``'
+M@*!A0("@8*`"@``)`P``!!"```V0$"``,H``"Y`0(``#```$$(``!8(08LP0
+M@``#@A!BSH(08M#"$@`!PC*``)`0(`&!P^`(`0```)WCOY"@$``8D!``&)(0
+M`!E____CE`>_]H"B(``"@``9L!`@`)`0`!`3```F0````)(28&!___^4D!``
+M$(,J(!"#.&`0VE>_]H"@0`TD@``&T#9@%L(68`*"$&`"PC9@`M`V8!:#*B`0
+M@SA@$-I7O_:`H$`-!(```[`0(`&P$"``@<?@"('H``"=X[^0P@8AS("@8`,8
+M@``DHA``&)`0`!A`````DA``&8"B(``"@``?D!``$9`0`!B2$``9?___N)0'
+MO_:`HB```H``(+`0(`"@$"```P```+`08`#2#@`0D!``$7___W>4$"``@RH@
+M$(,X8!#:5[_V@*!`#22```/0-F`6P#9@%J`$(`&`I"`"*+__]-(.`!"`I"`$
+M$(``"[!`(`"0$``1(0``)D````"2%"!@E!(@`I`0`!%`````DA0@8+`0(`&!
+MQ^`(@>@``)WCOYC"%D``E!```8,H8!"#,&`0&P```-H38`"`H$`-&(``#)@0
+M(``#````EA!@`(,JH!";,&`0F`,@`8,K(`+"$L`!@*-``2B___V8`R`!FRL@
+M`@,```""$&``F@-``=!38`)`````DA`@`Y$J(!"1.B`0@<?@")'H``B=X[^8
+MPA9@`H((8("`H``!@A`@`JA`?__"%F`"@@AAX("@8,`"@`!KIA``&("@8,`4
+M@``'@*!A0("@8*`"@`!=`P``!!"``,6P$"``,H``P[`0(`#"%D``@@!P7X,H
+M8!"#,&`0@*!DZCB```?"%D```P``!)H08U3J%@`-$(``)H(08U8;/__ZFA-C
+M=((`0`V#*&`0@S!@$("@8.\X@``'PA9```,```2:$&-8ZA8`#1"``!F"$&-:
+M&S__^IH38H2"`$`-@RA@$(,P8!"`H&#@.(``!]H60``#```$FA!C7.H6``T0
+M@``,@A!C7JP0(``#```%@A!B7("C0`$(@``'JA`@``,```2:$&-@ZA8`#8(0
+M8V+L%,`!%P``!((2XMCB%,`!@A+BWNX4P`'"%,`!@*```8)@/_^R$``!F2T@
+M$)DS(`X#````@A!@`)@#``'"`R`\&P0``)HH0`V"$N/,PA3``8,H8!R:$T`!
+MVB,@/,(#($@;`0``FBA`#8(2X\["%,`!@RA@&IH30`':(R!(V@,@_)H+?_>6
+M$N/*PA3`"X,H8`.:$T`!$(``%]HC(/R:$&-DZA8`#9H08V;L%@`-FA!BVN(6
+M``T0@``*@A!BX`,```2:$&-HZA8`#9H08VKL%@`-FA!BW.(6``V"$&+B[A3`
+M`<(4P`&`H``!@F`__[(0``&E+2`0I32@#@,```""$&``I`2``>`$H(2@##\_
+MHRQ@$*,T8!"0$``10````)(0(`21*B`'@RY@$(,P8!"#*&`&D!(``9`*(,"@
+M%``(X"2@A.`$H)"@##_XD!``$4````"2$"`$D3(@`9`*(`>@%``(X"2@D*`,
+M/W^C+6`0HS1@$)`0`!%`````DA`@`Y$J(`>0"B"`H!0`".`DH)#@!*"<H`P_
+M_)`0`!%`````DA`@`Y$R(`&0"B`#H!0`".`DH)R@##_CD2V@$)$R(!!`````
+MDA`@`Y$J(`*0"B`<H!0`".`DH)S:!*#,F@M_]X,MX`.""&`(FA-``=HDH,R@
+M$"```P```*(08`"#+2`0I3!@$(($`!""`$`0FRA@`M($0`V"`$`2@RA@`M0$
+M0`%`````D!``&*`$(`&`I"`8"+__]H($`!`#```+@A!BP,`DP`&P$"`!@<?@
+M"('H``"=X[^8PA:@`H((8>"`H&#``H``#I80`!B`H&#`%(``!X"@84"`H&"@
+M`H``"9H0(`$0@`!/L!`@``*```6:$"``$(``2[`0(`":$"`"F@-`#9H#0`L9
+M```$@A,BYH(#0`'4$&`$@A,B[((#0`'"$&`$@RA@!I02@`&"$R+R@@-``<(0
+M8`2#*&`,E!*``8(3(OB"`T`!PA!@!(,H8!*4$H`!@A,B_H(#0`'"$&`$@RA@
+M&)02@`&"$R,$@@-``?008`2"$R,*@@-``<(08`2#*&`&M!:``8(3(Q""`T`!
+MPA!@!(,H8`RT%H`!@A,C%H(#0`'"$&`$@RA@$K06@`&8$R,<F@-`#,(38`2#
+M*&`8@*9@`0*```JT%H`!@*9@`2J```D#```+@*9@`B*```64$``:$(``#[`0
+M(`"T$``*`P``"X(08JSR(L`!D!``&"$``"9`````DA0A8)`0`!B2%"%D0```
+M`)00`!JP$"`!@<?@"('H``"=X[^8PA9@`H((8>"`H&#``H``':P0`!B`H&#`
+M%(``!X"@84"`H&"@`H``&*X0(`$0@`#/L!`@`#*``,VP$"``KA`@`)`0`!@A
+M```F0````)(4(424"C_'`P``!((08]#"%@`!@RA@`X((8#B4$H`!D!``&$``
+M``"2%"%$$(``!,(&(<RN$"`"P@8AS("@8`,8@``)D!``&"$``"9`````DA0A
+M$)02(`.0$``8$(``'Y(4(1`E```F0````)(4H1"4"CP&H`7`%Z`$`!8C```$
+M@A1BX(($``'"$&`$@RA@!)02@`&4$J`!D!``&$````"2%*$0D!``&`,```N"
+M$&*LT@6``4````"4$``9HA1BR*`$`!'4%"`$E`JA_Y02H@"0$``8DA2A:$``
+M```C```FD!``&$````"2%&!$`S__\((08'^4"@`!H`7`%Z`$`!8K```$@A5B
+MH(($``':$&`"FRM@!P,```^"$&.`F@M``902@`V0$``80````)(48$20$``8
+M0````)(48$@5``#\E"H`"J@58JC"%``4@RA@#!L``/R""$`-E!*``9`0`!A`
+M````DA1@2)`0`!A`````DA1@4"4__\"4"@`2F`7`%H(58LB"`P`!VDA@`9LK
+M8`@#```_@A!C`)H+0`&4$H`-IA5BP)@#`!/""R`&E!*``9`0`!A`````DA1@
+M4((58KB"!``!PA!@`I4H8!B#*&`0E!*``=H4`!.#*V`(E!*``902@`V0$``8
+M0````)(48#20$``80````)(48"BD%*#_E`H`$J@$`!3"%2`&@RA@")02@`&0
+M$``80````)(48"B0$``80````)(48&05``'\E"H`"H(58K"@!``!PA0@!(,H
+M8`P;``'\@@A`#902@`&0$``80````)(48&2"%6)PVA6``0,```R"$&`"@*-`
+M`1B```VB$"`"VA8ARH(58"*`HT`!$H``&Y`0`!C"%F`"@(A@0#*``!>B$"`(
+M$(``%B$``";"%D``@@A@'X"@``&:0"``@@!_]H"@8`P8@``#F!`@`9@0(`"`
+MBT`,`H``"9`0`!B"!<`7@@!`%AL```2:$V,@@@!`#<(08`:B!$`!(0``)D``
+M``"2%"$DE`H_`8($0!&""&#WE!*``9`0`!A`````DA0A)+`0(`&!Q^`(@>@`
+M`)WCOYB0$``8E!``&8"F8#\(@``#@A``&8(0(#_",B'\$P``)D````"2$F$\
+M@<?@")'H(`&=X[^(PA9@`H((8>"`H&#``H``'*`0`!B`H&#`%(``!X"@84"`
+MH&"@`H``)!L```40@`!<L!`@`#*``%JP$"``&P``!((38^;"%@`!PC>_[((3
+M8]*"!@`!PB>_Z)H38^B:!@`-VB>_\`,```6:$&-*YA8`#8(08TP0@``CI`8`
+M`1L```6"$V'PPA8``<(WO^R"$V'R@@8``<(GO^B"$V(2@@8``<(GO_""$V.<
+MYA8``1"```Z:$V.>@A-A\,(6``'"-[_L@A-A^((&``'")[_H@A-BKH(&``'"
+M)[_P@A-CO.86``&:$V.^$(``!Z0$``V:!``-`P``!8(08]00@``BH@-``=06
+M0`"0$``80```)Y('O^BB$"``D!``&$````"2$``9`P``!((08W3"%``!@*1`
+M`1:``!2:$"```P``!)808W""$&-TV!0``8(#0`V"`$`0@@!`"\(08`:`H&``
+M(H``!IH#8`&`H$`((K__X9LK8`::`V`!@*-`#`:___6"`T`-EA``$Y`0`!B2
+M$``1E!``$D```168$``9L!`@`8''X`B!Z```G>._F*H0(`"L$"`_$0```)`2
+M(`!`````DA`A"!$```"0$B``0````)(0((`#````J!!@`*8%(("B$"`!I!`@
+M`(,LH!"#,&`/XC4``8($8`&B$``!@RA@$(,P8!"`H&`_"+__^*0$H`$;````
+MFA-@`.0S8`:"$"`!PC-@`H(0(#_",V`$PA-@!H"@8``"@``3I!`@`*(0``VA
+M+*`0H30@#Y$NH!#2%0`0D3(@$$```G&4$``9T#3`$(($H`&D$``!@RA@$(,P
+M8!#:%&`&@*!`#0J___.A+*`0T!3```,```#:$&``@@-`#8(`0!/4$'_^@*-@
+M``*``#VD$"```P```)(08`"#+*`0@S!@#YLJ(!";.V`0V!3``<)4P`&`HT`!
+M!H``!,(28`:0$``,JA``$H(@0!*"`'__@RA@$(,P8!"`H&```H``$8(`0`&6
+M`$`3VE+__M@4P`'"5,`!@*-``32```+8,O_^@@2@`:00``&#*&`0@S!@$-H2
+M8`:`H$`-"K__XH,LH!`#````PA!@`("@8``"@``5I!`@``,```#6$&``@RR@
+M$(,P8`^;*J`0FSM@$-@4P`'"5,`!@*-``1:```2"!*`!E!``#*P0`!*D$``!
+M@RA@$(,P8!"`H$`+"K__\H,LH!"1*B`0D3H@$)`"(!E`````DA`@,H("``B"
+M`$`(@RA@`X(`0`BD`$`!LA`@`*(0(`"1+*`0D3H@$$````"2$"`RD`(@`0,`
+M```0@``'FA!@`+(&8`&#*&`0@S!@#^HS0`&B!&`!@RQ@$(,P8!"`H$`(!K__
+M^((0`!D#````VA!@`)H#0`V:`T`3@RR@$(,X8!#:4W_^@*!`#1:``#ZB$"``
+M`P```*H08`"D!*`RPA5@!H(`0`&"`$`3FRR@$*$[8!#T4'_^@*0`&A:```R#
+M+&`0@S!@#]!4P`&0)``(@@!`$])08`)`````DB0`"8"B(``TO__UH@1@`9$L
+MH!"1,B`0@RQ@$(,P8`_2%,`!F@!`$]038`+6%0`!ERK@$9<RX!""`$`4V!!@
+M`IDK(!&9,R`00``"7IH0(`"0`B`!`P```)@08`"#+F`0FS!@#Y$J(!"1,B`1
+M@RV@$(,P8!"`H@`!"(```]`S``WL,P`-PA5@!H(`0`&"`$`3FRR@$)L[8!#"
+M4'_^@*-``0:__\BR!F`!@RY@$(,P8!"`H&`_&(``#P,```"8$&``@RY@$(,P
+M8`^:`$`,VA-__MHS``&"!F`!LA```8,H8!"#,&`0@*!@/PB___>#+F`0`P``
+M**`088"B$"```P```*808``#```_I!!C_YLL8!";,V`.@@-`$\(08`*#*&`(
+M@A!@_Y0(0!*9*J`0PA3`#8,H8`B"$&#_@@A`$I03``&0$``80````)(0`!""
+M!&`!HA```8,H8!"#,&`0@*!@'PB__^N@!"`$@<?@"('H``"=X[]@J!``&*X0
+M(`"F$"``P#>_WJ00(`""$"`_PC>_UJP0(``#````JA!@`,)/(`6"`$`!PC>_
+MSL(7(`*`B&$``H``![H0(#\#```$$(``!H(08HX0@`")XC>_W@,```2"$&*/
+MU`X``94JH!B5.J`8D!``&$````"2$``<@*9@``*``$70+[_'HA`@`)8'O_B#
+M+&`0FS!@$(,K8`/8%D`!PA9``8"@8``"@``+@@-`#8(`0`O8,'_P@@1@`:(0
+M``&#*&`0@S!@$("@8`<(O__R@RQ@$*`0`!'0%P``E2Q@$)4RH!"2![_HE@>_
+MYD```BZ8![_DH2P@$("D(``"@``2HA`@`)@'O_C:%[_FH30@$(,L8!"#,&`/
+M@@!`#,(0?_"`HT`!`H``"(($8`&B$``!@RA@$(,P8!"`H$`0"K__]H,L8!#:
+M%[_FPA>_Y("C0`$2@``&@RQ@$,(7``"`HT`!`H``"(,L8!"#,&`-@@9``<(`
+M8`2`H&```H``"(,NX!"#+&`0@S!@#8(&0`'"$&`"PC>_UH,NX!"`H&```H``
+M%:(0(`"4![_XES!@$)LL8!";,V`0F`-`#9@#``J#*V`"@@!`#8(`0`&"!H`!
+MPA!@",(S/_""!&`!HA```8,H8!"#,&`0@*!`"PJ___*;+&`0T!<``*$NX!"A
+M-"`0D@>_Z)00`!"6![_F0``!YY@'O^2`I"```H``&:(0(`"6![_XV!>_YMH7
+MO^2#+&`0@S!@#X(`0`O"$'_P@*,``2*```*N$``1@RQ@$(,P8`^"`$`+PA!_
+M\("C0`$"O_]_@@1@`:(0``&#*&`0@S!@$("@0!`*O__O@RQ@$*(0(`#"%R`"
+M@(A@0`*``!6#+&`0@S!@$("@8`0H@``<FRW@$(,L8!"#,&`0@*!@!0*``":#
+M+&`0@S!@$("@8`8"@``R@RQ@$(,P8!"`H&`',H``3-`7```0@``]FRW@$(,P
+M8!"`H&`'.(``1M`7``"#*&`"&P```)H38`#"`T`!@<!```$```";+>`0FS-@
+M$(,K8`*"`$`-@@!``8(&@`'F$&`&UA>_WILJX!";,V`0@RM@`H(`0`V"`$`!
+M@@:``1"``"_D$&`&FRW@$)LS8!"#*V`"@@!`#8(`0`&"!H`!YA!@!,(7O]Z;
+M*&`0FS-@$(,K8`*"`$`-@@!``8(&@`$0@``?Y!!@!)LMX!";,V`0@RM@`H(`
+M0`V"`$`!@@:``>808`+6%[_>FRK@$)LS8!"#*V`"@@!`#8(`0`&"!H`!$(``
+M#^008`*;+>`0FS-@$(,K8`*"`$`-@@!``>86@`'"%[_>FRA@$)LS8!"#*V`"
+M@@!`#8(`0`'D%H`!T!<``-(7O^;4%[_DERS@$)<RX!"9+*`0F3,@$$```1":
+M$"``V!>_UILK(!"#*B`0@*!`#2J```*8$``(PA<@`H"(8!`"@``2D!``#!D`
+M``2"$R)PVA4``0,```R`HT`!"(``#(,L8!""$R)^V!4``=H5``&#*B`0@S!@
+M$("C0`$X@``"F!``")`0``R#+&`0F3!@#X,J(!"1,&`0UA>_SH,JX!";,&`0
+MU@^_QX,JX!B#.&`8FB-``8"C0`@T@``"FA``"(,L8!"`H&``$H``$-HU0`S:
+M!B(`F@-`#0,```""$&``VA!`#9H#0`W"%4``@B!`#:P0``&#*&`0@*!@`"2`
+M``*L$"`!@RQ@$)DP8`_:%4`,@RV@$(,X8!"`H$`--(```H(0``W"-4`,@@1@
+M`:(0``&#*&`0@S!@$("@8`<HO_]3PA<@`MH50``#```+@A!BQ-HE``&:$"``
+MH@M@`:$L8![4%6`&E`]`"I4JH!B4%``*J2Q@%I02@!3"%6`$@@]``8,H8!"4
+M$H`!IRQ@#I02@!/"%6`"@@]``8,H8`B4$H`!HRQ@!I02@!'"%4``@@]``902
+M@`&0$``8)0``)D````"2%*$TPA5@#H(/0`&#*&`8H!0``:`4`!3"%6`,@@]`
+M`8,H8!"@%``!H!0`$\(58`J"#T`!@RA@"*`4``&@%``1PA5@"((/0`&@%``!
+MD!``&)(4H3A`````E!``$-(50`!`````D!``&,(50`#"-B'^@<?@"('H``"=
+MX[^`D2X@$)$R(!"3+F`0DS)@$)00`!I```!.E@>_]H"B(``"@``$I2X@$!"`
+M`$?P%[_VI32@$-06H`20$``2T@:``)8'O_1```#+F`>_\J,N8!"C-&`0TA>_
+M])`0`!&4$``:E@>_\$```1:8![_NTA>_\I`0`!&4$``:E@>_[$```1"8![_J
+MT!>_]-(7O_"4$``:0```+Y8'O^C0%[_TTA>_[I00`!I````JE@>_YM(7O_#4
+M%[_NUA>_Z-@7O^:0$``10```5YH0(`"@$``(T!>_\M(7O^R4$``:0```'98'
+MO^C0%[_RTA>_ZI00`!I````8E@>_YM(7O^S4%[_JUA>_Z-@7O^:0$``10```
+M19H0(`"8$``(TA>_]-07O_*A+"`0H30@$)DK(!"9,R`0D!``$I80`!!````Z
+MFA`@`)$J(!"Q,B`0@<?@"('H``"=X[^8GA``&I00`!N8$``9]@:@",(6H`2`
+MH&```H``*IH0(`"#+B`0L3!@$)80(`#"%L``@*!`&!*``!R"`V`!N`;@",(6
+MX`:`HL`!&H``%K00(`"#*R`0LS!@$,(7``"`H$`9$H``"8(&H`&#+J`0@S!@
+M#X(`0!O"$&`>PC*``!"``!*P$"`!M!```8,H8!"#,&`0^A;@!H"@0!T*O__P
+MN`<@`H(#8`&:$``!@RA@$(,P8!#Z$^`$@*!`'0J__]VV!N`TL!`@`(''X`B!
+MZ```G>._F)`0`!N2$``<H!``&+@0`!NB$``)MA`@9)$J(!"1,B`0DRI@$$``
+M``"3,F`0@*(@``*``$:P$"``@*=@`#*```*V$"`!@RZ@$+4P8!"#+F`0DS!@
+M$("F@`D"@``P@RP@$(,P8!""($`)D`!``9`"``&1*B`#D`(``9$J(`)`````
+MDB:`":`0``B1*B`0@*(@``:```B#+R`0@RP@$(,X8!"`H&!D)(``#*$L(!"#
+M+&`0@*=@``*``!>1,&`0@@(`"((`0`B#*&`#@@!`"!"``!&1*&`"H3P@$),L
+M8!"3,F`00````)`0`!"B$``(D!`@9)`B`!"3+R`00````),R8!"B!$`(D@[@
+M94````"0$``1$(``#((0``B`IV```H``"8(0`!R;*&`0FS-@$((#0`V"`$`-
+M@RA@`X(`0`V#*&`"@RA@$+$P8!"!Q^`(@>@``)WCOYB>$``9FA``&Y@0`!RR
+M$``:M2Z@$+4VH`^T!H`/^!:__K$N(!"Q-B`0@@8`&((`0!B#*&`#@@!`&+$H
+M8`+Z$\``@@=`'8(`0!V#*&`#@@!`'8,H8`*"`'_V@*8``1J```7T$\``]#;`
+M`!"``!;"$\``NR\@$+LW8!""!T`=@@!`'8,H8`."`$`=@RA@`H(`8`J`I@`!
+M"(``#8,N8!#X-L``$(``*/@S``#V,T``$(``!<(3P!G"$\`9PC-``,(6X`(0
+M@``@PC,``("@8``"@``=N!`@`+4P8!"R!P`<^A/`&8('0!V"`$`=@RA@`X(`
+M0!V#*&`"@B!`&((`8`F`H&`2"+__ZO83P!FV!D`/^A;@`H('0!V"`$`=@RA@
+M`X(`0!V#*&`"@@!_]H"F``$*O__BN`<@`8"G`!H&O__IL@<`'(''X`B!Z```
+MG>._F)80`!N8$``<D!``&-H&H`C"%J`$DA```8,H8!"`H&```H``#900(`"#
+M+F`0LS!@$(,J8!"3,&`0PA-``("@0!D"@``%E`*@`8"B@`D&O__[F@-@-)$J
+M(!"1,B`0D@-@"'___Y34$V`&`0```(''X`B!Z````P``"X(08!"6`@`!&0``
+M`)@3(`#:`R`$VB(``8,K8`."($`-@RA@`I@#(`B"`$`,PB+@&((0(`'"(N`4
+M@A`@%,(BX`R"$"`C@</@",(BX!`#```$@A!B-,("``'"$&`"@(A@(`*```B:
+M$"``F!`@')80($"4$"!RP")@#!"```B"$"!WF!`@,I80(`"4$"`R@A`@%,(B
+M8`R"$"`CPB)@$-("8`2`HD`-FD`@`("C``F"0"``@)-``0*```F0$"``@*)`
+M"YI`(`"`HH`)@D`@`("30`$R@``"D!`@`8'#X`@!````G>._F"$```N"%"+$
+MU`8``94JH`D#```?@A!B`)0*@`$#```@E!*``9`0`!@3```F0````)(283"@
+M%"+`@A`@`<(F`!"!Q^`(@>@``)WCOYBD$``8H!``&`,```N"$&`0H@8``<($
+M8!2`H&```H``++`0(``#```+L!!BP,($@!B`H&`!$H``)`,```N0$``2$P``
+M)D````"2$F$P`P``(("*``$2@``<`P``"X,R(!G")&`$P"2`&)`0`!)___^L
+MDA``$8"B(``2@``3`P``"Y`0`!)````4DA``$8"B(``"@``-`P``"Y`0`!)`
+M```:DA``$8"B(``$@``&D!``$D```(22$``1@A`@`L(D@!@#```+@A!BP/`$
+M``&!Q^`(@>@``-H"8`3"`F`,@*-``0B```:0$"``P@)@$("C0`$*@``#`0``
+M`)`0(`&!P^`(`0```)WCOYC"!F`4@*!@``*``&JP$#__^`9``(,O(`."($`<
+M@RA@`CL```"Z%V``@@!`'<(F8!CZ!F`$P@9@$("G0`$J@``IP@9@#("G(``"
+M@`!:`0```/HF8`C"!F`0@*=``0J``!^T$``!P@9``("@8``"@``;`P```)X0
+M8``#````L!!@`,(&0`"V`'__]B9``+LNX`.Z)T`;NR]@`H('0`_X!F`8P@!@
+M$/@'(`B"($`<@@!``?@&8`BX)P`!^"9@"+H'0!B`IP`:"H``!?HF8!B`IN``
+M,K__[<(&0``0@``VL!`@`8"G0`$8@``SL!`@``,```#"`&``@@!___H&0`"`
+MIT`!`H``++`0/_[Z!F`$^B9@",(&8`R`IT`!&(``);`0``$#````P@!@`((`
+M?__Z!D``@*=``1J``!ZX$``=`P```)H08``#````GA!@``,```#"`&``M`!_
+M_[8'(`'V)D``NR[@`[HG0!N[+V`"@@=`#?@&8!C"`&`0^`<@"((@0!R"`$`!
+M^`9@"+@G``'X)F`(N@=`#X"G`!@8@``%^B9@&("FP!H*O__MN!``&[`0(`*!
+MQ^`(@>@``,("8!2`H&```H``$AL```28$V/0P@)@&,(00`#",@`,F!-CSL("
+M8!C"$&`"PC(`#)@38\S"`F`8PA!@!,(R``R:$V/*P@)@&,(08`;",@`-@</@
+M"`$```"=X[^8H!``&)`0`!@3```@0````)(28`0#```_@A!C_X"F8`$"@``9
+MD`H``8"F8`$4@``&@*9@!H"F8``B@``.`P``"S"``!L"@``%@*9@"`*```\#
+M```+,(``%@,```N"$&+(U`8``902``H0@``,`P`@0((08LC4!@`!E!(`"A"`
+M``<#`!"``P``"X(08LC4!``!E!(`"@,`"`"4$H`!D!``&!,``"!`````DA)@
+M!`$```"!Q^`(@>@``)WCOYB0$``8?___S](&(=P!````@<?@"('H``"=X[^8
+M0````)`0`!B@$``($R```)(J``E`````D!``&)`0`!A`````DA`@,)H*(_"`
+MIF```H``!YLS8`2"$"`E@B!`#8,P8`$0@``*F@-``8"C8`$8@``'F@-__Y`0
+M`!A`````DA``$!"```VP$"``E`H\#X,K8`2""&/PE!*``9`0`!A`````DA`@
+M,)`0`!A`````DA``$+`0(`&!Q^`(@>@``)WCOYB4$``:@*9@"12```N0$"``
+MDRY@!)(B0!F3*F`"D@8`"0,```N"$&!0D@)``4````"0$``8@<?@")'H``B=
+MX[^8DA``&H"F8`D4@``+D!`@`)4N8`24(H`9E2J@`I0&``H#```+@A!@4)0"
+M@`%`````D!``&(''X`B1Z``(G>._F*00`!B`IF`"`H``#9`0`!B`IF`"&(``
+M!X"F8`.`IF`!`H``"Z(0(``0@``TL!`__P*```6P$#__,(``,!"```VB$"`)
+M$(``"Z(0(`@#```+@A!@4((&``'"`&`$@*!@`!*``":P$"``$(```X,L8`2#
+M+&`$@B!`$8,H8`*@`@`!`P``"X(08%"@!``!P@0@!("@8``2@``9L!`__Y`0
+M`!!`````DA`@/("FH``2@``.\B0@!((0(`O")"`,@A`@`L(D(!2"$#__PB0@
+M&((0(__")"`<@A`@"L(T("`0@``&PC0@(I`0`!*2$``10````)00`!JP$``1
+M@<?@"('H``"=X[^8(0``"X(4(#S4!@`!E`JC_X(4($3"!@`!@RA@$",`_\""
+M"$`1E!*``9`0`!A`````DA`@I((4($#4!@`!E`JC_X(4($C"!@`!@RA@$(((
+M0!&4$H`!D!``&$````"2$""HD!``&$````"2$""LE`H\`*`4($S"!@`0@@AC
+M_Y02@`&0$``80````)(0(*P!````@<?@"('H``"=X[^8D!``&("F8`D8@``G
+ML!`@`(,N8`2"($`9@RA@`I("``$#```+@A!@4)("0`'"`F`$@*!@``*``!P9
+M```+P")@!)83(#R:$"`!FRM`&9HX``W"`@`+@@M``<(B``N6$R!`P@(`"X(+
+M0`'"(@`+EA,@1,("``N""T`!PB(`"Y83($C"`@`+@@M``<(B``N8$R!,P@(`
+M#)H+0`%___^RVB(`#+`0(`&!Q^`(@>@``)WCOYBH$``8IA``&`,```2"$&(T
+MV@8``8"F8`D8@`%2L!`@`(,N8`2"($`9@RA@`J0%``$#```+@A!@4*0$@`'"
+M!*`$@*!@``*``4>P$"`!P@2@&("@?_\2@``5H2Y@`H"C8``B@``(FA`@#\(3
+M8`*""&"@@*!@H`*```.:$"`?FA`@#X(0(`&`H$`-&H``"*$N8`*"`$`!@A!@
+M`8"@0`TJO__^@@!``:$N8`(C```$DA1@0)($``F4"&/_P@2@'(,H8`H;``/_
+M@@A`#902@`'"!*`4@RA@%!L#_`"""$`-E!*``4````"0$``4DA1@@)($``G4
+M%*`BE2J@!)0*H/#"%*`@@@A@#Y02@`$#``((E!*``4````"0$``4D@0IP)`0
+M`!1`````E!`H`,(%(<R`H&`#.(``",($H"22%&$`D@0`"9`0`!1`````%0!`
+M`,($H"2`H&``(H``&<($H#"A+F`"D@0HP!4_P`"4*$`*P@2@*(,H8!B4$H`!
+M0````)`0`!2@!"G`D!``%$````"2$``0D!(@`<($H"B`H``!E$`@`)4JH`B4
+M$H`(D!``%$````"2$``0P@2@,("@8``B@``+P@2@+),N8`*2`FD`%3_``)0H
+M0`H#`$``E!*``4````"0$``4P@2@+("@8``B@``9V@2@#*$N8`(3```$DA)@
+MP)($``D5/_P`E"A`"@,`!`"4$H`!0````)`0`!3"!*`,@(A@("*```O:!*`,
+MH`0IP)`0`!1`````DA``$)02(@"0$``40````)(0`!#:!*`,`P``0("+0`$B
+M@``/V@2@#*$N8`(#```$@A!A`*`$``&0$``40````)(0`!`#``@`E!(``9`0
+M`!1`````DA``$-H$H`P#`"``@(M``2*```["!*`$H2Y@`@,```2"$&$`H`0`
+M`9`0`!1`````DA``$)02(@"0$``40````)(0`!#"!*`$@*!@`@*```:`H&`#
+M(H``%Z,N8`(0@``[P@2@.*$N8`*@!"G`D!``%$````"2$``0E!(@HI`0`!1`
+M````DA``$,(%(<R`H&`#&(```QL`"4`;`$E`DRY@`@,```2"$&$`$(``))("
+M0`&@!&G`D!``%$````"2$``0E!(B8I`0`!1`````DA``$`,```#:`&```P``
+M`,(`8`":(T`!`P``"X(08LS"!,`!FB!`#0,```#"`&``FB-``9LK8`JB!&D`
+M%0!``)030`J0$``40````)(0`!'"!2',@*!@`QB```,;``$`&P!!`),N8`*2
+M`FG`D!``%$````"4$``-P@2@.("(8`$B@``/P@2@#*$N8`(#```$@A!A`*`$
+M``&0$``40````)(0`!`#``D`E!(``9`0`!1`````DA``$,($H`R`B&`!`H``
+M"`,```N"$&`\FA`@`9LK0!G8!,`!$(``!YH30`R"$&`\FA`@`9LK0!G8!,`!
+MFBL`#=HDP`'"!*`,@(A@`0*```@#```+@A!@0)H0(`&;*T`9V`3``1"```>:
+M$T`,@A!@0)H0(`&;*T`9V`3``9HK``W:),`!P@2@#("(8`("@``(`P``"X(0
+M8$2:$"`!FRM`&=@$P`$0@``'FA-`#((08$2:$"`!FRM`&=@$P`&:*P`-VB3`
+M`<($H`R`B&`$`H``"`,```N"$&!(FA`@`9LK0!G8!,`!$(``!YH30`R"$&!(
+MFA`@`9LK0!G8!,`!FBL`#=HDP`'"!*`,@(A@"`*```@#```+@A!@3)H0(`&;
+M*T`9V`3``1"```>:$T`,@A!@3)H0(`&;*T`9V`3``9HK``W:),`!D!``%'__
+M_E>2$``2L!`@`8''X`B!Z```G>._F)`0`!B3+F`"0````)(":`"!Q^`(D>@`
+M")WCOYB0$``8E!``&I,N8`)`````D@)H`(''X`B1Z"`!G>._F)`0`!B4$"`!
+ME2J`&4````"2$"A`@<?@")'H(`&=X[^8H!``&),N8`*2`FH`0````)`0`!BP
+MBB`#$H``"9`0`!!`````DA`H0((0(`&#*$`9@(H``3*```*P$"`!@<?@"('H
+M``"=X[^8E!`@`94J@!F0$``80````)(0*("@$"```P``":(08P^0$``80```
+M`)(0`!F`HB```H``")`0`!A`````D!`@"J`$(`&`I``1!+__]Y`0`!B2$"B`
+M0````)00(``#```)@A!C#X"D``$$@``#L!`@`;`0(`"!Q^`(@>@``)WCOYB6
+M$``<U`>@9/8'H&RT#J__P@>@7(,H8!*T%H`!P@>@:(,H8!F`CN`!`H``!+06
+M@`$#`$``M!:``8,VX`2""&`!@RA@'8(00!J[-N`"N@]@`;LO8!:Z%T`!N3;@
+M!;@/(`&Y+R`7N!<`'8,W(!B8$``!PBY@"(,W(!"""&#_FA```<(N8`F#-R`(
+M@@A@_[`0``'"+F`*N`\@_YX0`!SX+F`+@RK@&KLVX`&Z#V`!NR]@%[H70`&#
+M-V`8M!```<(N8`R#-V`0@@A@_\(N8`W`+F`.N@]@_[@0`!V`HK__`H``)?HN
+M8`^[+J`8@@A@_X,H8!""$$`=N@\@_[H70`&#*J`-.0`#^(((0!RZ%T`!@S=@
+M&,(N8`R#-V`0PBY@#;LW8`CZ+F`.P"Y@#X,K(!BZ"V#_NR]@$+H70`&"#B#_
+M@RA@"((00!VZ"^#_NA=``0,0``"Z%T`!@S=@&,(N8`B#-V`0PBY@"8,W8`C"
+M+F`*^BY@"X''X`B1Z"`!@</@")`0(`#""F`(@RA@&-H*8`F;*V`0FA-``<(*
+M8`J#*&`(@A!`#=H*8`N:$T`!`P@``)H30`&#,V`8PBI@"(,S8!#"*F`)@S-@
+M",(J8`J!P^`(VBI@"X"BX``"@``9D!``#<(*8`R#*&`8V@I@#9LK8!":$T`!
+MP@I@#H,H8`B"$$`-V@I@#YH30`&`H``,@F`__X,H8`R:$T`*@A!`#9LP8!C:
+M*F`,FS!@$-HJ8`V;,&`(VBI@#A"``"K"*F`/@*,@`"*``!O`*F`(P@M@"(,H
+M8!C:"V`)FRM@$)H30`'""B`*@RA@"((00`W:"B`+FA-``8,S8!C"*F`(@S-@
+M$,(J8`F#,V`(PBI@"MHJ8`N#,J`8PBI@#(,RH!#"*F`-@S*@",(J8`X0@``.
+MU"I@#\`J8`G`*F`*P"I@"QL```2:$H`-@S-@&,(J8`R#,V`0PBI@#8,S8`C"
+M*F`.VBI@#\`J8!3`*F`5P"I@%L`J8!?`*F`0P"I@$<`J8!+`*F`3@</@")`0
+M(`'""F`7@(A@`0*``%J0$"`/V@I@%)LK8!C""F`5@RA@$((00`W:"F`6FRM@
+M")H30`'""F`7@A!`#1L```>:$V/^@@A`#8,P8`'",H``P@I@$-H*8!&#*&`(
+M@A!`#<(RH`+`*J`$P@I@$(,H8!C:"F`1FRM@$)H30`'""F`2@RA@"((00`W:
+M"F`3FA-``8"+8`$R@``6P@I@"8"+8`(B@``%P@I@$X(0(`'"*J`$P@I@$X"(
+M8`@B@``&P@I@$\(*H`2"$&`"PBJ@!,(*8!.`B&`$(H``!L(*8`G""J`$@A!@
+M!,(JH`3""F`)@S!@`H((8`_"*J`%P@I@%(,H8!C:"F`5FRM@$)H30`'""F`6
+M@RA@"((00`V#,&`-PBJ@!L(*8!*:"&`/VBJ@!\(*8!.#,&`$PBJ@",(*8!*#
+M,&`$PBJ@"<`JH`J`HV```H``!,`JH`N"`V`!PBJ@!\(*H`B`H&```H``!)`0
+M(`""`&`!PBJ@"('#X`@!````@</@"`$````;```+F!-BO,(*``R"$&`(PBH`
+M#,(*8`2"$&`(PBI@!((38KK"$@`!PC)``,(*``S"*F`$FA-BO<(*``W"*F`%
+M@</@")`0(`"=X[^8D!``&"$``!"2%""`0````!4DDC^0$``8DA0@@!4))))`
+M````E!*A))`0`!B2%""`%0H``$````"4$J`YD!``&)(4((`5%,6"0````)02
+MH"20$``8DA0@@!4Y9@%`````E!*A>9`0`!B2%""`%0`'>T````"4$J/_D!``
+M&)(4((`5!JJO0````)02HD"0$``8DA0@@!4OA!5`````E!*A5)`0`!B2%""`
+M%0`#C$````"4$J`'D!``&)(4((1`````E!`@``$```"!Q^`(@>@``)WCOYB0
+M$``8$P``)I(28-`5```'0````)02H!:@$"``(P``)I`0`!B2%&"`0````!4`
+M`$"@!"`!@*0@!P2___N0$``80````!,``">1,B`8@S(@!)H*(`^;*V`$D!!`
+M#4````"2$"`(@<?@")'H``B=X[\XI!``&((0/\G")[_@PB>_Y,(GO^C")[_L
+M@A`_PL(GO_""$#_RPB>_R,(GO\S")[_0PB>_U((0/_3")[_8@A`_P,(GO[#"
+M)[^TPB>_N,(GO[R"$#^ZPB>_P((0/[+")[^8PB>_G,(GOZ#")[^D@A`_L,(G
+MOZB4$"```P``$:(08BB@![_XD!!B.)X08E"2$&)@@RJ@`I@`0!*"`$`0V@!_
+MZ-HC`!&6`P`(V@!_T-HBX`3:`'^XVB,`#Y@#``G"`'^@E`*@`8"BH`0$O__R
+MPB,@!)`0`!A`````DA`@`0$```"!Q^`(@>@``)("0`F2`D`*D@)`"9("0`@#
+M```%@A!A^)("0`&!P^`(T!)@!IWCOYB0$``8$P```)(28``5```$0````)02
+MHG#T)B`,]B8@$/@F(!3R-B'(P#8ARH(0(#_"-B'\P"8B`!$```N"$B.\P"8`
+M`8(2(\#`)@`!FA(CS`,"``#")@`-FA(CU((0)X'")@`-@A(CW,`F``&:$B/@
+M`P`/SX(08S_")@`-FA(CY((0(&3")@`-FA(CZ((0(`+")@`-@A(C^)H0/__:
+M)@`!@A(C_-HF``$A```,VB8`$)`2(#R0!@`($P```)(28`!`````E!`@!J`4
+M(`3`+@`0@<?@"('H``"8$"```P```)008`"0"B#_@@,`#)H`0`S""H`-@*!`
+M"#*```V8`R`!F@-`"L(+8`&6"F#_@*!`"SB```>8`R`!P@M@`H"BP`$(@``'
+MFA`@`9@#(`&`HR`#"+__[X(#``R:$"``@</@")`0``V=X[^0$0``$4````"0
+M$B*HHA``"("B(``"@`'N@A`@`I,N(!"3,F`0E!``&980`!J8$``;0````)H0
+M`!RP$``1D!``$9(0(`!`````E!`@`8"B(``"@``6D!``$1,``!!`````DA)@
+M()`*(/^#,B`$PB1AS((*(`_"-&'0T`QASW___\72#&'1@*(@``*``<B"$"`-
+MD!``$4````"2$"``@*(@`!*```20$``1$(`!P((0(`,3```F0````)(28!C0
+M-&'2P@1AS("@8`D"@``(@*!@"A*```@!````PA1AT("@8`,8@``$`0```'__
+M_MZ0$``80````)`0`!B`HB```H`!JX(0(`["!B',@*!@!`B```N0$``8(0``
+M$$````"2%"`0`P``!)02``&0$``80````)(4(!"0$``8$P``)D````"4$"`'
+M0````)`0`!C0-B'4D`H@\("B(#`B@``WP@8AS!2```:`HB!@@*(@$`*``#&`
+MHB`@,(``!@*``"Z`HB!@-(```X"B(*"`HB!0(H``*L(&(<S"%B'4@*!@`!*`
+M`";"!B',@*!@!1*```N:&&`'V@8AT`,``D""$&!#@*-``3*```3"!B',$(``
+M&8(0($::&&`'@*``#9I@/_^"&&`+@*```8)@/_^`DT`!(H``!,(&(<P0@``.
+M@A`@48"@8`H"@``*@*!@"0*```B`H&`*,H``"<(&(<S"%B'0@*!@`SB```7"
+M!B',@A`@8L(V(=3"!B',@*!@"@*``!2`H&`)`H``$H"@8`HR@``'VA8AU,(6
+M(="`H&`#"(``#9`0`!C:%B'4@@M@\((`?]"`H&`_&(``!Y`0`!B""V`/@*!@
+M!`2``4J"$"`-D!``&)(0(,%`````E`>_]H"B(``"@`%"VA>_]@,```R"$&`!
+M@*-``3B```3"%[_V$(`!/((0(`4;```$FA-B<,(T0`V0$``8$P``$$````"2
+M$F`0D`H@&)$R(`.`HB`"`H``$("B(`,"@`$N@A`@"L(&(<R`H&`)`H``"H"@
+M8`H2@`$H@A`@"L(6(="`H&`#*(``!9`0`!@0@`$B@A`@"I`0`!B2$"`_0```
+M`)0'O_:`HB```H`!&X(0(`C"%[_V&P``!)H38G+"-$`-D!``&)(0(!Q`````
+ME`>_]H"B(``"@`$/VA>_]H"C8``"@``/MA`C0`,``#^"$&/PM@M``;<NX`R0
+M$``8DA`@&T````"4![_V@*(@``*``0'"%[_VMA;``;8&_T"T$"``@*:`&QJ`
+M``V@$"``D@0@P)`0`!A`````E`>_]H"B(``"@`#TPA>_]J`$(`&`I``;"K__
+M][0>@`$#```_@A!C_X"F@`$2@`#L@A`@!YH0(`H#```$@A!CYMHT0`&:$"`#
+M`P``!8(08?#:-$`!H!`@``,```28$&/HFA`@"X($`!""`$`0@RA@`H(`0!"#
+M*&`"@@!`$8(`0`R@!"`!@*0@"0B___?:,&`&H!`@`#4```6V%J'X`P```)`0
+M8`">%J'P`P```)(08`"6$"`+E!:B$(($`!":`$`1V!(``=@S0!N:`T`/V!)`
+M`=@S8`*"`$`0@RA@`H(`0!"#*&`"@@!`$9H6HJB:`$`-UC-@#((`0`J@!"`!
+M@*0@`@B__^[6,&`($P``!)(28G"2!$`)0````)`0`!B`HB```H``K@,```2"
+M$&)PVA1``0,``!2"$&`"@*-``1B``!L#```$P@8AS("@8`H"@``*@*!@"0*`
+M``B`H&`*$H``$P,```3"%B'0@*!@`QB```\#```$&P``!9@38@""$"9HPC1`
+M#)@38@2"$"2PPC1`#((38@@9/__@V#1``9H38?[8-$`-`P``!((08HK"%$`!
+M@*!@``*``!V0$``8PA8AU(((8/"`H&`0$H``&9(0(+^0$``8$P``)A4``!!`
+M````E!*@!T````"0$"?00````)`0`!C0-B'6D!``&!,``"9`````E!`@!T``
+M``"0$"?0PA8AUH((8/"`H&`@$H``<((0(`V0$``8DA`@OT````"4![_V@*(@
+M``*``&F"$"`(PA>_]AL```2:$V)TPC1`#<(V(@A`````D!``&("B(``"@`!?
+M@A`@",(&(<R`H&`*(H``#9`0`!B`H&`)(H``"I`0`!B`H&`*$H``#)H88`?"
+M%B'0@*!@`SB```?"!B',D!``&$````"2![_P$(``'("B(`":&&`'@*``#9I@
+M/_^"&&`+@*```8)@/_^`DT`!(H``!\(6(=20$``80````)('O_`0@``.@*(@
+M`(((8/""`'_0@*!@/QB```:0$``80````)('O_`0@``%@*(@`$````"2![_P
+M@*(@``*``#*`I&```P``"X(08,3"!$`!PB8AP$````"0$``8M!`@`*`0(``#
+M```+MA!@,+(08#&2$"`?DB)`$)`0`!A`````E`>_]H"B(``"@``<PA>_]H,H
+M8!";,&`0M`:`#9H$`!":`T`1@S!@&,(K0!O"#[_WH`0@`8"D(`((O__NPBM`
+M&8"@`!J"8#__&P``OYH38_V:'H`-@*``#9I@/_^`D$`-$H``!X(0(`E___V$
+MD!``&!"```Z0$``8@A`@",(GO_"`I&```H``!8"G(`!`````D!``$8"G(``"
+M@``#P@>_\,(G``"0$"``@<?@")'H``B=X[^80````)`0`!@#```+@A!@J,(&
+M``&`H&```H``!`$```"?P$``D!``&$````"0$``8D!``&)(0(`%`````E!`@
+M`1,```22$F)PD@8`"4````"0$``80````)`0`!@!````@<?@"('H``"=X[]X
+MIA``&`,``"#")[_P`P``)H(08"#")[_T`Q5558(0857")[_8`RJJJH(08JK"
+M)[_<`QF9F8(08F;")[_@`R9F9H(089G")[_DJA`@`*P'O_BA+6`"H`0`%N0$
+M/_B0$``30````)(0`!+0)#_PHA`@`(,L8!"@$$`1D!``$Y(0`!)`````E!``
+M$)`0`!-`````DA``$H"B`!`2@``FL!`@`*($8`&`I&#_!+__\X,L8!"B$"``
+MJ`>_^(,L8`*"`$`4X`!_X)`0`!.2$``20````)00`!"0$``30````)(0`!*`
+MI``($H``$[`0(`"B!&`!@*1@`P2___*#+&`"@RU@`H(`0!:0$``3T@!_^$``
+M``#4`'_PJ@5@`8"E8`$$O__.H2U@`D````"0$"!DL!`@`8''X`B!Z```@(IA
+M``*```B"$``)`P``!((08S/",H```P``!1"``!."$&/4@(A@@"*``!*0$"``
+M&P``!((38HK"$@`!@*!@`!*```B"$"D(@A-BC,(2``&`H&``(H``!Y`0(`""
+M$"D(PC*``((0*JS",L``D!`@`8'#X`@!````G>._D*00`!BF$``8J!``&,`W
+MO_8#```$@A!B<-H6``$#```4@*-``0B```J@!B'@P@8AH)`0`!B2$"#)G\!`
+M`)0'O_:`HB```H`!9K`0(`#"%*'4@@A@\("@8$`2@``&PA>_]@,```2"$&*&
+MP#3``<(7O_:`H&``,H``$\(%(=S"!*',@*!@!S*```_"!2'<PA2AT("@8`@R
+M@``+P@4AW((0(`7"-[_V`P``!)H08G:8$"`!V#3`#8(08GC8-,`!P@4AW("@
+M8`8"@``5`P``'-H5(<J"$&!E@*-``3*``!'`)"`$VA4B"((#?YR#*&`0@S!@
+M$("@8`$X@``$PA4B"!"```:"`V`%@*!@03*```7`)"`$@A`@0\(U(@C`)"`$
+M&P``!((38H;"%,`!@*!@``*```P#```$@A`@`<(D(`2"$V)VPA3``8"@8``2
+M@``%`P``!((0(`/")"`$`P``!((08HK"%,`!@*!@``*```49```$P@0@!((0
+M8`3")"`$@A,BC,(4P`&`H&```H``$8(0*0C"%2'*@*!N$0*```V"$"D(V@0@
+M!((38`C")"`$@A,B>,(4P`&`H&``$H``!8(0*0B"$V`HPB0@!((0*0C"-"`0
+MPA2AU(((8/""`'_0@*!@/PB``!B"$"G$V`2AS((;(`>`H``!FF`__X(;(`N`
+MH``!@F`__X"30`$R@``.@A`IQ("C(`H"@``*@*,@"0*```B`HR`*$H``!X(0
+M*JS"%*'0@*!@`SB```."$"JL@A`IQ,(T(!(#```$@A!C,\(T(`P#```%@A!C
+MU,(T(`[:!````P``@((K0`$;``!`@A!`#<(D``#"%[_V@(A@`A*```Z8$"``
+MP@2AS("@8`4X@``*F!`@`8"@8`42@``(F2L@$L(4H="`H&`#*(``!=H$``"8
+M$"`!F2L@$MH$```#``$`@BM``8(00`P9``@`F"A`#`,`!`"8$P`!PA>_]H,P
+M8`&"&&`!@@A@`8,H8!8;`!``FBL`#9H30`':)```P@2AS("@8`8H@``%V@0`
+M``,``@`0@``$@A-``0,``@""*T`!PB0``,($```;(```@A!`#1L0``""$$`-
+MPB0``,(5(="`H&`!&(``!\(7O_;"!*',@*!@"S*``"S:!```PA>_]H"(8`$2
+M@``&FA`@`,($(`2`B&`),H```IH0(`&;*V`=P@0``!D(``"8*$`,F!,`#<(7
+MO_:#*&`0ES!@$(,P8!."&&`!@@A@`8,H8!P;!```FBL`#9H30`':)```@(K@
+M!!*```:8$"``P@0@!("(8`DR@``"F!`@`9DK(!O:!````P(``((K0`&"$$`,
+M&P$``((00`T;`$``@A!`#<(D``#:!````P"``((K0`'")```&P``!((38SC"
+M!,`!@*!@``*```>8$"``@A-C/,($P`&`H&``$H``!)DK(!>8$"`!F2L@%]H$
+M```#`"``@BM``8(00`P;```@@A!`#1L``!""$$`-&P``"((00`V:`W``@A!`
+M#<(D``#"!2',@*!@!1*```@!````PA4AT("@8`@B@``'P@0``,(%(<R`H&`%
+M"(``!L(7O_;"!```@A!H`,(D``#"%[_V@HAA\"*```."$"`*@SA@!,(T(`C:
+M%[_V`P``/)J+0`$B@``%@A`@@)L[8`R"$"`!@RA`#<(T(`K"%*'4@@A@\((`
+M?]"`H&`_&(``!,($```0@``#@A!F`(((>?_")```(P``!((48GK"%,`!@*!@
+M`"*``!+"!*',E!1B2)0%``K"!*&@D!``$I_`0`"2$"`/@*(@`"*```G"!*',
+MFA1B3((0(`'")0`-P@0``((080#")```P@2AS("@8`6:8"``F@M@`0,```2"
+M$&)HVB4``<($H<R`H&`%$H``")H0(`#"%*'0@*!@"2*```>:$"`!P@2AS("@
+M8`4(@``$@RM@!YH0(`&#*V`'V@0``)H+?W^:$T`!VB0``((0(`_")"`4L!`@
+M`8''X`B!Z```G>._D)`0`!A`````D@>_\(''X`B1Z"`!`P```("B8`$"@``$
+M@A!@``,```""$&``@</@",(B('"=X[^0D!``&"$``""2%"`H0````-0&8`20
+M$``8DA0@+$````#4!F`,D!``&)(4(#!`````U`9@$)`0`!B2%"`T0````-0&
+M8`C"!D``(P!``("(0!$"@``/D!``&$````"2![_P`P``!((08C3"!@`!F!`@
+M`)H0(`#8.&`HD!``&)(4("!`````E!``$9`0`!@3```@DA)@($````#4!D``
+M`0```(''X`B!Z```G>._@/(GO^3"!B'<@*!@`0*```J0$``8@*!@`2J```X#
+M````@*!@!@*```J`H&`(,H``$X(&8`$#```_@A!C_\(GO^P#``'_$(``"X(0
+M8_\#````P@!@`((F0`&#*&`#PB>_[`,```#"`&``@B9``8,H8`/")[_P@@9@
+M`<(GO^@#/Y_`@BZ``<(GO^!`````D@>_X`$```"!Q^`(@>@``)WCOYB0$``8
+M(0``()(4("A`````E!`@`)`0`!A`````DA0@!`,``0"0$@`!%0`,`)0J``J0
+M$``80````)(4(`20$``8DA0@(!4``#]`````E!*C_P$```"!Q^`(@>@``)WC
+MOYC"%F`2@*!@``*``!BD$``8D!``&"$``"!`````DA0@!`,`!`"4$@`!D!``
+M&$````"2%"`$U!9@$)`0`!A`````DA0@)-068!*0$``80````)(4(#C4!F`4
+ME2J@`Y`0`!@0@``*DA0@,)`0`!@A```@0````)(4(`05``0`E"H`"I`0`!B2
+M%"`$0````"$``""0$``8DA0@*$````#4!D``D!``&$````"2%"`@`S_@`)`*
+M``':!F`(`P``/X(08_^:"T`!PA9@&("@8``"@``'E!(`#8(`8`2#*&`0&P`?
+MP(((0`V4$H`!D!``&",``"!`````DA1@(!D```N8$R/4U`2`#`,__\""$&#_
+ME`J``<(68!J#*&`((0``/YH4(P"""$`-E!*``=0D@`R0$``80````)(48!C"
+M!F`(H!0C_Z8(0!#"!F`<@*!`$SB```*F$``!Y`9@#,(&8!R`H$`2.(```J00
+M``&`I,`2,H```^@&0`#H!F`$U`9@!)0"O_V5*J`#(0`!_Z`4(_^4"H`0`P*&
+M`)02@`&0$``8(P``($````"2%&#4E`4__94JH`.4"H`0`P*``)02@`&0$``8
+M0````)(48-@5```_E!*C_Y0,P`J#+*`0E!*``9`0`!A`````DA1@W`$```"!
+MQ^`(@>@``)WCOYBB$``8E!``&9`0`!A`````$P``&)`0`!@A```8DA0@"$``
+M``"4$"`!D!``&)(4(`R4$"`#0````)80(`*`HB```H``"+`0(`"0$``1$P``
+M&$````"2$F`$T#:``+`0(`&!Q^`(@>@``)WCOYB0$``8(0``$$````"2%"`4
+ML@9`&8(0(`.#*$`9E!(``9`0`!A`````DA0@%(''X`B1Z"`!G>._F)`0`!@A
+M```00````)(4(!2R!D`9E!`@`Y4J@!F4*@`*D!``&$````"2%"`4@<?@")'H
+M(`&=X[^8D!``&"$``!!`````DA0@&((0(`&#*$`9E"H``;0.H`&U+H`9E!*`
+M&I`0`!A`````DA0@&(''X`B1Z"`!G>._F)`0`!B`IF`%&(``"+`0/_\3```0
+M0````)(28!R0"B`OD3(`&;`*(`&!Q^`(@>@``)WCOYB0$``8$P``$$````"2
+M$F`4F@9`&8(0(`.#*$`-&P``?((00`V4*@`!LRY@#)02@!D#```@@*:@``*`
+M``24$H`!`P``0)02@`&0$``8$P``$$````"2$F`4`P``"X(08$32!@`!`P!`
+M`)(20`%`````D!``&`$```"!Q^`(@>@``)WCOYB0$``8$P``$$````"2$F`(
+M@AH@`8"@``&08#__@<?@")'H``B=X[^8J!`@`*80`!B0$``80````)(0((`#
+M`"``@(H``0*``!F0$``80````)(0((P#`$``@(H``3*```(I``@``P@``("*
+M``$"@``%`P$```,`$`"H%0`!`P$``("*``$"@``%`P"```,`(`"H%0`!`P"`
+M`("*``$R@``"J!4``9`0`!A`````DA`@P("B/_\2@``%I!``",`F0``0@`!=
+ML!`@``,`07:"$&"ZF@H``0,``@"`B@`!`H``!=HF0``#$```@A-``<(F0`"`
+MC*`%`H``!8",I<#"!D``@A!@`<(F0``"@``=@(R@(,(&0`""$&!`PB9``)`0
+M`!A`````DA`@Q"$``!&@%"*@F@HC_\($P!":$T`!(P#_P)`*`!&1,B`0D!(`
+M#=`DP!"0$``80````)(0(,B:"B/_P@3`$)H30`&0"@`1D3(@$)`2``W0),`0
+M@(R@("*```S"!D```P``!((08FC"!@`!@*!@``*```;"!D``&Q```((00`W"
+M)D``P@9``((5``$;$```@(A`#0*``![")D``(0``!((4(E#D)@`!HA0B5)`0
+M`!A`````DA`@Q-`F`!&B%")8D!``&$````"2$"#(T"8`$:(4(ER0$``80```
+M`)(0(,S0)@`1HA0B8)`0`!A`````DA`@T-`F`!&@%")DD!``&$````"2$"#4
+MT"8`$+`0(`&!Q^`(@>@```,```N"$&!$@</@"-`"``&=X[^8`P``"X(08$3D
+M!@`!@*2@`!:```F@$``8D!``&)(0("1`````E!`@`)`0`!A`````DA`@)`,`
+M07:"$&"ZE`Y``8".8$`"@``:HA`@``,```N"$&#,P@0``8"@8``R@``"E!*@
+M0`,```N"$&#0P@0``8"@8``R@``"E!*A``,```N"$&#4P@0``8"@8``R@``"
+ME!*@@`,```N"$&#8P@0``8"@8``R@``"E!*D`(".8`$R@``"E!*@!P,`N`"`
+MCD`!`H``&P,0```#`"``E!*``0,`"`"`CD`!`H``!0,`$``#`$``HA1``0,`
+M$`"`CD`!`H``!0,`(``#"```HA1``0,`(`"`CD`!`H``!0,`@``#`0``HA1`
+M`0,`@`"`CD`!,H```J(40`$#$```@(Y``0*```20$``8`P`"`)02@`%`````
+MDA`@H)`0`!A`````DA`@K!4MP`"4*@`*E!*`$9`0`!A`````DA`@K`,```N"
+M$&!$@*9@`!:```;R)``!D!``&)(0("1`````E!`@`8''X`B1Z``2````````
+M````````````````````````@</@"-`2(>J=X[^8LRY@$),V8!#"%B'J@*)`
+M`1J```N0$``8DRI@!0,``"*"$&`<0````)("0`$#```@@(H``1*```.P$"`!
+ML!`@`(''X`B!Z```G>._F*80`!BH$``9LRY@$+,V8!#"%B'J@*9``1J``%&P
+M$"``H2T@$*$T(`LQ```BHA8@%*($`!&0$``30````)(0`!&D$``(D@0`&)`0
+M`!-`````E!`@`*P6(`22!``6D!``$T````"4$"``JA8@")($`!60$``30```
+M`)00(`"R%B`,D@0`&9`0`!-`````E!`@`)(6(!"2!``)D!``$T````"4$"``
+MD!``$Y(0`!%`````E!`@!Y(6(!B2!``)D!``$T````"4$"``@A8@'*`$``&0
+M$``3DA``$$````"4$"``@*2@!#*``!ZP$"`!`P``"X(08\S:!,`!`P(``("+
+M0`$B@``7L!`@`:`%($"A+"`0H30@"Y($`!B0$``30````)00(`"2!``6D!``
+M$T````"4$"``D@0`%9`0`!-`````E!`@`*`$`!F0$``3DA``$$````"4$"``
+ML!`@`8''X`B!Z```G>._F*80`!BB$``9LRY@$+,V8!#"%B'J@*9``1J``">P
+M$"``I!`@`("FH``"@``4E!`@`.0.H`6E+*`(P@Z@!*04@`'4#J`#E2J@&,(.
+MH`*#*&`0E!*``<(.H`&#*&`(E!*``<(.@`"4$H`!E3*@`8,LH!^4$H`!I32@
+M`:,L8!"C-&`+(0``(I(4(!B2!$`)0````)`0`!.@%"`<H@1`$!4``""4%(`*
+MD!``$T````"2$``1L!`@`8''X`B!Z```G>._D+H0`!B8!B'@`RJJJH"G(``2
+M@``#EA!BJI80(`"#+F`0@S!@$-H3(`J`H$`-&H`!*)00(`#"#H``@*!@!1B`
+M`22#*&`"&P```)H38`#"`T`!@<!```$````0@``KKA`@!<(#``"#,&`2E!`@
+M`("(8`$2@``EKA`@!C"``14#```+@A!CS-H&``$#`@``@(M``0*``!VN$"`$
+M@RY@$(,P8!""`&!`VA,@"H"@0`T6@`$(E!`@`!"``!7J#J`$PA:@`H"@8`0(
+M@`$"E!`@`,(6H`*`H&`%"(``#*X0(`#"%J`"@*!@#0B```BN$"`!$(``!JX0
+M(`,0@``$KA`@!Q"``/24$"``Z@Z@!,(.H`6#*&`(JA5``<(.H`:#*&`0JA5`
+M`<(.H`>#*&`8JA5``:H=0`O"#J`)@RA@"-H.H`BL$T`!K!V`"QD``#^8$R/_
+MK`V`#.8.H`K"#J`+@RA@"*84P`'"#J`,@RA@$*84P`'"#J`-@RA@&*84P`&F
+M',`+P@Z@#X,H8`C:#J`.J!-``:@=``NH#0`,^`Z@$,(.H!&#*&`(N!<``<(.
+MH!*#*&`0N!<``<(.H!.#*&`8N!<``<(6H`*`H&`-&(```[@?``NX#R#_@*7@
+M!!*``)BE+F`0&P``"X(38\S:!@`!`P(``("+0`$"@`"2I32@$((&8$#"-[_V
+MI2Y@$*4TH!"C+*`%(0``(I($0!"4.``50````)`0`!B2%"`$D@1`"90X`!9`
+M````D!``&)(4(`B2!$`)D!``&$````"4$``3DA0@#)($0`F0$``80````)00
+M`!22%"`0D@1`"9`0`!A`````E!``'*`4(!2B!$`0D!``&)(0`!%`````E!`@
+M!)`0`!B2$``20````)00`!O4#J`4P@Z@%8,H8`B4$H`!P@Z@%H,H8!"4$H`!
+MP@Z@%X,H8!B4$H`!Y@Z@&,(.H!F#*&`(IA3``<(.H!J#*&`0IA3``<(.H!N#
+M*&`8IA3``1L```N"$V/0P@=``:@0(`"Z$"``@(A@!`*``!2N$"``P@Z@'X,H
+M8`C:#J`>KA-``<(.H!V#*&`(V@Z@'+H30`'H#J`@P@Z@(8,H8`BH%0`!P@Z@
+M(H,H8!"H%0`!P@Z@(X,H8!BH%0`!PA>_]J$H8!"A-"`+(P``(I($`!%`````
+MD!``&*048`22!``2D!``&$````"4$``7DA1@")($``F0$``80````)00`!.2
+M%&`,D@0`"9`0`!A`````E!``'9(48!"2!``)D!``&$````"4$``4DA1@%)($
+M``F0$``80````)00(`>2%&`8D@0`"9`0`!A`````E!`@`((48!R@!``!D!``
+M&)(0`!!`````E!`@`*$N8!"A-"`+H@0`$9`0`!B2$``10````)00`!6@!``2
+MD!``&)(0`!!`````E!``%A"``"B4$"`!I32@$*,LH`4A```BD@1`$)`0`!A`
+M````E!``%9(4(`22!$`)D!``&$````"4$``6DA0@")($0`F0$``80````)00
+M`!.2%"`,D@1`"9`0`!A`````E!``%)(4(!"2!$`)D!``&$````"4$``<H!0@
+M%*($0!"0$``8DA``$4````"4$``7D!``&)(0`!)`````E!``&Y00(`&!Q^`(
+MD>@`"@``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``"=X[^8D!``&0,```N"$&`PD@8``4````"4$"`&`0```(''X`B!Z```G>._
+MF)(0`!D#```+@A!@,)`&``%`````E!`@!H''X`B1Z"`!G>._F)`0`!D#```+
+M@A!@/)(&``%`````E!`@!@$```"!Q^`(@>@``)WCOYB2$``9(0``"Z(4(#R0
+M!@`10````)00(`;4#@`1@A0@/<(.``&#*&`(E!*``8(4(#["#@`!@RA@$)02
+M@`&"%"`_P@X``8,H8!B4$H`!D!``&",``"!`````DA1@X)H4($"@%"!!P@X`
+M$(,H8`C4#@`-E!*``9`0`!A`````DA1@Y(''X`B1Z"`!PA(B"),J8!"3,F`0
+M@*!`"0*```J:$"`,`P``!((08G+"$@`!@@A@@("@``&:0#__F@M_^)H#8`N`
+MHJ```H```P$```#:(H``@</@")`0(`"6$``(FA``"!D```2"$R*&PA+``8"@
+M8``"@``(D!`@`((3(G;"$L`!@*!@`!*```.0$"`!D!`@0P,```2"$&**PA-`
+M`8"@8``R@``"D!(@!!D```2"$R*,PA-``8"@8``"@``+`0```,(2X<J`H&X1
+M`H``!X(3(GC"$T`!@*!@`!*```.0$B`(D!(@(('#X`@!````G>._F`,```2"
+M$&)(PA8``:((8!RC/&`"H`A@`J$\(`'"!B&LD!``&)_`0`"2$``1D!``&$``
+M```3```F`P``")02``&0$``80````!,``";"!B&PD!``&)_`0`"2$``1@*(`
+M$!*```24$``0@*``$)1@/__"!B&XD!``&)_`0`"2$``1`0```(''X`B!Z```
+MG>._F)`0`!@A```00````)(4(!`#/_Q_@A!CGY0*``&R#F`'LRY@`@,```""
+M$&``P@!`&902@`&0$``80````)(4(!`!````@<?@"('H``"=X[^8DA``&2$`
+M``NB%"`VD`8`$4````"4$"`&U`X`$8(4(#?"#@`!@RA@")02@`&"%"`XP@X`
+M`8,H8!"4$H`!@A0@.<(.``&#*&`8E!*``9`0`!@C```@0````)(48`B:%"`Z
+MH!0@.\(.`!"#*&`(U`X`#902@`&U+J`2M3:@`I02@!J0$``80````)(48`P!
+M````@<?@"('H``"=X[^8D!``&",``"!`````DA1@3*00``B0$``80````)(4
+M8%"@$``(D!``&$````"2%&!,@*(`$J!``!":$"``DA``")`0(`"P%``(LA-`
+M"8''X`B!Z```G>._F)`0`!@3```@0````)(28$R!Q^`(D>@`")WCOYB0$``8
+M(P``($````"2%&`@`P!``*`2``&0$``8DA1@($````"4$``0D!``&)(48"!`
+M````E!``$`$```"!Q^`(@>@``)WCOY@#```$@A!B-,(&``&`H&```H``+P$`
+M``#"$&`"@(A@(`*``"N8$"``P@9``("C``$:@``2H!`@`)80``&"!D`,V@A@
+M!,)(8`2`H&``-H``")@#(`&:"V!_@@P@_X"@0`TH@``"H!``#9@#(`&`HP`+
+M"K__]((&0`R0$``8,P``($````"2%F`$@HP@_P*```F#,&`!@*!@`AB```<5
+M`(``E!(`"I`0`!@0@``'DA9@!!4`@`"4*@`*D!``&!,``""2$F`$0`````$`
+M```!````@<?@"('H``"=X[^8I!``&)`0`!@3```F0````)(28&2C,B`3H@QA
+M_X",80`R@``"HAQ^`)`0`!(A```@0````)(4(%"P$``(D!``$D````"2%"!,
+ML!X`"+`>`!&!Q^`(@>@``)WCOYB0$``8$P``$$````"2$F`@D`H@_YH*(`^1
+M,B`$P@8AS("@0`@2@``'F!`@`,(6(="`H$`-$H```P$```"8$"`!@<?@")'H
+M``R=X[^8D!``&"$``"!`````DA0@D,(&0`"0`@`!T"9``)`0`!A`````DA0@
+MC,(&8`20`@`!T"9@!)`0`!A`````DA0@E,(&8`R0`@`!T"9@#)`0`!A`````
+MDA0@B,(&8`B0`@`!T"9@")`0`!A`````DA0@F,(&8!"0`@`!T"9@$(''X`B!
+MZ```@</@")`0(`&=X[^8D!``&!,``"=`````DA)@')`*(/^!Q^`(D>@`")WC
+MOYB0$``8$P``($````"2$F!8D`H@!X''X`B1Z``(G>._F)`0`!B4#F`'$P``
+M($````"2$F!8`0```(''X`B!Z````P``"X(08[R!P^`(T`(``9WCOYB0$``8
+M`P``!((08C34!@`!@**@`!*```>2$``9`P``"X(08[SR(@`!$(``!)`0(`%`
+M`````0```(''X`B1Z``(@</@")`0(`&=X[^8@*9@!0B```F@$``8D!``&!,`
+M`#]`````DA)C_X"F0`@(@``(D!``&)H0/_\#```+@A!C^-HD``$0@``-L!`@
+M`$````"2$``9E!``")`0`!@3```$0````)(28'`#```+@A!C^/(F``&P$"`!
+M@<?@"('H``"=X[^8D!``&!,```1`````DA)@<`,``#^"$&/_D@H``4````"0
+M$``8@<?@")'H``B=X[^8D!``&!,```]`````DA)C_X"F0`@(@``'FA`__P,`
+M``N"$&/\VB8``1"``!:P$"``D!``&",``"!`````DA1@%`,___"@"@`!D!``
+M&$````"2$``9`S__\((J``&@%``!D!``&)(48!1`````E!``$`,```N"$&/\
+M\B8``;`0(`&!Q^`(@>@``)WCOYB0$``8$P``($````"2$F`4`S__\)(J``%`
+M````D!``&(''X`B1Z``(`P``"X(08\S0"@`!D!H@`8'#X`B0"B`!G>._F("F
+M8``"@``1I!``&)`0`!@C```@0````)(48`0A/[__H!0C_Y0*`!"0$``80```
+M`)(48`0;```+FA-CS,(&``T0@``/@@A`$)`0`!@A```@0````)(4(`0C`$``
+ME!(`$9`0`!A`````DA0@!!L```N:$V/,P@8`#8(00!'")(`-@<?@")'H(`&=
+MX[^8D!``&!,```]`````DA)C_X"F0`@(@``&FA`__P,```S:)@`!$(``%K`0
+M(`"0$``8(P``($````"2%&`4(0__P*`J`!"0$``80````)(0`!F1*B`0`P__
+MP)`*``&@%``(D!``&)(48!1`````E!``$`,```SR)@`!L!`@`8''X`B!Z```
+MG>._F)`0`!@3```@0````)(28!0##__`D@H``9,R8!!`````D!``&(''X`B1
+MZ``(G>._F*(0`!B@$``9LRY@$+,V8!"`IF!_&(``$K`0(`RA+"`0H30@$)`0
+M`!&2$"0`0````)00`!"`H``:E$`@`)`0`!%`````DA`D!*`$`!$#```+@A!C
+M./0L``&P$"``@<?@"('H``"=X[^8HA``&1L```2"$V(X@*:@``*``%_R+@`!
+MM(Y@_P*``%R@$V(TP@8`$,(08`*""&%`@*!A0!*``%:0$``80````)(0(`'"
+M!@`0VA!@`@,``!"`BT`!`H``$:80``BA,B`!D!``&D````"2$``0@@(`"*0`
+M0`BD!*$$D!``&D````"2$``0@@(`"((`0`B"`$`!$(``)[0`;:P#```$@A!B
+M-,(&``'"4&`"@*!@`!:``!*D#F#_H3(@`I`0`!)`````DA``$(("``BD`$`(
+MI`2@TK0.8/^0$``:0````)(0`!""`@`(@@!`"((`0`$0@``0M`!M2)`0`!)`
+M````DA``$X("``BD`$`(I`2A:+0.8/^0$``:0````)(0`!."`@`(@@!`"((`
+M0`&T`&Y@L@Q@_Y`0`!E`````DA``$X("``BR`$`(L@9CZ`,___"R+D`!D!``
+M&"$```22%"!P0````)00`!*0$``8DA0@L$````"4$``:E2Y@$)02@!F0$``8
+M$P``($````"2$F`4`0```(''X`B!Z```G>._F)`0`!A`````T@8AW`$```"!
+MQ^`(@>@``)H0``B`HF`&`H``#9`0(``#```$@A!BD\(+0`&`H&```H``!P,`
+M``N"$&/HP@-``8"@8`$H@``"D!`@`8'#X`@!````G>._F)(0`!E`````D!``
+M&("B(``"@`!PD!``&!,``":2$F!P0````)00(!_"%B'4@@A@\((`?]"`H&`_
+M"(```Y00(!24$"`8D!``&!,``"9`````DA)A^)`0`!@A```@0````)(4(!P#
+M/__P@A!@?Y0*``&4$J"`D!``&$````"2%"`<D!``&)(4(01`````E!`@/9`0
+M`!@A```00````)(4(!"4$B`"D!``&$````"2%"`0V`8AS((;(`>`H``!FF`_
+M_X(;(`N`H``!@F`__X"30`$2@``,@*,@"@*```J`HR`)`H``"("C(`H2@``?
+MD!``&,(6(="`H&`#.(``'"$``":0$``8(0``)I(4('1`````E!`@)I`0`!B2
+M%"!X0````)00(`V0$``8DA0A\$````"4$"`'D!``&)(4(?1`````E!`@/Y`0
+M`!@A```00````)(4(!`5`,``E"H`"A"``!D#`(``(0``)I(4('1`````E!`@
+M"I`0`!B2%"!X0````)00(`R0$``8DA0A\$````"4$"`#D!``&)(4(?1`````
+ME!`@()`0`!@A```00````)(4(!`5`,``E"H`"@,`P`"4$H`!D!``&!"``$22
+M%"`0(0``$$````"2%"`0%0#``)0J``J0$``80````)(4(!"0$``80````)(4
+M(!"4"C_]D!``&$````"2%"`0D!``&"$``":2%"!P0````)00(!^0$``8DA0@
+M=$````"4$"!_D!``&)(4('A`````E!`@#I`0`!B2%"'P0````)00(`R0$``8
+MDA0A]$````"4$"#_PA8AU(((8/""`'_0@*!@/PB```.4$"`.E!`@$I`0`!@3
+M```F0````)(28?B0$``8$P``($````"2$F`<`S__\((08'^0"@`!VA8AU)H+
+M8/":`W_0`P``!((08X"`HV`_"(```Y02``&4$B^`D!``&!,``""2$F`<0```
+M``$````!````@<?@"('H``"=X[^8DA``&4````"0$``8@*(@``*``$F0$``8
+M(0``$$````"2%"`0%0#``)0J``J0$``80````)(4(!"0$``80````)(4(!"4
+M"C_]D!``&$````"2%"`0D!``&"$``""2%"$$0````)00(`&0$``80````)(4
+M(!P#/__P@A!@?Y`*``':%B'4F@M@\)H#?]`#```$@A!C@("C8#\(@``#E!(`
+M`902+X"0$``8$P``($````"2$F`<D!``&"$``":2%"!P0````)00(!^0$``8
+MDA0@=$````"4$"!_D!``&)(4('A`````E!`@#I`0`!B2%"'P0````)00(`R0
+M$``8DA0A]$````"4$"#_PA8AU(((8/""`'_0@*!@/PB```.4$"`4E!`@&)`0
+M`!@3```F0````)(28?@!````@<?@"('H``#"$D``E!```8,H8!"#,&`0&P``
+M`-H38`"`H$`-&(``#)@0(``#````EA!@`(,JH!";,&`0F`,@`8,K(`+"$L`!
+M@*-``2B___V8`R`!@RL@`AL```":$V``@@!`#8'#X`C04&`"G>._F)`0`!B2
+M$``9EA``&("F8!T8@`#$F`8AX(,N8`(;````FA-@`,(#0`&!P$```0```("F
+MH`(B@``-P@,```J``+VP$"``@*:@!`J```J`IJ`%"(``N("FH'\"@`"V`0``
+M`!"``+2P$"`-$(``;H,P8!(0@`"PL!`@#8"FH``"@`"ML!`@`("FH`$2@``(
+M@*:@``,```N"$&/,P@(``1"``(6#,&`;@*:@`"*```?"`P``@*:@`0*```8#
+M```+$(``G;`0(`P0@`!\@S!@$X(08]#"`L`!$(``>(,P8`+"!B',@*!@!1B`
+M`)*0$"``@*!@!1*``(^0$"`-PA8AT("@8`<X@`"+D!`@`!"``(JP$``(@*:@
+M``*``(>P$"``@*:@`1*``$D3```H0````)(28@B1,B`-D!H@`1"``'ZP"B`!
+M$(``=<(&(?B`IJ```H``>;`0(`"`IJ`!$H``=@,```N"$&/<$(``#,("``&`
+MIJ```H``!P,```2`IJ`!`H``"1L```00@`!KL!`@`8(08H;"%@`!@*```1"`
+M`&:P8#__@A-BC,(6``&`H&``,H``8;`0(`""$V**PA8``8"@8``"@`!<L!`@
+M`1"``%JP$"``@*:@``*``%>P$"``@*:@`1*``!D#```+@A!CS,("``&".``!
+M$(``3[$P8!^`IJ``(H``!\(#``"`IJ`!`H``"@,```L0@`!'L!`@#(,P8`N"
+M"&`!@B```8((?_,0@`!!L`!@#8(08]#"!@`!$(``'8,P8`,0@``[L!`@#`,`
+M``N"$&/@P@8``1"``"^""&`_`P``"X(08^#:!@`!`P``#X(08P":"T`!FS-@
+M"!"``"?:)L``@*:@`0*```@#```,"H``*+`0(`"`IJ`&&(``);`0(`PP@``&
+M@A!@&,(&``&"&&`!$(``'[`(8`%`````L!`@`8"B(``"@``:@*:@!CB``!BP
+M$"``@RZ@`AL```":$V``P@-``8'`0``!````$(``"<(*(`D0@``'P@H@#!"`
+M``7""B`-$(```\(*(`O""B`*PB;``!"```:P$"``E!``&D````"6$``;L!``
+M"(''X`B!Z```G>._F)(0`!F4$``:F!``')X0`!B`IF`=&(``D)8&(>"#+F`"
+M&P```)H38`#"`T`!@<!```$```"`IN```H``!@,```N"$&/,V@8``1"``#\9
+M`@``@A!CS-@&``$0@`!`&P(``,("P`"#,&`3@(A@`0*``'V0$"``@*;@``*`
+M``8;```+FA-CT,(&``T0@``%@@A_^YH38]#"!@`-@A!@!,(CP`V0$``8$P``
+M()(282`#```+@A!CT-0#P`%``````0```!"``&B0$"`!D!``&!,``"A`````
+MDA)B"`,```B`IN``$H``!)02``$#```(E"H``9`0`!@3```H$+__\)(28@CV
+M)B'XD!``&!,``""2$F!($+__ZI00`!N`H``;FD`@``,```L0@``.@A!CW("F
+MX``"@``'`P``"X(08\S:!@`!&2```!"```::$T`,@A!CS-@&``$;(```FBL`
+M#1"``#S:(\`!`P``"X(08_3"5@`!M@;``8"FX#\X@``"MA`@/X"B8!H2@``)
+M&0``"QL```N:$V/@P@/`#8(6P`&""&`_$(``"\(CP`V8$R/@V@/`#`,```^"
+M$&,`F@M``8(.P`&#,&`(@A!`#<(CP`R0$``8$P``()(28.@#```+$+__MH(0
+M8^"`IJ`&&(``'I`0(`";+J`"D!``&`,```""$&``T@!`#4````"4$``;,(``
+M%<("P`"`B&@``H``$)`0`!B`IN```H``!AL```N:$V/0P@8`#1"```6"$&`(
+MFA-CT,(&``V""'_WPB/`#1"```60$"`!D!``&$````"6$``;@<?@")'H``B=
+MX[^8D!``&)(0`!F4$``:EA``&Y@0`!Q`````FA``'8"@``BP0"``@<?@"('H
+M``"=X[^8@*9@``*``"B0$``8(0``$$````"2%"`$%0``P)0J``J0$``80```
+M`)(4(`1`````D!`@"K(0("@#/_\_HA!C_Y`0`!A`````DA0@$`,``$"`B@`!
+M`H``$("F8`!`````D!`@,I`0`!A`````DA0@!)0*`!&0$``80````)(4(`2R
+MAG__$K__\)`0`!@0@``/L!`@`!*```20$``8$(``"[`0(``A```@0````)(4
+M(`05``$`E"H`"I`0`!A`````DA0@!+`0(`&!Q^`(@>@``)WCOYB0$``8(0``
+M($````"2%"`$`P`!`)02``&0$``80````)(4(`2`IF```H``#)`0`!@A```0
+M0````)(4(`05``#`E"H`"@,``$"4$H`!D!``&$````"2%"`$`0```(''X`B!
+MZ```G>._F)`0`!@A```@0````)(4(`0#``$`E!(``9`0`!A`````DA0@!("F
+M8``"@``,D!``&"$``!!`````DA0@!!4``,"4*@`*`P``@)02@`&0$``80```
+M`)(4(`0!````@<?@"('H``"=X[^8D!``&)(0`!JT$``8@*9@`0*```VP$"`!
+M@*9@`0J```:`IF`"`H``#`$````0@``2D!`@`'___XD!````$(``"K`0``A_
+M__^Z`0```!"```<#```+?___T`$````0@``#`P``"P,```N"$&.X\B:``9`0
+M`!B!Q^`(D>@`")WCOYB0$``8$P``$$````"2$F`$`P``P)`*``&1,B`0@<?@
+M")'H``B=X[^8@*9@"`*``#>0$``8@*9@"!B```Z`IF$`@*9@`@*``#0#````
+M&(``!H"F8`2`IF`!`H``$Y(0(``P@``]`H``)I(0(``P@``Z`H``+H"F80`8
+M@``&@*9B`("F8"`"@``FDA`@`#"``#("@``I@*9D``*``"J2$"``,(``+0,`
+M``"P$&```P``!((08C3"`@`!@*!@``*``",!````VA!@`@,``!"`BT`!$H``
+M&@,````#```$@A!B-,("``'"4&`"@*!@`!:``!<#````$(``%;`08``#````
+M$(``$K`08``#````$(``#[`08``0@``-L!!@``,````0@``*L!!@``,````0
+M@``'L!!@``,````0@``$L!!@``,```"P$&``0````)(0`!B2$``8@<?@")'H
+M``F=X[^8D!``&$````"2$"`,@<?@")'H``B=X[^8D!``&)00`!E`````DA`@
+M#`$```"!Q^`(@>@``)WCOYB0$``8DA`@"$````"4$"`$`0```(''X`B!Z```
+MG>._F)`0`!B2$"`(0````)00(""0$``8DA`@")00(`1`````EA`@`("@``BP
+M0"``@<?@"('H``"=X[^8D!``&"$``"!`````DA0@2)0*/]^0$``80````)(4
+M($A`````D!``&)`0`!A`````DA`@`0$```"!Q^`(@>@``)WCOYB0$``8(0``
+M($````"2%"!(E!(@()`0`!A`````DA0@2$````"0$``8`0```(''X`B!Z```
+MG>._F)00`!F0$``8(0``($````"2%"!`D!``&)(4($1`````E!``&@$```"!
+MQ^`(@>@``)WCOYBB$``8@*9@/QB``!FP$"``@*9@'PB```R0$``1(0``($``
+M``"2%"!$@@9_X)00(`&5*H`!E"H`"I`0`!$0@``*DA0@1"$``"!`````DA0@
+M0)00(`&5*H`9E"H`"I`0`!&2%"!`0````+`0(`&!Q^`(@>@``)WCOYBB$``8
+M@*9@/QB``!FP$"``@*9@'PB```R0$``1(0``($````"2%"!$@@9_X)00(`&5
+M*H`!E!(`"I`0`!$0@``*DA0@1"$``"!`````DA0@0)00(`&5*H`9E!(`"I`0
+M`!&2%"!`0````+`0(`&!Q^`(@>@``)WCOYB0$``8(0``($````"2%"`\HA``
+M")`0`!A`````DA0A#("*("`R@``"HA1B``,`@("`B@`!`H```P$```"B%&$`
+M@<?@")'H`!&=X[^8E`Y@_Y`0`!@3```@0````)(28#R`CF(``H```Z`0(`"@
+M$"`@@(YA``*```20$``8`P"`@*`4``$3```@DA)A#$````"4$``0@*0@``*`
+M``:0$``80````)(0(#00@``%E!(@$$````"2$"`TE`H_[Y`0`!A`````DA`@
+M-`$```"!Q^`(@>@``,`J8`C`*F`)P"I@"L`J8`N:"J__@S-@&,(J8`S`*F`-
+MFS-@"((0``W:*F`.E`J@_X"*X"`"@``,U"I@#X((8/^#*&`(F@J@_YH30`$#
+M```(FA-``<`J8`R#,V`(PBI@#MHJ8`_`*F`4P"I@%<`J8!;`*F`7P"I@$,`J
+M8!'`*F`2P"I@$X'#X`B0$"`!G>._F*(0`!C@!Z!<P@Y@%X"(8`$"@`"/L!`@
+M#\(.X!>`B&`!,H``"<(.8!*0$``10````)(0(`R`H@`:`H``A;`0(`_"#F`2
+M@RA@"-H.8!.""&\`@A!`#<(T``#:#F`4FRM@&,(.8!6#*&`0@A!`#8(`0`&#
+M,&`1PC0@`L`L(`3:#F`0FRM@&,(.8!&#*&`0@A!`#8,P8!2""&#_@*!@@!*`
+M``/"+"`&P"P@!L(.8!2#*&`8V@Y@%9LK8!":$T`!P@Y@%H,H8`B"$$`-V@Y@
+M%YH30`&`BV$``H``!H(0/_\#```_@A!B`((+0`&#,&`)PBP@!\(.8!"#*&`8
+MV@Y@$9LK8!":$T`!P@Y@$H,H8`B"$$`-@S!@#X((8!_"+"`(P@Y@$(,P8`3"
+M+"`)P@Y@$H,P8`2""&`!PBP@"L(.8!2#*&`8V@Y@%9LK8!":$T`!P@Y@%H,H
+M8`B"$$`-V@Y@%YH30`&`BV`",H``.K`0(`"`BV`$(H``!<(.8!?"#"`$$(``
+M,H(08`&`B&`0(H``),(.8!?"#"`$@A!@`L(L(`3"#F`4@RA@&-H.8!6;*V`0
+MFA-``<(.8!:#*&`(@A!`#=H.8!>:$T`!`P``/X(08P":"T`!FS-@"-HL(`4#
+M```,@A!@',($0`&`H``!F&`__YH;8`6`H``-@D`@`("+``$B@``4L!`@`)`0
+M`!%`````DA``$!"```^P$"``@(A@""*```7"#F`7P@P@!!"```>"$&`(@(A@
+M(`*```:P$"``P@P@!((08!#"+"`$L!`@`(''X`B!Z```G>._>*80`!BH$``8
+MHA`@`,(6H`*`B&$``H``!)LH8!`0@``%@S-@%\(6H`*#,&`'@AA@`8"(8`$2
+M@`0'FA`@#,(6H`*`B&`@`H``!)LH8!`0@``%@S-@%L(6H`*#,&`&@AA@`8"(
+M8`$2@`/[FA`@#)`0`!.2$"``0````)00(`&`HB```H`#^;`0(`"0$``30```
+M`)(0`!JN$``(@*(@``*``^V:$"`,@*9@!B*```S`)[_D&(``!X"F8`B`IF`!
+M.(`#YL('```0@``%P">_Y!*``^&:$"`,P">_Y("FX``B@``.V`3AS)`0`!,3
+M```$0````)(284#0)[_DD!``$T````"2$``7D!``$T````"2$"``V`3AS((;
+M(`>`H``!FF`__X(;(`N`H``!@F`__X"30`$2@``.@*;@`("C(`H"@``*@*,@
+M"0*```B`HR`*$H``(I`0`!/"%.'0@*!@`SB``!\3```@@*;@``*``!N0$``3
+M`P``!((08C38!,`!@*,@``*``!4!````VA:``,(3``"`HT`!`H``$1,``"#:
+M%J`"F@MA\,(3(`*""&'P@*-``1*```H!````D!``$T````"2$``:@*(@`!*`
+M`Z>P$"`!D!``$Q,``"!`````DA)@6("B(``2@``$T">_X((0(`'")[_@D!``
+M$Q,``"!`````DA)@!`,`B`"Z"@`!D!``$R$``!!`````DA0@$`,`/X""$&!@
+MF@H``=HGO]R0$``30````)(4(!30)[_LD!``$T````"2%"`8T">_Z)`0`!-`
+M````DA``&4````"0$``3D!``$T````"2$``:@*(@``*``WB:$"`#PA:@`H((
+M8?"`H&%``H``'ZP0(`$4@``0@*!HP("@8,`"@``BK!`@!!2```>`H&#0@*!@
+MH`*``!J:$"`,$(`#:,('```"@``<FA`@#!"``V3"!P```H``%("@:,`T@``$
+M@*!I0!"```2`H&%0`H``!H"@:5`"@``'FA`@#!"``UC"!P``K!`@`1"```[L
+M)[_8K!`@`A"```:"$"`!$(``!ZP0(`.L$"`$@A`@`A"```7")[_8K!`@!9H0
+M(`+:)[_8D!``$Q,``"9`````E!`@!Z`0(``#````I!!@`(($`!""`$`0FRA@
+M`]($@`V"`$`!@@!`%H,H8`+4!(`!0````)`0`!.B!&`!@(Q@/S*```6@!"`!
+M0````)`0(`&@!"`!@*0@&`B__^^"!``0H!`@``,```"D$&```S__WZH08^"P
+M$&,L@RP@`X"FX``"@``/T@2``8("0!6`H&`8&(```Y@0(`&8$"``@@)`&("@
+M8`@8@``#FA`@`9H0(`"`BP`-(H``#J`$(`&#+"`#@@!`$M0`8`1`````D!``
+M$Z($8`&`C&`_,H``!:`$(`%`````D!`@`:`$(`&`I"##"+__XX,L(`,#```+
+M@A!@K,(%``&0$``3DA``%M0'O]B?P$``EA``$<(6H`*9*&`0FS,@$`,``!"`
+MBT`!$H``!("C(``V@``&PA3ATI`0`!-`````DA``&L(4X=*`H&!!*(``1<(4
+MX=*0$``3$P``)I(28"P5``"H0````)02H`+"%H``@*!IM!*```@#```$FA!B
+MDM`-``V"$&*<PA4``1"```20(@`!@A!BDM`-``%`````DA`@!<(6H`*""&#0
+M@*!@P#*``!&0$``3`P``!((08I+4#0`!E"``"I4JH`:4"J_`@RH@$H(@``$;
+M`#\`@@A`#902@`&0$``3$P``)A"```62$F%,$P``)I(284R4$"``0````"$`
+M`"B0$``30````)(4(BB4"CW_D!``$T````"2%"(HD!``$T````"2%"(H%0``
+M?Y0J``J4$J@`D!``$T````"2%"(HD!``$Q,``""2$F!@0````)00(`_"%.'2
+M@*!@0@B```>0$``3$P``*)(28E1`````E!`@`)`0`!,3```FDA)@>$````"4
+M$"`.P@3AS("@8`H"@``*@*!@"0*```B`H&`*$H``&I`0`!/"%.'0@*!@`QB`
+M`!>2$``7PA:``)H8:9Z`H``-FF`__X(8::.`H``!@F`__YH30`&@&V`!D!``
+M$R,``"A`````DA1B3("B`!`"@``%D!``$Y(48DQ`````E!``$)`0`!.2$``7
+M0````)0'O_"`HB```H`">IH0(`.`IF`&`H``"900`!;"!.($@*!@``*```8#
+M```+0````)`0`!.4$``6`P``"X(08+C"!0`!D!``$Y(0`!>?P$``E@>_\("B
+M(``"@`)FFA`@`\(6H`*`B&!`(H``(9`0`!/"!.',@*!@"@*``!*`H&`)`H``
+M$("@8`H2@``'`P``!,(4X="`H&`#*(``"\(6H`(#```$@A!B<-H5``$#```4
+M@A!@`H"C0`$(@``*D!``$\(6H`*""&"@@*!@H`*```20$``30````)(0`!>0
+M$``30````)(0`!J0$``30````)(0`!>`HB```H`"/IH0(`.`IN```H``""$`
+M``N0$``3$P``!)(284!`````U`>_Y"$```N"%"`PU`T``8(4(#'"#0`!@RA@
+M")02@`&"%"`RP@T``8,H8!"4$H`!@A0@,\(-``&#*&`8E!*``9`0`!-`````
+M$P``()H4(#2"%"`UP@T``8,H8`C4#0`-E!*``902@!V"%"/,P@4``902@`$#
+M`"``E!*``9`0`!,E```@0````)(4H`20$``30````)(0`!F"%"`\U`T``8(4
+M(#W"#0`!@RA@")02@`&"%"`^P@T``8,H8!"4$H`!@A0@/\(-``&#*&`8E!*`
+M`9`0`!-`````DA2@X)H4($""%"!!P@T``8,H8`C4#0`-E!*``9`0`!-`````
+MDA2@Y)`0`!,C```00````)(48!#"![_<E!(``9`0`!-`````DA1@$)`0`!.2
+M%&`40````-0'O^R0$``3DA1@&$````#4![_HD!``$Y(4H%A`````U`>_X((4
+M(#;4#0`!@A0@-\(-``&#*&`(E!*``8(4(#C"#0`!@RA@$)02@`&"%"`YP@T`
+M`8,H8!B4$H`!D!``$T````"2%*`(FA0@.H(4(#O"#0`!@RA@"-0-``V4$H`!
+MD!``$T````"2%*`,H!0CU)`0`!.2%*`80````-0%`!"0$``3DA`@@$````"4
+M$#__D!``$T````"2$``7@*(@``*``;F:$"`#(0``!((4(CC2#,`!D!``$T``
+M``"4$"`!D!``$T````"2$``:PA3AU(((8/""`'_0@*!@/QB``"*0$``3@A0B
+M-,($P`'"$&`"F2A@$)LS(!`#```0@(M``1*```8#```$@*,@`#:``!<3```F
+M`P``!((08C3"!,`!PA!@`AL``!"""$`-@*```:!@/_^@!"`,D!``$R,``"9`
+M````DA1@))0*/_"@#"`/E!*`$)`0`!-`````DA1@))`0`!,3```F0````)(2
+M810#/__PH"H``<(6H`*1+"`"@(A@(!*```22$"`6D!``$)(0(`I``````0``
+M`*`0``B0$``3$P``)I(28!Q`````E!`@`0,```2"$&(TP@3``=H08`(#```0
+M@(M``1*```J0!``0`P``!((08C3"!,`!PE!@`H"@8``6@``$D`0@9)$L(`*0
+M`B!D0````"$``":0$``30````)(4(`BD$``(D!``$Y(4(`A`````%0``#J`0
+M(``0@``$(P``)T````"0$"#(@A``$("@8!,4@``(H`0@`9`0`!-`````DA1@
+M)("*(!`2O__V`0```)`0`!,A```FDA0@"$````"4$``2D!``$T````"2%"!@
+ME!(@`Y`0`!-`````DA0@8,(6H`*""&"@@*!@H`*``!L#```+HA!CP,(%`!&`
+MH&`"`H``%I`0`!-`````DA0A(!4``#R4*@`*`P``/)02@`&0$``30````)(4
+M(2"0$``30````)(4(2`#``!`E!(``9`0`!-`````DA0A(((0(`$0@``%PB4`
+M$0,```N"$&/`P"4``4````"0$``3H!`@`*(0(`&3+"`"DB)P`)4L0!!`````
+MD!``$Z`$(`&`I"`)!+__^I,L(`(#```1@A!BH,`E``&@$"``PA3AZ("D``$6
+M@``+`P``"Y`0`!-`````DA``$*`$(`'"%.'H@*0``0:___N0$``3`P``"Y@0
+M8$0#``("FA!A98"F8`82@``%VB4`#`,```2"$T`!PB4`#)`0`!.2$""@`P``
+M"X(08$1`````U`4``9`0`!-`````DA`@K`,``<"4$@`!D!``$T````"2$""L
+M`P``!((08DS"!,`!@*!@``*```60$``30````)`0`!.0$``3$P``)I(28&"4
+M$"`!0````)80(`"0$``30````)(0`!F0$``3(0``($````"2%"`@%0!@`)0J
+M``J0$``30````)(4("#"!.',@*!@!1B```F0$``3$H``$Q,``"#"%.'0@*!@
+M!PB``!"2$F$(D!``$R$``""2%"$8%0``0$````"4$J"JD!``$Y(4(1P5```,
+M0````)02HA"0$``3$P``()(280A`````E!`@4L(6H`*`B&$``H``!`,```00
+M@``#@A!BCH(08H_4#0`!E2J@&)4ZH!B0$``30````)(0`!H#```+FA!CX-H%
+M``V4"V`_@A!C]-A5``&"(H`,VDW@!H"@0`TX@``"E`-`#-I-X`6:`T`-@RH@
+M&(,X8!B:(T`!@**`#2B```<;```+`P``"X(08_3"50`!E`-``1L```N"$V/@
+MV`4``0,```^"$&,`F`L``9DS(`B:$V/TUE4`#8(C``O:3>`&@*!`#3B```*8
+M`T`+VDW@!9H#0`V#*B`8@SA@&)HC0`&`HP`-"(``!@,```N"$&/TPE4``9@#
+M0`$#```+FA!CX-85``V6"N`_@A!C]-)5``&"(L`)VDW@!H"@0`TX@``"E@-`
+M"=I-X`6:`T`-@RH@&(,X8!B0(T`!@*+`"`B```:`HJ`_`P``"X(08_3"50`!
+ME@(``3B```*4$"`_@*,@/SB```*8$"`_@*+@/SB```*6$"`_E`J@/YLK(`@#
+M```/@A!C`)H+0`&4$H`-@RK@$!L`#\"""$`-E!*``9`0`!,A```@0````)(4
+M(.@#```+@A!CT-0%``&`HJ```H``!@,```N0$``30````)(4(2`#```+@A!C
+M^-(%``&`HG__`H``!0,```M`````D!``$P,```N"$&/\T@4``8"B?_\"@``%
+M`P``#$````"0$``3`P``#-(%``&`HG__(H``!=0$X?A`````D!``$]0$X?B`
+MHJ```H``!X"FX`"0$``3$P``($````"2$F!(@*;@``*``!_R).'<P@W@!("(
+M8`(R@``%PA7@`H((?_["+>`$PA7@`L(VH`+"#>`$PBZ@!,(-X`7"+J`%P@W@
+M!L(NH`;"#>`'PBZ@!P,```2"$&(TU@3``9@0(`":$"``V#K@,.`$P`%`````
+MD!``$]`\("B0$``30````)(0(`$0@``'L!`@`<('``"`H&``,H```MHG``"P
+M$"``@<?@"('H``"=X[^8X@8B!(",8`,"@``/@HQ@#)`0`!@A```F0````)(4
+M(405"```E"H`"H(,8`&#*&`=E!*``9`0`!A`````DA0A1(*,8`P"@``0@(A@
+M!!*```>0$``8(0``($````"2%"#0$(``!I0*/^,A```@0````)(4(-"4$B`<
+MD!``&$````"2%"#0`0```(''X`B!Z```G>._F)`0`!@#```+@A!@M,(&``&?
+MP$``DA``&8"@``BP0"``@<?@"('H``"=X[^0HA`@`:80`!B0$``80````)(0
+M`!F@$"``PA8AZ("D``$:@``-I!``")`0`!A`````DA``$("B(``R@``'HA`@
+M`*`$(`'"%B'H@*0``0J___B0$``8@*1@``*``(."$"``D!``&!,``":2$F%\
+M0````)00(`&@$"``(P``)Y`0`!A`````DA1@(("B(``2@``*@*0@8T````"0
+M$"`%H`0@`8"D(&,HO__WD!``&!"``&Z"$"``&(``;((0(`"0$``80````)(0
+M`!*`HB```H``9H(0(`"0$``8$P``)D````"2$F$4`S__\)`J``'"%*`"@(A@
+M(`*```22$"`*D2H@`I(0(!9``````0```$````"0`B!DD!``&)(0`!)`````
+ME`>_\("B(``"@`!/@A`@`)`0`!@3```FDA)A?$````"4$"``PA2@`H"(8$`"
+M@``AD!``&,(&(<R`H&`*`H``$H"@8`D"@``0@*!@"A*```<#```$PA8AT("@
+M8`,H@``+PA9@`@,```2"$&)PVA3``0,``!2"$&`"@*-``0B```J0$``8PA9@
+M`H((8*"`H&"@`H``!)`0`!A`````DA``$I`0`!A`````DA``&9`0`!@A```F
+M0````)(4(&"4$B`"D!``&$````"2%"!@P@R@!("(8`(R@``%PA2@`H((?_["
+M+*`$PA2@`L(V8`+"#*`$PBY@!,(,H`7"+F`%P@R@!L(N8`;"#*`'PBY@!P,`
+M``2"$&(TU@8``9@0(`":$"``V#K@,.`&``%`````D!``&-`\("B0$``80```
+M`)(0(`&"$"`!@<?@")'H``&=X[^8D!``&!,``"!`````DA)@!`,``,"`IF`!
+M`H``)9`J``&`IF`!%(``!H"F8`:`IF```H``$Q4$`(`P@``D`H``!8"F8`@"
+M@``;%00``#"``!\5!`!`E!(`"I`0`!@3```@0````)(28`20$``80````)(0
+M(!00@``+E`H_WY02``J0$``8$P``($````"2$F`$D!``&$````"2$"`4E!(@
+M()`0`!@0@``'DA`@%!4$``"4$@`*D!``&!,``""2$F`$0`````$````!````
+M@<?@"('H``"=X[^8D!``&$```;:2$"`"@<?@")'H``B=X[^8H!``&)`0`!B2
+M$"``0````)00(`&`HB```H``!K`0(`"0$``00``!J)(0(!.P$``(@<?@"('H
+M``"=X[^8H!``&)`0`!A```&@DA`@$X"B(``"@`"JL!`@`)`0`!"2$"``0```
+M`)00(`&`HB```H``H[`0(`"0$``00``!DY(0(`"`HB```H``G;`0(`"`IF``
+M(H``FK`0(`'"!"',@*!@"@*```J`H&`)`H``"("@8`HR@``0PA0AU,(4(="`
+MH&`#.(``#,(4(=3"%F`"@(A@(!*``!ZF$"`(@@A@T("@8,`2@``XI!`@!!"`
+M`#:D$"#K@@A@\((`?]"`H&`_*(``#,(68`+"!"',FAA@!X"@``V:8#__@AA@
+M"X"@``&"8#__@)-``0*``!7"%F`"@(A@(!*```:F$"`(@@A@T("@8,`R@``$
+MVA9@`A"``!ZD$"#K`P``$("+0`$2@``:I!`AZL)68`*".``!I3A@'Z0,O@`0
+M@``4I`2BZH"(8"`2@``&IA`@`(((8-"`H&#`,H``!-H68`(0@``+I!`@JP,`
+M`!"`BT`!$H``!Z00(:K"5F`"@C@``:4X8!^D#+X`I`2BJL(68`*`B&!`(H``
+M$*84X`&`B&`@,H``#:84X`2""&#0@*!@P#*```3"%F`"$(``!J84X`2`B&!`
+M,H``!,(68`*F%.`!PA9@`H"(80`B@``"IA3@`L(68`*""&`0@*```;!`/_^P
+M#C_]L`8@`Y`0`!`3```F0````)(28'S"%F`"@(A@(!*```:B$``(@@A@T("@
+M8,`2@``6@*(`$I`0`!`S```FDA9@!$````"4$``8D!``$!,``"B2$F(`0```
+M`)00`!.`I$`2`H``&Y`0`!"2%F!\0````)00`!)`````D!`A+!"``!6P$"`!
+M`H``")`0`!`3```FDA)@?$````"4$``20````)`0(2R0$``0$P``)I(28`1`
+M````E!``&)`0`!`3```HDA)B`$````"4$``3L!`@`8''X`B!Z```G>._F*00
+M`!BF$``8P":``)`0`!A`````DA``&:(0``B`HB```H``YK`0(``#```+@A!C
+MP-H$@`&"&V`"@*```9A@/_^`H``-@F`__X"3``$"@``%`P``"X(0(`'")H``
+M`P``"[`08\#@!,`8@*0@`3*``'?"%F`"D!``$A,``"9`````DA)A(`,``$"`
+MB@`!,H``;\(68`+`),`8X":``*@0(``U```G+0``)I`0`!)`````DA:@$+`0
+M``B0$``20````)(6H!2@$``(D!``$D````"2%J`8@*``&)I`(`"`H``0@D`@
+M`("+0`$2@``.JA``")`0`!)`````DA6A(`,``$"4$@`!D!``$D````"2%:$@
+MJ`4@`8"E(`D$O__ED!``$I,V(`&#-"`!D@)``9,R8`>A-"`'@*``"8)`(`"`
+MI"`!%(```YH0(`&:$"``@(A`#0*``&"0$``2@B``%8,H8!BI.&`80````)`0
+M`!2`HC_@%H``!*@0``@0@``%J!`_X("B(!\T@``"J!`@'Y`0`!A`````DA``
+M$*H"/X"`I7_P%H``!("E8`\0@``$JA`_\#2```*J$"`/D!``$B$``"9`````
+MDA0A()0*.!^#+2`%@@AGX)02@`&0$``20````)(4(2"0$``20````)(4(2"4
+M"C_@@@U@'Y02@`&0$``20````)(4(2"0$``20````)(4(2"4$B@`D!``$D``
+M``"2%"$@FA`@`@,```N"$&/`VB3``8(0(`'")&`0Z"Q@%!"``"/J+&`5@@A@
+MH("@8*`"@``?`P``"Z@08\#"!,`4@*!@`A*``!N0$``2P@1@$("@8``2@``7
+M`0```"$``"9`````DA0A(!4``#R4*@`*`P``/)02@`&0$``20````)(4(2"0
+M$``20````)(4(2`#``!`E!(``9`0`!)`````DA0A(((0(`'"),`4D!``$D``
+M``"2$``1PA1@`H"(8`(R@``PPA9@`I`0`!(A```F0````)(4(&"4$B`"D!``
+M$D````"2%"!@TA9@`H"*80`R@``,V`2AS,(4H=2""&#P@@!_T("@8#\8@``D
+ML!`@`8"*8$`"@``A`0```-@$H<R"&R`'@*```9I`(`""&R`+@*```8)`(`"`
+MBT`!(H``%[`0(`&`HR`*`H``$X"C(`D"@``1@*,@"A*```8!````PA2AT("@
+M8`,H@``,L!`@`4``"BJ0$``2$(``"+`0(`&"$&`"PC9@`L(48`*""'_]PC1@
+M`K`0(`&!Q^`(@>@``)WCOY"`IF``$H```X(0`!F"$#__PB>_],(&(<R`H&`)
+M`H``"("@8`H2@``(D!``&,(6(="`H&`#&(``!`$```"R#G_OD!``&$````"2
+M$"`,D!``&!,``!!`````E!``&4````"0$"`/P@>_](((8`/")[_TL@Y@`Y`0
+M`!@3```0E!```4````"6$``9@(Y@`1*``!N@$``(@A`@%((08`'")[_TU`^_
+M],(/O_6#*&`(E!*``<(/O_:#*&`0E!*``<(/O_>#*&`8E!*``9`0`!A`````
+MDA`@%)`0`!B2$"``0````)00(`&`HB```H``!)`0`!A`````DA`@P(''X`B1
+MZ``0G>._F)`0`!@3```F0````)(28&21,B`3D`HA_X"*(0`"@``#L!``"+`2
+M/@"Q+B`0L3X@$(''X`B!Z```PA)@`H((8>"`H&#`(H``$`,```04@``'@*!A
+M0("@8*`"@``)`P``!!"```V0$"``,H``"Y`0(``#```$$(``!8(08LP0@``#
+M@A!BSH(08M#"$@`!PC*``)`0(`&!P^`(`0```)WCOY"0$``8$P``)D````"2
+M$F!@@(H@`A*``!>@$"``0````)`0`!B@$``(D!``&)(0`!E____:E`>_]H"B
+M(``B@``,H!`@`(,L(!"#.&`0VE>_]H"@0`TD@``'X#9@%L(68`*"$&`"PC9@
+M`J`0(`#@-F`6L2P@$+$^(!"!Q^`(@>@``)WCOYC"!B'@@S!@'8"(8`$"@``J
+MI!``&)`0`!B2$"0@0````)00(`&0$``8DA`F`$````"4$"``D!``&$````"2
+M$"8`E!(@")`0`!A`````DA`F`)`0`!B2$"8$%0`$`$````"4$J(!D!``&)(0
+M)B!`````E!`@`*`0(``#```+HA!C.)`0`!B2$"0`0````)00`!""!``2U`A`
+M$9`0`!A`````DA`D!*`$(`&`I"!_!+__]I`0`!B!Q^`(@>@``)WCOYB0$"``
+ME`:__Y4RH`.T!K__M`Z@!Y80`!F`IF``!(``'9X0(`"2$"`!MR[@`Y@&@`N`
+MHR`(.(```I@0(`B#*D`,@@!__YLJ0!J:`W__@AA`#8,H0!N;*J`"V@8`#8((
+M0`V#,$`;@S!`&H,H0`^0$@`!@B,`&IX#P`&"`L`:E@!_^+00(`"`HN``%+__
+MZ90"H`%`````DA``&8''X`B1Z``(G>._F,(6H`*""&'@@*!@P`*```ZD$``8
+M@*!@P!2```>`H&%`@*!@H`*```F:$"`!$(``8;`0(``"@``%FA`@`!"``%VP
+M$"``FA`@`IH#0`V:`T`2&0``!((3(N:"`T`!XA!@!((3(NR"`T`!PA!@!(,H
+M8`:B%$`!@A,B\H(#0`'"$&`$@RA@#*(40`&"$R+X@@-``<(08`2#*&`2HA1`
+M`8(3(OZ"`T`!PA!@!(,H8!BB%$`!@A,C!((#0`'T$&`$@A,C"H(#0`'"$&`$
+M@RA@!K06@`&"$R,0@@-``<(08`2#*&`,M!:``8(3(Q:"`T`!PA!@!(,H8!*T
+M%H`!F!,C')H#0`S"$V`$@RA@&("F8`$"@``*M!:``8"F8`$*@``)@*:`$8"F
+M8`(B@``%HA``&A"``"&P$"``M!``$8"F@!$2@``(D!``&"$``"A`````DA0B
+M"!4```@0@``'E"H`"B$``"A`````DA0B"`,```B4$@`!D!``&$````"2%"((
+M`P``"X(08[SR)(`!D!``&"$``":2%"%@0````)00`!&0$``8DA0A9$````"4
+M$``:L!`@`8''X`B!Z```G>._F,(&(<R`H&`*`H``&H"@8`D"@``8@*!@"A*`
+M``B:&&`'PA8AT("@8`,(@``3DA`@*,(&(<R:&&`'@*``#9I@/_^"&&`+@*``
+M`8)@/_^`DT`!$H``"9(0("C"%B'4@@A@\((`?]"`H&`_&(```Y(0(""2$"`H
+M0````-`60`"`H``(L$`@`)`"/_:`HB`,&(```X(0(`&"$"``L`X``8''X`B!
+MZ```G>._F*80`!C"%F`"@RA@$*LP8!>#,&`0@@AA\("@84`"@``=J@U@`8"@
+M84`4@``0@*!HP("@8,`"@`!$NA`@`A2```>`H&#0@*!@H`*``#^Z$"`!$(`!
+M:+`0(``"@``[NA`@`A"``62P$"```H``-H"@:,`T@``$@*!I0!"```2`H&%0
+M`H``!("@:5`R@`%:L!`@`,(6(=2""&#P@@!_T("@8#\(@``INA`@`-@&(<R"
+M&R`'@*```9I`(`""&R`+@*```8)`(`"`BT`!`H``()`0`!B`HR`*`H``'8"C
+M(`D"@``;@*,@"A*```@A```FPA8AT("@8`,(@``6(P``)I`0`!@A```F0```
+M`)(4(424"C_'`P``"X(08"S"!,`!PE!``(,H8`.""&`XE!*``9`0`!A`````
+MDA0A1!"```20$``8NA`@`I`0`!@C```F0````)(481"4"CP&H`=`':`$`!,E
+M```$@A2BX(($``'"$&`$@RA@!)02@`&4$J`!D!``&$````"2%&$0D!``&`,`
+M``N"$&.\T@3``4````"4$``9@A2BR*`$``'4%"`$E`JA_Y02H@"0$``80```
+M`)(486B"%*)PVA3``0,``!."$&/_@*-``0B``!2"!T`=PA9@`H"(8!`"@``0
+M@@=`'9H%0!6:`T`3@A2C0((#0`'@$&`$@@5`$Y@4HTB"`$`,Z`A@!.P(8`;N
+M$T`,@A2C4!"``!;X$T`!@@!`$QD```2:$R*@@@!`#>`08`*"!T`3FA,BP((`
+M0`WH"&`&@@5`$YH3(LB"`$`-[`A@`8(%0!6"`$`3FA,BJ.X00`V8$R,P@@!`
+M#/@08`*0$``8(P``)D````"2%&!$`S__\((08'^4"@`!FRP@$)LS8`D#```/
+M@A!C@)H+0`&4$H`-D!``&$````"2%&!$D!``&$````"2%&!0E`H_`((-(/^4
+M$H`!D!``&$````"2%&!0D!``&$````"2%&!0)3__P*04H/^4"@`2FRV@&)L[
+M8!`#```_@A!C`)H+0`&4$H`-D!``&$````"2%&!0D!``&$````"2%&!(%0``
+M_)0J``J#+>`0@S!@!!L``/R""$`-E!*``9`0`!A`````DA1@2*`'0!V@!``3
+M*0``!((5(KB"!``!PA!@`I4H8!B#*&`0E!*``8(5(L#:%``!@RM@")02@`&4
+M$H`-D!``&$````"2%&`TD!``&$````"2%&`HE`H`$H(5(JB"!``!PA!@!H,H
+M8`B4$H`!D!``&$````"2%&`HD!``&$````"2%&!D%0`!_)0J``J"%2*PH`0`
+M`<(4(`2#*&`,&P`!_(((0`V4$H`!D!``&$````"2%&!D@A4B<-H4P`$#```,
+M@A!@`H"C0`$8@``-HA`@`MH6(<J"%2`B@*-``1*``!60$``8PA9@`H"(8$`R
+M@``1HA`@"!"``!`A```FD!``&$````"2$``9@*(@``*```F0$``8@@=`'8(`
+M0!,;```$FA-C(((`0`W"$&`&H@1``2$``"9`````DA0A))0*/P&"!$`1@@A@
+M_I02@`&0$``80````)(4(23"!F`0@*!@``*```68!4`5XDY@%!"```KD3F`5
+MF`,`$QL```2"$V.P@@,``>(08`::$V.XF`,`#>03(`*0$``8(0``)D````"2
+M%"$@E`HX'X,L8`6""&?@E!*``9`0`!A`````DA0A()`0`!A`````DA0A()0*
+M/^""#*`?E!*``9`0`!A`````DA0A()`0`!A`````DA0A()02*`"0$``80```
+M`)(4(2`#```$@A!B<-H4P`$#```0@*-``0B``!H#```$PA9@`H((8-"`H&#0
+M$H``")`0`!@#```3@A!C_X"C0`$(@``0`P``!)`0`!@A```H0````)(4(@P5
+M`#\`E"H`"H,O(!(;`#\`@@A`#902@`&0$``80````)(4(@P#```$@A!B<-H4
+MP`$#```4@*-``2B```BP$"`!D!``&!,``":2$F'@0````)00(`"P$"`!@<?@
+M"('H``"=X[]PF!`@`)H0(`#8/[_PV#^_X-@_O^BJ$"``K!`@`*X0(`":$"`!
+MVC>_V((0(`+"-[_:PC>_W-HWO][:-[_0PC>_TMHWO]3"%F`"HS!@!Z*,8`$"
+M@``(PA9``)LH8`*:`T`!F@-`#0,__^D0@``'@A!B*)LH8`*:`T`!F@-`#0,_
+M_]""$&"8I`-``<(68#C:%F`X@*-@`!*``"RF$``!$(``!"<__^`0@``GI@I`
+M",(68`*`B&`0`H```Z@0(%>H$""NH!`@`),L(!"3,F`0P@8AQ)`0`!B?P$``
+ME!``$8,J(!"9,&`0`P``(("C``$"@``5@RR@$)4P8!"6#2#_FB*`"P,```^2
+M$&/_F`L`"8"C0`P4@``&@@0@`8("@`N`H$`,%K__X8($(`&@$``!@RA@$(,P
+M8!"`H&`$*+__Y),L(!#F-F`XFRS@$`,@``"`HT`!$H``6X,LX!"0$``8(P``
+M)D````"2%&$@`Q```("*``$"@`%<D!``&$````"2%&$,%3_``)0J``J0$``8
+M0````)(480R0$``80````)(482`#'```E"H``9`0`!A`````DA1A#)`0`!B2
+M%&&@0````)00(`"0$``8DA1A@$````"4$"``D!``&$````"2%&&$(3_\`)0*
+M`!"0$``80````)(48820$``8DA1AF$````"4$"``D!``&$````"2%&&<E`H`
+M$)`0`!A`````DA1AG)`0`!B2%&$`0````)00(`"0$``8DA1A!$````"4$"``
+MD!``&)(480A`````E!`@`)`0`!A`````DA1A#"$___"4"@`0D!``&$````"2
+M%&$,D!``&)(488A`````E!`@`)`0`!B2%&&,0````)00(`"0$``8DA1AD$``
+M``"4$"``D!``&$````"2%&&4E`H`$)`0`!@0@`$)DA1AE*$P8!"#+*`0@S!@
+M$*`D``'"%F`"@@AA\("@8-`B@``CK2P@$!2```>`H&%`@*!@P`*``!&#+"`%
+M$(``)8(@0!`"@``&@*!A4`*``!>#+"`%$(``'X(@0!"M+"`1D!``%D````"2
+M$"`9K!``"!"```RO.B`*KRP@")`0`!=`````DA`@-ZX0``BM+"`1D!``%D``
+M``"2$"`9K!``"!"```JJ$"PUK2P@$)`0`!9`````DA`@&:P0``BO.B`*`P``
+M!JH08&J#+"`%@B!`$(,H8`*"`$`0D2A@!Y,M8!!`````DS)@$)H0(`2`BB`/
+M$H``!)0'O]B:$"`#E`>_T((+8`>`H&``!(``7*`0(`"1.B`$DA`@`980``&`
+MHB`<%(``PH,L(!"#,&`0@@(``9@`8!F`HR`@&(``#H(#/]^`HR`9!(``!X,J
+M0`R`HR`:!(``$((#(`&"`S__@RI``=H'O_""$$`-$(``"<(GO_"`H&`3.(``
+M!X(#(`&#*D`!V@>_]((00`W")[_T@@,@`8"@8`\8@``,@@,_\8,L(!"#,&`/
+MVA*``8(#``R"`&`"FRM``<('O^":$T`!$(``*-HGO^"`H&`/&(``#((#/^&#
+M+"`0@S!@#]H2@`&"`P`,@@!_XILK0`'"![_DFA-``1"``!O:)[_D@*!@#QB`
+M``R"`S_1@RP@$(,P8`_:$H`!@@,`#((`?\*;*T`!P@>_Z)H30`$0@``.VB>_
+MZ("@8`88@``,@@0@`8,L(!"#,&`/VA*``8(#``R"`'^BFRM``<('O^R:$T`!
+MVB>_[(($(`&@$``!@RA@$(,P8!"`H$`+!K__K("B(!R0$``8(0``)D````"2
+M%"$,%3_``)0J``H#/\``E!*``9`0`!A`````DA0A#)`0`!A`````DA0A(`,<
+M``"4$@`!D!``&$````"2%"$@E2W@%`,/_`"4"H`!(P`#_Z(48_^"#8`1E!*`
+M`0,0``"4$H`!D!``&$````"2%"&@D!``&)(4(8!`````U`>_\)`0`!A`````
+MDA0AA"4__`"4"@`2P@>_](((0!&4$H`!D!``&$````"2%"&$D!``&)(4(9A`
+M````U`>_\)`0`!A`````DA0AG)0*`!+"![_T@@A`$902@`&0$``80````)(4
+M(9R0$``8DA0A`$````#4![_@D!``&)(4(01`````U`>_Y)`0`!B2%"$(0```
+M`-0'O^B0$``80````)(4(0PE/__PE`H`$B,```^B%&/_P@>_[(((0!&4$H`!
+MD!``&$````"2%"$,D!``&)(4(8A`````U`>_X)`0`!B2%"&,0````-0'O^20
+M$``8DA0AD$````#4![_HD!``&$````"2%"&4E`H`$L('O^R""$`1E!*``9`0
+M`!B2%"&40`````$````!````@<?@"('H``"=X[^8PA9@`H"(8!`"@``#$1D`
+M`!$R``#:%F`"`P``$("+0`$B@``$PE9@`A"```61,B`!@*!@`":```*1,B`"
+M0````-(60`"B$"`?@S(`$8"(8`$2@``&@A`@)J*$?_\2O__\@S(`$8(0(":B
+M($`1@A`@%X(@0!&@$"`!H2P``:`"`!""$"`8@B!`$:$T``&B!'_PD!``&"4`
+M`"9`````DA2@%!4__X"4*@`*H2P@$902@!"0$``80````)(4H!20$``80```
+M`)(4H!05``!XE"H`"J,L8`T#``!XH@Q``902@!&0$``80````)(4H!0!````
+M@<?@"('H``"=X[^0@*9@/SB```*R$"`_\C8A_)`0`!@#```$@A!B--(&``%`
+M````E`>_\(''X`B1Z``(G>._B*80`!BD$``8(0``$8(4(GB:%")\T`8``4``
+M``#2!@`-H!0B@*`&`!"0$``00````)(0("#"5B'\@*!@/P2```/6%B'\EA`@
+M/X,JX!"#.&`0@*!@/A2```.:$"`!FA`@`(,JX!"`H``!@F`__X"30`$"@``'
+ME!`@`-H$X@":`T`-`P```((08`#4$$`-E2J@$)4ZH!"7*N`0ESK@$(('O_;"
+M(Z!<D!``$Y(0`!F8$"`!0```X9H'O_2`HB```H``W+`0(``#```+@A!@O,($
+M@`&0$``3D@>_])0'O_:6$``9G\!``)@0`!J`HB```H``T+`0(`#8!.',@AL@
+M!X"@``&:0"``@AL@"X"@``&"0"``@(M``0*``!.@$"``@*,@"@*``!"`HR`)
+M`H``#H"C(`H2@``'&P``$<(4X="`H&`#"(``"0,``!$;```1FA-BGL(4@`V"
+M`&`$PC2`#:`0(``#```1F!!B@`,```N"$&/TUA2``900(#^"!``0F@!`$L(3
+M0`R"`$`+PC-`#(,H8!"#,&`0@*!@/SB```+4,T`,H`0@`8"D(`\(O__U@@0`
+M$!L```2"$V*>PA2``8"@8`$X@``Y(0``$<(4X=*`H&!!&(``&J`0(`#"%F`"
+M@@A@T("@8,`2@``6`P``*,(60`"`H&FT$H``"`,```2"$V*2T`R``8(38IS"
+M%(`!$(``!)`B``&"$&*2T`R``4````"2$"`%DRH@$),R8!!```*`D!``$Z`0
+M(``#```HLA!A@`,``!&T$&)X`P``/Z(08_^;+"`"D@-`&=@$@!J"`T`,U!!@
+M`I4JH`B4$J#_E`J`$94JH!#"$P`-@RA@"((08/^""$`1E!*``4````"0$``3
+MH`0@`8"D(!\$O__OFRP@`B$``!&"%"*&U!2``90*H#^5*J`8@A0BA,(4@`&"
+M"&`_@RA@$)02@`&"%"*"PA2``8((8#^#*&`(E!*``8(4(H#"%(`!@@A@/Y02
+M@`&0$``3(P``)D````"2%&$T@A0BCM04@`&4"J`_E2J@&((4(HS"%(`!@@A@
+M/X,H8!"4$H`!@A0BBL(4@`&""&`_@RA@")02@`&"%"*(PA2``8((8#^4$H`!
+MD!``$T````"2%&$X@A0BE-04@`&4"J`_E2J@&((4(I+"%(`!@@A@/X,H8!"4
+M$H`!@A0BGL(4@`&""&`_@RA@")02@`&"%"*0PA2``8((8#^4$H`!D!``$Z($
+M:`!`````DA1B-((4(IS4%(`!E`J@/Y4JH!B"%"*:PA2``8((8#^#*&`0E!*`
+M`8(4(IC"%(`!@@A@/X,H8`B4$H`!H!0BEL(4@!"""&`_E!*``9`0`!-`````
+MDA1B.`,```N"$&/<P@2``8"@``&40#__E`J_P)0"H'^0$``3$P``)D````"2
+M$F$\L!`@`8''X`B!Z```G>._</@GH%3Z)Z!8^`>@7/0WO]:B$``8`P``$8(0
+M8H"J!@`!KA`@/[H0(#_"3F`%M`!``8(0/\'"-P``P@>@6/HP0`"0$``80```
+M`)(0`!F@$"```P``!)H0``&"$&-TPA8``8"D``$6@``NI!``"*@*(/^F$``4
+MK`T_^(($`!""`$`1FA-C<((`0`W"$&`&@*!@`"*``!V@!"`!@*!`%`*```:"
+M"&`'@A!@X("DP`$R@``6H`0@`8,L(`:2!$`!`P``!8(08]22`D`!0``"0M`6
+M0`"`I:#@$H``"8,MX!";*B`0@*!`#1J```.8$``(F!``%Q"```2N$``,$(``
+M":X0``B@!"`!&P``!((38W3"%$`!@*0``0:__]J"!``0PA9@`H((8-"`H&#`
+M,H``.;H0`!>"#+_XI!!@`:`0(``#```$FA```8(08W3"%$`!@*0``1:``"^F
+M#*#YI`R@_Z@,O_B"!``0@@!`$9H38W""`$`-PA!@!H"@8``B@``=H`0@`8"@
+M0!,"@``&@@A@!X(08."`I(`!,H``%J`$(`&#+"`&D@1``0,```6"$&/4D@)`
+M`4```@C0%D``@*4@X!*```F;*B`0@R]@$("@0`T:@``#F!``")@0`!T0@``$
+MNA``#!"```NZ$``(H`0@`1L```2"$V-TPA1``8"D``$FO__:@@0`$!"```/"
+M%F`"PA9@`H"(80`"@``$`P``!!"```."$&*.@A!BC]0,0`&5*J`8E3J@&)`0
+M`!A`````DA``&<(68`*`B&!``H``IZ`0``B`B&"``H``!@,```64$&.>E`1`
+M"A"```6"$&.<E!!C3)0$0`J"$&-*UA1``9`0`!B2$``90``"4I@'O^B#+>`0
+MFS!@$(,NH!"7,&`0@RP@&(,X8!B6(L`!@*+`#32```*6$``-PA9@`H"(8!`"
+M@``DF!``"Q4```2"$J)PVA1``0,```R`HT`!*(``"Q<```2#*N`0FSA@$((2
+MHG["%$`!@*!`#32```*"$``-F!```1<```2"$N)PVA1``0,```^"$&/_@*-`
+M`0B```Z#*R`0PA9@`H"(8(`"@``*@RL@$)LX8!""$N*`PA1``8"@0`TT@``"
+M@A``#9@0``&#*R`0@SA@$-@7O^Z`HP`!-(```I@0``'"%[_6FRA@$)L[8`^:
+M(P`-@RM@$(,X8!"".``!@SA@'Y@+0`&;+N`0@RL@$("@0`T6@``#EA``&Y80
+M``S"!Z!4@*!@``*``$.8$``+UC5@"-8U8`;6-6`$UC5@`M8U0`"2$``+VA>_
+M[(,K(!"#,&`0@*-``0B```/6%[_LEA``#-8U8`K4%[_JVA>_ZL(50`"`HT`!
+M"(```]850`"4$``+U#5@#-87O^C:%[_HPA5``("C0`$(@``#U!5``)80``K6
+M-6`.%0``!((2HG#:%$`!`P``#X(08_^`HT`!*(``%\(50`"#*R`0FSA@$,(6
+M8`*`B&"`(H``!`,```00@``#@A*BA((08H+"%$`!@*-``0:```J"$``,PA9@
+M`H"(8(`"@``$`P``!!"```."$&*$@A!B@L(40`'"-6`>VE<```,```N"$&/P
+M$(``"MHD0`&#*R`0@SA@$-@7O^B`HP`!!(```Y(0``N8$``!EA``#-@'H%C6
+M,P``TC<``,(68`*`B&`@$H``!8((8-"`H&#`$H``:\('H%0#```%E!!COI0$
+M0`J"$&.\UA1``9`0`!B2$``90``!K9@'O]B#+V`0F3!@$(,NH!";,&`0@RP@
+M&(,X8!B:(T`!@*-`##2```*:$``,@RM@$(,X8!#8%[_>@*,``32```*8$``!
+MPA>_UILH8!";.V`/FB,`#8,K8!"#.&`0@C@``8,X8!^8"T`!FR[@$(,K(!"`
+MH$`-)H```K80``S"!Z!4@*!@``*``"28$``;@RL@$(,X8!#:%[_>@*-``32`
+M``*:$``!VC5@$(,K(!"#.&`0VA>_W("C0`$T@``"FA```=HU8!*4$``-VC5@
+M%(,K(!"#.&`0VA>_VH"C0`$T@``"FA```=HU8!;:-6`8@RL@$(,X8!#8%[_8
+M@*,``32```*8$``!V#5@&I80``P0@``0V#5@'(,K(!";.&`0PA>_W("@0`TT
+M@``"@A``#900``&#*R`0FSA@$,(7O]B`H$`--(```H(0``V6$``!@RK@$(,X
+M8!#8!Z!8VE,``("@0`TF@``"UC,``(,JH!"#.&`0VE<``("@0`TT@``"U#<`
+M`,('H%2`H&```H``"`,```N"$&/(VE<``-HD0`&"!$`!PA!@`L(V(?Z!Q^`(
+MD>@@`9WCOXBF$``8`P``"X(08,#"!@`!D!``&)(0`!F?P$``E!``&H"B(``"
+M@``^L!`@`,)4X?R`H&`_!(```^04X?RD$"`_@RR@$(,X8!"`H&`^%(```YH0
+M(`&:$"``@RR@$("@``&"8#__@)-``0*```>J$"``V@3B`)H#0`T#````@A!@
+M`.H00`VB$"``@*1`&AJ``"2P$"`!J`>_]H,L8`.@!D`!E2U@$)<LH!#H(Z!<
+MD!``$Y(0`!"5.J`0ESK@$)@0(`!___X;F@>_]("B(``"@``4L!`@`-I7O_;"
+M3"`&@*-``1:```7:5[_TP@T@`<(L(`;:5[_TPDP@!X"C0`$6@``$H@1@`<(/
+MO_7"+"`'@*1`&@J__^.#+&`#L!`@`8''X`B!Z```G>._>`,```2"$&*:YA8`
+M`1,``!&2$F*`D@8`"9`'O]A`````E!`@()X0(`B@![_X`P``$:008H"H$&)X
+M@RO@$(,P8`^"`$`0VA!_X)HC0!/:,'_@F!`@`*(0(`"#*^`0D3!@#Y("`!#"
+M4G_@@*!@`":```+`,G_@@RL@$(,P8!"`H&`($H``!)H"`!`0@``;F!`@#]03
+M?^#64W_@@RL@$(,P8`^"`$`8PA!`$H"BP`$2@``2F`,@`8"BX``2@``%@RQ@
+M$(("H`$0@``*PC-_X(,P8!"`H&`R"(``!,(2?^`0@``#@@!@`8(`?__",G_@
+MF!`@`*($8`&#*R`0@S!@$("@8`\HO__:PE)_X(,KX!"#,&`/F@!`$,)3?^"`
+MH&`_!(``!8,KX!""$"`_PC-_X(,KX!"#,&`/@@!`&-H00!*:(T`9@C@`#8,X
+M8!^:"T`!@RO@$(,P8`^"`$`0V%!_X-8&`!28`P`,F@-`#<(2P`W",L`,@@/@
+M`9X0``&#*&`0@S!@$("@8`X(O_^N@RO@$)X0(`@#```1EA!B@)@'O_B#*^`0
+M@S!@#YH`0!B"`$`,PA!_X,(S0`N"`^`!GA```8,H8!"#,&`0@*!@#@B___:#
+M*^`0@<?@"('H``"=X[^`E!`@`)@'O_B#*J`#VA9``<(60`&`H&```H``!X("
+M@`J"`$`,E`*@`8"BH`<$O__WVC!_\*`0``J1+B`0D3(@$)4JH!"5,J`0D@>_
+MZ)8'O^9`````F`>_Y)00(`"`HH`0%H``%,(7O^:8$``!@RA@$(,P8!#:%[_H
+M@*!`#0*```V6![_X@RL@$)LP8!"4`J`!@**`$!:```>"`H`*@@!`"\(0?_"`
+MHT`!,K__^I0"H`':%[_FPA>_Y("C0`$2@``'@RJ@`X,N(!"#,&`0@*-``0*`
+M``>#*J`#@@9``<(`8`2`H&```H``!;`0(#^#*J`#@@9``?`08`*Q+B`0L38@
+M$(''X`B!Z```G>._F)(0`!R@$``8HA``"9$NX!"1,B`0DRI@$$````"3,F`0
+M@*(@``*``#"P$"``@RZ@$+4P8!"#+F`0DS!@$("F@`D"@``GFA``&X,L(!"#
+M,&`0@B!`"9``0`&0`@`!D2H@`Y`"``&1*B`"0````)(F@`F@$``(D2H@$("B
+M(``&@``8FA``&X,L(!"#.&`0@*!@9!2``!.:$``1H2P@$*$\(!"3+&`0DS)@
+M$$````"0$``0HA``")`0(&20(@`0DR[@$$````"3,F`0H@1`")`0`!%`````
+MDA`@9)H0``B#*V`0L3!@$(''X`B!Z```G>._@*(0`!NW+N`0@*;@``*``!"8
+M$"``E`>_^(,L8!"7,&`0@@,`#((`0`J;*R`"F@-`#)H#0`V:!H`-VA-@")@#
+M(`&`HP`+!K__]]HP?_#0%D``H2Q@$*$T(!"2![_HE!``$)8'O^9`````F`>_
+MY)X0(`"8$"``@*,`$!:``!:2$"``E`>_^-87O^;:%[_D@@,`#((`0`K"$'_P
+M@*+``2*```*2$``,@@,`#((`0`K"$'_P@*-``3*```28`R`!$(``!9X0``R`
+MHP`0!K__\H(#``S0%D``Z!>_YNH7O^2#*F`0@S!@$*4H8`*D!(`!I`2`$J8&
+M@!+6%.`&@RO@$(,P8!"A*&`"H`0``:`$`!"B!H`0V!1@!I(0`!1___]]E!``
+M%=`W(`;0%D``UA3@!-@48`22$``4?___=I00`!70-R`$T!9``-84X`+8%&`"
+MDA``%'___V^4$``5T#<@`M`60`#6%H`2V!:`$)(0`!1___]HE!``%=`W``"!
+MQ^`(@>@``)WCOYB:$``;GA``'+$N(!"Q-B`0@@8`&((`0!B#*&`#@@!`&+$H
+M8`*U+J`0M3:@#[@&0!KZ%D``@@=`'8(`0!V#*&`#@@!`'8,H8`*"`'_V@*8`
+M`0J```ST%D``^A<__H('0!V"`$`=@RA@`X(`0!V#*&`"@@!@"H"F``$(@``)
+M]!<__O0SP``0@``C]#-``,(S0`#"%F`"$(``'\(SP`"`ID`<&H``'(,N(!"W
+M.&`0^E9``(('0!V"`$`=@RA@`X(`0!V#*&`"@B!`&X(`8`F`H&`2"+__[/06
+M0`#Z%F`"@@=`'8(`0!V#*&`#@@!`'8,H8`*"`'_V@*8``2J__^7"%D``L@9@
+M`H"F0!PJO__J^E9``(''X`B!Z````P``"Y008!#"$B'4@@A@\((`?]"`H&`_
+M&(``$I8"``H9````F!,@`-H#(`3:(@`*@RM@`X(`0`V#*&`"F`,@"((`0`S"
+M(N`<@A`@`<(BX!B"$"`4PB+@#!"``!&"$"!5&0```)@3(`#:`R`$VB+``(,K
+M8`."`$`-@RA@`I@#(`B"`$`,PB+@'((0(`'"(N`8@A`@%,(BX`R"$"`C@</@
+M",(BX!"=X[^8PA8AU(((8/""`'_0@*!@/QB``!60$``8`P``"X(08+#"!@`!
+MG\!``)(0(`>2$"`!E!`@)'__]M:6$"``FA`@`)00(&N6$"``@*(@`1*``".8
+M$"!KE!`@4Y@0(%,0@``>@A`@-P,```N"$&"PP@8``9_`0`"2$"`'DA`@!I00
+M("5___;#EA`@`)H0(`"`HB`_$H``!)0"(`24$"`R@*(@/P*```.6$``-EA`@
+M0)@"X#*`HB`_$H```X(0``V"`V`4PB9@#("B(#\"@``#@@,_\8(#(`7")F`0
+M\@9@!("F0`V:0"``@**`&8)`(`"`DT`!`H``";`0(`"`ID`+FD`@`("C`!F"
+M0"``@)-``3*```*P$"`!@<?@"('H``"=X[^8(0``"YH4(_""%"/TU%8``<(&
+M``V4`H`!E2J@"0,``!^"$&(`E`J``0,``""4$H`!D!``&!,``"9`````DA)A
+M,*`4(\2"$"`!PB8`$(''X`B!Z```G>._F*00`!B@$``8`P``"X(08!"B!@`!
+MP@1@&("@8``"@`!.L!`@``,```N"$&/$P@2``8"@8`$2@`!&`P``"Y`0`!(3
+M```F0````)(283`#```@@(H``1*``#X#```+FS(@&8,R(!>""&`#@*!@`A*`
+M``W:)&`$PA2ATH"@8$$H@``'P@1@!`,```2"$&*:PA2``1"```."`$`-@@!@
+M!<(D8`3"%*'4@@A@\((`?]"`H&`_&(``##$```M```">D!``$MH$8`3"!&`4
+M@*-``2J```3`)&`$@B-``<(D8`0Q```+IA8CQ,`D`!.0$``2?___9I(0`!&`
+MHB``$H``%0,```N0$``20```%I(0`!&`HB```H``#P,```N0$``20```')(0
+M`!&`HB``!(``"((0(`+")``3FA8CV((0(`'")``-@A8CP,`D``$#```+@A!C
+MQ/`$``&!Q^`(@>@``-H"8`3"`F`,@*-``0B```:0$"``P@)@$("C0`$*@``#
+M`0```)`0(`&!P^`(`0```,(2(=2""&#P@@!_T!L```"`H&`_"(``!)038``#
+M````E!!@`-@"0`"#*R`#@@!`#(,H8`*"`H`!@@!@",(B8!S:`F`$P@)@$("C
+M0`$J@``GP@)@#("C(``"@`!1D!`__]H"8`3:(F`(P@)@$("C0`$*@``<D!``
+M`<("0`"`H&``(H``1Y`0(`'"`D``E@!__]8B0`"#*N`#@@!`"X,H8`*"`$`*
+MV`)@'-H`8!C8`R`0FB-`#)H#0`W8`F`(F",`#=@B8`B"`&`(@*,`"`J```7"
+M(F`<@*+@`#*__^W"`D``$(``+Y`0(`&`HT`!&(``+)`0(`#"`H``@@!__]H"
+M0`"`HT`!`H``)I`0/_[:`F`$VB)@",("8`R`HT`!&(``'Y`0``'"`H``@@!_
+M_]H"0`"`HT`!&H``&9@0``V6`R`!UB)``(,JX`."`$`+@RA@`H(`0`K8`F`<
+MV@!@&-@#(!":(T`,F@-`#=@"8`B8(P`-V")@"((`8`B`HP`(&(``!\(B8!S"
+M`H``@@!__X"BP`$*O__KF!``"Y`0(`*!P^`(`0```)WCOY@;```+@A-@$*`&
+M``'`)"`4HA-@L,(&`!&0$``8G\!``)(0(`>2$"`!E!`@)'__]:V6$"``@*(@
+M`1*``!F0$``8P@0@'.100`#"!@`1G\!``)(0(`>2$"`$E!`@('__]:&6$"``
+M@*2@`2*```W0)"`4*H``"\`D(!2`I*`"`H``!8"DH`,"@``%@@(`"#"```2"
+M`@`(@@!_^\(D(!2!Q^`(@>@``)WCOYB0$``90````)(0`!J4!O__E3*@`[8&
+M__^`IJ``!(``'[8.X`>2$"`!N2\@`YX0(`B"!L`:@*!@"#2```*"$"`(FRI`
+M`9H#?_^#*D`;@@!__YH;0`&;*T`<ERJ@`M@&``N8*P`-@RH`&X,H0!R""$`-
+M@A!`#,(F``N"!H`;M`!_^((CP!N1,@`!MA`@`("FH``4O__HE`*@`8''X`B!
+MZ```G>._F-H68`(#```0D!``&("+0`$2@``.DA`B`,)68`*0$``8@*!@``:`
+M``F2$"0`PA9@`H((8!"`H``!DD`__Y(*8/Z2`F`"D!``&$````"D$"``P@(`
+M`("D@`$6@``;HA``"`,``"&F$&,`H`2`$J`$`!*A+"`"H`0`$=8,("N0$``8
+MDA``$900(`Y`````F!`@`)00``B5*J`0E3*@$-(,("B3*F`"D@)`$T````"0
+M$``8I`2@`<($0`"`I(`!!K__[*`$@!+"%F`"@(A@$!*``#F0$``80````)(0
+M(`BD$"``P@(``("D@`$6@``RHA``"`,``"&F$&,`@@2`$H(`0!*#*&`"H`!`
+M$<(,("B#*&`"L@!`$\(,("6`H&``,H``(:0$H`'6#"`KD!``&)(0`!&4$"`.
+M0````)@0(`"4$``(E2J@$)4RH!"0$``80````)(0`!G"#"`I@*!@`"*``!&D
+M!*`!@RA@`K(&0`'6#"`KD!``&)(0`!&4$"`.0````)@0(`&4$``(E2J@$)4R
+MH!"0$``80````)(0`!FD!*`!P@1``("D@`$&O__5@@2`$H''X`B!Z```G>._
+MF)`0`!@3```@0````)(28!P#```/@A!C@)`*``':%F`"`P``$("+0`$B@``)
+MHA`@TJ(0(00;!^```P`&P)00(!.R$"VL$(``!Z00(!0;!^```P`-@)00(`FR
+M$"U(I!`@"I02@`B4$H`!E!*`#9`0`!@3```@0````)(28!R0$``8(0``!)(4
+M('!`````E!``$9`0`!B2%""P0````)00`!F0$``80````)(4(/`5``/_E"H`
+M"H,LH`J4$H`!D!``&$````"2%"#P`0```(''X`B!Z```G>._F`,```N"$&!$
+MP@8``1,@``"2*$`)0````)`0`!BD$``(D!``&$````"2$"`PH`HC\("F8``"
+M@``'H30@!((0("6"($`0@S!@`1"```2B!``!@*0@`J)$/_^`I$`0`H``")0*
+M/`^#+&`$@@AC\)02@`&0$``80````)(0(#"0$``80````)(0`!*"'$`0@*``
+M`;!`(`"!Q^`(@>@``)WCOYB4$``:PA8AZ("F0`$6@``+D!`@`),N8`22(D`9
+MDRI@`I(&``D#```+@A!@X)("0`%`````D!``&(''X`B1Z``(G>._F)(0`!K"
+M%B'H@*9``1:```N0$"``E2Y@!)0B@!F5*J`"E`8`"@,```N"$&#@E`*``4``
+M``"0$``8@<?@")'H``B=X[^8D!``&)H&(>"`IF`"`H``$*00(`N`IF`"&(``
+M!X"F8`.`IF`!(H``(\(38`@0@`!AFA`__P*```N`IF`$(H``#^(38`@0@`!;
+MFA`__^(38`BB!'__`P`!0!"```:"$&#`XA-@"*($?_X#``%`@A!AP!"``"RD
+M%(`!H@1__8,L8`2"($`1@RA@`H(`0!@;```+FA-@X((`0`W"`&`$@*!@`!*`
+M`$2:$#__$(``'X,L8`28$``!@RA@$("@8``"@``3HA`@``,```N6$&#@@RL@
+M$)DP8!"#+&`$@B!`$8,H8`*"`$`(@@!`"\(`8`2`H&``(H``!\(38`BB!&`!
+M@*1`#`:___:#+&`$PA-@"("D0`$"@``HFA`__Q"```.#+&`$@RQ@!((@0!&#
+M*&`"H`(``0,```N"$&#@H`0``<($(`2`H&``$H``&YH0/_^0$``00````)(0
+M(#R`IJ``$H``#O(D(`3D)"`,@A`@`L(D(!2"$#__PB0@&((0(__")"`<@A`@
+M"L(T("#"-"`B$(``",`D(#3"!J`PPB0@-)`0`!B2$``10````)00`!J:$``1
+M@<?@")'H``V=X[^8(0``"X(4(,S4!@`!E`JC_X(4(-3"!@`!@RA@$",`_\""
+M"$`1E!*``9`0`!A`````DA`@I((4(-#4!@`!E`JC_X(4(-C"!@`!@RA@$(((
+M0!&4$H`!D!``&$````"2$""HD!``&$````"2$""LE`H\`*`4(-S"!@`0@@AC
+M_Y02@`&0$``80````)(0(*P!````@<?@"('H``"=X[^8D!``&,(6(>B`ID`!
+M&H``)[`0(`"#+F`$@B!`&8,H8`*2`@`!`P``"X(08."2`D`!P@)@!("@8``"
+M@``<&0``"\`B8`26$R#,FA`@`9LK0!F:.``-P@(`"X(+0`'"(@`+EA,@T,("
+M``N""T`!PB(`"Y83(-3"`@`+@@M``<(B``N6$R#8P@(`"X(+0`'"(@`+F!,@
+MW,("``R:"T`!?___L=HB``RP$"`!@<?@"('H``"=X[^8J!``&*00`!@#```$
+M@A!B--H&``'"%B'H@*9``1J``4>P$"``@RY@!((@0!F#*&`"H@4``0,```N"
+M$&#@H@1``<($8`2`H&```H`!/+`0(`'"!&`8@*!__Q*``!6G+F`"@*-@`"*`
+M``B:$"`/PA-@`H((8*"`H&"@`H```YH0(!^:$"`/@A`@`8"@0`T:@``(IRY@
+M`H(`0`&"$&`!@*!`#2J___Z"`$`!IRY@`B$```22%"!`D@3`"90(8__"!&`<
+M@RA@"AL``_^""$`-E!*``<($8!2#*&`4&P/\`(((0`V4$H`!0````)`0`!2@
+M%""`H`3`$-048"*5*J`$E`J@\,(48""""&`/E!*``0,``@B4$H`!D!``%$``
+M``"2$``0L!`H`,($8"2`H&```H``#ZH0(0"2!.C`%3_``)0H0`K"!&`H@RA@
+M&)02@`%`````D!``%,($8"B`H&```H```[`0*`&P$"D!P@1@,("@8``"@``*
+MDRY@`I(":0`5/\``E"A`"@,`0`"4$H`!0````)`0`!23+F`"`P``!((08,"2
+M`D`!V@1@+`,__`""*T`!@*``#91`(`"5*J`4E!*``4````"0$``4P@1@,("@
+M8``"@``&P@1@#("(8"`R@``#L!8B`,($8`R`B&!``H``!8".(`^P#C_PL!8@
+M`H".(`\B@``,V@1@#,($8`R`B&$`(H```[`./[^P%B!`@(A@@"*```.P#C_?
+ML!8@(-H$8`P#``!`@(M``0*```3:!&`,`P`(`*H50`$#`"``@(M``3*```*J
+M%6(`P@1@#!L``0"`B$`-,H``"*H50`W"!&`,&P``@("(0`TB@``$V@1@#*H5
+M0`W:!&`,`P`"`("+0`$B@``%P@1@#`,``!"J%4`!P@1@#!L`!`"`B$`-,H``
+M`JH50`W"!&`$@*!@`@*```:`H&`#(H``!\($8#`0@``>P@1@.+`6(*(0@``9
+M`P`)0("@8``2@``5L!8@8@,```#:`&```P```,(`8`":(T`!`P``"X(08^34
+M!(`!E"*`#0,```#"`&``E"*``94JH`J3+F`"D@)I``,`0`"4$H`!0````)`0
+M`!0#``$`JA5``<($8#B`B&`!`H``!*$N8`(#``D`JA5``:8$*<"0$``4DA``
+M$T````"4$``8,0``!((6(0"@!``!D!``%)(0`!!`````E!``%<($8#2`H&``
+M(H``%\($8`R4!D`9E`*@4)`0`!1`````DA`K`)`0`!22$"L$0````-0$8#20
+M$``4DA`K"$````"4$"`)D!``%$````"2$``3E!(`&)`0`!1`````DA``$\($
+M8`R`B&`!`H``"`,```N"$&#,FA`@`9LK0!G8!(`!$(``!YH30`R"$&#,FA`@
+M`9LK0!G8!(`!FBL`#=HD@`'"!&`,@(A@`0*```@#```+@A!@T)H0(`&;*T`9
+MV`2``1"```>:$T`,@A!@T)H0(`&;*T`9V`2``9HK``W:)(`!P@1@#("(8`("
+M@``(`P``"X(08-2:$"`!FRM`&=@$@`$0@``'FA-`#((08-2:$"`!FRM`&=@$
+M@`&:*P`-VB2``<($8`R`B&`$`H``"`,```N"$&#8FA`@`9LK0!G8!(`!$(``
+M!YH30`R"$&#8FA`@`9LK0!G8!(`!FBL`#=HD@`'"!&`,@(A@"`*```@#```+
+M@A!@W)H0(`&;*T`9V`2``1"```>:$T`,@A!@W)H0(`&;*T`9V`2``9HK``W:
+M)(`!D!``%'___F"2$``1L!`@`8''X`B!Z```G>._F)`0`!B3+F`"0````)("
+M:`"!Q^`(D>@`")WCOYB0$``8E!``&I,N8`)`````D@)H`(''X`B1Z"`!G>._
+MF)`0`!B4$"`!E2J`&4````"2$"A`@<?@")'H(`&=X[^8H!``&),N8`*2`FH`
+M0````)`0`!BPBB`#$H``"9`0`!!`````DA`H0((0(`&#*$`9@(H``3*```*P
+M$"`!@<?@"('H``"=X[^8E!`@`94J@!F0$``80````)(0*("F$"/HD!``&$``
+M``"2$``9@*(@``*```>0$``80````)`0(&2FA/__$K__^)`0`!A`````DA``
+M&8"B(``B@`!>D!``&-@&(<R"&R`'@*```9I@/_^"&R`+@*```8)@/_^`DT`!
+M$H``#J00(`"`HR`*`H``"X"C(`D"@``)@*,@"A*``$V0$``8PA8AT("@8`,X
+M@`!*DA`H@*00(``C```@`P``/Z@08_^0$``80````)(48$R@$``(D!``&)(4
+M80`5``*`0````)02H&2A-"`*E`P`%`,``$"4$H`!D!``&$````"2%&#\D!``
+M&$````"2%&!,D3(@"H"B`!`"@``&D!``&*0$H`&`I*`!"+__Z`$````A```@
+M0````)(4($@#`!``E!(``9`0`!A`````DA0@2$````"0$"#(D!``&$````"2
+M%"#\%0``0)0J``J0$``80````)(4(/P0@``&H!`@9`*```N0$``80````)`0
+M(`J0$``80````)(0`!F`HB``$K__^*"$/_^0$``8(0``($````"2%"!(%0`0
+M`)0J``J0$``80````)(4($B0$``8DA`H@$````"4$"``@*``$[!`(`"!Q^`(
+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
+M@S-@",(J8`[:*F`/P"I@$,`J8!'`*F`2P"I@$\`J8!3`*F`5P"I@%L`J8!?`
+M*F`<P"I@'<`J8![`*F`?P"I@&,`J8!G`*F`:P"I@&X'#X`B0$"`!P@I@'X"(
+M8`$"@`"@D!`@#]H*8!R;*V`8P@I@'8,H8!""$$`-V@I@'ILK8`B:$T`!P@I@
+M'X(00`T;```'FA-C_H((0`V#,&`!PC*``,(*8!C:"F`9@RA@"((00`W",J`"
+MP"J@!,(*8!B#*&`8V@I@&9LK8!":$T`!P@I@&H,H8`B"$$`-V@I@&YH30`&`
+MBV`!,H``%L(*8!V`BV`"(H``!<(*8!N"$"`!PBJ@!,(*8!N`B&`((H``!L(*
+M8!O""J`$@A!@`L(JH`3""F`;@(A@!"*```;""F`=P@J@!((08`3"*J`$P@I@
+M'8,P8`6""&`#@*!@`0*``!+"*J`+@*!@`12```>`H&`"@*!@`"*```K""F`7
+M$(``)L(*8!P"@``5@*!@`R*``!;""F`4$(``(,(*8!P0@``<@@A@']H*8!2;
+M*V`8P@I@%8,H8!""$$`-V@I@%ILK8`B:$T`!P@I@%X(00`V""&/@$(``#H,P
+M8`7""F`6$(``"H,P8`*#*&`8V@I@%9LK8!":$T`!P@I@%H,H8`B"$$`-@S!@
+M#X((8!^"$'^`PBJ@!<(*8!R#*&`8V@I@'9LK8!":$T`!P@I@'H,H8`B"$$`-
+M@S!@#<(JH`;""F`;@S!@!,(JH`?""F`:@@A@#\(JH`C""J`+@*!@`B*``!':
+M"F`1%(``!X"@8`.`H&`!(H``$=H*8!$0@``4P@I@&C*``!+""F`:V@I@$)H+
+M8`_""J`(@@!`#<(JH`C:"F`1FS-@!,(*H`B"`$`-PBJ@"-H*8!&:"V`/P@J@
+M"((`0`W"*J`(P@I@&H,P8`3"*J`)P@I@'(,H8!@;`$``@@A`#8"@``&"$"`"
+M@D!__\(JH`J0$"``@</@"`$````9```1F!,BH,("0`#:`@`,@@A`#<(B0`#:
+M`@`,@BM``8'#X`C"(@`,`````````````````````````````````````)WC
+MOY@3```+DA)@A)(&``E`````D!``&)`0`!@A```@DA0A)$````"4$"``D!``
+M&)(4(2A`````E!`@`)`0`!B2$"!`0````)00(`"0$``8DA0A,$`````5``"`
+MD!``&)(4(3A`````%0"```$```"!Q^`(@>@``)WCOYB0$``8DA`@0$````"4
+M$"`&$P``"Y(28(22!@`)0````)`0`!B0$``8(0``()(4(21`````E!`@`)`0
+M`!B2%"$H0````)00(``!````@<?@"('H``"=X[^8M!``&+@0(``;```,GA-@
+M*(('`!R"`$`<@RA@`H(@0!R#*&`#@@!`&OH00`_"%D``@*=``0*``!FP$``<
+M@@<`'((`0!R#*&`"@B!`'(,H8`.Z`$`:MA-@*,(70!N`H&``,H``"K@'(`'"
+M%D``PC=`&[H'0!O"%F`"PC=@`L(.8`00@``&PB]@!("G(#\(O__B@@<`'+`0
+M(`"!Q^`(@>@```,```R"$&`D@</@"-`"``&=X[^8(0``"Y(4((22!@`)0```
+M`)`0`!B@%"!(@<?@")'N`!"=X[^8HA``&!$```R:$B`<P@8AX(,P8`>""&`!
+MPB8`#9`2("B0!@`($P``!4````"2$F(`EA`@``,```R2$&`PH!!@0)X0(,B0
+M$&!()P`O_Z04XSC"!B',@*!@!AB```F"`L`+@@!`"X,H8`*"($`+@RA@`X(`
+M0!$0@``(FA`@!X(`0`N#*&`"@B!`"X,H8`."`$`1FA`@`MHH0`F"`L`+@@!`
+M"X,H8`*"($`+@RA@`Y@`0!$5```,@A*@.((#``&:$"'TVB!@!-XC`!""`P`0
+MWB!@!((0(&3"(P`(FA*@4((0("C"(P`-F@,`"((0(`?"(V`$@@,`"<`H8`3`
+M*&`%V@L`"=HH8`+`*&`#@A*@',($0`&`H&```H``")8"X`&"$J!H@@,``9H4
+MX@S:(&`$@A*@<.0C``&`HN`_*+__Q\(&(<PE```,@A2@',($0`&`H&```H``
+M$!D```R"%*!LD!``&"$``""2%"$L0````-0$0`&"%*!PD!``&)(4(31`````
+MU`1``4````"0$``8&0``#)H3("""$"!D@*9@``*```;")$`-FA,@&,($0`T0
+M@``&@A!@`1L```R:$V`8P@1`#8((?_[")$`-@<?@"('H``"=X[^8`P``#((0
+M8!S"!@`!@*!@``*```T!````0````)`0`!B0$``8(0``()(4(2Q`````E!`@
+M`)`0`!B2%"$T0````)00(``!````@<?@"('H``"=X[]HIA``&`,```R"$&`D
+MZ`8``8"F8`88@`&=@A`@`(,N8`(;````FA-@`,(#0`&!P$```0```+(0`!J`
+MIJ`$&(`!DX(0(`"0$``8(P``)D````"2%&!0%0/\`)0J``JA+J`"H`0`&"4`
+M`!&"%*(HP@0``8,H8!0;`_P`@@A`#902@`&0$``80````)(48%"0$``80```
+M`)(48%P#/__@@A!@?Y0*``&"%*)0V@0``9LK8`<#```?@A!C@)H+0`&4$H`-
+MD!``&$````"2%&!<D!``&$````"2%&!<%0`/X)0J``J"%*(X@@0``<(`8`2#
+M*&`/&P`/X(((0`V4$H`!D!``&$````"2%&!<D!``&$````"2%&!8%0#_`)0J
+M``JD%*)@H`0`$L($(`2#*&`2&P#_`(((0`V4$H`!D!``&$````"2%&!8P@T@
+M"1L```N`IH`!&(``")H38$C"#2`)@*:``3J``4GR+2`)&P``"YH38$S"!,`-
+M@@!@`<(DP`T0@`%"\BT@"9H0('_:)[_P@A`@,L(GO_3:)[_H@A`@*,(GO^S:
+M)[_@@A`@3<(GO^3:)[_8@A`@0,(GO]R"$"`?PB>_T((0(!#")[_4@A`@/\(G
+MO\B"$"`PPB>_S("@`!JD0"``D!``&",``"9`````DA1@;!4`!_"4*@`*H2R@
+M`H('O_B@!``!P@0_^(,H8`X;``?P@@A`#902@`&0$``80````)(48&R0$``8
+M0````)(48&P5`_@`E"H`"L($/_"#*&`5&P/X`(((0`V4$H`!D!``&$````"2
+M%&!LD!``&$````"2%&!H%0`_@)0J``K"!#_H@RA@$1L`/X"""$`-E!*``9`0
+M`!A`````DA1@:)`0`!A`````DA1@:!4?P`"4*@`*P@0_X(,H8!@;'\``@@A`
+M#902@`&0$``80````)(48&B0$``80````)(48&B4"C_@P@0_V(((8!^4$H`!
+MD!``&$````"2%&!HD!``&$````"2%&!L`S__\((08/^4"@`!V@0_T)LK8`@#
+M```/@A!C`)H+0`&4$H`-D!``&$````"2%&!L@*2@``*```B0$``80````)(4
+M8&R4$B`!D!``&!"```B2%&!L(0``)D````"2%"!LE`H__I`0`!B2%"!L0```
+M``$```"`H``2FF`__\(-(`R`HT`!`H``PQL```N`I*``$H``!)H38%@;```+
+MFA-@7,($P`V"`&`!PB3`#8"@`!*"8#__$(``M\(M(`R"$"`(PB>_R((0(`;"
+M)[_,@*``&J)`(`"0$``8(0``*$````"2%"((E`H_P(,L8`*"!X`!P@!_R(((
+M8#^4$H`!D!``&$````"2%"((P@T@#8"D0`$"@`"@&P``"X"D8``2@``$FA-@
+M8!L```N:$V!DP@3`#8(`8`'"),`-$(``EN(M(`W`)[_(@A`@!,(GO\R"$"`(
+MPB>_T*(0`!J`IJ`"&(``CH(0(`"0$``8(0``)D````"2%"!8%0``_)0J``J#
+M+J`"@@>``<(`?\B#*&`,&P``_(((0`V4$H`!D!``&$````"2%"!8P@T@"QL`
+M``N`IH`!&(``")H38&C"#2`+@*:``3J``'3B+2`+&P``"YH38&S"!,`-@@!@
+M`<(DP`T0@`!MXBT@"X(0(`+")[_(@A`@!,(GO\R"$"`&PB>_T((0(`C")[_4
+M@A`@"L(GO]B"$"`,PB>_W((0(`[")[_@@A`@$,(GO^2B$``:@*:@!QB``%J"
+M$"``D!``&"$``"9`````DA0A))0*/P&#+J`"@@>``<(`?\B"`$`!@@A@_I02
+M@`&0$``80````)(4(23"#2`*&P``"X"F@`$8@``(FA-@4,(-(`J`IH`!.H``
+M0N(M(`H;```+FA-@5,($P`V"`&`!PB3`#1"``#OB+2`*@*:@`!*``!`C```,
+M`P``#((08!C:!@`!F@M__=HF``%`````D!``&$````"0$``8D@H^_T````"0
+M$``8$(``*X(0(`&"%&`8P@8``8"(8`(2@``F@A`@`8(48!S"!@`!@*!@``*`
+M`!8!````0````)`0`!B2"C[_0````)`0`!B"%&!LD!``&"$``""2%"$L0```
+M`-0&``&"%&!PD!``&)(4(31`````U`8``4````"0$``8$(``"!L```Q`````
+MD!``&)(2(0!`````D!``&!L```R:$V`8P@3`#8(08`+"),`-@A`@`8''X`B1
+MZ``!G>._F`,```R:$&`DX@8`#<`D8!""$&`<P@8``8"@8``"@``HI!``&-H$
+M8!0#`#``@*-``0B```2"($`-$(```\`D8$3")&!$V@1@'`,`,`"`HT`!!(``
+M!((@0`T0@``#P"1@2,(D8$B0$``8(0``()(4(2Q`````U`1@1)`0`!B2%"$T
+M0````-0$8$B0$``8DA0A,$`````5``"`D!``&)(4(3A`````%0"``!,```N2
+M$F"$D@2`"4````"0$``8P"1@/,`D8$"!Q^`(@>@``)WCOY@#```$@A!B--(&
+M``$;```,@A-@&,(&``&""&`#@*!@`Q*``%J"$V`DX`8``=0,(`F`HJ`#.(``
+M!M0,(`J4`J`!D!``&!"``$^2$"`!P@P@"("B@`$:@``&`P``"Y0"H`&0$``8
+M$(``1Y(0(`6"$&"8P@8``9H(8'^8`&!_@*-@/QB```:9,R`'`P``"X(08)C"
+M!@`!F3!@!\($("B`HP`!)(``$L($("3"#"`,@*!@`#*```G"#"`+D!``&)(0
+M(`)`````E!`@`)`0`!@0@``LDA`@!8"@8`$8@``LE`!@`1"``!*0$``8@*,`
+M`02``!$!````P@P@#("@8``B@``'P@P@"Y`0`!B2$"`"0````)00(`'"#"`+
+M@*!@`1B``!N4`&`!D!``&!"``!:2$"`$0````)`0`!B0`C_^@*(@`1B``!(!
+M````P@P@#("@8``R@``'P@P@"Y`0`!B2$"`"0````)00(`#"#"`+@*!@``*`
+M``:0$``8DA`@!)00(`!``````0````$```"!Q^`(@>@``)WCOY@#```$@A!B
+M--(&``$;```,@A-@&,(&``&""&`#@*!@`Q*``"Z"$V`DX`8``=0,(`F`HJ`#
+M&(``!@,```N4`J`!D!``&!"``".2$"`!@A!@F,(&``&:"&!_F`!@?X"C8#\8
+M@``&F3,@!P,```N"$&"8P@8``9DP8`?"!"`D@*,``02```B0$``8P@P@"Y0`
+M8`&`H&`!"(``#Y(0(`0P@``/0````)`0`!B0`C_^@*(@`1B```H!````P@P@
+M"X"@8``"@``&D!``&)(0(`24$"``0`````$````!````@<?@"('H``"=X[^8
+MHA``&`,```2"$&(TT@8``7___,*0$``8@@(`"((`0`B#*&`"@B!`"(,H8`.@
+M!@`!&P``#((38"B@!``!@A-@).`F``'"!B'<@*!@`1*```6:$V`8P@8`#1"`
+M``2"$&`"P@8`#8((?_W")@`-P@8AW("@8`$"@``B`P``"X(08'C:!$`!F@-@
+M`=HD0`&0$``8DA`@`4````"4$"``D!``&)(0(`5`````E!`@`)`0`!B2$"`$
+M0````)00(`"0$``8DA`@`D````"4$"``D!``&)(0(`-`````E!`@`$````"0
+M$``8DA(A`$````"0$``8?__^[Y`0`!@P@`!1`P``#((08!C"!@`!@@A@`X"@
+M8`,2@`!+@*9@``*``!>0$``8U`P@"4````"2$"`!U`P@"I`0`!A`````DA`@
+M!<(,(`R`H``!E&`__Y`0`!A`````DA`@`M0,(`V0$``80````)(0(`/4#"`+
+MD!``&!"``!22$"`$DA`@`4````"4$"`$U`P@")`0`!A`````DA`@!9`0`!B2
+M$"`"0````)00(`&0$``8DA`@`T````"4$"`!D!``&)(0(`24$"`"0`````$`
+M```#```,@A!@',($0`&`H&```H``$P$```!`````D!``&)(*/O]`````D!``
+M&'___J^0$``8D!``&"$``""2%"$P0````!4``("0$``8DA0A.$`````5`(``
+M,(``"'___J.0$``80````)`0`!B2$B$`0````)`0`!@!````@<?@"('H``"=
+MX[^8I!``&)`0`!@C```@DA1A)$````"4$"``D!``&)(482A`````E!`@`"$`
+M``N2%""$D@8`"4````"0$``8H!0@F,(&0`#")@`0H`8`$,(&8`3")"`$P@9@
+M",(D(`B0$``80````)(482RR$``(D!``&$````"2%&$T&P`P`((.0`V`H$`-
+M`H``!8(*``V`H$`-$H``*`$````#```,@A!@).`$@`'8!"!$F"9`#!<```N4
+M$N!PP@0@/((C``':!(`*@@!`#<(D@`K8)"`\V`0@2)@B``R6$N!TP@0@0((C
+M``':!(`+@@!`#<(D@`O8)"!`V@0@/,($(!2`HT`!*(``!=H$($!___Z+D!``
+M&-H$($#"!"`<@*-``0B```0!````?__^ZI`0`!A___Y.D!``&`$```"!Q^`(
+M@>@``)WCOY@#```,@A!@)-@&``'"#F`%@*!@$1*``!*`H&`9P@,@/((`8`'"
+M(R`\&P``"YH38'#"!@`-@@!@`<(F``W:`R`\P@,@%("C0`$(@``7`0```'__
+M_FB0$``8,(``$1*``!(;```+P@,@0((`8`'"(R!`FA-@=,(&``V"`&`!PB8`
+M#=H#($#"`R`<@*-``0B```8!````?__^O9`0`!A___XAD!``&`$```"!Q^`(
+M@>@``)WCOYB0$``8`P``#((08"36!@`!`P``"X(08)C"!@`!F@A@?Y@`8'^`
+MHV`_&(``!IDS(`<#```+@A!@F,(&``&9,&`'P@+@*("C``$T@``2U`K@"L("
+MX"2`HP`!)(``"-0*X`O""N`,DA`@`H"@8``2@``3E!`@`=0*X`N`HJ``(H``
+M!=0*X`J4`K__$(``#)(0(`2`HJ``(H``!=0*X`F4`K__$(``!I(0(`6`HJ``
+M`H``!90"O_^2$"`!0`````$````!````@<?@"('H``"=X[^8D!``&"$``"!`
+M````DA0@[*80``B0$``80````)(4(/"D$``(D!``&$````"2%"#X`P``#((0
+M8"3@!@`!P@0@.("@8``"@``%HA``"("@0`@H@``)V`0@.)`0(``;```+FA-@
+M?,(&``V"`&`!$(``#,(F``V8(@`,V@0@-)HD@`W"!"`P@B3``9`C``V0(@`!
+M$P``*D````"2$F/@XB0@..8D(##D)"`T@<?@")'H``B=X[^8I!``&`,```R"
+M$&`DX@8``2<```N:%."8P@9``,(F``V:!@`-P@9@!,(C8`3"!F`(@*1@``*`
+M`)3"(V`(?___PY`0`!B`HB``%H``"*`0``B:%."`P@8`#8(`8`'")@`-?__]
+MHI`0`!C"!&`0@@0``<(D8!`#```,@A!@',($@`&`H&```H``0AL```P3```+
+MDA)@A)($@`E`````D!``&)`0`!@A```@0````)(4(2RR$``(D!``&$````"2
+M%"$TP@1@1("F0`$*@``&IA``",($8$B`H@`!.H``&M@$8$34!&!$@*9`"CJ`
+M``O4!&!(D!``&"$``"!`````DA0A+)`0`!B2%"$P0````!4``(#4!&!(@*3`
+M"AJ``%N0$``8(0``($````"2%"$TD!``&)(4(3A`````%0"``#"``%*8)D`,
+M%P``"Y02X'#"!&`\@B,``=H$@`J"`$`-PB2`"M@D8#S8!&!(F"(`#)82X'3"
+M!&!`@B,``=H$@`N"`$`-PB2`"]@D8$`;```,@A-@&,(&``&""&`#@*!@`Q*`
+M`#J"$V`@V@2``8,K8`*"`$`-X`1@$("D``$H@``6T`1@$)`0`!!`````T@1@
+M&$````"2$"/HP@1@/("@0`@8@``HD!``$$````#2!&`@0````)(0(^C"!&!`
+M@*!`"!B``"`!````?___'9`0`!@P@``<`P``#((08"#"!(`!@*(``0B``!D!
+M````0````-($8!1`````DA`CZ,($8#R`H$`(*(``!=`$8!!___U<D!``&#"`
+M``M`````T@1@'$````"2$"/HP@1@0("@0`@(@``&`0```'___;>0$``8?__]
+M&Y`0`!@!````@<?@"('H```;```$FA-B-,("``W"$$``PC)``-@"``W""R`$
+M@A!@",(K(`3""F`$@A!@",(J8`3"`@`-PA!@`L(R8`+"`@`-P@A@!,(J8`3"
+M`@`-P@A@!<(J8`6!P^`(D!`@````````````````````````````````````
+M````````G>._F*`0(``#````HA!@`(($`!""`$`0FRA@`]($0`V"`$`!@@!`
+M&8,H8`+4!$`!0````)`0`!BV!N`!@([@/S*```6@!"`!0````)`0(`&@!"`!
+M@*0@#0B__^^"!``0H!`@``,```"R$&``@RP@`](&0`&"`$`9U`!@!$````"0
+M$``8M@;@`8".X#\R@``%H`0@`4````"0$"`!H`0@`8"D($<(O__S@RP@`[(0
+M(``#````H!!@`((&0!F"`$`9FRA@`M($``V"`$`:@RA@`M0$``%`````D!``
+M&+8&X`&`CN`_,H``!;(&8`%`````D!`@`;(&8`&`IF`_"+__\((&0!F!Q^`(
+M@>@``)WCOYC2%D``U!9@`D````"0$``8VA9@`J`0``B`BV"``H``)*80(`"#
+M*B`0I3A@$*`$@!*@!``2H2P@`B,```"B%&``I`0`$=`$H`1`````DA`@"*8*
+M(/^G+.`%P@0`$8,H8`2F%,`!X!2@")`0`!@C```H0````)(48@3"%D``@*!I
+MM#*```:4"C_OE!(@$)`0`!@0@``%DA1B!)`0`!@3```HDA)B!$`````!````
+MFRP@$(,[8!"`H&"0%(``!I$L(!"#,V`0@(A@`2*```F1.B`0D3H@$)`"/^A`
+M````DA`@"*(*(/\0@``*@A`@`9`"/^B#,B`?D`(``9$Z(`%`````DA`@"*(*
+M(/^"$"``HRQ@`H(`0`&B%$`!HA1D`90,X/^5*J`(@@Q@_Y02@`&0$``8(0``
+M)D````"2%""<HS1@"!4``#^4$J,`E`S`"H(,8/^4$H`!D!``&$````"2%"#0
+M`P``!((08C3R)@`!@<?@")'H(`$#```+@A!C[("B8`<8@``2T`(``8,J8`(;
+M````FA-@`,(#0`&!P$```0```!"```N0`B!$$(``"9`"($@0@``'D`(@3!"`
+M``60`B!0$(```Y`"()20$"``@</@"`$```"=X[]0J!``&,(68`*""&'P@*!@
+MP`*``%ZD$"``@*!@P!2```>`H&%`@*!@H`*``$8;```$$(`!F[`0(``"@``$
+M@*!A4#*``9>P$"``PA9``((`<%^#*&`0@S!@$("@9.HX@``'PA9```,```2:
+M$&-4[A4`#1"``":"$&-6&S__^IH38W2"`$`-@RA@$(,P8!"`H&#O.(``!\(6
+M0``#```$FA!C6.X5``T0@``9@A!C6AL___J:$V*$@@!`#8,H8!"#,&`0@*!@
+MX#B```?:%D```P``!)H08USN%0`-$(``#((08UZL$"```P``!8(08ER`HT`!
+M"(``!ZX0(``#```$FA!C8.X5``V"$&-B[!4``:(0(`"2$"``&P``!((38MCZ
+M%0`!@A-BWO@5``'"%0`!@*```8)@/_^J$``!$(``)IH38RR"$V-D[A8``8(3
+M8V;L%@`!@A-C;-(6``&"$V-PXA8``8(38MKZ%@`!@A-BX/@6``'"%@`!@*``
+M`8)@/_^J$``!$(``%)H38RX;```$@A-C:.X6``&"$V-J[!8``8(38V[2%@`!
+M@A-C<N(6``&"$V+<^A8``8(38N+X%@`!PA8``8"@``&"8#__JA```9H38S#V
+M%0`-H!`@`)0'O_@#````EA!@`(,NH!"9,&`0@RP@`H(`0`J:!``0F@-`$)H#
+M0`V:`T`,FRM@`MH"P`V@!"`!@*0@$`B___;:('^XPA9@`H"(8(`"@``/H!`@
+M`*`'O["0$``0E!`@`Y80('=`````F!`@`)`0`!"2$``1E!`@`Y80('I`````
+MF!`@`*`0(``#````HA!@`(($`!""`$`0@RA@`]($0`&#+"`"@@>``=0`?[!`
+M````D!``&*0$H`&`C*`_,H``!:`$(`%`````D!`@`:`$(`&`I"`0"+__\(($
+M`!"@$"```P```*(08`"#+"`#T@1``8(`0!'4`&`$0````)`0`!BD!*`!@(R@
+M/S*```6@A"`!0````)`0(`&@A"`!`K__](,L(`.@$"```P```*808`"#+J`0
+MHS!@$(($`!""`$`0FRA@`]($P`V"`$`!@@!`$8,H8`+4!,`!0````)`0`!BD
+M!*`!@(R@/S*```6@A"`!0````)`0(`&@A"`!`K__\(($`!"@$"```P```*80
+M8`"#+J`0HS!@$(($`!""`$`0FRA@`]($P`V"`$`!@@!`$8,H8`+4!,`!0```
+M`)`0`!BD!*`!@(R@/S*```6@A"`!0````)`0(`&@A"`!`K__\(($`!"@$"``
+ME`>_^`,```"6$&``@RZ@$)DP8!"#+"`"@@!`"IH$`!":`T`0F@-`#9H#0`R;
+M*V`"V@+`#:`$(`&`I"`0"+__]MH@?[C"%F`"@@AA0("@84`2@``3H`>_L*('
+MO[`A```$@A0CS-(5``&0$``1E!`@`980(#-`````F!`@`Z`4(\[2%0`0D!``
+M$900(`&6$"`M0````)@0(`.@![^PDRU@$),R8!"0$``0E!`@`980(%]`````
+MF!`@`),O8!"3,F`0D!``$)00(`26$"!@0````)@0(`"3+>`0DS)@$)`0`!"4
+M$"`#EA`@:$````"8$"``DRV@$),R8!"0$``0E!`@`Y80(&M`````F!`@`*`0
+M(``#````HA!@`(($`!""`$`0@RA@`]($0`&#+"`"@@>``=0`?[!`````D!``
+M&*0$H`&`C*`_,H``!:`$(`%`````D!`@`:`$(`&`I"`0"+__\(($`!"@$"``
+ME@>_^`,```"8$&``@RZ@$+4P8!"#+"`"@@!`"YH$`!":`T`0F@-`#9H#0!J;
+M*V`"V@,`#:`$(`&`I"`'"+__]MH@?[B@![^PDR[@$),R8!"0$``0E!`@!I80
+M(!U`````F!`@`),O(!"3,F`0D!``$)00(`&6$"`$0````)@0(`#"%F`"@RA@
+M$("@8``&@``&FS!@$`,``!"`BT`!`H``':`0(`#"%F`"&P``$(((0`V`H``!
+MH$`__Z`,(`^@!"`0H@>_L)`0`!&2$"`?E!`@!980(!-`````F!`@`)`0`!&2
+M$``0E!`@!980(!A`````F!`@`)`0`!&2$"`#E!`@`I80(#%`````F!`@`*`0
+M(``#````HA!@`(($`!""`$`0@RA@`]($0`&#+"`"@@>``=0`?[!`````D!``
+M&*0$H`&`C*`_,H``!:`$(`%`````D!`@`:`$(`&`I"`'"+__\(($`!`#```+
+M@A!CQ,`E``&P$"`!@<?@"('H``"=X[^8DA``'*`0`!BB$``)D2[@$)$R(!"3
+M*F`00````),R8!"`HB```H``,+`0(`"#+J`0M3!@$(,N8!"3,&`0@*:`"0*`
+M`">:$``;@RP@$(,P8!""($`)D`!``9`"``&1*B`#D`(``9$J(`)`````DB:`
+M":`0``B1*B`0@*(@``:``!B:$``;@RP@$(,X8!"`H&!D%(``$YH0`!&A+"`0
+MH3P@$),L8!"3,F`00````)`0`!"B$``(D!`@9)`B`!"3+N`00````),R8!"B
+M!$`(D!``$4````"2$"!DFA``"(,K8!"Q,&`0@<?@"('H``"=X[Z`K!`@`,(6
+MX`*""&'P@*!@T`*``"6N$"`_@*!@T!2```F`H&%0@*!@H`*``!:`H&#``H``
+M'AL```40@`#YL!`@``*```>`H&%0-(```X"@:4"`H&%`,H``\K`0(``;```$
+M@A-CYL(6``'"-[[D@A-CTH(&``'")[[@$(``$YH38^@;```%@A-A\,(6``'"
+M-[[D@A-A^((&``'")[[@$(``"IH38JX;```%@A-A\,(6``'"-[[D@A-A\H(&
+M``'")[[@FA-B$IH&``W:)[[HJ`>^X)`'OO!`````DA`A"*H'OOBF![]XHA`@
+M`:00(`""!(`2XC5``:($8`&`I&`_!+___*0$H`'D-[[V@A`@`<(WOO*"$"`_
+MPC>^]*00(`#"%[[V@*2``3:```[0%,``H`2`$M`6P`#2%4`00```NY00`!30
+M-,`0I`2@`<(7OO:`I(`!!K__^*`$@!+0%,``VA>^]H(#0`V"`$`3I!`@`("D
+M@`T6@``RU!!__H($@!*;*B`0FSM@$-@4P`'"5,`!@*-``0:```3"%[[VD!``
+M#*P0`!*"($`2@@!__X,H8!"C,&`0@*1@``*```Z"!$`1E@!`$]I2__[8%,`!
+MPE3``8"C0`$T@``"V#+__J0$H`'"%[[V@*2``0:__^:"!(`2I!`@`,(7OO:`
+MI(`!%H``$)80``&"!(`2FRJ@$)L[8!#8%,`!PE3``8"C0`$V@``%I`2@`900
+M``RN$``2I`2@`8"D@`L&O__U@@2`$I$J(!"1.B`0D`(@&4````"2$"`R@@(`
+M"((`0`B#*&`#@@!`"*@`0`&D$"``HA`@`)$M(!"1.B`00````)(0(#*0`B`!
+M`P``$1"```B8$&)XI`2@`8,H8!#:!@`,@S!@#^PS0`&B!&`!@*1`"`:___F"
+M$``2HA`@``,``!$0@``QK!!B>,(7OO:"`$`!@@!`$YLM(!"A.V`0]E!__H"D
+M`!L6@``+@@1`$=!4P`&0)``(@@!`$])08`)`````DB0`"8"B(``TO__VH@1@
+M`9$M(!"1,B`0F@1`$=(4P`V"`T`3U!!@`M850`V7*N`1ES+@$)H#0!78$V`"
+MF2L@$7___O:9,R`0D`(@`8,LH!#:!@`6F3!@#Y$J(!"1,B`1T#-`#-8&`!;:
+M$L`,@RW@$(,P8!"`HT`!.(```NXRP`RD!*`!PA>^]H(`0`&"`$`3FRT@$)L[
+M8!#"4'_^@*-``0:```.8$"`!F!`@`(,LH!"#,&`0@*!@0()@(`"""&`!@(L`
+M`3*__\&H!2`R@RR@$(,P8!"`H&`_&(``$`,``!&6$&)X@RR@$-@&``N#,&`/
+MF@!`#-H3?_[:,P`!@@2@`:00``&#*&`0@S!@$("@8#\(O__V@RR@$`,```N"
+M$&/TP#8``;`0(`&!Q^`(@>@``)WCOX"1+B`0D3(@$),N8!"3,F`0E!``&D``
+M`$N6![_V@*(@``*```2E+B`0$(``1/`7O_:E-*`0U!:@!)`0`!+2!H``E@>_
+M]$````"8![_RHRY@$*,T8!#2%[_TD!``$900`!J6![_P0```8Y@'O^[2%[_R
+MD!``$900`!J6![_L0```79@'O^K0%[_TTA>_\)00`!I````LE@>_Z-`7O_32
+M%[_NE!``&D```">6![_FTA>_\-07O^[6%[_HV!>_YG___HJ0$``1H!``"-`7
+MO_+2%[_LE!``&D```!N6![_HT!>_\M(7O^J4$``:0```%I8'O^;2%[_LU!>_
+MZM87O^C8%[_F?__^>9`0`!&8$``(TA>_]-07O_*A+"`0H30@$)DK(!"9,R`0
+MD!``$G___F^6$``0D2H@$+$R(!"!Q^`(@>@``)WCOYB>$``:F!``&YH0`!FR
+M$"``PA:@!("F0`$6@``B^`:@"(,N(!"Q,&`0PA<``("@0!@R@``8L@9@`;80
+M(`#"%R`&@*;``1:``!*Z!R`(@RM@$+4P8!#"%T``@*!`&C*```BV!N`!@@;`
+M&X(`0!S"$&`>PC,``!"```RP$"`!PA<@!H"FP`$&O__TN@=@`K(&8`'"$^`$
+M@*9``0:__^2X!R`TL!`@`(''X`B!Z```G>._F)80`!N8$``<D!``&-H&H`C"
+M%J`$DA```8,H8!"`H&```H``#900(`"#+F`0LS!@$(,J8!"3,&`0PA-``("@
+M0!D"@``%E`*@`8"B@`D&O__[F@-@-)$J(!"1,B`0D@-@"$````#4$V`&`0``
+M`(''X`B!Z```G>._F`,``!&@$&)XT`8`$("B(``"@``&`P``"T`````!````
+MP"8`$`,```N@$&/LT`8`$("B(``"@``%`0```$`````!````P"8`$(''X`B!
+MZ```@</@")`0(`'"$D``E!```8,H8!"#,&`0&P```-H38`"`H$`-&(``#)@0
+M(``#````EA!@`(,JH!";,&`0F`,@`8,K(`+"$L`!@*-``2B___V8`R`!@RL@
+M`AL```":$V``@@!`#8'#X`C04&`"G>._F$````"0$""T`P``"X(08^R`HB``
+M`H``#-`F``$A```1FA0B?((0((#")@`-H!0B>$````"0$""`@*(@`!*```;0
+M)@`0@A`@`L(F0``0@``DL!`@`!L```N8$V"H`P```((08`#")@`,F!-@K`,`
+M``""$&``PB8`#)@38+`#````@A!@`,(F``R8$V"T`P```((08`#")@`,F!-@
+MN`,```""$&``PB8`#)@38+P#````@A!@`,(F``R8$V#``P```((08`#")@`,
+MFA-@Q`,```""$&``PB8`#;`0(`&!Q^`(@>@`````````````````````````
+M````````````````````G>._F*`0(``#````HA!@`(($`!""`$`0FRA@`]($
+M0`V"`$`!@@!`&8,H8`+4!$`!0````)`0`!BV!N`!@([@/S*```6@!"`!0```
+M`)`0(`&@!"`!@*0@#PB__^^"!``0H!`@``,```"R$&``@RP@`](&0`&"`$`9
+MU`!@!$````"0$``8M@;@`8".X#\R@``%H`0@`4````"0$"`!H`0@`8"D($0(
+MO__S@RP@`[(0(``#````H!!@`((&0!F"`$`9FRA@`M($``V"`$`:@RA@`M0$
+M``%`````D!``&+8&X`&`CN`_,H``!;(&8`%`````D!`@`;(&8`&`IF`_"+__
+M\((&0!F!Q^`(@>@``)WCOYBH$``8JA`@`.`60``#```$@A!BOX"D``$8@``Y
+MIA`@`)`$-W!`````DA`@!8"B(``R@``+X!9``)H$`!`#/__[@A!BX*`#0`&0
+M$``00````)(0(`H0@``1H!``")`$-U!`````DA`@!8"B(``2@`"5L!`@`)H$
+M`!`#/__[@A!BH*`#0`&0$``00````)(0(`J@$``(JA`@`:$L(`*@#"#_D!``
+M$$````"2$"`(H!``")`0`!0C```H0````)(48@3"%D``@*!IM#*```:4"C_O
+ME!(@$)`0`!00@``%DA1B!)`0`!03```HDA)B!$````"E+"`$$(``8(,LX`+B
+M%D``X!9``)`0`!!`````DA`@!9$J(!"1,B`0@*(@`C*``!C@%D```P``!8(0
+M83N`I``!.(``$^`60`""!'_^@RA@$(,P8!"1*&`"D`(``9`"``@#/__1@A!@
+M@)`"``%`````DA`@&9`"(`%`````DA`@"*`0``@0@``[D!`@`)`0`!!`````
+MDA`@%)$J(!"`HB``,H``$N`60``#```$@A!C_X"D``$H@``-X!9``!$___N0
+M$B%`D`0`"$````"2$"`4D2H@`D````"2$"`(H!``"!"``"20$"`#D!``$$``
+M``"2$"`*D2H@$("B(``R@``-X!9``!$___N0$B%`D`0`"$````"2$"`*D`(`
+M"$````"2$"`(H!``"!"``!*0$"`"D!``$$````"2$"`%D2H@$("B(``2@``C
+ML!`@`!$___N0$B%`D`0`"$````"2$"`%0````)(0(`B@$``(D!`@`4````"2
+M$"`"IA``"*4L(`2#+.`"I!2``8(%0!6D%(`!(0``!((4(`&D%(`!E`R@_Y`0
+M`!0C```F0````)(48)RE-*`(E`R@?Y`0`!1`````DA1@V*`4(C3R)0`0L!`@
+M`8''X`B!Z````P``"X(08^R`HF`'&(``$-`"``&#*F`"&P```)H38`#"`T`!
+M@<!```$````0@``)D`(@!!"```>0`B`($(``!9`"(`P0@``#D`(@K)`0(`"!
+MP^`(`0```)WCOYBH$``8NA`@`+@0(`"J$"``KA`@``,```N:$&/LY`8`#8(0
+M8!"B!@`!PA9@`H((8?"`H&#0`H``4:80(`"`H&#0%(``"8"@85"`H&"@`H``
+M08"@8,`B@`!*`P``!!"``>:P$"```H``!X"@85`T@``#@*!H`("@84`R@`'?
+ML!`@`,(60`""`'!?@RA@$(,P8!"`H&3J.(``!\(60``#```$FA!C5/H5``T0
+M@``D@A!C5AL___J:$V-T@@!`#8,H8!"#,&`0@*!@[SB```?"%D```P``!)H0
+M8UCZ%0`-$(``%X(08UH;/__ZFA-BA((`0`V#*&`0@S!@$("@8.`X@``'VA9`
+M``,```2:$&-<^A4`#1"```J"$&->`P``!8(08ER`HT`!"(``!P,```2:$&-@
+M^A4`#8(08V+X%0`!`P``!)H08M[2%0`-$(``$X(08RP;```$@A-C;.H6``&"
+M$V-P[A8``8(38N#2%@`!FA-C+A"```KL%@`-`P``!)H08V[J%0`-KA``%9H0
+M8N+2%0`-@A!C,.P5``&8$"```P```)808`"#*R`"FRL@`YH#0`O:`V`$F(,@
+M`0*___O:)(`!F!`@``,```"4$&``@RZ@$)<P8!"#*R`"@@!`$IH#``R:`T`,
+MF@-`#9H#0`N;*V`"V@*`#9B#(`$"O__WVB!@!)@0(``#````E!!@`(,NH!"7
+M,&`0@RL@`H(`0!*:`P`,F@-`#)H#0`V:`T`+FRM@`MH"@`V8@R`!`K__]]H@
+M8`B8$"```P```)008`"#+J`0ES!@$(,K(`*"`$`2F@,`#)H#0`R:`T`-F@-`
+M"YLK8`+:`H`-F`,@`8"C("<(O__VVB!@#*`$H`R3*F`0DS)@$)`0`!"4$"`!
+MEA`A+D````"8$"``TA;``)`0`!"4$"`"EA`A#D````"8$"``TA;@`I`0`!"4
+M$"`"EA`A`4````"8$"``PA9@`H"(8$`"@``N@(A@@,($8!S24&`"D!``$)00
+M(`&6$""H0````)@0(`/"!&`<TE!@!)`0`!"4$"`!EA`@J4````"8$"`#P@1@
+M'-)08`:0$``0E!`@`980(*I`````F!`@`\($8!S24&`(D!``$)00(`&6$""N
+M0````)@0(`/"!&`<TE!@"I`0`!"4$"`!EA`@KT````"8$"`#P@1@'-)08`R0
+M$``0E!`@`980(+!`````F!`@`\(68`*`B&"``H``#Z`$H`R3+6`0DS)@$)`0
+M`!"4$"`#EA`A'T````"8$"``DRW@$),R8!"0$``0E!`@`Q"```Z6$"$BDR]@
+M$),R8!"0$``0E!`@`Y80(1=`````F!`@`),O(!"3,F`0D!``$)00(`.6$"$:
+M0````)@0(`#8%B'4@@L@\((`?]"`H&`_.(``*<(6(=*"&R`U@*```9I@/_^"
+M&R!%@*```8)@/_^`DT`!$H``!H"C($8"@``$@*,@-C*``!S"%B'2H`2@#)`0
+M`!"2$"`"E!`@`I80(%I`````F!`@`I`0`!"2$"`"E!`@`I80(%Q`````F!`@
+M`I`0`!"2$"`"E!`@`I80(%Y`````F!`@`I`0`!"2$"`"E!`@`980(/Y`````
+MF!`@`L(6(=*`H&!!"(``(I@0(`"@!*`,D!``$)(0(`&4$"`!EA`A&4````"8
+M$"`!D!``$)(0(`&4$"`"EA`@`4````"8$"`#D!``$)(0(`&4$"`"EA`@`T``
+M``"8$"`#D!``$)(0(`&4$"`!EA`@BT````"8$"`#D!``$)(0(`&4$"`!EA`@
+MC$````"8$"`#F!`@``,```"6$&``@RZ@$+4P8!"#*R`"@@!`$IH#``R:`T`,
+MF@-`#9H#0!J;*V`"V@+`#9@#(`&`HR`,"+__]MH@8*S"%F`"@(A@0`*```F0
+M!*"LP@1@'-)00`"4$"`"EA`@)4````"8$"``D`2@K),MH!"3,F`0E!`@!I80
+M(`Y`````F!`@`,(68`*9*&`0FS,@$`,``!"`BT`!,H``!L(68`*`HR``%H``
+M%Z`0(`#"%F`"&P``$(((0`V`H``!H$`__Z`,(`>@!"`(H@2@K)`0`!&2$"`/
+ME!`@!)80(#I`````F!`@`)`0`!&2$``0E!`@!)80($9`````F!`@`*`0(``#
+M````HA!@`(,L(`/2!$`!@RP@`M0$@`%`````D!``&*8$X`&`C.`_,H``!:"$
+M(`%`````D!`@`:"$(`$"O__T@RP@`Z`0(``#````HA!@`(($`!""`$`0@RA@
+M`]($0`&#+"`"@@!`$M0`8`1`````D!``&*8$X`&`C.`_,H``!:"$(`%`````
+MD!`@`:"$(`$"O__Q@@0`$*`0(``#````HA!@`(($`!""`$`0@RA@`]($0`&#
+M+"`"@@!`$M0`8`A`````D!``&*8$X`&`C.`_,H``!:"$(`%`````D!`@`:"$
+M(`$"O__Q@@0`$*`0(``#````HA!@`(($`!""`$`0@RA@`]($0`&#+"`"@@!`
+M$M0`8`Q`````D!``&*8$X`&`C.`_,H``!:`$(`%`````D!`@`:`$(`&`I"`G
+M"+__\(($`!"@$"```P```*(08`""!``0@@!`$(,H8`/2!$`!@RP@`H(`0!+4
+M`&"L0````)`0`!BF!.`!@(S@/S*```6@!"`!0````)`0(`&@!"`!@*0@#`B_
+M__""!``0`P``"X(08\3`)0`!L!`@`8''X`B!Z```G>.[N/0GH$S8%B'4@@L@
+M\((`?]"`H&`_&(``$[00`!R"&R`U@*```9I@/_^"&R!%@*```8)@/_^`DT`!
+M,H``"((0(`*`HR!&`H``!("C(#8R@``&F!`@`8(0(`(0@``$PB>\+)@0(`'8
+M)[PLPA;@`H((8?"`H&#0(H``'@,```<4@``(@*!A4("@8*`"@``2@*!@P`*`
+M`!:6$"``,(`!@`*```>`H&%0-(```X"@:`"`H&%`$H`!>I80(``#```'@A!C
+MU*P&``$#```$$(``#8(08M@#```'@A!CX*P&``$#```$$(``!X(08MH#```'
+M@A!C[*P&``$#```$@A!BW-H6``'"%:`&@(M``0*``626$"``V@>@3,)30`""
+M`$`!PC>\'L)60`""`$`!PC>\)@,___>"$&*MPC>\0,(WO$*J$"``I!`@`-H5
+MH`:8![_X@SM`$H"(8`$"@``(@*5@`1B``4^6$"``@@5`%8(`0`SD,'Q(J@5@
+M`:0$H`&`I*`#"+__]8,[0!+0%L``U!6@!-(%@`"6![PX0``!8)@'O#3F![PX
+MP@>\-("DP`$8@`!OJA`@`+H'ON"N![[(N`>\2(,LX`*"`$`3@RA@`H(`0!.#
+M*&`"V@6@"*@`0`W:%[Q"`P``-X(08JV`HT`!$H``'>07O$"A+*`"H`0`$J$L
+M(`*@!``4D@0@".04(`:B!(`2D!``'4````"4$``1H`0@$)`0`!>2$``00```
+M`)00`!'652`"D!``$I(0`!V4$``70``!8Y@'O$B`HB```H`!%)80(`"#+6`'
+M$(``.Y`'O<BA+*`"H`0`$J$L(`*@!``4D@0@".04(`:B!(`2D!``'4````"4
+M$``1H`0@$)`0`!>2$``00````)00`!'652`"D!``$I(0`!V4$``70``!2)@'
+MO$B`HB```H``^980(`"#+6`'D`>]R)`"``&2$``<0````)00((#D%[Q"H2R@
+M`J`$`!*A+"`"H`0`%)($(`CD%"`&H@2`$I`0`!U`````E!``$:`$(!"0$``7
+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
+M@SA@#_@SP`&"!G__LA```8,H8!"`H&``%K__R[0&O_ZQ*V`0L3X@$(''X`B!
+MZ```G>._F)@0`!F:$``:EA``&YX0($#"%B!^^E8@?OA60`"Z)T`<@*=@?A2`
+M``.4`'^"U!9``+H0(#_T%B!^PE8@?K8`?_^#+V`0@SA@#\)6``&`H$`;%(``
+M`[@0(`&X$"``@R]@$(,X8!"".``!@S!@'X"/``$RO__TN@=__\(3('[",L``
+MN!``';(0(#^#+J`0@SA@$/I2P`"`H$`=)(``#)X0(`"#+R`0@*```;I@/_^#
+M*^`0@*```8)`(`"`CT`!`H``!H,O(!">$"``L!``#+@0(#^#+R`0@SA@$("@
+M8``$@``3@@!``?I6``&#+J`0@SA@$("G0`$&@``-NA```8('/_^X$``!@RA@
+M$(,X8!"`H&``!(``!H(`0`'"5@`!@*!`'1:___B"!S__@R\@$("@``&Z8#__
+M@RO@$("@``&"8#__@(]``0*``!*#+F`0@*!@`":``!FQ*J`0@RY@$(,X8`^Z
+M`$`-^A=@`OHS0`&"!G__LA```8,H8!"`H&``%K__^(,N8!`0@``,L2J@$(,X
+M8`^Z%P`/^C-``8(&?_^R$``!@RA@$("@8``6O_^XM`:__K$JH!"Q/B`0@<?@
+M"('H``"=X[^8`P``$:`08GC0!@`0@*(@``*```8#```+0`````$```#`)@`0
+M`P``"Z`08^S0!@`0@*(@``*```4!````0`````$```#`)@`0@<?@"('H``"=
+MX[^8GA``&?068`2P$"``MA`@`8,NX`*"`$`;@RA@`H(`0`_X$&`$^A!@!(,N
+MH!"#.&`0@*=``3:```6V!N`!L!``&[00`!RV!N`!@*;@`P2___*#+N`"@RX@
+M`H(`0!B#*&`"@@!`#_(08!#:$&`(MA`@`8,N(`*"`$`8L`!``8(&`!N"`$`!
+MN`!`#_I7(!"#+F`0@SA@$("G0`$6@``$]!<@$+(0`!K:%R`(M@;@`8"FX`,$
+MO__T@@8`&[$K8!"Q/B`/L"9`&+$N(!"Q/B`0@<?@"('H``"=X[^8P#:``,(6
+M8`*""&%`@*!A0!*```BL$``8`P``!X(08]2"!@`!Z`!@"!"``!S8$&`$PA9@
+M`H((8-":&&#`@*``#9I@/_^"&&#0@*```8)@/_^`DT`!(H``",(68`(#```'
+M@A!CU((&``'H`&`@$(``"]@08!R""&"@@*!@H!*``)BP$"`!`P``!X(08]2"
+M!8`!Z`!@%-@08!"`HR``!(``D+`0(`#:%D``PA4``("C0`$J@``1PA4@`H,K
+M(`*"`$`,@RA@`H(`0`R#*&`"@@!`%,(0?ZR`HT`!"(``%)80(`#"%0``@*-`
+M`3J```>3*R`"PA4@`L(V@`"0$``6$(``=)(0`!22`D`,DRI@`I("0`R3*F`"
+MD@)`%,(2?Z["-H``$(``:I("?ZR`HL`,%H``&)00(`#"%D``DA```8,H8!"#
+M,&`0VA4``("@0`T(@``0@RI@$)LP8!"4$``+E@+@`8"BP`P6@``*@RK@`H(`
+M0`N#*&`"@@!`"X,H8`+"%0`!@*-``3B___:4$``+@RK@`H(`0`N#*&`"@@!`
+M"YLH8`+J%0`-@RJ@`H(`0`J#*&`"@@!`"K$H8`+"%0`8JB5``8"E8``$@``T
+MI@4`#=!4X`*D!0`8XE2@`I`B`!'2%D``0````)(B0`&@$``(D!``$4````"2
+M$``5H`0`")`0`!!`````DA``%9$J(!B1.B`8T#:``)`0`!9___]#DA``$Z`0
+M``BA+"`0H3P@$)`0`!9___\]DA``$I$J(!"1.B`0H"0`"-(60`#"%0`8DB)`
+M`4````"0$``0H!``")`0`!9___\QDA``$I$J(!"1.B`00````)(0`!6@!``(
+MD!``$$````"2$``5D2H@&!"``!*1.B`8@RK@`H(`0`N#*&`"@@!`"Y,H8`+:
+M%D``PA4`"8"C0`$2@``*L!`@`)(%``G"$F`"PC:``)`0`!9___\6`0```-`V
+MP`"P$"`!@<?@"('H``"=X[^0HA`@`("D0!H:@``5I!`@`:8'O_:#+&`#H`9`
+M`9`0`!B2$``0E`>_]G___SN6![_T@*(@`"*```:D$"``P@S@`<(L(`;"#[_U
+MPBP@!Z($8`&`I$`:"K__\8,L8`.!Q^`(D>@`$IWCOYA`````D!`@X`,```N"
+M$&/L@*(@``*```S0)@`!(0``$9H4(GR"$""`PB8`#:`4(GA`````D!`@@("B
+M(``2@``&T"8`$((0(`+")D``$(``*+`0(`":$"!``P``$8(08GS:)@`!&P``
+M"Y@38*@#````@A!@`,(F``R8$V"L`P```((08`#")@`,F!-@L`,```""$&``
+MPB8`#)@38+0#````@A!@`,(F``R8$V"X`P```((08`#")@`,F!-@O`,```""
+M$&``PB8`#)@38,`#````@A!@`,(F``R:$V#$`P```((08`#")@`-L!`@`8''
+MX`B!Z`````````````````````````````````````````````"=X[^8H!`@
+M``,```"B$&``@@0`$((`0!";*&`#T@1`#8(`0`&"`$`9@RA@`M0$0`%`````
+MD!``&+8&X`&`CN`_,H``!:`$(`%`````D!`@`:`$(`&`I"`/"+__[X($`!"@
+M$"```P```+(08`"#+"`#T@9``8(`0!G4`&`$0````)`0`!BV!N`!@([@/S*`
+M``6@!"`!0````)`0(`&@!"`!@*0@B@B___.#+"`#LA`@``,```"@$&``@@9`
+M&8(`0!F;*&`"T@0`#8(`0!J#*&`"U`0``4````"0$``8M@;@`8".X#\R@``%
+ML@9@`4````"0$"`!L@9@`8"F8#\(O__P@@9`&8''X`B!Z```G>._F*@0`!BJ
+M$"``X!9```,```2"$&*_@*0``1B``#FF$"``D`0W<$````"2$"`%@*(@`#*`
+M``O@%D``F@0`$`,___N"$&+@H`-``9`0`!!`````DA`@"A"``!&@$``(D`0W
+M4$````"2$"`%@*(@`!*``)6P$"``F@0`$`,___N"$&*@H`-``9`0`!!`````
+MDA`@"J`0``BJ$"`!H2P@`J`,(/^0$``00````)(0(`B@$``(D!``%",``"A`
+M````DA1B!,(60`"`H&FT,H``!I0*/^^4$B`0D!``%!"```62%&($D!``%!,`
+M`"B2$F($0````*4L(`00@`!@@RS@`N(60`#@%D``D!``$$````"2$"`%D2H@
+M$)$R(!"`HB`",H``&.`60``#```%@A!A.X"D``$X@``3X!9``(($?_Z#*&`0
+M@S!@$)$H8`*0`@`!D`(`"`,__]&"$&"`D`(``4````"2$"`9D`(@`4````"2
+M$"`(H!``"!"``#N0$"``D!``$$````"2$"`4D2H@$("B(``R@``2X!9```,`
+M``2"$&/_@*0``2B```W@%D``$3__^Y`2(4"0!``(0````)(0(!21*B`"0```
+M`)(0(`B@$``($(``))`0(`.0$``00````)(0(`J1*B`0@*(@`#*```W@%D``
+M$3__^Y`2(4"0!``(0````)(0(`J0`@`(0````)(0(`B@$``($(``$I`0(`*0
+M$``00````)(0(`61*B`0@*(@`!*``".P$"``$3__^Y`2(4"0!``(0````)(0
+M(`5`````DA`@"*`0``B0$"`!0````)(0(`*F$``(I2P@!(,LX`*D%(`!@@5`
+M%:04@`$A```$@A0@`:04@`&4#*#_D!``%",``"9`````DA1@G*4TH`B4#*!_
+MD!``%$````"2%&#8H!0B-/(E`!"P$"`!@<?@"('H``"=X[^8IA``&`,```N"
+M$&/LX@8``<(68`*""&'P@*!@P`*``!*D$"``@*!@P!2```>`H&#0@*!@H`*`
+M``@#```$$(``UK`0(``B@``)`P``!!"``-*P$"``FA!C9-(6``T0@``&@A!C
+M9@,```2:$&-HTA3`#8(08VKR%,`!F!`@``,```"6$&``@RL@`ILK(`.:`T`+
+MV@-@!)B#(`$"O__[VB1``9@0(``#````E!!@`(,NH!"7,&`0@RL@`H(`0!&:
+M`P`,F@-`#)H#0`V:`T`+FRM@`MH"@`V8@R`!`K__]]H@8`28$"```P```)00
+M8`"#+J`0ES!@$(,K(`*"`$`1F@,`#)H#0`R:`T`-F@-`"YLK8`+:`H`-F(,@
+M`0*___?:(&`(F!`@``,```"4$&``@RZ@$)<P8!"#*R`"@@!`$9H#``R:`T`,
+MF@-`#9H#0`N;*V`"V@*`#9@#(`&`HR`:"+__]MH@8`R@!&`,DRI@$),R8!"0
+M$``0E!`@`Y80(*A`````F!`@`),N8!"3,F`0D!``$)00(`.6$""E0````)@0
+M(`"8$"```P```)808`"#+J`0M3!@$(,K(`*"`$`1F@,`#)H#0`R:`T`-F@-`
+M&ILK8`+:`L`-F`,@`8"C(`((O__VVB!@>*`0(``#````M!!@`(,L(`/2!H`!
+M@RP@`M0$0`%`````D!``&*0$H`&`C*`_,H``!:"$(`%`````D!`@`:"$(`$"
+MO__T@RP@`Z`0(``#````M!!@`(($`!""`$`0@RA@`](&@`&#+"`"@@!`$=0`
+M8`1`````D!``&*0$H`&`C*`_,H``!:"$(`%`````D!`@`:"$(`$"O__Q@@0`
+M$*`0(``#````M!!@`(($`!""`$`0@RA@`](&@`&#+"`"@@!`$=0`8`A`````
+MD!``&*0$H`&`C*`_,H``!:"$(`%`````D!`@`:"$(`$"O__Q@@0`$*`0(``#
+M````M!!@`(($`!""`$`0@RA@`](&@`&#+"`"@@!`$=0`8`Q`````D!``&*0$
+MH`&`C*`_,H``!:`$(`%`````D!`@`:`$(`&`I"`:"+__\(($`!"@$"```P``
+M`+008`""!``0@@!`$(,H8`/2!H`!@RP@`H(`0!'4`&!X0````)`0`!BD!*`!
+M@(R@/S*```6@!"`!0````)`0(`&@!"`!@*0@`@B___""!``0`P``"X(08\3`
+M),`!L!`@`8''X`B!Z````P``"X(08^R`HF`'&(``$-`"``&#*F`"&P```)H3
+M8`#"`T`!@<!```$````0@``)D`(@!!"```>0`B`($(``!9`"(`P0@``#D`(@
+M>)`0(`"!P^`(`0```)WCOYB:$``;GA``'+80`!JX$``8M2Z@$+4VH`^Q+B`0
+ML3X@$,(60`"`I@`!%H``!;0&0!K`(\``$(``)<`C0`"#+R`0@SA@$/H6O_Z`
+MH$`=!H``#X"F0!J#+N`0@S!@$!"```."`'__@SA@`<(CP``0@``7PB-``(,X
+M8`'"(T``@@!@`1"``!+"(\``&H``$+H0`!F#+R`0L3A@$,(70`"`H$`8`K__
+M\8(G0!G"%V`"@*8``2:___&")T`9N@=@`H"G0!HJO__WPA=``(''X`B!Z```
+MG>._D*X0`!CL!Z!<F!``&900`!VR!D`9JA`@`+LO8!"[-V`0@*=@`0B``$RP
+M$"``@B:`#)LM8!"#*&`0@*!`#0J``$6")H`,NRJ@$(,H8!"U,&`0D2Y@$)$Z
+M(!"2$``;E3=@$)8'O_1___^QF`>_\,('O_"`H&``$H``!)DW8!""$"`!PB>_
+M\)H#/__"![_T@*!`#1*```:0`$`!@@,__L(GO_3"![_TD`!``<('O_""`$`!
+MVE;`",)6P`&`HT`!,H``!*,N8!`0@``6T!<`"*,\8!#F![_TI@3`$^A6P!.0
+M)$`4X`>_\*`$`!!`````TA<`$*00``C@5L`0HB0`$=(7`!-`````D!``$:0$
+M@`B@)``4D!``$D````"2$``0@RU@$(,P8!";+>`&F@-``9H#0`W0-8`-@@5@
+M`:H0``&#*&`0@S!@$("@0!H(O__"L@9@`K`0(`&!Q^`(@>@``)WCOYBU+J`0
+MM3:@$+,N8!"S-F`0@*:`&0*``!."$``;H2X@$*$T(!"0)``9DR\@$$````"3
+M.F`0HA``"*`F@!"3+N`0DSI@$$````"0$``0H@1`")(F@!E`````D!``$8(0
+M``BQ*&`0L3X@$(''X`B!Z```G>._>)`0`!GX)Z!4^`>@7.H'H&"N$``9`P``
+M"X(08*3R!@`!J!`@`)$J(!"1.B`0U!:@%)(0`!J6![_D?___1Y@'O^"F$"``
+MK`>_^((0(`.0($`3P@>_Y)H`0`&:`T`!@RM@!)H#0`&:`T`-@@(`"((`0`B7
+M*&`#F@-`"Y@#0!K"$R`@@*!@``*``)/D$R`@F@4`%,(3(!["-P`-E`-`%M@3
+M("S8,K_XV@>_X((#0`V"`$`-FRA@!((`0`V"`$`!@@!`"X(`0!J9*R`0F3L@
+M$-H08"S"4&`L@*,``32```+:,K_X@@4`%)(`0!;"$G_X@RA@$)LX8!"#,&`?
+MF@-``9L[8`':,G_XV@>_Y)4LH!"5,J`0@@-`#8(`0`V;*&`$@@!`#9@"``B8
+M`P`(F2L@`H(`0`R"`$`*@@!``8(`0!K6$&`JUC)_\-H'O^""`T`-@@!`#9LH
+M8`2"`$`-@@!`#((`0`J"`$`!@@!`&I<JX!"7.N`0VA!@*L)08"J`HL`!-(``
+M`MHR?_"B!0`4H@1`%L(4?_"#*&`0E3A@$(,P8!^4`H`!E3J@`=0T?_#25'_X
+MP@>_Y)@`0`&8`P`!@RL@!)@#``&8`P`,H`(`"*`$``BA+"`#F`,`$)@#`!J6
+M`R`LF`,@(J4LH!"E-*`0\B.@7)`0`!1___\.FA``$M)4?_C45'_PP@>_X)@`
+M0`&8`P`!@RL@!)@#``&8`P`,F`,`$)@#`!J6`R`LF`,@(H(&8@#"(Z!<D!``
+M%'___OV:$``2PA1_\-H4?_B"($`-@RA@$("@8``"@``?HA`@`(,MX!"Q,&`0
+MF@4`%(('O_BD`T`!FRT@!IH#0!&:`T`-H`-`&<('O^2"`$`!TA:``<('O^""
+M`$`!U!:``=960`W85"(`?___.Y`0`!C0-"0`H@1@`<(4O_#:%+_X@B!`#8,H
+M8!"#,&`0@*1``0J__^N;+2`&J`4@`:8$X`&`I.`#"+__78(0(`/"%[_PV@>@
+M5,(S0`"B$"``@*1`%!J``(RF$"``K`>_^(,NX!"W,&`0@@4__X"DP`$2@``(
+MF`3`$YH$P!."`T`6PA!_\((`8`00@``*PC=`#9H#`!;"4W_PVE-_^H(`0`V;
+M,&`?@@!`#8,X8`'"-T`,@*3@``*```F@$"``@@3`$YH`0!W@$W_^@@!`%L)0
+M?_B@)``!H"0`&X,LX`>"`$`9VA!D`L(09`":(T`!@A``#9LK8!"`HV``(H``
+M`H(0(`&`I"``%H``%)H0``&#+.`'N`!`&8,K8!"E,&`0D!``$$````"2$``2
+MPA<D`((`0`B8!$`1FRA@$("C8``6@``#H@1@`8(0(`"@A"`!#+__],(U0`R"
+M!,`3F@!`%M13?_#:4W_XE"*`#>070`&D!(`;I"2`#8"B@!((@``#N!``"K@0
+M`!*#+R`0@SA@$("D``$V@``/@RS@!I<LX`:8$``!@@1`$9H"P!":`T`-F@-`
+M&=H39`#:-4`!H`0@`8"D``P&O__XH@1@`8,LX`:"`$`*@@!``8(`0!G:$&/^
+MPA!C_)HC0`&"$``-FRM@$("C8``B@``"@A`@`8"D@!P(@``>FA```8,LH!"#
+M.&`0@*0``1:``!F#+.`&@@!`"H(`0`&P`$`9@RM@$+4P8!"0)``<0````)(0
+M`!K:%B/^F@-`")@$0!&#*V`0@SA@$("@8'\$@``#H@1@`9H0('^@!"`!@RR@
+M$(,X8!"`I``!!K__\-HU0`RF!.`!@*3`%`J__WR"!3__@*3@`QB```J`I&!_
+M@@3`$YH`0!W:$W_^I@3@`8"DX`,(O__[VC=``8"D8'\8@``)`0```(($0!&:
+M`$`5VA-__J($8`&`I&!_"+__^]HU0`&!Q^`(@>@``)WCOX"F$``8`P``$8(0
+M8GCB!@`!PA;@`H((8-":&&#`@*``#9A@/_^"&&#0@*```9I@/_\#```)@A!C
+M_("3``T2@``+I`8``=H6X`*:"V"@`P``"((08^B`HV"@`H``!*0&``$0@`!:
+ML!`@`)`0`!@A```H0````)(4(FR6"B`/J!``"](6P`#X(Z!<XB.@8)`0`!B4
+M$``2F`>_[G___GF:![_PD!``&$````"2%")8%0``,)0J``K"%*`<@@!__X,H
+M8`X;```P@@A`#902@`&0$``80````)(4(EC"5[_N@*!@``*```?:%[_NFB``
+M#0,```N"$&/T$(``!=HTP`$#```+@A!C],`TP`$#```HN!!B@*`0(`";+"`#
+MU!1`#90*H/^:`T`1P@M@`X,H8`B4$H`!P@M@!8,H8!"4$H`!P@M@!X,H8!B4
+M$H`!D!``&$````"2$``<H`0@`8"D(!\(O__NN`<@!)0-(`_"%[_P@RA@!(((
+M8_"4$H`!PA>_\H,H8`H;```_@@A`#902@`'"%[_T@RA@$!L`#\"""$`-E!*`
+M`<(7O_:#*&`6&P/P`(((0`V4$H`!D!``&!,``"A`````DA)B;+`0(`&!Q^`(
+M@>@``)WCOY@#```1H!!B>-`&`!"`HB```H``!@,```M``````0```,`F`!`#
+M```+H!!C[-`&`!"`HB```H``!@,```M``````0```,`F`!`#```+H!!@I-`&
+M`!"`HB```H``!0$```!``````0```,`F`!"!Q^`(@>@``)@0(`"6$"`#@B+`
+M#)H`0`&:`T`!FRM@`Y`#0`G"$B`(@*!@`"*```28`R`!$(``"-!2(!2`HR`#
+M"+__]8(BP`R"$"``@RA@$)$X8!"!P^`(`0```)H0(`""`T`-E@!`#8,JX`."
+M`$`)V!!@"("C(``B@``(F@-@`8,JX`*"`$`,@@!``8(`0`D0@``(T%!@$H"C
+M8`,(O__R@@-`#8(0(`"#*&`0D3A@$('#X`@!````G>._F*@0`!C`-H``PA9@
+M`H((8-":&&#`@*``#9A@/_^"&&#0@*```9I@/_\#```)@A!C_("3``T2@``*
+M@@8``=H68`*:"V"@`P``"((08^B"!@`!@*-@H!*``*^P$"``I@!@&-@08!3"
+M$&`4@*!@``*``*FP$"``UA9``,(4P`"`HL`!"H``$Y`0`!2;*R`0FS-@$((#
+M0`V"`$`-FRA@!((`0`V"`$`!@@!`$\(0?YJ`HL`!"(``%I(0(`#"%,``@*+`
+M`1J```F#*R`0D!``%'___[62$``3T#:``)`0`!00@`")DA``$X,P8!"@`$`!
+MH`0``8,L(`2@!``!H`0`$*`$P!`0@`!ZH`0_FH,K(!"4$``!@*!@``*``!F8
+M$"``PA9``)80``&#*&`0@S!@$-H4P`"`H$`-"(``$8,JX!"5,J`0ES!@$)(0
+M``R8`R`!@*,`"A:```J"`P`,@@!`#)LH8`2"`$`-@@!``<(4P`&`HL`!.+__
+M]I(0``R"`P`,@@!`#)LH8`2"`$`-E@!``?`4P`N"`D`)@@!`"9LH8`2"`$`-
+MJ@!``<(4P!6P)@`!@*8@``2``$.D!,`+D!``%'___WF2$``2H!``"*$L(!"A
+M/"`0H@3`%9`0`!1___]RDA``$9$J(!"1.B`0H"0`"-(60`#"%,`5DB)``4``
+M``"0$``0H!``")`0`!1___]FDA``$9$J(!"1.B`00````)(0`!B@!``(D!``
+M$$````"2$``8D2H@&)$Z(!C0-H``D!``%'___T.2$``2H!``"*$L(!"A/"`0
+MD!``%'___SV2$``1D2H@$)$Z(!"@)``(TA9``,(4P!62(D`!0````)`0`!"@
+M$``(D!``%'___S&2$``1D2H@$)$Z(!!`````DA``&*`$``B0$``00````)(0
+M`!B1*B`8$(``%9$Z(!B"`P`,@@!`#)LH8`2"`$`-D@!``=H60`#"%,`)@*-`
+M`1*```VP$"``H`3`"9`0`!1___\MDA``$-`V@`"0$``4DA``$'___Q,!````
+MT#;``+`0(`&!Q^`(@>@``)WCOY"B$"``@*1`&AJ``!6D$"`!I@>_]H,L8`.@
+M!D`!D!``&)(0`!"4![_V?___+I8'O_2`HB``(H``!J00(`#"#.`!PBP@!L(/
+MO_7"+"`'H@1@`8"D0!H*O__Q@RQ@`X''X`B1Z``2G>._F$````"0$""$`P``
+M"X(08^R`HB```H``$]`F``$A```1FA0B?((0(0#")@`-H!0B>$````"0$"$`
+M@*(@``*```G0)@`00````)`0)@`#```+@A!@I("B(``2@``&T"8``8(0(`+"
+M)D``$(``)+`0(``;```+F!-@J`,```""$&``PB8`#)@38*P#````@A!@`,(F
+M``R8$V"P`P```((08`#")@`,F!-@M`,```""$&``PB8`#)@38+@#````@A!@
+M`,(F``R8$V"\`P```((08`#")@`,F!-@P`,```""$&``PB8`#)H38,0#````
+M@A!@`,(F``VP$"`!@<?@"('H````````````````````````````````````
+M`````````)WCOYB@$"```P```*(08`""!``0@@!`$)LH8`/2!$`-@@!``8(`
+M0!F#*&`"U`1``4````"0$``8M@;@`8".X#\R@``%H`0@`4````"0$"`!H`0@
+M`8"D(!T(O__O@@0`$*`0(``#````LA!@`(,L(`/2!D`!@@!`&=0`8`1`````
+MD!``&+8&X`&`CN`_,H``!:`$(`%`````D!`@`:`$(`&`I"!_"+__\X,L(`.R
+M$"```P```*`08`""!D`9@@!`&9LH8`+2!``-@@!`&H,H8`+4!``!0````)`0
+M`!BV!N`!@([@/S*```6R!F`!0````)`0(`&R!F`!@*9@/PB___""!D`9@<?@
+M"('H``"=X[^8J!``&*H0(`#@%D```P``!((08K^`I``!&(``.:80(`"0!#=P
+M0````)(0(`6`HB``,H``"^`60`":!``0`S__^X(08N"@`T`!D!``$$````"2
+M$"`*$(``$:`0``B0!#=00````)(0(`6`HB``$H``C;`0(`":!``0`S__^X(0
+M8J"@`T`!D!``$$````"2$"`*H!``"*H0(`&A+"`"H`P@_Y`0`!!`````DA`@
+M"*`0``B0$``4(P``*$````"2%&($PA9``("@:;0R@``&E`H_[Y02(!"0$``4
+M$(``!9(48@20$``4$P``*)(28@1`````I2P@!!"``%B#+.`"XA9``.`60`"0
+M$``00````)(0(`61*B`0D3(@$("B(`(R@``8X!9```,```6"$&$[@*0``3B`
+M`!/@%D``@@1__H,H8!"#,&`0D2A@`I`"``&0`@`(`S__T8(08("0`@`!0```
+M`)(0(!F0`B`!0````)(0(`B@$``($(``,Y`0(`"0$``00````)(0(!21*B`0
+M@*(@`#*```[@%D```P``!((08_^`I``!*(``">`60``1/__[D!(A0)`$``A`
+M````DA`@%!"``!R1*B`"D!``$$````"2$"`*D2H@$("B(``R@``)X!9``!$_
+M__N0$B%`D`0`"$````"2$"`*$(``#I`"``B0$``00````)(0(`61*B`0@*(@
+M`!*``".P$"``$3__^Y`2(4"0!``(0````)(0(`5`````DA`@"*`0``B0$"`!
+M0````)(0(`*F$``(I2P@!(,LX`*D%(`!@@5`%:04@`$A```$@A0@`:04@`&4
+M#*#_D!``%",``"9`````DA1@G*4TH`B4#*!_D!``%$````"2%&#8H!0B-/(E
+M`!"P$"`!@<?@"('H``"=X[^8IA``&)`0(`"J$"``DA`@`*@0(``#```+@A!C
+M[.(&``'"%F`"@@AA\("@8-`"@`!&I!`@`("@8-`4@``)@*!A0("@8*`"@``[
+M@*!@P"*``#\#```$$(`!,[`0(``"@``$@*!A4#*``2^P$"``PA9``((`<%^#
+M*&`0@S!@$("@9.HX@``'PA9```,```2:$&-4T!3`#1"``"6"$&-6&S__^IH3
+M8W2"`$`-@RA@$(,P8!"`H&#O.(``!\(60``#```$FA!C6-`4P`T0@``8@A!C
+M6AL___J:$V*$@@!`#8,H8!"#,&`0@*!@X#B```?:%D```P``!)H08US0%,`-
+M$(``"X(08UX#```%@A!B7("C0`$(@``3F!`@``,```2:$&-@T!3`#8(08V(0
+M@``,ZA3``0,```2:$&-DTA8`#1"```:"$&-F`P``!)H08VC2%,`-@A!C:N@4
+MP`&8$"```P```)808`"#*R`"FRL@`YH#0`O:`V`$F(,@`0*___O:)$`!F!`@
+M``,```"4$&``@RZ@$)<P8!"#*R`"@@!`$9H#``R:`T`,F@-`#9H#0`N;*V`"
+MV@*`#9B#(`$"O__WVB!@!)@0(``#````E!!@`(,NH!"7,&`0@RL@`H(`0!&:
+M`P`,F@-`#)H#0`V:`T`+FRM@`MH"@`V8@R`!`K__]]H@8`B8$"```P```)00
+M8`"#+J`0ES!@$(,K(`*"`$`1F@,`#)H#0`R:`T`-F@-`"YLK8`+:`H`-F`,@
+M`8"C("0(O__VVB!@#,(68`*`B&"``H``*:`$8`R3*F`0DS)@$)`0`!"4$"`#
+MEA`@\4````"8$"``DRT@$),R8!"0$``0E!`@`Y80(.Y`````F!`@`)`0`!"2
+M$"`!E!`@`980(2-`````F!`@`L(&(<R`H&`)`H``"("@8`H2@``?F!`@`,(6
+M(="`H&`#&(``'`,```"0$"`&0````)(0(`.2$``(D`1@#)00(`.6$""#$(``
+M#Y@0(`.3*B`0DS)@$)`0`!"4$"`#EA`@]T````"8$"``DRU@$),R8!"0$``0
+ME!`@`Y80(/28$"``0`````$```"8$"```P```)808`"#+J`0M3!@$(,K(`*"
+M`$`1F@,`#)H#0`R:`T`-F@-`&ILK8`+:`L`-F`,@`8"C(`((O__VVB!@H*`0
+M(``#````M!!@`(,L(`/2!H`!@RP@`M0$0`%`````D!``&*0$H`&`C*`_,H``
+M!:"$(`%`````D!`@`:"$(`$"O__T@RP@`Z`0(``#````M!!@`(($`!""`$`0
+M@RA@`](&@`&#+"`"@@!`$=0`8`1`````D!``&*0$H`&`C*`_,H``!:"$(`%`
+M````D!`@`:"$(`$"O__Q@@0`$*`0(``#````M!!@`(($`!""`$`0@RA@`](&
+M@`&#+"`"@@!`$=0`8`A`````D!``&*0$H`&`C*`_,H``!:"$(`%`````D!`@
+M`:"$(`$"O__Q@@0`$*`0(``#````M!!@`(($`!""`$`0@RA@`](&@`&#+"`"
+M@@!`$=0`8`Q`````D!``&*0$H`&`C*`_,H``!:`$(`%`````D!`@`:`$(`&`
+MI"`D"+__\(($`!"@$"```P```+008`""!``0@@!`$(,H8`/2!H`!@RP@`H(`
+M0!'4`&"@0````)`0`!BD!*`!@(R@/S*```6@!"`!0````)`0(`&@!"`!@*0@
+M`@B___""!``0`P``"X(08\3`),`!L!`@`8''X`B!Z````P``"X(08^R`HF`'
+M&(``$-`"``&#*F`"&P```)H38`#"`T`!@<!```$````0@``)D`(@!!"```>0
+M`B`($(``!9`"(`P0@``#D`(@H)`0(`"!P^`(`0```)WCOYB:$``;GA``'+80
+M`!JX$``8M2Z@$+4VH`^Q+B`0L3X@$,(60`"`I@`!%H``!;0&0!K`(\``$(``
+M)<`C0`"#+R`0@SA@$/H6O_Z`H$`=!H``#X"F0!J#+N`0@S!@$!"```."`'__
+M@SA@`<(CP``0@``7PB-``(,X8`'"(T``@@!@`1"``!+"(\``&H``$+H0`!F#
+M+R`0L3A@$,(70`"`H$`8`K__\8(G0!G"%V`"@*8``2:___&")T`9N@=@`H"G
+M0!HJO__WPA=``(''X`B!Z```G>._D*X0`!CL!Z!<F!``&900`!VR!D`9JA`@
+M`+LO8!"[-V`0@*=@`0B``$RP$"``@B:`#)LM8!"#*&`0@*!`#0J``$6")H`,
+MNRJ@$(,H8!"U,&`0D2Y@$)$Z(!"2$``;E3=@$)8'O_1___^QF`>_\,('O_"`
+MH&``$H``!)DW8!""$"`!PB>_\)H#/__"![_T@*!`#1*```:0`$`!@@,__L(G
+MO_3"![_TD`!``<('O_""`$`!VE;`",)6P`&`HT`!,H``!*,N8!`0@``6T!<`
+M"*,\8!#F![_TI@3`$^A6P!.0)$`4X`>_\*`$`!!`````TA<`$*00``C@5L`0
+MHB0`$=(7`!-`````D!``$:0$@`B@)``4D!``$D````"2$``0@RU@$(,P8!";
+M+>`&F@-``9H#0`W0-8`-@@5@`:H0``&#*&`0@S!@$("@0!H(O__"L@9@`K`0
+M(`&!Q^`(@>@``)WCOYBU+J`0M3:@$+,N8!"S-F`0@*:`&0*``!."$``;H2X@
+M$*$T(!"0)``9DR\@$$````"3.F`0HA``"*`F@!"3+N`0DSI@$$````"0$``0
+MH@1`")(F@!E`````D!``$8(0``BQ*&`0L3X@$(''X`B!Z```G>._>)`0`!GX
+M)Z!4^`>@7.H'H&"N$``9`P``"X(08*3R!@`!J!`@`)$J(!"1.B`0U!:@%)(0
+M`!J6![_D?___1Y@'O^"F$"``K`>_^((0(`.0($`3P@>_Y)H`0`&:`T`!@RM@
+M!)H#0`&:`T`-@@(`"((`0`B7*&`#F@-`"Y@#0!K"$R`@@*!@``*``)/D$R`@
+MF@4`%,(3(!["-P`-E`-`%M@3("S8,K_XV@>_X((#0`V"`$`-FRA@!((`0`V"
+M`$`!@@!`"X(`0!J9*R`0F3L@$-H08"S"4&`L@*,``32```+:,K_X@@4`%)(`
+M0!;"$G_X@RA@$)LX8!"#,&`?F@-``9L[8`':,G_XV@>_Y)4LH!"5,J`0@@-`
+M#8(`0`V;*&`$@@!`#9@"``B8`P`(F2L@`H(`0`R"`$`*@@!``8(`0!K6$&`J
+MUC)_\-H'O^""`T`-@@!`#9LH8`2"`$`-@@!`#((`0`J"`$`!@@!`&I<JX!"7
+M.N`0VA!@*L)08"J`HL`!-(```MHR?_"B!0`4H@1`%L(4?_"#*&`0E3A@$(,P
+M8!^4`H`!E3J@`=0T?_#25'_XP@>_Y)@`0`&8`P`!@RL@!)@#``&8`P`,H`(`
+M"*`$``BA+"`#F`,`$)@#`!J6`R`LF`,@(J4LH!"E-*`0\B.@7)`0`!1___\.
+MFA``$M)4?_C45'_PP@>_X)@`0`&8`P`!@RL@!)@#``&8`P`,F`,`$)@#`!J6
+M`R`LF`,@(H(&8@#"(Z!<D!``%'___OV:$``2PA1_\-H4?_B"($`-@RA@$("@
+M8``"@``?HA`@`(,MX!"Q,&`0F@4`%(('O_BD`T`!FRT@!IH#0!&:`T`-H`-`
+M&<('O^2"`$`!TA:``<('O^""`$`!U!:``=960`W85"(`?___.Y`0`!C0-"0`
+MH@1@`<(4O_#:%+_X@B!`#8,H8!"#,&`0@*1``0J__^N;+2`&J`4@`:8$X`&`
+MI.`#"+__78(0(`/"%[_PV@>@5,(S0`"B$"``@*1`%!J``(RF$"``K`>_^(,N
+MX!"W,&`0@@4__X"DP`$2@``(F`3`$YH$P!."`T`6PA!_\((`8`00@``*PC=`
+M#9H#`!;"4W_PVE-_^H(`0`V;,&`?@@!`#8,X8`'"-T`,@*3@``*```F@$"``
+M@@3`$YH`0!W@$W_^@@!`%L)0?_B@)``!H"0`&X,LX`>"`$`9VA!D`L(09`":
+M(T`!@A``#9LK8!"`HV``(H```H(0(`&`I"``%H``%)H0``&#+.`'N`!`&8,K
+M8!"E,&`0D!``$$````"2$``2PA<D`((`0`B8!$`1FRA@$("C8``6@``#H@1@
+M`8(0(`"@A"`!#+__],(U0`R"!,`3F@!`%M13?_#:4W_XE"*`#>070`&D!(`;
+MI"2`#8"B@!((@``#N!``"K@0`!*#+R`0@SA@$("D``$V@``/@RS@!I<LX`:8
+M$``!@@1`$9H"P!":`T`-F@-`&=H39`#:-4`!H`0@`8"D``P&O__XH@1@`8,L
+MX`:"`$`*@@!``8(`0!G:$&/^PA!C_)HC0`&"$``-FRM@$("C8``B@``"@A`@
+M`8"D@!P(@``>FA```8,LH!"#.&`0@*0``1:``!F#+.`&@@!`"H(`0`&P`$`9
+M@RM@$+4P8!"0)``<0````)(0`!K:%B/^F@-`")@$0!&#*V`0@SA@$("@8'\$
+M@``#H@1@`9H0('^@!"`!@RR@$(,X8!"`I``!!K__\-HU0`RF!.`!@*3`%`J_
+M_WR"!3__@*3@`QB```J`I&!_@@3`$YH`0!W:$W_^I@3@`8"DX`,(O__[VC=`
+M`8"D8'\8@``)`0```(($0!&:`$`5VA-__J($8`&`I&!_"+__^]HU0`&!Q^`(
+M@>@``)WCOX"F$``8`P``$8(08GCB!@`!PA;@`H((8-":&&#`@*``#9A@/_^"
+M&&#0@*```9I@/_\#```)@A!C_("3``T2@``,I`8``=H6X`*:"V"@`P``"((0
+M8^B`HV"@`H``!:0&``$#```'@A!CU*0&``&0$``8(0``*$````"2%")LE@H@
+M#Z@0``O2%L``^".@7.(CH&"0$``8E!``$I@'O^Y___YXF@>_\)`0`!A`````
+MDA0B6!4``#"4*@`*PA2@'((`?_^#*&`.&P``,(((0`V4$H`!D!``&$````"2
+M%")8PE>_[H"@8``"@``'VA>_[IH@``T#```+@A!C]!"```7:-,`!`P``"X(0
+M8_3`-,`!`P``*+@08H"@$"``FRP@`]040`V4"J#_F@-`$<(+8`.#*&`(E!*`
+M`<(+8`6#*&`0E!*``<(+8`>#*&`8E!*``9`0`!A`````DA``'*`$(`&`I"`?
+M"+__[K@'(`24#2`/PA>_\(,H8`2""&/PE!*``<(7O_*#*&`*&P``/X((0`V4
+M$H`!PA>_](,H8!`;``_`@@A`#902@`'"%[_V@RA@%AL#\`"""$`-E!*``9`0
+M`!@3```H0````)(28FR!Q^`(D>@@`9WCOY@#```1H!!B>-`&`!"`HB```H``
+M!@,```M``````0```,`F`!`#```+H!!C[-`&`!"`HB```H``!@,```M`````
+M`0```,`F`!`#```+H!!@I-`&`!"`HB```H``!0$```!``````0```,`F`!"!
+MQ^`(@>@``)@0(`"6$"`#@B+`#)H`0`&:`T`!FRM@`Y`#0`G"$B`(@*!@`"*`
+M``28`R`!$(``"-!2(!2`HR`#"+__]8(BP`R"$"``@RA@$)$X8!"!P^`(`0``
+M`)H0(`""`T`-E@!`#8,JX`."`$`)V!!@"("C(``B@``(F@-@`8,JX`*"`$`,
+M@@!``8(`0`D0@``(T%!@$H"C8`,(O__R@@-`#8(0(`"#*&`0D3A@$('#X`@!
+M````G>._F*@0`!C`-H``PA9@`H((8-":&&#`@*``#9A@/_^"&&#0@*```9I@
+M/_\#```)@A!C_("3``T2@``,@@8``=H68`*:"V"@`P``"((08^B`HV"@`H``
+M!8(&``$#```'@A!CU((&``&F`&`8V!!@%,(08!2`H&```H``J;`0(`#6%D``
+MPA3``("BP`$*@``3D!``%)LK(!";,V`0@@-`#8(`0`V;*&`$@@!`#8(`0`&"
+M`$`3PA!_FH"BP`$(@``6DA`@`,(4P`"`HL`!&H``"8,K(!"0$``4?___LY(0
+M`!/0-H``D!``%!"``(F2$``3@S!@$*``0`&@!``!@RP@!*`$``&@!``0H`3`
+M$!"``'J@!#^:@RL@$)00``&`H&```H``&9@0(`#"%D``EA```8,H8!"#,&`0
+MVA3``("@0`T(@``1@RK@$)4RH!"7,&`0DA``#)@#(`&`HP`*%H``"H(#``R"
+M`$`,FRA@!((`0`V"`$`!PA3``8"BP`$XO__VDA``#((#``R"`$`,FRA@!((`
+M0`V6`$`!\!3`"X("0`F"`$`)FRA@!((`0`VJ`$`!PA3`%;`F``&`IB``!(``
+M0Z0$P`N0$``4?___=Y(0`!*@$``(H2P@$*$\(!"B!,`5D!``%'___W"2$``1
+MD2H@$)$Z(!"@)``(TA9``,(4P!62(D`!0````)`0`!"@$``(D!``%'___V22
+M$``1D2H@$)$Z(!!`````DA``&*`$``B0$``00````)(0`!B1*B`8D3H@&-`V
+M@`"0$``4?___09(0`!*@$``(H2P@$*$\(!"0$``4?___.Y(0`!&1*B`0D3H@
+M$*`D``C2%D``PA3`%9(B0`%`````D!``$*`0``B0$``4?___+Y(0`!&1*B`0
+MD3H@$$````"2$``8H`0`")`0`!!`````DA``&)$J(!@0@``5D3H@&((#``R"
+M`$`,FRA@!((`0`V2`$`!VA9``,(4P`F`HT`!$H``#;`0(`"@!,`)D!``%'__
+M_RN2$``0T#:``)`0`!22$``0?___$0$```#0-L``L!`@`8''X`B!Z```G>._
+MD*(0(`"`I$`:&H``%:00(`&F![_V@RQ@`Z`&0`&0$``8DA``$)0'O_9___\L
+ME@>_]("B(``B@``&I!`@`,(,X`'"+"`&P@^_]<(L(`>B!&`!@*1`&@J___&#
+M+&`#@<?@")'H`!*=X[^80````)`0(*P#```+@A!C[("B(``"@``3T"8``2$`
+M`!&:%")\@A`A`,(F``V@%")X0````)`0(0"`HB```H``"=`F`!!`````D!`F
+M``,```N"$&"D@*(@`!*```;0)@`!@A`@`L(F0``0@``DL!`@`!L```N8$V"H
+M`P```((08`#")@`,F!-@K`,```""$&``PB8`#)@38+`#````@A!@`,(F``R8
+M$V"T`P```((08`#")@`,F!-@N`,```""$&``PB8`#)@38+P#````@A!@`,(F
+M``R8$V#``P```((08`#")@`,FA-@Q`,```""$&``PB8`#;`0(`&!Q^`(@>@`
+M```````H4!8L6"C_H/^C_Y[_H/^C_Z`````````````%``H`%``>`#(`1@!5
+M`%H`7P!D````"@`4`!X`*``R`#P`1@!0`%H`9````,(```#$````Q0```-``
+M``#:````Y````,(```##````U````/(```$-```!*````,\```#*``(A4``!
+M`4``!`"@``@`P``@`-``0`%0`````!F8`20&$"8`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````#_______\`````F`````!'``"8"````````)@,
+M"82.I@``F!`],N````"8%```!VL``)@<````````F"`"`@(```"8)```#@X`
+M`)@H"@("`0``F"P``V_\``"8,````````)@T```.#@``F#@````'``"8/``"
+M`0```)A`B6,`````F$03<A:<``"82``8MC,``)A,$H1A/```F%`-Z+C@``"8
+M5``'2%D``)A8?H"^N@``F%PQ.F9>``"88```'0@``)AD``'.````F&A`FD&0
+M``"8<`````\``)AT````@```F'@````$``"9`````````)D$````````F0@`
+M``````"9#`"``````)D0`````P``FP````````";!````"```)L(````$```
+MFPP````P``";$`````@``)L4````*```FQ@````H``";'`````0``)L@````
+M)```FR0````4``";*````#0``)LL````#```FS`````L``";-`````(``)LX
+M````(@``FSP````2``";0````#(``)M$````"@``FT@````J``";3`````$`
+M`)M0````(0``FU0````1``";6````#$``)M<````"0``FV`````I``";9```
+M``4``)MH````)0``FVP````5``";<````#4``)MT````#0``FW@````M``";
+M?`````,``)N`````(P``FX0````3``";B````#,``)N,````"P``FY`````K
+M``";E`````<``)N8````)P``FYP````7``";H````#<``)ND````#P``FZ@`
+M```O``";K````"\``)NP````+P``F[0````O``";N````"\``)N\````+P``
+MF\`````O``";Q````"\``)O(````+P``F\P````O``";T````"\``)O4````
+M+P``F]@````O``";W````"\``)O@````+P``F^0````O``";Z````"\``)OL
+M````+P``F_`````O``";]````"\``)OX````+P``F_P````O``":`````!T`
+M`)H$````70``F@@```"=``":#````-T``)H0```!'0``FA0````A``":&```
+M`&$``)H<````H0``FB````#A``":)````#$``)HH````<0``FBP```"Q``":
+M,````!P``)HT````7```FC@````I``":/````&D``)I`````J0``FD0````@
+M``":2````!D``)I,````60``FE````"9``":5````#```)I8````!0``FEP`
+M```E``":8````&4``)ID````I0``FF@````H``":;````&@``)IP````'P``
+MFG0````>``":>````!@``)I\````6```FH````"8``":A`````,``)J(````
+M!```FHP```!$``":D````(0``)J4````$P``FI@````2``":G````%(``)J@
+M````D@``FJ0```#2``":J````"L``)JL````*@``FK````!J``":M````*H`
+M`)JX````&P``FKP````:``":P````%H``)K$````F@``FL@```#:``":S```
+M``8``)K0````!@``FM0````&``":V`````8``)K<````!@``FN`````&``":
+MY`````8``)KH````!@``FNP````&``":\`````8``)KT````!@``FO@````&
+M``":_`````8``)C4````(```F,P````$``"8R``&`08``)B<````;0``F,``
+M``````"8T````!0)"0```````@(&!@8&!@8"`@`````#``8`"0`\````````
+M``````````````````#P````S`````````````````````H```````#B"@``
+M(`$```(!```80```````!!@95P0%!A`F````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````"6P)CPFT``#_______\````````````@````(````$``
+M``!```8````&````!@``````,````!4````5````'0```!4``!!``"_\#P`O
+M_`\`+_P?`"_\#P``$$0`+_P/`"_\#P`O_!\`+_P/```02``O_`\`+_P/`"_\
+M'P`O_`\``!!,`"_\#P`O_`\`+_P?`"_\#P``$%``+_P/`"_\#P`O_!\`+_P/
+M```05``O_`\`+_P/`"_\'P`O_`\``!!8`"_\#P`O_`\`+_P?`"_\#P``$%P`
+M+_P/`"_\#P`O_!\`+_P/```08``O_`\`+_P/`"_\'P`O_`\``!!D`"_\#P`O
+M_`\`+_P?`"_\#P``$'````%H```!X````;@```%H```0,````C````'@````
+ML````C```!"P```-F```$8```!](```-F```$/```*#@``%`:```6(```*#@
+M``"`%`0`!``(``@`(``P``0`!````(`<#HV/IPZ-C\\!8(^5#HV/IP``F`0`
+M`````````P````````````"8(`("`@`"`@(``@$"``("`@```)@D```.#@``
+M#@X```<'```.#@``F"@*`@`!"@(``04!```*`@`!``"8-```#@X```X.```.
+M#@``#@X``)@X````!P````<````+````"P``F$03<A:<$W(6I1-R%J@3<A:<
+M``"82``8NF<`&+IG`!BZ:0`8NFD``)A0#"BTX`PHM.`,*+3@#"BTX```F%A^
+M@`TN?H`-+G[`#2Y^@`TN``"87#$W75XQ-UU>,3I=7C$W75X``)A@``"]$```
+MO1```+TX``"]$```F&0``<X```'.```!S@```<X```"9%```)Q```"<0```5
+M?```)Q```)D8```!D````9````"$```!D```F41OX!`@;^`0(&_@"2!OX!`@
+M``"A@`7_%/\%_Q3_!?\4_P7_&?\``)C4````$````!0````0````$`````P`
+M````````*(2$G)P````L?'Q\?````#0````%````0`````````!$````"```
+M`$@````(````3````!````!0`````````%0````?```(``````````@$````
+M````"`@````````(#`````````@0````````"!0````````(&`````````@<
+M````````""`````````()````````!(P````````@`0```````"`"```````
+M`(`,````````@!@```````"`)````````(`H````,```@"P`!___``"`,`'_
+M__\``(`T````,0``@#@```````"`/````````(!`````````@$0````"``"`
+M2````````(!4````````@%@```````"8"````````)@,+820DP``F!!],N``
+M``"8%```#VL``)@<````````F"P``F_^``"8,````````)@\``(!````F$`@
+M:@%Z``"83!*$83P``)A4```(60``F&A`FD&0``"8;`4,L($``)AP````#P``
+MF'0```"```"8>`````P``)D`````````F00```````"9"````````)D,`(``
+M````F1`````!``"9'```"2H``)D@````````F20`!8H%``"9*`````$``)DL
+M````````F3````````"9-````````)DX````````F3P````_``"90`````0`
+M`)E(````````F4P```````"94````````)E475#Q3```F5@````8``"97`!+
+M:HX``*&$!O\%_P``H8@'_P?_``"AC`C_"/\``*&0"?\)_P``H90*_PK_``"A
+MF`O_"_\``*&<#/\,_P``H:`-_PW_``"AI`__#O\``*&H$O\2_P``H:P4_Q/_
+M``"AL!;_%?\``*&T&?\7_P``H;@;_QK_``"AO![_'?\``*'`(_\@_P``H<0G
+M_R7_``"AR"S_*?\``*',,?\O_P``H=`W_S3_``"AU#K_.O\``*'8.O\Z_P``
+MH=PZ_SK_``"AX#K_.O\``*'D.O\Z_P``H>@Z_SK_``"A[#K_.O\``*'P.O\Z
+M_P``H?0Z_SK_``"A^#K_.O\``*'\.O\Z_P``FP````````";!````"```)L(
+M````$```FPP````P``";$`````@``)L4````*```FQ@````$``";'````"0`
+M`)L@````%```FR0````T``";*`````P``)LL````+```FS`````"``";-```
+M`"(``)LX````$@``FSP````R``";0`````H``)M$````*@``FT@````&``";
+M3````"8``)M0````%@``FU0````V``";6`````X``)M<````+@``FV`````!
+M``";9````"$``)MH````$0``FVP````Q``";<`````D``)MT````*0``FW@`
+M```%``";?````"4``)N`````%0``FX0````U``";B`````T``)N,````+0``
+MFY`````#``";E````",``)N8````$P``FYP````S``";H`````L``)ND````
+M*P``FZ@````K``";K````"L``)NP````*P``F[0````K``";N````"L``)N\
+M````*P``F\`````K``";Q````"L``)O(````*P``F\P````K``";T````"L`
+M`)O4````*P``F]@````K``";W````"L``)O@````*P``F^0````K``";Z```
+M`"L``)OL````*P``F_`````K``";]````"L``)OX`````@``F_P````6``"8
+MU````"```)C8`&`0:```F@````&I````````F@0```'I````0```F@@````I
+M````@```F@P```!I```!4```FA````&9```!D```FA0```'9```!T```FA@`
+M```9````$```FAP```!9````1```FB````"9````A```FB0```&E```!2```
+MFB@```'E```!B```FBP````E```!R```FC````'(````%```FC0````(````
+M0@``FC@```!(````@@``FCP```"(```!>```FD````&8```!N```FD0```'8
+M```!^```FD@````8````$@``FDP```!8````4@``FE````"8````D@``FE0`
+M``&D```!?```FE@```'D```!O```FEP````D```!_```FF````!D````"@``
+MFF0```"D````2@``FF@```#D````B@``FFP```$*```!6@``FG````%*```!
+MF@``FG0```&*```!V@``FG@```'*````#@``FGP````*````3@``FH````!*
+M````C@``FH0```"*```!7@``FH@```&Z```!G@``FHP```'Z```!W@``FI``
+M```Z````"0``FI0```!Z````20``FI@```&&````B0``FIP```'&```!>0``
+MFJ`````&```!N0``FJ0```!&```!^0``FJ@```"&````.0``FJP```#&````
+M>0``FK````#&````N0``FK0```#&```!O0``FK@```#&```!_0``FKP```#&
+M````/0``FL````#&````?0``FL0```#&````O0``FL@```#&````_0``FLP`
+M``#&````_0``FM````#&````_0``FM0```#&````_0``FM@```#&````_0``
+MFMP```#&````_0``FN````#&````_0``FN0```#&````_0``FN@```#&````
+M_0``FNP```#&````_0``FO````#&````_0``FO0```#&````_0``FO@```#&
+M````_0``FOP```#&````_0````$```!&`&````````$```!&`&$```````$`
+M``!&`&(```````$```!&`&,```````$```!&`&0```````$```!&`&4`````
+M``$```!&`&8```````$```!&`&<```````$```!&`&@```````$```!&`&D`
+M``````$```!&`&H```````$```!&`&L```````$```!&`&P```````$```!&
+M`'0```````$```!&`'0```````$```!&`'0```````$```!&`'0```````$`
+M``!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'0`````
+M``$```!&`'4```````$```!&`'8```````$```!&`'<```````$```!&`'@`
+M``````$```!&`'D```````$```!&`'H```````$```!&`'L```````$```!&
+M`'P```````$```!&`'T```````$```!&`'X```````$```!&`'\```````$`
+M``!&`(````````$```!$`'P```````$```!&`(@```````$```!&`(P`````
+M``$```!&`)````````$```!&`)0```````$```!&`)@```````$```!&`)P`
+M``````$```!&`*````````$```!&`*0```````$```!&`*@```````$```!&
+M`*P```````$```!&`+````````$```!&`+0``````````@<`%IX`"Q9B``H6
+M.@`)%AP`"!7J``<5F@`%%4H`!!4#``(460```````0````,`!@`)`#\`````
+M``D````$``0``0`!``$````&1D<X```````````````````$`````0`!````
+M!$9'-P```````````````````P`!``$``0````-&1S8`````````````````
+M``0```````$````!1D<U```````````````````$``$``0```````$9'-```
+M````````````````!`````$``/____Y&1S,```````````````````,``0`!
+M``#____]1D<R```````````````````$````````_____$9',0``````````
+M`````````@`!``$``/____I&1S``````````````````````````````````
+M`````````````````````!E4$!0&$"8`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````);`F/";0)"`EL";0`````________!0(/!P(/"@`/"0`/
+M`````````````````"`````@````0````$``!@````8````&```6G@`+%F(`
+M"A8Z``D6'``(%>H`!Q6:``452@`$%0,``A19```+N``!```````````````&
+M`````0````(````#````!`````4``!!``"_\#P`O_`\`+_P?`"_\#P`O_`\`
+M`!!$`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!(`"_\#P`O_`\`+_P?`"_\#P`O
+M_`\``!!,`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!0`"_\#P`O_`\`+_P?`"_\
+M#P`O_`\``!!4`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!8`"_\#P`O_`\`+_P?
+M`"_\#P`O_`\``!!<`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!@`"_\#P`O_`\`
+M+_P?`"_\#P`O_`\``!!D`"_\#P`O_`\`+_P?`"_\#P`O_`\``!`P```",```
+M`>````"P```!8````>```!!P```!:````>````&X```!C````>```!"P```.
+M8```$8```!\<```^.```$8```!#P``"@X``!0&@``%B```"PX``!0&@``(`4
+M`^@#Z`;@!N`$(`0@"$`(0`;@!N```)@$``````````,```````````````,`
+M`)@@`@("``("`@`"`0(``@("``("`@```)@D```.#@``#@X```<'```.#@``
+M#@X``)A$$W(6'!-R'"43<A<B$W(6HA-R'"4``)A@``"=$```G1```)T8``"=
+M&```G1```)AD``'.```!S@```<X```'.```!S@```)AH0)I!D$":09!`FD&0
+M0)I!D$":09```)D8```!N````;@```"$```!"````;@``)DD$`6*!1`%B@40
+M!8H%$`6*!1`%B@4``*(P```````````````````!"``````````,````````
+M`#0````%````0`````````!$````"````$@````(````3````!````!0````
+M`````%0````?```(``````````@$````````"`@````````(#`````````@0
+M````````"!0````````(&`````````@<````````""`````````()```````
+M`!)P````````$#@````````0>````````!"X````````$/@````````1.```
+M`````!%X````````$;@````````1^````````!(X````````$G@````````2
+MN````````!+X````````$S@````````3>````````!.X````````$_@`````
+M```4.````````!1X````````%+@````````4^````````!4X````````%7@`
+M```````5N````````!7X````````%C@````````6>````````!:X````````
+M%O@````````7.````````!=X````````%[@````````7^````````!`\````
+M````$'P````````0O````````!#\````````$3P````````1?````````!&\
+M````````$?P````````2/````````!)\````````$KP````````2_```````
+M`!,\````````$WP````````3O````````!/\````````%#P````````4?```
+M`````(`$````````@`@```````"`#````````(`@````````@"0```````"`
+M*````#```(`L``?__P``@#`!____``"`-````#$``(`X````````@#P`````
+M``"`2````````(!4````````@%@```````"`7``/QX\``(#`*H(P&@``@,0%
+MW`'@``"`R!]`)Q```(#,`?0`````@-```!X<``"`U``"JJH``(#8`@!550``
+M@-P```````"`X/____\``(#D``#__P``@.@```````"`[````````(#P````
+M````@/0```````"`^````````(#\````B```AP````````"'!````(P``(<(
+M````Y```APP```+5``"'$````````(<4````````AQ@```"@``"''````<D`
+M`(<@````+```AR0````L``"'*````#```(<L````/```AS`````L``"'-```
+M`"P``(<X````,```ASP````\``"'0````````(=$````````AT@```````"'
+M3````````(=0````````AU0```````"'6````````(=<````````AV````#5
+M``"'9````-\``(=H```!`@``AVP```$Z``"'<````'4``(=T````?P``AW@`
+M``"B``"'?````````($```$``@``@00````!``"!"````,```($,````````
+M@1````%H``"!%````````(?``P(!````A\0'!@4$``"'R`L*"0@``(?,#PX-
+M#```A]`3$A$0``"'U!<6%10``(?8&QH9&```A]P?'AT<``"'X`,"`0```(?D
+M!P8%!```A^@+"@D(``"'[`\.#0P``(?P$Q(1$```A_07%A44``"'^!L:&1@`
+M`(?\'QX='```F`RMA(X9``"8$'THX````)@4G`J?:P``F!P```````"80"!J
+M`7H``)A4```(60``F0````````"9!````````)D(````````F0P`@`````"9
+M$`````$``)D<```,@```F2`%$`````"9*`````$``)DL````!```F30>'R`B
+M``"9.`H+#`T``)D\````/P``F4B2@+(2``"95%U0X8@``)E<`$MJC@``F6@`
+M``/.``"9<!DOM14``)EX`````0``F7P```````"B$`"`8S,``*(4`!!L$```
+MHA@`G$!@``"B(`&(,,8``*(D```$````HBP```````"B-"`@("```*(X("`@
+M(```HD`X20H@``"B1```>[8``*)(#_\__```FP````````";*`````P``)LX
+M````$@``FV0````A``";C````"T``)N<````,P````,`!@`)`#\````#``8`
+M"0`_````"0````0`!``!``$``0``````````````!D9'.```````````````
+M````!`````$``0``````````````!$9'-P```````````````````P`!``$`
+M`0```````````````T9'-@``````````````````!````````0``````````
+M`````49'-0``````````````````!``!``$``````````````````$9'-```
+M````````````````!`````$`````````````_____D9',P``````````````
+M`````P`!``$`````````````_____49',@``````````````````!```````
+M````````````_____$9',0```````````````````@`!``$`````````````
+M____^D9',```````````````````````````````````````````````````
+M```````````````````(`````0`#```````````````````````&1D<W````
+M```````````````"````````````````````````1D<V````````````````
+M```!``````````````````#____]1D<U````````````````````````````
+M``````````#____Z1D<T``````````````````````$``0````````````#_
+M___X1D<S``````````````````````$``0````$``0````#____V1D<R````
+M``````````````````$````!``$``0````#____S1D<Q````````````````
+M``````$````!``$````!``#____P1D<P````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````#```(`5``"`%0``@!4``(`5``"`%0``
+M@!P2C8^G"8@/SP3@#Y42X`^K"8@/SP``F"@*`@`!"@(``04!`0`*`@`!"@(`
+M`0``F#0```X.```.#@``#@X```X.```.#@``F#@````'````!P````L````+
+M````"P``F$@`&-I:`!C:6@`8RFD`&,II`!C*:0``F%`-Z+3@#>BTX`WHM.`-
+MZ+3@#>BTX```F%A^@`TN?H`-+G[H32Y^Z$TN?H`-+@``F%PQ-V9>,3=F7C$W
+M9EXQ-V9>,3=A7@``F&P%#+"!!0RP@04,L($%#+"`!0RP@```F10``"<0```G
+M$```%7P``"KX```G$```F43WN!`@][@0(/>X#2#WN!`@][@0(```H@QD+$%J
+M9"Q!:F1`06ID0$%J9$!!:@``HAP8@X`*&(.`"AAS@`H8@X`*&(.`"@``$C``
+M``````"8"````````)@L``(O_@``F#P``@$```"83!*$83P``)DP``!(@P``
+MF4`````$``"96````/\``)ET````````F?@````8``"B!````````*((T#YG
+MB```HB@```&U``"B/!/(B:\``)L$````(```FP@````0``";#````#```)L0
+M````"```FQ0````H``";&`````0``)L<````)```FR`````4``";)````#0`
+M`)LL````+```FS`````"``";-````"(``)L\````,@``FT`````*``";1```
+M`"H``)M(````!@``FTP````F``";4````!8``)M4````-@``FU@````.``";
+M7````"X``)M@`````0``FV@````1``";;````#$``)MP````"0``FW0````I
+M``";>`````4``)M\````)0``FX`````5``";A````#4``)N(````#0``FY``
+M```#``";E````",``)N8````$P``FZ`````+``";I````"L``)NH````*P``
+MFZP````K``";L````"L``)NT````*P``F[@````K``";O````"L``)O`````
+M*P``F\0````K``";R````"L``)O,````*P``F]`````K``";U````"L``)O8
+M````*P``F]P````K``";X````"L``)OD````*P``F^@````K``";[````"L`
+M`)OP````*P``F_0````K``";^`````(``)O\````%@``F)P`````````````
+M````````````````F)P`````````````````````````````F)P`````````
+M````````````````````F)P`````````````````````````````F)P`````
+M````````````````````````F)P`````````````````````````````F)P`
+M````````````````````````````F)P`````````````````````````````
+MF)P`````````````````````````````F)P`````````````````````````
+M````F)P`````````````````````````````F)P`.````#@````X````.```
+M`#@`````F)P`````````````````````````````F)P`````````````````
+M````````````F)P``````````````,````"`````@```F)P`!`#Y``0`^0`$
+M`/\`!`#]``0`_0``F-0```````````````0````$````!```F@````&I````
+M````F@0```'I````0```F@@````I````@```F@P```!I```!4```FA````&9
+M```!D```FA0```'9```!T```FA@````9````$```FAP```!9````1```FB``
+M``"9````A```FB0```&E```!2```FB@```'E```!B```FBP````E```!R```
+MFC````'(````%```FC0````(````0@``FC@```!(````@@``FCP```"(```!
+M>```FD````&8```!N```FD0```'8```!^```FD@````8````$@``FDP```!8
+M````4@``FE````"8````D@``FE0```&D```!?```FE@```'D```!O```FEP`
+M```D```!_```FF````!D````"@``FF0```"D````2@``FF@```#D````B@``
+MFFP```$*```!6@``FG````%*```!F@``FG0```&*```!V@``FG@```'*````
+M#@``FGP````*````3@``FH````!*````C@``FH0```"*```!7@``FH@```&Z
+M```!G@``FHP```'Z```!W@``FI`````Z````"0``FI0```!Z````20``FI@`
+M``&&````B0``FIP```'&```!>0``FJ`````&```!N0``FJ0```!&```!^0``
+MFJ@```"&````.0``FJP```#&````>0``FK````#&````N0``FK0```#&```!
+MO0``FK@```#&```!_0``FKP```#&````/0``FL````#&````?0``FL0```#&
+M````O0``FL@```#&````_0``FLP```#&````_0``FM````#&````_0``FM0`
+M``#&````_0``FM@```#&````_0``FMP```#&````_0``FN````#&````_0``
+MFN0```#&````_0``FN@```#&````_0``FNP```#&````_0``FO````#&````
+M_0``FO0```#&````_0``FO@```#&````_0``FOP```#&````_0``F-0````@
+M``"8U````!`````4````$````!`````4``"8V`!@$&@`8!!H`&`0:`!@$&@`
+M8!!H``"8G`````````````````````````````"8G```````````````````
+M``````````"8G`````````````````````````````"8G```````````````
+M``````````````"8G`````````````````````````````"8G!`````0````
+M$````!`````0``````"8G`0````$````!`````0````$``````"8G```````
+M``````````````````````"8G`````````````````````````````"8G```
+M``````````````````````````"8G```````````"@````````````````"8
+MG``X`,``.`"``C@`P``X`,``.`#```"8G``"``8``@`&````!@`"``8``@`&
+M``"8G````(D```")````B0```(D```")``"8G````*````"@````H````*``
+M``"@``"8G``$``<`!``'``0`!P`$``<`!``'``"8U````!H````:````&@``
+M`!H````:``"8G````$````!(````0````$````!```"8G````!`````0````
+M$````!`````0``"8G`````@````(````"`````@````(``"8G````$\```!/
+M````3P```$\```!/``"8G````/$```#Q````80```/$```#Q``"8G```D$\`
+M`)!/``"03```D$\``)!/``"8G```$EH``!):```2F@``$EH``!):``"8S```
+M``X````.````#P````X````.`````0```$8`8````````0```$8`80``````
+M`0```$8`8@```````0```$8`8P```````0```$8`9````````0```$8`90``
+M`````0```$8`9@```````0```$8`9P```````0```$8`:````````0```$8`
+M:0```````0```$8`:@```````0```$8`:P```````0```$8`;````````0``
+M`$8`=````````0```$8`=````````0```$8`=````````0```$8`=```````
+M`0```$8`=````````0```$8`=````````0```$8`=````````0```$8`=```
+M`````0```$8`=0```````0```$8`=@```````0```$8`=P```````0```$8`
+M>````````0```$8`>0```````0```$8`>@```````0```$8`>P```````0``
+M`$8`?````````0```$8`?0```````0```$8`?@```````0```$8`?P``````
+M`0```$8`@````````0```$0`?````````0```$8`B````````0```$8`C```
+M`````0```$8`D````````0```$8`E````````0```$8`F````````0```$8`
+MG````````0```$8`H````````0```$8`I````````0```$8`J````````0``
+M`$8`K````````0```$8`L````````0```$8`M```%IX`!A9B``06.@`#%AP`
+M`A7J``$5F@``%4H``!4#``$460`#"[@`!0`````````P``"`%0``@!4``(`5
+M``"`%0``@!4``(`<$HV3IPF($\\$X!.5$N`3JPF($\\``)@H"@(``0H"``$%
+M`@$`"@(``0H"``$``)@T```.#@``#@X```X.```.#@``#@X``)@X````!P``
+M``<````+````"P````L``)A(`!C:;0`8VFT`&,IU`!C*=0`8RG4``)A0#>BT
+MX`WHM.`-Z+3@#>BTX`WHM.```)A8?H`-+GZ`#2Y^Z`TN?N@-+GZ`#2X``)A<
+M,3=F7C$W9EXQ-V9>,3=F7C$W9EX``)AL!0RP@04,L($%#+"!!0RP@04,L($`
+M`)D4```'T```!]````1,```(F```!]```)E$][@0(/>X$"#WN`T0][@0$/>X
+M$!```*($```````````````(````"`````@``*((UKYGB-:^9XC0/F>(T#YG
+MB-`^9X@``*(,9"P!0&0L`4!D0L%@9$+!8&1"P6```*(<&(.`"AB#@`H8<X`*
+M&(.`"AB#@`H``!(P````````F`@```````"8+``"+_X``)@\``(!````F$P2
+MA&$\``"9,```2((``)E`````!```F5@```#_``"9=````````*(H```!M0``
+MHCP3R(FO``";!`````$``)L(`````@``FPP````#``";$`````0``)L4````
+M!0``FQ@````(``";'`````D``)L@````"@``FR0````+``";+`````T``)LP
+M````$```FS0````1``";/````!,``)M`````%```FT0````5``";2````!@`
+M`)M,````&0``FU`````:``";5````!L``)M8````'```FUP````=``";8```
+M`"```)MH````(@``FVP````C``";<````"0``)MT````)0``FW@````H``";
+M?````"D``)N`````*@``FX0````K``";B````"P``)N0````,```FY0````Q
+M``";F````#(``)N@````-```FZ0````U``";J````#4``)NL````-0``F[``
+M```U``";M````#4``)NX````-0``F[P````U``";P````#4``)O$````-0``
+MF\@````U``";S````#4``)O0````-0``F]0````U``";V````#4``)O<````
+M-0``F^`````U``";Y````#4``)OH````-0``F^P````U``";\````#4``)OT
+M````-0``F_@````0``";_````!H``)H`````!P````<``)H$````1P```$<`
+M`)H(````AP```(<``)H,```!H````:```)H0```!X````>```)H4````(```
+M`"```)H8````8````&```)H<```!H0```:$``)H@```!X0```>$``)HD````
+M(0```"$``)HH````80```&$``)HL```!8@```6(``)HP```!H@```:(``)HT
+M```!X@```>(``)HX````(@```"(``)H\````8@```&(``)I````!8P```6,`
+M`)I$```!HP```:,``)I(```!XP```>,``)I,````(P```",``)I0````8P``
+M`&,``)I4```!A````80``)I8```!Q````<0``)I<````!`````0``)I@```!
+MZ@````L``)ID````*@```$L``)IH````:@```(L``)IL````J@```:P``)IP
+M```!JP```>P``)IT```!ZP```"P``)IX````*P```!(``)I\````:P```%(`
+M`)J`````JP```)(``)J$```!K````9,``)J(```![````=,``)J,````+```
+M`!,``)J0````.@```%,``)J4````>@```),``)J8````N@```90``)J<```!
+MNP```=0``)J@```!^P```!0``)JD````.P```#H``)JH````>P```'H``)JL
+M````NP```+H``)JP```!O````;L``)JT```!_````?L``)JX````/````#L`
+M`)J\````?````'L``)K`````O````+L``)K$````_````;P``)K(````_```
+M`?P``)K,````_````#P``)K0````_````'P``)K4````_````+P``)K8````
+M_````/P``)K<````_````/P``)K@````_````/P``)KD````_````/P``)KH
+M````_````/P``)KL````_````/P``)KP````_````/P``)KT````_````/P`
+M`)KX````_````/P``)K\````_````/P``)C4````(```F-`#!@0(`P<$"`,&
+M!`@#!@0(`P<$"```F-P`H"#``*`@P`#@(,``X"#``.`@P```F)P/````#P``
+M``\````/````#P``````F)P`````````````````````````````F)P`@```
+M`(````"`````@````(``````F)P`*@```"H````J````*@```"H`````F)P`
+M`0````$````!`````0````$`````F)P`````````````````````````````
+MF)P`&````!@````8````&````!@`````F)P`8````&````!N````;@```&X`
+M````F)P`QP```,<```#'````QP```,<`````F)P`2P```$L```!+````2P``
+M`$L`````F)P$2```!$@```1(```$2```!$@`````F)P`3````$P```!,````
+M3````$P`````F)P`Y````.0```#D````Y````.0`````F)P`````````````
+M````````````````F)P`_````/P```#\````_````/P`````F)P`_P```/\`
+M``#_````_P```/\`````F)P$/P``!#\```0_```$/P``!#\`````F)P`#```
+M``P````,````#`````P`````F)P"&0```AD```(9```"&0```AD`````F)P`
+M)````"0````D````)````"0`````F)P`M````+0```"T````M````+0`````
+MF)P`F0```)D```"9````F0```)D`````F)P`4````%````!0````4````%``
+M````F)P`*@```"H````J````*@```"H`````F)P`$@```!(````2````$@``
+M`!(`````F)S`,@``P#(``,`R``#`,@``P#(`````F)P!=````70```%T```!
+M=````70`````F)P`$0```!$````1````$0```!$`````F)R&*```AB@``(8H
+M``"&*```AB@`````F)PQA```,80``#&$```QA```,80`````F)P`\@"``/(`
+M@`#R`(``\@"``/(`@```F)P`)P`9`"<`&0`G`!D`)P`9`"<`&0``F)P````#
+M`````P````,````#`````P``F)P`````````````````````````````F)P`
+M``"R````L@```+(```"R````L@``F)P`L""$`+`@A`"P((0`L""$`+`@A```
+MF)P`026D`$$EI`!!):0`026D`$$EI```F)P`$9(@`!&2(``1DB``$9(@`!&2
+M(```F)P`&D@``!I(```:2```&D@``!I(````F-@`"P(P``L",``+`C``"P(P
+M``L",```F)P```"4````E````)0```"4````E```F)P```"1````D0```)$`
+M``"1````D0``F)P````2````$@```!(````2````$@``F)P```"`````@```
+M`(````"`````@```F)P```#9````V0```-D```#9````V0``F)P```!@````
+M8````&````!@````8```F)P```#P````\````/````#P````\```F)P```"B
+M````H@```*(```"B````H@``F)P```!2````4@```%(```!2````4@``F)P`
+M``#4````U````-0```#4````U```F)P``!3,```4S```%,P``!3,```4S```
+MF)P```2,```$C```!(P```2,```$C```F,0````#`````P````,````#````
+M`P```#`````5````%0```!4````5````%0``@!P2C9.G"8@3SP3@$Y42X!.K
+M"8@3SP``F"@*`@`!"@(``04"```*`@`!"@(``0``F#0```X````.````#@``
+M``X````.````F#@````"`````@````H````*````"@``F$@`&-IM`!C:;0`:
+M:F0`&FID`!IJ9```F%`-Z+3@#>BTX`WHL-H,F+#:#>BPV@``F%A^@`TN?H`-
+M+G[H#2Y^R`TN?H`-+@``F%PQ-V9>,3=F7C$W9EXQ.6!>,3=F7@``F&P%#+"!
+M!0RP@04,L($%#+"!!0RP@0``F10```?0```'T```!$P```B8```'T```F43W
+MN!``][@0`/>X#0#WN!``][@0````H@0`````````````````````````````
+MH@C6OF>(UKYGB-`^9XC0/F>(T#YGB```H@P`+`%``"P!0`!"P4``0L%``$+!
+M0```HAP8@X`*&(.`"AAC@`H8@X`*&(.`"@``$C````/@``"`8`````\``($8
+M````````@1P```````"!(````````($D````````@2@```````"!+```````
+M`($P````````@30```````"!.````````($\````````@4"```"H``"!1```
+M`````)@(````````F"P``*````"8/``@!````)A,$H0C/```F'`````?``"8
+M=````(```)AX````#@``F5@```#_``"9@````````)F$`H``````F:``````
+M``"9X````````)GDJJJJJ@``F>@\1F1X``"9[````*H``)GP````#```F?0`
+M``#_``"9^````!0``*(H```)M0``HCR3R(FO``"B3`````$``*)0``"@````
+MHE0```````"B6`S'4X```*)<#P\/`0``HF!?:0\!``"B9`!!BA$``*)H````
+M````HFP,,,%J``"B<`""""```*)T`!M\J@``HG@<YSG.``"B?`47`<X``*,`
+M&`$`````HP0P`R8"``"C"$@'/@8``*,,5@M,"@``HQ!D&F`/``"C%'A/;AL`
+M`*,8AH]\6@``HQR.SX9;``"C()U/EP\``*,DI<^ACP``HRBU7Z\?``"C++W?
+MN9\``*,PS7_'/P``HS35_]&_``"C.````````*,\````````HT````````"C
+M1````````*-(/____P``HTP_____``"C4#____\``*-4``/__P``HUAYJ*H?
+M``"C7`9L0@\``*-@#R@B!P``HV078!:%``"C:!^`$00``*-L-Z`,`P``HW`_
+MQ`B#``"C=%?`"`,``*-X7]@&@@``HWQ_X`2"``"C@'\\>[H``*.$\S!_\```
+MFP0````!``";"`````(``)L,`````P``FQ`````$``";%`````4``)L8````
+M"```FQP````)``";(`````H``)LD````"P``FRP````-``";,````!```)LT
+M````$0``FSP````3``";0````!0``)M$````%0``FT@````8``";3````!D`
+M`)M0````&@``FU0````;``";6````!P``)M<````'0``FV`````@``";:```
+M`"(``)ML````(P``FW`````D``";=````"4``)MX````*```FWP````I``";
+M@````"H``)N$````*P``FX@````L``";D````#```)N4````,0``FY@````R
+M``";H````#0``)ND````-0``FZ@````U``";K````#4``)NP````-0``F[0`
+M```U``";N````#4``)N\````-0``F\`````U``";Q````#4``)O(````-0``
+MF\P````U``";T````#4``)O4````-0``F]@````U``";W````#4``)O@````
+M-0``F^0````U``";Z````#4``)OL````-0``F_`````U``";]````#4``)OX
+M````$```F_P````:``":``````````````":!`````````!```":"```````
+M``"```":#`````````&!``":$`````````'!``":%``````````!``":&```
+M``````!!``":'`````````"!``":(`````````%H``":)`````````&H``":
+M*`````````'H``":+``````````H``":,`````````!H``":-`````````&)
+M``":.`````````')``":/``````````)``":0`````````!)``":1```````
+M``")``":2`````````&0``":3`````````'0``":4``````````0``":5```
+M``````!0``":6`````````"0``":7`````````&1``":8`````````'1``":
+M9``````````1``"::`````````!1``":;`````````"1``":<`````````%X
+M``":=`````````&X``":>`````````'X``":?``````````X``":@```````
+M``!X``":A`````````&9``":B`````````'9``":C``````````9``":D```
+M``````!9``":E`````````"9``":F`````````#9``":G`````````#Y``":
+MH`````````#Y``":I`````````#Y``":J`````````#Y``":K`````````#Y
+M``":L`````````#Y``":M`````````#Y``":N`````````#Y``":O```````
+M``#Y``":P`````````#Y``":Q`````````#Y``":R`````````#Y``":S```
+M``````#Y``":T`````````#Y``":U`````````#Y``":V`````````#Y``":
+MW`````````#Y``":X`````````#Y``":Y`````````#Y``":Z`````````#Y
+M``":[`````````#Y``":\`````````#Y``":]`````````#Y``":^```````
+M``#Y``":_`````````#Y``"8U````"```)C0`@`4"`(!%`@"`!0(`@`4"`(!
+M%`@``)C<`*`@P`"@(,``X"#``.`@P`#@(,```)B<\````/````#P````\```
+M`/```````)B<`````````````````````````````)B<`P````,````#````
+M`P````,``````)B<`````````````````````````````)B<````````````
+M`````````````````)B<`````````````````````````````)B<````````
+M`````````````````````)B<`````````````````````````````)B<0$``
+M`$!```!`0```0$```$!``````)B<904``&4%``!E!0``904``&4%`````)B<
+M`````````````````````````````)B<````````````````````````````
+M`)B<`$(```!"````0@```$(```!"`````)B<`+4```"U````M0```+4```"U
+M`````)B<``,````#`````P````,````#`````)B<`/<```#W````]P```/<`
+M``#W`````)B<`)T```"=````G0```)T```"=`````)B<`"(````B````(@``
+M`"(````B`````)B<!"(```0B```$(@``!"(```0B`````)B<`",`&``C`!@`
+M(P`8`",`&``C`!@``)B<`"@````H````*`!@`"@`8``H`&```)B<`%``P`!0
+M`,``4`##`%``PP!0`,,``)B<``0`?P`$`'\`!`!_``0`?P`$`'\``)B<```$
+M6```!%@```18```$6```!%@``)B<`````````````````````````````)B<
+M``#`````P````,````#`````P````)C8`$`",`!``C``0`(P`$`",`!``C``
+M`)B<``!D````9````&0```!D````9````)B<```(````"`````@````(````
+M"````)C,````#@````X````.````#@````X````P````%0```!4````5````
+M%0```!4``(`<$HV3IPF($\\$X!.5$N`3JPF($\\``)@H"@(``0H"``$%`@$`
+M"@(``0H"``$``)@T```.#@``#@X```X.```.#@``#@X``)@X````!P````<`
+M```+````"P````L``)A(`!CZ80`8^F$`&AIC`!H:8P`:&F,``)A0#)BTX`R8
+MM.`,F+#:#)BPV@R8L-H``)A8?L@-+G[(#2Y^R`TN?L@-+G[(#2X``)A<,3E@
+M7C$Y8%XQ.6!>,3E@7C$Y8%X``)AL!0RP@04,L($%#+"!!0RP@04,L($``)D4
+M```'T```!]````1,```(F```!]```)E$][@0`/>X$`#WN`T`][@0`/>X$```
+M`*($`````````````````````````````*((UKYGB-:^9XC0/F>(T#YGB-`^
+M9X@``*(,`"[!X``NP>``*L$@`"K!(``JP2```*(<&(.`"AB#@`H88X`*&(.`
+M"AB#@`H``*,`&`$``!@!```8`0``&`$``!@!`````*,$,`,F`C`#)@(P`R8"
+M,`,F`C`#)@(``*,(2`<^!D@'/@9(!SX&2`<^!D@'/@8``*,,5@M,"E8+3`I6
+M"TP*5@M,"E8+3`H``*,09!I@#V0:8`]D&F`/9!I@#V0:8`\``*,4>$]N&WA/
+M;AMX3VX;>$]N&WA/;AL``*,8AH]\6H:/?%J&CWQ:AH]\6H:/?%H``*,<D,^&
+M6Y#/AEN.SX9;CL^&6X[/AEL``*,@G4^7#YU/EP^;3Y</FT^7#YM/EP\``*,D
+MI\^CCZ?/HX^CSY^/H\^?CZ//GX\``*,HM5^O'[5?KQ^S7Z\?LU^O'[-?KQ\`
+M`*,LO=^YG[W?N9^[W[F?N]^YG[O?N9\``*,PRW_%/\M_Q3_+?\<_RW_'/\M_
+MQS\``*,TU?_1O]7_T;_3_]&_T__1O]/_T;\``!(P```#X```0&@````0``"`
+M8`````\``("<````````@*````````"!&````````($<````````@2``````
+M``"!)````````($H````````@2P```````"!,````````($T````````@3@`
+M``````"!/````````(%`@``#^0``@40```````"8"````````)@L``"@````
+MF#P`(`0```"83!*$(SP``)AP````'P``F'0```"```"8>`````X``)E8``@?
+M_P``F8````````"9A`*``````)F@````````F>````````"9Y*JJJJH``)GH
+M/$9D>```F>P```"J``"9\`````P``)GT````_P``F?@````4``"B*```";4`
+M`*(\D\B)KP``HDP````!``"B4```H````*)4````````HE@,QU.```"B7`\/
+M#P$``*)@7VD/`0``HF0`08H1``"B:````````*)L###!:@``HG``@@@@``"B
+M=`@;?*H``*)X'.<YS@``HGP%%P'.``"C.````````*,\````````HT``````
+M``"C1````````*-(/____P``HTP_____``"C4#____\``*-4``/__P``HUAY
+MJ*H?``"C7`9L0@\``*-@#R@B!P``HV078!:%``"C:!^`$00``*-L-Z`,`P``
+MHW`_Q`B#``"C=%?`"`,``*-X7]@&@@``HWQ_X`2"``"C@'\\>[H``*.$\S!_
+M\```FP0````!``";"`````(``)L,`````P``FQ`````$``";%`````4``)L8
+M````"```FQP````)``";(`````H``)LD````"P``FRP````-``";,````!``
+M`)LT````$0``FSP````3``";0````!0``)M$````%0``FT@````8``";3```
+M`!D``)M0````&@``FU0````;``";6````!P``)M<````'0``FV`````@``";
+M:````"(``)ML````(P``FW`````D``";=````"4``)MX````*```FWP````I
+M``";@````"H``)N$````*P``FX@````L``";D````#```)N4````,0``FY@`
+M```R``";H````#0``)ND````-0``FZ@````U``";K````#4``)NP````-0``
+MF[0````U``";N````#4``)N\````-0``F\`````U``";Q````#4``)O(````
+M-0``F\P````U``";T````#4``)O4````-0``F]@````U``";W````#4``)O@
+M````-0``F^0````U``";Z````#4``)OL````-0``F_`````U``";]````#4`
+M`)OX````$```F_P````:``":``````````````":!````$````!```":"```
+M`(````"```":#````:$```%A``":$````>$```&A``":%````"$```'A``":
+M&````&$````A``":'````8@```!A``":(````<@```&(``":)`````@```'(
+M``":*````$@````(``":+````(@```!(``":,````:D```"(``":-````>D`
+M``%I``":.````"D```&I``":/````&D```'I``":0````=`````I``":1```
+M`!````!I``":2````%````&0``":3````)````'0``":4````;$````0``":
+M5````?$```!0``":6````#$```"0``":7````'$```%Q``":8````;@```&Q
+M``":9````?@```'Q``"::````#@````Q``":;````'@```!Q``":<````9D`
+M``&8``":=````=D```'8``":>````!D````8``":?````%D```!8``":@```
+M`)D```"8``":A````-D```%Y``":B````/D```&Y``":C````/D```'Y``":
+MD````/D````Y``":E````/D```!Y``":F````/D```"Y``":G````/D```#Y
+M``":H````/D```#Y``":I````/D```#Y``":J````/D```#Y``":K````/D`
+M``#Y``":L````/D```#Y``":M````/D```#Y``":N````/D```#Y``":O```
+M`/D```#Y``":P````/D```#Y``":Q````/D```#Y``":R````/D```#Y``":
+MS````/D```#Y``":T````/D```#Y``":U````/D```#Y``":V````/D```#Y
+M``":W````/D```#Y``":X````/D```#Y``":Y````/D```#Y``":Z````/D`
+M``#Y``":[````/D```#Y``":\````/D```#Y``":]````/D```#Y``":^```
+M`/D```#Y``":_````/D```#Y``"8U````"```)C0````"`````@````(````
+M"`````@``)C<`*``P`"@`,``X`#``.``P`#@`,```)B<,P```#,````S````
+M,P```#,``````)B<`0````$````!`````0````$``````)B<````````````
+M`````````````````)B<`````````````````````````````)B<````````
+M`````````````````````)B<'P```!\````?````'P```!\``````)B<````
+M`````````````````````````)B<`+@```"X````N````+@```"X`````)B<
+M`+<```"W````MP```+<```"W`````)B<`(0```"$````A````(0```"$````
+M`)B<`)@```"8````F````)@```"8`````)B<`,````#`````P````,````#`
+M`````)B<`/\```#_````_P```/\```#_`````)B<`/\```#_````_P```/\`
+M``#_`````)B<`/\```#_````_P```/\```#_`````)B<`/\```#_````_P``
+M`/\```#_`````)B<`-<```#7````UP```-<```#7`````)B<`&$```!A````
+M80```&$```!A`````)B<`/X```#^````_@```/X```#^`````)B<`-X```#>
+M````W@```-X```#>`````)B<`'\```!_````?P```'\```!_`````)B<!#T`
+M``0]```$/0``!#T```0]`````)B<`'<```!W````=P```'<```!W`````)B<
+M`$0```!$````1````$0```!$`````)B<`)@```"8````F````)@```"8````
+M`)B<`!``@``0`(``$`"``!``@``0`(```)B<``7`-``%P#0`!<`T``7`-``%
+MP#0``)B<`#$`\``Q`/``,0#P`#$`\``Q`/```)B<``P!'P`,`1\`#`$?``P!
+M'P`,`1\``)B<`%$`0`!1`$``40!``%$`0`!1`$```)B<`%``V@!0`-H`4`#:
+M`%``V@!0`-H``)B<`````````````````````````````)B<``!`1```0$0`
+M`$!$``!`1```0$0``)B<`````````````````````````````)B<``!@P```
+M8,```&#```!@P```8,```)B<```L````+````#8````V````+````)C(```$
+M`P``!`,```0#```$`P``!`,``)B<``!D````9````&0```!D````9````)B<
+M```(````"`````@````(````"````)C,````#@````X````.````#@````Y!
+M4C4R,3```$%2-3(Q,0``05(U,C$R``!21C4Q,3$``%)&-3$Q,@``4D8R-#$S
+M``!21C4T,3,``%)%1T]04U]&54Y#``````!!=&AE<F]S(#(S,3,@5VE3;T,`
+M``````!!=&AE<F]S(#4R,3(`````071H97)O<R`U,C$Q`````$%T:&5R;W,@
+M-3(Q,`````!!=&AE<F]S(#4T,C0O,C0R-`````````!!=&AE<F]S(#4S,3(@
+M5VE3;T,```````!!=&AE<F]S(#(S,3<@5VE3;T,```````!!=&AE<F]S(#(S
+M,34@5VE3;T,```````!!=&AE<F]S(#4R,3(@*$901T$I``````!!=&AE<F]S
+M(#4R,3$@*$901T$I```````P+CDN,C`N,P``````````````````````````
+M``````````````````````````````'_`?\`````````````?_________\`
+M```````````#`9@!F0````````````!__________P````````````<!F`LP
+M`````````````'__________````````````"`&8##``````````````?___
+M______\````````````@`2`*$`````````````!__________P``````````
+M`"$!(`&9`````````````'__________````````````(@$@##``````````
+M````?_________\````````````Z`6`*$`````````````!__________P``
+M`````````#L!8`&9`````````````'__________````````````$@%E"A``
+M``````,`````?_________\````````````W`3`!F0```````P````!_____
+M_____P```````````#4",`&9```````#`````'__________````````````
+M-@,P`9D```````,`````?_________\````````````P!#`!F0```````P``
+M``!__________P```````````#D%,`&9```````#`````'__________````
+M````````-`8P`9D```````,`````?_________\````````````R`S`!F0``
+M`````P````!__________P```````````#$#,`&9`````````````'______
+M____````````````$0$0`9D`````````````?_________\````````````0
+M`1`*$`````````````!__________P```````````%(!4`&9````````````
+M`'__________````````````10)0`9D`````````````?_________\`````
+M``````!'`U`!F0````````````!__________P```````````$($4`&9````
+M`````````'__________````````````6`50`9D`````````````?_______
+M__\```````````!;!E`!F0````````````!__________P```````````%T(
+M4`&9`````````````'__________````````````7@E0`9D`````````````
+M?_________\```````````!0`U`*$`````````````!__________P``````
+M`````%4!4`PP`````````````'__________````````````5@)0##``````
+M````````?_________\```````````!)`E`-4`````````````!_________
+M_P```````````$`!0`I```````!&````!``````````H`8@`````````00%`
+M"D```````$<````$`````````&@!B0````````!(`4`*$```````1@````0`
+M````````"`&*`````````$H!0`I```````!&````!````````!@(`8P`````
+M````2P%`"D```````$8````$````````8`@!C0````````!,`4`*4```````
+M1@````0`````````"`&/`````````$,"0`I```````!'````!`````````!P
+M`8L`````````\`-`"D```````$8````$`````````"````````````"``T`*
+M0```````1P````0`````````8`^G`````````/$#0`I```````!&````!```
+M`````!@`````````````@0-`"D```````$8````$````````8``/J```````
+M``""`T`*4```````1@````0```````````^I`````````/(#0`H0``````!&
+M````!```````````````````````@P1`"D```````$<````$````````@&`/
+MJ@````````#T!$`*0```````1@````0```````"8`````````````(0$0`I`
+M``````!&````!````````.``#ZL`````````A01`"E```````$8````$````
+M````@``/K`````````#U!$`*$```````1@````0```````"`````````````
+M`(8%0`I```````!'````!````````(!@#ZT`````````AP5`"D```````$8`
+M```$````````X``/K@````````"(!4`*4```````1@````0```````"```^O
+M`````````(D&0`I```````!'````!`````````!H#[``````````B@9`"D``
+M`````$8````$````````8`@/L0````````"+!D`*4```````1@````0`````
+M````"`^R`````````(P'0`I```````!'````!````````(!H#[,`````````
+MC0=`"D```````$8````$````````X`@/M`````````".!T`*4```````1@``
+M``0```````"`"`^U`````````(\(0`I```````!'````!````````(!H#[8`
+M````````D`A`"D```````$8````$````````X`@/MP````````"1"$`*4```
+M````1@````0```````"`"`^X`````````/8)0`I```````!'````!```````
+M`(!@````````````]PM`"D```````$<````$````````@&````````````!@
+M`&``8`````````````!__________P```````````&$`80!A```````#````
+M`'__________````````````8@!B`&(```````(`````?_________\`````
+M``````!C`&,`8P````````````!__________P```````````&0`9`!D````
+M```#`````'__________````````````90!E`&4```````,`````?_______
+M__\```````````!F`&8`9@````````````!__________P```````````&<`
+M9P!G`````````````'__________````````````:`!H`&@`````````````
+M?_________\```````````!I`&D`:0```````P````!__________P``````
+M`````&H`:@!J```````#`````'__________````````````90```````?__
+M__\```"`_____P````!*4```#[0`````````:@```````?____\```"`____
+M_P````!*4```#[0````````!_P```````0````$````!&U@``````!`````!
+M`````0````$;6`````@``P````$``````````1M8````#``#`````0``````
+M```!&U@````@`$<````````````````;6````#,`,`````$``````````1M8
+M````)``A`````0````$````!&U@````H`#<````!``````````$;6````!\`
+M,`````$````!`````1M8````,`!;`````0`````````!&U@```!P``,````!
+M``````````$;6````#@`-P````$``````````1M8````5`!5`````0````$`
+M```!&U@```!$`%4````!`````0````$;6````$P`.P````$``````````!M8
+M````8`!2`````0````$````!&U@```!D`#0````!``````````$;6````'P`
+M(`````$````!`````1M8````F`!;`````0````$````!&U@```"<`%(````!
+M`````0````$;6````*H`$`````$``````````1M8````O``#`````0``````
+M```!&U@```"_`#8````!``````````$;6````,0`-P````$````!`````1M8
+M````RP`W`````0`````````!&U@```#0`#<````!``````````$;6````-8`
+M$`````$````!`````1M8````V@`#````````````````&U@```,R`#8````!
+M``````````$;6````-X``P````$``````````1M8````Z0`W`````0``````
+M```!&U@```#V`#<````!``````````$;6````/H`-P````$``````````1M8
+M````_P`V`````0`````````!&U@```$,`#`````!`````0````$;6````10`
+M-P````$``````````1M8```!+``W`````0`````````!&U@```%``!`````!
+M`````0````$;6````50``P````$``````````1M8```!6``A`````0````$`
+M```!&U@```%<`#<````!``````````$;6````6``-P````$``````````1M8
+M```!9`!;`````0`````````!&U@```%H`%(````!``````````$;6````6P`
+M4@````$````!`````1M8```!=``W`````0`````````!&U@```%X``,````!
+M``````````$;6````7P`-P````$``````````1M8```!B`!``````0``````
+M````&U@```&)`$$````!```````````;6````8H`2`````$``````````!M8
+M```!BP!#`````0``````````&U@```&,`$H````!```````````;6````8T`
+M2P````$``````````!M8```!CP!,`````0``````````&U@```^G`(`````!
+M```````````;6```#Z@`@0````$``````````!M8```/J0""`````0``````
+M````&U@```^J`(,````!```````````;6```#ZL`A`````$``````````!M8
+M```/K`"%`````0``````````&U@```^M`(8````!```````````;6```#ZX`
+MAP````$``````````!M8```/KP"(`````0``````````&U@```^P`(D````!
+M```````````;6```#[$`B@````$``````````!M8```/L@"+`````0``````
+M````&U@```^S`(P````!```````````;6```#[0`C0````$``````````!M8
+M```/M0".`````0``````````&U@```^V`(\````!```````````;6```#[<`
+MD`````$``````````!M8```/N`"1`````0``````````&U@```&0`$(````!
+M``````````$;6````8X``P````$``````````1M8```!F`!%`````0````$`
+M```!&U@```&:`$4````!```````````;6````9L`10````$``````````!M8
+M```!G`!>`````0``````````&U@```&>``,````!``````````$;6````:P`
+M-P````$``````````1M8```!I@`#`````0`````````!&U@```&V`#<````!
+M``````````$;6````;@`-P````$``````````1M8```!N@`W`````0``````
+M```!&U@```&^`"$````!`````0````$;6````R<``P````$``````````1M8
+M```!R@!=`````0``````````&U@```'6`#<````!``````````$;6````>0`
+M$`````$````!`````1M8```![``P`````0````$````!&U@```'X``,````!
+M``````````$;6````A``-P````$``````````1M8```"*@`B`````0``````
+M```!&U@```)"`#<````!``````````$;6````@``6P````$``````````1M8
+M```"2@`#`````0`````````!&U@```)/`!`````!`````0````$;6````EP`
+M4@````$``````````1M8```"8``[`````0````$````!&U@```)H`#<````!
+M``````````$;6````FP`-P````$``````````1M8```"=@`0`````0````$`
+M```!&U@```)Z``,````!``````````$;6````H(``P````$``````````1M8
+M```"@P`#`````0`````````!&U@```*J`"$````!``````````$;6````KX`
+M6P````$````!`````1M8```"OP`W`````0`````````!&U@```+!`#<````!
+M``````````$;6````L8`.P````$``````````1M8```"U``W`````0``````
+M```!&U@```+P`#<````!``````````$;6````O0`-P````$``````````1M8
+M```"^``#`````0`````````!&U@```">`%`````!`````0````$;6````OP`
+M`P````$``````````1M8```##``P`````0`````````!&U@```,4`#8````!
+M``````````$;6````Q@`-@````$``````````1M8```#)``#`````0``````
+M```!&U@```,0``,````!``````````$;6````SH`-P````$``````````1M8
+M```#2``0`````0````$````!%L$```-*`!(````!`````0````$;6````UH`
+M$0````$``````````1M8```#7``Z`````0````$````!&U@```->`%8````!
+M``````````$;6````L```P````$``````````1M8```#=P`#`````0``````
+M```!&U@```+,``,````!``````````$;6````````!,S$ST7``H%````````
+M````````````$!``````````$T<341<`"@4````````````````````0$```
+M```````3.!-T%P`4%````````````````````!`'`````````!-.$WL;!@4%
+M`````````````````````0``````````$U$3>1X&"@4`````````````````
+M```!```````````35A-T(084!0````````````````````$``````````!.K
+M$[`7``H%````````````````````$`P`````````$[`3V!<`%!0`````````
+M```````````0`@`````````3OQ._%P`*!0```````````````````!`,````
+M`````!0`%'@%!A04````````````````````````````````%#(4;A<`%!0`
+M```````````````````8`0`````````4,A1N%``4%```````````````````
+M`!@!`````````!0\%'@/`!04````````````````````!0``````````%#P4
+M>!$&%!0````````````````````!`0`````````4/!1X$@`4%```````````
+M``````````4``````````!0\%'@4`!04````````````````````!0``````
+M````%#P4>!<`%!0````````````````````%```````````4/!1X%P84%```
+M``````````````````$``````````!0\%,@4!A04``````````(`````````
+M!```````````%'@4H!<`%!0``````````0`````````%```````````4C!2@
+M%P`4%``````````#``````````4``````````!2,%,@2`!04``````````,`
+M````````!0``````````%(P4R!0`%!0`````````!P```````(`%````````
+M```4C!3(%`84%``````````#``````````$"`````````!2,%,@7!A04````
+M``````,``````````0(`````````%(P4R!<&%!0``````````P`````````!
+M```````````4C!3('@`4%````````````````````````````````!2,%D0%
+M!A04``````````,`````````````````````%*`4R!$&%!0``````````P``
+M```````!```````````5?!7T'@84%``````````"``````````0`````````
+M`!5\%D04!A04``````````,``````````00`````````%7P61!L`%!0`````
+M`````P`````````%```````````5?!9$'@`4%``````````#``````````4`
+M`````````!5\%D07`!04``````````<```````"``0``````````%G$6K1<`
+M%!0````````````````````````````````6<1:M'@84%```````````````
+M`````````````````!9Q%JT>!A04``````````(`````````!```````````
+M%G$6P04&%!0````````````````````````````````6<1;!$0`4%```````
+M`````````````````````````!9Q%L$4`!04````````````````````````
+M````````%G$6P1X`%!0````````````````````````````````6<1;!'@84
+M%``````````````````````#`````````!9Q%L$>!A04````````````````
+M````````````````$S@3=!X`%!0```````````````````0````````````3
+ML!/8'@`4%```````````````````!````````````!0R%&X>`!04````````
+M``,````````$````````````%#P4>!X`%!0``````````P````````0`````
+M```````4C!3('@`4%``````````#````````!````````````!9Q%L$>`!04
+M```````````````````$````````````%7P61!X`%!0``````````P``````
+M``0````````````4C!3('@`4%````````````````````````````````!0\
+M%'@>`!04````````````````````````````````%L$6P1X`%!0`````````
+M``````````0````````````4"A1:!08H*```````````````````````````
+M`````!2"%-(%!B@H``````````$`````````````````````%/H5<@4&*"@`
+M```````````````````````````````5FA82!08H*``````````!````````
+M`````````````!0>%$8%!B@H````````````````````````````````%&X4
+MO@4&*"@``````````0`````````````````````4YA5>!08H*```````````
+M`````````````````````!6&%B8%!B@H``````````$`````````````````
+M````%%`4>!$&*"@````````````````````````````````44!1X%P8H*```
+M`````````````````````````````!1:%%H1!B@H````````````````````
+M````````````%%H46A<`*"@````````````````````````````````4H!2@
+M%P8H*``````````!``````````(``````````!2@%*`4!B@H``````````$`
+M`````````@``````````%((4@A$`*"@``````````0`````````"````````
+M```4JA2J%``H*``````````!``````````(``````````!2"%*H4`"@H````
+M``````$``````````@``````````%((4JA<&*"@``````````0`````````"
+M```````````5I!8<%`8H*``````````!``````````(``````````!:`%J@4
+M`"@H````````````````````````````````%H`6J!X&*"@`````````````
+M```````````````````6A1:M'@8H*```````````````````````````````
+M`!1:%((/`"@H``````````,````````$````````````%*H4JA(`*"@`````
+M`````P````````0````````````5I!8<%``H*``````````#````````!```
+M`````````!:`%J@4`"@H```````````````````$````````````"0@)1`4&
+M%`4````````````````````````````````)"`E$%``4!0``````````````
+M``````````````````EL":@%!A0%````````````````````````````````
+M"6P)J!0`%`4````````````````````@```````````);`FH'@`4!0``````
+M``````````````````````````EL"9X;!A0%````````````````````````
+M````````"6P)GA0`%`4````````````````````@```````````)@`F*%``4
+M!0````````````````````````````````F9":@4`!0%````````````````
+M````````````````":,)J!0`%`4``````````````````"`@```````````)
+MM`FT!084!0````````````````````````````````FT";04`!0%````````
+M```````````H(```````````"=`*K`4&%`4`````````````````````````
+M```````)"`E$%``4!0````````````````````````````````EL"6P4`!0%
+M````````````````````````````````"7$)@!0`%`4`````````````````
+M```````````````)A0F*%``4!0````````````````````````````````F/
+M"9D4`!0%````````````````````````````````"9X)GA0`%`4`````````
+M```````````````````````)HPFC%``4!0``````````@```````!```````
+M``````FC":,4`!0%``````````"`````````````````````":@)J!0`%`4`
+M`````````(````````0````````````)J`FH%``4!0``````````@```````
+M``````````````FT";04`!0%``````````"````````$````````````";0)
+MM!0`%`4``````````(`````````````````````)"`E$!084!0``````````
+M``````````````````````D("404`!0%````````````````````````````
+M````"6P)J`4&%`4````````````````````````````````);`FH%``4!0``
+M`````````````````$````````````EL":@>`!0%````````````````````
+M````````````"6P)GAL&%`4````````````````````````````````);`F>
+M%``4!0```````````````````$````````````F`"8H4`!0%````````````
+M````````````````````"9D)J!0`%`4`````````````````````````````
+M```)T`JL!084!0````````````````````````````````FC":@4`!0%````
+M```````````````@(```````````"0@)1!0`%`4`````````````````````
+M```````````);`EL%``4!0````````````````````````````````EQ"8`4
+M`!0%````````````````````````````````"84)BA0`%`4`````````````
+M```````````````````)CPF9%``4!0``````````````````````````````
+M``F>"9X4`!0%````````````````````````````````":,)HQ0`%`4`````
+M`````(````````0````````````)HPFC%``4!0``````````@```````````
+M``````````FH":@4`!0%``````````"````````$````````````":@)J!0`
+M%`4``````````(`````````````````````)"`E$!08H*```````````````
+M``````````````````F%"84%!B@H````````````````````````````````
+M"84)A10&*"@````````````````````````````````)A0F%$@8H*```````
+M````````````!`````````````G0"JP%!B@H````````````````````````
+M`````````?\0`````````````````0`````````````````````````@"``"
+M`````````````````````/\`````````````````)!$`````````````````
+M```4!0```````````````````@4````````````````````3```````````!
+M4!```````````````````````````````````````````0``````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````)0$```````
+M````````````````````````````````````!```````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````U`0````````````````
+M```````````````````````````($```````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````$4!``````````````````````````
+M`````````````````(```(``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````50$```````````````````````````````````
+M````````0```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````!E`P`````````````````@`````````#``````````````"`
+M`$"````````````````````)"```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```(4#`````````````````````````````````#`````````0`$````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````E0,```
+M``````````````(`````````!`````,`````````$"`$````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````3`P````````````
+M`````@`````````$`````P``````"```@$``````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````",#`````````````````"````
+M``````0````#`````````````$``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````,P,`````````````````(`````````!```
+M``,```````@```!`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````!#`P`````````````````@`````````$`````P``````
+M`````"!`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````%,#`````````````````"``````````0````#`````````````!``
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````8P
+M,`````````````````(`````````!`````,``````````0`1````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````1`0````````
+M``````````````````````````````````(``0`@```````````````````2
+M!```````````````````(!$`````````````````````````````````````
+M```````````````````````````````````````!(!``````````````````
+M````````````````````````!``"`@``````````````````````````````
+M```````````@$@``````````````````````````````````````````````
+M``````````````````````````````%@$`````````````````$`````````
+M`P`````````````"`$"`(```````````````````$,0`````````````````
+M``0A````````````````````````````````````````````````````````
+M`````````````````````640`````````````````0`````````#````````
+M````````````.```````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````!0$````````````````````````````@````"````````````
+M``0`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``)`0```````````````````````````$`````(`````````````!<<`````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````T!`````
+M`````````````````````(```````@````````````"`````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````$0$``````````````
+M```$````````@``````"````````````0(``````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````5`0`````````````````0`````
+M``"```````(``````````@!`@```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````!D!````````````````````````````(````
+M`@````````````"(````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````'0$`````````````````$````````@`@````"````````
+M````0(0`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````A`0`````````````````0```````"`"`````(``````````@!`A```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````"4!`
+M`````````````````````````(```````@````````````"!QP``````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````+0$``````````
+M```````$````````@``````"````````````0(''````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````U0_P``````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````H````````````````````*````
+M````````````````````````````"C#_``````````````````````````"`
+M`````P``````````````````````````````````````````````````````
+M```````````````````````!`````````````````````0``````````````
+M```````$```````````+,#```````````````````````````0`````#````
+M````````````````````````````````````````````````````````````
+M``````````````"`````````````````````@`````````````````````0`
+M``````````PP,``````````````````````````"``````,`````````````
+M````````````````````````````````````````````````````````````
+M`````!`````````````````````0````````````````````!```````````
+M"A`0````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````(```
+M`````````````````"`````````````````````$```````````*0$``````
+M````````````````````>&`````"````````````````````````````````
+M``````````````````````````````````````````````I`````````````
+M```````$0`````````````````````0```````````I00```````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````@````````````````````(
+M````````````````````!````````````9DP````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````"`````````````````````@`````````
+M```````````$````````````8/\````````````````#````````!``````(
+M```````#X````````````````````````L``````````````````````````
+M````````````````K\````````````````````OP````````````````````
+M``@```````````!F_P````````````````,````````$``````@```````/@
+M```````````````````````"P```````````````````````````````````
+M```````'P````````````````````?``````````````````````"```````
+M`````&?_`````````````````P````````0`````"````````^``````````
+M``````````````+``````````````````````````````````````````"_`
+M```````````````````+\``````````````````````(````````````:/\`
+M```````````````#````````!``````(```````#X```````````````````
+M`````L``````````````````````````````````````````5\``````````
+M`````````!7P``````````````````````@```````````!A_P``````````
+M``````,````````$`````!````````/@````````````````````````````
+M``````````````````````````````````````"OP```````````````````
+M"_``````````````````````"````````````&+_`````````````````P``
+M``````0`````$````````^````````````````````````+`````````````
+M`````````````````````````````*_````````````````````+\```````
+M```````````````(````````````8_\````````````````#````````!```
+M```(```````!X````````````````````````L``````````````````````
+M````````````````````+\````````````````````OP````````````````
+M``````@```````````!D_P````````````````,````````$`````!``````
+M`!P`"``````````````````````"P```````````````````````````````
+M```````````'P````````````````````?``````````````````````"```
+M`````````&7_`````````````````P````````0`````$```````"(0`````
+M````````````````````````````````````````````````````````````
+M`%?````````````````````5\``````````````````````(````````````
+M:?\````````````````#````````!``````0```````#P```````````````
+M`````````L``````````````````````````````````````````!\``````
+M``````````````'P``````````````````````@```````````!J_P``````
+M``````````,````````$`````!````````/`````````````````````````
+M```````````````````````````````````````````OP```````````````
+M````"_``````````````````````"````````````9C_````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````0`#P`/.!B`#P`/,`00"``(.!B0"`
+M`(,`2`#R`/6!B@#R`/4`0P#V`/>!BP#V`/<`2@#Q`/2!C`#Q`/0`2P"!`(2!
+MC0"!`(0`3`""`(6!CP""`(4!B`#P`/,!B0"``(,!B@#R`/4!BP#V`/<!C`#Q
+M`/0!C0"!`(0!CP""`(4```````@`````````````````````````````````
+M``````````$"%W`+`(P```````$"(R@/`!(```````$"+N`*`)@"``````$"
+M1E`.`"0"``````$"7<`)`+`$``````$"C*`-`$@$``````$"NX`(`&`$````
+M``$"TO`,`&P$````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````@`````````````
+M``````````````````````````````$#%W`+`(P```````$#(R@/`!(`````
+M``$#+N`*`)@"``````$#1E`.`"0"``````$#7<`)`+`$``````$#C*`-`$@$
+M``````$#NX`(`&`$``````$#TO`,`&P$````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````@```````````````````````````````````````````$"%W`+`(P`
+M``````$"(R@/`!(```````$"+N`*`)@"``````$"1E`.`"0"``````$"7<`)
+M`+`$``````$"C*`-`$@$``````$"NX`(`&`$``````$"TO`,`&P$````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````@`````````````````````````````````
+M``````````$#%W`+`(P```````$#(R@/`!(```````$#+N`*`)@"``````$#
+M1E`.`"0"``````$#7<`)`+`$``````$#C*`-`$@$``````$#NX`(`&`$````
+M``$#TO`,`&P$````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````0`````````````
+M``````````````````````````````$``^@+`((```````$`!]`*!(0!````
+M``$`%7P)!(L!``````$`*O@(!)8!````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````H@0`````````````H@A0/D9&4#Y&1@``H@QD@$%L9(!!;```HA`!F:`#
+M`9F@`P``HA0$3-80!$S6$```HA@3@`!`$X``0```HAP;X`!@&^``8```HB`,
+M4X`*#%.`"@``HB0`%-\[`!3?.P``HB@```&U```!M0``HBP````@````(```
+MF)P`````````````F)P`````````````F)P`````````````F)P`````````
+M````F)P`````````````F)P`````````````F)P`````````````F)P`````
+M````````F)P`````````````F)P`````````````F)P`````````````F)P`
+M.````#@`````F)P`````````````F)P`````````````F)P`````````````
+MF)P`!`#Y``0`^0``F-0`````````!```F)P`````````````F)P`````````
+M````F)P`````````````F)P`````````````F)P`````````````F)P0````
+M$```````F)P$````!```````F)P`````````````F)P`````````````F)P`
+M````````````F)P`````"@``````F)P`.`"``C@`@```F)P``@`&````!@``
+MF)P```"2````D@``F)P```"@````H```F)P`!``'``0`!P``F-0````:````
+M&@``F)P```!(````2```F)P````0````$```F)P````(````"```F)P````/
+M````#P``F)P```#R````8@``F)P``)!/``"03```F)P``!):```2F@``F,P`
+M```.````#P````@```````````````````````````````````````````$"
+M%W`+`(P```````$"(R@/`!(```````$"+N`*`)@"``````$"1E`.`"0"````
+M``$"7<`)`+`$``````$"C*`-`$@$``````$"NX`(`&`$``````$"TO`,`&P$
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````@`````````````````````````
+M``````````````````$""[@+`(8```````$"$90/``D```````$"%W`*`(P"
+M``````$"(R@.`!("``````$"+N`)`)@$``````$"1E`-`"0$``````$"7<`(
+M`#`$``````$":7@,`#8$````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````@`````
+M``````````````````````````````````````$"!=P+`(,```````$"",H/
+M``0```````$""[@*`(8"``````$"$90.``D"``````$"%W`)`(P$``````$"
+M(R@-`!($``````$"+N`(`!@$``````$"-+P,`!L$````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````<```````````````````````````````````````````$#
+M%W`+`(P```````$#+N`*`)@"``````$#1E`.`"0"``````$#7<`)`+`#````
+M``$#C*`-`$@#``````$#NX`(`&`#``````$#TO`,`&P#````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````@`````````````````````````
+M``````````````````$#%W`+`(P```````$#(R@/`!(```````$#+N`*`)@"
+M``````$#1E`.`"0"``````$#7<`)`+`$``````$#C*`-`$@$``````$#NX`(
+M`&`$``````$#TO`,`&P$````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````0`````
+M``````````````````````````````````````$``^@;`((```````$`!]`:
+M!(0!``````$`%7P9!(L!``````$`*O@8!)8!````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````P```````````````````````````````````````````$`
+M`^@;`((```````$`!]`:!(0!``````$`%7P9!(L"``````$`*O@8!)8#````
+M```"%W`+``P$```````"(R@/`!($``````$"+N`*`!@&``````$"1E`.`"0&
+M``````$"7<`)`#`(``````$"C*`-`$@(``````$"NX`(`&`(``````$"TO`,
+M`&P(````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````T`````````````````````````
+M``````````````````$$`/H#`($``F0"9`$$`?0'`($``<D!R0$$`^@"`((!
+M`.0`Y`$$!]`&`(0"`*``H`$$"[@!`(8#`(P`C`$"%W`+`(P$`#P`/`$"(R@/
+M`!($`#P`/`$"+N`*`)@&`#``,`$"1E`.`"0&`#``,`$"7<`)`#`(`"P`+`$"
+MC*`-`$@(`"P`+`$"NX`(`&`(`"P`+`$"TO`,`&P(`"P`+```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR
+M``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR
+M``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR
+M``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR
+M``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR
+M``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR
+M``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR
+M``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR
+M``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR
+M``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR
+M``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR``!'0T,Z("A'
+M3E4I(#,N,RXR``!'0T,Z("A'3E4I(#,N,RXR```N<WEM=&%B`"YS=')T86(`
+M+G-H<W1R=&%B`"YR96QA+G1E>'0`+G)E;&$N<F]D871A`"YR;V1A=&$N<W1R
+M,2XX`"YR96QA+F1A=&$`+F)S<P`N8V]M;65N=```````````````````````
+M`````````````````````````````````````"`````!````!@`````````T
+M``(H2```````````````!``````````;````!`````````````,[G```=@@`
+M```+`````0````0````,````*P````$````"```````"*(```(K8````````
+M```````(`````````"8````$`````````````[&D```.0`````L````#````
+M!`````P````S`````0```#(```````*S6````2````````````````@````!
+M````1P````$````#```````"M'@``%4H```````````````(`````````$(`
+M```$`````````````[_D````8`````L````&````!`````P```!-````"```
+M``,```````,)H````9@```````````````(`````````4@````$`````````
+M```#":````.H```````````````!`````````!$````#`````````````PU(
+M````6P```````````````0`````````!`````@````````````,/K```&>``
+M```,````!P````0````0````"0````,````````````#*8P``!(.````````
+M```````!```````````````````````````````````````````#```!````
+M`````````````P```P````````````````,```4````````````````#```&
+M`````````````````P``"`````````````````,```D````!``"M!````*`2
+M```!````#```EK@````($@```0```!<``4,8```";!(```$````B``!SZ```
+M`(02```!````+0`!8%0```)P$@```0```#@``````````!````````!"``$)
+M5````$@2```!````30`!;@@```&\$@```0```%@``&6T```!=!(```$```!C
+M``'`D````4`2```!````;@``/5@```&D$0``!@```'D``4H,````.!(```$`
+M``"$``!I!````$@2```!````CP``6#P```#D$@```0```)H``$ST```!I!$`
+M``8```"E``$[`````$02```!````L``!-60````@$@```0```+L``2;4````
+M"!(```$```#&``$'U````7@2```!````T0`!%80```$\$@```0```-P```NX
+M````N!(```$```#G``#VV````-@2```!````\@``VI@```#($@```0```/T`
+M`+UD````C!(```$```$(``##`````!@2```!```!$P``G!P```!4$@```0``
+M`1X``3]X````9!(```$```$I``$&3`````@2```!```!-``!(M`````H$@``
+M`0```3\``6+$````V!(```$```%*```(^````%`2```!```!50`!"_````#<
+M$@```0```6```+'T````"!(```$```%K``&L'````:`2```!```!=@``H00`
+M```($@```0```8$``,,8````(!(```$```&,```0=````902```!```!IP``
+M2`@```&D$0``!@```;(``3;,````C!(```$```&]``"=:````)`2```!```!
+MR```!'0````T$@```0```=,``;"0````>!(```$```'>```````````0````
+M```!_P``;YP```!4$@```0```@H``3E(```!G!(```$```(5``$XX````&@2
+M```!```"(```^LP```"D$@```0```BL``'*(````,!(```$```(V``"XO```
+M`'`2```!```"00``O?````"0$@```0```DP``/NP````0!(```$```)7``"V
+M(````"02```!```"8@`!-YP```",$@```0```FT``*%<```!,!(```$```)X
+M``!NH````$`2```!```"@P``EP````!`$@```0```HX``2^H````C!(```$`
+M``*9``"_W````$P2```!```"I``!-U@````L$@```0```J\``38D````>!(`
+M``$```*Z``$*<````'`2```!```"Q0`!8[0````\$@```0```M```&C\````
+M"!(```$```+;``$X*````(@2```!```"Y@``7/@```:($@```0```O$``+],
+M````1!(```$```+\``$RE````%@2```!```#!P``!"@```!,$@```0```Q(`
+M`3:<````,!(```$```,=``&33````6`2```!```#*``!(:`````X$@```0``
+M`S,``6RD````P!(```$```,^``!Q^````#02```!```#20``LD0```#0$@``
+M`0```U0``+=<````?!(```$```-?``"5O````#P2```!```#:@`!FF````"@
+M$@```0```W4``(B@```"P!(```$```.```!V%`````@2```!```#BP`!FP``
+M``!$$@```0```Y8``)C````#7!(```$```.A```"A````9@2```!```#L``!
+M?H@```0X$@```0```[L``4@````!.!(```$```/&``"^^````"`2```!```#
+MT0`!E\P```&\$@```0```]P``3XT```!1!(```$```/G``%)4````"`2```!
+M```#\@``!!P````,$@```0```_T``+IP````'!(```$```0(``#[\````002
+M```!```$$P``^W````!`$@```0``!!X``-+8````4!(```$```0I``!C@```
+M`!@2```!```$-```<BP```!<$@```0``!#\```2H```")!(```$```15``%K
+M@````#P2```!```$8```HHP```%$$@```0``!&L``````````!````````1Q
+M``!SN````#`2```!```$?```KX0````D$@```0``!(<``6.<````&!(```$`
+M``22``#D)````#02```!```$G0`!*5````38$@```0``!*@``240````$!(`
+M``$```2S``!J'````+P2```!```$O@``K:0```!@$@```0``!,D``;0,````
+M5!(```$```34``$G*````6@2```!```$WP``OL@````($@```0``!.H``&\4
+M````B!(```$```3U``#ZL````!P2```!```%```!#3@```?@$@```0``!0L`
+M`9<H````I!(```$```46```````````0```````%&P`!-5P````($@```0``
+M!28``+7\````)!(```$```4Q``%*\````'@2```!```%/```EK`````($@``
+M`0``!4<``:9D```#0!(```$```52``#%5````,02```!```%70``;=0```!0
+M$@```0``!6@``3BP````,!(```$```5S``$5&````&P2```!```%?@`!`\@`
+M```@$@```0``!8D``;$(````6!(```$```64```````````0```````%H0``
+MF!@```"H$@```0``!:P``'OL````Q!(```$```6W``&KS````%`2```!```%
+MP@`!L@0````0$@```0``!<T``3-0````W!(```$```78```'-````6P2```!
+M```%Z0`!GI0```5$$@```0``!?0``'*X````B!(```$```7_``">5````,02
+M```!```&"@``OK@````($@```0``!A4``36$````(!(```$```8@``'!T```
+M`+02```!```&*P``>R0```!X$@```0``!C8``1U8````K!(```$```9!``"Q
+M_````$@2```!```&3```U/@```&X$@```0``!E<``)7X````N!(```$```9B
+M``%V:```!O`2```!```&;0`!3$````",$@```0``!G@``46$````,!(```$`
+M``:#``#&&````;02```!```&C@`!.T0```+P$@```0``!ID``+OP````=!(`
+M``$```:D``"^V````"`2```!```&KP`!/]P```,\$@```0``!KH``9N(```!
+MO!(```$```;%``&T8```!I02```!```&T```OY````!,$@```0``!ML``*/8
+M````%!(```$```;F``!H!````!`2```!```&\0``K@0```&`$@```0``!OP`
+M`3&H````4!(```$```<'``!VP````"@2```!```'$@`"#C0```$$$@```0``
+M!QT``'8$````"!(```$```<H``$UR````!`2```!```',P`!-(@```!,$@``
+M`0``!SX``%`\```!I!$```8```=)``$$4````(`2```!```'5``!QIP```!<
+M$@```0``!U\``'2P````C!(```$```=J``##.````"`2```!```'=0``?+``
+M``(8$@```0``!X```6`H````+!(```$```>+``$O7````"02```!```'E@`!
+M,?@```"<$@```0``!Z$``;(X```!U!(```$```>L``"'/````!P2```!```'
+MMP``>8`````@$@```0``!\(``'"0````]!(```$```?-``![N````#02```!
+M```'V``!,1@```"0$@```0``!^,``6:X```#Q!(```$```?N``&D?````>@2
+M```!```'^0``0*````&D$0``!@``"`0``&K8```!U!(```$```@/``!*?```
+M`'@2```!```(&@``EL````!`$@```0``""4``'N<````'!(```$```@P````
+M```````0```````(4```?L@```>,$@```0``"%L`````````"1$```8```AK
+M``%OQ````*@2```!```(=@``M]@````X$@```0``"($``B=$```!!!(```$`
+M``B,``$6P````'@2```!```(EP`!,P@```!($@```0``"*(``'8<````"!(`
+M``$```BM``%L(````(02```!```(N```OL`````($@```0``",,``,)L````
+M*!(```$```C.``"S%````+P2```!```(V0`!-=@```!$$@```0``".0`````
+M`````!````````CS``"X2````$`2```!```(_@``3I@```&D$0``!@``"0D`
+M`4?8````*!(```$```D4``$>I````&`2```!```)'P``VV````!\$@```0``
+M"2H``(<@````'!(```$```DU``"\E````(P2```!```)0``!)2````&<$@``
+M`0``"4L``$FL```!I!$```8```E6``$ZY````!P2```!```)80``NA@```!8
+M$@```0``"6P``4NT````C!(```$```EW``&^1````DP2```!```)@@``L]``
+M``($$@```0``"8T``'I(````,!(```$```F8``"VN````%`2```!```)HP``
+MWSP```%T$@```0``":X``(YH````&!(```$```FY``%*>````'@2```!```)
+MQ```2U````&D$0``!@``"<\``+@0````.!(```$```G:``"Y?````)P2```!
+M```)Y0``<80```!8$@```0``"?```:/T````(!(```$```G[```````````0
+M```````*"@`!!E0```!0$@```0``"A4``2^`````*!(```$```H@``!LU```
+M`"02```!```**P`!-X0````8$@```0``"C8``+ZP````"!(```$```I!``$P
+MA````)02```!```*3```0D0```&D$0``!@``"E<``,44````'!(```$```IB
+M``"OJ````3@2```!```*;0```AP```!H$@```0``"GL``#[\```!I!$```8`
+M``J&``#$G````'@2```!```*D0``L.`````0$@```0``"IP````,````)!$`
+M``8```JN``!O\````#`2```!```*N0``<(0````,$@```0``"L0``2;<````
+M3!(```$```K/``!X?````(`2```!```*V@`!Q`@```*4$@```0``"N4``'C\
+M````*!(```$```KP``"]3````!@2```!```*^P`!2<@```!$$@```0``"P8`
+M`%;,```!)!(```$```L1``&CV````!P2```!```+'```Q"0```!X$@```0``
+M"R<``+Z`````,!(```$```LR``%)D````#@2```!```+/0`!`^@````@$@``
+M`0``"T@``9M$````1!(```$```M3``"](````"P2```!```+7@`!?5@```#\
+M$@```0``"VD``+#P```!!!(```$```MT``$&I````3`2```!```+?P``0^@`
+M``&D$0``!@``"XH``'H8````,!(```$```N5``&R%````"02```!```+H```
+M9TP```"X$@```0``"ZL``'DD````1!(```$```NV``#^0```!6P2```!```+
+MP0``=F0```!<$@```0``"\P``'28````&!(```$```O7``$?!````?@2```!
+M```+X@`!F8@```#8$@```0``"^T``,4P````)!(```$```OX``!7\````$P2
+M```!```,`P`!(DP```"$$@```0``#`X```]@````C!(```$```P9```*%```
+M`:02```!```,)``!(6@````X$@```0``#"\``'4\````D!(```$```PZ``!Y
+M:````!@2```!```,10`!D3````"D$@```0``#%```&YH````.!(```$```Q;
+M``%^5````#02```!```,9@``1T0```!$$@```0``#'$```;,````:!(```$`
+M``Q\``$P-````%`2```!```,AP``````````$```````#)<``.18```!J!(`
+M``$```RB``!G*````"02```!```,K0`!J:0```(H$@```0``#+@``&[@````
+M-!(```$```S#``$HD````,`2```!```,S@``NV@```"($@```0``#-D``030
+M```!?!(```$```SD```````````0```````-!```"4@```#,$@```0``#0\`
+M`&TD````6!(```$```T:``!M?````%`2```!```-)0``MP@```!4$@```0``
+M#3```&E,````T!(```$```T[``"Y+````%`2```!```-1@`!%S@```7H$@``
+M`0``#5$``+\8````)!(```$```U<``%,S````E@2```!```-9P``=?P````(
+M$@```0``#7(``&RL````*!(```$```U]``!P?`````@2```!```-B```````
+M````$```````#98``````````!````````V<``"UU````"@2```!```-IP``
+M#00```#$$@```0``#;(``````````!````````VW``!V)````$`2```!```-
+MP@``P_`````T$@```0``#<T``,`H````,!(```$```W8``"'S````-02```!
+M```-XP``>G@````T$@```0``#>X``'`@````7!(```$```WY``$O-````"@2
+M```!```.!``!27`````@$@```0``#@\``5^4````E!(```$```X:``"XB```
+M`#02```!```.)0`!(A@````T$@```0``#C```7!L```%_!(```$```X[``!Q
+MW````!P2```!```.1@``PI0```!L$@```0``#E$``+J,````-!(```$```Y<
+M``"?&````>P2```!```.9P``MDP```!L$@```0``#G(``+[0````"!(```$`
+M``Y]``"70````-@2```!```.B```4>````&D$0``!@``#I,``&T<````"!(`
+M``$```Z>``"V1`````@2```!```.J0``950```!@$@```0``#K0``&@4````
+MZ!(```$```Z_``$AV````$`2```!```.R@``#^P```"($@```0``#M4``;!,
+M````*!(```$```[@``$V'`````@2```!```.ZP``NQP```!,$@```0``#O8`
+M`9`4```!'!(```$```\!``#![````(`2```!```/#```Q^P```K4$@```0``
+M#Q<``%.$```!I!$```8```\B``$=.````"`2```!```/+0``;B0```!$$@``
+M`0``#S@```B@````6!(```$```]#``!L^````"02```!```/3@`!K;P```*0
+M$@```0``#UD``9W@````M!(```$```]D``!YH````"`2```!```/;P``O&0`
+M```P$@```0``#WH``4DX````&!(```$```^%``!YP````%@2```!```/D```
+M9'0```!D$@```0``#YL``'1L````+!(```$```^F``"I:````"P2```!```/
+ML0``#<@```&8$@```0``#[P``0E,````"!(```$```_'``"<<````&02```!
+M```/T@``PY`````P$@```0``#]T``'8,````"!(```$```_H``#]D````+`2
+M```!```/\P`!2D0````T$@```0``#_X``=CH````Z!(```$``!`)``!US```
+M`#`2```!```0%```62`````P$@```0``$!\``$^8```'-!(```$``!`U``%+
+M:````$P2```!```00```>JP```!X$@```0``$$L``4\D```0<!(```$``!!6
+M``$B^````A@2```!```080`!!`@```!($@```0``$&P``,/`````,!(```$`
+M`!!W``"<U````)02```!```0@@``1L@```!\$@```0``$(T``*$,````4!(`
+M``$``!"8``"'6````'02```!```0HP``PU@````X$@```0``$*X``-+`````
+M&!(```$``!"Y``!DV````'P2```!```0Q```H]`````($@```0``$,\`````
+M`````!```````!#5``!S0````'@2```!```0X```]:@```!0$@```0``$.L`
+M`4=8````@!(```$``!#V``$TU````(@2```!```1`0``NL````!<$@```0``
+M$0P``*1<```%#!(```$``!$7``"1X````X`2```!```1(@`!-:0````D$@``
+M`0``$2T``0.L````'!(```$``!$X``'VI````/@2```!```10P`!-"P```!<
+M$@```0``$4X``2#\````;!(```$``!%9``%C\````L@2```!```19``!I!0`
+M```@$@```0``$6\``````````!```````!&!``"LH````&02```!```1C``!
+M'@0```"@$@```0``$9<``````````!```````!&H``!MS`````@2```!```1
+MLP``OSP````0$@```0``$;X``)WX````7!(```$``!')``$R[````!P2```!
+M```1U``!B9````$H$@```0``$=\``-,H```!T!(```$``!'J``!*&````&02
+M```!```2`P`!I#0```!($@```0!Z>C`P-6(U.#0V`'IZ,#`R9&(Q,6,`>GHP
+M,F1B9C@W-0!Z>C`R9&)B,6(R`'IZ,#)D8C(P-3,`7U]A<VAL9&DS`'IZ,#`R
+M9&)A-#(`>GHP9F)B,64S9@!Z>C!B-SEE83DT`'IZ,#5B.&,V-6$`>GHP,#5B
+M-#!A9`!Z>C`U8CDT,F5D`'IZ,&0X9&,V,F,`>GHP,#$Y9C0W,`!Z>C`R9&0Y
+M-#)D`'IZ,#)D8F4W,V0`>GHP,#5B-CDR8@!Z>C!B-F0R,S(U`'IZ,#`U8C@U
+M,V0`>GHP,#$V9#DR90!Z>C!C9F(Q.#<U`'IZ,#`R9&(S,6,`>GHP,F1A8F)A
+M8P!Z>C`R9&)C.#4Q`'IZ,#`P8C9C-C@`>GHP,#!B-F)F.`!Z>C`P8C9C9C5E
+M`'IZ,#$V93%D9F0`>GHP8C9F-3!B.`!Z>C`V93!A-&9E`'IZ,#`V-V0R8C$`
+M>GHP,#)D8F,V,0!Z>C!B-F-A,S(U`'IZ,#`U8C9C9F0`>GHP,39E,&1F9`!Z
+M>C`P,&(V9C8X`&%T:%]H86Q?<')O8V5S<U]N;VES969L;V]R`'IZ,#`U8C0X
+M860`>GHP,F1B9C%B,@!Z>C`P-6(X.&-B`'IZ,#,S96,X8F8`>GHP9&(T,C5C
+M-0!A=&A?:&%L7V1M85]B96%C;VY?<F5S<&]N<V5?=&EM90!Z>C`P8C9F,38Q
+M`'IZ,#9E,#!B.&$`>GHP,F1B9F,Q9`!Z>C!D8S1E,SDP`'IZ,&1A9F5D.#8`
+M>GHP,&(V93(W80!Z>C`R9&)B86(R`'IZ,&(V9#%E9F8`>GHP,39D.3!D9`!Z
+M>C`R9&)E.#4Q`'IZ,#`U8C8T9F0`>GHP,#!B-F0U,@!Z>C!B-F,Y969F`'IZ
+M,#$V93`P9&0`>GHP,F1B9#@W-0!Z>C`R9&(S,6(R`'IZ,#!B-S`Y,C,`>GHP
+M,&(V9#0U,`!Z>C`P,&(V9#%D`'IZ,&(V8S(S,C4`>GHP,F1B9&%B,@!Z>C`P
+M,#5B-C,R`'IZ,#9D961D.3,`>GHP,#$V9&$U,`!Z>C`P,#8W9#,R`'IZ,#!B
+M-F0Y,C,`>GHP,#)D8C4Q8P!Z>C`Q-F1C8F9E`'IZ,#!B-S`Q-#4`>GHP,#$V
+M9&8R8P!Z>C!B-V9A9#-E`'IZ,#$V9#DY,C``>GHP,F1B,6)A8P!Z>C!D8S9E
+M,SDP`'IZ,#5B-S`Q93``>GHP,#!B-F(Q,`!Z>C!B-S`Y969F`'IZ,#$V9&8X
+M.6(`871H7VAA;%]A='1A8V@`>GHP-F4P9F,P9`!Z>C`Q-F1A8C)D`'IZ,#)D
+M8C$S-60`>GHP93`T-C@T8@!Z>C`Q-F4R.3%D`'IZ,#`P8C9F93@`>GHP,&-F
+M8C-E,`!Z>C`P,39D.30X`'IZ,#$V93(P.6(`>GHP8C<P,65F9@!Z>C`P,&(V
+M8SED`'IZ,#`P-6(U83(`>GHP,F1B,3<P80!A=&A?:&%L7V-O;7!U=&5T>'1I
+M;64`>GHP,F1B-6)A8P!Z>C`P-6(X,3-D`"YU9&EV`'IZ,#!B-F,Y,C,`>GHP
+M8C9B-3!B.`!Z>C`P-6(W9CED`'IZ,&(W,#%D,#(`>GHP-F1F9C0T80!Z>C`R
+M9&(U-S8S`'IZ,#9E96%F-C``>GHP93`P-V-A,0!Z>C`P,F1A9C8R`'IZ,&(X
+M,V%D,V4`>GHP,#!B-F(Y,`!Z>C`Q-F0Y969A`'IZ,#$V9&4P-3$`>GHP,#`U
+M8C9B,@!Z>C`U8C=F,3$T`"YD:78`>GHP-&%E,#,Q9@!Z>C`R9&)D9&9D`'IZ
+M,#`U-#=F960`>GHP,&(V8F8U90!Z>C`P8C<Q-S=D`'IZ,#!B-S!F,V0`>GHP
+M,39D.#DR,`!Z>C`R9&(Q86(R`'IZ,#`P-6(V,C(`>GHP,#!B-F8W.`!Z>C!B
+M-CEB,#=C`&%T:%]H86Q?9G)E90!Z>C`U8C<Y8C%B`'IZ,#!B-S`W,V0`>GHP
+M,F1B96)B9`!Z>C!B-64S,34R`'IZ,#$V9&9B9C$`871H7VAA;%]M:'HR:65E
+M90!Z>C`Q-F4Q.#EB`'IZ,&1C,F$U8S4`>GHP,#)D8S8P8@!Z>C`V9&8P8CAA
+M`'IZ,#)D8C,S-60`>GHP8C9C-3-A-`!Z>C!F-31D,6(P`'IZ,&(V9F0S-C,`
+M>GHP9#ED8S8R8P!Z>C`U8C<T,64P`'IZ,#)D83EB86,`>GHP9&,R,60S80!Z
+M>C`P8C<Q-S-D`'IZ,#$V9#ED-#$`>GHP,#5B.#1F9`!Z>C`P-6(X86)D`'IZ
+M,#!B-S`Q,C,`>GHP,#5B-C4R8@!Z>C`R9&(S.#<U`'IZ,#$V93,P.6(`>GHP
+M,#5B-C!B,@!Z>C`R9&(Q.#<U`'IZ,#`R9&(X-#(`>GHP,F1B,3<V,P!Z>C!B
+M-V1E83DT`'IZ,#!B-S`Q-C$`>GHP,39D-V0T,0!Z>C`P,39C9#,R`'IZ,#9D
+M93!B.&$`>GHP-F0Y9&0Y,P!Z>C!D8C-E9#@V`'IZ,#`U8C0X960`>GHP,#)D
+M8S@P8@!Z>C`P,F1B8S0R`'IZ,#)D8F$X-3$`>GHP,F1B,S-E9`!Z>C`P-6(X
+M,&9D`'IZ,#`U8C=F,F4`>GHP,F1B9F1F9`!Z>C`Q-F4V-#AA`'IZ,#`R9&%F
+M9C(`>GHP,#5B-S<Y9`!Z>C`P,&(V964X`'IZ,#$V930T.&$`>GHP,&(V9C9B
+M8P!Z>C`Q-F1A.3(P`'IZ,#5B-S@Q93``>GHP,#)D8V$P8@!Z>C`P-6(T-&%D
+M`'IZ,#9D9&8T-&$`>GHP9F%C,&,Y8@!Z>C!B-F8Y969F`'IZ,#!B-F,V8F,`
+M871H7VAA;%]A9&1I=&EO;F%L7W-W8F%?8F%C:V]F9@!Z>C`P,#)D8CDR`&%T
+M:%]H86Q?=F5R<VEO;@!Z>C`R9&)A8S)E`'IZ,#)D8C<Y864`>GHP,#$V934S
+M,@!Z>C!B-F-F,#`Y`'IZ,#`Q-F4Q,F,`>GHP,#$V9#EE-`!Z>C`P,#)D865A
+M`'IZ,#`U8C5C8C(`>GHP,39D83(U,0!Z>C`V9C9A9C8P`'IZ,#9D9F1D.3,`
+M871H7VAA;%]M86QL;V,`>GHP,#!B-F1D,@!Z>C`R9&0Y,F%D`'IZ,#$V9&(R
+M-3$`>GHP93$P-V-A,0!Z>C`P8C9C-S5E`'IZ,#$V9&0P-3$`>GHP,F1B9#%B
+M,@!Z>C`R9&,Q-S8S`'IZ,&(V.3!D-F0`>GHP,39D9C`U,0!Z>C`P,39D.34P
+M`'IZ,#!B-S`V8F,`>GHP,#$V9#@W,@!Z>C`V9&5F-#1A`'IZ,#5B.&,R960`
+M>GHP-F9B.30W8@!Z>C!E8F(Q93-F`'IZ,&(V9CED,#(`>GHP9#$T9#%B,`!Z
+M>C!B-#@P,S%E`'IZ,#$V9&)B9F4`>GHP,39E-30X80!Z>C`P,39D.#4P`'IZ
+M,#`P8C9F9C@`871H7VAA;%]M96UC<'D`>GHP,F1B8V)B9`!Z>C`Q-F1A,&1D
+M`'IZ,#)D8F)D9F0`>GHP,F1B,C@U,0!Z>C`R9&)D8S%D`'IZ,#9D8C!C9C(`
+M>GHP,39E8CEA9`!Z>C`P8C9C96)C`'IZ,&0Y-#@T83$`871H7VAA;%]P<F]B
+M90!Z>C`Q-F5A.6%D`'IZ,&9D-&0Q8C``>GHP,F1B,S<V,P!A=&A?:&%L7V)U
+M:6QD;W!T<P!Z>C`R9&%F,S5D`'IZ,#9D9&1D.3,`>GHP9&%D8S8R8P!Z>C`Q
+M-F1F,C4Q`'IZ,#`P8C9C,3``>GHP,39D.3(U,0!Z>C`R9&(P.#4Q`'IZ,&(W
+M,C%A960`>GHP-C=C9F-A90!Z>C`P,&(V8V8X`'IZ,&,Y-&0Q8C``>GHP,F1A
+M9F%B,@!Z>C`U8CDR865D`'IZ,#`U8CAC8V(`>GHP8C9D.65F9@!Z>C`R9&(Q
+M,6(R`'IZ,#)D8F9F8C$`>GHP,F1B9C<V,P!Z>C`P-6(V.&9D`'IZ,#`U8C0T
+M960`>GHP8C<Q,6%E9`!Z>C!B-64S,38P`'IZ,&0X-#@T83$`>GHP,39D.&(R
+M9`!Z>C`Q-F4P.#EB`'IZ,#)D8F(X-S4`>GHP,F1A93@U,0!Z>C!B.#%E83DT
+M`'IZ,#$V9&5C,68`>GHP,&(V9F5B8P!Z>C!E.#DT.3`W`'IZ,#!B-F5A-V$`
+M>GHP,S-E.&9B9@!Z>C!C9F$U.#<U`'IZ,#)D8CDY864`>GHP,F1B.6%B,@!Z
+M>C`P,&(V8F4X`'IZ,&1E-C@S-V8`>GHP,39D86)F90!Z>C!B-S`Y9#`R`'IZ
+M,#8W9#(U93(`>GHP,3EF,V$P,0!Z>C`W,#,Y-#=B`&%T:%]H86Q?;65M>F5R
+M;P!Z>C`V9&9F8S!D`'IZ,&(V-S4P8C@`>GHP,39E,F1F9`!Z>C`P,&(V9#(R
+M`'IZ,#9F96%F-C``>GHP9&,T835C-0!Z>C`P8C<P9C=D`&%T:%]H86Q?<W=?
+M8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP.68V-&(V80!Z>C`P-6(V-3=A`'IZ
+M,#9F,SDT-V(`>GHP-F1A,&-F,@!Z>C!B-V)A9#-E`'IZ,#!B-F8Y-C$`>GHP
+M8C8Y-S-B8P!Z>C`R9&)D,S5D`'IZ,#`U8C@X9F0`>GHP,F1B8F,Q9`!Z>C`R
+M9&%F9&9D`'IZ,#9D-V1D.3,`871H7VAA;%]D96QA>0`N=7)E;0!Z>C`R9&(Q
+M9&9D`'IZ,#8W9#)F-#$`+G)E;0!Z>C`R9&%F.#<U`'IZ,&(W961E-F0`>GHP
+M,39D.&0T,0!Z>C`P,F1A93DR`'IZ,&(W861E-F0`>GHP,F1B8C,U9`!Z>C`R
+M9&(S9&9D`'IZ,#)D8C4S960`>GHP,39D8V5A90!Z>C`P,&(V9&$R`'IZ,#`P
+M8C9E,C(`>GHP-6(X,#`T,0!Z>C`P,39D.#0X`'IZ,#$V9#EB,F0`>GHP,#$V
+M93`R8P!Z>C`P8C<P-S=D`'IZ,#`U8C8Y-V$`>GHP,#$V9&%E-`!Z>C`Q-F4Q
+M,#EB`'IZ,#`U8C1A,F0`>GHP,39D93!D9`!Z>C`Q-F1F,&1D`'IZ,&1F,#=C
+M83$`>GHP,F1B9#<V,P!Z>C`P,&(V934R`'IZ,#8W9#!C-#<`>GHP-6(V8S9D
+M8@!Z>C!C,S$U96(U`'IZ,&1B,65D.#8`>GHP-F0T,#9E,`!Z>C`Q-F4P,C4Q
+M`'IZ,#`P,F1B8C(`>GHP,#)D9#@V9`!Z>C`P,39E,31D`'IZ,#)D8C4Y864`
+M>GHP,#8W9#(R,0!Z>C`Q-F0X,&1D`'IZ,#`U8C@Y,V0`>GHP-6(X,6(Q8@!Z
+M>C`R9&(Q,V5D`'IZ,#!B-F0Q,C,`>GHP,#!B-F-E.`!Z>C`U8CAA865D`'IZ
+M,&(V960S-C,`>GHP,F1A9C%B,@!Z>C`P,#5B-64R`'IZ,#,S96)F8F8`>GHP
+M-6(V.#9D8@!Z>C`P,&(V968X`'IZ,&(W,3EA960`>GHP,#5B-3AB,@!Z>C`U
+M8C=D8C%B`'IZ,&(X,F1E-F0`>GHP,#$V9#<S,@!Z>C`R9&%D86(R`'IZ,&8T
+M-64V93,`871H7VAA;%]I;FET7V-H86YN96QS`'IZ,#!B-F0V8F,`>GHP8S$T
+M9#%B,`!Z>C`P,#)D8F0R`'IZ,&1A-#@T83$`>GHP,39E,&(X-P!Z>C`U8CDP
+M,F5D`'IZ,&1C,F4S.3``>GHP838P9#$T-0!Z>C`R9&)A8F)D`'IZ,#`P8C9C
+M,60`>GHP-6(X96%E9`!Z>C`P-6(W8CED`'IZ,#`U8C4T-#8`>GHP-6(V-#9D
+M8@`N=6UU;`!Z>C`P8C9F.3(S`'IZ,&1D-C@S-V8`>GHP,39E,3(U,0!Z>C!D
+M8S9A-6,U`'IZ,#)D8C,W,&$`>GHP,#`U8C8W,@!Z>C`V9&5F8S!D`'IZ,#)D
+M8F8S-60`>GHP,#!B-F,W.`!Z>C`P,39D.#,R`'IZ,#)D8C4W,&$`>GHP,#5B
+M-F0W80!Z>C`P,F1B,CDR`'IZ,#`U8CDP8V(`871H7VAA;%]R96=?=W)I=&4`
+M>GHP8C9F-3,V,P!Z>C`P-6(U8S0V`&%T:%]H86Q?<F5G7W)E860`>GHP-F0Y
+M,&-F,@!Z>C`V9#AD9#DS`'IZ,#$V9&9B.#<`>GHP,#$V9&$T.`!Z>C!B-C8S
+M,6$X`'IZ,#`R9&(P.3(`871H7VAA;%]G971W:7)E;&5S<VUO9&5S`'IZ,#$V
+M93%B.#<````````````!`P``"C@````$```!`P``"W0````(```!`P``"W0`
+M```,```!`P``"W0````0```!`P``"D`````4```!`P``"W0````8```!`P``
+M"E@````<```!`P``"F`````@```!`P``"ZP````D```!`P``"F@````H```!
+M`P``"G0````L```!`P``"K@````P```!`P``"HP````T```!`P``"J`````X
+M```!`P``"JP````\```!`P``"L````!````!`P``"ZP```!$```!`P``"ZP`
+M``!(```!`P``"O@```!,```!`P``"P0```!0```!`P``"W0```!4```!`P``
+M"Q````!8```!`P``"W0```!<```!`P``"QP```!@```!`P``"R@```!D```!
+M`P``"S0```!H```!`P``"ZP```!L```!`P``"ZP```!P```!`P``"W0```!T
+M```!`P``"ZP```!X```!`P``"WP```!\```!`P``"ZP```"````!`P``"ZP`
+M``"$```!`P``"ZP```"(```!`P``"YP```"4```#"0```$@```"@```##```
+M`$@```#$```#"0```&````#<```#"0```'````#H```#"0```(````$$```#
+M"0```)````$(```##````)````$8```#"0```*@```$P```#"0```(````$\
+M```#"0```,````%(```##````,````%L```#"0```-@```%\```#"0```&``
+M``&4```#"0```&````&L```#"0```'````&\```#"0```/````'(```##```
+M`/````'0```#"0```0@```'4```##````0@```'P```##````(````'X```#
+M#````'````'\```#"0```*@```($```##````*@```(,```##````-@```(0
+M```##````&````.4``!W!P````````.D``&)!P````````.X``!'!P``````
+M``0X``&5!P````````10``$W!P````````6```!I!P````````6\``!I!P``
+M``````70``!I!P````````80``!I!P````````8D``!I!P````````8X``!I
+M!P````````9,``!I!P````````9D``!I!P````````9X``!I!P````````:,
+M``!I!P````````:@``!I!P````````=L``"^!P````````?@``!Y!P``````
+M``?\``"^!P````````@X``$X!P````````AX``!I!P````````B0``!I!P``
+M``````B\``$@!P````````C$```""0````````C(```"#`````````C0``&#
+M!P````````D4``$@!P````````D<```""0````````D@```"#`````````DX
+M``!I!P````````G0``!F!P````````GL``!F!P````````HD```!"0``````
+M``HH```!#`````````RP``&5!P````````_X``#_!P```````!`D``$@!P``
+M`````!!````""0````8``!!$```"#`````8``!"@```""0````8``!"D```"
+M#`````8``!#(``$@!P```````!(0```""0```!@``!(4```"#````!@``!(L
+M```""0```"X``!(P```"#````"X``!)0``&#!P```````!)D``&#!P``````
+M`!)T``!Y!P```````!9P``#/!P```````!Q,``$B!P```````!_```"%!P``
+M`````"N\``#/!P```````"O@``$B!P```````"Q<``&#!P```````"R```$B
+M!P```````"T$``&#!P```````"TH``$B!P```````"VL``"%!P```````#?<
+M```""0```$0``#?@```""0```%P``#?D```"#````%P``#?P```"#````$0`
+M`$@L```$"0``"=@``$@P```$#```"=@``$AP```$"0```#```$AT```$#```
+M`#```$DH```$"0``"=@``$DL```$#```"=@``$KX```$"0``"=@``$K\```$
+M#```"=@``$N$```$"0```#```$N(```$#````#```$OH```$"0``)%@``$OL
+M```$#```)%@``$P0``#H!P```````$Q,```$"0```#```$Q0```$#````#``
+M`$T8```$"0```#```$U8```$#````#```$VH```$"0``"9```$X````$#```
+M"9```$\````,!P```````%$(```""0```'P``%$,```"#````'P``%'H```$
+M"0``&K@``%'L```$#```&K@``%(0```$"0``%!@``%(4```$#```%!@``%(T
+M```$"0``'?@``%(X```$#```'?@``%)8```$"0``(1@``%)<```$#```(1@`
+M`%*````$"0``([@``%*$```$#```([@``%*@```$"0``&K@``%*D```$#```
+M&K@``%0D``$B!P```````%7$```""0```)0``%7(```"#````)0``%7\```!
+M"0``1X@``%8$```!#```1X@``%?X``#_!P```````%C8``#_!P```````%DH
+M``#_!P```````%MH```$"0``/-@``%ML```$#```/-@``%P8```$"0``/2P`
+M`%P<```$#```/2P``%T$``#/!P```````%T@```""0```)@``%TD```"#```
+M`)@``%TL``#H!P```````%V4``$_!P```````%VX``&5!P```````%W0``&5
+M!P```````%WL``&2!P```````%X```&2!P```````%X8``&5!P```````%XD
+M```O!P```````%X\``&5!P```````%Y0``&2!P```````%Y@``$L!P``````
+M`%Z4``$L!P```````%[```$L!P```````%\0``$L!P```````%]8``$L!P``
+M`````&`D``!]"0```````&`H``!]#````````&*@``$L!P```````&,D``&2
+M!P```````&-,``&2!P```````&-@``"%!P```````&.$``"%!P```````&2$
+M``&2!P```````&24``&2!P```````&2D``&2!P```````&2T``&2!P``````
+M`&3$``&2!P```````&3P```Q"0```````&3T```Q#````````&4$``$J"0``
+M`````&4(``$J#````````&5```%G!P```````&5D``&2!P```````&5P``&5
+M!P```````&6,``&2!P```````&6@``&2!P```````&70``&5!P```````&7L
+M``&2!P```````&7\``&2!P```````&8,``&2!P```````&8P``&5!P``````
+M`&9(``&2!P```````&98``&2!P```````&9D``&5!P```````&:P``&2!P``
+M`````&<4``&2!P```````&<T``&5!P```````&=4``&5!P```````&@X``&2
+M!P```````&C(``&2!P```````&CL``&2!P```````&DH``&5!P```````&EX
+M``&2!P```````&F,``&2!P```````&F@``&2!P```````&FT``&2!P``````
+M`&G(``&2!P```````&G<``&2!P```````&GP``&2!P```````&H(``&2!P``
+M`````&JH``&2!P```````&K$``&2!P```````&PD``&2!P```````&PX``&2
+M!P```````&Q,``&2!P```````&Q@``&2!P```````&QT``&2!P```````&R,
+M``&2!P```````&R<``!P!P```````&S```#H!P```````&SH``#H!P``````
+M`&T````""0``$P@``&T$```"#```$P@``&T(``#H!P```````&TX``&5!P``
+M`````&U,``!*!P```````&UD``&5!P```````&WX``$F!P```````&X0``!U
+M!P```````&XP``&5!P```````&Y8``&2!P```````&YT``&5!P```````&Z0
+M``&2!P```````&ZL``&5!P```````&[0``&2!P```````&[X``&5!P``````
+M`&\@``&5!P```````&]L``&2!P```````&^(``%3!P```````&^H``&5!P``
+M`````&_<``&2!P```````&_\``&5!P```````'`L``&5!P```````'!H``&2
+M!P```````'"D``#H!P```````'#H``&2!P```````'$D``&2!P```````'$X
+M``&5!P```````'%8``&5!P```````'%P``&2!P```````'&0``&5!P``````
+M`'&@``&5!P```````'&P``&5!P```````''H``&5!P```````'($``&5!P``
+M`````'(8``&2!P```````'(\``&5!P```````')@``&5!P```````')P``&5
+M!P```````'*8``&5!P```````'+$``&5!P```````'+<``&5!P```````'+T
+M``&5!P```````',,``&5!P```````',D``&5!P```````'-8```E!P``````
+M`'.$``%?!P```````'.8``&2!P```````'/$``&5!P```````'/8```E!P``
+M`````'/T```E!P```````'0@``&5!P```````'0T``%?!P```````'10``&2
+M!P```````'1X``&5!P```````'2(```E!P```````'3(``&5!P```````'3@
+M``&2!P```````'4$``&5!P```````'48``&2!P```````'5(```E!P``````
+M`'5X``&5!P```````'6,``%?!P```````'6L``&2!P```````'78``&5!P``
+M`````'7L```E!P```````'94``$8!P```````':@``&2!P```````':P```;
+M!P```````';8``$Z!P```````';T``&5!P```````'<(``&2!P```````'<@
+M``&5!P```````'<T``&2!P```````'=<``&5!P```````'=P``&2!P``````
+M`'=X``$W!P```````'>0``&5!P```````'>H``$W!P```````'>T``&5!P``
+M`````'?$``&2!P```````'?T``&5!P```````'@(``&2!P```````'@H``&5
+M!P```````'@\``&2!P```````'A4``&5!P```````'AH``&2!P```````'D(
+M``&5!P```````'DT``#S"0```````'E```#S#````````'E,```1"0``````
+M`'E0```1#````````'E4``$K!P```````'EP``&5!P```````'F,``&2!P``
+M`````'FL``&2!P```````'G0``&2!P```````'G@``&5!P```````'GT``$W
+M!P```````'HD``&5!P```````'HT``&2!P```````'I4``&5!P```````'ID
+M``&2!P```````'J(``&2!P```````'J8``&2!P```````'K0``&5!P``````
+M`'KX``&5!P```````'L4``&2!P```````'M(``&5!P```````'MP``&5!P``
+M`````'N,``&2!P```````'NH``&5!P```````'O8``&2!P```````'S@``&5
+M!P```````'T\``&5!P```````'[D``#_!P```````'\T``&5!P```````']$
+M``$_!P```````'^8``&2!P```````'_```&2!P```````(`4``&2!P``````
+M`(`X``&2!P```````(!4``&2!P```````(!D``&5!P```````(!T``&2!P``
+M`````(#```&2!P```````(#D``&2!P```````(#T``&2!P```````($$``&2
+M!P```````($4``&2!P```````($@``&5!P```````($P``&2!P```````(%`
+M``&2!P```````(%4``&5!P```````(%D``&2!P```````(%T``&2!P``````
+M`(&$``&2!P```````(&4``&2!P```````(&D``&2!P```````(&T``&2!P``
+M`````('$``&2!P```````('4``&2!P```````('H``&2!P```````('X``&2
+M!P```````(($``"X!P```````((4``&2!P```````((D``&2!P```````((T
+M``&2!P```````()$``&2!P```````()4``&2!P```````()D``&2!P``````
+M`()T``&2!P```````(*$``&2!P```````(*4``&2!P```````(*D``&2!P``
+M`````(*T``&2!P```````(+$``&2!P```````(+4``&2!P```````(+@```"
+M"0``$Q```(+D```"#```$Q```(,8``&2!P```````(,T``&*!P```````(-0
+M``&5!P```````(-\``&2!P```````(.P``&2!P```````(.\``&5!P``````
+M`(/P``&2!P```````(/\``&5!P```````(0D``&2!P```````(0P``&5!P``
+M`````(1<``&2!P```````(1H``&5!P```````(2$``&2!P```````(3D``&2
+M!P```````(3L``$W!P```````(3X``&5!P```````(4(``&2!P```````(4<
+M``!*!P```````(4H``"6!P```````(54``!7!P```````(6$``"`!P``````
+M`(64``&5!P```````(6H``&2!P```````(7(``&$!P```````(7D```*!P``
+M`````(8$``$:!P```````(8D``&2!P```````(9@``&5!P```````(<,``&2
+M!P```````(=H``#Z!P```````(><``$W!P```````(>X``$W!P```````(?8
+M``#Z!P```````(@0``&2!P```````(@X``$W!P```````(A@``$W!P``````
+M`(AP``#Z!P```````(BL``#_!P```````(C,``&5!P```````(C<``&2!P``
+M`````(CH``&5!P```````(D```&2!P```````(D(``$W!P```````(D8``&5
+M!P```````(DL``&2!P```````(DT``$W!P```````(E4``$W!P```````(ED
+M``&5!P```````(E\``&2!P```````(F(``&5!P```````(F8``&5!P``````
+M`(FH``&5!P```````(G(``&2!P```````(GL``&2!P```````(H0``&2!P``
+M`````(H8``$W!P```````(HD``&5!P```````(HX``&2!P```````(I```$W
+M!P```````(I0``&2!P```````(I<``&5!P```````(IL``&2!P```````(IT
+M``$W!P```````(J```&5!P```````(J0``&2!P```````(JD``!*!P``````
+M`(JT``&2!P```````(K$``&2!P```````(K4``&2!P```````(K@``"6!P``
+M`````(KT``$W!P```````(L```"6!P```````(LD``&5!P```````(LT``&2
+M!P```````(M$``&2!P```````(N$``&2!P```````(N,``$W!P```````(NP
+M``!*!P```````(OX``&2!P```````(R\``!I!P```````(XD``!Y!P``````
+M`(Y```&#!P```````(Y0``!I!P```````(\L``!Y!P```````(\\``!I!P``
+M`````)!(```""0``&%H``)!,```"#```&%H``)'L```""0``&&0``)'P```"
+M#```&&0``)'T``#H!P```````)($```""0``&$@``)((```"#```&$@``)(,
+M``#H!P```````))P```O!P```````)*L```O!P```````)28```O!P``````
+M`)2X```O!P```````)38```O!P```````)44``&2!P```````)5,``&2!P``
+M`````)5P``!Y!P```````)5X```O!P```````)60``&2!P```````)6@``&2
+M!P```````)7(``&5!P```````)8$``&5!P```````)84``&2!P```````)8H
+M``!*!P```````)9(``$W!P```````)90``!2!P```````);P``%J!P``````
+M`)<P``$7!P```````)?```$B!P```````)@$``"_!P```````)DP``&2!P``
+M`````)E```&2!P```````)E4``&2!P```````)E\``&2!P```````)F0``&2
+M!P```````)F@``&5!P```````)FT``&2!P```````)G8``&2!P```````)GH
+M``&2!P```````)G\``&2!P```````)HL``&2!P```````)I```&2!P``````
+M`)I0``&5!P```````)ID``&2!P```````)I\``&2!P```````)K(``&2!P``
+M`````)Q8``&5!P```````)S$``&2!P```````)S8``"C!P```````)SL``%3
+M!P```````)S\``&5!P```````)TP``%3!P```````)U(``&2!P```````)U4
+M``%3!P```````)W(``&2!P```````)WH``&2!P```````)XT``&5!P``````
+M`)Z@``&2!P```````)ZT``&5!P```````)[(``$W!P```````)[D``&2!P``
+M`````)\(``!*!P```````*0```&2!P```````*08``&2!P```````*0P``&5
+M!P```````*1,```O!P```````*1D``#/!P```````*2````""0``&*@``*2$
+M```"#```&*@``*2,``#H!P```````*3T``&;!P```````*4L``&2!P``````
+M`*5```&2!P```````*5(``$W!P```````*58``&5!P```````*6,``&5!P``
+M`````*70``&2!P```````*78``$W!P```````*8$``%,!P```````*9(``&5
+M!P```````*9L``%,!P```````*:@``%,!P```````*=````""0``*Q@``*=$
+M```"#```*Q@``*>P``%\!P```````*?T``&2!P```````*?\``$W!P``````
+M`*@8``&2!P```````*@@``$W!P```````*A4``%,!P```````*A\``#4"0``
+M`````*B```#4#````````*B0``&%!P```````*BT``%,!P```````*E(``%I
+M!P```````*EX``$?!P```````*F```"%!P```````*GX``&5!P```````*H8
+M``&2!P```````*HD``&5!P```````*ID``&2!P```````*IP``&5!P``````
+M`*JD``&2!P```````*J\``$W!P```````*M@``#?!P```````*Q4``%,!P``
+M`````*RP``&2!P```````*S```&2!P```````*S0``&2!P```````*S@``&2
+M!P```````*SP``&2!P```````*TD```Q"0```````*U4```Q"0```````*U8
+M```Q#````````*UH``$J"0```````*UL``$J#````````*V0``&3!P``````
+M`*VT``&2!P```````*W```&5!P```````*W<``&2!P```````*WP``&2!P``
+M`````*X@``&5!P```````*XT``&2!P```````*Y$``&2!P```````*Y4``&2
+M!P```````*YX``&5!P```````*Z0``&2!P```````*Z@``&2!P```````*ZL
+M``&5!P```````*[X``&2!P```````*\X``&2!P```````*](``&5!P``````
+M`*]P``&2!P```````*^0``&5!P```````*^P``&5!P```````+!X``&5!P``
+M`````+",``&5!P```````+"@``&5!P```````+"T``&5!P```````+#(``&5
+M!P```````+$4``&2!P```````+$@``&5!P```````+'```&2!P```````+'D
+M``&2!P```````+(@``&5!P```````+)P``&2!P```````+*$``&2!P``````
+M`+*8``&2!P```````+*L``&2!P```````++```&2!P```````++4``&2!P``
+M`````++H``&2!P```````+,```&2!P```````+.@``&2!P```````+.\``&2
+M!P```````+5,``&2!P```````+5@``&2!P```````+5T``&2!P```````+6(
+M``&2!P```````+6<``&2!P```````+6T``&2!P```````+7$``#-!P``````
+M`+7H``#H!P```````+80``#H!P```````+8H```""0``*R```+8L```"#```
+M*R```+8P``#H!P```````+9<``&2!P```````+9P``&2!P```````+:$``!*
+M!P```````+:@``&5!P```````+>```#D!P```````+>,``&5!P```````+>@
+M``&2!P```````+>L``%%!P```````+?$```W!P```````+?D``&5!P``````
+M`+@```&2!P```````+@<``&5!P```````+@X``&2!P```````+A4``&5!P``
+M`````+AX``&2!P```````+B@``&5!P```````+C(``&5!P```````+C\``&2
+M!P```````+D8``$(!P```````+DX``&5!P```````+E4```""0``*R@``+E8
+M```"#```*R@``+EH``&2!P```````+F0``#H!P```````+G4``&2!P``````
+M`+H$``&2!P```````+HD``&5!P```````+HT``&5!P```````+I$``&5!P``
+M`````+I\``&5!P```````+J8``&5!P```````+JL``&2!P```````+K0``&5
+M!P```````+KT``&5!P```````+L$``&5!P```````+LH``&5!P```````+MT
+M``&5!P```````+N,``&5!P```````+ND``&5!P```````+N\``&5!P``````
+M`+O4``&5!P```````+P(```E!P```````+PP``%?!P```````+Q$``&2!P``
+M`````+QP``&5!P```````+R$```E!P```````+R@```E!P```````+S0``&5
+M!P```````+SD``%?!P```````+T```&2!P```````+TL``&5!P```````+T\
+M```E!P```````+U\``&5!P```````+V4``&2!P```````+VX``&5!P``````
+M`+W,``&2!P```````+W\```E!P```````+XL``&5!P```````+Y```%?!P``
+M`````+Y@``&2!P```````+Z,``&5!P```````+Z@```E!P```````+[D``&5
+M!P```````+\$``&5!P```````+\H``&2!P```````+^```#@!P```````+_,
+M``$8!P```````,`(``&2!P```````,`8```;!P```````,!```$Z!P``````
+M`,!L``&5!P```````,"```&2!P```````,"(``$W!P```````,"@``&5!P``
+M`````,"X``$W!P```````,#$``&5!P```````,#4``&2!P```````,$$``&5
+M!P```````,$8``&2!P```````,$X``&5!P```````,%,``&2!P```````,%D
+M``&5!P```````,%X``&2!P```````,&8``&5!P```````,&L``&2!P``````
+M`,'$``&5!P```````,'8``&2!P```````,)X``&5!P```````,+,``"\"0``
+M`````,+4``"\#````````,+8``$*"0```````,+@``$*#````````,+D``#O
+M"0```````,+H``#O#````````,+L``$K!P```````,,(``&5!P```````,,D
+M``&2!P```````,-$``&2!P```````,-D``&2!P```````,-X``!*!P``````
+M`,.<``&5!P```````,.L``&2!P```````,/,``&5!P```````,/<``&2!P``
+M`````,0```&2!P```````,00``&2!P```````,1(``&5!P```````,1P``&5
+M!P```````,2,``&2!P```````,3```&5!P```````,3H``&5!P```````,4$
+M``&2!P```````,4@``&5!P```````,5```&2!P```````,9$``&5!P``````
+M`,?,```!`P``[4```,?0```!`P``[4```,?4```!`P``[8```,?8```!`P``
+M[8```,?<```!`P``[<```,?@```!`P``[<```,?D```!`P``[@```,?H```!
+M`P``[@```,AL``#_!P```````,C```&5!P```````,C0``&5!P```````,CT
+M``&5!P```````,D<``&5!P```````,ED``&5!P```````,F$``&5!P``````
+M`,F<``&5!P```````,FT``&5!P```````,G$``&5!P```````,G4``&;!P``
+M`````,ID``&2!P```````,JD```$"0``18P``,K8```O!P```````,KH```O
+M!P```````,KX```$"0``18P``,K\```$#```18P``,M$```$"0``18P``,M(
+M```$#```18P``,ML``&2!P```````,N4```""0``*T@``,N8```"#```*T@`
+M`,N\``&2!P```````,O8```""0``,UP``,O<```"#```,UP``,P```&2!P``
+M`````,P<```""0``+@0``,P@```"#```+@0``,Q4``&2!P```````,R$``&5
+M!P```````,R@``&2!P```````,RP``&2!P```````,S$``&2!P```````,S0
+M``&5!P```````,S@``&2!P```````,T```&2!P```````,T0``&2!P``````
+M`,TT``&2!P```````,U@``&2!P```````,VX``&2!P```````,WD``&2!P``
+M`````,X```&5!P```````,X0``&2!P```````,X@``&2!P```````,XP``&2
+M!P```````,Y```&2!P```````,Z$``&2!P```````,ZH``&2!P```````,Z\
+M``&2!P```````,[,``&2!P```````,[T``&5!P```````,\$``&2!P``````
+M`,\0``$C!P```````,]$``&5!P```````,]H``&2!P```````,_(``&2!P``
+M`````,_<``&2!P```````,_H``&5!P```````-`0``!I!P```````-`8``$W
+M!P```````-`D``&5!P```````-`T``&2!P```````-!(``!*!P```````-!4
+M```=!P```````-"H``&2!P```````-#0``&2!P```````-#P``$/!P``````
+M`-$0``&2!P```````-$@``&2!P```````-$P``&2!P```````-%```&5!P``
+M`````-%0``&2!P```````-%D``&2!P```````-&```&5!P```````-&4``&2
+M!P```````-&L``&5!P```````-&\``&2!P```````-'H``!1!P```````-'X
+M``&5!P```````-(,``&2!P```````-(L``"<!P```````-),``#6!P``````
+M`-)L```X!P```````-*,``&2!P```````-+H``%:!P```````-,4``$W!P``
+M`````-,T``%:!P```````-.P``&2!P```````-/$``&2!P```````-/4``&2
+M!P```````-/<``$W!P```````-/T``&2!P```````-00``&2!P```````-08
+M``$W!P```````-1<``&2!P```````-1\``&2!P```````-2$``$W!P``````
+M`-2<``&2!P```````-2\``$W!P```````-3,``%:!P```````-4(``#_!P``
+M`````-4\``&5!P```````-5<``&5!P```````-5L``&5!P```````-5\``&5
+M!P```````-6X``!Y!P```````-7(``!Y!P```````-78``&5!P```````-7T
+M``&2!P```````-8P```=!P```````-9$``$W!P```````-90```=!P``````
+M`-;,``&5!P```````-;<``&2!P```````-;D``$W!P```````-<(``!*!P``
+M`````-=0``&2!P```````-=L``"+!P```````-><```""0``-T```->@```"
+M#```-T```->L```O!P```````-?X```O!P```````-@<```O!P```````-A4
+M``&2!P```````-AX``&2!P```````-B@``&5!P```````-C<``&5!P``````
+M`-D$``&2!P```````-D0``&5!P```````-D@``&2!P```````-E0``&5!P``
+M`````-ED``$W!P```````-H\``&5!P```````-JP``%S!P```````-KD```"
+M"0``.(@``-KH```"#```.(@``-L\``&5!P```````-M,``&2!P```````-MT
+M```""0``.(P``-MX```"#```.(P``-N(```""0``.(P``-N,```"#```.(P`
+M`-NT```""0``.(P``-NX```"#```.(P``-O$``!Y!P```````-T@```$"0``
+M1MP``-TD```$#```1MP``-WH```$"0``1MP``-WL```$#```1MP``-X(```O
+M!P```````-X\```O!P```````-YD```O!P```````-Z(```O!P```````-ZL
+M```O!P```````-[@```$"0``1MP``-[D```$#```1MP``-\,``&2!P``````
+M`.",``&2!P```````."<``&2!P```````.#\``&5!P```````.$D``&2!P``
+M`````.%,``&5!P```````.%H``&5!P```````.&<``&2!P```````.&T``#@
+M!P```````.'8``&2!P```````.'D``&5!P```````.(H``&2!P```````.(T
+M``&5!P```````.)@``&2!P```````.)L``&5!P```````.*T``&2!P``````
+M`.+H``&2!P```````.+T``&5!P```````.,8``&2!P```````.,D``&5!P``
+M`````.-4``&2!P```````./T``&5!P```````.00``&2!P```````.1(``&2
+M!P```````.5T```4!P```````.8,```%"0```````.80```%#````````.84
+M``$B!P```````.8<```%"0```0@``.8@```%#````0@``.8D``$B!P``````
+M`.8L```%"0````@``.8P```%#`````@``.9H```%"0```````.9L```%#```
+M`````.;<```%"0````8``.;@```%#`````8``.;\```%"0```````.<````%
+M#````````.>(```%"0````8``.>,```%#`````8``.><```%"0````8``.>@
+M```%#`````8``.?T``!Y!P```````.@@``!Y!P```````.@L```%"0```0@`
+M`.@T```%#````0@``.A@```%"0````8``.AD```%#`````8``.B(```%"0``
+M`````.B,```%#````````.C,``&#!P```````.DD```%"0```0@``.DH```%
+M#````0@``.F(```%"0```0@``.F,```%#````0@``.G,```%"0```0@``.G0
+M```%#````0@``.H4``&2!P```````.ID```%"0```8@``.IH```%#````8@`
+M`.JT``$5!P```````.TL```!"0``Q\P``.TP```!#```Q\P``.\0```""0``
+M.+0``.\4```"#```.+0``._T``&2!P```````/!,``&2!P```````/!8``!M
+M!P```````/*X``&#!P```````/,0``!Y!P```````/-T``&#!P```````/.,
+M``&#!P```````/.<``!Y!P```````/6T```""0``.,```/6X```"#```.,``
+M`/:\``&2!P```````/<@``&5!P```````/@$```""0``.,@``/@(```"#```
+M.,@``/A4```""0``.,```/A8```"#```.,```/A<```""0``.,@``/A@```"
+M#```.,@``/C0```""0``.,```/C4```"#```.,```/D$```""0``.,```/D(
+M```"#```.,```/D@```""0``.,```/DD```"#```.,```/DH```""0``.,@`
+M`/DL```"#```.,@``/DP```""0``.,```/DT```"#```.,```/H$``&5!P``
+M`````/J<``&2!P```````/K0``#U!P```````/KD``$(!P```````/KP``&5
+M!P```````/LL``$(!P```````/M0``&2!P```````/M<``$(!P```````/N@
+M``%J!P```````/O@``$7!P```````/R4``$B!P```````/S@``!B!P``````
+M`/TD``&2!P```````/U0``&2!P```````/U<``&5!P```````/U\``&2!P``
+M`````/\D``&2!P```````/]4``&2!P```````/]D``&2!P```````/^(``&2
+M!P```````/^\``&2!P```````/_,``&5!P```````/_P``&2!P```````0`@
+M``&2!P```````0!8``&2!P```````0!X``&5!P```````0"(``&2!P``````
+M`0"X``&5!P```````0#,``&2!P```````0#\``&5!P```````0$,``&2!P``
+M`````0%```&5!P```````0%0``&2!P```````0&(``&5!P```````0&8``&2
+M!P```````0&@``$J"0```````0&D``$J#````````0&H```Q"0```````0&L
+M```Q#````````0'$``#!"0```````0'(``#!#````````0'D``&2!P``````
+M`0(,``&2!P```````0(X``&5!P```````0),``&2!P```````0.X``&5!P``
+M`````0/8``&2!P```````0/X``&2!P```````008``&5!P```````00L``&5
+M!P```````01@``&2!P```````01X``%Y!P```````02,``$W!P```````02H
+M``&2!P```````0FL``&2!P```````0G```&2!P```````0G4``&2!P``````
+M`0GH``&2!P```````0G\``&2!P```````0H0``&2!P```````0HD``&2!P``
+M`````0HX``&2!P```````0I,``&2!P```````0I<``&2!P```````0J$``&2
+M!P```````0J<``&2!P```````0JT``&5!P```````0K0```O!P```````0NX
+M``"T!P```````0OX```""0``.>```0O\```"#```.>```0P$``#H!P``````
+M`0RL```""0``3&```0RP```"#```3&```0RT``#H!P```````0S0```""0``
+M3&8``0S4```"#```3&8``0U```#/!P```````0UL```F!P```````0V```&&
+M!P```````0V8``&5!P```````0W0``&0!P```````0WP``&5!P```````0XL
+M```:!P```````0Y4``&5!P```````0YH``&2!P```````0YX``&2!P``````
+M`0Z```!#!P```````0_,``&/!P```````1`0``&5!P```````1!L``&/!P``
+M`````1"8``&/!P```````1#0``&/!P```````1$$``&/!P```````1&D```"
+M"0``3%```1&H```"#```3%```1&P```""0``3%8``1&T```"#```3%8``1(<
+M``%\!P```````1+D``&2!P```````1+L``$W!P```````1+T``!#!P``````
+M`1,(``&2!P```````1,0``$W!P```````1,T``&/!P```````1-<``$Q!P``
+M`````1.L``#&!P```````1/D``"G!P```````10(``&-!P```````108``%Q
+M!P```````10\``$<!P```````11D``&/!P```````13T``""!P```````14<
+M``!R!P```````15$``!$!P```````154``&&!P```````15H``$?!P``````
+M`15P``"%!P```````17H``&5!P```````18(``&2!P```````184``&5!P``
+M`````194``&2!P```````19@``&5!P```````1:4``&2!P```````1:L``$W
+M!P```````1TH``"M!P```````1TX``&1"0```````1U$``&1#````````1U(
+M```!"0`!'2```1U,```!#``!'2```1UH``&2!P```````1UX``&2!P``````
+M`1V(``&2!P```````1V8``&2!P```````1VT``"M!P```````1W<``&2!P``
+M`````1WP``&2!P```````1XD```Q"0```````1Y4```Q"0```````1Y8```Q
+M#````````1YH``$J"0```````1YL``$J#````````1Z0``"3!P```````1ZT
+M``&2!P```````1[```&5!P```````1[<``&2!P```````1[P``&2!P``````
+M`1\@``&5!P```````1\T``&2!P```````1]$``&2!P```````1]4``&2!P``
+M`````1]X``&5!P```````1^0``&2!P```````1^@``&2!P```````1^L``&5
+M!P```````1_X``&2!P```````2`X``&2!P```````2"H``&2!P```````2#(
+M``&2!P```````2#H``&2!P```````2$,``&2!P```````2$@``&2!P``````
+M`2$T``!*!P```````2%0``&5!P```````2%T``&5!P```````2&0``&2!P``
+M`````2&L``&5!P```````2'(``&2!P```````2'D``&5!P```````2((``&2
+M!P```````2(P``&5!P```````2)8``&5!P```````2*@``&2!P```````2*\
+M``#7!P```````2+<``&5!P```````2,(``&5!P```````2,@``&5!P``````
+M`2-\``&5!P```````2/T``&5!P```````20H``&5!P```````22H``&5!P``
+M`````22\``&5!P```````230``&5!P```````23D``&5!P```````23X``&5
+M!P```````25$``&2!P```````250``&5!P```````29D``&2!P```````29P
+M``&5!P```````2:(``&2!P```````2:L``&2!P```````2:\```!`P`!*A``
+M`2;````!`P`!*:P``2;$```!`P`!*;0``2;(```!`P`!*E```2;,```!`P`!
+M*=```2;0```!`P`!*D@``2<$``&5!P```````2=D``&5!P```````2=X``&2
+M!P```````2>,``&2!P```````2>@``&2!P```````2>T``&2!P```````2?(
+M``&2!P```````2?8``&2!P```````2?L``&2!P```````2@$``&2!P``````
+M`2A(``&2!P```````2A8``&2!P```````2AH``&2!P```````2A\``&2!P``
+M`````2D@``&2!P```````2D\``&2!P```````2F8```!"0`!)KP``2F<```!
+M#``!)KP``2ML``&2!P```````2N```&2!P```````2N4``&2!P```````2NH
+M``&2!P```````2N\``&2!P```````2O4``&2!P```````2OD``$G!P``````
+M`2RX``&2!P```````2S,``&2!P```````2S@``&2!P```````2ST``&2!P``
+M`````2T(``&2!P```````2T<``&2!P```````2TP``&2!P```````2U(``&2
+M!P```````2UD``&2!P```````2UX``&2!P```````2V<``&2!P```````2VP
+M``&2!P```````2W$``&2!P```````2W8``&2!P```````2WL``&2!P``````
+M`2X$``&2!P```````2X4``$G!P```````2XH```!`P`!0O@``2XL```!`P`!
+M0O@``2XP```!`P`!0M```2XT```!`P`!0M@``2XX```!`P`!0N```2X\```!
+M`P`!0N@``2Y````!`P`!0O```2Y$```!`P`!0P```2Y(```!`P`!0!```2Y,
+M```!`P`!0%@``2Y0```!`P`!0(0``2Y4```!`P`!0P```2Y8```!`P`!0/``
+M`2Y<```!`P`!0P```2Y@```!`P`!0P```2YD```!`P`!0P```2YH```!`P`!
+M0P```2YL```!`P`!0P```2YP```!`P`!02```2YT```!`P`!0P```2YX```!
+M`P`!0P```2Y\```!`P`!0P```2Z````!`P`!0P```2Z$```!`P`!02@``2Z(
+M```!`P`!04P``2Z,```!`P`!0P```2Z0```!`P`!0;```2Z4```!`P`!0=P`
+M`2Z8```!`P`!0P```2Z<```!`P`!0+P``2Z@```!`P`!0P```2ZD```!`P`!
+M0P```2ZH```!`P`!0P```2ZL```!`P`!0BP``2ZP```!`P`!0D```2ZT```!
+M`P`!0P```2ZX```!`P`!0F0``2Z\```!`P`!17```2[````!`P`!17```2[$
+M```!`P`!0U```2[(```!`P`!0WP``2[,```!`P`!17```2[0```!`P`!0^0`
+M`2[4```!`P`!17```2[8```!`P`!17```2[<```!`P`!17```2[@```!`P`!
+M17```2[D```!`P`!17```2[H```!`P`!1!P``2[L```!`P`!17```2[P```!
+M`P`!17```2[T```!`P`!17```2[X```!`P`!17```2[\```!`P`!1#0``2\`
+M```!`P`!17```2\$```!`P`!17```2\(```!`P`!1$@``2\,```!`P`!12P`
+M`2\0```!`P`!17```2\4```!`P`!17```2\8```!`P`!17```2\<```!`P`!
+M17```2\@```!`P`!17```2\D```!`P`!1(```2\H```!`P`!1(```2\L```!
+M`P`!17```2\P```!`P`!10```2](``#H!P```````2]P``#H!P```````2^4
+M``#H!P```````2^\``#H!P```````3````&2!P```````3`D``&2!P``````
+M`3%,``&5!P```````3%@``&2!P```````3&T``&5!P```````3'0```""0``
+M3'@``3'4```"#```3'@``3'D``&2!P```````3(,``#H!P```````3)0``&2
+M!P```````3*```&2!P```````3*@``&5!P```````3*P``&5!P```````3+`
+M``&5!P```````3+X``&5!P```````3,4``&5!P```````3,L``&2!P``````
+M`3,\``&2!P```````3/4``&5!P```````308``&2!P```````30\``&5!P``
+M`````31@``&5!P```````31P``&5!P```````324``&5!P```````33@``&5
+M!P```````33X``&5!P```````340``&5!P```````34H``&5!P```````35`
+M``&5!P```````35P``&5!P```````360``&5!P```````36T``&2!P``````
+M`38,```.!P```````38\```E!P```````39H``%?!P```````39\``&2!P``
+M`````3:H``&5!P```````3:\```E!P```````3;8```E!P```````3<(``&5
+M!P```````3<<``%?!P```````3<X``&2!P```````3=D``&5!P```````3=T
+M```E!P```````3>T``&5!P```````3?,``&2!P```````3?P``&5!P``````
+M`3@$``&2!P```````3@T```E!P```````3A@``&5!P```````3AT``%?!P``
+M`````3B4``&2!P```````3B\``&5!P```````3C0```E!P```````3D0``&2
+M!P```````3DD``&2!P```````3F(``%?!P```````3FP``&#!P```````3G(
+M``&#!P```````3H(``&#!P```````3HD``&#!P```````3I$``&#!P``````
+M`3I@``&#!P```````3J```&#!P```````3JH``&2!P```````3JX``&2!P``
+M`````3K0``&2!P```````3KL```D!P```````3M,```6!P```````3MH``&2
+M!P```````3N4``&2!P```````3ND``&5!P```````3O```&2!P```````3O0
+M``&2!P```````3O@``&5!P```````3OP``&2!P```````3Q4``&2!P``````
+M`3QD``&2!P```````3QT``&2!P```````3R$``&2!P```````3R4``&5!P``
+M`````3RT``&2!P```````3S$``&2!P```````3S4``&2!P```````3SD``&2
+M!P```````3ST``&5!P```````3T<``&5!P```````3TP``&2!P```````3T\
+M``&5!P```````3U,``&2!P```````3U@``&2!P```````3UP``&2!P``````
+M`3V```&2!P```````3V0``&2!P```````3V@``&2!P```````3W,``&2!P``
+M`````3W<``&5!P```````3X@``&2!P```````3X\```6!P```````3Y4``&5
+M!P```````3YH``&2!P```````3YT``&5!P```````3Z$``&2!P```````3Z8
+M``&2!P```````3ZD``&5!P```````3[D``&2!P```````3[X``&2!P``````
+M`3\(``&2!P```````3\8``&2!P```````3\H``&2!P```````3\X``&2!P``
+M`````3]D``&2!P```````3^(```""0``3)@``3^,```"#```3)@``3^<```"
+M"0``3)@``3^@```"#```3)@``3_(```""0``3)@``3_,```"#```3)@``3_\
+M```!"0`!+D0``4`````!#``!+D0``4$(``&5!P```````4*<``")!P``````
+M`4*\```!"0`!+B@``4+````!#``!+B@``4,$``$8!P```````4,\```!"0`!
+M+KP``4-````!#``!+KP``4/4``&2!P```````4/L``&5!P```````444```"
+M"0``3,0``448```"#```3,0``44@``"@!P```````45T```;!P```````46<
+M``$Z!P```````47(``&5!P```````47<``&2!P```````47D``$W!P``````
+M`47\``&5!P```````484``$W!P```````48@``&5!P```````48P``&2!P``
+M`````49@``&5!P```````49T``&2!P```````4:4``&5!P```````4:H``&2
+M!P```````4;```&5!P```````4;<``&2!P```````4;\``&5!P```````4<0
+M``&2!P```````4<H``&5!P```````4=$``&2!P```````4?D``&5!P``````
+M`4@D``#1"0```````4B````L"0```````4B$```L#````````4BP``#8"0``
+M`````4C,``#C"0```````4C4``#C#````````4C8``"K"0```````4C@``"K
+M#````````4CD``%/"0```````4CL``%/#````````4CT``#1#````````4CX
+M```5"0```````4D````5#````````4D$``%<"0```````4D,``%<#```````
+M`4D0``#8"0```````4D8``#8#````````4D<``#C"0```````4D@``#C#```
+M`````4DD``$K!P```````4E```&5!P```````4E<``&2!P```````4E\``&2
+M!P```````4F<``&2!P```````4FP``!*!P```````4G4``&5!P```````4GD
+M``&2!P```````4GL```P!P```````4GX``#<!P```````4H8``&5!P``````
+M`4HH``&2!P```````4HP``"$!P```````4I4``&2!P```````4ID``&2!P``
+M`````4J<``&5!P```````4K$``&5!P```````4K@``&2!P```````4L4``&5
+M!P```````4L\``&5!P```````4M8``&2!P```````4MT``&5!P```````4N$
+M``&5!P```````4O$``&2!P```````4OX``&2!P```````4P,``&5!P``````
+M`4P<``&5!P```````4PL``&2!P```````4S\``&5!P```````4[8``"1!P``
+M`````4^<``&&!P```````4^T``#_!P```````5`4``&5!P```````5`D``#*
+M!P```````5`P``#<!P```````5#D```+!P```````5$```&5!P```````5$D
+M``&5!P```````5$\``&5!P```````5%8``&5!P```````5%H``&5!P``````
+M`5%X``!=!P```````5&```!,!P```````5&,``&0!P```````5)H``&2!P``
+M`````5)T```""0``3.```5)X```"#```3.```5*<``&2!P```````5*T``$W
+M!P```````5+0```""0``3S@``5+4```"#```3S@``5,T``&2!P```````5-,
+M``$W!P```````5.L``$3!P```````5/4``&2!P```````50,``!Y!P``````
+M`51P``&2!P```````51\``&5!P```````52,``&2!P```````528``&5!P``
+M`````52P``&2!P```````53$``&2!P```````53D``&2!P```````53X``&2
+M!P```````55<``&5!P```````55T``&2!P```````56$``!9!P```````56T
+M``%$!P```````59<``"7!P```````59H``$'!P```````59T``%'!P``````
+M`5:@``&2!P```````5;H``&2!P```````5<H``&2!P```````5<T```D!P``
+M`````5=X``&2!P```````5><``&2!P```````5>L``&5!P```````5?```&2
+M!P```````5?0``&2!P```````5?@``&2!P```````5?P``&2!P```````5@T
+M``&2!P```````5A8``&2!P```````5AL``&2!P```````5A\``&2!P``````
+M`5B(``"Q!P```````5BL```S!P```````5BX``!<!P```````5DT``&5!P``
+M`````5E,``&2!P```````5E<``&5!P```````5F(``!I!P```````5F@``&2
+M!P```````5GL``$W!P```````5GX``&5!P```````5H,``&2!P```````5H@
+M``$W!P```````5H\``&5!P```````5I<``&2!P```````5IH``&5!P``````
+M`5IX``&2!P```````5JH``&5!P```````5K$``&2!P```````5K0``&5!P``
+M`````5KD``&2!P```````5L$``!.!P```````5L@``&2!P```````5M<``",
+M!P```````5NP``&2!P```````5N\``&5!P```````5O0``&2!P```````5OP
+M``"Y!P```````5P(``!*!P```````5P4``";!P```````5PD``&5!P``````
+M`5PX``&2!P```````5QX``&2!P```````5R,``&2!P```````5R@``&2!P``
+M`````5S4``$5!P```````5Y(``&2!P```````5YL``&2!P```````5Z,``!"
+M!P```````5ZL```M!P```````5[(``!&!P```````5[H``&2!P```````5]8
+M``!)!P```````5]H``%=!P```````5^P``&5!P```````5_0``&2!P``````
+M`5_P``&5!P```````6`$``&5!P```````6`4``&2!P```````6!D``#_!P``
+M`````6"$``&=!P```````6#$``&2!P```````6#8``&5!P```````6#L``$W
+M!P```````6$8``"Q!P```````6$T``&5!P```````6%<``!I!P```````6%D
+M``$W!P```````6%T``!9!P```````6&4``&2!P```````6(0``"7!P``````
+M`6(<``$'!P```````6(L``&5!P```````6(\``&2!P```````6*@``!)!P``
+M`````6*P``%=!P```````6+0``&5!P```````6,H``&2!P```````6,T``&5
+M!P```````6-0``&2!P```````6-<``&5!P```````6.(``&2!P```````6/$
+M``&&!P```````608``&&!P```````67L``&5!P```````68@``&2!P``````
+M`68T``&2!P```````69,``&2!P```````694``$W!P```````69T``&2!P``
+M`````69\``$W!P```````6:0``&2!P```````6:D``&2!P```````6;,``#_
+M!P```````6<X``&5!P```````6=H``&5!P```````6=X``&5!P```````6>(
+M``&5!P```````6>P``&5!P```````6?$``&2!P```````6@@``!Y!P``````
+M`6A,``!I!P```````6A\``&5!P```````6B8``&2!P```````6BD``&5!P``
+M`````6B\``&2!P```````6C(``&5!P```````6C8``&2!P```````6D\``&5
+M!P```````6E8``&2!P```````6ED``&5!P```````6EX``&2!P```````6F,
+M``#*!P```````6FL``&5!P```````6F\``&2!P```````6K$``&5!P``````
+M`6K4``&2!P```````6K<``$W!P```````6L```!*!P```````6M,``&2!P``
+M`````6M<``&&!P```````6MP``&5!P```````6N,``&5!P```````6PL``&5
+M!P```````6Q```!G!P```````6S$``&2!P```````6S4``&2!P```````6S@
+M``&5!P```````6SP``&2!P```````6T$``&2!P```````6T4``&2!P``````
+M`6TP``&2!P```````6U$``&2!P```````6WX```O!P```````6]4``&5!P``
+M`````6]L``&5!P```````6^```&2!P```````6^@``&2!P```````6^P``&2
+M!P```````7`\``$X!P```````7%T``&5!P```````7&@``&2!P```````7&\
+M``&5!P```````7'P``&2!P```````7((```.!P```````7(H``&2!P``````
+M`7+L``&5!P```````7,<``&2!P```````7,H``&5!P```````7-```&2!P``
+M`````7-,``&5!P```````7-\``&2!P```````7.(``&5!P```````7.P``&2
+M!P```````7/T``&2!P```````70```&5!P```````70D``&2!P```````70P
+M``&5!P```````71@``&2!P```````72T``#$!P```````73H``&5!P``````
+M`74$``&2!P```````750``&5!P```````75L``&2!P```````75X``&5!P``
+M`````760``&2!P```````76<``&5!P```````76L``&2!P```````78```&5
+M!P```````78D``&2!P```````794``&2!P```````7?,``&5!P```````7?D
+M``&5!P```````7?X``&2!P```````7@$``&5!P```````7@8``&2!P``````
+M`7@H``&2!P```````7@X``&2!P```````7A$``&5!P```````7A8``&2!P``
+M`````7AH``&2!P```````7AT``&5!P```````7B$``&2!P```````7B4``&2
+M!P```````7BD``&2!P```````7BT``&2!P```````7C```&5!P```````7C4
+M``&2!P```````7CD``&2!P```````7CT``&2!P```````7D$``&2!P``````
+M`7D0``&5!P```````7F(``!Y!P```````7FD``!Y!P```````7FX``!Y!P``
+M`````7G4``!Y!P```````7H$``!Y!P```````7ND``&5!P```````7O```&2
+M!P```````7O,``&5!P```````7O@``&2!P```````7P0``&2!P```````7P@
+M``&2!P```````7PL``&5!P```````7Q,``&2!P```````7Q<``&2!P``````
+M`7QH``&5!P```````7R$``&2!P```````7R4``&2!P```````7RD``&2!P``
+M`````7RT``&2!P```````7S```&5!P```````7SH``&2!P```````7SX``&2
+M!P```````7T(``&2!P```````7T8``&2!P```````7TD``&5!P```````7U$
+M``&2!P```````7V8``!I!P```````7WT``&5!P```````7X0``&2!P``````
+M`7X<``&5!P```````7Y```&2!P```````7YX``!9!P```````7ZD``$B!P``
+M`````7ZX``$B!P```````7\,```""0``55@``7\0```"#```55@``8"H``!Y
+M!P```````8$4``&2!P```````8&```&2!P```````8'4``&2!P```````8(L
+M``&2!P```````8*```&2!P```````8*L``&2!P```````8,(```4!P``````
+M`83\``$5!P```````8H,```""0``56(``8H0```"#```56(``8K8``#H!P``
+M`````8SH``%9!P```````8V\``&#!P```````8X,``!Y!P```````8Y,``&#
+M!P```````8YD``&#!P```````8YT``!Y!P```````8[X``%9!P```````9%0
+M```""0``5MP``9%4```"#```5MP``9&0```""0``56P``9&4```"#```56P`
+M`9,P``&2!P```````9.4``&5!P```````93H```""0``5MP``93T```"#```
+M5MP``93X```""0``56P``93\```"#```56P``9<P```O!P```````9@8``!:
+M!P```````9A8``!F!P```````9AX``&2!P```````9BD``!:!P```````9D$
+M``!F!P```````9D<``&2!P```````9E,``!F!P```````9ED``&2!P``````
+M`9F4``&5!P```````9H```&2!P```````9H4``&2!P```````9HD``&2!P``
+M`````9HP``&5!P```````9I,``&2!P```````9IX``#7!P```````9J(``&5
+M!P```````9K8``&2!P```````9KD``#7!P```````9LT``%J!P```````9MX
+M``$7!P```````9S<``$B!P```````9TP``!6!P```````9UT``&2!P``````
+M`9V@``&2!P```````9VL``&5!P```````9W,``&2!P```````9]\``&2!P``
+M`````9^P``&2!P```````9_D``&2!P```````:`D``&2!P```````:!8``&2
+M!P```````:&$``$J"0```````:&(``$J#````````:&,```Q"0```````:&0
+M```Q#````````:&H``#!"0```````:&L``#!#````````:'(``&2!P``````
+M`:'\``&2!P```````:(8``&2!P```````:(\``&2!P```````:),``&2!P``
+M`````:)<``&2!P```````:)H``&5!P```````:)X``&2!P```````:/D``&5
+M!P```````:0$``&2!P```````:0D``&2!P```````:1$``&5!P```````:18
+M``&5!P```````:2,``&2!P```````:2<``&=!P```````:2P``$W!P``````
+M`:3$``&=!P```````:5```&5!P```````:58``&2!P```````:5T``&2!P``
+M`````:6```&5!P```````:6L``&5!P```````:7```&2!P```````:7(``$W
+M!P```````:74``&5!P```````:7H``&2!P```````:8```$W!P```````:8,
+M``&=!P```````:8H``&5!P```````:8\``&2!P```````:9,``&2!P``````
+M`;!T```!`P`!NN@``;!X```!`P`!M)@``;!\```!`P`!M>@``;"````!`P`!
+MN!0``;"$```!`P`!N)@``;"(```!`P`!N3P``;",```!`P`!N@0``;"@``&'
+M!P```````;"T``&2!P```````;#$``&2!P```````;#4``&2!P```````;#D
+M``&2!P```````;#T``&2!P```````;$4``&2!P```````;$H``&'!P``````
+M`;$\``&2!P```````;%,``&2!P```````;(D``&'!P```````;)D``$B!P``
+M`````;.D``&2!P```````;.X``&2!P```````;/````P!P```````;0H``"$
+M!P```````;0\``&2!P```````;1,``&2!P```````;2$```!"0`!L'0``;2(
+M```!#``!L'0``;2P``&5!P```````;3H``&2!P```````;3T``&5!P``````
+M`;4H``&2!P```````;4T``&5!P```````;5D``&2!P```````;5P``&5!P``
+M`````;6@``&2!P```````;9,``&5!P```````;:```&2!P```````;:,``&5
+M!P```````;:T``&2!P```````;;```&5!P```````;;H``&2!P```````;;T
+M``&5!P```````;<<``&2!P```````;<H``&5!P```````;=$``&2!P``````
+M`;=0``&5!P```````;>```&2!P```````;>4``&5!P```````;>P``&5!P``
+M`````;?$``&2!P```````;@T``&5!P```````;A8``&2!P```````;C$``&5
+M!P```````;CT``&2!P```````;F4``&5!P```````;F\``&2!P```````;HD
+M``!R!P```````;HL``%U!P```````;HX``#;!P```````;IP``%U!P``````
+M`;I\``#;!P```````;J4``&2!P```````;JH``&2!P```````;JP```P!P``
+M`````;K```%U!P```````;K,``#;!P```````;MH``&2!P```````;MX``&2
+M!P```````;N(``&2!P```````;N8``&2!P```````;NL``&'!P```````;R(
+M``"@!P```````;S4``"@!P```````;SX``$@!P```````;TH``"@!P``````
+M`;U(``"@!P```````;X```$@!P```````;XP``"@!P```````;[<``"@!P``
+M`````;[L``"@!P```````;[\``"@!P```````;\,``"@!P```````;\<``"@
+M!P```````;\D``%U!P```````;\P``#;!P```````;]L``"@!P```````;]\
+M``"@!P```````;^4``"@!P```````;^D``"@!P```````;_```"@!P``````
+M`;_0``"@!P```````;_@``"@!P```````;_P``"@!P```````<`$``"@!P``
+M`````<`D``%U!P```````<`P``#;!P```````<!,``&2!P```````<!<``&2
+M!P```````<!P``%U!P```````<!\``#;!P```````<"D``&2!P```````<"T
+M``&2!P```````<#(``&'!P```````<#T``&5!P```````<$$``&5!P``````
+M`<-```"@!P```````<-@``&5!P```````<-P``&5!P```````<.```&5!P``
+M`````</L``!Y!P```````<2D``&'!P```````<2T``&5!P```````<3$``&5
+M!P```````<4$``&2!P```````<44``&2!P```````<4P``&2!P```````<5`
+M``&2!P```````<70``&#!P```````<78``!I!P```````<7P``&#!P``````
+M`<7X``!I!P```````<8T``&#!P```````<8\``!I!P```````<9@``&#!P``
+M`````<9H``!I!P```````<;X```!`P`!R?0``<;\```!`P`!R<@``<<````!
+M`P`!R=```<<$```!`P`!R=@``<<(```!`P`!R?```<<,```!`P`!R?```<<0
+M```!`P`!R>```<<4```!`P`!R>@``<<@```""0``6$P``<<D```"#```6$P`
+M`<=(``&2!P```````<=@``$W!P```````<=\```""0``69P``<>````"#```
+M69P``<>4``&2!P```````<>L``$W!P```````<?(```""0``770``<?,```"
+M#```770``<?L``&2!P```````<@$``$W!P```````<@P``"+!P```````<A@
+M```""0``8^@``<AD```"#```8^@``<AP```O!P```````<B8``&5!P``````
+M`<C,``&2!P```````<D````O!P```````<DD```O!P```````<E<``&2!P``
+M`````<F```&2!P```````<FT```!"0`!QO@``<FX```!#``!QO@``<O<```"
+M"0``6]P``<O@```"#```6]P``<P\``!X!P```````<Q4``!X!P```````<Q@
+M```""0``6]P``<QD```"#```6]P``<R$``&2!P```````<R<``$W!P``````
+M`<RX```""0``8'0``<R\```"#```8'0``<S0``&2!P```````<SH``$W!P``
+M`````<T````""0``8'P``<T$```"#```8'P``<TP``&2!P```````<U(``$W
+M!P```````<U@```""0``8)0``<UD```"#```8)0``<V0``&2!P```````<VH
+M``$W!P```````<W$```""0``8*P``<W(```"#```8*P``<XT``!X!P``````
+M`<Y0``!X!P```````<YP``!X!P```````<Z,``!X!P```````<ZH``!X!P``
+M`````<[$``!X!P```````<[0```""0``8*P``<[4```"#```8*P``<[T``&2
+M!P```````<\,``$W!P```````<\L```""0``8D0``<\P```"#```8D0``<^$
+M``!X!P```````<^@``!X!P```````<_\``!X!P```````=`4``!X!P``````
+M`=`L``!X!P```````=`X```""0``8D0``=`\```"#```8D0``=!<``&2!P``
+M`````=!T``$W!P```````=#```&#!P```````=$0``!Y!P```````=%0``&#
+M!P```````=%H``&#!P```````=%X``!Y!P```````=)L``$B!P```````=/<
+M``!Y!P```````=0(``!Y!P```````=2(``&#!P```````=8$``%9!P``````
+M`=@4``%9!P```````=A$``"%!P```````=AH``"%!P```````=B4```""0``
+M92P``=B8```"#```92P``=BH```""0``92P``=BL```"#```92P``=C4```"
+M"0``92P``=C8```"#```92P``=CL``#/!P```````=D<``#/!P```````=E(
+M```!"0`!V"@``=E,```!#``!V"@``=E8```!"0`!QQ@``=E<```!#``!QQ@`
+M`=EH```!"0`!R9P``=EL```!#``!R9P``=EX```!"0`!R"0``=E\```!#``!
+MR"0``=F(```!"0`!R?P``=F,```!#``!R?P``=F8```!"0`!T90``=F<```!
+M#``!T90``=FH```!"0`!V'P``=FL```!#``!V'P``=FX```!"0`!V(0``=F\
+M```!#``!V(0``=G0```!`P`!WA0``=G4```!`P`!WA@``=G8```!`P`!W?0`
+M`=G<```!`P`!W?P``=G@```!`P`!WA0``=GD```!`P`!WA0``=GH```!`P`!
+MW@0``=GL```!`P`!W@P``=GX```""0``95@``=G\```"#```95@``=H@``&2
+M!P```````=HX``$W!P```````=I4```""0``9M@``=I8```"#```9M@``=IL
+M``&2!P```````=J$``$W!P```````=J@```""0``:0```=JD```"#```:0``
+M`=K$``&2!P```````=K<``$W!P```````=LD``$[!P```````=M,``!Y!P``
+M`````=M@``$[!P```````=N(``!Y!P```````=ND```O!P```````=NX``&5
+M!P```````=OL``&2!P```````=P(``$X!P```````=Q<``!Y!P```````=QH
+M```O!P```````=R```$X!P```````=RX``!Y!P```````=S$```O!P``````
+M`=S<``$X!P```````=T```!Y!P```````=T,```O!P```````=TD``$X!P``
+M`````=U(``!Y!P```````=U0```O!P```````=U@```O!P```````=V8``&2
+M!P```````=VL``&2!P```````=W@```!"0`!V=```=WD```!#``!V=```=_`
+M```""0``;````=_$```"#```;````=_H```""0``;`@``=_L```"#```;`@`
+M`>`H```""0``;"```>`L```"#```;"```>!H```""0``;#@``>!L```"#```
+M;#@``>#```!X!P```````>#8``!X!P```````>#P``!X!P```````>$<``!X
+M!P```````>$X``!X!P```````>%4``!X!P```````>%P``!X!P```````>&,
+M``!X!P```````>&H``!X!P```````>'4``!X!P```````>((``!X!P``````
+M`>(D``!X!P```````>*,``!X!P```````>*D``!X!P```````>*\``!X!P``
+M`````>+4``!X!P```````>,```!X!P```````>,8``!X!P```````>,P``!X
+M!P```````>-(``!X!P```````>-@``!X!P```````>-L```""0``;_@``>-P
+M```"#```;_@``>/,``!X!P```````>/H``!X!P```````>1(``!X!P``````
+M`>1@``!X!P```````>1L```""0``;````>1P```"#```;````>2$``&2!P``
+M`````>2<``$W!P```````>2T```""0``;`@``>2X```"#```;`@``>38``&2
+M!P```````>3P``$W!P```````>4(```""0``;"```>4,```"#```;"```>4L
+M``&2!P```````>5$``$W!P```````>5<```""0``;#@``>5@```"#```;#@`
+M`>6```&2!P```````>68``$W!P```````>6T```""0``;_@``>6X```"#```
+M;_@``>78``&2!P```````>7P``$W!P```````>@T``#H!P```````>A(``#H
+M!P```````>B@``#H!P```````>BT``#H!P```````>CP``#H!P```````>D<
+M``#H!P```````>DP``#H!P```````>EL``#H!P```````>ST``&#!P``````
+M`>T,``&#!P```````>T<``!Y!P```````?)$``"%!P```````?)H``"%!P``
+M`````?4X``&#!P```````?5(``&#!P```````?58``!Y!P```````?6H``&#
+M!P```````?7(``&#!P```````?78``!Y!P```````?:H``#/!P```````?;8
+M``#/!P```````?<4```!"0`!\B@``?<8```!#``!\B@``?<D```!"0`!V?``
+M`?<H```!#``!V?```?<T```!"0`!W<@``?<X```!#``!W<@``?=$```!"0`!
+MVOP``?=(```!#``!VOP``?=4```!"0`!WB```?=8```!#``!WB```?=D```!
+M"0`!YB```?=H```!#``!YB```?=T```!"0`!]CP``?=X```!#``!]CP``?>$
+M```A"0```````?>(```A#````````?><```!`P`!_X```?>@```!`P`!_X0`
+M`?>D```!`P`!_V```?>H```!`P`!_V@``?>L```!`P`!_X```?>P```!`P`!
+M_X```?>T```!`P`!_W```?>X```!`P`!_W@``??$```""0``<3```??(```"
+M#```<3```??L``&2!P```````?@$``$W!P```````?@@```""0``<K```?@D
+M```"#```<K```?@X``&2!P```````?A0``$W!P```````?AL```""0``=P@`
+M`?AP```"#```=P@``?B0``&2!P```````?BH``$W!P```````?CP``$[!P``
+M`````?D8``!Y!P```````?DL``$[!P```````?E4``!Y!P```````?EP```O
+M!P```````?F$``&5!P```````?FX``&2!P```````?G4``$X!P```````?HH
+M``!Y!P```````?HT```O!P```````?I,``$X!P```````?J$``!Y!P``````
+M`?J0```O!P```````?JH``$X!P```````?K,``!Y!P```````?K8```O!P``
+M`````?KP``$X!P```````?L4``!Y!P```````?L<```O!P```````?LL```O
+M!P```````?MD``&2!P```````?MX``&2!P```````?P4```""0``>@@``?P8
+M```"#```>@@``?P\```""0``>A```?Q````"#```>A```?Q\```""0``>B@`
+M`?R````"#```>B@``?R\```""0``>D```?S````"#```>D```?T4``!X!P``
+M`````?TP``!X!P```````?T\```""0``?,@``?U````"#```?,@``?V````"
+M"0``>@@``?V$```"#```>@@``?V8``&2!P```````?VP``$W!P```````?W(
+M```""0``>A```?W,```"#```>A```?WL``&2!P```````?X$``$W!P``````
+M`?X<```""0``>B@``?X@```"#```>B@``?Y```&2!P```````?Y8``$W!P``
+M`````?YP```""0``>D```?YT```"#```>D```?Z4``&2!P```````?ZL``$W
+M!P```````?[(```""0``?,@``?[,```"#```?,@``?[L``&2!P```````?\$
+M``$W!P```````?],```!"0`!]YP``?]0```!#``!]YP``@%,``&#!P``````
+M`@%D``&#!P```````@%X``!Y!P```````@'P``&#!P```````@((``&#!P``
+M`````@(8``!Y!P```````@7X``&#!P```````@<(``&#!P```````@@H``&5
+M!P```````@A<``&5!P```````@B(``&2!P```````@D$``&2!P```````@ET
+M``&2!P```````@FD``"%!P```````@G(``"%!P```````@GL``"%!P``````
+M`@RL``&#!P```````@S,``&#!P```````@S<``!Y!P```````@TL``&#!P``
+M`````@U,``&#!P```````@U<``!Y!P```````@XX``#/!P```````@YH``#/
+M!P```````@Y\``#/!P```````@ZP```!"0`""8@``@ZT```!#``""8@``@[`
+M```!"0`!][P``@[$```!#``!][P``@[0```!"0`!_S0``@[4```!#``!_S0`
+M`@[@```!"0`!^,@``@[D```!#``!^,@``@[P```!"0`!^Y0``@[T```!#``!
+M^Y0``@\````!"0`"![0``@\$```!#``"![0``@\0```!"0`"#<P``@\4```!
+M#``"#<P``@\@```A"0```````@\D```A#````````@\X```!`P`"&(@``@\\
+M```!`P`"&(P``@]````!`P`"&&@``@]$```!`P`"&'```@](```!`P`"&(@`
+M`@],```!`P`"&(@``@]0```!`P`"&'@``@]4```!`P`"&(```@]@```""0``
+M?1```@]D```"#```?1```@^(``&2!P```````@^@``$W!P```````@^\```"
+M"0``?^```@_````"#```?^```@_4``&2!P```````@_L``$W!P```````A`(
+M```""0``@^```A`,```"#```@^```A`L``&2!P```````A!$``$W!P``````
+M`A",``$[!P```````A"T``!Y!P```````A#(``$[!P```````A#P``!Y!P``
+M`````A$,```O!P```````A$@``&5!P```````A%4``&2!P```````A%P``$X
+M!P```````A'$``!Y!P```````A'0```O!P```````A'H``$X!P```````A(@
+M``!Y!P```````A(T``$X!P```````A)8``!Y!P```````A)L``$X!P``````
+M`A*0``!Y!P```````A*8```O!P```````A*H```O!P```````A+@``&2!P``
+M`````A+T``&2!P```````A1P```""0``AN```A1T```"#```AN```A28```"
+M"0``AN@``A2<```"#```AN@``A38```""0``AP```A3<```"#```AP```A48
+M```""0``AQ@``A4<```"#```AQ@``A5\``!X!P```````A68``!X!P``````
+M`A6P``!X!P```````A7<```""0``BI```A7D```O!P```````A88``!X!P``
+M`````A8X``!X!P```````A9$```""0``BI```A9(```"#```BI```A:(```"
+M"0``AN```A:,```"#```AN```A:@``&2!P```````A:X``$W!P```````A;0
+M```""0``AN@``A;4```"#```AN@``A;T``&2!P```````A<,``$W!P``````
+M`A<D```""0``AP```A<H```"#```AP```A=(``&2!P```````A=@``$W!P``
+M`````A=X```""0``AQ@``A=\```"#```AQ@``A><``&2!P```````A>T``$W
+M!P```````A?0```""0``BI```A?4```"#```BI```A?T``&2!P```````A@,
+M``$W!P```````AA4```!"0`"#S@``AA8```!#``"#S@``AI4``&#!P``````
+M`AIL``&#!P```````AJ```!Y!P```````AKX``&#!P```````AL0``&#!P``
+M`````AL@``!Y!P```````A\```&#!P```````B`0``&#!P```````B$T``&5
+M!P```````B%H``&5!P```````B&4``&2!P```````B(0``&2!P```````B*`
+M``&2!P```````B*L``"%!P```````B+0``"%!P```````B+T``"%!P``````
+M`B6\``&#!P```````B7<``&#!P```````B7L``!Y!P```````B8\``&#!P``
+M`````B9<``&#!P```````B9L``!Y!P```````B=(``#/!P```````B=X``#/
+M!P```````B>,``#/!P```````B?````!"0`"(I```B?$```!#``"(I```B?0
+M```!"0`"#U@``B?4```!#``"#U@``B?@```!"0`"&#P``B?D```!#``"&#P`
+M`B?P```!"0`"$&0``B?T```!#``"$&0``B@````!"0`"$Q```B@$```!#``"
+M$Q```B@0```!"0`"(+P``B@4```!#``"(+P``B@@```!"0`")MP``B@D```!
+M#``")MP``B@P```A"0```````B@T```A#`````````#```$.`P````````#$
+M``!D`P````````#(``#"`P````````#,``"U`P````````#0``%^`P``````
+M``#4``#5`P````````#8``!4`P````````#<``#A`P````````#@``"B`P``
+M``````#D``%[`P````````#H``%.`P````````#L``"_`P````````#P```^
+M`P````````#T``"&`P````````#X``!7`P````````#\```@`P````````$`
+M``%L`P````````$$``&8`P````````$(```N`P````````$,``".`P``````
+M``$0``%+`P````````$4```I`P````````$8```\`P````````$<``!H`P``
+M``````$@``&"`P````````$D``%]`P````````$H``$;`P````````$L``"V
+M`P````````$P``%C`P````````$T``%F`P````````$X``$+`P````````$\
+M``#>`P````````%```%``P````````%$``"2`P````````%(``%V`P``````
+M``%,``#``P````````%0``"X`P````````%4``"'`P````````%8``"P`P``
+M``````%<``!5`P````````%@``#)`P````````%D``$\`P````````%H``$0
+M`P````````%L``"F`P````````%P``$U`P````````%T``#K`P````````%X
+M``%@`P````````%\``%0`P````````&```$M`P````````&$```R`P``````
+M``&(``"W`P````````&,``%>`P````````&0``$=`P````````&4``$F`P``
+M``````&8```]`P````````&<``!U`P````````&@``%(`P````````&D``#F
+M`P````````&H``!/`P````````&L```V`P````````&P``"-`P````````&T
+M```(`P````````&X``#W`P````````&\``%!`P````````'```$V`P``````
+M``'$``#X`P````````'(``&$`P````````',``!J`P````````'0```*`P``
+M``````'4``%H`P````````'8``"N`P````````'<``$1`P````````'@``$:
+M`P````````'D``%R`P````````'H``$T`P````````'L``"H`P````````'P
+M``!%`P````````'T``$O`P````````'X```3`P````````'\``"]`P``````
+M``(```!P`P````````($``#Z`P````````((``#\`P````````(,``%5`P``
+M``````(0``%G`P````````(4``&!`P````````(8```/`P````````(<``%2
+M`P````````(@``$D`P````````(D``$-`P````````(H``"C`P````````(L
+M``%3`P````````(P```!`P``8Y@```(T``&6`P````````(X``$L`P``````
+M``)```%>`P````````)$``$=`P````````)(``$F`P````````),```]`P``
+M``````)0``!U`P````````)4```!`P``8\```!C0``%)`P```````!C4``%I
+M`P```````!C8``%;`P```````!C<``&``P```````!C@``!C`P```````!CD
+M``!V`P```````!CH``"5`P```````!CL``!M`P```````!CP```-`P``````
+M`!CT```U`P```````!CX``!A`P```````!C\``!B`P```````!D````Y`P``
+M`````!D$``%O`P```````!D(``$/`P```````!D,``&,`P```````!D0``"#
+M`P```````!D4``%Y`P```````!D8``$$`P```````!D<``"L`P```````!D@
+M``$I`P```````!DD```B`P```````!DH``$)`P```````!DL```9`P``````
+M`!DP``%K`P```````!DT``#I`P```````!DX```?`P```````!D\```J`P``
+M`````!E```"O`P```````!E$``%_`P```````!E(``%M`P```````!E,``%Z
+M`P```````!E0``$]`P```````!E4``#T`P```````!E8``$!`P```````!E<
+M``#P`P```````!E@``$4`P```````!ED``!_`P```````!EH``":`P``````
+M`!EL``!T`P```````!EP``%-`P```````!ET``"A`P```````!EX``!``P``
+M`````!E\``$^`P```````!F```$Y`P```````!F$``![`P```````!F(```Z
+M`P```````!F,``%1`P```````!F0``#?`P```````!F4``$P`P```````!F8
+M``#E`P```````!F<``#%`P```````!F@``#D`P```````!FD``%%`P``````
+M`!FH``#0`P```````!FL```W`P```````!FP``!@`P```````!FT``#:`P``
+M`````!FX``%*`P```````!F\``%8`P```````!G```$H`P```````!G$```<
+M`P```````!G(``!;`P```````!G,``$R`P```````!G0``&7`P```````!G4
+M``!(`P```````!G8``"<`P```````!G<``%D`P```````!G@``#6`P``````
+M`!GD``$&`P```````!GH```>`P```````!GL``#]`P```````!GP```X`P``
+M`````!GT``$"`P```````!GX``#M`P```````!G\``"/`P```````!H````G
+M`P```````!H$``!0`P```````!H(``"4`P```````!H,``#=`P```````!H0
+M``#-`P```````!H4``%:`P```````!H8``#,`P```````!H<``%5`P``````
+M`!H@``&3`P```````!HD```'`P```````!HH``"D`P```````!HL``!Q`P``
+M`````!HP``!K`P```````!HT``#Q`P```````!HX``#U`P```````!H\``$(
+M`P```````!I````!`P``JM```!I$``$N`P```````!I(``%,`P```````!I0
+M``#%`P```````!I4``#D`P```````!I8``%%`P```````!I<``#0`P``````
+M`!I@```W`P```````!ID```!`P``JS0``#H(``!:`P```````#H,``""`P``
+M`````#H0``%W`P```````#H4``!L`P```````#H8``!$`P```````#H<``#9
+M`P```````#H@``"Z`P```````#HD``$>`P```````#HH``"M`P```````#HL
+M``!3`P```````#HP``"?`P```````#HT``!6`P```````#HX``$%`P``````
+M`#H\``%B`P```````#I```",`P```````#I$``$``P```````#I(``#G`P``
+M`````#I,``&=`P```````#I0``&1`P```````#I4``"[`P```````#I8``!^
+M`P```````#I<``$E`P```````#I@```H`P```````#ID``%A`P```````#IH
+M``%6`P```````#IL``"(`P```````#IP``%E`P```````#IT``!>`P``````
+M`#IX``%#`P```````#I\``$#`P```````#J```#^`P```````#J$```2`P``
+M`````#J(``%P`P```````#J,``!\`P```````#J0``#B`P```````#J4``%U
+M`P```````#J8``#;`P```````#J<``"8`P```````#J@``$S`P```````#JD
+M``#[`P```````#JH```0`P```````#JL``">`P```````#JP```)`P``````
+M`#JT``"9`P```````#JX``%"`P```````#J\``"R`P```````#K```#J`P``
+M`````#K$```_`P```````#K(``$A`P```````#K,``"E`P```````#K0``"S
+M`P```````#K4``$9`P```````#K8``!-`P```````#K<``%&`P```````#K@
+M``%4`P```````#KD``$6`P```````#KH``&9`P```````#KL``!)`P``````
+M`#KP``#(`P```````#KT``"J`P```````#KX``&'`P```````#K\``!,`P``
+M`````#L```"0`P```````#L$``&+`P```````#L(``"I`P```````#L,``#.
+M`P```````#L0``!"`P```````#L4``!+`P```````#L8```M`P```````#L<
+M``!!`P```````#L@```[`P```````#LD``#L`P```````#LH``!&`P``````
+M`#LL``"!`P```````#LP```T`P```````#LT```S`P```````#LX```8`P``
+M`````#L\``!S`P```````#M```#Y`P```````#M$``!N`P```````#M(``$G
+M`P```````#M,``&&`P```````#M0``#2`P```````#M4``%5`P```````#M8
+M``"3`P```````#M<``&4`P```````#M@``$2`P```````#MD``#3`P``````
+M`#MH```C`P```````#ML``%X`P```````#MP``!O`P```````#MT``#7`P``
+M`````#MX``#'`P```````#M\``#N`P```````#N```&/`P```````#N(``$9
+M`P```````#N,``!-`P```````#N0``%&`P```````#N4``%4`P```````#N8
+M``$6`P```````#N<``&:`P```````#ND```!`P`!"\P````,```#`P``````
+M```0```#`P````@````4```#`P```!`````8```#`P```!@````<```#`P``
+F`"`````@```#`P```"@````D```#`P```#`````H```#`P```#@`
+`
+end
diff --git a/sys/contrib/dev/ath/public/sparc-be-elf.inc b/sys/contrib/dev/ath/public/sparc-be-elf.inc
new file mode 100644
index 0000000..a58cf80
--- /dev/null
+++ b/sys/contrib/dev/ath/public/sparc-be-elf.inc
@@ -0,0 +1,72 @@
+#
+# Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id$
+#
+
+#
+# Compilation configuration for building big-endian Sparc for 32-bit.
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=sparc-elf
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/sparc-elf-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -m32
+COPTS+= -mno-fpu
diff --git a/sys/contrib/dev/ath/public/sparc-be-elf.opt_ah.h b/sys/contrib/dev/ath/public/sparc-be-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/sparc-be-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/sparc64-be-elf.hal.o.uu b/sys/contrib/dev/ath/public/sparc64-be-elf.hal.o.uu
new file mode 100644
index 0000000..dbbd60b
--- /dev/null
+++ b/sys/contrib/dev/ath/public/sparc64-be-elf.hal.o.uu
@@ -0,0 +1,6404 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/COPYRIGHT#1 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@("`0`````````````!`"L````!````````````````````````````
+M`R@H`````@!```````!```T`"@``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````P```("B(%@"0`!>@A!@`("B(%@T
+M2``?`P``!("B(!L42``0@*(@4H"B(!HV2`!4`P```("B(!(42``K@*(@$X"B
+M(!$V2`!'`P```("B(`<B0`!"`P```!!H`$J"$"```D``0H"B(%(T2``&@*(@
+M5P,```""$&``$&@`-("B(!PB0``[`P```!!H`#Z"$"``@A!A!X"B``$"0``P
+M`P```!1(`!4#```$`P```("B()$"0``T@A!@`("B()$42``(`P``!(("/WJ`
+MH&`!.$@`+8(0(``0:``H`P```((08!2`H@`!(D``)@,````0:``E@A`@`(@0
+M81.`H@`$(D``(`,````42``("P``/((081*`H@`!(D``$P,````0:``9@A`@
+M`(@18!,#````@*(`!`)``!2"$&``B!%A&P,```""$&``@*(`!`)```X!````
+M$&@`#((0(``0:``*@A!@`!!H``B"$&```P```!!H``6"$&``$&@``X(08`""
+M$&``@</@")`0``&=X[]``P``!8(08HR"'@`!@*```8A@/_\#```I@A!C)X(>
+M``&`H``!@F`__X"1``$R2``(D2YP,`,```2"$&"W@*8``1)```60$"``D2YP
+M,'___XJ1,C`P@<?@")'H``B=X[]`DA``&900`!J6$``;F!``'("F(@<"0`!$
+MD!``&("F(@<42``4`P``!("F(!(42``*@*8@$X"F(!$V2``WD2HP,("F(`<B
+M0``YD2HP,!!H`#N0$"```D``*X(&/^:`H&`".$@`-I`0(``0:``FD!`@$X@0
+M81.`I@`$(D``(Y$J,#`T2``/`P``/(@080>`I@`$(D``)I$J,#`$2``6@A!@
+M%`,```2"$&$2@*8``2)``!J1*C`P$&@`(9`0(`"($&$;@*8`!")``!21*C`P
+M-$@`"`,``#^"$&`3@*8``2)```J1*C`P$&@`%9`0(`""$&,9@*8``3)(`!&0
+M$"``D!`@$Y$J,#!`````D3(P,!!H``T!````0````)$R,#`0:``)`0```)$J
+M,#!`````D3(P,!!H``0!````@A`@`<(C```"P@`0`0```,(2(WC",B`(PA(C
+M>L(R(`K"`B-\PB(@+,(2(X#",B`PPA(C@L(R(#+"$B.$PC(@-,(2(X;",B`V
+M@<?@")'H``C2(B.(@</@")`0(`&=X[]`HA``&*`0(`"0$``10````),V8`"0
+M#H`(@*(`&P)```FP$"`!0````)`0(`J@!"`!@*0CYR1/__:0$``1L!`@`('/
+MX`@!````B!`@`("A``D:0``)BA`@`(@!``2""B`!B!$``8H!8`&`H4`)"D__
+M^Y$R(`&!P^`(D3$@`)WCOT">$``8NA``&X(&P!N"`$`;@RAP`H(`0!G*$&`F
+M@*%@``)(`'^P$"``B2]P,(DQ,#""`0`$@@!`!(,H<`*"`$`9P@A@)8"@8`(B
+M0``F@A`B?11(``>`H&`#@*!@``)(``J`IR``$&@`;((0(``"0`!1@*!@!")`
+M`%N#*6`"$&@`9H(0(``"2``+MA`@P(,O<#"#,'`PB`!``8@!``&)*3`"B`$`
+M&<()("F`H&``MV9@8(DNH`.#+J`(@B!`!(,H8`*"`$`$@RA@`X,P8`"),6``
+M@FA`!((&P`$0:`!/@@!@"H,H<`/"6\`!(LA`$H(0(GW"4&`"@*!@`#9(``Z"
+M$")]@RE@!(,P8`"Z:&/HB2Z@`X(!`!V"`&`5B3!@`(,W8`"":0`!@RA@!!!H
+M`#N"`&"0@RAP`_!;P`$"S@`3@RE@`L@6(`(#```0@(D``2)(``Z#*6`"@RE@
+M`X,P8`"Z:&/HB2Z@`X(!`!V"`&`5B3!@`(,W8`"":0`!@RA@`Q!H`":"`&!(
+M@S!@`+IH8^B)+J`#@@$`'8(`8!6),&``@S=@`()I``&#*&`"$&@`&X(`8"2#
+M*6`#@S!@`+IH8^B)+J`#@@$`'8(`8!6),&``@S=@`()I``&#*&`"$&@`#X(`
+M8!:#,&``NFACZ(DNH`."`0`=@@!@%8DP8`"#-V``@FD``8,H8`*(`&"]@@!@
+M7("A8^>#90`$@RA@$+$P8!"!S^`(`0```,(28`*""&`@@*!@`!)``!:0$"`"
+MPA)@`H((8-"`H&#``D``$9`0(`/"$F`"@@A@T("@8-`"0``,D!`@!,(28`*"
+M"&`0@*!@`!)(``>0$"`!PA)@`H((:`"`H&``D!`@!9%D8`"!P^`(`0```)WC
+MOT""#J"`@*!@``)(``R0$``8@*9IM`)``&:P$"`.@@9VF8,X8`"`IFFS"$@`
+M8;%H8`40:`!;@@9V,((.H0"`H&```D@`(("F:;1``````0````+*``F"#J%`
+M`S__^X(08+."!D`!@*!@,`A(`#.#+F`"@@ZA0("@``&*0"```P``!((08XB`
+MID`!B!`@`(EE(`&"!G!@@S!@`()H8`6`B4`$$D@`0[$X8``#/__[@A!@>((&
+M0`&#,&``$&@`/()H8`4"0``[L!`@#H(&=IF#.&``@*9ILPA(`#:Q:&`%`S__
+M^X(08'B"!D`!@S!@`()H8`6Q.&```P``!((08X>`ID`!&$@`*P$```!`````
+M`0````+*`!N"!G!@`S__^X(08+."!D`!@*!@,#A(`!6"!G!@@RY@`H(`0!F:
+M`$`!BS9@`(AI8`6#*3`"@@!`!(HA0`$#/__/@A!C#8(#0`&#,&``@*%@`@)`
+M`!&":&`%`S__SX(08P@0;__0@@-``8,P8`"":&`%L3A@``,```2"$&,D@*9`
+M`1A(``:"!G8P@S!@`()H8!2"`&`/L3A@`('/X`@!````G>._0)`0`!B($")]
+MB2DP`])>``2(!D`9B`$`&8DI(`*((0`9B`$`!`+"0`FQ,2``0`````$````#
+M````@A!@`,((0`B"3D`!L3!@`('/X`@!````G>._0)`0`!B"$")]@RAP`])>
+M``&#-F```L)`";!H8!9``````0```(DV8``#````@A!@`,((0`BP:0`!@<_@
+M"`$```"=X[]`P@Y@!("@8``22``PI!`@`(@0/_^#/*``@@9``:0$H`&`I*`?
+M!$___,@H8`2D$"``P@9``("D@`$60``D@SR@`*``0`&@!``!H2PP`J`$`!G(
+M#"`HX@P@*X()(/^"!D`!Y"A@!,(,("F($0`!B`D@_X@&0`3D*2`$H@Q@_Y`0
+M`!B2$``9E!`@#I80`!%`````F!`@`-`T("R0$``8DA``&900(`Z6$``10```
+M`)@0(`'0-"`NI`2@`<(&0`"`I(`!!D__X(,\H`"!S^`(`0```)H0``B`HF`B
+M&$``98H"(Y"#,F``@RAP`@D```"($2``P@$``8'`0``!````$&@`6<(2([C"
+M`4``@S!@!X((8`&`H``!$&@`5Y!@/_\0:`!1PA%@"A!H`$_"$6`(P@%``!!H
+M``N#,&`.P@%``(,P8`^""&`!@*!@`)`0(``0:`!)D69@#<(!0`"#,&`=$&@`
+M/(((8`'"`4``$&___8,P8!S"`4``$&__^H,P8!L0:``YP@(CJ("BH`$B0``V
+MPE(CK`I(`#B0$"``@**@`@)```:`HJ`#(D@`+\(#8[`0:``QD!`@#1!H`"O"
+M$V.NP@%``!!O_^>#,&`-P@%``!!O_^2#,&`,P@%``!!O_^&#,&`7P@%``!!O
+M_]Z#,&`*P@%``!!O_]N#,&`)@**@`0)```N"$"4!*D@`!\(!0`"`HJ`"`D@`
+M"`,```40:``6D!`@#1!O_\^#,&`($&@`"(,H<`(0:``,PA(``1!H``Z0$"`-
+M@A`@H8,H<`7"`T`!@*!@`)`0(``0:``'D61@#<(!8!3"(L``$&@``Y`0(`"0
+M$"`,@</@"`$```"`HF`9(D``$X"BH`$82``'@*)@'H"B8`\"0``(@**@`Q!H
+M`!X!`````D``&((0(*$0:``:`0```!)(`!B`HN`$&$@`%@$````0:``2UB(C
+ML`)```:`HJ`"`D``"@,```40:``.`0```("@``N(0"``@A`E`8,H<`(0:``&
+MR"(``1!H``36,@`!@RAP!=8B``$0:``&D!`@`0+#``."$"`,PB,``)`0(`"!
+MP^`(`0```)WCOT"D$``8L!``&H"FX`<(0``>IA`@`(,\X`"#*'`"X!9``8(&
+M0`'B$&`"@RP@$((00!'")@``L`8@!+8&__R3-"``0````)`0`!+0)@``H`0@
+M!+8&__R`I``1B!`@`(EE(`&`IN`#@A`@`(-G(`&`B0`!$D__\[`&(`2`IN`'
+M&$__YJ8$X`&P)@`:@<_@")$R(`"=X[]`D!``&("F8`T"0``3DA``&H"F8`T4
+M2``'@*9@'8"F8``"2``*@@8C>!!H`"2P$"```D``#H"F8!X"0``3@*;@`!!H
+M`!ZP$"``PG<``!!H``R"$"`0UD=``'___\347P``$&@`%=`G0`""$"*!@RAP
+M`X(&``'"=P``@A`@&!!H``[")T``$D@`"("FX`2"$"`$PB=``,A?``#"!B.T
+M$&@`!L(A```22``%L!`@`,(&@`#"(B.TL!`@`8'/X`@!````P@)@!("@8``"
+M2`!>D!`@`,("@`#"(D``P@*@!,(B8`C"`J`(PB)@#,("H`S"(F`0P@*@$("@
+M?_\"0``$@*!A`!!H``.#9V#_@A`@`L(B8!3"`J`4@*!__P)``!"($``!@*!D
+M`0,```&)9T`!@A`@`8"@0`0:0``*PB)@&((`0`&"$&`!@*!`!"I/__Z"`$`!
+M$&@``\(B8!C"(F`8P@*@&("@?_\"0``0@*!D`8@0``$#```!B6=``8(0(`&`
+MH$`$&D``"\(B8!R"`$`!@A!@`8"@0`0J3__^@@!``1!H``3"(F`<@A`C_\(B
+M8!S"$J`<@*!@``)(``;($J`<@*!@$((0(`\0:``#@V5`!((0(`K",F`@PA*@
+M'H"@8``"2``&R!*@'H"@8!""$"`/$&@``X-E0`2"$"`*PC)@(L("H"#"(F`D
+MP@*@),(B8"C"`J`HPB)@+,("H"S"(F`PP@*@!("@8`022``'D!`@`<("8`2`
+MH&`!(D```\(B8#B0$"`!@</@"`$```#"`J`$@*!@``)(`!^0$"``P@*@#,(B
+M8`C"`H``PB)``,("H`C"(F`$P@*@#,(B8`C"`J`0PB)@#,("H!3"(F`0P@*@
+M&,(B8!3"`J`<PB)@&,(2H"#",F`<PA*@(L(R8!["`J`DPB)@(,("H"C"(F`D
+MP@*@+,(B8"C"`J`PPB)@+)`0(`&!P^`(`0```)WCOT"D$``8D!``&$````"2
+M$``9HA``"`+"`!BP$"``PE(@%H"@8``R2``/PA(@%I`0`!)`````DA``&:`"
+M``C"7*-HD!``$I_`0`"2$``1`P```((08`#"$$`0$&@`!((`0`C($B`8@@!`
+M!(,H8!"#.&`0L3A@`('/X`@!````G>._0+@0(`"N$"``MA`@`*00(`""$""?
+M@RAP!<(&``&`I(`!&D``0JP0(``#````NA!@`((0()^G*'`%@SR@`(,H<`:"
+M!@`!H@!CX,)48!:`H&``%D@`,.`48!:0$``80````)(0`!&J$``(D`(`".@7
+M0`B@!``4PEXC:)`0`!B?P$``DA``$<(48`*""&$`@*!@``)(`!"@!``(B2P@
+M$(,NX!"`H$`$)$@`'*0$H`&V$``0PEXC:)`0`!B?P$``DA``$<(48!:"`$`(
+M$&@`$JPE``&)+"`0@R\@$("@0`0D2``.I`2@`;@0`!"A-6``H`0`$,)>(VB0
+M$``8G\!``)(0`!'"%&`6@@!`",@70!"N(0`!I`2@`<(&`!.`I(`!"D__R(,\
+MH`"D$"``@RV@$*<X8!"#+>`0H3A@$(,\H`"#*'`&@@8``:(`8^#"5&`6@*!@
+M`#9(``ZD!*`!PEXC:)`0`!B?P$``DA``$<(48`*""&$`B`(`$Y`"`!"`H&``
+MD69`!-`T8!BD!*`!@*2@/P1/_^R#/*``@<_@"`$```#($@```P```)@08``#
+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
+MHR```D``19X0(`"#*G`P@S!P,(@`0`&(`0`!@RDP!(@!``&:`0`$E!`@`8DK
+M\#"),3`OB@>G_X(!0`3*$'_@@@%`!8(`0`6#*'`#@@-``8(`0`NV`&`>B`$`
+M&<)1(`R#*&`"PC;@#L(1(`3"-N`$PA;@`H@0``&#*&`0@S!@$("B@`$:0``>
+MN!`@`8,K\#"U,'`P@RD@$+$P8!")+S`PB3$P,+H!``2Z!T`;B2DP`H@!`!J(
+M`0`$B`$`&<I1(#2*`4`%PA=@#((`0`7"-V`.PA=@`L@1(`R"`$`$PC=@!(('
+M(`&X$``!@RA@$(,P8!"`H$`8"D__ZXDO,#""`^`!GA```8,H8!"#,&`0@*!`
+M#`I/_\B)*_`P@@)@`9(0``&#*&`0@S!@$,@2X!2`H$`$"D__J8DJ<#"!S^`(
+MD!`@`9WCOS""$"`$PC>GWX(0(`;"-Z?A@A`@"<(WI^."$"`,PC>GY:80(`!`
+M````D!`D%`+"`'&@$``(PA9@%H"@8``"2``CY!9@T$````"2$"04PA9@:,(T
+M(!:7-*``D!``&)(0`!F4$``0F!`@"G___2":$"```LH`7`$```"B!FUHPA9@
+M:,(T8!:0$``1?__^Z9(0`!"0$``8DA``$'___U24$``1`L(`4(@'I__"%"`:
+M@@!``8(!``'($'_>PA0@%()(0`2D!(`!I`2@!<(68!J`H&``(D@`)L(68!R0
+M$``00````)(0)!3"%F!JPC0@%I<TH`"0$``8DA``&900`!"8$"`$?__\^IH0
+M(`$"R@`V@A`D7X,H<`*B!D`!PA9@:L(T8!:0$``1?__^PI(0`!"0$``8DA``
+M$'___RV4$``1`L(`*8@'I__"%"`:@@!``8(!``'($'_>PA0@%()(0`2D!(`!
+MI`2@`L(68!R`H&``(D@`':80(`&0$``00````)(0)!3"%F!LPC0@%I<TH`"0
+M$``8DA``&900`!"8$"`$?__\TYH0(`("R@`/@A`A68,H<`2B!D`!PA9@;,(T
+M8!:0$``1?__^FY(0`!"0$``8DA``$'___P:4$``1*LH``J80(`$"Q``%L33@
+M`$````"0$``0L33@`('/X`@!````G>._,,@60``#```/@A!C_X"A``$(2``+
+MI!``&,(68"Z`H&`!$D@`"`,``!.0$``8?__[(Y(0`!D0:`#-L!``"`,``!."
+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
+M```/@A!C_X"A``$(2``%PEXC*)`0`!@0:``$DA`@RI`0`!B2$"#/G\!``)0'
+MI^T"R@`6P'>GW\H7I^W*-F`8PA9@%H"@8``22``/@A`@`<@60``#```/@A!C
+M_X"A``$H2``&PA9@&(,I8!"#,&`;$&@``X((8`&#,'`/PC9@%H(0(`'"=Z??
+M\%^GWX'/X`@!````G>._0)`0`!A___PIDA``&0+*`!6"$"``D!``&'__\OV2
+M$``9`LH`$((0(`"0$``8?__YEY(0`!D"R@`+@A`@`)`0`!A___IODA``&0+*
+M``:"$"``D!``&'__^P*2$``9@A``"('/X`B0$``!G>._0)`0`!C(%D```P``
+M#X(08_^`H0`!"$@`")(0`!G"%F`N@*!@`1)(``0!````?__U\P$````!````
+M@<_@"`$```#($@``PA)``("A``$R2``(T!(``-`2(`()```PB!$A\)`*``3"
+M$F`"@@A`!)`B``&!P^`(D3H@`-`2([@#/__0D"H``8'#X`B1.B``BA``"(@0
+M(`"#.2``@RAP`\)90`$*P$`'D!`@`(@!(`&`H2`!!$__^H,Y(`"0$"`!@</@
+M"`$```"=X[]`?___[)`0`!B)*B`0BA`@``,```"8$&``@*$@`!9(`!:;,2`0
+M`S__X((J``$)````F!$@`(,H8!";,&`0@SE@`(DH<`*(`0`!B2DP`L(3``2`
+MH$`-`D``$[`0(`&*`6`!@*%@@@A/__>#.6``$&@`#;`0(`"#.6``@RAP!<(3
+M``&`H$`-`D``![`0(`&*`6`!@*%@2@A/__F#.6``L!`@`('/X`@!````G>._
+M0)`0`!B@$``9`LY`,;`0(`%___^]`0```(,J(!"`H&``-D@`"H,P8!")+"`0
+MB3$@$(,H<"&#,'`QB!D``8"@``00:``CL&`__X@88?^`H``$B&`__X"@``&"
+M8#__@)$``1)(`!NP$"`!BA`@``,```":$&``@RP@$+,P8!"#*B`0D3!@$(,Y
+M8`")*'`"B`$``8DI,`+"$T`$@*9``3)(``B*`6`!@@$`#<(08`*`H$`(`D``
+M![`0(`&*`6`!@*%@@@A/__*#.6``L!`@`('/X`@!````G>._0,)>(R"?P$``
+MD!``&("*($("2``&L!``",(&8`B("C^]@*!@`+%D0`2"#B`@@*!@``)(``>"
+M#B`(P@9@#(@./]^`H&``L61`!((.(`B`H&```D@`!X(.(`'"!F`$B`X_]X"@
+M8`"Q9$`$@@X@`8"@8``"2``&`0```'___W*0!J`@@@X__K%Z%`&!S^`(D3(@
+M`)WCOL"B$``8D!``&4```"^P$"```L(`#[(0``B@!Z=OD!``$9(0`!D5`/]_
+ME3*P"D```(N6$``0`LH`!I`0`!&2$``9?___RI00`!"P$``(@<_@")$R(`"=
+MX[]`?___4)`0`!B`HB`2(D``%K`0(`$42``'@*(A_X"B(``B2``-PA8CNA!H
+M``^P$"```D``"`,``"""$&-*@*(``3)(``FP$"``$&@`![`0(`'"%B.Z@*!C
+M2@)```.P$"`!L!`@`('/X`@!````BA`@``,```"8$&``FA``"(,Y8`")*'`"
+MB`$``8DI,`+"$P`$@*!`#0)```>0`0`,B@%@`8"A8(((3__W@SE@`)`0(`"!
+MP^`(`0```)WCOT!___\AD!``&(,J(!"`H&``%D@`"J(0``@A/__@H"H`$)$L
+M,#!____CD3(P,*$L(!`*R@`8L30@$(H0(``#````FA!@`(,L8!"1,&`0@SE@
+M`(DH<`7"$T`$@*!`"#)(``F*`6`!@@$`#<(08!B`H&``$D``"+$X8`"*$"!+
+MB@%@`8"A8$HH3__S@SE@`+`0(`"!S^`(`0```)WCOT"0$``9B!`@``,```"*
+M$&``@SD@`),H<`?"$4`)@*!`&#)(``B(`2`!`L(`!)("0`5`````E!`@@!!H
+M``:P$"`!@*$@,`A/__2#.2``L!`@`('/X`@!````BA``"("A8``"2``0D!`@
+M`(@0(``#````FA!@`(,Y(`"#*'`%PA-``8"@0`4"0``'D!`@`8@!(`&`H2!*
+M"$__^8,Y(`"0$"``@</@"`$```"=X[]`JA``&*80(`"D$"``PA9``("@8``2
+M2``5J!`@`'___LB0$``8HA``")$J(!"`HB``!D``#J$R(!"0$``0?___Q9(0
+M(``*R@`'@RQ@$'___]B0$``0(LH`!M`68`*#+&`0$&@``Y$P8!#0%F`"`P``
+M/X(08P"`B@`!$D``48H0(`":$"```P```)@08`"#.6``B2AP!<(3``2`H$`(
+M$D@`!(H!8`&D`0`,FA`@`8"A8$J($"``B64@`8"@``V"8#__@(D``1)/__.#
+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
+M%F`"@@A@T("@8-`"0``8H!`@Y,(68`*""&%0@*!A4*`0(.,0:``2H69@X)`0
+M`!A`````DA``&0+"``ZQ-"``PA9@`H((8,"`H&#`$D@`".`"("""#"`/@*!@
+M`1)(``6Q-"``H`P_\*`4(`*Q-"``@<_@"`$```"=X[]`D!``&$````"2$``9
+M`L(`!K`0(`#"`B`<@S!@`H((8`&Q,&``@<_@"`$```"=X[]`IA``&K*&?_\"
+M0``?M`:`&("F@!@(8``8HA``&J4TX`"@)$`2D!``$)_&P`"2$``1@*(@``1`
+M`!&#-.``BA``$9H0`!/(#```P@E``,(L``"@!"`!R"E``)J#?_\23__ZB@%@
+M`:(D0!*`I$`8.&__[J`D0!*#-.``LH9__Q)/_^6T!H`!@<_@"`$```"=X[\P
+MH!``&*(0`!C"7B,HD!``&)(0(,&?P$``E`>G[0+*`""P$"``R!>G[0,```^"
+M$&/_@*$``9(0(,J392#/DS)@`,)<(RB0$``0G\!``)0'I^L"R@`3L!`@`,@7
+MI^T#```/@A!C_X"A``$H2``&R%>GZ\@7I^N),3`+$&@``X@)(`&),2`?@A`D
+M_8,H<`+()$`!@A`D_8,H<`+P1$`!@<_@"`$```"=X[]`?__[@9`0`!B`HB!(
+M`D``)@$````42``,"0``(("B($$42``?@*(@0X"B($`62``>@*(@`")(`!3"
+M%B.Z$&@`')`0(`""$2&-@*(``11(``L#```@@A$AB("B``$62``2@@(_MH"@
+M8`(X2``1D!`@`!!H``T!````@A!ACQ!H``B`H@`!@*!AB`9(``F0$"``@*!A
+MC01```2`H&&/,D@`!)`0(`!___^LD!``&(''X`B1Z``(G>._,*`0`!C"7B,H
+MD!``&)(0(,&?P$``E`>G[0+*`"2:$"```P```)@08`"#+F`0LS!@$(,[8`"(
+M`$`!B`$``8H!``3"$P`%@*!`&3)(`!6:`V`!R!>G[0,``!2"$&`"@*$``1A(
+M``6).V``@@%`#!!H``?"$&`"@@$`!((`0`2"`$`!@@!`#,(08`3"-".X?__\
+M#I`0`!@0:``%T#0CNH"C8`T(3__E@SM@`('/X`@!````G>._,*`0`!C"7B,H
+MD!``&)(0(,&?P$``E`>G[0+*`"2:$"```P```)@08`"#+F`0LS!@$(,[8`"(
+M`$`!B`$``8H!``3"$P`%@*!`&3)(`!6:`V`!R!>G[0,``!2"$&`"@*$``1A(
+M``6).V``@@%`#!!H``?"$&`"@@$`!((`0`2"`$`!@@!`#,(08`3"-".X?__[
+MX9`0`!@0:``%T#0CNH"C8`8(3__E@SM@`('/X`@!````G>._0'___W>0$``8
+M@*(@``)(`!0!````P@8CE(((8`&`H&```D@`#P$```#"%B.X@*!@``)(``C2
+M%B.XDRIP,),R<#!___^5D!``&!!H``4!````TA8CNG___[V0$``8`0```('/
+MX`@!````G>.^L)`0(%=`````D2HP!J(0``@"P@'-H!`@`J00``@3````DA)@
+M`)00(H5`````E2JP`_)T8!#T=&`8]G1@(/`T8WC`-&-Z@A`@/,(T8ZS`)&.P
+MB!`@`X(0)3N#*'`"R"1``8(0)6N#*'`"P"1``8@0)P""$"%;@RAP!,@D0`&(
+M$#__@A`E;8,H<`+()$`!@A`BMX,H<`/()$`!@A`E;X,H<`+()$`!D!``$4``
+M``"2$"```LH!I:`0(`."$"`!PB1C?)`0`!&2$"(!0````),J<`60"B#_T#1C
+M@)`0`!$3`!,#0````),R<`?0-&."P#1CAI`0`!&2$"F-DRIP!)00+@M`````
+ME`*`"K80(`"@$"$QD!``$I,L,`=`````%0``0+8&X`&`IN`#"$__^Y`0`!)`
+M````$P``)Y$R,!Q`````DA`@!)`"(`'0-*.$D!``$J`0)`%`````DRPP!+(0
+M``B4$B`!D!``$D````"3+#`$D!``$I(0(#U`````E`>G;0+"`6R@$"`(R!>G
+M;0,``!:"$&*E@*$``1)(`6:@$"`$D!``$I(0(#]`````E`>G;0+*`6"@$"`(
+MPA>G;8@0*A6(`0`$PC1`!)`0`!*2$"#!0````)0'IVT"P@%6H!`@",@7IVV)
+M,3`,@A`BA8,H<`/(-$`!@*$@`1)(`4Z@$"`%M!`@`+80(`"P!Z=OH`>G[Y(&
+MX,"3,F``E3;@`)0"@`J4!@`*0````)`0`!("P@%`@S;@`((`0`&"`$`0PA!_
+M@+8&X`&`IN`_"$__\K0>@`$#```_@A!C_X"F@`$22`$UH!`@!Y`0`!*2$""_
+M0````)0'IVT"P@$OH!`@",(/IV["-*.XR!>G<X(0)0N#*'`"R#1``<@7IW6"
+M$"H7@@!``<@T0`'(#Z=X@A`A0X,H<`3(+$`!R!>G=XDQ,`@#`!0Q@S!P"L@L
+M0`'(#Z=Z`P`4,X,P<`K(+$`!R!>G>8DQ,`B"$"H9@@!``<@L0`'(%Z=[B3$P
+M"((0*AN"`$`!R"Q``<@/IWP#`!0W@S!P"L@L0`'(%Z=]B3$P"((0(H>#*'`#
+MR"Q``<@/IWX#`!0Y@S!P"L@L0`'(#Z>`B`D@`8(0)0V#*'`"R"Q``<@7IW^)
+M,3`!B`D@!P,`%#6#,'`*R"Q``0,```""$&``PG2C:+80(`"8$"`)@A`J'90`
+M0`&6!Z?O@S;@`(DH<`.((0`!B2DP`H@!``&(!$`$F@$`"HLS(`"*`4`%B@%`
+M"\(1?X"#,'`*PBD`"L(1?X"#,'`$@@A@/\(K8`O($7^`B2D@`H@)(#R*`R`!
+MBS%@`(H!0`6*`4`+PA%_@(,P<`Z($0`!R"M@`<(1?X"#,'`(@@A@/\(K8`S"
+M$7^`@S!P`H((8#_"*V`"RA%_@(LI8`2*"6`PB`,@`HDQ(`"(`0`$B`$`"\(1
+M/X"#,'`,BA%``<HK8`W"$3^`@S!P!H((8#_"*V`#P@D_@8((8#_"*V`.B`,@
+M`XDQ(`"(`0`$B`$`"\(1/X"#,'`*PBM@!,(1/X"#,'`$@@A@/\(K8`_($3^`
+MB2D@`H@)(#R*`R`$BS%@`(H!0`6*`4`+PA%_@(,P<`Z($0`!R"M@!<(1?X"#
+M,'`(@@A@/\(K8!#"$7^`@S!P`H((8#_"*V`&RA%_@(LI8`2*"6`PB`,@!8DQ
+M(`"(`0`$B`$`"\(1/X"#,'`,BA%``<HK8!'"$3^`@S!P!H((8#_"*V`'P@D_
+M@8((8#_"*V`2B`,@!HDQ(`"(`0`$B`$`"\(1/X"#,'`*PBM@",(1/X"#,'`$
+M@@A@/\(K8!/($3^`B2D@`H@)(#R*`R`'BS%@`(H!0`6*`4`+PA%_@(,P<`Z(
+M$0`!R"M@"<(1?X"#,'`(@@A@/\(K8!3"$7^`@S!P`H((8#_"*V`*RA%_@(LI
+M8`2*"6`PB`,@"(DQ(`"(`0`$B`$`"\(1/X"#,'`,BA%``<HK8!7"$3^`@S!P
+M!H((8#_"*V`6P@D_@8((8#_"*V`7B`,@"8DQ(`"(`0`$B`$`"\(1/X"#,'`*
+MPBM@&,(1/X"#,'`$@@A@/\(K8!G*$3^`BRE@`HH)8#R(`R`*B3$@`(@!``2(
+M`0`+PA$_@(,P<`Z*$4`!RBM@&L(1/X"#,'`(@@A@/\(K8!O"$3^`@S!P`H((
+M8#_"*V`<M@;@`8"FX`0(3_]*F`,@"T```%60$``2M!`@`+80(`""$"!3H2AP
+M!I(0(!^2(D`;DS)@`)`0`!)`````E`>G;0+"`"7*%Z=MBRE@$(,Q8!"T!H`!
+M@@;`&XDP8`"(`0`1B`$`$(LQ8!C**2`+@@!@`8,P8`""`$`1@@!`$,@/IVZV
+M!N`!@*;@`@A/_^C(*&`+@*``&H)@/_\)``"_B!$C_8@>@`2`H``$B&`__X"0
+M0`022``,H!`@"94V8`"0$``2DA`D`4````"3*G`$$&@`$9`0`!(0:``(H!`@
+M"*`0(`B5-F``D!``$I(0)`%`````DRIP!`+$0`0!````0````)`0`!$JSP`"
+MX"<``)`0(`"!Q^`(D>@`")WCOT!`````D!``&`$```"!S^`(`0```)(*80"`
+MHF```D@`!Y`0(``#```%PC*``((083;",L``D!`@`8'#X`@!````@</@")`0
+M(`&*`B.0P@%@!((08`'"(6`$`P``!<(Q8`R"$&$VPC%@#L@"(Y`#$```B!$`
+M`0,``"""*0`!PB(CD((0(`/",6`(@A`@0,(Q8`K"`B.0@@AY_\(B(Y""$"4-
+M@RAP`L(*``&`H&```D@`#((0(`\#```%P#(``8@0(`&"$"4!@RAP`L@B``'"
+M`B.0@A!A`,(B(Y""$"`/PB%@%(@0(`&"$""A@RAP!<@B``&!P^`(D!`@`9WC
+MOT#4!F`$D!``&!,`(`M`````DS)P"-0&8`R0$``8DA`H`T````"3*G`$U`9@
+M$)`0`!@3`"`-0````),R<`C4!F`(D!``&!,`$`=`````DS)P!]0&0`"0$``8
+M$P`@"4````"3,G`(`0```('/X`@!````G>._(/(GI]/"!B.,@*!@`0)```Z0
+M$``8`P```,(`8`"")D`!@RA@`\(GI]L#````P@!@`((F0`&#*&`#PB>GWQ!H
+M``?R)Z?7@A`__\(GI]O")Z??@A`@`<(GI]<#/Y_`@BZ``<(GI\]`````D@>G
+MSP$```"!S^`(`0```)WCOT"0$``8$P`@"Y,R<`A`````E!`@`)`0`!@A`"`!
+M0````),T,`@#``0`@A!`"!4`*`"4*$`*E3*@`)`0`!A`````DS0P")`0`!@3
+M`"`)DS)P")00/_]`````E3*P,`$```"!S^`(`0```)WCOT#"%F`2@*!@``)(
+M`!^B$``8D!``&"$`(`%`````DS0P"!4`(`"4*@`*`P`(`)02@`&5,J``D!``
+M&$````"3-#`(U!9@$)`0`!@3`!`%0````),R<`?4%F`2D!``&!,`$`E`````
+MDS)P!]0&8!25*J`#E3*@`)`0`!@3`"`-$&@`"Y,R<`B0$``8(0`@`4````"3
+M-#`(%0`H`)0J``J5,J``D!``&),T,`A``````0```-0&0`"0$``8$P`@"T``
+M``"3,G`(D!``&!,`(`E`````DS)P"`,_X`"0"@`!R`9@"`,``#^"$&/_B`D`
+M`<(68!B`H&```D@`!Y`2``2"`&`$@RA@$`D`'\"""$`$D!(``94R(`"0$``8
+M$P`@"4````"3,G`(PA8C@("@8`,(2``8`0```/(68!J"#F`'@*!@``)(`!."
+M$"%;BRAP!,($0`6("'C_@RY@"(((9P"`IF`'"$@``X(1``&"$2<`PB1`!8(0
+M(5N#*'`$U`1``9`0`!@3`!`#0````),R<`<!````@<_@"`$```"=X[]`D!``
+M&)(0*`%`````DRIP`[`0(`"Q>C0!@<_@"`$```"=X[]`D!``&$````"2$"`<
+M@*(__Q)(``6"$"4UP"9``!!H`"2P$"``@RAP`L@&``&("@`$`P!!=H(08+J(
+M"0`!`P`<`((08""`B@`!`D@`!<@F0``#$```@A$``<(F0`"`BB`%`D@`!8"*
+M)<#"!D``@A!@`<(F0``B2``&R`9``,(&0`""$&!`PB9``,@&0``#$```@(D`
+M`2)(``:P$"`!@A`B@8,H<`/0)@`!L!`@`8'/X`@!````@A`E-8,H<`*!P^`(
+MT`(``9WCOT""$"4U@RAP`N(&``&`I&``%D@`!J`0`!B0$``8DA`@)$````"4
+M$"```P!!=H(08+J4#D`!@@Y@`8@2H`6`H&``E69`!((.8$"`H&``(D@`&Y4R
+MH`""$"*;@RAP`\($``&($J!`@*!@`)5F0`2"$"4W@RAP`L($``&($J$`@*!@
+M`)5F0`2"$""G@RAP!<($``&($J"`@*!@`)5F0`2"$"4Y@RAP`L($``&($J0`
+M@*!@`)5F0`25,J``D!``&$````"2$"`@@A`E-8,H<`*`IF``%D@`!O(D``&0
+M$``8DA`@)$````"4$"`!L31@`('/X`@!````@</@")`0($"=X[]`@*9@/QA(
+M``R0$``8DRY@!0,``"2"$&`<D@)``4````"3,F```P``(("(0`@22``#L!`@
+M`;`0(`"!S^`(`0```)WCOT"D$``8@*9@/QA(`#6P$"``H2Y@!2,``"22!``1
+MDS)@`)`0`!)`````E!`@`)(48`22!``)DS)@`)`0`!)`````E!`@`)(48`B2
+M!``)DS)@`)`0`!)`````E!`@`)(48`R2!``)DS)@`)`0`!)`````E!`@`)(4
+M8!"2!``)DS)@`)`0`!)`````E!`@`)(48!22!``)DS)@`)`0`!)`````E!`@
+M`)(48!B2!``)DS)@`)`0`!)`````E!`@`*(48!R@!``1H30@`)`0`!*2$``0
+M0````)00(`"P$"`!@<_@"`$```"=X[]`IA``&*`0`!F`IF`_&$@`*K`0(`"D
+M$"```L:`%)00(`#D#J`%I2R@",(.H`2D%(`!U`Z@`Y4JH!C"#J`"@RA@$)02
+M@`'"#J`!@RA@")02@`'"#H``E!*``94RH`&#+*`?E!*``:4TH`&A+"`0H30@
+M"R,``"22%&`8D@0`"9,R8`"5,J``0````)`0`!.B%&`<H`0`$:$T(``5```@
+ME!2`"I4RH`"0$``30````)(0`!"P$"`!@<_@"`$```"=X[]``RJJJH"G(``2
+M2``#BA!BJHH0(`"#+F`0@S!@$("@8#\82`!SD!`@`,(.@`"`H&``$D@`;P$`
+M``#"%J`"@*!@!`A(`&N`H&`%"$@`!K@0(`#"%J`"@*!@#;@0(`&Y9R`#U`Z@
+M!,(.H`6#*&`(E!*``<(.H`:#*&`0E!*``<(.H`>#*&`8E!*``90:@`7"#J`)
+M@RA@".H.H`BJ%4`!JAU`!0D``#^($2/_J@U`!.8.H`K"#J`+@RA@"*84P`'"
+M#J`,@RA@$*84P`'"#J`-@RA@&*84P`&F',`%P@Z@#X,H8`CH#J`.J!4``:@=
+M``6H#0`$X@Z@$,(.H!&#*&`(HA1``<(.H!*#*&`0HA1``<(.H!.#*&`8HA1`
+M`:(<0`7"%J`"B`Q@_X"@8`VC90`$H2Y@$*$T(`LE```DD@0`$I,R8`"5,J``
+M0````)`0`!B2%*`$D@0`"9,R8`"K-6``D!``&$````"4$``5DA2@")($``F3
+M,F``IS3@`)`0`!A`````E!``$Y(4H`R2!``)DS)@`*DU(`"0$``80````)00
+M`!22%*`0D@0`"9,R8`"C-&``D!``&$````"4$``1I!2@%*`$`!*A-"``E3<@
+M`)`0`!A`````DA``$),N<#"3,G`PD!``&$````"4$``;@<?@")'H``B=X[]`
+MD!``&0,`%,N#,'`*D@8``4````"4$"`&`0```('/X`@!````G>._0)(0`!D#
+M`!3+@S!P"I`&``%`````E!`@!H'/X`B0$"`!G>._0)`0`!D3````DA)@`$``
+M``"4$"`&`0```('/X`@!````@</@")`0(`"=X[]`H!``&),N8`(#```8D@)`
+M`9,R8`!`````D!``&)`0`!@3```;E!`@`T````"6$"`"`LH`![`0(`"0$``0
+M0````!,``!K0-H``L!`@`8'/X`@!````PA(CN("@0`D"0``)B!`@#((0*A6"
+M`$`!PA(``8((8("`H&``B!`@"XED8`,"PH`#`0```,@B@`"!P^`(D!`@`('#
+MX`B0$"`!G>._0`,```7@%@`!H@P@'*,\8`*@#"`"H3P@`:,T8`"0$``80```
+M`)(0`!&@'``(@*``$)1@/_^0$``80````)(0`!$!````@<_@"`$```"=X[]`
+MD!``&"$`$`5`````DS0P"+(&0!F4$"`#E2J`&90J``J"$"`"@RA`&902@`&5
+M,J``D!``&$````"3-#`(@<_@")`0(`&=X[]`D!``&"$`$`5`````DS0P"+(&
+M0!F4$"`#E2J`&90J``J5,J``D!``&$````"3-#`(@<_@")`0(`&=X[]`D!``
+M&*`0*`-`````DRPP`Y00(`&5*H`9E"H`"K0.H`&U+H`9E!*`&I4RH`"0$``8
+M0````),L,`.!S^`(D!`@`9WCOT"0$``8@A`__X"F8`480``)L3!P(!,`$`=`
+M````DS)P")`*("^1,@`9D`H@`;$R(`"!S^`(`0```)WCOT"0$``8$P`0!4``
+M``"3,G`(BRY@#+(&0!F"$"`#@RA`&8(10`$)``!@@A!`!)0J``&4$H`%`P``
+M(("FH``"2``$E!*``0,``$"4$H`!E3*@`)`0`!@3`!`%0````),R<`B"$"4U
+M@RAP`M(&``$#`$``DA)``9,R8`!`````D!``&`$```"!S^`(`0```)WCOT"0
+M$``8DA`D`4````"3*G`$@*9@`")(``J0"C^?@*9@!")```20"C_?$&@`!)`2
+M("`0:``#D!(@0)`*/[^5,B``D!``&)(0)`%`````DRIP!`$```"!S^`(`0``
+M`)WCOT"0$``8$P`@`4````"3,G`(`P`@`("(0`BP$"`!@<_@")%F8`*=X[]`
+MD!``&!,`(`%`````DS)P"`,`(`"`B@`!`D@`!X"F8`&`IF`"$D@`!A4`(``0
+M:``*`0````)```@5`"``E!(`"I4RH`"0$``8$P`@`4````"3,G`(`0```('/
+MX`@!````@</@")`0(`"0$"``@</@")%Z9`&=X[]`DA``&:`0(4^A+#`$D`8`
+M$$````"4$"`&U`X`$`,`%/&#,'`*P@X``8,H8`B4$H`!@A`J>8(`0`'"#@`!
+M@RA@$)02@`$#`!3S@S!P"L(.``&#*&`8E!*``94RH`"0$``8$P`0`4````"3
+M,G`'`P`4]8,P<`K(#@`!B2D@"((0)3V#*'`"U`X``902@`2U+J`0M3:@$`,_
+M__""+H`!@RA@$)02@`&5,J``D!``&!,`(`-`````DS)P"("FH``22``(D!``
+M&"$`(`%`````DS0P"`,`!``0:``'E!(``2$`(`%`````DS0P"!4`!`"4*@`*
+ME3*@`)`0`!A`````DS0P"`$```"!S^`(`0```)WCOT"@$``8D!``&"4`(!M`
+M````DS2P"*(0``B0$``8DA`H!T````"3*G`$L!``")`0`!!`````DS2P"("B
+M`!&P0``8L2XP()$R(`"P%@`(@<_@"`$```"=X[]`D!``&!,`(!M`````DS)P
+M"(''X`B1Z``(G>._0)`0`!@A`"`)0````),T,`@5`$``E!*`")4RH`"0$``8
+M0````),T,`@!````@<_@"`$```"=X[]`HA``&)`0`!@3`"890````),R<`BA
+M,B`3H`PA_X(,(0"('#X`@*!@`*%F0`20$``8DA`H!T````"3*G`$L!``")`0
+M`!$3`"`;0````),R<`BP'@`(L!X`$('/X`B1,B``G>._0)`0`!C@%B.`DA`B
+M`4````"3*G`%D`H@_Z`<``B`H``0@<_@")!@/_^=X[]`D!``&!,`$!-`````
+MDS)P!\(&0`""`$`(PB9``)`0`!@3`"`E0````),R<`C"!F`$@@!`",(F8`20
+M$``8$P`@)T````"3,G`(P@9@#((`0`C")F`,D!``&)(0*`E`````DRIP!,(&
+M8`B"`$`(PB9@")`0`!B2$"0%0````),J<`7"!F`0@@!`",(F8!"!S^`(`0``
+M`)WCOT"`IF`("$@`":`0`!B0$``8DA`__T````"3,G`P@*9`""A```B3-F``
+MB!`__X(0)6V#*'`"R"0``1!H``VP$"``0````)`0`!B4$``(D!``&)(0*`%`
+M````DRIP!((0)6V#*'`"\B8``;`0(`&!S^`(`0```)WCOT"0$``8DA`H`4``
+M``"3*G`$`P``/X(08_^2"@`!0````)`0`!B!Q^`(D>@`")WCOT"0$``8H!`_
+M_T````"3-#`S@*9`"`A```:"$"*W@RAP`^`F``$0:``7L!`@`)`0`!@C`"`%
+M0````),T<`@#/__XH`H``9,V8`!`````D!``&`,___B"*@`!H!0``:$T(`"0
+M$``8DS1P"$````"4$``0@A`BMX,H<`/R)@`!L!`@`8'/X`@!````G>._0)`0
+M`!@3`"`%0````),R<`@3/__XDBH`"9,R8`!`````D!``&(''X`B1Z``(@A`E
+M:X,H<`+0"@`!D!H@`9`*(`&!P^`(D3(@`)WCOT`"SD`1I!``&)`0`!@C`"`!
+M0````),T<`@A/[__H!0C_Y0*`!"0$``80````),T<`B($"5KB2DP`L(&``00
+M:``0@@A`$)`0`!@A`"`!0````),T,`@C`$``E!(`$94RH`"0$``80````),T
+M,`B($"5KB2DP`L(&``2"$$`1PB2`!('/X`B0$"`!G>._0)`0`!B@$#__0```
+M`),T,#.`ID`("$``!H(0)6^#*'`"X"8``1!H`!BP$"``D!``&",`(`5`````
+MDS1P""$'_\"@*@`0DS9@`$````"0$``8D2H@$`,'_\"0"@`!H!0`"*$T(`"0
+M$``8DS1P"$````"4$``0@A`E;X,H<`+R)@`!L!`@`8'/X`@!````G>._0)`0
+M`!@3`"`%0````),R<`@#!__`D@H``9,R8!"3,F``0````)`0`!B!Q^`(D>@`
+M"('#X`B0$"`!@</@"`$```"!P^`(D!`@`('#X`@!````@</@"`$```"=X[]`
+MD!``&("F8`$22``&EA``&X"FH`"0$"``$&@`!9%F8`V3-F``0````)4VH`"!
+MQ^`(D>@`")WCOT"`IF`+`D``!Y@0`!R`IF`>`D``$9`0(``0:``+DS9@`)0.
+MX`;4)B.HE3*@`)`0`!@3`!`-0````),R<`<0:``&D!`@`94VH`"7-N``0```
+M`)`0`!B!Q^`(D>@`")WCOT"0$``8DA``&900`!J6$``;F!``'$````":$``=
+M@<?@")'H``B=X[]`D!``&"$`(`%`````DS0P"`,``0"4$@`!E3*@`)`0`!A`
+M````DS0P"("F8``"2``+D!``&"$`$`%`````DS0P"!4``,"4*@`*E3*@`)`0
+M`!A`````DS0P"`$```"!S^`(`0```)WCOT"`IF```D@`*Y`0`!@A`!`!0```
+M`),T,`@5``#`E"H`"I4RH`"0$``80````),T,`A`````D!`GT*`0(`HS`!`!
+M`S__/Z(08_^0$``8DA`D`4````"3*G`$`P``0("(0`@"0``0@*0@`$````"0
+M$"#(D!``&$````"3-G`(E`H`$9`0`!A`````DS9P"*"$/_\23__OD!``&!!H
+M`!"P$"``$D@`!)`0`!@0:``,L!`@`"$`(`%`````DS0P"!4``0"4*@`*E3*@
+M`)`0`!A`````DS0P"+`0(`&!S^`(`0```)WCOT"0$``8(0`@`4````"3-#`(
+M`P`!`)02``&5,J``D!``&$````"3-#`(@*9@``)(``N0$``8(0`0`4````"3
+M-#`(%0``P)0J``J5,J``D!``&$````"3-#`(`0```('/X`@!````G>._0)`0
+M`!B2$``:M!``&("F8`$"0``-L!`@`8"F8`$*0``&@*9@`@)```P!````$&@`
+M$K`0(`!___^?DSI@`!!H``JP$``(?___U),Z8``0:``'@A`E.W___WV3.F``
+M$&@``X(0)3N"$"4[@RAP`O(F@`&Q-B``@<_@"`$```"=X[]`D!``&!,`$`%`
+M````DS)P"`,``,"0"@`!D3(@$)$R(`"!Q^`(D>@`")WCOT"`IF`!`D``")`0
+M`!@#````@*9@`@)(``:P$&``$&@`!Y(0(``#````L!!@`$````"2$``8DA``
+M&(''X`B1Z``)G>._0)`0`!A`````DA`@#(''X`B1Z``(G>._0)`0`!B4$``9
+M0````)(0(`P!````@<_@"`$```"=X[]`D!``&)(0(`A`````E!`@!`$```"!
+MS^`(`0```)WCOT"B$``8D!``&)(0(`A`````E!`@(*`0(`"0$``10````)(0
+M(`B0"B`$@*(@``)```FP$"`!0````)`0(`J@!"`!@*0CYR1/__:0$``1L!`@
+M`('/X`@!````G>._0)`0`!@A`!`-0````),T,`>4"C^_E3*@`)`0`!A`````
+MDS0P!P$```"!S^`(`0```)WCOT"0$``8(0`0#4````"3-#`'E!(@0)`0`!A`
+M````DS0P!P$```"!S^`(`0```)WCOT"4$``9D!``&)(0*`5`````DRIP!+4V
+MH`"0$``8$P`@%9,R<`A`````E!``&@$```"!S^`(`0```)WCOT"B$``8@*9@
+M/QA(`!JP$"``@*9@'PA(``R0$``1(0`@%4````"3-#`(E!`@`94J@!F4*@`*
+ME3*@`)`0`!$0:``+DS0P"*`0*`5`````DRPP!)00(`&5*H`9E"H`"I4RH`"0
+M$``1DRPP!$````"P$"`!@<_@"`$```"=X[]`HA``&("F8#\82``:L!`@`("F
+M8!\(2``,D!``$2$`(!5`````DS0P")00(`&5*H`9E!*`")4RH`"0$``1$&@`
+M"Y,T,`B@$"@%0````),L,`24$"`!E2J`&902@`B5,J``D!``$9,L,`1`````
+ML!`@`8'/X`@!````G>._0)`0`!@3`"`30````),R<`B!Q^`(D>@`")WCOT"0
+M$``8@@YB`("@8``"2``$E!``&90.??^4$J`@E3*@`!,`(!-`````DS)P"`$`
+M``"!S^`(`0```,`J8`C`*F`)P"I@"L`J8`N:$"``VBI@#(H*K_^"$"``PBI@
+M#8DQ8`C(*F`.RBI@#YH+8/^;*W`8@@A@_X,H<!""$$`-B`D@_XDI,`B($0`!
+MB@E@_XH10`2`HH`%$D@`(I`0(`"""N`@@*!@`")(`!;`*F`4P@I@#(,H<!C(
+M"F`-B2DP$(@1``'""F`.@RAP"((00`3("F`/B!$``0,```B($0`!@S$P&,(J
+M8`R#,3`0PBI@#8,Q,`C"*F`.R"I@#\`J8!3`*F`5P"I@%L`J8!?`*F`0P"I@
+M$<`J8!+`*F`3D!`@`8'#X`@!````G>._0*`0`!C"#F`7@@A@`8"@8``"0`"(
+ML!`@#\(.X!>""&`!@*!@`#)(``G"#F`2D!``$$````"2$"`,@*:`"`)``'VP
+M$"`/P@Y@$H,H<`C(#F`3@A!`!(((;__"-T``P@Y@%(,H<!C(#F`5B2DP$(@1
+M``'"#F`6@RAP"((00`0)`__@M@A`!+<VX`^0$``0$P`@&T````"3,G`(D3(@
+M"@,``#^($&/_D`H`!`,___B"*@`!@*!`&SI(``:V%L`(`S__^(("``&""$`$
+MMA;``0,__^""+L`!PC=@`L`O8`3"#F`4@RAP&,@.8!6)*3`0B!$``<(.8!:#
+M*'`(@A!`!,@.8!>($0`!@@D@`H"@8``R2``<R`Y@$(()(`2`H&``(D@`!,(.
+M8!<0:``.@A`@`8((8!"`H&``(D@`!<(.8!?"#V`$$&@`!X(08`B""&`(@*!@
+M``)(``7"#V`$@A!@!!!H``?"+V`$@A!@`L(O8`3"#F`7@S!@!<(O8`7(#F`0
+MB2DP&,(.8!&#*'`0@A!`!(,P<!/"+V`&P@Y@%(,H<!C(#F`5B2DP$(@1``'"
+M#F`6@RAP"((00`3(#F`7B!$``8()(0"`H&``(D@`!H(0/_\#```?@A!B`(()
+M``&#,&`)PB]@!\(.8!"#*'`8R`Y@$8DI,!"($0`!P@Y@$H,H<`B"$$`$@S!P
+M#X((8`_"+V`(P@Y@$H,P<`:""&`!PB]@"<(.8!*#,'`$@@A@`<(O8`JP$"``
+M@<_@"`$```"=X[]`I!``&,(6H`*""&$`@*!@``)(`@Z($"`,D!``&$````"2
+M$``:IA``"`+"`@B($"`,@*9@!B)```R0$``8&$@`!X"F8`B`IF`!&$@"`)`0
+M`!@0:``&DA`D`1)(`?R($"`,D!``&)(0)`%`````DRIP!*(*(&"0$``80```
+M`)(0`!H"R@'RB!`@`P,`%,N#,'`*U`R``8(0)3.#*'`"P@R``8,H8`B4$H`!
+M`P`4S8,P<`K"#(`!@RA@$)02@`&"$"IG@@!``<(,@`&#*&`8E!*``94RH`"0
+M$``80````!,``"""$"%-@RAP!,@,@`&)*2`(`P`4SX,P<`K4#(`!E!*`!)4R
+MH`"0$``8$P`@`4````"3,G`(DSY@`$```=.0$``8@*9@`2)```Z0$``8"D``
+M"("F8`8"0``4@*9@"`)``!*0$``8$&@`':`0)`&0$``8DA`@*!!H``24$"`!
+MDA`@*)00(`!``````0```)`0`!B2$"0!DRIP!)00)`D0:``+E2JP`I`0`!B2
+M$"`H0````)00(`"0$``8DA`D`9,J<`24$"!!E2JP!D`````!````D!``&*`0
+M)`%`````DRPP!)040`B5,J``D!``&$````"3+#`$@A`A3X,H<`34#(`!`P`4
+M\8,P<`K"#(`!@RA@")02@`&"$"IY@@!``<(,@`&#*&`0E!*``0,`%/.#,'`*
+MP@R``8,H8!B4$H`!E3*@`)`0`!@3`!`!0````),R<`<#`!3U@S!P"L@,@`&)
+M*2`(@A`E/8,H<`+4#(`!E!*`!)4RH`"0$``8$P`@`T````"3,G`(D!``&)(0
+M(`!`````E!`@`)`0`!B2$"`$0````)00(`"0$``8DA`@#$````"4$"``D!``
+M&$````"2$"`<D!``&)(0("!`````E!`@`)`0`!B2$"`D0````)00(`""$"4U
+M@RAP`L`D@`&0$``80````)(0("R0$``8DA`@,$````"4$"`%D!``&)(0(#1`
+M````E!`@!9`0`!B2$"!$0````)00(`B0$``8DA`@2$````"4$"`(D!``&)(0
+M(%!`````E!`@`)`0`!B2$"!,0````)00(`"0$``8(0`0`Y,T,`A`````E!`@
+M`)`0`!B2$"!`0````)00(`""$"%;@RAP!-0$@`&0$``80````),T,`>0$``8
+M$P`0"9,R<`=`````E!`@`)`0`!A`````DA`@`)`0`!B2$"@%DRIP!$````"4
+M$"``D!``&!,`(!63,G`(0````)00(`"0$``8$P`0"Y,R<`=`````E!`@`)`0
+M`!@3`"`7DS)P"$````"4$"``D!``&)(0)`.3*G`%0````)00(`&0$``8$P`@
+M&9,R<`A`````E!`@`9`0`!@3`!`-DS)P!T````"4$"``D!``&!,`$`63,G`'
+M0````)00(`"0$``8$P`@"Y,R<`A`````E!`@`)`0`!@3`"`;DS)P"$````"4
+M$"``D!``&)(0*`.3*G`$H!`__T````"5-#`@D!``&!,`(`V3,G`(0````)4T
+M,""0$``8$P`0!Y,R<`=`````E!`@`:`0(``#````HA!@`(,\(`"#*'`#@*;@
+M``)```?2!$`!`S__X(("0`&`H&__*$@`"J`$(`&3,F``@SP@`(,H<`."`$`1
+MU`!@!$````"0$``8H`0@`8"D(*8(3__N@SP@`)`0`!A`````DA``&@+*`-"(
+M$"`#D!``&"$`$P5`````DS0P!P,__\""$&#_E`H``0,`%#&#,'`*P@R``8,H
+M8`B4$H`!E3*@`)`0`!A`````DS0P!X(0*AF"`$`!P@R``94H8!B#*&`0E!*`
+M`0,`%#.#,'`*R`R``8,I(`B4$H`!E!*`!)4RH`"0$``8$P`F#4````"3,G`(
+MD!``&"$`)A%`````DS0P"`,___""$&!_E`H``:(0)0NC+'`"R!2`$8DQ,`$#
+M```/@A!C@(@)``&4$H`$E3*@`)`0`!A`````DS0P")`0`!@A`!,)0````),T
+M,`<5``#\E"H`"L(4@!&#*&`*"0``_(((0`24$H`!E3*@`)`0`!A`````DS0P
+M!Y`0`!@A`"890````),T,`@5``'\E"H`"H(0(4.#*'`$P@R``8,H8`P)``'\
+M@@A`!)02@`&5,J``D!``&$````"3-#`(D!``&*`0*9%`````DRPP!)0*/_S"
+M%(`1@@A@`Y02@`&5,J``D!``&$````"3+#`$D!``&$``!$62$``3`L(`:X@0
+M(`.`IN``(D@`#I`0`!C(#.`$@@D@`H"@8``R2``%PA3@`H()/_["+.`$PA3@
+M`L(VH`+"#.`$PBZ@!)`0`!@3`"8'DS)P"$````"4$"`!0````)`0(^B0$``8
+MH!`DPT````"3+#`%E!(@`9`0`!A`````DRPP!9`0`!B3+#`%E!`@`4````"6
+M$"``D!``&$````"2$``3"LH`!Z`0(`#"%J`"@A!@`L(VH`(0:``_B!`@`Y,T
+M(`!`````D!``&*`$(`&`I"`"!$___),T(`""$"4!@RAP`L(&``&`H&```D@`
+M!9`0`!A`````D!``&)`0`!@A`"`)0````),T,`@5`&``E"H`"I4RH`"0$``8
+M0````),T,`B"$"5M@RAP`M($@`&`HG__`D``!),R8`!`````D!``&((0(K>#
+M*'`#T@2``8"B?_\"0``$DS)@`$````"0$``8@A`E;X,H<`+2!(`!@*)__P)`
+M``23,F``0````)`0`!C4!B.H@**@`")(``CR)B.,E3*@`)`0`!@3`!`-0```
+M`),R<`?R)B.,$&@`![`0(`'"!P``@*!@`#)(``+()P``L!`@`('/X`@!````
+MG>._0)`0`!@3`"`!0````),R<`@#```_@A!C_X"F8`$"0``;D`H``8"F8`$4
+M2``'@*9@!H"F8``B0``0@A`E:Q!H`",!`````D``!H"F8`@"0``5@A`E:Q!H
+M`!T!````@A`E:X,H<`+4!@`!E!(`"A!H`!$#`!1`@RAP`M0&``&4$@`*$&@`
+M#`,`%(""$"5K@RAP`M0&``&4$@`*$&@`!@,`!0"#*'`"U`8``902``H#``0`
+ME!*``94RH`"0$``8$P`@`4````"3,G`(`0```('/X`@!````G>._0)`0`!A_
+M___(TD8CC`$```"!S^`(`0```)WCOT"0$``8DA`@"$```0Z4$"`*@<?@")'H
+M``B=X[]`H!``&)`0`!B2$"``0````)00(`$"R@`3L!`@`)`0`!"2$"`/E!`B
+M<4```/^5*K`%`LH`#+`0(`!`````D!`CZ)`0`!"2$"`?E!`B<4```/:5*K`%
+M0````)`0*#2P$"`!@<_@"`$```"=X[]`D!``&)(0(`!`````E!`@`0+*`"J"
+M$"```L9`!I00(`#"%F`"@@A@$("@8`"59F`!E3*@`)`0`!@3`"8!0````),R
+M<`B0$``8DA`@#Y00(G%```#:E2JP!0+*`!B"$"``0````)`0(^B0$``8DA`@
+M'Y00(G%```#1E2JP!0+*``^"$"``0````)`0*#20$``8DA`@`$````"4$"`!
+M`LH`!X(0(`"0$``8DA`@`$```,.4$"`*@A``"('/X`B0$``!G>._0+H0`!B0
+M$``80````)(0`!FX$``(`L(`MK`0(`"0$``=(0`0#4````"3-#`'E!(@8)`0
+M`!U`````DS0P!Y`0`!TA`"`)0````),T,`BV$``(%0`@`)0J``J5,J``D!``
+M'4````"3-#`(0````)`0+Z"0$``=(0`3`4````"3-#`'`P(``)02``&5,J``
+MD!``'4````"3-#`'0````)`0(`J0$``=0``#%Y(0`!P"R@"0L!`@`$````"0
+M$"/HD!``'2$`$P%`````DS0P!RD]__^H%2/_E`H`%)`0`!U`````DS0P!Y`0
+M`!TO`!,+0````),U\`>F$``(D!``'2T`)A=`````DS6P"*00``B0$``=*P`3
+M#4````"3-7`'HA``"!4`_P"4+,`*`P#_`)02@`&5,J``D!``'4````"3-?`'
+M%3_P`)02H'^4#(`*`P`/\((08("4$H`!E3*@`)`0`!U`````DS6P"!4__X"4
+M$J`?E`Q`"@,```2"$&&`E!*``94RH`"0$``=0````),U<`=`````D!`@%)`0
+M`!U`````DS0P!P,"``"4$@`!E3*@`)`0`!U`````DS0P!T````"0$"`*D!``
+M'1,`)C63,G`(0````)00("&0$``=0````),T,`>4"@`4D!``'4````"3-#`'
+M0````)`0(^B0$``=H!`DPT````"3+#`%E!(@`9`0`!U`````DRPP!9`0`!V3
+M+#`%E!`@`4````"6$"``IS3@`)`0`!V3-?`'0````)00`!.E-*``D!``'9,U
+ML`A`````E!``$J,T8`"0$``=DS5P!T````"4$``1D!``'4````"2$``<*LH`
+M#9`0`!V0$")Q0````)$J,`.0$``=0````)(0`!P*R@`%D!``'<(68`*"$&`"
+MPC9@`B$`$`U`````DS0P!Y0*/Y^5,J``D!``'4````"3-#`'E3;@`)`0`!T3
+M`"`)0````),R<`B"$"`!PB:``+`0(`&!S^`(`0```)WCOS"B$``8H!``&;-^
+M9__R)Z?KE30@`)`0`!A`````$P``$+4^H`!`````D!``&J`,(`_"!Z?K@@A@
+M#\(GI^N5,&``ES0@`)`0`!A`````$P``$*`,(`2`I"``$D@`$K`0``B"$"`5
+MPB>GZ]0/I^O"#Z?L@RA@")02@`'"#Z?M@RA@$)02@`'"#Z?N@RA@&)02@`&5
+M,J``D!``$4````"2$"`4@<_@")$R(`"8$"``FA`@"I8"H`&"`T`-@@!@`X((
+M8/^`HH`!$D@`"8(#0`V#.V``P@I``8"@8#\20``]D3A@`!!H`"V8$"`!@@!@
+M`X((8/^"&L`!@*```8A@/_^+.V``@A`@`(-Y>`&`B0`!`D@`&X"C(`'("D`%
+M@*$@/P)``!6"`W__@SA@`,H*0`&`H6`_(D@`&9@0(`&0(0`%@@(`"((`0`B#
+M*&`"@B!`"(,H8`2"($`(@@!``9``8^>#,B``@FACZ)`!0`$0:``9D`H@_Q!H
+M``F8$"`!,D@`")J#?_^#.V``P@I``8"@8#\20``0D3A@`)J#?_\<3__(@@-`
+M#9H0(`"#.V``P@I``8"@8#\20``'D3A@`)H#8`&`HV`*)$__^H,[8`"0$"`!
+M@</@"`$```"=X[]`GA`__[H0/_^X$"``B`Z@_XL_(`#"#D`%@*!@/P)```V`
+MH0`!`D``(;MG`!R`H0`!.D@`";@'(`&>$``<@*=__P)``!N"!P`<$&@`!X"G
+M(`JX!R`!@*<@"@1/_^^+/R``@*<@"H(0(`"#9J`!B#@`'8"@``2(8#__@(A`
+M!!)``"ZP$"`_@*<@"B1(``Z"!T`/@@=`'8(`8`/"+L``@S]@`!!H``:"!D`!
+M@@<`'((`8`/"+L``@@9`!1!H`!_P"&`+@@!@`\(NP`"*#J#_NS]@`/@.0!V*
+M(4`<@RE@!8(@0`6#*&`"@@!`!8,H8`.+.^``R`Y`!8@A`!R#.&``B3D@`(-H
+M0`2*!D`%R@E@"[H&0!WZ#V`+B`]@_XHA0`2"2$`%B@!CYX,Q8`"*:&/HN@%`
+M';`/8/^!S^`(`0```("B8#V39V`\TC(CK('#X`B0$"`!G>._,*`0`!B2$``8
+MB!`J%X@!``3"%@`$@S!P!(((8`?"+J`/B`8`!,()(`&""&`'PBZ@$,@60``#
+M/__Z@A!CSH@!``&)*2`0B3$@$("A()882`#"L!`@`)@0(`""$"%#BRAP!,@4
+M([B#,R``@@!`"8(`0`7""&`&@*$``0)```>`HR`$F`,@`8"C(`,(3__X@S,@
+M`("C(`0"0`"PL!`@`,@60``#/__Z@A!CSH@!``&#.2``B6A@"H"A(`R(03__
+MB3$@`(AI(`.#*3`#@B!`!(,H<`*"`$`$L@)``8(0*AV"`$`!L@9``8DS(`"(
+M!D`$P@D@&<(NH`[*#F`6F@E@_\@)(!F""2#_@*-``8MG``3*+J`)@S,@`((&
+M0`'(#F`7F@D@_\H(8!F""6#_@*-``8EG``7(+J`(@S,@`((&0`'(#F`8F@D@
+M_\H(8!F""6#_@*-``8EG``7(+J`'@S,@`((&0`'4"&`9D!``$)(0`!E___]/
+ME@>G[K`0``C4#J`)D!``$)(0`!E___])E@>G[:00``C4#J`(D!``$)(0`!E_
+M__]#E@>G[*(0``C4#J`'D!``$)(0`!E___\]E@>GZ\($(["`H&``(D@`4L(/
+MI^X)````B!$@`(,P8`""`$`!R@^G[MH1``'"$0`!@@!@`X"A0`$V2``$P@^G
+M[A!H``."$"`#@B!`#<(OI^[4#Z?ND!``$'___MN2$``9E!``"-`NH`Z0$``0
+MDA``&7___R"6!Z?JL!``",@/I^Z:"2#_R@^G[8()8/^`HT`!B6<`!<@OI^V4
+M"2#_D!``$'___LF2$``9E!``"-`NH`F0$``0DA``&7___PZ6!Z?JI!``",@/
+MI^Z:"2#_R@^G[(()8/^`HT`!B6<`!<@OI^R4"2#_D!``$'___K>2$``9E!``
+M"-`NH`B0$``0DA``&7___OR6!Z?JHA``",@/I^Z:"2#_R@^GZX()8/^`HT`!
+MB6<`!<@OI^N4"2#_D!``$'___J62$``9E!``"-`NH`>0$``0DA``&7___NJ6
+M!Z?JP@^G[H(`0`'"-".NP@Z@#L(NH`K"+J`+PBZ@#,(NH`V")@`(PBZ``((F
+M`!'"+J`!@B8`$L(NH`+`+J`&P"Z@!<`NH`3`+J`#L!`@`8'/X`@!````G>.^
+MT*00`!B0!Z=_$P```)(28`!`````E!`@1*`'I\^0$``0$P```)(28`!`````
+ME!`@$9`0`!B2$``9?___&900`!`"R@#-L!`@`,(/I]Z"`'__@@A@_X"@8`08
+M2`#'P@^GWX(`?_^""&#_@*!@!!A(`,*R$"``H@>G[Z$N<#"A-#`PH`1`$-`,
+M/^!`````DA`@!8(&8`&R$``!@RA@$(,P8!"`H&`&"$__]=`L/^"R$"`'H@>G
+M[Z$N<#"A-#`PH`1`$-`,/^!`````DA`@!H(&8`&R$``!@RA@$(,P8!"`H&`.
+M"$__]=`L/^#*#Z?0B2E@!8@)(.#"#Z?/@@A@'X@1``'"!Z=_B!$``<@GIW_:
+M#Z?2B2M@!X@)((#"#Z?1@RA@`H((8'R($0`!BS%@`XH)8`.($0`%P@>G@X@1
+M``'()Z>#R@^GTX,I8`2""&#PFS-@`9H+8`^"$$`-R`>GAX(00`3")Z>'V@^G
+MU8DK8`:("2#`P@^GU((`0`&""&`^B!$``8LQ8`2*"6`!B!$`!<('IXN($0`!
+MR">GB\H/I]:#*6`#@@A@^)LS8`*:"V`'@A!`#<@'IX^"$$`$PB>GC]H/I]B)
+M*V`'B`D@@,(/I]>"`$`!@@A@?H@1``&+,6`%B@E@`8@1``7"!Z>3B!$``<@G
+MIY/*#Z?9@RE@!8((8.";,V`!F@M@'X(00`W(!Z>7@A!`!,(GIY?:#Z?:@RM@
+M`X((8/B+,6`#B@E@!X(00`7(!Z>;@A!`!,(GIYO"#Z?;@@!``8((8'Z;,V`%
+MF@M@`8(00`W(!Z>?@A!`!,(GIY_*#Z?<@RE@!8((8.#(!Z>C@A!`!,(GIZ/(
+M#Z?=@RD@`X((8/B+,6`#B@E@!X(00`7*!Z>G@A!`!<(GIZ>),2`%B`D@`<('
+MIZN($0`!R">GJ]`/I]Y`````DA`@`Y$J(`>0"B"`P@>GGY`2``'0)Z>?T`^G
+MWD````"2$"`#D3(@`9`*(`/"!Z>CD!(``=`GIZ/0#Z??0````)(0(`.1*B`"
+MD`H@',('IZ.0$@`!T">GH[(0(`"B!Z?O(0`F)X,N<#"#,'`N@@!`$=0`?Y"0
+M$``20````),T,`B"!F`!LA```8,H8!"#,&`0@*!@#PA/__6#+G`P@S!P+H@'
+MI_^"`0`!U`!_@)`0`!(3`"8U0````),R<`BP$"`!@<_@"`$```"=X[]`T!9`
+M``,___N0`@`!D3H@`)%J(`J1,B``0````)(0(`64`@`(E!*@094RH`"0$``8
+M$P`F)T````"3,G`(D!``&)(0(F.3*G`&0````)00(`""$")]@RAP`_)V``&!
+MS^`(D!`@`9WCOT"0$``8$P`F&4````"3,G`(D3(@$Y`*(?^P$``(@@HA`)`2
+M/@"`H&``D61`&+$J(!"Q/B`0@<_@")$Z(`"=X[]`D!``&*`0),-`````DRPP
+M!902(`*0$``80````),L,`60$``8DRPP!900(`)`````EA`@``+*`!>"$"``
+MH!`@`$````"0$"/H0````)`0`!B@!"`!@*0@%(@0(`")9*`!@*(_N((0(`"#
+M9J`!@(D``1)/__2`HC^X)$@`!=`V8!;`-F`6$&@``X(0(`""$"`!@<_@")`0
+M``&!P^`(D!`@`('#X`B0$"``G>._0)00`!J`IF`"%$@`#)`0(`"#/F``DRAP
+M!)(B0`&3*G`"D@8`"8(0(I^#*'`#D@)``4````"0$``8@<?@")'H``B=X[]`
+MDA``&H"F8`(42``,D!`@`(,^8`"5*'`$E"*``94JL`*4!@`*@A`BGX,H<`.4
+M`H`!0````)`0`!B!Q^`(D>@`")WCOT"D$``8@*9@`@)```Z0$``8@*9@`AA(
+M``>`IF`#@*9@`0)```RP$#__$&@`*P$````"0``&L!`__Q!H`"<!````$&@`
+M!:(0(`(0:``#HA`@`:(0(`")/&``@RDP!((@0`2#*'`"H`(``8(0(I^#*'`#
+MH`0``<($(`2`H&``$D``%K`0/_^0$``00````)(0(#P*SH`,\B0@!((0(`O"
+M)"`,@A`@`L(D(!2"$#__PB0@&((0(`K"-"`@$&@`!L(T("*3/&``D!``$D``
+M``"4$``:L3Q@`('/X`@!````@*)@`AA(`"R*$"``B3)@`(,I,`2"($`$@RAP
+M`H@"``&"$"*?@RAP`X@!``'"`2`$@*!@``)(`"`!````P"$@!(@0(IN)*3`#
+MBA`@`8LI0`F*.``%P@(`!(()0`'"(@`$B!`E-XDI,`+"`@`$@@E``<(B``2(
+M$""GB2DP!<("``2""4`!PB(`!(@0)3F)*3`"P@(`!(()0`'"(@`$@A`BG8,H
+M<`/(`@`!B@E`!,HB``&*$"`!@</@")`0``6=X[]`IA``&*00`!B"$")]@RAP
+M`\I>``&`IF`"&$@`Y+`0(`")-F``@RDP!((@0`2#*'`"H@3``8(0(I^#*'`#
+MH@1``<($8`2`H&```D@`V("@8`$22`#6L!`@`<(18`*""&`0@*!@``)(`#.0
+M$``3DA`H`9,J<`1`````E!`AX)`0`!,3`"`%DS)P"$`````5`@`"D!``$Y(0
+M)`&3*G`%%0!W8T````"4$J//P@1@%)4H8`24(H`!E2J@!90"H>"5*J`+E!*A
+MX)4RH`"0$``3DA`B`4````"3*G`&D!``$Q,`(!&3,G`(%1:X#T````"5,K`$
+MD!``$R$`)A%`````DS0P")0*/X"4$J`XE3*@`)`0`!-`````DS0P")`0`!,3
+M`"8!DS)P"!4;P`@0:``TE!*@(Y(0*`&3*G`$0````)00(6B0$``3$P`@!9,R
+M<`A`````%0$``9`0`!.2$"0!DRIP!14`=V-`````E!*CI\@$8!2"`0`$@@!`
+M!)4H8`24(H`!E2J@`Y0"HC"5*J`+E!*B,)4RH`"0$``3DA`B`4````"3*G`&
+MD!``$Q,`(!&3,G`(%0$UP$````"4$J.8D!``$R$`)A%`````DS0P")0*/X"4
+M$J`<E3*@`)`0`!-`````DS0P")`0`!,3`"8!DS)P"!4;P`24$J`@0`````$`
+M``#"!&`8@*!__P)```.4$"`/U`1@&)4JH!3"%&`B@RA@!(((8/"4$H`!PA1@
+M((((8`^4$H`!`P`"")02@`&5,J``D!``$Q,`(`=`````DS)P",($8`R""&`!
+M@*!@``)(``B"$"*;@RAP`X@0(`&)*0`9R@2``1!H``>($0`%@RAP`X@0(`&)
+M*0`9R@2``8@I0`3()(`!P@1@#(((8`&`H&```D@`"((0)3>#*'`"B!`@`8DI
+M`!G*!(`!$&@`!X@1``6#*'`"B!`@`8DI`!G*!(`!B"E`!,@D@`'"!&`,@@A@
+M`H"@8``"2``(@A`@IX,H<`6($"`!B2D`&<H$@`$0:``'B!$`!8,H<`6($"`!
+MB2D`&<H$@`&(*4`$R"2``<($8`R""&`$@*!@``)(``B"$"4Y@RAP`H@0(`&)
+M*0`9R@2``1!H``>($0`%@RAP`H@0(`&)*0`9R@2``8@I0`3()(`!P@1@#(((
+M8`B`H&```D@`"((0(IV#*'`#B!`@`8DI`!G*!(`!$&@`!X@1``6#*'`#B!`@
+M`8DI`!G*!(`!B"E`!,@D@`&P$"`!@<_@"`$```"=X[]`@RYP!((@0!F#*'`"
+M@@8``8@0(I^)*3`#@@!`!,(`8`2`H&```D``"9`0`!B`H&`!$D@`!X(0/_]`
+M````DA`@`!!H``0!````@A`__Y$P<""!Q^`(D>@`")WCOT"#+G`$@B!`&8,H
+M<`*"!@`!B!`BGXDI,`."`$`$P@!@!("@8`$"0``*D!``&("@8`$*2``+L!`@
+M`("@8`,82``(E3:@`!!H``22$"`$E3:@`)(0(`!`````L!`@`8'/X`@!````
+MG>._0$````"0$``8H!``"!,@``"2*@`)DS)@`$````"0$``8D!``&!,`(!E`
+M````DS)P"("F8``"2``'@*(@`8(0("6"($`(@S!@`1!H``F0`@`!&$@`!Y`"
+M/_^3-"``0````)`0`!@0:``+L!`@`)4R(`"0$``8$P`@&4````"3,G`(DS0@
+M`$````"0$``8L!`@`8'/X`@!````G>._0(,N<`2"($`9@RAP`H(&``&($"*?
+MB2DP`X(`0`3"`&`$@*!@`0)```N0$``8*D@`%K`0(`"`H&`"`D``#X"@8`,"
+M0``'DA`@"!!H``^P$"``DA`@"!!H``J4$"`!0````)00(`*0$``8DA`@*!!H
+M``24$"`.DA`@*)00(`I`````L!`@`8'/X`@!````G>._0(,N<`2"($`9@RAP
+M`H(&``&($"*?B2DP`X(`0`3"`&`$@*!@``)(``R0$``8@*!@`3)(``JP$"``
+M0````)(0(!0#```>@@A`"(,P8`L0:``#L3!@`+`0(`"!S^`(`0```)WCOT"#
+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
+M,&`$R"2C?(((8`_"-*.`B`$__H"A(`(82`#MHA`@#9`0`!(3`!,#0````),R
+M<`?0-*."0```^I`0`!("P@#DHA`@#L($HWR0$``2$P``)H"@8`,82``%E!`@
+M!Y`0`!(3```FE!`@1T````"B$"`-0````)`0)]!___^`D!``$M`THX20"B#P
+M@*(@$!)(`-"0$``2DA`@P4````"4!Z?M`L(`RZ(0(`C(%Z?M`P``"X(08_^`
+MH0`!"$@`Q:(0(`7(%Z?M@A`BA8,H<`/(-``!D!``$I(0)`%`````DRIP!((*
+M(!B#,&`#@*!@`A)(`+BB$"`*D!``$I(0(#]`````E`>G[0+"`+*B$"`(R!>G
+M[8(0*A6"`$`!R#0``;80(`"B$"``D@1@P),R8`"0$``20````)0'I^T"P@"D
+MPA>G[:($8`&`I&,_"$__][8>P`$#```_@A!C_X"FP`$22`"<HA`@!X@0(`J"
+M$"K/@@!``<@T``&($"`#@A`B]8,H<`/(-``!HA`@`((0(5F;*'`$BA`@"XDT
+M8`""`0`$@@!`!(,H<`*"`$`$@RAP`H(`0!""`$`-H@1@`8"D8`D(3__VRC!@
+M%J(0(`""$""]D2AP!0,```"4$&``@A`AA9,H<`28$"`+@A`@7Y<H<`:;-&``
+M@@-`#8@`0!"(`0`(RA*``<HQ(!#*,2`*@@!`#8,H<`*"`$`-@RAP`H(`0!"(
+M`$`)V#$@'((`0`NB!&`!@*1@`@A/_^_8,&`0DA`BA9,J<`.2!``)0````)`0
+M`!("P@!@HA`@",($HWR`H&`#"$@`'H(0*B&"`$`!PA0``8"@8``"2``9@A`J
+M(9`0`!(3```F%0!`!T````"5,K`*0````)`0)]!___[YD!``$M`THX:0$``2
+M$P``)D````"4$"`'0````)`0)]#"%*.&@@A@\("@8"`22`!"HA`@#1!H``60
+M$``2@@!``<`T``&0$``2DA`@OT````"4!Z?M`LH`.*(0(`C(%Z?M@A`E"X,H
+M<`+(-``!R#2CN`,```""$&``PG2C:$```+.0$``20````)`0`!*V$"``HA`@
+M`((0(M^U*'`$DA`@'Y(B0!&3,F``D!``$D````"4!Z?M`L(`'\H7I^V+*6`0
+M@S%@$+8&P`&"!$`1B3!@`(@!`!"+,6`8RBD`&H(`8`&#,&``@@!`$,@/I^ZB
+M!&`!@*1@`@A/_^K(*$`:@*``&X)@/_\)``"_B!$C_8@>P`2`H``$B&`__Z(0
+M(`F`D$`$`D@`#)`0`!(0:``#`0```*(0(`@"Q``$`0```$````"0$``0*L\`
+M`N(G``"0$"``@<?@")'H``B=X[]`DA`BA9,J<`.2!@`)0````)`0`!A`````
+MD!``&`$```"!S^`(`0```)WCOQ"F$``8`P``(,(GI]\#```F@A!@(,(GI^,#
+M%555@A!A5<(GI[\#*JJJ@A!BJL(GI\,#&9F9@A!B9L(GI\<#)F9F@A!AF<(G
+MI\NL$"``K@>G[Z$]H`"A+#`"H`0`%^@$/_"3-2``0````)`0`!/0)#_@HA`@
+M`*4U(`"#+&`0H!!`$94T(`"0$``30````)(0`!*0$``30````)(0`!*`I``(
+M$D``*;`0(`"B!&`!@*1@_P1/__.#+&`0HA`@`*H'I^^E-2``@SQ@`(,H<`*"
+M`$`5X`!_T)4T(`"0$``30````)(0`!*0$``30````)(0`!*`I``($D``%+`0
+M(`"B!&`!@*1@`P1/__&#/&``@SV@`(,H<`*"`$`7T@!_\-0`?^!`````D!``
+M$ZP%H`&`I:`!!$__R:$]H`!`````D!`@9+`0(`&!S^`(`0```((0``F2"F$`
+M@*)@`")(``B""&"``P``!((08SC",H```P``!1!H``Z"$&/4@*!@`")(``V0
+M$"``@A`J(8(`0`'"$@`!@*!@`")(``>0$"``@A`I",(R@`""$"JLPC+``)`0
+M(`&!P^`(`0```('#X`B0$"`!G>._,*(0`!BD$``8PA8CN("@8`$22``&H`8C
+MD)`0`!B2$"`00````)0'I^O`)"`$@A`J'X(`0`'"%$`!@*!@``)(``V"$"HA
+M@A`@`<(D(`2"$"H7@@!``<(40`&`H&``$D@`!8(0*B&"$"`#PB0@!((0*B&"
+M`$`!PA1``8"@8``"2``&@A`I",($(`2"$&`$PB0@!((0*0C"-"`0@A`JK,(T
+M(!(#```$@A!C.,(T(`P#```%@A!CU,(T(`["!```"2```((00`0)$```@A!`
+M!`D``"""$$`$"0``$((00`2($"`*R#0@"(@0((#(-"`*@@AY_\(D``""$"H9
+M@@!``<(40`&`H&```D@`$8(0(`T5```%E`2`"I`0`!A`````DA`@#P+*``J"
+M$"`-@A`@`8@0)0&)*3`"PB2`!,($``""$&$`PB0``((0(`W")"`4B!`@`8(0
+M(*&#*'`%R"2``8'/X`B0$"`!G>._0-0&8`20$``8$P`0!4````"3,G`'U`9@
+M#)`0`!@3`"`+0````),R<`C4!F`0D!``&)(0*`-`````DRIP!-0&8`B0$``8
+M$P`@#4````"3,G`(U`9``)`0`!B2$"0!0````),J<`4!````@<_@"`$```"=
+MX[\@D!``&/(GI]/"!B.,@*!@`0)```J($``9@*!@`2I(``X#````@*!@!@)`
+M``J`H&`(,D@`$X(!(`$#```_@A!C_\(GI]L#``'_$&@`"X(08_\#````P@!@
+M`((A``&#*&`#PB>GVP,```#"`&``@B$``8,H8`/")Z??@@$@`<(GI]<#/Y_`
+M@BZ``<(GI\]`````D@>GSP$```"!S^`(`0```)WCOT"0$``8$P`0!9,R<`=`
+M````E!`@`)`0`!@A`"`!0````),T,`@#``$`@A!`"!4`#`"4*$`*E3*@`)`0
+M`!A`````DS0P")`0`!B2$"0!DRIP!900/_]`````E3*P,`$```"!S^`(`0``
+M`)WCOT#"%F`2@*!@``)(`!VB$``8D!``&"$`(`%`````DS0P"`,`!`"4$@`!
+ME3*@`)`0`!A`````DS0P"-068!"0$``8$P`@"4````"3,G`(U!9@$I`0`!@3
+M`!`'0````),R<`?4!F`4E2J@`Y4RH`"0$``8DA`H`Q!H``N3*G`$D!``&"$`
+M(`%`````DS0P"!4`!`"4*@`*E3*@`)`0`!B3-#`(0`````$```#4!D``D!``
+M&!,`$`5`````DS)P!Y`0`!B2$"0!0````),J<`4#/^``D`H``<@&8`@#```_
+M@A!C_X@)``'"%F`8@*!@``)(``>0$@`$@@!@!(,H8!`)`!_`@@A`!)`2``&5
+M,B``D!``&)(0)`%`````DRIP!8H0+"6+*7`"U`1`!24__\""%*#_E`J``<(6
+M8!J#*&`((0``/X@4(P"""$`$E!*``=0D0`65,J``D!``&!,`$`-`````DS)P
+M!Y`0`!@C`!`!0````),T<`B4"@`2P@9@'((`?_V#*&`#H!0C_X((0!"4$H`!
+ME3*@`)`0`!A`````DS1P"`$```"!S^`(`0```)WCOT"0$``8DA`H`4````"3
+M*G`#L!`@`+%Z-`&!S^`(`0```)WCOT"0$``80````)(0(,"`HC__$D@`!0,`
+M07;`)D``$&@`2[`0(`""$&"ZB`H``0,``@"`B@`!`D@`!<@F0``#$```@A$`
+M`<(F0`"`BB`%`D@`!8"*)<#"!D``@A!@`<(F0``"2``&@@H@(,(&0`""$&!`
+MPB9``((*(""`H&``(D@`#<@&0`""$""A@RAP!<(&``&`H&``(D@`!\@&0`#"
+M!D``"1```((00`3")D``R`9```,0``"`B0`!(D@`)+`0(`&"$"*!@RAP`]`F
+M``&0$``80````)(0(,2"$"4#@RAP`M`F``&0$``80````)(0(,B"$"%!@RAP
+M!-`F``&0$``80````)(0(,R"$"4%@RAP`M`F``&0$``80````)(0(-""$"*#
+M@RAP`]`F``&0$``80````)(0(-2"$"4'@RAP`M`F``&P$"`!@<_@"`$```""
+M$"M_@RAP`H'#X`C0`@`!G>._0((0*W^#*'`"X@8``8"D8``62``)H!``&)`0
+M`!B2$"`D0````)00(`"0$``80````)(0("0#`$%V@A!@NI0.0`&"#F!`@*!@
+M``)(`!N"#F`!@A`@%X,H<`G"!``!B!*@0("@8`"59D`$@A`K@8,H<`+"!``!
+MB!*A`("@8`"59D`$@A`EP8,H<`/"!``!B!*@@("@8`"59D`$@A`K@X,H<`+"
+M!``!B!*D`("@8`"59D`$@@Y@`8@2H`>`H&``E69`!`,0``"`CD`!(D@`!94R
+MH``#``(`E!*``94RH`"0$``80````)(0(*""$"M_@RAP`H"F8``62``&\B0`
+M`9`0`!B2$"`D0````)00(`&Q-&``@<_@"`$```"!P^`(D!`@@)WCOT"`IF!_
+M&$@`#)`0`!B3+F`%`P``(H(08!R2`D`!0````),R8``#```@@(A`"!)(``.P
+M$"`!L!`@`('/X`@!````G>._0*00`!B`IF!_&$@`-;`0(`"A+F`%(P``(I($
+M`!&3,F``D!``$D````"4$"``DA1@!)($``F3,F``D!``$D````"4$"``DA1@
+M")($``F3,F``D!``$D````"4$"``DA1@#)($``F3,F``D!``$D````"4$"``
+MDA1@$)($``F3,F``D!``$D````"4$"``DA1@%)($``F3,F``D!``$D````"4
+M$"``DA1@&)($``F3,F``D!``$D````"4$"``HA1@'*`$`!&A-"``D!``$I(0
+M`!!`````E!`@`+`0(`&!S^`(`0```)WCOT"F$``8H!``&8"F8'\82``JL!`@
+M`*00(``"QH`4E!`@`.0.H`6E+*`(P@Z@!*04@`'4#J`#E2J@&,(.H`*#*&`0
+ME!*``<(.H`&#*&`(E!*``<(.@`"4$H`!E3*@`8,LH!^4$H`!I32@`:$L(!"A
+M-"`+(P``(I(48!B2!``)DS)@`)4RH`!`````D!``$Z(48!R@!``1H30@`!4`
+M`""4%(`*E3*@`)`0`!-`````DA``$+`0(`&!S^`(`0```)WCOT`#*JJJ@*<@
+M`!)(``.*$&*JBA`@`(,N8!"#,&`0@*!@?QA(`(&0$"``P@Z``("@8`$"0``:
+MN!`@!11(``>`H&`%@*!@`")(``C"%J`"$&@`=@$````"0``0D!`@`!!H`'(!
+M````@*!@!`A(`&^0$"``PA:@`H"@8`4(2``(N!`@`,(6H`*`H&`-N!`@`1!H
+M``.Y9R`#N!`@!]0.H`3"#J`%@RA@")02@`'"#J`&@RA@$)02@`'"#J`'@RA@
+M&)02@`&4&H`%P@Z@"8,H8`CJ#J`(JA5``:H=0`4)```_B!$C_ZH-0`3F#J`*
+MP@Z@"X,H8`BF%,`!P@Z@#(,H8!"F%,`!P@Z@#8,H8!BF%,`!IAS`!<(.H`^#
+M*&`(Z`Z@#J@5``&H'0`%J`T`!.(.H!#"#J`1@RA@"*(40`'"#J`2@RA@$*(4
+M0`'"#J`3@RA@&*(40`&B'$`%PA:@`H@,8/^`H&`-HV4`!*$N8!"A-"`+)0``
+M(I($`!*3,F``E3*@`$````"0$``8DA2@!)($``F3,F``JS5@`)`0`!A`````
+ME!``%9(4H`B2!``)DS)@`*<TX`"0$``80````)00`!.2%*`,D@0`"9,R8`"I
+M-2``D!``&$````"4$``4DA2@$)($``F3,F``HS1@`)`0`!A`````E!``$:04
+MH!2@!``2H30@`)4W(`"0$``80````)(0`!"3+G`PDS)P,)`0`!A`````E!``
+M&X''X`B1Z``(G>._0)`0`!F"$"+?@RAP!)(&``%`````E!`@!@$```"!S^`(
+M`0```)WCOT"2$``9@A`BWX,H<`20!@`!0````)00(`:!S^`(D!`@`9WCOT"0
+M$``9$P```)(28`!`````E!`@!@$```"!S^`(`0```('#X`B0$"``G>._0*`0
+M`!B4$``9D!``&$`````3```8D!``&)(0+`&3*G`#0````)00(`&0$``8$P`8
+M`Y,R<`B4$"`#0````)80(`("R@`(L!`@`)`0`!`3`!@!0````),R<`C0-H``
+ML!`@`8'/X`@!````PA(CN("@0`D"0``)B!`@#((0*A6"`$`!PA(``8((8("`
+MH&``B!`@"XED8`,"PH`#`0```,@B@`"!P^`(D!`@`((0*A^"`$`!PA(``8"@
+M8``"2``(BA`@`((0*A>"`$`!PA(``8"@8`"*$"!#BV9@`8(0*B&"`$`!PA(`
+M`8@18`2`H&``BV9`!('#X`B1,6``G>._0`,```7@%@`!H@P@'*,\8`*@#"`"
+MH3P@`:,T8`"0$``80````)(0`!&0$``80````!,``"8#```(E!(``94RH`"0
+M$``80````!,``":0$``80````)(0`!&@'``(@*``$)1`(`"0$``80````)(0
+M`!$!````@<_@"`$```"=X[]`D!``&"$`$`5`````DS0P"+(&0!F4$"`#E2J`
+M&902@`B5,J``D!``&$````"3-#`(@<_@")`0(`&=X[]`D!``&"$`$`5`````
+MDS0P"+(&0!F4$"`#E2J`&90J``J5,J``D!``&$````"3-#`(@<_@")`0(`&=
+MX[]`D!``&*`0*`-`````DRPP`Y00(`&5*H`9E"H`"K0.H`&U+H`9E!*`&I4R
+MH`"0$``80````),L,`.!S^`(D!`@`9WCOT"0$``8@A`__X"F8`480``)L3!P
+M(!,`$`=`````DS)P")`*("^1,@`9D`H@`;$R(`"!S^`(`0```)WCOT"0$``8
+M$P`0!4````"3,G`(`S__GX(08_R4"$`(`P``(("FH``"2``$E!*``0,``$"4
+M$H`!E3*@`)`0`!@3`!`%0````),R<`B"$"M_@RAP`M(&``$#`$``DA)``9,R
+M8`!`````D!``&`$```"!S^`(`0```)WCOT"0$``8H!`D`4````"3+#`$`S_\
+M?X(08Y^4"@`!L@Y@![,N<`(#````@A!@`,(`0!F4$H`!E3*@`)`0`!A`````
+MDRPP!`$```"!S^`(`0```)WCOT"2$``9(0`6^Z$T,`F0!@`00````)00(`;4
+M#@`0`P`M]X,P<`K"#@`!@RA@")02@`&"$"6_@RAP`\(.``&#*&`0E!*``0,`
+M+?F#,'`*P@X``8,H8!B4$H`!E3*@`)`0`!@3`!`!0````),R<`<#`"W[@S!P
+M"L@.``&)*2`(`P`6_8,P<`G4#@`!E!*`!`,___""+H`!@RA@$)02@`&5,J``
+MD!``&!,`(`-`````DS)P"`$```"!S^`(`0```)WCOT"@$``8D!``&"4`(!-`
+M````DS2P"*(0``B0$``8DA`H!4````"3*G`$L!``")`0`!!`````DS2P"("B
+M`!&P0``8L2XP()$R(`"P%@`(@<_@"`$```"=X[]`D!``&!,`(!-`````DS)P
+M"(''X`B1Z``(G>._0)`0`!B@$"0!0````),L,`45`$``E!*`")4RH`"0$``8
+M0````),L,`4!````@<_@"`$```"=X[]`HA``&)`0`!@3`"890````),R<`BA
+M,B`3H`PA_X(,(0"('#X`@*!@`*%F0`20$``8DA`H!4````"3*G`$L!``")`0
+M`!$3`"`30````),R<`BP'@`(L!X`$('/X`B1,B``G>._0*`0`!B0$``8DA`B
+M`4````"3*G`%D`H@_X@*(`^1,B`$P@0C?("@0`@22``%L!`@`,(4(X"`H$`$
+ML61@`8'/X`B1,B``G>._0)`0`!B2$"@)0````),J<`3"!D``@@!`",(F0`"0
+M$``8$P`@(T````"3,G`(P@9@!((`0`C")F`$D!``&!,`("5`````DS)P",(&
+M8`R"`$`(PB9@#)`0`!@3`!`10````),R<`?"!F`(@@!`",(F8`B0$``8$P`0
+M$T````"3,G`'P@9@$((`0`C")F`0@<_@"`$```"=X[]`@*9@"`A(``F@$``8
+MD!``&)(0/_]`````DS)P,("F0`@H0``'DS9@`((0)A.#*'`#\B0``1!H``VP
+M$"``0````)`0`!B4$``(D!``&)(0(0=`````DRIP!((0)A.#*'`#\B8``;`0
+M(`&!S^`(`0```)WCOT"0$``8DA`A!T````"3*G`$`P``/X(08_^2"@`!0```
+M`)`0`!B!Q^`(D>@`")WCOT"0$``8H!`__T````"3-#`S@*9`"`A```:"$"PG
+M@RAP`N`F``$0:``7L!`@`)`0`!@C`"`%0````),T<`@#/__XH`H``9,V8`!`
+M````D!``&`,___B"*@`!H!0``:$T(`"0$``8DS1P"$````"4$``0@A`L)X,H
+M<`+R)@`!L!`@`8'/X`@!````G>._0)`0`!@3`"`%0````),R<`@3/__XDBH`
+M"9,R8`!`````D!``&(''X`B1Z``(@A`L(X,H<`+0"@`!D!H@`9`*(`&!P^`(
+MD3(@`)WCOT`"SD`1I!``&)`0`!@C`"`!0````),T<`@A/[__H!0C_Y0*`!"0
+M$``80````),T<`B($"PCB2DP`L(&``00:``0@@A`$)`0`!@A`"`!0````),T
+M,`@C`$``E!(`$94RH`"0$``80````),T,`B($"PCB2DP`L(&``2"$$`1PB2`
+M!('/X`B0$"`!G>._0)`0`!B@$#__0````),T,#.`ID`("$``!H(0(86#*'`%
+MX"8``1!H`!BP$"``D!``&",`(`5`````DS1P""$'_\"@*@`0DS9@`$````"0
+M$``8D2H@$`,'_\"0"@`!H!0`"*$T(`"0$``8DS1P"$````"4$``0@A`AA8,H
+M<`7R)@`!L!`@`8'/X`@!````G>._0)`0`!@3`"`%0````),R<`@#!__`D@H`
+M`9,R8!"3,F``0````)`0`!B!Q^`(D>@`"('#X`B0$"`!@</@"`$```"!P^`(
+MD!`@`('#X`@!````@</@"`$```"=X[]`D!``&!,`)P=`````DS)P")`*(/^!
+MQ^`(D>@`")WCOT"0$``8$P`0"T````"3,G`'D`H@!X''X`B1Z``(G>._0)`0
+M`!B4#F`'$P`0"T````"3,G`'`0```('/X`@!````@A`C!X,H<`2!P^`(T`(`
+M`9WCOT""$")]@RAP`]1>``$*RH`'D!``&((0(P>#*'`$\B8``1!H``20$"`!
+M0````),V8`"!Q^`(D>@`")WCOT"0$``8@*9@`1)(``J6$``;@*:@`0A(``J0
+M$"``@*:@!1)```>0$"`-$&@`!9`0(`"3-F``0````)4VH`"!Q^`(D>@`")WC
+MOT"0$``8@*9@"Q)(``J8$``<E`[@!M0F(ZB5,J``$P`0"4````"3,G`'$&@`
+M!I`0(`&3-F``E3:@`$````"7-N``@<?@")'H``B=X[]`D!``&)(0`!F4$``:
+MEA``&Y@0`!Q`````FA``';`0(`"Q>C0!@<_@"`$```"=X[]`@*9@``)(`"N0
+M$``8(0`0`4````"3-#`(%0``P)0J``J5,J``D!``&$````"3-#`(0````)`0
+M(`J@$"`*,P`0`0,__S^B$&/_D!``&)(0)`%`````DRIP!`,``$"`B$`(`D``
+M$("D(`!`````D!`@R)`0`!A`````DS9P")0*`!&0$``80````),V<`B@A#__
+M$D__[Y`0`!@0:``0L!`@`!)(``20$``8$&@`#+`0(``A`"`!0````),T,`@5
+M``$`E"H`"I4RH`"0$``80````),T,`BP$"`!@<_@"`$```"=X[]`D!``&"$`
+M(`%`````DS0P"`,``0"4$@`!E3*@`)`0`!A`````DS0P"("F8``"2``+D!``
+M&"$`$`%`````DS0P"!4``,"4*@`*E3*@`)`0`!A`````DS0P"`$```"!S^`(
+M`0```)WCOT"0$``8(0`@`4````"3-#`(`P`!`)02``&5,J``D!``&$````"3
+M-#`(@*9@``)(``N0$``8(0`0`4````"3-#`(%0``P)0J``J5,J``D!``&$``
+M``"3-#`(`0```('/X`@!````G>._0)`0`!B2$``:M!``&("F8`$"0``-L!`@
+M`8"F8`$*0``&@*9@`@)```P!````$&@`$K`0(`!___^%DSI@`!!H``JP$``(
+M?___NI,Z8``0:``'@A`L&W___]"3.F``$&@``X(0+!N"$"P;@RAP`O(F@`&Q
+M-B``@<_@"`$```"=X[]`D!``&!,`$`%`````DS)P"`,``,"0"@`!D3(@$)$R
+M(`"!Q^`(D>@`")WCOT"`IF`"`D``%)`0`!B`IF`"&$@`!X"F8`2`IF`!`D``
+M")(0(``0:``1`0````)```>2$"``$&@`#0$````#````$&@`![`08``#````
+M$&@`!+`08``#````L!!@`$````"2$``8DA``&(''X`B1Z``)G>._0)`0`!A`
+M````DA`@#(''X`B1Z``(G>._0)`0`!B4$``90````)(0(`P!````@<_@"`$`
+M``"=X[]`D!``&)(0(`A`````E!`@!`$```"!S^`(`0```)WCOT"0$``8DA`@
+M"$````"4$"`@D!``&)(0(`B4$"`$0````)80(`"P$"``L7HT`8'/X`@!````
+MG>._0)`0`!@A`!`)0````),T,`>4"C_?E3*@`)`0`!A`````DS0P!P$```"!
+MS^`(`0```)WCOT"0$``8(0`0"4````"3-#`'E!(@()`0`!A`````DS0P!P$`
+M``"!S^`(`0```)WCOT"4$``9D!``&)(0(@%`````DRIP!K4VH`"0$``8$P`@
+M$9,R<`A`````E!``&@$```"!S^`(`0```)WCOT"B$``8@*9@/QA(`!JP$"``
+M@*9@'PA(``R0$``1(0`@$4````"3-#`(E!`@`94J@!F4*@`*E3*@`)`0`!$0
+M:``+DS0P"*`0(@%`````DRPP!I00(`&5*H`9E"H`"I4RH`"0$``1DRPP!D``
+M``"P$"`!@<_@"`$```"=X[]`HA``&("F8#\82``:L!`@`("F8!\(2``,D!``
+M$2$`(!%`````DS0P")00(`&5*H`9E!*`")4RH`"0$``1$&@`"Y,T,`B@$"(!
+M0````),L,`:4$"`!E2J`&902@`B5,J``D!``$9,L,`9`````L!`@`8'/X`@!
+M````G>._0)`0`!@3`"`/0````),R<`B!Q^`(D>@`")WCOT"0$``8E!``&1,`
+M(`]`````DS)P"`$```"!S^`(`0```,`J8`C`*F`)P"I@"L`J8`N:$"``VBI@
+M#(H*K_^"$"``PBI@#8DQ8`C(*F`.RBI@#YH+8/^;*W`8@@A@_X,H<!""$$`-
+MB`D@_XDI,`B($0`!B@E@_XH10`2`HH`%$D@`(I`0(`"""N`@@*!@`")(`!;`
+M*F`4P@I@#(,H<!C("F`-B2DP$(@1``'""F`.@RAP"((00`3("F`/B!$``0,`
+M``B($0`!@S$P&,(J8`R#,3`0PBI@#8,Q,`C"*F`.R"I@#\`J8!3`*F`5P"I@
+M%L`J8!?`*F`0P"I@$<`J8!+`*F`3D!`@`8'#X`@!````G>._0)`0`!C"#F`7
+M@@A@`8"@8``"0`!LL!`@#\(.X!>""&`!@*!@`#)(``C"#F`20````)(0(`R`
+MIH`(`D``8K`0(`_"#F`2@RAP",@.8!."$$`$@@AO_\(W0`#"#F`4@RAP&,@.
+M8!6)*3`0B!$``<(.8!:#*'`(@A!`!(,H<"2#,'`SPC=@`L`O8`3"#F`4@RAP
+M&,@.8!6)*3`0B!$``<(.8!:#*'`(@A!`!,@.8!>($0`!@@D@`H"@8``R2``5
+MR`Y@$(()(`2`H&``(D@`!,(.8!<0:``'@A`@`8((8!"`H&```D@`!<(/8`2"
+M$&`($&@`!\(O8`2"$&`"PB]@!,(.8!>#,&`%PB]@!<@.8!")*3`8P@Y@$8,H
+M<!""$$`$@S!P$\(O8`;"#F`4@RAP&,@.8!6)*3`0B!$``<(.8!:#*'`(@A!`
+M!,@.8!>($0`!@@DA`("@8``B2``&@A`__P,``!^"$&(`@@D``8,P8`G"+V`'
+MP@Y@$(,H<!C(#F`1B2DP$(@1``'"#F`2@RAP"((00`2#,'`/@@A@#\(O8`C"
+M#F`0@S!P`X((8`?"+V`)P@Y@$H,P<`2""&`!PB]@"K`0(`"!S^`(`0``````
+M````````````````````````````````````````G>.^\*80`!BL$"``JA`@
+M`,`GIZO"%J`"B2A@$(((80"`H&```D@`!+H0(``0:``%@S$@%\(6H`*#,'`'
+M@AA@`8((8`&`H&``$D@"WH@0(`S"%J`"B2A@$(((8""`H&``(D@`!,(6H`(0
+M:``$@S$@%H,P<`:"&&`!@@A@`8"@8``22`+0B!`@#)`0`!A`````DA``&JX0
+M``@"P@+*B!`@#("F8`8B0``,@*;@`!A(``>`IF`(@*9@`1A(`L*`IN``$&@`
+M!0$````22`*^B!`@#("FX``"2``PD!``&!,`(!-`````DS)P"+H0``B0$``8
+MDA`H!4````"3*G`$T">GJ\@&(WRB$"``J`>G[P,```2`H2`#"$@`"*0084"0
+M$``8DA`@14````"3*G`&$&@`#M`GI[^A-&``H2PP`J`$`!23+&`"D@)`$I,R
+M8`!`````D!``&*($8`&`I&`)"$__]M`D/]#(#>`$@@D@`H"@8``R2``%PA7@
+M`H()/_["+>`$PA7@`L(VH`+"#>`$PBZ@!)`0`!@3`!`+0````),R<`>H$"`!
+MJ7H4")`0`!@3`"`!0````),R<`@#`(``D`H``=`GIZ^0$``8DA`D`4````"3
+M*G`$`P`_@((08&"0"@`!T">GLY`0`!@3`!`%0````),R<`C0)Z>[D!``&)(0
+M*`-`````DRIP`]`GI[?2%J`"0````)`0`!@"P@)JB!`@`\(6H`*""&'P@*!@
+MP")``!*L$"`$%$@`!X"@84"`H&"@(D``#:P0(`,0:``-P@8C?`)```:`H&%0
+M(D``!:P0(`(0:``'P@8C?*P0(`$0:``#JA`@`:H0(`+"!B-\D!``&!,``":`
+MH&`#&$@`!900(`>0$``8$P``)I00($=``````0```,(&(WR`H&`#"$@`2Y`0
+M`!C*%J`"@@E@@("@8``"2``THA`@`((0(H6#*'`#R!3``0,```R`H0`!"$@`
+M+@,```"""6`@@*!@`")(``B"$"J3@A`E28,H<`+@%,`!@A`BI1!H``:#*'`#
+M@@!``>`4P`&"$"J5@@!``>(4P`&1-"``0````)(0(`.@$``(D31@`$````"2
+M$"`#B@U@`XLI<`(#````@A!@`(H!0`'(`6$LB`D_/X,L(`:""&#`B!$``<@A
+M82S(`6$XB`D_\(,T(`*""&`!D`(`")`*(`Z"$$`(B!$``<@A83BB$"```P``
+M`*008`"@#6`#B31@`((!``2"`$`$B2AP`M($@`2"`$`0@RAP`M0$@`%`````
+MD!``&*($8`&`I&`;"$__]8DT8`"0$``80``$49(0`!JB$"```P```*008`"@
+M#:`'B31@`(,I,`*"`$`$B2AP`M($@`2"`$`0@RAP`M0$@`%`````D!``&*($
+M8`&`I&`B"$__]8DT8`"B$"```P```*008`"@#6`#B31@`((!``2"`$`$B2AP
+M`M($@`2"`$`0@RAP`M0$@`%`````D!``&*($8`&`I&`_"$__]8DT8`"B$"``
+M`P```*`08`"#-&``@RAP`X"FX``"0``'T@0``0,__^""`D`!@*!O_RA(``JB
+M!&`!DS)@`(,T8`"#*'`#@@!`$-0`8`1`````D!``&*($8`&`I&"J"$__[H,T
+M8`#"!B-\@*!@`QA(`""`IN``D!``&"$`(`=`````DS0P"!4__`"4*@`*`P!T
+M`)02@`&5,J``D!``&$````"3-#`(D!``&)(0(%Q`````E!`@`)`0`!@3`!,/
+MDS)P!T````"4$"`(D!``&"$`$`E`````DS0P!Y02)`"0$``80````),T,`>`
+MIN```D@`*((0(M^5-V``D!``&!,`(!-`````DS)P"-0'IZN0$``8DA`H!4``
+M``"3*G`$R`8C?*(0(``#```$I!!A0("A(`,(2``)H`>G[]0'I[^0$``8DA`@
+M14````"3*G`&$&@`$((0(M^3+&`"D@)`$I,R8`"#-&``@RAP`H(`0!#4`'_0
+M0````)`0`!BB!&`!@*1@"2A/__:3+&`"@A`BWX,H<`34#,`!`P`M\8,P<`K"
+M#,`!@RA@")02@`$#`!;Y@S!P"<(,P`&#*&`0E!*``0,`+?.#,'`*P@S``8,H
+M8!B4$H`!E3*@`)`0`!A`````$P``(`,`+?6#,'`*R`S``8DI(`B"$"M]@RAP
+M`M0,P`&4$H`$P@>GKY02@`&5,J``D!``&!,`(`%`````DS)P"),^8`!```MG
+MD!``&)`0`!B@$"0!0````),L,`3"!Z>SE!!`")4RH`"0$``80````),L,`34
+M!Z>[D!``&!,`$`5`````DS)P"-0'I[>0$``8DA`H`T````"3*G`#E34@`)`0
+M`!@3`!`+0````),R<`<#`!;[@S!P"=0,P`$#`"WW@S!P"L(,P`&#*&`(E!*`
+M`8(0);^#*'`#P@S``8,H8!"4$H`!`P`M^8,P<`K"#,`!@RA@&)02@`&5,J``
+MD!``&!,`$`%`````DS)P!P,`+?N#,'`*R`S``8DI(`@#`!;]@S!P"=0,P`&4
+M$H`$E3*@`)`0`!@3`"`#0````),R<`B"$"PE@RAP`M0$P`&0$``8$P`0`T``
+M``"3,G`'D!``&)(0(("4$#__0````)4RL"#"!B-\@*!@!!)(``V0$``8PA8C
+M@("@8`$82``)`0```$````"2$"`4E!(D`)`0`!A`````DA`@%)`0`!A`````
+MDA``&@+"`/&($"`#@*9@!@)``!60$``8P@8CM(((8`.`H&```D@`$`$````A
+M`"910````),T,`@5"```E"H`"L(&([2""&`!@RA@'902@`&5,J``D!``&$``
+M``"3-#`(D!``&$``!'R2$``:D!``&$```@B2$``7`L(`U(@0(`/(%B-X`P``
+M/((081N`H0`!$D@`#9`0`!C"%J`"@@A@@("@8``B2``)$P`F!Y`0`!@3`!L!
+MDS)P!T````"4$"4"D!``&!,`)@>3,G`(0````)00(`&0$``8$P`F14````"3
+M,G`(`S__\(HJ``'(%J`"B`D@((,I8`*#,&``@*$@`!)(``2":&`6@S%@`()H
+M8`J0`&!D0````)$Z(`"0$``8H!`DPT````"3+#`%E!(@`9`0`!A`````DRPP
+M!9`0`!B3+#`%E!`@`4````"6$"``D!``&$````"2$``7"LH`"X(0+!W"%J`"
+M@@A@(("@8``22``$R!:@`H(1(`+"-J`"$&@`DH@0(`.#*'`"P@3``8"@8``"
+M2``,H!`@`)`0`!B2$"3)DRIP!4`````5``!\B!`@`8(0)@^#*'`#R"3``:`0
+M(`"B$"`!DRP@`I(B<`"3,F``E2Q`$)4RH`!`````D!``&*`$(`&`I"`)!$__
+M^),L(`*@$"``DS0@`$````"0$``8H`0@`8"D(`DD3__\DS0@`)`0`!B2$""D
+M%0$``4````"5,K`*D!``&)(0(*A`````E!`@`9`0`!B2$""L0````)00(`&0
+M$``8H!`A"T````"3+#`$E!``")`0`!A`````DRPP!)`0`!B2$""@%0@)94``
+M``"5,K`*@A`K?Z,H<`(#``("@A!A9<(DP!&0$``80````)(0(*P#``'`E!(`
+M`94RH`"0$``80````)(0(*R`IF`&$D@`#X(0)0&0$``80````)(0(*"@!"[U
+ME!(`$)4RH`"0$``80````)(0(*#"!,`1@A!`$,(DP!&"$"4!@RAP`L(&``&`
+MH&```D@`!9`0`!A`````D!``&)`0`!B@$"0!0````),L,`45`&``E"H`"I4R
+MH`"0$``80````),L,`6"$"83@RAP`]($P`&`HG__`D``!),R8`!`````D!``
+M&((0+">#*'`"T@3``8"B?_\"0``$DS)@`$````"0$``8@A`AA8,H<`72!,`!
+M@*)__P)```23,F``0````)`0`!C4!B.H@**@`")(``CR)B.,E3*@`)`0`!@3
+M`!`)0````),R<`?R)B.,$&@`![`0(`'"!P``@*!@`#)(``+()P``L!`@`('/
+MX`@!````G>._0)`0`!A```#]DA`@`H''X`B1Z``(G>._0*`0`!B0$``8DA`@
+M`$````"4$"`!`LH`"K`0(`"0$``00```\)(0(!,"R@`%L!`@`$````"0$"@T
+ML!`@`8'/X`@!````G>._0*`0`!B0$``8DA`@`$````"4$"`!`LH`<+`0(`""
+M#F'P@*!@P")``"N0$``0%$@`"8"@84"`H&"@`D``$X"@8+`"0``2D!``$!!H
+M`%,!`````D``,X"@84`42``'@*!A4("@8-`"0``;D!``$!!H`$H!`````D``
+M*I`0`!`0:`!&`0```)`0`!`3`"8!DS)P"$````"4$"``D!``$)(0(%&3*G`)
+M0````)00(`.0$``0$P`F'Y,R<`A`````E!`@&4````"0$"$L$&@`,Y`0`!`3
+M`"8!DS)P"$````"4$"``PA0C>("@8!(22``KD!``$!,`)A^3,G`(0````)00
+M(!A`````D!`A+)`0`!"2$"!1DRIP"1!H`!V4$"`"@@Y@$)`0`!`3`"8!DS)P
+M"("@8``22``&E!`@`Y`0`!`3`"8!DS)P")00(`!``````0```,(4(WB`H&`2
+M$D@`#Y`0`!`3`"8?DS)P"$````"4$"`80````)`0(2R0$``0DA`@49,J<`F4
+M$"``0`````$```"0$``00```@9(0(!,"R@`.L!`@`$````"0$"@TD!``$)(0
+M(`!`````E!`@`0+*``:P$"``D!``$$```'22$"``L!``"('/X`@!````G>._
+M0*80`!BD$``8D!``&$````"2$``9HA``"`+"`&:P$"``@A`F#Z$H<`/"!,`0
+M@*!@``)(`#B0$``3J!`DR4````"3+3`%`P``0("*``$22``QD!``$\`DP!"2
+M$"G!0````),J<`2J$``(D!``$Q,`)P5`````DS)P"*`0``B0$``3$P`3@T``
+M``"3,G`'@S5@`8DT(`&"`$`$BS!@!YLT(`:`H``%B$`@`("@``V"0"``@(D`
+M`2)(`!>0$``3L"``"(D^(`"#.6``L6D``;`.(#^A/6``@SM@`*%L``&@#"`?
+MD!``$T````"3+3`%E2X@!902@`B4$H`0E!*H`)4RH`"0$``30````),M,`60
+M$``30``!#9(0`!$*P@`)D!``$\(68`*"$&`"PC9@`L(48`*""'_]$&@`%,(T
+M8`)`````DA``$0K*`!*0$")Q0````)$J,`.0$``30````)(0`!$*R@`+`0``
+M`,(68`*""&`@@*!@`!)(``3(%F`"@A$@`L(V8`(0:``+L!`@`$``"#Z0$``3
+M@A`F#X,H<`/"!(`!@*```8)@/__")H``L!`@`8'/X`@!````G>._,*`0`!FS
+M?F?_\B>GZY`0`!A`````DA`@#)4T(`"0$``80````!,``!!`````D!`@#Z`,
+M(`/"!Z?K@@A@`\(GI^N5,&``ES0@`)`0`!A`````$P``$*`,(`&`I"``$D@`
+M$K(0``B"$"`5PB>GZ]0/I^O"#Z?L@RA@")02@`'"#Z?M@RA@$)02@`'"#Z?N
+M@RA@&)02@`&5,J``D!``&$````"2$"`4@<_@")$R8`"=X[]`TA9``-068`)`
+M````D!``&(@0``C"%F`"@@A@@("@8``"2``4IA`@`(,J,#"E.'`PH@2`$J($
+M0!*C+'`"(0```*`4(`"@!"#DI`1`$-`$H`1`````DA`@"*8*(/^G+.`%P@1`
+M$(,H8`2F%,`!R!2@"(LI(!"#.6`0@*!@D!1```>1*2`0@S%@$(((8`&`H&``
+M(D``"I$Z(!"1.B`0D`(_Z)$R(`!`````DA`@"*`*(/\0:``+@A`@`9`"/^B#
+M,B`?D`(``9$Z(`&1,B``0````)(0(`B@"B#_@A`@`*$L(`*"`$`!H!0``:`4
+M)`&4#.#_E2J@"((,(/^4$H`!E3*@`)`0`!@3`"8G0````),R<`BA-"`(%0``
+M/Y02HP"4#,`*@@P@_Y02@`&5,J``D!``&)(0*8U`````DRIP!((0(GV#*'`#
+M\G8``8'/X`B0$"`!G>._0)`0`!@3`"890````),R<`B1,B`3D`HA_[`0``B"
+M"B$`D!(^`("@8`"19$`8L2H@$+$^(!"!S^`(D3H@`)WCOT"0$``8(0`F&4``
+M``"3-#`(E`HP`*(.8/^#+&`)@@AN`)02@`&T#J'_E!*`&I4RH`"0$``80```
+M`),T,`B0$``8H!`DPT````"3+#`%E!(@`I`0`!A`````DRPP!8"D8``"2``&
+MM!`@.+0.8/^#+J`#@B!`&K4H8`F@$"``HA`DPY`0`!A`````DRQP!9`*(`*`
+MHB```D``"H"D(#M`````D3Z@`*`$(`&`I"`[)$__]I`0`!@0:``)L!`@``1`
+M``0!````$&@`!;`0(`!___^\D!``&+$Z(`"!S^`(`0```,(28`*""&'@@*!@
+MP")``!""$"*1%$@`!X"@84"`H&"@`D``"8(0*D,0:``-D!`@`#)(``N0$"``
+M@A`E(1!H``6#*'`"$&@``X(`0`&#*'`#PA(``<(R@`"0$"`!@</@"`$```"=
+MX[\PH!``&)`0`!B2$``9?___XY0'I^T"R@`9L!`@`)`0`!"2$"3#0````),J
+M<`5___^2D!``$(,J(!"#.&`0R%>G[8"@0`0D2``&T#9@%L(68`*"$&`"PC9@
+M`M`V8!:#*B`0@SA@$,A7I^V`H$`$@A`@`(-DH`&Q,&``@<_@"`$```"=X[\P
+MP@8C?("@8`,82``CHA``&)`0`!A`````DA``&0+*`!^0$``1D!``&)(0`!E_
+M__^ZE`>G[0+*`"&P$"``H!`@``,```"P$&``@SP@`-(.``&0$``1?___=Y00
+M(`"#*B`0@SA@$,A7I^V`H$`$D6:@`*`$(`&`I"`""$__]-`V8!:`I"`#@A`@
+M`(-E(`$0:``+L3!@`)`0`!&@$"3#0````),L,`64$B`"D!``$4````"3+#`%
+ML!`@`8'/X`@!````PA)``)@0``&#*&`0@S!@$`D```#($2``@*!`!!A```V*
+M$"```P```)H08`"#*R`0B3!@$(H!8`&#.6``@RAP`L(30`&`H0`!*$___(H!
+M8`&#.6``@RAP`@D```"($2``@@!`!-!08`*!P^`(D6H@`YWCOT#"%F`"@@A@
+M@("@8`"N$"`"KV1@`<(68`*""&'@@*!@P`)``'.F$``8@*!@P!1(``>`H&%`
+M@*!@H`)``&*"$"5'$&@`T+`0(``R2`#.L!`@`,(60`""`'!?@RA@$(,P8!"`
+MH&3J.$@`!\(60`""$"5#@RAP`N@6``$0:``F@A`JAPD___J($2-T@@!`!(,H
+M8!"#,&`0@*!@[SA(``?"%D``@A`A48,H<`3H%@`!$&@`&8(0*HD)/__ZB!$B
+MA((`0`2#*&`0@S!@$("@8.`X2``'R!9``((0)46#*'`"Z!8``1!H``R"$"J+
+MJA`@``,```6"$&)<@*$``0A(``BH$"``@A`BHX,H<`/H%@`!@A`JC8(`0`'J
+M%,`!@A`A28,H<`3B%,`!@A`J2X(`0`'L%,`!PA3``8"@``&"8#__LA```8H-
+MX`.+*7`"`P```((08`"*`4`!P@%@/`D$``"(*$`$@A`E88,H<`+"%,`!@RA@
+M'(@1``'((6`\P@%@2`D!``"(*$`$@A`JPX(`0`'"%,`!@RA@&H@1``'((6!(
+MR`%@_(@)/_>"$"K!@@!``<(4P`&#*&`#B!$``1!H`!W((6#\@RAP`N@6``&"
+M$"J/@@!``>H6``&"$"I)@@!``>(6``&"$"*3$&@`#8,H<`."$""I@RAP!>@6
+M``&"$"J1@@!``>H6``&"$"4E@RAP`N(6``&"$"I-@@!``>P4P`'"%,`!@*``
+M`8)@/_^R$``!I`W@`Z4LL`(#````@A!@`*0$@`'@!*"$H`P_/Z,L8!"C-&`0
+MD!``$4````"2$"`$D2H@!X,N8!"#,&`0@RA@!I`2``&0"B#`H!0`".`DH(3@
+M!*"0H`P_^)`0`!%`````DA`@!)$R(`&0"B`'H!0`".`DH)"@##]_HRT@$*,T
+M8!"0$``10````)(0(`.1*B`'D`H@@*`4``C@)*"0X`2@G*`,/_R0$``10```
+M`)(0(`.1,B`!D`H@`Z`4``C@)*"<H`P_XY$M8!"1,B`00````)(0(`.1*B`"
+MD`H@'*`4``C@)*"<R`2@S(@)/_>#+:`#@@A@"(@1``'()*#,H!`@``,```"B
+M$&``I`W@`XD\(`""`0`$@@!`!(DH<`+2!$`$@@!`$H,H<`+4!$`!0````)`0
+M`!B@!"`!@*0@&`A/__6)/"``@A`L(8,H<`+`),`!L!`@`8'/X`@!````G>._
+M0,(6H`*""&'@@*!@P`)```Z*$``8@*!@P!1(``>`H&%`@*!@H`)```F($"`!
+M$&@`6[`0(``"0``%B!`@`!!H`%>P$"``B!`@`HDY(`"(`0`$B`$`!8(0*DN"
+M`$`!@@$``=008`R"$"4G@RAP`H(!``'"$&`,@RA@!I02@`&"$"I1@@!``8(!
+M``'"$&`,@RA@#)02@`&"$"*5@RAP`X(!``'"$&`,@RA@$I02@`&"$"I7@@!`
+M`8(!``'"$&`,@RA@&)02@`&"$"4M@RAP`H(!``'T$&`,@A`J78(`0`&"`0`!
+MPA!@#(,H8`:T%H`!@A`@4X,H<`:"`0`!PA!@#(,H8`RT%H`!@A`J8X(`0`&"
+M`0`!PA!@#(,H8!*T%H`!@A`E,X,H<`*(`0`!PA$@#(,H8!B`IF`!`D``"K06
+M@`&`IF`!*D@`"8(0(P>`IF`"(D``!900`!H0:``1L!`@`+00``J"$",'@RAP
+M!/(A0`&5,J``D!``&)(0),M`````DRIP!94VH`"0$``8$P`F64````"3,G`(
+ML!`@`8'/X`@!````G>._0,(68`*""&'@@*!@P`)``!ZL$``8@*!@P!1(``>`
+MH&%`@*!@H`)``!FN$"`!$&@`X;`0(``R2`#?L!`@`*X0(`"0$``8(0`F44``
+M``"3-#`(E`H_QX(0(K&#*'`#PA8``8,H8`.""&`XE!*``94RH`"0$``80```
+M`),T,`@0:``$P@8C?*X0(`+"!B-\@*!@`QA(``F0$``8H!`ID4````"3+#`$
+ME!(@`Y`0`!@0:``CDRPP!*(0*9%`````DRQP!)0*/`:A/>``H`0`$*`$`!:"
+M$"%)@RAP!(($``'"$&`,@RA@!)02@`&4$J`!E3*@`)`0`!A`````DRQP!((0
+M(P>#*'`$T@6``9`0`!A`````E!``&8(0(4>#*'`$H`0``=04(!24$J(`E`JC
+M_Y`0`!@3`!,MDS)P!T`````C`"81D!``&$````"3-'`(`S__\((08'^4"@`!
+MH3W@`*0$`!"D!(`6IA`A1:<L\`2F!(`3R!3@"HDI(`<#```/@A!C@(@)``&4
+M$H`$E3*@`)`0`!A`````DS1P")`0`!@C`!,)0````),T<`<5``#\E"H`"L(4
+MX!"#*&`,"0``_(((0`24$H`!E3*@`)`0`!A`````DS1P!Y`0`!BJ$"F%0```
+M`),M<`0I/__`E`H`%*`$`!:B$"%'HRQP!*`$`!'(3"`1B2D@"`,``#^"$&,`
+MB`D``902@`3"#"`.E!*``94RH`"0$``80````),M<`2@$""CH2PP!:`$@!#"
+M%"`2E2A@&(,H8!"4$H`!I`2`$<@4H`B#*2`(E!*``902@`25,J``D!``&!,`
+M)@U`````DS)P")`0`!@C`!,%0````),T<`>H%2#_E`H`%,(4X!:#*&`(E!*`
+M`94RH`"0$``80````),T<`>0$``8(P`F&4````"3-'`(%0`!_)0J``K"%"`,
+M@RA@#`D``?R""$`$E!*``94RH`"0$``80````),T<`B"$"*%@RAP`\@5@`$#
+M```,@A!@`H"A``$82``/HA`@`L@6(WH#```$@A!@(H"A``$22``<D!``&,(6
+M8`*""&!`@*!@`#)(`!>B$"`($&@`%B$`)DG"%D``@@A@'X"@``&(0"``@@!_
+M]H"@8`R"$"``@V<@`8")``$"2``*D!``&(,]X`""`$`!@@!`%H@0(4V)*3`$
+M@@!`!,(08`ZB!$`!(0`F24````"3-#`(E`H_`8($0!&""&#WE!*``94RH`"0
+M$``80````),T,`BP$"`!@<_@"`$```"=X[]`D!``&)00`!F`IF!`LV=@/_(V
+M(ZR5,J``$P`F3T````"3,G`(@<_@")`0(`&=X[\@PA9@`H((8>"`H&#``D``
+M'J`0`!B`H&#`%$@`!X"@84"`H&"@`D``*8(0(O40:`!GL!`@`#)(`&6P$"``
+M@A`JSX(`0`'"%@`!PC>GUX(0*L6"`$`!@@8``<)WI\^"$""M@RAP!8(&``'"
+M=Z??@A`L@8(`0`'D%@`!@A`F01!H`"F#*'`"@A`B]8,H<`/"%@`!PC>GUX(0
+M*]6"`$`!@@8``<)WI\^"$"OE@@!``8(&``'"=Z??@A`F58,H<`+D%@`!$&@`
+M$8(0+*N#*'`#PA8``<(WI]>"$"%[@RAP!((&``'"=Z?/@A`L,X(`0`&"!@`!
+MPG>GWX(0)EV#*'`"Y!8``8(0++L0:``'@@!``8@$``2"$"9C@RAP`A!H`"2F
+M`0`!H@0``=060`"0$``80```*9('I\^F$"``D!``&$````"2$``9BA`@`((0
+M)4N#*'`"PA0``8"A0`$60``4@A`@J9DH<`6"$"5+@RAP`MH4``&).6``@@$`
+M!((`0!""`$`,PA!@#H"@8``"2``%B@%@`8"@0`@"1__>B2DP!H"A0`T&3__U
+MB3E@`)<LL#"7,O`PD!``&)(0`!.4$``10``!(9@0`!FP$"`!@<_@"`$```"=
+MX[]`JA`@`*@0(#\A````D!0@`$````"2$"$($0```)`2(`!`````DA`@@*`4
+M(`"F!"`(I`0@B*`0(`&B$"``@RQP,(,P<"_@-,`!@@0@`:`0``&#*&`0@S!@
+M$("@8#\(3__XH@1@`0D```"($2``XC$@!H(0(`'",2`"@A`@/\(Q(`3"$2`&
+M@*!@``)``!.B$"``M2ZP,*$L<#"A-#`OTA3`$)$VL#!```*"E!``&=`T@!""
+M!&`!HA```8,H8!"#,&`0"0```,@1(`"`H$`$"D__\Z$L<##8%(```P```,@0
+M8`"(`0`$B`$`$M81/_["$&``@*!@``)``#ZB$"```P```)008`"#+'`P@S!P
+M+XDK(!").2`0RA2``<)4@`&`H0`!!D@`!,(2H`:8$``%JA``$8(@0!&"`'__
+MH!```8,H8!"`H&```D``$H,L,#"#,'`OF@!`$LA3?_[*%(`!PE2``8"A``$T
+M2``"RC-__H($8`&B$``!@RA@$(,P8!#($J`&@*!`!`I/_^&#+'`P`P```,(0
+M8`"`H&```D``%:(0(``#````VA!@`(,L<#"#,'`OB2K@$(DY(!#*%(`!PE2`
+M`8"A``$62``$@@1@`980``6H$``1HA```8,H8!"#,&`0@*!`#0I/__*#+'`P
+MB2L@$(DY(!"(`2`9B3D@`(EI(#*"`0`$@@!`!(,H8`."`$`$H@!``;00(`"#
+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
+M:``(@A`@=XH0(#*:$"``F!`@,H(0(!3"(F`,@A`@(\(B8!#2`F`$@*)`!(A`
+M(`"`HD`%@A`@`(-G(`&`D0`!`D@`"9`0(`"`HD`-B$`@`("B0`R"$"``@V<@
+M`8"1``&19F`!@</@")$R(`"=X[]`@A`F$8,H<`/4!@`!E2J@"0,``!^"$&(`
+ME`J``0,``""4$H`!E3*@`)`0`!B2$"F30````),J<`2($"`!@A`L(8,H<`+(
+M)@`!@<_@"`$```"=X[]`I!``&*`0`!B"$"+=@RAP!*(&``'"!&`4@*!@``)(
+M`"JP$"``@A`L(;$H<`+"!(`8@*!@`1)(`"*"$"PAD!``$I(0*9-`````DRIP
+M!`,``""`B@`!$D@`&H(0+"&#,B`9PB1@!,`D@!B0$``2?___J)(0`!$*R@`2
+M@A`L(9`0`!)````3DA``$0+*``V"$"PAD!``$D```!J2$``1@*(@``1```:0
+M$``20```AY(0`!&"$"`"PB2`&((0+"&#*'`"\`0``8'/X`@!````R`)@!,("
+M8`R`H0`!"$@`!I`0(`#"`F`0@*$``0I(``,!````D!`@`8'#X`B1,B``P@)@
+M%("@8``"0`!ND!`__\H"0`"#,6``B2AP`X@A``&)*3`"`P```((08`""`&`(
+MB`$``<AR8!C(`F`$P@)@$("A``$J2``JP@)@#("A8``"0`!<`0```,@B8`C"
+M`F`0@*$``0I``""8$``!P@)``("@8``"0``<`P```)008``#````EA!@`,("
+M0`":`'__VB)``(,S8`")*'`#B"$``8DI,`*"`0`*REI@&,(`8!#*`6`(@B!`
+M!8(`0`'*`F`(BB%``<HB8`B(`0`+@*%`#`I```7(<F`8@*-@`#)/_^S"`D``
+M$&@`-Y`0(`&`H0`!&$@`-)`0(``#````P@!@`((`?__(`D``@*$``0)``"V0
+M$#_^R`)@!,@B8`C"`F`,@*$``1A``":6$``!`P```,(`8`""`'__R`)``("A
+M``$:0``?BA``!`,```"0$&```P```)008``#````P@!@`)@`?_^:`6`!VB)`
+M`(,S8`")*'`#B"$``8DI,`*"`0`(REI@&,(`8!#*`6`(@B!`!8(`0`'*`F`(
+MBB%``<HB8`B(`0`*@*%`"QA```7(<F`8@*-`#`I/_^R*$``-D!`@`H'#X`@!
+M````P@)@%("@8``"2``6`0```,):8!C($$``@A`BL8,H<`/(,@`!PEI@&,@0
+M8`*"$"K#@@!``<@R``'"6F`8R!!@!((0)6&#*'`"R#(``<):8!C($&`&@A`J
+MP8(`0`'(,@`!@</@"`$```"=X[]`H!``&)`0`!@3`"`!0````),R<`@#```_
+M@A!C_X"F8`$"0``;D`H``8"F8`$42``'@*9@!H"F8``B0``0@A`L(Q!H`!X!
+M`````D``!H"F8`@"0``0@A`L(Q!H`!@!````@A`L(X,H<`+4!@`!E!(`"A!H
+M``P#`"!`@RAP`M0&``&4$@`*$&@`!P,`$(""$"PC@RAP`M0$``&4$@`*`P`(
+M`)02@`&5,J``D!``&!,`(`%`````DS)P"`$```"!S^`(`0```)WCOT"0$``8
+M?___S-)&(XP!````@<_@"`$````!````G>._0$````"0$``8H!``"!,@``"2
+M*@`)DS)@`$````"0$``8D!``&$````"2$"`PB`HC\("F8``"2``'B3$@!((0
+M("6"($`$@S!@`1!H``J(`0`!@*$@`1A(``>(`3__DS0@`$````"0$``8$&@`
+M#K`0(`"4"CP/@RD@!(((8_"4$H`!E3*@`)`0`!A`````DA`@,),T(`!`````
+MD!``&+`0(`&!S^`(`0```)WCOT"4$``:@*9@"11(``R0$"``@SY@`),H<`22
+M(D`!DRIP`I(&``F"$"N%@RAP`I("0`%`````D!``&(''X`B1Z``(G>._0)(0
+M`!J`IF`)%$@`#)`0(`"#/F``E2AP!)0B@`&5*K`"E`8`"H(0*X6#*'`"E`*`
+M`4````"0$``8@<?@")'H``B=X[]`I!``&("F8`("0``.D!``&("F8`(82``'
+M@*9@`X"F8`$"0``,HA`@`!!H`#6P$#__`D``!K`0/_\0:``Q`0```!!H``VB
+M$"`)$&@`"Z(0(`B"$"+A@RAP!((&``'"`&`(@*!@`!)(`":P$"``$&@``XD\
+M8`")/&``@RDP!((@0`2#*'`"H`(``8(0*X6#*'`"H`0``<($(`2`H&``$D``
+M&+`0/_^0$``00````)(0(#P*SH`.\B0@!((0(`O")"`,@A`@`L(D(!2"$#__
+MPB0@&((0(__")"`<@A`@"L(T("`0:``&PC0@(I,\8`"0$``20````)00`!JQ
+M/&``@<_@"`$```"=X[]`@A`@%X,H<`G4!@`!E`JC_X(0)<&#*'`#P@8``8,H
+M8!`A`/_`@@A`$)02@`&5,J``D!``&$````"2$""D@A`K@8,H<`+4!@`!E`JC
+M_X(0*X.#*'`"P@8``8,H8!"""$`0E!*``94RH`"0$``80````)(0(*B0$``8
+M0````)(0(*R4"CP`@A`BX8,H<`3"!@`!@@AC_Y02@`&5,J``D!``&$````"2
+M$""L`0```('/X`@!````G>._0)`0`!B`IF`)&$@`++`0(`")-F``@RDP!((@
+M0`2#*'`"D@(``8(0*X6#*'`"D@)``<("8`2`H&```D@`((@0(!?`(F`$B2DP
+M"8H0(`&+*4`9BC@`!<("``2""4`!PB(`!(@0*X&)*3`"P@(`!(()0`'"(@`$
+MB!`EP8DI,`/"`@`$@@E``<(B``2($"N#B2DP`L("``2""4`!PB(`!((0(N&#
+M*'`$R`(``8H)0`1___^FRB(``;`0(`&!S^`(`0```)WCOT"H$``8IA``&((0
+M(GV#*'`#REX``8"F8`D82`%QL!`@`(DV8`"#*3`$@B!`!(,H<`*D!0`!@A`K
+MA8,H<`*D!(`!P@2@!("@8``"2`%EL!`@`<($H!B`H'__$D@`%*$N8`("P4`(
+MB!`@#\(18`*""&"@@*!@H`)```.($"`?B!`@#X(0(`&`H$`$&D``"*$N8`*"
+M`$`!@A!@`8"@0`0J3__^@@!``:$N8`(C```$DA1@0)($``F3,F``E`AC_\($
+MH!R#*&`*"0`#_X((0`24$H`!P@2@%(,H8!0)`_P`@@A`!)02@`&5,J``0```
+M`)`0`!22%&"`D@0`"9,R8`#4%*`BE2J@!)0*H/#"%*`@@@A@#Y02@`$#``((
+ME!*``94RH`!`````D!``%)($*<"3,F``D!``%$`````5```"P@4C?("@8`,X
+M2``)P@2@))(480"2!``)DS)@`)`0`!1`````%0!``,($H"2`H&``(D@`'<($
+MH#"A+F`"D@0HP),R8``5/\``E"A`"L($H"B#*&`8E!*``94RH`!`````D!``
+M%*`$*<"A-"``D!``%$````"2$``0D!(@`<($H"B`H``!E$`@`)4JH`B4$H`(
+ME3*@`)`0`!1`````DA``$,($H#"`H&``(D@`#<($H"R3+F`"D@)I`),R8``5
+M/\``E"A`"@,`0`"4$H`!E3*@`$````"0$``4P@2@+("@8``B2``=R`2@#*$N
+M8`(3```$DA)@P)($``F3,F``%3_\`)0H0`H#``0`E!*``94RH`!`````D!``
+M%,($H`R""&`@@*!@`")(``S(!*`,H`0IP*$T(`"0$``40````)(0`!"4$B(`
+MD!``%$````"2$``0R`2@#`,``$"`B0`!(D@`$<@$H`RA+F`"`P``!((080"@
+M!``!H30@`)`0`!1`````DA``$`,`"`"4$@`!E3*@`)`0`!1`````DA``$,@$
+MH`P#`"``@(D``2)(``_"!*`$H2Y@`@,```2"$&$`H`0``:$T(`"0$``40```
+M`)(0`!"4$B(`D!``%$````"2$``0P@2@!("@8`("0``&@*!@`R)``!FC+F`"
+M$&@`/\($H#BA+F`"H`0IP*$T(`"0$``40````)(0`!"4$B"BD!``%$````"2
+M$``0"0`)0,(%(WR`H&`#`P!)0(EE``&3+F`"`P``!((080"2`D`!$&@`)I,R
+M8`"@!&G`H30@`)`0`!1`````DA``$)02(F*0$``40````)(0`!`#````R`!@
+M``,```#"`&``B"$``8(0(PF#*'`$P@3``8@@0`0#````P@!@`(@A``&)*2`*
+MH@1I`*,T8``5`$``E!$`"I4RH`"0$``40````)(0`!$)``$`P@4C?("@8`,#
+M`$$`B64``9(0`!"5,2``0````)`0`!3"!*`X@@A@`8"@8``B2``1P@2@#*$N
+M8`(#```$@A!A`*`$``&A-"``D!``%$````"2$``0`P`)`)02``&5,J``D!``
+M%$````"2$``0P@2@#(((8`&`H&```D@`"((0(!>#*'`)B!`@`8DI`!G*!,`!
+M$&@`!X@1``6#*'`)B!`@`8DI`!G*!,`!B"E`!,@DP`'"!*`,@@A@`8"@8``"
+M2``(@A`K@8,H<`*($"`!B2D`&<H$P`$0:``'B!$`!8,H<`*($"`!B2D`&<H$
+MP`&(*4`$R"3``<($H`R""&`"@*!@``)(``B"$"7!@RAP`X@0(`&)*0`9R@3`
+M`1!H``>($0`%@RAP`X@0(`&)*0`9R@3``8@I0`3(),`!P@2@#(((8`2`H&``
+M`D@`"((0*X.#*'`"B!`@`8DI`!G*!,`!$&@`!X@1``6#*'`"B!`@`8DI`!G*
+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
+M#C`'0````)4RL`J0$``8$P`0(9,R<`A`````E!`@``$```"!S^`(`0```)WC
+MOT"0$``8DA`IC9,J<`24$"X+0````)0"@`J@$"``HA`A,9`0`!B3+'`'0```
+M`!4``$"@!"`!@*0@!P1/__N0$``80````!,``">#,B`8B3!@!(((8`^#*&`$
+M@A$``9$P8`!`````DA`@"(''X`B1Z``(G>.^P*`0`!B"$#_)PB>GS\(GI]/"
+M)Z?7PB>GVX(0/\+")Z??@A`_\L(GIZ_")Z>SPB>GM\(GI[N"$#_TPB>GOX(0
+M/\#")Z>/PB>GD\(GIY?")Z>;@A`_NL(GIY^"$#^RPB>G;\(GIW/")Z=WPB>G
+M>X(0/[#")Z=_F!`@`((0(D&1*'`%G@>G[X(0)(.3*'`$@A`DA94H<`2"$")#
+MERAP!8,[(`"#*'`"B@!`$)H!0`B"`$`/R`!_X,@C8`B:`4`)R`!_P,@C8`S(
+M`'^@R"%`"HH!0`O"`'^`F`,@`8"C(`0$3__PPB%@!)`0`!A`````DA`@`0$`
+M``"!S^`(`0```)("0`F2`D`*D@)`"9("0`B"$""]@RAP!9("0`&!P^`(T!)@
+M%IWCOT"0$``8$P```)(28`"4$"*%0````)4JL`/T=B`0]G8@&/AV("#R-B-X
+MP#8C>H(0(#_"-B.LP"8CL((0+&N#*'`"P"8``8(0(QN#*'`$P"8``0D"``""
+M$"QO@RAP`L@F``&($">!@A`L<8,H<`+()@`!@A`L<X,H<`+`)@`!"0`/SX@1
+M(S^"$",=@RAP!,@F``&($"!D@A`L=8,H<`+()@`!B!`@`H(0)CN#*'`#R"8`
+M`8@0/_^"$",?@RAP!,@F``&"$"Q]@RAP`L@F``&"$"8_@RAP`\@F``&0$"N!
+MD2HP`I`&``@3````DA)@`$````"4$"`&@A`L?X,H<`+`+@`!@<_@"`$```"*
+M$"```P```)@08`"#.6``B`!``8@!``'""P`$@*!`"#)(``V*`6`!B`$`#,()
+M(`&:"F#_@*!`#3A(``>*`6`!P@D@`H"C0`$(0``'B!`@`8H!8`&`H6`#"$__
+M[H,Y8`"($"``@</@")`0``2=X[\PD!`I%4````"1*C`#HA``"`+"`?""$"`"
+MDRXP,),R<#"4$``9EA``&I@0`!M`````FA``'+`0`!&0$``1DA`@`$````"4
+M$"`!`L(`%)`0`!&2$"(!0````),J<`60"B#_@S(@!,(D8WR""B`/PC1C@-`,
+M8W]____'T@QC@0+*`<Z"$"`-D!``$4````"2$"``"LH`!)`0`!$0:`''@A`@
+M`Q,`$P-`````DS)P!]`T8X+"!&-\@*!@"0)```B`H&`*$D@`"`$```#"%&.`
+M@*!@`QA(``0!````?__^SY`0`!A`````D!``&`+"`;."$"`.P@8C?("@8`0(
+M2``,D!``&*`0)`%`````DRPP!`,```24$@`!E3*@`)`0`!A`````DRPP!)`0
+M`!@3```F0````)00(`=`````D!``&-`V(X20"B#P@*(@,")``#O"!B-\%$@`
+M!X"B(&"`HB`0`D``-8"B("`0:``'`0````)``#&`HB!@-$@``X"B(*"`HB!0
+M(D``+<(&(WS"%B.$@*!@`!)(`"G"!B-\@*!@!1)(``Z(&&`'PEXC@(@0/_^)
+M*3`@@@A`!`D)`$.)*3`6@*!`!#)H``3"!B-\$&@`&8(0($:(&&`'@*``!(A@
+M/_^"&&`+@*```8)@/_^`D0`!(D@`!,(&(WP0:``.@A`@48"@8`H"0``*@*!@
+M"0)```B`H&`*,D@`"<(&(WS"%B.`@*!@`SA(``7"!B-\@A`@8L(V(X3"!B-\
+M@*!@"@)``!2`H&`)`D``$H"@8`HR2``'R!8CA,(6(X"`H&`#"$@`#9`0`!C(
+M%B.$@@D@\((`?]"`H&`_&$@`!Y`0`!B""2`/@*!@!`1``4V"$"`-D!``&)(0
+M(,%`````E`>G[0+"`4;(%Z?M`P``#((08`&`H0`!&$@`!,@7I^T0:`%`@A`@
+M!8(0(H6#*'`#R#1``9`0`!B2$"0!0````),J<`20"B`8D3(@`X"B(`("0``0
+M@*(@`P)``3*"$"`*P@8C?("@8`D"0``*@*!@"A)(`2R"$"`*PA8C@("@8`,H
+M2``%D!``&!!H`2:"$"`*D!``&)(0(#]`````E`>G[0+*`2""$"`(PA>G[8@0
+M*A6(`0`$PC1`!)`0`!B2$"`<0````)0'I^T"P@$5R!>G[8"A(``"2``.MA`C
+M0`,``#^"$&/PM@D``;<NX`R0$``8DA`@&T````"4!Z?M`L(!",(7I^VV%L`!
+MM@;_0+00(`"`IH`;&D@`#:`0(`"2!"#`DS)@`)`0`!A`````E`>G[0+"`/O"
+M%Z?MH`0@`8"D`!L*3__WM!Z``0,``#^"$&/_@*:``1)(`/."$"`'B!`@"H(0
+M*L^"`$`!R#1``8@0(`."$"+U@RAP`\@T0`&@$"``@A`A69LH<`2*$"`+B30@
+M`((!``2"`$`$@RAP`H(`0`2#*'`"@@!`$8(`0`V@!"`!@*0@"0A/__;*,&`6
+MH!`@`((0(+V?*'`%`P```)(08``#````D!!@`((0(865*'`$F!`@"X(0(%^7
+M*'`&FS0@`((#0`V(`$`1B`$`#\H20`'*,2`0RA(``<HQ(`J"`$`-@RAP`H(`
+M0`V#*'`"@@!`$8@`0`K8,2`<@@!`"Z`$(`&`I"`""$__[M@P8!"2$"*%DRIP
+M`Y($0`E`````D!``&`+"`+."$"*%@RAP`\@40`$#```4@A!@`H"A``$82``>
+M@A`J(<(&(WR`H&`*`D``"H"@8`D"0``(@*!@"A)(`!:"$"HAPA8C@("@8`,8
+M2``2@A`J(8@0)FB"$"+W@RAP`\@T0`&($"2P@A`E[X,H<`+(-$`!"3__X((0
+M(%^#*'`&R#1``8(0*]N"`$`!R#1``8(0*B&"`$`!PA1``8"@8``"0``=D!``
+M&,(6(X2""&#P@*!@$!)(`!F2$""_D!``&!,``"85`$`'0````)4RL`I`````
+MD!`GT$````"0$``8T#8CAI`0`!@3```F0````)00(`=`````D!`GT,(6(X:"
+M"&#P@*!@(!)(`'*"$"`-D!``&)(0(+]`````E`>G[0+*`&R"$"`(PA>G[8@0
+M)0N)*3`"PC1`!,(V([A`````D!``&`+"`&."$"`(P@8C?("@8`HB0``-D!``
+M&("@8`DB0``*D!``&("@8`H22``,B!A@!\(6(X"`H&`#.$@`!\(&(WR0$``8
+M0````)('I^<0:``<@*(@`(@88`>`H``$B&`__X(88`N`H``!@F`__X"1``$B
+M2``'PA8CA)`0`!A`````D@>GYQ!H``Z`HB``@@A@\((`?]"`H&`_&$@`!I`0
+M`!A`````D@>GYQ!H``6`HB``0````)('I^>`HB```D@`-8(0(NN#*'`$PEQ`
+M`<)V(VA`````D!``&+00(`"@$"``@A`BW[<H<`22$"`?DB)`$),R8`"0$``8
+M0````)0'I^T"P@`BRA>G[8LI8!"#,6`0M`:``8($`!"),&``B`$`$8@!`!N+
+M,6`8RBD@"((`8`&#,&``@@!`$8(`0!O(#Z?NH`0@`8"D(`((3__HR"A@"("@
+M`!J"8#__"0``OX@1(_V('H`$@*``!(A@/_^`D$`$$D@`!X(0(`E___UPD!``
+M&!!H``R0$``8@A`@",(GI^<"Q$`$`0```$````"0$``1`L<``\('I^?")P``
+MD!`@`(''X`B1Z``(G>._0$````"0$``8@A`ESX,H<`/"7@`!`LA`!`$```"?
+MP$``D!``&$````"0$``8D!``&)(0(`%`````E!`@`9(0(H63*G`#D@8`"4``
+M``"0$``80````)`0`!@!````@<_@"`$```"=X[\0IA``&`,``"#")Z??`P``
+M)H(08"#")Z?C`Q5558(0857")Z>_`RJJJH(08JK")Z?#`QF9F8(08F;")Z?'
+M`R9F9H(089G")Z?+K!`@`*X'I^^A/:``H2PP`J`$`!?H!#_PDS4@`$````"0
+M$``3T"0_X*(0(`"E-2``@RQ@$*`00!&5-"``D!``$T````"2$``2D!``$T``
+M``"2$``2@*0`"!)``"FP$"``H@1@`8"D8/\$3__S@RQ@$*(0(`"J!Z?OI34@
+M`(,\8`"#*'`"@@!`%>``?]"5-"``D!``$T````"2$``2D!``$T````"2$``2
+M@*0`"!)``!2P$"``H@1@`8"D8`,$3__Q@SQ@`(,]H`"#*'`"@@!`%](`?_#4
+M`'_@0````)`0`!.L!:`!@*6@`01/_\FA/:``0````)`0(&2P$"`!@<_@"`$`
+M``""$``)D@IA`("B8``B2``(@@A@@`,```2"$&,SPC*```,```40:``1@A!C
+MU("@8``B2``0D!`@`((0(%&#*'`&R%H``0,___^"$&/_@RAP$(@)``$BR0`'
+MD!`@`((0*0C",H``@A`JK,(RP`"0$"`!@</@"`$```"=X[\PHA``&*80`!BD
+M$``8P#>G[8(0(H6#*'`#R!8``0,``!2`H0`!"$@`":`&(Y#"7B,HD!``&)(0
+M(,F?P$``E`>G[0+*`6NP$"``PA1CA(((8/"`H&!`$D@`!L(7I^V"$"H?@@!`
+M`<`TP`'"%Z?M@*!@`#)(`!3"!*.,P@1C?("@8`<R2``0P@2CC,(48X"`H&`(
+M,D@`#,($HXR"$"`%PC>G[8@0(`&"$"H7@@!``<@TP`&"$"%#@RAP!,@TP`'"
+M!*.,@*!@!@)``!4#```<R!2C>H(08&6`H0`!,D@`$<`D(`3(%*.X@@$_G(,H
+M8!"#,&`0@*!@`3A(``3"%*.X$&@`!H(!(`6`H&!!,D@`!<`D(`2"$"!#PC2C
+MN,`D(`2"$"H?@@!``<(4P`&`H&```D@`#8(0*B&"$"`!PB0@!((0*A>"`$`!
+MPA3``8"@8``22``%@A`J(8(0(`/")"`$@A`J(8(`0`'"%,`!@*!@``)(``:"
+M$"41P@0@!((08`3")"`$@A`E$8,H<`+"%,`!@*!@``)(`!*"$"D(PA2C>H"@
+M;A$"0``.@A`I",@$(`2"$2`(PB0@!((0(4.#*'`$PA3``8"@8``22``%@A`I
+M"((1("C")"`$@A`I",(T(!#"%&.$@@A@\((`?]"`H&`_"$@`&((0*<3*!&-\
+M@AE@!X"@``&(8#__@AE@"X"@``&"8#__@)$``3)(``Z"$"G$@*%@"@)```J`
+MH6`)`D``"("A8`H22``'@A`JK,(48X"`H&`#.$@``X(0*JR"$"G$PC0@$@,`
+M``2"$&,SPC0@#`,```6"$&/4PC0@#L@$```#``"`@BD``0D``$""$$`$PB0`
+M`,(7I^V""&`"@*!@`!)(``Z*$"``P@1C?("@8`4X2``*BA`@`8"@8`422``(
+MBRE@$L(48X"`H&`#*$@`!<@$``"*$"`!BRE@$L@$```#``$`@BD``8(00`4+
+M``@`BBA`!0,`!`"*$4`!PA>G[8,P<`&"&&`!@@A@`8,H8!8)`!``B"E`!(@1
+M``'()```P@1C?("@8`8H2``%R`0```,``@`0:``$@A$``0,``@""*0`!PB0`
+M`,($```)(```@A!`!`D0``""$$`$PB0``,(4HX"`H&`!&$@`!\(7I^W"!&-\
+M@*!@"S)(`"S(!```PA>G[8((8`&`H&``$D@`!8@0(`#"!"`$@(A@"8EF8`&)
+M*2`=P@0```L(``"**$`%BA%`!,(7I^V#*&`0FS!@$(,P8!."&&`!@@A@`8,H
+M8!P)!```B"E`!(@1``'()```F@M@!("C8``22``%BA`@`,($(`2`B&`)BV9@
+M`8LI8!O(!````P(``((I``&"$$`%"0$``((00`0)`$``@A!`!,(D``#(!```
+M`P"``((I``'")```@A`A3X,H<`3"!,`!@*!@``)(``B*$"``@A`E/8,H<`+"
+M!,`!@*!@`!)(``2+*6`7BA`@`8LI8!?(!````P`@`((I``&"$$`%"0``(((0
+M0`0)```0@A!`!`D```B"$$`$B`$P`((00`3")```P@2C?("@8`422``(`0``
+M`,(4HX"`H&`((D``!\($``#"!*-\@*!@!0A(``;"%Z?MP@0``((0:`#")```
+MPA>G[8*(8?`B2``#@A`@"H,X8`3"-"`(R!>G[0,``#R(B0`!(D@`!8(0((")
+M.2`,@A`@`8,H0`3"-"`*PA1CA(((8/""`'_0@*!@/QA(``3"!```$&@``X(0
+M9@"""'G_PB0``((0*AF"`$`!PA3``8"@8``B2``2R@1C?!4```64!(`*PEQC
+M*)`0`!&?P$``DA`@#R+*``K*!&-\@A`@`8@0)0&)*3`"PB2`!,($``""$&$`
+MPB0``,H$8WR`H6`$B!`@`(EE(`&"$""A@RAP!<@D@`&`H6`%$D@`!H@0(`#"
+M%&.`@*!@"2)```>($"`!P@1C?("@8`4(2``$@RD@!X@0(`&#*2`'R`0``(@)
+M/W^($0`!R"0``((0(`_")"`4L!`@`8'/X`@!````G>._,)`0`!A`````D@>G
+MWX'/X`B0$"`!`P```("B8`$"8``$@A!@``,```""$&``@</@",)R(,B=X[\P
+MU`9@!)`0`!@3`!`%0````),R<`?4!F`,D!``&!,`(`M`````DS)P"-0&8!"0
+M$``8DA`H`T````"3*G`$U`9@")`0`!@3`"`-0````),R<`C(!D```P!``(")
+M``$B2``/U`9``)`0`!A`````D@>GWX(0(GV#*'`#PEX``<!P8"B0$``8DA`D
+M`9,J<`5`````%0!``-0&0`"0$``8DA`D`4````"3*G`%`0```('/X`@!````
+MG>._()`0`!CR)Z?3P@8CC("@8`$"0``*B!``&8"@8`$J2``.`P```("@8`8"
+M0``*@*!@"#)(`!."`2`!`P``/X(08__")Z?;`P`!_Q!H``N"$&/_`P```,(`
+M8`""(0`!@RA@`\(GI]L#````P@!@`((A``&#*&`#PB>GWX(!(`'")Z?7`S^?
+MP((N@`'")Z?/0````)('I\\!````@<_@"`$```"=X[]`D!``&!,`$`63,G`'
+M0````)00(`"0$``8(0`@`4````"3-#`(`P`!`((00`@5``P`E"A`"I4RH`"0
+M$``80````),T,`B0$``8DA`D`9,J<`64$#__0````)4RL#`!````@<_@"`$`
+M``"=X[]`PA9@$H"@8``"2``=HA``&)`0`!@A`"`!0````),T,`@#``0`E!(`
+M`94RH`"0$``80````),T,`C4%F`0D!``&!,`(`E`````DS)P"-068!*0$``8
+M$P`0!T````"3,G`'U`9@%)4JH`.5,J``D!``&)(0*`,0:``+DRIP!)`0`!@A
+M`"`!0````),T,`@5``0`E"H`"I4RH`"0$``8DS0P"$`````!````U`9``)`0
+M`!@3`!`%0````),R<`>0$``8DA`D`4````"3*G`%`S_@`)`*``'(!F`(`P``
+M/X(08_^("0`!PA9@&("@8``"2``'D!(`!((`8`2#*&`0"0`?P(((0`20$@`!
+ME3(@`)`0`!B2$"0!0````),J<`6*$"QQBREP`M0$0`4#/__`@A!@_Y0*@`'"
+M%F`:@RA@""$``#^(%",`@@A`!)02@`'4)$`%E3*@`)`0`!@3`!`#0````),R
+M<`?B!F`(H!0C_Z(,0!#"!F`<@*!`$:-G``'F!F`,@*!`$Z=G``&"!F`$@*1`
+M$X-F0!G@`$``U`9@!)0"O_V5*J`#)0`!_Z04H_^4"H`2`P*&`)02@`&5,J``
+MD!``&!,`(#5`````DS)P"*`$/_VA+"`#H`P`$@,"@`"@%``!H30@`)`0`!@3
+M`!`;DS)P!T````"4$``0`P``/X(08_^B#$`!IRS@$*(40!.C-&``D!``&!,`
+M(#>3,G`(0````)00`!$!````@<_@"`$```"=X[]`H!``&)00`!F0$``80```
+M`!,``!B0$``8DA`L`9,J<`-`````E!`@`9`0`!@3`!@#DS)P")00(`-`````
+MEA`@`@+*``BP$"``D!``$!,`&`%`````DS)P"-`V@`"P$"`!@<_@"`$```"=
+MX[]`D!``&"$`$`5`````DS0P"+(&0!F4$"`#E2J`&902@`B5,J``D!``&$``
+M``"3-#`(@<_@")`0(`&=X[]`D!``&"$`$`5`````DS0P"+(&0!F4$"`#E2J`
+M&90J``J5,J``D!``&$````"3-#`(@<_@")`0(`&=X[]`D!``&*`0*`-`````
+MDRPP`Y00(`&5*H`9E"H`"K0.H`&U+H`9E!*`&I4RH`"0$``80````),L,`.!
+MS^`(D!`@`9WCOT"0$``8@A`__X"F8`480``)L3!P(!,`$`=`````DS)P")`*
+M("^1,@`9D`H@`;$R(`"!S^`(`0```)WCOT"0$``8$P`0!4````"3,G`(B`9`
+M&8(0(`.#*$`$"0``?((00`24*@`!LRY@#)02@!D#```@@*:@``)(``24$H`!
+M`P``0)02@`&5,J``D!``&!,`$`5`````DS)P"((0*X.#*'`"T@8``0,`0`"2
+M$D`!DS)@`$````"0$``8`0```('/X`@!````G>._0)`0`!B2$"@!0````),J
+M<`.0&B`!@*``"('/X`B08#__G>._0*80(`"H$``8D!``&$````"2$""``P`@
+M`("(0`@"2``9D!``&$````"2$"",`P!``("*``$#``@`IV9``0,(``"`B@`!
+M`D@`!0,!```#`!``IA3``0,!``"`B@`!`D@`!0,`@``#`"``IA3``0,`@`"(
+M%,`!@(H``:=F0`20$``80````)(0(,"`HC__$D@`!:00``C`)D``$&@`8[`0
+M(``#`$%V@A!@NH@*``$#``(`@(H``0)(``7()D```Q```((1``'")D``@(R@
+M!0)(``6`C*7`P@9``((08`'")D```D@`'8(,H"#"!D``@A!@0,(F0`"0$``8
+M0````)(0(,0A`!(IH30P"(@*(__"!0`0B!$``2,`_\"0"@`1D3(@$)`2``30
+M)0`0D!``&$````"2$"#(B`HC_\(%`!"($0`!D`H`$9$R(!"0$@`$T"4`$((,
+MH""`H&``(D@`#,(&0`""$""A@RAP!<(&``&`H&```D@`!L(&0``)$```@A!`
+M!,(F0`#"!D``@A3``0D0``"`B$`$`D@`(\(F0`""$"*!@RAP`^0F``&0$``8
+M0````)(0(,2"$"4#@RAP`M`F``&0$``80````)(0(,B"$"%!@RAP!-`F``&0
+M$``80````)(0(,R"$"4%@RAP`M`F``&0$``80````)(0(-""$"*#@RAP`]`F
+M``&0$``80````)(0(-2"$"4'@RAP`M`F``&P$"`!@<_@"`$```""$"N#@RAP
+M`H'#X`C0`@`!G>._0((0*X.#*'`"Y`8``8"DH``62``)HA``&)`0`!B2$"`D
+M0````)00(`"0$``80````)(0("0#`$%V@A!@NI0.0`&"#F!`@*!@``)(`!J@
+M$"``@A`KKX,H<`+"!$`!B!*@0("@8`"59D`$@A`@NX,H<`;"!$`!B!*A`("@
+M8`"59D`$@A`KL8,H<`+"!$`!B!*@@("@8`"59D`$@A`EV8,H<`/"!$`!B!*D
+M`("@8`"59D`$@@Y@`8@2H`>`H&``E69`!`,`N`"`CD`!`D@`&P,0```#`"``
+ME!*``0,`"`"`CD`!`D@`!0,`$``#`$``H!0``0,`$`"`CD`!`D@`!0,`(``#
+M"```H!0``0,`(`"`CD`!`D@`!0,`@``#`0``H!0``0,`@`"(%``!@(Y``:%F
+M0`0#$```@(Y``2)(``65,J```P`"`)02@`&5,J``D!``&$````"2$""@D!``
+M&$````"2$""L%2W``)0J``J4$H`0E3*@`)`0`!A`````DA`@K((0*X.#*'`"
+M@*9@`!9(``;R)$`!D!``&)(0("1`````E!`@`;$TH`"!S^`(`0````$`````
+M``````````````````````````````"!P^`(T!(CFIWCOT#"%B.:@*9``1I(
+M``R0$``8DRY@!0,``"*"$&`<D@)``4````"3,F```P``(("(0`@22``#L!`@
+M`;`0(`"!S^`(`0```)WCOT"F$``8J!``&<(6(YJ`H$`9"$@`7;`0(`"A+2`0
+MH30@"S$``"*B%B`4H@0`$:,T8`"0$``30````)(0`!&D$``(D@0`&),R8`"0
+M$``30````)00(`"L%B`$D@0`%I,R8`"0$``30````)00(`"J%B`(D@0`%9,R
+M8`"0$``30````)00(`"R%B`,D@0`&9,R8`"0$``30````)00(`"2%B`0D@0`
+M"9,R8`"0$``30````)00(`"0$``3DA``$4````"4$"`'DA8@&)($``F3,F``
+MD!``$T````"4$"``@A8@'*`$``&A-"``D!``$Y(0`!!`````E!`@`("DH`0R
+M2``BL!`@`8(0+&^#*'`"R`3``0,"``"`B0`!(D@`&[`0(`&@!2!`H2P@$*$T
+M(`N2!``8DS)@`)`0`!-`````E!`@`)($`!:3,F``D!``$T````"4$"``D@0`
+M%9,R8`"0$``30````)00(`"@!``9H30@`)`0`!.2$``00````)00(`"P$"`!
+M@<_@"`$```"=X[]`IA``&*`0`!G"%B.:@*!`&0A(`"JP$"``I!`@``+&@!24
+M$"``Y`Z@!:4LH`C"#J`$I!2``=0.H`.5*J`8P@Z@`H,H8!"4$H`!P@Z@`8,H
+M8`B4$H`!P@Z``)02@`&5,J`!@RR@'Y02@`&E-*`!H2P@$*$T(`LC```BDA1@
+M&)($``F3,F``E3*@`$````"0$``3HA1@'*`$`!&A-"``%0``()04@`J5,J``
+MD!``$T````"2$``0L!`@`8'/X`@!````G>._0*X0`!B*!B.0`RJJJH"G(``2
+M2``#FA!BJIH0(`"#+F`0@S!@$,@18`J`H$`$&D@!09@0(`#"#H``@*!@!1A(
+M`3V#,&``@RAP`@D```"($2``P@$``8'`0``!````$&@`+*P0(`7"`4``@S!@
+M$H((8`&8$"``@*!@`!)(`"6L$"`&$&@!+`$```""$"QO@RAP`L@&``$#`@``
+M@(D``0)(`!RL$"`$@RY@$(,P8!""`&!`R!%@"H"@0`062`$>F!`@`!!H`!3H
+M#J`$PA:@`H"@8`0(2`$8F!`@`,(6H`*`H&`%"$@`"ZP0(`#"%J`"@*!@#:P0
+M(`$0:``&K6<@`Q!H``2L$"`'$&@!"Y@0(`#H#J`$P@Z@!8,H8`BH%0`!P@Z@
+M!H,H8!"H%0`!P@Z@!X,H8!BH%0`!J!T`#<(.H`F#*&`(R`Z@"*H1``&J'4`-
+M"P``/XH18_^J#4`%^`Z@"L(.H`N#*&`(N!<``<(.H`R#*&`0N!<``<(.H`V#
+M*&`8N!<``;@?``W"#J`/@RA@",@.H`ZF$0`!IAS`#>0.H!#"#J`1@RA@"*04
+M@`'"#J`2@RA@$*04@`'"#J`3@RA@&*04@`&D'(`-PA:@`H@,H/^`H&`-I64`
+M!("EH`022`"II@S`!8(0+&^#*'`"R`8``0,"``"`B0`!`D@`HZ$N8!"Z!F!`
+MH30@"R,``"*2!``1DS)@`)0X`!25,J``0````)`0`!B2%&`$D@0`"9,R8`"4
+M.``5E3*@`$````"0$``8DA1@")($``F3,F``E3<@`$````"0$``8DA1@#)($
+M``F3,F``E33@`$````"0$``8DA1@$)($``F3,F``E32@`$````"0$``8HA1@
+M%*`$`!&A-"``D!``&)(0`!!`````E!`@!),N<#"3,G`PD!``&$````"4$``;
+MU`Z@%,(.H!6#*&`(E!*``<(.H!:#*&`0E!*``<(.H!>#*&`8E!*``>8.H!C"
+M#J`9@RA@"*84P`'"#J`:@RA@$*84P`'"#J`;@RA@&*84P`&"$"#'@RAP!L(%
+MP`&""&`$K!`@`+@0(`"`H&```D@`%*X0(`#"#J`?@RA@",@.H!ZN$0`!P@Z@
+M'8,H8`C(#J`<N!$``>P.H"#"#J`A@RA@"*P5@`'"#J`B@RA@$*P5@`'"#J`C
+M@RA@&*P5@`&A+V`0H30@"R,``"*2!``1DS)@`)4RH`!`````D!``&*048`22
+M!``2DS)@`)4UX`!`````D!``&)(48`B2!``)DS)@`)4TX`!`````D!``&)(4
+M8`R2!``)DS)@`)4W(`!`````D!``&)(48!"2!``)DS)@`)4UH`!`````D!``
+M&)(48!22!``)DS)@`)`0`!A`````E!`@!Y(48!B2!``)DS)@`)`0`!A`````
+ME!`@`((48!R@!``!H30@`)`0`!B2$``00````)00(`"A+F`0H30@"Z($`!&C
+M-&``E34@`)`0`!A`````DA``$:`$`!*A-"``E35@`)`0`!A`````DA``$!!H
+M`"^8$"`!H2Y@$*$T(`LC```BD@0`$9,R8`"5-2``0````)`0`!B2%&`$D@0`
+M"9,R8`"5-6``0````)`0`!B2%&`(D@0`"9,R8`"5-R``0````)`0`!B2%&`,
+MD@0`"9,R8`"5-.``0````)`0`!B2%&`0D@0`"9,R8`"5-*``0````)`0`!BB
+M%&`4H`0`$:$T(`"5-:``D!``&$````"2$``0DRYP,),R<#"0$``80````)00
+M`!N8$"`!@<?@")'H``P``````````````````````````````````````0``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````)WCOT"0$``9@A`EOX,H<`.2!@`!0````)00(`8!
+M````@<_@"`$```"=X[]`DA``&8(0);^#*'`#D`8``4````"4$"`&@<_@")`0
+M(`&=X[]`D!``&8(0*X&#*'`"D@8``4````"4$"`&`0```('/X`@!````G>._
+M0)(0`!F@$"N!H2PP`I`&`!!`````E!`@!M0.`!`#`"X%@S!P"L(.``&#*&`(
+ME!*``0,`%P.#,'`)P@X``8,H8!"4$H`!`P`N!X,P<`K"#@`!@RA@&)02@`&5
+M,J``D!``&)(0)`=`````DRIP!0,`+@F#,'`*R`X``8DI(`B"$"7!@RAP`]0.
+M``&4$H`$E3*@`)`0`!@3`"`Y0````),R<`B!S^`(D!`@`<(2([B`H$`)`D``
+M"8@0(`R"$"H5@@!``<(2``&""&"`@*!@`(@0(`N)9&`#`L*``P$```#((H``
+M@</@")`0(`":$``(BA``"((0*A^"`$`!PA-``8"@8``"2``(D!`@`((0*A>"
+M`$`!PA-``8"@8`"0$"!#D69@`8(0*B&"`$`!PA%``8@2(`2`H&``D69`!((0
+M)1&#*'`"PA%``8"@8``"2``,`0```,(38WJ`H&X1`D``"((0(4.0$B`(@RAP
+M!,(10`&($B`@@*!@`)%D0`2!P^`(D3(@`)WCOT`#```%X!8``:(,(!RC/&`"
+MH`P@`J$\(`&E-&``PEXC0)`0`!B?P$``DA``$I`0`!A`````$P``)@,```B4
+M$@`!E3*@`)`0`!A`````$P``)L)>(TB0$``8G\!``)(0`!*`H``0E&`__X"D
+M``B59D`0E3*@`,)>(UB0$``8G\!``)(0`!(!````@<_@"`$```"=X[]`D!``
+M&*`0)`%`````DRPP!`,__'^"$&.?E`H``;(.8`>S+G`"`P```((08`#"`$`9
+ME!*``94RH`"0$``80````),L,`0!````@<_@"`$```"=X[]`DA``&2$`%O^A
+M-#`)D`8`$$````"4$"`&U`X`$`,`+?^#,'`*P@X``8,H8`B4$H`!@A`@%X,H
+M<`G"#@`!@RA@$)02@`$#`"X!@S!P"L(.``&#*&`8E!*``94RH`"0$``8$P`0
+M`4````"3,G`'`P`N`X,P<`K(#@`!B2D@"`,`%P&#,'`)U`X``902@`0#/__P
+M@BZ``8,H8!"4$H`!E3*@`)`0`!@3`"`#0````),R<`@!````@<_@"`$```"=
+MX[]`H!``&)`0`!@E`"`30````),TL`BB$``(D!``&)(0*`5`````DRIP!+`0
+M``B0$``00````),TL`B`H@`1L$``&+$N,""1,B``L!8`"('/X`@!````G>._
+M0)`0`!@3`"`30````),R<`B!Q^`(D>@`")WCOT"0$``8HA`D`4````"3+'`%
+M(0!``*`4``BA-"``D!``&),L<`5`````E!``$)`0`!B3+'`%0````)00`!`!
+M````@<_@"`$```"=X[]`@A`B?8,H<`/"7@`!`L!`,0$```#"$&`"@@A@(("@
+M8``"2``LBA`@`,(&0`"`H4`!&D``$:`0(`":$``!@SE@`((&0`'("&`$PDA@
+M!("@8``62``&B@%@`8@)('^"#"#_@*!`!*%E``2`H4`-"D__]8,Y8`"0$``8
+M,P`@`4````"3-G`(@HP@_P)```J#,&`!@*!@`AA(``@5`(``E!(`"I4RH`"0
+M$``8$&@`"),V<`@5`(``E"H`"I4RH`"0$``8$P`@`9,R<`A``````0````$`
+M``"!S^`(`0```)WCOT"B$``8D!``&!,`)AE`````DS)P"*$R(!.@#"'_@@PA
+M`(@</@"`H&``H69`!)`0`!B2$"@%0````),J<`2P$``(D!``$1,`(!-`````
+MDS)P"+`>``BP'@`0@<_@")$R(`"=X[]`H!``&)`0`!B2$"(!0````),J<`60
+M"B#_B`H@#Y$R(`3"!"-\@*!`"!)(``6P$"``PA0C@("@0`2Q9&`!@<_@")$R
+M(`"=X[]`D!``&)(0*`E`````DRIP!,(&0`""`$`(PB9``)`0`!@3`"`C0```
+M`),R<`C"!F`$@@!`",(F8`20$``8$P`@)4````"3,G`(P@9@#((`0`C")F`,
+MD!``&!,`$!%`````DS)P!\(&8`B"`$`(PB9@")`0`!@3`!`30````),R<`?"
+M!F`0@@!`",(F8!"!S^`(`0```('#X`B0$"`!G>._0)`0`!@3`"<'0````),R
+M<`B0"B#_@<?@")'H``B=X[]`D!``&!,`$`M`````DS)P!Y`*(`>!Q^`(D>@`
+M")WCOT"0$``8E`Y@!Q,`$`M`````DS)P!P$```"!S^`(`0```((0+&N#*'`"
+M@</@"-`"``&=X[]`@A`B?8,H<`/47@`!"LJ`!Y`0`!B"$"QK@RAP`O(F``$0
+M:``$D!`@`4````"3-F``@<?@")'H``B!P^`(D!`@`9WCOT"`IF`%"$@`":`0
+M`!B0$``8DA`__T````"3,G`P@*9`""A```B3-F``B!`__X(0(Q^#*'`$R"0`
+M`1!H``VP$"``0````)`0`!B4$``(D!``&)(0(0=`````DRIP!((0(Q^#*'`$
+M\B8``;`0(`&!S^`(`0```)WCOT"0$``8DA`A!T````"3*G`$`P``/X(08_^2
+M"@`!0````)`0`!B!Q^`(D>@`")WCOT"0$``8H!`__T````"3-#`R@*9`"`A`
+M``:"$"Q]@RAP`N`F``$0:``7L!`@`)`0`!@C`"`%0````),T<`@#/__PH`H`
+M`9,V8`!`````D!``&`,___""*@`!H!0``:$T(`"0$``8DS1P"$````"4$``0
+M@A`L?8,H<`+R)@`!L!`@`8'/X`@!````G>._0)`0`!@3`"`%0````),R<`@3
+M/__PDBH`"9,R8`!`````D!``&(''X`B1Z``(@A`L;X,H<`+0"@`!D!H@`9`*
+M(`&!P^`(D3(@`)WCOT`"SD`1I!``&)`0`!@C`"`!0````),T<`@A/[__H!0C
+M_Y0*`!"0$``80````),T<`B($"QOB2DP`L(&``00:``0@@A`$)`0`!@A`"`!
+M0````),T,`@C`$``E!(`$94RH`"0$``80````),T,`B($"QOB2DP`L(&``2"
+M$$`1PB2`!('/X`B0$"`!G>._0)`0`!B@$#__0````),T,#*`ID`("$``!H(0
+M)C^#*'`#X"8``1!H`!BP$"``D!``&",`(`5`````DS1P""$/_\"@*@`0DS9@
+M`$````"0$``8D2H@$`,/_\"0"@`!H!0`"*$T(`"0$``8DS1P"$````"4$``0
+M@A`F/X,H<`/R)@`!L!`@`8'/X`@!````G>._0)`0`!@3`"`%0````),R<`@#
+M#__`D@H``9,R8!"3,F``0````)`0`!B!Q^`(D>@`")WCOT"@$``8HA``&8"F
+M8'\80``4L!`@#)4L8!"5,J`0D!``$$`````3```!@*``&I1`(`"0$``00```
+M`)(0)`2#+'`P@S!P,((`0!"($"&)B2DP!8(`0`3T*&`(L!`@`('/X`@!````
+MG>._0*`0`!F"$"$_@RAP!("FH``"2`!3\BX``;2.8/\"2`!0@A`B?;,H<`/"
+M7@`9PA!@`H((84"`H&%`$D@`29`0`!A`````DA`@`<)>`!G($&`"`P``$(")
+M``$"2``-@A`B?8DR(`&*3H`$@@%`!8H`0`6*`6$$B$Z`!((!``2"`$`$@@!`
+M`1!H`!ZT`&VL@RAP`\)>``'"4&`"@*!@`!9(``Z*#"#_B3(@`HI)0`2"`4`%
+MB@!`!8H!8-*T#"#_B$Z`!((!``2"`$`$@@!``1!H``RT`&U(B$E`"((!``2*
+M`$`$B@%A:+0,(/^(3H`(@@$`!((`0`2"`$`!M`!N8+(,(/^(3D`(@@$`!+(`
+M0`2R!F/H`S__\+(N0`&5,6``D!``&)(0(0=`````DRIP!)4VH`"0$``8DA`A
+M"T````"3*G`$E2Y@$)02@!F5,J``D!``&!,`(`5`````DS)P"`$```"!S^`(
+M`0```)WCOT"0$``80````-)&(XP!````@<_@"`$```"($``(@*)@!@)@``Z0
+M$"```P`42X,P<`K""0`!@*!@`")(``B1,B``@A`F.X,H<`/"`0`!@*!@`9%E
+M(`&1,B``@</@"`$```"=X[]`DA``&4````"0$``8`LH`>)`0`!B2$"F'DRIP
+M!$````"4$"`?PA8CA(((8/""`'_0@*!@/Y00(!259R`8E3*@`)`0`!@3`!,_
+M0````),R<`>0$``8(0`@!T````"3-#`(`S__\((08'^4"@`!E!*@@)`0`!A`
+M````DS0P")`0`!@3`"!!DS)P"$````"4$"`]D!``&*`0)`%`````DRPP!)02
+M(`*0$``80````),L,`3*!B-\@AE@!X"@``&(8#__@AE@"X"@``&"8#__@)$`
+M`1)```R`H6`*`D``"H"A8`D"0``(@*%@"A)(`"*0$``8PA8C@("@8`,X2``?
+M$P`F'9`0`!@3`"8=DS)P"$````"4$"`FD!``&!,`$P^3,G`'0````)00(`V0
+M$``8DA`IGY,J<`1`````E!`@!Y`0`!@3`"9]DS)P"$````"4$"`_D!``&*`0
+M)`%`````DRPP!!4`P`"4*@`*$&@`'`,`@``3`"8=DS)P"$````"4$"`*D!``
+M&!,`$P^3,G`'0````)00(`R0$``8DA`IGY,J<`1`````E!`@`Y`0`!@3`"9]
+MDS)P"$````"4$"`@D!``&*`0)`%`````DRPP!!4`P`"4*@`*`P#``)02@`&5
+M,J``D!``&!!H`$N3+#`$H!`D`4````"3+#`$%0#``)0J``J5,J``D!``&$``
+M``"3+#`$D!``&$````"3+#`$E`H__94RH`"0$``80````),L,`20$``8DA`I
+MAY,J<`1`````E!`@'Y`0`!@3`"8=DS)P"$````"4$"!_D!``&!,`$P^3,G`'
+M0````)00(`Z0$``8DA`IGY,J<`1`````E!`@#)`0`!@3`"9]DS)P"$````"4
+M$"#_PA8CA(((8/""`'_0@*!@/Y00(`Z59R`2E3*@`)`0`!@3`!,_0````),R
+M<`>0$``8$P`@!T````"3,G`(`S__\((08'^0"@`!R!8CA(@)(/"(`3_0`P``
+M!((08X"`H2`_"$@``Y02``&4$B^`E3*@`)`0`!@3`"`'DS)P"$`````!````
+M`0```('/X`@!````G>._0)(0`!E`````D!``&`+*`%&0$``8H!`D`4````"3
+M+#`$%0#``)0J``J5,J``D!``&$````"3+#`$D!``&$````"3+#`$E`H__94R
+MH`"0$``80````),L,`20$``8$P`@09,R<`A`````E!`@`9`0`!@3`"`'0```
+M`),R<`@#/__P@A!@?Y`*``'(%B.$B`D@\(@!/]`#```$@A!C@("A(#\(2``#
+ME!(``902+X"5,J``D!``&!,`(`=`````DS)P")`0`!B2$"F'DRIP!$````"4
+M$"`?D!``&!,`)AV3,G`(0````)00('^0$``8$P`3#Y,R<`=`````E!`@#I`0
+M`!B2$"F?DRIP!$````"4$"`,D!``&!,`)GV3,G`(0````)00(/_"%B.$@@A@
+M\((`?]"`H&`_E!`@%)5G(!B5,J``D!``&!,`$S]`````DS)P!P$```"!S^`(
+M`0```,(20`"8$``!@RA@$(,P8!`)````R!$@`("@0`080``-BA`@``,```":
+M$&``@RL@$(DP8!"*`6`!@SE@`(,H<`+"$T`!@*$``2A/__R*`6`!@SE@`(,H
+M<`()````B!$@`((`0`2!P^`(T%!@`IWCOT"2$``9FA``&("F8!T80`#(B@8C
+MD(,V8`"#*'`""0```(@1(`#"`0`!@<!```$```"`IJ`"(D``#<(!0``*2`#!
+MD!`@`("FH`0*0``*@*:@!0A(`+R`IJ!_`D``N@$````0:`"XD!`@#1!H`&V#
+M,&`2$&@`M)`0(`V`IJ```D@`L9`0(`"`IJ`!$D@`"("FH`""$"QO@RAP`L(&
+M``$0:`"%@S!@&X"FH``B2``'P@%``("FH`$"2``&@A`@QQ!H`*&0$"`,$&@`
+M?(,P8!.#*'`&P@-``1!H`'B#,&`"P@8C?("@8`4X2`!U@A`@`("@8`422`!R
+M@A`@#<(6(X"`H&`'.$@`;H(0(``0:`!L@A`@#8"FH``"2`"+D!`@`("FH`$2
+M0`!($P`409`0`!A`````DS)P!Y$R(`V0&B`!D`H@`1!H`("1,B``$&@`=L(&
+M(ZB`IJ```D@`>Y`0(`"`IJ`!$D@`>((0+'.#*'`"$&@`#,(&``&`IJ```D@`
+M!X(0*A^`IJ`!`D``"8(0(%$0:`!MD!`@`8(`0`'"%@`!@*```1!H`&B08#__
+M@RAP!LA>``$#/___@A!C_X,H<!"("0`!D!`@`!!H`%^1>20!@*:@``)(`%R0
+M$"``@*:@`1)``!F"$"QO@RAP`L(&``&".``!$&@`,H,P8!^`IJ``(D@`!\(!
+M0`"`IJ`!`D@`"H(0(,<0:`!,D!`@#(,P8`N""&`!@*!@`)`0(``0:`!&D61@
+M#8,H<`;"!@`!$&@`'H,P8`,0:`!`D!`@#((0(QV#*'`$P@8``1!H`#.""&`_
+M@A`C'8,H<`3(!@`!`P``#X(08P"("0`!B3$@"!!H`"O()L``@*:@`0)```F"
+M$",A"D@`+9`0(`"`IJ`&&$``*I`0(`P0:``(`0```(,H<`3"!@`!@AA@`8((
+M8`$0:``BD3!@`$````"0$``8BA``"`+!0!V0$"`!@*:@!CA(`!J0$"``@S:@
+M`(,H<`()````B!$@`,(!``&!P$```0```!!H``G""6`)$&@`!\()8`P0:``%
+MP@E@#1!H``/""6`+P@E@"L(FP``0:``'D!`@`),R8`"5-J``D!``&$````"6
+M$``;@<?@")'H``B=X[]`F!``')(0`!F4$``:FA``&("F8!T80`"5B@8CD(,V
+M8`"#*'`""0```(@1(`#"`0`!@<!```$```"`IN```D@`!H(0+&^#*'`"R`8`
+M`1!H`#\+`@``@RAP`LH&``$0:`!`"0(``,(!0`"#,&`3@@A@`8"@8``"2`""
+MD!`@`("FX``"2``&B!`@QXDI,`;"!@`$$&@`!8((?_N)*3`&P@8`!((08`3"
+M(T`$@A`@QX,H<`;4`T`!D!``&)(0)`F3*G`%0`````$````0:`!MD!`@`9`0
+M`!@3`!1!0````),R<`>`IN```D@`!`,```@0:``#D!(``9`J``&5,B``D!``
+M&!!H`#@3`!1!]B8CJ)4VX`"0$``8$&@`,Q,`$`F`H``;B$`@`((0+',0:``.
+M@RAP`H"FX``"2``'@A`L;X,H<`+(!@`!"R```!!H``:($0`%@RAP`LH&``$)
+M(```B"E`!!!H`$#((T`!@A`L>X,H<`+"5@`!M@;``8"FX$"W9V`_@*9@&A)(
+M``F*$",=B!`C'8DI,`3"!@`$@A;``8((8#\0:``+PB8`!(LI<`3(!@`%`P``
+M#X(08P"("0`!@@[``8,P8`B"$$`$PB8`!8(0(QV#*'`$U`-``9`0`!@3`!`=
+M$&__N),R<`>`IJ`&&$@`))`0(`")-J``B2DP`@,```""$&``T@!`!)4^X`!`
+M````D!``&!!H`!H!````P@%``(,P8`N""&`!@*!@`")(`!"3,F``@*;@``)(
+M``:($"#'B2DP!L(&``00:``%@A!@"(DI,`;"!@`$@@A_]\(C0`00:``'D!`@
+M`9,R8`"5,J``ES;@`$````"0$``8@<?@")'H``B=X[]`D!``&)(0`!F4$``:
+MEA``&Y@0`!Q`````FA``';`0(`"Q>C0!@<_@"`$````!````G>._0("F8``"
+M2``KD!``&"$`$`%`````DS0P"!4``,"4*@`*E3*@`)`0`!A`````DS0P"$``
+M``"0$"`*H!`@*#,`$`$#/_\_HA!C_Y`0`!B2$"0!0````),J<`0#``!`@(A`
+M"`)``!"`I"``0````)`0(#*0$``80````),V<`B4"@`1D!``&$````"3-G`(
+MH(0__Q)/_^^0$``8$&@`$+`0(``22``$D!``&!!H``RP$"``(0`@`4````"3
+M-#`(%0`!`)0J``J5,J``D!``&$````"3-#`(L!`@`8'/X`@!````G>._0)`0
+M`!@A`"`!0````),T,`@#``$`E!(``94RH`"0$``80````),T,`B`IF```D@`
+M#9`0`!@A`!`!0````),T,`@5``#`E"H`"@,``$"4$H`!E3*@`)`0`!A`````
+MDS0P"`$```"!S^`(`0```)WCOT"0$``8(0`@`4````"3-#`(`P`!`)02``&5
+M,J``D!``&$````"3-#`(@*9@``)(``V0$``8(0`0`4````"3-#`(%0``P)0J
+M``H#``"`E!*``94RH`"0$``80````),T,`@!````@<_@"`$```"=X[]`D!``
+M&)(0`!JT$``8@*9@`0)```VP$"`!@*9@`0I```:`IF`"`D``#`$````0:``2
+ML!`@`'___X&3.F``$&@`"K`0``A___^VDSI@`!!H``>"$"8U?___SI,Z8``0
+M:``#@A`F-8(0)C6#*'`#\B:``;$V(`"!S^`(`0```)WCOT"0$``8$P`0`4``
+M``"3,G`(`P``P)`*``&1,B`0D3(@`(''X`B1Z``(G>._0("F8`@"0``ZD!``
+M&("F8`@82``0@*9A`("F8`("0``W`P```!A(``>`IF`$@*9@`0)``!>2$"``
+M$&@`0`$````"0``HDA`@`!!H`#P!`````D``+X"F80`82``'@*9B`("F8"`"
+M0``GDA`@`!!H`#,!`````D``*8"F9``"0``JDA`@`!!H`"T!`````P```+`0
+M8`""$")]@RAP`\):``$"R$`C`0```,@08`(#```0@(D``1)(`!H#````@A`B
+M?8,H<`/"6@`!PE!@`H"@8``62``7`P```!!H`!6P$&```P```!!H`!*P$&``
+M`P```!!H``^P$&``$&@`#;`08``#````$&@`"K`08``#````$&@`![`08``#
+M````$&@`!+`08``#````L!!@`$````"2$``8DA``&(''X`B1Z``)G>._0)`0
+M`!A`````DA`@#(''X`B1Z``(G>._0)`0`!B4$``90````)(0(`P!````@<_@
+M"`$```"=X[]`D!``&)(0(`A`````E!`@!`$```"!S^`(`0```)WCOT"0$``8
+MDA`@"$````"4$"`@D!``&)(0(`B4$"`$0````)80(`"P$"``L7HT`8'/X`@!
+M````G>._0)`0`!@A`!`)0````),T,`>4"C_?E3*@`)`0`!A`````DS0P!T``
+M``"0$``8D!``&$````"2$"`!`0```('/X`@!````G>._0)`0`!@A`!`)0```
+M`),T,`>4$B`@D!``&$````"3-#`'0````)`0`!@!````@<_@"`$```"=X[]`
+ME!``&9`0`!B2$"(!0````),J<`:U-J``D!``&!,`(!&3,G`(0````)00`!H!
+M````@<_@"`$```"=X[]`HA``&("F8#\82``:L!`@`("F8!\(2``,D!``$2$`
+M(!%`````DS0P")00(`&5*H`9E"H`"I4RH`"0$``1$&@`"Y,T,`B@$"(!0```
+M`),L,`:4$"`!E2J`&90J``J5,J``D!``$9,L,`9`````L!`@`8'/X`@!````
+MG>._0*(0`!B`IF`_&$@`&K`0(`"`IF`?"$@`#)`0`!$A`"`10````),T,`B4
+M$"`!E2J`&902@`B5,J``D!``$1!H``N3-#`(H!`B`4````"3+#`&E!`@`94J
+M@!F4$H`(E3*@`)`0`!&3+#`&0````+`0(`&!S^`(`0```)WCOT"@$``8D!``
+M&!,`(`]`````DS)P"+`0``B0$``0$P`@0T````"3,G`(@@H@((@6(@"`H&``
+ML69`!(@6(0`#`("`@(H``;%F0`2!S^`(D3(@`)WCOT"4#F#_D!``&!,`(`]`
+M````DS)P"((.8@"`H&``H!`@`*%F8""R#F$`@*9@``)(``65-"```P"`@*`4
+M``&5-"``D!``&!,`($-`````DS)P"("D(``"2``&D!``&$````"2$"`T$&@`
+M!I02(!!`````DA`@-)0*/^^5,J``D!``&$````"2$"`T`0```('/X`@!````
+MP"I@",`J8`G`*F`*P"I@"X(0(`#"*F`,E`JO_X@0(`#(*F`-BS*@",HJ8`Z6
+M"N`@@*+@``)(`!'4*F`/@@A@_X,H<!B("2#_B2DP$(@1``&""6#_@RAP"((0
+M0`2("J#_B!$``0,```B($0`!@S$@",(J8`[(*F`/P"I@%,`J8!7`*F`6P"I@
+M%\`J8!#`*F`1P"I@$L`J8!.!P^`(D!`@`9WCOT"@$``8P@Y@%X((8`&`H&``
+M`D``EK`0(`_"#N`7@@A@`8"@8``R2``)P@Y@$I`0`!!`````DA`@#("F@`@"
+M0`"+L!`@#\(.8!*#*'`(R`Y@$X(00`2""&__PC=``,@.8!2)*3`8P@Y@%8,H
+M<!""$$`$@RAP(8,P<#'"-V`"P"]@!,@.8!")*3`8P@Y@$8,H<!""$$`$@S!P
+M%(((8/^`H&"`$D@``\(O8`;`+V`&P@Y@%(,H<!C(#F`5B2DP$(@1``'"#F`6
+M@RAP"((00`3(#F`7B!$``8()(0"`H&``(D@`!H(0/_\#```_@A!B`(()``&#
+M,&`)PB]@!\(.8!"#*'`8R`Y@$8DI,!"($0`!P@Y@$H,H<`B"$$`$@S!P#X((
+M8!_"+V`(P@Y@$(,P8`3"+V`)P@Y@$H,P<`2""&`!PB]@"L(.8!2#*'`8R`Y@
+M%8DI,!"($0`!P@Y@%H,H<`B"$$`$R`Y@%X@1``&""2`"@*!@`!)(`#ZP$"``
+M@@D@!("@8``B2``%P@Y@%\(/8`00:``U@A!@`8((8!"`H&``(D@`),(.8!?"
+M#V`$@A!@`L(O8`3"#F`4@RAP&,@.8!6)*3`0B!$``<(.8!:#*'`(@A!`!,@.
+M8!>($0`!`P``/X(08P"("0`!B3$@",@O8`6"$"R%@RAP`L($``&`H``!BF`_
+M_X@9(`6`H``$@D`@`(")0`$B2``6L!`@`)`0`!!`````DA``'1!H`!&P$"``
+M@@A@"("@8``B2``%P@Y@%\(/8`00:``(@A!@"(((8""`H&```D@`!K`0(`#"
+M#V`$@A!@$,(O8`2P$"``@<_@"`$```"=X[\0I!``&*@0`!C"%J`"B2A@$(((
+M80"`H&```D@`!*(0(``0:``%@S$@%\(6H`*#,'`'@AA@`8((8`&`H&``$D@$
+M0X@0(`S"%J`"B2A@$(((8""`H&``(D@`!,(6H`(0:``$@S$@%H,P<`:"&&`!
+M@@A@`8"@8``22`0UB!`@#)`0`!*2$"``0````)00(`$"R@0TL!`@`)`0`!)`
+M````DA``&JP0``@"P@0IB!`@#("F8`8B0``,P">GTQA(``>`IF`(@*9@`3A(
+M!"+"!P``$&@`!<`GI],22`0=B!`@#,`GI].`IN``(D@`#LH$HWR0$``2DA`@
+M14````"3*G`&T">GTY`0`!)`````DA``%I`0`!)`````DA`@`,H$HWR"&6`'
+M@*```8A@/_^"&6`+@*```8)@/_^`D0`!$D@`#H"FX`"`H6`*`D``"H"A8`D"
+M0``(@*%@"A)(`""0$``2PA2C@("@8`,X2``=$P`0"X"FX``B2``9D!``$H(0
+M(GV#*'`#RER``0+)0!20$``2R!:``,(10`"`H0`!`D``#P$```#(%J`"B`DA
+M\,(18`*""&'P@*$``1)(``D3`!`+D!``$D````"2$``:"LH#Y;`0(`&0$``2
+M$P`0"T````"3,G`'NA`@`;MZ%`B0$``2$P`@`4````"3,G`(`P"(`)`*``'0
+M)Z?+D!``$I(0)`%`````DRIP!`,`/X""$&!@D`H``=`GI\^0$``2$P`0!4``
+M``"3,G`(T">GVY`0`!*2$"@#0````),J<`/0)Z?7DS9@`$````"0$``20```
+M`)`0`!*0$``20````)(0`!H"P@.WB!`@`\(6H`*""&'P@*!A0`)``!^N$"`!
+M%$@`$("@:,"`H&#``D``)*X0(`042``'@*!@T("@8*`"0``:B!`@#!!H`Z?"
+M!P```D``&H@0(`P0:`.CP@<```)``!2`H&C`-$@`!("@:4`0:``$@*!A4`)`
+M``:`H&E0`D``!X@0(`P0:`.7P@<``*X0(`$0:``,[B>GQZX0(`(0:``(@A`@
+M`1!H``6N$"`#$&@``ZX0(`2N$"`%@A`@`L(GI\>0$``2$P``)D````"4$"`'
+MH!`@``,```"F$&``L37@`(D\(`""`0`$@@!`!(DH<`/2!,`$@@!``8(`0!B#
+M*'`"U`3``4````"0$``2H@1@`8(,8#^`H&``,D@`!:`$(`%`````D!`@`:`$
+M(`&`I"`8"$__[8D\(`"@$"```P```*808``K/__?L!5C+(,\(`"#*'`#@*;@
+M``)```[2!,`!@A5CX(("0`&`H&`8B!`@`(EG(`&"`D`8@*!@"((0(`"#9R`!
+M@(D``2)(`!&@!"`!DS)@`(,\(`"#*'`#@@!`$]0`8`1`````D!``$J($8`&"
+M#&`_@*!@`#)(``6@!"`!0````)`0(`&@!"`!@*0@PPA/_^"#/"``DS7@`-0'
+MI\>7/&``@A`@78,H<`?"70`!G\!``)`0`!+"%J`"BRA@$(DQ8!`#```0@(D`
+M`1)```2`H6``-D@`!L(4HX*0$``20````)(0`!K"%*."@*!@02A(`$G"%*."
+MD!``$A,`)@N3,G`(%0%0`4````"5,K`)PA:``("@:;022``+@A`J)8(`0`'(
+M#0`!@A`E%8,H<`+"%0`!B"$``8DY(``0:``%B6D@!8(`0`'"#0`!B6A@!<(6
+MH`*""&#0D!``$A,`)E.3,G`(@*!@P!)(`!&4$"``@A`J)8(`0`'4#0`!E"``
+M"I4JH`:4"J_`@RD@$H(@``$)`#\`@@A`!)02@`&5,J``D!``$A,`)E.3,G`(
+M0````"$`%$60$``20````),T,`>4"CW_E3*@`)`0`!)`````DS0P!Y`0`!)`
+M````DS0P!Q4``'^4*@`*E!*H`)4RH`"0$``20````),T,`>0$``2DA`D`Y,J
+M<`5`````E!`@#\(4HX*`H&!""$@`!Y`0`!(3`"B5DS)P"$````"4$"``D!``
+M$A,`$P^3,G`'0````)00(`["!*-\@*!@"@)```J`H&`)`D``"("@8`H22``;
+MD!``$L(4HX"`H&`#&$@`&)(0`!:@$"`!PA:``(@8:9Z`H``$B&`__X(8::.`
+MH``!@F`__X"1``&A9F``D!``$B,`*)-`````DS1P"("D``@"0``%E30@`)`0
+M`!)`````DS1P")`0`!*2$``60````)0'I]\"P@*RB!`@`X"F8`8"0``)E`W@
+M!\($H[2`H&```D@`!H(0)=-`````D!``$I0-X`>"$"73@RAP`\)=``&0$``2
+MDA``%I_`0`"6!Z??`L("GX@0(`/"%J`"@@A@0("@8``B2``AD!``$L($HWR`
+MH&`*`D``$H"@8`D"0``0@*!@"A)(``>"$"*%PA2C@("@8`,H2``+PA:@`H(0
+M(H6#*'`#R!4``0,``!2"$&`"@*$``0A(``J0$``2PA:@`H((8*"`H&"@`D``
+M!)`0`!)`````DA``%I`0`!)`````DA``&I`0`!)`````DA``%@+"`G>($"`#
+M@*;@``)(``B"$"6_U`>GTY`0`!*2$"!%0````),J<`:"$"6_@RAP`]0-``$#
+M`"WY@S!P"L(-``&#*&`(E!*``0,`%OV#,'`)P@T``8,H8!"4$H`!`P`M^X,P
+M<`K"#0`!@RA@&)02@`&5,J``D!``$D`````3```@`P`M_8,P<`K(#0`!B2D@
+M"((0*W^#*'`"U`T``902@`3"!Z?+E!*``8(0+&^#*'`"P@4``902@`$#`"``
+ME!*``94RH`"0$``2$P`@`4````"3,G`(DSY@`$````"0$``2@A`K@8,H<`+4
+M#0`!`P`N!8,P<`K"#0`!@RA@")02@`$#`!<#@S!P"<(-``&#*&`0E!*``0,`
+M+@>#,'`*P@T``8,H8!B4$H`!E3*@`)`0`!*2$"0'0````),J<`4#`"X)@S!P
+M"L@-``&)*2`(@A`EP8,H<`/4#0`!E!*`!)4RH`"0$``2$P`@.4````"3,G`(
+MD!``$J`0)`%`````DRPP!,('I\^4$$`(E3*@`)`0`!)`````DRPP!-0'I]N0
+M$``2$P`0!4````"3,G`(U`>GUY`0`!*2$"@#0````),J<`.5-V``D!``$A,`
+M$`M`````DS)P!P,`%O^#,'`)U`T``0,`+?^#,'`*P@T``8,H8`B4$H`!@A`@
+M%X,H<`G"#0`!@RA@$)02@`$#`"X!@S!P"L(-``&#*&`8E!*``94RH`"0$``2
+M$P`0`4````"3,G`'`P`N`X,P<`K(#0`!B2D@"`,`%P&#,'`)U`T``902@`25
+M,J``D!``$A,`(`-`````DS)P"((0+'&#*'`"U`4``9`0`!(3`!`#0````),R
+M<`>0$``2DA`@@)00/_]`````E3*P()`0`!)`````DA``%@+*`<^($"`#@A`A
+M/X,H<`32#(`!D!``$D````"4$"`!D!``$D````"2$``:PA2CA(((8/""`'_0
+M@*!@/SA(`".0$``2@A`B?8,H<`/"7(`!PA!@`HLH8!"),6`0`P``$(")``$2
+M2``&@A`B?8"A8``62``6D!``$H(0(GV#*'`#PER``<@08`(#```0@(D``:`0
+M(`RA9&`-D!``$B,`)@E`````DS1P")`*/_"@%``(H30@`)`0`!*3-'`(0```
+M`)00`!"0$``2$P`F14````"3,G`(`S__\*`J``'"%J`"@@A@(("@8``"2``&
+M@S0@`(,L(`*#,&``$&@``Z!H8!:@:&`*D!``$A,`)@>3,G`(0````)00(`&"
+M$")]@RAP`\)<@`'($&`"`P``$(")``$20``*D`0`$((0(GV#*'`#PER``<)0
+M8`*`H&``%D@`!)`$(&21+"`"D`(@9$````"1.B``D!``$B$`$P%`````DS0P
+M!Z80``B0$``2DS0P!T`````5```.H!`@`!!H``0C`"<)0````)`0(,B"$``0
+M@*!@$Q1```F@!"`!D!``$D````"3-'`(D`H@$("B(``23__U`0```)4TX`"0
+M$``2$P`3`4````"3,G`'D!``$J`0),-`````DRPP!902(`.0$``20````),L
+M,`7"%J`"@@A@H("@8*`"0``>@A`C&Z,H<`3"!0`1@*!@`@)``!F0$``2H!`D
+MR4````"3+#`%%0``/)0J``H#```\E!*``94RH`"0$``20````),L,`60$``2
+M0````),L,`4#``!`E!(``94RH`"0$``20````),L,`6"$"`!$&@`!<(E`!&"
+M$",;@RAP!,`E``%`````D!``$J`0(`"B$"`!DRP@`I(B<`"3,F``E2Q`$)4R
+MH`!`````D!``$J`$(`&`I"`)!$__^),L(`(#`!(I@S!P",`E``&@$"``PA2C
+MF("D``$62``+@A`K@Y,T(`!`````D!``$J`$(`'"%*.8@*0``09/__N3-"``
+M@A`K@XLH<`(#``("B!!A98"F8`822``%R"4`!0,```2"$0`!PB4`!8(0*X.#
+M*'`"U`4``9`0`!)`````DA`@H)`0`!)`````DA`@K`,``<"4$@`!E3*@`)`0
+M`!)`````DA`@K((0)0&#*'`"P@2``8"@8``B2``%D!``$D````"0$``2D!``
+M$I(0),.3*G`%E!`@`4````"6$"``DS9@`$````"0$``2D!``$J`0)`%`````
+MDRPP!14`8`"4*@`*E3*@`)`0`!)`````DRPP!<($HWR`H&`%&$``"9`0`!(2
+M2``4$P`0(<(4HX"`H&`'"$@`$9,R<`>0$``2$P`0(Y,R<`<5`(!50````)4R
+ML`F0$``2$P`@1Y,R<`B4$",A0````)4JL`20$``2$P`0(9,R<`=`````E!`@
+M4L(6H`*""&$`@*!@`")(``4#`!1'@A`J(Q!H``."`$`!@S!P"M0-``&5*J`8
+ME3J@&)4RH`"0$``20````)(0`!J"$",=@RAP!,(%``&4"&`_@A`L>X,H<`+"
+M50`!BB*``<A-H`:"`0`!@*%`!)5G``'(3:`%B`$`!(,J(!B#.&`8B"$``8"B
+M@`0(2``'@A`C'8(0+'N#*'`"PE4``90!``&"$",=@RAP!,@%``$#```/@A!C
+M`)@)``&9,R`(@A`L>X,H<`+"50`!BB,``<A-H`:"`0`!@*%`!)EG``'(3:`%
+MB`$`!(,J(!B#.&`8B"$``8"C``0(2``'@A`C'8(0+'N#*'`"PE4``9@!``&"
+M$",=@RAP!,@%``$#``_`F@D``9LS8!""$"Q[@RAP`L)5``&*(T`!R$V@!H(!
+M``&`H4`$FV<``<A-H`6(`0`$@RH@&(,X8!B((0`!@*-`!`A(``:`HJ!`@A`L
+M>X,H<`+"50`!F@$``95G8#^`HR!`F6=@/X"C8$";9V`_E`J@/XDK(`@#```/
+M@A!C`(@)``&4$H`$@RM@$`D`#\"""$`$E!*``94RH`"0$``2$P`0'4````"3
+M,G`'@A`@QX,H<`;4!0`!@**@``)(``B"$",?E3*@`)`0`!*2$"0)0````),J
+M<`6"$",?@RAP!-(%``&`HG__`D``!),R8`!`````D!``$H(0+'V#*'`"T@4`
+M`8"B?_\"0``$DS)@`$````"0$``2@A`F/X,H<`/2!0`!@*)__P)```23,F``
+M0````)`0`!+4!*.H@**@``)(``B`IN``E3*@`)`0`!(3`!`)0````),R<`>`
+MIN```D@`'O(DHXS(#:`$@@D@`H"@8``R2``%PA6@`H()/_["+:`$PA6@`L(V
+MH`+"#:`$PBZ@!,(-H`7"+J`%P@V@!L(NH`;"#:`'PBZ@!X(0(GV#*'`#R%R`
+M`<!Q(##@7(`!0````)`0`!+0="`HD!``$D````"2$"`!$&@`![`0(`'"!P``
+M@*!@`#)(``+()P``L!`@`('/X`@!````G>._0.(&([2"#&`#@*!@``)(`!""
+MC&`,D!``&"$`)E%`````DS0P"!4(``"4*@`*@@Q@`8,H8!V4$H`!E3*@`)`0
+M`!A`````DS0P"(*,8`P"2``3@S!@`H((8`&`H&``$D@`")`0`!B@$"@-0```
+M`),L,`24"C_C$&@`!I4RH`"@$"@-0````),L,`24$B`<D!``&$````"3+#`$
+M`0```('/X`@!````G>._0)`0`!B"$"+I@RAP!,)>``&?P$``DA``&;`0(`"Q
+M>C0!@<_@"`$```"=X[\PHA`@`:80`!B0$``80````)(0`!F@$"``PA8CF("D
+M``$:2``,I!``"),T(`!`````D!``&"K"``>B$"``H`0@`<(6(YB`I``!"D__
+M^9,T(`"`I&```D@`@X(0(`"0$``8$P`F7Y,R<`A`````E!`@`:`0(`"B$"3A
+MD!``&$````"3+'`%"L(`"H"D(&-`````D!`@!:`$(`&`I"!C*$__^)`0`!@0
+M:`!O@A`@``A```20$``8$&@`:X(0(`!`````DA``$@+*`&>"$"``D!``&!,`
+M)D5`````DS)P"`,___"**@`!R!2@`H@)(""#*6`"@S!@`("A(``22``$@FA@
+M%H,Q8`"":&`*D`!@9$````"1.B``D!``&)(0`!)`````E`>GWP+*`$^"$"``
+MD!``&!,`)E^3,G`(0````)00(`#"%*`"@@A@0("@8``"2``AD!``&,(&(WR`
+MH&`*`D``$H"@8`D"0``0@*!@"A)(``>"$"*%PA8C@("@8`,H2``+PA9@`H(0
+M(H6#*'`#R!3``0,``!2"$&`"@*$``0A(``J0$``8PA9@`H((8*"`H&"@`D``
+M!)`0`!A`````DA``$I`0`!A`````DA``&9`0`!B@$"3#0````),L,`64$B`"
+MD!``&$````"3+#`%R`R@!(()(`*`H&``,D@`!<(4H`*""3_^PBR@!,(4H`+"
+M-F`"P@R@!,(N8`3"#*`%PBY@!<(,H`;"+F`&P@R@!\(N8`>"$")]@RAP`\A>
+M``'`<2`PX%X``4````"0$``8T'0@*)`0`!A`````DA`@`8(0(`&!S^`(D!``
+M`9WCOT"0$``8$P`@`4````"3,G`(`P``P("F8`$"0``J@BH``8"F8`$42``'
+M@*9@!H"F8``"0``7%00`@!!H`"H!`````D``!H"F8`@"0``?%00``!!H`"0!
+M````%00`0)000`J5,J``D!``&!,`(`%`````DS)P")`0`!A`````DA`@%)0*
+M/]\0:``,E3*@`)000`J5,J``D!``&!,`(`%`````DS)P")`0`!A`````DA`@
+M%)02(""0$``8$&@`")(0(!05!```E!!`"I4RH`"0$``8$P`@`9,R<`A`````
+M`0````$```"!S^`(`0```)WCOT"0$``80``!O)(0(`*!Q^`(D>@`")WCOT"@
+M$``8D!``&)(0(`!`````E!`@`0+*``:P$"``D!``$$```:^2$"`3L!``"('/
+MX`@!````G>._0*`0`!B0$``80``!IY(0(!,"R@"LL!`@`)`0`!"2$"``0```
+M`)00(`$"R@"FL!`@`)`0`!!```&<DA`@``+*`*&P$"``(L9`G[`0(`'"!"-\
+M@*!@"@)```J`H&`)`D``"("@8`HR2``1PA0CA,(4(X"`H&`#.$@`#<(4(X3(
+M%F`"@@D@(("@8``22``?IA`@"(()(-"`H&#`$D@`.:00(`00:``WI!`@ZX((
+M8/""`'_0@*!@/RA(``S(%F`"P@0C?(@88`>`H``$B&`__X(88`N`H``!@F`_
+M_X"1``$"2``5R!9@`H()(""`H&``$D@`!J80(`B""2#0@*!@P#)(``3(%F`"
+M$&@`':00(.L#```0@(D``1)(`!FD$"'JPE9@`H"@8`"D$"+J$&@`%*5FX.J"
+M"2`@@*!@`!)(``:F$"``@@D@T("@8,`R2``$R!9@`A!H``JD$""K`P``$(")
+M``$22``&I!`AJL)68`*`H&``I!`BJJ5FX*K(%F`"@@D@0("@8``B2``,PA9@
+M`H()(""`H&``,D@`#*84X`2""2#0@*!@P#)(``3"%F`"$&@`!J84X`2""&!`
+MB!3@`8"@8`"G9$`$PA9@`H((80"(%.`"@*!@`*=D0`3"%F`"@@A@$("@8`"B
+M$"`#HV1@`)`0`!`3`"8?0````),R<`CR%F`"@@Y@(("@8``20``&L!``"((.
+M8-"`H&#`$D@`%X"B`!*5-&``D!``$!,`)@%`````DS)P")4TX`"0$``0DA`@
+M44````"3*G`)@*8`$@)``!R5-*``D!``$!,`)A]`````DS)P"$````"0$"$L
+M$&@`%;`0(`$"0``(E32@`)`0`!`3`"8?0````),R<`A`````D!`A+)4T8`"0
+M$``0$P`F`4````"3,G`(E33@`)`0`!"2$"!10````),J<`FP$"`!@<_@"`$`
+M``"=X[]`IA``&*@0`!C`)H``D!``&$````"2$``9HA``"`+"`.VP$"``@A`C
+M&X,H<`3(!,`!@AD@`H"@``&*8#__@*``!()@/_^`D4`!`D@`!8(0(QN"$"`!
+MPB:``((0(QNE*'`$X`4`$H"D(`$R2`!YPA9@`I`0`!.2$"3)0````),J<`4#
+M``!`@(H``3)(`''"%F`"P"4`$N`F@`"T$"``JA`DR9`0`!.2$"G!0````),J
+M<`2D$``(D!``$Q,`)P5`````DS)P"*`0``B0$``3$P`3@T````"3,G`'@*``
+M$HA`(`"`H``0@D`@`(")``$20``/L!``")`0`!-`````DRUP!0,``$"4$@`!
+ME3*@`)`0`!-`````DRUP!;0&H`&`IJ`)!$__X9`0`!.#-*`!B30@`8(`0`2+
+M,&`'D30@!X"@``6(0"``@*(@`8(0(`"#9J`!@(D``2)(`&*0$``3@B``&(,H
+M8!BU.&`8B3Z@`(,Y8`"U:0`!@*:_X!9(``2`IJ`@$&@``[00/^"U9N`?@S2@
+M`(DR(`"":$`$I`!_@("DO_`62``$@*2@$!!H``.D$#_PI6;@#Y`0`!.@$"3)
+M0````),L,`64"C@?@RZ@!8((9^"4$H`!E3*@`)`0`!-`````DRPP!9`0`!-`
+M````DRPP!90*/^""#*`?E!*``94RH`"0$``30````),L,`60$``30````),L
+M,`64$B@`D!``$T````"3+#`%B!`@`H(0(QN#*'`$R"4``8(0(`'")&`0]"Q@
+M%!!H`"7D+&`5@@A@H("@8*`"0``A@A`C&Z4H<`3"!0`2@*!@`A)(`!V0$``3
+MP@1@$("@8``22``9`0```*`0),E`````DRPP!14``#R4*@`*`P``/)02@`&5
+M,J``D!``$T````"3+#`%D!``$T````"3+#`%`P``0)02``&5,J``D!``$T``
+M``"3+#`%@A`@`<(E`!*0$``30````)(0`!'"%&`"@@A@`H"@8``R2``RPA9@
+M`I`0`!.@$"3#0````),L,`64$B`"D!``$T````"3+#`%TA9@`H(*80"`H&``
+M,D@`#<H$XWS"%..$@@A@\((`?]"`H&`_&$@`);`0(`&""F!`@*!@``)(`"$!
+M````R@3C?((98`>`H``!B$`@`((98`N`H``!@D`@`(")``$B2``7L!`@`8"A
+M8`H"0``3@*%@"0)``!&`H6`*$D@`!@$```#"%..`@*!@`RA(``RP$"`!0``*
+MA9`0`!,0:``(L!`@`8(08`+"-F`"PA1@`H((?_W"-&`"L!`@`8'/X`@!````
+MG>._,*`0`!FS?F?_\B>GZ\(&(WR`H&`)`D``"("@8`H22``(D!``&,(6(X"`
+MH&`#&$@`!`$```"@##_OD!``&$````"2$"`,E30@`)`0`!A`````$P``$$``
+M``"0$"`/P@>GZX((8`/")Z?KH`P@`Y4P8`"7-"``D!``&$`````3```0@@P@
+M`8"@8``22``;LA``"((0(!2"$&`!PB>GZ]0/I^O"#Z?L@RA@")02@`'"#Z?M
+M@RA@$)02@`'"#Z?N@RA@&)02@`&5,J``D!``&$````"2$"`4D!``&)(0(`!`
+M````E!`@`0+*``20$``80````)(0(,"!S^`(D3)@`)WCOT"0$``8$P`F&4``
+M``"3,G`(D3(@$Y`*(?^P$``(@@HA`)`2/@"`H&``D61`&+$J(!"Q/B`0@<_@
+M")$Z(`#"$F`"@@AAX("@8,`B0``0@A`BD11(``>`H&%`@*!@H`)```F"$"I#
+M$&@`#9`0(``R2``+D!`@`((0)2$0:``%@RAP`A!H``."`$`!@RAP`\(2``'"
+M,H``D!`@`8'#X`@!````G>._,)`0`!B2$"3#0````),J<`60"B`"@*(@`!)(
+M`!:@$"``0````)`0`!B@$``(D!``&)(0`!E____9E`>G[2+*``R@$"``@RP@
+M$(,X8!#(5Z?M@*!`!"1(``?@-F`6PA9@`H(08`+"-F`"H!`@`.`V8!:Q+"`0
+ML3X@$('/X`B1.B``G>._0,)>(Y"#,'`]@@A@`8"@8``"2``LI!``&)`0`!B2
+M$"0@0````)00(`&0$``8DA`F`$````"4$"``D!``&$````"2$"8`E!(@")`0
+M`!A`````DA`F`)`0`!B2$"8$%1`"`4````"5,K`*D!``&)(0)B!`````E!`@
+M`*`0(`""$"&)HRAP!94T(`"0$``80````!,```&#/"``@@!`$H(`0!'4"&`(
+MD!``&$````"2$"0$H`0@`8"D('\$3__TE30@`('/X`@!````G>._0)(0`!F0
+M$"``F@:__YLS8`.T!K__M`Z@!X"F8``$0``=F!`@`)80(`&W+N`#B@:`&8"A
+M8`F+9V`(@RK`!8(`?_^)*L`:B`$__X(80`2#*$`;B3-@`(DI,`+(!@`$@@A`
+M!(,P0!N#,$`:@RA`#)`2``&*(4`:F`,`!8(&0!JR`'_XM!`@`("F8``43__I
+MF@-@`9$R(`!`````DS)@`(''X`B1Z``(G>._0,(6H`*""&'@@*!@P`)```ZD
+M$``8@*!@P!1(``>`H&%`@*!@H`)```F($"`!$&@`;;`0(``"0``%B!`@`!!H
+M`&FP$"``B!`@`HDY(`"(`0`$B`$`$H(0*DN"`$`!@@$``>(08`R"$"4G@RAP
+M`H(!``'"$&`,@RA@!J(40`&"$"I1@@!``8(!``'"$&`,@RA@#*(40`&"$"*5
+M@RAP`X(!``'"$&`,@RA@$J(40`&"$"I7@@!``8(!``'"$&`,@RA@&*(40`&"
+M$"4M@RAP`H(!``'T$&`,@A`J78(`0`&"`0`!PA!@#(,H8`:T%H`!@A`@4X,H
+M<`:"`0`!PA!@#(,H8`RT%H`!@A`J8X(`0`&"`0`!PA!@#(,H8!*T%H`!@A`E
+M,X,H<`*(`0`!PA$@#(,H8!B`IF`!`D``"K06@`&`IF`!"D@`"8"F@!&`IF`"
+M(D``!:(0`!H0:``CL!`@`+00`!&`IH`1$D@`")`0`!@A`!1!0````),T,`<5
+M```($&@`!Y0J``HA`!1!0````),T,`<#```(E!(``94RH`"0$``80````),T
+M,`>"$"QK@RAP`O(D@`&5-&``D!``&)(0),M`````DRIP!94VH`"0$``8$P`F
+M64````"3,G`(L!`@`8'/X`@!````P@(C?("@8`H"0``:@*!@"0)``!B`H&`*
+M$D@`"(@88`?"$B.`@*!@`PA(`!.*$"`HP@(C?(@88`>`H``$B&`__X(88`N`
+MH``!@F`__X"1``$22``)BA`@*,(2(X2""&#P@@!_T("@8#\82``#BA`@((H0
+M("C($D``BS%@`()I``6"2$`%B"$``8"@``200"``B`$_]H"A(`R"$"``@V<@
+M`9`*``&!P^`(D3(@`)WCOT"H$``8PA9@`H,H8!"M,&`7@S!@$(((8?"`H&%`
+M`D``':P-H`&`H&%`%$@`$("@:,"`H&#``D``1;H0(`(42``'@*!@T("@8*`"
+M0`!`NA`@`1!H`8FP$"```D``/+H0(`(0:`&%L!`@``)``#>`H&C`-$@`!("@
+M:4`0:``$@*!A4`)```2`H&E0,D@!>[`0(`#"%B.$@@A@\((`?]"`H&`_"$@`
+M*KH0(`#*!B-\@AE@!X"@``&(0"``@AE@"X"@``&"0"``@(D``0)(`"&0$``8
+M@*%@"@)``!Z`H6`)`D``'("A8`H22``((0`F4<(6(X"`H&`#"$@`%Z(0*9&0
+M$``8(0`F44````"3-#`(E`H_QX(0(M^#*'`$PET``<)00`"#*&`#@@A@.)02
+M@`&5,J``D!``&$````"3-#`($&@`!)`0`!BZ$"`"D!``&*(0*9%`````DRQP
+M!)0*/`:A/V``H`0`$*`$`!2"$"%)@RAP!(($``'"$&`,@RA@!)02@`&4$J`!
+ME3*@`)`0`!A`````DRQP!((0+&N#*'`"T@4``9`0`!A`````E!``&8(0(4>#
+M*'`$H`0``=04(!24$J(`E`JC_Y`0`!@3`!,M0````),R<`>"$"*%@RAP`\@5
+M``$#```3@A!C_X"A``$(2``8B3]@`,(68`*""&`0@*!@``)(`!2"`0`$@SV@
+M`(H`0`&*`4`4B!`A3XDI,`2:`4`$XA-@#((`0!2"`$`$Y`A@%.H(8!;N$V`0
+M@A`@%8,H<`B*`4`!$&@`&?@18`B"`0`$@@!`%)H0(46;*W`$@@!`#>(08`J(
+M`0`4BA`A1XLI<`2(`0`%Y`D@#HD]H`""`0`4@@!`!>H(8!&(`0`$B`$`%)H!
+M``WN$V`0@A`@IX,H<`6(`0`!^!$@"I`0`!@A`"810````),T,`@#/__P@A!@
+M?Y0*``&)+&`0B3$@"0,```^"$&.`B`D``902@`25,J``D!``&$````"3-#`(
+MD!``&*`0*85`````DRPP!)0*/P""#*#_E!*``94RH`"0$``80````),L,`20
+M$``80````),L,`0G/__`IA3@_Y0*`!.)+6`8B3D@$`,``#^"$&,`B`D``902
+M@`25,J``D!``&$````"3+#`$D!``&"$`$PE`````DS0P!Q4``/R4*@`*@RW@
+M$(,P8`0)``#\@@A`!)02@`&5,J``D!``&$````"3-#`'H3]@`*`$`!"@!``4
+MHA`@HZ,L<`6B!``1PA1@$I4H8!B#*&`0E!*``8(0(4>#*'`$@@0``<@08`B#
+M*2`(E!*``902@`25,J``D!``&!,`)@U`````DS)P")`0`!@E`!,%0````),T
+ML`>4"@`3@A`A18,H<`2@!``!PA0@%H,H8`B4$H`!E3*@`)`0`!A`````DS2P
+M!Y`0`!@A`"890````),T,`@5``'\E"H`"L(48`R#*&`,"0`!_(((0`24$H`!
+ME3*@`)`0`!A`````DS0P"((0(H6#*'`#R!4``0,```R"$&`"@*$``1A(``^B
+M$"`"R!8C>@,```2"$&`B@*$``1)(`!:0$``8PA9@`H((8$"`H&``,D@`$:(0
+M(`@0:``0(0`F29`0`!A`````DA``&0+*``J0$``8@S]@`((`0`&"`$`4B!`A
+M38DI,`2"`$`$PA!@#J($0`$A`"9)0````),T,`B4"C\!@@1`$8((8/Z4$H`!
+ME3*@`)`0`!A`````DS0P",(&8!"`H&```D@`!8D]H`#B3F`4$&@`">1.8!6(
+M`0`$B`$`%((0(*N#*'`%B`$``>(1(`[D$2`2D!``&*`0),E`````DRPP!90*
+M.!^#+&`%@@AGX)02@`&5,J``D!``&$````"3+#`%D!``&$````"3+#`%E`H_
+MX((,H!^4$H`!E3*@`)`0`!A`````DRPP!9`0`!A`````DRPP!902*`"0$``8
+M0````),L,`6"$"*%@RAP`\@5``$#```0@*$``0A(`!N"$"*%PA9@`H((8-"`
+MH&#0$D@`")`0`!@#```3@A!C_X"A``$(2``1@A`BA9`0`!@A`"B#0````),T
+M,`@5`#\`E"H`"H,O(!()`#\`@@A`!)02@`&5,J``D!``&$````"3-#`(@A`B
+MA8,H<`/(%0`!`P``%("A``$H2``(L!`@`9`0`!B2$"3/DRIP!4````"4$"``
+ML!`@`8'/X`@!````G>._`,!WI]_`=Z?/P'>GUZH0(`"L$"``KA`@`(@0(`'(
+M-Z>_@A`@`L(WI\'"-Z?#R#>GQ<@WIZ_"-Z>QR#>GL\(68`*C,'`'HHQ@`0)(
+M``C"%D``B2A@`H@!``&(`0`$`S__Z1!H``>"$&(HB2A@`H@!``&(`0`$`S__
+MT((08)BD`0`!PA9@.,@68#B`H2``$D@`*Z80``$0:``$)S__X!!H`":F"P`+
+MPA9@`H((8!"`H&``J!`@KJED8%>@$"``DRP@$),R8!#"7B-PD!``&)_`0`"5
+M-&```P``(("B``$"0``6EA``"(,LH!";,&`0B@T@_X@C0`4#```/F!!C_Y`*
+M``R`H0`(%$@`!H($(`&"`T`%@*!`"!9'_^*"!"`!H!```8,H8!"#,&`0@*!@
+M!`A/_^63+"`0YC9@.(DLX!`#(```@*$``1)(`&B#+.`0D!``&*`0),E`````
+MDRPP!0,0``"`B@`!`D@!=Y`0`!@E`"9#0````),TL`@5/\``E"H`"I4RH`"0
+M$``80````),TL`B0$``80````),L,`4#'```@BH``94P8`"0$``80````),T
+ML`B0$``8DA`DS9,J<`5`````E!`@`)`0`!B2$"$SDRIP!T````"4$"``D!``
+M&"$`)F%`````DS0P"",__`"4"@`1D!``&$````"3-#`(D!``&!,`$S.3,G`'
+M0````)00(`"0$``8(0`F9T````"3-#`(E`H`$9`0`!A`````DS0P")`0`!B2
+M$""9DRIP"$````"4$"``D!``&!,`)D&3,G`(0````)00(`"0$``8$P`3(9,R
+M<`=`````E!`@`)`0`!A`````DS2P"",___"4"@`1D!``&$````"3-+`(D!``
+M&!,`$S&3,G`'0````)00(`"0$``8$P`F8Y,R<`A`````E!`@`)`0`!B2$"F9
+MDRIP!$````"4$"``D!``&"$`)F5`````DS0P"!!H`1:4"@`1B3!@$(,LH!"#
+M,&`0B"$``<(68`*""&'P@*!@T")``!VM*2`0%$@`!X"@84"`H&#``D``#X,I
+M(`40:``=@B!`!`)```:`H&%0`D``$8,I(`40:``7@B!`!*TI(!&#/:``K6A@
+M&1!H``BO/:`*KRD@"(,]X`"O:&`WK2D@$8,]H`"M:&`9$&@`"*H0+#6M*2`0
+M@SV@`*UH8!FO/:`*`P``!JH08&J#*2`%@B!`!(,H8`*"`$`$B2A@!X,M8!"#
+M,&`0B3D@`(,X8`"):0`!@@D@#XH0(`2`H&``$D@`!)8'I[^*$"`#E@>GKX()
+M8`>`H&``!$``7*`0(`";.2`$E!`@`9@0``&`HV`<%$``U8,L(!"#,&`0@@-`
+M`8H`8!F`H6`@&$@`#H(!?]^`H6`9!$@`!X,J@`6`H6`:!$@`$((!8`&"`7__
+M@RJ``<@'I]^"$$`$$&@`"<(GI]^`H&`3.$@`!X(!8`&#*H`!R`>GXX(00`3"
+M)Z?C@@%@`8"@8`\82``,@@%_\8,L,#"#,'`OR!+``8(!0`6"`&`"B2D``<('
+MI\^($0`!$&@`*,@GI\^`H&`/&$@`#((!?^&#+#`P@S!P+\@2P`&"`4`%@@!_
+MXHDI``'"!Z?3B!$``1!H`!O()Z?3@*!@#QA(``R"`7_1@RPP,(,P<"_($L`!
+M@@%`!8(`?\*)*0`!P@>GUX@1``$0:``.R">GUX"@8`882``,@@0@`8,L,#"#
+M,'`OR!+``8(!0`6"`'^BB2D``<('I]N($0`!R">GVX($(`&@$``!@RA@$(,P
+M8!"`H$`,!D__K("C8!R0$``8)P`F0T````"3-/`(%3_``)0J``H#/\``E!*`
+M`94RH`"0$``80````),T\`B0$``8H!`DR4````"3+#`%`QP``((00`B5,&``
+MD!``&$````"3+#`%E2W@%`,/_`"4"H`!(P`#_Z(48_^"#8`1E!*``0,0``"4
+M$H`!E3*@`)`0`!B2$"3-0````),J<`74!Z??D!``&)(0(3-`````DRIP!Y`0
+M`!@A`"9A0````),T,`@E/_P`E`H`$L('I^.""$`1E!*``94RH`"0$``80```
+M`),T,`C4!Z??D!``&!,`$S-`````DS)P!Y`0`!@A`"9G0````),T,`B4"@`2
+MP@>GXX((0!&4$H`!E3*@`)`0`!A`````DS0P"-0'I\^0$``8DA`@F4````"3
+M*G`(U`>GTY`0`!@3`"9!0````),R<`C4!Z?7D!``&!,`$R%`````DS)P!Y`0
+M`!A`````DS3P""4___"4"@`2(P``#Z(48__"!Z?;@@A`$902@`&5,J``D!``
+M&$````"3-/`(U`>GSY`0`!@3`!,Q0````),R<`?4!Z?3D!``&!,`)F-`````
+MDS)P"-0'I]>0$``8DA`IF4````"3*G`$D!``&"$`)F5`````DS0P")0*`!+"
+M!Z?;@@A`$902@`&5,J``D!``&$````"3-#`(`0```('/X`@!````G>._0"$9
+M``#"%F`"@@A@$("@8``#,@``H69``<@68`(#```0@(D``2)(``3"5F`"$&@`
+M!:$T,`&)-#`"@*!__Z%D@`3"%D``B&P``:(0(!^#,1`1@@A@`0K`0`:"$"`F
+MH@1__PK\?_R#,1`1@A`@)J(@0!&"$"`7@B!`$:`0(`&A+``!H3P@`*`!`!""
+M$"`8@B!`$:$T$`&B!'_PD!``&"4`)@5`````DS2P"!4__X"4*@`*H2P@$902
+M@!"5,J``D!``&$````"3-+`(D!``&$````"3-+`(%0``>)0J``JC+&`-`P``
+M>*(,0`&4$H`1E3*@`)`0`!A`````DS2P"`$```"!S^`(`0```)WCOS"`IF!`
+MLV=@/_(V(ZR0$``8@A`B?8,H<`/27@`!0````)0'I]^!Q^`(D>@`")WCOR"B
+M$``8H!``&((0()&#*'`'T@8``8(0*0^#*'`#0````-!>``$1`!(AD3(P")`&
+M``A`````DA`@(-86(ZS"5B.L@*!@0)=FX#^#*N`0@SA@$("@8#Z($"``B6:@
+M`8"@``&"8#__@)$``0)(``>4$"``R`8CL(@!``0#````@A!@`-000`25*K`P
+ME3JP,)<J\#"7.O`P@@>G[<)SJ*^0$``1DA``&9@0(`%```#[F@>GZP+*`/>P
+M$"``@A`A=8,H<`7"7``!D!``$9('I^N4!Z?MEA``&9_`0`"8$``:`LH`[+`0
+M(`#*!&-\@AE@!X"@``&(0"``@AE@"X"@``&"0"``@(D``2)(`!.T$"``@*%@
+M"@)```^`H6`)`D``#8"A8`H22``'"0`D4<(48X"`H&`#"$@`"+00(``)`"11
+MB3$P"<(4``2"`&`$PC0`!+00(`""$""1FRAP!X(0+'N#*'`"RA0``9@0(#^#
+M/J``@@!``8(`0!"(`$`-PA$@!((`0`7",2`$@RA@$(,P8!"`H&`_.$@``M@Q
+M(`2T!J`!@*:@#PA/__.#/J``@A`J*X(`0`'"%``!@*!@`1A(`#\#`"1%PA1C
+M@H"@8$$82``<M!`@`,(68`*""&#0@*!@P!)(`!@#```HPA9``("@:;022``+
+M@A`J)8(`0`'(#``!@A`E%8,H<`+"%``!B"$``8DY(``0:``%@VD@!8(`0`'"
+M#``!@VA@!9,H8!"3,F`00``"DI`0`!&T$"```P``**0088""$"D/L2AP`P,`
+M`#^R$&/_DRZ@`I("0!*3,F``B3Z@`,I<`!B)*3`"@@$`!=008`*5*J`(E!*@
+M_Y0*@!F5*J`0PA%`!(,H8`B"$&#_@@A`&902@`&5,J``0````)`0`!&T!J`!
+M@*:@'R1/_^N3+J`"`P`D18,P<`G4%``!E`J@/Y4JH!B"$"D1@RAP`\(4``&"
+M"&`_@RA@$)02@`$#`"1#@S!P"<(4``&""&`_@RA@")02@`$#`!(A@S!P",(4
+M``&""&`_E!*``94RH`"0$``1$P`F34````"3,G`(`P`D28,P<`G4%``!E`J@
+M/Y4JH!B"$"2)@RAP!,(4``&""&`_@RA@$)02@`$#`"1'@S!P"<(4``&""&`_
+M@RA@")02@`$#`!(C@S!P",(4``&""&`_E!*``94RH`"0$``1$P`3)T````"3
+M,G`'@A`I$X,H<`/4%``!E`J@/Y4JH!@#`"1+@S!P"<(4``&""&`_@RA@$)02
+M@`$#`"11@S!P"<(4``&""&`_@RA@")02@`$#`!(E@S!P",(4``&""&`_E!*`
+M`94RH`"0$``1$P`HC4````"3,G`(@A`B18,H<`74%``!E`J@/Y4JH!@#`"1/
+M@S!P"<(4``&""&`_@RA@$)02@`$#`!(G@S!P",(4``&""&`_@RA@")02@`$#
+M`"1-@S!P"<(4``&""&`_E!*``94RH`"0$``1$P`41T````"3,G`'@A`L<X,H
+M<`+"!``!@*!@`)00(#^59F!_D!``$1,`)D]`````DS)P"+`0(`&!S^`(`0``
+M`)WCOO#Z=ZBG]#>GS?8WI[VV$``<HA``&`,`$B&#,'`(K`8``;H0(#^X$"`_
+MPDY@!8(`0`'"-Z>M@A`_P<A?J*_",0``RE^HI_@Q0`"0$``80````)(0`!F@
+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
+M$6``R`%@!,@B``R),2``@RDP`X(`0`2#*'`"B@%@"((`0`7"<V`@@A`@`<(C
+M8!B"$"`4PB-@#!!H`!*"$"!5"P```(H18`#(`6`$R"-``(DQ(`"#*3`#@@!`
+M!(,H<`**`6`(@@!`!<)S8"""$"`!PB-@&((0(!3"(V`,@A`@(X'#X`C"(V`0
+MG>._0,(6(X2""&#P@@!_T("@8#\82``5D!``&((0)=&#*'`#PEX``9_`0`"2
+M$"`'DA`@`900("1___9]EA`@`)80(`":$"!KF!`@`("B(`$2:``ABA`@:YH0
+M(%.*$"!3$&@`'((0(#>"$"71@RAP`\)>``&?P$``DA`@!Y(0(`:4$"`E?__V
+M:I80(`"6$"``@@(@!("B(#^:$"`RFV9``8"B(#^8$"!`F61`"XH#(#*`HB`_
+M@A`@%(-F0`O")F`,B`%_\8(!8`6`HB`_@V1`!,(F8!#R!F`$@*9`"XA`(`"`
+MID`-@A`@`(-G(`&`D0`!`D@`";`0(`"`ID`,B$`@`("F0`6"$"``@V<@`8"1
+M``&Q9F`!@<_@")$R(`"=X[]`@A`L>X,H<`+45@`!@A`F/8,H<`/"!@`!E`*`
+M`94JH`D#```?@A!B`)0*@`$#```@E!*``94RH`"0$``8DA`IDT````"3*G`$
+MB!`@`8(0+&V#*'`"R"8``8'/X`@!````G>._0*00`!B@$``8@A`BW8,H<`2B
+M!@`!P@1@&("@8``"2`!/L!`@`((0+&V#*'`"P@2``8"@8`$22`!'@A`L;9`0
+M`!*2$"F30````),J<`0#```@@(H``1)(`#^"$"QMB3(@&0,`8`"""@`!@S!@
+M%X"@8`(22``-R"1@!,(4HX*`H&!!*$@`!\($8`2"$"HI@@!``<(4@`$0:``#
+M@@!`!((`8`7")&`$PA2CA(((8/""`'_0@*!@/QA(``R"$"QM0```H9`0`!+(
+M!&`$P@1@%("A``$J2``$P"1@!((A``'")&`$@A`L;;$H<`+`)``8D!``$G__
+M_V.2$``1"LH`%H(0+&V0$``20```%Y(0`!$"R@`1@A`L;9`0`!)````>DA``
+M$8"B(``$0``*@A`@`L(D`!B($"`!@A`F.8,H<`/()``!@A`C&X,H<`3`)``!
+M@A`L;8,H<`+P!``!@<_@"`$```#(`F`$P@)@#("A``$(2``&D!`@`,("8!"`
+MH0`!"D@``P$```"0$"`!@</@")$R(`#"$B.$@@A@\((`?]`)````@*!@/PA(
+M``28$2```P```)@08`#*`D``B3%@`(,I,`."`$`$@RAP`H(#``&"`&`(PG)@
+M(,@"8`3"`F`0@*$``2I(`"C"`F`,@*%@``)``%.0$#__R`)@!,@B8`C"`F`0
+M@*$``0I``!V6$``!P@)``("@8``B0`!)D!`@`<("0`":`'__VB)``(DS8`"#
+M*3`#@@!`!(,H<`*"`$`,REI@(,@`8!C*`6`0B"$`!8@!``3*`F`(BB%`!,HB
+M8`B"`&`(@*%`"PI```7"<F`@@*-@`#)/_^S"`D``$&@`,)`0(`&`H0`!&$@`
+M+9`0(`#"`P``@@!__\@"0`"`H0`!`D``)Y`0/_[(`F`$R")@",("8`R`H0`!
+M&$``()80``'"`P``@@!__\@"0`"`H0`!&D``&HH0``2:`6`!VB)``(DS8`"#
+M*3`#@@!`!(,H<`*"`$`,REI@(,@`8!C*`6`0B"$`!8@!``3*`F`(BB%`!,HB
+M8`B"`&`(@*%`"QA```?"<F`@P@,``((`?_^`HT`!"D__ZHH0``V0$"`"@</@
+M"`$```"=X[]`@A`BW8,H<`2@!@`!P"0@%((0)=&C*'`#PEX`$9`0`!B?P$``
+MDA`@!Y(0(`&4$"`D?__U3980(`"`HB`!$D@`&Y`0`!C"7"`@Y%!``,)>`!&?
+MP$``DA`@!Y(0(`24$"`@?__U0980(`"`I*`!`D``#H(0``B`I*`!*D@`#,`D
+M(!2`I*`"`D``!H"DH`,B0``&@@(`"!!H``4!````@@(`"((`?_O")"`4@<_@
+M"`$```"=X[]`D!``&4````"2$``:F`;__YDS(`.V!O__@*:@``1``!^V#N`'
+MEA`@`;DO(`.4$"`(B`;`&H"A(`F)9N`(B2K`!(@!/_^#*L`;@@!__X@9``&)
+M*0`<FS,@`)LK<`+*!@`-BBE`!(,J`!N#*$`<@@A`!((00`7")@`-@@:`&[0`
+M?_B"(H`;D3(``;80(`"`IJ``%$__Z)@#(`&!S^`(`0```)WCOT#(%F`"`P``
+M$)`0`!B`B0`!$D``#9(0(@#"5F`"D!``&("@8``&0``($P```<(68`*""&`0
+M@*!@`)(0(0"39F`"D!``&$````"D$"``P@(``("D@`$60``;HA``"`,``"&F
+M$&,`@SR@`*``0`&@!``!H2PP`J`$`!'6#"`KD!``&)(0`!&4$"`.0````)@0
+M(`"5,B``T@P@*),J8`*2`D`3DS)@`$````"0$``8I`2@`<($0`"`I(`!!D__
+M[(,\H`#"%F`"@@A@$("@8``22``VD!``&$````"2$"`(I!`@`,("``"`I(`!
+M%D``+Z(0``@#```AIA!C`(D\H`""`0`$@@!`!(,H<`*@`$`1P@P@*(,H8`*R
+M`$`3P@P@)8"@8``R2``=I`2@`=8,("N0$``8DA``$900(`Y`````F!`@`)4R
+M(`"3-F``0````)`0`!C"#"`I@*!@`")(``^D!*`!@RA@`K(&0`'6#"`KD!``
+M&)(0`!&4$"`.0````)@0(`&5,B``DS9@`$````"0$``8I`2@`<($0`"`I(`!
+M!D__V(D\H`"!S^`(`0```)WCOT"0$``8$P`@!T````"3,G`(`P``#X(08X"0
+M"@`!R!9@`K(0(00;!^``"P`&P)00(!.@$"VL`P``$(")``$22``(HA`@%+(0
+M(-(;!^``"P`-@)00(`F@$"U(HA`@"I02@`B4$H`%E!*`#94RH`"0$``8$P`@
+M!T````"3,G`(E39@`)`0`!B2$"$'0````),J<`25-"``D!``&)(0(0M`````
+MDRIP!)`0`!B@$"$/0````),L,`05``/_E"H`"H,L8`J4$H`!E3*@`)`0`!A`
+M````DRPP!`$```"!S^`(`0```)WCOT""$"N#@RAP`L(&``$3(```DBA`"9,R
+M8`!`````D!``&*00``B0$``80````)(0(#"@"B/PH30@!((0("6"($`0@S!@
+M`8"F8``22``$H@0``8"D(`*B1#__@*1`$`)```F4"CP/@RQ@!(((8_"4$H`!
+ME3*@`)`0`!A`````DA`@,),TH`!`````D!``&((<0!"`H``!@<_@")!`(`"=
+MX[]`E!``&L(6(YB`ID`!%D@`#)`0(`"#/F``DRAP!)(B0`&3*G`"D@8`"8(0
+M(NV#*'`$D@)``4````"0$``8@<?@")'H``B=X[]`DA``&L(6(YB`ID`!%D@`
+M#)`0(`"#/F``E2AP!)0B@`&5*K`"E`8`"H(0(NV#*'`$E`*``4````"0$``8
+M@<?@")'H``B=X[]`D!``&(H&(Y"`IF`"`D``$*00(`N`IF`"&$@`!X"F8`.`
+MIF`!`D``)(@0/_\0:`!D`0````)```N`IF`$(D``#^(18`@0:`!>B!`__^(1
+M8`BB!'__`P`!0!!H``:"$&#`XA%@"*($?_X#``%`@A!AP!!H`"^D%(`!H@1_
+M_8D\8`"#*3`$@B!`!(,H<`*"`$`8B!`B[8DI,`2"`$`$P@!@!("@8``20`!&
+MB!`__Q!H`"&)/&``PA%@"(@0``&#*&`0@*!@``)``!2B$"``@A`B[9DH<`2#
+M*2`0FS!@$(,\8`")*'`$B"$``8DI,`*(`0`(B`$`#,(!(`2`H&``(D``!\(1
+M8`BB!&`!@*1`#09/__6#/&``PA%@"("D0`$"0``HB!`__Q!H``.)/&``B3Q@
+M`(,I,`2"($`$@RAP`J`"``&"$"+M@RAP!*`$``'"!"`$@*!@`!)``!J($#__
+MD!``$$````"2$"`\"LZ`#O(D(`3D)"`,@A`@`L(D(!2"$#__PB0@&((0(__"
+M)"`<@A`@"L(T("#"-"`B$&@`",`D(#3"!J`PPB0@-),\8`"0$``80````)00
+M`!J)/&``@<_@")`0``2=X[]`@A`KKX,H<`+4!@`!E`JC_X(0*[&#*'`"P@8`
+M`8,H8!`A`/_`@@A`$)02@`&5,J``D!``&$````"2$""D@A`@NX,H<`;4!@`!
+ME`JC_X(0)=F#*'`#P@8``8,H8!"""$`0E!*``94RH`"0$``80````)(0(*B0
+M$``80````)(0(*R4"CP`@A`KLX,H<`+"!@`!@@AC_Y02@`&5,J``D!``&$``
+M``"2$""L`0```('/X`@!````G>._0)`0`!C"%B.8@*9``1I(`"RP$"``B39@
+M`(,I,`2"($`$@RAP`I("``&"$"+M@RAP!)("0`'"`F`$@*!@``)(`""($"NO
+MP")@!(DI,`**$"`!BRE`&8HX``7"`@`$@@E``<(B``2($""[B2DP!L("``2"
+M"4`!PB(`!(@0*[&)*3`"P@(`!(()0`'"(@`$B!`EV8DI,`/"`@`$@@E``<(B
+M``2"$"NS@RAP`L@"``&*"4`$?___I<HB``&P$"`!@<_@"`$```"=X[]`K!``
+M&*00`!B"$")]@RAP`\I>``'"%B.8@*9``1I(`66P$"``B39@`(,I,`2"($`$
+M@RAP`J(%@`&"$"+M@RAP!*($0`'"!&`$@*!@``)(`5FP$"`!P@1@&("@?_\2
+M2``4J2Y@`@+!0`B($"`/PA%@`H((8*"`H&"@`D```X@0(!^($"`/@A`@`8"@
+M0`0:0``(J2Y@`H(`0`&"$&`!@*!`!"I/__Z"`$`!J2Y@`B$```22%"!`D@4`
+M"9,R8`"4"&/_P@1@'(,H8`H)``/_@@A`!)02@`'"!&`4@RA@%`D#_`"""$`$
+ME!*``94RH`!`````D!``%J`4(("@!0`0H30@`-048"*5*J`$E`J@\,(48"""
+M"&`/E!*``0,``@B4$H`!E3*@`)`0`!9`````DA``$"L```+"!&`D@*!@``)(
+M`!&F$"$`D@4HP),R8``5/\``E"A`"L($8"B#*&`8E!*``94RH`!`````D!``
+M%JH0*`'"!&`H@*!@`((0*0&K9D`!P@1@,("@8``"2``,DRY@`I(":0"3,F``
+M%3_``)0H0`H#`$``E!*``94RH`!`````D!``%I,N8`(#```$@A!@P)("0`&3
+M,F``R`1@+`,__`""*0`!@*``!)1`(`"5*J`4E!*``94RH`!`````D!``%L($
+M8#"`H&```D@`!\($8`R""&`@B!5B`("@8`"K9D`$P@1@#(((8$"`H&```D@`
+M!8(-8`^J#7_PJA5@`H(-8`^`H&``(D@`$<@$8`S"!&`,@@AA`(H58$"(#7^_
+M@*!@`*H0``6K9$`$P@1@#(((8("*%6`@B`U_WX"@8`"J$``%JV1`!,@$8`P#
+M``!`@(D``0)(``3(!&`,`P`(`*84P`&*%.(``P`@`(")``&G9D`%@A``!`D`
+M`0"`B$`$(D@`!,($8`P0:``&IA3`!`D``("*%,`$@(A`!*=F0`7(!&`,`P`"
+M`(")``$B2``%P@1@#`,``!"F%,`!P@1@#`D`!`"*%,`$@(A`!*=F0`7"!&`$
+M@*!@`@)```:`H&`#(D``!\($8#`0:``@P@1@.*H58*(0:``;`P`)0("@8``2
+M2``7JA5@8@,```#(`&```P```,(`8`"((0`!@A`L=8,H<`+4!(`!E"*`!`,`
+M``#"`&``E"*``94JH`J3+F`"D@)I`),R8``#`$``E!*``94RH`!`````D!``
+M%@,``0"F%,`!P@1@.(((8`&`H&```D@`!*$N8`(#``D`IA3``8($*<"I,&``
+ME35@`)`0`!9`````DA``%"L```2"%6$`H`0``:$T(`"5-.``D!``%D````"2
+M$``0P@1@-("@8``B2``9P@1@#)0&0!F4`J!0E3*@`)`0`!9`````DA`K`-0$
+M8#20$``60````)(0*P20$``6DA`K"$````"4$"`)D!``%D````"2$``4E!(`
+M%94RH`"0$``60````)(0`!3"!&`,@@A@`8"@8``"2``(@A`KKX,H<`*($"`!
+MB2D`&<H$@`$0:``'B!$`!8,H<`*($"`!B2D`&<H$@`&(*4`$R"2``<($8`R"
+M"&`!@*!@``)(``B"$""[@RAP!H@0(`&)*0`9R@2``1!H``>($0`%@RAP!H@0
+M(`&)*0`9R@2``8@I0`3()(`!P@1@#(((8`*`H&```D@`"((0*[&#*'`"B!`@
+M`8DI`!G*!(`!$&@`!X@1``6#*'`"B!`@`8DI`!G*!(`!B"E`!,@D@`'"!&`,
+M@@A@!("@8``"2``(@A`EV8,H<`.($"`!B2D`&<H$@`$0:``'B!$`!8,H<`.(
+M$"`!B2D`&<H$@`&(*4`$R"2``<($8`R""&`(@*!@``)(``B"$"NS@RAP`H@0
+M(`&)*0`9R@2``1!H``>($0`%@RAP`H@0(`&)*0`9R@2``8@I0`3()(`!D!``
+M%G___C:2$``1L!`@`8'/X`@!````G>._0)`0`!B3+F`"D@)H`$````"3,F``
+M@<?@")'H``B=X[]`D!``&)00`!J3+F`"D@)H`$````"3,F``@<_@")`0(`&=
+MX[]`D!``&)00(`&5*H`9E3*@`$````"2$"A`@<_@")`0(`&=X[]`H!``&),N
+M8`*2`FH`DS)@`$````"0$``8L(H@`Q)(``B0$``00````)(0*$""$"`!@RA`
+M&8"(0`BQ9F`!@<_@")$R(`"=X[]`E!`@`94J@!F5,J``D!``&$````"2$"B`
+MI!`CZ)`0`!A`````DS9@``+"``B3-F``0````)`0(&2DA+__$D__^9`0`!B3
+M-F``0````)`0`!@BR@!DD!``&,H&(WR"&6`'@*```8A@/_^"&6`+@*```8)@
+M/_^`D0`!$D@`#J(0(`"`H6`*`D``"X"A8`D"0``)@*%@"A)(`%.0$``8PA8C
+M@("@8`,X2`!0DA`H@*(0(``G`"`3`P``/Z@08_^0$``80````),T\`B@$``(
+MD!``&)(0((&3*G`(%0*`&4````"5,K`(H30@"I0,`!0#``!`E!*``94RH`"0
+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
+M`$`$PBJ@",(*8!J#,&`$PBJ@"<(*8!R#*'`8"0!``("(0`2"$"`"@V1@`<(J
+MH`J0$"``@</@"`$````+`!(IBS%P",("0`#(`@`%@@A`!,(B0`#(`@`%@BD`
+M`8'#X`C"(@`%`````````````````````````````````````)WCOT"2$"N3
+MDRIP`I(&``E`````D!``&)`0`!@3`"!)DS)P"$````"4$"``D!``&!,`$"63
+M,G`'0````)00(`"0$``8DA`@0$````"4$"``D!``&)(0*!.3*G`$0````!4`
+M`("0$``8$P`0)Y,R<`=`````%0"```$```"!S^`(`0```)WCOT"0$``8DA`@
+M0$````"4$"`&DA`KDY,J<`*2!@`)0````)`0`!B0$``8$P`@29,R<`A`````
+ME!`@`)`0`!@3`!`EDS)P!T````"4$"```0```('/X`@!````FA`@`((0(9&9
+M*'`%B3M@`((!``2"`$`$@RAP`H(@0`2#*'`#@@!`"((`0`S*$&`(PA)``("A
+M0`$"0``7@@$`!((`0`2#*'`"@B!`!(,H<`."`$`(B@!`#,(18`B`H&``,D@`
+M"9H#8`'"$D``PC%@",(28`+",6`*P@I@!!!H``;"*6`,@*-@/PA/_^*).V``
+MB!`@`('#X`B0$``$@A`AD8,H<`6!P^`(T%H``9WCOT"2$"N3DRIP`I(&``E`
+M````D!``&((0(N&#*'`$@<_@")`"``&=X[]`H!``&,A>(Y"),3`GB`D@`8(0
+M+(6#*'`"R"8``9`0)D61*C`#D`8`")(0(`M`````DRIP"9H0(`""$"&1F2AP
+M!8(0(R.1*'`$EA`@R((0(,F3*'`&@A`LA94H<`*"$"&3I2AP!2,`+_^>%&,X
+MP@8C?("@8`882``+@SM@`(@`0`&(`0`!B2DP`H@A``&)*3`#B`$`$(@!``P0
+M:``*@A`@!X@`0`&(`0`!B2DP`H@A``&)*3`#B`$`$(@!``R"$"`"PBD@$(D[
+M8`""`0`$@@!`!(,H<`*"($`$@RAP`XH`0!""`4`(B!`A],@@8`S6(&`0UB!@
+M%(@!0`F"$"!DPB$@"((0("C"(2`0@A`@!\(A(`R"`4`,P"A@%,`H8!7("&`0
+MR"A@$L`H8!/"!``*@*!@``)(``::`V`!B`%`$H(48@S"(2`,WB$@$("C8#\H
+M3__)P@8C?((0+(6#*'`"P@0``8"@8``"2``3B!`@9((0+)N#*'`"U`0``9`0
+M`!@3`"!+0````),R<`B"$",G@RAP!-0$``&0$``8$P`@34````"3,G`(0```
+M`)`0`!B($"!D@A`F0X,H<`.`IF```D@`!\@D``&($",AB2DP!,($``00:``&
+M@A!@`8@0(R&)*3`$P@0`!(((?_[")``$@<_@"`$```"=X[]`@A`LA8,H<`+"
+M!@`!@*!@``)(``X!````0````)`0`!B0$``8$P`@2Y,R<`A`````E!`@`)`0
+M`!@3`"!-DS)P"$````"4$"```0```('/X`@!````G>.^X*00`!B"$"&1@RAP
+M!>9>``&`IF`&&$@!OX(0(`"#-F``@RAP`@D```"($2``P@$``8'`0``!````
+MLA``&H"FH`082`&T@A`@`)`0`!BB$"F%0````),L<`05`_P`E"H`"J$VH`"A
+M+#`"H`0`&((0(D&#*'`%@@0``<(`8`B#*&`4"0/\`(((0`24$H`!E3*@`)`0
+M`!A`````DRQP!)`0`!@C`"870````),T<`@#/__@@A!@?Y0*``&"$"2%@RAP
+M!,@$``&)*2`'`P``'X(08X"("0`!E!*`!)4RH`"0$``80````),T<`B0$``8
+M0````),T<`@5``_@E"H`"H(0)(.#*'`$@@0``<(`8`R#*&`/"0`/X(((0`24
+M$H`!E3*@`)`0`!A`````DS1P")`0`!@C`!,+0````),T<`<5`/\`E"H`"H(0
+M(D.#*'`%H`0``<($(`2#*&`2"0#_`(((0`24$H`!E3*@`)`0`!A`````DS1P
+M!\(,X`F($"+A@*:``1A(``B)*3`$P@S@"8"F@`$Z2`%?\BS@"8@0*X6)*3`"
+MP@2`!((`8`'")(`$$&@!6/(LX`F($"!_R">GWX(0(#+")Z?CR">GSX(0("C"
+M)Z?3R">GOX(0($W")Z?#R">GKX(0($#")Z>S@A`@'\(GIY^"$"`0PB>GHX(0
+M(#_")Z>/@A`@,,(GIY.`H``:LD`@`)`0`!@U`"8;0````),VL`@5``?PE"H`
+M"J,N<`*"!Z?OH@1``<($?_"#*&`."0`'\(((0`24$H`!E3*@`)`0`!A`````
+MDS:P")`0`!A`````DS:P"!4#^`"4*@`*P@1_X(,H8!4)`_@`@@A`!)02@`&5
+M,J``D!``&$````"3-K`(D!``&"$`$PU`````DS0P!Q4`/X"4*@`*P@1_T(,H
+M8!$)`#^`@@A`!)02@`&5,J``D!``&$````"3-#`'D!``&$````"3-#`'%1_`
+M`)0J``K"!'_`@RA@&`D?P`"""$`$E!*``94RH`"0$``80````),T,`>0$``8
+M0````),T,`>4"C_@P@1_L(((8!^4$H`!E3*@`)`0`!A`````DS0P!Y`0`!A`
+M````DS:P"`,___""$&#_E`H``<@$?Z")*2`(`P``#X(08P"("0`!E!*`!)4R
+MH`"0$``80````),VL`B`IF```D@`")`0`!A`````DS:P")02(`&0$``8$&@`
+M"9,VL`@A`"8;0````),T,`B4"C_^E3*@`)`0`!B3-#`(0`````$```"`H``9
+MB&`__\(,X`R`H0`!`D``T8@0(7&`IF``$D@`!(DI,`6($"N)B2DP`L($@`2"
+M`&`!PB2`!("@`!F"8#__$&@`Q<(LX`R"$"`(PB>GCX(0(`;")Z>3@*``&J)`
+M(`"0$``8(0`404````"3-#`'E`H_P(,L<`*(!Z?_@@$``<(`?Y"""&`_E!*`
+M`94RH`"0$``80````),T,`?"#.`-@*1``0)``*R($"7%@*1@`!)(``2)*3`#
+MB!`KBXDI,`+"!(`$@@!@`<(D@`00:`"BXBS@#<`GIX^"$"`$PB>GDX(0(`C"
+M)Z>7HA``&H"FH`(82`":@A`@`)`0`!@A`!,+0````),T,`<5``#\E"H`"H,V
+MH`"#*'`"B`>G_X(!``'"`'^0@RA@#`D``/R""$`$E!*``94RH`"0$``80```
+M`),T,`?"#.`+B!`BXX"F@`$82``(B2DP!,(,X`N`IH`!.D@`?>(LX`N($"N-
+MB2DP`L($@`2"`&`!PB2`!!!H`';B+.`+@A`@`L(GIX^"$"`$PB>GDX(0(`;"
+M)Z>7@A`@",(GIYN"$"`*PB>GGX(0(`S")Z>C@A`@#L(GIZ>"$"`0PB>GJZ(0
+M`!J`IJ`'&$@`8X(0(`"0$``8(0`F24````"3-#`(E`H_`8,VH`"#*'`"B`>G
+M_X(!``'"`'^0@@!``8((8/Z4$H`!E3*@`)`0`!A`````DS0P",(,X`J($"7#
+M@*:``1A(``B)*3`#P@S@"H"F@`$Z2`!(XBS@"H@0*X>)*3`"P@2`!((`8`'"
+M)(`$$&@`0>(LX`J`IJ``$D@`$((0(R&#*'`$R`8``8@)/_W()@`!0````)`0
+M`!A`````D!``&)(*/O^3,F``0````)`0`!@0:``Q@A`@`8,H<`3"!@`!@@A@
+M`H"@8``22``K@A`@`8(0+(6#*'`"P@8``8"@8``"2``:`0```$````"0$``8
+MD@H^_Y,R8`!`````D!``&((0+)N#*'`"U`8``9`0`!@3`"!+0````),R<`B"
+M$",G@RAP!-0&``&0$``8$P`@34````"3,G`(0````)`0`!@0:``(B!`C(4``
+M``"0$``8DA(A`$````"0$``8B!`C(8DI,`3"!(`$@A!@`L(D@`2"$"`!@<_@
+M")`0``&=X[]`@A`AD8,H<`7@7@`!P"0@$((0+(6#*'`"P@8``8"@8``"2``K
+MHA``&,@$(!0#`#``@*$``0A(``2"($`$$&@``\`D($3")"!$R`0@'`,`,`"`
+MH0`!!$@`!((@0`00:``#P"0@2,(D($C4!"!$D!``&!,`($M`````DS)P"-0$
+M($B0$``8$P`@34````"3,G`(D!``&)(0*!.3*G`$0````!4``("0$``8$P`0
+M)Y,R<`=`````%0"``)(0*Y.3*G`"D@1`"4````"0$``8P"0@/,`D($"!S^`(
+M`0```)WCOT""$")]@RAP`])>``&"$",A@RAP!,(&``&""&`#@*!@`Q)(`%Z"
+M$"&1@RAP!>!>``'4#"`)@**@`SA(``?4#"`*E`*@`94ZH`"0$``8$&@`49(0
+M(`'"#"`(@**``1I(``>"$"%SE`*@`94ZH`"0$``8$&@`2)(0(`6#*'`%P@8`
+M`8@(8'^*`&!_@*$@/QA(``:+,6`'@A`A<X,H<`7"!@`!BS!@!\($("B`H4`!
+M)$@`$L($("3"#"`,@*!@`#)(``G4#"`+D!``&)(0(`)`````E!`@`)`0`!@0
+M:``MDA`@!8"BH`$82``ME`*@`1!H`!*5.J``@*%``01``!(!````P@P@#("@
+M8``B2``'U`P@"Y`0`!B2$"`"0````)00(`'4#"`+@**@`1A(`!R4`J`!E3J@
+M`)`0`!@0:``6DA`@!$````"0$``8D`(__H"B(`$82``2`0```,(,(`R`H&``
+M,D@`!\(,(`N0$``8DA`@`D````"4$"``P@P@"X"@8``"2``&D!``&)(0(`24
+M$"``0`````$````!````@<_@"`$```"=X[]`@A`B?8,H<`/27@`!@A`C(8,H
+M<`3"!@`!@@A@`X"@8`,22``R@A`AD8,H<`7@7@`!U`P@"8"BH`,82``'@A`A
+M<Y0"H`&5.J``D!``&!!H`"62$"`!@RAP!<(&``&("&!_B@!@?X"A(#\82``&
+MBS%@!X(0(7.#*'`%P@8``8LP8`?"!"`D@*%``01```H!````U`P@"X"BH`$8
+M2``4E`*@`94ZH`"0$``8$&@`#I(0(`1`````D!``&)`"/_Z`HB`!&$@`"@$`
+M``#"#"`+@*!@``)(``:0$``8DA`@!)00(`!``````0````$```"!S^`(`0``
+M`)WCOT"B$``8@A`B?8,H<`/27@`!?__\BY`0`!B1.B``@@(`"((`0`B#*'`"
+M@B!`"(,H<`.@!@`!@A`F18,H<`.@!``!@A`AD8,H<`7@=@`!P@8CC("@8`$2
+M2``&B!`C(8DI,`3"!@`$$&@`!8(08`*)*3`$P@8`!(((?_W")@`$P@8CC("@
+M8`$"0``C@A`@N8,H<`;(!$`!B`$@`<@D0`&0$``8DA`@`4````"4$"``D!``
+M&)(0(`5`````E!`@`)`0`!B2$"`$0````)00(`"0$``8DA`@`D````"4$"``
+MD!``&)(0(`-`````E!`@`$````"0$``8DA(A`$````"0$``8?__^WY`0`!@0
+M:`!5`0```((0(R&#*'`$P@8``8((8`.`H&`#$D@`3H"F8``"2``7D!``&-0,
+M(`E`````DA`@`=0,(`J0$``80````)(0(`7"#"`,@*```91@/_^0$``80```
+M`)(0(`+4#"`-D!``&$````"2$"`#U`P@"Y`0`!@0:``4DA`@!)(0(`%`````
+ME!`@!-0,(`B0$``80````)(0(`60$``8DA`@`D````"4$"`!D!``&)(0(`-`
+M````E!`@`9`0`!B2$"`$E!`@`D`````!````@A`LA8,H<`+"!$`!@*!@``)(
+M`!8!````0````)`0`!B2"C[_DS)@`$````"0$``8?__^G9`0`!B0$``8DA`H
+M$Y,J<`1`````%0``@)`0`!@3`!`GDS)P!T`````5`(``$&@`"0$```!___Z/
+MD!``&$````"0$``8DA(A`$````"0$``8`0```('/X`@!````G>._0*(0`!B0
+M$``8$P`@29,R<`A`````E!`@`)`0`!@3`!`EDS)P!T````"4$"``DA`KDY,J
+M<`*2!@`)0````)`0`!B"$"%S@RAP!<@&0`#()@`!@@8``<@&8`3((&`$R`9@
+M",@@8`B0$``8$P`@2T````"3,G`(H!``")`0`!@3`"!-0````),R<`@)`#``
+M@@P`!("@0`0"0``%@@H`!("@0`022``I`0```((0(9&#*'`%\EQ``=H&8$2:
+M)``-BA`EQXLI<`/"!F`\@B-``<@$0`6"`$`$PB1`!=HF8#S:!F!(FB(`#8H0
+M*X^+*7`"P@9@0((C0`'(!$`%@@!`!,(D0`7:)F!`R`9@/,(&8!2`H0`!*$@`
+M!<@&8$!___YVD!``&,@&8$#"!F`<@*$``0A(``0!````?__^V9`0`!A___XU
+MD!``&`$```"!S^`(`0```)WCOT""$"&1@RAP!<I>``'"#F`%@*!@$1)(`!.`
+MH&`9P@%@/((`8`'"(6`\B!`EQXDI,`/"!@`$@@!@`<(F``3(`6`\P@%@%("A
+M``$(2``8`0```'___E.0$``8$&@`$@$````22``2B!`KC\(!8$""`&`!PB%@
+M0(DI,`+"!@`$@@!@`<(F``3(`6!`P@%@'("A``$(2``&`0```'___JN0$``8
+M?__^!Y`0`!@!````@<_@"`$```"=X[]`D!``&((0(9&#*'`%VEX``8(0(7.#
+M*'`%P@8``8@(8'^*`&!_@*$@/QA(``:+,6`'@A`A<X,H<`7"!@`!BS!@!\(#
+M8"B`H4`!-$@`$]0+8`K"`V`D@*%``21(``C4"V`+P@M@#)(0(`*`H&``$D``
+M%I00(`'4"V`+@**@`")(``;4"V`*E`*__Y4ZH``0:``.DA`@!("BH``B2``&
+MU`M@"90"O_^5.J``$&@`!Y(0(`6`HJ```D@`!I0"O_^5.J``DA`@`4`````!
+M`````0```('/X`@!````G>._0)`0`!@3`"`[0````),R<`BB$``(D!``&)(0
+M*`]`````DRIP!*`0``B0$``8$P`0'T````"3,G`'@A`AD8,H<`7:7@`!P@-@
+M.("@8``"2``&BA`@`("@0`@H2``)R@-@.(H0(`"($"N1B2DP`L(&``2"`&`!
+M$&@`#<(F``2*(@`%R`-@-(@D``3"`V`P@B1``8HA0`2*(4`!B3E@`((0)5^#
+M*'`%BVD``=`C8#CB(V`PX"-@-('/X`B1.6``G>._0*(0`!B"$"&1@RAP!>!>
+M``&"$"%S@RAP!<@&0`#()@`!@@8``<@&8`3((&`$R`9@"`+$`)[((&`(?___
+MP9`0`!B`HB``%D@`";(0``B($"7)B2DP`\(&``2"`&`!PB8`!'___8*0$``8
+MP@0@$((&0`'")"`0@A`LA8,H<`+"!$`!@*!@``)(`$F"$",ADA`KDY,J<`*2
+M!$`)0````)`0`!B0$``8$P`@2T````"3,G`(LA``")`0`!@3`"!-0````),R
+M<`C"!"!$@*9``0I(``:D$``(P@0@2("B``$Z2``?V@0@1-0$($2`ID`*.D@`
+M#=0$($B5,J``D!``&!,`($M`````DS)P")`0`!B2$"@3DRIP!$`````5``"`
+MU`0@2("D@`H:2`!AE3*@`)`0`!@3`"!-0````),R<`B0$``8$P`0)Y,R<`=`
+M````%0"``!!H`%8!````FB9`#8H0)<>+*7`#P@0@/((C0`'(!$`%@@!`!,(D
+M0`7:)"`\V@0@2)HB``V*$"N/BREP`L($($""(T`!R`1`!8(`0`3")$`%VB0@
+M0((0(R&#*'`$P@8``8((8`.`H&`#$D@`/((0)D.#*'`#R`1``8,I(`*"`$`$
+MR@0@$("A0`$H2``6R`0@$,($(!B"24`!@S!@`()H8^C(!"`\@*$``1A(`"H!
+M````P@0@(())0`&#,&``@FACZ,@$($"`H0`!&$@`(@$```!___\0D!``&!!H
+M`!X!````@A`F0X,H<`/"!$`!@*$``0A(`!H!````P@0@%())``&#,&``@FAC
+MZ,@$(#R`H0`!*$@`!L($(!!___TXD!``&!!H``P!````R`0@'()(0`2#,&``
+M@FACZ,@$($"`H0`!"$@`!@$```!___V6D!``&'___/*0$``8`0```('/X`@!
+M````B!`B?8DI,`/"6@`$PA!``,(R0`#*6@`$P@E@!((08`C"*6`$P@I@!((0
+M8`C"*F`$PEH`!,(08`+",F`"PEH`!,((8`3"*F`$PEH`!,((8`7"*F`%@</@
+M")`0(``!``````````````````````````````````````````````"=X[]`
+MH!`@``,```"B$&``B3P@`((!``2"`$`$B2AP`]($0`2"`$`!@@!`&8,H<`+4
+M!$`!0````)`0`!BV!N`!@@[@/X"@8``R2``%H`0@`4````"0$"`!H`0@`8"D
+M(`T(3__MB3P@`+(0(``#````H!!@`(,^8`"#*'`#T@0``8(`0!#4`&`$0```
+M`)`0`!BV!N`!@@[@/X"@8``R2``%L@9@`4````"0$"`!L@9@`8"F8$<(3__Q
+M@SY@`+(0(``#````H!!@`(D^8`""`0`$@@!`!(DH<`+2!``$B3:@`((`0`2#
+M*'`"U`0``4````"0$``8M@;@`8(.X#^`H&``,D@`!;(&8`%`````D!`@`;(&
+M8`&`IF`_"$__[8D^8`"!S^`(`0```)WCOT#2%D``U!9@`D````"0$``8PA9@
+M`H((8("B$``(@*!@``)(`">F$"``@RHP,*4X<#"B!(`2H@1`$J,L<`(A````
+MH!0@`*`$(.2D!$`0T`2@!$````"2$"`(I@H@_Z<LX`7"!$`0@RA@!*84P`'B
+M%*`(D!``&"$`*(%`````DS0P",(60`"`H&FT,D@`!Y0*/^^4$B`0E3*@`)`0
+M`!@0:``&DS0P")4RH`"0$``8$P`H@9,R<`A``````0```(DL8!"#.2`0@*!@
+MD!1```>1+&`0@S$@$(((8`&`H&``(D``"I$Z(!"1.B`0D`(_Z)$R(`!`````
+MDA`@"*`*(/\0:``+@A`@`9`"/^B#,B`?D`(``9$Z(`&1,B``0````)(0(`B@
+M"B#_@A`@`*$L(`*"`$`!H!0``:`4)`&4#.#_E2J@"((,(/^4$H`!E3*@`)`0
+M`!@3`"8G0````),R<`BA-"`(%0``/Y02HP"4#,`*@@P@_Y02@`&5,J``D!``
+M&)(0*8U`````DRIP!((0(GV#*'`#\G8``8'/X`B0$"`!@A`ACX,H<`6`HF`'
+M&$``$]!:``&#,F``@RAP`@D```"($2``P@$``8'`0``!````$&@`"Y`"($00
+M:``)D`(@2!!H``>0`B!,$&@`!9`"(%`0:``#D`(@E)`0(`"!P^`(`0```)WC
+MOO"H$``8PA9@`H((8?"`H&#``D``9Z00(`"`H&#`%$@`!X"@84"`H&"@`D``
+M28(0)4<0:`&^L!`@``)```2`H&%0,D@!NK`0(`#"%D``@@!P7X,H8!"#,&`0
+M@*!DZCA(``?"%D``@A`E0X,H<`+N%0`!$&@`)H(0*H<)/__ZB!$C=((`0`2#
+M*&`0@S!@$("@8.\X2``'PA9``((0(5&#*'`$[A4``1!H`!F"$"J)"3__^H@1
+M(H2"`$`$@RA@$(,P8!"`H&#@.$@`!\@60`""$"5%@RAP`NX5``$0:``,@A`J
+MBZP0(``#```%@A!B7("A``$(2``(KA`@`((0(J.#*'`#[A4``8(0*HV"`$`!
+M[!4``:(0(`"2$"``@A`A28,H<`3Z%0`!@A`J2X(`0`'X%0`!PA4``8"@``&"
+M8#__JA```8(0)3D0:``R@RAP`H,H<`+N%@`!@A`JCX(`0`'L%@`!@A`E28,H
+M<`+2%@`!@A`BI8,H<`/B%@`!@A`J28(`0`'Z%@`!@A`BDX,H<`/X%@`!PA8`
+M`8"@``&"8#__JA```8(0*G,0:``:@@!``8(0(*F#*'`%[A8``8(0*I&"`$`!
+M[!8``8(0*I."`$`!TA8``8(0*I6"`$`!XA8``8(0)26#*'`"^A8``8(0*DV"
+M`$`!^!8``<(6``&`H``!@F`__ZH0``&"$"*=@RAP`_85``&@$"``E@>G[P,`
+M``"8$&``@RZP,)LP<#")/"``BRDP`HH!0`N"`0`$@@!`!((`0`&"`$`-@RAP
+M`L(#``&@!"`!@*0@$`A/__7"(7^PPA9@`H((8("`H&```D@`$*`0(`"@!Z>?
+MDS)@`)`0`!"4$"`#EA`@=T````"8$"``DS1@`)`0`!"4$"`#EA`@>D````"8
+M$"``H!`@``,```"B$&``B3P@`((!``2"`$`$@RAP`]($0`&)*3`"B@>G_X(!
+M0`34`'^@0````)`0`!BD!*`!@@R@/X"@8``R2``%H`0@`4````"0$"`!H`0@
+M`8"D(!`(3__MB3P@`*`0(``#````HA!@`(,\(`"#*'`#T@1``8(`0!'4`&`$
+M0````)`0`!BD!*`!@@R@/X"@8``R2``%H(0@`4````"0$"`!H(0@`0)/__*#
+M/"``H!`@``,```"F$&``@RZP,*,P<#")/"``@@$`!((`0`2)*'`#T@3`!((`
+M0`&"`$`1@RAP`M0$P`%`````D!``&*0$H`&"#*`_@*!@`#)(``6@A"`!0```
+M`)`0(`&@A"`!`D__[HD\(`"@$"```P```*808`"#+K`PHS!P,(D\(`""`0`$
+M@@!`!(DH<`/2!,`$@@!``8(`0!&#*'`"U`3``4````"0$``8I`2@`8(,H#^`
+MH&``,D@`!:"$(`%`````D!`@`:"$(`$"3__NB3P@`*`0(`"6!Z?O`P```)@0
+M8`"#+K`PFS!P,(D\(`"+*3`"B@%`"X(!``2"`$`$@@!``8(`0`V#*'`"P@,`
+M`:`$(`&`I"`0"$__]<(A?[#"%F`"@@AA0("@84`22``3H`>GGX(0)6&#*'`"
+MTA4``9`0`!"4$"`!EA`@,T````"8$"`#@A`JPX(`0`'2%0`!D!``$)00(`&6
+M$"`M0````)@0(`.@!Z>?@RU@$("@``&20"``D!``$)00(`&6$"!?0````)@0
+M(`"3+V`0DS)@$)`0`!"4$"`$EA`@8$````"8$"``DRW@$),R8!"0$``0E!`@
+M`Y80(&A`````F!`@`),MH!"3,F`0D!``$)00(`.6$"!K0````)@0(`"@$"``
+M`P```*(08`")/"``@@$`!((`0`2#*'`#T@1``8DI,`**!Z?_@@%`!-0`?Z!`
+M````D!``&*0$H`&"#*`_@*!@`#)(``6@!"`!0````)`0(`&@!"`!@*0@$`A/
+M_^V)/"``H!`@`)@'I^\#````FA!@`(,NL#"U,'`PB3P@`(LI,`**`4`,@@$`
+M!((`0`2"`$`!@@!`&H,H<`+"`T`!H`0@`8"D(`<(3__UPB%_L*`'IY^3+N`0
+MDS)@$)`0`!"4$"`&EA`@'4````"8$"``DR\@$),R8!"0$``0E!`@`980(`1`
+M````F!`@`,(68`*#*&`0@*!@``9```:),&`0`P``$(")``$"2``<H!`@`,@6
+M8`(#```0@(D``:`0(!"A9&`?H@>GGY`0`!&2$"`?E!`@!980(!-`````F!`@
+M`*$T(`"0$``1DA``$)00(`66$"`80````)@0(`"0$``1DA`@`Y00(`*6$"`Q
+M0````)@0(`"@$"```P```*(08`")/"``@@$`!((`0`2#*'`#T@1``8DI,`**
+M!Z?_@@%`!-0`?Z!`````D!``&*0$H`&"#*`_@*!@`#)(``6@!"`!0````)`0
+M(`&@!"`!@*0@!PA/_^V)/"``@A`L;8,H<`+`)0`!L!`@`8'/X`@!````G>._
+M0(H0`!B"$``:NA``&YX0`!RV3L`<`L[`+;`0(`"#*&`0M3!@$(,N8!"S,&`0
+M@*:`&0)``"2($``=B2E@$(DQ(!"((0`9@@$`!((`0`2#*&`#@@!`!(,H8`*(
+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
+M,&`0PA$``("@0!D"0``%B@%@`8"A0`T&3__[B`$@-)$J,#"1,C`PD@$@"$``
+M``#4$2`&`0```('/X`@!````G>._0((0*0^A*'`#T%X`$`+*``:"$"&/0```
+M``$```#`=@`0@A`ACZ$H<`707@`0`LH`!0$```!``````0```,!V`!"!S^`(
+M`0```('#X`B0$"`!PA)``)@0``&#*&`0@S!@$`D```#($2``@*!`!!A```V*
+M$"```P```)H08`"#*R`0B3!@$(H!8`&#.6``@RAP`L(30`&`H0`!*$___(H!
+M8`&#.6``@RAP`@D```"($2``@@!`!('#X`C04&`"G>._0$````"0$""T@A`A
+MCX,H<`4"R@`,T'8``8@0((""$""1@RAP!\@F``%`````D!`@@((0*0^#*'`#
+M"LH`!M!V``&"$"`"PB9``!!H`"NP$"``"0```(@1(`""$"7/@RAP`\AV``$)
+M````B!$@`((0(%V#*'`'R'8``0D```"($2``@A`ET8,H<`/(=@`!"0```(@1
+M(`""$"+I@RAP!,AV``$)````B!$@`((0)=.#*'`#R'8``0D```"($2``@A`A
+M=8,H<`7(=@`!"0```(@1(`""$"75@RAP`\AV``$)````B!$@`((0(NN#*'`$
+MR'8``;`0(`&!S^`(`0````$`````````````````````````````````````
+M`````````)WCOT"@$"```P```*(08`")/"``@@$`!((`0`2)*'`#T@1`!((`
+M0`&"`$`9@RAP`M0$0`%`````D!``&+8&X`&"#N`_@*!@`#)(``6@!"`!0```
+M`)`0(`&@!"`!@*0@#PA/_^V)/"``LA`@``,```"@$&``@SY@`(,H<`/2!``!
+M@@!`$-0`8`1`````D!``&+8&X`&"#N`_@*!@`#)(``6R!F`!0````)`0(`&R
+M!F`!@*9@1`A/__&#/F``LA`@``,```"@$&``B3Y@`((!``2"`$`$B2AP`M($
+M``2)-J``@@!`!(,H<`+4!``!0````)`0`!BV!N`!@@[@/X"@8``R2``%L@9@
+M`4````"0$"`!L@9@`8"F8#\(3__MB3Y@`('/X`@!````G>._0*80`!BH$"``
+MVA9```,```2"$&*_@*-``1A(`#ND$"``B@-W<(LY8`"):6`%@RDP`H(`0`2*
+M(4`!B`-`#0,___N"$&+@H@$``8,\8`"`H6```D@`$Z-H8`K:%D``B@-W4(LY
+M8`"):6`%@RDP`H(`0`2*(4`!F@-`#0,___N"$&*@H@-``8,\8`"C:&`*J!`@
+M`8"A8``22`"CL!`@`*,L8`*0#&#_0````)(0(`BB$``(D!``$R$`*(%`````
+MDS0P",(60`"`H&FT,D@`!Y0*/^^4$B`0E3*@`)`0`!,0:``&DS0P")4RH`"0
+M$``3$P`H@9,R<`A`````H2Q@!!!H`'2#+*`"PA9``(IH8`6)*7`"B`$`!8(@
+M0`2#*&`0@S!@$("@8`(22``;VA9``(DK8!"),2`0`P``!8(083N`H0`!.$@`
+M%<(60`""`W_^@RA@$(,P8!"1*&`"D`(``9`"``@#/__1@A!@@)`"``&1.B``
+MD6H@&9`"(`&1,B``0````)(0(`BB$``($&@`3)`0(`#"%D``BFA@%(DI<`*(
+M`0`%B2DP`H(@0`2#*&`0@*!@`!)(`!7:%D``@RM@$(DP8!`#```$@A!C_X"A
+M``$H2``/PA9``!$___N0$B%`D`$`")$Z(`"1:B`4D2H@`I$R(`!`````DA`@
+M"*(0``@0:``OD!`@`\(60`"*:&`*B2EP`H@!``6(`0`$@B!`!(,H8!"`H&``
+M$D@`$-`60`"1*B`0D3(@$`,___N"$&%`D`(``9$Z(`"1:B`*D`(`")$R(`!`
+M````DA`@"*(0``@0:``7D!`@`L(60`"*:&`%B2EP`H@!``6"($`$@RA@$("@
+M8``22``HL!`@`)$J(!"1,B`0`S__^X(084"0`@`!D3H@`)%J(`61,B``0```
+M`)(0(`BB$``(D!`@`4````"2$"`"I!``"*$L8`2#+*`"H!0``8(%`!2@%``!
+M`P``!((08`&@%``!E`P@_Y`0`!,3`"8G0````),R<`BA-"`(E`P@?Y`0`!,3
+M`!,;0````),R<`>"$")]@RAP`_)TP`&P$"`!@<_@"`$```""$"&/@RAP!8"B
+M8`<80``1T%H``8,R8`"#*'`""0```(@1(`#"`0`!@<!```$````0:``)D`(@
+M!!!H``>0`B`($&@`!9`"(`P0:``#D`(@K)`0(`"!P^`(`0```)WCOT"H$``8
+MN!`@`+H0(`"L$"``KA`@`((0(8^#*'`%Y%X``8(0(MV#*'`$H@8``<(68`*"
+M"&'P@*!@T`)``%:F$"``@*!@T!1(``F`H&%0@*!@H`)``$2`H&#`(D``3X(0
+M*I,0:`(%L!`@``)```>`H&%0-$@``X"@:`"`H&%`,D@!_K`0(`#"%D``@@!P
+M7X,H8!"#,&`0@*!DZCA(``?"%D``@A`E0X,H<`+X%0`!$&@`)8(0*H<)/__Z
+MB!$C=((`0`2#*&`0@S!@$("@8.\X2``'PA9``((0(5&#*'`$^!4``1!H`!B"
+M$"J)"3__^H@1(H2"`$`$@RA@$(,P8!"`H&#@.$@`!\@60`""$"5%@RAP`O@5
+M``$0:``+@A`JBP,```6"$&)<@*$``2A(``F"$"I+@A`BHX,H<`/X%0`!@A`J
+MC8(`0`'Z%0`!@A`J2X(`0`'2%0`!@A`E.1!H`!>#*'`"@A`E28,H<`+L%@`!
+M@A`BI8,H<`/N%@`!@A`BDX,H<`/2%@`!@A`J<Q!H``N"`$`!@A`JDX(`0`'L
+M%0`!KA``%H(0*DV"`$`!TA4``8(0(IV#*'`#ZA4``8H0(``#````FA!@`(,Y
+M8`")*'`"@RAP`X(`0`W"`&`$BH%@`0)/__K")(`$FA`@``,```"6$&``@RZP
+M,)DP<#").V``BRDP`HH!0!*"`0`$@@!`!((`0`&"`$`,@RAP`L("P`&:@V`!
+M`D__]L(A8`2:$"```P```)808`"#+K`PF3!P,(D[8`"+*3`"B@%`$H(!``2"
+M`$`$@@!``8(`0`R#*'`"P@+``9J#8`$"3__VPB%@")H0(``#````EA!@`(,N
+ML#"9,'`PB3M@`(LI,`**`4`2@@$`!((`0`2"`$`!@@!`#(,H<`+"`L`!F@-@
+M`8"C8"<(3__UPB%@#*`$H`R3*F`0DS)@$)`0`!"4$"`!EA`A+D````"8$"``
+MTA;``)`0`!"4$"`"EA`A#D````"8$"``TA;@`I`0`!"4$"`"EA`A`4````"8
+M$"``PA9@`H((8$"`H&``(D@`,\(68`+"7&`@TE!@`I,R8`"0$``0E!`@`980
+M(*A`````F!`@`\)<8"#24&`$DS)@`)`0`!"4$"`!EA`@J4````"8$"`#PEQ@
+M(-)08`:3,F``D!``$)00(`&6$""J0````)@0(`/"7&`@TE!@"),R8`"0$``0
+ME!`@`980(*Y`````F!`@`\)<8"#24&`*DS)@`)`0`!"4$"`!EA`@KT````"8
+M$"`#PEQ@(-)08`R3,F``D!``$)00(`&6$""P0````)@0(`/"%F`"@@A@@("@
+M8``"2``/H`2@#),MH!"3,F`0D!``$)00(`.6$"$?0````)@0(`"3+>`0DS)@
+M$)`0`!"4$"`#$&@`#I80(2*3+R`0DS)@$)`0`!"4$"`#EA`A%T````"8$"``
+MDR]@$),R8!"0$``0E!`@`Y80(1I`````F!`@`,H6(X2""6#P@@!_T("@8#\X
+M2``IPA8C@H(98#6`H``!B&`__X(98$6`H``!@F`__X"1``$20``&@*%@1@)`
+M``2`H6`V,D@`',(6(X*@!*`,D!``$)(0(`*4$"`"EA`@6D````"8$"`"D!``
+M$)(0(`*4$"`"EA`@7$````"8$"`"D!``$)(0(`*4$"`"EA`@7D````"8$"`"
+MD!``$)(0(`*4$"`!EA`@_D````"8$"`"PA8C@H"@8$$(2``BFA`@`*`$H`R0
+M$``0DA`@`900(`&6$"$90````)@0(`&0$``0DA`@`900(`*6$"`!0````)@0
+M(`.0$``0DA`@`900(`*6$"`#0````)@0(`.0$``0DA`@`900(`&6$""+0```
+M`)@0(`.0$``0DA`@`900(`&6$"",0````)@0(`.:$"```P```)@08`"#+K`P
+MM3!P,(D[8`"+*3`"B@%`$H(!``2"`$`$@@!``8(`0!J#*'`"P@,``9H#8`&`
+MHV`,"$__]<(A8*S"%F`"@@A@0("@8``"2``*D`2@K,)<8"#24$``DS)@`)00
+M(`*6$"`E0````)@0(`"0!*"LDRU@$),R8!"4$"`&EA`@#D````"8$"``PA9@
+M`HLH8!"),6`0`P``$(")``$R2``'R!9@`H"A8``62``6H!`@`,@68`(#```0
+M@(D``:`0(`BA9&`/H@2@K)`0`!&2$"`/E!`@!)80(#I`````F!`@`*$T(`"0
+M$``1DA``$)00(`26$"!&0````)@0(`"@$"```P```*(08`"#/"``B2AP`]($
+M0`2#*'`"U`2``4````"0$``8I@3@`8(,X#^`H&``,D@`!:"$(`%`````D!`@
+M`:"$(`$"3__R@SP@`*`0(``#````HA!@`(D\(`""`0`$@@!`!(,H<`/2!$`!
+MB2DP`H@!`!+4`2`$0````)`0`!BF!.`!@@S@/X"@8``R2``%H(0@`4````"0
+M$"`!H(0@`0)/_^^)/"``H!`@``,```"B$&``B3P@`((!``2"`$`$@RAP`]($
+M0`&)*3`"B`$`$M0!(`A`````D!``&*8$X`&"#.`_@*!@`#)(``6@A"`!0```
+M`)`0(`&@A"`!`D__[XD\(`"@$"```P```*(08`")/"``@@$`!((`0`2#*'`#
+MT@1``8DI,`*(`0`2U`$@#$````"0$``8I@3@`8(,X#^`H&``,D@`!:`$(`%`
+M````D!`@`:`$(`&`I"`G"$__[HD\(`"@$"```P```*(08`")/"``@@$`!((`
+M0`2#*'`#T@1``8DI,`*(`0`2U`$@K$````"0$``8I@3@`8(,X#^`H&``,D@`
+M!:`$(`%`````D!`@`:`$(`&`I"`,"$__[HD\(`""$"QM@RAP`L`E``&P$"`!
+M@<_@"`$```"=X[LP\G>HA_1WJ(_*%B.$@@E@\((`?]"`H&`_&$@`$[00`!R"
+M&6`U@*```8A@/_^"&6!%@*```8)@/_^`D0`!,D@`"((0(`*`H6!&`D``!("A
+M8#822``&B!`@`8(0(`(0:``$PB>D"X@0(`'()Z0+PA;@`H((8?"`H&#0(D``
+M'X(0((<42``)@*!A4("@8*`"0``3@*!@P`)``!>:$"``$&@!B`$````"0``'
+M@*!A4#1(``.`H&@`@*!A0!)(`8&:$"``@A`B&8,H<`2L!@`!@A`A21!H``V#
+M*'`$@A`D-8,H<`.L!@`!@A`J21!H``>"`$`!@A`@AX,H<`:L!@`!@A`E)8,H
+M<`+(%@`!PA6@"H")``$"2`%KFA`@`,I?J(_"44``@@!``<(WH^W(7ZB'PE$`
+M`((`0`'"-Z/]`S__]X(08JW"-Z0?PC>D(:@0(`"D$"``R!6@"HH'I^^#.0`2
+M@@A@`8"@8``$0``)@*4@`1A``52:$"``@S4@`((`0`&"`$`%Y#!\,*@%(`&D
+M!*`!@*2@`PA/__.#.0`2T!;``-05H`C278``E@>D%T```5^8!Z03Z@>D%\('
+MI!.`I4`!&$``<*@0(`"Z!Z;/K@>FK[('I:^X!Z0OB35@`(,I,`*"`$`$@RAP
+M`H(`0`2#*'`"R%V@$*8`0`3(%Z0A`P``-X(08JV`H0`!$D@`'<(7I!^A*'`"
+MH`0``:$L,`*@!``3D@0@".04(`:B!(`2D!``'4````"4$``1H`0@$)`0`!>2
+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
+M,2`?@(A`!!)/__2(`7__EA`@/X(!?_^#*&`0@S!@$("@8#X80``7@REP,(,X
+M<"_(4@`!@RL@$(,X8!"`H0`!)D``$8,I8!"($``!@@%__XH0``&"`'__@RA@
+M$(,P8!"`H&`^&$``!X,I<#"#.'`OPE(``8"@0`063__V@@%__X,I8!"`H&``
+M$D@`$X,J\#"#*N`0@*!@`"9``!B1*J`0@RKP,(,X<"^(`$`)R!$@`L@R0`&"
+M`O__EA```8,H8!"`H&``%D__^(,J\#`0:``+D2J@$(,X<"_*,D`!@@+__Y80
+M``&#*&`0@*!@`!9/_\J8`S_^D2J@$)$Z(!"!P^`(D3H@`)WCOT">$``9LA``
+M&IH0`!NT$"!`PA8@?LA6('[*4\``B"$`!8"A('X42``#F`!_@M@3P`#X%B!^
+MBA`@/X,O(!"#.&`0N@!__X@!?_^*$``$@REP,(,X<"_"5@`!@*!`'8(0(`"#
+M9J`!B2D@$(DY(!"(.``$B3$@'X"(0`023__TB`%__\(3X'[",T``MA`@/X,O
+M(!"#.&`0R%-``("@0`0D2``,M!`@`(,I8!"`H``!B&`__X,NH!"`H``!@D`@
+M`(")``$"2``&@RE@$+00(`"P$``/BA`@/X,I8!"`H&``!$``%(,I<#"#.'`O
+MR%8``8,O(!"#.&`0@*$``09```V($``!@@%__XH0``&#*&`0@*!@``1```>#
+M*7`P@SAP+\)6``&`H$`$%D__^((!?_^#*6`0@*```8A@/_^#+J`0@*```8)@
+M/_^`B0`!`D@`$X,N\#"#+N`0@*!@`"9``!FQ*R`0@R[P,(,X<"^(`$`9R!$@
+M`L@V0`&"!O__MA```8,H8!"`H&``%D__^(,N\#`0:``,L2L@$(,X<"^($4`:
+MR#9``8(&__^V$``!@RA@$("@8``63_^WN`<__K$K(!"Q/B`0@<_@")$Z(`"=
+MX[]`@A`I#Z$H<`/07@`0`LH`!H(0(8]``````0```,!V`!""$"&/H2AP!=!>
+M`!`"R@`%`0```$`````!````P'8`$('/X`@!````V!)@!)00(`":$"`!B3M@
+M`(,I,`*"`$`$@RAP`H(`0`G*$&`$R!!@!(,K(!"#.&`0@*$``39(``6:`V`!
+ME!``#9@0``6:`V`!@*-@`P1/__&).V``B3J@`(,I,`*"`$`$@RAP`H(`0`G6
+M$&`0T!!@")H0(`&#*3`"@@!`!)0`0`&#.V``@@*``8(`0`&*`$`)R%%@$(,J
+MX!"#.&`0@*$``19(``38$6`0EA``#-`18`B:`V`!@*-@`P1/__.#.V``D2H@
+M$)$Z(`^0(L`(D2H@$)$Z(!"!P^`(D3H@`)WCOT#`-H``PA9@`H((84"`H&%`
+M$D@`"*P0`!B"$"(9@RAP!((&``'F6&`0$&@`',H08`C"%F`"@@A@T(@88,"`
+MH``$B&`__X(88-"`H``!@F`__X"1``$B2``(PA9@`H(0(AF#*'`$@@8``>98
+M8$`0:``+RA!@.(((8*"`H&"@$D@`D;`0(`&"$"(9@RAP!((%@`'F6&`HRA!@
+M(("A8``$0`")L!`@`-H60`#"%,``@*-``2I(`!+"%.`"@SE@`(DH<`*(`0`!
+MB2DP`H@!``&)*3`"B`$`$\(1/ZR`HT`!*$@`%9H0(`#"%,``@*-``1I(``>#
+M.6``PA3@`L(V@`"0$``6$&@`;)(0`!.3*'`"D@)``9,J<`*2`D`!DRIP`I("
+M0!/"$G^NPC:``!!H`&&2`G^L@*-`!19``!F6$"``PA9``)@0``&#*&`0@S!@
+M$,@4P`"`H$`$"$``$8,K(!"9,&`0EA``#9H#8`&`HT`%%D``"X,[8`")*'`"
+MB`$``8DI,`*(`0`!B2DP`L(4P`2`HP`!.$__]980``V).V``@RDP`H(`0`2#
+M*'`"@@!`!(LH<`+H%,`%B3K@`(,I,`*"`$`$@RAP`H(`0`2K*'`"V!3`%:@E
+M``R`I2``!$``)Y($P`7"4F`"H@3`%<I48`*"($`%R!9``(@A``R"2$`$BDE`
+M%((`0`6#.&``I3T@`(-H0!*#*&`8@SA@&,(V@`!___]!D!``%J`0``B0$``6
+M?___/9(0`!&@)``(PA9``,@4P!6"($`$H$P``9`0`!9___\UDA``$9!-``B@
+M!``(H3P@`*%L`!*A+"`8H3P@&!!H`!3@-L``B3M@`(,I,`*"`$`$@RAP`H(`
+M0`23*'`"R!9``,(4P`F`H0`!$D@`"K`0(`"2!,`)PA)@`L(V@`"0$``6?___
+M'`$```#0-L``L!`@`8'/X`@!````G>._,*(0(`"`I$`:&D``%J00(`&H!Z?M
+MI@>GZX,\8`"#*'`#H`9``9`0`!B2$``0E`>G[7___T"6!Z?K(LH`!J00(`#"
+M#2`!PBP@!L(,X`'"+"`'H@1@`8"D0!H*3__Q@SQ@`+$TH`"!S^`(`0```)WC
+MOT!`````D!`@X((0(8^#*'`%`LH`#-!V``&($""`@A`@D8,H<`?()@`!0```
+M`)`0((""$"D/@RAP`PK*``;0=@`!@A`@`L(F0``0:``OL!`@`(@0($""$""1
+M@RAP!\@F``$)````B!$@`((0)<^#*'`#R'8``0D```"($2``@A`@78,H<`?(
+M=@`!"0```(@1(`""$"71@RAP`\AV``$)````B!$@`((0(NF#*'`$R'8``0D`
+M``"($2``@A`ETX,H<`/(=@`!"0```(@1(`""$"%U@RAP!<AV``$)````B!$@
+M`((0)=6#*'`#R'8``0D```"($2``@A`BZX,H<`3(=@`!L!`@`8'/X`@!````
+M`0``````````````````````````````````````````````G>._0*`0(``#
+M````HA!@`(D\(`""`0`$@@!`!(DH<`/2!$`$@@!``8(`0!F#*'`"U`1``4``
+M``"0$``8M@;@`8(.X#^`H&``,D@`!:`$(`%`````D!`@`:`$(`&`I"`/"$__
+M[8D\(`"R$"```P```*`08`"#/F``@RAP`]($``&"`$`0U`!@!$````"0$``8
+MM@;@`8(.X#^`H&``,D@`!;(&8`%`````D!`@`;(&8`&`IF"*"$__\8,^8`"R
+M$"```P```*`08`")/F``@@$`!((`0`2)*'`"T@0`!(DVH`""`$`$@RAP`M0$
+M``%`````D!``&+8&X`&"#N`_@*!@`#)(``6R!F`!0````)`0(`&R!F`!@*9@
+M/PA/_^V)/F``@<_@"`$```"=X[]`IA``&*@0(`#:%D```P``!((08K^`HT`!
+M&$@`.Z00(`"*`W=PBSE@`(EI8`6#*3`"@@!`!(HA0`&(`T`-`S__^X(08N"B
+M`0`!@SQ@`("A8``"2``3HVA@"MH60`"*`W=0BSE@`(EI8`6#*3`"@@!`!(HA
+M0`&:`T`-`S__^X(08J"B`T`!@SQ@`*-H8`JH$"`!@*%@`!)(`*.P$"``HRQ@
+M`I`,8/]`````DA`@"*(0``B0$``3(0`H@4````"3-#`(PA9``("@:;0R2``'
+ME`H_[Y02(!"5,J``D!``$Q!H``:3-#`(E3*@`)`0`!,3`"B!DS)P"$````"A
+M+&`$$&@`=(,LH`+"%D``BFA@!8DI<`*(`0`%@B!`!(,H8!"#,&`0@*!@`A)(
+M`!O:%D``B2M@$(DQ(!`#```%@A!A.X"A``$X2``5PA9``((#?_Z#*&`0@S!@
+M$)$H8`*0`@`!D`(`"`,__]&"$&"`D`(``9$Z(`"1:B`9D`(@`9$R(`!`````
+MDA`@"*(0``@0:`!,D!`@`,(60`"*:&`4B2EP`H@!``6)*3`"@B!`!(,H8!"`
+MH&``$D@`%=H60`"#*V`0B3!@$`,```2"$&/_@*$``2A(``_"%D``$3__^Y`2
+M(4"0`0`(D3H@`)%J(!21*B`"D3(@`$````"2$"`(HA``"!!H`"^0$"`#PA9`
+M`(IH8`J)*7`"B`$`!8@!``2"($`$@RA@$("@8``22``0T!9``)$J(!"1,B`0
+M`S__^X(084"0`@`!D3H@`)%J(`J0`@`(D3(@`$````"2$"`(HA``"!!H`!>0
+M$"`"PA9``(IH8`6)*7`"B`$`!8(@0`2#*&`0@*!@`!)(`"BP$"``D2H@$)$R
+M(!`#/__[@A!A0)`"``&1.B``D6H@!9$R(`!`````DA`@"*(0``B0$"`!0```
+M`)(0(`*D$``(H2Q@!(,LH`*@%``!@@4`%*`4``$#```$@A!@`:`4``&4#"#_
+MD!``$Q,`)B=`````DS)P"*$T(`B4#"!_D!``$Q,`$QM`````DS)P!X(0(GV#
+M*'`#\G3``;`0(`&!S^`(`0```)WCOT"F$``8@A`ACX,H<`7B7@`!PA9@`H((
+M8?"`H&#``D``$J00(`"`H&#`%$@`!X"@8-"`H&"@`D``"((0)4<0:`#FL!`@
+M`")```F"$""I$&@`XK`0(`"#*'`"TA8``1!H``:"$"J/@A`@J8,H<`72%,`!
+M@A`JD8(`0`'R%,`!BA`@``,```":$&``@SE@`(DH<`*#*'`#@@!`#<(`8`2*
+M@6`!`D__^L(D0`2:$"```P```)808`"#+K`PF3!P,(D[8`"+*3`"B@%`$8(!
+M``2"`$`$@@!``8(`0`R#*'`"P@+``9J#8`$"3__VPB%@!)H0(``#````EA!@
+M`(,NL#"9,'`PB3M@`(LI,`**`4`1@@$`!((`0`2"`$`!@@!`#(,H<`+"`L`!
+MFH-@`0)/__;"(6`(FA`@``,```"6$&``@RZP,)DP<#").V``BRDP`HH!0!&"
+M`0`$@@!`!((`0`&"`$`,@RAP`L("P`&:`V`!@*-@&@A/__7"(6`,H`1@#),J
+M8!"3,F`0D!``$)00(`.6$""H0````)@0(`"3+F`0DS)@$)`0`!"4$"`#EA`@
+MI4````"8$"``FA`@``,```"8$&``@RZP,+4P<#").V``BRDP`HH!0!&"`0`$
+M@@!`!((`0`&"`$`:@RAP`L(#``&:`V`!@*-@`@A/__7"(6!XH!`@``,```"T
+M$&``@SP@`(DH<`/2!H`$@RAP`M0$0`%`````D!``&*0$H`&"#*`_@*!@`#)(
+M``6@A"`!0````)`0(`&@A"`!`D__\H,\(`"@$"```P```+008`")/"``@@$`
+M!((`0`2#*'`#T@:``8DI,`*(`0`1U`$@!$````"0$``8I`2@`8(,H#^`H&``
+M,D@`!:"$(`%`````D!`@`:"$(`$"3__OB3P@`*`0(``#````M!!@`(D\(`""
+M`0`$@@!`!(,H<`/2!H`!B2DP`H@!`!'4`2`(0````)`0`!BD!*`!@@R@/X"@
+M8``R2``%H(0@`4````"0$"`!H(0@`0)/_^^)/"``H!`@``,```"T$&``B3P@
+M`((!``2"`$`$@RAP`](&@`&)*3`"B`$`$=0!(`Q`````D!``&*0$H`&"#*`_
+M@*!@`#)(``6@!"`!0````)`0(`&@!"`!@*0@&@A/_^Z)/"``H!`@``,```"T
+M$&``B3P@`((!``2"`$`$@RAP`](&@`&)*3`"B`$`$=0!('A`````D!``&*0$
+MH`&"#*`_@*!@`#)(``6@!"`!0````)`0(`&@!"`!@*0@`@A/_^Z)/"``@A`L
+M;8,H<`+`),`!L!`@`8'/X`@!````@A`ACX,H<`6`HF`'&$``$=!:``&#,F``
+M@RAP`@D```"($2``P@$``8'`0``!````$&@`"9`"(`00:``'D`(@"!!H``60
+M`B`,$&@``Y`"('B0$"``@</@"`$```":$``*E`*`"H,J(!"#.&`0R!)``("@
+M0`062``%B@)`"L`C```0:``EP"+``(,J(!"#.&`0R!%__H"@0`0&2``/@*)`
+M!8,K8!"#,&`0$&@``X(`?_^#.'`!PB,``!!H`!?"(L``@SAP`<(BP`""`&`!
+M$&@`$L(C```:8``0B!``"8,J(!"1.&`0PA$``("@0`@"1__Q@B$`"<(1(`*`
+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
+M*'`&@@!`!((`0`&0`$`9@RE@$),P8!"#*N`0F3A@$(@C0`J(20`)PA(D`(@!
+M``&+-&``B@%`!:($8`&#*2`0@SA@$("@8'^)9J!_F@-@`8"C0`P&3__SR#5`
+M!:@%(`&`I0`6"D__:8(%O_^`I2`#&$``#8"D8'^#-2``@@!``8@%/_^),2``
+MB`$`!,@70`2H!2`!@*4@`PA/__C(-T`!@*1@?QA```P!````@S1@`((`0`&(
+M!'__B3$@`(@!``3(%4`$H@1@`8"D8'\(3__XR#5``8'/X`@!````G>._$*80
+M`!B"$"D/@RAP`^)>``'"%N`"@@A@T(@88,"`H``$BF`__X(88-"`H``!B&`_
+M_X(0)3>#*'`#@)%`!!)(``ND!@`!R!;@`H@)(*""$"EI@RAP`H"A(*`"0``$
+MI`8``1!H`&JP$"``D!``&!,`*)M`````DS)P"*@*(`_2%L``E@T@#_ASJ*_B
+M<ZBWD!``&)00`!*8!Z?=?__^5YH'I]^0$``8(0`42T````"3-#`'%0``,)0J
+M``K"%*`<@@!__X,H8`X)```P@@A`!)02@`&5,J``D!``&$````"3-#`'PE>G
+MW8"@8``"2``'R!>GW8@@``2"$"Q[@RAP`A!H``7(-,`!@A`L>X,H<`+`-,`!
+M`P``*+@08H"@$"``B2P@`H,Q(`""`$`!U!1``90*H/^"`2`!@S!@`((`0`'"
+M%$`!@@A@_X,H8`B4$H`!@@$@`H,P8`""`$`!PA1``8((8/^#*&`0E!*``8@!
+M(`.),2``B`$`!,(40`2#*&`8E!*``9,W(`"5,J``0````)`0`!B@!"`!@*0@
+M'PA/_^&X!R`$E`T@#\(7I]^#*&`$@@AC\)02@`'"%Z?A@RA@"@D``#^""$`$
+ME!*``<(7I^.#*&`0"0`/P(((0`24$H`!PA>GY8,H8!8)`_``@@A`!)02@`&5
+M,J``D!``&!,`*)M`````DS)P"+`0(`&!S^`(`0```)WCOT""$"D/H2AP`]!>
+M`!`"R@`&@A`ACT`````!````P'8`$((0(8^A*'`%T%X`$`+*``:"$"+G0```
+M``$```#`=@`0@A`BYZ$H<`307@`0`LH`!0$```!``````0```,!V`!"!S^`(
+M`0```(H0(`":$"`#@B-`!8,P8`"(`$`!B`$``8DI,`.(`0`)PA$@"("@8``B
+M2``$B@%@`1!H``G042`4@*%@`PA/__2"(T`%@A`@`(,H8!"#.&`0D3A@`('#
+MX`@!````BA`@`(DQ8`""`0`$F@!`!(,K<`."`$`)R!!@",(08`B`H&``(D@`
+M"HH!8`&)*3`PB3$P,(,K<`*"`$`$@@!``8(`0`D0:``)T%!@$H"A8`,(3__N
+MB3%@`((0(`"#*&`0@SA@$)$X8`"!P^`(`0```)WCOT"J$``8P#:``,(68`*"
+M"&#0B!A@P("@``2*8#__@AA@T("@``&(8#__@A`E-X,H<`.`D4`$$D@`"H(&
+M``'(%F`"B`D@H((0*6F#*'`"@@8``8"A(*`22`"AL!`@`*@`8!C*$&`4PA!@
+M%("@8``"2`";L!`@`-H60`#"%0``@*-``0I(`!.0$``5B2EP,(DQ,#""`0`$
+M@@!`!(DH<`2"`$`$@@!``8(`0!3"$'^:@*-``0A(`!:6$"``PA4``("C0`$:
+M2``)@REP,)`0`!5___^PDA``%-`V@`"0$``5$&@`>Y(0`!2#,'`PH`!``:`$
+M``&#+#`$H`0``:`$`!"@!0`0$&@`;*`$/YJ#*6`0F!```8"@8``"0``:BA`@
+M`,(60`":$``!@RA@$(,P8!#(%0``@*!`!`A``!*#*V`0F3,@$)LP8!"6$``%
+MB@%@`8"A0`P60``+B3E@`((!``2"`$`$B2AP!((`0`2"`$`!PA4``8"C0`$X
+M3__UEA``!8DY8`""`0`$@@!`!(DH<`2"`$`$F@!``?`5``V).N``@@$`!((`
+M0`2)*'`$@@!`!*P`0`'"%0`6L"8``8"F(``$0``QI@4`#9`0`!5___]QDA``
+M$Z`0``BB!0`6D!``%7___VR2$``1H"0`",(60`#(%0`6@B!`!*!,``&0$``5
+M?___9)(0`!&03@`(H`0`"*$\(`"E/B``H6P`$J$L(!BA/"`8X#:``)`0`!5_
+M__]"DA``$Z`0``B0$``5?___/I(0`!&@)``(PA9``,@5`!:"($`$H$P``9`0
+M`!5___\VDA``$9!.``B@!``(H3P@`*%L`!*A+"`8H3P@&!!H`!?@-L``B3E@
+M`((!``2"`$`$B2AP!((`0`22`$`!R!9``,(5``F`H0`!$D@`#;`0(`"@!0`)
+MD!``%7___S:2$``0T#:``)`0`!62$``0?___&@$```#0-L``L!`@`8'/X`@!
+M````G>._,*(0(`"`I$`:&D``%J00(`&H!Z?MI@>GZX,\8`"#*'`#H`9``9`0
+M`!B2$``0E`>G[7___SJ6!Z?K(LH`!J00(`#"#2`!PBP@!L(,X`'"+"`'H@1@
+M`8"D0!H*3__Q@SQ@`+$TH`"!S^`(`0```)WCOT!`````D!`@A((0(8^#*'`%
+M`LH`$M!V``&($"$`@A`@D8,H<`?()@`!0````)`0(0""$"D/@RAP`P+*``C0
+M=@`!0````)`0)@""$"+G@RAP!`K*``;0=@`!@A`@`L(F0``0:``KL!`@``D`
+M``"($2``@A`ESX,H<`/(=@`!"0```(@1(`""$"!=@RAP!\AV``$)````B!$@
+M`((0)=&#*'`#R'8``0D```"($2``@A`BZ8,H<`3(=@`!"0```(@1(`""$"73
+M@RAP`\AV``$)````B!$@`((0(76#*'`%R'8``0D```"($2``@A`EU8,H<`/(
+M=@`!"0```(@1(`""$"+K@RAP!,AV``&P$"`!@<_@"`$`````````````````
+M`````````````````````````````)WCOT"@$"```P```*(08`")/"``@@$`
+M!((`0`2)*'`#T@1`!((`0`&"`$`9@RAP`M0$0`%`````D!``&+8&X`&"#N`_
+M@*!@`#)(``6@!"`!0````)`0(`&@!"`!@*0@'0A/_^V)/"``LA`@``,```"@
+M$&``@SY@`(,H<`/2!``!@@!`$-0`8`1`````D!``&+8&X`&"#N`_@*!@`#)(
+M``6R!F`!0````)`0(`&R!F`!@*9@?PA/__&#/F``LA`@``,```"@$&``B3Y@
+M`((!``2"`$`$B2AP`M($``2)-J``@@!`!(,H<`+4!``!0````)`0`!BV!N`!
+M@@[@/X"@8``R2``%L@9@`4````"0$"`!L@9@`8"F8#\(3__MB3Y@`('/X`@!
+M````G>._0*80`!BH$"``VA9```,```2"$&*_@*-``1A(`#ND$"``B@-W<(LY
+M8`"):6`%@RDP`H(`0`2*(4`!B`-`#0,___N"$&+@H@$``8,\8`"`H6```D@`
+M$Z-H8`K:%D``B@-W4(LY8`"):6`%@RDP`H(`0`2*(4`!F@-`#0,___N"$&*@
+MH@-``8,\8`"C:&`*J!`@`8"A8``22`"7L!`@`*,L8`*0#&#_0````)(0(`BB
+M$``(D!``$R$`*(%`````DS0P",(60`"`H&FT,D@`!Y0*/^^4$B`0E3*@`)`0
+M`!,0:``&DS0P")4RH`"0$``3$P`H@9,R<`A`````H2Q@!!!H`&B#+*`"PA9`
+M`(IH8`6)*7`"B`$`!8(@0`2#*&`0@S!@$("@8`(22``;VA9``(DK8!"),2`0
+M`P``!8(083N`H0`!.$@`%<(60`""`W_^@RA@$(,P8!"1*&`"D`(``9`"``@#
+M/__1@A!@@)`"``&1.B``D6H@&9`"(`&1,B``0````)(0(`BB$``($&@`0)`0
+M(`#"%D``BFA@%(DI<`*(`0`%B2DP`H(@0`2#*&`0@*!@`!)(``[:%D``@RM@
+M$(DP8!`#```$@A!C_Q$___N0$B%`D`$`")$Z(`"1:B`4@*$``1A``"61*B`"
+MPA9``(IH8`J)*7`"B`$`!8@!``2"($`$@RA@$("@8``22``+T!9``)$J(!"1
+M,B`0`S__^X(084"0`@`!D3H@`)%J(`H0:``2D`(`",(60`"*:&`%B2EP`H@!
+M``6"($`$@RA@$("@8``22``HL!`@`)$J(!"1,B`0`S__^X(084"0`@`!D3H@
+M`)%J(`61,B``0````)(0(`BB$``(D!`@`4````"2$"`"I!``"*$L8`2#+*`"
+MH!0``8(%`!2@%``!`P``!((08`&@%``!E`P@_Y`0`!,3`"8G0````),R<`BA
+M-"`(E`P@?Y`0`!,3`!,;0````),R<`>"$")]@RAP`_)TP`&P$"`!@<_@"`$`
+M``"=X[]`IA``&)00(`"J$"``DA`@`*@0(`""$"&/@RAP!>)>``'"%F`"@@AA
+M\("@8-`"0`!'I!`@`("@8-`42``)@*!A0("@8*`"0``\@*!@P")``$""$""I
+M$&@!1;`0(``"0``$@*!A4#)(`4&P$"``PA9``((`<%^#*&`0@S!@$("@9.HX
+M2``'PA9``((0)4.#*'`"U!3``1!H`"6"$"J'"3__^H@1(W2"`$`$@RA@$(,P
+M8!"`H&#O.$@`!\(60`""$"%1@RAP!-04P`$0:``8@A`JB0D___J($2*$@@!`
+M!(,H8!"#,&`0@*!@X#A(``?(%D``@A`E18,H<`+4%,`!$&@`"X(0*HL#```%
+M@A!B7("A``$(2``5BA`@`((0(J.#*'`#U!3``8(0*HV"`$`!$&@`#>H4P`&"
+M$"5'@RAP`M(6``$0:``&@A`JCX(0(*F#*'`%TA3``8(0*I&"`$`!Z!3``8H0
+M(``#````FA!@`(,Y8`")*'`"@RAP`X(`0`W"`&`$BH%@`0)/__K")$`$FA`@
+M``,```"6$&``@RZP,)DP<#").V``BRDP`HH!0!&"`0`$@@!`!((`0`&"`$`,
+M@RAP`L("P`&:@V`!`D__]L(A8`2:$"```P```)808`"#+K`PF3!P,(D[8`"+
+M*3`"B@%`$8(!``2"`$`$@@!``8(`0`R#*'`"P@+``9J#8`$"3__VPB%@")H0
+M(``#````EA!@`(,NL#"9,'`PB3M@`(LI,`**`4`1@@$`!((`0`2"`$`!@@!`
+M#(,H<`+"`L`!F@-@`8"C8"0(3__UPB%@#,(68`*""&"`@*!@``)(`"F@!&`,
+MDRI@$),R8!"0$``0E!`@`Y80(/%`````F!`@`),M(!"3,F`0D!``$)00(`.6
+M$"#N0````)@0(`"0$``0DA`@`900(`&6$"$C0````)@0(`+"!B-\@*!@"0)`
+M``B`H&`*$D@`'YH0(`#"%B.`@*!@`QA(`!P#````D!`@!D````"2$"`#DA``
+M")`$8`R4$"`#EA`@@Q!H``^8$"`#DRJ@$),R8!"0$``0E!`@`Y80(/=`````
+MF!`@`),M8!"3,F`0D!``$)00(`.6$"#TF!`@`$`````!````FA`@``,```"8
+M$&``@RZP,+4P<#").V``BRDP`HH!0!&"`0`$@@!`!((`0`&"`$`:@RAP`L(#
+M``&:`V`!@*-@`@A/__7"(6"@H!`@``,```"T$&``@SP@`(DH<`/2!H`$@RAP
+M`M0$0`%`````D!``&*0$H`&"#*`_@*!@`#)(``6@A"`!0````)`0(`&@A"`!
+M`D__\H,\(`"@$"```P```+008`")/"``@@$`!((`0`2#*'`#T@:``8DI,`*(
+M`0`1U`$@!$````"0$``8I`2@`8(,H#^`H&``,D@`!:"$(`%`````D!`@`:"$
+M(`$"3__OB3P@`*`0(``#````M!!@`(D\(`""`0`$@@!`!(,H<`/2!H`!B2DP
+M`H@!`!'4`2`(0````)`0`!BD!*`!@@R@/X"@8``R2``%H(0@`4````"0$"`!
+MH(0@`0)/_^^)/"``H!`@``,```"T$&``B3P@`((!``2"`$`$@RAP`](&@`&)
+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
+M(``$@A`L>X,H<`(0:``%R#3``8(0+'N#*'`"P#3``0,``"BX$&*`H!`@`(DL
+M(`*#,2``@@!``=040`&4"J#_@@$@`8,P8`""`$`!PA1``8((8/^#*&`(E!*`
+M`8(!(`*#,&``@@!``<(40`&""&#_@RA@$)02@`&(`2`#B3$@`(@!``3"%$`$
+M@RA@&)02@`&3-R``E3*@`$````"0$``8H`0@`8"D(!\(3__AN`<@!)0-(`_"
+M%Z??@RA@!(((8_"4$H`!PA>GX8,H8`H)```_@@A`!)02@`'"%Z?C@RA@$`D`
+M#\"""$`$E!*``<(7I^6#*&`6"0/P`(((0`24$H`!E3*@`)`0`!@3`"B;0```
+M`),R<`B!S^`(D!`@`9WCOT""$"D/H2AP`]!>`!`"R@`&@A`ACT`````!````
+MP'8`$((0(8^A*'`%T%X`$`+*``:"$"+G0`````$```#`=@`0@A`BYZ$H<`30
+M7@`0`LH`!0$```!``````0```,!V`!"!S^`(`0```(H0(`":$"`#@B-`!8,P
+M8`"(`$`!B`$``8DI,`.(`0`)PA$@"("@8``B2``$B@%@`1!H``G042`4@*%@
+M`PA/__2"(T`%@A`@`(,H8!"#.&`0D3A@`('#X`@!````BA`@`(DQ8`""`0`$
+MF@!`!(,K<`."`$`)R!!@",(08`B`H&``(D@`"HH!8`&)*3`PB3$P,(,K<`*"
+M`$`$@@!``8(`0`D0:``)T%!@$H"A8`,(3__NB3%@`((0(`"#*&`0@SA@$)$X
+M8`"!P^`(`0```)WCOT"J$``8P#:``,(68`*""&#0B!A@P("@``2*8#__@AA@
+MT("@``&(8#__@A`E-X,H<`.`D4`$$D@`#((&``'(%F`"B`D@H((0*6F#*'`"
+M@*$@H`)```6"!@`!@A`B&8,H<`2"!@`!J`!@&,H08!3"$&`4@*!@``)(`)NP
+M$"``VA9``,(5``"`HT`!"D@`$Y`0`!6)*7`PB3$P,((!``2"`$`$B2AP!((`
+M0`2"`$`!@@!`%,(0?YJ`HT`!"$@`%I80(`#"%0``@*-``1I(``F#*7`PD!``
+M%7___ZZ2$``4T#:``)`0`!40:`![DA``%(,P<#"@`$`!H`0``8,L,`2@!``!
+MH`0`$*`%`!`0:`!LH`0_FH,I8!"8$``!@*!@``)``!J*$"``PA9``)H0``&#
+M*&`0@S!@$,@5``"`H$`$"$``$H,K8!"9,R`0FS!@$)80``6*`6`!@*%`#!9`
+M``N).6``@@$`!((`0`2)*'`$@@!`!((`0`'"%0`!@*-``3A/__66$``%B3E@
+M`((!``2"`$`$B2AP!((`0`2:`$`!\!4`#8DZX`""`0`$@@!`!(DH<`2"`$`$
+MK`!``<(5`!:P)@`!@*8@``1``#&F!0`-D!``%7___V^2$``3H!``"*(%`!:0
+M$``5?___:I(0`!&@)``(PA9``,@5`!:"($`$H$P``9`0`!5___]BDA``$9!.
+M``B@!``(H3P@`*4^(`"A;``2H2P@&*$\(!C@-H``D!``%7___T"2$``3H!``
+M")`0`!5___\\DA``$:`D``C"%D``R!4`%H(@0`2@3``!D!``%7___S22$``1
+MD$X`"*`$``BA/"``H6P`$J$L(!BA/"`8$&@`%^`VP`").6``@@$`!((`0`2)
+M*'`$@@!`!)(`0`'(%D``PA4`"8"A``$22``-L!`@`*`%``F0$``5?___-)(0
+M`!#0-H``D!``%9(0`!!___\8`0```-`VP`"P$"`!@<_@"`$```"=X[\PHA`@
+M`("D0!H:0``6I!`@`:@'I^VF!Z?K@SQ@`(,H<`.@!D`!D!``&)(0`!"4!Z?M
+M?___.)8'I^LBR@`&I!`@`,(-(`'"+"`&P@S@`<(L(`>B!&`!@*1`&@I/__&#
+M/&``L32@`('/X`@!````G>._0$````"0$""L@A`ACX,H<`4"R@`2T'8``8@0
+M(0""$""1@RAP!\@F``%`````D!`A`((0*0^#*'`#`LH`"-!V``%`````D!`F
+M`((0(N>#*'`$"LH`!M!V``&"$"`"PB9``!!H`"NP$"``"0```(@1(`""$"7/
+M@RAP`\AV``$)````B!$@`((0(%V#*'`'R'8``0D```"($2``@A`ET8,H<`/(
+M=@`!"0```(@1(`""$"+I@RAP!,AV``$)````B!$@`((0)=.#*'`#R'8``0D`
+M``"($2``@A`A=8,H<`7(=@`!"0```(@1(`""$"75@RAP`\AV``$)````B!$@
+M`((0(NN#*'`$R'8``;`0(`&!S^`(`0````$````H4!8L6"C_H/^C_Y[_H/^C
+M_Z`````````````%``H`%``>`#(`1@!5`%H`7P!D````"@`4`!X`*``R`#P`
+M1@!0`%H`9````,(```#$````Q0```-````#:````Y````,(```##````U```
+M`/(```$-```!*````,\```#*``(A4``!`4``!`"@``@`P``@`-``0`%0````
+M`!F8`20&$"8`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````/_______P````"8````
+M`$<``)@(````````F`P)A(ZF``"8$#TRX````)@4```':P``F!P```````"8
+M(`("`@```)@D```.#@``F"@*`@(!``"8+``#;_P``)@P````````F#0```X.
+M``"8.`````<``)@\``(!````F$")8P````"81!-R%IP``)A(`!BV,P``F$P2
+MA&$\``"84`WHN.```)A4``=(60``F%A^@+ZZ``"87#$Z9EX``)A@```="```
+MF&0``<X```"8:$":09```)AP````#P``F'0```"```"8>`````0``)D`````
+M````F00```````"9"````````)D,`(``````F1`````#``";`````````)L$
+M````(```FP@````0``";#````#```)L0````"```FQ0````H``";&````"@`
+M`)L<````!```FR`````D``";)````!0``)LH````-```FRP````,``";,```
+M`"P``)LT`````@``FS@````B``";/````!(``)M`````,@``FT0````*``";
+M2````"H``)M,`````0``FU`````A``";5````!$``)M8````,0``FUP````)
+M``";8````"D``)MD````!0``FV@````E``";;````!4``)MP````-0``FW0`
+M```-``";>````"T``)M\`````P``FX`````C``";A````!,``)N(````,P``
+MFXP````+``";D````"L``)N4````!P``FY@````G``";G````!<``)N@````
+M-P``FZ0````/``";J````"\``)NL````+P``F[`````O``";M````"\``)NX
+M````+P``F[P````O``";P````"\``)O$````+P``F\@````O``";S````"\`
+M`)O0````+P``F]0````O``";V````"\``)O<````+P``F^`````O``";Y```
+M`"\``)OH````+P``F^P````O``";\````"\``)OT````+P``F_@````O``";
+M_````"\``)H`````'0``F@0```!=``":"````)T``)H,````W0``FA````$=
+M``":%````"$``)H8````80``FAP```"A``":(````.$``)HD````,0``FB@`
+M``!Q``":+````+$``)HP````'```FC0```!<``":.````"D``)H\````:0``
+MFD````"I``":1````"```)I(````&0``FDP```!9``":4````)D``)I4````
+M,```FE@````%``":7````"4``)I@````90``FF0```"E``"::````"@``)IL
+M````:```FG`````?``":=````!X``)IX````&```FGP```!8``":@````)@`
+M`)J$`````P``FH@````$``":C````$0``)J0````A```FI0````3``":F```
+M`!(``)J<````4@``FJ````"2``":I````-(``)JH````*P``FJP````J``":
+ML````&H``)JT````J@``FK@````;``":O````!H``)K`````6@``FL0```":
+M``":R````-H``)K,````!@``FM`````&``":U`````8``)K8````!@``FMP`
+M```&``":X`````8``)KD````!@``FN@````&``":[`````8``)KP````!@``
+MFO0````&``":^`````8``)K\````!@``F-0````@``"8S`````0``)C(``8!
+M!@``F)P```!M``"8P````````)C0````%`D)```````"`@8&!@8&!@("````
+M``,`!@`)`#P``````````````````````````/````#,````````````````
+M````"@```````.(*```@`0```@$``!A````````$&!E7!`4&$"8`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````EL"8\)M```________````````````(````"``
+M``!`````0``&````!@````8``````#`````5````%0```!T````5```00``O
+M_`\`+_P/`"_\'P`O_`\``!!$`"_\#P`O_`\`+_P?`"_\#P``$$@`+_P/`"_\
+M#P`O_!\`+_P/```03``O_`\`+_P/`"_\'P`O_`\``!!0`"_\#P`O_`\`+_P?
+M`"_\#P``$%0`+_P/`"_\#P`O_!\`+_P/```06``O_`\`+_P/`"_\'P`O_`\`
+M`!!<`"_\#P`O_`\`+_P?`"_\#P``$&``+_P/`"_\#P`O_!\`+_P/```09``O
+M_`\`+_P/`"_\'P`O_`\``!!P```!:````>````&X```!:```$#````(P```!
+MX````+````(P```0L```#9@``!&````?2```#9@``!#P``"@X``!0&@``%B`
+M``"@X```@!0$``0`"``(`"``,``$``0```"`'`Z-CZ<.C8_/`6"/E0Z-CZ<`
+M`)@$``````````,`````````````F"`"`@(``@("``(!`@`"`@(```"8)```
+M#@X```X.```'!P``#@X``)@H"@(``0H"``$%`0``"@(``0``F#0```X.```.
+M#@``#@X```X.``"8.`````<````'````"P````L``)A$$W(6G!-R%J43<A:H
+M$W(6G```F$@`&+IG`!BZ9P`8NFD`&+II``"84`PHM.`,*+3@#"BTX`PHM.``
+M`)A8?H`-+GZ`#2Y^P`TN?H`-+@``F%PQ-UU>,3==7C$Z75XQ-UU>``"88```
+MO1```+T0``"].```O1```)AD``'.```!S@```<X```'.````F10``"<0```G
+M$```%7P``"<0``"9&````9````&0````A````9```)E$;^`0(&_@$"!OX`D@
+M;^`0(```H8`%_Q3_!?\4_P7_%/\%_QG_``"8U````!`````4````$````!``
+M```,`````````"B$A)R<````+'Q\?'P````T````!0```$``````````1```
+M``@```!(````"````$P````0````4`````````!4````'P``"``````````(
+M!`````````@(````````"`P````````($`````````@4````````"!@`````
+M```('`````````@@````````""0````````2,````````(`$````````@`@`
+M``````"`#````````(`8````````@"0```````"`*````#```(`L``?__P``
+M@#`!____``"`-````#$``(`X````````@#P```````"`0````````(!$````
+M`@``@$@```````"`5````````(!8````````F`@```````"8#"V$D),``)@0
+M?3+@````F!0```]K``"8'````````)@L``)O_@``F#````````"8/``"`0``
+M`)A`(&H!>@``F$P2A&$\``"85```"%D``)AH0)I!D```F&P%#+"!``"8<```
+M``\``)AT````@```F'@````,``"9`````````)D$````````F0@```````"9
+M#`"``````)D0`````0``F1P```DJ``"9(````````)DD``6*!0``F2@````!
+M``"9+````````)DP````````F30```````"9.````````)D\````/P``F4``
+M```$``"92````````)E,````````F5````````"95%U0\4P``)E8````&```
+MF5P`2VJ.``"AA`;_!?\``*&(!_\'_P``H8P(_PC_``"AD`G_"?\``*&4"O\*
+M_P``H9@+_PO_``"AG`S_#/\``*&@#?\-_P``H:0/_P[_``"AJ!+_$O\``*&L
+M%/\3_P``H;`6_Q7_``"AM!G_%_\``*&X&_\:_P``H;P>_QW_``"AP"/_(/\`
+M`*'$)_\E_P``H<@L_RG_``"AS#'_+_\``*'0-_\T_P``H=0Z_SK_``"AV#K_
+M.O\``*'<.O\Z_P``H>`Z_SK_``"AY#K_.O\``*'H.O\Z_P``H>PZ_SK_``"A
+M\#K_.O\``*'T.O\Z_P``H?@Z_SK_``"A_#K_.O\``)L`````````FP0````@
+M``";"````!```)L,````,```FQ`````(``";%````"@``)L8````!```FQP`
+M```D``";(````!0``)LD````-```FR@````,``";+````"P``)LP`````@``
+MFS0````B``";.````!(``)L\````,@``FT`````*``";1````"H``)M(````
+M!@``FTP````F``";4````!8``)M4````-@``FU@````.``";7````"X``)M@
+M`````0``FV0````A``";:````!$``)ML````,0``FW`````)``";=````"D`
+M`)MX````!0``FWP````E``";@````!4``)N$````-0``FX@````-``";C```
+M`"T``)N0`````P``FY0````C``";F````!,``)N<````,P``FZ`````+``";
+MI````"L``)NH````*P``FZP````K``";L````"L``)NT````*P``F[@````K
+M``";O````"L``)O`````*P``F\0````K``";R````"L``)O,````*P``F]``
+M```K``";U````"L``)O8````*P``F]P````K``";X````"L``)OD````*P``
+MF^@````K``";[````"L``)OP````*P``F_0````K``";^`````(``)O\````
+M%@``F-0````@``"8V`!@$&@``)H````!J0```````)H$```!Z0```$```)H(
+M````*0```(```)H,````:0```5```)H0```!F0```9```)H4```!V0```=``
+M`)H8````&0```!```)H<````60```$0``)H@````F0```(0``)HD```!I0``
+M`4@``)HH```!Y0```8@``)HL````)0```<@``)HP```!R````!0``)HT````
+M"````$(``)HX````2````((``)H\````B````7@``)I````!F````;@``)I$
+M```!V````?@``)I(````&````!(``)I,````6````%(``)I0````F````)(`
+M`)I4```!I````7P``)I8```!Y````;P``)I<````)````?P``)I@````9```
+M``H``)ID````I````$H``)IH````Y````(H``)IL```!"@```5H``)IP```!
+M2@```9H``)IT```!B@```=H``)IX```!R@````X``)I\````"@```$X``)J`
+M````2@```(X``)J$````B@```5X``)J(```!N@```9X``)J,```!^@```=X`
+M`)J0````.@````D``)J4````>@```$D``)J8```!A@```(D``)J<```!Q@``
+M`7D``)J@````!@```;D``)JD````1@```?D``)JH````A@```#D``)JL````
+MQ@```'D``)JP````Q@```+D``)JT````Q@```;T``)JX````Q@```?T``)J\
+M````Q@```#T``)K`````Q@```'T``)K$````Q@```+T``)K(````Q@```/T`
+M`)K,````Q@```/T``)K0````Q@```/T``)K4````Q@```/T``)K8````Q@``
+M`/T``)K<````Q@```/T``)K@````Q@```/T``)KD````Q@```/T``)KH````
+MQ@```/T``)KL````Q@```/T``)KP````Q@```/T``)KT````Q@```/T``)KX
+M````Q@```/T``)K\````Q@```/T````!````1@!@```````!````1@!A````
+M```!````1@!B```````!````1@!C```````!````1@!D```````!````1@!E
+M```````!````1@!F```````!````1@!G```````!````1@!H```````!````
+M1@!I```````!````1@!J```````!````1@!K```````!````1@!L```````!
+M````1@!T```````!````1@!T```````!````1@!T```````!````1@!T````
+M```!````1@!T```````!````1@!T```````!````1@!T```````!````1@!T
+M```````!````1@!U```````!````1@!V```````!````1@!W```````!````
+M1@!X```````!````1@!Y```````!````1@!Z```````!````1@![```````!
+M````1@!\```````!````1@!]```````!````1@!^```````!````1@!_````
+M```!````1@"````````!````1`!\```````!````1@"(```````!````1@",
+M```````!````1@"0```````!````1@"4```````!````1@"8```````!````
+M1@"<```````!````1@"@```````!````1@"D```````!````1@"H```````!
+M````1@"L```````!````1@"P```````!````1@"T``````````('`!:>``L6
+M8@`*%CH`"18<``@5Z@`'%9H`!15*``05`P`"%%D```````$````#``8`"0`_
+M```````)````!``$``$``0`!````!D9'.```````````````````!`````$`
+M`0````1&1S<```````````````````,``0`!``$````#1D<V````````````
+M```````$```````!`````49'-0``````````````````!``!``$```````!&
+M1S0```````````````````0````!``#____^1D<S```````````````````#
+M``$``0``_____49',@``````````````````!````````/____Q&1S$`````
+M``````````````(``0`!``#____Z1D<P````````````````````````````
+M```````````````````````````95!`4!A`F````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````);`F/";0)"`EL";0`````________!0(/!P(/"@`/"0`/````````
+M`````````"`````@````0````$``!@````8````&```6G@`+%F(`"A8Z``D6
+M'``(%>H`!Q6:``452@`$%0,``A19```+N``!```````````````&`````0``
+M``(````#````!`````4``!!``"_\#P`O_`\`+_P?`"_\#P`O_`\``!!$`"_\
+M#P`O_`\`+_P?`"_\#P`O_`\``!!(`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!,
+M`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!0`"_\#P`O_`\`+_P?`"_\#P`O_`\`
+M`!!4`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!8`"_\#P`O_`\`+_P?`"_\#P`O
+M_`\``!!<`"_\#P`O_`\`+_P?`"_\#P`O_`\``!!@`"_\#P`O_`\`+_P?`"_\
+M#P`O_`\``!!D`"_\#P`O_`\`+_P?`"_\#P`O_`\``!`P```",````>````"P
+M```!8````>```!!P```!:````>````&X```!C````>```!"P```.8```$8``
+M`!\<```^.```$8```!#P``"@X``!0&@``%B```"PX``!0&@``(`4`^@#Z`;@
+M!N`$(`0@"$`(0`;@!N```)@$``````````,```````````````,``)@@`@("
+M``("`@`"`0(``@("``("`@```)@D```.#@``#@X```<'```.#@``#@X``)A$
+M$W(6'!-R'"43<A<B$W(6HA-R'"4``)A@``"=$```G1```)T8``"=&```G1``
+M`)AD``'.```!S@```<X```'.```!S@```)AH0)I!D$":09!`FD&00)I!D$":
+M09```)D8```!N````;@```"$```!"````;@``)DD$`6*!1`%B@40!8H%$`6*
+M!1`%B@4``*(P```````````````````!"``````````,`````````#0````%
+M````0`````````!$````"````$@````(````3````!````!0`````````%0`
+M```?```(``````````@$````````"`@````````(#`````````@0````````
+M"!0````````(&`````````@<````````""`````````()````````!)P````
+M````$#@````````0>````````!"X````````$/@````````1.````````!%X
+M````````$;@````````1^````````!(X````````$G@````````2N```````
+M`!+X````````$S@````````3>````````!.X````````$_@````````4.```
+M`````!1X````````%+@````````4^````````!4X````````%7@````````5
+MN````````!7X````````%C@````````6>````````!:X````````%O@`````
+M```7.````````!=X````````%[@````````7^````````!`\````````$'P`
+M```````0O````````!#\````````$3P````````1?````````!&\````````
+M$?P````````2/````````!)\````````$KP````````2_````````!,\````
+M````$WP````````3O````````!/\````````%#P````````4?````````(`$
+M````````@`@```````"`#````````(`@````````@"0```````"`*````#``
+M`(`L``?__P``@#`!____``"`-````#$``(`X````````@#P```````"`2```
+M`````(!4````````@%@```````"`7``/QX\``(#`*H(P&@``@,0%W`'@``"`
+MR!]`)Q```(#,`?0`````@-```!X<``"`U``"JJH``(#8`@!550``@-P`````
+M``"`X/____\``(#D``#__P``@.@```````"`[````````(#P````````@/0`
+M``````"`^````````(#\````B```AP````````"'!````(P``(<(````Y```
+MAPP```+5``"'$````````(<4````````AQ@```"@``"''````<D``(<@````
+M+```AR0````L``"'*````#```(<L````/```AS`````L``"'-````"P``(<X
+M````,```ASP````\``"'0````````(=$````````AT@```````"'3```````
+M`(=0````````AU0```````"'6````````(=<````````AV````#5``"'9```
+M`-\``(=H```!`@``AVP```$Z``"'<````'4``(=T````?P``AW@```"B``"'
+M?````````($```$``@``@00````!``"!"````,```($,````````@1````%H
+M``"!%````````(?``P(!````A\0'!@4$``"'R`L*"0@``(?,#PX-#```A]`3
+M$A$0``"'U!<6%10``(?8&QH9&```A]P?'AT<``"'X`,"`0```(?D!P8%!```
+MA^@+"@D(``"'[`\.#0P``(?P$Q(1$```A_07%A44``"'^!L:&1@``(?\'QX=
+M'```F`RMA(X9``"8$'THX````)@4G`J?:P``F!P```````"80"!J`7H``)A4
+M```(60``F0````````"9!````````)D(````````F0P`@`````"9$`````$`
+M`)D<```,@```F2`%$`````"9*`````$``)DL````!```F30>'R`B``"9.`H+
+M#`T``)D\````/P``F4B2@+(2``"95%U0X8@``)E<`$MJC@``F6@```/.``"9
+M<!DOM14``)EX`````0``F7P```````"B$`"`8S,``*(4`!!L$```HA@`G$!@
+M``"B(`&(,,8``*(D```$````HBP```````"B-"`@("```*(X("`@(```HD`X
+M20H@``"B1```>[8``*)(#_\__```FP````````";*`````P``)LX````$@``
+MFV0````A``";C````"T``)N<````,P````,`!@`)`#\````#``8`"0`_````
+M"0````0`!``!``$``0``````````````!D9'.```````````````````!```
+M``$``0``````````````!$9'-P```````````````````P`!``$``0``````
+M`````````T9'-@``````````````````!````````0```````````````49'
+M-0``````````````````!``!``$``````````````````$9'-```````````
+M````````!`````$`````````````_____D9',P```````````````````P`!
+M``$`````````````_____49',@``````````````````!```````````````
+M````_____$9',0```````````````````@`!``$`````````````____^D9'
+M,```````````````````````````````````````````````````````````
+M```````````(`````0`#```````````````````````&1D<W````````````
+M```````"````````````````````````1D<V```````````````````!````
+M``````````````#____]1D<U````````````````````````````````````
+M``#____Z1D<T``````````````````````$``0````````````#____X1D<S
+M``````````````````````$``0````$``0````#____V1D<R````````````
+M``````````$````!``$``0````#____S1D<Q``````````````````````$`
+M```!``$````!``#____P1D<P````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````#```(`5``"`%0``@!4``(`5``"`%0``@!P2C8^G
+M"8@/SP3@#Y42X`^K"8@/SP``F"@*`@`!"@(``04!`0`*`@`!"@(``0``F#0`
+M``X.```.#@``#@X```X.```.#@``F#@````'````!P````L````+````"P``
+MF$@`&-I:`!C:6@`8RFD`&,II`!C*:0``F%`-Z+3@#>BTX`WHM.`-Z+3@#>BT
+MX```F%A^@`TN?H`-+G[H32Y^Z$TN?H`-+@``F%PQ-V9>,3=F7C$W9EXQ-V9>
+M,3=A7@``F&P%#+"!!0RP@04,L($%#+"`!0RP@```F10``"<0```G$```%7P`
+M`"KX```G$```F43WN!`@][@0(/>X#2#WN!`@][@0(```H@QD+$%J9"Q!:F1`
+M06ID0$%J9$!!:@``HAP8@X`*&(.`"AAS@`H8@X`*&(.`"@``$C````````"8
+M"````````)@L``(O_@``F#P``@$```"83!*$83P``)DP``!(@P``F4`````$
+M``"96````/\``)ET````````F?@````8``"B!````````*((T#YGB```HB@`
+M``&U``"B/!/(B:\``)L$````(```FP@````0``";#````#```)L0````"```
+MFQ0````H``";&`````0``)L<````)```FR`````4``";)````#0``)LL````
+M+```FS`````"``";-````"(``)L\````,@``FT`````*``";1````"H``)M(
+M````!@``FTP````F``";4````!8``)M4````-@``FU@````.``";7````"X`
+M`)M@`````0``FV@````1``";;````#$``)MP````"0``FW0````I``";>```
+M``4``)M\````)0``FX`````5``";A````#4``)N(````#0``FY`````#``";
+ME````",``)N8````$P``FZ`````+``";I````"L``)NH````*P``FZP````K
+M``";L````"L``)NT````*P``F[@````K``";O````"L``)O`````*P``F\0`
+M```K``";R````"L``)O,````*P``F]`````K``";U````"L``)O8````*P``
+MF]P````K``";X````"L``)OD````*P``F^@````K``";[````"L``)OP````
+M*P``F_0````K``";^`````(``)O\````%@``F)P`````````````````````
+M````````F)P`````````````````````````````F)P`````````````````
+M````````````F)P`````````````````````````````F)P`````````````
+M````````````````F)P`````````````````````````````F)P`````````
+M````````````````````F)P`````````````````````````````F)P`````
+M````````````````````````F)P`````````````````````````````F)P`
+M````````````````````````````F)P`.````#@````X````.````#@`````
+MF)P`````````````````````````````F)P`````````````````````````
+M````F)P``````````````,````"`````@```F)P`!`#Y``0`^0`$`/\`!`#]
+M``0`_0``F-0```````````````0````$````!```F@````&I````````F@0`
+M``'I````0```F@@````I````@```F@P```!I```!4```FA````&9```!D```
+MFA0```'9```!T```FA@````9````$```FAP```!9````1```FB````"9````
+MA```FB0```&E```!2```FB@```'E```!B```FBP````E```!R```FC````'(
+M````%```FC0````(````0@``FC@```!(````@@``FCP```"(```!>```FD``
+M``&8```!N```FD0```'8```!^```FD@````8````$@``FDP```!8````4@``
+MFE````"8````D@``FE0```&D```!?```FE@```'D```!O```FEP````D```!
+M_```FF````!D````"@``FF0```"D````2@``FF@```#D````B@``FFP```$*
+M```!6@``FG````%*```!F@``FG0```&*```!V@``FG@```'*````#@``FGP`
+M```*````3@``FH````!*````C@``FH0```"*```!7@``FH@```&Z```!G@``
+MFHP```'Z```!W@``FI`````Z````"0``FI0```!Z````20``FI@```&&````
+MB0``FIP```'&```!>0``FJ`````&```!N0``FJ0```!&```!^0``FJ@```"&
+M````.0``FJP```#&````>0``FK````#&````N0``FK0```#&```!O0``FK@`
+M``#&```!_0``FKP```#&````/0``FL````#&````?0``FL0```#&````O0``
+MFL@```#&````_0``FLP```#&````_0``FM````#&````_0``FM0```#&````
+M_0``FM@```#&````_0``FMP```#&````_0``FN````#&````_0``FN0```#&
+M````_0``FN@```#&````_0``FNP```#&````_0``FO````#&````_0``FO0`
+M``#&````_0``FO@```#&````_0``FOP```#&````_0``F-0````@``"8U```
+M`!`````4````$````!`````4``"8V`!@$&@`8!!H`&`0:`!@$&@`8!!H``"8
+MG`````````````````````````````"8G```````````````````````````
+M``"8G`````````````````````````````"8G```````````````````````
+M``````"8G`````````````````````````````"8G!`````0````$````!``
+M```0``````"8G`0````$````!`````0````$``````"8G```````````````
+M``````````````"8G`````````````````````````````"8G```````````
+M``````````````````"8G```````````"@````````````````"8G``X`,``
+M.`"``C@`P``X`,``.`#```"8G``"``8``@`&````!@`"``8``@`&``"8G```
+M`(D```")````B0```(D```")``"8G````*````"@````H````*````"@``"8
+MG``$``<`!``'``0`!P`$``<`!``'``"8U````!H````:````&@```!H````:
+M``"8G````$````!(````0````$````!```"8G````!`````0````$````!``
+M```0``"8G`````@````(````"`````@````(``"8G````$\```!/````3P``
+M`$\```!/``"8G````/$```#Q````80```/$```#Q``"8G```D$\``)!/``"0
+M3```D$\``)!/``"8G```$EH``!):```2F@``$EH``!):``"8S`````X````.
+M````#P````X````.`````0```$8`8````````0```$8`80```````0```$8`
+M8@```````0```$8`8P```````0```$8`9````````0```$8`90```````0``
+M`$8`9@```````0```$8`9P```````0```$8`:````````0```$8`:0``````
+M`0```$8`:@```````0```$8`:P```````0```$8`;````````0```$8`=```
+M`````0```$8`=````````0```$8`=````````0```$8`=````````0```$8`
+M=````````0```$8`=````````0```$8`=````````0```$8`=````````0``
+M`$8`=0```````0```$8`=@```````0```$8`=P```````0```$8`>```````
+M`0```$8`>0```````0```$8`>@```````0```$8`>P```````0```$8`?```
+M`````0```$8`?0```````0```$8`?@```````0```$8`?P```````0```$8`
+M@````````0```$0`?````````0```$8`B````````0```$8`C````````0``
+M`$8`D````````0```$8`E````````0```$8`F````````0```$8`G```````
+M`0```$8`H````````0```$8`I````````0```$8`J````````0```$8`K```
+M`````0```$8`L````````0```$8`M```%IX`!A9B``06.@`#%AP``A7J``$5
+MF@``%4H``!4#``$460`#"[@`!0`````````P``"`%0``@!4``(`5``"`%0``
+M@!4``(`<$HV3IPF($\\$X!.5$N`3JPF($\\``)@H"@(``0H"``$%`@$`"@(`
+M`0H"``$``)@T```.#@``#@X```X.```.#@``#@X``)@X````!P````<````+
+M````"P````L``)A(`!C:;0`8VFT`&,IU`!C*=0`8RG4``)A0#>BTX`WHM.`-
+MZ+3@#>BTX`WHM.```)A8?H`-+GZ`#2Y^Z`TN?N@-+GZ`#2X``)A<,3=F7C$W
+M9EXQ-V9>,3=F7C$W9EX``)AL!0RP@04,L($%#+"!!0RP@04,L($``)D4```'
+MT```!]````1,```(F```!]```)E$][@0(/>X$"#WN`T0][@0$/>X$!```*($
+M```````````````(````"`````@``*((UKYGB-:^9XC0/F>(T#YGB-`^9X@`
+M`*(,9"P!0&0L`4!D0L%@9$+!8&1"P6```*(<&(.`"AB#@`H8<X`*&(.`"AB#
+M@`H``!(P````````F`@```````"8+``"+_X``)@\``(!````F$P2A&$\``"9
+M,```2((``)E`````!```F5@```#_``"9=````````*(H```!M0``HCP3R(FO
+M``";!`````$``)L(`````@``FPP````#``";$`````0``)L4````!0``FQ@`
+M```(``";'`````D``)L@````"@``FR0````+``";+`````T``)LP````$```
+MFS0````1``";/````!,``)M`````%```FT0````5``";2````!@``)M,````
+M&0``FU`````:``";5````!L``)M8````'```FUP````=``";8````"```)MH
+M````(@``FVP````C``";<````"0``)MT````)0``FW@````H``";?````"D`
+M`)N`````*@``FX0````K``";B````"P``)N0````,```FY0````Q``";F```
+M`#(``)N@````-```FZ0````U``";J````#4``)NL````-0``F[`````U``";
+MM````#4``)NX````-0``F[P````U``";P````#4``)O$````-0``F\@````U
+M``";S````#4``)O0````-0``F]0````U``";V````#4``)O<````-0``F^``
+M```U``";Y````#4``)OH````-0``F^P````U``";\````#4``)OT````-0``
+MF_@````0``";_````!H``)H`````!P````<``)H$````1P```$<``)H(````
+MAP```(<``)H,```!H````:```)H0```!X````>```)H4````(````"```)H8
+M````8````&```)H<```!H0```:$``)H@```!X0```>$``)HD````(0```"$`
+M`)HH````80```&$``)HL```!8@```6(``)HP```!H@```:(``)HT```!X@``
+M`>(``)HX````(@```"(``)H\````8@```&(``)I````!8P```6,``)I$```!
+MHP```:,``)I(```!XP```>,``)I,````(P```",``)I0````8P```&,``)I4
+M```!A````80``)I8```!Q````<0``)I<````!`````0``)I@```!Z@````L`
+M`)ID````*@```$L``)IH````:@```(L``)IL````J@```:P``)IP```!JP``
+M`>P``)IT```!ZP```"P``)IX````*P```!(``)I\````:P```%(``)J`````
+MJP```)(``)J$```!K````9,``)J(```![````=,``)J,````+````!,``)J0
+M````.@```%,``)J4````>@```),``)J8````N@```90``)J<```!NP```=0`
+M`)J@```!^P```!0``)JD````.P```#H``)JH````>P```'H``)JL````NP``
+M`+H``)JP```!O````;L``)JT```!_````?L``)JX````/````#L``)J\````
+M?````'L``)K`````O````+L``)K$````_````;P``)K(````_````?P``)K,
+M````_````#P``)K0````_````'P``)K4````_````+P``)K8````_````/P`
+M`)K<````_````/P``)K@````_````/P``)KD````_````/P``)KH````_```
+M`/P``)KL````_````/P``)KP````_````/P``)KT````_````/P``)KX````
+M_````/P``)K\````_````/P``)C4````(```F-`#!@0(`P<$"`,&!`@#!@0(
+M`P<$"```F-P`H"#``*`@P`#@(,``X"#``.`@P```F)P/````#P````\````/
+M````#P``````F)P`````````````````````````````F)P`@````(````"`
+M````@````(``````F)P`*@```"H````J````*@```"H`````F)P``0````$`
+M```!`````0````$`````F)P`````````````````````````````F)P`&```
+M`!@````8````&````!@`````F)P`8````&````!N````;@```&X`````F)P`
+MQP```,<```#'````QP```,<`````F)P`2P```$L```!+````2P```$L`````
+MF)P$2```!$@```1(```$2```!$@`````F)P`3````$P```!,````3````$P`
+M````F)P`Y````.0```#D````Y````.0`````F)P`````````````````````
+M````````F)P`_````/P```#\````_````/P`````F)P`_P```/\```#_````
+M_P```/\`````F)P$/P``!#\```0_```$/P``!#\`````F)P`#`````P````,
+M````#`````P`````F)P"&0```AD```(9```"&0```AD`````F)P`)````"0`
+M```D````)````"0`````F)P`M````+0```"T````M````+0`````F)P`F0``
+M`)D```"9````F0```)D`````F)P`4````%````!0````4````%``````F)P`
+M*@```"H````J````*@```"H`````F)P`$@```!(````2````$@```!(`````
+MF)S`,@``P#(``,`R``#`,@``P#(`````F)P!=````70```%T```!=````70`
+M````F)P`$0```!$````1````$0```!$`````F)R&*```AB@``(8H``"&*```
+MAB@`````F)PQA```,80``#&$```QA```,80`````F)P`\@"``/(`@`#R`(``
+M\@"``/(`@```F)P`)P`9`"<`&0`G`!D`)P`9`"<`&0``F)P````#`````P``
+M``,````#`````P``F)P`````````````````````````````F)P```"R````
+ML@```+(```"R````L@``F)P`L""$`+`@A`"P((0`L""$`+`@A```F)P`026D
+M`$$EI`!!):0`026D`$$EI```F)P`$9(@`!&2(``1DB``$9(@`!&2(```F)P`
+M&D@``!I(```:2```&D@``!I(````F-@`"P(P``L",``+`C``"P(P``L",```
+MF)P```"4````E````)0```"4````E```F)P```"1````D0```)$```"1````
+MD0``F)P````2````$@```!(````2````$@``F)P```"`````@````(````"`
+M````@```F)P```#9````V0```-D```#9````V0``F)P```!@````8````&``
+M``!@````8```F)P```#P````\````/````#P````\```F)P```"B````H@``
+M`*(```"B````H@``F)P```!2````4@```%(```!2````4@``F)P```#4````
+MU````-0```#4````U```F)P``!3,```4S```%,P``!3,```4S```F)P```2,
+M```$C```!(P```2,```$C```F,0````#`````P````,````#`````P```#``
+M```5````%0```!4````5````%0``@!P2C9.G"8@3SP3@$Y42X!.K"8@3SP``
+MF"@*`@`!"@(``04"```*`@`!"@(``0``F#0```X````.````#@````X````.
+M````F#@````"`````@````H````*````"@``F$@`&-IM`!C:;0`::F0`&FID
+M`!IJ9```F%`-Z+3@#>BTX`WHL-H,F+#:#>BPV@``F%A^@`TN?H`-+G[H#2Y^
+MR`TN?H`-+@``F%PQ-V9>,3=F7C$W9EXQ.6!>,3=F7@``F&P%#+"!!0RP@04,
+ML($%#+"!!0RP@0``F10```?0```'T```!$P```B8```'T```F43WN!``][@0
+M`/>X#0#WN!``][@0````H@0`````````````````````````````H@C6OF>(
+MUKYGB-`^9XC0/F>(T#YGB```H@P`+`%``"P!0`!"P4``0L%``$+!0```HAP8
+M@X`*&(.`"AAC@`H8@X`*&(.`"@``$C````/@``"`8`````\``($8````````
+M@1P```````"!(````````($D````````@2@```````"!+````````($P````
+M````@30```````"!.````````($\````````@4"```"H``"!1````````)@(
+M````````F"P``*````"8/``@!````)A,$H0C/```F'`````?``"8=````(``
+M`)AX````#@``F5@```#_``"9@````````)F$`H``````F:````````"9X```
+M`````)GDJJJJJ@``F>@\1F1X``"9[````*H``)GP````#```F?0```#_``"9
+M^````!0``*(H```)M0``HCR3R(FO``"B3`````$``*)0``"@````HE0`````
+M``"B6`S'4X```*)<#P\/`0``HF!?:0\!``"B9`!!BA$``*)H````````HFP,
+M,,%J``"B<`""""```*)T`!M\J@``HG@<YSG.``"B?`47`<X``*,`&`$`````
+MHP0P`R8"``"C"$@'/@8``*,,5@M,"@``HQ!D&F`/``"C%'A/;AL``*,8AH]\
+M6@``HQR.SX9;``"C()U/EP\``*,DI<^ACP``HRBU7Z\?``"C++W?N9\``*,P
+MS7_'/P``HS35_]&_``"C.````````*,\````````HT````````"C1```````
+M`*-(/____P``HTP_____``"C4#____\``*-4``/__P``HUAYJ*H?``"C7`9L
+M0@\``*-@#R@B!P``HV078!:%``"C:!^`$00``*-L-Z`,`P``HW`_Q`B#``"C
+M=%?`"`,``*-X7]@&@@``HWQ_X`2"``"C@'\\>[H``*.$\S!_\```FP0````!
+M``";"`````(``)L,`````P``FQ`````$``";%`````4``)L8````"```FQP`
+M```)``";(`````H``)LD````"P``FRP````-``";,````!```)LT````$0``
+MFSP````3``";0````!0``)M$````%0``FT@````8``";3````!D``)M0````
+M&@``FU0````;``";6````!P``)M<````'0``FV`````@``";:````"(``)ML
+M````(P``FW`````D``";=````"4``)MX````*```FWP````I``";@````"H`
+M`)N$````*P``FX@````L``";D````#```)N4````,0``FY@````R``";H```
+M`#0``)ND````-0``FZ@````U``";K````#4``)NP````-0``F[0````U``";
+MN````#4``)N\````-0``F\`````U``";Q````#4``)O(````-0``F\P````U
+M``";T````#4``)O4````-0``F]@````U``";W````#4``)O@````-0``F^0`
+M```U``";Z````#4``)OL````-0``F_`````U``";]````#4``)OX````$```
+MF_P````:``":``````````````":!`````````!```":"`````````"```":
+M#`````````&!``":$`````````'!``":%``````````!``":&`````````!!
+M``":'`````````"!``":(`````````%H``":)`````````&H``":*```````
+M``'H``":+``````````H``":,`````````!H``":-`````````&)``":.```
+M``````')``":/``````````)``":0`````````!)``":1`````````")``":
+M2`````````&0``":3`````````'0``":4``````````0``":5`````````!0
+M``":6`````````"0``":7`````````&1``":8`````````'1``":9```````
+M```1``"::`````````!1``":;`````````"1``":<`````````%X``":=```
+M``````&X``":>`````````'X``":?``````````X``":@`````````!X``":
+MA`````````&9``":B`````````'9``":C``````````9``":D`````````!9
+M``":E`````````"9``":F`````````#9``":G`````````#Y``":H```````
+M``#Y``":I`````````#Y``":J`````````#Y``":K`````````#Y``":L```
+M``````#Y``":M`````````#Y``":N`````````#Y``":O`````````#Y``":
+MP`````````#Y``":Q`````````#Y``":R`````````#Y``":S`````````#Y
+M``":T`````````#Y``":U`````````#Y``":V`````````#Y``":W```````
+M``#Y``":X`````````#Y``":Y`````````#Y``":Z`````````#Y``":[```
+M``````#Y``":\`````````#Y``":]`````````#Y``":^`````````#Y``":
+M_`````````#Y``"8U````"```)C0`@`4"`(!%`@"`!0(`@`4"`(!%`@``)C<
+M`*`@P`"@(,``X"#``.`@P`#@(,```)B<\````/````#P````\````/``````
+M`)B<`````````````````````````````)B<`P````,````#`````P````,`
+M`````)B<`````````````````````````````)B<````````````````````
+M`````````)B<`````````````````````````````)B<````````````````
+M`````````````)B<`````````````````````````````)B<0$```$!```!`
+M0```0$```$!``````)B<904``&4%``!E!0``904``&4%`````)B<````````
+M`````````````````````)B<`````````````````````````````)B<`$(`
+M``!"````0@```$(```!"`````)B<`+4```"U````M0```+4```"U`````)B<
+M``,````#`````P````,````#`````)B<`/<```#W````]P```/<```#W````
+M`)B<`)T```"=````G0```)T```"=`````)B<`"(````B````(@```"(````B
+M`````)B<!"(```0B```$(@``!"(```0B`````)B<`",`&``C`!@`(P`8`",`
+M&``C`!@``)B<`"@````H````*`!@`"@`8``H`&```)B<`%``P`!0`,``4`##
+M`%``PP!0`,,``)B<``0`?P`$`'\`!`!_``0`?P`$`'\``)B<```$6```!%@`
+M``18```$6```!%@``)B<`````````````````````````````)B<``#`````
+MP````,````#`````P````)C8`$`",`!``C``0`(P`$`",`!``C```)B<``!D
+M````9````&0```!D````9````)B<```(````"`````@````(````"````)C,
+M````#@````X````.````#@````X````P````%0```!4````5````%0```!4`
+M`(`<$HV3IPF($\\$X!.5$N`3JPF($\\``)@H"@(``0H"``$%`@$`"@(``0H"
+M``$``)@T```.#@``#@X```X.```.#@``#@X``)@X````!P````<````+````
+M"P````L``)A(`!CZ80`8^F$`&AIC`!H:8P`:&F,``)A0#)BTX`R8M.`,F+#:
+M#)BPV@R8L-H``)A8?L@-+G[(#2Y^R`TN?L@-+G[(#2X``)A<,3E@7C$Y8%XQ
+M.6!>,3E@7C$Y8%X``)AL!0RP@04,L($%#+"!!0RP@04,L($``)D4```'T```
+M!]````1,```(F```!]```)E$][@0`/>X$`#WN`T`][@0`/>X$````*($````
+M`````````````````````````*((UKYGB-:^9XC0/F>(T#YGB-`^9X@``*(,
+M`"[!X``NP>``*L$@`"K!(``JP2```*(<&(.`"AB#@`H88X`*&(.`"AB#@`H`
+M`*,`&`$``!@!```8`0``&`$``!@!`````*,$,`,F`C`#)@(P`R8",`,F`C`#
+M)@(``*,(2`<^!D@'/@9(!SX&2`<^!D@'/@8``*,,5@M,"E8+3`I6"TP*5@M,
+M"E8+3`H``*,09!I@#V0:8`]D&F`/9!I@#V0:8`\``*,4>$]N&WA/;AMX3VX;
+M>$]N&WA/;AL``*,8AH]\6H:/?%J&CWQ:AH]\6H:/?%H``*,<D,^&6Y#/AEN.
+MSX9;CL^&6X[/AEL``*,@G4^7#YU/EP^;3Y</FT^7#YM/EP\``*,DI\^CCZ?/
+MHX^CSY^/H\^?CZ//GX\``*,HM5^O'[5?KQ^S7Z\?LU^O'[-?KQ\``*,LO=^Y
+MG[W?N9^[W[F?N]^YG[O?N9\``*,PRW_%/\M_Q3_+?\<_RW_'/\M_QS\``*,T
+MU?_1O]7_T;_3_]&_T__1O]/_T;\``!(P```#X```0&@````0``"`8`````\`
+M`("<````````@*````````"!&````````($<````````@2````````"!)```
+M`````($H````````@2P```````"!,````````($T````````@3@```````"!
+M/````````(%`@``#^0``@40```````"8"````````)@L``"@````F#P`(`0`
+M``"83!*$(SP``)AP````'P``F'0```"```"8>`````X``)E8``@?_P``F8``
+M``````"9A`*``````)F@````````F>````````"9Y*JJJJH``)GH/$9D>```
+MF>P```"J``"9\`````P``)GT````_P``F?@````4``"B*```";4``*(\D\B)
+MKP``HDP````!``"B4```H````*)4````````HE@,QU.```"B7`\/#P$``*)@
+M7VD/`0``HF0`08H1``"B:````````*)L###!:@``HG``@@@@``"B=`@;?*H`
+M`*)X'.<YS@``HGP%%P'.``"C.````````*,\````````HT````````"C1```
+M`````*-(/____P``HTP_____``"C4#____\``*-4``/__P``HUAYJ*H?``"C
+M7`9L0@\``*-@#R@B!P``HV078!:%``"C:!^`$00``*-L-Z`,`P``HW`_Q`B#
+M``"C=%?`"`,``*-X7]@&@@``HWQ_X`2"``"C@'\\>[H``*.$\S!_\```FP0`
+M```!``";"`````(``)L,`````P``FQ`````$``";%`````4``)L8````"```
+MFQP````)``";(`````H``)LD````"P``FRP````-``";,````!```)LT````
+M$0``FSP````3``";0````!0``)M$````%0``FT@````8``";3````!D``)M0
+M````&@``FU0````;``";6````!P``)M<````'0``FV`````@``";:````"(`
+M`)ML````(P``FW`````D``";=````"4``)MX````*```FWP````I``";@```
+M`"H``)N$````*P``FX@````L``";D````#```)N4````,0``FY@````R``";
+MH````#0``)ND````-0``FZ@````U``";K````#4``)NP````-0``F[0````U
+M``";N````#4``)N\````-0``F\`````U``";Q````#4``)O(````-0``F\P`
+M```U``";T````#4``)O4````-0``F]@````U``";W````#4``)O@````-0``
+MF^0````U``";Z````#4``)OL````-0``F_`````U``";]````#4``)OX````
+M$```F_P````:``":``````````````":!````$````!```":"````(````"`
+M``":#````:$```%A``":$````>$```&A``":%````"$```'A``":&````&$`
+M```A``":'````8@```!A``":(````<@```&(``":)`````@```'(``":*```
+M`$@````(``":+````(@```!(``":,````:D```"(``":-````>D```%I``":
+M.````"D```&I``":/````&D```'I``":0````=`````I``":1````!````!I
+M``":2````%````&0``":3````)````'0``":4````;$````0``":5````?$`
+M``!0``":6````#$```"0``":7````'$```%Q``":8````;@```&Q``":9```
+M`?@```'Q``"::````#@````Q``":;````'@```!Q``":<````9D```&8``":
+M=````=D```'8``":>````!D````8``":?````%D```!8``":@````)D```"8
+M``":A````-D```%Y``":B````/D```&Y``":C````/D```'Y``":D````/D`
+M```Y``":E````/D```!Y``":F````/D```"Y``":G````/D```#Y``":H```
+M`/D```#Y``":I````/D```#Y``":J````/D```#Y``":K````/D```#Y``":
+ML````/D```#Y``":M````/D```#Y``":N````/D```#Y``":O````/D```#Y
+M``":P````/D```#Y``":Q````/D```#Y``":R````/D```#Y``":S````/D`
+M``#Y``":T````/D```#Y``":U````/D```#Y``":V````/D```#Y``":W```
+M`/D```#Y``":X````/D```#Y``":Y````/D```#Y``":Z````/D```#Y``":
+M[````/D```#Y``":\````/D```#Y``":]````/D```#Y``":^````/D```#Y
+M``":_````/D```#Y``"8U````"```)C0````"`````@````(````"`````@`
+M`)C<`*``P`"@`,``X`#``.``P`#@`,```)B<,P```#,````S````,P```#,`
+M`````)B<`0````$````!`````0````$``````)B<````````````````````
+M`````````)B<`````````````````````````````)B<````````````````
+M`````````````)B<'P```!\````?````'P```!\``````)B<````````````
+M`````````````````)B<`+@```"X````N````+@```"X`````)B<`+<```"W
+M````MP```+<```"W`````)B<`(0```"$````A````(0```"$`````)B<`)@`
+M``"8````F````)@```"8`````)B<`,````#`````P````,````#``````)B<
+M`/\```#_````_P```/\```#_`````)B<`/\```#_````_P```/\```#_````
+M`)B<`/\```#_````_P```/\```#_`````)B<`/\```#_````_P```/\```#_
+M`````)B<`-<```#7````UP```-<```#7`````)B<`&$```!A````80```&$`
+M``!A`````)B<`/X```#^````_@```/X```#^`````)B<`-X```#>````W@``
+M`-X```#>`````)B<`'\```!_````?P```'\```!_`````)B<!#T```0]```$
+M/0``!#T```0]`````)B<`'<```!W````=P```'<```!W`````)B<`$0```!$
+M````1````$0```!$`````)B<`)@```"8````F````)@```"8`````)B<`!``
+M@``0`(``$`"``!``@``0`(```)B<``7`-``%P#0`!<`T``7`-``%P#0``)B<
+M`#$`\``Q`/``,0#P`#$`\``Q`/```)B<``P!'P`,`1\`#`$?``P!'P`,`1\`
+M`)B<`%$`0`!1`$``40!``%$`0`!1`$```)B<`%``V@!0`-H`4`#:`%``V@!0
+M`-H``)B<`````````````````````````````)B<``!`1```0$0``$!$``!`
+M1```0$0``)B<`````````````````````````````)B<``!@P```8,```&#`
+M``!@P```8,```)B<```L````+````#8````V````+````)C(```$`P``!`,`
+M``0#```$`P``!`,``)B<``!D````9````&0```!D````9````)B<```(````
+M"`````@````(````"````)C,````#@````X````.````#@````Y!4C4R,3``
+M`$%2-3(Q,0``05(U,C$R``!21C4Q,3$``%)&-3$Q,@``4D8R-#$S``!21C4T
+M,3,``%)%1T]04U]&54Y#``````!!=&AE<F]S(#(S,3,@5VE3;T,```````!!
+M=&AE<F]S(#4R,3(`````071H97)O<R`U,C$Q`````$%T:&5R;W,@-3(Q,```
+M``!!=&AE<F]S(#4T,C0O,C0R-`````````!!=&AE<F]S(#4S,3(@5VE3;T,`
+M``````!!=&AE<F]S(#(S,3<@5VE3;T,```````!!=&AE<F]S(#(S,34@5VE3
+M;T,```````!!=&AE<F]S(#4R,3(@*$901T$I``````!!=&AE<F]S(#4R,3$@
+M*$901T$I```````P+CDN,C`N,P``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````!_P'_`````````````'__________`````````````P&8
+M`9D`````````````?_________\````````````'`9@+,`````````````!_
+M_________P````````````@!F`PP`````````````'__________````````
+M````(`$@"A``````````````?_________\````````````A`2`!F0``````
+M``````!__________P```````````"(!(`PP`````````````'__________
+M````````````.@%@"A``````````````?_________\````````````[`6`!
+MF0````````````!__________P```````````!(!90H0```````#`````'__
+M________````````````-P$P`9D```````,`````?_________\`````````
+M```U`C`!F0```````P````!__________P```````````#8#,`&9```````#
+M`````'__________````````````,`0P`9D```````,`````?_________\`
+M```````````Y!3`!F0```````P````!__________P```````````#0&,`&9
+M```````#`````'__________````````````,@,P`9D```````,`````?___
+M______\````````````Q`S`!F0````````````!__________P``````````
+M`!$!$`&9`````````````'__________````````````$`$0"A``````````
+M````?_________\```````````!2`5`!F0````````````!__________P``
+M`````````$4"4`&9`````````````'__________````````````1P-0`9D`
+M````````````?_________\```````````!"!%`!F0````````````!_____
+M_____P```````````%@%4`&9`````````````'__________````````````
+M6P90`9D`````````````?_________\```````````!="%`!F0``````````
+M``!__________P```````````%X)4`&9`````````````'__________````
+M````````4`-0"A``````````````?_________\```````````!5`5`,,```
+M``````````!__________P```````````%8"4`PP`````````````'______
+M____````````````20)0#5``````````````?_________\```````````!`
+M`4`*0```````1@````0`````````*`&(`````````$$!0`I```````!'````
+M!`````````!H`8D`````````2`%`"A```````$8````$``````````@!B@``
+M``````!*`4`*0```````1@````0````````8"`&,`````````$L!0`I`````
+M``!&````!````````&`(`8T`````````3`%`"E```````$8````$````````
+M``@!CP````````!#`D`*0```````1P````0`````````<`&+`````````/`#
+M0`I```````!&````!``````````@````````````@`-`"D```````$<````$
+M`````````&`/IP````````#Q`T`*0```````1@````0````````8````````
+M`````($#0`I```````!&````!````````&``#Z@`````````@@-`"E``````
+M`$8````$```````````/J0````````#R`T`*$```````1@````0`````````
+M`````````````(,$0`I```````!'````!````````(!@#ZH`````````]`1`
+M"D```````$8````$````````F`````````````"$!$`*0```````1@````0`
+M``````#@``^K`````````(4$0`I0``````!&````!````````(``#ZP`````
+M````]01`"A```````$8````$````````@`````````````"&!4`*0```````
+M1P````0```````"`8`^M`````````(<%0`I```````!&````!````````.``
+M#ZX`````````B`5`"E```````$8````$````````@``/KP````````")!D`*
+M0```````1P````0`````````:`^P`````````(H&0`I```````!&````!```
+M`````&`(#[$`````````BP9`"E```````$8````$``````````@/L@``````
+M``",!T`*0```````1P````0```````"`:`^S`````````(T'0`I```````!&
+M````!````````.`(#[0`````````C@=`"E```````$8````$````````@`@/
+MM0````````"/"$`*0```````1P````0```````"`:`^V`````````)`(0`I`
+M``````!&````!````````.`(#[<`````````D0A`"E```````$8````$````
+M````@`@/N`````````#V"4`*0```````1P````0```````"`8```````````
+M`/<+0`I```````!'````!````````(!@````````````8`!@`&``````````
+M````?_________\```````````!A`&$`80```````P````!__________P``
+M`````````&(`8@!B```````"`````'__________````````````8P!C`&,`
+M````````````?_________\```````````!D`&0`9````````P````!_____
+M_____P```````````&4`90!E```````#`````'__________````````````
+M9@!F`&8`````````````?_________\```````````!G`&<`9P``````````
+M``!__________P```````````&@`:`!H`````````````'__________````
+M````````:0!I`&D```````,`````?_________\```````````!J`&H`:@``
+M`````P````!__________P```````````&4```````'_____````@/____\`
+M````2E````^T`````````&H```````'_____````@/____\`````2E````^T
+M`````````?\```````$````!`````1M8```````0`````0````$````!&U@`
+M```(``,````!``````````$;6`````P``P````$``````````1M8````(`!'
+M````````````````&U@````S`#`````!``````````$;6````"0`(0````$`
+M```!`````1M8````*``W`````0`````````!&U@````?`#`````!`````0``
+M``$;6````#``6P````$``````````1M8````<``#`````0`````````!&U@`
+M```X`#<````!``````````$;6````%0`50````$````!`````1M8````1`!5
+M`````0````$````!&U@```!,`#L````!```````````;6````&``4@````$`
+M```!`````1M8````9``T`````0`````````!&U@```!\`"`````!`````0``
+M``$;6````)@`6P````$````!`````1M8````G`!2`````0````$````!&U@`
+M``"J`!`````!``````````$;6````+P``P````$``````````1M8````OP`V
+M`````0`````````!&U@```#$`#<````!`````0````$;6````,L`-P````$`
+M`````````1M8````T``W`````0`````````!&U@```#6`!`````!`````0``
+M``$;6````-H``P```````````````!M8```#,@`V`````0`````````!&U@`
+M``#>``,````!``````````$;6````.D`-P````$``````````1M8````]@`W
+M`````0`````````!&U@```#Z`#<````!``````````$;6````/\`-@````$`
+M`````````1M8```!#``P`````0````$````!&U@```$4`#<````!````````
+M``$;6````2P`-P````$``````````1M8```!0``0`````0````$````!&U@`
+M``%4``,````!``````````$;6````5@`(0````$````!`````1M8```!7``W
+M`````0`````````!&U@```%@`#<````!``````````$;6````60`6P````$`
+M`````````1M8```!:`!2`````0`````````!&U@```%L`%(````!`````0``
+M``$;6````70`-P````$``````````1M8```!>``#`````0`````````!&U@`
+M``%\`#<````!``````````$;6````8@`0`````$``````````!M8```!B0!!
+M`````0``````````&U@```&*`$@````!```````````;6````8L`0P````$`
+M`````````!M8```!C`!*`````0``````````&U@```&-`$L````!````````
+M```;6````8\`3`````$``````````!M8```/IP"``````0``````````&U@`
+M``^H`($````!```````````;6```#ZD`@@````$``````````!M8```/J@"#
+M`````0``````````&U@```^K`(0````!```````````;6```#ZP`A0````$`
+M`````````!M8```/K0"&`````0``````````&U@```^N`(<````!````````
+M```;6```#Z\`B`````$``````````!M8```/L`")`````0``````````&U@`
+M``^Q`(H````!```````````;6```#[(`BP````$``````````!M8```/LP",
+M`````0``````````&U@```^T`(T````!```````````;6```#[4`C@````$`
+M`````````!M8```/M@"/`````0``````````&U@```^W`)`````!````````
+M```;6```#[@`D0````$``````````!M8```!D`!"`````0`````````!&U@`
+M``&.``,````!``````````$;6````9@`10````$````!`````1M8```!F@!%
+M`````0``````````&U@```&;`$4````!```````````;6````9P`7@````$`
+M`````````!M8```!G@`#`````0`````````!&U@```&L`#<````!````````
+M``$;6````:8``P````$``````````1M8```!M@`W`````0`````````!&U@`
+M``&X`#<````!``````````$;6````;H`-P````$``````````1M8```!O@`A
+M`````0````$````!&U@```,G``,````!``````````$;6````<H`70````$`
+M`````````!M8```!U@`W`````0`````````!&U@```'D`!`````!`````0``
+M``$;6````>P`,`````$````!`````1M8```!^``#`````0`````````!&U@`
+M``(0`#<````!``````````$;6````BH`(@````$``````````1M8```"0@`W
+M`````0`````````!&U@```(``%L````!``````````$;6````DH``P````$`
+M`````````1M8```"3P`0`````0````$````!&U@```)<`%(````!````````
+M``$;6````F``.P````$````!`````1M8```":``W`````0`````````!&U@`
+M``)L`#<````!``````````$;6````G8`$`````$````!`````1M8```">@`#
+M`````0`````````!&U@```*"``,````!``````````$;6````H,``P````$`
+M`````````1M8```"J@`A`````0`````````!&U@```*^`%L````!`````0``
+M``$;6````K\`-P````$``````````1M8```"P0`W`````0`````````!&U@`
+M``+&`#L````!``````````$;6````M0`-P````$``````````1M8```"\``W
+M`````0`````````!&U@```+T`#<````!``````````$;6````O@``P````$`
+M`````````1M8````G@!0`````0````$````!&U@```+\``,````!````````
+M``$;6````PP`,`````$``````````1M8```#%``V`````0`````````!&U@`
+M``,8`#8````!``````````$;6````R0``P````$``````````1M8```#$``#
+M`````0`````````!&U@```,Z`#<````!``````````$;6````T@`$`````$`
+M```!`````1;!```#2@`2`````0````$````!&U@```-:`!$````!````````
+M``$;6````UP`.@````$````!`````1M8```#7@!6`````0`````````!&U@`
+M``+```,````!``````````$;6````W<``P````$``````````1M8```"S``#
+M`````0`````````!&U@````````3,Q,]%P`*!0```````````````````!`0
+M`````````!-'$U$7``H%````````````````````$!``````````$S@3=!<`
+M%!0````````````````````0!P`````````33A-[&P8%!0``````````````
+M``````$``````````!-1$WD>!@H%`````````````````````0``````````
+M$U83="$&%`4````````````````````!```````````3JQ.P%P`*!0``````
+M`````````````!`,`````````!.P$]@7`!04````````````````````$`(`
+M````````$[\3OQ<`"@4````````````````````0#``````````4`!1X!084
+M%````````````````````````````````!0R%&X7`!04````````````````
+M````&`$`````````%#(4;A0`%!0````````````````````8`0`````````4
+M/!1X#P`4%`````````````````````4``````````!0\%'@1!A04````````
+M`````````````0$`````````%#P4>!(`%!0````````````````````%````
+M```````4/!1X%``4%`````````````````````4``````````!0\%'@7`!04
+M````````````````````!0``````````%#P4>!<&%!0`````````````````
+M```!```````````4/!3(%`84%``````````"``````````0``````````!1X
+M%*`7`!04``````````$`````````!0``````````%(P4H!<`%!0`````````
+M`P`````````%```````````4C!3($@`4%``````````#``````````4`````
+M`````!2,%,@4`!04``````````<```````"`!0``````````%(P4R!0&%!0`
+M`````````P`````````!`@`````````4C!3(%P84%``````````#````````
+M``$"`````````!2,%,@7!A04``````````,``````````0``````````%(P4
+MR!X`%!0````````````````````````````````4C!9$!084%``````````#
+M`````````````````````!2@%,@1!A04``````````,``````````0``````
+M````%7P5]!X&%!0``````````@`````````$```````````5?!9$%`84%```
+M```````#``````````$$`````````!5\%D0;`!04``````````,`````````
+M!0``````````%7P61!X`%!0``````````P`````````%```````````5?!9$
+M%P`4%``````````'````````@`$``````````!9Q%JT7`!04````````````
+M````````````````````%G$6K1X&%!0`````````````````````````````
+M```6<1:M'@84%``````````"``````````0``````````!9Q%L$%!A04````
+M````````````````````````````%G$6P1$`%!0`````````````````````
+M```````````6<1;!%``4%````````````````````````````````!9Q%L$>
+M`!04````````````````````````````````%G$6P1X&%!0`````````````
+M`````````P`````````6<1;!'@84%```````````````````````````````
+M`!,X$W0>`!04```````````````````$````````````$[`3V!X`%!0`````
+M``````````````0````````````4,A1N'@`4%``````````#````````!```
+M`````````!0\%'@>`!04``````````,````````$````````````%(P4R!X`
+M%!0``````````P````````0````````````6<1;!'@`4%```````````````
+M````!````````````!5\%D0>`!04``````````,````````$````````````
+M%(P4R!X`%!0````````````````````````````````4/!1X'@`4%```````
+M`````````````````````````!;!%L$>`!04```````````````````$````
+M````````%`H46@4&*"@````````````````````````````````4@A32!08H
+M*``````````!`````````````````````!3Z%7(%!B@H````````````````
+M````````````````%9H6$@4&*"@``````````0`````````````````````4
+M'A1&!08H*````````````````````````````````!1N%+X%!B@H````````
+M``$`````````````````````%.857@4&*"@`````````````````````````
+M```````5AA8F!08H*``````````!`````````````````````!10%'@1!B@H
+M````````````````````````````````%%`4>!<&*"@`````````````````
+M```````````````46A1:$08H*````````````````````````````````!1:
+M%%H7`"@H````````````````````````````````%*`4H!<&*"@`````````
+M`0`````````"```````````4H!2@%`8H*``````````!``````````(`````
+M`````!2"%((1`"@H``````````$``````````@``````````%*H4JA0`*"@`
+M`````````0`````````"```````````4@A2J%``H*``````````!````````
+M``(``````````!2"%*H7!B@H``````````$``````````@``````````%:06
+M'!0&*"@``````````0`````````"```````````6@!:H%``H*```````````
+M`````````````````````!:`%J@>!B@H````````````````````````````
+M````%H46K1X&*"@````````````````````````````````46A2"#P`H*```
+M```````#````````!````````````!2J%*H2`"@H``````````,````````$
+M````````````%:06'!0`*"@``````````P````````0````````````6@!:H
+M%``H*```````````````````!`````````````D("40%!A0%````````````
+M````````````````````"0@)1!0`%`4`````````````````````````````
+M```);`FH!084!0````````````````````````````````EL":@4`!0%````
+M````````````````(```````````"6P)J!X`%`4`````````````````````
+M```````````);`F>&P84!0````````````````````````````````EL"9X4
+M`!0%````````````````````(```````````"8`)BA0`%`4`````````````
+M```````````````````)F0FH%``4!0``````````````````````````````
+M``FC":@4`!0%```````````````````@(```````````";0)M`4&%`4`````
+M```````````````````````````)M`FT%``4!0``````````````````*"``
+M``````````G0"JP%!A0%````````````````````````````````"0@)1!0`
+M%`4````````````````````````````````);`EL%``4!0``````````````
+M``````````````````EQ"8`4`!0%````````````````````````````````
+M"84)BA0`%`4````````````````````````````````)CPF9%``4!0``````
+M``````````````````````````F>"9X4`!0%````````````````````````
+M````````":,)HQ0`%`4``````````(````````0````````````)HPFC%``4
+M!0``````````@`````````````````````FH":@4`!0%``````````"`````
+M```$````````````":@)J!0`%`4``````````(`````````````````````)
+MM`FT%``4!0``````````@```````!`````````````FT";04`!0%````````
+M``"`````````````````````"0@)1`4&%`4`````````````````````````
+M```````)"`E$%``4!0````````````````````````````````EL":@%!A0%
+M````````````````````````````````"6P)J!0`%`4`````````````````
+M``!````````````);`FH'@`4!0````````````````````````````````EL
+M"9X;!A0%````````````````````````````````"6P)GA0`%`4`````````
+M``````````!````````````)@`F*%``4!0``````````````````````````
+M``````F9":@4`!0%````````````````````````````````"=`*K`4&%`4`
+M```````````````````````````````)HPFH%``4!0``````````````````
+M("````````````D("404`!0%````````````````````````````````"6P)
+M;!0`%`4````````````````````````````````)<0F`%``4!0``````````
+M``````````````````````F%"8H4`!0%````````````````````````````
+M````"8\)F10`%`4````````````````````````````````)G@F>%``4!0``
+M``````````````````````````````FC":,4`!0%``````````"````````$
+M````````````":,)HQ0`%`4``````````(`````````````````````)J`FH
+M%``4!0``````````@```````!`````````````FH":@4`!0%``````````"`
+M````````````````````"0@)1`4&*"@`````````````````````````````
+M```)A0F%!08H*`````````````````````````````````F%"844!B@H````
+M````````````````````````````"84)A1(&*"@```````````````````0`
+M```````````)T`JL!08H*`````````````````````````````````'_$```
+M``````````````$`````````````````````````(`@``@``````````````
+M``````#_`````````````````"01````````````````````%`4`````````
+M``````````(%````````````````````$P```````````5`0````````````
+M``````````````````````````````$`````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````"4!``````````````````````
+M``````````````````````0`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````-0$```````````````````````````````
+M````````````"!``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````!%`0````````````````````````````````````````
+M``"```"`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````%4!```````````````````````````````````````````$``````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````90
+M,`````````````````(``````````P``````````````@`!`@```````````
+M````````"0@`````````````````````````````````````````````````
+M````````````````````````````````````````````````"%`P````````
+M`````````````````````````P````````$`!```````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````)4#`````````````````"
+M``````````0````#`````````!`@!```````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````$P,`````````````````(`````````
+M!`````,```````@``(!`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````C`P`````````````````@`````````$`````P``
+M``````````!`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````#,#`````````````````"``````````0````#```````(````
+M0```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``0P,`````````````````(`````````!`````,````````````@0```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````!3`P````
+M`````````````@`````````$`````P`````````````0````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````&,#``````````````
+M```"``````````0````#``````````$`$0``````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````$0$```````````````````````
+M```````````````````"``$`(```````````````````$@0`````````````
+M`````"`1````````````````````````````````````````````````````
+M`````````````````````````2`0````````````````````````````````
+M``````````0``@(`````````````````````````````````````````(!(`
+M````````````````````````````````````````````````````````````
+M```````````````!8!`````````````````!``````````,`````````````
+M`@!`@"```````````````````!#$```````````````````$(0``````````
+M````````````````````````````````````````````````````````````
+M``````%E$`````````````````$``````````P```````````````````#@`
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````4!`
+M```````````````````````````(`````@`````````````$````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````"0$``````````
+M`````````````````!`````"``````````````7'````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````-`0```````````````````
+M``````"```````(`````````````@```````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````!$!`````````````````!````````(``
+M`````@```````````$"`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````%0$`````````````````$````````@``````"````
+M``````(`0(``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````9`0```````````````````````````"`````(`````````````
+MB```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M!T!`````````````````!````````(`(`````@```````````$"$````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````(0$``````
+M```````````$````````@`@````"``````````(`0(0`````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````E`0```````````````
+M``````````"```````(`````````````@<<`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"T!`````````````````!```````
+M`(```````@```````````$"!QP``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````-4/\`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````*````````````````````"@``````````````````
+M``````````````HP_P``````````````````````````@`````,`````````
+M````````````````````````````````````````````````````````````
+M`````````0````````````````````$`````````````````````!```````
+M````"S`P``````````````````````````$``````P``````````````````
+M````````````````````````````````````````````````````````````
+M@````````````````````(`````````````````````$```````````,,#``
+M`````````````````````````@`````#````````````````````````````
+M```````````````````````````````````````````````````0````````
+M````````````$`````````````````````0```````````H0$```````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````"``````````````````
+M```@````````````````````!```````````"D!`````````````````````
+M`````'A@`````@``````````````````````````````````````````````
+M```````````````````````````````*0```````````````````!$``````
+M```````````````$```````````*4$``````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````(````````````````````"```````````````
+M``````0```````````&9,```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````@````````````````````(````````````````````!```
+M`````````&#_`````````````````P````````0`````"````````^``````
+M``````````````````+`````````````````````````````````````````
+M`*_````````````````````+\``````````````````````(````````````
+M9O\````````````````#````````!``````(```````#X```````````````
+M`````````L``````````````````````````````````````````!\``````
+M``````````````'P``````````````````````@```````````!G_P``````
+M``````````,````````$``````@```````/@```````````````````````"
+MP``````````````````````````````````````````OP```````````````
+M````"_``````````````````````"````````````&C_````````````````
+M`P````````0`````"````````^````````````````````````+`````````
+M`````````````````````````````````%?````````````````````5\```
+M```````````````````(````````````8?\````````````````#````````
+M!``````0```````#X```````````````````````````````````````````
+M````````````````````````K\````````````````````OP````````````
+M``````````@```````````!B_P````````````````,````````$`````!``
+M``````/@```````````````````````"P```````````````````````````
+M``````````````"OP```````````````````"_``````````````````````
+M"````````````&/_`````````````````P````````0`````"````````>``
+M``````````````````````+`````````````````````````````````````
+M`````"_````````````````````+\``````````````````````(````````
+M````9/\````````````````#````````!``````0```````<``@`````````
+M`````````````L``````````````````````````````````````````!\``
+M``````````````````'P``````````````````````@```````````!E_P``
+M``````````````,````````$`````!````````B$````````````````````
+M``````````````````````````````````````````````!7P```````````
+M````````%?``````````````````````"````````````&G_````````````
+M`````P````````0`````$````````\````````````````````````+`````
+M``````````````````````````````````````?````````````````````!
+M\``````````````````````(````````````:O\````````````````#````
+M````!``````0```````#P```````````````````````````````````````
+M````````````````````````````+\````````````````````OP````````
+M``````````````@```````````&8_P``````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````$``\`#S@8@`\`#S`$$`@`"#@8D`@`"#`$@`\@#U@8H`
+M\@#U`$,`]@#W@8L`]@#W`$H`\0#T@8P`\0#T`$L`@0"$@8T`@0"$`$P`@@"%
+M@8\`@@"%`8@`\`#S`8D`@`"#`8H`\@#U`8L`]@#W`8P`\0#T`8T`@0"$`8\`
+M@@"%```````(```````````````````````````````````````````!`A=P
+M"P",```````!`B,H#P`2```````!`B[@"@"8`@`````!`D90#@`D`@`````!
+M`EW`"0"P!``````!`HR@#0!(!``````!`KN`"`!@!``````!`M+P#`!L!```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````(````````````````````````````
+M```````````````!`Q=P"P",```````!`R,H#P`2```````!`R[@"@"8`@``
+M```!`T90#@`D`@`````!`UW`"0"P!``````!`XR@#0!(!``````!`[N`"`!@
+M!``````!`]+P#`!L!```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````(````````
+M```````````````````````````````````!`A=P"P",```````!`B,H#P`2
+M```````!`B[@"@"8`@`````!`D90#@`D`@`````!`EW`"0"P!``````!`HR@
+M#0!(!``````!`KN`"`!@!``````!`M+P#`!L!```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````(```````````````````````````````````````````!`Q=P
+M"P",```````!`R,H#P`2```````!`R[@"@"8`@`````!`T90#@`D`@`````!
+M`UW`"0"P!``````!`XR@#0!(!``````!`[N`"`!@!``````!`]+P#`!L!```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````$````````````````````````````
+M```````````````!``/H"P""```````!``?0"@2$`0`````!`!5\"02+`0``
+M```!`"KX"`26`0``````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````*($````````
+M`````*((4#Y&1E`^1D8``*(,9(!!;&2`06P``*(0`9F@`P&9H`,``*(4!$S6
+M$`1,UA```*(8$X``0!.``$```*(<&^``8!O@`&```*(@#%.`"@Q3@`H``*(D
+M`!3?.P`4WSL``*(H```!M0```;4``*(L````(````"```)B<````````````
+M`)B<`````````````)B<`````````````)B<`````````````)B<````````
+M`````)B<`````````````)B<`````````````)B<`````````````)B<````
+M`````````)B<`````````````)B<`````````````)B<`#@````X`````)B<
+M`````````````)B<`````````````)B<`````````````)B<``0`^0`$`/D`
+M`)C4``````````0``)B<`````````````)B<`````````````)B<````````
+M`````)B<`````````````)B<`````````````)B<$````!```````)B<!```
+M``0``````)B<`````````````)B<`````````````)B<`````````````)B<
+M``````H``````)B<`#@`@`(X`(```)B<``(`!@````8``)B<````D@```)(`
+M`)B<````H````*```)B<``0`!P`$``<``)C4````&@```!H``)B<````2```
+M`$@``)B<````$````!```)B<````"`````@``)B<````#P````\``)B<````
+M\@```&(``)B<``"03P``D$P``)B<```26@``$IH``)C,````#@````\````(
+M```````````````````````````````````````````!`A=P"P",```````!
+M`B,H#P`2```````!`B[@"@"8`@`````!`D90#@`D`@`````!`EW`"0"P!```
+M```!`HR@#0!(!``````!`KN`"`!@!``````!`M+P#`!L!```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````(````````````````````````````````````````
+M```!`@NX"P"&```````!`A&4#P`)```````!`A=P"@",`@`````!`B,H#@`2
+M`@`````!`B[@"0"8!``````!`D90#0`D!``````!`EW`"``P!``````!`FEX
+M#``V!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````(````````````````````
+M```````````````````````!`@7<"P"#```````!`@C*#P`$```````!`@NX
+M"@"&`@`````!`A&4#@`)`@`````!`A=P"0",!``````!`B,H#0`2!``````!
+M`B[@"``8!``````!`C2\#``;!```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````'
+M```````````````````````````````````````````!`Q=P"P",```````!
+M`R[@"@"8`@`````!`T90#@`D`@`````!`UW`"0"P`P`````!`XR@#0!(`P``
+M```!`[N`"`!@`P`````!`]+P#`!L`P``````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````(````````````````````````````````````````
+M```!`Q=P"P",```````!`R,H#P`2```````!`R[@"@"8`@`````!`T90#@`D
+M`@`````!`UW`"0"P!``````!`XR@#0!(!``````!`[N`"`!@!``````!`]+P
+M#`!L!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````$````````````````````
+M```````````````````````!``/H&P""```````!``?0&@2$`0`````!`!5\
+M&02+`0`````!`"KX&`26`0``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````,
+M```````````````````````````````````````````!``/H&P""```````!
+M``?0&@2$`0`````!`!5\&02+`@`````!`"KX&`26`P```````A=P"P`,!```
+M`````B,H#P`2!``````!`B[@"@`8!@`````!`D90#@`D!@`````!`EW`"0`P
+M"``````!`HR@#0!("``````!`KN`"`!@"``````!`M+P#`!L"```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````-````````````````````````````````````````
+M```!!`#Z`P"!``)D`F0!!`'T!P"!``')`<D!!`/H`@""`0#D`.0!!`?0!@"$
+M`@"@`*`!!`NX`0"&`P",`(P!`A=P"P",!``\`#P!`B,H#P`2!``\`#P!`B[@
+M"@"8!@`P`#`!`D90#@`D!@`P`#`!`EW`"0`P"``L`"P!`HR@#0!("``L`"P!
+M`KN`"`!@"``L`"P!`M+P#`!L"``L`"P`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5
+M*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5
+M*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5
+M*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5
+M*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5
+M*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5
+M*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5
+M*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5
+M*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5
+M*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5
+M*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``
+M1T-#.B`H1TY5*2`S+C,N,@``+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N
+M<F5L82YT97AT`"YR96QA+G)O9&%T80`N<F]D871A+G-T<C$N.``N<F5L82YD
+M871A`"YB<W,`+F-O;6UE;G0`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M(`````$`````````!@```````````````````$````````(]<```````````
+M``````````@``````````````!L````$````````````````````````````
+M`V.0````````W:`````+`````0`````````(`````````!@````K`````0``
+M```````"``````````````````(]L````````)``````````````````````
+M"```````````````)@````0````````````````````````````$03``````
+M```<@`````L````#``````````@`````````&````#,````!`````````#(`
+M`````````````````LVP`````````2`````````````````````(````````
+M``$```!'`````0`````````#``````````````````+.T````````%50````
+M````````````````"```````````````0@````0`````````````````````
+M```````$7;``````````P`````L````&``````````@`````````&````$T`
+M```(``````````,``````````````````R0@`````````9@`````````````
+M```````"``````````````!2`````0````````````````````````````,D
+M(`````````.H`````````````````````0``````````````$0````,`````
+M```````````````````````#)\@`````````6P````````````````````$`
+M``````````````$````"`````````````````````````````RMH````````
+M)D`````,````!P`````````(`````````!@````)`````P``````````````
+M``````````````-1J````````!'H`````````````````````0``````````
+M``````````````````````````````````````,```$`````````````````
+M``````````,```,```````````````````````````,```4`````````````
+M``````````````,```8```````````````````````````,```@`````````
+M``````````````````,```D``````````````````````````1(```$`````
+M``"Q'`````````"D````#!(```$```````":(``````````(````%Q(```$`
+M``````%-]`````````*(````(A(```$```````!UJ`````````",````+1(`
+M``$```````%LY`````````)L````.!(```$```````$1W`````````!0````
+M0Q(```$```````%ZU`````````'L````3A(```$```````!FM`````````&<
+M````61(```$```````'0J`````````%4````9!$```8````````]@```````
+M``&D````;Q(```$```````%5/``````````X````>A(```$```````!J/```
+M``````!$````A1(```$```````!8*`````````#4````D!$```8```````!-
+M'`````````&D````FQ(```$```````%%;`````````!(````IA(```$`````
+M``$_]``````````@````L1(```$```````$P>``````````(````O!(```$`
+M``````$02`````````&,````QQ(```$```````$>8`````````%0````TA(`
+M``$````````+[`````````"P````W1(```$```````#^@`````````#0````
+MZ!(```$```````#A<`````````#$````\Q(```$```````#"B`````````",
+M````_A(```$```````#(2``````````8```!"1(```$```````"@````````
+M``!<```!%!(```$```````%*/`````````!L```!'Q(```$```````$.R```
+M```````(```!*A(```$```````$L1``````````D```!-1(```$```````%O
+M4`````````#P```!0!(```$````````)+`````````!$```!2Q(```$`````
+M``$4G`````````$,```!5A(```$```````"V@``````````(```!81(```$`
+M``````&[(`````````&8```!;!(```$```````"D_``````````(```!=Q(`
+M``$```````#(8``````````@```!@A(```$````````0B`````````&@```!
+MG1$```8```````!(,`````````&D```!J!(```$```````%!5`````````",
+M```!LQ(```$```````"A8`````````"0```!OA(```$````````$6```````
+M```T```!R1(```$```````&_G`````````"$```!U!``````````````````
+M```````````!]1(```$```````!Q'`````````!@```"`!(```$```````%#
+MY`````````%L```""Q(```$```````%#?`````````!H```"%A(```$`````
+M``$"F`````````"L```"(1(```$```````!T/``````````L```"+!(```$`
+M``````"]D`````````!X```"-Q(```$```````##%`````````"0```"0A(`
+M``$```````$#B`````````!$```"31(```$```````"Z\``````````D```"
+M6!(```$```````%"+`````````",```"8Q(```$```````"E5`````````$H
+M```";A(```$```````!P#`````````!$```">1(```$```````":;```````
+M``!$```"A!(```$```````$YW`````````"L```"CQ(```$```````#$^```
+M``````!,```"FA(```$```````%!X``````````P```"I1(```$```````%`
+MK`````````!X```"L!(```$```````$3!`````````!T```"NQ(```$`````
+M``%P6``````````X```"QA(```$```````!J-``````````(```"T1(```$`
+M``````%"N`````````"0```"W!(```$```````!<\`````````=L```"YQ(`
+M``$```````#$=``````````\```"\A(```$```````$]"`````````!8```"
+M_1(```$````````$#`````````!,```#"!(```$```````%!)``````````P
+M```#$Q(```$```````&A@`````````%D```#'A(```$```````$J_```````
+M```\```#*1(```$```````%Y8`````````#,```#-!(```$```````!SH```
+M```````X```#/Q(```$```````"VS`````````#H```#2A(```$```````"\
+M&`````````"````#51(```$```````"9/`````````!````#8!(```$`````
+M``&HL`````````"@```#:Q(```$```````"+T`````````+X```#=A(```$`
+M``````!WZ``````````(```#@1(```$```````&I4`````````!(```#C!(`
+M``$```````"<3`````````.T```#EQ(```$````````"=`````````&,```#
+MIA(```$```````&,>`````````28```#L1(```$```````%3(`````````%$
+M```#O!(```$```````#$(``````````@```#QQ(```$```````&F'```````
+M``&P```#TA(```$```````%(W`````````%@```#W1(```$```````%4?```
+M```````@```#Z!(```$````````$```````````,```#\Q(```$```````"_
+M=``````````<```#_A(```$```````$#S`````````$(```$"1(```$`````
+M``$#1`````````!$```$%!(```$```````#9?`````````!(```$'Q(```$`
+M``````!D7``````````8```$*A(```$```````!SV`````````!D```$-1(`
+M``$````````$C`````````(H```$2Q(```$```````%X.`````````!````$
+M5A(```$```````"F?`````````%````$81(```$```````!U>``````````P
+M```$;!(```$```````"SW``````````D```$=Q(```$```````%P0```````
+M```8```$@A(```$```````#KD``````````P```$C1(```$```````$S'```
+M``````4\```$F!(```$```````$NF``````````0```$HQ(```$```````!K
+M:`````````#````$KA(```$```````"QP`````````!L```$N1(```$`````
+M``'#2`````````!8```$Q!(```$```````$PR`````````&0```$SQ(```$`
+M``````##\``````````(```$VA(```$```````!PC`````````"0```$Y1(`
+M``$```````$">``````````<```$\!(```$```````$6%`````````?D```$
+M^Q(```$```````&E>`````````"D```%!A(```$```````$_[``````````(
+M```%$1(```$```````"ZS``````````D```%'!(```$```````%6+```````
+M``!\```%)Q(```$```````":&``````````(```%,A(```$```````&UD```
+M``````,D```%/1(```$```````#*L`````````#L```%2!(```$```````!O
+M.`````````!0```%4Q(```$```````%#2``````````T```%7A(```$`````
+M``$=^`````````!H```%:1(```$```````$,6``````````D```%=!(```$`
+M``````'`(`````````!<```%?Q`````````````````````````````%C!(`
+M``$```````";D`````````"\```%EQ(```$```````!^``````````#L```%
+MHA(```$```````&ZT`````````!0```%K1(```$```````'!&``````````0
+M```%N!(```$```````$]R`````````#@```%PQ(```$````````'(```````
+M``&X```%U!(```$```````&M*`````````6\```%WQ(```$```````!T:```
+M``````"8```%ZA(```$```````"B5`````````#(```%]1(```$```````##
+MX``````````(```&`!(```$```````%`%``````````@```&"Q(```$`````
+M``'1_`````````"X```&%A(```$```````!]+`````````!\```&(1(```$`
+M``````$F6`````````"X```&+!(```$```````"VB`````````!$```&-Q(`
+M``$```````#;I`````````&\```&0A(```$```````"9?`````````"<```&
+M31(```$```````&#[`````````=0```&6!(```$```````%7E`````````"@
+M```&8Q(```$```````%0?``````````P```&;A(```$```````#+G```````
+M``',```&>1(```$```````%%M`````````,H```&A!(```$```````#!#```
+M``````!T```&CQ(```$```````#$```````````@```&FA(```$```````%*
+MJ`````````-,```&I1(```$```````&IX`````````'(```&L!(```$`````
+M``'#H`````````<<```&NQ(```$```````#$L`````````!(```&QA(```$`
+M``````"GQ``````````4```&T1(```$```````!I+``````````0```&W!(`
+M``$```````"R+`````````&P```&YQ(```$```````$[]`````````!4```&
+M\A(```$```````!XD``````````H```&_1(```$```````(B``````````$8
+M```'"!(```$```````!WV``````````(```'$Q(```$```````%`6```````
+M```0```''A(```$```````$_#`````````!(```'*1$```8```````!09```
+M``````&D```'-!(```$```````$,Z`````````!\```'/Q(```$```````'7
+M"`````````!<```'2A(```$```````!V@`````````",```'51(```$`````
+M``#(@``````````@```'8!(```$```````!^[`````````(\```':Q(```$`
+M``````%LN``````````L```'=A(```$```````$YD``````````D```'@1(`
+M``$```````$\2`````````#````'C!(```$```````'!4`````````'X```'
+MEQ(```$```````"*A``````````<```'HA(```$```````![=``````````@
+M```'K1(```$```````!R'`````````$0```'N!(```$```````!]Q```````
+M```\```'PQ(```$```````$[8`````````"4```'SA(```$```````%S7```
+M``````/<```'V1(```$```````&SE`````````'\```'Y!$```8```````!`
+MR`````````&D```'[Q(```$```````!L*`````````'X```'^A(```$`````
+M``!+*`````````!P```(!1(```$```````":*`````````!$```($!(```$`
+M``````!]J``````````<```(&Q`````````````````````````````(.Q(`
+M``$```````"!*`````````AH```(1A$```8````````````````````)```(
+M5A(```$```````%\P`````````"L```(81(```$```````"\F``````````\
+M```(;!(```$```````(\5`````````$8```(=Q(```$```````$?L```````
+M``!X```(@A(```$```````$]?`````````!,```(C1(```$```````!W\```
+M```````(```(F!(```$```````%XW`````````"$```(HQ(```$```````##
+MZ``````````(```(KA(```$```````#'J``````````L```(N1(```$`````
+M``"WM`````````#````(Q!(```$```````%`:``````````\```(SQ``````
+M```````````````````````(WA(```$```````"]$`````````!$```(Z1$`
+M``8```````!.P`````````&D```(]!(```$```````%2]``````````L```(
+M_Q(```$```````$GM`````````!L```)"A(```$```````#B-`````````!P
+M```)%1(```$```````"*:``````````<```)(!(```$```````#!L```````
+M``",```)*Q(```$```````$NJ`````````&T```)-A$```8```````!)U```
+M``````&D```)01(```$```````%%4``````````<```)3!(```$```````"_
+M'`````````!8```)5Q(```$```````%6_`````````"8```)8A(```$`````
+M``'./`````````)L```);1(```$```````"X=`````````(P```)>!(```$`
+M``````!\1``````````P```)@Q(```$```````"[B`````````!````)CA(`
+M``$```````#F,`````````&D```)F1(```$```````"1X``````````4```)
+MI!(```$```````%5L`````````!\```)KQ$```8```````!+>`````````&D
+M```)NA(```$```````"\U``````````\```)Q1(```$```````"^7```````
+M``#````)T!(```$```````!S+`````````!8```)VQ(```$```````&S!```
+M```````D```)YA`````````````````````````````)]1(```$```````$.
+MT`````````!0```*`!(```$```````$YM``````````H```*"Q(```$`````
+M``!N2``````````D```*%A(```$```````%"$``````````<```*(1(```$`
+M``````##V``````````(```*+!(```$```````$ZR`````````"8```*-Q$`
+M``8```````!";`````````&D```*0A(```$```````#*<``````````<```*
+M31(```$```````"T``````````%4```*6!(```$````````"%`````````!@
+M```*9A$```8````````_)`````````&D```*<1(```$```````#)]```````
+M``!\```*?!(```$```````"U5``````````0```*AQ$```8`````````$```
+M``````!(```*F1(```$```````!Q?``````````H```*I!(```$```````!R
+M$``````````,```*KQ(```$```````$P@`````````!(```*NA(```$`````
+M``!Z;`````````"````*Q1(```$```````'44`````````*X```*T!(```$`
+M``````!Z[``````````L```*VQ(```$```````#";``````````<```*YA(`
+M``$```````%4]`````````!(```*\1(```$```````!6N`````````$P```*
+M_!(```$```````&RY``````````@```+!Q(```$```````#)>`````````!\
+M```+$A(```$```````##I``````````T```+'1(```$```````%4O```````
+M```X```+*!(```$```````$,?``````````D```+,Q(```$```````&IF```
+M``````!(```+/A(```$```````#"/``````````P```+21(```$```````&+
+M/`````````$,```+5!(```$```````"U9`````````$<```+7Q(```$`````
+M``$/(`````````$H```+:A$```8```````!$$`````````&D```+=1(```$`
+M``````!\$``````````T```+@!(```$```````'!*``````````H```+BQ(`
+M``$```````!H=`````````"X```+EA(```$```````![&`````````!$```+
+MH1(```$```````$&4`````````7H```+K!(```$```````!X,`````````!@
+M```+MQ(```$```````!V9``````````<```+PA(```$```````$H(```````
+M``(T```+S1(```$```````&GS`````````#D```+V!(```$```````#*C```
+M```````D```+XQ(```$```````!7Z`````````!````+[A(```$```````$K
+MN`````````",```+^1(```$````````/?`````````",```,!!(```$`````
+M```*1`````````&H```,#Q(```$```````$JP``````````\```,&A(```$`
+M``````!W#`````````"0```,)1(```$```````![7``````````8```,,!(`
+M``$```````&?5`````````"L```,.Q(```$```````!OT``````````\```,
+M1A(```$```````&,2``````````P```,41(```$```````!'\`````````!$
+M```,7!(```$````````&M`````````!L```,9Q(```$```````$ZB```````
+M``!````,<A`````````````````````````````,@A(```$```````#KP```
+M``````'4```,C1(```$```````!H4``````````D```,F!(```$```````&X
+MM`````````(<```,HQ(```$```````!P4``````````\```,KA(```$`````
+M``$R6`````````#$```,N1(```$```````#`=`````````"8```,Q!(```$`
+M``````$-9`````````%D```,SQ`````````````````````````````,[Q(`
+M``$````````)<`````````#4```,^A(```$```````!NF`````````!8```-
+M!1(```$```````!N\`````````!````-$!(```$```````"[R`````````!0
+M```-&Q(```$```````!J@`````````#H```-)A(```$```````"^"```````
+M``!4```-,1(```$```````$@*`````````7X```-/!(```$```````#$0```
+M```````D```-1Q(```$```````%8-`````````)T```-4A(```$```````!W
+MT``````````(```-71(```$```````!N(``````````H```-:!(```$`````
+M``!R"``````````(```-<Q`````````````````````````````-@1(```$`
+M``````"ZI``````````H```-C!(```$````````-,`````````#$```-EQ(`
+M``$```````!W^``````````X```-HA(```$```````#)/``````````\```-
+MK1(```$```````#%1``````````P```-N!(```$```````"+#`````````#$
+M```-PQ(```$```````!\=``````````\```-SA(```$```````!QI```````
+M``!D```-V1(```$```````$Y:``````````H```-Y!(```$```````%4G```
+M```````@```-[Q(```$```````%L$`````````"H```-^A(```$```````"]
+M5``````````\```.!1(```$```````$K?``````````\```.$!(```$`````
+M``%];`````````:````.&Q(```$```````!SA``````````<```.)A(```$`
+M``````#'U`````````!T```.,1(```$```````"_D``````````X```./!(`
+M``$```````"C'`````````'@```.1Q(```$```````"['`````````!L```.
+M4A(```$```````##^``````````(```.71(```$```````":L`````````#@
+M```.:!$```8```````!2"`````````&D```.<Q(```$```````!ND```````
+M```(```.?A(```$```````"[%``````````(```.B1(```$```````!F2```
+M``````!L```.E!(```$```````!I/`````````#X```.GQ(```$```````$K
+M.`````````!$```.JA(```$````````0"`````````"````.M1(```$`````
+M``&_6``````````H```.P!(```$```````%`I``````````(```.RQ(```$`
+M``````#`+`````````!(```.UA(```$```````&>4`````````$$```.X1(`
+M``$```````#'*`````````"````.[!(```$```````#-B`````````O<```.
+M]Q$```8```````!3K`````````&D```/`A(```$```````$F.``````````@
+M```/#1(```$```````!OB`````````!(```/&!(```$````````(V```````
+M``!4```/(Q(```$```````!N;``````````D```/+A(```$```````&\N```
+M``````*@```/.1(```$```````&L8`````````#(```/1!(```$```````![
+ME``````````@```/3Q(```$```````#!@``````````P```/6A(```$`````
+M``%49``````````8```/91(```$```````![M`````````!<```/<!(```$`
+M``````!E6`````````!T```/>Q(```$```````!V-``````````P```/AA(`
+M``$```````"M4``````````L```/D1(```$````````-]`````````&(```/
+MG!(```$```````$1U``````````(```/IQ(```$```````"@7`````````!H
+M```/LA(```$```````#(V``````````T```/O1(```$```````!WX```````
+M```(```/R!(```$```````$%C`````````#$```/TQ(```$```````%5=```
+M```````\```/WA(```$```````'J3`````````$````/Z1(```$```````!W
+MG``````````T```/]!(```$```````!8_``````````P```/_Q(```$`````
+M``!/[`````````;,```0%1(```$```````%6J`````````!4```0(!(```$`
+M``````!\L`````````!\```0*Q(```$```````%:J````````!%H```0-A(`
+M``$```````$L:`````````(P```001(```$```````$,H`````````!(```0
+M3!(```$```````#)#``````````P```05Q(```$```````"@Q`````````"<
+M```08A(```$```````!'A`````````!L```0;1(```$```````"E!```````
+M``!0```0>!(```$```````"*H`````````!L```0@Q(```$```````#(H```
+M```````X```0CA(```$```````#99``````````8```0F1(```$```````!E
+MS`````````!\```0I!(```$```````"GO``````````(```0KQ(```$`````
+M``!U``````````!X```0NA(```$```````#]/`````````!4```0Q1(```$`
+M``````%2=`````````"````0T!(```$```````$_5`````````"8```0VQ(`
+M``$```````"_R`````````!D```0YA(```$```````"H3`````````4$```0
+M\1(```$```````"55`````````.````0_!(```$```````%`-``````````D
+M```1!Q(```$```````$,.``````````@```1$A(```$```````()'```````
+M``$0```1'1(```$```````$^J`````````!D```1*!(```$```````$J5```
+M``````!L```1,Q(```$```````%PD`````````+,```1/A(```$```````&S
+M*``````````D```121`````````````````````````````16Q(```$`````
+M``"PJ`````````!T```19A(```$```````$G$`````````"D```1<1``````
+M```````````````````````1@A(```$```````!O,``````````(```1C1(`
+M``$```````#$9``````````0```1F!(```$```````"A\`````````!D```1
+MHQ(```$```````$]8``````````<```1KA(```$```````&7V`````````$8
+M```1N1(```$```````#9Q`````````'@```1Q!(```$```````!*T```````
+M``!8```1W1(```$```````&S3`````````!(`'IZ,#`U8C4X-#8`>GHP,#)D
+M8C$Q8P!Z>C`R9&)F.#<U`'IZ,#)D8F(Q8C(`>GHP,F1B,C`U,P!Z>C`P,F1B
+M830R`'IZ,&9B8C%E,V8`>GHP8C<Y96$Y-`!Z>C`U8CAC-C5A`'IZ,#`U8C0P
+M860`>GHP-6(Y-#)E9`!Z>C!D.&1C-C)C`'IZ,#`Q.68T-S``>GHP,F1D.30R
+M9`!Z>C`R9&)E-S-D`'IZ,#`U8C8Y,F(`>GHP8C9D,C,R-0!Z>C`P-6(X-3-D
+M`'IZ,#`Q-F0Y,F4`>GHP8V9B,3@W-0!Z>C`P,F1B,S%C`'IZ,#)D86)B86,`
+M>GHP,F1B8S@U,0!Z>C`P,&(V8S8X`'IZ,#`P8C9B9C@`>GHP,&(V8V8U90!Z
+M>C`Q-F4Q9&9D`'IZ,&(V9C4P8C@`>GHP-F4P831F90!Z>C`P-C=D,F(Q`'IZ
+M,#`R9&)C-C$`>GHP8C9C83,R-0!Z>C`P-6(V8V9D`'IZ,#$V93!D9F0`>GHP
+M,#!B-F8V.`!A=&A?:&%L7W!R;V-E<W-?;F]I<V5F;&]O<@!Z>C`P-6(T.&%D
+M`'IZ,#)D8F8Q8C(`>GHP,#5B.#AC8@!Z>C`S,V5C.&)F`'IZ,&1B-#(U8S4`
+M871H7VAA;%]D;6%?8F5A8V]N7W)E<W!O;G-E7W1I;64`>GHP,&(V9C$V,0!Z
+M>C`V93`P8CAA`'IZ,#)D8F9C,60`>GHP9&,T93,Y,`!Z>C!D869E9#@V`'IZ
+M,#!B-F4R-V$`>GHP,F1B8F%B,@!Z>C!B-F0Q969F`'IZ,#$V9#DP9&0`>GHP
+M,F1B93@U,0!Z>C`P-6(V-&9D`'IZ,#`P8C9D-3(`>GHP8C9C.65F9@!Z>C`Q
+M-F4P,&1D`'IZ,#)D8F0X-S4`>GHP,F1B,S%B,@!Z>C`P8C<P.3(S`'IZ,#!B
+M-F0T-3``>GHP,#!B-F0Q9`!Z>C!B-F,R,S(U`'IZ,#)D8F1A8C(`>GHP,#`U
+M8C8S,@!Z>C`V9&5D9#DS`'IZ,#`Q-F1A-3``>GHP,#`V-V0S,@!Z>C`P8C9D
+M.3(S`'IZ,#`R9&(U,6,`>GHP,39D8V)F90!Z>C`P8C<P,30U`'IZ,#`Q-F1F
+M,F,`>GHP8C=F860S90!Z>C`Q-F0Y.3(P`'IZ,#)D8C%B86,`>GHP9&,V93,Y
+M,`!Z>C`U8C<P,64P`'IZ,#`P8C9B,3``>GHP8C<P.65F9@!Z>C`Q-F1F.#EB
+M`&%T:%]H86Q?871T86-H`'IZ,#9E,&9C,&0`>GHP,39D86(R9`!Z>C`R9&(Q
+M,S5D`'IZ,&4P-#8X-&(`>GHP,39E,CDQ9`!Z>C`P,&(V9F4X`'IZ,#!C9F(S
+M93``>GHP,#$V9#DT.`!Z>C`Q-F4R,#EB`'IZ,&(W,#%E9F8`>GHP,#!B-F,Y
+M9`!Z>C`P,#5B-6$R`'IZ,#)D8C$W,&$`871H7VAA;%]C;VUP=71E='AT:6UE
+M`'IZ,#)D8C5B86,`>GHP,#5B.#$S9`!Z>C`P8C9C.3(S`'IZ,&(V8C4P8C@`
+M>GHP,#5B-V8Y9`!Z>C!B-S`Q9#`R`'IZ,#9D9F8T-&$`>GHP,F1B-3<V,P!Z
+M>C`V965A9C8P`'IZ,&4P,#=C83$`>GHP,#)D868V,@!Z>C!B.#-A9#-E`'IZ
+M,#`P8C9B.3``>GHP,39D.65F80!Z>C`Q-F1E,#4Q`'IZ,#`P-6(V8C(`>GHP
+M-6(W9C$Q-`!Z>C`T864P,S%F`'IZ,#)D8F1D9F0`>GHP,#4T-V9E9`!Z>C`P
+M8C9B9C5E`'IZ,#!B-S$W-V0`>GHP,&(W,&8S9`!Z>C`Q-F0X.3(P`'IZ,#)D
+M8C%A8C(`>GHP,#`U8C8R,@!Z>C`P,&(V9C<X`'IZ,&(V.6(P-V,`871H7VAA
+M;%]F<F5E`'IZ,#5B-SEB,6(`>GHP,&(W,#<S9`!Z>C`R9&)E8F)D`'IZ,&(U
+M93,Q-3(`>GHP,39D9F)F,0!A=&A?:&%L7VUH>C)I965E`'IZ,#$V93$X.6(`
+M>GHP9&,R835C-0!Z>C`P,F1C-C!B`'IZ,#9D9C!B.&$`>GHP,F1B,S,U9`!Z
+M>C!B-F,U,V$T`'IZ,&8U-&0Q8C``>GHP8C9F9#,V,P!Z>C!D.61C-C)C`'IZ
+M,#5B-S0Q93``>GHP,F1A.6)A8P!Z>C!D8S(Q9#-A`'IZ,#!B-S$W,V0`>GHP
+M,39D.60T,0!Z>C`P-6(X-&9D`'IZ,#`U8CAA8F0`>GHP,&(W,#$R,P!Z>C`P
+M-6(V-3)B`'IZ,#)D8C,X-S4`>GHP,39E,S`Y8@!Z>C`P-6(V,&(R`'IZ,#)D
+M8C$X-S4`>GHP,#)D8C@T,@!Z>C`R9&(Q-S8S`'IZ,&(W9&5A.30`>GHP,&(W
+M,#$V,0!Z>C`Q-F0W9#0Q`'IZ,#`Q-F-D,S(`>GHP-F1E,&(X80!Z>C`V9#ED
+M9#DS`'IZ,&1B,V5D.#8`>GHP,#5B-#AE9`!Z>C`P,F1C.#!B`'IZ,#`R9&)C
+M-#(`>GHP,F1B83@U,0!Z>C`R9&(S,V5D`'IZ,#`U8C@P9F0`>GHP,#5B-V8R
+M90!Z>C`R9&)F9&9D`'IZ,#$V938T.&$`>GHP,#)D869F,@!Z>C`P-6(W-SED
+M`'IZ,#`P8C9E93@`>GHP,39E-#0X80!Z>C`P8C9F-F)C`'IZ,#$V9&$Y,C``
+M>GHP-6(W.#%E,`!Z>C`P,F1C83!B`'IZ,#`U8C0T860`>GHP-F1D9C0T80!Z
+M>C!F86,P8SEB`'IZ,&(V9CEE9F8`>GHP,&(V8S9B8P!A=&A?:&%L7V%D9&ET
+M:6]N86Q?<W=B85]B86-K;V9F`'IZ,#`P,F1B.3(`871H7VAA;%]V97)S:6]N
+M`'IZ,#)D8F%C,F4`>GHP,F1B-SEA90!Z>C`P,39E-3,R`'IZ,&(V8V8P,#D`
+M>GHP,#$V93$R8P!Z>C`P,39D.64T`'IZ,#`P,F1A96$`>GHP,#5B-6-B,@!Z
+M>C`Q-F1A,C4Q`'IZ,#9F-F%F-C``>GHP-F1F9&0Y,P!A=&A?:&%L7VUA;&QO
+M8P!Z>C`P,&(V9&0R`'IZ,#)D9#DR860`>GHP,39D8C(U,0!Z>C!E,3`W8V$Q
+M`'IZ,#!B-F,W-64`>GHP,39D9#`U,0!Z>C`R9&)D,6(R`'IZ,#)D8S$W-C,`
+M>GHP8C8Y,&0V9`!Z>C`Q-F1F,#4Q`'IZ,#`Q-F0Y-3``>GHP,&(W,#9B8P!Z
+M>C`P,39D.#<R`'IZ,#9D968T-&$`>GHP-6(X8S)E9`!Z>C`V9F(Y-#=B`'IZ
+M,&5B8C%E,V8`>GHP8C9F.60P,@!Z>C!D,31D,6(P`'IZ,&(T.#`S,64`>GHP
+M,39D8F)F90!Z>C`Q-F4U-#AA`'IZ,#`Q-F0X-3``>GHP,#!B-F9F.`!A=&A?
+M:&%L7VUE;6-P>0!Z>C`R9&)C8F)D`'IZ,#$V9&$P9&0`>GHP,F1B8F1F9`!Z
+M>C`R9&(R.#4Q`'IZ,#)D8F1C,60`>GHP-F1B,&-F,@!Z>C`Q-F5B.6%D`'IZ
+M,#!B-F-E8F,`>GHP9#DT.#1A,0!A=&A?:&%L7W!R;V)E`'IZ,#$V96$Y860`
+M>GHP9F0T9#%B,`!Z>C`R9&(S-S8S`&%T:%]H86Q?8G5I;&1O<'1S`'IZ,#)D
+M868S-60`>GHP-F1D9&0Y,P!Z>C!D861C-C)C`'IZ,#$V9&8R-3$`>GHP,#!B
+M-F,Q,`!Z>C`Q-F0Y,C4Q`'IZ,#)D8C`X-3$`>GHP8C<R,6%E9`!Z>C`V-V-F
+M8V%E`'IZ,#`P8C9C9C@`>GHP8SDT9#%B,`!Z>C`R9&%F86(R`'IZ,#5B.3)A
+M960`>GHP,#5B.&-C8@!Z>C!B-F0Y969F`'IZ,#)D8C$Q8C(`>GHP,F1B9F9B
+M,0!Z>C`R9&)F-S8S`'IZ,#`U8C8X9F0`>GHP,#5B-#1E9`!Z>C!B-S$Q865D
+M`'IZ,&(U93,Q-C``>GHP9#@T.#1A,0!Z>C`Q-F0X8C)D`'IZ,#$V93`X.6(`
+M>GHP,F1B8C@W-0!Z>C`R9&%E.#4Q`'IZ,&(X,65A.30`>GHP,39D96,Q9@!Z
+M>C`P8C9F96)C`'IZ,&4X.30Y,#<`>GHP,&(V96$W80!Z>C`S,V4X9F)F`'IZ
+M,&-F834X-S4`>GHP,F1B.3EA90!Z>C`R9&(Y86(R`'IZ,#`P8C9B93@`>GHP
+M9&4V.#,W9@!Z>C`Q-F1A8F9E`'IZ,&(W,#ED,#(`>GHP-C=D,C5E,@!Z>C`Q
+M.68S83`Q`'IZ,#<P,SDT-V(`871H7VAA;%]M96UZ97)O`'IZ,#9D9F9C,&0`
+M>GHP8C8W-3!B.`!Z>C`Q-F4R9&9D`'IZ,#`P8C9D,C(`>GHP-F9E868V,`!Z
+M>C!D8S1A-6,U`'IZ,#!B-S!F-V0`871H7VAA;%]S=U]B96%C;VY?<F5S<&]N
+M<V5?=&EM90!Z>C`Y9C8T8C9A`'IZ,#`U8C8U-V$`>GHP-F8S.30W8@!Z>C`V
+M9&$P8V8R`'IZ,&(W8F%D,V4`>GHP,&(V9CDV,0!Z>C!B-CDW,V)C`'IZ,#)D
+M8F0S-60`>GHP,#5B.#AF9`!Z>C`R9&)B8S%D`'IZ,#)D869D9F0`>GHP-F0W
+M9&0Y,P!A=&A?:&%L7V1E;&%Y`'IZ,#)D8C%D9F0`>GHP-C=D,F8T,0!Z>C`R
+M9&%F.#<U`'IZ,&(W961E-F0`>GHP,39D.&0T,0!Z>C`P,F1A93DR`'IZ,&(W
+M861E-F0`>GHP,F1B8C,U9`!Z>C`R9&(S9&9D`'IZ,#)D8C4S960`>GHP,39D
+M8V5A90!Z>C`P,&(V9&$R`'IZ,#`P8C9E,C(`>GHP-6(X,#`T,0!Z>C`P,39D
+M.#0X`'IZ,#$V9#EB,F0`>GHP,#$V93`R8P!Z>C`P8C<P-S=D`'IZ,#`U8C8Y
+M-V$`>GHP,#$V9&%E-`!Z>C`Q-F4Q,#EB`'IZ,#`U8C1A,F0`>GHP,39D93!D
+M9`!Z>C`Q-F1F,&1D`'IZ,&1F,#=C83$`>GHP,F1B9#<V,P!Z>C`P,&(V934R
+M`'IZ,#8W9#!C-#<`>GHP-6(V8S9D8@!Z>C!C,S$U96(U`'IZ,&1B,65D.#8`
+M>GHP-F0T,#9E,`!Z>C`Q-F4P,C4Q`'IZ,#`P,F1B8C(`>GHP,#)D9#@V9`!Z
+M>C`P,39E,31D`'IZ,#)D8C4Y864`>GHP,#8W9#(R,0!Z>C`Q-F0X,&1D`'IZ
+M,#`U8C@Y,V0`>GHP-6(X,6(Q8@!Z>C`R9&(Q,V5D`'IZ,#!B-F0Q,C,`>GHP
+M,#!B-F-E.`!Z>C`U8CAA865D`'IZ,&(V960S-C,`>GHP,F1A9C%B,@!Z>C`P
+M,#5B-64R`'IZ,#,S96)F8F8`>GHP-6(V.#9D8@!Z>C`P,&(V968X`'IZ,&(W
+M,3EA960`>GHP,#5B-3AB,@!Z>C`U8C=D8C%B`'IZ,&(X,F1E-F0`>GHP,#$V
+M9#<S,@!Z>C`R9&%D86(R`'IZ,&8T-64V93,`871H7VAA;%]I;FET7V-H86YN
+M96QS`'IZ,#!B-F0V8F,`>GHP8S$T9#%B,`!Z>C`P,#)D8F0R`'IZ,&1A-#@T
+M83$`>GHP,39E,&(X-P!Z>C`U8CDP,F5D`'IZ,&1C,F4S.3``>GHP838P9#$T
+M-0!Z>C`R9&)A8F)D`'IZ,#`P8C9C,60`>GHP-6(X96%E9`!Z>C`P-6(W8CED
+M`'IZ,#`U8C4T-#8`>GHP-6(V-#9D8@!Z>C`P8C9F.3(S`'IZ,&1D-C@S-V8`
+M>GHP,39E,3(U,0!Z>C!D8S9A-6,U`'IZ,#)D8C,W,&$`>GHP,#`U8C8W,@!Z
+M>C`V9&5F8S!D`'IZ,#)D8F8S-60`>GHP,#!B-F,W.`!Z>C`P,39D.#,R`'IZ
+M,#)D8C4W,&$`>GHP,#5B-F0W80!Z>C`P,F1B,CDR`'IZ,#`U8CDP8V(`871H
+M7VAA;%]R96=?=W)I=&4`>GHP8C9F-3,V,P!Z>C`P-6(U8S0V`&%T:%]H86Q?
+M<F5G7W)E860`>GHP-F0Y,&-F,@!Z>C`V9#AD9#DS`'IZ,#$V9&9B.#<`>GHP
+M,#$V9&$T.`!Z>C!B-C8S,6$X`'IZ,#`R9&(P.3(`871H7VAA;%]G971W:7)E
+M;&5S<VUO9&5S`'IZ,#$V93%B.#<````````````````!`````P````````IP
+M``````````0````!`````P````````NL``````````@````!`````P``````
+M``NL``````````P````!`````P````````NL`````````!`````!`````P``
+M``````IX`````````!0````!`````P````````NL`````````!@````!````
+M`P````````J0`````````!P````!`````P````````J8`````````"`````!
+M`````P````````O@`````````"0````!`````P````````J@`````````"@`
+M```!`````P````````JL`````````"P````!`````P````````KP````````
+M`#`````!`````P````````K(`````````#0````!`````P````````K8````
+M`````#@````!`````P````````KD`````````#P````!`````P````````KX
+M`````````$`````!`````P````````O@`````````$0````!`````P``````
+M``O@`````````$@````!`````P````````LP`````````$P````!`````P``
+M``````L\`````````%`````!`````P````````NL`````````%0````!````
+M`P````````M(`````````%@````!`````P````````NL`````````%P````!
+M`````P````````M4`````````&`````!`````P````````M@`````````&0`
+M```!`````P````````ML`````````&@````!`````P````````O@````````
+M`&P````!`````P````````O@`````````'`````!`````P````````NL````
+M`````'0````!`````P````````O@`````````'@````!`````P````````NT
+M`````````'P````!`````P````````O@`````````(`````!`````P``````
+M``O@`````````(0````!`````P````````O@`````````(@````!`````P``
+M``````O0`````````(P````#````"0````````!(`````````)@````#````
+M#`````````!(`````````+P````#````"0````````!@`````````-0````#
+M````"0````````!P`````````.`````#````"0````````"``````````/P`
+M```#````"0````````"0`````````0`````#````#`````````"0````````
+M`1`````#````"0````````"H`````````2@````#````"0````````"`````
+M`````30````#````"0````````#``````````4`````#````#`````````#`
+M`````````60````#````"0````````#8`````````70````#````"0``````
+M``!@`````````8P````#````"0````````!@`````````:0````#````"0``
+M``````!P`````````;0````#````"0````````#P`````````<`````#````
+M#`````````#P`````````<@````#````"0````````$(`````````<P````#
+M````#`````````$(`````````>@````#````#`````````"``````````?``
+M```#````#`````````!P`````````?0````#````"0````````"H````````
+M`?P````#````#`````````"H`````````@0````#````#`````````#8````
+M`````@@````#````#`````````!@`````````WP```!U````!P``````````
+M`````````XP```&#````!P```````````````````Z````!&````!P``````
+M````````````!!P```&/````!P``````````````````!#0```$T````!P``
+M````````````````!VP```"[````!P``````````````````""P```"[````
+M!P``````````````````"0@```$=````!P``````````````````"1`````"
+M````"0``````````````````"10````"````#```````````````````"4P`
+M``$=````!P``````````````````"5@````"````"0``````````````````
+M"5P````"````#```````````````````"@````!E````!P``````````````
+M````"AP```!E````!P``````````````````"EP````!````"0``````````
+M````````"F`````!````#```````````````````#.````&/````!P``````
+M````````````$!0```#\````!P``````````````````$#P```$=````!P``
+M````````````````$%@````"````"0`````````&````````$%P````"````
+M#``````````&````````$+0````"````"0`````````&````````$+@````"
+M````#``````````&````````$.@```$=````!P``````````````````$BP`
+M```"````"0`````````8````````$C`````"````#``````````8````````
+M$D@````"````"0`````````N````````$DP````"````#``````````N````
+M````%F@```#,````!P``````````````````'(0```$?````!P``````````
+M````````(!0```""````!P``````````````````+#@```#,````!P``````
+M````````````+%@```$?````!P``````````````````+/````$?````!P``
+M````````````````+8P```$?````!P``````````````````+?P```""````
+M!P``````````````````.%0````"````"0````````!$````````.%@````"
+M````"0````````!<````````.%P````"````#`````````!<````````.&@`
+M```"````#`````````!$````````2,P````$````"0````````!8````````
+M2-`````$````#`````````!8````````2.@````$````"0````````H`````
+M````2.P````$````#`````````H`````````2=0````$````"0````````H`
+M````````2=@````$````#`````````H`````````2YP````$````"0``````
+M``H`````````2Z`````$````#`````````H`````````3"0````$````"0``
+M``````!8````````3"@````$````#`````````!8````````3(P````$````
+M"0```````"2`````````3)`````$````#````````"2`````````3+0```#E
+M````!P``````````````````3/`````$````"0````````!8````````3/0`
+M```$````#`````````!8````````3;0````$````"0````````!8````````
+M3;@````$````#`````````!8````````3C@````$````"0````````FX````
+M````3CP````$````#`````````FX````````42`````"````"0````````!\
+M````````420````"````#`````````!\````````4?P````$````"0``````
+M`!K@````````4@`````$````#````````!K@````````4B0````$````"0``
+M`````!1`````````4B@````$````#````````!1`````````4D@````$````
+M"0```````!X@````````4DP````$````#````````!X@````````4FP````$
+M````"0```````"%`````````4G`````$````#````````"%`````````4I0`
+M```$````"0```````"/@````````4I@````$````#````````"/@````````
+M4K0````$````"0```````!K@````````4K@````$````#````````!K@````
+M````5!P```$?````!P``````````````````5:@````"````"0````````!\
+M````````5:P````"````#`````````!\````````5>`````!````"0``````
+M`$@T````````5>@````!````#````````$@T````````5_````#\````!P``
+M````````````````6+0```#\````!P``````````````````600```#\````
+M!P``````````````````6T`````$````"0```````#T`````````6T0````$
+M````#````````#T`````````6_0````$````"0```````#U4````````6_@`
+M```$````#````````#U4````````7/@```#,````!P``````````````````
+M71`````"````"0````````"8````````710````"````#`````````"8````
+M````71P```#E````!P``````````````````79P```$Z````!P``````````
+M````````7;P```&/````!P``````````````````7=0```&/````!P``````
+M````````````7?0```&,````!P``````````````````7@P```&,````!P``
+M````````````````7B0```&/````!P``````````````````7C`````N````
+M!P``````````````````7D@```&/````!P``````````````````7EP```&,
+M````!P``````````````````7FP```$I````!P``````````````````7IP`
+M``$I````!P``````````````````7L0```$I````!P``````````````````
+M7Q@```$I````!P``````````````````7V````$I````!P``````````````
+M````8%0```!Z````"0``````````````````8%@```!Z````#```````````
+M````````8WP```$I````!P``````````````````9`@```&,````!P``````
+M````````````9#````&,````!P``````````````````9$````""````!P``
+M````````````````9&````""````!P``````````````````96@```&,````
+M!P``````````````````97P```&,````!P``````````````````99````&,
+M````!P``````````````````9:0```&,````!P``````````````````9;@`
+M``&,````!P``````````````````9>0````P````"0``````````````````
+M9>@````P````#```````````````````9?@```$G````"0``````````````
+M````9?P```$G````#```````````````````9C0```%B````!P``````````
+M````````9E@```&,````!P``````````````````9F@```&/````!P``````
+M````````````9H@```&,````!P``````````````````9J````&,````!P``
+M````````````````9M````&/````!P``````````````````9O````&,````
+M!P``````````````````9P0```&,````!P``````````````````9Q@```&,
+M````!P``````````````````9T0```&/````!P``````````````````9V``
+M``&,````!P``````````````````9W0```&,````!P``````````````````
+M9X0```&/````!P``````````````````9]0```&,````!P``````````````
+M````:#P```&,````!P``````````````````:%P```&/````!P``````````
+M````````:'P```&/````!P``````````````````:6````&,````!P``````
+M````````````:?P```&,````!P``````````````````:B````&,````!P``
+M````````````````:EP```&/````!P``````````````````:J@```&,````
+M!P``````````````````:L````&,````!P``````````````````:M@```&,
+M````!P``````````````````:O````&,````!P``````````````````:P@`
+M``&,````!P``````````````````:R````&,````!P``````````````````
+M:S@```&,````!P``````````````````:U0```&,````!P``````````````
+M````:_````&,````!P``````````````````;!0```&,````!P``````````
+M````````;7````&,````!P``````````````````;8P```&,````!P``````
+M````````````;:@```&,````!P``````````````````;<0```&,````!P``
+M````````````````;>````&,````!P``````````````````;?P```&,````
+M!P``````````````````;A````!N````!P``````````````````;C0```#E
+M````!P``````````````````;EP```#E````!P``````````````````;G0`
+M```"````"0```````!3`````````;G@````"````#````````!3`````````
+M;GP```#E````!P``````````````````;K````&/````!P``````````````
+M````;L0```!)````!P``````````````````;M@```&/````!P``````````
+M````````;UP```$C````!P``````````````````;W0```!S````!P``````
+M````````````;Y0```&/````!P``````````````````;\````&,````!P``
+M````````````````;]P```&/````!P``````````````````;_P```&,````
+M!P``````````````````<!@```&/````!P``````````````````<$````&,
+M````!P``````````````````<&P```&/````!P``````````````````<)@`
+M``&/````!P``````````````````<.@```&,````!P``````````````````
+M<0@```%.````!P``````````````````<2@```&/````!P``````````````
+M````<6@```&,````!P``````````````````<8@```&/````!P``````````
+M````````<;````&/````!P``````````````````<?0```&,````!P``````
+M````````````<C````#E````!P``````````````````<H0```&,````!P``
+M````````````````<M````&,````!P``````````````````<N@```&/````
+M!P``````````````````<P````&/````!P``````````````````<Q@```&,
+M````!P``````````````````<SP```&/````!P``````````````````<U``
+M``&/````!P``````````````````<V````&/````!P``````````````````
+M<Y````&/````!P``````````````````<ZP```&/````!P``````````````
+M````<\0```&,````!P``````````````````<^@```&/````!P``````````
+M````````=!````&/````!P``````````````````="0```&/````!P``````
+M````````````=$P```&/````!P``````````````````='0```&/````!P``
+M````````````````=)````&/````!P``````````````````=*P```&/````
+M!P``````````````````=,@```&/````!P``````````````````=.0```&/
+M````!P``````````````````=1@````D````!P``````````````````=40`
+M``%:````!P``````````````````=5@```&,````!P``````````````````
+M=80```&/````!P``````````````````=9@````D````!P``````````````
+M````=;0````D````!P``````````````````=>````&/````!P``````````
+M````````=?0```%:````!P``````````````````=A0```&,````!P``````
+M````````````=D````&/````!P``````````````````=E0````D````!P``
+M````````````````=I0```&/````!P``````````````````=JP```&,````
+M!P``````````````````=M````&/````!P``````````````````=N@```&,
+M````!P``````````````````=Q@````D````!P``````````````````=T0`
+M``&/````!P``````````````````=U@```%:````!P``````````````````
+M=WP```&,````!P``````````````````=Z@```&/````!P``````````````
+M````=\`````D````!P``````````````````>"````$5````!P``````````
+M````````>&@```&,````!P``````````````````>(`````:````!P``````
+M````````````>*@```$V````!P``````````````````>,0```&/````!P``
+M````````````````>-P```&,````!P``````````````````>/0```&/````
+M!P``````````````````>0P```&,````!P``````````````````>30```&/
+M````!P``````````````````>4P```&,````!P``````````````````>50`
+M``$T````!P``````````````````>70```&/````!P``````````````````
+M>8P```$T````!P``````````````````>9@```&/````!P``````````````
+M````>:@```&,````!P``````````````````>=@```&/````!P``````````
+M````````>?````&,````!P``````````````````>A````&/````!P``````
+M````````````>B@```&,````!P``````````````````>D````&/````!P``
+M````````````````>E@```&,````!P``````````````````>O@```&/````
+M!P``````````````````>R@```#P````"0``````````````````>S0```#P
+M````#```````````````````>T`````0````"0``````````````````>T0`
+M```0````#```````````````````>T@```$H````!P``````````````````
+M>V0```&/````!P``````````````````>X````&,````!P``````````````
+M````>Z````&,````!P``````````````````>\0```&,````!P``````````
+M````````>]0```&/````!P``````````````````>^P```$T````!P``````
+M````````````?!P```&/````!P``````````````````?#````&,````!P``
+M````````````````?%````&/````!P``````````````````?&````&,````
+M!P``````````````````?(0```&,````!P``````````````````?)P```&,
+M````!P``````````````````?-0```&/````!P``````````````````?/P`
+M``&/````!P``````````````````?1P```&,````!P``````````````````
+M?5````&/````!P``````````````````?7@```&/````!P``````````````
+M````?9@```&,````!P``````````````````?;0```&/````!P``````````
+M````````?>P```&,````!P``````````````````?R````&/````!P``````
+M````````````?X````&/````!P``````````````````@4@```#\````!P``
+M````````````````@90```&/````!P``````````````````@:0```$Z````
+M!P``````````````````@@0```&,````!P``````````````````@C@```&,
+M````!P``````````````````@I````&,````!P``````````````````@K@`
+M``&,````!P``````````````````@M0```&,````!P``````````````````
+M@N0```&/````!P``````````````````@O@```&,````!P``````````````
+M````@U0```&,````!P``````````````````@X@```&,````!P``````````
+M````````@Y@```&,````!P``````````````````@Z@```&,````!P``````
+M````````````@[@```&,````!P``````````````````@\0```&/````!P``
+M````````````````@]0```&,````!P``````````````````@^0```&,````
+M!P``````````````````@_P```&/````!P``````````````````A`P```&,
+M````!P``````````````````A!P```&,````!P``````````````````A"P`
+M``&,````!P``````````````````A#P```&,````!P``````````````````
+MA$P```&,````!P``````````````````A%P```&,````!P``````````````
+M````A'````&,````!P``````````````````A(````&,````!P``````````
+M````````A)@```&,````!P``````````````````A*P```&,````!P``````
+M````````````A+@```"U````!P``````````````````A,P```&,````!P``
+M````````````````A.````&,````!P``````````````````A/0```&,````
+M!P``````````````````A0@```&,````!P``````````````````A1P```&,
+M````!P``````````````````A3````&,````!P``````````````````A40`
+M``&,````!P``````````````````A5@```&,````!P``````````````````
+MA6P```&,````!P``````````````````A8````&,````!P``````````````
+M````A9@```&,````!P``````````````````A:P```&,````!P``````````
+M````````A<````&,````!P``````````````````A<P````"````"0``````
+M`!3(````````A=`````"````#````````!3(````````AA````&,````!P``
+M````````````````ABP```&$````!P``````````````````AD0```&/````
+M!P``````````````````AG0```&,````!P``````````````````AK@```&,
+M````!P``````````````````AL@```&/````!P``````````````````AP0`
+M``&,````!P``````````````````AQ0```&/````!P``````````````````
+MAT````&,````!P``````````````````AU````&/````!P``````````````
+M````AX0```&,````!P``````````````````AY0```&/````!P``````````
+M````````A[0```&,````!P``````````````````B!0```&,````!P``````
+M````````````B!P```$T````!P``````````````````B"P```&/````!P``
+M````````````````B#P```&,````!P``````````````````B%````!)````
+M!P``````````````````B%P```"3````!P``````````````````B(0```!6
+M````!P``````````````````B+0```!]````!P``````````````````B,0`
+M``&/````!P``````````````````B-P```&,````!P``````````````````
+MB/P```%^````!P``````````````````B1P````*````!P``````````````
+M````B3P```$7````!P``````````````````B6````&,````!P``````````
+M````````B9P```&/````!P``````````````````BE0```&,````!P``````
+M````````````BK````#W````!P``````````````````BMP```$T````!P``
+M````````````````BO@```$T````!P``````````````````BQ@```#W````
+M!P``````````````````BTP```&,````!P``````````````````BW````$T
+M````!P``````````````````BY0```$T````!P``````````````````BZ0`
+M``#W````!P``````````````````B]P```#\````!P``````````````````
+MB_@```&/````!P``````````````````C`@```&,````!P``````````````
+M````C!@```&/````!P``````````````````C#0```&,````!P``````````
+M````````C#P```$T````!P``````````````````C$P```&/````!P``````
+M````````````C&0```&,````!P``````````````````C&P```$T````!P``
+M````````````````C(@```$T````!P``````````````````C)@```&/````
+M!P``````````````````C+````&,````!P``````````````````C,````&/
+M````!P``````````````````C-0```&/````!P``````````````````C.@`
+M``&/````!P``````````````````C0P```&,````!P``````````````````
+MC30```&,````!P``````````````````C5P```&,````!P``````````````
+M````C60```$T````!P``````````````````C7````&/````!P``````````
+M````````C8@```&,````!P``````````````````C9````$T````!P``````
+M````````````C:0```&,````!P``````````````````C;````&/````!P``
+M````````````````C<````&,````!P``````````````````C<@```$T````
+M!P``````````````````C=@```&/````!P``````````````````C>@```&,
+M````!P``````````````````C?P```!)````!P``````````````````CA``
+M``&,````!P``````````````````CB0```&,````!P``````````````````
+MCC@```&,````!P``````````````````CD0```"3````!P``````````````
+M````CE@```$T````!P``````````````````CF0```"3````!P``````````
+M````````CH0```&/````!P``````````````````CI@```&,````!P``````
+M````````````CJP```&,````!P``````````````````CN0```&,````!P``
+M````````````````CO````$T````!P``````````````````CQ0```!)````
+M!P``````````````````CV0```&,````!P``````````````````D\0````"
+M````"0```````!H2````````D\@````"````#````````!H2````````E6``
+M```"````"0```````!H<````````E60````"````#````````!H<````````
+ME6@```#E````!P``````````````````E7@````"````"0```````!H`````
+M````E7P````"````#````````!H`````````E8````#E````!P``````````
+M````````E>`````N````!P``````````````````EAP````N````!P``````
+M````````````F`@````N````!P``````````````````F"@````N````!P``
+M````````````````F$@````N````!P``````````````````F(0```&,````
+M!P``````````````````F,````&,````!P``````````````````F/`````N
+M````!P``````````````````F0P```&,````!P``````````````````F2``
+M``&,````!P``````````````````F4@```&/````!P``````````````````
+MF8@```&/````!P``````````````````F9@```&,````!P``````````````
+M````F:P```!)````!P``````````````````F<````$T````!P``````````
+M````````F<@```!1````!P``````````````````FEP```%E````!P``````
+M````````````FJ````$4````!P``````````````````FSP```$?````!P``
+M````````````````FWP```"\````!P``````````````````G,0```&,````
+M!P``````````````````G-@```&,````!P``````````````````G/````&,
+M````!P``````````````````G2````&,````!P``````````````````G3@`
+M``&,````!P``````````````````G4@```&/````!P``````````````````
+MG6````&,````!P``````````````````G8@```&,````!P``````````````
+M````G9P```&,````!P``````````````````G;0```&,````!P``````````
+M````````G>P```&,````!P``````````````````G@0```&,````!P``````
+M````````````GA0```&/````!P``````````````````GBP```&,````!P``
+M````````````````GD@```&,````!P``````````````````GI@```&,````
+M!P``````````````````H#P```&/````!P``````````````````H+0```&,
+M````!P``````````````````H,@```"@````!P``````````````````H.``
+M``%.````!P``````````````````H/````&/````!P``````````````````
+MH20```%.````!P``````````````````H4````&,````!P``````````````
+M````H4P```%.````!P``````````````````H<````&,````!P``````````
+M````````H>````&,````!P``````````````````HBP```&/````!P``````
+M````````````HJ0```&,````!P``````````````````HK@```&/````!P``
+M````````````````HLP```$T````!P``````````````````HN@```&,````
+M!P``````````````````HPP```!)````!P``````````````````I^P```&,
+M````!P``````````````````J`0```&,````!P``````````````````J!P`
+M``&/````!P``````````````````J#P````N````!P``````````````````
+MJ%0```#,````!P``````````````````J&P````"````"0```````!I@````
+M````J'`````"````#````````!I@````````J'@```#E````!P``````````
+M````````J/0```&5````!P``````````````````J2@```&,````!P``````
+M````````````J3P```&,````!P``````````````````J40```$T````!P``
+M````````````````J50```&/````!P``````````````````J8@```&/````
+M!P``````````````````J<@```&,````!P``````````````````J=````$T
+M````!P``````````````````J?@```%'````!P``````````````````JC@`
+M``&/````!P``````````````````JEP```%'````!P``````````````````
+MJI````%'````!P``````````````````JS`````"````"0```````"Z(````
+M````JS0````"````#````````"Z(````````JZ0```%W````!P``````````
+M````````J^0```&,````!P``````````````````J^P```$T````!P``````
+M````````````K`@```&,````!P``````````````````K!````$T````!P``
+M````````````````K$0```%'````!P``````````````````K&@```#1````
+M"0``````````````````K&P```#1````#```````````````````K'P```%_
+M````!P``````````````````K*0```%'````!P``````````````````K30`
+M``%D````!P``````````````````K6````$<````!P``````````````````
+MK6@```""````!P``````````````````K>0```&/````!P``````````````
+M````K@@```&,````!P``````````````````KA0```&/````!P``````````
+M````````KEP```&,````!P``````````````````KF@```&/````!P``````
+M````````````KJ````&,````!P``````````````````KK@```$T````!P``
+M````````````````KV0```#<````!P``````````````````L%P```%'````
+M!P``````````````````L+@```&,````!P``````````````````L,P```&,
+M````!P``````````````````L.````&,````!P``````````````````L/0`
+M``&,````!P``````````````````L0@```&,````!P``````````````````
+ML4`````P````"0``````````````````L7`````P````"0``````````````
+M````L70````P````#```````````````````L80```$G````"0``````````
+M````````L8@```$G````#```````````````````L:P```&-````!P``````
+M````````````L=````&,````!P``````````````````L>````&/````!P``
+M````````````````L@````&,````!P``````````````````LA@```&,````
+M!P``````````````````LD@```&/````!P``````````````````LF````&,
+M````!P``````````````````LG0```&,````!P``````````````````LH@`
+M``&,````!P``````````````````LK0```&/````!P``````````````````
+MLM````&,````!P``````````````````LN0```&,````!P``````````````
+M````LO0```&/````!P``````````````````LT0```&,````!P``````````
+M````````LXP```&,````!P``````````````````LYP```&/````!P``````
+M````````````L\@```&,````!P``````````````````L^@```&/````!P``
+M````````````````M`@```&/````!P``````````````````M-0```&/````
+M!P``````````````````M.P```&/````!P``````````````````M00```&/
+M````!P``````````````````M1P```&/````!P``````````````````M30`
+M``&/````!P``````````````````M8@```&,````!P``````````````````
+MM90```&/````!P``````````````````MD@```&,````!P``````````````
+M````MFP```&,````!P``````````````````MJ@```&/````!P``````````
+M````````MO0```&,````!P``````````````````MPP```&,````!P``````
+M````````````MR0```&,````!P``````````````````MSP```&,````!P``
+M````````````````MU0```&,````!P``````````````````MVP```&,````
+M!P``````````````````MX0```&,````!P``````````````````MZ````&,
+M````!P``````````````````N#P```&,````!P``````````````````N&``
+M``&,````!P``````````````````N?0```&,````!P``````````````````
+MNA````&,````!P``````````````````NBP```&,````!P``````````````
+M````ND@```&,````!P``````````````````NF0```&,````!P``````````
+M````````NH````&,````!P``````````````````NI0```#*````!P``````
+M````````````NK@```#E````!P``````````````````NN````#E````!P``
+M````````````````NO@````"````"0```````"Z0````````NOP````"````
+M#````````"Z0````````NP````#E````!P``````````````````NRP```&,
+M````!P``````````````````NT````&,````!P``````````````````NU@`
+M``!)````!P``````````````````NW````&/````!P``````````````````
+MO#P```#A````!P``````````````````O$@```&/````!P``````````````
+M````O&````&,````!P``````````````````O&P```%`````!P``````````
+M````````O(0````V````!P``````````````````O*0```&/````!P``````
+M````````````O,0```&,````!P``````````````````O.````&/````!P``
+M````````````````O0````&,````!P``````````````````O1P```&/````
+M!P``````````````````O40```&,````!P``````````````````O7````&/
+M````!P``````````````````O9P```&/````!P``````````````````O=0`
+M``&,````!P``````````````````O?0```$%````!P``````````````````
+MOA0```&/````!P``````````````````OC`````"````"0```````"Z8````
+M````OC0````"````#````````"Z8````````OD@```&,````!P``````````
+M````````OG````#E````!P``````````````````OL0```&,````!P``````
+M````````````OP@```&,````!P``````````````````ORP```&/````!P``
+M````````````````OT````&/````!P``````````````````OU````&/````
+M!P``````````````````OX````&/````!P``````````````````OYP```&/
+M````!P``````````````````O[0```&,````!P``````````````````O]@`
+M``&/````!P``````````````````P`````&/````!P``````````````````
+MP!0```&/````!P``````````````````P#P```&/````!P``````````````
+M````P(````&/````!P``````````````````P)P```&/````!P``````````
+M````````P+@```&/````!P``````````````````P-0```&/````!P``````
+M````````````P/````&/````!P``````````````````P20````D````!P``
+M````````````````P4P```%:````!P``````````````````P6````&,````
+M!P``````````````````P8P```&/````!P``````````````````P:`````D
+M````!P``````````````````P;P````D````!P``````````````````P>@`
+M``&/````!P``````````````````P?P```%:````!P``````````````````
+MPAP```&,````!P``````````````````PD@```&/````!P``````````````
+M````PEP````D````!P``````````````````PIP```&/````!P``````````
+M````````PK0```&,````!P``````````````````PM@```&/````!P``````
+M````````````PO````&,````!P``````````````````PR`````D````!P``
+M````````````````PTP```&/````!P``````````````````PV````%:````
+M!P``````````````````PX0```&,````!P``````````````````P[````&/
+M````!P``````````````````P\@````D````!P``````````````````Q`P`
+M``&/````!P``````````````````Q"P```&/````!P``````````````````
+MQ%````&,````!P``````````````````Q*````#=````!P``````````````
+M````Q.@```$5````!P``````````````````Q1P```&,````!P``````````
+M````````Q30````:````!P``````````````````Q5P```$V````!P``````
+M````````````Q8@```&/````!P``````````````````Q:````&,````!P``
+M````````````````Q:@```$T````!P``````````````````Q<@```&/````
+M!P``````````````````Q>````$T````!P``````````````````Q>P```&/
+M````!P``````````````````Q?P```&,````!P``````````````````QBP`
+M``&/````!P``````````````````QD0```&,````!P``````````````````
+MQF0```&/````!P``````````````````QGP```&,````!P``````````````
+M````QI0```&/````!P``````````````````QJP```&,````!P``````````
+M````````QLP```&/````!P``````````````````QN0```&,````!P``````
+M````````````QOP```&/````!P``````````````````QQ0```&,````!P``
+M````````````````Q[0```&/````!P``````````````````R!0```"Y````
+M"0``````````````````R!P```"Y````#```````````````````R"````$'
+M````"0``````````````````R"@```$'````#```````````````````R"P`
+M``#L````"0``````````````````R#````#L````#```````````````````
+MR#0```$H````!P``````````````````R%````&/````!P``````````````
+M````R&P```&,````!P``````````````````R(P```&,````!P``````````
+M````````R*P```&,````!P``````````````````R,````!)````!P``````
+M````````````R.0```&/````!P``````````````````R/@```&,````!P``
+M````````````````R1@```&/````!P``````````````````R2@```&,````
+M!P``````````````````R4P```&,````!P``````````````````R60```&,
+M````!P``````````````````R9P```&/````!P``````````````````R<0`
+M``&/````!P``````````````````R>0```&,````!P``````````````````
+MRA@```&/````!P``````````````````RD````&/````!P``````````````
+M````RF````&,````!P``````````````````RGP```&/````!P``````````
+M````````RIP```&,````!P``````````````````R\P```&/````!P``````
+M````````````S6@````!`````P```````/40````````S6P````!`````P``
+M`````/40````````S7`````!`````P```````/50````````S70````!````
+M`P```````/50````````S7@````!`````P```````/60````````S7P````!
+M`````P```````/60````````S8`````!`````P```````/70````````S80`
+M```!`````P```````/70````````SA0```#\````!P``````````````````
+MSF@```&/````!P``````````````````SGP```&/````!P``````````````
+M````SJP```&/````!P``````````````````SM0```&/````!P``````````
+M````````SR````&/````!P``````````````````SS@```&/````!P``````
+M````````````SU0```&/````!P``````````````````SW0```&/````!P``
+M````````````````SX@```&/````!P``````````````````SY@```&5````
+M!P``````````````````T"0```&,````!P``````````````````T&@````$
+M````"0```````$6T````````T*P````N````!P``````````````````T+P`
+M```N````!P``````````````````T,P````$````"0```````$6T````````
+MT-`````$````#````````$6T````````T1@````$````"0```````$6T````
+M````T1P````$````#````````$6T````````T40```&,````!P``````````
+M````````T6P````"````"0```````"ZX````````T7`````"````#```````
+M`"ZX````````T9@```&,````!P``````````````````T;0````"````"0``
+M`````#;,````````T;@````"````#````````#;,````````T>````&,````
+M!P``````````````````T?P````"````"0```````#%T````````T@`````"
+M````#````````#%T````````TD````&,````!P``````````````````TG``
+M``&/````!P``````````````````TI````&,````!P``````````````````
+MTJ````&,````!P``````````````````TK0```&,````!P``````````````
+M````TL0```&/````!P``````````````````TM0```&,````!P``````````
+M````````TO0```&,````!P``````````````````TP@```&,````!P``````
+M````````````TS@```&,````!P``````````````````TV0```&,````!P``
+M````````````````T\P```&,````!P``````````````````U`@```&,````
+M!P``````````````````U"0```&/````!P``````````````````U#P```&,
+M````!P``````````````````U%````&,````!P``````````````````U&0`
+M``&,````!P``````````````````U'@```&,````!P``````````````````
+MU-0```&,````!P``````````````````U0@```&,````!P``````````````
+M````U20```&,````!P``````````````````U3@```&,````!P``````````
+M````````U6````&/````!P``````````````````U7````&,````!P``````
+M````````````U7P```$@````!P``````````````````U;````&/````!P``
+M````````````````U=@```&,````!P``````````````````UC@```&,````
+M!P``````````````````UDP```&,````!P``````````````````UEP```&/
+M````!P``````````````````UI0```$T````!P``````````````````UJ0`
+M``&/````!P``````````````````UK0```&,````!P``````````````````
+MUL@```!)````!P``````````````````UM0````<````!P``````````````
+M````UR@```&,````!P``````````````````UUP```&,````!P``````````
+M````````UWP```$,````!P``````````````````UZ````&,````!P``````
+M````````````U[````&,````!P``````````````````U\````&,````!P``
+M````````````````U]````&/````!P``````````````````U^````&,````
+M!P``````````````````U_0```&,````!P``````````````````V!0```&/
+M````!P``````````````````V"P```&,````!P``````````````````V$0`
+M``&/````!P``````````````````V%P```&,````!P``````````````````
+MV(@```!0````!P``````````````````V)@```&/````!P``````````````
+M````V+````&,````!P``````````````````V-````"9````!P``````````
+M````````V/````#3````!P``````````````````V1`````W````!P``````
+M````````````V30```&,````!P``````````````````V8P```%5````!P``
+M````````````````V;````$T````!P``````````````````V=0```%5````
+M!P``````````````````VE@```&,````!P``````````````````VFP```&,
+M````!P``````````````````VH````&,````!P``````````````````VH@`
+M``$T````!P``````````````````VJ````&,````!P``````````````````
+MVL````&,````!P``````````````````VL@```$T````!P``````````````
+M````VQ````&,````!P``````````````````VS````&,````!P``````````
+M````````VS@```$T````!P``````````````````VU````&,````!P``````
+M````````````VVP```$T````!P``````````````````VWP```%5````!P``
+M````````````````V[0```#\````!P``````````````````V^0```&/````
+M!P``````````````````W`0```&/````!P``````````````````W!@```&/
+M````!P``````````````````W"P```&/````!P``````````````````W(P`
+M``&/````!P``````````````````W*P```&,````!P``````````````````
+MW.0````<````!P``````````````````W/0```$T````!P``````````````
+M````W0`````<````!P``````````````````W70```&/````!P``````````
+M````````W80```&,````!P``````````````````W8P```$T````!P``````
+M````````````W;````!)````!P``````````````````W@````&,````!P``
+M````````````````WAP```"(````!P``````````````````WE`````"````
+M"0```````#G,````````WE0````"````#````````#G,````````WF0````N
+M````!P``````````````````WK@````N````!P``````````````````WN``
+M```N````!P``````````````````WQP```&,````!P``````````````````
+MWT@```&,````!P``````````````````WW````&/````!P``````````````
+M````W[````&/````!P``````````````````W]P```&,````!P``````````
+M````````W^P```&/````!P``````````````````W_P```&,````!P``````
+M````````````X"P```&/````!P``````````````````X$0```$T````!P``
+M````````````````X10```&/````!P``````````````````X8@```%N````
+M!P``````````````````X;0````"````"0```````#OX````````X;@````"
+M````#````````#OX````````XA````&/````!P``````````````````XB``
+M``&,````!P``````````````````XD0````"````"0```````#O\````````
+MXD@````"````#````````#O\````````XE@````"````"0```````#O\````
+M````XEP````"````#````````#O\````````XHP````"````"0```````#O\
+M````````XI`````"````#````````#O\````````X_`````$````"0``````
+M`$<$````````X_0````$````#````````$<$````````Y-P````$````"0``
+M`````$<$````````Y.`````$````#````````$<$````````Y/P````N````
+M!P``````````````````Y3`````N````!P``````````````````Y5@````N
+M````!P``````````````````Y7P````N````!P``````````````````Y:``
+M```N````!P``````````````````Y=0````$````"0```````$<$````````
+MY=@````$````#````````$<$````````Y@````&,````!P``````````````
+M````YZP```&,````!P``````````````````Y\````&,````!P``````````
+M````````Z"````&/````!P``````````````````Z$P```&,````!P``````
+M````````````Z'0```&/````!P``````````````````Z)````&/````!P``
+M````````````````Z,P```&,````!P``````````````````Z.0```#=````
+M!P``````````````````Z1````&,````!P``````````````````Z1P```&/
+M````!P``````````````````Z6@```&,````!P``````````````````Z7@`
+M``&/````!P``````````````````Z:0```&,````!P``````````````````
+MZ;0```&/````!P``````````````````Z?P```&,````!P``````````````
+M````ZD````&,````!P``````````````````ZE````&/````!P``````````
+M````````ZG0```&,````!P``````````````````ZH0```&/````!P``````
+M````````````ZK````&,````!P``````````````````ZUP```&/````!P``
+M````````````````ZWP```&,````!P``````````````````Z[````&,````
+M!P``````````````````[0`````3````!P``````````````````[:`````%
+M````"0``````````````````[:0````%````#```````````````````[:@`
+M``$?````!P``````````````````[;`````%````"0````````$(````````
+M[;0````%````#`````````$(````````[;@```$?````!P``````````````
+M````[<`````%````#```````````````````[?P````%````"0``````````
+M````````[@`````%````#```````````````````[E@````%````"0``````
+M````````````[EP````%```&(0``````````````````[G`````%````"0``
+M````````````````[G0````%```&(0``````````````````[H0````%```&
+M(0``````````````````[I0````%````"0``````````````````[I@````%
+M````#```````````````````[R0````%````"0``````````````````[R@`
+M```%```&(0``````````````````[S@````%````"0``````````````````
+M[SP````%```&(0``````````````````[]`````%````"0````````$(````
+M````[]0````%````#`````````$(````````\!@````%````"0``````````
+M````````\!P````%```&(0``````````````````\$`````%````"0``````
+M````````````\$0````%````#```````````````````\.0````%````"0``
+M``````$(````````\.@````%````#`````````$(````````\10````%```&
+M(0``````````````````\4@````%````"0````````$(````````\4P````%
+M````#`````````$(````````\8P````%````"0````````$(````````\9``
+M```%````#`````````$(````````\=@```&,````!P``````````````````
+M\B@````%````"0````````&(````````\BP````%````#`````````&(````
+M````\H````$2````!P``````````````````]/P````!````"0```````,UH
+M````````]0`````!````#````````,UH````````]M@````"````"0``````
+M`#PD````````]MP````"````#````````#PD````````]\````&,````!P``
+M````````````````^"````&,````!P``````````````````^"P```!K````
+M!P``````````````````_4@````"````"0```````#PP````````_4P````"
+M````#````````#PP````````_F````&,````!P``````````````````_L@`
+M``&/````!P``````````````````_Z0````"````"0```````#PP````````
+M_Z@````"````#````````#PP````````__@````"````"0```````#PP````
+M````__P````"````#````````#PP```````!```````"````"0```````#PX
+M```````!``0````"````#````````#PX```````!`'@````"````"0``````
+M`#PP```````!`'P````"````#````````#PP```````!`*P````"````"0``
+M`````#PP```````!`+`````"````#````````#PP```````!`,@````"````
+M"0```````#PP```````!`,P````"````#````````#PP```````!`-`````"
+M````"0```````#PX```````!`-0````"````#````````#PX```````!`-@`
+M```"````"0```````#PP```````!`-P````"````#````````#PP```````!
+M`<````&/````!P`````````````````!`F0```&,````!P``````````````
+M```!`IP```#R````!P`````````````````!`K0```$%````!P``````````
+M```````!`L````&/````!P`````````````````!`OP```$%````!P``````
+M```````````!`R0```&,````!P`````````````````!`S````$%````!P``
+M```````````````!`W@```%E````!P`````````````````!`[P```$4````
+M!P`````````````````!!'@```$?````!P`````````````````!!,````!A
+M````!P`````````````````!!0P```&,````!P`````````````````!!40`
+M``&,````!P`````````````````!!5````&/````!P`````````````````!
+M!7@```&,````!P`````````````````!!SP```&,````!P``````````````
+M```!!W0```&,````!P`````````````````!!X@```&,````!P``````````
+M```````!![````&,````!P`````````````````!!^P```&,````!P``````
+M```````````!"`````&/````!P`````````````````!""@```&,````!P``
+M```````````````!"&````&,````!P`````````````````!"*````&,````
+M!P`````````````````!",@```&/````!P`````````````````!"-@```&,
+M````!P`````````````````!"0P```&/````!P`````````````````!"20`
+M``&,````!P`````````````````!"5@```&/````!P`````````````````!
+M"6@```&,````!P`````````````````!":````&/````!P``````````````
+M```!";````&,````!P`````````````````!"?````&/````!P``````````
+M```````!"@````&,````!P`````````````````!"@@```$G````"0``````
+M```````````!"@P```$G````#``````````````````!"A`````P````"0``
+M```````````````!"A0````P````#``````````````````!"BP```"^````
+M"0`````````````````!"C````"^````#``````````````````!"E0```&,
+M````!P`````````````````!"G@```&,````!P`````````````````!"JP`
+M``&/````!P`````````````````!"L0```&,````!P`````````````````!
+M#$@```&/````!P`````````````````!#&P```&,````!P``````````````
+M```!#)````&,````!P`````````````````!#+0```&/````!P``````````
+M```````!#,@```&/````!P`````````````````!#/P```&,````!P``````
+M```````````!#10```%T````!P`````````````````!#20```$T````!P``
+M```````````````!#4````&,````!P`````````````````!$CP```&,````
+M!P`````````````````!$E````&,````!P`````````````````!$F0```&,
+M````!P`````````````````!$G@```&,````!P`````````````````!$HP`
+M``&,````!P`````````````````!$J````&,````!P`````````````````!
+M$K0```&,````!P`````````````````!$L@```&,````!P``````````````
+M```!$MP```&,````!P`````````````````!$O````&,````!P``````````
+M```````!$Q@```&,````!P`````````````````!$S````&,````!P``````
+M```````````!$T@```&/````!P`````````````````!$V@````N````!P``
+M```````````````!%&0```"Q````!P`````````````````!%*0````"````
+M"0```````#U0```````!%*@````"````#````````#U0```````!%+````#E
+M````!P`````````````````!%80````"````"0```````%&(```````!%8@`
+M```"````#````````%&(```````!%8P```#E````!P`````````````````!
+M%:P````"````"0```````%&.```````!%;`````"````#````````%&.````
+M```!%AP```#,````!P`````````````````!%D0````E````!P``````````
+M```````!%E@```&`````!P`````````````````!%FP```&/````!P``````
+M```````````!%J````&*````!P`````````````````!%KP```&/````!P``
+M```````````````!%O@````9````!P`````````````````!%QP```&/````
+M!P`````````````````!%S0```&,````!P`````````````````!%T0```&,
+M````!P`````````````````!%TP```!"````!P`````````````````!&*@`
+M``&)````!P`````````````````!&.@```&/````!P`````````````````!
+M&40```&)````!P`````````````````!&6P```&)````!P``````````````
+M```!&:````&)````!P`````````````````!&=0```&)````!P``````````
+M```````!&G0````"````"0```````%%X```````!&G@````"````#```````
+M`%%X```````!&GP````"````"0```````%%^```````!&H`````"````#```
+M`````%%^```````!&O0```%W````!P`````````````````!&\0```&,````
+M!P`````````````````!&\P```$T````!P`````````````````!&]0```!"
+M````!P`````````````````!&^@```&,````!P`````````````````!&_``
+M``$T````!P`````````````````!'!0```&)````!P`````````````````!
+M'#@```$N````!P`````````````````!'(0```##````!P``````````````
+M```!'+P```"D````!P`````````````````!'.````&'````!P``````````
+M```````!'/````%L````!P`````````````````!'1````$9````!P``````
+M```````````!'3@```&)````!P`````````````````!'=@```!_````!P``
+M```````````````!'?P```!P````!P`````````````````!'B````!#````
+M!P`````````````````!'C````&`````!P`````````````````!'D0```$<
+M````!P`````````````````!'DP```""````!P`````````````````!'L@`
+M``&/````!P`````````````````!'NP```&,````!P`````````````````!
+M'O@```&/````!P`````````````````!'T````&,````!P``````````````
+M```!'TP```&/````!P`````````````````!'X0```&,````!P``````````
+M```````!'YP```$T````!P`````````````````!)B@```"J````!P``````
+M```````````!)C@```&+````"0`````````````````!)D0```&+````#```
+M```````````````!)D@````!````"0```````28@```````!)DP````!````
+M#````````28@```````!)F@```&,````!P`````````````````!)GP```&,
+M````!P`````````````````!)I````&,````!P`````````````````!)J0`
+M``&,````!P`````````````````!)L0```"J````!P`````````````````!
+M)N@```&,````!P`````````````````!)OP```&,````!P``````````````
+M```!)S0````P````"0`````````````````!)V0````P````"0``````````
+M```````!)V@````P````#``````````````````!)W@```$G````"0``````
+M```````````!)WP```$G````#``````````````````!)Z````"0````!P``
+M```````````````!)\0```&,````!P`````````````````!)]0```&/````
+M!P`````````````````!)_0```&,````!P`````````````````!*`P```&,
+M````!P`````````````````!*#P```&/````!P`````````````````!*%0`
+M``&,````!P`````````````````!*&@```&,````!P`````````````````!
+M*'P```&,````!P`````````````````!**@```&/````!P``````````````
+M```!*,0```&,````!P`````````````````!*-@```&,````!P``````````
+M```````!*.@```&/````!P`````````````````!*3@```&,````!P``````
+M```````````!*8````&,````!P`````````````````!*>@```&,````!P``
+M```````````````!*A0```&,````!P`````````````````!*D````&,````
+M!P`````````````````!*F0```&,````!P`````````````````!*G@```&,
+M````!P`````````````````!*I````!)````!P`````````````````!*J@`
+M``&/````!P`````````````````!*LP```&/````!P`````````````````!
+M*NP```&,````!P`````````````````!*P@```&/````!P``````````````
+M```!*R@```&,````!P`````````````````!*T0```&/````!P``````````
+M```````!*VP```&,````!P`````````````````!*Y@```&/````!P``````
+M```````````!*\0```&/````!P`````````````````!+!````&,````!P``
+M```````````````!+#````#4````!P`````````````````!+%````&/````
+M!P`````````````````!+'@```&/````!P`````````````````!+)````&/
+M````!P`````````````````!+.P```&/````!P`````````````````!+60`
+M``&/````!P`````````````````!+9@```&/````!P`````````````````!
+M+A@```&/````!P`````````````````!+C````&/````!P``````````````
+M```!+D@```&/````!P`````````````````!+F````&/````!P``````````
+M```````!+G@```&/````!P`````````````````!+LP```&,````!P``````
+M```````````!+M@```&/````!P`````````````````!+_P```&,````!P``
+M```````````````!,`@```&/````!P`````````````````!,"0```&,````
+M!P`````````````````!,$@```&,````!P`````````````````!,&`````!
+M`````P```````3/H```````!,&0````!`````P```````3-\```````!,&@`
+M```!`````P```````3.$```````!,&P````!`````P```````30D```````!
+M,'`````!`````P```````3.H```````!,'0````!`````P```````30<````
+M```!,*0```&/````!P`````````````````!,0````&/````!P``````````
+M```````!,1@```&,````!P`````````````````!,3````&,````!P``````
+M```````````!,4@```&,````!P`````````````````!,6````&,````!P``
+M```````````````!,7@```&,````!P`````````````````!,8@```&,````
+M!P`````````````````!,:````&,````!P`````````````````!,;P```&,
+M````!P`````````````````!,@0```&,````!P`````````````````!,A@`
+M``&,````!P`````````````````!,BP```&,````!P`````````````````!
+M,D0```&,````!P`````````````````!,N0```&,````!P``````````````
+M```!,P@```&,````!P`````````````````!,V@````!````"0```````3!@
+M```````!,VP````!````#````````3!@```````!-3@```&,````!P``````
+M```````````!-50```&,````!P`````````````````!-6P```&,````!P``
+M```````````````!-80```&,````!P`````````````````!-9P```&,````
+M!P`````````````````!-;@```&,````!P`````````````````!-<P```$D
+M````!P`````````````````!-J@```&,````!P`````````````````!-L``
+M``&,````!P`````````````````!-M@```&,````!P`````````````````!
+M-O````&,````!P`````````````````!-P@```&,````!P``````````````
+M```!-R````&,````!P`````````````````!-S@```&,````!P``````````
+M```````!-U0```&,````!P`````````````````!-W0```&,````!P``````
+M```````````!-XP```&,````!P`````````````````!-[0```&,````!P``
+M```````````````!-\P```&,````!P`````````````````!-^0```&,````
+M!P`````````````````!-_P```&,````!P`````````````````!.!0```&,
+M````!P`````````````````!.#````&,````!P`````````````````!.$0`
+M``$D````!P`````````````````!.%@````!`````P```````4W0```````!
+M.%P````!`````P```````4W0```````!.&`````!`````P```````4VH````
+M```!.&0````!`````P```````4VP```````!.&@````!`````P```````4VX
+M```````!.&P````!`````P```````4W````````!.'`````!`````P``````
+M`4W(```````!.'@````!`````P```````4W8```````!.'P````!`````P``
+M`````4K<```````!.(`````!`````P```````4LD```````!.(0````!````
+M`P```````4M0```````!.(@````!`````P```````4W8```````!.(P````!
+M`````P```````4N\```````!.)`````!`````P```````4W8```````!.)0`
+M```!`````P```````4W8```````!.)@````!`````P```````4W8```````!
+M.)P````!`````P```````4W8```````!.*`````!`````P```````4W8````
+M```!.*0````!`````P```````4OT```````!.*@````!`````P```````4W8
+M```````!.*P````!`````P```````4W8```````!.+`````!`````P``````
+M`4W8```````!.+0````!`````P```````4W8```````!.+@````!`````P``
+M`````4O\```````!.+P````!`````P```````4P@```````!.,`````!````
+M`P```````4W8```````!.,0````!`````P```````4QX```````!.,@````!
+M`````P```````4RD```````!.,P````!`````P```````4W8```````!.-``
+M```!`````P```````4N(```````!.-0````!`````P```````4W8```````!
+M.-@````!`````P```````4W8```````!.-P````!`````P```````4W8````
+M```!..`````!`````P```````4ST```````!..0````!`````P```````4T(
+M```````!..@````!`````P```````4W8```````!..P````!`````P``````
+M`4TL```````!./`````!`````P```````5!@```````!./0````!`````P``
+M`````5!@```````!./@````!`````P```````4XP```````!./P````!````
+M`P```````4Y<```````!.0`````!`````P```````5!@```````!.00````!
+M`````P```````4[(```````!.0@````!`````P```````5!@```````!.0P`
+M```!`````P```````5!@```````!.1`````!`````P```````5!@```````!
+M.10````!`````P```````5!@```````!.1@````!`````P```````5!@````
+M```!.1P````!`````P```````4\````````!.2`````!`````P```````5!@
+M```````!.20````!`````P```````5!@```````!.2@````!`````P``````
+M`5!@```````!.2P````!`````P```````5!@```````!.3`````!`````P``
+M`````4\4```````!.30````!`````P```````5!@```````!.3@````!````
+M`P```````5!@```````!.3P````!`````P```````4\H```````!.4`````!
+M`````P```````5`4```````!.40````!`````P```````5!@```````!.4@`
+M```!`````P```````5!@```````!.4P````!`````P```````5!@```````!
+M.5`````!`````P```````5!@```````!.50````!`````P```````5!@````
+M```!.5@````!`````P```````4]@```````!.5P````!`````P```````4]@
+M```````!.6`````!`````P```````5!@```````!.60````!`````P``````
+M`4_@```````!.7P```#E````!P`````````````````!.:0```#E````!P``
+M```````````````!.<@```#E````!P`````````````````!.?````#E````
+M!P`````````````````!.D0```&,````!P`````````````````!.G@```&,
+M````!P`````````````````!.Y0```&/````!P`````````````````!.ZP`
+M``&,````!P`````````````````!/`````&/````!P`````````````````!
+M/!P````"````"0```````%&@```````!/"`````"````#````````%&@````
+M```!/#0```&,````!P`````````````````!/%P```#E````!P``````````
+M```````!/+````&,````!P`````````````````!//0```&,````!P``````
+M```````````!/1@```&/````!P`````````````````!/2P```&/````!P``
+M```````````````!/3P```&/````!P`````````````````!/6P```&/````
+M!P`````````````````!/8@```&/````!P`````````````````!/:0```&,
+M````!P`````````````````!/;0```&,````!P`````````````````!/D@`
+M``&/````!P`````````````````!/I0```&,````!P`````````````````!
+M/K@```&/````!P`````````````````!/N````&/````!P``````````````
+M```!/O0```&/````!P`````````````````!/QP```&/````!P``````````
+M```````!/V````&/````!P`````````````````!/WP```&/````!P``````
+M```````````!/Y@```&/````!P`````````````````!/[0```&/````!P``
+M```````````````!/]````&/````!P`````````````````!0`````&/````
+M!P`````````````````!0"````&/````!P`````````````````!0$0```&,
+M````!P`````````````````!0)0````-````!P`````````````````!0,0`
+M```D````!P`````````````````!0/````%:````!P`````````````````!
+M000```&,````!P`````````````````!03````&/````!P``````````````
+M```!040````D````!P`````````````````!06`````D````!P``````````
+M```````!08P```&/````!P`````````````````!0:````%:````!P``````
+M```````````!0<````&,````!P`````````````````!0>P```&/````!P``
+M```````````````!0@`````D````!P`````````````````!0D````&/````
+M!P`````````````````!0E@```&,````!P`````````````````!0GP```&/
+M````!P`````````````````!0I0```&,````!P`````````````````!0L0`
+M```D````!P`````````````````!0O````&/````!P`````````````````!
+M0P0```%:````!P`````````````````!0R@```&,````!P``````````````
+M```!0U0```&/````!P`````````````````!0VP````D````!P``````````
+M```````!0Z````&,````!P`````````````````!0[0```&,````!P``````
+M```````````!1"@```%:````!P`````````````````!10P```&,````!P``
+M```````````````!12````&,````!P`````````````````!13P```&,````
+M!P`````````````````!15@````C````!P`````````````````!1;P````5
+M````!P`````````````````!1=0```&,````!P`````````````````!1@``
+M``&,````!P`````````````````!1A````&/````!P`````````````````!
+M1BP```&,````!P`````````````````!1D````&,````!P``````````````
+M```!1E````&/````!P`````````````````!1F````&,````!P``````````
+M```````!1L0```&,````!P`````````````````!1M@```&,````!P``````
+M```````````!1NP```&,````!P`````````````````!1P````&,````!P``
+M```````````````!1Q````&/````!P`````````````````!1S````&,````
+M!P`````````````````!1T0```&,````!P`````````````````!1U@```&,
+M````!P`````````````````!1VP```&,````!P`````````````````!1WP`
+M``&/````!P`````````````````!1Z@```&/````!P`````````````````!
+M1\````&,````!P`````````````````!1\P```&/````!P``````````````
+M```!1^````&,````!P`````````````````!1_0```&,````!P``````````
+M```````!2`@```&,````!P`````````````````!2!P```&,````!P``````
+M```````````!2#````&,````!P`````````````````!2$0```&,````!P``
+M```````````````!2'````&,````!P`````````````````!2(````&/````
+M!P`````````````````!2,@```&,````!P`````````````````!2.0````5
+M````!P`````````````````!2/@```&/````!P`````````````````!21``
+M``&,````!P`````````````````!21P```&/````!P`````````````````!
+M23````&,````!P`````````````````!240```&,````!P``````````````
+M```!250```&/````!P`````````````````!29@```&,````!P``````````
+M```````!2:P```&,````!P`````````````````!2<````&,````!P``````
+M```````````!2=0```&,````!P`````````````````!2>@```&,````!P``
+M```````````````!2?P```&,````!P`````````````````!2B@```&,````
+M!P`````````````````!2DP````"````"0```````%'````````!2E`````"
+M````#````````%'````````!2F`````"````"0```````%'````````!2F0`
+M```"````#````````%'````````!2I0````"````"0```````%'````````!
+M2I@````"````#````````%'````````!2L@````!````"0```````3AX````
+M```!2LP````!````#````````3AX```````!2]@```&/````!P``````````
+M```````!36P```"&````!P`````````````````!390````!````"0``````
+M`3A8```````!39@````!````#````````3A8```````!3>0```$5````!P``
+M```````````````!3AP````!````"0```````3CP```````!3B`````!````
+M#````````3CP```````!3K@```&,````!P`````````````````!3M````&/
+M````!P`````````````````!3_0````"````"0```````%'L```````!3_@`
+M```"````#````````%'L```````!4`0```"=````!P`````````````````!
+M4&P````:````!P`````````````````!4)0```$V````!P``````````````
+M```!4,0```&/````!P`````````````````!4-P```&,````!P``````````
+M```````!4.0```$T````!P`````````````````!400```&/````!P``````
+M```````````!41P```$T````!P`````````````````!42@```&/````!P``
+M```````````````!43@```&,````!P`````````````````!46@```&/````
+M!P`````````````````!48````&,````!P`````````````````!4:````&/
+M````!P`````````````````!4;@```&,````!P`````````````````!4=``
+M``&/````!P`````````````````!4?````&,````!P`````````````````!
+M4A````&/````!P`````````````````!4B@```&,````!P``````````````
+M```!4D````&/````!P`````````````````!4F````&,````!P``````````
+M```````!4P````&/````!P`````````````````!4T0```#.````"0``````
+M```````````!4[`````K````"0`````````````````!4[0````K````#```
+M```````````````!4]P```#5````"0`````````````````!4_@```#@````
+M"0`````````````````!5`````#@````#``````````````````!5`0```"H
+M````"0`````````````````!5`P```"H````#``````````````````!5!``
+M``%*````"0`````````````````!5!@```%*````#``````````````````!
+M5"````#.````#``````````````````!5"0````4````"0``````````````
+M```!5"P````4````#``````````````````!5#````%7````"0``````````
+M```````!5#@```%7````#``````````````````!5#P```#5````"0``````
+M```````````!5$0```#5````#``````````````````!5$@```#@````"0``
+M```````````````!5$P```#@````#``````````````````!5%````$H````
+M!P`````````````````!5&P```&/````!P`````````````````!5(@```&,
+M````!P`````````````````!5*@```&,````!P`````````````````!5,@`
+M``&,````!P`````````````````!5-P```!)````!P`````````````````!
+M50````&/````!P`````````````````!510```&,````!P``````````````
+M```!51P````O````!P`````````````````!52@```#9````!P``````````
+M```````!54@```&/````!P`````````````````!55@```&,````!P``````
+M```````````!56````"!````!P`````````````````!580```&,````!P``
+M```````````````!59P```&,````!P`````````````````!5=0```&/````
+M!P`````````````````!5?P```&/````!P`````````````````!5AP```&,
+M````!P`````````````````!5E````&/````!P`````````````````!5G@`
+M``&/````!P`````````````````!5I@```&,````!P`````````````````!
+M5K@```&/````!P`````````````````!5LP```&/````!P``````````````
+M```!5PP```&,````!P`````````````````!5T@```&,````!P``````````
+M```````!5UP```&/````!P`````````````````!5VP```&/````!P``````
+M```````````!5X````&,````!P`````````````````!6&@```&/````!P``
+M```````````````!6E0```".````!P`````````````````!6S````&`````
+M!P`````````````````!6T0```#\````!P`````````````````!6Z````&/
+M````!P`````````````````!6[````#'````!P`````````````````!6[P`
+M``#9````!P`````````````````!7&P````+````!P`````````````````!
+M7(0```&/````!P`````````````````!7)P```&/````!P``````````````
+M```!7+@```&/````!P`````````````````!7-@```&/````!P``````````
+M```````!7.P```&/````!P`````````````````!7/P```!<````!P``````
+M```````````!700```!+````!P`````````````````!71````&*````!P``
+M```````````````!7>````&,````!P`````````````````!7>P````"````
+M"0```````%((```````!7?`````"````#````````%((```````!7AP```&,
+M````!P`````````````````!7C@```$T````!P`````````````````!7E0`
+M```"````"0```````%1@```````!7E@````"````#````````%1@```````!
+M7KP```&,````!P`````````````````!7M@```$T````!P``````````````
+M```!7S@```$0````!P`````````````````!7V````&,````!P``````````
+M```````!8`0```&,````!P`````````````````!8!````&/````!P``````
+M```````````!8"0```&,````!P`````````````````!8#````&/````!P``
+M```````````````!8$P```&,````!P`````````````````!8&````&,````
+M!P`````````````````!8(````&,````!P`````````````````!8)0```&,
+M````!P`````````````````!8/P```&/````!P`````````````````!810`
+M``&,````!P`````````````````!820```!8````!P`````````````````!
+M85````$_````!P`````````````````!8?@```"4````!P``````````````
+M```!8@0```$$````!P`````````````````!8A````%"````!P``````````
+M```````!8C@```&,````!P`````````````````!8I````&,````!P``````
+M```````````!8N0```&,````!P`````````````````!8O`````C````!P``
+M```````````````!8TP```&,````!P`````````````````!8X````&,````
+M!P`````````````````!8Y````&/````!P`````````````````!8Z@```&,
+M````!P`````````````````!8[P```&,````!P`````````````````!8]``
+M``&,````!P`````````````````!8^0```&,````!P`````````````````!
+M9$````&,````!P`````````````````!9'0```&,````!P``````````````
+M```!9)````&,````!P`````````````````!9*0```&,````!P``````````
+M```````!9+````"N````!P`````````````````!9-`````R````!P``````
+M```````````!9-P```!;````!P`````````````````!95@```&/````!P``
+M```````````````!970```&,````!P`````````````````!980```&/````
+M!P`````````````````!9<@```&,````!P`````````````````!9A0```$T
+M````!P`````````````````!9B0```&/````!P`````````````````!9C@`
+M``&,````!P`````````````````!9DP```$T````!P`````````````````!
+M9F@```&/````!P`````````````````!9HP```&,````!P``````````````
+M```!9IP```&/````!P`````````````````!9JP```&,````!P``````````
+M```````!9N````&/````!P`````````````````!9P````&,````!P``````
+M```````````!9PP```&/````!P`````````````````!9R0```&,````!P``
+M```````````````!9T0```!-````!P`````````````````!9V@```&,````
+M!P`````````````````!9Z0```")````!P`````````````````!9_@```&,
+M````!P`````````````````!:`0```&/````!P`````````````````!:!P`
+M``&,````!P`````````````````!:#P```"V````!P`````````````````!
+M:%0```!)````!P`````````````````!:&````"8````!P``````````````
+M```!:'````&/````!P`````````````````!:(@```&,````!P``````````
+M```````!:,@```&,````!P`````````````````!:.````&,````!P``````
+M```````````!:/0```&,````!P`````````````````!:30```$2````!P``
+M```````````````!:K@```&,````!P`````````````````!:N0```&,````
+M!P`````````````````!:P0```!!````!P`````````````````!:R0````L
+M````!P`````````````````!:T0```!%````!P`````````````````!:V@`
+M``&,````!P`````````````````!:]0```!(````!P`````````````````!
+M:^0```%8````!P`````````````````!;#````&/````!P``````````````
+M```!;%0```&,````!P`````````````````!;'P```&/````!P``````````
+M```````!;)0```&/````!P`````````````````!;*0```&,````!P``````
+M```````````!;/0```#\````!P`````````````````!;10```&7````!P``
+M```````````````!;5````&,````!P`````````````````!;60```&/````
+M!P`````````````````!;70```$T````!P`````````````````!;:0```"N
+M````!P`````````````````!;;P```&/````!P`````````````````!;?0`
+M``$T````!P`````````````````!;@0```!8````!P`````````````````!
+M;B````&,````!P`````````````````!;J````"4````!P``````````````
+M```!;JP```$$````!P`````````````````!;KP```&/````!P``````````
+M```````!;LP```&,````!P`````````````````!;RP```!(````!P``````
+M```````````!;SP```%8````!P`````````````````!;UP```&/````!P``
+M```````````````!;\````&,````!P`````````````````!;\P```&/````
+M!P`````````````````!;_````&,````!P`````````````````!;_P```&/
+M````!P`````````````````!<"P```&,````!P`````````````````!<&@`
+M``&`````!P`````````````````!<+0```&`````!P`````````````````!
+M<H@```&/````!P`````````````````!<L````&,````!P``````````````
+M```!<M0```&,````!P`````````````````!<O````&,````!P``````````
+M```````!<O@```$T````!P`````````````````!<Q@```&,````!P``````
+M```````````!<R````$T````!P`````````````````!<S0```&,````!P``
+M```````````````!<T@```&,````!P`````````````````!<W````#\````
+M!P`````````````````!<]@```&/````!P`````````````````!=`@```&/
+M````!P`````````````````!=!P```&/````!P`````````````````!=#``
+M``&/````!P`````````````````!=%@```&/````!P`````````````````!
+M='````&,````!P`````````````````!=1P```&/````!P``````````````
+M```!=3P```&,````!P`````````````````!=4@```&/````!P``````````
+M```````!=60```&,````!P`````````````````!=7````&/````!P``````
+M```````````!=8````&,````!P`````````````````!=>0```&/````!P``
+M```````````````!=@0```&,````!P`````````````````!=A````&/````
+M!P`````````````````!=B@```&,````!P`````````````````!=CP```#'
+M````!P`````````````````!=F````&/````!P`````````````````!=G``
+M``&,````!P`````````````````!=W@```&/````!P`````````````````!
+M=X@```&,````!P`````````````````!=Y````$T````!P``````````````
+M```!=[0```!)````!P`````````````````!>`@```&,````!P``````````
+M```````!>!@```&`````!P`````````````````!>"@```&/````!P``````
+M```````````!>$0```&/````!P`````````````````!>.@```&/````!P``
+M```````````````!>0````!F````!P`````````````````!>80```&,````
+M!P`````````````````!>90```&,````!P`````````````````!>:````&/
+M````!P`````````````````!>;````&,````!P`````````````````!><0`
+M``&,````!P`````````````````!>=0```&,````!P`````````````````!
+M>?````&,````!P`````````````````!>@P```&,````!P``````````````
+M```!>L0````N````!P`````````````````!?$@```&/````!P``````````
+M```````!?&````&/````!P`````````````````!?'@```&,````!P``````
+M```````````!?)@```&,````!P`````````````````!?*P```&,````!P``
+M```````````````!?G0```&/````!P`````````````````!?J0```&,````
+M!P`````````````````!?L````&/````!P`````````````````!?OP```&,
+M````!P`````````````````!?Q0````-````!P`````````````````!?SP`
+M``&,````!P`````````````````!@"````&/````!P`````````````````!
+M@%0```&,````!P`````````````````!@&0```&/````!P``````````````
+M```!@(````&,````!P`````````````````!@(P```&/````!P``````````
+M```````!@,````&,````!P`````````````````!@-````&/````!P``````
+M```````````!@/P```&,````!P`````````````````!@50```&,````!P``
+M```````````````!@60```&/````!P`````````````````!@9````&,````
+M!P`````````````````!@:````&/````!P`````````````````!@<P```&,
+M````!P`````````````````!@BP```#!````!P`````````````````!@F``
+M``&/````!P`````````````````!@H````&,````!P`````````````````!
+M@L@```&/````!P`````````````````!@N@```&,````!P``````````````
+M```!@O0```&/````!P`````````````````!@Q````&,````!P``````````
+M```````!@QP```&/````!P`````````````````!@RP```&,````!P``````
+M```````````!@X````&/````!P`````````````````!@Z@```&,````!P``
+M```````````````!@]@```&,````!P`````````````````!A40```&/````
+M!P`````````````````!A6````&/````!P`````````````````!A7@```&,
+M````!P`````````````````!A80```&/````!P`````````````````!A9P`
+M``&,````!P`````````````````!A;````&,````!P`````````````````!
+MA<0```&,````!P`````````````````!A=0```&/````!P``````````````
+M```!A>@```&,````!P`````````````````!A?P```&,````!P``````````
+M```````!A@P```&/````!P`````````````````!AAP```&,````!P``````
+M```````````!AC````&,````!P`````````````````!AD0```&,````!P``
+M```````````````!AE@```&,````!P`````````````````!AF0```&/````
+M!P`````````````````!AG@```&,````!P`````````````````!AHP```&,
+M````!P`````````````````!AJ````&,````!P`````````````````!AK0`
+M``&,````!P`````````````````!AL0```&/````!P`````````````````!
+MB3P```&/````!P`````````````````!B5P```&,````!P``````````````
+M```!B6P```&/````!P`````````````````!B80```&,````!P``````````
+M```````!B;P```&,````!P`````````````````!B=````&,````!P``````
+M```````````!B>````&/````!P`````````````````!B@0```&,````!P``
+M```````````````!BA@```&,````!P`````````````````!BB@```&/````
+M!P`````````````````!BD@```&,````!P`````````````````!BEP```&,
+M````!P`````````````````!BG````&,````!P`````````````````!BH0`
+M``&,````!P`````````````````!BI````&/````!P`````````````````!
+MBKP```&,````!P`````````````````!BM````&,````!P``````````````
+M```!BN0```&,````!P`````````````````!BO@```&,````!P``````````
+M```````!BP@```&/````!P`````````````````!BR@```&,````!P``````
+M```````````!B^````&/````!P`````````````````!C`````&,````!P``
+M```````````````!C`P```&/````!P`````````````````!C#0```&,````
+M!P`````````````````!C&@```!8````!P`````````````````!C)@```$?
+M````!P`````````````````!C*P```$?````!P`````````````````!C/0`
+M```"````"0```````%J````````!C/@````"````#````````%J````````!
+MCQ0```&,````!P`````````````````!CY````&,````!P``````````````
+M```!C_P```&,````!P`````````````````!D&@```&,````!P``````````
+M```````!D-0```&,````!P`````````````````!D/P```&,````!P``````
+M```````````!D6`````3````!P`````````````````!DU@```$2````!P``
+M```````````````!F$0````"````"0```````%J*```````!F$@````"````
+M#````````%J*```````!F1````#E````!P`````````````````!FS0```%4
+M````!P`````````````````!G2@```%4````!P`````````````````!GW0`
+M```"````"0```````%P$```````!GW@````"````#````````%P$```````!
+MG[@````"````"0```````%J4```````!G[P````"````#````````%J4````
+M```!H6````&,````!P`````````````````!H<@```&/````!P``````````
+M```````!HR`````"````"0```````%P$```````!HRP````"````#```````
+M`%P$```````!HS`````"````"0```````%J4```````!HS0````"````#```
+M`````%J4```````!I8`````N````!P`````````````````!IF0```!9````
+M!P`````````````````!IJ@```!E````!P`````````````````!IL0```&,
+M````!P`````````````````!IO0```!9````!P`````````````````!IU@`
+M``!E````!P`````````````````!IV@```&,````!P`````````````````!
+MIY@```!E````!P`````````````````!IZ@```&,````!P``````````````
+M```!I]@```&/````!P`````````````````!J$0```&,````!P``````````
+M```````!J%@```&,````!P`````````````````!J&P```&,````!P``````
+M```````````!J'P```&/````!P`````````````````!J)P```&,````!P``
+M```````````````!J,P```#4````!P`````````````````!J-P```&/````
+M!P`````````````````!J2P```&,````!P`````````````````!J3@```#4
+M````!P`````````````````!J8@```%E````!P`````````````````!J=``
+M``$4````!P`````````````````!JT0```$?````!P`````````````````!
+MJY0```!5````!P`````````````````!J^````&,````!P``````````````
+M```!K!@```&,````!P`````````````````!K"0```&/````!P``````````
+M```````!K$P```&,````!P`````````````````!KA@```&,````!P``````
+M```````````!KE0```&,````!P`````````````````!KI````&,````!P``
+M```````````````!KM@```&,````!P`````````````````!KQ0```&,````
+M!P`````````````````!L&````$G````"0`````````````````!L&0```$G
+M````#``````````````````!L&@````P````"0`````````````````!L&P`
+M```P````#``````````````````!L(0```"^````"0`````````````````!
+ML(@```"^````#``````````````````!L*P```&,````!P``````````````
+M```!L.@```&,````!P`````````````````!L0@```&,````!P``````````
+M```````!L3````&,````!P`````````````````!L4````&,````!P``````
+M```````````!L5````&,````!P`````````````````!L5P```&/````!P``
+M```````````````!L7````&,````!P`````````````````!LO0```&/````
+M!P`````````````````!LQ@```&,````!P`````````````````!LSP```&,
+M````!P`````````````````!LV````&/````!P`````````````````!LW0`
+M``&/````!P`````````````````!LZ@```&,````!P`````````````````!
+ML[@```&7````!P`````````````````!L\@```$T````!P``````````````
+M```!L^````&7````!P`````````````````!M%@```&/````!P``````````
+M```````!M'0```&,````!P`````````````````!M)@```&,````!P``````
+M```````````!M*0```&/````!P`````````````````!M-````&/````!P``
+M```````````````!M.@```&,````!P`````````````````!M/````$T````
+M!P`````````````````!M0````&/````!P`````````````````!M1@```&,
+M````!P`````````````````!M3````$T````!P`````````````````!M3P`
+M``&7````!P`````````````````!M50```&/````!P`````````````````!
+MM6P```&,````!P`````````````````!M7P```&,````!P``````````````
+M```!OX`````!`````P```````<JP```````!OX0````!`````P```````</<
+M```````!OX@````!`````P```````<58```````!OXP````!`````P``````
+M`<>D```````!OY`````!`````P```````<@P```````!OY0````!`````P``
+M`````<C@```````!OY@````!`````P```````<FT```````!OZP```&!````
+M!P`````````````````!O\````&,````!P`````````````````!O]0```&,
+M````!P`````````````````!O^0```&,````!P`````````````````!O_@`
+M``&,````!P`````````````````!P`P```&,````!P`````````````````!
+MP"P```&,````!P`````````````````!P$````&!````!P``````````````
+M```!P%0```&,````!P`````````````````!P&@```&,````!P``````````
+M```````!P3@```&!````!P`````````````````!P8````$?````!P``````
+M```````````!PM0```&,````!P`````````````````!PO````&,````!P``
+M```````````````!PO@````O````!P`````````````````!PV0```"!````
+M!P`````````````````!PW@```&,````!P`````````````````!PXP```&,
+M````!P`````````````````!P\@````!````"0```````;^````````!P\P`
+M```!````#````````;^````````!P_0```&/````!P`````````````````!
+MQ#@```&,````!P`````````````````!Q$@```&/````!P``````````````
+M```!Q(0```&,````!P`````````````````!Q)````&/````!P``````````
+M```````!Q,@```&,````!P`````````````````!Q-@```&/````!P``````
+M```````````!Q1````&,````!P`````````````````!Q;P```&/````!P``
+M```````````````!Q?0```&,````!P`````````````````!Q@````&/````
+M!P`````````````````!QBP```&,````!P`````````````````!QCP```&/
+M````!P`````````````````!QF@```&,````!P`````````````````!QG0`
+M``&/````!P`````````````````!QJ````&,````!P`````````````````!
+MQJP```&/````!P`````````````````!QLP```&,````!P``````````````
+M```!QM@```&/````!P`````````````````!QPP```&,````!P``````````
+M```````!QR````&/````!P`````````````````!QSP```&/````!P``````
+M```````````!QU0```&,````!P`````````````````!Q\0```&/````!P``
+M```````````````!Q_````&,````!P`````````````````!R%P```&/````
+M!P`````````````````!R)@```&,````!P`````````````````!R3@```&/
+M````!P`````````````````!R6P```&,````!P`````````````````!R=``
+M``!P````!P`````````````````!R=@```%P````!P`````````````````!
+MR>@```#8````!P`````````````````!RB@```%P````!P``````````````
+M```!RC@```#8````!P`````````````````!RE0```&,````!P``````````
+M```````!RG````&,````!P`````````````````!RG@````O````!P``````
+M```````````!RH@```%P````!P`````````````````!RI0```#8````!P``
+M```````````````!RS0```&,````!P`````````````````!RT@```&,````
+M!P`````````````````!RUP```&,````!P`````````````````!RW````&,
+M````!P`````````````````!RX0```&!````!P`````````````````!S&P`
+M``"=````!P`````````````````!S+@```"=````!P`````````````````!
+MS.````$=````!P`````````````````!S1````"=````!P``````````````
+M```!S3````"=````!P`````````````````!S?@```$=````!P``````````
+M```````!SB@```"=````!P`````````````````!SN0```"=````!P``````
+M```````````!SO0```"=````!P`````````````````!SP0```"=````!P``
+M```````````````!SQ0```"=````!P`````````````````!SR0```"=````
+M!P`````````````````!SRP```%P````!P`````````````````!SS@```#8
+M````!P`````````````````!SW@```"=````!P`````````````````!SX@`
+M``"=````!P`````````````````!SZ````"=````!P`````````````````!
+MS[````"=````!P`````````````````!S\P```"=````!P``````````````
+M```!S]P```"=````!P`````````````````!S^P```"=````!P``````````
+M```````!S_P```"=````!P`````````````````!T!````"=````!P``````
+M```````````!T#````%P````!P`````````````````!T$````#8````!P``
+M```````````````!T%P```&,````!P`````````````````!T'````&,````
+M!P`````````````````!T(@```%P````!P`````````````````!T)0```#8
+M````!P`````````````````!T+P```&,````!P`````````````````!T-``
+M``&,````!P`````````````````!T.0```&!````!P`````````````````!
+MT1@```&/````!P`````````````````!T2P```&/````!P``````````````
+M```!TWP```"=````!P`````````````````!TYP```&/````!P``````````
+M```````!T[````&/````!P`````````````````!T\0```&/````!P``````
+M```````````!U.P```&!````!P`````````````````!U/P```&/````!P``
+M```````````````!U1````&/````!P`````````````````!U50```&,````
+M!P`````````````````!U6@```&,````!P`````````````````!U8@```&,
+M````!P`````````````````!U9P```&,````!P`````````````````!UV@`
+M```!`````P```````=JL```````!UVP````!`````P```````=J````````!
+MUW`````!`````P```````=J(```````!UW0````!`````P```````=J0````
+M```!UW@````!`````P```````=JH```````!UWP````!`````P```````=JH
+M```````!UX`````!`````P```````=J8```````!UX0````!`````P``````
+M`=J@```````!UY`````"````"0```````%UT```````!UY0````"````#```
+M`````%UT```````!U[P```&,````!P`````````````````!U]@```$T````
+M!P`````````````````!U_0````"````"0```````%[$```````!U_@````"
+M````#````````%[$```````!V!````&,````!P`````````````````!V"P`
+M``$T````!P`````````````````!V$@````"````"0```````&*<```````!
+MV$P````"````#````````&*<```````!V'0```&,````!P``````````````
+M```!V)````$T````!P`````````````````!V+P```"(````!P``````````
+M```````!V/`````"````"0```````&@L```````!V/0````"````#```````
+M`&@L```````!V00````N````!P`````````````````!V2P```&/````!P``
+M```````````````!V6@```&,````!P`````````````````!V:0````N````
+M!P`````````````````!V<P````N````!P`````````````````!V@@```&,
+M````!P`````````````````!VC0```&,````!P`````````````````!VFP`
+M```!````"0```````==H```````!VG`````!````#````````==H```````!
+MW-`````"````"0```````&$$```````!W-0````"````#````````&$$````
+M```!W3P```!V````!P`````````````````!W50```!V````!P``````````
+M```````!W6`````"````"0```````&$$```````!W60````"````#```````
+M`&$$```````!W8P```&,````!P`````````````````!W:@```$T````!P``
+M```````````````!W<0````"````"0```````&6<```````!W<@````"````
+M#````````&6<```````!W>````&,````!P`````````````````!W?P```$T
+M````!P`````````````````!WA0````"````"0```````&6D```````!WA@`
+M```"````#````````&6D```````!WD@```&,````!P`````````````````!
+MWF0```$T````!P`````````````````!WGP````"````"0```````&6\````
+M```!WH`````"````#````````&6\```````!WK````&,````!P``````````
+M```````!WLP```$T````!P`````````````````!WN@````"````"0``````
+M`&74```````!WNP````"````#````````&74```````!WU@```!V````!P``
+M```````````````!WW@```!V````!P`````````````````!WYP```!V````
+M!P`````````````````!W[@```!V````!P`````````````````!W]0```!V
+M````!P`````````````````!W_````!V````!P`````````````````!W_P`
+M```"````"0```````&74```````!X``````"````#````````&74```````!
+MX"@```&,````!P`````````````````!X$0```$T````!P``````````````
+M```!X&0````"````"0```````&=L```````!X&@````"````#````````&=L
+M```````!X,````!V````!P`````````````````!X-P```!V````!P``````
+M```````````!X3````!V````!P`````````````````!X4P```!V````!P``
+M```````````````!X60```!V````!P`````````````````!X7`````"````
+M"0```````&=L```````!X70````"````#````````&=L```````!X9P```&,
+M````!P`````````````````!X;@```$T````!P`````````````````!XZ@`
+M``$?````!P`````````````````!YW0```%4````!P`````````````````!
+MZ7@```%4````!P`````````````````!Z:0```""````!P``````````````
+M```!Z<0```""````!P`````````````````!Z?`````"````"0```````&I4
+M```````!Z?0````"````#````````&I4```````!Z@0````"````"0``````
+M`&I4```````!Z@@````"````#````````&I4```````!ZC@````"````"0``
+M`````&I4```````!ZCP````"````#````````&I4```````!ZE````#,````
+M!P`````````````````!ZG@```#,````!P`````````````````!ZJ`````!
+M````"0```````>F,```````!ZJ0````!````#````````>F,```````!ZK0`
+M```!````"0```````=>(```````!ZK@````!````#````````=>(```````!
+MZL@````!````"0```````=I0```````!ZLP````!````#````````=I0````
+M```!ZMP````!````"0```````=BP```````!ZN`````!````#````````=BP
+M```````!ZO`````!````"0```````=JT```````!ZO0````!````#```````
+M`=JT```````!ZP0````!````"0```````>*\```````!ZP@````!````#```
+M`````>*\```````!ZQ@````!````"0```````>G8```````!ZQP````!````
+M#````````>G8```````!ZRP````!````"0```````>G@```````!ZS`````!
+M````#````````>G@```````!ZU`````!`````P```````?`4```````!ZU0`
+M```!`````P```````?`8```````!ZU@````!`````P```````>_T```````!
+MZUP````!`````P```````>_\```````!ZV`````!`````P```````?`4````
+M```!ZV0````!`````P```````?`4```````!ZV@````!`````P```````?`$
+M```````!ZVP````!`````P```````?`,```````!ZW@````"````"0``````
+M`&J````````!ZWP````"````#````````&J````````!ZZ0```&,````!P``
+M```````````````!Z\````$T````!P`````````````````!Z]P````"````
+M"0```````&P````````!Z^`````"````#````````&P````````!Z_@```&,
+M````!P`````````````````![!0```$T````!P`````````````````![#``
+M```"````"0```````&XH```````![#0````"````#````````&XH```````!
+M[%P```&,````!P`````````````````!['@```$T````!P``````````````
+M```![4`````N````!P`````````````````![50```&/````!P``````````
+M```````![9````&,````!P`````````````````![A@````N````!P``````
+M```````````![HP````N````!P`````````````````![NP````N````!P``
+M```````````````![T0````N````!P`````````````````![U0````N````
+M!P`````````````````![XP```&,````!P`````````````````![Z0```&,
+M````!P`````````````````![^`````!````"0```````>M0```````![^0`
+M```!````#````````>M0```````!\>`````"````"0```````'$H```````!
+M\>0````"````#````````'$H```````!\@P````"````"0```````'$P````
+M```!\A`````"````#````````'$P```````!\E`````"````"0```````'%(
+M```````!\E0````"````#````````'%(```````!\I0````"````"0``````
+M`'%@```````!\I@````"````#````````'%@```````!\O````!V````!P``
+M```````````````!\P@```!V````!P`````````````````!\R````!V````
+M!P`````````````````!\U0```!V````!P`````````````````!\W0```!V
+M````!P`````````````````!\Y0```!V````!P`````````````````!\[0`
+M``!V````!P`````````````````!\]0```!V````!P`````````````````!
+M\_0```!V````!P`````````````````!]"0```!V````!P``````````````
+M```!]%@```!V````!P`````````````````!]'0```!V````!P``````````
+M```````!]-P```!V````!P`````````````````!]/0```!V````!P``````
+M```````````!]0P```!V````!P`````````````````!]20```!V````!P``
+M```````````````!]5````!V````!P`````````````````!]6@```!V````
+M!P`````````````````!]8````!V````!P`````````````````!]9@```!V
+M````!P`````````````````!];````!V````!P`````````````````!];P`
+M```"````"0```````'4@```````!]<`````"````#````````'4@```````!
+M]B@```!V````!P`````````````````!]D0```!V````!P``````````````
+M```!]IP```!V````!P`````````````````!]K@```!V````!P``````````
+M```````!]L0````"````"0```````'$H```````!]L@````"````#```````
+M`'$H```````!]N````&,````!P`````````````````!]OP```$T````!P``
+M```````````````!]Q0````"````"0```````'$P```````!]Q@````"````
+M#````````'$P```````!]SP```&,````!P`````````````````!]U@```$T
+M````!P`````````````````!]W`````"````"0```````'%(```````!]W0`
+M```"````#````````'%(```````!]Y@```&,````!P`````````````````!
+M][0```$T````!P`````````````````!]\P````"````"0```````'%@````
+M```!]]`````"````#````````'%@```````!]_0```&,````!P``````````
+M```````!^!````$T````!P`````````````````!^"P````"````"0``````
+M`'4@```````!^#`````"````#````````'4@```````!^%0```&,````!P``
+M```````````````!^'````$T````!P`````````````````!^M````#E````
+M!P`````````````````!^N0```#E````!P`````````````````!^SP```#E
+M````!P`````````````````!^U````#E````!P`````````````````!^X@`
+M``#E````!P`````````````````!^[0```#E````!P`````````````````!
+M^\@```#E````!P`````````````````!_`0```#E````!P``````````````
+M```"!-````""````!P`````````````````"!/````""````!P``````````
+M```````""2````#,````!P`````````````````""4@```#,````!P``````
+M```````````""8`````!````"0```````@2X```````""80````!````#```
+M`````@2X```````""90````!````"0```````>MP```````""9@````!````
+M#````````>MP```````"":@````!````"0```````>_$```````"":P````!
+M````#````````>_$```````"";P````!````"0```````>R8```````""<``
+M```!````#````````>R8```````""=`````!````"0```````?`@```````"
+M"=0````!````#````````?`@```````"">0````!````"0```````?B@````
+M```"">@````!````#````````?B@```````""?@````!````"0```````@BL
+M```````""?P````!````#````````@BL```````""@P````@````"0``````
+M```````````""A`````@````#``````````````````""C`````!`````P``
+M`````A+4```````""C0````!`````P```````A+8```````""C@````!````
+M`P```````A*T```````""CP````!`````P```````A*\```````""D`````!
+M`````P```````A+4```````""D0````!`````P```````A+4```````""D@`
+M```!`````P```````A+$```````""DP````!`````P```````A+,```````"
+M"E@````"````"0```````'98```````""EP````"````#````````'98````
+M```""H0```&,````!P`````````````````""J````$T````!P``````````
+M```````""KP````"````"0```````'?8```````""L`````"````#```````
+M`'?8```````""M@```&,````!P`````````````````""O0```$T````!P``
+M```````````````""Q`````"````"0```````'PP```````""Q0````"````
+M#````````'PP```````""SP```&,````!P`````````````````""U@```$T
+M````!P`````````````````"#"`````N````!P`````````````````"##0`
+M``&/````!P`````````````````"#'````&,````!P`````````````````"
+M#/@````N````!P`````````````````"#6P````N````!P``````````````
+M```"#<P````N````!P`````````````````"#B0````N````!P``````````
+M```````"#C0````N````!P`````````````````"#FP```&,````!P``````
+M```````````"#H0```&,````!P`````````````````"#R@````"````"0``
+M`````'\P```````"#RP````"````#````````'\P```````"#U0````"````
+M"0```````'\X```````"#U@````"````#````````'\X```````"#Y@````"
+M````"0```````']0```````"#YP````"````#````````']0```````"#]P`
+M```"````"0```````']H```````"#^`````"````#````````']H```````"
+M$#@```!V````!P`````````````````"$%0```!V````!P``````````````
+M```"$&`````"````"0```````('P```````"$&0````"````#````````('P
+M```````"$*@````"````"0```````'\P```````"$*P````"````#```````
+M`'\P```````"$,0```&,````!P`````````````````"$.````$T````!P``
+M```````````````"$/@````"````"0```````'\X```````"$/P````"````
+M#````````'\X```````"$2````&,````!P`````````````````"$3P```$T
+M````!P`````````````````"$50````"````"0```````']0```````"$5@`
+M```"````#````````']0```````"$7P```&,````!P`````````````````"
+M$9@```$T````!P`````````````````"$;`````"````"0```````']H````
+M```"$;0````"````#````````']H```````"$=@```&,````!P``````````
+M```````"$?0```$T````!P`````````````````"$A`````"````"0``````
+M`('P```````"$A0````"````#````````('P```````"$C@```&,````!P``
+M```````````````"$E0```$T````!P`````````````````"$J`````!````
+M"0```````@HP```````"$J0````!````#````````@HP```````"&]0```&/
+M````!P`````````````````"'`P```&/````!P`````````````````"'#P`
+M``&,````!P`````````````````"'.P```&,````!P`````````````````"
+M'6````&,````!P`````````````````"'8P```""````!P``````````````
+M```"':P```""````!P`````````````````"'<P```""````!P``````````
+M```````"(@0```#,````!P`````````````````"(BP```#,````!P``````
+M```````````"(D0```#,````!P`````````````````"(FP````!````"0``
+M`````AUT```````"(G`````!````#````````AUT```````"(H`````!````
+M"0```````@I0```````"(H0````!````#````````@I0```````"(I0````!
+M````"0```````A*$```````"(I@````!````#````````A*$```````"(J@`
+M```!````"0```````@MX```````"(JP````!````#````````@MX```````"
+M(KP````!````"0```````@ZD```````"(L`````!````#````````@ZD````
+M```"(M`````!````"0```````AM@```````"(M0````!````#````````AM@
+M```````"(N0````!````"0```````B&0```````"(N@````!````#```````
+M`B&0```````"(O@````@````"0`````````````````"(OP````@````#```
+M```````````````"(Q@````!`````P```````BT@```````"(QP````!````
+M`P```````BTD```````"(R`````!`````P```````BT````````"(R0````!
+M`````P```````BT(```````"(R@````!`````P```````BT@```````"(RP`
+M```!`````P```````BT@```````"(S`````!`````P```````BT0```````"
+M(S0````!`````P```````BT8```````"(T`````"````"0```````((X````
+M```"(T0````"````#````````((X```````"(VP```&,````!P``````````
+M```````"(X@```$T````!P`````````````````"(Z0````"````"0``````
+M`(4(```````"(Z@````"````#````````(4(```````"(\````&,````!P``
+M```````````````"(]P```$T````!P`````````````````"(_@````"````
+M"0```````(D(```````"(_P````"````#````````(D(```````")"0```&,
+M````!P`````````````````")$````$T````!P`````````````````")0@`
+M```N````!P`````````````````")1P```&/````!P`````````````````"
+M)5@```&,````!P`````````````````")>`````N````!P``````````````
+M```")MP````N````!P`````````````````")NP````N````!P``````````
+M```````")R0```&,````!P`````````````````")SP```&,````!P``````
+M```````````"*,0````"````"0```````(P(```````"*,@````"````#```
+M`````(P(```````"*/`````"````"0```````(P0```````"*/0````"````
+M#````````(P0```````"*30````"````"0```````(PH```````"*3@````"
+M````#````````(PH```````"*7@````"````"0```````(Q````````"*7P`
+M```"````#````````(Q````````"*>0```!V````!P`````````````````"
+M*@````!V````!P`````````````````"*A@```!V````!P``````````````
+M```"*D0````"````"0```````(^X```````"*DP````N````!P``````````
+M```````"*H````!V````!P`````````````````"*J````!V````!P``````
+M```````````"*JP````"````"0```````(^X```````"*K`````"````#```
+M`````(^X```````"*O0````"````"0```````(P(```````"*O@````"````
+M#````````(P(```````"*Q````&,````!P`````````````````"*RP```$T
+M````!P`````````````````"*T0````"````"0```````(P0```````"*T@`
+M```"````#````````(P0```````"*VP```&,````!P`````````````````"
+M*X@```$T````!P`````````````````"*Z`````"````"0```````(PH````
+M```"*Z0````"````#````````(PH```````"*\@```&,````!P``````````
+M```````"*^0```$T````!P`````````````````"*_P````"````"0``````
+M`(Q````````"+``````"````#````````(Q````````"+"0```&,````!P``
+M```````````````"+$````$T````!P`````````````````"+%P````"````
+M"0```````(^X```````"+&`````"````#````````(^X```````"+(0```&,
+M````!P`````````````````"+*````$T````!P`````````````````"+.P`
+M```!````"0```````B,8```````"+/`````!````#````````B,8```````"
+M-B0```&/````!P`````````````````"-EP```&/````!P``````````````
+M```"-HP```&,````!P`````````````````"-SP```&,````!P``````````
+M```````"-[````&,````!P`````````````````"-]@```""````!P``````
+M```````````"-_@```""````!P`````````````````".!@```""````!P``
+M```````````````"/%@```#,````!P`````````````````"/(````#,````
+M!P`````````````````"/)@```#,````!P`````````````````"/,`````!
+M````"0```````C?````````"/,0````!````#````````C?````````"/-0`
+M```!````"0```````B,X```````"/-@````!````#````````B,X```````"
+M/.@````!````"0```````BS0```````"/.P````!````#````````BS0````
+M```"//P````!````"0```````B1@```````"/0`````!````#````````B1@
+M```````"/1`````!````"0```````B=<```````"/10````!````#```````
+M`B=<```````"/20````!````"0```````C6L```````"/2@````!````#```
+M`````C6L```````"/3@````!````"0```````COD```````"/3P````!````
+M#````````COD```````"/4P````@````"0`````````````````"/5`````@
+M````#````````````````````-````$+````(````````````````````-@`
+M``!C````(````````````````````.````"_````(```````````````````
+M`.@```"R````(````````````````````/````%Y````(```````````````
+M`````/@```#2````(````````````````````0````!3````(```````````
+M`````````0@```#>````(````````````````````1````"?````(```````
+M`````````````1@```%V````(````````````````````2````%)````(```
+M`````````````````2@```"\````(````````````````````3`````]````
+M(````````````````````3@```"#````(````````````````````4````!6
+M````(````````````````````4@````?````(````````````````````5``
+M``%G````(````````````````````5@```&2````(```````````````````
+M`6`````M````(````````````````````6@```"+````(```````````````
+M`````7````%&````(````````````````````7@````H````(```````````
+M`````````8`````[````(````````````````````8@```!G````(```````
+M`````````````9````%]````(````````````````````9@```%X````(```
+M`````````````````:````$8````(````````````````````:@```"S````
+M(````````````````````;````%>````(````````````````````;@```%A
+M````(````````````````````<````$(````(````````````````````<@`
+M``#;````(````````````````````=````$[````(```````````````````
+M`=@```"/````(````````````````````>````%Q````(```````````````
+M`````>@```"]````(````````````````````?````"U````(```````````
+M`````````?@```"$````(````````````````````@````"M````(```````
+M`````````````@@```!4````(````````````````````A````#&````(```
+M`````````````````A@```$W````(````````````````````B````$-````
+M(````````````````````B@```"C````(````````````````````C````$R
+M````(````````````````````C@```#H````(````````````````````D``
+M``%;````(````````````````````D@```%+````(```````````````````
+M`E````$J````(````````````````````E@````Q````(```````````````
+M`````F````"T````(````````````````````F@```%9````(```````````
+M`````````G````$:````(````````````````````G@```$C````(```````
+M`````````````H`````\````(````````````````````H@```!S````(```
+M`````````````````I````%#````(````````````````````I@```#C````
+M(````````````````````J````!.````(````````````````````J@````U
+M````(````````````````````K````"*````(````````````````````K@`
+M```(````(````````````````````L````#T````(```````````````````
+M`L@```$\````(````````````````````M````$S````(```````````````
+M`````M@```#U````(````````````````````N````%^````(```````````
+M`````````N@```!H````(````````````````````O`````*````(```````
+M`````````````O@```%C````(````````````````````P````"K````(```
+M`````````````````P@```$.````(````````````````````Q````$7````
+M(````````````````````Q@```%M````(````````````````````R````$Q
+M````(````````````````````R@```"E````(````````````````````S``
+M``!$````(````````````````````S@```$L````(```````````````````
+M`T`````2````(````````````````````T@```"Z````(```````````````
+M`````U````!N````(````````````````````U@```#W````(```````````
+M`````````V````#Y````(````````````````````V@```%0````(```````
+M`````````````W````%B````(````````````````````W@```%\````(```
+M`````````````````X`````.````(````````````````````X@```%-````
+M(````````````````````Y````$A````(````````````````````Y@```$*
+M````(````````````````````Z````"@````(````````````````````Z@`
+M``%.````(````````````````````[`````!````(````````&1T````````
+M`[@```&0````(````````````````````\````$I````(```````````````
+M`````]````%9````(````````````````````]@```$:````(```````````
+M`````````^````$C````(````````````````````^@````\````(```````
+M`````````````_````!S````(````````````````````_@````!````(```
+M`````&2@````````&I@```%$````(```````````````````&J````%D````
+M(```````````````````&J@```%6````(```````````````````&K````%[
+M````(```````````````````&K@```!B````(```````````````````&L``
+M``!T````(```````````````````&L@```"2````(```````````````````
+M&M````!K````(```````````````````&M@````,````(```````````````
+M````&N`````T````(```````````````````&N@```!@````(```````````
+M````````&O````!A````(```````````````````&O@````X````(```````
+M````````````&P````%J````(```````````````````&P@```$,````(```
+M````````````````&Q````&&````(```````````````````&Q@```"`````
+M(```````````````````&R````%T````(```````````````````&R@```$!
+M````(```````````````````&S````"I````(```````````````````&S@`
+M``$F````(```````````````````&T`````A````(```````````````````
+M&T@```$&````(```````````````````&U`````8````(```````````````
+M````&U@```%F````(```````````````````&V````#F````(```````````
+M````````&V@````>````(```````````````````&W`````I````(```````
+M````````````&W@```"L````(```````````````````&X````%Z````(```
+M````````````````&X@```%H````(```````````````````&Y````%U````
+M(```````````````````&Y@```$X````(```````````````````&Z````#Q
+M````(```````````````````&Z@```#^````(```````````````````&[``
+M``#M````(```````````````````&[@```$1````(```````````````````
+M&\````!\````(```````````````````&\@```"7````(```````````````
+M````&]````!R````(```````````````````&]@```%(````(```````````
+M````````&^````">````(```````````````````&^@````_````(```````
+M````````````&_````$Y````(```````````````````&_@```$U````(```
+M````````````````'`````!X````(```````````````````'`@````Y````
+M(```````````````````'!````%,````(```````````````````'!@```#<
+M````(```````````````````'"````$M````(```````````````````'"@`
+M``#B````(```````````````````'#````#"````(```````````````````
+M'#@```#A````(```````````````````'$````%`````(```````````````
+M````'$@```#-````(```````````````````'%`````V````(```````````
+M````````'%@```!?````(```````````````````'&````#7````(```````
+M````````````'&@```%%````(```````````````````''````%3````(```
+M````````````````''@```$E````(```````````````````'(`````;````
+M(```````````````````'(@```!:````(```````````````````')````$O
+M````(```````````````````')@```&1````(```````````````````'*``
+M``!'````(```````````````````'*@```"9````(```````````````````
+M'+````%?````(```````````````````'+@```#3````(```````````````
+M````',````$#````(```````````````````',@````=````(```````````
+M````````'-````#Z````(```````````````````'-@````W````(```````
+M````````````'.````#_````(```````````````````'.@```#J````(```
+M````````````````'/````",````(```````````````````'/@````F````
+M(```````````````````'0````!/````(```````````````````'0@```"1
+M````(```````````````````'1````#:````(```````````````````'1@`
+M``#*````(```````````````````'2````%5````(```````````````````
+M'2@```#)````(```````````````````'3````%0````(```````````````
+M````'3@```&-````(```````````````````'4`````'````(```````````
+M````````'4@```"A````(```````````````````'5````!O````(```````
+M````````````'5@```!I````(```````````````````'6````#N````(```
+M````````````````'6@```#R````(```````````````````'7````$%````
+M(```````````````````'7@````!````(````````*[,````````'8````$K
+M````(```````````````````'8@```%'````(```````````````````'9@`
+M``#"````(```````````````````':````#A````(```````````````````
+M':@```%`````(```````````````````';````#-````(```````````````
+M````';@````V````(```````````````````'<`````!````(````````*\X
+M````````/8@```!9````(```````````````````/9````!_````(```````
+M````````````/9@```%R````(```````````````````/:````!J````(```
+M````````````````/:@```!#````(```````````````````/;````#6````
+M(```````````````````/;@```"W````(```````````````````/<````$;
+M````(```````````````````/<@```"J````(```````````````````/=``
+M``!2````(```````````````````/=@```"<````(```````````````````
+M/>````!5````(```````````````````/>@```$"````(```````````````
+M````/?````%=````(```````````````````/?@```")````(```````````
+M````````/@````#]````(```````````````````/@@```#D````(```````
+M````````````/A````&7````(```````````````````/A@```&+````(```
+M````````````````/B````"X````(```````````````````/B@```![````
+M(```````````````````/C````$B````(```````````````````/C@````G
+M````(```````````````````/D````%<````(```````````````````/D@`
+M``%1````(```````````````````/E````"%````(```````````````````
+M/E@```%@````(```````````````````/F````!=````(```````````````
+M````/F@```$^````(```````````````````/G````$`````(```````````
+M````````/G@```#[````(```````````````````/H`````1````(```````
+M````````````/H@```%K````(```````````````````/I````!Y````(```
+M````````````````/I@```#?````(```````````````````/J````%P````
+M(```````````````````/J@```#8````(```````````````````/K````"5
+M````(```````````````````/K@```$P````(```````````````````/L``
+M``#X````(```````````````````/L@````/````(```````````````````
+M/M````";````(```````````````````/M@````)````(```````````````
+M````/N````"6````(```````````````````/N@```$]````(```````````
+M````````/O````"O````(```````````````````/O@```#G````(```````
+M````````````/P`````^````(```````````````````/P@```$>````(```
+M````````````````/Q````"B````(```````````````````/Q@```"P````
+M(```````````````````/R````$6````(```````````````````/R@```!,
+M````(```````````````````/S````%!````(```````````````````/S@`
+M``%/````(```````````````````/T````$3````(```````````````````
+M/T@```&3````(```````````````````/U````!(````(```````````````
+M````/U@```#%````(```````````````````/V````"G````(```````````
+M````````/V@```&!````(```````````````````/W````!+````(```````
+M````````````/W@```"-````(```````````````````/X````&%````(```
+M````````````````/X@```"F````(```````````````````/Y````#+````
+M(```````````````````/Y@```!!````(```````````````````/Z````!*
+M````(```````````````````/Z@````L````(```````````````````/[``
+M``!`````(```````````````````/[@````Z````(```````````````````
+M/\````#I````(```````````````````/\@```!%````(```````````````
+M````/]````!^````(```````````````````/]@````S````(```````````
+M````````/^`````R````(```````````````````/^@````7````(```````
+M````````````/_````!Q````(```````````````````/_@```#V````(```
+M````````````````0`````!L````(```````````````````0`@```$D````
+M(```````````````````0!````&`````(```````````````````0!@```#/
+M````(```````````````````0"````%0````(```````````````````0"@`
+M``"0````(```````````````````0#````&.````(```````````````````
+M0#@```$/````(```````````````````0$````#0````(```````````````
+M````0$@````B````(```````````````````0%````%S````(```````````
+M````````0%@```!M````(```````````````````0&````#4````(```````
+M````````````0&@```#$````(```````````````````0'````#K````(```
+M````````````````0'@```&)````(```````````````````0(@```$6````
+M(```````````````````0)````!,````(```````````````````0)@```%!
+M````(```````````````````0*````%/````(```````````````````0*@`
+M``$3````(```````````````````0+````&4````(```````````````````
+M0,`````!````(````````11X`````````!`````#````(```````````````
+M`````!@````#````(``````````(`````````"`````#````(``````````0
+M`````````"@````#````(``````````8`````````#`````#````(```````
+M```@`````````#@````#````(``````````H`````````$`````#````(```
+>```````P`````````$@````#````(``````````X
+`
+end
diff --git a/sys/contrib/dev/ath/public/sparc64-be-elf.inc b/sys/contrib/dev/ath/public/sparc64-be-elf.inc
new file mode 100644
index 0000000..cec2bee
--- /dev/null
+++ b/sys/contrib/dev/ath/public/sparc64-be-elf.inc
@@ -0,0 +1,83 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: powerpc-be-elf.inc,v 1.1 2004/12/19 23:23:21 sam Exp $
+#
+
+#
+# Compilation configuration for building big-endian Sparc64 w/ elf.
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=sparc64-elf
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/sparc64-elf-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+#
+# NB: this should come from inttypes.h but can't until we cleanp
+# the definition of va_list on linux
+#
+COPTS+= -DAH_WORDSIZE=64
+COPTS+= -mcmodel=medlow
+COPTS+= -mno-fpu
+#
+# Suppress TLS register usage; haven't figured out to do this
+# when we build the toolchain (so unfortunately we pollute the
+# build options).
+#
+COPTS+= -ffixed-g2 -ffixed-g3
diff --git a/sys/contrib/dev/ath/public/sparc64-be-elf.opt_ah.h b/sys/contrib/dev/ath/public/sparc64-be-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/sparc64-be-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/wackelf.c b/sys/contrib/dev/ath/public/wackelf.c
new file mode 100644
index 0000000..daa4306
--- /dev/null
+++ b/sys/contrib/dev/ath/public/wackelf.c
@@ -0,0 +1,121 @@
+/*-
+ * Copyright (c) 2006 Sam Leffler, Errno Consulting
+ * Copyright (c) 2006 Atheros Communications, Inc.
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 2. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/wackelf.c#3 $
+ */
+
+/*
+ * Program to zap flags field in the ELF header of an object
+ * file so that it appears to use VFP soft floating point.
+ * This is done because there is no standard way to specify
+ * this on the command line to gcc/binutils.
+ *
+ * Derived from code by Olivier Houchard <cognet@freebsd.org>
+ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <elf.h>
+#include <fcntl.h>
+#include <err.h>
+
+#ifdef __linux__
+#include <endian.h>
+#include <byteswap.h>
+#define _LITTLE_ENDIAN __LITTLE_ENDIAN
+#define _BIG_ENDIAN __BIG_ENDIAN
+#if __BYTE_ORDER == __LITTLE_ENDIAN
+#define htobe16(x) __bswap_16((x))
+#define htobe32(x) __bswap_32((x))
+#define htole16(x) ((uint16_t)(x))
+#define htole32(x) ((uint32_t)(x))
+#else /* _BYTE_ORDER != _LITTLE_ENDIAN */
+#define htobe16(x) ((uint16_t)(x))
+#define htobe32(x) ((uint32_t)(x))
+#define htole16(x) __bswap_16((x))
+#define htole32(x) __bswap_32((x))
+#endif /* _BYTE_ORDER == _LITTLE_ENDIAN */
+#else
+#include <sys/endian.h>
+#endif
+
+int
+main(int argc, char *argv[])
+{
+ int fd, endian, oflags;
+ int format = 0x400; /* default to VFP */
+ Elf32_Ehdr ehdr;
+
+ if (argc > 2) {
+ if (strcmp(argv[1], "-fpa") == 0) {
+ format = 0x200;
+ argc--, argv++;
+ } else if (strcmp(argv[1], "-vfp") == 0) {
+ format = 0x400;
+ argc--, argv++;
+ } else if (strcmp(argv[1], "-none") == 0) {
+ format = 0;
+ argc--, argv++;
+ }
+ }
+ if (argc != 2) {
+ fprintf(stderr, "usage: %s [-fpa|-vfp|-none] file\n", argv[0]);
+ exit(-1);
+ }
+ fd = open(argv[1], O_RDWR);
+ if (fd < 0)
+ err(1, "could not open %s", argv[1]);
+ if (read(fd, &ehdr, sizeof(ehdr)) != sizeof(ehdr))
+ err(1, "could not read the ELF header");
+ if (ehdr.e_machine == htole16(EM_ARM))
+ endian = _LITTLE_ENDIAN;
+ else if (ehdr.e_machine == htobe16(EM_ARM))
+ endian = _BIG_ENDIAN;
+ else
+ errx(1, "not an ARM ELF object (machine 0x%x)", ehdr.e_machine);
+ oflags = ehdr.e_flags;
+ if (endian == _BIG_ENDIAN) {
+ ehdr.e_flags &= ~htobe32(0x600); /* Remove FPA Soft float */
+ ehdr.e_flags |= htobe32(format); /* VFP Soft Float */
+ } else {
+ ehdr.e_flags &= ~htole32(0x600); /* Remove FPA Soft float */
+ ehdr.e_flags |= htole32(format); /* VFP Soft Float */
+ }
+ printf("%s: e_flags 0x%x => 0x%x\n", argv[1], oflags, ehdr.e_flags);
+ if (lseek(fd, (off_t) 0, SEEK_SET) != 0)
+ err(1, "lseek");
+ if (write(fd, &ehdr, sizeof(ehdr)) != sizeof(ehdr))
+ err(1, "yow, elf header write failed");
+ close(fd);
+ return 0;
+}
diff --git a/sys/contrib/dev/ath/public/x86_64-elf.hal.o.uu b/sys/contrib/dev/ath/public/x86_64-elf.hal.o.uu
new file mode 100644
index 0000000..597aa76
--- /dev/null
+++ b/sys/contrib/dev/ath/public/x86_64-elf.hal.o.uu
@@ -0,0 +1,5533 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/x86_64-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@(!`0````````````$`/@`!`````````````````````````,C>`@``
+M`````````$```````$``$``-``^WQTC'P@````"#^%@/A/\```"#^%A_5X/X
+M&W\J@_@:#XW>````@_@2?Q>#^!$/C;4```"#^`</A*,```#IRP```(/X$^M@
+M@_A2#X2B````@_A2?PQ(Q\(`````@_@<ZWN#^%</A(@```#IG@```#T'$0``
+M=&H]!Q$``'\N2,?"`````#V1````#X2#````/9$```!_#"V&````@_@!=VWK
+M63T4$```=%OK8CT3$0``=%(]$Q$``'\)/1(1``!T*>M+2,?"`````#T3\```
+M=$)(Q\(`````/1OQ``!T-.LM2,?"`````.LI2,?"`````.L@2,?"`````.L7
+M2,?"`````.L.2,?"`````.L%N@````!(B=##2(/L"(GQ9H'_C!9T$V:!_R>G
+M=`RX`````&:!_[<0=0@/M_GHPO[__TB#Q`C#2(/L"`^WQST'`@``#X2*````
+M/0<"``!_((/X$G\,@_@1?6^#^`=T=.M_@_@3=%F#Z!J#^`)W<NM*/1,1``!T
+M2#T3$0``?QX]!Q$``'1./0<1``!_!ST4$```ZR4]$A$``'0OZT0]&_$``'0F
+M/1OQ``!_"3T3\```=`[K+3T9_P``=2:_$P````^W_^@`````ZQ(/M__H````
+M`.L(#[?_Z`````!(B<+K#+H`````0<<``0```$B%TG1+#[>">`,``&:)0@@/
+MMX)Z`P``9HE""HN"?`,``(E"+`^W@H`#``!FB4(P#[>"@@,``&:)0C(/MX*$
+M`P``9HE"-`^W@H8#``!FB4(V2(G02(/$",.)MX@#``"X`0```,-!5D%50515
+M4TF)_D&)U4&)S+L`````B?5)BT8@BT0%`$0AZ+H!````1#G@=!F_"@```.@`
+M````_\.!^^<#``!^U[H`````B=!;74%<05U!7L.Y`````+@`````.?!S$HT4
+M`(GX@^`!"=#1[__!.?%R[L-!B=(/M\%(C01`1`^W3(8FN`````!%A<D/A+8!
+M```/M\%(C01`#[9$AB6#^`)T88/X`G\)A<!T'.F/`0``@_@##X05`0``@_@$
+M#X0]`0``Z7@!``"_P````$6%P'03#[?!2(T$0(!\ABD`=`6_8````$*-!-4`
+M````:<#H`P``N@````!!]_&-1#@*Z4$!``!(@[_H$P````^$C````$B+A^@3
+M``!F@W@"`'DS1(G(P>`$B<!(:<#336(02,'H((G"P>H&0HU$TA6)T;H`````
+M]_'!X`0%D````.GR````2(._Z!,```!T04B+A^@3``#V0`-`=#1"C03-````
+M`(G`2&G`TTUB$$C!Z"")PL'J!D*-1-(5B=&Z`````/?QC03%2````.FG````
+M0HT$C0````")P$AIP---8A!(P>@@B<+!Z@9"C432%8G1N@````#W\8T$A20`
+M``#K=D*-!,T`````B<!(:<#336(02,'H((G"P>H&0HU$TA6)T;H`````]_&-
+M!(46````ZT5"C02-`````(G`2&G`TTUB$$C!Z"")PL'J!D*-1-(5B=&Z````
+M`/?QP>`"C9"]````@\!<08'YYP,```]&PNL%N``````/M\##]D8"('0'N@(`
+M``#K1`^W1@(ET````+H#````/<````!T+P^W1@(ET````+H$````/=````!T
+M&O9&`A!T![H!````ZPWV1@,(#Y7`#[;0C122B=##2(/L&$B)7"0(2(EL)!")
+M]8G3A-)Y'K@.````@?ZT"0``#X0.`0``@?ZS"0``=E3IT````/;&`70QZ```
+M``"%P'0+C86S[/__@_@P=G+WPT`!```/A,8```"!_8@3```/AI<```#IM0``
+M`+@.````@?ZT"0``#X2Z````@?ZS"0``=R"-E9GV__](8\)(:<!G9F9F2,'H
+M(-'XP?H?*=#ID@```('^AQ,``'=TZ`````"%P'1`C86S[/__@_@P=S6-1*T`
+MC10`B>BYS<S,S$@/K\%(P>@@P>@"C02`*<6-@@@___^#_0)U/8V"#3___T@/
+MK\'K.H'])!,``'8(C85@\/__ZR&-A3#V__^ZS<S,S$@/K\)(P>@@P>@$@\`/
+MZQ:-A7CL__^ZS<S,S$@/K\)(P>@@P>@"2(M<)`A(BVPD$$B#Q!C#4XGS2(NW
+MZ!,``$B%]G03Z`````")P`^V@``````/K\/K`VO#%EO#4XGS2(NWZ!,``$B%
+M]G0=Z`````")P`^VD`````")V(G6N@````#W]HG!ZQ2)V+JCBRZZ2`^OPDC!
+MZ"")P<'I!(G(6\-!5D%505154TF)_DB)]8!^!``/A9$```!!O`````!)8\3&
+M1"@$_T'_Q$&#_!]^[T&\`````$0[90!];DECW$B-'%M(C5R=(`^V0P@/MDL+
+M#[;01(AD*@0*0PD/ML!$B&0H!$0/MNE!N`````!$B>FZ#@```$B)[DR)]^@`
+M````9HE##$&X`0```$2)Z;H.````2(GN3(GWZ`````!FB4,.0?_$1#ME`'R2
+M6UU!7$%=05[#3(V'D`,``(/^(@^'+P$``(GP_R3%``````^WA[@#``#K$4'V
+M0`,!#Y3`#[;`PT$/MT`*B0&X`````,-!#[=`".OQ0?9``@+K%T'V0`(!N@``
+M``"X#0````]$PL-!]@`$N@````"X#0````]%PL-!]@`(Z^Q!]@`0Z^:+AZ@#
+M``#KL8/Z`70=N`````"#^@$/@J\```"#^@)T$X/Z`W0:Z8P````/OX>L`P``
+MZX8/MX>N`P``Z7K___^+A[`#``#I;____T'V0`($ZY5!]D`"".N.0?9``0'K
+MAT'V0`(@ZX!!]D`"0.EV____@_H!=!^#^@%R!X/Z`G0>ZS5!@'@"`+H`````
+MN`T````/2,+#@[\$%````.L3#[>'`!0``.D0____@[\@%`````^%!?___[@-
+M````PT&+0!3I]/[__[@,````PTR)P(/^&70E@_X9=P>#_@]T">M*@_X>=#WK
+M0X/Z`W4^@_D$=SF)C[`#``#K&H/Z`70'@_H"=!;K)87)#Y7`#[;`B8<$%```
+MN`$```##9HF/`!0``.OQB8\@%```Z^E(A<!T!L<`#````+@`````PU-(B=-)
+MB=%!NP````"#^0=V2TECPT0/MP2&1`^W5(8"1(G`P>`01`G008D!28/!!(/I
+M!$2)P$B+5R"+!!!!B0%)@\$$08/`!(/I!$4YT'<%@_D#=]Y!_\.#^0=WM42)
+MR"G86\-328G23(G+@_X-="J#_@U_!H7V=`[K=H/^'70L@_X>=#KK:DB-AW@#
+M``!)B0!!QP$0````ZU!!BPE)BQ!,B=;H6/___XD#ZSY(C8<(%```28D`0<<!
+M&````.LKA<EU%$''`00```!)BQ"+A[0#``")`NL3N`````"#^01U%4&+`HF'
+MM`,``+@!````ZP6X`````%O#2(G1@WX$`'4&N`````##BP*)!HM"!(E&"(M"
+M"(E&#(M"#(E&$(-Z$/]T%8M"$#T``0``NO\````/0\*)1A3K!\=&%`(```"#
+M>13_="V+412!^@$$``"X``0```]#T,=&&`$````Y5AAS%K@!`````<"#R`$Y
+MT'+WZP.+012)1AB#>1C_=#"+41B!^@$$``"X``0```]#T,=&'`$````Y5AQS
+M&K@!`````<"#R`$YT'+WB48<ZP?'1AS_`P``9H-Y'`!T%@^W01QF@_@0N@\`
+M```/0\)FB48@ZP9FQT8@"@!F@WD>`'06#[=!'F:#^!"Z#P````]#PF:)1B+K
+M!F;'1B(*`(M!((E&)(M!)(E&*(M!*(E&+(M!+(E&,(-Y!`1U#8-^!`%U!\=&
+M.`$```"X`0```,.#>@0`=0:X`````,.+0@R)1@B+`HD&BT((B48$BT(,B48(
+MBT(0B48,BT(4B480BT(8B484BT(<B488#[="(&:)1AP/MT(B9HE&'HM")(E&
+M((M"*(E&)(M"+(E&*(M",(E&++@!````PTB#[!A(B1PD2(EL)`A,B60D$$F)
+M_$B)\^@`````2(G%N`````!(A>UT-6:#?18`=25(B=Y,B>?H`````(G#2(GN
+M3(GG0?^4)&@#``!F`X0;`````.L(#[=%%F8#11B82(L<)$B+;"0(3(MD)!!(
+M@\08PT%7059!54%455-(@^P(28G]9L=$)`(``&;'1"0&``!FQP0D``!FQT0D
+M!```0;P`````1#NGX!,```^#MP```$ECQ$C!X`9*C:PHX`,``&:#?18`#XF-
+M````2(GN3(GOZ`````!!B<:)P$0/M[P```````^W719$`?M(B>Y,B>]!_Y5H
+M`P``C008]D4#`70G9CL$)'U19HD$)$B)[DR)[T'_E6@#``!F`T469D$IQV9$
+MB7PD!.LP9CM$)`)]*6:)1"0"1(GS2(GN3(GO0?^5:`,``&8#118/MY0;````
+M`&8IPF:)5"0&0?_$13NEX!,```^"2?___T&\`````$0/OW0D!`^_7"0&26/$
+M2,'@!DJ-K"C@`P``9H-]%@!Y'TB)[DR)[T'_E6@#``"8]D4#`70%1`'PZP(!
+MV&:)11A!_\1!@_P_?L)(@\0(6UU!7$%=05Y!7\.0D%.)T&:!/P$P=PE)Q\(`
+M````ZP=)Q\(`````OP````!$#[?`0;ED````#[?V2&/'00^W!$*)PD$/K]!$
+MB<LIPXG8#Z_&`<)(8\)(:<`?A>M12,'H(,'X!<'Z'RG09HD!2(/!`O_'@_\*
+M?L);PP^WUF:!_O\`=#=F@3\",'<A9H/^/G8,#[?&C02`9@4B%>L9#[?&C02`
+MC80`[!,``.L*#[?&C02`9@7`$@^WP(G"B=##B?`/M]9F@?[_`'069H$_`C!W
+M!F8%8`GK!&8%_`@/M\")PHG0PT%505154TB#[`A(B?M)B?1F@3[_/W829H-^
+M+@!T"V:#?A8`#X1C`@``9D&!/"0",'9S0;U0`0``O0````!F08.\)'8!````
+M#X0_`@``00^W]4'_Q4B-5"0&2(G?_Y,H`P``N@````"%P`^$(@(``$ACU68/
+MMD0D!V9!B8148@$``&8/MD0D!F9!B8149`$``(/%`D$/MX0D=@$``#G%?*WI
+MJ0$``$&]`0$``$B-5"0&O@`!``!(B=__DR@#``"Z`````(7`#X3&`0``#[=$
+M)`:)PF;!Z@EF08F4)&(!``!FP>@"@^!_9D&)A"1D`0``#[=$)`;!X`6#X']F
+M08F$)&8!``!!#[?U0?_%2(U4)`9(B=__DR@#``"Z`````(7`#X1L`0``#[=$
+M)`:)PF;!Z@MF00F4)&8!``!FP>@$@^!_9D&)A"1H`0``#[=$)`;!X`.#X']F
+M08F$)&H!``!!#[?U0?_%2(U4)`9(B=__DR@#``"Z`````(7`#X02`0``#[=$
+M)`:)PF;!Z@UF00F4)&H!``!FP>@&@^!_9D&)A"1L`0``#[=$)`8!P(/@?V9!
+MB80D;@$``$$/M_5!_\5(C50D!DB)W_^3*`,``+H`````A<`/A+D````/MU0D
+M!HG09L'H#V9!"80D;@$``(G09L'H"(/@?V9!B80D<`$``&;1ZH/B?V9!B90D
+M<@$```^W1"0&P>`&@^!_9D&)A"1T`0``00^W]4B-5"0&2(G?_Y,H`P``N@``
+M``"%P'15#[=$)`9FP>@*9D$)A"1T`0``O0````!F08.\)'8!````="U%#[>L
+M)'8!``!(8]U!#[>T7&(!``!,B>?H&_W__V9!B81<8@$``/_%1#GM?-RZ`0``
+M`(G02(/$"%M=05Q!7<-!5%532(G3#[=N%$F)]`^WQ4B-/(!(C3RX2(U$``-(
+MP>@"2`''2,'G`N@`````2(G"N`````!(A=(/A*````!(B1,/M\5(C40``R7\
+M_P<`2(T$$$B)0Q!FB6L(0;@`````9H7M='1$#[?-26/02(L[2(MS$$AKRE1!
+M#[<$5&:)!`YFB017N0````!(:_)42&/!2(T$@$B-!(9(B<)(`U,09HE*!$@#
+M0Q!FQT`&``#_P8/Y`W[926/`2(M3$$AKP%1FQT0"!@0`2(M3$&;'1`)"`P!!
+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
+M@XX```!$#[?200^WPP^W%$-FB11'2&O`9D@!^&:)4!AFB7`<0;D`````N0``
+M``!!#[?#3&O`9@^WP4B-!$!)C03`2(T4!V:)2AY$B=#3^*@!=!AFQT(@!`!!
+M_\%F08/Y`74:9L="(`4`ZQ(/M\%(C01`28T$P&;'1`<@``#_P6:#^0-VLD'_
+MPV9$.UL4#X)V____6\-!5T%6055!5%532(/L$$B)-"1(B=5FQT0D"*W>2(U$
+M)`AFQT`"K=YFQT`$K=YFQT`&K=Y!O0````"[``````^W<A:_`P```$F)P`^W
+MPXGY*<&)\-/XJ`%T$$2)ZHGX9BG89D&)!%!!_\7_PV:#^P-VV4B+%"0/MT(4
+M9HE%%$&^`````&9!.<8/@\D```!!#[?&2&O`9DB+%"1(`<),C4H8#[=2&&:)
+M5`48NP````"X`````$0YZ`^#C````$R-?"0(00^WQDQKX&8/M]-)#[<$5TB-
+M!$!)C03$2(U\!1Y!#[]$40S!X`)FB4<.00^W1%$$9HE'!$&X`0```&9$.T<"
+M<SQ)B=-$#[=7`D$/M\A)C32+00^_1'$T#[=43PR-!$)FB41/#@^W1$\"9D$#
+M1'$,9HE$3P1!_\!F13G0<LS_PP^WPT0YZ'*!0?_&9D0[=10/@C?___^X`0``
+M`$B#Q!!;74%<05U!7D%?PT%7059!54%455-(@^P(28G^2(GSQP0D!``&`,=$
+M)`0)``P`0;\`````OQ0$``#H`````$B)Q4B%P`^$H`$``$0/MZO0````9H-[
+M%@`/A((```"^%`0``$B)Q^@`````#[=#:&:)119!N0````!!N`H```!$B>E(
+MB>I(B=Y,B??H%O?__X7`#X1&`0``3(VC:`T```^W0VAF08E$)!9(B>Y,B>?H
+M$OW__TR)XDB)[DR)]^C@_?__A<`/A!0!``!(#[=%&@^W5$3^#[=%%`^OPD:-
+M;"@%9H-[&@`/A((```"^%`0``$B)[^@`````#[=#:F:)119!N0$```!!N`0`
+M``!$B>E(B>I(B=Y,B??HB?;__X7`#X2Y````3(VC?!$```^W0VIF08E$)!9(
+MB>Y,B>?HA?S__TR)XDB)[DR)]^A3_?__A<`/A(<```!(#[=%&@^W5$3^#[=%
+M%`^OPD:-;"@"9H-['`!T9+X4!```2(GOZ``````/MT-L9HE%%D&Y`@```$&X
+M!````$2)Z4B)ZDB)WDR)]^@`]O__A<!T-$R-HY`5```/MT-L9D&)1"062(GN
+M3(GGZ`#\__],B>)(B>Y,B??HSOS__X7`=`9!OP$```!(A>UT"$B)[^@`````
+M1(GX2(/$"%M=05Q!74%>05_#05=!5D%505154TB#[!A)B?Q)B?5F@3[_/W8.
+M9H-^+@%U!^A-\/__ZQQF08%]`/]/=AIF08-]+@)U$DR)[DR)Y^C*_?__B<+I
+MR@(``$&^`````&9!@7T``C!V![U0`0``ZP6]``$``$&#_@%T.$&#_@%_"D6%
+M]G0-Z8````!!@_X"=$[K>(/%!4$/MX5V`0``9HE$)!1)C9UX`0``28V58@$`
+M`.MB9D&#?1H`#X13`@``@\4W00^WA8`#``!FB40D%$F-G3X$``!)C96(`P``
+MZS9F08-]'``/A"<"``"#Q49!#[>%@`,``&:)1"0428V=H@,``$F-E8(#``#K
+M"KH`````Z0\"``!(B50D"$&_`````&:#?"04``^$Y@$``$ECQTB+5"0(#[<$
+M0F:)`XGN_\5(C50D%DR)YT'_E"0H`P``N@````"%P`^$R`$```^W1"069L'H
+M"F:)0P0/MT0D%F;!Z`2#X#]FB4,"#[=$)!;!X`*#X#]FB4,>B>[_Q4B-5"06
+M3(GG0?^4)"@#``"Z`````(7`#X1[`0``#[=$)!9FP>@.9@E#'F8/MD0D%X/@
+M/V:)0R`/MT0D%F;!Z`*#X#]FB4,B#[=$)!;!X`2#X#]FB4,DB>[_Q4B-5"06
+M3(GG0?^4)"@#``"Z`````(7`#X0A`0``#[=$)!9FP>@,9@E#)`^W1"069L'H
+M!H/@/V:)0R8/MT0D%H/@/V:)0RB)[O_%2(U4)!9,B>=!_Y0D*`,``+H`````
+MA<`/A-<````/MT0D%F;!Z`IFB4,J#[=$)!9FP>@$@^`_9HE#+`^W1"06P>`"
+M@^`_9HE#+HGN_\5(C50D%DR)YT'_E"0H`P``N@````"%P`^$B@````^W1"06
+M9L'H#F8)0RYF#[9$)!>#X#]FB4,P#[=$)!9FP>@"@^`_9HE#,DB-2P@/MU,$
+M#[=S`DR)[^CPYO__N0`````/MT,&B<8YP7T62&/1#[]$4QYKP#)FB413'O_!
+M.?%\ZDB#PS1!_\</MT0D%$$YQP^,&O[__T'_QD&#_@(/CD']__^Z`0```(G0
+M2(/$&%M=05Q!74%>05_#05=!5D%505154TB#[!A)B?Y(B?5!O0````!F@7T`
+M_S]V"@^W121$C6"KZQ9F@7T``C!V"$&\4`$``.L&0;P``0``08/]`70Q08/]
+M`7\'187M=`KK<D&#_0)T1>MJ08/$5<=$)!`(````2(V=W`0``$B-A=H$``#K
+M6&:#?1H`#X2N`0``08/$9<=$)!`"````2(V=3@4``$B-A4P%``#K,6:#?1P`
+M#X2'`0``08/$:<=$)!`#````2(V=+@4``$B-A2P%``#K"KH`````Z7,!``!(
+MB40D"$B+1"0(9L<```!!OP````!$.WPD$`^-00$``$2)YD'_Q$B-5"063(GW
+M0?^6*`,``+H`````A<`/A#$!``!F@7T``C!V"&8/MD0D%^L)#[=$)!9FP>@)
+M9HE#"&:#>P@`#X3E````187M=0X/MW,(2(GOZ+/E___K#`^W<PA(B>_HZ>7_
+M_V:)0PAF@7T``C!V&@^W1"069L'H`H/@/V:)0P8/MT0D%L'@!.L8#[=$)!9F
+MP>@#@^`_9HE#!@^W1"06P>`#@^`_9HE#!$2)YD'_Q$B-5"063(GW0?^6*`,`
+M`+H`````A<`/A(,```!F@7T``C!V)`^W1"069L'H#&8)0P0/MT0D%F;!Z`:#
+MX#]FB4,"#[=$)!;K)0^W1"069L'H#68)0P0/MT0D%F;!Z`>#X#]FB4,"#[=$
+M)!9FT>B#X#]FB0-(BT0D"&;_`$B#PPI!_\=$.WPD$`^,O_[__T'_Q4&#_0(/
+MCMO]__^Z`0```(G02(/$&%M=05Q!74%>05_#05=!5D%505154TB#[!A)B?Y)
+MB?=,C:9D!0``9H$^_S]V"T0/MVXD08/%&NL59H$^`C!V"$&]OP$``.L&0;UO
+M`0``QT0D$`````!F08._!`$````/A*`#``!(8T0D$&9!@[Q'!@$```!U&F9!
+M@3\",'8)08/%".ED`P``08/%!^E;`P``9D&!/P(P#X;#````O0````!$B>Y!
+M_\5(C50D%DR)]T'_EB@#``"Z`````(7`#X1'`P``2&/%#[=4)!:)T6;!Z0AF
+M08D,Q&:!XO\`9D&)5,0(@\4"@_T'?KB]`````$2)[D'_Q4B-5"063(GW0?^6
+M*`,``+H`````A<`/A/H"``!(8]5F#[9$)!>#X#]F08E$U`(/MT0D%F;!Z`Z#
+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
+M!4!V"HG09L'H"V:)0RQ%A>UU06:!._\_#X8D!```#[=4)`Z)T&;!Z`B#X#]F
+MB8-&`0``9L'J`X/B'V:)DTH!``#K$4ECQ6;'A$.\````"@#&0R(/9H$[_S\/
+MAN,#``!!@_T!="-!@_T!?PY%A>T/A-`"``#IR0,``$&#_0(/A*<```#IN@,`
+M`(GN_\5(C50D#DR)YT'_E"0H`P``QT0D"`````"%P`^$U04```^V="0.2(G?
+MZ(G8__]FB8-4`0``#[9T)`](B=_H==C__V:)@U8!``")[DB-5"0.3(GG0?^4
+M)"@#``#'1"0(`````(7`#X2+!0``#[9T)`Y(B=_H/]C__V:)@U@!``!F@3L`
+M0`^&+0,``&8/MD0D#X/@/V:)@\0```#I&`,``(GN_\5(C50D#DR)YT'_E"0H
+M`P``QT0D"`````"%P`^$,P4```^V="0.2(G?Z.?7__]FB8-.`0``#[9T)`](
+MB=_HT]?__V:)@U`!``")[O_%2(U4)`Y,B>=!_Y0D*`,``,=$)`@`````A<`/
+MA.<$```/MT0D#HG"@^)_9HE3$&;!Z`>#X#]FB4,4B>[_Q4B-5"0.3(GG0?^4
+M)"@#``#'1"0(`````(7`#X2J!```#[9T)`Y(B=_H7M?__V:)@U(!``!F@3L`
+M0'809@^V1"0/@^`_9HF#Q@```(GN_\5(C50D#DR)YT'_E"0H`P``QT0D"```
+M``"%P`^$6P0```^W5"0.B=!FP>@%@^`_9HF#2`$``(/B'V:)DTP!``!F@3L!
+M0`^&\@$``(GN_\5(C50D#DR)YT'_E"0H`P``QT0D"`````"%P`^$#00``&8/
+MMD0D#F:)0RIF@3O_3P^&N0$```^W5"0.B=!FP>@(@^!_9HF#U@```&;!Z@]F
+MB9/:````B>[_Q4B-5"0.3(GG0?^4)"@#``#'1"0(`````(7`#X2T`P``#[=$
+M)`Z#X!\!P&8)@]H````/MU0D#HG09L'H!8/@/V:)@^(```!FP>H+B)/=````
+MB>Y(C50D#DR)YT'_E"0H`P``QT0D"`````"%P`^$8@,```^W1"0.@^`'P>`%
+M"(/=````#[=$)`YFP>@#B(/?````Z?X```!F@3L`0`^&\P```(GN_\5(C50D
+M#DR)YT'_E"0H`P``QT0D"`````"%P`^$#@,```^W5"0.B="#X#]FB8/"````
+M9H$[_T\/AK,```")T&;!Z`:#X']FB8/4````B=!FP>@-9HF#V````(GN_\5(
+MC50D#DR)YT'_E"0H`P``QT0D"`````"%P`^$L0(```^W1"0.@^`'P>`#9@F#
+MV`````^W5"0.B=!FP>@#@^`_9HF#X````&;!Z@F(D]P```")[DB-5"0.3(GG
+M0?^4)"@#``#'1"0(`````(7`#X1>`@``#[=$)`Z#X`'!X`<(@]P````/MT0D
+M#F;1Z(B#W@```$'_Q4&#_0(/CA/V__]F@3L",`^'B````$B-5"0.ONP```!,
+MB>=!_Y0D*`,``,=$)`@`````A<`/A`("```/MT0D#HG"@^('9HF3_````&;!
+MZ`.#X`=FB8,``0``2(U4)`Z^[0```$R)YT'_E"0H`P``QT0D"`````"%P`^$
+MO@$```^W1"0.B<*#X@=FB9/^````9L'H`X/@!V:)@P(!``!FQX-@`0``!`!F
+MQX->`0```0!FQX-<`0```0!FQX-:`0````!!BVX40;T`````9H.[!`$```!T
+M4XGN_\5(C50D#DR)YT'_E"0H`P``QT0D"`````"%P`^$0P$``$ECU68/MD0D
+M#V:)A%,&`0``9@^V1"0.9HF$4P@!``!!@\4"#[>#!`$``$$YQ7RM9H$[`E!V
+M=D&]`````$B-5"0.B>Y,B>=!_Y0D*`,``,=$)`@`````A<`/A.4```!)8]4/
+MMT0D#F:)A)..`P``C74%2(U4)`Y,B>=!_Y0D*`,``,=$)`@`````A<`/A+(`
+M``!)8]4/MT0D#F:)A).0`P``_\5!_\5!@_T$?I!F@3L",'<F9L=#7,K_9L=#
+M7O__9L=#8/__=Q)FQT-$#P!FQT-&'`!FQT-('`!F@3O_/W8,2(U4)`Z^R@``
+M`.L*2(U4)`Z^SP```$R)YT'_E"0H`P``QT0D"`````"%P'0V#[=$)`YFB4,8
+M9H-[%@!U'F:!._\_=@L/M\#!Z`N#X`'K"`^W0QAFP>@/9HE#%L=$)`@!````
+MBT0D"$B#Q!!;74%<05U!7L-(@^P82(E<)`A(B6PD$$B)_4B)\^BX\?__N@``
+M``"%P'1)2(G>2(GOZ*C2__^Z`````(7`=#5(B=Y(B>_H!>C__[H`````A<!T
+M(4B)WDB)[^@8Z___N@````"%P'0-2(G>2(GOZ%GM__^)PHG02(M<)`A(BVPD
+M$$B#Q!C#2(/L"&:!/O\_=@QF@WXN`74%Z*_<__](@\0(PP^W!V8[!G45#[=7
+M`H'B\,$```^W1@(E\,$``.L&#[<7#[<&*<*)T,,/MX>X`P``)?^_``##N@``
+M``!(8\)(@SS'`'0&N`````##_\*#^@%^Z;@!````PTB#[`CHR/___XG!9H7`
+M>3%F@>'_?[H`````2,?&`````$ACPDB-!(!F.0R&=`S_PH'Z@@```';IZR>X
+M`0```.LEN@````!(Q\8`````2&/"2,'@!68Y#`9TX/_"@_I*=NRX`````$B#
+MQ`C#4XGSN`$```!FA?9T9NA4____B<%FA<!Y%0^WPXG*@>+_?P``.=`/E,`/
+MML#K168]_P%T!6:%P'4'N`$```#K,[H`````2,?&`````$ACPDB-!(!(P>`"
+M9CL<!G4'9CE,!@)TU?_"@?J"````=MZX`````%O#2(/L&$B)'"1(B6PD"$R)
+M9"002(GU28G4_Y<@`P``B<.H0G0)@WT(`'4#@^.]]L,@=`F#?0P`=0.#X]_V
+MPPAT"8-]!`!U`X/C]_;#`70428U\)"#HIO[__XG:@^+^A<`/1=J)V$B+'"1(
+MBVPD"$R+9"002(/$&,-(@>RH````2(F<)(@```!(B:PDD````$R)I"28````
+M3(FL)*````!(B?U!O0`````/M_[HG@```$B)PTB%P'0H2(GANG__``!(B<9(
+MB>_HM@$``(7`=!%(B>)(B=Y(B>_H)/___T&)Q42)Z$B+G"2(````2(NL))``
+M``!,BZ0DF````$R+K"2@````2('$J````,-32(G[Z-[]__\/M\"#^!)T)(/X
+M$G\&A<!T$.L@/?\!``!T!SU*@P``ZPEF@;NZ`P``2@-U![@!````ZP6X````
+M`%O#B?FZ`````$C'Q@````!(8\)(C02`2,'@`F8Y#`9U!T@%`````,/_PH'Z
+M@@```';>N`````##55-(@^P(Z&/]__^)Q6:%P'D?B>N!X_]_``")W^BI____
+MB=I(A<!U0NL'#[=4`@CK.;H`````2,?!`````$ACPDC!X`5F.2P!=11(Q\(`
+M````9H-\`@@`==&Z2P```/_"@_I*=MBZ`````(G02(/$"%M=PTB#[`A)B?"Z
+M`````$ACPDB)P4C!X0</MX$`````.?AU($V%P'042(VQ`````+J`````3(G'
+MZ`````"X`0```.L,_\*#^C!VQ+@`````2(/$",.Y`````(7_="RZ`````$C'
+MQ@````!(8\)(P>`%#[<$!KD!````.?AT#/_"@_I*=N6Y`````(G(PT%7059!
+M54%455-(@^P82(E\)!!)B?5)B<]!B=1!O@````!(QT0D"`````!(QP0D````
+M`&:#/@!U+^@S_/__B<-FA<!X(P^WZ+X`````B>_H(O___X7`=0N)[^AI____
+MA<!T!0^W^^L%00^W?0)F]\<`_P^%^0```+D`````O@````!)Q\``````2&/!
+M2(G"2,'B!4$/MP00.?AU$4B!P@````!(B50D"+X!````_\&#^4IW!H7V=-'K
+M#;@`````A?8/A.4```!%A.1X#4B+1"0(#[=X`D2+<`A%A.1Y#4B+5"0(#[=Z
+M!$2+<@RY`````+X`````2<?``````$ACP4B-!,!(C12%`````$$/MP00.?AU
+M(DB+7"00BX.(`P``03M$$`1U$$B!P@````!(B10DO@$```#_P8/Y`7<&A?9T
+MN^L$A?9T*D6$Y'@02(L4)(M""$DAQHM"#$D)QD6$Y'D02(L<)(M#$$DAQHM#
+M%$D)QDR)_NC]_?__B<:X`````(7V="A)BT<02(M4)`A((T(028E'$&9!]T4"
+M`/]U"4V%]G0$18EW&+@!````2(/$&%M=05Q!74%>05_#C4<_@___#T_'P?@&
+MB<+!X@:)^2G1N@$```!(T^)(F$@C%,9(A=(/E<`/ML##A,ET*K@`````.?!S
+M%DQCP$$X##AT&$&`/#@`=`;_P#GP<NHY\'0'2)B(##C_`I##2('LZ`$``$B)
+MG"2X`0``2(FL),`!``!,B:0DR`$``$R)K"30`0``3(FT)-@!``!,B;PDX`$`
+M`$B)^TF)]D&)UTB)3"1@3(E$)%A$B4PD5(NL)/@!``"+A"0``@``9HE$)%)F
+MQT0D2E@;3(VGX`,``$&]`````.@-^O__N@````"%P`^$9P8``$B)W^A;_/__
+M9HF#N@,``&:%P'4E#[?U2(G?Z$SZ__^Z`````(7`#X0[!@``B>AF)?\_9HF#
+MN@,``$B)W^CW"@``#[>[N@,``.C@^___2(G%N@````!(A<`/A`D&``!(C8PD
+M,`$``+I__P``2(G&2(G?Z.K\__^Z`````(7`#X3D!0``2(V,)+````"Z@```
+M`$B)[DB)W^C%_/__N@````"%P`^$OP4``/:$)#@!```%N`$```!$#T7H]H0D
+M.`$```*X`@```$0/1>A$.ZN\`P``=`=$B:N\`P``2(V4)#`!``!(B>Y(B=_H
+M\_G__XE$)$R#O"0(`@```'4)#[=M$&:);"1*QT0D1`````!!@_]!N$````!$
+M#T/X#[:#D@,``(G"P.H%B=&#X0&)3"0TP.@&B<*#X@&)5"0X2,?%`````$B!
+M_0`````/@S,$```/MT0D4F8C10!FA<`/A!`$```/MT4`A40D3`^$`@0```^W
+M=0)(C4PD;DB-5"1L2(G?_Y,8`P``A<`/A.,#```/MT4`@_@$#X29````@_@$
+M?P^#^`%T8X/X`G0OZ<(#``"#^"`/A-L```"#^"!_#H/X"`^$G0```.FF`P``
+M@_A`#X3O````Z9@#``!(C8PD,`$``$B)3"0@2(/!,$B)3"0H2,=$)!``````
+M#[:$)#(!``"#R`/IA0```$B-E"0P`0``2(E4)"!(@\(@2(E4)"A(QT0D$```
+M```/MHPD,@$``.F)````2(V$)+````!(B40D($B#P%!(B40D*$C'1"00````
+M``^VE"2R````@\H!Z8H```!(C8PDL````$B)3"0@2(/!8$B)3"0H2,=$)!``
+M````#[:$)+(```"#R`*(1"0_ZUY(C90DL````$B)5"0@2(/"<$B)5"0H2,=$
+M)!``````#[:,)+(```"#R02(3"0_ZRY(C80D,`$``$B)1"0@2(/`0$B)1"0H
+M2,=$)!``````#[:4)#(!``"#R@2(5"0_2(M\)"CHY/;__X7`#X5N`@``QT0D
+M0`````!(BW0D*(M\)$#H`_S__X7`#X1!`@``2&-$)$!(P>`%2`-$)!!(B40D
+M&`^V2!A(BY0D\`$``(MT)%1(BWPD6.C[^___2(M,)!A$#[<I9D0[:0(/AP`"
+M```/MT0D2H/`"HE$)`QF1#EL)&P/A]`!``!F1#ML)&X/A\0!``!(BT0D&(!X
+M!@IU"X-\)#0`#X2N`0``2(M4)!B`>@8%=0N#?"0X``^$F`$``$$/M\5(BTPD
+M&`^V40<!T-'X.T0D#`^/?0$``$0Y?"1$#X.J`0``2(-Y$`!Y#H.\)!`"````
+M#X1=`0``2(M$)""`>!@`>0V#NXP#```&#X1%`0``OD````!(C7PD<.@`````
+M9D2);"1P#[=%`F:)1"1R2(M,)!@/ME$&@_H%=`^#^@IU$8#,0&:)1"1RZP=F
+M@4PD<@"`2(M4)!@/MD($B$0D=0^V0@6(A"2*````2(M,)""+01B)A"2,````
+M#[9$)#^)A"20````2(M"$$@C01`/MTPD<H#-`@^W5"1R@.;]2(7`#T719HE4
+M)')(BU0D&$B+0@A(BTPD($@C00A(A<`/E<`!P(A$)'1(BT((2"-!"*@"=`6`
+M3"1T"$B+1"0@]D`80'0%@$PD=`1(8U0D1$C!X@9(BT0D<$F)!!1(BT0D>$F)
+M1!0(2(N$)(````!)B404$$B+A"2(````28E$%!A(BX0DD````$F)1!0@2(N$
+M))@```!)B404*$B+A"2@````28E$%#!(BX0DJ````$F)1!0X_T0D1$B+5"08
+M9@^V0@=!`<5F1#MJ`@^&#/[___]$)$"#?"1`?P^.FOW__TB#Q01(@?T`````
+M#X+-^___@WPD1``/A+T```"#?"1$0;A`````#T)$)$2)1"1$2,?!`````+I`
+M````B<9,B>?HZ0(``(M,)$2)B^`3``"^`````#G.?3Y(8\Y(B<I(P>(&00^W
+M!!1F08D$SD$/MT04`F9!B43.`D$/MD04!$&(1,X$00^V1!0%08A$S@7_QCMT
+M)$1\PHM4)$1,B?9(B=__DV`#``"^`````#MT)$1]*$ACQDB)P4C!X09!#[94
+MQ@9!B%0,!D$/MD3&!T&(1`P'_\8[="1$?-B+5"1$2(M$)&")$`^W@[H#``!F
+MB4,HA=(/E<`/MM")T$B+G"2X`0``2(NL),`!``!,BZ0DR`$``$R+K"30`0``
+M3(NT)-@!``!,B[PDX`$``$B!Q.@!``##4T0/MT8"08'@\,$``$B+C^@3``!(
+MA<ET*`^W`68[!G4@#[=1`HG0)?#!``!$.<!U$/9!!`%T6+@`````]L("ZTQ,
+MC8_@`P``BY?@$P``A=)T8`^W-HG0T?A(F$C!X`9*C0P(#[<!B?,IPXG8=38/
+MMWD"B?@E\,$``$0YP'46]D$$`70+N`````!`]L<"=2A(B<CK(P^W00(E\,$`
+M`$2)PRG#B=B%P'X&3(U)0/_*T?IUH[@`````6\-3B=/H`````+H`````2(7`
+M=!4/OD`:`<`HPP^^TX3;N``````/2-")T%O#2(/L&$B)'"1(B6PD"$R)9"00
+M2(G[2(GU0;S_````9H._N@,```!U?^@?\O__B<*)T"7P````@_A@=`=F@?J9
+M`75E#[=%`B6@````0;SA````/:`````/A((````/MT4")=````!!O.(````]
+MP````'1L#[=%`B70````0;SD````/=````!T5@^W10(E4`$``#U0`0``#Y3`
+M1`^VX$>-I&3@````ZS=(B>Y(B=_H`````$B%P'0G1(M@(`^W10(EP````#W`
+M````=1-$B>"#X`^#^`%U"$&#Y/!!@\P"1(G@2(L<)$B+;"0(3(MD)!!(@\08
+MPTB#[`CH`````+H`````2(7`=`N+0!S!Z`*)PH/B`8G02(/$",-!5T%6055!
+M5%532(/L&(ET)!1!B=9(B4PD"$F)_8G03(T\./],)!1T3TB)!"1,B?U-.>]V
+M.46)]$B)ZTPIXTB)[DB)W_]4)`B%P'XB2(GI1(GV#[83#[8!B`-(_\.($4C_
+MP?_.=>Q,*>5,.>UWRDP#/"3_3"04=;5(@\086UU!7$%=05Y!7\-(@^P82(E<
+M)`A(B6PD$$B)^TB)_4B-5"0&OL$```#_ER@#``"Z`````(7`=%9F@7PD!O\_
+M=@>^R@```.L%OL\```!(C50D!$B)[_^5*`,``+H`````A<!T*F:!?"0&_S]V
+M#0^W1"0$P>@+@^`!ZP@/OT0D!,'H'XF#]!,``(N3]!,``(G02(M<)`A(BVPD
+M$$B#Q!C#4TB)^^@/\/__#[?`@_A(=%6#^$A_%8/X07\+@_A`?4:%P'0FZTJ#
+M^$/K.3V-@0``?Q$]B($``'TM@^A*@_@"=R_K(SV/@0``ZQH/MX.Z`P``/8@!
+M``!\&#V-`0``?@<]CP$``'4*2(G?Z/[^___K!;@`````6\-!5%532(/L$$F)
+M_(GS2(G]2(U4)`Z^P0```/^7*`,``(7`=%>Z`````$C'P0````!(8\)(C01`
+M2`'`9CD<`74T9H%\)`X"4'<'#[=$`0+K#$ACPDB-!$`/MT1!!&:)A;@#``!,
+MB>?HR/'__V:)A;H#``#K!__"@_H-=K5(@\006UU!7,-!5%532(/L$$F)_(GS
+M2(G]2(U4)`Z^P0```/^7*`,``(7`=%>Z`````$C'P0````!(8\)(C01`2`'`
+M9CD<`74T9H%\)`X"4'<'#[=$`0+K#$ACPDB-!$`/MT1!!&:)A;@#``!,B>?H
+M1/'__V:)A;H#``#K!__"@_H&=K5(@\006UU!7,-(@^P82(E<)`A(B6PD$$B)
+M^^AK_O__A<!T,_:#E`,```%T*F:#N[@#````=!$/M[.X`P``2(G?Z+S^___K
+M#P^WL[H#``!(B=_H+____TB+7"0(2(ML)!!(@\08PY!!5T%6055!5%532('L
+MJ````$F)]DF)UTB)3"003(E$)`B)_;_`%0``Z`````!(B<-!O0(```!(A<`/
+MA+P%``!)B<2Z*!0``$C'Q@````!(B<?H`````$R)<Q!,B7L82(M$)!!(B4,@
+M9HFK>`,``&;'@WH#`````&;'@ZP#```\`,>#L`,```````#'@^P4```#````
+MQX.L%0```````,>#L!4````'``#'@[05``#_____QX.X%0``_____\>#O!4`
+M`/____^^`````$B)W^@`````0;T#````A<`/A!H%``#'@WP#```!````2(M#
+M((N0($```&8/MM)FB9.``P``BY`8F```9HF3@@,``&;'@X8#`````,>`T)@`
+M`!8<``"]`````$F+1"0@QX"`F``````!`/_%@_T#=NI)BT0D((NX`)P``,'O
+M'+X$````Z`````#_P&9!B80DA`,``$F+5"0@1(NR$$```$2)\(/(`8F"$$``
+M`$B-5"0>OCT```!,B>?H`````$&]"````(7`#X19!```9H%\)!ZE6G0+0;T$
+M````Z44$``!(C50D'KX_````3(GGZ`````!!O0@```"%P`^$)00```^W1"0>
+M9HF#*A0``$B-5"0>OL$```!,B>?H`````$&]"````(7`#X3Y`P``#[=$)!YF
+MP>@,9HF#*!0``$&]!0```&:#^`$/A=D#``!!OP````"]`````$R-;"0@B>I)
+MC515`(VUP````$R)Y^@`````A<`/A*8#``")Z`^W1$0@03''_\6#_3]VTD&]
+M!P```$&!____```/A8@#``!(C50D'KZ_````3(GGZ`````!!O0@```"%P`^$
+M:`,``&8/MD0D'F9!B80DN`,``(M$)"1FB8,L%```#[=$)"9FB8,N%```#[9$
+M)"B(@S`4``!F#[9$)"F(@S$4```/MD0D*HB#,Q0``&8/MD0D*XB#,A0``&8/
+MMD0D+8B#-A0```^V1"0LB(,W%```9@^V1"0OB(,X%```#[9$)"Z(@SD4```/
+MMD0D,(/@`8B#-!0``(M$)#!FT>B#X`>(@S44``!)QX0D:`,```````"]````
+M`+\)````B>A(C13%`````$@IPDB-%)!(C10:2(VR.A0``(GY#[=$3"!FP>@*
+MB((Z%```#[=$3"!FP>@$@^`_B$8+#[=43"#!X@*#XCR-3P$/MT1,(&;!Z`X)
+MPHA6`0^V1$PA@^`_B$8,#[=$3"!FP>@"@^`_B$8"#[=43"#!X@2#XC"-3P(/
+MMT1,(&;!Z`P)PHA6#0^W1$P@9L'H!H/@/XA&`P^V1$P@@^`_B$8.C5<##[=$
+M5"!FP>@*B$8$#[=$5"!FP>@$@^`_B$8/#[=45"#!X@*#XCR-3P0/MT1,(&;!
+MZ`X)PHA6!0^V1$PA@^`_B$80#[=$3"!FP>@"@^`_B$8&#[=43"#!X@2#XC"-
+M3P4/MT1,(&;!Z`P)PHA6$0^W1$P@9L'H!H/@/XA&!P^V1$P@@^`_B$82C5<&
+M#[=$5"!FP>@*B$8(#[=$5"!FP>@$@^`_B$83#[=45"#!X@*#XCR-3P</MT1,
+M(&;!Z`X)PHA6"0^V1$PA@^`_B$84#[=$3"!FP>@"@^`_B$8*#[=43"#!X@2#
+MXC"-3P@/MT1,(&;!Z`P)PHA6%0^W1$P@9L'H!H/@/XA&%@^V1$P@@^`_B$87
+MC5<)#[=$5"!FP>@*B$88#[=$5"!FP>@$@^`_B$89#[=45"#!X@*#XCR-3PH/
+MMT1,(&;!Z`X)PHA6&@^V1$PA@^`_B$8;#[=$3"!FP>@"@^`_B$8<_\6#QPN#
+M_00/AN+]__],B>?H_0```$&_`````+T`````0;T?````1(GN*>Y(C50D'DR)
+MY^@`````A<!T5P^W1"0>00''C50M`(G19@^V1"0?B(0+RQ0``/_"#[9$)!Z(
+MA!/+%```_\6#_0)VND6%_W0)08'__?\"`'4(0;T)````ZQ])BT0D($2)L!!`
+M``!,B>#K/$&]"````.L20;T(````28M$)"!$B;`00```2(7;=`A(B=_H````
+M`$B#?"0(`'0(2(M$)`A$B2BX`````$B!Q*@```!;74%<05U!7D%?PTB#[`CH
+M`````$B#Q`C#N`````#WQ@`!``!T#V;'`@`49L<!-A6X`0```,.X`0```,-(
+MC9>0`P``@TH$`6;'0@P`%&;'0@XV%8"/D`,```(/MD("9L=""`,`9L=""D``
+M@^">B$("@+\T%````'079L>'`!0`````QX<$%````0```(!*`H#'0A0/````
+MQX<@%````0```+@!````PY!(BU<@BT8$B8(L@```2(M7((M&#(F",(```$B+
+M5R"+1A")@C2```!(BU<@BT8(B8(X@```2(M7((L&B8(D@```PTB#["B)="0$
+M@[^,`P```70DB?`K!0````#!X`.)1"0,B?`K!0````#!X`.)1"00B70D".L8
+MQT0D#/_____'1"00_____\=$)`@!````B=`E__^``8D$)$B)YN@`````2(/$
+M*,-(BT<@QX`L@````````$B+5R"+@@2````-```0`"7__U__B8($@```2(M'
+M(,>`)(```/__``##28GX9H-^$@!T2$B+5R"+@@2````E__]__PT``"``B8($
+M@```2(M7(`^W1A")@BB```!(BU<@#[=&$HF"2(```$B+5R"+1A3!X`.)@C2`
+M``#K%4B+5R"+@@2````E__]?_XF"!(```$B+5R"+!HF"+(```$B+3R"+@22`
+M```E``"`_P^W5@@)PF:#?A@`=!$/MT88@\`$P>`0)0``?P`)PHF1)(```&:#
+MOX`#```#=CD/MT8:J`=T,4&+D+`5``"`YOAF@WX:!W<,P>`()0`'```)PNL#
+M@,X'08F0L!4``$B+1R")D!B```"0PY!(BT<@BX`(0```A<`/E<`/ML##2(M'
+M((M0'(/Z_W4,QP8`````N`````##B=`CA]04```ENM@%`8D&]\(@`'``=`<-
+M````0(D&]L(%=`.##@'WPL`%``!T`X,.0/9&`T!T!HF7"!0``+@!````PXN'
+MU!0``,-(B?E$BX?4%```187`>0M(BT<@QT`D`````(GR@>*ZV`4!B="#R`5`
+M]L8!#T700/;&0'0P@[G8%````'0#@\I`@[G<%````'0#@,X!@[G@%````'0#
+M@,J`@[GD%````'0#@,X$2(M'((E0((FQU!0``(7V>0M(BT<@QT`D`0```$2)
+MP,.0D)"X0````,.)\&:#_C]W'DC!X`4EX/\?`$B+5R"+A!`<D```N@$```!F
+MA<!X!;H`````B=##B?*X`````&:#_C\/AX<```!(P>(%@>+@_Q\`2(M'(,>$
+M`@"0````````2(M'(,>$`@20````````2(M'(,>$`@B0````````2(M'(,>$
+M`@R0````````2(M'(,>$`A"0````````2(M'(,>$`A20````````2(M'(,>$
+M`AB0````````2(M'(,>$`AR0````````N`$```##N`````!F@_X_=WM(A=)T
+M/40/MD(%0<'@"`^V0@1!"<`/MDH#P>$8#[9"`L'@$`G!#[9"`<'@"`G!#[8"
+M"<'1Z42)P,'@'PG!0='HZPM!N`````"Y`````$B)\DC!X@6!XN#_'P!(BT<@
+MB8P"&)```$B+3R!$B<"`S(")A`H<D```N`$```##2(/L*$B)7"0(2(EL)!!,
+MB60D&$R);"0@28G128G,187`N@````"XJJJJJHG!#T3*N`````!F@_X_#X=2
+M`0``08`Y`'4(9D&#>0($=PJX`````.DZ`0``9D&#>0(%=PA!O0````#K%F9!
+M@WD"#7<(0;T!````ZP9!O0,```!%#[99!$$/MD$%P>`(00G#00^V00;!X!!!
+M"<-!#[9!!\'@&$$)PT$QRT$/MD$)P>`(00^V40B)U0G%,<V!Y?__``!%#[91
+M"D$/MD$+P>`(00G"00^V00S!X!!!"<)!#[9!#<'@&$$)PD$QRD$/MD$/P>`(
+M00^V40Z)TPG#,<N!X___``!%#[9!$$$/MD$1P>`(00G`00^V01+!X!!!"<!!
+M#[9!$\'@&$$)P$$QR&9!@WD"#7<'08'@_P````^W]HGPP>`%2)A(BU<@1(F<
+M$`"0``!(BU<@B:P0!)```$B+5R!$B900")```$B+5R")G!`,D```2(M7($2)
+MA!`0D```2(M7($2)K!`4D```3(GBZ`````!(BUPD"$B+;"003(MD)!A,BVPD
+M($B#Q"C#D)!(@^P(2(GP2(VWRQ0``+H&````2(G'Z`````!(@\0(PTB#[`A(
+M@<?+%```N@8```#H`````+@!````2(/$",-(@^P(2(GWN@8```!(Q\8`````
+MZ`````!(@\0(P[@`````PTB#[!A(B5PD"$B);"002(G[2(G5C32U`&```$B+
+M1R"+!`:Y`@```+H#````O@!L``#H`````+H`````A<!T$TB+0R"+@`!H``!F
+MB44`N@$```")T$B+7"0(2(ML)!!(@\08PV8YM[@#``!U![@,````ZQ2`ORH4
+M````#YC`#[;`C03%`P```$B%TG0"B0*X`````,.X`0```,-(@^P82(D<)$R)
+M9"0(3(EL)!!)B?T/MY\`%```08G<08/D'$'!_`*#XP+1^T2)YN@`````.=@/
+ME,(/MM)$B>9,B>_H`````$B+'"1,BV0D"$R+;"002(/$&,-(BW\@C0PVN@,`
+M``#3XO?2BX<40```(<*X`@```-/@"<*)EQ1```"X`0```,-(BW\@C0PVN`,`
+M``#3X/?0BY<40```(=")AQ1```"X`0```,-(BW\@1(N'&$```+C^____B?'3
+MP$$AP(/B`=/B00G01(F'&$```+@!````PXGQN/____^#_@5W$DB+1R"+@!Q`
+M``"#X"_3Z(/@`<-(@^P(2(M'($2+B!1```!!B?!!P>`,`?:X`P```(GQT^!$
+M"<`-`(`!`/?002'!10G!08')`(```$2)R`T```$`A=)$#T7(2(M'($2)B!1`
+M``"+M]04``"!S@````'H`````$B#Q`C#2(M'((N0$$```(7V=`>#_@1T!^L-
+M@^*?ZPZ#XM^#RD#K!H/*((/BOTB+1R")D!!```##2(M'((N`!(```*D``(``
+M#Y7`#[;`_\##2(M'((N`!(```*D``(``=`>#_@)U!Y##@_X!=`](BU<@#0``
+M@`")@@2```"0P[@`````PX7V#Y3`#[;`PU532(/L"$B)^XG52(V_\!0``+H&
+M````Z`````!(BTL@#[:3\!0```^V@_$4``#!X`@)P@^V@_(4``#!X!`)P@^V
+M@_,4``#!X!@)PHF1"(```$B+2R`/MH/U%```P>`(#[:3]!0```G"B>@E_S\`
+M`,'@$`G"B9$,@```9H7M=1%(BU,@BX($@```#0``$`#K#TB+4R"+@@2````E
+M___O_XF"!(```$B#Q`A;7<-(BU<@B[)L@```BX)P@```BY)L@```C4@!.?(/
+M0L%(P>`@B=)("=##2(M'((N`;(```,-(BU<@BX(D@```#0````&)@B2```##
+M2(M'((N`9)@``(G!P>D3@>'_`0``]L4!=`:!\0#^__](BU<@BX)P@```BY)L
+M@```,=`QR,,/MY>``P``2(M'((N`($```"7_````.<(/E,`/MM")T,-(BT<@
+MBX"8@````09(BT<@BX"4@````48$2(M'((N`G(````%&#$B+1R"+@)"````!
+M1@A(BT<@BX"@@````480PTB#[!A(B1PD2(EL)`A,B60D$$B)_8GS28G\@_X(
+M=@Z^__\``.@`````.<-V$T''A"2T%0``_____[@`````ZQ^)WDB)[^@`````
+M2(M5((F"$(```(F=M!4``+@!````2(L<)$B+;"0(3(MD)!!(@\08PTB#[`A(
+MBT<@B[`0@```@>;__P``Z`````!(@\0(PTB#["A(B1PD2(EL)`A,B60D$$R)
+M;"083(ET)"!(B?U!B?:^_Q\``.@`````03G&=A''A;@5``#_____N`````#K
+M.$R+92!!BYPD%(```('C`.#__T2)]DB)[^@`````)?\?```)PT&)G"04@```
+M1(FUN!4``+@!````2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-(@^P(
+M2(M'((NP%(```('F_Q\``.@`````2(/$",,/MH>O%0``@_`!@^`!PX7V="%(
+MBU<@BX($@```)?____Z)@@2```"!IZP5``#____^ZQ](BU<@BX($@```#0``
+M``&)@@2```"!CZP5```````!N`$```##2(/L*$B)'"1(B6PD"$R)9"003(EL
+M)!A,B70D($B)_4&)]K[_'P``Z`````!!.<9V$<>%O!4``/____^X`````.L[
+M3(ME($&+G"04@```@>/__P#@1(GV2(GOZ`````#!X!`E``#_'PG#08F<)!2`
+M``!$B;6\%0``N`$```!(BQPD2(ML)`A,BV0D$$R+;"083(MT)"!(@\0HPTB#
+M[`A(BT<@B[`4@```@>8``/\?P>X0Z`````!(@\0(P[@!````P\.X`````,/#
+MPTB#[`B#_@%U$872N@T```"X``````]%PNL%Z`````!(@\0(PTB#[`B#_@MT
+M#+@`````@_X>="/K'(G*@^(&B9>H`P``2(M'((F0:(```+@!````ZP7H````
+M`$B#Q`C#2(/L".@`````2(/$",.0D)!(BU<@BX($@```#0``!`")@@2```"%
+M]G052(M7((N"!$```"7___S_B8($0```PU532(/L"$B)^X7V=&5(BU<@BX($
+M0```)?___/^)@@1```"_T`<``.@`````O0H```!(BT,@BX`00```J0```0!T
+M);_(````Z`````!(BU,@BX($0```)?___/^)@@1```#_S77,ZP2%[74'N```
+M``#K&DB+4R"+@@2````E___[_XF"!(```+@!````2(/$"%M=PTB+5R"+@@2`
+M```-```$`(F"!(```(7V=!5(BU<@BX($0```)?___/^)@@1```##2(/L&$B)
+M'"1(B6PD"$R)9"00B?-(B?U!O`$```"#_@%T&(/^`7('@_X"=!?K'HG6Z`G_
+M__]!B<3K&8G6Z)#____K$(G6Z,7^___K![@`````ZPF)G>P4``!$B>!(BQPD
+M2(ML)`A,BV0D$$B#Q!C#2(M'((N`!$```"4```,`P>@0PY!3@_X!=`Y(Q\,`
+M````@_X"=!+K"4C'PP````#K![@`````ZPM(B=[H`````$B)V%O#D)"02(M'
+M((M`#,-(BT<@B7`,PTB+1R#'0`@$````PU532(/L"$B)_4B+1R#'0`@@````
+MNP````!(BT4@BT`(N@$```"H!'09OPH```#H`````/_#@?OG`P``?MRZ````
+M`(G02(/$"%M=PTB+5R"+@FB```"#X+^)@FB```##2(M7((N":(```(/(0(F"
+M:(```,-(BT<@B;!0@```2(M'((F05(```,.X`````(/^/W='@_X?=B!(BU<@
+M1(N"5(```(U.X+C^____T\!$(<")@E2```#K'4B+5R!$BX)0@```N/[___^)
+M\=/`1"'`B8)0@```N`$```##N`````"#_C]W1X/^'W8@2(M7($2+@E2```"-
+M3N"X`0```-/@1`G`B8)4@```ZQU(BT<@1(N`4(```+H!````B?'3XD0)PHF0
+M4(```+@!````PTB+1R"+@$R```##]\8``@``=`F!YO_]__^#SB!(BT<@B;!,
+M@```P\=&"`````")T"7_#P``B48,.=!T!K@`````P_;!('0'@4X,`"```,=&
+M%`````#'1A``````N`$```##]D84`74*N0\```#I"P$``/9!%`%U%$B+1R"+
+M0`RY#P```#G0#X3Q````#[=&$&8E_P]F08D!BTX4@>$`@/\/P>D/2(M'((N`
+M;(```(G"P>H*@>+__P``B=`E_Q\``#G(<P^-@@#@__\E__\```G!ZP()T8G(
+M9B7_?V9!B4$"0<9!!`"+1A2H`G4YJ`1T!T'&000!ZR[V1A00=`=!@$D$".LA
+M]D84"'0'08!)!`3K%$&`200"BT84)>````#!Z`5!B$$%BT80)0``^`?!Z!-!
+MB$$&BT84]L0!=`XE`'X``,'H"4&(00?K!4'&00?_BT80)0"`!P#!Z`]!B$$(
+MBT80P>@.@^`!08A!"8M&$,'H#(/@`4&(00JY`````(G(PT%7059!54%455-(
+M@^P(2(G[08GV28G5B4PD!$V)QTF)_/9"`P%T,TB)UN@`````2(G%N@P```!(
+MA<`/A)D%``!!@_X&=!Y!@_X&=PA!@_X!=PCK$$&#_@AT"KH,````Z74%``!(
+MBT,@BX`00```@^!@B00D3(GN2(G?Z`````"Z`P```(7`#X1-!0``2(M+($$/
+MMI0DRQ0``$$/MH0DS!0``,'@"`G"00^VA"3-%```P>`0"<)!#[:$),X4``#!
+MX!@)PHF1`(```$B+2R!!#[:4)-`4``#!X@A!#[:$),\4```)T(F!!(```$2)
+M]DB)W^@!!0``08/^`70A08/^`7(.08/^!G0P08/^"'0JZT%(BT,@QT`H`0``
+M`.L+2(M#(,=`*`````!(BT,@QX`00```)!```.L92(M#(,=`*`````!(BT,@
+MQX`00```0!```$B+4R"+@A!````+!"2)@A!```!(BTL@00^VE"3P%```00^V
+MA"3Q%```P>`("<)!#[:$)/(4``#!X!`)PD$/MH0D\Q0``,'@&`G"B9$(@```
+M2(M+($$/MI0D]10``,'B"$$/MH0D]!0```G0B8$,@```2(M#(,<``````$B+
+M0R#'0`0`````2(M#(,=`#`````!(BT,@BU`<QT`@`````$B+0R#'0"0`````
+M0<>$)-04````````2(M#((M0+,=`,`4```!(BT,@QT`T!0```$B+0R#'0$0(
+M````2(M#(,=`2`@```!(BT,@QT!0`````$B+0R#'0$P`````2(M#(,>`#$``
+M``````!(BT,@QT!``````$B+4R!!BX0DL!4``(F"&(```$B+0R#'@$B`````
+M````O@````!(B=_H`````$B+0R#'@%"`````````2(M#(,>`5(````````!(
+MBT,@QX!8@````````$B+0R#'@%R`````````2(M#(,>`8(````$```!(BT,@
+MQX!D@````0```$B+0R#'@&B`````````2(M#(,>`*(````````!(BT,@QX`L
+M@````````$B+0R#'@&R`````````2(M#(,>`,(```/____](BT,@QX`T@```
+M_____TB+0R#'@#B````!````O@````!(Q\<`````2&/&BQ3'@WPD!`!T#8V"
+M`(#__SW_#P``=A")T4B+4R!(8\:+1,<$B001_\:!_J8```!VS$R)[DB)W^@`
+M````N@,```"%P`^$.@(``$B+2R"+D2B8```P]D$/MH0D,10``,'@"`G"B9$H
+MF```2(MS($$/MI0D,A0``(G0P>`8P>(0"=!!#[:,)#,4``")RL'B"`G0"<B)
+MAC28``!(BTL@BY%$F```@>)_P/__00^WA"0L%```9M'H)8`_```)PHF11)@`
+M`$B+2R"+D4B8``"!XO\/_/]!#[>$)"P4``#!X`HE`/`#``G"B9%(F```2(M+
+M((N19)@``('B_P_X_T$/MH0D,!0``,'@#"4`\`<`"<*)D628``!(BTL@BY$0
+MF0``@^+\00^WA"0L%```@^`#"<*)D1"9``!(B>Y(B=_H-`T``+H#````A<`/
+MA#<!``"#?"0$`'0;]D4$`G4$@&4$_@^W10)F08E%`@^V101!B$4$2(M#(,>`
+M')@```$```"_Z`,``.@`````2(M3((N"8)@``(/(`8F"8)@``+D`````N@$`
+M``"^8)@``$B)W^@`````2(GN2(G?Z`````"]`````(7`=1!F08--`@*Z`P``
+M`.FO````B>Y(B=_H`````/_%@_T"?N^#NP04````=`A(B=_H`````$B+4R"+
+M@B2````E__]__HF")(```$&#O"2T%0``_W0008NT)+05``!(B=_H`````$&#
+MO"2X%0``_W0008NT)+@5``!(B=_H`````$&#O"2\%0``_W0008NT)+P5``!(
+MB=_H`````(.[J`,```!T$$B+4R"+@Z@#``")@FB```!$B;.,`P``N`$```#K
+M#D&#/P!T`T&)%[@`````2(/$"%M=05Q!74%>05_#2(M'((N`!(```"7__P``
+M@_X!=#Z#_@%_!H7V=!^0PX/^!G0'@_X(=#J0PTB+5R`+AZP5```-``!1`.L/
+M2(M7(`N'K!4```T``%(`B8($@```PTB+5R`+AZP5```-```4`.OH2(M7(`N'
+MK!4```T``!``Z]=(@^P(B[>,`P``Z'W___](@\0(PTB#[`BZ"@```+X(````
+MZ&@#``!(@\0(PU-(B?NZ`0```+X`````Z`````"Z`````(7`=$:Z($X``+X/
+M````2(G?Z#4#``"Z`````(7`="N_Z`,``.@`````NB!.``"^'P```$B)W^@0
+M`P``OS0(``#H`````+H!````B=!;PTB#[!A(B5PD"$B);"002(G]2(GSN@$`
+M``"^`````.@`````N@````"%P`^$F0```$B+32"Z`````$B%VW0,]D,"$+@!
+M````#T70B9$$F```NB!.``"^#P```$B)[^B;`@``N@````"%P'1>O^@#``#H
+M`````+H@3@``OA\```!(B>_H=@(``+H`````A<!T.;\T"```Z`````"Z`0``
+M`+X`````2(GOZ`````"Z`````(7`=!2Z"@```+X`````2(GOZ#8"``")PHG0
+M2(M<)`A(BVPD$$B#Q!C#05=!5D%505154TB#[!A(B?U)B?=(B50D$.@`````
+M28G&N@````!(A<`/A.,!``!(BU4@BX)H@```@\A@B8)H@```2(M5($2+JB2`
+M``!$B>@E__]__XF")(```+^@#P``Z`````!(BU4@BX((F```#0````B)@@B8
+M``"_"@```.@`````3(GV2(GOZ&0)``"Z`````(7`#X1V`0``O^@#``#H````
+M`$B+52"+@@B8```E____]XF"")@``$B+12"+F%B8``!$BZ!<F```BY!HF```
+MB50D#(G:@<H``/P#B9!8F```2(M5($2)X"5_`,#_#8#`/P")@ER8``!(BU4@
+MBT0D#"4?`/[_#8`1``")@FB8``"_%````.@`````2(M5((N"")@```T````(
+MB8((F```OPH```#H`````$B+12#'@-28```A````2(M5((N"")@``"7____W
+MB8((F```O^@#``#H`````$B+52"+@F"8``"#R`&)@F"8``"Y`````+H!````
+MOF"8``!(B>_H`````$B+12")F%B8``!(BT4@1(F@7)@``$B+12"+5"0,B9!H
+MF```3(GV2(GOZ`````"%P'4?OX@3``#H`````$R)]DB)[^@`````A<!U!F9!
+M@T\"`DB+12"+D&B```"#XI^)D&B```!(BT4@1(FH)(```$B+1"00QP`!````
+MN@$```")T$B#Q!A;74%<05U!7D%?PTB#[!A(B1PD2(EL)`A,B60D$$F)_(GS
+MB=>%]KC_____B<4/1>Y)BT0D((FP`$```.@`````@^,/B>J#X@^)V;X`0```
+M3(GGZ`````")PO;#!'4,28M$)"#'0!0`````B=!(BQPD2(ML)`A,BV0D$$B#
+MQ!C#OP````"Y"@````^VPD2-2`&-1`D#.,)U"TACP8`\,#]U>>M0C40)`P^V
+MP$$YP75+A<E^1TQCP4&`/#`_=#:-0?](8_B`/#<_="I!#[8$,`^V%#<IT&G`
+M7@$```7G`P``2&G`TTUB$$C!Z"#!Z`8!T`^VP,._`0```.L.@_\!=0E(8\&`
+M/#`_=1+_R7F$N0````!(8\&`/#`_=`4/M@0PP__!@_D*?NNX`0```,-328G*
+M0;G_____18G+OP````!(8\^`/#$_=#(Z%#%T73H4,78#08GY3&/'03H4,',<
+M08G[08/Y_W4<0XU$&P-!B`)!#[9$,`OIE@```/_'@_\*?K[K!8/_"GXPN#\`
+M``!!@_G_='V#_PI^($.-1`D#08@"26/!#[9$,`OK9HU$/P-!B`(/MD0Q"^M8
+M0XU$"P-!B`(/MOI)8\D/MA0Q*==I_^@#``!-8\M%#[8$,4$IT(GXF4'W^(G'
+M00^V1#$+#[94,0LIT`^O^(V'YP,``$AIP---8A!(P>@@P>@&`D0Q"P^VP%O#
+M@_X]N#P````/0_!FB;>L`P``N`$```##05=!5D%505154TB#[`A(B?M(B?=(
+MB=5(B=X/MX,N%```9L'H!(/@!XA"#P^V@RX4``"#X`>(0A`/MP=F+3(4N@``
+M``!F/98`#X>)`@``N0````")R&8/MH0&-A0``&8Y@[@#``!T!__!@_D#=N6Z
+M`````(/Y!`^$6P(```^W%X'J,A0``$ACPDAIP&=F9F9(P>@@P?@"P?H?*=")
+MPHU"_X/Z#`]#T(G2N*NJJJI(#Z_02,'J(4B-!-4`````2"G02(T$@DR-I#`Z
+M%```B<I"#[9$(AF(10Y!#[9$)!9".D0B&78&0@^V1"(9B$4)B<I!#[9$)!="
+M.D0B&78&0@^V1"(9B$4(B<I!#[9$)!A".D0B&78&0@^V1"(9B$4'B<A"#[94
+M(!E(C4PD!TR)YDB)W^C._?__08G%#[95"4B-3"0&3(GF2(G?Z+?]__]!B<</
+MME4(2(U,)`5,B>9(B=_HH/W__T&)Q@^V50=(C4PD!$R)YDB)W^B)_?__B<*#
+MN[`#````#X0!`0``BX.P`P``#[>,```````/ME0D!P^WP8/``SG"?0?&1"0'
+M`^L$*$PD!P^V5"0'3(GF2(G?Z)7\__^(10X/MM!(C4PD`TR)YDB)W^@L_?__
+M08G%#[9$)`<Z1"0&=@4/MD0D!HA$)`8/MM!,B>9(B=_H6OS__XA%"0^VT$B-
+M3"0#3(GF2(G?Z/'\__]!B<</MD0D!SI$)`5V!0^V1"0%B$0D!0^VT$R)YDB)
+MW^@?_/__B$4(#[;02(U,)`-,B>9(B=_HMOS__T&)Q@^V1"0'.D0D!'8%#[9$
+M)`2(1"0$#[;03(GF2(G?Z.3[__^(10</MM!(C4PD`TR)YDB)W^A[_/__B<(/
+MMD0D!P'`9HF#K@,```^V10Z(10J(10N(10R(10U$B>@HT(A%`$2)Z$0H\(A%
+M`42)Z$0H^(A%`L9%!@#&104`QD4$`,9%`P"Z`0```(G02(/$"%M=05Q!74%>
+M05_#05154TB#['!(B?U)B?1(B>>Z1````$C'Q@````#H`````$B-7"10NA$`
+M``!(Q\8`````2(G?Z`````!(B=I,B>9(B>_HS_S__[H`````A<`/A&D"```/
+MMD0D7__(N@`````\!`^'50(```^V1"1@_\BZ`````#P$#X=!`@``0;P`````
+M00^WW`^V?!Q0O@4```#H`````(A$'%!!_\1F08/\!G;?0;P'````00^WW`^V
+M?!Q0O@8```#H`````(A$'%!!_\1F08/\#G;?#[9$)%'!X`4EX`````^V5"10
+M@^(?"=`)!"0/ME0D4\'B!X'B@`````^V1"12P>`"@^!\"<(/MD0D4<#H`X/@
+M`PG""50D!`^V5"14P>($@>+P````#[9$)%/0Z(/@#PG""50D"`^V5"16P>(&
+M@>+`````#[9$)%4!P(/@/@G"#[9$)%3`Z`2#X`$)P@E4)`P/ME0D5\'B`X'B
+M^`````^V1"16P.@"@^`'"<()5"00#[94)%G!X@>!XH`````/MD0D6`'`@^!^
+M"<(/MD0D5\#H!8/@`0G""50D%`^V5"1:P>(%@>+@````#[9$)%G0Z(/@'PG"
+M"50D&`^V5"1;P>(#@>+X````#[9$)%K`Z`.#X`<)P@E4)!P/ME0D7`'2@^)^
+M#[9$)%O`Z`6#X`$)P@E4)"`/MD0D7<'@!27@````"40D)`^V5"1>P>(#@>+X
+M````#[9$)%W`Z`.#X`<)P@E4)"@/MD0D7L#H!8/@`0E$)"P/MGPD7[X#````
+MZ`````#!X`<E@`````E$)"`/MGPD7[X#````Z`````#1Z(/@`PE$)"0/MGPD
+M8+X#````Z`````#!X`*#X!P)1"0D0;P`````2(M%($$/M]2+%)2)D)R8``!!
+M_\1F08/\#W;E2(M%($$/M]2+%)2)D-28``"Z`0```(G02(/$<%M=05S#2(/L
+M&$B)7"0(3(ED)!!(B?M)B?0/MP8M`!0``$AC^$AI_V=F9F9(P>\@P?\"P?@?
+M*<>^!0```.@``````<"#R$%(BU,@B8*<F```2(M#(,>`P)@```````!,B:/H
+M$P``N`$```!(BUPD"$R+9"002(/$&,-(BT<@BX!DF```P>@39B7_`?;$`70$
+M9C4`_IC#05154TB)_4F)]$B+1R"+D&"8``"#R@*)D&"8``"Y`````+H"````
+MOF"8``#H`````+H`````A<!T1;L`````O^@#``#H`````$B)[^@`````F/_#
+M@_L4?P>#^+A_X>L4@_BX?@]F0<=$)!8``+H`````ZPMF08E$)!:Z`0```(G0
+M6UU!7,.X`````,.X`````,.02(/L"+@`````@_X"?QI(8\9(B<9(P>8$2"G&
+M2(VTM_@4``#H`````$B#Q`C#2(/L"$F)T+@`````@_X"?QU(8\9(B<)(P>($
+M2"G"2(V4E_@4``!,B<;H`````$B#Q`C#2(/L*$B)'"1(B6PD"$R)9"003(EL
+M)!A,B70D($F)_(GU28G52(GY@_X"=!.#_@)W!X/^`709ZSB#_@-T"NLQ0;X"
+M````ZPY!O@$```#K!D&^`````$ECUDB)T$C!X`1(*=!(C9R!^!0``(-[!`!T
+M![C_____ZTF^/````$B)W^@`````B6L$387M=2/'0PP+````QT,4`@```,=#
+M&/____]FQT,@"@!FQT,B"@#K#DR)ZD2)]DR)Y^@`````1(GP2(L<)$B+;"0(
+M3(MD)!!,BVPD&$R+="0@2(/$*,.X`````(/^`G=3B?)(B=!(P>`$2"G02(V$
+MA_@4``"#>`0`=0:X`````,/'0`0`````N/[___^)\=/`(8?8%```(8?<%```
+M(8?@%```(8?D%```(8?H%```N`$```##28GX2(N/Z!,``+@`````@_X"#X='
+M`@``B?)(B=!(P>`$2"G03(V,A_@4``!!@WD$`'4&N`````##08-Y!`%T!K@!
+M````P_9!`A`/A(````!(BT<@QX`0@```X`$``$B+1R#'@!2`````"``(2(M'
+M(,>`((```,^/W0%(BT\@08M1%(G0P>`$*=#!X!`%```/``W@`0``B8%`@```
+M2(M'(,>`1(```,`#K@5(BU<@BX)$F```@^"`@\@XB8)$F```2(M'(,>`!)@`
+M`",@`&_K?4B+1R#'@!"```!H`0``2(M'(,>`%(`````$``1(BT<@QX`@@```
+MIX_=`4B+5R!!BT$4:<!H`0``!3`"``#!X`L-,`(``(F"0(```$B+1R#'@$2`
+M``"8`]<$2(M7((N"1)@``(/@@(/('(F"1)@``$B+1R#'@`28```@$`!O08-Y
+M&/]U![@/````ZP1!BT$82(M/((G"P>(400^W02+!X`0E\`````G"00^W02"#
+MX`\)PH'*`"`(`(F1'(```$'V00P!=!*X`0```(GQT^!!"8#8%```ZQ"X_O__
+M_XGQT\!!(8#8%```0?9!#`%T$K@!````B?'3X$$)@-P4``#K$+C^____B?'3
+MP$$A@-P4``!!]D$,`G02N`$```")\=/@00F`X!0``.L0N/[___^)\=/`02&`
+MX!0``$'V00P$=!*X`0```(GQT^!!"8#D%```ZQ"X_O___XGQT\!!(8#D%```
+M0?9!#`AT$K@!````B?'3X$$)@.@4``#K$+C^____B?'3P$$A@.@4``"X`0``
+M`,.)]DB)\$C!X`1(*?"+A(?\%```A<!T#(/X`74'2(M'((L`P[C_____PXGV
+M2(GP2,'@!$@I\(N$A_P4``"#^`%T#(/X`7(8@_@#=Q/K"$B+1R")$.L/2(M'
+M((E0!.L&N`````##N`$```##2(/L&$B)'"1(B6PD"$R)9"002(G]B?/H````
+M`$&)Q(G&@>;___]_2(GOZ`````!(BT4@BY!D@```A=MT#;@E````*=#1Z`'"
+MZQN#^@%V!/_*ZQ)$B>9(B>_H`````+@`````ZQI(BT4@B9!D@```1(GF2(GO
+MZ`````"X`0```$B+'"1(BVPD"$R+9"002(/$&,.)]DB)\$C!X`1(*?"+A(?\
+M%```@_@!=!&#^`%R/H/X`G0L@_@#=`_K,DB+1R#'0`@!````ZRM(BT<@QT`(
+M`@```$B+1R#'0"@.````ZQ-(BT<@QT`H"@```.L&N`````##N`$```##B?9(
+MB?!(P>`$2"GPBX2'_!0``(7`=!6#^`%U$$B+1R"+0!0E`'@``,'H"\.X````
+M`,-54TB#[`A(B?V)]DB)\$C!X`1(*?"+A(?\%```@_@!=`R#^`%R9H/X`G1+
+MZU](BT<@QT`("````+L`````2(M%((M`%/;$>'04OPH```#H`````/_#@?OG
+M`P``?N!(BT4@QT`(`````('[YP,```^>P`^VP.L;N0````"Z!````+XL````
+MZ`````#K!;@`````2(/$"%M=PT2+3"08BWPD*$&-0/U!P>`:@_@!N`````Q$
+M#T;`@>+_#P``BT0D",'@$@G"P>$,@>$`\`,`"<I$"<*)T`T````!0/;'`0]$
+MPHG"@<H````@0/;'$`]$T(G0#0````*#?"0@``]%T(E6"$&#^?]T&D2)R,'@
+M#24`X`<`B48,B=`-````0(E&".L'QT8,`````$#VQP1T$X%."```0`"+1"0X
+M)0``^/\)1@RX`0```,.X`````,.!3@@````@PX7)=!*+1@P)T(G"@,X0187`
+M#T3"ZQU%A<!T#$&+00B)1@B)5@SK#\=&"`````")T(#,$(E&#,=&%`````#'
+M1A``````N`$```##2(GQ]D84`74&N`\```###[=&%&8E_A]FB0(/MT829HE"
+M`L9"!`"+1A"H`74<J`)T!,9"!`'V01`(=`2`2@0"]D$0!'0$@$H$!(M!""4`
+M`#P`P>@2B$(%BT$4)0#@'P#!Z`V(0@:+01`E``\``,'H"(A"!XM!$"7P````
+MP>@$B$((QD(*`,9""P"X`````,/#D(!.!`BX`````,.0D$B#[`A(BT<@QX#0
+MF```%AP``+H`````2(M'(,>`@)@``````0#_PH/Z!W[K2(M'((N``)P``(G'
+MP>\8B?K!Z@2)^(/@#\'@!(G7"<>^"````.@`````2(/$",-!5T%6055!5%53
+M2(/L&$F)]DF)UTB)3"0(3(D$)$&)_;^X,```Z`````!(B<-!O`(```!(A<`/
+MA#@$``!(B<6Z*!0``$C'Q@````!(B<?H`````$R)<Q!,B7L82(M$)`A(B4,@
+M9D2)JW@#``!FQX-Z`P````!FQX.L`P``/P#'@[`#````````QX-P,```````
+M`,>#C#````````#'@Y0P````!P``QX.8,```_____\>#G#```/_____'@Z`P
+M``#_____O@````!(B=_H`````$&\`P```(7`#X25`P``9H&[>`,``!OQ=29(
+MBT,@QX``H@```````$B+0R#'@'R8```9````O^@#``#H`````$B+12"+@"!`
+M```E_P```(G"P>H$B95\`P``@^`/9HF%@`,``(/J`D&\#0```(/Z`@^'+@,`
+M`$B+12"+@!B8``!FB86"`P``2(GOZ%X#``!!O`X```"%P`^$!P,``(.]?`,`
+M``-V$$B+12#'@`"8```'````ZPY(BT4@QX``F```1P```+_0!P``Z`````!(
+MB>_H__W__V:)A80#```/M\`E\````$&\#0```(/X$`^%L`(``$B-5"06OL$`
+M``!(B>_H`````$&\"````(7`#X20`@``9H%\)!;_+W<+0;P%````Z7P"```/
+MMT0D%F:)@R@4``!(BT4@BX`00```@^`8P>@#0;P*````@_@"#X51`@``2(U4
+M)!:^/P```$B)[^@`````0;P(````A<`/A#$"```/MT0D%F:)@RH4``!!O0``
+M``!!O`````!!C;0DP````$B-5"062(GOZ`````"%P`^$]@$```^W1"0603'%
+M0?_$08'\/P,``';/0;P'````08']__\```^%U0$``&;'@YX5```*`&;'@Z@7
+M```#`$&\`````$2)X$AKP#1FQX0#IA4```L`0?_$08/\"7;F0;P`````2,?!
+M`````$2)X`^W%$%FB91#L!<``&:)E$.J%P``2&O`-$@!V&;'@&P8```+`&;'
+M@-`7```+`$'_Q$&#_`)VQTB-LR@4``!(B>_H`````$&\"````(7`#X1``0``
+M@[U\`P```W9F9H.[0A0```!T7$B+12#'@`"8```'0```O]`'``#H`````$B)
+M[^@^_/__9HF%A@,``$B+12#'@`"8```'````O]`'``#H``````^WA88#```E
+M\````$&\#0```(/X(`^%TP```.L)9L>#0A0`````2(U4)!:^OP```$B)[^@`
+M````0;P(````A<`/A*@````/MT0D%F:)@RP4``!FB86X`P``2,>%:`,`````
+M``!(B>_H``(``$B)[^@`````0;T`````0;P`````0;X?````1(GV1"GF2(U4
+M)!9(B>_H`````(7`=$L/MT0D%D$!Q4.-%"2)T68/MD0D%XB$"_`M``#_P@^V
+M1"06B(03\"T``$'_Q$&#_`)VMT6%[70,2(GH08']_?\"`'4N0;P)````ZP9!
+MO`@```!(A=MT"$B)W^@`````2(,\)`!T!TB+!"1$B2"X`````$B#Q!A;74%<
+M05U!7D%?PU-(B?M(C;<H%```Z`````!(B=_H`````%O#4TB#["#'1"0(`(``
+M`,=$)`P@F```QT0D$%55557'1"04JJJJJL=$)!AF9F9FQT0D')F9F9E!N@``
+M``!(C5PD"$F)XTECTDC!X@)$BPP31(G)2(M'((L$`4&)!!-!N`````!$B<#!
+MX!")QD0)QDB+1R")-`%(BT<@BQ0!N``````Y\G5M0?_`08'X_P```'[20;@`
+M````1(G)26/`BW2$$$B+1R")-`%(BT<@BQ0!N``````YUG4Z0?_`08/X`W[9
+M26/"2,'@`HL,`TB+5R!!BP0#B0010?_"08/Z`0^.8?___[]D````Z`````"X
+M`0```$B#Q"!;PXGP]L0!=`QFQP(X$V;'`=07ZQE`A/9Y&F:#OT(4````=!!F
+MQP(("6;'`:P*N`$```##N`````##N`$```##055!5%532(/L"$F)_4B)_4F)
+M_$B-GY`#``!F@[^X`P```74/2(U4)`2^$````.@`````QT,$`````&:#O3X4
+M````=!C'0P0!````9H.]+A0```!U!\=#!`,```!F@[U"%````'0$@TL$!&;'
+M0Q`("6;'0Q*L"F;'0PPX$V;'0P[4%X`+`P^V0P*#R`-FQT,("@!FQT,*@`"#
+MX)^(0P)F@[TR%````'0I28V4)``4``"^#P```$R)[^@`````A<!T$$''A"0$
+M%````0```(!+`H#'0Q0-````0<>$)"`4```!````N`$```!(@\0(6UU!7$%=
+MPY"0D$B+5R"+1@2)@BB```!(BU<@BT8,B8(L@```2(M7((M&$(F",(```$B+
+M5R"+1@B)@C2```!(BU<@BP:)@B"```##2(/L*(ET)`2+AXP#``"#^`%T#X/X
+M`7(<@_@&=!>#^`AU,,=$)`S__P``QT0D$/__!P#K'HGP*P4`````P>`#B40D
+M#(GP*P4`````P>`#B40D$(U&`8E$)`B)T"7__X`!B00D2(GFZ`````!(@\0H
+MPTB+1R#'@"B`````````2(M7((N"!(````T```0`)?__S_^)@@2```!(BT<@
+MQX`@@```__\``,-)B?AF@WX2`'1#2(M7((N"!(````T``!``B8($@```2(M7
+M(`^W1A")@B2```!(BU<@#[=&$HF".(```$B+5R"+1A3!X`.)@C"```#K%4B+
+M5R"+@@2````E___O_XF"!(```$B+5R"+!HF"*(```$B+3R"+@2"````E``"`
+M_P^W5@@)PF:#?A@`=!$/MT88@\`$P>`0)0``?P`)PHF1((```$&+D)0P```P
+M]@^W1AK!X`@E`/\```G"08F0E#```$B+1R")D!B```!(BT\@BY$$0```9KH`
+M`(M&'(/H`\'@`R7__P``"<*)D01```##D)!(BT<@BX`(0```A<`/E<`/ML##
+M2(M'((N0P````(/Z_W4,QP8`````N`````##B=`ENM@%`8D&]\(```@`=`<-
+M````0(D&]L(%=`.##@'WPL`%``!T`X,.0/;"('0/@[\@%````'0&@0X```!`
+M]D8#0'1&B9<(%```2(M7((N"Q````(F'#!0``(N"R````(F'$!0``(N"S```
+M`(F'%!0``(N"T````(F'&!0``(N"U````(F''!0``+@!````PXN'_"T``,-(
+MB?E$BX?\+0``187`>1)(BT<@QT`D`````$B+1R"+0"2)\H'BNM@%`4#VQD!T
+M,(.Y`"X```!T`X/*0(.Y!"X```!T`X#.`8.Y""X```!T`X#*@(.Y#"X```!T
+M`X#.!(G0@\@'0/;&`0]%T(G0#0``"`#WQ@```$`/1=!(BT<@B9"@````B;'\
+M+0``A?9Y"TB+1R#'0"0!````1(G`P[B`````PXGP9H/^?W<>2,'@!27@_Q\`
+M2(M7((N$$!R(``"Z`0```&:%P'@%N@````")T,.)\K@`````9H/^?P^'AP``
+M`$C!X@6!XN#_'P!(BT<@QX0"`(@```````!(BT<@QX0"!(@```````!(BT<@
+MQX0""(@```````!(BT<@QX0"#(@```````!(BT<@QX0"$(@```````!(BT<@
+MQX0"%(@```````!(BT<@QX0"&(@```````!(BT<@QX0"'(@```````"X`0``
+M`,.X`````&:#_G]W>TB%TG0]1`^V0@5!P>`(#[9"!$$)P`^V2@/!X1@/MD("
+MP>`0"<$/MD(!P>`("<$/M@()P='I1(G`P>`?"<%!T>CK"T&X`````+D`````
+M2(GR2,'B!8'BX/\?`$B+1R")C`(8B```2(M/($2)P(#,@(F$"AR(``"X`0``
+M`,-!54%455-(@^P(28G128G,B?5%A<"Z`````+BJJJJJB<8/1/*X`````&:#
+M_7\/AWD!``!!#[8!@_@!=!*#^`%_!H7`=!'K1X/X!70ZZT!!O04```#K0F9!
+M@WD"!'8P9D&#>0(%=PA!O0````#K*F9!@WD"#7<(0;T!````ZQI!O0,```#K
+M$D&]!P```.L*N`````#I%`$``$4/MED$00^V007!X`A!"<-!#[9!!L'@$$$)
+MPT$/MD$'P>`800G#03'S00^V00G!X`A!#[91"(G3"<,Q\X'C__\``$4/ME$*
+M00^V00O!X`A!"<)!#[9!#,'@$$$)PD$/MD$-P>`800G"03'R00^V00_!X`A!
+M#[91#HG1"<$Q\8'A__\``$4/MD$000^V01'!X`A!"<!!#[9!$L'@$$$)P$$/
+MMD$3P>`800G`03'P9D&#>0(-=P=!@>#_````#[?UB?#!X`5(F$B+5R!$B9P0
+M`(@``$B+5R")G!`$B```2(M7($2)E!`(B```2(M7((F,$`R(``!(BU<@1(F$
+M$!"(``!(BU<@1(FL$!2(``!,B>+H`````$B#Q`A;74%<05W#D$B#[`A(B?!(
+MC;?P+0``N@8```!(B<?H`````$B#Q`C#2(/L"$B!Q_`M``"Z!@```.@`````
+MN`$```!(@\0(PTB#[`A(B?>Z!@```$C'Q@````#H`````$B#Q`C#N`````##
+M2(/L&$B)7"0(2(EL)!!(B?M(B=5(BT<@B;``8```2(M'(,>`"&````$```"Y
+M`@```+H#````O@Q@``#H`````+H`````A<!T$TB+0R"+@`1@``!FB44`N@$`
+M``")T$B+7"0(2(ML)!!(@\08PV8YM[@#``!U![@,````ZQ2`ORH4````#YC`
+M#[;`C03%`P```$B%TG0"B0*X`````,.X`````&:#OSX4````=!2X`0```&:#
+MORX4````=06X0P```&:#OT(4````=`.#R`3#2(/L&$B)'"1,B60D"$R);"00
+M28G]#[>?`!0``$&)W$&#Y!Q!P?P"@^,"T?M$B>;H`````$F+52"+@@"8``"`
+MS"")@@"8``!$B>9,B>_H`````#G8#Y7"#[;21(GF3(GOZ`````!(BQPD3(MD
+M)`A,BVPD$$B#Q!C#2(M_((N7%$```(T,-K@#````T^`)PHF7%$```+@!````
+MPTB+?R"+EQ1```"-##:X`P```-/@]]`APHF7%$```+@!````PTB+?R!$BX<8
+M0```N/[___^)\=/`02'`@^(!T^)!"=!$B8<80```N`$```##B?&X_____X/^
+M!7<22(M'((N`'$```(/@+]/H@^`!PTB#[`A(BT<@BX`40```)?Q__O^`S(")
+MP8')```!`(72#T7!2(M7((F"%$```(NW_"T``('.`````>@`````2(/$",-(
+MBU<@BX(00```)9__\?^#Y@<+!+4`````B8(00```PTB#[!A(B5PD"$B);"00
+M2(G[B=5(C;_V+0``N@8```#H`````$B+2R`/MI/V+0``#[:#]RT``,'@"`G"
+M#[:#^"T``,'@$`G"#[:#^2T``,'@&`G"B9$(@```2(M+(`^V@_LM``#!X`@/
+MMI/Z+0``"<*)Z"7_/P``P>`0"<*)D0R```!(BUPD"$B+;"002(/$&,-(BU<@
+MB[),@```BX)0@```BY),@```C4@!.?(/0L%(P>`@B=)("=##2(M'((N`3(``
+M`,-(BU<@BX(@@```#0````&)@B"```##2(M'((N`9)@``(G!P>D3@>'_`0``
+M]L4!=`:!\0#^__](BU<@BX)0@```BY),@```,=`QR,-(BT<@BX`@0```)?\`
+M``")PH/B#[D`````P>@$.8=\`P``=0YF.9>``P``=06Y`0```(G(PTB+1R"+
+M@)"````!!DB+1R"+@(R````!1@1(BT<@BX"4@````48,2(M'((N`B(````%&
+M"$B+1R"+@)B````!1A##2(/L&$B)'"1(B6PD"$R)9"002(G]B?-)B?R#_@AV
+M#K[__P``Z``````YPW8/08F<))@P``"X`````.L?B=Y(B>_H`````$B+52")
+M@G`0``")G9@P``"X`0```$B+'"1(BVPD"$R+9"002(/$&,-(@^P(2(M'((NP
+M<!```('F__\``.@`````2(/$",-(@^PH2(D<)$B);"0(3(ED)!!,B6PD&$R)
+M="0@2(G]08GVOO\?``#H`````$$YQG81QX6<,```_____[@`````ZSA,BV4@
+M08N<)!2```"!XP#@__]$B?9(B>_H`````"7_'P``"<-!B9PD%(```$2)M9PP
+M``"X`0```$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#Q"C#2(/L"$B+1R"+
+ML!2```"!YO\?``#H`````$B#Q`C##[:'CS```(/P`8/@`<.%]G0A2(M7((N"
+M!(```"7____^B8($@```@:>,,```_____NL?2(M7((N"!(````T````!B8($
+M@```@8^,,````````;@!````PTB#["A(B1PD2(EL)`A,B60D$$R);"083(ET
+M)"!(B?U!B?:^_Q\``.@`````03G&=A''A:`P``#_____N`````#K.TR+92!!
+MBYPD%(```('C__\`X$2)]DB)[^@`````P>`0)0``_Q\)PT&)G"04@```1(FU
+MH#```+@!````2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-(@^P(2(M'
+M((NP%(```('F``#_'\'N$.@`````2(/$",.X`0```,/#N`````##P\-(BT<@
+MBX`<G```)?\```##2(M'((N`6(```(/@!\-(BT<@@^8'B;!8@```PXN'<#``
+M`,-(@^P(2(N7Z!,``$B%TG4-B;=P,```N`$```#K!>@`````2(/$",-(@^P(
+M@_X!=1:#^@%V"K@-````@_H%=0RX`````.L%Z`````!(@\0(PTB#[`B#_@MU
+M'(G*@^(&B9>H`P``2(M'((F02(```+@!````ZP7H`````$B#Q`C#2(/L".@`
+M````A<`/E<`/ML!(@\0(PY"0D%532(/L"$B)^X7V=&5(BU<@BX($0```)?__
+M_/^)@@1```"_"@```.@`````O0H```!(BT,@BX`00```J0```0!T);_(````
+MZ`````!(BU,@BX($0```)?___/^)@@1```#_S77,ZP2%[74'N`````#K&DB+
+M4R"+@@2````E___[_XF"!(```+@!````2(/$"%M=PTB+5R"+@@2````-```$
+M`(F"!(```(7V=!5(BU<@BX($0```)?___/^)@@1```##2(M7((N"!(````T`
+M``0`B8($@```A?9T%4B+5R"+@@1````E___\_XF"!$```,-(@^P82(D<)$B)
+M;"0(3(ED)!")\TB)_4&\`0```(/^`708@_X!<@>#_@)T%^L>B=;HVO[__T&)
+MQ.L9B=;H8?___^L0B=;HA____^L'N`````#K"8F=;#```$2)X$B+'"1(BVPD
+M"$R+9"002(/$&,-(BT<@BX`$0```)0```P#!Z!##D%.#_@)T)8/^`G<'@_X!
+M=`GK(H/^!'0+ZQM(Q\,`````ZQE(Q\,`````ZQ!(Q\,`````ZP>X`````.L+
+M2(G>Z`````!(B=A;PTB+1R"+0`S#2(M'((EP#,-(BT<@QT`(!````,-(@^P(
+M2(M'(,=`""````"Y`````+H$````O@@```#H`````(7`#Y7`#[;`2(/$",-(
+MBU<@BX)(@```@^#?B8)(@```PTB+5R"+@DB```"#R"")@DB```##2(M'((FP
+M0(```$B+1R")D$2```##N`````"#_C]W1X/^'W8@2(M7($2+@D2```"-3N"X
+M_O___]/`1"'`B8)$@```ZQU(BU<@1(N"0(```+C^____B?'3P$0AP(F"0(``
+M`+@!````P[@`````@_X_=T>#_A]V($B+5R!$BX)$@```C4[@N`$```#3X$0)
+MP(F"1(```.L=2(M'($2+@$"```"Z`0```(GQT^)$"<*)D$"```"X`0```,-(
+MBT<@BX`\@```PTB+1R")L#R```##QT8(`````(G0)?\/``")1@PYT'0&N```
+M``##]L$@=`>!3@P`(```QT84`````,=&$`````"X`0```,/V1A0!=0JY#P``
+M`.G(````]D$4`7442(M'((M`#+D/````.=`/A*X````/MT809B7_#V9!B0&+
+M1A0E`(#_#\'H#V9!B4$"0<9!!`"+1A2H`G4LJ`1T!T'&000!ZR'V1A00=`=!
+M@$D$".L408!)!`*+1A0EX````,'H!4&(006+1A`E``#X!\'H$T&(00:+1A3V
+MQ`%T#B4`?@``P>@)08A!!^L%0<9!!_^+1A`E`(`'`,'H#T&(00B+1A`E````
+M.,'H&T&(00F+1A#!Z`R#X`%!B$$*N0````")R,.0D)!!5T%6055!5%532(/L
+M>$B)_4&)]DB)TT&)S4R)1"0X28G\9L=$)!X``$&_`````,=$)!@`````QT0D
+M%``````/MT("]L0!=`>I@````.L,#[="`L'H!X/P`:@!=5(/MT,"J"!T!*A`
+MZPP/MT,"P>@&@_`!J`%U.$B)WDB)[^@`````2(E$)"BZ#````$B%P`^$ZP<`
+M`$&#_@9T'D&#_@9W"$&#_@%W".L008/^"'0*N@P```#IQP<``$6%[71P2(M%
+M((N03(```(E4)!B+B%"```")3"04@[U\`P```W8,BX!`$0``B40D0.L@OP``
+M``!(BTT@B?B-%+U`$0``BQ0*B52$0/_'@_\)=NE(BT0D*/9`!`)U!(!@!/Y(
+MBU0D*`^W0@)FB4,"#[9"!(A#!$B+12"+@%B```")1"00A<"X`0````]%1"00
+MB40D$$B+52"+@@2````E`````HE$)""+@A!````E8`#^`(E$)"2+BA1```")
+M3"0TBY(80```B50D,`^W<P)(B>_H`````+H#````A<`/A.4&```/MT,")?`!
+M```]P````'1!/<````!_"3V@````="KK/CU``0``=`D]4`$``'0+ZRYFQT0D
+M'@$`ZP=FQT0D'@(`0;\!````ZQ9FQT0D'@,`ZP=FQT0D'@0`0;\"````@[U\
+M`P```W802(M%(,>``)@```<```#K#DB+12#'@`"8``!'````@[U\`P```P^&
+M\P```(![`@`/B;H```!F08&\)"@4````,`^&J0```/9#`B!T'$$/MX0D)!4`
+M`(E$)`Q!#[>4)"@5``")5"0(ZQI!#[>,)"85``")3"0,00^WA"0J%0``B40D
+M"+X#````BWPD#.@`````B40D#+X#````BWPD".@`````B40D"$$/M_=(Q\$`
+M````BQ2Q@.(_BT0D#,'@!B7`````"<*)%+%(Q\<`````BPRW@^'PBU0D#,'J
+M`H/B`8M$)`@!P(/@#@G""=&)#+>_`````$G'P`````!!#[?WB?A(C01`08L,
+M@$B+52!(`?!!BP2`B001_\>#_QMVX4B)WDB)[^C$#```OP````!)Q\``````
+M2`^W="0>B?A(C02`08L,@$B+52!(`?!!BP2`B001_\>#_R)VX;\`````2<?`
+M`````$$/M_>)^$B-!$!!BPR`2(M5($@!\$&+!(")!!'_QX/_/W;AOP````!(
+MQ\8`````2<?``````(GXBQ3&187M=`V-@@"`__\]_P\``'8/B=%(BU4@B?A!
+MBP3`B001_\>!_ZH```!VT(.]?`,```-W1DB+52"+@AR````E__\/``T``-`!
+MB8(<@```2(M%(,=`7`````!(BT4@QX!XF```"````$B+52"+@DB```"`S`2)
+M@DB```!%A>UT54B+12"+5"08B9!,@```2(M%((M,)!2)B%"```"#O7P#```#
+M=A!(BU4@BT0D0(F"0!$``.L@OP````"-#+U`$0``2(M5((GXBT2$0(D$$?_'
+M@_\)=N5(BTT@00^VE"3P+0``00^VA"3Q+0``P>`("<)!#[:$)/(M``#!X!`)
+MPD$/MH0D\RT``,'@&`G"B9$`@```2(M-($$/MI0D]2T``,'B"$$/MH0D]"T`
+M``G0"T0D((F!!(```$2)]DB)[^AJ(0``2(M5((N"$$````M$)"2)@A!```!(
+MBT4@BU0D-(F0%$```$B+12"+3"0PB8@80```2(M%((M4)!")D%B```!(BTT@
+M00^VE"3V+0``00^VA"3W+0``P>`("<)!#[:$)/@M``#!X!`)PD$/MH0D^2T`
+M`,'@&`G"B9$(@```2(M-($$/MI0D^RT``,'B"$$/MH0D^BT```G0B8$,@```
+M2(M5($&+A"24,```B8(8@```2(M%(,>`@````/____^#O7P#```$=1=F@[V`
+M`P```7<-2(M5((M"%(#,!(E"%$B)WDB)[^@`````N@,```"%P`^$J`(``$&#
+M_@9T*(N%M`,``*@#=!Y(BTT@BY%$F0``@>+____?@^`!P>`="<*)D429``!(
+MB=Y(B>_H,PX``$B+="0H2(GOZ%\&``"Z`P```(7`#X15`@``9H&]>`,``!OQ
+M=12`>P(`>0Y(BT4@QX`(V````@4``$B+12#'@!R8```!````2(M%((N`%)D`
+M`"7_/P``]D,"('07P>`"B<"ZHXLNND@/K\)(P>@@P>@$ZQ*)P+K-S,S,2`^O
+MPDC!Z"#!Z`.->&3H`````$B+52"+@F"8``"#R`&)@F"8``"Y`````+H!````
+MOF"8``!(B>_H`````$B+="0H2(GOZ`````"%P'45]D,"('4%9H-+`@*Z`P``
+M`.F2`0``08.\)'0P````=!I(BT4@QX`@F0```/`!`$''A"1X,````0```+L`
+M````O@$```"-!)T`````2)A(BWT@B?*)V=/BB90X`!```/_#@_L)?M^[````
+M`(G>2(GOZ`````#_PX/["7[O2(M%(,>`I`````$``0!(BT4@QX"H`````0``
+M`$B+12#'@*P````!````2(M5((N"L!```(F"L!```$B+12#'@*````!E"0@`
+M0<>$)/PM``!E"0@`2(M5((N"K`````T```<`B8*L````08/^!G4?2(M5((N"
+MH````(#,$(F"H````$&!C"3\+0```!```(.]!!0```!T"$B)[^@`````2(M5
+M((N"((```"7__W_^B8(@@```08.\))@P``#_=!!!B[0DF#```$B)[^@`````
+M08.\))PP``#_=!!!B[0DG#```$B)[^@`````08.\)*`P``#_=!!!B[0DH#``
+M`$B)[^@`````@[VH`P```'002(M5((N%J`,``(F"2(```$2)M8P#``"X`0``
+M`.L12(M$)#B#.`!T`HD0N`````!(@\1X6UU!7$%=05Y!7\-(@^P(O@(```#H
+M5@,``$B#Q`C#4TB)^[H!````O@````#H`````+H`````A<!T);X3````2(G?
+MZ"@#``"Z`````(7`=`^_-`@``.@`````N@$```")T%O#2(/L&$B)7"0(2(EL
+M)!!(B?N)];H!````O@````#H`````+H`````A<`/A&D!``")Z"7P`0``/<``
+M``!T?3W`````?Q,]H````'0V/;````!T+^GW````/4`!```/A)@````]0`$`
+M`'\,/=````!T2NG9````/5`!``!T?NG-````2(M#(,>`!)@```````!(BT,@
+MQX``H@```P```$B+0R#'@'R8```9````ORP!``#H`````.F4````2(M#(,>`
+M!)@```````!F@[MX`P``$G5\2(M#(,>`?)@``!@```"_+`$``.@`````2(M#
+M(,>``*(```(```#K5$#VQ1!T$$B+0R#'@`28```#````ZPY(BT,@QX`$F```
+M`````&:#NW@#```2=29(BT,@QX!\F```&````+\L`0``Z`````!(BT,@QX``
+MH@```````+X3````2(G?Z+$!``"Z`````(7`=#2_-`@``.@`````N@$```"^
+M`````$B)W^@`````N@````"%P'0/O@````!(B=_H=@$``(G"B=!(BUPD"$B+
+M;"002(/$&,-(@^PH2(D<)$B);"0(3(ED)!!,B6PD&$R)="0@2(G[28GU28G6
+M28G\Z`````!(B<6X`````$B%[0^$"`$``(.[>#`````/A(0```!(BT,@BX`@
+MF0``J0```0!U<\>#>#````````!(BW,@B[X0G```BX84G```1(N&&)P``(GZ
+MT>J)P='I`<J)P<'I!L'J!W0^A<ET.D6)P4'WV42)R$&)T)E!]_A!B<%!@^$_
+MB?B9]_F)P8/A'T2)R,'@!8N6()D```G0"<B`S`B)AB"9``!(B>Y(B=_H$P,`
+M`(7`=0UF08--`@)F@V4"_>LU2(GN2(G?Z`````"%P'4MOX@3``#H`````$B)
+M[DB)W^@`````A<!U%$'V10(@=09F08--`@*X`````.L?2(G?Z#\8``!!@[PD
+M>#`````/E,`/ML!!B0:X`0```$B+'"1(BVPD"$R+9"003(ML)!A,BW0D($B#
+MQ"C#2(/L&$B)'"1(B6PD"$R)9"0028G\B?.%]KC_____B<4/1>Y(BT<@BU`,
+MB;``0```OP\```#H`````(/C`XGJ@^(#B=F^`$```$R)Y^@`````B<+VPP%U
+M#$F+1"0@QT`4`````(G02(L<)$B+;"0(3(MD)!!(@\08PT%505154TB#[`A)
+MB?U)B?0/MU8"#[<VZ`````!!@'PD`@!Y-4@/O]A(C01;2(T<A0````"+>P2^
+M"````.@`````B<6!Y?\```#!Y06+`\'@!`G%#[=#".L%O0````!F/9``?P2H
+M`70?#[_X@^\8O@@```#H`````(G&@>;_````N`$```#K)@^_^(/O&(GXP>@?
+M`<?1_[X(````Z`````")QH'F_P```+@`````P>8"`<`)QH'.`00``$F+32!`
+M#[;%P>`(0`^VU@G0B8&<F```28M-((GH)0#_``!(B?,/MM<)T(F!T)@``$V)
+MI>@3``"X`0```$B#Q`A;74%<05W#2(M'((N`9)@``,'H$V8E_P'VQ`%T!&8U
+M`/Z8PT%455-(B?V)]TB+=2"+CF28``"!X0#P__^)^,'@"24`#@``"<&!XO\!
+M```)T8F.9)@``$B+52"+@F"8``"#R`*)@F"8``!!O#@```!`A/]T%D0/MN="
+MC03E`````$0IX$&)Q$'!Y`F[`````$B+12"+@&"8``"H`G011(GGZ`````#_
+MPX/[.W[CZP6#^SM^![@`````ZPE(B>_H1?___YA;74%<PP^W1@(EX`$``#W`
+M````="D]P````'\)/:````!T$NLI/4`!``!U(@^WAX04``#K$`^WAX84``#K
+M!P^WAX@4``!FB0*X`0```,.X`````,-(@^P82(E<)`A(B6PD$$B)^TB)]4B-
+M5"0&Z)/___^Z`````(7`="U(BT,@BX!@F```2(G?Z+?^__]F.T0D!GX%9H--
+M`@)FB4469CM$)`8/GL`/MM")T$B+7"0(2(ML)!!(@\08PTB#["A(B5PD$$B)
+M;"083(ED)"!(B?M(B?6#OWP#```#=V?H`````(7`=%Y(C50D#DB)[DB)W^@1
+M____N@````"%P'1=0;P`````26/$#[:P`````+H`````2(G?Z$;^__]F.T0D
+M#GX(9L=%%@``ZP1FB4460?_$08/\`G;-08/\`P^6P`^VT.L82(M3((N"8)@`
+M`(/(`HF"8)@``+H!````B=!(BUPD$$B+;"083(MD)"!(@\0HP[H`````2,?'
+M``````^W!HG!9CL%`````'<+_\)(8\)F.PR'=O5(8\(/MQ2%``````^_PFG`
+M5E4``,'H$&;!^@]F*="8PT%7059!54%455-(@^Q(2(E\)#A(B?V`?@(`N`$`
+M``"Z`@```(G1#TG(9HD,)`^W1@(EX`$``#W`````#X1\`0``/<````!_$#V@
+M````#X0T`0``Z:,!```]0`$```^%F`$```^W!F8MH0]F/>H$=Q4/MY\,%0``
+M9HE<)!X/MX<.%0``ZV@/MP9F+8P49CWO`'<:#[>/$!4``&:)3"0>#[>?$A4`
+M`&:)7"0<ZU8/MP9F+7P59CW@`'<:#[>'%!4``&:)1"0>#[>/%A4``&:)3"0<
+MZR]F@3Y<%G8:#[>?&!4``&:)7"0>#[>'&A4``&:)1"0<ZPYFQT0D'```9L=$
+M)!X``$0/M[60%```#[>-EA0``&:)3"0@9H.]EA0````/E,!F1`^V^$@/MPPD
+M2,?&`````(L4CH'B____[P^WA805``#!X!P)PHD4CDC'Q@````"+%(Z!XO__
+M__L/MX6&%0``P>`:"<*)%(Y(Q\8`````BQ2.@^+W#[>%@A4``,'@`PG"B12.
+MZWX/MY\<%0``9HE<)!X/MX<>%0``9HE$)!Q$#[>WDA0```^WCY@4``!FB4PD
+M(&:#OY@4````ZS0/MY\@%0``9HE<)!X/MX<B%0``9HE$)!Q$#[>WE!0```^W
+MCYH4``!FB4PD(&:#OYH4````#Y3`9D0/MOCK"K@`````Z3(!``!,#[<D)$G'
+MQ0````!#BURE`(#C/T4/M_:^!````$2)]^@`````P>`'00^WU\'B!@G0)<``
+M```)PT.)7*4`2<?%`````$.+7*4`@^/XO@0```!$B??H`````-'H@^`'"<-#
+MB5RE`(#C?T0/MW0D'KX#````1(GWZ`````#!X`<E@`````G#0XE<I0!)Q\4`
+M````0XM<I0"#X_R^`P```$2)]^@`````T>B#X`,)PT.)7*4`@^/C#[=\)!R^
+M`P```.@`````P>`"@^`<"<-#B5RE`$C'P0````!"BQ2A@^+WBT0D(,'@`X/@
+M"`G"0HD4H;X`````2,?'`````$P/MR0D2&/&2(T$0(L,ATB+7"0X2(M3($P!
+MX(L$AXD$$?_&@_X8=MW'A80P````````N`$```!(@\1(6UU!7$%=05Y!7\-)
+MB?D/MT(")>`!```]P````'0K/<````!_##V@````=!;IP0```+H`````/4`!
+M``!T$>FP````N@$```#K!;H"````2&/210^WA%&B%```00^WA%&H%```P>`&
+M00G`00^WA%&N%```P>`,00G`00^WA%&T%```P>`200G`00^WA%&Z%```P>`8
+M00G`00^WC%'`%```00^WA%'&%```P>`&"<%!#[>$4<P4``#!X`P)P4$/MX11
+MTA0``,'@$@G!00^WA%'8%```P>`8"<&#_@%T#(/^`7(7@_X"=`?K"D2)P>L+
+M08G(ZP:X`````,-!B;%P,```2(M'($2)@&"9``!(BT<@B8ADF0``N`$```##
+M059!54%455-(B?U)B?5)B?P/MT8")>`!```]P````'1)/<````!_"3V@````
+M=#/K03U``0``=3I!O@````!(BT\@BY%$F0``@^+'#[>'B!4``,'@`X/@.`G"
+MB9%$F0``ZQI!O@$```#K$D&^`@```.L*N`````#IYP$``(.]?`,```-W%4B+
+M52"+@A"9``"#R`.)@A"9``#K6$B+32"+D1"9``"!X@;\__])8]Y!#[>$7)P4
+M``#!X`0)PH/*`8F1$)D``$&+M"1P,```3(GJ2(GOZ`````!(BU4@00^_A%R$
+M%```)?\!``"`S`*)@FB9``!(BTT@BY%$F```@>)_P/__26/V00^WA'1:%```
+MP>`')8`_```)PHF11)@``$B+32"+D4B8``"!XO\/_/]!#[>$=&`4``#!X`PE
+M`/`#``G"B9%(F```2(M-((N14)@``&:Z``!!#[Z$-($4``#!X`@E`/\```G"
+M00^VA#1^%```"<*)D5"8``!(BWT@00^WE'1R%```B=#!X!C!XA`)T$$/MXQT
+M>!0``(G*P>(("=`)R(F'-)@``$B+32"+D2B8```P]D$/MX1T9A0``,'@"`G"
+MB9$HF```2(M-((N19)@``('B_P_X_T$/MX1T;!0``,'@#"4`\`<`"<*)D628
+M``"^`@```&9!@;PD*!0```(P=QEF@;UZ`P``(A!U,T'V10)`="R^"````.LE
+M00^W10"#X!\/M\"%P'06@^@*@_@,=@Y)8\9!#[>$1-X4```!QDB+32"+D229
+M``"`X@&-!#8E]P````G"B9$DF0``N`$```!;74%<05U!7L.#_D"X/P````]"
+MQF:)AZP#``!(BT<@B;`\F0``N`$```##05=!5D%505154TB#["A)B?Q(B?5(
+MB?L/MT8")>`!```]P````'15/<````!_##V@````='OIJ@```#U``0``#X6?
+M````#[>'GA4``&:)1"0(2(V'BA4``$B)!"1(C8>@%0``2(E$)!!$#[>W`AD`
+M`$R-KP09``#I@P````^WAZ@7``!FB40D"$B-AZH7``!(B00D2(V'RA<``$B)
+M1"001`^WMU09``!,C:]6&0``ZT\/MX>H%P``9HE$)`A(C8>P%P``2(D$)$B-
+MAV88``!(B40D$$0/M[=T&0``3(VO=AD``.L;N`````#I@P```$B)T$C!X`9,
+MC;P8C!D``.M8#[=5`$B)YDR)Y^AR````0;\`````2(GN3(GGZ`````")Q[D`
+M````9H.[+!4```!T)P^WLRP5``!(8]%F@[Q3+A4```!T#`^WA%,N%0``.?AT
+MG?_!.?%\X$$/M\Y)B>A,B>I,B?Y,B>?H9@,``+@!````2(/$*%M=05Q!74%>
+M05_#05=!5D%505154TB#[!A(B7PD$$F)]T&)U6;'1"0.``!FQT0D##\`O@@!
+M``!(Q\<`````Z`````"^@````$C'QP````#H`````$G'Q@````!)Q\0`````
+MNP$```"]``````^WQ69!B1Q&_\/_Q6:#^S]V[F:)+0````!FQP4``````0!F
+MQP4`````/P"]`````&8[+0````!S)`^WW4$/MS1>3(GZ00^W_>C_!@``9D&)
+M!%S_Q68[+0````!RW$$/MS0D2`^W!0````!!#[=\1/Z]`````&8[+0````!S
+M>0^WQ69!.S1$?`I!#[<T1&:);"0.B>CWT(G#9@,=`````'0F#[?300^W1%3^
+M9D$[!%1^"T$/MP149D&)1%3^_\5F.RT`````<K>]`````&8[+0````!S(@^W
+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
+M="0.#[=\)!)(C4PD"$B)ZNC*````#[=T)!`/MWPD$DB-3"0&2(GJZ+,```!$
+M#[=$)`8/MTPD"`^W5"00#[=T)`Y!N0````")W^CQ````08G$#[=T)`H/MWPD
+M%$B-3"0(2(GJZ'<````/MW0D#`^W?"042(U,)`9(B>KH8````$0/MT0D!@^W
+M3"0(#[=4)`P/MW0D"D&Y`````(G?Z)X````/M\!!#[?,#[=4)!0/MW0D$D&Y
+M`````$&)P$2)[^A\````#[?`2(M<)!A(BVPD($R+9"0H3(ML)#!(@\0XPTR+
+M2A!!N@````!F1#M2"'-)9D$Y.74U38U!"+@`````9D$[009S)69!.3!U$@^W
+MP$$/MT1!'F:)`;@!````PTF#P`+_P&9!.T$&<MM)@\$T0?_"9D0[4@ARM[@`
+M````PU.)^T&)\D&)TXG.OV0````/M\%!#[?0#Z_"N@````"%P'1^187)N`$`
+M```/1?AF13G3=%\/M\-!#[?2*=!KR&1!#[?#*=")PHG(B=.9]_MFA<!Y!0^W
+MQNL*9H/X9'X/00^WP&O09$6%R0]$T.LP#[_(00^WP`^OP;ID````*<H/M\X/
+MK]$!T`^WUXG1F??YB<+K"XG*:\)D187)#T70#[?2B=!;PP^WPD0/MTQ&_@^W
+M_VO_9`^W!FO`9(/H"CG'<PL/MP9FB0$/MP;K)$$/M\%KP&2#P`HYQW8K9D2)
+M"69%B0C#0@^W!$YFB0%"#[<$3F9!B0##0@^W!$YFB0%"#[=$3@+KZT&Z````
+M`&:%TG0P#[?236/*0@^W!$YKP&0I^(/`"8/X$G:[0@^W1$X":\!D@^@*.<=R
+MO4'_PD$YTGS3D,-(@^P(08GR2(MR$$&Y``````^W0@B)PD$YP7T29D0Y%G0,
+M2(/&-$'_P4$YT7SN#[=6!DB#Q@@/M__H)?___TB#Q`C#2(V/T"T``(L%````
+M`(F'T"T``(G"2(T$U0````!(*=!(C02%`````$B)01C'010!````QT$,%```
+M`,=!$",```##2(N'Z!,``/9``B!T)D&Y`````+\<````N4````!!N'(```#'
+M1@P`````QT80=P```.LD0;D`````OS(```"Y`````$&X,@```,=&#!0```#'
+M1A`C````BU8$N`````!$.<IR!#GZ=@XYRG(%1#G"=@6X`0```,-(BU<@BX>(
+M,```P>`))0!^``"`S(")@C"9``#'AX0P```!````PTB#[!A(B1PD2(EL)`A,
+MB60D$$B)^TB-K]`M``"#?10`=0>X`````.MM@[^$,````75>2(M'((N`,)D`
+M`&:%P'A/P>@9B44$QX>$,````````$B)[N@*____A<!U,TB)[DB)W^A!````
+MA<!T)$B)[DB)W^A*````A<!^%4B)[DB)W^A1`0``QX.$,````@```(N#A#``
+M`$B+'"1(BVPD"$R+9"002(/$&,.X`````(M6!#M6#'8%.U80<@6X`0```,.#
+M?A0`=":+!DB-%,4`````2"G"2(T4E0````!(B588BT8$.T80<FF#/@!U!KC_
+M____PXM&!(E&"#M&$')-@SX`=$A)Q\``````2,?'`````/\.BP9(C13%````
+M`$@IPDC!X@)(BTX808M$$!`K00@!P(M.""G!B4X(2`'Z2(E6&#M.$'(%@SX`
+M=<:X`0```,.+1@0[1@QW>(L%`````/_(.09U!KC^____PXM&!(E&"#M&#'=5
+MBP4`````_\@Y!G-)2<?!`````$G'P`````")Q_\&BP9(C13%`````$@IPDC!
+MX@)(BTX808M$$1`K00@!P(M.""G!B4X(3`'"2(E6&#M.#'<$.3YRQ[@"````
+MP[@`````PX-^%`!T.TB+1A@/MP!FB8>(%0``2(M&&`^W0`)FB8>&%0``2(M&
+M&`^W0`1FB8>$%0``2(M&&`^W0`9FB8>"%0``PTB)^4B+1R"+@`2````E__\`
+M`(/^`70^@_X!?P:%]G0?D,.#_@9T!X/^"'0ID,-(BU<@"X>,,```#0``@0#K
+M#TB+5R`+AXPP```-``!"`(F"!(```,-(BU<@"X&,,```#0``(`#KZ$B#[`B+
+MMXP#``#HB____TB#Q`C#2(/L&$B)'"1(B6PD"$R)9"002(G]B?/H`````$&)
+MQ(G&@>;___]_2(GOZ`````!(BT4@BU`PB=:!YO`#``#![@2%VW0-N"4````I
+M\-'H`<;K&X/^`78$_\[K$D2)YDB)[^@`````N`````#K*4B+32"!X@_\__^)
+M\,'@!"7P`P``"<*)43!$B>9(B>_H`````+@!````2(L<)$B+;"0(3(MD)!!(
+M@\08PTB#[`BX`````(/^"7\:2&/&2(G&2,'F!$@IQDB-M+<4+@``Z`````!(
+M@\0(PTB#[`A)B="X`````(/^"7\=2&/&2(G"2,'B!$@IPDB-E)<4+@``3(G&
+MZ`````!(@\0(PTB#["A(B1PD2(EL)`A,B60D$$R);"083(ET)"!)B?R)]4F)
+MU4B)^8/^`G03@_X"=P>#_@%T&>M(@_X#=`KK04&^"0```.L>0;X(````ZQ9!
+MO@````"#OQ@N````=`>X`````.MR26/62(G02,'@!$@IT$B-G($4+@``@WL$
+M`'0'N/_____K4+X\````2(G?Z`````"):P1-A>UU*L=##`L```#'0Q0"````
+MQT,8_____\=#'/\#``!FQT,@"@!FQT,B"@#K#DR)ZD2)]DR)Y^@`````1(GP
+M2(L<)$B+;"0(3(MD)!!,BVPD&$R+="0@2(/$*,-(BT\@BY<`+@``@>+_`P``
+MBX<(+@``P>`0)0``_P,)PHF1I````$B+3R"+EP0N``"!XO\#``"+APPN``#!
+MX!`E``#_`PG"B9&H````2(M/((N!K````"4`_/__BY<0+@``@>+_`P``"=")
+M@:P```##2(/L"+@`````@_X)=UZ)\DB)T$C!X`1(*=!,C82'%"X``$&#>`0`
+M=0>X`````.L\0<=`!`````"X_O___XGQT\`AAP`N```AAP0N```AAP@N```A
+MAPPN```AAQ`N``!,B<;H*?___[@!````2(/$",-(@^P(28GY08GR28G[2(N/
+MZ!,``+@`````@_X)#X>>`P``B?)(B=!(P>`$2"G03(V$AQ0N``!!@W@$``^$
+M>@,``$&#>!C_=3-(A<ET%0^W00(EH````+H?````/:````!T!;H/````N`$`
+M```YT',/`<"#R`$YT'+WZP1!BT`80HT\E0````"-MT`0``!)BTD@B<*!XO\#
+M``!!BT`<P>`*)0#\#P`)PD&+0!3!X!0E``#P#PG"B10.C;>`$```28M)($$/
+MMT`BP>`$)?````!!#[=0((/B#PG0#0`@"`")!`Z-E\`)``!)BT$@QP0"``@`
+M`$&#N7P#```#=Q&-EP`1``!)BT$@QP0"`````4&#>"0`=$Q"C325`````(V^
+MP`@``$F+22!!BU`D@>+___\`08M`*,'@&`G"B10/@<;`"0``28M)((L$#HG"
+M@\H!08-X*`!T"(G"@<H!`0``B10.08-X,`!T'4*-#)4`"0``28M1($&+0#`E
+M____``T````!B00108-X+`!T/4*--)4`````C8[`$```28M1($&+0"PE__\/
+M``T``!``B0010?9`#"!T$XV.P`D``$F+42"+!!&`S`*)!!%!]D`.`7070HT,
+ME0`1``!)BU$@BP01#0``(`")!!%!]D`.@'050HT,E0`1``!)BU$@BP01@,P"
+MB00108M`!(/X`G0*@_@#=#?II@```$*-#)7`"0``28M1((L$$0RBB001N0``
+M)0!!@[E\`P```W<%N0``)0%"C125`!$``.MM0HTTE0````"-CL`)``!)BU$@
+MBP01#6("``")!!&+!0`````K!0````!!BY.0,```B=$IP2L-`````,'A"H'&
+M``D``$F+42")R`T````!B006N0``!`!!@[E\`P```W<%N0``!`%"C125P`D`
+M`$F+02")#`)!]D`X`7070HT,E0`1``!)BU$@BP01#0``)`")!!%!]D`,`703
+MN`$```!$B='3X$$)@P`N``#K$;C^____1(G1T\!!(8,`+@``0?9`#`%T$[@!
+M````1(G1T^!!"8,$+@``ZQ&X_O___T2)T=/`02&#!"X``$'V0`P"=!.X`0``
+M`$2)T=/@00F#""X``.L1N/[___]$B='3P$$A@P@N``!!]D`,!'03N`$```!$
+MB='3X$$)@PPN``#K$;C^____1(G1T\!!(8,,+@``0?9`#`AT$[@!````1(G1
+MT^!!"8,0+@``ZQ&X_O___T2)T=/`02&#$"X``$R)QDR)S^AD^___N`$```!(
+M@\0(PXTTM0`(``!(BT<@BP0&PXTTM0`(``!(BT<@B10&N`$```##B?%(BU<@
+MN`$```#3X(F"0`@``+@!````PXT$M0`*``!(BU<@BP00B<>#YP-U&;@!````
+MB?'3X(N20`@``(7"N`$````/1?B)^,-!5%532(G]08GT2(M7(+@!````B?'3
+MX(F"@`@``+L`````1(GF2(GOZ`````"%P'04OPH```#H`````/_#@?L/)P``
+M?MU(BT4@QX"`"````````('[#R<```^>P`^VP%M=05S#BWPD&(M,)"B!XO\/
+M``"+1"0(P>`2"<*+1"0@P>`9"<*)T`T````!]L$!#T3"B<*!R@```"#VP1`/
+M1-")T`T``$``]L$$#T3"B<*!R@``@`#VP2`/1<*)1@A$B<+!XAJ)T`T``(``
+M]L$"#T70B58,@___=!:)^,'@#24`X`\`"=")1@R!3@@```!`N`$```##N```
+M``##@4X(````(,.%R702BT8,"=")PH#.$$6%P`]$PNL=187`=`Q!BT$(B48(
+MB58,ZP_'1@@`````B="`S!")1@S'1A0`````QT80`````+@!````PTB)\?9&
+M%`%U!K@/````PXM&%"7^'P``T>AFB0(/MT829HE"`L9"!`"+1A"H`74<J`)T
+M!,9"!`'V01`(=`2`2@0"]D$0!'0$@$H$!(M!""4``#P`P>@2B$(%BT$4)0#@
+M'P#!Z`V(0@:+01`E``\``(G&P>X(0(AR!XM!$"7P````P>@$B$((BT$0)0#P
+M``#!Z`R(0@G&0@H`QD(+`$"$]G0&C48!B$('@'H(`'0#_D((N`````##PY"`
+MCX`P```(@$X$"`^WAWXP``!FB08/MH>`,```B$8$#[:'@3```(A&!;@`````
+MPY!(BT<@QX"`0````/Q(DDB+1R#'@(!````D29(D2(M'(,>`@$```#D``"A(
+MBT<@QX"`0```)`@64TB+1R#'@(!```!Y!9CE2(M'(,>`@$```/_O'0!(BT<@
+MQX"`0```0+ZJ&DB+1R#'@(!```!451"^2(M'(,>`@$````<P#@!(BT<@QX"$
+M0````````,-(@^P(2(M'(,>`T)@``!8<``"Z`````$B+1R#'@("8``````$`
+M_\*#^@=^ZTB+1R"+@`"<``")Q\'O&(GZP>H$B?B#X`_!X`2)UPG'O@@```#H
+M`````$B#Q`C#2('LB````$B)_L=$)&#)____QT0D9,G____'1"1HR?___\=$
+M)&S)____QT0D<,+____'1"1`\O___\=$)$3R____QT0D2/+____'1"1,\O__
+M_\=$)%#T____QT0D(,#____'1"0DP/___\=$)"C`____QT0D+,#____'1"0P
+MNO___\<$)++____'1"0$LO___\=$)`BR____QT0D#++____'1"00L/___[D`
+M````2&/!BU2$8(F4ABA(``"+5(1`B92&/$@``(M4A"")E(902```BQ2$B92&
+M9$@``/_!@_D$?LN^`0```.@`````2('$B````,-(8_:)TDB--'(/MX1WMA<`
+M`,-!5T%6055!5%-(B?M!B?=)B=1)B<U-B<:Z*!0``$C'Q@````#H`````$R)
+M8Q!,B6L83(ES(&9$B;MX`P``9L>#>@,`````9L>#K`,``#\`QX.P`P``````
+M`,>#K#$```````#'@[`Q````````QX.\,0``````",>#Q#$``($'``#'@\PQ
+M````````QX/0,0``/S\_`,>#U#$``&0```#'@]@Q```"````QX/P,0``____
+M_\>#]#$``/_____'@_@Q``#_____2(V[!"X``+H&````2,?&`````.@`````
+MQH/\,0```%M!7$%=05Y!7\.Y`````$G'P`````!)Q\$`````2<?"`````$AC
+MP4B-%$!!.#P0=1%!.#01=PNX`0```$$Z-!)V#/_!@_D#=MNX`````,-!5T%6
+M055!5%532(/L"$F)]4F)U$B)S4V)QXG[OZA(``#H`````$F)QDB%P'4,0<<'
+M`@```.E+!@``#[?S38GY28GH3(GA3(GJ2(G'Z`````!,B?.Z`0```+X`````
+M3(GWZ`````"%P'1428M&((N`($````^VT(G0P>@$08F&?`,``(G0@^`/9D&)
+MAH`#``!!#[:V@`,``$$/MKY\`P``Z!;___^%P`^$5P0``+X`````3(GWZ```
+M``"%P'4,QP0D`P```.FC!0``28M&((N`&)@``&9!B8:"`P``08.^?`,```ET
+M%4&#OGP#```*=1-F08.^@`,```-W"$B)W^C9^___2(G?Z`````"%P'4,QP0D
+M#@```.E2!0``@[M\`P``!'832(M3((N"$$```(#,$(F"$$```$B+0R#'@`"8
+M```'````2(G?Z`````!FB8.$`P``#[?`)?````"#^#`/A*(```"#^#!_#H/X
+M$`^$E````(/X(.L8@_A@#X2&````@_A@?P6#^%#K!3V@````='5F@[N$`P``
+M`'5K@[M\`P``!747@;N``P``"0!#`'4+9L>#A`,``$8`ZTN#NWP#```'=`F#
+MNWP#```+=0MFQX.$`P``40#K+H.[?`,```IT'(.[?`,```ET$X.[?`,```IU
+M'&:#NX`#```#=PEFQX.$`P``8@"#NWP#```*=$"#NWP#```)=#>#NWP#```*
+M=0IF@[N``P```W8D#[>3A`,``(G0)?````"#Z#"#^#]W#HG0@^`/@_@$#XZT
+M`@``2(U4)`:^P0```$B)W^@`````A<`/A/P#``!F@7PD!@$P=PS'!"0%````
+MZ>X#```/MT0D!F9!B88H%```2(M#((N0$$```(/B&,'J`X/Z`G0M@_H#=!R#
+MNWP#```)=!^#NWP#```*=0IF@[N``P```W8,QP0D"@```.F?`P``2(U4)`:^
+M/P```$B)W^@`````A<`/A'X#```/MT0D!F9!B88J%```2(U4)`:^'````$B)
+MW^@`````A<`/A%<#``!F@WPD!@!T/$0/MV0D!D&!Y/#_``!!P>0,2(U4)`:^
+M&P```$B)W^@`````A<`/A"0#```/MT0D!D$)Q$&![,````#K!D&\0`,``$&]
+M`````+T`````13GE<RJ-M<````!(C50D!DB)W^@`````A<`/A.("```/MT0D
+M!D$QQ?_%1#GE<M9!@?W__P``=`S'!"0'````Z<4"``!F0<>&GA4```H`9D''
+MAJ@7```#`+T`````B>A(:\`T9D''A`:F%0``"P#_Q8/]"7;HO0````!(Q\8`
+M````2,?!`````(GH#[<41F9!B91&L!<```^W%$%F08F41JH7``!(:\`T3`'P
+M9L>`;!@```L`9L>`T!<```L`_\6#_0)VQ$F-MB@4``!(B=_H`````(7`#X0G
+M`@``9D&!OB@4```"4'=-@[M\`P``"G0<@[M\`P``"703@[M\`P``"G4R9H.[
+M@`,```-W*&9!QX:X%P``:`9F0<>&O!<``+`$9D''AL`7````@&9!QX:V%P``
+M`(!F08.^0A0```!T;0^W@X0#```E\````(/X$'5<2(M#(,>``)@```=```"_
+MT`<``.@`````2(G?Z`````!FB8.&`P``2(M#(,>``)@```<```"_T`<``.@`
+M````#[>#A@,``"7P````@_@@=`S'!"0-````Z5T!``!(C50D!KZ_````2(G?
+MZ`````"%P`^$/`$```^W1"0&9D&)ABP4``!FB8.X`P``2(G?Z`````"%P`^$
+M&`$``(.[?`,```IT'(.[?`,```ET$X.[?`,```IU%V:#NX`#```#=PU(B>9(
+MB=_H`````.M+@[M\`P``!W0)@[M\`P``"W4-2(GF2(G?Z`````#K+`^W@X0#
+M```E\````(/H,(/X/W<-2(GF2(G?Z`````#K"TB)YDB)W^@`````A<`/A)H`
+M``!)BX:P+@``2(F#:`,``$B)W^@`````0;T`````O0````!!O!\```!$B>8I
+M[DB-5"0&2(G?Z`````"%P'16#[=$)`9!`<6-5"T`B=%F#[9$)`=!B(0.^"T`
+M`/_"#[9$)`9!B(06^"T``/_%@_T"=KA%A>UT"4&!_?W_`@!U"<<$)`D```#K
+M%$B)W^AC]___2(G8ZR3'!"0(````387V=`A,B??H`````$V%_W0&BP0D08D'
+MN`````!(@\0(6UU!7$%=05Y!7\-32(G[Z`````!(@[MX+@```'0)2(G?_Y-X
+M+@``2(G?Z`````"Z`0```+X!````2(G?Z`````!(C;,H%```2(G?Z`````!(
+MB=_H`````%O#4TB#["#'1"0(`(```,=$)`P@F```QT0D$%55557'1"04JJJJ
+MJL=$)!AF9F9FQT0D')F9F9E!N@````!(C5PD"$F)XTECTDC!X@)$BPP31(G)
+M2(M'((L$`4&)!!-!N`````!$B<#!X!")QD0)QDB+1R")-`%(BT<@BQ0!N```
+M```Y\G5M0?_`08'X_P```'[20;@`````1(G)26/`BW2$$$B+1R")-`%(BT<@
+MBQ0!N``````YUG4Z0?_`08/X`W[926/"2,'@`HL,`TB+5R!!BP0#B0010?_"
+M08/Z`0^.8?___[]D````Z`````"X`0```$B#Q"!;PXGP]L0!=`QFQP(S$V;'
+M`=07ZR)`A/9Y(TBX``#_____``!(A8=`%```=!!FQP(("6;'`:P*N`$```##
+MN`````##055!5%532(/L"$B)_4F)_4F)_$B-GY`#``!FQT0D!@``9H&_*!0`
+M``!0=AU(C50D!K[)````_Y<H`P``N@````"%P`^$J@,```^WA80#```E\```
+M`(/X0'4*9D''A3X4`````&:#?"0&`'4N@[U\`P``!W4E9H.]@`,```AU&V;'
+M1"0&!0!F0<>%+A0```$`9D''A3`4```!`$&#O"2,`P``!G1$9D&!O"1Z`P``
+M97!U-T$/MY0DN`,``(U"G&:#^`%W#HU"!69!B80DN`,``.L79D&#O"2X`P``
+M074+9D''A"2X`P``0P#'0P0`````9D&#O3X4````=!G'0P0!````9D&#O2X4
+M````=0?'0P0#````9D&#O4(4````=`2#2P0$9D&#O404````="MF08&\)'H#
+M```1#G0>BU,$B="#R`B)0P1F08.],!0```!U"(G0@\@HB4,$9L=#$`@)#[>%
+MA`,``"7P````@^@P@_@_=C>#O7P#```'="Z#O7P#```+="6#O7P#```*=!R#
+MO7P#```)=!.#O7P#```*=1)F@[V``P```W<(9L=#$L0)ZP9FQT,2K`IFQT,,
+M,Q-FQT,.U!</MD,!@^"_@\B`B$,!N`````#V1"0&`G4A@[U\`P``!7<3@[U\
+M`P``!74/9H.]@`,```-V!;@!````P>`%#[93`8/BVPG"@\H(#[=$)`;1Z(/P
+M`8/@`0'`@^+]"<*(4P&#O7P#```&=@J)T(/($(A#`>L$@&,![X`+`V9!@[PD
+M@`,```%W"8.]?`,```MU9+H`````]D0D!@%U#/9#!`FX`0````]%T(TTE0``
+M```/MA.#XO,/MTPD!HG(P>@#@_`!@^`!P>`#"?()PH@3N@````#VP01U#/9#
+M!`FX`0````]%T,'B!`^V`X/@[PG0@\B@B`.`([^Z`````$&#O?`4````=`I!
+M@[WT%````'4%N@$````/MD,!@^#^"="(0P&`2P(/08.\)'P#```%=0QF08.\
+M)(`#```(=`M!@[PD?`,```5V!(!+`A`/MT0D!B7P`0``=`G!^`1FB4,(ZP9F
+MQT,("@!F]T0D!@#P=!4/MTPD!L'I#+@!````T^!FB4,*ZP9FQT,*@``/MX6$
+M`P``)?````"#Z#"#^#]W!H!+`F#K!(!C`I]F08.],A0```!T*DF-E"0`%```
+MO@\```!(B>__E2@#``"%P'000<>$)`04```!````@$L"@(.]?`,```0/EL`/
+MML!!B80D(!0``+H`````@[U\`P``!74*9H.]@`,```ET"8.]?`,```5V!;H!
+M````#[9#`X/@_@G0B$,#QT,4#P```+H!````B=!(@\0(6UU!7$%=PTB#[`A(
+MB>;H`````+@!````2(/$",.#_@%(Q\``````2,?"`````$@/1,)(B8?(````
+MPY!(@^P82(E<)`A(B6PD$$B)^TB)]4B+5R"+1@2)@BB```!(BU<@BT8,B8(L
+M@```2(M7((M&$(F",(```$B+5R"+1@B)@C2```#V1@,!="5(B>;H`````$B+
+M@^@3``!(QT`H`````$B+0R#'@""````````!2(M3((M%`(F"((```$B+7"0(
+M2(ML)!!(@\08PTB#["B)="0$BX>,`P``@_@!=`^#^`%R'(/X!G07@_@(=3#'
+M1"0,__\``,=$)!#__P<`ZQZ)\"L%`````,'@`XE$)`R)\"L%`````,'@`XE$
+M)!"-1@&)1"0(B=`E__^``8D$)$B)YN@`````2(/$*,-(BT<@QX`H@```````
+M`$B+5R"+@@2````-```$`"7__\__B8($@```2(M'(,>`((```/__``##28GX
+M9H-^$@!T0TB+5R"+@@2````-```0`(F"!(```$B+5R`/MT80B8(D@```2(M7
+M(`^W1A*)@CB```!(BU<@BT84P>`#B8(P@```ZQ5(BU<@BX($@```)?__[_^)
+M@@2```!(BU<@BP:)@BB```!(BT\@BX$@@```)0``@/\/MU8("<)F@WX8`'01
+M#[=&&(/`!,'@$"4``'\`"<*)D2"```!!BX#$,0``,.0/MU8:P>((@>(`_P``
+M"=!!B8#$,0``2(M7((F"&(```$0/MTX(1#E.''8$1(M.'$2+1@Q$.48<=@1$
+MBT8<13G!=06+3@3K`HL.2(M7((M&!(/H`\'@`R7__P<`#0``&`J)@M2```!(
+MBU<@C03-Z/___R7__P<`#0````J)@MB```!(BT\@00^WP42)PL'B$`G0B8'<
+M@```PTB#[!A(B5PD"$B);"002(G[2(G52(M'((FP`&```$B+1R#'@`A@```!
+M````N0(```"Z`P```+X,8```Z`````"Z`````(7`=!-(BT,@BX`$8```9HE%
+M`+H!````B=!(BUPD"$B+;"002(/$&,.0D)!(BW\@C0PVN`,```#3X(N7%$``
+M``G0B8<40```N`$```##2(M_((T,-K@#````T^#WT(N7%$```"'0B8<40```
+MN`$```##2(M_($2+AQA```"X_O___XGQT\!!(<"#X@'3XD$)T$2)AQA```"X
+M`0```,.)\;C_____@_X%=Q)(BT<@BX`<0```@^`OT^B#X`'#2(/L"$B+1R!$
+MBX@40```1(T$-K@#````1(G!T^`-`/`!`/?002'!P>8,00GQ08')`(```$2)
+MR`T```$`A=)$#T7(2(M'($2)B!1```"+MPPN``"!S@````'H`````$B#Q`C#
+M2(M'((N`"$```(/X`0^4P`^VP,-!N0````!)B?I(BT<@1(N`@````$'WP```
+M@`!T2XN0C````/?"`````;@``"``1`]%R$2)R`T``$``]\(````@1`]%R$2)
+MR`T``(``]\(````$1`]%R$2)R`T````"]\(````"1`]%R$B+1R!$BX#`````
+M08/X_W4,QP8`````N`````##1(G`);K8!0&)!D'WP```"`!T!PT```!`B09!
+M]L`%=`.##@%!]\#`!0``=%*##D!(BT<@BY#$````B=`E_P,``$$+@J1(``"!
+MX@``_P/!ZA`)PD&)DJ1(``!(BT<@BX#(````B<&!X?\#```)T24``/\#P>@0
+M"<A!B8*D2```0?;`('0/@[\@%````'0&@0X```!`1(G("P:)!JD```!`=$=$
+MB8<(%```2(M7((N"Q````(F'#!0``(N"R````(F'$!0``(N"S````(F'%!0`
+M`(N"T````(F'&!0``(N"U````(F''!0``+@!````PXN'#"X``,-)B?A$BX\,
+M+@``187)>1)(BT<@QT`D`````$B+1R"+0"2)\H'BNM@%`;D`````0/;&0'0T
+M08.XO"X```!T`X/*0$&#N,`N````=`.`S@%!@[C$+@```'0#@,J`08.XR"X`
+M``!T`X#.!(G0@\@'0/;&`0]%T/?&``#@`G1&@<H``(``B<@-`````??&```@
+M``]%R(G(#0```"#WQ@``0``/1<B)R`T````$]\8``(``#T7(B<@-`````O?&
+M`````@]%R(G0#0``"`#WQ@```$`/1=!(BT<@B9"@````2(M7((N"K````"7_
+M__]("<B)@JP```!!B;`,+@``A?9Y"TB+1R#'0"0!````1(G(PY`/MX>:`P``
+MPXGP9CNWF@,``',>2,'@!27@_Q\`2(M7((N$$!R(``"Z`0```&:%P'@%N@``
+M``")T,-F.[>:`P``<@:X`````,-(B?!(P>`%)>#_'P!(BU<@BXP0%(@``,>$
+M$`"(````````2(M7(,>$$`2(````````2(M7(,>$$`B(````````2(M7(,>$
+M$`R(````````2(M7(,>$$!"(````````2(M7(,>$$!2(```'````2(M7(,>$
+M$!B(````````2(M7(,>$$!R(````````@_D$=5'VA[\Q```(=$B-1D!(P>`%
+M)>#_'P!(BU<@QX00`(@```````!(BU<@QX00!(@```````!(BU<@QX00"(@`
+M``````!(BU<@QX00#(@```````"X`0```,-F.[>:`P``<@:X`````,-(A=)T
+M/40/MD(%0<'@"`^V0@1!"<`/MDH#P>$8#[9"`L'@$`G!#[9"`<'@"`G!#[8"
+M"<'1Z42)P,'@'PG!0='HZPM!N`````"Y`````$B)\DC!X@6!XN#_'P!(BT<@
+MB8P"&(@``$B+3R!$B<"`S(")A`H<B```N`$```##05=!5D%505154TB#[!A(
+MB?U(B=-)B<I!B?5)B?](C8^0`P``187`N@````"XJJJJJHG&#T3R9D0[:0H/
+M@X4````/M@.#^`5W?8G`_R3%`````$&[!0```.MV]D$!('1F0;L&````ZVA!
+MNP0```#VA[\Q```(=%E!#[?%@\!`#[=1"KD`````.=`/C1`#``#K/V:#>P($
+M=BYF@WL"!7<(0;L`````ZREF@WL"#7<(0;L!````ZQI!NP,```#K$D&[!P``
+M`.L*N0````#ISP(``$0/MF,$#[9#!<'@"$$)Q`^V0P;!X!!!"<0/MD,'P>`8
+M00G$03'T#[9#"<'@"`^V4PA!B=9!"<9!,?9!@>;__P``1`^V0PH/MD,+P>`(
+M00G`#[9##,'@$$$)P`^V0PW!X!A!"<!!,?`/MD,/P>`(#[93#D&)T4$)P4$Q
+M\4&!X?__```/MGL0#[9#$<'@"`G'#[9#$L'@$`G'#[9#$\'@&`G',?=F@WL"
+M#7<&@>?_````08/[!`^%LP$``/:%OS$```@/A*8!``!!C45`9HD$)$$/M_6)
+M\L'B!4ACTDB+32!$B>#WT(F$"@"(``!(BTT@1(GP]]")A`H$B```2(M%($2)
+MA`((B```2(M%($2)C`(,B```2(M%((F\`A"(``!(BT4@QX0"%(@```0```!,
+MB=)(B>_H``````^V<Q0/MD,5P>`("<8/MD,6P>`0"<8/MD,7P>`8"<8/MDL8
+M#[9#&<'@"`G!#[9#&L'@$`G!#[9#&\'@&`G!0?:'P#$```1T0P^V0Q_!X`@/
+MME,>08G000G`#[9#'<'@"`^V4QQ!B=%!"<$/MGL@#[9#(<'@"`G'#[9#(L'@
+M$`G'#[9#(\'@&`G'ZQ&_`````$&Y`````$&X`````(L4)$C!X@6!XN#_'P!(
+MBT4@B;0"`(@``$B+12!$B80"!(@``$B+12")C`((B```2(M%($2)C`(,B```
+M2(M%((F\`A"(``!(BT4@QX0"%(@```<```!(BT4@QX0"&(@```````!(BT4@
+MQX0"'(@```````!,B>A(P>`%)>#_'P!(BU4@1(FD$`"(``!(BU4@1(FT$`2(
+M``#K74$/M_6)\,'@!4B82(M5($2)I!``B```2(M5($2)M!`$B```2(M5($2)
+MA!`(B```2(M5($2)C!`,B```2(M5((F\$!"(``!(BU4@1(F<$!2(``!,B=)(
+MB>_H`````+D!````B<A(@\086UU!7$%=05Y!7\.0D$B#[`A(B?!(C;?X+0``
+MN@8```!(B<?H`````$B#Q`C#2(/L"$B!Q_@M``"Z!@```.@`````N`$```!(
+M@\0(PTB#[`A(B?!(C;<$+@``N@8```!(B<?H`````$B#Q`C#4TB)^TB-OP0N
+M``"Z!@```.@`````2(M+(`^VDP0N```/MH,%+@``P>`("<(/MH,&+@``P>`0
+M"<(/MH,'+@``P>`8"<*)D>"```!(BTL@#[:3"2X``,'B"`^V@P@N```)T(F!
+MY(```+@!````6\-F.;>X`P``=0>X#````.L4@+\J%`````^8P`^VP(T$Q0,`
+M``!(A=)T`HD"N`````##2(GZN`````!F@[\^%````'04N`$```!F@[\N%```
+M`'4%N$,```!F@[]"%````'0#@\@$9H._1!0```!T&V:!NGH#```1#G00@\@(
+M9H._,!0```!U`X/((,-(@^P82(D<)$B);"0(3(ED)!!(B?L/MX<`%```08G$
+M08/D'$'!_`*)Q8/E`M']1(GF_Y=``P``2(M3((N"`)@``(#,((F"`)@``$2)
+MYDB)W_^32`,``(GJ.>AU"(7M#Y3`#[;01(GF2(G?_Y-8`P``2(L<)$B+;"0(
+M3(MD)!!(@\08PTB+5R"+@A!````EG__Q_X/F!PL$M0````")@A!```##2(/L
+M&$B)7"0(2(EL)!!(B?N)U4B-O_XM``"Z!@```.@`````2(M+(`^VD_XM```/
+MMH/_+0``P>`("<(/MH,`+@``P>`0"<(/MH,!+@``P>`8"<*)D0B```!(BTL@
+M#[:#`RX``,'@"`^VDP(N```)PHGH)?\_``#!X!`)PHF1#(```$B+7"0(2(ML
+M)!!(@\08PTB+5R"+LDR```"+@E"```"+DDR```"-2`$Y\@]"P4C!X"")TD@)
+MT,-(BT<@BX!,@```PTB+5R"+@B"````-`````8F"((```$B+5R")@B"```##
+M2(N'Z!,``$B%P'1I]D`"('1C0;@`````N@`````[%G,=2&/"#[9$,`2$P'D+
+M@^!_1#C`<@-!B<#_PCL6<N-(BU<@BXH$@```183`=!=$B<#0Z#P"=PZ)R`T`
+M```"B8($@```PTB+5R")R"7____]B8($@```D,-(BT<@BX!DF```B<'!Z1.!
+MX?\!``#VQ0%T!H'Q`/[__TB+5R"+@E"```"+DDR````QT#'(PTB+1R"+@"!`
+M```E_P```(G"@^(/N0````#!Z`0YAWP#``!U#F8YEX`#``!U!;D!````B<C#
+M2(M'((N`D(````$&2(M'((N`C(````%&!$B+1R"+@)2````!1@Q(BT<@BX"(
+M@````48(2(M'((N`F(````%&$,.X`0```,-(BT<@BX`<G```)?\```##2(M'
+M((N`6(```(/@!\-(BT<@@^8'B;!8@```PXN'K#$``,-(@^P(2(N7Z!,``$B%
+MTG4-B;>L,0``N`$```#K!>@`````2(/$",.X`0```,-(@^P82(D<)$B);"0(
+M3(ED)!!(B?V)\TF)_(/^!78.OO__``#H`````#G#=A-!QX0D\#$``/____^X
+M`````.L?B=Y(B>_H`````$B+52")@G`0``")G?`Q``"X`0```$B+'"1(BVPD
+M"$R+9"002(/$&,-(@^P(2(M'((NP<!```('F__\``.@`````2(/$",-(@^PH
+M2(D<)$B);"0(3(ED)!!,B6PD&$R)="0@2(G]08GVOO\_``#H`````$$YQG81
+MQX7T,0``_____[@`````ZSA,BV4@08N<)!2```"!XP#`__]$B?9(B>_H````
+M`"7_/P``"<-!B9PD%(```$2)M?0Q``"X`0```$B+'"1(BVPD"$R+9"003(ML
+M)!A,BW0D($B#Q"C#2(/L"$B+1R"+L!2```"!YO\_``#H`````$B#Q`C##[:'
+MOS$``(/P`8/@`<.%]G0A2(M7((N"!(```"7____^B8($@```@:>\,0``____
+M_NL?2(M7((N"!(````T````!B8($@```@8^\,0```````;@!````PTB#["A(
+MB1PD2(EL)`A,B60D$$R);"083(ET)"!(B?U!B?:^_S\``.@`````03G&=A''
+MA?@Q``#_____N`````#K.TR+92!!BYPD%(```('C__\`P$2)]DB)[^@`````
+MP>`0)0``_S\)PT&)G"04@```1(FU^#$``+@!````2(L<)$B+;"0(3(MD)!!,
+MBVPD&$R+="0@2(/$*,-(@^P(2(M'((NP%(```('F``#_/\'N$.@`````2(/$
+M",-!B=")\;@,````9H/Y?W<P2(M7(`^WP8F"``0``$B+5R!%A<`/E<`/ML")
+M@@0$```/M\%$B(0'*#$``+@`````PTB#[!A(B5PD"$B);"002(G[B?5`B+?P
+M$P``A=(/A/8```!`A/8/A.T```!(BX?H$P``#[=``B5``0``/4`!```/A=(`
+M``"^`0```.@`````B<=(BX/H$P``]D`#0'0G0`^V]8GXT>@/K_"--':!Q@0!
+M``!`#[;-#Z_(C01)C8P`K`T``.M72(N#Z!,``&:#>`(`>2A`#[;UB?C!Z`(/
+MK_"--':!QM(```!`#[;-#Z_(C01)C8P`2`T``.LA0`^V]0^O]XTT=H'&:`$`
+M`$`/MLT/K\^-!$F-C`!@#@``0`^VU0^OUXT44H'"Z`,``('B_S\``$B+0R")
+ML'`0``!(BT,@B8BP$```2(M+((G0P>`0"=")@12```!(BUPD"$B+;"002(/$
+M&,-(@^P(B[>,`P``Z`````!(@\0(P[@`````@_X&=!>`OTL4````=`Z#O]@Q
+M```!=P6X`0```,-32(G[Z`````"%P`^$00$``$B+0R#'@'"8```?````2(M3
+M(`^W@X0#```E\````(/H,(/X0!G`@^#\@\`8B8+XF0``2(M3((N"'(```"5_
+MP/__#(")@AR```!(BT,@QX`$@0``/0```$B+4R"+@A!```"#R`*)@A!```"#
+MNWP#```'="Z#NWP#```+="6#NWP#```*=!R#NWP#```)=!.#NWP#```*=5AF
+M@[N``P```W=.2(M#(,>`=)@``"8```!(BT,@QX!XF```#0```$B+0R#'@/"9
+M```'````2(M#(,>`])D``#\```!(BU,@BX(00```)?____P-`````NM'2(M#
+M(,>`=)@```H```!(BT,@QX!XF```#````$B+0R#'@/"9```#````2(M#(,>`
+M])D``"````!(BU,@BX(00```#0````.)@A!```#IR@```$B+4R"+@A!````E
+M_____(F"$$```$B+4R"+@A!```"#X/V)@A!```!(BT,@QX!PF```'P```$B+
+M0R#'@'28``!_````2(M#(,>`>)@```X```!(BT,@QX#PF0``#````$B+0R#'
+M@/29``#_````2(M3(`^W@X0#```E\````(/H,(/X0!G`@^#\@\`2B8+XF0``
+M2(MS((N&'(```"5_P/__#[>3A`,``('B\````(/J,(G!@<F`$P``#8`/``"#
+M^C\/1L&)AAR```!;PU-(B?OH`````(7`#X38````2(M3((N"$$```"7____\
+MB8(00```2(M3((N"$$```(/@_8F"$$```$B+0R#'@`2!```!````2(MS((N&
+M'(```"5_P/__#[>3A`,``('B\````(/J,(G!@<F`$P``#8`/``"#^C\/1L&)
+MAAR```!(BT,@QX!PF```'P```$B+0R#'@'28``!_````2(M#(,>`>)@```X`
+M``!(BT,@QX#PF0``#````$B+0R#'@/29``#_````2(M3(`^W@X0#```E\```
+M`(/H,(/X0!G`@^#\@\`8B8+XF0``6\.Z`````$C'QP`````/MP:)P68[!0``
+M``!W"__"2&/"9CL,AW;U2&/"#[\$A0````##2(/L&$B)7"0(2(EL)!")TTB)
+MS4B)^4B-EY`#``"#_AT/AR("``")\/\DQ0````"#^P)T)H/[`@^"!`(``(/[
+M!`^"B0```(/[!0^&\@$``(/[?P^$Z0$``.MU]D(!(.DT`0``N`````"%VP^$
+MX@$``(/[`74.BX>\,0``P>@;Z7<!``"%VW0*@_L!=!'I(P$``/9"`1`/E<#I
+MMP```(N!P#$``,'H`NE2`0``@[]\`P``!0^'B0$``(._?`,```5U#F:#OX`#
+M```'#X=R`0``N`T```#I>0$``+@`````A=L/A&P!``"#^P$/A<4```!(BT<@
+MBX`(H@``P>@-Z?D```"+AZ@#``#I,@$``+@`````A=L/A#D!``"#^P$/A1\!
+M``"#O\PQ````ZR:%VW0'@_L!=`SK)F:#OSX4````ZQ%(N```_____P``2(6'
+M0!0```^4P`^VP.GV````N`$```#I[````+@`````A=L/A-\```"#^P%U/(N'
+MO#$``/?0P>@?Z<H```"%VW0'@_L!=!CK(?9"`A"Z`````+@-````#T7"Z:D`
+M``"+A\`Q``#!Z`/K1K@,````Z90```"+A]`Q``"#X#_K=8N'T#$``"4`/P``
+MP>@(ZV6#^P%T%K@`````@_L!<FJX#````(/[!G=@ZPZ+AQ`R``"#\`&#X`'K
+M4.@`````2(G"N`$```!(A=)T/H/[!G<HB=C_),4`````#[9"">L6#[9"#.L0
+M#[9"#>L*#[9""^L$#[9""HE%`+@`````ZPI(B>F)VN@`````2(M<)`A(BVPD
+M$$B#Q!C#2(/L"$F)^DR-CY`#``"#_AT/AW`!``")\/\DQ0````"%R70/@8^\
+M,0``````".E-`0``@:>\,0``____]^D^`0``0?9!`1!U"K@`````Z3D!``"%
+MR70)@Z?`,0``^^L'@X_`,0``!$B+5R!!BX+`,0``B8(@@0``Z0,!``!(BT<@
+MB[`(H@``B?*`SB")\(#DWX7)B=8/1/!(BT<@B;`(H@``Z=D```")CZ@#``!(
+MBT<@B8A(@```Z<0```"%R0^5P`^VP(F'S#$``.FQ````A<ET#X&/O#$`````
+M`(#IG@```(&GO#$``/___W_ICP````^_A^PQ```!P8/Y0+@_````#T/(@_X:
+M=0V)R`N'T#$``(/@/^L8BY?0,0``@>(`/P``B<@E`#\``,'H"`G008F"T#$`
+M`$B+5R!!BX+0,0``B8+H@```ZS>X`````(/Z!G<YB="+-(4`````B<KH````
+M`.LG0?9!`A!T&X7)=`F#C\`Q```(ZP>#I\`Q``#WN`$```#K!>@`````2(/$
+M",-(@^P(Z`````"%P`^5P`^VP$B#Q`C#D)!54TB#[`A(B?N%]G1E2(M7((N"
+M!$```"7___S_B8($0```OPH```#H`````+TH````2(M#((N`$$```*D```$`
+M="6_,@```.@`````2(M3((N"!$```"7___S_B8($0```_\UUS.L$A>UU![@`
+M````ZQI(BU,@BX($@```)?__^_^)@@2```"X`0```$B#Q`A;7<-(BU<@BX($
+M@```#0``!`")@@2```"%]G0:2(M7((N"!$```"7___S_#0```0")@@1```##
+M2(M7((N"!(````T```0`B8($@```A?9T&DB+5R"+@@1````E___\_PT```(`
+MB8($0```PTB#[!A(B1PD2(EL)`A,B60D$(GS2(G]0;P!````@_X!=!B#_@%R
+M!X/^`G07ZQZ)UNC0_O__08G$ZQF)UNA7____ZQ")UNB"____ZP>X`````.L)
+MB9VH,0``1(G@2(L<)$B+;"0(3(MD)!!(@\08PTB+1R"+@`1````E```#`,'H
+M$,.0D)!3@_X(#X2'````@_X(=R*#_@(/A((```"#_@)W"H/^`70XZ:````"#
+M_@1T7.F6````@?X``0``='.!_@`!``!W!X/^('1=ZW^!_@`"``!T98'^``0`
+M`'1FZVU(Q\,`````2(._Z!,```!T8TB+A^@3``#V0`-`=3U(BX?H$P``9H-X
+M`@!Y2.LV2,?#`````.L]2,?#`````.LT2,?#`````.LK2,?#`````.LB2,?#
+M`````.L92,?#`````.L02,?#`````.L'N`````#K"TB)WN@`````2(G86\.0
+M2(M'((M`#,-(BT<@B7`,PTB+1R#'0`@$````PTB#[`A(BT<@QT`((````+D`
+M````N@0```"^"````.@`````A<`/E<`/ML!(@\0(PU-(B?M(BU<@BX)(@```
+M@^#?B8)(@```Z`````"^`0```$B)W^@`````6\-(@^P(2(M7((N"2(```(/(
+M((F"2(```.@`````2(/$",-(BT<@B;!`@```2(M'((F01(```,.X`````(/^
+M/W='@_X?=B!(BU<@1(N"1(```(U.X+C^____T\!$(<")@D2```#K'4B+5R!$
+MBX)`@```N/[___^)\=/`1"'`B8)`@```N`$```##N`````"#_C]W1X/^'W8@
+M2(M7($2+@D2```"-3N"X`0```-/@1`G`B8)$@```ZQU(BT<@1(N`0(```+H!
+M````B?'3XD0)PHF00(```+@!````PTB+5R"+@CR```"+B@R!``")PH#.`O;!
+M(`]%PHG"@,X!]\$```("#T7"PTB+5R!`#[;&B8(\@```N`````#WQ@`"``"Z
+M(`````]%PHG"@<H```("]\8``0``#T7"2(M7((F"#($``(7`=`Q(BU<@BT(T
+M@\@0ZPI(BU<@BT(T@^#OB4(TP\=&"`````")T"7_#P``B48,]L$@=`:`S"")
+M1@S'1A0`````QT80`````+@!````PTB#[`A-B<CV1A0!=0JY#P```.GS````
+M]D$4`7442(M'((M`#+D/````.=`/A-D````/MT809B7_#V9!B0"+1A0E``#_
+M?\'H$&9!B4`"0<9`!`"+1A`E``#P#\'H%$&(0`8\@'4%0<9`!@"+1A3VQ`%T
+M#B4`_@``P>@)08A`!^L%0<9`!_^+1A`E`(`/`,'H#T&(0`B+1A`E````\,'H
+M'$&(0`F+1A#!Z`R#X`%!B$`*BT84J`)U3J@$=`=!@$@$`>M#]D84$'0E08!(
+M!`(/MD8508A`!8._%#(```!U)X/X!70B3(G&Z`````#K&/9&%`AT!T&`2`0(
+MZPOV1A0@=`5!@$@$$+D`````B<A(@\0(PY"005=!5D%505154TB#[$A(B?V)
+M="1`28G4B4PD/$R)1"0P2(E\)"!!O0`````/MT("]L0!=`>I@````.L,#[="
+M`L'H!X/P`:@!#X5D`@``00^W1"0"J"!T!*A`ZPY!#[=$)`+!Z`:#\`&H`0^%
+M0@(``+H!````O@````!(B>_H`````+H`````A<`/A*T,``!,B>9(B>_H````
+M`$B)1"08N@P```!(A<`/A'X,``"#?"1`!G0?@WPD0`9W#8-\)$`!#X?L`0``
+MZPN#?"1`"`^%WP$``,=$)!0`````@WPD/`!T*$B+12"+@$`1``")1"042(MT
+M)!A(B>_H`````+X`````2(GOZ`````"#O7P#```'="Z#O7P#```+="6#O7P#
+M```*=!R#O7P#```)=!.#O7P#```*=5UF@[V``P```W=3@WPD/`!T3$B#O>@3
+M````=$)(BXWH$P``00^W!"1F.P%T,4$/MU0D`H'B\`$```^W00(E\`$``#G"
+M=1A,B>9(B>_H`````+H!````A<`/A:@+``!(BT4@BX!8@```B40D$(7`N`$`
+M```/140D$(E$)!!(BU4@BX($@```)0``(`*)1"0(BX(00```)6``_@")1"0,
+MBX(40```B40D+(N2&$```(E4)"B+="1`2(GOZ`````!(B>_H`````$R)YDB)
+M[^@`````N@,```"%P`^$%PL``$$/MT0D`B7P`0``/4`!``!T3#U``0``?R`]
+MP````'1C/<````!_"3V@````=$OK;CW0````=%;K93W`"```=$,]P`@``'\'
+M/5`!``#K##U`"0``=`D]4`D``'0,ZT#'1"0$`0```.L(QT0D!`(```#'!"0!
+M````ZR_'1"0$`P```.L2QT0D!`0```#K",=$)`0%````QP0D`@```.L*N@P`
+M``#I;PH``$B+12#'@`"8```'````NP````!)Q\<`````1(MT)`1(8\-(C01`
+M08L,QTB+52!)C01&08L$AXD$$4'_Q4'VQ3]U"K\!````Z`````#_PX/[&';,
+MNP````!(8\.+%,4`````@WPD/`!T%HV"X'___X/X&'8QC8(L?___@_@(=B:)
+MT4B+52!(8\.+!,4`````B0010?_%0?;%/W4*OP$```#H`````/_#@?O#````
+M=JE$B>F+%"2+="0$2(GO2(M<)"#_DX`N``!!]D0D`T!U"69!@WPD`@!Y"TR)
+MYDB)[^@`````9H.]@@,``$$/ANT```!(BT4@QX`LF````J`"`&9!@3PDM`EU
+M+TB+1"0@#[:02A0```^W@%04```IPDACPDAIP&=F9F9(P>@@T?C!^A^)QF8I
+MUNL=2(M4)"`/MH)*%```2)A(:<!G9F9F2,'H((G&T>Y!#[=$)`(ET````#W`
+M````=3%(BTT@2(M<)"`/MI-*%```]]K!X@:!XL`/``")\,'@$O?8)0``_``)
+MPHF13)D``.L.2(M%(,>`3)D```````!(BU4@BX(HH@``@.3]B8(HH@``2(M5
+M((N"**(``"7_`_[_@,P(B8(HH@``2(M%(,>`8(````\```!F@[V"`P``0G8.
+M2(M%(,>`5*(```````!(BT4@QX!XF```#@```(.]?`,```IT'(.]?`,```ET
+M$X.]?`,```IU.F:#O8`#```#=S"Y`0```&9!@3PDG@ET"69!@3PDHPEU!;D`
+M````2(M5((N"3*(``#G(=`:)BDRB``!(C50D1$B+="082(GOZ`````"Z`P``
+M`(7`#X3W!P``@WPD0`9T$8.]M`,```!T"$B)[^@`````#[=4)`1(C4PD1$B+
+M="082(GO2(M<)"#_DY@N``"Z`P```(7`#X2U!P``0?9$)`)`=%^#O7P#```*
+M="R#O7P#```)=".#O7P#```*=0IF@[V``P```W802(M$)"!F@;@H%````E!V
+M'T$/MT0D`B6@````/:````!T#4B+="082(GOZ`````!,B>9(B>_H`````$B+
+M="082(GOZ`````"Z`P```(7`#X0T!P``@WPD/`!T#DB+12"+5"04B9!`$0``
+M2(M-($B+7"0@#[:3^"T```^V@_DM``#!X`@)P@^V@_HM``#!X!`)P@^V@_LM
+M``#!X!@)PHF1`(```$B+32`/MI/]+0``P>((#[:#_"T```G0"T0D"`N#O#$`
+M``T``(``B8$$@```BW0D0$B)[^@`````2(M-(`^VDP0N```/MH,%+@``P>`(
+M"<(/MH,&+@``P>`0"<(/MH,'+@``P>`8"<*)D>"```!(BTT@#[:3"2X``,'B
+M"`^V@P@N```)T(F!Y(```$B+52"+@A!````+1"0,B8(00```2(M%((M4)"R)
+MD!1```!(BT4@BTPD*(F(&$```$B+12"+7"00B9A8@```2(M-($B+1"0@#[:0
+M_BT```^V@/\M``#!X`@)PDB+7"0@#[:#`"X``,'@$`G"#[:#`2X``,'@&`G"
+MB9$(@```2(M-(`^VDP,N``#!X@@/MH,"+@``"=")@0R```!(BU4@BX/$,0``
+MB8(8@```2(M%(,>`@````/____](BW0D&$B)[^@`````N@,```"%P`^$B04`
+M``^VM?`3``"Z`0```$B)[^@`````3(GF2(GOZ``````/MX6$`P``)?````"#
+MZ#"#^#]W0$B+A>@3``#V0`-`=0=F@W@"`'DL2(N%Z!,``/9``T`/E,`/ML"#
+MP`Q(BTT@BY$DF```@^+P@^`/"<*)D228``!(BT4@BX`4F0``B<*!XO\_``!!
+M]D0D`B!T'8T$E0````")P+JCBRZZ2`^OPDC!Z"")PL'J!.L4B="ZS<S,S$@/
+MK\)(P>@@B<+!Z@-(BT4@QX`<F````0```$B+A>@3``#V0`-`=`:-?!)DZQI(
+MBX7H$P``9H-X`@!Y"8T\E60```#K`XUZ9.@`````2(M%($2+J`B8``#'@`B8
+M````.```NP$```!(BT4@BX`DG```J!!T(;_(````Z`````")V/_#@_@3?PY(
+MBT4@BX`DG```J!!UWTB+12!$B:@(F```2(M5((N"8)@``(/(`XF"8)@``$$/
+MMT0D`B6@````/:````!T1TB+1"0@@[BP,0```G0Y2(M5((N"()D``(#,\(F"
+M()D``$B+52"+@B"9```-```!`(F"()D``$B+5"0@QX*P,0```0```.L/2(M,
+M)"#'@;`Q````````2(GOZ`````"[`````+X!````C02=`````$B82(M]((GR
+MB=G3XHF4.``0``#_PX/["7[?2(M<)"#'@Z1(````````NP````!F@[V8`P``
+M`'07B=Y(B>_H`````/_##[>%F`,``#G#?.E(BT0D(,>`#"X``&4)"`"#?"1`
+M!G4*QX`,+@``91D(`$B+52!(BTPD((N!#"X``(F"H````$B+52"+@JP````-
+M```'`(F"K````(.]!!0```!T"$B)[^@`````N0````"Z`0```+Y@F```2(GO
+MZ`````"+="1`2(GOZ`````!(BU4@BX(@@```)?__?_Z)@B"```"#O7P#```%
+M=Q.#O7P#```%=29F@[V``P``!W8<2(M%(,>`&($``*H``0!(BT4@QX`<@0``
+M$#(``$B+12#'@`B!``!2````0?9$)`,!=`Y(BUPD(`^V@T84``#K#$B+5"0@
+M#[:"1Q0```^^T$R)YDB)[^@`````08G!2(M,)"!$BX'0,0``08/@/P^_@>PQ
+M``!$B<$IP4B+7"08#[Y3!HT$$#G11`]'P`^^0P4!P$$/OM&)QBG603GP=A!(
+MBU0D(`^_@NPQ``!$C00P2(M,)""+N=`Q``"!YP`_``#![P@/OX'L,0``B?DI
+MP4B+7"08#[Y3!HT$$#G1#T?X#[Y#!0'`00^^T2G0B<(YQW8/2(M,)"`/OX'L
+M,0``C3P02(M<)""+L]`Q``"!Y@``/P#![A`/OX/L,0``B?$IP4B+7"08#[Y3
+M!HT$$#G1#T?P#[Y#!0'`00^^T2G0B<(YQG8/2(M,)"`/OX'L,0``C30008/X
+M0+@_````1`]#P(/_0`]#^(/^0`]#\$2)PH/B/XGXP>`()0`_```)PHGPP>`0
+M)0``/P`)PDB+12")D.B```!(BUPD((.[P#$```!T$$B+52"+@\`Q``")@B"!
+M``!(BT0D((.X\#$``/]T#HNP\#$``$B)[^@`````2(M4)""#NO0Q``#_=`Z+
+MLO0Q``!(B>_H`````$B+3"0@@[GX,0``_W0.B['X,0``2(GOZ`````"#O:@#
+M````=!!(BU4@BX6H`P``B8)(@```BUPD0(F=C`,``(-\)#P`='%(BT0D&/9`
+M!`)U!(!@!/Y(BU0D&`^W0@)F08E$)`(/MD($08A$)`0/MD(%08A$)`4/MD(&
+M08A$)`8/MD('08A$)`=(BX7H$P``2,=`,`````!(BYWH$P``2(GOZ`````!(
+MB4,HO@$```!(B>_H`````+H!````ZQ%(BTPD,(,Y`'0"B1&Z`````(G02(/$
+M2%M=05Q!74%>05_#B[>T`P``0/;&`W0@2(M/((N11)D``('B____WXGP@^`!
+MP>`="<*)D429``")\(/@#'0KJ`1U%$B+5R"+@M"```"#X..)@M"```##2(M7
+M((N"T(```(/('(F"T(```)##2(/L"/^7D"X``(7`#Y7`#[;`2(/$",-!5T%6
+M055!5%532(/L"$B)_4F)]$&]`0```$F)_^@`````28G&NP````!F@[V8`P``
+M`'0;B=Y(B>_H`````(7`=1W_PP^WA9@#```YPW+EN@````!%A>T/A+L!``#K
+M"$&]`````.OH2(M%(,>`?)D```$```"[`````$B+12"+@""<``"%P'43OP4`
+M``#H`````/_#@_MC=N'K!8/[8W8*N@````#I;@$``$R)]DB)[^@`````N@``
+M``"%P`^$5@$``$B+12"+@!29```E_S\``$'V1@(@=!?!X`*)P+JCBRZZ2`^O
+MPDC!Z"#!Z`3K$HG`NLW,S,Q(#Z_"2,'H(,'H`XUX9.@`````2(GB3(GV2(GO
+MZ`````"Z`````(7`#X3T````2(M%(,>`?)D```````!!]D8"0'19@[U\`P``
+M"G0H@[U\`P``"70?@[U\`P``"G4*9H.]@`,```-V#&9!@;\H%````E!V'4$/
+MMT0D`B6@````/:````!T"TR)]DB)[^@`````3(GF2(GOZ`````!(BU4@BX)@
+MF```@\@"B8)@F```0?9&!`)U!4&`9@3^00^W1@)F08E$)`)!#[9&!$&(1"0$
+M00^V1@5!B$0D!4$/MD8&08A$)`9!#[9&!T&(1"0'2(N%Z!,``$C'0#``````
+M2(N=Z!,``$B)[^@`````2(E#*+X!````2(GOZ`````"Z`0```(G02(/$"%M=
+M05Q!74%>05_#2(M'((N`!(```"7___S_@_X!=$^#_@%_!H7V="F0PX/^!G0'
+M@_X(=#J0PTB+5R`-```!$(F"!(```$B+5R"+0A2#X-_K&4B+5R`-```"$(F"
+M!(```$B+5R"+0A2#R"")0A3#2(M7(`T````0B8($@```PTB#[`B^`@```.@>
+M!0``2(/$",-32(G[N@$```"^`````.@`````N@````"%P'0/OA,```!(B=_H
+M\`0``(G"B=!;PTB#["A(B5PD"$B);"003(ED)!A,B6PD($B)^TB)];X3````
+MZ,($``"Z`````(7`#X0``@``N@$```"^`````$B)W^@`````N@````"%P`^$
+MX0$``+X`````2(G?Z(D$``"Z`````(7`#X3'`0``2(7M#X2Y`0``@[M\`P``
+M"G0<@[M\`P``"703@[M\`P``"G4O9H.[@`,```-W)4&]"`````^W10*H('57
+M)=````"Y!````#W`````#X6L````ZT`/MX.$`P``)?````"#Z#"#^#]V$H.[
+M?`,```=T"8.[?`,```MU0T&]"`````^W10*H('4,)=`````]P````'4'N>L`
+M``#K8_9%`T!T![GJ`0``ZU9F@WT"`'D'N>H"``#K2+GJ````ZT%!O0`````/
+MMT4"J"!U#"70````/<````!U![FK````ZR#V10-`=`>YJ@$``.L39H-]`@!Y
+M![FJ`@``ZP6YJ@````^W10*H0'06J"!U#"70````/<````!U!D&#S03K#D2)
+MZ(/(`?9%`D!$#T3H1(GH@\@"]D4#`40/1.CV10(0#Y7`1`^VX$>-)&1(BT,@
+MBY!\F```#[=%`J@@=0PET````#W`````=3!(BT,@1(F@!)@``$B+0R!$B:@`
+MH@``.<IT1$B+0R")B'R8``"_+`$``.@`````ZRXYRG042(M#((F(?)@``+\L
+M`0``Z`````!(BT,@1(F@!)@``$B+0R!$B:@`H@``N@$```")T$B+7"0(2(ML
+M)!!,BV0D&$R+;"0@2(/$*,-!5D%505154TB)^TF)]DB)U4F)_<<"`````.@`
+M````28G$N`````!-A>0/A&$"``"#N[`Q```"=`F#N[`Q````=0?'10`!````
+M08.]L#$```$/A4@!``!(BT,@BX`@F0``J0```0`/A3,!``!!QX6P,0``````
+M`,=%``$```"^`````$B+0R"+N!"<``"+B!2<``!$BX`8G```A?]T!(7)=1Q(
+MBU,@BX(@F0``#0```0")@B"9``#_QH/^"7[%B?C1Z(G*T>H!T(G.P>X'B<'!
+MZ0</A!T!``"#_@$/CA0!``!$B<#WV$0/OL!$B<"9]_E!B<"#^.!]"$&XX/__
+M_^L,@_@@N!\```!$#TW`B?BZ`````/?VC7"`@_[P?0>^\/___^L+@_X0N`\`
+M```/3?!(BTL@BY$@F0``@>(?^/__1(G`P>`%)>`'```)PHF1()D``$B+2R"+
+M@2"9``"#X.")\H/B'PG0B8$@F0``2(M3((N"()D``(#,"(F"()D``$''A;`Q
+M```"````0<=$)!`!````18A$)!1!B'0D%>M600^W1@(EH````#V@````=$5!
+M@[VP,0```G4[08-\)!``=3-(BU,@BX(@F0``@,SPB8(@F0``2(M3((N"()D`
+M``T```$`B8(@F0``0<>%L#$```$```!,B>9(B=_H`````$'V1"0"`G5W2(M3
+M((N"8)@``(/(`HF"8)@``$$/MU8"]L8!=1D/MX.$`P``)?````"#Z#"#^#]W
+M4_;"0'1.@[M\`P``!W1%@[M\`P``"W0\@[M\`P``"G0S@[M\`P``"70J@[M\
+M`P``"G4*9H.[@`,```-V%TB)W^C6'@``ZPUF08-.`@)F08-D)`+]N`$```!;
+M74%<05U!7L-(@^P82(D<)$B);"0(3(ED)!!(B?V)\X7VN/____]!B<1$#T7F
+M@[]\`P``"703@[]\`P``"G4-9H._@`,```-W`X/C[TB+12"+4`R)F`!```"_
+M#P```.@`````@^,#1(GB@^(#B=F^`$```$B)[^@`````08G$]L,!=2M(BT4@
+MQT`4`````+H!````O@````!(B>_H`````(7`=`I(BT4@BX#`````1(G@2(L<
+M)$B+;"0(3(MD)!!(@\08PTB+1R"+@&28``#!Z!-F)?\!]L0!=`1F-0#^F,,/
+MMT8")>`!```]P````'0I/<````!_"3V@````=!+K*3U``0``=2(/MX>$%```
+MZQ`/MX>&%```ZP</MX>(%```9HD"N`$```##N`````##2(/L*$B)7"002(EL
+M)!A,B60D($B)^TB)]4B+1R"+@&"8``!!O`````"H`G4TZ`````!!B<1(C50D
+M#DB)[DB)W^AL____A<!T#69$.V0D#GX+9H--`@)!O`````!F1(EE%D$/O\1(
+MBUPD$$B+;"083(MD)"!(@\0HPTB)_O:'D`,```1T=DB+1R#'@"`$```!````
+M2(M'(,>```8```````!(BU<@BX(`!@``@\@(B8(`!@``2(M'(,>`!`8```$"
+M$`!(BT<@QX`@!@```````+D`````2(M&((F(``0``$B+5B!(8\$/MH0'*#$`
+M`(F"!`0``/_!@_E_?MJ0PT%505154TB#[`A(B?U!B?2_`````$2-4O]!P>H#
+M1(U"_T&#X`=!B?%!NP````"%]GYFNP$```"--,T`````1XTL`4&#_0FX"```
+M`$0/0^B)V$2)Z=/@_\B)VD2)P=/B_\HQT(GQT^!$B=(C1)4`T^A$B<'3Z$2)
+MV=/@"<=$B>E$*<%!`<M'C4P(^$&X`````$'_PD6%R7^F1(GFZ`````!(@\0(
+M6UU!7$%=PTF)^0^W0@(EX`$``#W`````="L]P````'\,/:````!T%NG!````
+MN@`````]0`$``'01Z;````"Z`0```.L%N@(```!(8])%#[>$4:(4``!!#[>$
+M4:@4``#!X`9!"<!!#[>$4:X4``#!X`Q!"<!!#[>$4;04``#!X!)!"<!!#[>$
+M4;H4``#!X!A!"<!!#[>,4<`4``!!#[>$4<84``#!X`8)P4$/MX11S!0``,'@
+M#`G!00^WA%'2%```P>`2"<%!#[>$4=@4``#!X!@)P8/^`70,@_X!<A>#_@)T
+M!^L*1(G!ZPM!B<CK!K@`````PT0YP74/2(M7((N""*(``(#DW^L-2(M7((N"
+M"*(``(#,((F""*(``$&)L:PQ``!(BT<@1(F`8)D``$B+1R")B&29``"X`0``
+M`,-3@[]\`P``"G1'@[]\`P``"70^@[]\`P``"G4*9H._@`,```-V*X._?`,`
+M``=T(H._?`,```MT&0^WAX0#```E\````(/H,+H@````@_@_=P6Z*````+D`
+M````#[<&B=.Z`````/?SA=)T#HU"]H/X#;@!````#T/(B<A;PT%7059!54%4
+M55-(@^P82(G]28GV28G\1`^W;@)!P>T'08/E`0^W1@(E\`$``#U``0``=&0]
+M0`$``'\R/<`````/A-,````]P````'\0/:`````/A+D```#IQ````#W0````
+M#X2Q````Z;0````]P`@```^$H0```#W`"```?P<]4`$``.L,/4`)``!T"SU0
+M"0``#X6)````0;\`````#[>%A`,``"7P````@^@P@_@_=GF#O7P#```'='"#
+MO7P#```+=&>#O7P#```*=%Z#O7P#```)=%6#O7P#```*=0IF@[V``P```W9"
+M2(M-((N11)D``(/BQTF+A"3P+0``#[\`P>`#@^`X"<*)D429``#K&D&_`0``
+M`.L20;\"````ZPJX`````.D6`P``2(M-((N1$)D``('B!OS__TECWT$/MX1<
+MG!0``,'@!`G"@\H!B9$0F0``08NT)*PQ``!,B?)(B>_H`````$B+52!!#[^$
+M7(04```E_P$``(#,`HF":)D``&9!@;PD*!0``/]/=CE!]D8"$'0R26/%00^W
+MM$3\%```00^VO`0$%0``10^VA`0&%0``10^WC$0`%0``00^WA$0(%0``ZS-)
+M8\=!#[>T1%H4``!!#[:\!'X4``!)8\5%#[:$!($4``!%#[>,1&`4``!!#[>$
+M1.H4``!FB00D2(M-((N11)@``('B?\#__XGPP>`')8`_```)PHF11)@``$B+
+M32"+@5"8``"P`$`/MM<)T(F!4)@``$B+32"+D5"8```P]D2)P,'@""4`_P``
+M"<*)D5"8``!(BTT@BY%(F```@>+_#_S_1(G(P>`,)0#P`P`)PHF12)@``$B+
+M?2!)8_=!#[>4='(4``")T,'@&,'B$`G000^WC'1X%```B<K!X@@)T`G(B8<T
+MF```2(M-((N1*)@``##V00^WA'1F%```P>`("<*)D2B8``!(BTT@BY%DF```
+M@>+_#_C_00^WA'1L%```P>`,)0#P!P`)PHF19)@``+L"````9D&!O"0H%```
+M`C!W&6:!O7H#```B$'4K0?9&`D!T)+L(````ZQU,B?9(B>_H`````(7`=`Y)
+M8\=!#[>$1-X4```!PTB+32"+D229``"`X@&-!!LE_@````G"B9$DF0``08-^
+M$`!T#$$/OG8400^^?A7K%4ECQ4$/M[1$;A4``$$/M[Q$<A4``$B+32"+D2"9
+M``"!XA_X__^)\,'@!27@!P``"<*)D2"9``!(BTT@BX$@F0``@^#@B?J#XA\)
+MT(F!()D``$B+52"+@B"9``"`S`B)@B"9``!F08&\)"@4````0'9!00^W1@(E
+MT````#W0````=0UF08&\)"@4``#_3W8C2(M-((N1#*(``('B__\#_XL$),'@
+M$B4``/P`"<*)D0RB``!F08&\)"@4````4'8.2(M%(,>`X)D```````"X`0``
+M`$B#Q!A;74%<05U!7D%?PT%7059!54%455-(@^Q(28G]28GT2,=$)!``````
+M2,=$)#``````2,=$)#@`````9L=$)`P``,=$)`@`````QT0D!`````#'1"08
+M`0`"`,=$)!P"``$`9L=$)"`!`&;'1"0B`@!FQT0D)`$`#[=>`L'K!P^W!H/C
+M`70-C02`1(VT`"BF___K"XT$@$2-M`"80```9D&#?"0X`'0900^W1"0X9HE$
+M)`[K=F:!X?\_9HE,)`[K7V;'1"0.`(!!OU<```!!]D0D`A"XK@```$0/1?B]
+M``````^W]8G:3(GO0?^5<`,``(G!9CT`@'0G00^W_D$/M_>)^"GPB<J!XO\_
+M```YT'\'C00^.=!]G?_%9H/]!';"#[=4)`YF08E4)#AF@7PD#@"`#X43`0``
+M28M5((N"()D``*D```!`#X1Y!```BX(,F0``)?___P")@@R9``!)BT4@BY`@
+MF0``@>+___^/B9`,F0``28M%(,>`H)D```````!)BT4@QX"`F0```````$F+
+M52"+@H29```E``#P_XF"A)D``$F+12#'@)B9````````28M5((N"G)D``"4`
+M`/#_B8*<F0``28M%(,>``)D```````!)BT4@QX`$F0```````$F+12#'@`B9
+M````````28M5((N"#)D``"4`P/__B8(,F0``28M%(,>`B)D```````!)BT4@
+MQX",F0```````$F+12#'@)"9````````28M5((N"E)D``"4`P/__B8*4F0``
+MZ7L#```/MTPD#D$/M\8IP4$/MT0D`B7P`0``/=`````/A)P````]T````'\,
+M/<````!T1.FZ````/4`!``!T##U0`0``='OIIP```(G+P>,12&/#2&G`'X7K
+M44C!Z"")QL'^`XG8F2G6B70D"(GRP?H*B50D!.M!B<O!XPA(8\-(:<"5($\)
+M2,'H((G&T?Z)V)DIUHET)`2)RL'B$4ACPDAIP!^%ZU%(P>@@B<;!_@.)T)DI
+MUHET)`AFQT0D##4,ZS&)RL'B$$ACPDAIP!^%ZU%(P>@@B<;!_@.)T)DIUHET
+M)`B)\L'Z"HE4)`1FQT0D#&H8:<GH`P``P>$$#[=4)`R)R(G3F??[B<&H#W0-
+M0;@$````3(U,)!CK"T&X`P```$R-3"0@O0````!F187`#X0*`0``B<_!_P1!
+MN@$```!)NP````#_____@_\<#X\M`@``#[?%C70X&8/^('<V@_X9?Q)$B=")
+M\=/@"T0D$$PA7"00ZT6#_AI^18U._T2)T]/CB=D+3"003"%<)!!("4PD$.LK
+MC4[?@_D3=R-(BU0D$$C!ZB!$B=#3X`G02,'@(+K_____2"%4)!!("40D$(U&
+M`8/X#W<4#[?%00^W!$&-3#8"T^`)1"0PZU*-1O&#^`]W%`^WQ4$/MP1!C4PV
+MXM/@"40D-.LVC4;A@_@/=Q0/M\5!#[<$08U,-L+3X`E$)#CK&HU&T8/X!G<2
+M#[?%00^W!$&-3#:BT^`)1"0\_\4/M]5!#[_`.<(/C`O___])BU4@BX(,F0``
+M#0```/^)@@R9``!)BT4@BY`@F0``@<H```!PB9`@F0``28M-((M$)`3!X!0E
+M``#P/XM4)`B!XO__#P`)T`T```!`B8&@F0``28M%((M,)!")B("9``!)BTT@
+MBX&$F0``)0``\/](BU0D$$C!ZB"!XO__#P`)T(F!A)D``$F+12"+7"00B9B8
+MF0``28M-((N!G)D``"4``/#_"=")@9R9``!)BU4@BT0D,(F"`)D``$F+52"+
+M1"0TB8($F0``28M5((M$)#B)@@B9``!)BTT@BX$,F0``)0#`__^+5"0\@>+_
+M/P``"=")@0R9``!)BU4@BT0D,(F"B)D``$F+52"+1"0TB8*,F0``28M5((M$
+M)#B)@I"9``!)BTT@BX&4F0``)0#`__^+5"0\@>+_/P``"=")@929``!(@\1(
+M6UU!7$%=05Y!7\.Z````9/9&`A"X````R$@/1=#V1@-`=`5(T>KK"V:#?@(`
+M>01(P>H"2`^W#DB)T+H`````2/?Q2(G&0;D?````2(GP1(G)2-/HJ`%U!4G_
+MR77NN"8```!,*<A)B<&X%P```(G"1"G*N`$```")T=/@2)A(C00PNA@```!!
+MB=!%*<A$B<%(T^A(BW<@BY84F```@>+__P$`P>`1"<*)EA28``!(BW<@BY84
+MF```@>+_'_[_1(G(P>`-)0#@`0`)PHF6%)@``,-(@^P(@_Y`N#\````/0_!F
+MB;>L`P``2(NWZ!,``$B-5"0$Z`````!(@\0(PT%505154TB#[!A(B?U)B?1)
+MB=5(B?N+MX!(``!(B[]X2```Z`````!(C;V$2```OB````#H``````^WC:P#
+M``!F@_E`N#\````/3<AF@_D^?PJX`````&:%R74.BX6P`P``#[>$```````/
+MO\D/O]!(C40D%DB)!"1,C4PD%$&X`0```$R)YDB)[^BF`@``N@````"%P`^$
+MC`(``$V)Z$R)X4B-5"062(UT)!1(B>__DZ`N``"Z`````(7`#X1F`@``@[U\
+M`P``!W0V@[U\`P``"W0M@[U\`P``"G0D@[U\`P``"70;@[U\`P``"G4*9H.]
+M@`,```-V"&:#@Z)(```$0;@`````#[>3[#$``$ECP&8!E$.$2```9H.\0X1(
+M```_=@IFQX1#A$@``#\`0?_`08/X#W;79H.[5A0```$/A[L```!F@[V"`P``
+M07=D00^W1"0")=`````]P````'529D&!/"2T"74H#[:32A0```^W@U04```I
+MPDACPDAIP&=F9F9(P>@@T?C!^A]F*=#K%@^V@TH4``!(F$AIP&=F9F9(P>@@
+MT>@/M_!(B>_HX@<``$&X`````$*-#(4`````2&/)2(M]($EC\$B+@WA(```/
+MMU2P`L'B&('*``#_``^W!+#!X`@,_R7__P``"<*)E#F`H0``0?_`08/X'WZY
+M2(M-(`^WDXI(``"#XC_!XA@/MX.(2```@^`_P>`0"<(/MX.&2```@^`_P>`(
+M"<(/MX.$2```@^`_"<*)D329``!(BTT@#[>3DD@``(/B/\'B&`^W@Y!(``"#
+MX#_!X!`)P@^W@XY(``"#X#_!X`@)P@^W@XQ(``"#X#\)PHF1.)D``$B+32`/
+MMY.82```@^(_P>(8#[>#ED@``(/@/\'@$`G"#[>#HD@``(/@/\'@"`G"#[>#
+ME$@``(/@/PG"B9$TH@``2(M-(`^WDZ!(``"#XC_!XA@/MX.>2```@^`_P>`0
+M"<(/MX.<2```@^`_P>`("<(/MX.:2```@^`_"<*)D3BB``!(BT4@@[O,,0``
+M`'0'NG\```#K!;H_````B9`\F0``N@$```")T$B#Q!A;74%<05W#05=!5D%5
+M05154TB![+@```!(B;PDB````$F)]$2)1"1L3(E,)&!FB90DA@```&:)3"1P
+M2(G]2(GX2`6$2```2(E$)%AFQT0D0#\`9L=$)#`_`&;'1"00```/OD8%`<!F
+MB40D+DB+E"3P````9L<"P?](BUPD8&;'`S\`2(N\)(@```#H`````$&)Q;L`
+M````2(N$)(@```!F@[@L%0````^$B````&9%#[;]10^V]42)\H/B^(E4)`Q(
+M8\-F@[Q%+A4```!T6F9$.;Q%+A4``'02#[>$12X5``"#X`<,X$$YQG4]2&/#
+M2,'@!DB-M"B,&0``00^W/"3HB@8``(%\)`S@````=1-F.T0D0(M4)$`/1M!F
+MB50D0.L'9HE$)$#K#?_##[>%+!4``#G#?(M!#[=$)`(ET````#W`````#X6A
+M````08/E^$&#S0&[`````&:#O2P5````#X2/````9D4/MO5%#[;M18GO08/G
+M^$ACPV:#O$4N%0```'199D0YM$4N%0``=!(/MX1%+A4``(/@!PS@03G%=3Q(
+M8\-(P>`&2(VT*(P9``!!#[<\).C4!0``08'_X````'439CM$)#"+5"0P#T;0
+M9HE4)##K!V:)1"0PZQC_PP^WA2P5```YPWR,ZPF+7"1`9HE<)#!!]D0D`P%T
+M"0^VA484``#K!P^VA4<4```/OM!,B>9(B[PDB````.@`````B<-!]D0D`D`/
+MA-X!``!!@'PD`@!Y&$R-A"2@````#[>-5!D``$B-E589``#K%DR-A"2@````
+M#[>-`AD``$B-E009``!,B>9(B[PDB````.A'!@``#[=$)$`/MU0D+@^^RRG*
+M.<*)Q@].\D'V1"0"$'1`9H&]*!0````P=A$/O]8/MX4V%```.=")U@].\&:!
+MO2@4``#_/W8908!\)`(`>1$/O]8/MX4X%```.=")U@].\`^_U@^WA"2F````
+M.=`/3M!FB50D$`^WA"2&`````<")UF8IQK@`````#TCP9CET)'"+1"1P#T[P
+M@WPD;``/A-````!(BU0D6&:)<@AFB7(&9HER!&:)<@)FB3*)]XN$)*0```!F
+M.?!V`HGP2(M4)%AFB4(*#[>$)*(```!F.P)V`P^W`DB+5"189HE"#(N$)*``
+M``!F.P)V`P^W`DB+5"189HE"#HG!9H&]*!0``/\_=D(/O]9!@'PD`@!Y"0^W
+MA3P4``#K!P^WA3H4```YPGP:08!\)`(`>0D/MX4\%```ZPL/MX4Z%```ZP*)
+M\$B+5"18ZPA(BU0D6`^W`F:)0AY(BY0D\`````^_`HF%Z#$``.L4B?</O]8/
+MMX0DH````#G0B=$/3LA(BT0D8&:)"$B+E"3P````9HDZ00^W1"0"J"!U$"70
+M````/<`````/A0X!``!,C80DD`````^WC709``!(C95V&0``3(GF2(N\)(@`
+M``#H;P0```^W3"0P#[=$)"X/OM,IT#G(B<X/3O`/O]8/MX0DE@```#G0B=8/
+M3O`/MX0DA@````'`9BG&N``````/2/"+1"1P9CGP#T[P@WPD;`!T7@^_U@^W
+MA"26````.=`/3\)(BUPD6&:)0Q`/MX0DE````#G0#T_"9HE#$HG!9HE#%`^W
+MA"22````.=`/3\)FB4,69HE#&`^WA"20````.=`/3\)FB4,:B<)FB4,<ZQ\/
+MO]8/MX0DE````#G0B=$/3L@/MX0DD````#G0#T[02(M$)&!F.Q!]`V:)$$B+
+ME"3P````9CL*?@-FB0J#?"1L`'0G2(N<)/`````/OP.)A;@Q```/MX6X,0``
+M2(N4)(@```!FB8*N`P``N`$```!(@<2X````6UU!7$%=05Y!7\-!5T%6055!
+M5%532(/L&$F)_4F)]T&)UO^7J"X``+H`````A<`/A+,```!%#[>EK`,``&9!
+M@_Q`N#\```!$#TW@9D&#_#Y_#6;'1"02``!F187D=11!BX6P`P``#[>$````
+M``!FB40D$KT`````1#GU<V:)Z$F-',=(C40D%DB)!"1,C4PD%$&X`````$$/
+MO\P/OU0D$DB)WDR)[^CN^?__N@````"%P'0T9@^^0P9F.40D%GT(#[9$)!:(
+M0P9F#[Y#!V8Y1"04?0@/MD0D%(A#!__%1#GU<IJZ`0```(G02(/$&%M=05Q!
+M74%>05_#05154TB#["")]4B)^T0/MZ=2%```2(VWA$@``$B)Y[H@````Z```
+M``!!N0@```!!#[?!9D0I)$2_`````$&Z`````$F)P&9"@SQ$`'D'9D+'!$0`
+M`&:#_PAU![\/````ZT=!#[?)#[\43`^W]P^WA'.$2```.<)U+F:#O'.$2```
+M`'4&9O\$3.L39D&#^C)V!V9"_P1$ZP5F0O\,1+\`````0?_"ZP+_QV:#_P]V
+MET$/M\%F@SQ$/WX&9L<$1#\`00^WP0^WA$.$2```*>BZ``````](PD$/M]%(
+M#[\,5$B+DWA(``!(F`^W!$)FB01*0?_!9D&#^0X/AC'___]!N0@```!!#[?1
+M#[<$5&:)A%.$2```0?_!9D&#^0YVYDB#Q"!;74%<PT%455-(@^P@2(GS08G\
+MN@````!(8\IF@SS+`'00#[<$RV:)1$P0_\*#^@=^YHG5#[?22(UT)!!!#[?\
+M3(U$)`Y(C4PD#.@`````N@`````YZGT=BT0D#&8[1"00=!*)P?_".>I]"DAC
+MPF8[3$00=?"+1"0,9CM$)`YU!F9$.>!T"DACPH-\PP0`=`I(8\(/MT3#`NL%
+MN#\````/M\!(@\0@6UU!7,-308G208G)#[?!00^WT`^OPKH`````A<!T:8G(
+M9D$Y\G1>#[?'#[?6*=!KR&1!#[?"*=")PHG(B=.9]_N)P42)R&:%R7@Z1(G`
+M9H/Y9'\Q#[_)00^WT`^OT;AD````*<A!#[?)#Z_!`<)(8\)(:<`?A>M12,'H
+M(,'X!<'Z'V8IT`^WT(G06\-!5T%6055!5%532(/L*$F)]TB)U4R)!"1!B<V^
+M``````^WP8G!.<9]%TACQDB-%(`/MU15"&:)5$00_\8YSGSI00^WW4B-="00
+M00^W/TR-1"0.2(U,)`R)VN@`````0;P`````0;D`````O@`````YWGTMBWPD
+M#`^W3"0.B=I(8\9F.WQ$$'4#08GQ2&/&9CM,1!!U!4&)].L&_\8YUGS>10^W
+MY$^-)*1-`>1&#[=$)09!#[?92(T<FT@!VP^W3!T&1`^W;"0.1`^W="0,00^W
+M/T2)ZD2)]NB=_O__2(L4)&:)0@9&#[=$)00/MTP=!$$/MS]$B>I$B?;H>_[_
+M_TB+%"1FB4($1@^W1"4"#[=,'0)!#[<_1(GJ1(GVZ%G^__](BQ0D9HE"`D8/
+MMT0E``^W3!T`00^W/T2)ZD2)]N@W_O__2(L4)&:)`DB#Q"A;74%<05U!7D%?
+MPP^W_VO_9`^WTDB-%%8/MP9KP&2#Z`HYQW(:#[="_FO`9(/`"CG'=B`/MT+^
+M9D&)`&:)`<,/MP;K\P^W!F:)`0^W1@)F08D`PT@YUG,L1`^_SP^_!FO`9$0I
+MR(/`"8/X$G;2#[=&`FO`9(/H"CG'<LE(@\8"2#G6<MB0PTB-E]`M```/MX>$
+M`P``)?````"#Z#"#^#]W-(L%`````(F'T"T``(G`2(T$P$B-!(4`````2(E"
+M(,="&`$```#'0@P4````QT(050```,.+!0````")`HG`2(T$P$B-!(4`````
+M2(E"(,="&`$```#'0@P4````QT(0(P```,-32(GZ2(GS#[>'A`,``"7P````
+M@^@P@_@_=U&^!P```/^7B"X``$B)Q[D`````NB0```"^`0```.@@Y/__0;D`
+M````0;AK````OP````"^:P```(/X`75Y0;A3````OE,```#'0Q`W````ZV6^
+M!P```/^2B"X``$B)Q[D`````NB4```"^!@```.C/X___0;D`````C4@$@_@_
+MNC(```!!B=!$#T7!ND````")UT$/1/F-=S)!C5$4@_@_00]%T8E3#(U.\8U6
+M!8/X/P]$T8E3$(M3!+@`````1#G*<@5$.<)V#3GZ<@0Y\G8%N`$```!;PP^_
+MA^PQ```#A^@Q``!(BU<@P>`))0!^``"`S(")@C"9``#'A[0Q```!````PTB#
+M[!A(B1PD2(EL)`A,B60D$$B)^TF)_$B-K]`M``"#?1@`=0JX`````.GA````
+M@[^T,0```0^%S@```$B+1R"+@#"9``!FA<`/B+L```")PL'J&8E5!"4``(`!
+MP>@7@_@"=1QF@[^"`P``078.#[>'4A0```'0B44$ZP2#100%00^WA"2$`P``
+M)?````"#Z#"#^#]W'TR)Y^B8`0``BT4$.T44<@@K112)103K!\=%!`````#'
+M@[0Q````````2(GN3(GGZ!?^__^%P'4\2(GN3(GGZ$H```"%P'0M2(GN3(GG
+MZ%,```"%P'X>QX.T,0```@```,>#R#$```$```#'@[`Q````````BX.T,0``
+M2(L<)$B+;"0(3(MD)!!(@\08P[@`````BU8$.U8,=@4[5A!R!;@!````PP^W
+MAX0#```E\````(/H,(/X/TC'P@````!(Q\``````2(G'2`]'^HL&2(T$P$B-
+M1(<(2(E&((M&!#M&$')3@SX`=0:X_____\.+1@2)1@@[1A!R-X,^`'0R_PZ+
+M%DB-%-)(C1272(M.((M"&"M!$`'`BTX(*<&)3@A(@\((2(E6(#M.$'(%@SX`
+M=<ZX`0```,.+1@0[1@QW7(L'_\@Y!G4&N/[____#BT8$B48(.T8,=SV+!__(
+M.09S-?\&BQ9(C1322(T4ETB+3B"+0A@K01`!P(M.""G!B4X(2(/""$B)5B`[
+M3@QW"(L'_\@Y!G++N`(```##N`````##2(/L&$B)'"1(B6PD"$R)9"002(G[
+M2(VOT"T``,=%%`````"^!P```/^7B"X``$B)Q[D`````NB0```"^`0```.C#
+MX/__@_@!=5M(BT4@1`^_(+X'````2(G?_Y.(+@``2(G'N0````"Z(````+X$
+M````Z)'@__]!@_P!="5!@_P!<@Y!@_P"=!%!@_P#=!'K%,=%%`````#K"XU$
+M`/OK`@'`B4442(L<)$B+;"0(3(MD)!!(@\08PT%505154TB#[`A(B?V)]T&)
+MU(G+18G%B=;H`````$&)P42-0_]!P>@#C7O_@^<'187D?GI!NP$```!&C13M
+M`````+L(````08T,/(/Y";@(````#TW(1(G8T^")P8U1_T2)V(GYT^#_R#'0
+M08G%1(G10=/E1(G&1(GJ]](C5+4`1(G(B?G3X$2)T=/@1"'H"=")1+4`1HUD
+M)_B)V2GY0=/IOP````!!_\!%A>1_F4B#Q`A;74%<05W#05=!5D%505154TB#
+M[`A)B?])B?;V1@-`=`>^``(``.LB9H-^`@!Y![X`!```ZQ'V1@(0O@`!``"X
+M`@````]%\$R)_^@`````2(G%0;T`````1#LH?4A)8\5(C01`2(U$A2`/ME@(
+MP>,"2&/;38MG(`^V2`M!N`````"Z#@```$B)[DR)_^@`````#[?`0HF$(P"'
+M``!!_\5$.VT`?+A!]D8"$`^%M````+X(````3(G_Z`````!(B<5!O0````!$
+M.R@/C94```!)8\5(C01`3(UTA2!!#[9&"(T$A0"'``")1"0$08!^!0!U94&)
+MQ$F+7R!!#[9."T&X`````+H.````2(GN3(G_Z``````/M\!!B00<08!^"0!T
+M-4$/MD8)BU0D!(T4@D&)U$F+7R!!#[9."T&X`0```+H.````2(GN3(G_Z```
+M```/M\!!B00<0?_%1#MM``^,:____TB#Q`A;74%<05U!7D%?PTB+1R"+@!R`
+M```E@#\``/9&`T!T)$&Z!`$``$&[``"`'[X``!L`N1,```!!N*P-``!!N10`
+M``#K(D&ZT@```$&[``"`'[X``#8`N0D```!!N$@-``!!N0H```!(BU<@"<@)
+M\$0)V(F"'(```$B+1R!$B9!P$```2(M'($2)@+`0``!(BT\@BX'P$```)?\#
+M\/]$B<K!X@H)T(F!\!```,.0D)!(@^PH2(E<)`A(B6PD$$R)9"083(EL)"!)
+MB?V)\XNW#"X``('F____?^@`````B<9)BT4@BU`PB=6!Y?`#``#![01!B>R%
+MVW0/N"4````IZ-'H1(TD*.L,08U$)/^#_0)$#T/@03GL=!I)BTT@@>(/_/__
+M1(G@P>`$)?`#```)PHE1,$R)[^@`````03GL#Y7`#[;`2(M<)`A(BVPD$$R+
+M9"083(ML)"!(@\0HPTB#[`@/MX>8`P``N0`````YQGT<2&/&2(G&2,'F!$@I
+MQDB-M+?0+@``Z`````")P8G(2(/$",-(@^P(28G0#[>'F`,``+H`````.<9]
+M'TACQDB)PDC!X@1(*<)(C927T"X``$R)QN@`````B<*)T$B#Q`C#05=!5D%5
+M05154TB#[`A)B?U!B?1)B=9(B?Y(C8^0`P``0;\+````08/\`G0B08/\`G<+
+M08/\`715Z:0```!!@_P#=!I!@_P$="3IDP````^W:0C_S4&!S\``!0#K:0^W
+M:0B#[0)!@<_``04`ZUD/MVD(@^T#2&/52(G02,'@!$@IT(.\A]0N````=#OK
+M5+T`````#[=!"(G'.<5]'4ACU4B)T$C!X`1(*="#O(;4+@```'0&_\4Y_7SC
+M#[=!"+K_____.<5T?$ACU4B)T$C!X`1(*=!(C9R&T"X``(-[!`!T![K_____
+MZUJ^/````$B)W^@`````1(EC!$V%]G4N1(E[#,=#%`(```#'0QC_____QT,<
+M_P,``&;'0R`*`&;'0R(*`,=#-`````#K%$&+1C")0S1,B?*)[DR)[^@`````
+MB>J)T$B#Q`A;74%<05U!7D%?PTB+3R"+E[PN``"!XO\#``"+A\0N``#!X!`E
+M``#_`PG"B9&D````2(M/((N7P"X``('B_P,``(N'R"X``,'@$"4``/\#"<*)
+MD:@```!(BT\@BX&L````)0#\__^+E\PN``"!XO\#```)T(F!K````,-(@^P(
+M#[>'F`,``+H`````.<9S7HGR2(G02,'@!$@IT$R-A(?0+@``08-X!`!U![H`
+M````ZSQ!QT`$`````+C^____B?'3P"&'O"X``"&'P"X``"&'Q"X``"&'R"X`
+M`"&'S"X``$R)QN@C____N@$```")T$B#Q`C#4T&)\DF)^TB+C^@3```/MX>8
+M`P``N@`````YQ@^#L0,``(GR2(G02,'@!$@IT$R-A(?0+@``08-X!``/A(T#
+M``!!@W@8_W4S2(7)=!4/MT$"):````"Z'P```#V@````=`6Z#P```+@!````
+M.=!S#P'`@\@!.=!R]^L$08M`&$*-')4`````C;-`$```2(M/((G"@>+_`P``
+M08M`','@"B4`_`\`"<)!BT`4P>`4)0``\`\)PHD4#HVS@!```$B+3R!!#[=`
+M(L'@!"7P````00^W4""#X@\)T`T`(`@`B00.O@`(``!!N0`!``!!@W@D`'0Q
+MC;/`"```2(M/($&+4"2!XO___P!!BT`HP>`8"<*)%`Z^`0@``$&#>"@`=`6^
+M`0D``$&#>#``=!U"C0R5``D``$B+5R!!BT`P)?___P`-`````8D$$4*-#)7`
+M$```2(M7($&+0"PE__\/`$&#>"P`=`4-```0`(D$$4&#>#``=`V)\(#,`D'V
+M0`P@#T7P0?9`#$!T!H/F\(/.`D#VQ@]T*(GR@\I`B?"#X+]!]D`-`8G6#T3P
+MB?*#RB")\(/@WT&`>`P`B=8/2?!$B<@-```@`$'V0`X!1`]%R$2)R(#,`D'V
+M0`Z`1`]%R$'V0`X$=`E!@<D```0`ZQ%$B<@-```"`$'V0`X"1`]%R$2)R(#,
+M0$'V0`X(1`]%R$2)R`T``!``0?9`#A!$#T7(08M`!(/X`G0'@_@#=`_K4$"`
+MSJ)!@<D``"4`ZT.#SF)!@W@P`'4RBQ4`````*Q4`````08N#U#$``"G0*P4`
+M````P>`*0HT,E0`)``!(BU<@#0````&)!!%!@<D```0`1(G(#0``)`!!]D`X
+M`40/1<A"C125`````(V*P`D``$B+1R")-`&!P@`1``!(BT<@1(D,`D&#>#0`
+M=#A(BU<@0XU$$E")@@`+``!(BU<@08M`-(F"!`L``$B+1R#'@`@+```)````
+M2(M7((L$$8#,$(D$$4'V0`P!=!.X`0```$2)T=/@00F#O"X``.L1N/[___]$
+MB='3P$$A@[PN``!!]D`,`703N`$```!$B='3X$$)@\`N``#K$;C^____1(G1
+MT\!!(8/`+@``0?9`#`)T$[@!````1(G1T^!!"8/$+@``ZQ&X_O___T2)T=/`
+M02&#Q"X``$'V0`P$=!.X`0```$2)T=/@00F#R"X``.L1N/[___]$B='3P$$A
+M@\@N``!!]D`,"'03N`$```!$B='3X$$)@\PN``#K$;C^____1(G1T\!!(8/,
+M+@``3(G&Z$G[__^Z`0```(G06\.--+4`"```2(M'((L$!L.--+4`"```2(M'
+M((D4!K@!````PXGQ2(M7(+@!````T^")@D`(``"X`0```,.-!+4`"@``2(M7
+M((L$$(G'@^<#=1FX`0```(GQT^"+DD`(``"%PK@!````#T7XB?C#055!5%53
+M2(/L"$B)^T&)]$B+5R"X`0```(GQT^")@H`(``!!O>@#``!$B>9(B=_H````
+M`(7`=`^_9````.@`````0?_-=>)$B>9(B=_H`````(7`#X3R````@[M\`P``
+M!W0V@[M\`P``"W0M@[M\`P``"G0D@[M\`P``"70;@[M\`P``"@^%P0```&:#
+MNX`#```##X>S````O@````!(BT,@BY!,@```QX``@0``9``*`$B+2R#!Z@H/
+MM\(-```!`(F!_(```$B+0R"+@$R```#!Z`HYT'0'_\:#_@%VOTB+4R"+@DB`
+M```-``!``(F"2(```+_(````Z`````!(BU,@BX+\@```)?___O^)@OR```"]
+M9````.L._\UT&;\*````Z`````!$B>9(B=_H`````(7`=>-(BU,@BX)(@```
+M)?__O_^)@DB```!(BT,@QX"`"````````$6%[0^5P`^VP$B#Q`A;74%<05W#
+M1(M<)!A$BU0D*`^_A^PQ``!!`<%!@_E`N#\```!$#T/(@>+_#P``0<'A$$0)
+MRHG0#0``@`!!]L(@#T70BT0D(,'@&24````>"<*)T`T````!0?;"`0]$PHG"
+M@<H````@0?;"$`]%PHE&"$'!X!2+3"10P>$9BU0D0,'B'8M$)$C!X!M!"<A!
+M"=!!"<!$B<`-`````4'VP@)$#T7`1(E&#(M$)!#!X!`E```/`(G"@,Z`0?;"
+M0`]%PHE&$(M$)`B)1A1!@_O_=!5$B=C!X`TE`.`/``E&#(%."````$!!]L(,
+M=$ZX`/\`?P^V3"0PT_BZ`````*@!=#Y!]L((N`````"Z````@`]%PHG"@<H`
+M`$``0?;"!`]%P@E&"(M$)#@E_W\```E&$(M$)##!X!0)1A2Z`0```(G0PXM\
+M)!"%R70;B<C!X!0E``#P``M&$(#,@(E&$(G0P>`%"484187)=!U$B<C!X!@E
+M````#PM&$(#,@(E&$$2)P,'@"@E&%(7_=!B)^,'@'`M&$(#,@(E&$(M$)`C!
+MX`\)1A2X`0```,.!3@@````@PX7)=!6+1@P)T(G"@,X0187`#T3"B48,ZSQ%
+MA<!T&L=&"`````")5@Q!BT$0B48008M!%(E&%.L=QT8(`````(G0@,P0B48,
+MQT80`````,=&%`````#'1AP`````QT88`````+@!````PTB)T4B)\O9&'`%U
+M!K@/````PXM&'"7^'P``T>AFB0$/MT8:9HE!`L9!!`"+1ABH`74<J`)T!,9!
+M!`'V0A@(=`2`200"]D(8!'0$@$D$!(M"'"4``&``P>@5B$$+#[;`@_@!=""#
+M^`%_!H7`=`[K0(/X`G0=@_@#="7K-`^V0A2#X!_K*(M"%"7@`P``P>@%ZQB+
+M0A0E`'P``,'H"NL+BT(4)0"`#P#!Z`^#R("(006+0APE`.`?`,'H#8A!!HM"
+M&"7P````P>@$B$$'BT(8)0`/``#!Z`B(00@/MD$+@_@"=!^#^`)_!X/X`70C
+MZR^#^`-U*HM"$"4````/P>@8`$$(BT(0)0``\`#!Z!0`00B+0A`E```/`,'H
+M$`!!"(M"&"4`\```P>@,B$$)]D(?`0^4P+H"````*,*(40JX`````,.+!B.'
+MI$@``(D&]]`AAZ1(``##D)!32(G[2(VW3"X``.@`````2(M#(,>`)($`````
+M``!(BT,@QX`H@0```````$B+0R#'0$``````2(M#(,>`,($``````@!(BT,@
+MQX`X@0```````EO#4TB)^TB+1R#'0$`&````2(VW3"X``.@`````2(M#(,>`
+M)($```````!(BT,@QX`H@0```````%O#N0````!(8\%(:\!8#[>$!R@R``!F
+M.P9T+$ACP4AKP%A(C90'(#(``&:#>@@`=1D/MP9FB4((#[=&`F:)0@H/MD8$
+MB$(,B<C#_\&#^3]VMK@`````PTB+AR`R``##4TB)^TB-MTPN``#H`````$B-
+M@Q`N``!;PT%455-(B?U!B?1(B?L/MH>3`P``@^`!B8<4,@``2(V_*#(``+X`
+M%@``Z`````"^`````(.]?`,```9W$4ACQDAKP%C&A`,P,@``!^L/2&/&2&O`
+M6,:$`S`R```"2&/&2&O`6$B-#`-(C8$P,@``QT`,]`$``,=`$,@```#'0!3(
+M````2(V!0#(``,=`"&0```#'0!`H````QT`,!P```$B-@2`R``#&0!0`QD`5
+M``^V4!"(4!+&0!,`@[L4,@```'052(V!8#(``,=`#`S^OP#'0!`X_[\`_\:#
+M_C\/AE'___^#NQ0R````="A(BU4@BX-L,@``B8(L@0``2(M5((N#<#(``(F"
+M-($``$B)[^@`````QX,8,@``9````$6%Y'0)@XL0,@```>L'@Z,0,@``_EM=
+M05S#4TB)^X._%#(```!T(>@`````2(M#(,>`+($```````!(BT,@QX`T@0``
+M`````%O#2('LB````$B)7"1X2(FL)(````!(B?M(B?U,BX<@,@``N`````"#
+M_@8/AX`$``")\/\DQ0````")U[@`````@_H$#X=G!```2(M+((N14)@``('B
+M__\/\(G^BX2S*$@``,'@%"4``/`/"<*)D5"8``!(BTL@BY%<F```@>)_@/__
+MBX2S4$@``,'@!R6`?P``"<*)D5R8``!(BTL@BY%<F```@>+_?\#_BX2S/$@`
+M`,'@#R4`@#\`"<*)D5R8``!(BTL@BY%8F```@>+__P/\BX2S9$@``,'@$B4`
+M`/P#"<*)D5B8``!!#[9`"3G'=@C_@Q`N``#K#T$/MD`).<=S!O^#%"X``$&(
+M>`GIFP,``,=$)#A_````QT0D/#(```#'1"0P?P```,=$)#0H````QT0D*'\`
+M``#'1"0L30```,=$)"!_````QT0D)$````#'1"08'P```,=$)!P0````QT0D
+M$#\```#'1"04,````(72#Y7`#[;X2(MS((N6;)@``('B_S_@_XGY2,'A`HM$
+M##C!X`XE`,`?``G"B99LF```2(MS((N6;)@``('B__\?\(M$###!X!4E``#@
+M#PG"B99LF```2(MS((N6:)@``('B__\!_XM$#"C!X!$E``#^``G"B99HF```
+M2(MS((N6:)@``('B____@(M$#"#!X!@E````?PG"B99HF```2(MS((N&:)@`
+M`(/@X(M4#!B#XA\)T(F&:)@``$B+<R"+EFR8``"`YL"+1`P0P>`()0`_```)
+MPHF6;)@``(7_=`](BU,@BX)LF```@\@!ZPU(BU,@BX)LF```@^#^B8)LF```
+MA?\/E,`/ML!!#[90##G0#X0E`@``A?]T"/^%("X``.L&_X4D+@``A?]!#Y1`
+M#.D'`@``QT0D"`@```#'1"0,!@```(72#Y7`#[;P2(M/((N!"*(``(/@P(GR
+MBU24"(/B/PG0B8$(H@``00^V0`TYQ@^$Q`$``(7V=`C_AR@N``#K!O^'+"X`
+M`$&(<`WIJ0$``,=$)&``````QT0D9`0```#'1"1H"````(G6N`````"#^@(/
+MAX8!``!(BT\@BY%8F```@>+_#_S_B?"+1(1@P>`,)0#P`P`)PHF16)@``$$/
+MMD`+.<9V"/^',"X``.L/00^V0`LYQG,&_X<T+@``08AP"^DR`0``QT0D0`(`
+M``#'1"1$!````,=$)$@&````QT0D3`@```#'1"10"@```,=$)%0,````QT0D
+M6`X```#'1"1<$````(G6N`````"#^@</A^<```!(BT\@BY$DF0``@.(!B?"+
+M1(1``<`E_@````G"B9$DF0``00^V0`HYQG8(_X<8+@``ZP]!#[9`"CG&<P;_
+MAQPN``!!B'`*Z9<```"%TG4F@Z<0,@``_>@`````2(G?Z`````")QH'F__[_
+M_TB)W^@`````ZVWVAQ`R```"=62#OQ0R````=#_H`````(G&@>;__O__2(G?
+MZ`````!(BU,@BX-L,@``B8(L@0``2(M3((N#<#(``(F"-($``$B)W^@`````
+MZQ7H`````(G&@<X``0``2(G?Z`````"#C1`R```"N`$```!(BUPD>$B+K"2`
+M````2('$B````,-32(GY2(N?(#(``,=#$`````"#OQ0R````='R!>Q0``,``
+M=@G'0T0`````ZPNX``#``"M#%(E#1(%['```P`!^"<=#2`````#K"[@``,``
+M*T,<B4-(2(M7((M#1(F"+($``$B+5R"+0TB)@C2!``!(BT<@QX`P@0`````"
+M`$B+1R#'@#B!```````"2(VQ3"X``.@`````QT,\`````,=#0`````!;PTB#
+M[!A(B5PD"$B);"002(G[2(NWZ!,``(N'$#(``(/@`X/X`P^%WP```$B+KR`R
+M``"`?0D#=Q`/ME4)_\*^`0```.F]````#[9%"CI%"','#[;0_\+K0(N/8"X`
+M`(G(@^!_@_@_=@6-07_K!HN'8"X``,'H!SM%*'XD@'T,`'4[N@````"^`@``
+M`$B)W^@`````N@````"^!0```.MC.T4D?B:`?0P`=!*Z`0```+X"````2(G?
+MZ`````"`?0L!=T@/ME4+_\+K,TB)W^@`````@^@"@_@!=S"`?0P`=1*Z````
+M`+X"````2(G?Z`````"`?0L`=!*Z`````+X$````2(G?Z`````!(BUPD"$B+
+M;"002(/$&,-(@^P82(E<)`A(B6PD$$B)^TB+M^@3``"+AQ`R``"#X`.#^`-U
+M<TB+KR`R``"`?0D#=PT/ME4)_\*^`0```.M4BY=@+@``B="#X'^#^#]V!8U"
+M?^L&BX=@+@``P>@'.T4D?@Z`?0L!=S`/ME4+_\+K&TB)W^@`````@^@"@_@!
+M=QB`?0L`=!*Z`````+X$````2(G?Z`````!(BUPD"$B+;"002(/$&,-!54%4
+M55-(@^P(2(G[08GU28G\2(NWZ!,``.C9]O__2)A(:\!82(VL&"@R``!(B:L@
+M,@``@[N,`P```74)@XL0,@```NL'@Z,0,@``_8.[C`,```$/A(<```!!_X0D
+M0"X``+H`````O@$```!(B=_H`````+H`````O@4```!(B=_H`````+H`````
+MO@0```!(B=_H`````+H`````O@(```!(B=_H`````+H`````O@,```!(B=_H
+M`````$B)W^@`````B<:!S@`!``!(B=_H`````$B)W^B]_/__Z2D!``"+@Q`R
+M``"#X`.#^`,/A1<!``!%A>UT4`^V50F^`0```$B)W^@`````#[95"KX%````
+M2(G?Z`````"`?0P`#Y3"#[;2O@(```!(B=_H``````^V50V^`P```$B)W^@`
+M````#[95"^M,N@0```"^`0```$B)W^@`````#[95"+X%````2(G?Z`````"Z
+M`0```+X"````2(G?Z`````"Z`0```+X#````2(G?Z`````"Z`@```+X$````
+M2(G?Z`````!!@[PD%#(```!T/DB)W^@`````B<:!YO_^__](B=_H`````$B)
+MW^C-^___2(M#(,>`,($``````@!(BT,@QX`X@0```````NL@2(G?Z*?[__](
+MB=_H`````(G&@<X``0``2(G?Z`````!(@\0(6UU!7$%=PT%455-(B?U(B?-)
+MB?Q(BT<@QX`D@0```````$B+1R#'@"B!````````2(VW3"X``.@`````2(L#
+M2(F%8"X``(M#"(F%:"X``$B+12"+D"R!``"+B#2!``")T"4``,``/0``P`!T
+M#HG()0``P``]``#``'5828N<)"`R```K4T2)T"M#/$$!A"0X+@``B5,\B<HK
+M4TB)T"M#0$$!A"0\+@``B5-`BT,\.T,4=@A(B>_H=_O__XM#0#M#''8(2(GO
+MZ'_\__](B>_HN/K__UM=05S#4TB)^TB+ER`R``"`?@41=1C_0CS_AS@N``"+
+M0CP[0A1V*^@S^___ZQR`?@49=1[_0D#_ASPN``"+0D`[0AQV#>@M_/__2(G?
+MZ&;Z__];PTB#[`A(BY<@,@``BX]@+@``B<B#X'^#^#]V!8U!?^L&BX=@+@``
+MP>@'.T(H?RH[0B1^$H!Z#`!T#+H!````O@(```#K-X!Z"P!T#0^V4@O_RKX$
+M````ZR2`>@H`=`T/ME(*_\J^!0```.L1@'H)`'00#[92"?_*O@$```#H````
+M`$B#Q`C#2(M'($2+B.R```!$BY#P@```1(N`^(```$B+MR`R``"#?C@`=`9$
+M.48X=@VY`````/^'1"X``.LP1(G!*TXX1(G0*T8T1(G**U8P*<$IT4ACP4AI
+MP"DY4U](P>@@B<?!_PZ)R)F)^2G11(E&.$2)3C!$B58TB<C#2(/L*$B)7"0(
+M2(EL)!!,B60D&$R);"0@2(G[28G]3(NG(#(``$B+!DB)AV`N``"+1@B)AV@N
+M``!-A>0/A*\!``#H0O___XG%A<!Y#O^#2"X``$B)W^@,^?__00%L)!!!@[T4
+M,@````^$L````$F-M4PN``!(B=_H`````$B+0R"+D"R!``"+B#2!``!!.U0D
+M1'(.03M,)$AS44$[5"1$<QU(BT,@08M4)$2)D"R!``!(BT,@QX`P@0`````"
+M`$$[3"1(#X,G`0``2(M#($&+5"1(B9`T@0``2(M#(,>`.($```````+I!0$`
+M`$$K5"1$B=!!*T0D/$$!A3@N``!!B50D/(G*02M4)$B)T$$K1"1`00&%/"X`
+M`$&)5"1`BX,0,@``@^`#@_@##X7!````08N%&#(``(T$@$$Y1"00=DU!BU0D
+M$(G000^O1"082&G`TTUB$$C!Z"#!Z`9!.40D/`^'@@```(G000^O1"0@2&G`
+MTTUB$$C!Z"#!Z`9!.40D0'=E2(G?Z'?]___K6T&+1"0003N%&#(``'9500^O
+M1"042&G`TTUB$$C!Z"#!Z`9!.40D/'8*2(G?Z$_X___K*$&+1"0000^O1"0<
+M2&G`TTUB$$C!Z"#!Z`9!.40D0'802(G?Z#WY__](B=_H=O?__TB+7"0(2(ML
+M)!!,BV0D&$R+;"0@2(/$*,.0D$B+A^@3```/MP!FB09(BX?H$P``@$@$"(!.
+M!`A(BX?H$P``#[=``F:)1@)(BX?H$P``#[9`!(A&!$B+A^@3```/MD`%B$8%
+MN`````##D)"005=!5D%505154TB#[`A)B?Q!B=>)R[T`````2<?&`````$&)
+M]4ACQ4B-!$!!BPS&28M4)"!)C41%`$&+!(:)!!'_P_;#/W4*OP$```#H````
+M`/_%@_T-=LR]`````$ACQ8L,Q0````!)BU0D((L$Q0````")!!'_P_;#/W4*
+MOP$```#H`````/_%@_U'=L^]`````$G'Q@````!%B?U(8\5(C01`08L,ADF+
+M5"0@3`'H08L$AHD$$?_#]L,_=0J_`0```.@`````_\6#_3]VSDB#Q`A;74%<
+M05U!7D%?PT%505154TB#[`A)B?Q)B?4/MU8"#[<VZ`````!!@'T"`'E<2`^_
+MV$B-!%M(C1R%`````(M[!+X(````Z`````")Q8'E_P```,'E!8L#P>`$"<4/
+MMTL(28M4)""+@@2B``!F08%]`+0)=06#R!#K"$F+5"0@@^#OB8($H@``ZP>)
+MP;T`````9H'YD`!_!?;!`70?#[_Y@^\8O@@```#H`````(G&@>;_````N`$`
+M``#K)@^_^8/O&(GXP>@?`<?1_[X(````Z`````")QH'F_P```+@`````P>8"
+M`<`)QH'.`00``$F+3"0@0`^VQ<'@"$`/MM8)T(F!G)@``$F+3"0@B>@E`/\`
+M`$B)\P^VUPG0B8'0F```38FL).@3``"X`0```$B#Q`A;74%<05W#2(N7X#$`
+M`(/^!W<IB?#_),4`````2(G0PTB-0D3#2(U"2,-(C4),PTB-0E##2(V"E```
+M`,.X`````,-!5T%6055!5%532(/L>$F)_DB)="089HE4)!9)B?^]``````^W
+M1@(E\`$``#W`````#X2'`0``/<````!_$#V@````#X04`0``Z=$!```]0`$`
+M`'0+/5`!```/A;\!``!(BU0D&`^W`F8MH0]F/>H$=Q=!#[>'#!4``&:)1"0,
+M00^WEPX5``#K4$B+5"08#[<"9BV,%&8][P!W%T$/MX<0%0``9HE$)`Q!#[>7
+M$A4``.LG2(M4)!@/MP)F+7P59CW@`'<<00^WAQ05``!FB40D#$$/MY<6%0``
+M9HE4)`KK-DB+1"089H$X7!9V'$$/MY<8%0``9HE4)`Q!#[>'&A4``&:)1"0*
+MZPYFQT0D"@``9L=$)`P``$&\`````+X`````00^WEY`4``!FB50D%$$/MX>6
+M%```9HE$)!)F08._EA0````/E,!F#[;`9HE$)!!!#[>7Y!0``.F[````#[>'
+M'!4``&:)1"0,#[>7'A4``&:)5"0*#[>W)!4``$0/MZ<H%0``#[>'DA0``&:)
+M1"04#[>7F!0``&:)5"029H._F!0````/E,!F#[;`9HE$)!`/MX?F%```9HE$
+M)`[K:P^WER`5``!FB50D#`^WAR(5``!FB40D"@^WMR85``!$#[>G*A4```^W
+MEY04``!FB50D%`^WAYH4``!FB40D$F:#OYH4````#Y3`9@^VP&:)1"00#[>7
+MZ!0``&:)5"0.ZPJX`````.G,`P``NP````!(#[=,)!9(Q\<`````2&/#2(T4
+M0$B-%%&+%)>)5(0@_\.#^Q!VYTB+1"08@'@"`'DX2(U<)"!!N`````"Y=P``
+M`+H#````2(G?Z`````!!N`````"Y>@```+H#````1(GF2(G?Z`````"[````
+M`$ACPTB-%$"+#-4`````28M6((M$A"")!!'_Q4#VQ3]U"K\!````Z`````#_
+MPX/[$';.NP````!(8\.+#,4`````28M6((L$Q0````")!!'_Q4#VQ3]U"K\!
+M````Z`````#_PW32NP````!)Q\4`````3`^W9"062&/#2(T$0$&+3,4`28M6
+M($F-!$1!BT2%`(D$$?_%0/;%/W4*OP$```#H`````/_#=,Z[`````$G'Q0``
+M``!,#[=D)!9(8\-(C01`08M,Q0!)BU8@28T$1$&+1(4`B001_\5`]L4_=0J_
+M`0```.@`````_\-TSKL`````2`^W3"062,?&`````$ACPTB-%$!(C111BQ26
+MB52$(/_#@_L0=N=(BU0D&`^W0@(E0`$``#U``0``=45!#[>WA!4``$B-7"0@
+M0;@#````N3,```"Z`0```$B)W^@`````00^WMX85``!!N`,```"Y+0```+H!
+M````2(G?Z``````/MW0D$$B-7"0@0;@`````N5\```"Z`0```$B)W^@`````
+M#[=T)!1!N`````"Y8````+H$````2(G?Z``````/MW0D#$&X`````+EH````
+MN@,```!(B=_H``````^W="0*0;@`````N6L```"Z`P```$B)W^@`````NP``
+M``!(8\-(C11`BPS5`````$F+5B"+1(0@B001_\5`]L4_=0J_`0```.@`````
+M_\.#^Q!VSKL`````2`^W3"062,?&`````$ACPTB-%$!(C111BQ26B52$(/_#
+M@_L'=N</MW0D#DB-7"0@0;@`````N1T```"Z!@```$B)W^@`````#[=T)!)!
+MN`````"Y!````+H!````2(G?Z`````!(BT0D&&:#>`(`>`;V0`-`='1(BU0D
+M&/9"`T"Z'P```+@0````08G$1`]$XDB-7"0@0;@`````N1,```"Z!0```+X?
+M````2(G?Z`````!!N`````"Y&````+H%````1(GF2(G?Z`````!!N`````"Y
+M,0```+H"````O@,```!(B=_H`````+L`````2&/#2(T40(L,U0````!)BU8@
+MBT2$((D$$?_%0/;%/W4*OP$```#H`````/_#@_L'=LY!QX>T,0```````+@!
+M````2(/$>%M=05Q!74%>05_#4T&)TD&)R0^WP4$/M]`/K\*Z`````(7`=&F)
+MR&9!.?)T7@^WQP^WUBG0:\AD00^WPBG0B<*)R(G3F??[B<%$B<AFA<EX.D2)
+MP&:#^61_,0^_R4$/M]`/K]&X9````"G(00^WR0^OP0'"2&/"2&G`'X7K44C!
+MZ"#!^`7!^A]F*=`/M]")T%O#05=!5D%505154TB![$@!``!)B<U)B?YFQT0D
+M#@``9L=$)`P_``^W00(E\`$``#W0````='D]T````'\3/:````!T2CW`````
+M=&3I@0```#U0`0``=!4]4`$``'\'/4`!``#K!3U`"0``=65!#[>&GA4``&:)
+M1"0828V&BA4``$B)1"0028V&H!4``.M-#[>'J!<``&:)1"082(V'L!<``$B)
+M1"002(V'9A@``.LL00^WAJ@7``!FB40D&$F-AJH7``!(B40D$$F-ALH7``#K
+M"K@`````Z<8"``!(B40D($B-7"0PO@@!``!(B=_H`````$R->PA,C:.(````
+MNP$```"]`````$ACQ69!B1Q'_\/_Q8/[/W[O9HEL)#9FQT0D,@$`9L=$)#0_
+M`+T`````9H-\)#8`="=(8]U!#[<T7T$/MWT`2(U4)!#H9`(``&9!B01<_\4/
+MMT0D-CG%?-E!#[<T)$@/MT0D-D$/MWQ$_KT`````9H-\)#8`='9(8\5F03LT
+M1'P*00^W-$1FB6PD#HGH]]!F`T0D-@^WV(7;="9(8]-!#[=$5/YF03L$5'X+
+M00^W!%1F08E$5/[_Q0^W1"0V.<5\MKT`````9H-\)#8`=!\/MTPD-DACQ69!
+M.SQ$?0I!#[<\1&:);"0,_\4YS7SF#[_6@\(92&/"2&G`'X7K44C!Z"#!^`3!
+M^A\IT&OH,D&]`````+L`````#[_5B=%(8\)(:<`?A>M12,'H(,'X!,'Z'RG0
+M_\`YPWTW2&/!2&G`'X7K44C!Z"")QL'^!(GP*="-2`%!#[?528N&>$@```^W
+M="0.9HDT4$'_Q?_#.<M\X[L`````2`^W1"0V2(G"9D$[;$3^#XW>````9D&#
+M_3\/A_@```"#Q3)(B==F03ML5/Y]40^_S8G.2&/300^_!%1!B<A!*<!$B<!!
+M#[]45`(IT0^OP87`?BS_PV9!.VQ\_GTB2&/300^_!%2)\2G!B<A!#[]45`)!
+MB?!!*=!!#Z_`A<!_U$ACPT4/MT1'`D4!P$4/M\!!#[<,1P')#[?)00^W5$0"
+M00^W-$0/M_WH5/S____`00^WS4F+EGA(``!FT>AFB01*28N&>$@``(M4)`QF
+M.11(=@1FB11(0?_%2`^W5"0V9D$[;%3^?0UF08/]/P^&+____^LE9D&#_3]W
+M'D$/M\U)BY9X2```#[=$2OYFB01*0?_%9D&#_3]VXF9!QX;L,0````"X`0``
+M`$B!Q$@!``!;74%<05U!7D%?PTB#[#A(B5PD&$B);"0@3(ED)"A,B6PD,$B)
+MU4&)_8GS#[?V#[?_2(U,)!;H,`$``(7`=`H/MT0D%ND)`0``#[=5"$4/M^U,
+MC40D%$B-3"022(MU`$2)[^@`````#[=T)!(/M]M,C40D$$B-3"0.2(GJB=_H
+M4`$```^W="043(U$)`Q(C4PD"DB)ZHG?Z#<!```/MW0D#@^W?"022(U,)`A(
+MB>KHN`````^W="00#[=\)!)(C4PD!DB)ZNBA````1`^W1"0&#[=,)`@/MU0D
+M$`^W="0.B=_H[/K__T&)Q`^W="0*#[=\)!1(C4PD"$B)ZNAK````#[=T)`P/
+MMWPD%$B-3"0&2(GJZ%0```!$#[=$)`8/MTPD"`^W5"0,#[=T)`J)W^B?^O__
+M#[?`00^WS`^W5"04#[=T)!)!B<!$B>_H@_K__P^WP$B+7"082(ML)"!,BV0D
+M*$R+;"0P2(/$.,-,BTH00;L`````9H-Z"`!T469!.3EU.TV-00A!N@````!F
+M08-Y!@!T*69!.3!U$DECPD$/MT1!'F:)`;@!````PTF#P`)!_\)!#[=!!D$Y
+MPGS728/!-$'_PP^W0@A!.<-\K[@`````PTB#[`A!B?)(BW(00;D`````#[="
+M"(G"03G!?1)F1#D6=`Q(@\8T0?_!03G1?.X/MU8&2(/&"`^W_^@`````2(/$
+M",-32(G[2(._>$@```!T%TB+OWA(``#H`````$C'@WA(````````2(.[X#$`
+M``!T%TB+N^`Q``#H`````$C'@^`Q````````6\.X`0```,.Z`````$C'QP``
+M```/MP:)P68[!0````!W"__"2&/"9CL,AW;U2&/"#[\$A0````##2(/L&$B)
+M7"0(2(EL)!!(B?5(B?N_M````.@`````2(F#X#$``$B%P'0@QX.`2```@```
+M`+^`````Z`````!(B8-X2```2(7`=0['10`"````N`````#K74C'@W@N````
+M````2,>#@"X```````!(QX.(+@```````$C'@Y`N````````2,>#F"X`````
+M``!(QX.@+@```````$C'@Z@N````````2,>#L"X```````"X`0```$B+7"0(
+M2(ML)!!(@\08PY!!5T%6055!5%532(/L"$F)_$&)UXG+O0````!)Q\8`````
+M08GU2&/%2(T$0$&+#,9)BU0D($F-1$4`08L$AHD$$?_#]L,_=0J_`0```.@`
+M````_\6#_0]VS+T`````2&/%BPS%`````$F+5"0@BP3%`````(D$$?_#]L,_
+M=0J_`0```.@`````_\6#_41VS[T`````2<?&`````$6)_4ACQ4B-!$!!BPR&
+M28M4)"!,`>A!BP2&B001_\/VPS]U"K\!````Z`````#_Q8/]/W;.2(/$"%M=
+M05Q!74%>05_#059!54%455-)B?Q(B?5!O@````!!O0````!F@3Z_$@^'XP``
+M``^W/HV'</?__TACT$AITF=F9F9(P>H@T?J)P<'Y'RG*C122.=!U(XV</^#N
+M__](8\-(:<!G9F9F2,'H((G!P?D"B=B9B<LIT^M7#[<VC890]___2&/02&G2
+M9V9F9DC!ZB#1^HG!P?D?*<J-%)*Y`````#G0#X4V`@``C9PVH.[__TACPTAI
+MP&=F9F9(P>@@B<'!^0*)V)F)RRG30;X!````P>,"@>/_````O@@```")W^@`
+M````B<-)BU0D((N"!*(``&:!?0"T"74%@\@0ZPA)BU0D((/@[XF"!*(``.F#
+M`0``#[<6#[?":<#-S```P>@09L'H`HT$@(G19BG!9H/Y`G5*9H'Z.Q5W0XU"
+M_@^WP(T$@(V$`(!$__](8_A(:?\?A>M12,'O(,'_`\'X'RG'_\>^"````.@`
+M````B<.^`@```+\`````Z1`!```/MU4`#[?":<#-S```P>@09L'H!(T$@,'@
+M`F8YPG5#9H'Z_Q-V/`^WPBW`$@``2&/X2&G_9V9F9DC![R#!_P/!^!\IQ\'G
+M`KX(````Z`````")P[X"````OP,```#IK@````^W50`/M\)IP,W,``#!Z!!F
+MP>@#C02``<!F.<)U.`^WPBW`$@``2&/X2&G_9V9F9DC![R#!_P+!^!\IQP'_
+MO@@```#H`````(G#O@(```"_`@```.M8#[=5``^WPFG`S<P``,'H$&;!Z`*-
+M!("Y`````&8YP@^%A0````^WPBW`$@``2&/X2&G_9V9F9DC![R#1_\'X'RG'
+MO@@```#H`````(G#O@(```"_`0```.@`````08G%B=[!Y@1"C02M``````G&
+M0XT$-@G&@<X!$```28M4)"!`#[;&B8*<F```P>X(28M4)"")\(/@?XF"V)@`
+M`$F)K"3H$P``N0$```")R%M=05Q!74%>PTB+E^`Q``"#_@=W)(GP_R3%````
+M`$B)T,-(C4($PTB-0@C#2(U"#,-(C8*L````P[@`````PT%7059!54%455-(
+M@^PH28G]28GV2(E,)!AFB50D)DF)_V;'1"04``!FQT0D$@``9L=$)!```&;'
+M1"0.``!(BZ_@,0``2(V'T"T``$B)!"1!O``````/MT8")?`!```]T`````^$
+M$@$``#W0````?QL]H`````^$V````#W`````#X3U````Z1D!```]4`$``'09
+M/5`!``!_!SU``0``ZP4]``@```^%^0```$$/MP9F+:$/9CWJ!'<700^WEPP5
+M``!FB50D%$$/MX<.%0``ZV=!#[<&9BV,%&8][P!W%T$/MY<0%0``9HE4)!1!
+M#[>'$A4``.M"00^W!F8M?!5F/>``=Q=!#[>7%!4``&:)5"0400^WAQ85``#K
+M'69!@3Y<%G8:00^WEQ@5``!FB50D%$$/MX<:%0``9HE$)!)!#[>WEA0``$$/
+MMY?D%```9HE4)!;K6P^WAR05``!FB40D$`^WER@5``!FB50D#@^WMY@4```/
+MMX?F%```ZR)!#[>7)A4``&:)5"0.9HE4)!!!#[>WFA0``$$/MX?H%```9HE$
+M)!;K"K@`````Z;,%``"Y`````$C'QP````!(8]&+!->)1)4`_\%T\KD`````
+M2`^W?"0F2<?``````$ACP4B-%$!(C11708L4D(E4A03_P73IN0````!(#[=\
+M)"9)Q\``````2&/!2(T40$B-%%=!BQ20B52%"/_!=.FY`````$@/MWPD)DG'
+MP`````!(8\%(C11`2(T45T&+%)")5(4,_\&#^2=VY@^W]DB-70Q!N`````"Y
+M+@$``+H!````2(G?Z`````!(BU0D&`^W,D&X`````+D.`0``N@(```!(B=_H
+M`````$B+1"08#[=P`D&X`````+D!`0``N@(```!(B=_H`````$'V1@)`#X38
+M````2(L4)$B+0B`/OW`"0;@#````N:@```"Z`0```$B)W^@`````2(L4)$B+
+M0B`/OW`$0;@#````N:D```"Z`0```$B)W^@`````2(L4)$B+0B`/OW`&0;@#
+M````N:H```"Z`0```$B)W^@`````2(L4)$B+0B`/OW`(0;@#````N:X```"Z
+M`0```$B)W^@`````2(L4)$B+0B`/OW`*0;@#````N:\```"Z`0```$B)W^@`
+M````2(L4)$B+0B`/OW`,0;@#````N;````"Z`0```$B)W^@`````08!^`@!Y
+M,P^W="002(U=#$&X`````+D?`0``N@,```!(B=_H``````^W="0.0;@`````
+MN2(!``#K,0^W="042(U=#$&X`````+D7`0``N@,```!(B=_H``````^W="02
+M0;@`````N1H!``"Z`P```$B)W^@`````00^WA80#```E\````(/H,(/X/P^'
+MI````&9!@[V$`P``-70A9D&#O80#``!%=!9F08.]A`,``$9T"V9!@[V$`P``
+M-G5X2(U=#$&X`@```+E:````N@(```"^`@```$B)W^@`````0;@"````N5P`
+M``"Z`@```+X"````2(G?Z`````!!N`(```"Y7@```+H"````O@(```!(B=_H
+M`````$&X`@```+G^````N@$```"^`@```$B)W^@`````9D&#O8(#``!!#X:5
+M````2(U=#$&X`0```+D9`0``N@$```"^`0```$B)W^@`````0;@#````N0$`
+M``"Z`@```+X!````2(G?Z`````!!N`,```"Y`P```+H"````O@$```!(B=_H
+M`````$&X`P```+F+````N@$```"^`0```$B)W^@`````0;@#````N8P```"Z
+M`0```+X!````2(G?Z`````"Y`````$@/MW0D)DC'QP````!(8\%(C11`2(T4
+M5HL4EXF4A:P```#_P8/Y#';D0?9&`D!T)TB+%"1(BT(@#[\P2(V]K````$&X
+M`````+DE````N@(```#H``````^W="062(V]K````$&X`````+D.````N@8`
+M``#H`````$'V1@-`=0AF08-^`@!Y54'V1@-`N@\```"X"````$&)QD0/1/)(
+MC9VL````0;@`````N3H```"Z!````+X/````2(G?Z`````!!N`````"Y1@``
+M`+H$````1(GV2(G?Z`````"[`````$ACPXL,Q0````!)BU4@BT2%`(D$$4'_
+MQ$'VQ#]U"K\!````Z`````#_PW34NP````!(8\-(C11`BPS5`````$F+52"+
+M1(4$B0010?_$0?;$/W4*OP$```#H`````/_#=-"[`````$ACPTB-%$"+#-4`
+M````28M5((M$A0B)!!%!_\1!]L0_=0J_`0```.@`````_\-TT+L`````2&/#
+M2(T40(L,U0````!)BU4@BT2%#(D$$4'_Q$'VQ#]U"K\!````Z`````#_PX/[
+M)W;-NP````!(8\-(C11`BPS5`````$F+52"+A(6L````B0010?_$0?;$/W4*
+MOP$```#H`````/_#@_L,=LI!QX>T,0```````+@!````2(/$*%M=05Q!74%>
+M05_#05=!5D%505154TB!["@$``!(B70D0$B)5"0X2(E,)#!,B40D*$B)?"0@
+M#[>'A`,``"7P````@^@P@_@_=S)F@[^$`P``-70>9H._A`,``$5T%&:#OX0#
+M``!&=`IF@[^$`P``-G4*QT0D'`(```#K",=$)!P!````2(M4)#`/MT(")?`!
+M```]T````'1Q/=````!_$#V@````=$0]P````'1<ZW@]4`$``'05/5`!``!_
+M!SU``0``ZP4]``@``'5<2(M,)"!(@<&0(0``2(E,)!!(BT0D(`^WD)`4``#K
+M1TB+5"0@2('"J"$``$B)5"002(M,)"`/MY&2%```ZRA(BT0D($@%P"$``$B)
+M1"002(M,)"`/MY&4%```ZPJ^`````.FM!0``2(M,)!`/MT$*O@````"%T`^$
+MEP4``$B+5"0X#[\"`<!FB40D#$B+3"1`#[\!`<!FB40D#F;'1"18K=YFQT0D
+M6JW>0;X`````O0````!(BT0D$`^W4`I(C7PD6(G0B>G3^*@!=!F^`````$&#
+M_@$/ASD%``!$B?!FB2Q'0?_&_\6#_0-VUDB+1"00#[=0"$B+3"0P#[<Y3(U$
+M)%1(C4PD4$B+,.A6!0``0;X`````1(M\)%!$.WPD5`^'W`$``$2)^$AKP%1)
+MB<5(BU0D$$P#:A!F@7PD6JW>#X6)````2`^W1"182(T$@$F-;(4`1`^W909!
+M#[?<2`';2(UU"(G:2(V\)``#``#H`````$B-=1")VDB-O"3@`@``Z`````!!
+M#[]-`D$/M_Q,C40D8$B-E"3@`@``2(VT)``#``#H+04``+X`````A<`/A%X$
+M``!$B?=(P><'2(V,).`!``!(C3P/Z1,!``!(#[=$)%A(C02`28ULA0!$#[=E
+M!D$/M]Q(`=M(C74(B=I(C;PD``,``.@`````2(UU$(G:2(V\).`"``#H````
+M`$$/OTT"00^W_$R-1"1@2(V4).`"``!(C;0D``,``.BD!```O@````"%P`^$
+MU0,``$2)]TC!YP=(C80DX`$``$B-/`>Z@````$B-="1@Z`````!(#[=$)%I(
+MC02`28ULA0!$#[=E!D$/M]Q(`=M(C74(B=I(C;PD``,``.@`````2(UU$(G:
+M2(V\).`"``#H`````$$/OTT"00^W_$R-1"1@2(V4).`"``!(C;0D``,``.@1
+M!```O@````"%P`^$0@,``$2)\$C!X`=(C;P$X````+J`````2(UT)&#H````
+M`$'_QD'_QT0[?"14#X8D_O__BT0D4$B+3"002(L1#[<$0F:)1"0*BT0D5$0/
+MMRQ"BT0D5$&)QD0K="109H%\)%JMW@^%P````+T`````1(GP28G$2<'D!HGK
+M2HT$(T0/OX1$X`$```^_C%S@`0``2(M$)#`/MSA!#[?5#[=T)`KHM`(``&:)
+MA%R@`P``_\6#_3]VQ$B+5"0@2(NR>$@``$B-O"2@`P``Z`($``")PF;!Z`^-
+M!!!FT?A(BTPD0&:)`0^WA"0>!```B<)FP>H/`=!FT?AFB40D7@^WA"0>!```
+MB<)FP>H/`=!FT?A(BU0D.&:)`HM$)%A(BTPD*&:)`6:)00+I_@$``+T`````
+M1(GP28G'2<'G!D4/M_5$#[=L)`J)ZTZ-)#M&#[^$9.`!```/OXQ<X`$``$B+
+M1"0P#[<X1(GR1(GNZ.T!``!FB81<H`,``$8/OX1DX`````^_C%S@````2(M4
+M)#`/MSI$B?)$B>[HP0$``&:)A%P@`P``_\6#_3]VFX-\)!P"#X6$````2(M,
+M)"!(BY%X2```2(VT)"`#``!(C;PDH`,``$B-3"1.Z*T#``")PF;!Z`^-!!!F
+MT?A(BU0D0&:)`@^W1"1.B<)FP>H/`=!FT?AFB40D7@^WA"0>!```B<)FP>H/
+M`=!FT?A(BTPD.&:)`8M$)%A(BU0D*&:)`@^W1"1:9HE"`NGQ````#[=,)`YF
+M.XPDG@,``']PBT0D#&8[A"2>`P``?V)(BU0D($B+LGA(``!(C;PD(`,``.AC
+M`@``B<(/MT0D6DB+3"0H9HD!9HE!`HG09L'H#XT$$&;1^$B+5"1`9HD"#[>$
+M))X#``")PF;!Z@\!T&;1^&:)1"1>#[>$))X#``#K7TB+1"0@2(NP>$@``$B-
+MO"2@`P``Z`$"``")PHM$)%A(BTPD*&:)`6:)00*)T&;!Z`^-!!!FT?A(BU0D
+M0&:)`@^WA"0>!```B<)FP>H/`=!FT?AFB40D7@^WA"0>!```B<)FP>H/`=!F
+MT?A(BTPD.&:)`;@_````2(M4)#AF*P)(BTPD(&:)@>PQ``"^`0```(GP2('$
+M*`0``%M=05Q!74%>05_#08GZB?=!B=%!B<N)R&9!.?%T*$$/M_(/M_^)\"GX
+M00^_T`^OPD$/M\F)RBGR00^_\P^OU@'0*?F9]_F8PP^W_P^WPDR-#$8/MP8Y
+MQW,.0<<``````,<!`````,-!#[=!_CG'<B</M\+_R.L)2(G02"GP2-'X08D`
+MB0'#2(G02"GP2-'XB0'_P$&)`,-(B?),.<YS&`^W`CGX=-$/MT(".<=RV$B#
+MP@),.<IRZ)##05=!5D%505154TB#[`A)B?1)B==,B<5!B<UFQT0D!@``0;X!
+M````N@````!F@_\!#X:!````NP`````/M\?_R(D$)$$/M\9F03L<1'8100^W
+MQCL$)'T(9O]$)`9!_\9!#[?610^_!%=(#[=$)`9!#[\,1T$/MQ1400^W-$0/
+MM_OHS?[__P^WTV:)1%4`9D0YZ'P79H/[/W<1#[?#9D2);$4`_\-F@_L_=N__
+MPV:#^S]VD;H!````B=!(@\0(6UU!7$%=05Y!7\,/OT=^#[\7*="#^'Y^"T0/
+MMU=^08/J?NL$1`^W%T0/MT]^N3\````/OU=^B=#_R#G"?A6)PO_)2`^_P0^_
+M!$<YT'X%9H7)>>V)RD6)R$&Y/P```(U"_XG!9H/X/G<A2`^_PF9$.01'?!:)
+MRHU*_V:#^3YW"T@/O\)F1#D$1WWJ9H72=1MF187)>"=)#[_1#[=$5@)FB016
+M9D'_R7GMZQ))#[_!9HD41D&#Z`)F0?_)>:)!#[_"PT%455-)B=-(B<NY0```
+M``^_1WX/OQ8IT(/X?GX+1`^W9WY!@^Q^ZP1$#[<F#[=O?D&X/P````^_5WZ)
+MT/_(.<)^%XG"0?_(20^_P`^_!$<YT'X&9D6%P'GK#[=&?F:)`T&Z/P```$&)
+MZ69$.PM^#&9%A<!U%&:#^4!U#KD`````2(GW0;@_````9D6%P'X?20^_P&9$
+M.0Q'?!1!_\AF187`?@M)#[_`9D0Y#$=][&9%A<!U(F:%R74=9D6%TG@S20^_
+MTD$/MT13`F9!B0139D'_RGGKZQQ)#[_21(G`"<AF08D$4T&#Z0)F0?_*#XEW
+M____00^_Q%M=05S#4TB)^TB#OWA(````=!=(B[]X2```Z`````!(QX-X2```
+M`````$B#N^`Q````=!=(B[O@,0``Z`````!(QX/@,0```````%O#1`^W1@1!
+MN0````"Y`0```$ACP4B-!(!(C3R&#[=7!$$/O\`YPGT(08G)1`^W1P3_P8/Y
+M`W[:26/!2(T$@$B-!(8/MU`01`^W0`BY`0```$ECP4B-!(!(C3P`2&/!2(T$
+M.&8Y5$80?0L/MU1&$$0/MT1&"/_!@_D#?N!#C00`9BG"B="8PT%7059!54%4
+M55-(@^P(28G]2(GU2(G72(D,)$R)Z6;'`@``#[=&`B5``0``/4`!``!U$4F-
+MA9`A``!(BU@0#[=(".M0#[=&`B70````/<````!T!SW0````=1%(C8&0(0``
+M2(M80`^W2#CK*`^W1@(EH````+H!````/:`````/A5T!``!)C860(0``2(M8
+M*`^W2""Z`````(7)#XY!`0``#[=5`&8[$W(32&/!2&O`5&8[5`.L=BYF.Q-S
+M#P^W0P)FB0=(B=[I^P```$ACP4AKP%1(`=A(C7"L#[=`KF:)!^GA````0;@`
+M````N@`````YRGTC#[=%`(G&9CL#=AB)T/_"08G`.<I]#4ACPDAKP%1F.S0#
+M=^A(8\)(:_!41`^W)#-)8\!,:_A41@^W!#M%*<1%A>1^<@^_3#,"0@^_5#L"
+M*=$/MT4`1"G`#Z_!00^OU`'0F4'W_&:89HD'2(TT'DR)[^@1_O__1`^_\$P!
+M^TB)WDR)[^C__?__F$$IQ@^W10`/MQ,IT$2)]0^OZ$B)WDR)[^CA_?__F$$/
+MK\2-!"B90??\9ICK)4ACPDAKT%0/MT4`9CL$$W4B#[=$$P)FB0=(C30:3(GO
+MZ*S]__](BQ0D9HD"N@$```#K!;H`````B=!(@\0(6UU!7$%=05Y!7\-!5T%6
+M055!5%532(/L"$F)_DF)]$&)U4&_`0```+T`````.=5S0$ACW4F---Q(C4PD
+M!DB-5"0$3(GWZ,[]__^%P'06#[9$)`1!B$3<!@^V1"0&08A$W`?K!D&_````
+M`/_%1#GM<L!$B?A(@\0(6UU!7$%=05Y!7\-(@^P82(E<)`A(B6PD$$B)]4B)
+M^[_@````Z`````!(B8/@,0``2(7`="#'@X!(``"`````OX````#H`````$B)
+M@WA(``!(A<!U#L=%``(```"X`````.MGQX.`2```0````$C'@W@N````````
+M2,>#@"X```````!(QX.(+@```````$C'@Y`N````````2,>#F"X```````!(
+MQX.@+@```````$C'@Z@N````````2,>#L"X```````"X`0```$B+7"0(2(ML
+M)!!(@\08PY"0D$%7059!54%455-(@^P(28G\08G7B<N]`````$G'Q@````!!
+MB?5(8\5(C01`08L,QDF+5"0@28U$10!!BP2&B001_\/VPS]U"K\!````Z```
+M``#_Q8/]#W;,O0````!(8\6+#,4`````28M4)""+!,4`````B001_\/VPS]U
+M"K\!````Z`````#_Q8']B@```';,O0````!)Q\8`````18G]2&/%2(T$0$&+
+M#(9)BU0D($P!Z$&+!(:)!!'_P_;#/W4*OP$```#H`````/_%@_T_=LY(@\0(
+M6UU!7$%=05Y!7\-!5D%505154TF)_$B)]4&^`````$&]`````&:!/K\2#X?C
+M````#[<^C8=P]___2&/02&G29V9F9DC!ZB#1^HG!P?D?*<J-%)(YT'4CC9P_
+MX.[__TACPTAIP&=F9F9(P>@@B<'!^0*)V)F)RRG3ZU</MS:-AE#W__](8]!(
+M:=)G9F9F2,'J(-'ZB<'!^1\IRHT4DKD`````.=`/A38"``"-G#:@[O__2&/#
+M2&G`9V9F9DC!Z"")P<'Y`HG8F8G+*=-!O@$```#!XP*!X_\```"^"````(G?
+MZ`````")PTF+5"0@BX($H@``9H%]`+0)=06#R!#K"$F+5"0@@^#OB8($H@``
+MZ8,!```/MQ8/M\)IP,W,``#!Z!!FP>@"C02`B=%F*<%F@_D"=4IF@?H[%7=#
+MC4+^#[?`C02`C80`@$3__TAC^$AI_Q^%ZU%(P>\@P?\#P?@?*<?_Q[X(````
+MZ`````")P[X"````OP````#I$`$```^W50`/M\)IP,W,``#!Z!!FP>@$C02`
+MP>`"9CG"=4-F@?K_$W8\#[?"+<`2``!(8_A(:?]G9F9F2,'O(,'_`\'X'RG'
+MP><"O@@```#H`````(G#O@(```"_`P```.FN````#[=5``^WPFG`S<P``,'H
+M$&;!Z`.-!(`!P&8YPG4X#[?"+<`2``!(8_A(:?]G9F9F2,'O(,'_`L'X'RG'
+M`?^^"````.@`````B<.^`@```+\"````ZU@/MU4`#[?":<#-S```P>@09L'H
+M`HT$@+D`````9CG"#X6%````#[?"+<`2``!(8_A(:?]G9F9F2,'O(-'_P?@?
+M*<>^"````.@`````B<.^`@```+\!````Z`````!!B<6)WL'F!$*-!*T`````
+M"<9#C00V"<:!S@$0``!)BU0D($`/ML:)@IR8``#![@A)BU0D((GP@^!_B8+8
+MF```28FL).@3``"Y`0```(G(6UU!7$%=05[#05=!5D%505154TB#[`A)B?U!
+MB=9)B?^]`````$R+I^`Q```/MT8")?`!```]P````'0I/<````!_"3V@````
+M=`OK*SW0````=!+K(@^WMQP5```/MX<>%0``ZQQ!#[>W(!4``$$/MX<B%0``
+MZPJX`````.D;`@``9HE$)`:Y`````$C'QP````!(8]&+!-=!B024_\%T\KD`
+M````00^W_DG'P`````!(8\%(C11`2(T45T&+%)!!B52$!/_!=.BY`````$$/
+MM_Y)Q\``````2&/!2(T40$B-%%=!BQ2008E4A`C_P73HN0````!!#[?^2<?`
+M`````$ACP4B-%$!(C11708L4D$&)5(0,_\&#^1IVY0^W]DF-7"0,0;@`````
+MN:@```"Z`P```$B)W^@`````#[=T)`9!N`````"YI0```+H#````2(G?Z```
+M``"Y`````$$/M_9(Q\<`````2&/!2(T40$B-%%:+%)=!B52$>/_!@_D"=N:[
+M`````$ACPXL,Q0````!)BU4@08L$A(D$$?_%0/;%/W4*OP$```#H`````/_#
+M=-6[`````$ACPTB-%$"+#-4`````28M5($&+1(0$B001_\5`]L4_=0J_`0``
+M`.@`````_\-TT+L`````2&/#2(T40(L,U0````!)BU4@08M$A`B)!!'_Q4#V
+MQ3]U"K\!````Z`````#_PW30NP````!(8\-(C11`BPS5`````$F+52!!BT2$
+M#(D$$?_%0/;%/W4*OP$```#H`````/_#@_L:=LV[`````$ACPTB-%$"+#-4`
+M````28M5($&+1(1XB001_\5`]L4_=0J_`0```.@`````_\.#^P)VS4''A[0Q
+M````````N`$```!(@\0(6UU!7$%=05Y!7\-(BY?@,0``@_X'=R&)\/\DQ0``
+M``!(B=##2(U"!,-(C4((PTB-0@S#2(U">,.X`````,-!B=$/M\),C11&#[_7
+M#[<&.<)]#D''``````#'`0````###[_700^W0OXYPGPH00^WP?_(ZPE,B<A(
+M*?!(T?A!B0")`<-,B<A(*?!(T?B)`?_`08D`PTF)\4PYUG,=#[_700^W`3G0
+M=,U!#[=!`CG"?--)@\$"33G1<N:0PT%7059!54%455-(@^P82(G+38G&08GW
+M9HE4)`Y%B<Q#C2P_0;T`````N`````!F08/Y`0^&VP````^W1"0.9BGP9D$Y
+MQ0^'Q````(GX2,'@!DB)!"0/O_U,C40D%$B-3"0000^WU$B)WN@5____@WPD
+M%`!U",=$)!0!````00^WU(U"_SE$)!!U!XU"_HE$)!"+3"00BU0D%`^W!$MF
+M.P13=0=!#[<43NL[#[_-BW0D$`^_/'-!B<A!*?B+5"0400^W!%9$#Z_`#[\4
+M4XG0*<A!#[<,=@^OP4*-!``I^HG1F??YB<)!#[?%2`,$)$B+3"109HD404'_
+MQ8/%`@^W1"0.9D0I^&9!.<4/AD;___^X`0```$B#Q!A;74%<05U!7D%?PT&)
+M^HGW08G108G+B<AF03GQ="A!#[?R#[?_B?`I^$$/O]`/K\)!#[?)B<HI\D$/
+MO_,/K]8!T"GYF??YF,-!5T%6055!5%532(/L2$F)UDR)1"0@3(E,)!AFB70D
+M+F:)3"0L2(NO<"X``,=$)!``````#[=2%`^_?"0N3(U$)$1(C4PD0$R)]NC4
+M_?__QT0D%`````"X`P```$&)P40K3"041(G(BU0D0$AKTF9(C01`2(TTQ0``
+M``!(`?))C0P61`^W:2!F187M#X3;`0``BU0D$`^W01Y(BYPD@````&:)!%-(
+MC3P23(U$)#@/MU$L9D&)%#B+1"1$2&O`9D@!\$P!\&8[4"Q^"0^W0"QF08D$
+M.(M$)!!,C00`0@^W1`0XB<)FP>H/`=!FT?AF0HE$!#A,C50D,$2)R8M$)$!!
+M#[?]2(T$0$B)PDC!X@1(`=!(C0Q)2,'A`D@!R$@!^$$/MW1&*F9#B30"BT0D
+M1$B-!$!(B<)(P>($2`'02`'(2`'X9D$[=$8J?@M!#[=$1BIF0XD$`D2+9"00
+M30'D0@^W1"0PB<)FP>H/`=!FT?AF0HE$)#!%#[?MBTPD0$AKR69$B<M(C1Q;
+M2,'C`T@!V4P!\4R-02)(@\$L#[_00@^_="0X2(DL)$6)Z8M\)!#H[OS__XM,
+M)$1(:\EF2`'93`'Q3(U!(DB#P2Q"#[]4)#!"#[]T)#A(C84``@``2(D$)$6)
+MZ8M\)!#HM?S__T(/MT0D,$&]`````&9".T0D.'1IBT0D$$B)PDC!X@9(B50D
+M"$0/MWPD+DR-)`!$B>M(`UPD"$0/OX1=``(```^_3%T`BT0D1$$/MQ1&BT0D
+M0$$/MS1&1(G_Z'K]__]FB81=``0``$'_Q4(/MT0D,&9"*T0D.`^WP$$YQ7*Q
+M_T0D$/]$)!2#?"04`P^&W/W__XM$)#A(BTPD(&:)`4&]`````,=$)!0`````
+M1#ML)!`/@_,!``!(C5PD,$R-7"0X1`^W9"0LBT0D$/_(.40D%'47BU0D%`^W
+M!%.#P`1,BW0D&&9!B016ZR>+3"04#[\$2XM4)!3_PD$/OQ13`=")PL'J'P'0
+MT?A(BU0D&&:)!$J^`````(-\)!0`=!^+1"04_\A(BTPD&`^W!$&+5"0400^_
+M%%,IT(G&1"GFBT0D%$C!X`</MY0%`@0``(G19BN,!0`$``"X`0````]$R(7V
+M>4"+1"042,'@!TB-?`4`1`^WP8GP00^OP$2)ZD'_Q0^WCP`$``!F`<&X````
+M``])P4R+M"2(````9D&)!%;_QGC1BU0D%$B-!!)$#[\4`T$/OP0#02G"2(M,
+M)!@/MSQ11`'G*<=%B=%!.?I$#T?/00^_P4&)P#G&?3!(B=%(P>$&1(GH2&/6
+M2(T4"O_&#[>450`$``!,B[0DB````&9!B11&0?_%1#G&?->+1"0408U*_TC!
+MX`9(C0P!08U2_D@!T`^WE$T`!```B=%F*XQ%``0``+@!````#T3(1#G/=E8/
+MO\<YQGU/BT0D%$&-4O](P>`&3(T4`D0/M\$/O_^)\$0IR$$/K\!"#[>,50`$
+M```!P42)ZD'_Q6:#^7^X?P````].P4B+C"2(````9HD$4?_&.?Y\R/]$)!1$
+MBW0D$$0Y="04#X(=_O__@WPD%`-W(HM$)!2+5"04_\I(BTPD&`^W%%%FB11!
+M_T0D%(-\)!0#=MY!@_U_=R!$B>A!C57_2(N<)(@````/MQ139HD40T'_Q4&#
+M_7]VX$B#Q$A;74%<05U!7D%?PT%6055!5%532(/L($B)_4B)RDF)_4B+GWA(
+M```/MT$")=`````]P````'0'/=````!U"4V-I;@I``#K(`^W00(EH````+D`
+M````/:`````/A28!``!,C:>D)0``2(M%((N`;*(``$&)QD&#Y@]!#[?.#[<R
+M2(E<)`A,B00D3(U,)!A,C40D%DR)XDB)[^A]^O__2(M-((N16*(``(#F/T$/
+MMT0D'/_(P>`.)0#````)PHF16*(``&:#?"06`'01#[=$)!;WV&9!B87L,0``
+MZPIF0<>%[#$`````OX"B``"^`````(T,M0````")R`^V%$.-00$/M@1#P>`(
+M"<*-00(/M@1#P>`0"<*#P0,/M@1+P>`8"<*)^4B+12")%`&#QP3_QH/^'W:\
+M2(MU($2)\H/B#P^W1"08P>`$)?`#```)PDB-3"08#[=!`L'@"B4`_```"<(/
+MMT$$P>`0)0``/P`)P@^W00;!X!8E``#`#PG"B99LH@``N0$```")R$B#Q"!;
+M74%<05U!7L-32(G[2(._>$@```!T%TB+OWA(``#H`````$C'@WA(````````
+M2(.[X#$```!T%TB+N^`Q``#H`````$C'@^`Q````````2(.[<"X```!T%TB+
+MNW`N``#H`````$C'@W`N````````6\.Z`````+D#````B<@IT$B-!$!(C03&
+M9H-X"`!T!0^_0!3#_\*#^@-VX;@`````P[H`````B=!(C0Q`#[=$S@AFA<!T
+M#0^WP$B-!(@/OT1&$L/_PH/Z`W;<N`````##05=!5D%505154TB#["A)B?U(
+MB?5)B=9(B4PD($B)^F9!QP8```^W1@(ET````#W`````=`<]T````'4)2(V"
+MN"D``.L@#[=&`B6@````N0`````]H`````^%L0$``$B-AZ0E```/MU`42(U8
+M&+D`````9H72#X24`0``#[=-`&8["W(3#[?"2&O`9F8[3`.:=C5F.PMS'TB)
+MWDR)[^@O____9D&)!DB)WDR)[^CQ_O__Z0T!```/M\)(:\!F2(U<&)KI&@$`
+M`+\`````N0`````/M\*)QCG!?2(/MT4`B<)F.P-V%XG(_\&)QSGQ?0U(8\%(
+M:\!F9CL4`W?I2&/!2&O09D0/MSP32&/'2&O`9DB)1"00#[<$`T$IQT6%_P^.
+MJ0```$R-)!I,B>9,B>_HGO[__YB)1"0<2`-<)!!(B=Y,B>_HB?[__Y@I1"0<
+M#[=%``^W$RG0#Z]$)!R)1"0,2(G>3(GOZ&?^__^800^OQP-$)`R90??_9IAF
+M08D&3(GF3(GOZ!K^__]$#[_@2(G>3(GOZ`O^__^802G$#[=%``^W$RG01(GE
+M#Z_H2(G>3(GOZ.W]__^800^OQXT$*)E!]_]FF$B+5"0@9HD"ZS9(8\%(:]!F
+M#[=%`&8[!!-U+$@!TTB)WDR)[^CE_?__9D&)!DB)WDR)[^BG_?__2(MT)"!F
+MB0:Y`0```.L%N0````")R$B#Q"A;74%<05U!7D%?PT%7059!54%455-(@^P(
+M28G^28GT08G50;\!````O0`````YU7-`2&/=28TTW$B-3"0&2(U4)`1,B??H
+MH?W__X7`=!8/MD0D!$&(1-P&#[9$)`9!B$3<!^L&0;\`````_\5$.>URP$2)
+M^$B#Q`A;74%<05U!7D%?PTB#[!A(B5PD"$B);"002(GU2(G[OX0```#H````
+M`$B)@^`Q``!(A<!T-L>#@$@````!``"_``$``.@`````2(F#>$@``$B%P'06
+MOP`&``#H`````$B)@W`N``!(A<!U#L=%``(```"X`````.M=2,>#>"X`````
+M``!(QX.`+@```````$C'@X@N````````2,>#D"X```````!(QX.8+@``````
+M`$C'@Z`N````````2,>#J"X```````!(QX.P+@```````+@!````2(M<)`A(
+MBVPD$$B#Q!C#05=!5D%505154TB#[`A)B?Q!B=>)R[T`````2<?&`````$&)
+M]4ACQ4B-!$!!BPS&28M4)"!)C41%`$&+!(:)!!'_P_;#/W4*OP$```#H````
+M`/_%@_T==LR]`````$ACQ8L,Q0````!)BU0D((L$Q0````")!!'_P_;#/W4*
+MOP$```#H`````/_%@_U_=L^]`````$G'Q@````!%B?U(8\5(C01`08L,ADF+
+M5"0@3`'H08L$AHD$$?_#]L,_=0J_`0```.@`````_\6#_3]VSDB#Q`A;74%<
+M05U!7D%?PT%6055!5%5328G\2(GU0;X`````0;T`````9H$^OQ(/A^,````/
+MMSZ-AW#W__](8]!(:=)G9F9F2,'J(-'ZB<'!^1\IRHT4DCG0=2.-G#_@[O__
+M2&/#2&G`9V9F9DC!Z"")P<'Y`HG8F8G+*=/K5P^W-HV&4/?__TACT$AITF=F
+M9F9(P>H@T?J)P<'Y'RG*C122N0`````YT`^%"@(``(V<-J#N__](8\-(:<!G
+M9F9F2,'H((G!P?D"B=B9B<LITT&^`0```,'C`H'C_P```+X(````B=_H````
+M`(G#28M4)""+@@2B``!F@7T`M`EU!8/($.L(28M4)""#X.^)@@2B``#I5P$`
+M``^W%@^WPFG`S<P``,'H$&;!Z`*-!(")T68IP6:#^0)U2F:!^CL5=T.-0OX/
+MM\"-!("-A`"`1/__2&/X2&G_'X7K44C![R#!_P/!^!\IQ__'O@@```#H````
+M`(G#O@(```"_`````.GD````#[=5``^WPFG`S<P``,'H$&;!Z`2-!(#!X`)F
+M.<)U+6:!^O\3=B8/M\(MP!(``$AC^$AI_V=F9F9(P>\@P?\#P?@?*<?!YP+I
+M@@````^W50`/M\)IP,W,``#!Z!!FP>@#C02``<!F.<)U(@^WPBW`$@``2&/X
+M2&G_9V9F9DC![R#!_P+!^!\IQP'_ZT(/MU4`#[?":<#-S```P>@09L'H`HT$
+M@+D`````9CG"#X6%````#[?"+<`2``!(8_A(:?]G9F9F2,'O(-'_P?@?*<>^
+M"````.@`````B<.^`@```+\!````Z`````!!B<6)WL'F!$*-!*T`````"<9#
+MC00V"<:!S@$0``!)BU0D($`/ML:)@IR8``#![@A)BU0D((GP@^!_B8+8F```
+M28FL).@3``"Y`0```(G(6UU!7$%=05[#05=!5D%505154TB#[`A)B?U!B==)
+MB?Y!N@````!FQT0D!@``0;D`````9L=$)`0``+T`````3(NGX#$```^W1@(E
+M\`$``#W0````#X3`````/=````!_&SV@````#X2=````/<`````/A*,```#I
+MM0```#U``0``=`L]4`$```^%HP````^W!F8MH0]F/>H$=Q)%#[>6#!4``$$/
+MMX8.%0``ZU4/MP9F+8P49CWO`'<210^WEA`5``!!#[>&$A4``.LV#[<&9BU\
+M%68]X`!W$D4/MY84%0``00^WAA85``#K%V:!/EP6=DE%#[>6&!4``$$/MX8:
+M%0``9HE$)`;K,D0/MX\<%0``#[>''A4``.L010^WCB`5``!!#[>&(A4``&:)
+M1"0$ZPJX`````.G)`@``N0````!(Q\<`````2&/1BP3708D$E/_!=/*Y````
+M`$$/M_])Q\``````2&/!2(T40$B-%%=!BQ2008E4A`3_P73HN0````!!#[?_
+M2<?``````$ACP4B-%$!(C11708L4D$&)5(0(_\%TZ+D`````00^W_TG'P```
+M``!(8\%(C11`2(T45T&+%)!!B52$#/_!@_DD=N6`?@(`#XFB````00^W\4F-
+M7"0,0;@`````N?$```"Z`P```$B)W^@`````#[=T)`1!N`````"Y[@```+H#
+M````2(G?Z`````!!N`(```"Y(P$``+H!````O@$```!(B=_H`````$&#O7P#
+M```)=!5!@[U\`P``"G5Q9D&#O8`#```#=V:^`P```+\&````Z`````")QDF-
+M?"0,0;@#````N8,```"Z`P```.LY00^W\DF-7"0,0;@`````N?<```"Z`P``
+M`$B)W^@`````#[=T)`9!N`````"Y]````+H#````2(G?Z`````"Y`````$$/
+MM_=(Q\<`````2&/!2(T40$B-%%:+%)=!B92$H````/_!@_D"=N.[`````$AC
+MPXL,Q0````!)BU4@08L$A(D$$?_%0/;%/W4*OP$```#H`````/_#=-6[````
+M`$ACPTB-%$"+#-4`````28M5($&+1(0$B001_\5`]L4_=0J_`0```.@`````
+M_\-TT+L`````2&/#2(T40(L,U0````!)BU4@08M$A`B)!!'_Q4#VQ3]U"K\!
+M````Z`````#_PW30NP````!(8\-(C11`BPS5`````$F+52!!BT2$#(D$$?_%
+M0/;%/W4*OP$```#H`````/_#@_LD=LV[`````$ACPTB-%$"+#-4`````28M5
+M($&+A(2@````B001_\5`]L4_=0J_`0```.@`````_\.#^P)VRD''AK0Q````
+M````N`$```!(@\0(6UU!7$%=05Y!7\-(BY?@,0``@_X'=R2)\/\DQ0````!(
+MB=##2(U"!,-(C4((PTB-0@S#2(V"H````,.X`````,-!B=$/M\),C11&#[_7
+M#[<&.<)]#D''``````#'`0````###[_700^W0OXYPGPH00^WP?_(ZPE,B<A(
+M*?!(T?A!B0")`<-,B<A(*?!(T?B)`?_`08D`PTF)\4PYUG,=#[_700^W`3G0
+M=,U!#[=!`CG"?--)@\$"33G1<N:0PT%7059!54%455-(@^P82(G+38G&08GW
+M9HE4)`Y%B<Q#C2P_0;T`````N`````!F08/Y`0^&VP````^W1"0.9BGP9D$Y
+MQ0^'Q````(GX2,'@!DB)!"0/O_U,C40D%$B-3"0000^WU$B)WN@5____@WPD
+M%`!U",=$)!0!````00^WU(U"_SE$)!!U!XU"_HE$)!"+3"00BU0D%`^W!$MF
+M.P13=0=!#[<43NL[#[_-BW0D$`^_/'-!B<A!*?B+5"0400^W!%9$#Z_`#[\4
+M4XG0*<A!#[<,=@^OP4*-!``I^HG1F??YB<)!#[?%2`,$)$B+3"109HD404'_
+MQ8/%`@^W1"0.9D0I^&9!.<4/AD;___^X`0```$B#Q!A;74%<05U!7D%?PT&)
+M^HGW08G108G+B<AF03GQ="A!#[?R#[?_B?`I^$$/O]`/K\)!#[?)B<HI\D$/
+MO_,/K]8!T"GYF??YF,-!5T%6055!5%532(/L2$F)UDR)1"0@3(E,)!AFB70D
+M+F:)3"0L2(NO<"X``,=$)!``````#[=2%`^_?"0N3(U$)$1(C4PD0$R)]NC4
+M_?__QT0D%`````"X`P```$&)P40K3"041(G(BU0D0$AKTF9(C01`2(TTQ0``
+M``!(`?))C0P61`^W:2!F187M#X3;`0``BU0D$`^W01Y(BYPD@````&:)!%-(
+MC3P23(U$)#@/MU$L9D&)%#B+1"1$2&O`9D@!\$P!\&8[4"Q^"0^W0"QF08D$
+M.(M$)!!,C00`0@^W1`0XB<)FP>H/`=!FT?AF0HE$!#A,C50D,$2)R8M$)$!!
+M#[?]2(T$0$B)PDC!X@1(`=!(C0Q)2,'A`D@!R$@!^$$/MW1&*F9#B30"BT0D
+M1$B-!$!(B<)(P>($2`'02`'(2`'X9D$[=$8J?@M!#[=$1BIF0XD$`D2+9"00
+M30'D0@^W1"0PB<)FP>H/`=!FT?AF0HE$)#!%#[?MBTPD0$AKR69$B<M(C1Q;
+M2,'C`T@!V4P!\4R-02)(@\$L#[_00@^_="0X2(DL)$6)Z8M\)!#H[OS__XM,
+M)$1(:\EF2`'93`'Q3(U!(DB#P2Q"#[]4)#!"#[]T)#A(C84``@``2(D$)$6)
+MZ8M\)!#HM?S__T(/MT0D,$&]`````&9".T0D.'1IBT0D$$B)PDC!X@9(B50D
+M"$0/MWPD+DR-)`!$B>M(`UPD"$0/OX1=``(```^_3%T`BT0D1$$/MQ1&BT0D
+M0$$/MS1&1(G_Z'K]__]FB81=``0``$'_Q4(/MT0D,&9"*T0D.`^WP$$YQ7*Q
+M_T0D$/]$)!2#?"04`P^&W/W__XM$)#A(BTPD(&:)`4&]`````,=$)!0`````
+M1#ML)!`/@_,!``!(C5PD,$R-7"0X1`^W9"0LBT0D$/_(.40D%'47BU0D%`^W
+M!%.#P`1,BW0D&&9!B016ZR>+3"04#[\$2XM4)!3_PD$/OQ13`=")PL'J'P'0
+MT?A(BU0D&&:)!$J^`````(-\)!0`=!^+1"04_\A(BTPD&`^W!$&+5"0400^_
+M%%,IT(G&1"GFBT0D%$C!X`</MY0%`@0``(G19BN,!0`$``"X`0````]$R(7V
+M>4"+1"042,'@!TB-?`4`1`^WP8GP00^OP$2)ZD'_Q0^WCP`$``!F`<&X````
+M``])P4R+M"2(````9D&)!%;_QGC1BU0D%$B-!!)$#[\4`T$/OP0#02G"2(M,
+M)!@/MSQ11`'G*<=%B=%!.?I$#T?/00^_P4&)P#G&?3!(B=%(P>$&1(GH2&/6
+M2(T4"O_&#[>450`$``!,B[0DB````&9!B11&0?_%1#G&?->+1"0408U*_TC!
+MX`9(C0P!08U2_D@!T`^WE$T`!```B=%F*XQ%``0``+@!````#T3(1#G/=E8/
+MO\<YQGU/BT0D%$&-4O](P>`&3(T4`D0/M\$/O_^)\$0IR$$/K\!"#[>,50`$
+M```!P42)ZD'_Q6:#^7^X?P````].P4B+C"2(````9HD$4?_&.?Y\R/]$)!1$
+MBW0D$$0Y="04#X(=_O__@WPD%`-W(HM$)!2+5"04_\I(BTPD&`^W%%%FB11!
+M_T0D%(-\)!0#=MY!@_U_=R!$B>A!C57_2(N<)(@````/MQ139HD40T'_Q4&#
+M_7]VX$B#Q$A;74%<05U!7D%?PT%6055!5%532(/L($B)_4B)SDF)_4B+GWA(
+M```/MT$")=`````]P````'0'/=````!U"4V-I;@I``#K(P^W00(EH````$B-
+MCZ0E``!(C9>0(0``/:````!)B<Q,#T7B2(M%((N`;*(``$&)QD&#Y@]!#[?.
+M#[<V2(E<)`A,B00D3(U,)!A,C40D%DR)XDB)[^AZ^O__2(M-((N16*(``(#F
+M/T$/MT0D'/_(P>`.)0#````)PHF16*(``&:#?"06`'01#[=$)!;WV&9!B87L
+M,0``ZPIF0<>%[#$`````OX"B``"^`````(T,M0````")R`^V%$.-00$/M@1#
+MP>`("<*-00(/M@1#P>`0"<*#P0,/M@1+P>`8"<*)^4B+12")%`&#QP3_QH/^
+M'W:\2(MU($2)\H/B#P^W1"08P>`$)?`#```)PDB-3"08#[=!`L'@"B4`_```
+M"<(/MT$$P>`0)0``/P`)P@^W00;!X!8E``#`#PG"B99LH@``N`$```!(@\0@
+M6UU!7$%=05[#4TB)^TB#OWA(````=!=(B[]X2```Z`````!(QX-X2```````
+M`$B#N^`Q````=!=(B[O@,0``Z`````!(QX/@,0```````$B#NW`N````=!=(
+MB[MP+@``Z`````!(QX-P+@```````%O#N@````"Y`P```(G(*=!(C01`2(T$
+MQF:#>`@`=`4/OT`4P__"@_H#=N&X`````,.Z`````(G02(T,0`^W1,X(9H7`
+M=`T/M\!(C02(#[]$1A+#_\*#^@-VW+@`````PT%7059!54%455-(@^P828G]
+M2(GU2(E4)!!(B4PD"$B)^DB+1"009L<````/MT8")=`````]P````'0'/=``
+M``!U"4B-@K@I``#K(P^W1@(EH````$B-CZ0E``!(@<*0(0``/:````!(B<A(
+M#T7"#[=0%$B-6!BX`````&:%T@^$=`$```^W30!F.PL/@C4!```/M\)(:\!F
+M9CM,`YIV&F8["P^"'@$```^WPDAKP&9(C5P8FND-`0``OP````"Y``````^W
+MPHG&.<%](@^W10")PF8[`W87B<C_P8G'.?%]#4ACP4AKP&9F.Q0#=^E(8\%(
+M:]!F1`^W-!-(8\=(:\!F2(D$)`^W!`-!*<9%A?8/CIT```!,C20:3(GF3(GO
+MZ*W^__]$#[_X2`,<)$B)WDR)[^B:_O__F$$IQP^W10`/MQ,IT$0/K_A(B=Y,
+MB>_H?O[__YA!#Z_&0HT$.)E!]_YFF$B+5"009HD"3(GF3(GOZ"W^__]$#[_@
+M2(G>3(GOZ![^__^802G$#[=%``^W$RG01(GE#Z_H2(G>3(GOZ`#^__^800^O
+MQHT$*)E!]_YFF.LR2&/!2&O09@^W10!F.P03=3!(`=-(B=Y,B>_H`/[__TB+
+M5"009HD"2(G>3(GOZ+[]__](BW0D"&:)!K@!````ZP6X`````$B#Q!A;74%<
+M05U!7D%?PT%7059!54%455-(@^P(28G^28GT08G50;\!````O0`````YU7-`
+M2&/=28TTW$B-3"0&2(U4)`1,B??HNOW__X7`=!8/MD0D!$&(1-P&#[9$)`9!
+MB$3<!^L&0;\`````_\5$.>URP$2)^$B#Q`A;74%<05U!7D%?PTB#[!A(B5PD
+M"$B);"002(GU2(G[OZP```#H`````$B)@^`Q``!(A<!T-L>#@$@````!``"_
+M``$``.@`````2(F#>$@``$B%P'06OP`&``#H`````$B)@W`N``!(A<!U#L=%
+M``(```"X`````.M=2,>#>"X```````!(QX.`+@```````$C'@X@N````````
+M2,>#D"X```````!(QX.8+@```````$C'@Z`N````````2,>#J"X```````!(
+MQX.P+@```````+@!````2(M<)`A(BVPD$$B#Q!C#*%`6+%@H````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````H/^C_Y[_H/^C_Z#_````````!0`*`!0`'@`R`$8`50!:`%\`9```````
+M```````````*`!0`'@`H`#(`/`!&`%``6@!D``````````````#"````Q```
+M`,4```#0````V@```.0``````````````,(```##````U````/(````-`0``
+M*`$``,\```#*`````@!0(0$`0`$$`*``"`#``"``T`!``%`!````````````
+M````````````````````)`&8&0`F$`8`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M________`````````````````````````)@``$<````(F`````````R8``"F
+MCH0)$)@```#@,CT4F```:P<``!R8````````()@````"`@(DF```#@X``"B8
+M```!`@(*+)@``/QO`P`PF````````#28```.#@``.)@```<````\F`````$"
+M`$"8`````&.)1)@``)P6<A-(F```,[88`$R8```\88024)@``."XZ`U4F```
+M64@'`%B8``"ZOH!^7)@``%YF.C%@F```"!T``&28````S@$`:)@``)!!FD!P
+MF```#P```'28``"`````>)@```0`````F0````````29````````")D`````
+M```,F0````"``!"9```#`````)L````````$FP``(`````B;```0````#)L`
+M`#`````0FP``"````!2;```H````&)L``"@````<FP``!````"";```D````
+M))L``!0````HFP``-````"R;```,````,)L``"P````TFP```@```#B;```B
+M````/)L``!(```!`FP``,@```$2;```*````2)L``"H```!,FP```0```%";
+M```A````5)L``!$```!8FP``,0```%R;```)````8)L``"D```!DFP``!0``
+M`&B;```E````;)L``!4```!PFP``-0```'2;```-````>)L``"T```!\FP``
+M`P```(";```C````A)L``!,```"(FP``,P```(R;```+````D)L``"L```"4
+MFP``!P```)B;```G````G)L``!<```"@FP``-P```*2;```/````J)L``"\`
+M``"LFP``+P```+";```O````M)L``"\```"XFP``+P```+R;```O````P)L`
+M`"\```#$FP``+P```,B;```O````S)L``"\```#0FP``+P```-2;```O````
+MV)L``"\```#<FP``+P```.";```O````Y)L``"\```#HFP``+P```.R;```O
+M````\)L``"\```#TFP``+P```/B;```O````_)L``"\`````F@``'0````2:
+M``!=````")H``)T````,F@``W0```!":```=`0``%)H``"$````8F@``80``
+M`!R:``"A````()H``.$````DF@``,0```"B:``!Q````+)H``+$````PF@``
+M'````#2:``!<````.)H``"D````\F@``:0```$":``"I````1)H``"````!(
+MF@``&0```$R:``!9````4)H``)D```!4F@``,````%B:```%````7)H``"4`
+M``!@F@``90```&2:``"E````:)H``"@```!LF@``:````'":```?````=)H`
+M`!X```!XF@``&````'R:``!8````@)H``)@```"$F@```P```(B:```$````
+MC)H``$0```"0F@``A````)2:```3````F)H``!(```"<F@``4@```*":``"2
+M````I)H``-(```"HF@``*P```*R:```J````L)H``&H```"TF@``J@```+B:
+M```;````O)H``!H```#`F@``6@```,2:``":````R)H``-H```#,F@``!@``
+M`-":```&````U)H```8```#8F@``!@```-R:```&````X)H```8```#DF@``
+M!@```.B:```&````[)H```8```#PF@``!@```/2:```&````^)H```8```#\
+MF@``!@```-28```@````S)@```0```#(F```!@$&`)R8``!M````P)@`````
+M``#0F```%```````````````"0D```````("!@8&!@8&`@(````#``8`"0`\
+M`````````````````````````````````````/````#,````````````````
+M````"N(````@```*`@```1@```$```!`&`0`````````````````````````
+M```````````````%!%<9`"80!@``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````!L"8\)
+MM`D```````````````````````#_______\`````````````````````````
+M```````````````@````(````$````!````````&````!@````8`,````!4`
+M```5````'0```!4```!`$```#_PO``_\+P`?_"\`#_PO`$00```/_"\`#_PO
+M`!_\+P`/_"\`2!````_\+P`/_"\`'_PO``_\+P!,$```#_PO``_\+P`?_"\`
+M#_PO`%`0```/_"\`#_PO`!_\+P`/_"\`5!````_\+P`/_"\`'_PO``_\+P!8
+M$```#_PO``_\+P`?_"\`#_PO`%P0```/_"\`#_PO`!_\+P`/_"\`8!````_\
+M+P`/_"\`'_PO``_\+P!D$```#_PO``_\+P`?_"\`#_PO`'`0``!H`0``X`$`
+M`+@!``!H`0``,!```#`"``#@`0``L````#`"``"P$```F`T``(`1``!('P``
+MF`T``/`0``#@H```:$`!`(!8``#@H```%(`````$``0`"``(`#``(``$``0<
+M@```IX^-#L^/C0Z5CV`!IX^-#@28`````````P``````````````()@````"
+M`@(``@("``(!`@`"`@(DF```#@X```X.```'!P``#@X``"B8```!``(*`0`"
+M"@```04!``(*-)@```X.```.#@``#@X```X.```XF```!P````<````+````
+M"P```$28``"<%G(3I19R$Z@6<A.<%G(32)@``&>Z&`!GNA@`:;H8`&FZ&`!0
+MF```X+0H#."T*`S@M"@,X+0H#%B8```N#8!^+@V`?BX-P'XN#8!^7)@``%Y=
+M-S%>73<Q7ETZ,5Y=-S%@F```$+T``!"]```XO0``$+T``&28````S@$``,X!
+M``#.`0``S@$`%)D``!`G```0)P``?!4``!`G```8F0``D`$``)`!``"$````
+MD`$``$29```@$.!O(!#@;R`)X&\@$.!O@*$``/\4_P7_%/\%_Q3_!?\9_P74
+MF```$````!0````0````$``````````,`````````"@```"<G(2$+````'Q\
+M?'PT````!0```$``````````1`````@```!(````"````$P````0````4```
+M``````!4````'P`````(````````!`@````````("`````````P(````````
+M$`@````````4"````````!@(````````'`@````````@"````````"0(````
+M````,!(````````$@`````````B`````````#(`````````8@````````"2`
+M````````*(```#`````L@```__\'`#"```#___\!-(```#$````X@```````
+M`#R`````````0(````````!$@````@```$B`````````5(````````!8@```
+M``````B8````````#)@``).0A"T0F````.`R?128``!K#P``')@````````L
+MF```_F\"`#"8````````/)@````!`@!`F```>@%J($R8```\88025)@``%D(
+M``!HF```D$&:0&R8``"!L`P%<)@```\```!TF```@````'B8```,`````)D`
+M```````$F0````````B9````````#)D`````@``0F0```0```!R9```J"0``
+M()D````````DF0``!8H%`"B9```!````+)D````````PF0```````#29````
+M````.)D````````\F0``/P```$"9```$````2)D```````!,F0```````%"9
+M````````5)D``$SQ4%U8F0``&````%R9``".:DL`A*$``/\%_P:(H0``_P?_
+M!XRA``#_"/\(D*$``/\)_PF4H0``_PK_"IBA``#_"_\+G*$``/\,_PR@H0``
+M_PW_#:2A``#_#O\/J*$``/\2_Q*LH0``_Q/_%+"A``#_%?\6M*$``/\7_QFX
+MH0``_QK_&[RA``#_'?\>P*$``/\@_R/$H0``_R7_)\BA``#_*?\LS*$``/\O
+M_S'0H0``_S3_-]2A``#_.O\ZV*$``/\Z_SK<H0``_SK_.N"A``#_.O\ZY*$`
+M`/\Z_SKHH0``_SK_.NRA``#_.O\Z\*$``/\Z_SKTH0``_SK_.OBA``#_.O\Z
+M_*$``/\Z_SH`FP````````2;```@````")L``!`````,FP``,````!";```(
+M````%)L``"@````8FP``!````!R;```D````()L``!0````DFP``-````"B;
+M```,````+)L``"P````PFP```@```#2;```B````.)L``!(````\FP``,@``
+M`$";```*````1)L``"H```!(FP``!@```$R;```F````4)L``!8```!4FP``
+M-@```%B;```.````7)L``"X```!@FP```0```&2;```A````:)L``!$```!L
+MFP``,0```'";```)````=)L``"D```!XFP``!0```'R;```E````@)L``!4`
+M``"$FP``-0```(B;```-````C)L``"T```"0FP```P```)2;```C````F)L`
+M`!,```"<FP``,P```*";```+````I)L``"L```"HFP``*P```*R;```K````
+ML)L``"L```"TFP``*P```+B;```K````O)L``"L```#`FP``*P```,2;```K
+M````R)L``"L```#,FP``*P```-";```K````U)L``"L```#8FP``*P```-R;
+M```K````X)L``"L```#DFP``*P```.B;```K````[)L``"L```#PFP``*P``
+M`/2;```K````^)L```(```#\FP``%@```-28```@````V)@``&@08```````
+M``````":``"I`0````````2:``#I`0``0`````B:```I````@`````R:``!I
+M````4`$``!":``"9`0``D`$``!2:``#9`0``T`$``!B:```9````$````!R:
+M``!9````1````"":``"9````A````"2:``"E`0``2`$``"B:``#E`0``B`$`
+M`"R:```E````R`$``#":``#(`0``%````#2:```(````0@```#B:``!(````
+M@@```#R:``"(````>`$``$":``"8`0``N`$``$2:``#8`0``^`$``$B:```8
+M````$@```$R:``!8````4@```%":``"8````D@```%2:``"D`0``?`$``%B:
+M``#D`0``O`$``%R:```D````_`$``&":``!D````"@```&2:``"D````2@``
+M`&B:``#D````B@```&R:```*`0``6@$``'":``!*`0``F@$``'2:``"*`0``
+MV@$``'B:``#*`0``#@```'R:```*````3@```(":``!*````C@```(2:``"*
+M````7@$``(B:``"Z`0``G@$``(R:``#Z`0``W@$``)":```Z````"0```)2:
+M``!Z````20```)B:``"&`0``B0```)R:``#&`0``>0$``*":```&````N0$`
+M`*2:``!&````^0$``*B:``"&````.0```*R:``#&````>0```+":``#&````
+MN0```+2:``#&````O0$``+B:``#&````_0$``+R:``#&````/0```,":``#&
+M````?0```,2:``#&````O0```,B:``#&````_0```,R:``#&````_0```-":
+M``#&````_0```-2:``#&````_0```-B:``#&````_0```-R:``#&````_0``
+M`.":``#&````_0```.2:``#&````_0```.B:``#&````_0```.R:``#&````
+M_0```/":``#&````_0```/2:``#&````_0```/B:``#&````_0```/R:``#&
+M````_0````$```!&````8`````$```!&````80````$```!&````8@````$`
+M``!&````8P````$```!&````9`````$```!&````90````$```!&````9@``
+M``$```!&````9P````$```!&````:`````$```!&````:0````$```!&````
+M:@````$```!&````:P````$```!&````;`````$```!&````=`````$```!&
+M````=`````$```!&````=`````$```!&````=`````$```!&````=`````$`
+M``!&````=`````$```!&````=`````$```!&````=`````$```!&````=0``
+M``$```!&````=@````$```!&````=P````$```!&````>`````$```!&````
+M>0````$```!&````>@````$```!&````>P````$```!&````?`````$```!&
+M````?0````$```!&````?@````$```!&````?P````$```!&````@`````$`
+M``!$````?`````$```!&````B`````$```!&````C`````$```!&````D```
+M``$```!&````E`````$```!&````F`````$```!&````G`````$```!&````
+MH`````$```!&````I`````$```!&````J`````$```!&````K`````$```!&
+M````L`````$```!&````M``````"!P```````````````````````````)X6
+M"P!B%@H`.A8)`!P6"`#J%0<`FA4%`$H5!``#%0(`610``````0````,`!@`)
+M`#\`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````"0````0````$
+M``$``0`!``8```!&1S@`````````````````!`````$``0`$````1D<W````
+M``````````````,``0`!``$``P```$9'-@`````````````````$```````!
+M``$```!&1S4`````````````````!``!``$`````````1D<T````````````
+M``````0````!````_O___T9',P`````````````````#``$``0```/W___]&
+M1S(`````````````````!`````````#\____1D<Q``````````````````(`
+M`0`!````^O___T9',```````````````````````````````````````````
+M````````````%!!4&0`F$`8`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````;`F/";0)
+M"`EL";0)________!0(/!P(/"@`/"0`/````````````````````````````
+M```````````````````````````````````````````````````````@````
+M(````$````!````````&````!@````8`GA8+`&(6"@`Z%@D`'!8(`.H5!P":
+M%04`2A4$``,5`@!9%```N`L!````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````&`````0````(````#````!`````4`````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````$`0```/_"\`#_PO
+M`!_\+P`/_"\`#_PO`$00```/_"\`#_PO`!_\+P`/_"\`#_PO`$@0```/_"\`
+M#_PO`!_\+P`/_"\`#_PO`$P0```/_"\`#_PO`!_\+P`/_"\`#_PO`%`0```/
+M_"\`#_PO`!_\+P`/_"\`#_PO`%00```/_"\`#_PO`!_\+P`/_"\`#_PO`%@0
+M```/_"\`#_PO`!_\+P`/_"\`#_PO`%P0```/_"\`#_PO`!_\+P`/_"\`#_PO
+M`&`0```/_"\`#_PO`!_\+P`/_"\`#_PO`&00```/_"\`#_PO`!_\+P`/_"\`
+M#_PO`#`0```P`@``X`$``+````!@`0``X`$``'`0``!H`0``X`$``+@!``",
+M`0``X`$``+`0``!@#@``@!$``!P?```X/@``@!$``/`0``#@H```:$`!`(!8
+M``#@L```:$`!`!2```#H`^@#X`;@!B`$(`1`"$`(X`;@!@28`````````P``
+M`````````````P```""8`````@("``("`@`"`0(``@("``("`B28```.#@``
+M#@X```<'```.#@``#@X``$28```<%G(3)1QR$R(7<A.B%G(3)1QR$V"8```0
+MG0``$)T``!B=```8G0``$)T``&28````S@$``,X!``#.`0``S@$``,X!`&B8
+M``"009I`D$&:0)!!FD"009I`D$&:0!B9``"X`0``N`$``(0````(`0``N`$`
+M`"29```%B@40!8H%$`6*!1`%B@40!8H%$#"B```````````````````(`0``
+M````````````````#``````````T````!0```$``````````1`````@```!(
+M````"````$P````0````4`````````!4````'P`````(````````!`@`````
+M```("`````````P(````````$`@````````4"````````!@(````````'`@`
+M```````@"````````"0(````````<!(````````X$````````'@0````````
+MN!````````#X$````````#@1````````>!$```````"X$0```````/@1````
+M````.!(```````!X$@```````+@2````````^!(````````X$P```````'@3
+M````````N!,```````#X$P```````#@4````````>!0```````"X%```````
+M`/@4````````.!4```````!X%0```````+@5````````^!4````````X%@``
+M`````'@6````````N!8```````#X%@```````#@7````````>!<```````"X
+M%P```````/@7````````/!````````!\$````````+P0````````_!``````
+M```\$0```````'P1````````O!$```````#\$0```````#P2````````?!(`
+M``````"\$@```````/P2````````/!,```````!\$P```````+P3````````
+M_!,````````\%````````'P4````````!(`````````(@`````````R`````
+M````((`````````D@````````"B````P````+(```/__!P`P@```____`32`
+M```Q````.(`````````\@````````$B`````````5(````````!8@```````
+M`%R```"/QP\`P(```!HP@BK$@```X`'<!<B````0)T`?S(``````]`'0@```
+M'!X``-2```"JJ@(`V(```%55``+<@````````."```#_____Y(```/__``#H
+M@````````.R`````````\(````````#T@````````/B`````````_(```(@`
+M````AP````````2'``",````"(<``.0````,AP``U0(``!"'````````%(<`
+M```````8AP``H````!R'``#)`0``((<``"P````DAP``+````"B'```P````
+M+(<``#P````PAP``+````#2'```L````.(<``#`````\AP``/````$"'````
+M````1(<```````!(AP```````$R'````````4(<```````!4AP```````%B'
+M````````7(<```````!@AP``U0```&2'``#?````:(<```(!``!LAP``.@$`
+M`'"'``!U````=(<``'\```!XAP``H@```'R'`````````($```(``0`$@0``
+M`0````B!``#`````#($````````0@0``:`$``!2!````````P(<````!`@/$
+MAP``!`4&!\B'```("0H+S(<```P-#@_0AP``$!$2$]2'```4%187V(<``!@9
+M&AO<AP``'!T>'^"'`````0(#Y(<```0%!@?HAP``"`D*"^R'```,#0X/\(<`
+M`!`1$A/TAP``%!46%_B'```8&1H;_(<``!P='A\,F```&8Z$K1"8````X"A]
+M%)@``&N?"IP<F````````$"8``!Z`6H@5)@``%D(````F0````````29````
+M````")D````````,F0````"``!"9```!````')D``(`,```@F0`````0!2B9
+M```!````+)D```0````TF0``(B`?'CB9```-#`L*/)D``#\```!(F0``$K*`
+MDE29``"(X5!=7)D``(YJ2P!HF0``S@,``'"9```5M2\9>)D```$```!\F0``
+M`````!"B```S8X``%*(``!!L$``8H@``8$"<`""B``#&,(@!)*(````$```L
+MH@```````#2B```@("`@.*(``"`@("!`H@``(`I).$2B``"V>P``2*(``/P_
+M_P\`FP```````"B;```,````.)L``!(```!DFP``(0```(R;```M````G)L`
+M`#,```````,`!@`)`#\````#``8`"0`_``````````````````D````$````
+M!``!``$``0````````````8```!&1S@`````````````````!`````$``0``
+M``````````0```!&1S<``````````````````P`!``$``0````````````,`
+M``!&1S8`````````````````!````````0````````````$```!&1S4`````
+M````````````!``!``$```````````````````!&1S0`````````````````
+M!`````$``````````````/[___]&1S,``````````````````P`!``$`````
+M`````````/W___]&1S(`````````````````!````````````````````/S_
+M__]&1S$``````````````````@`!``$``````````````/K___]&1S``````
+M````````````````````````````````````````````````````````````
+M``````````````````````@````!`````P````````````````````8```!&
+M1S<``````````````````@````````````````````````!&1S8`````````
+M`````````0```````````````````/W___]&1S4`````````````````````
+M`````````````````/K___]&1S0````````````````````!``$`````````
+M`````/C___]&1S,````````````````````!``$````!``$``````/;___]&
+M1S(````````````````````!`````0`!``$``````//___]&1S$`````````
+M```````````!`````0`!`````0```/#___]&1S``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````P````%8```!6````5@```%8```!6````<@```IX^-
+M$L\/B`F5#^`$JP_@$L\/B`DHF````0`""@$``@H``0$%`0`""@$``@HTF```
+M#@X```X.```.#@``#@X```X.```XF```!P````<````+````"P````L```!(
+MF```6MH8`%K:&`!IRA@`:<H8`&G*&`!0F```X+3H#>"TZ`W@M.@-X+3H#>"T
+MZ`U8F```+@V`?BX-@'XN3>A^+DWH?BX-@'Y<F```7F8W,5YF-S%>9C<Q7F8W
+M,5YA-S%LF```@;`,!8&P#`6!L`P%@+`,!8"P#`44F0``$"<``!`G``!\%0``
+M^"H``!`G``!$F0``(!"X]R`0N/<@#;CW(!"X]R`0N/<,H@``:D$L9&I!+&1J
+M04!D:D%`9&I!0&0<H@``"H"#&`J`@Q@*@',8"H"#&`J`@Q@`````````````
+M````````,!(````````(F````````"R8``#^+P(`/)@````!`@!,F```/&&$
+M$C"9``"#2```0)D```0```!8F0``_P```'29````````^)D``!@````$H@``
+M``````BB``"(9S[0**(``+4!```\H@``KXG($P2;```@````")L``!`````,
+MFP``,````!";```(````%)L``"@````8FP``!````!R;```D````()L``!0`
+M```DFP``-````"R;```L````,)L```(````TFP``(@```#R;```R````0)L`
+M``H```!$FP``*@```$B;```&````3)L``"8```!0FP``%@```%2;```V````
+M6)L```X```!<FP``+@```&";```!````:)L``!$```!LFP``,0```'";```)
+M````=)L``"D```!XFP``!0```'R;```E````@)L``!4```"$FP``-0```(B;
+M```-````D)L```,```"4FP``(P```)B;```3````H)L```L```"DFP``*P``
+M`*B;```K````K)L``"L```"PFP``*P```+2;```K````N)L``"L```"\FP``
+M*P```,";```K````Q)L``"L```#(FP``*P```,R;```K````T)L``"L```#4
+MFP``*P```-B;```K````W)L``"L```#@FP``*P```.2;```K````Z)L``"L`
+M``#LFP``*P```/";```K````])L``"L```#XFP```@```/R;```6````G)@`
+M````````````````````````````G)@`````````````````````````````
+MG)@`````````````````````````````G)@`````````````````````````
+M````G)@`````````````````````````````G)@`````````````````````
+M````````G)@`````````````````````````````G)@`````````````````
+M````````````G)@`````````````````````````````G)@`````````````
+M````````````````G)@`````````````````````````````G)@`````.```
+M`#@````X````.````#@`G)@`````````````````````````````G)@`````
+M````````````````````````G)@`````````````P````(````"`````G)@`
+M`/D`!`#Y``0`_P`$`/T`!`#]``0`U)@`````````````!`````0````$````
+M````````````F@``J0$````````$F@``Z0$``$`````(F@``*0```(`````,
+MF@``:0```%`!```0F@``F0$``)`!```4F@``V0$``-`!```8F@``&0```!``
+M```<F@``60```$0````@F@``F0```(0````DF@``I0$``$@!```HF@``Y0$`
+M`(@!```LF@``)0```,@!```PF@``R`$``!0````TF@``"````$(````XF@``
+M2````((````\F@``B````'@!``!`F@``F`$``+@!``!$F@``V`$``/@!``!(
+MF@``&````!(```!,F@``6````%(```!0F@``F````)(```!4F@``I`$``'P!
+M``!8F@``Y`$``+P!``!<F@``)````/P!``!@F@``9`````H```!DF@``I```
+M`$H```!HF@``Y````(H```!LF@``"@$``%H!``!PF@``2@$``)H!``!TF@``
+MB@$``-H!``!XF@``R@$```X```!\F@``"@```$X```"`F@``2@```(X```"$
+MF@``B@```%X!``"(F@``N@$``)X!``",F@``^@$``-X!``"0F@``.@````D`
+M``"4F@``>@```$D```"8F@``A@$``(D```"<F@``Q@$``'D!``"@F@``!@``
+M`+D!``"DF@``1@```/D!``"HF@``A@```#D```"LF@``Q@```'D```"PF@``
+MQ@```+D```"TF@``Q@```+T!``"XF@``Q@```/T!``"\F@``Q@```#T```#`
+MF@``Q@```'T```#$F@``Q@```+T```#(F@``Q@```/T```#,F@``Q@```/T`
+M``#0F@``Q@```/T```#4F@``Q@```/T```#8F@``Q@```/T```#<F@``Q@``
+M`/T```#@F@``Q@```/T```#DF@``Q@```/T```#HF@``Q@```/T```#LF@``
+MQ@```/T```#PF@``Q@```/T```#TF@``Q@```/T```#XF@``Q@```/T```#\
+MF@``Q@```/T```#4F```(```````````````U)@``!`````4````$````!``
+M```4``````````````#8F```:!!@`&@08`!H$&``:!!@`&@08```````````
+M``````````````````````"<F`````````````````````````````"<F```
+M``````````````````````````"<F`````````````````````````````"<
+MF`````````````````````````````"<F```````````````````````````
+M``"<F```````$````!`````0````$````!"<F```````!`````0````$````
+M!`````2<F`````````````````````````````"<F```````````````````
+M``````````"<F`````````````````````````````"<F```````````````
+M```*``````````"<F```P``X`(``.`#``#@"P``X`,``.`"<F```!@`"``8`
+M`@`&````!@`"``8``@"<F```B0```(D```")````B0```(D```"<F```H```
+M`*````"@````H````*````"<F```!P`$``<`!``'``0`!P`$``<`!`#4F```
+M&@```!H````:````&@```!H``````````````)R8``!`````2````$````!`
+M````0````)R8```0````$````!`````0````$````)R8```(````"`````@`
+M```(````"````)R8``!/````3P```$\```!/````3P```)R8``#Q````\0``
+M`&$```#Q````\0```)R8``!/D```3Y```$R0``!/D```3Y```)R8``!:$@``
+M6A(``)H2``!:$@``6A(``,R8```.````#@````\````.````#@````$```!&
+M````8`````$```!&````80````$```!&````8@````$```!&````8P````$`
+M``!&````9`````$```!&````90````$```!&````9@````$```!&````9P``
+M``$```!&````:`````$```!&````:0````$```!&````:@````$```!&````
+M:P````$```!&````;`````$```!&````=`````$```!&````=`````$```!&
+M````=`````$```!&````=`````$```!&````=`````$```!&````=`````$`
+M``!&````=`````$```!&````=`````$```!&````=0````$```!&````=@``
+M``$```!&````=P````$```!&````>`````$```!&````>0````$```!&````
+M>@````$```!&````>P````$```!&````?`````$```!&````?0````$```!&
+M````?@````$```!&````?P````$```!&````@`````$```!$````?`````$`
+M``!&````B`````$```!&````C`````$```!&````D`````$```!&````E```
+M``$```!&````F`````$```!&````G`````$```!&````H`````$```!&````
+MI`````$```!&````J`````$```!&````K`````$```!&````L`````$```!&
+M````M```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````">%@8`8A8$`#H6`P`<%@(`ZA4!`)H5``!*%0```Q4!`%D4`P"X"P4`
+M````````````````````````````````,````!6````5@```%8```!6````5
+M@```'(```*>3C1+/$X@)E1/@!*L3X!+/$X@)*)@```$``@H!``(*``$"!0$`
+M`@H!``(*-)@```X.```.#@``#@X```X.```.#@``.)@```<````'````"P``
+M``L````+````2)@``&W:&`!MVA@`=<H8`'7*&`!URA@`4)@``."TZ`W@M.@-
+MX+3H#>"TZ`W@M.@-6)@``"X-@'XN#8!^+@WH?BX-Z'XN#8!^7)@``%YF-S%>
+M9C<Q7F8W,5YF-S%>9C<Q;)@``(&P#`6!L`P%@;`,!8&P#`6!L`P%%)D``-`'
+M``#0!P``3`0``)@(``#0!P``1)D``"`0N/<@$+CW$`VX]Q`0N/<0$+CW!*(`
+M````````````"`````@````(````"*(``(AGOM:(9[[6B&<^T(AG/M"(9S[0
+M#*(``$`!+&1``2QD8,%"9&#!0F1@P4)D'*(```J`@Q@*@(,8"H!S&`J`@Q@*
+M@(,8,!(````````(F````````"R8``#^+P(`/)@````!`@!,F```/&&$$C"9
+M``""2```0)D```0```!8F0``_P```'29````````**(``+4!```\H@``KXG(
+M$P2;```!````")L```(````,FP```P```!";```$````%)L```4````8FP``
+M"````!R;```)````()L```H````DFP``"P```"R;```-````,)L``!`````T
+MFP``$0```#R;```3````0)L``!0```!$FP``%0```$B;```8````3)L``!D`
+M``!0FP``&@```%2;```;````6)L``!P```!<FP``'0```&";```@````:)L`
+M`"(```!LFP``(P```'";```D````=)L``"4```!XFP``*````'R;```I````
+M@)L``"H```"$FP``*P```(B;```L````D)L``#````"4FP``,0```)B;```R
+M````H)L``#0```"DFP``-0```*B;```U````K)L``#4```"PFP``-0```+2;
+M```U````N)L``#4```"\FP``-0```,";```U````Q)L``#4```#(FP``-0``
+M`,R;```U````T)L``#4```#4FP``-0```-B;```U````W)L``#4```#@FP``
+M-0```.2;```U````Z)L``#4```#LFP``-0```/";```U````])L``#4```#X
+MFP``$````/R;```:`````````````````````````````````````)H```<`
+M```'````!)H``$<```!'````")H``(<```"'````#)H``*`!``"@`0``$)H`
+M`.`!``#@`0``%)H``"`````@````&)H``&````!@````')H``*$!``"A`0``
+M()H``.$!``#A`0``))H``"$````A````*)H``&$```!A````+)H``&(!``!B
+M`0``,)H``*(!``"B`0``-)H``.(!``#B`0``.)H``"(````B````/)H``&(`
+M``!B````0)H``&,!``!C`0``1)H``*,!``"C`0``2)H``.,!``#C`0``3)H`
+M`",````C````4)H``&,```!C````5)H``(0!``"$`0``6)H``,0!``#$`0``
+M7)H```0````$````8)H``.H!```+````9)H``"H```!+````:)H``&H```"+
+M````;)H``*H```"L`0``<)H``*L!``#L`0``=)H``.L!```L````>)H``"L`
+M```2````?)H``&L```!2````@)H``*L```"2````A)H``*P!``"3`0``B)H`
+M`.P!``#3`0``C)H``"P````3````D)H``#H```!3````E)H``'H```"3````
+MF)H``+H```"4`0``G)H``+L!``#4`0``H)H``/L!```4````I)H``#L````Z
+M````J)H``'L```!Z````K)H``+L```"Z````L)H``+P!``"[`0``M)H``/P!
+M``#[`0``N)H``#P````[````O)H``'P```![````P)H``+P```"[````Q)H`
+M`/P```"\`0``R)H``/P```#\`0``S)H``/P````\````T)H``/P```!\````
+MU)H``/P```"\````V)H``/P```#\````W)H``/P```#\````X)H``/P```#\
+M````Y)H``/P```#\````Z)H``/P```#\````[)H``/P```#\````\)H``/P`
+M``#\````])H``/P```#\````^)H``/P```#\````_)H``/P```#\````U)@`
+M`"```````````````-"8```(!`8#"`0'`P@$!@,(!`8#"`0'`P``````````
+MW)@``,`@H`#`(*``P"#@`,`@X`#`(.``````````````````````````````
+M````G)@```````\````/````#P````\````/G)@`````````````````````
+M````````G)@`````@````(````"`````@````(``G)@`````*@```"H````J
+M````*@```"H`G)@``````0````$````!`````0````$`G)@`````````````
+M````````````````G)@`````&````!@````8````&````!@`G)@`````8```
+M`&````!N````;@```&X`G)@`````QP```,<```#'````QP```,<`G)@`````
+M2P```$L```!+````2P```$L`G)@`````2`0``$@$``!(!```2`0``$@$G)@`
+M````3````$P```!,````3````$P`G)@`````Y````.0```#D````Y````.0`
+MG)@`````````````````````````````G)@`````_````/P```#\````_```
+M`/P`G)@`````_P```/\```#_````_P```/\`G)@`````/P0``#\$```_!```
+M/P0``#\$G)@`````#`````P````,````#`````P`G)@`````&0(``!D"```9
+M`@``&0(``!D"G)@`````)````"0````D````)````"0`G)@`````M````+0`
+M``"T````M````+0`G)@`````F0```)D```"9````F0```)D`G)@`````4```
+M`%````!0````4````%``G)@`````*@```"H````J````*@```"H`G)@`````
+M$@```!(````2````$@```!(`G)@`````,L```#+````RP```,L```#+`G)@`
+M````=`$``'0!``!T`0``=`$``'0!G)@`````$0```!$````1````$0```!$`
+MG)@`````*(8``"B&```HA@``*(8``"B&G)@`````A#$``(0Q``"$,0``A#$`
+M`(0QG)@``(``\@"``/(`@`#R`(``\@"``/(`G)@``!D`)P`9`"<`&0`G`!D`
+M)P`9`"<`G)@```,````#`````P````,````#````G)@`````````````````
+M````````````G)@``+(```"R````L@```+(```"R````G)@``(0@L`"$(+``
+MA""P`(0@L`"$(+``G)@``*0E00"D)4$`I"5!`*0E00"D)4$`G)@``""2$0`@
+MDA$`()(1`""2$0`@DA$`G)@```!(&@``2!H``$@:``!(&@``2!H`V)@``#`"
+M"P`P`@L`,`(+`#`""P`P`@L`G)@``)0```"4````E````)0```"4````G)@`
+M`)$```"1````D0```)$```"1````G)@``!(````2````$@```!(````2````
+MG)@``(````"`````@````(````"`````G)@``-D```#9````V0```-D```#9
+M````G)@``&````!@````8````&````!@````G)@``/````#P````\````/``
+M``#P````G)@``*(```"B````H@```*(```"B````G)@``%(```!2````4@``
+M`%(```!2````G)@``-0```#4````U````-0```#4````G)@``,P4``#,%```
+MS!0``,P4``#,%```G)@``(P$``",!```C`0``(P$``",!```Q)@```,````#
+M`````P````,````#````````````````````````````````````````````
+M````````````````````````````````````````````````````````,```
+M`!4````5````%0```!4````5````'(```*>3C1+/$X@)E1/@!*L3X!+/$X@)
+M*)@```$``@H!``(*```"!0$``@H!``(*-)@````.````#@````X````.````
+M#@``.)@```(````"````"@````H````*````2)@``&W:&`!MVA@`9&H:`&1J
+M&@!D:AH`4)@``."TZ`W@M.@-VK#H#=JPF`S:L.@-6)@``"X-@'XN#8!^+@WH
+M?BX-R'XN#8!^7)@``%YF-S%>9C<Q7F8W,5Y@.3%>9C<Q;)@``(&P#`6!L`P%
+M@;`,!8&P#`6!L`P%%)D``-`'``#0!P``3`0``)@(``#0!P``1)D````0N/<`
+M$+CW``VX]P`0N/<`$+CW!*(`````````````````````````````"*(``(AG
+MOM:(9[[6B&<^T(AG/M"(9S[0#*(``$`!+`!``2P`0,%"`$#!0@!`P4(`'*(`
+M``J`@Q@*@(,8"H!C&`J`@Q@*@(,8,!(``.`#``!@@```#P```!B!````````
+M'($````````@@0```````"2!````````*($````````L@0```````#"!````
+M````-($````````X@0```````#R!````````0($``*@``(!$@0````````B8
+M````````+)@```"@```\F`````0@`$R8```\(X02<)@``!\```!TF```@```
+M`'B8```.````6)D``/\```"`F0```````(29`````(`"H)D```````#@F0``
+M`````.29``"JJJJJZ)D``'AD1CSLF0``J@```/"9```,````])D``/\```#X
+MF0``%````"BB``"U"0``/*(``*^)R)-,H@```0```%"B````H```5*(`````
+M``!8H@``@%/'#%RB```!#P\/8*(```$/:5]DH@``$8I!`&BB````````;*(`
+M`&K!,`QPH@``(`B"`'2B``"J?!L`>*(``,XYYQQ\H@``S@$7!0"C``````$8
+M!*,```(F`S`(HP``!CX'2`RC```*3`M6$*,```]@&F04HP``&VY/>!BC``!:
+M?(^&'*,``%N&SXX@HP``#Y=/G22C``"/H<^E**,``!^O7[4LHP``G[G?O3"C
+M```_QW_--*,``+_1_]4XHP```````#RC````````0*,```````!$HP``````
+M`$BC``#___\_3*,``/___S]0HP``____/U2C``#__P,`6*,``!^JJ'E<HP``
+M#T)L!F"C```'(B@/9*,``(468!=HHP``!!&`'VRC```##*`W<*,``(,(Q#]T
+MHP```PC`5WBC``""!MA??*,``(($X'^`HP``NGL\?X2C``#P?S#S!)L```$`
+M```(FP```@````R;```#````$)L```0````4FP``!0```!B;```(````')L`
+M``D````@FP``"@```"2;```+````+)L```T````PFP``$````#2;```1````
+M/)L``!,```!`FP``%````$2;```5````2)L``!@```!,FP``&0```%";```:
+M````5)L``!L```!8FP``'````%R;```=````8)L``"````!HFP``(@```&R;
+M```C````<)L``"0```!TFP``)0```'B;```H````?)L``"D```"`FP``*@``
+M`(2;```K````B)L``"P```"0FP``,````)2;```Q````F)L``#(```"@FP``
+M-````*2;```U````J)L``#4```"LFP``-0```+";```U````M)L``#4```"X
+MFP``-0```+R;```U````P)L``#4```#$FP``-0```,B;```U````S)L``#4`
+M``#0FP``-0```-2;```U````V)L``#4```#<FP``-0```.";```U````Y)L`
+M`#4```#HFP``-0```.R;```U````\)L``#4```#TFP``-0```/B;```0````
+M_)L``!H```````````````":``````````````2:````````0`````B:````
+M````@`````R:````````@0$``!":````````P0$``!2:`````````0```!B:
+M````````00```!R:````````@0```"":````````:`$``"2:````````J`$`
+M`"B:````````Z`$``"R:````````*````#":````````:````#2:````````
+MB0$``#B:````````R0$``#R:````````"0```$":````````20```$2:````
+M````B0```$B:````````D`$``$R:````````T`$``%":````````$````%2:
+M````````4````%B:````````D````%R:````````D0$``&":````````T0$`
+M`&2:````````$0```&B:````````40```&R:````````D0```'":````````
+M>`$``'2:````````N`$``'B:````````^`$``'R:````````.````(":````
+M````>````(2:````````F0$``(B:````````V0$``(R:````````&0```)":
+M````````60```)2:````````F0```)B:````````V0```)R:````````^0``
+M`*":````````^0```*2:````````^0```*B:````````^0```*R:````````
+M^0```+":````````^0```+2:````````^0```+B:````````^0```+R:````
+M````^0```,":````````^0```,2:````````^0```,B:````````^0```,R:
+M````````^0```-":````````^0```-2:````````^0```-B:````````^0``
+M`-R:````````^0```.":````````^0```.2:````````^0```.B:````````
+M^0```.R:````````^0```/":````````^0```/2:````````^0```/B:````
+M````^0```/R:````````^0```-28```@``````````````#0F```"!0``@@4
+M`0((%``""!0``@@4`0(``````````-R8``#`(*``P""@`,`@X`#`(.``P"#@
+M`````````````````````````````````)R8``````#P````\````/````#P
+M````\)R8`````````````````````````````)R8```````#`````P````,`
+M```#`````YR8`````````````````````````````)R8````````````````
+M`````````````)R8`````````````````````````````)R8````````````
+M`````````````````)R8`````````````````````````````)R8`````$!`
+M``!`0```0$```$!```!`0)R8``````5E```%90``!64```5E```%99R8````
+M`````````````````````````)R8`````````````````````````````)R8
+M`````$(```!"````0@```$(```!"`)R8`````+4```"U````M0```+4```"U
+M`)R8``````,````#`````P````,````#`)R8`````/<```#W````]P```/<`
+M``#W`)R8`````)T```"=````G0```)T```"=`)R8`````"(````B````(@``
+M`"(````B`)R8`````"($```B!```(@0``"($```B!)R8```8`",`&``C`!@`
+M(P`8`",`&``C`)R8`````"@````H`&``*`!@`"@`8``H`)R8``#``%``P`!0
+M`,,`4`##`%``PP!0`)R8``!_``0`?P`$`'\`!`!_``0`?P`$`)R8``!8!```
+M6`0``%@$``!8!```6`0``)R8`````````````````````````````)R8````
+MP````,````#`````P````,```-B8```P`D``,`)``#`"0``P`D``,`)`````
+M`````````````````````````````)R8````9````&0```!D````9````&0`
+M`)R8````"`````@````(````"`````@``,R8```.````#@````X````.````
+M#@``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```P````%0```!4````5````%0```!4````<@```IY.-$L\3B`F5$^`$JQ/@
+M$L\3B`DHF````0`""@$``@H``0(%`0`""@$``@HTF```#@X```X.```.#@``
+M#@X```X.```XF```!P````<````+````"P````L```!(F```8?H8`&'Z&`!C
+M&AH`8QH:`&,:&@!0F```X+28#."TF`S:L)@,VK"8#-JPF`Q8F```+@W(?BX-
+MR'XN#<A^+@W(?BX-R'Y<F```7F`Y,5Y@.3%>8#DQ7F`Y,5Y@.3%LF```@;`,
+M!8&P#`6!L`P%@;`,!8&P#`44F0``T`<``-`'``!,!```F`@``-`'``!$F0``
+M`!"X]P`0N/<`#;CW`!"X]P`0N/<$H@`````````````````````````````(
+MH@``B&>^UHAGOM:(9S[0B&<^T(AG/M`,H@``X,$N`.#!+@`@P2H`(,$J`"#!
+M*@`<H@``"H"#&`J`@Q@*@&,8"H"#&`J`@Q@`HP`````!&````1@```$8```!
+M&````1@$HP```B8#,`(F`S`")@,P`B8#,`(F`S`(HP``!CX'2`8^!T@&/@=(
+M!CX'2`8^!T@,HP``"DP+5@I,"U8*3`M6"DP+5@I,"U80HP``#V`:9`]@&F0/
+M8!ID#V`:9`]@&F04HP``&VY/>!MN3W@;;D]X&VY/>!MN3W@8HP``6GR/AEI\
+MCX9:?(^&6GR/AEI\CX8<HP``6X;/D%N&SY!;AL^.6X;/CEN&SXX@HP``#Y=/
+MG0^73YT/ET^;#Y=/FP^73YLDHP``CZ//IX^CSZ>/G\^CCY_/HX^?SZ,HHP``
+M'Z]?M1^O7[4?KU^S'Z]?LQ^O7[,LHP``G[G?O9^YW[V?N=^[G[G?NY^YW[LP
+MHP``/\5_RS_%?\L_QW_+/\=_RS_'?\LTHP``O]'_U;_1_]6_T?_3O]'_T[_1
+M_],`````````````````````,!(``.`#``!H0```$````&"````/````G(``
+M``````"@@````````!B!````````'($````````@@0```````"2!````````
+M*($````````L@0```````#"!````````-($````````X@0```````#R!````
+M````0($``/D#`(!$@0````````B8````````+)@```"@```\F`````0@`$R8
+M```\(X02<)@``!\```!TF```@````'B8```.````6)D``/\?"`"`F0``````
+M`(29`````(`"H)D```````#@F0```````.29``"JJJJJZ)D``'AD1CSLF0``
+MJ@```/"9```,````])D``/\```#XF0``%````"BB``"U"0``/*(``*^)R)-,
+MH@```0```%"B````H```5*(```````!8H@``@%/'#%RB```!#P\/8*(```$/
+M:5]DH@``$8I!`&BB````````;*(``&K!,`QPH@``(`B"`'2B``"J?!L(>*(`
+M`,XYYQQ\H@``S@$7!3BC````````/*,```````!`HP```````$2C````````
+M2*,``/___S],HP``____/U"C``#___\_5*,``/__`P!8HP``'ZJH>5RC```/
+M0FP&8*,```<B*`]DHP``A19@%VBC```$$8`?;*,```,,H#=PHP``@PC$/W2C
+M```#",!7>*,``((&V%]\HP``@@3@?X"C``"Z>SQ_A*,``/!_,/,$FP```0``
+M``B;```"````#)L```,````0FP``!````!2;```%````&)L```@````<FP``
+M"0```"";```*````))L```L````LFP``#0```#";```0````-)L``!$````\
+MFP``$P```$";```4````1)L``!4```!(FP``&````$R;```9````4)L``!H`
+M``!4FP``&P```%B;```<````7)L``!T```!@FP``(````&B;```B````;)L`
+M`",```!PFP``)````'2;```E````>)L``"@```!\FP``*0```(";```J````
+MA)L``"L```"(FP``+````)";```P````E)L``#$```"8FP``,@```*";```T
+M````I)L``#4```"HFP``-0```*R;```U````L)L``#4```"TFP``-0```+B;
+M```U````O)L``#4```#`FP``-0```,2;```U````R)L``#4```#,FP``-0``
+M`-";```U````U)L``#4```#8FP``-0```-R;```U````X)L``#4```#DFP``
+M-0```.B;```U````[)L``#4```#PFP``-0```/2;```U````^)L``!````#\
+MFP``&@````":``````````````2:``!`````0`````B:``"`````@`````R:
+M``"A`0``80$``!":``#A`0``H0$``!2:```A````X0$``!B:``!A````(0``
+M`!R:``"(`0``80```"":``#(`0``B`$``"2:```(````R`$``"B:``!(````
+M"````"R:``"(````2````#":``"I`0``B````#2:``#I`0``:0$``#B:```I
+M````J0$``#R:``!I````Z0$``$":``#0`0``*0```$2:```0````:0```$B:
+M``!0````D`$``$R:``"0````T`$``%":``"Q`0``$````%2:``#Q`0``4```
+M`%B:```Q````D````%R:``!Q````<0$``&":``"X`0``L0$``&2:``#X`0``
+M\0$``&B:```X````,0```&R:``!X````<0```'":``"9`0``F`$``'2:``#9
+M`0``V`$``'B:```9````&````'R:``!9````6````(":``"9````F````(2:
+M``#9````>0$``(B:``#Y````N0$``(R:``#Y````^0$``)":``#Y````.0``
+M`)2:``#Y````>0```)B:``#Y````N0```)R:``#Y````^0```*":``#Y````
+M^0```*2:``#Y````^0```*B:``#Y````^0```*R:``#Y````^0```+":``#Y
+M````^0```+2:``#Y````^0```+B:``#Y````^0```+R:``#Y````^0```,":
+M``#Y````^0```,2:``#Y````^0```,B:``#Y````^0```,R:``#Y````^0``
+M`-":``#Y````^0```-2:``#Y````^0```-B:``#Y````^0```-R:``#Y````
+M^0```.":``#Y````^0```.2:``#Y````^0```.B:``#Y````^0```.R:``#Y
+M````^0```/":``#Y````^0```/2:``#Y````^0```/B:``#Y````^0```/R:
+M``#Y````^0```-28```@``````````````#0F```"`````@````(````"```
+M``@``````````````-R8``#``*``P`"@`,``X`#``.``P`#@````````````
+M`````````````````````)R8```````S````,P```#,````S````,YR8````
+M```!`````0````$````!`````9R8`````````````````````````````)R8
+M`````````````````````````````)R8````````````````````````````
+M`)R8```````?````'P```!\````?````'YR8````````````````````````
+M`````)R8`````+@```"X````N````+@```"X`)R8`````+<```"W````MP``
+M`+<```"W`)R8`````(0```"$````A````(0```"$`)R8`````)@```"8````
+MF````)@```"8`)R8`````,````#`````P````,````#``)R8`````/\```#_
+M````_P```/\```#_`)R8`````/\```#_````_P```/\```#_`)R8`````/\`
+M``#_````_P```/\```#_`)R8`````/\```#_````_P```/\```#_`)R8````
+M`-<```#7````UP```-<```#7`)R8`````&$```!A````80```&$```!A`)R8
+M`````/X```#^````_@```/X```#^`)R8`````-X```#>````W@```-X```#>
+M`)R8`````'\```!_````?P```'\```!_`)R8`````#T$```]!```/00``#T$
+M```]!)R8`````'<```!W````=P```'<```!W`)R8`````$0```!$````1```
+M`$0```!$`)R8`````)@```"8````F````)@```"8`)R8``"``!``@``0`(``
+M$`"``!``@``0`)R8```TP`4`-,`%`#3`!0`TP`4`-,`%`)R8``#P`#$`\``Q
+M`/``,0#P`#$`\``Q`)R8```?`0P`'P$,`!\!#``?`0P`'P$,`)R8``!``%$`
+M0`!1`$``40!``%$`0`!1`)R8``#:`%``V@!0`-H`4`#:`%``V@!0`)R8````
+M`````````````````````````)R8``!$0```1$```$1```!$0```1$```)R8
+M`````````````````````````````)R8``#`8```P&```,!@``#`8```P&``
+M`)R8````+````"P````V````-@```"P``,B8```#!````P0```,$```#!```
+M`P0`````````````G)@```!D````9````&0```!D````9```G)@````(````
+M"`````@````(````"```S)@```X````.````#@````X````.````````````
+M````````````````````````````````````````````````````````````
+M`````````````````$%2-3(Q,`!!4C4R,3$`05(U,C$R`%)&-3$Q,0!21C4Q
+M,3(`4D8R-#$S`%)&-30Q,P!!=&AE<F]S(#(S,3,@5VE3;T,`071H97)O<R`U
+M-#(T+S(T,C0`071H97)O<R`R,S$W(%=I4V]#`$%T:&5R;W,@-3(Q,B`H1E!'
+M02D`071H97)O<R`U,C$Q("A&4$=!*0!!=&AE<F]S(#4R,3``071H97)O<R`U
+M,C$Q`$%T:&5R;W,@-3,Q,B!7:5-O0P!!=&AE<F]S(#(S,34@5VE3;T,`071H
+M97)O<R`U,C$R````````````````````````````````````,"XY+C(P+C,`
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````#_
+M`?\!`````````````/________]_```````````#`)@!F0$`````````````
+M_________W\```````````<`F`$P"P````````````#_________?P``````
+M````"`"8`3`,`````````````/________]_```````````@`"`!$`H`````
+M````````_________W\``````````"$`(`&9`0````````````#_________
+M?P``````````(@`@`3`,`````````````/________]_```````````Z`&`!
+M$`H`````````````_________W\``````````#L`8`&9`0````````````#_
+M________?P``````````$@!E`1`*```#`````````/________]_````````
+M```W`#`!F0$```,`````````_________W\``````````#4`,`*9`0```P``
+M``````#_________?P``````````-@`P`YD!```#`````````/________]_
+M```````````P`#`$F0$```,`````````_________W\``````````#D`,`69
+M`0```P````````#_________?P``````````-``P!ID!```#`````````/__
+M______]_```````````R`#`#F0$```,`````````_________W\`````````
+M`#$`,`.9`0````````````#_________?P``````````$0`0`9D!````````
+M`````/________]_```````````0`!`!$`H`````````````_________W\`
+M`````````%(`4`&9`0````````````#_________?P``````````10!0`ID!
+M`````````````/________]_``````````!'`%`#F0$`````````````____
+M_____W\``````````$(`4`29`0````````````#_________?P``````````
+M6`!0!9D!`````````````/________]_``````````!;`%`&F0$`````````
+M````_________W\``````````%T`4`B9`0````````````#_________?P``
+M````````7@!0"9D!`````````````/________]_``````````!0`%`#$`H`
+M````````````_________W\``````````%4`4`$P#`````````````#_____
+M____?P``````````5@!0`C`,`````````````/________]_``````````!)
+M`%`"4`T`````````````_________W\``````````$``0`%`"@``1@````0`
+M```H`````````(@!````````00!``4`*``!'````!````&@`````````B0$`
+M``````!(`$`!$`H``$8````$````"`````````"*`0```````$H`0`%`"@``
+M1@````0````(&````````(P!````````2P!``4`*``!&````!`````A@````
+M````C0$```````!,`$`!4`H``$8````$````"`````````"/`0```````$,`
+M0`)`"@``1P````0```!P`````````(L!````````\`!``T`*``!&````!```
+M`"````````````````````"``$`#0`H``$<````$````8`````````"G#P``
+M`````/$`0`-`"@``1@````0`````&```````````````````@0!``T`*``!&
+M````!`````!@````````J`\```````""`$`#4`H``$8````$````````````
+M``"I#P```````/(`0`,0"@``1@````0`````````````````````````@P!`
+M!$`*``!'````!````&"`````````J@\```````#T`$`$0`H``$8````$````
+M`)@``````````````````(0`0`1`"@``1@````0`````X````````*L/````
+M````A0!`!%`*``!&````!`````"`````````K`\```````#U`$`$$`H``$8`
+M```$`````(```````````````````(8`0`5`"@``1P````0```!@@```````
+M`*T/````````AP!`!4`*``!&````!`````#@````````K@\```````"(`$`%
+M4`H``$8````$`````(````````"O#P```````(D`0`9`"@``1P````0```!H
+M`````````+`/````````B@!`!D`*``!&````!`````A@````````L0\`````
+M``"+`$`&4`H``$8````$````"`````````"R#P```````(P`0`=`"@``1P``
+M``0```!H@````````+,/````````C0!`!T`*``!&````!`````C@````````
+MM`\```````".`$`'4`H``$8````$````"(````````"U#P```````(\`0`A`
+M"@``1P````0```!H@````````+8/````````D`!`"$`*``!&````!`````C@
+M````````MP\```````"1`$`(4`H``$8````$````"(````````"X#P``````
+M`/8`0`E`"@``1P````0```!@@```````````````````]P!`"T`*``!'````
+M!````&"```````````````````!@`&``8```````````````_________W\`
+M`````````&$`80!A`````P````````#_________?P``````````8@!B`&(`
+M```"`````````/________]_``````````!C`&,`8P``````````````____
+M_____W\``````````&0`9`!D`````P````````#_________?P``````````
+M90!E`&4````#`````````/________]_``````````!F`&8`9@``````````
+M````_________W\``````````&<`9P!G``````````````#_________?P``
+M````````:`!H`&@``````````````/________]_``````````!I`&D`:0``
+M``,`````````_________W\``````````&H`:@!J`````P````````#_____
+M____?P``````````90````$```#_____@````/____\`````2E```+0/````
+M````:@````$```#_____@````/____\`````2E```+0/````````````````
+M````````````````````````_P$```$````!`````0```%@;`````!```0``
+M``$````!````6!L```@``P`!``````````$```!8&P``#``#``$`````````
+M`0```%@;```@`$<`````````````````6!L``#,`,``!``````````$```!8
+M&P``)``A``$````!`````0```%@;```H`#<``0`````````!````6!L``!\`
+M,``!`````0````$```!8&P``,`!;``$``````````0```%@;``!P``,``0``
+M```````!````6!L``#@`-P`!``````````$```!8&P``5`!5``$````!````
+M`0```%@;``!$`%4``0````$````!````6!L``$P`.P`!``````````````!8
+M&P``8`!2``$````!`````0```%@;``!D`#0``0`````````!````6!L``'P`
+M(``!`````0````$```!8&P``F`!;``$````!`````0```%@;``"<`%(``0``
+M``$````!````6!L``*H`$``!``````````$```!8&P``O``#``$`````````
+M`0```%@;``"_`#8``0`````````!````6!L``,0`-P`!`````0````$```!8
+M&P``RP`W``$``````````0```%@;``#0`#<``0`````````!````6!L``-8`
+M$``!`````0````$```!8&P``V@`#`````````````````%@;```R`S8``0``
+M```````!````6!L``-X``P`!``````````$```!8&P``Z0`W``$`````````
+M`0```%@;``#V`#<``0`````````!````6!L``/H`-P`!``````````$```!8
+M&P``_P`V``$``````````0```%@;```,`3```0````$````!````6!L``!0!
+M-P`!``````````$```!8&P``+`$W``$``````````0```%@;``!``1```0``
+M``$````!````6!L``%0!`P`!``````````$```!8&P``6`$A``$````!````
+M`0```%@;``!<`3<``0`````````!````6!L``&`!-P`!``````````$```!8
+M&P``9`%;``$``````````0```%@;``!H`5(``0`````````!````6!L``&P!
+M4@`!`````0````$```!8&P``=`$W``$``````````0```%@;``!X`0,``0``
+M```````!````6!L``'P!-P`!``````````$```!8&P``B`%```$`````````
+M`````%@;``")`4$``0``````````````6!L``(H!2``!``````````````!8
+M&P``BP%#``$``````````````%@;``",`4H``0``````````````6!L``(T!
+M2P`!``````````````!8&P``CP%,``$``````````````%@;``"G#X```0``
+M````````````6!L``*@/@0`!``````````````!8&P``J0^"``$`````````
+M`````%@;``"J#X,``0``````````````6!L``*L/A``!``````````````!8
+M&P``K`^%``$``````````````%@;``"M#X8``0``````````````6!L``*X/
+MAP`!``````````````!8&P``KP^(``$``````````````%@;``"P#XD``0``
+M````````````6!L``+$/B@`!``````````````!8&P``L@^+``$`````````
+M`````%@;``"S#XP``0``````````````6!L``+0/C0`!``````````````!8
+M&P``M0^.``$``````````````%@;``"V#X\``0``````````````6!L``+</
+MD``!``````````````!8&P``N`^1``$``````````````%@;``"0`4(``0``
+M```````!````6!L``(X!`P`!``````````$```!8&P``F`%%``$````!````
+M`0```%@;``":`44``0``````````````6!L``)L!10`!``````````````!8
+M&P``G`%>``$``````````````%@;``">`0,``0`````````!````6!L``*P!
+M-P`!``````````$```!8&P``I@$#``$``````````0```%@;``"V`3<``0``
+M```````!````6!L``+@!-P`!``````````$```!8&P``N@$W``$`````````
+M`0```%@;``"^`2$``0````$````!````6!L``"<#`P`!``````````$```!8
+M&P``R@%=``$``````````````%@;``#6`3<``0`````````!````6!L``.0!
+M$``!`````0````$```!8&P``[`$P``$````!`````0```%@;``#X`0,``0``
+M```````!````6!L``!`"-P`!``````````$```!8&P``*@(B``$`````````
+M`0```%@;``!"`C<``0`````````!````6!L````"6P`!``````````$```!8
+M&P``2@(#``$``````````0```%@;``!/`A```0````$````!````6!L``%P"
+M4@`!``````````$```!8&P``8`([``$````!`````0```%@;``!H`C<``0``
+M```````!````6!L``&P"-P`!``````````$```!8&P``=@(0``$````!````
+M`0```%@;``!Z`@,``0`````````!````6!L``(("`P`!``````````$```!8
+M&P``@P(#``$``````````0```%@;``"J`B$``0`````````!````6!L``+X"
+M6P`!`````0````$```!8&P``OP(W``$``````````0```%@;``#!`C<``0``
+M```````!````6!L``,8".P`!``````````$```!8&P``U`(W``$`````````
+M`0```%@;``#P`C<``0`````````!````6!L``/0"-P`!``````````$```!8
+M&P``^`(#``$``````````0```%@;``">`%```0````$````!````6!L``/P"
+M`P`!``````````$```!8&P``#`,P``$``````````0```%@;```4`S8``0``
+M```````!````6!L``!@#-@`!``````````$```!8&P``)`,#``$`````````
+M`0```%@;```0`P,``0`````````!````6!L``#H#-P`!``````````$```!8
+M&P``2`,0``$````!`````0```,$6``!*`Q(``0````$````!````6!L``%H#
+M$0`!``````````$```!8&P``7`,Z``$````!`````0```%@;``!>`U8``0``
+M```````!````6!L``,`"`P`!``````````$```!8&P``=P,#``$`````````
+M`0```%@;``#,`@,``0`````````!````6!L````````S$ST3%P`*!0``````
+M````$``````````0`````````$<341,7``H%```````````0`````````!``
+M````````.!-T$Q<`%!0``````````!``````````!P````````!.$WL3&P8%
+M!0```````````0```````````````````%$3>1,>!@H%```````````!````
+M````````````````5A-T$R$&%`4```````````$```````````````````"K
+M$[`3%P`*!0``````````$``````````,`````````+`3V!,7`!04````````
+M```0``````````(`````````OQ._$Q<`"@4``````````!``````````#```
+M````````%'@4!084%````````````````````````````````#(4;A07`!04
+M```````````8``````````$`````````,A1N%!0`%!0``````````!@`````
+M`````0`````````\%'@4#P`4%```````````!0```````````````````#P4
+M>!01!A04```````````!``````````$`````````/!1X%!(`%!0`````````
+M``4````````````````````\%'@4%``4%```````````!0``````````````
+M`````#P4>!07`!04```````````%````````````````````/!1X%!<&%!0`
+M``````````$````````````````````\%,@4%`84%`(`````````!```````
+M`````````````'@4H!07`!04`0`````````%````````````````````C!2@
+M%!<`%!0#``````````4```````````````````",%,@4$@`4%`,`````````
+M!0```````````````````(P4R!04`!04!P`````````%@```````````````
+M````C!3(%!0&%!0#``````````$``````````@````````",%,@4%P84%`,`
+M`````````0`````````"`````````(P4R!07!A04`P`````````!````````
+M````````````C!3(%!X`%!0```````````````````````````````",%$06
+M!084%`,``````````````````````````````*`4R!01!A04`P`````````!
+M````````````````````?!7T%1X&%!0"``````````0`````````````````
+M``!\%406%`84%`,``````````0`````````$`````````'P51!8;`!04`P``
+M```````%````````````````````?!5$%AX`%!0#``````````4`````````
+M``````````!\%406%P`4%`<``````````8```````````````````'$6K187
+M`!04````````````````````````````````<1:M%AX&%!0`````````````
+M``````````````````!Q%JT6'@84%`(`````````!```````````````````
+M`'$6P18%!A04````````````````````````````````<1;!%A$`%!0`````
+M``````````````````````````!Q%L$6%``4%```````````````````````
+M`````````'$6P18>`!04````````````````````````````````<1;!%AX&
+M%!0``````````````````````P````````!Q%L$6'@84%```````````````
+M`````````````````#@3=!,>`!04````````````!```````````````````
+ML!/8$QX`%!0````````````$```````````````````R%&X4'@`4%`,`````
+M``````0``````````````````#P4>!0>`!04`P``````````!```````````
+M````````C!3(%!X`%!0#```````````$``````````````````!Q%L$6'@`4
+M%`````````````0``````````````````'P51!8>`!04`P``````````!```
+M````````````````C!3(%!X`%!0````````````````````````````````\
+M%'@4'@`4%````````````````````````````````,$6P18>`!04````````
+M````!```````````````````"A1:%`4&*"@`````````````````````````
+M``````""%-(4!08H*`$``````````````````````````````/H4<A4%!B@H
+M````````````````````````````````FA42%@4&*"@!````````````````
+M```````````````>%$84!08H*````````````````````````````````&X4
+MOA0%!B@H`0``````````````````````````````YA1>%04&*"@`````````
+M``````````````````````"&%286!08H*`$`````````````````````````
+M`````%`4>!01!B@H````````````````````````````````4!1X%!<&*"@`
+M``````````````````````````````!:%%H4$08H*```````````````````
+M`````````````%H46A07`"@H````````````````````````````````H!2@
+M%!<&*"@!``````````(```````````````````"@%*`4%`8H*`$`````````
+M`@```````````````````((4@A01`"@H`0`````````"````````````````
+M````JA2J%!0`*"@!``````````(```````````````````""%*H4%``H*`$`
+M`````````@```````````````````((4JA07!B@H`0`````````"````````
+M````````````I!4<%A0&*"@!``````````(```````````````````"`%J@6
+M%``H*````````````````````````````````(`6J!8>!B@H````````````
+M````````````````````A1:M%AX&*"@`````````````````````````````
+M``!:%((4#P`H*`,```````````0``````````````````*H4JA02`"@H`P``
+M````````!```````````````````I!4<%A0`*"@#```````````$````````
+M``````````"`%J@6%``H*`````````````0```````````````````@)1`D%
+M!A0%````````````````````````````````"`E$"10`%`4`````````````
+M``````````````````!L":@)!084!0``````````````````````````````
+M`&P)J`D4`!0%```````````@````````````````````;`FH"1X`%`4`````
+M``````````````````````````!L"9X)&P84!0``````````````````````
+M`````````&P)G@D4`!0%```````````@````````````````````@`F*"10`
+M%`4```````````````````````````````"9":@)%``4!0``````````````
+M`````````````````*,)J`D4`!0%```````````@(```````````````````
+MM`FT"04&%`4```````````````````````````````"T";0)%``4!0``````
+M````("@``````````````````-`)K`H%!A0%````````````````````````
+M````````"`E$"10`%`4```````````````````````````````!L"6P)%``4
+M!0```````````````````````````````'$)@`D4`!0%````````````````
+M````````````````A0F*"10`%`4```````````````````````````````"/
+M"9D)%``4!0```````````````````````````````)X)G@D4`!0%````````
+M````````````````````````HPFC"10`%`4````````````$``````"`````
+M``````"C":,)%``4!0```````````````````(```````````*@)J`D4`!0%
+M````````````!```````@```````````J`FH"10`%`4`````````````````
+M``"```````````"T";0)%``4!0````````````0``````(```````````+0)
+MM`D4`!0%````````````````````@```````````"`E$"04&%`4`````````
+M```````````````````````("40)%``4!0``````````````````````````
+M`````&P)J`D%!A0%````````````````````````````````;`FH"10`%`4`
+M`````````$````````````````````!L":@)'@`4!0``````````````````
+M`````````````&P)G@D;!A0%````````````````````````````````;`F>
+M"10`%`4``````````$````````````````````"`"8H)%``4!0``````````
+M`````````````````````)D)J`D4`!0%````````````````````````````
+M````T`FL"@4&%`4```````````````````````````````"C":@)%``4!0``
+M````````("````````````````````@)1`D4`!0%````````````````````
+M````````````;`EL"10`%`4```````````````````````````````!Q"8`)
+M%``4!0```````````````````````````````(4)B@D4`!0%````````````
+M````````````````````CPF9"10`%`4`````````````````````````````
+M``">"9X)%``4!0```````````````````````````````*,)HPD4`!0%````
+M````````!```````@```````````HPFC"10`%`4```````````````````"`
+M``````````"H":@)%``4!0````````````0``````(```````````*@)J`D4
+M`!0%````````````````````@```````````"`E$"04&*"@`````````````
+M``````````````````"%"84)!08H*```````````````````````````````
+M`(4)A0D4!B@H````````````````````````````````A0F%"1(&*"@`````
+M```````$``````````````````#0":P*!08H*```````````````````````
+M`````````/\!$````````0````````````````````````````````(`""``
+M`````````````/\`````````````````````$20`````````````````!10`
+M``````````````````4"```````````````````3````````````````````
+M4`$0``````````````````````````````````````````````$`````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````!0`A``````
+M```````````````````````````````````````$````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````%`#$```````````````
+M````````````````````````````$`@`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````4`00````````````````````````
+M````````````````@```@```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````!0!1``````````````````````````````````
+M``````````!`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````%`&,````````@`````````#`````````````````````(!`
+M`(`````````````````("0``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````4`@P`````````````````````````````P`````````````$``$`````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````!0"3``
+M``````(`````````!``````````#````````````!"`0````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````#`!,````````@``
+M```````$``````````,```````````!`@```"```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````,`(P```````"``````````0`
+M`````````P``````````0```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````P`S````````(`````````!``````````#
+M````````````0`````@`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````#`$,````````@`````````$``````````,`````````
+M`$`@````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````,`4P```````"``````````0``````````P``````````$```````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````````P
+M!C````````(`````````!``````````#````````````$0`!````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````!`!$```````
+M`````````````````````````````````"```0`"```````````````$$@``
+M````````````````$2``````````````````````````````````````````
+M````````````````````````````````````````(`$0````````````````
+M``````````````````````````("``0`````````````````````````````
+M```````2(```````````````````````````````````````````````````
+M``````````````````````````````!@`1````````$``````````P``````
+M```````````````@@$```@``````````````Q!```````````````````"$$
+M````````````````````````````````````````````````````````````
+M`````````````````````&4!$````````0`````````#````````````````
+M````.```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````0`%```````````````````@``````````@``````````!```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``!``D``````````````````$``````````"`````````,<%````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````$`#0```
+M````````````````@`````````(``````````(``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````0`1````````$````
+M``````"``````````@``````````@$``````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````!`!4````````0``````````(``
+M```````"``````````"`0``"````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````$`&0``````````````````(``````````(`
+M`````````(@`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````0`=````````$``````````B``````````@``````````
+MA$``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````!`"$````````0`````````"(`````````"``````````"$0``"````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````$`)
+M0```````````````````@`````````(`````````QX$`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`M````````$
+M``````````"``````````@````````#'@4``````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````!0#?\`````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````H````````````````````*````````````
+M`````````````````````````````#`*_P````````````````"`````````
+M``,`````````````````````````````````````````````````````````
+M``````````````````$````````````````````!```````````````````$
+M````````````````````,`LP```````````````````!`````````P``````
+M````````````````````````````````````````````````````````````
+M``````"`````````````````````@`````````````````````0`````````
+M```````````P##````````````````````(````````#````````````````
+M`````````````````````````````````````````````````````````!``
+M```````````````````0````````````````````!```````````````````
+M`!`*$```````````````````````````````````````````````````````
+M````````````````````````````````````````````````(```````````
+M`````````"`````````````````````$````````````````````0`I`````
+M`````````````&!X`````````@``````````````````````````````````
+M``````````````````````````````````````!`"@``````````````````
+M0`0```````````````````0```````````````````!0"D``````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````@````````````````````(````````
+M````````````!````````````````````)D!,```````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````"`````````````````````@`````````````````
+M```$````````````````````8`#_```````#```````````$````````"```
+M`````````````.`#``````````````#``@``````````````````````````
+M````````````P*\``````````````````/`+``````````````````@`````
+M``````````````!F`/\```````,```````````0````````(````````````
+M````X`,``````````````,`"````````````````````````````````````
+M``#`!P``````````````````\`$`````````````````"```````````````
+M`````&<`_P```````P``````````!`````````@```````````````#@`P``
+M````````````P`(``````````````````````````````````````,`O````
+M``````````````#P"P`````````````````(````````````````````:`#_
+M```````#```````````$````````"````````````````.`#````````````
+M``#``@``````````````````````````````````````P%<`````````````
+M`````/`5``````````````````@```````````````````!A`/\```````,`
+M``````````0````````0````````````````X`,`````````````````````
+M``````````````````````````````````#`KP``````````````````\`L`
+M````````````````"````````````````````&(`_P```````P``````````
+M!````````!````````````````#@`P``````````````P`(`````````````
+M`````````````````````````,"O``````````````````#P"P``````````
+M```````(````````````````````8P#_```````#```````````$````````
+M"````````````````.`!``````````````#``@``````````````````````
+M````````````````P"\``````````````````/`+``````````````````@`
+M``````````````````!D`/\```````,```````````0````````0````````
+M```````(`!P``````````````,`"````````````````````````````````
+M``````#`!P``````````````````\`$`````````````````"```````````
+M`````````&4`_P```````P``````````!````````!````````````````"$
+M"````````````````````````````````````````````````````````,!7
+M``````````````````#P%0`````````````````(````````````````````
+M:0#_```````#```````````$````````$````````````````,`#````````
+M``````#``@``````````````````````````````````````P`<`````````
+M`````````/`!``````````````````@```````````````````!J`/\`````
+M``,```````````0````````0````````````````P`,`````````````````
+M``````````````````````````````````````#`+P``````````````````
+M\`L`````````````````"````````````````````)@!_P``````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````0`#P`/,`B('P`/,`00"``(,`B8&`
+M`(,`2`#R`/4`BH'R`/4`0P#V`/<`BX'V`/<`2@#Q`/0`C('Q`/0`2P"!`(0`
+MC8&!`(0`3`""`(4`CX&"`(4`````````````````B`'P`/,`B0&``(,`B@'R
+M`/4`BP'V`/<`C`'Q`/0`C0&!`(0`CP&"`(4`````````````````````````
+M``````@```````````````````````````````````````````````$"<!<+
+M`(P```````$"*",/`!(```````$"X"X*`)@"``````$"4$8.`"0"``````$"
+MP%T)`+`$``````$"H(P-`$@$``````$"@+L(`&`$``````$"\-(,`&P$````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```(```````````````````````````````````````````````!`W`7"P",
+M```````!`R@C#P`2```````!`^`N"@"8`@`````!`U!&#@`D`@`````!`\!=
+M"0"P!``````!`Z",#0!(!``````!`X"["`!@!``````!`_#2#`!L!```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M"````````````````````````````````````````````````0)P%PL`C```
+M`````0(H(P\`$@```````0+@+@H`F`(``````0)01@X`)`(``````0+`70D`
+ML`0``````0*@C`T`2`0``````0*`NP@`8`0``````0+PT@P`;`0`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````@`
+M``````````````````````````````````````````````$#<!<+`(P`````
+M``$#*",/`!(```````$#X"X*`)@"``````$#4$8.`"0"``````$#P%T)`+`$
+M``````$#H(P-`$@$``````$#@+L(`&`$``````$#\-(,`&P$````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````$````
+M```````````````````````````````````````````!`.@#"P""```````!
+M`-`'"@2$`0`````!`'P5"02+`0`````!`/@J"`26`0``````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````!*(`````
+M````````"*(``$9&/E!&1CY0#*(``&Q!@&1L08!D$*(```.@F0$#H)D!%*(`
+M`!#63`00UDP$&*(``$``@!-``(`3'*(``&``X!M@`.`;(*(```J`4PP*@%,,
+M)*(``#O?%``[WQ0`**(``+4!``"U`0``+*(``"`````@````G)@`````````
+M````G)@`````````````G)@`````````````G)@`````````````G)@`````
+M````````G)@`````````````G)@`````````````G)@`````````````G)@`
+M````````````G)@`````````````G)@`````````````G)@`````.````#@`
+MG)@`````````````G)@`````````````G)@`````````````G)@``/D`!`#Y
+M``0`U)@````````$`````````````````````````)R8`````````````)R8
+M`````````````)R8`````````````)R8`````````````)R8````````````
+M`)R8```````0````$)R8```````$````!)R8`````````````)R8````````
+M`````)R8`````````````)R8````````````"IR8``"``#@`@``X`IR8```&
+M``(`!@```)R8``"2````D@```)R8``"@````H````)R8```'``0`!P`$`-28
+M```:````&@```)R8``!(````2````)R8```0````$````)R8```(````"```
+M`)R8```/````#P```)R8``#R````8@```)R8``!/D```3)```)R8``!:$@``
+MFA(``,R8```.````#P``````````````````````````````"```````````
+M`````````````````````````````````````0)P%PL`C````````0(H(P\`
+M$@```````0+@+@H`F`(``````0)01@X`)`(``````0+`70D`L`0``````0*@
+MC`T`2`0``````0*`NP@`8`0``````0+PT@P`;`0`````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````@`````````````
+M``````````````````````````````````$"N`L+`(8```````$"E!$/``D`
+M``````$"<!<*`(P"``````$"*",.`!("``````$"X"X)`)@$``````$"4$8-
+M`"0$``````$"P%T(`#`$``````$">&D,`#8$````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````(````````````````
+M```````````````````````````````!`MP%"P"#```````!`LH(#P`$````
+M```!`K@+"@"&`@`````!`I01#@`)`@`````!`G`7"0",!``````!`B@C#0`2
+M!``````!`N`N"``8!``````!`KPT#``;!```````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````!P``````````````````
+M`````````````````````````````0-P%PL`C````````0/@+@H`F`(`````
+M`0-01@X`)`(``````0/`70D`L`,``````0.@C`T`2`,``````0.`NP@`8`,`
+M`````0/PT@P`;`,`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````@`````````````````````
+M``````````````````````````$#<!<+`(P```````$#*",/`!(```````$#
+MX"X*`)@"``````$#4$8.`"0"``````$#P%T)`+`$``````$#H(P-`$@$````
+M``$#@+L(`&`$``````$#\-(,`&P$````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````$````````````````````````
+M```````````````````````!`.@#&P""```````!`-`'&@2$`0`````!`'P5
+M&02+`0`````!`/@J&`26`0``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````#```````````````````````````
+M`````````````````````0#H`QL`@@```````0#0!QH$A`$``````0!\%1D$
+MBP(``````0#X*A@$E@,```````)P%PL`#`0```````(H(P\`$@0``````0+@
+M+@H`&`8``````0)01@X`)`8``````0+`70D`,`@``````0*@C`T`2`@`````
+M`0*`NP@`8`@``````0+PT@P`;`@`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````T`````````````````````````````
+M``````````````````$$^@`#`($`9`)D`@$$]`$'`($`R0')`0$$Z`,"`((!
+MY`#D``$$T`<&`(0"H`"@``$$N`L!`(8#C`",``$"<!<+`(P$/``\``$"*",/
+M`!($/``\``$"X"X*`)@&,``P``$"4$8.`"0&,``P``$"P%T)`#`(+``L``$"
+MH(P-`$@(+``L``$"@+L(`&`(+``L``$"\-(,`&P(+``L````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````4````
+M``````$``7@0#`<(D`$````````4````'```````````````%@$````````<
+M````-```````````````+0````````!$#A```````!P```!4````````````
+M```-`0```````$0.$```````%````'0```````````````P`````````-```
+M`(P``````````````%$`````````0@X00@X80@X@00XH00XP@P:&!8P$C0..
+M`@`````````4````Q```````````````(0`````````4````W```````````
+M````U0$````````4````]```````````````5``````````<````#`$`````
+M````````1`$```````!$#B!*A@*#`QP````L`0`````````````G````````
+M`$$.$(,"````'````$P!`````````````$0`````````00X0@P(````T````
+M;`$`````````````L@````````!"#A!"#AA"#B!!#BA!#C"#!H8%C`2-`XX"
+M`````````!0```"D`0````````````!%`0```````!0```"\`0``````````
+M``!O`````````!P```#4`0````````````!D`````````$$.$(,"````'```
+M`/0!`````````````)0`````````00X0@P(````4````%`(`````````````
+M-`$````````4````+`(`````````````:``````````D````1`(`````````
+M````<@````````!$#B!.C`*&`X,$````````/````&P"`````````````%0!
+M````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"````````
+M`!0``````````0`!>!`,!PB0`0```````!P````<``````````````!L````
+M`````$$.$(,"````%````#P``````````````$0`````````%````%0`````
+M`````````"4`````````+````&P``````````````)X"````````0@X00@X8
+M00X@00XH1`XP@P6&!(P#C0(`)````)P``````````````.0`````````0@X0
+M00X800X@@P2&`XP"`!P```#$``````````````!C`@```````$0.$```````
+M/````.0``````````````(@$````````0@X00@X80@X@0@XH00XP00XX1PZ0
+M`X,'A@:,!8T$C@./`@```````"0````D`0````````````!$`````````$$.
+M$$$.&$0.((,#A@(````4````3`$`````````````:0`````````\````9`$`
+M````````````(`8```````!"#A!"#AA"#B!"#BA!#C!!#CA$#H`!@P>&!HP%
+MC02.`X\"````````'````*0!`````````````-P`````````00X0@P(````\
+M````Q`$`````````````:@$```````!"#A!"#AA"#B!"#BA!#C!!#CA$#DB#
+M!X8&C`6-!(X#CP(`````````/`````0"`````````````/$!````````0@X0
+M0@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````#P```!$`@``
+M```````````G`P```````$(.$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$
+MC@./`@`````````\````A`(`````````````50(```````!"#A!"#AA"#B!"
+M#BA!#C!!#CA$#E"#!X8&C`6-!(X#CP(`````````/````,0"````````````
+M``\$````````0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"````
+M`````#0````$`P`````````````O#@```````$(.$$(.&$(.($$.*$$.,$0.
+M0(,&A@6,!(T#C@(`````'````#P#`````````````'P`````````1`X@2H8"
+M@P,<````7`,`````````````'`````````!$#A```````!0``````````0`!
+M>!`,!PB0`0```````!0````<```````````````H`````````!0````T````
+M```````````-`````````!0```!,```````````````B`````````!P```!D
+M``````````````!K`````````$0.$```````'````(0``````````````'4`
+M````````00X0@P(````D````I```````````````=P````````!$#B!.C`*&
+M`X,$````````)````,P``````````````),`````````1PZP`6"-`HP#A@2#
+M!0```!P```#T``````````````!#`````````$$.$(,"````%````!0!````
+M`````````#8`````````)````"P!`````````````',`````````00X000X8
+M1`X@@P.&`@```!P```!4`0````````````!2`````````$0.$```````%```
+M`'0!`````````````#@`````````/````(P!`````````````+L!````````
+M0@X00@X80@X@0@XH00XP00XX1`Y0@P>&!HP%C02.`X\"`````````!0```#,
+M`0`````````````M`````````!0```#D`0`````````````P`````````"P`
+M``#\`0`````````````I!P```````$<.\`-PCP*.`XT$C`6&!H,'````````
+M`!P````L`@````````````"Y`````````$$.$(,"````'````$P"````````
+M`````"L`````````00X0@P(````D````;`(`````````````]`````````!$
+M#B!.C`*&`X,$````````'````)0"`````````````"4`````````1`X0````
+M```\````M`(`````````````AP````````!"#A!"#AA"#B!"#BA!#C!!#CA$
+M#E"#!X8&C`6-!(X#CP(`````````'````/0"`````````````)0`````````
+M1`X@2H8"@P,<````%`,`````````````=P````````!!#A"#`@```"P````T
+M`P````````````"$`````````$(.$$$.&$$.($0.,(,$A@.,`@```````"P`
+M``!D`P````````````"$`````````$(.$$$.&$$.($0.,(,$A@.,`@``````
+M`!P```"4`P````````````!<`````````$0.($J&`H,#%``````````!``%X
+M$`P'")`!````````/````!P``````````````"\&````````0@X00@X80@X@
+M0@XH00XP00XX1P[@`8,'A@:,!8T$C@./`@```````!P```!<````````````
+M```.`````````$0.$```````%````'P``````````````!T`````````%```
+M`)0```````````````8`````````%````*P``````````````&L`````````
+M%``````````!``%X$`P'")`!````````%````!P``````````````$$`````
+M````'````#0``````````````&0`````````1`XP```````4````5```````
+M````````-P`````````4````;```````````````ZP`````````4````````
+M``$``7@0#`<(D`$````````4````'```````````````$P`````````4````
+M-```````````````6P`````````4````3```````````````!P`````````4
+M````9```````````````A``````````4``````````$``7@0#`<(D`$`````
+M```4````'```````````````!@`````````4````-```````````````+@``
+M```````4````3```````````````F0`````````4````9```````````````
+MAP`````````D````?```````````````J@$```````!$#C!4C0*,`X8$@P4`
+M````%``````````!``%X$`P'")`!````````'````!P``````````````"``
+M````````1`X0```````<````/```````````````'P````````!$#A``````
+M`!P```!<```````````````=`````````$0.$```````%````'P`````````
+M``````8`````````'````)0``````````````&,`````````1`X@2H8"@P,4
+M````M```````````````,0`````````4````S```````````````!@``````
+M```D````Y```````````````6@````````!$#B!.C0*,`X,$````````%```
+M``P!`````````````"T`````````%````"0!`````````````"0`````````
+M%````#P!`````````````"P`````````%````%0!`````````````!\`````
+M````'````&P!`````````````&<`````````1`X0```````4````C`$`````
+M````````,P`````````4````I`$`````````````&``````````4````O`$`
+M````````````+@`````````4````U`$`````````````!@`````````4````
+M[`$`````````````"0`````````D````!`(`````````````K`````````!!
+M#A!!#AA$#B"#`X8"````%````"P"`````````````"@`````````%````$0"
+M``````````````L`````````%````%P"`````````````!8`````````%```
+M`'0"`````````````#4`````````%````(P"`````````````"$`````````
+M%````*0"`````````````$$`````````)````+P"`````````````'(`````
+M````1`X@3HP"A@.#!````````!P```#D`@`````````````>`````````$0.
+M$```````)`````0#`````````````)<`````````1`XP6(X"C0.,!(8%@P8`
+M`!P````L`P`````````````>`````````$0.$```````%````$P#````````
+M``````X`````````%````&0#`````````````$H`````````)````'P#````
+M`````````)H`````````1`XP6(X"C0.,!(8%@P8``!P```"D`P``````````
+M```A`````````$0.$```````%````,0#``````````````8`````````%```
+M`-P#``````````````$`````````%````/0#``````````````8`````````
+M%`````P$``````````````$`````````%````"0$``````````````$`````
+M````'````#P$`````````````"0`````````1`X0```````<````7`0`````
+M````````.P````````!$#A```````!P```!\!``````````````.````````
+M`$0.$```````%``````````!``%X$`P'")`!````````%````!P`````````
+M`````"\`````````)````#0``````````````),`````````00X000X81`X@
+M@P.&`@```!0```!<```````````````O`````````"0```!T````````````
+M``!O`````````$0.($Z,`H8#@P0````````4````G```````````````$P``
+M```````4``````````$``7@0#`<(D`$````````<````'```````````````
+M,0````````!!#A"#`@```!0``````````0`!>!`,!PB0`0```````!0````<
+M```````````````(`````````!0````T```````````````(`````````!0`
+M``!,```````````````,`````````"0```!D``````````````!+````````
+M`$$.$$$.&$0.((,#A@(````4````C```````````````%``````````4````
+MI```````````````%``````````4````O```````````````%0`````````4
+M````U```````````````4@`````````4````[```````````````4@``````
+M```4````!`$`````````````"P`````````4````'`$`````````````'```
+M```````4````-`$`````````````.P`````````4````3`$`````````````
+M'@$````````4``````````$``7@0#`<(D`$````````\````'```````````
+M````]@4```````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#CP(`
+M````````%````%P``````````````'0`````````'````'0`````````````
+M`!0`````````1`X0```````<````E```````````````&`````````!$#A``
+M`````!P```"T``````````````!F`````````$$.$(,"````'````-0`````
+M`````````-H`````````1`X@2H8"@P,\````]```````````````(P(`````
+M``!"#A!"#AA"#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#CP(`````````)```
+M`#0!`````````````'0`````````1`X@3HP"A@.#!````````!0```!<`0``
+M``````````"M`````````!P```!T`0````````````#E`````````$$.$(,"
+M````%````)0!`````````````!@`````````/````*P!`````````````.@"
+M````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"````````
+M`"P```#L`0````````````#*`@```````$(.$$$.&$$.($0.D`&#!(8#C`(`
+M`````!P````<`@````````````!T`````````$0.($J,`H,#%````#P"````
+M`````````!P`````````)````%0"`````````````(8`````````0@X000X8
+M00X@@P2&`XP"`!0```!\`@`````````````&`````````!0```"4`@``````
+M```````&`````````!0``````````0`!>!`,!PB0`0```````!P````<````
+M```````````M`````````$0.$```````'````#P``````````````#,`````
+M````1`X0```````D````7```````````````W0````````!$#C!8C@*-`XP$
+MA@6#!@``%````(0``````````````%X`````````%````)P`````````````
+M`&`"````````%````+0``````````````"D`````````%````,P`````````
+M`````$$`````````)````.0``````````````)(`````````1`X@3HP"A@.#
+M!````````!0````,`0````````````!G`````````!0````D`0``````````
+M```R`````````"0````\`0````````````"8`````````$$.$$$.&$0.((,#
+MA@(````4````9`$`````````````KP`````````4````?`$`````````````
+M!@`````````4````E`$`````````````"``````````4````K`$`````````
+M````2@`````````4````Q`$`````````````CP`````````4````W`$`````
+M`````````0`````````4``````````$``7@0#`<(D`$````````4````'```
+M````````````"@`````````4``````````$``7@0#`<(D`$````````<````
+M'```````````````6P````````!$#A```````#P````\``````````````"C
+M!````````$(.$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./`@``````
+M```<````?```````````````&@````````!!#A"#`@```!P```"<````````
+M``````#W`````````$$.$$0.,(,"%````+P``````````````#@`````````
+M%````-0```````````````8`````````+````.P``````````````/0`````
+M````0@X00@X800X@00XH1`XP@P6&!(P#C0(`%``````````!``%X$`P'")`!
+M````````%````!P``````````````$$`````````'````#0`````````````
+M`'``````````1`XP```````4````5```````````````-P`````````4````
+M;```````````````[@`````````4``````````$``7@0#`<(D`$````````4
+M````'```````````````$P`````````4````-```````````````K```````
+M```4````3```````````````!P`````````4````9```````````````G@``
+M```````4``````````$``7@0#`<(D`$````````4````'```````````````
+M!@`````````4````-```````````````+@`````````4````3```````````
+M````F0`````````4````9```````````````AP`````````L````?```````
+M````````MP$```````!"#A!"#AA!#B!!#BA$#C"#!88$C`.-`@`4````````
+M``$``7@0#`<(D`$````````<````'```````````````(`````````!$#A``
+M`````!P````\```````````````?`````````$0.$```````'````%P`````
+M`````````!T`````````1`X0```````4````?```````````````!@``````
+M```<````E```````````````;0````````!$#B!*A@*#`Q0```"T````````
+M```````Q`````````!0```#,```````````````Q`````````"0```#D````
+M``````````!X`````````$0.($Z-`HP#@P0````````4````#`$`````````
+M````(@`````````4````)`$`````````````)``````````4````/`$`````
+M````````+``````````4````5`$`````````````'P`````````<````;`$`
+M````````````0P````````!$#A```````!0```",`0`````````````@````
+M`````!P```"D`0````````````"1`````````$0.($J&`H,#%````,0!````
+M`````````"@`````````%````-P!``````````````L`````````%````/0!
+M`````````````!8`````````%`````P"`````````````#4`````````%```
+M`"0"`````````````#4`````````%````#P"`````````````$$`````````
+M)````%0"`````````````&X`````````1`X@3HP"A@.#!````````!P```!\
+M`@`````````````>`````````$0.$```````)````)P"`````````````)<`
+M````````1`XP6(X"C0.,!(8%@P8``!P```#$`@`````````````>````````
+M`$0.$```````%````.0"``````````````X`````````%````/P"````````
+M`````$H`````````)````!0#`````````````)H`````````1`XP6(X"C0.,
+M!(8%@P8``!P````\`P`````````````A`````````$0.$```````%````%P#
+M``````````````8`````````%````'0#``````````````$`````````%```
+M`(P#``````````````8`````````%````*0#``````````````$`````````
+M%````+P#``````````````$`````````%````-0#`````````````!``````
+M````%````.P#``````````````X`````````%`````0$``````````````X`
+M````````%````!P$``````````````<`````````'````#0$````````````
+M`"<`````````1`X0```````<````5`0`````````````*0````````!$#A``
+M`````!P```!T!``````````````O`````````$0.$```````'````)0$````
+M`````````!8`````````1`X0```````4``````````$``7@0#`<(D`$`````
+M```D````'```````````````DP````````!!#A!!#AA$#B"#`X8"````%```
+M`$0``````````````"\`````````%````%P``````````````"\`````````
+M)````'0``````````````&\`````````1`X@3HP"A@.#!````````!0```"<
+M```````````````3`````````!0``````````0`!>!`,!PB0`0```````!P`
+M```<``````````````!(`````````$$.$(,"````%``````````!``%X$`P'
+M")`!````````%````!P```````````````@`````````%````#0`````````
+M``````@`````````%````$P```````````````P`````````'````&0`````
+M`````````#``````````1`X0```````4````A```````````````%```````
+M```4````G```````````````%``````````4````M```````````````%0``
+M```````4````S```````````````4@`````````4````Y```````````````
+M4@`````````4````_```````````````"P`````````4````%`$`````````
+M````"P`````````4````+`$`````````````.P`````````4````1`$`````
+M````````VP`````````4``````````$``7@0#`<(D`$````````\````'```
+M````````````H`@```````!"#A!"#AA"#B!"#BA!#C!!#CA$#K`!@P>&!HP%
+MC02.`X\"````````'````%P``````````````!,`````````1`X0```````<
+M````?```````````````10````````!!#A"#`@```!P```"<````````````
+M``"I`0```````$0.($J&`H,#)````+P``````````````&,!````````1`XP
+M6(X"C0.,!(8%@P8``"0```#D``````````````!Y`````````$0.($Z,`H8#
+M@P0````````L````#`$``````````````0$```````!"#A!"#AA!#B!!#BA$
+M#C"#!88$C`.-`@`4````/`$`````````````'``````````D````5`$`````
+M````````I0````````!"#A!!#AA!#B"#!(8#C`(`%````'P!````````````
+M`$\`````````'````)0!`````````````&4`````````1`X@2H8"@P,D````
+MM`$`````````````MP````````!$#C!/C`*&`X,$````````%````-P!````
+M`````````$4`````````/````/0!`````````````$8#````````0@X00@X8
+M0@X@0@XH00XP00XX1`Z``8,'A@:,!8T$C@./`@```````!0````T`@``````
+M```````/`0```````#0```!,`@````````````!L`@```````$(.$$(.&$(.
+M($$.*$$.,(,&A@6,!(T#C@(`````````%````(0"`````````````"(`````
+M````/````)P"`````````````(`!````````0@X00@X80@X@0@XH00XP00XX
+M1`Y@@P>&!HP%C02.`X\"`````````#P```#<`@````````````!2`P``````
+M`$(.$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````\````
+M'`,`````````````6P0```````!"#A!"#AA"#B!"#BA!#C!!#CA$#J`!@P>&
+M!HP%C02.`X\"````````)````%P#`````````````'(!````````1`Y`5(T"
+MC`.&!(,%`````!0```"$`P````````````!@`````````!P```"<`P``````
+M``````"E`````````$$.$(,"````%````+P#`````````````)T`````````
+M'````-0#`````````````$,`````````1`X0```````4````]`,`````````
+M````0@`````````4````#`0`````````````=P`````````4````)`0`````
+M````````)@`````````D````/`0`````````````J0````````!$#B!.C`*&
+M`X,$````````%````&0$`````````````!@`````````%````'P$````````
+M`````!8!````````%````)0$`````````````$(`````````%````*P$````
+M`````````&8`````````'````,0$`````````````!0`````````1`X0````
+M```4``````````$``7@0#`<(D`$````````D````'```````````````J0``
+M``````!$#B!.C`*&`X,$````````'````$0``````````````"T`````````
+M1`X0```````<````9```````````````,P````````!$#A```````"0```"$
+M``````````````#T`````````$0.,%B.`HT#C`2&!8,&```4````K```````
+M````````<``````````<````Q```````````````<0````````!$#A``````
+M`!P```#D``````````````#%`P```````$0.$```````%`````0!````````
+M``````\`````````%````!P!`````````````!0`````````%````#0!````
+M`````````!D`````````%````$P!`````````````#$`````````)````&0!
+M`````````````&0`````````0@X000X800X@@P2&`XP"`!0```",`0``````
+M``````"0`````````!0```"D`0`````````````&`````````!0```"\`0``
+M```````````(`````````!0```#4`0````````````!*`````````!0```#L
+M`0````````````"V`````````!0````$`@`````````````!`````````!0`
+M`````````0`!>!`,!PB0`0```````!0````<```````````````O````````
+M`!0``````````0`!>!`,!PB0`0```````!0````<``````````````"-````
+M`````!P````T``````````````!;`````````$0.$```````'````%0`````
+M`````````/4`````````1PZ0`0`````4````=```````````````$@``````
+M```T````C```````````````\`````````!"#A!"#AA"#B!"#BA!#C"#!HP%
+MC02.`X\"`````````!0```#$``````````````!%`````````#P```#<````
+M``````````"9!@```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$
+MC@./`@`````````<````'`$`````````````3P````````!!#A"#`@```!P`
+M```\`0````````````#W`````````$$.$$0.,(,"%````%P!````````````
+M`$$`````````+````'0!```````````````$````````0@X00@X800X@00XH
+M1`XP@P6&!(P#C0(`'````*0!`````````````!8`````````1`X0```````4
+M````Q`$`````````````'0`````````4``````````$``7@0#`<(D`$`````
+M```<````'```````````````CP````````!$#B!*A@*#`QP````\````````
+M``````!P`````````$0.,```````%````%P``````````````#<`````````
+M%````'0``````````````$(!````````%``````````!``%X$`P'")`!````
+M````'````!P``````````````&T`````````1`X@2H8"@P,4``````````$`
+M`7@0#`<(D`$````````4````'```````````````(@`````````4````-```
+M````````````)``````````4````3```````````````+``````````4````
+M9```````````````'P`````````<````?```````````````8P````````!$
+M#A```````!0``````````0`!>!`,!PB0`0```````!0````<````````````
+M```4`````````!0````T``````````````!S`0```````!0```!,````````
+M```````'`````````!0```!D```````````````-`0```````!0`````````
+M`0`!>!`,!PB0`0```````!0````<```````````````(`````````!0````T
+M```````````````Q`````````!0```!,``````````````#V`````````!0`
+M``!D``````````````"+`````````#P```!\``````````````"P`P``````
+M`$(.$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````4````
+M``````$``7@0#`<(D`$````````<````'```````````````(`````````!$
+M#A```````!P````\```````````````?`````````$0.$```````'````%P`
+M`````````````"``````````1`X0```````<````?```````````````;@``
+M``````!!#A"#`@```!0```"<```````````````Q`````````!0```"T````
+M``````````!9`````````"0```#,``````````````"#`````````$0.($Z,
+M`H8#@P0````````4````]```````````````(``````````<````#`$`````
+M````````D0````````!$#B!*A@*#`Q0````L`0`````````````H````````
+M`!0```!$`0`````````````+`````````!0```!<`0`````````````@````
+M`````!0```!T`0````````````!W`````````!0```",`0`````````````U
+M`````````!0```"D`0`````````````U`````````!0```"\`0``````````
+M``!!`````````!0```#4`0`````````````&`````````!0```#L`0``````
+M```````0`````````!0````$`@`````````````.`````````!0````<`@``
+M```````````.`````````!0````T`@`````````````'`````````!P```!,
+M`@`````````````G`````````$0.$```````%````&P"``````````````8`
+M````````)````(0"`````````````'(`````````1`X@3HP"A@.#!```````
+M`!P```"L`@`````````````>`````````$0.$```````)````,P"````````
+M`````)<`````````1`XP6(X"C0.,!(8%@P8``!P```#T`@`````````````>
+M`````````$0.$```````%````!0#``````````````X`````````%````"P#
+M`````````````$H`````````)````$0#`````````````)H`````````1`XP
+M6(X"C0.,!(8%@P8``!P```!L`P`````````````A`````````$0.$```````
+M%````(P#`````````````$$`````````'````*0#`````````````"<!````
+M````1`X@2H8"@P,<````Q`,`````````````%`````````!$#A```````!0`
+M``#D`P`````````````B`````````!P```#\`P`````````````>`@``````
+M`$$.$(,"````'````!P$`````````````.L`````````00X0@P(````4````
+M/`0`````````````,0`````````<````5`0`````````````80(```````!$
+M#B!*A@*#`QP```!T!`````````````"1`0```````$0.$```````'````)0$
+M`````````````!8`````````1`X0```````4``````````$``7@0#`<(D`$`
+M```````D````'```````````````DP````````!!#A!!#AA$#B"#`X8"````
+M%````$0``````````````#0`````````%````%P``````````````#0`````
+M````)````'0``````````````&\`````````1`X@3HP"A@.#!````````!0`
+M``"<```````````````3`````````!0``````````0`!>!`,!PB0`0``````
+M`!P````<``````````````#;`````````$$.$(,"````%``````````!``%X
+M$`P'")`!````````%````!P```````````````@`````````%````#0`````
+M``````````@`````````%````$P```````````````P`````````'````&0`
+M`````````````#``````````1`X0```````<````A```````````````*P``
+M``````!!#A"#`@```!P```"D```````````````A`````````$0.$```````
+M%````,0``````````````!4`````````%````-P``````````````%(`````
+M````%````/0``````````````%(`````````%`````P!`````````````"H`
+M````````%````"0!`````````````%H`````````%````#P!````````````
+M`#``````````'````%0!`````````````!$!````````1`X0```````4````
+M``````$``7@0#`<(D`$````````\````'```````````````30T```````!"
+M#A!"#AA"#B!"#BA!#C!!#CA$#H`!@P>&!HP%C02.`X\"````````%````%P`
+M`````````````&``````````'````'0``````````````!<`````````1`X0
+M```````\````E```````````````*0(```````!"#A!"#AA"#B!"#BA!#C!!
+M#CA$#D"#!X8&C`6-!(X#CP(`````````%````-0``````````````',`````
+M````'````.P``````````````!,`````````1`X0```````<````#`$`````
+M````````+P````````!!#A"#`@```"0````L`0````````````!0`@``````
+M`$0.,%2-`HP#A@2#!0`````T````5`$`````````````F@(```````!"#A!"
+M#AA"#B!!#BA!#C"#!H8%C`2-`XX"`````````"0```",`0````````````"\
+M`````````$0.($Z,`H8#@P0````````4````M`$`````````````'```````
+M```4````S`$`````````````3P`````````D````Y`$`````````````>0``
+M``````!$#C!/C`*&`X,$````````%`````P"`````````````(0`````````
+M+````"0"`````````````*L`````````0@X00@X800X@00XH1`XP@P6&!(P#
+MC0(`%````%0"`````````````#8!````````'````&P"`````````````'T`
+M````````00X0@P(````\````C`(`````````````4`0```````!"#A!"#AA"
+M#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#CP(`````````/````,P"````````
+M`````,@%````````0@X00@X80@X@0@XH00XP00XX1`Z``8,'A@:,!8T$C@./
+M`@```````!0````,`P````````````#&`````````!P````D`P``````````
+M```L`````````$0.$```````+````$0#`````````````#4#````````0@X0
+M0@X800X@00XH1`Y`@P6&!(P#C0(`/````'0#`````````````'(%````````
+M0@X00@X80@X@0@XH00XP00XX1P[P`8,'A@:,!8T$C@./`@```````#P```"T
+M`P````````````#N`````````$(.$$(.&$(.($(.*$$.,$$..$0.4(,'A@:,
+M!8T$C@./`@`````````L````]`,`````````````)P$```````!"#A!!#AA!
+M#B!$#D"#!(8#C`(````````L````)`0`````````````I@````````!"#A!!
+M#AA!#B!$#D"#!(8#C`(````````<````5`0`````````````AP````````!!
+M#A"#`@```#P```!T!`````````````!8`0```````$(.$$(.&$(.($(.*$$.
+M,$$..$0.8(,'A@:,!8T$C@./`@`````````4````M`0`````````````>P``
+M```````4````S`0`````````````?P`````````<````Y`0`````````````
+M\@````````!!#A"#`@```!0````$!0`````````````M`````````"0````<
+M!0`````````````C`0```````$0.($Z,`H8#@P0````````4````1`4`````
+M````````&``````````4````7`4`````````````^P`````````D````=`4`
+M````````````N`````````!$#B!.C`*&`X,$````````+````)P%````````
+M`````+D`````````0@X00@X800X@00XH1`XP@P6&!(P#C0(`/````,P%````
+M`````````&P!````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.
+M`X\"`````````!0````,!@````````````"@`````````!0``````````0`!
+M>!`,!PB0`0```````"0````<``````````````"M`````````$0.,%2-`HP#
+MA@2#!0`````<````1```````````````-P````````!$#A```````!P```!D
+M```````````````]`````````$0.$```````/````(0``````````````%0!
+M````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"````````
+M`!0```#$``````````````!P`````````!P```#<``````````````!Y````
+M`````$0.$```````'````/P``````````````-<#````````00X0@P(````4
+M````'`$`````````````#P`````````4````-`$`````````````%```````
+M```4````3`$`````````````&0`````````4````9`$`````````````,0``
+M```````L````?`$`````````````;@$```````!"#A!"#AA!#B!!#BA$#C"#
+M!88$C`.-`@`4````K`$`````````````.0$````````4````Q`$`````````
+M````9P`````````4````W`$`````````````"``````````4````]`$`````
+M````````:0`````````4````#`(`````````````0@$````````4````)`(`
+M````````````$P`````````4``````````$``7@0#`<(D`$````````<````
+M'```````````````50````````!!#A"#`@```!P````\```````````````Y
+M`````````$$.$(,"````%````%P``````````````%4`````````%````'0`
+M``````````````@`````````'````(P``````````````!D`````````00X0
+M@P(````D````K```````````````-P$```````!"#A!!#AA!#B"#!(8#C`(`
+M'````-0``````````````#``````````00X0@P(````D````]```````````
+M````Q`0```````!'#I`!388"@P,`````````'````!P!`````````````*<`
+M````````00X0@P(````<````/`$`````````````&`$```````!$#B!*A@*#
+M`QP```!<`0````````````"H`````````$0.($J&`H,#+````'P!````````
+M`````!4"````````0@X00@X800X@00XH1`XP@P6&!(P#C0(`)````*P!````
+M`````````-$`````````0@X000X800X@@P2&`XP"`!P```#4`0``````````
+M``!/`````````$$.$(,"````'````/0!`````````````(8`````````1`X0
+M```````4````%`(`````````````>``````````D````+`(`````````````
+M"0(```````!$#C!4C0*,`X8$@P4`````%``````````!``%X$`P'")`!````
+M````%````!P``````````````$T`````````%``````````!``%X$`P'")`!
+M````````/````!P``````````````-\`````````0@X00@X80@X@0@XH00XP
+M00XX1`Y`@P>&!HP%C02.`X\"`````````"P```!<```````````````N`0``
+M`````$(.$$(.&$$.($$.*$0.,(,%A@2,`XT"`!0```",```````````````[
+M`````````#P```"D```````````````$!@```````$(.$$(.&$(.($(.*$$.
+M,$$..$0.L`&#!X8&C`6-!(X#CP(````````<````Y```````````````AP``
+M``````!!#A"#`@```#P````$`0````````````"R`P```````$(.$$(.&$(.
+M($(.*$$.,$$..$<.@`.#!X8&C`6-!(X#CP(````````D````1`$`````````
+M````8`$```````!$#D!4C0*,`X8$@P4`````%````&P!`````````````&@`
+M````````'````(0!`````````````$,`````````1`X0```````<````I`$`
+M````````````2`````````!!#A"#`@```!0```#$`0`````````````&````
+M`````!0```#<`0`````````````Q`````````!P```#T`0````````````#$
+M`````````$0.($J&`H,#%``````````!``%X$`P'")`!````````/````!P`
+M`````````````-\`````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%
+MC02.`X\"`````````#0```!<``````````````#@`@```````$(.$$(.&$(.
+M($$.*$$.,(,&A@6,!(T#C@(`````````%````)0``````````````#8`````
+M````/````*P``````````````'`'````````0@X00@X80@X@0@XH00XP00XX
+M1`Y@@P>&!HP%C02.`X\"`````````#P```#L``````````````#G!@``````
+M`$(.$$(.&$(.($(.*$$.,$$..$<.X`B#!X8&C`6-!(X#CP(````````4````
+M+`$`````````````/0`````````4````1`$`````````````<0`````````\
+M````7`$`````````````R`````````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#
+M!X8&C`6-!(X#CP(`````````%````)P!`````````````+8`````````)```
+M`+0!`````````````/L`````````0@X000X800X@@P2&`XP"`!P```#<`0``
+M``````````!(`````````$$.$(,"````%````/P!`````````````(4`````
+M````/````!0"`````````````/,!````````0@X00@X80@X@0@XH00XP00XX
+M1`Y`@P>&!HP%C02.`X\"`````````#P```!4`@````````````!X````````
+M`$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$C@./`@`````````<````
+ME`(`````````````S@````````!$#B!*A@*#`Q0``````````0`!>!`,!PB0
+M`0```````#P````<``````````````#B`````````$(.$$(.&$(.($(.*$$.
+M,$$..$0.0(,'A@:,!8T$C@./`@`````````T````7```````````````X`(`
+M``````!"#A!"#AA"#B!!#BA!#C"#!H8%C`2-`XX"`````````#P```"4````
+M``````````"B`@```````$(.$$(.&$(.($(.*$$.,$$..$0.0(,'A@:,!8T$
+MC@./`@`````````4````U```````````````,P`````````4````[```````
+M````````?0`````````\````!`$`````````````(P$```````!"#A!"#AA"
+M#B!"#BA!#C!!#CA$#E"#!X8&C`6-!(X#CP(`````````%````$0!````````
+M`````#T`````````/````%P!`````````````/$$````````0@X00@X80@X@
+M0@XH00XP00XX1`Z``8,'A@:,!8T$C@./`@```````#0```"<`0``````````
+M``"*`0```````$(.$$(.&$(.($$.*$$.,$0.4(,&A@6,!(T#C@(`````'```
+M`-0!`````````````&D`````````00X0@P(````4````]`$`````````````
+M+P`````````4````#`(`````````````+P`````````\````)`(`````````
+M````(`(```````!"#A!"#AA"#B!"#BA!#C!!#CA$#F"#!X8&C`6-!(X#CP(`
+M````````/````&0"`````````````'@`````````0@X00@X80@X@0@XH00XP
+M00XX1`Y`@P>&!HP%C02.`X\"`````````!P```"D`@````````````#:````
+M`````$0.($J&`H,#%``````````!``%X$`P'")`!````````/````!P`````
+M`````````-\`````````0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.
+M`X\"`````````#0```!<``````````````"T`@```````$(.$$(.&$(.($$.
+M*$$.,(,&A@6,!(T#C@(`````````/````)0```````````````H$````````
+M0@X00@X80@X@0@XH00XP00XX1`Y`@P>&!HP%C02.`X\"`````````!0```#4
+M```````````````V`````````!0```#L``````````````!]`````````#P`
+M```$`0`````````````C`0```````$(.$$(.&$(.($(.*$$.,$$..$0.4(,'
+MA@:,!8T$C@./`@`````````4````1`$`````````````/0`````````\````
+M7`$`````````````\00```````!"#A!"#AA"#B!"#BA!#C!!#CA$#H`!@P>&
+M!HP%C02.`X\"````````-````)P!`````````````(L!````````0@X00@X8
+M0@X@00XH00XP1`Y0@P:&!8P$C0..`@`````<````U`$`````````````:0``
+M``````!!#A"#`@```!0```#T`0`````````````O`````````!0````,`@``
+M```````````O`````````#P````D`@`````````````'`@```````$(.$$(.
+M&$(.($(.*$$.,$$..$0.4(,'A@:,!8T$C@./`@`````````\````9`(`````
+M````````>`````````!"#A!"#AA"#B!"#BA!#C!!#CA$#D"#!X8&C`6-!(X#
+MCP(`````````'````*0"`````````````-H`````````1`X@2H8"@P,`````
+M````````````````````````````1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N
+M-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N
+M-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N
+M-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N
+M-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N
+M-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N
+M-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N
+M-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N
+M-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N
+M-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N
+M-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H1TY5*2`S+C,N-```1T-#.B`H
+M1TY5*2`S+C,N-```+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5L82YT
+M97AT`"YR96QA+G)O9&%T80`N<F]D871A+G-T<C$N,0`N<F5L82YD871A`"YR
+M96QA+F5H7V9R86UE`"YB<W,`+F-O;6UE;G0`+FYO=&4N1TY5+7-T86-K````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````@`````0````8`````````````````
+M``!``````````."A`0`````````````````$````````````````````&P``
+M``0`````````````````````````T!H#``````!03`````````X````!````
+M"``````````8`````````"L````!`````@```````````````````""B`0``
+M````2)<``````````````````"`````````````````````F````!```````
+M```````````````````@9P,```````@K````````#@````,````(````````
+M`!@`````````,P````$````R````````````````````:#D"``````#>````
+M`````````````````0`````````!`````````$<````!`````P``````````
+M`````````&`Z`@``````!%<``````````````````"``````````````````
+M``!"````!``````````````````````````HD@,``````*@`````````#@``
+M``8````(`````````!@`````````4@````$````"````````````````````
+M:)$"```````@20``````````````````"````````````````````$T````$
+M`````````````````````````-"2`P``````<#(````````.````"`````@`
+M````````&`````````!<````"`````,```````````````````"@V@(`````
+M`+`!```````````````````@````````````````````80````$`````````
+M````````````````H-H"``````"H`P```````````````````0``````````
+M`````````&H````'`````````````````````````$C>`@``````````````
+M``````````````$````````````````````1`````P``````````````````
+M``````!(W@(``````'H````````````````````!````````````````````
+M`0````(`````````````````````````R.("``````!`)@````````\````)
+M````"``````````8``````````D````#``````````````````````````@)
+M`P``````Q1$```````````````````$`````````````````````````````
+M`````````````````````````````P`!````````````````````````````
+M`P`#`````````````````````````````P`%````````````````````````
+M`````P`&`````````````````````````````P`*````````````````````
+M`````````P`(`````````````````````````````P`+````````````````
+M`````````````P`,```````````````````````!````$@`!`&V(````````
+M<``````````,````$@`!`!5Y````````!@`````````7````$@`!`#OS````
+M````D0$````````B````$@`!`'E?````````EP`````````M````$@`!`!P(
+M`0``````*0(````````X````$@`!`+C)````````+P````````!#````$@`!
+M`+,2`0``````-@$```````!.````$@`!`)15````````ZP````````!9````
+M$@`!`*-,`0``````T0````````!D````$0`&`,`]````````I`$```````!O
+M````$@`!`+?W````````(0````````!Z````$@`!`()7````````+@``````
+M``"%````$@`!`-Q)````````]`````````"0````$0`&`&!.````````I`$`
+M``````";````$@`!`'[M````````(@````````"F````$@`!`$KI````````
+M$`````````"Q````$@`!`-C?````````"`````````"\````$@`!``#)````
+M````M@````````#'````$@`!`/33````````]P````````#2````$@`!`)T(
+M````````;P````````#=````$@`!`!&^````````J0````````#H````$@`!
+M`,^H````````MP````````#S````$@`!`.63````````2@````````#^````
+M$@`!`("7````````"``````````)`0``$@`!`!=]````````*0`````````4
+M`0``$@`!`*GP````````,0`````````?`0``$@`!`*C(````````!@``````
+M```J`0``$@`!`#S=````````%``````````U`0``$@`!`$4*`0``````<P``
+M``````!``0``$@`!`&(&````````1`````````!+`0``$@`!`-?+````````
+M\`````````!6`0``$@`!`&B+````````!@````````!A`0``$@`!`#@_`0``
+M````:0````````!L`0``$@`!`/-_````````!@````````!W`0``$@`!`(B7
+M````````"`````````""`0``$@`!`!(,````````5`$```````"=`0``$0`&
+M`"!)````````I`$```````"H`0``$@`!`#KJ````````EP````````"S`0``
+M$@`!`!-^````````9P````````"^`0``$@`!`*T"````````(0````````#)
+M`0``$@`!`/A``0``````50````````#4`0``$```````````````````````
+M``#U`0``$@`!`-5<````````,P```````````@``$@`!`$/L````````)P$`
+M```````+`@``$@`!``+L````````00`````````6`@``$@`!`*3`````````
+MJ0`````````A`@``$@`!`(=>````````(0`````````L`@``$@`!`*Z0````
+M````0P`````````W`@``$@`!`"^4````````F@````````!"`@``$@`!`'K!
+M````````,P````````!-`@``$@`!`+..````````'0````````!8`@``$@`!
+M`/WJ````````2@````````!C`@``$@`!``&`````````2@````````!N`@``
+M$@`!`"-<````````+`````````!Y`@``$@`!`$EY````````,P````````"$
+M`@``$@`!`*/E````````;@````````"/`@``$@`!`'R5````````+P``````
+M``":`@``$@`!`-'J````````'@````````"E`@``$@`!`*KI````````<@``
+M``````"P`@``$@`!`'7*````````6P````````"[`@``$@`!`,L*`0``````
+M+P````````#&`@``$@`!`'Q7````````!@````````#1`@``$@`!`$?K````
+M````F@````````#<`@``$@`!`.Q-````````+P8```````#G`@``$@`!`"R5
+M````````)P````````#R`@``$@`!`,_G````````*`````````#]`@``$@`!
+M`%P"````````40`````````(`P``$@`!`!SJ````````'@`````````3`P``
+M$@`!`,HN`0``````(P$````````>`P``$@`!`&K<````````)``````````I
+M`P``$@`!`(01`0``````A``````````T`P``$@`!`#Q>````````%@``````
+M```_`P``$@`!`)R+````````F0````````!*`P``$@`!`*6/````````>```
+M``````!5`P``$@`!`&UX````````'`````````!@`P``$@`!`(`T`0``````
+MK0````````!K`P``$@`!``9N````````(P(```````!V`P``$@`!`$YA````
+M`````0````````"!`P``$@`!`"TU`0``````-P````````",`P``$@`!`+=Z
+M````````8`(```````"7`P``$@`!`$,!````````#0$```````"F`P``$@`!
+M`'`?`0``````-0,```````"Q`P``$@`!`&3V````````VP````````"\`P``
+M$@`!``F5````````#@````````#'`P``$@`!`'$R`0``````;`$```````#2
+M`P``$@`!`+[O````````ZP````````#=`P``$@`!`$CW````````"```````
+M``#H`P``$@`!`%`"````````#`````````#S`P``$@`!`,J1````````"P``
+M``````#^`P``$@`!`*W!````````]``````````)!```$@`!`$W!````````
+M+0`````````4!```$@`!`(^B````````10`````````?!```$@`!`!M4````
+M````#@`````````J!```$@`!`%)>````````-0`````````U!```$@`!`,X"
+M````````U0$```````!+!```$@`!`*`0`0``````'`````````!6!```$@`!
+M`$N`````````CP````````!A!```$@`!`%M?````````'@````````!L!```
+M$@`!``2*````````$P````````!W!```$@`!`+@*`0``````$P````````""
+M!```$@`!`(RP````````(@````````"-!```$@`!`)+A````````L`,`````
+M``"8!```$@`!`,/>````````!P````````"C!```$@`!`$E8````````AP``
+M``````"N!```$@`!`-V(````````-P````````"Y!```$@`!`#-#`0``````
+M,`````````#$!```$@`!`!'@````````]@````````#/!```$@`!`/>4````
+M`````0````````#:!```$@`!`&Y<````````9P````````#E!```$@`!`)#`
+M````````%`````````#P!```$@`!``S-````````F08```````#[!```$@`!
+M`+@Q`0``````N0`````````&!0``$@`!`$3I````````!@`````````1!0``
+M$@`!`)2.````````'P`````````<!0``$@`!`#_X````````4@`````````G
+M!0``$@`!``]Y````````!@`````````R!0``$@`!`)`]`0``````.0$`````
+M```]!0``$@`!`,.8````````.P````````!(!0``$@`!`'A;````````6@``
+M``````!3!0``$@`!`.'K````````(0````````!>!0``$@`!`*73````````
+M3P````````!I!0``$@`!`%;'````````%`````````!T!0``$@`!`$U!`0``
+M````.0````````!_!0``$`````````````````````````",!0``$@`!`%EZ
+M````````7@````````"7!0``$@`!`-=D````````.P````````"B!0``$@`!
+M`#`_`0``````"`````````"M!0``$@`!`-M!`0``````"`````````"X!0``
+M$@`!`"+H````````=P````````##!0``$@`!`/<$````````1`$```````#4
+M!0``$@`!`-XW`0``````UP,```````#?!0``$@`!`*A>````````00``````
+M``#J!0``$@`!`*Q^````````F`````````#U!0``$@`!`/"4`````````0``
+M````````!@``$@`!`%KI````````#@`````````+!@``$@`!`'1-`0``````
+M3P`````````6!@``$@`!`%YD````````4@`````````A!@``$@`!`&#9````
+M````CP`````````L!@``$@`!`&Z+````````+@`````````W!@``$@`!`'VD
+M````````8P$```````!"!@``$@`!`(EX````````A@````````!-!@``$@`!
+M`+88`0``````R`4```````!8!@``$@`!`!7Y````````,`````````!C!@``
+M$@`!`,ST````````%@````````!N!@``$@`!`/Z8````````VP````````!Y
+M!@``$@`!`*#M````````'@(```````"$!@``$@`!`):2````````;@``````
+M``"/!@``$@`!`/F4````````$`````````":!@``$@`!`-KP````````80(`
+M``````"E!@``$@`!`*$U`0``````5`$```````"P!@``$@`!`&-#`0``````
+MQ`0```````"[!@``$@`!`%.5````````*0````````#&!@``$@`!`-R`````
+M````"@````````#1!@``$@`!`.Y6````````!P````````#<!@``$@`!`!2)
+M````````[@````````#G!@``$@`!`![G````````(`````````#R!@``$@`!
+M`*]A````````#@````````#]!@``$@`!`+J,`0``````V@`````````(!P``
+M$@`!`$=A`````````0`````````3!P``$@`!`';I````````!P`````````>
+M!P``$@`!`,[H````````-0`````````I!P``$0`&`.!1````````I`$`````
+M```T!P``$@`!`+3'````````9``````````_!P``$@`!`,Q0`0``````30``
+M``````!*!P``$@`!`#Q@````````2@````````!5!P``$@`!`)"7````````
+M#`````````!@!P``$@`!`!)E````````'@$```````!K!P``$@`!``4(`0``
+M````%P````````!V!P``$@`!`&3E````````'P````````"!!P``$@`!`#[G
+M````````D0````````",!P``$@`!`/Q!`0``````-P$```````"7!P``$@`!
+M`*YL````````&`````````"B!P``$@`!`'!C````````"`````````"M!P``
+M$@`!`%U=````````K`````````"X!P``$@`!`+MD````````'`````````##
+M!P``$@`!`)OF````````@P````````#.!P``$@`!`$H-`0``````F@(`````
+M``#9!P``$@`!`"(\`0``````;@$```````#D!P``$0`&`$!!````````I`$`
+M``````#O!P``$@`!`-!8````````J@$```````#Z!P``$@`!`$$^````````
+M0P`````````%"```$@`!`!QY````````+0`````````0"```$@`!`+!D````
+M````"P`````````;"```$``````````````````````````["```$@`!`#!F
+M````````]@4```````!&"```$0`&````````````"0````````!6"```$@`!
+M`.D3`0``````?0````````!A"```$@`!`!V0````````(@````````!L"```
+M$@`!``:A`0``````V@````````!W"```$@`!`.O4````````00````````""
+M"```$@`!``+H````````(`````````"-"```$@`!`$]A`````````0``````
+M``"8"```$@`!``L1`0``````>0````````"C"```$@`!`/&4````````!@``
+M``````"N"```$@`!`"27````````$P````````"Y"```$@`!`#6,````````
+MAP````````#$"```$@`!`'WI````````)P````````#/"```$```````````
+M``````````````#>"```$@`!`&.0````````+`````````#I"```$0`&`"!0
+M````````I`$```````#T"```$@`!`$[V````````$P````````#_"```$@`!
+M`%_:````````-P`````````*"0``$@`!`(:I````````10`````````5"0``
+M$@`!`)IL````````%``````````@"0``$@`!`"*3````````EP`````````K
+M"0``$@`!`,K>````````#0$````````V"0``$0`&`.!*````````I`$`````
+M``!!"0``$@`!`&KM````````%`````````!,"0``$@`!`**1````````*```
+M``````!7"0``$@`!`+OX````````6@````````!B"0``$@`!`(Y*`0``````
+M%0(```````!M"0``$@`!`+R,````````MP$```````!X"0``$@`!`.-C````
+M````%`````````"#"0``$@`!`$./````````,0````````"."0``$@`!`!&M
+M````````#P$```````"9"0``$@`!`"]R````````&`````````"D"0``$@`!
+M`.WW````````4@````````"O"0``$0`&`*!,````````I`$```````"Z"0``
+M$@`!`#^0````````)`````````#%"0``$@`!`!&1````````D0````````#0
+M"0``$@`!``E>````````*`````````#;"0``$@`!`,0[`0``````%```````
+M``#F"0``$`````````````````````````#U"0``$@`!`*[(````````"```
+M````````"@``$@`!`(/E````````(``````````+"@``$@`!`)Q:````````
+M'P`````````6"@``$@`!`._J````````#@`````````A"@``$@`!`.J4````
+M````!@`````````L"@``$@`!`$+F````````60`````````W"@``$0`&``!#
+M````````I`$```````!""@``$@`!`*V8````````"P````````!-"@``$@`!
+M`!>*````````K`````````!8"@``$@`!`!8!````````+0````````!F"@``
+M$0`&`(`_````````I`$```````!Q"@``$@`!`%N8````````4@````````!\
+M"@``$@`!`,.*````````!P````````"'"@``$0`&`"``````````0```````
+M``"9"@``$@`!``A=````````&`````````"D"@``$@`!`%1=````````"0``
+M``````"O"@``$@`!`.#?````````,0````````"Z"@``$@`!`+%B````````
+M;P````````#%"@``$@`!`,%.`0``````"0(```````#0"@``$@`!`"!C````
+M````$P````````#;"@``$@`!`->3````````#@````````#F"@``$@`!`(SW
+M````````*P````````#Q"@``$@`!`/A(````````N0````````#\"@``$@`!
+M`+4[`0``````#P`````````'"P``$@`!``F8````````4@`````````2"P``
+M$@`!`,F4````````(0`````````="P``$@`!`%SW````````,``````````H
+M"P``$@`!`&K'````````&0`````````S"P``$@`!`&0U`0``````/0``````
+M```^"P``$@`!`+F3````````'@````````!)"P``$@`!`'X>`0``````Q@``
+M``````!4"P``$@`!`,J*````````G@````````!?"P``$@`!`+;(````````
+M2@````````!J"P``$0`&`,!$````````I`$```````!U"P``$@`!`,]C````
+M````%`````````"`"P``$@`!`.-!`0``````&0````````"+"P``$@`!`)-6
+M````````6P````````"6"P``$@`!`#1C````````,0````````"A"P``$@`!
+M`(+#````````Q0,```````"L"P``$@`!`'1A````````.P````````"W"P``
+M$@`!`"Y@````````#@````````#""P``$@`!`);:````````0@$```````#-
+M"P``$@`!`-TS`0``````H`````````#8"P``$@`!`+B8````````"P``````
+M``#C"P``$@`!`+%)````````*P````````#N"P``$@`!`-G<````````8P``
+M``````#Y"P``$@`!`#@+````````:``````````$#```$@`!`%@'````````
+M10$````````/#```$@`!`$C<````````(@`````````:#```$@`!`(9@````
+M````F@`````````E#```$@`!`&AC````````"``````````P#```$@`!`"PM
+M`0``````?P`````````[#```$@`!`/];````````)`````````!&#```$@`!
+M`$0?`0``````+`````````!1#```$@`!`.0[````````'`````````!<#```
+M$@`!`*,$````````5`````````!G#```$@`!`!'F````````,0````````!R
+M#```$`````````````````````````""#```$@`!`*ZP````````@`$`````
+M``"-#```$@`!`(!6````````$P````````"8#```$@`!`,D^`0``````9P``
+M``````"C#```$@`!`$]<````````'P````````"N#```$@`!``?A````````
+MBP````````"Y#```$@`!`%62````````00````````#$#```$@`!`!C(````
+M````D`````````#/#```$`````````````````````````#O#```$@`!`*8&
+M````````L@````````#Z#```$@`!`-Y:````````8P`````````%#0``$@`!
+M`$%;````````,0`````````0#0``$@`!`'2/````````,0`````````;#0``
+M$@`!`+!7````````F0`````````F#0``$@`!`/&0````````(``````````Q
+M#0``$@`!`"S5``````````0````````\#0``$@`!`!>5````````#@``````
+M``!'#0``$@`!`$7Y````````$0$```````!2#0``$@`!`$%A````````!@``
+M``````!=#0``$@`!`'Q:````````(`````````!H#0``$@`!`$Y=````````
+M!@````````!S#0``$`````````````````````````"!#0``$@`!`'2.````
+M````(`````````",#0``$@`!`'`)````````E`````````"7#0``$@`!`%!A
+M````````)`````````"B#0``$@`!`/27````````%0````````"M#0``$@`!
+M`*N5````````%@````````"X#0``$@`!`"QM````````V@````````###0``
+M$@`!`/=C````````%0````````#.#0``$@`!`"!=````````+@````````#9
+M#0``$@`!`$3E````````(`````````#D#0``$@`!`%#W````````#```````
+M``#O#0``$@`!`*4'`0``````8`````````#Z#0``$@`!`(^0````````'P``
+M```````%#@``$@`!`+K<````````'P`````````0#@``$@`!`&84`0``````
+M4`0````````;#@``$@`!`#%>````````"P`````````F#@``$@`!`#B7````
+M````2``````````Q#@``$@`!`-61````````%@`````````\#@``$@`!`$1_
+M````````KP````````!'#@``$@`!`-:.````````;0````````!2#@``$@`!
+M`/B4`````````0````````!=#@``$@`!`'QY````````W0````````!H#@``
+M$0`&`*!3````````I`$```````!S#@``$@`!`-A:````````!@````````!^
+M#@``$@`!`-".````````!@````````")#@``$@`!`%U5````````-P``````
+M``"4#@``$@`!`/56````````A`````````"?#@``$@`!`([<````````+```
+M``````"J#@``$@`!`*`+````````<@````````"U#@``$@`!`.-``0``````
+M$P````````#`#@``$@`!`*3I````````!@````````#+#@``$@`!`""2````
+M````-0````````#6#@``$@`!`+$L`0``````>P````````#A#@``$@`!`+66
+M````````;P````````#L#@``$@`!`-R9````````H`@```````#W#@``$0`&
+M`&!5````````I`$````````"#P``$@`!`$+9````````'0`````````-#P``
+M$@`!`-);````````+0`````````8#P``$@`!`#L&````````)P`````````C
+M#P``$@`!`+M:````````'0`````````N#P``$@`!`*$_`0``````0@$`````
+M```Y#P``$@`!`&4W`0``````>0````````!$#P``$@`!`'AC````````#```
+M``````!/#P``$@`!``23````````'@````````!:#P``$@`!`$#W````````
+M"`````````!E#P``$@`!`(1C````````2P````````!P#P``$@`!`+A4````
+M````00````````![#P``$@`!`!!@````````'@````````"&#P``$@`!`.:%
+M````````&@````````"1#P``$@`!``0*````````-`$```````"<#P``$@`!
+M`+;)`````````0````````"G#P``$@`!`$!]````````00````````"R#P``
+M$@`!`,R7````````%`````````"]#P``$@`!`$AA````````!@````````#(
+M#P``$@`!`!'#````````<0````````#3#P``$@`!`-CW````````%0``````
+M``#>#P``$@`!`"M@`0``````Q`````````#I#P``$@`!`"!A````````(0``
+M``````#T#P``$@`!`-!*````````)0````````#_#P``$@`!`,]!````````
+M*0<````````5$```$@`!`)'X````````*@`````````@$```$@`!``QD````
+M````4@`````````K$```$@`!`%CZ````````30T````````V$```$@`!`%#=
+M````````<P$```````!!$```$@`!`(/'````````,0````````!,$```$@`!
+M`."7````````%`````````!7$```$@`!`(%]````````D@````````!B$```
+M$@`!`&@[````````?`````````!M$```$@`!`/E_````````"`````````!X
+M$```$@`!`,9L````````9@````````"#$```$@`!`)R7````````,```````
+M``".$```$@`!`'RB````````$P````````"9$```$@`!`/E4````````9```
+M``````"D$```$@`!`-J``````````0````````"O$```$@`!`.E>````````
+M<@````````"Z$```$@`!`#*]````````0@````````#%$```$@`!`-_U````
+M````;P````````#0$```$@`!``/I````````00````````#;$```$@`!`.N1
+M````````-0````````#F$```$@`!`$.!````````HP0```````#Q$```$@`!
+M`"]U````````R@(```````#\$```$@`!`&CI````````#@`````````'$0``
+M$@`!`$?'````````#P`````````2$0``$@`!`)MY`0``````S@`````````=
+M$0``$@`!`)GH````````-0`````````H$0``$@`!`-C;````````;0``````
+M```S$0``$@`!`/H*`0``````4`(````````^$0``$@`!`-@[`0``````&0``
+M``````!)$0``$@`!`"R(````````00````````!4$0``$@`!`._9````````
+M<`````````!?$0``$@`!`');````````!@````````!J$0``$@`!`"65````
+M````!P````````!U$0``$@`!`'I^````````,@````````"`$0``$@`!`/?G
+M````````"P````````"+$0``$@`!`!<H`0``````[@````````"6$0``$@`!
+M`-2B````````J0$```````"A$0``$@`!`*X]````````DP````````"Z$0``
+M$@`!`/$[`0``````,0``````````>GHP,#5B-3@T-@!Z>C`P,F1B,3%C`'IZ
+M,#)D8F8X-S4`>GHP,F1B8C%B,@!Z>C`R9&(R,#4S`'IZ,#`R9&)A-#(`>GHP
+M9F)B,64S9@!Z>C!B-SEE83DT`'IZ,#5B.&,V-6$`>GHP,#5B-#!A9`!Z>C`U
+M8CDT,F5D`'IZ,&0X9&,V,F,`>GHP,#$Y9C0W,`!Z>C`R9&0Y-#)D`'IZ,#)D
+M8F4W,V0`>GHP,#5B-CDR8@!Z>C!B-F0R,S(U`'IZ,#`U8C@U,V0`>GHP,#$V
+M9#DR90!Z>C!C9F(Q.#<U`'IZ,#`R9&(S,6,`>GHP,F1A8F)A8P!Z>C`R9&)C
+M.#4Q`'IZ,#`P8C9C-C@`>GHP,#!B-F)F.`!Z>C`P8C9C9C5E`'IZ,#$V93%D
+M9F0`>GHP8C9F-3!B.`!Z>C`V93!A-&9E`'IZ,#`V-V0R8C$`>GHP,#)D8F,V
+M,0!Z>C!B-F-A,S(U`'IZ,#`U8C9C9F0`>GHP,39E,&1F9`!Z>C`P,&(V9C8X
+M`&%T:%]H86Q?<')O8V5S<U]N;VES969L;V]R`'IZ,#`U8C0X860`>GHP,F1B
+M9C%B,@!Z>C`P-6(X.&-B`'IZ,#,S96,X8F8`>GHP9&(T,C5C-0!A=&A?:&%L
+M7V1M85]B96%C;VY?<F5S<&]N<V5?=&EM90!Z>C`P8C9F,38Q`'IZ,#9E,#!B
+M.&$`>GHP,F1B9F,Q9`!Z>C!D8S1E,SDP`'IZ,&1A9F5D.#8`>GHP,&(V93(W
+M80!Z>C`R9&)B86(R`'IZ,&(V9#%E9F8`>GHP,39D.3!D9`!Z>C`R9&)E.#4Q
+M`'IZ,#`U8C8T9F0`>GHP,#!B-F0U,@!Z>C!B-F,Y969F`'IZ,#$V93`P9&0`
+M>GHP,F1B9#@W-0!Z>C`R9&(S,6(R`'IZ,#!B-S`Y,C,`>GHP,&(V9#0U,`!Z
+M>C`P,&(V9#%D`'IZ,&(V8S(S,C4`>GHP,F1B9&%B,@!Z>C`P,#5B-C,R`'IZ
+M,#9D961D.3,`>GHP,#$V9&$U,`!Z>C`P,#8W9#,R`'IZ,#!B-F0Y,C,`>GHP
+M,#)D8C4Q8P!Z>C`Q-F1C8F9E`'IZ,#!B-S`Q-#4`>GHP,#$V9&8R8P!Z>C!B
+M-V9A9#-E`'IZ,#$V9#DY,C``>GHP,F1B,6)A8P!Z>C!D8S9E,SDP`'IZ,#5B
+M-S`Q93``>GHP,#!B-F(Q,`!Z>C!B-S`Y969F`'IZ,#$V9&8X.6(`871H7VAA
+M;%]A='1A8V@`>GHP-F4P9F,P9`!Z>C`Q-F1A8C)D`'IZ,#)D8C$S-60`>GHP
+M93`T-C@T8@!Z>C`Q-F4R.3%D`'IZ,#`P8C9F93@`>GHP,&-F8C-E,`!Z>C`P
+M,39D.30X`'IZ,#$V93(P.6(`>GHP8C<P,65F9@!Z>C`P,&(V8SED`'IZ,#`P
+M-6(U83(`>GHP,F1B,3<P80!A=&A?:&%L7V-O;7!U=&5T>'1I;64`>GHP,F1B
+M-6)A8P!Z>C`P-6(X,3-D`'IZ,#!B-F,Y,C,`>GHP8C9B-3!B.`!Z>C`P-6(W
+M9CED`'IZ,&(W,#%D,#(`>GHP-F1F9C0T80!Z>C`R9&(U-S8S`'IZ,#9E96%F
+M-C``>GHP93`P-V-A,0!Z>C`P,F1A9C8R`'IZ,&(X,V%D,V4`>GHP,#!B-F(Y
+M,`!Z>C`Q-F0Y969A`'IZ,#$V9&4P-3$`>GHP,#`U8C9B,@!Z>C`U8C=F,3$T
+M`'IZ,#1A93`S,68`>GHP,F1B9&1F9`!Z>C`P-30W9F5D`'IZ,#!B-F)F-64`
+M>GHP,&(W,3<W9`!Z>C`P8C<P9C-D`'IZ,#$V9#@Y,C``>GHP,F1B,6%B,@!Z
+M>C`P,#5B-C(R`'IZ,#`P8C9F-S@`>GHP8C8Y8C`W8P!A=&A?:&%L7V9R964`
+M>GHP-6(W.6(Q8@!Z>C`P8C<P-S-D`'IZ,#)D8F5B8F0`>GHP8C5E,S$U,@!Z
+M>C`Q-F1F8F8Q`&%T:%]H86Q?;6AZ,FEE964`>GHP,39E,3@Y8@!Z>C!D8S)A
+M-6,U`'IZ,#`R9&,V,&(`>GHP-F1F,&(X80!Z>C`R9&(S,S5D`'IZ,&(V8S4S
+M830`>GHP9C4T9#%B,`!Z>C!B-F9D,S8S`'IZ,&0Y9&,V,F,`>GHP-6(W-#%E
+M,`!Z>C`R9&$Y8F%C`'IZ,&1C,C%D,V$`>GHP,&(W,3<S9`!Z>C`Q-F0Y9#0Q
+M`'IZ,#`U8C@T9F0`>GHP,#5B.&%B9`!Z>C`P8C<P,3(S`'IZ,#`U8C8U,F(`
+M>GHP,F1B,S@W-0!Z>C`Q-F4S,#EB`'IZ,#`U8C8P8C(`>GHP,F1B,3@W-0!Z
+M>C`P,F1B.#0R`'IZ,#)D8C$W-C,`>GHP8C=D96$Y-`!Z>C`P8C<P,38Q`'IZ
+M,#$V9#=D-#$`>GHP,#$V8V0S,@!Z>C`V9&4P8CAA`'IZ,#9D.61D.3,`>GHP
+M9&(S960X-@!Z>C`P-6(T.&5D`'IZ,#`R9&,X,&(`>GHP,#)D8F,T,@!Z>C`R
+M9&)A.#4Q`'IZ,#)D8C,S960`>GHP,#5B.#!F9`!Z>C`P-6(W9C)E`'IZ,#)D
+M8F9D9F0`>GHP,39E-C0X80!Z>C`P,F1A9F8R`'IZ,#`U8C<W.60`>GHP,#!B
+M-F5E.`!Z>C`Q-F4T-#AA`'IZ,#!B-F8V8F,`>GHP,39D83DR,`!Z>C`U8C<X
+M,64P`'IZ,#`R9&-A,&(`>GHP,#5B-#1A9`!Z>C`V9&1F-#1A`'IZ,&9A8S!C
+M.6(`>GHP8C9F.65F9@!Z>C`P8C9C-F)C`&%T:%]H86Q?861D:71I;VYA;%]S
+M=V)A7V)A8VMO9F8`>GHP,#`R9&(Y,@!A=&A?:&%L7W9E<G-I;VX`>GHP,F1B
+M86,R90!Z>C`R9&(W.6%E`'IZ,#`Q-F4U,S(`>GHP8C9C9C`P.0!Z>C`P,39E
+M,3)C`'IZ,#`Q-F0Y930`>GHP,#`R9&%E80!Z>C`P-6(U8V(R`'IZ,#$V9&$R
+M-3$`>GHP-F8V868V,`!Z>C`V9&9D9#DS`&%T:%]H86Q?;6%L;&]C`'IZ,#`P
+M8C9D9#(`>GHP,F1D.3)A9`!Z>C`Q-F1B,C4Q`'IZ,&4Q,#=C83$`>GHP,&(V
+M8S<U90!Z>C`Q-F1D,#4Q`'IZ,#)D8F0Q8C(`>GHP,F1C,3<V,P!Z>C!B-CDP
+M9#9D`'IZ,#$V9&8P-3$`>GHP,#$V9#DU,`!Z>C`P8C<P-F)C`'IZ,#`Q-F0X
+M-S(`>GHP-F1E9C0T80!Z>C`U8CAC,F5D`'IZ,#9F8CDT-V(`>GHP96)B,64S
+M9@!Z>C!B-F8Y9#`R`'IZ,&0Q-&0Q8C``>GHP8C0X,#,Q90!Z>C`Q-F1B8F9E
+M`'IZ,#$V934T.&$`>GHP,#$V9#@U,`!Z>C`P,&(V9F8X`&%T:%]H86Q?;65M
+M8W!Y`'IZ,#)D8F-B8F0`>GHP,39D83!D9`!Z>C`R9&)B9&9D`'IZ,#)D8C(X
+M-3$`>GHP,F1B9&,Q9`!Z>C`V9&(P8V8R`'IZ,#$V96(Y860`>GHP,&(V8V5B
+M8P!Z>C!D.30X-&$Q`&%T:%]H86Q?<')O8F4`>GHP,39E83EA9`!Z>C!F9#1D
+M,6(P`'IZ,#)D8C,W-C,`871H7VAA;%]B=6EL9&]P=',`>GHP,F1A9C,U9`!Z
+M>C`V9&1D9#DS`'IZ,&1A9&,V,F,`>GHP,39D9C(U,0!Z>C`P,&(V8S$P`'IZ
+M,#$V9#DR-3$`>GHP,F1B,#@U,0!Z>C!B-S(Q865D`'IZ,#8W8V9C864`>GHP
+M,#!B-F-F.`!Z>C!C.31D,6(P`'IZ,#)D869A8C(`>GHP-6(Y,F%E9`!Z>C`P
+M-6(X8V-B`'IZ,&(V9#EE9F8`>GHP,F1B,3%B,@!Z>C`R9&)F9F(Q`'IZ,#)D
+M8F8W-C,`>GHP,#5B-CAF9`!Z>C`P-6(T-&5D`'IZ,&(W,3%A960`>GHP8C5E
+M,S$V,`!Z>C!D.#0X-&$Q`'IZ,#$V9#AB,F0`>GHP,39E,#@Y8@!Z>C`R9&)B
+M.#<U`'IZ,#)D864X-3$`>GHP8C@Q96$Y-`!Z>C`Q-F1E8S%F`'IZ,#!B-F9E
+M8F,`>GHP93@Y-#DP-P!Z>C`P8C9E83=A`'IZ,#,S93AF8F8`>GHP8V9A-3@W
+M-0!Z>C`R9&(Y.6%E`'IZ,#)D8CEA8C(`>GHP,#!B-F)E.`!Z>C!D938X,S=F
+M`'IZ,#$V9&%B9F4`>GHP8C<P.60P,@!Z>C`V-V0R-64R`'IZ,#$Y9C-A,#$`
+M>GHP-S`S.30W8@!A=&A?:&%L7VUE;7IE<F\`>GHP-F1F9F,P9`!Z>C!B-C<U
+M,&(X`'IZ,#$V93)D9F0`>GHP,#!B-F0R,@!Z>C`V9F5A9C8P`'IZ,&1C-&$U
+M8S4`>GHP,&(W,&8W9`!A=&A?:&%L7W-W7V)E86-O;E]R97-P;VYS95]T:6UE
+M`'IZ,#EF-C1B-F$`>GHP,#5B-C4W80!Z>C`V9C,Y-#=B`'IZ,#9D83!C9C(`
+M>GHP8C=B860S90!Z>C`P8C9F.38Q`'IZ,&(V.3<S8F,`>GHP,F1B9#,U9`!Z
+M>C`P-6(X.&9D`'IZ,#)D8F)C,60`>GHP,F1A9F1F9`!Z>C`V9#=D9#DS`&%T
+M:%]H86Q?9&5L87D`>GHP,F1B,61F9`!Z>C`V-V0R9C0Q`'IZ,#)D868X-S4`
+M>GHP8C=E9&4V9`!Z>C`Q-F0X9#0Q`'IZ,#`R9&%E.3(`>GHP8C=A9&4V9`!Z
+M>C`R9&)B,S5D`'IZ,#)D8C-D9F0`>GHP,F1B-3-E9`!Z>C`Q-F1C96%E`'IZ
+M,#`P8C9D83(`>GHP,#!B-F4R,@!Z>C`U8C@P,#0Q`'IZ,#`Q-F0X-#@`>GHP
+M,39D.6(R9`!Z>C`P,39E,#)C`'IZ,#!B-S`W-V0`>GHP,#5B-CDW80!Z>C`P
+M,39D864T`'IZ,#$V93$P.6(`>GHP,#5B-&$R9`!Z>C`Q-F1E,&1D`'IZ,#$V
+M9&8P9&0`>GHP9&8P-V-A,0!Z>C`R9&)D-S8S`'IZ,#`P8C9E-3(`>GHP-C=D
+M,&,T-P!Z>C`U8C9C-F1B`'IZ,&,S,35E8C4`>GHP9&(Q960X-@!Z>C`V9#0P
+M-F4P`'IZ,#$V93`R-3$`>GHP,#`R9&)B,@!Z>C`P,F1D.#9D`'IZ,#`Q-F4Q
+M-&0`>GHP,F1B-3EA90!Z>C`P-C=D,C(Q`'IZ,#$V9#@P9&0`>GHP,#5B.#DS
+M9`!Z>C`U8C@Q8C%B`'IZ,#)D8C$S960`>GHP,&(V9#$R,P!Z>C`P,&(V8V4X
+M`'IZ,#5B.&%A960`>GHP8C9E9#,V,P!Z>C`R9&%F,6(R`'IZ,#`P-6(U93(`
+M>GHP,S-E8F9B9@!Z>C`U8C8X-F1B`'IZ,#`P8C9E9C@`>GHP8C<Q.6%E9`!Z
+M>C`P-6(U.&(R`'IZ,#5B-V1B,6(`>GHP8C@R9&4V9`!Z>C`P,39D-S,R`'IZ
+M,#)D861A8C(`>GHP9C0U939E,P!A=&A?:&%L7VEN:71?8VAA;FYE;',`>GHP
+M,&(V9#9B8P!Z>C!C,31D,6(P`'IZ,#`P,F1B9#(`>GHP9&$T.#1A,0!Z>C`Q
+M-F4P8C@W`'IZ,#5B.3`R960`>GHP9&,R93,Y,`!Z>C!A-C!D,30U`'IZ,#)D
+M8F%B8F0`>GHP,#!B-F,Q9`!Z>C`U8CAE865D`'IZ,#`U8C=B.60`>GHP,#5B
+M-30T-@!Z>C`U8C8T-F1B`'IZ,#!B-F8Y,C,`>GHP9&0V.#,W9@!Z>C`Q-F4Q
+M,C4Q`'IZ,&1C-F$U8S4`>GHP,F1B,S<P80!Z>C`P,#5B-C<R`'IZ,#9D969C
+M,&0`>GHP,F1B9C,U9`!Z>C`P,&(V8S<X`'IZ,#`Q-F0X,S(`>GHP,F1B-3<P
+M80!Z>C`P-6(V9#=A`'IZ,#`R9&(R.3(`>GHP,#5B.3!C8@!Z>C!B-F8U,S8S
+M`'IZ,#`U8C5C-#8`>GHP-F0Y,&-F,@!Z>C`V9#AD9#DS`'IZ,#$V9&9B.#<`
+M>GHP,#$V9&$T.`!Z>C!B-C8S,6$X`'IZ,#`R9&(P.3(`871H7VAA;%]G971W
+M:7)E;&5S<VUO9&5S`'IZ,#$V93%B.#<`````!@`````````+`````P```#$`
+M````````6``````````+`````P```$0`````````@``````````+`````P``
+M`%8`````````Q0`````````+`````P```&D`````````TP`````````+````
+M`P```'T`````````XP`````````+`````P```)$`````````[``````````+
+M`````P```)X`````````]0`````````+`````P```*L`````````_@``````
+M```+`````P```+X`````````!P$````````+`````P```-$`````````SP$`
+M```````"````=P```/S_________V0$````````"````A0$``/S_________
+MXP$````````"````2````/S_________CP(````````"````-@$``/S_____
+M____,04````````"````O0```/S_________HP4````````"````O0```/S_
+M________2P8````````"````'P$``/S_________5`8````````+`````@``
+M````````````<@8````````"````'P$``/S_________>P8````````+````
+M`@``````````````(0<````````"````9P```/S_________/@<````````"
+M````9P```/S_________;0<````````+`````@````@`````````N0L`````
+M```"````_@```/S_________V`L````````"````'P$``/S_________\`L`
+M```````+`````@```"`!````````<@P````````"````'P$``/S_________
+M@`P````````+`````@```"`!````````[`P````````+`````@```"`!````
+M````=0T````````+`````@```#`!````````?@T````````+`````@```%`!
+M````````!1$````````"````S@```/S_________FA4````````"````(0$`
+M`/S_________W!@````````"````A````/S_________["$````````"````
+MS@```/S_________&"(````````"````(0$``/S_________I2(````````"
+M````(0$``/S_________+B,````````"````(0$``/S_________F",`````
+M```"````A````/S_________82T````````+`````@```)`!````````<RT`
+M```````+`````@```'`!````````=#P````````+````!````"`*````````
+MH#P````````+````!````&``````````"CT````````+````!````"`*````
+M````CCX````````+````!````"`*````````I3X````````+````!````"`*
+M````````\SX````````+````!````&``````````!S\````````+````!```
+M`'``````````1C\````````+````!````*`D````````5C\````````+````
+M!````*`D````````8S\````````"````YP```/S_________D#\````````+
+M````!````&``````````/$`````````+````!````&``````````5D``````
+M```+````!````&``````````KT`````````+````!````,`)````````X$``
+M```````+````!````,`)````````E$,````````+`````@```+`!````````
+MFT,````````+`````@```,@!````````2D0````````+````!``````;````
+M````>40````````+````!````&`4````````I40````````+````!````$`>
+M````````U$0````````+````!````&`A````````!$4````````+````!```
+M```D````````-$4````````+````!``````;````````9D8````````"````
+M(0$``/S_________SD<````````+`````@```,@!````````^4<````````+
+M`````0`````\````````M4D````````"````_@```/S_________BDH`````
+M```"````_@```/S_________U4H````````"````_@```/S_________LTP`
+M```````+````!````"`]````````-TT````````+````!````(`]````````
+M%4X````````"````S@```/S_________-DX````````+`````@```.`!````
+M````/DX````````"````YP```/S_________NTX````````"````/`$``/S_
+M________.T\````````"````,````/S_________<$\````````"````*P$`
+M`/S_________I$\````````"````*P$``/S_________T$\````````"````
+M*P$``/S_________(U`````````"````*P$``/S_________85`````````"
+M````*P$``/S_________&U$````````+````?```````````````;E,`````
+M```"````*P$``/S_________\%,````````"````A````/S_________(%0`
+M```````"````A````/S_________#E4````````"````,@```/S_________
+M'54````````"````*0$``/S_________5%4````````"````9`$``/S_____
+M____75H````````"````<````/S_________DUH````````"````YP```/S_
+M________K5H````````"````YP```/S_________REH````````+`````@``
+M``@6````````SUH````````"````YP```/S_________$%L````````"````
+M2P```/S_________J%L````````"````)0$``/S_________NUL````````"
+M````=0```/S_________S%P````````"````4`$``/S_________=5T`````
+M```"````YP```/S_________#E\````````"````)@```/S_________+U\`
+M```````"````7`$``/S_________<%\````````"````)@```/S_________
+MH5\````````"````)@```/S_________U%\````````"````7`$``/S_____
+M____)6`````````"````)@```/S_________KF`````````"````)@```/S_
+M________X6`````````"````7`$``/S_________.&$````````"````)@``
+M`/S_________:V$````````"````%P$``/S_________IF$````````"````
+M'````/S_________M&$````````"````.`$``/S_________%V(````````"
+M````-@$``/S_________-V(````````"````-@$``/S_________/6,`````
+M```+````\@``````````````2V,````````+````$@``````````````7&,`
+M```````"````*@$``/S_________LV,````````"````-@$``/S_________
+M6V8````````"````_@```/S_________JV8````````"````/`$``/S_____
+M____O6@````````"````MP```/S_________?VD````````+`````@```"`6
+M````````OFD````````"````A@$``/S_________"&L````````"````-@$`
+M`/S_________,FL````````"````2P```/S_________/6L````````"````
+ME0```/S_________8&L````````"````6````/S_________>&L````````"
+M````?P```/S_________J&L````````"````@`$``/S_________PVL`````
+M```"````#````/S_________WFL````````"````&0$``/S_________U6P`
+M```````"````^0```/S_________`VT````````"````-@$``/S_________
+M'VT````````"````-@$``/S_________2VT````````"````^0```/S_____
+M____G6T````````"````-@$``/S_________PFT````````"````-@$``/S_
+M________U&T````````"````^0```/S_________(&X````````"````_@``
+M`/S_________9VX````````"````-@$``/S_________AFX````````"````
+M-@$``/S_________J&X````````"````-@$``/S_________'V\````````"
+M````-@$``/S_________/F\````````"````-@$``/S_________:V\`````
+M```"````-@$``/S_________E6\````````"````2P```/S_________PV\`
+M```````"````E0```/S_________T6\````````"````-@$``/S_________
+MW&\````````"````E0```/S_________6G`````````"````-@$``/S_____
+M____<7`````````"````2P```/S_________VG,````````+`````@```'(;
+M````````2'4````````+`````@```(`;````````374````````"````YP``
+M`/S_________7G4````````+`````@```&`;````````9G4````````"````
+MYP```/S_________PG4````````"````,````/S_________Z74````````"
+M````,````/S_________=G<````````"````,````/S_________D7<`````
+M```"````,````/S_________J7<````````"````,````/S_________,7@`
+M```````"````,````/S_________MG@````````"````2P```/S_________
+MSG@````````"````-@$``/S_________UG@````````"````4P```/S_____
+M____0'D````````"````9P$``/S_________<WD````````"````%@$``/S_
+M_________'D````````"````(0$``/S_________-7H````````"````O@``
+M`/S_________F7T````````"````H@```/S_________K'T````````"````
+M4`$``/S_________VWT````````"````4`$``/S_________]WT````````"
+M````4`$``/S_________^WX````````"````-@$``/S_________,G\`````
+M```"````2P```/S_________.H$````````"````,````/S_________:8$`
+M```````"````S@```/S_________BH$````````+`````@```.`;````````
+MDH$````````"````YP```/S_________$((````````"````E0$``/S_____
+M____3X(````````"````-@$``/S_________W8(````````"````-@$``/S_
+M________%8,````````"````20$``/S_________=(,````````"````20$`
+M`/S_________KX,````````"````20$``/S_________'80````````+````
+M`@````@P````````980````````"````>0$``/S_________GH0````````"
+M````-@$``/S_________Q80````````"````-@$``/S__________80`````
+M```"````20$``/S_________*84````````+````TP``````````````.84`
+M```````"````@0$``/S_________7H4````````"````20$``/S_________
+MP(4````````"````9@$``/S_________\H4````````"````'@$``/S_____
+M____^H4````````"````A````/S_________Z(8````````"````-@$``/S_
+M________9(<````````"````W@```/S_________[H<````````"````20$`
+M`/S_________I8@````````"````,@```/S_________M(@````````"````
+M*0$``/S_________U(@````````"````C@$``/S_________9(X````````"
+M````S````/S_________BXX````````"````YP```/S_________I8X`````
+M```"````YP```/S_________PHX````````+`````@```"`P````````QXX`
+M```````"````YP```/S_________$H\````````"````2P```/S_________
+MU8\````````"````XP```/S_________\X\````````"````0@$``/S_____
+M____!I`````````"````.````/S_________Z)`````````"````!P$``/S_
+M________!I$````````+`````@```$`P````````,9$````````"````YP``
+M`/S_________NY(````````"````)@```/S_________V)(````````"````
+M7`$``/S_________&9,````````"````)@```/S_________2I,````````"
+M````)@```/S_________?9,````````"````7`$``/S_________SI,`````
+M```"````)@```/S_________5Y0````````"````)@```/S_________BI0`
+M```````"````7`$``/S_________X90````````"````)@```/S_________
+M2I4````````"````WP```/S_________<Y4````````"````%P$``/S_____
+M____HI4````````"````'````/S_________L)4````````"````.`$``/S_
+M________[)4````````"````-@$``/S_________#)8````````"````-@$`
+M`/S_________5)<````````+````NP``````````````79<````````+````
+M"0$`````````````9I<````````+````[@``````````````=Y<````````"
+M````*@$``/S_________NY<````````"````2P```/S_________6IH`````
+M```"````_@```/S_________9IL````````"````E0$``/S_________:IP`
+M```````"````,````/S_________?)P````````"````,````/S_________
+MBYP````````+````!````*Q'````````J9P````````+````!````+A'````
+M````U9P````````+````!````(!&````````#YT````````+`````@```&`P
+M````````0)T````````+`````@```(`X````````;YT````````+`````@``
+M`"`S````````=IT````````+`````@```"0S````````HY\````````"````
+M(@$``/S_________=J`````````"````-@$``/S_________H*`````````"
+M````2P```/S_________K:`````````"````'@```/S_________):$`````
+M```"````#@$``/S_________RZ$````````"````4@```/S_________^Z$`
+M```````"````FP```/S_________%J(````````"````U0```/S_________
+M,:(````````"````.0```/S_________GJ(````````"````5P$``/S_____
+M____QZ(````````"````-@$``/S_________\J(````````"````5P$``/S_
+M________A:,````````"````-@$``/S_________NJ,````````"````-@$`
+M`/S_________$*0````````"````-@$``/S_________/J0````````"````
+M-@$``/S_________4*0````````"````5P$``/S_________IJ0````````"
+M````_@```/S_________;Z4````````"````'@```/S_________?:4`````
+M```"````-@$``/S_________B*4````````"````'@```/S_________%J8`
+M```````"````-@$``/S_________+:8````````"````2P```/S_________
+M<:8````````"````B@```/S_________B:8````````+`````@```&0\````
+M````EJ8````````"````,````/S_________S:8````````"````,````/S_
+M________]:8````````"````,````/S_________]*<````````"````-@$`
+M`/S_________\J@````````"````<`$``/S_________'ZD````````+````
+M`@```*@]````````CJD````````+`````@```,`]````````FJD````````"
+M`````@```+P]````````LJD````````+`````@```,(]````````^:H`````
+M```+````!````!Q(````````&*L````````+````!````"A(````````-ZL`
+M```````+````!````-Q(````````V*L````````+````!````&1(````````
+M\:L````````"````,````/S_________$*P````````+````!````'!(````
+M````):P````````"````,````/S_________1ZP````````"````,````/S_
+M________7:P````````+````!````'Q(````````<JP````````"````,```
+M`/S_________D*P````````"````,````/S_________I*P````````+````
+M!````*Q(````````QZP````````+````!````.!'````````\ZX````````"
+M````WP```/S_________R;$````````"````%0```/S_________7;(`````
+M```+````!0``````````````8K(````````"````(0$``/S_________;K(`
+M```````+````!0```"`!````````<[(````````"````(0$``/S_________
+M>K(````````+````!0````@`````````@;(````````+````!0```(@`````
+M````I+(````````"````!0````(`````````J[(````````"````!0```/S_
+M________M+(````````"````!0```/[_________PK(````````"````!0``
+M``(`````````YK(````````"````!0````(`````````];(````````"````
+M!0````(`````````![,````````"````!0````(`````````*K,````````"
+M````!0````(`````````4+,````````"````!0````(`````````7K,`````
+M```"````!0````(`````````9[,````````"````!0````(`````````U+,`
+M```````+````!0```"`!````````%+0````````"````!0````(`````````
+MPK0````````+````!0```"`!````````X;0````````"````!0````(`````
+M````^[0````````+````!0```"`!`````````;4````````!````!0```!X!
+M````````++4````````+````!0```"(!````````,[4````````+````!0``
+M`"`!````````T;4````````+````!0```*`!````````$[8````````"````
+M%`$``/S_________:K<````````+`````@```/@]````````D+@````````+
+M`````@```.@]````````M[D````````"````;0```/S_________.[T`````
+M```"`````@```$`^````````5KT````````+`````@```$@^````````Z;X`
+M```````+`````@```$@^````````%[\````````+`````@```$`^````````
+M'K\````````+`````@```$@^````````;+\````````"`````@```#P^````
+M````B;\````````"`````@```#P^````````EK\````````+`````@```$`^
+M````````G;\````````+`````@```$@^````````O,`````````"````]```
+M`/S_________S\`````````"````!P$``/S_________!L$````````"````
+M!P$``/S_________,<$````````"````!P$``/S_________<<$````````"
+M````9P$``/S_________I,$````````"````%@$``/S_________/<(`````
+M```"````(0$``/S_________?<(````````"````8P```/S_________Z,4`
+M```````"````*0$``/S_________[L4````````"````,@```/S_________
+M_\4````````"````P````/S_________W<<````````"````=@$``/S_____
+M____Z\<````````"````-@$``/S_________Q\H````````"````,````/S_
+M________N<L````````"````LP```/S_________]\L````````+`````@``
+M`&`_````````_,L````````"````YP```/S_________K<P````````+````
+M`@```)13````````LLP````````"````YP```/S_________S\P````````+
+M`````@```)I3````````ULP````````+`````@```)M3````````W<P`````
+M```+`````@```)Q3````````+LT````````"````S@```/S_________6<T`
+M```````"````)P```/S_________;LT````````"````@@$``/S_________
+MPLT````````"````C`$``/S_________$\X````````"````&P```/S_____
+M____5<X````````"````1````/S_________:L\````````"````BP$``/S_
+M________Z,\````````"````BP$``/S_________#]`````````"````BP$`
+M`/S_________0M`````````"````BP$``/S_________A-`````````"````
+MBP$``/S_________[=`````````+`````@```(A3````````]-`````````+
+M`````@```(Y3````````/]$````````"````>0$``/S_________U-$`````
+M```"````-@$``/S_________W-$````````"````1````/S_________^]$`
+M```````"````-@$``/S_________*M(````````"````BP$``/S_________
+M3M(````````"````,`$``/S_________AM(````````"````Q0```/S_____
+M____I=(````````"````I@```/S_________QM(````````"````B0$``/S_
+M________T](````````"````;@$``/S_________\=(````````"````&P$`
+M`/S_________%-,````````"````BP$``/S_________@M,````````"````
+M@0```/S_________JM,````````"````<@```/S_________Q=,````````"
+M````10```/S_________U],````````"````@@$``/S_________YM,`````
+M```"````'@$``/S_________[M,````````"````A````/S_________W-0`
+M```````"````-@$``/S_________--D````````"````K````/S_________
+M2-D````````+`````0```"S9````````3]D````````+````C0$`````````
+M````LMD````````"````K````/S_________)]H````````"````,@```/S_
+M________-MH````````"````*0$``/S_________5MH````````"````D@``
+M`/S_________%-P````````"````2P```/S_________,]T````````"````
+MU@```/S_________X.$````````+`````@```*A3````````EN,````````"
+M````)@$``/S_________*.4````````"````)@$``/S_________6^4`````
+M```"````YP```/S_________=>4````````"````YP```/S_________FN4`
+M```````"````YP```/S_________M.4````````"````YP```/S_________
+M,^<````````+`````@```.!3````````7N<````````"````YP```/S_____
+M____F^D````````"````#P```/S_________S^D````````"````)@```/S_
+M________\.D````````"````7`$``/S_________,>H````````"````)@``
+M`/S_________8NH````````"````)@```/S_________E>H````````"````
+M7`$``/S_________YNH````````"````)@```/S_________;^L````````"
+M````)@```/S_________HNL````````"````7`$``/S_________^>L`````
+M```"````)@```/S_________C^P````````"````7`$``/S_________=>T`
+M```````"````)0```/S_________I>T````````"````%P```/S_________
+MP^\````````"````%P```/S_________L?`````````+`````@````!4````
+M````O?`````````"`````@```/Q3````````U?`````````+`````@````)4
+M````````!?$````````+`````@```#!4````````W?(````````"````B```
+M`/S_________^/(````````+`````@```"!5````````*/,````````"````
+M%P$``/S_________5_,````````+`````@```(!5````````D_0````````+
+M`````@```&!5````````FO0````````"````GP```/S_________P_0`````
+M```"````'````/S_________T?0````````"````.`$``/S_________#/4`
+M```````"````-@$``/S_________+/4````````"````-@$``/S_________
+MP?8````````+````+0``````````````[_8````````+````J@``````````
+M````^/8````````+````3`$``````````````?<````````+````T```````
+M````````"O<````````+````%@``````````````$_<````````+````60$`
+M````````````'/<````````+````UP``````````````)?<````````+````
+MX@``````````````-O<````````"````*@$``/S_________>_<````````"
+M````2P```/S_________I/<````````"````,0```/S_________L?<`````
+M```"````VP```/S_________S_<````````"````@P```/S_________+/H`
+M```````"````D````/S_________UOH````````"````@@$``/S_________
+M[OH````````"````_@```/S_________4?L````````"````R0```/S_____
+M____7OL````````"````VP```/S_________V_L````````"````#0```/S_
+M________2/P````````"````7@```/S_________4/P````````"````30``
+M`/S_________6_P````````"````C`$``/S_________*OT````````+````
+M`@```(!6````````7/T````````"````-@$``/S_________<OT````````+
+M`````@```.!8````````G_T````````+`````@```.18````````M?T`````
+M```"````-@$``/S_________\_T````````"````$@$``/S_________>_\`
+M```````"````6@```/S_________H/\````````"````00$``/S_________
+M)@`!```````"````E@```/S_________,0`!```````"````!@$``/S_____
+M____/@`!```````"````1`$``/S_________T@`!```````"````)0```/S_
+M________Z0$!```````"````L````/S_________"@(!```````"````-```
+M`/S_________%0(!```````"````70```/S_________]`(!```````"````
+M-@$``/S_________)@,!```````"````-@$``/S_________RP,!```````"
+M````3P```/S_________'@0!```````"````BP```/S_________A@0!````
+M```"````N````/S_________G00!```````"````2P```/S_________J00!
+M```````"````F@```/S_________-`4!```````"````%`$``/S_________
+MI08!```````"````0P```/S_________P08!```````"````+@```/S_____
+M____W08!```````"````1P```/S_________9P<!```````"````2@```/S_
+M________>`<!```````"````6@$``/S_________.@@!```````"````_@``
+M`/S_________5@@!```````"````EP$``/S_________J@@!```````"````
+M-@$``/S_________S0@!```````"````L````/S_________(0D!```````"
+M````-@$``/S_________+PD!```````"````6@```/S_________GPD!````
+M```"````E@```/S_________J@D!```````"````!@$``/S_________&@H!
+M```````"````2@```/S_________*PH!```````"````6@$``/S_________
+MV@H!```````"````@@$``/S_________/0L!```````"````@@$``/S_____
+M____]@P!```````"````-@$``/S_________$`T!```````"````-@$``/S_
+M________90T!```````"````_@```/S_________1@\!```````"````R0``
+M`/S_________.Q`!```````"````-@$``/S_________4Q`!```````"````
+M2P```/S_________>!`!```````"````@@$``/S_________.1$!```````"
+M````:````/S_________I!(!```````"````,````/S_________RA4!````
+M```"````#P```/S_________CQ<!```````"````PP```/S_________9Q\!
+M```````"````6@```/S_________E!\!```````"````(0$``/S_________
+MI1\!```````"````(0$``/S_________UA\!```````+`````@````!?````
+M````*2,!```````"````%0```/S_________NB0!```````"````%`$``/S_
+M________=B@!```````+`````@````I?````````*BD!```````"````YP``
+M`/S_________<BH!```````"````5@$``/S_________LRL!```````"````
+M5@$``/S_________22T!```````"`````@```*!@````````72T!```````+
+M`````@```*A@````````?2T!```````"`````@```"!?````````C2T!````
+M```+`````@```"A?````````&C`!```````+`````@```"!?````````(3`!
+M```````+`````@```*!@````````TC$!```````"````,````/S_________
+MM3(!```````"````6P```/S_________]S(!```````"````9P```/S_____
+M____(S,!```````"````6P```/S_________>C,!```````"````9P```/S_
+M________MC,!```````"````9P```/S_________JC0!```````"````U@``
+M`/S_________!S4!```````"````U@```/S_________5S4!```````"````
+M9P$``/S_________E#4!```````"````%@$``/S_________DS8!```````"
+M````(0$``/S_________WC8!```````"````5P```/S_________(SH!````
+M```"````*0$``/S_________*3H!```````"````,@```/S_________.#H!
+M```````"````P````/S_________4CP!```````"````EP$``/S_________
+M8#P!```````"````-@$``/S_________<#P!```````"````EP$``/S_____
+M____'#T!```````"````-@$``/S_________1CT!```````"````-@$``/S_
+M________43T!```````"````EP$``/S_________!$$!```````"````@P$`
+M`/S_________9$$!```````"````@P$``/S_________[T$!```````"````
+M@P$``/S_________)D(!```````"````(0$``/S_________"T,!```````"
+M````,0```/S_________04,!```````"````@P```/S_________ET,!````
+M```+`````@```!!B````````@D<!```````"````<@```/S_________BD<!
+M```````"````<@$``/S_________FD<!```````"````V@```/S_________
+MLT<!```````"````<@$``/S_________PT<!```````"````V@```/S_____
+M____ZT<!```````"````,0```/S_________\D<!```````"````<@$``/S_
+M________`D@!```````"````V@```/S_________ND@!```````"````@P$`
+M`/S_________7$D!```````"````GP```/S_________A4D!```````"````
+MGP```/S_________FTD!```````"````'P$``/S_________NTD!```````"
+M````GP```/S_________TTD!```````"````GP```/S_________6TH!````
+M```"````'P$``/S_________>TH!```````"````GP```/S__________DH!
+M```````"````GP```/S_________$$L!```````"````GP```/S_________
+M(DL!```````"````GP```/S_________-$L!```````"````GP```/S_____
+M____1DL!```````"````GP```/S_________3DL!```````"````<@$``/S_
+M________7DL!```````"````V@```/S_________DTL!```````"````GP``
+M`/S_________I$L!```````"````GP```/S_________NTL!```````"````
+MGP```/S_________S$L!```````"````GP```/S_________Y$L!```````"
+M````GP```/S_________]4L!```````"````GP```/S_________!TP!````
+M```"````GP```/S_________&4P!```````"````GP```/S_________*TP!
+M```````"````GP```/S_________/DP!```````"````<@$``/S_________
+M3DP!```````"````V@```/S_________A$P!```````"````<@$``/S_____
+M____E$P!```````"````V@```/S_________U$P!```````"````@P$``/S_
+M________0$X!```````"````GP```/S_________.4\!```````"````@P$`
+M`/S_________.E$!```````+`````@```&!B````````:E$!```````"````
+M-@$``/S_________@%$!```````+`````@```,!C````````C%$!```````+
+M`````@```,1C````````H%$!```````"````-@$``/S_________LU$!````
+M```+`````@```*!G````````X5$!```````"````-@$``/S_________$U(!
+M```````"````B@```/S_________*E(!```````+`````@```$1N````````
+M-U(!```````"````,````/S_________F5(!```````"````,````/S_____
+M____P5(!```````"````,````/S_________.E,!```````+`````@```(AO
+M````````FU4!```````+`````@````!F````````W%4!```````"````>```
+M`/S_________]U4!```````"````>````/S_________"E8!```````+````
+M`@````!F````````)U8!```````"````-@$``/S_________/58!```````+
+M`````@```*!J````````2%8!```````+`````@```*1J````````758!````
+M```"````-@$``/S_________;58!```````+`````@```+!J````````H58!
+M```````"````-@$``/S_________L58!```````+`````@```-!J````````
+MY58!```````"````-@$``/S_________^U8!```````+`````@````!K````
+M````3E<!```````"````>````/S_________;E<!```````"````>````/S_
+M________D%<!```````"````>````/S_________K5<!```````"````>```
+M`/S_________RE<!```````"````>````/S_________YU<!```````"````
+M>````/S_________^E<!```````+`````@````!K````````%U@!```````"
+M````-@$``/S_________,%@!```````+`````@```*!L````````:U@!````
+M```"````>````/S_________B%@!```````"````>````/S_________UE@!
+M```````"````>````/S_________\5@!```````"````>````/S_________
+M#ED!```````"````>````/S_________(5D!```````+`````@```*!L````
+M````/ED!```````"````-@$``/S_________W%H!```````"````(0$``/S_
+M________^5T!```````"````5@$``/S_________HU\!```````"````5@$`
+M`/S_________PE\!```````"````A````/S_________XU\!```````"````
+MA````/S_________`F`!```````+`````@```.!O````````#F`!```````"
+M`````@```-QO````````)F`!```````+`````@```.)O````````16`!````
+M```"````S@```/S_________96`!```````"````S@```/S_________BF`!
+M```````+`````0```*Q?`0``````E6`!```````+`````0```!Q1`0``````
+MH&`!```````+`````0```"E3`0``````JV`!```````+`````0```/M1`0``
+M````MF`!```````+`````0```&13`0``````P6`!```````+`````0```.]9
+M`0``````S&`!```````+`````0```/1?`0``````UV`!```````+`````0``
+M`/I?`0``````#F$!```````+`````@```"!P````````/F$!```````"````
+M-@$``/S_________5&$!```````+`````@```*!Q````````8&$!```````+
+M`````@```*1Q````````=&$!```````"````-@$``/S_________AV$!````
+M```+`````@```.!S````````M6$!```````"````-@$``/S_________IF(!
+M```````"````,````/S_________+6,!```````"````,````/S_________
+MCV,!```````"````,````/S_________Z&,!```````"````,````/S_____
+M____0F0!```````"````,````/S_________4V0!```````"````,````/S_
+M________P&0!```````+`````@```#A\````````FV8!```````+`````@``
+M`.1V````````NV8!```````+`````@```/!V````````Y&8!```````+````
+M`@```!!W````````#6<!```````+`````@```$!W````````1F<!```````"
+M````>````/S_________9F<!```````"````>````/S_________AV<!````
+M```"````>````/S_________MF<!```````"````>````/S_________VF<!
+M```````"````>````/S__________F<!```````"````>````/S_________
+M(F@!```````"````>````/S_________1F@!```````"````>````/S_____
+M____:F@!```````"````>````/S_________DF@!```````"````>````/S_
+M________Q6@!```````"````>````/S_________XF@!```````"````>```
+M`/S_________2&D!```````"````>````/S_________96D!```````"````
+M>````/S_________@FD!```````"````>````/S_________GVD!```````"
+M````>````/S_________SVD!```````"````>````/S_________[&D!````
+M```"````>````/S_________"6H!```````"````>````/S_________)FH!
+M```````"````>````/S_________0VH!```````"````>````/S_________
+M56H!```````+`````@````![````````GVH!```````"````>````/S_____
+M____P&H!```````"````>````/S_________"6L!```````"````>````/S_
+M________)&L!```````"````>````/S_________,VL!```````+`````@``
+M`.!V````````46L!```````"````-@$``/S_________:&L!```````+````
+M`@```/!V````````AFL!```````"````-@$``/S_________G6L!```````+
+M`````@```!!W````````NVL!```````"````-@$``/S_________TFL!````
+M```+`````@```$!W````````\&L!```````"````-@$``/S_________"FP!
+M```````+`````@````![````````*VP!```````"````-@$``/S_________
+M@VX!```````"````YP```/S_________EFX!```````"````YP```/S_____
+M____#&\!```````"````YP```/S_________'V\!```````"````YP```/S_
+M________<6\!```````"````YP```/S_________GV\!```````"````YP``
+M`/S_________LF\!```````"````YP```/S_________`'`!```````"````
+MYP```/S_________>78!```````"````A````/S_________FG8!```````"
+M````A````/S_________M7D!```````"````S@```/S_________U7D!````
+M```"````S@```/S_________!'H!```````+`````0```&-V`0``````#WH!
+M```````+`````0```/!@`0``````&GH!```````+`````0```*]D`0``````
+M)7H!```````+`````0```,]A`0``````,'H!```````+`````0```.5D`0``
+M````.WH!```````+`````0```%5L`0``````1GH!```````+`````0```"-Y
+M`0``````47H!```````+````(@``````````````BGH!```````+`````@``
+M`(!\````````NGH!```````"````-@$``/S_________T'H!```````+````
+M`@````!^````````W'H!```````+`````@````1^````````\'H!```````"
+M````-@$``/S_________!GL!```````+`````@```&""````````-'L!````
+M```"````-@$``/S_________)7P!```````"````,````/S_________K'P!
+M```````"````,````/S_________#GT!```````"````,````/S_________
+M9WT!```````"````,````/S_________P7T!```````"````,````/S_____
+M____TGT!```````"````,````/S_________LWX!```````+`````@```&2%
+M````````T7X!```````+`````@```'"%````````^7X!```````+`````@``
+M`)"%````````(7\!```````+`````@```,"%````````7'\!```````"````
+M>````/S_________>7\!```````"````>````/S_________B7\!```````+
+M`````@```&"(````````LG\!```````+`````@```&"%````````SW\!````
+M```"````-@$``/S_________YG\!```````+`````@```'"%````````!(`!
+M```````"````-@$``/S_________&X`!```````+`````@```)"%````````
+M.8`!```````"````-@$``/S_________4(`!```````+`````@```,"%````
+M````;H`!```````"````-@$``/S_________B(`!```````+`````@```&"(
+M````````IH`!```````"````-@$``/S_________X8`!```````+`````@``
+M`*B(````````<8D!```````"````A````/S_________DHD!```````"````
+MA````/S_________LXD!```````"````A````/S_________U(P!```````"
+M````S@```/S_________](P!```````"````S@```/S_________"HT!````
+M```"````S@```/S_________+XT!```````+`````0```%N)`0``````.HT!
+M```````+`````0```&QZ`0``````18T!```````+`````0```-"``0``````
+M4(T!```````+`````0```$Y[`0``````6XT!```````+`````0```"Y^`0``
+M````9HT!```````+`````0```-&'`0``````<8T!```````+`````0```$*,
+M`0``````?(T!```````+````(@``````````````LHT!```````+`````@``
+M``")````````XHT!```````"````-@$``/S_________^(T!```````+````
+M`@```."+````````!(X!```````+`````@```.2+````````&(X!```````"
+M````-@$``/S_________*XX!```````+`````@```."/````````68X!````
+M```"````-@$``/S_________2H\!```````"````,````/S_________T8\!
+M```````"````,````/S_________NI`!```````"````,````/S_________
+MRY`!```````"````,````/S_________89(!```````+`````@```.22````
+M````?Y(!```````+`````@```/"2````````IY(!```````+`````@```!"3
+M````````SY(!```````+`````@```$"3````````%9,!```````"````>```
+M`/S_________,I,!```````"````>````/S_________3Y,!```````"````
+M>````/S_________?9,!```````"````,````/S_________MY,!```````"
+M````>````/S_________U),!```````"````>````/S_________Y),!````
+M```+`````@```,"6````````$)0!```````+`````@```."2````````+90!
+M```````"````-@$``/S_________1)0!```````+`````@```/"2````````
+M8I0!```````"````-@$``/S_________>90!```````+`````@```!"3````
+M````EY0!```````"````-@$``/S_________KI0!```````+`````@```$"3
+M````````S)0!```````"````-@$``/S_________YI0!```````+`````@``
+M`,"6````````!Y4!```````"````-@$``/S_________0I4!```````+````
+M`@````B7````````UIT!```````"````A````/S_________]YT!```````"
+M````A````/S_________&)X!```````"````A````/S_________(*$!````
+M```"````S@```/S_________0*$!```````"````S@```/S_________5J$!
+M```````"````S@```/S_________>Z$!```````+`````0```,"=`0``````
+MAJ$!```````+`````0```)2-`0``````D:$!```````+`````0```#&5`0``
+M````G*$!```````+`````0```'..`0``````IZ$!```````+`````0```">1
+M`0``````LJ$!```````+`````0```#6<`0``````O:$!```````+`````0``
+M`(Z@`0``````R*$!```````+````(@``````````````"``````````!````
+M`0```'$'````````$``````````!`````0```(@(````````&``````````!
+M`````0```(@(````````(``````````!`````0```(@(````````*```````
+M```!`````0```'H'````````,``````````!`````0```(@(````````.```
+M```````!`````0```(8'````````0``````````!`````0```),'````````
+M2``````````!`````0```)<(````````4``````````!`````0```)H'````
+M````6``````````!`````0```*$'````````8``````````!`````0```-('
+M````````:``````````!`````0```+0'````````<``````````!`````0``
+M`,8'````````>``````````!`````0```,P'````````@``````````!````
+M`0```-H'````````B``````````!`````0```)<(````````D``````````!
+M`````0```)<(````````F``````````!`````0```!P(````````H```````
+M```!`````0```",(````````J``````````!`````0```(@(````````L```
+M```````!`````0```"H(````````N``````````!`````0```(@(````````
+MP``````````!`````0```#$(````````R``````````!`````0```#@(````
+M````T``````````!`````0```$((````````V``````````!`````0```)<(
+M````````X``````````!`````0```)<(````````Z``````````!`````0``
+M`(@(````````\``````````!`````0```)<(````````^``````````!````
+M`0```'L(``````````$````````!`````0```)<(````````"`$````````!
+M`````0```)<(````````$`$````````!`````0```)<(````````&`$`````
+M```!`````0```(X(````````&`(````````!````#0$`````````````(`(`
+M```````!````90``````````````*`(````````!````P0``````````````
+M,`(````````!````M```````````````.`(````````!````>P$`````````
+M````0`(````````!````U```````````````2`(````````!````50``````
+M````````4`(````````!````X```````````````6`(````````!````H0``
+M````````````8`(````````!````>`$`````````````:`(````````!````
+M2P$`````````````<`(````````!````O@``````````````>`(````````!
+M````/P``````````````@`(````````!````A0``````````````B`(`````
+M```!````6```````````````D`(````````!````(0``````````````F`(`
+M```````!````:0$`````````````H`(````````!````D@$`````````````
+MJ`(````````!````+P``````````````L`(````````!````C0``````````
+M````N`(````````!````2`$`````````````P`(````````!````*@``````
+M````````R`(````````!````/0``````````````T`(````````!````:0``
+M````````````V`(````````!````?P$`````````````X`(````````!````
+M>@$`````````````Z`(````````!````&@$`````````````\`(````````!
+M````M0``````````````^`(````````!````8`$```````````````,`````
+M```!````8P$`````````````"`,````````!````"@$`````````````$`,`
+M```````!````W0``````````````&`,````````!````/0$`````````````
+M(`,````````!````D0``````````````*`,````````!````<P$`````````
+M````,`,````````!````OP``````````````.`,````````!````MP``````
+M````````0`,````````!````A@``````````````2`,````````!````KP``
+M````````````4`,````````!````5@``````````````6`,````````!````
+MR```````````````8`,````````!````.0$`````````````:`,````````!
+M````#P$`````````````<`,````````!````I0``````````````>`,`````
+M```!````-`$`````````````@`,````````!````Z@``````````````B`,`
+M```````!````70$`````````````D`,````````!````30$`````````````
+MF`,````````!````+`$`````````````H`,````````!````,P``````````
+M````J`,````````!````M@``````````````L`,````````!````6P$`````
+M````````N`,````````!````'`$`````````````P`,````````!````)0$`
+M````````````R`,````````!````/@``````````````T`,````````!````
+M=0``````````````V`,````````!````10$`````````````X`,````````!
+M````Y0``````````````Z`,````````!````4```````````````\`,`````
+M```!````-P``````````````^`,````````!````C`````````````````0`
+M```````!````"@``````````````"`0````````!````]@``````````````
+M$`0````````!````/@$`````````````&`0````````!````-0$`````````
+M````(`0````````!````]P``````````````*`0````````!````@`$`````
+M````````,`0````````!````:@``````````````.`0````````!````#```
+M````````````0`0````````!````90$`````````````2`0````````!````
+MK0``````````````4`0````````!````$`$`````````````6`0````````!
+M````&0$`````````````8`0````````!````;P$`````````````:`0`````
+M```!````,P$`````````````<`0````````!````IP``````````````>`0`
+M```````!````1@``````````````@`0````````!````+@$`````````````
+MB`0````````!````%```````````````D`0````````!````O```````````
+M````F`0````````!````<```````````````H`0````````!````^0``````
+M````````J`0````````!````^P``````````````L`0````````!````4@$`
+M````````````N`0````````!````9`$`````````````P`0````````!````
+M?@$`````````````R`0````````!````$```````````````T`0````````!
+M````3P$`````````````V`0````````!````(P$`````````````X`0`````
+M```!````#`$`````````````Z`0````````!````H@``````````````\`0`
+M```````!````4`$`````````````^`0````````!`````0```"E4````````
+M``4````````!````D`$`````````````"`4````````!````*P$`````````
+M````&`4````````!````6P$`````````````(`4````````!````'`$`````
+M````````*`4````````!````)0$`````````````,`4````````!````/@``
+M````````````.`4````````!````=0``````````````0`4````````!````
+M`0```$94````````&!P````````!````1@$`````````````(!P````````!
+M````9@$`````````````*!P````````!````6`$`````````````,!P`````
+M```!````?0$`````````````.!P````````!````9```````````````0!P`
+M```````!````=@``````````````2!P````````!````E```````````````
+M4!P````````!````;0``````````````6!P````````!````#@``````````
+M````8!P````````!````-@``````````````:!P````````!````8@``````
+M````````<!P````````!````8P``````````````>!P````````!````.@``
+M````````````@!P````````!````;`$`````````````B!P````````!````
+M#@$`````````````D!P````````!````B`$`````````````F!P````````!
+M````@@``````````````H!P````````!````=@$`````````````J!P`````
+M```!`````P$`````````````L!P````````!````JP``````````````N!P`
+M```````!````*`$`````````````P!P````````!````(P``````````````
+MR!P````````!````"`$`````````````T!P````````!````&@``````````
+M````V!P````````!````:`$`````````````X!P````````!````Z```````
+M````````Z!P````````!````(```````````````\!P````````!````*P``
+M````````````^!P````````!````K@```````````````!T````````!````
+M?`$`````````````"!T````````!````:@$`````````````$!T````````!
+M````=P$`````````````&!T````````!````.@$`````````````(!T`````
+M```!````\P``````````````*!T````````!``````$`````````````,!T`
+M```````!````[P``````````````.!T````````!````$P$`````````````
+M0!T````````!````?@``````````````2!T````````!````F0``````````
+M````4!T````````!````=```````````````6!T````````!````2@$`````
+M````````8!T````````!````H```````````````:!T````````!````00``
+M````````````<!T````````!````.P$`````````````>!T````````!````
+M-P$`````````````@!T````````!````>@``````````````B!T````````!
+M````.P``````````````D!T````````!````3@$`````````````F!T`````
+M```!````W@``````````````H!T````````!````+P$`````````````J!T`
+M```````!````Y```````````````L!T````````!````Q```````````````
+MN!T````````!````XP``````````````P!T````````!````0@$`````````
+M````R!T````````!````SP``````````````T!T````````!````.```````
+M````````V!T````````!````80``````````````X!T````````!````V0``
+M````````````Z!T````````!````1P$`````````````\!T````````!````
+M50$`````````````^!T````````!````)P$``````````````!X````````!
+M````'0``````````````"!X````````!````7```````````````$!X`````
+M```!````,0$`````````````&!X````````!````D0$`````````````(!X`
+M```````!````20``````````````*!X````````!````FP``````````````
+M,!X````````!````80$`````````````.!X````````!````U0``````````
+M````0!X````````!````!0$`````````````2!X````````!````'P``````
+M````````4!X````````!````_```````````````6!X````````!````.0``
+M````````````8!X````````!`````0$`````````````:!X````````!````
+M[```````````````<!X````````!````C@``````````````>!X````````!
+M````*```````````````@!X````````!````40``````````````B!X`````
+M```!````DP``````````````D!X````````!````W```````````````F!X`
+M```````!````S```````````````H!X````````!````5P$`````````````
+MJ!X````````!````RP``````````````L!X````````!````4@$`````````
+M````N!X````````!````C@$`````````````P!X````````!````"0``````
+M````````R!X````````!````HP``````````````T!X````````!````<0``
+M````````````V!X````````!````:P``````````````X!X````````!````
+M\```````````````Z!X````````!````]```````````````\!X````````!
+M````!P$`````````````^!X````````!`````0```/>&`````````!\`````
+M```!````+0$`````````````"!\````````!````20$`````````````&!\`
+M```````!````Q```````````````(!\````````!````XP``````````````
+M*!\````````!````0@$`````````````,!\````````!````SP``````````
+M````.!\````````!````.```````````````0!\````````!`````0```"^'
+M````````^#T````````!`````0```&ZW`````````#X````````!`````0``
+M`&ZW````````"#X````````!`````0```)6W````````$#X````````!````
+M`0```)6W````````&#X````````!`````0```+RW````````(#X````````!
+M`````0```+RW````````*#X````````!`````0```..W````````,#X`````
+M```!`````0```..W````````F#\````````!````6P``````````````H#\`
+M```````!````@0``````````````J#\````````!````=`$`````````````
+ML#\````````!````;```````````````N#\````````!````10``````````
+M````P#\````````!````V```````````````R#\````````!````N0``````
+M````````T#\````````!````'0$`````````````V#\````````!````K```
+M````````````X#\````````!````5```````````````Z#\````````!````
+MG@``````````````\#\````````!````5P``````````````^#\````````!
+M````!`$``````````````$`````````!````7P$`````````````"$``````
+M```!````BP``````````````$$`````````!````_P``````````````&$``
+M```````!````Y@``````````````($`````````!````EP$`````````````
+M*$`````````!````C0$`````````````,$`````````!````N@``````````
+M````.$`````````!````?0``````````````0$`````````!````)`$`````
+M````````2$`````````!````*0``````````````4$`````````!````7@$`
+M````````````6$`````````!````4P$`````````````8$`````````!````
+MAP``````````````:$`````````!````8@$`````````````<$`````````!
+M````7P``````````````>$`````````!````0`$`````````````@$``````
+M```!`````@$`````````````B$`````````!````_0``````````````D$``
+M```````!````$P``````````````F$`````````!````;0$`````````````
+MH$`````````!````>P``````````````J$`````````!````X0``````````
+M````L$`````````!````<@$`````````````N$`````````!````V@``````
+M````````P$`````````!````EP``````````````R$`````````!````,@$`
+M````````````T$`````````!````^@``````````````V$`````````!````
+M$0``````````````X$`````````!````G0``````````````Z$`````````!
+M````"P``````````````\$`````````!````F```````````````^$``````
+M```!````/P$``````````````$$````````!````L0``````````````"$$`
+M```````!````Z0``````````````$$$````````!````0```````````````
+M&$$````````!````(`$`````````````($$````````!````I```````````
+M````*$$````````!````L@``````````````,$$````````!````&`$`````
+M````````.$$````````!````3@``````````````0$$````````!````0P$`
+M````````````2$$````````!````40$`````````````4$$````````!````
+M%0$`````````````6$$````````!````DP$`````````````8$$````````!
+M````2@``````````````:$$````````!````QP``````````````<$$`````
+M```!````J0``````````````>$$````````!````@P$`````````````@$$`
+M```````!````30``````````````B$$````````!````CP``````````````
+MD$$````````!````AP$`````````````F$$````````!````J```````````
+M````H$$````````!````S0``````````````J$$````````!````0P``````
+M````````L$$````````!````3```````````````N$$````````!````+@``
+M````````````P$$````````!````0@``````````````R$$````````!````
+M/```````````````T$$````````!````ZP``````````````V$$````````!
+M````1P``````````````X$$````````!````@```````````````Z$$`````
+M```!````-0``````````````\$$````````!````-```````````````^$$`
+M```````!````&0```````````````$(````````!````<P``````````````
+M"$(````````!````^```````````````$$(````````!````;@``````````
+M````&$(````````!````)@$`````````````($(````````!````@@$`````
+M````````*$(````````!````T0``````````````,$(````````!````4@$`
+M````````````.$(````````!````D@``````````````0$(````````!````
+MCP$`````````````2$(````````!````$0$`````````````4$(````````!
+M````T@``````````````6$(````````!````)```````````````8$(`````
+M```!````=0$`````````````:$(````````!````;P``````````````<$(`
+M```````!````U@``````````````>$(````````!````Q@``````````````
+M@$(````````!````[0``````````````B$(````````!````BP$`````````
+M````F$(````````!````&`$`````````````H$(````````!````3@``````
+M````````J$(````````!````0P$`````````````L$(````````!````40$`
+M````````````N$(````````!````%0$`````````````P$(````````!````
+ME`$`````````````T$(````````!`````0```,7+````````J%,````````!
+M`````0```"/B````````L%,````````!`````0```.3A````````N%,`````
+M```!`````0```.SA````````P%,````````!`````0```%CB````````R%,`
+M```````!`````0```/KA````````T%,````````!`````0```%#B````````
+M,%0````````!`````0```"+S````````.%0````````!`````0````GQ````
+M````0%0````````!`````0```#WQ````````2%0````````!`````0```%WQ
+M````````4%0````````!`````0```"+S````````6%0````````!`````0``
+M`+/Q````````8%0````````!`````0```"+S````````:%0````````!````
+M`0```"+S````````<%0````````!`````0```"+S````````>%0````````!
+M`````0```"+S````````@%0````````!`````0```"+S````````B%0`````
+M```!`````0```-OQ````````D%0````````!`````0```"+S````````F%0`
+M```````!`````0```"+S````````H%0````````!`````0```"+S````````
+MJ%0````````!`````0```"+S````````L%0````````!`````0```.;Q````
+M````N%0````````!`````0````7R````````P%0````````!`````0```"+S
+M````````R%0````````!`````0```$#R````````T%0````````!`````0``
+M`&+R````````V%0````````!`````0```"+S````````X%0````````!````
+M`0```(7Q````````Z%0````````!`````0```"+S````````\%0````````!
+M`````0```"+S````````^%0````````!`````0```"+S`````````%4`````
+M```!`````0```)CR````````"%4````````!`````0```*/R````````$%4`
+M```````!`````0```"+S````````&%4````````!`````0```+/R````````
+M(%4````````!`````0```!OS````````*%4````````!`````0```!OS````
+M````,%4````````!`````0```/SR````````.%4````````!`````0````+S
+M````````0%4````````!`````0````CS````````2%4````````!`````0``
+M``[S````````4%4````````!`````0```!3S````````@%4````````!````
+M`0```,+T````````B%4````````!`````0```,+T````````D%4````````!
+M`````0```%OS````````F%4````````!`````0```'WS````````H%4`````
+M```!`````0```,+T````````J%4````````!`````0```+CS````````L%4`
+M```````!`````0```,+T````````N%4````````!`````0```,+T````````
+MP%4````````!`````0```,+T````````R%4````````!`````0```,+T````
+M````T%4````````!`````0```,+T````````V%4````````!`````0```.+S
+M````````X%4````````!`````0```,+T````````Z%4````````!`````0``
+M`,+T````````\%4````````!`````0```,+T````````^%4````````!````
+M`0```,+T`````````%8````````!`````0```/?S````````"%8````````!
+M`````0```,+T````````$%8````````!`````0```,+T````````&%8`````
+M```!`````0````KT````````(%8````````!`````0```*#T````````*%8`
+M```````!`````0```,+T````````,%8````````!`````0```,+T````````
+M.%8````````!`````0```,+T````````0%8````````!`````0```,+T````
+M````2%8````````!`````0```,+T````````4%8````````!`````0```"ST
+M````````6%8````````!`````0```"ST````````8%8````````!`````0``
+M`,+T````````:%8````````!`````0```(3T````````$&(````````!````
+M`0````U(`0``````&&(````````!`````0```)M#`0``````(&(````````!
+M`````0```')$`0``````*&(````````!`````0````9&`0``````,&(`````
+M```!`````0```&1&`0``````.&(````````!`````0```-M&`0``````0&(`
+M```````!`````0```'9'`0``````B&\````````!`````0```#Y3`0``````
+MD&\````````!`````0```$)3`0``````F&\````````!`````0```$=3`0``
+M````H&\````````!`````0```$Q3`0``````J&\````````!`````0```%Y3
+M`0``````L&\````````!`````0```%Y3`0``````N&\````````!`````0``
+M`%%3`0``````P&\````````!`````0```%93`0``````.'P````````!````
+M`0```-]D`0``````0'P````````!`````0```,1D`0``````2'P````````!
+M`````0```,AD`0``````4'P````````!`````0```,UD`0``````6'P`````
+M```!`````0```-]D`0``````8'P````````!`````0```-]D`0``````:'P`
+M```````!`````0```-)D`0``````<'P````````!`````0```-=D`0``````
+MJ(@````````!`````0```/V``0``````L(@````````!`````0```.6``0``
+M````N(@````````!`````0```.F``0``````P(@````````!`````0```.Z`
+M`0``````R(@````````!`````0```/V``0``````T(@````````!`````0``
+M`/V``0``````V(@````````!`````0```/.``0``````X(@````````!````
+M`0```/B``0``````")<````````!`````0```&&5`0``````$)<````````!
+M`````0```$:5`0``````&)<````````!`````0```$J5`0``````()<`````
+M```!`````0```$^5`0``````*)<````````!`````0```&&5`0``````,)<`
+M```````!`````0```&&5`0``````.)<````````!`````0```%25`0``````
+M0)<````````!`````0```%F5`0``````(``````````!`````P``````````
+M````*``````````!`````P````<`````````,``````````!`````P````X`
+M````````.``````````!`````P```!4`````````0``````````!`````P``
+M`!P`````````2``````````!`````P```",`````````4``````````!````
+M`P```"H`````````(``````````!`````0``````````````.``````````!
+M`````0```!8!````````6``````````!`````0```$,!````````>```````
+M```!`````0```%`"````````D``````````!`````0```%P"````````R```
+M```````!`````0```*T"````````X``````````!`````0```,X"````````
+M^``````````!`````0```*,$````````$`$````````!`````0```/<$````
+M````,`$````````!`````0```#L&````````4`$````````!`````0```&(&
+M````````<`$````````!`````0```*8&````````J`$````````!`````0``
+M`%@'````````P`$````````!`````0```)T(````````V`$````````!````
+M`0````P)````````^`$````````!`````0```'`)````````&`(````````!
+M`````0````0*````````,`(````````!`````0```#@+````````2`(`````
+M```!`````0```*`+````````<`(````````!`````0```!(,````````R`(`
+M```````!`````0```&@-````````Z`(````````!`````0```-0-````````
+M``,````````!`````0```!@.````````&`,````````!`````0```#T.````
+M````2`,````````!`````0```-L0````````<`,````````!`````0```+\1
+M````````D`,````````!`````0```"(4````````T`,````````!`````0``
+M`*H8````````^`,````````!`````0```.X8````````$`0````````!````
+M`0```%<9````````4`0````````!`````0```'<?````````<`0````````!
+M`````0```%,@````````L`0````````!`````0```+TA````````\`0`````
+M```!`````0```*XC````````,`4````````!`````0```-4F````````<`4`
+M```````!`````0```"HI````````L`4````````!`````0```#DM````````
+MZ`4````````!`````0```&@[````````"`8````````!`````0```.0[````
+M````0`8````````!`````0`````\````````6`8````````!`````0```"@\
+M````````<`8````````!`````0```#4\````````B`8````````!`````0``
+M`%<\````````J`8````````!`````0```,(\````````R`8````````!````
+M`0```#<]````````\`8````````!`````0```*X]````````&`<````````!
+M`````0```$$^````````.`<````````!`````0```(0^````````4`<`````
+M```!`````0```+H^````````>`<````````!`````0```"T_````````F`<`
+M```````!`````0```'\_````````L`<````````!`````0```+<_````````
+M\`<````````!`````0```')!````````"`@````````!`````0```)]!````
+M````(`@````````!`````0```,]!````````4`@````````!`````0```/A(
+M````````<`@````````!`````0```+%)````````D`@````````!`````0``
+M`-Q)````````N`@````````!`````0```-!*````````V`@````````!````
+M`0```/5*````````&`D````````!`````0```'Q+````````.`D````````!
+M`````0```!!,````````6`D````````!`````0```(=,````````B`D`````
+M```!`````0````M-````````N`D````````!`````0```(]-````````\`D`
+M```````!`````0```.Q-````````,`H````````!`````0```!M4````````
+M4`H````````!`````0```"E4````````:`H````````!`````0```$94````
+M````@`H````````!`````0```$Q4````````L`H````````!`````0```+A4
+M````````R`H````````!`````0```/E4````````Z`H````````!`````0``
+M`%U5``````````L````````!`````0```)15````````,`L````````!````
+M`0```(!6````````2`L````````!`````0```)-6````````8`L````````!
+M`````0```.Y6````````>`L````````!`````0```/56````````J`L`````
+M```!`````0```'Q7````````P`L````````!`````0```()7````````V`L`
+M```````!`````0```+!7````````\`L````````!`````0```$E8````````
+M"`P````````!`````0```-!8````````2`P````````!`````0```'Q:````
+M````:`P````````!`````0```)Q:````````B`P````````!`````0```+M:
+M````````J`P````````!`````0```-A:````````P`P````````!`````0``
+M`-Y:````````X`P````````!`````0```$%;````````^`P````````!````
+M`0```');````````$`T````````!`````0```'A;````````.`T````````!
+M`````0```-);````````4`T````````!`````0```/];````````:`T`````
+M```!`````0```"-<````````@`T````````!`````0```$]<````````F`T`
+M```````!`````0```&Y<````````N`T````````!`````0```-5<````````
+MT`T````````!`````0````A=````````Z`T````````!`````0```"!=````
+M``````X````````!`````0```$Y=````````&`X````````!`````0```%1=
+M````````,`X````````!`````0```%U=````````6`X````````!`````0``
+M``E>````````<`X````````!`````0```#%>````````B`X````````!````
+M`0```#Q>````````H`X````````!`````0```%)>````````N`X````````!
+M`````0```(=>````````T`X````````!`````0```*A>````````Z`X`````
+M```!`````0```.E>````````$`\````````!`````0```%M?````````,`\`
+M```````!`````0```'E?````````6`\````````!`````0```!!@````````
+M>`\````````!`````0```"Y@````````D`\````````!`````0```#Q@````
+M````J`\````````!`````0```(9@````````T`\````````!`````0```"!A
+M````````\`\````````!`````0```$%A````````"!`````````!`````0``
+M`$=A````````(!`````````!`````0```$AA````````.!`````````!````
+M`0```$YA````````4!`````````!`````0```$]A````````:!`````````!
+M`````0```%!A````````B!`````````!`````0```'1A````````J!``````
+M```!`````0```*]A````````X!`````````!`````0```,!A````````^!``
+M```````!`````0```.]A````````(!$````````!`````0```()B````````
+M.!$````````!`````0```+%B````````8!$````````!`````0```"!C````
+M````D!$````````!`````0```#1C````````R!$````````!`````0```&AC
+M````````X!$````````!`````0```'!C````````^!$````````!`````0``
+M`'AC````````$!(````````!`````0```(1C````````.!(````````!````
+M`0```,]C````````4!(````````!`````0```.-C````````:!(````````!
+M`````0```/=C````````@!(````````!`````0````QD````````F!(`````
+M```!`````0```%YD````````L!(````````!`````0```+!D````````R!(`
+M```````!`````0```+MD````````X!(````````!`````0```-=D````````
+M^!(````````!`````0```!)E````````*!,````````!`````0```#!F````
+M````:!,````````!`````0```"9L````````@!,````````!`````0```)IL
+M````````H!,````````!`````0```*YL````````P!,````````!`````0``
+M`,9L````````X!,````````!`````0```"QM`````````!0````````!````
+M`0````9N````````0!0````````!`````0```"EP````````:!0````````!
+M`````0```)UP````````@!0````````!`````0```$IQ````````H!0`````
+M```!`````0```"]R````````N!0````````!`````0```$=R````````^!0`
+M```````!`````0```"]U````````*!4````````!`````0```/EW````````
+M2!4````````!`````0```&UX````````8!4````````!`````0```(EX````
+M````B!4````````!`````0````]Y````````H!4````````!`````0```!5Y
+M````````T!4````````!`````0```!QY````````\!4````````!`````0``
+M`$EY````````$!8````````!`````0```'QY````````.!8````````!````
+M`0```%EZ````````4!8````````!`````0```+=Z````````:!8````````!
+M`````0```!=]````````@!8````````!`````0```$!]````````F!8`````
+M```!`````0```(%]````````P!8````````!`````0```!-^````````V!8`
+M```````!`````0```'I^````````\!8````````!`````0```*Q^````````
+M&!<````````!`````0```$1_````````,!<````````!`````0```/-_````
+M````2!<````````!`````0```/E_````````8!<````````!`````0````&`
+M````````>!<````````!`````0```$N`````````D!<````````!`````0``
+M`-J`````````P!<````````!`````0```-R`````````\!<````````!````
+M`0```.B`````````$!@````````!`````0```$.!````````4!@````````!
+M`````0```.:%````````<!@````````!`````0````"&````````D!@`````
+M```!`````0```/>&````````J!@````````!`````0```"^'````````P!@`
+M```````!`````0```#6'````````"!D````````!`````0```"R(````````
+M(!D````````!`````0```&V(````````0!D````````!`````0```-V(````
+M````6!D````````!`````0```!2)````````B!D````````!`````0````2*
+M````````H!D````````!`````0```!>*````````N!D````````!`````0``
+M`,.*````````T!D````````!`````0```,J*`````````!H````````!````
+M`0```&B+````````&!H````````!`````0```&Z+````````,!H````````!
+M`````0```)R+````````2!H````````!`````0```#6,````````8!H`````
+M```!`````0```+R,````````J!H````````!`````0```'2.````````R!H`
+M```````!`````0```)2.````````Z!H````````!`````0```+..````````
+M"!L````````!`````0```-".````````(!L````````!`````0```-:.````
+M````0!L````````!`````0```$./````````6!L````````!`````0```'2/
+M````````<!L````````!`````0```*6/````````F!L````````!`````0``
+M`!V0````````L!L````````!`````0```#^0````````R!L````````!````
+M`0```&.0````````X!L````````!`````0```(^0````````^!L````````!
+M`````0```*Z0````````&!P````````!`````0```/&0````````,!P`````
+M```!`````0```!&1````````4!P````````!`````0```**1````````:!P`
+M```````!`````0```,J1````````@!P````````!`````0```-61````````
+MF!P````````!`````0```.N1````````L!P````````!`````0```""2````
+M````R!P````````!`````0```%62````````X!P````````!`````0```):2
+M````````"!T````````!`````0````23````````*!T````````!`````0``
+M`"*3````````4!T````````!`````0```+F3````````<!T````````!````
+M`0```->3````````B!T````````!`````0```.63````````H!T````````!
+M`````0```"^4````````R!T````````!`````0```,F4````````Z!T`````
+M```!`````0```.J4`````````!X````````!`````0```/"4````````&!X`
+M```````!`````0```/&4````````,!X````````!`````0```/>4````````
+M2!X````````!`````0```/B4````````8!X````````!`````0```/F4````
+M````>!X````````!`````0````F5````````D!X````````!`````0```!>5
+M````````J!X````````!`````0```"65````````P!X````````!`````0``
+M`"R5````````X!X````````!`````0```%.5`````````!\````````!````
+M`0```'R5````````(!\````````!`````0```*N5````````6!\````````!
+M`````0```,25````````@!\````````!`````0```%>6````````F!\`````
+M```!`````0```(:6````````L!\````````!`````0```+66````````V!\`
+M```````!`````0```"27````````""`````````!`````0```#B7````````
+M0"`````````!`````0```("7````````6"`````````!`````0```(B7````
+M````<"`````````!`````0```)"7````````B"`````````!`````0```)R7
+M````````J"`````````!`````0```,R7````````P"`````````!`````0``
+M`."7````````V"`````````!`````0```/27````````\"`````````!````
+M`0````F8````````""$````````!`````0```%N8````````("$````````!
+M`````0```*V8````````."$````````!`````0```+B8````````4"$`````
+M```!`````0```,.8````````:"$````````!`````0```/Z8````````F"$`
+M```````!`````0```-R9````````V"$````````!`````0```'RB````````
+M^"$````````!`````0```(^B````````&"(````````!`````0```-2B````
+M````."(````````!`````0```'VD````````8"(````````!`````0```."E
+M````````B"(````````!`````0```%FF````````N"(````````!`````0``
+M`%JG````````T"(````````!`````0```':G````````^"(````````!````
+M`0```!NH````````$",````````!`````0```&JH````````,",````````!
+M`````0```,^H````````6",````````!`````0```(:I````````<",`````
+M```!`````0```,NI````````L",````````!`````0```!&M````````R",`
+M```````!`````0```""N`````````"0````````!`````0```(RP````````
+M&"0````````!`````0```*ZP````````6"0````````!`````0```"ZR````
+M````F"0````````!`````0```("U````````V"0````````!`````0```-NY
+M`````````"4````````!`````0```$V[````````&"4````````!`````0``
+M`*V[````````."4````````!`````0```%*\````````4"4````````!````
+M`0```.^\````````<"4````````!`````0```#*]````````B"4````````!
+M`````0```'2]````````H"4````````!`````0```.N]````````N"4`````
+M```!`````0```!&^````````X"4````````!`````0```+J^````````^"4`
+M```````!`````0```-*^````````$"8````````!`````0```.B_````````
+M*"8````````!`````0```"K`````````0"8````````!`````0```)#`````
+M````>"8````````!`````0```*3`````````H"8````````!`````0```$W!
+M````````P"8````````!`````0```'K!````````X"8````````!`````0``
+M`*W!````````""<````````!`````0```*'"````````("<````````!````
+M`0```!'#````````0"<````````!`````0```(+#````````8"<````````!
+M`````0```$?'````````>"<````````!`````0```%;'````````D"<`````
+M```!`````0```&K'````````J"<````````!`````0```(/'````````P"<`
+M```````!`````0```+3'````````Z"<````````!`````0```!C(````````
+M`"@````````!`````0```*C(````````&"@````````!`````0```*[(````
+M````,"@````````!`````0```+;(````````2"@````````!`````0````#)
+M````````8"@````````!`````0```+;)````````D"@````````!`````0``
+M`+C)````````P"@````````!`````0```.C)````````V"@````````!````
+M`0```'7*````````^"@````````!`````0```-#*````````&"D````````!
+M`````0```,7+````````,"D````````!`````0```-?+````````:"D`````
+M```!`````0```,?,````````@"D````````!`````0````S-````````P"D`
+M```````!`````0```*73````````X"D````````!`````0```/33````````
+M`"H````````!`````0```.O4````````&"H````````!`````0```"S5````
+M````2"H````````!`````0```"S9````````:"H````````!`````0```$+9
+M````````F"H````````!`````0```&#9````````N"H````````!`````0``
+M`._9````````V"H````````!`````0```%_:````````\"H````````!````
+M`0```);:````````("L````````!`````0```-C;````````6"L````````!
+M`````0```$C<````````<"L````````!`````0```&K<````````B"L`````
+M```!`````0```([<````````H"L````````!`````0```+K<````````N"L`
+M```````!`````0```-G<````````\"L````````!`````0```#S=````````
+M""P````````!`````0```%#=````````("P````````!`````0```,/>````
+M````."P````````!`````0```,K>````````:"P````````!`````0```-C?
+M````````@"P````````!`````0```.#?````````F"P````````!`````0``
+M`!'@````````L"P````````!`````0````?A````````R"P````````!````
+M`0```)+A````````("T````````!`````0```$3E````````0"T````````!
+M`````0```&3E````````8"T````````!`````0```(/E````````@"T`````
+M```!`````0```*/E````````H"T````````!`````0```!'F````````N"T`
+M```````!`````0```$+F````````T"T````````!`````0```)OF````````
+M^"T````````!`````0```![G````````$"X````````!`````0```#[G````
+M````,"X````````!`````0```,_G````````2"X````````!`````0```/?G
+M````````8"X````````!`````0````+H````````>"X````````!`````0``
+M`"+H````````D"X````````!`````0```)GH````````J"X````````!````
+M`0```,[H````````P"X````````!`````0````/I````````V"X````````!
+M`````0```$3I````````\"X````````!`````0```$KI````````""\`````
+M```!`````0```%KI````````("\````````!`````0```&CI````````."\`
+M```````!`````0```';I````````4"\````````!`````0```'WI````````
+M<"\````````!`````0```*3I````````B"\````````!`````0```*KI````
+M````L"\````````!`````0```!SJ````````T"\````````!`````0```#KJ
+M````````^"\````````!`````0```-'J````````&#`````````!`````0``
+M`._J````````,#`````````!`````0```/WJ````````2#`````````!````
+M`0```$?K````````<#`````````!`````0```.'K````````D#`````````!
+M`````0````+L````````J#`````````!`````0```$/L````````R#``````
+M```!`````0```&KM````````Z#`````````!`````0```'[M`````````#$`
+M```````!`````0```*#M````````(#$````````!`````0```+[O````````
+M0#$````````!`````0```*GP````````6#$````````!`````0```-KP````
+M````>#$````````!`````0```#OS````````F#$````````!`````0```,ST
+M````````T#$````````!`````0```.3T````````^#$````````!`````0``
+M`'?U````````$#(````````!`````0```*OU````````*#(````````!````
+M`0```-_U````````4#(````````!`````0```$[V````````@#(````````!
+M`````0```&3V````````N#(````````!`````0```$#W````````T#(`````
+M```!`````0```$CW````````Z#(````````!`````0```%#W`````````#,`
+M```````!`````0```%SW````````(#,````````!`````0```(SW````````
+M0#,````````!`````0```+?W````````8#,````````!`````0```-CW````
+M````>#,````````!`````0```.WW````````D#,````````!`````0```#_X
+M````````J#,````````!`````0```)'X````````P#,````````!`````0``
+M`+OX````````V#,````````!`````0```!7Y````````\#,````````!````
+M`0```$7Y````````*#0````````!`````0```%CZ````````:#0````````!
+M`````0```*4'`0``````@#0````````!`````0````4(`0``````H#0`````
+M```!`````0```!P(`0``````X#0````````!`````0```$4*`0``````^#0`
+M```````!`````0```+@*`0``````&#4````````!`````0```,L*`0``````
+M.#4````````!`````0```/H*`0``````8#4````````!`````0```$H-`0``
+M````F#4````````!`````0```.0/`0``````P#4````````!`````0```*`0
+M`0``````V#4````````!`````0```+P0`0``````\#4````````!`````0``
+M``L1`0``````&#8````````!`````0```(01`0``````,#8````````!````
+M`0````@2`0``````8#8````````!`````0```+,2`0``````>#8````````!
+M`````0```.D3`0``````F#8````````!`````0```&84`0``````V#8`````
+M```!`````0```+88`0``````&#<````````!`````0```'X>`0``````,#<`
+M```````!`````0```$0?`0``````4#<````````!`````0```'`?`0``````
+M@#<````````!`````0```*4B`0``````P#<````````!`````0```!<H`0``
+M`````#@````````!`````0````4I`0``````,#@````````!`````0```"PJ
+M`0``````8#@````````!`````0```-(J`0``````@#@````````!`````0``
+M`%DK`0``````P#@````````!`````0```+$L`0``````V#@````````!````
+M`0```"PM`0``````\#@````````!`````0```*LM`0``````$#D````````!
+M`````0```)TN`0``````*#D````````!`````0```,HN`0``````4#D`````
+M```!`````0```.TO`0``````:#D````````!`````0````4P`0``````@#D`
+M```````!`````0`````Q`0``````J#D````````!`````0```+@Q`0``````
+MV#D````````!`````0```'$R`0``````&#H````````!`````0```-TS`0``
+M````2#H````````!`````0```(`T`0``````<#H````````!`````0```"TU
+M`0``````D#H````````!`````0```&0U`0``````L#H````````!`````0``
+M`*$U`0``````\#H````````!`````0```/4V`0``````"#L````````!````
+M`0```&4W`0``````*#L````````!`````0```-XW`0``````2#L````````!
+M`````0```+4[`0``````8#L````````!`````0```,0[`0``````>#L`````
+M```!`````0```-@[`0``````D#L````````!`````0```/$[`0``````J#L`
+M```````!`````0```"(\`0``````V#L````````!`````0```)`]`0``````
+M\#L````````!`````0```,D^`0``````"#P````````!`````0```#`_`0``
+M````(#P````````!`````0```#@_`0``````.#P````````!`````0```*$_
+M`0``````4#P````````!`````0```.-``0``````@#P````````!`````0``
+M`/A``0``````H#P````````!`````0```$U!`0``````P#P````````!````
+M`0```(9!`0``````V#P````````!`````0```-M!`0``````\#P````````!
+M`````0```.-!`0``````$#T````````!`````0```/Q!`0``````.#T`````
+M```!`````0```#-#`0``````6#T````````!`````0```&-#`0``````@#T`
+M```````!`````0```"=(`0``````H#T````````!`````0```,Y(`0``````
+MP#T````````!`````0```.9)`0``````X#T````````!`````0```(Y*`0``
+M````$#X````````!`````0```*-,`0``````.#X````````!`````0```'1-
+M`0``````6#X````````!`````0```,--`0``````>#X````````!`````0``
+M`$E.`0``````D#X````````!`````0```,%.`0``````T#X````````!````
+M`0```,Q0`0```````#\````````!`````0```!Q1`0``````0#\````````!
+M`````0```/M1`0``````<#\````````!`````0```"E3`0``````B#\`````
+M```!`````0```&13`0``````R#\````````!`````0```&A9`0``````Z#\`
+M```````!`````0```.]9`0``````*$`````````!`````0```*%=`0``````
+M4$`````````!`````0````%?`0``````:$`````````!`````0```&E?`0``
+M````B$`````````!`````0```*Q?`0``````J$`````````!`````0```/1?
+M`0``````P$`````````!`````0```/I?`0``````V$`````````!`````0``
+M`"M@`0``````$$$````````!`````0```/!@`0``````4$$````````!````
+M`0```,]A`0``````B$$````````!`````0```*]D`0``````H$$````````!
+M`````0```.5D`0``````X$$````````!`````0```%5L`0``````($(`````
+M```!`````0```#QS`0``````.$(````````!`````0```'ES`0``````4$(`
+M```````!`````0```.IS`0``````D$(````````!`````0```+)T`0``````
+MJ$(````````!`````0```&AU`0``````T$(````````!`````0```&-V`0``
+M````\$(````````!`````0```*MV`0``````"$,````````!`````0```#!W
+M`0``````2$,````````!`````0```"-Y`0``````B$,````````!`````0``
+M`)MY`0``````P$,````````!`````0```&QZ`0```````$0````````!````
+M`0```$Y[`0``````.$0````````!`````0```"Y^`0``````>$0````````!
+M`````0```-"``0``````D$0````````!`````0````.!`0``````J$0`````
+M```!`````0```("!`0``````Z$0````````!`````0```*."`0```````$4`
+M```````!`````0```.""`0``````0$4````````!`````0```-&'`0``````
+M>$4````````!`````0```%N)`0``````F$4````````!`````0```,2)`0``
+M````L$4````````!`````0```/.)`0``````R$4````````!`````0```"**
+M`0``````"$8````````!`````0```$*,`0``````2$8````````!`````0``
+M`+J,`0``````@$8````````!`````0```)2-`0``````P$8````````!````
+M`0```'..`0``````^$8````````!`````0```">1`0``````.$<````````!
+M`````0```#&5`0``````4$<````````!`````0```&>5`0``````:$<`````
+M```!`````0```.25`0``````J$<````````!`````0````>7`0``````P$<`
+M```````!`````0```$27`0```````$@````````!`````0```#6<`0``````
+M.$@````````!`````0```,"=`0``````6$@````````!`````0```"F>`0``
+M````<$@````````!`````0```%B>`0``````B$@````````!`````0```(>>
+M`0``````R$@````````!`````0```(Z@`0``````"$D````````!`````0``
+)``:A`0``````
+`
+end
diff --git a/sys/contrib/dev/ath/public/x86_64-elf.inc b/sys/contrib/dev/ath/public/x86_64-elf.inc
new file mode 100644
index 0000000..e7dae08
--- /dev/null
+++ b/sys/contrib/dev/ath/public/x86_64-elf.inc
@@ -0,0 +1,63 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/x86_64-elf.inc#1 $
+#
+
+#
+# Compilation configuration for building x86-64-elf.
+#
+
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/x86_64-linux-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+#
+# NB: this should come from inttypes.h but can't until we cleanp
+# the definition of va_list on linux
+#
+COPTS+= -DAH_WORDSIZE=64
+COPTS+= -mcmodel=kernel -mno-red-zone
+ifndef CONFIG_FRAME_POINTER
+COPTS+= -fomit-frame-pointer
+endif
diff --git a/sys/contrib/dev/ath/public/x86_64-elf.opt_ah.h b/sys/contrib/dev/ath/public/x86_64-elf.opt_ah.h
new file mode 100644
index 0000000..de94323
--- /dev/null
+++ b/sys/contrib/dev/ath/public/x86_64-elf.opt_ah.h
@@ -0,0 +1,7 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
diff --git a/sys/contrib/dev/ath/public/xscale-be-elf.hal.o.uu b/sys/contrib/dev/ath/public/xscale-be-elf.hal.o.uu
new file mode 100644
index 0000000..53f75ba
--- /dev/null
+++ b/sys/contrib/dev/ath/public/xscale-be-elf.hal.o.uu
@@ -0,0 +1,5454 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/xscale-be-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$"`6$````````````!`"@````!`````````````N(````$```T````
+M```H``T`"N&@"`#AH`@@XU``6`6?`10!H/`.R@``&^-0`!O*```1XU``&JH`
+M`$3C4``2R@``#^-0`!&J```^XU``!PH``#SJ``!&XU``$^H``"GC4`!2"@``
+M0,H``!CC4``<!9\`R`&@\`[J``!&XU``5PH``$#J``!&Y9\PM.%0``,*```\
+MR@``*^-0`)$%GP"D`:#P#LH``"?B0#"&XU,``8H``$;J``!"Y9\PC.%0``,*
+M``!$Z@``1N6?,(#A4``#"@``1,H``#/EGS!TX5```PH``#[J``!&Y9\P:.%0
+M``,%GP!D`:#P#N6?,&#A4``#!9\`7`&@\`[J``!&Y9\`5.&@\`[EGP!0X:#P
+M#N6?`$SAH/`.Y9\`2.&@\`[EGP!$X:#P#N.@``#AH/`.````1````%@``!$'
+M````;```$!0``!$3```1$@``\!,```"```#Q&P```)0```"H````N````,@`
+M``#<````\.&@P`WI+=@`XDRP!.&@"`#AH`@@X:`8`>&@&"'EGR`LY9\P+.%0
+M``(14``#"@``9^6?,"#A4``#&@``:N&@``'K___^Z1NH`..@``#I&Z@```"G
+M)P``%HP``!"WX:#`#>DMV`#B3+`$XDW0!.&@P`/EF^`$X:`(`.&@""#EGS$X
+MX5```PH``*G*``"(XU``$LH``(+C4``1J@``I>-0``<*``"IZ@``K>-0`!,*
+M``"AXD`P&N-3``**``"MZ@``H.6?,/CA4``#"@``H<H``)7EGS#LX5```PH`
+M`*G5GS#DV@``GN6?,.#A4``#"@``I>H``*WEGS#4X5```PH``*7%GS#,R@``
+MGN6?,,CA4``#"@``H>H``*WA4``#&@``K>.@`!/EC>``X:`P#.O___[J``"P
+MY8W@`.&@,`SK___^Z@``L.6-X`#AH#`,Z____NH``+#CH```XZ`P`>6.,`#C
+M4```"@``QN.@/W+AD#"SX<`PN.6?,&#AD#"SX<`PNN60,<SE@#`<XZ`^'>&0
+M,+/AP#*PY9\P1.&0,+/AP#*RXZ`_=>&0,+/AP#*TY9\P,.&0,+/AP#*VZ1NH
+M`````@<``!$3```1!P``$!0``!$2``#Q&P``_QD``/`3```!R@```=(```'6
+MY8`1V..@``'AH/`.X:#`#>DMV?#B3+`$X:"``.&@<`'AH&`"X:!0`^.@0`#A
+MH``(X:`0!^O___[@```&X5``!1H``.7CH``!Z1NI\..@``KK___^XH1``>-4
+M#_JZ``#=XZ```.D;J?#CH,``X:`@#.%<``$J``#VX@`P`>&#P(SAH`"@XH(@
+M`>%2``$Z``#PX:``#.&@\`[AH,`-Z2W8,.),L`3AH,``X:```N&@.`/AH"@C
+MX((P@N"!,0/ATT*VXU0``!H``0;AH``$Z1NH,."",(+@@3$#Y=,P)>-3``27
+MG_$#Z@`!90``!$P```6<```$E```!40```5LXZ!0P.6;,`3C4P``"@`!&N""
+M,(+@@3$#Y=,P*>-3```1H%"EX:`Q@.!C!`#@@P$`X:`!@.&@$`3K___^X(4`
+M`.*```KJ``%FY9\Q$.><,`/C4P``"@`!-.'3,/+C4P``J@`!-.&@(@3EGS#T
+MX(,3DN&@$R/@@0&`XH``%>O___[AH#(`XH,`D.H``6;EGS#,YYPP`^-3```*
+M``%%X=,PLN,3"0$*``%%X:`AA.6?,+#@@Q.2X:`3(^"!`8#B@``5Z____N&@
+M,8#B@P!(Z@`!9N&@(03EGS"(X(,3DN&@$R/@@0&`XH``%>O___[AH#$`XH,`
+M).H``6;AH"&$Y9\P8."#$Y+AH!,CX($!@.*``!7K___^X:`Q`.*#`!;J``%F
+MX:`Q!.6?(#C@@Q.2X:`3(^"!`8#B@``5Z____N&@`0#C5`_Z,H``O2*``%SJ
+M``%FXZ```.&@.`#AH`@CZ1NH,```$#@08DW3X=$PLN,3`"`3H``"$:#P#N'1
+M,++B`S#0XU,`P`.@``,!H/`.X=$PLN(#,-#C4P#0`Z``!`&@\`[AT3"RXQ,`
+M$!.@``$1H/`.X=$PLN,3"P(#H```$Z``!>&@\`[AH,`-Z2W8,.),L`3AH%`!
+MX:!``N,2`(`*``&0Y9\Q8.%1``,*``&NY9\Q6.%1``.:``&SZ@`!U^,2#`$*
+M``&KZ____N-0```*``&9XD4]3>)#,`WC4P`PF@`!Q.,4#04#H#``$Z`P`>6?
+M(1SA50`"@Z`P`)(#,`'C4P```D4]3@)#,`@%GR$$`(,3D@H``:GB13[ZY9\@
+M]."#`Y+AH`$CZ1NH,.6?,-CA40`#&@`!L..@``[I&Z@PY9\PR.%1``.*``&Z
+MXD4^EN)#,`?EGR#`X,("D^&@/\/@8P#"Z1NH,.6?,+#A40`#B@`!W>O___[C
+M4```"@`!U.)%/4WB0S`-XU,`,(H``=3@A3$%X:`@@^6?$'C@@P61X:`Q(^"#
+M,0/@8S`%XU,``@)""0,"0`#S`(,@D1)""0,20`#X%9\P3!"#$Y#J``&IY9\P
+M3.%5``.*``&FXD4NG>6?,##@@Q.2X:`R(^*#``_I&Z@PXD$]3N)#,`CEGR`4
+MX(,#DN&@`2/I&Z@P```)M```";,``!.(S,S,S69F9F<``!.'```3).&@P`WI
+M+=@0XDRP!.&@0`'EGS`LYY`0`^-1```*``'WZ____N6?,!SGTS``X``$D^D;
+MJ!#@A#$$X(0P@^&@`(/I&Z@0```0.`````#AH,`-Z2W8$.),L`3AH$`!Y9\P
+M,.>0$`/C40``"@`""^O___[EGS`@Y],0`.&@``3K___^Z1NH$.6?,!#@@R.4
+MX:`"(^D;J!```!`X`````+HNBZ/AH,`-Z2W=\.),L`3B3=`$X:"@`.&@<`'E
+MT3`$XU,``!H``D;AH(`#X^`@`."(,`?EPR`$XHB``>-8`!_:``(=XZ"``.67
+M,`#A6``#J@`"1N"(0(C@AT$$XH00*.74,"CET5`#X(,@!^7"@`3ET2`!X8,P
+M`N"#,`?EPX`$XH1@+..@,`#EC3``X:``"N&@$`?CH"`.X:`P!>O___[AQ`*\
+MXZ`P`>6-,`#AH``*X:`0!^.@(`[AH#`%Z____N'&`++BB(`!Y9<P`.%8``.Z
+M``(FZ1NM\.&@P`/B@#X>XU$`(I>?\0'J``+$```)Q```"O````KP```*\```
+M"<P```KP```)X```"?````L8```)^```"@0```I````*&```"BP```HT```*
+M2```"Q@```L8```*@```"H@```KP```*E```"O````J@```*K```"K@```L8
+M```+&```"O````L8```*^```"Q@```L8```+&```"Q#CH#^"Z@`"N.73,`/A
+ML#.C$Z````.@``'AH/`.X=,PNN6,,`#CH```X:#P#N'3,+CJ``)WY=,P`N,3
+M`$#J``*&Y=,P`N&P,Z,#H```$Z``#>&@\`[ETS``XQ,`(!.@```#H``-X:#P
+M#N73,`#J``*AY=,P`.,3``CJ``*&Y9`Q^.H``G?C4@`#EY_Q`NH``KH```GH
+M```*9```"G````IXXZ`_?^&0,//J``)WY9\PJ.H``KCED#(`Z@`"=^73,`+J
+M``*%Y=,P`N,3`!#J``*&Y=,P`>&P,Z/J``*&Y=,P`N,3``3J``*&Y=,P`N,3
+M``+J``*&XU(``0H``K8Z``*SXU(``@6?,%0*``*XZ@`"NN73,`+C$P`!Z@`"
+MAN6?,$#J``*]X9`PL^H``G?CH``-X:#P#N6?,"SGD#`#XU,```.@``T3H```
+MX:#P#N63,!3J``)WXZ``#.&@\`X```'^```03```$%```!!LY2W@!.&@P`/E
+MG>`$XU$`&0H``MR*``+3XU$`#PH``M;J``+MXU$`'@H``NKJ``+MXU(``QH`
+M`NWC4P`$E8`R`)H``N7J``+MXU(``0H``N'C4@`""@`"Y^H``NWB4R``$Z`@
+M`>6?,#3G@"`#XZ```>2=\`3EGS`HX8#`L^H``N7EGS`@YX#``^H``N7C7@``
+M$Z`P#!6.,`#CH```Y)WP!```$%```!!,```0;.&@P`WI+=_PXDRP!.)-T`3A
+MH(``X:"0`>4+("SAH%`#X:!@`N.@H`#C4P`'F@`#&>&@,0K@@R`)X9-`N>'2
+M<++AAS@$Y(8P!.)%4`3AH``(X:`0!.O___[DA@`$XH1`!.)%4`3C50`#DZ`P
+M`(.@,`'A5``'@Z`P`)(#,`'C4P``&@`#".**H`'C50`'B@`#`>4;,"S@8P`&
+MZ1NO\.&@P`WI+=@0XDRP!.&@P`+IFP`4XU$`'I>?\0'J``-B```-%```#9``
+M``V0```-D```#9````V0```-D```#9````V0```-D```#9````V0```-D```
+M#20```V0```-D```#9````V0```-D```#9````V0```-D```#9````V0```-
+MD```#9````V0```-D```#9````U````-6.*`/W+E@C``XZ`P$.H``U+AH!`,
+MY9(@`.64,`#K``+UY80``..@``'I&Z@0XH`]0>*#,!3E@C``XZ`P&.6$,`#J
+M``-,XU,``!H``USCH#`$Y80P`.62(`#ED#($Y8(P`.H``TSC4P`$!9PP``6`
+M,@0*``-,XZ```.D;J!#CH```Z1NH$.61``3C4````:#P#N62,`#E@3``Y9(P
+M!.6!,`CEDC`(Y8$P#.62,`SE@3`0Y9(P$.-S``$#H#`""@`#=>-3`/\CH##_
+MY8$P%.62,!3C<P`!"@`#A>-3"P$QH``#(Z`+`>.@,`'E@3`8X5,``"H``X?A
+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
+MH#$#X@,P/.%1)[+A@S<BY<`P">%1-[+AH#0CX@,P/^7`,!3A43>RX:`Q(^(#
+M,#_EP#`*X5$WLN&@,@/B`S`PX5$GL.&#-B+EP#`5X5$WL.&@,R/B`S`_Y<`P
+M%N51,&_B`S`_Y<`P%^%1-K[AH#4CY<`P&.%1-K[AH#(CX@,P/^7`,!GA43:^
+MX:`Q`^(#,#SA42:\X8,W(N7`,!KA43:\X:`T(^(#,#_EP#`;X5$VO.&@,2/B
+M`S`_Y<`P'.*$0`'BC,`+XU0`!)H`%H;AH``&ZP`7;N.@@`#AH$`(Y9^A+.)D
+M$!_AH``&XDL@JNO___[C4```"@`7*N%;.KK@B(`#X(4@A.&@-"/GPC`*Y5LP
+MJ>6?$/SGPC`!XH1``>-4``*:`!<.Y9\P[.%8``,36````Z!`"0H`%RWAH``&
+MY9\0B.&@(`?K___^X:``!ND;K_#CH$`(Z@`7,>.@0`CAH``&Y9\09.&@(`?K
+M___^XU4``!&@``4;___^XUD``!6)0`#CH```Z1NO\```$A@```"8```0<```
+M`<H``!%$```2!```$@@``!(,```2$```$A0``$`@``"8&````=(```'6``"8
+MT```'!8``)B```!`$```6J4``!!R``#__P``$'0``!!V```0>```$'D``!![
+M```0>@``$'X``!!_```0@0``$'P``!!]````````$(0``!$D```1)0`"__WA
+MH,`-Z2W8`.),L`3K___^Z1NH`.&@``/C$0P!$Z`[!1'",+`5GS`,$<`PL!.@
+M``$#H```X:#P#@``%3;CH``!X:#P#N&@P`#B@!X>Y9$P!..#,`'E@3`$XZ`K
+M!>'!(+SEGS",X<$PON71,`#C@S!`Y<$P`.71,`+B`S!_Y<$P`N.@,`/AP3"X
+MXZ`@0.'!(+KET3`"X\,P!.7!,`+ET3`"X\,P`N7!,`+EGS!(Y]`P`^-3```*
+M`!>4Y9\P/..@(`#A@""SXZ`@`>6?,##G@"`#Y=$P`N&#,`+EP3`"XZ`P#^6!
+M,!3CH``!Y9\P%.>,``/AH/`.```5-@``$'P``!!,```04```$&SAH,`-Z2W8
+M,.),L`3AH%``X:!``>6?$$CEE"`$Z____N&@``7EGQ`\Y90@#.O___[AH``%
+MY9\0,.64(!#K___^X:``!>6?$"3EE"`(Z____N&@``7EGQ`8Y90@`.O___[I
+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
+M`$`0X:#`#>DMV`#B3+`$Y9\0$.O___[C$`4"`Z```1.@``+I&Z@```"`!.&@
+MP`WI+=@PXDRP!.&@4`#AH$`!Y9\0,.O___[C$`4""@`:<>-4``(:`!ISZ1NH
+M,.-4``$*`!IWXX`E`N&@``7EGQ`$Z____ND;J#```(`$XZ```.&@\`[C40``
+M$Z`0``.@$`'AH``!X:#P#N&@P`WI+=@PXDRP!.&@4`#AH$@"X:!().*`#47B
+M@``(XZ`@!NO___[EGS"8Y]4@`^6?,)3GU3`#X8(D`^6?,(SGU3`#X8(H`^6?
+M,(3GU3`#X8(L`^&@``7EGQ!XZ____N6?,'3GU2`#Y9\P<.?5,`/A@B0#X:`Y
+M!.&@.2/A@B@#X:``!>6?$%CK___^XU0``!H`&JKAH``%Y9\02.O___[C@"8!
+MZ@`:KN&@``7EGQ`TZ____N/`)@'AH``%Y9\0).O___[I&Z@P```12```$4D`
+M`!%*```12P``@`@``!%,```130``@`P``(`$X:#`#>DMV'#B3+`$X:!``.6?
+M$$CK___^X:!0`.&@``3EGQ`\Z____N&@8`#AH``$Y9\0*.O___[AH"``X5``
+M!3*&8`'AH!`&XZ```.&@,`'CH$``X800`N&@``/I&ZAP``"`;```@'#AH,`-
+MZ2W8`.),L`3EGQ`$Z____ND;J````(!LX:#`#>DMV!#B3+`$X:!``.6?$!3K
+M___^XX`D`>&@``3EGQ`$Z____ND;J!```(`DX:#`#>DMV'#B3+`$X:!@`.6?
+M$$CK___^X:!9H.&@6X7AH%NEXQ4,`16?,#00)5`#$>!0!>&@``;EGQ`HZ___
+M_N&@0`#AH``&Y9\0'.O___[@)$``X"1`!>&@``3I&ZAP``"89````?\``(!P
+M``"`;.&@P`WI+=@0XDRP!..@/AWAD$"SY9\0&.O___[B``#_X50``!.@0``#
+MH$`!X:``!.D;J!```$`@X:#`#>DMV##B3+`$X:!0`.&@0`'EGQ!PZ____N64
+M,`#@@``#Y80``.&@``7EGQ!<Z____N64,`3@@``#Y80`!.&@``7EGQ!(Z___
+M_N64,`S@@``#Y80`#.&@``7EGQ`TZ____N64,`C@@``#Y80`".&@``7EGQ`@
+MZ____N64,!#@@``#Y80`$.D;J#```("8``"`E```@)P``("0``"`H.&@P`WI
+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
+MH!!,X:`@!.O___[AH``%Y9\4*.&@(`3K___^X:``!>.@$$#AH"`$Z____N&@
+M``7EGQ0,Y9\T#.>7(`/K___^X:``!>6?%`#AH"`$Z____N&@``7AH!`$Z___
+M_N&@``7EGQ/HX:`@!.O___[AH``%Y9\3W.&@(`3K___^X:``!>6?$]#AH"`$
+MZ____N&@``7EGQ/$X:`@!.O___[AH``%Y9\3N..@(`'K___^X:``!>6?$ZSC
+MH"`!Z____N&@``7EGQ.@X:`@!.O___[AH``%Y9\3E.&@(`3K___^X:``!>6?
+M$XCAH"`$Z____N&@``7EGQ-\X:`@!.O___[AH``%Y9\3<./@(`#K___^X:``
+M!>6?$V3CX"``Z____N&@``7EGQ-8XZ`@`>O___[EGV-0YY81A.4;,"SC4P``
+M"@`?$N)!.0+C4PH!.@`?%N"&,83EDR`$X:``!>O___[BA$`!XU0`IIH`'POA
+MH``%X:`0".O___[C4```"@`?B^&@``7EGQ,`Z____N/`+/_EGS+XY]<P`^&"
+M)`/AH``%Y9\2Y.O___[EGS+DY]<P`^&@*`/A@BP#Y9\RV.?7,`/A@B0#X8(@
+M`^&@``7EGQ+(Z____N&@``7EGQ+`Z____N/`+?[EGT*XX9<PM.&@,*/B`SW^
+MX8(@`^&@``7EGQ*<Z____N&@``7EGQ*8Z____N/`*C_AES"TX:`U`^(#.C_A
+M@B`#X:``!>6?$GCK___^X:``!>6?$G#K___^X\`J?^6?,FCGUS`#X:`V`^(#
+M.G_A@B`#X:``!>6?$DSK___^X:``!>6?$DCK___^X\`@`^&7,+3B`S`#X8(@
+M`^&@``7EGQ(LZ____N&@``7AH!`)ZP`C?^-0```*`!^+Y1L0+.-1```*`!]P
+MY=DP!.,3``(#PS`!!<DP!.'9,++AR#"RY=DP!.7(,`3AH``%Y9\1Y..@(`'K
+M___^XZ`/^NO___[AH``%Y9\1T.O___[C@"`!X:``!>6?$<#K___^X:``!>6?
+M$;3CH"`!XZ`P`.O___[AH``%X:`0">O___[C4```$Z!``!H`'XWAV#"RXX,P
+M`N'(,++CH"`#Z@`?M^&@``7AH!`$Z____N*$0`'C5``"V@`?C>6?,63GE3`#
+MXU,``!&@``4;___^X:``!>6?$5#K___^X\`E!N&@``7EGQ%`Z____N6?,3SG
+MEQ`#XW$``1&@``4;___^Y9\Q+.>7$`/C<0`!$:``!1O___[EGS$<YY<0`^-Q
+M``$1H``%&____N65(?CC4@``"@`?M.&@``7EGQ"4Z____N6%H=SCH``!Z1NO
+M\.6;$`3ED3``XU,``!6!(`#CH```Z1NO\```0!```!$D```1)0``$28``!$G
+M```1*```$2D``(`$```0)```$4@``!%)```12@``$4L``(`(```13```$4T`
+M`(`,```1+```0`P``(`8```2"```@$@``(!0``"`5```@%@``(!<``"`8```
+M@&0``(!H``"`*```@"P``(!L``"`,```@#0``(`X```1$```F"@``!!Y```0
+M>@``$'L``)@T``"81```$'0``)A(``"89```$'@``)D0``"8'```F&```!!0
+M``"`)```$@P``!(0```2%.&@P`WI+=APXDRP!.&@8`#AH$`!X:!0`.6?$*#K
+M___^X:`X`.&@""/C5``(EY_Q!.H`("(``(!```"`8```@)```("0``"`D```
+M@)```(`L``"`D```@'3EGS!DYY8@`^&`(`+C@BA1Z@`@$N6?,%#GEB`#X8`@
+M`N."*%+AH``&Y9\0..O___[I&ZAPY9\P,.>6(`/A@"`"XX(G!>H`(!+EGS`<
+MYY8@`^&`(`+C@B8!X:``!N6?$`3K___^Z1NH<```@`0``!($X:#`#>DMV`#B
+M3+`$Y9`1W.L`'_/I&Z@`X:#`#>DMV`#B3+`$XZ`0"..@(`KK`"$EZ1NH`.&@
+MP`WI+=@0XDRP!.&@0`#CH!``XZ`@`>O___[C4```"@`@2N&@``3CH!`/Y9\@
+M,.L`(27C4```"@`@2N.@#_KK___^X:``!..@$!_EGR`0ZP`A)>6?``SK___^
+MXZ```>D;J!```$X@```(-.&@P`WI+=@PXDRP!.&@4`#AH$`!XZ`0`..@(`'K
+M___^XU````H`('KCH"``X50``@H`(%WAU#"RXQ,`$!.@(`'AH``%Y9\0;.O_
+M__[AH``%XZ`0#^6?(&#K`"$EXU````H`('KCH`_ZZ____N&@``7CH!`?Y9\@
+M0.L`(27C4```"@`@>N6?`#3K___^X:``!>.@$`#CH"`!Z____N-0```*`"!Z
+MX:``!>.@$`#CH"`*ZP`A)>D;J#```)@$``!.(```"#3AH,`-Z2W?\.),L`3B
+M3=`$X:!P`.4+$"SAH)`"Z____N&@@`#C4```"@`A&^&@``?EGQ)`Z____N.`
+M(&#AH``'Y9\2,.O___[AH``'Y9\2*.O___[AH*``X\`E`N&@``?EGQ(4Z___
+M_N.@#OKK___^X:``!^6?$@3K___^XX`C`N&@``?EGQ'TZ____N.@``KK___^
+MX:``!^&@$`CK`"-_XU````H`(1OCH`_ZZ____N&@``?EGQ'$Z____N/`(P+A
+MH``'Y9\1M.O___[AH``'Y9\1K.O___[AH$``X:``!^6?$:#K___^X:!0`.&@
+M``?EGQ&4Z____N&@8`#CA"?_X:``!^6?$7CK___^X\4I_^/"+?[C@BG_XX(@
+M@.&@``?EGQ%@Z____N/&*W_CPBX^XX(M1N&@``?EGQ%,Z____N.@`!3K___^
+MX:``!^6?$2SK___^XX`C`N&@``?EGQ$<Z____N.@``KK___^X:``!^6?$1CC
+MH"`AZ____N&@``?EGQ#XZ____N/`(P+AH``'Y9\0Z.O___[CH`_ZZ____N&@
+M``?EGQ#HZ____N.`(`'AH``'Y9\0V.O___[AH``'Y9\0S..@(`'CH#``Z___
+M_N&@``?EGQ"HX:`@!.O___[AH``'Y9\0G.&@(`7K___^X:``!^6?$)#AH"`&
+MZ____N&@``?AH!`(Z____N-0```:`"$-Y9\`?.O___[AH``'X:`0".O___[C
+M4```!1L@+`'2,+(#@S`"`<(PLN&@``?EGQ`PZ____N/`(&#AH``'Y9\0(.O_
+M__[AH``'Y9\0&.&@(`KK___^XZ`P`>6),`#AH``#Z1NO\```@&@``(`D``"8
+M"```F%@``)A<``"8:```F-0``)A@```3B.&@P`WI+=APXDRP!.)-T`3AH&``
+MX:!``>&@4`+C40``$:`P`0/@,`#E"S`<XZ`9`>&@(`3K___^X:``!>O___[B
+M!$`/Y1LP'.(#,`_E"S`<X:``!N.@&0'AH"`#X:`P!.O___[AH%``XQ0`!!H`
+M(4[CH#`5Y0LP'.5;(!SB2Q`<Y=$P`>&")`/ET3`"X8(H`^71,`/A@BP#X:``
+M!N.@$!3K___^X:``!>D;J'#I+4`PX@)`_^.@X`#CH,`*XH10`>&@,(SB@S`#
+MX@,P_^%4``,:`"%>Y]$`#.-0`#\:`"&-Z@`A?.&@((SB@B`#X@(@_^-<``#3
+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
+MGS)8X5<``Q.@0`<:`"@)Y9\R3..@(`KAA2"SY9\R1..@(`/AA2"SXZ!``.6?
+M$CCCH"`+X(0PA."$,0/@A3$#X(,P`>'#(++BA$`!XU0`"9H`)Y;CH$``Y9_"
+M$.6?XA#CH``+X:`PA."#(`7EGQ($X9,0L>&"$+SB@BU/XH(@-.'"$++@@S`$
+MX(0Q`^"%,0/@@R`.X<(`LN*#.P7B@S`<X<,`LN*$0`'C5``"F@`GHN*%'4'B
+M@1`PX:``!NO___[C4```"@`H".66,<SC4P`#F@`GV.6?,:#AE3"SXU,```H`
+M)]CAH``&XZ`;)N6?(8SK___^XZ`.?>O___[EGT&`X:``!NL`)M?AA@"TX:``
+M!N.@&R;CH"`'Z____N.@#GWK___^X98PM.(#,/#C4P`@"@`GV^.@0`WJ`"@)
+MY9\Q...@(`#AA2"SX:``!N.@$+_B2R`JZ____N-0```*`"@(Y9\Q(.%;(KKA
+MA2"SXZ`O@N&5,+/AAC"RY9\Q#.6&,<#AH``&ZP`HF^&@``;K___^XZ!P`.&@
+M0`?EGX#PY9^@\.)D$!_AH``&XDL@*NO___[C4```"@`H".%;,KK@AW`#X(4@
+MA.&@-"/GPC`(Y5LP*>?",`KBA$`!XU0``IH`)_'EGS"PX5<``Q-7```#H$`)
+M"@`H">&@``;I&Z_PXZ!`".-5```1H``%&____N-9```5B4``XZ```.D;K_``
+M`"U0```6J```$'````'*```M#```+2@``"TP```M-```+3@``"T\``#Q&P``
+MF'P``$`@``"8&````=(``$`0```0<@``__\``!'H```3]```$?```!/\```4
+MN```)Q@``!"*``!`!P```=8``!!T````````*HP``"J-``+__>&@P`WI+=@0
+MXDRP!.&@0`#B@!U!XH$0,.O___[AH``$Z____ND;J!#AH,`-Z2W?\.),L`3B
+M3=`@X:!P`.6?(.SB2S!`Z)(``^B#``/EGS#@XDO`..B3``_HC``/XZ"``.)+
+MD$#B2Z!(X:!!".>48`GAH``'X:`0!NO___[GA``*XZ!0`.&%2`7AH``'X:`0
+M!N&@(`3K___^X:``!^&@$`;K___^X5``!!H`*&OBA5`!XU4`_]H`*%'CH%``
+MXDL0*."!,07E$T`0X:``!^&@$`;AH"`$Z____N&@``?AH!`&Z____N%4```*
+M`"AMXZ```.D;K_#BA5`!XU4``]H`*%_AH#$(X:``!^>3$`GGDR`*Z____N*(
+M@`'C6``!V@`H2N.@`&3K___^XZ```>D;K_```"<@```G*.&@P`/AH!@!X:`8
+M(>,1#`$5GS!`$<(PL!6?,#P:`"B/XQ$`@`H`*)+EGS`PX9`PL^-3```*`"B2
+MY9\P).'",+#EGS`@X<PPL..@``'AH/`.XZ```.&@\`X``!,X```7U```$(H`
+M``D(```*K..@``'AH/`.X:#`#>DMV/#B3+`$XDW0!.&@<`#AH%``X:!@`.*`
+M3A[CH#^"X9`PL^-3``$:`"BJXZ`0$.)+("#K___^XZ`@`.6$(`3EGS$8X94P
+ML^%3``(*`"BWXX(P`>6$,`3EGS$$X94PL^%3``(#@S`#!80P!.6?,/3AE3"S
+MXU,``!64,`03@S`$%80P!.6?,.#AQ#&PY9\PW.'$,;+EGS#8X<0PO.6?,-3A
+MQ#"^Y=0P`.'@/(/AX#RCY<0P`.74,`#C@S!`Y<0P`.74,`+AX#R#X>`\H^7$
+M,`+EU#`"XX,P0.7$,`+CH#`*X<0PN..@,(#AQ#"ZY=0P`N/#,`3EQ#`"Y=0P
+M`N/#,`+EQ#`"Y9\P<.&5,+/C4P``"@`H[N*&+4'B@B`,X:``!^.@$`_K___^
+MXU````H`*.[CH"`!Y9\P1.>&(`/EU#`"X8,P`N7$,`+CH#`-Y80P%..@``'E
+MGS`HYX8``^D;J/```!"&```0=@``$(H```D(```*K```$S@``!?4```0>@``
+M$%```!!LX:#`#>DMV##B3+`$X:!0`.&@0`'EGQ!(Y90@!.O___[AH``%Y9\0
+M/.64(`SK___^X:``!>6?$##EE"`0Z____N&@``7EGQ`DY90@".O___[AH``%
+MY9\0&.64(`#K___^Z1NH,```@"@``(`L``"`,```@#0``(`@X:#`#>DMV`#B
+M3+`$XDW0%.4+$!SED#'<XU,`")>?\0/J`"D\``"DT```I,```*3X``"D^```
+MI/@``*3X``"DT```I/@``*3`Y9\P4.4+,!3EGS!,Z@`I.^6?,$CEDS``X&,P
+M`>&@,8/E"S`4Y9\P..63,`#@8S`!X:`Q@^4+,!#B@3`!Y0LP&./"-/[CPSA_
+MY0LP(.)+$"#K___^Z1NH````__\`!___``````````#AH,`-Z2W8$.),L`3A
+MH$``Y9\0...@(`#K___^X:``!.6?$"SK___^XX`G`>/")@/AH``$Y9\0&.O_
+M__[AH``$Y9\0$.6?(!#K___^Z1NH$```@"@``(`$``"`(```___AH,`-Z2W8
+M<.),L`3AH$``X:!0`>&@8`#AT3&RXU,```H`*7SEGQ$,Z____N.`)@'AH``$
+MY9\0_.O___[AU2&PX:``!.6?$/#K___^X=4ALN&@``3EGQ#DZ____N65(!3A
+MH"&"X:``!.6?$-3J`"F!Y9\0P.O___[CP"8!X:``!.6?$+#K___^X:``!.6?
+M$+3EE2``Z____N&@``3EGQ"HZ____N&@"Z#AH`N`X=4PNN&`(`/AU3&XXU,`
+M`!*#,`01H#@#$@,X?Q&"(`/AH``$Y9\0=.O___[EGQ!PYY8@`>/"+/_AU3&Z
+MX:`T`^(#//_A@B`#YX8@`>&@``3EGQ!0Z____N&@``3EGQ!(Z____N&@*"#A
+MH"@"Y94P'.)#,`/AH#F#X8(H(^&@``3EGQ`DZ____ND;J'```(`$``"`)```
+M@#@``(`P``"`*```@"```"TP``"`&```0`3AH,`-Z2W8`.),L`3EGQ`,Z___
+M_N)0```3H``!Z1NH````0`CAH,`-Z2W8,.),L`3AH%``X:!``>.@$,#K___^
+MXW```1H`*<WCH#``Y80P`.&@``/I&Z@PY9\PT.``,`/EA#``XQ`'`A.#,0$5
+MA#``XQ``!164,``3@S`!%80P`.,0#1<5E#``$X,P0!6$,`#C$``@"@`IX^6?
+M,)3GE3`#XU,``!64,``3@S$!%80P`.64,`#C$P$!"@`J`>6?,'3GA0`#X:``
+M!>.@$,3K___^Y9\P9.>%``/AH``%XZ`0R.O___[EGS!4YX4``^&@``7CH!#,
+MZ____N6?,$3GA0`#X:``!>.@$-#K___^Y9\P-.>%``/AH``%XZ`0U.O___[E
+MGS`DYX4``^.@``'I&Z@P`078N@``$&P``!!4```06```$%P``!!@```09```
+M$&CEGS`$YY```^&@\`X``"J8X:#`#>DMV/#B3+`$X:!@`.&@0`'AH%``Y9\P
+MM.>0<`/C5P``J@`J'^.@$"3CH"``Z____N&@``;CH!`DZ____N6?()#@!"`"
+MXQ0`0`H`*C/EGS"$YY4P`^-3```3@B!`Y9\P>.>5,`/C4P``$X(L`>6?,&SG
+ME3`#XU,``!."((#EGS!@YY4P`^-3```3@BL!XQ0``1."(`?C%`$!$X(G`N&@
+M``;CH!"@Z____N6?,"#GA4`#XU0``*H`*D+AH``&XZ`0)..@(`'K___^X:``
+M!^D;J/```"J8`078N@``*IP``"J@```JI```*JCCH`"`X:#P#N&@P`WI+=@`
+MXDRP!.&@&`'AH!@AXU$`?XH`*EOAH!*!XH$;(N*!$!SK___^XQ`)`@H`*EOC
+MH``!Z1NH`..@``#I&Z@`X:#`#>DMV##B3+`$X:!0`.&@&`'AH!@AXU$`?XH`
+M*HGAH$*!XH1+(N&@$`3CH"``Z____N*$$`3AH``%XZ`@`.O___[BA!`(X:``
+M!>.@(`#K___^XH00#.&@``7CH"``Z____N*$$!#AH``%XZ`@`.O___[BA!`4
+MX:``!>.@(`#K___^XH00&.&@``7CH"``Z____N*$0!SAH``%X:`0!..@(`#K
+M___^XZ```>D;J##CH```Z1NH,.&@P`WI+=APXDRP!.&@8`#AH!@!X:`8(>-1
+M`'^:`"J5XZ```.D;J'#C4@```Z!0``&@P`4*`"JGY=)0!>72,`3A@U0%Y=+`
+M`^72,`+AH#@#X8/,#.72,`'AC,0#Y=(P`.&,P`/AH#^%X8/`K.&@4*7AH$*!
+MXH0;(N*!$!CAH``&X:`@#.O___[BA$LBXH1`'..%*0+AH``&X:`0!.O___[C
+MH``!Z1NH<.&@P`WI+=_PXDRP!.)-T`CAH(``X:```N4+,"SAH!@!X:"8(>6;
+M(`3EGS&@XU(``!&@$`,#H!``XUD`?XH`*M_ET#``XU,``0H`*L_*`"K,XU,`
+M``H`*M'J`"K?XU,`!0H`*MWJ`"K?XZ`P!>H`*N'AT#"RXU,`!)H`*M_AT#"R
+MXU,`!9.@,`":`"KAX=`PLN-3``V#H#`#DZ`P`>H`*N'CH#`'Z@`JX>.@``#I
+M&Z_PY0LP,.70P`3ET#`%X8S$`^70,`;AC,@#Y=`P!^&,S`/@+,`!Y=`@".70
+M,`GA@J0#X"J@`>&@.`KAH*@CY=!@"N70,`OAAF0#Y=`P#.&&:`/ET#`-X89L
+M`^`F8`'ET"`.Y=`P#^&"=`/@)W`!X:`X!^&@>"/ET%`0Y=`P$>&%5`/ET#`2
+MX858`^70,!/AA5P#X"50`>'0,++C4P`-D@50_^&@0HGBA$LBX:``".&@$`3A
+MH"`,Z____N*$$`3AH``(X:`@"NO___[BA!`(X:``".&@(`;K___^XH00#.&@
+M``CAH"`'Z____N*$$!#AH``(X:`@!>O___[BA$`4X:``".&@$`3E&R`PZ___
+M_N&@``CAH!`)Y1L@+.O___[I&Z_PJJJJJN&@P`WI+=@`XDRP!.*`/:KB@S`,
+MX:```>&@$`/CH"`&Z____ND;J`#AH,`-Z2W8`.),L`3B@`VJXH``#..@(`;K
+M___^XZ```>D;J`#AH,`-Z2W8`.),L`3AH``!Y9\0"..@(`;K___^Z1NH````
+M)SCCH```X:#P#N&@P`WI+=@PXDRP!.&@0`#AH#`!X:!0`N.@&@;AH"`#Z___
+M_N&@``3EGQ`XXZ`@`>O___[AH``$Y9\0+..@(`/CH#`"Z____N-0```*`"MA
+MX:``!.6?$!3K___^X<4`L..@``'I&Z@P``!@"```8`P``&`$X:`8`>.@/X+A
+MD#"SX5,((0.@,`P*`"MPY9\P'.&0,+/C$P"``Z`P`Q.@,`OC4@``%8(P`..@
+M``#AH/`.```0<N.@(`#EGS`TX9`PL^%3``(*`"M_XZ`@`>6?,"3AD#"SXU,`
+M``."($+EGS`8X9`PL^-3```3@B`$X:```N&@\`X``!"&```0=@``$(KAH,`-
+MZ2W8<.),L`3AH&``Y9\P6.&00+/B!%`<X:!11>($0`+AH$#$X:`0!>O___[A
+MH``&XZ`;)NO___[C@"H"X:``!N.@&R;K___^X:``!N&@$`7K___^X%`@!!.@
+M(`'AH``&X:`0!>O___[I&ZAP```03.&@P`WI+=@PXDRP!.&@4`#AH$`!Y9\0
+M(.O___[AH$"$XZ`P`^&`)!/AH``%Y9\0".O___[CH``!Z1NH,```0!3AH,`-
+MZ2W8,.),L`3AH%``X:!``>6?$"#K___^X:!`A..@,`/AP"03X:``!>6?$`CK
+M___^XZ```>D;J#```$`4X:#`#>DMV/#B3+`$X:!P`.&@4`'AH$`"Y9\0).O_
+M__[CH&`!X<`E%N`$0`;A@B44X:``!^6?$`CK___^X:``!ND;J/```$`8X:#`
+M#>DMV!#B3+`$X:!``>-1``6*`"OCY9\0&.O___[B```OX:`$,.(```'I&Z@0
+MX^```.D;J!```$`<X:#`#>DMV##B3+`$X:!0`.&@0`+EGQ`XZ____N/`*0;C
+MPB`#XX(I`N-4```3@B@!X:``!>6?$!CK___^Y9\P%.>5$`/C@10!X:``!>O_
+M__[I&Z@P``!`%```*ICAH,`-Z2W8,.),L`3AH%``X:!``>6?$"CK___^X\`H
+M#N/"(&#B!$`'Y9\P&.>3,03A@B`#X:``!>6?$`3K___^Z1NH,```0!```"=`
+MX:#`#>DMV##B3+`$X:!0`.&@2`+AH$@DXH`-JN*``!+CH"`&Z____N6?,&#G
+MU2`#Y9\P7.?5,`/A@B0#Y9\P5.?5,`/A@B@#Y9\P3.?5,`/A@BP#X:``!>6?
+M$$#K___^Y9\P/.?5(`/EGS`XY]4P`^&")`/AH$D$X:!)).&"*`3AH``%Y9\0
+M(.O___[I&Z@P```JD@``*I,``"J4```JE0``@`@``"J6```JEP``@`SAH,`-
+MZ2W8<.),L`3AH$``Y9\02.O___[AH%``X:``!.6?$#SK___^X:!@`.&@``3E
+MGQ`HZ____N&@(`#A4``%,H9@`>&@$`;CH```X:`P`>.@0`#AA!`"X:```^D;
+MJ'```(!,``"`4.&@P`WI+=@`XDRP!.6?$`3K___^Z1NH````@$SAH,`-Z2W8
+M$.),L`3AH$``Y9\0%.O___[C@"0!X:``!.6?$`3K___^Z1NH$```@"#AH,`-
+MZ2W8<.),L`3AH&``Y9\02.O___[AH%F@X:!;A>&@6Z7C%0P!%9\P-!`E4`,1
+MX%`%X:``!N6?$"CK___^X:!``.&@``;EGQ`<Z____N`D0`#@)$`%X:``!.D;
+MJ'```)AD```!_P``@%```(!,X:#`#>DMV!#B3+`$X:!``.6?$##K___^X@``
+M_^(`$`_CH"``Y90QS.%3`B`:`"R5XZ`^'>&4,+/A4P`!`Z`@`>&@``+I&Z@0
+M``!`(.&@P`WI+=@PXDRP!.&@4`#AH$`!Y9\0<.O___[EE#``X(```^6$``#A
+MH``%Y9\07.O___[EE#`$X(```^6$``3AH``%Y9\02.O___[EE#`,X(```^6$
+M``SAH``%Y9\0-.O___[EE#`(X(```^6$``CAH``%Y9\0(.O___[EE#`0X(``
+M`^6$`!#I&Z@P``"`D```@(P``("4``"`B```@)CAH,`-Z2W8<.),L`3AH%``
+MX:!``>&@8`#C40`(F@`LS.6?$$3K___^X50``)H`+-#EGS`XYX9``^.@``#I
+M&ZAPX:``!>&@$`3K___^X:`@`.&@``7EGQ`8Z____N6?,`SGA4`#XZ```>D;
+MJ'```/__```M-```$'#AH,`-Z2W8$.),L`3AH$``Y9\0%.O___[AH!@`X:`8
+M(>&@``3K___^Z1NH$```$'#AH,`-Z2W8\.),L`3AH%``X:!@`>&@<`#EGQ!H
+MZ____N%6``":`"SYX^`@`.6?,%CGA2`#XZ```.D;J/#AH``%Y9\02.O___[C
+MP$U_X\1`/^&@``7AH!`&Z____N&@"8#AH`F@X81``.&@``7EGQ`<X:`@!.O_
+M__[EGS`,YX5@`^.@``'I&ZCP```?_P``+3@``(`4X:#`#>DMV!#B3+`$X:!`
+M`.6?$!3K___^X:`9@.&@&:'AH``$Z____ND;J!```(`4Y9\P#.?0``/B(``!
+MX@```>&@\`X``"THX:#`#>DMV##B3+`$X:!``.&@4`#C40``"@`M,N6?$%#K
+M___^X\`D`>&@``3EGQ!`Z____N6?(#SGE#`"X\,T`>H`+3OEGQ`HZ____N.`
+M)`'AH``$Y9\0&.O___[EGR`4YY0P`N.#-`'GA3`"XZ```>D;J#```(`$```M
+M*.&@P`WI+=CPXDRP!.&@4`#AH&`!X:!P`.6?$&CK___^X58``)H`+4_CX"``
+MY9\P6.>%(`/CH```Z1NH\.&@``7EGQ!(Z____N/`17_CQ$@_X:``!>&@$`;K
+M___^Y9\P,.`#.`#AA$`#X:``!>6?$!SAH"`$Z____N6?,`SGA6`#XZ```>D;
+MJ/```!__```M/```@!0?_P``X:#`#>DMV!#B3+`$X:!``.6?$!CK___^Y9\P
+M%.``,`/AH!@CX:``!.O___[I&Z@0``"`%!__``#CH``!X:#P#N&@\`[CH```
+MX:#P#N&@\`[AH/`.X:#`#>DMV`#B3+`$Y9\0".O___[B``#_Z1NH````G!SA
+MH,`-Z2W8`.),L`3EGQ`(Z____N(```?I&Z@```"`6.&@P`WI+=@`XDRP!.(!
+M(`?EGQ`$Z____ND;J````(!8Y9\P!.>0``/AH/`.```M#.&@P`WI+=@`XDRP
+M!.6?,"#GD"`#XU(``!H`+:+EGS`4YX`0`^.@``'I&Z@`Z____ND;J````!`X
+M```M#.&@P`WI+=@`XDRP!.-1``$:`"VSXU(``9H`+:_C4@`%&@`ML>.@``#I
+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
+M4P`!B@`Q/>&@``;CH!`4Z____N.`*P'AH``&XZ`0%.O___[AH``&X:`0!^O_
+M__[C4```"@`QC^4;$%3C40`&"@`Q4N66,@3C$P`#"@`Q4N&@``;EGQ-XZ___
+M_N/`(@+EEC($X@,P`>&"+H/AH``&Y9\37.O___[AH``&X:`0!^L`-8GAH``&
+MY1L09.L`,U?C4```"@`QC^.@/W+AEB"SY9\S,.%2``,:`#%FX=<PLN,3`(`*
+M`#%FX:``!N6?$QCEGR,8Z____N&@``;EGQ,0XZ`@`>O___[AH``&Y9\3!.O_
+M__[AH`D`X:`)(.'7,++C$P`@$:`Q`!6?(NP0@Q.2$:`"(P6?,N0`@R.0`:`!
+MH^*``&3K___^X:``!N6?$M#K___^XX`@`>&@``;EGQ+`Z____N&@``;EGQ*T
+MXZ`@`>.@,`#K___^X:``!N4;$&3K___^XU```!H`,9'AUS"RXQ,`(`.#,`(!
+MQS"RXZ`@`^H`,@#EGS)\YYHP`^-3```*`#&<X:``!N6?$FSCH"H?Z____N.@
+M(`'EGS)@YXH@`^.@0`#CH%`!X:`1!.*!&@'AH"05X:``!NO___[BA$`!XU0`
+M"=H`,9[CH$``X:``!N&@$`3K___^XH1``>-4``G:`#&GX:``!N.@$*3EGR(0
+MZ____N&@``;CH!"HXZ`@`>O___[AH``&XZ`0K..@(`'K___^X:``!N6?$>CK
+M___^X:`@`.&@``;EGQ'8Z____N&@``;CH!"@Y9\AS.O___[EGT'(Y9\QP.>*
+M,`3AH``&XZ`0K.O___[C@"@'X:``!N.@$*SK___^Y1LP5.-3``8:`#';X:``
+M!N.@$*#K___^XX`J`>&@``;CH!"@Z____N>:,`3C@SH!YXHP!.6?,7#GEC`#
+MXU,``!&@``8;___^X:``!N6?$5SK___^X\`E!N&@``;EGQ%,Z____N6?,4CG
+MFA`#XW$``1&@``8;___^Y9\Q..>:$`/C<0`!$:``!AO___[EGS$HYYH0`^-Q
+M``$1H``&&____N66(?CC4@``"@`Q_.&@``;EGQ!PZ____N4;$%3EAA'<XZ``
+M`>D;K_#EFQ`$Y9$P`.-3```5@2``XZ```.D;K_```(!,``"`4```@%@``(`$
+M``!`$```0!0``$`8```0<```$6P``!%P```1;@``$7(``$#\```G8```+W0`
+M`"H<``"`'```F'@``(!(```JC```*HT``"J.```JCP``*I```"J1```JD@``
+M*I,``"J4```JE0``@`@``"J6```JEP``@`P``(`8```M,```F40``/$;``#8
+M"```!0(``)@<``"9%+HNBZ/,S,S-``"88```+1```)D@```M%``!``$``!"P
+M``@)90``*I@``!!0``"`(```+30``"TX```M/.&@P`WI+=@`XDRP!..@$`+K
+M`#,JZ1NH`.&@P`WI+=@0XDRP!.&@0`#CH!``XZ`@`>O___[C4```"@`R5>&@
+M``3CH!`3ZP`S*N-0```*`#)5Y9\`".O___[CH``!Z1NH$```"#3AH,`-Z2W8
+M,.),L`3AH%``X:`8`>&@2"'CH!``XZ`@`>O___[C4```"@`RN^($/A_C4P#`
+M"@`R@\H`,FOC4P"@"@`R=.-3`+`*`#)TZ@`RJ^-3#04*`#*5R@`R<>-3`-`*
+M`#*#Z@`RJ^-3#A4*`#*5Z@`RJ^&@``7EGQ$4XZ`@`.O___[AH``%XZ`<HN.@
+M(`/K___^X:``!>6?$/CCH"`9Z____N.@#TOK___^Z@`RJ^&@``7EGQ#8XZ`@
+M`.O___[CH#]RX94PL^-3`!(:`#*KX:``!>6?$+SCH"`8Z____N.@#TOK___^
+MX:``!>.@'*+CH"`"Z@`RJN,4`!`1H``%%9\0C!.@(`,!H``%!9\0@`.@(`#K
+M___^XZ`_<N&5,+/C4P`2&@`RJ^&@``7EGQ!DXZ`@&.O___[CH`]+Z____N&@
+M``7CH!RBXZ`@`.O___[AH``%XZ`0$^L`,RKC4```"@`RN^6?`##K___^X:``
+M!>.@$`#CH"`!Z____N-0```*`#*[X:``!>.@$`#K`#,JZ1NH,```F`0``)A\
+M```(-.&@P`WI+=_PXDRP!.)-T`3AH&``X:!P`>&@H`+AH(``Z____N&@4`#C
+M4```"@`S(^6?05SGEC`$XU,```H`,OSAH``&Y9\13.O___[B$`@!&@`R_.>&
+M``3AH``&Y9\1..O___[E"P`LX:``!N6?$2SK___^X:!``.&@``;EGQ$@Z___
+M_N&@,*3E&R`LX(,PHN&P$Z,#H#``$Z`P`>&P0R0#H#``$@,P`>-3```*`#+\
+MXF"0`.&@``GK___^X@"0/^4;`"SAH!`$Z____N(`0!_AH``&Y9\0O.O___[A
+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
+MGR'`X98@LN&#,8+E@3#\Z@`TUN6?,;#AD)"SY9\QK.&0,+/E"S`TY9\QI.&0
+M@+/EGS&@Z@`TSN6?,9SAD)"SY9\QF.&0,+/E"S`TY9\QD.&0@+/EGS&,X98P
+ML^4+,##C4P``$Z"@``.@H`'J`#36XZ```.D;K_#EGU$\X(51!^650(3CQ$#`
+MX:``"..@$`3K___^X:`S"N&#,X#B`S#`X81``^6%0(3EE4"0X\1`!^&@``CC
+MH!`$Z____N&@`*#B```'X81``.6%0)#CQ$"`X:``">.@$`/K___^X:`#@.(`
+M`(#AA$``Y85`D.650)SCQ$`#X:``">.@$`/K___^X:``H.(```/AA$``Y85`
+MG./$0!SE&P`TXZ`0`^O___[AH`$`X@``'.&$0`#EA4"<Y94@S./"(`CE&Q`P
+MX:`Q@>(#,`CA@B`#Y84@S..@0`#EGU!DX(0PA.>5$0/@@S`'YY4A`^4;`"SK
+M___^XH1``>-4`!B:`#4-XZ`@`.6?,&CGAB`#XZ```>D;K_````3J```15```
+M$58``!%8```16@``$5P``!%>```67```$6```!%B```0V```$-X``$),```1
+MS@``$=```!',```19```$68``!#:```0X```$6@``!%J```0W```$.(``"T@
+MX:#`#>DMV##B3+`$X:!0`.'2,++B`SX>XU,`P`H`-4;*`#5`XU,`H`H`-43J
+M`#5NXU,-!0.@,``*`#5'Z@`U;N.@,`'J`#5'XZ`P`N"`((/EGS#(X9+`L^6?
+M,,3ADC"SX8S#`^6?,+SADC"SX8S&`^6?,+3ADC"SX8S)`^6?,*SADC"SX8S,
+M`^6?,*3ADD"SY9\PH.&2,+/AA$,#Y9\PF.&2,+/AA$8#Y9\PD.&2,+/AA$D#
+MY9\PB.&2,+/AA$P#XU$``0H`-6HZ`#5PXU$``@H`-6SJ`#5NX:!`#.H`-7#A
+MH,`$Z@`U<..@``#I&Z@PY9\P4.>`$`/AH``%Y9\02.&@(`SK___^X:``!>6?
+M$#SAH"`$Z____N.@``'I&Z@P```0Z@``$/```!#V```0_```$0(``!$(```1
+M#@``$10``!$:```1(```+0P``)E@``"99.&@P`WI+=GPXDRP!.&@4`#AH'`!
+MX:!@`.'1,++B`SX>XU,`P`H`-:C*`#67XU,`H`H`-:;J`#6JXU,-!1H`-:KC
+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
+MB""SXZ`I`N6?,F3AB""SY9\R8.&((+/EGS)<X9@PL^-3```*`$$KXZ`_=>&5
+M,+/B`S#PXU,`$!H`02OAH``%XZ`;)N6?(C3K___^XZ`.?>O___[EGT(HX:``
+M!>O___[AA0"TX:``!>.@&R;CH"`'Z____N.@#GWK___^X94PM.(#,/#C4P`@
+M"@!!*^.@,`WJ`$&#X:``!>.@$+_B2R`JZ____N-0```*`$&"Y9\QU.%;$KKA
+MB!"SXZ`O@N&%$++AH``%Z____N-0```*`$&"Y94QS.-3``H*`$%%XU,`"0H`
+M047C4P`*&@!!2>.@/AWAE3"SXU,``XH`04GAH``%XDL0,.O___[J`$%>Y94Q
+MS.-3``L34P`'&@!!4>&@``7B2Q`PZ____NH`05[CH#]UX94PL^(#,/#B0S`P
+MXU,`/XH`05OAH``%XDL0,.O___[J`$%>X:``!>)+$##K___^XU````H`083E
+MGS$<YY@P`^6%,<#AH``%Z____N.@<`#AH$`'Y9]A!.6?D03B9!`?X:``!>)+
+M("KK___^XU````H`08+A6S*ZX(=P`^"(((3AH#0CY\(P!N5;,"GGPC`)XH1`
+M`>-4``*:`$%IY9\PQ.%7``,35P```Z`P"0H`08/AH``%ZP`_).&@``7I&Z_P
+MXZ`P".4+,##C6```$:``"!O___[C6@``%1LP,!6*,`#CH```Z1NO\```100`
+M`$`@```!SP``F!@```'2``!`$``)`$,``#`!```0<```$'(``/_P``#__P``
+M$>@``!/T```1\```$_P``!2X``!&9```1FH``%`"```&:```%`0``!0(```4
+M#```%`(``!"*``!`!P```=8``!!T```K)```*I```"J1``+__>&@P`WI+=@0
+MXDRP!.&@0`#K___^Y9\P1.>4,`/C4P``$:``!!&@X`\1H/`#X:``!.O___[A
+MH``$XZ`0`>&@(`'K___^XH0=0>*!$##AH``$Z____N&@``3K___^Z1NH$```
+M*PCAH,`-Z2W?\.),L`3B3=`@X:!P`.6?(.SB2S!`Z)(``^B#``/EGS#@XDO`
+M..B3``_HC``/XZ"``.)+D$#B2Z!(X:!!".>48`GAH``'X:`0!NO___[GA``*
+MXZ!0`.&%2`7AH``'X:`0!N&@(`3K___^X:``!^&@$`;K___^X5``!!H`0??B
+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
+MH``&XZ`0T.O___[EGS`XYX8``^&@``;CH!#4Z____N6?,"CGA@`#XZ```>D;
+MK?`!!=BZ`_\`````$&P``!!4```06```$%P``!!@```09```$&CEGS`$YY``
+M`^&@\`X``"JDX:#`#>DMV?#B3+`$X:!0`.&@0`'AH'``Y9\Q!.>0@`/C6```
+MJ@!%E..@$"3CH"``Z____N&@``7CH!`DZ____N6?(.#@!"`"XZ!@`.,4`$`*
+M`$6IY9\PT.>7,`/A4P`&$X(@0.6?,,3GES`#XU,``!."+`'EGS"XYY<P`^-3
+M```3@B"`Y9\PK.>7,`/C4P``$X(K`>,4``$3@B`'XQ0&+@H`1;;C@B4"XQ0&
+M`A.&9`'C%`4!$X9B`N,4!0(3AF,!XQ0$`A.&9`+C%`$!$X(G`N&@``7CH!"@
+MZ____N&@``7CH!"LZ____N/`)+?A@B`&X:``!>.@$*SK___^Y9\P(.>'0`/C
+M5```J@!%R^&@``7CH!`DXZ`@`>O___[AH``(Z1NI\```*J0!!=BZ```K+```
+M*S```"LT```K..6?,`3AD`"SX:#P#@```>KAH,`-Z2W8`.),L`3AH!@!X:`8
+M(>6?,##AD#"SX5,``9H`1>CAH!*!XH$;(N*!$!SK___^XQ`)`@H`1>CCH``!
+MZ1NH`..@``#I&Z@````!ZN&@P`WI+=GPXDRP!.&@<`#AH!@!X:"((>6?,23A
+MD#"SX5,`"(H`1??CH```Z1NI\.&@0HCBA%LBXH50%.&@$`7K___^X:!@`.*$
+M2R+AH``'X:`0!..@(`#K___^XH00!.&@``?CH"``Z____N*$$`CAH``'XZ`@
+M`.O___[BA!`,X:``!^.@(`#K___^XH00$.&@``?CH"``Z____N&@``?AH!`%
+MXZ`@!^O___[BA!`8X:``!^.@(`#K___^XH1`'.&@``?AH!`$XZ`@`.O___[C
+M5@`$&@!&.N6?,&CGES`#XQ,#`@H`1CKBB$!`X:!(!.&@1:3BA$LBX:``!^&@
+M$`3CH"``Z____N*$$`3AH``'XZ`@`.O___[BA!`(X:``!^.@(`#K___^XH1`
+M#.&@``?AH!`$XZ`@`.O___[CH``!Z1NI\````>H``"XLX:#`#>DMV'#B3+`$
+MX:!@`.&@``+AH!@!X:`8(>6?,(SAEC"SX5,``8H`1DOCH```Z1NH<.-2```#
+MH%```:`@!0H`1EWETE`%Y=(P!.&#5`7ETB`#Y=`P`N&@.`/A@RP"Y=`P`>&"
+M)`/ET#``X8(@`^&@/X7A@R"BX:!0I>&@0H'BA!LBXH$0&.&@``;K___^XH1+
+M(N*$0!SCA2D"X:``!N&@$`3K___^XZ```>D;J'````'JX:#`#>DMW_#B3+`$
+MXDW0'.&@@`#AH%`"Y0LP,.&@&`'AH!@AY0L0+.4+`#3B@!X>Y9L@!.6?-`CC
+M4@``$:#``P.@P`#AT3"ZY1L@+.%3``*:`$:OY=4P`.-3``67G_$#Z@!&KP`!
+M&H```1HP``$:.``!&L0``1I0``$:N..@,`7J`$:MY=$P`>&@,2/B$P`!$Z`@
+M!AH`1J7J`$=[XZ`P!.4+,#SEGS.<YY`P`^,3`P(*`$:QY1LP+.*#($#AT3"Z
+MX5(``[H`1K'J`$:OX=4PLN-3``2:`$:OX=4PLN-3``6*`$:GXZ`@`.4+(#SJ
+M`$:QX=4PLN-3``V#H#`#DZ`P`>H`1JWCH#`'Y0LP/.H`1K'CH```Z1NO\.75
+MD`3EU3`%X8F4`^75,`;AB9@#Y=4P!^&)G`/@*9`,Y=4@".75,`GA@B0#X"(@
+M#.&@.`+AH#@CY0LP..75<`KEU3`+X8=T`^75,`SAAW@#Y=4P#>&'?`/@)W`,
+MY=4@#N75,`_A@J0#X"J@#.&@.`KAH*@CY=5@$.75,!'AAF0#Y=4P$N&&:`/E
+MU3`3X89L`^`F8`SAU3"RXU,`#9(&8/_E&R`\XU(`!!H`1UKEGS)\YY@P`^,3
+M`P(*`$=:Y1L@+.*",$#AH#@#X:`X(^4+,$#AH$*"XH1+(N'@(`GAH``(X:`0
+M!.O___[BA!`$Y1LP..'@(`/AH``(Z____N*$$`CAH``(X:`@!^O___[BA!`,
+MX:``".&@(`KK___^XH00$.&@``CAH"`&Z____N*$0!3AH``(X:`0!.4;(#SK
+M___^X:``".4;$"SE&R`PZ____N75P!3EU3`5X8S$`^75,!;AC,@#Y=4P%^&,
+MS`/EU6`8Y=4P&>&&9`/EU3`:X89H`^75,!OAAFP#Y9\QI.4;(#3GDC`#XQ,`
+M!`.@<``%"W!$`:"@!PH`1RGEU2`>Y=4P'^&"I`/EU2`<Y=4P'>&")`/E"R!$
+MY=5P(.75,"'AAW0#Y=4P(N&'>`/EU3`CX8=\`^4;,$#AH$*#XH1+(N&@``CA
+MH!`$X:`@#.O___[BA!`$X:``".&@(`KK___^XH00".&@``CAH"`&Z____N*$
+M$`SAH``(Y1L@1.O___[BA!`0X:``".&@(`?K___^XH00%.&@``CCH"`'Z___
+M_N*$$!CAH``(XZ`@`.O___[BA$`<X:``".&@$`3CH"``Z____N4;("SAH$*"
+MXH1+(N&@``CAH!`$X:`@">O___[BA$`$X:``".&@$`3E&R`XZ____NH`1WKE
+M&S`LX:!"@^*$2R+AH``(X:`0!.&@(`GK___^XH00!.&@``CE&R`XZ____N*$
+M$`CAH``(X:`@!^O___[BA!`,X:``".&@(`KK___^XH00$.&@``CAH"`&Z___
+M_N*$0!3AH``(X:`0!.4;(#SK___^X:``".4;$"SE&R`PZ____N.@``'I&Z_P
+MJJJJJ@``+BP``"XPX:#`#>DMV`#B3+`$XH`]JN*#,!#AH``!X:`0`^.@(`;K
+M___^Z1NH`.&@P`WI+=@`XDRP!.*`#:KB@``0XZ`@!NO___[CH``!Z1NH`.&@
+MP`WI+=@`XDRP!.*`/:KB@S`<X:```>&@$`/CH"`&Z____ND;J`#AH,`-Z2W8
+M$.),L`3AH$``XH`-JN*``!SCH"`&Z____N6?,%CGU"`#Y9\P5.?4,`/A@B0#
+MY9\P3.?4,`/A@B@#Y9\P1.?4,`/A@BP#X:``!.6?$#CK___^Y9\P-.?4(`/E
+MGS`PY]0P`^&")`/AH``$Y9\0).O___[CH``!Z1NH$```*IP``"J=```JG@``
+M*I\``(#@```JH```*J$``(#DX:`8`>.@/X+AD#"SX5,((0.@,`P*`$?/Y9\P
+M'.&0,+/C$P"``Z`P`Q.@,`OC4@``%8(P`..@``#AH/`.```0<N&@(`#CH!``
+MY9\P;.&0,+/A4P`!"@!'W^.@$`'EGS!<X9`PL^-3```#@1!"Y9\P4.&0,+/C
+M4P``$X$0!.6?,$3AD#"SXU,```H`1_'EGS`XX9(@L^6?,#3A4@`#"@!'\>.!
+M$`CEGS`HX9`PL^-3```#@1`@X:```>&@\`X``!"&```0=@``$(H``!",```!
+MR@``#A$``!!XX:#`#>DMV'#B3+`$X:!0`.6?,&SAD$"SX:`P!.($0!SAH$%$
+MX@-@`N&@8,;AH!`$X:#@#^60\:SAH``%XZ`;)NO___[C@"H"X:``!>.@&R;K
+M___^X:``!>&@$`3AH.`/Y97QL.%0``8")B`!$:`@!N&@``7AH!`$X:#@#^65
+M\;CI&ZAP```03.&@P`WI+=@PXDRP!.&@4`#AH$`!Y9\0*.O___[CP"@.X\(@
+M8.($0`?EGS`8YY,Q!.&"(`/AH``%Y9\0!.O___[I&Z@P``!`$```1O#AH,`-
+MZ2W8,.),L`3AH%``X:!(`N&@2"3B@`VJXH``%N.@(`;K___^Y9\P8.?5(`/E
+MGS!<Y]4P`^&")`/EGS!4Y]4P`^&"*`/EGS!,Y]4P`^&"+`/AH``%Y9\00.O_
+M__[EGS`\Y]4@`^6?,#CGU3`#X8(D`^&@203AH$DDX8(H!.&@``7EGQ`@Z___
+M_ND;J#```"J6```JEP``*I@``"J9``"`"```*IH``"J;``"`#.&@P`WI+=AP
+MXDRP!.&@0`#EGQ!(Z____N&@4`#AH``$Y9\0/.O___[AH&``X:``!.6?$"CK
+M___^X:`@`.%0``4RAF`!X:`0!N.@``#AH#`!XZ!``.&$$`+AH``#Z1NH<```
+M@$P``(!0X:#`#>DMV`#B3+`$Y9\0!.O___[I&Z@```"`3.&@P`WI+=@PXDRP
+M!.&@4`#EGQ`HZ____N.`1`'AH``%Y9\0&.&@(`3K___^X:``!>6?$`CAH"`$
+MZ____ND;J#```(`@X:#`#>DMV##B3+`$X:!``.6?,*3GD#`#XU,```H`2+OA
+MTS"RXQ,`(`H`2+OCH%``X:``!>61,`#A50`#*@!(J>&@P`/@@#`!Y=,@!.'3
+M,-3C4P``J@!(IN(",'_A4P`%(:!0`^*```'A4``,.@!(GN&@``3EGQ!$Z___
+M_N-5```*`$BWX:`PI>(#,/_C4P`"B@!(M^.`)`+AH``$Y9\0'.O___[I&Z@P
+MX\`D`N&@``3EGQ`(Z____ND;J#```!`X``"`!.&@P`WI+=APXDRP!.&@8`#E
+MGQ!(Z____N&@6:#AH%N%X:!;I>,5#`$5GS`T$"50`Q'@4`7AH``&Y9\0*.O_
+M__[AH$``X:``!N6?$!SK___^X"1``.`D0`7AH``$Z1NH<```F&0```'_``"`
+M4```@$SAH,`-Z2W8$.),L`3AH$``Y9\0,.O___[B``#_X@`0#^.@(`#EE#',
+MX5,"(!H`2.KCH#X=X90PL^%3``$#H"`!X:```ND;J!```$`@X:#`#>DMV##B
+M3+`$X:!0`.&@0`'EGQ!PZ____N64,`#@@``#Y80``.&@``7EGQ!<Z____N64
+M,`3@@``#Y80`!.&@``7EGQ!(Z____N64,`S@@``#Y80`#.&@``7EGQ`TZ___
+M_N64,`C@@``#Y80`".&@``7EGQ`@Z____N64,!#@@``#Y80`$.D;J#```("0
+M``"`C```@)0``("(``"`F..@``'AH/`.X:#`#>DMV`#B3+`$Y9\0".O___[B
+M``#_Z1NH````G!SAH,`-Z2W8`.),L`3EGQ`(Z____N(```?I&Z@```"`6.&@
+MP`WI+=@`XDRP!.(!(`?EGQ`$Z____ND;J````(!8Y9\P!.>0``/AH/`.```N
+M'.&@P`WI+=@`XDRP!.6?,"#GD"`#XU(``!H`23[EGS`4YX`0`^.@``'I&Z@`
+MZ____ND;J````!`X```N'..@``'AH/`.X:#`#>DMV'#B3+`$X:!``.&@4`'A
+MH&``XU$`!9H`25#EGQ!(Z____N%5``":`$E5X^`@`.6?,#CGAB`#XZ```.D;
+MJ'#AH``$X:`0!>O___[AH"``X:``!.6?$!CK___^Y9\P#.>$4`/CH``!Z1NH
+M<```__\``"Y8```0<.&@P`WI+=@0XDRP!.&@0`#EGQ`4Z____N&@&`#AH!@A
+MX:``!.O___[I&Z@0```0<.&@P`WI+=CPXDRP!.&@4`#AH&`!X:!P`.6?$&CK
+M___^X58``)H`27[CX"``Y9\P6.>%(`/CH```Z1NH\.&@``7EGQ!(Z____N/`
+M3?_CQ$`_X:``!>&@$`;K___^X:`)`.&@"2#AA$``X:``!>6?$!SAH"`$Z___
+M_N6?,`SGA6`#XZ```>D;J/```#__```N7```@!3AH,`-Z2W8$.),L`3AH$``
+MY9\0%.O___[AH!D`X:`9(>&@``3K___^Z1NH$```@!3EGS`,Y]```^(@``'B
+M```!X:#P#@``+BSAH,`-Z2W8,.),L`3AH$``X:!0`.-1```*`$FWY9\04.O_
+M__[CP"0!X:``!.6?$$#K___^Y9\@/.>4,`+CPS0!Z@!)P.6?$"CK___^XX`D
+M`>&@``3EGQ`8Z____N6?(!3GE#`"XX,T`>>%,`+CH``!Z1NH,```@`0``"XL
+MX:#`#>DMV/#B3+`$X:!0`.&@8`'AH'``Y9\0:.O___[A5@``F@!)U./@(`#E
+MGS!8YX4@`^.@``#I&ZCPX:``!>6?$$CK___^X\!%_^/$2#_AH``%X:`0!NO_
+M__[EGS`PX`,X`.&$0`/AH``%Y9\0'.&@(`3K___^Y9\P#.>%8`/CH``!Z1NH
+M\```/_\``"Y@``"`%#__``#AH,`-Z2W8$.),L`3AH$``Y9\0&.O___[EGS`4
+MX``P`^&@&"/AH``$Z____ND;J!```(`4/_\``.&@P`WI+=CPXDRP!.&@0`#A
+MH&`"X:`8`>&@6"'AH'``XU4`?YH`2@7CH``,Z1NH\..@&P'AH"`%Z____N)6
+M(``3H"`!X:``!.6?$!3K___^X(4@!.6?,`SGPF`#XZ```.D;J/````0$```M
+MF.&@P`WI+=APXDRP!.&@4`#B`4#_Y9\Q#.?`0`/C4@``"@!*7>?0,`/C4P``
+M"@!*7>6?8/3GD#`&X=,PLN(#/07C4PT%&@!*7>.@$`'K___^YY4P!N'3,++C
+M$PD!"@!*-N&@,*#@`@23X((@@N*"+T'@!@23X(8PAN&@,(/B@V[:XH9@#.H`
+M2DSEGS"<YY4P`^'3,/+C4P``J@!*1>&@,2#@`@23X((@@N*"(-+@!@23X(8P
+MAN&@,(/B@VTUXH9@".H`2DS@`@20X((@@N*"+UK@!@20X(8PAN&@,(/B@V[F
+MX`0$D."$0(3BA$_ZX:!)!.&@223AH``%Y9\0,.O___[AH``%Y9\0*.&@(`;K
+M___^X81(!.&@``7EGQ`8X:`@!.O___[I&ZAP```0/```$#@``!!P```0L```
+M@!3AH,`-Z2W8`.),L`3ED!'<Z____ND;J`#AH"``XU$`!@.@```!H/`.XZ``
+M`.6?,!SGTC`#X5,```&@\`[EGS`0YY(P`^-3``&3H``!X:#P#@``$),``"Y(
+MX:#`#>DMV!#B3+`$X:!``.O___[C4```"@!*W>&@``3EGQ)0XZ`@'^O___[C
+MH#]UX90@L^("(/#B0B`PXU(`/X.@(!B3H"`4X:``!.6?$BCK___^X:``!.6?
+M$B#K___^X\`M_N."((#AH``$Y9\2#.O___[AH``$Y9\2!..@(#WK___^X:``
+M!.6?$?CK___^XX`@`N&@``3EGQ'HZ____N64,<SC4P`+$U,`!PH`2J_C4P`*
+M"@!*K^-3``D*`$JOXU,`"AH`2L7CH#X=X90PL^-3``.*`$K%X:``!.6?$:CC
+MH"`FZ____N&@``3EGQ&<XZ`@#>O___[AH``$Y9\1D..@(`?K___^X:``!.6?
+M$83CH"`_Z____N&@``3EGQ%DZ____N/`)`/C@B0"Z@!*V>&@``3EGQ%0XZ`@
+M"NO___[AH``$Y9\11..@(`SK___^X:``!.6?$3CCH"`#Z____N&@``3EGQ$L
+MXZ`@(.O___[AH``$Y9\1#.O___[C@"0#X:``!.6?$/SK___^Z1NH$.&@``3E
+MGQ#LZ____N/`)`/AH``$Y9\0W.O___[AH``$Y9\0T.O___[CP"`"X:``!.6?
+M$,#K___^X:``!.6?$*3CH"`?Z____N&@``3EGQ"HXZ`@?^O___[AH``$Y9\0
+MG..@(`[K___^X:``!.6?$)#CH"`,Z____N&@``3EGQ"$XZ`@_^O___[CH#]U
+MX90@L^("(/#B0B`PXU(`/X.@(!*3H"`.X:``!.6?$#SK___^X:``!.6?$#3K
+M___^X\`-_N.@/W7AE#"SX@,P\.)#,##C4P`_DX`M3H.`+3[AH``$Y9\0".H`
+M2ML``)AP``"9^```@!P``($$``!`$```F'0``)AX``"9\```F?3AH,`-Z2W8
+M$.),L`3AH$``Z____N-0```*`$MEX:``!.6?$/#K___^X\`D`^&@``3EGQ#@
+MZ____N&@``3EGQ#4Z____N/`(`+AH``$Y9\0Q.O___[AH``$Y9\0O..@(`'K
+M___^X:``!.6?$+#K___^X\`-_N.@/W7AE#"SX@,P\.)#,##C4P`_DX`M3H.`
+M+3[AH``$Y9\0A.O___[AH``$Y9\0?..@(!_K___^X:``!.6?$'#CH"!_Z___
+M_N&@``3EGQ!DXZ`@#NO___[AH``$Y9\06..@(`SK___^X:``!.6?$$SCH"#_
+MZ____N.@/W7AE""SX@(@\.)"(##C4@`_@Z`@&).@(!3AH``$Y9\0).O___[I
+M&Z@0``!`$```@00``(`<``"8<```F'0``)AX``"9\```F?0``)GXXZ```.6?
+M,#CAH,`#X=$@L.&@$`+ATS"PX5(``XH`2WSB@``!X:`Q`.&3,+SA40`#F@!+
+M=^6?,`C@@S$`X=,`\N&@\`X``$<0X:#`#>DMV##B3+`$X:!``N&@4`/AH,``
+MXH`N'N)!,`'C4P`<EY_Q`^H`3$8``2ZL``$NX``!+OP``3$@``$O8``!,2``
+M`3$@``$Q(``!,2```3$@``$OB``!,2```3$@``$Q(``!,2```2^8``$OM``!
+M,2```3`$``$P*``!,2```2\X``$Q(``!,2```3$@``$P7``!,&P``3$@``$P
+M@.-4``(*`$NS.@!+XN-4``0Z`$O4XU0`!9H`2^+C5`!_"@!+XNH`2]3ETC`!
+MXQ,`!.H`3!+C5```"@!+XN-4``$%GS(\!Y`P`P&@/:,*`$PJXU0```H`2\7C
+M5``!!9\R)`><,`,!H#$C"@!+RNH`3$3ETC`!XQ,`"`.@```3H``!Z1NH,.(#
+M``'I&Z@PY9`QS.-3``6*`$OB&@!+U..@/AWAD#"SXU,`!XH`2^+CH``-Z1NH
+M,.-4```*`$OBXU0``1H`3$3EGQ'`Z____N&@!J#B(``!X@```>D;J##ED#'X
+MY84P`..@``#I&Z@PXU0```H`2^+C5``!!9\QD`>0,`,*`$ORZ@!+XN-4```%
+MGS&``9`PLPH`2_+C5``!"@!+]NH`3"_C4P``$Z````.@``'I&Z@PY9\Q7.&0
+M,+/C4P``&@!+XN6?,5#AD#"SXU,``!H`2^+J`$POXU0```H`2^+C5``!&@!,
+M1.6?,13GD#`#X>```^&@#Z#I&Z@PXU0```H`3!#C5``!!9\P^`>0,`,!H#&C
+M"@!,*NH`3$3ETC`"XQ,`"!.@```#H``-Z1NH,..@/;GGD#`#X@,P/^H`2^'C
+MH#VYYY`P`^(#/#_AH#0CZ@!+X>-4``:7G_$$Z@!,1``!+Y```3"H``$PN``!
+M,+@``3"X``$PN``!,+CEGS"<YY`P`^(C,`'J`$O*Z____N-0```:`$PQXZ``
+M`>D;J##B1#`"XU,`!)>?\0/J`$OB``$P\``!,/@``3$```$Q"``!,1#ET#`)
+MZ@!+X>70,`SJ`$OAY=`P#>H`2^'ET#`+Z@!+X>70,`KJ`$OAXZ``#.D;J##A
+MH"`$X:`P!>O___[I&Z@P```N+```+C```*((```N/```$(8``!",```0B@``
+M+GCAH,`-Z2W8,.),L`3B3=`$X:!0`.&@0`/AH,``XH`.'N)!,`+C4P`;EY_Q
+M`^H`3-T``3'P``$R%``!,WP``3)@``$S?``!,WP``3-\``$S?``!,WP``3*$
+M``$S?``!,WP``3-\``$S?``!,I@``3-\``$S?``!,JP``3-0``$S?``!,WP`
+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
+M&\`\X=S`LN'&P++E&P`\Y=`P!.7&,`3ET#`%Y<8P!>70,`;EQC`&Y=`P!^7&
+M,`?EGR!0YY4P`N*#,"SCH!``XZ```.B#``/GE4`"XH1`).&@``7K___^Z(0`
+M`^&@``7CH!`!Z____N.@``'I&Z_PY9L0!.61,`#C4P``%8$@`..@``#I&Z_P
+M```0.```@%@``(`$``!`$```0!0``$`8``!'6```2;```"L,```!T@``F"P`
+M`J`"```)M```$)(``!"<9F9F9P``F4P``*(H``"`8```HE0``)AX```)HP``
+M"9X``*),```K&```$'```%`"```JD```*I$``"J2```JDP``*I0``"J5```N
+M+```*IP``"J=```JG@``*I\``(#@```JH```*J$``(#D```JE@``*I<``"J8
+M```JF0``@`@``"J:```JFP``@`P``(`8```N-```$#P``)@D``"9%+HNBZ/,
+MS,S-``"8'```F`@``)PD``"88```+B```)D@```JI``("64``!!0``"`(```
+M@1@``0"J``"!'```,A```($(```0C@``$(\``"Y4``"`Z```+C```($@```N
+M6```+EP``"Y@``"`2.&@P`WI+=@PXDRP!.&@4`#ED$($XQ0``PH`4QWEGQ!H
+MZ____N/`(@+B!#`!X8(N@^&@``7EGQ!0Z____N(4,`P*`%,PXQ,`!!H`4RGA
+MH``%Y9\0..O___[CP"`<X:``!>6?$"CK___^Z1NH,.&@``7EGQ`8Z____N.`
+M(!SAH``%Y9\0".O___[I&Z@P``"91```@-#AH,`-Z2W8`.),L`3EGS`4X:#@
+M#^>0\`/C4```$Z```0.@``#I&Z@````K%.&@P`WI+=_PXDRP!.)-T`CAH%``
+MX:"@`>.@<`'AH)``Z____N&@@`#CH$``XZ`_>N&5,+/A5``#*@!36..@;WKA
+MH``%X:`0!.O___[C4```$Z!P`!H`4UCBA$`!X94PMN%4``,Z`%-.XU<``!H`
+M4USAH``'Z1NO\.&@``7EGQ'(XZ`@`>O___[CH$``X:``!>6?$;CK___^XU``
+M`!H`4VSCH``%Z____N*$0`'C5`!CF@!38>H`4V[C5`!CF@!3<..@``#I&Z_P
+MX:``!>&@$`CK___^XU````H`4]#AH``%Y9\1;.O___[AH`D`X:`)(.'8,++C
+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
+M@#$$Y1,P+.&@,(/B`S#^X8(@`^&@``7EGQ%PZ____N77,`KA5``#A9\A9(H`
+M9\+EUS`*X50``RH`9\7EGR%4YY8P`N*#,`'GAC`"Y<>`"NH`9_CC4@``&@!G
+MU.6?,3CGD"`#X\(@`N>`(`/K___^X:``!>O___[CP!P!X:``!>O___[J`&?X
+MY9\Q#.>0,`/C$P`"&@!G^.6?,0#GD#`#XU,```H`9^WK___^X\`<`>&@``7K
+M___^X:``!>6?$.#EGS#@YY4@`^O___[AH``%Y9\0U.6?,-3GE2`#Z____N&@
+M``7K___^Z@!G\>O___[C@!P!X:``!>O___[EGR"8YY8P`N.#,`+GAC`"Z@!G
+M^..@``#I&ZGPXZ```>D;J?```"Z$``"84```1(@``)A<``!$L```?X```$2<
+M``"86```1,0``"JH```JK```4M0``%+<``!2Y```4NP``%+T``!2_```F&P`
+M`)AH```JN```*KP``%,$``"B"```*L0``%,,```JR```*LP``%,8``"9)```
+M*K```"JT```N>```+GP``($L```NS```@30``"[0X:#`#>DMV'#B3+`$X:!`
+M`.&@8`#EGS"HYY!0`^.@(`#EA2`0Y9\PG.>0,`/A4P`""@!H3.65,!3C4P4#
+MA84@1)65,!228S4#E84P1.65,!SC4P4#PZ`P`-65,!S28S4#Y84P2.&@``3E
+MGQ!<Y94@1.O___[AH``$Y9\04.65($CK___^X:``!.6?$$3CH"@"Z____N&@
+M``3EGQ`XXZ`D`NO___[BAAVKXH$0).&@``3K___^XZ`P`.6%,#SEA3!`Z1NH
+M<```+H0``"Y\``"!+```@30``($P``"!..&@P`WI+=APXDRP!.&@0`#EGS$\
+MYY`0`^6?,3CGD#`#X@,P`^-3``,:`&BJY9\Q*.>04`/EU2`)XU(``Y*"(`&3
+MH!`!F@!H;N75(`KEU3`(X5(``RH`:'#B@B`!XZ`0!>O___[I&ZAPY9\P\.>0
+M(`/B`C!_XU,`/X*"('^!H".BE9\PV)>0,`.1H".CY94P*.%2``/:`&B'Y=5@
+M#.-6```:`&B1X:``!..@$`+AH"`&Z____N&@``3CH!`%X:`@!NH`:&[EE3`D
+MX5(``]H`:)CEU3`,XU,```H`:)'AH``$XZ`0`N.@(`'K___^Y=4@"^-2``&2
+M@B`!D:``!).@$`2:`&ANZ@!HJN&@``3K___^XD```N-0``&*`&BJY=4@#.-2
+M```:`&BCX:``!..@$`+K___^Y=4P"^-3```*`&BJX:``!..@$`3CH"``Z___
+M_ND;J'```!`X```N>```+H0``"KXX:#`#>DMV##B3+`$X:!``.6?,+3GD!`#
+MY9\PL.>0,`/B`S`#XU,``QH`:.'EGS"@YY!0`^75(`GC4@`#DH(@`9.@$`&:
+M`&C3Y9\PB.>0(`/B`C!_XU,`/X*"('^!H".BE9\P<)>0,`.1H".CY94P).%2
+M``/:`&C5Y=4@"^-2``&*`&CAXH(@`>&@``3CH!`$Z____ND;J##AH``$Z___
+M_N)```+C4``!B@!HX>75,`OC4P``"@!HX>&@``3CH!`$XZ`@`.O___[I&Z@P
+M```0.```+G@``"Z$```J^.&@P`WI+=GPXDRP!.&@0`#AH'`!X:!@`.6?,@SG
+MD!`#ZP!EW>"`,0#@@#"#X(11@^*%7;KBA5`(Y9\Q\.>$4`/EE#'<XU,``06?
+M(>0'E#`"`X,P`@>$,`(5GR'4%Y0P`A/#,`(7A#`"Y90QW.-3``$*`&DCY9\Q
+MO.>6(`/B@B`!YX8@`^&@``3CH!`!XZ`@`.O___[AH``$XZ`0!>.@(`#K___^
+MX:``!..@$`3CH"``Z____N&@``3CH!`"XZ`@`.O___[AH``$XZ`0`^.@(`#K
+M___^X:``!.O___[C@!P!X:``!.O___[AH``$ZP!H'^D;J?#EGS$XYY0P`^(#
+M@`/C6``#&@!I<.-7```*`&E!Y=4@">&@``3CH!`!Z____N75(`KAH``$XZ`0
+M!>O___[EU2`,XU(``!.@(``#H"`!X:``!..@$`+K___^Y=4@#>&@``3AH!`(
+MZ____N75(`OAH``$XZ`0!.H`:53AH``$XZ`0`>.@(`3K___^Y=4@".&@``3C
+MH!`%Z____N&@``3CH!`"XZ`@`>O___[AH``$XZ`0`^.@(`'K___^X:``!..@
+M$`3CH"`"Z____N6?,'CGEC`#XU,```H`:6GAH``$Z____N/`'`'AH``$Z___
+M_N&@``3K`&@?X:``!.6?$$SCH"@"Z____N&@``3EGQ!`XZ`D`NO___[I&ZGP
+MX:``!.L`:!_AH``$Z____N.`'`'AH``$Z____ND;J?```!`X```NA```+G@`
+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
+M___^XI1``0H`<C?CH$``Y9]12."$,(3GE1&#X(<Q!.63(`3AH``*Z____N*(
+M@`'C&``_`Z```0O___[BE$`!"@!R0^.@0`#EGU$4X(0PA.>5$8/@AS$$Y9,@
+M".&@``KK___^XHB``>,8`#\#H``!"____N*40`$*`')1XZ!``.6?4.#@A#"$
+MYY41@^"',03EDR`,X:``"NO___[BB(`!XQ@`/P.@``$+___^XH1``>-4`">:
+M`')?XZ!``.6?4,S@A#"$YY41@^"',03EDR"LX:``"NO___[BB(`!XQ@`/P.@
+M``$+___^XH1``>-4``R:`')NXZ`@`.6?,)3E&Q`TYX$@`^.@``'I&Z_P```N
+M3```!.H``!%4```15@``$5@``!%:```17```$5X``!9<```18```$6(``!#>
+M```1+```$6P``!%P```0X```$2X``!%N```0X@``$3```&;L``!F]```9PP`
+M`&<D```!+@```0X```$!```!'P```2(```$7```!&@```=(```$9``!JY```
+M+B3AH,`-Z2W?\.),L`3B3=_WY0L3Y.4+(^CE"S/LY0L#\..@/W7AD""SX@(P
+M\.)#,##C4P`_B@!RO.-2`$434@`U"@!RN>-2`$8*`'*YXU(`-AH`<KSCH!`"
+MY0L3].H`<K[CH"`!Y0LC].4;P^SAW#"RX@,^'^-3`-`*`'+<R@!RR>-3`*`*
+M`'+6XU,`P`H`<MSJ`'07XU,.%0H`<M#*`'+.XU,-!>H`<L_C4PL"&@!T%^4;
+M$_#B@9UWXHF0..6?-9#AD2"SZ@!RXN4;(_#B@IP>XHF0!.6?-7SADB"SZ@!R
+MXN4;,_#B@YP>XHF0$.6?-6CE&\/PX9P@L^'9,+;@$@`#"@!T..4;$^CAT3#P
+MX:`X@^&@."/E"S0`Y1LCY.'2,/#AH#B#X:`X(^4+,_SEGR4LY9\U+.)+P"CA
+MC""SY9\U).)+$"CA@2"SXZ"@`.'9(+;AH'`*X:`W4N,3``$*`',#XUH``8H`
+M=!?B2\`HX(PPBN)#/COAPW"PXHJ@`>*'<`'C5P`#F@!R^>4;$^SAT0"PX=D@
+MM.)+/_?EC3``Y9D0`.)+/C[K`'1AXZ"@`.4;(^#E"R/XY1LSW.%2``.*`'-]
+MY1O#^.",,(S@8S&#Y9D@".""@0/EGS2,XDL0*.&1(+/EGS2$X5(((QH`<SKE
+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
+MDS"UX5(``PH`@,?CH```Z1NO\.&@P`WI+=WPXDRP!.)-T`3AH(``X:!P`>&@
+M8`+CH*`!XZ!0`.%5``(J`(%.X(=!A>&@``CAH!`$XDL@)N)+,"CK`("2XU``
+M`!5;,"45Q#`&%5LP)Q7$,`<#H*``XH50`>%5``8Z`($_X:``"ND;K?#AH,`-
+MZ2W8,.),L`3AH%`!X:!``..@`*SK___^Y9\PM.>$``/C4```"@"!:>.@#`'E
+MGS"DYX0``^O___[EGS"<YX0``^-0```*`(%IXZ`,!NO___[EGS"(YX0``^-0
+M```:`(%LXZ`P`N6%,`#I&Z@PY9\@<.6?,'#GA"`#Y9\@;.6?,&SGA"`#Y9\@
+M:.6?,&CGA"`#Y9\@9.6?,&3GA"`#Y9\@8.6?,&#GA"`#Y9\@7.6?,%SGA"`#
+MY9\@6.6?,%CGA"`#Y9\@5.6?,%3GA"`#XZ```>D;J#```"Y,``!$W```1-@`
+M`"L$``(!8```*P@``>_@```K#``!]_0``"L0``'PO```*Q0``?-L```K&``!
+M_[P``"L<``($V```*R`````````K)"A0%BQ8*/^@_Z/_GO^@_Z/_H```````
+M!0`*`!0`'@`R`$8`50!:`%\`9`````H`%``>`"@`,@`\`$8`4`!:`&0`!``&
+M``D`#````,(```#$````Q0```-````#:````Y````,(```##````U````/(`
+M``$-```!*````,\```#*``(A4``!`4``!`"@``@`P``@`-``0`%0&9@!)`80
+M)@``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````````!=
+MD`````````````````````````````````````````````!=N```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````#_______\`````F`````!'``"8"````````)@,
+M"82.I@``F!`],N````"8%```!VL``)@<````````F"`"`@(```"8)```#@X`
+M`)@H"@("`0``F"P``V_\``"8,````````)@T```.#@``F#@````'``"8/``"
+M`0```)A`B6,`````F$03<A:<``"82``8MC,``)A,$H1A/```F%`-Z+C@``"8
+M5``'2%D``)A8?H"^N@``F%PQ.F9>``"88```'0@``)AD``'.````F&A`FD&0
+M``"8<`````\``)AT````@```F'@````$``"9`````````)D$````````F0@`
+M``````"9#`"``````)D0`````P``FP````````";!````"```)L(````$```
+MFPP````P``";$`````@``)L4````*```FQ@````H``";'`````0``)L@````
+M)```FR0````4``";*````#0``)LL````#```FS`````L``";-`````(``)LX
+M````(@``FSP````2``";0````#(``)M$````"@``FT@````J``";3`````$`
+M`)M0````(0``FU0````1``";6````#$``)M<````"0``FV`````I``";9```
+M``4``)MH````)0``FVP````5``";<````#4``)MT````#0``FW@````M``";
+M?`````,``)N`````(P``FX0````3``";B````#,``)N,````"P``FY`````K
+M``";E`````<``)N8````)P``FYP````7``";H````#<``)ND````#P``FZ@`
+M```O``";K````"\``)NP````+P``F[0````O``";N````"\``)N\````+P``
+MF\`````O``";Q````"\``)O(````+P``F\P````O``";T````"\``)O4````
+M+P``F]@````O``";W````"\``)O@````+P``F^0````O``";Z````"\``)OL
+M````+P``F_`````O``";]````"\``)OX````+P``F_P````O``":`````!T`
+M`)H$````70``F@@```"=``":#````-T``)H0```!'0``FA0````A``":&```
+M`&$``)H<````H0``FB````#A``":)````#$``)HH````<0``FBP```"Q``":
+M,````!P``)HT````7```FC@````I``":/````&D``)I`````J0``FD0````@
+M``":2````!D``)I,````60``FE````"9``":5````#```)I8````!0``FEP`
+M```E``":8````&4``)ID````I0``FF@````H``":;````&@``)IP````'P``
+MFG0````>``":>````!@``)I\````6```FH````"8``":A`````,``)J(````
+M!```FHP```!$``":D````(0``)J4````$P``FI@````2``":G````%(``)J@
+M````D@``FJ0```#2``":J````"L``)JL````*@``FK````!J``":M````*H`
+M`)JX````&P``FKP````:``":P````%H``)K$````F@``FL@```#:``":S```
+M``8``)K0````!@``FM0````&``":V`````8``)K<````!@``FN`````&``":
+MY`````8``)KH````!@``FNP````&``":\`````8``)KT````!@``FO@````&
+M``":_`````8``)C4````(```F,P````$``"8R``&`08``)B<````;0``F,``
+M``````"8T````!0)"0```````@(&!@8&!@8"`@`````#``8`"0`\````````
+M``````````````````#P````S`````````````````````H```````#B"@``
+M(`$```(!```80```````!!@95P0%!A`F````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````*(`````````````````````````````
+M`````````````````*)L````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````````EL"8\)
+MM`````"`````F"!55555JJJJJF9F9F:9F9F9________````````````(```
+M`"````!`````0``&````!@````8``````#`````5````%0```!T````5```0
+M0``O_`\`+_P/`"_\'P`O_`\``!!$`"_\#P`O_`\`+_P?`"_\#P``$$@`+_P/
+M`"_\#P`O_!\`+_P/```03``O_`\`+_P/`"_\'P`O_`\``!!0`"_\#P`O_`\`
+M+_P?`"_\#P``$%0`+_P/`"_\#P`O_!\`+_P/```06``O_`\`+_P/`"_\'P`O
+M_`\``!!<`"_\#P`O_`\`+_P?`"_\#P``$&``+_P/`"_\#P`O_!\`+_P/```0
+M9``O_`\`+_P/`"_\'P`O_`\``!!P```!:````>````&X```!:```$#````(P
+M```!X````+````(P```0L```#9@``!&````?2```#9@``!#P``"@X``!0&@`
+M`%B```"@X```@!0$``0`"``(`"``,``$``0```"`'`Z-CZ<.C8_/`6"/E0Z-
+MCZ<``)@$``````````,`````````````F"`"`@(``@("``(!`@`"`@(```"8
+M)```#@X```X.```'!P``#@X``)@H"@(``0H"``$%`0``"@(``0``F#0```X.
+M```.#@``#@X```X.``"8.`````<````'````"P````L``)A$$W(6G!-R%J43
+M<A:H$W(6G```F$@`&+IG`!BZ9P`8NFD`&+II``"84`PHM.`,*+3@#"BTX`PH
+MM.```)A8?H`-+GZ`#2Y^P`TN?H`-+@``F%PQ-UU>,3==7C$Z75XQ-UU>``"8
+M8```O1```+T0``"].```O1```)AD``'.```!S@```<X```'.````F10``"<0
+M```G$```%7P``"<0``"9&````9````&0````A````9```)E$;^`0(&_@$"!O
+MX`D@;^`0(```H8`%_Q3_!?\4_P7_%/\%_QG_``"8U````!`````4````$```
+M`!`````,`````````"B$A)R<````+'Q\?'P````T````!0```$``````````
+M1`````@```!(````"````$P````0````4`````````!4````'P``"```````
+M```(!`````````@(````````"`P````````($`````````@4````````"!@`
+M```````('`````````@@````````""0````````2,````````(`$````````
+M@`@```````"`#````````(`8````````@"0```````"`*````#```(`L``?_
+M_P``@#`!____``"`-````#$``(`X````````@#P```````"`0````````(!$
+M`````@``@$@```````"`5````````(!8````````F`@```````"8#"V$D),`
+M`)@0?3+@````F!0```]K``"8'````````)@L``)O_@``F#````````"8/``"
+M`0```)A`(&H!>@``F$P2A&$\``"85```"%D``)AH0)I!D```F&P%#+"!``"8
+M<`````\``)AT````@```F'@````,``"9`````````)D$````````F0@`````
+M``"9#`"``````)D0`````0``F1P```DJ``"9(````````)DD``6*!0``F2@`
+M```!``"9+````````)DP````````F30```````"9.````````)D\````/P``
+MF4`````$``"92````````)E,````````F5````````"95%U0\4P``)E8````
+M&```F5P`2VJ.``"AA`;_!?\``*&(!_\'_P``H8P(_PC_``"AD`G_"?\``*&4
+M"O\*_P``H9@+_PO_``"AG`S_#/\``*&@#?\-_P``H:0/_P[_``"AJ!+_$O\`
+M`*&L%/\3_P``H;`6_Q7_``"AM!G_%_\``*&X&_\:_P``H;P>_QW_``"AP"/_
+M(/\``*'$)_\E_P``H<@L_RG_``"AS#'_+_\``*'0-_\T_P``H=0Z_SK_``"A
+MV#K_.O\``*'<.O\Z_P``H>`Z_SK_``"AY#K_.O\``*'H.O\Z_P``H>PZ_SK_
+M``"A\#K_.O\``*'T.O\Z_P``H?@Z_SK_``"A_#K_.O\``)L`````````FP0`
+M```@``";"````!```)L,````,```FQ`````(``";%````"@``)L8````!```
+MFQP````D``";(````!0``)LD````-```FR@````,``";+````"P``)LP````
+M`@``FS0````B``";.````!(``)L\````,@``FT`````*``";1````"H``)M(
+M````!@``FTP````F``";4````!8``)M4````-@``FU@````.``";7````"X`
+M`)M@`````0``FV0````A``";:````!$``)ML````,0``FW`````)``";=```
+M`"D``)MX````!0``FWP````E``";@````!4``)N$````-0``FX@````-``";
+MC````"T``)N0`````P``FY0````C``";F````!,``)N<````,P``FZ`````+
+M``";I````"L``)NH````*P``FZP````K``";L````"L``)NT````*P``F[@`
+M```K``";O````"L``)O`````*P``F\0````K``";R````"L``)O,````*P``
+MF]`````K``";U````"L``)O8````*P``F]P````K``";X````"L``)OD````
+M*P``F^@````K``";[````"L``)OP````*P``F_0````K``";^`````(``)O\
+M````%@``F-0````@``"8V`!@$&@``)H````!J0```````)H$```!Z0```$``
+M`)H(````*0```(```)H,````:0```5```)H0```!F0```9```)H4```!V0``
+M`=```)H8````&0```!```)H<````60```$0``)H@````F0```(0``)HD```!
+MI0```4@``)HH```!Y0```8@``)HL````)0```<@``)HP```!R````!0``)HT
+M````"````$(``)HX````2````((``)H\````B````7@``)I````!F````;@`
+M`)I$```!V````?@``)I(````&````!(``)I,````6````%(``)I0````F```
+M`)(``)I4```!I````7P``)I8```!Y````;P``)I<````)````?P``)I@````
+M9`````H``)ID````I````$H``)IH````Y````(H``)IL```!"@```5H``)IP
+M```!2@```9H``)IT```!B@```=H``)IX```!R@````X``)I\````"@```$X`
+M`)J`````2@```(X``)J$````B@```5X``)J(```!N@```9X``)J,```!^@``
+M`=X``)J0````.@````D``)J4````>@```$D``)J8```!A@```(D``)J<```!
+MQ@```7D``)J@````!@```;D``)JD````1@```?D``)JH````A@```#D``)JL
+M````Q@```'D``)JP````Q@```+D``)JT````Q@```;T``)JX````Q@```?T`
+M`)J\````Q@```#T``)K`````Q@```'T``)K$````Q@```+T``)K(````Q@``
+M`/T``)K,````Q@```/T``)K0````Q@```/T``)K4````Q@```/T``)K8````
+MQ@```/T``)K<````Q@```/T``)K@````Q@```/T``)KD````Q@```/T``)KH
+M````Q@```/T``)KL````Q@```/T``)KP````Q@```/T``)KT````Q@```/T`
+M`)KX````Q@```/T``)K\````Q@```/T````!````1@!@```````!````1@!A
+M```````!````1@!B```````!````1@!C```````!````1@!D```````!````
+M1@!E```````!````1@!F```````!````1@!G```````!````1@!H```````!
+M````1@!I```````!````1@!J```````!````1@!K```````!````1@!L````
+M```!````1@!T```````!````1@!T```````!````1@!T```````!````1@!T
+M```````!````1@!T```````!````1@!T```````!````1@!T```````!````
+M1@!T```````!````1@!U```````!````1@!V```````!````1@!W```````!
+M````1@!X```````!````1@!Y```````!````1@!Z```````!````1@![````
+M```!````1@!\```````!````1@!]```````!````1@!^```````!````1@!_
+M```````!````1@"````````!````1`!\```````!````1@"(```````!````
+M1@",```````!````1@"0```````!````1@"4```````!````1@"8```````!
+M````1@"<```````!````1@"@```````!````1@"D```````!````1@"H````
+M```!````1@"L```````!````1@"P```````!````1@"T`````@<`%IX`"Q9B
+M``H6.@`)%AP`"!7J``<5F@`%%4H`!!4#``(460```````0````,`!@`)`#\`
+M``````D````$``0``0`!``$````&1D<X```````````````````$`````0`!
+M````!$9'-P```````````````````P`!``$``0````-&1S8`````````````
+M``````0```````$````!1D<U```````````````````$``$``0```````$9'
+M-```````````````````!`````$``/____Y&1S,```````````````````,`
+M`0`!``#____]1D<R```````````````````$````````_____$9',0``````
+M`````````````@`!``$``/____I&1S``````````````````````````````
+M`````````````````````````!E4$!0&$"8`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````#]D```````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````"6P)
+MCPFT"0@);`FT____R?___\G____)____R?___\+____R____\O____+____R
+M____]/___\#____`____P/___\#___^Z____LO___[+___^R____LO___[#_
+M______\```4"#P`'`@\`"@`/``D`#P```(````"8(%55556JJJJJ9F9F9IF9
+MF9D`````````(````"````!`````0``&````!@````8``!:>``L68@`*%CH`
+M"18<``@5Z@`'%9H`!15*``05`P`"%%D```NX``$```````````````8````!
+M`````@````,````$````!0``$$``+_P/`"_\#P`O_!\`+_P/`"_\#P``$$0`
+M+_P/`"_\#P`O_!\`+_P/`"_\#P``$$@`+_P/`"_\#P`O_!\`+_P/`"_\#P``
+M$$P`+_P/`"_\#P`O_!\`+_P/`"_\#P``$%``+_P/`"_\#P`O_!\`+_P/`"_\
+M#P``$%0`+_P/`"_\#P`O_!\`+_P/`"_\#P``$%@`+_P/`"_\#P`O_!\`+_P/
+M`"_\#P``$%P`+_P/`"_\#P`O_!\`+_P/`"_\#P``$&``+_P/`"_\#P`O_!\`
+M+_P/`"_\#P``$&0`+_P/`"_\#P`O_!\`+_P/`"_\#P``$#````(P```!X```
+M`+````%@```!X```$'````%H```!X````;@```&,```!X```$+````Y@```1
+M@```'QP``#XX```1@```$/```*#@``%`:```6(```+#@``%`:```@!0#Z`/H
+M!N`&X`0@!"`(0`A`!N`&X```F`0``````````P```````````````P``F"`"
+M`@(``@("``(!`@`"`@(``@("````F"0```X.```.#@``!P<```X.```.#@``
+MF$03<A8<$W(<)1-R%R(3<A:B$W(<)0``F&```)T0``"=$```G1@``)T8``"=
+M$```F&0``<X```'.```!S@```<X```'.````F&A`FD&00)I!D$":09!`FD&0
+M0)I!D```F1@```&X```!N````(0```$(```!N```F200!8H%$`6*!1`%B@40
+M!8H%$`6*!0``HC````````````````````$(``````````P`````````-```
+M``4```!``````````$0````(````2`````@```!,````$````%``````````
+M5````!\```@`````````"`0````````("`````````@,````````"!``````
+M```(%`````````@8````````"!P````````((`````````@D````````$G``
+M```````0.````````!!X````````$+@````````0^````````!$X````````
+M$7@````````1N````````!'X````````$C@````````2>````````!*X````
+M````$O@````````3.````````!-X````````$[@````````3^````````!0X
+M````````%'@````````4N````````!3X````````%3@````````5>```````
+M`!6X````````%?@````````6.````````!9X````````%K@````````6^```
+M`````!<X````````%W@````````7N````````!?X````````$#P````````0
+M?````````!"\````````$/P````````1/````````!%\````````$;P`````
+M```1_````````!(\````````$GP````````2O````````!+\````````$SP`
+M```````3?````````!.\````````$_P````````4/````````!1\````````
+M@`0```````"`"````````(`,````````@"````````"`)````````(`H````
+M,```@"P`!___``"`,`'___\``(`T````,0``@#@```````"`/````````(!(
+M````````@%0```````"`6````````(!<``_'CP``@,`J@C`:``"`Q`7<`>``
+M`(#('T`G$```@,P!]`````"`T```'AP``(#4``*JJ@``@-@"`%55``"`W```
+M`````(#@_____P``@.0``/__``"`Z````````(#L````````@/````````"`
+M]````````(#X````````@/P```"(``"'`````````(<$````C```AP@```#D
+M``"'#````M4``(<0````````AQ0```````"'&````*```(<<```!R0``AR``
+M```L``"')````"P``(<H````,```ARP````\``"',````"P``(<T````+```
+MAS@````P``"'/````#P``(=`````````AT0```````"'2````````(=,````
+M````AU````````"'5````````(=8````````AUP```````"'8````-4``(=D
+M````WP``AV@```$"``"';````3H``(=P````=0``AW0```!_``"'>````*(`
+M`(=\````````@0```0`"``"!!`````$``($(````P```@0P```````"!$```
+M`6@``($4````````A\`#`@$```"'Q`<&!00``(?("PH)"```A\P/#@T,``"'
+MT!,2$1```(?4%Q85%```A]@;&AD8``"'W!\>'1P``(?@`P(!````A^0'!@4$
+M``"'Z`L*"0@``(?L#PX-#```A_`3$A$0``"']!<6%10``(?X&QH9&```A_P?
+M'AT<``"8#*V$CAD``)@0?2C@````F!2<"I]K``"8'````````)A`(&H!>@``
+MF%0```A9``"9`````````)D$````````F0@```````"9#`"``````)D0````
+M`0``F1P```R```"9(`40`````)DH`````0``F2P````$``"9-!X?("(``)DX
+M"@L,#0``F3P````_``"92)*`LA(``)E475#AB```F5P`2VJ.``"9:````\X`
+M`)EP&2^U%0``F7@````!``"9?````````*(0`(!C,P``HA0`$&P0``"B&`"<
+M0&```*(@`8@PQ@``HB0```0```"B+````````*(T("`@(```HC@@("`@``"B
+M0#A)"B```*)$``![M@``HD@/_S_\``";`````````)LH````#```FS@````2
+M``";9````"$``)N,````+0``FYP````S``$``@`"``$``0`"``$````#``8`
+M"0`_`````P`&``D`/P``````"0````0`!``!``$``0``````````````!D9'
+M.```````````````````!`````$``0``````````````!$9'-P``````````
+M`````````P`!``$``0```````````````T9'-@``````````````````!```
+M`````0```````````````49'-0``````````````````!``!``$`````````
+M`````````$9'-```````````````````!`````$`````````````_____D9'
+M,P```````````````````P`!``$`````````````_____49',@``````````
+M````````!```````````````````_____$9',0```````````````````@`!
+M``$`````````````____^D9',```````````````````````````````````
+M```````````````````````````````````(`````0`#````````````````
+M```````&1D<W```````````````````"````````````````````````1D<V
+M```````````````````!``````````````````#____]1D<U````````````
+M``````````````````````````#____Z1D<T``````````````````````$`
+M`0````````````#____X1D<S``````````````````````$``0````$``0``
+M``#____V1D<R``````````````````````$````!``$``0````#____S1D<Q
+M``````````````````````$````!``$````!``#____P1D<P````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````'\````R````?P``
+M`"@```!_````30```'\```!`````'P```!`````_````,`````@````&````
+M``````0````(`````@````0````&````"`````H````,````#@```!`````P
+M``"`%0``@!4``(`5``"`%0``@!4``(`<$HV/IPF(#\\$X`^5$N`/JPF(#\\`
+M`)@H"@(``0H"``$%`0$`"@(``0H"``$``)@T```.#@``#@X```X.```.#@``
+M#@X``)@X````!P````<````+````"P````L``)A(`!C:6@`8VEH`&,II`!C*
+M:0`8RFD``)A0#>BTX`WHM.`-Z+3@#>BTX`WHM.```)A8?H`-+GZ`#2Y^Z$TN
+M?NA-+GZ`#2X``)A<,3=F7C$W9EXQ-V9>,3=F7C$W85X``)AL!0RP@04,L($%
+M#+"!!0RP@`4,L(```)D4```G$```)Q```!5\```J^```)Q```)E$][@0(/>X
+M$"#WN`T@][@0(/>X$"```*(,9"Q!:F0L06ID0$%J9$!!:F1`06H``*(<&(.`
+M"AB#@`H8<X`*&(.`"AB#@`H``!(P````````F`@```````"8+``"+_X``)@\
+M``(!````F$P2A&$\``"9,```2(,``)E`````!```F5@```#_``"9=```````
+M`)GX````&```H@0```````"B"-`^9X@``*(H```!M0``HCP3R(FO``";!```
+M`"```)L(````$```FPP````P``";$`````@``)L4````*```FQ@````$``";
+M'````"0``)L@````%```FR0````T``";+````"P``)LP`````@``FS0````B
+M``";/````#(``)M`````"@``FT0````J``";2`````8``)M,````)@``FU``
+M```6``";5````#8``)M8````#@``FUP````N``";8`````$``)MH````$0``
+MFVP````Q``";<`````D``)MT````*0``FW@````%``";?````"4``)N`````
+M%0``FX0````U``";B`````T``)N0`````P``FY0````C``";F````!,``)N@
+M````"P``FZ0````K``";J````"L``)NL````*P``F[`````K``";M````"L`
+M`)NX````*P``F[P````K``";P````"L``)O$````*P``F\@````K``";S```
+M`"L``)O0````*P``F]0````K``";V````"L``)O<````*P``F^`````K``";
+MY````"L``)OH````*P``F^P````K``";\````"L``)OT````*P``F_@````"
+M``";_````!8``)B<`````````````````````````````)B<````````````
+M`````````````````)B<`````````````````````````````)B<````````
+M`````````````````````)B<`````````````````````````````)B<````
+M`````````````````````````)B<`````````````````````````````)B<
+M`````````````````````````````)B<````````````````````````````
+M`)B<`````````````````````````````)B<````````````````````````
+M`````)B<`#@````X````.````#@````X`````)B<````````````````````
+M`````````)B<`````````````````````````````)B<``````````````#`
+M````@````(```)B<``0`^0`$`/D`!`#_``0`_0`$`/T``)C4````````````
+M```$````!`````0``)H````!J0```````)H$```!Z0```$```)H(````*0``
+M`(```)H,````:0```5```)H0```!F0```9```)H4```!V0```=```)H8````
+M&0```!```)H<````60```$0``)H@````F0```(0``)HD```!I0```4@``)HH
+M```!Y0```8@``)HL````)0```<@``)HP```!R````!0``)HT````"````$(`
+M`)HX````2````((``)H\````B````7@``)I````!F````;@``)I$```!V```
+M`?@``)I(````&````!(``)I,````6````%(``)I0````F````)(``)I4```!
+MI````7P``)I8```!Y````;P``)I<````)````?P``)I@````9`````H``)ID
+M````I````$H``)IH````Y````(H``)IL```!"@```5H``)IP```!2@```9H`
+M`)IT```!B@```=H``)IX```!R@````X``)I\````"@```$X``)J`````2@``
+M`(X``)J$````B@```5X``)J(```!N@```9X``)J,```!^@```=X``)J0````
+M.@````D``)J4````>@```$D``)J8```!A@```(D``)J<```!Q@```7D``)J@
+M````!@```;D``)JD````1@```?D``)JH````A@```#D``)JL````Q@```'D`
+M`)JP````Q@```+D``)JT````Q@```;T``)JX````Q@```?T``)J\````Q@``
+M`#T``)K`````Q@```'T``)K$````Q@```+T``)K(````Q@```/T``)K,````
+MQ@```/T``)K0````Q@```/T``)K4````Q@```/T``)K8````Q@```/T``)K<
+M````Q@```/T``)K@````Q@```/T``)KD````Q@```/T``)KH````Q@```/T`
+M`)KL````Q@```/T``)KP````Q@```/T``)KT````Q@```/T``)KX````Q@``
+M`/T``)K\````Q@```/T``)C4````(```F-0````0````%````!`````0````
+M%```F-@`8!!H`&`0:`!@$&@`8!!H`&`0:```F)P`````````````````````
+M````````F)P`````````````````````````````F)P`````````````````
+M````````````F)P`````````````````````````````F)P`````````````
+M````````````````F)P0````$````!`````0````$```````F)P$````!```
+M``0````$````!```````F)P`````````````````````````````F)P`````
+M````````````````````````F)P`````````````````````````````F)P`
+M``````````H`````````````````F)P`.`#``#@`@`(X`,``.`#``#@`P```
+MF)P``@`&``(`!@````8``@`&``(`!@``F)P```")````B0```(D```")````
+MB0``F)P```"@````H````*````"@````H```F)P`!``'``0`!P`$``<`!``'
+M``0`!P``F-0````:````&@```!H````:````&@``F)P```!`````2````$``
+M``!`````0```F)P````0````$````!`````0````$```F)P````(````"```
+M``@````(````"```F)P```!/````3P```$\```!/````3P``F)P```#Q````
+M\0```&$```#Q````\0``F)P``)!/``"03P``D$P``)!/``"03P``F)P``!):
+M```26@``$IH``!):```26@``F,P````.````#@````\````.````#@````$`
+M``!&`&````````$```!&`&$```````$```!&`&(```````$```!&`&,`````
+M``$```!&`&0```````$```!&`&4```````$```!&`&8```````$```!&`&<`
+M``````$```!&`&@```````$```!&`&D```````$```!&`&H```````$```!&
+M`&L```````$```!&`&P```````$```!&`'0```````$```!&`'0```````$`
+M``!&`'0```````$```!&`'0```````$```!&`'0```````$```!&`'0`````
+M``$```!&`'0```````$```!&`'0```````$```!&`'4```````$```!&`'8`
+M``````$```!&`'<```````$```!&`'@```````$```!&`'D```````$```!&
+M`'H```````$```!&`'L```````$```!&`'P```````$```!&`'T```````$`
+M``!&`'X```````$```!&`'\```````$```!&`(````````$```!$`'P`````
+M``$```!&`(@```````$```!&`(P```````$```!&`)````````$```!&`)0`
+M``````$```!&`)@```````$```!&`)P```````$```!&`*````````$```!&
+M`*0```````$```!&`*@```````$```!&`*P```````$```!&`+````````$`
+M``!&`+0``!:>``868@`$%CH``Q8<``(5Z@`!%9H``!5*```5`P`!%%D``PNX
+M``4`````````,```@!4``(`5``"`%0``@!4``(`5``"`'!*-DZ<)B!//!.`3
+ME1+@$ZL)B!//``"8*`H"``$*`@`!!0(!``H"``$*`@`!``"8-```#@X```X.
+M```.#@``#@X```X.``"8.`````<````'````"P````L````+``"82``8VFT`
+M&-IM`!C*=0`8RG4`&,IU``"84`WHM.`-Z+3@#>BTX`WHM.`-Z+3@``"86'Z`
+M#2Y^@`TN?N@-+G[H#2Y^@`TN``"87#$W9EXQ-V9>,3=F7C$W9EXQ-V9>``"8
+M;`4,L($%#+"!!0RP@04,L($%#+"!``"9%```!]````?0```$3```")@```?0
+M``"91/>X$"#WN!`@][@-$/>X$!#WN!`0``"B!```````````````"`````@`
+M```(``"B"-:^9XC6OF>(T#YGB-`^9XC0/F>(``"B#&0L`4!D+`%`9$+!8&1"
+MP6!D0L%@``"B'!B#@`H8@X`*&'.`"AB#@`H8@X`*```2,````````)@(````
+M````F"P``B_^``"8/``"`0```)A,$H1A/```F3```$B"``"90`````0``)E8
+M````_P``F70```````"B*````;4``*(\$\B)KP``FP0````!``";"`````(`
+M`)L,`````P``FQ`````$``";%`````4``)L8````"```FQP````)``";(```
+M``H``)LD````"P``FRP````-``";,````!```)LT````$0``FSP````3``";
+M0````!0``)M$````%0``FT@````8``";3````!D``)M0````&@``FU0````;
+M``";6````!P``)M<````'0``FV`````@``";:````"(``)ML````(P``FW``
+M```D``";=````"4``)MX````*```FWP````I``";@````"H``)N$````*P``
+MFX@````L``";D````#```)N4````,0``FY@````R``";H````#0``)ND````
+M-0``FZ@````U``";K````#4``)NP````-0``F[0````U``";N````#4``)N\
+M````-0``F\`````U``";Q````#4``)O(````-0``F\P````U``";T````#4`
+M`)O4````-0``F]@````U``";W````#4``)O@````-0``F^0````U``";Z```
+M`#4``)OL````-0``F_`````U``";]````#4``)OX````$```F_P````:``":
+M``````<````'``":!````$<```!'``":"````(<```"'``":#````:````&@
+M``":$````>````'@``":%````"`````@``":&````&````!@``":'````:$`
+M``&A``":(````>$```'A``":)````"$````A``":*````&$```!A``":+```
+M`6(```%B``":,````:(```&B``":-````>(```'B``":.````"(````B``":
+M/````&(```!B``":0````6,```%C``":1````:,```&C``":2````>,```'C
+M``":3````",````C``":4````&,```!C``":5````80```&$``":6````<0`
+M``'$``":7`````0````$``":8````>H````+``":9````"H```!+``"::```
+M`&H```"+``":;````*H```&L``":<````:L```'L``":=````>L````L``":
+M>````"L````2``":?````&L```!2``":@````*L```"2``":A````:P```&3
+M``":B````>P```'3``":C````"P````3``":D````#H```!3``":E````'H`
+M``"3``":F````+H```&4``":G````;L```'4``":H````?L````4``":I```
+M`#L````Z``":J````'L```!Z``":K````+L```"Z``":L````;P```&[``":
+MM````?P```'[``":N````#P````[``":O````'P```![``":P````+P```"[
+M``":Q````/P```&\``":R````/P```'\``":S````/P````\``":T````/P`
+M``!\``":U````/P```"\``":V````/P```#\``":W````/P```#\``":X```
+M`/P```#\``":Y````/P```#\``":Z````/P```#\``":[````/P```#\``":
+M\````/P```#\``":]````/P```#\``":^````/P```#\``":_````/P```#\
+M``"8U````"```)C0`P8$"`,'!`@#!@0(`P8$"`,'!`@``)C<`*`@P`"@(,``
+MX"#``.`@P`#@(,```)B<#P````\````/````#P````\``````)B<````````
+M`````````````````````)B<`(````"`````@````(````"``````)B<`"H`
+M```J````*@```"H````J`````)B<``$````!`````0````$````!`````)B<
+M`````````````````````````````)B<`!@````8````&````!@````8````
+M`)B<`&````!@````;@```&X```!N`````)B<`,<```#'````QP```,<```#'
+M`````)B<`$L```!+````2P```$L```!+`````)B<!$@```1(```$2```!$@`
+M``1(`````)B<`$P```!,````3````$P```!,`````)B<`.0```#D````Y```
+M`.0```#D`````)B<`````````````````````````````)B<`/P```#\````
+M_````/P```#\`````)B<`/\```#_````_P```/\```#_`````)B<!#\```0_
+M```$/P``!#\```0_`````)B<``P````,````#`````P````,`````)B<`AD`
+M``(9```"&0```AD```(9`````)B<`"0````D````)````"0````D`````)B<
+M`+0```"T````M````+0```"T`````)B<`)D```"9````F0```)D```"9````
+M`)B<`%````!0````4````%````!0`````)B<`"H````J````*@```"H````J
+M`````)B<`!(````2````$@```!(````2`````)B<P#(``,`R``#`,@``P#(`
+M`,`R`````)B<`70```%T```!=````70```%T`````)B<`!$````1````$0``
+M`!$````1`````)B<AB@``(8H``"&*```AB@``(8H`````)B<,80``#&$```Q
+MA```,80``#&$`````)B<`/(`@`#R`(``\@"``/(`@`#R`(```)B<`"<`&0`G
+M`!D`)P`9`"<`&0`G`!D``)B<`````P````,````#`````P````,``)B<````
+M`````````````````````````)B<````L@```+(```"R````L@```+(``)B<
+M`+`@A`"P((0`L""$`+`@A`"P((0``)B<`$$EI`!!):0`026D`$$EI`!!):0`
+M`)B<`!&2(``1DB``$9(@`!&2(``1DB```)B<`!I(```:2```&D@``!I(```:
+M2````)C8``L",``+`C``"P(P``L",``+`C```)B<````E````)0```"4````
+ME````)0``)B<````D0```)$```"1````D0```)$``)B<````$@```!(````2
+M````$@```!(``)B<````@````(````"`````@````(```)B<````V0```-D`
+M``#9````V0```-D``)B<````8````&````!@````8````&```)B<````\```
+M`/````#P````\````/```)B<````H@```*(```"B````H@```*(``)B<````
+M4@```%(```!2````4@```%(``)B<````U````-0```#4````U````-0``)B<
+M```4S```%,P``!3,```4S```%,P``)B<```$C```!(P```2,```$C```!(P`
+M`)C$`````P````,````#`````P````,````P````%0```!4````5````%0``
+M`!4``(`<$HV3IPF($\\$X!.5$N`3JPF($\\``)@H"@(``0H"``$%`@``"@(`
+M`0H"``$``)@T```.````#@````X````.````#@```)@X`````@````(````*
+M````"@````H``)A(`!C:;0`8VFT`&FID`!IJ9``::F0``)A0#>BTX`WHM.`-
+MZ+#:#)BPV@WHL-H``)A8?H`-+GZ`#2Y^Z`TN?L@-+GZ`#2X``)A<,3=F7C$W
+M9EXQ-V9>,3E@7C$W9EX``)AL!0RP@04,L($%#+"!!0RP@04,L($``)D4```'
+MT```!]````1,```(F```!]```)E$][@0`/>X$`#WN`T`][@0`/>X$````*($
+M`````````````````````````````*((UKYGB-:^9XC0/F>(T#YGB-`^9X@`
+M`*(,`"P!0``L`4``0L%``$+!0`!"P4```*(<&(.`"AB#@`H88X`*&(.`"AB#
+M@`H``!(P```#X```@&`````/``"!&````````($<````````@2````````"!
+M)````````($H````````@2P```````"!,````````($T````````@3@`````
+M``"!/````````(%`@```J```@40```````"8"````````)@L``"@````F#P`
+M(`0```"83!*$(SP``)AP````'P``F'0```"```"8>`````X``)E8````_P``
+MF8````````"9A`*``````)F@````````F>````````"9Y*JJJJH``)GH/$9D
+M>```F>P```"J``"9\`````P``)GT````_P``F?@````4``"B*```";4``*(\
+MD\B)KP``HDP````!``"B4```H````*)4````````HE@,QU.```"B7`\/#P$`
+M`*)@7VD/`0``HF0`08H1``"B:````````*)L###!:@``HG``@@@@``"B=``;
+M?*H``*)X'.<YS@``HGP%%P'.``"C`!@!`````*,$,`,F`@``HPA(!SX&``"C
+M#%8+3`H``*,09!I@#P``HQ1X3VX;``"C&(:/?%H``*,<CL^&6P``HR"=3Y</
+M``"C)*7/H8\``*,HM5^O'P``HRR]W[F?``"C,,U_QS\``*,TU?_1OP``HS@`
+M``````"C/````````*-`````````HT0```````"C2#____\``*-,/____P``
+MHU`_____``"C5``#__\``*-8>:BJ'P``HUP&;$(/``"C8`\H(@<``*-D%V`6
+MA0``HV@?@!$$``"C;#>@#`,``*-P/\0(@P``HW17P`@#``"C>%_8!H(``*-\
+M?^`$@@``HX!_/'NZ``"CA/,P?_```)L$`````0``FP@````"``";#`````,`
+M`)L0````!```FQ0````%``";&`````@``)L<````"0``FR`````*``";)```
+M``L``)LL````#0``FS`````0``";-````!$``)L\````$P``FT`````4``";
+M1````!4``)M(````&```FTP````9``";4````!H``)M4````&P``FU@````<
+M``";7````!T``)M@````(```FV@````B``";;````",``)MP````)```FW0`
+M```E``";>````"@``)M\````*0``FX`````J``";A````"L``)N(````+```
+MFY`````P``";E````#$``)N8````,@``FZ`````T``";I````#4``)NH````
+M-0``FZP````U``";L````#4``)NT````-0``F[@````U``";O````#4``)O`
+M````-0``F\0````U``";R````#4``)O,````-0``F]`````U``";U````#4`
+M`)O8````-0``F]P````U``";X````#4``)OD````-0``F^@````U``";[```
+M`#4``)OP````-0``F_0````U``";^````!```)O\````&@``F@``````````
+M````F@0`````````0```F@@`````````@```F@P````````!@0``FA``````
+M```!P0``FA0``````````0``FA@`````````00``FAP`````````@0``FB``
+M```````!:```FB0````````!J```FB@````````!Z```FBP`````````*```
+MFC``````````:```FC0````````!B0``FC@````````!R0``FCP`````````
+M"0``FD``````````20``FD0`````````B0``FD@````````!D```FDP`````
+M```!T```FE``````````$```FE0`````````4```FE@`````````D```FEP`
+M```````!D0``FF`````````!T0``FF0`````````$0``FF@`````````40``
+MFFP`````````D0``FG`````````!>```FG0````````!N```FG@````````!
+M^```FGP`````````.```FH``````````>```FH0````````!F0``FH@`````
+M```!V0``FHP`````````&0``FI``````````60``FI0`````````F0``FI@`
+M````````V0``FIP`````````^0``FJ``````````^0``FJ0`````````^0``
+MFJ@`````````^0``FJP`````````^0``FK``````````^0``FK0`````````
+M^0``FK@`````````^0``FKP`````````^0``FL``````````^0``FL0`````
+M````^0``FL@`````````^0``FLP`````````^0``FM``````````^0``FM0`
+M````````^0``FM@`````````^0``FMP`````````^0``FN``````````^0``
+MFN0`````````^0``FN@`````````^0``FNP`````````^0``FO``````````
+M^0``FO0`````````^0``FO@`````````^0``FOP`````````^0``F-0````@
+M``"8T`(`%`@"`10(`@`4"`(`%`@"`10(``"8W`"@(,``H"#``.`@P`#@(,``
+MX"#```"8G/````#P````\````/````#P``````"8G```````````````````
+M``````````"8G`,````#`````P````,````#``````"8G```````````````
+M``````````````"8G`````````````````````````````"8G```````````
+M``````````````````"8G`````````````````````````````"8G```````
+M``````````````````````"8G$!```!`0```0$```$!```!`0`````"8G&4%
+M``!E!0``904``&4%``!E!0````"8G`````````````````````````````"8
+MG`````````````````````````````"8G`!"````0@```$(```!"````0@``
+M``"8G`"U````M0```+4```"U````M0````"8G``#`````P````,````#````
+M`P````"8G`#W````]P```/<```#W````]P````"8G`"=````G0```)T```"=
+M````G0````"8G``B````(@```"(````B````(@````"8G`0B```$(@``!"(`
+M``0B```$(@````"8G``C`!@`(P`8`",`&``C`!@`(P`8``"8G``H````*```
+M`"@`8``H`&``*`!@``"8G`!0`,``4`#``%``PP!0`,,`4`##``"8G``$`'\`
+M!`!_``0`?P`$`'\`!`!_``"8G```!%@```18```$6```!%@```18``"8G```
+M``````````````````````````"8G```P````,````#`````P````,````"8
+MV`!``C``0`(P`$`",`!``C``0`(P``"8G```9````&0```!D````9````&0`
+M``"8G```"`````@````(````"`````@```"8S`````X````.````#@````X`
+M```.````,````!4````5````%0```!4````5``"`'!*-DZ<)B!//!.`3E1+@
+M$ZL)B!//``"8*`H"``$*`@`!!0(!``H"``$*`@`!``"8-```#@X```X.```.
+M#@``#@X```X.``"8.`````<````'````"P````L````+``"82``8^F$`&/IA
+M`!H:8P`:&F,`&AIC``"84`R8M.`,F+3@#)BPV@R8L-H,F+#:``"86'[(#2Y^
+MR`TN?L@-+G[(#2Y^R`TN``"87#$Y8%XQ.6!>,3E@7C$Y8%XQ.6!>``"8;`4,
+ML($%#+"!!0RP@04,L($%#+"!``"9%```!]````?0```$3```")@```?0``"9
+M1/>X$`#WN!``][@-`/>X$`#WN!````"B!```````````````````````````
+M``"B"-:^9XC6OF>(T#YGB-`^9XC0/F>(``"B#``NP>``+L'@`"K!(``JP2``
+M*L$@``"B'!B#@`H8@X`*&&.`"AB#@`H8@X`*``"C`!@!```8`0``&`$``!@!
+M```8`0````"C!#`#)@(P`R8",`,F`C`#)@(P`R8"``"C"$@'/@9(!SX&2`<^
+M!D@'/@9(!SX&``"C#%8+3`I6"TP*5@M,"E8+3`I6"TP*``"C$&0:8`]D&F`/
+M9!I@#V0:8`]D&F`/``"C%'A/;AMX3VX;>$]N&WA/;AMX3VX;``"C&(:/?%J&
+MCWQ:AH]\6H:/?%J&CWQ:``"C')#/AEN0SX9;CL^&6X[/AEN.SX9;``"C()U/
+MEP^=3Y</FT^7#YM/EP^;3Y</``"C)*?/HX^GSZ./H\^?CZ//GX^CSY^/``"C
+M*+5?KQ^U7Z\?LU^O'[-?KQ^S7Z\?``"C++W?N9^]W[F?N]^YG[O?N9^[W[F?
+M``"C,,M_Q3_+?\4_RW_'/\M_QS_+?\<_``"C--7_T;_5_]&_T__1O]/_T;_3
+M_]&_```2,````^```$!H````$```@&`````/``"`G````````("@````````
+M@1@```````"!'````````($@````````@20```````"!*````````($L````
+M````@3````````"!-````````($X````````@3P```````"!0(```_D``(%$
+M````````F`@```````"8+```H````)@\`"`$````F$P2A",\``"8<````!\`
+M`)AT````@```F'@````.``"96``('_\``)F`````````F80"@`````"9H```
+M`````)G@````````F>2JJJJJ``"9Z#Q&9'@``)GL````J@``F?`````,``"9
+M]````/\``)GX````%```HB@```FU``"B/)/(B:\``*),`````0``HE```*``
+M``"B5````````*)8#,=3@```HEP/#P\!``"B8%]I#P$``*)D`$&*$0``HF@`
+M``````"B;`PPP6H``*)P`((((```HG0(&WRJ``"B>!SG.<X``*)\!1<!S@``
+MHS@```````"C/````````*-`````````HT0```````"C2#____\``*-,/___
+M_P``HU`_____``"C5``#__\``*-8>:BJ'P``HUP&;$(/``"C8`\H(@<``*-D
+M%V`6A0``HV@?@!$$``"C;#>@#`,``*-P/\0(@P``HW17P`@#``"C>%_8!H(`
+M`*-\?^`$@@``HX!_/'NZ``"CA/,P?_```)L$`````0``FP@````"``";#```
+M``,``)L0````!```FQ0````%``";&`````@``)L<````"0``FR`````*``";
+M)`````L``)LL````#0``FS`````0``";-````!$``)L\````$P``FT`````4
+M``";1````!4``)M(````&```FTP````9``";4````!H``)M4````&P``FU@`
+M```<``";7````!T``)M@````(```FV@````B``";;````",``)MP````)```
+MFW0````E``";>````"@``)M\````*0``FX`````J``";A````"L``)N(````
+M+```FY`````P``";E````#$``)N8````,@``FZ`````T``";I````#4``)NH
+M````-0``FZP````U``";L````#4``)NT````-0``F[@````U``";O````#4`
+M`)O`````-0``F\0````U``";R````#4``)O,````-0``F]`````U``";U```
+M`#4``)O8````-0``F]P````U``";X````#4``)OD````-0``F^@````U``";
+M[````#4``)OP````-0``F_0````U``";^````!```)O\````&@``F@``````
+M````````F@0```!`````0```F@@```"`````@```F@P```&A```!80``FA``
+M``'A```!H0``FA0````A```!X0``FA@```!A````(0``FAP```&(````80``
+MFB````'(```!B```FB0````(```!R```FB@```!(````"```FBP```"(````
+M2```FC````&I````B```FC0```'I```!:0``FC@````I```!J0``FCP```!I
+M```!Z0``FD````'0````*0``FD0````0````:0``FD@```!0```!D```FDP`
+M``"0```!T```FE````&Q````$```FE0```'Q````4```FE@````Q````D```
+MFEP```!Q```!<0``FF````&X```!L0``FF0```'X```!\0``FF@````X````
+M,0``FFP```!X````<0``FG````&9```!F```FG0```'9```!V```FG@````9
+M````&```FGP```!9````6```FH````"9````F```FH0```#9```!>0``FH@`
+M``#Y```!N0``FHP```#Y```!^0``FI````#Y````.0``FI0```#Y````>0``
+MFI@```#Y````N0``FIP```#Y````^0``FJ````#Y````^0``FJ0```#Y````
+M^0``FJ@```#Y````^0``FJP```#Y````^0``FK````#Y````^0``FK0```#Y
+M````^0``FK@```#Y````^0``FKP```#Y````^0``FL````#Y````^0``FL0`
+M``#Y````^0``FL@```#Y````^0``FLP```#Y````^0``FM````#Y````^0``
+MFM0```#Y````^0``FM@```#Y````^0``FMP```#Y````^0``FN````#Y````
+M^0``FN0```#Y````^0``FN@```#Y````^0``FNP```#Y````^0``FO````#Y
+M````^0``FO0```#Y````^0``FO@```#Y````^0``FOP```#Y````^0``F-0`
+M```@``"8T`````@````(````"`````@````(``"8W`"@`,``H`#``.``P`#@
+M`,``X`#```"8G#,````S````,P```#,````S``````"8G`$````!`````0``
+M``$````!``````"8G`````````````````````````````"8G```````````
+M``````````````````"8G`````````````````````````````"8G!\````?
+M````'P```!\````?``````"8G`````````````````````````````"8G`"X
+M````N````+@```"X````N`````"8G`"W````MP```+<```"W````MP````"8
+MG`"$````A````(0```"$````A`````"8G`"8````F````)@```"8````F```
+M``"8G`#`````P````,````#`````P`````"8G`#_````_P```/\```#_````
+M_P````"8G`#_````_P```/\```#_````_P````"8G`#_````_P```/\```#_
+M````_P````"8G`#_````_P```/\```#_````_P````"8G`#7````UP```-<`
+M``#7````UP````"8G`!A````80```&$```!A````80````"8G`#^````_@``
+M`/X```#^````_@````"8G`#>````W@```-X```#>````W@````"8G`!_````
+M?P```'\```!_````?P````"8G`0]```$/0``!#T```0]```$/0````"8G`!W
+M````=P```'<```!W````=P````"8G`!$````1````$0```!$````1`````"8
+MG`"8````F````)@```"8````F`````"8G``0`(``$`"``!``@``0`(``$`"`
+M``"8G``%P#0`!<`T``7`-``%P#0`!<`T``"8G``Q`/``,0#P`#$`\``Q`/``
+M,0#P``"8G``,`1\`#`$?``P!'P`,`1\`#`$?``"8G`!1`$``40!``%$`0`!1
+M`$``40!```"8G`!0`-H`4`#:`%``V@!0`-H`4`#:``"8G```````````````
+M``````````````"8G```0$0``$!$``!`1```0$0``$!$``"8G```````````
+M``````````````````"8G```8,```&#```!@P```8,```&#```"8G```+```
+M`"P````V````-@```"P```"8R```!`,```0#```$`P``!`,```0#``"8G```
+M9````&0```!D````9````&0```"8G```"`````@````(````"`````@```"8
+MS`````X````.````#@````X````.05(U,C$P``!!4C4R,3$``$%2-3(Q,@``
+M4D8U,3$Q``!21C4Q,3(``%)&,C0Q,P``4D8U-#$S``!214=/4%-?1E5.0P!!
+M=&AE<F]S(#(S,3,@5VE3;T,``$%T:&5R;W,@-30R-"\R-#(T````071H97)O
+M<R`R,S$W(%=I4V]#``!!=&AE<F]S(#4R,3(@*$901T$I`$%T:&5R;W,@-3(Q
+M,2`H1E!'02D`071H97)O<R`U,C$P`````$%T:&5R;W,@-3(Q,0````!!=&AE
+M<F]S(#4S,3(@5VE3;T,``$%T:&5R;W,@,C,Q-2!7:5-O0P``071H97)O<R`U
+M,C$R`````#`N.2XR,"XS```````````````(````$````!@````@````*```
+M`#`````X`````````?\!_P````````````!__________P```````P&8`9D`
+M````````````?_________\```````<!F`LP`````````````'__________
+M```````(`9@,,`````````````!__________P``````(`$@"A``````````
+M````?_________\``````"$!(`&9`````````````'__________```````B
+M`2`,,`````````````!__________P``````.@%@"A``````````````?___
+M______\``````#L!8`&9`````````````'__________```````2`64*$```
+M`````P````!__________P``````-P$P`9D```````,`````?_________\`
+M`````#4",`&9```````#`````'__________```````V`S`!F0```````P``
+M``!__________P``````,`0P`9D```````,`````?_________\``````#D%
+M,`&9```````#`````'__________```````T!C`!F0```````P````!_____
+M_____P``````,@,P`9D```````,`````?_________\``````#$#,`&9````
+M`````````'__________```````1`1`!F0````````````!__________P``
+M````$`$0"A``````````````?_________\``````%(!4`&9````````````
+M`'__________``````!%`E`!F0````````````!__________P``````1P-0
+M`9D`````````````?_________\``````$($4`&9`````````````'______
+M____``````!8!5`!F0````````````!__________P``````6P90`9D`````
+M````````?_________\``````%T(4`&9`````````````'__________````
+M``!>"5`!F0````````````!__________P``````4`-0"A``````````````
+M?_________\``````%4!4`PP`````````````'__________``````!6`E`,
+M,`````````````!__________P``````20)0#5``````````````?_______
+M__\``````$`!0`I```````!&````!``````````H`8@```!!`4`*0```````
+M1P````0`````````:`&)````2`%`"A```````$8````$``````````@!B@``
+M`$H!0`I```````!&````!````````!@(`8P```!+`4`*0```````1@````0`
+M``````!@"`&-````3`%`"E```````$8````$``````````@!CP```$,"0`I`
+M``````!'````!`````````!P`8L```#P`T`*0```````1@````0`````````
+M(```````@`-`"D```````$<````$`````````&`/IP```/$#0`I```````!&
+M````!````````!@```````"!`T`*0```````1@````0```````!@``^H````
+M@@-`"E```````$8````$```````````/J0```/(#0`H0``````!&````!```
+M``````````````"#!$`*0```````1P````0```````"`8`^J````]`1`"D``
+M`````$8````$````````F````````(0$0`I```````!&````!````````.``
+M#ZL```"%!$`*4```````1@````0```````"```^L````]01`"A```````$8`
+M```$````````@````````(8%0`I```````!'````!````````(!@#ZT```"'
+M!4`*0```````1@````0```````#@``^N````B`5`"E```````$8````$````
+M````@``/KP```(D&0`I```````!'````!`````````!H#[````"*!D`*0```
+M````1@````0```````!@"`^Q````BP9`"E```````$8````$``````````@/
+ML@```(P'0`I```````!'````!````````(!H#[,```"-!T`*0```````1@``
+M``0```````#@"`^T````C@=`"E```````$8````$````````@`@/M0```(\(
+M0`I```````!'````!````````(!H#[8```"0"$`*0```````1@````0`````
+M``#@"`^W````D0A`"E```````$8````$````````@`@/N````/8)0`I`````
+M``!'````!````````(!@``````#W"T`*0```````1P````0```````"`8```
+M````8`!@`&``````````````?_________\``````&$`80!A```````#````
+M`'__________``````!B`&(`8@```````@````!__________P``````8P!C
+M`&,`````````````?_________\``````&0`9`!D```````#`````'______
+M____``````!E`&4`90```````P````!__________P``````9@!F`&8`````
+M````````?_________\``````&<`9P!G`````````````'__________````
+M``!H`&@`:`````````````!__________P``````:0!I`&D```````,`````
+M?_________\``````&H`:@!J```````#`````'__________``````!E````
+M```!_____P```(#_____`````$I0```/M```````````````:@```````?__
+M__\```"`_____P````!*4```#[0``````````````?\```````$````!````
+M`1M8```````0`````0````$````!&U@````(``,````!``````````$;6```
+M``P``P````$``````````1M8````(`!'````````````````&U@````S`#``
+M```!``````````$;6````"0`(0````$````!`````1M8````*``W`````0``
+M```````!&U@````?`#`````!`````0````$;6````#``6P````$`````````
+M`1M8````<``#`````0`````````!&U@````X`#<````!``````````$;6```
+M`%0`50````$````!`````1M8````1`!5`````0````$````!&U@```!,`#L`
+M```!```````````;6````&``4@````$````!`````1M8````9``T`````0``
+M```````!&U@```!\`"`````!`````0````$;6````)@`6P````$````!````
+M`1M8````G`!2`````0````$````!&U@```"J`!`````!``````````$;6```
+M`+P``P````$``````````1M8````OP`V`````0`````````!&U@```#$`#<`
+M```!`````0````$;6````,L`-P````$``````````1M8````T``W`````0``
+M```````!&U@```#6`!`````!`````0````$;6````-H``P``````````````
+M`!M8```#,@`V`````0`````````!&U@```#>``,````!``````````$;6```
+M`.D`-P````$``````````1M8````]@`W`````0`````````!&U@```#Z`#<`
+M```!``````````$;6````/\`-@````$``````````1M8```!#``P`````0``
+M``$````!&U@```$4`#<````!``````````$;6````2P`-P````$`````````
+M`1M8```!0``0`````0````$````!&U@```%4``,````!``````````$;6```
+M`5@`(0````$````!`````1M8```!7``W`````0`````````!&U@```%@`#<`
+M```!``````````$;6````60`6P````$``````````1M8```!:`!2`````0``
+M```````!&U@```%L`%(````!`````0````$;6````70`-P````$`````````
+M`1M8```!>``#`````0`````````!&U@```%\`#<````!``````````$;6```
+M`8@`0`````$``````````!M8```!B0!!`````0``````````&U@```&*`$@`
+M```!```````````;6````8L`0P````$``````````!M8```!C`!*`````0``
+M````````&U@```&-`$L````!```````````;6````8\`3`````$`````````
+M`!M8```/IP"``````0``````````&U@```^H`($````!```````````;6```
+M#ZD`@@````$``````````!M8```/J@"#`````0``````````&U@```^K`(0`
+M```!```````````;6```#ZP`A0````$``````````!M8```/K0"&`````0``
+M````````&U@```^N`(<````!```````````;6```#Z\`B`````$`````````
+M`!M8```/L`")`````0``````````&U@```^Q`(H````!```````````;6```
+M#[(`BP````$``````````!M8```/LP",`````0``````````&U@```^T`(T`
+M```!```````````;6```#[4`C@````$``````````!M8```/M@"/`````0``
+M````````&U@```^W`)`````!```````````;6```#[@`D0````$`````````
+M`!M8```!D`!"`````0`````````!&U@```&.``,````!``````````$;6```
+M`9@`10````$````!`````1M8```!F@!%`````0``````````&U@```&;`$4`
+M```!```````````;6````9P`7@````$``````````!M8```!G@`#`````0``
+M```````!&U@```&L`#<````!``````````$;6````:8``P````$`````````
+M`1M8```!M@`W`````0`````````!&U@```&X`#<````!``````````$;6```
+M`;H`-P````$``````````1M8```!O@`A`````0````$````!&U@```,G``,`
+M```!``````````$;6````<H`70````$``````````!M8```!U@`W`````0``
+M```````!&U@```'D`!`````!`````0````$;6````>P`,`````$````!````
+M`1M8```!^``#`````0`````````!&U@```(0`#<````!``````````$;6```
+M`BH`(@````$``````````1M8```"0@`W`````0`````````!&U@```(``%L`
+M```!``````````$;6````DH``P````$``````````1M8```"3P`0`````0``
+M``$````!&U@```)<`%(````!``````````$;6````F``.P````$````!````
+M`1M8```":``W`````0`````````!&U@```)L`#<````!``````````$;6```
+M`G8`$`````$````!`````1M8```">@`#`````0`````````!&U@```*"``,`
+M```!``````````$;6````H,``P````$``````````1M8```"J@`A`````0``
+M```````!&U@```*^`%L````!`````0````$;6````K\`-P````$`````````
+M`1M8```"P0`W`````0`````````!&U@```+&`#L````!``````````$;6```
+M`M0`-P````$``````````1M8```"\``W`````0`````````!&U@```+T`#<`
+M```!``````````$;6````O@``P````$``````````1M8````G@!0`````0``
+M``$````!&U@```+\``,````!``````````$;6````PP`,`````$`````````
+M`1M8```#%``V`````0`````````!&U@```,8`#8````!``````````$;6```
+M`R0``P````$``````````1M8```#$``#`````0`````````!&U@```,Z`#<`
+M```!``````````$;6````T@`$`````$````!`````1;!```#2@`2`````0``
+M``$````!&U@```-:`!$````!``````````$;6````UP`.@````$````!````
+M`1M8```#7@!6`````0`````````!&U@```+```,````!``````````$;6```
+M`W<``P````$``````````1M8```"S``#`````0`````````!&U@``!,S$ST7
+M``H%````````````````````$!`````31Q-1%P`*!0``````````````````
+M`!`0````$S@3=!<`%!0````````````````````0!P```!-.$WL;!@4%````
+M`````````````````0`````341-Y'@8*!0````````````````````$`````
+M$U83="$&%`4````````````````````!`````!.K$[`7``H%````````````
+M````````$`P````3L!/8%P`4%````````````````````!`"````$[\3OQ<`
+M"@4````````````````````0#````!0`%'@%!A04````````````````````
+M```````4,A1N%P`4%````````````````````!@!````%#(4;A0`%!0`````
+M```````````````8`0```!0\%'@/`!04````````````````````!0`````4
+M/!1X$084%`````````````````````$!````%#P4>!(`%!0`````````````
+M```````%`````!0\%'@4`!04````````````````````!0`````4/!1X%P`4
+M%`````````````````````4`````%#P4>!<&%!0````````````````````!
+M`````!0\%,@4!A04``````````(`````````!``````4>!2@%P`4%```````
+M```!``````````4`````%(P4H!<`%!0``````````P`````````%`````!2,
+M%,@2`!04``````````,`````````!0`````4C!3(%``4%``````````'````
+M````@`4`````%(P4R!0&%!0``````````P`````````!`@```!2,%,@7!A04
+M``````````,``````````0(````4C!3(%P84%``````````#``````````$`
+M````%(P4R!X`%!0``````````````````````````!2,%D0%!A04````````
+M``,````````````````4H!3($084%``````````#``````````$`````%7P5
+M]!X&%!0``````````@`````````$`````!5\%D04!A04``````````,`````
+M`````00````5?!9$&P`4%``````````#``````````4`````%7P61!X`%!0`
+M`````````P`````````%`````!5\%D07`!04``````````<```````"``0``
+M```6<1:M%P`4%```````````````````````````%G$6K1X&%!0`````````
+M`````````````````!9Q%JT>!A04``````````(`````````!``````6<1;!
+M!084%```````````````````````````%G$6P1$`%!0`````````````````
+M`````````!9Q%L$4`!04```````````````````````````6<1;!'@`4%```
+M````````````````````````%G$6P1X&%!0``````````````````````P``
+M`!9Q%L$>!A04```````````````````````````3.!-T'@`4%```````````
+M````````!```````$[`3V!X`%!0```````````````````0``````!0R%&X>
+M`!04``````````,````````$```````4/!1X'@`4%``````````#````````
+M!```````%(P4R!X`%!0``````````P````````0``````!9Q%L$>`!04````
+M```````````````$```````5?!9$'@`4%``````````#````````!```````
+M%(P4R!X`%!0``````````````````````````!0\%'@>`!04````````````
+M```````````````6P1;!'@`4%```````````````````!```````%`H46@4&
+M*"@``````````````````````````!2"%-(%!B@H``````````$`````````
+M```````4^A5R!08H*```````````````````````````%9H6$@4&*"@`````
+M`````0```````````````!0>%$8%!B@H```````````````````````````4
+M;A2^!08H*``````````!````````````````%.857@4&*"@`````````````
+M`````````````!6&%B8%!B@H``````````$````````````````44!1X$08H
+M*```````````````````````````%%`4>!<&*"@`````````````````````
+M`````!1:%%H1!B@H```````````````````````````46A1:%P`H*```````
+M````````````````````%*`4H!<&*"@``````````0`````````"`````!2@
+M%*`4!B@H``````````$``````````@`````4@A2"$0`H*``````````!````
+M``````(`````%*H4JA0`*"@``````````0`````````"`````!2"%*H4`"@H
+M``````````$``````````@`````4@A2J%P8H*``````````!``````````(`
+M````%:06'!0&*"@``````````0`````````"`````!:`%J@4`"@H````````
+M```````````````````6@!:H'@8H*```````````````````````````%H46
+MK1X&*"@``````````````````````````!1:%((/`"@H``````````,`````
+M```$```````4JA2J$@`H*``````````#````````!```````%:06'!0`*"@`
+M`````````P````````0``````!:`%J@4`"@H```````````````````$````
+M```)"`E$!084!0``````````````````````````"0@)1!0`%`4`````````
+M``````````````````EL":@%!A0%```````````````````````````);`FH
+M%``4!0```````````````````"``````"6P)J!X`%`4`````````````````
+M``````````EL"9X;!A0%```````````````````````````);`F>%``4!0``
+M`````````````````"``````"8`)BA0`%`4`````````````````````````
+M``F9":@4`!0%```````````````````````````)HPFH%``4!0``````````
+M````````("``````";0)M`4&%`4```````````````````````````FT";04
+M`!0%```````````````````H(``````)T`JL!084!0``````````````````
+M````````"0@)1!0`%`4```````````````````````````EL"6P4`!0%````
+M```````````````````````)<0F`%``4!0``````````````````````````
+M"84)BA0`%`4```````````````````````````F/"9D4`!0%````````````
+M```````````````)G@F>%``4!0``````````````````````````":,)HQ0`
+M%`4``````````(````````0```````FC":,4`!0%``````````"`````````
+M```````)J`FH%``4!0``````````@```````!```````":@)J!0`%`4`````
+M`````(````````````````FT";04`!0%``````````"````````$```````)
+MM`FT%``4!0``````````@```````````````"0@)1`4&%`4`````````````
+M``````````````D("404`!0%```````````````````````````);`FH!084
+M!0``````````````````````````"6P)J!0`%`4```````````````````!`
+M``````EL":@>`!0%```````````````````````````);`F>&P84!0``````
+M````````````````````"6P)GA0`%`4```````````````````!```````F`
+M"8H4`!0%```````````````````````````)F0FH%``4!0``````````````
+M````````````"=`*K`4&%`4```````````````````````````FC":@4`!0%
+M```````````````````@(``````)"`E$%``4!0``````````````````````
+M````"6P);!0`%`4```````````````````````````EQ"8`4`!0%````````
+M```````````````````)A0F*%``4!0``````````````````````````"8\)
+MF10`%`4```````````````````````````F>"9X4`!0%````````````````
+M```````````)HPFC%``4!0``````````@```````!```````":,)HQ0`%`4`
+M`````````(````````````````FH":@4`!0%``````````"````````$````
+M```)J`FH%``4!0``````````@```````````````"0@)1`4&*"@`````````
+M``````````````````F%"84%!B@H```````````````````````````)A0F%
+M%`8H*```````````````````````````"84)A1(&*"@`````````````````
+M``0```````G0"JP%!B@H```````````````````````````!_Q``````````
+M``$````````````````````@"``"`````````````````````/\`````````
+M````````)!$````````````````````4!0```````````````````@4`````
+M```````````````3```````````!4!``````````````````````````````
+M``$`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````"4!`````````````````````````````````$````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````#4!``````````
+M```````````````````````($```````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````$4!``````````````````````````````
+M``"```"`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````%4!````````````````````````````````!`````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````&4#``````````
+M``(``````````P````````"``$"````````````````````)"```````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````(4#````````````````````````````,`
+M``$`!```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````)4#````````````(`````````!`````,````0(`0`````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````!,#``````````
+M``(`````````!`````,`"```@$``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````",#````````````(`````````!`````,`
+M``````!`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````#,#````````````(`````````!`````,`"````$``````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````$,#``````````
+M``(`````````!`````,``````"!`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````%,#````````````(`````````!`````,`
+M```````0````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````&,#````````````(`````````!`````,````!`!$`````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````!$!``````````
+M``````````````````````(``0`@```````````````````2!```````````
+M````````(!$`````````````````````````````````````````````````
+M```````````````````````````!(!``````````````````````````````
+M``0``@(`````````````````````````````````````````(!(`````````
+M````````````````````````````````````````````````````````````
+M```````!8!````````````$``````````P````````(`0(`@````````````
+M```````0Q```````````````````!"$`````````````````````````````
+M```````````````````````````````````````````````!91``````````
+M``$``````````P``````````````.```````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````!0$``````````````````````"`````(`
+M```````$````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````"0$``````````````````````$`````(````````%QP``````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````#0$``````````
+M``````````"```````(```````"`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````$0$````````````0```````"```````(`
+M`````$"`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````%0$````````````0```````"```````(````"`$"`````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````&0$``````````
+M````````````"`````(```````"(````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````'0$````````````0```````"`"`````(`
+M`````$"$````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````(0$````````````0```````"`"`````(````"`$"$````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````)0$``````````
+M``````````"```````(```````"!QP``````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````+0$````````````0```````"```````(`
+M`````$"!QP``````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````-4/\`````````````````````````````````````````````````
+M````````````````````````````````````````````````````"@``````
+M``````````````H````````````````````````````````*,/\`````````
+M````````````@`````,`````````````````````````````````````````
+M```````````````````````````````!`````````````````````0``````
+M```````````````$```````````+,#`````````````````````!``````,`
+M````````````````````````````````````````````````````````````
+M````````````@````````````````````(`````````````````````$````
+M```````,,#`````````````````````"``````,`````````````````````
+M````````````````````````````````````````````````````$```````
+M`````````````!`````````````````````$```````````*$!``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````(````````````````````"``````
+M```````````````$```````````*0$````````````````````!X8`````(`
+M````````````````````````````````````````````````````````````
+M```````````*0```````````````````!$`````````````````````$````
+M```````*4$``````````````````````````````````````````````````
+M````````````````````````````````````````````````````"```````
+M``````````````@````````````````````$```````````!F3``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"`````````````````````@`````
+M```````````````$````````````8/\```````````,````````$``````@`
+M`^````````````````````````+`````````````````````````````````
+M`````````*_````````````````````+\``````````````````````(````
+M````````9O\```````````,````````$``````@``^``````````````````
+M``````+```````````````````````````````````````````?`````````
+M```````````!\``````````````````````(````````````9_\`````````
+M``,````````$``````@``^````````````````````````+`````````````
+M`````````````````````````````"_````````````````````+\```````
+M```````````````(````````````:/\```````````,````````$``````@`
+M`^````````````````````````+`````````````````````````````````
+M`````````%?````````````````````5\``````````````````````(````
+M````````8?\```````````,````````$`````!```^``````````````````
+M`````````````````````````````````````````````````*_`````````
+M```````````+\``````````````````````(````````````8O\`````````
+M``,````````$`````!```^````````````````````````+`````````````
+M`````````````````````````````*_````````````````````+\```````
+M```````````````(````````````8_\```````````,````````$``````@`
+M`>````````````````````````+`````````````````````````````````
+M`````````"_````````````````````+\``````````````````````(````
+M````````9/\```````````,````````$`````!``'``(````````````````
+M``````+```````````````````````````````````````````?`````````
+M```````````!\``````````````````````(````````````9?\`````````
+M``,````````$`````!``"(0`````````````````````````````````````
+M`````````````````````````````%?````````````````````5\```````
+M```````````````(````````````:?\```````````,````````$`````!``
+M`\````````````````````````+`````````````````````````````````
+M``````````?````````````````````!\``````````````````````(````
+M````````:O\```````````,````````$`````!```\``````````````````
+M`````````````````````````````````````````````````"_`````````
+M```````````+\``````````````````````(```````````!F/\`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````0`#P`/,``(&(`/``\P```$$`@`"#``"!
+MB0"``(,```!(`/(`]0``@8H`\@#U````0P#V`/<``(&+`/8`]P```$H`\0#T
+M``"!C`#Q`/0```!+`($`A```@8T`@0"$````3`""`(4``(&/`((`A0```8@`
+M\`#S```!B0"``(,```&*`/(`]0```8L`]@#W```!C`#Q`/0```&-`($`A```
+M`8\`@@"%```````(```````````````````````````````````````````!
+M`A=P"P",```````!`B,H#P`2```````!`B[@"@"8`@`````!`D90#@`D`@``
+M```!`EW`"0"P!``````!`HR@#0!(!``````!`KN`"`!@!``````!`M+P#`!L
+M!```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````(````````````````````````
+M```````````````````!`Q=P"P",```````!`R,H#P`2```````!`R[@"@"8
+M`@`````!`T90#@`D`@`````!`UW`"0"P!``````!`XR@#0!(!``````!`[N`
+M"`!@!``````!`]+P#`!L!```````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````(````
+M```````````````````````````````````````!`A=P"P",```````!`B,H
+M#P`2```````!`B[@"@"8`@`````!`D90#@`D`@`````!`EW`"0"P!``````!
+M`HR@#0!(!``````!`KN`"`!@!``````!`M+P#`!L!```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````(```````````````````````````````````````````!
+M`Q=P"P",```````!`R,H#P`2```````!`R[@"@"8`@`````!`T90#@`D`@``
+M```!`UW`"0"P!``````!`XR@#0!(!``````!`[N`"`!@!``````!`]+P#`!L
+M!```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````$````````````````````````
+M```````````````````!``/H"P""```````!``?0"@2$`0`````!`!5\"02+
+M`0`````!`"KX"`26`0``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````*($````
+M`````````*((4#Y&1E`^1D8``*(,9(!!;&2`06P``*(0`9F@`P&9H`,``*(4
+M!$S6$`1,UA```*(8$X``0!.``$```*(<&^``8!O@`&```*(@#%.`"@Q3@`H`
+M`*(D`!3?.P`4WSL``*(H```!M0```;4``*(L````(````"```)B<````````
+M`````)B<`````````````)B<`````````````)B<`````````````)B<````
+M`````````)B<`````````````)B<`````````````)B<`````````````)B<
+M`````````````)B<`````````````)B<`````````````)B<`#@````X````
+M`)B<`````````````)B<`````````````)B<`````````````)B<``0`^0`$
+M`/D``)C4``````````0``)B<`````````````)B<`````````````)B<````
+M`````````)B<`````````````)B<`````````````)B<$````!```````)B<
+M!`````0``````)B<`````````````)B<`````````````)B<````````````
+M`)B<``````H``````)B<`#@`@`(X`(```)B<``(`!@````8``)B<````D@``
+M`)(``)B<````H````*```)B<``0`!P`$``<``)C4````&@```!H``)B<````
+M2````$@``)B<````$````!```)B<````"`````@``)B<````#P````\``)B<
+M````\@```&(``)B<``"03P``D$P``)B<```26@``$IH``)C,````#@````\`
+M```(```````````````````````````````````````````!`A=P"P",````
+M```!`B,H#P`2```````!`B[@"@"8`@`````!`D90#@`D`@`````!`EW`"0"P
+M!``````!`HR@#0!(!``````!`KN`"`!@!``````!`M+P#`!L!```````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````(````````````````````````````````````
+M```````!`@NX"P"&```````!`A&4#P`)```````!`A=P"@",`@`````!`B,H
+M#@`2`@`````!`B[@"0"8!``````!`D90#0`D!``````!`EW`"``P!``````!
+M`FEX#``V!```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````(````````````````
+M```````````````````````````!`@7<"P"#```````!`@C*#P`$```````!
+M`@NX"@"&`@`````!`A&4#@`)`@`````!`A=P"0",!``````!`B,H#0`2!```
+M```!`B[@"``8!``````!`C2\#``;!```````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```'```````````````````````````````````````````!`Q=P"P",````
+M```!`R[@"@"8`@`````!`T90#@`D`@`````!`UW`"0"P`P`````!`XR@#0!(
+M`P`````!`[N`"`!@`P`````!`]+P#`!L`P``````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````(````````````````````````````````````
+M```````!`Q=P"P",```````!`R,H#P`2```````!`R[@"@"8`@`````!`T90
+M#@`D`@`````!`UW`"0"P!``````!`XR@#0!(!``````!`[N`"`!@!``````!
+M`]+P#`!L!```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````$````````````````
+M```````````````````````````!``/H&P""```````!``?0&@2$`0`````!
+M`!5\&02+`0`````!`"KX&`26`0``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```,```````````````````````````````````````````!``/H&P""````
+M```!``?0&@2$`0`````!`!5\&02+`@`````!`"KX&`26`P```````A=P"P`,
+M!````````B,H#P`2!``````!`B[@"@`8!@`````!`D90#@`D!@`````!`EW`
+M"0`P"``````!`HR@#0!("``````!`KN`"`!@"``````!`M+P#`!L"```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````-````````````````````````````````````
+M```````!!`#Z`P"!``)D`F0!!`'T!P"!``')`<D!!`/H`@""`0#D`.0!!`?0
+M!@"$`@"@`*`!!`NX`0"&`P",`(P!`A=P"P",!``\`#P!`B,H#P`2!``\`#P!
+M`B[@"@"8!@`P`#`!`D90#@`D!@`P`#`!`EW`"0`P"``L`"P!`HR@#0!("``L
+M`"P!`KN`"`!@"``L`"P!`M+P#`!L"``L`"P`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H
+M1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N,@``1T-#.B`H1TY5*2`S+C,N
+M,@``1T-#.B`H1TY5*2`S+C,N,@``+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A
+M8@`N<F5L+G1E>'0`+G)E;"YR;V1A=&$`+G)O9&%T82YS='(Q+C0`+G)E;"YD
+M871A`"YB<W,`+F-O;6UE;G0`````````````````````````````````````
+M`````````````````````!\````!````!@`````````T``(&<```````````
+M````!``````````;````"0````````````,/\```G;`````+`````0````0`
+M```(````*0````$````"```````"!J0``(7$```````````````$````````
+M`"4````)`````````````ZV@```)@`````L````#````!`````@````Q````
+M`0```#(```````*,:````0````````````````0````!````1`````$````#
+M```````"C6@``%"8```````````````$`````````$`````)````````````
+M`[<@````0`````L````&````!`````@```!*````"`````,```````+>````
+M`9@```````````````0`````````3P````$````````````"W@````.H````
+M```````````!`````````!$````#`````````````N&H````6```````````
+M`````0`````````!`````@````````````+D"```&=`````,````!P````0`
+M```0````"0````,````````````"_=@``!(6```````````````!````````
+M```````````````````````````````````#```!`````````````````P``
+M`P````````````````,```4````````````````#```&````````````````
+M`P``"`````````````````,```D````!``"D>````+`2```!````#```CVP`
+M```($@```0```!<``3%0```":!(```$````B``!MG````)02```!````+0`!
+M30````)P$@```0```#@``````````!````````!"``#Z_````%`2```!````
+M30`!6<@```&8$@```0```%@``%_@```!5!(```$```!C``&EZ````2P2```!
+M````;@``.,@```&D$0``!@```'D``3?D````.!(```$```"$``!B]````$02
+M```!````CP``4D@```#L$@```0```)H``$AD```!I!$```8```"E``$IK```
+M`$`2```!````L``!)&0````@$@```0```+L``1=4````$!(```$```#&``#Y
+MM````402```!````T0`!!R````$0$@```0```-P```LP````K!(```$```#G
+M``#J&````+P2```!````\@``T'@```#$$@```0```/T``+2,````?!(```$`
+M``$(``"YT````!@2```!```!$P``E%P```!$$@```0```1X``2W$````2!(`
+M``$```$I``#X-`````@2```!```!-``!$_P````H$@```0```3\``4]P````
+MQ!(```$```%*```'_````%02```!```!50``_:0```$X$@```0```6```*DP
+M````"!(```$```%K``&2O````:`2```!```!=@``F+@````($@```0```8$`
+M`+GH````'!(```$```&,```/[````:02```!```!IP``0W@```&D$0``!@``
+M`;(``27$````E!(```$```&]``"5A````(02```!```!R````[@````P$@``
+M`0```=,``9:D````@!(```$```'>```````````0```````!_P``:20```!0
+M$@```0```@H``2A8```!/!(```$```(5``$G[````&P2```!```"(```[<@`
+M``"<$@```0```BL``&P8````.!(```$```(V``"OH````%P2```!```"00``
+MM0@```"8$@```0```DP``.Z8````/!(```$```)7``"L_````"02```!```"
+M8@`!)J````!\$@```0```FT``)D$```!-!(```$```)X``!H*````$@2```!
+M```"@P``CZ@````\$@```0```HX``1YX````H!(```$```*9``"VW````$P2
+M```!```"I``!)E@````P$@```0```J\``248````?!(```$```*Z``#\*```
+M`'`2```!```"Q0`!4$P````T$@```0```M```&+L````"!(```$```+;``$G
+M'````)@2```!```"Y@``5N@```:4$@```0```O$``+9D````/!(```$```+\
+M``$A=````&@2```!```#!P```UP```!<$@```0```Q(``264````,!(```$`
+M``,=``%\#````4P2```!```#*``!$L0```!`$@```0```S,``5A<````R!(`
+M``$```,^``!K>````#`2```!```#20``J7P```"X$@```0```U0``*XH````
+M=!(```$```-?``".?````#@2```!```#:@`!@N````"8$@```0```W4``((`
+M```"G!(```$```.```!OV`````02```!```#BP`!@W@````X$@```0```Y8`
+M`)%8```#!!(```$```.A```!Q````8P2```!```#L``!:20```0T$@```0``
+M`[L``````````!````````/"``$U_````102```!```#S0``MA0````@$@``
+M`0```]@``8!\```!C!(```$```/C``$LB````3P2```!```#[@`!-R@````<
+M$@```0```_D```-0````#!(```$```0$``"Q8````!P2```!```$#P``[M0`
+M``#T$@```0``!!H``.YD````-!(```$```0E``#)&````$P2```!```$,```
+M77P````4$@```0``!#L``&NH````<!(```$```1&```#Z````<P2```!```$
+M7``!5SP````X$@```0``!&<``)HX```!%!(```$```1R``!M;````#`2```!
+M```$?0``````````$```````!(<``*;D````)!(```$```22``%0-````!@2
+M```!```$G0``V70````T$@```0``!*@``1FT```$4!(```$```2S``$6"```
+M`!`2```!```$O@``8_````"H$@```0``!,D``*4H````8!(```$```34``&:
+M#````%02```!```$WP`!%[0```%,$@```0``!.H``+7L````!!(```$```3U
+M``!HK````'@2```!```%````[;`````8$@```0``!0L``/\T```'B!(```$`
+M``46``%_U````*@2```!```%(0`!)%P````($@```0``!2P``*S8````)!(`
+M``$```4W``$XU````'@2```!```%0@``CV0````($@```0``!4T``8W<```"
+MQ!(```$```58``"\+````-P2```!```%8P``9U````!0$@```0``!6X``2>T
+M````.!(```$```5Y``$&O````&02```!```%A```]?P````@$@```0``!8\`
+M`9<D````6!(```$```6:```````````0```````%IP``D+````"H$@```0``
+M!;(``'5L````W!(```$```6]``&2>````$02```!```%R``!F`0````0$@``
+M`0``!=,``2(\````Q!(```$```7>```&$````:`2```!```%[P`!AM@```2L
+M$@```0``!?H``&Q0````H!(```$```8%``"65````+@2```!```&$```M>``
+M```$$@```0``!AL``22$````(!(```$```8F``&G%````+@2```!```&,0``
+M=*P```!X$@```0``!CP``0Z$````P!(```$```9'``"I.````$02```!```&
+M4@``RP0```&L$@```0``!ET``(ZT````L!(```$```9H``%A>```!J@2```!
+M```&<P`!.BP```"P$@```0``!GX``3.X````,!(```$```:)``"]"````:@2
+M```!```&E``!*>P```*<$@```0``!I\``+,(````>!(```$```:J``"U]```
+M`"`2```!```&M0`!+@P```-$$@```0``!L```8/P```!8!(```$```;+``&:
+M8```!B02```!```&U@``MJ`````\$@```0``!N$``)M0````%!(```$```;L
+M``!B!````!`2```!```&]P``I8@```%<$@```0``!P(``2!X````3!(```$`
+M``<-``!P;````"@2```!```'&``![K@```$H$@```0``!R,``&_,````!!(`
+M``$```<N``$DQ````!`2```!```'.0`!(W````!,$@```0``!T0``$NL```!
+MI!$```8```=/``#VB````'P2```!```'6@`!J\````!<$@```0``!V4``&YX
+M````?!(```$```=P``"Z!````!P2```!```'>P``=D@```'\$@```0``!X8`
+M`4S4````+!(```$```>1``$>+````"02```!```'G``!(,0```"P$@```0``
+M!Z<``9A````!S!(```$```>R``"`M````!P2```!```'O0``<P0````<$@``
+M`0``!\@``&H(````[!(```$```?3``!U0````"P2```!```'W@`!'_````"(
+M$@```0``!^D``5,$```#-!(```$```?T```````````0```````'_@`!C"P`
+M``&P$@```0``"`D``#P0```!I!$```8```@4``!DF````:02```!```('P``
+M13````"`$@```0``""H``(]T````-!(```$```@U``!U)````!P2```!```(
+M0```````````$```````"&```'A$```'D!(```$```AK``````````D1```&
+M```(>P`!6V````"8$@```0``"(8``*Z<````0!(```$```B1``(%2````2@2
+M```!```(G``!"#````"`$@```0``"*<``2'X````1!(```$```BR``!OW```
+M``02```!```(O0`!5]0```"($@```0``",@``+7D````"!(```$```C3``"Y
+M0````"02```!```(W@``JC0```"H$@```0``".D``234````/!(```$```CT
+M```````````0```````)`P``KQP```!($@```0``"0X``$H(```!I!$```8`
+M``D9``$UV````"02```!```))``!#_0```!@$@```0``"2\``-$\````8!(`
+M``$```DZ``"`G````!@2```!```)10``L[````"4$@```0``"5```188```!
+M/!(```$```E;``!%'````:01```&```)9@`!*90````8$@```0``"7$``+#X
+M````:!(```$```E\``$YH````(P2```!```)AP`!HZ````)($@```0``"9(`
+M`*K<```!U!(```$```F=``!SQ````#`2```!```)J```K9P```!`$@```0``
+M";,``-38```!5!(```$```F^``"'>````!@2```!```)R0`!.%P```!X$@``
+M`0``"=0``$;````!I!$```8```G?``"NW````$`2```!```)Z@``L$@```"P
+M$@```0``"?4``&KT````:!(```$```H```&+H````"`2```!```*"P``````
+M````$```````"AH``/@\````1!(```$```HE``$>4````"@2```!```*,```
+M9F0````D$@```0``"CL``2:(````&!(```$```I&``"UV`````@2```!```*
+M40`!'U@```"8$@```0``"EP``#VT```!I!$```8```IG``"[\````!P2```!
+M```*<@``IP@```$L$@```0``"GT```%H````7!(```$```J+```Z;````:01
+M```&```*E@``NW@```!X$@```0``"J$``*@T````$!(```$```JL````#```
+M`"01```&```*O@``:70````H$@```0``"LD``&GT````%!(```$```K4``$7
+M9````%`2```!```*WP``<A````!L$@```0``"NH``:E0```"<!(```$```KU
+M``!R?````"02```!```+````M'0````8$@```0``"PL``3>@````1!(```$`
+M``L6``!0]````1`2```!```+(0`!BX0````<$@```0``"RP``+L`````>!(`
+M``$```LW``"UH````#@2```!```+0@`!-V````!`$@```0``"TT``/8<````
+M)!(```$```M8``&#L````$`2```!```+8P``M$0````P$@```0``"VX``6@@
+M````S!(```$```MY``"H1````.P2```!```+A```^(````$T$@```0``"X\`
+M`#]8```!I!$```8```N:``!SE````#`2```!```+I0`!F!0````L$@```0``
+M"[```&%8````K!(```$```N[``!RH````$P2```!```+Q@``\5````20$@``
+M`0``"]$``'`,````8!(```$```O<``!N8````!@2```!```+YP`!$%0```&\
+M$@```0``"_(``8((````V!(```$```O]``"\#````"`2```!```,"```4@0`
+M``!$$@```0``#!,``1.(````=!(```$```P>```.Y````(02```!```,*0``
+M"20```(,$@```0``##0``1*$````0!(```$```P_``!N]````)@2```!```,
+M2@``<NP````8$@```0``#%4``7H$````E!(```$```Q@``!GZ````$`2```!
+M```,:P`!:.P````X$@```0``#'8``$)8````*!(```$```R!```%M````%P2
+M```!```,C``!'Q@```!`$@```0``#)<``````````!````````RG``#9J```
+M`:`2```!```,L@``````````$```````#+L``&$T````)!(```$```S&``&0
+MH````=@2```!```,T0``:'`````\$@```0``#-P``1D`````M!(```$```SG
+M``"R:````*`2```!```,\@``]P0```$P$@```0``#/T``````````!``````
+M``T=```(4````-02```!```-*```9K0```!4$@```0``#3,``&<(````0!(`
+M``$```T^``"MW````$P2```!```-20``8S@```"X$@```0``#50``*_\````
+M3!(```$```U?``$(L```!9@2```!```-:@``MC0````@$@```0``#74``3K<
+M```"`!(```$```V```!OQ`````@2```!```-BP``9CP````H$@```0``#98`
+M`&GL````"!(```$```VA```````````0```````-KP``K+`````H$@```0``
+M#;H```QX```!(!(```$```W%``!OX````"P2```!```-T```NL````!`$@``
+M`0``#=L``+<H````,!(```$```WF``"!/````,02```!```-\0``<_0```!`
+M$@```0``#?P``&F<````4!(```$```X'``$>!````"@2```!```.$@`!-T0`
+M```<$@```0``#AT``4Q`````E!(```$```XH``"O9````#P2```!```.,P`!
+M$TP````\$@```0``#CX``5OX```%@!(```$```Y)``!K7````!P2```!```.
+M5```N60```!L$@```0``#E\``+%\````,!(```$```YJ``"7#````:P2```!
+M```.=0``K2@```!T$@```0``#H```+7P````!!(```$```Z+``"/Y````,P2
+M```!```.E@``35````&D$0``!@``#J$``&:L````"!(```$```ZL``"M(```
+M``@2```!```.MP``7X````!@$@```0``#L(``&(4````V!(```$```[-``$3
+M!````$@2```!```.V```#V@```"$$@```0``#N,``9:`````)!(```$```[N
+M``$E$`````@2```!```.^0``LAP```!,$@```0``#P0``7D<````Z!(```$`
+M``\/``"XU````&P2```!```/&@``OK````I0$@```0``#R4``$[T```!I!$`
+M``8```\P``$.:````!P2```!```/.P``9Z````!($@```0``#T8```>P````
+M3!(```$```]1``!FB````"02```!```/7``!E%P```(D$@```0``#V<``88,
+M````S!(```$```]R``!S(````!P2```!```/?0``LX`````P$@```0``#X@`
+M`3<0````&!(```$```^3``!S/````%@2```!```/G@``7H0```!X$@```0``
+M#ZD``&XP````,!(```$```^T``"@R````"@2```!```/OP``#9@```%,$@``
+M`0``#\H``/KX````!!(```$```_5``"4H````%P2```!```/X```NF`````P
+M$@```0``#^L``&_0````"!(```$```_V``#PA````,P2```!```0`0`!.!P`
+M``!`$@```0``$`P``;V@```!#!(```$``!`7``!OC````#@2```!```0(@``
+M4S0````H$@```0``$"T``$F@```'5!(```$``!!#``$Y3````%02```!```0
+M3@``=#0```!X$@```0``$%D``3S<```/9!(```$``!!D``$4)````>02```!
+M```0;P``]D````!($@```0``$'H``+J0````,!(```$``!"%``"4_````(@2
+M```!```0D```0>P```!L$@```0``$)L``)C`````1!(```$``!"F``"`T```
+M`&P2```!```0L0``NB````!`$@```0``$+P``,D`````&!(```$``!#'``!>
+M_````(02```!```0T@``FTP````$$@```0``$-T``&SP````?!(```$``!#H
+M``#H\````$02```!```0\P`!-6P```!L$@```0``$/X``2.\````H!(```$`
+M`!$)``"QK````'`2```!```1%```F]0```3T$@```0``$1\``(JD```#8!(`
+M``$``!$J``$DI````"`2```!```1-0``]>`````<$@```0``$4```=G4```!
+M&!(```$``!%+``$C`````'`2```!```15@`!$A````!T$@```0``$6$``5"`
+M```"A!(```$``!%L``&+P````"02```!```1=P``````````$```````$8D`
+M`*0`````>!(```$``!&4``$/1````+`2```!```1GP``````````$```````
+M$;```&=(````"!(```$``!&[``"V5````!`2```!```1Q@``E@@```!,$@``
+M`0``$=$``2'<````'!(```$``!'<``%S0````1`2```!```1YP``R60```&@
+M$@```0``$?(``$2\````=!(```$``!(+``&+Y````$@2```!`'IZ,#`U8C4X
+M-#8`>GHP,#)D8C$Q8P!Z>C`R9&)F.#<U`'IZ,#)D8F(Q8C(`>GHP,F1B,C`U
+M,P!?7V%S:&QD:3,`>GHP,#)D8F$T,@!Z>C!F8F(Q93-F`'IZ,&(W.65A.30`
+M>GHP-6(X8S8U80!Z>C`P-6(T,&%D`'IZ,#5B.30R960`>GHP9#AD8S8R8P!Z
+M>C`P,3EF-#<P`'IZ,#)D9#DT,F0`>GHP,F1B93<S9`!Z>C`P-6(V.3)B`'IZ
+M,&(V9#(S,C4`>GHP,#5B.#4S9`!Z>C`P,39D.3)E`'IZ,&-F8C$X-S4`>GHP
+M,#)D8C,Q8P!Z>C`R9&%B8F%C`'IZ,#)D8F,X-3$`>GHP,#!B-F,V.`!Z>C`P
+M,&(V8F8X`'IZ,#!B-F-F-64`>GHP,39E,61F9`!Z>C!B-F8U,&(X`'IZ,#9E
+M,&$T9F4`>GHP,#8W9#)B,0!Z>C`P,F1B8S8Q`'IZ,&(V8V$S,C4`>GHP,#5B
+M-F-F9`!Z>C`Q-F4P9&9D`'IZ,#`P8C9F-C@`871H7VAA;%]P<F]C97-S7VYO
+M:7-E9FQO;W(`>GHP,#5B-#AA9`!Z>C`R9&)F,6(R`'IZ,#`U8C@X8V(`>GHP
+M,S-E8SAB9@!Z>C!D8C0R-6,U`&%T:%]H86Q?9&UA7V)E86-O;E]R97-P;VYS
+M95]T:6UE`'IZ,#!B-F8Q-C$`>GHP-F4P,&(X80!Z>C`R9&)F8S%D`'IZ,&1C
+M-&4S.3``>GHP9&%F960X-@!Z>C`P8C9E,C=A`'IZ,#)D8F)A8C(`>GHP8C9D
+M,65F9@!Z>C`Q-F0Y,&1D`'IZ,#)D8F4X-3$`>GHP,#5B-C1F9`!Z>C`P,&(V
+M9#4R`'IZ,&(V8SEE9F8`>GHP,39E,#!D9`!Z>C`R9&)D.#<U`'IZ,#)D8C,Q
+M8C(`>GHP,&(W,#DR,P!Z>C`P8C9D-#4P`'IZ,#`P8C9D,60`>GHP8C9C,C,R
+M-0!Z>C`R9&)D86(R`'IZ,#`P-6(V,S(`>GHP-F1E9&0Y,P!Z>C`P,39D834P
+M`'IZ,#`P-C=D,S(`>GHP,&(V9#DR,P!Z>C`P,F1B-3%C`'IZ,#$V9&-B9F4`
+M>GHP,&(W,#$T-0!Z>C`P,39D9C)C`'IZ,&(W9F%D,V4`>GHP,39D.3DR,`!Z
+M>C`R9&(Q8F%C`'IZ,&1C-F4S.3``>GHP-6(W,#%E,`!Z>C`P,&(V8C$P`'IZ
+M,&(W,#EE9F8`>GHP,39D9C@Y8@!A=&A?:&%L7V%T=&%C:`!Z>C`V93!F8S!D
+M`&UE;6-P>0!Z>C`Q-F1A8C)D`'IZ,#)D8C$S-60`>GHP93`T-C@T8@!Z>C`Q
+M-F4R.3%D`'IZ,#`P8C9F93@`>GHP,&-F8C-E,`!Z>C`P,39D.30X`'IZ,#$V
+M93(P.6(`>GHP8C<P,65F9@!Z>C`P,&(V8SED`'IZ,#`P-6(U83(`>GHP,F1B
+M,3<P80!A=&A?:&%L7V-O;7!U=&5T>'1I;64`>GHP,F1B-6)A8P!Z>C`P-6(X
+M,3-D`'IZ,#!B-F,Y,C,`7U]U9&EV<VDS`'IZ,&(V8C4P8C@`>GHP,#5B-V8Y
+M9`!Z>C!B-S`Q9#`R`'IZ,#9D9F8T-&$`>GHP,F1B-3<V,P!Z>C`V965A9C8P
+M`'IZ,&4P,#=C83$`>GHP,#)D868V,@!Z>C!B.#-A9#-E`'IZ,#`P8C9B.3``
+M>GHP,39D.65F80!Z>C`Q-F1E,#4Q`'IZ,#`P-6(V8C(`>GHP-6(W9C$Q-`!Z
+M>C`T864P,S%F`'IZ,#)D8F1D9F0`>GHP,#4T-V9E9`!Z>C`P8C9B9C5E`'IZ
+M,#!B-S$W-V0`>GHP,&(W,&8S9`!Z>C`Q-F0X.3(P`'IZ,#)D8C%A8C(`>GHP
+M,#`U8C8R,@!Z>C`P,&(V9C<X`'IZ,&(V.6(P-V,`871H7VAA;%]F<F5E`'IZ
+M,#5B-SEB,6(`>GHP,&(W,#<S9`!Z>C`R9&)E8F)D`'IZ,&(U93,Q-3(`>GHP
+M,39D9F)F,0!A=&A?:&%L7VUH>C)I965E`'IZ,#$V93$X.6(`>GHP9&,R835C
+M-0!Z>C`P,F1C-C!B`'IZ,#9D9C!B.&$`>GHP,F1B,S,U9`!Z>C!B-F,U,V$T
+M`'IZ,&8U-&0Q8C``>GHP8C9F9#,V,P!Z>C!D.61C-C)C`'IZ,#5B-S0Q93``
+M>GHP,F1A.6)A8P!Z>C!D8S(Q9#-A`'IZ,#!B-S$W,V0`>GHP,39D.60T,0!Z
+M>C`P-6(X-&9D`'IZ,#`U8CAA8F0`>GHP,&(W,#$R,P!Z>C`P-6(V-3)B`'IZ
+M,#)D8C,X-S4`>GHP,39E,S`Y8@!Z>C`P-6(V,&(R`'IZ,#)D8C$X-S4`>GHP
+M,#)D8C@T,@!Z>C`R9&(Q-S8S`'IZ,&(W9&5A.30`>GHP,&(W,#$V,0!Z>C`Q
+M-F0W9#0Q`'IZ,#`Q-F-D,S(`>GHP-F1E,&(X80!Z>C`V9#ED9#DS`'IZ,&1B
+M,V5D.#8`>GHP,#5B-#AE9`!Z>C`P,F1C.#!B`'IZ,#`R9&)C-#(`>GHP,F1B
+M83@U,0!Z>C`R9&(S,V5D`'IZ,#`U8C@P9F0`>GHP,#5B-V8R90!Z>C`R9&)F
+M9&9D`'IZ,#$V938T.&$`>GHP,#)D869F,@!Z>C`P-6(W-SED`'IZ,#`P8C9E
+M93@`>GHP,39E-#0X80!Z>C`P8C9F-F)C`'IZ,#$V9&$Y,C``>GHP-6(W.#%E
+M,`!?7W5M;V1S:3,`>GHP,#)D8V$P8@!Z>C`P-6(T-&%D`'IZ,#9D9&8T-&$`
+M>GHP9F%C,&,Y8@!Z>C!B-F8Y969F`'IZ,#!B-F,V8F,`871H7VAA;%]A9&1I
+M=&EO;F%L7W-W8F%?8F%C:V]F9@!Z>C`P,#)D8CDR`&%T:%]H86Q?=F5R<VEO
+M;@!Z>C`R9&)A8S)E`'IZ,#)D8C<Y864`>GHP,#$V934S,@!Z>C!B-F-F,#`Y
+M`'IZ,#`Q-F4Q,F,`>GHP,#$V9#EE-`!Z>C`P,#)D865A`'IZ,#`U8C5C8C(`
+M>GHP,39D83(U,0!Z>C`V9C9A9C8P`'IZ,#9D9F1D.3,`871H7VAA;%]M86QL
+M;V,`>GHP,#!B-F1D,@!Z>C`R9&0Y,F%D`'IZ,#$V9&(R-3$`>GHP93$P-V-A
+M,0!Z>C`P8C9C-S5E`'IZ,#$V9&0P-3$`>GHP,F1B9#%B,@!Z>C`R9&,Q-S8S
+M`'IZ,&(V.3!D-F0`>GHP,39D9C`U,0!Z>C`P,39D.34P`'IZ,#!B-S`V8F,`
+M>GHP,#$V9#@W,@!Z>C`V9&5F-#1A`'IZ,#5B.&,R960`>GHP-F9B.30W8@!Z
+M>C!E8F(Q93-F`'IZ,&(V9CED,#(`>GHP9#$T9#%B,`!Z>C!B-#@P,S%E`'IZ
+M,#$V9&)B9F4`>GHP,39E-30X80!Z>C`P,39D.#4P`'IZ,#`P8C9F9C@`871H
+M7VAA;%]M96UC<'D`>GHP,F1B8V)B9`!Z>C`Q-F1A,&1D`'IZ,#)D8F)D9F0`
+M>GHP,F1B,C@U,0!Z>C`R9&)D8S%D`'IZ,#9D8C!C9C(`>GHP,39E8CEA9`!Z
+M>C`P8C9C96)C`'IZ,&0Y-#@T83$`871H7VAA;%]P<F]B90!Z>C`Q-F5A.6%D
+M`'IZ,&9D-&0Q8C``>GHP,F1B,S<V,P!A=&A?:&%L7V)U:6QD;W!T<P!Z>C`R
+M9&%F,S5D`'IZ,#9D9&1D.3,`>GHP9&%D8S8R8P!Z>C`Q-F1F,C4Q`'IZ,#`P
+M8C9C,3``>GHP,39D.3(U,0!Z>C`R9&(P.#4Q`'IZ,&(W,C%A960`>GHP-C=C
+M9F-A90!Z>C`P,&(V8V8X`'IZ,&,Y-&0Q8C``>GHP,F1A9F%B,@!Z>C`U8CDR
+M865D`'IZ,#`U8CAC8V(`>GHP8C9D.65F9@!Z>C`R9&(Q,6(R`'IZ,#)D8F9F
+M8C$`>GHP,F1B9C<V,P!Z>C`P-6(V.&9D`'IZ,#`U8C0T960`>GHP8C<Q,6%E
+M9`!Z>C!B-64S,38P`'IZ,&0X-#@T83$`>GHP,39D.&(R9`!Z>C`Q-F4P.#EB
+M`'IZ,#)D8F(X-S4`>GHP,F1A93@U,0!Z>C!B.#%E83DT`'IZ,#$V9&5C,68`
+M>GHP,&(V9F5B8P!Z>C!E.#DT.3`W`'IZ,#!B-F5A-V$`>GHP,S-E.&9B9@!Z
+M>C!C9F$U.#<U`'IZ,#)D8CDY864`>GHP,F1B.6%B,@!Z>C`P,&(V8F4X`'IZ
+M,&1E-C@S-V8`>GHP,39D86)F90!Z>C!B-S`Y9#`R`'IZ,#8W9#(U93(`>GHP
+M,3EF,V$P,0!Z>C`W,#,Y-#=B`&%T:%]H86Q?;65M>F5R;P!Z>C`V9&9F8S!D
+M`%]?9&EV<VDS`'IZ,&(V-S4P8C@`>GHP,39E,F1F9`!Z>C`P,&(V9#(R`'IZ
+M,#9F96%F-C``>GHP9&,T835C-0!Z>C`P8C<P9C=D`&%T:%]H86Q?<W=?8F5A
+M8V]N7W)E<W!O;G-E7W1I;64`>GHP.68V-&(V80!Z>C`P-6(V-3=A`'IZ,#9F
+M,SDT-V(`>GHP-F1A,&-F,@!Z>C!B-V)A9#-E`'IZ,#!B-F8Y-C$`>GHP8C8Y
+M-S-B8P!Z>C`R9&)D,S5D`'IZ,#`U8C@X9F0`>GHP,F1B8F,Q9`!Z>C`R9&%F
+M9&9D`'IZ,#9D-V1D.3,`871H7VAA;%]D96QA>0!Z>C`R9&(Q9&9D`'IZ,#8W
+M9#)F-#$`>GHP,F1A9C@W-0!Z>C!B-V5D939D`'IZ,#$V9#AD-#$`>GHP,#)D
+M864Y,@!Z>C!B-V%D939D`'IZ,#)D8F(S-60`>GHP,F1B,V1F9`!Z>C`R9&(U
+M,V5D`'IZ,#$V9&-E864`>GHP,#!B-F1A,@!Z>C`P,&(V93(R`'IZ,#5B.#`P
+M-#$`>GHP,#$V9#@T.`!Z>C`Q-F0Y8C)D`'IZ,#`Q-F4P,F,`>GHP,&(W,#<W
+M9`!Z>C`P-6(V.3=A`'IZ,#`Q-F1A930`>GHP,39E,3`Y8@!Z>C`P-6(T83)D
+M`'IZ,#$V9&4P9&0`>GHP,39D9C!D9`!Z>C!D9C`W8V$Q`'IZ,#)D8F0W-C,`
+M>GHP,#!B-F4U,@!Z>C`V-V0P8S0W`'IZ,#5B-F,V9&(`>GHP8S,Q-65B-0!Z
+M>C!D8C%E9#@V`'IZ,#9D-#`V93``>GHP,39E,#(U,0!Z>C`P,#)D8F(R`'IZ
+M,#`R9&0X-F0`>GHP,#$V93$T9`!Z>C`R9&(U.6%E`'IZ,#`V-V0R,C$`>GHP
+M,39D.#!D9`!Z>C`P-6(X.3-D`'IZ,#5B.#%B,6(`>GHP,F1B,3-E9`!Z>C`P
+M8C9D,3(S`'IZ,#`P8C9C93@`>GHP-6(X86%E9`!Z>C!B-F5D,S8S`'IZ,#)D
+M868Q8C(`>GHP,#`U8C5E,@!Z>C`S,V5B9F)F`'IZ,#5B-C@V9&(`>GHP,#!B
+M-F5F.`!Z>C!B-S$Y865D`'IZ,#`U8C4X8C(`>GHP-6(W9&(Q8@!Z>C!B.#)D
+M939D`'IZ,#`Q-F0W,S(`>GHP,F1A9&%B,@!Z>C!F-#5E-F4S`&%T:%]H86Q?
+M:6YI=%]C:&%N;F5L<P!Z>C`P8C9D-F)C`'IZ,&,Q-&0Q8C``>GHP,#`R9&)D
+M,@!Z>C!D830X-&$Q`'IZ,#$V93!B.#<`>GHP-6(Y,#)E9`!Z>C!D8S)E,SDP
+M`'IZ,&$V,&0Q-#4`>GHP,F1B86)B9`!Z>C`P,&(V8S%D`'IZ,#5B.&5A960`
+M>GHP,#5B-V(Y9`!Z>C`P-6(U-#0V`'IZ,#5B-C0V9&(`>GHP,&(V9CDR,P!Z
+M>C!D9#8X,S=F`'IZ,#$V93$R-3$`>GHP9&,V835C-0!Z>C`R9&(S-S!A`'IZ
+M,#`P-6(V-S(`>GHP-F1E9F,P9`!Z>C`R9&)F,S5D`'IZ,#`P8C9C-S@`>GHP
+M,#$V9#@S,@!Z>C`R9&(U-S!A`'IZ,#`U8C9D-V$`>GHP,#)D8C(Y,@!Z>C`P
+M-6(Y,&-B`&%T:%]H86Q?<F5G7W=R:71E`'IZ,&(V9C4S-C,`>GHP,#5B-6,T
+M-@!A=&A?:&%L7W)E9U]R96%D`'IZ,#9D.3!C9C(`>GHP-F0X9&0Y,P!Z>C`Q
+M-F1F8C@W`'IZ,#`Q-F1A-#@`>GHP8C8V,S%A.`!Z>C`P,F1B,#DR`&%T:%]H
+M86Q?9V5T=VER96QE<W-M;V1E<P!Z>C`Q-F4Q8C@W````````%````0$````<
+M```!`0```"0```$!````+````0$````T```!`0```#P```$!````0````0$`
+M``!(```!`0```%````$!````5````0$```!D```!`0```&P```$!````<```
+M`0$```!\```!`0```(````$!````D````0$```"<```!`0```*````$!````
+MK````0$```"P```!`0```+P```$!````P````0$```#,```!`0```-````$!
+M````]````0$```$H```#`@```2P```,"```!-````P(```%(```#`@```5``
+M``,"```!5````P(```%8```#`@```5P```,"```!8````P(```%D```#`@``
+M`90```$!```!H````0$```&H```!`0```>P```$!```!\````0$```'X```!
+M`0```@````$!```""````0$```(,```!`0```A0```$!```"(````0$```(D
+M```!`0```C````$!```"-````0$```)````!`0```D@```$!```"5````0$`
+M``)8```!`0```F0```$!```";````0$```)X```!`0```GP```$!```"A```
+M`0$```*4``!X`0```I@```$!```"I``!B`$```*H```!`0```K0``$<!```"
+MN````0$```+,```!`0```X0``90!```#D````0$```.@``$Y`0```ZP```$!
+M```#Q````0$```/<```!`0``!!0```$!```$-````0$```0X```!`@``!#P`
+M``$"```$0````0(```1$```!`@``!$@```$"```$6````0$```2$``!K`0``
+M!)````$!```$H````0$```2L```!`0``!,@``&L!```$U````0$```3D```!
+M`0``!/````$!```%#```:P$```48```!`0``!30``&L!```%0````0$```5<
+M``!K`0``!6@```$!```%A```:P$```68```!`0``!B@```$!```&-````0$`
+M``9````!`0``!D0```$!```&3````0$```90``"_`0``!E@```$!```&:```
+M`0$```:<```!`0``!KP```$!```&T````0$```;X```!`0``!OP``+\!```'
+M!````0$```<4```!`0``!U0```$!```'8````0$```?,```!`0``!]```2$!
+M```'^````@(```@8```!`0``"!P``2$!```(+```:P$```A(```"`@``"'``
+M``$!```(C````0$```B<```!`0``".@``&<!```)"```9P$```D<```!`0``
+M"30```$!```).````0(```D\```!`@``"4````$"```)1````0(```E(```!
+M`@``"4P```$"```)4````0(```E4```!`@``"5@```$"```)7````0(```E@
+M```!`@``"60```$"```):````0(```EL```!`@``"7````$"```)=````0(`
+M``EX```!`@``"7P```$"```)@````0(```F$```!`@``"8@```$"```)C```
+M`0(```F0```!`@``"90```$"```)F````0(```F<```!`@``":````$"```)
+MI````0(```FH```!`@``":P```$"```)L````0(```FT```!`@``";@```$"
+M```)O````0(```G````!`@``"<@```$!```)]````0$```H````!`0``"C``
+M``$!```*/````0$```I$```!`0``"E````$!```*5````0(```I8```!`@``
+M"EP```$"```*8````0(```IL```!`0``"G0```$!```*?````0$```J$```!
+M`0``"I````$!```*G````0$```JH```!`0``"K0```$!```*O````0$```K`
+M```!`0``"LP```$!```*T````0$```K<```!`0``"N0```$!```*[````0$`
+M``L4```!`0``"T````$!```+1````0$```M,```!`0``"U````$!```+6```
+M`0$```M<```!`0``"V0```$!```+<````0$```MT```!`0``"WP```$!```+
+MA````0$```N(```!`0``"ZP```$!```+N````0$```P(```!`0``##```90!
+M```,7````0$```QH```!`0``#)0```$!```,F````0(```R<```!`@``#*``
+M``$"```,I````0(```RH```!`@``#*P```$"```,L````0(```RT```!`@``
+M#+@```$"```,O````0(```S````!`@``#,0```$"```,R````0(```S,```!
+M`@``#-````$"```,U````0(```S8```!`@``#-P```$"```,X````0(```SD
+M```!`@``#.@```$"```,[````0(```SP```!`@``#/0```$"```,^````0(`
+M``S\```!`@``#0````$"```-!````0(```T(```!`@``#0P```$"```-$```
+M`0(```T@```!`0``#3````$!```-5````0$```U<```!`0``#70```$!```-
+MA````0$```W0```!`0``#>@```$!```.!````0$```X4```!`0``#A@```$!
+M```.+````0$```Y(```!`0``#E@```$!```.7````0$```YT```!`0``#I``
+M``$!```.R````0$```]\``$``0``#X@```$!```/E````0$```^@``$A`0``
+M#^@```("```0(````0$``!`X```!`0``$$0``2$!```0A````0$``!"4```!
+M`0``$,@```$!```0V````0$``!$D```!`0``$4````$!```1@````0$``!&,
+M```"`@``$?@```$!```2!````@(``!((```"`@``$C````$!```2W````0$`
+M`!+H```!`0``$O0```$!```3#````0$``!,D```!`0``$U````$!```3@```
+M`0$``!.$```!`0``$Z@```$!```4`````0$``!1<```!`0``%+@```$!```5
+M&````0$``!5````!`0``%5P```$!```5;````0$``!7```#0`0``%<@```$!
+M```5]````0$``!9@```!`0``%I@```$!```6W````0$``!;H```!`0``%P0`
+M``$!```7&````0$``!<H```!`0``%Y````$!```7H````0$``!@D```!`0``
+M&5@```$!```9F````0$``!F<```!`0``&:0```$!```9J````0$``!FP```!
+M`0``&;0```$!```9P````0$``!G(```!`0``&>@```$!```9]````0$``!H(
+M```!`0``&A@```$!```:+````0$``!HX```!`0``&CP```$!```:2````0$`
+M`!IX```!`0``&GP```$!```:B````0$``!JX```!`0``&KP```$!```:T``!
+M(P$``!KH```!`0``&S````$!```;D````0$``!OP```!`0``'%0```$!```<
+ML````0$``!SH```!`0``'0P```$!```=2````0$``!U\```!`0``'80```$!
+M```=H````0$``!VH```!`0``';0```$!```=]````0$``!X```"%`0``'@P`
+M``$!```>=````0$``!ZH```!`0``'N@```$!```?$````0$``!\<```!`0``
+M'R0```$!```?1````0$``!](```!`0``'VP```$!```??````0$``!^$```!
+M`0``'Z0```$!```?J````0$``!_0```!`0``']P```$!```?[````0$``"`0
+M```!`0``(#````$!```@6````0$``""H```!`0``(/@```$!```A(````0$`
+M`"%D```!`0``(;P```$!```B'````0$``"(T```!`0``(D````$!```BA```
+M`0$``"*D```!`0``(N@```$!```C2````0$``".````!`0``(XP```$!```C
+MN````0$``"/L```!`0``)%0```$!```DO````0$``"4D```!`0``)3P```$!
+M```E2````0$``"5\```!`0``);P```$!```F)````0$``":$```!`0``)J@`
+M``$!```FT````0$``";H```!`0``)TP```$!```G:````0$``">8```!`0``
+M)_````$!```H,````0$``"A$```!`0``*%P```$!```HE```6@$``"B@``#0
+M`0``**P```$!```HO````0$``"C$``$C`0``*.@```$!```H\````0$``"D,
+M```!`0``*1P```$!```I)````0$``"E,```!`0``*5@``2,!```IA````0$`
+M`"F,```!`0``*:@```$!```IN````0$``"G````!`0``*>@```$!```I]``!
+M(P$``"H@```!`0``*B@```$!```J1````0$``"I4```!`0``*EP```$!```J
+M;```A0$``"IX```"`@``*J````$!```JK````0$``"JP```!`0``*L````$!
+M```JS````0$``"K8```!`0``*P0```$!```K"````0$``"L0```!`0``*Q0`
+M``$!```K(````0$``"LD```!`0``*SP```$!```K2````0$``"MD```!`0``
+M*W````$!```KC````0$``"N@```!`0``*\P```$!```L&````0$``"QX```!
+M`0``+,0```$!```M$````0$``"U4```!`0``+6@```$!```MD````0$``"V@
+M```!`0``+;0```$!```M\````0$``"X,```!`0``+A````$!```N&````0$`
+M`"X<```!`0``+B0```$!```N*````0$``"Y$```!`0``+E````$!```N;```
+M`0$``"YX```!`0``+I@```$!```NN````0$``"[8```!`0``+P0```$!```O
+M#````0$``"\4```!`0``+Q@```$!```O)````0$``"\X```!`0``+U0```$!
+M```OE````0$``"^D```!`0``+\P```$!```P'````0$``#`H```!`0``,&@`
+M``$!```PE````0$``#"L```!`0``,,0```$!```PU````0$``##X```!`0``
+M,2````$!```Q1````0$``#&,```!`0``,9````$!```QL````0$``#'T```!
+M`0``,CP```$!```RA````0$``#+8```!`0``,R````$!```S9````0$``#.D
+M```!`0``,\0```$!```ST````0$``#/4```!`0``,^0```$!```S]````0$`
+M`#08```!`0``-)@```$!```U*````0$``#5(```!`0``-6@```$!```UN```
+M`0$``#7@```!`0``-@````$!```V.````0$``#:,```!`0``-MP```$!```W
+M+````0$``#>0```!`0``-^````$!```W^````0$``#?\```!`0``.`0```$!
+M```X"````0$``#@0```!`0``.!0```$!```X0````0$``#A<```!`0``.'P`
+M``$!```XH````0$``#D(```!`0``.40```$!```Y@````0$``#G0```!`0``
+M.@P```$!```Z)````0$``#I(```!`0``.F@```$!```ZA````0$``#J(```!
+M`0``.IP```$!```ZI````0$``#JH```!`0``.L0```$!```Z\````0$``#L@
+M```!`0``.T0```$!```[;````0$``#MX```!`0``.Z````$!```[P````0$`
+M`#O(```!`0``.\P```$!```[U````0$``#O8```!`0``.^````$!```[Y```
+M`0$``#P$```!`0``/!0```$!```\+````0$``#Q0```!`0``/&````$!```\
+M@````0$``#R@```!`0``/+````$!```\R````0$``#SP```!`0``/2@```$!
+M```].````0$``#UT```!`0``/:0```$!```]Q````0$``#W8```!`0``/A``
+M``$!```^5````0$``#YT```!`0``/H````$!```^H````0$``#ZX```!`0``
+M/NP```$!```_,````0$``#]8```!`0``/V@```$!```_A````0$``#^\```!
+M`0``0!P```$!``!`0````0$``$!T```!`0``0(0```$!``!`I````0$``$#0
+M```!`0``0/0```$!``!!!````0$``$%8```!`0``06P```$!``!!A````0$`
+M`$&(```!`0``09````$!``!!M````@(``$&X```"`@``0@````$!``!""```
+M`0$``$(4```!`0``0AP```$!``!"*````0$``$(P```!`0``0CP```$!``!"
+M1````0$``$)0```!`0``0FP```$!``!">````0$``$,(```!`0``0Q@```$!
+M``!#,````0$``$-4```!`0``0V````$!``!#9````0$``$.````!`0``0XP`
+M``$!``!#F```!`(``$.<```$`@``0[0```$!``!#N````0$``$/(```!`0``
+M0_0```$!``!$%````0$``$0@```!`0``1"P```$!``!$/```!`(``$1D```!
+M`0``1'@```$!``!$C````0$``$2@```!`0``1*@```$!``!$X````0$``$3L
+M```!`0``100```$!``!%#````0$``$4<```!`0``14````$!``!%4````0$`
+M`$54```!`0``15P```$!``!%8````0$``$5L```!`0``17@```$!``!%C```
+M`0$``$7H```!`0``1>P```0"``!%_````0$``$8,```!`0``1AP```$!``!&
+M)````0$``$9,```!`0``1E@```$!``!&:````0$``$9T```$`@``1J0```$!
+M``!&K````0$``$:X``#I`0``1LP```$!``!&V```!`(``$<4```!`0``1Q@`
+M``0"``!'6````0$``$=<```!`0``1VP```$!``!'>````0$``$>````!`0``
+M1X@```$!``!'D````0$``$>8```!`0``1Z0```$!``!'V````0$``$?@```!
+M`0``1^@```$!``!'_````0$``$@P```!`0``2%@```$!``!(8````0$``$AH
+M```!`0``2(0```$!``!(J````0$``$BP```!`0``2/P```0"``!)````!`(`
+M`$DL```,`0``260```$!``!)>````0$``$F$```!`0``2>````$!``!)Z```
+M`0$``$G\```!`0``2@P```$!``!*&````0$``$H@```!`0``2C@```$!``!*
+M1````0$``$I0```!`0``2F0```$!``!*;````0$``$J````!`0``2H@```$!
+M``!*W````0$``$LT```!`0``2T0```$!``!+4````0$``$MT```!`0``2X``
+M``$!``!+A````0$``$N,```!`0``2Y0```$!``!+F````0$``$N@```!`0``
+M2Z0```$!``!+K````0$``$NP```!`0``2[@```$!``!+O````0$``$O@```!
+M`0``3`0```$!``!,+````0$``$Q4```!`0``3'@```$!``!,I````0$``$RL
+M```!`0``3+P```$!``!,Q````0$``$SH```!`0``30````$!``!-$````0$`
+M`$T@```!`0``340```$!``!-8````0$``$U\```!`0``38@```$!``!-M```
+M`0$``$W$```!`0``3=````$!``!-W``!(P$``$X(```!`0``3B````$!``!/
+MI````0$``$^X```!`0``3\@```$!``!/T````0$``$_L```!`0``4`````$!
+M``!00````0$``%!@```!`0``4(P```$!``!0P````@(``%#$```$`@``4,@`
+M``0"``!0S```!`(``%#0```$`@``4-0```0"``!0Z````@(``%#L```!`@``
+M41P```$!``!1+````0$``%%````!`0``44P```$!``!15````0$``%%X```!
+M`0``49@```$!``!1O````0$``%'(```!`0``4=````$!``!1[````0$``%(4
+M``$``0``4AP```$!``!2;````0$``%)P```!`0``4GP```$!``!2A````0$`
+M`%*4```!`0``4J@```$!``!2O````0$``%+0```!`0``4N@```$!``!2]``!
+M``$``%+\```!`0``4Q````$!``!30``!``$``%-\```!`0``4X@```$!``!3
+MI````0$``%/$```!`0``4]````$!``!3W````0$``%00```!`0``5#@```$!
+M``!4?````0$``%2,```!`0``5)````$!``!4F````0$``%2@```!`0``5*@`
+M``$!``!4K````0$``%2T```!`0``5,````$!``!4S````0$``%38```!`0``
+M5-P```$!``!4Z````0$``%3X```!`0``500```$!``!5$````0$``%48```!
+M`0``570```$!``!5D````0$``%6X```!`0``5=````$!``!5V```!`(``%88
+M```!`0``5C0```$!``!67````0$``%9T```!`0``5GP```0"``!6G````0$`
+M`%:D```!`0``5K````$!``!6P````0$``%;(```!`0``5MP```$!``!7%```
+MT`$``%<D```!`0``5S0``.D!``!7J``!/P$``%>P```!`0``5\0``90!``!7
+MW``!E`$``%@```&1`0``6!```9$!``!8'````0$``%@H``&4`0``6#0``"\!
+M``!83``!E`$``%A@``&1`0``6'```2X!``!8>````0$``%B,```!`0``6)P`
+M`2X!``!8I````0$``%C```$N`0``6,@```$!``!8Z````0$``%D$``$N`0``
+M60P```$!``!9*````0$``%DX```!`0``64@``2X!``!94````0$``%PH```!
+M`0``7#````$!``!<3``!+@$``%Q4```!`0``7(````$!``!<E````0$``%RD
+M``&1`0``7+0```$!``!<R``!D0$``%S4``"%`0``7.P```("``!=:```?0(`
+M`%V(``"%`0``7C````$!``!>H``!D0$``%ZP``&1`0``7L```9$!``!>T``!
+MD0$``%[@``&1`0``7Q@```$!``!?2````0$``%]P``%G`0``7W@``#$"``!?
+M?``!+`(``%^8``&1`0``7Z0``90!``!?N``!D0$``%_(``&1`0``8`````$!
+M``!@"``!E`$``&`<``&1`0``8"P``9$!``!@/``!D0$``&!0```!`0``8%@`
+M`90!``!@:``!D0$``&!X``&1`0``8(0``90!``!@N``!D0$``&#(```!`0``
+M8-0```$!``!A#``!D0$``&%$``&4`0``870``90!``!A?````0$``&(X```!
+M`0``8D0``9$!``!B7````0$``&*H``&1`0``8K@```$!``!BR``!D0$``&,,
+M```!`0``8QP``90!``!C)````0$``&-4```!`0``8V@``9$!``!C>``!D0$`
+M`&.(``&1`0``8Y@``9$!``!CJ``!D0$``&.X``&1`0``8\@``9$!``!CW``!
+MD0$``&0,```!`0``9!P```$!``!D;``!D0$``&2$``&1`0``9-0```$!``!D
+MX````0$``&3L```!`0``900```$!``!ES``!D0$``&7<``&1`0``9>P``9$!
+M``!E_``!D0$``&8,``&1`0``9B```9$!``!F,```<0$``&9<``#I`0``9GP`
+M`.D!``!FH```Z0$``&:H```"`@``9M```90!``!FY```2@$``&;L```!`0``
+M9O@``90!``!G'````0$``&=\``$H`0``9Y0``'8!``!GN``!E`$``&?8``&1
+M`0``:````90!``!H&``!D0$``&A$``&4`0``:&```9$!``!HA````0$``&B,
+M``&4`0``:,@``90!``!I```!D0$``&D4``%3`0``:3P``90!``!I2````0$`
+M`&EH``&1`0``:80``90!``!IM``!E`$``&F\```!`0``:<0```$!``!IT```
+M`0$``&G@``&1`0``:BP``.D!``!J9``!D0$``&J0``&1`0``:I@```$!``!J
+MI``!E`$``&JL```!`0``:K@``90!``!JR``!D0$``&L(``&4`0``:Q@``90!
+M``!K*``!E`$``&ML``&4`0``:XP``90!``!KG``!D0$``&N\``&4`0``:^0`
+M`90!``!K]``!E`$``&PP``&4`0``;&@``90!``!L@``!E`$``&R8``&4`0``
+M;+```90!``!LR``!E`$``&T,```!`0``;10``"4!``!M'````0$``&T\``%?
+M`0``;4P``9$!``!M@``!E`$``&V0```E`0``;;@``"4!``!MP````0$``&W@
+M``&4`0``;?0``5\!``!N$``!D0$``&Y$``&4`0``;E0``"4!``!ND````0$`
+M`&Z8``&4`0``;J@``9$!``!NN````0$``&[```&4`0``;M```9$!``!O$```
+M)0$``&\8```!`0``;S@``90!``!O3``!7P$``&]H``&1`0``;Z```90!``!O
+MM```)0$``&_P```!`0``<`0``1D!``!P)````0$``'`L```!`0``<#````$!
+M``!P0``!D0$``'!@```;`0``<(P``3L!``!PK``!E`$``'"\``&1`0``<,0`
+M``$!``!PT``!E`$``'#@``&1`0``<00```$!``!Q#``!E`$``'$<``&1`0``
+M<20``3D!``!Q.``!E`$``'%````!`0``<4@``3D!``!Q5``!E`$``'%D``&1
+M`0``<6P```$!``!Q<````0$``'%X```!`0``<8P``90!``!QG``!D0$``'',
+M``&4`0``<=P``9$!``!QY````0$``''P``&4`0``<@```9$!``!R,````0$`
+M`'(T```!`0``<CP```$!``!R0````0$``')$```!`0``<DP```$!``!R4```
+M`0$``')4```!`0``<E@```$!``!R7````0$``'*,``&4`0``<K````$!``!R
+MO````0$``'+````!`0``<L@```$!``!RV``!+0$``'+D``#T`@``<N@``!$"
+M``!R_``!E`$``',8``&1`0``<S0``9$!``!S5``!D0$``'-D``&4`0``<VP`
+M``$!``!S?``!.0$``'.(```!`0``<Z@``90!``!SN``!D0$``'/8``&4`0``
+M<^@``9$!``!T%``!D0$``'0D``&1`0``=$P```$!``!T7````0$``'1D``&4
+M`0``='P```$!``!TA``!E`$``'28``&1`0``=,0```$!``!TU````0$``'3<
+M``&4`0``=/0```$!``!T_``!E`$``'40``&1`0``=30``90!``!U8``!D0$`
+M`'78```!`0``=G````$!``!V?````0$``':$``&4`0``=HP```$!``!V\``!
+ME`$``'=0```!`0``=UP```$!``!W<````0$``'=\```!`0``=XP```$!``!X
+M<````0$``'AX``$``0``>(0```$!``!XD````0$``'B4```!`@``>)@```$"
+M``!XG````0(``'B@```!`@``>*0```$"``!XJ````0(``'BL```!`@``>+``
+M``$"``!XM````0(``'B\```!`0``>,@``90!``!XV``!/P$``'C@```!`0``
+M>1@``9$!``!Y.``!D0$``'E$```!`0``>5````$!``!Y5````0(``'E8```!
+M`@``>5P```$"``!Y8````0(``'ED```!`@``>6@```$"``!Y;````0(``'EP
+M```!`@``>70```$"``!YA````0$``'F4``&1`0``>:0```$!``!YM``!D0$`
+M`'G$``&1`0``>=```90!``!YX``!D0$``'H8``&1`0``>C@``9$!``!Z2``!
+MD0$``'I8``&1`0``>F@``9$!``!Z=``!E`$``'J$``&1`0``>I0``9$!``!Z
+MK``!E`$``'J\``&1`0``>LP``9$!``!ZW``!D0$``'KL``&1`0``>OP``9$!
+M``![#``!D0$``'L<``&1`0``>RP``9$!``![0``!D0$``'M0``&1`0``>UP`
+M`+@!``![;``!D0$``'M\``&1`0``>XP``9$!``![G``!D0$``'NL``&1`0``
+M>[P``9$!``![S``!D0$``'O<``&1`0``>^P``9$!``![_``!D0$``'P,``&1
+M`0``?!P``9$!``!\+``!D0$``'Q````!`0``?$P```$!``!\7``!D0$``'QH
+M```!`0``?'0``8D!``!\?````0$``'R(``&4`0``?*0``9$!``!\T``!D0$`
+M`'S<``&4`0``?0```9$!``!]#``!E`$``'TL``&1`0``?3@``90!``!]7``!
+MD0$``'UH``&4`0``?80``9$!``!]D````0$``'V8```!`0``?:0```$!``!]
+MU``!D0$``'W<``$Y`0``?>@``90!``!]^``!D0$``'X,``!*`0``?A@``)8!
+M``!^)````0$``'XX```!`0``?D0``%<!``!^4````0$``'YD``"``0``?G``
+M`90!``!^@``!D0$``'Z4``&#`0``?J@```H!``!^O``!&P$``'[(```!`0``
+M?M0``9$!``!_B````@(``'_P``&4`0``@`0```$!``"`"````0(``(`,```!
+M`@``@!````$"``"`%````0(``(`8```!`@``@!P```$"``"`(````0(``(`D
+M```!`@``@"@```$"``"`/````0$``(!8``&1`0``@'````$!``"`C``!D0$`
+M`("L```!`0``@,@```$!``"`Z```^P$``(#P```!`0``@0````$!``"!"```
+M`0$``($0``$Y`0``@2````$!``"!*``!.0$``(%8``#[`0``@6````$!``"!
+M;````0$``(&$``&1`0``@90```$!``"!G````0$``(&D``$Y`0``@;0```$!
+M``"!O````0$``('$``$Y`0``@=0``/L!``"!W````0$``('L```!`0``@AP`
+M`0`!``""*````0$``((T``&4`0``@D0``9$!``""4``!E`$``()D``&1`0``
+M@FP``3D!``"">``!E`$``(*(``&1`0``@I```3D!``""G````0$``(*D```!
+M`0``@JP``3D!``""N``!E`$``(+(``&1`0``@M0``90!``""Y``!E`$``(+T
+M``&4`0``@P@``9$!``"#)``!D0$``(,\``&1`0``@T0``3D!``"#4``!E`$`
+M`(-@``&1`0``@V@``3D!``"#>``!D0$``(.$``&4`0``@Y0``9$!``"#G``!
+M.0$``(.H``&4`0``@[@``9$!``"#S```2@$``(/<``&1`0``@^P``9$!``"#
+M_``!D0$``(0(``"6`0``A!````$!``"$&``!.0$``(0D``"6`0``A$0``90!
+M``"$5``!D0$``(1D``&1`0``A-```9$!``"$V``!.0$``(3\``!*`0``A0@`
+M``$!``"%/``!D0$``(5L```!`0``A7@```$!``"%?````0$``(6H```!`0``
+MA;0```$!``"%Q````0$``(7\```!`0``A@0```$!``"&$````0$``(88```!
+M`0``AB@```$!``"&-````0$``(9P```!`0``AG@```$!``"&B````0$``(:D
+M```!`0``AJ@```$!``"&M````0$``(;4```!`0``AN0```$!``"'$````0$`
+M`(<\``$E`0``A^0```$!``"("````0$``(@4```!`0``B!P```$!``"(P```
+M`0$``(C8```!`0``B/````$!``")"````0$``(D8```!`0``B5````$!``")
+M;````0$``(F4```!`0``B:P```$!``")U````0$``(GL```!`0``BA0```$!
+M``"*+````0$``(J<```"`@``BL@``.D!``"*W```Z0$``(KL```!`0``BO0`
+M``$!``"+!````0$``(L8```!`0``BS0``"\!``"+3````0$``(MD```O`0``
+MBWP```$!``"-3```+P$``(UL```O`0``C8P``"\!``"-O``!D0$``(W0```!
+M`0``C>@``9$!``"-]````@(``(WX```"`@``CC0``"\!``".2``!D0$``(Y8
+M``&1`0``CHP``90!``".S``!E`$``([<``&1`0``CO```$H!``".^````0$`
+M`(\$``$Y`0``CPP``%(!``"/.````0$``(](```!`0``CX0```$!``"/H``!
+M:@$``(^\```!`0``C]P``1@!``"0`````0$``)`$```!`0``D`P```$!``"0
+M$````0$``)`8```!`0``D!P```$!``"0)````0$``)`L```!`0``D$P```$!
+M``"08``!(P$``)!L```!`0``D)0```$!``"0I```P`$``)%\```!`0``D:``
+M``$!``"1K````0$``)'````!`0``D=```9$!``"1X``!D0$``)'P``&1`0``
+MDA```9$!``"2(``!D0$``)(L``&4`0``DD```9$!``"24````0$``))@``&1
+M`0``DG```9$!``"2@``!D0$``)*D``&1`0``DK0``9$!``"2P``!E`$``)+4
+M``&1`0``DN0``9$!``"3(``!D0$``)2````!`0``E(@```$!``"4D``!E`$`
+M`)3(```!`0``E,P```$"``"4T````0(``)34```!`@``E-@```$"``"4X```
+M`0$``)3H``&1`0``E1```*,!``"5(``!4P$``)4L``&4`0``E3P```$!``"5
+M2````0$``)54``%3`0``E6@``9$!``"5=``!4P$``)6P```!`0``E;0```$"
+M``"5N````0(``)6\```!`@``E<````$"``"5S````0$``)78``&1`0``E>@`
+M``$!``"5]``!D0$``)8L```!`0``EC0```$!``"6/``!E`$``)9\```!`0``
+MEH````$!``"6B````0$``):,```!`0``EI@``9$!``"6K``!E`$``):T```!
+M`0``EKP``3D!``"6R````0$``);8``&1`0``EO@``$H!``"7F````0$``)@$
+M```!`0``F"````$!``"9'````0$``)EP```!`0``F7@```$!``"9U````0$`
+M`)JT```!`0``FWP``9$!``";D``!D0$``)N<```!`0``FZ@``90!``";P```
+M+P$``)P```#0`0``G!````$!``"<(```Z0$``)R0``&:`0``G)P```$!``"<
+ML````0$``)S```&1`0``G-```9$!``"<V``!.0$``)SD``&4`0``G0@```$!
+M``"=%``!E`$``)TD```!`0``G3````$!``"=5``!D0$``)U<``$Y`0``G6@`
+M``$!``"=?````0$``)V,``%,`0``G90```$!``"=I````0$``)V\``&4`0``
+MG=````$!``"=X``!3`$``)WH```!`0``G@P``4P!``">%````0$``)XH```!
+M`0``GC@```$!``">?````0$``)[8```!`0``GN@``7P!``">\````0$``)[\
+M```!`0``GPP```$!``"?'``!D0$``)\D``$Y`0``GS````$!``"?1``!D0$`
+M`)],``$Y`0``GUP```$!``"?9````0$``)^```%,`0``GX@```$!``"?L```
+M`0$``)^X``&$`0``G]@``4P!``"?X````0$``*`(```!`0``H!P```$!``"@
+M-``!:0$``*!,```"`@``H*0```("``"@N```U0(``*#@``$@`0``H.@``(4!
+M``"A0``!E`$``*%<``&1`0``H6@``90!``"A<````0$``*%\```!`0``H9P`
+M`9$!``"AJ``!E`$``*&P```!`0``H<0```$!``"AV``!D0$``*'D```!`0``
+MH>P``3D!``"A^````@(``*'\```"`@``HAP```$!``"B)````0$``*(T```!
+M`0``HJ````$!``"BK```X`$``*+$```!`0``HX@```$!``"CG``!3`$``*.D
+M```!`0``I!P``9$!``"D+``!D0$``*0\``&1`0``I$P``9$!``"D7``!D0$`
+M`*28```!`0``I)P```$"``"DH````0(``*2D```!`@``I*@```$"``"DK```
+M`0(``*2P```!`@``I+0```$"``"DN````0(``*2\```!`@``I,P```$!``"E
+M$``!D@$``*4@```Q`@``I20``2P"``"E0``!D0$``*5,``&4`0``I6```9$!
+M``"E<``!D0$``*6H```!`0``I;```90!``"EP``!D0$``*70``&1`0``I>``
+M`9$!``"E]````0$``*7\``&4`0``I@P``9$!``"F'``!D0$``*8H``&4`0``
+MIEP``9$!``"FB``!D0$``*:4``&4`0``IK@``9$!``"F]``!E`$``*<@``&4
+M`0``IR@```$!``"G>````0$``*><```!`0``I[```90!``"GQ``!E`$``*?8
+M``&4`0``I^P``90!``"H```!E`$``*AH```!`0``J'0``9$!``"H@``!E`$`
+M`*B0```!`0``J.P``9$!``"H_````0$``*D,``&1`0``J5````$!``"I8``!
+ME`$``*EH```!`0``J9@```$!``"IK``!D0$``*F\``&1`0``J<P``9$!``"I
+MW``!D0$``*GL``&1`0``J?P``9$!``"J#``!D0$``*H@``&1`0``JE````$!
+M``"J:````0$``*JX``&1`0``JM```9$!``"K&````0$``*LD```!`0``JR@`
+M``$!``"K,````0$``*LT```!`0``JSP```$!``"K0````0$``*M(```!`0``
+MJU0```$!``"K9````0$``*MX```!`0``JX````$!``"L0``!D0$``*Q0``&1
+M`0``K&```9$!``"L<``!D0$``*R```&1`0``K)0``9$!``"LI```S@$``*S0
+M``#I`0``K/```.D!``"M%```Z0$``*T<```"`@``K4@``9$!``"M6``!D0$`
+M`*UL``!*`0``K70```$!``"M@``!E`$``*VP```!`0``K>P```$!``"N5```
+MY0$``*Y@``&4`0``KG```9$!``"N?``!10$``*Z0```W`0``KK0``90!``"N
+MS``!D0$``*[T``&4`0``KPP``9$!``"O.``!E`$``*]4``&1`0``KW@```$!
+M``"O@``!E`$``*^X``&4`0``K]@``9$!``"O[``!"0$``+`4``&4`0``L#@`
+M`9$!``"P1````@(``+!L``#I`0``L*0``9$!``"PT``!D0$``+$,``&4`0``
+ML1P``90!``"Q+``!E`$``+%P``&4`0``L9```90!``"QH``!D0$``+'```&4
+M`0``L>@``90!``"Q^``!E`$``+(P``&4`0``LD@```$!``"R@``!E`$``+*8
+M``&4`0``LK```90!``"RR``!E`$``++@``&4`0``LR0```$!``"S+```)0$`
+M`+,T```!`0``LU```5\!``"S8``!D0$``+.4``&4`0``LZ0``"4!``"SS```
+M)0$``+/4```!`0``L_0``90!``"T"``!7P$``+0D``&1`0``M%@``90!``"T
+M:```)0$``+2D```!`0``M*P``90!``"TO``!D0$``+3,```!`0``M-0``90!
+M``"TY``!D0$``+4D```E`0``M2P```$!``"U3``!E`$``+5@``%?`0``M7P`
+M`9$!``"UM``!E`$``+7(```E`0``M@0``90!``"V)``!E`$``+9(``&1`0``
+MMGP```$!``"VD```X0$``+:P```!`0``MK@```$!``"VP````0$``+;4``$9
+M`0``MO0```$!``"W!``!D0$``+<<```;`0``MT@``3L!``"W;````0$``+=T
+M``&4`0``MX0``9$!``"WC``!.0$``+>@``&4`0``MZ@```$!``"WL``!.0$`
+M`+>\``&4`0``M\P``9$!``"WU````0$``+?8```!`0``M^````$!``"W]``!
+ME`$``+@$``&1`0``N#0``90!``"X1``!D0$``+A,```!`0``N%@``90!``"X
+M:``!D0$``+B0``&4`0``N*```9$!``"XJ````0$``+BT``&4`0``N,0``9$!
+M``"X]````0$``+CX```!`0``N0````$!``"Y!````0$``+D(```!`0``N1``
+M``$!``"Y%````0$``+D8```!`0``N1P```$!``"Y(````0$``+E0``&4`0``
+MN70```$!``"Y>````0$``+F````!`0``N80```$!``"YC````0$``+F0```!
+M`0``N9@```$!``"YH````0$``+FH```!`0``N;@``2T!``"YQ```O0(``+G(
+M``$+`@``N<P``/`"``"YX``!E`$``+G\``&1`0``NA@``9$!``"Z.``!D0$`
+M`+I,``!*`0``NG0``90!``"ZA``!D0$``+JD``&4`0``NK0``9$!``"ZX``!
+MD0$``+KP``&1`0``NQ@```$!``"[*````0$``+LP``&4`0``NT@```$!``"[
+M4``!E`$``+MD``&1`0``NY````$!``"[H````0$``+NH``&4`0``N\````$!
+M``"[R``!E`$``+O<``&1`0``O````90!``"\(``!D0$``+R8```!`0``O2P`
+M``$!``"].````0$``+U```&4`0``O4@```$!``"]U````0$``+W@```!`0``
+MO>P```$!``"]_````0$``+[L```!`0``OO0```$!``"_"````0$``+\4```!
+M`0``OQP```$!``"_,````0$``+\\``$``0``OT@```$!``"_6````0$``+]<
+M```!`@``OV````$"``"_9````0(``+]H```!`@``OVP```$"``"_<````0(`
+M`+]T```!`@``OW@```$"``"_?````0(``+^$```!`0``OY````$!``"_G``!
+ME`$``+^L``&4`0``O\````$!``"_S``!E`$``+_4```!`0``O^P``90!``"_
+M_````0$``,`T``&4`0``P%```90!``#`9``!E`$``,"```&4`0``P)```90!
+M``#`H``!F@$``,"H```!`0``P+@```$!``#`O````0$``,#$```!`0``P,@`
+M``$!``#`V````0$``,#L```!`0``P/@```$!``#!*``!D0$``,$T```!`0``
+MP4````$!``#!4````0$``,%\```O`0``P8P``"\!``#!]``!D0$``,(````!
+M`0``P@P```$!``#",``!D0$``,(\```!`0``PEP``9$!``#":````0$``,*`
+M```!`0``PHP```$!``#"G``!D0$``,*H```!`0``PK0```$!``#"P``!E`$`
+M`,+8``&1`0``PN@``9$!``#"^``!D0$``,,$``&4`0``PQ0``9$!``##(```
+M`0$``,,P``&1`0``PT```9$!``##4````0$``,-@``&1`0``PV0```$!``##
+M@``!D0$``,.,```!`0``P\0``9$!``##[``!D0$``,/X```!`0``Q`0``90!
+M``#$%``!D0$``,0D``&1`0``Q#0``9$!``#$1``!D0$``,1\``&1`0``Q)P`
+M`9$!``#$L``!D0$``,3```&1`0``Q,P```$!``#$W````0$``,3H``&4`0``
+MQ/@``9$!``#%!``!)`$``,4,```!`0``Q1@```$!``#%)````0$``,4P``&4
+M`0``Q4P``9$!``#%6````0$``,5D```!`0``Q6P```$!``#%@````0$``,6,
+M```!`0``Q9P``9$!``#%K``!D0$``,6X``&4`0``Q>P``3D!``#%^``!E`$`
+M`,8(``&1`0``QAP``$H!``#&*```'0$``,8P```!`0``QD@```$!``#&6```
+M`0$``,9H``&1`0``QI```9$!``#&G````0$``,:L``$0`0``QK@```$!``#&
+MR``!D0$``,;8``&1`0``QN@``9$!``#&]``!E`$``,<$``&1`0``QQ0``9$!
+M``#'+``!E`$``,<\``&1`0``QT@```$!``#'5``!E`$``,=D``&1`0``QX0`
+M`%$!``#'D``!E`$``,>@``&1`0``Q[0``)P!``#'R```UP$``,?<```X`0``
+MQ^@```$!``#']``!D0$``,A0```$`@``R%0```("``#(6````@(``,A<```"
+M`@``R1````$!``#),``!6@$``,DX```!`0``R40```$!``#)3````0$``,E4
+M``$Y`0``R80``5H!``#)C````0$``,F8```!`0``R9P```$!``#)I````0$`
+M`,FL```!`0``R;````$!``#)N````0$``,F\```!`0``R<0```$!``#)R```
+M`0$``,G0```!`0``R=0```$!``#)Y``!D0$``,GT``&1`0``R@0``9$!``#*
+M#``!.0$``,H0```!`0``RB```9$!``#*,````0$``,I```&1`0``RD@``3D!
+M``#*6````0$``,IX``&1`0``RH@```$!``#*F``!D0$``,J@``$Y`0``RK``
+M`9$!``#*O````0$``,K$```!`0``RLP``3D!``#*W``!6@$``,KD```!`0``
+MRO````$!``#+)``!``$``,LP```!`0``RT````$!``#+3``!E`$``,M4```!
+M`0``RV0``90!``#+=``!E`$``,N$``&4`0``R[````$!``#+O``!)0$``,O,
+M``$E`0``R]P``90!``#+]``!D0$``,P````!`0``S`@```$!``#,,```'0$`
+M`,PX```!`0``S$```3D!``#,3```'0$``,Q4```!`0``S'0```$!``#,W``!
+ME`$``,SL``&1`0``S/0``3D!``#-&```2@$``,TD```!`0``S5@``9$!``#-
+M@```BP$``,V8```!`0``S;P``"\!``#-W````0$``,WD```!`0``S?@``"\!
+M``#.!````0$``,X@```O`0``SE```9$!``#.;``!D0$``,Z````"`@``SJ``
+M`90!``#.Z``!E`$``,\4``&1`0``SR```90!``#/,``!D0$``,]0``&4`0``
+MSU@```$!``#/8``!.0$``,]L```!`0``SW````$!``#/>````0$``,^(```!
+M`0``SZP```$!``#/L````0$``,^X```!`0``S[P```$!``#/R````0$``,_,
+M```!`0``S]0```$!``#0'````0$``-`D```!`0``T#```90!``#0.````0$`
+M`-"8```!`0``T)P``7,!``#0I````0$``-"T```!`0``T+P```$!``#0U```
+M`0$``-#\```!`0``T1@``90!``#1*``!D0$``-$T```"`@``T5@```$!``#1
+M;````0$``-&4```"`@``T<P```$!``#1T````0$``-'8```!`0``T=P```$!
+M``#1Y````0$``-(,```!`0``TC````$!``#25````0$``-)P```!`0``TO@`
+M``$!``#3'````0$``--4```!`0``TW@``"\!``#3H```+P$``-/````O`0``
+MT^0``"\!``#4!```+P$``-10``&1`0``U%P```$!``#4I```!`(``-3T```!
+M`0``U/@```$!``#5`````0$``-4$```!`0``U1````$!``#5%````0$``-4<
+M```!`0``U9P```$!``#5H````0$``-6H```!`0``U:P```$!``#5M````0$`
+M`-6\```!`0``U=P``9$!``#5[``!D0$``-90```!`0``UE0```$!``#67```
+M`0$``-9@```!`0``UF@```$!``#6=``!E`$``-:8``&1`0``UIP```$!``#6
+MI````0$``-:L```!`0``UL````$!``#6S``!E`$``-;<```!`0``UN@``90!
+M``#7$``!D0$``-<D``#A`0``UT0``9$!``#74``!E`$``-=\``&1`0``UX@`
+M`90!``#7K``!D0$``->X``&4`0``U_```9$!``#8(``!D0$``-@L``&4`0``
+MV$P``9$!``#86``!E`$``-A\``&1`0``V)0```$!``#8J````0$``-BX```!
+M`0``V/P``90!``#9&``!D0$``-F8``&1`0``V=````$!``#9U````0$``-G<
+M```!`0``V>````$!``#9Z````0$``-H@```!`0``VE@```$!``#:D````0$`
+M`-JH```!`0``VK@``!0!``#:S````0$``-KD```!`0``VO@```$!``#;#```
+M`0$``-LD```!`0``VWP``2,!``#;B``!(P$``-O````!`0``V^@```$!``#;
+M_````0$``-P<```!`0``W#P```$!``#<<````0$``-RD```!`0``W+@```$!
+M``#<[````0$``-U$```!`0``W8````$!``#=H````0$``-W(```!`0``W?@`
+M``$!``#>.````0$``-Z$```!`0``WHP```$!``#>M````0$``-[\``&1`0``
+MWQ0```$!``#?'```!0(``-\@```%`@``WR0```4"``#?J````0$``-_(``$6
+M`0``W]P```$!``#?]````0$``.`4```!`0``X#0```$!``#@0````0$``.!8
+M```!`0``X&P```$!``#@?````0$``."(```!`0``X)P```$!``#@N````0$`
+M`.#H```!`0``X00```$!``#A$````0$``.%````!`0``X50```$!``#A<```
+M`0$``.%\```!`0``X80```$!``#AC````0$``.&D```!`0``X:@```$!``#A
+MM````0$``.&X```!`@``X;P```$"``#AP````0(``.'$```!`@``X<@```$"
+M``#AS````0(``.'0```!`@``X=0```$"``#A^````0$``.(<```!`0``XD``
+M``$!``#BB````0$``.*H```!`0``XKP```$!``#B]````0$``.-8```!`0``
+MX]```9$!``#D(``!D0$``.0L``!N`0``Y$0```4"``#D6````@(``.2<```!
+M`0``Y*0```$!``#DR````0$``.3D```!`0``Y0````$!``#E&````0$``.4P
+M```!`0``Y50```$!``#E=````0$``.6(```!`0``Y:0```$!``#EQ````0$`
+M`.8````!`0``Y@P```$!``#F(````0$``.8L```!`0``YEP```$!``#F>```
+M`0$``.;````!`0``YM````$!``#FZ``!)0$``.;X```!`0``YP@```$!``#G
+M#````0$``.<8```!`0``YR0```$!``#G5``!)0$``.?0```!`0``Y^@```$!
+M``#H)````0$``.A$```!`0``Z&@```$!``#H=````0$``.BT```!`0``Z,``
+M``$!``#HT````0$``.CH```!`0``Z3````("``#I2````0$``.ED```!`0``
+MZ:@```$!``#I^``!D0$``.H\```!`0``ZDP```$!``#J6``!E`$``.I@```!
+M`0``ZG@```$!``#J@````0$``.J,```!`0``ZI0```$!``#JH````0$``.JH
+M```!`0``ZK0```$!``#JY````0$``.L,```!`0``ZS````$!``#K.````0$`
+M`.M8```!`0``ZV0```$!``#KL````0$``.NX```!`0``Z]````$!``#KZ```
+M`0$``.P(```!`0``["0```$!``#L;````0$``.R````!`0``[)0```("``#L
+MF````@(``.T8``&4`0``[2P```$!``#M,````0(``.TT```!`@``[3@```$"
+M``#M/````0(``.U````!`@``[40```$"``#M2````0(``.U,```!`@``[5``
+M``$"``#M9````0$``.V```&1`0``[:```9$!``#MP````0$``.W<``#V`0``
+M[>P``0D!``#M^``!E`$``.X0```!`0``[AP```$!``#N*``!"0$``.Y,``&1
+M`0``[E@``0D!``#N=````0$``.Z0``%J`0``[JP```$!``#NS``!&`$``.[P
+M```!`0``[O0```$!``#N_````0$``.\````!`0``[P@```$!``#O#````0$`
+M`.\4```!`0``[QP```$!``#O,````0$``.]4```!`0``[V@``2,!``#O=```
+M`0$``.^D```!`0``[[0``&,!``#P```!D0$``/`P``&1`0``\#P``90!``#P
+M9``!D0$``/"@```!`0``\,0```$!``#Q,````0$``/%T```!`0``\9@```$!
+M``#QL````0$``/&X```!`0``\<P```$!``#QW````0$``/'L```!`0``\B0`
+M`9$!``#R3``!D0$``/)<``&1`0``\F@```$!``#R>``!D0$``/*$```!`0``
+M\J```9$!``#RL``!E`$``/+4``&1`0``\N````$!``#R^``!D0$``/,$```!
+M`0``\R```9$!``#S+````0$``/,\``&4`0``\TP``9$!``#S6````0$``/-L
+M``&4`0``\WP``9$!``#SB````0$``/.<``&4`0``\ZP``9$!``#SN````0$`
+M`//````!`0``\\0```$!``#SV``!E`$``//H``&1`0``]`0```$!``#T&``!
+ME`$``/0L``&1`0``]'```9$!``#TD``!D0$``/2<```!`0``]+```90!``#T
+MP``!D0$``/6H```!`0``];P``2P"``#UP```,0(``/7(``#"`@``]?0``90!
+M``#V$``!D0$``/8T``&1`0``]EP``90!``#V9````0$``/9P``&4`0``]J@`
+M`9$!``#VO``!>0$``/;$```!`0``]LP``3D!``#VV````0$``/;H``&1`0``
+M]Z````$!``#XF````0$``/CL```!`0``^/0```$!``#Y4````0$``/HT```!
+M`0``^V0``9$!``#[=``!D0$``/N$``&1`0``^Y0``9$!``#[I``!D0$``/NT
+M``&1`0``^\0``9$!``#[U``!D0$``/OD``&1`0``^_0``9$!``#\0``!D0$`
+M`/Q4``&1`0``_&````$!``#\;``!E`$``/R$```O`0``_5P```$!``#]:```
+MM`$``/UP```"`@``_70```("``#]>````@(``/U\```"`@``_<P``.D!``#^
+MB```Z0$``/Z8```"`@``_M0```("``#^^````0$``/\(```!`0``_RP```$!
+M``#_,````@(``/]@``#0`0``_VP```$!``#_C```)@$``/^@``&%`0``_Z@`
+M``$!``#_M``!E`$``/_@```!`0``_^@```$!``#_]``!CP$``/_\```!`0`!
+M``0```$!``$`$``!E`$``0`D```!`0`!`"P```$!``$`/````0$``0!$```!
+M`0`!`$P``!H!``$`6````0$``0!D```!`0`!`'```90!``$`@``!D0$``0"0
+M``&1`0`!`)P``$,!``$`L````0$``0"T```!`0`!`+P```$!``$`Q````0$`
+M`0#,```!`0`!`-````$!``$`V````0$``0#@```!`0`!`/````$!``$`_```
+M`0$``0$4```!`0`!`3````$!``$!/````0$``0%$```!`0`!`4P```$!``$!
+M7````0$``0%T```!`0`!`7P```$!``$!A````0$``0&4```!`0`!`:P```$!
+M``$!N````0$``0'(``&.`0`!`=````$!``$!Y````0$``0'\``&4`0`!`@P`
+M``$!``$"%````0$``0(@```!`0`!`B@```$!``$".````0$``0)````!`0`!
+M`E```8X!``$"6````0$``0)T``&.`0`!`GP```$!``$"C````0$``0*H``&.
+M`0`!`KP```$!``$"S````0$``0+<``&.`0`!`N0```$!``$"^````0$``0,(
+M```!`0`!`TP```$!``$#L````0$``0/```%\`0`!`\@```$!``$#W````0$`
+M`0/H```!`0`!`_````$!``$#^````0$``00(```!`0`!!$0```$!``$$6```
+M`0$``01H``&1`0`!!'```3D!``$$?```0P$``020``&1`0`!!)@``3D!``$$
+MJ````0$``02P```!`0`!!,```8X!``$$R````0$``03D``$S`0`!!.P```$!
+M``$$^````0$``04````!`0`!!0@```$!``$%&````0$``04D``#'`0`!!2@`
+M``$!``$%.````0$``05$``"G`0`!!4@```$!``$%8````0$``05L``&,`0`!
+M!7````$!``$%?``!<0$``06$```!`0`!!9@``1T!``$%N``!C@$``07````!
+M`0`!!>@```$!``$%_````0$``08$```!`0`!!B```((!``$&?````@(``0:`
+M```"`@`!!LP``',!``$&[```1`$``0;\``&%`0`!!PP``2`!``$'%```A0$`
+M`0=P``&4`0`!!XP``9$!``$'F``!E`$``0>@```!`0`!!ZP```$!``$'S``!
+MD0$``0?8``&4`0`!!^````$!``$']````0$``0@(``&1`0`!"!0```$!``$(
+M'``!.0$``0@H```"`@`!""P```("``$(3````0$``0A4```!`0`!"&0```$!
+M``$(=````0$``0CD```!`0`!"/P```$!``$))````0$``0DP```!`0`!"4``
+M``$!``$):````0$``0E\```!`0`!"9P```$!``$)R````0$``0H,```!`0`!
+M"B````$!``$*8````0$``0IP```!`0`!"G@```$!``$*@````0$``0J(```!
+M`0`!"I@```$!``$*H````0$``0K@```!`0`!"NP```$!``$*\````0$``0L`
+M```!`0`!"Y0```$!``$+H````0$``0NP```!`0`!"_@```$!``$,3````0$`
+M`0Q<```!`0`!#+````$!``$,P````0$``0S,```!`0`!#5P```$!``$-?```
+M`0$``0VX```!`0`!#<@```$!``$-U````0$``0Y<``"M`0`!#GP``9`"``$.
+M@````0(``0ZD``&1`0`!#K0``9$!``$.Q``!D0$``0[4``&1`0`!#N````$!
+M``$.[```K0$``0\4``&1`0`!#R0``9$!``$/9````0$``0]H```!`@`!#VP`
+M``$"``$/<````0(``0]T```!`@`!#W@```$"``$/?````0(``0^````!`@`!
+M#X0```$"``$/B````0(``0^8```!`0`!#]P``),!``$/[```,0(``0_P``$L
+M`@`!$`P``9$!``$0&``!E`$``1`L``&1`0`!$#P``9$!``$0=````0$``1!\
+M``&4`0`!$(P``9$!``$0G``!D0$``1"L``&1`0`!$,````$!``$0R``!E`$`
+M`1#8``&1`0`!$.@``9$!``$0]``!E`$``1$H``&1`0`!$50``9$!``$1I``!
+MD0$``1'$``&1`0`!$=P``9$!``$2,``!D0$``1)```&1`0`!$E0``$H!``$2
+M7````0$``1)H``&4`0`!$IP``90!``$2M``!D0$``1+<``&4`0`!$O0``9$!
+M``$3(``!E`$``1,\``&1`0`!$V````$!``$3:``!E`$``1.D``&4`0`!$]@`
+M`9$!``$3[```V`$``10,``&4`0`!%$0``90!``$43````0$``118``&4`0`!
+M%(0``90!``$4D````0$``130```!`0`!%.@``90!``$5&``!E`$``15````!
+M`0`!%6P```$!``$5@``!E`$``164``&4`0`!%:@``90!``$5O``!E`$``170
+M``&4`0`!%CP```$!``$62``!D0$``194``&4`0`!%F@```$!``$6N````0$`
+M`1;P``&1`0`!%OP``90!``$7$``!D0$``1<@```!`0`!%S```9$!``$7A```
+M`0$``1>4``&4`0`!%YP```$!``$7V````0$``1?T``&4`0`!&`P``9$!``$8
+M'``!D0$``1@L``&1`0`!&#P``9$!``$83``!D0$``1A<``&1`0`!&&P``9$!
+M``$8@``!D0$``1B(```!`0`!&)@```$!``$8N``!D0$``1C(``&1`0`!&-@`
+M`9$!``$8[``!D0$``1DH```!`0`!&4````$!``$9C``!D0$``1FD``&1`0`!
+M&@0```$!``$:%````0$``1H8```!`@`!&AP```$"``$:(````0(``1HD```!
+M`@`!&B@```$"``$:+````0(``1HT```!`0`!&D@```$!``$:3````0$``1ID
+M```!`0`!&G@```$!``$:?````0$``1J(```!`0`!&I0```$!``$:H````0$`
+M`1JT```!`0`!&L````$!``$;=````0$``1N$```!`0`!&[```9$!``$;Q``!
+MD0$``1O4``&1`0`!&^0``9$!``$;]``!D0$``1P(``&1`0`!'!@``2D!``$<
+M<````0$``1S$``&1`0`!'-0``9$!``$<Y``!D0$``1ST``&1`0`!'00``9$!
+M``$=%``!D0$``1TD``&1`0`!'3@``9$!``$=5``!D0$``1UH``&1`0`!'6P`
+M``$!``$=B``!D0$``1V8``&1`0`!':@``9$!``$=N``!D0$``1W(``&1`0`!
+M'=P``9$!``$=[``!*0$``1XD``#I`0`!'D0``.D!``$><```Z0$``1Z4``#I
+M`0`!'LP``9$!``$>[``!D0$``1\L```!`0`!'VP```$!``$?H````0$``1^T
+M```!`0`!(#```90!``$@0``!D0$``2"0``&4`0`!(+0``9$!``$@P````@(`
+M`2#H``#I`0`!(2```9$!``$A3``!D0$``2&(``&4`0`!(9@``90!``$AJ``!
+ME`$``2'L``&4`0`!(@P``90!``$B(``!D0$``2(P``&1`0`!(E@```$!``$B
+M9````0$``2)X```!`0`!(I````$!``$BJ````0$``2*T``&4`0`!(KP```$!
+M``$BS````0$``2+<``&1`0`!(O```9$!``$C%``!E`$``2,\``&4`0`!(TP`
+M`90!``$CA``!E`$``2.<```!`0`!(]0``90!``$C[``!E`$``20$``&4`0`!
+M)!P``90!``$D-``!E`$``21T``&4`0`!))0``90!``$DN``!D0$``23L```!
+M`0`!)0````X!``$E-````0$``24\```E`0`!)40```$!``$E9``!7P$``25T
+M``&1`0`!):@``90!``$EN```)0$``27@```E`0`!)>@```$!``$F"``!E`$`
+M`28<``%?`0`!)C@``9$!``$F;``!E`$``29\```E`0`!)K@```$!``$FP``!
+ME`$``2;0``&1`0`!)N````$!``$FZ``!E`$``2;X``&1`0`!)S@``"4!``$G
+M0````0$``2=@``&4`0`!)W0``5\!``$GD``!D0$``2?(``&4`0`!)]P``"4!
+M``$H$````0$``2@D``&1`0`!*#@``9$!``$H>````0$``2B$```!`0`!*)P`
+M``$!``$HI``!7P$``2BT```!`0`!*-P```$!``$H\````0$``2D8```!`0`!
+M*50``9$!``$I9``!D0$``2EX``&1`0`!*:0``"0!``$I_```%@$``2H$```!
+M`0`!*A0``9$!``$J/``!D0$``2I(``&4`0`!*EP``9$!``$J;``!D0$``2IX
+M``&4`0`!*H@``9$!``$JF````0$``2J@```!`0`!*J@```$!``$JL````0$`
+M`2K````!`0`!*M```9$!``$JX``!D0$``2KP``&1`0`!*P```9$!``$K#``!
+ME`$``2L8```!`0`!*R@``9$!``$K.``!D0$``2M(``&1`0`!*U@``9$!``$K
+M9``!E`$``2MT``&1`0`!*X0``90!``$KE``!D0$``2N@``&4`0`!*[```9$!
+M``$KP``!D0$``2O0``&1`0`!*^```9$!``$K\``!D0$``2P```&1`0`!+"@`
+M`9$!``$L-``!E`$``2Q@```!`0`!+)@``!8!``$LH````0$``2RL``&4`0`!
+M++P``9$!``$LR``!E`$``2S8``&1`0`!+.@``9$!``$L]``!E`$``2T@``&1
+M`0`!+3```9$!``$M0``!D0$``2U0``&1`0`!+6```9$!``$M<``!D0$``2V8
+M``&1`0`!+>````$!``$M]````0$``2X(```"`@`!+C0```$!``$N.````0(`
+M`2X\```!`@`!+D````$"``$N1````0(``2Y(```!`@`!+DP```$"``$N4```
+M`0(``2Y4```!`@`!+E@```$"``$N7````0(``2Y@```!`@`!+F0```$"``$N
+M:````0(``2YL```!`@`!+G````$"``$N=````0(``2YX```!`@`!+GP```$"
+M``$N@````0(``2Z$```!`@`!+H@```$"``$NC````0(``2Z0```!`@`!+I0`
+M``$"``$NF````0(``2Z<```!`@`!+J````$"``$NI````0(``2ZH```!`@`!
+M+K````$!``$NM````0$``2Z\```!`0`!+L0```$!``$NS````0$``2[0```!
+M`0`!+MP```$!``$NY````0$``2[X```!`0`!+P````$!``$O%````0$``2\8
+M```!`0`!+T````$!``$O1````0$``2]4```!`0`!+V0```$!``$O;````0$`
+M`2]T``&4`0`!+YP```$!``$OK````0$``2^P```!`0`!+\````$!``$OR```
+M`0$``2_,```!`0`!+^P```$!``$O_````0$``3`````!`0`!,`@```$!``$P
+M$````0$``3`L```!`0`!,$````$!``$P1````0$``3!H```!`0`!,'P```$!
+M``$PB````0$``3",```!`@`!,)````$"``$PE````0(``3"8```!`@`!,)P`
+M``$"``$PH````0(``3"D```!`@`!,+0```$!``$PN```B0$``3#````!`0`!
+M,-@```$!``$PW````0(``3#@```!`@`!,.0```$"``$PZ````0(``3#L```!
+M`@`!,/0```$!``$P_````0$``3$$```!`0`!,0P```$!``$Q%````0$``3$H
+M``$9`0`!,7P```$!``$Q@````0(``3&$```!`@`!,8@```$"``$QC````0(`
+M`3&0```!`@`!,90```$"``$QF````0(``3&<```!`@`!,:````$"``$QI```
+M`0(``3&H```!`@`!,:P```$"``$QL````0(``3&T```!`@`!,;@```$"``$Q
+MO````0(``3'````!`@`!,<0```$"``$QR````0(``3',```!`@`!,=````$"
+M``$QU````0(``3'8```!`@`!,=P```$"``$QX````0(``3'D```!`@`!,>@`
+M``$"``$Q[````0(``3(0```!`0`!,B````$!``$R5``!D0$``3)H``&4`0`!
+M,H````$!``$RE````0$``3*H```!`0`!,L@```$!``$RY````0$``3+\```!
+M`0`!,R0```$!``$S+````0$``3-```"@`0`!,U@```$!``$S>````0$``3.,
+M```;`0`!,[0```("``$SV``!.P$``3/\```!`0`!-`0``90!``$T%``!D0$`
+M`30<``$Y`0`!-#```90!``$T.````0$``31```$Y`0`!-$P``90!``$T7``!
+MD0$``31D```!`0`!-&@```$!``$T<````0$``32$``&4`0`!-)0``9$!``$T
+MQ``!E`$``334``&1`0`!--P```$!``$TZ``!E`$``33\``&1`0`!-20``90!
+M``$U-``!D0$``34\```!`0`!-4@``90!``$U7``!D0$``36,```!`0`!-9``
+M``$!``$UF````0$``36<```!`0`!-:````$!``$UJ````0$``36L```!`0`!
+M-;````$!``$UM````0$``36X```!`0`!->@``90!``$V#````0$``380```!
+M`0`!-A@```$!``$V'````0$``38D```!`0`!-B@```$!``$V,````0$``38T
+M```!`0`!-CP```$!``$V0````0$``39(```!`0`!-DP```$!``$V5````0$`
+M`39<```!`0`!-F````$!``$V=````0$``3:````!`0`!-I0```$!``$VF```
+M`0$``3:@```!`0`!-J@```$!``$VL````0$``3:X```!`0`!-L````$!``$V
+MR````0$``3;0```!`0`!-N```2T!``$V[```+`(``3;T``"K`@`!-O@``4\"
+M``$V_```T@(``3<````5`@`!-P0``5P"``$W"```V0(``3<,``#D`@`!-R``
+M`90!``$W/``!D0$``3=8``&1`0`!-W@``9$!``$WC```2@$``3>T``&4`0`!
+M-\0``9$!``$WS```,`$``3?8``#=`0`!-_@``90!``$X"``!D0$``3@0``"$
+M`0`!.#P``9$!``$X3``!D0$``3AT```!`0`!.(0```$!``$XC``!E`$``3BD
+M```!`0`!.*P``90!``$XP``!D0$``3CL```!`0`!./P```$!``$Y!``!E`$`
+M`3D<```!`0`!.20``90!``$Y.``!D0$``3E@``&4`0`!.7```90!``$YO``!
+MD0$``3GD``&1`0`!.>P```$!``$Y^``!E`$``3H````!`0`!.@P``90!``$Z
+M'``!D0$``3IL```!`0`!.P0```$!``$[$````0$``3L8``&4`0`!.R````$!
+M``$\.````0$``3Q(```!`0`!/%0```$!``$\C````0$``3R8``"1`0`!/)P`
+M``$!``$\L````0$``3R\```!`0`!/0P```$!``$]%````0$``3TH```!`0`!
+M/30```$!``$]/````0$``3U0```!`0`!/6```84!``$]:````0$``3UT``$`
+M`0`!/8````$!``$]C````0$``3V0```!`@`!/90```$"``$]F````0(``3V<
+M```!`@`!/:````$"``$]I````0(``3VH```!`@`!/:P```$"``$]L````0(`
+M`3W$```!`0`!/=```90!``$]X```RP$``3WL``#=`0`!/?P```$!``$^!```
+M`0$``3X,```!`0`!/A0```$!``$^)````0$``3XP```!`0`!/D````$!``$^
+M4````0$``3YH```!`0`!/G0```L!``$^?````0$``3Z(``&4`0`!/J0``90!
+M``$^N``!E`$``3[8``&4`0`!/N@``90!``$^^```7@$``3\```!,`0`!/PP`
+M`8\!``$_%````0$``3\D```!`0`!/R@```$!``$_,````0$``3\T```!`0`!
+M/SP```$!``$_0````0$``3](```!`0`!/TP```$!``$_5````0$``3]8```!
+M`0`!/V````$!``$_:````0$``3]P```!`0`!/W0```$!``$_@````0$``3^0
+M```!`0`!/Z0```$!``$_N````0$``3_,```!`0`!/]0```$!``$_Y``!D0$`
+M`4`(``&1`0`!0!@``3D!``%`)````0$``4`\```!`0`!0%@```$!``%`:``!
+MD0$``4!X``$Y`0`!0(0```$!``%`K````0$``4"X```!`0`!0,0``10!``%`
+MU````0$``4#D``&1`0`!0/0```$!``%!(````0$``4%4```!`0`!080``9$!
+M``%!D``!E`$``4&@``&1`0`!0:P``90!``%!P``!D0$``4'0``&1`0`!0>``
+M``$!``%!\``!D0$``4(```&1`0`!0@P```$!``%"%````0$``4(<```!`0`!
+M0BP```$!``%"5``!E`$``4)<```!`0`!0FP``9$!``%"?```60$``4*$```!
+M`0`!0HP```$!``%"G``!1`$``4+````!`0`!0LP```$!``%"V````0$``4+@
+M```!`0`!0N@```$!``%"^````0$``4,,```!`0`!0QP```$!``%#*```EP$`
+M`4,T``$(`0`!0T```4<!``%#2````0$``4-4```!`0`!0V0``9$!``%#G``!
+MD0$``4/4``&1`0`!0^```"0!``%$&``!D0$``40X``&1`0`!1$0``90!``%$
+M7``!D0$``41L``&1`0`!1'P``9$!``%$C``!D0$``43$``&1`0`!1.0``9$!
+M``%$^``!D0$``44(``&1`0`!110``+$!``%%'````0$``44D```!`0`!13@`
+M`#,!``%%1```70$``45<```!`0`!17````$!``%%?````0$``46@``&4`0`!
+M1;@``9$!``%%Q``!E`$``48```&1`0`!1A@```$!``%&,````0$``48\``$Y
+M`0`!1D@``90!``%&7``!D0$``49D```!`0`!1FP``3D!``%&?````0$``4:(
+M``&4`0`!1I````$!``%&H``!D0$``4:L``&4`0`!1KP``9$!``%&S````0$`
+M`4;<```!`0`!1N@``90!``%&^``!D0$``4<$``&4`0`!1Q0``9$!``%'(```
+M`0$``4<T``!.`0`!1U```9$!``%'7````0$``4=\```!`0`!1XP``(P!``%'
+MG````0$``4?(``&1`0`!1]0``90!``%'Y``!D0$``4?X``"Y`0`!2`P``$H!
+M``%(&```FP$``4@D``&4`0`!2#0``9$!``%(0````0$``4A$```!`0`!2%0`
+M``$!``%(9``!D0$``4AT``&1`0`!2(0``9$!``%(K``!%@$``4G8``&1`0`!
+M2>@```$!``%)]``!D0$``4H(``!"`0`!2AP``"T!``%*,```1@$``4H\```!
+M`0`!2D@``9$!``%*6````0$``4K$``!)`0`!2M0``5T!``%+$````@(``4L4
+M```"`@`!3%@```$!``%,8``!E`$``4QX``&1`0`!3(````$!``%,B````0$`
+M`4R4``&4`0`!3*0``9$!``%,M``!E`$``4S$``&1`0`!32```0`!``%-.```
+M`0$``4U(``&<`0`!350```$!``%-9````0$``4UL```!`0`!380``9$!``%-
+ME``!E`$``4V<```!`0`!3:0``3D!``%-L````0$``4VT```!`0`!3;P```$!
+M``%-T```L0$``4W8```!`0`!3>0``90!``%.&``!.0$``4XH``!9`0`!3C``
+M``$!``%.0``!D0$``4Y,```!`0`!3E@```$!``%.8````0$``4YH```!`0`!
+M3G@```$!``%.C````0$``4Z<```!`0`!3J@``)<!``%.M``!"`$``4[```&4
+M`0`!3M```9$!``%/,```20$``4]```%=`0`!3X@``90!``%/F````0$``4^<
+M```!`@`!3Z````$"``%/I````0(``4^H```!`@`!3ZP```$"``%/L````0(`
+M`4^T```!`@`!3[@```$"``%/O````0(``4_0``&1`0`!3]P``90!``%/Y```
+M`0$``4_X``&1`0`!4`0``90!``%0%``!D0$``5`H``&1`0`!4$0```$!``%0
+M9``!A0$``5!L```!`0`!4'@```$!``%0F````0$``5"@```!`0`!4+```84!
+M``%0N````0$``5#$```!`0`!4,P```$!``%0U````0$``5#@```!`0`!4.@`
+M``$!``%0\````0$``5$````!`0`!41````$!``%1(````0$``5$D```!`0`!
+M43P```$!``%13````0$``5%<```!`0`!46@```$!``%1<````0$``5&````!
+M`0`!49@```$!``%1J````0$``5&T```!`0`!4;P```$!``%1S````0$``5'L
+M```!`0`!4?0```$!``%2`````0$``5((```!`0`!4A0```$!``%20``!E`$`
+M`5)0```!`0`!4EP```$!``%2;``!D0$``5)\``&1`0`!4H0```$!``%2E``!
+MD0$``5*<``$Y`0`!4J````$!``%2J````0$``5*X``&1`0`!4L```3D!``%2
+MT``!D0$``5+@``&1`0`!4RP``0`!``%3.````0$``5-@```!`0`!4VP``90!
+M``%3=````0$``5.,``&4`0`!4YP``90!``%3K``!E`$``5.\```!`0`!4\@`
+M`90!``%3V``!D0$``5/D```!`0`!5!````$!``%4*``!)0$``50X```!`0`!
+M5$P``&L!``%47````0$``51P``&4`0`!5(P``9$!``%4F``!E`$``52P``&1
+M`0`!5+P``90!``%4S``!D0$``53L```!`0`!5/P```$!``%5#````0$``548
+M```!`0`!520``90!``%5-``!D0$``55```&4`0`!55```9$!``%59```RP$`
+M`55P```!`0`!57P``90!``%5C``!D0$``568```!`0`!5;````$!``%5N```
+M`0$``57(```!`0`!5=````$!``%5V````0$``57@```!`0`!5?````$!``%5
+M^````0$``57\```!`0`!5F@```$!``%6<````0$``5:````!`0`!5I```90!
+M``%6H``!D0$``5:H``$Y`0`!5LP``$H!``%6V````0$``5<,``&1`0`!5QP`
+M`84!``%7)````0$``5<P``&4`0`!5TP``90!``%7@````0$``5>$```!`0`!
+M5XP```$!``%7D````0$``5><```!`0`!5Z````$!``%7J````0$``5?P``&4
+M`0`!5_P```$!``%8!```:`$``5@<```!`0`!6"0```$!``%8-````0$``5A\
+M```!`0`!6(@``9$!``%8F``!D0$``5BD``&4`0`!6+0``9$!``%8Q``!D0$`
+M`5C4``&1`0`!6.P``9$!``%9```!D0$``5D,```!`0`!65@```$!``%9M```
+M`0$``5G````O`0`!6>P```$!``%9\````0$``5GX```!`0`!6?P```$!``%:
+M"````0$``5H,```!`0`!6A0```$!``%:E````0$``5J8```!`0`!6J````$!
+M``%:I````0$``5JL```!`0`!6K0```$!``%:Q````0$``5K0``&4`0`!6M@`
+M``$!``%:Y``!E`$``5KT``&1`0`!6PP``9$!``%;'``!D0$``5MX```!`0`!
+M6X````$!``%;B````0$``5N8```!`0`!6Z@```$!``%;Q````0$``5O0``"[
+M`0`!7"P```$!``%<,````0$``5PX```!`0`!7#P```$!``%<1````0$``5Q(
+M```!`0`!7%````$!``%<5````0$``5Q<```!`0`!7&````$!``%<:````0$`
+M`5QP```!`0`!7'@```$!``%<F````0$``5RH```!`0`!7+````$!``%<N```
+M`0$``5S````!`0`!7-````$!``%<W``!E`$``5T$``&1`0`!70@```$!``%=
+M%````0$``5T@```!`0`!730``90!``%=8``!D0$``5UT```.`0`!790``9$!
+M``%=I````0$``5VP```!`0`!7>P```$!``%>3``!E`$``5YH``&1`0`!7G0`
+M`90!``%>B``!D0$``5Z4``&4`0`!7J@``9$!``%>M``!E`$``5[4``&1`0`!
+M7PP``9$!``%?&``!E`$``5\X``&1`0`!7T0``90!``%?:``!D0$``5^````!
+M`0`!7Y0```$!``%?I````0$``5^P``#%`0`!7[@```$!``%?W``!E`$``5_X
+M``&1`0`!8#```90!``%@3``!D0$``6!8``&4`0`!8'```9$!``%@?``!E`$`
+M`6",``&1`0`!8)P```$!``%@K````0$``6"T```!`0`!8,```90!``%@X``!
+MD0$``6#P```!`0`!80```9$!``%AS```6@$``6'<``!:`0`!8B````$!``%B
+M:````0$``6)X```!`0`!8I````$!``%BI````0$``6*P```!`0`!8KP``90!
+M``%BQ````0$``6+0``&4`0`!8N```9$!``%B[``!E`$``6+\``&1`0`!8PP`
+M`9$!``%C'``!D0$``6,H``&4`0`!8SP``9$!``%C3``!D0$``6-8``&4`0`!
+M8VP``9$!``%C?``!D0$``6.,``&1`0`!8YP``9$!``%CJ``!E`$``6.\``&1
+M`0`!8\P``9$!``%CW``!D0$``6/L``&1`0`!8_@``90!``%D#``!D0$``60D
+M```!`0`!9"@```$!``%D,````0$``60T```!`0`!9#P```$!``%D1````0$`
+M`61(```!`0`!9'````$!``%DL````0$``63L``$E`0`!90P```$!``%E(```
+M`0$``64P```!`0`!94````$!``%E2````0$``65<```!`0`!97P```$!``%E
+MG````0$``66H```!`0`!9<@```$!``%EU````0$``67T```!`0`!9@````$!
+M``%F,````0$``68\``&4`0`!9DP``9$!``%F6``!E`$``69H``&1`0`!9I0`
+M`9$!``%FI``!D0$``6:P``&4`0`!9M0``9$!``%FY``!D0$``6;P``&4`0`!
+M9P@``9$!``%G&``!D0$``6<H``&1`0`!9S@``9$!``%G1``!E`$``6=H``&1
+M`0`!9W@``9$!``%GB``!D0$``6>8``&1`0`!9Z0``90!``%GR``!D0$``6?0
+M```"`@`!9]0```("``%H3````0$``6A@``!K`0`!:'````$!``%H>````0$`
+M`6B@``&4`0`!:+@``9$!``%HQ``!E`$``6C@``&1`0`!:1@``%D!``%I5``!
+M(P$``6ED``$C`0`!:=P```$!``%IY````0$``6H,```!`0`!:AP```$!``%J
+M)````0$``6HL```!`0`!:C0```$!``%J1````0$``6J0```!`0`!:J````$!
+M``%JL````0$``6K````!`0`!:M````$!``%J_````0$``6L<```!`0`!:V@`
+M`9$!``%K=````0$``6O```&1`0`!;`P``9$!``%L6``!D0$``6RD``&1`0`!
+M;,0``9$!``%LV````@(``6W````4`0`!;=P```$!``%M\````0$``6WX```!
+M`0`!;@@```$!``%N'````0$``6XT```!`0`!;E@```$!``%N;````0$``6Z,
+M```!`0`!;J````$!``%NJ````0$``6ZX```!`0`!;LP```$!``%NY````0$`
+M`6\,```!`0`!;S0``18!``%O1````0$``6]X```!`0`!;Z0```$!``%OM```
+M`0$``6_D```!`0`!;_````$!``%P<````0$``7#<```!`0`!<0````$!``%Q
+M+````0$``7%H```!`0`!<70```$!``%QF````0$``7((```!`0`!<G@```$!
+M``%RX````0$``7-P```!`0`!<\@```$!``%T`````0$``70(```!`0`!=#P`
+M``$!``%T3````@(``72```#I`0`!=,P```$!``%T]````0$``74(```!`0`!
+M=3@```$!``%UG````0$``770```!`0`!=A````$!``%V*````0$``79,``%9
+M`0`!=E@```$!``%V:````0$``79T```!`0`!=H@```$!``%VF````0$``7:@
+M```!`0`!=K````$!``%V_````0$``7<$```!`0`!=QP``24!``%W+````0$`
+M`7=````!`0`!=[````$!``%WV````0$``7?X``%9`0`!>`P```$!``%X2```
+M`0$``7A4```!`0`!>)0```$!``%XO````0$``7CD```!`0`!>0P```$!``%Y
+M7````0$``7EX```!`0`!>;````$!``%YU````0$``7GP```!`0`!>?P```$!
+M``%Z(````0$``7I4```!`0`!>I````("``%ZE````@(``7K````!`0`!>N``
+M``$!``%[!````0$``7L(```!`0`!>R@```$!``%[C````0$``7OH``&1`0`!
+M?#````$!``%\0````0$``7Q,``&4`0`!?%0```$!``%\;````0$``7RH```!
+M`0`!?+````$!``%\X````0$``7SL```!`0`!?/@```$!``%]`````0$``7T,
+M```!`0`!?10```$!``%]:````0$``7W,```!`0`!?=0```$!``%]]````0$`
+M`7X````!`0`!?D````$!``%^2````0$``7Y@```!`0`!?G0```$!``%^E```
+M`0$``7ZL```!`0`!?N@```$!``%^_````0$``7\0```"`@`!?Q0```("``%_
+M5````0$``7]<```!`0`!?X0```$!``%_D````0$``7^4```!`@`!?Y@```$"
+M``%_G````0(``7^@```!`@`!?Z@```$!``%_]```+P$``8`,```!`0`!@'0`
+M``$!``&`H````0$``8"P```!`0`!@,0``%L!``&`V````0$``8#\``!G`0`!
+M@1P``9$!``&!+````0$``8$X```!`0`!@40``%L!``&!6````0$``8%\```!
+M`0`!@90``&<!``&!K``!D0$``8&X```!`0`!@=@``&<!``&!\``!D0$``8(`
+M```!`0`!@B```90!``&",````0$``8),```!`0`!@GP``9$!``&"C``!D0$`
+M`8*<``&1`0`!@J@``90!``&"P``!D0$``8,```#8`0`!@Q```90!``&#+```
+M`0$``8,\```!`0`!@U@``9$!``&#9```V`$``8.0```!`0`!@Z@``6H!``&#
+MS````0$``8/H``$8`0`!A!P```$!``&$(````0(``80D```!`@`!A"@```$"
+M``&$+````0(``81````!`0`!A%0```$!``&$=````0$``81X```!`0`!A(P`
+M``$!``&$I````0$``82P```!`0`!A+P```$!``&$U````0$``83H``$C`0`!
+MA/0```$!``&%)````0$``84\``!6`0`!A8@``9$!``&%N``!D0$``87$``&4
+M`0`!A>P``9$!``&&+````0$``89,```!`0`!AK@```$!``&'"````0$``8<H
+M```!`0`!AT````$!``&'2````0$``8=<```!`0`!AVP```$!``&'?````0$`
+M`8>T``&1`0`!A]P``9$!``&']````0$``8@,``&1`0`!B"@```$!``&(0``!
+MD0$``8AL``&1`0`!B'@```$!``&(G````0$``8CX```!`0`!B00```$!``&)
+M1````0$``8E,```!`0`!B5````$!``&)8````0$``8EP```!`0`!B;0``9$!
+M``&)[``!D0$``8H```&1`0`!B@P```$!``&*(``!D0$``8HP``&1`0`!BD``
+M`9$!``&*3``!E`$``8I<``&1`0`!BT0```$!``&+6``!+`(``8M<```Q`@`!
+MBV0``,("``&+F``!E`$``8NT``&1`0`!B]@``9$!``&,```!E`$``8P(```!
+M`0`!C!0``90!``&,3``!D0$``8Q<``&<`0`!C&0```$!``&,;``!.0$``8QT
+M```!`0`!C(```9P!``&,B````0$``8R8```!`0`!C*````$!``&,J````0$`
+M`8RP```!`0`!C,````$!``&,U``!E`$``8SH``&1`0`!C00``9$!``&-$``!
+ME`$``8T8```!`0`!C20```$!``&-,``!E`$``8U```&1`0`!C4@``3D!``&-
+M5``!E`$``8UD``&1`0`!C6P```$!``&-=````0$``8U\``$Y`0`!C8@``9P!
+M``&-D````0$``8V<``&4`0`!C:P``9$!``&-O``!D0$``8\(```!`0`!CY@`
+M``$!``&/J````0$``9"X```!`0`!D4P```$!``&1Y````0$``9+4```!`0`!
+MDR@```$!``&3,````0$``9/8```!`0`!E-P```$!``&5,````0$``94T```!
+M`@`!E3@```$"``&5/````0(``95````!`@`!E4P```$!``&5>````0$``964
+M```!`0`!E@````$!``&6!````0$``98,```!`0`!EA````$!``&6&````0$`
+M`9:\``&&`0`!ELP``9$!``&6W``!D0$``9;L``&1`0`!EOP``9$!``&7#``!
+MD0$``9<\``&1`0`!ETP``88!``&77``!D0$``9=L``&1`0`!EZ0```$!``&7
+MQ````0$``9?P```!`0`!F"P``88!``&8>``!(P$``9DP```!`0`!F50```$!
+M``&99````0$``9EX``&1`0`!F8P``9$!``&9E```,`$``9HH```!`0`!FBP`
+M`(0!``&:/``!D0$``9I,``&1`0`!FHP```$!``&:D````0(``9J4```!`@`!
+MFI@```$"``&:G````0(``9J@```!`@`!FJ0```$"``&:J````0(``9JT```!
+M`0`!FKP``90!``&:Y``!D0$``9KP``&4`0`!FQ@``9$!``&;)``!E`$``9M(
+M``&1`0`!FU0``90!``&;>``!D0$``9N(```!`0`!FY0```$!``&;K````0$`
+M`9P@``&4`0`!G$@``9$!``&<5``!E`$``9QX``&1`0`!G(0``90!``&<J``!
+MD0$``9RT``&4`0`!G-@``9$!``&<Y``!E`$``9T$``&1`0`!G1```90!``&=
+M-``!D0$``9T\```!`0`!G4@``90!``&=4````0$``9U<``&4`0`!G6P``9$!
+M``&=?````0$``9V@```!`0`!G<0``90!``&=Y``!D0$``9WP```!`0`!GA``
+M``$!``&>+````0$``9XX``&4`0`!GF```9$!``&><````0$``9Y\```!`0`!
+MGI0```$!``&>N````0$``9[$``&4`0`!GNP``9$!``&>_````0$``9\(```!
+M`0`!GR````$!``&?*````0$``9\\``!S`0`!GT0``74!``&?4```W`$``9]4
+M```!`0`!GV0```$!``&?=````0$``9]X``%U`0`!GX0``-P!``&?F``!D0$`
+M`9^L``&1`0`!G[0``#`!``&?N````0$``9^\``%U`0`!G\@``-P!``&?W```
+M`0$``:`<```"`@`!H"````("``&@)````@(``:`H```"`@`!H"P```("``&@
+M,````@(``:!$```"`@`!H%````("``&@7````@(``:"T```!`0`!H/0``9$!
+M``&A!``!D0$``:$4``&1`0`!H20``9$!``&A-``!A@$``:&(```!`0`!H:0`
+M``$!``&AM````0$``:'```"@`0`!H?0```$!``&B`````0$``:(0``"@`0`!
+MHB````$!``&B+````0$``:(X```!`0`!HD@``*`!``&B8````0$``:)D```!
+M`0`!HFP``2$!``&B>````0$``:*$```!`0`!HI```*`!``&BG````0$``:*L
+M``"@`0`!HNP```$!``&C"````0$``:,X```!`0`!HT0```$!``&C5```H`$`
+M`:-@``$A`0`!HVP```$!``&C>````0$``:.(``"@`0`!H\````$!``&D$```
+M`0$``:0P``"@`0`!I$```*`!``&D4```H`$``:1@``"@`0`!I'```*`!``&D
+M>``!=0$``:2$``#<`0`!I(P```$!``&DI````0$``:2L```!`0`!I+P``*`!
+M``&DS```H`$``:3H``"@`0`!I/@``*`!``&E"````0$``:48``"@`0`!I2@`
+M`*`!``&E.```H`$``:5(``"@`0`!I5@``*`!``&E:````0$``:5P``%U`0`!
+MI7P``-P!``&EA````0$``:64``&1`0`!I:0``9$!``&EL````0$``:6X``%U
+M`0`!I<0``-P!``&F"``!D0$``:88``&1`0`!IB@``88!``&F1``!E`$``:94
+M``&4`0`!IF0```$!``&F<````0$``:;4```!`0`!IN@```$!``&F\````0$`
+M`:<X```!`0`!IV0```$!``&G:````0$``:=P```!`0`!IX````$!``&GK```
+M`0$``:>P```!`0`!I[@```$!``&H#````0$``:@8```!`0`!J"P```$!``&H
+M,````0$``:@\``"@`0`!J$P```$!``&H8````0$``:AL```!`0`!J'@``*`!
+M``&HG``!E`$``:BL``&4`0`!J+P``90!``&HU````0$``:C<```!`0`!J/0`
+M``$!``&I@````0$``:F(```!`0`!J90```$!``&IK````0$``:G(```!`0`!
+MJ=@``88!``&IY``!E`$``:GT``&4`0`!J@0```$!``&J$````0$``:H<```!
+M`0`!JB@``9$!``&J.``!D0$``:I$```!`0`!JE```9$!``&J8``!D0$``:K`
+M```!`0`!JM@```$!``&J]````0$``:L,```!`0`!JQ0```$!``&K&````0$`
+M`:LL```!`0`!JT@```$!``&K4````0$``:M8```!`0`!JWP```$!``&KA```
+M`0$``:N,```!`0`!K%0``9$!``&L9``!.0$``:QP```!`0`!K(P``9$!``&L
+MG``!.0$``:RH```!`0`!K,@``9$!``&LV``!.0$``:SD```!`0`!K.P```("
+M``&L\````@(``:ST```"`@`!K10``(L!``&M,````0$``:U4```O`0`!K70`
+M`90!``&ME``!D0$``:V@```!`0`!K:@```$!``&MO```+P$``:W(```!`0`!
+MK>0``"\!``&N%``!D0$``:XP``&1`0`!KD0```("``&N;````0$``:YP```!
+M`@`!KG0```$"``&N>````0(``:Y\```!`@`!KH````$"``&NA````0(``:Z(
+M```!`@`!KHP```$"``&N^````0$``:[\```!`0`!KP0```$!``&O"````0$`
+M`:\0```!`0`!KQ@```$!``&O1````0$``:]L```!`0`!KY0```$!``&OL```
+M`0$``;`$```!`0`!L&````$!``&PO````0$``;#X```!`0`!L00```$!``&Q
+M(```>0$``;$X``!Y`0`!L5P``9$!``&Q;``!.0$``;%X```!`0`!L9@``9$!
+M``&QJ``!.0$``;&P```!`0`!L=```9$!``&QX``!.0$``;'H```!`0`!L@@`
+M`9$!``&R&``!.0$``;(@```!`0`!LDP```$!``&R7````0$``;*```!Y`0`!
+MLIP``'D!``&RO```>0$``;+4``!Y`0`!LNP``'D!``&S!```>0$``;,D``&1
+M`0`!LS0``3D!``&S0````0$``;-L```!`0`!LXP``'D!``&SI```>0$``;.P
+M```!`0`!L[P```$!``&S[```>0$``;0$``!Y`0`!M!P``'D!``&T0``!D0$`
+M`;10``$Y`0`!M%P```$!``&TX````@(``;3D```"`@`!M.@```("``&T[```
+M`@(``;3P```"`@`!M/P```("``&U.````0$``;5````!`0`!M5@``24!``&U
+M:````0$``;5\```!`0`!M?@```$!``&U_````0$``;8$```!`0`!M@P```$!
+M``&V$````0$``;88```!`0`!MAP```$!``&V)````0$``;8L```!`0`!ME@`
+M``$!``&VA````0$``;:P```!`0`!ML@``2,!``&V\````0$``;<P```!`0`!
+MMT@```$!``&W8````0$``;>$```!`0`!M\0```$!``&W]````0$``;@,```!
+M`0`!N$0```$!``&XH````0$``;C@```!`0`!N1P```$!``&Y2````0$``;EP
+M```!`0`!N:@```$!``&Z&````0$``;H@```!`0`!NDP```$!``&ZN````0$`
+M`;K````!`0`!NN0``5D!``&[`````0$``;L<```!`0`!NS0```$!``&[3```
+M`0$``;MH```!`0`!NX@```$!``&[G````0$``;NX```!`0`!N]@```$!``&\
+M%````0$``;P@```!`0`!O#0```$!``&\0````0$``;QH```!`0`!O'P```$!
+M``&\P````0$``;S,```!`0`!O-P```$!``&\]``!60$``;T8```!`0`!O1P`
+M`(4!``&]-````0$``;TX``"%`0`!O70```$!``&]B````0$``;V<```"`@`!
+MO;@``-`!``&]R````0$``;W8``#0`0`!O>@```$!``&^;````0(``;YT```!
+M`@`!OGP```$"``&^A````0(``;Z,```!`@`!OI0```$"``&^G````0(``;ZD
+M```!`@`!ON0``9$!``&^]``!.0$``;\````!`0`!OQP``9$!``&_+``!.0$`
+M`;\X```!`0`!OU@``9$!``&_:``!.0$``;]T```!`0`!OWP```("``&_@```
+M`@(``;^$```"`@`!O[````$!``&_T````0$``;_L```!`0`!P!````$!``'`
+M0```+P$``<!0``&4`0`!P'```9$!``'`=````0$``<"<```!`0`!P*@```$!
+M``'`X```+P$``<#L```!`0`!P0P```$!``'!%````0$``<$T```O`0`!P4``
+M``$!``'!8````0$``<&````O`0`!P8P```$!``'!K````0$``<'(```O`0`!
+MP=@``"\!``'!X````0$``<(,``&1`0`!PB```9$!``'";````0$``<)P```!
+M`@`!PG0```$"``'">````0(``<)\```!`@`!PH````$"``'"A````0(``<*(
+M```!`@`!PQ@```$!``'#'````0$``<,D```!`0`!PRP```$!``'#,````0$`
+M`<,X```!`0`!PSP```$!``'#1````0$``<-,```!`0`!PVP```$!``'#A```
+M`0$``<.@```!`0`!P[@```$!``'#U````0$``</P```!`0`!Q`0```$!``'$
+M,````0$``<1<```!`0`!Q(0```$!``'$L````0$``<34```!`0`!Q/@```$!
+M``'%(````0$``<4\``!Y`0`!Q5@``'D!``'%=```>0$``<6$```!`0`!Q:@`
+M`'D!``'%R```>0$``<7H``!Y`0`!Q@@``'D!``'&*```>0$``<9(``!Y`0`!
+MQE@```$!``'&>```>0$``<:0```!`0`!QK```'D!``'&R```>0$``<;@```!
+M`0`!QNP```$!``'&]````0$``<;\```!`0`!QQP``'D!``''-```>0$``<=,
+M``!Y`0`!QV0``'D!``''=````0$``<>4``!Y`0`!Q[```'D!``''R```>0$`
+M`<?@``!Y`0`!Q_@``'D!``'((````0$``<@P```!`0`!R%0``'D!``'(<```
+M>0$``<B````!`0`!R(P```$!``'(P```>0$``<C8``!Y`0`!R/```9$!``')
+M```!.0$``<D(```!`0`!R2@``9$!``').``!.0$``<E````!`0`!R6```9$!
+M``')<``!.0$``<EX```!`0`!R9@``9$!``')J``!.0$``<FT```!`0`!R=0`
+M`9$!``')Y``!.0$``<GP```!`0`!REP```("``'*8````@(``<ID```"`@`!
+MRF@```("``'*D````@(``<K,```!`0`!RM@```$!``'*X````0$``<KH```!
+M`0`!RO0```$!``'+$````0$``<L4```!`0`!RQP```$!``'+)````0$``<LH
+M```!`0`!RS````$!``'+-````0$``<L\```!`0`!RT0```$!``'+7````0$`
+M`<MT```!`0`!RY@```$!``'+]````0$``<O\```!`0`!S!P```$!``',/```
+M`0$``<Q4```!`0`!S(````$!``',K```Z0$``<S```#I`0`!S-P```$!``',
+MZ````0$``<SL```!`0`!S1@``.D!``'-+```Z0$``<U(```!`0`!S5````$!
+M``'-9```Z0$``<V0``#I`0`!S:0``.D!``'-P````0$``<W(```!`0`!S=P`
+M`.D!``'-^````0$``<XT```!`0`!SG0```$!``'.A````0$``<Z8```!`0`!
+MSN@```$!``'/(````0$``<]0```!`0`!SV````$!``'/;````0$``<^(```!
+M`0`!S^P```$!``'0`````0$``=`0```!`0`!T"0```$!``'08````0$``=!\
+M```!`0`!T4P```$!``'1=``!)0$``=&X```!`0`!T<0```$!``'1X````0$`
+M`=($```!`0`!TA````$!``'2'````0$``=(H```!`0`!TG````$!``'2B```
+M`0$``=*8```!`0`!TM0```$!``'2[````0$``=+T```!`0`!TQ0```$!``'3
+M*````0$``=.````!`0`!TZP```$!``'3R````0$``=/@```!`0`!T_P```$!
+M``'4$````0$``=08```!`0`!U"@```$!``'43````0$``=10```!`0`!U'P`
+M``$!``'4Y````0$``=40```!`0`!U2P```$!``'52````0$``=5D```!`0`!
+MU7P```$!``'5F````0$``=6H```!`0`!U;0```$!``'5Q````0$``=7H```!
+M`0`!U>P```$!``'6'````0$``=9(```!`0`!UDP``(4!``'69````0$``=9H
+M``"%`0`!UK@```$!``'6_````0$``==8```!`0`!UWP```$!``'7C````0$`
+M`=>D```!`0`!U[0```$!``'7S````0$``=?H```!`0`!U_P```$!``'8'```
+M`0$``=@P```!`0`!V$````$!``'86````0$``=B0```!`0`!V+0``24!``'8
+MS````0$``=CD```!`0`!V0@```$!``'9'``!)0$``=DH```!`0`!V4@```$!
+M``'96````0$``=F,```!`0`!V:0```$!``'9R````0$``=GL``#0`0`!V?P`
+M``$!``':#```T`$``=H<```!`0`!VJP```$"``':M````0(``=J\```!`@`!
+MVL0```$"``':S````0(``=K4```!`@`!VMP```$"``':Y```(0(``=LD``&1
+M`0`!VS0``3D!``';0````0$``=M<``&1`0`!VVP``3D!``';>````0$``=N8
+M``&1`0`!VZ@``3D!``';M````0$``=N\```"`@`!V\````("``';Q````@(`
+M`=OP```!`0`!W!````$!``'<+````0$``=Q0```!`0`!W(```"\!``'<D``!
+ME`$``=RP``&1`0`!W+0```$!``'<W````0$``=SH```!`0`!W2```"\!``'=
+M+````0$``=U,```!`0`!W50```$!``'==```+P$``=V````!`0`!W:````$!
+M``'=P```+P$``=W,```!`0`!W>P```$!``'>"```+P$``=X8```O`0`!WB``
+M``$!``'>3``!D0$``=Y@``&1`0`!WM````$!``'>U````0$``=[<```!`0`!
+MWN````$!``'>Z````0$``=[L```!`0`!WOP```$!``'?#````0$``=\X```!
+M`0`!WUP```$!``'?@````0$``=^H```!`0`!W\0``'D!``'?W```>0$``>``
+M```!`0`!X!@``9$!``'@*``!.0$``>`P```!`0`!X%```9$!``'@8``!.0$`
+M`>!H```!`0`!X(@``9$!``'@F``!.0$``>"@```!`0`!X,```9$!``'@T``!
+M.0$``>#<```!`0`!X/P``9$!``'A#``!.0$``>$8```!`0`!X40```("``'A
+M2````@(``>%,```"`@`!X5````("``'A5````@(``>%P```!`0`!X70```$"
+M``'A>````0(``>%\```!`@`!X8````$"``'AA````0(``>&(```!`@`!X8P`
+M``$"``'AZ````0$``>'X```!`0`!XA0```$!``'B.````0$``>),```!`0`!
+MXE@```$!``'B9````0$``>*P```!`0`!XLP```$!``'B[````0$``>,T```!
+M`0`!XW0``24!``'CO````0$``>0````!`0`!Y"@``24!``'DE````0$``>3$
+M```!`0`!Y=````$!``'F"````0$``>8D```!`0`!YF0```$!``'FC````0$`
+M`>:<```!`0`!YK@```$!``'FQ````0$``>;D```!`0`!YQ@```$!``'G<```
+M`0$``>>L```!`0`!Y_````$!``'H)````0$``>A8```!`0`!Z&0```$!``'H
+MM````0$``>C````!`0`!Z,@```$!``'HZ````0$``>CP```!`0`!Z1````$!
+M``'I8````0$``>EX```!`0`!Z8P``90!``'IP````0$``>G,``&4`0`!Z?``
+M`9$!``'J4``!D0$``>I@```!`0`!ZJP``9$!``'JZ````0$``>KL``"%`0`!
+MZP0```$!``'K"```A0$``>L@```!`0`!ZR0``(4!``'K>````0$``>NX```!
+M`0`!Z_P```$!``'L%````0$``>PL```!`0`![#P```$!``'L5````0$``>QP
+M```!`0`!['P```$!``'LC````0$``>R8```!`0`![*@```$!``'LQ````0$`
+M`>S8```!`0`![.@```$!``'M`````0$``>U$```!`0`![5````$!``'M:```
+M`0$``>V0```!`0`![:0``24!``'MO````0$``>W4```!`0`![?P```$!``'N
+M$``!)0$``>X<```!`0`![CP```$!``'N<````0$``>Z(```!`0`![JP```$!
+M``'NT```T`$``>[@```!`0`![O```-`!``'O`````0$``>\(``#0`0`![Q@`
+M``$!``'OH````0(``>^H```!`@`![[````$"``'ON````0(``>_````!`@`!
+M[\@```$"``'OT````0(``>_8```A`@`!\!@``9$!``'P*``!.0$``?`T```!
+M`0`!\%```9$!``'P8``!.0$``?!L```!`0`!\(P``9$!``'PG``!.0$``?"H
+M```!`0`!\+````("``'PM````@(``?"X```"`@`!\.0```$!``'Q!````0$`
+M`?$@```!`0`!\40```$!``'Q=```+P$``?&$``&4`0`!\:0``9$!``'QJ```
+M`0$``?'0```!`0`!\=P```$!``'R%```+P$``?(@```!`0`!\D````$!``'R
+M2````0$``?)D```!`0`!\H0```$!``'RH````0$``?+````!`0`!\MP``"\!
+M``'R[```+P$``?+T```!`0`!\R```9$!``'S-``!D0$``?.T```!`0`!\[@`
+M``$!``'SP````0$``?/(```!`0`!\\P```$!``'SU````0$``?/<```!`0`!
+M\_@```$!``'T$````0$``?0H```!`0`!]$````$!``'T6````0$``?1P```!
+M`0`!](````$!``'TG````0$``?2P```!`0`!],P```$!``'T\````0$``?44
+M```!`0`!]3@```$!``'U8````0$``?5L```!`0`!]8P``'D!``'UI```>0$`
+M`?7```!Y`0`!]<P```$!``'UU````0$``?7D```!`0`!]?```"\!``'V"```
+M`0$``?8H``!Y`0`!]D```'D!``'V:````0$``?:```&1`0`!]I```3D!``'V
+MF````0$``?:X``&1`0`!]L@``3D!``'VT````0$``?;P``&1`0`!]P```3D!
+M``'W"````0$``?<H``&1`0`!]S@``3D!``'W1````0$``?=D``&1`0`!]W0`
+M`3D!``'W@````0$``??8```"`@`!]]P```("``'WX````@(``??D```"`@`!
+M]^P```("``'X"````0$``?@,```!`@`!^!````$"``'X%````0(``?@8```!
+M`@`!^!P```$"``'X(````0(``?@D```!`@`!^(````$!``'XD````0$``?BL
+M```!`0`!^-````$!``'XY````0$``?CP```!`0`!^/P```$!``'Y2````0$`
+M`?ED```!`0`!^80```$!``'YS````0$``?H,``$E`0`!^E0```$!``'ZF```
+M`0$``?K```$E`0`!^RP```$!``'[7````0$``?QH```!`0`!_*````$!``'\
+MO````0$``?S\```!`0`!_20```$!``']-````0$``?U0```!`0`!_5P```$!
+M``']?````0$``?VP```!`0`!_@@```$!``'^1````0$``?Z(```!`0`!_KP`
+M``$!``'^\````0$``?[\```!`0`!_TP```$!``'_6````0$``?]@```!`0`!
+M_X````$!``'_B````0$``?^H```!`0`!__@```$!``(`(``!E`$``@!4```!
+M`0`"`&```90!``(`A``!D0$``@#D``&1`0`"`/0```$!``(!0``!D0$``@%\
+M```!`0`"`8```(4!``(!F````0$``@&<``"%`0`"`;0```$!``(!N```A0$`
+M`@(,```!`0`"`DP```$!``("D````0$``@*\```!`0`"`LP```$!``("Y```
+M`0$``@,````!`0`"`PP```$!``(#'````0$``@,@```!`0`"`RP```$!``(#
+M/````0$``@-<```!`0`"`W````$!``(#@````0$``@.8```!`0`"`]0```$!
+M``(#X````0$``@/X```!`0`"!!P```$!``($,``!)0$``@1(```!`0`"!&``
+M``$!``($A````0$``@28``$E`0`"!*P```$!``($S````0$``@4````!`0`"
+M!1@```$!``(%/````0$``@5@``#0`0`"!7````$!``(%@```T`$``@60```!
+M`0`"!9@``-`!``(%J````0$``@8P```!`@`"!C@```$"``(&0````0(``@9(
+M```!`@`"!E````$"``(&6````0(``@9@```!`@`"!F@``"$"````P``!#P(`
+M``#$``!E`@```,@``,,"````S```M0(```#0``%^`@```-0``-8"````V```
+M5`(```#<``#B`@```.```*("````Y``!>P(```#H``%.`@```.P``,`"````
+M\```/@(```#T``"&`@```/@``%<"````_```(`(```$```%L`@```00``9<"
+M```!"```+@(```$,``".`@```1```4L"```!%```*0(```$8```\`@```1P`
+M`&D"```!(``!@@(```$D``%]`@```2@``1P"```!+```M@(```$P``%C`@``
+M`30``68"```!.``!#`(```$\``#?`@```4```4`"```!1```D@(```%(``%V
+M`@```4P``,$"```!4```N`(```%4``"'`@```5@``+`"```!7```50(```%@
+M``#*`@```60``3P"```!:``!$0(```%L``"F`@```7```3<"```!=```[`(`
+M``%X``%@`@```7P``5`"```!@``!+P(```&$```R`@```8@``+<"```!C``!
+M7@(```&0``$>`@```90``2@"```!F```/0(```&<``!V`@```:```4@"```!
+MI```YP(```&H``!/`@```:P``#8"```!L```C0(```&T```(`@```;@``/@"
+M```!O``!00(```'```$X`@```<0``/D"```!R``!@P(```',``!J`@```=``
+M``H"```!U``!:`(```'8``"N`@```=P``1("```!X``!&P(```'D``%R`@``
+M`>@``38"```![```J`(```'P``!%`@```?0``3$"```!^```$P(```'\``"^
+M`@```@```'$"```"!```^P(```((``#]`@```@P``54"```"$``!9P(```(4
+M``&!`@```A@```\"```"'``!4@(```(@``$F`@```B0``0X"```"*```HP(`
+M``(L``%3`@```C````$"```"-``!E0(```(X``$N`@```D```5X"```"1``!
+M'@(```)(``$H`@```DP``#T"```"4```=@(```)4```!`@``%M```4D"```6
+MU``!:0(``!;8``%;`@``%MP``8`"```6X```9`(``!;D``!W`@``%N@``)4"
+M```6[```;@(``!;P```-`@``%O0``#4"```6^```8@(``!;\``!C`@``%P``
+M`#D"```7!``!;P(``!<(``$0`@``%PP``8L"```7$```@P(``!<4``%Y`@``
+M%Q@``04"```7'```K`(``!<@``$K`@``%R0``"("```7*``!"@(``!<L```9
+M`@``%S```6L"```7-```Z@(``!<X```?`@``%SP``"H"```70```KP(``!=$
+M``%_`@``%T@``6T"```73``!>@(``!=0``$]`@``%U0``/4"```76``!`@(`
+M`!=<``#Q`@``%V```14"```79```?P(``!=H``":`@``%VP``'4"```7<``!
+M30(``!=T``"A`@``%W@``$`"```7?``!/@(``!>```$Z`@``%X0``'L"```7
+MB```.@(``!>,``%1`@``%Y```.`"```7E``!,@(``!>8``#F`@``%YP``,8"
+M```7H```Y0(``!>D``%%`@``%Z@``-$"```7K```-P(``!>P``!A`@``%[0`
+M`-L"```7N``!2@(``!>\``%8`@``%\```2H"```7Q```'`(``!?(``!<`@``
+M%\P``30"```7T``!E@(``!?4``!(`@``%]@``)P"```7W``!9`(``!?@``#7
+M`@``%^0``0<"```7Z```'@(``!?L``#^`@``%_```#@"```7]``!`P(``!?X
+M``#N`@``%_P``(\"```8````)P(``!@$``!0`@``&`@``)0"```8#```W@(`
+M`!@0``#.`@``&!0``5H"```8&```S0(``!@<``%5`@``&"```9("```8)```
+M!P(``!@H``"D`@``&"P``'("```8,```;`(``!@T``#R`@``&#@``/8"```8
+M/``!"0(``!A````!`@``&$0``3`"```82``!3`(``!A0``#&`@``&%0``.4"
+M```86``!10(``!A<``#1`@``&&```#<"```89````0(``#8<``!;`@``-B``
+M`(("```V)``!=P(``#8H``!M`@``-BP``$0"```V,```V@(``#8T``"Z`@``
+M-C@``1\"```V/```K0(``#9```!3`@``-D0``)\"```V2```5@(``#9,``$&
+M`@``-E```6("```V5```C`(``#98``$!`@``-EP``.@"```V8``!G`(``#9D
+M``&0`@``-F@``+P"```V;```?@(``#9P``$G`@``-G0``"@"```V>``!80(`
+M`#9\``%6`@``-H```(@"```VA``!90(``#:(``!?`@``-HP``4,"```VD``!
+M!`(``#:4``#_`@``-I@``!("```VG``!<`(``#:@``!\`@``-J0``.,"```V
+MJ``!=0(``#:L``#<`@``-K```)@"```VM``!-0(``#:X``#\`@``-KP``!`"
+M```VP```G@(``#;$```)`@``-L@``)D"```VS``!0@(``#;0``"R`@``-M0`
+M`.L"```VV```/P(``#;<``$B`@``-N```*4"```VY```LP(``#;H``$:`@``
+M-NP``$T"```V\``!1@(``#;T``%4`@``-O@``1<"```V_``!F`(``#<```!)
+M`@``-P0``,D"```W"```J@(``#<,``&&`@``-Q```$P"```W%```D`(``#<8
+M``&*`@``-QP``*D"```W(```SP(``#<D``!"`@``-R@``$L"```W+```+0(`
+M`#<P``!!`@``-S0``#L"```W.```[0(``#<\``!&`@``-T```($"```W1```
+M-`(``#=(```S`@``-TP``!@"```W4```=`(``#=4``#Z`@``-U@``&\"```W
+M7``!*0(``#=@``&%`@``-V0``-,"```W:``!50(``#=L``"3`@``-W```9,"
+M```W=``!$P(``#=X``#4`@``-WP``","```W@``!>`(``#>$``!P`@``-X@`
+M`-@"```WC```R`(``#>0``#O`@``-Y0``8X"```WG``!&@(``#>@``!-`@``
+M-Z0``48"```WJ``!5`(``#>L``$7`@``-[```9D"```WN````0(````,```#
+M`@```!````,"````%````P(````8```#`@```!P```,"````(````P(````D
+,```#`@```"@```,"
+`
+end
diff --git a/sys/contrib/dev/ath/public/xscale-be-elf.inc b/sys/contrib/dev/ath/public/xscale-be-elf.inc
new file mode 100644
index 0000000..450d1d5
--- /dev/null
+++ b/sys/contrib/dev/ath/public/xscale-be-elf.inc
@@ -0,0 +1,81 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/xscale-be-elf.inc#3 $
+#
+
+#
+# Compilation configuration for building big-endian XScale/arm-elf.
+#
+# NB: built with AH_REGOPS_FUNC to so that register accesses
+# can be done using the Linux readl/writel functions on
+# systems that need it.
+#
+# Reported to work on:
+# IXP425
+#
+
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=arm-elf
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/arm-elf-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EB
+COPTS+= -DAH_BYTE_ORDER=AH_BIG_ENDIAN
+COPTS+= -march=armv4 -mbig-endian -fno-strict-aliasing -fno-common -mapcs-32 \
+ -mtune=xscale -mshort-load-bytes
diff --git a/sys/contrib/dev/ath/public/xscale-be-elf.opt_ah.h b/sys/contrib/dev/ath/public/xscale-be-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/xscale-be-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/public/xscale-le-elf.hal.o.uu b/sys/contrib/dev/ath/public/xscale-le-elf.hal.o.uu
new file mode 100644
index 0000000..7d84cfd
--- /dev/null
+++ b/sys/contrib/dev/ath/public/xscale-le-elf.hal.o.uu
@@ -0,0 +1,5443 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting, Atheros
+ * Communications, Inc. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms are permitted
+ * provided that the following conditions are met:
+ * 1. The materials contained herein are unmodified and are used
+ * unmodified.
+ * 2. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following NO
+ * ''WARRANTY'' disclaimer below (''Disclaimer''), without
+ * modification.
+ * 3. Redistributions in binary form must reproduce at minimum a
+ * disclaimer similar to the Disclaimer below and any redistribution
+ * must be conditioned upon including a substantially similar
+ * Disclaimer requirement for further binary redistribution.
+ * 4. Neither the names of the above-listed copyright holders nor the
+ * names of any contributors may be used to endorse or promote
+ * product derived from this software without specific prior written
+ * permission.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ''AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT,
+ * MERCHANTIBILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE
+ * FOR SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
+ * USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
+ * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
+ * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/public/xscale-le-elf.hal.o.uu#6 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
+begin 644 hal.o
+M?T5,1@$!`6$```````````$`*``!```````````````PX`(```0``#0`````
+M`"@`#0`*```(H.$@"*#A6`!0XQ0!GP4.\*`!&P``RAL`4.,1``#*&@!0XT0`
+M`*H2`%#C#P``RA$`4.,^``"J!P!0XSP```I&``#J$P!0XRD``.I2`%#C0```
+M"A@``,H<`%#CR`"?!0[PH`%&``#J5P!0XT````I&``#JM#"?Y0,`4.$\```*
+M*P``RI$`4..D`)\%#O"@`2<``,J&,$#B`0!3XT8``(I"``#JC#"?Y0,`4.%$
+M```*1@``ZH`PG^4#`%#A1```"C,``,IT,)_E`P!0X3X```I&``#J:#"?Y0,`
+M4.%D`)\%#O"@`6`PG^4#`%#A7`"?!0[PH`%&``#J5`"?Y0[PH.%0`)_E#O"@
+MX4P`G^4.\*#A2`"?Y0[PH.%$`)_E#O"@X0``H.,.\*#A1````%@````'$0``
+M;````!00```3$0``$A$``!/P``"`````&_$``)0```"H````N````,@```#<
+M````\`````W`H.$`V"WI!+!,X@`(H.$@"*#A`1B@X2$8H.$L()_E+#"?Y0(`
+M4.$#`%`19P``"B`PG^4#`%#A:@``&@$`H.'^___K`*@;Z0``H.,`J!OI)Z<`
+M`(P6``"W$```#<"@X0#8+>D$L$SB!-!-X@/`H.$$X)OE``B@X2`(H.$X,9_E
+M`P!0X:D```J(``#*$@!0XX(``,H1`%#CI0``J@<`4..I```*K0``ZA,`4..A
+M```*&C!`X@(`4^.M``"*H```ZO@PG^4#`%#AH0``"I4``,KL,)_E`P!0X:D`
+M``KD,)_5G@``VN`PG^4#`%#AI0``"JT``.K4,)_E`P!0X:4```K,,)_%G@``
+MRL@PG^4#`%#AH0``"JT``.H#`%#AK0``&A,`H.,`X(WE##"@X?[__^NP``#J
+M`."-Y0PPH.'^___KL```Z@#@C>4,,*#A_O__Z[```.H``*#C`3"@XP`PCN4`
+M`%#CQ@``"G(_H..S,)#AN##`X6`PG^6S,)#ANC#`X<PQD.4<,(#E'3Z@X[,P
+MD.&P,L#A1#"?Y;,PD.&R,L#A=3^@X[,PD.&T,L#A,#"?Y;,PD.&V,L#A`*@;
+MZ0<"```3$0``!Q$``!00```2$0``&_$``!G_```3\```R@$``-(!``#6`0``
+MV!&`Y0$`H.,.\*#A#<"@X?#9+>D$L$SB`("@X0%PH.$"8*#A`U"@X0!`H.,(
+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
+M$)?G`0!QXP4`H!'^__\;'#&?Y0,0E^<!`''C!0"@$?[__QOX(97E``!2XZ\?
+M``H%`*#AE!"?Y?[__^O<H87E`0"@X_"O&^D$$)OE`#"1Y0``4^,`(($5``"@
+MX_"O&^D00```)!$``"41```F$0``)Q$``"@1```I$0``!(```"00``!($0``
+M21$``$H1``!+$0``"(```$P1``!-$0``#(```"P1```,0```&(````@2``!(
+M@```4(```%2```!8@```7(```&"```!D@```:(```"B````L@```;(```#"`
+M```T@```.(```!`1```HF```>1```'H0``![$```-)@``$28``!T$```2)@`
+M`&28``!X$```$)D``!R8``!@F```4!```"2````,$@``$!(``!02```-P*#A
+M<-@MZ02P3.(`8*#A`4"@X0!0H.&@$)_E_O__ZP`XH.$C"*#A"`!4XP3QGY<=
+M(`#J+(```$R```!\@```?(```'R```!\@```&(```'R```!@@```9#"?Y0,@
+MEN<"((#A42B"XPT@`.I0,)_E`R"6YP(@@.%2*(+C!@"@X3@0G^7^___K<*@;
+MZ3`PG^4#();G`B"`X04G@N,-(`#J'#"?Y0,@EN<"((#A`2:"XP8`H.$$$)_E
+M_O__ZW"H&^D$@```!!(```W`H.$`V"WI!+!,XMP1D.7N'P#K`*@;Z0W`H.$`
+MV"WI!+!,X@@0H.,*(*#C("$`ZP"H&^D-P*#A$-@MZ02P3.(`0*#A`!"@XP$@
+MH./^___K``!0XT4@``H$`*#A#Q"@XS`@G^4@(0#K``!0XT4@``KZ#Z#C_O__
+MZP0`H.$?$*#C$""?Y2`A`.L,`)_E_O__ZP$`H.,0J!OI($X``#0(```-P*#A
+M,-@MZ02P3.(`4*#A`4"@X0`0H.,!(*#C_O__ZP``4.-U(``*`""@XP(`5.%8
+M(``*LC#4X1``$^,!(*`3!0"@X6P0G^7^___K!0"@X0\0H.-@()_E("$`ZP``
+M4.-U(``*^@^@X_[__^L%`*#A'Q"@XT`@G^4@(0#K``!0XW4@``HT`)_E_O__
+MZP4`H.$`$*#C`2"@X_[__^L``%#C=2``"@4`H.$`$*#C"B"@XR`A`.LPJ!OI
+M!)@``"!.```T"```#<"@X?#?+>D$L$SB!-!-X@!PH.$L$`OE`I"@X?[__^L`
+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
+M`%+A/3$`&K(PU^&``!/C/3$`"@8`H.$8$Y_E&".?Y?[__^L&`*#A$!.?Y0$@
+MH./^___K!@"@X003G^7^___K``F@X2`)H.&R,-?A(``3XP`QH!'L(I\5DA.#
+M$","H!'D,I\%D".#`*,!H`%D`(#B_O__ZP8`H.'0$I_E_O__ZP$@@.,&`*#A
+MP!*?Y?[__^L&`*#AM!*?Y0$@H.,`,*#C_O__ZP8`H.%D$!OE_O__ZP``4.-H
+M,0`:LC#7X2``$^,",(,#LC#'`0,@H./7,0#J?#*?Y0,PFN<``%/C<S$`"@8`
+MH.%L$I_E'RJ@X_[__^L!(*#C8#*?Y0,@BN<`0*#C`5"@XP01H.$!&H'B%22@
+MX08`H.'^___K`4"$X@D`5.-U,0#:`$"@XP8`H.$$$*#A_O__ZP%`A.()`%3C
+M?C$`V@8`H.&D$*#C$"*?Y?[__^L&`*#AJ!"@XP$@H./^___K!@"@X:P0H.,!
+M(*#C_O__ZP8`H.'H$9_E_O__ZP`@H.$&`*#AV!&?Y?[__^L&`*#AH!"@X\PA
+MG^7^___KR$&?Y<`QG^4$,(KG!@"@X:P0H./^___K!RB`XP8`H.&L$*#C_O__
+MZU0P&^4&`%/CLC$`&@8`H.&@$*#C_O__ZP$J@.,&`*#AH!"@X_[__^L$,)KG
+M`3J#XP0PBN=P,9_E`S"6YP``4^,&`*`1_O__&P8`H.%<$9_E_O__ZP8EP.,&
+M`*#A3!&?Y?[__^M(,9_E`Q":YP$`<>,&`*`1_O__&S@QG^4#$)KG`0!QXP8`
+MH!'^__\;*#&?Y0,0FN<!`''C!@"@$?[__QOX(9;E``!2X],Q``H&`*#A<!"?
+MY?[__^M4$!OEW!&&Y0$`H./PKQOI!!";Y0`PD>4``%/C`""!%0``H./PKQOI
+M3(```%"```!8@```!(```!!````40```&$```'`0``!L$0``<!$``&X1``!R
+M$0``_$```&`G``!T+P``'"H``!R```!XF```2(```(PJ``"-*@``CBH``(\J
+M``"0*@``D2H``)(J``"3*@``E"H``)4J```(@```EBH``)<J```,@```&(``
+M`#`M``!$F0``&_$```C8```"!0``')@``!29``"CBRZZS<S,S&"8```0+0``
+M()D``!0M```!``$`L!```&4)"`"8*@``4!```""````T+0``."T``#PM```-
+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
+M`%\`9`````H`%``>`"@`,@`\`$8`4`!:`&0`!``&``D`#`#"````Q````,4`
+M``#0````V@```.0```#"````PP```-0```#R````#0$``"@!``#/````R@``
+M``(`4"$!`$`!!`"@``@`P``@`-``0`!0`20!F!D`)A`&````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````)!=````````````````````
+M`````````````````````````+A=````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````________````F```1P````B8````````#)@``*:.A`D0F````.`R/128
+M``!K!P``')@````````@F`````("`B28```.#@``*)@```$"`@HLF```_&\#
+M`#"8````````-)@```X.```XF```!P```#R8`````0(`0)@`````8XE$F```
+MG!9R$TB8```SMA@`3)@``#QAA!)0F```X+CH#528``!92`<`6)@``+J^@'Y<
+MF```7F8Z,6"8```('0``9)@```#.`0!HF```D$&:0'"8```/````=)@``(``
+M``!XF```!`````"9````````!)D````````(F0````````R9`````(``$)D`
+M``,`````FP````````2;```@````")L``!`````,FP``,````!";```(````
+M%)L``"@````8FP``*````!R;```$````()L``"0````DFP``%````"B;```T
+M````+)L```P````PFP``+````#2;```"````.)L``"(````\FP``$@```$";
+M```R````1)L```H```!(FP``*@```$R;```!````4)L``"$```!4FP``$0``
+M`%B;```Q````7)L```D```!@FP``*0```&2;```%````:)L``"4```!LFP``
+M%0```'";```U````=)L```T```!XFP``+0```'R;```#````@)L``",```"$
+MFP``$P```(B;```S````C)L```L```"0FP``*P```)2;```'````F)L``"<`
+M``"<FP``%P```*";```W````I)L```\```"HFP``+P```*R;```O````L)L`
+M`"\```"TFP``+P```+B;```O````O)L``"\```#`FP``+P```,2;```O````
+MR)L``"\```#,FP``+P```-";```O````U)L``"\```#8FP``+P```-R;```O
+M````X)L``"\```#DFP``+P```.B;```O````[)L``"\```#PFP``+P```/2;
+M```O````^)L``"\```#\FP``+P````":```=````!)H``%T````(F@``G0``
+M``R:``#=````$)H``!T!```4F@``(0```!B:``!A````')H``*$````@F@``
+MX0```"2:```Q````*)H``'$````LF@``L0```#":```<````-)H``%P````X
+MF@``*0```#R:``!I````0)H``*D```!$F@``(````$B:```9````3)H``%D`
+M``!0F@``F0```%2:```P````6)H```4```!<F@``)0```&":``!E````9)H`
+M`*4```!HF@``*````&R:``!H````<)H``!\```!TF@``'@```'B:```8````
+M?)H``%@```"`F@``F````(2:```#````B)H```0```",F@``1````)":``"$
+M````E)H``!,```"8F@``$@```)R:``!2````H)H``)(```"DF@``T@```*B:
+M```K````K)H``"H```"PF@``:@```+2:``"J````N)H``!L```"\F@``&@``
+M`,":``!:````Q)H``)H```#(F@``V@```,R:```&````T)H```8```#4F@``
+M!@```-B:```&````W)H```8```#@F@``!@```.2:```&````Z)H```8```#L
+MF@``!@```/":```&````])H```8```#XF@``!@```/R:```&````U)@``"``
+M``#,F```!````,B8```&`08`G)@``&T```#`F````````-"8```4````"0D`
+M``````("!@8&!@8&`@(````#``8`"0`\````````````````````````````
+M````\````,P````````````````````*X@```"````H"```!&````0```$`8
+M!```!017&0`F$`8`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````>*$`````````````````````````````````````````````Y*$`
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````!L"8\)M`D```"````@F```5555
+M5:JJJJIF9F9FF9F9F?_______P```````"`````@````0````$````````8`
+M```&````!@`P````%0```!4````=````%0```$`0```/_"\`#_PO`!_\+P`/
+M_"\`1!````_\+P`/_"\`'_PO``_\+P!($```#_PO``_\+P`?_"\`#_PO`$P0
+M```/_"\`#_PO`!_\+P`/_"\`4!````_\+P`/_"\`'_PO``_\+P!4$```#_PO
+M``_\+P`?_"\`#_PO`%@0```/_"\`#_PO`!_\+P`/_"\`7!````_\+P`/_"\`
+M'_PO``_\+P!@$```#_PO``_\+P`?_"\`#_PO`&00```/_"\`#_PO`!_\+P`/
+M_"\`<!```&@!``#@`0``N`$``&@!```P$```,`(``.`!``"P````,`(``+`0
+M``"8#0``@!$``$@?``"8#0``\!```."@``!H0`$`@%@``."@```4@`````0`
+M!``(``@`,``@``0`!!R```"GCXT.SX^-#I6/8`&GCXT.!)@````````#````
+M```````````@F`````("`@`"`@(``@$"``("`B28```.#@``#@X```<'```.
+M#@``*)@```$``@H!``(*```!!0$``@HTF```#@X```X.```.#@``#@X``#B8
+M```'````!P````L````+````1)@``)P6<A.E%G(3J!9R$YP6<A-(F```9[H8
+M`&>Z&`!INA@`:;H8`%"8``#@M"@,X+0H#."T*`S@M"@,6)@``"X-@'XN#8!^
+M+@W`?BX-@'Y<F```7ETW,5Y=-S%>73HQ7ETW,6"8```0O0``$+T``#B]```0
+MO0``9)@```#.`0``S@$``,X!``#.`0`4F0``$"<``!`G``!\%0``$"<``!B9
+M``"0`0``D`$``(0```"0`0``1)D``"`0X&\@$.!O(`G@;R`0X&^`H0``_Q3_
+M!?\4_P7_%/\%_QG_!=28```0````%````!`````0````#``````````H````
+MG)R$A"P```!\?'Q\-`````4```!``````````$0````(````2`````@```!,
+M````$````%``````````5````!\`````"`````````0(````````"`@`````
+M```,"````````!`(````````%`@````````8"````````!P(````````(`@`
+M```````D"````````#`2````````!(`````````(@`````````R`````````
+M&(`````````D@````````"B````P````+(```/__!P`P@```____`32````Q
+M````.(`````````\@````````$"`````````1(````(```!(@````````%2`
+M````````6(`````````(F`````````R8``"3D(0M$)@```#@,GT4F```:P\`
+M`!R8````````+)@``/YO`@`PF````````#R8`````0(`0)@``'H!:B!,F```
+M/&&$$E28``!9"```:)@``)!!FD!LF```@;`,!7"8```/````=)@``(````!X
+MF```#`````"9````````!)D````````(F0````````R9`````(``$)D```$`
+M```<F0``*@D``""9````````))D```6*!0`HF0```0```"R9````````,)D`
+M```````TF0```````#B9````````/)D``#\```!`F0``!````$B9````````
+M3)D```````!0F0```````%29``!,\5!=6)D``!@```!<F0``CFI+`(2A``#_
+M!?\&B*$``/\'_P>,H0``_PC_")"A``#_"?\)E*$``/\*_PJ8H0``_PO_"YRA
+M``#_#/\,H*$``/\-_PVDH0``_P[_#ZBA``#_$O\2K*$``/\3_Q2PH0``_Q7_
+M%K2A``#_%_\9N*$``/\:_QN\H0``_QW_'L"A``#_(/\CQ*$``/\E_R?(H0``
+M_RG_+,RA``#_+_\QT*$``/\T_S?4H0``_SK_.MBA``#_.O\ZW*$``/\Z_SK@
+MH0``_SK_.N2A``#_.O\ZZ*$``/\Z_SKLH0``_SK_.O"A``#_.O\Z]*$``/\Z
+M_SKXH0``_SK_.ORA``#_.O\Z`)L````````$FP``(`````B;```0````#)L`
+M`#`````0FP``"````!2;```H````&)L```0````<FP``)````"";```4````
+M))L``#0````HFP``#````"R;```L````,)L```(````TFP``(@```#B;```2
+M````/)L``#(```!`FP``"@```$2;```J````2)L```8```!,FP``)@```%";
+M```6````5)L``#8```!8FP``#@```%R;```N````8)L```$```!DFP``(0``
+M`&B;```1````;)L``#$```!PFP``"0```'2;```I````>)L```4```!\FP``
+M)0```(";```5````A)L``#4```"(FP``#0```(R;```M````D)L```,```"4
+MFP``(P```)B;```3````G)L``#,```"@FP``"P```*2;```K````J)L``"L`
+M``"LFP``*P```+";```K````M)L``"L```"XFP``*P```+R;```K````P)L`
+M`"L```#$FP``*P```,B;```K````S)L``"L```#0FP``*P```-2;```K````
+MV)L``"L```#<FP``*P```.";```K````Y)L``"L```#HFP``*P```.R;```K
+M````\)L``"L```#TFP``*P```/B;```"````_)L``!8```#4F```(````-B8
+M``!H$&```)H``*D!````````!)H``.D!``!`````")H``"D```"`````#)H`
+M`&D```!0`0``$)H``)D!``"0`0``%)H``-D!``#0`0``&)H``!D````0````
+M')H``%D```!$````()H``)D```"$````))H``*4!``!(`0``*)H``.4!``"(
+M`0``+)H``"4```#(`0``,)H``,@!```4````-)H```@```!"````.)H``$@`
+M``""````/)H``(@```!X`0``0)H``)@!``"X`0``1)H``-@!``#X`0``2)H`
+M`!@````2````3)H``%@```!2````4)H``)@```"2````5)H``*0!``!\`0``
+M6)H``.0!``"\`0``7)H``"0```#\`0``8)H``&0````*````9)H``*0```!*
+M````:)H``.0```"*````;)H```H!``!:`0``<)H``$H!``":`0``=)H``(H!
+M``#:`0``>)H``,H!```.````?)H```H```!.````@)H``$H```".````A)H`
+M`(H```!>`0``B)H``+H!``">`0``C)H``/H!``#>`0``D)H``#H````)````
+ME)H``'H```!)````F)H``(8!``")````G)H``,8!``!Y`0``H)H```8```"Y
+M`0``I)H``$8```#Y`0``J)H``(8````Y````K)H``,8```!Y````L)H``,8`
+M``"Y````M)H``,8```"]`0``N)H``,8```#]`0``O)H``,8````]````P)H`
+M`,8```!]````Q)H``,8```"]````R)H``,8```#]````S)H``,8```#]````
+MT)H``,8```#]````U)H``,8```#]````V)H``,8```#]````W)H``,8```#]
+M````X)H``,8```#]````Y)H``,8```#]````Z)H``,8```#]````[)H``,8`
+M``#]````\)H``,8```#]````])H``,8```#]````^)H``,8```#]````_)H`
+M`,8```#]`````0```$8```!@`````0```$8```!A`````0```$8```!B````
+M`0```$8```!C`````0```$8```!D`````0```$8```!E`````0```$8```!F
+M`````0```$8```!G`````0```$8```!H`````0```$8```!I`````0```$8`
+M``!J`````0```$8```!K`````0```$8```!L`````0```$8```!T`````0``
+M`$8```!T`````0```$8```!T`````0```$8```!T`````0```$8```!T````
+M`0```$8```!T`````0```$8```!T`````0```$8```!T`````0```$8```!U
+M`````0```$8```!V`````0```$8```!W`````0```$8```!X`````0```$8`
+M``!Y`````0```$8```!Z`````0```$8```![`````0```$8```!\`````0``
+M`$8```!]`````0```$8```!^`````0```$8```!_`````0```$8```"`````
+M`0```$0```!\`````0```$8```"(`````0```$8```",`````0```$8```"0
+M`````0```$8```"4`````0```$8```"8`````0```$8```"<`````0```$8`
+M``"@`````0```$8```"D`````0```$8```"H`````0```$8```"L`````0``
+M`$8```"P`````0```$8```"T``````('`)X6"P!B%@H`.A8)`!P6"`#J%0<`
+MFA4%`$H5!``#%0(`610``````0````,`!@`)`#\````)````!`````0``0`!
+M``$`!@```$9'.``````````````````$`````0`!``0```!&1S<`````````
+M`````````P`!``$``0`#````1D<V``````````````````0```````$``0``
+M`$9'-0`````````````````$``$``0````````!&1S0`````````````````
+M!`````$```#^____1D<S``````````````````,``0`!````_?___T9',@``
+M```````````````$`````````/S___]&1S$``````````````````@`!``$`
+M``#Z____1D<P````````````````````````````````````````````````
+M```````4$%09`"80!@``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````(#\````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````&P)CPFT"0@);`FT"<G____)
+M____R?___\G____"____\O____+____R____\O____3____`____P/___\#_
+M___`____NO___[+___^R____LO___[+___^P____________```%`@\`!P(/
+M``H`#P`)``\``(```""8``!55555JJJJJF9F9F:9F9F9`````"`````@````
+M0````$````````8````&````!@">%@L`8A8*`#H6"0`<%@@`ZA4'`)H5!0!*
+M%00``Q4"`%D4``"X"P$````````````&`````0````(````#````!`````4`
+M``!`$```#_PO``_\+P`?_"\`#_PO``_\+P!$$```#_PO``_\+P`?_"\`#_PO
+M``_\+P!($```#_PO``_\+P`?_"\`#_PO``_\+P!,$```#_PO``_\+P`?_"\`
+M#_PO``_\+P!0$```#_PO``_\+P`?_"\`#_PO``_\+P!4$```#_PO``_\+P`?
+M_"\`#_PO``_\+P!8$```#_PO``_\+P`?_"\`#_PO``_\+P!<$```#_PO``_\
+M+P`?_"\`#_PO``_\+P!@$```#_PO``_\+P`?_"\`#_PO``_\+P!D$```#_PO
+M``_\+P`?_"\`#_PO``_\+P`P$```,`(``.`!``"P````8`$``.`!``!P$```
+M:`$``.`!``"X`0``C`$``.`!``"P$```8`X``(`1```<'P``.#X``(`1``#P
+M$```X*```&A``0"`6```X+```&A``0`4@```Z`/H`^`&X`8@!"`$0`A`".`&
+MX`8$F`````````,```````````````,````@F`````("`@`"`@(``@$"``("
+M`@`"`@(DF```#@X```X.```'!P``#@X```X.``!$F```'!9R$R4<<A,B%W(3
+MHA9R$R4<<A-@F```$)T``!"=```8G0``&)T``!"=``!DF````,X!``#.`0``
+MS@$``,X!``#.`0!HF```D$&:0)!!FD"009I`D$&:0)!!FD`8F0``N`$``+@!
+M``"$````"`$``+@!```DF0``!8H%$`6*!1`%B@40!8H%$`6*!1`PH@``````
+M````````````"`$````````,`````````#0````%````0`````````!$````
+M"````$@````(````3````!````!0`````````%0````?``````@````````$
+M"`````````@(````````#`@````````0"````````!0(````````&`@`````
+M```<"````````"`(````````)`@```````!P$@```````#@0````````>!``
+M``````"X$````````/@0````````.!$```````!X$0```````+@1````````
+M^!$````````X$@```````'@2````````N!(```````#X$@```````#@3````
+M````>!,```````"X$P```````/@3````````.!0```````!X%````````+@4
+M````````^!0````````X%0```````'@5````````N!4```````#X%0``````
+M`#@6````````>!8```````"X%@```````/@6````````.!<```````!X%P``
+M`````+@7````````^!<````````\$````````'P0````````O!````````#\
+M$````````#P1````````?!$```````"\$0```````/P1````````/!(`````
+M``!\$@```````+P2````````_!(````````\$P```````'P3````````O!,`
+M``````#\$P```````#P4````````?!0````````$@`````````B`````````
+M#(`````````@@````````"2`````````*(```#`````L@```__\'`#"```#_
+M__\!-(```#$````X@````````#R`````````2(````````!4@````````%B`
+M````````7(```(_'#P#`@```&C""*L2```#@`=P%R(```!`G0!_,@`````#T
+M`="````<'@``U(```*JJ`@#8@```554``MR`````````X(```/_____D@```
+M__\``.B`````````[(````````#P@````````/2`````````^(````````#\
+M@```B`````"'````````!(<``(P````(AP``Y`````R'``#5`@``$(<`````
+M```4AP```````!B'``"@````'(<``,D!```@AP``+````"2'```L````*(<`
+M`#`````LAP``/````#"'```L````-(<``"P````XAP``,````#R'```\````
+M0(<```````!$AP```````$B'````````3(<```````!0AP```````%2'````
+M````6(<```````!<AP```````&"'``#5````9(<``-\```!HAP```@$``&R'
+M```Z`0``<(<``'4```!TAP``?P```'B'``"B````?(<`````````@0```@`!
+M``2!```!````"($``,`````,@0```````!"!``!H`0``%($```````#`AP``
+M``$"`\2'```$!08'R(<```@)"@O,AP``#`T.#]"'```0$1(3U(<``!05%A?8
+MAP``&!D:&]R'```<'1X?X(<````!`@/DAP``!`4&!^B'```("0H+[(<```P-
+M#@_PAP``$!$2$_2'```4%187^(<``!@9&AO\AP``'!T>'PR8```9CH2M$)@`
+M``#@*'T4F```:Y\*G!R8````````0)@``'H!:B!4F```60@```"9````````
+M!)D````````(F0````````R9`````(``$)D```$````<F0``@`P``""9````
+M`!`%*)D```$````LF0``!````#29```B(!\>.)D```T,"PH\F0``/P```$B9
+M```2LH"25)D``(CA4%U<F0``CFI+`&B9``#.`P``<)D``!6U+QEXF0```0``
+M`'R9````````$*(``#-C@``4H@``$&P0`!BB``!@0)P`(*(``,8PB`$DH@``
+M``0``"RB````````-*(``"`@("`XH@``("`@($"B```@"DDX1*(``+9[``!(
+MH@``_#__#P";````````*)L```P````XFP``$@```&2;```A````C)L``"T`
+M``"<FP``,P````$``@`"``$``0`"``$````#``8`"0`_`````P`&``D`/P``
+M``D````$````!``!``$``0````````````8```!&1S@`````````````````
+M!`````$``0````````````0```!&1S<``````````````````P`!``$``0``
+M``````````,```!&1S8`````````````````!````````0````````````$`
+M``!&1S4`````````````````!``!``$```````````````````!&1S0`````
+M````````````!`````$``````````````/[___]&1S,`````````````````
+M`P`!``$``````````````/W___]&1S(`````````````````!```````````
+M`````````/S___]&1S$``````````````````@`!``$``````````````/K_
+M__]&1S``````````````````````````````````````````````````````
+M````````````"`````$````#````````````````````!@```$9'-P``````
+M```````````"`````````````````````````$9'-@`````````````````!
+M````````````````````_?___T9'-0``````````````````````````````
+M````````^O___T9'-`````````````````````$``0``````````````^/__
+M_T9',P````````````````````$``0````$``0``````]O___T9',@``````
+M``````````````$````!``$``0``````\____T9',0``````````````````
+M``$````!``$````!````\/___T9',```````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````!_````,@```'\````H````?P```$T```!_````
+M0````!\````0````/P```#`````(````!@`````````$````"`````(````$
+M````!@````@````*````#`````X````0````,````!6````5@```%8```!6`
+M```5@```'(```*>/C1+/#X@)E0_@!*L/X!+/#X@)*)@```$``@H!``(*``$!
+M!0$``@H!``(*-)@```X.```.#@``#@X```X.```.#@``.)@```<````'````
+M"P````L````+````2)@``%K:&`!:VA@`:<H8`&G*&`!IRA@`4)@``."TZ`W@
+MM.@-X+3H#>"TZ`W@M.@-6)@``"X-@'XN#8!^+DWH?BY-Z'XN#8!^7)@``%YF
+M-S%>9C<Q7F8W,5YF-S%>83<Q;)@``(&P#`6!L`P%@;`,!8"P#`6`L`P%%)D`
+M`!`G```0)P``?!4``/@J```0)P``1)D``"`0N/<@$+CW(`VX]R`0N/<@$+CW
+M#*(``&I!+&1J02QD:D%`9&I!0&1J04!D'*(```J`@Q@*@(,8"H!S&`J`@Q@*
+M@(,8,!(````````(F````````"R8``#^+P(`/)@````!`@!,F```/&&$$C"9
+M``"#2```0)D```0```!8F0``_P```'29````````^)D``!@````$H@``````
+M``BB``"(9S[0**(``+4!```\H@``KXG($P2;```@````")L``!`````,FP``
+M,````!";```(````%)L``"@````8FP``!````!R;```D````()L``!0````D
+MFP``-````"R;```L````,)L```(````TFP``(@```#R;```R````0)L```H`
+M``!$FP``*@```$B;```&````3)L``"8```!0FP``%@```%2;```V````6)L`
+M``X```!<FP``+@```&";```!````:)L``!$```!LFP``,0```'";```)````
+M=)L``"D```!XFP``!0```'R;```E````@)L``!4```"$FP``-0```(B;```-
+M````D)L```,```"4FP``(P```)B;```3````H)L```L```"DFP``*P```*B;
+M```K````K)L``"L```"PFP``*P```+2;```K````N)L``"L```"\FP``*P``
+M`,";```K````Q)L``"L```#(FP``*P```,R;```K````T)L``"L```#4FP``
+M*P```-B;```K````W)L``"L```#@FP``*P```.2;```K````Z)L``"L```#L
+MFP``*P```/";```K````])L``"L```#XFP```@```/R;```6````G)@`````
+M````````````````````````G)@`````````````````````````````G)@`
+M````````````````````````````G)@`````````````````````````````
+MG)@`````````````````````````````G)@`````````````````````````
+M````G)@`````````````````````````````G)@`````````````````````
+M````````G)@`````````````````````````````G)@`````````````````
+M````````````G)@`````````````````````````````G)@`````.````#@`
+M```X````.````#@`G)@`````````````````````````````G)@`````````
+M````````````````````G)@`````````````P````(````"`````G)@``/D`
+M!`#Y``0`_P`$`/T`!`#]``0`U)@`````````````!`````0````$`````)H`
+M`*D!````````!)H``.D!``!`````")H``"D```"`````#)H``&D```!0`0``
+M$)H``)D!``"0`0``%)H``-D!``#0`0``&)H``!D````0````')H``%D```!$
+M````()H``)D```"$````))H``*4!``!(`0``*)H``.4!``"(`0``+)H``"4`
+M``#(`0``,)H``,@!```4````-)H```@```!"````.)H``$@```""````/)H`
+M`(@```!X`0``0)H``)@!``"X`0``1)H``-@!``#X`0``2)H``!@````2````
+M3)H``%@```!2````4)H``)@```"2````5)H``*0!``!\`0``6)H``.0!``"\
+M`0``7)H``"0```#\`0``8)H``&0````*````9)H``*0```!*````:)H``.0`
+M``"*````;)H```H!``!:`0``<)H``$H!``":`0``=)H``(H!``#:`0``>)H`
+M`,H!```.````?)H```H```!.````@)H``$H```".````A)H``(H```!>`0``
+MB)H``+H!``">`0``C)H``/H!``#>`0``D)H``#H````)````E)H``'H```!)
+M````F)H``(8!``")````G)H``,8!``!Y`0``H)H```8```"Y`0``I)H``$8`
+M``#Y`0``J)H``(8````Y````K)H``,8```!Y````L)H``,8```"Y````M)H`
+M`,8```"]`0``N)H``,8```#]`0``O)H``,8````]````P)H``,8```!]````
+MQ)H``,8```"]````R)H``,8```#]````S)H``,8```#]````T)H``,8```#]
+M````U)H``,8```#]````V)H``,8```#]````W)H``,8```#]````X)H``,8`
+M``#]````Y)H``,8```#]````Z)H``,8```#]````[)H``,8```#]````\)H`
+M`,8```#]````])H``,8```#]````^)H``,8```#]````_)H``,8```#]````
+MU)@``"````#4F```$````!0````0````$````!0```#8F```:!!@`&@08`!H
+M$&``:!!@`&@08`"<F`````````````````````````````"<F```````````
+M``````````````````"<F`````````````````````````````"<F```````
+M``````````````````````"<F`````````````````````````````"<F```
+M````$````!`````0````$````!"<F```````!`````0````$````!`````2<
+MF`````````````````````````````"<F```````````````````````````
+M``"<F`````````````````````````````"<F``````````````````*````
+M``````"<F```P``X`(``.`#``#@"P``X`,``.`"<F```!@`"``8``@`&````
+M!@`"``8``@"<F```B0```(D```")````B0```(D```"<F```H````*````"@
+M````H````*````"<F```!P`$``<`!``'``0`!P`$``<`!`#4F```&@```!H`
+M```:````&@```!H```"<F```0````$@```!`````0````$````"<F```$```
+M`!`````0````$````!````"<F```"`````@````(````"`````@```"<F```
+M3P```$\```!/````3P```$\```"<F```\0```/$```!A````\0```/$```"<
+MF```3Y```$^0``!,D```3Y```$^0``"<F```6A(``%H2``":$@``6A(``%H2
+M``#,F```#@````X````/````#@````X````!````1@```&`````!````1@``
+M`&$````!````1@```&(````!````1@```&,````!````1@```&0````!````
+M1@```&4````!````1@```&8````!````1@```&<````!````1@```&@````!
+M````1@```&D````!````1@```&H````!````1@```&L````!````1@```&P`
+M```!````1@```'0````!````1@```'0````!````1@```'0````!````1@``
+M`'0````!````1@```'0````!````1@```'0````!````1@```'0````!````
+M1@```'0````!````1@```'4````!````1@```'8````!````1@```'<````!
+M````1@```'@````!````1@```'D````!````1@```'H````!````1@```'L`
+M```!````1@```'P````!````1@```'T````!````1@```'X````!````1@``
+M`'\````!````1@```(`````!````1````'P````!````1@```(@````!````
+M1@```(P````!````1@```)`````!````1@```)0````!````1@```)@````!
+M````1@```)P````!````1@```*`````!````1@```*0````!````1@```*@`
+M```!````1@```*P````!````1@```+`````!````1@```+0```">%@8`8A8$
+M`#H6`P`<%@(`ZA4!`)H5``!*%0```Q4!`%D4`P"X"P4``````#`````5@```
+M%8```!6````5@```%8```!R```"GDXT2SQ.("943X`2K$^`2SQ.("2B8```!
+M``(*`0`""@`!`@4!``(*`0`""C28```.#@``#@X```X.```.#@``#@X``#B8
+M```'````!P````L````+````"P```$B8``!MVA@`;=H8`'7*&`!URA@`=<H8
+M`%"8``#@M.@-X+3H#>"TZ`W@M.@-X+3H#5B8```N#8!^+@V`?BX-Z'XN#>A^
+M+@V`?ER8``!>9C<Q7F8W,5YF-S%>9C<Q7F8W,6R8``"!L`P%@;`,!8&P#`6!
+ML`P%@;`,!129``#0!P``T`<``$P$``"8"```T`<``$29```@$+CW(!"X]Q`-
+MN/<0$+CW$!"X]P2B``````````````@````(````"`````BB``"(9[[6B&>^
+MUHAG/M"(9S[0B&<^T`RB``!``2QD0`$L9&#!0F1@P4)D8,%"9!RB```*@(,8
+M"H"#&`J`<Q@*@(,8"H"#&#`2````````")@````````LF```_B\"`#R8````
+M`0(`3)@``#QAA!(PF0``@D@``$"9```$````6)D``/\```!TF0```````"BB
+M``"U`0``/*(``*^)R!,$FP```0````B;```"````#)L```,````0FP``!```
+M`!2;```%````&)L```@````<FP``"0```"";```*````))L```L````LFP``
+M#0```#";```0````-)L``!$````\FP``$P```$";```4````1)L``!4```!(
+MFP``&````$R;```9````4)L``!H```!4FP``&P```%B;```<````7)L``!T`
+M``!@FP``(````&B;```B````;)L``",```!PFP``)````'2;```E````>)L`
+M`"@```!\FP``*0```(";```J````A)L``"L```"(FP``+````)";```P````
+ME)L``#$```"8FP``,@```*";```T````I)L``#4```"HFP``-0```*R;```U
+M````L)L``#4```"TFP``-0```+B;```U````O)L``#4```#`FP``-0```,2;
+M```U````R)L``#4```#,FP``-0```-";```U````U)L``#4```#8FP``-0``
+M`-R;```U````X)L``#4```#DFP``-0```.B;```U````[)L``#4```#PFP``
+M-0```/2;```U````^)L``!````#\FP``&@````":```'````!P````2:``!'
+M````1P````B:``"'````AP````R:``"@`0``H`$``!":``#@`0``X`$``!2:
+M```@````(````!B:``!@````8````!R:``"A`0``H0$``"":``#A`0``X0$`
+M`"2:```A````(0```"B:``!A````80```"R:``!B`0``8@$``#":``"B`0``
+MH@$``#2:``#B`0``X@$``#B:```B````(@```#R:``!B````8@```$":``!C
+M`0``8P$``$2:``"C`0``HP$``$B:``#C`0``XP$``$R:```C````(P```%":
+M``!C````8P```%2:``"$`0``A`$``%B:``#$`0``Q`$``%R:```$````!```
+M`&":``#J`0``"P```&2:```J````2P```&B:``!J````BP```&R:``"J````
+MK`$``'":``"K`0``[`$``'2:``#K`0``+````'B:```K````$@```'R:``!K
+M````4@```(":``"K````D@```(2:``"L`0``DP$``(B:``#L`0``TP$``(R:
+M```L````$P```)":```Z````4P```)2:``!Z````DP```)B:``"Z````E`$`
+M`)R:``"[`0``U`$``*":``#[`0``%````*2:```[````.@```*B:``![````
+M>@```*R:``"[````N@```+":``"\`0``NP$``+2:``#\`0``^P$``+B:```\
+M````.P```+R:``!\````>P```,":``"\````NP```,2:``#\````O`$``,B:
+M``#\````_`$``,R:``#\````/````-":``#\````?````-2:``#\````O```
+M`-B:``#\````_````-R:``#\````_````.":``#\````_````.2:``#\````
+M_````.B:``#\````_````.R:``#\````_````/":``#\````_````/2:``#\
+M````_````/B:``#\````_````/R:``#\````_````-28```@````T)@```@$
+M!@,(!`<#"`0&`P@$!@,(!`<#W)@``,`@H`#`(*``P"#@`,`@X`#`(.``G)@`
+M``````\````/````#P````\````/G)@`````````````````````````````
+MG)@`````@````(````"`````@````(``G)@`````*@```"H````J````*@``
+M`"H`G)@``````0````$````!`````0````$`G)@`````````````````````
+M````````G)@`````&````!@````8````&````!@`G)@`````8````&````!N
+M````;@```&X`G)@`````QP```,<```#'````QP```,<`G)@`````2P```$L`
+M``!+````2P```$L`G)@`````2`0``$@$``!(!```2`0``$@$G)@`````3```
+M`$P```!,````3````$P`G)@`````Y````.0```#D````Y````.0`G)@`````
+M````````````````````````G)@`````_````/P```#\````_````/P`G)@`
+M````_P```/\```#_````_P```/\`G)@`````/P0``#\$```_!```/P0``#\$
+MG)@`````#`````P````,````#`````P`G)@`````&0(``!D"```9`@``&0(`
+M`!D"G)@`````)````"0````D````)````"0`G)@`````M````+0```"T````
+MM````+0`G)@`````F0```)D```"9````F0```)D`G)@`````4````%````!0
+M````4````%``G)@`````*@```"H````J````*@```"H`G)@`````$@```!(`
+M```2````$@```!(`G)@`````,L```#+````RP```,L```#+`G)@`````=`$`
+M`'0!``!T`0``=`$``'0!G)@`````$0```!$````1````$0```!$`G)@`````
+M*(8``"B&```HA@``*(8``"B&G)@`````A#$``(0Q``"$,0``A#$``(0QG)@`
+M`(``\@"``/(`@`#R`(``\@"``/(`G)@``!D`)P`9`"<`&0`G`!D`)P`9`"<`
+MG)@```,````#`````P````,````#````G)@`````````````````````````
+M````G)@``+(```"R````L@```+(```"R````G)@``(0@L`"$(+``A""P`(0@
+ML`"$(+``G)@``*0E00"D)4$`I"5!`*0E00"D)4$`G)@``""2$0`@DA$`()(1
+M`""2$0`@DA$`G)@```!(&@``2!H``$@:``!(&@``2!H`V)@``#`""P`P`@L`
+M,`(+`#`""P`P`@L`G)@``)0```"4````E````)0```"4````G)@``)$```"1
+M````D0```)$```"1````G)@``!(````2````$@```!(````2````G)@``(``
+M``"`````@````(````"`````G)@``-D```#9````V0```-D```#9````G)@`
+M`&````!@````8````&````!@````G)@``/````#P````\````/````#P````
+MG)@``*(```"B````H@```*(```"B````G)@``%(```!2````4@```%(```!2
+M````G)@``-0```#4````U````-0```#4````G)@``,P4``#,%```S!0``,P4
+M``#,%```G)@``(P$``",!```C`0``(P$``",!```Q)@```,````#`````P``
+M``,````#````,````!4````5````%0```!4````5````'(```*>3C1+/$X@)
+ME1/@!*L3X!+/$X@)*)@```$``@H!``(*```"!0$``@H!``(*-)@````.````
+M#@````X````.````#@``.)@```(````"````"@````H````*````2)@``&W:
+M&`!MVA@`9&H:`&1J&@!D:AH`4)@``."TZ`W@M.@-VK#H#=JPF`S:L.@-6)@`
+M`"X-@'XN#8!^+@WH?BX-R'XN#8!^7)@``%YF-S%>9C<Q7F8W,5Y@.3%>9C<Q
+M;)@``(&P#`6!L`P%@;`,!8&P#`6!L`P%%)D``-`'``#0!P``3`0``)@(``#0
+M!P``1)D````0N/<`$+CW``VX]P`0N/<`$+CW!*(`````````````````````
+M````````"*(``(AGOM:(9[[6B&<^T(AG/M"(9S[0#*(``$`!+`!``2P`0,%"
+M`$#!0@!`P4(`'*(```J`@Q@*@(,8"H!C&`J`@Q@*@(,8,!(``.`#``!@@```
+M#P```!B!````````'($````````@@0```````"2!````````*($````````L
+M@0```````#"!````````-($````````X@0```````#R!````````0($``*@`
+M`(!$@0````````B8````````+)@```"@```\F`````0@`$R8```\(X02<)@`
+M`!\```!TF```@````'B8```.````6)D``/\```"`F0```````(29`````(`"
+MH)D```````#@F0```````.29``"JJJJJZ)D``'AD1CSLF0``J@```/"9```,
+M````])D``/\```#XF0``%````"BB``"U"0``/*(``*^)R)-,H@```0```%"B
+M````H```5*(```````!8H@``@%/'#%RB```!#P\/8*(```$/:5]DH@``$8I!
+M`&BB````````;*(``&K!,`QPH@``(`B"`'2B``"J?!L`>*(``,XYYQQ\H@``
+MS@$7!0"C``````$8!*,```(F`S`(HP``!CX'2`RC```*3`M6$*,```]@&F04
+MHP``&VY/>!BC``!:?(^&'*,``%N&SXX@HP``#Y=/G22C``"/H<^E**,``!^O
+M7[4LHP``G[G?O3"C```_QW_--*,``+_1_]4XHP```````#RC````````0*,`
+M``````!$HP```````$BC``#___\_3*,``/___S]0HP``____/U2C``#__P,`
+M6*,``!^JJ'E<HP``#T)L!F"C```'(B@/9*,``(468!=HHP``!!&`'VRC```#
+M#*`W<*,``(,(Q#]THP```PC`5WBC``""!MA??*,``(($X'^`HP``NGL\?X2C
+M``#P?S#S!)L```$````(FP```@````R;```#````$)L```0````4FP``!0``
+M`!B;```(````')L```D````@FP``"@```"2;```+````+)L```T````PFP``
+M$````#2;```1````/)L``!,```!`FP``%````$2;```5````2)L``!@```!,
+MFP``&0```%";```:````5)L``!L```!8FP``'````%R;```=````8)L``"``
+M``!HFP``(@```&R;```C````<)L``"0```!TFP``)0```'B;```H````?)L`
+M`"D```"`FP``*@```(2;```K````B)L``"P```"0FP``,````)2;```Q````
+MF)L``#(```"@FP``-````*2;```U````J)L``#4```"LFP``-0```+";```U
+M````M)L``#4```"XFP``-0```+R;```U````P)L``#4```#$FP``-0```,B;
+M```U````S)L``#4```#0FP``-0```-2;```U````V)L``#4```#<FP``-0``
+M`.";```U````Y)L``#4```#HFP``-0```.R;```U````\)L``#4```#TFP``
+M-0```/B;```0````_)L``!H`````F@`````````````$F@```````$`````(
+MF@```````(`````,F@```````($!```0F@```````,$!```4F@````````$`
+M```8F@```````$$````<F@```````($````@F@```````&@!```DF@``````
+M`*@!```HF@```````.@!```LF@```````"@````PF@```````&@````TF@``
+M`````(D!```XF@```````,D!```\F@````````D```!`F@```````$D```!$
+MF@```````(D```!(F@```````)`!``!,F@```````-`!``!0F@```````!``
+M``!4F@```````%````!8F@```````)````!<F@```````)$!``!@F@``````
+M`-$!``!DF@```````!$```!HF@```````%$```!LF@```````)$```!PF@``
+M`````'@!``!TF@```````+@!``!XF@```````/@!``!\F@```````#@```"`
+MF@```````'@```"$F@```````)D!``"(F@```````-D!``",F@```````!D`
+M``"0F@```````%D```"4F@```````)D```"8F@```````-D```"<F@``````
+M`/D```"@F@```````/D```"DF@```````/D```"HF@```````/D```"LF@``
+M`````/D```"PF@```````/D```"TF@```````/D```"XF@```````/D```"\
+MF@```````/D```#`F@```````/D```#$F@```````/D```#(F@```````/D`
+M``#,F@```````/D```#0F@```````/D```#4F@```````/D```#8F@``````
+M`/D```#<F@```````/D```#@F@```````/D```#DF@```````/D```#HF@``
+M`````/D```#LF@```````/D```#PF@```````/D```#TF@```````/D```#X
+MF@```````/D```#\F@```````/D```#4F```(````-"8```(%``""!0!`@@4
+M``((%``""!0!`MR8``#`(*``P""@`,`@X`#`(.``P"#@`)R8``````#P````
+M\````/````#P````\)R8`````````````````````````````)R8```````#
+M`````P````,````#`````YR8`````````````````````````````)R8````
+M`````````````````````````)R8`````````````````````````````)R8
+M`````````````````````````````)R8````````````````````````````
+M`)R8`````$!```!`0```0$```$!```!`0)R8``````5E```%90``!64```5E
+M```%99R8`````````````````````````````)R8````````````````````
+M`````````)R8`````$(```!"````0@```$(```!"`)R8`````+4```"U````
+MM0```+4```"U`)R8``````,````#`````P````,````#`)R8`````/<```#W
+M````]P```/<```#W`)R8`````)T```"=````G0```)T```"=`)R8`````"(`
+M```B````(@```"(````B`)R8`````"($```B!```(@0``"($```B!)R8```8
+M`",`&``C`!@`(P`8`",`&``C`)R8`````"@````H`&``*`!@`"@`8``H`)R8
+M``#``%``P`!0`,,`4`##`%``PP!0`)R8``!_``0`?P`$`'\`!`!_``0`?P`$
+M`)R8``!8!```6`0``%@$``!8!```6`0``)R8````````````````````````
+M`````)R8````P````,````#`````P````,```-B8```P`D``,`)``#`"0``P
+M`D``,`)``)R8````9````&0```!D````9````&0``)R8````"`````@````(
+M````"`````@``,R8```.````#@````X````.````#@```#`````5````%0``
+M`!4````5````%0```!R```"GDXT2SQ.("943X`2K$^`2SQ.("2B8```!``(*
+M`0`""@`!`@4!``(*`0`""C28```.#@``#@X```X.```.#@``#@X``#B8```'
+M````!P````L````+````"P```$B8``!A^A@`8?H8`&,:&@!C&AH`8QH:`%"8
+M``#@M)@,X+28#-JPF`S:L)@,VK"8#%B8```N#<A^+@W(?BX-R'XN#<A^+@W(
+M?ER8``!>8#DQ7F`Y,5Y@.3%>8#DQ7F`Y,6R8``"!L`P%@;`,!8&P#`6!L`P%
+M@;`,!129``#0!P``T`<``$P$``"8"```T`<``$29````$+CW`!"X]P`-N/<`
+M$+CW`!"X]P2B``````````````````````````````BB``"(9[[6B&>^UHAG
+M/M"(9S[0B&<^T`RB``#@P2X`X,$N`"#!*@`@P2H`(,$J`!RB```*@(,8"H"#
+M&`J`8Q@*@(,8"H"#&`"C``````$8```!&````1@```$8```!&`2C```")@,P
+M`B8#,`(F`S`")@,P`B8#,`BC```&/@=(!CX'2`8^!T@&/@=(!CX'2`RC```*
+M3`M6"DP+5@I,"U8*3`M6"DP+5A"C```/8!ID#V`:9`]@&F0/8!ID#V`:9!2C
+M```;;D]X&VY/>!MN3W@;;D]X&VY/>!BC``!:?(^&6GR/AEI\CX9:?(^&6GR/
+MAARC``!;AL^06X;/D%N&SXY;AL^.6X;/CB"C```/ET^=#Y=/G0^73YL/ET^;
+M#Y=/FR2C``"/H\^GCZ//IX^?SZ./G\^CCY_/HRBC```?KU^U'Z]?M1^O7[,?
+MKU^S'Z]?LRRC``"?N=^]G[G?O9^YW[N?N=^[G[G?NS"C```_Q7_+/\5_RS_'
+M?\L_QW_+/\=_RS2C``"_T?_5O]'_U;_1_]._T?_3O]'_TS`2``#@`P``:$``
+M`!````!@@```#P```)R`````````H(`````````8@0```````!R!````````
+M(($````````D@0```````"B!````````+($````````P@0```````#2!````
+M````.($````````\@0```````$"!``#Y`P"`1($````````(F````````"R8
+M````H```/)@````$(`!,F```/".$$G"8```?````=)@``(````!XF```#@``
+M`%B9``#_'P@`@)D```````"$F0````"``J"9````````X)D```````#DF0``
+MJJJJJNB9``!X9$8\[)D``*H```#PF0``#````/29``#_````^)D``!0````H
+MH@``M0D``#RB``"OB<B33*(```$```!0H@```*```%2B````````6*(``(!3
+MQPQ<H@```0\/#V"B```!#VE?9*(``!&*00!HH@```````&RB``!JP3`,<*(`
+M`"`(@@!TH@``JGP;"'BB``#..><<?*(``,X!%P4XHP```````#RC````````
+M0*,```````!$HP```````$BC``#___\_3*,``/___S]0HP``____/U2C``#_
+M_P,`6*,``!^JJ'E<HP``#T)L!F"C```'(B@/9*,``(468!=HHP``!!&`'VRC
+M```##*`W<*,``(,(Q#]THP```PC`5WBC``""!MA??*,``(($X'^`HP``NGL\
+M?X2C``#P?S#S!)L```$````(FP```@````R;```#````$)L```0````4FP``
+M!0```!B;```(````')L```D````@FP``"@```"2;```+````+)L```T````P
+MFP``$````#2;```1````/)L``!,```!`FP``%````$2;```5````2)L``!@`
+M``!,FP``&0```%";```:````5)L``!L```!8FP``'````%R;```=````8)L`
+M`"````!HFP``(@```&R;```C````<)L``"0```!TFP``)0```'B;```H````
+M?)L``"D```"`FP``*@```(2;```K````B)L``"P```"0FP``,````)2;```Q
+M````F)L``#(```"@FP``-````*2;```U````J)L``#4```"LFP``-0```+";
+M```U````M)L``#4```"XFP``-0```+R;```U````P)L``#4```#$FP``-0``
+M`,B;```U````S)L``#4```#0FP``-0```-2;```U````V)L``#4```#<FP``
+M-0```.";```U````Y)L``#4```#HFP``-0```.R;```U````\)L``#4```#T
+MFP``-0```/B;```0````_)L``!H`````F@`````````````$F@``0````$``
+M```(F@``@````(`````,F@``H0$``&$!```0F@``X0$``*$!```4F@``(0``
+M`.$!```8F@``80```"$````<F@``B`$``&$````@F@``R`$``(@!```DF@``
+M"````,@!```HF@``2`````@````LF@``B````$@````PF@``J0$``(@````T
+MF@``Z0$``&D!```XF@``*0```*D!```\F@``:0```.D!``!`F@``T`$``"D`
+M``!$F@``$````&D```!(F@``4````)`!``!,F@``D````-`!``!0F@``L0$`
+M`!````!4F@``\0$``%````!8F@``,0```)````!<F@``<0```'$!``!@F@``
+MN`$``+$!``!DF@``^`$``/$!``!HF@``.````#$```!LF@``>````'$```!P
+MF@``F0$``)@!``!TF@``V0$``-@!``!XF@``&0```!@```!\F@``60```%@`
+M``"`F@``F0```)@```"$F@``V0```'D!``"(F@``^0```+D!``",F@``^0``
+M`/D!``"0F@``^0```#D```"4F@``^0```'D```"8F@``^0```+D```"<F@``
+M^0```/D```"@F@``^0```/D```"DF@``^0```/D```"HF@``^0```/D```"L
+MF@``^0```/D```"PF@``^0```/D```"TF@``^0```/D```"XF@``^0```/D`
+M``"\F@``^0```/D```#`F@``^0```/D```#$F@``^0```/D```#(F@``^0``
+M`/D```#,F@``^0```/D```#0F@``^0```/D```#4F@``^0```/D```#8F@``
+M^0```/D```#<F@``^0```/D```#@F@``^0```/D```#DF@``^0```/D```#H
+MF@``^0```/D```#LF@``^0```/D```#PF@``^0```/D```#TF@``^0```/D`
+M``#XF@``^0```/D```#\F@``^0```/D```#4F```(````-"8```(````"```
+M``@````(````"````-R8``#``*``P`"@`,``X`#``.``P`#@`)R8```````S
+M````,P```#,````S````,YR8```````!`````0````$````!`````9R8````
+M`````````````````````````)R8`````````````````````````````)R8
+M`````````````````````````````)R8```````?````'P```!\````?````
+M'YR8`````````````````````````````)R8`````+@```"X````N````+@`
+M``"X`)R8`````+<```"W````MP```+<```"W`)R8`````(0```"$````A```
+M`(0```"$`)R8`````)@```"8````F````)@```"8`)R8`````,````#`````
+MP````,````#``)R8`````/\```#_````_P```/\```#_`)R8`````/\```#_
+M````_P```/\```#_`)R8`````/\```#_````_P```/\```#_`)R8`````/\`
+M``#_````_P```/\```#_`)R8`````-<```#7````UP```-<```#7`)R8````
+M`&$```!A````80```&$```!A`)R8`````/X```#^````_@```/X```#^`)R8
+M`````-X```#>````W@```-X```#>`)R8`````'\```!_````?P```'\```!_
+M`)R8`````#T$```]!```/00``#T$```]!)R8`````'<```!W````=P```'<`
+M``!W`)R8`````$0```!$````1````$0```!$`)R8`````)@```"8````F```
+M`)@```"8`)R8``"``!``@``0`(``$`"``!``@``0`)R8```TP`4`-,`%`#3`
+M!0`TP`4`-,`%`)R8``#P`#$`\``Q`/``,0#P`#$`\``Q`)R8```?`0P`'P$,
+M`!\!#``?`0P`'P$,`)R8``!``%$`0`!1`$``40!``%$`0`!1`)R8``#:`%``
+MV@!0`-H`4`#:`%``V@!0`)R8`````````````````````````````)R8``!$
+M0```1$```$1```!$0```1$```)R8`````````````````````````````)R8
+M``#`8```P&```,!@``#`8```P&```)R8````+````"P````V````-@```"P`
+M`,B8```#!````P0```,$```#!````P0``)R8````9````&0```!D````9```
+M`&0``)R8````"`````@````(````"`````@``,R8```.````#@````X````.
+M````#@```$%2-3(Q,```05(U,C$Q``!!4C4R,3(``%)&-3$Q,0``4D8U,3$R
+M``!21C(T,3,``%)&-30Q,P``4D5'3U!37T953D,`071H97)O<R`R,S$S(%=I
+M4V]#``!!=&AE<F]S(#4T,C0O,C0R-````$%T:&5R;W,@,C,Q-R!7:5-O0P``
+M071H97)O<R`U,C$R("A&4$=!*0!!=&AE<F]S(#4R,3$@*$901T$I`$%T:&5R
+M;W,@-3(Q,`````!!=&AE<F]S(#4R,3$`````071H97)O<R`U,S$R(%=I4V]#
+M``!!=&AE<F]S(#(S,34@5VE3;T,``$%T:&5R;W,@-3(Q,@`````P+CDN,C`N
+M,P``````````"````!`````8````(````"@````P````.````````````/\!
+M_P$`````````````_________W\``````P"8`9D!`````````````/______
+M__]_``````<`F`$P"P````````````#_________?P`````(`)@!,`P`````
+M````````_________W\`````(``@`1`*`````````````/________]_````
+M`"$`(`&9`0````````````#_________?P`````B`"`!,`P`````````````
+M_________W\`````.@!@`1`*`````````````/________]_`````#L`8`&9
+M`0````````````#_________?P`````2`&4!$`H```,`````````________
+M_W\`````-P`P`9D!```#`````````/________]_`````#4`,`*9`0```P``
+M``````#_________?P`````V`#`#F0$```,`````````_________W\`````
+M,``P!)D!```#`````````/________]_`````#D`,`69`0```P````````#_
+M________?P`````T`#`&F0$```,`````````_________W\`````,@`P`YD!
+M```#`````````/________]_`````#$`,`.9`0````````````#_________
+M?P`````1`!`!F0$`````````````_________W\`````$``0`1`*````````
+M`````/________]_`````%(`4`&9`0````````````#_________?P````!%
+M`%`"F0$`````````````_________W\`````1P!0`YD!`````````````/__
+M______]_`````$(`4`29`0````````````#_________?P````!8`%`%F0$`
+M````````````_________W\`````6P!0!ID!`````````````/________]_
+M`````%T`4`B9`0````````````#_________?P````!>`%`)F0$`````````
+M````_________W\`````4`!0`Q`*`````````````/________]_`````%4`
+M4`$P#`````````````#_________?P````!6`%`",`P`````````````____
+M_____W\`````20!0`E`-`````````````/________]_`````$``0`%`"@``
+M1@````0````H`````````(@!``!!`$`!0`H``$<````$````:`````````")
+M`0``2`!``1`*``!&````!`````@`````````B@$``$H`0`%`"@``1@````0`
+M```(&````````(P!``!+`$`!0`H``$8````$````"&````````"-`0``3`!`
+M`5`*``!&````!`````@`````````CP$``$,`0`)`"@``1P````0```!P````
+M`````(L!``#P`$`#0`H``$8````$````(```````````````@`!``T`*``!'
+M````!````&``````````IP\``/$`0`-`"@``1@````0`````&```````````
+M``"!`$`#0`H``$8````$`````&````````"H#P``@@!``U`*``!&````!```
+M````````````J0\``/(`0`,0"@``1@````0```````````````````"#`$`$
+M0`H``$<````$````8(````````"J#P``]`!`!$`*``!&````!`````"8````
+M`````````(0`0`1`"@``1@````0`````X````````*L/``"%`$`$4`H``$8`
+M```$`````(````````"L#P``]0!`!!`*``!&````!`````"`````````````
+M`(8`0`5`"@``1P````0```!@@````````*T/``"'`$`%0`H``$8````$````
+M`.````````"N#P``B`!`!5`*``!&````!`````"`````````KP\``(D`0`9`
+M"@``1P````0```!H`````````+`/``"*`$`&0`H``$8````$````"&``````
+M``"Q#P``BP!`!E`*``!&````!`````@`````````L@\``(P`0`=`"@``1P``
+M``0```!H@````````+,/``"-`$`'0`H``$8````$````".````````"T#P``
+MC@!`!U`*``!&````!`````B`````````M0\``(\`0`A`"@``1P````0```!H
+M@````````+8/``"0`$`(0`H``$8````$````".````````"W#P``D0!`"%`*
+M``!&````!`````B`````````N`\``/8`0`E`"@``1P````0```!@@```````
+M``````#W`$`+0`H``$<````$````8(``````````````8`!@`&``````````
+M`````/________]_`````&$`80!A`````P````````#_________?P````!B
+M`&(`8@````(`````````_________W\`````8P!C`&,``````````````/__
+M______]_`````&0`9`!D`````P````````#_________?P````!E`&4`90``
+M``,`````````_________W\`````9@!F`&8``````````````/________]_
+M`````&<`9P!G``````````````#_________?P````!H`&@`:```````````
+M````_________W\`````:0!I`&D````#`````````/________]_`````&H`
+M:@!J`````P````````#_________?P````!E`````0```/____^`````____
+M_P````!*4```M`\`````````````:@````$```#_____@````/____\`````
+M2E```+0/`````````````/\!```!`````0````$```!8&P`````0``$````!
+M`````0```%@;```(``,``0`````````!````6!L```P``P`!``````````$`
+M``!8&P``(`!'`````````````````%@;```S`#```0`````````!````6!L`
+M`"0`(0`!`````0````$```!8&P``*``W``$``````````0```%@;```?`#``
+M`0````$````!````6!L``#``6P`!``````````$```!8&P``<``#``$`````
+M`````0```%@;```X`#<``0`````````!````6!L``%0`50`!`````0````$`
+M``!8&P``1`!5``$````!`````0```%@;``!,`#L``0``````````````6!L`
+M`&``4@`!`````0````$```!8&P``9``T``$``````````0```%@;``!\`"``
+M`0````$````!````6!L``)@`6P`!`````0````$```!8&P``G`!2``$````!
+M`````0```%@;``"J`!```0`````````!````6!L``+P``P`!``````````$`
+M``!8&P``OP`V``$``````````0```%@;``#$`#<``0````$````!````6!L`
+M`,L`-P`!``````````$```!8&P``T``W``$``````````0```%@;``#6`!``
+M`0````$````!````6!L``-H``P````````````````!8&P``,@,V``$`````
+M`````0```%@;``#>``,``0`````````!````6!L``.D`-P`!``````````$`
+M``!8&P``]@`W``$``````````0```%@;``#Z`#<``0`````````!````6!L`
+M`/\`-@`!``````````$```!8&P``#`$P``$````!`````0```%@;```4`3<`
+M`0`````````!````6!L``"P!-P`!``````````$```!8&P``0`$0``$````!
+M`````0```%@;``!4`0,``0`````````!````6!L``%@!(0`!`````0````$`
+M``!8&P``7`$W``$``````````0```%@;``!@`3<``0`````````!````6!L`
+M`&0!6P`!``````````$```!8&P``:`%2``$``````````0```%@;``!L`5(`
+M`0````$````!````6!L``'0!-P`!``````````$```!8&P``>`$#``$`````
+M`````0```%@;``!\`3<``0`````````!````6!L``(@!0``!````````````
+M``!8&P``B0%!``$``````````````%@;``"*`4@``0``````````````6!L`
+M`(L!0P`!``````````````!8&P``C`%*``$``````````````%@;``"-`4L`
+M`0``````````````6!L``(\!3``!``````````````!8&P``IP^```$`````
+M`````````%@;``"H#X$``0``````````````6!L``*D/@@`!````````````
+M``!8&P``J@^#``$``````````````%@;``"K#X0``0``````````````6!L`
+M`*P/A0`!``````````````!8&P``K0^&``$``````````````%@;``"N#X<`
+M`0``````````````6!L``*\/B``!``````````````!8&P``L`^)``$`````
+M`````````%@;``"Q#XH``0``````````````6!L``+(/BP`!````````````
+M``!8&P``LP^,``$``````````````%@;``"T#XT``0``````````````6!L`
+M`+4/C@`!``````````````!8&P``M@^/``$``````````````%@;``"W#Y``
+M`0``````````````6!L``+@/D0`!``````````````!8&P``D`%"``$`````
+M`````0```%@;``".`0,``0`````````!````6!L``)@!10`!`````0````$`
+M``!8&P``F@%%``$``````````````%@;``";`44``0``````````````6!L`
+M`)P!7@`!``````````````!8&P``G@$#``$``````````0```%@;``"L`3<`
+M`0`````````!````6!L``*8!`P`!``````````$```!8&P``M@$W``$`````
+M`````0```%@;``"X`3<``0`````````!````6!L``+H!-P`!``````````$`
+M``!8&P``O@$A``$````!`````0```%@;```G`P,``0`````````!````6!L`
+M`,H!70`!``````````````!8&P``U@$W``$``````````0```%@;``#D`1``
+M`0````$````!````6!L``.P!,``!`````0````$```!8&P``^`$#``$`````
+M`````0```%@;```0`C<``0`````````!````6!L``"H"(@`!``````````$`
+M``!8&P``0@(W``$``````````0```%@;`````EL``0`````````!````6!L`
+M`$H"`P`!``````````$```!8&P``3P(0``$````!`````0```%@;``!<`E(`
+M`0`````````!````6!L``&`".P`!`````0````$```!8&P``:`(W``$`````
+M`````0```%@;``!L`C<``0`````````!````6!L``'8"$``!`````0````$`
+M``!8&P``>@(#``$``````````0```%@;``""`@,``0`````````!````6!L`
+M`(,"`P`!``````````$```!8&P``J@(A``$``````````0```%@;``"^`EL`
+M`0````$````!````6!L``+\"-P`!``````````$```!8&P``P0(W``$`````
+M`````0```%@;``#&`CL``0`````````!````6!L``-0"-P`!``````````$`
+M``!8&P``\`(W``$``````````0```%@;``#T`C<``0`````````!````6!L`
+M`/@"`P`!``````````$```!8&P``G@!0``$````!`````0```%@;``#\`@,`
+M`0`````````!````6!L```P#,``!``````````$```!8&P``%`,V``$`````
+M`````0```%@;```8`S8``0`````````!````6!L``"0#`P`!``````````$`
+M``!8&P``$`,#``$``````````0```%@;```Z`S<``0`````````!````6!L`
+M`$@#$``!`````0````$```#!%@``2@,2``$````!`````0```%@;``!:`Q$`
+M`0`````````!````6!L``%P#.@`!`````0````$```!8&P``7@-6``$`````
+M`````0```%@;``#``@,``0`````````!````6!L``'<#`P`!``````````$`
+M``!8&P``S`(#``$``````````0```%@;```S$ST3%P`*!0``````````$```
+M```````0````1Q-1$Q<`"@4``````````!``````````$````#@3=!,7`!04
+M```````````0``````````<```!.$WL3&P8%!0```````````0``````````
+M````41-Y$QX&"@4```````````$``````````````%83=!,A!A0%````````
+M```!``````````````"K$[`3%P`*!0``````````$``````````,````L!/8
+M$Q<`%!0``````````!```````````@```+\3OQ,7``H%```````````0````
+M``````P`````%'@4!084%```````````````````````````,A1N%!<`%!0`
+M`````````!@``````````0```#(4;A04`!04```````````8``````````$`
+M```\%'@4#P`4%```````````!0``````````````/!1X%!$&%!0`````````
+M``$``````````0```#P4>!02`!04```````````%```````````````\%'@4
+M%``4%```````````!0``````````````/!1X%!<`%!0```````````4`````
+M`````````#P4>!07!A04```````````!```````````````\%,@4%`84%`(`
+M````````!```````````````>!2@%!<`%!0!``````````4`````````````
+M`(P4H!07`!04`P`````````%``````````````",%,@4$@`4%`,`````````
+M!0``````````````C!3(%!0`%!0'``````````6``````````````(P4R!04
+M!A04`P`````````!``````````(```",%,@4%P84%`,``````````0``````
+M```"````C!3(%!<&%!0#``````````$``````````````(P4R!0>`!04````
+M``````````````````````",%$06!084%`,`````````````````````````
+MH!3(%!$&%!0#``````````$``````````````'P5]!4>!A04`@`````````$
+M``````````````!\%406%`84%`,``````````0`````````$````?!5$%AL`
+M%!0#``````````4``````````````'P51!8>`!04`P`````````%````````
+M``````!\%406%P`4%`<``````````8``````````````<1:M%A<`%!0`````
+M`````````````````````'$6K18>!A04``````````````````````````!Q
+M%JT6'@84%`(`````````!```````````````<1;!%@4&%!0`````````````
+M`````````````'$6P181`!04``````````````````````````!Q%L$6%``4
+M%```````````````````````````<1;!%AX`%!0`````````````````````
+M`````'$6P18>!A04``````````````````````,```!Q%L$6'@84%```````
+M````````````````````.!-T$QX`%!0````````````$`````````````+`3
+MV!,>`!04````````````!``````````````R%&X4'@`4%`,```````````0`
+M````````````/!1X%!X`%!0#```````````$`````````````(P4R!0>`!04
+M`P``````````!`````````````!Q%L$6'@`4%`````````````0`````````
+M````?!5$%AX`%!0#```````````$`````````````(P4R!0>`!04````````
+M```````````````````\%'@4'@`4%```````````````````````````P1;!
+M%AX`%!0````````````$``````````````H46A0%!B@H````````````````
+M``````````""%-(4!08H*`$`````````````````````````^A1R%04&*"@`
+M`````````````````````````)H5$A8%!B@H`0``````````````````````
+M```>%$84!08H*```````````````````````````;A2^%`4&*"@!````````
+M`````````````````.847A4%!B@H``````````````````````````"&%286
+M!08H*`$`````````````````````````4!1X%!$&*"@`````````````````
+M`````````%`4>!07!B@H``````````````````````````!:%%H4$08H*```
+M````````````````````````6A1:%!<`*"@`````````````````````````
+M`*`4H!07!B@H`0`````````"``````````````"@%*`4%`8H*`$`````````
+M`@``````````````@A2"%!$`*"@!``````````(``````````````*H4JA04
+M`"@H`0`````````"``````````````""%*H4%``H*`$``````````@``````
+M````````@A2J%!<&*"@!``````````(``````````````*05'!84!B@H`0``
+M```````"``````````````"`%J@6%``H*```````````````````````````
+M@!:H%AX&*"@``````````````````````````(46K18>!B@H````````````
+M``````````````!:%((4#P`H*`,```````````0`````````````JA2J%!(`
+M*"@#```````````$`````````````*05'!84`"@H`P``````````!```````
+M``````"`%J@6%``H*`````````````0`````````````"`E$"04&%`4`````
+M``````````````````````@)1`D4`!0%``````````````````````````!L
+M":@)!084!0``````````````````````````;`FH"10`%`4``````````"``
+M`````````````&P)J`D>`!0%``````````````````````````!L"9X)&P84
+M!0``````````````````````````;`F>"10`%`4``````````"``````````
+M`````(`)B@D4`!0%``````````````````````````"9":@)%``4!0``````
+M````````````````````HPFH"10`%`4``````````"`@`````````````+0)
+MM`D%!A0%``````````````````````````"T";0)%``4!0``````````("@`
+M````````````T`FL"@4&%`4```````````````````````````@)1`D4`!0%
+M``````````````````````````!L"6P)%``4!0``````````````````````
+M````<0F`"10`%`4``````````````````````````(4)B@D4`!0%````````
+M``````````````````"/"9D)%``4!0``````````````````````````G@F>
+M"10`%`4``````````````````````````*,)HPD4`!0%````````````!```
+M````@`````"C":,)%``4!0```````````````````(``````J`FH"10`%`4`
+M```````````$``````"``````*@)J`D4`!0%````````````````````@```
+M``"T";0)%``4!0````````````0``````(``````M`FT"10`%`4`````````
+M``````````"```````@)1`D%!A0%```````````````````````````("40)
+M%``4!0``````````````````````````;`FH"04&%`4`````````````````
+M`````````&P)J`D4`!0%``````````!```````````````!L":@)'@`4!0``
+M````````````````````````;`F>"1L&%`4`````````````````````````
+M`&P)G@D4`!0%``````````!```````````````"`"8H)%``4!0``````````
+M````````````````F0FH"10`%`4``````````````````````````-`)K`H%
+M!A0%``````````````````````````"C":@)%``4!0``````````("``````
+M````````"`E$"10`%`4``````````````````````````&P);`D4`!0%````
+M``````````````````````!Q"8`)%``4!0``````````````````````````
+MA0F*"10`%`4``````````````````````````(\)F0D4`!0%````````````
+M``````````````">"9X)%``4!0``````````````````````````HPFC"10`
+M%`4````````````$``````"``````*,)HPD4`!0%````````````````````
+M@`````"H":@)%``4!0````````````0``````(``````J`FH"10`%`4`````
+M``````````````"```````@)1`D%!B@H``````````````````````````"%
+M"84)!08H*```````````````````````````A0F%"10&*"@`````````````
+M`````````````(4)A0D2!B@H````````````!`````````````#0":P*!08H
+M*```````````````````````````_P$0``$`````````````````````````
+M``(`""```````````````/\`````````````````````$20`````````````
+M````!10```````````````````4"```````````````````3````````````
+M````````4`$0```````````````````````````````````!````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````4`(0````````
+M``````````````````````````0`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````4`,0````````````````````````````
+M````$`@`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````4`00`````````````````````````````(```(``````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````4`40````````
+M`````````````````````````$``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````4`8P``(``````````P``````````````
+M`(!``(`````````````````("0``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````4`@P```````````````````````#````````!``!````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````4`DP``(`````
+M````!``````````#```````$(!``````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````,`$P``(`````````!``````````#````
+M``!`@```"```````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````,`(P``(`````````!``````````#`````$``````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````,`,P``(`````
+M````!``````````#``````!`````"```````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````,`0P``(`````````!``````````#````
+M`$`@````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````,`4P``(`````````!``````````#`````!``````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````,`8P``(`````
+M````!``````````#```````1``$`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````$`$0````````````````````````````
+M`"```0`"```````````````$$@``````````````````$2``````````````
+M````````````````````````````````````````````````````````````
+M````````(`$0```````````````````````````````"`@`$````````````
+M````````````````````````$B``````````````````````````````````
+M````````````````````````````````````````````````8`$0``$`````
+M`````P```````````````""`0``"``````````````#$$```````````````
+M````(00`````````````````````````````````````````````````````
+M````````````````````````````90$0``$``````````P``````````````
+M.```````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````0`%`````````````"``````````"``````0`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`)`````````
+M````$``````````"````QP4`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````0`-``````````````(`````````"````
+M`(``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````0`1```0``````````(`````````"`````(!`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`5```0`````
+M`````(`````````"`````(!```(`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````0`9`````````````"``````````"````
+M`(@`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````0`=```0`````````"(`````````"`````(1`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````0`A```0`````
+M````"(`````````"`````(1```(`````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````0`E``````````````(`````````"````
+MQX$`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````0`M```0``````````(`````````"````QX%`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````4`W_````````
+M````````````````````````````````````````````````````````````
+M````````````````````````"@````````````````````H`````````````
+M````````````````````````````,`K_````````````@``````````#````
+M````````````````````````````````````````````````````````````
+M``````$````````````````````!```````````````````$````````````
+M````````,`LP``````````````$````````#````````````````````````
+M````````````````````````````````````````````@```````````````
+M`````(`````````````````````$````````````````````,`PP````````
+M``````(````````#````````````````````````````````````````````
+M````````````````````````$````````````````````!``````````````
+M```````$````````````````````$`H0````````````````````````````
+M````````````````````````````````````````````````````````````
+M````(````````````````````"`````````````````````$````````````
+M````````0`I`````````````8'@````````"````````````````````````
+M````````````````````````````````````````````0`H`````````````
+M`````$`$```````````````````$````````````````````4`I`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````"`````````````````````@`````````````
+M```````$````````````````````F0$P````````````````````````````
+M````````````````````````````````````````````````````````````
+M````"`````````````````````@````````````````````$````````````
+M````````8`#_``,```````````0````````(``````````#@`P``````````
+M````P`(``````````````````````````````````````,"O````````````
+M``````#P"P`````````````````(````````````````````9@#_``,`````
+M``````0````````(``````````#@`P``````````````P`(`````````````
+M`````````````````````````,`'``````````````````#P`0``````````
+M```````(````````````````````9P#_``,```````````0````````(````
+M``````#@`P``````````````P`(`````````````````````````````````
+M`````,`O``````````````````#P"P`````````````````(````````````
+M````````:`#_``,```````````0````````(``````````#@`P``````````
+M````P`(``````````````````````````````````````,!7````````````
+M``````#P%0`````````````````(````````````````````80#_``,`````
+M``````0````````0``````````#@`P``````````````````````````````
+M`````````````````````````,"O``````````````````#P"P``````````
+M```````(````````````````````8@#_``,```````````0````````0````
+M``````#@`P``````````````P`(`````````````````````````````````
+M`````,"O``````````````````#P"P`````````````````(````````````
+M````````8P#_``,```````````0````````(``````````#@`0``````````
+M````P`(``````````````````````````````````````,`O````````````
+M``````#P"P`````````````````(````````````````````9`#_``,`````
+M``````0````````0``````````@`'```````````````P`(`````````````
+M`````````````````````````,`'``````````````````#P`0``````````
+M```````(````````````````````90#_``,```````````0````````0````
+M``````"$"```````````````````````````````````````````````````
+M`````,!7``````````````````#P%0`````````````````(````````````
+M````````:0#_``,```````````0````````0``````````#``P``````````
+M````P`(``````````````````````````````````````,`'````````````
+M``````#P`0`````````````````(````````````````````:@#_``,`````
+M``````0````````0``````````#``P``````````````````````````````
+M`````````````````````````,`O``````````````````#P"P``````````
+M```````(````````````````````F`'_````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````0`#P`/,```"(@?``\P```$$`@`"#````B8&``(,```!(`/(`]0``
+M`(J!\@#U````0P#V`/<```"+@?8`]P```$H`\0#T````C('Q`/0```!+`($`
+MA````(V!@0"$````3`""`(4```"/@8(`A0```(@!\`#S````B0&``(,```"*
+M`?(`]0```(L!]@#W````C`'Q`/0```"-`8$`A````(\!@@"%````"```````
+M`````````````````````````````````````````0)P%PL`C````````0(H
+M(P\`$@```````0+@+@H`F`(``````0)01@X`)`(``````0+`70D`L`0`````
+M`0*@C`T`2`0``````0*`NP@`8`0``````0+PT@P`;`0`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````"```````````````````````````````````````````````
+M`0-P%PL`C````````0,H(P\`$@```````0/@+@H`F`(``````0-01@X`)`(`
+M`````0/`70D`L`0``````0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`
+M;`0`````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"```````````````````````````
+M`````````````````````0)P%PL`C````````0(H(P\`$@```````0+@+@H`
+MF`(``````0)01@X`)`(``````0+`70D`L`0``````0*@C`T`2`0``````0*`
+MNP@`8`0``````0+PT@P`;`0`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````"```````
+M`````````````````````````````````````````0-P%PL`C````````0,H
+M(P\`$@```````0/@+@H`F`(``````0-01@X`)`(``````0/`70D`L`0`````
+M`0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`;`0`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````!```````````````````````````````````````````````
+M`0#H`PL`@@```````0#0!PH$A`$``````0!\%0D$BP$``````0#X*@@$E@$`
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````!*(`````````````"*(``$9&/E!&
+M1CY0#*(``&Q!@&1L08!D$*(```.@F0$#H)D!%*(``!#63`00UDP$&*(``$``
+M@!-``(`3'*(``&``X!M@`.`;(*(```J`4PP*@%,,)*(``#O?%``[WQ0`**(`
+M`+4!``"U`0``+*(``"`````@````G)@`````````````G)@`````````````
+MG)@`````````````G)@`````````````G)@`````````````G)@`````````
+M````G)@`````````````G)@`````````````G)@`````````````G)@`````
+M````````G)@`````````````G)@`````.````#@`G)@`````````````G)@`
+M````````````G)@`````````````G)@``/D`!`#Y``0`U)@````````$````
+MG)@`````````````G)@`````````````G)@`````````````G)@`````````
+M````G)@`````````````G)@``````!`````0G)@```````0````$G)@`````
+M````````G)@`````````````G)@`````````````G)@````````````*G)@`
+M`(``.`"``#@"G)@```8``@`&````G)@``)(```"2````G)@``*````"@````
+MG)@```<`!``'``0`U)@``!H````:````G)@``$@```!(````G)@``!`````0
+M````G)@```@````(````G)@```\````/````G)@``/(```!B````G)@``$^0
+M``!,D```G)@``%H2``":$@``S)@```X````/````"```````````````````
+M`````````````````````````````0)P%PL`C````````0(H(P\`$@``````
+M`0+@+@H`F`(``````0)01@X`)`(``````0+`70D`L`0``````0*@C`T`2`0`
+M`````0*`NP@`8`0``````0+PT@P`;`0`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M"````````````````````````````````````````````````0*X"PL`A@``
+M`````0*4$0\`"0```````0)P%PH`C`(``````0(H(PX`$@(``````0+@+@D`
+MF`0``````0)01@T`)`0``````0+`70@`,`0``````0)X:0P`-@0`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````"```````````````````````````````````````
+M`````````0+<!0L`@P```````0+*"`\`!````````0*X"PH`A@(``````0*4
+M$0X`"0(``````0)P%PD`C`0``````0(H(PT`$@0``````0+@+@@`&`0`````
+M`0*\-`P`&P0`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````!P``````````````````
+M`````````````````````````````0-P%PL`C````````0/@+@H`F`(`````
+M`0-01@X`)`(``````0/`70D`L`,``````0.@C`T`2`,``````0.`NP@`8`,`
+M`````0/PT@P`;`,`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M"````````````````````````````````````````````````0-P%PL`C```
+M`````0,H(P\`$@```````0/@+@H`F`(``````0-01@X`)`(``````0/`70D`
+ML`0``````0.@C`T`2`0``````0.`NP@`8`0``````0/PT@P`;`0`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````!```````````````````````````````````````
+M`````````0#H`QL`@@```````0#0!QH$A`$``````0!\%1D$BP$``````0#X
+M*A@$E@$`````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````#```````````````````
+M`````````````````````````````0#H`QL`@@```````0#0!QH$A`$`````
+M`0!\%1D$BP(``````0#X*A@$E@,```````)P%PL`#`0```````(H(P\`$@0`
+M`````0+@+@H`&`8``````0)01@X`)`8``````0+`70D`,`@``````0*@C`T`
+M2`@``````0*`NP@`8`@``````0+PT@P`;`@`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M#0```````````````````````````````````````````````03Z``,`@0!D
+M`F0"`03T`0<`@0#)`<D!`03H`P(`@@'D`.0``030!P8`A`*@`*```02X"P$`
+MA@.,`(P``0)P%PL`C`0\`#P``0(H(P\`$@0\`#P``0+@+@H`F`8P`#```0)0
+M1@X`)`8P`#```0+`70D`,`@L`"P``0*@C`T`2`@L`"P``0*`NP@`8`@L`"P`
+M`0+PT@P`;`@L`"P`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#
+M0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@,RXS+C(``$=#0SH@*$=.52D@
+M,RXS+C(``"YS>6UT86(`+G-T<G1A8@`N<VAS=')T86(`+G)E;"YT97AT`"YR
+M96PN<F]D871A`"YR;V1A=&$N<W1R,2XT`"YR96PN9&%T80`N8G-S`"YC;VUM
+M96YT```````````````````````````````````````````````````````?
+M`````0````8`````````-````*`$`@````````````0`````````&P````D`
+M`````````````"`.`P"PG0``"P````$````$````"````"D````!`````@``
+M``````#4!`(`Q(4`````````````!``````````E````"0``````````````
+MT*L#`(`)```+`````P````0````(````,0````$````R`````````)B*`@``
+M`0`````````````$`````0```$0````!`````P````````"8BP(`F%``````
+M````````!`````````!`````"0``````````````4+4#`$`````+````!@``
+M``0````(````2@````@````#`````````##<`@"8`0`````````````$````
+M`````$\````!```````````````PW`(`J`,``````````````0`````````1
+M`````P``````````````V-\"`%@```````````````$``````````0````(`
+M`````````````#CB`@#0&0``#`````<````$````$`````D````#````````
+M```````(_`(`%A(``````````````0``````````````````````````````
+M`````````````````P`!``````````````````,``P`````````````````#
+M``4``````````````````P`&``````````````````,`"```````````````
+M```#``D``0```.RC``"P````$@`!``P````@CP``"````!(``0`7````.#`!
+M`&@"```2``$`(@```*!M``"4````$@`!`"T```#D2P$`<`(``!(``0`X````
+M```````````0````0@```.SY``!0````$@`!`$T```!X6`$`F`$``!(``0!8
+M````Y%\``%0!```2``$`8P```""D`0`L`0``$@`!`&X```#(.```I`$``!$`
+M!@!Y````S#8!`#@````2``$`A````/AB``!$````$@`!`(\```!(4@``[```
+M`!(``0":````9$@``*0!```1``8`I0```)0H`0!`````$@`!`+````!0(P$`
+M(````!(``0"[````0!8!`!`````2``$`Q@```,#X```H`0``$@`!`-$````(
+M!@$`$`$``!(``0#<````,`L``*P````2``$`YP```$#I``"\````$@`!`/(`
+M``"@SP``Q````!(``0#]````_+,``'P````2``$`"`$``$"Y```8````$@`!
+M`!,!```0E```1````!(``0`>`0``K"P!`$@````2``$`*0$``%3W```(````
+M$@`!`#0!``#H$@$`*````!(``0`_`0``5$X!`,0````2``$`2@$``/P'``!4
+M````$@`!`%4!``"4_```.`$``!(``0!@`0``I*@```@````2``$`:P$``#B1
+M`0"8`0``$@`!`'8!``!@F```"````!(``0"!`0``6+D``!P````2``$`C`$`
+M`.P/``"D`0``$@`!`*<!``!X0P``I`$``!$`!@"R`0``L"0!`)0````2``$`
+MO0$``#B5``"$````$@`!`,@!``"X`P``,````!(``0#3`0``W)0!`(`````2
+M``$`W@$`````````````$````/\!```H:0``4````!(``0`*`@``0"<!`#P!
+M```2``$`%0(``-0F`0!L````$@`!`"`"``#P[```G````!(``0`K`@``'&P`
+M`#@````2``$`-@(``!2O``!<````$@`!`$$"``!XM```F````!(``0!,`@``
+MP.T``#P````2``$`5P(``'"L```D````$@`!`&("``"()0$`?````!(``0!M
+M`@``J)@``"0!```2``$`>`(``"QH``!(````$@`!`(,"``!<CP``/````!(`
+M`0".`@``9!T!`*`````2``$`F0(``$RV``!,````$@`!`*0"``!$)0$`,```
+M`!(``0"O`@``!"0!`'P````2``$`N@(``!C[``!P````$@`!`,4"```P3P$`
+M-````!(``0#0`@``\&(```@````2``$`VP(```0F`0"8````$@`!`.8"``#H
+M5@``E`8``!(``0#Q`@``U+4``#P````2``$`_`(``&`@`0!H````$@`!``<#
+M``!<`P``7````!(``0`2`P``@"0!`#`````2``$`'0,``+AZ`0!,`0``$@`!
+M`"@#``"P$0$`0````!(``0`S`P``#%<!`,@````2``$`/@,``'QK```P````
+M$@`!`$D#``#PJ```N````!(``0!4`P``G*T``'0````2``$`7P,``#".```X
+M````$@`!`&H#``",@0$`F````!(``0!U`P``[($``)P"```2``$`@`,``-AO
+M```$````$@`!`(L#```D@@$`.````!(``0"6`P``#)$```0#```2``$`H0,`
+M`,0!``",`0``$@`!`+`#``#49P$`-`0``!(``0"[`P`````````````0````
+MP@,``.0T`0`4`0``$@`!`,T#``"$M0``(````!(``0#8`P``*'\!`(P!```2
+M``$`XP,``'`K`0`\`0``$@`!`.X#```0-@$`'````!(``0#Y`P``4`,```P`
+M```2``$`!`0``-2P```<````$@`!``\$``#\[0``]````!(``0`:!```C.T`
+M`#0````2``$`)00``'3(``!,````$@`!`#`$``!\70``%````!(``0`[!```
+MK&L``'`````2``$`1@0``.@#``#,`0``$@`!`%P$``#L50$`.````!(``0!G
+M!```S)D``/@````2``$`<@0``'!M```P````$@`!`'T$`````````````!``
+M``"'!```6*8``"0````2``$`D@0``!A/`0`8````$@`!`)T$``"<V```-```
+M`!(``0"H!```H!@!`%`$```2``$`LP0``/04`0`0````$@`!`+X$``#T8P``
+MJ````!(``0#)!```G*0``&`````2``$`U`0``$28`0!4````$@`!`-\$``"@
+M%@$`3`$``!(``0#J!```7+4```0````2``$`]00``+!H``!X````$@`!```%
+M``#8[```&````!(``0`+!0``)/X``(`'```2``$`%@4``(!^`0"H````$@`!
+M`"$%``!((P$`"````!(``0`L!0``3*P``"0````2``$`-P4``+PW`0!X````
+M$@`!`$(%```8CP``"````!(``0!-!0``B(P!`+`"```2``$`6`4``)R[``#4
+M````$@`!`&,%``!49P``4````!(``0!N!0``G"8!`#@````2``$`>04``*0%
+M`0!D````$@`!`(0%```D]0``(````!(``0"/!0``7)4!`%@````2``$`F@4`
+M````````````$````*<%``!DD```J````!(``0"R!0``;'4``-0````2``$`
+MO04``/B0`0!`````$@`!`,@%```\E@$`$````!(``0#3!0``*"$!`,0````2
+M``$`W@4``!`&``"@`0``$@`!`.\%``"$A0$`K`0``!(``0#Z!0``5&P``*``
+M```2``$`!08```B6``"X````$@`!`!`&``!0M0``!````!(``0`;!@``<",!
+M`"`````2``$`)@8``$RE`0"X````$@`!`#$&``"L=```>````!(``0`\!@``
+M<`T!`,`````2``$`1P8``*RH``!$````$@`!`%(&``!@R@``K`$``!(``0!=
+M!@``:(X``+`````2``$`:`8``"A@`0"H!@``$@`!`',&```4.0$`K````!(`
+M`0!^!@``H#(!`#`````2``$`B08``'"\``"<`0``$@`!`)0&``#4*`$`G`(`
+M`!(``0"?!@``?+(``'@````2``$`J@8``&2U```@````$@`!`+4&``#T+`$`
+M1`,``!(``0#`!@``G((!`&`!```2``$`RP8``)B8`0`D!@``$@`!`-8&```0
+MM@``/````!(``0#A!@``R)H``!0````2``$`[`8```AB```0````$@`!`/<&
+M``#\I```7`$``!(``0`"!P``9!\!`$P````2``$`#0<``&QP```H````$@`!
+M`!@'``#L[`$`*`$``!(``0`C!P``S&\```0````2``$`+@<``+`C`0`0````
+M$@`!`#D'``!<(@$`3````!(``0!$!P``K$L``*0!```1``8`3P<``+#U``!\
+M````$@`!`%H'``#XJ0$`7````!(``0!E!P``>&X``'P````2``$`<`<``'2Y
+M```<````$@`!`'L'``!`=@``\`$``!(``0"&!P``N$L!`"P````2``$`D0<`
+M`!@=`0`D````$@`!`)P'``"P'P$`L````!(``0"G!P``>)8!`,P!```2``$`
+ML@<``*"````<````$@`!`+T'```$<P``'````!(``0#(!P``#&H``.P````2
+M``$`TP<``$!U```L````$@`!`-X'``#<'@$`B````!(``0#I!P``Z%$!`#0#
+M```2``$`]`<`````````````$````/X'``#8B@$`L`$``!(``0`)"```$#P`
+M`*0!```1``8`%`@``)QD``"D`0``$@`!`!\(```P10``@````!(``0`J"```
+M*(\``#0````2``$`-0@``"1U```<````$@`!`$`(`````````````!````!@
+M"```,'@``)`'```2``$`:P@````````)````$0`&`'L(```06@$`F````!(`
+M`0"&"```$*X``$`````2``$`D0@``'@#`@`H`0``$@`!`)P(```8!P$`@```
+M`!(``0"G"```Y"`!`$0````2``$`L@@``-QO```$````$@`!`+T(``"$5@$`
+MB````!(``0#("```5+4```@````2``$`TP@``+"X```D````$@`!`-X(``"H
+MJ0``J````!(``0#I"```P",!`#P````2``$`]`@`````````````$`````,)
+M``"0K@``2````!(``0`."0``"$H``*0!```1``8`&0D``,`T`0`D````$@`!
+M`"0)``#@#@$`8````!(``0`O"0``9-```&`````2``$`.@D``(B````8````
+M$@`!`$4)```DLP``E````!(``0!0"0``!!4!`#P!```2``$`6PD``!Q%``"D
+M`0``$0`&`&8)``!\*`$`&````!(``0!Q"0``;+```&@````2``$`?`D``(@X
+M`0",````$@`!`(<)``#8H0$`2`(``!(``0"2"0``4*H``-0!```2``$`G0D`
+M`,1S```P````$@`!`*@)```0K0``0````!(``0"S"0```-0``%0!```2``$`
+MO@D``#"'```8````$@`!`,D)``!$-P$`>````!(``0#4"0``P$8``*0!```1
+M``8`WPD``%"N``!`````$@`!`.H)``"\KP``L````!(``0#U"0``^&H``&@`
+M```2``$```H``$R*`0`@````$@`!``L*`````````````!`````:"@``7/<`
+M`$`````2``$`)0H``#P=`0`H````$@`!`#`*``!H9@``)````!(``0`["@``
+M="4!`!0````2``$`1@H``$BU```(````$@`!`%$*``!$'@$`F````!(``0!<
+M"@``M#T``*0!```1``8`9PH``&"[```<````$@`!`'(*``!\I@``+`$``!(`
+M`0!]"@``:`$``%P````2``$`BPH``&PZ``"D`0``$0`&`)8*``#HN@``>```
+M`!(``0"A"@``J*<``!`````2``$`K`H```P````D````$0`&`+X*``!X:0``
+M*````!(``0#)"@``^&D``!0````2``$`U`H``%`6`0!0````$@`!`-\*```0
+M<@``;````!(``0#J"@``B*<!`'`"```2``$`]0H``'QR```D````$@`!```+
+M``#HLP``%````!(``0`+"P``B#8!`$0````2``$`%@L``/10```0`0``$@`!
+M`"$+```PB@$`'````!(``0`L"P``<+H``'@````2``$`-PL``!"U```X````
+M$@`!`$(+``!(-@$`0````!(``0!-"P``1/4``"0````2``$`6`L``%R"`0!`
+M````$@`!`&,+``"XLP``,````!(``0!N"P``T&8!`,P````2``$`>0L``+BG
+M``#L````$@`!`(0+``"<]P``)`$``!(``0"/"P``6#\``*0!```1``8`F@L`
+M`)1S```P````$@`!`*4+``!,E@$`+````!(``0"P"P``7&$``*P````2``$`
+MNPL``*!R``!,````$@`!`,8+``!X\```D`0``!(``0#1"P``#'```&`````2
+M``$`W`L``&1N```4````$@`!`.<+``!`#P$`O`$``!(``0#R"P``M(`!`-@`
+M```2``$`_0L``'R[```@````$@`!``@,```$4@``1````!(``0`3#```=!(!
+M`'0````2``$`'@P``.0.``"$````$@`!`"D,```D"0``#`(``!(``0`T#```
+M<!$!`$`````2``$`/PP``/1N``"8````$@`!`$H,``#L<@``&````!(``0!5
+M#```L'@!`)0````2``$`8`P``.QG``!`````$@`!`&L,``"<9P$`.````!(`
+M`0!V#```6$(``"@````2``$`@0P``+0%``!<````$@`!`(P,```$'@$`0```
+M`!(``0"7#``````````````0````IPP``-#8``"@`0``$@`!`+(,````````
+M`````!````"[#```.&$``"0````2``$`Q@P``#B/`0#``0``$@`!`-$,``!T
+M:```/````!(``0#<#```[!<!`+0````2``$`YPP``-RQ``"@````$@`!`/(,
+M```L]@``*`$``!(``0#]#``````````````0````'0T``%`(``#4````$@`!
+M`"@-``"X9@``5````!(``0`S#0``#&<``$`````2``$`/@T``%"M``!,````
+M$@`!`$D-```\8P``N````!(``0!4#0``<*\``$P````2``$`7PT``)@'`0"<
+M!0``$@`!`&H-``"DM0``(````!(``0!U#0``P#D!`/P!```2``$`@`T``,1O
+M```(````$@`!`(L-``!`9@``*````!(``0"6#0``\&D```@````2``$`H0T`
+M````````````$````*\-```DK```*````!(``0"Z#0``>`P``"`!```2``$`
+MQ0T``.!O```L````$@`!`-`-```PN@``0````!(``0#;#0``F+8``#`````2
+M``$`Y@T``"B!``#$````$@`!`/$-``#T<P``0````!(``0#\#0``H&D``%``
+M```2``$`!PX``/`<`0`H````$@`!`!(.```L-@$`'````!(``0`=#@``)$L!
+M`)0````2``$`*`X``-BN```\````$@`!`#,.```X$@$`/````!(``0`^#@``
+MJ%H!`(`%```2``$`20X``&!K```<````$@`!`%0.``#4N```;````!(``0!?
+M#@``\+```#`````2``$`:@X``,"6``"@`0``$@`!`'4.``"<K```=````!(`
+M`0"`#@``8+4```0````2``$`BPX``)B/``#,````$@`!`)8.``!030``I`$`
+M`!$`!@"A#@``L&8```@````2``$`K`X``)2L```(````$@`!`+<.``"$7P``
+M8````!(``0#"#@``&&(``-@````2``$`S0X``/`1`0!(````$@`!`-@.``!H
+M#P``A````!(``0#C#@``N)0!`"0````2``$`[@X``/PC`0`(````$@`!`/D.
+M``"0L0``3````!(``0`$#P``R'<!`.@````2``$`#P\``$2X``!L````$@`!
+M`!H/```,O@``4`H``!(``0`E#P``]$X``*0!```1``8`,`\``%0-`0`<````
+M$@`!`#L/``"D9P``2````!(``0!&#P``L`<``$P````2``$`40\``(QF```D
+M````$@`!`%P/``#0D@$`Z`$``!(``0!G#P``N(0!`,P````2``$`<@\``"!S
+M```<````$@`!`'T/``#TL@``,````!(``0"(#P``^#4!`!@````2``$`DP\`
+M`#QS``!8````$@`!`)X/``"(7@``>````!(``0"I#P``-&X``#`````2``$`
+MM`\``$"@```H````$@`!`+\/``"8#0``3`$``!(``0#*#P``Z/D```0````2
+M``$`U0\``%24``!<````$@`!`.`/``#0N0``,````!(``0#K#P``T&\```@`
+M```2``$`]@\``*SO``#,````$@`!``$0```$-P$`0````!(``0`,$```V+L!
+M``P!```2``$`%Q```(QO```X````$@`!`"(0```T4P``*````!(``0`M$```
+MH$D``%0'```2``$`0Q```#0X`0!4````$@`!`$X0```T=```>````!(``0!9
+M$```O#L!`&@/```2``$`9!```!`3`0#D`0``$@`!`&\0``!H]0``2````!(`
+M`0!Z$````+H``#`````2``$`A1```+"4``"(````$@`!`)`0``#L00``;```
+M`!(``0";$```:)@``$`````2``$`IA```+R```!L````$@`!`+$0``"0N0``
+M0````!(``0"\$```7,@``!@````2``$`QQ````!?``"$````$@`!`-(0``#$
+MF@``!````!(``0#=$```]&P``'P````2``$`Z!```!CH``!$````$@`!`/,0
+M``!4-`$`;````!(``0#^$```J"(!`*`````2``$`"1$``""Q``!P````$@`!
+M`!01``!,FP``]`0``!(``0`?$0``6(H``&`#```2``$`*A$``)`C`0`@````
+M$@`!`#41```(]0``'````!(``0!`$0``#-@!`!@!```2``$`2Q$``.PA`0!P
+M````$@`!`%81``#\$`$`=````!(``0!A$0``9$\!`(0"```2``$`;!$``&R*
+M`0`D````$@`!`'<1`````````````!````")$0``=*,``'@````2``$`E!$`
+M`#`.`0"P````$@`!`)\1`````````````!````"P$0``3&<```@````2``$`
+MNQ$``,2U```0````$@`!`,81``"\E0``3````!(``0#1$0``R"`!`!P````2
+M``$`W!$``.QQ`0`0`0``$@`!`.<1``#`R```H`$``!(``0#R$0``O$0``'0`
+M```2``$`"Q(``)"*`0!(````$@`!``!Z>C`P-6(U.#0V`'IZ,#`R9&(Q,6,`
+M>GHP,F1B9C@W-0!Z>C`R9&)B,6(R`'IZ,#)D8C(P-3,`7U]A<VAL9&DS`'IZ
+M,#`R9&)A-#(`>GHP9F)B,64S9@!Z>C!B-SEE83DT`'IZ,#5B.&,V-6$`>GHP
+M,#5B-#!A9`!Z>C`U8CDT,F5D`'IZ,&0X9&,V,F,`>GHP,#$Y9C0W,`!Z>C`R
+M9&0Y-#)D`'IZ,#)D8F4W,V0`>GHP,#5B-CDR8@!Z>C!B-F0R,S(U`'IZ,#`U
+M8C@U,V0`>GHP,#$V9#DR90!Z>C!C9F(Q.#<U`'IZ,#`R9&(S,6,`>GHP,F1A
+M8F)A8P!Z>C`R9&)C.#4Q`'IZ,#`P8C9C-C@`>GHP,#!B-F)F.`!Z>C`P8C9C
+M9C5E`'IZ,#$V93%D9F0`>GHP8C9F-3!B.`!Z>C`V93!A-&9E`'IZ,#`V-V0R
+M8C$`>GHP,#)D8F,V,0!Z>C!B-F-A,S(U`'IZ,#`U8C9C9F0`>GHP,39E,&1F
+M9`!Z>C`P,&(V9C8X`&%T:%]H86Q?<')O8V5S<U]N;VES969L;V]R`'IZ,#`U
+M8C0X860`>GHP,F1B9C%B,@!Z>C`P-6(X.&-B`'IZ,#,S96,X8F8`>GHP9&(T
+M,C5C-0!A=&A?:&%L7V1M85]B96%C;VY?<F5S<&]N<V5?=&EM90!Z>C`P8C9F
+M,38Q`'IZ,#9E,#!B.&$`>GHP,F1B9F,Q9`!Z>C!D8S1E,SDP`'IZ,&1A9F5D
+M.#8`>GHP,&(V93(W80!Z>C`R9&)B86(R`'IZ,&(V9#%E9F8`>GHP,39D.3!D
+M9`!Z>C`R9&)E.#4Q`'IZ,#`U8C8T9F0`>GHP,#!B-F0U,@!Z>C!B-F,Y969F
+M`'IZ,#$V93`P9&0`>GHP,F1B9#@W-0!Z>C`R9&(S,6(R`'IZ,#!B-S`Y,C,`
+M>GHP,&(V9#0U,`!Z>C`P,&(V9#%D`'IZ,&(V8S(S,C4`>GHP,F1B9&%B,@!Z
+M>C`P,#5B-C,R`'IZ,#9D961D.3,`>GHP,#$V9&$U,`!Z>C`P,#8W9#,R`'IZ
+M,#!B-F0Y,C,`>GHP,#)D8C4Q8P!Z>C`Q-F1C8F9E`'IZ,#!B-S`Q-#4`>GHP
+M,#$V9&8R8P!Z>C!B-V9A9#-E`'IZ,#$V9#DY,C``>GHP,F1B,6)A8P!Z>C!D
+M8S9E,SDP`'IZ,#5B-S`Q93``>GHP,#!B-F(Q,`!Z>C!B-S`Y969F`'IZ,#$V
+M9&8X.6(`871H7VAA;%]A='1A8V@`>GHP-F4P9F,P9`!M96UC<'D`>GHP,39D
+M86(R9`!Z>C`R9&(Q,S5D`'IZ,&4P-#8X-&(`>GHP,39E,CDQ9`!Z>C`P,&(V
+M9F4X`'IZ,#!C9F(S93``>GHP,#$V9#DT.`!Z>C`Q-F4R,#EB`'IZ,&(W,#%E
+M9F8`>GHP,#!B-F,Y9`!Z>C`P,#5B-6$R`'IZ,#)D8C$W,&$`871H7VAA;%]C
+M;VUP=71E='AT:6UE`'IZ,#)D8C5B86,`>GHP,#5B.#$S9`!Z>C`P8C9C.3(S
+M`%]?=61I=G-I,P!Z>C!B-F(U,&(X`'IZ,#`U8C=F.60`>GHP8C<P,60P,@!Z
+M>C`V9&9F-#1A`'IZ,#)D8C4W-C,`>GHP-F5E868V,`!Z>C!E,#`W8V$Q`'IZ
+M,#`R9&%F-C(`>GHP8C@S860S90!Z>C`P,&(V8CDP`'IZ,#$V9#EE9F$`>GHP
+M,39D93`U,0!Z>C`P,#5B-F(R`'IZ,#5B-V8Q,30`>GHP-&%E,#,Q9@!Z>C`R
+M9&)D9&9D`'IZ,#`U-#=F960`>GHP,&(V8F8U90!Z>C`P8C<Q-S=D`'IZ,#!B
+M-S!F,V0`>GHP,39D.#DR,`!Z>C`R9&(Q86(R`'IZ,#`P-6(V,C(`>GHP,#!B
+M-F8W.`!Z>C!B-CEB,#=C`&%T:%]H86Q?9G)E90!Z>C`U8C<Y8C%B`'IZ,#!B
+M-S`W,V0`>GHP,F1B96)B9`!Z>C!B-64S,34R`'IZ,#$V9&9B9C$`871H7VAA
+M;%]M:'HR:65E90!Z>C`Q-F4Q.#EB`'IZ,&1C,F$U8S4`>GHP,#)D8S8P8@!Z
+M>C`V9&8P8CAA`'IZ,#)D8C,S-60`>GHP8C9C-3-A-`!Z>C!F-31D,6(P`'IZ
+M,&(V9F0S-C,`>GHP9#ED8S8R8P!Z>C`U8C<T,64P`'IZ,#)D83EB86,`>GHP
+M9&,R,60S80!Z>C`P8C<Q-S-D`'IZ,#$V9#ED-#$`>GHP,#5B.#1F9`!Z>C`P
+M-6(X86)D`'IZ,#!B-S`Q,C,`>GHP,#5B-C4R8@!Z>C`R9&(S.#<U`'IZ,#$V
+M93,P.6(`>GHP,#5B-C!B,@!Z>C`R9&(Q.#<U`'IZ,#`R9&(X-#(`>GHP,F1B
+M,3<V,P!Z>C!B-V1E83DT`'IZ,#!B-S`Q-C$`>GHP,39D-V0T,0!Z>C`P,39C
+M9#,R`'IZ,#9D93!B.&$`>GHP-F0Y9&0Y,P!Z>C!D8C-E9#@V`'IZ,#`U8C0X
+M960`>GHP,#)D8S@P8@!Z>C`P,F1B8S0R`'IZ,#)D8F$X-3$`>GHP,F1B,S-E
+M9`!Z>C`P-6(X,&9D`'IZ,#`U8C=F,F4`>GHP,F1B9F1F9`!Z>C`Q-F4V-#AA
+M`'IZ,#`R9&%F9C(`>GHP,#5B-S<Y9`!Z>C`P,&(V964X`'IZ,#$V930T.&$`
+M>GHP,&(V9C9B8P!Z>C`Q-F1A.3(P`'IZ,#5B-S@Q93``7U]U;6]D<VDS`'IZ
+M,#`R9&-A,&(`>GHP,#5B-#1A9`!Z>C`V9&1F-#1A`'IZ,&9A8S!C.6(`>GHP
+M8C9F.65F9@!Z>C`P8C9C-F)C`&%T:%]H86Q?861D:71I;VYA;%]S=V)A7V)A
+M8VMO9F8`>GHP,#`R9&(Y,@!A=&A?:&%L7W9E<G-I;VX`>GHP,F1B86,R90!Z
+M>C`R9&(W.6%E`'IZ,#`Q-F4U,S(`>GHP8C9C9C`P.0!Z>C`P,39E,3)C`'IZ
+M,#`Q-F0Y930`>GHP,#`R9&%E80!Z>C`P-6(U8V(R`'IZ,#$V9&$R-3$`>GHP
+M-F8V868V,`!Z>C`V9&9D9#DS`&%T:%]H86Q?;6%L;&]C`'IZ,#`P8C9D9#(`
+M>GHP,F1D.3)A9`!Z>C`Q-F1B,C4Q`'IZ,&4Q,#=C83$`>GHP,&(V8S<U90!Z
+M>C`Q-F1D,#4Q`'IZ,#)D8F0Q8C(`>GHP,F1C,3<V,P!Z>C!B-CDP9#9D`'IZ
+M,#$V9&8P-3$`>GHP,#$V9#DU,`!Z>C`P8C<P-F)C`'IZ,#`Q-F0X-S(`>GHP
+M-F1E9C0T80!Z>C`U8CAC,F5D`'IZ,#9F8CDT-V(`>GHP96)B,64S9@!Z>C!B
+M-F8Y9#`R`'IZ,&0Q-&0Q8C``>GHP8C0X,#,Q90!Z>C`Q-F1B8F9E`'IZ,#$V
+M934T.&$`>GHP,#$V9#@U,`!Z>C`P,&(V9F8X`&%T:%]H86Q?;65M8W!Y`'IZ
+M,#)D8F-B8F0`>GHP,39D83!D9`!Z>C`R9&)B9&9D`'IZ,#)D8C(X-3$`>GHP
+M,F1B9&,Q9`!Z>C`V9&(P8V8R`'IZ,#$V96(Y860`>GHP,&(V8V5B8P!Z>C!D
+M.30X-&$Q`&%T:%]H86Q?<')O8F4`>GHP,39E83EA9`!Z>C!F9#1D,6(P`'IZ
+M,#)D8C,W-C,`871H7VAA;%]B=6EL9&]P=',`>GHP,F1A9C,U9`!Z>C`V9&1D
+M9#DS`'IZ,&1A9&,V,F,`>GHP,39D9C(U,0!Z>C`P,&(V8S$P`'IZ,#$V9#DR
+M-3$`>GHP,F1B,#@U,0!Z>C!B-S(Q865D`'IZ,#8W8V9C864`>GHP,#!B-F-F
+M.`!Z>C!C.31D,6(P`'IZ,#)D869A8C(`>GHP-6(Y,F%E9`!Z>C`P-6(X8V-B
+M`'IZ,&(V9#EE9F8`>GHP,F1B,3%B,@!Z>C`R9&)F9F(Q`'IZ,#)D8F8W-C,`
+M>GHP,#5B-CAF9`!Z>C`P-6(T-&5D`'IZ,&(W,3%A960`>GHP8C5E,S$V,`!Z
+M>C!D.#0X-&$Q`'IZ,#$V9#AB,F0`>GHP,39E,#@Y8@!Z>C`R9&)B.#<U`'IZ
+M,#)D864X-3$`>GHP8C@Q96$Y-`!Z>C`Q-F1E8S%F`'IZ,#!B-F9E8F,`>GHP
+M93@Y-#DP-P!Z>C`P8C9E83=A`'IZ,#,S93AF8F8`>GHP8V9A-3@W-0!Z>C`R
+M9&(Y.6%E`'IZ,#)D8CEA8C(`>GHP,#!B-F)E.`!Z>C!D938X,S=F`'IZ,#$V
+M9&%B9F4`>GHP8C<P.60P,@!Z>C`V-V0R-64R`'IZ,#$Y9C-A,#$`>GHP-S`S
+M.30W8@!A=&A?:&%L7VUE;7IE<F\`>GHP-F1F9F,P9`!?7V1I=G-I,P!Z>C!B
+M-C<U,&(X`'IZ,#$V93)D9F0`>GHP,#!B-F0R,@!Z>C`V9F5A9C8P`'IZ,&1C
+M-&$U8S4`>GHP,&(W,&8W9`!A=&A?:&%L7W-W7V)E86-O;E]R97-P;VYS95]T
+M:6UE`'IZ,#EF-C1B-F$`>GHP,#5B-C4W80!Z>C`V9C,Y-#=B`'IZ,#9D83!C
+M9C(`>GHP8C=B860S90!Z>C`P8C9F.38Q`'IZ,&(V.3<S8F,`>GHP,F1B9#,U
+M9`!Z>C`P-6(X.&9D`'IZ,#)D8F)C,60`>GHP,F1A9F1F9`!Z>C`V9#=D9#DS
+M`&%T:%]H86Q?9&5L87D`>GHP,F1B,61F9`!Z>C`V-V0R9C0Q`'IZ,#)D868X
+M-S4`>GHP8C=E9&4V9`!Z>C`Q-F0X9#0Q`'IZ,#`R9&%E.3(`>GHP8C=A9&4V
+M9`!Z>C`R9&)B,S5D`'IZ,#)D8C-D9F0`>GHP,F1B-3-E9`!Z>C`Q-F1C96%E
+M`'IZ,#`P8C9D83(`>GHP,#!B-F4R,@!Z>C`U8C@P,#0Q`'IZ,#`Q-F0X-#@`
+M>GHP,39D.6(R9`!Z>C`P,39E,#)C`'IZ,#!B-S`W-V0`>GHP,#5B-CDW80!Z
+M>C`P,39D864T`'IZ,#$V93$P.6(`>GHP,#5B-&$R9`!Z>C`Q-F1E,&1D`'IZ
+M,#$V9&8P9&0`>GHP9&8P-V-A,0!Z>C`R9&)D-S8S`'IZ,#`P8C9E-3(`>GHP
+M-C=D,&,T-P!Z>C`U8C9C-F1B`'IZ,&,S,35E8C4`>GHP9&(Q960X-@!Z>C`V
+M9#0P-F4P`'IZ,#$V93`R-3$`>GHP,#`R9&)B,@!Z>C`P,F1D.#9D`'IZ,#`Q
+M-F4Q-&0`>GHP,F1B-3EA90!Z>C`P-C=D,C(Q`'IZ,#$V9#@P9&0`>GHP,#5B
+M.#DS9`!Z>C`U8C@Q8C%B`'IZ,#)D8C$S960`>GHP,&(V9#$R,P!Z>C`P,&(V
+M8V4X`'IZ,#5B.&%A960`>GHP8C9E9#,V,P!Z>C`R9&%F,6(R`'IZ,#`P-6(U
+M93(`>GHP,S-E8F9B9@!Z>C`U8C8X-F1B`'IZ,#`P8C9E9C@`>GHP8C<Q.6%E
+M9`!Z>C`P-6(U.&(R`'IZ,#5B-V1B,6(`>GHP8C@R9&4V9`!Z>C`P,39D-S,R
+M`'IZ,#)D861A8C(`>GHP9C0U939E,P!A=&A?:&%L7VEN:71?8VAA;FYE;',`
+M>GHP,&(V9#9B8P!Z>C!C,31D,6(P`'IZ,#`P,F1B9#(`>GHP9&$T.#1A,0!Z
+M>C`Q-F4P8C@W`'IZ,#5B.3`R960`>GHP9&,R93,Y,`!Z>C!A-C!D,30U`'IZ
+M,#)D8F%B8F0`>GHP,#!B-F,Q9`!Z>C`U8CAE865D`'IZ,#`U8C=B.60`>GHP
+M,#5B-30T-@!Z>C`U8C8T-F1B`'IZ,#!B-F8Y,C,`>GHP9&0V.#,W9@!Z>C`Q
+M-F4Q,C4Q`'IZ,&1C-F$U8S4`>GHP,F1B,S<P80!Z>C`P,#5B-C<R`'IZ,#9D
+M969C,&0`>GHP,F1B9C,U9`!Z>C`P,&(V8S<X`'IZ,#`Q-F0X,S(`>GHP,F1B
+M-3<P80!Z>C`P-6(V9#=A`'IZ,#`R9&(R.3(`>GHP,#5B.3!C8@!A=&A?:&%L
+M7W)E9U]W<FET90!Z>C!B-F8U,S8S`'IZ,#`U8C5C-#8`871H7VAA;%]R96=?
+M<F5A9`!Z>C`V9#DP8V8R`'IZ,#9D.&1D.3,`>GHP,39D9F(X-P!Z>C`P,39D
+M830X`'IZ,&(V-C,Q83@`>GHP,#)D8C`Y,@!A=&A?:&%L7V=E='=I<F5L97-S
+M;6]D97,`>GHP,39E,6(X-P```!0````!`0``'`````$!```D`````0$``"P`
+M```!`0``-`````$!```\`````0$``$`````!`0``2`````$!``!0`````0$`
+M`%0````!`0``9`````$!``!L`````0$``'`````!`0``?`````$!``"`````
+M`0$``)`````!`0``G`````$!``"@`````0$``*P````!`0``L`````$!``"\
+M`````0$``,`````!`0``S`````$!``#0`````0$``/0````!`0``*`$```(#
+M```L`0```@,``#0!```"`P``2`$```(#``!0`0```@,``%0!```"`P``6`$`
+M``(#``!<`0```@,``&`!```"`P``9`$```(#``"4`0```0$``*`!```!`0``
+MJ`$```$!``#L`0```0$``/`!```!`0``^`$```$!`````@```0$```@"```!
+M`0``#`(```$!```4`@```0$``"`"```!`0``)`(```$!```P`@```0$``#0"
+M```!`0``0`(```$!``!(`@```0$``%0"```!`0``6`(```$!``!D`@```0$`
+M`&P"```!`0``>`(```$!``!\`@```0$``(0"```!`0``E`(```%X``"8`@``
+M`0$``*0"```!B`$`J`(```$!``"T`@```4<``+@"```!`0``S`(```$!``"$
+M`P```90!`)`#```!`0``H`,```$Y`0"L`P```0$``,0#```!`0``W`,```$!
+M```4!````0$``#0$```!`0``.`0```(!```\!````@$``$`$```"`0``1`0`
+M``(!``!(!````@$``%@$```!`0``A`0```%K``"0!````0$``*`$```!`0``
+MK`0```$!``#(!````6L``-0$```!`0``Y`0```$!``#P!````0$```P%```!
+M:P``&`4```$!```T!0```6L``$`%```!`0``7`4```%K``!H!0```0$``(0%
+M```!:P``F`4```$!```H!@```0$``#0&```!`0``0`8```$!``!$!@```0$`
+M`$P&```!`0``4`8```&_``!8!@```0$``&@&```!`0``G`8```$!``"\!@``
+M`0$``-`&```!`0``^`8```$!``#\!@```;\```0'```!`0``%`<```$!``!4
+M!P```0$``&`'```!`0``S`<```$!``#0!P```2$!`/@'```"`@``&`@```$!
+M```<"````2$!`"P(```!:P``2`@```("``!P"````0$``(P(```!`0``G`@`
+M``$!``#H"````6<```@)```!9P``'`D```$!```T"0```0$``#@)```"`0``
+M/`D```(!``!`"0```@$``$0)```"`0``2`D```(!``!,"0```@$``%`)```"
+M`0``5`D```(!``!8"0```@$``%P)```"`0``8`D```(!``!D"0```@$``&@)
+M```"`0``;`D```(!``!P"0```@$``'0)```"`0``>`D```(!``!\"0```@$`
+M`(`)```"`0``A`D```(!``"("0```@$``(P)```"`0``D`D```(!``"4"0``
+M`@$``)@)```"`0``G`D```(!``"@"0```@$``*0)```"`0``J`D```(!``"L
+M"0```@$``+`)```"`0``M`D```(!``"X"0```@$``+P)```"`0``P`D```(!
+M``#("0```0$``/0)```!`0````H```$!```P"@```0$``#P*```!`0``1`H`
+M``$!``!0"@```0$``%0*```"`0``6`H```(!``!<"@```@$``&`*```"`0``
+M;`H```$!``!T"@```0$``'P*```!`0``A`H```$!``"0"@```0$``)P*```!
+M`0``J`H```$!``"T"@```0$``+P*```!`0``P`H```$!``#,"@```0$``-`*
+M```!`0``W`H```$!``#D"@```0$``.P*```!`0``%`L```$!``!`"P```0$`
+M`$0+```!`0``3`L```$!``!0"P```0$``%@+```!`0``7`L```$!``!D"P``
+M`0$``'`+```!`0``=`L```$!``!\"P```0$``(0+```!`0``B`L```$!``"L
+M"P```0$``+@+```!`0``"`P```$!```P#````90!`%P,```!`0``:`P```$!
+M``"4#````0$``)@,```"`0``G`P```(!``"@#````@$``*0,```"`0``J`P`
+M``(!``"L#````@$``+`,```"`0``M`P```(!``"X#````@$``+P,```"`0``
+MP`P```(!``#$#````@$``,@,```"`0``S`P```(!``#0#````@$``-0,```"
+M`0``V`P```(!``#<#````@$``.`,```"`0``Y`P```(!``#H#````@$``.P,
+M```"`0``\`P```(!``#T#````@$``/@,```"`0``_`P```(!````#0```@$`
+M``0-```"`0``"`T```(!```,#0```@$``!`-```"`0``(`T```$!```P#0``
+M`0$``%0-```!`0``7`T```$!``!T#0```0$``(0-```!`0``T`T```$!``#H
+M#0```0$```0.```!`0``%`X```$!```8#@```0$``"P.```!`0``2`X```$!
+M``!8#@```0$``%P.```!`0``=`X```$!``"0#@```0$``,@.```!`0``?`\`
+M``$``0"(#P```0$``)0/```!`0``H`\```$A`0#H#P```@(``"`0```!`0``
+M.!````$!``!$$````2$!`(00```!`0``E!````$!``#($````0$``-@0```!
+M`0``)!$```$!``!`$0```0$``(`1```!`0``C!$```("``#X$0```0$```02
+M```"`@``"!(```("```P$@```0$``-P2```!`0``Z!(```$!``#T$@```0$`
+M``P3```!`0``)!,```$!``!0$P```0$``(`3```!`0``A!,```$!``"H$P``
+M`0$````4```!`0``7!0```$!``"X%````0$``!@5```!`0``0!4```$!``!<
+M%0```0$``&P5```!`0``P!4```'0``#(%0```0$``/05```!`0``8!8```$!
+M``"8%@```0$``-P6```!`0``Z!8```$!```$%P```0$``!@7```!`0``*!<`
+M``$!``"0%P```0$``*`7```!`0``)!@```$!``!8&0```0$``)@9```!`0``
+MG!D```$!``"D&0```0$``*@9```!`0``L!D```$!``"T&0```0$``,`9```!
+M`0``R!D```$!``#H&0```0$``/09```!`0``"!H```$!```8&@```0$``"P:
+M```!`0``.!H```$!```\&@```0$``$@:```!`0``>!H```$!``!\&@```0$`
+M`(@:```!`0``N!H```$!``"\&@```0$``-`:```!(P$`Z!H```$!```P&P``
+M`0$``)`;```!`0``\!L```$!``!4'````0$``+`<```!`0``Z!P```$!```,
+M'0```0$``$@=```!`0``?!T```$!``"$'0```0$``*`=```!`0``J!T```$!
+M``"T'0```0$``/0=```!`0```!X```&%```,'@```0$``'0>```!`0``J!X`
+M``$!``#H'@```0$``!`?```!`0``'!\```$!```D'P```0$``$0?```!`0``
+M2!\```$!``!L'P```0$``'P?```!`0``A!\```$!``"D'P```0$``*@?```!
+M`0``T!\```$!``#<'P```0$``.P?```!`0``$"````$!```P(````0$``%@@
+M```!`0``J"````$!``#X(````0$``"`A```!`0``9"$```$!``"\(0```0$`
+M`!PB```!`0``-"(```$!``!`(@```0$``(0B```!`0``I"(```$!``#H(@``
+M`0$``$@C```!`0``@",```$!``",(P```0$``+@C```!`0``[",```$!``!4
+M)````0$``+PD```!`0``)"4```$!```\)0```0$``$@E```!`0``?"4```$!
+M``"\)0```0$``"0F```!`0``A"8```$!``"H)@```0$``-`F```!`0``Z"8`
+M``$!``!,)P```0$``&@G```!`0``F"<```$!``#P)P```0$``#`H```!`0``
+M1"@```$!``!<*````0$``)0H```!6@``H"@```'0``"L*````0$``+PH```!
+M`0``Q"@```$C`0#H*````0$``/`H```!`0``#"D```$!```<*0```0$``"0I
+M```!`0``3"D```$!``!8*0```2,!`(0I```!`0``C"D```$!``"H*0```0$`
+M`+@I```!`0``P"D```$!``#H*0```0$``/0I```!(P$`("H```$!```H*@``
+M`0$``$0J```!`0``5"H```$!``!<*@```0$``&PJ```!A0``>"H```("``"@
+M*@```0$``*PJ```!`0``L"H```$!``#`*@```0$``,PJ```!`0``V"H```$!
+M```$*P```0$```@K```!`0``$"L```$!```4*P```0$``"`K```!`0``)"L`
+M``$!```\*P```0$``$@K```!`0``9"L```$!``!P*P```0$``(PK```!`0``
+MH"L```$!``#,*P```0$``!@L```!`0``>"P```$!``#$+````0$``!`M```!
+M`0``5"T```$!``!H+0```0$``)`M```!`0``H"T```$!``"T+0```0$``/`M
+M```!`0``#"X```$!```0+@```0$``!@N```!`0``'"X```$!```D+@```0$`
+M`"@N```!`0``1"X```$!``!0+@```0$``&PN```!`0``>"X```$!``"8+@``
+M`0$``+@N```!`0``V"X```$!```$+P```0$```PO```!`0``%"\```$!```8
+M+P```0$``"0O```!`0``."\```$!``!4+P```0$``)0O```!`0``I"\```$!
+M``#,+P```0$``!PP```!`0``*#````$!``!H,````0$``)0P```!`0``K#``
+M``$!``#$,````0$``-0P```!`0``^#````$!```@,0```0$``$0Q```!`0``
+MC#$```$!``"0,0```0$``+`Q```!`0``]#$```$!```\,@```0$``(0R```!
+M`0``V#(```$!```@,P```0$``&0S```!`0``I#,```$!``#$,P```0$``-`S
+M```!`0``U#,```$!``#D,P```0$``/0S```!`0``&#0```$!``"8-````0$`
+M`"@U```!`0``2#4```$!``!H-0```0$``+@U```!`0``X#4```$!````-@``
+M`0$``#@V```!`0``C#8```$!``#<-@```0$``"PW```!`0``D#<```$!``#@
+M-P```0$``/@W```!`0``_#<```$!```$.````0$```@X```!`0``$#@```$!
+M```4.````0$``$`X```!`0``7#@```$!``!\.````0$``*`X```!`0``"#D`
+M``$!``!$.0```0$``(`Y```!`0``T#D```$!```,.@```0$``"0Z```!`0``
+M2#H```$!``!H.@```0$``(0Z```!`0``B#H```$!``"<.@```0$``*0Z```!
+M`0``J#H```$!``#$.@```0$``/`Z```!`0``(#L```$!``!$.P```0$``&P[
+M```!`0``>#L```$!``"@.P```0$``,`[```!`0``R#L```$!``#,.P```0$`
+M`-0[```!`0``V#L```$!``#@.P```0$``.0[```!`0``!#P```$!```4/```
+M`0$``"P\```!`0``4#P```$!``!@/````0$``(`\```!`0``H#P```$!``"P
+M/````0$``,@\```!`0``\#P```$!```H/0```0$``#@]```!`0``=#T```$!
+M``"D/0```0$``,0]```!`0``V#T```$!```0/@```0$``%0^```!`0``=#X`
+M``$!``"`/@```0$``*`^```!`0``N#X```$!``#L/@```0$``#`_```!`0``
+M6#\```$!``!H/P```0$``(0_```!`0``O#\```$!```<0````0$``$!````!
+M`0``=$````$!``"$0````0$``*1````!`0``T$````$!``#T0````0$```1!
+M```!`0``6$$```$!``!L00```0$``(1!```!`0``B$$```$!``"000```0$`
+M`+1!```"`@``N$$```("````0@```0$```A"```!`0``%$(```$!```<0@``
+M`0$``"A"```!`0``,$(```$!```\0@```0$``$1"```!`0``4$(```$!``!L
+M0@```0$``'A"```!`0``"$,```$!```80P```0$``#!#```!`0``5$,```$!
+M``!@0P```0$``&1#```!`0``@$,```$!``",0P```0$``)A#```"!```G$,`
+M``($``"T0P```0$``+A#```!`0``R$,```$!``#T0P```0$``!1$```!`0``
+M($0```$!```L1````0$``#Q$```"!```9$0```$!``!X1````0$``(Q$```!
+M`0``H$0```$!``"H1````0$``.!$```!`0``[$0```$!```$10```0$```Q%
+M```!`0``'$4```$!``!`10```0$``%!%```!`0``5$4```$!``!<10```0$`
+M`&!%```!`0``;$4```$!``!X10```0$``(Q%```!`0``Z$4```$!``#L10``
+M`@0``/Q%```!`0``#$8```$!```<1@```0$``"1&```!`0``3$8```$!``!8
+M1@```0$``&A&```!`0``=$8```($``"D1@```0$``*Q&```!`0``N$8```'I
+M``#,1@```0$``-A&```"!```%$<```$!```81P```@0``%A'```!`0``7$<`
+M``$!``!L1P```0$``'A'```!`0``@$<```$!``"(1P```0$``)!'```!`0``
+MF$<```$!``"D1P```0$``-A'```!`0``X$<```$!``#H1P```0$``/Q'```!
+M`0``,$@```$!``!82````0$``&!(```!`0``:$@```$!``"$2````0$``*A(
+M```!`0``L$@```$!``#\2````@0```!)```"!```+$D```$,``!D20```0$`
+M`'A)```!`0``A$D```$!``#@20```0$``.A)```!`0``_$D```$!```,2@``
+M`0$``!A*```!`0``($H```$!```X2@```0$``$1*```!`0``4$H```$!``!D
+M2@```0$``&Q*```!`0``@$H```$!``"(2@```0$``-Q*```!`0``-$L```$!
+M``!$2P```0$``%!+```!`0``=$L```$!``"`2P```0$``(1+```!`0``C$L`
+M``$!``"42P```0$``)A+```!`0``H$L```$!``"D2P```0$``*Q+```!`0``
+ML$L```$!``"X2P```0$``+Q+```!`0``X$L```$!```$3````0$``"Q,```!
+M`0``5$P```$!``!X3````0$``*1,```!`0``K$P```$!``"\3````0$``,1,
+M```!`0``Z$P```$!````30```0$``!!-```!`0``($T```$!``!$30```0$`
+M`&!-```!`0``?$T```$!``"(30```0$``+1-```!`0``Q$T```$!``#030``
+M`0$``-Q-```!(P$`"$X```$!```@3@```0$``*1/```!`0``N$\```$!``#(
+M3P```0$``-!/```!`0``[$\```$!````4````0$``$!0```!`0``8%````$!
+M``",4````0$``,!0```"`@``Q%````($``#(4````@0``,Q0```"!```T%``
+M``($``#44````@0``.A0```"`@``[%````(!```<40```0$``"Q1```!`0``
+M0%$```$!``!,40```0$``%11```!`0``>%$```$!``"840```0$``+Q1```!
+M`0``R%$```$!``#040```0$``.Q1```!`0``%%(```$``0`<4@```0$``&Q2
+M```!`0``<%(```$!``!\4@```0$``(12```!`0``E%(```$!``"H4@```0$`
+M`+Q2```!`0``T%(```$!``#H4@```0$``/12```!``$`_%(```$!```04P``
+M`0$``$!3```!``$`?%,```$!``"(4P```0$``*13```!`0``Q%,```$!``#0
+M4P```0$``-Q3```!`0``$%0```$!```X5````0$``'Q4```!`0``C%0```$!
+M``"05````0$``)A4```!`0``H%0```$!``"H5````0$``*Q4```!`0``M%0`
+M``$!``#`5````0$``,Q4```!`0``V%0```$!``#<5````0$``.A4```!`0``
+M^%0```$!```$50```0$``!!5```!`0``&%4```$!``!T50```0$``)!5```!
+M`0``N%4```$!``#050```0$``-A5```"!```&%8```$!```T5@```0$``%Q6
+M```!`0``=%8```$!``!\5@```@0``)Q6```!`0``I%8```$!``"P5@```0$`
+M`,!6```!`0``R%8```$!``#<5@```0$``!17```!T```)%<```$!```T5P``
+M`>D``*A7```!/P$`L%<```$!``#$5P```90!`-Q7```!E`$``%@```&1`0`0
+M6````9$!`!Q8```!`0``*%@```&4`0`T6````2\``$Q8```!E`$`8%@```&1
+M`0!P6````2X!`'A8```!`0``C%@```$!``"<6````2X!`*18```!`0``P%@`
+M``$N`0#(6````0$``.A8```!`0``!%D```$N`0`,60```0$``"A9```!`0``
+M.%D```$!``!(60```2X!`%!9```!`0``*%P```$!```P7````0$``$Q<```!
+M+@$`5%P```$!``"`7````0$``)1<```!`0``I%P```&1`0"T7````0$``,A<
+M```!D0$`U%P```&%``#L7````@(``&A=```"?0``B%T```&%```P7@```0$`
+M`*1>```!D0$`M%X```&1`0#$7@```9$!`-1>```!D0$`Y%X```&1`0`<7P``
+M`0$``$Q?```!`0``=%\```%G`0!\7P```C$``(!?```"+`$`G%\```&1`0"H
+M7P```90!`+Q?```!D0$`S%\```&1`0`$8````0$```Q@```!E`$`(&````&1
+M`0`P8````9$!`$!@```!D0$`5&````$!``!<8````90!`&Q@```!D0$`?&``
+M``&1`0"(8````90!`+Q@```!D0$`S&````$!``#88````0$``!!A```!D0$`
+M2&$```&4`0!X80```90!`(!A```!`0``/&(```$!``!(8@```9$!`&!B```!
+M`0``K&(```&1`0"\8@```0$``,QB```!D0$`$&,```$!```@8P```90!`"AC
+M```!`0``6&,```$!``!L8P```9$!`'QC```!D0$`C&,```&1`0"<8P```9$!
+M`*QC```!D0$`O&,```&1`0#,8P```9$!`.!C```!D0$`$&0```$!```@9```
+M`0$``'!D```!D0$`B&0```&1`0#89````0$``.1D```!`0``\&0```$!```(
+M90```0$``-!E```!D0$`X&4```&1`0#P90```9$!``!F```!D0$`$&8```&1
+M`0`D9@```9$!`#1F```!<0``8&8```'I``"`9@```>D``*1F```!Z0``K&8`
+M``("``#49@```90!`.AF```!2@``\&8```$!``#\9@```90!`"!G```!`0``
+M@&<```$H`0"89P```78``+QG```!E`$`W&<```&1`0`$:````90!`!QH```!
+MD0$`2&@```&4`0!D:````9$!`(AH```!`0``D&@```&4`0#,:````90!``1I
+M```!D0$`&&D```%3`0!`:0```90!`$QI```!`0``;&D```&1`0"(:0```90!
+M`+AI```!E`$`P&D```$!``#(:0```0$``-1I```!`0``Y&D```&1`0`P:@``
+M`>D``&AJ```!D0$`E&H```&1`0"<:@```0$``*AJ```!E`$`L&H```$!``"\
+M:@```90!`,QJ```!D0$`#&L```&4`0`<:P```90!`"QK```!E`$`<&L```&4
+M`0"0:P```90!`*!K```!D0$`P&L```&4`0#H:P```90!`/AK```!E`$`-&P`
+M``&4`0!L;````90!`(1L```!E`$`G&P```&4`0"T;````90!`,QL```!E`$`
+M$&T```$!```8;0```24``"!M```!`0``0&T```%?`0!0;0```9$!`(1M```!
+ME`$`E&T```$E``"\;0```24``,1M```!`0``Y&T```&4`0#X;0```5\!`!1N
+M```!D0$`2&X```&4`0!8;@```24``)!N```!`0``F&X```&4`0"H;@```9$!
+M`+AN```!`0``P&X```&4`0#0;@```9$!`!!O```!)0``&&\```$!```X;P``
+M`90!`$QO```!7P$`:&\```&1`0"@;P```90!`+1O```!)0``\&\```$!```$
+M<````1D!`"1P```!`0``+'````$!```P<````0$``$!P```!D0$`8'````$;
+M``",<````3L!`*QP```!E`$`O'````&1`0#$<````0$``-!P```!E`$`X'``
+M``&1`0`$<0```0$```QQ```!E`$`''$```&1`0`D<0```3D!`#AQ```!E`$`
+M0'$```$!``!(<0```3D!`%1Q```!E`$`9'$```&1`0!L<0```0$``'!Q```!
+M`0``>'$```$!``",<0```90!`)QQ```!D0$`S'$```&4`0#<<0```9$!`.1Q
+M```!`0``\'$```&4`0``<@```9$!`#!R```!`0``-'(```$!```\<@```0$`
+M`$!R```!`0``1'(```$!``!,<@```0$``%!R```!`0``5'(```$!``!8<@``
+M`0$``%QR```!`0``C'(```&4`0"P<@```0$``+QR```!`0``P'(```$!``#(
+M<@```0$``-AR```!+0$`Y'(```+T``#H<@```A$``/QR```!E`$`&',```&1
+M`0`T<P```9$!`%1S```!D0$`9',```&4`0!L<P```0$``'QS```!.0$`B',`
+M``$!``"H<P```90!`+AS```!D0$`V',```&4`0#H<P```9$!`!1T```!D0$`
+M)'0```&1`0!,=````0$``%QT```!`0``9'0```&4`0!\=````0$``(1T```!
+ME`$`F'0```&1`0#$=````0$``-1T```!`0``W'0```&4`0#T=````0$``/QT
+M```!E`$`$'4```&1`0`T=0```90!`&!U```!D0$`U'4```$!``!H=@```0$`
+M`'1V```!`0``?'8```&4`0"$=@```0$``-AV```!E`$`-'<```$!``!`=P``
+M`0$``%1W```!`0``8'<```$!``!P=P```0$``%QX```!`0``9'@```$``0!P
+M>````0$``'QX```!`0``@'@```(!``"$>````@$``(AX```"`0``C'@```(!
+M``"0>````@$``)1X```"`0``F'@```(!``"<>````@$``*!X```"`0``J'@`
+M``$!``"T>````90!`,1X```!/P$`S'@```$!```$>0```9$!`"1Y```!D0$`
+M,'D```$!```\>0```0$``$!Y```"`0``1'D```(!``!(>0```@$``$QY```"
+M`0``4'D```(!``!4>0```@$``%AY```"`0``7'D```(!``!@>0```@$``'!Y
+M```!`0``@'D```&1`0"0>0```0$``*!Y```!D0$`L'D```&1`0"\>0```90!
+M`,QY```!D0$`!'H```&1`0`D>@```9$!`#1Z```!D0$`1'H```&1`0!4>@``
+M`9$!`&!Z```!E`$`<'H```&1`0"`>@```9$!`)AZ```!E`$`J'H```&1`0"X
+M>@```9$!`,AZ```!D0$`V'H```&1`0#H>@```9$!`/AZ```!D0$`"'L```&1
+M`0`8>P```9$!`"Q[```!D0$`/'L```&1`0!(>P```;@``%A[```!D0$`:'L`
+M``&1`0!X>P```9$!`(A[```!D0$`F'L```&1`0"H>P```9$!`+A[```!D0$`
+MR'L```&1`0#8>P```9$!`.A[```!D0$`^'L```&1`0`(?````9$!`!A\```!
+MD0$`+'P```$!```X?````0$``$A\```!D0$`5'P```$!``!@?````8D!`&A\
+M```!`0``='P```&4`0"0?````9$!`+Q\```!D0$`R'P```&4`0#L?````9$!
+M`/A\```!E`$`&'T```&1`0`D?0```90!`$A]```!D0$`5'T```&4`0!P?0``
+M`9$!`'Q]```!`0``A'T```$!``"0?0```0$``,!]```!D0$`R'T```$Y`0#4
+M?0```90!`.1]```!D0$`^'T```%*```$?@```98``!!^```!`0``)'X```$!
+M```P?@```5<``#Q^```!`0``4'X```&```!<?@```90!`&Q^```!D0$`@'X`
+M``&#`0"4?@```0H``*A^```!&P$`M'X```$!``#`?@```9$!`'1_```"`@``
+MW'\```&4`0#P?P```0$``/1_```"`0``^'\```(!``#\?P```@$```"````"
+M`0``!(````(!```(@````@$```R````"`0``$(````(!```4@````@$``"B`
+M```!`0``1(````&1`0!<@````0$``'B````!D0$`F(````$!``"T@````0$`
+M`-2````!^P``W(````$!``#L@````0$``/2````!`0``_(````$Y`0`,@0``
+M`0$``!2!```!.0$`1($```'[``!,@0```0$``%B!```!`0``<($```&1`0"`
+M@0```0$``(B!```!`0``D($```$Y`0"@@0```0$``*B!```!`0``L($```$Y
+M`0#`@0```?L``,B!```!`0``V($```$!```(@@```0`!`!2"```!`0``(((`
+M``&4`0`P@@```9$!`#R"```!E`$`4((```&1`0!8@@```3D!`&2"```!E`$`
+M=((```&1`0!\@@```3D!`(B"```!`0``D((```$!``"8@@```3D!`*2"```!
+ME`$`M((```&1`0#`@@```90!`-""```!E`$`X((```&4`0#T@@```9$!`!"#
+M```!D0$`*(,```&1`0`P@P```3D!`#R#```!E`$`3(,```&1`0!4@P```3D!
+M`&2#```!D0$`<(,```&4`0"`@P```9$!`(B#```!.0$`E(,```&4`0"D@P``
+M`9$!`+B#```!2@``R(,```&1`0#8@P```9$!`.B#```!D0$`](,```&6``#\
+M@P```0$```2$```!.0$`$(0```&6```PA````90!`$"$```!D0$`4(0```&1
+M`0"TA````9$!`+R$```!.0$`V(0```%*``#DA````0$``/2$```!D0$`)(4`
+M``$!```PA0```0$``#2%```!`0``8(4```$!``!LA0```0$``'R%```!`0``
+MM(4```$!``"\A0```0$``,B%```!`0``T(4```$!``#@A0```0$``.R%```!
+M`0``*(8```$!```PA@```0$``$"&```!`0``7(8```$!``!@A@```0$``&R&
+M```!`0``C(8```$!``"<A@```0$``,B&```!`0``](8```$E`0"8AP```0$`
+M`+R'```!`0``R(<```$!``#0AP```0$``'2(```!`0``C(@```$!``"DB```
+M`0$``+R(```!`0``S(@```$!```$B0```0$``"")```!`0``2(D```$!``!@
+MB0```0$``(B)```!`0``H(D```$!``#(B0```0$``.")```!`0``4(H```("
+M``!\B@```>D``)"*```!Z0``H(H```$!``"HB@```0$``+B*```!`0``S(H`
+M``$!``#HB@```2\```"+```!`0``&(L```$O```PBP```0$```"-```!+P``
+M((T```$O``!`C0```2\``'"-```!D0$`A(T```$!``"<C0```9$!`*B-```"
+M`@``K(T```("``#HC0```2\``/R-```!D0$`#(X```&1`0!`C@```90!`(".
+M```!E`$`D(X```&1`0"DC@```4H``*R.```!`0``N(X```$Y`0#`C@```5(`
+M`.R.```!`0``_(X```$!```XCP```0$``%2/```!:@$`<(\```$!``"0CP``
+M`1@!`+2/```!`0``N(\```$!``#`CP```0$``,2/```!`0``S(\```$!``#0
+MCP```0$``-B/```!`0``X(\```$!````D````0$``!20```!(P$`()````$!
+M``!(D````0$``%B0```!P```,)$```$!``!4D0```0$``&"1```!`0``=)$`
+M``$!``"$D0```9$!`)21```!D0$`I)$```&1`0#$D0```9$!`-21```!D0$`
+MX)$```&4`0#TD0```9$!``22```!`0``%)(```&1`0`DD@```9$!`#22```!
+MD0$`6)(```&1`0!HD@```9$!`'22```!E`$`B)(```&1`0"8D@```9$!`-22
+M```!D0$`-)0```$!```\E````0$``$24```!E`$`?)0```$!``"`E````@$`
+M`(24```"`0``B)0```(!``",E````@$``)24```!`0``G)0```&1`0#$E```
+M`:,``-24```!4P$`X)0```&4`0#PE````0$``/R4```!`0``")4```%3`0`<
+ME0```9$!`"B5```!4P$`9)4```$!``!HE0```@$``&R5```"`0``<)4```(!
+M``!TE0```@$``("5```!`0``C)4```&1`0"<E0```0$``*B5```!D0$`X)4`
+M``$!``#HE0```0$``/"5```!E`$`,)8```$!```TE@```0$``#R6```!`0``
+M0)8```$!``!,E@```9$!`&"6```!E`$`:)8```$!``!PE@```3D!`'R6```!
+M`0``C)8```&1`0"LE@```4H``$R7```!`0``M)<```$!``#0EP```0$``+R8
+M```!`0``#)D```$!```4F0```0$``&B9```!`0``,)H```$!``#TF@```9$!
+M``B;```!D0$`%)L```$!```@FP```90!`#B;```!+P``>)L```'0``"(FP``
+M`0$``)B;```!Z0``")P```&:`0`4G````0$``"B<```!`0``.)P```&1`0!(
+MG````9$!`%"<```!.0$`7)P```&4`0"`G````0$``(R<```!E`$`G)P```$!
+M``"HG````0$``,R<```!D0$`U)P```$Y`0#@G````0$``/2<```!`0``!)T`
+M``%,`0`,G0```0$``!R=```!`0``-)T```&4`0!(G0```0$``%B=```!3`$`
+M8)T```$!``"$G0```4P!`(R=```!`0``H)T```$!``"PG0```0$``/2=```!
+M`0``4)X```$!``!@G@```7P!`&B>```!`0``=)X```$!``"$G@```0$``)2>
+M```!D0$`G)X```$Y`0"HG@```0$``+R>```!D0$`Q)X```$Y`0#4G@```0$`
+M`-R>```!`0``^)X```%,`0``GP```0$``"B?```!`0``,)\```&$`0!0GP``
+M`4P!`%B?```!`0``@)\```$!``"4GP```0$``*R?```!:0$`Q)\```("```<
+MH````@(``#"@```"U0``6*````$@`0!@H````84``+B@```!E`$`U*````&1
+M`0#@H````90!`.B@```!`0``]*````$!```4H0```9$!`""A```!E`$`**$`
+M``$!```\H0```0$``%"A```!D0$`7*$```$!``!DH0```3D!`'"A```"`@``
+M=*$```("``"4H0```0$``)RA```!`0``K*$```$!```8H@```0$``"2B```!
+MX```/*(```$!``#XH@```0$```RC```!3`$`%*,```$!``"0HP```9$!`*"C
+M```!D0$`L*,```&1`0#`HP```9$!`-"C```!D0$`#*0```$!```0I````@$`
+M`!2D```"`0``&*0```(!```<I````@$``""D```"`0``)*0```(!```HI```
+M`@$``"RD```"`0``,*0```(!``!`I````0$``(2D```!D@$`E*0```(Q``"8
+MI````BP!`+2D```!D0$`P*0```&4`0#4I````9$!`.2D```!D0$`'*4```$!
+M```DI0```90!`#2E```!D0$`1*4```&1`0!4I0```9$!`&BE```!`0``<*4`
+M``&4`0"`I0```9$!`)"E```!D0$`G*4```&4`0#0I0```9$!`/RE```!D0$`
+M"*8```&4`0`LI@```9$!`&BF```!E`$`E*8```&4`0"<I@```0$``.RF```!
+M`0``$*<```$!```DIP```90!`#BG```!E`$`3*<```&4`0!@IP```90!`'2G
+M```!E`$`W*<```$!``#HIP```9$!`/2G```!E`$`!*@```$!``!@J````9$!
+M`'"H```!`0``@*@```&1`0#$J````0$``-2H```!E`$`W*@```$!```,J0``
+M`0$``""I```!D0$`,*D```&1`0!`J0```9$!`%"I```!D0$`8*D```&1`0!P
+MJ0```9$!`("I```!D0$`E*D```&1`0#$J0```0$``-RI```!`0``+*H```&1
+M`0!$J@```9$!`(RJ```!`0``F*H```$!``"<J@```0$``*2J```!`0``J*H`
+M``$!``"PJ@```0$``+2J```!`0``O*H```$!``#(J@```0$``-BJ```!`0``
+M[*H```$!``#TJ@```0$``+2K```!D0$`Q*L```&1`0#4JP```9$!`.2K```!
+MD0$`]*L```&1`0`(K````9$!`!BL```!S@``1*P```'I``!DK````>D``(BL
+M```!Z0``D*P```("``"\K````9$!`,RL```!D0$`X*P```%*``#HK````0$`
+M`/2L```!E`$`)*T```$!``!@K0```0$``,BM```!Y0``U*T```&4`0#DK0``
+M`9$!`/"M```!10$`!*X```$W```HK@```90!`$"N```!D0$`:*X```&4`0"`
+MK@```9$!`*RN```!E`$`R*X```&1`0#LK@```0$``/2N```!E`$`+*\```&4
+M`0!,KP```9$!`&"O```!"0$`B*\```&4`0"LKP```9$!`+BO```"`@``X*\`
+M``'I```8L````9$!`$2P```!D0$`@+````&4`0"0L````90!`*"P```!E`$`
+MY+````&4`0`$L0```90!`!2Q```!D0$`-+$```&4`0!<L0```90!`&RQ```!
+ME`$`I+$```&4`0"\L0```0$``/2Q```!E`$`#+(```&4`0`DL@```90!`#RR
+M```!E`$`5+(```&4`0"8L@```0$``*"R```!)0``J+(```$!``#$L@```5\!
+M`-2R```!D0$`"+,```&4`0`8LP```24``$"S```!)0``2+,```$!``!HLP``
+M`90!`'RS```!7P$`F+,```&1`0#,LP```90!`-RS```!)0``%+0```$!```<
+MM````90!`"RT```!D0$`/+0```$!``!$M````90!`%2T```!D0$`E+0```$E
+M``"<M````0$``+RT```!E`$`T+0```%?`0#LM````9$!`"2U```!E`$`.+4`
+M``$E``!TM0```90!`)2U```!E`$`N+4```&1`0#LM0```0$```"V```!X0``
+M(+8```$!```HM@```0$``#"V```!`0``1+8```$9`0!DM@```0$``'2V```!
+MD0$`C+8```$;``"XM@```3L!`-RV```!`0``Y+8```&4`0#TM@```9$!`/RV
+M```!.0$`$+<```&4`0`8MP```0$``""W```!.0$`++<```&4`0`\MP```9$!
+M`$2W```!`0``2+<```$!``!0MP```0$``&2W```!E`$`=+<```&1`0"DMP``
+M`90!`+2W```!D0$`O+<```$!``#(MP```90!`-BW```!D0$``+@```&4`0`0
+MN````9$!`!BX```!`0``)+@```&4`0`TN````9$!`&2X```!`0``:+@```$!
+M``!PN````0$``'2X```!`0``>+@```$!``"`N````0$``(2X```!`0``B+@`
+M``$!``",N````0$``)"X```!`0``P+@```&4`0#DN````0$``.BX```!`0``
+M\+@```$!``#TN````0$``/RX```!`0```+D```$!```(N0```0$``!"Y```!
+M`0``&+D```$!```HN0```2T!`#2Y```"O0``.+D```(+`0`\N0```O```%"Y
+M```!E`$`;+D```&1`0"(N0```9$!`*BY```!D0$`O+D```%*``#DN0```90!
+M`/2Y```!D0$`%+H```&4`0`DN@```9$!`%"Z```!D0$`8+H```&1`0"(N@``
+M`0$``)BZ```!`0``H+H```&4`0"XN@```0$``,"Z```!E`$`U+H```&1`0``
+MNP```0$``!"[```!`0``&+L```&4`0`PNP```0$``#B[```!E`$`3+L```&1
+M`0!PNP```90!`)"[```!D0$`!+P```$!``"4O````0$``*"\```!`0``J+P`
+M``&4`0"PO````0$``"B]```!`0``-+T```$!``!`O0```0$``%"]```!`0``
+M2+X```$!``!0O@```0$``&2^```!`0``<+X```$!``!XO@```0$``(R^```!
+M`0``F+X```$``0"DO@```0$``+2^```!`0``N+X```(!``"\O@```@$``,"^
+M```"`0``Q+X```(!``#(O@```@$``,R^```"`0``T+X```(!``#4O@```@$`
+M`-B^```"`0``X+X```$!``#LO@```0$``/B^```!E`$`"+\```&4`0`<OP``
+M`0$``"B_```!E`$`,+\```$!``!(OP```90!`%B_```!`0``D+\```&4`0"L
+MOP```90!`,"_```!E`$`W+\```&4`0#LOP```90!`/R_```!F@$`!,````$!
+M```4P````0$``!C````!`0``(,````$!```DP````0$``#3````!`0``2,``
+M``$!``!4P````0$``(3````!D0$`D,````$!``"<P````0$``*S````!`0``
+MV,````$O``#HP````2\``%#!```!D0$`7,$```$!``!HP0```0$``(S!```!
+MD0$`F,$```$!``"XP0```9$!`,3!```!`0``W,$```$!``#HP0```0$``/C!
+M```!D0$`!,(```$!```0P@```0$``!S"```!E`$`-,(```&1`0!$P@```9$!
+M`%3"```!D0$`8,(```&4`0!PP@```9$!`'S"```!`0``C,(```&1`0"<P@``
+M`9$!`*S"```!`0``O,(```&1`0#`P@```0$``-S"```!D0$`Z,(```$!```@
+MPP```9$!`$C#```!D0$`5,,```$!``!@PP```90!`'##```!D0$`@,,```&1
+M`0"0PP```9$!`*##```!D0$`V,,```&1`0#XPP```9$!``S$```!D0$`',0`
+M``&1`0`HQ````0$``#C$```!`0``1,0```&4`0!4Q````9$!`&#$```!)`$`
+M:,0```$!``!TQ````0$``(#$```!`0``C,0```&4`0"HQ````9$!`+3$```!
+M`0``P,0```$!``#(Q````0$``-S$```!`0``Z,0```$!``#XQ````9$!``C%
+M```!D0$`%,4```&4`0!(Q0```3D!`%3%```!E`$`9,4```&1`0!XQ0```4H`
+M`(3%```!'0``C,4```$!``"DQ0```0$``+3%```!`0``Q,4```&1`0#LQ0``
+M`9$!`/C%```!`0``",8```$0`0`4Q@```0$``"3&```!D0$`-,8```&1`0!$
+MQ@```9$!`%#&```!E`$`8,8```&1`0!PQ@```9$!`(C&```!E`$`F,8```&1
+M`0"DQ@```0$``+#&```!E`$`P,8```&1`0#@Q@```5$``.S&```!E`$`_,8`
+M``&1`0`0QP```9P``"3'```!UP``.,<```$X``!$QP```0$``%#'```!D0$`
+MK,<```($``"PQP```@(``+3'```"`@``N,<```("``!LR````0$``(S(```!
+M6@$`E,@```$!``"@R````0$``*C(```!`0``L,@```$Y`0#@R````5H!`.C(
+M```!`0``],@```$!``#XR````0$```#)```!`0``",D```$!```,R0```0$`
+M`!3)```!`0``&,D```$!```@R0```0$``"3)```!`0``+,D```$!```PR0``
+M`0$``$#)```!D0$`4,D```&1`0!@R0```9$!`&C)```!.0$`;,D```$!``!\
+MR0```9$!`(S)```!`0``G,D```&1`0"DR0```3D!`+3)```!`0``U,D```&1
+M`0#DR0```0$``/3)```!D0$`_,D```$Y`0`,R@```9$!`!C*```!`0``(,H`
+M``$!```HR@```3D!`#C*```!6@$`0,H```$!``!,R@```0$``(#*```!``$`
+MC,H```$!``"<R@```0$``*C*```!E`$`L,H```$!``#`R@```90!`-#*```!
+ME`$`X,H```&4`0`,RP```0$``!C+```!)0$`*,L```$E`0`XRP```90!`%#+
+M```!D0$`7,L```$!``!DRP```0$``(S+```!'0``E,L```$!``"<RP```3D!
+M`*C+```!'0``L,L```$!``#0RP```0$``##,```!E`$`0,P```&1`0!(S```
+M`3D!`&3,```!2@``<,P```$!``"`S````9$!`*C,```!BP``P,P```$!``#D
+MS````2\```3-```!`0``#,T```$!```@S0```2\``"S-```!`0``2,T```$O
+M``!XS0```9$!`)3-```!D0$`J,T```("``#(S0```90!`!#.```!E`$`/,X`
+M``&1`0!(S@```90!`%C.```!D0$`>,X```&4`0"`S@```0$``(C.```!.0$`
+ME,X```$!``"8S@```0$``*#.```!`0``L,X```$!``#4S@```0$``-C.```!
+M`0``X,X```$!``#DS@```0$``/#.```!`0``],X```$!``#\S@```0$``$3/
+M```!`0``3,\```$!``!8SP```90!`&#/```!`0``P,\```$!``#$SP```7,!
+M`,S/```!`0``W,\```$!``#DSP```0$``/S/```!`0``)-````$!``!`T```
+M`90!`%#0```!D0$`7-````("``"`T````0$``)30```!`0``O-````("``#T
+MT````0$``/C0```!`0```-$```$!```$T0```0$```S1```!`0``--$```$!
+M``!8T0```0$``'S1```!`0``F-$```$!```@T@```0$``$32```!`0``?-(`
+M``$!``"@T@```2\``,C2```!+P``Z-(```$O```,TP```2\``"S3```!+P``
+M>-,```&1`0"$TP```0$``,S3```"!```'-0```$!```@U````0$``"C4```!
+M`0``+-0```$!```XU````0$``#S4```!`0``1-0```$!``#$U````0$``,C4
+M```!`0``T-0```$!``#4U````0$``-S4```!`0``Y-0```$!```$U0```9$!
+M`!35```!D0$`>-4```$!``!\U0```0$``(35```!`0``B-4```$!``"0U0``
+M`0$``)S5```!E`$`P-4```&1`0#$U0```0$``,S5```!`0``U-4```$!``#H
+MU0```0$``/35```!E`$`!-8```$!```0U@```90!`#C6```!D0$`3-8```'A
+M``!LU@```9$!`'C6```!E`$`I-8```&1`0"PU@```90!`-36```!D0$`X-8`
+M``&4`0`8UP```9$!`$C7```!D0$`5-<```&4`0!TUP```9$!`(#7```!E`$`
+MI-<```&1`0"\UP```0$``-#7```!`0``X-<```$!```DV````90!`$#8```!
+MD0$`P-@```&1`0#XV````0$``/S8```!`0``!-D```$!```(V0```0$``!#9
+M```!`0``2-D```$!``"`V0```0$``+C9```!`0``T-D```$!``#@V0```10`
+M`/39```!`0``#-H```$!```@V@```0$``#3:```!`0``3-H```$!``"DV@``
+M`2,!`+#:```!(P$`Z-H```$!```0VP```0$``"3;```!`0``1-L```$!``!D
+MVP```0$``)C;```!`0``S-L```$!``#@VP```0$``!3<```!`0``;-P```$!
+M``"HW````0$``,C<```!`0``\-P```$!```@W0```0$``&#=```!`0``K-T`
+M``$!``"TW0```0$``-S=```!`0``)-X```&1`0`\W@```0$``$3>```"!0``
+M2-X```(%``!,W@```@4``-#>```!`0``\-X```$6`0`$WP```0$``!S?```!
+M`0``/-\```$!``!<WP```0$``&C?```!`0``@-\```$!``"4WP```0$``*3?
+M```!`0``L-\```$!``#$WP```0$``.#?```!`0``$.````$!```LX````0$`
+M`#C@```!`0``:.````$!``!\X````0$``)C@```!`0``I.````$!``"LX```
+M`0$``+3@```!`0``S.````$!``#0X````0$``-S@```!`0``X.````(!``#D
+MX````@$``.C@```"`0``[.````(!``#PX````@$``/3@```"`0``^.````(!
+M``#\X````@$``"#A```!`0``1.$```$!``!HX0```0$``+#A```!`0``T.$`
+M``$!``#DX0```0$``!SB```!`0``@.(```$!``#XX@```9$!`$CC```!D0$`
+M5.,```%N``!LXP```@4``(#C```"`@``Q.,```$!``#,XP```0$``/#C```!
+M`0``#.0```$!```HY````0$``$#D```!`0``6.0```$!``!\Y````0$``)SD
+M```!`0``L.0```$!``#,Y````0$``.SD```!`0``*.4```$!```TY0```0$`
+M`$CE```!`0``5.4```$!``"$Y0```0$``*#E```!`0``Z.4```$!``#XY0``
+M`0$``!#F```!)0$`(.8```$!```PY@```0$``#3F```!`0``0.8```$!``!,
+MY@```0$``'SF```!)0$`^.8```$!```0YP```0$``$SG```!`0``;.<```$!
+M``"0YP```0$``)SG```!`0``W.<```$!``#HYP```0$``/CG```!`0``$.@`
+M``$!``!8Z````@(``'#H```!`0``C.@```$!``#0Z````0$``"#I```!D0$`
+M9.D```$!``!TZ0```0$``(#I```!E`$`B.D```$!``"@Z0```0$``*CI```!
+M`0``M.D```$!``"\Z0```0$``,CI```!`0``T.D```$!``#<Z0```0$```SJ
+M```!`0``-.H```$!``!8Z@```0$``&#J```!`0``@.H```$!``",Z@```0$`
+M`-CJ```!`0``X.H```$!``#XZ@```0$``!#K```!`0``,.L```$!``!,ZP``
+M`0$``)3K```!`0``J.L```$!``"\ZP```@(``,#K```"`@``0.P```&4`0!4
+M[````0$``%CL```"`0``7.P```(!``!@[````@$``&3L```"`0``:.P```(!
+M``!L[````@$``'#L```"`0``=.P```(!``!X[````@$``(SL```!`0``J.P`
+M``&1`0#([````9$!`.CL```!`0``!.T```'V```4[0```0D!`"#M```!E`$`
+M..T```$!``!$[0```0$``%#M```!"0$`=.T```&1`0"`[0```0D!`)SM```!
+M`0``N.T```%J`0#4[0```0$``/3M```!&`$`&.X```$!```<[@```0$``"3N
+M```!`0``*.X```$!```P[@```0$``#3N```!`0``/.X```$!``!$[@```0$`
+M`%CN```!`0``?.X```$!``"0[@```2,!`)SN```!`0``S.X```$!``#<[@``
+M`6,``"CO```!D0$`6.\```&1`0!D[P```90!`(SO```!D0$`R.\```$!``#L
+M[P```0$``%CP```!`0``G/````$!``#`\````0$``-CP```!`0``X/````$!
+M``#T\````0$```3Q```!`0``%/$```$!``!,\0```9$!`'3Q```!D0$`A/$`
+M``&1`0"0\0```0$``*#Q```!D0$`K/$```$!``#(\0```9$!`-CQ```!E`$`
+M_/$```&1`0`(\@```0$``"#R```!D0$`+/(```$!``!(\@```9$!`%3R```!
+M`0``9/(```&4`0!T\@```9$!`(#R```!`0``E/(```&4`0"D\@```9$!`+#R
+M```!`0``Q/(```&4`0#4\@```9$!`.#R```!`0``Z/(```$!``#L\@```0$`
+M``#S```!E`$`$/,```&1`0`L\P```0$``$#S```!E`$`5/,```&1`0"8\P``
+M`9$!`+CS```!D0$`Q/,```$!``#8\P```90!`.CS```!D0$`T/0```$!``#D
+M]````BP!`.CT```",0``\/0```+"```<]0```90!`#CU```!D0$`7/4```&1
+M`0"$]0```90!`(SU```!`0``F/4```&4`0#0]0```9$!`.3U```!>0$`[/4`
+M``$!``#T]0```3D!``#V```!`0``$/8```&1`0#(]@```0$``+#W```!`0``
+M`/@```$!```(^````0$``%SX```!`0``*/D```$!``!4^@```9$!`&3Z```!
+MD0$`=/H```&1`0"$^@```9$!`)3Z```!D0$`I/H```&1`0"T^@```9$!`,3Z
+M```!D0$`U/H```&1`0#D^@```9$!`##[```!D0$`1/L```&1`0!0^P```0$`
+M`%S[```!E`$`=/L```$O``!,_````0$``%C\```!M```8/P```("``!D_```
+M`@(``&C\```"`@``;/P```("``"\_````>D``'C]```!Z0``B/T```("``#$
+M_0```@(``.C]```!`0``^/T```$!```<_@```0$``"#^```"`@``4/X```'0
+M``!<_@```0$``'S^```!)@``D/X```&%`0"8_@```0$``*3^```!E`$`S/X`
+M``$!``#4_@```0$``.#^```!CP$`Z/X```$!``#P_@```0$``/S^```!E`$`
+M$/\```$!```8_P```0$``"C_```!`0``,/\```$!```X_P```1H``$3_```!
+M`0``4/\```$!``!<_P```90!`&S_```!D0$`?/\```&1`0"(_P```4,``)S_
+M```!`0``H/\```$!``"H_P```0$``+#_```!`0``N/\```$!``"\_P```0$`
+M`,3_```!`0``S/\```$!``#<_P```0$``.C_```!`0`````!``$!```<``$`
+M`0$``"@``0`!`0``,``!``$!```X``$``0$``$@``0`!`0``8``!``$!``!H
+M``$``0$``'```0`!`0``@``!``$!``"8``$``0$``*0``0`!`0``M``!``&.
+M`0"\``$``0$``-```0`!`0``Z``!``&4`0#X``$``0$````!`0`!`0``#`$!
+M``$!```4`0$``0$``"0!`0`!`0``+`$!``$!```\`0$``8X!`$0!`0`!`0``
+M8`$!``&.`0!H`0$``0$``'@!`0`!`0``E`$!``&.`0"H`0$``0$``+@!`0`!
+M`0``R`$!``&.`0#0`0$``0$``.0!`0`!`0``]`$!``$!```X`@$``0$``)P"
+M`0`!`0``K`(!``%\`0"T`@$``0$``,@"`0`!`0``U`(!``$!``#<`@$``0$`
+M`.0"`0`!`0``]`(!``$!```P`P$``0$``$0#`0`!`0``5`,!``&1`0!<`P$`
+M`3D!`&@#`0`!0P``?`,!``&1`0"$`P$``3D!`)0#`0`!`0``G`,!``$!``"L
+M`P$``8X!`+0#`0`!`0``T`,!``$S`0#8`P$``0$``.0#`0`!`0``[`,!``$!
+M``#T`P$``0$```0$`0`!`0``$`0!``''```4!`$``0$``"0$`0`!`0``,`0!
+M``&G```T!`$``0$``$P$`0`!`0``6`0!``&,`0!<!`$``0$``&@$`0`!<0$`
+M<`0!``$!``"$!`$``1T!`*0$`0`!C@$`K`0!``$!``#4!`$``0$``.@$`0`!
+M`0``\`0!``$!```,!0$``8(``&0%`0`"`@``:`4!``("``"T!0$``7,``-0%
+M`0`!1```Y`4!``&%`0#T!0$``2`!`/P%`0`!A0``6`8!``&4`0!T!@$``9$!
+M`(`&`0`!E`$`B`8!``$!``"4!@$``0$``+0&`0`!D0$`P`8!``&4`0#(!@$`
+M`0$``-P&`0`!`0``\`8!``&1`0#\!@$``0$```0'`0`!.0$`$`<!``("```4
+M!P$``@(``#0'`0`!`0``/`<!``$!``!,!P$``0$``%P'`0`!`0``S`<!``$!
+M``#D!P$``0$```P(`0`!`0``&`@!``$!```H"`$``0$``%`(`0`!`0``9`@!
+M``$!``"$"`$``0$``+`(`0`!`0``]`@!``$!```("0$``0$``$@)`0`!`0``
+M6`D!``$!``!@"0$``0$``&@)`0`!`0``<`D!``$!``"`"0$``0$``(@)`0`!
+M`0``S`D!``$!``#8"0$``0$``-P)`0`!`0``[`D!``$!``!\"@$``0$``(@*
+M`0`!`0``F`H!``$!``#@"@$``0$``#@+`0`!`0``2`L!``$!``"8"P$``0$`
+M`*@+`0`!`0``M`L!``$!``!$#`$``0$``&0,`0`!`0``I`P!``$!``"T#`$`
+M`0$``,`,`0`!`0``2`T!``&M``!H#0$``I`!`&P-`0`"`0``D`T!``&1`0"@
+M#0$``9$!`+`-`0`!D0$`P`T!``&1`0#,#0$``0$``-@-`0`!K0````X!``&1
+M`0`0#@$``9$!`%`.`0`!`0``5`X!``(!``!8#@$``@$``%P.`0`"`0``8`X!
+M``(!``!D#@$``@$``&@.`0`"`0``;`X!``(!``!P#@$``@$``'0.`0`"`0``
+MA`X!``$!``#(#@$``9,``-@.`0`",0``W`X!``(L`0#X#@$``9$!``0/`0`!
+ME`$`&`\!``&1`0`H#P$``9$!`&`/`0`!`0``:`\!``&4`0!X#P$``9$!`(@/
+M`0`!D0$`F`\!``&1`0"L#P$``0$``+0/`0`!E`$`Q`\!``&1`0#4#P$``9$!
+M`.`/`0`!E`$`%!`!``&1`0!`$`$``9$!`)`0`0`!D0$`L!`!``&1`0#($`$`
+M`9$!`!P1`0`!D0$`+!$!``&1`0!`$0$``4H``$@1`0`!`0``5!$!``&4`0"(
+M$0$``90!`*`1`0`!D0$`R!$!``&4`0#@$0$``9$!``P2`0`!E`$`*!(!``&1
+M`0!,$@$``0$``%02`0`!E`$`D!(!``&4`0#$$@$``9$!`-@2`0`!V```^!(!
+M``&4`0`P$P$``90!`#@3`0`!`0``1!,!``&4`0!P$P$``90!`'P3`0`!`0``
+MO!,!``$!``#4$P$``90!``04`0`!E`$`+!0!``$!``!8%`$``0$``&P4`0`!
+ME`$`@!0!``&4`0"4%`$``90!`*@4`0`!E`$`O!0!``&4`0`H%0$``0$``#05
+M`0`!D0$`0!4!``&4`0!4%0$``0$``*05`0`!`0``W!4!``&1`0#H%0$``90!
+M`/P5`0`!D0$`#!8!``$!```<%@$``9$!`'`6`0`!`0``@!8!``&4`0"(%@$`
+M`0$``,06`0`!`0``X!8!``&4`0#X%@$``9$!``@7`0`!D0$`&!<!``&1`0`H
+M%P$``9$!`#@7`0`!D0$`2!<!``&1`0!8%P$``9$!`&P7`0`!D0$`=!<!``$!
+M``"$%P$``0$``*07`0`!D0$`M!<!``&1`0#$%P$``9$!`-@7`0`!D0$`%!@!
+M``$!```L&`$``0$``'@8`0`!D0$`D!@!``&1`0#P&`$``0$````9`0`!`0``
+M!!D!``(!```(&0$``@$```P9`0`"`0``$!D!``(!```4&0$``@$``!@9`0`"
+M`0``(!D!``$!```T&0$``0$``#@9`0`!`0``4!D!``$!``!D&0$``0$``&@9
+M`0`!`0``=!D!``$!``"`&0$``0$``(P9`0`!`0``H!D!``$!``"L&0$``0$`
+M`&`:`0`!`0``<!H!``$!``"<&@$``9$!`+`:`0`!D0$`P!H!``&1`0#0&@$`
+M`9$!`.`:`0`!D0$`]!H!``&1`0`$&P$``2D!`%P;`0`!`0``L!L!``&1`0#`
+M&P$``9$!`-`;`0`!D0$`X!L!``&1`0#P&P$``9$!```<`0`!D0$`$!P!``&1
+M`0`D'`$``9$!`$`<`0`!D0$`5!P!``&1`0!8'`$``0$``'0<`0`!D0$`A!P!
+M``&1`0"4'`$``9$!`*0<`0`!D0$`M!P!``&1`0#('`$``9$!`-@<`0`!*0$`
+M$!T!``'I```P'0$``>D``%P=`0`!Z0``@!T!``'I``"X'0$``9$!`-@=`0`!
+MD0$`&!X!``$!``!8'@$``0$``(P>`0`!`0``H!X!``$!```<'P$``90!`"P?
+M`0`!D0$`?!\!``&4`0"@'P$``9$!`*P?`0`"`@``U!\!``'I```,(`$``9$!
+M`#@@`0`!D0$`="`!``&4`0"$(`$``90!`)0@`0`!E`$`V"`!``&4`0#X(`$`
+M`90!``PA`0`!D0$`'"$!``&1`0!$(0$``0$``%`A`0`!`0``9"$!``$!``!\
+M(0$``0$``)0A`0`!`0``H"$!``&4`0"H(0$``0$``+@A`0`!`0``R"$!``&1
+M`0#<(0$``9$!```B`0`!E`$`*"(!``&4`0`X(@$``90!`'`B`0`!E`$`B"(!
+M``$!``#`(@$``90!`-@B`0`!E`$`\"(!``&4`0`((P$``90!`"`C`0`!E`$`
+M8",!``&4`0"`(P$``90!`*0C`0`!D0$`V",!``$!``#L(P$``0X``"`D`0`!
+M`0``*"0!``$E```P)`$``0$``%`D`0`!7P$`8"0!``&1`0"4)`$``90!`*0D
+M`0`!)0``S"0!``$E``#4)`$``0$``/0D`0`!E`$`""4!``%?`0`D)0$``9$!
+M`%@E`0`!E`$`:"4!``$E``"@)0$``0$``*@E`0`!E`$`N"4!``&1`0#()0$`
+M`0$``-`E`0`!E`$`X"4!``&1`0`@)@$``24``"@F`0`!`0``2"8!``&4`0!<
+M)@$``5\!`'@F`0`!D0$`L"8!``&4`0#$)@$``24``/@F`0`!`0``#"<!``&1
+M`0`@)P$``9$!`&`G`0`!`0``;"<!``$!``"$)P$``0$``(PG`0`!7P$`G"<!
+M``$!``#$)P$``0$``-@G`0`!`0```"@!``$!```\*`$``9$!`$PH`0`!D0$`
+M8"@!``&1`0",*`$``20``.0H`0`!%@``["@!``$!``#\*`$``9$!`"0I`0`!
+MD0$`,"D!``&4`0!$*0$``9$!`%0I`0`!D0$`8"D!``&4`0!P*0$``9$!`(`I
+M`0`!`0``B"D!``$!``"0*0$``0$``)@I`0`!`0``J"D!``$!``"X*0$``9$!
+M`,@I`0`!D0$`V"D!``&1`0#H*0$``9$!`/0I`0`!E`$``"H!``$!```0*@$`
+M`9$!`"`J`0`!D0$`,"H!``&1`0!`*@$``9$!`$PJ`0`!E`$`7"H!``&1`0!L
+M*@$``90!`'PJ`0`!D0$`B"H!``&4`0"8*@$``9$!`*@J`0`!D0$`N"H!``&1
+M`0#(*@$``9$!`-@J`0`!D0$`Z"H!``&1`0`0*P$``9$!`!PK`0`!E`$`2"L!
+M``$!``"`*P$``18``(@K`0`!`0``E"L!``&4`0"D*P$``9$!`+`K`0`!E`$`
+MP"L!``&1`0#0*P$``9$!`-PK`0`!E`$`""P!``&1`0`8+`$``9$!`"@L`0`!
+MD0$`."P!``&1`0!(+`$``9$!`%@L`0`!D0$`@"P!``&1`0#(+`$``0$``-PL
+M`0`!`0``\"P!``("```<+0$``0$``"`M`0`"`0``)"T!``(!```H+0$``@$`
+M`"PM`0`"`0``,"T!``(!```T+0$``@$``#@M`0`"`0``/"T!``(!``!`+0$`
+M`@$``$0M`0`"`0``2"T!``(!``!,+0$``@$``%`M`0`"`0``5"T!``(!``!8
+M+0$``@$``%PM`0`"`0``8"T!``(!``!D+0$``@$``&@M`0`"`0``;"T!``(!
+M``!P+0$``@$``'0M`0`"`0``>"T!``(!``!\+0$``@$``(`M`0`"`0``A"T!
+M``(!``"(+0$``@$``(PM`0`"`0``D"T!``(!``"8+0$``0$``)PM`0`!`0``
+MI"T!``$!``"L+0$``0$``+0M`0`!`0``N"T!``$!``#$+0$``0$``,PM`0`!
+M`0``X"T!``$!``#H+0$``0$``/PM`0`!`0```"X!``$!```H+@$``0$``"PN
+M`0`!`0``/"X!``$!``!,+@$``0$``%0N`0`!`0``7"X!``&4`0"$+@$``0$`
+M`)0N`0`!`0``F"X!``$!``"H+@$``0$``+`N`0`!`0``M"X!``$!``#4+@$`
+M`0$``.0N`0`!`0``Z"X!``$!``#P+@$``0$``/@N`0`!`0``%"\!``$!```H
+M+P$``0$``"PO`0`!`0``4"\!``$!``!D+P$``0$``'`O`0`!`0``="\!``(!
+M``!X+P$``@$``'PO`0`"`0``@"\!``(!``"$+P$``@$``(@O`0`"`0``C"\!
+M``(!``"<+P$``0$``*`O`0`!B0``J"\!``$!``#`+P$``0$``,0O`0`"`0``
+MR"\!``(!``#,+P$``@$``-`O`0`"`0``U"\!``(!``#<+P$``0$``.0O`0`!
+M`0``["\!``$!``#T+P$``0$``/PO`0`!`0``$#`!``$9`0!D,`$``0$``&@P
+M`0`"`0``;#`!``(!``!P,`$``@$``'0P`0`"`0``>#`!``(!``!\,`$``@$`
+M`(`P`0`"`0``A#`!``(!``"(,`$``@$``(PP`0`"`0``D#`!``(!``"4,`$`
+M`@$``)@P`0`"`0``G#`!``(!``"@,`$``@$``*0P`0`"`0``J#`!``(!``"L
+M,`$``@$``+`P`0`"`0``M#`!``(!``"X,`$``@$``+PP`0`"`0``P#`!``(!
+M``#$,`$``@$``,@P`0`"`0``S#`!``(!``#0,`$``@$``-0P`0`"`0``^#`!
+M``$!```(,0$``0$``#PQ`0`!D0$`4#$!``&4`0!H,0$``0$``'PQ`0`!`0``
+MD#$!``$!``"P,0$``0$``,PQ`0`!`0``Y#$!``$!```,,@$``0$``!0R`0`!
+M`0``*#(!``&@``!`,@$``0$``&`R`0`!`0``=#(!``$;``"<,@$``@(``,`R
+M`0`!.P$`Y#(!``$!``#L,@$``90!`/PR`0`!D0$`!#,!``$Y`0`8,P$``90!
+M`"`S`0`!`0``*#,!``$Y`0`T,P$``90!`$0S`0`!D0$`3#,!``$!``!0,P$`
+M`0$``%@S`0`!`0``;#,!``&4`0!\,P$``9$!`*PS`0`!E`$`O#,!``&1`0#$
+M,P$``0$``-`S`0`!E`$`Y#,!``&1`0`,-`$``90!`!PT`0`!D0$`)#0!``$!
+M```P-`$``90!`$0T`0`!D0$`=#0!``$!``!X-`$``0$``(`T`0`!`0``A#0!
+M``$!``"(-`$``0$``)`T`0`!`0``E#0!``$!``"8-`$``0$``)PT`0`!`0``
+MH#0!``$!``#0-`$``90!`/0T`0`!`0``^#0!``$!````-0$``0$```0U`0`!
+M`0``##4!``$!```0-0$``0$``!@U`0`!`0``'#4!``$!```D-0$``0$``"@U
+M`0`!`0``,#4!``$!```T-0$``0$``#PU`0`!`0``1#4!``$!``!(-0$``0$`
+M`%PU`0`!`0``:#4!``$!``!\-0$``0$``(`U`0`!`0``B#4!``$!``"0-0$`
+M`0$``)@U`0`!`0``H#4!``$!``"H-0$``0$``+`U`0`!`0``N#4!``$!``#(
+M-0$``2T!`-0U`0`"+```W#4!``*K``#@-0$``D\!`.0U`0`"T@``Z#4!``(5
+M``#L-0$``EP!`/`U`0`"V0``]#4!``+D```(-@$``90!`"0V`0`!D0$`0#8!
+M``&1`0!@-@$``9$!`'0V`0`!2@``G#8!``&4`0"L-@$``9$!`+0V`0`!,```
+MP#8!``'=``#@-@$``90!`/`V`0`!D0$`^#8!``&$```D-P$``9$!`#0W`0`!
+MD0$`7#<!``$!``!L-P$``0$``'0W`0`!E`$`C#<!``$!``"4-P$``90!`*@W
+M`0`!D0$`U#<!``$!``#D-P$``0$``.PW`0`!E`$`!#@!``$!```,.`$``90!
+M`"`X`0`!D0$`2#@!``&4`0!8.`$``90!`*0X`0`!D0$`S#@!``&1`0#4.`$`
+M`0$``.`X`0`!E`$`Z#@!``$!``#T.`$``90!``0Y`0`!D0$`5#D!``$!``#H
+M.0$``0$``/0Y`0`!`0``_#D!``&4`0`$.@$``0$``!@[`0`!`0``*#L!``$!
+M```T.P$``0$``&P[`0`!`0``>#L!``&1``!\.P$``0$``)`[`0`!`0``G#L!
+M``$!``#L.P$``0$``/0[`0`!`0``"#P!``$!```4/`$``0$``!P\`0`!`0``
+M,#P!``$!``!`/`$``84!`$@\`0`!`0``5#P!``$``0!@/`$``0$``&P\`0`!
+M`0``<#P!``(!``!T/`$``@$``'@\`0`"`0``?#P!``(!``"`/`$``@$``(0\
+M`0`"`0``B#P!``(!``",/`$``@$``)`\`0`"`0``I#P!``$!``"P/`$``90!
+M`,`\`0`!RP``S#P!``'=``#</`$``0$``.0\`0`!`0``[#P!``$!``#T/`$`
+M`0$```0]`0`!`0``$#T!``$!```@/0$``0$``#`]`0`!`0``2#T!``$!``!4
+M/0$``0L``%P]`0`!`0``:#T!``&4`0"$/0$``90!`)@]`0`!E`$`N#T!``&4
+M`0#(/0$``90!`-@]`0`!7@``X#T!``%,``#L/0$``8\!`/0]`0`!`0``!#X!
+M``$!```(/@$``0$``!`^`0`!`0``%#X!``$!```</@$``0$``"`^`0`!`0``
+M*#X!``$!```L/@$``0$``#0^`0`!`0``.#X!``$!``!`/@$``0$``$@^`0`!
+M`0``4#X!``$!``!4/@$``0$``&`^`0`!`0``<#X!``$!``"$/@$``0$``)@^
+M`0`!`0``K#X!``$!``"T/@$``0$``,0^`0`!D0$`Z#X!``&1`0#X/@$``3D!
+M``0_`0`!`0``'#\!``$!```X/P$``0$``$@_`0`!D0$`6#\!``$Y`0!D/P$`
+M`0$``(P_`0`!`0``F#\!``$!``"D/P$``10!`+0_`0`!`0``Q#\!``&1`0#4
+M/P$``0$```!``0`!`0``-$`!``$!``!D0`$``9$!`'!``0`!E`$`@$`!``&1
+M`0",0`$``90!`*!``0`!D0$`L$`!``&1`0#`0`$``0$``-!``0`!D0$`X$`!
+M``&1`0#L0`$``0$``/1``0`!`0``_$`!``$!```,00$``0$``#1!`0`!E`$`
+M/$$!``$!``!,00$``9$!`%Q!`0`!60``9$$!``$!``!L00$``0$``'Q!`0`!
+M1`$`H$$!``$!``"L00$``0$``+A!`0`!`0``P$$!``$!``#(00$``0$``-A!
+M`0`!`0``[$$!``$!``#\00$``0$```A"`0`!EP``%$(!``$(`0`@0@$``4<!
+M`"A"`0`!`0``-$(!``$!``!$0@$``9$!`'Q"`0`!D0$`M$(!``&1`0#`0@$`
+M`20``/A"`0`!D0$`&$,!``&1`0`D0P$``90!`#Q#`0`!D0$`3$,!``&1`0!<
+M0P$``9$!`&Q#`0`!D0$`I$,!``&1`0#$0P$``9$!`-A#`0`!D0$`Z$,!``&1
+M`0#T0P$``;$``/Q#`0`!`0``!$0!``$!```81`$``3,``"1$`0`!70``/$0!
+M``$!``!01`$``0$``%Q$`0`!`0``@$0!``&4`0"81`$``9$!`*1$`0`!E`$`
+MX$0!``&1`0#X1`$``0$``!!%`0`!`0``'$4!``$Y`0`H10$``90!`#Q%`0`!
+MD0$`1$4!``$!``!,10$``3D!`%Q%`0`!`0``:$4!``&4`0!P10$``0$``(!%
+M`0`!D0$`C$4!``&4`0"<10$``9$!`*Q%`0`!`0``O$4!``$!``#(10$``90!
+M`-A%`0`!D0$`Y$4!``&4`0#T10$``9$!``!&`0`!`0``%$8!``%.```P1@$`
+M`9$!`#Q&`0`!`0``7$8!``$!``!L1@$``8P``'Q&`0`!`0``J$8!``&1`0"T
+M1@$``90!`,1&`0`!D0$`V$8!``&Y``#L1@$``4H``/A&`0`!FP``!$<!``&4
+M`0`41P$``9$!`"!'`0`!`0``)$<!``$!```T1P$``0$``$1'`0`!D0$`5$<!
+M``&1`0!D1P$``9$!`(Q'`0`!%@$`O$@!``&1`0#,2`$``0$``-A(`0`!D0$`
+M[$@!``%"````20$``2T``!1)`0`!1@``($D!``$!```L20$``9$!`#Q)`0`!
+M`0``J$D!``%)``"X20$``5T!`/1)`0`"`@``^$D!``("```\2P$``0$``$1+
+M`0`!E`$`7$L!``&1`0!D2P$``0$``&Q+`0`!`0``>$L!``&4`0"(2P$``9$!
+M`)A+`0`!E`$`J$L!``&1`0`$3`$``0`!`!Q,`0`!`0``+$P!``&<`0`X3`$`
+M`0$``$A,`0`!`0``4$P!``$!``!H3`$``9$!`'A,`0`!E`$`@$P!``$!``"(
+M3`$``3D!`)1,`0`!`0``F$P!``$!``"@3`$``0$``+1,`0`!L0``O$P!``$!
+M``#(3`$``90!`/Q,`0`!.0$`#$T!``%9```430$``0$``"1-`0`!D0$`,$T!
+M``$!```\30$``0$``$1-`0`!`0``3$T!``$!``!<30$``0$``'!-`0`!`0``
+M@$T!``$!``",30$``9<``)A-`0`!"`$`I$T!``&4`0"T30$``9$!`!1.`0`!
+M20``)$X!``%=`0!L3@$``90!`'Q.`0`!`0``@$X!``(!``"$3@$``@$``(A.
+M`0`"`0``C$X!``(!``"03@$``@$``)1.`0`"`0``F$X!``(!``"<3@$``@$`
+M`*!.`0`"`0``M$X!``&1`0#`3@$``90!`,A.`0`!`0``W$X!``&1`0#H3@$`
+M`90!`/A.`0`!D0$`#$\!``&1`0`H3P$``0$``$A/`0`!A0$`4$\!``$!``!<
+M3P$``0$``'Q/`0`!`0``A$\!``$!``"43P$``84!`)Q/`0`!`0``J$\!``$!
+M``"P3P$``0$``+A/`0`!`0``Q$\!``$!``#,3P$``0$``-1/`0`!`0``Y$\!
+M``$!``#T3P$``0$```10`0`!`0``"%`!``$!```@4`$``0$``#!0`0`!`0``
+M0%`!``$!``!,4`$``0$``%10`0`!`0``9%`!``$!``!\4`$``0$``(Q0`0`!
+M`0``F%`!``$!``"@4`$``0$``+!0`0`!`0``T%`!``$!``#84`$``0$``.10
+M`0`!`0``[%`!``$!``#X4`$``0$``"11`0`!E`$`-%$!``$!``!`40$``0$`
+M`%!1`0`!D0$`8%$!``&1`0!H40$``0$``'A1`0`!D0$`@%$!``$Y`0"$40$`
+M`0$``(Q1`0`!`0``G%$!``&1`0"D40$``3D!`+11`0`!D0$`Q%$!``&1`0`0
+M4@$``0`!`!Q2`0`!`0``1%(!``$!``!04@$``90!`%A2`0`!`0``<%(!``&4
+M`0"`4@$``90!`)!2`0`!E`$`H%(!``$!``"L4@$``90!`+Q2`0`!D0$`R%(!
+M``$!``#T4@$``0$```Q3`0`!)0$`'%,!``$!```P4P$``6L``$!3`0`!`0``
+M5%,!``&4`0!P4P$``9$!`'Q3`0`!E`$`E%,!``&1`0"@4P$``90!`+!3`0`!
+MD0$`T%,!``$!``#@4P$``0$``/!3`0`!`0``_%,!``$!```(5`$``90!`!A4
+M`0`!D0$`)%0!``&4`0`T5`$``9$!`$A4`0`!RP``5%0!``$!``!@5`$``90!
+M`'!4`0`!D0$`?%0!``$!``"45`$``0$``)Q4`0`!`0``K%0!``$!``"T5`$`
+M`0$``+Q4`0`!`0``Q%0!``$!``#45`$``0$``-Q4`0`!`0``X%0!``$!``!$
+M50$``0$``$Q5`0`!`0``7%4!``$!``!L50$``90!`'Q5`0`!D0$`A%4!``$Y
+M`0"@50$``4H``*Q5`0`!`0``O%4!``&1`0#,50$``84!`-15`0`!`0``X%4!
+M``&4`0#\50$``90!`#!6`0`!`0``-%8!``$!```\5@$``0$``$!6`0`!`0``
+M3%8!``$!``!05@$``0$``%A6`0`!`0``H%8!``&4`0"L5@$``0$``+16`0`!
+M:```S%8!``$!``#45@$``0$``.16`0`!`0``+%<!``$!```X5P$``9$!`$A7
+M`0`!D0$`5%<!``&4`0!D5P$``9$!`'17`0`!D0$`A%<!``&1`0"<5P$``9$!
+M`+!7`0`!D0$`O%<!``$!```(6`$``0$``&18`0`!`0``<%@!``$O``"<6`$`
+M`0$``*!8`0`!`0``J%@!``$!``"L6`$``0$``+A8`0`!`0``O%@!``$!``#$
+M6`$``0$``$19`0`!`0``2%D!``$!``!060$``0$``%19`0`!`0``7%D!``$!
+M``!D60$``0$``'19`0`!`0``@%D!``&4`0"(60$``0$``)19`0`!E`$`I%D!
+M``&1`0"\60$``9$!`,Q9`0`!D0$`*%H!``$!```P6@$``0$``#A:`0`!`0``
+M2%H!``$!``!86@$``0$``'1:`0`!`0``@%H!``&[``#<6@$``0$``.!:`0`!
+M`0``Z%H!``$!``#L6@$``0$``/1:`0`!`0``^%H!``$!````6P$``0$```1;
+M`0`!`0``#%L!``$!```06P$``0$``!A;`0`!`0``(%L!``$!```H6P$``0$`
+M`$A;`0`!`0``6%L!``$!``!@6P$``0$``&A;`0`!`0``<%L!``$!``"`6P$`
+M`0$``(Q;`0`!E`$`M%L!``&1`0"X6P$``0$``,1;`0`!`0``T%L!``$!``#D
+M6P$``90!`!!<`0`!D0$`)%P!``$.``!$7`$``9$!`%1<`0`!`0``8%P!``$!
+M``"<7`$``0$``/Q<`0`!E`$`&%T!``&1`0`D70$``90!`#A=`0`!D0$`1%T!
+M``&4`0!870$``9$!`&1=`0`!E`$`A%T!``&1`0"\70$``9$!`,A=`0`!E`$`
+MZ%T!``&1`0#T70$``90!`!A>`0`!D0$`,%X!``$!``!$7@$``0$``%1>`0`!
+M`0``8%X!``'%``!H7@$``0$``(Q>`0`!E`$`J%X!``&1`0#@7@$``90!`/Q>
+M`0`!D0$`"%\!``&4`0`@7P$``9$!`"Q?`0`!E`$`/%\!``&1`0!,7P$``0$`
+M`%Q?`0`!`0``9%\!``$!``!P7P$``90!`)!?`0`!D0$`H%\!``$!``"P7P$`
+M`9$!`'Q@`0`!6@``C&`!``%:``#08`$``0$``!AA`0`!`0``*&$!``$!``!`
+M80$``0$``%1A`0`!`0``8&$!``$!``!L80$``90!`'1A`0`!`0``@&$!``&4
+M`0"080$``9$!`)QA`0`!E`$`K&$!``&1`0"\80$``9$!`,QA`0`!D0$`V&$!
+M``&4`0#L80$``9$!`/QA`0`!D0$`"&(!``&4`0`<8@$``9$!`"QB`0`!D0$`
+M/&(!``&1`0!,8@$``9$!`%AB`0`!E`$`;&(!``&1`0!\8@$``9$!`(QB`0`!
+MD0$`G&(!``&1`0"H8@$``90!`+QB`0`!D0$`U&(!``$!``#88@$``0$``.!B
+M`0`!`0``Y&(!``$!``#L8@$``0$``/1B`0`!`0``^&(!``$!```@8P$``0$`
+M`&!C`0`!`0``G&,!``$E`0"\8P$``0$``-!C`0`!`0``X&,!``$!``#P8P$`
+M`0$``/AC`0`!`0``#&0!``$!```L9`$``0$``$QD`0`!`0``6&0!``$!``!X
+M9`$``0$``(1D`0`!`0``I&0!``$!``"P9`$``0$``.!D`0`!`0``[&0!``&4
+M`0#\9`$``9$!``AE`0`!E`$`&&4!``&1`0!$90$``9$!`%1E`0`!D0$`8&4!
+M``&4`0"$90$``9$!`)1E`0`!D0$`H&4!``&4`0"X90$``9$!`,AE`0`!D0$`
+MV&4!``&1`0#H90$``9$!`/1E`0`!E`$`&&8!``&1`0`H9@$``9$!`#AF`0`!
+MD0$`2&8!``&1`0!49@$``90!`'AF`0`!D0$`@&8!``("``"$9@$``@(``/QF
+M`0`!`0``$&<!``%K```@9P$``0$``"AG`0`!`0``4&<!``&4`0!H9P$``9$!
+M`'1G`0`!E`$`D&<!``&1`0#(9P$``5D```1H`0`!(P$`%&@!``$C`0",:`$`
+M`0$``)1H`0`!`0``O&@!``$!``#,:`$``0$``-1H`0`!`0``W&@!``$!``#D
+M:`$``0$``/1H`0`!`0``0&D!``$!``!0:0$``0$``&!I`0`!`0``<&D!``$!
+M``"`:0$``0$``*QI`0`!`0``S&D!``$!```8:@$``9$!`"1J`0`!`0``<&H!
+M``&1`0"\:@$``9$!``AK`0`!D0$`5&L!``&1`0!T:P$``9$!`(AK`0`"`@``
+M<&P!``$4``",;`$``0$``*!L`0`!`0``J&P!``$!``"X;`$``0$``,QL`0`!
+M`0``Y&P!``$!```(;0$``0$``!QM`0`!`0``/&T!``$!``!0;0$``0$``%AM
+M`0`!`0``:&T!``$!``!\;0$``0$``)1M`0`!`0``O&T!``$!``#D;0$``18!
+M`/1M`0`!`0``*&X!``$!``!4;@$``0$``&1N`0`!`0``E&X!``$!``"@;@$`
+M`0$``"!O`0`!`0``C&\!``$!``"P;P$``0$``-QO`0`!`0``&'`!``$!```D
+M<`$``0$``$AP`0`!`0``N'`!``$!```H<0$``0$``)!Q`0`!`0``''(!``$!
+M``!T<@$``0$``*QR`0`!`0``M'(!``$!``#H<@$``0$``/AR`0`"`@``+',!
+M``'I``!X<P$``0$``*!S`0`!`0``M',!``$!``#D<P$``0$``$AT`0`!`0``
+M?'0!``$!``"\=`$``0$``-1T`0`!`0``^'0!``%9`0`$=0$``0$``!1U`0`!
+M`0``('4!``$!```T=0$``0$``$1U`0`!`0``3'4!``$!``!<=0$``0$``*AU
+M`0`!`0``L'4!``$!``#(=0$``24!`-AU`0`!`0``['4!``$!``!<=@$``0$`
+M`(1V`0`!`0``I'8!``%9`0"X=@$``0$``/1V`0`!`0```'<!``$!``!`=P$`
+M`0$``&AW`0`!`0``D'<!``$!``"X=P$``0$```AX`0`!`0``)'@!``$!``!<
+M>`$``0$``(!X`0`!`0``G'@!``$!``"H>`$``0$``,QX`0`!`0```'D!``$!
+M```\>0$``@(``$!Y`0`"`@``;'D!``$!``",>0$``0$``+!Y`0`!`0``M'D!
+M``$!``#4>0$``0$``#AZ`0`!`0``E'H!``&1`0#<>@$``0$``.QZ`0`!`0``
+M^'H!``&4`0``>P$``0$``!A[`0`!`0``5'L!``$!``!<>P$``0$``(Q[`0`!
+M`0``F'L!``$!``"D>P$``0$``*Q[`0`!`0``N'L!``$!``#`>P$``0$``!1\
+M`0`!`0``>'P!``$!``"`?`$``0$``*!\`0`!`0``K'P!``$!``#L?`$``0$`
+M`/1\`0`!`0``#'T!``$!```@?0$``0$``$!]`0`!`0``6'T!``$!``"4?0$`
+M`0$``*A]`0`!`0``O'T!``("``#`?0$``@(```!^`0`!`0``"'X!``$!```P
+M?@$``0$``#Q^`0`!`0``0'X!``(!``!$?@$``@$``$A^`0`"`0``3'X!``(!
+M``!4?@$``0$``*!^`0`!+P``N'X!``$!```@?P$``0$``$Q_`0`!`0``7'\!
+M``$!``!P?P$``5L``(1_`0`!`0``J'\!``%G``#(?P$``9$!`-A_`0`!`0``
+MY'\!``$!``#P?P$``5L```2``0`!`0``*(`!``$!``!`@`$``6<``%B``0`!
+MD0$`9(`!``$!``"$@`$``6<``)R``0`!D0$`K(`!``$!``#,@`$``90!`-R`
+M`0`!`0``^(`!``$!```H@0$``9$!`#B!`0`!D0$`2($!``&1`0!4@0$``90!
+M`&R!`0`!D0$`K($!``'8``"\@0$``90!`-B!`0`!`0``Z($!``$!```$@@$`
+M`9$!`!""`0`!V```/((!``$!``!4@@$``6H!`'B"`0`!`0``E((!``$8`0#(
+M@@$``0$``,R"`0`"`0``T((!``(!``#4@@$``@$``-B"`0`"`0``[((!``$!
+M````@P$``0$``""#`0`!`0``)(,!``$!```X@P$``0$``%"#`0`!`0``7(,!
+M``$!``!H@P$``0$``("#`0`!`0``E(,!``$C`0"@@P$``0$``-"#`0`!`0``
+MZ(,!``%6```TA`$``9$!`&2$`0`!D0$`<(0!``&4`0"8A`$``9$!`-B$`0`!
+M`0``^(0!``$!``!DA0$``0$``+2%`0`!`0``U(4!``$!``#LA0$``0$``/2%
+M`0`!`0``"(8!``$!```8A@$``0$``"B&`0`!`0``8(8!``&1`0"(A@$``9$!
+M`*"&`0`!`0``N(8!``&1`0#4A@$``0$``.R&`0`!D0$`&(<!``&1`0`DAP$`
+M`0$``$B'`0`!`0``I(<!``$!``"PAP$``0$``/"'`0`!`0``^(<!``$!``#\
+MAP$``0$```R(`0`!`0``'(@!``$!``!@B`$``9$!`)B(`0`!D0$`K(@!``&1
+M`0"XB`$``0$``,R(`0`!D0$`W(@!``&1`0#LB`$``9$!`/B(`0`!E`$`"(D!
+M``&1`0#PB0$``0$```2*`0`"+`$`"(H!``(Q```0B@$``L(``$2*`0`!E`$`
+M8(H!``&1`0"$B@$``9$!`*R*`0`!E`$`M(H!``$!``#`B@$``90!`/B*`0`!
+MD0$`"(L!``&<`0`0BP$``0$``!B+`0`!.0$`((L!``$!```LBP$``9P!`#2+
+M`0`!`0``1(L!``$!``!,BP$``0$``%2+`0`!`0``7(L!``$!``!LBP$``0$`
+M`("+`0`!E`$`E(L!``&1`0"PBP$``9$!`+R+`0`!E`$`Q(L!``$!``#0BP$`
+M`0$``-R+`0`!E`$`[(L!``&1`0#TBP$``3D!``",`0`!E`$`$(P!``&1`0`8
+MC`$``0$``"",`0`!`0``*(P!``$Y`0`TC`$``9P!`#R,`0`!`0``2(P!``&4
+M`0!8C`$``9$!`&B,`0`!D0$`M(T!``$!```\C@$``0$``$R.`0`!`0``4(\!
+M``$!``#<CP$``0$``&R0`0`!`0``4)$!``$!``"@D0$``0$``*B1`0`!`0``
+M3)(!``$!```XDP$``0$``(R3`0`!`0``D),!``(!``"4DP$``@$``)B3`0`"
+M`0``G),!``(!``"HDP$``0$``,"3`0`!`0``U),!``$!```XE`$``0$``#R4
+M`0`!`0``1)0!``$!``!(E`$``0$``%"4`0`!`0``])0!``&&`0`$E0$``9$!
+M`!25`0`!D0$`))4!``&1`0`TE0$``9$!`$25`0`!D0$`=)4!``&1`0"$E0$`
+M`88!`)25`0`!D0$`I)4!``&1`0#<E0$``0$``/R5`0`!`0``*)8!``$!``!D
+ME@$``88!`+"6`0`!(P$`:)<!``$!``",EP$``0$``)R7`0`!`0``L)<!``&1
+M`0#$EP$``9$!`,R7`0`!,```8)@!``$!``!DF`$``80``'28`0`!D0$`A)@!
+M``&1`0#$F`$``0$``,B8`0`"`0``S)@!``(!``#0F`$``@$``-28`0`"`0``
+MV)@!``(!``#<F`$``@$``."8`0`"`0``[)@!``$!``#TF`$``90!`!R9`0`!
+MD0$`*)D!``&4`0!0F0$``9$!`%R9`0`!E`$`@)D!``&1`0",F0$``90!`+"9
+M`0`!D0$`P)D!``$!``#,F0$``0$``.29`0`!`0``6)H!``&4`0"`F@$``9$!
+M`(R:`0`!E`$`L)H!``&1`0"\F@$``90!`.":`0`!D0$`[)H!``&4`0`0FP$`
+M`9$!`!R;`0`!E`$`/)L!``&1`0!(FP$``90!`&R;`0`!D0$`=)L!``$!``"`
+MFP$``90!`(B;`0`!`0``E)L!``&4`0"DFP$``9$!`+2;`0`!`0``V)L!``$!
+M``#\FP$``90!`!R<`0`!D0$`*)P!``$!``!(G`$``0$``&2<`0`!`0``<)P!
+M``&4`0"8G`$``9$!`*B<`0`!`0``M)P!``$!``#,G`$``0$``/"<`0`!`0``
+M_)P!``&4`0`DG0$``9$!`#2=`0`!`0``0)T!``$!``!8G0$``0$``&"=`0`!
+M`0``=)T!``%S``!\G0$``74!`(B=`0`!W```C)T!``$!``"<G0$``0$``*R=
+M`0`!`0``L)T!``%U`0"\G0$``=P``-"=`0`!D0$`Y)T!``&1`0#LG0$``3``
+M`/"=`0`!`0``])T!``%U`0``G@$``=P``!2>`0`!`0``5)X!``("``!8G@$`
+M`@(``%R>`0`"`@``8)X!``("``!DG@$``@(``&B>`0`"`@``?)X!``("``"(
+MG@$``@(``)2>`0`"`@``[)X!``$!```LGP$``9$!`#R?`0`!D0$`3)\!``&1
+M`0!<GP$``9$!`&R?`0`!A@$`P)\!``$!``#<GP$``0$``.R?`0`!`0``^)\!
+M``&@```LH`$``0$``#B@`0`!`0``2*`!``&@``!8H`$``0$``&2@`0`!`0``
+M<*`!``$!``"`H`$``:```)B@`0`!`0``G*`!``$!``"DH`$``2$!`+"@`0`!
+M`0``O*`!``$!``#(H`$``:```-2@`0`!`0``Y*`!``&@```DH0$``0$``$"A
+M`0`!`0``<*$!``$!``!\H0$``0$``(RA`0`!H```F*$!``$A`0"DH0$``0$`
+M`+"A`0`!`0``P*$!``&@``#XH0$``0$``$BB`0`!`0``:*(!``&@``!XH@$`
+M`:```(BB`0`!H```F*(!``&@``"HH@$``:```+"B`0`!=0$`O*(!``'<``#$
+MH@$``0$``-RB`0`!`0``Y*(!``$!``#TH@$``:````2C`0`!H```(*,!``&@
+M```PHP$``:```$"C`0`!`0``4*,!``&@``!@HP$``:```'"C`0`!H```@*,!
+M``&@``"0HP$``:```*"C`0`!`0``J*,!``%U`0"THP$``=P``+RC`0`!`0``
+MS*,!``&1`0#<HP$``9$!`.BC`0`!`0``\*,!``%U`0#\HP$``=P``$"D`0`!
+MD0$`4*0!``&1`0!@I`$``88!`'RD`0`!E`$`C*0!``&4`0"<I`$``0$``*BD
+M`0`!`0``#*4!``$!```@I0$``0$``"BE`0`!`0``<*4!``$!``"<I0$``0$`
+M`*"E`0`!`0``J*4!``$!``"XI0$``0$``.2E`0`!`0``Z*4!``$!``#PI0$`
+M`0$``$2F`0`!`0``4*8!``$!``!DI@$``0$``&BF`0`!`0``=*8!``&@``"$
+MI@$``0$``)BF`0`!`0``I*8!``$!``"PI@$``:```-2F`0`!E`$`Y*8!``&4
+M`0#TI@$``90!``RG`0`!`0``%*<!``$!```LIP$``0$``+BG`0`!`0``P*<!
+M``$!``#,IP$``0$``.2G`0`!`0```*@!``$!```0J`$``88!`!RH`0`!E`$`
+M+*@!``&4`0`\J`$``0$``$BH`0`!`0``5*@!``$!``!@J`$``9$!`'"H`0`!
+MD0$`?*@!``$!``"(J`$``9$!`)BH`0`!D0$`^*@!``$!```0J0$``0$``"RI
+M`0`!`0``1*D!``$!``!,J0$``0$``%"I`0`!`0``9*D!``$!``"`J0$``0$`
+M`(BI`0`!`0``D*D!``$!``"TJ0$``0$``+RI`0`!`0``Q*D!``$!``",J@$`
+M`9$!`)RJ`0`!.0$`J*H!``$!``#$J@$``9$!`-2J`0`!.0$`X*H!``$!````
+MJP$``9$!`!"K`0`!.0$`'*L!``$!```DJP$``@(``"BK`0`"`@``+*L!``("
+M``!,JP$``8L``&BK`0`!`0``C*L!``$O``"LJP$``90!`,RK`0`!D0$`V*L!
+M``$!``#@JP$``0$``/2K`0`!+P```*P!``$!```<K`$``2\``$RL`0`!D0$`
+M:*P!``&1`0!\K`$``@(``*2L`0`!`0``J*P!``(!``"LK`$``@$``+"L`0`"
+M`0``M*P!``(!``"XK`$``@$``+RL`0`"`0``P*P!``(!``#$K`$``@$``#"M
+M`0`!`0``-*T!``$!```\K0$``0$``$"M`0`!`0``2*T!``$!``!0K0$``0$`
+M`'RM`0`!`0``I*T!``$!``#,K0$``0$``.BM`0`!`0``/*X!``$!``"8K@$`
+M`0$``/2N`0`!`0``,*\!``$!```\KP$``0$``%BO`0`!>0``<*\!``%Y``"4
+MKP$``9$!`*2O`0`!.0$`L*\!``$!``#0KP$``9$!`."O`0`!.0$`Z*\!``$!
+M```(L`$``9$!`!BP`0`!.0$`(+`!``$!``!`L`$``9$!`%"P`0`!.0$`6+`!
+M``$!``"$L`$``0$``)2P`0`!`0``N+`!``%Y``#4L`$``7D``/2P`0`!>0``
+M#+$!``%Y```DL0$``7D``#RQ`0`!>0``7+$!``&1`0!LL0$``3D!`'BQ`0`!
+M`0``I+$!``$!``#$L0$``7D``-RQ`0`!>0``Z+$!``$!``#TL0$``0$``"2R
+M`0`!>0``/+(!``%Y``!4L@$``7D``'BR`0`!D0$`B+(!``$Y`0"4L@$``0$`
+M`!BS`0`"`@``'+,!``("```@LP$``@(``"2S`0`"`@``*+,!``("```TLP$`
+M`@(``'"S`0`!`0``>+,!``$!``"0LP$``24!`*"S`0`!`0``M+,!``$!```P
+MM`$``0$``#2T`0`!`0``/+0!``$!``!$M`$``0$``$BT`0`!`0``4+0!``$!
+M``!4M`$``0$``%RT`0`!`0``9+0!``$!``"0M`$``0$``+RT`0`!`0``Z+0!
+M``$!````M0$``2,!`"BU`0`!`0``:+4!``$!``"`M0$``0$``)BU`0`!`0``
+MO+4!``$!``#\M0$``0$``"RV`0`!`0``1+8!``$!``!\M@$``0$``-BV`0`!
+M`0``&+<!``$!``!4MP$``0$``("W`0`!`0``J+<!``$!``#@MP$``0$``%"X
+M`0`!`0``6+@!``$!``"$N`$``0$``/"X`0`!`0``^+@!``$!```<N0$``5D!
+M`#BY`0`!`0``5+D!``$!``!LN0$``0$``(2Y`0`!`0``H+D!``$!``#`N0$`
+M`0$``-2Y`0`!`0``\+D!``$!```0N@$``0$``$RZ`0`!`0``6+H!``$!``!L
+MN@$``0$``'BZ`0`!`0``H+H!``$!``"TN@$``0$``/BZ`0`!`0``!+L!``$!
+M```4NP$``0$``"R[`0`!60$`4+L!``$!``!4NP$``84``&R[`0`!`0``<+L!
+M``&%``"LNP$``0$``,"[`0`!`0``U+L!``("``#PNP$``=````"\`0`!`0``
+M$+P!``'0```@O`$``0$``*2\`0`"`0``K+P!``(!``"TO`$``@$``+R\`0`"
+M`0``Q+P!``(!``#,O`$``@$``-2\`0`"`0``W+P!``(!```<O0$``9$!`"R]
+M`0`!.0$`.+T!``$!``!4O0$``9$!`&2]`0`!.0$`<+T!``$!``"0O0$``9$!
+M`*"]`0`!.0$`K+T!``$!``"TO0$``@(``+B]`0`"`@``O+T!``("``#HO0$`
+M`0$```B^`0`!`0``)+X!``$!``!(O@$``0$``'B^`0`!+P``B+X!``&4`0"H
+MO@$``9$!`*R^`0`!`0``U+X!``$!``#@O@$``0$``!B_`0`!+P``)+\!``$!
+M``!$OP$``0$``$R_`0`!`0``;+\!``$O``!XOP$``0$``)B_`0`!`0``N+\!
+M``$O``#$OP$``0$``.2_`0`!`0```,`!``$O```0P`$``2\``!C``0`!`0``
+M1,`!``&1`0!8P`$``9$!`*3``0`!`0``J,`!``(!``"LP`$``@$``+#``0`"
+M`0``M,`!``(!``"XP`$``@$``+S``0`"`0``P,`!``(!``!0P0$``0$``%3!
+M`0`!`0``7,$!``$!``!DP0$``0$``&C!`0`!`0``<,$!``$!``!TP0$``0$`
+M`'S!`0`!`0``A,$!``$!``"DP0$``0$``+S!`0`!`0``V,$!``$!``#PP0$`
+M`0$```S"`0`!`0``*,(!``$!```\P@$``0$``&C"`0`!`0``E,(!``$!``"\
+MP@$``0$``.C"`0`!`0``#,,!``$!```PPP$``0$``%C#`0`!`0``=,,!``%Y
+M``"0PP$``7D``*S#`0`!>0``O,,!``$!``#@PP$``7D```#$`0`!>0``(,0!
+M``%Y``!`Q`$``7D``&#$`0`!>0``@,0!``%Y``"0Q`$``0$``+#$`0`!>0``
+MR,0!``$!``#HQ`$``7D```#%`0`!>0``&,4!``$!```DQ0$``0$``"S%`0`!
+M`0``-,4!``$!``!4Q0$``7D``&S%`0`!>0``A,4!``%Y``"<Q0$``7D``*S%
+M`0`!`0``S,4!``%Y``#HQ0$``7D```#&`0`!>0``&,8!``%Y```PQ@$``7D`
+M`%C&`0`!`0``:,8!``$!``",Q@$``7D``*C&`0`!>0``N,8!``$!``#$Q@$`
+M`0$``/C&`0`!>0``$,<!``%Y```HQP$``9$!`#C'`0`!.0$`0,<!``$!``!@
+MQP$``9$!`'#'`0`!.0$`>,<!``$!``"8QP$``9$!`*C'`0`!.0$`L,<!``$!
+M``#0QP$``9$!`.#'`0`!.0$`[,<!``$!```,R`$``9$!`!S(`0`!.0$`*,@!
+M``$!``"4R`$``@(``)C(`0`"`@``G,@!``("``"@R`$``@(``,C(`0`"`@``
+M!,D!``$!```0R0$``0$``!C)`0`!`0``(,D!``$!```LR0$``0$``$C)`0`!
+M`0``3,D!``$!``!4R0$``0$``%S)`0`!`0``8,D!``$!``!HR0$``0$``&S)
+M`0`!`0``=,D!``$!``!\R0$``0$``)3)`0`!`0``K,D!``$!``#0R0$``0$`
+M`"S*`0`!`0``-,H!``$!``!4R@$``0$``'3*`0`!`0``C,H!``$!``"XR@$`
+M`0$``.3*`0`!Z0``^,H!``'I```4RP$``0$``"#+`0`!`0``),L!``$!``!0
+MRP$``>D``&3+`0`!Z0``@,L!``$!``"(RP$``0$``)S+`0`!Z0``R,L!``'I
+M``#<RP$``>D``/C+`0`!`0```,P!``$!```4S`$``>D``##,`0`!`0``;,P!
+M``$!``"LS`$``0$``+S,`0`!`0``T,P!``$!```@S0$``0$``%C-`0`!`0``
+MB,T!``$!``"8S0$``0$``*3-`0`!`0``P,T!``$!```DS@$``0$``#C.`0`!
+M`0``2,X!``$!``!<S@$``0$``)C.`0`!`0``M,X!``$!``"$SP$``0$``*S/
+M`0`!)0$`\,\!``$!``#\SP$``0$``!C0`0`!`0``/-`!``$!``!(T`$``0$`
+M`%30`0`!`0``8-`!``$!``"HT`$``0$``,#0`0`!`0``T-`!``$!```,T0$`
+M`0$``"31`0`!`0``+-$!``$!``!,T0$``0$``&#1`0`!`0``N-$!``$!``#D
+MT0$``0$```#2`0`!`0``&-(!``$!```TT@$``0$``$C2`0`!`0``4-(!``$!
+M``!@T@$``0$``(32`0`!`0``B-(!``$!``"TT@$``0$``!S3`0`!`0``2-,!
+M``$!``!DTP$``0$``(#3`0`!`0``G-,!``$!``"TTP$``0$``-#3`0`!`0``
+MX-,!``$!``#LTP$``0$``/S3`0`!`0``(-0!``$!```DU`$``0$``%34`0`!
+M`0``@-0!``$!``"$U`$``84``)S4`0`!`0``H-0!``&%``#PU`$``0$``#35
+M`0`!`0``D-4!``$!``"TU0$``0$``,35`0`!`0``W-4!``$!``#LU0$``0$`
+M``36`0`!`0``(-8!``$!```TU@$``0$``%36`0`!`0``:-8!``$!``!XU@$`
+M`0$``)#6`0`!`0``R-8!``$!``#LU@$``24!``37`0`!`0``'-<!``$!``!`
+MUP$``0$``%37`0`!)0$`8-<!``$!``"`UP$``0$``)#7`0`!`0``Q-<!``$!
+M``#<UP$``0$```#8`0`!`0``)-@!``'0```TV`$``0$``$38`0`!T```5-@!
+M``$!``#DV`$``@$``.S8`0`"`0``]-@!``(!``#\V`$``@$```39`0`"`0``
+M#-D!``(!```4V0$``@$``!S9`0`"(0``7-D!``&1`0!LV0$``3D!`'C9`0`!
+M`0``E-D!``&1`0"DV0$``3D!`+#9`0`!`0``T-D!``&1`0#@V0$``3D!`.S9
+M`0`!`0``]-D!``("``#XV0$``@(``/S9`0`"`@``*-H!``$!``!(V@$``0$`
+M`&3:`0`!`0``B-H!``$!``"XV@$``2\``,C:`0`!E`$`Z-H!``&1`0#LV@$`
+M`0$``!3;`0`!`0``(-L!``$!``!8VP$``2\``&3;`0`!`0``A-L!``$!``",
+MVP$``0$``*S;`0`!+P``N-L!``$!``#8VP$``0$``/C;`0`!+P``!-P!``$!
+M```DW`$``0$``$#<`0`!+P``4-P!``$O``!8W`$``0$``(3<`0`!D0$`F-P!
+M``&1`0`(W0$``0$```S=`0`!`0``%-T!``$!```8W0$``0$``"#=`0`!`0``
+M)-T!``$!```TW0$``0$``$3=`0`!`0``<-T!``$!``"4W0$``0$``+C=`0`!
+M`0``X-T!``$!``#\W0$``7D``!3>`0`!>0``.-X!``$!``!0W@$``9$!`&#>
+M`0`!.0$`:-X!``$!``"(W@$``9$!`)C>`0`!.0$`H-X!``$!``#`W@$``9$!
+M`-#>`0`!.0$`V-X!``$!``#XW@$``9$!``C?`0`!.0$`%-\!``$!```TWP$`
+M`9$!`$3?`0`!.0$`4-\!``$!``!\WP$``@(``(#?`0`"`@``A-\!``("``"(
+MWP$``@(``(S?`0`"`@``J-\!``$!``"LWP$``@$``+#?`0`"`0``M-\!``(!
+M``"XWP$``@$``+S?`0`"`0``P-\!``(!``#$WP$``@$``"#@`0`!`0``,.`!
+M``$!``!,X`$``0$``'#@`0`!`0``A.`!``$!``"0X`$``0$``)S@`0`!`0``
+MZ.`!``$!```$X0$``0$``"3A`0`!`0``;.$!``$!``"LX0$``24!`/3A`0`!
+M`0``..(!``$!``!@X@$``24!`,SB`0`!`0``_.(!``$!```(Y`$``0$``$#D
+M`0`!`0``7.0!``$!``"<Y`$``0$``,3D`0`!`0``U.0!``$!``#PY`$``0$`
+M`/SD`0`!`0``'.4!``$!``!0Y0$``0$``*CE`0`!`0``Y.4!``$!```HY@$`
+M`0$``%SF`0`!`0``D.8!``$!``"<Y@$``0$``.SF`0`!`0``^.8!``$!````
+MYP$``0$``"#G`0`!`0``*.<!``$!``!(YP$``0$``)CG`0`!`0``L.<!``$!
+M``#$YP$``90!`/CG`0`!`0``!.@!``&4`0`HZ`$``9$!`(3H`0`!D0$`E.@!
+M``$!``#@Z`$``9$!`!SI`0`!`0``(.D!``&%```XZ0$``0$``#SI`0`!A0``
+M5.D!``$!``!8Z0$``84``*SI`0`!`0``[.D!``$!```PZ@$``0$``$CJ`0`!
+M`0``8.H!``$!``!PZ@$``0$``(CJ`0`!`0``I.H!``$!``"PZ@$``0$``,#J
+M`0`!`0``S.H!``$!``#<Z@$``0$``/CJ`0`!`0``#.L!``$!```<ZP$``0$`
+M`#3K`0`!`0``>.L!``$!``"$ZP$``0$``)SK`0`!`0``Q.L!``$!``#8ZP$`
+M`24!`/#K`0`!`0``".P!``$!```P[`$``0$``$3L`0`!)0$`4.P!``$!``!P
+M[`$``0$``*3L`0`!`0``O.P!``$!``#@[`$``0$```3M`0`!T```%.T!``$!
+M```D[0$``=```#3M`0`!`0``/.T!``'0``!,[0$``0$``-3M`0`"`0``W.T!
+M``(!``#D[0$``@$``.SM`0`"`0``].T!``(!``#\[0$``@$```3N`0`"`0``
+M#.X!``(A``!,[@$``9$!`%SN`0`!.0$`:.X!``$!``"$[@$``9$!`)3N`0`!
+M.0$`H.X!``$!``#`[@$``9$!`-#N`0`!.0$`W.X!``$!``#D[@$``@(``.CN
+M`0`"`@``[.X!``("```8[P$``0$``#CO`0`!`0``5.\!``$!``!X[P$``0$`
+M`*CO`0`!+P``N.\!``&4`0#8[P$``9$!`-SO`0`!`0``!/`!``$!```0\`$`
+M`0$``$CP`0`!+P``5/`!``$!``!T\`$``0$``'SP`0`!`0``F/`!``$!``"X
+M\`$``0$``-3P`0`!`0``]/`!``$!```0\0$``2\``"#Q`0`!+P``*/$!``$!
+M``!4\0$``9$!`&CQ`0`!D0$`Z/$!``$!``#L\0$``0$``/3Q`0`!`0``_/$!
+M``$!````\@$``0$```CR`0`!`0``$/(!``$!```L\@$``0$``$3R`0`!`0``
+M7/(!``$!``!T\@$``0$``(SR`0`!`0``I/(!``$!``"T\@$``0$``-#R`0`!
+M`0``Y/(!``$!````\P$``0$``"3S`0`!`0``2/,!``$!``!L\P$``0$``)3S
+M`0`!`0``H/,!``$!``#`\P$``7D``-CS`0`!>0``]/,!``%Y````]`$``0$`
+M``CT`0`!`0``&/0!``$!```D]`$``2\``#ST`0`!`0``7/0!``%Y``!T]`$`
+M`7D``)ST`0`!`0``M/0!``&1`0#$]`$``3D!`,ST`0`!`0``[/0!``&1`0#\
+M]`$``3D!``3U`0`!`0``)/4!``&1`0`T]0$``3D!`#SU`0`!`0``7/4!``&1
+M`0!L]0$``3D!`'CU`0`!`0``F/4!``&1`0"H]0$``3D!`+3U`0`!`0``#/8!
+M``("```0]@$``@(``!3V`0`"`@``&/8!``("```@]@$``@(``#SV`0`!`0``
+M0/8!``(!``!$]@$``@$``$CV`0`"`0``3/8!``(!``!0]@$``@$``%3V`0`"
+M`0``6/8!``(!``"T]@$``0$``,3V`0`!`0``X/8!``$!```$]P$``0$``!CW
+M`0`!`0``)/<!``$!```P]P$``0$``'SW`0`!`0``F/<!``$!``"X]P$``0$`
+M``#X`0`!`0``0/@!``$E`0"(^`$``0$``,SX`0`!`0``]/@!``$E`0!@^0$`
+M`0$``)#Y`0`!`0``G/H!``$!``#4^@$``0$``/#Z`0`!`0``,/L!``$!``!8
+M^P$``0$``&C[`0`!`0``A/L!``$!``"0^P$``0$``+#[`0`!`0``Y/L!``$!
+M```\_`$``0$``'C\`0`!`0``O/P!``$!``#P_`$``0$``"3]`0`!`0``,/T!
+M``$!``"`_0$``0$``(S]`0`!`0``E/T!``$!``"T_0$``0$``+S]`0`!`0``
+MW/T!``$!```L_@$``0$``%3^`0`!E`$`B/X!``$!``"4_@$``90!`+C^`0`!
+MD0$`%/\!``&1`0`D_P$``0$``'#_`0`!D0$`K/\!``$!``"P_P$``84``,C_
+M`0`!`0``S/\!``&%``#D_P$``0$``.C_`0`!A0``/``"``$!``!\``(``0$`
+M`,```@`!`0``[``"``$!``#\``(``0$``!0!`@`!`0``,`$"``$!```\`0(`
+M`0$``$P!`@`!`0``4`$"``$!``!<`0(``0$``&P!`@`!`0``C`$"``$!``"@
+M`0(``0$``+`!`@`!`0``R`$"``$!```$`@(``0$``!`"`@`!`0``*`("``$!
+M``!,`@(``0$``&`"`@`!)0$`>`("``$!``"0`@(``0$``+0"`@`!`0``R`("
+M``$E`0#<`@(``0$``/P"`@`!`0``,`,"``$!``!(`P(``0$``&P#`@`!`0``
+MD`,"``'0``"@`P(``0$``+`#`@`!T```P`,"``$!``#(`P(``=```-@#`@`!
+M`0``8`0"``(!``!H!`(``@$``'`$`@`"`0``>`0"``(!``"`!`(``@$``(@$
+M`@`"`0``D`0"``(!``"8!`(``B$``,`````"#P$`Q`````)E``#(`````L,`
+M`,P````"M0``T`````)^`0#4`````M8``-@````"5```W`````+B``#@````
+M`J(``.0````">P$`Z`````).`0#L`````L```/`````"/@``]`````*&``#X
+M`````E<``/P````"(`````$```)L`0`$`0```I<!``@!```"+@``#`$```*.
+M```0`0```DL!`!0!```"*0``&`$```(\```<`0```FD``"`!```"@@$`)`$`
+M``)]`0`H`0```AP!`"P!```"M@``,`$```)C`0`T`0```F8!`#@!```"#`$`
+M/`$```+?``!``0```D`!`$0!```"D@``2`$```)V`0!,`0```L$``%`!```"
+MN```5`$```*'``!8`0```K```%P!```"50``8`$```+*``!D`0```CP!`&@!
+M```"$0$`;`$```*F``!P`0```C<!`'0!```"[```>`$```)@`0!\`0```E`!
+M`(`!```"+P$`A`$```(R``"(`0```K<``(P!```"7@$`D`$```(>`0"4`0``
+M`B@!`)@!```"/0``G`$```)V``"@`0```D@!`*0!```"YP``J`$```)/``"L
+M`0```C8``+`!```"C0``M`$```((``"X`0```O@``+P!```"00$`P`$```(X
+M`0#$`0```OD``,@!```"@P$`S`$```)J``#0`0```@H``-0!```":`$`V`$`
+M``*N``#<`0```A(!`.`!```"&P$`Y`$```)R`0#H`0```C8!`.P!```"J```
+M\`$```)%``#T`0```C$!`/@!```"$P``_`$```*^`````@```G$```0"```"
+M^P``"`(```+]```,`@```E4!`!`"```"9P$`%`(```*!`0`8`@```@\``!P"
+M```"4@$`(`(```(F`0`D`@```@X!`"@"```"HP``+`(```)3`0`P`@```@$`
+M`#0"```"E0$`.`(```(N`0!``@```EX!`$0"```"'@$`2`(```(H`0!,`@``
+M`CT``%`"```"=@``5`(```(!``#0%@```DD!`-06```":0$`V!8```);`0#<
+M%@```H`!`.`6```"9```Y!8```)W``#H%@```I4``.P6```";@``\!8```(-
+M``#T%@```C4``/@6```"8@``_!8```)C````%P```CD```07```";P$`"!<`
+M``(0`0`,%P```HL!`!`7```"@P``%!<```)Y`0`8%P```@4!`!P7```"K```
+M(!<```(K`0`D%P```B(``"@7```""@$`+!<```(9```P%P```FL!`#07```"
+MZ@``.!<```(?```\%P```BH``$`7```"KP``1!<```)_`0!(%P```FT!`$P7
+M```">@$`4!<```(]`0!4%P```O4``%@7```"`@$`7!<```+Q``!@%P```A4!
+M`&07```"?P``:!<```*:``!L%P```G4``'`7```"30$`=!<```*A``!X%P``
+M`D```'P7```"/@$`@!<```(Z`0"$%P```GL``(@7```".@``C!<```)1`0"0
+M%P```N```)07```",@$`F!<```+F``"<%P```L8``*`7```"Y0``I!<```)%
+M`0"H%P```M$``*P7```"-P``L!<```)A``"T%P```ML``+@7```"2@$`O!<`
+M``)8`0#`%P```BH!`,07```"'```R!<```)<``#,%P```C0!`-`7```"E@$`
+MU!<```)(``#8%P```IP``-P7```"9`$`X!<```+7``#D%P```@<!`.@7```"
+M'@``[!<```+^``#P%P```C@``/07```"`P$`^!<```+N``#\%P```H\````8
+M```")P``!!@```)0```(&````I0```P8```"W@``$!@```+.```4&````EH!
+M`!@8```"S0``'!@```)5`0`@&````I(!`"08```"!P``*!@```*D```L&```
+M`G(``#`8```";```-!@```+R```X&````O8``#P8```""0$`0!@```(!``!$
+M&````C`!`$@8```"3`$`4!@```+&``!4&````N4``%@8```"10$`7!@```+1
+M``!@&````C<``&08```"`0``'#8```);```@-@```H(``"0V```"=P$`*#8`
+M``)M```L-@```D0``#`V```"V@``-#8```*Z```X-@```A\!`#PV```"K0``
+M0#8```)3``!$-@```I\``$@V```"5@``3#8```(&`0!0-@```F(!`%0V```"
+MC```6#8```(!`0!<-@```N@``&`V```"G`$`9#8```*0`0!H-@```KP``&PV
+M```"?@``<#8```(G`0!T-@```B@``'@V```"80$`?#8```)6`0"`-@```H@`
+M`(0V```"90$`B#8```)?``",-@```D,!`)`V```"!`$`E#8```+_``"8-@``
+M`A(``)PV```"<`$`H#8```)\``"D-@```N,``*@V```"=0$`K#8```+<``"P
+M-@```I@``+0V```"-0$`N#8```+\``"\-@```A```,`V```"G@``Q#8```()
+M``#(-@```ID``,PV```"0@$`T#8```*R``#4-@```NL``-@V```"/P``W#8`
+M``(B`0#@-@```J4``.0V```"LP``Z#8```(:`0#L-@```DT``/`V```"1@$`
+M]#8```)4`0#X-@```A<!`/PV```"F`$``#<```))```$-P```LD```@W```"
+MJ@``##<```*&`0`0-P```DP``!0W```"D```&#<```**`0`<-P```JD``"`W
+M```"SP``)#<```)"```H-P```DL``"PW```"+0``,#<```)!```T-P```CL`
+M`#@W```"[0``/#<```)&``!`-P```H$``$0W```"-```2#<```(S``!,-P``
+M`A@``%`W```"=```5#<```+Z``!8-P```F\``%PW```"*0$`8#<```*%`0!D
+M-P```M,``&@W```"50$`;#<```*3``!P-P```I,!`'0W```"$P$`>#<```+4
+M``!\-P```B,``(`W```">`$`A#<```)P``"(-P```M@``(PW```"R```D#<`
+M``+O``"4-P```HX!`)PW```"&@$`H#<```)-``"D-P```D8!`*@W```"5`$`
+MK#<```(7`0"P-P```ID!`+@W```"`0``#`````(#```0`````@,``!0````"
+K`P``&`````(#```<`````@,``"`````"`P``)`````(#```H`````@,`````
+`
+end
diff --git a/sys/contrib/dev/ath/public/xscale-le-elf.inc b/sys/contrib/dev/ath/public/xscale-le-elf.inc
new file mode 100644
index 0000000..e536769
--- /dev/null
+++ b/sys/contrib/dev/ath/public/xscale-le-elf.inc
@@ -0,0 +1,82 @@
+#
+# Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer,
+# without modification.
+# 2. Redistributions in binary form must reproduce at minimum a disclaimer
+# similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+# redistribution must be conditioned upon including a substantially
+# similar Disclaimer requirement for further binary redistribution.
+# 3. Neither the names of the above-listed copyright holders nor the names
+# of any contributors may be used to endorse or promote products derived
+# from this software without specific prior written permission.
+#
+# Alternatively, this software may be distributed under the terms of the
+# GNU General Public License ("GPL") version 2 as published by the Free
+# Software Foundation.
+#
+# NO WARRANTY
+# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+# ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+# LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+# AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+# THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+# OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+# INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+# IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+# ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+# THE POSSIBILITY OF SUCH DAMAGES.
+#
+# $Id: //depot/sw/branches/sam_hal/public/xscale-le-elf.inc#3 $
+#
+
+#
+# Compilation configuration for building little-endian XScale/arm-elf.
+#
+# NB: built with AH_REGOPS_FUNC to so that register accesses
+# can be done using the Linux readl/writel functions on
+# systems that need it.
+#
+# Reported to work on:
+# Compulab's ARMBASE using ARMCORE GX
+# (http://www.compulab.co.il/armbase.htm)
+#
+
+#
+# Built with GNU cross-devel tools:
+#
+# PREFIX=/pub/gnu
+# BINUTILS=binutils-2.14
+# GCC=gcc-3.3.2
+# target=arm-elf
+#
+# ${BINUTILS}/configure --target=$target --prefix=${PREFIX}
+# ${GCC}/configure --target=$target --prefix=${PREFIX} \
+# --enable-languages=c --with-gnu-as --with-gnu-ld \
+# --with-newlib --with-gxx-include-dir=${PREFIX}/$target/include
+#
+ifndef TOOLPREFIX
+TOOLPREFIX= /pub/gnu/bin/arm-elf-
+endif
+#
+CC= ${TOOLPREFIX}gcc
+LD= ${TOOLPREFIX}ld
+STRIP= ${TOOLPREFIX}strip
+OBJCOPY=${TOOLPREFIX}objcopy
+NM= ${TOOLPREFIX}nm
+
+#
+# Force register read/write operations to go through a function.
+#
+AH_REGOPS_FUNC=1
+
+LDOPTS= -EL
+COPTS+= -DAH_BYTE_ORDER=AH_LITTLE_ENDIAN
+COPTS+= -march=armv4 -mlittle-endian -fno-strict-aliasing -fno-common \
+ -mapcs-32 -mtune=xscale -mshort-load-bytes
diff --git a/sys/contrib/dev/ath/public/xscale-le-elf.opt_ah.h b/sys/contrib/dev/ath/public/xscale-le-elf.opt_ah.h
new file mode 100644
index 0000000..7a58dd2
--- /dev/null
+++ b/sys/contrib/dev/ath/public/xscale-le-elf.opt_ah.h
@@ -0,0 +1,8 @@
+#define AH_SUPPORT_AR5210 1
+#define AH_SUPPORT_AR5211 1
+#define AH_SUPPORT_AR5212 1
+#define AH_SUPPORT_5111 1
+#define AH_SUPPORT_5112 1
+#define AH_SUPPORT_2413 1
+#define AH_SUPPORT_5413 1
+#define AH_REGOPS_FUNC 1
diff --git a/sys/contrib/dev/ath/version.h b/sys/contrib/dev/ath/version.h
new file mode 100644
index 0000000..508eb89
--- /dev/null
+++ b/sys/contrib/dev/ath/version.h
@@ -0,0 +1,38 @@
+/*-
+ * Copyright (c) 2002-2006 Sam Leffler, Errno Consulting
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer,
+ * without modification.
+ * 2. Redistributions in binary form must reproduce at minimum a disclaimer
+ * similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
+ * redistribution must be conditioned upon including a substantially
+ * similar Disclaimer requirement for further binary redistribution.
+ * 3. Neither the names of the above-listed copyright holders nor the names
+ * of any contributors may be used to endorse or promote products derived
+ * from this software without specific prior written permission.
+ *
+ * Alternatively, this software may be distributed under the terms of the
+ * GNU General Public License ("GPL") version 2 as published by the Free
+ * Software Foundation.
+ *
+ * NO WARRANTY
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
+ * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
+ * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
+ * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGES.
+ *
+ * $Id: //depot/sw/branches/sam_hal/version.h#35 $
+ */
+#define ATH_HAL_VERSION "0.9.20.3"
diff --git a/sys/contrib/dev/ipw/LICENSE b/sys/contrib/dev/ipw/LICENSE
new file mode 100644
index 0000000..a3e83f5
--- /dev/null
+++ b/sys/contrib/dev/ipw/LICENSE
@@ -0,0 +1,207 @@
+ TERMS AND CONDITIONS
+ IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE
+
+Do not use or load this firmware (the "Software") until you have carefully read
+the following terms and conditions. By loading or using the Software, you agree
+to the terms of this Agreement. If you do not wish to so agree, do not install
+or use the Software.
+
+LICENSEES:
+
+Please note:
+
+* If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT,
+ applies.
+* If you are an Original Equipment Manufacturer (OEM), Independent Hardware
+ Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement
+ applies
+
+--------------------------------------------------------------------------------
+
+For OEMs, IHVs, and ISVs:
+
+LICENSE. This Software is licensed for use only in conjunction with Intel
+component products. Use of the Software in conjunction with non-Intel component
+products is not licensed hereunder. Subject to the terms of this Agreement,
+Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up
+license under Intel's copyrights to: (i) copy the Software internally for your
+own development and maintenance purposes; (ii) copy and distribute the Software
+to your end-users, but only under a license agreement with terms at least as
+restrictive as those contained in Intel's Final, Single User License Agreement,
+attached as Exhibit A; and (iii) modify, copy and distribute the end-user
+documentation which may accompany the Software, but only in association with
+the Software.
+
+If you are not the final manufacturer or vendor of a computer system or software
+program incorporating the Software, then you may transfer a copy of the
+Software, including any related documentation (modified or unmodified) to your
+recipient for use in accordance with the terms of this Agreement, provided such
+recipient agrees to be fully bound by the terms hereof. You shall not otherwise
+assign, sublicense, lease, or in any other way transfer or disclose Software to
+any third party. You may not, nor may you assist any other person or entity to
+modify, translate, convert to another programming language, decompile, reverse
+engineer, or disassemble any portion of the Software or otherwise attempt to
+derive source code from any object code modules of the Software or any internal
+data files generated by the Software. Your rights to redistribute the Software
+shall be contingent upon your installation of this Agreement in its entirety in
+the same directory as the Software.
+
+CONFIDENTIALITY. If you wish to have a third party consultant or subcontractor
+("Contractor") perform work on your behalf which involves access to or use of
+Software, you shall obtain a written confidentiality agreement from the
+Contractor which contains provisions with respect to access to or use of the
+Software no less restrictive than those set forth in this Agreement and
+excluding any distribution rights, and use for any other purpose. Except as
+expressly provided herein, you shall not disclose the terms or existence of
+this Agreement or use Intel's name in any publications, advertisements, or
+other announcements without Intel's prior written consent. You do not have any
+rights to use any Intel trademarks or logos.
+
+OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if
+any, are owned by Intel or its suppliers and licensors and may be protected by
+copyright, trademark, patent and trade secret law and international treaties.
+Any rights, express or implied, in the intellectual property embodied in the
+foregoing, other than those specified in this Agreement, are reserved by Intel
+and its suppliers and licensors or otherwise as set forth in any applicable
+open source license agreement. You will keep the Software free of liens,
+attachments, and other encumbrances. You agree not to remove any proprietary
+notices and/or any labels from the Software and accompanying materials without
+prior written approval by Intel
+
+LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS
+BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND
+(INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST
+INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE
+INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR
+SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS
+BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT
+EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR
+INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE
+OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS.
+
+EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH
+FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND
+LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR
+OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant
+or assume responsibility for the accuracy or completeness of any information,
+text, graphics, links or other items contained within the Software. You assume
+all liability, financial or otherwise, associated with Your use or disposition
+of the Software.
+
+APPLICABLE LAW. Claims arising under this Agreement shall be governed by the
+laws of State of California], excluding its principles of conflict of laws and
+the United Nations Convention on Contracts for the Sale of Goods.
+
+WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of
+this Agreement shall be effective unless in writing and signed by an officer of
+Intel. No failure or delay in exercising any right, power, or remedy under
+this Agreement shall operate as a waiver of any such right, power or remedy.
+Without limiting the foregoing, terms and conditions on any purchase orders or
+similar materials submitted by you to Intel, and any terms contained in IntelÂ’s
+standard acknowledgment form that are in conflict with these terms, shall be of
+no force or effect.
+
+SEVERABILITY. If any provision of this Agreement is held by a court of
+competent jurisdiction to be contrary to law, such provision shall be changed
+and interpreted so as to best accomplish the objectives of the original
+provision to the fullest extent allowed by law and the remaining provisions of
+this Agreement shall remain in full force and effect.
+
+EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to
+applicable import and export regulations of the United States and of the
+countries in which each party transacts business, specifically including U.S.
+Export Administration Act and Export Administration Regulations. Each party
+shall comply with such laws and regulations, as well as all other laws and
+regulations applicable to the Software. Without limiting the generality of the
+foregoing, each party agrees that it will not export, re-export, transfer or
+divert any of the Software or the direct programs thereof to any restricted
+place or party in accordance with U.S. export regulations. Note that Software
+containing encryption may be subject to additional restrictions.
+
+GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+Use, duplication, or disclosure by the Government is subject to restrictions as
+set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+of the Software by the Government constitutes acknowledgment of Intel's
+proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+2200 Mission College Blvd., Santa Clara, CA 95052.
+
+TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate
+its terms. Upon termination, you will immediately destroy the Software or
+return all copies of the Software to Intel.
+
+--------------------------------------------------------------------------------
+
+EXHIBIT "A"
+
+SOFTWARE LICENSE AGREEMENT (Final, Single User)
+
+IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+
+Do not use or load this firmware image (the "Software") until you have carefully
+read the following terms and conditions. By loading or using the Software, you
+agree to the terms of this Agreement. If you do not wish to so agree, do not
+install or use the Software.
+
+LICENSE. You may copy and use the Software, subject to these conditions:
+1. This Software is licensed for use only in conjunction with Intel component
+ products. Use of the Software in conjunction with non-Intel component
+ products is not licensed hereunder.
+2. You may not copy, modify, rent, sell, distribute or transfer any part of the
+ Software except as provided in this Agreement, and you agree to prevent
+ unauthorized copying of the Software.
+3. You may not reverse engineer, decompile, or disassemble the Software.
+4. You may not sublicense the Software.
+5. The Software may contain the software or other property of third party
+ suppliers.
+
+OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software
+remains with Intel or its suppliers. The Software is copyrighted and protected
+by the laws of the United States and other countries, and international treaty
+provisions. You may not remove any copyright notices from the Software. Intel
+may make changes to the Software, or items referenced therein, at any time
+without notice, but is not obligated to support or update the Software. Except
+as otherwise expressly provided, Intel grants no express or implied right under
+Intel patents, copyrights, trademarks, or other intellectual property rights.
+You may transfer the Software only if a copy of this license accompanies the
+Software and the recipient agrees to be fully bound by these terms.
+
+EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED
+"AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING
+WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR
+PURPOSE. Intel does not warrant or assume responsibility for the accuracy or
+completeness of any information, text, graphics, links or other items contained
+within the Software.
+
+LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR
+ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS
+INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO
+USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR
+IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE
+LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY
+BETWEEN JURISDICTIONS.
+
+TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if
+you violate its terms. Upon termination, you will immediately destroy the
+Software.
+
+APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the
+laws of California, excluding its principles of conflict of laws and the United
+Nations Convention on Contracts for the Sale of Goods. You may not export the
+Software in violation of applicable export laws and regulations. Intel is not
+obligated under any other agreements unless they are in writing and signed by
+an authorized representative
+of Intel.
+
+GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+Use, duplication, or disclosure by the Government is subject to restrictions as
+set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+of the Software by the Government constitutes acknowledgment of Intel's
+proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+2200 Mission College Blvd., Santa Clara, CA 95052.
+
+
+
+
+
diff --git a/sys/contrib/dev/ipw/ipw2100-1.3-i.fw.uu b/sys/contrib/dev/ipw/ipw2100-1.3-i.fw.uu
new file mode 100644
index 0000000..b20ffbb
--- /dev/null
+++ b/sys/contrib/dev/ipw/ipw2100-1.3-i.fw.uu
@@ -0,0 +1,4678 @@
+/*-
+ * TERMS AND CONDITIONS
+ * IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE
+ *
+ * Do not use or load this firmware (the "Software") until you have carefully read
+ * the following terms and conditions. By loading or using the Software, you agree
+ * to the terms of this Agreement. If you do not wish to so agree, do not install
+ * or use the Software.
+ *
+ * LICENSEES:
+ *
+ * Please note:
+ *
+ * * If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT,
+ * applies.
+ * * If you are an Original Equipment Manufacturer (OEM), Independent Hardware
+ * Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement
+ * applies
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * For OEMs, IHVs, and ISVs:
+ *
+ * LICENSE. This Software is licensed for use only in conjunction with Intel
+ * component products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder. Subject to the terms of this Agreement,
+ * Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up
+ * license under Intel's copyrights to: (i) copy the Software internally for your
+ * own development and maintenance purposes; (ii) copy and distribute the Software
+ * to your end-users, but only under a license agreement with terms at least as
+ * restrictive as those contained in Intel's Final, Single User License Agreement,
+ * attached as Exhibit A; and (iii) modify, copy and distribute the end-user
+ * documentation which may accompany the Software, but only in association with
+ * the Software.
+ *
+ * If you are not the final manufacturer or vendor of a computer system or software
+ * program incorporating the Software, then you may transfer a copy of the
+ * Software, including any related documentation (modified or unmodified) to your
+ * recipient for use in accordance with the terms of this Agreement, provided such
+ * recipient agrees to be fully bound by the terms hereof. You shall not otherwise
+ * assign, sublicense, lease, or in any other way transfer or disclose Software to
+ * any third party. You may not, nor may you assist any other person or entity to
+ * modify, translate, convert to another programming language, decompile, reverse
+ * engineer, or disassemble any portion of the Software or otherwise attempt to
+ * derive source code from any object code modules of the Software or any internal
+ * data files generated by the Software. Your rights to redistribute the Software
+ * shall be contingent upon your installation of this Agreement in its entirety in
+ * the same directory as the Software.
+ *
+ * CONFIDENTIALITY. If you wish to have a third party consultant or subcontractor
+ * ("Contractor") perform work on your behalf which involves access to or use of
+ * Software, you shall obtain a written confidentiality agreement from the
+ * Contractor which contains provisions with respect to access to or use of the
+ * Software no less restrictive than those set forth in this Agreement and
+ * excluding any distribution rights, and use for any other purpose. Except as
+ * expressly provided herein, you shall not disclose the terms or existence of
+ * this Agreement or use Intel's name in any publications, advertisements, or
+ * other announcements without Intel's prior written consent. You do not have any
+ * rights to use any Intel trademarks or logos.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if
+ * any, are owned by Intel or its suppliers and licensors and may be protected by
+ * copyright, trademark, patent and trade secret law and international treaties.
+ * Any rights, express or implied, in the intellectual property embodied in the
+ * foregoing, other than those specified in this Agreement, are reserved by Intel
+ * and its suppliers and licensors or otherwise as set forth in any applicable
+ * open source license agreement. You will keep the Software free of liens,
+ * attachments, and other encumbrances. You agree not to remove any proprietary
+ * notices and/or any labels from the Software and accompanying materials without
+ * prior written approval by Intel
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS
+ * BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND
+ * (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST
+ * INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE
+ * INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR
+ * SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS
+ * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT
+ * EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR
+ * INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE
+ * OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS.
+ *
+ * EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH
+ * FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND
+ * LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR
+ * OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant
+ * or assume responsibility for the accuracy or completeness of any information,
+ * text, graphics, links or other items contained within the Software. You assume
+ * all liability, financial or otherwise, associated with Your use or disposition
+ * of the Software.
+ *
+ * APPLICABLE LAW. Claims arising under this Agreement shall be governed by the
+ * laws of State of California], excluding its principles of conflict of laws and
+ * the United Nations Convention on Contracts for the Sale of Goods.
+ *
+ * WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of
+ * this Agreement shall be effective unless in writing and signed by an officer of
+ * Intel. No failure or delay in exercising any right, power, or remedy under
+ * this Agreement shall operate as a waiver of any such right, power or remedy.
+ * Without limiting the foregoing, terms and conditions on any purchase orders or
+ * similar materials submitted by you to Intel, and any terms contained in IntelÂ’s
+ * standard acknowledgment form that are in conflict with these terms, shall be of
+ * no force or effect.
+ *
+ * SEVERABILITY. If any provision of this Agreement is held by a court of
+ * competent jurisdiction to be contrary to law, such provision shall be changed
+ * and interpreted so as to best accomplish the objectives of the original
+ * provision to the fullest extent allowed by law and the remaining provisions of
+ * this Agreement shall remain in full force and effect.
+ *
+ * EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to
+ * applicable import and export regulations of the United States and of the
+ * countries in which each party transacts business, specifically including U.S.
+ * Export Administration Act and Export Administration Regulations. Each party
+ * shall comply with such laws and regulations, as well as all other laws and
+ * regulations applicable to the Software. Without limiting the generality of the
+ * foregoing, each party agrees that it will not export, re-export, transfer or
+ * divert any of the Software or the direct programs thereof to any restricted
+ * place or party in accordance with U.S. export regulations. Note that Software
+ * containing encryption may be subject to additional restrictions.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ *
+ * TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate
+ * its terms. Upon termination, you will immediately destroy the Software or
+ * return all copies of the Software to Intel.
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * EXHIBIT "A"
+ *
+ * SOFTWARE LICENSE AGREEMENT (Final, Single User)
+ *
+ * IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+ *
+ * Do not use or load this firmware image (the "Software") until you have carefully
+ * read the following terms and conditions. By loading or using the Software, you
+ * agree to the terms of this Agreement. If you do not wish to so agree, do not
+ * install or use the Software.
+ *
+ * LICENSE. You may copy and use the Software, subject to these conditions:
+ * 1. This Software is licensed for use only in conjunction with Intel component
+ * products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder.
+ * 2. You may not copy, modify, rent, sell, distribute or transfer any part of the
+ * Software except as provided in this Agreement, and you agree to prevent
+ * unauthorized copying of the Software.
+ * 3. You may not reverse engineer, decompile, or disassemble the Software.
+ * 4. You may not sublicense the Software.
+ * 5. The Software may contain the software or other property of third party
+ * suppliers.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software
+ * remains with Intel or its suppliers. The Software is copyrighted and protected
+ * by the laws of the United States and other countries, and international treaty
+ * provisions. You may not remove any copyright notices from the Software. Intel
+ * may make changes to the Software, or items referenced therein, at any time
+ * without notice, but is not obligated to support or update the Software. Except
+ * as otherwise expressly provided, Intel grants no express or implied right under
+ * Intel patents, copyrights, trademarks, or other intellectual property rights.
+ * You may transfer the Software only if a copy of this license accompanies the
+ * Software and the recipient agrees to be fully bound by these terms.
+ *
+ * EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED
+ * "AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING
+ * WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR
+ * PURPOSE. Intel does not warrant or assume responsibility for the accuracy or
+ * completeness of any information, text, graphics, links or other items contained
+ * within the Software.
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS
+ * INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO
+ * USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR
+ * IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE
+ * LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY
+ * BETWEEN JURISDICTIONS.
+ *
+ * TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if
+ * you violate its terms. Upon termination, you will immediately destroy the
+ * Software.
+ *
+ * APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the
+ * laws of California, excluding its principles of conflict of laws and the United
+ * Nations Convention on Contracts for the Sale of Goods. You may not export the
+ * Software in violation of applicable export laws and regulations. Intel is not
+ * obligated under any other agreements unless they are in writing and signed by
+ * an authorized representative
+ * of Intel.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ */
+#define IPW_FW_VERSION 1.3
+begin 644 ipw2100-1.3-i.fw
+M`0,!`.;Q`@#`'P```````"`````?.!@`````_O\?`/[_'P#^_Q\`_O\?`/[_
+M'P#^_Q\@````(```_O\?`/[_'P#^_Q\`_O\?`/[_'P#^_Q\`_O\?`/[_'T``
+M```(````'S@5````4````"```(`/.`!^'Q("```)``$/.`#^'V``_C]@`/Y?
+M8`#^?V!P````(```_I]@`/Z_8`#^WV``_O]@`/X?80#^/V$`_E]A`/Y_89``
+M```@``#^GV$`_K]A`/[?80#^_V$`_A]B`/X_8@#^7V(`_G]BL````"```/Z?
+M8@#^OV(`_M]B`/[_8@#^'V,`_C]C`'R?8Q#D`@#0````(``0?HY3`'Q?8V"^
+M`@`@<T(H`/Y_8P#^_Q\`_.]C____^_`````@``"!#S@`_.]K````!`"!#S@`
+M_`]@````!`#\[V/____[$`$``"```($/.`"`[VL`@0\X`/P/8`````0`@0\X
+MJ'Z.4Q`^#A`P`0``(```;``HH#LZ*!!^CE,0?HY#@(0`(*A^CE,```X0!`(.
+M$%`!```@``@^#A`0?HY3`&4O*!!^CD,(`.X+`+``(""`#S@`(``(<`$``"``
+M((`/.`"``!(````````````%@6<``H!H`8$/.`-ZXF>0`0``(```!($8@A$`
+M(``$@A@`!((8``6"'P3^(%`$?F!0`@0`,+`!```@``20@`@$D*`(!)#`"`20
+MX`@$B`$1!(H!$02,`1$$C@$1T`$``"``I04`(`1ZX6?___]_(@<`(`-Z@6<#
+M_B!``8$/.`/^84#P`0``(````0`P`92`"`&(01$`@0\X!)"`"`20H`@$B`$1
+M(?K_)Q`"```@``2*`1$#>H%G!)"`"*#X_R<$B`$1`?X@4`%^8%```0`P,`(`
+M`"```92`"`&(01$`@0\X"#@-$/S_'V``?#]@G`(```200`A0`@``(```>N%7
+M!)!@"($!`"`$!``1(/W_)P0&`!$`?#]@$.0"`'`"```@``3^($!(`@T0`'Q?
+M8``"``!,!`T0`/Z?8%`(#1``A"!`D`(``"``!/X@0/S_(&`$`@T0`(`/.```
+M'SBZ```````?.+X```"P`@``(````!\XP@``````'SC&```````?.,H`````
+M`!\XS@```-`"```@````'SC2```````?.-8```````````````&`OQ____]_
+M\`(``"``____?____W\!@+\?____?____W____]_`8"_'____W\0`P``(`#_
+M__]_____?P&`OQ____]_____?____W\!@+\?____?S`#```@`/___W____]_
+M`8"_'____W____]_____?P&`OQ____]_4`,``"``____?____W\!@+\?____
+M?____W____]_!H"_'Q``#0AP`P``(```>N!7@?[_)P2`OQ____]_#``-$`0`
+M8`@8`(`(`?YA0)`#```@``0&`!`(`(`+,`@-$```+@@`^N!7`@D`(`0`[@L(
+M`&X+L`,``"``#`!."Q``+@L4``X+&`#N"AP`S@H@`*X*)`"."B@`;@K0`P``
+M(``L`$X*,``N"C0`#@HX`.X)/`#."4``K@D@@0\X1'Z.0_`#```@``0`#@@"
+M@!\2"``N"`."'Q(,`(X/$`#N"Q0`K@L8`&X+$`0``"``'`!."R``+@LD``X+
+M*`#N"BP`S@HP`*X*-`"."C@`;@HP!```(``\`$X*0``N"D0`#@I(`.X)3`#.
+M"5``K@E4`(X)6`!N"5`$```@`(@`#@@!?N"O7`!."6``+@ED``X):`#N"&P`
+MS@AP`*X(<`0``"``=`"."'@`;@A\`$X(@``N"(P`#@@2@!\2A``."""!#CB0
+M!```(`"H?HY#@`(.$(0`#A````T(>`8.$`!ZX%=\!`X0(0H`(+`$```@``%^
+M`$````T05!@.$%@6#A!<%`X08!(.$&00#A!H#@X0T`0``"``;`P.$'`*#A!T
+M"`X0`J!?"0.@/PD,>`X0!!0.$`@2#A#P!```(`"(<@X0C'8.$""`#S@4.@X0
+M```-$`P`+0A4&`X0`/K@5Q`%```@`%@6#A`!"0`@7!0.$&`2#A!D$`X0:`X.
+M$&P,#A!P"@X0,`4``"``=`@.$`*@7PD#H#\)#'@.$`04#A`($@X0B'(.$(QV
+M#A!0!0``(``4.@X0"+@`$""`#S@(`(T+((`/.*A^CD,$@+\?____?W`%```@
+M````#0@!>@!0```-$`$-`"`$``X(`H`?$@@`+@@#@A\2D`4``"``#`".#Q``
+M[@L4`*X+5`"."5@`;@F(``X(`7[@KUP`3@FP!0``(`!@`"X)9``."6@`[@AL
+M`,X(<`"N"'0`C@AX`&X(?`!."-`%```@`(``+@B,``X($H`?$H0`#@@@@0XX
+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
+M```@``""86@(_I]G`(8A8``!`#``@B!``((@0`"&(&@`!($9\`L``"````2&
+M'P-^06```0`P``("$`1^@D"@`0`@`'KA5P``@&`0#```(```>N%7_W]!0`&`
+M#S@``D(0`'KA5_]_04`A@`\X`7Z"0#`,```@`*#]_R<``D(0`(-`8`#^/V"!
+M$P`@)`@`(``!X$<!_M]@4`P``"``A04`(`84H!@!_J)`((J>5P`*`(""`@`P
+M``$`0`""($AP#```(```A>!7!@P`0`:$(%``@0\XH`$`(`#^'V$!_A]A`(1`
+M4)`,```@```0!$D%@0!0__^_8`84H!@!_J)`((J>5P`*`(`!_M]@L`P``"``
+M@@(`,``!`$``@B!(`(7@5P8,`$`&A"!0`/[?8`-ZY%?0#```(``"``-0`7KD
+M9P("(U``@0\X```@8""!#SC__Q]@``7A9_`,```@`/]_@4`!!0`@``1@"`"$
+M0`@`A>%7`?X@0*(#`"`!?@!`$`T``"```'KB5_]_@D!"_/\G``1@"""`#S@`
+M``!0_X4@"/\%``@P#0``(````^!7__\?8`N`#S@@@`\X`?X?8```0`@`?$%@
+M_S\``%`-```@``P```@`?`!@_S\``````5``@``0````4`"`#S@$/@X0<`T`
+M`"```#8.$``X;F,T?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A"0#0``(``D)`X0
+M``!`8@""(&(`!.%A`(8!8@":IE$`@B!0_(,-$+`-```@``!\'V!@O@(`````
+M"`!ZX%<!`0`@`?X?8(```"````!0T`T``"```'K@5P(&`"``)2,H_/]-0`""
+M(%"`.2,H`'K@5P$"`"#P#0``(`!0_A]@`'P_8%<(````;S@H@%_^+P``H&'T
+M_TU`^/\M0!`.```@``!\'V"4P`(`%```"````1`__A]@`(``$``<QU$(^N=7
+M,`X``"``@0$`(/2!#0@`>N!7`0T`(`'^/V``?!]@L+8"```#0!10#@``(``!
+M10`(`'K@5P(%`"``G@=@`"8<*`!%""@`)`E@`*(H8'`.```@```@2&"`8Q8H
+M`)X'8`"0""@``@`@`"0)8`"B*&``($A@D`X``"```&`6*```P&$`@B!0`'P?
+M8+"V`@```T`4`'P?8&"^`@"P#@``(``````(`'K@5P$!`"`!_A]@@```(```
+M`%``>N!7`@8`(-`.```@``":!F"`1_XO``4C*/R!+0C\_TU`@!DC*`!ZX%<!
+M`@`@\`X``"``4/X?8`!\/V"'"````$\X*``<!V`0`*X)%`#."1@`[@D0#P``
+M(``<``X*(``N"B0`3@H$@.T+((`/.#00;@L$/@X0`#8.$#`/```@```X;F,0
+M?HY3`'Q?8,3<`@`&!"$(`/K@5X$2`"`"!&$(4`\``"```@0@"`"#X5>"!``@
+M`P1!"`,$(`@``^%7@@(`(`""(%!P#P``(```?%]@3+8"`"8#01"`$@`@`'Q?
+M8$RV`@`F!6$(`/KA5Y`/```@`(("`"`"!"`(*`-!$`,$(`@I`T$0``0`("@%
+M@0@"!"`(L`\``"```(G@5P(#`"`I!8$(`P0@"`")X%<"`0`@`?XA0(`!`"#0
+M#P``(```@B!0`'Q?8$RV`@`F`T$0`'Q?8,3<`@`&!"$(`/K@5_`/```@`($"
+M`"``?%]@3+8"`"8%80@%^N%7#`$`(``<'"@``0`@$!```"```((@4`""`&`$
+M@.T+((`/.!`0;@L$/@X0`#8.$``X;F,P$```(``8?HY3$!H.$!0<#A```,!A
+M`-@B*```H&$`^N97@@$`(%`0```@`'7^'V"S_C]@@",X*`""(%``@@!```(`
+M0`)^`(``?%]@<!```"``3-8"```$````@>97@0$`(`'^($`%^N!7B_K_)P""
+M`$"0$```(````@!``GX`@`!\7V!,U@(```0`0`@`(`@$`*`)`!P'8+`0```@
+M`(!Q"R@`F@9@`.8@*!``K@D4`,X)!(#M"R"`#S@8$&X+T!```"``!#X.$``V
+M#A``.&YC*'Z.4Q`:#A`4'`X0&!X.$!P@#A#P$```(``@(@X0)"0.$```(&(`
+M@@!B``3A80"&P6$`"*)A@+XB*!`1```@````0&(`>NE7@@$`('7^'V"U_C]`
+M``HX*``$05``!"%`,!$``"```(0@0`+^((``?!]@3-8"``"``````>E7@0$`
+M(`%^04!0$0``(``%>N%7B_K_)P`$(4``A"!``OX@@`#\`$!,U@(`"`"@"'`1
+M```@``0`0`H`H@A@`"`H8`">1V``'&=@`)J&8(`.#"@`)`E@D!$``"``__\_
+M8``I(B@0`*X)%`#."1@`[@D<``X*(``N"B0`3@JP$0``(``$@.T+((`/."@0
+M;@L`?%]@W*\"```((`@``H$0`@@@"-`1```@``("@1`$"``(!`"!$`"`#S@`
+M?#]@%*\"``"``!``>N!7\!$``"```@(`(`""(%``?!]@T*X"```"`!``@`\X
+M`'P_8`"O`@`0$@``(```@``0`(`/.`0^#A``-@X0`#AN8Q!^CE,`?!]@C-H"
+M`#`2```@```$``@`>N!7@@<`(`!\/V!2W@(``(0`"`!ZX%<"!0`@4!(``"``
+M`?X?8`"`0!``?!]@N-P"```$``@`>N!7@0$`(`?^'V!P$@``(```@B!0`($<
+M*`2`[0L@@`\X$!!N"P0^#A``-@X0`#AN8Y`2```@`!!^CE,/?D!H`!`A&`!\
+M'V#VK@(```2`$`!\'V"XW`(`L!(``"````0`"`!ZX%>!`P`@`'P?8/2N`@``
+M"``(`,0&*`!\'V#0$@``(`!TW`(``+X/*`2`[0L@@`\X$!!N"P!\/V#@K@(`
+M`(``$/`2```@``"`#S@$/@X0`#8.$``X;F,0?HY3`?Y?8`!\/V"HU0(`$!,`
+M`"```(1`$``$05``?#]@C+8"``B%0!``>N!7"/X?8($!`"`P$P``(```?#]@
+M```(```!`"``?#]@```$``!G'"@$@.T+((`/.%`3```@`!`0;@L$/@X0`#8.
+M$``X;F,4?HY3$!H.$```H&$`C@88<!,``"```&0H*`!\/V!,W0(``(0@"`#Z
+MX%<!`@`@`'P_8%#=`@"0$P``(```@"`(@`$`(`!\/V#@K`(``(`@"``"`&``
+M>N!7@0$`(+`3```@``!\'V#HK@(``!H`$!``K@D$@.T+((`/.!00;@L$/@X0
+MT!,``"```#8.$``X;F,0?HY3`((@4`!\'V"0W0(```)`$(`T`RCP$P``(``$
+M@.T+((`/.!`0;@L$/@X0`#8.$``X;F,0?HY3`#<#*!`4```@``2`[0L@@`\X
+M$!!N"P0^#A``-@X0`#AN8QA^CE,0&@X0,!0``"``%!P.$```0&``?!]@N-P"
+M```$``@`>N!7@@T`(`!\WV%0%```(`#$W`(``!RG80#ZX%<!"P`@`'KA5P$*
+M`"`!A$80-/X&0'`4```@`("A_2\`F@9@`(X;*`!ZX%>"!@`@`?X_8`!\'V#`
+MW`(`D!0``"````)`$`!\'V!LW`(```0@"``<!V"`+0\H`((@4`!\'V"P%```
+M(`#!W`(```)`$!``K@D4`,X)!(#M"R"`#S@8$&X+!#X.$-`4```@```V#A``
+M.&YC&'Z.4Q`:#A`4'`X0`)JF40!\'V"<V@(`\!0``"```!I`$`!\'V"XW`(`
+M`!I`$`_^7V``?-]A]*X"```$AQ`0%0``(```?!]@]JX"```$@!`/_A]@`,$K
+M*`!\/V#XK@(``("`$#`5```@```(!PB`TRLH`'P_8*[<`@``@(`0`'P?8`"O
+M`@``&@`04!4``"```?Y?8`!\'V#HK@(```0`$`!\'V`4KP(``!H`$&3^/V!P
+M%0``(```?!]@X*X"```"`!``?#]@``D```!\'V`$KP(```(`$)`5```@``!\
+M'V!<W0(``!H`$``$05`#?B&``(0@0`""($`%_G]@L!4``"```/P`0&#5`@`!
+M!D`0`7Y!0`1ZX5<+^_\G`)JF40!\'V#0%0``(`#0K@(``!H`$`'^7V``?!]@
+M]-P"```$`!`'_C]@`'Q_8/`5```@`,3<`@``@D$0!OX?8`&`01``?!]@"*\"
+M```$`!``?!]@$!8``"``P-P"```:0!``?!]@Y-P"```:`!``?!]@Z-P"```:
+M`!`P%@``(```?!]@D-T"```:0!``?!]@@-T"```:0!``?!]@5-T"`%`6```@
+M```:`!`/_E]@`'P?8&S:`@``!(`0`'P?8%+>`@``&D`0<!8``"```'P?8(S:
+M`@``&D`0`'P?8%/>`@``&D`0;OY?8`!\'V"0%@``(`!4W@(```0`$`!\'V!8
+MW@(``!I`$`!\'V#!W`(``!I`$+`6```@``!\'V"HU0(``!I`$`!\'V"?V@(`
+M`!I`$`!\'V"=V@(`T!8``"```!I`$`!\'V`$VP(``!I`$`!\'V!$W0(``!I`
+M$`!\'V#P%@``(`!,W0(``!I`$`!\'V!(W0(``!H`$`!\'V!0W0(``!H`$!`7
+M```@``!\'V#XW`(``!H`$`!\'V"HV@(``!H`$`!\'V!XW0(`,!<``"```!H`
+M$`!\'V!\W0(``!H`$`!\7V"*W`(`%AI!$!L:01!0%P``(``=`D$0!/X?8!X`
+M01``?!]@N`L``"``@1``0@0H`'X8*'`7```@`!``K@D4`,X)!(#M"R"`#S@8
+M$&X+!#X.$``V#A``.&YCD!<``"``$'Z.4P;^'V`0_C^``-P;*`2`[0L@@`\X
+M$!!N"P0^#A"P%P``(```-@X0`#AN8QA^CE,0&@X0%!P.$`'^7V``?!]@G-H"
+M`-`7```@```$0!``?#]@C+8"``B%0!``?!]@N-P"```$``@`>N!7\!<``"``
+M@@``(`#A%R@`?-]AJ-4"```$!P@`>N!7`0H`(`!\/V`0&```(`",M@(`"84`
+M"`!ZX%>!!P`@@*T9*`":IE$`?!]@G]H"`#`8```@```:0!``?!]@G=H"```:
+M0!``?!]@!-L"```:0!`)_A]@4!@``"```((@4`#%&R@`&D<0`'P_8(RV`@`)
+MA0`(`'K@5P(!`"!P&```(``!_E]@"85`$!``K@D4`,X)!(#M"R"`#S@8$&X+
+M`?X_8)`8```@``!\'V`(KP(```(`$`"`#S@$/@X0`#8.$``X;F,0?HY3L!@`
+M`"`````@8`!\'V"*W`(`'@)`$`!\/V"XW`(``(0@"`#ZX%?0&```(`"!```@
+M@`T/*`2`[0L@@`\X$!!N"P!ZX%<!`0`@`/K@5_`8```@`(("`"``@B!0`'P?
+M8.3<`@```@`0``8`(`'^7V``?!]@$!D``"``Y-P"```$`!``?%]@&+`"``"(
+M``@``($0`H@`"`(`@1`P&0``(``$B``(!`"!$`"`#S@`?#]@;-H"``"`@!``
+M@`\X!#X.$%`9```@```V#A``.&YC''Z.4Q`:#A`4'`X0&!X.$```X&$`@L!A
+M<!D``"```'KG5P(!`"``^N=7@A,`(`""`B@!_C]@`'P?8)#=`@"0&0``(```
+M`D`0`/KG5X("`"````!0`'Q?8)'=`@```$$0@`T`(+`9```@``!\OV&2W0(`
+M`(X'&`;^/V"`3OXO``X@&`!\7V"1W0(`T!D``"````!!$`"&85``@^%7B@<`
+M(``(!P@`@(80`@@'"`*`AA#P&0``(``$"`<(!("&$`9^QT$&_J9!`?X!0``.
+M8!@`?%]@D=T"`!`:```@```$(0@`@^%7B_C_)Q``K@D4`,X)&`#N"02`[0L@
+M@`\X,!H``"``'!!N"P0^#A``-@X0`#AN8Q!^CE,`?#]@T*X"``"``!!0&@``
+M(```?!]@%*\"``````@`>N!7`@$`(````%``@``0`'P?8'`:```@`+C<`@``
+M!``(`'K@5P$"`"``?#]@T*X"``"```B`?0XHD!H``"``!(#M"R"`#S@0$&X+
+M`'K@5X("`"``@B!0`'P?8.C<`@"P&@``(````@`0``8`(`'^7V``?!]@Z-P"
+M```$`!``?%]@(+`"`-`:```@``"(``@``($0`H@`"`(`@1`$B``(!`"!$`"`
+M#S@$/@X0\!H``"```#8.$``X;F,0?HY3`'P_8`2O`@``@``0`!`@&`!\7V`0
+M&P``(`"*W`(`(`"!$`""`&``LPXH!(#M"R"`#S@0$&X+!#X.$#`;```@```V
+M#A``.&YC$'Z.4R!ZX%<-$0`@`(9A4`!ZX%>.!0`@4!L``"```(2`"`#\04`H
+ML`(```A!$`"$@`@`>N)7`0(`(`'^84!P&P``(``!_B!```?@5XWZ_R<```!0
+M`'Q?8"BP`@``!H%!``!&$)`;```@``".`1@`?#]@K=P"``"&0!``?#]@1*\"
+M`#2`@!``?!]@L!L``"``N-P"```$``@`>N!7@0$`(`+^'V``!"%@@#$.*`2`
+M[0O0&P``(``@@`\X$!!N"P!\/V!4W@(``(``$`"`#S@$/@X0`#8.$/`;```@
+M```X;F,4?HY3$!H.$```H&$`@"8(`?Y`8`!\'V!8W@(`$!P``"````1`$`C^
+M`&`!>N!7@@4`(`!\'V!TV@(`````"`!ZX%<P'```(``"`P`@`'P?8,#<`@``
+M!``(`'K@5X$``""`XA<H`(`F"%`<```@``C^`&``>N!7`0$`(`'^/V"````@
+M`((@4`!\'V#!W`(`<!P``"````)`$`"`)@@"_@!@`'K@5P$!`"`!_C]@@```
+M(`""(%"0'```(```?!]@K-P"```"0!`$@"8(`/K@5P$"`"``?!]@C+8"`+`<
+M```@``0#`!```0`@__\_8`#]_R<0`*X)!(#M"R"`#S@4$&X+T!P``"``!#X.
+M$``V#A``.&YC%'Z.4Q`:#A```"!@`'R_872P`@#P'```(```F@9@"?Y?8("0
+M_"\```!0`'P_8`"O`@``@``0!H0&"!`=```@``%ZX%<"`0`@`?X?8`"``!``
+M?+]A=+`"``"$!@@!A(8),!T``"``"'Z&@0`8`&@"A(8)$'Z&@0`8`&@#A(8)
+M&'Z&@0`8`&A0'0``(``!?@!H`(!&$`A^`(@!@$80"'X`B`*`1A`(?@"(`X!&
+M$'`=```@`!``K@D$@.T+((`/.!00;@L$/@X0`#8.$``X;F,0?HY3D!T``"``
+M```@8`!\'V"*W`(`'0)`$`!\/V"XW`(``(0@"`#ZX%>P'0``(`"!```@@'$.
+M*`2`[0L@@`\X$!!N"P0^#A``-@X0`#AN8]`=```@`!1^CE,0&@X0``"@80#Z
+MYE>"`0`@</X?8&C^/V``<38H\!T``"```(`F"`!\'V",M@(`#`,`$`/^`&``
+M?%]@BMP"`!L`01`0'@``(```@"8(!/X`8!4`01``@"8("/X@8`!\'V!HW0(`
+M``(`$#`>```@``"`)@@0_B!@`'P?8+#<`@```@`0`(`F"`#\(&``(```4!X`
+M`"```'P?8%3=`@```@`0`(`F""#^(&``?!]@]-P"```"`!!P'@``(```@"8(
+M0/X@8`!\'V!@W0(```(`$`"`)@@`_"!@``(``)`>```@``!\'V!LW0(```(`
+M$`"`)@@`_"!@``@```!\'V!PL`(`L!X``"````(`$`"`)@@`_`!@`(````!Z
+MX%<!!``@`?X_8`!\'V#0'@``(`!$W0(```)`$`2`)@@`?!]@2-T"```"`!``
+M@`8(`'P`8/`>```@`````0``>N!7`00`(`'^/V``?!]@3-T"```"0!`(@"8(
+M$!\``"```'P?8%#=`@```@`0`'P?8+C<`@``!``(`'K@5X$#`"`P'P``(```
+M?!]@<+`"``````@`>N!7`@$`(`'^'V"`*PXH$`"N"5`?```@``2`[0L@@`\X
+M%!!N"P0^#A``-@X0`#AN8Q!^CE.`\@8H<!\``"``!(#M"R"`#S@0$&X+!#X.
+M$``V#A``.&YC%'Z.4Q`:#A"0'P``(``/?B!H`)``&`!\OV'TK@(``(*&$(!P
+M*B@`?#]@^*X"`+`?```@``"`@!``B`8(`(,J*`!\/V"NW`(``("`$`!\'V"X
+MW`(`T!\``"````0`"`!ZX%<!!``@`(@&"`!\/V#VK@(``(@@"(`?!2CP'P``
+M(```?!]@=-P"`(`9#B@0`*X)!(#M"R"`#S@4$&X+!#X.$!`@```@```V#A``
+M.&YC%'Z.4Q`:#A```*!A`'P?8+3<`@``&@`0,"```"```OXF8`!\'V"*W`(`
+M%P)`$`'^)F`8`D`0`'P_8+C<`@!0(```(```A"`(`/K@5X$``""`'`XH"/X&
+M8`!ZX%<`?#]@Z,H"`'`@```@``"(``@!`0`@$'X`:(```"#O?P!@`("`$`!\
+M/V#HR@(`D"```"```(@`"`"I#2@0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A"P
+M(```(```.&YC&'Z.4Q`:#A`4'`X0``"@80"$)@@$^N!7B@$`(-`@```@``&$
+M1@@0>N%7#`(`('#^'V``?#]@<P$``(`1-B@"_@9`\"```"```(0F"`/^8(``
+M@F%``(9A0`!\WV%@U0(``GXG0`"&($`0(0``(``!A$8(`'@G*`"$)@@#_F"`
+M`()A0`"&84`!A$8(`)P!0#`A```@``$$0!``?!]@N-P"```$``@`>N!7`08`
+M(`"$)@@!@E^`4"$``"```'P_8(RV`@``A0`(``0`:`"!0!``?!]@2+$"`"#^
+M/V!P(0``(```!$%0@%$?*!``K@D4`,X)!(#M"R"`#S@8$&X+`'P_8)`A```@
+M`%S=`@``@``0`(`/.`0^#A``-@X0`#AN8QA^CE,0&@X0L"$``"``%!P.$```
+MH&$`_>97[`$```X#`"#V_K]!`'Q?8(RV`@#0(0``(``0`0$(`7X`0!`!`1``
+M?-]A8-X"````!P@`FD9@`/+[+_`A```@`!#^1E````<(#``@"``#X5<&`P`@
+M#`0`$`!\7V",M@(`$"(``"``$`$!"`%^`$`0`0$0$`"N"10`S@D$@.T+((`/
+M.!@0;@LP(@``(```?%]@L+8"`$@)(0A&`X$0_']@8`""`4`(?@!``!`@&%`B
+M```@`$@!@1``_>!7P@$```L"`"`$_A]@1@&!$`S^`4!(`8$0<"(``"```(`/
+M.`""(%`!_B!``'P`4.P!````>N!7B?W_)P""`&"0(@``(```@`\X!#X.$``V
+M#A``.&YC''Z.4Q`:#A`4'`X0&!X.$+`B```@````H&$`@N!A`'S?800`,`"`
+MQ_LO``!G"`'ZYE<"`0`@T"(``"``$/X_8(```"`@_C]@`/KG5P$#`"`!_I]@
+M`/Q&0#RW`@#P(@``(``$"4$0`(9@:(`"`"``"()0`/Q&0#RW`@`$"4$0`()A
+M<!`C```@`/O_(6```@<0`+_[+P```%`0`*X)%`#."1@`[@D$@.T+,",``"``
+M((`/.!P0;@L$/@X0`#8.$``X;F,<?HY3$!H.$!0<#A!0(P``(``8'@X0``#`
+M80">YU$`FJ91`00'"`9ZX%>+#@`@!GX`4'`C```@``/^/V``&/TO`7X`0``.
+M0!@`A>=7"@L`(`">!T``'@!`D",``"`````'0`4$(`@`^N!7#`4`(`4$(`@.
+M^N!7B0,`(`4$(`BP(P``(``&!``(`7X`4``"`$`.>N!7B0``(`'^OV$!_@=`
+M``[@&=`C```@`/]_`4``#D`8`(7G5POU_R<`F@9@$`"N"10`S@D8`.X)\",`
+M`"``!(#M"R"`#S@<$&X+!#X.$``V#A``.&YC+'Z.4Q`:#A`0)```(``4'`X0
+M&!X.$!P@#A`@(@X0)"0.$```X&$`@@!B`_X?8#`D```@`/R!31#^H4T0````
+M4/^!31``?!]@_+P"`"!_P$'\@2T*4"0``"```'P_8-2\`@`H_J!!`'Q?8I3`
+M`@``D_LO``B"4!``*0AP)```(```GD!``'KH5XX-`"`_?D%@!'[A@`"`Q@@`
+M#F-``'P_8)`D```@`-2\`@`T@"`(!/Z@:`"<`GD(@"$(`)`@>`R"`1`$G`$0
+ML"0``"````[C0`"*`Q`#?F&`!(`F"`"&H$``AF!``*(!$`!\/V#0)```(`!X
+M5C02!(("$`%^@D`!?D%```GH5XWR_R<`A?LO````4/`D```@`!``K@D4`,X)
+M&`#N"1P`#@H@`"X*)`!."@2`[0L@@`\X$"4``"``+!!N"P0^#A``-@X0`#AN
+M8R1^CE,0&@X0%!P.$!@>#A`P)0``(``<(`X0("(.$```X&$`@L!A``0!8@``
+M`%``!"<(`_K@5U`E```@`($"`"`#!"<(%?K@5P(B`"`5^N=7`2$`(`($IPD`
+M?#]B<"4``"``E,`"``!Q^R\4@"@(`(/F5XX``"``@J!A`'P_8-2\`@"0)0``
+M(``H_L!``'P_8I3``@`,_JA```1!4`#ZYE>.!0`@!(`B"+`E```@``"$($`_
+M_B!@!/Z`@```8P@`@B!0`(B!0``"`A`!?D%`T"4``"```(7F5XWZ_R<(@"((
+M`)H@4`B"`A`$@"((`)H@0#_^(&#P)0``(``$@@(0@&/[+P```%``>N!7@0$`
+M(%#^'V#R_C]@`&TU*!`F```@`(!=^R\`?#]BE,`"`!"`*`@__F!@`'P_8-2\
+M`@`L@$`(,"8``"```_XA@`"$8$``A"````('$`2`(0@``@@0`%G[+P```%!0
+M)@``(```!"<(`_K@5X'A_R<#!"<(%?K@5P(!`"`5^N=7`M__)W`F```@`!``
+MK@D4`,X)&`#N"1P`#@H@`"X*!(#M"R"`#S@D$&X+D"8``"``!#X.$``V#A``
+M.&YC*'Z.4Q`:#A`4'`X0&!X.$!P@#A"P)@``(````,!A_/_M0?C_K4$`2/LO
+M`'P?8I3``@`0`"@(/_Y@8-`F```@``!\/V#4O`(`+(!`"`/^(8``A&!``(0@
+M``""!Q`$@"$(\"8``"```((&$(!#^R\`!`<(`)XG8`":1F"`P?\O^(%-"`!Z
+MX5<0)P``(``!!0`@``0'"`)ZX%<!`0`@`?X_8(```"``@B!0`!P'8#`G```@
+M```"`3@`>N!7@A(`(/Z%K0D`?!]BE,`"`(`V^R\4`"@(4"<``"```(/F5XX`
+M`"``@J!A`'P_8-2\`@`H_L!``'P?8I3``@!P)P``(``,?JA```1!4`#ZYE>.
+M!0`@!(`B"`"$($`__B!@!/Z`@)`G```@````8P@`@B!0`(B!0``"`A`!?D%`
+M`(7F5XWZ_R<(@"((L"<``"```)H@4`B"`A`$@"((`)H@0#_^(&`$@@(0`"G[
+M+P```%#0)P``(``0`*X)%`#."1@`[@D<``X*!(#M"R"`#S@H$&X+!#X.$/`G
+M```@```V#A``.&YC2'Z.4Q`:#A`4'`X0&!X.$!P@#A`@(@X0$"@``"``)"0.
+M$"@F#A`L*`X0``!`8@""`&+\_RU"^/^M00`:^R\P*```(```?-]AE,`"`!``
+M)P@__D!@`'P_8-2\`@`L@.`)`WXA@%`H```@``">0$``GB```((($`0`(0@`
+M@@80@!7[+P`$"0@`HBA@<"@``"```)I&8("3_R\``&!B`/KI5P*<`"#X@2T*
+M$(!("H!^"&"0*```(```>N!7`AT`($X("0@!?B!``)``&$X"B1"(""D(`?X@
+M0+`H```@```#X%>"E0`@`?X?8'P`"1``?"E```(``,J%``@(?@!@T"@``"``
+M`'K@5X$"`"``?#]@.*T"``"```@!?@!``(``$`!\'V#P*```(`#\O`(`)`%`
+M"`!ZX5>!`0`@]_\M0`"B"&```@$X_H6M"1`I```@``!\WV&4P`(`@/SZ+Q0`
+M)P@`@^97C@``(`""H&$`?#]@,"D``"``U+P"`"C^P$``?-]AE,`"``Q^IT``
+M!$%0`/KF5PY^`"!0*0``(``$@"((`(0@0#_^(&`$_H"```!C"`""(%``B(%`
+M``("$'`I```@``%^04``A>97C?K_)P!X`"``\0(H`'K@5P)[`"``FJ91D"D`
+M`"``2@0I"`'^`$!*`$D03`@)"`%^`$!,`(D0!/X?8("\&"BP*0``(````&!B
+M`/KI5P)U`"`%_A]@_(%-$/R!C0KX@6T*`.;Z+]`I```@`!``)P@__B!@`_X@
+M@`">0$``GN!!`*@'$`0F`1"`Y/HO\"D``"```*9I4@]^"&`"?@!0!WK@5PTH
+M`""`*``@2@0I"%4$"0@0*@``(```@>!7BAP`(`%^`%``@>!7@@,`(`'^'V`8
+M`(D0`'PI0#`J```@```"``#*A0`("'X`:,J!0!#\@4T(ZO]M0`"B"&``)"E@
+M4"H``"``@!T<*```8&+JBPT(`'K@5XPD`"``$.`9`'S?893``@!P*@``(`"`
+MT?HO%``G"`"#YU>.```@`(+@80!\/V#4O`(`*/[`0)`J```@``!\WV&4P`(`
+M#'ZG0``$05``^N=7C@4`(`2`(@@`A"!`L"H``"``/_X@8`3^@(```&,(`((@
+M4`"(@4```@(0`7Y!0`"%YU?0*@``(`"-^O\G"(`B"`">(%`(@@(0!(`B"`">
+M($`__B!@!(("$/`J```@``#$^B\`IFE2@!$`(`G^'V!\``D0@`\`(`3^'V!\
+M``D0$"L``"``)?X?8`!*`"`#_A]@?``)$``,`"`&_A]@?``)$`3^'V`P*P``
+M(```"0`@!_X?8'P`"1`%_A]@``<`(!_^'V"`0P`@`GZ`@5`K```@``!\A@%<
+M*P`````&.((*``"""@``P@H``,8*``"""@``<"L``"``R0H``,T*``"""@``
+M@",'*```8&(!_K]A`?KF5X(Z`""0*P``(```?!]@_+P"`"0!0`@`>N%7@24`
+M(`""(%#W@TT0]_\M0+`K```@``"B"&```@$X]X4-"`!ZX%>"#@`@_H6M"0!\
+MWV&4P`(`T"L``"``@*7Z+Q0`)P@`@^97C@``(`""H&$`?#]@U+P"`"C^P$#P
+M*P``(```?-]AE,`"``Q^IT``!$%0`/KF5PXG`"`$@"((`(0@0!`L```@`#_^
+M(&`$_H"```!C"`""(%``B(%```("$`%^04``A>97,"P``"``C?K_)P`A`"#\
+M@4T(ZO]M0`"B"&``)"E@@-X;*```8&)0+```(`#JBPT(`'K@5PPA`"``$*`9
+M`'S?893``@"`DOHO%``G"'`L```@``"#YE>.```@`(*@80!\/V#4O`(`*/[`
+M0`!\WV&4P`(`D"P``"``#'ZG0``$05``^N97#A0`(`2`(@@`A"!`/_X@8`3^
+M@("P+```(````&,(`((@4`"(@4```@(0`7Y!0`"%YE>-^O\G``X`(-`L```@
+M`/Z%K0D`?-]AE,`"``"$^B\4`"<(`(/F5XX``"``@J!A\"P``"```'P_8-2\
+M`@`H_L!``'S?893``@`,?J=```1!4`#ZYE<0+0``(`".!0`@!(`B"`"$($`_
+M_B!@!/Z`@```8P@`@B!0`(B!0#`M```@```"`A`!?D%``(7F5XWZ_R<(@"((
+M`)H@4`B"`A`$@"((4"T``"```)H@0#_^(&`$@@(0@';Z+P"F:5(`I@E@$`"N
+M"10`S@EP+0``(``8`.X)'``."B``+@HD`$X**`!N"BP`C@H$@.T+((`/.)`M
+M```@`$@0;@L`@B!0``1!4`#\`$"2W0(```1`$`'^`$``#B`8L"T``"``P/K@
+M5PO\_R<`?!]@D=T"```$0!``@`\X!/X_8``$05#0+0``(```?!]@\*P"```$
+M`!``?!]@]*P"```$`!``?!]@<*T"`/`M```@```$`!``?!]@F*T"```$`!``
+M?!]@-*T"```$`!``?!]@$"X``"``$*X"```$`!``?!]@H*X"```$`!``?!]@
+ME*X"```$`!`P+@``(```?!]@_*T"```$`!``?!]@A*X"```$`!``?!]@K*X"
+M`%`N```@```$`!``?!]@C*X"```$`!``?!]@C*T"```$`!``?!]@<"X``"``
+M=*T"```$`!``?)]@>*T"``"&85``!$%0``0"$`'^`4"0+@``(```#F`8!'Z"
+M0`"#X5>+_/\G`'P?8`2M`@``!``0`'R?8+`N```@``BM`@``AF%0`(/A5XH#
+M`"``!$%0``0"$`'^`4``#F`8T"X``"``!'Z"0`"#X5>+_/\G``1!4`!\'V`<
+MK0(```0`$`!\GV#P+@``(``@K0(``(9A4`"#X5>*`P`@``1!4``$`A`!_@%`
+M``Y@&!`O```@``1^@D``@^%7B_S_)P`$05``?!]@G*T"```$`!``?)]@,"\`
+M`"``H*T"``"&85``@^%7B@,`(``$05``!`(0`?X!0``.8!A0+P``(``$?H)`
+M`(/A5XO\_R<`!$%0`'P?8+2M`@``!``0`'R?8'`O```@`+BM`@``AF%0`(/A
+M5XH#`"``!$%0``0"$`'^`4``#F`8D"\``"``!'Z"0`"#X5>+_/\G`(9A4`+^
+M(8``!$%0`/P`0+"N`@"P+P``(```!``0`?X!0``.8!@%^N%7B_O_)P"`#S@$
+M/@X0`#8.$-`O```@```X;F,L?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0
+M\"\``"``*"8.$````&(`@J!A``3A80"&86(`#$-B@![Z+P``(&(0,```(``8
+M_A]@`$/^+P!\'V``B0(``']`0`!\'V"PM@(`1@D@"#`P```@``"$P$$0_A]@
+M`(1`0```01``D$<8`"`(8`":)F``+38H4#```"``"OXG@`"``%`$``<0"!H'
+M$`P@!Q``I@=0"GX`@!0`!Q!P,```(``0`@<0&/X?8``D*6"`+C(H`*((8(`1
+M^B\0`*X)%`#."9`P```@`!@`[@D<``X*(``N"B0`3@HH`&X*!(#M"R"`#S@L
+M$&X+L#```"``!#X.$``V#A``.&YC&'Z.4Q`:#A`4'`X0``#`80`&^B_0,```
+M(````*!A`OX?8(`J_B\`?!]@`(D"``!_0$``?!]@L+8"`/`P```@`$8)(`@%
+M_A]@`(1`0```01`"_A]@`!PG8``=,B@`F@9@$#$``"````#Z+Q``K@D4`,X)
+M!(#M"R"`#S@8$&X+!#X.$``V#A`P,0``(```.&YC)'Z.4Q`:#A`4'`X0&!X.
+M$!P@#A`@(@X0``#`85`Q```@```@"%("_O]A@/3Y+P``H&$`?!]@=+L"``!$
+M``@!>N!7<#$``"``@@$`(`'^'V(!_A]@@'P:*(#O^2\``"!B`)X'8``4_B^0
+M,0``(```?!]@`(D"``!_0$``?!]@L+8"`$8)(`@3_A]@`(1`0+`Q```@````
+M01``G@=@`!PG8(`&,B@`H@A@@.GY+P%ZZ%<"`0`@T#$``"``````4(!Q&B@`
+MF@9@@.;Y+Q``K@D4`,X)&`#N"1P`#@KP,0``(``@`"X*!(#M"R"`#S@D$&X+
+M!#X.$``V#A``.&YC('Z.4Q`R```@`!`:#A`4'`X0&!X.$!P@#A```*!A`((`
+M8B/^WV$`VODO,#(``"````#@82/^'V"`_OTO`'P?8`")`@``?T!``'P?8+"V
+M`@!0,@``(`!&"2`(`(1@0`[^'V``A$!```!!$`*:01``@B!0`_Y!0'`R```@
+M``[ZYE>"!``@`/P`0+"V`@`$!0`(``!!$`%^04`!_B!`D#(``"``(/K@5PO\
+M_R<`!``@`/P`0+"V`@`D!0`(``!!$`%^04"P,@``(``!_B!`(/K@5PO\_R<`
+M'`=@`"`H8(#E,2@`G@=@@,CY+]`R```@`!``K@D4`,X)&`#N"1P`#@H$@.T+
+M((`/."`0;@L`?!]@\#(``"``G+<"``D%``@`>N!7@@,`(`!\'V"GV@(```0`
+M"!1ZX%<0,P``(``!`0`@````4(```"`!_A]@`(`/.`0^#A``-@X0`#AN8S`S
+M```@`"Q^CE,0&@X0%!P.$!@>#A`<(`X0("(.$"0D#A`H)@X04#,``"`````@
+M8@`<QU$`(`A2`"1)4@?^'V``*0XH!OX?8``D#BAP,P``(```^NA7"/X?8`$!
+M`"``)@XH@```(``A#B@`?+]AZ-8"`)`S```@``"`!@@0"``(`'K@5X$"`"``
+M?#]@I-L"``"$(`@`^N!7L#,``"```0,`(`'^?V``?#]@I-L"``"&0!``GN=1
+M@"$`(`/^'V#0,P``(``!_C]@`?Y?8`#]$"@``.!A`/KG5X$4`"``B`<(`!X`
+M0O`S```@`!"@!Q!<?DA"``1!4!0$B!`6!(@00`1($`'^?V!#!D@0$#0``"``
+M`OX?8#8`2!``?!]@NMH"```$``A(`$@0401($%0$2!`P-```(``8_A]@>@"(
+M$!P$B!!0!$@04P1($)#^'V!<`$@0701($%`T```@``"`)@@`B``(;`"($`*(
+M``AN`(@0!(@`"'``B!``?#]@<#0``"``E+8"``"(``AF`(@0`H@`"&@`B!`$
+MB``(:@"($`".^2^0-```(```?']BG+<"``R!*0@`^N!7`@8`(`!\/V"DVP(`
+M`(0@"+`T```@``#ZX%>"`P`@`?Y_8"R'21``BODO$/\)0/__/V``PATHT#0`
+M`"``@```(("'^2\`^N=7`2D`(`!\?V*<MP(`#($I"`#ZX%?P-```(`"!)@`@
+M`)JF40"```@`>N!7@20`(`!\/V"DVP(``(0@"!`U```@``#ZX%<"(@`@`/KG
+M5P$A`"``!$%02@1($$X$B!`"_A]@,#4``"``-0!($`":!D``&@!``GX`@`!\
+M?V*<MP(`#($I"`"`(`!0-0``(```B``(!`")$`*(``@&`(D0!(@`"`@`B1`$
+M!`D(`7X`8'`U```@``!ZX%<!`0`@4@1($``!`"`!_G]@4@9($`">!V`!_C]@
+MD#4``"``@!D3*`!ZX%<`F@9``!H`0`)^`(``?']BG+<"``R!*0BP-0``(`""
+M!``@`OY?8`"``$`(!``0`'P_8*C>`@``@``(`7X`0-`U```@``"``!``!``@
+M`?Y?8`"``$`(!``0`'P_8&"M`@``@``(\#4``"```7X`0`"``!`!_M]A`?X&
+M0``0H!D`F@9``!H`0`)^`(`0-@``(```?']BG+<"``R!*0@`@````'K@5X+;
+M_R<`^N=7`0$`(#`V```@``">!V"`$Q$H``1!4`!\?V*<MP(`#(4)$(!6^2\`
+M?#]@4#8``"``I-L"``"$(`@`^N!7@@,`(`'^?V`LATD0`%7Y+Q#_"4!P-@``
+M(`#__S]@`(T=*(```""`4ODO`/KH5P$"`"`!_G]@`'Q_8I`V```@`)RW`@`*
+MATD0`'P?8)3>`@`````(`'K@5X$``"```@`XL#8``"```'KG5P$!`"`&_A]@
+M`+X-*`?^'V``N0TH$`"N"10`S@G0-@``(``8`.X)'``."B``+@HD`$X**`!N
+M"@2`[0L@@`\X+!!N"_`V```@``0^#A``-@X0`#AN8QA^CE,0&@X0%!P.$```
+MP&$`/ODO$#<``"```'R_85"Y`@`YG480@#[Y+SF%!@@`>N!7@0$`(`3^'V`P
+M-P``(```*P\H``0`(`!\'V"RW@(```0`"`!ZX%>!`0`@5($&"%`W```@``%^
+M`$!4@080$`"N"10`S@D$@.T+((`/.!@0;@L`?#]@<#<``"``.+<"``"%``@`
+M>N!7`0$`(/]_`$``@4`0`(`/.`A^CE.0-P``(```-@X0`#AN8Q"`#1`0A`T(
+M`GK@5P(!`"`0@``(A`9`$+`W```@`!*$#0@`$&X+((`/.`A^CD,(?HY3!#X.
+M$``V#A``.&YCT#<``"``%'Z.4Q`:#A`0@`T0`)JF41"$#0@!>N!7@08`(``"
+M`"#P-P``(``0@``(A`9`$!*$K0D`!``@`GK@5P']_R<#>N!7`0(`(!`X```@
+M`%#^'V``?#]@\`<````K,R@`F@9@$`"N"02`[0L4$&X+,#@``"``((`/.`A^
+MCD,(?HY3!#X.$``V#A``.&YC%'Z.4Q`:#A!0.```(``0@`T0`)JF41"$#0@!
+M>N!7@0@`(``$`"`0@"`(7(0`"'`X```@``A^`&``>N!7@04`((2&0!`2A*T)
+M``0`(`)ZX%<!^_\GD#@``"```WK@5P$"`"!0_A]@`'P_8!0(````&C,H`)H&
+M8!``K@FP.```(``$@.T+%!!N"R"`#S@(?HY#"'Z.4P0^#A``-@X0`#AN8]`X
+M```@`!1^CE,0&@X0$(`-$`":IE$0A`T(`7K@5P$/`""`"@`@\#@``"``$(`@
+M"&2(@`@$"`$(``'B5P(%`"!BB(`(`@@!"``!XE<0.0``(``"`P`@8(B`"``(
+M`0@``>)7`@$`(`'^'V"````@````4#`Y```@``!ZX%>!!0`@A(9`$!*$K0D`
+M!``@`GK@5X'T_R<#>N!74#D``"```0(`(%#^'V``?#]@.`@``(`",R@`F@9@
+M$`"N"02`[0MP.0``(``4$&X+((`/.`A^CD,$/@X0`#8.$``X;F,4?HY3$!H.
+M$)`Y```@``!``"@``*!A`/KF5X$3`"``/``H`7K@5P(2`"!,_G]@L#D``"``
+M`((@4`*&!@`"_D"``'R!0`S=`@````(0`?X`0``.(!C0.0``(``$^N!7C/O_
+M)U#^?V`%_C]@`H8&``+^0(``?(%`#-T"`/`Y```@`````A`!_@!```X@&`GZ
+MX%>,^_\G5/Y_8`K^/V`"A@8`$#H``"```OY`@`!\GV`,W0(```B!00``!A`!
+M_@!```X@&`SZX%<P.@``(``,^_\G6(0&"#0``A``?!]@#-T"``"F!R@0`*X)
+M!(#M"U`Z```@`""`#S@4$&X+!#X.$``V#A``.&YC('Z.4Q`:#A`4'`X0<#H`
+M`"``&!X.$!P@#A````!B`'P_8.BL`@``@``(`7K@5X']_R>0.@``(``"_A]@
+M`(``$``<QU$`'*=!`)RF00+^IH$`?#]@[,H"`+`Z```@``""!D`:!``(`'K@
+M5P$&`"`4_N!!`)H'0``@*&`&_E]@T#H``"```$/Z+P!ZX%>"`@`@`)X&0`""
+M(%`,_E]@`!3Z+X`!`"#P.@``(``!?L=!`WKG5POT_R<```!0`'P_8.BL`@``
+M@``0$`"N"1`[```@`!0`S@D8`.X)'``."@2`[0L@@`\X(!!N"P!\?V!<J@(`
+M,#L``"```(%!"`2!80@`A@`0`'KA5P$'`"`!^N%7`@8`($,$(0A0.P``(```
+M`D`00@0A"`$"0!!%!"$(`@)`$$0$(0@#`D`01P0A"'`[```@``0"0!!&!"$(
+M!0)`$````%``@`\X`'P?8%RJ`@`$`0`(D#L``"```(`/.`!\'V!<J@(```$`
+M"`"`#S@$/@X0`#8.$``X;F.P.P``(``D?HY3$!H.$!0<#A`8'@X0`'S?85RJ
+M`@```:<)!80&"-`[```@``A^((`$A`8(``(@:`!\'V`<KP(```*`$!N$)@@`
+M?!]@\#L``"``'J\"```"0!#X_^U!`)X'8`""(%``Y/\O`'P?8-RO`@`0/```
+M(```GB=@!OY?8("L^"^"A`8(`'P_8.2O`@``@$`0@X0&"#`\```@``&`0!"`
+MA`8(`H!`$(&$!@@#@$`0?H0&"`2`0!!_A`8(4#P``"``!8!`$'R$!@@&@$`0
+M?80&"`>`0!!ZA`8("(!`$'N$!@AP/```(``)@$`0>(0&"`J`0!"%A`8("'X@
+M@(2$!@@``@!H"'X@@)`\```@`(>$!@@``@!H"'X@@(:$!@@``B!H`'P?8""O
+M`@```@`0L#P``"``280F"`!\'V#<K`(```(`$$B$!@@*`4<0`'P_8.#(`@#0
+M/```(```@(`02X0&"`A^((!*A`8(``(@:`!\'V#@K`(```(`$/`\```@`&^$
+M!@@(?B"`;H0&"``"(&@`?!]@Q,`"```"`!"+A`8($#T``"``"'X@@(J$!@@`
+M`@!H"'X@@(F$!@@``@!H"'X@@(B$!@@P/0``(````B!H`'P?8.2L`@```@`0
+MCX0&"`A^((".A`8(``(`:%`]```@``A^(("-A`8(``(`:`A^((",A`8(``(@
+M:`!\'V#(P`(`<#T``"````(`$!``K@D4`,X)&`#N"02`[0L@@`\X)!!N"P0^
+M#A"0/0``(```-@X0`#AN8QA^CE,0&@X0%!P.$```P&$`.!<H`)JF4;`]```@
+M``!\'V#LR@(`#```"`!ZX%<"!0`@!``'"`!\`&#\P!\`T#T``"```'K@5X("
+M`"`(?@=``!P$*`!ZX%>"```@`?Z_80".!ACP/0``(``0`*X)%`#."02`[0L@
+M@`\X&!!N"P0^#A``-@X0`#AN8Q`^```@`"1^CE,0&@X0%!P.$!@>#A`<(`X0
+M("(.$!1^X$$,_G]@,#X``"``#`"@"0"(I@@`FH)`('["00`<1V`&""(($?Z@
+M0`"0(AA0/@``(``"BH80`(BF"`"*($``@B9`]X4`"N-^*&`#^N!7`B\`('`^
+M```@``":HD`"B"8(`(H@0/G_P$`Q_J=`^(4@"$0"0!``!",(D#X``"```()"
+M$`'^HD`!?L-```0C"`""0A`!_J)``7XC0`"$(`BP/@``(```@D(0`(BF"`":
+MHD`"B"8(`(H@0/W_P$`M_J=`_(4@"-`^```@`$`"0!``!",(`()"$`'^HD`!
+M?L-```0C"`""0A`!_J)`\#X``"```7X#0``$(`@`@D(0`H@F""C^(%`L!`((
+M`WK@5P$'`"`0/P``(```!@%``00`"`)^`$``!F!``(?@5XT"`"#^?DA@`(BF
+M"#`_```@``*()@@`B@!`@!0`(`(&`0`#>N!7`OG_)P"$(4*`IP0H4#\``"``
+M``X@&`*$"`@`@>!7@0(`(/Y^2&``B"8(`H@&"``"`$!P/P``(`"`#0`@,(`'
+M"`!\/V#DW@(``(``$"R`)P@`?%]@X-X"`)`_```@```"`1`$`$<(`(7@5XT#
+M`"``A>!7A0$`(```)P@``^!7L#\``"``#0$`(`""(%"````@`?X_8`!\'V#P
+MW@(```)`$`!\'V#0/P``(`#PW@(```0`""F`1Q```0`@`(`&0/<%0!`0`*X)
+M%`#."?`_```@`!@`[@D<``X*(``N"@2`[0L@@`\X)!!N"P'^(&``^N!7$$``
+M`"``@A<`(`1ZX%<-%``@``\`(`!\/V!`K@(``(``"`%^`$`P0```(```@``0
+M@!``(`!\/V!`K@(`!(``"`%^`$`$@``0@`T`(%!````@``!\/V!`K@(`"(``
+M"`%^`$`(@``0@`H`(`!\/V!`K@(`<$```"``#(``"`%^`$`,@``0@`<`(`!\
+M/V!`K@(`$(``"`%^`$"00```(``0@``0@`0`(`)^@($`?(8!J$``````!C@(
+M$```#A```+!````@`!00```:$```(!````!\/V`\K@(``(``"`%^`$``@``0
+MT$```"```(`/.`0^#A``-@X0`#AN8Q!^CE.`3QXH??X_F(`#^2_P0```(```
+M?#]@Y,H"``"`(`@`@`!`!(#M"R"`#S@0$&X+`'P?8!!!```@`+"V`@``10`(
+M`(`/.`0^#A``-@X0`#AN8QQ^CE,0&@X0,$$``"``%!P.$!@>#A```.!A`(*@
+M80`$`6``AL%A@+$3*`!ZX%=000``(``"`0`@````4(`*`""8?B!``/KG5P$(
+M`""8"``(`('F5W!!```@`((&`"``?#]@%*X"``"```@!?@!``(``$`!\'V`8
+MK@(`D$$``"``$``G""*$(`@!_E]@`+\#*`'^'V```0`@`)J`$(#T_R>P00``
+M(``0`*X)%`#."1@`[@D$@.T+((`/.!P0;@L$/@X0`#8.$-!!```@```X;F,D
+M?HY3$!H.$!0<#A`8'@X0`)[G40"C'"@``,!A\$$``"```)JF40```%#\@0T0
+M`'P?8+#>`@``"``(`'K@5P$&`"`00@``(```?!]@G]H"```$``@`>N!7@@,`
+M(`!\'V`$VP(```0`"#!"```@``!ZX%<"`0`@`)H&8``@`"``?!]@N+<"`/__
+M/V``$APH4$(``"```'KG5P$%`"#\_TU``!P'8`/^/V"`TAPH`'K@5X$!`"!P
+M0@``(`!P_A]@/?X_8(#?,2@!_O]A`?X_8`!\'V!XO0(```.`$)!"```@`(##
+M!R@`>N!7@0(`(`"'""@`>N!7`0$`((#@"B@!_K]AL$(``"```%@@*`!\/V!`
+MV@(`)(``$`#W"2@`?!]@L-X"```(``C00@``(```>N!7@0(`(`!\'V!4MP(`
+M`?X_8``$05``(QLH!OX_8/!"```@``!\'V!XO0(```.`$`#ZYU>!!0`@````
+M4/B!#1#\@2T($$,``"``^/]-0``<!V``O!PH`'K@5X$!`"!U_A]@:/X_8`#)
+M,2@P0P``(```?!]@N+<"```>'"@`W_\G$`"N"10`S@D8`.X)!(#M"U!#```@
+M`""`#S@D$&X+`'P?8`3@`@`````(`(`/.`0^#A``-@X0<$,``"```#AN8QA^
+MCE,0&@X0%!P.$```P&$,``<(`'K@5P$%`""00P``(```'`=@`.`.*```H&$`
+MF@9@@&DB*`":!F``90\H#``'"+!#```@``!ZX%<"^_\G$`"N"10`S@D$@.T+
+M((`/.!@0;@L$/@X0T$,``"```#8.$``X;F,8?HY3$!H.$!0<#A```*!A`(+`
+M80""(%#P0P``(`````!0`?Y_8!"`1@@:!H$0$(!F"`!\GV!PN0(```A""!!$
+M```@```$P4`CA*$(`'QC0#C?`@``BH$0`7Y!0``081@`!((0,$0``"``!/KA
+M5PL!`"``!$%0``2"$`""0$``?']@.-\"``0&00!01```(```>N%7`0<`(`3Z
+MX%<*!@`@`()`0`!\?V`XWP(`!`9!`'!$```@`````4`!_B!``()`0`0&00``
+M>N%7`0$`(`3ZX%<+^O\GD$0``"```/K@5XP``"``CO@O`'P_8#"O`@``@``0
+M`'KG5P(:`""P1```(``0@$8("`0!"`%^`&``>N!7`0D`(`!\/V"TK0(``(``
+M"-!$```@``%^`$``@``0"'X!0`#5'R@`>N!7@0(`(`!\/V!HL`(`\$0``"``
+M`(``"`%^`$``@``0`'P?8+BM`@`0@$8(@`,`(`!\/V`010``(`"<K0(``(``
+M"`%^`$``@``0`'P?8*"M`@`B!"$(`?Y?8#!%```@`(!,`R@0@$8(%`A!"`!\
+M/V`0K@(``(``"``$`$``@``04$4``"```)H&8`"-`"@`?#]@F*T"``"```@!
+M?@!``(``$(`&`"!P10``(``#_A]@@`0`(`3^'V"``P`@`7KG5P']_R<">N=7
+M`?W_)Y!%```@``":!F"`)P\H``$`(`":)F"`&Q8H$`"N"10`S@D$@.T+L$4`
+M`"``((`/.!@0;@L$/@X0`#8.$``X;F,0?HY3`'K@5X$#`"#010``(```!0`@
+M`'P?8)[:`@```D`0!OX?8``3%B@`!``@!?X?8/!%```@``""(%``$18H``(`
+M(`%ZX%<!^O\G`GK@5P'\_R<$@.T+$$8``"``((`/.!`0;@L$/@X0`#8.$``X
+M;F,0?HY3`OX?8`""(%`P1@``(`"`"18H!(#M"R"`#S@0$&X+!#X.$``V#A``
+M.&YC)'Z.4U!&```@`!`:#A`4'`X0&!X.$!P@#A`@(@X0``#`80!ZYU>!*``@
+M<$8``"```?K@5P(D`"``!$%0`'P_8!37`@`(@``(`7X`8`!ZX%>01@``(``!
+M`@`@`7Y!0!#^($`4>N%7!?S_)YP"!Q`!_A]@"(``$+!&```@``0`!P@`?`!@
+M``@```!ZX%<!'@`@`_X?8`B``!"`'``@T$8``"``@$7W+P``X&&<`"<(#("@
+M"0#ZYE>!"@`@`(``"A``*`CP1@``(`!'A``(@'X`8`!ZX%<(`"@*`@4`(""`
+M``@`("A@`(`.*!!'```@``!ZX%>"`0`@=/X?8.'^/T"`2C$H`"`(8`#U#B@`
+MH@AB,$<``"``__^F00#ZYE<"]O\G@(0=*`!\/V`DL@(`<($`$````%!01P``
+M(`"<`"<("(``$`">!V"`-O<O``H`(`0`!P@`?`!@``@``'!'```@``!ZX%><
+M`"<("(``"($!`"`"?@!H"(``$``%`"#]?P!@D$<``"``"(``$(`#`"`"^N!7
+M`>;_)P/ZX%>!]_\G<_X?8.W^/T"P1P``(`"`.#$H$`"N"10`S@D8`.X)'``.
+M"B``+@H$@.T+((`/.-!'```@`"00;@L$/@X0`#8.$``X;F,8?HY3$!H.$!0<
+M#A```*!A\$<``"```'Q?8/"L`@````$(`7X`0````1``?!]@8-D"`!@$``@0
+M2```(```>N!7`10`(!"`Q@D```!01P!'$!8"AQ`8`(<0*0!'$#!(```@`!"`
+M)@@!A``(`'K@5X$"`"`"A``(`'K@5X$-`"`%>N!74$@``"``B@P`(`@$!P@!
+M?@!@`'K@5P$%`"``?!]@!-<"``":)F!P2```(```'$=@`$L.*`!\'V",V0(`
+M$(`F""2``!``!P`@"'X'0)!(```@`(#($B@`>N!7@0,`(!"`)@@D@``0G```
+M"`":)F``'$=@L$@``"``@$,.*(`!`"``F@9@@,(.*(`"`"``?!]@2+$"``'^
+M/V#02```(```!$%0@&4:*!``K@D4`,X)!(#M"R"`#S@8$&X+`([C4/!(```@
+M``!\?V!TW`(``OZ!0`'^7V``A$$0`?Y_8`"*HE``@$%@$$D``"```'KA5X$&
+M`"``@D%@`'KA5P$!`""`_M]@@```(``,PU`P20``(```_$)`.+\"```%00@`
+M#$%H``1"$`%^@D`!_N-``(9A0%!)```@``'^HD`(^N%7#O;_)P!\?V!TW`(`
+M`8Y!$`"`#S@```!0<$D``"```(`/.`0^#A``-@X0`#AN8Q!^CE,`>N!7`04`
+M(`#ZX%>020``(``!`0`@`((@4`0"@!``@B!0$`(`$("``B@`>N!7@0``(+!)
+M```@``#N,"@$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,0?HY3T$D``"```'L"
+M*`!ZX%>!```@@.@P*`2`[0L@@`\X$!!N"P0^#A#P20``(```-@X0`#AN8Q!^
+MCE,`C0(H```@8`#ZX%<!`@`@2OX?8!!*```@```$05``22DH@```(````%`$
+M@.T+((`/.!`0;@L$/@X0,$H``"```#8.$``X;F,8?HY3$!H.$!0<#A```,!A
+M@-;V+P``H&%02@``(```'`=@@(LE*```P&$`F@9@`-;V+P`<!V`0`*X)%`#.
+M"7!*```@``2`[0L@@`\X&!!N"P0^#A``-@X0`#AN8QA^CE,0&@X0D$H``"``
+M%!P.$```@&`!_M]A$`"B"`P`0@@XB&((`@@A"`"&`%"P2@``(``"`($0.(AB
+M"``(`0@`!@!```"!$#B(8@@4B`((``8`4-!*```@`!2`@A``"`$(``1@0`!\
+MOV&<MP(`3(4&"`AZX%>"%0`@\$H``"```'P_8.S6`@``A``(`'K@5P$3`"``
+M``!0`(!`$`*(`0@02P``(```>N!7@@T`(`G^'V!,@480!(@!"`!\(&#_/P``
+M`)``&#!+```@`$Z#AA``?#]@<*X"``"``!`&_@%``@@A"`;^(%``D"`84$L`
+M`"````P`*``(`F"`S/\O`'P_8)BM`@``@``(`7X`0`"``!!P2P``(`"(@08(
+M`7X`0(B!!A``',=1``$`(`K^'V!,@480`'R_89!+```@`)RW`@`P_P9``!(;
+M*``<!V`0`*X)%`#."02`[0L@@`\XL$L``"``&!!N"P1^CE,`!$%0```.$`!\
+M'V"<MP(`C`.`$`#ZX%?02P``(`",!0`@``!N"`&$`0@"?@!```8`0```#A`!
+M!``(`GX`0/!+```@```$`$``$$`8`(7@5XGZ_R<$?HY#`(`/.`0^#A``-@X0
+M$$P``"```#AN8QQ^CE,0&@X0%!P.$!@>#A```,!A#``G"`"(``@P3```(```
+M`B!`$``'"#@(``@``B!``?Z_80!\_V&<MP(`3(4'"%!,```@``%ZX%<!`@`@
+M!7K@5P$!`"`!_A]@`!X`(`*(``@$>N!7<$P``"```@<`(`!\7V#LU@(```0!
+M"`!ZX%>!&0`@````4```01"03```(``$B``(`'K@5P(!`"`&_A]@@!(`(`?^
+M'V"`$0`@`GK@5[!,```@``(4`"``?%]@[-8"```$`0@`>N!7@1$`(````%``
+M`$$0T$P``"```(@`"`%ZX%<$B``(@@@`(`!ZX%>"]_\G`'S_89RW`@#P3```
+M(`!4@0<(`'K@5X$!`"`!_A]@``!!$(`)`"`$_A]@3(%'$!!-```@`(!]]B]4
+MG0<0`'_V+P":IE$`!``@`'K@5P(!`"`"_A]@,$T``"``@```(`/^'V``?/]A
+MG+<"`$R!1Q``?/]AG+<"`##_!T!030``(```VQHH`)H&8!``K@D4`,X)&`#N
+M"02`[0L@@`\X'!!N"W!-```@``0^#A``-@X0`#AN8QQ^CE,0&@X0%!P.$!@>
+M#A`,`$`(D$T``"````@A"`"$X$$0```(.`C`"0```%``"0,H@$(**`'^'V"P
+M30``(`"`)_TO````4`!\OV'>V@(`&8!&$!J`1A````!0@.X"*-!-```@``":
+M!F``@B!0@,P#*`[^/V``?!]@I]H"```"0!``?!]@\$T``"``B-L"````0`@`
+M>N%7@0$`(`0>)P`!_A]@``(!.`'^'V`03@``(``0`*X)%`#."1@`[@D$@.T+
+M((`/.!P0;@L$/@X0`#8.$#!.```@```X;F,<?HY3$!H.$!0<#A```,!A`)JF
+M40`$!PA5>N!74$X``"``@40`(``T`"`$!"<(`!P'8(!!`"`"!"<(`!P'8`!`
+M`"!P3@``(`#\_VU``'P_8)2\`@`4@$`(`$`!"`)^`&``>N!7`?X?8)!.```@
+M``(``%``@`$0'(``"`!\`&@`#``````!%`""(%``?!]@L$X``"``L+8"``$#
+M0!0`10`(`'K@5X(V`"`$_A]@@(8`*(`T`"#03@``(`#\_VU``'P_8)2\`@`4
+M@$`(`$`!"`)^`&``>N!7`?X?8/!.```@``(``%``@`$0'(``"`!\`&@`#```
+M```!%`""(%``?!]@$$\``"``L+8"``$#0!2`*P`@4/X?8`!\/V!\!@``@$DP
+M*``5`"`P3P``(``!_C]@`'P?8&;>`@```D`4@!(`(`!\'V"PM@(`3`%`"%!/
+M```@``!ZX5<!)``@`!P'8`'^/V```@$X@"$`(`AZX%<"#0`@<$\``"```'P?
+M8'S>`@`````(`'K@5X$``"```@`X`'P?8'C>`@"03P``(``````(`'K@5X$'
+M`"```@`X@`8`(`!\7V!8O`(```0!"+!/```@``!ZX%<!&``@`((@4``"01``
+M?!]@U+@"``'^/V``!$%0T$\``"```(89*``4`"``'`=@`-;Z+P`2`"!0_A]@
+M`'P_8-8&``#P3P``(`"`,#`H`/S_)Q=ZX%>-_/\G`GZ`@0!\A@$04``````&
+M.!!0```@`!X4``#I$P``QQ,``-H3``#:$P``VA,``-H3``#Y$P``,%```"``
+MVA,``/D3``"T$P``EA,``)D3``"<$P``VA,``/83``!04```(`#,$P``^1,`
+M`/D3``#:$P``VA,``-$3``#Y$P``VA,``'!0```@``#O^B\``*!A`)H&8!``
+MK@D4`,X)!(#M"R"`#S@<$&X+D%```"``!#X.$``V#A``.&YC''Z.4Q`:#A`4
+M'`X0````4/^!31"P4```(```',=1"/X_8`!\'V```"$`"`)`%(!3'"@`?#]@
+MC-8"`-!0```@`"R``!#__PU``!`/*```H&$`^N97`00`(`"(!@@`&@!`\%``
+M`"``@*;_+P``P&$`>N=7`@4`(`":!F``I0XH`'P?8+"V`@`040``(``!10`(
+M`'K@5P+S_R?_A0T(`'K@5X+Q_R<`'`=@$`"N"3!1```@`!0`S@D$@.T+((`/
+M.!P0;@L$/@X0`#8.$``X;F,<?HY34%$``"``$!H.$!0<#A`8'@X0#`!`"``(
+M(0@`A.!!$```"#@(P`EP40``(`````!0`(\"*(#("2@!_A]@@*W\+P```%``
+M?+]AWMH"`)!1```@`!F`1A`:@$80````4(!T`B@`F@9@`((@4(!2`R@._C]@
+ML%$``"```'P?8*?:`@```D`0`'P?8(C;`@```$`(`'KA5X$!`"#040``(``$
+M'B<``?X?8``"`3@!_A]@$`"N"10`S@D8`.X)!(#M"_!1```@`""`#S@<$&X+
+M!#X.$``V#A``.&YC$'Z.4PP`0`@`""$($%(``"```(1`0!``(`@XB"`(`(2`
+M0`*$(```^N!7`A@`(`$$(@@P4@``(```?%]@N]H"``$$00@`A>!7`@<`(`#Z
+MX%>!"0`@``)"0%!2```@``$$80@`_$!`N]H"``$$00@`A>%7@A``(/__($``
+MCB`8<%(``"```/K@5X+Z_R>``P`@`/K@5P(-`"``?#]@K=X"``"$(`B04@``
+M(```^N!7@0H`(`!\7V#TK0(````A"`'^($```@$0`'P_8+!2```@`.C6`@``
+M@"`(`/K@5P(!`"``BJ)0``4`(!B$(`@`^N!7T%(``"``@0,`(`!\/V"<MP(`
+M"H4@"`#ZX%>!```@@(\N*`'^OV#P4@``(```B@)@!(#M"R"`#S@0$&X+!#X.
+M$``V#A``.&YC*'Z.4Q!3```@`!`:#A`4'`X0&!X.$!P@#A```,!A`?[_80!\
+M'V*4P`(`,%,``"``#'ZH00"Y]2_\_VU``)HF8!``B`CX_ZU``'Q?8)2\`@!0
+M4P``(``8`$$(``!!"`"$`A``?%]@U+P"`"@`H0CX@4T(``I!4'!3```@``1^
+M08@`">%7A0$`(``(05``A`$0``$`($!^04"`_?\GD%,``"``"(!`"`"`(0@`
+MA>!7#@$`(`""(%``@@$0_(%-"`B`)@BP4P``(````^%7#@,`(`"K]2\H_A]@
+M!/X_8``$05"`$B@H`!H`(-!3```@``"*HE`$@,8(`(7B5P8,`"`"_B>``)X@
+M0`/^((``?%]@\%,``"``U+P"``"$8``$?D.```:!0``&(0``_"!@____[P`&
+M84`05```(```@@$0!`!""``"07@(`"((`(0@>`P"`A`!?B-`/_[`8#!4```@
+M``'^HD#\@4T(`(7B5P7T_R<"_B>``)X@0`/^((``?%]@4%0``"``U+P"``"$
+M8``$?D.``(2!``!\(F#____O`(2!00`"!A!P5```(```A($``(2!00`(!A``
+MA($``(1!0`0`(0@`B&!X"``A")!4```@``"&('@,`@$0`(_U+P```%``>N!7
+M@@,`(`!\/V```"$`L%0``"```,0`"``<`'``@$`4`?X?8("$(B@0`*X)%`#.
+M"1@`[@G05```(``<``X*!(#M"R"`#S@H$&X+!#X.$``V#A``.&YC&'Z.4_!4
+M```@`!`:#A`4'`X0`)JF40""(%``?!]@C-H"```"0!``?!]@$%4``"``P-P"
+M```$``@`>N!7`08`(`!\'V!MW`(```0`"`!ZX%<P50``(`""`P`@`)H)*`!\
+M'V#$W`(``'P_8&S<`@``A"`(@!@'*%!5```@``'^'V"`N0DH(/X?8("9_B\`
+M?!]@6-X"```$``@`>N!7<%4``"``@AX`(`!\'V#DW`(`````"`!ZX%>!!P`@
+M`'S?81BP`@"050``(```'`=@`)43*`!ZX%>!%0`@`'P_8"BP`@`!_A]@`/4&
+M*+!5```@```<!V"`+B`H`'K@5X$1`""`$``@`'P?8.C<`@`````(T%4``"``
+M`'K@5X$!`"``?-]A(+`"`(#U_R<`?!]@K=P"```$``CP50``(```>N!7@0H`
+M(`!\/V`HL`(``OX?8`#J!B@```!0`(83*!!6```@``!ZX%<!`@`@`%$@*`!Z
+MX%<!!0`@``0`((#L$2B`"A(H,%8``"```'K@5X$"`"`!_A]@`)`%*`!ZX%>"
+M```@`?Z_88!4#2A05@``(```^N97`0$`(`'^'V```@`@````4``!`"``40TH
+M`/[_)W!6```@`!``K@D4`,X)!(#M"R"`#S@8$&X+`'Q?8`3@`@```"$(D%8`
+M`"```(``<````1``@`\X`'Q?8`3@`@```"$(`(``:````1"P5@``(```@`\X
+M$`!@"`P```@`>N!7`08`(`#ZX5<!!0`@.(A!"-!6```@```((`@`A"!0``*`
+M$#B(00@"""`(`(0@0`("@!````!0\%8``"``@```(`_^'V``@`\X`OX?8`"`
+M#S@$/@X0`#8.$``X;F,05P``(``D?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A``
+M`.!A@(S\+S!7```@````P&$`?#]BZ*X"``"`"`@`>N!7@3$`(`YZX%>-,``@
+M4%<``"```7X`4``.`!H`>N=7@2X`(`"$_"\!>N!7`BT`(`"`"`AP5P``(```
+M>N!7`0(`(`5ZX%<-`0`@3`0'"(`(`"``?#]BZ*X"`)!7```@``"`"`@&>N!7
+M!0(`(`IZX%<-`0`@4`0'"``$`"``?#]BL%<``"``Z*X"``"`"`@+>N!7!0(`
+M(`YZX%<-`0`@5`0'"``*H!G05P``(`!8!`<(``J@&%P$!P@`"H`88`0'"``*
+M8!AD!`<(``K`&/!7```@``"*!Q@`@>%7#`(`(`)^*(``?%]@#-T"```&`"``
+M`>)7$%@``"``C`8`(`)^*(``?%]@#-T"``"$@$$`!@80`'P_8NBN`@`P6```
+M(```@`@(#GK@5X(1`"``A$!```P!$``0`"``@>)7C`8`(%!8```@``)^*(``
+M?%]@#-T"``"$@$$`"`80`'P_8NBN`@``@`@(<%@``"``#GK@5P(*`"``A$!`
+M``8!$(`(`"``@>97`GXH@`!\7V"06```(``,W0(`C`$`(`"$0$``"`$0@`0`
+M(`"$@$$`&@80`'P_8K!8```@`.BN`@``@`@(#GK@5P(!`"``A$!```H!$`!\
+M'V`,W0(`T%@``"``@-0#*!``K@D4`,X)&`#N"1P`#@H@`"X*!(#M"R"`#SCP
+M6```(``D$&X+!#X.$``V#A``.&YC$'Z.4X#T$R@``"!@`/K@5Q!9```@``$"
+M`"!(_A]@``1!4`!H)RB````@````4`2`[0L@@`\X,%D``"``$!!N"P0^#A``
+M-@X0`#AN8Q!^CE.`*Q0H```@8`#ZX%=060``(``!`@`@0?X?8``$05``8"<H
+M@```(````%`$@.T+((`/.'!9```@`!`0;@L$/@X0`#8.$``X;F-(?HY3$!H.
+M$!0<#A`8'@X0D%D``"``'"`.$"`B#A`D)`X0*"8.$"PH#A`P*@X0-"P.$#@N
+M#A"P60``(`````!0]($-$`"F:5(`FJ91`!S'40">YU'\@0T0^($-$-!9```@
+M`(#E]"\``.!B`'Q?8&BJ`@`(`0$(`'K@5X%O`"``?#]@\%D``"``9,H"``R`
+M``@`>N!7`6T`(`!\/V!DR@(`"(``"`1^0(`06@``(``0@``(``1``@!\7V!H
+MJ@(```$!"```H&(`J@IB`"S+4C!:```@`!````@`>N!7@0H`("4$``@`>N!7
+M`@$`(`":IE&````@4%H``"```?Z_80!\7V!HJ@(```$!"!````@F!``(`'K@
+M5P(!`"!P6@``(```',=1@```(`'^WV$`?%]@:*H"```!`0@0```((P3@"9!:
+M```@``B`"@@`?%]@:*H"```!`1``>N!7`@$`(````%`$`0$0L%H``"```'Q?
+M8&BJ`@`(`0$(_W\`0`@!`1`0@`H(`'K@5P$!`"#06@``(``#_A]@@```(`G^
+M'V#\@4T0`'KH5P%+`"``@O\O```@8O!:```@`!"`"@@`>N!7@0``(`P`"`H`
+M>NA7@1``(``("`@`((!"$%L``"``]*4-$`(("`@``"!@#``("@!ZZ%<`)F!"
+M`@$`(``LRU(P6P``(`"````@`"1`0O2!30@#_@!`_']@8/R!K0CX@<T(`_X?
+M8%!;```@```H*F``+(M@`+H>*```(&``^N!7`CD`(`!\7V"4O`(`<%L``"``
+M/``!"`!\(&@``@``-``!"``"`!0`>NA7@N__)P!\7V"06P``(`!HJ@(`#`$A
+M"`"F`!`0@`H(`'K@5P$#`"`!^NA7`@$`(+!;```@``+^'V"``0`@`_X?8(``
+M`"`$_A]@`'Q?8&BJ`@`,`2$(T%L``"``$/Y&@````6@1?D>````!:!C^1X``
+M``%H!(``$`'^WV+P6P``(``0@`H(`'K@5P$!`"`$_A]@@```(`K^'V#\@4T0
+M^*L-$!!<```@``!\7V!HJ@(`#`$A"`""@&((_B!`#`,!$`!\?V#$BP(`,%P`
+M`"``>/X!0`"!X%>.```@#`<!$/3_34``?!]BD*@"`!@`"`A07```(``````(
+M"``H"`/^((``@`!````!$!``"`@``"`*"'Y(0G!<```@`("1]"\(`"@(`?X@
+M0`"#Z%>-```@`*(@4``""1"`D/0OD%P``"``](%-"/R!K0CX@<T(`_X?8``H
+M*F`(_G]@`"R+8("/'BBP7```(````"!@`/K@5X(.`"``?%]@E+P"`#P``0@`
+M?"!H``(``-!<```@`#0``0@``@`4`'P_8&3*`@`(@``(`7X`0`B``!`0>N!7
+M\%P``"```@$`(````%`(@``0`'P_8&3*`@`,@``(_W\`0`R``!`070``(```
+M>N!7@@``(("R(R@`IFE2@!\H*```(&``^N!7`0(`(#!=```@`$3^'V``!$%0
+M@.0F*(`&`"``?%]@:*H"``@!`0@`>N!74%T``"``@0(`(`!\/V!DR@(`#(``
+M"`!ZX%<"D_\G`*X+8(!T]"]P70``(`````!0$`"N"10`S@D8`.X)'``."B``
+M+@HD`$X**`!N"I!=```@`"P`C@HP`*X*-`#."C@`[@H$@.T+((`/.$@0;@L$
+M/@X0L%T``"```#8.$``X;F,4?HY3$!H.$```H&$`^N97`0T`(!"`!@C070``
+M(```>N!7@0(`(`":!F"`&O\O```@8`#ZX%<""P`@`&+T+_!=```@``!\7V!H
+MJ@(`"`$A"`#ZX%>"`0`@!!L!$``;`1"``0`@$%X``"``!`$A"`B:`!`$&P$0
+M`'Q?8&BJ`@`(`2$(`?X@0`@#`1`P7@``(```7/0O@&?_+P``(&``^N!7`0(`
+M($;^'V``!$%0`,(F*%!>```@`(```"````!0$`"N"02`[0L@@`\X%!!N"P0^
+M#A``-@X0<%X``"```#AN8Q1^CE,0&@X0`%#T+P``H&$`Q!,H```@8`#ZX%>0
+M7@``(``!`@`@0/X?8``$05``N"8H@`$`(`":!F``3?0O````4+!>```@`!``
+MK@D$@.T+((`/.!00;@L$/@X0`#8.$``X;F,<?HY3T%X``"``$!H.$!0<#A`8
+M'@X0``#`80!\/V#HK`(``(``"`%ZX%?P7@``(`"!_?\G`OX?8`"``!``GN=1
+M`'Q?8.S*`@`0!`$(`'K@5Q!?```@``$+`"``FJ91`)HF0`":($`"_B"``'Q?
+M8.S*`@``A`!`,%\``"``&@0`"`!ZX%>!!``@%'X!0``"($``'`=@!OY?8("S
+M]2]07P``(```>N!7`@$`(`'^_V&``0`@`?ZF00/ZYE>+]?\G````4'!?```@
+M``!\/V#HK`(``(``$`">!V`0`*X)%`#."1@`[@D$@.T+D%\``"``((`/.!P0
+M;@L!_F!@`/KA5X("`"``A"`8!'X`0`'^8&"P7P``(```^N%7@?W_)P``(`@`
+MA"!```(`$`"`#S@$/@X0`#8.$-!?```@```X;F,4?HY3$!H.$`'^'V``@B!0
+M`'Q?8`!]````AF%0\%\``"``@%4.*`!\'V#@R`(```@@"`3ZX%<!`0`@`?K@
+M5P(#`"`08```(`````!0`'P_8`!]````!$%0`?Y_8(`"`"````!0`((@4#!@
+M```@``!\7V``?0```(9A4`!,#B@`?+]A/+<"``"!!@@`>N!74&```"``@04`
+M(`!\'V#@R`(```@@"`""`$```@!``GX`@``:`$!P8```(``<`0`(``(`.```
+M`%``@080$`"N"02`[0L@@`\X%!!N"Y!@```@``0^#A``-@X0`#AN8QA^CE,0
+M&@X0%!P.$`":IE$"_D:`L&```"```'P_8%3!`@```L%!``$'"`!ZX%<!%0`@
+M"`$'"`!ZX%?08```(`"!$P`@@),<*!@!)P@``^!7!0$`(``"(%```0`@_X,_
+M4/!@```@``"`($`0`P<0`OY&@`!\/V!4P0(```+!01@!!Q``?']@$&$``"``
+M/+<"```&(4`(@0`($`%'"``!X5<,"``@`(8&0`0%``@P80``(``!>N!7`@,`
+M(``!!P@(@0`0`)H&8`""(%``*?@O``0`(%!A```@``@!!P@(@0`0`)H&8`'^
+M/V``)O@O``$`(``$`%`(@0`0<&$``"```?ZF00+ZYE<%YO\G$`"N"10`S@D$
+M@.T+((`/.!@0;@N080``(``$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A``',=1
+M`'Q?8+!A```@`%"Y`@`Z!0$(`'K@5P(<`"`0`6$(`/KA5X$:`"`*"0$(T&$`
+M`"```'K@5P(9`"`("0$(`7X`0`@!@1`!_A]@"@&!$`"&`6#P80``(``0`*`)
+M%`$A"`"#X5<"`@`@`((@4!`#`1`4`P$0``(`(!!B```@``B`(0@0`P$0`((@
+M4`@"`!`UA"8(`?X@:#6"1A``?%]@,&(``"``4+D"`#P)(0@0_B!`/`.!$'*"
+MAA```X$0`?X_8`(#01!08@``(`!<A"8(L/K@5P$&`"``^N!7`04`($CZX%<!
+M!``@.`4A"'!B```@``#ZX%==A"8(`0$`(!#^(&B````@[_\@8%V"1A``(P(H
+MD&(``"````#`88#^'V!'@$80@`<`(`!\7V!0N0(`"`D!"`!ZX%>P8@``(``"
+M!0`@`'P?8#;?`@``!``(`'K@5X("`"`!_A]@`#@(*-!B```@``3^'V``C@@H
+M`(X(*``<!V`0`*X)%`#."02`[0L@@`\X\&(``"``&!!N"P```%``@`\X````
+M4`"`#S@```!0`(`/.````%`08P``(```@`\X`/K@5X$G`"`*"$`(`'Q_8%2N
+M`@``@"$(`(0@0#!C```@``""`1`4"(`(`'Q_8-"M`@``@"$(`(@@0`""`1`6
+M"(`(4&,``"```'Q_8-2M`@``@"$(`(@@0`""`1`8"(`(`'Q_8-BM`@!P8P``
+M(```@"$(`(@@0`""`1`:"(`(`'Q_8#BM`@``@"$(`(@@0)!C```@``""`1`<
+M"(`(`'Q_8#RM`@``@"$(`(@@0`""`1`>"(`(L&,``"```'Q_8$"M`@``@"$(
+M`(@@0`""`1`""(`(`'Q_8+2Y`@#08P``(`"8@2$(`(@@0)B#`1`$"(`(G($A
+M"`"(($"<@P$0!@B`"/!C```@`*"!(0@`B"!`H(,!$`@(@`BD@2$(`(@@0*2#
+M`1"H@2$($&0``"```(0@0*B#`1`,"$`(K($A"`"$($"L@P$0#@A`"+"!(0@P
+M9```(```A"!`L(,!$!`$(`BT@X$0$00@"+:#@1`@""`(N($!"%!D```@```"
+M`$"X@0$0````4`"`#S@$/@X0`#8.$``X;F,0?HY3<&0``"```'P?8'R[`@``
+M]A<H````4`2`[0L@@`\X$!!N"P!\'V"09```(`!TO`(`)$D`"`"`#S@$/@X0
+M`#8.$``X;F,0?HY3``!@8+!D```@``!\'V#P#0```((@4`3^7V``%?4O```@
+M8`#ZX%<!`@`@T&0``"``4OX?8``$05"`\"4H@```(`""`&`$@.T+((`/.!`0
+M;@OP9```(``$/@X0`#8.$``X;F,0?HY3``!@8`!\'V`.#@```((@4!!E```@
+M``3^7V"`"O4O```@8`#ZX%<!`@`@4_X?8``$05``YB4H,&4``"``@```(`""
+M`&`$@.T+((`/.!`0;@L$/@X0`#8.$``X;F-090``(``0?HY3``!@8`!\'V#C
+M#0```((@4`C^7V```/4O```@8'!E```@``#ZX%<!`@`@5?X?8``$05"`VR4H
+M@```(`""`&`$@.T+D&4``"``((`/.!`0;@L$/@X0`#8.$``X;F,0?HY3``!`
+M8`""8&"P90``(```?!]@,`X````$(6`$_E]@`/7T+P``(&``^N!7`0(`(-!E
+M```@`%3^'V``!$%0@-`E*(```"``@@!@!(#M"R"`#S@0$&X+\&4``"```'K@
+M5P$/`"``?!]@<-X"``````@`>N!7@0,`(`!\/V`09@``(````"$`#,1`"`'^
+M'V`(@$`4`7X!:`R`0!0`?!]@=-X"`#!F```@``````@`>N!7`0H`(`!\'V!L
+MW@(``$``"`!ZX%>!!P`@4&8``"```'P_8```(0`,Q$`(`OX?8`B`0!0"?@%H
+M#(!`%(`#`"!P9@``(```?#]@```A``S$``C\?P!@#(!`%`/^'V`(@$`4`(`/
+M.)!F```@``!\/V!\W@(``(``$````%``@`\X!#X.$``V#A``.&YCL&8``"``
+M%'Z.4Q`:#A``?!]@9=X"``!$``@`>N!7`0,`(`!\OV'09@``(`!TP0(`"/\&
+M0(!;`2@`_P9``+<;*`!\'V#,'@```#CY+_!F```@`(!!\R\`!$%0`'P_8*[>
+M`@``A$`0@$'S+P+^'V``?+]A$&<``"``>+P"``"`AA``?+]A-+T"``#_!D#_
+M_S]@@'87*`!\'V`P9P``(`"PW@(```@`"`!ZX%<!`0`@`(09*$"!!A``?%]@
+ME+P"`%!G```@`!P``0@`?"!H``P``!0``0@``@`4!/X?8`!\OV%XO`(`<&<`
+M`"```("&$(`N(B@```!0``0<*`7^'V``@(80$`"N"02`[0N09P``(``@@`\X
+M%!!N"P0^#A``-@X0`#AN8QQ^CE,0&@X0%!P.$+!G```@`!@>#A```.!A*/Z_
+M80`H\R\``,!A*/X?8(!,]R\`?!]@T&<``"```(D"``!_8$``?!]@L+8"`$8)
+M(`@`AD!`!/X?8`"&8$#P9P``(```@$$0"_X?8`(`01````!0`P!!$`""(%`(
+M?D%``/P`0!!H```@`+"V`@`D!0`(``!!$`%^04`!_B!`(/K@5PO\_R<`F@9@
+M,&@``"```)XG8(`W*R@`'`=@@!KS+Q``K@D4`,X)&`#N"02`[0M0:```(``@
+M@`\X'!!N"P0^#A``-@X0`#AN8U!^CE,0&@X0%!P.$'!H```@`!@>#A``%B(H
+M<OX?8`!\/V```"$`%(!`%!2`0!0!_A]@D&@``"``@`H@*`!ZX%>!`0`@7/X?
+M8,;^/V``&BTH``1!4`!\/V"P:```(````"$`#(1`%`"$0!2`_A]@`(!`%/_^
+M'V`(@$`4X/^M0=!H```@``":!F"`>!LHZ/\M0-C_34``F@9@`)X;*-B!#0@R
+M>N!7\&@``"``!?O_)PC^'V``?#]@```A``R`0!0!_C]@`'R_832]`@`0:0``
+M(``D@T80`'P?8-2X`@#4_VU``?X_8``$05#__Y]@`",6*#!I```@`!R!!@@!
+M?@!`'($&$`!\'V!EW@(``$0`"`!ZX%<!$0`@4&D``"``````4`#(_R_X_\U!
+M`!P'8`!G&R@`?+]A=,$"``#_)D!P:0``(`#P_^U!`!P'8`">1V``BQLH"($&
+M",R!#1`,@08(T($-$)!I```@`,S_#4``GB=@`!Q'8`!%&RC\@0T(^($M"`!\
+M7V!HW@(`L&D``"```$!!"`!\?V!LW@(``,!A"`!\WV#,'@````B"4`"*HE#0
+M:0``(`"`OO@O@`$`(`!\'V#,'@``@+;_+P'^/V``?!]@`+8"`/!I```@```"
+M0!0`!$%0`'P?8+/>`@``!$`0"/X?8`!\/V```"$`$&H``"``#(!`%(`>_R\`
+M'/\O@!S_+P`:_R^`*0(H`'R_832]`@`P:@``(```_P9`__\_8(`4%R@0`*X)
+M%`#."1@`[@D$@.T+((`/.%!J```@`%`0;@L$/@X0`#8.$``X;F,D?HY3$!H.
+M$!0<#A`8'@X0<&H``"``'"`.$"`B#A```,!A`"`(4@+^_V$`S_(O``"@80!\
+M'V"0:@``(`!TNP(``$0`"`%ZX%>"`0`@`?X?8@'^'V``5Q,H`,KR+[!J```@
+M````(&(`G@=@@.[V+P!\'V``B0(``']`0`!\'V"PM@(`T&H``"``1@D@"!3^
+M'V``A$!```!!$`">!V``'"=@`.$J*`"B"&#P:@``(```Q/(O`7KH5P(!`"``
+M``!0`$P3*`":!F``P?(O$`"N"1!K```@`!0`S@D8`.X)'``."B``+@H$@.T+
+M((`/."00;@L$/@X0,&L``"```#8.$``X;F,4?HY3$!H.$`!\'V"@M@(```$`
+M"`AZX%=0:P``(`"&`@`@`+7R+P``H&&`C`LH`)H&8("U\B\0`*X)!(#M"W!K
+M```@`""`#S@4$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A``KO(OD&L``"```'P_
+M8+C>`@``@*`)``1!4`"$`!``?#]@O-X"``"$`!"P:P``(```K/(O`/KF5X$!
+M`"``F@9@@+LH*(```"````!0$`"N"=!K```@``2`[0L@@`\X%!!N"P0^#A``
+M-@X0`#AN8Q1^CE,0&@X0\&L``"``@*'R+P!\/V#`W@(``("@"0`$05``A``0
+M`'P_8,3>`@`0;```(```A``0@)_R+P#ZYE>!`0`@`)H&8`"O*"B````@````
+M4#!L```@`!``K@D$@.T+((`/.!00;@L$/@X0`#8.$``X;F,P?HY34&P``"``
+M$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0``"@80""`&)P;```(```',=1&/X_
+M8H"0\B\``.!A`'P?8'2[`@``1``(`7K@5Y!L```@`((!`"`!_M]A`?X?8(`8
+M$RB`B_(O``!`8@"B"&``L/8OL&P``"```'P?8`")`@``?V!``'P?8+"V`@!&
+M"4`(``8A0`;^'V#0;```(```!F%``(!!$`"(!@@"@(`0`H@&"`2`@!`$B`8(
+M!H"`$/!L```@``:(!@@(@(`0"(@&"`J`@!`*B`8(#("`$!*$1@@%>N%7$&T`
+M`"``@@H`(`!\7V!0OP(```$!"/B!#1`$"0$(_(&-$/_^'V`P;0``(``3@$80
+M^/\-0``(0`@(A(`0`@A`"`J$@!`$"$`(#(2`$%!M```@```(0`@.A(`0`@A`
+M"!"$@!`$"``($H"`$!*$1@@4A$`0<&T``"``$X0&"!:`0!````!0%8!`$!6$
+M!@@`>N!7`0$`(`'^'V"0;0``(``5@$`0%H0&"`!ZX%>"`0`@%80`"`)^`&@5
+M@$`0%X0&"+!M```@``!ZX%>!`0`@%80`"`1^`&@5@$`0&(0&"`!ZX%>"`0`@
+MT&T``"``%80`"`A^`&@5@$`0&81&"`!ZX5>!`@`@%80`"!!^`&CP;0``(```
+M#@`8('X`:!6`0!````!0%X!`$!2$!@@`>N!7`0$`(!!N```@`!#^'V`7@$`0
+M&X0&"`!ZX%>!!``@%X1`"`%^`6@7@$`0,&X``"````Y`&!N$!@@">N!7`@$`
+M(`)^`6@7@$`0`'P?8-RL`@!0;@``(``````(!'X`8`!ZX%>"`0`@%X1`"(!^
+M`6@7@$`0$H1&"'!N```@``!\'V!DW@(```1`%!F$1@@`?!]@9=X"```$0!0`
+MH@A@D&X``"```"`H8(!K*B@`)`E@@$[R+P%ZYU<"`0`@````4(#6$BBP;@``
+M(```G@=@@$OR+Q``K@D4`,X)&`#N"1P`#@H@`"X*)`!."M!N```@``2`[0L@
+M@`\X,!!N"P!\/V#<W@(``(``$`"`#S@$/@X0\&X``"```#8.$``X;F,0?HY3
+M`'P?8+C>`@`````(`'K@5X()`"`0;P``(```?!]@P-X"``````@`>N!7`@<`
+M(`!\'V"4MP(`__\_8#!O```@`(!U%B@`?!]@N-X"``````@`>N!7@@(`(`!\
+M'V#`W@(`4&\``"``````"`!ZX%<!^?\G!(#M"R"`#S@0$&X+`'P_8'3>`@!P
+M;P``(```@``0`'K@5X("`"``?#]@```A``S$``C]?P!@#(!`%)!O```@``"`
+M#S@`?#]@<-X"``"``!``>N!7@@(`(`!\/V```"$`L&\``"``#,0`"/Y_`&`,
+M@$`4`(`/.`0^#A``-@X0`#AN8RA^CE/0;P``(``0&@X0%!P.$!@>#A`<(`X0
+M("(.$"0D#A```$!B`(*@8?!O```@```$P6$`AB%B$?[_80`@\B\```!B$?X?
+M8(!$]B\`?!]@$'```"```(D"``!_0$``?!]@L+8"`$8)(`@`A&!`"/X?8`"$
+M0$`P<```(````$$0`J1!$`.:01``@B!0`/KF5XX#`"``!$<(`((!0%!P```@
+M``0$0!`!?L=!`?X@0`"#YE>-_/\G`)X'8`"B*&"`,"HH<'```"```"`(8(`3
+M\B\0`*X)%`#."1@`[@D<``X*(``N"B0`3@J0<```(``$@.T+((`/."@0;@L`
+M>N!7@0$`(`!\/V!XW@(``(``$+!P```@``"`#S@$/@X0`#8.$``X;F,H?HY3
+M$!H.$!0<#A`8'@X0T'```"``'"`.$"`B#A`D)`X0``#@80""`&(`',=1!/Z_
+M80`"\B_P<```(````$!B`'P?8'2[`@``1``(`7K@5X(!`"`!_M]A`?X?8!!Q
+M```@``"*$B@`_?$O```@8@":!F"`(?8O`'P?8`")`@``?T!`,'$``"```'Q_
+M8+"V`@!&B2$(`(2`0!7^'V``A$!```!!$`">!T!0<0``(```'@!``WX`@``>
+M`$````!``@""$$RA`1``F@9@`"`H8'!Q```@```0*B@`H@A@`//Q+P%ZYU<"
+M`0`@````4`![$B@`)`E@D'$``"```/#Q+Q``K@D4`,X)&`#N"1P`#@H@`"X*
+M)`!."@2`[0NP<0``(``@@`\X*!!N"P0^#A``-@X0`#AN8Q1^CE,0&@X0`'R_
+M8=!Q```@`+2Y`@``@080`'P?8`0P``"`Z/<O!/\&0/__/V``'A8H\'$``"``
+M$`"N"02`[0L@@`\X%!!N"P0^#A``-@X0`#AN8S!^CE,0<@``(``0&@X0%!P.
+M$!@>#A`<(`X0("(.$"0D#A`H)@X0+"@.$#!R```@````@&(`@F!B``3!80"&
+MH6$`"$)B`(HB8@">YU$`UO$O4'(``"``````8@!\'V!TNP(``$0`"`%ZX%>"
+M`0`@`?[_80'^'V!P<@``(```7A(H`'P?8&C>`@``'``4`'P?8&S>`@``&@`4
+M`"@*8)!R```@``"F*6``'$=@`)IF8``(@E``)*E@`*+(8("C]R\!^N=7L'(`
+M`"```@$`(````%``51(H`"`(8`#*\2\0`*X)%`#."1@`[@G0<@``(``<``X*
+M(``N"B0`3@HH`&X*+`"."@2`[0L@@`\X,!!N"_!R```@``0^#A``-@X0`#AN
+M8QQ^CE,0&@X0%!P.$!@>#A```,!A$',``"```'KG5XP.`"`.>N=7B0T`(``.
+MYQD`G@=@@(X:*`'^'V`P<P``(```1A(H`?X?8`!\OV%TO`(``(%&%`!\/V`8
+M&0```)X'8%!S```@`(#5]R\(_P9`"OX_8`#P%2@```!0`(%&%````%"`/A(H
+M<',``"``))V&%"B!!@@`>N!7@0``(("7`"@```!0@```(`'^'V"0<P``(``0
+M`*X)%`#."1@`[@D$@.T+((`/.!P0;@L$/@X0`#8.$+!S```@```X;F,X?HY3
+M$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0T',``"``*"8.$```8&(`HBA2$(!)
+M"@`D"6``@B!0@#L;*$X(Z0GP<P``(`!=!`D(^W\`8%T`21``#@`8B`A)"`"%
+MYU<*`0`@!'X`:!!T```@`%T`21``(`A2D`0)"`"!YU>!`P`@`7X(0``0`!H#
+M?@B`,'0``"`````I0)"$``@`@>=7@OS_)P">!T``'@!``"``0``.(!A0=```
+M(```?$E```(``.D%`0@``@!0``X@&$`$"0@`>N!7`0$`('!T```@``">`%``
+M#B`87'[)07H("0@`#J`9B`A)"`!ZX5<!!``@D'0``"```'Q)0``"``#E!0$(
+M`'K@5P$3`"`!_@!```X@&(`1`""P=```(`!)!`D(`'K@5P$0`"``^N=7@0@`
+M('(("0@`?`!@\/\``-!T```@```0`!@`'@!H<@")$$X("0B("$D(``7@5X(#
+M`"#__P!`\'0``"````X@&`!\24```@``Y04!"/M_`&#E`4$07`0)"`!\24`0
+M=0``(````@``Y`%!$%T$"0@(?@!HY0%!$%X("0CF`8$0!'['03!U```@``3^
+M!E``#J`9`.W_)P+^'V#\@4T0`'Q)0``"``#%!0$(4'4``"``_8%-$/Z#31#$
+M!0$(_X%-$````%#``0$0P'\!0/R!30AP=0``(``@_C]@`*9I8(!"$BA`!`D(
+M`'K@5X$'`"``?']@?+T"`)!U```@``"!(0@(_D"`?WX`8`%^`%``!`!H6``)
+M$`'^`$``@0$0L'4``"``6'X)0`3^/V``!$%0`(9A4(`Y$B@`?$E```(``.4%
+M`0C0=0``(```>N!7@0(`(.1_`4`$_C]@``1!4`"&85"`-!(H`!P'8/!U```@
+M``":)F``!$%0`(9A4``R$B@4"`D(`'K@5X$0`"`#?@B`$'8``"`````I0)2`
+M``B2B"`(``1!4`"&85``+1(H`7X(0``0`!HP=@``(``#?@B````I0(F$``A`
+M?@!@`'K@5X'X_R>("$D(`'KA5U!V```@`($'`"`!_C]@`'P?8#??`@```D`0
+M`(7G5XH$`"``(`A@<'8``"```"0I8("'*2@```!B`?X'0``0X!F("$D(`(7G
+M5XO[_R>0=@``(```H@A@$`"N"10`S@D8`.X)'``."B``+@HD`$X**`!N"K!V
+M```@``2`[0L@@`\X.!!N"P0^#A``-@X0`#AN8RA^CE,0&@X0T'8``"``%!P.
+M$!@>#A`<(`X0("(.$"0D#A```$!B`((@8@`$`6+P=@``(```AN%A``C"88!`
+M\2\``*!A!OX?8`!E]2\`?!]@`(D"`!!W```@``!_8$``?!]@L+8"`$8)0`@`
+M!B%`#_X?8``&84``@$$0,'<``"```J)`$`.@0!`$I$`0!9Y`$`;^'V``'"=@
+M`%4I*`":!F!0=P``(```./$O$`"N"10`S@D8`.X)'``."B``+@HD`$X*!(#M
+M"W!W```@`""`#S@H$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A```*!AD'<``"``
+M@"WQ+P!\/V"<NP(``)H`$``N\2\`F@9@@!(`*!``K@FP=P``(``$@.T+((`/
+M.!00;@L$/@X0`#8.$``X;F,4?HY3$!H.$-!W```@`!``H`E0A"8(`/K@5X($
+M`"``FB9@`(,J*`!ZX%>!`0`@\'<``"```?X?8%"`1A```0`@````4(```"`!
+M_A]@$`"N"02`[0L0>```(``@@`\X%!!N"P0^#A``-@X0`#AN8Q!^CE,`?!]@
+MQ1@``#!X```@``!$_B\$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,L?HY34'@`
+M`"``$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0*"8.$```(&)P>```(```FJ91
+M`)[G40`@"%(`^NA7`@$`(`_^'V"`'@`@@&#X+Y!X```@````P&$`#?$O``!@
+M8H!]_2\``$!B`GX)@`"`"$#\`2`*L'@``"```*8)8(`+\2\`>N=7`1<`(`!8
+M^"\!>N!7@A4`(````%#0>```(``%>NE7C`(`(`IZZ5<)`0`@!/X?8(```"`(
+M_A]@`!P`0/!X```@`$Q^0$!,!``(`('H5XH&`"`$^N=7B@4`(``<"$!8?D!`
+M$'D``"``6`0`"`'^)T``CN`9!'XH0`".`!H`@>A7"@$`(`3ZYU<P>0``(`"+
+M^O\G``H@&`"*"!@`@>!7B04`(`($80@/_@%@``X`&%!Y```@``,$(0@!!$$(
+M\/YA8`3^89``CF$8``B"4`"J_R^``0`@<'D``"``(_Z_88```"`G_K]A`)H&
+M8!``K@D4`,X)&`#N"1P`#@J0>0``(``@`"X*)`!."B@`;@H$@.T+((`/."P0
+M;@L$/@X0`#8.$+!Y```@```X;F,P?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A`D
+M)`X0T'D``"``*"8.$```8&(`@B!B``1!8@"&`6(%_@A``!#`&0#B\"_P>0``
+M(````.!A!/X?8`!\OV&PM@(`1H&&$`!\/V``B0(`%_X?8!!Z```@``2!0!`!
+M_@E`!H%`$`>C0!`(_T!``((@4`'^"$``@>!7,'H``"``"@0`(``$"0@``$$0
+M`7Y!0`%^24(!_B!``?X(0`"!X%=0>@``(``+_/\G`'R_8;"V`@!&B48(1(4&
+M"`!\/V``B0(```)A0'!Z```@``&!01`!?@!```X@&$2!1A#_^N!7"P$`((#^
+M'V!$@480D'H``"```?Z?8/R)31``?+]AL+8"`$:)1@@`?#]@`(D"```"84"P
+M>@``(``!A0$(_8%-$/Z)31``A0$(_X%-$`"B*%(`?`%``(<"`-!Z```@`/PB
+M`!`$?D%0`/\`0````4`$?B=``)`@&/R!30@`(&A@\'H``"``@),1*`">!V``
+MP_`O!/X?8$B!AA!&HX80$`"N"10`S@D0>P``(``8`.X)'``."B``+@HD`$X*
+M*`!N"@2`[0L@@`\X,!!N"S![```@``0^#A``-@X0`#AN8Q1^CE,0&@X0`)JF
+M40#ZX%>"```@4'L``"``(_Z_80!\'V`TO`(`@!D5*`":!F`0`*X)!(#M"R"`
+M#SAP>P``(``4$&X+!#X.$``V#A``.&YC$'Z.4P!\'V!TO`(`)$D`")![```@
+M`(#K_B\$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,0?HY3L'L``"```'P?8/2X
+M`@``#A4H````4`2`[0L@@`\X$!!N"P0^#A#0>P``(```-@X0`#AN8Q!^CE,`
+M``!0@"']+P2`[0L@@`\X$!!N"_![```@``0^#A``-@X0`#AN8Q!^CE,`?!]@
+MKMX"```$``@`>N!7$'P``"```0$`(````%``)?TO!(#M"R"`#S@0$&X+!#X.
+M$``V#A`P?```(```.&YC$'Z.4P""(%``*_TO!(#M"R"`#S@0$&X+`'K@5U!\
+M```@``$4`"``?%]@4+D"`!`!(0@`^N!7@1$`(!0!80@`^N%7<'P``"```1``
+M(`"'X%<"`P`@``/@5P(.`"``@B!0$`,!$!0#`1"0?```(```#``@``/@5X(!
+M`"`(@"`($`,!$``&`"`(@$`(`'KA5[!\```@``$(`"``!>!7`@4`(`@`00@(
+MA``0`'KA5X(!`"``?%]@T'P``"``4+D"`!0#`1``@B!0"`(`$``"`"``!"%@
+M"`!!"`!ZX5?P?```(``"^/\G`(`/.`0^#A``-@X0`#AN8RA^CE,0&@X0%!P.
+M$!!]```@`!@>#A`<(`X0``#@80`<QU$`FJ91_)L-$(!Z\"\`?%]@,'T``"``
+M]+`"```$(0@`^N!7@08`(``:01``?%]@Z-8"````(0A0?0``(```^N!7@0,`
+M(!B:0!`-FD`0`!H!$`!\/V"<MP(`3IN`$'!]```@`&:;0!"`<_`O`'P?8*?:
+M`@``!``(!7K@5P$#`"`,>N!7D'T``"```0(`(`-ZX%<!`0`@!'K@5X(!`"``
+M``!0@.`$*``$`""P?0``(``!>N!7`0,`(!1ZX%<!`@`@%7K@5P$!`"````!0
+M@#8`(-!]```@``!\7V#HU@(````A"`#ZX%>!)``@&(0`"`!ZX%<!(P`@\'T`
+M`"```"(5*````&(`>NA7@04`(/S_34``(`A@`_X_8(!=%2@0?@``(```>N!7
+M`0(`('7^'V``?#]@RPD```!J*B@!_M]A````4#!^```@`(#W_"\`,00H`?X?
+M8``6]R\```!0@-_\+P#ZYU<!!0`@4'X``"```'Q?8.C6`@```"$(!H0`"("1
+M_B\`?!]@WMH"``""(%!P?@``(`"`N?TO`$@<*`":IE$`?%]@Z-8"````(0@8
+MFD`0#9I`$)!^```@```:`1``?#]@G+<"`&:;0!``>N=7@04`(/B;#1#\@2T(
+ML'X``"``^/]-0``@"&``2!4H`'K@5P$"`"!U_A]@`'P_8/<)``#0?@``(`"`
+M5"HH`?X_8`!\'V"DVP(```)`$`!\/V"<MP(`+(4`"/!^```@``!ZX%<!`@`@
+M`)JF42R;0!`0_P!`@*04*`":IE$`?!]@$'\``"``WMH"`!D:0!`:&D`0`((@
+M4("C_2\`?!]@J-4"```$``@P?P``(```>N!7`0$`(````%"`P/PO!OX?8`"I
+M!"@'_A]@`*@$*%!_```@``C^'V``IP0H````4`"F!"@`FJ91`'P_8)RW`@!.
+MFX`0<'\``"``#OX_8`!\'V"GV@(```)`$`'^'V`0`*X)%`#."1@`[@F0?P``
+M(``<``X*!(#M"R"`#S@H$&X+!#X.$``V#A``.&YC%'Z.4[!_```@`!`:#A``
+MFJ91`-W\+P!\'V!XO`(```@`"`5ZX%>"!``@T'\``"```'P_8&"N`@``@``(
+M`7X`0`"``!``?!]@``(``(!'^2_P?P``(``!_K]A`)H&8!``K@D$@.T+((`/
+M.!00;@L$/@X0`#8.$!"````@```X;F,<?HY3$!H.$!0<#A`8'@X0``#@80""
+MP&$"_A]@,(```"``@(\$*`!\OV%,LP(`+/\&0/__/V``4Q0H````4(!>*2A0
+M@```(```?!]@H-H"```>0!#`G080`((@4`!\'V"CV@(```)`$'"````@``!\
+M'V"AV@(```)`$,B#1A`!_A]@QX%&$,6!1A!(_P9`D(```"```',4*````%`0
+M`*X)%`#."1@`[@D$@.T+((`/.!P0;@NP@```(``$/@X0`#8.$``X;F,0?HY3
+M`'P?8++>`@``!``(`'K@5]"````@`((W`"``?!]@L-X"```(``@`>N!7`08`
+M(`!\'V"?V@(`\(```"````0`"`!ZX%>"`P`@`'P?8`3;`@``!``(`'K@5P(!
+M`"`0@0``(`````!0@"\`(`'^7V``?#]@A-X"``"$0!````!0`)C\+S"!```@
+M`````%``R@,H`?X?8`"V]B\!_A]@@)L#*`!\'V"NW@(`4($``"````0`"`!Z
+MX%<!`0`@````4`!\_"\`?!]@L-X"```(``AP@0``(```>N!7`1,`(`!\'V"?
+MV@(```0`"`!ZX%>"$``@`'P?8)"!```@``3;`@``!``(`'K@5P(.`"``?!]@
+MKMX"```$``@`>N!7L($``"```0<`(`!\'V#>V@(``((@4(!/_2\`?!]@Z-8"
+M``````C0@0``(```>N!7@0(`(!@$``@`>N!7`0$`(`'^'V"`@/PO`?X?8/"!
+M```@`("R`R@```!0`(4#*````%``?#]@A-X"``"`0!"`$``@$((``"```?Y?
+M8`!\'V"RW@(```1`$`!\'V#HU@(`````"`!ZX%<P@@``(``!!@`@&`0`"`!Z
+MX%>!!``@`'P?8*[>`@``!``(`'K@5U""```@``$!`"`#_C]@``4`(`3^/V``
+M!``@`'P?8*[>`@``!``(<((``"```'K@5P$!`"`'_C]@@```(`C^/V``?!]@
+MI]H"```"0!"0@@``(``!_A]@!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC$'Z.
+M4[""```@`(#O%R@$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,P?HY3T((``"``
+M$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0``#@80":IE'P@@``(`````!0_($-
+M$`!\'V"$W@(```0`"`!ZX%<!`0`@!/X?8!"#```@``!R`"``?!]@I]H"```$
+M``@!>N!7`0$`(!1ZX%<"`0`@,(,``"``!?X?8(!M`"``?!]@N]H"``$$``@`
+M>N!7@0(`(`!\/V)0@P``(`#HU@(``(`("`!ZX%<"`0`@`_X?8(!G`"``_Q4H
+M`'P_8'"#```@`(S6`@!`@``0````4``F!"@`<!0H````8@!\'V#TL`(`D(,`
+M`"````0`"`!ZX%>"`@`@`'P?8*C5`@``!``(`'K@5X$#`""P@P``(`````!0
+M`!L$*`[^/V``?!]@I]H"```"0!"`6@`@`'KH5]"#```@`($%`"#\_TU``"`(
+M8`/^/V``HQ0H`'K@5P$"`"!U_A]@\(,``"```'P_8%4(``"`KRDH`?Z_80'^
+M'V"`0P,H````4``\_"\0A```(`````!0@"7\+P!\/V+HU@(``(`("`8$``B`
+MV/TO`/KF5S"$```@`($&`"````!0^($-$`":IE'\@2T(^/]-0``@"&"`E10H
+M4(0``"```'K@5P$"`"!U_A]@`'P_8',(````HBDH`'P_8NC6`@!PA```(```
+M@`@(&`0`"`!ZX%<!_M]A`AS'48#;%2@`?#]@C-8"`)"$```@`$2``!`!_E]B
+M`(`("`TD0!`8)$`0`'P?8/2P`@``!``(L(0``"```'K@5X("`"``?!]@J-4"
+M```$``@`>N!7@0,`(`[^/V#0A```(```?!]@I]H"```"0!````!0@/4#*``W
+M`"``0Q0H````8O"$```@``!ZZ%>!!0`@_/]-0``@"&`#_C]@@'X4*`!ZX%<!
+M`@`@$(4``"``=?X?8`!\/V`."0```(LI*`'^OV$!_E]B`'P_8M[:`@`PA0``
+M(``9I$@0&J1($````%`4@$@0`'KG5P$%`"````!0`!3\+U"%```@``"B"&``
+M@B!0@-S\+P!,`R@`?#]@G+<"`&NE0!"``0`@<(4``"```*((8`""(%"`V/PO
+M````4``4`R@`>N=7`0L`(`#ZYU>0A0``(```?#]BZ-8"``"`"`@.""`(!?Y`
+M@`"$`!@`!$!``OX`B+"%```@```$0$`&_@"(``0`0`!\/V"<MP(`3HD@"($!
+M`"``!$%0T(4``"``@"0#*(`#`"`!_E]@`",#*``"`"`!_A]@@#,#*`'^'V#P
+MA0``(`"`__LO`'P?8+K:`@``!"`(`)X'8``0`R@```!0`'P_8!"&```@`)RW
+M`@!K@4`0````4`#.`R@4_C]@`'P?8*?:`@```D`0,(8``"```*85*`!\/V",
+MU@(`6(``$`!ZYU>!```@@&`%*`!\'V!0A@``(`!(L0(`$/X_8``$05"`M!(H
+M`/KF5P$&`"````!0^($-$'"&```@`/R!+0CX_TU``"`(8(!/%"@`>N!7`0(`
+M('7^'V``?#]@D(8``"``=@D```!<*2@```!0@```(`?^'V`0`*X)%`#."1@`
+M[@FPA@``(``<``X*(``N"B0`3@H$@.T+((`/.#`0;@L`?!]@KMX"`-"&```@
+M```$``@`@`\X!#X.$``V#A``.&YC$'Z.4P!\'V"RW@(`\(8``"````0`"`!Z
+MX%<"`0`@````4``,`"``?!]@KMX"```$``@0AP``(```>N!7`0D`(`#Q^R\`
+M?#]@8*X"``"```@!?@!``(``$#"'```@``!\'V#HU@(`````"!@$``@`>N!7
+M`0$`(`3^/V"````@4(<``"``"/X_8`!\'V"GV@(```)`$`'^'V`$@.T+((`/
+M.!`0;@MPAP``(``$/@X0`#8.$``X;F,H?HY3$!H.$!0<#A`8'@X0'"`.$)"'
+M```@`"`B#A`D)`X0``"@80""0&(`!"%B`(;A80`(`F("_A]@L(<``"``@)\#
+M*`!\WV%,LP(`+'\'0/__/V``8Q,H`?X?8(!N*"C0AP``(`"\)0<0P",'$`!\
+M'V"CV@(``!Y`$`'^/V``?!]@H=H"`/"'```@```"0!#%`T<0`((@4,@#1Q``
+M?!]@HMH"```@0!`I`T<0$(@``"```/KG5P(!`"`%_A]@@`(`(`'ZYU<"`0`@
+M"/X?8(```"`PB```(``'_A]@*@%'$`C^'X"`/?@O`'S?84RS`@#P&P<0@'8F
+M*%"(```@``'^/V#'`T<0````4!``K@D4`,X)&`#N"1P`#@H@`"X*<(@``"``
+M)`!."@2`[0L@@`\X*!!N"P0^#A``-@X0`#AN8R!^CE.0B```(``0&@X0%!P.
+M$!@>#A`<(`X0````8@""X&$`2/4O`'K@5["(```@``(!`"`"_A]@``X`(`!\
+M'V"FV@(```0`"`%ZX%<"`0`@T(@``"``!/X?8(`*`"``?#]@4+D"`#F%``@!
+M>N!7@@D`(`!\'V#PB```(`!XO`(```@`"`!ZX%>!`@`@!GK@5X$!`"!8@0`(
+M`7X`0!")```@`%B!`!``?!]@2-8"```$``@`>N!7`?7_)P7^'V``@`<0,(D`
+M`"``````4``^`"`0`,@)`'KG5P("`"!U_A]@`'P_8'<"``!0B0``(`"`!"DH
+M`'P?8#??`@``!``(`'K@5X$"`"``?#]@4+D"`'")```@``B)``@`>N!7@@(`
+M(`!\/V!0N0(`"(D`"`)ZX%<+`@`@D(D``"``@_X?8$<`1Q`#_A]@@/'_)P":
+MIE$`?!]@-]\"```:0!"PB0``(``U!"<(`OX`8`!ZX%>!`@`@3@@'"`!ZX%<!
+M`0`@_?\`8-")```@`#4`1Q`U!"<(`OX`8`!ZX%<""0`@`)JF45`:1Q``'`=@
+M\(D``"```"`H8`!R*"@`(`A@@+?]+P!ZX%<"`P`@!/X?8$<`1Q`0B@``(``!
+M_A]@`(`'$`":!F``(0`@-00G"`+^`&@U`$<0`)JF43"*```@``!\'V`VWP(`
+M`!I`$`!\'V#HU@(`````"`!ZX%<!`P`@4(H``"````@@"&P"AQ`"""`(;@*'
+M$`0(``AP`(<0-00G"`'^`&!PB@``(```>N!7@@4`(`'^`&@U`$<0`'P_8%"Y
+M`@`\B0`($'X`0)"*```@`#R!@!!R`(<0`)JF44D:1Q```@`@BOX?8`!\/V#/
+M`@``L(H``"``@-@H*`!\/V!0N0(`.(4`"`!ZX%>!`0`@700'"!!^`&C0B@``
+M(`!=`$<0@OX?8$<`1Q``?#]@4+D"`$:)``A6`(<03HD`"/"*```@`$0`AQ`V
+M!`<(50!'$`":IE$`?!]@IML"```:0!`(B0`($(L``"```7X`0`B!@!``(`A@
+M`!']+P":!Q`!_A]@$`"N"10`S@DPBP``(``8`.X)'``."@2`[0L@@`\X(!!N
+M"P0^#A``-@X0`#AN8U"+```@`!1^CE,0&@X0``"@80!\'V"$W@(```0`"`!Z
+MX%<!`0`@<(L``"``````4(`)`"`!_A]@`"_^+P!\/V"4M@(``(@&"`"`@!"0
+MBP``(``"B`8(`H"`$`2(!@@$@(`0`'P_8-[:`@``B`8(`("`$+"+```@``*(
+M!@@"@(`0!(@&"`2`@!`!_A]@$`"N"02`[0L@@`\XT(L``"``%!!N"P0^#A``
+M-@X0`#AN8Q1^CE,0&@X0`'R_89RW`@#PBP``(``,@080+(4&"`!ZX%<!`@`@
+M$/\&0(`$$R@```!0+(%&$!",```@`!``K@D$@.T+((`/.!00;@L$/@X0`#8.
+M$``X;F,<?HY3,(P``"``$!H.$!0<#A`8'@X0``"@80```%``#0,H````4``T
+M^R]0C```(`````!0`&8"*`'^'V``4O4O`)[G40!\'V#>V@(`&1Y`$'",```@
+M`!H>0!``@B!0@/C[+P'^/V``?!]@I-L"```"0!``?-]AD(P``"``G+<"`"P%
+M!P@`>N!7@0$`(!!_!T"`\!(H+!]'$`!\'V"PC```(`#HU@(`````"`!ZX%>!
+M!@`@&`0@"`#ZX%<!!0`@`'S?8=",```@`)RW`@``""`(6`.'$`(((`A:`X<0
+M!`@`"%P!AQ`!_C]@\(P``"``9@-'$`!\'V#HU@(``!H`$`!\'V#>V@(``(@F
+M"`8"@!`0C0``(``"B"8("`*`$`2()@@*`H`0!X0F"!,"0!````!0`.P"*#"-
+M```@``[^/V``?!]@I]H"```"0!`0`*X)%`#."1@`[@D$@.T+4(T``"``((`/
+M.!P0;@L$/@X0`#8.$``X;F,0?HY3``1!4`!\'V!PC0``(`"[V@(```1`$``$
+M05``A&`(`/KA5X$$`"`"A&```'P!0)"-```@`+O:`@`"!D`0`7X!0``.0!@"
+MA&```/KA5X+[_R<`?!]@L(T``"``N]H"``$$0!`$_C]@`'P?8-[:`@`2`D`0
+M`'P?8`%=``#0C0``(`"`,OPO!(#M"R"`#S@0$&X+`'P_8)RW`@!0@8`0`(`/
+M./"-```@``!\GV"<MP(`9P%"$&@#0A``?!]@NMH"```$0!!I!T(0$(X``"``
+M`(`/.`!\7V"<MP(`!`$!$`!\'V"?VP(```)`$`"`#S@PC@``(``!!&`(`'P_
+M8)7;`@`!AD`0``1!4`$$8`@`!^%7"@4`(%".```@```$($`"A&`(`'PA0)7;
+M`@`"AD`0`7XA0`".0!@!!"`(<(X``"````/A5PO[_R<`@`\X!#X.$``V#A``
+M.&YC%'Z.4Q`:#A"0C@``(````*!A`'P?8(3>`@``!``(`'K@5P$"`"![_A]@
+M`'P_8+".```@`/0"````6"@H`'Q?8/3>`@```"$(`(/F5X$Y`"`%^N97T(X`
+M`"``C@``(`7^OV$`?%]@#-\"```$`0@`>N!7`0P`(`#ZYE?PC@``(`"!"0`@
+M`OX?8```01`"_D:``'P_8+BX`@```D%`&`$!"!"/```@``!\OV#XW@(``(`"
+M$"P!80@`?#]@_-X"``"&`!!``4$(,(\``"```'P_8`#?`@``A``0`"L`(`'^
+M/V```D$0@"D`(`#ZYE=0CP``(`""$``@`#7N+P``H&$```!0`((@4`![&B@!
+M_C]@`'P?8'"/```@``W?`@```D`0`'P?8!#?`@```D`0`((@4`!\'V`.WP(`
+MD(\``"````)`$`":!F``+^XO`'P?8`C?`@`````(`7K@5X$"`""PCP``(```
+M?!]@!-\"```$``@`>N!7@AH`(`""(%``?!]@#=\"`-"/```@```"0!"`%@`@
+M@"3N+P+^1H``?#]@N+@"```"04`8`8$(\(\``"```'R_8/C>`@`L`6$(`'P_
+M8/S>`@``A@`00`%!"`!\/V`0D```(```WP(``(0`$`-^(E``@@(0!?Y?8`!\
+M/V`@WP(``(0`$#"0```@``'^7V``?#]@'-\"``"$`!``?#]@)-\"``"$`!``
+M?%]@4)```"``]-X"````(0@`^N!7@0$`(``:`1"`%>XO@`4`((`4[B]PD```
+M(``$_C]@`'P?8!#?`@```D`0`'P?8!3?`@``&@`0````4)"0```@``+^/V``
+M51HH$`"N"02`[0L@@`\X%!!N"P!\/V"MW@(`L)```"```(!`$`"`#S@`?#]@
+M4+D"`$2!@!``@`\X!#X.$``V#A#0D```(```.&YC$'Z.4P$$8`@`?#]@L-H"
+M``&&0!``!$%0`01@"/"0```@```'X5<*!0`@``0@0`*$8`@`?"%`L-H"``*&
+M0!`!?B%`$)$``"```(Y`&`$$(`@``^%7"_O_)P!\'V"5VP(``'P_8+#:`@`P
+MD0``(``*_E]@``GN+P2`[0L@@`\X$!!N"P0^#A``-@X0`#AN8U"1```@`!!^
+MCE,``"!@%81`"`!\'V#>V@(`%01`$!:$0`@6!$`0<)$``"``%X1`"!<$0!`8
+MA$`(&`1`$!N$0`@">N%7B0``(!L$0!"0D0``(``=A$`(`'P?8-[:`@`=!$`0
+M'H1`"!X$0!`@B"`((`*`$+"1```@``!\/V"4M0(``(0@"`#ZX%<!`0`@`((@
+M4(!.^R\$@.T+T)$``"``((`/.!`0;@L$/@X0`#8.$``X;F,8?HY3$!H.$!0<
+M#A#PD0``(````,!A`(*@80!\'V"<MP(`:@4`"`!ZX%>""P`@`'P?8!"2```@
+M`+C<`@``!``(`'K@5P$"`"`)_A]@`%$"*````%``6/HO,)(``"```WY'@``<
+M04``!$%``'Q_8&#5`@``!@%``00@"`+^`4!0D@``(```!$!``!P'8`":9F``
+MK/LO"?X?8`!%`B@0`*X)%`#."7"2```@``2`[0L@@`\X&!!N"P0^#A``-@X0
+M`#AN8Q!^CE,```!0D)(``"``@(OT+X!;%B@`?#]@0-H"``R``!``?#]@2-8"
+M``"$``BPD@``(```>N!7`0$`(````%``@$`0!(#M"R"`#S@0$&X+!#X.$-"2
+M```@```V#A``.&YC$'Z.4P!\/V!0N0(`"(D`"`!ZX%>"!@`@\)(``"``.H4`
+M"`%ZX%>!`0`@$($`"`!ZX%>"`P`@`'P?8#;?`@`0DP``(```!``(`'K@5P(!
+M`"`!_A]@@"T"*`2`[0L@@`\X$!!N"S"3```@``0^#A``-@X0`#AN8R!^CE,0
+M&@X0%!P.$!@>#A`<(`X04),``"````#`80""`&(`GN=1``B"4``(2!`0`*<)
+M7(0&"`Q^(&!PDP``(```^N!7@0$`(/Q^`&!(>N!7@E$`('R`!@@!>N!7`DD`
+M()"3```@```(@E``?!]B4+D"``P)2!!,"0@(1@&($!@!"`@`>N!7L),``"``
+M`0,`(``!YU>"```@&`D($`+^'V!'@$80``@`(``<!V#0DP``(```8`4H@!0`
+M(`!\'V)0N0(`3`D("$8!B!``"()0#`E($/"3```@`!@!"`@`>N!7`?K_)X`%
+M`"`#_A]@1X!&$(#Y_R<`?!]B$)0``"``4+D"`!Q_"$```A(H@`L`(`7^'V!'
+M@$80@/7_)P`!YU<PE```(``"^_\G&`D($`#Z_R<`?!]B4+D"``P%"`@`>N!7
+M`G0`(%"4```@``'^/V!'@D803`D("$8!B!`8`0@(`'K@5P'L_R<``>=7<)0`
+M`"```O/_)P`(@E``]_\G`'P?8E"Y`@`("0@(_W\`0`@!B!"0E```(```"()0
+M"@F($(">^2\`:@`@!?X?8$>`1A`!_C]@`'P?8+"4```@`$C6`@```D`0`?X?
+M8`!&]"\`?!]B4+D"`$P)"`A&`8@0T)0``"``&`$("`!ZX%>!!``@``'G5P(!
+M`"``"()0&`D($`!\'V+PE```(`!0N0(`''\(0`#F$2@``0`@`!P'8(`Y!2@`
+M?!]B4+D"`!"5```@``@)"`C_?P!`"`&($``(@E`*"8@0`?X_8`!\'V`VWP(`
+M,)4``"````)`$`!7`"`%_A]@1X!&$`'^/V``?!]@I-L"```"0!!0E0``(```
+M?!]B4+D"`$P)"`A&`8@0&`$("`!ZX%>!!``@``'G5W"5```@``(!`"``"()0
+M&`D($`!\'V)0N0(`''\(0`#4$2@``0`@D)4``"```!P'8(`G!2@`?!]B4+D"
+M``@)"`C_?P!`"`&($``(@E"PE0``(``*"8@0`$<`('R`!@@`?!]B4+D"``0!
+M"!")_A]@`'P_8-"5```@`#`$``"`0@`@`WX`4`9ZX%>-^O\G`GZ`@0!\A@'T
+ME0``\)4``"`````&.``E```()0``""4``"@E``!.)0``;B4```\E```0E@``
+M(``(^N!7`CD`('R`!@@!>N!7@C``(`+^'V!'@$80`'P?8C"6```@`%"Y`@!,
+M"0@(1@&($(`Q`BB`(@`@!?X?8$>`1A``?!]B4)8``"``4+D"```@`"`!_C]@
+M1X)&$`!\'V"(W@(````@"`#ZX%=PE@``(`"!`0`@`!P'8`""`#@``$@0``0(
+M"`!ZX%<`?!]B4+D"`)"6```@`$P)"`A&`8@0`0$`(%:`AA"`*0`@"`D("/]_
+M`$`(`8@0L)8``"``@%OY+P`G`"`!_C]@`'P?8#;?`@```D`0`'P?8E"Y`@#0
+ME@``(``8`0@(`'K@5P$&`"`0`*`(`/KB5X$$`"`*"2@(`/K@5_"6```@``(#
+M`""`JOPO&`D($`G^'V!'@$(0''\(0`"D$2@%_A]@$)<``"``1X!&$`!\'V"F
+MVP(```0`"`!ZX%<"`P`@`?X_8`!\'V`PEP``(`!(U@(```)`$`'^'V``]O,O
+M`'P?8E"Y`@`("0@(_W\`0%"7```@``@!B!```@`@"`D("/]_`$`(`8@0`$7Y
+M+P!\'V"(W@(`<)<``"`````@"`#ZX%>!#@`@`!P'8`""`#@`#0`@?(`&"`!\
+M'V*0EP``(`!0N0(`!`$($(G^'V``?#]@M`0``(`(`"`#?@!0!GK@5["7```@
+M`(WZ_R<"?H"!`'R&`<27``````8XD24``)$E``"1)0``T)<``"``KB4``.(E
+M``#B)0``EB4``(G^'V``?#]@N00````Q)RCPEP``(```G@=@$`"N"10`S@D8
+M`.X)'``."@2`[0L@@`\X(!!N"Q"8```@``0^#A``-@X0`#AN8QQ^CE,0&@X0
+M%!P.$!@>#A```,!A,)@``"```)JF41``YPE<A`<(#'X@8`#ZX%>!`0`@_'X`
+M8$AZX%=0F```(`"""0`@`'R?8%"Y`@`8`0((``'G5X(#`"````!0&`$"$'"8
+M```@``/^'V!'@$<0''\"0(!U$2@``0`@`!P'8`#)!"@```!0D)@``"```'R?
+M8%"Y`@`*`8(0`!$`(`CZX%<"#@`@`'R?8%"Y`@"PF```(``8`0((`'K@5X$&
+M`"`0`*`(`/KB5P$%`"`*"2((`/K@5]"8```@`((#`""`;OPO````4!@!`A`)
+M_A]@1X!"$!Q_`D"`9Q$H\)@``"```_X?8$>`1Q``?!]@B-X"````(`@`^N!7
+M@0,`(``<!V`0F0``(```@@`X``(`((C^'V``?#]@@@,````*)R@`?)]@4+D"
+M`#"9```@``@)`@C_?P!`"`&"$`":!F`0`*X)%`#."1@`[@D$@.T+4)D``"``
+M((`/.!P0;@L$/@X0`#8.$``X;F,0?HY3`'P?8++>`@!PF0``(```!``(`'K@
+M5X$#`"``?#]@4+D"`%"!``@!?@!`4($`$)"9```@`````%"``0`@`?X?8`!B
+M`2@!_A]@!(#M"R"`#S@0$&X+L)D``"``!#X.$``V#A``.&YC$'Z.4P!\'V"R
+MW@(```0`"`!ZX%?0F0``(`"!'P`@`'P?8*[>`@``!``(`'K@5P$,`"``?!]@
+MG]H"`/"9```@```$``@`>N!7@@D`(`!\'V`$VP(```0`"`!ZX%<"!P`@$)H`
+M`"```'P?8-[:`@``@B!0`$3Z+P!\'V#HU@(`````"`!ZX%<PF@``(`"!`@`@
+M&`0`"`!ZX%<!`0`@`?X?8`!U^2\!_A]@`*<`*%":```@`````%"`>0`H`((@
+M4`!\'V"$W@(```)`$`!\'V"RW@(`<)H``"````)`$`!\'V#HU@(`````"!@$
+M``@`>N!7`'P?8*[>`@"0F@``(```!``(`0,`(`!ZX%<!`0`@%/X_8(`#`"`%
+M_C]@@`(`(+":```@``!ZX%<!`0`@#OX_8(```"`)_C]@`'P?8*?:`@```D`0
+MT)H``"``!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC&'Z.4Q`:#A#PF@``(``4
+M'`X0``#`80""H&&`@!$H`'R_8)RT`@`<@2((`()@0!";```@``""84`"_F&`
+M`'R?8$S6`@``B$%``(B!0````A`$'`$0,)L``"``"!H!$`'^`$`<@0(0$`"N
+M"10`S@D$@.T+((`/.!@0;@M0FP``(``$/@X0`#8.$``X;F,T?HY3$!H.$!0<
+M#A`8'@X0'"`.$'";```@`"`B#A`D)`X0*"8.$"PH#A`P*@X0``"@81"`A@H,
+M@"8(D)L``"```(@`"``"`$(6"`@(#WX`8``.P!D`>N=7`?Y_8@*F:5*PFP``
+M(```@B!0`00("`1^`&``>N!7`@$`(`#ZZ5>"```@`?X_8-";```@``".0!@`
+M@B!0`00("`1^`&``>N!7@@$`(`#ZZ5>"```@\)L``"```?X_8`".0!H6"`@(
+M`'P`8/#_````$.`9`'KA5P!\/V(0G```(`#8L0(`@@0`("R!J`H`^NI7`0$`
+M(`"J"F``500H````4#"<```@``!\/V+8L0(``#8`("2)*`@."`@(`('@5P(%
+M`"`BB2@(4)P``"``#`@("`"!X%<"`P`@((DH"`H("`@`@>!7`@$`(`'^'V!P
+MG```(`"````@````4`!ZX%>!!``@`'P_8MBQ`@`HB0@(`('G5Y"<```@``("
+M`"`FB2@(`?X`0``!YU>,#0`@`'P_8MBQ`@`L@:@*L)P``"```/KJ5P$!`"``
+MJ@I@@$($*````%``?#]BV+$"`"R!"!#0G```(```^NE7`0@`(`$$"`C[?P!@
+M`0!($`H("`@@@8@0#`@("/"<```@`"*!B!`."`@()(&($"R;"!`PJ0@0*)^(
+M$":=B!"`&@`@$)T``"````/G5XD!`"``F@9@@#8$*``8`"`,@"8(`H@`"#@(
+MB@@PG0``(```"`!0`!#`&2R!J`H,@$H(``AA"`"$H4`P@>@)%(A'"%"=```@
+M``"(``@``B!```8!0``<`$``?>!7[`$```P&`"``F@9@<)T``"```"P$*"R!
+MJ`H`^NI7`0$`(`"J"F"`*00H````4`!\/V*0G0``(`#8L0(`+($($``+`"``
+M"@%```(B0``<1V"`>NPO#(!*"+"=```@``((`0@`'`!``@"!$!2(1P@`'`%`
+M%("'$`":!F"`(`0HT)T``"```'KI5X$!`"`L@:@)````4``!`"````!0``$`
+M("R!"!#PG0``(```F@9@$`"N"10`S@D8`.X)'``."B``+@HD`$X**`!N"A">
+M```@`"P`C@HP`*X*!(#M"R"`#S@T$&X+!#X.$``V#A``.&YC,)X``"``&'Z.
+M4Q`:#A`4'`X0``#`88!7["\`?+]A4+D"`#J=1A!0G@``(```6.PO.84&"`!Z
+MX%>"`@`@.H4&"`!ZX%<!`0`@!/X?8'">```@``!#`B@0`*X)%`#."02`[0L@
+M@`\X&!!N"P0^#A``-@X0D)X``"```#AN8Q!^CE,!_G]@`'Q?8(S;`@``!D$0
+M`'Q?8(W;`@"PG@``(````D$0`'K@5P$&`""`]R(H$'X@@`!\'V#HU@(`````
+M"-">```@``X(0`@0"&`(````4`'^GV"`/>XO`?X?8(#@^"\$@.T+\)X``"``
+M((`/.!`0;@L$/@X0`#8.$``X;F,0?HY3`'R_8"';`@`0GP``(```A&((`/KA
+M5P$,`"``"()0`(A"$`!\?V`HVP(``(`!$#"?```@``!\'V`DVP(```*`$`'^
+M/V``?!]@(-L"```"0!``?!]@4)\``"``(ML"```"0!``?!]@+-L"```$0!``
+M?!]@5-L"```(`!!PGP``(`````!0`OX_8`!8&"@$@.T+((`/.!`0;@L`>N!7
+M@0,`()"?```@``!\/V`BVP(``(0`"`!ZX%<"`P`@`OX?8(`!`"````!0L)\`
+M`"```'P_8"+;`@``@$`0`(`/.`0^#A``-@X0`#AN8Q1^CE/0GP``(``0&@X0
+M`+X/8`!\`&#___\``GX`@`!\OV&<M`(`B($&$/"?```@`(2!!@@!?@!`A($&
+M$(!L$BB`@080`'P_8"#;`@``A``($*```"```'K@5X$$`"``FJ91`)I`$`'^
+M/V``?!]@(ML"```"0!`PH```(`````!0`OX_8`!`&"@`FJ91`'P?8(S;`@``
+M&D`0`'P?8%"@```@`)3;`@``&D`0@`8"*`!\'V"HVP(``!H`$`!\'V"LVP(`
+M<*```"```!H`$!``K@D$@.T+((`/.!00;@L$/@X0`#8.$``X;F.0H```(``@
+M?HY3$!H.$!0<#A`8'@X0'"`.$!``H`D`?/]A+=L"`+"@```@``"$)P@`^N!7
+M`28`(`P`(`@`B``(``(`0#B(1@@```%`T*```"``%(@F"`"$(%``D"`8`'Q?
+M8"3;`@``"$$(`'S?85C;`@#PH```(```'&=@@($7*`0`)P@`@``(```G"`"`
+M(`@(`$<(``A!"!"A```@`(`4*"@%?@"`??X_F(#]["\T@$8(```!4H#ZZR\`
+MA"<(,*$``"```/K@5P$6`"``@B!0`()'$"@`1P@"!&$(`'P_8#3;`@!0H0``
+M(```A@`0`P0A"`!\7V`XVP(```(!$`!\7V!TK@(```(!$'"A```@````)P@`
+M@$`(`'P_8#S;`@``A``0!``G"`"`0`@`?#]@D*$``"``0-L"``"$`!``?#]@
+M,-L"``"@`!`L!$<(`'P_8$3;`@"PH0``(```A$`0+01'"`!\/V!%VP(``(1`
+M$#2`1@@`?#]@2-L"`-"A```@``"$`!"`Y^LO````4`+^/V``"Q@H@```(`#E
+MZR\0`*X)\*$``"``%`#."1@`[@D<``X*!(#M"R"`#S@@$&X+!#X.$``V#A`0
+MH@``(```.&YC%'Z.4P!\/V#$W`(`!?Y@0`*$``C_@4T0`X0`"#"B```@`/Z!
+M31#^B2T(`'P?8-2N`@```@`0````4`!\OV#8K@(`4*(``"```(`"$``,PU``
+M?!]@;-P"```$``@``>-7BA(`(`"$00APH@``(```>N%7#`(`(`YZX5<)`0`@
+M`?Z?8(```"``"()0`(1!")"B```@```$(6`!A`$(``0`0`"!X%>*!P`@`(@`
+M4`&`'X``$$`8L*(``"```'R_8-BN`@``@`((``0`:`"``A`!_@!```X@&`"$
+M00C0H@``(``!A`$(``0`0`"!X%>+^/\G`_YA0`%^`T``#L`8`'P?8/"B```@
+M`&S<`@``!``(``'C5XOM_R<"_A]@@.3T+P'^/V``?!]@$*,``"``;=P"```"
+M0!`$@.T+((`/.!00;@L$/@X0`#8.$``X;F,PHP``(``8?HY3$!H.$!0<#A``
+M`*!A`'S?89#``@``!&<(`OY!@%"C```@``!\/V#,P`(```(!``!ZX%>!#@`@
+M`OKA5XH-`"``^N97<*,``"```@$`(`'ZX5>"!0`@`'S?89#``@``!&<(`OY!
+M@`!\/V"0HP``(`#,P`(```(A``"(``@``B!``?X?8`B``!``?-]AD,`"`+"C
+M```@```$9P@"_D&``'P_8,S``@```@$``?X_8`"U]"\`!&<(T*,``"```?X!
+M0```1Q``?-]AD,`"```$9P@"^N%7BA$`(`#ZYE?PHP``(`""$``@`?X?8`'^
+M/V``!$%0`/@"*`!ZX%<!"P`@``1G"!"D```@``+^08``?"%`S,`"``"``!#V
+M_C]``@*`$!3^/V```H`0,*0``"```(JB4!`*`!``"(`(```B0`W^7V````)`
+M``0`$`/^`8!0I```(```!@!0!(``$`B*`!``@@!@``,`(`!\/V#TJ`(`#($`
+M"'"D```@``%^`$`,@0`0````4!``K@D4`,X)!(#M"R"`#S@8$&X+D*0``"``
+M`8`?@``00!@`?#]@L-X"``"(``@`!`!P`("`$`"`#SBPI```(``$/@X0`#8.
+M$``X;F,@?HY3$!H.$!0<#A``FJ91`+XO8-"D```@``&`7X``?#]@L-X"``"(
+M``@`!`!H`("`$`!\'V!XO`(`\*0``"````@`"`!ZX%<!!0`@!GK@5P$$`"``
+M?-]A,+@"`"1_!T`0I0``(`#X_VU``?X_8`'^7V#__Y]@@*0.*`!\WV$PN`(`
+M!'\'0#"E```@`/[_/V`"_E]@`-D.*`!XZR\`!2<(`/K@5P$!`"`!_K]A4*4`
+M`"``@`@`(`!\/V"NW@(``(0@"`#ZX%<"!@`@`'P_8)_:`@!PI0``(```A"`(
+M`/K@5X(#`"``?#]@!-L"``"$(`@`^N!7`@$`()"E```@``'^7V``!4<0`&_K
+M+P#ZYE>!!``@`'S?83"X`@`$?P=`L*4``"``_/]M0`'^/V``!$%0__^?8("0
+M#BB`+0`@`'P_8*[>`@#0I0``(```A"`(`/K@5P(K`"``?#]@G]H"``"$(`@`
+M^N!7@B@`(/"E```@``!\/V`$VP(``(0@"`#ZX%<")@`@`$KX+P`P#"@`?!]@
+M$*8``"``M-P"``````@(?@!@`'K@5X("`"``?!]@`*\"``````@PI@``(``!
+M>N!7`@@`(`/^OV$`C@88`_YF@`":84``AF%``'Q?8%"F```@`&#5`@``A"%`
+M`80@"`)^04``!D%``(9A4(`J^2\`^N97<*8``"``__^F08+X_R<`?!]@Z-8"
+M``````@`>N!7@0$`(!@$``B0I@``(```>N!7`@(`(`!\'V#>V@(``##M+X`!
+M`"`!_A]@`.CW+["F```@`(#\_R<`?!]@Z-8"``````@8!``(`'K@5P$%`""`
+M1PLHT*8``"```'K@5X$"`"`!_E]@`'P?8*?:`@``!$`0``,`(!3^/V#PI@``
+M(`"````@#OX_8`!\'V"GV@(```)`$`'^7V``?#]@KMX"`!"G```@``"$0!``
+M``!0`'S?83"X`@```4<0!'\'0`'^/V``!$%0,*<``"```)H.*!``K@D4`,X)
+M!(#M"R"`#S@@$&X+`(`/.`"`#SA0IP``(```?!]@!=\"```$``@`>N!7@0P`
+M(`!\'V`,WP(```0`"'"G```@``!ZX%<""@`@`'P?8/3>`@`````(`'K@5X$'
+M`"`%_C]@D*<``"```'P?8"#?`@```@`0`?X_8`!\'V`<WP(```(`$`!\'V"P
+MIP``(``DWP(```(`$`'^/V``?!]@*-\"```"0!``@`\X!#X.$-"G```@```V
+M#A``.&YC$'Z.4P!\'V`%WP(```0`"`!ZX%>!#0`@\*<``"```'P?8`S?`@``
+M!``(`'K@5P(+`"``?!]@]-X"``````@0J```(```>N!7@0@`(`7^'V``DO\O
+M!?X_8`!\'V`@WP(```(`$#"H```@``'^/V``?!]@'-\"```"`!``?!]@)-\"
+M```"`!`!_C]@4*@``"```'P?8"C?`@```D`0!(#M"R"`#S@0$&X+`'P?8`S?
+M`@!PJ```(```!``(`'K@5P($`"``?%]@*-\"```$(0@`?!]@*=\"`)"H```@
+M```"0!````!0``!!$`"`#S@$/@X0`#8.$``X;F,4?HY3L*@``"``$!H.$`!\
+M'V#TW@(`````"`!ZX%>!$0`@`'P?8`7?`@#0J```(```!``(`'K@5P$/`"``
+M?!]@"-\"``````@`>N!7`@$`(/"H```@``7^'V``<_\O`'P?8`S?`@``!``(
+M`'K@5P()`""`V2<H$*D``"````"@80+ZYE<"`P`@`'P?8`C?`@`````(`'K@
+M5X(``"`PJ0``(```UB0H`?KF5P(#`"``?!]@"-\"``````@!>N!7@@``(%"I
+M```@``#?)"@0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC<*D``"``&'Z.
+M4Q`:#A`4'`X0`)JF40!\'V#RW@(``!I`$`!\/V"0J0``(``.WP(``(0`"`!Z
+MX%<!`0`@`)I`$``%`"``?#]@#]\"`+"I```@``"$``@`>N!7`0$`(`":0!"`
+M`0`@`'P_8!C?`@``FD`0T*D``"```'P?8+#>`@``"``(`'P`8``$````>N!7
+M`04`(`K^'V#PJ0``(`"`4_\O`'P_8+BX`@!TA0`(`'K@5X$!`"``FJ91=)M`
+M$!"J```@`("N`"``?!]@$-\"```$``@#>N!7`CX`('S^'V``?#]@,*H``"``
+MRP,```#H)"@`?!]@"-\"``````@`>N!7@J<`(`!\'V!0J@``(``$WP(```0`
+M"`!ZX%>!!P`@@&X`(`!\'V`0WP(```1`$'"J```@``!\?V`,WP(``(0!"`!Z
+MX%>!H``@`'Q?8/'>`@``!`$(D*H``"```'K@5P&>`""`B0`@`?Z_80!\WV$%
+MWP(```0G"`#ZX%>PJ@``(`"!"``@````4`/^/V``O00H``"@80`$)P@`^N!7
+M`@4`(-"J```@``!\/V`.WP(``(0`"`!ZX%>"`@`@`'P_8`W?`@``A``(\*H`
+M`"```'K@5P&2`"``^N97`@\`(`!\/V`8WP(``(0`"`%^`$`0JP``(```#D`8
+M`(!`$`IZX5>""``@`'Q_8`S?`@``A`$(`'K@5S"K```@`(%N`""`:P`@`)JF
+M40`:01``FD$0`'P_8`W?`@``FD`04*L``"```'P_8+BX`@!8_P!`@!D/*(!H
+M`"`!_A]@`'P_8`[?`@!PJP``(```@$`0`'L`(`+ZYE<"`P`@`?X?8`!\/V`-
+MWP(``(!`$)"K```@``/^7V"`V?\G`?KF5X(,`"``B"0H`OY?8`!\'V`0WP(`
+ML*L``"````1`$`":IE$`?#]@#=\"``":0!``?-]A!=\"```$)PC0JP``(```
+M^N!7@0(`(``S$R@`?`!```H```'^/V"`ZA8H`'Q?8/"K```@`/'>`@``!`$(
+M`7K@5P%Q`""`(``@?/X?8`!\/V`S!```$*P``"``@*PD*`!N`"`$>N!7@@T`
+M(`!\'V`4WP(````@"`!\'V`PK```(`#TW@(```(`$`":IE$`?!]@*-\"```:
+M0!``?!]@*=\"`%"L```@```:0!``?!]@+-\"```:`!``?!]@,-\"```:0!``
+M?!]@<*P``"``,M\"```:@!``?!]@--\"```:@!"`>"0H@%\`(`%ZX%>0K```
+M(`""$0`@`'P?8`3?`@``!``(`'K@5X$"`"`!_A]@`'P_8+"L```@``W?`@``
+M@$`0@%D`(`!\WV$%WP(```0G"`":IE$`?!]@T*P``"``]-X"```:`!``^N!7
+M`04`(`7^'V``^?XO````4(`,"RCPK```(```?!]@WMH"`!0:0!``@B!0@.?W
+M+P"E$B@`?!]@Z+("`!"M```@``'^/V``!$%0`-T-*`!-`"`">N!7@D(`(`!\
+M/V#,VP(`,*T``"```(``"`%ZX%<"`0`@`OX?8`"``!``?!]@Z-8"``````A0
+MK0``(```>N!7@@(`(`!\WV$%WP(```0G"`#ZX%>!0P`@`'S?87"M```@``7?
+M`@``!"<(`/K@5P("`"!\_A]@`'P_8,,$````?20HD*T``"``?/X?8`!\/V#'
+M!````'LD*`!\'V#TW@(`````"`!ZX%>PK0``(``"`@`@?/X?8`!\/V#*!```
+M@'8D*`!\'V`$WP(```0`"-"M```@``!ZX%>!`@`@`?X?8`!\/V`-WP(``(!`
+M$("0_R<!_K]A\*T``"```'S?807?`@``!"<(`/K@5X$,`"`!_A]@`_X_8`!3
+M!"@0K@``(````*!A``0G"`#ZX%<"!0`@`'P_8`[?`@``A``(`'K@5S"N```@
+M`(("`"``?#]@#=\"``"$``@`>N!7`2@`(`!\'V#RW@(`4*X``"````0`"`!Z
+MX%>!`0`@````4`""(%``FQ8H`/KF5P(+`"!PK@``(```?#]@&-\"``"$``@!
+M?@!```Y`&`"`0!`*>N%7@@0`()"N```@`("1_R<`?%]@\=X"```$`0@`>N!7
+M`I+_)X+^'V"`;18HL*X``"``@!H`(`'^'V``?#]@#]\"``"`0!``$0`@`OKF
+M5X(%`"#0K@``(``!_A]@`'P_8`W?`@``@$`0`OY?8(!O_R<`FJ91`!I!$/"N
+M```@``":01``FD`0@`\`(`'ZYE>"!``@@"@D*`!\7V#QW@(`$*\``"````0!
+M"`!ZX%>!#0`@`)JF40`:01``"@`@?/X?8`!\/V`PKP``(``[!0```$@D*(`)
+M`"!\_A]@`'P_8$(%``"`120H``<`(%"O```@``":IE$`?#]@#=\"``":0!``
+MPA(H`'P`0,`#```!_C]@<*\``"``@'D6*``"`"``?#]@N+@"`%C_`$"`E`XH
+M$`"N"10`S@F0KP``(``$@.T+((`/.!@0;@L$/@X0`#8.$``X;F,0?HY3`'P?
+M8+"O```@``7?`@``!``(`'K@5X(!`"!Y_A]@Z?X_0(`U)"@`?!]@T*\``"``
+M]-X"``````@`>N!7`04`(`!\'V`(WP(`````"`%ZX%?PKP``(`"!`@`@`'P?
+M8`S?`@``!``(`'K@5P$!`"`!_A]@``X`(!"P```@``!\/V`@WP(``(``"`!Z
+MX%<!`0`@_W\`0`"``!``?#]@,+```"``(-\"``"```@`>N!7`@4`(`!\7V`<
+MWP(````!"`!\/V!0L```(`#XW@(``(`@"``#X%<!`0`@`WX`0````1``?%]@
+M'-\"`'"P```@`````0@`?#]@)-\"``"``!`$@.T+((`/.!`0;@L`@`\XD+``
+M`"``!#X.$``V#A``.&YC&'Z.4Q`:#A`4'`X0````4("4"BBPL```(```FJ91
+M`'P?8-[:`@`4&D`0!?X?8`!Y_B\```!0`((@4-"P```@`(!-%B@`?!]@!=\"
+M```:0!``?!]@&-\"```:0!``?!]@\+```"``#M\"```:0!``?!]@#=\"```:
+M0!``?-]A\=X"```$!P@0L0``(```>N!7@00`(`!\'V#HL@(``?X_8``$05``
+M6PTH`!I'$#"Q```@``!\'V`0N`(``%X.*!``K@D4`,X)!(#M"R"`#S@8$&X+
+M4+$``"``!#X.$``V#A``.&YC$'Z.4P!\'V`%WP(```0`"`!ZX%=PL0``(``!
+M`@`@??X?8`!\/V";!0``@/XC*`'^/V``?!]@!=\"`)"Q```@```"0!``?!]@
+M]-X"``````@`>N!7@@4`(`7^'V``8/XOL+$``"``````4(!S"B@`@B!0`'P?
+M8-[:`@`4`D`0`((@4`!.]R_0L0``(`"`#P`@!?X_8`!\'V`@WP(```(`$`'^
+M/V``?!]@'-\"`/"Q```@```"`!``?!]@)-\"```"`!``@B!0`'P?8"C?`@``
+M`D`0$+(``"```'P?8"G?`@```D`0`'P?8"S?`@```@`0`'P?8##?`@`PL@``
+M(````D`0`'P?8#+?`@```H`0`'P?8#3?`@```H`0@+\C*%"R```@``2`[0L@
+M@`\X$!!N"P+^7V``?#]@H-\"``"`@`@`?']@<+(``"``<+H"`!"!(0@``^)7
+M!0$`(`3^7V``!0`@%($A"``#XE>0L@``(``&`P`@`'P_8)S?`@``@(`(#($A
+M"``#XE>%```@`_Y?8+"R```@``!ZX%<!$0`@`'Q_8,#?`@``@"$(``/A5X$.
+M`"``A`$0T+(``"```GKA5P$!`"``>N%7@@4`(&(((`C^_R!@8@*`$&X(0`CP
+ML@``(`!@""`(`(0@<&`"@!`$`"`(`/P@8/_O__\`!0`@8@@@"!"S```@``'^
+M(&AB`H`0;@A`"&`((`@`A"!H8`*`$`0`(`@`_"!H,+,``"```!````0"`!`!
+M_A]@@```(````%``@`\X``1!4`!ZX%=0LP``(``!"P`@6`A@"`!\/V"FWP(`
+M`(@@"`"#X5>,```@`?Y?8'"S```@``!\?V#(WP(``(`A"``#X5<!!0`@`(0!
+M$`!ZX5=B""`(D+,``"```@$`(/?_(&"````@"/X@:&("@!`!_A]@@```(```
+M`%"PLP``(```@`\X`OY?8`!\/V!"WP(``(A@"`!\GV!PN@(`&`DB"-"S```@
+M``"#X5<*`0`@!/Y?8(`$`"`:"2((`(/A5PH!`"`#_E]@\+,``"````(`(!P)
+M(@@`@^%7C```(``$05``>N!7`0T`(`!\?V`0M```(`#$WP(``(`A"``#X5>!
+M"@`@`(0!$`)ZX5<!`0`@`'KA5S"T```@`((#`"!B""`(`OX@>&("@!`$`"`(
+M`/P@8/_O__\``P`@4+0``"``8@@@"`+^(&AB`H`0!``@"`#\(&@`$```!`(`
+M$`'^'V!PM```(`"````@````4`"`#S@$/@X0`#8.$``X;F,8?HY3$!H.$)"T
+M```@`!0<#A```*!A`OX_8`!\'V#`WP(```(`$`!\'V"\WP(`L+0``"````(`
+M$`!\'V#$WP(```(`$``<QU$`?!]@S-\"```<`!#0M```(```&``H`)H&8``I
+M`"@`?']@0-\"``"<@1``^N97`1(`(/"T```@```$05``!&%`7H@&"`#\(4`X
+MWP(``("`$`!\?V!`WP(`$+4``"```(@A"``"($``@H$0`7Y!0`1ZX5>+^?\G
+M`'P_8$3?`@`PM0``(```@(`0`'P_8$+?`@``@(`0`'P_8#"O`@``@``0`!S'
+M45"U```@`*2<AA````!0HH"&$+"<AA``!$%0``1A0``<QU$`A@9`<+4``"``
+MIAR`$`%^04`%>N%7B_S_)Q``K@D4`,X)!(#M"R"`#SB0M0``(``8$&X+!#X.
+M$``V#A``.&YC$'Z.4P!\'V!HWP(``((@4+"U```@`##^7V"`NNHO`'P?8$;?
+M`@``@B!0%/Y?8`"XZB\`?!]@T+4``"``<+H"``@!(`@`?!]@8-\"```"`!``
+M@B!0`'P?8&3?`@#PM0``(````@`0`'P?8)C?`@```@`0`'P?8)S?`@```@`0
+M`'P?8!"V```@`*#?`@```@`0!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC,+8`
+M`"``$'Z.4P`$05``?#]@R-\"``"$`!``>N!7@0D`(%@(``A0M@``(```?#]@
+MI-\"``"`@!``?#]@<+H"`"R)0`@`!>!7+HD@"'"V```@``L!`"``@."G@```
+M(`"$X*<`D!P89/X_8("UZB\`?#]@D+8``"``IM\"``"`@!`$@.T+((`/.!`0
+M;@L$/@X0`#8.$``X;F.PM@``(``<?HY3$!H.$!0<#A`8'@X0``"@88"3#R@`
+M`,!A:H@&"-"V```@```.`!@`D1<H``#@80":!F``,P`H`'P?8+S?`@`````(
+M\+8``"``!'K@5X((`"!JB`8(`7K@5X$>`"``?!]@<+H"`&`!``@0MP``(``"
+M'B``7H@&"`"!X%<,&P`@!/X?8`'^/V``FD9@@/@?*#"W```@``!\_V&TWP(`
+M`!<`(`-ZX%<""``@`'P?8'"Z`@!@`0`(4+<``"```AX@`%Z(!@@`@>!7C`0`
+M(`!\_V&TWP(``(`'"```!U!PMP``(```?>!7Z`,``(X/`"`$_A]@@`P`(`!\
+M'V"\WP(`````")"W```@``%ZX%<!`0`@`'K@5P(+`"!JB`8("'K@5X$)`"``
+M?!]@L+<``"``<+H"`%P!``@"'B``7H@&"``#X%<,!@`@`'S_8;3?`@#0MP``
+M(```@`<(```'4`!]X%?H`P``C@(`(`/^'V`!_C]@`)I&8/"W```@``#@'R@`
+MG`<0$`"N"10`S@D8`.X)!(#M"R"`#S@<$&X+$+@``"````1!4`!\/V!PN@(`
+M!HE@""B!(`@`@^%7C@``(`'^7V`PN```(```>N!7@0<`(`!\?V#,WP(``(`A
+M"``#X5<!!0`@`(0!$%"X```@``!ZX5=B""`(`@$`(!#^('B````@$/X@:&("
+M@!`!_A]@<+@``"``@```(````%``@`\X!#X.$``V#A``.&YC+'Z.4Q`:#A"0
+MN```(``4'`X0&!X.$!P@#A`@(@X0)"0.$"@F#A```*!A`O[?8;"X```@``#Z
+MYE>!-@`@`)H&8`!`!"B0B$8(=(AF""W^/V``?']BT+@``"``JM\"``""B1`C
+M_C]@`'Q?8JS?`@```HD0"OX_8`!\/V+PN```(`"NWP(``(*($!G^/V``?!]B
+ML-\"```"B!``?/]A<+H"`!"Y```@`#R))P@`@^%7#`$`(`3^WV&`%@`@/HDG
+M"`"#X5<,`0`@,+D``"```_[?80`4`"!`B2<(``/@5PP(`"`M>N%7#`$`(`3^
+MWV%0N0``(```#P`@(WKA5PP!`"`#_M]A``T`(`IZX5<*`0`@`!S'47"Y```@
+M```+`"`9>N%7"@H`(`'^WV$`"0`@`)H&8``9!"B6B$8(D+D``"``0HDG"``#
+MX%>,!P`@`(@)"``!X5>)]/\G``@)"``!X5>PN0``(``)]?\G`(@("``!X5>+
+M]?\G``@("``!X5<+]O\G````4-"Y```@`)2`AA"2@(80`'P?8"RO`@``!``0
+M`'P_8+S?`@``@``(\+D``"````'G5X$.`"``G``0`GKG5P$!`"``>N=7@@4`
+M(&*(!@@0N@``(`#[?P!@8H"&$&J()@A@B`8(``(`<&"`AA`$@`8(`'P`8#"Z
+M```@`/_O__\`!0`@8H@&"`1^`&AB@(80:H@F"&"(!@@``@!H4+H``"``8("&
+M$`2`!@@`?`!H`!````2`!A`!_A]@@```(````%!PN@``(``0`*X)%`#."1@`
+M[@D<``X*(``N"B0`3@HH`&X*!(#M"Y"Z```@`""`#S@L$&X+`((@4`P`0`@`
+M>N%7`00`(```(`@(@$`(L+H``"````0`$``$05`(A``0#`!`"/]_04`,!``0
+M`((`8`"`#SC0N@``(``,`&`(`/KA5P$"`"`$`&`("((!$`0"`!```0`@!`(`
+M$/"Z```@```"`!``AF%0"(8`$`P`8`@!_B%`#`(`$"```1``@`\X$+L``"``
+M#`!`"`!ZX5<!$P`@`7KA5P``0`@"!0`@`(7@5X(0`"`PNP``(```AF%0!`8`
+M$``&`!`,`$`(_W]!0`P$`!`(A@`0@`T`(%"[```@``"%X%>"`0`@"(!`"``$
+M`!``!0`@"`!A"`#ZX5>!"``@<+L``"```(?@5X(%`"`(@&$("`8!$`#ZX5>"
+M```@!`0`$`"&85"0NP``(``(A@`0#`!`"/]_04`,!``0``,`(`"&06`(@&$(
+M`/KA5["[```@`(+W_R<```!0@```(`'^'V``@`\X!#X.$``V#A``.&YCT+L`
+M`"``''Z.4Q`:#A`4'`X0&!X.$```P&$`@J!A``3A80"BZ"_PNP``(``"?B>`
+M`'R?8)BP`@``B*!`%(`B"`":8$`D@$((`(7A5Q"\```@`(X#`"``^N=7`0(`
+M(``001@`D"`8``*A48```"``FJ91,+P``"```/KF5P$.`"``AF%0`'R?8)BP
+M`@`,`$((`((@4`";X%=0O```(``&`P`@!AQ!$``$86`,`$$(`?X@0`";X%<%
+M_?\G`'R?8'"\```@`)BP`@`0`"((`)H@4!`"`A`"?B>``(B@0!2`(@@`FB!`
+MD+P``"``%(("$`P`H@D`@B!0#((!$`P$`A"````@`)JF48",Z"^PO```(```
+MF@9@$`"N"10`S@D8`.X)!(#M"R"`#S@<$&X+`((@4-"\```@``("@!`(`@`0
+M$`(`$`8"0!`4_C]@``*`$/;^/T`$`H`0\+P``"```(`/.`0^#A``-@X0`#AN
+M8Q!^CE,``&!@`(*`8````%`0O0``(`````$0`/KA5X$$`"``A@%@`/7_+P``
+M`0@!?@!````!$#"]```@```&`A`,@&$(`/KA5X+[_R<$@.T+((`/.!`0;@L$
+M/@X04+T``"```#8.$``X;F,0?HY3````4`_^/V`'_E]@`OY_8(`!`"APO0``
+M(``$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,0?HY3``"@8)"]```@```"`4``
+M!L!``'R?8)BP`@`T``((`'K@5X(!`"``?!]@L+T``"```"`"`#0``A``?)]@
+MF+`"``0``@@`>N!7@@,`(`@``@C0O0``(```>N!7`@(`(`0*`A``"@-`"``"
+M$(`!`"``?)]@F+`"`/"]```@``0*`A``?)]@F+`"`"@``@@``@!`*``"$"P`
+M`@@`!`!`$+X``"``+``"$#```@@`!@!`,``"$````@@`#`!````"$!```@@P
+MO@``(```#`!`$``"$`"*0F``"@-```'A5P8*`"`)?F&``'R?8%"^```@`)BP
+M`@`T``((``8`0(#-_R\T``((``8`0`<$0!`T``((<+X``"``#``B"``&`$`,
+M`@`0-``""``&`$`,``(0`7Y!0``*`T"0O@``(````>%7!?;_)P2`[0L@@`\X
+M$!!N"P0^#A``-@X0`#AN8["^```@`!!^CE,8_A]@!_X_8`C^7V`%_G]@@-;_
+M+P2`[0L@@`\XT+X``"``$!!N"P0^#A``-@X0`#AN8R!^CE,0&@X0%!P.$```
+MP&'PO@``(`````!0^($-$`8$IPD`?>=7`"`"``8%`"``O@]@`'P`8!"_```@
+M`/___P`"?B"``'P?8)2Q`@```P`0!/X?8%?^/V``22(H,+\``"``^/\M0/S_
+M34``'`=@@+;_+X`WZ"\`?%]@F+`"``P`80A0OP``(`#X@2T(#(8`$`P<`1#\
+M@6T($``A"`"&($`0`@$0`OXF@'"_```@``"$0$`4`"$(`(8@4!0"`1``,N@O
+M`?KF5P(!`""`<_4OD+\``"``@```((!*\2\0`*X)%`#."02`[0L@@`\X(!!N
+M"P0^#A"POP``(```-@X0`#AN8Q!^CE,!_C]@`'P?8*C5`@```D`0`'P?8-"_
+M```@`)_:`@```D`0!/X?8(`E(R@(_A]@`'P_8```!```T@8H\+\``"```'P_
+M8-"R`@!(@0`(`7X`0$B!`!`$@.T+((`/.!`0;@L0P```(``$/@X0`#8.$``X
+M;F,4?HY3$!H.$```H&$`^N!7`10`(##````@``"H$"@`?#]@M+D"``"!(`@,
+M@``0`H0&"`.$A@D(?H:!4,```"```!@`:!"`@!`$A`8(!82&"0A^AH$`&`!H
+M!H2&"1!^AH%PP```(```&`!H!X2&"1A^AH$`&`!H`(``$`B$!@@)A(8)"'Z&
+M@9#````@```8`&@*A(8)$'Z&@0`8`&@+A(8)&'Z&@0`8`&@$@``0L,```"``
+M#H0&"!!^0(`-A`8("'X`@``$0$`,A`8(``0`0`B``!#0P```(```?#]@M+D"
+M``3_`$"`:0PH````4!``K@D$@.T+((`/./#````@`!00;@L$/@X0`#8.$``X
+M;F,4?HY3$!H.$``$05``?!]@$,$``"``D,`"```$0!``?!]@V,`"```$0!``
+MFJ91`OXF@`!\'V`PP0``(`#,P`(``(````!ZX%<!!``@`OXF@`!\'V#,P`(`
+M`(```%#!```@``0((`@`^N!7@?S_)X"N_R\"_B:```1!4`#\`$#,P`(`<,$`
+M`"````0`$`'^!D``#J`9`OKF5XOT_R<0`*X)!(#M"R"`#SB0P0``(``4$&X+
+M!#X.$``V#A``.&YC/'Z.4Q`:#A`4'`X0&!X.$+#!```@`!P@#A`@(@X0)"0.
+M$"@F#A```.!A`((`8@`$(6(`',=1T,$``"``\/]-0/3_+4``?']BE,`"`!2`
+M"0@```$0/_X?8`"``!#PP0``(```)$E2\($-"``!YU<&.0`@_/]-0OC_K4&`
+MWN<O`'Q_8A#"```@`)3``@`0@"D(`)P@0#_^8&``?#]@U+P"`"R`0`@#_B&`
+M,,(``"```(1@0`"$(````@D0!(`A"`""!A"`V><O`"1)4OZ%K0E0P@``(`#\
+MA0T(!7K@5X$J`"#\@0T(^($M"``@2&``HFA@`(('.'#"```@````(&``^N!7
+M@28`(`!ZYU<!`@`@`!P'8``N["\``$!BD,(``"``@!<`(`""H&&`S.<O%(`I
+M"`"#YE>.```@`(*@80!\/V"PP@``(`#4O`(`*/[`0`!\?V*4P`(`#/ZI0``$
+M05``^N97C@4`(-#"```@``2`(@@`A"!`/_X@8`3^@(```&,(`((@4`"(@4``
+M`@(0\,(``"```7Y!0`"%YE>-^O\G"(`B"`":(%`(@@(0!(`B"`":($`0PP``
+M(``__B!@!(("$`"_YR\`)$E2`'KI5P(4`"``FJ91\/]-0###```@`/3_+4``
+M?']BE,`"`!2`"0@```$0/_X?8`"``!``)$E24,,``"``_(4-"`)ZX%>"!0`@
+M^($-"!``0`@%_C]@?`(!$`!\/V!PPP``(`#\O`(`*($@"`#ZX%<!`0`@`((`
+M.```0&+X@4T(`'KA5Y##```@`($#`"#\A0T(`7K@5P("`"````!0`((@4``"
+M`3@``$!BL,,``"```)S&0?"!#0@``>=7!@$`(`!ZZ5<!Q_\G`"0)8!``K@G0
+MPP``(``4`,X)&`#N"1P`#@H@`"X*)`!."B@`;@H$@.T+((`/./##```@`#P0
+M;@L$/@X0`#8.$``X;F-`?HY3$!H.$!0<#A`8'@X0$,0``"``'"`.$"`B#A`D
+M)`X0*"8.$`":IE'\_RU``'Q_8)3``@`PQ```(``$@$$([/^-0`!\'V"4O`(`
+M"```"`````@```(0`'P?8%#$```@`-2\`@```(`([($-"``(`%`$?@"(``7@
+M5X4!`"``!`!0<,0``"```(``$``!`"!`?@!`@/W_)PB`00@`@``(``7@5PX!
+M`""0Q```(`````!0`(``$/R!#0@`>N!7`2P`(/C_+4+T_VU"\/]-0K#$```@
+M``!\'V+4O`(``'S_893``@"`A^<O``#`802`!P@#?B"`T,0``"``!``("``"
+M0$```@```(`)$`0``0@```D0`/KH5X$$`"#PQ```(``$@`<(!'X@@```"`@`
+M`@!``*(H8(`'Z2\``.!A`/KG5Q#%```@`((-`"``?+]@U+P"``!\GV"4P`(`
+M`((@4`0``@@``@!`,,4``"``/WX`8`1^8(``@$((````4``&84``@`$0`?X@
+M0`'ZX%=0Q0``(`"%^O\G"``""`%^`%`(``(0!``""`%^`$`_?@!@!``"$'#%
+M```@```<!V"`<^<O````4``#`"``'`=@@''G+Q[^'V``GB=@D,4``"````1!
+M4`#9&2@`>N!7`@L`(`!\/V"@M@(``($`"`!ZX%>PQ0``(`""`0`@4/X?8)C^
+M/V``=R$H`'P_8*"V`@``@0`(_W\`0-#%```@``"!`!#T@:T)`/KF5X$$`"``
+M``!0"(`&$`R`!A#X@0T(\,4``"```H"&$(`!`"!0_A]@K?X_8(!N(2@`F@9@
+M$`"N"10`S@D0Q@``(``8`.X)'``."B``+@HD`$X**`!N"@2`[0L@@`\X0!!N
+M"S#&```@``0^#A``-@X0`#AN8R1^CE,0&@X0%!P.$!@>#A`<(`X04,8``"``
+M("(.$`""(%`"`H`0"`(`$!`"`!`4_C]@``*`$/;^/T!PQ@``(``$`H`0%'X`
+M0@``H&$`?#]BU+P"``"BZ&$`?-]AE,`"`)#&```@`(!-YR\(`"<(/_K@5P4#
+M`"``3N<O+/X?8`3^/V``!$%0L,8``"``@+49*``.`"```"<(!/Z@@`"`AP@`
+M"D)`#(`H"`#\8&C0Q@``(`#L`0``!``A"`"&('@`H"!X#`(!$`@@`1``"J)`
+M`(8"$/#&```@````)P@#_D"`!(`G"`"$0$``&@$0"``G"`'^($`(`@<0$,<`
+M`"`````G"`'^($`__B!@``('$``^YR\```!0`'K@5X(&`"`PQP``(```?#]@
+MH+8"``"!``@!?@!``($`$`!\/V"4O`(`#(``"%#'```@``!\0&@``@``!(``
+M"``$`!2``0`@4/X?8'W^/V``02$H<,<``"``$`"N"10`S@D8`.X)'``."B``
+M+@H$@.T+((`/."00;@N0QP``(``$/@X0`#8.$``X;F,0?HY3`'P?8*"V`@``
+M`0`(!'K@5[#'```@`(8``""``0`H!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC
+MT,<``"``%'Z.4Q`:#A``?']@H+8"``"!(0@0@A]0#(%!"``$(%#PQP``(``!
+M_A]@`?Y?8`!Y_B\`>N!7@1``(`!ZX%>!#P`@`'Q_8!#(```@`*"V`@`,@4$(
+M`($A"`"%X%<%"``@#`"@"0""(%`,`@`0,,@``"``"($A"`#ZX%<!`0`@#(``
+M$(```"`$@0$0`'Q_8*"V`@!0R```(``(@0$0#(%!"`%^`4`,@0$0`)H&8`!Z
+MX%>!`P`@#`"@"7#(```@``""(%`,`@`0@+;_+P":!F``>N!7@N__)P!\?V"@
+MM@(`D,@``"```($A"`'^`$`,@4$(``'A5XX%`"``!P`H`'K@5P$$`""PR```
+M(`"`K_\O`'Q_8*"V`@``@2$(`?X`0`R!00@``>%7C?K_)]#(```@`!``K@D$
+M@.T+((`/.!00;@L$/@X0`#8.$``X;F,0?HY3\,@``"```?X?8`'^/V`!_E]@
+M@%C^+P!ZX%<""0`@`'Q?8*"V`@`0R0``(``$`2$(`/K@5X$&`"``@@!@#``@
+M"`0#`1``AF%0#`8`$##)```@``#ZX%>"```@"`<!$`!\7V"@M@(`#`$A"/__
+M($`,`P$04,D``"``!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC''Z.4Q`:#A!P
+MR0``(``4'`X0&!X.$```P&$`>N=7`0$`(````%```$<0`'Q?8)#)```@`-#>
+M`@``"`$(`'K@5X(7`"``2O\O``"@80#ZYE<!?``@L,D``"``%/XF0`!\'V#4
+MW@(```(`$!2$!@@)>N!7`0,`(`!ZYU?0R0``(``!`0`@`?X?8```1Q``F@9@
+M`'8`(!J(!@@)?@!``!!@&/#)```@`!R$!@@,?@!@`'K@5X($`"`<A`8(_'X`
+M8``.X!F`^N=7$,H``"```0$`(%#ZYU<"`0`@"/X!0``08!@`?#]@S-X"``":
+M`!`PR@``(```F@9@`'Q?8,C>`@````$0`H@F"`"#X5<,`@`@`((!4%#*```@
+M``!\7V#0W@(```"!$`!\7V#0W@(```@!"`!ZX%<!#``@<,H``"```##_+P``
+MH&$`^N97`6(`(`!\/V#,W@(``(``"`P:`!"0R@``(```F@`0`'Q?8-#>`@``
+M"`$(`H@F"``#X%<,`P`@``(`4+#*```@````@1``$``8`'K@5P+V_R>``0`@
+M`H"&$````%```($0T,H``"``@,'_+P``H&$`^N97`00`(`!\7V#(W@(````A
+M"`R"!A#PR@``(```&@$0@$\/*$B`!A"`00`@6/X?8`!\/V"]`@```,T@*!#+
+M```@```_`"`(A``(_'X`8``.X!F`^N=7`0$`(%#ZYU>"`P`@,,L``"```'P?
+M8-3>`@```"`(!H@`"`!]X%?:`0``"3,`(`!\?V!0RP``(`#`W@(``(`!"`!Z
+MX%<`?%]@R-X"````(0B!`@`@`'P?8'#+```@`,3>`@`````("`(`$``"`"``
+M@@$0`'P?8)2W`@"`$PLHD,L``"```'Q?8,C>`@```"$(`'P?8,3>`@```@`0
+M@/KG5P$!`""PRP``(`!0^N=7@C8`(`!\7V#(W@(````!"`">)V``1^XO@#,`
+M(-#+```@``!\?V"XW@(``(`!"`!ZX%<`?%]@R-X"````(0B!`@`@\,L``"``
+M`'P?8+S>`@`````("`(`$``"`"``@@$0`'P?8)2W`@`0S```(````PLH`'Q?
+M8,C>`@```"$(`'P?8+S>`@```@`0@"<`(##,```@``B$``C\?@!@``[@&>3Z
+MYU<!`0`@]/KG5X(#`"``?!]@4,P``"``W-X"``````@`>N!7@1``(``"`#B`
+M#P`@I/KG5P(,`"!PS```(```?']@P-X"``"``0@`>N!7`'Q?8,C>`@```"$(
+M@0(`()#,```@``!\'V#$W@(`````"`@"`!```@`@`((!$`!\'V"4MP(`L,P`
+M`"```.\**`!\7V#(W@(````A"`!\'V#$W@(```(`$(`3`"#0S```(`!8_A]@
+M`'P_8#`#````DR`H`!$`(`!\7V#(W@(````!"/#,```@```\_B^`#@`@6/X?
+M8`!\/V`X`P```(X@*``,`"``?!]@$,T``"``U-X"````(`@(A``(#'X`8`QZ
+MX%<-^O\G`GZ`@0!\A@$PS0``(``XS0`````&.,4R```^,P``/C,``#XS```,
+M,P``/C,``%#-```@`#XS```^,P``]#(``#XS```^,P``/C,``#DS``````!0
+M<,T``"```'Q?8,C>`@````$0`$+_+P!ZYU<!`0`@`?X?8```1Q"0S0``(```
+M``!0$`"N"10`S@D8`.X)!(#M"R"`#S@<$&X+!#X.$+#-```@```V#A``.&YC
+M$'Z.4P!\/V"EV@(``(0@"`#ZX%>!$``@T,T``"```'Q?8$RS`@#(!2$(`/K@
+M5P$.`"#0"6$(!`@@"`"#X5?PS0``(``"!0`@S@EA"`(((`@`@^%7`@,`(,P)
+M(0@`"``(`('@5Q#.```@``(!`"`!_A]@@```(````%``>N!7@04`((!:YB\`
+M?#]@,,X``"``I=H"``"$(`@`^N!7`0(`(`+^7V``?#]@I-H"``"$0!10S@``
+M(```6.8O!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC)'Z.4W#.```@`!`:#A`4
+M'`X0&!X.$!P@#A`@(@X0``"@80""P&$0@.8)D,X``"```'KG5P$$`"``?#]B
+M4+D"`!B!"`@`>N!7@0$`(/+^'V"PS@``(`!'@$<0@#D`(#6$!P@"?@!@`'K@
+M5P("`""*_A]@`'P_8-#.```@`"X%````5"`H4(0'"`!ZX%<"`0`@`)H&8``:
+M]2]<A`<(\,X``"``_'X`8(!ZX%<`?#]B4+D"``(!`"!(B0@(@```($J)"`@0
+MSP``(```?#]B4+D"`$:!B!!6@(<03HD("$2`AQ`VA`<(58!'$##/```@``""
+M(%!)@D<0A/X?8$>`1Q`!_A]@`*WZ+X`VYB\```!B4,\``"``$($("`!ZX%<"
+M`0`@$)L($``.`"``>N=7`0P`(`B`!A!PSP``(``0FP@07(0'"/Q^`&"`>N!7
+M@@H`(`":!F``FB9B"```")#/```@`!``(`A<A"`(_/X@8%#ZX%>"`@`@"``@
+M"`B""!"`Y/TOL,\``"```*((8(```"```"!B"``@"`#ZX%>"^/\G@`$`(!2!
+M"`C0SP``(``(&@`0%)L($`!ZYU>!`0`@`'P_8E"Y`@`8FP@0`((@4/#/```@
+M``!\'V`VWP(```)`$`!\/V)0N0(`"(D("`)ZX%>*```@$-```"``@"_R+P`@
+M"&``'^8O`'KG5X$)`"``?#]B4+D"`!S_J$$PT```(```F@9@9/X_8(!4"B@`
+M>N!7@@(`($>$!P@">N!7`?X?8%#0```@``(``%``!@`@`_X?8("'\B\`F@9@
+M__\_8(!."BB``@`@<-```"``1X0'"(!ZX%<"`0`@`?X?8(```"````!0$`"N
+M"10`S@F0T```(``8`.X)'``."B``+@H$@.T+((`/."00;@L$/@X0`#8.$+#0
+M```@```X;F,@?HY3$!H.$!0<#A`8'@X0'"`.$````&(`@N!AT-```"```'P?
+M8.C6`@`````(`'K@5X$!`"`8!``(`'K@5P(!`"#PT```(``!_A]@@#$`(`!\
+M'V"GV@(```0`"!1ZX%<!`0`@`7K@5Q#1```@`((#`"`#_A]@`?X_8``$05``
+M5/TO``"@80#ZYE<"`0`@,-$``"``````4(`I`"``B`8(`!K`01"<!A!<?D=`
+M`((@4!0"AQ!0T0``(``6`H<00`)'$`'^?V!#!D<0-AY'$`!\'V"ZV@(```0`
+M"'#1```@`$@`1Q!.`H<0`OX?8#4`1Q!*`D<04`)'$%$"1Q!2!D<0D-$``"``
+M4P)'$%0"1Q`8_A]@>@"'$!P"AQ!(_A]@7`!'$`!ZZ%>PT0``(`"!`0`@$/X?
+M8%T`1Q"````@70)'$`$$`0@!?@!H`0!!$-#1```@``!\'V#HU@(`````"``(
+M(`@$`H$0`@@@"`8"@1`$""`(\-$``"``"`*!$``((`@0`H$0`@@@"!("@1`$
+M"``(%`"!$`!\/V`0T@``(`"4M@(``(@`"`H`@1`"B``(#`"!$`2(``@.`($0
+M`)H&8##2```@``'^/V``A?\O`'K@5P$$`"``F@9@@)']+P!\/V`TK0(`4-(`
+M`"```(``"`%^`$``@``0`-+_)T<$!P@)>N!7`)H&8((!`"!PT@``(```C/TO
+M`OX?8``!`""`BOTO@-7_)Q``K@D4`,X)&`#N"9#2```@`!P`#@H$@.T+((`/
+M."`0;@L$/@X0`#8.$``X;F,@?HY3L-(``"``$!H.$!0<#A`8'@X0'"`.$```
+MX&$`@L!A``2A80"&`6+0T@``(``"_B>``/P`0%3!`@`('0`0`!L`$`">!V``
+M("A@@/3I+_#2```@``!ZZ%>!```@`!RG80+^)X``_`!`/+<"``@;`!`0`*X)
+M$-,``"``%`#."1@`[@D<``X*!(#M"R"`#S@@$&X+`'P?8$3=`@`PTP``(```
+M!``(`'K@5P$"`"``?!]@2-T"````(`B``0`@`'P?8%#3```@`,3``@```"`(
+M`'P?8/C<`@```@`0`'P?8/C<`@```"`(<-,``"```'P?8`RO`@```@`0`'P?
+M8$S=`@``!``(`'K@5P$"`""0TP``(```?!]@4-T"````(`B``0`@`'P?8."L
+M`@```"`(`'P?8+#3```@`*C:`@```@`0`'P?8*C:`@`````(`'P_8!"O`@``
+M@``0T-,``"```(9A4``$05`!A#^``(`@8`#ZX%<!`P`@`7Z!0`#\(4#PTP``
+M(`#\W`(``(A`$`'^(4``CF`8`7Y!0`YZX5>%^?\G````4!#4```@``#\(4#\
+MW`(``(!`$`"`#S@$/@X0`#8.$``X;F,8?HY3,-0``"``$!H.$!0<#A```*!A
+M`'S?83RW`@```0<(`('F5P$&`"!0U```(```?!]@X,@"```(``@``"!``(`@
+M0`+^((`"_@:```(`0'#4```@```<`$`<`0`(``(`.``;!Q`0`*X)%`#."02`
+M[0L@@`\XD-0``"``&!!N"P0^#A``-@X0`#AN8Q!^CE,`?!]@;+$"`(#O"2BP
+MU```(``$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,8?HY3$!H.$-#4```@`!0<
+M#A```,!A`(*@80!.!"@`^N97@0(`(````%"`QODO\-0``"```'P_8-S``@``
+M@``0`'KG5X$G`"``?!]@P-P"```$``@0U0``(```>N!7`0D`(`!\'V#!W`(`
+M``0`"`!ZX%>"!@`@`'P?8##5```@`%/>`@``!``(`'K@5P($`"``?!]@D+4"
+M``````C_>^!74-4``"```'P?8/S<`@""(0`@@"D`(`'^/V``?!]@4]X"```"
+M0!!PU0``(```!$%0`'R?8.3?`@```&((`(0!"`!\(4#LWP(``(!`$)#5```@
+M``'^(4```@(0`'K@5P(+`"``>N%7@@<`(``Q!"@`FJ91L-4``"```'P?8(S:
+M`@``&D`0`'P?8%/>`@``&D`0`?X?8("J^2_0U0``(``@_A]@@(KN+P!C_2\`
+MF@9@`"$`(`":IE$`?!]@4]X"`/#5```@```:0!```@`@`7X!0``.0!@(>N%7
+MB^W_)PAZX5<"`@`@$-8``"```)JF40!\(4#LWP(``)I`$`!\'V"0M0(`````
+M"/][X%<PU@``(```?!]@[-\"``(0`""`"@`@`)JF40!\'V!3W@(``!I`$%#6
+M```@``!\'V#`W`(```0`"`!ZX%>!`@`@`-O_)P!Z#B@`?!]@<-8``"``L+L"
+M`(`&`"``?!]@D+4"``````C_>^!7`'P?8/S<`@"0U@``(``"!0`@`'P_8%3>
+M`@``@$`(;OX_8`"&85``!``@!?X_8+#6```@`!3^7V`"_G]@``(`((!O#B@`
+M?!]@L+L"``#Y_R<!_I]@T-8``"``@!/V+P!\/V"@K@(``(``"`%^`$``@``0
+M`?X?8!``K@GPU@``(``4`,X)!(#M"R"`#S@8$&X+!#X.$``V#A``.&YC%'Z.
+M4Q#7```@`!`:#A``?+]A]*X"``"(!@@`@1,H`'P_8/BN`@``@(`0,-<``"``
+M`(@&"("3$R@`?#]@KMP"``"`@!``B`8(`'P_8/:N`@!0UP``(```B"`(@#+N
+M+P!\/V`HL`(``OX?8`"^]B\`?!]@BMP"`'#7```@```Z]R\`=O\O````4`!\
+M/V#HR@(``("`$`!\'V"PW`(`D-<``"``````"`!ZX%<"`0`@(/X?8`"`@!``
+M?!]@M-P"``````BPUP``(``(?@!@`'K@5X$"`"``?#]@Z,H"``"(``@0?@!H
+M`("`$-#7```@``!\/V#@DP0``'P?8$RV`@`$`P`0`'P_8.C*`@``B``(\-<`
+M`"```GX`:`"`@!"`L@$H`'P?8'3<`@``&/<O`'P?8&#9`@`0V```(`"`@?8O
+M`'P?8'"P`@`````(`'K@5P$!`"````!0@```(##8```@``'^'V``#O<O`'P?
+M8-RO`@``8/8O`'P?8-"N`@`````(4-@``"```,7V+P!\'V"TW`(`````"`A^
+M`&``>N!7@@(`(`!\'V!PV```(```KP(`````"`%ZX%>"#0`@`_Z_80`/Y2\`
+M?#]@N-P"`)#8```@``"$(`@`^N!7@@(`(`!\7V`XM@(```0A"`'^($```D$0
+ML-@``"````SE+P".!A@`@B!0`"/W+P#ZYE?__Z9!`O?_)X"U&RC0V```(```
+M?#]@W*\"``2$(`@`@"!H`'P?8+S<`@```@`0`/(6*/#8```@``!\'V#<K`(`
+M````"`1^`&``>N!7`@4`(`!\/V#$N0(`$-D``"```'P?8,RY`@```@`0`'P_
+M8,BY`@``?!]@T+D"```"`!`PV0``(``!_A]@`'P_8+C<`@``@$`0$`"N"02`
+M[0L@@`\X%!!N"U#9```@``0^#A``-@X0`#AN8QA^CE,0&@X0%!P.$`"!#2@`
+M`,!A<-D``"```'P_8)"N`@``@$`(``2A80#ZYE<!%P`@!(`&"`!ZX%>0V0``
+M(`"!%0`@9(`&"``!YU<.`0`@```'4(```"``'`!0`'P_8+#9```@`$RV`@`$
+M@2`(!?X@@``#X%<.#``@`'P_8)"N`@``@``(T-D``"```('F5P"`!@@"`0`@
+M`(``$(```"````$0`'P_8$RV`@#PV0``(```@0`(`(`&$`";`!````!0!(`&
+M$`!\/V`TKP(``(``"!#:```@`/]_`$``@``0`)H&8`+^/V"`@^TO`)I&8`"`
+MI@D`^N97,-H``"``@0$`(`2`!@@`>N!7@NK_)Q``K@D4`,X)!(#M"R"`#SA0
+MV@``(``8$&X+!#X.$``V#A``.&YC&'Z.4Q`:#A`4'`X0``"@87#:```@`)*(
+MQ@F4B"8(`'KG5P$$`"``@@!```(`0`-^`(```@!`D-H``"```GX`@``<)V"`
+M,^8O@```(````%"6@(80`!P'8!``K@FPV@``(``4`,X)!(#M"R"`#S@8$&X+
+M!#X.$``V#A``.&YC''Z.4]#:```@`!`:#A`4'`X0&!X.$```H&&*B,8)`,/D
+M+P`<)T``@B9`\-H``"``=HC@"8"(P`D`P^0OC(@&"``>`$``$.`9CH@&"``<
+M`$`0VP``(```$,`9`/KG5P$$`"``'`=``!P`0`-^`(``'`!``GX`@##;```@
+M``">)V``(.8O@```(````%"0@(80`)X'8!``K@D4`,X)4-L``"``&`#N"02`
+M[0L@@`\X'!!N"P"&85``?!]@P-P"```&0!!PVP``(``!_C]@`'P?8,'<`@``
+M`D`0`'P?8,3<`@`"!D`0`P9`$)#;```@``0&0!``?!]@;=P"```&0!``?!]@
+M;-P"```&0!``@B!0L-L``"```()`0``"04``AF%0`'P!0,3<`@`%!D`0!@9`
+M$`<&0!#0VP``(``!_@!```X@&`?ZX%<+^O\G`(`/.`0^#A``-@X0`#AN8_#;
+M```@`!1^CE,0&@X0`'R_89"N`@``@`8(`'K@5X$*`"``?%]@$-P``"``-*\"
+M````(0C__R!```(!$```(`@`?+]AD*X"``""!A`PW```(```@B!0!`(`$`!\
+M7V!,M@(```$A"``"`!```0$0`OX_8%#<```@`(`][2\`@`8(`'K@5X+U_R<0
+M`*X)!(#M"R"`#S@4$&X+<-P``"``!#X.$``V#A``.&YC%'Z.4Q`:#A```*!A
+M`(9A4'2&AA"0W```(`"6AH80DH:&$)2&AA"0AH80@(OD+P""(%``@D!``(9A
+M4+#<```@``"$1D"`!H$0=@:!$`'^($`%^N!7"_S_)P")Y"\0`*X)T-P``"``
+M!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC''Z.4Q`:#A#PW```(``4'`X0&!X.
+M$```X&$`?#]@3+8"``"!H`D`^N97@0@`(!#=```@``"`!@@`@0`0`'P_8#2O
+M`@``@``(`'K@5P("`"``',=1,-T``"```'P_8)"N`@``G``0`'P_8)"N`@``
+M@``(`(`&$`":`!!0W0``(```!P`@`'L;*```H&$`^N97`@$`(````%"`*@`@
+M`'P_8'#=```@`#2O`@``@``(_W\`0`"``!``F@9@`OX_8(`6[2\`?#]@D-T`
+M`"``-*\"``"```@!?@!``(``$!"`1P@`',=1I)R&$````%"PW0``(`"B@(80
+MH("&$`'^'V"P@(80I(@&"````$`C!"$(`(`&0-#=```@`*8"@!"DB`8(`7X`
+M0*2`AA`C!"$(HH@&"`"``$"B@(80\-T``"```!``&+"()@B`Q^4OH("&$`'^
+M'V`$@`807IR&$""<1A`0W@``(``5G$80#IQ&$%B<AA!:G(807)R&$%:<1A``
+M@B!0`!S'43#>```@``""!D`T'$`0`?X@0"#ZX%<+_?\G:)R&$(J<AA!@G(80
+M4-X``"```)H&8`">)V"`40$H!(`&"/!^`&``>N!7`0(`(`":!F!PW@``(```
+MR``H`!P'8(`(`"``?!]@;-H"```((`AHB`8(`(``8)#>```@```0P!D`'`=@
+M`*<2*&Z`AA``'`=@@)`2*&R`AA!J@(80L-X``"```)H&8`'^/V"`\.PO`)H&
+M8!``K@D4`,X)&`#N"02`[0O0W@``(``@@`\X'!!N"P!\/V"0K@(``(`@"`#Z
+MX%>!"``@``A@"/#>```@``B(0`@`A>%7`@4`(`((8`@*B$`(`(7A5P(#`"`$
+M"&`($-\``"``#(A`"`"%X5<"`0`@`((`8``"`"``@"`(`/K@5X+W_R<PWP``
+M(`````!0`(`/.`0^#A``-@X0`#AN8QA^CE,0&@X0%!P.$%#?```@```<QU$`
+M?!]@D*X"````H`D`^N97`00`(`":!F"`YOHO<-\``"``:H@&"``<`&``$,`9
+M`("F"0#ZYE<"_/\G$`"N"10`S@F0WP``(``$@.T+((`/.!@0;@L$/@X0`#8.
+M$``X;F,<?HY3$!H.$+#?```@`!0<#A`8'@X0``#@80""P&$`>N=7`24`(`"(
+M!P@`>N!7T-\``"```@,`(`*(!P@`>N!7@@$`(`2(!P@`>N!7@2``(`X$!PCP
+MWP``(```?+]A8-D"``:`1A``?#]@Z*X"``"``!`8"`<($("&$!#@```@``!\
+M/V`4KP(``(``$`!ZX%>"!``@`'P_8-"N`@``@``(,.```"```'K@5P$"`"``
+M``!0`(``$````%"`QO4O`'R_86#9`@!0X```(``*B"8((/X`8`!ZX%<!`P`@
+M$@@'""!^`&``>N!7`@$`('#@```@`-__`&`*@(80%@@'"`!\OV%@V0(`#H"&
+M$`\$)P@'@D80D.```"```(@'"`"`AA`"B`<(`H"&$`2(!P@$@(80`'P_8$RP
+M`@"PX```(```B`<(`("`$`*(!P@"@(`0!(@'"`2`@!!H"`<(#P0G"-#@```@
+M```#[2\`?!]@=-P"``"J]2\`F@9@`&?U+P'^'V"````@\.```"``````4!``
+MK@D4`,X)&`#N"02`[0L@@`\X'!!N"P0^#A`0X0``(```-@X0`#AN8Q!^CE,`
+MBJ)0`'P?8)"N`@``"@`0`'R?8##A```@`"3+`@``?!]@3+8"```)`!``?!]@
+M]-8"```*0!``?!]@4.$``"``-*\"```*`!``?!]@J-4"```$``@`>N!7`((@
+M4($3`"!PX0``(``"_@"```(`0````$```@!``GX`@``"`$`"?@"`M'Y`0)#A
+M```@``!\GV`DRP(```A!0``(8$``"(!!``0&$`"*HE`5BD$0L.$``"``((I!
+M$`'^($`+^N!7"_;_)P+^`(```@!`````0``"`$#0X0``(``"?@"```(`0`)^
+M`(``"(!```H"$`""(%`$_D"``(JB4/#A```@``!\`4`4UP(`"`H`$`'^($`4
+M^N!7"_S_)P`-`"`"_@"`$.(``"````(`0````$```@!``GX`@``"`$`"?@"`
+MM'Y`0`!\GV`PX@``(``DRP(```A!0``(@$$`!`80`?X@0`OZX%<+^/\G`OX`
+M@%#B```@```"`$````!```(`0`)^`(```@!``GX`@`"*HE``"(!`<.(``"``
+M``H"$`!\'V"HU0(```0`"`!ZX%>"```@`$CF+P2`[0N0X@``(``@@`\X$!!N
+M"P!ZX%<!`@`@!``@"`#\(&@`$```!`(`$+#B```@`````%``@`\X!#X.$``V
+M#A``.&YC''Z.4Q`:#A`4'`X0T.(``"``&!X.$```H&$`@N!A`/KF5P$M`"!>
+MB"8(`'P?8*RN`@#PX@``(````@`0`'S?88BN`@````<(`)HF8(#3"B@"_B>`
+M`'Q?8!#C```@`+"N`@``A````7X`0`"$0$````$0!(`&"`)^`&@$@`80,.,`
+M`"``:(@&"``.(!@`?!]@]*X"```(``@``@!@``X`&`!\/V!0XP``(`!LV@(`
+M`(@@"`".(!@`@`!@``X`&&"()@@`CB`8`(``>'#C```@```.`!@`>N!7@0(`
+M(*"()@@2^N!7"P$`(`#T$2B````@D.,``"``;H@&"&J`AA!JB`8(`%,%*&B(
+M!@B`\!$H`'P_8/JN`@"PXP``(```@(`0`)H&8(`6_R\6B"8(`'P?8."N`@``
+M`@`0#H0F"-#C```@``!\'V#HK@(```(`$!*()@@`?!]@\*X"```"@!``?-]A
+M\.,``"``B*X"````)P@`^N!7`08`(!#^'V"`Q.PO``1!4```)P@0Y```(``@
+MA$`0!(``"/U_`&``?`!@_^___P2``!!@A(`0``$`(##D```@``3^'V"`ONPO
+M`'S?88BN`@``&@<0`)H&8`"E`R@0`*X)4.0``"``%`#."1@`[@D$@.T+((`/
+M.!P0;@L$/@X0`#8.$``X;F-PY```(``0?HY3!/X?8`"V["\!_A]@@//]+P2`
+M[0L@@`\X$!!N"Y#D```@``0^#A``-@X0`#AN8Q!^CE,(_A]@@+#L+P2`[0L@
+M@`\XL.0``"``$!!N"P0^#A``-@X0`#AN8Q!^CE,`?']@D*X"``"`00C0Y```
+M(```!"%@`/K@5P$5`"```^!7`A(`(`!\?V`TKP(``(`!"/#D```@`/]_`$``
+M@`$0`'Q_8)"N`@``@`$(`('@5P"```@"`0`@$.4``"```(`!$(```"````$0
+M````4`2``!``?%]@3+8"```!`0@PY0``(```@``0``,!$`!\'V#@W`(`````
+M"`!ZX%<!!P`@`'Q_8%#E```@`#2O`@``@`$(`'K@5X($`"`&_A]@`'P_8```
+M`@``(@(H<.4``"````(`(`""0&``@"`(`/K@5P+K_R<$@.T+((`/.!`0;@N0
+MY0``(```!$%0`'P?8(#<`@``!``0`'P_8-RO`@`!A``(`'Q_8+#E```@`(C<
+M`@``@$$0`(0`"`&`01`%A``(`'Q_8(3<`@``@$$0T.4``"``!(0`"`&`01`#
+MA``(`H!!$`*$``@#@$$0`'P_8&#9`@#PY0``(```A``0!(2`$`!\'V!,L`(`
+M``2!80`80!`(?H:)`1A`$!#F```@``A^AHD"&$`0"'Z&B0,80!``AH%A!`1`
+M$`A^08@%!$`0,.8``"```'P?8.BN`@`````(!H!`$`!\'V#@K@(`````"`Z`
+M@!!0Y@``(```?!]@%*\"``````@0@(`0`'P?8.C*`@``"``("H"`$'#F```@
+M``!\'V#VK@(```@`"`>`0!``@`\X!#X.$``V#A``.&YCD.8``"``%'Z.4Q`:
+M#A``@B!0`'P?8$RV`@`<`T`0`'P?8/#<`@"PY@``(```!``(`'K@5X$"`"``
+M?!]@@-P"``````@`>N!7@0(`(-#F```@``!\'V#TW`(`````"`!ZX%<!%@`@
+M`'P?8/#<`@``!``(\.8``"```'K@5P("`"`!_C]@`'P?8$RV`@`<`T`0`'P_
+M8-RO`@`0YP``(```A``(`'R_86#9`@``@$80`80`"`&`1A`"A``(`H!&$##G
+M```@``.$0`@$A``(``1`0`6$``@`!`!``X!&$`#F&2@$@(804.<``"```(0&
+M"/Y_`&``#@`8`GX`:`"`1A``?#]@3+`"``"(!@APYP``(```@(`0`H@&"`*`
+M@!`$B`8(!("`$`":!F"`DO0O`?X?8)#G```@`(```"````!0$`"N"02`[0L@
+M@`\X%!!N"P0^#A``-@X0L.<``"```#AN8Q1^CE,0&@X0``"@80#ZYE<!(@`@
+M`'P?8.2[`@#0YP``(```!``(`'K@5UZ()@@!`0`@H(*&$``>`""@B`8(`('@
+M5_#G```@`(D"`"``@>!7BAL`(``"`%`4>N!7"AH`(+"()@@%^N!7$.@``"``
+MB@L`(%Z()@BBB`8(``(`0**`AA"DB`8(````0%Z()@@PZ```(```@`9`I@*`
+M$*2(!@@!?@!``!``&`7^/V"`?>0OI(*&$%#H```@`+"()@@!_@!``!`@&+"`
+MAA"BB`8(`'KD+Z"`AA``#0`@<.@``"``I(@&"````$``@`9`I@@@"**(!@@`
+M`@!0HH"&$``0`!B0Z```(`!>B"8(``(`0**`AA``$``8!?X_8`!RY"^@@(80
+MI(@&"+#H```@`````$!>B"8(`(`&0*8"@!"DB`8(`7X`0``0`!@%_C]@T.@`
+M`"``@&SD+Z2"AA`0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A#PZ```(```.&YC
+M)'Z.4Q`:#A`4'`X0&!X.$```H&$`@L!A$`#G"1#I```@``Z(!P@(@(80$(@'
+M"`J`AA`2B`<(#("&$`")"RAD@`80,.D``"``(X0'"%Z`AA`\@`<(`00`"!!^
+M`&``>N!7!(`&"($!`"!0Z0``(```?`!H``@````!`"``?`!@__?__P2`!A`,
+M`,<)``@G"'#I```@``"<8$`(A`$("82!"0A^AH$`&`!H%H"&$`J$`0@+A($)
+MD.D``"``"'Z&@0`8`&@2@(80`*X`*`!ZX%>"`0`@!(`&"!!^`&BPZ0``(``$
+M@`80#/X!0/R!#1`,A`$(`'K@5X(.`"`-A$$(`'KA5]#I```@``$-`"``?!]@
+MK=P"```$``@``>%7@@H`(`""(%``A>!7\.D``"``B@H`(/R!#0@``J!``H1"
+M"`!\'V`HL`(``@(````!X5<0Z@``(`"!`0`@!(`&""!^`&@$@`80`?X`0``0
+M(!C\@0T(`01`"##J```@``"%X%>+]_\G@`$`(`2`!@@@?@!H!(`&$/R!#0@!
+M!$`(4.H``"```GXA0`"``$#\@0T0``0@"`'ZX%>"(@`@`(9A4``$05!PZ@``
+M(```@B!0`02`"`")X%<*%0`@``B"4/R!#0@``J!``H0"")#J```@`']^P&``
+M?`)`.+\"```%``@``>-7@@4`(`&('X``$,`8L.H``"````8#:``08!@"A`((
+M@'X`8`!ZX%>!`P`@``0#:``00!C0Z@``(````@`@`7X"0``0@!@$>N)7"_3_
+M)P1ZXE>+!``@_($-"/#J```@```"H$`"A`((@'X`8`!ZX%>!`0`@!(`&"`A^
+M`&@$@`80$.L``"```?X`0``0(!C\@0T(`02`"`")X%<+Z_\G#X1&$`!\'V`P
+MZP``(`#TK@(```@`"``$`&```>%7@0$`(`2`!@@(?@!H!(`&$%#K```@``!\
+M'V#TK@(```@`"``&`&!H@(80_($-"`$$@`@"?B)`<.L``"```(``0/R!#1"`
+M`0`@!(`&"`A^`&@$@`80_($-"``$(`B0ZP``(``"^N!7`@(`(`$$(`@"_B!`
+M`(``0/R!#1#\@0T(``0@"+#K```@``/ZX%>"`0`@`@0`"`Z`1A```@`@!(`&
+M"`!\`&C\P!\`T.L``"``!(`&$``()P@""`<(``(`0``<P$'\@0T(``'G5XX=
+M`"#PZP``(`"`%``@`@0@"/J#31`#!``(^X%-$/J)+0@8@H80`!8`(!#L```@
+M`(!BY"\`>N!7@0(`(`#H_2\$@`8(0'X`:`2`!A``$@`@,.P``"```?X_8`!\
+M'V#`W`(```)`$`""(%``?!]@P=P"```"0!!0[```(`"`#0`@!00@"/J#31`&
+M!"`(^X--$/J)+0A8@H80!P0@"'#L```@``@$@`D(?H:!`)@@:%R"AA`)!"`(
+M"@2`"0A^AH$`F"!HD.P``"``6H*&$``%`"#\@0T(``0@"`?ZX%<![?\GB0$`
+M(`;ZX%>P[```(``!Z/\G``$`(*WZX%>!\O\G_($-"`$$(`@"_B!``(``0-#L
+M```@`/R!#1```>=7C??_)P":!F``%>HO`'K@5X$#`"!>B"8(\.P``"```'Q?
+M8,+<`@``"`$(`('@5XP``"```H$0$`"N"10`S@D0[0``(``8`.X)!(#M"R"`
+M#S@D$&X+"'Z.4PD$(`@&`DX0"`0@"##M```@``<"3A`-!"`(``).$`P$(`@!
+M`DX0"P0@"`("3A`*!"`(4.T``"```P).$`8(3@@`?#]@B-P"``"((`@``^%7
+M"00`(``#X5=P[0``(`"""``@``!."`!\/V"$W`(``(`@"``#X5>.!0`@`'P_
+M8)#M```@`(#<`@``@``0!@A."`!\/V"(W`(``(2`$```3@@`?#]@L.T``"``
+MA-P"``"$`!`(?HY#`(`/.`0^#A``-@X0`#AN8R1^CE/0[0``(``0&@X0%!P.
+M$!@>#A```*!A`(+`80#ZYE>!(0`@`'KG5_#M```@`($@`"`0`.<)`.\**&2`
+M!A`CA`<(7H"&$`":!F``,_\O$.X``"``/(`'"`$$``@0?@!@`'K@5P2`)@@`
+M_`!@``@``($"`"`P[@``(```>N!7@@4`(`#\`&@`"`````(`(`!ZX%<!`P`@
+M`/P`8%#N```@`/_W__\$@`80`)H&8`/^/V"`^^HO#`!'"``(80@`A`%`<.X`
+M`"``#'X`0/R!#1`"""$(`(8@0`"$0$```>%7C@T`(/R!#0B0[@``(```!"`(
+MK?K@5P((`"`%!"`(^H--$`8$(`C[@TT0^HDM"+#N```@`%B"AA`'!"`("`2`
+M"0A^AH$`F"!H7(*&$`D$(`@*!(`)T.X``"``"'Z&@0"8(&A:@H80_($-"`$$
+M(`@"_B!``(``0/R!#1#P[@``(````>%7C?+_)Q``K@D4`,X)&`#N"02`[0L@
+M@`\X)!!N"Q#O```@``!\/V#HR@(``(A`"`%^(6``^N!7@0D`(`%^(&``^N!7
+M,.\``"```0H`(`!\/V"LW`(``(0@"`#ZX%<0?B!@`@(`(!!^`6!0[P``(```
+M@>!7@08`(``%`"``^N!7`04`(!!^`6``>N!7@@,`('#O```@```"`"`2?B!@
+M$GX!8`"!X%<!`0`@````4(```"`!_A]@D.\``"```(`/.`0^#A``-@X0`#AN
+M8QQ^CE,0&@X0%!P.$```P&&P[P``(```FJ91`'Q?8+"V`@`!10$(`'K@5X(A
+M`"#\_RU``'P?8-#O```@`)2\`@`4```(`$``"`)^`&``>N!7`?X?8`(``%``
+M@``0\.\``"``4$4!"`!ZX%<"#``@@&P(*`!\/V",U@(`-(``$`!\/V`0\```
+M(````"$`",0`"$!^`&``>N!7@00`($#^'V`(@$`4#,0`"##P```@`+]_`&`,
+M@$`4`?X?8`!\7V"PM@(`4`%!%`!\7V"PM@(`4/```"``4$4!"`!ZX%<!]/\G
+M````4`!\7V"PM@(`4`%!%`!\'V!P\```(`"@M0(`````"`-ZX%<-!@`@`'P?
+M8-2P`@`````(```@")#P```@``!\'V#0L`(`````"`````@`@`!0`7K@5XT`
+M`"``G`0HL/```"```'P_8```(0``Q``(`?X?8`!\7V"PM@(``0%!%(!^!VC0
+M\```(```@$`4`)H&8!``K@D4`,X)!(#M"R"`#S@<$&X+!#X.$/#P```@```V
+M#A``.&YC&'Z.4Q`:#A`4'`X0``"@80`<QU$!A`8($/$``"``!GK@5PL>`"`"
+MA`8(`'S?8,3<`@`"`$,0`X0&"`,`0Q`P\0``(``$A`8(!`!#$`&$!@@!`$,0
+M`80&"`9^`%`#_C]@`%WC+U#Q```@``%^0$``#@$8`'P_8&S<`@``A$`0``B"
+M4``(HF``@>)7</$``"``BA(`(``((D``B"!``()F0`6$00@`>N%7C`P`(`6$
+M00B0\0``(``.>N%7"0L`(`6$00@&A"$(`?X@4`"$($`.^N!7"0@`(+#Q```@
+M``6$00@`BB)``(H@0`#\P$#$W`(`!01#$`:$(0@&`D,0T/$``"``!X8A"`<"
+M0Q`!_B)``(Z@&`%^(D``CH`8`?[?80`"`"#P\0``(`#_?P!```X`&`%^(D``
+MCH`8`('B5XOM_R<`>N=7`0,`(!#R```@`("J`R@`>N!7@0$`(("0`R@```!0
+M@```(`'^'V`0`*X),/(``"``%`#."02`[0L@@`\X&!!N"P0^#A``-@X0`#AN
+M8RA^CE-0\@``(``0&@X0%!P.$!@>#A`<(`X0("(.$"0D#A```"!B`)JF47#R
+M```@``#ZZ%<!%@`@`"1)4@`@"%("?BB``'P?8,S``@``@"``D/(``"```/K@
+M5P$/`"``B``(``(`0`Q^P$$`GN=1`!P'8`"B*&"P\@``(``&_E]@@$;C+P!Z
+MX%>"!P`@)@1'"`!\'V`HL`(`!GXG0-#R```@`(#5X2\F!$<(`'P?8*W<`@``
+M!$`0``1A8`!\'V!$KP(`\/(``"``-`:`$`'^7V*``@`@0'['00'^!T``#N`9
+M!_KG5POS_R<0\P``(``!?@A```X`&@)ZZ%<+[/\G`'KI5P%F`"``(`A2`GXH
+M@##S```@``!\'V#,P`(``(`@``#ZX%<!70`@`(@`"``"`$`,?L!!4/,``"``
+M`)[G42<$)PA`_@!@`'K@5P)7`"``'`=@@&W]+P!ZX%=P\P``(`""5``@)@1'
+M"`!\'V"MW`(```1@"``'X5>"40`@!GX'0)#S```@``!\/V`HL`(``(9!8(`I
+MXR\`>N!7`DX`(`!\/V!,M@(`L/,``"```(&@"0#ZYE>!2P`@`(`&"`"!`!``
+M?#]@D*X"``"```C0\P``(```@`80`)H`$`!\/V`TKP(``(``"`%^`$``@``0
+M`?X?8/#S```@``2`!A``"`<("("&$`((!P@*@(80!`@'"`R`AA`G!"<($/0`
+M`"``!(`&"``"`&@$@`80-`@'"!:`AA`L"`<($H"&$`!<_R\P]```(```>N!7
+M@@$`(`2`!@@0?@!H!(`&$"8$1P@`>N%7@00`(%#T```@`%:$1A`F!$<(-/X&
+M0`9^)T"`H^$O!(`&"`!\`&@``0``</0``"````$`(`2`!@@@?@!H!(`&$#D$
+M)P@`?!]@]*X"```(0`B0]```(````@%@`('@5P$"`"`$@`8("'X`:`2`!A"`
+M`@`@.`0'"+#T```@```$`&!H@(80.00G"`^"1A`$@`8(\'X`8`!ZX%>!`0`@
+MT/0``"```)H&8(#[_2^`)P`@`'P?8&S:`@``""`(:(@&"`"``&#P]```(```
+M$"`:`*((8`#;#RAN@(80`*((8(#$#RAL@(80:H"&$!#U```@``!\'V"(K@(`
+M````"`"!YE<"!@`@(`0`"`!ZX%>!!``@,/4``"``#H0F"#L$!P@`@>!7@0,`
+M(`'^'V``?#]@3+8"`"6!0!!0]0``(````0`@.P0'"`Z`1A`V"`<(&("&$"X(
+M!PA8@(80,`@'"'#U```@`%R`AA`R"`<(6H"&$#H$)PA>@H80````4*2`AA``
+M``!0D/4``"``HH"&$*"`AA`!_A]@L("&$*2(!@@```!`.@0G"`"`!D"P]0``
+M(`"F`H`0I(@&"`%^`$"D@(80.@0G"**(!@@``@!`HH"&$-#U```@```0`!BP
+MB"8(@,OB+Z"`AA``F@9@@/3H+P!ZX%>!`P`@\/4``"``7H@F"`!\7V#"W`(`
+M``@!"`"!X%>,```@``*!$`":!F`0]@``(``!_C]@``7J+T!^QT$!_@=```[@
+M&0?ZYU<+I?\G`7X(0##V```@```.`!H">NA7"Y[_)P!\/V`TKP(``(``"`!Z
+MX%<!`0`@4/8``"```)H&8(```"````!0$`"N"10`S@D8`.X)'``."B``+@IP
+M]@``(``D`$X*!(#M"R"`#S@H$&X+!#X.$``V#A``.&YC''Z.4Y#V```@`!`:
+M#A`4'`X0&!X.$```X&$`@L!A`'R_8="R`@`D@28(L/8``"``(/K@5XL!`"!R
+M_A]@J/X_0(!6&R@`1^$O`'R_8="R`@#0]@``(``@@48(`WYA@`#\(4#DOP(`
+M!)\`$`"=`!`D@28(`?X@0/#V```@`"2#!A`!?D%`!'Z!D1M^AHD`!"9`'_X@
+M8`"8(%`@@P80$/<``"```$#A+RC_!D``H@4H$`"N"10`S@D8`.X)!(#M"R"`
+M#S@P]P``(``<$&X+`'P?8(2]`@```2`(`'P?8'3:`@```@`0`(`/.%#W```@
+M``!\'V!TV@(````@"`!\'V"$O0(```,`$`"`#S@$/@X0</<``"```#8.$``X
+M;F,<?HY3$!H.$!0<#A`8'@X0`'P_8.BL`@"0]P``(```@``(`7K@5X']_R<"
+M_A]@`(``$(!W!RA]_C^8@"OB+[#W```@``!\/V#DR@(``(`@"`"`($``?']@
+M[,H"``R``0@`@>!7T/<``"``#@$`(````%`,@`$0`'Q_8.S*`@`0A`$(`'K@
+M5X$2`"#P]P``(```;@<H??X_F``BXB\`?#]@Y,H"``"`(`@``N!!`?[?81#X
+M```@``":IE$`F@9``!H`0`)^`(``?']@[,H"```&0$`:!"$(,/@``"```/K@
+M5P$%`"`<`"$(`(/G5PX#`"`4_B%``(``0`""(%!0^```(``,_E]@@&;B+X``
+M`"``',=1`?ZF00/ZYE<+]?\G`'KG5W#X```@``$"`"````!0`'Q_8.S*`@`0
+M@$$0````4`!\/V#HK`(`D/@``"```(``$!``K@D4`,X)&`#N"02`[0L@@`\X
+M'!!N"P0^#A"P^```(```-@X0`#AN8S!^CE,0&@X0%!P.$!@>#A`<(`X0````
+M4-#X```@`/2!#1#X@0T0`%$'*`!\/V",U@(`)(``$/#_34``?-]A\/@``"``
+MD*@"`!``!P@``&`(!``'"```(`@,``<(`('@5P4!`"`0^0``(```@`!0@```
+M(`"``5````$0`'S_863*`@`$@`<(`7X`0##Y```@`!2`QPD`'"=@`/KA+P"`
+M!P@`@>!7#@$`(``"QU&````@4/D``"````+`40!ZYU<"`0`@@`(0*(```"``
+M*1`H\(&M"0`;YU=P^0``(`"&```@`!RG80!\_V%DR@(`%(#'"02`!P@```=0
+M`('F5Y#Y```@`(X``"```*!A`/KF5P(!`"````!0`!P`(`+^'V#\@4T0L/D`
+M`"``_9M-$/3_34``?-]AD*@"`!0`!P@````(#``G"`3^((#0^0``(```@`!`
+M```!$`!\_V%DR@(`!(`'"`1^((`0@`<(``)`0/#Y```@`/2!+0@$_F:`_(&M
+M"/B!S0@"_A]@`?Z?8`#D"B@``"!@$/H``"```/K@5P$"`"!#_A]@``1!4(!'
+M$R@`#``@`'Q?8)2\`@`P^@``(``L``$(`'P@:``"```D``$(``(`%`2`!P@`
+M&@!`%(`G"%#Z```@``#7X2\$@@<0$``'"```X`D,?@="`-/@+PP`)P@`FB!`
+M</H``"```(/G5XT``"``GB!0``(($`#2X"\`RO\G$`"N"10`S@F0^@``(``8
+M`.X)'``."@2`[0L@@`\X,!!N"P0^#A``-@X0`#AN8[#Z```@`#!^CE,0&@X0
+M%!P.$!@>#A`<(`X0````4/2!#1#X@0T0T/H``"```!('*`!\/V",U@(`*(``
+M$/#_34``?-]AD*@"`#``!PCP^@``(````&`()``'"```(`@L``<(`('@5P4!
+M`"``@`!0@```(!#[```@``"``5````$0`'S_8=3;`@`,@`<(`7X`0!2`QPD`
+M'"=@,/L``"```+OA+P"`!P@`@>!7#@$`(``"QU&````@``+`40!ZYU=0^P``
+M(``"`0`@`,L/*(```""`\0\H\(&M"0`;YU>&```@`!RG87#[```@``!\_V'4
+MVP(`%(#'"0R`!P@```=0`('F5XX``"```*!AD/L``"```/KF5P```%`!'@`@
+M_(%-$/3_34``?-]AD*@"`#0`!PBP^P``(``````(+``G"`3^((``@`!````!
+M$`!\_V'4VP(`#(`'"-#[```@``1^((`0@`<(``)`0/Z;31#T@2T(!/YF@/R!
+MK0CX@<T(\/L``"```OX?8`'^GV``I@HH```@8`#ZX%<"#P`@`'Q?8)2\`@`0
+M_```(``L``$(`'P@:``"```D``$(``(`%`B`!P@`&@!`"(`'$##\```@``R`
+M!P@`&@!`%(`G"("9X2\,@@<0,``'"```X`DL?@="4/P``"``@)7@+RP`)P@`
+MFB!``(/G5XT``"``GB!0``(($("4X"]P_```(```8Q`H```@8`#ZX%<!RO\G
+M//X?8``$05"`^A(H$`"N"9#\```@`!0`S@D8`.X)'``."@2`[0L@@`\X,!!N
+M"P0^#A``-@X0L/P``"```#AN8TQ^CE,0&@X0%!P.$!@>#A`<(`X0("(.$"0D
+M#A#0_```(``H)@X0+"@.$#`J#A`T+`X0."X.$#PP#A!`,@X0`'Q?8/#\```@
+M`-3;`@`(``$(`'K@5P%Y`"``?#]@++4"``"```@`>N!7$/T``"``@78`(`":
+MIE$`?%]@U-L"``0``0@$?@"`$`!!"```04(P_0``(``(!$D(!GX!8``"`!@`
+M>N!7`0(`(`)ZX%<!`0`@`7K@5U#]```@`()I`"``)"E@`?ZF002`0`@`?']@
+M<+P"``"%`1`(A``(</T``"```7X`8`!ZX%>!"0`@$/X@0`!\7V#4VP(`$`!!
+M"`!_`5"0_0``(```@>!7@@``(``$(6`$@$`(`'Q_8'"\`@``@0$(``0`0+#]
+M```@``"!`1`!_J9!"(0`"`%^`&``>N!7@O;_)P!\?V!PO`(`T/T``"```('!
+M"0`<!V``D^0O````8@@$20@"?B%@`/K@5P`0*!CP_0``(``!`0`@`OX?8``!
+M`"`!_B!``/[_)P`$05``M_<O````8Q#^```@``!ZZ%<!5@`@`'KL5P%5`"`$
+M`.D)`)XG8_;^OT(``,D*,/X``"```#!L8A3^"4`0@`D0"`1)"`-^(9`!_H!B
+M`GXA8`#ZX%=0_@``(``!`@`@!?X_8/R#31```,!A@`,`("J@B1`HG(D0`?X?
+M8'#^```@`/R!31`,@`D(%'[`00``8&(!_O]B"`1)"`%^`6``>N!7D/X``"``
+M`@$`(`#Z[%>!-P`@`'Q?8-3;`@`(``$(`'K@5P$U`""P_@``(```G^I7#@$`
+M(`">)V*````@`*HJ8@"0*!@"B`D(``(`0-#^```@``*`B1`4_A]@`(")$`@$
+M20@#?B&0`?X`8``H@&H!?@%@\/X``"```'K@5X(!`"`,@`D(`'K@5P$"`"`(
+M!$D(`GXA8`#ZX%<0_P``(`"!`P`@`?Z?8/^;31#^J4T0^+$-$``L*V``KNM2
+M``(`(##_```@```(@E``+"M@````4/B!#1#\@:T(^('-"`+^'V``'$=@4/\`
+M`"```*)H8(`Z"B@``"!@`/K@5P$"`"`^_A]@``1!4`">$BAP_P``(```*P`@
+M`'Q?8)2\`@`L``$(`'P@:``"```D``$(``(`%)#_```@``"BYU$`HJI2`/KJ
+M5P$!`"``G,A!@`,`(/]_"$(,@`D(L/\``"```'K@5X$!`"```&!B%/[)0?;^
+MOT(`^N=7@@H`(`!\7V#0_P``(`#4VP(`!``!"`%^`$`$``$0$'K@5P(!`"``
+M``!0!``!$/#_```@``!\7V#4VP(`"``!"/]_`$`(``$0!``!"`1^`(`0`$$(
+M$``!`"````!!0@``P0($`.D)@```(``BRT(`^NM7@04`(`@$20@P``$`(``!
+M?@%@`'K@5P(!`"``^NQ7@0(`(`!\7V#4VP(`"``!"%```0`@``!ZX%<"R_\G
+M`'P_8"RU`@``@``(_W\`0`"``!``?!]B<``!`"``D*@"`#``"`@``,`)*'[H
+M08`/X"\H`"@(`)H@0``#YU>0``$`(`"-```@`)P@4`""!Q"`#N`O`'Q?8-3;
+M`@`(``$(`'K@5[```0`@`($"`"``?#]@++4"``"```@`>N!7@HG_)P```%`0
+M`*X)T``!`"``%`#."1@`[@D<``X*(``N"B0`3@HH`&X*+`"."C``K@KP``$`
+M(``T`,X*.`#N"CP`#@M``"X+!(#M"R"`#SA,$&X+!#X.$!`!`0`@```V#A``
+M.&YC$'Z.4P!\'V"GV@(```0`"`QZX%>"!@`@,`$!`"```'P_8%"Y`@`YA0`(
+M`'K@5P($`"`ZA0`(`'K@5X("`"!0`0$`(``$_A]@`+[T+P"^]"\!_A]@@```
+M(````%`$@.T+((`/.'`!`0`@`!`0;@L$/@X0`#8.$``X;F,8?HY3$!H.$!0<
+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
+M3@HH`&X*+`"."@2`[0LP$&X+((`/.`1^CD,`@`\XD`<!`"``!'Z.4P0^#A``
+M-@X0`#AN8RA^CE,0&@X0%!P.$!@>#A"P!P$`(``<(`X0("(.$"0D#A`0@HT0
+M``#`80`$(6(`A@%B$/Y-0-`'`0`@``/^`&``>N!7`04`(``((0@```!0``*'
+M00``1A`!_@!`\`<!`"```!`@&```@1`#_@!@`'K@5P+[_R<0B*T)`'Q?8M2\
+M`@`0"`$`(```?/]AE,`"`(`<WR\4@"<(/_K@5P4#`"``'=\O+?X?8#`(`0`@
+M``3^/V``!$%0@(01*(`.`"`,@"<(!/Z@@"@`B0@`"D)`4`@!`"``-``I"`":
+M8&@`G,%X"``A"`",('@,`@$0!!P!$``*HD!P"`$`(```A@(0#(`G"`/^0(`L
+M`"D(`(1@0`"$0$``(@$0!*`!$)`(`0`@`!2`)P@!_B!`%(('$`R`)P@!_B!`
+M/_X@8`R"!Q"`#-\OL`@!`"``````4`!ZX%<"!``@`'Q?8)2\`@`<``$(`'P@
+M:``"``#0"`$`(``4``$(``(`%(`!`"!0_A]@GOX_8``2&2@0`*X)%`#."?`(
+M`0`@`!@`[@D<``X*(``N"B0`3@H$@.T+*!!N"R"`#S@$?HY#$`D!`"```OX_
+M8`!\'V#\U@(```)`$`G^/V``?!]@_M8"```"@!`P"0$`(``,_C]@`'P?8`#7
+M`@```D`0`(`/.`0^#A``-@X0`#AN8U`)`0`@`!A^CE,0&@X0%!P.$`!\'V#@
+MR`(```@`"`1ZX%>!-P`@<`D!`"```(`'*`!\7V`\MP(`$`$A"``#X%>.-``@
+M`'P@0`!]``"0"0$`(``0`P$0``/@5PX!`"````!0$`$!$`!\'V"<K0(````@
+M"+`)`0`@``!\'V`$K0(`````"``"0$``?!]@M*T"````(`@`?!]@T`D!`"``
+M:+`"``````@`@`!0``0@0`!\'V`<K0(`````"``"H$'P"0$`(```?%]@/+<"
+M`!0!`0@`@$90`!`!&`!\/V!NV@(``(2`$!`*`0`@``!ZX%>!&``@`'W@5RL!
+M``",`0`@`'P?8"L!````@(`0,`H!`"```'P_8&[:`@``B``(```?4$H!```>
+M_C]@@#W@+P``P&%0"@$`(``"?@>``!P`0````$``'`!``GX`@``<`$`&?L"!
+M`'Q?8'`*`0`@`#RW`@`8`0$(``'G5X$)`"``?!]@X,@"```(``@#>N!7D`H!
+M`"```?X?8(("`"``'"=@`'Q?8$`+````AF%0``(`(`!\/V"P"@$`(`!`"P``
+M`!Q'8`'^?V``_/@O`'Q?8#RW`@`8'0$0`'Q?8-`*`0`@`#RW`@`4&P$0``H`
+M(`!\'V#@R`(```@`"`-ZX%<!_A]@\`H!`"``@@(`(`!\/V``?0````1!4`'^
+M?V```@`@`((@4`!\7V`0"P$`(```?0```(9A4(#P^"\```!0`'Q?8#RW`@`8
+M`0$0$`"N"3`+`0`@`!0`S@D$@.T+((`/.!@0;@L$/@X0`#8.$``X;F,T?HY3
+M4`L!`"``$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0*"8.$```X&%P"P$`(```
+M@B!B`(;!8?B%#1``FJ91`!J'$`"B"&`!_C]@`$<(*)`+`0`@``+^'V#\@0T0
+M`/P(0@`"``#%!0@(_8%-$,0%"`C_@4T0L`L!`"``B(@("`!ZX%>"!@`@^H4-
+M"/Z!31#`?PA`_(%M""#^/V#0"P$`(```!$%0`)Z'8(`X_R]=A`@("'X`:%V`
+M2!``F@9@@#<`(/`+`0`@`$Z(Z`@`$`11D(0("`"!XU>!`P`@`7X$0``0`!D#
+M?@2`$`P!`"```(`(0)`$``@`@>-7@OS_)P"B"&``$"1@`#4`*`".`T`P#`$`
+M(```#@!``!``0``.(!@`_`A"``(``.D%"`@``@!0``X@&%`,`0`@`$"$"`@`
+M>N!7`0$`(`".`%``#B`8^H4-"``"`%``#*`9<`P!`"```?X`0``.(!C^@4T0
+MB(@("`"!XU<""``@__\F0`",H!F0#`$`(```_`A"``(``.$%"`C[?P!@``X`
+M&`A^`&CA`4@0P'\(0+`,`0`@`/R!;0@@_C]@`)I&8`">AV"`&_\O`!P`(`#Z
+MXU<!`P`@T`P!`"``$/Y?8@'^`$#^@4T0__\F0`",H!F``0`@>H@("`1^`%#P
+M#`$`(```$$`:7(0("`#\"$(``@``Y`%($%V$"`@(?@!HY0%($!`-`0`@`%Z(
+M"`CF`8@0`*9I4D"$"`@`>N!7@0,`(`'^?V)8_@A`,`T!`"``!/X_8`":1F``
+MAF%0``B"4(`+_R\`_`A"``(``.1_"$!0#0$`(```FFE"`(Q)&`3^/V``AF%0
+M``B"4``'_R]@_@A``?XI0'`-`0`@``",0!@`)"E@`(9A4``(@E"``_\OP'\(
+M0`'^)E``C$`8D`T!`"``_(%M""#^/V``GH=@``#_+___)D``C*`9`!J'$!``
+MK@FP#0$`(``4`,X)&`#N"1P`#@H@`"X*)`!."B@`;@H$@.T+((`/.-`-`0`@
+M`#00;@L#_D"```2`0)`$8@@`?*!```(``,6%0@@`!F%`\`T!`"``3@A`"``.
+M01@`A,%0D`1B"`"&04``!D%``GY!@`"$0D`0#@$`(``U#4$0`?X@0`"0(!@#
+M_D"```2`0(D$0@B`?D%@`'KA5S`.`0`@``'T_R<`@`\X!#X.$``V#A``.&YC
+M%'Z.4Q`:#A``?+]A4`X!`"``_*X"``"`!A"`5O\O`(`&"`%ZX%<"`0`@EOX_
+M0``#`"!P#@$`(``">N!7@@$`(`!\/V!8`@``@```(`""(%``?!]@.*\"`)`.
+M`0`@```"`!`0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A``.&YCL`X!`"``$'Z.
+M4P!\'V#$W`(`!7Y`0`!\'V!LW`(```2@"`#ZXE?0#@$`(`"!#P`@``1A"`"&
+M(6`!!`$(`7X`4``&`$``@>!7B0D`(/`.`0`@``#ZX%>,!``@#OK@5XD#`"`!
+M_@!0``X`&`)^@(`"!F$($`\!`"```'P"0`S=`@``!@`0`?X`0``.(!@!!`$(
+M`7X`4``$80@P#P$`(```!@!``('@5XSV_R?__P)```Z@&`-^04``^N)7@O#_
+M)U`/`0`@``!\'V`,W0(`@`/M+P2`[0L@@`\X$!!N"P0^#A``-@X0<`\!`"``
+M`#AN8Q1^CE,0&@X0`(JB4`!\'V#$W`(`!7[`0`!\'V"0#P$`(`!LW`(```3@
+M"`":IE$`?%]@$*\"```:`1``^N-7`14`(+`/`0`@```$(P@`@@!A`00#"`%^
+M`%```@!```'D5PD/`"``>N17T`\!`"``#`H`(`YZY%<)"0`@`!`$8`#6""@`
+M?#]@^-P"``"`(`CP#P$`(```@"!@`/K@5P$%`"``_")`_-P"``"00!`!_B)`
+M`(Z@&!`0`0`@``!\7V`0KP(````A"`"``&@```$0`7X$0``.`!D!!`,(,!`!
+M`"```7X`4``$(P@``@!```'D5PSQ_R?__P-```[@&`-^PT!0$`$`(```^N-7
+M`NO_)P":IE$`_")`_-P"``":0!``^N)7`0$`('`0`0`@``'^'V```0`@@%7X
+M+P":!F`0`*X)!(#M"R"`#S@4$&X+D!`!`"``!#X.$``V#A``.&YC+'Z.4Q`:
+M#A`4'`X0&!X.$!P@#A"P$`$`(``@(@X0````8@""P&$0`.@)`'R_8=C``@``
+MA"8(`/K@5]`0`0`@`((%`"``?%]@W,`"`````0@`>N!7`9$`(`'^/V``@D80
+M\!`!`"``#'X`0`!\/V),M@(```P`(`!\/V),M@(`,($("$!^`$`0$0$`(``P
+M@0@0`?X`0``.(!@`@$80!_K@5XP'`"````!0@#[R+S`1`0`@``!\7V#<P`(`
+M```!$`!ZX%<"`@`@-(4("`%^`$`T@4@04!$!`"``@(,`(`'^/V``@D80#'X`
+M0#"!"!``?%]@W,`"`````0AP$0$`(``$`$`(`7XA0`0"`!``!$%0`'P_8DRV
+M`@`P@0@(-@2`$)`1`0`@`#R`9P@0B"$(``*`$!*((0@"`H`0%(@A"`0"@!`C
+MA"<(L!$!`"``.@)`$"X$@!`G!$`0`'KG5P$!`"`"_C]@)P)`$`P`J`G0$0$`
+M(```B"8(`)I`0`@$(0@)!($)"'Z&@0"8(&@`?#]B3+8"`/`1`0`@`#"!"`@T
+M`H`0"@0A"`L$@0D(?H:!`)@@:"P"@!`,?@%`$!(!`"``^($-$`P$`0@`>N!7
+M@@T`(``(@E`-!"$(``/B5XH&`"`P$@$`(`#X@<T)``A'0`($(0@`?#]B3+8"
+M`#"!"`@`"`!`!@)`$%`2`0`@``%^`D``#H`8`00G"``#XE>+^?\G^('-"0$$
+M)P@`?#]B<!(!`"``3+8"`#"!"`@F`D`0`00G"`+^`$``'`!`^($-$/B!S0F0
+M$@$`(```!`<(`7K@5X(7`"``#,-0`(JB4``(@E`!!`<(``'B5[`2`0`@`(H/
+M`"``@B!0^('-"0`(1T`"!`$(?WY@8`#\`$`XOP(`T!(!`"````4`"`"!X5>"
+M!0`@`8(?@``.(!@`C`!H``[`&`($`0CP$@$`(`"`?@!@`'K@5X$#`"``B@!H
+M``Z@&``"`"`!_@!```X@&!`3`0`@``3ZX%<+]/\G`7X"0``.@!CX@<T)`00'
+M"``!XE>+\/\G,!,!`"```'P_8DRV`@`P@0@(.0I`$#@,0!#X@<T)`00'"`)^
+M`$!0$P$`(```'`!`^($-$/B!S0D`!`<(`GK@5P("`"`!!`<(`GX`0'`3`0`@
+M```<`$#X@0T0^('-"0`$!P@#>N!7@@(`(`($)P@`?#]BD!,!`"``3+8"`#"!
+M"`@[`D`0`(@F"`*(!@@``@!``!J@00`$05"P$P$`(```?#]B3+8"`#"!"`@\
+M!$`0^('-"0"=YE>.-``@@"H`(-`3`0`@``($!PC^@4T0`P0'"/^!31#^B2T(
+M`'P_8DRV`@`P@0@(\!,!`"``-@*`$(`K`"``'`=@`.?A+P!ZX%>!"0`@`!P'
+M8`!CWR\0%`$`(```>N!7@@8`(`'^/V``?!]@P-P"```"0!``!$%0`'P?8#`4
+M`0`@`,'<`@``!$`0`'P_8DRV`@`P@0@(/`)`$``A`"``XO@O4!0!`"```"``
+M(`!\OV'8P`(``(0F"/__`$``#B`8`(!&$`!\7V!P%`$`(`#<P`(````!"`0`
+M0`C_?T%`!`0`$`#ZX%>!`@`@`'P_8I`4`0`@`$RV`@`P@0@(P'\`0#"!"!``
+M?#]B3+8"`#"!"`@G!"`(L!0!`"``0/X@:"<"0!"`%@`@!00'"/Z!31`&!`<(
+M_X%-$/Z)+0C0%`$`(```?#]B3+8"`#"!"`@N`H`0!P0G"`@$APD(?H:!`)@@
+M:/`4`0`@`#`"@!`)!"<("@2'"0A^AH$`F"!H,@*`$``)`"`$`"<($!4!`"``
+M`'P_8DRV`@`P@0@(*`(`$``&`"#X@<T)``0'"`=ZX%<P%0$`(`"!V/\GB0$`
+M(`9ZX%<!TO\G``(`(*UZX%<![O\GKWK@5U`5`0`@``'W_R?X@<T)`00'"`)^
+M`$``'`!`^($-$`"!YE>-]O\G<!4!`"``$`"N"10`S@D8`.X)'``."B``+@H$
+M@.T+((`/."P0;@N0%0$`(``$/@X0`#8.$``X;F,L?HY3$!H.$!0<#A````!0
+M_($-$+`5`0`@``#X!2@``,!A`'R_802W`@`<@08(```'4`!]X%>`#```T!4!
+M`"``#A0`(`!7Z2\<G080`'P_8%B_`@``@0`([($-$`2)``CP%0$`(`#P@8T0
+M#($&"`%^`%`&>N!7#0P`(``&`"``6>4O$($F"!`6`0`@``"`($``?!]@[,H"
+M``P"`!``"``@[/\-0("%Y"^`!@`@,!8!`"```"?\+X`%`"`"?H"!`'R&`4@6
+M`0````8X@D4``(E%``!0%@$`(`",10``F44``)E%``"910``F44``````%``
+M?+]A!+<"`'`6`0`@``R!!A#\_RU``'P?8)2\`@`X```(````"`"``!#X_TU`
+MD!8!`"``]/\M0`!\'V"4P`(`+```"````1`__A]@`(``$``$05"P%@$`(```
+M?+]A!+<"`""!!@C\@2T(`('@5P(-`"`D@68(!(``"-`6`0`@``"!X5<""P`@
+M*(%F"`B```@`@>%7`@D`(`R```@`?`!@\!8!`"``_S\```!ZX%>!!@`@`(``
+M"`!\`&````"0`'W@5P```)`0%P$`(`""`P`@^($M"`#ZX%<!`@`@+($&"`"!
+MX%>%```@`?Y?8#`7`0`@``!ZX5>!#@`@`'R_802W`@``@08(`7X`0`"!!A`!
+M_A]@4!<!`"``!($&$````%`(@080`'P?8*"U`@`````(!7K@5X8%`"!P%P$`
+M(`"`U1`H`'R_802W`@`(@08(`7X`0`B!!A``?!]@H+4"`)`7`0`@``````@%
+M>N!7A?K_)P```%``?+]A!+<"``2!!A#\@2T(L!<!`"```'R_802W`@`@@P80
+M!(``""2!!A`(@``(*($&$/B!+0C0%P$`(``L@P80````4!``K@D4`,X)!(#M
+M"R"`#S@L$&X+!#X.$/`7`0`@```V#A``.&YC$'Z.4___/V"`6P$H!(#M"R"`
+M#S@0$&X+$!@!`"``````4'0`#1!X``T0`(`/.````%!\``T0@``-$`"`#S@P
+M&`$`(``$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A```*!A>(#&"5`8`0`@``"@
+M'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(<!@!`"````$`2`1^(&``
+M@*`?____?W2`)@@`^N!7@1P`(`!ZYU>0&`$`(`"!&P`@```G"`#]X%=.1%9$
+M@AD`(``$05!TA`80?(`F"+`8`0`@``"#YE<"`0`@$`0'$(`"`"`0`@<0@(!&
+M"("$`!!\@"8(T!@!`"``?`(!$!0`)PC__R!`%`('$#R`)@@'^N!7`@8`(`?^
+M/V#P&`$`(`"0@@80*``M"`'^($`H`@T0``"@'P":!F``2P(H`'K@5Q`9`0`@
+M`($!`""`/-XO@```(```H!]P@`8(`'K@5X$!`"!8_@9`,!D!`"```'`#*``!
+M`"``!$%06(0&$`"@'P@``0!(``$`2``!`$A0&0$`(````0!(``$`2``!`$@`
+M`0!(``$`2`1^(&``@*`?____?W`9`0`@````H!\0`*X)%`#."02`[0L@@`\X
+M&!!N"P0^#A``-@X0D!D!`"```#AN8Q1^CE,0&@X0``"@802"!A````!0"(`&
+M$!"`!A"P&0$`(``4@`80#(`&$`"@'P@``0!(``$`2``!`$@``0!(``$`2-`9
+M`0`@```!`$@``0!(``$`2`1^(&``@*`?____?P!\/V!.1%9$\!D!`"```((&
+M$&P`+0@`^N!7`0,`(!R`0`@<F@`0&!H!$!R$!A`0&@$`(``8@@80@`$`(&P:
+M#1`8F@80')H&$'``+0@!_B!`<`(-$#`:`0`@````H!\```!0$`"N"02`[0L@
+M@`\X%!!N"P0^#A``-@X04!H!`"```#AN8RA^CE,0&@X0%!P.$!@>#A`<(`X0
+M("(.$"0D#A!P&@$`(````.!A`((`8@`$(6(`AD%B``C"80"@'P@``0!(``$`
+M2)`:`0`@```!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?L!H!`"``
+M____?P+^*&``^N!7"(!'"``@(6"!`0`@``/H5X("`"#0&@$`(````0`@`/K@
+M5P$!`"``FJ91@```(`?^OV$`^N97`@0`(/`:`0`@``B`1P@`!`D0`?XH8`#Z
+MX%>!&``@`"`A<`B"!Q``%P`@$!L!`"```'KG5X$5`"`,`*T)`'P_8`Q&``!T
+M@@80A*`&$(RB!A`P&P$`(`"(I`80>)X&$!"`)P@`^N!7@00`('R"!A"`@"`(
+M@((&$%`;`0`@`!"`)PB`@"`(?)H`$!"`)PB`F@`0@`$`(!":!Q!\F@80<!L!
+M`"``@)H&$!2`)P@!_B!`%(('$`?^/V`\@@80`?X_8$2"!A"0&P$`(``H`"T(
+M`?X@0"@"#1!8G`80``"@'_][YU<!`0`@6/X&0+`;`0`@```"`R@`F@9@@%<"
+M*)"`!@B``0`@!_Z_80``H!\`F@9@T!L!`"``$`"N"10`S@D8`.X)'``."B``
+M+@HD`$X*!(#M"R"`#SCP&P$`(``H$&X+````4&P`#1!P``T0`(`/.`0^#A``
+M-@X0`#AN8Q`<`0`@`#1^CE,0&@X0%!P.$!@>#A`<(`X0("(.$"0D#A`H)@X0
+M,!P!`"``+"@.$#`J#A```"!B`(*@80`$P6$`H!\(``$`2``!`$A0'`$`(```
+M`0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'W`<`0`@`/___W\"?B=@
+M`/K@5PB`*`B!`0`@`)H@8`B""!``'0`@D!P!`"```)H@:`B""!`0@*@)`/KF
+M5Q2`2`@!9@`@`7KA5P":QF&P'`$`(`""&0`@C`!'"`)^06``>N%7A`!'"``"
+M(6"!`0`@``/A5]`<`0`@`(("`"```0`@`/K@5P$!`"``@B!0@```(`?^/V``
+M^N!7\!P!`"``@A``(`B`*`B(`$<(``(!$(P`1P@!?D%@`'KA5X$!`"`0'0$`
+M(`"$`$<(`(0@<`B""!``JJI2$*H($!2J"!!T*@<0*``M"#`=`0`@``'^($`H
+M`@T0``"@'W``!P@`>N!7@0$`(%A^!T"`[`(H4!T!`"``@```(%@J!Q``JJI2
+MD"H'$``<!V"`OP$H`'K@5P%0`"!P'0$`(```L=TO`$\`(```H!\`3@`@`*JJ
+M4A"J"!``)$E2`"`(4I`=`0`@`!2`:`H(@(@**``M"`'^($`H`@T0``"@'P"@
+M'P@``0!(L!T!`"````$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&#0
+M'0$`(```@*`?____?PR`*`@`^N!7`00`(`"JJE(,J@@0`)K&8?`=`0`@`!2`
+M:`H(@"@(`*B`:@!ZYU<!'0`@C`!G"`+^(6``^N!7$!X!`"``A`!'"``H(6"!
+M`0`@``/A5X("`"```0`@`/K@5P$!`"`P'@$`(```@B!0@```(`?^/V!\`.<)
+M`/K@5X(2`""(`$<(`"@!$%`>`0`@``'^(6``^N!7`0(`(`B`*`B$`$<(`(0@
+M<`B""!!\`"<(<!X!`"````/G5P(!`"``FJ91``0`(``;YU>"```@`(*@88``
+M1PB0'@$`(`!\`"<(@(0`$'P`)PA\`@$0%(!("/]_(4`4@@@0`*JJ4K`>`0`@
+M`'0J!Q"0*@<0`'KI5P("`"``'$=B`!P'8GPJ!Q"``0`@T!X!`"``?!P($'PJ
+M!Q``'`=B`)['8?__:4(`^NE7`M?_)Q":"!#P'@$`(````*`?`"3)80!ZYU<!
+M#P`@?`#G"7``!P@`>N!7@0$`(!`?`0`@`%A^!T"`LP(H``$`(`"JJE)8*@<0
+M`*`?"``!`$@``0!(,!\!`"````$`2``!`$@``0!(``$`2``!`$@``0!(!'X@
+M8`"`H!]0'P$`(`#___]_*``M"`'^($`H`@T0``"@'P`<!V``?P$H`)['87`?
+M`0`@``!ZYU<"\?\G`*`?"``!`$@``0!(``$`2``!`$@``0!(D!\!`"````$`
+M2``!`$@``0!(!'X@8`"`H!____]_*``M"/__($"P'P$`(``H`@T0``"@'PP`
+M+0@0``T(`('@5P$%`"````T(`'K@5]`?`0`@`((#`"``L_\G`'KA5P&S_R<,
+M@"@(`?X@0`R""!``L?\G\!\!`"``````4!``K@D4`,X)&`#N"1P`#@H@`"X*
+M)`!."B@`;@H0(`$`(``L`(X*,`"N"@2`[0L@@`\X-!!N"P0^#A``-@X0`#AN
+M8S`@`0`@`!!^CE.`V@`H@*<"*(![`"@`#P`H@'7_+X#X_B\`^OXO4"`!`"``
+M!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC$'Z.4P``#0AP(`$`(```?>!7\?#P
+M\($"`"``?!]@\/#P\```#1``-MPO@/+_+Y`@`0`@``!\'V#P\/#P```-$`0`
+M#0@`<QXH````4```#1``5]POL"`!`"``!(#M"R"`#S@0$&X+````4&0`#1!H
+M``T0`(`/.`0^#A#0(`$`(```-@X0`#AN8QA^CE,0&@X0%!P.$```H&%X@,8)
+M`*`?"/`@`0`@```!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!($"$!
+M`"``!'X@8`"`H!____]_=(`F"`#ZX%>!'``@`'KG5X$;`"`P(0$`(````"<(
+M`/W@5T%-15."&0`@``1!4'2$!A!\@"8(`(/F5U`A`0`@``(!`"`,!`<0@`(`
+M(`P"!Q"`@$8(@(0`$'R`)@A\`@$0<"$!`"``$``G"/__($`0`@<0/(`F"`;Z
+MX%<"!@`@#?X_8)""!A"0(0$`(``H`"T(`?X@0"@"#1```*`?`)H&8(`W`2@`
+M>N!7@0$`(+`A`0`@```IW2^````@``"@'W"`!@@`>N!7@0$`(%C^!D"`7`(H
+MT"$!`"````$`(``$05!8A`80`*`?"``!`$@``0!(``$`2``!`$CP(0$`(```
+M`0!(``$`2``!`$@``0!(!'X@8`"`H!____]_``"@'Q`B`0`@`!``K@D4`,X)
+M!(#M"R"`#S@8$&X+!#X.$``V#A``.&YC,"(!`"``%'Z.4Q`:#A```*!A!((&
+M$`B$!A````!0#(`&$!"`!A!0(@$`(```H!\(``$`2``!`$@``0!(``$`2``!
+M`$@``0!(``$`2'`B`0`@```!`$@$?B!@`("@'____W\`?#]@04U%4P""!A!<
+M`"T(D"(!`"```/K@5P$#`"`8@$`(&)H`$!0:`1`8A`80%((&$(`!`""P(@$`
+M(`!<&@T0%)H&$!B:!A!@`"T(`?X@0&`"#1```*`?````4-`B`0`@`!``K@D$
+M@.T+((`/.!00;@L$/@X0`#8.$``X;F,<?HY3\"(!`"``$!H.$!0<#A`8'@X0
+M``#@80""P&$`H!\(``$`2``!`$@0(P$`(````0!(``$`2``!`$@``0!(``$`
+M2``!`$@$?B!@`("@'S`C`0`@`/___W\(@"<(`/K@5P$"`"#__R!`"(('$`":
+MIE&`%0`@4",!`"```'KG5P$4`"`,`*T)`'P_8#-(``!T@@80>)X&$`R`)PAP
+M(P$`(```^N!7@00`('R"!A"`@"`(@((&$`R`)PB`@"`(?)H`$)`C`0`@``R`
+M)PB`F@`0@`$`(`R:!Q!\F@80@)H&$!"`)P@!_B!`L",!`"``$(('$`;^/V`\
+M@@80`?X_8$2"!A`H`"T(`?X@0"@"#1#0(P$`(`!8G`80``"@'_][YU<!`0`@
+M6/X&0(#[`2@`F@9@`%$!*/`C`0`@`)"`!@B``0`@#?Z_80``H!\`F@9@$`"N
+M"10`S@D8`.X)$"0!`"``!(#M"R"`#S@<$&X+````4%P`#1!@``T0`(`/.`0^
+M#A`P)`$`(```-@X0`#AN8QQ^CE,0&@X0%!P.$!@>#A```,!A`*`?"%`D`0`@
+M```!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(<"0!`"``!'X@8`"`
+MH!____]_#`"G"0#ZYE>!$0`@?(`F"`"#YE>0)`$`(`""`0`@`)[G40P>!Q"`
+M`@`@#`('$("`1@B`A``0?(`F"+`D`0`@`'P"`1`0`"<(__\@0!`"!Q``GN=1
+M=)X&$"@`+0@!_B!`T"0!`"``*`(-$```H!]P@`8(`'K@5X$!`"!8_@9``/D!
+M*(```"#P)`$`(`!8G@80`)[G49">!A``F@9@`,P`*`!ZX%<!`P`@@+W<+Q`E
+M`0`@```"`"`(`"<(`?X@0`@"!Q```*`?````4!``K@D4`,X),"4!`"``&`#N
+M"02`[0L@@`\X'!!N"P0^#A``-@X0`#AN8QA^CE-0)0$`(``0&@X0%!P.$!"`
+M#0D4@,T)``"@832"!A!0A`805(8&$'`E`0`@``""(%`(@@80#(@&$!2*!A`!
+M_@)0``@`0!"`!A`??D-@D"4!`"``.(0&$!_^`V!(@`80&)`&$!R0!A`$@@80
+M`_X?8#R`!A"P)0$`(`!`@@801((&$`!\'V"E3```8(`&$&2:!A!P@@807((&
+M$-`E`0`@`'2"!A!X@@80?((&$(""!A`!A!^`3(`&$"B"!A`L@@80\"4!`"``
+M,((&$`!\/V!`2P```)H&8("#W"\`H!\(``$`2``!`$@0)@$`(````0!(``$`
+M2``!`$@``0!(``$`2``!`$@$?B!@`("@'S`F`0`@`/___W\`?#]@1%)(5`""
+M!A`4`"T(`/K@5P$#`""8@$`(4"8!`"``F)H`$)0:`1"8A`80E((&$(`!`"`4
+M&@T0E)H&$)B:!A!P)@$`(``8`"T(`?X@0!@"#1`H`"T(`?X@0"@"#1```*`?
+M`'KG5Y`F`0`@``$#`"``F@9@`)D`*`!ZX%<!"0`@@(K<+P`(`"``H!\(L"8!
+M`"````$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$C0)@$`(``$?B!@
+M`("@'____W\H`"T(__\@0"@"#1```*`?````4/`F`0`@`!``K@D4`,X)!(#M
+M"R"`#S@8$&X+#``-"`"`#S@`@B!0$"<!`"``#`(-$!`"#1`<`@T0(`(-$"#^
+M'V`D``T0`'P?8.+(`@`P)P$`(````D`0`7Z`0`'^?V``A@%@``1!4`%^(&``
+M^N!7`@,`(%`G`0`@```$`!@!?B%``(Y`&`%^(&``^N!7`?W_)P`$0A`!?H)`
+M<"<!`"```?YA0`#]X5<``0``A??_)P!\'V#DR0(``(9A4`""(%"0)P$`(```
+M`@`0!'X`0`'^84`@^N%7!?W_)Q0"#1`8`@T0*`(-$+`G`0`@``"`#S@$/@X0
+M`#8.$``X;F,<?HY3$!H.$!0<#A`8'@X0T"<!`"````#@80""H&$`!,%A`*`?
+M"``!`$@``0!(``$`2``!`$CP)P$`(````0!(``$`2``!`$@``0!(!'X@8`"`
+MH!____]_.(`G"!`H`0`@``"#YE<-&``@`(/F5P(%`"`"_D"``'P_8.3)`@``
+M`B$`,"@!`"```(/G5P("`"`@`$T(3(`G"``"(7`@`@T02(`G"``"!Q!0*`$`
+M(`!(F@<0$``M"`"#YU<"#@`@)`!-"#B`)P@`A>!7#@P`('`H`0`@``"%YE<.
+M"P`@`GY!@`!\/V#DR0(```(A`!`"#1```*`?D"@!`"``*``-"`!ZX%>"```@
+M@$O<+P"@'P@``0!(``$`2``!`$BP*`$`(````0!(``$`2``!`$@``0!(``$`
+M2`1^(&``@*`?____?]`H`0`@``":IE&````@&/Z_80``H!\`F@9@$`"N"10`
+MS@D8`.X)\"@!`"``!(#M"R"`#S@<$&X+!#X.$``V#A``.&YC''Z.4Q`:#A`0
+M*0$`(``4'`X0&!X.$```P&$`@J!A``3A82#ZYE<%`0`@#_X?8#`I`0`@``!#
+M`"``H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(4"D!`"````$`2``!`$@$
+M?B!@`("@'____W\X`"<(`(('$#P`1PAP*0$`(```>N%7`0,`(#@:!Q!(&@<0
+M`9I?@$P$!Q```*`?`#<`()`I`0`@`"``1P@`!>=7`OY@@($)`"``?)]@Y,D"
+M``"((0```^=7L"D!`"```@,`(`"(@4``!`(0(`!-"$P`)P@``D%P(`0-$"0`
+M)PC0*0$`(``@`$<()`(!$"``1P@@A``0`9I?@$P$!Q``'``@`((@4/`I`0`@
+M``#\@4#DR0(```("$!P`30A,`"<(_X-_<``&(6`<`@T0$"H!`"``(`!-"``&
+M06`@!`T0`9I?@$P$!Q``CD`8`'KA5P$"`"`P*@$`(```?#]@XL@"``*$(```
+M$0`@`/Q`8`#_````>N%7@0,`(%`J`0`@``C^((@`CD`8`'P_8.+(`@`"A"``
+M"/X@0(`+`"``_$!@<"H!`"````#_``!ZX5>!`P`@$/X@B`".0!@`?#]@XL@"
+M``*$(`"0*@$`(``0_B!```8`(`#\0&````#_`'KA5X$#`"`8_B"(`(Y`&+`J
+M`0`@``!\/V#BR`(``H0@`!C^($"````@(/X_8"0"#1`0`"T(T"H!`"````/G
+M5P(%`"`D`"T((/K@5X$"`"`"_B"``'R?8.3)`@#P*@$`(```B"``@```(`""
+M(%`0`@T0.!H'$$@:!Q`#_C]@/`('$!`K`0`@`"@`+0@!_B!`*`(-$```H!\`
+M'`=@@`<`*`P`#0@0`"T(,"L!`"```('@5P$"`"````T(`'K@5X(``""`]MLO
+M````4!``K@E0*P$`(``4`,X)&`#N"02`[0L@@`\X'!!N"P0^#A``-@X0`#AN
+M8W`K`0`@`!A^CE,0&@X0%!P.$```P&$`FJ91`*`?"``!`$@``0!(D"L!`"``
+M``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!^P*P$`(`#___]_*``M
+M"/__($`H`@T01``G"`#ZX%<\`"<(`00`(-`K`0`@``'ZX%>!'0`@`OK@5X$<
+M`"``@B!01`('$#P"!Q"`&@`@\"L!`"```/K@5X$9`"!``"<(`/K@5P""(%`!
+M`@`@0`('$`/^/V`0+`$`(``\`@<0@!4`(#P"!Q`X`&<(`OY!@`!\GV#DR0(`
+M``@A`#`L`0`@``#ZX%<!`P`@)(!`""`<`1`DG``0)`0'$"`"!Q"`#@`@4"P!
+M`"````B!0``<`A`@'`<0)!P'$!P`30A,`"<(`(0@:!P"#1!P+`$`(``0`$T(
+M`'KA5X(!`"`0'`T0)`8-$(`'`"`D`"T(`(/A5Y`L`0`@``8&`"`D!@T02`"!
+M"`")X5<&!``@.``A"``#XE<!`@`@L"P!`"``(`!M"$P`(0@`AB!H(`(-$!`<
+M#1```*`?#``-"!``30C0+`$`(````>%7`0(`(```#0@`>N!7@@``(`'^OV$`
+MF@9@$`"N"?`L`0`@`!0`S@D$@.T+((`/.!@0;@L$/@X0`#8.$``X;F,0?HY3
+M$"T!`"``#``-"%0`(`A0`$`(`((`8``"`3@,``T(,``@"`#ZX%<P+0$`(`"!
+M```@`((`.`"@'P@``0!(``$`2``!`$@``0!(``$`2%`M`0`@```!`$@``0!(
+M``$`2`1^(&``@*`?____?P``(&`!_E]@<"T!`"``#``-"#P$`!!$!``0*``-
+M"`%^`$`H``T0`("@'PP`#0B0+0$`(`"`'``H!(#M"R"`#S@0$&X+!#X.$``V
+M#A``.&YC%'Z.4[`M`0`@`!`:#A```*!A#`!-"`!ZX5>!`P`@`'P?8*S5`@``
+M`>%7T"T!`"``@0$`(```#0@`>N!7`0$`(!/^'V``$``@`/KF5P(!`"#P+0$`
+M(`````!0``X`(`"@'P@``0!(``$`2``!`$@``0!(``$`2!`N`0`@```!`$@`
+M`0!(``$`2`1^(&``@*`?____?P3^/V`,`$T(,"X!`"``/`(!$`'^/V!$`@$0
+M*``M"`'^($`H`@T0``"@'PP`30A0+@$`(`!8&@$06'X!0`"M`"@,``T(@`(`
+M*`#Q_R<0`*X)!(#M"W`N`0`@`""`#S@4$&X+!#X.$``V#A``.&YC%'Z.4Q`:
+M#A```*!AD"X!`"```*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$BP
+M+@$`(````0!(!'X@8`"`H!____]_*``M"/__($`H`@T01(`F"-`N`0`@``#Z
+MX%>!5@`@`(JB4$2*!A`X@"8((("&"`")YE<!$``@\"X!`"``)(!&""0$`A`@
+M@(8((`@!$`+^0(``?']@Y,D"```&(0`0+P$`(```@^97@DX`(``&84``B`$0
+M(`!-"`!ZX5>!`0`@3(`F"#`O`0`@```"(7`@`@T0$``M"`"#YE<"20`@)`!-
+M"`)^(8``?']@4"\!`"``Y,D"``"&(``0`@T0@$4`(```#0@`>N!7@D<`((!&
+M`"!P+P$`(``"_D"``'QA0.3)`@``B@$0'`!-"$R`)@C_@W]P``8A8)`O`0`@
+M`!P"#1`@`$T(`'KA5P$!`"``A"%@(`(-$!P`+0@`CD`8L"\!`"```'KA5X$"
+M`"``?#]@XL@"``*$(``D`@T0`!(`(`C^((C0+P$`(```CD`8`'KA5P$#`"``
+M?#]@XL@"``*$(``(_B!`)`(-$/`O`0`@```-`"`(_B"(`(Y`&`!ZX5<!`P`@
+M`'P_8.+(`@`"A"``$#`!`"``$/X@0"0"#1``"``@"/X@B`".0!@`>N%7`0,`
+M(`!\/V`P,`$`(`#BR`(``H0@`!C^($`D`@T0``,`("#^/V`D`@T0`(JB4%`P
+M`0`@`!`*#1```*`?`"D`(!``+0@`@^97@B0`("0`30@"?B&`<#`!`"```'Q_
+M8.3)`@``AB``$`(-$"``30@`>N%7`2``("@`+0B0,`$`(``!_B!`*`(-$```
+MH!\`H!\(``$`2``!`$@``0!(``$`2+`P`0`@```!`$@``0!(``$`2``!`$@$
+M?B!@`("@'____W\H`"T(T#`!`"``__\@0"@"#1`@`"T(`(Y`&`!ZX5<!`@`@
+M`'P_8.+(`@#P,`$`(``"A"````P`(`C^((@`CD`8`'KA5X$"`"``?#]@XL@"
+M`!`Q`0`@``*$(``(_B!`@`<`(`C^((@`CD`8`'KA5X$"`"``?#]@,#$!`"``
+MXL@"``*$(``0_B!```,`(`C^((@`CD`8`'P_8.+(`@!0,0$`(``"A"``&/X@
+M0`+^0(``?']@Y,D"```&(0!(@&`()`!-"'`Q`0`@```'X5>%`@`@$`(-$"``
+M30A,@"`(``(A<"`"#1```*`?D#$!`"``#``-"!``+0@`@>!7`0$`(("W_R>`
+M*MLO$`"N"02`[0NP,0$`(``@@`\X%!!N"P0^#A``-@X0`#AN8QA^CE,0&@X0
+M%!P.$-`Q`0`@``P`K0D`',=1`*`?"``!`$@``0!(``$`2``!`$@``0!(\#$!
+M`"````$`2``!`$@``0!(!'X@8`"`H!____]_/(`F"`#ZX%<0,@$`(`""#``@
+M'(`F"!B"!A`H`"T(`/K@5X$!`"`!_C]@&((&$#`R`0`@`(`(`"`@@&8(`(?F
+M5P$'`"`X@$8(2(`F"``#X5<"!0`@4#(!`"```GXA@`!\7V#DR0(``(2`00`&
+M!A`D`"T(`OX@@`"$(`!P,@$`(``0`@T0`?[?80``H!\`'`=@$`"N"10`S@D$
+M@.T+((`/.)`R`0`@`!@0;@L$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A```*!A
+ML#(!`"``/(`&"`1ZX%>""0`@`*`?"``!`$@``0!(``$`2``!`$C0,@$`(```
+M`0!(``$`2``!`$@``0!(!'X@8`"`H!____]_*``M"/`R`0`@``'^($`H`@T0
+M``"@'P":!F``#/\O``D`(`"@'P@``0!($#,!`"````$`2``!`$@``0!(``$`
+M2``!`$@``0!(``$`2`1^(&`P,P$`(```@*`?____?W2`Q@D``*`?`'KG5P$!
+M`"``F@9@``('.%`S`0`@`!``K@D4`,X)!(#M"R"`#S@8$&X+!#X.$``V#A``
+M.&YC<#,!`"``%'Z.4Q`:#A``H!\(``$`2``!`$@``0!(``$`2``!`$B0,P$`
+M(````0!(``$`2``!`$@$?B!@`("@'____W\L`*T)``"@'[`S`0`@``":!F`0
+M`*X)!(#M"R"`#S@4$&X+!#X.$``V#A``.&YCT#,!`"``%'Z.4Q`:#A```*!A
+M`*`?"``!`$@``0!(``$`2``!`$CP,P$`(````0!(``$`2``!`$@``0!(!'X@
+M8`"`H!____]_`(!&"!`T`0`@``!ZX5>!$``@&(`F"`#ZX%<"#P`@('KA5PX!
+M`"`?_C]@,#0!`"``@```(`%^(5`"_D"`0``M"`"$0$`\`"T(``/A5P4"`"!0
+M-`$`(````B%0_/]`8#@`+0@`A$!````A"`#ZX%<!!``@$((&$'`T`0`@`!2`
+M(`@4@@80$)H`$```(0@4F@`0&(0&$``"`"`0F@80D#0!`"``%)H&$!B$!A``
+M&@$0``"@'P```%`0`*X)!(#M"R"`#SBP-`$`(``4$&X+!#X.$``V#A``.&YC
+M%'Z.4Q`:#A```*!A`*`?"-`T`0`@```!`$@``0!(``$`2``!`$@``0!(``$`
+M2``!`$@``0!(\#0!`"``!'X@8`"`H!____]_&(!F"`#ZX5<!"P`@$(!&"`"%
+MYE<0-0$`(``"`P`@`(`A"`"#YE<"!P`@`((@4`""`1"`!0`@%(`F"#`U`0`@
+M`!0"`1`0@$8($(0`$!B`9@@`@"$(`(/F5X(!`"`8!@$04#4!`"``$(!&"`"$
+M`1``@B!0&((&$```H!\```!0$`"N"02`[0MP-0$`(``@@`\X%!!N"P0^#A``
+M-@X0`#AN8QQ^CE,8&@X0`)JF49`U`0`@`"P:#1`P&@T0-!H-$$0:#1``?!]@
+M[-L"``""(%``FJ91L#4!`"```!H`$`1^`$`!_B!`(/K@5P7]_R<`?!]@[-L"
+M`#@`#1#0-0$`(`!```T0@'X`0#P`#1``?!]@K-4"``!\/V`XM0(``'Q?8/`U
+M`0`@`(Q-``!(`(T(3`"M"%``S0@0&@X0%!H.$`!\?V!-251!$#8!`"````SC
+M8`#E_2]4&@T06!H-$!@`K@D$@.T+((`/.!P0;@LP-@$`(``$/@X0`#8.$``X
+M;F,D?HY3$!H.$!0<#A`8'@X0`'W@5U`V`0`@`$U)5$$!`P`@$`"N"10`S@D8
+M`.X)!(#M"R"`#S@D$&X+<#8!`"````1!4/B%#1``H!\(``$`2``!`$@``0!(
+M``$`2``!`$B0-@$`(````0!(``$`2``!`$@$?B!@`("@'____W]``"T(`(`@
+M"+`V`0`@`/R##1``^N!7`0$`(/S_34`8A``0``1!4$``+0@`A``0T#8!`"``
+M0``M"`3^($!``@T0/`!-"`"%X%<"`0`@.``M"$`"#1#P-@$`(```!$%01`0-
+M$```H!\`H!\(``$`2``!`$@``0!(``$`2!`W`0`@```!`$@``0!(``$`2``!
+M`$@$?B!@`("@'____W_\@2T(,#<!`"```/K@5X$S`"#\@2T(`(*@81"`(`@`
+M@^97@@$`(``$05!0-P$`(`#\A0T0``0`(!2`1@@4A``0$(`F"!`"`1#\_TU`
+M&(0`$'`W`0`@`!"`)@C\@PT0`(`F""#ZX%<.`@`@(/X@4`""!A``GN=1D#<!
+M`"````,`(`B`Y@D,@,8)!(`F"`""!A``^N!7`0(`(/C_+4"P-P$`(``8@@80
+M$)H&$``!`"``!$%0&(0&$```H!\`^N=7`0$`(-`W`0`@```<!V``@@<X`*`?
+M"``!`$@``0!(``$`2``!`$@``0!(\#<!`"````$`2``!`$@``0!(!'X@8`"`
+MH!____]_&(!&"/C_+4`0.`$`(```A>!7@@\`(`"`)@@@^N!7#@$`(!_^/V"`
+M```@`?X@4#`X`0`@``+^0(!``"T(``(A0#P`30@`A>!7!0(`(`"$(%#\_T!@
+M4#@!`"``.``M"``"(4``@$`(`'KA5P$$`"`0A`80%`!!"!2$!A!P.`$`(``0
+M&@$0`(!`"!0:`1`8@@80``(`(!":!A`4F@80&((&$)`X`0`@``":`!```*`?
+M`*`?"``!`$@``0!(``$`2``!`$@``0!(L#@!`"````$`2``!`$@``0!(!'X@
+M8`"`H!____]__($M"`#ZX%?0.`$`(`""S/\G1``M"`#ZX%<"!@`@`_X_8`P`
+M30@\`@$0`?X_8/`X`0`@`$0"`1`H`"T(`?X@0"@"#1```*`?#``-"("M_B\`
+MK?\G$#D!`"````"@'P"L_R<`?!]@=-H"``````@`@`\X!#X.$``V#A`P.0$`
+M(```.&YC%'Z.4Q`:#A``?+]AZ+H"``"%!@@`>N!7`0<`(%`Y`0`@``!\'V"?
+MV@(```0`"`!ZX%>"!``@`'P?8``"``"`%^(O<#D!`"``````4`"!1A`!_C]@
+M`'P?8#RO`@```@`0`'P?8'3:`@"0.0$`(``````($`"N"02`[0L@@`\X%!!N
+M"P0^#A``-@X0`#AN8[`Y`0`@`!A^CE,0&@X0%!P.$```P&$`@J!A`'P_8$RV
+M`@`4@4`(T#D!`"```7X!0!2!`!`*>N!7"P$`(````%`4@0`0`'$!*`!\/V#P
+M.0$`(`!,M@(`%(%`"`)^(8``A"!``((@0`"$($`"_B"``'Q_8!`Z`0`@`)33
+M`@``AD!``(:`00``!A``?!]@PMP"```(``@:`($0,#H!`"```'KG5X$+`"`B
+M_F%``(*!0`@(!P@`@B%``("`$`H(!PA0.@$`(``"`((0#`@'"`0`@A!B"`<(
+M!``!$%X(!P@J`($06`@'"'`Z`0`@``H`@1!:"`<(#@"!$%P(!P@2`($0D`@'
+M"!0`@1"6"`<(D#H!`"``%@"!$`#ZYE<!#@`@`'P_8$RV`@`4@4`(`GXA@`"$
+M($"P.@$`(```@B!``(0@0`+^((``?']@E-,"`!S^04```H%`"(@&"-`Z`0`@
+M```"@4$``(80"H@&"`(`@A`,B`8(!`""$%Z(!@@`AD!`\#H!`"``*`"!$%B(
+M!@@(`($06H@&"`P`@1!<B`8($`"!$!``K@D0.P$`(``4`,X)!(#M"R"`#S@8
+M$&X+!#X.$``V#A``.&YC('Z.4S`[`0`@`!`:#A`4'`X0&!X.$```X&$`@L!A
+M`)JF40+^!H``?%]@4#L!`"``4-D"```$(```^N!7@@$`(``$0$``'`$0@`$`
+M(`'^ID%P.P$`(``$^N97"_K_)P3ZYE<"`0`@`OX?8``C`"#\_RU``!P'8)`[
+M`0`@`("=Z2\`>N!7`B``(/R!#0@&>N!7C1X`((`8`"`"_@:`L#L!`"```((@
+M4`!\0$!0V0(```(!$`">!V``'"=@@.CO+P`<!V#0.P$`(```8/`O=/X?8`!\
+M/V!-!```@+(2*`+^!H``@B!0`'Q`0/`[`0`@`%#9`@```@$0$``'"$<"0!`%
+M_A]@`!,`(`+^!H``@B!0$#P!`"```'Q`0%#9`@```@$0$``'"$<"0!``Z_\G
+M`OX&@`""(%`P/`$`(```?$!`4-D"```"`1`0``<(1P)`$`;^'V"`"@`@`OX&
+M@%`\`0`@``""(%``?$!`4-D"```"`1`0``<(1P)`$`3^'V``!@`@<#P!`"``
+M`GZ`@0!\A@&`/`$````&."=/``#K3@``^4X```)/``"0/`$`(``*3P``$T\`
+M`"=/``````!0$`"N"10`S@D8`.X)!(#M"[`\`0`@`""`#S@@$&X+!#X.$``V
+M#A``.&YC$'Z.4P```%``?#]@T#P!`"```'T````$05`!_G]@`+CR+P2`[0L@
+M@`\X$!!N"P0^#A#P/`$`(```-@X0`#AN8QA^CE,0&@X0%!P.$`":IE$`?!]@
+MC-L"`!`]`0`@```$``@`>N!7`0T`(("``R@`>N!7`0\`(`'^/V``)O(O,#T!
+M`"````"@80#ZYE>!#``@`'P_8%RM`@``@``(`7X`0`"``!!0/0$`(```?!]@
+MD-L"``````B`C@`H`'P?8(C;`@```$`(`'KA5W`]`0`@`($%`"`"_A]@`((@
+M4``"`3B``P`@`'P?8*#;`@```"`(D#T!`"```/K@5P$!`"````!0`((`.`!\
+M'V`MVP(```0`"`!ZX%>P/0$`(`"!!0`@`'S?893;`@``!`<(`7X`0``.(!@`
+M`$<0!?K@5]`]`0`@`((!`"``2.<O````4```1Q``F@9@@*?>+P!\'V"HU0(`
+M\#T!`"````0`"`!ZX%>!`@`@`'P?8*?:`@``!``(#GK@5X$``"`0/@$`(`"`
+M4>TO`'P?8*C5`@``!``(`'K@5X$"`"``?#]@G+0"`#`^`0`@`$B!``@!?@!`
+M2($`$!``K@D4`,X)!(#M"R"`#S@8$&X+4#X!`"``!#X.$``V#A``.&YC$'Z.
+M4P!\'V"<LP(``+C\+P```%!P/@$`(``$@.T+((`/.!`0;@L$/@X0`#8.$``X
+M;F,8?HY3$!H.$)`^`0`@`!0<#A```,!A`'R_85#;`@``@`8(`7X`4`-ZX%<-
+M6P`@L#X!`"```%T`(`!\'V`@VP(```0`"`!ZX%<!"P`@`_X?8`"\["_0/@$`
+M(```@B!0`'P?8"';`@```D`0`?Y_8`!\7V`MVP(```9!$/`^`0`@`````%``
+M@B!0`&@$*`!\'V`LVP(```0`"`!ZX%<!`0`@$#\!`"``!/X?8(!4`"`#_A]@
+M@%,`('C^'V``?#]@U@,```!)$B@P/P$`(`"`40`@`'P?8"#;`@``!``(`'K@
+M5X$U`"``^N!7@@P`(%`_`0`@``'^?V``?%]@+=L"```&01``?#]@(ML"``"$
+M``@">N!7<#\!`"``@@``(`"&0!``?#]@(ML"``"$``@!>N!7`@$`(`/^'V"0
+M/P$`(`"`H^PO`'P'0,`#```!_C]@`%,$*`/^'V``?+]A4-L"`+`_`0`@``!!
+M`"``?#]@3-L"``"```@`?`!0X`$```'^/V"`300HT#\!`"``@#T`(`!\'V`@
+MVP(```0`"`!ZX%>!(0`@`'Q?8%3;`@#P/P$`(````"$(`/K@5X$#`"``?!]@
+M,-L"```"`!``@B!0``(!$!!``0`@`(#E$2@`-0`@`'Q?8"W;`@``!`$(`'K@
+M5X(#`"``XA$H,$`!`"```((@4`!\'V"<M`(`(`,`$"0#`!``+P`@`((@4``"
+M01!00`$`(```?!]@B-L"````0`@`>N%7`00`(`!\/V`BVP(``(0`"'!``0`@
+M``%ZX%>"`0`@````4`""(%```@$X`'P_8&2N`@``@``(D$`!`"```7X`0`"`
+M`!`#_A]@`'[L+P!\'V`HVP(```!`"`!\/V"P0`$`(`!,VP(``(``"````4``
+M@``0`'P`4.`!```!_C]@@"T$*-!``0`@``+^'V``?+]A4-L"`(`;`"``?!]@
+M(-L"```$``@`>N!7\$`!`"```@@`(`""(%``?%]@+=L"```"01`#_A]@@'#L
+M+P'^'V`000$`(```@`80````4`""(%"`(P0H`?Y_8`!\'V`AVP(```9`$#!!
+M`0`@`(`1`"``?!]@0-L"``````@`?#]@/-L"``"`(`@`?%]@4$$!`"``Z-8"
+M````80@.B$$($(AA"``(@E``[=DO`?X?8`"0Y"]P00$`(```@B!0`'P?8"S;
+M`@```D`0@+<1*``'`"!X_A]@`'P_8)!!`0`@`(<$````_!$H@`0`(`)^@($`
+M?(8!K$$!````!CBM3P``L$$!`"``S4\``/5/```X4````(`&$!``K@D4`,X)
+M!(#M"R"`#SC000$`(``8$&X+!#X.$``V#A``.&YC$'Z.4P!\7V`MVP(```0A
+M"/!!`0`@``#ZX%>!!0`@`((@4``"01``>N!7@@``(`'^'V``?#]@$$(!`"``
+M5-L"``"``!````!0`OX_8``#!"@$@.T+((`/.!`0;@LP0@$`(``$/@X0`#8.
+M$``X;F,<?HY3$!H.$!0<#A`8'@X0`'R_85!"`0`@`##;`@``@$8(`'KA5P$B
+M`"``?-]A*-L"````)P@`^N!7<$(!`"``@1\`((!?`"@`@$8(```G"`"$($``
+M_*!1X`$````:(%"00@$`(```_"!@````@`#ZX%>"!@`@`!O@5X$%`"``?-]A
+M*-L"`+!"`0`@````)P@`FJ!!`!H@4`#\(&````"``/K@5P(!`"``&^!7T$(!
+M`"``@OK_)P#%UR\``.!A@%(`*``:(%``_"!@````@`#ZX%?P0@$`(`""!@`@
+M`!O@5X$%`"``?-]A*-L"````)P@`FJ!!`!H@4!!#`0`@``#\(&````"``/K@
+M5P(!`"``&^!7@OK_)P!\'V!0VP(`,$,!`"``````"`)ZX%>"!0`@`/PF0.`!
+M````?!]@3-L"```"`!!00P$`(```G@=@@+?7+P":!F`!_C]@`-L#*``!`"``
+MG@=@@+37+W!#`0`@`!``K@D4`,X)&`#N"02`[0L@@`\X'!!N"P0((`@`_>!7
+MD$,!`"``__\```(%`"`"""`(`/W@5___```"`P`@``@`"`!]X%>P0P$`(`#_
+M_P```@$`(`'^'V"````@````4`"`#S@``*`(`("`"-!#`0`@```*8D``!@$0
+M!`"`"`2`8`@`B&%`!`8!$```@0@``*`(\$,!`"````H"4`"`@`@``>)7`0$`
+M(`'^`4`$``$0`(`/.```@`@01`$`(```@$`(``7B5P'^?V`"AF%0``7B5P'^
+M7V`.!$%0!`"`"#!$`0`@``2`(`@``^)7`?X?8`(``%```^)7`?X_8`Z"(%``
+M^N%74$0!`"```0(`(`!ZX%<!`0`@````4(`$`"``^N!7`@(`(`!ZX%=P1`$`
+M(``!`@`@`'KA5P$!`"`!_A]@@```(`+^'V``@`\X`'P?8)!$`0`@`/B\`@``
+M`0`(`(`/.`0^#A``-@X0`#AN8R1^CE,0&@X0L$0!`"``%!P.$!@>#A```*!A
+M`(C7+P``P&&`^/\O``#@8?C_#4#01`$`(`#\_RU`@#@`*`!ZX%>!```@`(@1
+M*/B!#0@`$"`8$'Y`B/!$`0`@`/R!#0@`'F!`!?X`@``"`%`"?@"```(`0`-^
+M`(``!@!`$$4!`"```!!@&`!\`&```/__$'X@B`5^`8``!`!0`GX`@``$`$`P
+M10$`(``#?@"```(@0`"0`!@0?@"```8`0`"`!A`0_@"(!(`&$%!%`0`@```<
+M!V"`=]<O````4!``K@D4`,X)&`#N"02`[0L@@`\X<$4!`"``)!!N"P0^#A``
+M-@X0`#AN8QA^CE/X_PU``.+_+P!ZX%>010$`(`"!```@@'$1*/B!30C\@2T(
+M!7YAB`M^`8@`!F!`#'X!B+!%`0`@```&0$`;_@"```1`0!7^`(``!$!`%/X`
+M@``$`$`$@.T+T$4!`"``((`/.!@0;@L$/@X0`#8.$``X;F,0?HY3````80""
+MX&#P10$`(```!*%@`!`$8`".(V"`P?\O``#`8`!ZXU<"!0`@````4!!&`0`@
+M``"``A`$@`(0@`8`(``0!&``CB-@``0`(`".`V``$"1@,$8!`"``@`(`(`%Z
+MXU<!_/\G`GKC5X'\_R<``0`@`(I"8``"`"A01@$`(```#`-@!(#M"R"`#S@0
+M$&X+``"@"`"`@`@`B&)0``8!$'!&`0`@``0`@`@$@&`(``9B4`0&`1```*`(
+M`("`"`")XE<&`0`@D$8!`"``__\!0`0``1``@`\X!#X.$``V#A``.&YC('Z.
+M4Q`:#A"P1@$`(``4'`X0&!X.$```H&$`@N!A_/_-00'^'V``'"=@`-(&*-!&
+M`0`@``!ZX%<"%@`@`'P?8#2V`@```$`(`'WA5X`^```"!P`@\$8!`"``_($M
+M"`#ZX%>"!0`@````4``<)V``RP8H`'K@5P(/`"`01P$`(`#\@2T(``(?4.@#
+M````@`<0`(C]+P`+`"``?!]@-+8"`#!'`0`@````0`C\@2T(``(!4``#X5<&
+M`0`@`'P`0($^````',=14$<!`"```'W@5^@#```%`P`@`7['00!\`%#H`P``
+M`'W@5^@#``!P1P$`(``&_?\G`(`'$`!]_2\`'`!``(`&$````%`0`*X)%`#.
+M"9!'`0`@`!@`[@D$@.T+((`/."`0;@L$/@X0`#8.$``X;F,D?HY3L$<!`"``
+M$!H.$!0<#A`8'@X0'"`.$"`B#A```*!A@?X?8C3^/V+01P$`(```?!]@W*P"
+M````(`@!_@!@`'K@5X$"`"``?!]@5-T"`/!'`0`@``````@`>N!7`@$`("/^
+M'V"`/@`@$/X`8`!ZX%<!`P`@$$@!`"``@`$`(``KUR\`'`=@@![7+P```%``
+M.@`@"/X`8`!ZX%<P2`$`(`"!"``@`!G7+P``P&$`?!]@#``@"``DUR\``.!A
+M`/KF5U!(`0`@`($!`"``_.=I````@``!`"``_.=A____?P">!V``?#]@<$@!
+M`"``#``@"(#S_R>`$-<O``#`80!\/V"$M@(``)M`$`!\'V"02`$`(``)`"`(
+M`!K7+P``H&$`_"9H````@`!\'V`)`"`(`!C7+[!(`0`@``!\'V`,`"`(@!77
+M+P``X&$`_`=@```$``!ZX%>!```@T$@!`"```?X?8@#\YVD```"``)X'8`!\
+M/V`,`"`(@!#7+Q]^"&#P2`$`(```>N!7`1@`(`#ZZ%<!%P`@@'X(8`!ZX%<`
+M?!]@#``@"!!)`0`@`($$`"``"M<O``#@80#\!V````0``'K@5P$.`"!_?@AB
+M,$D!`"``"OX_8H`-`""`!=<O``#@80#\!V````0``'K@5X()`"!020$`(```
+M?#]@A+8"``"%``@`(`!@`'K@5X$!`"``_.=I````@'!)`0`@```!`"``_.=A
+M____?P">!V``?#]@#``@"(#\UB\`(`A`D$D!`"``@'X`:@K^/V(``0`@__\(
+M0``.(!H??@A@`'K@5P$!`""P20$`(```^NA7`NG_)P#\!V#___]_`'P_8`P`
+M(`B`]-8O`/KH5]!)`0`@`(("`"``?#]@A+8"``2!``@!?@!`!($`$`!\'V`)
+M`"`(\$D!`"```)HF8(##_R<0`*X)%`#."1@`[@D<``X*(``N"@2`[0L02@$`
+M(``@@`\X)!!N"P0^#A``-@X0`#AN8Q!^CE,```!0`*[_+S!*`0`@``2`[0L@
+M@`\X$!!N"P0^#A``-@X0`#AN8QQ^CE,0&@X04$H!`"``%!P.$!@>#A``FJ91
+M`!S'40!\_V'\W`(``IH'`("$`2AP2@$`(````"!@`IH'``!ZX%>!!@`@`'Q?
+M8)"U`@```$$(``(A8)!*`0`@``#ZX%<!`@`@`'PG0+"\`@``@4`0`7['00'^
+MID$.^N97L$H!`"``B_7_)P```%``?"=`L+P"``"!0!`0`*X)%`#."1@`[@G0
+M2@$`(``$@.T+((`/.!P0;@L$/@X0`#8.$``X;F.H?HY3`(9A4/!*`0`@``[^
+M'V!H@0T0`'P?8)"N`@```"`(`/K@5P$.`"``A@%`$$L!`"````8`0`)^`(``
+M@$U`<'^!0`B(``@``((0"H@`"`(`@A`P2P$`(``,B``(!`""$&J(``AV`4$0
+M:(@`"'<!01!D@``(>`&!$%!+`0`@``'^84``@"`(`/K@5X+U_R=LAPT0`(8!
+M0``&`$`"?@"`<$L!`"``"'X`0&C_+4"`L`XH!(#M"R"`#SBH$&X+!#X.$``V
+M#A"02P$`(```.&YC*'Z.4Q`:#A`4'`X0&!X.$!P@#A`@(@X0)"0.$+!+`0`@
+M``""H&&0_D9"`)[G40"&85``HBA2#``@"``$H6`4B`8*T$L!`"```OX?8`#\
+MAD```@``Z0%"$``@R&$`>NA7@2$`(`"(``CP2P$`(````H!``HC@"`/^"(``
+M`(E!`!Y&$```R4`!!D,0!`@#$!!,`0`@```0!%$`$"1A`(_B5XH"`"`!_C]A
+M``J"0`"*`U``$.`8,$P!`"``@`8`(`"/XE>"`0`@`?X_80'^'V$`!``@`?X?
+M80(.@Q!03`$`(```C@)0`!"@&``."%``$``:`?X!0``.8!@`^N17@0<`('!,
+M`0`@``/^"(```,E``@J#$`$$`PA`?@!H`0!#$``*"%``$``:D$P!`"```'KH
+M5X$"`"``!*%@`?X'0``.X!D`AF%0`"#(80!ZY%>P3`$`(``!`P`@#(`@"`#Z
+MX%>!`0`@`(@`"``"@$`"B.`(`?X(0-!,`0`@```0(!H4^NA7`@(`(%K^'V#;
+M_C]@`)(0*(`%`"``>NA7\$P!`"``@N#_)P`$`"`!_A]@Z0%"$````%"2@(80
+MD89&$)">1A`030$`(`"4@`80`?X_8@/^"(```,E`^04#",!^`&CY`4,0B)Z&
+M$#!-`0`@`'J(!@@`'`!`C(`&$`">!T``'@!``"(`0``.`!@`_(9`4$T!`"``
+M``(``.D%(@@``@!`Z0%"$``.(!A`A`8(`'K@5X$!`"!P30$`(``!_@=```(`
+M0.D!0A``^N=7@0(`(`#\AD```@``Z04B")!-`0`@``'^`$#I`4(0`*`?4``@
+M`&@??@"($`"N"10`S@D8`.X)L$T!`"``'``."B``+@HD`$X*!(#M"R"`#S@H
+M$&X+!#X.$``V#A#030$`(```.&YC%'Z.4Q`:#A```*!A"_X?8`#\1D```@``
+MQ`%!$/!-`0`@``!\?V!\O0(`!(4!",4!01`4?@!`!(%!$``.`!AK>N!7$$X!
+M`"``#`$`(!3^'V`$@4$0`/K@5P(R`"``@B!0`/Q&0``"```P3@$`(`#)`T$0
+M__X?8,L!01#;`T$0R@-!$$.$!@@`>N!7@@$`(%!.`0`@`$B$!@@`>N!7@@(`
+M(`#\1D```@``R@4!"`1^`&C*`4$0<$X!`"```((@4`#\1D```@``V@-!$%.$
+M!@@`>N!7`0$`(`'^'V"03@$`(`#:`4$00(0&"`!ZX%<!#0`@`7X`4`#\1D``
+M`@``RP%!$+!.`0`@`$"$!@@%>N!7`@P`(`""(%!!A`8(`('@5PH%`"`X@`8(
+MT$X!`"```@)@``#\1D```@````(!0,T'0!`!_B!`080&"`"!X%?P3@$`(``+
+M^_\G080&"`#\1D```@``S`%!$(`"`"``_$9```(``!!/`0`@`,H%`0@@?@!H
+MR@%!$%&$!@@`>N!7@0(`(`#\1D```@``,$\!`"``R@4!"`A^`&C*`4$05(0&
+M"`!ZX%>!`@`@`/Q&0``"``!03P$`(`#*!0$(0'X`:,H!01!2A`8(`'K@5X$"
+M`"``_$9```(``'!/`0`@`,H%`0B`?@!HR@%!$`!\'V!DW@(``$0`"`1ZX%>"
+M!``@D$\!`"``7(0&"/Q^`&"`>N!7@@(`(`#\1D```@``R@4!"`%^`&BP3P$`
+M(`#*`4$02H0&"`)ZX%=6B"8(`@$`(`""`$"````@`(``@-!/`0`@```"`&@`
+M_$9```(``,8!@1``TPPH`/Q&0``"``#&"2$(\$\!`"````(`8,8!@1!(A`8(
+M`7X`4`]ZX%>-!P`@``D`(`""(%`04`$`(```$@`@`?X?8,@!01``$0`@`OX?
+M8,@!01"`#P`@`_X?8#!0`0`@`,@!01``#@`@!/X?8,@!01"`#``@`((@4`#\
+M1D```@``4%`!`"````H`(`)^@($`?(8!9%`!````!C@#5```!50``!%4``!P
+M4`$`(``(5```$50``!%4```15```"U0``!%4```15```$50``)!0`0`@`!%4
+M```15```$50``!%4```.5```R`-!$`#\1D```@``L%`!`"``R`4!"`!ZX%>"
+M`0`@R@4!"`1^`&C*`4$03H@F"(B(!@C04`$`(```@>!7`@,`(`""(%``_$9`
+M``(``-P#@1",@`8(``4`(/!0`0`@``%^`%``@>!7`@$`((R`!@B````@'(@&
+M"`#\1D```@``$%$!`"``W`&!$!R(!@C>`8$0$`"N"02`[0L@@`\X%!!N"PA^
+MCE,P40$`(``$/@X0`#8.$``X;F,X?HY3$!H.$!0<#A`8'@X0'"`.$%!1`0`@
+M`"`B#A`D)`X0*"8.$"PH#A`P*@X0-"P.$!"*#1`4C`T0<%$!`"```(*@80`$
+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
+M`GX`0``!X5>%^?\G``1!4`!\?V"5VP(`<%H!`"```80!"`)^`$```>%7A@8`
+M(`!\?V"5VP(``H0!``"@@$&06@$`(````$80`7X(0``0`!H!?@%``!!`&`&$
+M`0@"?@!```'A5[!:`0`@`(7Y_R<#_A]@`*"`00``1A`!?@A``!``&@'^7V``
+MH(!!T%H!`"````1&$`%^"$``$``:`'Q?8.C6`@````$(!@0`"`"@@$'P6@$`
+M(````$80`7X(0``0`!H&_A]@`*"`00``1A`!?@A``!``&A!;`0`@``+^'V``
+MH(!!``!&$`%^"$``$``:```!"!`(``@`H(!!,%L!`"````!&$`%^"$``$``:
+M```!"!`(``@(?@"0`*"`00``1A!06P$`(``!?@A``!``&@!\GV"@M@(````"
+M"`!ZX%>!(0`@``0`"'!;`0`@``"@@$$``$80`7X(0``0`!H```((`00`"`"@
+M@$$``$80D%L!`"```7X(0``0`!H```((`@0`"`"@@$$``$80`7X(0``0`!JP
+M6P$`(`````((`P0`"`"@@$$``$80`7X(0``0`!H```((!`0`"-!;`0`@``"@
+M@$$``$80`7X(0``0`!H`!$%0`'P?8)_;`@``!``(\%L!`"````'A5PH0`"``
+M!&%``(1A0`!\GV"@M@(````""``&`$`07`$`(``%!``(`*"`00``1A`!?@A`
+M`!``&@```@@`!@!`!@0`"#!<`0`@``"@@$$``$80`7X(0``0`!H```((``8`
+M0`<&``@`H(!!4%P!`"````!&$`%^"$``$``:`7X!0``00!@`?!]@G]L"```$
+M``AP7`$`(````>%7"_#_)P""(%!*`D<03@*'$`+^'V`U`$<0`'P?8)!<`0`@
+M`*#;`@```"`(`/K@5P$!`"````!0`((`.``>"$`,@$8(L%P!`"```@"!$!0@
+MAQ``F@9@$`"N"10`S@D8`.X)'``."@2`[0O07`$`(``@@`\X(!!N"P`(@E``
+M>N%7C@,`(``$8`@`AD`0`7Z"0/!<`0`@``%^`$`!_B!```GA5XW\_R<`@`\X
+M#/Z_8`"``1`$?H!`$%T!`"``!(@!$`A^@$`(B`$0"GZ`0`R(`1``"()0&(@!
+M$!R(`1`P70$`(``@B`$0)(@!$"B(`1`,^N!7#!0`(``)`"``@()`$(@!$%!=
+M`0`@`(`.`"``@()`%(@!$``-`"``@()`((@!$(`+`"``@()`<%T!`"``'(@!
+M$``*`"``@()`*(@!$(`(`"``@()`)(@!$``'`""070$`(``""H``!GKB5XT%
+M`"`"?H*!`'R&`:Q=`0````8X4E<``+!=`0`@`%57``!R5P``6U<``%A7``!>
+M5P``85<````*@$`!!(((T%T!`"```GZ"0``*@D``$*(8`(O@5XGU_R<H@"$(
+M`/K@5P$2`"#P70$`(``#?@&0`!#`&`2$``C^?P!@`!"@&``*`U``$(`8``OC
+M5Q!>`0`@``L&`"`!A``(`WX`4``0`!@``>)7B0,`(`"(`$`%!"`(,%X!`"``
+M!WX!8`&`'X```@!@+(!!$``!`"``"()0+(A!$"R$`0A07@$`(```>N!7@0(`
+M(`!\/V!\K@(``(``"`%^`$``@``0*(`A"'!>`0`@``2$``@!?@!@+8!!$(`!
+M`"``"()0+(A!$"V(01``@`\XD%X!`"``!#X.$``V#A``.&YC$'Z.4P!\7V"(
+MU@(```#!"`!ZXU>P7@$`(``!"``@#`"@"!``@`@X"&((`HA""``&05`"A((0
+M.`AB"-!>`0`@``"(0@@`!D%``(2"$#@(8@@4"$((``9!4!0$@A```@,X\%X!
+M`"``@```((#[ZR\$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,07P$`(``<?HY3
+M$!H.$!0<#A``FJ91`'P_8```(0`(Q$`(#,0`"#!?`0`@```$`&``#L`9('X'
+M8`!ZX%<!`0`@(/X?8`B`0!00?@=@4%\!`"```'K@5P$"`"`0_A]@`'P_8```
+M(0`(@$`4`7X'8`!ZX%=P7P$`(``!!0`@`'P?8'#>`@`````(`'K@5X$``"``
+M`@`X`?Y?8)!?`0`@``!\/V```"$`"(1`%`)^!V``>N!7`04`(`!\'V!TW@(`
+ML%\!`"``````"`!ZX%>!```@``(`.`+^'V``?#]@```A``B`0!307P$`(``(
+M?@=@`'K@5X$/`"````!0_X%-$`C^'V``?#]@```A`/!?`0`@``B`0!2`;?HO
+M`'P_8(S6`@`P@``0__\-0``J[2\``,!A$&`!`"```'KG5P$$`"``"`<(`!P`
+M0(#`W2\``*!A`/KF5P(.`"`P8`$`(```'`=@`+_L+P!\'V"PM@(``44`"`!Z
+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
+M`)I&0``:04`P:0$`(``"?D&``'PA0)3``@`$@"`(!/X@@`"&($```@(0!'XG
+M@%!I`0`@``!\?V"4O`(``(9`0`"&8`#\@2T(`((!$`P`(0@`_&!H<&D!`"``
+M``$```0`(0@`A@`4@/+2+P```%`0`*X)%`#."02`[0N0:0$`(``@@`\X'!!N
+M"P0^#A``-@X0`#AN8QA^CE,0&@X0%!P.$+!I`0`@``""H&$``,!A`WK@5PT%
+M`"``!P`@`#X"*`"`!A"`"0`@T&D!`"``@$`"*`"`!A``"``@`%`"*`"`!A"`
+M!@`@,_X?8!'^/V#P:0$`(```!$%0`$T%*(`*`"`"?H"!`'R&`0QJ`0````8X
+M<5H``!!J`0`@`'1:``!W6@``>EH```"`!@@`>N!7@00`(`1^)X``?!]@,&H!
+M`"``E+P"``"`($`,@``(`'Q`:``0```$@``(``0`%````%!0:@$`(``0`*X)
+M%`#."02`[0L@@`\X&!!N"P"`#S@$/@X0`#8.$'!J`0`@```X;F,0?HY3`)(D
+M40!\'V%(V0(``!($$`!\/V!@V0(`D&H!`"``$(@@"`#ZX%>!"``@`'P_8`37
+M`@`(@``(^W\`8`B``!"P:@$`(``,@``(`'K@5X$$`"``?-]@6-@"``!\'V!`
+ML0(````#$-!J`0`@``@2`Q`$`@,0`?X?8```!!``"()0!'ZB@`!\_V`4UP(`
+M\&H!`"```(Y"0`@``0CW?P!@"``!$`!\/V!@V0(`$(@@"`#ZX%<0:P$`(``!
+M#@`@`GX@8`#ZX%>!#``@^W\`8`@``1`,``$(`'K@5S!K`0`@``$*`"``?!]A
+M2-D"````9`@`AD%```9!0`)^08``?!]@4&L!`"``6-@"```$P$``CB(`$(`@
+M"`C^($``!$!```(!$`"2)%%P:P$`(``($@,0`(H#0`0``Q`!_@%````$$`%^
+M@D`4>N)7A>K_)Y!K`0`@``!\'V%(V0(```!D"`#ZX5>!!``@`(9!0``&04`"
+M?D&`L&L!`"```)(D40!\'V!8V`(```"!00`2!A"``>0O!(#M"R"`#SC0:P$`
+M(``0$&X+!#X.$``V#A``.&YC)'Z.4Q`:#A`4'`X0&!X.$/!K`0`@`!P@#A`@
+M(@X0`?[?80!\'V#HN@(``!U`$(">TB\``*!A$&P!`"```'P_8A&S`@``A`@(
+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
+M`"``?!]@$'(!`"``D=T"```$``@`>N!7`14`(`!\?V"2W0(```1!4``!X5<P
+M<@$`(`"&#``@`(8A8`2(@`@(B`8(``'B5P(%`"`"B(`(!H@&"%!R`0`@```!
+MXE<"`P`@`(@@"`2(!@@`@>!7`@$`(`'^'V"````@<'(!`"``````4`!ZX%>"
+M`P`@!OYA0`%^04``?!]@D=T"```$``B0<@$`(````>%7A?/_)P!\'V"1W0(`
+M``0`"``!X5>!`P`@`80F"+!R`0`@``'^`&``>N!7@@$`(`+^`&``>N!7`0$`
+M(````%"````@T'(!`"```?X?8!``K@D4`,X)!(#M"R"`#S@8$&X+`()@8`"%
+MX%?P<@$`(`"*`P`@`((@0`"0(!@`@(!@`'KB5P(!`"``A>!7B_S_)Q!S`0`@
+M``"`@&``>N)7`0$`(`""`&"````@`(8!8`"`#S@``"!@,',!`"``````4`"&
+M85`!AI^```)"8`!ZX5>!```@`!`"&`'^04!0<P$`(```$&$8!/KA5XO[_R<`
+M@`\X`((@4`&"7X```$%@`'KA5W!S`0`@``$!`"``@@!@@`(`(`'^($``CB`8
+M!/K@5PS[_R<```!0D',!`"```(`/.`""8&``A>!7#`,`(`"$(!@`@(!@`'KB
+M5P(!`""P<P$`(```A>!7"?W_)P"`@&``>N)7`0$`(`""`&"````@`(8!8-!S
+M`0`@``"`#S@`!$%0`81_@`"`(6``^N!7`0$`(`"0`1@``@`@\',!`"```7XA
+M0`"00!@$>N%7"_O_)P"`#S@$/@X0`#8.$``X;F,0=`$`(``4?HY3$!H.$`'^
+M/V``?!]@I-L"```"0!``?+]AG+<"`#!T`0`@`"R%!@@`>N!7`0,`(`+^'V``
+M"]XO$/\&0`#\]2\```!04'0!`"``+(%&$````%"`4M@O@"+Z+P!\/V!`V@(`
+M`(``$!``K@EP=`$`(``$@.T+((`/.!00;@L$/@X0`#8.$``X;F,0?HY3`((@
+M4)!T`0`@``!\'V"DVP(```)`$(`:^B\`?#]@D-L"``"``!``(_POL'0!`"``
+M`'K@5P(&`"`!_C]@`'P?8$C6`@```D`0`?X?8`!$V"_0=`$`(``4_C]@`'P?
+M8*?:`@```D`0`?X?8(#VW2^`;^8O`OX_8/!T`0`@``!\'V"EVP(```)`$`!\
+M'V#(LP(`@.3U+P'^/V``?!]@$'4!`"``IML"```"0!`$@.T+((`/.!`0;@L$
+M/@X0`#8.$``X;F,P=0$`(``8?HY3$!H.$!0<#A```,!A``;Z+P`<`%``?#]@
+M"-L"`%!U`0`@`&!^`$``@``08'K@5PD'`"```OHO``"@80"_]R\`?#]@<'4!
+M`"``C-8"``2``!`!?@=0`(`&4`!\`&````"``'K@5P+Z_R>0=0$`(`````!0
+M@```(&!^`%`0`*X)%`#."02`[0L@@`\X&!!N"[!U`0`@``0^#A``-@X0`#AN
+M8Q1^CE,0&@X0``"@80&&'Q@`Q0`HT'4!`"```(`&$`!ZX%<!`@`@`88?&`!\
+M/V```"`(@'#1+P```%#P=0$`(``0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A``
+M.&YC%'Z.4Q!V`0`@`!`:#A```*!A@/X?0`"[`"@`@`80`'K@5P$"`""`_A]`
+M,'8!`"```'P_8```(`B`9M$O````4!``K@D$@.T+((`/.!00;@M0=@$`(``$
+M/@X0`#8.$``X;F,8?HY3$!H.$!0<#A```,!A`'P?8'!V`0`@`#2_`@```:`)
+M`)H&8`"O`"@```<0`'K@5P$"`"``F@9@D'8!`"```'P_8```(`B`6M$O````
+M4!``K@D4`,X)!(#M"R"`#SBP=@$`(``8$&X+!#X.$``V#A``.&YC+'Z.4Q`:
+M#A`4'`X0&!X.$-!V`0`@`!P@#A``FJ91`'Q?8&3*`@`,`"$(`/K@5P$V`"``
+M?#]@\'8!`"``1(T"``"!`!`'_A]@_(%-$`#_($`(``$(!'Y@@!```0@0=P$`
+M(```!D``](4-$/R!K0@#_A]@!/Y_8``(@E``@L!@@#_[+S!W`0`@````(&``
+M^N!7`BH`(`!\/V"4O`(`/(``"`!\0&@``@``4'<!`"``-(``"``$`!0(_A]@
+M_(%-$/B;#1`$_C]@`'Q?8'2I`@!P=P$`(`````$(``(`$`0`(`CP_R!@`?X@
+M:`0"`!```*!A"'X`0)!W`0`@`````1``?']@Q(L"`'C^(4```^!7C@``(``&
+M`1#T_TU`L'<!`"```'S?89"H`@`8``<(````"`@`)P@#_B"``(``0````1#0
+M=P$`(``0``<(``#@"0A^!T(`)-$O"``G"`'^($``@^=7C0``(/!W`0`@``">
+M(%```@@0`"/1+_2!30C\@:T(^('-"`/^'V``FB9@$'@!`"``"/Y_8`'^GV``
+M(OLO```@8`#ZX%>"#``@`'P_8)2\`@`P>`$`(``\@``(`'Q`:``"```T@``(
+M``0`%`!\7V!DR@(`"``!"%!X`0`@``%^`$`(``$0$'K@5P(!`"``FJ91"!H!
+M$`!\7V!DR@(`<'@!`"``#``A"/__`$`,``$0`+0$*```(&``^N!7@0(`($G^
+M'V"0>`$`(```!$%0`'D#*``!`"`C_C]@`((`8!``K@D4`,X)&`#N";!X`0`@
+M`!P`#@H$@.T+((`/."P0;@L$/@X0`#8.$``X;F,0?HY3T'@!`"```'P_8`(`
+M(`B`$M$O````4`2`[0L@@`\X$!!N"P0^#A#P>`$`(```-@X0`#AN8Q1^CE,0
+M&@X0$?Z_@0#_T"\`R"8("/X@:!!Y`0`@``""AA2`_]`O$`"N"02`[0L@@`\X
+M%!!N"P0^#A``-@X0,'D!`"```#AN8Q1^CE,0&@X0$?Z_@8#WT"\+_C]@`(*&
+M%`!\/V!0>0$`(``'!P```(*&%`#WT"\"_A]@@(?V+Q``K@D$@.T+((`/.'!Y
+M`0`@`!00;@L$/@X0`#8.$``X;F,0?HY3`'P?8`$`(`@`^]`OD'D!`"```'P`
+M8/_^__\`?#]@`0`@"(#YT"\$@.T+((`/.!`0;@NP>0$`(``$/@X0`#8.$``X
+M;F,0?HY3`'P?8`$`(`B`\]`O`'P_8-!Y`0`@`#2_`@``@2`(``(`<`!\/V`!
+M`"`(`/'0+P2`[0L@@`\X\'D!`"``$!!N"P0^#A``-@X0`#AN8Q1^CE,0&@X0
+M`'R_81@`,``0>@$`(`"`W=`O`(`F"`+^(&@`@@80`-[0+Q``K@D$@.T+((`/
+M.#!Z`0`@`!00;@L$/@X0`#8.$``X;F,4?HY3$!H.$`!\OV$8`#``4'H!`"``
+M@-70+P"`)@@!_B!H`((&$`#6T"\0`*X)!(#M"R"`#SAP>@$`(``4$&X+!#X.
+M$``V#A``.&YC$'Z.4P!\'V`!`"`(`-O0+Y!Z`0`@``!\`&@```"``'P_8`$`
+M(`B`V=`O!(#M"R"`#S@0$&X+L'H!`"``!#X.$``V#A``.&YC$'Z.4P!\'V`!
+M`"`(@-/0+P!\`&C0>@$`(````0```'P_8`$`(`@`TM`O!(#M"R"`#S@0$&X+
+M!#X.$/!Z`0`@```V#A``.&YC$'Z.4P!\'V`!`"`(`,S0+P!\/V`TOP(`$'L!
+M`"```($@"`"``&@`?#]@`0`@"(#)T"\$@.T+((`/.!`0;@LP>P$`(``$/@X0
+M`#8.$``X;F,4?HY3$!H.$`!\OV$8`#```+;0+U![`0`@``"`)@@`_"!H`(``
+M``""!A``MM`O$`"N"02`[0L@@`\X<'L!`"``%!!N"P!\'V`0`#``````"`!\
+M(&`/PP```((?4``"`&B0>P$`(``??@"(`(`/.`!\'V`0`#``````"`)^(&``
+M@A]0``(`:+![`0`@`!]^`(@`@`\X`'P?8!``,``````(!'X@8`""'U```@!H
+MT'L!`"``'WX`B`"`#S@`?!]@$``P``````@(?B!@`((?4``"`&CP>P$`(``?
+M?@"(`(`/.`0^#A``-@X0`#AN8Q1^CE,0&@X0``"@81!\`0`@``!\'V`0`#``
+M````"`%^(&``@A]0``(`:!]^`(@`>N!7,'P!`"``@0,`(`!\'V```"`(`*70
+M+P`:(&``@A]0``(`:!]^`(A0?`$`(``0`*X)!(#M"R"`#S@4$&X+`'P?8!``
+M,``````(`'P@8'!\`0`@``"`````@A]0``(`:!]^`(@`@`\X`'P_8!``,```
+M?!]@D'P!`"``W*D"``P!``@`@``0`(`/.`0^#A``-@X0`#AN8Q1^CE.P?`$`
+M(``0&@X0``"@80/ZYE>!!0`@@(?0+P7^1H``?#]@W*D"`-!\`0`@```"04`$
+M`2$(#`%A"`"`0`@`!D%P`(0`$`"%T"\```!0\'P!`"``$`"N"02`[0L@@`\X
+M%!!N"P0^#A``-@X0`#AN8Q1^CE,0?0$`(``0&@X0``"@80/ZYE>!!0`@@'O0
+M+P7^1H``?#]@W*D"`#!]`0`@```"04`$`2$(#`%A"`"`0`@`!D%H`(0`$`!Y
+MT"\```!04'T!`"``$`"N"02`[0L@@`\X%!!N"P0^#A``-@X0`#AN8Q1^CE-P
+M?0$`(``0&@X0`(*@801ZX%<%`0`@#_X?8``(`"`%?D"``'PA0)!]`0`@`-RI
+M`@``@2`(`(`@"`#\(&#___]_`GK@5X("`"`%_@"`L'T!`"``!?X_8(!JT2\`
+M@`80@```(`""!A````!0$`"N"02`[0O0?0$`(``@@`\X%!!N"P0^#A``-@X0
+M`#AN8QQ^CE,0&@X0%!P.$/!]`0`@`!@>#A```,!A`(*@80!\_V$$`#```%_0
+M+P"`)PC[_V!@$'X!`"``!7Y'@`!\(4#<J0(`"($@"`"&(&@`@@<0`%W0+P)Z
+MYU<P?@$`(``!`0`@`WKG5X(#`"`"_@:``!H`0`5^H(D">N=7`@$`(%!^`0`@
+M``#\IFD```"`!7Y'@`!\(4#<J0(``($`"``:`!``'`=@<'X!`"``@-'_+Q``
+MK@D4`,X)&`#N"02`[0L@@`\X'!!N"P0^#A"0?@$`(```-@X0`#AN8QQ^CE,0
+M&@X0%!P.$!@>#A```*!A`(+@8;!^`0`@```$P6$%_D:``'PA0-RI`@``@4`(
+M```!"`!\`&#___]_T'X!`"``$($@"``"`1`"^N97`0$`(`/ZYE>"`0`@!7X`
+M@`7^/V#P?@$`(```0]$O`(`'4```!Q``>N!7!?Y&@`!\(4#<J0(`'($@"!!_
+M`0`@`((``"``A"`8`(``0```!Q``F@9@`*__+Q``K@D4`,X),'\!`"``&`#N
+M"02`[0L@@`\X'!!N"P!\GV`0`#``!7Y`@`!\'V!0?P$`(`#<J0(```!A0`R!
+M`0@``$((``!!8`"$'U``!`!H'WX`B'!_`0`@``"``!``>N!7`0$`(`R!`0@`
+M``(0````4`"`#S@$/@X0D'\!`"```#8.$``X;F,\?HY3$!H.$!0<#A`8'@X0
+M'"`.$`""(%"P?P$`(`#H@PT0_/]-0`!\OV&4P`(`&/ZF0!R`)@CD_XU``'Q_
+M8-!_`0`@`)2\`@`H@`$(````"````A``?-]AU+P"`%``9PCD@0T(\'\!`"``
+M``8`4`1^`(@``^!7A0,`(``"`%````$0"(`B"````0@0@`$`(````^!7C@(`
+M(``!`"!`?@!`@/O_)P""(%```@$0_($-"#"``0`@``!ZX%>!N``@^/\-0O3_
+M[4$`?-]AU+P"``!\OV&4P`(`4(`!`"``@!70+QR`)@@#_D"`5``G"`"$8$``
+MA"````(($`2`(0AP@`$`(```@@<04'['0!C^ID``!$%0!(`B"`"$($`__B!@
+M!/Z`@)"``0`@````8P@`@B!0`(B!0``"`A`!?D%``7KA5X7Z_R<(@"((L(`!
+M`"```?X@4`B"`A`$@"((`?X@0#_^(&`$@@(0``G0+P""(%#0@`$`(```^N!7
+M`8P`(("H`"#YA2T(`'Q?8&3*`@`,``$(``(`0/"``0`@``P``1"`#]LO`(X`
+M(/J%#0C_?R!`^H--$`!ZX%<!C0`@$($!`"```'Q?8"RV`@`$`2$(!/Y@@`!\
+MGV#4VP(`$``""``&8$`P@0$`(``!_@!`!`$!$!!ZX%<"`0`@`((@4`0#`1`(
+MA`$(`7X`8%"!`0`@``!ZX%>"`@`@`'Q?8"RV`@```0$(`7X`0``!`1#ZA0T(
+M<($!`"``_W\@0/J#31``>N!7`O+_)X!^`"#T@:T)`/KF5P%]`""0@0$`(```
+MK=HO$(!&"`)ZX%>"%@`@#(`F"`"(``@T?@!``("`$+"!`0`@``*(``@T?@!0
+M`H"`$`"(``@``B!`S/]@0!"`1@CXB0`(T($!`"``"`"!$/J)``@*`($0_(D`
+M"`P`@1#RB0`(#@"!$/2)``CP@0$`(``0`($0]HD`"!(`@1#4A0`(``!!$-6%
+M``@!`$$0UH4`"!""`0`@``(`01#7A0`(`P!!$`S^`4`$``$0%`@!"#1^`%`4
+M`($0,((!`"``_HD`"!A^($``D``8R'K@5PP!`"`<`H$0``$`(`""(%!0@@$`
+M(```_O\G%@@A"`":!F"`KM@O^X6M"0!\GV#4VP(````""'""`0`@```:`$``
+M``(0$'K@5P4!`"`0?@!0```"$``#[R\``"!@D((!`"```/K@5P)Q`"#[A:T)
+M`'S?89"H`@`P``<(``#@"2``QPFP@@$`(`"`R<\O```G"`":($``@^=7C0``
+M(`">(%```@<0@,C/+]""`0`@`/J%#0@`>N!7@5,`(`'^'V"`N_XO@%``(/2!
+MK0D4_N9!\((!`"```)X'8("O!"C[A:T)`'R?8-3;`@````((`!H`0````A`0
+M@P$`(``0>N!7!0$`(!!^`%````(0^X6M"0!\WV&0J`(`,``'"#"#`0`@````
+M``H@`,<)@+C/+P``)P@`FB!```/H5XT``"``H"!04(,!`"````('$("WSR_Z
+MA0T(`'K@5X$"`"`!_A]@@*K^+P``(&!P@P$`(```^N!7`E4`(`!\7V!DR@(`
+M#``!"`!ZX%>!/0`@`?X?8)"#`0`@``#\)T```@``H($`$`!\'V!X5@``I($`
+M$`7^'V#P@4T0L(,!`"```)XG8`@``0@$?F"`$``!"``&0`#HA0T0]/Y_0`!\
+MWV'0@P$`(`!TJ0(````'"``&`!`$`&`(\/]A8`0&`!#P@:T(`_X?8/"#`0`@
+M`/3^?T``"()0``S#4("E^2\``"!@`/K@5X)"`"``?']@$(0!`"``E+P"`#R`
+M`0@`?"!H``(``#2``0@``@`4!OX?8/"!31`PA`$`(`#T@:T)[)L-$```!P@`
+M`*!A"'X`0```!Q``?%]@Q(L"`%"$`0`@`'A^(4```^!7C@``(``$!Q#H_TU`
+M`'S?89"H`@`8``<(<(0!`"``````"`@`)P@#_B"``(``0````1`0``<(``#@
+M"0A^!T*0A`$`(`"`C<\O"``G"`'^($``@^=7C0``(`">(%```@@0@(S/+["$
+M`0`@`.B!30CP@:T([('-"`/^'V``FB9@"/Y_8`'^GV"`B_DOT(0!`"`````@
+M8`#ZX%>"*``@`'Q_8)2\`@`\@`$(`'P@:``"``#PA`$`(``T@`$(``(`%`!\
+M7V!DR@(`"``!"`%^`$`(``$0$'K@5Q"%`0`@``(!`"``@B!0"`(!$`!\7V!D
+MR@(`#``!"/]_`$`,``$0,(4!`"``@!T#*(`&`"#XA0T(!7K@5XT5`"`"?H"!
+M`'R&`52%`0!0A0$`(`````8X/V```&%@```W8```?&$``'QA``"Z8``````@
+M8'"%`0`@``#ZX%<"%0`@_/]-0`!\OV&4P`(`&/ZF0!R`)@CD_XU`D(4!`"``
+M`'Q_8)2\`@`H@`$(````"````A``?-]AU+P"`%``9PBPA0$`(`#D@0T(``8`
+M4`1^`(@``^!7A0,`(``"`%````$0"(`B"-"%`0`@`````0@``^!7C@(`(``!
+M`"!`?@!`@/O_)P""(%```@$0\(4!`"``_($-"`!ZX%>"1_\G`'Q?8"RV`@``
+M`0$(`'K@5P$$`"`0A@$`(`"`TNXO```@8`#ZX%<!`@`@/_X?8``$05"`Q@$H
+M@```(#"&`0`@`````%`0`*X)%`#."1@`[@D<``X*!(#M"R"`#S@\$&X+4(8!
+M`"``!#X.$``V#A``.&YC$'Z.4X!3SR\`!$%0`'P_8%+>`@!PA@$`(```A$`0
+M`?Y?8`!\/V",V@(``(1`$(!1SR\$_C]@`'P?8)"&`0`@`.#?`@```D`0`'P_
+M8/S<`@``?!]@Y-\"```"`!`!_A]@L(8!`"```?X_8(#`Z2\`?!]@=-H"````
+M``@$@.T+((`/.!`0;@O0A@$`(``$/@X0`#8.$``X;F,4?HY3$!H.$`!#SR\`
+MFJ91`'P_8/"&`0`@`%+>`@``FD`0`?Y?8`!\/V",V@(``(1`$`!!SR\`?!]@
+M$(<!`"``X-\"```:0!`"_A]@$`"N"02`[0L@@`\X%!!N"P0^#A`PAP$`(```
+M-@X0`#AN8R!^CE,0&@X0%!P.$!@>#A`<(`X0``"@85"'`0`@``'^'V(`?!]@
+M=+("```@0!``?/]AC-H"``"$!P@`>N!7<(<!`"```0(`(`":!F``@B!0`"+Q
+M+P`4`"``?-]A4MX"```$!PB0AP$`(```>N!7`0,`((`LSR\`@B!0``)'$`"@
+M1Q``+<\O@`X`(+"'`0`@``":!F``Y`HH```@8`#ZX%<!#``@$(`&"#P```@0
+M?@!`T(<!`"```/GJ+P!ZX%<!"0`@`?X_8`!\'V#@W`(```(`$`!\'V#PAP$`
+M(`!TV@(`````"`)ZX%>!!``@````4`!7WR\`#@`8`'K@5Q"(`0`@``(!`"`$
+M_A]@@`(`(````%"``0`@`'P?8'3:`@`````(,(@!`"``$`"N"10`S@D8`.X)
+M'``."@2`[0L@@`\X(!!N"P0^#A!0B`$`(```-@X0`#AN8QQ^CE,0&@X0%!P.
+M$!@>#A```,!A`'P?8'"(`0`@`(S:`@``!``(`'K@5X$!`"``'`=@`?X_8(``
+M\2\0`*<)D(@!`"``#OX&0`#(ZB\``.!A`/KG5P$"`"``G@=@`!PG8`"B["^P
+MB`$`(```"0`@`!P'8`"$ZB\``.!A`'P?8#2O`@`````(`7K@5]"(`0`@``(%
+M`"``^N=7`00`(`3^'V``*=@O`?X_8`!\'V#8WP(`\(@!`"````(`$`'^'V"`
+M9.DO``KJ+P#ZYU>!&``@`((@4`!\'V`0B0$`(`#<WP(```(`$`'^/V``?!]@
+MX-P"```"`!`\@$8(`'P_8#")`0`@`&#9`@`4"&$(!(@`"`"!X5<"!0`@$@AA
+M"`*(``@`@>%74(D!`"```@,`(!`(00@`B``(``'A5P(!`"`!_A]@@```(```
+M`%!PB0$`(```>N!7@@H`("F$!@@`>N!7`@D`(``<!V"`-``H`'R_89")`0`@
+M`'3:`@``@B!0`((&$``<!V``L?\O`(`&$`1ZX%>"`P`@L(D!`"``!/X?8(`.
+MV"\`?#]@Z+H"`!"!``@!?@!`$($`$`!\OV'0B0$`(`!TV@(``(`&"!``K@D4
+M`,X)&`#N"02`[0L@@`\X'!!N"_")`0`@``0^#A``-@X0`#AN8Q!^CE,`?%]@
+MW-\"````(0@!_B!`$(H!`"````(!$`!\7V#@W`(```!!"`!ZX5<!`@`@1OK@
+M5P(!`"`PB@$`(`"`'P`H@`$`(`!\'V!TV@(`````"`2`[0L@@`\X$!!N"U"*
+M`0`@``0^#A``-@X0`#AN8Q1^CE,0&@X0``"@80""(%``?!]@<(H!`"``U-\"
+M```"`!``?!]@X-P"```"`!``?!]@\-P"```"0!"0B@$`(```?%]@C-H"```$
+M`0@`>N!7`0$`(``"01``R>8O`/WF5["*`0`@````"`""`P`@`?X_8`!\'V!<
+MW@(```)`$`!\'V`&MP(`T(H!`"````)`$(`AZB\&_A]@$`"N"02`[0L@@`\X
+M%!!N"P!\7V#PB@$`(``&MP(```0!"`!ZX%<!`0`@`((@4``"01`!_C]@`'P?
+M8!"+`0`@`.BZ`@`!`T`0`((@4`!\'V`\KP(```(`$````%``@`\X,(L!`"``
+M!#X.$``V#A``.&YC%'Z.4Q`:#A```*!A`((@4`!\'V!0BP$`(`#4WP(```(`
+M$`!\'V#@W`(```(`$`!\'V#PW`(```)`$'"+`0`@```.ZB\`?!]@8-D"`!@$
+M``@`>N!7@0$`(````%``+=XOD(L!`"``@!_K+P`_ZR\`@B!0`'P?8-C?`@``
+M`@`0`/P&8````0"PBP$`(```>N!7`@$`((+ZYE<"`0`@!?X?8(```"`"_A]@
+M$`"N"="+`0`@``2`[0L@@`\X%!!N"P'^/V``?!]@<-H"```"0!``?!]@\(L!
+M`"``=-H"``````@`@`\X!#X.$``V#A``.&YC$'Z.4P!\'V`0C`$`(`",V@(`
+M``0`"`!ZX%<"`0`@(/X?8(#`UR\```!0`-+>+S",`0`@```.`!@`>N!7`0$`
+M(````%"`"P`@`'P?8%/>`@``!``(4(P!`"```'K@5X('`"``?#]@Z+H"``R!
+M``@!?@!`#($`$`""(%!PC`$`(```?!]@C-H"```"0!`!_A]@`-3B+R#^'V``
+MM-<O@(SF+Y",`0`@```!`"`(_A^``++7+P3^'V`$@.T+((`/.!`0;@L$/@X0
+ML(P!`"```#8.$``X;F,4?HY3$!H.$```H&$`?!]@C-H"```$``C0C`$`(```
+M>N!7`@$`("#^'V"`J=<O`'P?8(S:`@``!``(`'K@5_",`0`@`($)`"``?!]@
+M4]X"```$``@`>N!7`0$`(`C^'X"`H]<O$(T!`"``@/G8+P!ZX%<!`0`@!/X?
+M8(`?`"``?!]@6-X"```$``@PC0$`(``!>N!7@AL`(`;^'V``'``@`'P?8,#<
+M`@``!``(`'K@5U"-`0`@``$&`"``?!]@;=P"```$``@`>N!7@@,`(("3XB\`
+M?!]@<(T!`"``Q-P"``!\/V!LW`(``(0@"``2X"\`?!]@<-H"```$``B0C0$`
+M(```>N!7@0$`(`":!F``LO\O@`\`(`!\'V#@W`(`````"+"-`0`@``!ZX%>!
+M!0`@````4`"@WB\`#@`8`'K@5P()`""`]/8OT(T!`"```'P_8$#:`@`H@``0
+M@)/@+P#G_R<`?#]@U-\"``"```CPC0$`(``!?@!``(``$`1ZX%>+`P`@`!#K
+M+P!ZX%<!`0`@`_X?8!".`0`@`(`!`"````!0@```(`'^'V`0`*X)!(#M"R"`
+M#S@4$&X+,(X!`"``!#X.$``V#A``.&YC$'Z.4R#^'V"`?-<O`'P?8.#<`@!0
+MC@$`(``````(`'K@5P$#`"````!0@(O>+P!ZX%<"`0`@!/X?8'".`0`@`(`!
+M`"``?!]@=-H"``````@$@.T+((`/.!`0;@L$/@X0D(X!`"```#8.$``X;F,0
+M?HY3`'P_8(S:`@``A"`(`/K@5P$!`""PC@$`(``!_C]@`#OP+P!\'V!TV@(`
+M````"`2`[0L@@`\X$!!N"]".`0`@``0^#A``-@X0`#AN8Q!^CE,`3.\O`'P?
+M8!&S`@``!``(\(X!`"```'K@5P$#`"``?#]@Z+H"``B!``@!?@!`"($`$``'
+M`"`0CP$`(```?!]@4]X"```$``@`>N!7`00`(`!\/V#HN@(`!($`"#"/`0`@
+M``%^`$`$@0`0`?X?8`""(%``K^@O`/[I+P!\'V!TV@(`4(\!`"``````"`2`
+M[0L@@`\X$!!N"P0^#A``-@X0`#AN8Q1^CE-PCP$`(``0&@X0`'R_86BU`@``
+MA`8(`'K@5P$$`"`!_A]@`&;>+Y"/`0`@```.`!@`>N!7@@8`(````%``@$80
+M``0`(`#;ZB\`>N!7L(\!`"``@0,`(`'^'V"`8-XO``X`&`!ZX%<"`0`@!/X?
+M8(```"#0CP$`(`````!0$`"N"02`[0L@@`\X%!!N"P0^#A``-@X0`#AN8_"/
+M`0`@`!A^CE,0&@X0%!P.$`":IE$`?!]@U-\"```:`!``?!]@$)`!`"``X-P"
+M```:`!``?!]@\-P"```:0!``?-]A4MX"```$!P@PD`$`(```>N!7`04`((`8
+MSB\`&D<0`?Y?8`!\/V",V@(``(1`$%"0`0`@```8SB\`?!]@X-\"```:0!`"
+M_A]@$`"N"10`S@D$@.T+<)`!`"``((`/.!@0;@L"_A]@`(`/.`0^#A``-@X0
+M`#AN8Q1^CE.0D`$`(``0&@X0````4`!\OV&,V0(``(`&$`'^'V`$@`80`'P?
+M8+"0`0`@`*W<`@``!$`(`'KA5P$"`"``?#]@*+`"`#3^!D``%LXOT)`!`"``
+M`'P?8*W<`@``!$`(`'R_88S9`@!6A$80````4%B`AA#PD`$`(`!:@(807("&
+M$%Z`AA!@@(808H"&$&2`!A`/_A]@:("&$!"1`0`@``_^'V"`0OPO:H"&$`_^
+M'V``5OPO;H"&$!``K@D$@.T+,)$!`"``((`/.!00;@L0`&`(1X0!"`!ZX%<"
+M(@`@``B"4#6(01!0D0$`(``NB($0`'P?8.C*`@``"``(('X`8`!ZX%<!`P`@
+M$H@`"'"1`0`@`"!^`&``>N!7`0$`($.(01```0`@`?X?8$.`01`!A`$(D)$!
+M`"```'K@5P$'`"`"A`$(0(!!$``(@E!!B$$0`'K@5XP%`""PD0$`(``#?H"`
+M``""0``(@D``?`)`8-4"`.\%``A!@$$0@`$`(-"1`0`@```(@E!`B$$008A!
+M$``(@E!)B$$0:HB@"$B*01`#_A]@\)$!`"``-X!!$$R(@1!*B$$02XA!$"B(
+M01`LB($0`GKA5P(#`"`0D@$`(``%_A]@*H"!$`7^'V`V@$$0,(B!$(`!`"`)
+M_E]@*H2!$#"2`0`@`#:`01`(A`$(`7X`8`!ZX%>!-@`@`?X?8$B`01`#_A]@
+M4)(!`"``-H!!$``T`"!*A$$(-H0!"``!X5>++0`@``B"4$J(01!PD@$`(`!(
+MA,$(:HB@"`".`A@`#>!7"@@`($B*01`"_A]@`'P_8)"2`0`@`/S6`@``@$`0
+M"?Y?8`!\/V#^U@(``(2`$`S^7V``?#]@L)(!`"```-<"``"$0!`W@$$02XA!
+M$``9`"!+A`$(-X1!"``!X5?0D@$`(``)%@`@:(@@"`!\'V!LV@(```@`"``"
+M`&``#D`8``(#&/"2`0`@```.(!@`^N!7@0,`(``"`6``>N!7`@(`(`""`!@`
+M#B`8$),!`"```/K@5X+\_R<`^N!7`@0`(`!\'V!LV@(```@`"`]ZX%<PDP$`
+M(``!`0`@2(0A"(```"`!_C]@2()!$`+^'V``?#]@_-8"`%"3`0`@``"`0!`)
+M_E]@`'P_8/[6`@``A(`0#/Y?8`!\/V``UP(`<),!`"```(1`$#>`01``"()0
+M2XA!$``!`"````%0-X!!$"J((0B0DP$`(``IA`$(`(`@4`"00!@LB`$(!8`?
+M4``0@!@`!>)7"@(`(+"3`0`@``)ZXE<*`@`@-H!!$(`"`"`">N%7"P$`(`+^
+M'V``_?\GT),!`"``-H)!$$>$`0@&>N!7`@(`(``(@E`UB$$0+HB!$``!`"#P
+MDP$`(``!_A]@28!!$``(@E!,B($0`(`/.`0^#A``-@X0`#AN8Q"4`0`@`!1^
+MCE,0&@X0`'R_8>S*`@``F@9@`((@4#C^7V"`Z\XO,)0!`"```'P?8+JZK=X`
+M@`80./X?8`:`AA``?!]@`P`@<0B`!A!0E`$`(``0`*X)!(#M"R"`#S@4$&X+
+M!#X.$``V#A``.&YC)'Z.4W"4`0`@`!`:#A`4'`X0&!X.$!P@#A`@(@X0```@
+M8@""P&$`!`%BD)0!`"``@(W-+P``X&$`?+]A"*D"``"!1@@(>N%7!@8`(`1^
+M(8"PE`$`(```FB!`!*,`$`B=`!"`"P`H`(%&"`1^(8``FB!`#($`$-"4`0`@
+M`!"A`!`!?@%``($&$`">!V``ALTO`!P'8!``K@D4`,X)\)0!`"``&`#N"1P`
+M#@H@`"X*!(#M"R"`#S@D$&X+`?X_8`!\'V`0E0$`(`#(J0(```,`$`"`#S@$
+M/@X0`#8.$``X;F,8?HY3^/\-0#"5`0`@``#M]2_X@0T(!(#M"R"`#S@8$&X+
+M!#X.$``V#A``.&YC4)4!`"``$'Z.4P'^'V``@B!0`'Q?8`!]````AF%0@*;G
+M+P2`[0MPE0$`(``@@`\X$!!N"P0^#A``-@X0`#AN8Q!^CE,!_A]@`'P_8)"5
+M`0`@`(!N`@``?%]@P'L```"&85"`G^<O!(#M"R"`#S@0$&X+L)4!`"``!#X.
+M$``V#A``.&YC$'Z.4P'^'V``@B!0`'Q?8`!]``#0E0$`(```AF%0`)GG+P``
+M`%``?#]@@&H!``!\7V``&0```(9A4/"5`0`@`("5YR\$@.T+((`/.!`0;@L$
+M/@X0`#8.$``X;F,0?HY3$)8!`"```'P?8$BQ`@`(_C]@``1!4`"\\"\$@.T+
+M((`/.!`0;@LPE@$`(``$/@X0`#8.$``X;F,0?HY3@!+I+P!ZX%<!`@`@G``@
+M"%"6`0`@``B```@$?@!H"(``$`2`[0L@@`\X$!!N"P0^#A``-@X0<)8!`"``
+M`#AN8RQ^CE,0&@X0%!P.$!@>#A``FJ91`!S'40!\'V"0E@$`(`!(V0(`````
+M"``!YU<*'@`@`?Z_80`<)T``G"!``OX@@+"6`0`@``!\'V!8V`(``(#@00B`
+M!P@!>N!7@@4`(`2`)P@(@``(T)8!`"``!'X`:`B``!`$@"<(`(``"!``(`@`
+M``!0,H"`$`":IE'PE@$`(`"`$``@`GK@5X(``"``FJ91`!PG0`"<($`"_B"`
+M`'P?8!"7`0`@`%C8`@``@.!!!(`G"`B```C[?P!@"(``$`2`)P@`@``(,)<!
+M`"``$``@"#*(``@!?@!``!!`&#*`@!`R>N%7@@4`(`2`)PA0EP$`(```@``(
+M$``@""2```B`JNDO!(`G"`"```@0`"`()(``"'"7`0`@``+^/V``V=4O`7['
+M00!\'V!(V0(`````"``!YU<+XO\GD)<!`"```/KF5X$``""`8-TO`)JF40!\
+M_V%0V0(``!S'40"`!PBPEP$`(```>N!7`0\`(!````@@`$`("``A"`+^`&``
+M>N!7`0P`(-"7`0`@``3^`&``>N!7@@H`(`""(%``F^!7"@0`(`+^`(``@`U`
+M\)<!`"``\`$`"``!X5>!`0`@`?X@0`";X%<+_/\G`)O@5P($`"`0F`$`(``"
+M_@:``(`-0/`%`!`!_J9!```!"!````A@?@!``'_<+S"8`0`@``%^QT$$_N=!
+M!'KG5XOM_R<`IO4O`'P_8$#:`@`8@``04)@!`"```$7?+Q``K@D4`,X)&`#N
+M"02`[0L@@`\X+!!N"P0^#A!PF`$`(```-@X0`#AN8Q!^CE,`?!]@2+$"``3^
+M/V``!$%0@&[P+Y"8`0`@``""(%``?!]@3-D"```"`!`$@.T+((`/.!`0;@L$
+M/@X0L)@!`"```#8.$``X;F,L?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A#0F`$`
+M(``D)`X0*"8.$```8&(`FJ91$(#)"0`<)V(T_@A"(/[H0?"8`0`@`"2`2`H8
+MB`@(`7K@5X*2`"``>N=7`@(`('#^'V``?#]@$)D!`"``N@8````,!R@`?"=`
+M``(``,J%``CW?P!@RH%`$````%`PF0$`(``8@(@0@(L`(`!\/V#TK`(``(``
+M"`%^`$``@``0`'P?8%"9`0`@`&[:`@``"``(`'K@5X(,`"``?!]@X,@"```(
+M``@#>N!7<)D!`"``@@,`(`'^'V``?#]@`'T```!\7V!`"P```(9A4``$`""0
+MF0$`(``$>N!7@0,`(`'^'V``?#]@0`L```!\7V``?0```?Y_8+"9`0`@`(`=
+MYR\!_C]@`'P?8&[:`@```H`0&@@("`Z()P@``@!0T)D!`"```!"@&0B$"`@!
+M?@!@`'K@5P$$`"``?#]@'*T"``"```CPF0$`(```&@!``(``$`!\'V`@K0(`
+M``H`(`R`*0@`B``(``(`0!":`0`@``P(``@`?>!7AX$```(#`"``?#]@^-8"
+M``"```@`&@!`,)H!`"```(``$``%`"``?#]@!*T"``"```@`&@!``(``$`!\
+M'V!0F@$`(``(K0(`%`0H"`":1F``I]@O%(A("`!\/V!PK0(``(``"'":`0`@
+M```$`$``@``0%`0H"&H("0@`@>!7`@0`((H("0@```!`D)H!`"`````I0':(
+M``@`&@!`=H"`$````%!T`(D0`(`'"`"F*6"PF@$`(`"`"^0O`'K@5P("`"!T
+M_A]@`'P_8`H'``"`U08H`*8)8-":`0`@`("#]R\`I@E@`'_D+P!\'V!(L0(`
+M`OX_8``$05"`(O`O\)H!`"```&``(!0$*`AJ"`D(`('@5P()`""*"`D(````
+M0!@(2`@0FP$`(````"E`@(@`"``$`$"`@(`0B@@)"````$`8"$@(```I0#";
+M`0`@`':(``@```%`=H"`$!@(2`AT""D(``(!0'0`B1`8"$@(4)L!`"```'P_
+M8'2M`@``@``(``0`0`"``!``?!]@>*T"`!0$*`APFP$`(`"`A-@O`'P_8)"M
+M`@``@``(`7X`0`"``!!T""D(`'P?8)";`0`@``#7`@``!``(`('@5XL"`"`!
+M_A]@`((@4(!:ZR\```!0L)L!`"``=`")$`Z()P@:"`@(``/@5P$"`"`.@(<0
+M````4`F`1Q#0FP$`(``,@(<0%@0H"`B$!P@``@!`"(!'$!8$*`@)A`<(`(``
+M0/";`0`@``F`1Q``#@`8"H@G"``#X%<*`@`@"(0("`%^`&``>N!7$)P!`"``
+M@0T`(`!\/V",K0(``(``"`%^`$``@``0`(`'"`"F*6`PG`$`(`"`V^,O`'K@
+M5P("`"!T_A]@`'P_8%('``"`I08H`*8)8%"<`0`@`(!3]R\`I@E@`$_D+P!\
+M'V!(L0(``OX_8``$05"`\N\O<)P!`"```?X?8`""(%"`0.LO@"X`(!8$*`@,
+MB`<(`(``0`R`AQ"0G`$`(```$``8!7K@5PL.`"``?!]@%*\"``````@`>N!7
+M`0<`(+"<`0`@``J()P@)A`<(`(``4`5ZX%>)!``@!(`G"`2```@`?`!HT)P!
+M`"````@```2``!``@"<("(``"`)^`&@(@``0````4`R`AQ#PG`$`(```@"<(
+M"(``"`A^`&@(@``0!OX?8!,`2!"``0`@@_X?8!"=`0`@`!,`2!`!_K]A%@0H
+M"!<$"`@``@!`%P!($`#ZYE>!`@`@,)T!`"``!(`G"`"F"6`!_E]@`'_^+P`3
+M`"``?!]@2+$"``+^/V!0G0$`(```!$%0@-7O+P`0`"````!0$P!($(#[_R<#
+M_A]@$P!($'"=`0`@```-`"`#_A]@$P!($(#X_R=T_A]@`'P_8+4'````?08H
+MD)T!`"````D`(!,$"`CR>N!7`?G_)_%ZX%>!^?\G`WK@5X'U_R>PG0$`(`")
+M`@`@`7K@5P&G_R<">N!7@6[_)P#W_R<%>N!7@?'_)]"=`0`@`/!ZX%<!\O\G
+M@/3_)P#ZYE<"`0`@`*8)8(`@]R\`F@9@\)T!`"``@```(````%`0`*X)%`#.
+M"1@`[@D<``X*(``N"B0`3@H0G@$`(``H`&X*!(#M"R"`#S@L$&X+!#X.$``V
+M#A``.&YC,'Z.4S">`0`@`!`:#A`4'`X0&!X.$!P@#A#\_TU``'R_893``@`D
+M_H9`4)X!`"``*(`F"/#_;4``?!]@E+P"`#@```@````(`(`!$`!\WV%PG@$`
+M(`#4O`(`>`!G"/"!#0@`!@!0!'X`B``#X%>%`P`@``(`4)">`0`@`````1`(
+M`"((```!"``#X%>.`@`@``$`($!^`$"`^_\GL)X!`"```((@4``"`1#\@0T(
+M`'K@5P%C`"#X_PU"]/_M00!\WV'0G@$`(`#4O`(``'R_893``@``1,PO*(`F
+M"`/^0(!\`"<(`(1@0/">`0`@``"$(````@@0!(`A"`""!Q!X?L=`)/ZF0``$
+M05`$@"(($)\!`"```(0@0#_^(&`$_H"```!C"`""(%``B(%```("$`%^04`P
+MGP$`(``!>N%7A?K_)PB`(@@!_B!0"(("$`2`(@@!_B!`/_X@8%"?`0`@``2"
+M`A"`-\PO`((@4`#ZX%<!-P`@@%``(`!\/V"0J`(`<)\!`"``$(``"```P`D`
+M@*`)`##,+P"`)@@!_B!```/G5XT``""0GP$`(```G"!0`((&$``OS"\`?%]@
+M9,H"`````0@!?@!````!$+"?`0`@`!!ZX%<"`0`@`((@4``"`1``?#]@++8"
+M``B!``@!?@!`T)\!`"``"($`$`+^'V"`'/LO```@8`#ZX%>"0``@]($-"`""
+M(%#PGP$`(``(`@`0`"(`(`!\7V!DR@(````!"`%^`$````$0$'K@5Q"@`0`@
+M``(!`"``@B!0``(!$`!\/V"0J`(`$(``"```P`D`@*`),*`!`"``@!G,+P"`
+M)@@!_B!```/G5XT``"``G"!0`((&$(`8S"]0H`$`(``"_A]@``W[+P``(&``
+M^N!7`C$`(/2!#0@`@B!0"`(`$'"@`0`@``P"`!``$@`@`'Q?8&3*`@````$(
+M`7X`0````1`0>N!7D*`!`"```@$`(`""(%```@$0`'P_8)"H`@`0@``(``#`
+M"0"`H`FPH`$`(`"`"<PO`(`F"`'^($```^=7C0``(`"<(%``@@80@`C,+]"@
+M`0`@``+^'V``_?HO```@8`#ZX%<"(0`@^(4-"`IZX%<"#0`@\*`!`"``]($-
+M"`!ZX%>!"P`@!`@@"`#ZX%<!`0`@`+GC+P`)`"`0H0$`(`#V_C]`!`*`$(`'
+M`"#XA0T(!'X`4`9ZX%>-!0`@`GZ`@3"A`0`@``!\A@$\H0$````&.-IG``!6
+M:```_F<``%9H```>:```4*$!`"``5F@``!YH``#\_TU``'R_893``@`D_H9`
+M*(`F"/#_;4!PH0$`(```?!]@E+P"`#@```@````(`(`!$`!\WV'4O`(`>`!G
+M")"A`0`@`/"!#0@`!@!0!'X`B``#X%>%`P`@``(`4````1`(`"((L*$!`"``
+M```!"``#X%>.`@`@``$`($!^`$"`^_\G`((@4``"`1#0H0$`(`#\@0T(`'K@
+M5P*=_R>`V>HO```@8`#ZX%<!`@`@1?X?8/"A`0`@```$05``3?XO@```(```
+M`%`0`*X)%`#."1@`[@D<``X*$*(!`"``!(#M"R"`#S@P$&X+!#X.$``V#A``
+M.&YC)'Z.4Q`:#A`PH@$`(``4'`X0&!X.$```P&$`@N!A`'P?8`D`(`B`X\LO
+M`GX`8%"B`0`@``"`OU$`@*9I'_ZFB?S_+4``?%]@E+P"`"0``0@`0``(<*(!
+M`"```7X`8`!ZX%<!_A]@`@``4`"``!#X_RU`-``!"`!```B0H@$`(``!?@!@
+M`'K@5P'^'V`"``!0`(``$`">!V`!_C]@@'@(*+"B`0`@``!\/V``X`(``(``
+M$`""(%``>N!7@0$`(`"`!P@*>N!7T*(!`"``A0``(`'^/V``!$%0`/KF5X$(
+M`"``?']@[+L"``2``0CPH@$`(```>N!7`08`(`"``0@`>N!7@@0`(/R!#0@`
+M>N!7`@,`(!"C`0`@`/B!#0@`>N!7@@$`(`#ZX%>!```@`?Y?8``$!Q````!0
+M,*,!`"``$`"N"10`S@D8`.X)!(#M"R"`#S@D$&X+`((@4`!\'V!0HP$`(`#L
+MNP(`!`(`$`"`#S@$/@X0`#8.$``X;F,8?HY3$!H.$'"C`0`@`!0<#A`%?B"`
+M`(`@4`+^((``@"!``_Z@@0```%``(OLOD*,!`"`````@8`#ZX%<"#@`@`?X?
+M8(`?^R\``"!@`/K@5X(+`""PHP$`(```?!]@OVD````(]B\`FB9``_X?8`!"
+M^R\``"!@`/K@5]"C`0`@``('`"``?-]A@-X"`````%``'"=@`"_[+P``!P@`
+M&@!`\*,!`"```'P@4/P#```"_A]@`#O[+P``(&``^N!7`0(`(&O^'V`0I`$`
+M(```!$%0``G^+X```"````!0$`"N"10`S@D$@.T+((`/.#"D`0`@`!@0;@L$
+M/@X0`#8.$``X;F,D?HY3$!H.$!0<#A`%?B"`4*0!`"```(`@4`+^((``@"!`
+M`_[`@0```%`!_C]@@"W[+P!\OV%PI`$`(`"`W@(``(`&"``<`$``?"!0_`,`
+M`/C_34`"_A]@@#_[+Y"D`0`@````(&``^N!7`B8`(`"`!@@``#]0Z`,``/B!
+M#0@``L!!L*0!`"```!P'8'W^/Y@`BLPO``"@807^!H``&@!0`GX`@``:`$#0
+MI`$`(``#?@"````'4```/U#H`P``](,-$`3ZX%<.`0`@````4/"D`0`@`(`<
+M^R_T@2T(`_K@5XX$`"#T_RU`````4(`*^R\``"!@$*4!`"```/K@5X(6`"#T
+M@2T(`_K@5XW[_R<```!0??X_F``5^R\PI0$`(````"!@`/K@5P(2`"`!_A]@
+M^OX_F``2^R\``"!@`/K@5U"E`0`@``(/`"`#_A]@`'P_8`!]``"`#OLO```@
+M8`#ZX%>""P`@<*4!`"``^OX_F`!\'V`TM@(```(`$````%``[_HO```@8`#Z
+MX%>0I0$`(``"!P`@`?X?8(#L^B\``"!@`/K@5X($`"``?!]@2@```+"E`0`@
+M``#)]2_\_RU``OX?8``P^R\``"!@`/K@5P$"`"!L_A]@T*4!`"````1!4`#1
+M_2\``P`@`'P?8`#@`@```"`(`)H&8(#.!RCPI0$`(`````!0$`"N"10`S@D$
+M@.T+((`/."00;@L!_C]@`'P?8!"F`0`@`.R[`@```@`0`(`/.`""(%``?!]@
+M[+L"```"`!``@`\X,*8!`"``!#X.$``V#A``.&YC&'Z.4P"D\2\`?#]@C-8"
+M`""``!!0I@$`(`"`'``H`%+++_S_#4#X_RU``'?_+P!ZX%>!`@`@````4'"F
+M`0`@`";^/V``!$%0@+S]+X!4!2C\@2T(`/K@5X$$`"#X@0T(D*8!`"```)G_
+M+P!ZX%>!`@`@````4";^/V``!$%0@+;]+X!.!2BPI@$`(```2,LO_($M"`#Z
+MX%<!!P`@`'P_8`0`,```@``(!'X`:-"F`0`@``"``!`!_O\?____?____W__
+M__]_____?____W____]_\*8!`"``____?X```"`!_O\?_($M"`#ZX%<!Y_\G
+M@#O++_B!#0@0IP$`(```I/\O`'K@5X$"`"````!0)OX_8``$05"`IOTO@#X%
+M*#"G`0`@```XRR\`X?\G!#X.$``V#A``.&YC''Z.4Q`:#A`4'`X04*<!`"``
+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
+M``!4:P```FL```5K```(:P``4*T!`"``$`"N"02`[0L@@`\X%!!N"P0^#A``
+M-@X0`#AN8R!^CE-PK0$`(``0&@X0%!P.$!@>#A`<(`X0``"@80#ZYE<!?P`@
+M`)K&89"M`0`@``B`I@D```!0"``'$``<!V"`M=TO``#`80!ZYU>!>0`@L*T!
+M`"```"`(4@P`!P@`"$`(```A0`!\_V'8L0(`-(,'$`(``0#0K0$`(`#\?@!@
+M@'K@5XME`"`!.``@`&H`(`!\/V#HK0(``(``"/"M`0`@``%^`$``@``0@&P`
+M(`!\/V#PK0(``(``"`%^`$``@``0$*X!`"``@&D`(("I\"\`?#]@C-8"`#R`
+M`!``?#]@!*X"``"```@PK@$`(``!?@!``(``$`'^'V(`?!]@Z-8"``````@`
+M>N!7@6,`(%"N`0`@`#2!)P@4B&`(!`A`"`"%X5<"!0`@$HA@"`((0`@`A>%7
+M<*X!`"```@,`(!"((`@`"``(`('@5P(!`"`!_A]@@```(````%"0K@$`(```
+M>N!7@5H`(`'^'V``?/]AV+$"`!R!1Q``'`=@`%+4+["N`0`@`(`7`"``?#]@
+M"*X"``"```@!?@!``(``$``<!V``I],OT*X!`"``@%(`(("1\"\`?#]@C-8"
+M`#B``!``?#]@#*X"``"```CPK@$`(``!?@!``(``$`'^'V(`?!]@Z-8"````
+M``@`>N!7@4L`(!"O`0`@`#2!)P@4B&`(!`A`"`"%X5<"!0`@$HA@"`((0`@`
+MA>%7,*\!`"```@,`(!"((`@`"``(`('@5P(!`"`!_A]@@```(````%!0KP$`
+M(```>N!7@4(`(`'^'V``?/]AV+$"`!R!1Q``'`=@`,#3+W"O`0`@`````&(`
+M?#]@[-8"``"$``@`>N!7@3P`(````%``@$`0D*\!`"```'P?8,RV`@``DNXO
+M@#D`(`!\7V#\K0(````!"`%^`$"PKP$`(`````$0$/X`0`"^XR\`?!]@Z-8"
+M``````@`>N!7@0L`(-"O`0`@`!@$(`@`^N!7`0H`(#2!)P@4B&`(!`A`"`"%
+MX5<"!0`@\*\!`"``$HA@"`((0`@`A>%7`@,`(!"((`@`"``(`('@5P(!`"`0
+ML`$`(``!_A]@@```(````%``>N!7`0$`(``<!V``"]XO`!P'8#"P`0`@``'^
+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
+M7V"CV@(```0!"`%ZX%<0OP$`(``!!``@`?X?8```01`%_A]@O($&$`_^'V#`
+M@080`&[_+S"_`0`@````X&$`.<@O`'R_84RS`@`<A28(`'Q?8*/:`@```D$0
+M4+\!`"``(($F"+R#!A`D@28(P(,&$`!\/V"AV@(``(0@"`#ZX%=POP$`(``"
+M`0`@`((@4,6#1A``?#]@H=H"``"$(`@`^N!7@0(`()"_`0`@``!\OV%,LP(`
+MQ(4F"`#ZX%>!)``@`'R_84RS`@#$A28(L+\!`"```/K@5X$!`"`!_O]A`((@
+M4,2#1A#__U]@`'P_8)"U`@#0OP$`(```A``0@"?(+P!\OV%,LP(`+/\&0("(
+M["\`?!]@`-L"`/"_`0`@````(`@`^N!7`0$`(`">!V``@@`X`'P?8.C6`@``
+M```($,`!`"```'K@5X$!`"`8!``(`'K@5X(``"``_M8O`OX?8`",W"\PP`$`
+M(```@B!0`'R_84RS`@`K@T80`'P?8.C6`@`````(`'K@5U#``0`@`($"`"`8
+M!``(`'K@5P$!`"`5_C]@@```(`[^/V``?!]@<,`!`"``I]H"```"0!``?!]@
+M!-L"```$``@`>N!7`@4`(`!\'V"0P`$`(`"?V@(```0`"`!ZX%>"`@`@`'R_
+M84RS`@#&A08(`'K@5[#``0`@`(&>_R<`?+]A3+,"`(#_!D``;>PO`)S_)P`)
+MR"^`9O\OT,`!`"``@)K_)P0^#A``-@X0`#AN8Q!^CE,`?!]@3+("`(!G["_P
+MP`$`(`````!0!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC)'Z.4Q#!`0`@`!`:
+M#A`4'`X0&!X.$!P@#A`@(@X0``"@80""P&$`F@9@,,$!`"```"C,+P``(&`!
+M_A]@``1!4`!0WR\``"!B`/KH5X$0`"!0P0$`(```HNAA`/KF5X$-`"``_>97
+M[`$```X!`"#V_A]"@```('#!`0`@``":!F("H(<0%/X?8`"`AQ````!0$(`'
+M$`"(!P@`'@!`D,$!`"```!PG8``@2&"`_,<O`"#'00R`YPD`&^A7!0$`(`":
+MIE&PP0$`(`"````@`*"F40#ZYU<!`0`@`/KF5X+R_R<`H@A@`((@4-#!`0`@
+M``#TT"\0`*X)%`#."1@`[@D<``X*(``N"@2`[0L@@`\X\,$!`"``)!!N"P0^
+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
+M`0`@`(!UQB]=A`8(`WX`8`-ZX%<"`0`@'OX_8(```"`8_C]@\,T!`"``>H*&
+M$`"(!P@``@!``("'$`*(!P@``@!0`H"'$!2(!@@0S@$`(````@!0%("&$``-
+M`"`(_A]@7(!&$````%!=@$80"(@&"##.`0`@`&"`AA`*B`8(8H"&$`R(!@AD
+M@(80`'P_8)2V`@``B``(4,X!`"``9H"&$`*(``AH@(80!(@`"&J`AA`(B`8(
+M;("&$`J(!@APS@$`(`!N@(80#(@&"'"`AA`8_C]@>H*&$`3^7V``A`8(`'K@
+M5Y#.`0`@`($!`"`!!`<(0'X`:`$`1Q`!A`8(`'K@5P$!`"`(?@%`L,X!`"``
+M`!!`&`B$!@@!?@!@`'K@5X$!`"````!04H!&$(`(`"#0S@$`(``!_A]@4H!&
+M$!R(!@@`>N!7`@$`(!2(!@@``@!```0`0/#.`0`@```00!@`?!]@4+D"`$0)
+M``@``>%7"P$`(`'^'V"````@$,\!`"``````4%&`1A````!04X!&$%2`1A!.
+M@(80$`"N"10`S@DPSP$`(``8`.X)!(#M"R"`#S@<$&X+!#X.$``V#A``.&YC
+M%'Z.4U#/`0`@`!`:#A``?!]@--L"``````@`?#]@.-L"``"`(`B`!=PO<,\!
+M`"````"@80!\'V`HVP(`````"``:X*<`?!]@,-L"``````B0SP$`(```?`!0
+MX`$```!RH$$`_"9`X`$```!\'V!,VP(```(`$+#/`0`@``/^'V``F]HO`)H&
+M8`'^/V``3_(O`OX_8`!\'V!0VP(`T,\!`"````(`$!``K@D$@.T+((`/.!00
+M;@L$/@X0`#8.$``X;F/PSP$`(``0?HY3`'P?8`7?`@``!``(`'K@5P$%`"`%
+M_A]@`)3:+Q#0`0`@`````%"`I^8O`((@4`!\'V#>V@(`%`)`$`""(%``@M,O
+M,-`!`"```?X_8`!\'V`(WP(```(`$`2`[0L@@`\X$!!N"P0^#A!0T`$`(```
+M-@X0`#AN8Q!^CE,`?!]@!=\"```$``@`>N!7`00`('#0`0`@``'^'V"`F^8O
+M`?X_8`!\'V#>V@(`%`)`$`""(%``=M,OD-`!`"``!?X?8`!_VB\`@B!0`'P?
+M8`C?`@```@`0!(#M"R"`#SBPT`$`(``0$&X+!#X.$``V#A``.&YC$'Z.4P!\
+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
+M@-H"``"`(`@`A"```((`.```P&&PW`$`(```@`8(`'K@5P$6`"`$@"8(`_X`
+M4`5ZX%>-#0`@@`X`(-#<`0`@``!\/V#0L@(`6($`"`!ZX%>!"@`@`(!'"`)Z
+MX5>!`@`@\-P!`"```'P?8(S:`@``!``(`'K@5X$&`"``?#]@T+("`%2!``@0
+MW0$`(``!?@!`5($`$`!\/V"8K0(``(``"`%^`$``@``0`(`&"##=`0`@`("1
+MS2^`!@`@`(`&"(`RW"\`!0`@`GZ`@0!\A@%4W0$`4-T!`"`````&.#1W```T
+M=P``3G<``%MW``!.=P``6W<```!\_V%PW0$`(`!TV@(``(!'"``%YU<!!``@
+M`)P'$`)^)X``?!]@A-H"`)#=`0`@``````@``@````(`.``&`"``>N%7`@4`
+M(`2`)@@&^N!7L-T!`"``@@,`(`!\'V#TL`(```0`"`!ZX%<!`0`@````4`#E
+MTR_0W0$`(```?/]A=-H"``"`1P@"?B&``'P?8(C:`@`````(``(``/#=`0`@
+M```"`#@``,!A`(!'"``%YU>!`P`@`)P'$`)^)X``?!]@$-X!`"``A-H"````
+M``@``@````(`.!``K@D4`,X)&`#N"02`[0LPW@$`(``@@`\X'!!N"P0^#A``
+M-@X0`#AN8QA^CE,0&@X0%!P.$%#>`0`@``!\OV'0L@(`'(%&"`-^(8``?-]A
+MY+\"``"<8$`$@2$(<-X!`"``!`(`$`"!(0@``@`0`%#$+QR!1@@#?B&```B"
+M4`"<8$"0W@$`(``$B0$0`(D!$"2!)@C__R!`)(,&$`%^04`$?H&1&WZ&B;#>
+M`0`@```$)D`?_B!@`)@@4!R#!A``2L0O$`"N"10`S@D$@.T+T-X!`"``((`/
+M.!@0;@L$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A#PW@$`(````,!A$``'"`Y^
+M`$``^]\O``"@80#ZYE<!`@`@`)H&8!#?`0`@```<)V``.N$O``@`(``<!V``
+MM]\O``"@80#ZYE>!!0`@,-\!`"```'P?8'3:`@`````(!'K@5P$#`"``F@9@
+M@+KA+P'^/V!0WP$`(```?!]@\-P"```"0!``F@9@$`"N"10`S@D$@.T+((`/
+M.'#?`0`@`!@0;@L`?+]@@-H"``"``A``?!]@A-H"```"`!``?!]@D-\!`"``
+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
+M`1`0`&$($(8`$```(@@``^%7D.4!`"```@,`(!B`(0@`^N!7@0``(!B(`1`0
+M`&$(``8"$$``;0BPY0$`(````"$((/X@0``"`1`\`"T(`(/A5P4"`"``@B%0
+M_/]@8-#E`0`@`#@`+0@`@F%``(`A"`#ZX%<!!``@$`(!$!2`(`@4`@$0\.4!
+M`"``$(0`$`"`(0@4A``0&`8!$``"`"`0!`$0%`0!$!@&`1`0Y@$`(```A`$0
+M`(I"8`#ZYE>"Y?\G!'Z"0`%^QT$@>N=7#M3_)S#F`0`@``'^YU$L`"T(`)X@
+M0"P"#1`P`"T(`/K@5P$!`"``GB!04.8!`"``,`(-$```H!\0`*X)%`#."1@`
+M[@D<``X*!(#M"R"`#SAPY@$`(``@$&X+!#X.$``V#A``.&YC)'Z.4Q`:#A`4
+M'`X0&!X.$)#F`0`@`!P@#A`@(@X0````8@""P&$!_K]A`)[G40"@'P@``0!(
+ML.8!`"````$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&#0Y@$`(```
+M@*`?____?P!ZYU<!`0`@__\_8H```"``HBA20`!M"/#F`0`@`#P`+0@`@^%7
+MA0``(#@`;0@`@"$(`/K@5X$*`"`!_N=!$.<!`"```()`8```(0@@^N!7C@$`
+M("#^(%``FB!`@```(`":)F`PYP$`(```>N=7@0$`(`"CX%<&`@`@``$`(`"C
+MX%>.```@`((@8E#G`0`@`!``00@`@"$(``/A5X+V_R<$_F%``?ZF02#ZYE<.
+M\/\G<.<!`"````"@'P#ZYU<!`0`@`"(($``!`"````!0```($`">!V"0YP$`
+M(``0`*X)%`#."1@`[@D<``X*(``N"@2`[0L@@`\X)!!N"[#G`0`@``0^#A``
+M-@X0`#AN8Q!^CE,`?!]@)+$"``",YR\```!0T.<!`"``!(#M"R"`#S@0$&X+
+M!#X.$``V#A``.&YC$'Z.4P!\'V#PYP$`(``%WP(```0`"`!ZX%<"`@`@>OX?
+M8`!\/V!:`@```"W]+Q#H`0`@``!\7V`LWP(````!"`!\`&````"``'K@5X$"
+M`"``?#]@,.@!`"``,-\"``"$``C_?P!``(!`$`!\7V`LWP(````!"````$!0
+MZ`$`(`````$0`'P_8"G?`@``A"`(`/K@5X$#`"`!?@!````!$'#H`0`@``!\
+M/V`PWP(``(0`"`%^`$``@$`0`'P_8##?`@``A``(D.@!`"``&GK@5PL'`"``
+M?#]@,M\"``"(``@!?@!``!!`&`"`@!"PZ`$`(``>>N%7`@4`(````%``?#]@
+M--\"``"`@!`"_A]@``P`(-#H`0`@`````%``?#]@,M\"``"`@!``?#]@,-\"
+M``"$``@&>N!7\.@!`"``"04`(`!\/V`TWP(``(@`"`%^`$``$$`8`("`$&1Z
+MX5<0Z0$`(``"`P`@`?X?8(`"`"````!0`'P_8#3?`@``@(`0````4##I`0`,
+M``2`[0L@@`\X$!!N"P`4`@`@``0^#A``-@X0`#AN8Q!^CE,`1@`H`'K@5X(!
+M`""`>P`H(!0"`"```'K@5X$!`"`$@.T+((`/.!`0;@N`E/<O@/W_)P0^#A!`
+M%`(`(```-@X0`#AN8Q!^CE,`?>!7`/("`(P``"``F?<O`/3_+V`4`@`@``!Z
+MX%>!```@`)?W+P2`[0L@@`\X$!!N"P0^#A``-@X0@!0"`"```#AN8Q!^CE,`
+M?#]@`/,"``!\'V`"`@``B(``$`!\'V"@%`(`(`#\=0```GY`@`!\'V"QC```
+M`GX`@``$0$``?!]@D,`"`,`4`@`@```$X*>4\@`0`'P?8`,`('&,@``0!?X?
+M8)"``!"`@_@OX!0"`"```'K@5X$``"``A_<O`?X?8`"#^"^`;.$O!(#M"R"`
+M#S@`%0(`(``0$&X+!#X.$``V#A``.&YC''Z.4Q@:#A``@H!@!7Y`@"`5`@`@
+M``!\?V!TO0(``(3!0`)^((``@"!``_X@@`"`(%`"_B"`0!4"`"```/P`0$BD
+M`@`0?B-``(1!``0`8P@`?+]@2(P"``"(@D!@%0(`(``(`*,(#`##"`":IE$0
+M&@X0`?[_8!0.#A``#.-@`/CA+X`5`@`@``!ZX%<"`0`@`)H&8(```"`C_A]@
+M&`"N"02`[0L@@`\XH!4"`"``'!!N"P0^#A``-@X0`#AN8QQ^CE,0&@X0%!P.
+M$!@>#A#`%0(`(``!_K]A`'P_8'2]`@`(@,`)!?X&@`!\/V!TO0(```+@0>`5
+M`@`@```"````>N!7`08`(`":!F``'"=@@.'_+P``(&``^N!7`!8"`"```0(`
+M(#C^'V``!$%0`,KO+P`#`"`(@`<(`!S`00'^ID$@%@(`(``&^N97!?7_)P``
+M`%`0`*X)%`#."1@`[@D$@.T+((`/.$`6`@`@`!P0;@L$/@X0`#8.$``X;F,8
+M?HY3$!H.$!0<#A`1_K^!8!8"`"```'S?800`,```?%]@$/8"``!\/V`4]@(`
+M`'P?8`BH`@"`%@(`(`````$0`'P?8,BH`@``@``0@,[O+P`WO2\+_A]@`("&
+M%*`6`@`@``!\'V`'!P```("&%`'^'V````<4`*/G+P!\'V!1````P!8"`"``
+M`,7G+P!\'V!*````@*7G+P!\'V#\=0``@,GG+P!\'V#@%@(`(``\=0``@+'G
+M+P!\'V""=```@*CG+P!\'V!_=0```+;G+P`7`@`@``#TU"^`=0,H```@8`#Z
+MX%<"$``@````4`!PYR\``"!@(!<"`"```/K@5X(-`"`!_A]@@&WG+P``(&``
+M^N!7`@L`(`+^'V!`%P(`(```:^<O```@8`#ZX%>""``@`_X?8(!HYR\``"!@
+M`/K@5V`7`@`@``(&`"````!0??X_F`#-["\``"!@`/K@5P(#`"`!_A]@@!<"
+M`"``^OX_F`#*["\``"!@`/K@5P$"`"`U_A]@``1!4`"8[R^@%P(`(`"````@
+M`((`8!``K@D4`,X)!(#M"R"`#S@8$&X+!#X.$,`7`@`@```V#A``.&YC$'Z.
+M4X!=`R@``"!@`/K@5P$"`"`V_A]@X!<"`"````1!4`"/[R^````@````4`2`
+M[0L@@`\X$!!N"P0^#A``&`(`(```-@X0`#AN8Q!^CE.`.`,H!(#M"R"`#S@0
+M$&X+!#X.$"`8`@`@```V#A``.&YC$'Z.4X"9`2@`>N!7@0$`(#;^'V`&_C]@
+M0!@"`"```!\`(("=`B@`>N!7@0$`(#;^'V`'_C]@`!P`(````%!@&`(`(`"`
+M$.HO```@8`#ZX%<"%0`@`?X?8``.ZB\``"!@`/K@5X`8`@`@`((2`"`#_A]@
+M@`OJ+P``(&``^N!7`A``(`+^'V``">HOH!@"`"`````@8`#ZX%>"#0`@@"CL
+M+X"A`2@`>N!7@0$`(#;^'V#`&`(`(``)_C]@@`X`(`#"`B@`>N!7@0$`(#;^
+M'V`(_C]@@`L`(.`8`@`@``#9`BB`Z0(H`/0"*``,`"@``"!@`/K@5X(#`"`#
+M_A]@`!D"`"```'P_8`!]``"`F>PO```@8`#ZX%<!`0`@-OX?8(`#`"`@&0(`
+M(`"`0>PO@"GL+X`P["^`-^PO`"#L+P```%```0`@``1!4$`9`@`@`(!C[R\$
+M@.T+((`/.!`0;@L`?!]@>*D"``!\/V``\P(`8!D"`"``@(``$`!\'V!$KP(`
+MA(``$`!\GV#$B@(``'\"0`!\7V"`&0(`(`#4VP(`$``!$!#^?V`4!@$0`((@
+M4`P"`1``@@!@"``!$*`9`@`@``0``1````$0``@"8`!\7V!DR@(`$``!$!0&
+M`1`,`@$0P!D"`"```((`8`@``1`$``$0```!$````%``@`\X!#X.$``V#A#@
+M&0(`(```.&YC*'Z.4Q`:#A`4'`X0&!X.$!P@#A`@(@X0```@8@`:`@`@``""
+MH&$`GN=1````4/R!#1``(`A2````4`""(%``!$%0(!H"`"``@-P`*```(&``
+M^N!7`G<`(`'^'V"`S``H````4`'^/V!`&@(`(```!$%0`-@`*```(&``^N!7
+M@G(`(`'^'V``R``H`?X?8&`:`@`@``'^/V``!$%0@-,`*```(&``^N!7`FX`
+M(`+^'V"`PP`H@!H"`"``````4`'^/V``!$%0`,\`*```(&``^N!7@FD`(`'^
+M'V"@&@(`(```OP`H````4`'^/V`!_E]@@,H`*```(&``^N!7`F4`(,`:`@`@
+M``'^'V"`N@`H`?X?8`'^/V`!_E]@`,8`*```(&``^N!7X!H"`"``@F``(`+^
+M'V``M@`H````4`'^/V`!_E]@@,$`*```(&``&P(`(```^N!7`EP`(`'^'V"`
+ML0`H````4`'^/V`!_E]@`+T`*"`;`@`@````(&``^N!7@E<`(`'^'V``K0`H
+M`?X?8`'^/V`!_E]@0!L"`"``@+@`*```(&``^N!7`E,`(`+^'V"`J``H````
+M4`'^/V!@&P(`(``!_E]@`+0`*```(&``^N!7@DX`(`'^'V``I``H````4(`;
+M`@`@``'^/V``!$%0@*\`*```(&``^N!7`DH`(`'^'V"`GP`HH!L"`"```?X?
+M8`'^/V``!$%0`*L`*```(&``^N!7@D4`(`+^'V#`&P(`(```FP`H!_[?80``
+M`%`!_C]@`)Y'8`"F`"@``"!@`/K@5^`;`@`@`()``"`!_A]@`)8`*`"<"(@!
+M?N!A````4`'^/V``GD=@`!P"`"``@*``*```(&``^N!7`CL`(`'^'V"`D``H
+M`?X?8`'^/V`@'`(`(```GD=@`)P`*```(&``^N!7@C8`(`+^'V``C``H_W_'
+M04`<`@`@``!ZYU<*\/\G````4`'^/V``GD=@`)8`*```(&``^N!78!P"`"``
+M@C``(`'^'V``A@`H````4`'^/V``!$%0@)$`*```(&"`'`(`(```^N!7`BP`
+M(/S_#4``BP`H```@8`#ZX%>"*0`@_($-"*`<`@`@``!ZX%<!`0`@)_X?8``K
+M`"`!_A]@@'P`*`'^'V`!_C]@P!P"`"````1!4`"(`"@``"!@`/K@5X(B`"`"
+M_A]@`'@`*`_^WV'@'`(`(`````!0`?X_8``$05``@P`H```@8`#ZX%>"'0`@
+M`?X?8``=`@`@``!S`"@```!0`?X_8``$05"`?@`H```@8`#ZX%<"&0`@(!T"
+M`"``_/\-0`!X`"@``"!@`/K@5X(6`"``(`A``!``&OR!#0A`'0(`(```$``8
+M`"#@:0"0!QH!_A]@`&D`*`'^'V`!_C]@``1!4&`=`@`@`(!T`"@``"!@`/K@
+M5P(/`"`"_A]@@&0`*/]_QT$`>N=7@!T"`"``BNO_)P```%`!_C]@``1!4(!N
+M`"@``"!@`/K@5P()`""@'0(`(``!_A]@@%X`*````%``@B!0``1!4`!J`"@`
+M`"!@`/K@5\`=`@`@`(($`"`!_A]@`%H`*`'^'V``@B!0``1!4(!E`"@``"!@
+MX!T"`"```/K@5P$"`"!A_A]@``1!4(#-[B\``@`@`OX?8(!3`"@`'@(`(```
+MGH80````4!``K@D4`,X)&`#N"1P`#@H@`"X*!(#M"R`>`@`@`""`#S@H$&X+
+M!#X.$``V#A``.&YC&'Z.4Q`:#A```*!A0!X"`"``_O\M0````%"`<?\O```@
+M8`#ZX%<!`@`@8OX?8``$05!@'@(`(`"`O^XO``4`(/Z)#0@(?@"0``X`&*5Z
+MX%<!`0`@!/X?8(`>`@`@`(```"`!_A]@`(`&$````%`0`*X)!(#M"R"`#S@8
+M$&X+H!X"`"``!#X.$``V#A``.&YC''Z.4Q`:#A`4'`X0``#`80":IE'`'@(`
+M(```>N=7#@H`(/[_+4``F@9@@&#_+P``(&``^N!7`0(`(.`>`@`@`&/^'V``
+M!$%0@*[N+X`%`"``FD9``'P?8%RJ`@```2`(`!\"`"``_HD-"`"$0$```($0
+M`?ZF00`;YU<-]O\G````4!``K@D@'P(`(``4`,X)!(#M"R"`#S@<$&X+!#X.
+M$``V#A``.&YC''Z.4T`?`@`@`!`:#A`4'`X0&!X.$```X&$`@B!0`(9A4`!\
+M'V#4K`(`8!\"`"````8`$`!\'V#8K`(```8`$`!\'V`HM0(```"@"0!\'V"`
+M'P(`(``HM`(``'S?85RJ`@```0<0!OX?8`0!!Q``F^!7!@4`(*`?`@`@``""
+M`$``?-]A7*H"```!1P@`AF%0```!0``&@!`!_B!`P!\"`"```)O@5P7[_R<`
+MG@=@`,O_+P``(&``^N!7`@8`(`"`!PC@'P(`(``!>N!7`0(`(`!\WV%<J@(`
+M!`$'$``1`"``F@9@`-3_+P`@`@`@````(&``^N!7`0(`(&3^'V``!$%0`(GN
+M+P`-`"``?-]A("`"`"``7*H"```!1PA"?@%`7_X_8(`?`"@(`8<0``%'"$`(
+M(0A`(`(`(````^!7`0(`(`7^'V`$`0<0`(`'$``%`"``?!]@V*P"`&`@`@`@
+M```:`!``?!]@U*P"```$`!`!_A]@!`$'$`"`!Q"`9,,O@"`"`"``````4!``
+MK@D4`,X)&`#N"02`[0L@@`\X'!!N"P1^CE.@(`(`(```!$%0``0.%`)^((``
+M@"!``_X@@`/^((@`!`X4`$`.",`@`@`@``"!X%<.`P`@`$`."`%^`$````X4
+M`$`."`"!X%<-_?\GX"`"`"``!'Z.0P"`#S@`?#]@0``P``"`(`@$_B"(`?X@
+M8``"`!``(0(`(`````!0`(`/.`!\?V!``#```((@0`"``&@"?B&``(``:"`A
+M`@`@`!=^`&``@`$0````4`"`#S@``$!@````4``(@E``^N!70"$"`"``C@,`
+M(``(8D`$!F$``(`!>``0`!@!?H)``(G@5XW\_R=@(0(`(```@`\X!#X.$``V
+M#A``.&YC$'Z.4X`0`"@`#@`8`((@4(`A`@`@``!\7V!PW@(```(!$`!\7V!T
+MW@(```(!$`3^?V``?%]@H"$"`"``L+8"`$@'@1!&`X$0``-!%`$#010`?%]@
+M9-X"```"013`(0(`(```?%]@9=X"```"010`?%]@9MX"```"010`?%]@;-X"
+M`.`A`@`@```"`10`?%]@:-X"```"`10$@.T+((`/.!`0;@L$/@X0`"("`"``
+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
+MK@D4`,X)&`#N"02`[0L@@`\X'!!N"P0^#A``-@X0`"L"`"```#AN8QA^CE,0
+M&@X0%!P.$`!\OV$PN`(`!/\&0$3_)D`@*P(`(`"`S-TO``[`&23_!D!4_R9`
+M@,K=+P`<`&@`#L`9`((@4$`K`@`@``!\'V"RW@(```)`$`!\'V"PW@(```*`
+M$`!\'V"NW@(`8"L"`"````)`$`"#1A``'`=@$`"N"10`S@D$@.T+((`/.!@0
+M;@N`*P(`(``!_C]@`'P?8*[>`@```D`0`((@4`!\'V"SW@(```)`$*`K`@`@
+M`````%``@`\X!#X.$``V#A``.&YC%'Z.4Q`:#A``?#]@P"L"`"``#+0"`+S_
+M`$``!$%0@,K>+P"`/U``@"!H'_Z@B0!\'V#@*P(`(``?70``@'7(+P!\'V!9
+M50```%W(+P""(%``?!]@$-L"```L`@`@```"`!``?!]@&-L"```"`!``?!]@
+M'-L"```"`!``?!]@("P"`"``%-L"```"`!`!_G]@`'P?8%#;`@``!@`0`?Y?
+M8`!\'V!`+`(`(``AVP(```1`$`!\'V`BVP(```1`$`!\'V`TVP(```8`$&`L
+M`@`@``!\'V`MVP(```)`$`!\'V`@VP(```)`$`!\'V`HVP(`@"P"`"````(`
+M$`!\'V!4VP(```(`$`!\'V"PVP(```)`$`!\'V"@+`(`(`#$VP(```)`$`!\
+M'V#%VP(```)`$`!\'V"EVP(```)`$,`L`@`@``!\'V#'VP(```)`$`!\'V#(
+MVP(```)`$`!\'V",VP(`X"P"`"````)`$`!\'V"4VP(```)`$`!\'V"HVP(`
+M``(`$`!\'V``+0(`(`"LVP(```(`$`":!F`0`*X)!(#M"R"`#S@4$&X+`((@
+M4"`M`@`@``!\'V#8L0(`-`,`$````%``@`\X!#X.$``V#A``.&YC0"T"`"``
+M('Z.4Q`:#A`4'`X0&!X.$!P@#A"`^/\O``[`&0!U_R]@+0(`(```'`!H``[`
+M&8"Q_R\`'`!H``[`&0!+_R\`'`!H``[`&8`M`@`@`(#$_R\`'`!H``[`&0!F
+M`"@`'`!H``[`&0"+_R\`'.!IH"T"`"```(['&0":IE$`?#]@N]H"``":0!`#
+M_A]@`8!`$#'^7V#`+0(`(``"A$`0,/X?8`.`0!`$A$`0`?X?8`!\/V"PV@(`
+M`(!`$.`M`@`@``7^'V`!@$`0`OX?8`*`0!`$_A]@`X!`$`O^'V`$@$`0`"X"
+M`"``%OX?8@6@0!`L_A]@!H!`$`!\'V"5VP(`"OY?8`!LNB\@+@(`(```?!]@
+MZ-8"```:`!``?!]@A-X"```:0!``?!]@I]H"`$`N`@`@```@0!``?!]@B-8"
+M```:`!``?!]@B-L"```:`!``?!]@8"X"`"``H-L"```:`!``?!]@B-X"```:
+M`!``?!]@C-X"```:`!"`+@(`(```?!]@D-X"```:`!``?!]@E-X"```:`!``
+M?!]@`-L"`*`N`@`@```:`!``?!]@F-X"```:`!``?!]@G-X"```>0!``'`=@
+MP"X"`"``$`"N"10`S@D8`.X)'``."@2`[0L@@`\X(!!N"P0^#A#@+@(`(```
+M-@X0`#AN8Q1^CE,0&@X0`+3S+P`.H!F`P?,O`!H`:``O`@`@```.H!D`C_\O
+M`!H`:``.H!D`?#]@G-X"``"$``@`&@!H("\"`"```(!`$`":!F`0`*X)!(#M
+M"R"`#S@4$&X+`'P_8(C6`@!`+P(`(```@``0`(`/.`!\/V"(VP(``(``$`"`
+M#S@`?#]@B-X"`&`O`@`@``"``!````!0`(`/.`!\/V"4W@(``(``$`"`#S@`
+M?#]@@"\"`"``\-8"``"``!``@`\X`'P_8`#;`@``@``0`(`/.`!\/V"@+P(`
+M(`"@VP(``(``$`"`#S@$/@X0`#8.$``X;F,4?HY3$!H.$,`O`@`@``":IE$`
+M?#]@B+$"`,#_`$"`-MTO`OXF@``$05``_`!`X"\"`"``4-D"```$`!`!_J9!
+M!/KF5PO\_R<`?!]@@&4``(#M_R\`,`(`(```?!]@C&4```#N_R\`?!]@*V8`
+M``#H_R\`?!]@&V8``"`P`@`@``#O_R\0`*X)!(#M"R"`#S@4$&X+!#X.$``V
+M#A``.&YC0#`"`"``$'Z.4P```%``AM`O`'P_8#"R`@#(_P!```1!4(`XWB]@
+M,`(`(```?!]@;A$``(#;_R\`?!]@AA$``(#B_R\`$M8O@$T`*(`P`@`@``2`
+M[0L@@`\X$!!N"P0^#A``-@X0`#AN8Q!^CE,`?!]@H#`"`"``1UP```#C_B\`
+M?!]@\Q```(#0_R\$@.T+((`/.!`0;@O`,`(`(``$/@X0`#8.$``X;F,8?HY3
+M$!H.$!0<#A``?-]AN+@"`.`P`@`@``!_!T!X?R=``?Y?8(`FWB\`#J`96'\'
+M0(Q_)T``!$%0`#$"`"```"3>+P`:`&@`#J`9`?X_8`!\'V`<WP(```(`$`""
+M(%`@,0(`(```?!]@\=X"```"0!``?!]@!-\"```"0!``?!]@#=\"`$`Q`@`@
+M```"0!``?!]@!=\"```"0!``?!]@*-\"```"0!``?!]@8#$"`"``,-\"```"
+M0!``?!]@,M\"```"@!``?!]@--\"```"@!"`,0(`(```?!]@#M\"```"0!``
+M?!]@#]\"```"0!``?!]@&-\"`*`Q`@`@```"0!``?!]@#-\"```"0!``?!]@
+M]-X"```"`!``F@9@P#$"`"``$`"N"10`S@D$@.T+((`/.!@0;@L`?#]@D*@"
+M``"```C@,0(`(````&`(#(8`$`B&`!`8@``(````"`!ZX%<"`0`@!OX?8``R
+M`@`@`(`5`"`4@``(````"`!ZX%<"`0`@!_X?8(`2`"`0@``((#("`"````!`
+M"`)ZX5<%`0`@`(7A5P4!`"`(_A]@@`X`(`2```A`,@(`(``````(``'A5PT!
+M`"`)_A]@@`L`(""```@``$`(+(0`$&`R`@`@`"B$`!`T@``(````"`!ZX%<"
+M`0`@"OX?8(`&`"`P@``(@#("`"````!@"``'X5<%`0`@"_X?8(`#`"`D@``(
+M````"`"!X5>@,@(`(``-`0`@#/X?8(```"````!0`(`/.````%``@`\X````
+M4,`R`@`@``"`#S@$/@X0`#8.$``X;F,4?HY3_/\-0("*_2\```!0X#("`"``
+M!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A``,P(`(```$L$O``"@
+M80#ZYE<!!0`@``[!+P%ZX%>"`P`@(X0&""`S`@`@``!\/V#0L@(`4(%`$$R!
+M``@!?@!`3($`$!``K@D$@.T+0#,"``@`((`/.!00;@L`>`(`(```````````
+M`````````````````````````````````"!X`@`@````````````````````
+M````````````````````````0'@"`"``````````````````````````````
+M``````````````!@>`(`(```````````````````````````````````````
+M`````(!X`@`@````````````````````````````````````````````H'@"
+M`"````````````````````````````````````````````#`>`(`(```````
+M`````````````````````````````````````.!X`@`@````````````````
+M`````````````````````````````'D"`"``````````````````````````
+M```````````````````@>0(`(```````````````````````````````````
+M`````````$!Y`@`@````````````````````````````````````````````
+M8'D"`"````````````````````````````````````````````"`>0(`(```
+M`````````````````````````````````````````*!Y`@`@````````````
+M````````````````````````````````P'D"`"``````````````````````
+M``````````````````````#@>0(`(```````````````````````````````
+M``````````````!Z`@`@````````````````````````````````````````
+M````('H"`"````````````````````````````````````````````!`>@(`
+M(````````````````````````````````````````````&!Z`@`@````````
+M````````````````````````````````````@'H"`"``````````````````
+M``````````````````````````"@>@(`(```````````````````````````
+M`````````````````,!Z`@`@````````````````````````````````````
+M````````X'H"`"``````````````````````````````````````````````
+M>P(`(````````````````````````````````````````````"![`@`@````
+M````````````````````````````````````````0'L"`"``````````````
+M``````````````````````````````!@>P(`(```````````````````````
+M`````````````````````(![`@`@````````````````````````````````
+M````````````H'L"`"``````````````````````````````````````````
+M``#`>P(`(````````````````````````````````````````````.![`@`@
+M`````````````````````````````````````````````'P"`"``````````
+M```````````````````````````````````@?`(`(```````````````````
+M`````````````````````````$!\`@`@````````````````````````````
+M````````````````8'P"`"``````````````````````````````````````
+M``````"`?`(`(````````````````````````````````````````````*!\
+M`@`@````````````````````````````````````````````P'P"`"``````
+M``````````````````````````````````````#@?`(`(```````````````
+M``````````````````````````````!]`@`@````````````````````````
+M````````````````````('T"`"``````````````````````````````````
+M``````````!`?0(`(```````````````````````````````````````````
+M`&!]`@`@````````````````````````````````````````````@'T"`"``
+M``````````````````````````````````````````"@?0(`(```````````
+M`````````````````````````````````,!]`@`@````````````````````
+M````````````````````````X'T"`"``````````````````````````````
+M````````````````?@(`(```````````````````````````````````````
+M`````"!^`@`@````````````````````````````````````````````0'X"
+M`"````````````````````````````````````````````!@?@(`(```````
+M`````````````````````````````````````(!^`@`@````````````````
+M````````````````````````````H'X"`"``````````````````````````
+M``````````````````#`?@(`(```````````````````````````````````
+M`````````.!^`@`@````````````````````````````````````````````
+M`'\"`"`````````````````````````````````````````````@?P(`(```
+M`````````````````````````````````````````$!_`@`@````````````
+M````````````````````````````````8'\"`"``````````````````````
+M``````````````````````"`?P(`(```````````````````````````````
+M`````````````*!_`@`@````````````````````````````````````````
+M````P'\"`"````````````````````````````````````````````#@?P(`
+M(`````````````````````````````````````````````"``@`@````````
+M````````````````````````````````````((`"`"``````````````````
+M``````````````````````````!`@`(`(```````````````````````````
+M`````````````````&"``@`@````````````````````````````````````
+M````````@(`"`"````````````````````````````````````````````"@
+M@`(`(````````````````````````````````````````````,"``@`@````
+M````````````````````````````````````````X(`"`"``````````````
+M````````````````````````````````@0(`(```````````````````````
+M`````````````````````""!`@`@````````````````````````````````
+M````````````0($"`"``````````````````````````````````````````
+M``!@@0(`(````````````````````````````````````````````("!`@`@
+M````````````````````````````````````````````H($"`"``````````
+M``````````````````````````````````#`@0(`(```````````````````
+M`````````````````````````."!`@`@````````````````````````````
+M`````````````````(("`"``````````````````````````````````````
+M```````@@@(`(````````````````````````````````````````````$""
+M`@`@````````````````````````````````````````````8(("`"``````
+M``````````````````````````````````````"`@@(`(```````````````
+M`````````````````````````````*""`@`@````````````````````````
+M````````````````````P(("`"``````````````````````````````````
+M``````````#@@@(`(```````````````````````````````````````````
+M``"#`@`@````````````````````````````````````````````((,"`"``
+M``````````````````````````````````````````!`@P(`(```````````
+M`````````````````````````````````&"#`@`@````````````````````
+M````````````````````````@(,"`"``````````````````````````````
+M``````````````"@@P(`(```````````````````````````````````````
+M`````,"#`@`@````````````````````````````````````````````X(,"
+M`"``````````````````````````````````````````````A`(`(```````
+M`````````````````````````````````````""$`@`@````````````````
+M````````````````````````````0(0"`"``````````````````````````
+M``````````````````!@A`(`(```````````````````````````````````
+M`````````("$`@`@````````````````````````````````````````````
+MH(0"`"````````````````````````````````````````````#`A`(`(```
+M`````````````````````````````````````````."$`@`@````````````
+M`````````````````````````````````(4"`"``````````````````````
+M```````````````````````@A0(`(```````````````````````````````
+M`````````````$"%`@`@````````````````````````````````````````
+M````8(4"`"````````````````````````````````````````````"`A0(`
+M(````````````````````````````````````````````*"%`@`@````````
+M````````````````````````````````````P(4"`"``````````````````
+M``````````````````````````#@A0(`(```````````````````````````
+M``````````````````"&`@`@````````````````````````````````````
+M````````((8"`"````````````````````````````````````````````!`
+MA@(`(````````````````````````````````````````````&"&`@`@````
+M````````````````````````````````````````@(8"`"``````````````
+M``````````````````````````````"@A@(`(```````````````````````
+M`````````````````````,"&`@`@````````````````````````````````
+M````````````X(8"`"``````````````````````````````````````````
+M````AP(`(````````````````````````````````````````````""'`@`@
+M````````````````````````````````````````````0(<"`"``````````
+M``````````````````````````````````!@AP(`(```````````````````
+M`````````````````````````("'`@`@````````````````````````````
+M````````````````H(<"`"``````````````````````````````````````
+M``````#`AP(`(````````````````````````````````````````````."'
+M`@`@`````````````````````````````````````````````(@"`"``````
+M```````````````````````````````````````@B`(`(```````````````
+M`````````````````````````````$"(`@`@````````````````````````
+M````````````````````8(@"`"``````````````````````````````````
+M``````````"`B`(`(```````````````````````````````````````````
+M`*"(`@`@````````````````````````````````````````````P(@"`"``
+M``````````````````````````````````````````#@B`(`(```````````
+M``````````````````````````````````")`@`@````````````````````
+M````````````````````````((D"`"``````````````````````````````
+M``````````````!`B0(`(```````````````````````````````````````
+M`````&")`@`@````````````````````````````````````````````@(D"
+M`"````````````````````````````````````````````"@B0(`(```````
+M`````````````````````````````````````,")`@`@````````````````
+M````````````````````````````X(D"`"``````````````````````````
+M````````````````````B@(`(```````````````````````````````````
+M`````````""*`@`@````````````````````````````````````````````
+M0(H"`"````````````````````````````````````````````!@B@(`(```
+M`````````````````````````````````````````("*`@`@````````````
+M````````````````````````````````H(H"`"``````````````````````
+M``````````````````````#`B@(`(```````````````````````````````
+M`````````````."*`@`@````````````````````````````````````````
+M`````(L"`"`````````````````````````````````````````````@BP(`
+M(````````````````````````````````````````````$"+`@`@````````
+M````````````````````````````````````8(L"`"``````````````````
+M``````````````````````````"`BP(`(```````````````````````````
+M`````````````````*"+`@`@````````````````````````````````````
+M````````P(L"`"````````````````````````````````````````````#@
+MBP(`(`````````````````````````````````````````````",`@`@````
+M````````````````````````````````````````((P"`"``````````````
+M``````````````````````````````!`C`(`(```````>%8T$@``````````
+M`````````````````````&",`@`@````````````````````````````````
+M````````````@(P"`"``````````````````````````````````````````
+M``"@C`(`(````````````````````````````````````````````,",`@`@
+M````````````````````````````````````````````X(P"`"``````````
+M````````````````````````````````````C0(`(```````````````````
+M`````````````````````````""-`@`@````````````````````````````
+M````````````````0(T"`"``````````````````````````````````````
+M``````!@C0(`(````````````````````````````````````````````("-
+M`@`@````````````````````````````````````````````H(T"`"``````
+M``````````````````````````````````````#`C0(`(```````````````
+M`````````````````````````````."-`@`@````````````````````````
+M`````````````````````(X"`"``````````````````````````````````
+M```````````@C@(`(```````````````````````````````````````````
+M`$".`@`@````````````````````````````````````````````8(X"`"``
+M``````````````````````````````````````````"`C@(`(```````````
+M`````````````````````````````````*".`@`@````````````````````
+M````````````````````````P(X"`"``````````````````````````````
+M``````````````#@C@(`(```````````````````````````````````````
+M``````"/`@`@````````````````````````````````````````````((\"
+M`"````````````````````````````````````````````!`CP(`(```````
+M`````````````````````````````````````&"/`@`@````````````````
+M````````````````````````````@(\"`"``````````````````````````
+M``````````````````"@CP(`(```````````````````````````````````
+M`````````,"/`@`@````````````````````````````````````````````
+MX(\"`"``````````````````````````````````````````````D`(`(```
+M`````````````````````````````````````````""0`@`@````````````
+M````````````````````````````````0)`"`"``````````````````````
+M``````````````````````!@D`(`(```````````````````````````````
+M`````````````("0`@`@````````````````````````````````````````
+M````H)`"`"````````````````````````````````````````````#`D`(`
+M(````````````````````````````````````````````."0`@`@````````
+M`````````````````````````````````````)$"`"``````````````````
+M```````````````````````````@D0(`(```````````````````````````
+M`````````````````$"1`@`@````````````````````````````````````
+M````````8)$"`"````````````````````````````````````````````"`
+MD0(`(````````````````````````````````````````````*"1`@`@````
+M````````````````````````````````````````P)$"`"``````````````
+M``````````````````````````````#@D0(`(```````````````````````
+M``````````````````````"2`@`@````````````````````````````````
+M````````````()("`"``````````````````````````````````````````
+M``!`D@(`(````````````````````````````````````````````&"2`@`@
+M````````````````````````````````````````````@)("`"``````````
+M``````````````````````````````````"@D@(`(```````````````````
+M`````````````````````````,"2`@`@````````````````````````````
+M````````````````X)("`"``````````````````````````````````````
+M````````DP(`(````````````````````````````````````````````""3
+M`@`@````````````````````````````````````````````0),"`"``````
+M``````````````````````````````````````!@DP(`(```````````````
+M`````````````````````````````("3`@`@````````````````````````
+M````````````````````H),"`"``````````````````````````````````
+M``````````#`DP(`(```````````````````````````````````````````
+M`."3`@`@`````````````````````````````````````````````)0"`"``
+M```````````````````````````````````````````@E`(`(```````````
+M`````````````````````````````````$"4`@`@````````````````````
+M````````````````````````8)0"`"``````````````````````````````
+M``````````````"`E`(`(```````````````````````````````````````
+M`````*"4`@`@````````````````````````````````````````````P)0"
+M`"````````````````````````````````````````````#@E`(`(```````
+M``````````````````````````````````````"5`@`@````````````````
+M````````````````````````````()4"`"``````````````````````````
+M``````````````````!`E0(`(```````````````````````````````````
+M`````````&"5`@`@````````````````````````````````````````````
+M@)4"`"````````````````````````````````````````````"@E0(`(```
+M`````````````````````````````````````````,"5`@`@````````````
+M````````````````````````````````X)4"`"``````````````````````
+M````````````````````````E@(`(```````````````````````````````
+M`````````````""6`@`@````````````````````````````````````````
+M````0)8"`"````````````````````````````````````````````!@E@(`
+M(````````````````````````````````````````````("6`@`@````````
+M````````````````````````````````````H)8"`"``````````````````
+M``````````````````````````#`E@(`(```````````````````````````
+M`````````````````."6`@`@````````````````````````````````````
+M`````````)<"`"`````````````````````````````````````````````@
+MEP(`(````````````````````````````````````````````$"7`@`@````
+M````````````````````````````````````````8)<"`"``````````````
+M``````````````````````````````"`EP(`(```````````````````````
+M`````````````````````*"7`@`@````````````````````````````````
+M````````````P)<"`"``````````````````````````````````````````
+M``#@EP(`(`````````````````````````````````````````````"8`@`@
+M````````````````````````````````````````````()@"`"``````````
+M``````````````````````````````````!`F`(`(```````````````````
+M`````````````````````````&"8`@`@````````````````````````````
+M````````````````@)@"`"``````````````````````````````````````
+M``````"@F`(`(````````````````````````````````````````````,"8
+M`@`@````````````````````````````````````````````X)@"`"``````
+M````````````````````````````````````````F0(`(```````````````
+M`````````````````````````````""9`@`@````````````````````````
+M````````````````````0)D"`"``````````````````````````````````
+M``````````!@F0(`(```````````````````````````````````````````
+M`("9`@`@````````````````````````````````````````````H)D"`"``
+M``````````````````````````````````````````#`F0(`(```````````
+M`````````````````````````````````."9`@`@````````````````````
+M`````````````````````````)H"`"``````````````````````````````
+M```````````````@F@(`(```````````````````````````````````````
+M`````$":`@`@````````````````````````````````````````````8)H"
+M`"````````````````````````````````````````````"`F@(`(```````
+M`````````````````````````````````````*":`@`@````````````````
+M````````````````````````````P)H"`"``````````````````````````
+M``````````````````#@F@(`(```````````````````````````````````
+M``````````";`@`@````````````````````````````````````````````
+M()L"`"````````````````````````````````````````````!`FP(`(```
+M`````````````````````````````````````````&";`@`@````````````
+M````````````````````````````````@)L"`"``````````````````````
+M``````````````````````"@FP(`(```````````````````````````````
+M`````````````,";`@`@````````````````````````````````````````
+M````X)L"`"``````````````````````````````````````````````G`(`
+M(````````````````````````````````````````````""<`@`@````````
+M````````````````````````````````````0)P"`"``````````````````
+M``````````````````````````!@G`(`(```````````````````````````
+M`````````````````("<`@`@````````````````````````````````````
+M````````H)P"`"````````````````````````````````````````````#`
+MG`(`(````````````````````````````````````````````."<`@`@````
+M`````````````````````````````````````````)T"`"``````````````
+M```````````````````````````````@G0(`(```````````````````````
+M`````````````````````$"=`@`@````````````````````````````````
+M````````````8)T"`"``````````````````````````````````````````
+M``"`G0(`(````````````````````````````````````````````*"=`@`@
+M````````````````````````````````````````````P)T"`"``````````
+M``````````````````````````````````#@G0(`(```````````````````
+M``````````````````````````">`@`@````````````````````````````
+M````````````````()X"`"``````````````````````````````````````
+M``````!`G@(`(````````````````````````````````````````````&">
+M`@`@````````````````````````````````````````````@)X"`"``````
+M``````````````````````````````````````"@G@(`(```````````````
+M`````````````````````````````,">`@`@````````````````````````
+M````````````````````X)X"`"``````````````````````````````````
+M````````````GP(`(```````````````````````````````````````````
+M`""?`@`@````````````````````````````````````````````0)\"`"``
+M``````````````````````````````````````````!@GP(`(```````````
+M`````````````````````````````````("?`@`@````````````````````
+M````````````````````````H)\"`"``````````````````````````````
+M``````````````#`GP(`(```````````````````````````````````````
+M`````."?`@`@`````````````````````````````````````````````*`"
+M`"`````````````````````````````````````````````@H`(`(```````
+M`````````````````````````````````````$"@`@`@````````````````
+M````````````````````````````8*`"`"``````````````````````````
+M``````````````````"`H`(`(```````````````````````````````````
+M`````````*"@`@`@````````````````````````````````````````````
+MP*`"`"````````````````````````````````````````````#@H`(`(```
+M``````````````````````````````````````````"A`@`@````````````
+M````````````````````````````````(*$"`"``````````````````````
+M``````````````````````!`H0(`(```````````````````````````````
+M`````````````&"A`@`@````````````````````````````````````````
+M````@*$"`"````````````````````````````````````````````"@H0(`
+M(````````````````````````````````````````````,"A`@`@````````
+M````````````````````````````````````X*$"`"``````````````````
+M````````````````````````````H@(`(```````````````````````````
+M`````````````````""B`@`@````````````````````````````````````
+M````````0*("`"````````````````````````````````````````````!@
+MH@(`(````````````````````````````````````````````("B`@`@````
+M````````````````````````````````````````H*("`"``````````````
+M``````````````````````````````#`H@(`(```````````````````````
+M`````````````````````."B`@`@````````````````````````````````
+M`````````````*,"`"``````````````````````````````````````````
+M```@HP(`(````````````````````````````````````````````$"C`@`@
+M````````````````````````````````````````````8*,"`"``````````
+M``````````````````````````````````"`HP(`(```````````````````
+M`````````````````````````*"C`@`@````````````````````````````
+M````````````````P*,"`"``````````````````````````````````````
+M``````#@HP(`(`````````````````````````````````````````````"D
+M`@`@````````````````````````````````````````````(*0"`"``````
+M``````````````````````````````````````!`I`(`(```````````````
+M`````````````````````````````&"D`@`@````````````````````````
+M````````````````````@*0"`"``````````````````````````````````
+M``````````"@I`(`(```````````````````````````````````````````
+M`,"D`@`@````````````````````````````````````````````X*0"`"``
+M````````````````````````````````````````````I0(`(```````````
+M`````````````````````````````````""E`@`@````````````````````
+M````````````````````````0*4"`"``````````````````````````````
+M``````````````!@I0(`(```````````````````````````````````````
+M`````("E`@`@````````````````````````````````````````````H*4"
+M`"````````````````````````````````````````````#`I0(`(```````
+M`````````````````````````````````````."E`@`@````````````````
+M`````````````````````````````*8"`"``````````````````````````
+M```````````````````@I@(`(```````````````````````````````````
+M`````````$"F`@`@````````````````````````````````````````````
+M8*8"`"````````````````````````````````````````````"`I@(`(```
+M`````````````````````````````````````````*"F`@`@````````````
+M````````````````````````````````P*8"`"``````````````````````
+M``````````````````````#@I@(`(```````````````````````````````
+M``````````````"G`@`@````````````````````````````````````````
+M````(*<"`"````````````````````````````````````````````!`IP(`
+M(````````````````````````````````````````````&"G`@`@````````
+M````````````````````````````````````@*<"`"``````````````````
+M``````````````````````````"@IP(`(```````````````````````````
+M`````````````````,"G`@`@````````````````````````````````````
+M````````X*<"`"``````````````````````````````````````````````
+MJ`(`(````````````````````````````````````````````""H`@`@````
+M````````````````````````````````````````0*@"`"``````````````
+M``````````````````````````````!@J`(`(```````````````````````
+M`````````````````````("H`@`@``````````````````````"@\@(`H/\"
+M````````````H*@"`"``2/("`$#R`@!$\@(``0```(#R`@"`_P(`````````
+M``#`J`(`(``$\@(``/("````````````````````````````,``P`."H`@`@
+M`!0`,````@``@`````````#H`P```/H```$````T`#```*D"`"``&``P```$
+M`````0```````!`G````^@```0```"``,``@J0(`(``8`#```````$``````
+M````$"<``(#P^@(&````/``P`$"I`@`@`````````````````/____\0)P``
+M`(>3`P8`````````8*D"`"````````````````````````````#$BP(`U@``
+M`/"L`@"`J0(`(`#TK`(`!*T"``BM`@`,K0(`$*T"`!2M`@`8K0(`[*P"`*"I
+M`@`@`.RL`@#LK`(`'*T"`""M`@`DK0(`**T"`"RM`@`PK0(`P*D"`"``[*P"
+M`.RL`@#LK`(`-*T"`#BM`@`\K0(`0*T"`$2M`@#@J0(`(`!(K0(`3*T"`%"M
+M`@!4K0(`6*T"`%RM`@!@K0(`9*T"``"J`@`@`&BM`@!LK0(`````````````
+M``````````````!PK0(`(*H"`"``=*T"`'BM`@!\K0(`@*T"`(2M`@"(K0(`
+M[*P"`.RL`@!`J@(`(`#LK`(`C*T"`.RL`@"0K0(`[*P"`.RL`@#\K`(`^*P"
+M`&"J`@`@`.RL`@"4K0(`[*P"`)BM`@"<K0(`H*T"`*2M`@"HK0(`@*H"`"``
+MK*T"`+"M`@#LK`(`[*P"`.RL`@"TK0(`N*T"`+RM`@"@J@(`(`#`K0(`Q*T"
+M`,BM`@#LK`(`[*P"`.RL`@#,K0(`[*P"`,"J`@`@`-"M`@#4K0(`V*T"`-RM
+M`@#@K0(`Y*T"`.BM`@#LK0(`X*H"`"``\*T"`/2M`@#XK0(`_*T"``"N`@`$
+MK@(`"*X"``RN`@``JP(`(``````````````````0K@(`/*X"`$"N`@!$K@(`
+M2*X"`""K`@`@`$RN`@!0K@(`[*P"`.RL`@#LK`(`%*X"`!BN`@`<K@(`0*L"
+M`"``(*X"`"2N`@`HK@(`[*P"`.RL`@#LK`(`Z*P"``"M`@!@JP(`(`!`KP(`
+M5*X"`.3*`@!8K@(`[*P"`.RL`@`LK@(`,*X"`("K`@`@`#2N`@`XK@(`[*P"
+M`%RN`@````````````````!@K@(`H*L"`"``9*X"`&BN`@!LK@(`>*X"`'RN
+M`@!PK@(```````````#`JP(`(```````@*X"`(2N`@`LKP(`B*X"`(RN`@"0
+MK@(`E*X"`."K`@`@`)BN`@"<K@(`H*X"`#RO`@"HK@(`I*X"`*RN`@"PK@(`
+M`*P"`"``M*X"`+BN`@"\K@(`P*X"`"BR`@`````````````````@K`(`(`#(
+MK@(`S*X"`#2O`@`PKP(`[*P"`.RL`@#LK`(`T*X"`$"L`@`@`.RL`@#4K@(`
+MV*X"`-RN`@#@K@(`\*X"`.RL`@#DK@(`8*P"`"``#*\"`!"O`@!TK@(`Z*X"
+M`(R^`@#LK@(`_*X"`/2N`@"`K`(`(``4KP(`]JX"`/BN`@#ZK@(`Z,H"``"O
+M`@`8KP(`!*\"`*"L`@`@``BO`@`XKP(`U*P"`-BL`@#<K`(`X*P"`.2L`@`<
+MKP(`P*P"`"``'J\"`!^O`@`@KP(`)*\"`"BO`@````````````````#@K`(`
+M(`````````````$```````````````````````````````"M`@`@`#@`````
+M````````````````````````````````````(*T"`"``````````````````
+M``````````````````````````!`K0(`(```````````````````````````
+M`````````````````&"M`@`@````````````````````````````````````
+M````````@*T"`"````````````````````````````````````````````"@
+MK0(`(````````````````````````````````````````````,"M`@`@````
+M````````````````````````````````````````X*T"`"``````````````
+M````````````````````````````````K@(`(```````````````````````
+M`````````````````````""N`@`@````````````````````````````````
+M````````````0*X"`"``````````````````````````````````````````
+M``!@K@(`(````````````````````````````````````````````("N`@`@
+M````````````````````````````````````````````H*X"`"``````````
+M``````````````````````````````````#`K@(`(```````````````````
+M`````````````````````````."N`@`@``````````````````(`````````
+M`````````````````*\"`"`````````````!````````````````````````
+M```````@KP(`(```````2@```````````````````````````````````$"O
+M`@`@`.S*`@`3`````````-RO`@`&``$`(+`"``8``0`8L`(`8*\"`"``!@`!
+M`````````````````"0``0`HL`(`(``!`"3+`@"`KP(`(`!P"`P`````````
+M``"4TP(`N`$*`````````````````*"O`@`@``````#PKP(`#@`!``"P`@`.
+M``$`3+`"``8``0``````P*\"`"```````.2O`@`+``$`$+`"``4``0!4L`(`
+M#0`!``````#@KP(`(```````````````````````-S$R+C`N,P``````````
+M``"P`@`@`$1E8R`Q-2`R,#`S``````"?````````````````````(+`"`"``
+M``````````````````````````````````````````!`L`(`(```````````
+M``````````````````$````!`````````&"P`@`@````````````````````
+M````````````````````````@+`"`"``5F5R26YF;P`%`````P`@<0``````
+M``````````````"@L`(`(```````````````````````````````````````
+M`````,"P`@`@``````````````````````"PL`(`P+`"````````````X+`"
+M`"``````````````````````````````````````````````L0(`(```````
+M````````````````<F5C96EV95]T87-K7T-"<R"Q`@`@`&5M````````````
+M````````````````````````````0+$"`"``________````````````````
+M``````````````````!@L0(`(```````````````````````````````````
+M`````````("Q`@`@````````````='AS8VAE9%]E``````````````!T>'-C
+MH+$"`"``:&5D7W1A<VM?0T)S96T``'1X<V-H961?4V5T5V5P2V7`L0(`(`!Y
+M0V%L;&)A8VM396T``````````````````````````."Q`@`@````````````
+M`````````````````````````````````+("`"``````````````````````
+M```````````````````````@L@(`(``!``````````$```#H`P``4WES475A
+M;%-E;6$`<WES7T"R`@`@`'%U86Q?0T)S96T`````````````````````````
+M````8+("`"`````````````````````````````!``````````````"`L@(`
+M(````````````````````````````````````````````*"R`@`@````````
+M````````````````````````````````````P+("`"``````````````````
+M``````````````````````````#@L@(`(```````````````````````````
+M``````````````````"S`@`@````````````````````````````````````
+M````````(+,"`"````````````````````````````````````````````!`
+MLP(`(`!S8V%N<GA?=')G``!O<F1E<E]E`'=O<FM?;71X`````&"S`@`@`%!(
+M65]3:'5T1&]W;@````!B8U]S8V%N7V4```!R96QF@+,"`"``;W)C97!S<%]E
+M````<V-A;E]T87-K7T-"<V5M``````"@LP(`(```````````````````````
+M`````````````````````,"S`@`@````````````````````````````````
+M````````````X+,"`"```````````````````````````````````````&)C
+M;E\`M`(`(`!M;VY?0T)S96T```!A8W1I=FET>5]T<F<``````````""T`@`@
+M````````````````````````````````````````````0+0"`"``````````
+M``````````````````````````````````!@M`(`(```````````````````
+M`````````````````````````("T`@`@````````````````````````````
+M````````````````H+0"`"``````````````````````````````````````
+M``````#`M`(`(````````````````````````````````````````````."T
+M`@`@`````````````````````````````````````````````+4"`"``````
+M```````````````````````````````````````@M0(`(````````````(``
+M``````````````````!3>7-T96T@5$"U`@`@`&EM97(@5&AR96%D````````
+M``````````$````%````8+4"`"``"@````H`50``````````````````````
+M``````````"`M0(`(```````````````````````_____P$`````````````
+M`*"U`@`@````````````````````````````_`_K#]</Y@\B`$(`P+4"`"``
+M]P^.#\`/D`#*`),/3`Z:#^T#_P<$`/,/]`\+`!8`^@_@M0(`(`#7#^D/)P`J
+M`*H/(0^M#P,"<`7_!X````````````````"V`@`@``$`````````````````
+M````````````````````````(+8"`"````````````````````````````"`
+M/@```````/\```!`M@(`(```````@#@!``#Z``````````````````!L90``
+M+D\``&"V`@`@`)E:``!190``F5H``)E:``!L90``+D\``)E:``!>90``@+8"
+M`"``F5H``)E:``"96@``F5H``)E:``````````````````"@M@(`(```````
+M`````````````````````````````````````,"V`@`@````````````````
+M````````````````````````````X+8"`"``````````````````````````
+M````````````````````MP(`(````````````')E<W!O;G-E7W1R9P````!A
+M=&EM7W1R9R"W`@`@````````````````````````````````````````````
+M0+<"`"````````````````````````````````````````````!@MP(`(```
+M`````````````````````````'!O=V5R=7!?<VEG7X"W`@`@`&4```!P;W=E
+M<E]M9VUT7V4`````````````````````H+<"`"``````````````````````
+M`')X7V4```````````````#`MP(`(`````````````````````````````0`
+M```'````"@```."W`@`@``H````*`````!D````9``!`!@``0`8``"`#``"`
+M/@```+@"`"``@"4``(`,```@`P``(`,````````````````````````@N`(`
+M(```````````````````````<')O=&5C=%]P=W)?9&]W;D"X`@`@``````!F
+M;W)C95]T<F<`````````````````````````8+@"`"``````````````````
+M``````````````````````````"`N`(`(```````````````````````````
+M```````?``<`'P#_#Z"X`@`@`````````````````&UW86ET7V4`````````
+M````````P+@"`"````````````````````````````````````````````#@
+MN`(`(`````````````````````````````````````````````"Y`@`@````
+M``````````````````!C;61?=V%I=%]F;W)?<F5S(+D"`"``<&]N<V4```!A
+M;&EV95]R97-P7V4`````9'-P7W=R:71`N0(`(`!E7W=A:71?<V5M````````
+M`````````````````````&"Y`@`@``````````````````````````H`````
+M`#`````\````@+D"`"``%`````P````/`!$`%0`3`!H`(``*````Z`,```,`
+ML`"@N0(`(`#(`%@;`P````,```!D``H`%``/``\1$Q4/$1,7#0X/$<"Y`@`@
+M``\1$A8/$106#0T/$+2Y`@"XN0(`ERP``.TL```?+@``X+D"`"``TBP```0N
+M`````````````````````````````(E;````N@(`(``47```T%L``'I;``!H
+M6P``,EP``/5:``!&3@``1DX``""Z`@`@`$9.``!&3@``1DX``$9.``!*3@``
+M^6,``&IX``",8P``0+H"`"``RV$``,MA``!J>```S&(``+1A``"48@``:G@`
+M`&IX``!@N@(`(``>9```:G@``(QC``#+80``RV$``&IX``#,8@``:G@``("Z
+M`@`@`)1B``!J>```:G@``&IX``!J>```*V,``,MA``#+80``H+H"`"``:G@`
+M`/=B``!J>```E&(``&IX``!J>```V&,``&IX``#`N@(`(`!J>```RV$``,MA
+M``!J>```S&(``&IX``"48@``:G@``."Z`@`@`&IX``"T8P``:G@``/]B```3
+M8@``HV,``'QB``#,8@```+L"`"``E&$``)1B``!J>```:G@``!YD``!J>```
+M:G@``&IX```@NP(`(`!J>```:G@``&IX``!J>```:G@``&IX``!J>```:G@`
+M`$"[`@`@`&IX``!J>```:G@``&IX``!J>```:G@``&IX``!J>```8+L"`"``
+MNV(``&IX``````````````````````````````````"`NP(`(```````````
+M```````````````````````!`````````*"[`@`@`'1U;F5?=V%I=%]S96T`
+M````````````````````````P+L"`"``````````````````````````````
+M``````````````#@NP(`(````````````````````````0```"``,```````
+M``````"\`@`@````````````````````````````````````````````(+P"
+M`"````````````!T>&QO8VM?<V5M``````````````````!`O`(`(```````
+M````````````````````````````````;&UA8V"\`@`@`%]P;W=E<E]P<F]C
+M97-S7W-E;0``````````````````@+P"`"``%`````````!:I0``________
+M``!0`#``5``P`,``,`"@O`(`(````%0`8``P`&0`,`#$`#````!4`*``,`"D
+M`#``T``P`,"\`@`@````5`"P`#``M``P`-0`,````%0``'@"`.#``@```%K,
+MX+P"`"````!:C`0`(0#__S\`!``A``4`(0``(`(````#``!\`@``O0(`(`#@
+MP@(```"ES```I8S__S\`!``A```@`@````,`!``A`""]`@`@``4`(0``@`(`
+MX,0"````ZLP``.J,________/P``````0+T"`"``_____P`@`@````,``(0"
+M`.#&`@``@*Z,``"NC/__/P!@O0(`(`#_____`"`"`````P``````_____X-V
+M``````````0``("]`@`@``$```!3>7,@26YI="!487-K````_&T`````````
+M!```H+T"`"``!0```$9R86UE($AA;F1L97(```"(>``````````$``#`O0(`
+M(``+````5%@@4V-H961U;&5R`````/]W``````````0``."]`@`@``T```!1
+M=6%L:71Y(%1A<VL`````56\`````````!````+X"`"``"0```%-C86X@5&%S
+M:P`````````060`````````$```@O@(`(``$````0F5A8V]N($UO;B!487-K
+M``$````"!`L6,@```$"^`@`@``$"`P0%!@<("0H+#`T.```````````````"
+MLZY;D```8+X"`"``\/#P\`````````````````````````````````````"`
+MO@(`(````````````````````````````````````````````*"^`@`@````
+M````````````````````````````````````````P+X"`"``````````````
+M``````````````````````````````#@O@(`(```````````````````````
+M``````````````````````"_`@`@````````````````````````````````
+M````````````(+\"`"``````````````````````````````````````````
+M``!`OP(`(````````````````````````````````````````````&"_`@`@
+M````````````````````````````````````````````@+\"`"``````````
+M``````````````````````````````````"@OP(`(```````````````````
+M`````````````````````````,"_`@`@````````````````````````````
+M````````````````X+\"`"``````````````````````````````````````
+M````````P`(`(````````````````````````````````````````````"#`
+M`@`@````````````````````````````````````````````0,`"`"``````
+M``````````````````````````````````````!@P`(`(```````````````
+M`````````````````````````````(#``@`@````````````````````````
+M````````````````````H,`"`"``````````````````````````````````
+M``````````#`P`(`(```````````````````````````````````````````
+M`.#``@`@`````````````````````````````````````````````,$"`"``
+M```````````````````````````````````````````@P0(`(```````````
+M`````````````````````````````````$#!`@`@````````````````````
+M````````````````````````8,$"`"``````````````````````````````
+M``````````````"`P0(`(```````````````````````````````````````
+M`````*#!`@`@````````````````````````````````````````````P,$"
+M`"````````````````````````````````````````````#@P0(`(```````
+M``````````````````````````````````````#"`@`@````````````````
+M````````````````````````````(,("`"``````````````````````````
+M``````````````````!`P@(`(```````````````````````````````````
+M`````````&#"`@`@````````````````````````````````````````````
+M@,("`"````````````````````````````````````````````"@P@(`(```
+M`````````````````````````````````````````,#"`@`@````````````
+M````````````````````````````````X,("`"``````````````````````
+M````````````````````````PP(`(```````````````````````````````
+M`````````````"##`@`@````````````````````````````````````````
+M````0,,"`"````````````````````````````````````````````!@PP(`
+M(````````````````````````````````````````````(##`@`@````````
+M````````````````````````````````````H,,"`"``````````````````
+M``````````````````````````#`PP(`(```````````````````````````
+M`````````````````.##`@`@````````````````````````````````````
+M`````````,0"`"`````````````````````````````````````````````@
+MQ`(`(````````````````````````````````````````````$#$`@`@````
+M````````````````````````````````````````8,0"`"``````````````
+M``````````````````````````````"`Q`(`(```````````````````````
+M`````````````````````*#$`@`@````````````````````````````````
+M````````````P,0"`"``````````````````````````````````````````
+M``#@Q`(`(`````````````````````````````````````````````#%`@`@
+M````````````````````````````````````````````(,4"`"``````````
+M``````````````````````````````````!`Q0(`(```````````````````
+M`````````````````````````&#%`@`@````````````````````````````
+M````````````````@,4"`"``````````````````````````````````````
+M``````"@Q0(`(````````````````````````````````````````````,#%
+M`@`@````````````````````````````````````````````X,4"`"``````
+M````````````````````````````````````````Q@(`(```````````````
+M`````````````````````````````"#&`@`@````````````````````````
+M````````````````````0,8"`"``````````````````````````````````
+M``````````!@Q@(`(```````````````````````````````````````````
+M`(#&`@`@````````````````````````````````````````````H,8"`"``
+M``````````````````````````````````````````#`Q@(`(```````````
+M`````````````````````````````````.#&`@`@````````````````````
+M`````````````````````````,<"`"``````````````````````````````
+M```````````````@QP(`(```````````````````````````````````````
+M`````$#'`@`@````````````````````````````````````````````8,<"
+M`"````````````````````````````````````````````"`QP(`(```````
+M`````````````````````````````````````*#'`@`@````````````````
+M````````````````````````````P,<"`"``````````````````````````
+M``````````````````#@QP(`(```````````````````````````````````
+M``````````#(`@`@````````````````````````````````````````````
+M(,@"`"````````````````````````````````````````````!`R`(`(```
+M`````````````````````````````````````````&#(`@`@````````````
+M````````````````````````````````@,@"`"``````````````````````
+M``````````````````````"@R`(`(```````````````````````````````
+M`````````````,#(`@`@````````````````````````````````````````
+M````X,@"`"``````````````````````````````````````````````R0(`
+M(````````````````````````````````````````````"#)`@`@````````
+M````````````````````````````````````0,D"`"``````````````````
+M``````````````````````````!@R0(`(```````````````````````````
+M`````````````````(#)`@`@````````````````````````````````````
+M````````H,D"`"````````````````````````````````````````````#`
+MR0(`(````````````````````````````````````````````.#)`@`@````
+M`````````````````````````````````````````,H"`"``````````````
+M```````````````````````````````@R@(`(```````````````````````
+M`````````````````````$#*`@`@````````````````````````````````
+M````````````8,H"`"``````````````````````````````````````````
+M``"`R@(`(````````````````````````````````````````````*#*`@`@
+M````````````````````````````````````````````P,H"`"``````````
+M``````````````````````````````````#@R@(`(```````````````````
+M``````````````````````````#+`@`@````````````````````````````
+M````````````````(,L"`"``````````````````````````````````````
+M``````!`RP(`(````````````````````````````````````````````&#+
+M`@`@````````````````````````````````````````````@,L"`"``````
+M``````````````````````````````````````"@RP(`(```````````````
+M`````````````````````````````,#+`@`@````````````````````````
+M````````````````````X,L"`"``````````````````````````````````
+M````````````S`(`(```````````````````````````````````````````
+M`"#,`@`@````````````````````````````````````````````0,P"`"``
+M``````````````````````````````````````````!@S`(`(```````````
+M`````````````````````````````````(#,`@`@````````````````````
+M````````````````````````H,P"`"``````````````````````````````
+M``````````````#`S`(`(```````````````````````````````````````
+M`````.#,`@`@`````````````````````````````````````````````,T"
+M`"`````````````````````````````````````````````@S0(`(```````
+M`````````````````````````````````````$#-`@`@````````````````
+M````````````````````````````8,T"`"``````````````````````````
+M``````````````````"`S0(`(```````````````````````````````````
+M`````````*#-`@`@````````````````````````````````````````````
+MP,T"`"````````````````````````````````````````````#@S0(`(```
+M``````````````````````````````````````````#.`@`@````````````
+M````````````````````````````````(,X"`"``````````````````````
+M``````````````````````!`S@(`(```````````````````````````````
+M`````````````&#.`@`@````````````````````````````````````````
+M````@,X"`"````````````````````````````````````````````"@S@(`
+M(````````````````````````````````````````````,#.`@`@````````
+M````````````````````````````````````X,X"`"``````````````````
+M````````````````````````````SP(`(```````````````````````````
+M`````````````````"#/`@`@````````````````````````````````````
+M````````0,\"`"````````````````````````````````````````````!@
+MSP(`(````````````````````````````````````````````(#/`@`@````
+M````````````````````````````````````````H,\"`"``````````````
+M``````````````````````````````#`SP(`(```````````````````````
+M`````````````````````.#/`@`@````````````````````````````````
+M`````````````-`"`"``````````````````````````````````````````
+M```@T`(`(````````````````````````````````````````````$#0`@`@
+M````````````````````````````````````````````8-`"`"``````````
+M``````````````````````````````````"`T`(`(```````````````````
+M`````````````````````````*#0`@`@````````````````````````````
+M````````````````P-`"`"``````````````````````````````````````
+M``````#@T`(`(`````````````````````````````````````````````#1
+M`@`@````````````````````````````````````````````(-$"`"``````
+M``````````````````````````````````````!`T0(`(```````````````
+M`````````````````````````````&#1`@`@````````````````````````
+M````````````````````@-$"`"``````````````````````````````````
+M``````````"@T0(`(```````````````````````````````````````````
+M`,#1`@`@````````````````````````````````````````````X-$"`"``
+M````````````````````````````````````````````T@(`(```````````
+M`````````````````````````````````"#2`@`@````````````````````
+M````````````````````````0-("`"``````````````````````````````
+M``````````````!@T@(`(```````````````````````````````````````
+M`````(#2`@`@````````````````````````````````````````````H-("
+M`"````````````````````````````````````````````#`T@(`(```````
+M`````````````````````````````````````.#2`@`@````````````````
+M`````````````````````````````-,"`"``````````````````````````
+M```````````````````@TP(`(```````````````````````````````````
+M`````````$#3`@`@````````````````````````````````````````````
+M8-,"`"````````````````````````````````````````````"`TP(`(```
+M`````````````````````````````````````````*#3`@`@````````````
+M````````````````````````````````P-,"`"``````````````````````
+M``````````````````````#@TP(`(```````````````````````````````
+M``````````````#4`@`@````````````````````````````````````````
+M````(-0"`"````````````````````````````````````````````!`U`(`
+M(````````````````````````````````````````````&#4`@`@````````
+M````````````````````````````````````@-0"`"``````````````````
+M``````````````````````````"@U`(`(```````````````````````````
+M`````````````````,#4`@`@````````````````````````````````````
+M````````X-0"`"``````````````````````````````````````````````
+MU0(`(````````````````````````````````````````````"#5`@`@````
+M````````````````````````````````````````0-4"`"``````````````
+M``````````````````````````````!@U0(`(```````````````````````
+M`````````````````````(#5`@`@````````````````````````````````
+M````````````H-4"`"``````````````````````````````````````````
+M``#`U0(`(````````````````````````````````````````````.#5`@`@
+M`````````````````````````````````````````````-8"`"``````````
+M```````````````````````````````````@U@(`(```````````````````
+M`````````````````````````$#6`@`@````````````````````````````
+M````````````````8-8"`"``````````````````````````````````````
+M``````"`U@(`(````````````````````````````````````````````*#6
+M`@`@````````````````````````````````````````````P-8"`"``````
+M``````````````````````````````````````#@U@(`(```````````````
+M``````````````````````````````#7`@`@````````````````````````
+M````````````````````(-<"`"``````````````````````````````````
+M``````````!`UP(`(```````````````````````````````````````````
+M`&#7`@`@````````````````````````````````````````````@-<"`"``
+M``````````````````````````````````````````"@UP(`(```````````
+M`````````````````````````````````,#7`@`@````````````````````
+M````````````````````````X-<"`"``````````````````````````````
+M````````````````V`(`(```````````````````````````````````````
+M`````"#8`@`@````````````````````````````````````````````0-@"
+M`"````````````````````````````````````````````!@V`(`(```````
+M`````````````````````````````````````(#8`@`@````````````````
+M````````````````````````````H-@"`"``````````````````````````
+M``````````````````#`V`(`(```````````````````````````````````
+M`````````.#8`@`@````````````````````````````````````````````
+M`-D"`"`````````````````````````````````````````````@V0(`(```
+M`````````````````````````````````````````$#9`@`@````````````
+M````````````````````````````````8-D"`"``````````````````````
+M``````````````````````"`V0(`(```````````````````````````````
+M`````````````*#9`@`@````````````````````````````````````````
+M````P-D"`"````````````````````````````````````````````#@V0(`
+M(`````````````````````````````````````````````#:`@`@````````
+M````````````````````````````````````(-H"`"``````````````````
+M``````````````````````````!`V@(`(```````````````````````````
+M`````````````````&#:`@`@````````````````````````````````````
+M````````@-H"`"````````````````````````````````````````````"@
+MV@(`(````````````````````````````````````````````,#:`@`@````
+M````````````````````````````````````````X-H"`"``````````````
+M````````````````````````````````VP(`(```````````````````````
+M`````````````````````"#;`@`@````````````````````````````````
+M````````````0-L"`"``````````````````````````````````````````
+M``!@VP(`(````````````````````````````````````````````(#;`@`@
+M````````````````````````````````````````````H-L"`"``````````
+M``````````````````````````````````#`VP(`(```````````````````
+M`````````````````````````.#;`@`@````````````````````````````
+M`````````````````-P"`"``````````````````````````````````````
+M```````@W`(`(````````````````````````````````````````````$#<
+M`@`@````````````````````````````````````````````8-P"`"``````
+M``````````````````````````````````````"`W`(`(```````````````
+M`````````````````````````````*#<`@`@````````````````````````
+M````````````````````P-P"`"``````````````````````````````````
+M``````````#@W`(`(```````````````````````````````````````````
+M``#=`@`@````````````````````````````````````````````(-T"`"``
+M``````````````````````````````````````````!`W0(`(```````````
+M`````````````````````````````````&#=`@`@````````````````````
+M````````````````````````@-T"`"``````````````````````````````
+M``````````````"@W0(`(```````````````````````````````````````
+M`````,#=`@`@````````````````````````````````````````````X-T"
+M`"``````````````````````````````````````````````W@(`(```````
+M`````````````````````````````````````"#>`@`@````````````````
+M````````````````````````````0-X"`"``````````````````````````
+M``````````````````!@W@(`(```````````````````````````````````
+M`````````(#>`@`@````````````````````````````````````````````
+MH-X"`"````````````````````````````````````````````#`W@(`(```
+M`````````````````````````````````````````.#>`@`@````````````
+M`````````````````````````````````-\"`"``````````````````````
+M```````````````````````@WP(`(```````````````````````````````
+M`````````````$#?`@`@````````````````````````````````````````
+M````8-\"`"````````````````````````````````````````````"`WP(`
+M(````````````````````````````````````````````*#?`@`@````````
+M````````````````````````````````````P-\"`"``````````````````
+M``````````````````````````#@WP(`(```````````````````````````
+M``````````````````#@`@`@````````````````````````````````````
+M````````(.`"`"````````````````````````````````````````````!`
+MX`(`(````````````````````````````````````````````&#@`@`@````
+M````````````````````````````````````````@.`"`"``````````````
+M``````````````````````````````"@X`(`(```````````````````````
+M`````````````````````,#@`@`@````````````````````````````````
+M````````````X.`"`"``````````````````````````````````````````
+M````X0(`(````````````````````````````````````````````"#A`@`@
+M````````````````````````````````````````````0.$"`"``````````
+M``````````````````````````````````!@X0(`(```````````````````
+M`````````````````````````(#A`@`@````````````````````````````
+M````````````````H.$"`"``````````````````````````````````````
+M``````#`X0(`(````````````````````````````````````````````.#A
+M`@`@`````````````````````````````````````````````.("`"``````
+M```````````````````````````````````````@X@(`(```````````````
+M`````````````````````````````$#B`@`@````````````````````````
+M````````````````````8.("`"``````````````````````````````````
+M``````````"`X@(`(```````````````````````````````````````````
+M`*#B`@`@````````````````````````````````````````````P.("`"``
+M``````````````````````````````````````````#@X@(`(```````````
+M``````````````````````````````````#C`@`@````````````````````
+M````````````````````````(.,"`"``````````````````````````````
+M``````````````!`XP(`(```````````````````````````````````````
+M`````&#C`@`@````````````````````````````````````````````@.,"
+M`"````````````````````````````````````````````"@XP(`(```````
+M`````````````````````````````````````,#C`@`@````````````````
+M````````````````````````````X.,"`"``````````````````````````
+M````````````````````Y`(`(```````````````````````9F9F9F9F9F9F
+M9F9F9F9F9B#D`@`@`&9F9E5$,R(1$0```````!$1(C,S569F9F9F9F9F9F9F
+M0.0"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9@Y`(`(`!F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9H#D`@`@`&9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FH.0"`"``9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F;`Y`(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9N#D`@`@`&9F9F9F9F9F9F9F9E4S,R(1$0```````!$1(C-$
+M569F`.4"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8@Y0(`
+M(`!F9E5$,R(1$0``````````$1$B,T159F9F9F9F9F9F9D#E`@`@`&9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8.4"`"``9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F:`Y0(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9J#E`@`@`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9FP.4"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F;@
+MY0(`(`!F9F9F9F9F9F9F9E5$,R(1$0``````````$1$B,T159@#F`@`@`&9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9E5$(.8"`"``1#,B(A$1````
+M```````````1(B(S1%5F9F9F9F9F9F9`Y@(`(`!F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F#F`@`@`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F@.8"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F:@Y@(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9L#F`@`@
+M`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FX.8"`"``9F9F9F9F
+M9F9F9E5$,R(B$0``````````````$1$B(C,`YP(`(`!$1%5F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F95,R#G`@`@`"(1`````!$1(D1F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F0.<"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9@YP(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9D0B$1$`````$8#G
+M`@`@`"(S569F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9E4SH.<"`"``(A$`
+M````$1$B1&9F9F9F9F9F9F9F9F9F9F9F9F9F9F;`YP(`(`!F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9N#G`@`@`&9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F1"(1$0`````1`.@"`"``(C-59F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F53,@Z`(`(``B$0`````1$2)$9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9D#H`@`@`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8.@"`"``
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9$(A$1`````!&`Z`(`(``B,U5F9F9F
+M9F9F9F9F9F9F$1$1$1$1`````````````*#H`@`@````````````````$1$1
+M$2(B,S,S1$159F9WB(B9JKN[P.@"`"``S-WN________________________
+M____________[MW@Z`(`(`#,N[NJF8B(=V9F541$,S,S(B(1$1$1````````
+M``````#I`@`@````````````````$1$1$1$`````````````````````(.D"
+M`"`````````````````1$1$1(B(B,S-$1%559F9W=XB9F:I`Z0(`(`"[S-W=
+M[N[N[N[N[N[N[N[N[N[N[N[N[N[N[N[N[MW=S&#I`@`@`+NJF9F(=W=F9E55
+M1$0S,R(B(A$1$1$`````````````@.D"`"``````````````````````````
+M``````````````````"@Z0(`(```````````````````$1$1(B(B,S,S1$15
+M569F=W>(B,#I`@`@`)FJJKO,W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W,NZJJ
+MX.D"`"``F8B(=W=F9E551$0S,S,B(B(1$1$`````````````````Z@(`(```
+M````````````````````"0@'!@<&!000$`T+"0@'!B#J`@`@`"8C(R$,"PH)
+M"0<&!1$1$`X.#0P+,S(Q,`P+"@D.#0H)0.H"`!0`%A02$!(1$`\I*"(A____
+M_WG_>3L``"2P!0`?``0`#P`P`.VV]K9]MSH..0Y;4$`;6T``:FE*?;>6#PJP
+M`&```/_7*$$5D)8/`F``U]&-#+`:L`RP#+`-``@`W;PK8%=!FP\P#P3W`&\`
+M;"ZPP&Y`;`!J!0$OD!0.`F!602$.(@XC#B0/)0\F#B<.<0]]#B`/`&!000%@
+M*$$!8"A!`6`H00)J*$L``"A!```H0PYN0`$H04V00`%!`:1`*$&E0BA#!6X`
+M:@)P*$$!$%B0[(T!8"A!-X<P#LEL0`$104`!$D%``1-!20\`:D-*5$H`:D!*
+M$`X1#A(.$PY`4`(?!,P('P+)=K]`4'J@YK`&L2FQ8;&-L9NQN['8L>^Q0%"%
+MH.>P![%)L4!:0!HA50)@`-<H04%0``#_URA!``#_URA+``#_U^R-*$4WAZ</
+M,`\"W9RP6;%`6H`:(56+L#H..0Y`6L`:B[`A6\YP"``@4213%P`'S`;8(E$`
+M`");04JVH(.P6+*?L)^P@K*$LB^S2+.)LY2SG["?L&>TG["?L*VSW+/^LY^P
+M*[0SM$JT7;1:LG"R`````````0`'``$`%P`!`!````````````````(`!0`2
+M`````P`!``$``P`#``,`!-0%:,$!<K`A41<?L\[NH%BRG["?L*BPJ+"(L(BP
+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
+A0-R_`&!(0"$@",@A(0;(!&!(0"0/(0X!`"$/)`X!````
+`
+end
diff --git a/sys/contrib/dev/ipw/ipw2100-1.3-p.fw.uu b/sys/contrib/dev/ipw/ipw2100-1.3-p.fw.uu
new file mode 100644
index 0000000..c10c8aa
--- /dev/null
+++ b/sys/contrib/dev/ipw/ipw2100-1.3-p.fw.uu
@@ -0,0 +1,4574 @@
+/*-
+ * TERMS AND CONDITIONS
+ * IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE
+ *
+ * Do not use or load this firmware (the "Software") until you have carefully read
+ * the following terms and conditions. By loading or using the Software, you agree
+ * to the terms of this Agreement. If you do not wish to so agree, do not install
+ * or use the Software.
+ *
+ * LICENSEES:
+ *
+ * Please note:
+ *
+ * * If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT,
+ * applies.
+ * * If you are an Original Equipment Manufacturer (OEM), Independent Hardware
+ * Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement
+ * applies
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * For OEMs, IHVs, and ISVs:
+ *
+ * LICENSE. This Software is licensed for use only in conjunction with Intel
+ * component products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder. Subject to the terms of this Agreement,
+ * Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up
+ * license under Intel's copyrights to: (i) copy the Software internally for your
+ * own development and maintenance purposes; (ii) copy and distribute the Software
+ * to your end-users, but only under a license agreement with terms at least as
+ * restrictive as those contained in Intel's Final, Single User License Agreement,
+ * attached as Exhibit A; and (iii) modify, copy and distribute the end-user
+ * documentation which may accompany the Software, but only in association with
+ * the Software.
+ *
+ * If you are not the final manufacturer or vendor of a computer system or software
+ * program incorporating the Software, then you may transfer a copy of the
+ * Software, including any related documentation (modified or unmodified) to your
+ * recipient for use in accordance with the terms of this Agreement, provided such
+ * recipient agrees to be fully bound by the terms hereof. You shall not otherwise
+ * assign, sublicense, lease, or in any other way transfer or disclose Software to
+ * any third party. You may not, nor may you assist any other person or entity to
+ * modify, translate, convert to another programming language, decompile, reverse
+ * engineer, or disassemble any portion of the Software or otherwise attempt to
+ * derive source code from any object code modules of the Software or any internal
+ * data files generated by the Software. Your rights to redistribute the Software
+ * shall be contingent upon your installation of this Agreement in its entirety in
+ * the same directory as the Software.
+ *
+ * CONFIDENTIALITY. If you wish to have a third party consultant or subcontractor
+ * ("Contractor") perform work on your behalf which involves access to or use of
+ * Software, you shall obtain a written confidentiality agreement from the
+ * Contractor which contains provisions with respect to access to or use of the
+ * Software no less restrictive than those set forth in this Agreement and
+ * excluding any distribution rights, and use for any other purpose. Except as
+ * expressly provided herein, you shall not disclose the terms or existence of
+ * this Agreement or use Intel's name in any publications, advertisements, or
+ * other announcements without Intel's prior written consent. You do not have any
+ * rights to use any Intel trademarks or logos.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if
+ * any, are owned by Intel or its suppliers and licensors and may be protected by
+ * copyright, trademark, patent and trade secret law and international treaties.
+ * Any rights, express or implied, in the intellectual property embodied in the
+ * foregoing, other than those specified in this Agreement, are reserved by Intel
+ * and its suppliers and licensors or otherwise as set forth in any applicable
+ * open source license agreement. You will keep the Software free of liens,
+ * attachments, and other encumbrances. You agree not to remove any proprietary
+ * notices and/or any labels from the Software and accompanying materials without
+ * prior written approval by Intel
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS
+ * BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND
+ * (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST
+ * INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE
+ * INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR
+ * SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS
+ * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT
+ * EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR
+ * INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE
+ * OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS.
+ *
+ * EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH
+ * FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND
+ * LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR
+ * OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant
+ * or assume responsibility for the accuracy or completeness of any information,
+ * text, graphics, links or other items contained within the Software. You assume
+ * all liability, financial or otherwise, associated with Your use or disposition
+ * of the Software.
+ *
+ * APPLICABLE LAW. Claims arising under this Agreement shall be governed by the
+ * laws of State of California], excluding its principles of conflict of laws and
+ * the United Nations Convention on Contracts for the Sale of Goods.
+ *
+ * WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of
+ * this Agreement shall be effective unless in writing and signed by an officer of
+ * Intel. No failure or delay in exercising any right, power, or remedy under
+ * this Agreement shall operate as a waiver of any such right, power or remedy.
+ * Without limiting the foregoing, terms and conditions on any purchase orders or
+ * similar materials submitted by you to Intel, and any terms contained in IntelÂ’s
+ * standard acknowledgment form that are in conflict with these terms, shall be of
+ * no force or effect.
+ *
+ * SEVERABILITY. If any provision of this Agreement is held by a court of
+ * competent jurisdiction to be contrary to law, such provision shall be changed
+ * and interpreted so as to best accomplish the objectives of the original
+ * provision to the fullest extent allowed by law and the remaining provisions of
+ * this Agreement shall remain in full force and effect.
+ *
+ * EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to
+ * applicable import and export regulations of the United States and of the
+ * countries in which each party transacts business, specifically including U.S.
+ * Export Administration Act and Export Administration Regulations. Each party
+ * shall comply with such laws and regulations, as well as all other laws and
+ * regulations applicable to the Software. Without limiting the generality of the
+ * foregoing, each party agrees that it will not export, re-export, transfer or
+ * divert any of the Software or the direct programs thereof to any restricted
+ * place or party in accordance with U.S. export regulations. Note that Software
+ * containing encryption may be subject to additional restrictions.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ *
+ * TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate
+ * its terms. Upon termination, you will immediately destroy the Software or
+ * return all copies of the Software to Intel.
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * EXHIBIT "A"
+ *
+ * SOFTWARE LICENSE AGREEMENT (Final, Single User)
+ *
+ * IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+ *
+ * Do not use or load this firmware image (the "Software") until you have carefully
+ * read the following terms and conditions. By loading or using the Software, you
+ * agree to the terms of this Agreement. If you do not wish to so agree, do not
+ * install or use the Software.
+ *
+ * LICENSE. You may copy and use the Software, subject to these conditions:
+ * 1. This Software is licensed for use only in conjunction with Intel component
+ * products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder.
+ * 2. You may not copy, modify, rent, sell, distribute or transfer any part of the
+ * Software except as provided in this Agreement, and you agree to prevent
+ * unauthorized copying of the Software.
+ * 3. You may not reverse engineer, decompile, or disassemble the Software.
+ * 4. You may not sublicense the Software.
+ * 5. The Software may contain the software or other property of third party
+ * suppliers.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software
+ * remains with Intel or its suppliers. The Software is copyrighted and protected
+ * by the laws of the United States and other countries, and international treaty
+ * provisions. You may not remove any copyright notices from the Software. Intel
+ * may make changes to the Software, or items referenced therein, at any time
+ * without notice, but is not obligated to support or update the Software. Except
+ * as otherwise expressly provided, Intel grants no express or implied right under
+ * Intel patents, copyrights, trademarks, or other intellectual property rights.
+ * You may transfer the Software only if a copy of this license accompanies the
+ * Software and the recipient agrees to be fully bound by these terms.
+ *
+ * EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED
+ * "AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING
+ * WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR
+ * PURPOSE. Intel does not warrant or assume responsibility for the accuracy or
+ * completeness of any information, text, graphics, links or other items contained
+ * within the Software.
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS
+ * INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO
+ * USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR
+ * IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE
+ * LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY
+ * BETWEEN JURISDICTIONS.
+ *
+ * TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if
+ * you violate its terms. Upon termination, you will immediately destroy the
+ * Software.
+ *
+ * APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the
+ * laws of California, excluding its principles of conflict of laws and the United
+ * Nations Convention on Contracts for the Sale of Goods. You may not export the
+ * Software in violation of applicable export laws and regulations. Intel is not
+ * obligated under any other agreements unless they are in writing and signed by
+ * an authorized representative
+ * of Intel.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ */
+#define IPW_FW_VERSION 1.3
+begin 644 ipw2100-1.3-p.fw
+M`0,"`/C?`@!F'P```````"`````?.!@`````_O\?`/[_'P#^_Q\`_O\?`/[_
+M'P#^_Q\@````(```_O\?`/[_'P#^_Q\`_O\?`/[_'P#^_Q\`_O\?`/[_'T``
+M```(````'S@5````4````"```(`/.`!^'Q("```)``$/.`#^'V``_C]@`/Y?
+M8`#^?V!P````(```_I]@`/Z_8`#^WV``_O]@`/X?80#^/V$`_E]A`/Y_89``
+M```@``#^GV$`_K]A`/[?80#^_V$`_A]B`/X_8@#^7V(`_G]BL````"```/Z?
+M8@#^OV(`_M]B`/[_8@#^'V,`_C]C`'R?8Q#F`@#0````(``0?HY3`'Q?8V#`
+M`@`@<T(H`/Y_8P#^_Q\`_.]C____^_`````@``"!#S@`_.]K````!`"!#S@`
+M_`]@````!`#\[V/____[$`$``"```($/.`"`[VL`@0\X`/P/8`````0`@0\X
+MJ'Z.4Q`^#A`P`0``(```;``H(!DX*!!^CE,0?HY#@(0`(*A^CE,```X0!`(.
+M$%`!```@``@^#A`0?HY3`.4M*!!^CD,(`.X+`+``(""`#S@`(``(<`$``"``
+M((`/.`"``!(````````````%@6<``H!H`8$/.`-ZXF>0`0``(```!($8@A$`
+M(``$@A@`!((8``6"'P3^(%`$?F!0`@0`,+`!```@``20@`@$D*`(!)#`"`20
+MX`@$B`$1!(H!$02,`1$$C@$1T`$``"``I04`(`1ZX6?___]_(@<`(`-Z@6<#
+M_B!``8$/.`/^84#P`0``(````0`P`92`"`&(01$`@0\X!)"`"`20H`@$B`$1
+M(?K_)Q`"```@``2*`1$#>H%G!)"`"*#X_R<$B`$1`?X@4`%^8%```0`P,`(`
+M`"```92`"`&(01$`@0\X"#@-$/S_'V``?#]@G`(```200`A0`@``(```>N%7
+M!)!@"($!`"`$!``1(/W_)P0&`!$`?#]@$.8"`'`"```@``3^($!(`@T0`'Q?
+M8``"``!,!`T0`/Z?8%`(#1``A"!`D`(``"``!/X@0/S_(&`$`@T0`(`/.```
+M'SBZ```````?.+X```"P`@``(````!\XP@``````'SC&```````?.,H`````
+M`!\XS@```-`"```@````'SC2```````?.-8```````````````&`OQ____]_
+M\`(``"``____?____W\!@+\?____?____W____]_`8"_'____W\0`P``(`#_
+M__]_____?P&`OQ____]_____?____W\!@+\?____?S`#```@`/___W____]_
+M`8"_'____W____]_____?P&`OQ____]_4`,``"``____?____W\!@+\?____
+M?____W____]_!H"_'Q``#0AP`P``(```>N!7@?[_)P2`OQ____]_#``-$`0`
+M8`@8`(`(`?YA0)`#```@``0&`!`(`(`+,`@-$```+@@`^N!7`@D`(`0`[@L(
+M`&X+L`,``"``#`!."Q``+@L4``X+&`#N"AP`S@H@`*X*)`"."B@`;@K0`P``
+M(``L`$X*,``N"C0`#@HX`.X)/`#."4``K@D@@0\X1'Z.0_`#```@``0`#@@"
+M@!\2"``N"`."'Q(,`(X/$`#N"Q0`K@L8`&X+$`0``"``'`!."R``+@LD``X+
+M*`#N"BP`S@HP`*X*-`"."C@`;@HP!```(``\`$X*0``N"D0`#@I(`.X)3`#.
+M"5``K@E4`(X)6`!N"5`$```@`(@`#@@!?N"O7`!."6``+@ED``X):`#N"&P`
+MS@AP`*X(<`0``"``=`"."'@`;@A\`$X(@``N"(P`#@@2@!\2A``."""!#CB0
+M!```(`"H?HY#@`(.$(0`#A````T(>`8.$`!ZX%=\!`X0(0H`(+`$```@``%^
+M`$````T05!@.$%@6#A!<%`X08!(.$&00#A!H#@X0T`0``"``;`P.$'`*#A!T
+M"`X0`J!?"0.@/PD,>`X0!!0.$`@2#A#P!```(`"(<@X0C'8.$""`#S@4.@X0
+M```-$`P`+0A4&`X0`/K@5Q`%```@`%@6#A`!"0`@7!0.$&`2#A!D$`X0:`X.
+M$&P,#A!P"@X0,`4``"``=`@.$`*@7PD#H#\)#'@.$`04#A`($@X0B'(.$(QV
+M#A!0!0``(``4.@X0"+@`$""`#S@(`(T+((`/.*A^CD,$@+\?____?W`%```@
+M````#0@!>@!0```-$`$-`"`$``X(`H`?$@@`+@@#@A\2D`4``"``#`".#Q``
+M[@L4`*X+5`"."5@`;@F(``X(`7[@KUP`3@FP!0``(`!@`"X)9``."6@`[@AL
+M`,X(<`"N"'0`C@AX`&X(?`!."-`%```@`(``+@B,``X($H`?$H0`#@@@@0XX
+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
+M```@``""86@(_I]G`(8A8``!`#``@B!``((@0`"&(&@`!($9\`L``"````2&
+M'P-^06```0`P``("$`1^@D"@`0`@`'KA5P``@&`0#```(```>N%7_W]!0`&`
+M#S@``D(0`'KA5_]_04`A@`\X`7Z"0#`,```@`*#]_R<``D(0`(-`8`#^/V"!
+M$P`@)`@`(``!X$<!_M]@4`P``"``A04`(`84H!@!_J)`((J>5P`*`(""`@`P
+M``$`0`""($AP#```(```A>!7!@P`0`:$(%``@0\XH`$`(`#^'V$!_A]A`(1`
+M4)`,```@```0!$D%@0!0__^_8`84H!@!_J)`((J>5P`*`(`!_M]@L`P``"``
+M@@(`,``!`$``@B!(`(7@5P8,`$`&A"!0`/[?8`-ZY%?0#```(``"``-0`7KD
+M9P("(U``@0\X```@8""!#SC__Q]@``7A9_`,```@`/]_@4`!!0`@``1@"`"$
+M0`@`A>%7`?X@0*(#`"`!?@!`$`T``"```'KB5_]_@D!"_/\G``1@"""`#S@`
+M``!0_X4@"/\%``@P#0``(````^!7__\?8`N`#S@@@`\X`?X?8```0`@`?$%@
+M_S\``%`-```@``P```@`?`!@_S\``````5``@``0````4`"`#S@$/@X0<`T`
+M`"```#8.$``X;F,T?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A"0#0``(``D)`X0
+M``!`8@""(&(`!.%A`(8!8@":IE$`@B!0_(,-$+`-```@``!\'V!@P`(`````
+M"`!ZX%<!`0`@`?X?8(```"````!0T`T``"```'K@5P(&`"``V"$H_/]-0`""
+M(%"`["$H`'K@5P$"`"#P#0``(`!0_A]@`'P_8%D(``"`3#8H@%_^+P``H&'T
+M_TU`^/\M0!`.```@``!\'V"4P@(`%```"````1`__A]@`(``$``<QU$(^N=7
+M,`X``"``@0$`(/2!#0@`>N!7`0T`(`'^/V``?!]@M+@"``0#0!10#@``(``%
+M10`(`'K@5P(%`"``G@=@`*X:*`"(!R@`)`E@`*(H8'`.```@```@2&``614H
+M`)X'8`#3!R@``@`@`"0)8`"B*&``($A@D`X``"``@%45*```P&$`@B!0`'P?
+M8+2X`@`$`T`4`'P?8&#``@"P#@``(``````(`'K@5P$!`"`!_A]@@```(```
+M`%``>N!7`@8`(-`.```@``":!F"`1_XO`+@A*/R!+0C\_TU`@,PA*`!ZX%<!
+M`@`@\`X``"``4/X?8`!\/V")"```@"PV*``<!V`0`*X)%`#."1@`[@D0#P``
+M(``<``X*(``N"B0`3@H$@.T+((`/.#00;@L$/@X0`#8.$#`/```@```X;F,0
+M?HY3`'Q?8,#>`@`&!"$(`/K@5X$2`"`"!&$(4`\``"```@0@"`"#X5>"!``@
+M`P1!"`,$(`@``^%7@@(`(`""(%!P#P``(```?%]@4+8"`"8#01"`$@`@`'Q?
+M8%"V`@`F!6$(`/KA5Y`/```@`(("`"`"!"`(*`-!$`,$(`@I`T$0``0`("@%
+M@0@"!"`(L`\``"```(G@5P(#`"`I!8$(`P0@"`")X%<"`0`@`?XA0(`!`"#0
+M#P``(```@B!0`'Q?8%"V`@`F`T$0`'Q?8,#>`@`&!"$(`/K@5_`/```@`($"
+M`"``?%]@4+8"`"8%80@%^N%7#`$`(`"Z&B@``0`@$!```"```((@4`""`&`$
+M@.T+((`/.!`0;@L$/@X0`#8.$``X;F,P$```(``8?HY3$!H.$!0<#A```,!A
+M`(LA*```H&$`^N97@@$`(%`0```@`'7^'V"S_C]@``$V*`""(%``@@!```(`
+M0`)^`(``?%]@<!```"``3-@"```$````@>97@0$`(`'^($`%^N!7B_K_)P""
+M`$"0$```(````@!``GX`@`!\7V!,V`(```0`0`@`(`@$`*`)`!P'8+`0```@
+M`("Z"B@`F@9@`)D?*!``K@D4`,X)!(#M"R"`#S@8$&X+T!```"``!#X.$``V
+M#A``.&YC*'Z.4Q`:#A`4'`X0&!X.$!P@#A#P$```(``@(@X0)"0.$```(&(`
+M@@!B``3A80"&P6$`"*)A@'$A*!`1```@````0&(`>NE7@@$`('7^'V"U_C]`
+M@.<U*``$05``!"%`,!$``"```(0@0`+^((``?!]@3-@"``"``````>E7@0$`
+M(`%^04!0$0``(``%>N%7B_K_)P`$(4``A"!``OX@@`#\`$!,V`(`"`"@"'`1
+M```@``0`0`H`H@A@`"`H8`">1V``'&=@`)J&8``W"R@`)`E@D!$``"``__\_
+M8`#<("@0`*X)%`#."1@`[@D<``X*(``N"B0`3@JP$0``(``$@.T+((`/."@0
+M;@L`?%]@X*\"```((`@``H$0`@@@"-`1```@``("@1`$"``(!`"!$`"`#S@`
+M?#]@&*\"``"``!``>N!7\!$``"```@(`(`""(%``?!]@U*X"```"`!``@`\X
+M`'P_8`2O`@`0$@``(```@``0`(`/.`0^#A``-@X0`#AN8Q!^CE,`?!]@V-L"
+M`#`2```@```$``@`>N!7@@<`(`!\/V!.X`(``(0`"`!ZX%<"!0`@4!(``"``
+M`?X?8`"`0!``?!]@M-X"```$``@`>N!7@0$`(`?^'V!P$@``(```@B!0@"`;
+M*`2`[0L@@`\X$!!N"P0^#A``-@X0`#AN8Y`2```@`!!^CE,/?D!H`!`A&`!\
+M'V#ZK@(```2`$`!\'V"TW@(`L!(``"````0`"`!ZX%>!`P`@`'P?8/BN`@``
+M"``(@/T%*`!\'V#0$@``(`"\W0(``,L.*`2`[0L@@`\X$!!N"P!\/V#DK@(`
+M`(``$/`2```@``"`#S@$/@X0`#8.$``X;F,0?HY3`?Y?8`!\/V"HUP(`$!,`
+M`"```(1`$``$05``?#]@D+8"``B%0!``>N!7"/X?8($!`"`P$P``(```?#]@
+M```(```!`"``?#]@```$`(`&&R@$@.T+((`/.%`3```@`!`0;@L$/@X0`#8.
+M$``X;F,4?HY3$!H.$```H&$`C@88<!,``"``@"`G*`!\/V!(WP(``(0@"`#Z
+MX%<!`@`@`'P_8$S?`@"0$P``(```@"`(@`$`(`!\/V#DK`(``(`@"``"`&``
+M>N!7@0$`(+`3```@``!\'V#LK@(``!H`$!``K@D$@.T+((`/.!00;@L$/@X0
+MT!,``"```#8.$``X;F,0?HY3`((@4`!\'V",WP(```)`$(`R`RCP$P``(``$
+M@.T+((`/.!`0;@L$/@X0`#8.$``X;F,0?HY3`#4#*!`4```@``2`[0L@@`\X
+M$!!N"P0^#A``-@X0`#AN8QA^CE,0&@X0,!0``"``%!P.$```0&``?!]@M-X"
+M```$``@`>N!7@@T`(`!\WV%0%```(`#`W@(``!RG80#ZX%<!"P`@`'KA5P$*
+M`"`!A$80-/X&0'`4```@`("A_2\`F@9@`"P:*`!ZX%>"!@`@`?X_8`!\'V"\
+MW@(`D!0``"````)`$`!\'V"TW0(```0@"``<!V``00XH`((@4`!\'V"P%```
+M(`"]W@(```)`$!``K@D4`,X)!(#M"R"`#S@8$&X+!#X.$-`4```@```V#A``
+M.&YC&'Z.4Q`:#A`4'`X0`)JF40!\'V#HVP(`\!0``"```!I`$`!\'V"TW@(`
+M`!I`$`_^7V``?-]A^*X"```$AQ`0%0``(```?!]@^JX"```$@!`/_A]@`$$J
+M*`!\/V#\K@(``("`$#`5```@```(!PB`4RHH`'P_8*K>`@``@(`0`'P?8`2O
+M`@``&@`04!4``"```'P?8!BO`@``&@`09/X_8`!\'V#DK@(```(`$`!\/V!P
+M%0``(```"0```'P?8`BO`@```@`0`'P?8%C?`@``&@`0``1!4)`5```@``-^
+M(8``A"!``((@0`7^?V``_`!`8-<"``$&0!`!?D%`L!4``"``!'KA5PO[_R<`
+MFJ91`'P?8-2N`@``&@`0`?Y_8`!\'V#0%0``(`#PW@(```8`$`?^/V``?%]@
+MP-X"```"01`&_A]@`0!!$/`5```@``!\'V`,KP(```8`$`!\'V"\W@(``!I`
+M$`!\'V#@W@(`$!8``"```!H`$`!\'V#DW@(``!H`$`!\'V",WP(``!I`$`!\
+M'V`P%@``(`!\WP(``!I`$`!\'V!0WP(``!H`$`_^7V``?!]@N-L"`%`6```@
+M```$@!``?!]@3N`"```:0!``?!]@V-L"```:0!``?!]@<!8``"``3^`"```:
+M0!!N_E]@`'P?8%#@`@``!``0`'P?8%3@`@"0%@``(```&D`0`'P?8+W>`@``
+M&D`0`'P?8*C7`@``&D`0`'P?8+`6```@`.O;`@``&D`0`'P?8.G;`@``&D`0
+M`'P?8%C@`@``&D`0T!8``"```'P?8$#?`@``&D`0`'P?8$C?`@``&D`0`'P?
+M8$3?`@#P%@``(```&@`0`'P?8$S?`@``&@`0`'P?8/3>`@``&@`0`'P?8!`7
+M```@`/3;`@``&@`0`'P?8'3?`@``&@`0`'P?8'C?`@``&@`0,!<``"```'Q?
+M8(;>`@`6&D$0&QI!$!T"01`$_A]@'@!!$`!\'V!0%P``(`"X"P``(`"!$`!"
+M!"B`,Q<H$`"N"10`S@D$@.T+((`/.'`7```@`!@0;@L$/@X0`#8.$``X;F,0
+M?HY3!OX?8!#^/X"`?1HHD!<``"``!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC
+M&'Z.4Q`:#A"P%P``(``4'`X0`?Y?8`!\'V#HVP(```1`$`!\/V"0M@(`"(5`
+M$-`7```@``!\'V"TW@(```0`"`!ZX%>"```@@)86*`!\WV&HUP(`\!<``"``
+M``0'"`!ZX%<!"@`@`'P_8)"V`@`)A0`(`'K@5X$'`"`0&```(`"`-Q@H`)JF
+M40!\'V#KVP(``!I`$`!\'V#IVP(``!I`$#`8```@``!\'V!8X`(``!I`$`G^
+M'V``@B!0@&8:*``:1Q``?#]@4!@``"``D+8"``F%``@`>N!7`@$`(`'^7V`)
+MA4`0$`"N"10`S@EP&```(``$@.T+((`/.!@0;@L!_C]@`'P?8`RO`@```@`0
+M`(`/.)`8```@``0^#A``-@X0`#AN8Q!^CE,``"!@`'P?8(;>`@`>`D`0L!@`
+M`"```'P_8+3>`@``A"`(`/K@5X$``""`'`XH!(#M"R"`#SC0&```(``0$&X+
+M`'K@5P$!`"``^N!7@@(`(`""(%``?!]@X-X"`/`8```@```"`!``!@`@`?Y?
+M8`!\'V#@W@(```0`$`!\7V`<L`(`$!D``"```(@`"```@1`"B``(`@"!$`2(
+M``@$`($0`(`/.`!\/V`P&0``(`"XVP(``("`$`"`#S@$/@X0`#8.$``X;F,<
+M?HY3$!H.$%`9```@`!0<#A`8'@X0``#@80""P&$`>N=7`@$`(`#ZYU>"$P`@
+M<!D``"```(("*`'^/V``?!]@C-\"```"0!``^N=7@@(`(````%"0&0``(```
+M?%]@C=\"````01"`#0`@`'R_88[?`@``C@<8!OX_8+`9```@`(!0_B\`#B`8
+M`'Q?8(W?`@```$$0`(9A4`"#X5>*!P`@T!D``"````@'"`"`AA`""`<(`H"&
+M$`0(!P@$@(80!G['00;^ID'P&0``(``!_@%```Y@&`!\7V"-WP(```0A"`"#
+MX5>+^/\G$`"N"1`:```@`!0`S@D8`.X)!(#M"R"`#S@<$&X+!#X.$``V#A``
+M.&YC,!H``"``$'Z.4P!\/V#4K@(``(``$`!\'V`8KP(`````"`!ZX%=0&@``
+M(``"`0`@````4`"``!``?!]@M-X"```$``@`>N!7`0(`('`:```@``!\/V#4
+MK@(``(``"(")#2@$@.T+((`/.!`0;@L`>N!7D!H``"``@@(`(`""(%``?!]@
+MY-X"```"`!``!@`@`?Y?8`!\'V"P&@``(`#DW@(```0`$`!\7V`DL`(``(@`
+M"```@1`"B``(`@"!$-`:```@``2(``@$`($0`(`/.`0^#A``-@X0`#AN8Q!^
+MCE,`?#]@\!H``"``"*\"``"``!``$"`8`'Q?8(;>`@`@`($0`((`8`#"#2@0
+M&P``(``$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,0?HY3('K@5S`;```@``T1
+M`"``AF%0`'K@5XX%`"``A(`(`/Q!0"RP`@``"$$04!L``"```(2`"`!ZXE<!
+M`@`@`?YA0`'^($``!^!7C?K_)P```%!P&P``(```?%]@++`"```&@4$``$80
+M`(X!&`!\/V"IW@(``(9`$)`;```@``!\/V!(KP(`-("`$`!\'V"TW@(```0`
+M"`!ZX%>!`0`@L!L``"```OX?8``$(6``1PTH!(#M"R"`#S@0$&X+`'P_8%#@
+M`@#0&P``(```@``0`(`/.`0^#A``-@X0`#AN8Q1^CE,0&@X0``"@8?`;```@
+M``"`)@@!_D!@`'P?8%3@`@``!$`0"/X`8`%ZX%>"!0`@$!P``"```'P?8,#;
+M`@`````(`'K@5P(#`"``?!]@O-X"```$``@P'```(```>N!7@0``(`"8%B@`
+M@"8("/X`8`!ZX%<!`0`@`?X_8%`<```@`(```"``@B!0`'P?8+W>`@```D`0
+M`(`F"`+^`&``>N!7<!P``"```0$`(`'^/V"````@`((@4`!\'V"HW@(```)`
+M$`2`)@B0'```(```^N!7`0(`(`!\'V"0M@(`!`,`$``!`"#__S]@`/W_)[`<
+M```@`!``K@D$@.T+((`/.!00;@L$/@X0`#8.$``X;F,4?HY3T!P``"``$!H.
+M$```(&``?+]A>+`"``":!F`)_E]@@)+\+P```%#P'```(```?#]@!*\"``"`
+M`!`&A`8(`7K@5P(!`"`!_A]@`(``$!`=```@``!\OV%XL`(``(0&"`&$A@D(
+M?H:!`!@`:`*$A@D0?H:!,!T``"```!@`:`.$A@D8?H:!`!@`:`%^`&@`@$80
+M"'X`B`&`1A!0'0``(``(?@"(`H!&$`A^`(@#@$80$`"N"02`[0L@@`\X%!!N
+M"W`=```@``0^#A``-@X0`#AN8Q!^CE,``"!@`'P?8(;>`@`=`D`0D!T``"``
+M`'P_8+3>`@``A"`(`/K@5X$``""`@`TH!(#M"R"`#SBP'0``(``0$&X+!#X.
+M$``V#A``.&YC%'Z.4Q`:#A```*!A`/KF5]`=```@`((!`"!P_A]@:/X_8(!0
+M-"@`@"8(`'P?8)"V`@`,`P`0\!T``"```_X`8`!\7V"&W@(`&P!!$`"`)@@$
+M_@!@%0!!$`"`)@@0'@``(``(_B!@`'P?8&3?`@```@`0`(`F"!#^(&``?!]@
+MK-X"`#`>```@```"`!``@"8(`/P@8``@````?!]@4-\"```"`!``@"8(4!X`
+M`"``(/X@8`!\'V#PW@(```(`$`"`)@A`_B!@`'P?8%S?`@!P'@``(````@`0
+M`(`F"`#\(&```@```'P?8&C?`@```@`0`(`F")`>```@``#\(&``"````'P?
+M8'2P`@```@`0`(`F"`#\`&``@```L!X``"```'K@5P$$`"`!_C]@`'P?8$#?
+M`@```D`0!(`F"`!\'V#0'@``(`!$WP(```(`$`"`!@@`?`!@```!``!ZX%<!
+M!``@`?X_8/`>```@``!\'V!(WP(```)`$`B`)@@`?!]@3-\"```"`!``?!]@
+M$!\``"``M-X"```$``@`>N!7@0,`(`!\'V!TL`(`````"`!ZX%<P'P``(``"
+M`0`@`?X?8(`Z#2@0`*X)!(#M"R"`#S@4$&X+!#X.$%`?```@```V#A``.&YC
+M$'Z.4X`W!B@$@.T+((`/.!`0;@L$/@X0<!\``"```#8.$``X;F,4?HY3$!H.
+M$`]^(&@`D``8`'R_8?BN`@"0'P``(```@H80@/(H*`!\/V#\K@(``("`$`"(
+M!@@`!2DH`'P_8+`?```@`*K>`@``@(`0`'P?8+3>`@``!``(`'K@5P$$`"``
+MB`8(T!\``"```'P_8/JN`@``B"`(`%L$*`!\'V"\W0(`@"@-*!``K@GP'P``
+M(``$@.T+((`/.!00;@L$/@X0`#8.$``X;F,4?HY3$!H.$!`@```@````H&$`
+M?!]@L-X"```:`!`"_B9@`'P?8(;>`@`7`D`0,"```"```?XF8!@"0!``?#]@
+MM-X"``"$(`@`^N!7@0``((`K#2A0(```(``(_@9@`'K@5P!\/V#HS`(``(@`
+M"`$!`"`0?@!H@```('`@```@`.]_`&``@(`0`'P_8.C,`@``B``(@+X,*!``
+MK@D$@.T+D"```"``((`/.!00;@L$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A"P
+M(```(````*!A`(0F"`3ZX%>*`0`@`81&"!!ZX5<,`@`@</X?8-`@```@``!\
+M/V!S`0```/$S*`+^!D``A"8(`_Y@@`""84``AF%`\"```"```'S?86#7`@`"
+M?B=``(8@0`&$1@B`-B8H`(0F"`/^8(`0(0``(```@F%``(9A0`&$1@@`G`%`
+M`01`$`!\'V"TW@(```0`"#`A```@``!ZX%<!!@`@`(0F"`&"7X``?#]@D+8"
+M``"%``@`!`!H4"$``"```(%`$`!\'V!,L0(`(/X_8``$05"`!AXH$`"N"10`
+MS@EP(0``(``$@.T+((`/.!@0;@L`?#]@6-\"``"``!``@`\X!#X.$)`A```@
+M```V#A``.&YC&'Z.4Q`:#A`4'`X0``"@80#]YE?L`0``L"$``"``#@,`(/;^
+MOT$`?%]@D+8"`!`!`0@!?@!`$`$!$`!\WV'0(0``(`!<X`(````'"`":1F``
+M]/LO$/Y&4```!P@,`"`(``/A5_`A```@``8#`"`,!``0`'Q?8)"V`@`0`0$(
+M`7X`0!`!`1`0`*X)$"(``"``%`#."02`[0L@@`\X&!!N"P!\7V"TN`(`3`DA
+M"$H#@1`P(@``(`#\?V!@`((!0`A^`$``$"`83`&!$`#]X%?"`0``"P(`(%`B
+M```@``3^'V!*`8$0#/X!0$P!@1``@`\X`((@4`'^($``?`!0<"(``"``[`$`
+M``!ZX%>)_?\G`((`8`"`#S@$/@X0`#8.$``X;F.0(@``(``<?HY3$!H.$!0<
+M#A`8'@X0``"@80""X&$`?-]A!``P`+`B```@`(#)^R\``&<(`?KF5P(!`"`0
+M_C]@@```("#^/V``^N=7T"(``"```0,`(`'^GV``_$9`1+D"``0)01``AF!H
+M@`(`(``(@E#P(@``(```_$9`1+D"``0)01``@F%P^_\A8``"!Q``P?LO````
+M4!`C```@`!``K@D4`,X)&`#N"02`[0L@@`\X'!!N"P0^#A``-@X0,",``"``
+M`#AN8QQ^CE,0&@X0%!P.$!@>#A```,!A`)[G40":IE%0(P``(``!!`<(!GK@
+M5XL.`"`&?@!0`_X_8``:_2\!?@!```Y`&'`C```@``"%YU<*"P`@`)X'0``>
+M`$````=`!00@"`#ZX%<,!0`@D",``"``!00@"`[ZX%>)`P`@!00@"`8$``@!
+M?@!0``(`0`YZX%>P(P``(`")```@`?Z_80'^!T``#N`9_W\!0``.0!@`A>=7
+M"_7_)]`C```@``":!F`0`*X)%`#."1@`[@D$@.T+((`/.!P0;@L$/@X0\",`
+M`"```#8.$``X;F,L?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A`0)```(``D)`X0
+M``#@80""`&(#_A]@_(%-$/ZA31````!0_X%-$#`D```@``!\'V`$OP(`('_`
+M0?R!+0H`?#]@U+X"`"C^H$$`?%]B4"0``"``E,("``"5^R\`"()0$``I"`">
+M0$``>NA7C@T`(#]^06!P)```(``$?N&``(#&"``.8T``?#]@U+X"`#2`(`@$
+M_J!H`)P">9`D```@``B`(0@`D"!X#((!$`2<`1``#N-``(H#$`-^88`$@"8(
+ML"0``"```(:@0`"&8$``H@$0`'P_8'A6-!($@@(0`7Z"0`%^04#0)```(```
+M">A7C?+_)P"'^R\```!0$`"N"10`S@D8`.X)'``."O`D```@`"``+@HD`$X*
+M!(#M"R"`#S@L$&X+!#X.$``V#A``.&YC$"4``"``)'Z.4Q`:#A`4'`X0&!X.
+M$!P@#A`@(@X0``#@80""P&$P)0``(```!`%B````4``$)P@#^N!7@0(`(`,$
+M)P@5^N!7`B(`(%`E```@`!7ZYU<!(0`@`@2G"0!\/V*4P@(``'/[+Q2`*`@`
+M@^97<"4``"``C@``(`""H&$`?#]@U+X"`"C^P$``?#]BE,("``S^J$"0)0``
+M(```!$%0`/KF5XX%`"`$@"((`(0@0#_^(&`$_H"```!C"+`E```@``""(%``
+MB(%```("$`%^04``A>97C?K_)PB`(@@`FB!0T"4``"``"(("$`2`(@@`FB!`
+M/_X@8`2"`A"`9?LO````4`!ZX%?P)0``(`"!`0`@4/X?8/+^/V"`3#,H@%_[
+M+P!\/V*4P@(`$(`H"!`F```@`#_^8&``?#]@U+X"`"R`0`@#_B&``(1@0`"$
+M(````@<0,"8``"``!(`A"``""!``6_LO````4``$)P@#^N!7@>'_)P,$)PA0
+M)@``(``5^N!7`@$`(!7ZYU<"W_\G$`"N"10`S@D8`.X)'``."G`F```@`"``
+M+@H$@.T+((`/."00;@L$/@X0`#8.$``X;F,H?HY3D"8``"``$!H.$!0<#A`8
+M'@X0'"`.$```P&'\_^U!^/^M00!*^R^P)@``(```?!]BE,("`!``*`@__F!@
+M`'P_8-2^`@`L@$`(`_XA@-`F```@``"$8$``A"```(('$`2`(0@`@@80@$7[
+M+P`$!P@`GB=@\"8``"```)I&8(#!_R_X@4T(`'KA5P$%`"``!`<(`GK@5P$!
+M`"`0)P``(``!_C]@@```(`""(%``'`=@``(!.`!ZX%>"$@`@_H6M"3`G```@
+M``!\'V*4P@(`@#C[+Q0`*`@`@^97C@``(`""H&$`?#]@4"<``"``U+X"`"C^
+MP$``?!]BE,("``Q^J$``!$%0`/KF5XX%`"!P)P``(``$@"((`(0@0#_^(&`$
+M_H"```!C"`""(%``B(%```("$)`G```@``%^04``A>97C?K_)PB`(@@`FB!0
+M"(("$`2`(@@`FB!`L"<``"``/_X@8`2"`A``*_LO````4!``K@D4`,X)&`#N
+M"1P`#@K0)P``(``$@.T+((`/."@0;@L$/@X0`#8.$``X;F-(?HY3$!H.$/`G
+M```@`!0<#A`8'@X0'"`.$"`B#A`D)`X0*"8.$"PH#A```$!B$"@``"```((`
+M8OS_+4+X_ZU!`!S[+P!\WV&4P@(`$``G"#_^0&`P*```(```?#]@U+X"`"R`
+MX`D#?B&``)Y`0`">(```@@@0!``A"%`H```@``""!A"`%_LO``0)"`"B*&``
+MFD9@@)/_+P``8&(`^NE7<"@``"```IP`(/B!+0H0@$@*@'X(8`!ZX%<"'0`@
+M3@@)"`%^($"0*```(```D``83@*)$(@(*0@!_B!```/@5X*5`"`!_A]@?``)
+M$+`H```@``!\*4```@``RH4`"`A^`&``>N!7@0(`(`!\/V`\K0(`T"@``"``
+M`(``"`%^`$``@``0`'P?8`2_`@`D`4`(`'KA5X$!`"#P*```(`#W_RU``*((
+M8``"`3C^A:T)`'S?893"`@"`_OHO%``G"!`I```@``"#YE>.```@`(*@80!\
+M/V#4O@(`*/[`0`!\WV&4P@(`,"D``"``#'ZG0``$05``^N97#GX`(`2`(@@`
+MA"!`/_X@8`3^@(!0*0``(````&,(`((@4`"(@4```@(0`7Y!0`"%YE>-^O\G
+M`'@`('`I```@``"7`B@`>N!7`GL`(`":IE%*!"D(`?X`0$H`21!,"`D(D"D`
+M`"```7X`0$P`B1`$_A]@@$87*```8&(`^NE7`G4`(`7^'V"P*0``(`#\@4T0
+M_(&-"OB!;0H`Z/HO$``G"#_^(&`#_B"``)Y`0-`I```@``">X$$`J`<0!"8!
+M$(#F^B\`IFE2#WX(8`)^`%`'>N!7\"D``"``#2@`((`H`"!*!"D(500)"`"!
+MX%>*'``@`7X`4`"!X%<0*@``(`""`P`@`?X?8!@`B1``?"E```(``,J%``@(
+M?@!HRH%`$#`J```@`/R!30CJ_VU``*((8``D*6``OQHH``!@8NJ+#0@`>N!7
+M4"H``"``C"0`(``0X!D`?-]AE,("`(#3^B\4`"<(`(/G5XX``"!P*@``(```
+M@N!A`'P_8-2^`@`H_L!``'S?893"`@`,?J=```1!4)`J```@``#ZYU>.!0`@
+M!(`B"`"$($`__B!@!/Z`@```8P@`@B!0L"H``"```(B!0``"`A`!?D%``(7G
+M5XWZ_R<(@"((`)X@4`B"`A#0*@``(``$@"((`)X@0#_^(&`$@@(0`,;Z+P"F
+M:5*`$0`@"?X?8/`J```@`'P`"1"`#P`@!/X?8'P`"1`E_A]@`$H`(`/^'V!\
+M``D0$"L``"````P`(`;^'V!\``D0!/X?8``)`"`'_A]@?``)$`7^'V`P*P``
+M(```!P`@'_X?8(!#`"`"?H"!`'R&`4PK``````8X?@H``%`K```@`'X*``"^
+M"@``P@H``'X*``#%"@``R0H``'X*``"`;@8H<"L``"````!@8@'^OV$!^N97
+M@CH`(`!\'V`$OP(`)`%`"`!ZX5>0*P``(`"!)0`@`((@4/>#31#W_RU``*((
+M8``"`3CWA0T(`'K@5[`K```@`((.`"#^A:T)`'S?893"`@"`I_HO%``G"`"#
+MYE>.```@T"L``"```(*@80!\/V#4O@(`*/[`0`!\WV&4P@(`#'ZG0``$05#P
+M*P``(```^N97#B<`(`2`(@@`A"!`/_X@8`3^@(```&,(`((@4!`L```@``"(
+M@4```@(0`7Y!0`"%YE>-^O\G`"$`(/R!30CJ_VU`,"P``"```*((8``D*6``
+M@!HH``!@8NJ+#0@`>N!7#"$`(``0H!E0+```(```?-]AE,("`("4^B\4`"<(
+M`(/F5XX``"``@J!A`'P_8'`L```@`-2^`@`H_L!``'S?893"`@`,?J=```1!
+M4`#ZYE<.%``@D"P``"``!(`B"`"$($`__B!@!/Z`@```8P@`@B!0`(B!0``"
+M`A"P+```(``!?D%``(7F5XWZ_R<`#@`@_H6M"0!\WV&4P@(``(;Z+]`L```@
+M`!0`)P@`@^97C@``(`""H&$`?#]@U+X"`"C^P$``?-]A\"P``"``E,("``Q^
+MIT``!$%0`/KF5XX%`"`$@"((`(0@0#_^(&`0+0``(``$_H"```!C"`""(%``
+MB(%```("$`%^04``A>97C?K_)S`M```@``B`(@@`FB!0"(("$`2`(@@`FB!`
+M/_X@8`2"`A"`>/HO4"T``"```*9I4@"F"6`0`*X)%`#."1@`[@D<``X*(``N
+M"B0`3@IP+0``(``H`&X*+`"."@2`[0L@@`\X2!!N"P""(%``!$%0`/P`0)`M
+M```@`([?`@``!$`0`?X`0``.(!C`^N!7"_S_)P!\'V"-WP(`L"T``"````1`
+M$`"`#S@$_C]@``1!4`!\'V#TK`(```0`$`!\'V#0+0``(`#XK`(```0`$`!\
+M'V!TK0(```0`$`!\'V"<K0(```0`$/`M```@``!\'V`XK0(```0`$`!\'V`4
+MK@(```0`$`!\'V"DK@(`$"X``"````0`$`!\'V"8K@(```0`$`!\'V``K@(`
+M``0`$`!\'V`P+@``(`"(K@(```0`$`!\'V"PK@(```0`$`!\'V"0K@(```0`
+M$%`N```@``!\'V"0K0(```0`$`!\'V!XK0(```0`$`!\GV!\K0(`<"X``"``
+M`(9A4``$05``!`(0`?X!0``.8!@$?H)``(/A5XO\_R>0+@``(```?!]@"*T"
+M```$`!``?)]@#*T"``"&85``@^%7B@,`(+`N```@```$05``!`(0`?X!0``.
+M8!@$?H)``(/A5XO\_R<`!$%0T"X``"```'P?8""M`@``!``0`'R?8"2M`@``
+MAF%0`(/A5XH#`"#P+@``(```!$%0``0"$`'^`4``#F`8!'Z"0`"#X5>+_/\G
+M``1!4!`O```@``!\'V"@K0(```0`$`!\GV"DK0(``(9A4`"#X5>*`P`@,"\`
+M`"````1!4``$`A`!_@%```Y@&`1^@D``@^%7B_S_)P`$05!0+P``(```?!]@
+MN*T"```$`!``?)]@O*T"``"&85``@^%7B@,`('`O```@```$05``!`(0`?X!
+M0``.8!@$?H)``(/A5XO\_R<`AF%0D"\``"```OXA@``$05``_`!`M*X"```$
+M`!`!_@%```Y@&`7ZX5>P+P``(`"+^_\G`(`/.`0^#A``-@X0`#AN8RQ^CE,0
+M&@X0%!P.$-`O```@`!@>#A`<(`X0("(.$"0D#A`H)@X0````8@""H&$`!.%A
+M\"\``"```(9A8@`,0V*`(/HO```@8AC^'V``0_XO`'P?8`")`@`0,```(```
+M?T!``'P?8+2X`@!*"2`(`(3`01#^'V``A$!```!!$#`P```@``"01Q@`(`A@
+M`)HF8(`,-"@*_B>``(``4`0`!Q`(&@<04#```"``#"`'$`"F!U`*?@"`%``'
+M$!`"!Q`8_A]@`"0I8(`U,"AP,```(```H@A@@!/Z+Q``K@D4`,X)&`#N"1P`
+M#@H@`"X*)`!."I`P```@`"@`;@H$@.T+((`/."P0;@L$/@X0`#8.$``X;F,8
+M?HY3L#```"``$!H.$!0<#A```,!A``CZ+P``H&$"_A]@@"K^+P!\'V#0,```
+M(```B0(``']`0`!\'V"TN`(`2@D@"`7^'V``A$!```!!$/`P```@``+^'V``
+M'"=@`"0P*`":!F```OHO$`"N"10`S@D$@.T+$#$``"``((`/.!@0;@L$/@X0
+M`#8.$``X;F,D?HY3$!H.$!0<#A`P,0``(``8'@X0'"`.$"`B#A```,!A`"`(
+M4@+^_V&`]ODO``"@85`Q```@``!\'V#DO`(``$0`"`%ZX%>"`0`@`?X?8@'^
+M'V``'ADH<#$``"``@/'Y+P``(&(`G@=@`!3^+P!\'V``B0(``']`0`!\'V"0
+M,0``(`"TN`(`2@D@"!/^'V``A$!```!!$`">!V``'"=@@`TP*+`Q```@``"B
+M"&"`Z_DO`7KH5P(!`"````!0`!,9*`":!F"`Z/DOT#$``"``$`"N"10`S@D8
+M`.X)'``."B``+@H$@.T+((`/."00;@OP,0``(``$/@X0`#8.$``X;F,@?HY3
+M$!H.$!0<#A`8'@X0'"`.$!`R```@````H&$`@@!B(_[?80#<^2\``.!A(_X?
+M8(#^_2\`?!]@,#(``"```(D"``!_0$``?!]@M+@"`$H)(`@`A&!`#OX?8`"$
+M0$!0,@``(````$$0`II!$`""(%`#_D%`#OKF5X($`"``_`!`M+@"`'`R```@
+M``@%``@``$$0`7Y!0`'^($`@^N!7"_S_)P`$`"``_`!`D#(``"``M+@"`"@%
+M``@``$$0`7Y!0`'^($`@^N!7"_S_)P`<!V"P,@``(```("A@@.PO*`">!V"`
+MRODO$`"N"10`S@D8`.X)'``."M`R```@``2`[0L@@`\X(!!N"P!\'V"DN0(`
+M"04`"`!ZX%>"`P`@\#(``"```'P?8//;`@``!``(%'K@5P$!`"````!0@```
+M(`'^'V`0,P``(```@`\X!#X.$``V#A``.&YC+'Z.4Q`:#A`4'`X0&!X.$#`S
+M```@`!P@#A`@(@X0)"0.$"@F#A```"!B`!S'40`@"%(`)$E24#,``"``!_X?
+M8``X#2@&_A]@`#,-*`#ZZ%<(_A]@`0$`(``U#2AP,P``(`"````@`#`-*`!\
+MOV'HV`(``(`&"!`(``@`>N!7@0(`()`S```@``!\/V#LW`(``(0@"`#ZX%<!
+M`P`@`?Y_8`!\/V#LW`(`L#,``"```(9`$`">YU&`(0`@`_X?8`'^/V`!_E]@
+M@/0/*```X&'0,P``(```^N=7@10`(`"(!P@`'@!"$*`'$%Q^2$(`!$%0%`2(
+M$/`S```@`!8$B!!`!$@0`?Y_8$,&2!`"_A]@-@!($`!\'V`&W`(`$#0``"``
+M``0`"$@`2!!1!$@05`1($!C^'V!Z`(@0'`2($%`$2!`P-```(`!3!$@0D/X?
+M8%P`2!!=!$@0`(`F"`"(``AL`(@0`H@`"%`T```@`&X`B!`$B``(<`"($`!\
+M/V"<N`(``(@`"&8`B!`"B``(<#0``"``:`"($`2(``AJ`(@0`)#Y+P!\?V*D
+MN0(`#($I"`#ZX%>0-```(``"!@`@`'P_8.S<`@``A"`(`/K@5X(#`"`!_G]@
+M+(=)$+`T```@``",^2\0_PE`__\_8`!W'"B````@@(GY+P#ZYU<!*0`@T#0`
+M`"```'Q_8J2Y`@`,@2D(`/K@5X$F`"``FJ91`(``"`!ZX%?P-```(`"!)``@
+M`'P_8.S<`@``A"`(`/K@5P(B`"``^N=7`2$`(!`U```@```$05!*!$@03@2(
+M$`+^'V`U`$@0`)H&0``:`$`"?@"`,#4``"```'Q_8J2Y`@`,@2D(`(`@``"(
+M``@$`(D0`H@`"`8`B1!0-0``(``$B``("`")$`0$"0@!?@!@`'K@5P$!`"!2
+M!$@0``$`('`U```@``'^?V!2!D@0`)X'8`'^/V``SQ$H`'K@5P":!D``&@!`
+MD#4``"```GX`@`!\?V*DN0(`#($I"(($`"`"_E]@`(``0`@$`!"P-0``(```
+M?#]@I.`"``"```@!?@!``(``$``$`"`!_E]@`(``0-`U```@``@$`!``?#]@
+M9*T"``"```@!?@!``(``$`'^WV$!_@9`\#4``"```!"@&0":!D``&@!``GX`
+M@`!\?V*DN0(`#($I"`"````0-@``(```>N!7@MO_)P#ZYU<!`0`@`)X'8``+
+M$"@`!$%0`'Q_8C`V```@`*2Y`@`,A0D0@%CY+P!\/V#LW`(``(0@"`#ZX%>"
+M`P`@4#8``"```?Y_8"R'21``5_DO$/\)0/__/V``0APH@```((!4^2]P-@``
+M(```^NA7`0(`(`'^?V``?']BI+D"``J'21``?!]@D.`"`)`V```@``````@`
+M>N!7@0``(``"`#@`>N=7`0$`(`;^'V``S0PHL#8``"``!_X?8`#(#"@0`*X)
+M%`#."1@`[@D<``X*(``N"B0`3@K0-@``(``H`&X*!(#M"R"`#S@L$&X+!#X.
+M$``V#A``.&YC&'Z.4_`V```@`!`:#A`4'`X0``#`80!`^2\`?+]AQ+H"`#F=
+M1A"`0/DO$#<``"``.84&"`!ZX%>!`0`@!/X?8(`J#B@`!``@`'P?8*[@`@`P
+M-P``(```!``(`'K@5X$!`"!4@08(`7X`0%2!!A`0`*X)%`#."5`W```@``2`
+M[0L@@`\X&!!N"P!\/V!`N0(``(4`"`!ZX%<!`0`@<#<``"``_W\`0`"!0!``
+M@`\X"'Z.4P`V#A``.&YC$(`-$!"$#0B0-P``(``">N!7`@$`(!"```B$!D`0
+M$H0-"``0;@L@@`\X"'Z.0[`W```@``A^CE,$/@X0`#8.$``X;F,4?HY3$!H.
+M$!"`#1``FJ91T#<``"``$(0-"`%ZX%>!!@`@``(`(!"```B$!D`0$H2M"0`$
+M`"#P-P``(``">N!7`?W_)P-ZX%<!`@`@4/X?8`!\/V#R!P``@`HQ*!`X```@
+M``":!F`0`*X)!(#M"Q00;@L@@`\X"'Z.0PA^CE,$/@X0,#@``"```#8.$``X
+M;F,4?HY3$!H.$!"`#1``FJ91$(0-"`%ZX%=0.```(`"!"``@``0`(!"`(`A<
+MA``("'X`8`!ZX%>!!0`@A(9`$'`X```@`!*$K0D`!``@`GK@5P'[_R<#>N!7
+M`0(`(%#^'V``?#]@D#@``"``%@@``(#Y,"@`F@9@$`"N"02`[0L4$&X+((`/
+M.`A^CD.P.```(``(?HY3!#X.$``V#A``.&YC%'Z.4Q`:#A`0@`T0`)JF4=`X
+M```@`!"$#0@!>N!7`0\`((`*`"`0@"`(9(B`"`0(`0@``>)7\#@``"```@4`
+M(&*(@`@""`$(``'B5P(#`"!@B(`(``@!"``!XE<0.0``(``"`0`@`?X?8(``
+M`"````!0`'K@5X$%`""$AD`0$H2M"3`Y```@```$`"`">N!7@?3_)P-ZX%<!
+M`@`@4/X?8`!\/V`Z"```4#D``"```.(P*`":!F`0`*X)!(#M"Q00;@L@@`\X
+M"'Z.0P0^#A!P.0``(```-@X0`#AN8Q1^CE,0&@X0`$``*```H&$`^N97@1,`
+M()`Y```@```\`"@!>N!7`A(`($S^?V``@B!0`H8&``+^0(``?(%`L#D``"``
+M"-\"`````A`!_@!```X@&`3ZX%>,^_\G4/Y_8`7^/V#0.0``(``"A@8``OY`
+M@`!\@4`(WP(````"$`'^`$``#B`8"?K@5_`Y```@`(S[_R=4_G]@"OX_8`*&
+M!@`"_D"``'R?8`C?`@``"(%!$#H``"`````&$`'^`$``#B`8#/K@5PS[_R=8
+MA`8(-``"$`!\'V`P.@``(``(WP(`@-`&*!``K@D$@.T+((`/.!00;@L$/@X0
+M`#8.$%`Z```@```X;F,@?HY3$!H.$!0<#A`8'@X0'"`.$````&(`?#]@<#H`
+M`"``[*P"``"```@!>N!7@?W_)P+^'V``@``0`!S'40`<IT&0.@``(```G*9!
+M`OZF@0!\/V#LS`(``((&0!H$``@`>N!7`08`(+`Z```@`!3^X$$`F@=``"`H
+M8`;^7V``1?HO`'K@5X("`"``G@9`T#H``"```((@4`S^7V``%OHO@`$`(`%^
+MQT$#>N=7"_3_)P```%#P.@``(```?#]@[*P"``"``!`0`*X)%`#."1@`[@D<
+M``X*!(#M"Q`[```@`""`#S@@$&X+`'Q_8%RJ`@``@4$(!(%A"`"&`!``>N%7
+M,#L``"```0<`(`'ZX5<"!@`@0P0A"``"0!!"!"$(`0)`$$4$(0A0.P``(``"
+M`D`01`0A"`,"0!!'!"$(!`)`$$8$(0@%`D`0````4'`[```@``"`#S@`?!]@
+M7*H"``0!``@`@`\X`'P?8%RJ`@```0`(D#L``"```(`/.`0^#A``-@X0`#AN
+M8R1^CE,0&@X0%!P.$!@>#A"P.P``(```?-]A7*H"```!IPD%A`8("'X@@`2$
+M!@@``B!H`'P?8-`[```@`""O`@```H`0&X0F"`!\'V`BKP(```)`$/C_[4$`
+MG@=@\#L``"```((@4`#D_R\`?!]@X*\"``">)V`&_E]@@*[X+X*$!@@0/```
+M(```?#]@Z*\"``"`0!"#A`8(`8!`$("$!@@"@$`0@80&"#`\```@``.`0!!^
+MA`8(!(!`$'^$!@@%@$`0?(0&"`:`0!!]A`8(4#P``"``!X!`$'J$!@@(@$`0
+M>X0&"`F`0!!XA`8("H!`$(6$!@AP/```(``(?B"`A(0&"``"`&@(?B"`AX0&
+M"``"`&@(?B"`AH0&")`\```@```"(&@`?!]@)*\"```"`!!)A"8(`'P?8."L
+M`@```@`0L#P``"``2(0&"`H!1Q``?#]@X,H"``"`@!!+A`8("'X@@$J$!@C0
+M/```(````B!H`'P?8.2L`@```@`0;X0&"`A^((!NA`8(``(@:/`\```@``!\
+M'V#$P@(```(`$(N$!@@(?B"`BH0&"``"`&@(?B"`$#T``"``B80&"``"`&@(
+M?B"`B(0&"``"(&@`?!]@Z*P"```"`!`P/0``(`"/A`8("'X@@(Z$!@@``@!H
+M"'X@@(V$!@@``@!H"'X@@%`]```@`(R$!@@``B!H`'P?8,C"`@```@`0$`"N
+M"10`S@D8`.X)<#T``"``!(#M"R"`#S@D$&X+!#X.$``V#A``.&YC&'Z.4Q`:
+M#A"0/0``(``4'`X0``#`88#9%2@`FJ91`'P?8.S,`@`,```(`'K@5[`]```@
+M``(%`"`$``<(`'P`8/S`'P``>N!7@@(`(`A^!T``9P,HT#T``"```'K@5X(`
+M`"`!_K]A`(X&&!``K@D4`,X)!(#M"R"`#SCP/0``(``8$&X+!#X.$``V#A``
+M.&YC$'Z.4X!>'2A]_C^8@%_Y+Q`^```@``!\/V#DS`(``(`@"`"``$`$@.T+
+M((`/.!`0;@L`?!]@,#X``"``M+@"``1%``@`@`\X!#X.$``V#A``.&YC)'Z.
+M4Q`:#A!0/@``(``4'`X0&!X.$`">YU&`QQLH``#`80":IE$```!0_($-$'`^
+M```@``!\'V"LX`(```@`"`!ZX%<!!@`@`'P?8.O;`@``!``(D#X``"```'K@
+M5X(#`"``?!]@6.`"```$``@`>N!7`@$`(`":!F"P/@``(```(``@`'P?8""]
+M`@#__S]@@#8;*`!ZYU<!!0`@_/]-0-`^```@```<!V`#_C]@`/<;*`!ZX%>!
+M`0`@</X?8#W^/V"`+C`H\#X``"```?[_80'^/V``?!]@@+\"```#@!"`2`<H
+M`'K@5X$"`"`0/P``(```#`@H`'K@5P$!`"``7PHH`?Z_88!T'R@`?#]@C-L"
+M`#`_```@`"2``!"`=0DH`'P?8*S@`@``"``(`'K@5X$"`"``?!]@4#\``"``
+M7+D"``'^/V``!$%0@$<:*`;^/V``?!]@@+\"```#@!!P/P``(```^N=7@04`
+M(````%#X@0T0_($M"/C_34``'`=@@.`;*)`_```@``!ZX%>!`0`@=?X?8&C^
+M/V``&#`H`'P?8""]`@"`0ALHL#\``"```-__)Q``K@D4`,X)&`#N"02`[0L@
+M@`\X)!!N"P!\'V#0/P``(``$X@(`````"`"`#S@$/@X0`#8.$``X;F,8?HY3
+M$!H.$/`_```@`!0<#A```,!A#``'"`!ZX%<!!0`@`!P'8`!/#B@``*!A$$``
+M`"```)H&8("7(2@`F@9@`,P.*`P`!P@`>N!7`OO_)Q``K@DP0```(``4`,X)
+M!(#M"R"`#S@8$&X+!#X.$``V#A``.&YC$'Z.4U!````@``!F`"@$@.T+((`/
+M.!`0;@L$/@X0`#8.$``X;F,0?HY3<$```"```'K@5X$#`"``!0`@`'P?8.K;
+M`@```D`0!OX?8(!=%2B00```(```!``@!?X?8`""(%"`6Q4H``(`(`%ZX%<!
+M^O\G`GK@5[!````@``'\_R<$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,0?HY3
+MT$```"```OX?8`""(%``5!4H!(#M"R"`#S@0$&X+!#X.$``V#A#P0```(```
+M.&YC)'Z.4Q`:#A`4'`X0&!X.$!P@#A`@(@X0``#`81!!```@``!ZYU>!*0`@
+M`?K@5X(D`"``!$%0`'P_8!39`@`(@``(,$$``"```7X`8`!ZX%<!`@`@`7Y!
+M0!#^($`4>N%7!?S_)YP"!Q!000``(``!_A]@"(``$`0`!P@`?`!@``@```!Z
+MX%<!'P`@`_X?8'!!```@``B``!"`'0`@@/#W+P``X&&<`"<(#("@"0#ZYE<!
+M"P`@D$$``"```(``"A``*`A'A``(@'X`8`!ZX%<(`"@*@@4`(""```BP00``
+M(```("A@@"`.*`!ZX%<"`@`@=/X?8`!\/V#+`0``@-(O*-!!```@```@"&``
+ME0XH`*((8O__ID$`^N97@O7_)P#B'"@`?#]@\$$``"``*+("`'"!`!````!0
+MG``G"`B``!``G@=@`.'W+X`*`"`00@``(``$``<(`'P`8``(````>N!7G``G
+M"`B```B!`0`@`GX`:#!"```@``B``!"`!0`@_7\`8`B``!``!``@`OK@5X'E
+M_R<#^N!74$(``"``@??_)W/^'V``?#]@XP$```#`+R@0`*X)%`#."1@`[@EP
+M0@``(``<``X*(``N"@2`[0L@@`\X)!!N"P0^#A``-@X0`#AN8Y!"```@`!!^
+MCE,`?%]@]*P"````(0@!_B!```(!$(!Z#B@$@.T+L$(``"``((`/.!`0;@L`
+MCN-0`'Q_8+S=`@`"_H%``?Y?8`"$01#00@``(``!_G]@`(JB4`"`06``>N%7
+M@08`(`""06``>N%7`0$`(/!"```@`(#^WV"````@``S#4`#\0D`XP0(```5!
+M"``,06@`!$(0$$,``"```7Z"0`'^XT``AF%``?ZB0`CZX5<.]O\G`'Q_8+S=
+M`@`P0P``(``!CD$0`(`/.`0^#A``-@X0`#AN8Q!^CE,`>N!7`04`(%!#```@
+M``#ZX%<!`0`@`((@4`0"@!``@B!0$`(`$`"1`B@`>N!7<$,``"``@0``(`"3
+M+R@$@.T+((`/.!`0;@L$/@X0`#8.$``X;F.00P``(``0?HY3@(L"*`!ZX%>!
+M```@@(TO*`2`[0L@@`\X$!!N"[!#```@``0^#A``-@X0`#AN8Q!^CE.`G0(H
+M```@8`#ZX%<!`@`@T$,``"``2OX?8``$05"`D"@H@```(````%`$@.T+((`/
+M.!`0;@OP0P``(``$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A```,!A`)[W+Q!$
+M```@````H&$`'`=@`-,D*```P&$`F@9@@)WW+P`<!V`0`*X),$0``"``%`#.
+M"02`[0L@@`\X&!!N"P0^#A``-@X0`#AN8QA^CE-01```(``0&@X0%!P.$```
+M@&`!_M]A$`"B"`P`0@@XB&((`@@A"'!$```@``"&`%`"`($0.(AB"``(`0@`
+M!@!```"!$#B(8@@4B`((D$0``"````8`4!2`@A``"`$(``1@0`!\OV&DN0(`
+M3(4&"`AZX%>P1```(`""%0`@`'P_8.S8`@``A``(`'K@5P$3`"````!0`(!`
+M$-!$```@``*(`0@`>N!7@@T`(`G^'V!,@480!(@!"`!\(&#_/P``\$0``"``
+M`)``&$Z#AA``?#]@=*X"``"``!`&_@%``@@A"`;^(%`010``(```D"`8``P`
+M*``(`F"`S/\O`'P_8)RM`@``@``(`7X`0#!%```@``"``!"(@08(`7X`0(B!
+M!A``',=1``$`(`K^'V!,@4804$4``"```'R_8:2Y`@`P_P9`@(P:*``<!V`0
+M`*X)%`#."02`[0MP10``(``@@`\X&!!N"P1^CE,`!$%0```.$`!\'V"DN0(`
+MC`.`$)!%```@``#ZX%>,!0`@``!N"`&$`0@"?@!```8`0```#A`!!``(L$4`
+M`"```GX`0``$`$``$$`8`(7@5XGZ_R<$?HY#`(`/.`0^#A#010``(```-@X0
+M`#AN8QQ^CE,0&@X0%!P.$!@>#A```,!A#``G"/!%```@``"(``@``B!`$``'
+M"#@(``@``B!``?Z_80!\_V&DN0(`$$8``"``3(4'"`%ZX%<!`@`@!7K@5P$!
+M`"`!_A]@`!X`(`*(``@P1@``(``$>N!7`@<`(`!\7V#LV`(```0!"`!ZX%>!
+M&0`@````4%!&```@````01`$B``(`'K@5P(!`"`&_A]@@!(`(`?^'V"`$0`@
+M<$8``"```GK@5P(4`"``?%]@[-@"```$`0@`>N!7@1$`(````%"01@``(```
+M`$$0`(@`"`%ZX%<$B``(@@@`(`!ZX%>"]_\G`'S_8;!&```@`*2Y`@!4@0<(
+M`'K@5X$!`"`!_A]@``!!$(`)`"`$_A]@T$8``"``3(%'$`!%]R]4G0<0@$;W
+M+P":IE$`!``@`'K@5P(!`"#P1@``(``"_A]@@```(`/^'V``?/]AI+D"`$R!
+M1Q``?/]AI+D"`!!'```@`##_!T"`51HH`)H&8!``K@D4`,X)&`#N"02`[0L@
+M@`\X,$<``"``'!!N"P0^#A``-@X0`#AN8QQ^CE,0&@X0%!P.$!@>#A!01P``
+M(``,`$`(``@A"`"$X$$0```(.`C`"0```%"`&0,H`!<**'!'```@``'^'V``
+M[?TO````4`!\OV$JW`(`&8!&$!J`1A````!0D$<``"```/\"*`":!F``@B!0
+M`-T#*`[^/V``?!]@\]L"```"0!"P1P``(```?!]@T-P"````0`@`>N%7@0$`
+M(`0>)P`!_A]@``(!.-!'```@``'^'V`0`*X)%`#."1@`[@D$@.T+((`/.!P0
+M;@L$/@X0\$<``"```#8.$``X;F,H?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A`0
+M2```(````.!A`)JF48`<]R\```!B`'S?8;2X`@```0<(`WY`@#!(```@``"`
+M)P@`?!]@M+8"````(4(`@P@0!(@'"`2!B!"`%1PH4$@``"``!H&($``!!P@!
+M?@!`/WX`8``!!Q``(`A@`!7W+P"$!PAP2```(`!5>N!7@4$`(``Q`"`$A"<(
+M`)X'8(`^`"`"A"<(`)X'8)!(```@```]`"#\_VU``'P_8)2^`@`4@$`(`$`!
+M"`)^`&``>N!7L$@``"```?X?8`(``%``@`$0'(``"`!\`&@`#``````!%```
+M`%#02```(``%`4<4!$4'"`!ZX%>"-``@!/X?8`"&`"B`,@`@_/]M0/!(```@
+M``!\/V"4O@(`%(!`"`!``0@"?@!@`'K@5P'^'V`"``!0$$D``"```(`!$!R`
+M``@`?`!H``P``````10```!0!0%'%(`J`"`P20``(`!0_A]@`'P_8'0&``"`
+MY"XH`!0`(`'^/V``?!]@8N`"`%!)```@```"0!2`$0`@4`%'"`!ZX5<!)``@
+M`)X'8`'^/V```@$X<$D``"``@"$`(`AZX%<"#0`@`'P?8'C@`@`````(`'K@
+M5X$``""020``(````@`X`'P?8'3@`@`````(`'K@5X$'`"```@`X@`8`(+!)
+M```@``!\/V!@O@(``(0`"`!ZX%<!&``@````4`"`0!``?!]@T$D``"``2+H"
+M``'^/V``!$%0@/<8*``4`"``G@=@@)+[+P`2`"#P20``(`!0_A]@`'P_8,X&
+M``"`S"XH`/S_)Q=ZX%>-_/\G`GZ`@1!*```@``!\A@$<2@`````&.*$2``!L
+M$@``3!(``%T2``!=$@``,$H``"``71(``%T2``!\$@``71(``'P2```[$@``
+M'Q(``"(2``!02@``(``E$@``71(``'D2``!1$@``?!(``'P2``!=$@``71(`
+M`'!*```@`%82``!\$@``71(``("K^R\``*!A`)H&8!``K@D4`,X)D$H``"``
+M&`#N"1P`#@H@`"X*!(#M"R"`#S@H$&X+!#X.$``V#A"P2@``(```.&YC''Z.
+M4Q`:#A`4'`X0````4/^!31``',=1"/X_8-!*```@``!\'V```"$`"`)`%(##
+M&R@`?#]@C-@"`"R``!#__PU`\$H``"``@,(.*```H&$`^N97`00`(`"(!@@`
+M&@!``)S_+P``P&$02P``(```>N=7`@4`(`":!F"`5PXH`'P?8+2X`@`%10`(
+M`'K@5S!+```@``+S_R?_A0T(`'K@5X+Q_R<`'`=@$`"N"10`S@D$@.T+4$L`
+M`"``((`/.!P0;@L$/@X0`#8.$``X;F,<?HY3$!H.$!0<#A!P2P``(``8'@X0
+M#`!`"``((0@`A.!!$```"#@(P`D```!0`)4"*)!+```@`("2"2@!_A]@@&C]
+M+P```%``?+]A*MP"`!F`1A`:@$80L$L``"``````4(!Z`B@`F@9@`((@4(!8
+M`R@._C]@`'P?8//;`@#02P``(````D`0`'P?8-#<`@```$`(`'KA5X$!`"`$
+M'B<``?X?8/!+```@```"`3@!_A]@$`"N"10`S@D8`.X)!(#M"R"`#S@<$&X+
+M$$P``"``!#X.$``V#A``.&YC$'Z.4PP`0`@`""$(`(1`0!``(`@P3```(``X
+MB"`(`(2`0`*$(```^N!7`A@`(`$$(@@`?%]@!]P"`%!,```@``$$00@`A>!7
+M`@<`(`#ZX%>!"0`@``)"0`$$80@`_$!`<$P``"``!]P"``$$00@`A>%7@A``
+M(/__($``CB`8`/K@5X+Z_R>03```(`"``P`@`/K@5P(-`"``?#]@J>`"``"$
+M(`@`^N!7@0H`(+!,```@``!\7V#XK0(````A"`'^($```@$0`'P_8.C8`@``
+M@"`(T$P``"```/K@5P(!`"``BJ)0``4`(!B$(`@`^N!7@0,`(`!\/V#P3```
+M(`"DN0(`"H4@"`#ZX%>!```@`"HM*`'^OV``B@)@!(#M"Q!-```@`""`#S@0
+M$&X+!#X.$``V#A``.&YC*'Z.4Q`:#A`4'`X0,$T``"``&!X.$!P@#A```,!A
+M`?[_80!\'V*4P@(`#'ZH00!V]B]030``(`#\_VU``)HF8!``B`CX_ZU``'Q?
+M8)2^`@`8`$$(``!!"'!-```@``"$`A``?%]@U+X"`"@`H0CX@4T(``I!4`1^
+M08@`">%7D$T``"``A0$`(``(05``A`$0``$`($!^04"`_?\G"(!`"`"`(0BP
+M30``(```A>!7#@$`(`""(%``@@$0_(%-"`B`)@@``^%7#@,`(-!-```@``!H
+M]B\H_A]@!/X_8``$05"`3R<H`!H`(`"*HE`$@,8(\$T``"```(7B5P8,`"`"
+M_B>``)X@0`/^((``?%]@U+X"``"$8``03@``(``$?D.```:!0``&(0``_"!@
+M____[P`&84``@@$0!`!""#!.```@```"07@(`"((`(0@>`P"`A`!?B-`/_[`
+M8`'^HD#\@4T(4$X``"```(7B5P7T_R<"_B>``)X@0`/^((``?%]@U+X"``"$
+M8`!P3@``(``$?D.``(2!``!\(F#____O`(2!00`"!A``A($``(2!09!.```@
+M```(!A``A($``(1!0`0`(0@`B&!X"``A"`"&('@,`@$0L$X``"```$SV+P``
+M`%``>N!7@@,`(`!\/V```"$``,0`"``<`'#03@``(```@$`4`?X?8`#^(2@0
+M`*X)%`#."1@`[@D<``X*!(#M"_!.```@`""`#S@H$&X+!#X.$``V#A``.&YC
+M&'Z.4Q`:#A`4'`X0$$\``"```)JF40""(%``?!]@V-L"```"0!``?!]@O-X"
+M```$``@P3P``(```>N!7`08`(`!\'V"UW0(```0`"`!ZX%>"`P`@`&0)*%!/
+M```@``!\'V#`W@(``'P_8+3=`@``A"`(`.D&*`'^'V"`@PDH<$\``"``(/X?
+M8`"/_B\`?!]@5.`"```$``@`>N!7@AX`(`!\'V"03P``(`#@W@(`````"`!Z
+MX%>!!P`@`'S?81RP`@``'`=@`/`2*+!/```@``!ZX%>!%0`@`'P_8"RP`@`!
+M_A]@@,4&*``<!V``J!\HT$\``"```'K@5X$1`""`$``@`'P?8.3>`@`````(
+M`'K@5X$!`"#P3P``(```?-]A)+`"`(#U_R<`?!]@J=X"```$``@`>N!7@0H`
+M(!!0```@``!\/V`LL`(``OX?8("Z!B@```!0`.$2*`!ZX%<!`@`@,%```"``
+M@,H?*`!ZX%<!!0`@``0`((`Q$2B`3Q$H`'K@5X$"`"!04```(``!_A]@@&`%
+M*`!ZX%>"```@`?Z_80`'#2@`^N97`0$`('!0```@``'^'V```@`@````4``!
+M`""``PTH`/[_)Q``K@D4`,X)D%```"``!(#M"R"`#S@8$&X+`'Q?8`3B`@``
+M`"$(`(``<````1"P4```(```@`\X`'Q?8`3B`@```"$(`(``:````1``@`\X
+M$`!@"-!0```@``P```@`>N!7`08`(`#ZX5<!!0`@.(A!"``((`@`A"!0\%``
+M`"````*`$#B(00@"""`(`(0@0`("@!````!0@```(`_^'V`040``(```@`\X
+M`OX?8`"`#S@$/@X0`#8.$``X;F,D?HY3$!H.$#!1```@`!0<#A`8'@X0'"`.
+M$"`B#A```.!A@$?]+P``P&$`?#]B4%$``"``[*X"``"`"`@`>N!7@3$`(`YZ
+MX%>-,``@`7X`4``.`!IP40``(```>N=7@2X`(``__2\!>N!7`BT`(`"`"`@`
+M>N!7`0(`()!1```@``5ZX%<-`0`@3`0'"(`(`"``?#]B[*X"``"`"`@&>N!7
+ML%$``"``!0(`(`IZX%<-`0`@4`0'"``$`"``?#]B[*X"``"`"`C040``(``+
+M>N!7!0(`(`YZX%<-`0`@5`0'"``*H!E8!`<(``J@&/!1```@`%P$!P@`"H`8
+M8`0'"``*8!AD!`<(``K`&`"*!Q@`@>%7$%(``"``#`(`(`)^*(``?%]@"-\"
+M```&`"```>)7C`8`(`)^*(`P4@``(```?%]@"-\"``"$@$$`!@80`'P_8NRN
+M`@``@`@(#GK@5U!2```@`((1`"``A$!```P!$``0`"``@>)7C`8`(`)^*(``
+M?%]@<%(``"``"-\"``"$@$$`"`80`'P_8NRN`@``@`@(#GK@5P(*`""04@``
+M(```A$!```8!$(`(`"``@>97`GXH@`!\7V`(WP(`C`$`(+!2```@``"$0$``
+M"`$0@`0`(`"$@$$`&@80`'P_8NRN`@``@`@(T%(``"``#GK@5P(!`"``A$!`
+M``H!$`!\'V`(WP(``+H#*!``K@GP4@``(``4`,X)&`#N"1P`#@H@`"X*!(#M
+M"R"`#S@D$&X+!#X.$!!3```@```V#A``.&YC$'Z.4P!1$R@``"!@`/K@5P$"
+M`"!(_A]@,%,``"````1!4`"E)BB````@````4`2`[0L@@`\X$!!N"P0^#A!0
+M4P``(```-@X0`#AN8Q!^CE,`B!,H```@8`#ZX%<!`@`@0?X?8'!3```@```$
+M05``G28H@```(````%`$@.T+((`/.!`0;@L$/@X0D%,``"```#8.$``X;F-(
+M?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A"P4P``(``D)`X0*"8.$"PH#A`P*@X0
+M-"P.$#@N#A````!0]($-$-!3```@```HBE(`FJ91`!S'40">YU'\@0T0^($-
+M$("B]2\``.!B\%,``"```'Q?8&BJ`@`(`0$(`'K@5X%U`"``?#]@9,P"``R`
+M``@05```(```>N!7`7,`(`!\/V!DS`(`"(``"`1^0(`0@``(``3``C!4```@
+M``!\7V!HJ@(```$!"```(&(`H@AB`*9I4A````@`>N!74%0``"``@0H`("4$
+M``@`>N!7`@$`(`":IE&````@`?Z_80!\7V!P5```(`!HJ@(```$!"!````@F
+M!``(`'K@5P(!`"``',=1@```()!4```@``'^WV$`?%]@:*H"```!`0@0```(
+M(P3@"0B`"`@`?%]@L%0``"``:*H"```!`1``>N!7`@$`(````%`$`0$0`'Q?
+M8&BJ`@#05```(``(`0$(_W\`0`@!`1`0@$@(`'KA5P$!`"`#_A]@@```(/!4
+M```@``G^'V#\@4T0`'KH5P%1`"``@O\O``!`8A"`2`@`>N%7$%4``"``@0``
+M(`P`"`H`>NA7@1``(``("`@`(*!"]*T-$`(("`@P50``(````"!@#``("@!Z
+MZ%<`*(!"`@$`(`"F:5*````@`"S`0E!5```@`/2!30@#_@!`_']@8/R!K0CX
+M@<T(`_X?8`"J*F``IHE@<%4``"``@#,>*```(&``^N!7`C\`(`!\7V"4O@(`
+M/``!"`!\(&B050``(````@``-``!"``"`!0`>NA7@N__)P!\7V!HJ@(`#`$A
+M"+!5```@``"H`!`0@$@(`'KA5P$#`"`!>NE7`@$`(`+^'V"``0`@T%4``"``
+M`_X?8(```"`$_A]@`'Q?8&BJ`@`,`2$($/Y&@````6CP50``(``1?D>````!
+M:`2``!`0@$@((`1!"`%ZX5>"`0`@`'P`:!!6```@````!``$@``0&/YG@`!\
+M7V!HJ@(`#`$A"`2```@`@`%H,%8``"``!(``$`'^?V(0@$@(`'KA5P$!`"`$
+M_A]@@```(`K^'V!05@``(`#\@4T0^*,-$`!\7V!HJ@(`#`$A"`""H&((_B!`
+M#`,!$'!6```@``!\?V#$BP(`>/X!0`"!X%>.```@#`<!$/3_34``?!]BD%8`
+M`"``D*@"`!@`"`@````("``H"`/^((``@`!````!$!``"`BP5@``(````"`*
+M"'Y(0H!(]2\(`"@(`?X@0`"#Z%>-```@`*(@4-!6```@```""1"`1_4O](%-
+M"/R!K0CX@<T(`_X?8`"J*F`(_G]@\%8``"```*:)8``#'B@``"!@`/K@5X(.
+M`"``?%]@E+X"`#P``0@05P``(```?"!H``(``#0``0@``@`4`'P_8&3,`@`(
+M@``(`7X`0#!7```@``B``!`0>N!7`@$`(````%`(@``0`'P_8&3,`@`,@``(
+M4%<``"``_W\`0`R``!``>N!7@@``((#I(B@`*(I2@%8G*```(&!P5P``(```
+M^N!7`0(`($3^'V``!$%0@!LF*(`&`"``?%]@:*H"`)!7```@``@!`0@`>N!7
+M@0(`(`!\/V!DS`(`#(``"`!ZX%<"C?\GL%<``"```*X+8(`K]2\```!0$`"N
+M"10`S@D8`.X)'``."B``+@K05P``(``D`$X**`!N"BP`C@HP`*X*-`#."C@`
+M[@H$@.T+((`/./!7```@`$@0;@L$/@X0`#8.$``X;F,4?HY3$!H.$```H&$`
+M^N97$%@``"```0T`(!"`!@@`>N!7@0(`(`":!F"`%/\O```@8`#ZX%<P6```
+M(``""P`@`!GU+P!\7V!HJ@(`"`$A"`#ZX%>"`0`@!!L!$%!8```@```;`1"`
+M`0`@!`$A"`B:`!`$&P$0`'Q?8&BJ`@`(`2$(<%@``"```?X@0`@#`1``$_4O
+M@&'_+P``(&``^N!7`0(`($;^'V"06```(```!$%0`/DE*(```"````!0$`"N
+M"02`[0L@@`\X%!!N"[!8```@``0^#A``-@X0`#AN8Q1^CE,0&@X0``?U+P``
+MH&&`&A,HT%@``"`````@8`#ZX%<!`@`@0/X?8``$05``[R4H@`$`(`":!F#P
+M6```(```!/4O````4!``K@D$@.T+((`/.!00;@L$/@X0`#8.$!!9```@```X
+M;F,<?HY3$!H.$!0<#A`8'@X0``#`80!\/V#LK`(`,%D``"```(``"`%ZX%>!
+M_?\G`OX?8`"``!``GN=1`'Q?8.S,`@!060``(``0!`$(`'K@5P$+`"``FJ91
+M`)HF0`":($`"_B"``'Q?8'!9```@`.S,`@``A`!`&@0`"`!ZX%>!!``@%'X!
+M0``"($``'`=@D%D``"``!OY?8(!J]B\`>N!7`@$`(`'^_V&``0`@`?ZF00/Z
+MYE>P60``(`"+]?\G````4`!\/V#LK`(``(``$`">!V`0`*X)%`#."=!9```@
+M`!@`[@D$@.T+((`/.!P0;@L!_F!@`/KA5X("`"``A"`8\%D``"``!'X`0`'^
+M8&``^N%7@?W_)P``(`@`A"!```(`$`"`#S@06@``(``$/@X0`#8.$``X;F,4
+M?HY3$!H.$`'^'V``@B!0`'Q?8#!:```@``!]````AF%0`,`-*`!\'V#@R@(`
+M``@@"`3ZX%<!`0`@4%H``"```?K@5P(#`"````!0`'P_8`!]````!$%0`?Y_
+M8(`"`"!P6@``(`````!0`((@4`!\7V``?0```(9A4("V#2@`?+]A1+D"`)!:
+M```@``"!!@@`>N!7@04`(`!\'V#@R@(```@@"`""`$```@!`L%H``"```GX`
+M@``:`$`<`0`(``(`.````%``@080$`"N"02`[0O06@``(``@@`\X%!!N"P0^
+M#A``-@X0`#AN8QA^CE,0&@X0%!P.$/!:```@``":IE$"_D:``'P_8%3#`@``
+M`L%!``$'"`!ZX%<!%0`@$%L``"``"`$'"`!ZX%>!$P`@@/4;*!@!)P@``^!7
+M!0$`(``"(%`P6P``(````0`@_X,_4`"`($`0`P<0`OY&@`!\/V!4PP(```+!
+M05!;```@`!@!!Q``?']@1+D"```&(4`(@0`($`%'"``!X5<,"``@<%L``"``
+M`(8&0`0%``@!>N!7`@,`(``!!P@(@0`0`)H&8`""(%"06P``(```WO@O``0`
+M(`@!!P@(@0`0`)H&8`'^/V``V_@O``$`(+!;```@```$`%`(@0`0`?ZF00+Z
+MYE<%YO\G$`"N"10`S@D$@.T+T%L``"``((`/.!@0;@L$/@X0`#8.$``X;F,8
+M?HY3$!H.$!0<#A#P6P``(```',=1`'Q?8,2Z`@`Z!0$(`'K@5P(<`"`0`6$(
+M`/KA5Q!<```@`($:`"`*"0$(`'K@5P(9`"`("0$(`7X`0`@!@1`!_A]@,%P`
+M`"``"@&!$`"&`6`0`*`)%`$A"`"#X5<"`@`@`((@4!`#`1!07```(``4`P$0
+M``(`(`B`(0@0`P$0`((@4`@"`!`UA"8(`?X@:'!<```@`#6"1A``?%]@Q+H"
+M`#P)(0@0_B!`/`.!$'*"AA```X$0D%P``"```?X_8`(#01!<A"8(L/K@5P$&
+M`"``^N!7`04`($CZX%>P7```(``!!``@.`4A"`#ZX%==A"8(`0$`(!#^(&B`
+M```@[_\@8-!<```@`%V"1A"``@(H``#`88#^'V!'@$80@`<`(`!\7V#$N@(`
+M\%P``"``"`D!"`!ZX%<"!0`@`'P?8.W@`@``!``(`'K@5X("`"`070``(``!
+M_A]@`/P'*`3^'V``4@@H`%((*``<!V`0`*X)%`#."3!=```@``2`[0L@@`\X
+M&!!N"P```%``@`\X````4`"`#S@```!04%T``"```(`/.````%``@`\X`/K@
+M5X$G`"`*"$`(`'Q_8%BN`@!P70``(```@"$(`(0@0`""`1`4"(`(`'Q_8-2M
+M`@``@"$(`(@@0)!=```@``""`1`6"(`(`'Q_8-BM`@``@"$(`(@@0`""`1`8
+M"(`(L%T``"```'Q_8-RM`@``@"$(`(@@0`""`1`:"(`(`'Q_8#RM`@#070``
+M(```@"$(`(@@0`""`1`<"(`(`'Q_8$"M`@``@"$(`(@@0/!=```@``""`1`>
+M"(`(`'Q_8$2M`@``@"$(`(@@0`""`1`""(`($%X``"```'Q_8"B[`@"8@2$(
+M`(@@0)B#`1`$"(`(G($A"`"(($`P7@``(`"<@P$0!@B`"*"!(0@`B"!`H(,!
+M$`@(@`BD@2$(`(@@0%!>```@`*2#`1"H@2$(`(0@0*B#`1`,"$`(K($A"`"$
+M($"L@P$0<%X``"``#@A`"+"!(0@`A"!`L(,!$!`$(`BT@X$0$00@"+:#@1"0
+M7@``(``@""`(N($!"``"`$"X@0$0````4`"`#S@$/@X0`#8.$+!>```@```X
+M;F,0?HY3`'P?8.R\`@``8!<H````4`2`[0L@@`\XT%X``"``$!!N"P!\'V#D
+MO0(`)$D`"`"`#S@$/@X0`#8.$``X;F/P7@``(``0?HY3``!@8`!\'V#L#0``
+M`((@4`3^7V``S/4O```@8!!?```@``#ZX%<!`@`@4OX?8``$05"`)R4H@```
+M(`""`&`$@.T+,%\``"``((`/.!`0;@L$/@X0`#8.$``X;F,0?HY3``!@8`!\
+M'V!07P``(``*#@```((@4`3^7V"`P?4O```@8`#ZX%<!`@`@4_X?8'!?```@
+M```$05``'24H@```(`""`&`$@.T+((`/.!`0;@L$/@X0D%\``"```#8.$``X
+M;F,0?HY3``!@8`!\'V#?#0```((@4`C^7V"P7P``(```M_4O```@8`#ZX%<!
+M`@`@5?X?8``$05"`$B4H@```(-!?```@``""`&`$@.T+((`/.!`0;@L$/@X0
+M`#8.$``X;F,0?HY3\%\``"````!`8`""8&``?!]@+`X````$(6`$_E]@`*SU
+M+P``(&`08```(```^N!7`0(`(%3^'V``!$%0@`<E*(```"``@@!@!(#M"S!@
+M```@`""`#S@0$&X+`'K@5P$/`"``?!]@;.`"``````@`>N!74&```"``@0,`
+M(`!\/V```"$`#,1`"`'^'V`(@$`4`7X!:`R`0!1P8```(```?!]@<.`"````
+M``@`>N!7`0H`(`!\'V!HX`(``$``")!@```@``!ZX%>!!P`@`'P_8```(0`,
+MQ$`(`OX?8`B`0!0"?@%HL&```"``#(!`%(`#`"``?#]@```A``S$``C\?P!@
+M#(!`%`/^'V#08```(``(@$`4`(`/.`!\/V!XX`(``(``$````%``@`\X!#X.
+M$/!@```@```V#A``.&YC%'Z.4Q`:#A``?!]@8>`"``!$``@`>N!7$&$``"``
+M`0,`(`!\OV%TPP(`"/\&0``[`2@`_P9``!D;*`!\'V`P80``(``='0```.WY
+M+X#X\R\`!$%0`'P_8*K@`@``A$`0@/CS+U!A```@``+^'V``?+]A@+X"``"`
+MAA``?+]A/+\"``#_!D#__S]@<&$``"``@.`6*`!\'V"LX`(```@`"`!ZX%<!
+M`0`@`.X8*$"!!A"080``(```?%]@E+X"`!P``0@`?"!H``P``!0``0@``@`4
+M!/X?8+!A```@``!\OV&`O@(``("&$(!E(2@```!0`&8;*`7^'V``@(80T&$`
+M`"``$`"N"02`[0L@@`\X%!!N"P0^#A``-@X0`#AN8QQ^CE/P80``(``0&@X0
+M%!P.$!@>#A```.!A*/Z_80#?\R\``,!A*/X?8!!B```@`(`!^"\`?!]@`(D"
+M``!_8$``?!]@M+@"`$H)(`@`AD!`,&(``"``!/X?8`"&8$``@$$0"_X?8`(`
+M01````!0`P!!$`""(%!08@``(``(?D%``/P`0+2X`@`H!0`(``!!$`%^04`!
+M_B!`(/K@5W!B```@``O\_R<`F@9@`)XG8(#S*2@`'`=@@-'S+Q``K@D4`,X)
+MD&(``"``&`#N"02`[0L@@`\X'!!N"P0^#A``-@X0`#AN8U!^CE.P8@``(``0
+M&@X0%!P.$!@>#A``32$H<OX?8`!\/V```"$`%(!`%-!B```@`!2`0!0!_A]@
+M`'X?*`!ZX%>!`0`@7/X?8,;^/V"`KBLH\&(``"````1!4`!\/V```"$`#(1`
+M%`"$0!2`_A]@`(!`%/_^'V`08P``(``(@$`4X/^M00":!F"`VAHHZ/\M0-C_
+M34``F@9@```;*#!C```@`-B!#0@R>N!7!?O_)PC^'V``?#]@```A``R`0!0!
+M_C]@4&,``"```'R_83R_`@`D@T80`'P?8$BZ`@#4_VU``?X_8``$05!P8P``
+M(`#__Y]@`(T5*!R!!@@!?@!`'($&$`!\'V!AX`(``$0`")!C```@``!ZX%<!
+M$0`@````4`#(_R_X_\U!`!P'8`#)&B@`?+]AL&,``"``=,,"``#_)D#P_^U!
+M`!P'8`">1V``[1HH"($&",R!#1#08P``(``,@08(T($-$,S_#4``GB=@`!Q'
+M8`"G&BC\@0T(^($M"/!C```@``!\7V!DX`(``$!!"`!\?V!HX`(``,!A"`!\
+MWV`='0``$&0``"````B"4`"*HE"`<_DO@`$`(`!\'V`='0``@+;_+P'^/V`P
+M9```(```?!]@"+@"```"0!0`!$%0`'P?8*_@`@``!$`0"/X?8%!D```@``!\
+M/V```"$`#(!`%(`>_R\`'/\O@!S_+P`:_R\`"0(H<&0``"```'R_83R_`@``
+M_P9`__\_8(!^%B@0`*X)%`#."1@`[@F09```(``$@.T+((`/.%`0;@L$/@X0
+M`#8.$``X;F,D?HY3$!H.$+!D```@`!0<#A`8'@X0'"`.$"`B#A```,!A`"`(
+M4@+^_V$`AO,OT&0``"````"@80!\'V#DO`(``$0`"`%ZX%>"`0`@`?X?8@'^
+M'V#P9```(`"`K1(H`('S+P``(&(`G@=@@*/W+P!\'V``B0(``']`0!!E```@
+M``!\'V"TN`(`2@D@"!3^'V``A$!```!!$`">!V``'"=@,&4``"```)TI*`"B
+M"&``>_,O`7KH5P(!`"````!0@*(2*`":!F!090``(```>/,O$`"N"10`S@D8
+M`.X)'``."B``+@H$@.T+((`/.'!E```@`"00;@L$/@X0`#8.$``X;F,4?HY3
+M$!H.$`!\'V"DM@(`D&4``"````$`"`AZX%>&`@`@`&SS+P``H&$`.0LH`)H&
+M8(!L\R^P90``(``0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC%'Z.4]!E
+M```@`!`:#A``9?,O`'P_8+3@`@``@*`)``1!4`"$`!``?#]@\&4``"``N.`"
+M``"$`!``8_,O`/KF5X$!`"``F@9@@/8G*(```"`09@``(`````!0$`"N"02`
+M[0L@@`\X%!!N"P0^#A``-@X0`#AN8S!F```@`!1^CE,0&@X0@%CS+P!\/V"\
+MX`(``("@"0`$05``A``04&8``"```'P_8,#@`@``A``0@%;S+P#ZYE>!`0`@
+M`)H&8`#J)RAP9@``(`"````@````4!``K@D$@.T+((`/.!00;@L$/@X0`#8.
+M$)!F```@```X;F,P?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0L&8``"``
+M``"@80""`&(`',=1&/X_8H!'\R\``.!A`'P?8.2\`@#09@``(```1``(`7K@
+M5X(!`"`!_M]A`?X?8`!O$BB`0O,O``!`8O!F```@``"B"&``9?<O`'P?8`")
+M`@``?V!``'P?8+2X`@!*"4`($&<``"````8A0`;^'V``!F%``(!!$`"(!@@"
+M@(`0`H@&"`2`@!`P9P``(``$B`8(!H"`$`:(!@@(@(`0"(@&"`J`@!`*B`8(
+M#("`$%!G```@`!*$1@@%>N%7@@H`(`!\7V!0P0(```$!"/B!#1`$"0$(<&<`
+M`"``_(&-$/_^'V`3@$80^/\-0``(0`@(A(`0`@A`"`J$@!"09P``(``$"$`(
+M#(2`$``(0`@.A(`0`@A`"!"$@!`$"``($H"`$+!G```@`!*$1@@4A$`0$X0&
+M"!:`0!````!0%8!`$!6$!@@`>N!7T&<``"```0$`(`'^'V`5@$`0%H0&"`!Z
+MX%>"`0`@%80`"`)^`&CP9P``(``5@$`0%X0&"`!ZX%>!`0`@%80`"`1^`&@5
+M@$`0&(0&"!!H```@``!ZX%>"`0`@%80`"`A^`&@5@$`0&81&"`!ZX5>!`@`@
+M,&@``"``%80`"!!^`&@`#@`8('X`:!6`0!````!0%X!`$!2$!@A0:```(```
+M>N!7`0$`(!#^'V`7@$`0&X0&"`!ZX%>!!``@%X1`"'!H```@``%^`6@7@$`0
+M``Y`&!N$!@@">N!7`@$`(`)^`6@7@$`0D&@``"```'P?8."L`@`````(!'X`
+M8`!ZX%>"`0`@%X1`"(!^`6BP:```(``7@$`0$H1&"`!\'V!@X`(```1`%!F$
+M1@@`?!]@8>`"`-!H```@```$0!0`H@A@`"`H8(`G*2@`)`E@@`7S+P%ZYU<"
+M`0`@\&@``"``````4``M$B@`G@=@@`+S+Q``K@D4`,X)&`#N"1P`#@H0:0``
+M(``@`"X*)`!."@2`[0L@@`\X,!!N"P!\/V#8X`(``(``$#!I```@``"`#S@$
+M/@X0`#8.$``X;F,0?HY3`'P?8+3@`@`````(4&D``"```'K@5X()`"``?!]@
+MO.`"``````@`>N!7`@<`(`!\'V!P:0``(`"<N0(`__\_8(#?%2@`?!]@M.`"
+M``````@`>N!7@@(`()!I```@``!\'V"\X`(`````"`!ZX%<!^?\G!(#M"R"`
+M#S@0$&X+L&D``"```'P_8'#@`@``@``0`'K@5X("`"``?#]@```A``S$``C0
+M:0``(`#]?P!@#(!`%`"`#S@`?#]@;.`"``"``!``>N!7@@(`(/!I```@``!\
+M/V```"$`#,0`"/Y_`&`,@$`4`(`/.`0^#A``-@X0$&H``"```#AN8RA^CE,0
+M&@X0%!P.$!@>#A`<(`X0("(.$"0D#A`P:@``(````$!B`(*@80`$P6$`AB%B
+M$?[_80#7\B\```!B$?X?8%!J```@`(#Y]B\`?!]@`(D"``!_0$``?!]@M+@"
+M`$H)(`@`A&!`<&H``"``"/X?8`"$0$```$$0`J1!$`.:01``@B!0`/KF5XX#
+M`""0:@``(```!$<(`((!0`0$0!`!?L=!`?X@0`"#YE>-_/\G`)X'8+!J```@
+M``"B*&"`["@H`"`(8(#*\B\0`*X)%`#."1@`[@D<``X*T&H``"``(``N"B0`
+M3@H$@.T+((`/."@0;@L`>N!7@0$`(`!\/V#P:@``(`!TX`(``(``$`"`#S@$
+M/@X0`#8.$``X;F,4?HY3$!H.$!!K```@``!\OV$HNP(``($&$`!\'V#O+0``
+M`+[X+P3_!D#__S]@,&L``"``@*@5*!``K@D$@.T+((`/.!00;@L$/@X0`#8.
+M$``X;F-0:P``(``P?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0*"8.$'!K
+M```@`"PH#A```(!B`()@8@`$P6$`AJ%A``A"8@"*(F(`GN=1D&L``"``@*WR
+M+P```&(`?!]@Y+P"``!$``@!>N!7@@$`(`'^_V&P:P``(``!_A]@`-41*`!\
+M'V!DX`(``!P`%`!\'V!HX`(``!H`%-!K```@```H"F``IBE@`!Q'8`":9F``
+M"()0`"2I8`"BR&``>?@O\&L``"```?KG5P(!`"````!0`,P1*``@"&"`H?(O
+M$`"N"10`S@D0;```(``8`.X)'``."B``+@HD`$X**`!N"BP`C@H$@.T+((`/
+M.#!L```@`#`0;@L$/@X0`#8.$``X;F,<?HY3$!H.$!0<#A`8'@X04&P``"``
+M``#`80!ZYU>,#@`@#GKG5XD-`"``#N<9`)X'8``1&BAP;```(``!_A]@`+T1
+M*`'^'V``?+]AY+T"``"!1A0`?#]@JA<``)!L```@``">!V``J_@O"/\&0`K^
+M/V"`>A4H````4`"!1A0```!0L&P``"``@+41*"2=AA0H@08(`'K@5X$``""`
+MEP`H````4(```"#0;```(``!_A]@$`"N"10`S@D8`.X)!(#M"R"`#S@<$&X+
+M!#X.$/!L```@```V#A``.&YC.'Z.4Q`:#A`4'`X0&!X.$!P@#A`@(@X0$&T`
+M`"``)"0.$"@F#A```&!B`*(H4A"`20H`)`E@`((@4`"^&B@P;0``(`!.".D)
+M700)"/M_`&!=`$D0``X`&(@(20@`A>=7"@$`(%!M```@``1^`&A=`$D0`"`(
+M4I`$"0@`@>=7@0,`(`%^"$``$``:<&T``"```WX(@```*4"0A``(`('G5X+\
+M_R<`G@=``!X`0``@`$"0;0``(```#B`8`'Q)0``"``#I!0$(``(`4``.(!A`
+M!`D(`'K@5[!M```@``$!`"``G@!0``X@&%Q^R4%Z"`D(``Z@&8@(20@`>N%7
+MT&T``"```00`(`!\24```@``Y04!"`!ZX%<!$P`@`?X`0``.(!CP;0``(`"`
+M$0`@200)"`!ZX%<!$``@`/KG5X$(`"!R"`D(`'P`8!!N```@`/#_````$``8
+M`!X`:'(`B1!."`D(B`A)"``%X%>"`P`@,&X``"``__\`0``.(!@`?$E```(`
+M`.4%`0C[?P!@Y0%!$%P$"0A0;@``(```?$E```(``.0!01!=!`D("'X`:.4!
+M01!>"`D(Y@&!$'!N```@``1^QT$$_@90``Z@&0#M_R<"_A]@_(%-$`!\24``
+M`@``D&X``"``Q04!"/V!31#^@TT0Q`4!"/^!31````!0P`$!$,!_`4"P;@``
+M(`#\@4T((/X_8`"F:6"`N1$H0`0)"`!ZX%>!!P`@`'Q_8-!N```@`(2_`@``
+M@2$("/Y`@']^`&`!?@!0``0`:%@`"1`!_@!`\&X``"```($!$%A^"4`$_C]@
+M``1!4`"&85"`L!$H`'Q)0``"```0;P``(`#E!0$(`'K@5X$"`"#D?P%`!/X_
+M8``$05``AF%0@*L1*#!O```@```<!V``FB9@``1!4`"&85``J1$H%`@)"`!Z
+MX%>!$``@4&\``"```WX(@```*4"4@``(DH@@"``$05``AF%0`*01*`%^"$!P
+M;P``(```$``:`WX(@```*4")A``(0'X`8`!ZX%>!^/\GB`A)")!O```@``!Z
+MX5>!!P`@`?X_8`!\'V#NX`(```)`$`"%YU>*!``@L&\``"```"`(8``D*6``
+M>2@H````8@'^!T``$.`9B`A)"`"%YU?0;P``(`"+^_\G`*((8!``K@D4`,X)
+M&`#N"1P`#@H@`"X*)`!."O!O```@`"@`;@H$@.T+((`/.#@0;@L$/@X0`#8.
+M$``X;F,H?HY3$'```"``$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0``!`8@""
+M(&(P<```(```!`%B`(;A80`(PF$`&/(O``"@80;^'V"`.O8O`'P?8%!P```@
+M``")`@``?V!``'P?8+2X`@!*"4`(``8A0`_^'V``!F%`<'```"```(!!$`*B
+M0!`#H$`0!*1`$`6>0!`&_A]@`!PG8(`Q*"B0<```(```F@9@@`_R+Q``K@D4
+M`,X)&`#N"1P`#@H@`"X*)`!."K!P```@``2`[0L@@`\X*!!N"P0^#A``-@X0
+M`#AN8Q1^CE,0&@X0T'```"````"@80`%\B\`?#]@#+T"``":`!"`!?(O`)H&
+M8(`2`"CP<```(``0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC%'Z.4Q!Q
+M```@`!`:#A`0`*`)4(0F"`#ZX%>"!``@`)HF8``X*2@`>N!7,'$``"``@0$`
+M(`'^'V!0@$80``$`(````%"````@`?X?8!``K@E0<0``(``$@.T+((`/.!00
+M;@L$/@X0`#8.$``X;F,0?HY3`'P?8'!Q```@`%<7``"`9/XO!(#M"R"`#S@0
+M$&X+!#X.$``V#A``.&YCD'$``"``+'Z.4Q`:#A`4'`X0&!X.$!P@#A`@(@X0
+M)"0.$"@F#A"P<0``(````"!B`)JF40">YU$`(`A2`/KH5P(!`"`/_A]@@!X`
+M(-!Q```@```V^2\``,!A@.3Q+P``8&(`GOTO``!`8@)^"8``@`A`\'$``"``
+M_`$@"@"F"6``X_$O`'KG5P$7`""`+?DO`7K@5X(5`"`0<@``(`````!0!7KI
+M5XP"`"`*>NE7"0$`(`3^'V"````@"/X?8#!R```@```<`$!,?D!`3`0`"`"!
+MZ%>*!@`@!/KG5XH%`"``'`A`4'(``"``6'Y`0%@$``@!_B=``([@&01^*$``
+MC@`:`('H5PH!`"!P<@``(``$^N=7B_K_)P`*(!@`B@@8`('@5XD%`"`"!&$(
+M#_X!8)!R```@```.`!@#!"$(`01!"/#^86`$_F&0`(YA&``(@E``JO\OL'(`
+M`"``@`$`("/^OV&````@)_Z_80":!F`0`*X)%`#."1@`[@G0<@``(``<``X*
+M(``N"B0`3@HH`&X*!(#M"R"`#S@L$&X+!#X.$/!R```@```V#A``.&YC,'Z.
+M4Q`:#A`4'`X0&!X.$!P@#A`@(@X0$',``"``)"0.$"@F#A```&!B`((@8@`$
+M06(`A@%B!?X(0``0P!DP<P``(`"`N?$O``#@803^'V``?+]AM+@"`$J!AA``
+M?#]@`(D"`%!S```@`!?^'V`$@4`0`?X)0`:!0!`'HT`0"/]`0`""(%`!_@A`
+M<',``"```('@5PH$`"``!`D(``!!$`%^04`!?DE"`?X@0`'^"$"0<P``(```
+M@>!7"_S_)P!\OV&TN`(`2HE&"$B%!@@`?#]@`(D"`+!S```@```"84`!@4$0
+M`7X`0``.(!A(@480__K@5PL!`""`_A]@T',``"``2(%&$`'^GV#\B4T0`'R_
+M8;2X`@!*B48(`'P_8`")`@#P<P``(````F%``84!"/V!31#^B4T0`(4!"/^!
+M31``HBA2`'P!0!!T```@``"'`@#\(@`0!'Y!4`#_`$````%`!'XG0`"0(!C\
+M@4T(,'0``"```"!H8(`*$2@`G@=@@)KQ+P3^'V!,@8802J.&$!``K@E0=```
+M(``4`,X)&`#N"1P`#@H@`"X*)`!."B@`;@H$@.T+((`/.'!T```@`#`0;@L$
+M/@X0`#8.$``X;F,4?HY3$!H.$`":IE$`^N!7D'0``"``@@``("/^OV$`?!]@
+M/+X"``"D%"@`F@9@$`"N"02`[0NP=```(``@@`\X%!!N"P0^#A``-@X0`#AN
+M8Q!^CE,`?!]@Y+T"`-!T```@`"1)``B`Z_XO!(#M"R"`#S@0$&X+!#X.$``V
+M#A``.&YC\'0``"``$'Z.4P!\'V!HN@(`@)@4*````%`$@.T+((`/.!`0;@L0
+M=0``(``$/@X0`#8.$``X;F,0?HY3````4`!"_2\$@.T+((`/.#!U```@`!`0
+M;@L$/@X0`#8.$``X;F,0?HY3`'P?8*K@`@``!``(4'4``"```'K@5P$!`"``
+M``!0@$7]+P2`[0L@@`\X$!!N"P0^#A!P=0``(```-@X0`#AN8Q!^CE,`@B!0
+M@$O]+P2`[0L@@`\X$!!N"Y!U```@``!ZX%<!%``@`'Q?8,2Z`@`0`2$(`/K@
+M5X$1`"`4`6$(L'4``"```/KA5P$0`"``A^!7`@,`(``#X%<"#@`@`((@4!`#
+M`1#0=0``(``4`P$0``P`(``#X%>"`0`@"(`@"!`#`1``!@`@"(!`"/!U```@
+M``!ZX5<!"``@``7@5P(%`"`(`$$("(0`$`!ZX5>"`0`@$'8``"```'Q?8,2Z
+M`@`4`P$0`((@4`@"`!```@`@``0A8`@`00@P=@``(```>N%7`OC_)P"`#S@$
+M/@X0`#8.$``X;F,H?HY3$!H.$%!V```@`!0<#A`8'@X0'"`.$```X&$`',=1
+M`)JF4?R;#1``4O$O<'8``"```'Q?8/BP`@``!"$(`/K@5X$&`"``&D$0`'Q?
+M8.C8`@"0=@``(````"$(`/K@5X$#`"`8FD`0#9I`$``:`1``?#]@I+D"`+!V
+M```@`$Z;@!!FFT`0`$OQ+P!\'V#SVP(```0`"`5ZX%<!`P`@T'8``"``#'K@
+M5P$"`"`#>N!7`0$`(`1ZX%>"`0`@````4`#%!"CP=@``(```!``@`7K@5P$#
+M`"`4>N!7`0(`(!5ZX%<!`0`@````4!!W```@`(`V`"``?%]@Z-@"````(0@`
+M^N!7@20`(!B$``@`>N!7,'<``"```2,`(("L%"@```!B`'KH5X$%`"#\_TU`
+M`"`(8`/^/V!0=P``(```Z!0H`'K@5P$"`"!U_A]@`'P_8,L)````'RDH`?[?
+M87!W```@`````%``&/TO@!4$*`'^'V"`Z_<O````4```_2\`^N=7D'<``"``
+M`04`(`!\7V#HV`(````A"`:$``B`D?XO`'P?8"K<`@"P=P``(```@B!0`-K]
+M+P#<&R@`FJ91`'Q?8.C8`@```"$(&)I`$-!W```@``V:0!``&@$0`'P_8*2Y
+M`@!FFT`0`'KG5X$%`"#XFPT0\'<``"``_($M"/C_34``(`A@@-(4*`!ZX%<!
+M`@`@=?X?8`!\/V`0>```(`#W"0``@`DI*`'^/V``?!]@[-P"```"0!``?#]@
+MI+D"`#!X```@`"R%``@`>N!7`0(`(`":IE$LFT`0$/\`0``O%"@`FJ914'@`
+M`"```'P?8"K<`@`9&D`0&AI`$`""(%``Q/TO`'P?8*C7`@!P>```(```!``(
+M`'K@5P$!`"````!0`.'\+P;^'V"`C00H!_X?8)!X```@`(",!"@(_A]@@(L$
+M*````%"`B@0H`)JF40!\/V"DN0(`L'@``"``3IN`$`[^/V``?!]@\]L"```"
+M0!`!_A]@$`"N"10`S@G0>```(``8`.X)'``."@2`[0L@@`\X*!!N"P0^#A``
+M-@X0`#AN8_!X```@`!1^CE,0&@X0`)JF48#]_"\`?!]@@+X"```(``@%>N!7
+M$'D``"``@@0`(`!\/V!DK@(``(``"`%^`$``@``0`'P?8``"```P>0``(`"`
+M5_DO`?Z_80":!F`0`*X)!(#M"R"`#S@4$&X+!#X.$%!Y```@```V#A``.&YC
+M$'Z.4P!\'V"NX`(```0`"`!ZX%>"-P`@<'D``"```'P?8*S@`@``"``(`'K@
+M5P$&`"``?!]@Z]L"```$``B0>0``(```>N!7@@,`(`!\'V!8X`(```0`"`!Z
+MX%<"`0`@````4+!Y```@`(`O`"`!_E]@`'P_8(#@`@``A$`0````4(#-_"\`
+M``!0T'D``"``@,,#*`'^'V"`H/<O`?X?8`"5`R@`?!]@JN`"```$``CP>0``
+M(```>N!7`0$`(````%"`L?PO`'P?8*S@`@``"``(`'K@5Q!Z```@``$3`"``
+M?!]@Z]L"```$``@`>N!7@A``(`!\'V!8X`(`,'H``"````0`"`!ZX%<"#@`@
+M`'P?8*K@`@``!``(`'K@5P$'`"!0>@``(```?!]@*MP"``""(%``A?TO`'P?
+M8.C8`@`````(`'K@5W!Z```@`($"`"`8!``(`'K@5P$!`"`!_A]@`+;\+P'^
+M'V``K`,HD'H``"``````4(!^`R@```!0`'P_8(#@`@``@$`0@!``(`'^7V"P
+M>@``(```?!]@KN`"```$0!``?!]@Z-@"``````@`>N!7`08`(-!Z```@`!@$
+M``@`>N!7@00`(`!\'V"JX`(```0`"`!ZX%<!`0`@\'H``"```_X_8``%`"`$
+M_C]@``0`(`!\'V"JX`(```0`"`!ZX%<0>P``(``!`0`@!_X_8(```"`(_C]@
+M`'P?8//;`@```D`0`?X?8#![```@``2`[0L@@`\X$!!N"P0^#A``-@X0`#AN
+M8Q!^CE,`CQ<H4'L``"``!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC,'Z.4Q`:
+M#A!P>P``(``4'`X0&!X.$!P@#A`@(@X0)"0.$```X&$`FJ91````4)![```@
+M`/R!#1``?!]@@.`"```$``@`>N!7`0$`(`3^'V``<@`@L'L``"```'P?8//;
+M`@``!``(`7K@5P$!`"`4>N!7`@$`(`7^'V#0>P``(`"`;0`@`'P?8`?<`@`!
+M!``(`'K@5X$"`"``?#]BZ-@"`/![```@``"`"`@`>N!7`@$`(`/^'V"`9P`@
+M@)X5*`!\/V",V`(`$'P``"``0(``$````%"`'P0H@`\4*````&(`?!]@^+`"
+M```$``@P?```(```>N!7@@(`(`!\'V"HUP(```0`"`!ZX%>!`P`@````4%!\
+M```@`(`4!"@._C]@`'P?8//;`@```D`0@%H`(`!ZZ%>!!0`@<'P``"``_/]-
+M0``@"&`#_C]@@$(4*`!ZX%<!`@`@=?X?8`!\/V"0?```(`!5"```@'DH*`'^
+MOV$!_A]@`#T#*````%"`<?PO````4+!\```@``!;_"\`?#]BZ-@"``"`"`@&
+M!``(@.W]+P#ZYE>!!@`@T'P``"``````4/B!#1``FJ91_($M"/C_34``(`A@
+M`#44*`!ZX%?P?```(``!`@`@=?X?8`!\/V!S"````&PH*`!\/V+HV`(``(`(
+M"!!]```@`!@$``@`>N!7`?[?80(<QU$`>Q4H`'P_8(S8`@!$@``0,'T``"``
+M`?Y?8@"`"`@-)$`0&"1`$`!\'V#XL`(```0`"`!ZX%=0?0``(`""`@`@`'P?
+M8*C7`@``!``(`'K@5X$#`"`._C]@`'P?8'!]```@`//;`@```D`0````4`#O
+M`R@`-P`@@.(3*````&(`>NA7D'T``"``@04`(/S_34``(`A@`_X_8``>%"@`
+M>N!7`0(`('7^'V"P?0``(```?#]@#@D```!5*"@!_K]A`?Y?8@!\/V(JW`(`
+M&:1($-!]```@`!JD2!````!0%(!($`!ZYU<!!0`@````4(!)_"\`H@A@\'T`
+M`"```((@4``2_2^`10,H`'P_8*2Y`@!KI4`0@`$`(`"B"&`0?@``(```@B!0
+M``[]+P```%"`#0,H`'KG5P$+`"``^N=7`'P_8C!^```@`.C8`@``@`@(#@@@
+M"`7^0(``A``8``1`0`+^`(@`!$!`4'X``"``!OX`B``$`$``?#]@I+D"`$Z)
+M(`B!`0`@``1!4``>`RAP?@``(`"``P`@`?Y?8(`<`R@``@`@`?X?8``M`R@!
+M_A]@`#7\+Y!^```@``!\'V`&W`(```0@"`">!V"`"0,H````4`!\/V"DN0(`
+ML'X``"``:X%`$````%"`QP,H%/X_8`!\'V#SVP(```)`$(!%%2C0?@``(```
+M?#]@C-@"`%B``!``>N=7@0``((!*!2@`?!]@3+$"`/!^```@`!#^/V``!$%0
+M`%02*`#ZYE<!!@`@````4/B!#1#\@2T($'\``"``^/]-0``@"&``[Q,H`'K@
+M5P$"`"!U_A]@`'P_8'8)```P?P``(```)B@H````4(```"`'_A]@$`"N"10`
+MS@D8`.X)'``."E!_```@`"``+@HD`$X*!(#M"R"`#S@P$&X+`'P?8*K@`@``
+M!``(<'\``"```(`/.`0^#A``-@X0`#AN8Q!^CE,`?!]@KN`"```$``B0?P``
+M(```>N!7`@$`(````%``#``@`'P?8*K@`@``!``(`'K@5[!_```@``$)`""`
+M)OPO`'P_8&2N`@``@``(`7X`0`"``!``?!]@T'\``"``Z-@"``````@8!``(
+M`'K@5P$!`"`$_C]@@```(`C^/V#P?P``(```?!]@\]L"```"0!`!_A]@!(#M
+M"R"`#S@0$&X+!#X.$!"````@```V#A``.&YC*'Z.4Q`:#A`4'`X0&!X.$!P@
+M#A`@(@X0,(```"``)"0.$```H&$`@D!B``0A8@"&X6$`"`)B`OX?8`"9`RA0
+M@```(```?-]A4+,"`"Q_!T#__S]@@`(3*`'^'V"`."<HO"4'$'"````@`,`C
+M!Q``?!]@[]L"```>0!`!_C]@`'P?8.W;`@```D`0D(```"``Q0-'$`""(%#(
+M`T<0`'P?8.[;`@``($`0*0-'$`#ZYU>P@```(``"`0`@!?X?8(`"`"`!^N=7
+M`@$`(`C^'V"````@!_X?8-"````@`"H!1Q`(_A^`@&+X+P!\WV%0LP(`\!L'
+M$(">)2@!_C]@\(```"``QP-'$````%`0`*X)%`#."1@`[@D<``X*(``N"B0`
+M3@H0@0``(``$@.T+((`/."@0;@L$/@X0`#8.$``X;F,@?HY3$!H.$#"!```@
+M`!0<#A`8'@X0'"`.$````&(`@N!A@#+V+P!ZX%<"`0`@4($``"```OX?8``.
+M`"``?!]@\ML"```$``@!>N!7`@$`(`3^'V!P@0``(`"`"@`@`'P_8,2Z`@`Y
+MA0`(`7K@5X()`"``?!]@@+X"`)"!```@```(``@`>N!7@0(`(`9ZX%>!`0`@
+M6($`"`%^`$!8@0`0L($``"```'P?8$C8`@``!``(`'K@5P'U_R<%_A]@`(`'
+M$````%#0@0``(```/@`@$`#("0!ZYU<"`@`@=?X?8`!\/V!W`@``@,XG*/"!
+M```@``!\'V#NX`(```0`"`!ZX%>!`@`@`'P_8,2Z`@`(B0`($((``"```'K@
+M5X("`"``?#]@Q+H"``B)``@">N!7"P(`((/^'V`P@@``(`!'`$<0`_X?8(#Q
+M_R<`FJ91`'P?8.[@`@``&D`0-00G"%""```@``+^`&``>N!7@0(`($X(!P@`
+M>N!7`0$`(/W_`&`U`$<0<((``"``-00G"`+^`&``>N!7`@D`(`":IE%0&D<0
+M`!P'8``@*&"0@@``(```/"<H`"`(8(#,_2\`>N!7`@,`(`3^'V!'`$<0`?X?
+M8+""```@``"`!Q``F@9@`"$`(#4$)P@"_@!H-0!'$`":IE$`?!]@T((``"``
+M[>`"```:0!``?!]@Z-@"``````@`>N!7`0,`(``((`CP@@``(`!L`H<0`@@@
+M"&X"AQ`$"``(<`"'$#4$)P@!_@!@`'K@5Q"#```@`((%`"`!_@!H-0!'$`!\
+M/V#$N@(`/(D`"!!^`$`\@8`0,(,``"``<@"'$`":IE%)&D<0``(`((K^'V``
+M?#]@SP(``("B)RA0@P``(```?#]@Q+H"`#B%``@`>N!7@0$`(%T$!P@0?@!H
+M70!'$'"#```@`(+^'V!'`$<0`'P_8,2Z`@!&B0`(5@"'$$Z)``A$`(<0D(,`
+M`"``-@0'"%4`1Q``FJ91`'P?8.[<`@``&D`0"(D`"`%^`$"P@P``(``(@8`0
+M`"`(8``F_2\`F@<0`?X?8!``K@D4`,X)&`#N"="#```@`!P`#@H$@.T+((`/
+M."`0;@L$/@X0`#8.$``X;F,4?HY3\(,``"``$!H.$```H&$`?!]@@.`"```$
+M``@`>N!7`0$`(````%`0A```(`"`"0`@`?X?8`!$_B\`?#]@G+@"``"(!@@`
+M@(`0`H@&"#"$```@``*`@!`$B`8(!("`$`!\/V`JW`(``(@&"`"`@!`"B`8(
+M4(0``"```H"`$`2(!@@$@(`0`?X?8!``K@D$@.T+((`/.!00;@MPA```(``$
+M/@X0`#8.$``X;F,4?HY3$!H.$`!\OV&DN0(`#($&$)"$```@`"R%!@@`>N!7
+M`0(`(!#_!D``I!(H````4"R!1A`0`*X)L(0``"``!(#M"R"`#S@4$&X+!#X.
+M$``V#A``.&YC''Z.4Q`:#A#0A```(``4'`X0&!X.$```H&$```!0@`8#*```
+M`%"`:?LO````4/"$```@`(!?`B@!_A]@@#SV+P">YU$`?!]@*MP"`!D>0!`:
+M'D`0$(4``"```((@4``N_"\!_C]@`'P?8.S<`@```D`0`'S?8:2Y`@`PA0``
+M(``L!0<(`'K@5X$!`"`0?P=``)`2*"P?1Q``?!]@Z-@"`%"%```@``````@`
+M>N!7@08`(!@$(`@`^N!7`04`(`!\WV&DN0(`<(4``"````@@"%@#AQ`"""`(
+M6@.'$`0(``A<`8<0`?X_8&8#1Q"0A0``(```?!]@Z-@"```:`!``?!]@*MP"
+M``"()@@&`H`0`H@F"+"%```@``@"@!`$B"8("@*`$`>$)@@3`D`0````4(#E
+M`B@._C]@T(4``"```'P?8//;`@```D`0$`"N"10`S@D8`.X)!(#M"R"`#SCP
+MA0``(``<$&X+!#X.$``V#A``.&YC$'Z.4P`$05``?!]@!]P"`!"&```@```$
+M0!``!$%0`(1@"`#ZX5>!!``@`H1@``!\`4`'W`(`,(8``"```@9`$`%^`4``
+M#D`8`H1@``#ZX5>"^_\G`'P?8`?<`@!0A@``(``!!$`0!/X_8`!\'V`JW`(`
+M$@)`$`!\'V`!6@```&C\+W"&```@``2`[0L@@`\X$!!N"P!\/V"DN0(`4(&`
+M$`"`#S@`?)]@D(8``"``I+D"`&<!0A!H`T(0`'P?8`;<`@``!$`0:0="$`"`
+M#SBPA@``(```?%]@I+D"``0!`1``?!]@Y]P"```"0!``@`\X!#X.$-"&```@
+M```V#A``.&YC&'Z.4Q`:#A`4'`X0``#`88!"[R\``*!A\(8``"```'P?8(#@
+M`@``!``(`'K@5P$"`"![_A]@`'P_8/D"```0AP``(```*B<H`'P_8*CA`@``
+M@``(``'G5P(!`"``F@9@`"$`(#"'```@``5ZYU>.```@!?[?80!\/V#`X0(`
+M`(0`"`!ZX%<!#``@4(<``"```'KG5X$)`"`"_A]@`(!`$`)^)X``?!]@(+X"
+M``"`($!PAP``(``8@0`(`'R?8*SA`@````(0+(%`"`!\'V"PX0(```0`$)"'
+M```@`$"!(`@`?!]@M.$"```"`!``*P`@`?Y?8`"$0!"`*0`@L(<``"```'KG
+M5P(1`"``F@9@@"KO+P```%``@B!0`"L:*``F[R_0AP``(``!_E]@`'P_8,'A
+M`@``A$`0`'P_8,3A`@``A$`0``1!4/"'```@``!\/V#"X0(``(1`$`!\/V"\
+MX0(``(`@"`'ZX%>!`@`@$(@``"```'P_8+CA`@``A"`(`/K@5X("`"``!$%0
+M`'P_8,'A`@`PB```(```A$`0@!8`(``;[R^`%P`@`GXG@`!\'V`@O@(``(`@
+M0%"(```@`!B!8`@`?)]@K.$"`"R!0`@`?!]@L.$"```$`!!`@2`(<(@``"``
+M`'P?8+3A`@```@`0`_X!4````A`%_C]@`'P?8-3A`@"0B```(````@`0`?X_
+M8`!\'V#0X0(```(`$`!\'V#8X0(```(`$+"(```@``!\/V"HX0(``(``"`!Z
+MX%<!`0`@`)P`$(#+_R<$_A]@T(@``"```'P_8,3A`@``@$`0`'P?8,CA`@``
+M'``0`)H&8(`$[R_PB```(`````!0`OX_8``%&B@0`*X)%`#."02`[0L@@`\X
+M&!!N"Q")```@``!\/V"IX`(``(!`$`"`#S@`?#]@Q+H"`$2!@!``@`\X,(D`
+M`"``!#X.$``V#A``.&YC$'Z.4P$$8`@`?#]@_-L"``&&0!!0B0``(```!$%0
+M`01@"``'X5<*!0`@``0@0`*$8`@`?"%`_-L"`'")```@``*&0!`!?B%``(Y`
+M&`$$(`@``^%7"_O_)P!\'V#=W`(`D(D``"```'P_8/S;`@`*_E]@`/SN+P2`
+M[0L@@`\X$!!N"P0^#A"PB0``(```-@X0`#AN8Q!^CE,``"!@%81`"`!\'V`J
+MW`(`%01`$-")```@`!:$0`@6!$`0%X1`"!<$0!`8A$`(&`1`$!N$0`@">N%7
+M\(D``"``B0``(!L$0!`=A$`(`'P?8"K<`@`=!$`0'H1`"!X$0!`0B@``(``@
+MB"`((`*`$`!\/V"8M0(``(0@"`#ZX%<!`0`@`((@4#"*```@`("*^R\$@.T+
+M((`/.!`0;@L$/@X0`#8.$``X;F,8?HY34(H``"``$!H.$!0<#A```,!A`(*@
+M80!\'V"DN0(`:@4`"`!ZX%=PB@``(`"""P`@`'P?8+3>`@``!``(`'K@5P$"
+M`"`)_A]@`%$"*)"*```@`````%``E/HO`WY'@``<04``!$%``'Q_8&#7`@``
+M!@%`L(H``"```00@"`+^`4``!$!``!P'8`":9F``Z/LO"?X?8`!%`BC0B@``
+M(``0`*X)%`#."02`[0L@@`\X&!!N"P0^#A``-@X0`#AN8_"*```@`!!^CE,`
+M``!0@'SU+X#Y%2@`?#]@C-L"``R``!``?#]@$(L``"``2-@"``"$``@`>N!7
+M`0$`(````%``@$`0!(#M"R"`#S@PBP``(``0$&X+!#X.$``V#A``.&YC$'Z.
+M4P!\/V#$N@(`"(D`"%"+```@``!ZX%>"!@`@.H4`"`%ZX%>!`0`@$($`"`!Z
+MX%>"`P`@<(L``"```'P?8.W@`@``!``(`'K@5P(!`"`!_A]@@"T"*`2`[0N0
+MBP``(``@@`\X$!!N"P0^#A``-@X0`#AN8R!^CE,0&@X0%!P.$+"+```@`!@>
+M#A`<(`X0``#`80""`&(`GN=1``B"4``(2!`0`*<)T(L``"``7(0&"`Q^(&``
+M^N!7@0$`(/Q^`&!(>N!7@E$`('R`!@CPBP``(``!>N!7`DD`(``(@E``?!]B
+MQ+H"``P)2!!,"0@(1@&($!",```@`!@!"`@`>N!7`0,`(``!YU>"```@&`D(
+M$`+^'V!'@$80,(P``"````@`(``<!V"`2`4H@!0`(`!\'V+$N@(`3`D("$8!
+MB!!0C```(```"()0#`E($!@!"`@`>N!7`?K_)X`%`"`#_A]@1X!&$'",```@
+M`(#Y_R<`?!]BQ+H"`!Q_"$``J!$H@`L`(`7^'V!'@$80D(P``"``@/7_)P`!
+MYU<"^_\G&`D($`#Z_R<`?!]BQ+H"``P%"`BPC```(```>N!7`G0`(`'^/V!'
+M@D803`D("$8!B!`8`0@(`'K@5]",```@``'L_R<``>=7`O/_)P`(@E``]_\G
+M`'P?8L2Z`@`("0@(\(P``"``_W\`0`@!B!``"()0"@F($(#:^2\`:@`@!?X?
+M8$>`1A`0C0``(``!_C]@`'P?8$C8`@```D`0`?X?8``W]2\`?!]BQ+H"`#"-
+M```@`$P)"`A&`8@0&`$("`!ZX%>!!``@``'G5P(!`"``"()04(T``"``&`D(
+M$`!\'V+$N@(`''\(0`",$2@``0`@`!P'8``B!2APC0``(```?!]BQ+H"``@)
+M"`C_?P!`"`&($``(@E`*"8@0`?X_8)"-```@``!\'V#MX`(```)`$`!7`"`%
+M_A]@1X!&$`'^/V``?!]@L(T``"``[-P"```"0!``?!]BQ+H"`$P)"`A&`8@0
+M&`$("`!ZX%?0C0``(`"!!``@``'G5P(!`"``"()0&`D($`!\'V+$N@(`''\(
+M0/"-```@``!Z$2@``0`@`!P'8``0!2@`?!]BQ+H"``@)"`C_?P!`$(X``"``
+M"`&($``(@E`*"8@0`$<`('R`!@@`?!]BQ+H"``0!"!`PC@``(`")_A]@`'P_
+M8#`$``"`0@`@`WX`4`9ZX%>-^O\G`GZ`@5".```@``!\A@%<C@`````&.!HC
+M```B(P``(B,``$(C``!H(P``<(X``"``B",``"DC```(^N!7`CD`('R`!@@!
+M>N!7@C``(`+^'V"0C@``(`!'@$80`'P?8L2Z`@!,"0@(1@&($``B`BB`(@`@
+M!?X?8+".```@`$>`1A``?!]BQ+H"```@`"`!_C]@1X)&$`!\'V"$X`(`T(X`
+M`"`````@"`#ZX%>!`0`@`!P'8`""`#@``$@0``0("`!ZX%?PC@``(```?!]B
+MQ+H"`$P)"`A&`8@0`0$`(%:`AA"`*0`@"`D("!"/```@`/]_`$`(`8@0@)?Y
+M+P`G`"`!_C]@`'P?8.W@`@```D`0,(\``"```'P?8L2Z`@`8`0@(`'K@5P$&
+M`"`0`*`(`/KB5X$$`"!0CP``(``*"2@(`/K@5P(#`"``QOPO&`D($`G^'V!'
+M@$(0''\(0'"/```@``!*$2@%_A]@1X!&$`!\'V#NW`(```0`"`!ZX%<"`P`@
+MD(\``"```?X_8`!\'V!(V`(```)`$`'^'V``Y_0O`'P?8L2Z`@"PCP``(``(
+M"0@(_W\`0`@!B!```@`@"`D("/]_`$`(`8@0`('Y+]"/```@``!\'V"$X`(`
+M```@"`#ZX%>!#@`@`!P'8`""`#@`#0`@\(\``"``?(`&"`!\'V+$N@(`!`$(
+M$(G^'V``?#]@M`0``(`(`"`0D```(``#?@!0!GK@5XWZ_R<"?H"!`'R&`2R0
+M``````8XJR,``#"0```@`*LC``"K(P``R",``/PC``#\(P``L",``(G^'V``
+M?#]@4)```"``N00``(`!)B@`G@=@$`"N"10`S@D8`.X)'``."@2`[0MPD```
+M(``@@`\X(!!N"P0^#A``-@X0`#AN8QQ^CE,0&@X0%!P.$)"0```@`!@>#A``
+M`,!A`)JF41``YPE<A`<(#'X@8`#ZX%>!`0`@L)```"``_'X`8$AZX%>""0`@
+M`'R?8,2Z`@`8`0((``'G5X(#`"#0D```(`````!0&`$"$`/^'V!'@$<0''\"
+M0(`;$2@``0`@`!P'8/"0```@`("Q!"@```!0`'R?8,2Z`@`*`8(0`!$`(`CZ
+MX%<"#@`@$)$``"```'R?8,2Z`@`8`0((`'K@5X$&`"`0`*`(`/KB5P$%`"`P
+MD0``(``*"2((`/K@5X(#`"``BOPO````4!@!`A`)_A]@1X!"$%"1```@`!Q_
+M`D"`#1$H`_X?8$>`1Q``?!]@A.`"````(`@`^N!7<)$``"``@0,`(``<!V``
+M@@`X``(`((C^'V``?#]@@@,``(#:)2B0D0``(```?)]@Q+H"``@)`@C_?P!`
+M"`&"$`":!F`0`*X)%`#.";"1```@`!@`[@D$@.T+((`/.!P0;@L$/@X0`#8.
+M$``X;F,0?HY3T)$``"```'P?8*[@`@``!``(`'K@5X$#`"``?#]@Q+H"`%"!
+M``CPD0``(``!?@!`4($`$````%"``0`@`?X?8`!B`2@!_A]@!(#M"Q"2```@
+M`""`#S@0$&X+!#X.$``V#A``.&YC$'Z.4P!\'V"NX`(`,)(``"````0`"`!Z
+MX%>!'P`@`'P?8*K@`@``!``(`'K@5P$,`"!0D@``(```?!]@Z]L"```$``@`
+M>N!7@@D`(`!\'V!8X`(```0`"'"2```@``!ZX%<"!P`@`'P?8"K<`@``@B!0
+M`(#Z+P!\'V#HV`(`D)(``"``````"`!ZX%>!`@`@&`0`"`!ZX%<!`0`@`?X?
+M8`"Q^2^PD@``(``!_A]@`*<`*````%"`>0`H`((@4`!\'V"`X`(```)`$-"2
+M```@``!\'V"NX`(```)`$`!\'V#HV`(`````"!@$``@`>N!7\)(``"```'P?
+M8*K@`@``!``(`0,`(`!ZX%<!`0`@%/X_8(`#`"`0DP``(``%_C]@@`(`(`!Z
+MX%<!`0`@#OX_8(```"`)_C]@`'P?8#"3```@`//;`@```D`0!(#M"R"`#S@0
+M$&X+!#X.$``V#A``.&YC4),``"``&'Z.4Q`:#A`4'`X0``#`80""H&&`)A$H
+M`'R_8*"T`@!PDP``(``<@2((`()@0`""84`"_F&``'R?8$S8`@``B$%``(B!
+M0)"3```@`````A`$'`$0"!H!$`'^`$`<@0(0$`"N"10`S@D$@.T+L),``"``
+M((`/.!@0;@L$/@X0`#8.$``X;F,T?HY3$!H.$!0<#A#0DP``(``8'@X0'"`.
+M$"`B#A`D)`X0*"8.$"PH#A`P*@X0``"@8?"3```@`!"`A@H,@"8(`(@`"``"
+M`$(6"`@(#WX`8``.P!D`>N=7$)0``"```?Y_8@*F:5(`@B!0`00("`1^`&``
+M>N!7`@$`(`#ZZ5<PE```(`""```@`?X_8`".0!@`@B!0`00("`1^`&``>N!7
+M@@$`(%"4```@``#ZZ5>"```@`?X_8`".0!H6"`@(`'P`8/#_````$.`9<)0`
+M`"```'KA5P!\/V+<L0(`@@0`("R!J`H`^NI7`0$`(`"J"F"0E```(`"`/00H
+M````4`!\/V+<L0(``#8`("2)*`@."`@(`('@5["4```@``(%`"`BB2@(#`@(
+M"`"!X%<"`P`@((DH"`H("`@`@>!7T)0``"```@$`(`'^'V"````@````4`!Z
+MX%>!!``@`'P_8MRQ`@#PE```(``HB0@(`('G5P("`"`FB2@(`?X`0``!YU>,
+M#0`@`'P_8A"5```@`-RQ`@`L@:@*`/KJ5P$!`"``J@I@`"L$*````%``?#]B
+M,)4``"``W+$"`"R!"!``^NE7`0@`(`$$"`C[?P!@`0!($`H("`A0E0``(``@
+M@8@0#`@(""*!B!`."`@()(&($"R;"!`PJ0@0*)^($'"5```@`":=B!"`&@`@
+M``/G5XD!`"``F@9@`!\$*``8`"`,@"8(D)4``"```H@`"#@(B@@`"`!0`!#`
+M&2R!J`H,@$H(``AA"`"$H4"PE0``(``P@>@)%(A'"`"(``@``B!```8!0``<
+M`$``?>!7[`$``-"5```@``P&`"``F@9@@!0$*"R!J`H`^NI7`0$`(`"J"F``
+M$@0H\)4``"``````4`!\/V+<L0(`+($($``+`"``"@%```(B0``<1V`0E@``
+M(`"`;>TO#(!*"`((`0@`'`!``@"!$!2(1P@`'`%`%("'$#"6```@``":!F``
+M"00H`'KI5X$!`"`L@:@)````4``!`"````!04)8``"````$`("R!"!``F@9@
+M$`"N"10`S@D8`.X)'``."B``+@IPE@``(``D`$X**`!N"BP`C@HP`*X*!(#M
+M"R"`#S@T$&X+!#X.$)"6```@```V#A``.&YC&'Z.4Q`:#A`4'`X0``#`88!*
+M[2\`?+]AL)8``"``Q+H"`#J=1A``2^TO.84&"`!ZX%>"`@`@.H4&"`!ZX%?0
+ME@``(``!`0`@!/X?8(`S`B@0`*X)%`#."02`[0L@@`\X&!!N"_"6```@``0^
+M#A``-@X0`#AN8Q!^CE,!_G]@`'Q?8-3<`@``!D$0$)<``"```'Q?8-7<`@``
+M`D$0`'K@5P$&`"``62(H$'X@@`!\'V`PEP``(`#HV`(`````"`X(0`@0"&`(
+M````4`'^GV"`,.\O`?X?8%"7```@`(`<^2\$@.T+((`/.!`0;@L$/@X0`#8.
+M$``X;F,0?HY3<)<``"```'R_8&G<`@``A&((`/KA5P$,`"``"()0`(A"$`!\
+M?V"0EP``(`!PW`(``(`!$`!\'V!LW`(```*`$`'^/V``?!]@:-P"`+"7```@
+M```"0!``?!]@:MP"```"0!``?!]@=-P"```$0!``?!]@T)<``"``G-P"```(
+M`!````!0`OX_8(`'&"@$@.T+((`/.!`0;@OPEP``(```>N!7@0,`(`!\/V!J
+MW`(``(0`"`!ZX%<"`P`@`OX?8!"8```@`(`!`"````!0`'P_8&K<`@``@$`0
+M`(`/.`0^#A``-@X0,)@``"```#AN8Q1^CE,0&@X0`+X/8`!\`&#___\``GX`
+M@`!\OV%0F```(`"@M`(`B($&$(2!!@@!?@!`A($&$(`2$BB`@080`'P_8'"8
+M```@`&C<`@``A``(`'K@5X$$`"``FJ91`)I`$`'^/V``?!]@D)@``"``:MP"
+M```"0!````!0`OX_8(#O%R@`FJ91`'P?8-3<`@"PF```(```&D`0`'P?8-S<
+M`@``&D`0`/<!*`!\'V#PW`(``!H`$-"8```@``!\'V#TW`(``!H`$!``K@D$
+M@.T+((`/.!00;@L$/@X0\)@``"```#8.$``X;F,@?HY3$!H.$!0<#A`8'@X0
+M'"`.$!``H`D0F0``(```?/]A==P"``"$)P@`^N!7`28`(`P`(`@`B``(``(`
+M0#"9```@`#B(1@@```%`%(@F"`"$(%``D"`8`'Q?8&S<`@``"$$(4)D``"``
+M`'S?8:#<`@``'&=@`#$7*`0`)P@`@``(```G"`"`(`APF0``(``(`$<(``A!
+M"`#E)B@%?@"`??X_F(#P[2\T@$8(```!4I"9```@`(#M["\`A"<(`/K@5P$6
+M`"``@B!0`()'$"@`1P@"!&$(L)D``"```'P_8'S<`@``A@`0`P0A"`!\7V"`
+MW`(```(!$`!\7V#0F0``(`!XK@(```(!$```)P@`@$`(`'P_8(3<`@``A``0
+M!``G"/"9```@``"`0`@`?#]@B-P"``"$`!``?#]@>-P"``"@`!`L!$<($)H`
+M`"```'P_8(S<`@``A$`0+01'"`!\/V"-W`(``(1`$#2`1@@PF@``(```?#]@
+MD-P"``"$`!"`VNPO````4`+^/V"`NA<H@```(%":```@``#8["\0`*X)%`#.
+M"1@`[@D<``X*!(#M"R"`#S@@$&X+<)H``"``!#X.$``V#A``.&YC%'Z.4P!\
+M/V#`W@(`!?Y@0`*$``B0F@``(`#_@4T0`X0`"/Z!31#^B2T(`'P?8-BN`@``
+M`@`0````4+":```@``!\OV#<K@(``(`"$``,PU``?!]@M-T"```$``@``>-7
+MT)H``"``BA(`(`"$00@`>N%7#`(`(`YZX5<)`0`@`?Z?8(```"#PF@``(```
+M"()0`(1!"``$(6`!A`$(``0`0`"!X%>*!P`@`(@`4!";```@``&`'X``$$`8
+M`'R_8-RN`@``@`((``0`:`"``A`!_@!`,)L``"````X@&`"$00@!A`$(``0`
+M0`"!X%>+^/\G`_YA0`%^`T!0FP``(```#L`8`'P?8+3=`@``!``(``'C5XOM
+M_R<"_A]@`!#U+W";```@``'^/V``?!]@M=T"```"0!`$@.T+((`/.!00;@L$
+M/@X0D)L``"```#8.$``X;F,8?HY3$!H.$!0<#A```*!A`'S?89#"`@"PFP``
+M(```!&<(`OY!@`!\/V#,P@(```(!``!ZX%>!#@`@`OKA5]";```@`(H-`"``
+M^N97`@$`(`'ZX5>"!0`@`'S?89#"`@``!&<(\)L``"```OY!@`!\/V#,P@(`
+M``(A``"(``@``B!``?X?8`B``!`0G```(```?-]AD,("```$9P@"_D&``'P_
+M8,S"`@```@$``?X_8#"<```@`(#@]"\`!&<(`?X!0```1Q``?-]AD,("```$
+M9P@"^N%74)P``"``BA$`(`#ZYE>"$``@`?X?8`'^/V``!$%0@.`"*`!ZX%=P
+MG```(``!"P`@``1G"`+^08``?"%`S,("``"``!#V_C]``@*`$)"<```@`!3^
+M/V```H`0`(JB4!`*`!``"(`(```B0`W^7V````)`L)P``"````0`$`/^`8``
+M!@!0!(``$`B*`!``@@!@``,`(`!\/V#0G```(`#TJ`(`#($`"`%^`$`,@0`0
+M````4!``K@D4`,X)!(#M"_"<```@`""`#S@8$&X+`8`?@``00!@`?#]@K.`"
+M``"(``@`!`!P$)T``"```("`$`"`#S@$/@X0`#8.$``X;F,@?HY3$!H.$!0<
+M#A`PG0``(```FJ91`+XO8`&`7X``?#]@K.`"``"(``@`!`!H`("`$%"=```@
+M``!\'V"`O@(```@`"`!ZX%<!!0`@!GK@5P$$`"``?-]A<)T``"``.+H"`"1_
+M!T#X_VU``?X_8`'^7V#__Y]@@$H.*`!\WV&0G0``(``XN@(`!'\'0/[_/V`"
+M_E]@`'\.*`!K["\`!2<(`/K@5["=```@``$!`"`!_K]A@`@`(`!\/V"JX`(`
+M`(0@"`#ZX%<"!@`@T)T``"```'P_8.O;`@``A"`(`/K@5X(#`"``?#]@6.`"
+M``"$(`CPG0``(```^N!7`@$`(`'^7V``!4<0`&+L+P#ZYE>!!``@`'S?81">
+M```@`#BZ`@`$?P=`_/]M0`'^/V``!$%0__^?8(`V#BB`+0`@,)X``"```'P_
+M8*K@`@``A"`(`/K@5P(K`"``?#]@Z]L"``"$(`A0G@``(```^N!7@B@`(`!\
+M/V!8X`(``(0@"`#ZX%<")@`@`(;X+W">```@`(#""R@`?!]@L-X"``````@(
+M?@!@`'K@5X("`"``?!]@D)X``"``!*\"``````@!>N!7`@@`(`/^OV$`C@88
+M`_YF@`":84"PG@``(```AF%``'Q?8&#7`@``A"%``80@"`)^04``!D%``(9A
+M4-">```@`(!F^2\`^N97__^F08+X_R<`?!]@Z-@"``````@`>N!7\)X``"``
+M@0$`(!@$``@`>N!7`@(`(`!\'V`JW`(``"/N+X`!`"`0GP``(``!_A]@`"3X
+M+X#\_R<`?!]@Z-@"``````@8!``(`'K@5S"?```@``$%`"``V@HH`'K@5X$"
+M`"`!_E]@`'P?8//;`@``!$`04)\``"````,`(!3^/V"````@#OX_8`!\'V#S
+MVP(```)`$`'^7V!PGP``(```?#]@JN`"``"$0!````!0`'S?83BZ`@```4<0
+M!'\'0)"?```@``'^/V``!$%0`$`.*!``K@D4`,X)!(#M"R"`#S@@$&X+L)\`
+M`"```(`/.`"`#S@$/@X0`#8.$``X;F,0?HY3`'P?8+GA`@#0GP``(```!``(
+M`'K@5X$-`"``?!]@P.$"```$``@`>N!7`@L`(/"?```@``!\'V"HX0(`````
+M"`!ZX%>!"``@!?X?8("A_R\%_C]@$*```"```'P?8-3A`@```@`0`?X_8`!\
+M'V#0X0(```(`$`!\'V`PH```(`#8X0(```(`$`'^/V``?!]@W.$"```"0!`$
+M@.T+((`/.%"@```@`!`0;@L`?!]@P.$"```$``@`>N!7`@0`(`!\7V#<X0(`
+M<*```"````0A"`!\'V#=X0(```)`$````%```$$0`(`/.`0^#A"0H```(```
+M-@X0`#AN8Q1^CE,0&@X0`'P?8*CA`@`````(`'K@5["@```@`($1`"``?!]@
+MN>$"```$``@`>N!7`0\`(`!\'V"\X0(`T*```"``````"`!ZX%<"`0`@!?X?
+M8(""_R\`?!]@P.$"```$``CPH```(```>N!7`@D`(("Y)B@``*!A`OKF5P(#
+M`"``?!]@O.$"`!"A```@``````@`>N!7@@``(`"V(R@!^N97`@,`(`!\'V"\
+MX0(`,*$``"``````"`%ZX%>"```@`+\C*!``K@D$@.T+((`/.!00;@M0H0``
+M(``$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A``FJ91`'P?8'"A```@`*7A`@``
+M&D`0`'P_8,+A`@``A``(`'K@5P$!`"``FD`0D*$``"````4`(`!\/V##X0(`
+M`(0`"`!ZX%<!`0`@`)I`$(`!`""PH0``(```?#]@S.$"``":0!``?!]@K.`"
+M```(``@`?`!@``0``-"A```@``!ZX%<!!0`@"OX?8`!C_R\`?#]@(+X"`'2%
+M``@`>N!7\*$``"``@0$`(`":IE%TFT`0@*X`(`!\'V#$X0(```0`"`-ZX%<0
+MH@``(``"/@`@?/X?8`!\/V#5`P```,@C*`!\'V"\X0(`````"#"B```@``!Z
+MX%>"IP`@`'P?8+CA`@``!``(`'K@5X$'`""`;@`@4*(``"```'P?8,3A`@``
+M!$`0`'Q_8,#A`@``A`$(`'K@5X&@`"!PH@``(```?%]@I.$"```$`0@`>N!7
+M`9X`((")`"`!_K]A`'S?89"B```@`+GA`@``!"<(`/K@5X$(`"````!0`_X_
+M8`!S!"@``*!AL*(``"````0G"`#ZX%<"!0`@`'P_8,+A`@``A``(`'K@5X("
+M`"#0H@``(```?#]@P>$"``"$``@`>N!7`9(`(`#ZYE<"#P`@`'P_8/"B```@
+M`,SA`@``A``(`7X`0``.0!@`@$`0"GKA5X((`"``?']@$*,``"``P.$"``"$
+M`0@`>N!7@6X`((!K`"``FJ91`!I!$`":01`PHP``(```?#]@P>$"``":0!``
+M?#]@(+X"`%C_`$``SPXH@&@`(%"C```@``'^'V``?#]@PN$"``"`0!``>P`@
+M`OKF5P(#`"`!_A]@<*,``"```'P_8,'A`@``@$`0`_Y?8(#9_R<!^N97@@P`
+M(`!H(RB0HP``(``"_E]@`'P?8,3A`@``!$`0`)JF40!\/V#!X0(``)I`$+"C
+M```@``!\WV&YX0(```0G"`#ZX%>!`@`@@.`2*`!\`$``"@``T*,``"```?X_
+M8("I%B@`?%]@I.$"```$`0@!>N!7`7$`((`@`"#PHP``(`!\_A]@`'P_8#T$
+M``"`C",H`&X`(`1ZX%>"#0`@`'P?8!"D```@`,CA`@```"`(`'P?8*CA`@``
+M`@`0`)JF40!\'V#<X0(`,*0``"```!I`$`!\'V#=X0(``!I`$`!\'V#@X0(`
+M`!H`$`!\'V!0I```(`#DX0(``!I`$`!\'V#FX0(``!J`$`!\'V#HX0(``!J`
+M$'"D```@`(!8(RB`7P`@`7K@5X(1`"``?!]@N.$"```$``@`>N!7D*0``"``
+M@0(`(`'^'V``?#]@P>$"``"`0!"`60`@`'S?8;GA`@"PI```(```!"<(`)JF
+M40!\'V"HX0(``!H`$`#ZX%<!!0`@!?X?8-"D```@`(`(_R\```!0@*X**`!\
+M'V`JW`(`%!I`$`""(%``,_@O\*0``"``@%H2*`!\'V#LL@(``?X_8``$05"`
+MD@TH`$T`(`)ZX%<0I0``(`""0@`@`'P_8!3=`@``@``(`7K@5P(!`"`"_A]@
+M`(``$#"E```@``!\'V#HV`(`````"`!ZX%>"`@`@`'S?8;GA`@``!"<(4*4`
+M`"```/K@5X%#`"``?-]AN>$"```$)P@`^N!7`@(`('S^'V!PI0``(```?#]@
+MS00```!=(RA\_A]@`'P_8-$$````6R,H`'P?8)"E```@`*CA`@`````(`'K@
+M5P("`"!\_A]@`'P_8-0$``"`5B,HL*4``"```'P?8+CA`@``!``(`'K@5X$"
+M`"`!_A]@`'P_8,'A`@#0I0``(```@$`0@)#_)P'^OV$`?-]AN>$"```$)P@`
+M^N!7@0P`(/"E```@``'^'V`#_C]@``D$*```H&$`!"<(`/K@5P(%`"``?#]@
+M$*8``"``PN$"``"$``@`>N!7@@(`(`!\/V#!X0(``(0`"`!ZX%<PI@``(``!
+M*``@`'P?8*7A`@``!``(`'K@5X$!`"````!0`((@4%"F```@``!:%B@`^N97
+M`@L`(`!\/V#,X0(``(0`"`%^`$``#D`8<*8``"```(!`$`IZX5>"!``@@)'_
+M)P!\7V"DX0(```0!"`!ZX%>0I@``(``"DO\G@OX?8(`L%BB`&@`@`?X?8`!\
+M/V##X0(``(!`$+"F```@```1`"`"^N97@@4`(`'^'V``?#]@P>$"``"`0!`"
+M_E]@T*8``"``@&__)P":IE$`&D$0`)I!$`":0!"`#P`@`?KF5X($`"#PI@``
+M(`"`"",H`'Q?8*3A`@``!`$(`'K@5X$-`"``FJ91`!I!$!"G```@```*`"!\
+M_A]@`'P_8$4%````*",H@`D`('S^'V``?#]@,*<``"``3`4``(`E(R@`!P`@
+M`)JF40!\/V#!X0(``)I`$(!O$BA0IP``(```?`!`P`,```'^/V"`.!8H``(`
+M(`!\/V`@O@(`6/\`0'"G```@``!*#B@0`*X)%`#."02`[0L@@`\X&!!N"P0^
+M#A``-@X0D*<``"```#AN8Q!^CE,`?!]@N>$"```$``@`>N!7@@$`('G^'V"P
+MIP``(`#K_C]`@!4C*`!\'V"HX0(`````"`!ZX%<!!0`@`'P?8-"G```@`+SA
+M`@`````(`7K@5X$"`"``?!]@P.$"```$``@`>N!7\*<``"```0$`(`'^'V``
+M#@`@`'P_8-3A`@``@``(`'K@5P$!`"`0J```(`#_?P!``(``$`!\/V#4X0(`
+M`(``"`!ZX%<"!0`@`'Q?8#"H```@`-#A`@````$(`'P_8*SA`@``@"`(``/@
+M5P$!`"`#?@!`4*@``"`````!$`!\7V#0X0(````!"`!\/V#8X0(``(``$`2`
+M[0MPJ```(``@@`\X$!!N"P"`#S@$/@X0`#8.$``X;F,8?HY3$!H.$)"H```@
+M`!0<#A````!0@#8**`":IE$`?!]@*MP"`!0:0!`%_A]@L*@``"``@(C^+P``
+M`%``@B!0@`P6*`!\'V"YX0(``!I`$`!\'V#0J```(`#,X0(``!I`$`!\'V#"
+MX0(``!I`$`!\'V#!X0(``!I`$/"H```@``!\WV&DX0(```0'"`!ZX%>!!``@
+M`'P?8.RR`@`!_C]@$*D``"````1!4(`0#2@`&D<0`'P?8'B]`@"`$PXH$`"N
+M"10`S@DPJ0``(``$@.T+((`/.!@0;@L$/@X0`#8.$``X;F,0?HY3`'P?8%"I
+M```@`+GA`@``!``(`'K@5P$"`"!]_A]@`'P_8*4%``"`WB(H<*D``"```?X_
+M8`!\'V"YX0(```)`$`!\'V"HX0(`````"`!ZX%>0J0``(`""!0`@!?X?8(!O
+M_B\```!0@!4**`""(%``?!]@*MP"`+"I```@`!0"0!``@B!0@)GW+X`/`"`%
+M_C]@`'P?8-3A`@```@`0T*D``"```?X_8`!\'V#0X0(```(`$`!\'V#8X0(`
+M``(`$`""(%#PJ0``(```?!]@W.$"```"0!``?!]@W>$"```"0!``?!]@X.$"
+M`!"J```@```"`!``?!]@Y.$"```"0!``?!]@YN$"```"@!``?!]@,*H``"``
+MZ.$"```"@!"`GR(H!(#M"R"`#S@0$&X+`OY?8`!\/V!0J@``(`!8X0(``("`
+M"`!\?V#DNP(`$($A"``#XE<%`0`@!/Y?8'"J```@```%`"`4@2$(``/B5P8#
+M`"``?#]@5.$"``"`@`@,@2$(D*H``"````/B5X4``"`#_E]@`'K@5P$1`"``
+M?']@>.$"``"`(0BPJ@``(````^%7@0X`(`"$`1`">N%7`0$`(`!ZX5>"!0`@
+M8@@@"-"J```@`/[_(&!B`H`0;@A`"&`((`@`A"!P8`*`$`0`(`@`_"!@\*H`
+M`"``_^___P`%`"!B""`(`?X@:&("@!!N"$`(8`@@"`"$(&@0JP``(`!@`H`0
+M!``@"`#\(&@`$```!`(`$`'^'V"````@````4#"K```@``"`#S@`!$%0`'K@
+M5P$+`"!8"&`(`'P_8%[A`@``B"`(4*L``"```(/A5XP``"`!_E]@`'Q_8(#A
+M`@``@"$(``/A5P$%`"!PJP``(```A`$0`'KA5V(((`@"`0`@]_\@8(```"`(
+M_B!H8@*`$)"K```@``'^'V"````@````4`"`#S@"_E]@`'P_8/K@`@``B&`(
+ML*L``"```'R?8.2[`@`8"2((`(/A5PH!`"`$_E]@@`0`(!H)(@C0JP``(```
+M@^%7"@$`(`/^7V```@`@'`DB"`"#X5>,```@``1!4/"K```@``!ZX%<!#0`@
+M`'Q_8'SA`@``@"$(``/A5X$*`"``A`$0$*P``"```GKA5P$!`"``>N%7@@,`
+M(&(((`@"_B!X8@*`$`0`(`@PK```(```_"!@_^___P`#`"!B""`(`OX@:&("
+M@!`$`"`(`/P@:%"L```@```0```$`@`0`?X?8(```"````!0`(`/.`0^#A``
+M-@X0<*P``"```#AN8QA^CE,0&@X0%!P.$```H&$"_C]@`'P?8'CA`@"0K```
+M(````@`0`'P?8'3A`@```@`0`'P?8'SA`@```@`0`!S'4;"L```@``!\'V"$
+MX0(``!P`$``8`"@`F@9@`"D`*`!\?V#XX`(`T*P``"```)R!$`#ZYE<!$@`@
+M``1!4``$84!>B`8(`/PA0/#@`@#PK```(```@(`0`'Q_8/C@`@``B"$(``(@
+M0`""@1`!?D%`!'KA5Q"M```@`(OY_R<`?#]@_.`"``"`@!``?#]@^N`"``"`
+M@!``?#]@,*T``"``-*\"``"``!``',=1I)R&$````%"B@(80L)R&$``$05!0
+MK0``(```!&%``!S'40"&!D"F'(`0`7Y!0`5ZX5>+_/\G$`"N"7"M```@`!0`
+MS@D$@.T+((`/.!@0;@L$/@X0`#8.$``X;F,0?HY3D*T``"```'P?8"#A`@``
+M@B!0,/Y?8`"]ZR\`?!]@_N`"``""(%"PK0``(``4_E]@@+KK+P!\'V#DNP(`
+M"`$@"`!\'V`8X0(```(`$-"M```@``""(%``?!]@'.$"```"`!``?!]@4.$"
+M```"`!``?!]@\*T``"``5.$"```"`!``?!]@6.$"```"`!`$@.T+((`/.!`0
+M;@L0K@``(``$/@X0`#8.$``X;F,0?HY3``1!4`!\/V"`X0(``(0`$#"N```@
+M``!ZX%>!"0`@6`@`"`!\/V!<X0(``("`$`!\/V#DNP(`4*X``"``*(E`"``%
+MX%<JB2`("P$`(`"`X*>````@`(3@IP"0'!APK@``(`!D_C]@`+CK+P!\/V!>
+MX0(``("`$`2`[0L@@`\X$!!N"Y"N```@``0^#A``-@X0`#AN8QQ^CE,0&@X0
+M%!P.$!@>#A```*!AL*X``"```$D/*```P&%JB`8(``X`&(`3%R@``.!A`)H&
+M8``S`"C0K@``(```?!]@=.$"``````@$>N!7@@@`(&J(!@@!>N!7@1X`(/"N
+M```@``!\'V#DNP(`7`$`"`(>(`!>B`8(`('@5PP;`"`$_A]@$*\``"```?X_
+M8`":1F"`:1\H`'S_86SA`@``%P`@`WK@5P((`"`PKP``(```?!]@Y+L"`%P!
+M``@"'B``7H@&"`"!X%>,!``@`'S_85"O```@`&SA`@``@`<(```'4`!]X%?H
+M`P``C@\`(`3^'V"`#``@<*\``"```'P?8'3A`@`````(`7K@5P$!`"``>N!7
+M`@L`(&J(!@B0KP``(``(>N!7@0D`(`!\'V#DNP(`6`$`"`(>(`!>B`8(``/@
+M5["O```@``P&`"``?/]A;.$"``"`!P@```=0`'W@5^@#``".`@`@T*\``"``
+M`_X?8`'^/V``FD9@`%$?*`"<!Q`0`*X)%`#."1@`[@GPKP``(``$@.T+((`/
+M.!P0;@L`!$%0`'P_8.2[`@`&B6`()($@"!"P```@``"#X5>.```@`?Y?8`!Z
+MX%>!!P`@`'Q_8(3A`@``@"$(,+```"````/A5P$%`"``A`$0`'KA5V(((`@"
+M`0`@$/X@>(```"!0L```(``0_B!H8@*`$`'^'V"````@````4`"`#S@$/@X0
+M`#8.$'"P```@```X;F,L?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0D+``
+M`"``*"8.$```H&$"_M]A`/KF5X$V`"``F@9@`/8#*)"(1@BPL```(`!TB&8(
+M+?X_8`!\?V)BX0(``(*)$"/^/V``?%]B9.$"`-"P```@```"B1`*_C]@`'P_
+M8F;A`@``@H@0&?X_8`!\'V)HX0(`\+```"````*($`!\_V'DNP(`.(DG"`"#
+MX5<,`0`@!/[?88`6`"`0L0``(``ZB2<(`(/A5PP!`"`#_M]A`!0`(#R))P@`
+M`^!7#`@`(#"Q```@`"UZX5<,`0`@!/[?80`/`"`C>N%7#`$`(`/^WV$`#0`@
+M4+$``"``"GKA5PH!`"``',=1``L`(!EZX5<*"@`@`?[?80`)`"!PL0``(```
+MF@9@`,\#*):(1@@^B2<(``/@5XP'`"``B`D(``'A5Y"Q```@`(GT_R<`"`D(
+M``'A5PGU_R<`B`@(``'A5XOU_R<`"`@(L+$``"````'A5POV_R<```!0E("&
+M$)*`AA``?!]@,*\"```$`!#0L0``(```?#]@=.$"``"```@``>=7@0X`(`"<
+M`!`">N=7`0$`(/"Q```@``!ZYU>"!0`@8H@&"/M_`&!B@(80:H@F"&"(!@@`
+M`@!P$+(``"``8("&$`2`!@@`?`!@_^___P`%`"!BB`8(!'X`:&*`AA`PL@``
+M(`!JB"8(8(@&"``"`&A@@(80!(`&"`!\`&@`$```!(`&$%"R```@``'^'V"`
+M```@````4!``K@D4`,X)&`#N"1P`#@H@`"X*<+(``"``)`!."B@`;@H$@.T+
+M((`/."P0;@L`@B!0#`!`"`!ZX5>0L@``(``!!``@```@"`B`0`@`!``0``1!
+M4`B$`!`,`$`(_W]!0+"R```@``P$`!``@@!@`(`/.`P`0`@`>N%7`1,`(`%Z
+MX5<``$`(T+(``"```@4`(`"%X%>"$``@`(9A4`0&`!``!@`0#`!`"/]_04#P
+ML@``(``,!``0"(8`$(`-`"``A>!7@@$`(`B`0`@`!``0``4`(!"S```@``@`
+M80@`^N%7@0@`(`"'X%>"!0`@"(!A"`@&`1``^N%7,+,``"``@@``(`0$`!``
+MAF%0"(8`$`P`0`C_?T%`#`0`$``#`"!0LP``(```AD%@"(!A"`#ZX5>"]_\G
+M````4(```"`!_A]@`(`/.'"S```@``0^#A``-@X0`#AN8QQ^CE,0&@X0%!P.
+M$!@>#A```,!AD+,``"```(*@80`$X6&`K.DO`GXG@`!\GV"<L`(``(B@0!2`
+M(@BPLP``(```FF!`)(!""`"%X5>.`P`@`/KG5P$"`"``$$$8`)`@&-"S```@
+M```"H5&````@`)JF40#ZYE<!#@`@`(9A4`!\GV"<L`(`\+,``"``#`!""`""
+M(%``F^!7!@,`(`8<01``!&%@#`!!"`'^($`0M```(```F^!7!?W_)P!\GV"<
+ML`(`$``B"`":(%`0`@(0`GXG@#"T```@``"(H$`4@"((`)H@0!2"`A`,`*()
+M`((@4`R"`1`,!`(04+0``"``@```(`":IE$`E^DO`)H&8!``K@D4`,X)&`#N
+M"02`[0MPM```(``@@`\X'!!N"P""(%`"`H`0"`(`$!`"`!`&`D`0%/X_8)"T
+M```@```"@!#V_C]`!`*`$`"`#S@$/@X0`#8.$``X;F,0?HY3L+0``"````!@
+M8`""@&````!0```!$`#ZX5>!!``@`(8!8`#U_R_0M```(`````$(`7X`0```
+M`1``!@(0#(!A"`#ZX5>"^_\G!(#M"_"T```@`""`#S@0$&X+!#X.$``V#A``
+M.&YC$'Z.4P```%`/_C]@$+4``"``!_Y?8`+^?V"``0`H!(#M"R"`#S@0$&X+
+M!#X.$``V#A`PM0``(```.&YC$'Z.4P``H&```@%```;`0`!\GV"<L`(`-``"
+M"%"U```@``!ZX%>"`0`@`'P?8``@`@`T``(0`'R?8)RP`@`$``((<+4``"``
+M`'K@5X(#`"`(``((`'K@5P("`"`$"@(0``H#0`@``A"0M0``(`"``0`@`'R?
+M8)RP`@`$"@(0`'R?8)RP`@`H``((``(`0+"U```@`"@``A`L``((``0`0"P`
+M`A`P``((``8`0#```A````((T+4``"````P`0````A`0``((``P`0!```A``
+MBD)@``H#0``!X5?PM0``(``&"@`@"7YA@`!\GV"<L`(`-``""``&`$"`S?\O
+M-``""!"V```@```&`$`'!$`0-``""`P`(@@`!@!`#`(`$#0``@@`!@!`,+8`
+M`"``#``"$`%^04``"@-```'A5P7V_R<$@.T+((`/.!`0;@M0M@``(``$/@X0
+M`#8.$``X;F,0?HY3&/X?8`?^/V`(_E]@!?Y_8'"V```@`(#6_R\$@.T+((`/
+M.!`0;@L$/@X0`#8.$``X;F,@?HY3D+8``"``$!H.$!0<#A```,!A````4/B!
+M#1`&!*<)`'WG5P`@`@"PM@``(``&!0`@`+X/8`!\`&#___\``GX@@`!\'V"8
+ML0(```,`$-"V```@``3^'V!7_C]@`#$A*/C_+4#\_TU``!P'8("V_R\`0NDO
+M\+8``"```'Q?8)RP`@`,`&$(^($M"`R&`!`,'`$0_(%M"!``(0@0MP``(```
+MAB!`$`(!$`+^)H``A$!`%``A"`"&(%`4`@$0@#SI+S"W```@``'ZYE<"`0`@
+M`,?U+X```""`C?$O$`"N"10`S@D$@.T+4+<``"``((`/."`0;@L$/@X0`#8.
+M$``X;F,0?HY3`?X_8`!\'V!PMP``(`"HUP(```)`$`!\'V#KVP(```)`$`3^
+M'V"`#2(H"/X?8)"W```@``!\/V````0``'P&*`!\/V#4L@(`2($`"`%^`$!(
+M@0`0L+<``"``!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A#0MP``
+M(````*!A`/K@5P$4`""`71`H`'P_8"B[`@``@2`(#(``$/"W```@``*$!@@#
+MA(8)"'Z&@0`8`&@0@(`0!(0&"`6$A@D(?H:!$+@``"```!@`:`:$A@D0?H:!
+M`!@`:`>$A@D8?H:!`!@`:`"``!`PN```(``(A`8("82&"0A^AH$`&`!H"H2&
+M"1!^AH$`&`!H"X2&"5"X```@`!A^AH$`&`!H!(``$`Z$!@@0?D"`#80&"`A^
+M`(``!$!`<+@``"``#(0&"``$`$`(@``0`'P_8"B[`@`$_P!``"<,*````%"0
+MN```(``0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC%'Z.4["X```@`!`:
+M#A``!$%0`'P?8)#"`@``!$`0`'P?8-C"`@``!$`0T+@``"```)JF40+^)H``
+M?!]@S,("``"`````>N!7`00`(`+^)H#PN```(```?!]@S,("``"````$""`(
+M`/K@5X'\_R>`KO\O`OXF@!"Y```@```$05``_`!`S,("```$`!`!_@9```Z@
+M&0+ZYE>+]/\G,+D``"``$`"N"02`[0L@@`\X%!!N"P0^#A``-@X0`#AN8SQ^
+MCE-0N0``(``0&@X0%!P.$!@>#A`<(`X0("(.$"0D#A`H)@X0``#@87"Y```@
+M``""`&(`!"%B`!S'4?#_34#T_RU``'Q_8I3"`@`4@`D(D+D``"`````!$#_^
+M'V``@``0`"1)4O"!#0@``>=7!CD`(/S_34*PN0``(`#X_ZU!`.GH+P!\?V*4
+MP@(`$(`I"`"<($`__F!@`'P_8-"Y```@`-2^`@`L@$`(`_XA@`"$8$``A"``
+M``()$`2`(0@`@@80\+D``"```.3H+P`D25+^A:T)_(4-"`5ZX%>!*@`@_($-
+M"/B!+0@0N@``(```($A@`*)H8`""!S@``"!@`/K@5X$F`"``>N=7`0(`(#"Z
+M```@```<!V"`-NTO``!`8H`7`"``@J!A`-?H+Q2`*0@`@^974+H``"``C@``
+M(`""H&$`?#]@U+X"`"C^P$``?']BE,("``S^J4!PN@``(```!$%0`/KF5XX%
+M`"`$@"((`(0@0#_^(&`$_H"```!C")"Z```@``""(%``B(%```("$`%^04``
+MA>97C?K_)PB`(@@`FB!0L+H``"``"(("$`2`(@@`FB!`/_X@8`2"`A"`R>@O
+M`"1)4@!ZZ5?0N@``(``"%``@`)JF4?#_34#T_RU``'Q_8I3"`@`4@`D(```!
+M$/"Z```@`#_^'V``@``0`"1)4OR%#0@">N!7@@4`(/B!#0@0`$`($+L``"``
+M!?X_8'P"`1``?#]@!+\"`"B!(`@`^N!7`0$`(`""`#@PNP``(````$!B^(%-
+M"`!ZX5>!`P`@_(4-"`%ZX%<"`@`@````4%"[```@``""(%```@$X``!`8@"<
+MQD'P@0T(``'G5P8!`"``>NE7<+L``"```<?_)P`D"6`0`*X)%`#."1@`[@D<
+M``X*(``N"B0`3@J0NP``(``H`&X*!(#M"R"`#S@\$&X+!#X.$``V#A``.&YC
+M0'Z.4["[```@`!`:#A`4'`X0&!X.$!P@#A`@(@X0)"0.$"@F#A``FJ91T+L`
+M`"``_/\M0`!\?V"4P@(`!(!!".S_C4``?!]@E+X"``@```CPNP``(``````(
+M```"$`!\'V#4O@(```"`".R!#0@`"`!0!'X`B!"\```@```%X%>%`0`@``0`
+M4`"``!```0`@0'X`0(#]_R<(@$$(,+P``"```(``"``%X%<.`0`@````4`"`
+M`!#\@0T(`'K@5P$L`"!0O```(`#X_RU"]/]M0O#_34(`?!]BU+X"``!\_V&4
+MP@(``)+H+W"\```@````P&$$@`<(`WX@@`0`"`@``D!```(```"`"1`$``$(
+MD+P``"`````)$`#ZZ%>!!``@!(`'"`1^((````@(``(`0`"B*&"PO```(```
+M$NHO``#@80#ZYU>"#0`@`'R_8-2^`@``?)]@E,("`-"\```@``""(%`$``((
+M``(`0#]^`&`$?F"``(!""````%``!F%`\+P``"```(`!$`'^($`!^N!7A?K_
+M)P@``@@!?@!0"``"$`0``@@0O0``(``!?@!`/WX`8`0``A``'`=@`'[H+P``
+M`%```P`@`!P'8#"]```@``!\Z"\>_A]@`)XG8``$05"`8QDH`'K@5P(+`"``
+M?#]@4+T``"``I+8"``"!``@`>N!7@@$`(%#^'V"8_C]@`%\@*`!\/V!PO0``
+M(`"DM@(``($`"/]_`$``@0`0](&M"0#ZYE>!!``@````4)"]```@``B`!A`,
+M@`80^($-"`*`AA"``0`@4/X?8*W^/V"`5B`HL+T``"```)H&8!``K@D4`,X)
+M&`#N"1P`#@H@`"X*)`!."B@`;@K0O0``(``$@.T+((`/.$`0;@L$/@X0`#8.
+M$``X;F,D?HY3$!H.$/"]```@`!0<#A`8'@X0'"`.$"`B#A``@B!0`@*`$`@"
+M`!`0`@`0$+X``"``%/X_8``"@!#V_C]`!`*`$!1^`$(``*!A`'P_8M2^`@`P
+MO@``(```HNAA`'S?893"`@``6.@O"``G"#_ZX%<%`P`@@%CH+U"^```@`"S^
+M'V`$_C]@``1!4`!`&2@`#@`@```G"`3^H(``@(<(<+X``"````I"0`R`*`@`
+M_&!H[`$```0`(0@`AB!X`*`@>`P"`1"0O@``(``((`$0``JB0`"&`A```"<(
+M`_Y`@`2`)P@`A$!``!H!$+"^```@``@`)P@!_B!`"`('$```)P@!_B!`/_X@
+M8``"!Q"`2.@OT+X``"``````4`!ZX%>"!@`@`'P_8*2V`@``@0`(`7X`0`"!
+M`!#PO@``(```?#]@E+X"``R```@`?$!H``(```2```@`!``4@`$`(!"_```@
+M`%#^'V!]_C]@`"D@*!``K@D4`,X)&`#N"1P`#@H@`"X*,+\``"``!(#M"R"`
+M#S@D$&X+!#X.$``V#A``.&YC$'Z.4P!\'V!0OP``(`"DM@(```$`"`1ZX%>&
+M```@@`$`*`2`[0L@@`\X$!!N"W"_```@``0^#A``-@X0`#AN8Q1^CE,0&@X0
+M`'Q_8*2V`@``@2$(D+\``"``$((?4`R!00@`!"!0`?X?8`'^7V``>?XO`'K@
+M5X$0`""POP``(```>N!7@0\`(`!\?V"DM@(`#(%!"`"!(0@`A>!7!0@`(-"_
+M```@``P`H`D`@B!0#`(`$`B!(0@`^N!7`0$`(`R``!"````@\+\``"``!($!
+M$`!\?V"DM@(`"($!$`R!00@!?@%`#($!$`":!F`0P```(```>N!7@0,`(`P`
+MH`D`@B!0#`(`$("V_R\`F@9@`'K@5S#````@`(+O_R<`?']@I+8"``"!(0@!
+M_@!`#(%!"``!X5>.!0`@4,```"````<`*`!ZX%<!!``@@*__+P!\?V"DM@(`
+M`($A"`'^`$!PP```(``,@4$(``'A5XWZ_R<0`*X)!(#M"R"`#S@4$&X+!#X.
+M$)#````@```V#A``.&YC$'Z.4P'^'V`!_C]@`?Y?8(!8_B\`>N!7L,```"``
+M`@D`(`!\7V"DM@(`!`$A"`#ZX%>!!@`@`((`8`P`(`C0P```(``$`P$0`(9A
+M4`P&`!``^N!7@@``(`@'`1``?%]@I+8"`/#````@``P!(0C__R!`#`,!$`2`
+M[0L@@`\X$!!N"P0^#A``-@X0$,$``"```#AN8QA^CE,0&@X0%!P.$```P&$`
+M>N=7`0$`(````%`PP0``(````$<0`'Q?8,S@`@``"`$(`'K@5X(7`""`2O\O
+M``"@85#!```@``#ZYE<!.P`@%/XF0`!\'V#0X`(```(`$!2$!@@)>N!7<,$`
+M`"```0,`(`!ZYU<!`0`@`?X?8```1Q``F@9@`#4`(!J(!@B0P0``(``)?@!`
+M`!!@&!R$!@@,?@!@`'K@5X($`"`<A`8(_'X`8+#!```@```.`!B`>N!7`0$`
+M(%!ZX%<"`0`@"/X!0``08!@`?#]@T,$``"``R.`"``":`!``F@9@`'Q?8,3@
+M`@````$0`H@F"`"#X5?PP0``(``,`@`@`((!4`!\7V#,X`(```"!$`!\7V#,
+MX`(```@!"!#"```@``!ZX%<!#``@@##_+P``H&$`^N97`2$`(`!\/V#(X`(`
+M,,(``"```(``"`P:`!``F@`0`'Q?8,S@`@``"`$(`H@F"``#X%=0P@``(``,
+M`P`@``(`4```@1``$``8`'K@5P+V_R>``0`@`H"&$'#"```@`````%```($0
+M`,+_+P``H&$`^N97`00`(`!\7V#$X`(`D,(``"`````A"`R"!A``&@$0@`4/
+M*$B`!A```@`@6/X?8`!\/V"PP@``(`"V`@``@+4?*`!\?V"TX`(``(`!"`!Z
+MX%<`?%]@Q.`"`-#"```@````(0B!`@`@`'P?8+C@`@`````("`(`$``"`"``
+M@@$0\,(``"```'P?8)RY`@``V0HH`'Q?8,3@`@```"$(`'P?8+C@`@`0PP``
+M(````@`0````4````1"`@_\O`'KG5P$!`"`!_A]@``!'$###```@`````%`0
+M`*X)%`#."02`[0L@@`\X&!!N"P0^#A``-@X04,,``"```#AN8Q!^CE,`?#]@
+M\=L"``"$(`@`^N!7@1``(`!\7V!PPP``(`!0LP(`R`4A"`#ZX%<!#@`@T`EA
+M"`0((`@`@^%7`@4`()##```@`,X)80@"""`(`(/A5P(#`"#,"2$(``@`"`"!
+MX%<"`0`@L,,``"```?X?8(```"````!0`'K@5X$%`"``I^<O`'P_8/';`@#0
+MPP``(```A"`(`/K@5P$"`"`"_E]@`'P_8/#;`@``A$`4@*3G+_##```@``2`
+M[0L@@`\X$!!N"P0^#A``-@X0`#AN8R1^CE,0&@X0$,0``"``%!P.$!@>#A`<
+M(`X0("(.$```H&$`@L!A$(#F"0!ZYU<PQ```(``!!``@`'P_8L2Z`@`8@0@(
+M`'K@5X$!`"#R_A]@1X!'$%#$```@`(`Y`"`UA`<(`GX`8`!ZX%<"`@`@BOX?
+M8`!\/V`N!0``<,0``"```'X?*%"$!P@`>N!7`@$`(`":!F``C_4O7(0'"/Q^
+M`&"0Q```(`"`>N!7`'P_8L2Z`@`"`0`@2(D("(```"!*B0@(`'P_8K#$```@
+M`,2Z`@!&@8@05H"'$$Z)"`A$@(<0-H0'"%6`1Q``@B!0T,0``"``28)'$(3^
+M'V!'@$<0`?X?8(`&^R\`@^<O````8A"!"`CPQ```(```>N!7`@$`(!";"!``
+M#@`@`'KG5P$,`"`(@`80$)L($!#%```@`%R$!PC\?@!@@'K@5X(*`"``F@9@
+M`)HF8@@```@0`"`(,,4``"``7(0@"/S^(&!0^N!7@@(`(`@`(`@(@@@0@";^
+M+P"B"&!0Q0``(`"````@```@8@@`(`@`^N!7@OC_)X`!`"`4@0@("!H`$'#%
+M```@`!2;"!``>N=7@0$`(`!\/V+$N@(`&)L($`""(%``?!]@D,4``"``[>`"
+M```"0!``?#]BQ+H"``B)"`@">N!7B@``(`#%\B^PQ0``(```(`A@@&OG+P!Z
+MYU>!"0`@`'P_8L2Z`@`<_ZA!`)H&8-#%```@`&3^/V``5`HH`'K@5X("`"!'
+MA`<(`GK@5P'^'V`"``!0\,4``"````8`(`/^'V``'?,O`)H&8/__/V``3@HH
+M@`(`($>$!P@0Q@``(`"`>N!7`@$`(`'^'V"````@````4!``K@D4`,X)&`#N
+M"3#&```@`!P`#@H@`"X*!(#M"R"`#S@D$&X+!#X.$``V#A``.&YC4,8``"``
+M('Z.4Q`:#A`4'`X0&!X.$!P@#A````!B`(+@80!\'V!PQ@``(`#HV`(`````
+M"`!ZX%>!`0`@&`0`"`!ZX%<"`0`@`?X?8)#&```@`(`Q`"``?!]@\]L"```$
+M``@4>N!7`0$`(`%ZX%>"`P`@L,8``"```_X?8`'^/V``!$%0`);]+P``H&$`
+M^N97`@$`(````%#0Q@``(`"`*0`@`(@&"``:P$$0G`807'Y'0`""(%`4`H<0
+M%@*'$/#&```@`$`"1Q`!_G]@0P9'$#8>1Q``?!]@!MP"```$``A(`$<0$,<`
+M`"``3@*'$`+^'V`U`$<02@)'$%`"1Q!1`D<04@9'$%,"1Q`PQP``(`!4`D<0
+M&/X?8'H`AQ`<`H<02/X?8%P`1Q``>NA7@0$`(%#'```@`!#^'V!=`$<0@```
+M(%T"1Q`!!`$(`7X`:`$`01``?!]@<,<``"``Z-@"``````@`""`(!`*!$`((
+M(`@&`H$0!`@@"`@"@1"0QP``(```""`($`*!$`(((`@2`H$0!`@`"!0`@1``
+M?#]@G+@"`+#'```@``"(``@*`($0`H@`"`P`@1`$B``(#@"!$`":!F`!_C]@
+MT,<``"```(7_+P!ZX%<!!``@`)H&8(#3_2\`?#]@.*T"``"```CPQP``(``!
+M?@!``(``$`#2_R='!`<("7K@5P":!F""`0`@`,[]+Q#(```@``+^'V```0`@
+M@,S]+X#5_R<0`*X)%`#."1@`[@D<``X*,,@``"``!(#M"R"`#S@@$&X+!#X.
+M$``V#A``.&YC('Z.4Q`:#A!0R```(``4'`X0&!X.$!P@#A```.!A`(+`80`$
+MH6$`A@%B`OXG@'#(```@``#\`$!4PP(`"!T`$``;`!``G@=@`"`H8``_ZR\`
+M>NA7D,@``"``@0``(``<IV$"_B>``/P`0$2Y`@`(&P`0$`"N"10`S@FPR```
+M(``8`.X)'``."@2`[0L@@`\X(!!N"P!\'V!`WP(```0`"-#(```@``!ZX%<!
+M`@`@`'P?8$3?`@```"`(@`$`(`!\'V#$P@(`\,@``"`````@"`!\'V#TW@(`
+M``(`$`!\'V#TW@(````@"`!\'V`0R0``(``0KP(```(`$`!\'V!(WP(```0`
+M"`!ZX%<!`@`@`'P?8##)```@`$S?`@```"`(@`$`(`!\'V#DK`(````@"`!\
+M'V#TVP(`4,D``"````(`$`!\'V#TVP(`````"`!\/V`4KP(``(``$`"&85!P
+MR0``(```!$%0`80_@`"`(&``^N!7`0,`(`%^@4``_"%`^-X"`)#)```@``"(
+M0!`!_B%``(Y@&`%^04`.>N%7A?G_)P```%``_"%`L,D``"``^-X"``"`0!``
+M@`\X!#X.$``V#A``.&YC&'Z.4Q`:#A#0R0``(``4'`X0``"@80!\WV%$N0(`
+M``$'"`"!YE<!!@`@`'P?8/#)```@`.#*`@``"``(```@0`"`($`"_B"``OX&
+M@``"`$``'`!`$,H``"``'`$`"``"`#@`&P<0$`"N"10`S@D$@.T+((`/.!@0
+M;@LPR@``(``$/@X0`#8.$``X;F,0?HY3`'P?8'"Q`@``[PDH!(#M"U#*```@
+M`""`#S@0$&X+!#X.$``V#A``.&YC&'Z.4Q`:#A`4'`X0<,H``"````#`80""
+MH&$`.@0H`/KF5X$"`"````!0`"#Z+P!\/V"0R@``(`#<P@(``(``$`!ZYU>!
+M)P`@`'P?8+S>`@``!``(`'K@5[#*```@``$)`"``?!]@O=X"```$``@`>N!7
+M@@8`(`!\'V!/X`(`T,H``"````0`"`!ZX%<"!``@`'P?8)2U`@`````(_WO@
+M5P!\'V#PR@``(`#XW@(`@B$`((`I`"`!_C]@`'P?8$_@`@```D`0``1!4!#+
+M```@``!\GV"<X0(```!B"`"$`0@`?"%`ZN$"``"`0!`!_B%`,,L``"````("
+M$`!ZX%<""P`@`'KA5X('`"``'00H`)JF40!\'V!0RP``(`#8VP(``!I`$`!\
+M'V!/X`(``!I`$`'^'V``!/HO(/X?8'#+```@`(`/[R\`I?TO`)H&8``A`"``
+MFJ91`'P?8$_@`@``&D`0D,L``"````(`(`%^`4``#D`8"'KA5XOM_R<(>N%7
+M`@(`(`":IE&PRP``(```?"%`ZN$"``":0!``?!]@E+4"``````C_>^!7`'P?
+M8-#+```@`.KA`@`"$``@@`H`(`":IE$`?!]@3^`"```:0!``?!]@\,L``"``
+MO-X"```$``@`>N!7@0(`(`#;_R>`<0XH`'P?8+B]`@`0S```(`"`!@`@`'P?
+M8)2U`@`````(_WO@5P!\'V#XW@(``@4`(##,```@``!\/V!0X`(``(!`"&[^
+M/V``AF%0``0`(`7^/V`4_E]@4,P``"```OY_8``"`"``9PXH`'P?8+B]`@``
+M^?\G`?Z?8(!S]B]PS```(```?#]@I*X"``"```@!?@!``(``$`'^'V`0`*X)
+M%`#."9#,```@``2`[0L@@`\X&!!N"P0^#A``-@X0`#AN8Q1^CE,0&@X0L,P`
+M`"```'R_8?BN`@``B`8(@$T3*`!\/V#\K@(``("`$`"(!@C0S```(```8!,H
+M`'P_8*K>`@``@(`0`(@&"`!\/V#ZK@(``(@@"/#,```@`("X[B\`?#]@++`"
+M``+^'V``'O<O`'P?8(;>`@"`D_<O$,T``"```';_+P```%``?#]@Z,P"``"`
+M@!``?!]@K-X"``````@PS0``(```>N!7`@$`("#^'V``@(`0`'P?8+#>`@``
+M```("'X`8%#-```@``!ZX%>!`@`@`'P_8.C,`@``B``($'X`:`"`@!``?#]@
+M<,T``"``X),$``!\'V!0M@(`!`,`$`!\/V#HS`(``(@`"`)^`&B0S0``(```
+M@(`0`(<!*`!\'V"\W0(`@''W+P!\'V!@VP(`@.'V+[#-```@``!\'V!TL`(`
+M````"`!ZX%<!`0`@````4(```"`!_A]@T,T``"``@&?W+P!\'V#@KP(``,#V
+M+P!\'V#4K@(`````"(`;]R_PS0``(```?!]@L-X"``````@(?@!@`'K@5X("
+M`"``?!]@!*\"`!#.```@``````@!>N!7@@T`(`/^OV&`6^8O`'P_8+3>`@``
+MA"`(,,X``"```/K@5X("`"``?%]@0+@"```$(0@!_B!```)!$(!8YB]0S@``
+M(```C@88`((@4(!\]R\`^N97__^F00+W_R>`<!LH`'P_8'#.```@`."O`@`$
+MA"`(`(`@:`!\'V"XW@(```(`$("^%B@`?!]@D,X``"``X*P"``````@$?@!@
+M`'K@5P(%`"``?#]@-+L"``!\'V"PS@``(``\NP(```(`$`!\/V`XNP(``'P?
+M8$"[`@```@`0`?X?8-#.```@``!\/V"TW@(``(!`$!``K@D$@.T+((`/.!00
+M;@L$/@X0\,X``"```#8.$``X;F,8?HY3$!H.$!0<#A"`>`TH``#`80!\/V`0
+MSP``(`"4K@(``(!`"``$H6$`^N97`1<`(`2`!@@`>N!7@14`(##/```@`&2`
+M!@@``>=7#@$`(```!U"````@`!P`4`!\/V!0M@(`4,\``"``!($@"`7^((``
+M`^!7#@P`(`!\/V"4K@(``(``"`"!YE=PSP``(```@`8(`@$`(`"``!"````@
+M```!$`!\/V!0M@(``($`")#/```@``"`!A``FP`0````4`2`!A``?#]@.*\"
+M``"```C_?P!`L,\``"```(``$`":!F`"_C]@`"7N+P":1F``@*8)`/KF5X$!
+M`"#0SP``(``$@`8(`'K@5X+J_R<0`*X)%`#."02`[0L@@`\X&!!N"_#/```@
+M``0^#A``-@X0`#AN8QA^CE,0&@X0%!P.$```H&&2B,8)$-```"``E(@F"`!Z
+MYU<!!``@`((`0``"`$`#?@"```(`0`)^`(`PT```(```'"=@`(#G+X```"``
+M``!0EH"&$``<!V`0`*X)%`#."5#0```@``2`[0L@@`\X&!!N"P0^#A``-@X0
+M`#AN8QQ^CE,0&@X0<-```"``%!P.$!@>#A```*!ABHC&"8`/YB\`'"=``((F
+M0':(X`F0T```(`"`B,`)@`_F+XR(!@@`'@!``!#@&8Z(!@@`'`!``!#`&;#0
+M```@``#ZYU<!!``@`!P'0``<`$`#?@"``!P`0`)^`(``GB=@T-```"``@&SG
+M+X```"````!0D("&$`">!V`0`*X)%`#."1@`[@GPT```(``$@.T+((`/.!P0
+M;@L`AF%0`'P?8+S>`@``!D`0`?X_8!#1```@``!\'V"]W@(```)`$`!\'V#`
+MW@(``@9`$`,&0!`$!D`0,-$``"```'P?8+7=`@``!D`0`'P?8+3=`@``!D`0
+M`((@4`""0$!0T0``(````D%``(9A4`!\`4#`W@(`!09`$`8&0!`'!D`0`?X`
+M0'#1```@```.(!@'^N!7"_K_)P"`#S@$/@X0`#8.$``X;F,4?HY3D-$``"``
+M$!H.$`!\OV&4K@(``(`&"`!ZX%>!"@`@`'Q?8#BO`@"PT0``(````"$(__\@
+M0``"`1```"`(`'R_892N`@``@@80`((@4-#1```@``0"`!``?%]@4+8"```!
+M(0@``@`0``$!$`+^/V``W^TO\-$``"```(`&"`!ZX%>"]?\G$`"N"02`[0L@
+M@`\X%!!N"P0^#A`0T@``(```-@X0`#AN8Q1^CE,0&@X0``"@80"&85!TAH80
+MEH:&$##2```@`)*&AA"4AH80D(:&$`#8Y2\`@B!0`()`0`"&85``A$9`4-(`
+M`"``@`:!$'8&@1`!_B!`!?K@5PO\_R>`U>4O$`"N"02`[0MPT@``(``@@`\X
+M%!!N"P0^#A``-@X0`#AN8R!^CE,0&@X0%!P.$)#2```@`!@>#A`<(`X0````
+M8@!\/V!0M@(``(&@"0#ZYE>!"``@L-(``"```(`&"`"!`!``?#]@.*\"``"`
+M``@`>N!7`@(`(``<QU'0T@``(```?#]@E*X"``"<`!``?#]@E*X"``"```@`
+M@`80`)H`$/#2```@```'`"``+QLH``"@80#ZYE<"`0`@````4``K`"``?#]@
+M$-,``"``.*\"``"```C_?P!``(``$`":!F`"_C]@@+?M+P!\/V`PTP``(``X
+MKP(``(``"`%^`$``@``0$`#H"0`<QU&DG(80````4%#3```@`**`AA"@@(80
+M`?X?8+"`AA"DB`8(````0".$)P@`@`9`<-,``"``I@*`$*2(!@@!?@!`I("&
+M$".$)PBBB`8(`(``0**`AA"0TP``(```$``8L(@F"(`3YR^@@(80`?X?8`2`
+M!A`CA"<(7H*&$+#3```@`""<1A`5G$80#IQ&$%B<AA!:G(807)R&$%:<1A``
+M@B!0T-,``"```!S'40""!D`T'$`0`?X@0"#ZX%<+_?\G:)R&$(J<AA#PTP``
+M(`!@G(80`)H&8``@*&``)0$H!(`&"/!^`&``>N!7`0(`(!#4```@``":!F"`
+MFP`H`!P'8(`(`"``?!]@N-L"```((`AHB`8(,-0``"```(``8``0P!D`'`=@
+M@'(2*&Z`AA``'`=@`%P2*&R`AA!0U```(`!J@(80`)H&8`'^/V``D>TO`)H&
+M8!``K@D4`,X)&`#N"7#4```@`!P`#@H$@.T+((`/."`0;@L`?#]@E*X"``"`
+M(`@`^N!7D-0``"``@0@`(``(8`@(B$`(`(7A5P(%`"`""&`("HA`"`"%X5>P
+MU```(``"`P`@!`A@"`R(0`@`A>%7`@$`(`""`&```@`@`(`@"-#4```@``#Z
+MX%>"]_\G````4`"`#S@$/@X0`#8.$``X;F,8?HY3\-0``"``$!H.$!0<#A``
+M',=1`'P?8)2N`@```*`)`/KF5P$$`"`0U0``(```F@9@`"_[+VJ(!@@`'`!@
+M`!#`&0"`I@D`^N97`OS_)S#5```@`!``K@D4`,X)!(#M"R"`#S@8$&X+````
+M4`"`#S@$/@X04-4``"```#8.$``X;F,0?HY3`(JB4`!\'V"4K@(```H`$`!\
+MGV!PU0``(``DS0(``'P?8%"V`@``"0`0`'P?8/38`@``"D`0`'P?8)#5```@
+M`#BO`@``"@`0`'P?8*C7`@``!``(`'K@5P""(%"!$P`@L-4``"```OX`@``"
+M`$````!```(`0`)^`(```@!``GX`@+1^0$#0U0``(```?)]@),T"```(04``
+M"&!```B`00`$!A``BJ)0%8I!$/#5```@`""*01`!_B!`"_K@5POV_R<"_@"`
+M``(`0````$```@!`$-8``"```GX`@``"`$`"?@"```B`0``*`A``@B!0!/Y`
+M@`"*HE`PU@``(```?`%`%-D"``@*`!`!_B!`%/K@5PO\_R<`#0`@`OX`@%#6
+M```@```"`$````!```(`0`)^`(```@!``GX`@+1^0$``?)]@<-8``"``),T"
+M```(04``"(!!``0&$`'^($`+^N!7"_C_)P+^`("0U@``(````@!`````0``"
+M`$`"?@"```(`0`)^`(``BJ)0``B`0+#6```@```*`A``?!]@J-<"```$``@`
+M>N!7@@``(`#`YR\$@.T+T-8``"``((`/.!`0;@L`>N!7`0(`(`0`(`@`_"!H
+M`!````0"`!#PU@``(`````!0`(`/.`0^#A``-@X0`#AN8QQ^CE,0&@X0%!P.
+M$!#7```@`!@>#A```*!A`(+@80#ZYE<!+0`@7H@F"`!\'V"PK@(`,-<``"``
+M``(`$`!\WV&,K@(````'"`":)F"`_@HH`OXG@`!\7V!0UP``(`"TK@(``(0`
+M``%^`$``A$!````!$`2`!@@"?@!H!(`&$'#7```@`&B(!@@`#B`8`'P?8/BN
+M`@``"``(``(`8``.`!@`?#]@D-<``"``N-L"``"((`@`CB`8`(``8``.`!A@
+MB"8(`(X@&`"``'BPUP``(```#@`8`'K@5X$"`""@B"8($OK@5PL!`"``[!$H
+M@```(-#7```@`&Z(!@AJ@(80:H@&"(!J!2AHB`8(@.@1*`!\/V#^K@(`\-<`
+M`"```("`$`":!F``0O\O%H@F"`!\'V#DK@(```(`$`Z$)@@0V```(```?!]@
+M[*X"```"`!`2B"8(`'P?8/2N`@```H`0`'S?83#8```@`(RN`@```"<(`/K@
+M5P$&`"`0_A]@`'7M+P`$05```"<(4-@``"``((1`$`2```C]?P!@`'P`8/_O
+M__\$@``08(2`$``!`"!PV```(``$_A]@`&_M+P!\WV&,K@(``!H'$`":!F"`
+MO`,H$`"N"9#8```@`!0`S@D8`.X)!(#M"R"`#S@<$&X+!#X.$``V#A``.&YC
+ML-@``"``$'Z.4P3^'V"`9NTO`?X?8``?_B\$@.T+((`/.!`0;@O0V```(``$
+M/@X0`#8.$``X;F,0?HY3"/X?8`!A[2\$@.T+((`/./#8```@`!`0;@L$/@X0
+M`#8.$``X;F,0?HY3`'Q_8)2N`@``@$$($-D``"````0A8`#ZX%<!%0`@``/@
+M5P(2`"``?']@.*\"``"``0@PV0``(`#_?P!``(`!$`!\?V"4K@(``(`!"`"!
+MX%<`@``(`@$`(%#9```@``"``1"````@```!$````%`$@``0`'Q?8%"V`@``
+M`0$(<-D``"```(``$``#`1``?!]@W-X"``````@`>N!7`0<`(`!\?V"0V0``
+M(``XKP(``(`!"`!ZX%>"!``@!OX?8`!\/V````(`@#D"*+#9```@```"`"``
+M@D!@`(`@"`#ZX%<"Z_\G!(#M"R"`#S@0$&X+T-D``"````1!4`!\'V!\W@(`
+M``0`$`!\/V#@KP(``80`"`!\?V#PV0``(`"$W@(``(!!$`"$``@!@$$0!80`
+M"`!\?V"`W@(``(!!$!#:```@``2$``@!@$$0`X0`"`*`01`"A``(`X!!$`!\
+M/V!@VP(`,-H``"```(0`$`2$@!``?!]@4+`"```$@6$`&$`0"'Z&B0$80!!0
+MV@``(``(?H:)`AA`$`A^AHD#&$`0`(:!800$0!`(?D&(!01`$'#:```@``!\
+M'V#LK@(`````"`:`0!``?!]@Y*X"``````@.@(`0D-H``"```'P?8!BO`@``
+M```($("`$`!\'V#HS`(```@`"`J`@!"PV@``(```?!]@^JX"```(``@'@$`0
+M`(`/.`0^#A``-@X0`#AN8]#:```@`!1^CE,0&@X0`((@4`!\'V!0M@(`'`-`
+M$`!\'V#LW@(`\-H``"````0`"`!ZX%>!`@`@`'P?8'S>`@`````(`'K@5X$"
+M`"`0VP``(```?!]@\-X"``````@`>N!7`18`(`!\'V#LW@(```0`"##;```@
+M``!ZX%<"`@`@`?X_8`!\'V!0M@(`'`-`$`!\/V#@KP(`4-L``"```(0`"`!\
+MOV%@VP(``(!&$`&$``@!@$80`H0`"`*`1A!PVP``(``#A$`(!(0`"``$0$`%
+MA``(``0`0`.`1A"`S!DH!("&$)#;```@``"$!@C^?P!@``X`&`)^`&@`@$80
+M`'P_8%"P`@``B`8(L-L``"```("`$`*(!@@"@(`0!(@&"`2`@!``F@9@`![U
+M+P'^'V#0VP``(`"````@````4!``K@D$@.T+((`/.!00;@L$/@X0`#8.$/#;
+M```@```X;F,4?HY3$!H.$```H&$`^N97`2(`(`!\'V#LO0(`$-P``"````0`
+M"`!ZX%=>B"8(`0$`(*""AA``'@`@H(@&"`"!X%<PW```(`")`@`@`('@5XH;
+M`"```@!0%'K@5PH:`""PB"8(!?K@5U#<```@`(H+`"!>B"8(HH@&"``"`$"B
+M@(80I(@&"````$!>B"8(<-P``"```(`&0*8"@!"DB`8(`7X`0``0`!@%_C]@
+M@/7E+Z2"AA"0W```(`"PB"8(`?X`0``0(!BP@(80HH@&"`#RY2^@@(80``T`
+M(+#<```@`*2(!@@```!``(`&0*8((`BBB`8(``(`4**`AA``$``8T-P``"``
+M7H@F"``"`$"B@(80`!``&`7^/V``ZN4OH("&$*2(!@CPW```(`````!`7H@F
+M"`"`!D"F`H`0I(@&"`%^`$``$``8!?X_8!#=```@`(#DY2^D@H80$`"N"02`
+M[0L@@`\X%!!N"P0^#A``-@X0,-T``"```#AN8R1^CE,0&@X0%!P.$!@>#A``
+M`*!A`(+`81``YPE0W0``(``.B`<("("&$!"(!P@*@(80$H@'"`R`AA``K`LH
+M9(`&$'#=```@`".$!PA>@(80/(`'"`$$``@0?@!@`'K@5P2`!@B!`0`@D-T`
+M`"```'P`:``(`````0`@`'P`8/_W__\$@`80#`#'"0`()PBPW0``(```G&!`
+M"(0!"`F$@0D(?H:!`!@`:!:`AA`*A`$("X2!"=#=```@``A^AH$`&`!H$H"&
+M$`"N`"@`>N!7@@$`(`2`!@@0?@!H\-T``"``!(`&$`S^`4#\@0T0#(0!"`!Z
+MX%>"#@`@#81!"`!ZX5<0W@``(``!#0`@`'P?8*G>`@``!``(``'A5X(*`"``
+M@B!0`(7@5S#>```@`(H*`"#\@0T(``*@0`*$0@@`?!]@++`"``("`````>%7
+M4-X``"``@0$`(`2`!@@@?@!H!(`&$`'^`$``$"`8_($-"`$$0`APW@``(```
+MA>!7B_?_)X`!`"`$@`8(('X`:`2`!A#\@0T(`01`")#>```@``)^(4``@`!`
+M_($-$``$(`@!^N!7@B(`(`"&85``!$%0L-X``"```((@4`$$@`@`B>!7"A4`
+M(``(@E#\@0T(``*@0`*$`@C0W@``(`!_?L!@`'P"0#C!`@``!0`(``'C5X(%
+M`"`!B!^``!#`&/#>```@```&`V@`$&`8`H0""(!^`&``>N!7@0,`(``$`V@`
+M$$`8$-\``"````(`(`%^`D``$(`8!'KB5POT_R<$>N)7BP0`(/R!#0@PWP``
+M(````J!``H0""(!^`&``>N!7@0$`(`2`!@@(?@!H!(`&$%#?```@``'^`$``
+M$"`8_($-"`$$@`@`B>!7"^O_)P^$1A``?!]@<-\``"``^*X"```(``@`!`!@
+M``'A5X$!`"`$@`8("'X`:`2`!A"0WP``(```?!]@^*X"```(``@`!@!@:("&
+M$/R!#0@!!(`(`GXB0+#?```@``"``$#\@0T0@`$`(`2`!@@(?@!H!(`&$/R!
+M#0@`!"`(T-\``"```OK@5P("`"`!!"`(`OX@0`"``$#\@0T0_($-"``$(`CP
+MWP``(``#^N!7@@$`(`($``@.@$80``(`(`2`!@@`?`!H_,`?`!#@```@``2`
+M!A``""<(`@@'"``"`$``',!!_($-"``!YU>.'0`@,.```"``@!0`(`($(`CZ
+M@TT0`P0`"/N!31#ZB2T(&(*&$``6`"!0X```(`"`VN4O`'K@5X$"`""`$_XO
+M!(`&"$!^`&@$@`80`!(`('#@```@``'^/V``?!]@O-X"```"0!``@B!0`'P?
+M8+W>`@```D`0D.```"``@`T`(`4$(`CZ@TT0!@0@"/N#31#ZB2T(6(*&$`<$
+M(`BPX```(``(!(`)"'Z&@0"8(&A<@H80"00@"`H$@`D(?H:!`)@@:-#@```@
+M`%J"AA``!0`@_($-"``$(`@'^N!7`>W_)XD!`"`&^N!7\.```"```>C_)P`!
+M`""M^N!7@?+_)_R!#0@!!"`(`OX@0`"``$`0X0``(`#\@0T0``'G5XWW_R<`
+MF@9@`(OK+P!ZX%>!`P`@7H@F"##A```@``!\7V"^W@(```@!"`"!X%>,```@
+M``*!$!``K@D4`,X)4.$``"``&`#N"02`[0L@@`\X)!!N"PA^CE,)!"`(!@).
+M$`@$(`APX0``(``'`DX0#00@"``"3A`,!"`(`0).$`L$(`@"`DX0"@0@")#A
+M```@``,"3A`&"$X(`'P_8(3>`@``B"`(``/A5PD$`"```^%7L.$``"``@@@`
+M(```3@@`?#]@@-X"``"`(`@``^%7C@4`(`!\/V#0X0``(`!\W@(``(``$`8(
+M3@@`?#]@A-X"``"$@!```$X(`'P_8/#A```@`(#>`@``A``0"'Z.0P"`#S@$
+M/@X0`#8.$``X;F,D?HY3$.(``"``$!H.$!0<#A`8'@X0``"@80""P&$`^N97
+M@2$`(`!ZYU<PX@``(`"!(``@$`#G"0`2"RAD@`80(X0'"%Z`AA``F@9@`#/_
+M+U#B```@`#R`!P@!!``($'X`8`!ZX%<$@"8(`/P`8``(``"!`@`@<.(``"``
+M`'K@5X(%`"``_`!H``@````"`"``>N!7`0,`(`#\`&"0X@``(`#_]___!(`&
+M$`":!F`#_C]@@,CK+PP`1P@`"&$(`(0!0+#B```@``Q^`$#\@0T0`@@A"`"&
+M($``A$!```'A5XX-`"#\@0T(T.(``"````0@"*WZX%<""``@!00@"/J#31`&
+M!"`(^X--$/J)+0CPX@``(`!8@H80!P0@"`@$@`D(?H:!`)@@:%R"AA`)!"`(
+M"@2`"1#C```@``A^AH$`F"!H6H*&$/R!#0@!!"`(`OX@0`"``$#\@0T0,.,`
+M`"````'A5XWR_R<0`*X)%`#."1@`[@D$@.T+((`/."00;@M0XP``(```?#]@
+MZ,P"``"(0`@!?B%@`/K@5X$)`"`!?B!@`/K@5W#C```@``$*`"``?#]@J-X"
+M``"$(`@`^N!7$'X@8`("`"`0?@%@D.,``"```('@5X$&`"``!0`@`/K@5P$%
+M`"`0?@%@`'K@5X(#`""PXP``(````@`@$GX@8!)^`6``@>!7`0$`(````%"`
+M```@`?X?8-#C```@``"`#S@$/@X0`#8.$``X;F,P?HY3$!H.$!0<#A`8'@X0
+M\.,``"``'"`.$"`B#A```*!A`!S'40!\_V&TN`(`!<4'"`!ZX%<0Y```(`""
+M-``@_/\M0`!\'V"4O@(`%```"`!```@"?@!@`'K@5S#D```@``'^'V`"``!0
+M`(``$%3%!P@`>N!7`@P`(`"6""@`?#]@4.0``"``C-@"`#2``!``?#]@```A
+M``C$``A`?@!@`'K@5X$$`"!PY```(`!`_A]@"(!`%`S$``B_?P!@#(!`%`'^
+M'V``?/]AM+@"`)#D```@`%2!1Q0`?/]AM+@"`%3%!P@`>N!7`?3_)P```%``
+M?/]AL.0``"``M+@"`%2!1Q0`?!]@I+4"``````@#>N!7#08`(`!\'V#0Y```
+M(`#8L`(`````"```(`@`?!]@U+`"``````@````(`(``4/#D```@``%ZX%>-
+M```@@,4$*`!\/V```"$``,0`"`'^'V``?/]A$.4``"``M+@"``6!1Q2`_@9H
+M`(!`%/3_#4``@B!0"/Y?8(#+Y"\PY0``(``(^N97`@$`(`K^'V"````@#?X?
+M8/2!31#__A]@]8%-$%#E```@`(!UXR\``*!A`'S_8;2X`@``@2<(`_X`@/2!
+M+0@`?#]B<.4``"``M+8"```B`$(``P@0^(D-"`0!B!"`;@@H!@&($`"!)PB0
+MY0``(``#_@"``"(`0@`%"`B`?@!H``%($`'^`$`_?@!@`($'$+#E```@``":
+M!F"`:^,O`!P'8!``K@D4`,X)&`#N"1P`#@H@`"X*T.4``"``!(#M"R"`#S@P
+M$&X+!#X.$``V#A``.&YC&'Z.4Q`:#A#PY0``(``4'`X0``"@80`<QU$!A`8(
+M!GK@5PL>`"`"A`8(`'S?8!#F```@`,#>`@`"`$,0`X0&"`,`0Q`$A`8(!`!#
+M$`&$!@@!`$,0,.8``"```80&"`9^`%`#_C]@`+_D+P%^0$``#@$8`'P_8+3=
+M`@!0Y@``(```A$`0``B"4``(HF``@>)7BA(`(``((D``B"!``()F0'#F```@
+M``6$00@`>N%7C`P`(`6$00@.>N%7"0L`(`6$00@&A"$(D.8``"```?X@4`"$
+M($`.^N!7"0@`(`6$00@`BB)``(H@0`#\P$"PY@``(`#`W@(`!01#$`:$(0@&
+M`D,0!X8A"`<"0Q`!_B)``(Z@&-#F```@``%^(D``CH`8`?[?80`"`"#_?P!`
+M``X`&`%^(D``CH`8\.8``"```('B5XOM_R<`>N=7`0,`(`"L`R@`>N!7@0$`
+M(`"2`R@0YP``(`````!0@```(`'^'V`0`*X)%`#."02`[0L@@`\X&!!N"S#G
+M```@``0^#A``-@X0`#AN8RA^CE,0&@X0%!P.$!@>#A`<(`X04.<``"``("(.
+M$"0D#A```"!B`)JF40#ZZ%<!%@`@`"1)4@`@"%)PYP``(``"?BB``'P?8,S"
+M`@``@"```/K@5P$/`"``B``(``(`0)#G```@``Q^P$$`GN=1`!P'8`"B*&`&
+M_E]@@*CD+P!ZX%>"!P`@L.<``"``)@1'"`!\'V`LL`(`!GXG0(`WXR\F!$<(
+M`'P?8*G>`@#0YP``(```!$`0``1A8`!\'V!(KP(`-`:`$`'^7V*``@`@0'['
+M0?#G```@``'^!T``#N`9!_KG5POS_R<!?@A```X`&@)ZZ%<+[/\G$.@``"``
+M`'KI5X%G`"``(`A2`GXH@`!\'V#,P@(``(`@``#ZX%<PZ```(`"!7@`@`(@`
+M"``"`$`,?L!!`)[G42<$)PA`_@!@`'K@5U#H```@``)8`"`@_@!@`'K@5X)6
+M`"``'`=@`(/]+P!ZX%>"5``@<.@``"``)@1'"`!\'V"IW@(```1@"``'X5>"
+M40`@!GX'0`!\/V"0Z```(``LL`(``(9!8`"*Y"\`>N!7`DX`(`!\/V!0M@(`
+M`(&@";#H```@``#ZYE>!2P`@`(`&"`"!`!``?#]@E*X"``"```@`@`80T.@`
+M`"```)H`$`!\/V`XKP(``(``"`%^`$``@``0`?X?8`2`!A#PZ```(```"`<(
+M"("&$`((!P@*@(80!`@'"`R`AA`G!"<(!(`&"!#I```@```"`&@$@`80-`@'
+M"!:`AA`L"`<($H"&$(!$_R\`>N!7,.D``"``@@$`(`2`!@@0?@!H!(`&$"8$
+M1P@`>N%7@00`(%:$1A!0Z0``(``F!$<(-/X&0`9^)T``!.,O!(`&"`!\`&@`
+M`0````$`('#I```@``2`!@@@?@!H!(`&$#D$)P@`?!]@^*X"```(0`@``@%@
+MD.D``"```('@5P$"`"`$@`8("'X`:`2`!A"``@`@.`0'"``$`&"PZ0``(`!H
+M@(80.00G"`^"1A`$@`8(\'X`8`!ZX%>!`0`@`)H&8-#I```@``#D_2^`)P`@
+M`'P?8+C;`@``""`(:(@&"`"``&``$"`:\.D``"```*((8("[#RAN@(80`*((
+M8`"E#RAL@(80:H"&$`!\'V`0Z@``(`",K@(`````"`"!YE<"!@`@(`0`"`!Z
+MX%>!!``@#H0F"##J```@`#L$!P@`@>!7@0,`(`'^'V``?#]@4+8"`"6!0!``
+M`0`@4.H``"``.P0'"`Z`1A`V"`<(&("&$"X(!PA8@(80,`@'"%R`AA!PZ@``
+M(``R"`<(6H"&$#H$)PA>@H80````4*2`AA````!0HH"&$)#J```@`*"`AA`!
+M_A]@L("&$*2(!@@```!`.@0G"`"`!D"F`H`0L.H``"``I(@&"`%^`$"D@(80
+M.@0G"**(!@@``@!`HH"&$``0`!C0Z@``(`"PB"8(`"SD+Z"`AA``F@9@`%/J
+M+P!ZX%>!`P`@7H@F"/#J```@``!\7V"^W@(```@!"`"!X%>,```@``*!$`":
+M!F`!_C]@$.L``"``@+KJ+P'^!T``#N`90'['00?ZYU>+H_\G`7X(0``.`!HP
+MZP``(``">NA7BYS_)P!\/V`XKP(``(``"`!ZX%<!`0`@`)H&8%#K```@`(``
+M`"````!0$`"N"10`S@D8`.X)'``."B``+@HD`$X*<.L``"``!(#M"R"`#S@H
+M$&X+!#X.$``V#A``.&YC''Z.4Q`:#A"0ZP``(``4'`X0&!X.$```X&$`@L!A
+M`'R_8=2R`@`D@28((/K@5[#K```@`(L!`"!R_A]@J/X_0("4&BB`I^(O`'R_
+M8=2R`@`@@48(T.L``"```WYA@`#\(4#DP0(`!)\`$`"=`!`D@28(`?X@0"2#
+M!A#PZP``(``!?D%`!'Z!D1M^AHD`!"9`'_X@8`"8(%`@@P80@*#B+Q#L```@
+M`"C_!D"`M04H$`"N"10`S@D8`.X)!(#M"R"`#S@<$&X+,.P``"```'P?8(R_
+M`@```2`(`'P?8,#;`@```@`0`(`/.`!\'V!0[```(`#`VP(````@"`!\'V",
+MOP(```,`$`"`#S@$/@X0`#8.$'#L```@```X;F,<?HY3$!H.$!0<#A`8'@X0
+M`'P_8.RL`@``@``(D.P``"```7K@5X']_R<"_A]@`(``$`"+!RA]_C^8`(SC
+M+P!\/V"P[```(`#DS`(``(`@"`"`($``?']@[,P"``R``0@`@>!7#@$`(-#L
+M```@`````%`,@`$0`'Q_8.S,`@`0A`$(`'K@5X$2`""`@0<H\.P``"``??X_
+MF(""XR\`?#]@Y,P"``"`(`@``N!!`?[?80":IE$0[0``(```F@9``!H`0`)^
+M`(``?']@[,P"```&0$`:!"$(`/K@5S#M```@``$%`"`<`"$(`(/G5PX#`"`4
+M_B%``(``0`""(%`,_E]@4.T``"```,?C+X```"``',=1`?ZF00/ZYE<+]?\G
+M`'KG5P$"`"!P[0``(`````!0`'Q_8.S,`@`0@$$0````4`!\/V#LK`(``(``
+M$)#M```@`!``K@D4`,X)&`#N"02`[0L@@`\X'!!N"P0^#A``-@X0L.T``"``
+M`#AN8S!^CE,0&@X0%!P.$!@>#A`<(`X0````4/2!#1#0[0``(`#X@0T0@&0'
+M*`!\/V",V`(`)(``$/#_34``?-]AD*@"`/#M```@`!``!P@``&`(!``'"```
+M(`@,``<(`('@5P4!`"``@`!0$.X``"``@```(`"``5````$0`'S_863,`@`$
+M@`<(`7X`0!2`QPDP[@``(```'"=@@%KC+P"`!P@`@>!7#@$`(``"QU&````@
+M``+`45#N```@``!ZYU<"`0`@`.,/*(```""`"1`H\(&M"0`;YU>&```@<.X`
+M`"```!RG80!\_V%DS`(`%(#'"02`!P@```=0`('F5XX``""0[@``(````*!A
+M`/KF5P(!`"````!0`!P`(`+^'V#\@4T0_9M-$+#N```@`/3_34``?-]AD*@"
+M`!0`!P@````(#``G"`3^((``@`!`T.X``"`````!$`!\_V%DS`(`!(`'"`1^
+M((`0@`<(``)`0/2!+0CP[@``(``$_F:`_(&M"/B!S0@"_A]@`?Z?8``!"R@`
+M`"!@`/K@5Q#O```@``$"`"!#_A]@``1!4``H$R@`#``@`'Q?8)2^`@`L``$(
+M,.\``"```'P@:``"```D``$(``(`%`2`!P@`&@!`%(`G"(`WXR]0[P``(``$
+M@@<0$``'"```X`D,?@="@#/B+PP`)P@`FB!``(/G5W#O```@`(T``"``GB!0
+M``(($(`RXB\`RO\G$`"N"10`S@D8`.X)D.\``"``'``."@2`[0L@@`\X,!!N
+M"P0^#A``-@X0`#AN8S!^CE.P[P``(``0&@X0%!P.$!@>#A`<(`X0````4/2!
+M#1#X@0T0@"4'*-#O```@``!\/V",V`(`*(``$/#_34``?-]AD*@"`#``!P@`
+M`&`(\.\``"``)``'"```(`@L``<(`('@5P4!`"``@`!0@```(`"``5`0\```
+M(`````$0`'S_81S=`@`,@`<(`7X`0!2`QPD`'"=@@!OC+S#P```@``"`!P@`
+M@>!7#@$`(``"QU&````@``+`40!ZYU<"`0`@4/```"``@*L/*(```"``T@\H
+M\(&M"0`;YU>&```@`!RG80!\_V%P\```(``<W0(`%(#'"0R`!P@```=0`('F
+M5XX``"```*!A`/KF5Y#P```@`````%`!'@`@_(%-$/3_34``?-]AD*@"`#0`
+M!P@````(L/```"``+``G"`3^((``@`!````!$`!\_V$<W0(`#(`'"`1^((#0
+M\```(``0@`<(``)`0/Z;31#T@2T(!/YF@/R!K0CX@<T(`OX?8/#P```@``'^
+MGV``PPHH```@8`#ZX%<"#P`@`'Q?8)2^`@`L``$($/$``"```'P@:``"```D
+M``$(``(`%`B`!P@`&@!`"(`'$`R`!P@P\0``(```&@!`%(`G"`#ZXB\,@@<0
+M,``'"```X`DL?@="`/;A+U#Q```@`"P`)P@`FB!``(/G5XT``"``GB!0``((
+M$`#UX2^`0Q`H</$``"`````@8`#ZX%<!RO\G//X?8``$05``VQ(H$`"N"10`
+MS@F0\0``(``8`.X)'``."@2`[0L@@`\X,!!N"P0^#A``-@X0`#AN8[#Q```@
+M`$Q^CE,0&@X0%!P.$!@>#A`<(`X0("(.$"0D#A`H)@X0T/$``"``+"@.$#`J
+M#A`T+`X0."X.$#PP#A!`,@X0`'Q?8!S=`@#P\0``(``(``$(`'K@5P%Y`"``
+M?#]@,+4"``"```@`>N!7@78`(!#R```@``":IE$`?%]@'-T"``0``0@$?@"`
+M$`!!"```04((!$D(,/(``"``!GX!8``"`!@`>N!7`0(`(`)ZX%<!`0`@`7K@
+M5X)I`"!0\@``(```)"E@`?ZF002`0`@`?']@X+T"``"%`1`(A``(`7X`8'#R
+M```@``!ZX%>!"0`@$/X@0`!\7V`<W0(`$`!!"`!_`5``@>!7D/(``"``@@``
+M(``$(6`$@$`(`'Q_8."]`@``@0$(``0`0`"!`1"P\@``(``!_J9!"(0`"`%^
+M`&``>N!7@O;_)P!\?V#@O0(``('!"=#R```@```<!V"`\>4O````8@@$20@"
+M?B%@`/K@5P`0*!@!`0`@\/(``"```OX?8``!`"`!_B!``/[_)P`$05``#?@O
+M````8P!ZZ%<0\P``(``!5@`@`'KL5P%5`"`$`.D)`)XG8_;^OT(``,D*`#!L
+M8C#S```@`!3^"4`0@`D0"`1)"`-^(9`!_H!B`GXA8`#ZX%<!`@`@4/,``"``
+M!?X_8/R#31```,!A@`,`("J@B1`HG(D0`?X?8/R!31!P\P``(``,@`D(%'[`
+M00``8&(!_O]B"`1)"`%^`6``>N!7`@$`()#S```@``#Z[%>!-P`@`'Q?8!S=
+M`@`(``$(`'K@5P$U`"``G^I7L/,``"``#@$`(`">)V*````@`*HJ8@"0*!@"
+MB`D(``(`0`*`B1#0\P``(``4_A]@`(")$`@$20@#?B&0`?X`8``H@&H!?@%@
+M`'K@5_#S```@`((!`"`,@`D(`'K@5P$"`"`(!$D(`GXA8`#ZX%>!`P`@$/0`
+M`"```?Z?8/^;31#^J4T0^+$-$``L*V``KNM2``(`(``(@E`P]```(```+"M@
+M````4/B!#1#\@:T(^('-"`+^'V``'$=@`*)H8%#T```@`(!7"B@``"!@`/K@
+M5P$"`"`^_A]@``1!4(!^$B@`*P`@</0``"```'Q?8)2^`@`L``$(`'P@:``"
+M```D``$(``(`%`"BYU&0]```(```HJI2`/KJ5P$!`"``G,A!@`,`(/]_"$(,
+M@`D(`'K@5[#T```@`($!`"```&!B%/[)0?;^OT(`^N=7@@H`(`!\7V`<W0(`
+MT/0``"``!``!"`%^`$`$``$0$'K@5P(!`"````!0!``!$`!\7V#P]```(``<
+MW0(`"``!"/]_`$`(``$0!``!"`1^`(`0`$$(``!!0A#U```@````P0($`.D)
+M@```(``BRT(`^NM7@04`(`@$20@!?@%@,/4``"```'K@5P(!`"``^NQ7@0(`
+M(`!\7V`<W0(`"``!"`!ZX%=0]0``(``"R_\G`'P_8#"U`@``@``(_W\`0`"`
+M`!``?!]BD*@"`'#U```@`#``"`@``,`)*'[H00!PX2\H`"@(`)H@0``#YU>-
+M```@D/4``"```)P@4`""!Q``;^$O`'Q?8!S=`@`(``$(`'K@5X$"`""P]0``
+M(```?#]@,+4"``"```@`>N!7@HG_)P```%`0`*X)%`#."=#U```@`!@`[@D<
+M``X*(``N"B0`3@HH`&X*+`"."C``K@HT`,X*\/4``"``.`#N"CP`#@M``"X+
+M!(#M"R"`#SA,$&X+!#X.$``V#A`0]@``(```.&YC$'Z.4P!\'V#SVP(```0`
+M"`QZX%>"!@`@`'P_8##V```@`,2Z`@`YA0`(`'K@5P($`"`ZA0`(`'K@5X("
+M`"`$_A]@4/8``"``@"OU+X`K]2\!_A]@@```(````%`$@.T+((`/.!`0;@MP
+M]@``(``$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A```*!A`'P?8)#V```@`"BR
+M`@!$`6`(`(?F5P$<`""`2^$O``#`80""(%``AF%0L/8``"```OY`@`!\'V!0
+MVP(````!``!ZX%<!`@`@$`!`"`'^'V#0]@``(``P`($0`?Y_8`'^($`$^N!7
+MB_G_)P#ZX5>!```@`,3O+_#V```@```<!V"`0^$O`/KF5P$.`"``?!]@*+("
+M`$0;`!``FF9@$/<``"```'P?8!39`@"<@`$0`((@4```0`@,```(`('@5PH*
+M`"`P]P``(```?!]@*+("`$0!8`@0``$()`8`$`"&85`0``$(1P9`$%#W```@
+M``'^($`(`$$(`'P?8!39`@`,```(`('@5XOX_R<``@`@</<``"```(9A4`!\
+M'V`HL@(`1`<`$`!\'V"HUP(```0`"`!ZX%>0]P``(`""`P`@`/KF5X$"`""`
+M90@H`'P_8(S;`@`<@``0@&;R+[#W```@``#ZYE>!`@`@`'P?8$RQ`@`!_C]@
+M``1!4``Z`R@0`*X)T/<``"``%`#."02`[0L@@`\X&!!N"P0^#A``-@X0`#AN
+M8QA^CE/P]P``(``0&@X0%!P.$`!\/V`$V0(`#(``"`!ZX%<!&P`@`'P?8!#X
+M```@`&#;`@`0"``(`'K@5X$-`"`(@``(!'X`8`!ZX%<!!P`@,/@``"```(#@
+M"`#ZXU<!%0`@$(!#"$<$(0B`_@!@`'K@5P(!`"!0^```(``"^N!7@@L`(`B`
+MXP@`^N-7`OO_)X`/`"``?-]A3-L"`'#X```@````!P@`>N!7`@T`((!7\"\!
+M_A]@```'$``+`"``@.`(D/@``"```/KC5X$)`"`0@$,(1P0A"(#^`&``>N!7
+M@@4`(`+ZX%>P^```(`"!!``@)``A"`".`V`!_E]@@(X1*`!\'V`$V0(``(XC
+M8-#X```@`(#\!BB`+``@"(#C"`#ZXU>"]O\G`'S?82BR`@!T`:<)\/@``"``
+M`'S?82BR`@!T`2<(!/X@@`!\'V`4V0(``(`@0`R```@0^0``(```>N!7`1T`
+M(`B`(`@(_@!@`'K@5P(;`"`"_@!@`'K@5S#Y```@`($!`"`$_@!@`'K@5P$4
+M`"``?-]A*+("`'0!)P@$_B"`4/D``"```'P?8!39`@``@.```/KC5X$3`"`0
+M@$,(1P0A"(#^`&!P^0``(```>N!7`@L`(`+ZX%<!"@`@)``A"`".`V`!_E]@
+M`'41*)#Y```@``!\WV$HL@(`=`$G"`3^((``_`!`%-D"``".(V``X08HL/D`
+M`"``=`$G"`'^($!T`P<0%/K@5P(/`"``@B!0=`,'$(`-`"#0^0``(``(@.,(
+M`/KC5P+Q_R<`!``@`'S?84S;`@````<(`'K@5_#Y```@`((!`""`*/`O`?X?
+M8```!Q``?-]A*+("`'0!)P@!_B!`$/H``"``=`,'$!3ZX%<"`0`@`((@4'0#
+M!Q``?-]A*+("`'0!)P@P^@``(```@^97`M?_)P/^'V`0`*X)%`#."02`[0L@
+M@`\X&!!N"U#Z```@``!\/V#$N@(`.(%`$`"`#S@$/@X0`#8.$``X;F,0?HY3
+M</H``"```'K@5P!\'V`(O@(`@0$`(/__/V``O@,H@```((#F`RB0^@``(``$
+M@.T+((`/.!`0;@L$?HY3!#X.$``V#A``.&YC,'Z.4[#Z```@`!`:#A`4'`X0
+M&!X.$!P@#A`@(@X0)"0.$"@F#A`L*`X0T/H``"``$(*-$```P&$`AN%A``@"
+M8A#^;4`#_@!@`'K@5P$%`"#P^@``(```B"$(````4``"AT$``$80`?X`0``0
+M(!@`@($0`_X`8!#[```@``!ZX%<"^_\G`'KA5Q"(+0H*%``@`'Q_8M2^`@``
+M?%]B,/L``"``E,("``"YX"\4`"D(/_K@5P4#`""`N>`O*_X?8`3^/V!0^P``
+M(```!$%0`*$1*(`?`"`0`"D(`?X@4#_^8&`$_L&`*("I"'#[```@``",0D`T
+M@(D(`"*":``<XG@(`"$(`(X@>`P"`1`$'`$0D/L``"```(S"0``(`Q`#_D&`
+M+(`I"`"$@$``A$!``!X!$`0@`A"P^P``(``4`"D(`?X@0!0""1`0!@D0@!$`
+M(``$H6$`?']BU+X"`-#[```@`"C^B4(`?%]BE,("``"DX"\`AF%0$``I"`":
+M($`__B!@\/L``"``!/[@@```R@@`#D-``'Q_8M2^`@`T@(D(`(BH:`"<`GD0
+M_```(``(`($(`!"">`P(`1`$'`$0``[C0`"*`Q`#_H"`!`!*"##\```@```(
+MH4``"(%``!X"$`2@`A`!_F%``?X@0`'ZX5>%\_\G4/P``"```)C@+P```%`0
+M`*X)%`#."1@`[@D<``X*(``N"B0`3@IP_```(``H`&X*+`"."@2`[0LP$&X+
+M((`/.`1^CD,`@`\X!'Z.4Y#\```@``0^#A``-@X0`#AN8RA^CE,0&@X0%!P.
+M$!@>#A`<(`X0L/P``"``("(.$"0D#A`0@HT0``#`80`$(6(`A@%B$/Y-0`/^
+M`&#0_```(```>N!7`04`(``((0@```!0``*'00``1A`!_@!``!`@&/#\```@
+M````@1`#_@!@`'K@5P+[_R<0B*T)`'Q?8M2^`@``?/]A$/T``"``E,("``!]
+MX"\4@"<(/_K@5P4#`""`?>`O+?X?8`3^/V`P_0``(```!$%0`&41*(`.`"`,
+M@"<(!/Z@@"@`B0@`"D)`-``I"%#]```@``":8&@`G,%X"``A"`",('@,`@$0
+M!!P!$``*HD``A@(0</T``"``#(`G"`/^0(`L`"D(`(1@0`"$0$``(@$0!*`!
+M$!2`)PB0_0``(``!_B!`%(('$`R`)P@!_B!`/_X@8`R"!Q``;>`O````4+#]
+M```@``!ZX%<"!``@`'Q?8)2^`@`<``$(`'P@:``"```4``$(T/T``"````(`
+M%(`!`"!0_A]@GOX_8`!0&"@0`*X)%`#."1@`[@GP_0``(``<``X*(``N"B0`
+M3@H$@.T+*!!N"R"`#S@$?HY#`OX_8!#^```@``!\'V#\V`(```)`$`G^/V``
+M?!]@_M@"```"@!`,_C]@,/X``"```'P?8`#9`@```D`0`(`/.`0^#A``-@X0
+M`#AN8QA^CE-0_@``(``0&@X0%!P.$`!\'V#@R@(```@`"`1ZX%>!-P`@@(L'
+M*'#^```@``!\7V!$N0(`$`$A"``#X%>.-``@`'P@0`!]```0`P$0D/X``"``
+M``/@5PX!`"````!0$`$!$`!\'V"@K0(````@"`!\'V"P_@``(``(K0(`````
+M"``"0$``?!]@N*T"````(`@`?!]@;+`"`-#^```@``````@`@`!0``0@0`!\
+M'V`@K0(`````"``"H$$`?%]@\/X``"``1+D"`!0!`0@`@$90`!`!&`!\/V"Z
+MVP(``(2`$`!ZX%<0_P``(`"!&``@`'W@5RL!``",`0`@`'P?8"L!````@(`0
+M`'P_8##_```@`+K;`@``B``(```?4$H!```>_C]@`)[A+P``P&$"?@>`4/\`
+M`"```!P`0````$``'`!``GX`@``<`$`&?L"!`'Q?8$2Y`@!P_P``(``8`0$(
+M``'G5X$)`"``?!]@X,H"```(``@#>N!7`?X?8)#_```@`(("`"``'"=@`'Q?
+M8$`+````AF%0``(`(`!\/V!`"P``L/\``"```!Q'8`'^?V``$/DO`'Q?8$2Y
+M`@`8'0$0`'Q?8$2Y`@#0_P``(``4&P$0``H`(`!\'V#@R@(```@`"`-ZX%<!
+M_A]@@@(`(/#_```@``!\/V``?0````1!4`'^?V```@`@`((@4`!\7V``?0``
+M$``!`"```(9A4(`$^2\```!0`'Q?8$2Y`@`8`0$0$`"N"10`S@DP``$`(``$
+M@.T+((`/.!@0;@L$/@X0`#8.$``X;F,T?HY3$!H.$%```0`@`!0<#A`8'@X0
+M'"`.$"`B#A`D)`X0*"8.$```X&$`@B!B<``!`"```(;!8?B%#1``FJ91`!J'
+M$`"B"&`!_C]@@%((*`+^'V"0``$`(`#\@0T0`/P(0@`"``#%!0@(_8%-$,0%
+M"`C_@4T0B(@("+```0`@``!ZX%>"!@`@^H4-"/Z!31#`?PA`_(%M""#^/V``
+M!$%0T``!`"```)Z'8(`X_R]=A`@("'X`:%V`2!``F@9@@#<`($Z(Z`CP``$`
+M(```$`11D(0("`"!XU>!`P`@`7X$0``0`!D#?@2``(`(0!`!`0`@`)`$``@`
+M@>-7@OS_)P"B"&``$"1@`#4`*`".`T``#@!`,`$!`"```!``0``.(!@`_`A"
+M``(``.D%"`@``@!0``X@&$"$"`A0`0$`(```>N!7`0$`(`".`%``#B`8^H4-
+M"``"`%``#*`9`?X`0'`!`0`@```.(!C^@4T0B(@("`"!XU<""``@__\F0`",
+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
+M4+8"`'`*`0`@`#"!"`@N`H`0!P0G"`@$APD(?H:!`)@@:#`"@!`)!"<(D`H!
+M`"``"@2'"0A^AH$`F"!H,@*`$``)`"`$`"<(`'P_8E"V`@"P"@$`(``P@0@(
+M*`(`$``&`"#X@<T)``0'"`=ZX%<!VO\GB0$`(-`*`0`@``9ZX%>!T_\G``(`
+M(*UZX%<![O\GKWK@5P'W_R?X@<T)\`H!`"```00'"`)^`$``'`!`^($-$`"!
+MYE>-]O\G$`"N"10`S@D0"P$`(``8`.X)'``."B``+@H$@.T+((`/."P0;@L$
+M/@X0`#8.$#`+`0`@```X;F,L?HY3$!H.$!0<#A````!0_($-$`#P!2@``,!A
+M4`L!`"```'R_80RY`@`<@08(```'4`!]X%>`#```#A0`(`#MZ2]P"P$`(``<
+MG080`'P_8%C!`@``@0`([($-$`2)``CP@8T0#($&")`+`0`@``%^`%`&>N!7
+M#0P`(``&`"``2N8O$($F"`"`($``?!]@L`L!`"``[,P"``P"`!``"``@[/\-
+M0(#0Y2^`!@`@@!/\+X`%`"#0"P$`(``"?H"!`'R&`>`+`0````8XZ$(``.]"
+M``#R0@``_T(``/`+`0`@`/]"``#_0@``_T(``````%``?+]A#+D"``R!!A#\
+M_RU`$`P!`"```'P?8)2^`@`X```(````"`"``!#X_TU`]/\M0`!\'V`P#`$`
+M(`"4P@(`+```"````1`__A]@`(``$``$05``?+]A#+D"`%`,`0`@`""!!@C\
+M@2T(`('@5P(-`"`D@68(!(``"`"!X5<""P`@<`P!`"``*(%F"`B```@`@>%7
+M`@D`(`R```@`?`!@_S\```!ZX%>0#`$`(`"!!@`@`(``"`!\`&````"0`'W@
+M5P```)""`P`@^($M"+`,`0`@``#ZX%<!`@`@+($&"`"!X%>%```@`?Y?8`!Z
+MX5>!#@`@T`P!`"```'R_80RY`@``@08(`7X`0`"!!A`!_A]@!($&$````%#P
+M#`$`(``(@080`'P?8*2U`@`````(!7K@5X8%`""`HA`H`'R_81`-`0`@``RY
+M`@`(@08(`7X`0`B!!A``?!]@I+4"``````@%>N!7,`T!`"``A?K_)P```%``
+M?+]A#+D"``2!!A#\@2T(`'R_80RY`@!0#0$`(``@@P80!(``""2!!A`(@``(
+M*($&$/B!+0@L@P80````4'`-`0`@`!``K@D4`,X)!(#M"R"`#S@L$&X+!#X.
+M$``V#A``.&YCD`T!`"``$'Z.4___/V"`6P$H!(#M"R"`#S@0$&X+````4'0`
+M#1"P#0$`(`!X``T0`(`/.````%!\``T0@``-$`"`#S@$/@X0`#8.$-`-`0`@
+M```X;F,8?HY3$!H.$!0<#A```*!A>(#&"0"@'P@``0!(\`T!`"````$`2``!
+M`$@``0!(``$`2``!`$@``0!(``$`2`1^(&`0#@$`(```@*`?____?W2`)@@`
+M^N!7@1P`(`!ZYU>!&P`@```G"#`.`0`@``#]X%=.1%9$@AD`(``$05!TA`80
+M?(`F"`"#YE<"`0`@4`X!`"``$`0'$(`"`"`0`@<0@(!&"("$`!!\@"8(?`(!
+M$!0`)PAP#@$`(`#__R!`%`('$#R`)@@'^N!7`@8`(`?^/V"0@@80*``M")`.
+M`0`@``'^($`H`@T0``"@'P":!F``2P(H`'K@5X$!`""`B=\OL`X!`"``@```
+M(```H!]P@`8(`'K@5X$!`"!8_@9``'`#*``!`"#0#@$`(```!$%06(0&$`"@
+M'P@``0!(``$`2``!`$@``0!(``$`2/`.`0`@```!`$@``0!(``$`2`1^(&``
+M@*`?____?P``H!\0`*X)$`\!`"``%`#."02`[0L@@`\X&!!N"P0^#A``-@X0
+M`#AN8Q1^CE,P#P$`(``0&@X0``"@802"!A````!0"(`&$!"`!A`4@`80#(`&
+M$%`/`0`@``"@'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(<`\!`"``
+M``$`2`1^(&``@*`?____?P!\/V!.1%9$`((&$&P`+0B0#P$`(```^N!7`0,`
+M(!R`0`@<F@`0&!H!$!R$!A`8@@80@`$`(+`/`0`@`&P:#1`8F@80')H&$'``
+M+0@!_B!`<`(-$```H!\```!0T`\!`"``$`"N"02`[0L@@`\X%!!N"P0^#A``
+M-@X0`#AN8RA^CE/P#P$`(``0&@X0%!P.$!@>#A`<(`X0("(.$"0D#A```.!A
+M`((`8A`0`0`@```$(6(`AD%B``C"80"@'P@``0!(``$`2``!`$@``0!(,!`!
+M`"````$`2``!`$@``0!(``$`2`1^(&``@*`?____?P+^*&!0$`$`(```^N!7
+M"(!'"``@(6"!`0`@``/H5X("`"```0`@`/K@5W`0`0`@``$!`"``FJ91@```
+M(`?^OV$`^N97`@0`(`B`1P@`!`D0D!`!`"```?XH8`#ZX%>!&``@`"`A<`B"
+M!Q``%P`@`'KG5X$5`""P$`$`(``,`*T)`'P_8')#``!T@@80A*`&$(RB!A"(
+MI`80>)X&$-`0`0`@`!"`)P@`^N!7@00`('R"!A"`@"`(@((&$!"`)PB`@"`(
+M\!`!`"``?)H`$!"`)PB`F@`0@`$`(!":!Q!\F@80@)H&$!2`)P@0$0$`(``!
+M_B!`%(('$`?^/V`\@@80`?X_8$2"!A`H`"T(`?X@0#`1`0`@`"@"#1!8G`80
+M``"@'_][YU<!`0`@6/X&0``"`R@`F@9@4!$!`"``@%<"*)"`!@B``0`@!_Z_
+M80``H!\`F@9@$`"N"10`S@EP$0$`(``8`.X)'``."B``+@HD`$X*!(#M"R"`
+M#S@H$&X+````4)`1`0`@`&P`#1!P``T0`(`/.`0^#A``-@X0`#AN8S1^CE,0
+M&@X0L!$!`"``%!P.$!@>#A`<(`X0("(.$"0D#A`H)@X0+"@.$#`J#A#0$0$`
+M(````"!B`(*@80`$P6$`H!\(``$`2``!`$@``0!(``$`2/`1`0`@```!`$@`
+M`0!(``$`2``!`$@$?B!@`("@'____W\"?B=@$!(!`"```/K@5PB`*`B!`0`@
+M`)H@8`B""!``'0`@`)H@:`B""!`P$@$`(``0@*@)`/KF5Q2`2`@!9@`@`7KA
+M5P":QF&"&0`@C`!'"%`2`0`@``)^06``>N%7A`!'"``"(6"!`0`@``/A5X("
+M`"```0`@<!(!`"```/K@5P$!`"``@B!0@```(`?^/V``^N!7@A``(`B`*`B0
+M$@$`(`"(`$<(``(!$(P`1P@!?D%@`'KA5X$!`""$`$<(`(0@<+`2`0`@``B"
+M"!``JJI2$*H($!2J"!!T*@<0*``M"`'^($`H`@T0T!(!`"````"@'W``!P@`
+M>N!7@0$`(%A^!T"`[`(H@```(%@J!Q#P$@$`(```JJI2D"H'$``<!V"`OP$H
+M`'K@5P%0`"``_MXO`$\`(!`3`0`@````H!\`3@`@`*JJ4A"J"!``)$E2`"`(
+M4A2`:`H(@(@*,!,!`"``*``M"`'^($`H`@T0``"@'P"@'P@``0!(``$`2``!
+M`$A0$P$`(````0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____?W`3`0`@
+M``R`*`@`^N!7`00`(`"JJE(,J@@0`)K&812`:`H(@"@(D!,!`"```*B`:@!Z
+MYU<!'0`@C`!G"`+^(6``^N!7A`!'"``H(6"P$P$`(`"!`0`@``/A5X("`"``
+M`0`@`/K@5P$!`"``@B!0@```(-`3`0`@``?^/V!\`.<)`/K@5X(2`""(`$<(
+M`"@!$`'^(6``^N!7\!,!`"```0(`(`B`*`B$`$<(`(0@<`B""!!\`"<(``/G
+M5P(!`"`0%`$`(```FJ91``0`(``;YU>"```@`(*@88``1PA\`"<(@(0`$#`4
+M`0`@`'P`)PA\`@$0%(!("/]_(4`4@@@0`*JJ4G0J!Q"0*@<04!0!`"```'KI
+M5P("`"``'$=B`!P'8GPJ!Q"``0`@?!P($'PJ!Q!P%`$`(```'`=B`)['8?__
+M:4(`^NE7`M?_)Q":"!```*`?`"3)89`4`0`@``!ZYU<!#P`@?`#G"7``!P@`
+M>N!7@0$`(%A^!T"`LP(HL!0!`"````$`(`"JJE)8*@<0`*`?"``!`$@``0!(
+M``$`2``!`$C0%`$`(````0!(``$`2``!`$@``0!(!'X@8`"`H!____]_*``M
+M"/`4`0`@``'^($`H`@T0``"@'P`<!V``?P$H`)['80!ZYU<"\?\G$!4!`"``
+M`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@P%0$`(````0!(!'X@
+M8`"`H!____]_*``M"/__($`H`@T0``"@'U`5`0`@``P`+0@0``T(`('@5P$%
+M`"````T(`'K@5X(#`"``L_\G<!4!`"```'KA5P&S_R<,@"@(`?X@0`R""!``
+ML?\G````4!``K@F0%0$`(``4`,X)&`#N"1P`#@H@`"X*)`!."B@`;@HL`(X*
+M,`"N"K`5`0`@``2`[0L@@`\X-!!N"P0^#A``-@X0`#AN8Q!^CE.`V@`HT!4!
+M`"``@*<"*(![`"@`#P`H@'7_+X#X_B\`^OXO!(#M"R"`#SCP%0$`(``0$&X+
+M!#X.$``V#A``.&YC$'Z.4P``#0@`?>!7\?#P\!`6`0`@`($"`"``?!]@\/#P
+M\```#1``@]TO@/+_+P!\'V#P\/#P,!8!`"`````-$`0`#0@`P!\H````4```
+M#1``I-TO!(#M"R"`#SA0%@$`(``0$&X+````4&0`#1!H``T0`(`/.`0^#A``
+M-@X0`#AN8W`6`0`@`!A^CE,0&@X0%!P.$```H&%X@,8)`*`?"``!`$@``0!(
+MD!8!`"````$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!^P%@$`(`#_
+M__]_=(`F"`#ZX%>!'``@`'KG5X$;`"```"<(`/W@5]`6`0`@`$%-15."&0`@
+M``1!4'2$!A!\@"8(`(/F5P(!`"`,!`<0\!8!`"``@`(`(`P"!Q"`@$8(@(0`
+M$'R`)@A\`@$0$``G"/__($`0%P$`(``0`@<0/(`F"`;ZX%<"!@`@#?X_8)""
+M!A`H`"T(`?X@0#`7`0`@`"@"#1```*`?`)H&8(`W`2@`>N!7@0$`(`!VWB^`
+M```@4!<!`"````"@'W"`!@@`>N!7@0$`(%C^!D"`7`(H``$`(``$05!P%P$`
+M(`!8A`80`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2)`7`0`@```!`$@`
+M`0!(!'X@8`"`H!____]_``"@'Q``K@D4`,X)L!<!`"``!(#M"R"`#S@8$&X+
+M!#X.$``V#A``.&YC%'Z.4Q`:#A#0%P$`(````*!A!((&$`B$!A````!0#(`&
+M$!"`!A``H!\(``$`2/`7`0`@```!`$@``0!(``$`2``!`$@``0!(``$`2``!
+M`$@$?B!@$!@!`"```("@'____W\`?#]@04U%4P""!A!<`"T(`/K@5P$#`"`P
+M&`$`(``8@$`(&)H`$!0:`1`8A`80%((&$(`!`"!<&@T0%)H&$%`8`0`@`!B:
+M!A!@`"T(`?X@0&`"#1```*`?````4!``K@D$@.T+<!@!`"``((`/.!00;@L$
+M/@X0`#8.$``X;F,<?HY3$!H.$!0<#A"0&`$`(``8'@X0``#@80""P&$`H!\(
+M``$`2``!`$@``0!(``$`2+`8`0`@```!`$@``0!(``$`2``!`$@$?B!@`("@
+M'____W\(@"<(T!@!`"```/K@5P$"`"#__R!`"(('$`":IE&`%0`@`'KG5P$4
+M`"#P&`$`(``,`*T)`'P_8)E%``!T@@80>)X&$`R`)P@`^N!7@00`(!`9`0`@
+M`'R"!A"`@"`(@((&$`R`)PB`@"`(?)H`$`R`)PB`F@`0,!D!`"``@`$`(`R:
+M!Q!\F@80@)H&$!"`)P@!_B!`$(('$`;^/V!0&0$`(``\@@80`?X_8$2"!A`H
+M`"T(`?X@0"@"#1!8G`80``"@'W`9`0`@`/][YU<!`0`@6/X&0(#[`2@`F@9@
+M`%$!*)"`!@B``0`@D!D!`"``#?Z_80``H!\`F@9@$`"N"10`S@D8`.X)!(#M
+M"R"`#SBP&0$`(``<$&X+````4%P`#1!@``T0`(`/.`0^#A``-@X0`#AN8]`9
+M`0`@`!Q^CE,0&@X0%!P.$!@>#A```,!A`*`?"``!`$@``0!(\!D!`"````$`
+M2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!\0&@$`(`#___]_#`"G"0#Z
+MYE>!$0`@?(`F"`"#YE>"`0`@`)[G43`:`0`@``P>!Q"``@`@#`('$("`1@B`
+MA``0?(`F"'P"`1`0`"<(4!H!`"``__\@0!`"!Q``GN=1=)X&$"@`+0@!_B!`
+M*`(-$```H!]P&@$`(`!P@`8(`'K@5X$!`"!8_@9``/D!*(```"!8G@80`)[G
+M49`:`0`@`)">!A``F@9@`,P`*`!ZX%<!`P`@@`K>+P`"`"`(`"<(L!H!`"``
+M`?X@0`@"!Q```*`?````4!``K@D4`,X)&`#N"02`[0O0&@$`(``@@`\X'!!N
+M"P0^#A``-@X0`#AN8QA^CE,0&@X0%!P.$/`:`0`@`!"`#0D4@,T)``"@832"
+M!A!0A`805(8&$`""(%`(@@80$!L!`"``#(@&$!2*!A`!_@)0``@`0!"`!A`?
+M?D-@.(0&$!_^`V`P&P$`(`!(@`80&)`&$!R0!A`$@@80`_X?8#R`!A!`@@80
+M1((&$%`;`0`@``!\'V`+2@``8(`&$&2:!A!P@@807((&$'2"!A!X@@80<!L!
+M`"``?((&$(""!A`!A!^`3(`&$"B"!A`L@@80,((&$`!\/V"0&P$`(`"F2```
+M`)H&8(#0W2\`H!\(``$`2``!`$@``0!(``$`2+`;`0`@```!`$@``0!(``$`
+M2``!`$@$?B!@`("@'____W\`?#]@T!L!`"``1%)(5`""!A`4`"T(`/K@5P$#
+M`""8@$`(F)H`$)0:`1#P&P$`(`"8A`80E((&$(`!`"`4&@T0E)H&$)B:!A`8
+M`"T(`?X@0!`<`0`@`!@"#1`H`"T(`?X@0"@"#1```*`?`'KG5P$#`"``F@9@
+M,!P!`"```)D`*`!ZX%<!"0`@@-?=+P`(`"``H!\(``$`2``!`$A0'`$`(```
+M`0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'W`<`0`@`/___W\H`"T(
+M__\@0"@"#1```*`?````4!``K@D4`,X)D!P!`"``!(#M"R"`#S@8$&X+#``-
+M"`"`#S@`@B!0#`(-$!`"#1"P'`$`(``<`@T0(`(-$"#^'V`D``T0`'P?8.+*
+M`@```D`0`7Z`0-`<`0`@``'^?V``A@%@``1!4`%^(&``^N!7`@,`(``$`!@!
+M?B%`\!P!`"```(Y`&`%^(&``^N!7`?W_)P`$0A`!?H)``?YA0`#]X5<0'0$`
+M(````0``A??_)P!\'V#DRP(``(9A4`""(%```@`0!'X`0#`=`0`@``'^84`@
+M^N%7!?W_)Q0"#1`8`@T0*`(-$`"`#S@$/@X04!T!`"```#8.$``X;F,<?HY3
+M$!H.$!0<#A`8'@X0``#@80""H&%P'0$`(```!,%A`*`?"``!`$@``0!(``$`
+M2``!`$@``0!(``$`2)`=`0`@```!`$@``0!(!'X@8`"`H!____]_.(`G"`"#
+MYE<-&``@L!T!`"```(/F5P(%`"`"_D"``'P_8.3+`@```B$``(/G5P("`"#0
+M'0$`(``@`$T(3(`G"``"(7`@`@T02(`G"``"!Q!(F@<0$``M"/`=`0`@``"#
+MYU<"#@`@)`!-"#B`)P@`A>!7#@P`(`"%YE<."P`@$!X!`"```GY!@`!\/V#D
+MRP(```(A`!`"#1```*`?*``-"`!ZX%<P'@$`(`""```@@)C=+P"@'P@``0!(
+M``$`2``!`$@``0!(``$`2%`>`0`@```!`$@``0!(``$`2`1^(&``@*`?____
+M?P":IE&````@<!X!`"``&/Z_80``H!\`F@9@$`"N"10`S@D8`.X)!(#M"R"`
+M#SB0'@$`(``<$&X+!#X.$``V#A``.&YC''Z.4Q`:#A`4'`X0&!X.$+`>`0`@
+M````P&$`@J!A``3A82#ZYE<%`0`@#_X?8`!#`"``H!\(T!X!`"````$`2``!
+M`$@``0!(``$`2``!`$@``0!(``$`2``!`$CP'@$`(``$?B!@`("@'____W\X
+M`"<(`(('$#P`1P@`>N%7`0,`(!`?`0`@`#@:!Q!(&@<0`9I?@$P$!Q```*`?
+M`#<`("``1P@`!>=7,!\!`"```OY@@($)`"``?)]@Y,L"``"((0```^=7`@,`
+M(`"(@4!0'P$`(```!`(0(`!-"$P`)P@``D%P(`0-$"0`)P@@`$<()`(!$'`?
+M`0`@`"``1P@@A``0`9I?@$P$!Q``'``@`((@4`#\@4#DRP(`D!\!`"````("
+M$!P`30A,`"<(_X-_<``&(6`<`@T0(`!-"``&06"P'P$`(``@!`T0`9I?@$P$
+M!Q``CD`8`'KA5P$"`"``?#]@XLH"`-`?`0`@``*$(```$0`@`/Q`8`#_````
+M>N%7@0,`(`C^((@`CD`8\!\!`"```'P_8.+*`@`"A"``"/X@0(`+`"``_$!@
+M``#_``!ZX5<0(`$`(`"!`P`@$/X@B`".0!@`?#]@XLH"``*$(``0_B!```8`
+M(#`@`0`@``#\0&````#_`'KA5X$#`"`8_B"(`(Y`&`!\/V#BR@(`4"`!`"``
+M`H0@`!C^($"````@(/X_8"0"#1`0`"T(``/G5P(%`"!P(`$`(``D`"T((/K@
+M5X$"`"`"_B"``'R?8.3+`@``B"``@```()`@`0`@``""(%`0`@T0.!H'$$@:
+M!Q`#_C]@/`('$"@`+0@!_B!`L"`!`"``*`(-$```H!\`'`=@@`<`*`P`#0@0
+M`"T(`('@5P$"`"#0(`$`(`````T(`'K@5X(``""`0]TO````4!``K@D4`,X)
+M&`#N"?`@`0`@``2`[0L@@`\X'!!N"P0^#A``-@X0`#AN8QA^CE,0&@X0$"$!
+M`"``%!P.$```P&$`FJ91`*`?"``!`$@``0!(``$`2``!`$@P(0$`(````0!(
+M``$`2``!`$@``0!(!'X@8`"`H!____]_*``M"%`A`0`@`/__($`H`@T01``G
+M"`#ZX%<\`"<(`00`(`'ZX%>!'0`@<"$!`"```OK@5X$<`"``@B!01`('$#P"
+M!Q"`&@`@`/K@5X$9`""0(0$`(`!``"<(`/K@5P""(%`!`@`@0`('$`/^/V`\
+M`@<0@!4`(+`A`0`@`#P"!Q`X`&<(`OY!@`!\GV#DRP(```@A``#ZX%<!`P`@
+MT"$!`"``)(!`""`<`1`DG``0)`0'$"`"!Q"`#@`@``B!0``<`A#P(0$`(``@
+M'`<0)!P'$!P`30A,`"<(`(0@:!P"#1`0`$T(`'KA5Q`B`0`@`((!`"`0'`T0
+M)`8-$(`'`"`D`"T(`(/A5P8&`"`D!@T0,"(!`"``2`"!"`")X5<&!``@.``A
+M"``#XE<!`@`@(`!M"$P`(0A0(@$`(```AB!H(`(-$!`<#1```*`?#``-"!``
+M30@``>%7`0(`('`B`0`@````#0@`>N!7@@``(`'^OV$`F@9@$`"N"10`S@D$
+M@.T+D"(!`"``((`/.!@0;@L$/@X0`#8.$``X;F,0?HY3#``-"%0`(`BP(@$`
+M(`!0`$`(`((`8``"`3@,``T(,``@"`#ZX%>!```@`((`.-`B`0`@``"@'P@`
+M`0!(``$`2``!`$@``0!(``$`2``!`$@``0!(\"(!`"````$`2`1^(&``@*`?
+M____?P``(&`!_E]@#``-"#P$`!`0(P$`(`!$!``0*``-"`%^`$`H``T0`("@
+M'PP`#0B`'``H!(#M"S`C`0`@`""`#S@0$&X+!#X.$``V#A``.&YC%'Z.4Q`:
+M#A```*!A4",!`"``#`!-"`!ZX5>!`P`@`'P?8*S7`@```>%7@0$`(```#0AP
+M(P$`(```>N!7`0$`(!/^'V``$``@`/KF5P(!`"````!0``X`()`C`0`@``"@
+M'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(L",!`"````$`2`1^(&``
+M@*`?____?P3^/V`,`$T(/`(!$`'^/V#0(P$`(`!$`@$0*``M"`'^($`H`@T0
+M``"@'PP`30A8&@$06'X!0/`C`0`@``"M`"@,``T(@`(`*`#Q_R<0`*X)!(#M
+M"R"`#S@4$&X+$"0!`"``!#X.$``V#A``.&YC%'Z.4Q`:#A```*!A`*`?"``!
+M`$@P)`$`(````0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8%`D`0`@
+M``"`H!____]_*``M"/__($`H`@T01(`F"`#ZX%>!5@`@<"0!`"```(JB4$2*
+M!A`X@"8((("&"`")YE<!$``@)(!&""0$`A"0)`$`(``@@(8((`@!$`+^0(``
+M?']@Y,L"```&(0``@^97@DX`(+`D`0`@```&84``B`$0(`!-"`!ZX5>!`0`@
+M3(`F"``"(7`@`@T0T"0!`"``$``M"`"#YE<"20`@)`!-"`)^(8``?']@Y,L"
+M``"&(`#P)`$`(``0`@T0@$4`(```#0@`>N!7@D<`((!&`"`"_D"``'QA0!`E
+M`0`@`.3+`@``B@$0'`!-"$R`)@C_@W]P``8A8!P"#1`@`$T(,"4!`"```'KA
+M5P$!`"``A"%@(`(-$!P`+0@`CD`8`'KA5X$"`"!0)0$`(```?#]@XLH"``*$
+M(``D`@T0`!(`(`C^((@`CD`8`'KA5W`E`0`@``$#`"``?#]@XLH"``*$(``(
+M_B!`)`(-$``-`"`(_B"(D"4!`"```(Y`&`!ZX5<!`P`@`'P_8.+*`@`"A"``
+M$/X@0"0"#1"P)0$`(```"``@"/X@B`".0!@`>N%7`0,`(`!\/V#BR@(``H0@
+M`-`E`0`@`!C^($`D`@T0``,`("#^/V`D`@T0`(JB4!`*#1```*`?\"4!`"``
+M`"D`(!``+0@`@^97@B0`("0`30@"?B&``'Q_8.3+`@`0)@$`(```AB``$`(-
+M$"``30@`>N%7`2``("@`+0@!_B!`*`(-$#`F`0`@````H!\`H!\(``$`2``!
+M`$@``0!(``$`2``!`$@``0!(4"8!`"````$`2``!`$@$?B!@`("@'____W\H
+M`"T(__\@0"@"#1!P)@$`(``@`"T(`(Y`&`!ZX5<!`@`@`'P_8.+*`@`"A"``
+M``P`()`F`0`@``C^((@`CD`8`'KA5X$"`"``?#]@XLH"``*$(``(_B!`L"8!
+M`"``@`<`(`C^((@`CD`8`'KA5X$"`"``?#]@XLH"``*$(`#0)@$`(``0_B!`
+M``,`(`C^((@`CD`8`'P_8.+*`@`"A"``&/X@0/`F`0`@``+^0(``?']@Y,L"
+M```&(0!(@&`()`!-"``'X5>%`@`@$"<!`"``$`(-$"``30A,@"`(``(A<"`"
+M#1```*`?#``-"!``+0@P)P$`(```@>!7`0$`(("W_R>`=]PO$`"N"02`[0L@
+M@`\X%!!N"U`G`0`@``0^#A``-@X0`#AN8QA^CE,0&@X0%!P.$`P`K0D`',=1
+M<"<!`"```*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$B0)P$`(```
+M`0!(!'X@8`"`H!____]_/(`F"`#ZX%>"#``@'(`F"+`G`0`@`!B"!A`H`"T(
+M`/K@5X$!`"`!_C]@&((&$(`(`"`@@&8(T"<!`"```(?F5P$'`"`X@$8(2(`F
+M"``#X5<"!0`@`GXA@`!\7V#P)P$`(`#DRP(``(2`00`&!A`D`"T(`OX@@`"$
+M(``0`@T0`?[?81`H`0`@````H!\`'`=@$`"N"10`S@D$@.T+((`/.!@0;@L$
+M/@X0,"@!`"```#8.$``X;F,8?HY3$!H.$!0<#A```*!A/(`&"`1ZX%=0*`$`
+M(`"""0`@`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2'`H`0`@```!`$@`
+M`0!(!'X@8`"`H!____]_*``M"`'^($`H`@T0D"@!`"````"@'P":!F``#/\O
+M``D`(`"@'P@``0!(``$`2``!`$BP*`$`(````0!(``$`2``!`$@``0!(``$`
+M2`1^(&``@*`?____?]`H`0`@`'2`Q@D``*`?`'KG5P$!`"``F@9@``('.!``
+MK@D4`,X)\"@!`"``!(#M"R"`#S@8$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A`0
+M*0$`(```H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2#`I`0`@```!
+M`$@$?B!@`("@'____W\L`*T)``"@'P":!F`0`*X)4"D!`"``!(#M"R"`#S@4
+M$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A!P*0$`(````*!A`*`?"``!`$@``0!(
+M``$`2``!`$@``0!(``$`2)`I`0`@```!`$@``0!(!'X@8`"`H!____]_`(!&
+M"`!ZX5>!$``@L"D!`"``&(`F"`#ZX%<"#P`@('KA5PX!`"`?_C]@@```(`%^
+M(5#0*0$`(``"_D"`0``M"`"$0$`\`"T(``/A5P4"`"```B%0_/]`8/`I`0`@
+M`#@`+0@`A$!````A"`#ZX%<!!``@$((&$!2`(`@4@@80$"H!`"``$)H`$```
+M(0@4F@`0&(0&$``"`"`0F@80%)H&$!B$!A`P*@$`(```&@$0``"@'P```%`0
+M`*X)!(#M"R"`#S@4$&X+!#X.$%`J`0`@```V#A``.&YC%'Z.4Q`:#A```*!A
+M`*`?"``!`$@``0!(<"H!`"````$`2``!`$@``0!(``$`2``!`$@``0!(!'X@
+M8`"`H!^0*@$`(`#___]_&(!F"`#ZX5<!"P`@$(!&"`"%YE<"`P`@`(`A"+`J
+M`0`@``"#YE<"!P`@`((@4`""`1"`!0`@%(`F"!0"`1`0@$8(T"H!`"``$(0`
+M$!B`9@@`@"$(`(/F5X(!`"`8!@$0$(!&"`"$`1#P*@$`(```@B!0&((&$```
+MH!\```!0$`"N"02`[0L@@`\X%!!N"Q`K`0`@``0^#A``-@X0`#AN8QQ^CE,8
+M&@X0`)JF42P:#1`P&@T0,"L!`"``-!H-$$0:#1``?!]@--T"``""(%``FJ91
+M`!H`$`1^`$!0*P$`(``!_B!`(/K@5P7]_R<`?!]@--T"`#@`#1!```T0@'X`
+M0'`K`0`@`#P`#1``?!]@K-<"``!\/V`\M0(``'Q?8/)*``!(`(T(D"L!`"``
+M3`"M"%``S0@0&@X0%!H.$`!\?V!-251!``SC8`#E_2^P*P$`(`!4&@T06!H-
+M$!@`K@D$@.T+((`/.!P0;@L$/@X0`#8.$-`K`0`@```X;F,D?HY3$!H.$!0<
+M#A`8'@X0`'W@5TU)5$$!`P`@\"L!`"``$`"N"10`S@D8`.X)!(#M"R"`#S@D
+M$&X+``1!4/B%#1`0+`$`(```H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(
+M``$`2#`L`0`@```!`$@$?B!@`("@'____W]``"T(`(`@"/R##1``^N!74"P!
+M`"```0$`(/S_34`8A``0``1!4$``+0@`A``00``M"`3^($!P+`$`(`!``@T0
+M/`!-"`"%X%<"`0`@.``M"$`"#1``!$%01`0-$)`L`0`@````H!\`H!\(``$`
+M2``!`$@``0!(``$`2``!`$@``0!(L"P!`"````$`2``!`$@$?B!@`("@'___
+M_W_\@2T(`/K@5X$S`"#0+`$`(`#\@2T(`(*@81"`(`@`@^97@@$`(``$05#\
+MA0T0``0`(/`L`0`@`!2`1@@4A``0$(`F"!`"`1#\_TU`&(0`$!"`)@C\@PT0
+M$"T!`"```(`F""#ZX%<.`@`@(/X@4`""!A``GN=1``,`(`B`Y@DP+0$`(``,
+M@,8)!(`F"`""!A``^N!7`0(`(/C_+4`8@@80$)H&$%`M`0`@```!`"``!$%0
+M&(0&$```H!\`^N=7`0$`(``<!V``@@<X<"T!`"```*`?"``!`$@``0!(``$`
+M2``!`$@``0!(``$`2``!`$B0+0$`(````0!(!'X@8`"`H!____]_&(!&"/C_
+M+4``A>!7@@\`(+`M`0`@``"`)@@@^N!7#@$`(!_^/V"````@`?X@4`+^0(!`
+M`"T(T"T!`"````(A0#P`30@`A>!7!0(`(`"$(%#\_T!@.``M"``"(4#P+0$`
+M(```@$`(`'KA5P$$`"`0A`80%`!!"!2$!A`0&@$0`(!`"!`N`0`@`!0:`1`8
+M@@80``(`(!":!A`4F@80&((&$`":`!```*`?,"X!`"```*`?"``!`$@``0!(
+M``$`2``!`$@``0!(``$`2``!`$A0+@$`(````0!(!'X@8`"`H!____]__($M
+M"`#ZX%>"S/\G1``M"'`N`0`@``#ZX%<"!@`@`_X_8`P`30@\`@$0`?X_8$0"
+M`1`H`"T(D"X!`"```?X@0"@"#1```*`?#``-"("M_B\`K?\G``"@'P"L_R>P
+M+@$`(```?!]@P-L"``````@`@`\X!#X.$``V#A``.&YC%'Z.4]`N`0`@`!`:
+M#A``?+]A6+P"``"%!@@`>N!7`0<`(`!\'V#KVP(`\"X!`"````0`"`!ZX%>"
+M!``@`'P?8``"````G>(O````4`"!1A`0+P$`(``!_C]@`'P?8$"O`@```@`0
+M`'P?8,#;`@`````($`"N"3`O`0`@``2`[0L@@`\X%!!N"P0^#A``-@X0`#AN
+M8QA^CE,0&@X04"\!`"``%!P.$```P&$`@J!A`'P_8%"V`@`4@4`(`7X!0!2!
+M`!!P+P$`(``*>N!7"P$`(````%`4@0`0`&D!*`!\/V!0M@(`%(%`")`O`0`@
+M``)^(8``A"!``((@0`"$($`"_B"``'Q_8)35`@``AD!`L"\!`"```(:`00``
+M!A``?!]@OMX"```(``@:`($0`'KG5X$+`"#0+P$`(``B_F%``(*!0`@(!P@`
+M@B%``("`$`H(!P@"`((0#`@'"/`O`0`@``0`@A!B"`<(!``!$%X(!P@J`($0
+M6`@'"`H`@1!:"`<($#`!`"``#@"!$%P(!P@2`($0D`@'"!0`@1"6"`<(%@"!
+M$`#ZYE<P,`$`(``!#@`@`'P_8%"V`@`4@4`(`GXA@`"$($``@B!``(0@0%`P
+M`0`@``+^((``?']@E-4"`!S^04```H%`"(@&"``"@4$``(80<#`!`"``"H@&
+M"`(`@A`,B`8(!`""$%Z(!@@`AD!`*`"!$%B(!@B0,`$`(``(`($06H@&"`P`
+M@1!<B`8($`"!$!``K@D4`,X)!(#M"[`P`0`@`""`#S@8$&X+!#X.$``V#A``
+M.&YC('Z.4Q`:#A`4'`X0T#`!`"``&!X.$```X&$`@L!A`)JF40+^!H``?%]@
+M4-L"```$(`#P,`$`(```^N!7@@$`(``$0$``'`$0@`$`(`'^ID$$^N97"_K_
+M)Q`Q`0`@``3ZYE<"`0`@`OX?8``C`"#\_RU``!P'8`#^Z2\`>N!7,#$!`"``
+M`B``(/R!#0@&>N!7C1X`((`8`"`"_@:``((@4`!\0$!0,0$`(`!0VP(```(!
+M$`">!V``'"=@`"OP+P`<!V"`HO`O=/X?8'`Q`0`@``!\/V!6!````-T1*`+^
+M!H``@B!0`'Q`0%#;`@```@$0D#$!`"``$``'"$<"0!`%_A]@`!,`(`+^!H``
+M@B!0`'Q`0%#;`@"P,0$`(````@$0$``'"$<"0!``Z_\G`OX&@`""(%``?$!`
+M4-L"`-`Q`0`@```"`1`0``<(1P)`$`;^'V"`"@`@`OX&@`""(%``?$!`\#$!
+M`"``4-L"```"`1`0``<(1P)`$`3^'V``!@`@`GZ`@0!\A@$0,@$`(``8,@$`
+M```&.(U,``!13```7TP``&A,``!P3```>4P``#`R`0`@`(U,``````!0$`"N
+M"10`S@D8`.X)!(#M"R"`#S@@$&X+4#(!`"``!#X.$``V#A``.&YC$'Z.4P``
+M`%``?#]@`'T````$05!P,@$`(``!_G]@@+CR+P2`[0L@@`\X$!!N"P0^#A``
+M-@X0`#AN8Y`R`0`@`!A^CE,0&@X0%!P.$`":IE$`?!]@U-P"```$``@`>N!7
+ML#(!`"```0T`(`"*`R@`>N!7`0\`(`'^/V"`)O(O``"@80#ZYE?0,@$`(`"!
+M#``@`'P_8&"M`@``@``(`7X`0`"``!``?!]@V-P"`/`R`0`@``````B`C@`H
+M`'P?8-#<`@```$`(`'KA5X$%`"`"_A]@$#,!`"```((@4``"`3B``P`@`'P?
+M8.C<`@```"`(`/K@5P$!`"`P,P$`(`````!0`((`.`!\'V!UW`(```0`"`!Z
+MX%>!!0`@`'S?85`S`0`@`-S<`@``!`<(`7X`0``.(!@``$<0!?K@5X(!`""`
+MO><O<#,!`"``````4```1Q``F@9@@/+?+P!\'V"HUP(```0`"`!ZX%>0,P$`
+M(`"!`@`@`'P?8//;`@``!``(#GK@5X$``"``G.TO`'P?8+`S`0`@`*C7`@``
+M!``(`'K@5X$"`"``?#]@H+0"`$B!``@!?@!`T#,!`"``2($`$!``K@D4`,X)
+M!(#M"R"`#S@8$&X+!#X.$``V#A#P,P$`(```.&YC$'Z.4P!\'V"@LP(``+C\
+M+P```%`$@.T+((`/.!`T`0`@`!`0;@L$/@X0`#8.$``X;F,8?HY3$!H.$!0<
+M#A```,!A,#0!`"```'R_89C<`@``@`8(`7X`4`-ZX%<-6P`@`%T`(`!\'V!0
+M-`$`(`!HW`(```0`"`!ZX%<!"P`@`_X?8``6[2\`@B!0`'P?8'`T`0`@`&G<
+M`@```D`0`?Y_8`!\7V!UW`(```9!$````%``@B!0D#0!`"``@'$$*`!\'V!T
+MW`(```0`"`!ZX%<!`0`@!/X?8(!4`""P-`$`(``#_A]@@%,`('C^'V``?#]@
+MU@,``(!S$2B`40`@`'P?8-`T`0`@`&C<`@``!``(`'K@5X$U`"``^N!7@@P`
+M(`'^?V``?%]@\#0!`"``==P"```&01``?#]@:MP"``"$``@">N!7@@``(`"&
+M0!`0-0$`(```?#]@:MP"``"$``@!>N!7`@$`(`/^'V"`_>PO`'P'0#`U`0`@
+M`,`#```!_C]@@%P$*`/^'V``?+]AF-P"``!!`"``?#]@4#4!`"``E-P"``"`
+M``@`?`!0X`$```'^/V``5P0H@#T`(`!\'V!P-0$`(`!HW`(```0`"`!ZX%>!
+M(0`@`'Q?8)S<`@```"$(`/K@5Y`U`0`@`($#`"``?!]@>-P"```"`!``@B!0
+M``(!$``0$2@`-0`@L#4!`"```'Q?8'7<`@``!`$(`'K@5X(#`""`#!$H`((@
+M4`!\'V#0-0$`(`"@M`(`(`,`$"0#`!``+P`@`((@4``"01``?!]@T-P"`/`U
+M`0`@````0`@`>N%7`00`(`!\/V!JW`(``(0`"`%ZX%>"`0`@$#8!`"``````
+M4`""(%```@$X`'P_8&BN`@``@``(`7X`0`"``!`P-@$`(``#_A]@`-CL+P!\
+M'V!PW`(```!`"`!\/V"4W`(``(``"%`V`0`@`````4``@``0`'P`4.`!```!
+M_C]@`#<$*`+^'V``?+]A<#8!`"``F-P"`(`;`"``?!]@:-P"```$``@`>N!7
+M`@@`(`""(%"0-@$`(```?%]@==P"```"01`#_A]@@,KL+P'^'V``@`80````
+M4+`V`0`@``""(%``+00H`?Y_8`!\'V!IW`(```9`$(`1`"``?!]@T#8!`"``
+MB-P"``````@`?#]@A-P"``"`(`@`?%]@Z-@"````80CP-@$`(``.B$$($(AA
+M"``(@E``.MLO`?X?8``FY2\`@B!0`'P?8!`W`0`@`'3<`@```D`0`.(0*``'
+M`"!X_A]@`'P_8(<$``"`)A$H,#<!`"``@`0`(`)^@($`?(8!1#<!````!C@3
+M30``,TT``%M-``!0-P$`(`">30```(`&$!``K@D4`,X)!(#M"R"`#S@8$&X+
+M!#X.$'`W`0`@```V#A``.&YC$'Z.4P!\7V!UW`(```0A"`#ZX%>!!0`@D#<!
+M`"```((@4``"01``>N!7@@``(`'^'V``?#]@G-P"``"``!"P-P$`(`````!0
+M`OX_8(`,!"@$@.T+((`/.!`0;@L$/@X0`#8.$-`W`0`@```X;F,<?HY3$!H.
+M$!0<#A`8'@X0`'R_87C<`@``@$8(\#<!`"```'KA5P$B`"``?-]A<-P"````
+M)P@`^N!7@1\`((!7`"@0.`$`(```@$8(```G"`"$($``_*!1X`$````:(%``
+M_"!@````@#`X`0`@``#ZX%>"!@`@`!O@5X$%`"``?-]A<-P"````)P@`FJ!!
+M4#@!`"```!H@4`#\(&````"``/K@5P(!`"``&^!7@OK_)P`2V2]P.`$`(```
+M`.!A@$H`*``:(%``_"!@````@`#ZX%>"!@`@`!O@5Y`X`0`@`($%`"``?-]A
+M<-P"````)P@`FJ!!`!H@4`#\(&````"`L#@!`"```/K@5P(!`"``&^!7@OK_
+M)P!\'V"8W`(`````"`)ZX%?0.`$`(`""!0`@`/PF0.`!````?!]@E-P"```"
+M`!``G@=@@`39+_`X`0`@``":!F`!_C]@@.0#*``!`"``G@=@@`'9+Q``K@D4
+M`,X)$#D!`"``&`#N"02`[0L@@`\X'!!N"P``H`@`@(`(``IB0``&`1`P.0$`
+M(``$`(`(!(!@"`"(84`$!@$0``"!"```H`@`"@)0`("`"%`Y`0`@```!XE<!
+M`0`@`?X!0`0``1``@`\X``"`"`"`0`@`!>)7<#D!`"```?Y_8`*&85``!>)7
+M`?Y?8`X$05`$`(`(!(`@"``#XE>0.0$`(``!_A]@`@``4``#XE<!_C]@#H(@
+M4`#ZX5<!`@`@`'K@5[`Y`0`@``$!`"````!0@`0`(`#ZX%<"`@`@`'K@5P$"
+M`"``>N%7T#D!`"```0$`(`'^'V"````@`OX?8`"`#S@`?!]@`+\"```!``CP
+M.0$`(```@`\X!#X.$``V#A``.&YC)'Z.4Q`:#A`4'`X0&!X.$!`Z`0`@````
+MH&$`W=@O``#`88#X_R\``.!A^/\-0/S_+4"`.``H,#H!`"```'K@5X$``""`
+MNA`H^($-"``0(!@0?D"(_($-"``>8$!0.@$`(``%_@"```(`4`)^`(```@!`
+M`WX`@``&`$``$&`8`'P`8'`Z`0`@````__\0?B"(!7X!@``$`%`"?@"```0`
+M0`-^`(```B!`D#H!`"```)``&!!^`(``!@!``(`&$!#^`(@$@`80`!P'8(#,
+MV"^P.@$`(`````!0$`"N"10`S@D8`.X)!(#M"R"`#S@D$&X+!#X.$-`Z`0`@
+M```V#A``.&YC&'Z.4_C_#4``XO\O`'K@5X$``"``I!`H\#H!`"``^(%-"/R!
+M+0@%?F&("WX!B``&8$`,?@&(``9`0!O^`(`0.P$`(```!$!`%?X`@``$0$`4
+M_@"```0`0`2`[0L@@`\X&!!N"S`[`0`@``0^#A``-@X0`#AN8Q!^CE,```!A
+M`(+@8``$H6``$`1@4#L!`"```(XC8(#!_R\``,!@`'KC5P(%`"````!0`(`"
+M$`2``A!P.P$`(`"`!@`@`!`$8`".(V``!``@`(X#8``0)&"``@`@`7KC5Y`[
+M`0`@``'\_R<">N-7@?S_)P`!`"``BD)@``(`*``,`V`$@.T+L#L!`"``((`/
+M.!`0;@L``*`(`("`"`"(8E``!@$0!`"`"`2`8`C0.P$`(```!F)0!`8!$```
+MH`@`@(`(`(GB5P8!`"#__P%`!``!$/`[`0`@``"`#S@$/@X0`#8.$``X;F,@
+M?HY3$!H.$!0<#A`8'@X0$#P!`"````"@80""X&'\_\U!`?X?8``<)V``IP8H
+M`'K@5P(6`"`P/`$`(```?!]@/+@"````0`@`?>%7@#X```('`"#\@2T(`/K@
+M5U`\`0`@`((%`"````!0`!PG8`"@!B@`>N!7`@\`(/R!+0@``A]0<#P!`"``
+MZ`,```"`!Q``D/TO``L`(`!\'V`\N`(```!`"/R!+0B0/`$`(````@%0``/A
+M5P8!`"``?`!`@3X````<QU$`?>!7Z`,``+`\`0`@``4#`"`!?L=!`'P`4.@#
+M````?>!7Z`,```;]_R<`@`<0T#P!`"```(7]+P`<`$``@`80````4!``K@D4
+M`,X)&`#N"02`[0OP/`$`(``@@`\X(!!N"P0^#A``-@X0`#AN8R1^CE,0&@X0
+M%!P.$!`]`0`@`!@>#A`<(`X0("(.$```H&&!_A]B-/X_8@!\'V#@K`(`,#T!
+M`"`````@"`'^`&``>N!7@0(`(`!\'V!0WP(`````"`!ZX%=0/0$`(``"`0`@
+M(_X?8(`^`"`0_@!@`'K@5P$#`""``0`@`(#8+W`]`0`@```<!V"`<]@O````
+M4``Z`"`(_@!@`'K@5X$(`"``;M@OD#T!`"````#`80!\'V`,`"`(`'G8+P``
+MX&$`^N97@0$`(`#\YVFP/0$`(`````"```$`(`#\YV'___]_`)X'8`!\/V`,
+M`"`(@//_)]`]`0`@`(!EV"\``,!A`'P_8(BV`@``FT`0`'P?8`D`(`@`;]@O
+M\#T!`"````"@80#\)F@```"``'P?8`D`(`@`;=@O`'P?8`P`(`@0/@$`(`"`
+M:M@O``#@80#\!V````0``'K@5X$``"`!_A]B`/SG:3`^`0`@`````(``G@=@
+M`'P_8`P`(`B`9=@O'WX(8`!ZX%<!&``@4#X!`"```/KH5P$7`""`?@A@`'K@
+M5P!\'V`,`"`(@00`(`!?V"]P/@$`(````.!A`/P'8```!```>N!7`0X`(']^
+M"&(*_C]B@`T`()`^`0`@`(!:V"\``.!A`/P'8```!```>N!7@@D`(`!\/V"(
+MM@(`L#X!`"```(4`"``@`&``>N!7@0$`(`#\YVD```"```$`(`#\YV'0/@$`
+M(`#___]_`)X'8`!\/V`,`"`(@%'8+P`@"$"`?@!J"OX_8O`^`0`@```!`"#_
+M_PA```X@&A]^"&``>N!7`0$`(`#ZZ%<"Z?\G$#\!`"```/P'8/___W\`?#]@
+M#``@"(!)V"\`^NA7@@(`(`!\/V`P/P$`(`"(M@(`!($`"`%^`$`$@0`0`'P?
+M8`D`(`@`FB9@@,/_)U`_`0`@`!``K@D4`,X)&`#N"1P`#@H@`"X*!(#M"R"`
+M#S@D$&X+<#\!`"``!#X.$``V#A``.&YC$'Z.4P```%``KO\O!(#M"R"`#SB0
+M/P$`(``0$&X+!#X.$``V#A``.&YC''Z.4Q`:#A`4'`X0&!X.$+`_`0`@``":
+MIE$`',=1`'S_8?C>`@`"F@<``)8!*```(&`"F@<`T#\!`"```'K@5X$&`"``
+M?%]@E+4"````00@``B%@`/K@5P$"`"#P/P$`(```?"=`N+X"``"!0!`!?L=!
+M`?ZF00[ZYE>+]?\G````4!!``0`@``!\)T"XO@(``(%`$!``K@D4`,X)&`#N
+M"02`[0L@@`\X,$`!`"``'!!N"P0^#A``-@X0`#AN8ZA^CE,`AF%0#OX?8&B!
+M#1!00`$`(```?!]@E*X"````(`@`^N!7`0X`(`"&`4``!@!``GX`@'!``0`@
+M``"`34!P?X%`"(@`"```@A`*B``(`@""$`R(``@$`((0D$`!`"``:H@`"'8!
+M01!HB``(=P%!$&2```AX`8$0`?YA0`"`(`BP0`$`(```^N!7@O7_)VR'#1``
+MA@%```8`0`)^`(`(?@!`:/\M0-!``0`@`(`*#B@$@.T+((`/.*@0;@L$/@X0
+M`#8.$``X;F,H?HY3\$`!`"``$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0`(*@
+M89#^1D(000$`(```GN=1`(9A4`"B*%(,`"`(``2A8!2(!@H"_A]@`/R&0#!!
+M`0`@```"``#I`4(0`"#(80!ZZ%>!(0`@`(@`"``"@$`"B.`(4$$!`"```_X(
+M@```B4$`'D80``#)0`$&0Q`$"`,0`!`$40`0)&%P00$`(```C^)7B@(`(`'^
+M/V$`"H)``(H#4``0X!B`!@`@`(_B5Y!!`0`@`((!`"`!_C]A`?X?80`$`"`!
+M_A]A`@Z#$`".`E``$*`8L$$!`"````X(4``0`!H!_@%```Y@&`#ZY%>!!P`@
+M`_X(@```R4#000$`(``""H,0`00#"$!^`&@!`$,0``H(4``0`!H`>NA7@0(`
+M(/!!`0`@```$H6`!_@=```[@&0"&85``(,AA`'KD5P$#`"`,@"`($$(!`"``
+M`/K@5X$!`"``B``(``*`0`*(X`@!_@A``!`@&A3ZZ%<P0@$`(``"`@`@6OX?
+M8-O^/V"`Q`\H@`4`(`!ZZ%>"X/\G``0`(%!"`0`@``'^'V#I`4(0````4)*`
+MAA"1AD80D)Y&$)2`!A`!_C]B<$(!`"```_X(@```R4#Y!0,(P'X`:/D!0Q"(
+MGH80>H@&"``<`$"00@$`(`",@`80`)X'0``>`$``(@!```X`&`#\AD```@``
+MZ04B"+!"`0`@```"`$#I`4(0``X@&$"$!@@`>N!7@0$`(`'^!T```@!`T$(!
+M`"``Z0%"$`#ZYU>!`@`@`/R&0``"``#I!2((`?X`0.D!0A#P0@$`(```H!]0
+M`"``:!]^`(@0`*X)%`#."1@`[@D<``X*(``N"A!#`0`@`"0`3@H$@.T+((`/
+M."@0;@L$/@X0`#8.$``X;F,@?HY3,$,!`"``$!H.$!0<#A`8'@X0'"`.$```
+MH&$+_A]@`/Q&0``"``!00P$`(`#$`4$0`'Q_8(2_`@`$A0$(Q0%!$!1^`$`$
+M@4$0``X`&'!#`0`@`&MZX%<,`0`@%/X?8`2!01``^N!7`C(`(`""(%``_$9`
+MD$,!`"````(``,D#01#__A]@RP%!$-L#01#*`T$00X0&"`!ZX%>P0P$`(`""
+M`0`@2(0&"`!ZX%>"`@`@`/Q&0``"``#*!0$(!'X`:-!#`0`@`,H!01``@B!0
+M`/Q&0``"``#:`T$04X0&"`!ZX%<!`0`@\$,!`"```?X?8-H!01!`A`8(`'K@
+M5P$-`"`!?@!0`/Q&0``"```01`$`(`#+`4$00(0&"`5ZX%<"#``@`((@4$&$
+M!@@`@>!7"@4`(#!$`0`@`#B`!@@"`F```/Q&0``"`````@%`S0=`$`'^($!!
+MA`8(4$0!`"```('@5PO[_R=!A`8(`/Q&0``"``#,`4$0@`(`(`#\1D!P1`$`
+M(````@``R@4!""!^`&C*`4$0480&"`!ZX%>!`@`@`/Q&0)!$`0`@```"``#*
+M!0$("'X`:,H!01!4A`8(`'K@5X$"`"``_$9`L$0!`"````(``,H%`0A`?@!H
+MR@%!$%*$!@@`>N!7@0(`(`#\1D#01`$`(````@``R@4!"(!^`&C*`4$0`'P?
+M8&#@`@``1``(!'K@5_!$`0`@`(($`"!<A`8(_'X`8(!ZX%>"`@`@`/Q&0``"
+M``#*!0$($$4!`"```7X`:,H!01!*A`8(`GK@5U:()@@"`0`@`((`0(```"`P
+M10$`(```@`"```(`:`#\1D```@``Q@&!$`"5#"@`_$9```(``%!%`0`@`,8)
+M(0@``@!@Q@&!$$B$!@@!?@!0#WK@5XT'`"``"0`@<$4!`"```((@4``2`"`!
+M_A]@R`%!$``1`"`"_A]@R`%!$(`/`""010$`(``#_A]@R`%!$``.`"`$_A]@
+MR`%!$(`,`"``@B!0`/Q&0+!%`0`@```"````"@`@`GZ`@0!\A@'(10$````&
+M.%Q1``!>40``T$4!`"``:E$``&%1``!J40``:E$``&I1``!D40``:E$``&I1
+M``#P10$`(`!J40``:E$``&I1``!J40``:E$``&=1``#(`T$0`/Q&0!!&`0`@
+M```"``#(!0$(`'K@5X(!`"#*!0$(!'X`:,H!01!.B"8(,$8!`"``B(@&"`"!
+MX%<"`P`@`((@4`#\1D```@``W`.!$(R`!@A01@$`(```!0`@`7X`4`"!X%<"
+M`0`@C(`&"(```"`<B`8(`/Q&0'!&`0`@```"``#<`8$0'(@&"-X!@1"`3]<O
+M``#@80!\WV&TMP(`D$8!`"````!'"`-^(8``_$9```(``,0!`0@`?+]AM+4"
+M``":`$*P1@$`(```FH!!```&$,@)`0@$`(@0`$?\+P8`B!```$<(`WXA@-!&
+M`0`@``*"!@"`?@!H`((F0`"`0!`!?@%`/WX`8```!Q``G@=@\$8!`"```$37
+M+Q``K@D4`,X)&`#N"1P`#@H$@.T+((`/."`0;@L01P$`(``(?HY3!#X.$``V
+M#A``.&YC.'Z.4Q`:#A`4'`X0&!X.$#!'`0`@`!P@#A`@(@X0)"0.$"@F#A`L
+M*`X0,"H.$#0L#A`0B@T04$<!`"``%(P-$`""H&$`!.%A`(:A8@`(@F("?@""
+M```(0@-^"()P1P$`(```?-]AU+X"```@9T(``$!"``!)0@)^28(`?-]BE,("
+M`)!'`0`@```D*T(`+=<O"(`H"#_ZX%<%`P`@@"W7+QG^'V`$_C]@L$<!`"``
+M``1!4``5""B`$0`@`"0K``3^0(``("<``(1@0`!ZZE?01P$`(```'"A``0$`
+M(`B`0`B````@#(!`"``J06@`&B%X`)X@>/!'`0`@``R"`1`(G@$0!)H!$`"$
+M`1``@"@(`_Y@@`2`20@`!H%`$$@!`"``$(`M"``&84``@@$0%(`M"`0"`A`(
+M@"@(`?X@0`B""!`P2`$`(```@"@(`?X@0#_^(&``@@@0`!K7+P```%`0`*X)
+M%`#."5!(`0`@`!@`[@D<``X*(``N"B0`3@HH`&X*+`"."C``K@HT`,X*<$@!
+M`"``!(#M"S@0;@L@@`\X"'Z.0P0^#A``-@X0`#AN8R1^CE.02`$`(``0&@X0
+M%!P.$!@>#A`<(`X0("(.$```P&$`'*=A`)KF0;!(`0`@``":YT$"_N>!`'P_
+M8I3"`@``G@A"``?7+P`(@E``GNA!T$@!`"```(@'$`0("!`("`@0`((@4`+^
+M1H``&D%``WY!@`!\?V#P2`$`(`#4O@(```9A``3^0(``"()0`(2!00`(!A``
+M>N=7`@(`(!!)`0`@``!\GV`$`"$``(1!0`0(`1`!>N=7@@4`(`!\GV`$`"$`
+M,$D!`"```OY&@``:04`#?D&``'Q_8-2^`@``!F$`!/Y`@`"$04!020$`(``(
+M"`$0`?X@0$#ZX%<+\/\G`/;6+P```%`0`*X)%`#."7!)`0`@`!@`[@D<``X*
+M(``N"@2`[0L@@`\X)!!N"P0^#A``-@X0D$D!`"```#AN8Q!^CE,```!0`'P_
+M8#````D`^=8O!(#M"R"`#SBP20$`(``0$&X+!#X.$``V#A``.&YC$'Z.4P``
+M`%``?#]@,```"=!)`0`@`(#SUB\$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,4
+M?HY3\$D!`"``$!H.$```H&&`\?\O!/X?8`":)F``UM<O`/7_+Q``K@D02@$`
+M(``$@.T+((`/.!00;@L$/@X0`#8.$``X;F,4?HY3$!H.$#!*`0`@````H&$`
+MZO\O`OX?8`":)F``TM<O@.W_+Q``K@D$@.T+4$H!`"``((`/.!00;@L$/@X0
+M`#8.$``X;F,4?HY3$!H.$```H&%P2@$`(`"`XO\O`?X?8`":)F"`RM<O`.;_
+M+Q``K@D$@.T+((`/.)!*`0`@`!00;@L$/@X0`#8.$``X;F,4?HY3$!H.$```
+MH&$`V_\OL$H!`"``"/X?8`":)F``P]<O@-[_+Q``K@D$@.T+((`/.!00;@O0
+M2@$`(``$/@X0`#8.$``X;F,4?HY3$!H.$```H&&`T_\O`_X?8/!*`0`@``":
+M)F``N-<O`-?_+Q``K@D$@.T+((`/.!00;@L$/@X0$$L!`"```#8.$``X;F,4
+M?HY3$!H.$```H&$`S/\O````4`":)F`P2P$`(```M-<O@,__+Q``K@D$@.T+
+M((`/.!00;@L`@`\X!#X.$%!+`0`@```V#A``.&YC$'Z.4P""(%``?!]@\-P"
+M```"`!````!0<$L!`"```&/I+P```%"`;-TO@.G]+P!\/V",VP(`!(``$`!\
+M'V"02P$`(`!,L0(`$/X_8``$05"`O_@O!(#M"R"`#S@0$&X+!#X.$+!+`0`@
+M```V#A``.&YC%'Z.4Q`:#A``?+]A]-P"``"`!@@`>N!7T$L!`"```1(`(/]_
+M`$``@`80`'K@5P(0`"`!_A]@`%3I+P'^/V#P2P$`(```?!]@2-@"```"0!`!
+M_A]@@%O=+P'^'V``6^(O%/X_8!!,`0`@``!\'V#SVP(```)`$`!\'V#HV`(`
+M```@"`R$``@`@`80,$P!`"```?Z_80!\'V#PW`(``!H`$`!\'V#8W`(```!`
+M"!R```A03`$`(```!`!``?X_8("+`2@`F@9@@```(````%`0`*X)!(#M"W!,
+M`0`@`""`#S@4$&X+`(9A4`'^/V``?)]@.,$"``@%0@@`>N%7D$P!`"```0<`
+M(`!\GV`XP0(``(A!0`@%00@`!>!7`@$`(`""`&"P3`$`(`"``P`@`?YA0`""
+M($``B$%`"`5!"`!ZX5<"^?\G````4-!,`0`@``"`#S@`!$%0`GYA@`!\GV!0
+MVP(``(@A```#X%<"`@`@\$P!`"``````4`"(@4````(0@`$`(`%^04`$>N%7
+MB_G_)P"`#S@030$`(``$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A"`ZO`O``"@
+M83!-`0`@``#ZYE<!)P`@"/X&0(#OYB\`?!]@!*\"``````@`#@`84$T!`"``
+M`'P_8%C?`@``@"`(`?X@0`".(!ANB$8(``Y!&`/^?V!P30$`(```(^<O`!S'
+M40```%"`N^4O```@8`#ZX%>!!``@!_K@5Y!-`0`@`($#`"`(^N!7@0(`(`+Z
+MX%>!`0`@`7['005ZYU<%^?\GL$T!`"``!_K@5X("`"``?-]AN+X"`#@!!P@!
+M?@!`.`$'$`#ZX%?030$`(`""#@`@`)H&8(#1ZR\`F@9@`((@4``B\2\`?#]@
+MF*X"`/!-`0`@``"```@!?@!``(``$`!\/V!0L`(`"(@&"`"`@!`*B`8($$X!
+M`"```H"`$`R(!@@$@(`0@%O[+P!\WV&XO@(`$`$'$!@!!Q`P3@$`(```D_TO
+M`'P_8(2N`@``@``0`?X?8(`%`"`'^N!7`00`(%!.`0`@``":!F``$/$O`'S?
+M8;B^`@`0`0<(&`$'$`!2^R\0`0<0<$X!`"``````4!``K@D4`,X)!(#M"R"`
+M#S@8$&X+!#X.$``V#A"03@$`(```.&YC''Z.4Q`:#A```"!@^/\-0`B(0`@`
+M!(`0"HA`"+!.`0`@``($@!`,B$`(!`2`$(#0\"\`>N!7@04`(`":IE$```!0
+MT$X!`"```)'E+P!ZX%<"`0`@`?X?8(`"`"`!_@9```Z@&07ZYE?P3@$`(``+
+M^_\G````4!``K@D$@.T+((`/.!P0;@L$/@X0`#8.$!!/`0`@```X;F,@?HY3
+M$!H.$!0<#A`8'@X0'"`.$`">YU$`?!]@,$\!`"``^-L"````H`D0@,8)`((@
+M4$`"1Q`!_E]@0P1'$#8$1Q!03P$`(```?!]@U=P"```$``A(`$<04`)'$!P"
+MAQ!1`D<04@)'$'!/`0`@`%,$1Q!4!$<0@/X?8%P`1Q!=`D<0_Y$?&&``AQ!B
+M`(<0D$\!`"``9`"'$`!\7V#HV`(````!"``((`AL`H<0`@@@"&X"AQ"P3P$`
+M(``$""`(<`*'$`!\7V"<N`(```@A"&8"AQ`"""$(:`*'$-!/`0`@``0((0AJ
+M`H<0#(!&"``((0@`A"!`#@A`"`B$@!`*"``(\$\!`"``"H"`$`S^'V(`!$%0
+M`'Q_8`?<`@`!A`$(`GX`0``!X5<04`$`(`"&!@`@`'Q_8`?<`@`"A`$``*"`
+M00``1A`!?@A``!``&C!0`0`@``%^`4``$$`8`80!"`)^`$```>%7A?G_)P`$
+M05``?']@4%`!`"``W=P"``&$`0@"?@!```'A5X8&`"``?']@W=P"``*$`0!P
+M4`$`(```H(!!``!&$`%^"$``$``:`7X!0``00!@!A`$(`GX`0)!0`0`@```!
+MX5>%^?\G`_X?8`"@@$$``$80`7X(0``0`!H!_E]@L%`!`"```*"`00`$1A`!
+M?@A``!``&@!\7V#HV`(````!"`8$``C04`$`(```H(!!``!&$`%^"$``$``:
+M!OX?8`"@@$$``$80`7X(0/!0`0`@```0`!H"_A]@`*"`00``1A`!?@A``!``
+M&@```0@0"``($%$!`"```*"`00``1A`!?@A``!``&@```0@0"``("'X`D`"@
+M@$$P40$`(````$80`7X(0``0`!H`?)]@J+@"`````@@`>N!7@2$`(%!1`0`@
+M```$``@`H(!!``!&$`%^"$``$``:```""`$$``@`H(!!<%$!`"````!&$`%^
+M"$``$``:```""`($``@`H(!!``!&$`%^"$"040$`(```$``:```""`,$``@`
+MH(!!``!&$`%^"$``$``:```""+!1`0`@``0$``@`H(!!``!&$`%^"$``$``:
+M``1!4`!\'V#GW`(`T%$!`"````0`"``!X5<*$``@``1A0`"$84``?)]@J+@"
+M`````@CP40$`(```!@!`!00`"`"@@$$``$80`7X(0``0`!H```((``8`0!!2
+M`0`@``8$``@`H(!!``!&$`%^"$``$``:```""``&`$`'!@`(,%(!`"```*"`
+M00``1A`!?@A``!``&@%^`4``$$`8`'P?8.?<`@!04@$`(```!``(``'A5POP
+M_R<`@B!02@)'$$X"AQ`"_A]@-0!'$'!2`0`@``!\'V#HW`(````@"`#ZX%<!
+M`0`@````4`""`#@`'@A`D%(!`"``#(!&"`(`@1`4((<0`)H&8!``K@D4`,X)
+M&`#N"1P`#@JP4@$`(``$@.T+((`/."`0;@L`"()0`'KA5XX#`"``!&`(`(9`
+M$-!2`0`@``%^@D`!?@!``?X@0``)X5>-_/\G`(`/.`S^OV``@`$0\%(!`"``
+M!'Z`0`2(`1`(?H!`"(@!$`I^@$`,B`$0``B"4!B(`1`04P$`(``<B`$0((@!
+M$"2(`1`HB`$0#/K@5PP4`"``"0`@`(""0#!3`0`@`!"(`1"`#@`@`(""0!2(
+M`1``#0`@`(""0""(`1"`"P`@4%,!`"```(""0!R(`1``"@`@`(""0"B(`1"`
+M"``@`(""0"2(`1!P4P$`(```!P`@`@J```9ZXE>-!0`@`GZ"@0!\A@&04P$`
+M```&.)!3`0`@`,M4``#.5```ZU0``-14``#15```UU0``-I4````"H!`L%,!
+M`"```02""`)^@D``"H)``!"B&`"+X%>)]?\G*(`A"`#ZX%?04P$`(``!$@`@
+M`WX!D``0P!@$A``(_G\`8``0H!@`"@-0`!"`&/!3`0`@```+XU<+!@`@`80`
+M"`-^`%``$``8``'B5XD#`"``B`!`$%0!`"``!00@"`=^`6`!@!^```(`8"R`
+M01```0`@``B"4"R(01`P5`$`(``LA`$(`'K@5X$"`"``?#]@@*X"``"```@!
+M?@!``(``$%!4`0`@`"B`(0@$A``(`7X`8"V`01"``0`@``B"4"R(01`MB$$0
+M<%0!`"```(`/.`0^#A``-@X0`#AN8Q!^CE,`?%]@B-@"````P0B05`$`(```
+M>N-7`0@`(`P`H`@0`(`(.`AB"`*(0@@`!D%0`H2"$+!4`0`@`#@(8@@`B$((
+M``9!0`"$@A`X"&((%`A""``&05`4!((0T%0!`"````(#.(```""`-.PO!(#M
+M"R"`#S@0$&X+!#X.$``V#A#P5`$`(```.&YC''Z.4Q`:#A`4'`X0`)JF40!\
+M/V```"$`",1`"!!5`0`@``S$``@`!`!@``[`&2!^!V``>N!7`0$`("#^'V`(
+M@$`4,%4!`"``$'X'8`!ZX%<!`@`@$/X?8`!\/V```"$`"(!`%`%^!V!050$`
+M(```>N!7`04`(`!\'V!LX`(`````"`!ZX%>!```@``(`.'!5`0`@``'^7V``
+M?#]@```A``B$0!0"?@=@`'K@5P$%`"``?!]@D%4!`"``<.`"``````@`>N!7
+M@0``(``"`#@"_A]@`'P_8```(0"P50$`(``(@$`4"'X'8`!ZX%>!#P`@````
+M4/^!31`(_A]@`'P_8-!5`0`@````(0`(@$`4`&3Z+P!\/V",V`(`,(``$/__
+M#4``8^TO\%4!`"````#`80!ZYU<!!``@``@'"``<`$"`/-XO``"@80#ZYE<0
+M5@$`(``"#@`@`!P'8`#X["\`?!]@M+@"``5%``@`>N!7`O/_)S!6`0`@`/^%
+M#0@`>N!7@O'_)P!\/V```"$`",1`"`S$``@`!`!@4%8!`"````X`&$!^`&``
+M>N!7@00`($#^'V`(@$`4#,0`"+]_`&!P5@$`(``,@$`4`?Y?8`!\'V"TN`(`
+M5`5`%`":!F`0`*X)%`#."9!6`0`@``2`[0L@@`\X'!!N"P0^#A``-@X0`#AN
+M8Q1^CE,0&@X0L%8!`"```'R_8/C;`@``@`(($`!`"`P`8`@`B($(`OX?8`*`
+M@1#05@$`(``4`($0`)JF44`:01`!_C]@0P)!$`!\'V"DN0(`:04`"/!6`0`@
+M`#8`01!*&D$0`'P?8`;<`@``!``(2`!!$$X:@1`"_A]@$%<!`"``-0!!$%`:
+M01`<&H$041I!$%("01!4&D$04QI!$*#^'V`P5P$`(`!<`$$071I!$`!\'V#H
+MV`(`````"``((`A@`H$0`@@@"%!7`0`@`&("@1`$""`(9`*!$``((`AL`H$0
+M`@@@"&X"@1`$"``(<%<!`"``<`"!$`!\/V"<N`(``(@`"&8`@1`"B``(:`"!
+M$`2(``B05P$`(`!J`($0&/X?8'H`@1`!_A]@``9B0`"`@1``@`((`?X_8+!7
+M`0`@``")[2\`>N!7@@,`(`!\/V``K0(``(``"`%^`$``@``0T%<!`"```)H&
+M8``#`"``?#]@:*T"``"```@!?@!``(``$`'^'V#P5P$`(``0`*X)!(#M"R"`
+M#S@4$&X+`'P_8!'=`@``@$`0`?X_8!!8`0`@``!\'V`0W0(```)`$`"`#S@$
+M/@X0`#8.$``X;F,0?HY3,%@!`"```'R?8`W=`@``!*((`'Q_8`#=`@``@$$(
+M`(`!$``"0A!06`$`(```B^!7`0,`(`!\/V#XW`(``(0`"`!ZX%<!"``@``4`
+M('!8`0`@``#ZX%>!!@`@```A4`#\(&````"``/K@5P($`"```>%7D%@!`"``
+M`0,`(`#X_R<```!0`(!`$`!\'V#,LP(``"/X+P2`[0NP6`$`(``@@`\X$!!N
+M"P0^#A``-@X0`#AN8Q!^CE,!^N!7@@$`(-!8`0`@``!\7V`$W0(````!$`!\
+M'V`.W0(```)`$`#ZX%<!!0`@\%@!`"```'P_8/C<`@``A``(`'K@5X$"`"``
+M``!0`(!`$`!\'V`060$`(`#,LP(`@!7X+P2`[0L@@`\X$!!N"P0^#A``-@X0
+M`#AN8S!9`0`@`!!^CE,!^N!7@@$`(`!\7V#\W`(````!$`!\'V`,W0(`4%D!
+M`"````)`$`!\/V"4O0(``(0`"`!ZX%<!`0`@````4`"`0!!P60$`(```?!]@
+M#-T"```$``@`>N!7`04`(`!\/V#XW`(``(0`")!9`0`@``!ZX%>!`@`@````
+M4`"`0!``?!]@S+,"```#^"\$@.T+L%D!`"``((`/.!`0;@L$/@X0`#8.$``X
+M;F,0?HY3`?K@5X(!`"#060$`(```?%]@"-T"`````1``?!]@#]T"```"0!``
+M^N!7`04`(/!9`0`@``!\/V#XW`(``(0`"`!ZX%>!`@`@````4`"`0!``?!]@
+M$%H!`"``S+,"`(#U]R\$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,P6@$`(``<
+M?HY3$!H.$!0<#A`8'@X0`)JF40!\WV&@M`(``'_G05!:`0`@`&!_)T``G@=@
+M``1!4("K]R\`?#]@^DP```">!V"`&N<O<%H!`"```'P_8.W<`@``A``(`GK@
+M5P("`"``',=1`)Q`$(#^^B^06@$`(`"`^_\G`'S_80W=`@``A"<(`OK@5X(#
+M`"``',=1`)Q'$+!:`0`@`````%`!_C]@``1!4(`J^R^`]?\G`'Q?8`S=`@``
+M!"$(T%H!`"```OK@5P("`"``',=1`!Q!$(#-Z"\`\?\G`'Q?8`[=`@#P6@$`
+M(```!"$(`OK@5P%Q`"``?#]@$-T"``"$``@`>N!7@08`(!!;`0`@```<QU$`
+MG$`0`'P?8-#<`@```$`(`'KA5X'H_R<`?!]@,%L!`"``$=T"```$(`@!_A]@
+M``(!.(#E_R<`M]0O`!S'40!\?V!06P$`(``8W0(``)P!$`"$)P@`^N!7@0(`
+M(`!\/V``W0(``("@"7!;`0`@``'^/V``@@$0`'Q?8`S=`@``!"$(`/K@5P$+
+M`"``?']@D%L!`"``&-T"``"`(0@`^N!7`04`(`!\/V#\W`(``(!`"`"$)E"P
+M6P$`(```_"!@````@`#ZX%>"!``@`(7F5X$#`"``?#]@_-P"`-!;`0`@``"`
+MH`D"_C]@`'Q_8!C=`@``@@$0`'Q?8`[=`@``!"$(\%L!`"```/K@5P$+`"``
+M?']@&-T"``"`(0@`^N!7`04`(`!\/V`07`$`(``$W0(``(!`"`"$)E``_"!@
+M````@`#ZX%>"!``@`(7F5S!<`0`@`($#`"``?#]@!-T"``"`H`D#_C]@`'Q_
+M8!C=`@``@@$04%P!`"```'Q?8`_=`@``!"$(`/K@5P$+`"``?']@&-T"``"`
+M(0AP7`$`(```^N!7`04`(`!\/V`(W0(``(!`"`"$)E``_"!@````@)!<`0`@
+M``#ZX%>"!``@`(7F5X$#`"``?#]@"-T"``"`H`D$_C]@L%P!`"```'Q_8!C=
+M`@``@@$0`?Y?8`!\/V#XW`(``(1`$("(U"_07`$`(```?']@&-T"``"`(0@`
+M^N!7`@4`((""^2\`?-]AH+0"`/!<`0`@`%`!!Q`L?P=`__\_8`!O]R\`?_DO
+M5`$'$("L_R>`M_LO$%T!`"```(!&4`!\(6````"``/K@5P((`"``&^!7`0<`
+M(`5^X8DP70$`(```^N=7@04`(`!X^2\`?-]AH+0"`%@!!Q`L?P=``)XG8%!=
+M`0`@`(!D]R\``.!A`'3Y+UP!!Q"````@#?[_80`<QU$`?#]@<%T!`"``^-P"
+M``"<0!`-^N=7`I[_)P!\?V`8W0(``(`A"`+ZX%>070$`(`""!``@`'Q?8`S=
+M`@``!"$(`/K@5P$"`"`!_C]@`'P?8+!=`0`@`!3=`@```@`0`)H&8(!L`2@`
+M?#]@5-P"``"``!```$!@T%T!`"```'Q_8!C=`@``@"$(`?K@5X(&`"``?/]A
+M#=T"``"$)PCP70$`(```^N!7`00`(``<QU$`G$<0`'P_8`#=`@``@``(`((@
+M4!!>`0`@``#`^B\`B_\G`'Q_8!C=`@``@"$(`OK@5P(&`"``?%]@,%X!`"``
+M#-T"```$(0@`^N!7@0,`(``<QU$`'$$0@&#H+P!\'V!07@$`(``4W0(``!P`
+M$(""_R<`?']@&-T"``"`(0@#^N!7@@0`('!>`0`@``!\7V`.W0(```0A"`#Z
+MX%<!`@`@`!S'40`<01"`E_TOD%X!`"``@'O_)P!\?V`8W0(``(`A"`3ZX%<"
+M>?\G`'Q?8`_=`@"P7@$`(```!"$(`/K@5X%V_R<`',=1`!Q!$(#("2B`=/\G
+M!#X.$-!>`0`@```V#A``.&YC''Z.4Q`:#A`4'`X0``"@80":QF$`0M0O\%X!
+M`"``_/^-0`+^1H``&D%``WY!@`!\/V#4O@(```)A``":1D`07P$`(```&D%`
+M`GY!@`!\(4"4P@(`!(`@"`3^((``AB!```("$#!?`0`@``1^)X``?']@E+X"
+M``"&0$``AF``_($M"`""`1`,`"$(4%\!`"```/Q@:``!```$`"$(`(8`%``V
+MU"\```!0$`"N"10`S@EP7P$`(``$@.T+((`/.!P0;@L$/@X0`#8.$``X;F,8
+M?HY3$!H.$)!?`0`@`!0<#A``@J!A``#`80-ZX%<-!0`@``<`((`!`B@`@`80
+ML%\!`"``@`D`(``$`B@`@`80``@`((`3`B@`@`80@`8`(#/^'V#07P$`(``1
+M_C]@``1!4(`0!2B`"@`@`GZ`@0!\A@'P7P$````&./!?`0`@`.I7``#M5P``
+M\%<``/-7````@`8(`'K@5X$$`"`$?B>`$&`!`"```'P?8)2^`@``@"!`#(``
+M"`!\0&@`$```!(``"``$`!0P8`$`(`````!0$`"N"10`S@D$@.T+((`/.!@0
+M;@L`@`\X!#X.$%!@`0`@```V#A``.&YC$'Z.4P"2)%$`?!]A2-L"```2!!``
+M?#]@<&`!`"``8-L"`!"((`@`^N!7@0@`(`!\/V`$V0(`"(``"/M_`&"08`$`
+M(``(@``0#(``"`!ZX%>!!``@`'S?8%C:`@``?!]@1+$"`+!@`0`@`````Q`(
+M$@,0!`(#$`'^'V````00``B"4`1^HH``?/]@T&`!`"``%-D"``".0D`(``$(
+M]W\`8`@``1``?#]@8-L"`!"((`CP8`$`(```^N!7`0X`(`)^(&``^N!7@0P`
+M(/M_`&`(``$0#``!"!!A`0`@``!ZX%<!"@`@`'P?84C;`@```&0(`(9!0``&
+M04`"?D&`,&$!`"```'P?8%C:`@``!,!``(XB`!"`(`@(_B!```1`0``"`1!0
+M80$`(```DB11"!(#$`"*`T`$``,0`?X!0```!!`!?H)`%'KB5W!A`0`@`(7J
+M_R<`?!]A2-L"````9`@`^N%7@00`(`"&04``!D%`D&$!`"```GY!@`"2)%$`
+M?!]@6-H"````@4$`$@80@%CD+P2`[0NP80$`(``@@`\X$!!N"P0^#A``-@X0
+M`#AN8R1^CE,0&@X0%!P.$-!A`0`@`!@>#A`<(`X0("(.$`'^WV$`?!]@6+P"
+M```=0!``XM,O\&$!`"````"@80!\/V(5LP(``(0("`%ZX%>""0`@`'P?8A:S
+M`@`08@$`(```'$@0`'P?8!2S`@``'$`0`)H&8(#=TR\`?!]@)+,"`#!B`0`@
+M``#R]B\`?!]@T+("`&[^/V"`QO8O`)[G40`>2!``GD@04&(!`"````$`(`":
+M!F``U],O`'P?8&#;`@`8!``(`'K@5P$"`"!P8@$`(`````!0@'CB+X#*[B^`
+M```@`%;B+P#I[B\`GN=1`'P?8)!B`0`@`)#A`@``'@`0@,S3+P``H&$`?!]@
+M!-D"``"FVR\`F@9@L&(!`"```,S3+X!2[B\`?#]@6>`"``"$``@`>N!7@0(`
+M(`'^WV'08@$`(```?!]@6.`"```<0!``GD`0`'P?8.O;`@``!``(`'K@5_!B
+M`0`@`(("`"``?!]@6.`"```$``@`>N!7@0L`(`"+XR\`>N!7$&,!`"``@0,`
+M((!DVR\`>N!7`@(`('#^'V``?#]@,@0``("F"R@P8P$`(``!_M]A`'P?8*_@
+M`@``'$`0````4(#.["\`?!]@Z]L"`%!C`0`@```$``@`>N!7`0$`((#^'T"`
+M$=PO$`"N"10`S@D8`.X)<&,!`"``'``."B``+@H$@.T+((`/."00;@L$/@X0
+M`#8.$``X;F.08P$`(``0?HY3@*'N+WW^/Y@`?!]@,+("```"`!``JO@O`'P_
+M8+!C`0`@`-S;`@``@``0`OX?8(";W2\$@.T+((`/.!`0;@L$/@X0T&,!`"``
+M`#8.$``X;F,0?HY3!?X_8`!\'V`PL@(```(`$("A^"_P8P$`(```?#]@W-L"
+M``"``!`$@.T+((`/.!`0;@L$/@X0`#8.$!!D`0`@```X;F,8?HY3$!H.$!0<
+M#A``?#]@^-X"``!\'V"@X0(`,&0!`"````(`$````%``L.PO`'S?84[@`@``
+M!`<(`'K@5P$(`"!09`$`(`"`E=,O`)JF40`:1Q`!_E]@`'P_8-C;`@``A$`0
+M@)33+W!D`0`@``!\'V"8X0(``!I`$`+^/V``?!]@P-L"```"`!"`#@`@D&0!
+M`"```OX?8("`W2\`?#]@6+P"``&%``@`>N!7`0,`(`":IE&P9`$`(``!FT`0
+M`'P?8#"R`@``&@`0``8`(`!\'V#4K@(`````"-!D`0`@``!ZX%>!`0`@`'P_
+M8-`'``"````@??X_F`!\'V`PL@(`\&0!`"````(`$("`^"\`?#]@W-L"``"`
+M`!`0`*X)%`#."02`[0L090$`(``@@`\X&!!N"P0^#A``-@X0`#AN8Q!^CE,`
+M?!]@V-L"`#!E`0`@```$``@`>N!7@00`(`!\/V#XW@(``'P?8)SA`@```@`0
+M4&4!`"``````4`'^/V"`G^PO@!<`(`!\/V"($P```'P?8#"R`@!P90$`(```
+M`@`0@'#X+P!\/V#<VP(``(``$`!\'V"\W@(```0`")!E`0`@``!ZX%<`?!]@
+ME+4"``````@!!``@_WO@5P!\'V#XW@(`L&4!`"```08`((`[^R\`?!]@N+T"
+M```$`"#_>^!7`'P?8/C>`@#090$`(``!!``@@#?[+P!\'V"XO0(```(`(`7^
+M/V`/_E]@`?Y_8/!E`0`@`(`!`"!N_C]@>/Y?8`"&85``"()0@$#C+P!\/V"D
+MK@(`$&8!`"```(``"`%^`$``@``0!(#M"R"`#S@0$&X+!#X.$``V#A`P9@$`
+M(```.&YC%'Z.4Q`:#A````!0`&_L+P+^'V``3=TO`'0(*%!F`0`@````H&$`
+M<P@H`'Q?8#"R`@!_?B!@/_X&8`]^`$```@!`<&8!`"`````!$(!0^"\`?#]@
+MW-L"``"``!`0`*X)!(#M"R"`#SB09@$`(``4$&X+!#X.$``V#A``.&YC$'Z.
+M4P+^'V``/MTO`((@4+!F`0`@``!\'V"\VP(```)`$'W^/Y@`?!]@,+("```"
+M`!"`1?@OT&8!`"```'P_8-S;`@``@``0!(#M"R"`#S@0$&X+`()@8`"%X%?P
+M9@$`(`"*`P`@`((@0`"0(!@`@(!@`'KB5P(!`"``A>!7B_S_)Q!G`0`@``"`
+M@&``>N)7`0$`(`""`&"````@`(8!8`"`#S@``"!@,&<!`"``````4`"&85`!
+MAI^```)"8`!ZX5>!```@`!`"&`'^04!09P$`(```$&$8!/KA5XO[_R<`@`\X
+M`((@4`&"7X```$%@`'KA5W!G`0`@``$!`"``@@!@@`(`(`'^($``CB`8!/K@
+M5PS[_R<```!0D&<!`"```(`/.`""8&``A>!7#`,`(`"$(!@`@(!@`'KB5P(!
+M`""P9P$`(```A>!7"?W_)P"`@&``>N)7`0$`(`""`&"````@`(8!8-!G`0`@
+M``"`#S@`!$%0`81_@`"`(6``^N!7`0$`(`"0`1@``@`@\&<!`"```7XA0`"0
+M0!@$>N%7"_O_)P"`#S@$/@X0`#8.$``X;F,0:`$`(``4?HY3$!H.$`'^/V``
+M?!]@[-P"```"0!``?+]AI+D"`#!H`0`@`"R%!@@`>N!7`0,`(`+^'V``U-XO
+M$/\&0``O]B\```!04&@!`"``+(%&$````%"`T-DO@$WZ+P!\/V",VP(``(``
+M$!``K@EP:`$`(``$@.T+((`/.!00;@L$/@X0`#8.$``X;F,0?HY3`((@4)!H
+M`0`@``!\'V#LW`(```)`$(!%^B\`?#]@V-P"``"``!"`7_POL&@!`"```'K@
+M5P(&`"`!_C]@`'P?8$C8`@```D`0`?X?8`#"V2_0:`$`(``4_C]@`'P?8//;
+M`@```D`0`?X?8("_WB\`[>8O`OX_8/!H`0`@``!\'V#MW`(```)`$`!\'V#,
+MLP(`@!?V+P'^/V``?!]@$&D!`"``[MP"```"0!`$@.T+((`/.!`0;@L$/@X0
+M`#8.$``X;F,P:0$`(``8?HY3$!H.$!0<#A```,!A`#'Z+P`<`%``?#]@4-P"
+M`%!I`0`@`&!^`$``@``08'K@5PD'`"``+?HO``"@80#R]R\`?#]@<&D!`"``
+MC-@"``2``!`!?@=0`(`&4`!\`&````"``'K@5P+Z_R>0:0$`(`````!0@```
+M(&!^`%`0`*X)%`#."02`[0L@@`\X&!!N"[!I`0`@``0^#A``-@X0`#AN8Q1^
+MCE,0&@X0``"@80&&'Q@`Q0`HT&D!`"```(`&$`!ZX%<!`@`@`88?&`!\/V``
+M`"`(@/#2+P```%#P:0$`(``0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC
+M%'Z.4Q!J`0`@`!`:#A```*!A@/X?0`"[`"@`@`80`'K@5P$"`""`_A]`,&H!
+M`"```'P_8```(`B`YM(O````4!``K@D$@.T+((`/.!00;@M0:@$`(``$/@X0
+M`#8.$``X;F,8?HY3$!H.$!0<#A```,!A`'P?8'!J`0`@`#3!`@```:`)`)H&
+M8`"O`"@```<0`'K@5P$"`"``F@9@D&H!`"```'P_8```(`B`VM(O````4!``
+MK@D4`,X)!(#M"R"`#SBP:@$`(``8$&X+!#X.$``V#A``.&YC+'Z.4Q`:#A`4
+M'`X0&!X.$-!J`0`@`!P@#A``FJ91`'Q?8&3,`@`,`"$(`/K@5P$V`"``?#]@
+M\&H!`"``1(T"``"!`!`'_A]@_(%-$`#_($`(``$(!'Y@@!```0@0:P$`(```
+M!D``](4-$/R!K0@#_A]@!/Y_8``(@E``@L!@`'S[+S!K`0`@````(&``^N!7
+M`BH`(`!\/V"4O@(`/(``"`!\0&@``@``4&L!`"``-(``"``$`!0(_A]@_(%-
+M$/B;#1`$_C]@`'Q?8'2I`@!P:P$`(`````$(``(`$`0`(`CP_R!@`?X@:`0"
+M`!```*!A"'X`0)!K`0`@`````1``?']@Q(L"`'C^(4```^!7C@``(``&`1#T
+M_TU`L&L!`"```'S?89"H`@`8``<(````"`@`)P@#_B"``(``0````1#0:P$`
+M(``0``<(``#@"0A^!T(`I-(O"``G"`'^($``@^=7C0``(/!K`0`@``">(%``
+M`@@0`*/2+_2!30C\@:T(^('-"`/^'V``FB9@$&P!`"``"/Y_8`'^GV"`7OLO
+M```@8`#ZX%>"#``@`'P_8)2^`@`P;`$`(``\@``(`'Q`:``"```T@``(``0`
+M%`!\7V!DS`(`"``!"%!L`0`@``%^`$`(``$0$'K@5P(!`"``FJ91"!H!$`!\
+M7V!DS`(`<&P!`"``#``A"/__`$`,``$0`+0$*```(&``^N!7@0(`($G^'V"0
+M;`$`(```!$%0`'D#*``!`"`C_C]@`((`8!``K@D4`,X)&`#N";!L`0`@`!P`
+M#@H$@.T+((`/."P0;@L$/@X0`#8.$``X;F,0?HY3T&P!`"```'P_8`(`(`B`
+MDM(O````4`2`[0L@@`\X$!!N"P0^#A#P;`$`(```-@X0`#AN8Q1^CE,0&@X0
+M$?Z_@0!_TB\`R"8("/X@:!!M`0`@``""AA2`?](O$`"N"02`[0L@@`\X%!!N
+M"P0^#A``-@X0,&T!`"```#AN8Q1^CE,0&@X0$?Z_@8!WTB\+_C]@`(*&%`!\
+M/V!0;0$`(``'!P```(*&%`!WTB\"_A]@@+KV+Q``K@D$@.T+((`/.'!M`0`@
+M`!00;@L$/@X0`#8.$``X;F,0?HY3`'P?8`$`(`@`>](OD&T!`"```'P`8/_^
+M__\`?#]@`0`@"(!YTB\$@.T+((`/.!`0;@NP;0$`(``$/@X0`#8.$``X;F,0
+M?HY3`'P?8`$`(`B`<](O`'P_8-!M`0`@`#3!`@``@2`(``(`<`!\/V`!`"`(
+M`''2+P2`[0L@@`\X\&T!`"``$!!N"P0^#A``-@X0`#AN8Q1^CE,0&@X0`'R_
+M81@`,``0;@$`(`"`7=(O`(`F"`+^(&@`@@80`%[2+Q``K@D$@.T+((`/.#!N
+M`0`@`!00;@L$/@X0`#8.$``X;F,4?HY3$!H.$`!\OV$8`#``4&X!`"``@%72
+M+P"`)@@!_B!H`((&$`!6TB\0`*X)!(#M"R"`#SAP;@$`(``4$&X+!#X.$``V
+M#A``.&YC$'Z.4P!\'V`!`"`(`%O2+Y!N`0`@``!\`&@```"``'P_8`$`(`B`
+M6=(O!(#M"R"`#S@0$&X+L&X!`"``!#X.$``V#A``.&YC$'Z.4P!\'V`!`"`(
+M@%/2+P!\`&C0;@$`(````0```'P_8`$`(`@`4M(O!(#M"R"`#S@0$&X+!#X.
+M$/!N`0`@```V#A``.&YC$'Z.4P!\'V`!`"`(`$S2+P!\/V`TP0(`$&\!`"``
+M`($@"`"``&@`?#]@`0`@"(!)TB\$@.T+((`/.!`0;@LP;P$`(``$/@X0`#8.
+M$``X;F,4?HY3$!H.$`!\OV$8`#```#;2+U!O`0`@``"`)@@`_"!H`(````""
+M!A``-M(O$`"N"02`[0L@@`\X<&\!`"``%!!N"P!\'V`0`#``````"`!\(&`/
+MPP```((?4``"`&B0;P$`(``??@"(`(`/.`!\'V`0`#``````"`)^(&``@A]0
+M``(`:+!O`0`@`!]^`(@`@`\X`'P?8!``,``````(!'X@8`""'U```@!HT&\!
+M`"``'WX`B`"`#S@`?!]@$``P``````@(?B!@`((?4``"`&CP;P$`(``??@"(
+M`(`/.`0^#A``-@X0`#AN8Q1^CE,0&@X0``"@81!P`0`@``!\'V`0`#``````
+M"`%^(&``@A]0``(`:!]^`(@`>N!7,'`!`"``@0,`(`!\'V```"`(`"72+P`:
+M(&``@A]0``(`:!]^`(A0<`$`(``0`*X)!(#M"R"`#S@4$&X+`'P?8!``,```
+M```(`'P@8'!P`0`@``"`````@A]0``(`:!]^`(@`@`\X`'P_8!``,```?!]@
+MD'`!`"``W*D"``P!``@`@``0`(`/.`0^#A``-@X0`#AN8Q1^CE.P<`$`(``0
+M&@X0``"@80/ZYE>!!0`@@`?2+P7^1H``?#]@W*D"`-!P`0`@```"04`$`2$(
+M#`%A"`"`0`@`!D%P`(0`$``%TB\```!0\'`!`"``$`"N"02`[0L@@`\X%!!N
+M"P0^#A``-@X0`#AN8Q1^CE,0<0$`(``0&@X0``"@80/ZYE>!!0`@@/O1+P7^
+M1H``?#]@W*D"`#!Q`0`@```"04`$`2$(#`%A"`"`0`@`!D%H`(0`$`#YT2\`
+M``!04'$!`"``$`"N"02`[0L@@`\X%!!N"P0^#A``-@X0`#AN8Q1^CE-P<0$`
+M(``0&@X0`(*@801ZX%<%`0`@#_X?8``(`"`%?D"``'PA0)!Q`0`@`-RI`@``
+M@2`(`(`@"`#\(&#___]_`GK@5X("`"`%_@"`L'$!`"``!?X_8(#JTB\`@`80
+M@```(`""!A````!0$`"N"02`[0O0<0$`(``@@`\X%!!N"P0^#A``-@X0`#AN
+M8QQ^CE,0&@X0%!P.$/!Q`0`@`!@>#A```,!A`(*@80!\_V$$`#```-_1+P"`
+M)PC[_V!@$'(!`"``!7Y'@`!\(4#<J0(`"($@"`"&(&@`@@<0`-W1+P)ZYU<P
+M<@$`(``!`0`@`WKG5X(#`"`"_@:``!H`0`5^H(D">N=7`@$`(%!R`0`@``#\
+MIFD```"`!7Y'@`!\(4#<J0(``($`"``:`!``'`=@<'(!`"``@-'_+Q``K@D4
+M`,X)&`#N"02`[0L@@`\X'!!N"P0^#A"0<@$`(```-@X0`#AN8QQ^CE,0&@X0
+M%!P.$!@>#A```*!A`(+@8;!R`0`@```$P6$%_D:``'PA0-RI`@``@4`(```!
+M"`!\`&#___]_T'(!`"``$($@"``"`1`"^N97`0$`(`/ZYE>"`0`@!7X`@`7^
+M/V#P<@$`(```P](O`(`'4```!Q``>N!7!?Y&@`!\(4#<J0(`'($@"!!S`0`@
+M`((``"``A"`8`(``0```!Q``F@9@`*__+Q``K@D4`,X),',!`"``&`#N"02`
+M[0L@@`\X'!!N"P!\GV`0`#``!7Y`@`!\'V!0<P$`(`#<J0(```!A0`R!`0@`
+M`$((``!!8`"$'U``!`!H'WX`B'!S`0`@``"``!``>N!7`0$`(`R!`0@```(0
+M````4`"`#S@$/@X0D',!`"```#8.$``X;F,\?HY3$!H.$!0<#A`8'@X0'"`.
+M$`""(%"P<P$`(`#H@PT0_/]-0`!\OV&4P@(`&/ZF0!R`)@CD_XU``'Q_8-!S
+M`0`@`)2^`@`H@`$(````"````A``?-]AU+X"`%``9PCD@0T(\',!`"````8`
+M4`1^`(@``^!7A0,`(``"`%````$0"(`B"````0@0=`$`(````^!7C@(`(``!
+M`"!`?@!`@/O_)P""(%```@$0_($-"#!T`0`@``!ZX%>!N``@^/\-0O3_[4$`
+M?-]AU+X"``!\OV&4P@(`4'0!`"``@)71+QR`)@@#_D"`5``G"`"$8$``A"``
+M``(($`2`(0AP=`$`(```@@<04'['0!C^ID``!$%0!(`B"`"$($`__B!@!/Z`
+M@)!T`0`@````8P@`@B!0`(B!0``"`A`!?D%``7KA5X7Z_R<(@"((L'0!`"``
+M`?X@4`B"`A`$@"((`?X@0#_^(&`$@@(0`(G1+P""(%#0=`$`(```^N!7`8P`
+M(("H`"#YA2T(`'Q?8&3,`@`,``$(``(`0/!T`0`@``P``1"`TMLO`(X`(/J%
+M#0C_?R!`^H--$`!ZX%<!C0`@$'4!`"```'Q?8#"V`@`$`2$(!/Y@@`!\GV`<
+MW0(`$``""``&8$`P=0$`(``!_@!`!`$!$!!ZX%<"`0`@`((@4`0#`1`(A`$(
+M`7X`8%!U`0`@``!ZX%>"`@`@`'Q?8#"V`@```0$(`7X`0``!`1#ZA0T(<'4!
+M`"``_W\@0/J#31``>N!7`O+_)X!^`"#T@:T)`/KF5P%]`""0=0$`(```<-LO
+M$(!&"`)ZX%>"%@`@#(`F"`"(``@T?@!``("`$+!U`0`@``*(``@T?@!0`H"`
+M$`"(``@``B!`S/]@0!"`1@CXB0`(T'4!`"``"`"!$/J)``@*`($0_(D`"`P`
+M@1#RB0`(#@"!$/2)``CP=0$`(``0`($0]HD`"!(`@1#4A0`(``!!$-6%``@!
+M`$$0UH4`"!!V`0`@``(`01#7A0`(`P!!$`S^`4`$``$0%`@!"#1^`%`4`($0
+M,'8!`"``_HD`"!A^($``D``8R'K@5PP!`"`<`H$0``$`(`""(%!0=@$`(```
+M_O\G%@@A"`":!F"`A-DO^X6M"0!\GV`<W0(````""'!V`0`@```:`$````(0
+M$'K@5P4!`"`0?@!0```"$(`B[R\``"!@D'8!`"```/K@5P)Q`"#[A:T)`'S?
+M89"H`@`P``<(``#@"2``QPFP=@$`(`"`2=$O```G"`":($``@^=7C0``(`">
+M(%```@<0@$C1+]!V`0`@`/J%#0@`>N!7@5,`(`'^'V"`N_XO@%``(/2!K0D4
+M_N9!\'8!`"```)X'8("O!"C[A:T)`'R?8!S=`@````((`!H`0````A`0=P$`
+M(``0>N!7!0$`(!!^`%````(0^X6M"0!\WV&0J`(`,``'"#!W`0`@``````H@
+M`,<)@#C1+P``)P@`FB!```/H5XT``"``H"!04'<!`"````('$(`WT2_ZA0T(
+M`'K@5X$"`"`!_A]@@*K^+P``(&!P=P$`(```^N!7`E4`(`!\7V!DS`(`#``!
+M"`!ZX%>!/0`@`?X?8)!W`0`@``#\)T```@``H($`$`!\'V!X5@``I($`$`7^
+M'V#P@4T0L'<!`"```)XG8`@``0@$?F"`$``!"``&0`#HA0T0]/Y_0`!\WV'0
+M=P$`(`!TJ0(````'"``&`!`$`&`(\/]A8`0&`!#P@:T(`_X?8/!W`0`@`/3^
+M?T``"()0``S#4`#B^2\``"!@`/K@5X)"`"``?']@$'@!`"``E+X"`#R``0@`
+M?"!H``(``#2``0@``@`4!OX?8/"!31`P>`$`(`#T@:T)[)L-$```!P@``*!A
+M"'X`0```!Q``?%]@Q(L"`%!X`0`@`'A^(4```^!7C@``(``$!Q#H_TU``'S?
+M89"H`@`8``<(<'@!`"``````"`@`)P@#_B"``(``0````1`0``<(``#@"0A^
+M!T*0>`$`(`"`#=$O"``G"`'^($``@^=7C0``(`">(%```@@0@`S1+[!X`0`@
+M`.B!30CP@:T([('-"`/^'V``FB9@"/Y_8`'^GV``R/DOT'@!`"`````@8`#Z
+MX%>"*``@`'Q_8)2^`@`\@`$(`'P@:``"``#P>`$`(``T@`$(``(`%`!\7V!D
+MS`(`"``!"`%^`$`(``$0$'K@5Q!Y`0`@``(!`"``@B!0"`(!$`!\7V!DS`(`
+M#``!"/]_`$`,``$0,'D!`"``@!T#*(`&`"#XA0T(!7K@5XT5`"`"?H"!`'R&
+M`51Y`0!0>0$`(`````8X/UT``&%=```W70``?%X``'Q>``"Z70`````@8'!Y
+M`0`@``#ZX%<"%0`@_/]-0`!\OV&4P@(`&/ZF0!R`)@CD_XU`D'D!`"```'Q_
+M8)2^`@`H@`$(````"````A``?-]AU+X"`%``9PBP>0$`(`#D@0T(``8`4`1^
+M`(@``^!7A0,`(``"`%````$0"(`B"-!Y`0`@`````0@``^!7C@(`(``!`"!`
+M?@!`@/O_)P""(%```@$0\'D!`"``_($-"`!ZX%>"1_\G`'Q?8#"V`@```0$(
+M`'K@5P$$`"`0>@$`(```\NXO```@8`#ZX%<!`@`@/_X?8``$05"`Q@$H@```
+M(#!Z`0`@`````%`0`*X)%`#."1@`[@D<``X*!(#M"R"`#S@\$&X+4'H!`"``
+M!#X.$``V#A``.&YC$'Z.4X#3T"\`!$%0`'P_8$[@`@!P>@$`(```A$`0`?Y?
+M8`!\/V#8VP(``(1`$(#1T"\$_C]@`'P?8)!Z`0`@`)CA`@```D`0`'P_8/C>
+M`@``?!]@G.$"```"`!`!_A]@L'H!`"```?X_8`#TZ2\`?!]@P-L"``````@$
+M@.T+((`/.!`0;@O0>@$`(``$/@X0`#8.$``X;F,4?HY3$!H.$`##T"\`FJ91
+M`'P_8/!Z`0`@`$[@`@``FD`0`?Y?8`!\/V#8VP(``(1`$`#!T"\`?!]@$'L!
+M`"``F.$"```:0!`"_A]@$`"N"02`[0L@@`\X%!!N"P0^#A`P>P$`(```-@X0
+M`#AN8R!^CE,0&@X0%!P.$!@>#A`<(`X0``"@85![`0`@``'^'V(`?!]@>+("
+M```@0!``?/]AV-L"``"$!P@`>N!7<'L!`"```0(`(`":!F``@B!0@$'Q+P`4
+M`"``?-]A3N`"```$!PB0>P$`(```>N!7`0,`(("LT"\`@B!0``)'$`"@1Q``
+MK=`O@`X`(+![`0`@``":!F"`00HH```@8`#ZX%<!#``@$(`&"#P```@0?@!`
+MT'L!`"```"[K+P!ZX%<!"0`@`?X_8`!\'V#<W@(```(`$`!\'V#P>P$`(`#`
+MVP(`````"`)ZX%>!!``@````4(#JWR\`#@`8`'K@5Q!\`0`@``(!`"`$_A]@
+M@`(`(````%"``0`@`'P?8,#;`@`````(,'P!`"``$`"N"10`S@D8`.X)'``.
+M"@2`[0L@@`\X(!!N"P0^#A!0?`$`(```-@X0`#AN8QQ^CE,0&@X0%!P.$!@>
+M#A```,!A`'P?8'!\`0`@`-C;`@``!``(`'K@5X$!`"``'`=@`?X_8``@\2\0
+M`*<)D'P!`"``#OX&0`#]ZB\``.!A`/KG5P$"`"``G@=@`!PG8`"J["^P?`$`
+M(```"0`@`!P'8("WZB\``.!A`'P?8#BO`@`````(`7K@5]!\`0`@``(%`"``
+M^N=7`00`(`3^'V"`X=@O`?X_8`!\'V"0X0(`\'P!`"````(`$`'^'V``F.DO
+M@#WJ+P#ZYU>!&``@`((@4`!\'V`0?0$`(`"4X0(```(`$`'^/V``?!]@W-X"
+M```"`!`\@$8(`'P_8#!]`0`@`&#;`@`4"&$(!(@`"`"!X5<"!0`@$@AA"`*(
+M``@`@>%74'T!`"```@,`(!`(00@`B``(``'A5P(!`"`!_A]@@```(````%!P
+M?0$`(```>N!7@@H`("F$!@@`>N!7`@D`(``<!V"`-``H`'R_89!]`0`@`,#;
+M`@``@B!0`((&$``<!V``L?\O`(`&$`1ZX%>"`P`@L'T!`"``!/X?8`#'V"\`
+M?#]@6+P"`!"!``@!?@!`$($`$`!\OV'0?0$`(`#`VP(``(`&"!``K@D4`,X)
+M&`#N"02`[0L@@`\X'!!N"_!]`0`@``0^#A``-@X0`#AN8Q!^CE,`?%]@E.$"
+M````(0@!_B!`$'X!`"````(!$`!\7V#<W@(```!!"`!ZX5<!`@`@1OK@5P(!
+M`"`P?@$`(`"`'P`H@`$`(`!\'V#`VP(`````"`2`[0L@@`\X$!!N"U!^`0`@
+M``0^#A``-@X0`#AN8Q1^CE,0&@X0``"@80""(%``?!]@<'X!`"``C.$"```"
+M`!``?!]@W-X"```"`!``?!]@[-X"```"0!"0?@$`(```?%]@V-L"```$`0@`
+M>N!7`0$`(``"01"`/N<O`/WF5[!^`0`@````"`""`P`@`?X_8`!\'V!9X`(`
+M``)`$`!\'V`.N0(`T'X!`"````)`$`!5ZB\&_A]@$`"N"02`[0L@@`\X%!!N
+M"P!\7V#P?@$`(``.N0(```0!"`!ZX%<!`0`@`((@4``"01`!_C]@`'P?8!!_
+M`0`@`%B\`@`!`T`0`((@4`!\'V!`KP(```(`$````%``@`\X,'\!`"``!#X.
+M$``V#A``.&YC%'Z.4Q`:#A```*!A`((@4`!\'V!0?P$`(`",X0(```(`$`!\
+M'V#<W@(```(`$`!\'V#LW@(```)`$'!_`0`@`(!!ZB\`?!]@8-L"`!@$``@`
+M>N!7@0$`(````%"`U=XOD'\!`"``@"?K+P!'ZR\`@B!0`'P?8)#A`@```@`0
+M`/P&8````0"P?P$`(```>N!7`@$`((+ZYE<"`0`@!?X?8(```"`"_A]@$`"N
+M"=!_`0`@``2`[0L@@`\X%!!N"P'^/V``?!]@O-L"```"0!``?!]@\'\!`"``
+MP-L"``````@`@`\X!#X.$``V#A``.&YC$'Z.4P!\'V`0@`$`(`#8VP(```0`
+M"`!ZX%<"`0`@(/X?8`!YV"\```!0@&7?+S"``0`@```.`!@`>N!7`0$`(```
+M`%"`"P`@`'P?8$_@`@``!``(4(`!`"```'K@5X('`"``?#]@6+P"``R!``@!
+M?@!`#($`$`""(%!P@`$`(```?!]@V-L"```"0!`!_A]@`&'C+R#^'V"`;-@O
+M``+G+Y"``0`@```!`"`(_A^`@&K8+P3^'V`$@.T+((`/.!`0;@L$/@X0L(`!
+M`"```#8.$``X;F,4?HY3$!H.$```H&$`?!]@V-L"```$``C0@`$`(```>N!7
+M`@$`("#^'V``8M@O`'P?8-C;`@``!``(`'K@5_"``0`@`($)`"``?!]@3^`"
+M```$``@`>N!7`0$`(`C^'X``7-@O$($!`"``@+S9+P!ZX%<!`0`@!/X?8(`?
+M`"``?!]@5.`"```$``@P@0$`(``!>N!7@AL`(`;^'V``'``@`'P?8+S>`@``
+M!``(`'K@5U"!`0`@``$&`"``?!]@M=T"```$``@`>N!7@@,`((`@XR\`?!]@
+M<($!`"``P-X"``!\/V"TW0(``(0@"("EX"\`?!]@O-L"```$``B0@0$`(```
+M>N!7@0$`(`":!F``LO\O@`\`(`!\'V#<W@(`````"+"!`0`@``!ZX%>!!0`@
+M````4(`SWR\`#@`8`'K@5P()`""`'_<OT($!`"```'P_8(S;`@`H@``0@"#A
+M+P#G_R<`?#]@C.$"``"```CP@0$`(``!?@!``(``$`1ZX%>+`P`@`!CK+P!Z
+MX%<!`0`@`_X?8!""`0`@`(`!`"````!0@```(`'^'V`0`*X)!(#M"R"`#S@4
+M$&X+,((!`"``!#X.$``V#A``.&YC$'Z.4R#^'V``-=@O`'P?8-S>`@!0@@$`
+M(``````(`'K@5P$#`"````!0`!_?+P!ZX%<"`0`@!/X?8'""`0`@`(`!`"``
+M?!]@P-L"``````@$@.T+((`/.!`0;@L$/@X0D((!`"```#8.$``X;F,0?HY3
+M`'P_8-C;`@``A"`(`/K@5P$!`""P@@$`(``!_C]@@%KP+P!\'V#`VP(`````
+M"`2`[0L@@`\X$!!N"]""`0`@``0^#A``-@X0`#AN8Q!^CE.`:^\O`'P?8!6S
+M`@``!``(\((!`"```'K@5P$#`"``?#]@6+P"``B!``@!?@!`"($`$``'`"`0
+M@P$`(```?!]@3^`"```$``@`>N!7`00`(`!\/V!8O`(`!($`"#"#`0`@``%^
+M`$`$@0`0`?X?8`""(%"`XN@O`#/J+P!\'V#`VP(`4(,!`"``````"`2`[0L@
+M@`\X$!!N"P0^#A``-@X0`#AN8Q1^CE-P@P$`(``0&@X0`'R_86RU`@``A`8(
+M`'K@5P$$`"`!_A]@@/G>+Y"#`0`@```.`!@`>N!7@@8`(````%``@$80``0`
+M(`#CZB\`>N!7L(,!`"``@0,`(`'^'V``]-XO``X`&`!ZX%<"`0`@!/X?8(``
+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
+M#A``.&YC$'Z.4P'^'V``@B!0`'Q?8`!]``#0B0$`(```AF%0@,SG+P```%``
+M?#]@@&H!``!\7V``&0```(9A4/")`0`@``#)YR\$@.T+((`/.!`0;@L$/@X0
+M`#8.$``X;F,0?HY3$(H!`"```'P?8$RQ`@`(_C]@``1!4`#O\"\$@.T+((`/
+M.!`0;@LPB@$`(``$/@X0`#8.$``X;F,0?HY3@$?I+P!ZX%<!`@`@G``@"%"*
+M`0`@``B```@$?@!H"(``$`2`[0L@@`\X$!!N"P0^#A``-@X0<(H!`"```#AN
+M8RQ^CE,0&@X0%!P.$!@>#A``FJ91`!S'40!\'V"0B@$`(`!(VP(`````"``!
+MYU<*'@`@`?Z_80`<)T``G"!``OX@@+"*`0`@``!\'V!8V@(``(#@00B`!P@!
+M>N!7@@4`(`2`)P@(@``(T(H!`"``!'X`:`B``!`$@"<(`(``"!``(`@```!0
+M,H"`$`":IE'PB@$`(`"`$``@`GK@5X(``"``FJ91`!PG0`"<($`"_B"``'P?
+M8!"+`0`@`%C:`@``@.!!!(`G"`B```C[?P!@"(``$`2`)P@`@``(,(L!`"``
+M$``@"#*(``@!?@!``!!`&#*`@!`R>N%7@@4`(`2`)PA0BP$`(```@``($``@
+M""2```B`LNDO!(`G"`"```@0`"`()(``"'"+`0`@``+^/V``KM8O`7['00!\
+M'V!(VP(`````"``!YU<+XO\GD(L!`"```/KF5X$``"``]-TO`)JF40!\_V%0
+MVP(``!S'40"`!PBPBP$`(```>N!7`0\`(!````@@`$`("``A"`+^`&``>N!7
+M`0P`(-"+`0`@``3^`&``>N!7@@H`(`""(%``F^!7"@0`(`+^`(``@`U`\(L!
+M`"``\`$`"``!X5>!`0`@`?X@0`";X%<+_/\G`)O@5P($`"`0C`$`(``"_@:`
+M`(`-0/`%`!`!_J9!```!"!````A@?@!`@"?=+S",`0`@``%^QT$$_N=!!'KG
+M5XOM_R<`T?4O`'P_8(S;`@`8@``04(P!`"```-+?+Q``K@D4`,X)&`#N"02`
+M[0L@@`\X+!!N"P0^#A!PC`$`(```-@X0`#AN8Q!^CE,`?!]@3+$"``3^/V``
+M!$%0@*'P+Y",`0`@``""(%``?!]@3-L"```"`!`$@.T+((`/.!`0;@L$/@X0
+ML(P!`"```#8.$``X;F,L?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A#0C`$`(``D
+M)`X0*"8.$```8&(`FJ91$(#)"0`<)V(T_@A"(/[H0?",`0`@`"2`2`H8B`@(
+M`7K@5X*2`"``>N=7`@(`('#^'V``?#]@$(T!`"``PP8``(!I!B@`?"=```(`
+M`,J%``CW?P!@RH%`$````%`PC0$`(``8@(@0@(L`(`!\/V#XK`(``(``"`%^
+M`$``@``0`'P?8%"-`0`@`+K;`@``"``(`'K@5X(,`"``?!]@X,H"```(``@#
+M>N!7<(T!`"``@@,`(`'^'V``?#]@`'T```!\7V!`"P```(9A4``$`""0C0$`
+M(``$>N!7@0,`(`'^'V``?#]@0`L```!\7V``?0```?Y_8+"-`0`@``!1YR\!
+M_C]@`'P?8+K;`@```H`0&@@("`Z()P@``@!0T(T!`"```!"@&0B$"`@!?@!@
+M`'K@5P$$`"``?#]@(*T"``"```CPC0$`(```&@!``(``$`!\'V`DK0(```H`
+M(`R`*0@`B``(``(`0!".`0`@``P(``@`?>!7AX$```(#`"``?#]@^-@"``"`
+M``@`&@!`,(X!`"```(``$``%`"``?#]@"*T"``"```@`&@!``(``$`!\'V!0
+MC@$`(``,K0(`%`0H"`":1F``<-DO%(A("`!\/V!TK0(``(``"'".`0`@```$
+M`$``@``0%`0H"&H("0@`@>!7`@0`((H("0@```!`D(X!`"`````I0':(``@`
+M&@!`=H"`$````%!T`(D0`(`'"`"F*6"PC@$`(```@>0O`'K@5P("`"!T_A]@
+M`'P_8!,'````,P8H`*8)8-".`0`@``#`]R\`I@E@@/3D+P!\'V!,L0(``OX_
+M8``$05"`5?`O\(X!`"```&``(!0$*`AJ"`D(`('@5P()`""*"`D(````0!@(
+M2`@0CP$`(````"E`@(@`"``$`$"`@(`0B@@)"````$`8"$@(```I0#"/`0`@
+M`':(``@```%`=H"`$!@(2`AT""D(``(!0'0`B1`8"$@(4(\!`"```'P_8'BM
+M`@``@``(``0`0`"``!``?!]@?*T"`!0$*`APCP$`(`"`3=DO`'P_8)2M`@``
+M@``(`7X`0`"``!!T""D(`'P?8)"/`0`@``#9`@``!``(`('@5XL"`"`!_A]@
+M`((@4`!ZZR\```!0L(\!`"``=`")$`Z()P@:"`@(``/@5P$"`"`.@(<0````
+M4`F`1Q#0CP$`(``,@(<0%@0H"`B$!P@``@!`"(!'$!8$*`@)A`<(`(``0/"/
+M`0`@``F`1Q``#@`8"H@G"``#X%<*`@`@"(0("`%^`&``>N!7$)`!`"``@0T`
+M(`!\/V"0K0(``(``"`%^`$``@``0`(`'"`"F*6`PD`$`(```4>0O`'K@5P("
+M`"!T_A]@`'P_8%L'`````P8H`*8)8%"0`0`@``"0]R\`I@E@@,3D+P!\'V!,
+ML0(``OX_8``$05"`)?`O<)`!`"```?X?8`""(%``8.LO@"X`(!8$*`@,B`<(
+M`(``0`R`AQ"0D`$`(```$``8!7K@5PL.`"``?!]@&*\"``````@`>N!7`0<`
+M(+"0`0`@``J()P@)A`<(`(``4`5ZX%>)!``@!(`G"`2```@`?`!HT)`!`"``
+M``@```2``!``@"<("(``"`)^`&@(@``0````4`R`AQ#PD`$`(```@"<("(``
+M"`A^`&@(@``0!OX?8!,`2!"``0`@@_X?8!"1`0`@`!,`2!`!_K]A%@0H"!<$
+M"`@``@!`%P!($`#ZYE>!`@`@,)$!`"``!(`G"`"F"6`!_E]@`'_^+P`3`"``
+M?!]@3+$"``+^/V!0D0$`(```!$%0@`CP+P`0`"````!0$P!($(#[_R<#_A]@
+M$P!($'"1`0`@```-`"`#_A]@$P!($(#X_R=T_A]@`'P_8+X'``"`V@4HD)$!
+M`"````D`(!,$"`CR>N!7`?G_)_%ZX%>!^?\G`WK@5X'U_R>PD0$`(`")`@`@
+M`7K@5P&G_R<">N!7@6[_)P#W_R<%>N!7@?'_)]"1`0`@`/!ZX%<!\O\G@/3_
+M)P#ZYE<"`0`@`*8)8`!=]R\`F@9@\)$!`"``@```(````%`0`*X)%`#."1@`
+M[@D<``X*(``N"B0`3@H0D@$`(``H`&X*!(#M"R"`#S@L$&X+!#X.$``V#A``
+M.&YC,'Z.4S"2`0`@`!`:#A`4'`X0&!X.$!P@#A#\_TU``'R_893"`@`D_H9`
+M4)(!`"``*(`F"/#_;4``?!]@E+X"`#@```@````(`(`!$`!\WV%PD@$`(`#4
+MO@(`>`!G"/"!#0@`!@!0!'X`B``#X%>%`P`@``(`4)"2`0`@`````1`(`"((
+M```!"``#X%>.`@`@``$`($!^`$"`^_\GL)(!`"```((@4``"`1#\@0T(`'K@
+M5P%C`"#X_PU"]/_M00!\WV'0D@$`(`#4O@(``'R_893"`@``Q,TO*(`F"`/^
+M0(!\`"<(`(1@0/"2`0`@``"$(````@@0!(`A"`""!Q!X?L=`)/ZF0``$05`$
+M@"(($),!`"```(0@0#_^(&`$_H"```!C"`""(%``B(%```("$`%^04`PDP$`
+M(``!>N%7A?K_)PB`(@@!_B!0"(("$`2`(@@!_B!`/_X@8%"3`0`@``2"`A"`
+MM\TO`((@4`#ZX%<!-P`@@%``(`!\/V"0J`(`<),!`"``$(``"```P`D`@*`)
+M`+#-+P"`)@@!_B!```/G5XT``""0DP$`(```G"!0`((&$`"OS2\`?%]@9,P"
+M`````0@!?@!````!$+"3`0`@`!!ZX%<"`0`@`((@4``"`1``?#]@,+8"``B!
+M``@!?@!`T),!`"``"($`$`+^'V"`'/LO```@8`#ZX%>"0``@]($-"`""(%#P
+MDP$`(``(`@`0`"(`(`!\7V!DS`(````!"`%^`$````$0$'K@5Q"4`0`@``(!
+M`"``@B!0``(!$`!\/V"0J`(`$(``"```P`D`@*`),)0!`"``@)G-+P"`)@@!
+M_B!```/G5XT``"``G"!0`((&$("8S2]0E`$`(``"_A]@``W[+P``(&``^N!7
+M`C$`(/2!#0@`@B!0"`(`$'"4`0`@``P"`!``$@`@`'Q?8&3,`@````$(`7X`
+M0````1`0>N!7D)0!`"```@$`(`""(%```@$0`'P_8)"H`@`0@``(``#`"0"`
+MH`FPE`$`(`"`B<TO`(`F"`'^($```^=7C0``(`"<(%``@@80@(C-+]"4`0`@
+M``+^'V``_?HO```@8`#ZX%<"(0`@^(4-"`IZX%<"#0`@\)0!`"``]($-"`!Z
+MX%>!"P`@!`@@"`#ZX%<!`0`@@"[D+P`)`"`0E0$`(`#V_C]`!`*`$(`'`"#X
+MA0T(!'X`4`9ZX%>-!0`@`GZ`@3"5`0`@``!\A@$\E0$````&.-ID``!690``
+M_F0``%9E```>90``4)4!`"``5F4``!YE``#\_TU``'R_893"`@`D_H9`*(`F
+M"/#_;4!PE0$`(```?!]@E+X"`#@```@````(`(`!$`!\WV'4O@(`>`!G")"5
+M`0`@`/"!#0@`!@!0!'X`B``#X%>%`P`@``(`4````1`(`"((L)4!`"`````!
+M"``#X%>.`@`@``$`($!^`$"`^_\G`((@4``"`1#0E0$`(`#\@0T(`'K@5P*=
+M_R<`^>HO```@8`#ZX%<!`@`@1?X?8/"5`0`@```$05``3?XO@```(````%`0
+M`*X)%`#."1@`[@D<``X*$)8!`"``!(#M"R"`#S@P$&X+!#X.$``V#A``.&YC
+M)'Z.4Q`:#A`PE@$`(``4'`X0&!X.$```P&$`@N!A`'P?8`D`(`B`8\TO`GX`
+M8%"6`0`@``"`OU$`@*9I'_ZFB?S_+4``?%]@E+X"`"0``0@`0``(<)8!`"``
+M`7X`8`!ZX%<!_A]@`@``4`"``!#X_RU`-``!"`!```B0E@$`(``!?@!@`'K@
+M5P'^'V`"``!0`(``$`">!V`!_C]@`-8'*+"6`0`@``!\/V``X@(``(``$`""
+M(%``>N!7@0$`(`"`!P@*>N!7T)8!`"``A0``(`'^/V``!$%0`/KF5X$(`"``
+M?']@]+T"``2``0CPE@$`(```>N!7`08`(`"``0@`>N!7@@0`(/R!#0@`>N!7
+M`@,`(!"7`0`@`/B!#0@`>N!7@@$`(`#ZX%>!```@`?Y?8``$!Q````!0,)<!
+M`"``$`"N"10`S@D8`.X)!(#M"R"`#S@D$&X+`((@4`!\'V!0EP$`(`#TO0(`
+M!`(`$`"`#S@$/@X0`#8.$``X;F,8?HY3$!H.$'"7`0`@`!0<#A`%?B"``(`@
+M4`+^((``@"!``_Z@@0```%``(OLOD)<!`"`````@8`#ZX%<"#@`@`?X?8(`?
+M^R\``"!@`/K@5X(+`""PEP$`(```?!]@OV8``(!$]B\`FB9``_X?8`!"^R\`
+M`"!@`/K@5]"7`0`@``('`"``?-]A?.`"`````%``'"=@`"_[+P``!P@`&@!`
+M\)<!`"```'P@4/P#```"_A]@`#O[+P``(&``^N!7`0(`(&O^'V`0F`$`(```
+M!$%0``G^+X```"````!0$`"N"10`S@D$@.T+((`/.#"8`0`@`!@0;@L$/@X0
+M`#8.$``X;F,D?HY3$!H.$!0<#A`%?B"`4)@!`"```(`@4`+^((``@"!``_[`
+M@0```%`!_C]@@"W[+P!\OV%PF`$`(`!\X`(``(`&"``<`$``?"!0_`,``/C_
+M34`"_A]@@#_[+Y"8`0`@````(&``^N!7`B8`(`"`!@@``#]0Z`,``/B!#0@`
+M`L!!L)@!`"```!P'8'W^/Y@`"LXO``"@807^!H``&@!0`GX`@``:`$#0F`$`
+M(``#?@"````'4```/U#H`P``](,-$`3ZX%<.`0`@````4/"8`0`@`(`<^R_T
+M@2T(`_K@5XX$`"#T_RU`````4(`*^R\``"!@$)D!`"```/K@5X(6`"#T@2T(
+M`_K@5XW[_R<```!0??X_F``5^R\PF0$`(````"!@`/K@5P(2`"`!_A]@^OX_
+MF``2^R\``"!@`/K@5U"9`0`@``(/`"`#_A]@`'P_8`!]``"`#OLO```@8`#Z
+MX%>""P`@<)D!`"``^OX_F`!\'V`\N`(```(`$````%``[_HO```@8`#ZX%>0
+MF0$`(``"!P`@`?X?8(#L^B\``"!@`/K@5X($`"``?!]@2@```+"9`0`@`(`%
+M]B_\_RU``OX?8``P^R\``"!@`/K@5P$"`"!L_A]@T)D!`"````1!4`#1_2\`
+M`P`@`'P?8`#B`@```"`(`)H&8``L!RCPF0$`(`````!0$`"N"10`S@D$@.T+
+M((`/."00;@L!_C]@`'P?8!":`0`@`/2]`@```@`0`(`/.`""(%``?!]@]+T"
+M```"`!``@`\X,)H!`"``!#X.$``V#A``.&YC&'Z.4P#7\2\`?#]@C-@"`""`
+M`!!0F@$`(`"`'``H`-+,+_S_#4#X_RU``'?_+P!ZX%>!`@`@````4'":`0`@
+M`";^/V``!$%0@+S]+P"R!"C\@2T(`/K@5X$$`"#X@0T(D)H!`"```)G_+P!Z
+MX%>!`@`@````4";^/V``!$%0@+;]+P"L!"BPF@$`(```R,PO_($M"`#ZX%<!
+M!P`@`'P_8`0`,```@``(!'X`:-":`0`@``"``!`!_O\?____?____W____]_
+M____?____W____]_\)H!`"``____?X```"`!_O\?_($M"`#ZX%<!Y_\G@+O,
+M+_B!#0@0FP$`(```I/\O`'K@5X$"`"````!0)OX_8``$05"`IOTO`)P$*#";
+M`0`@``"XS"\`X?\G!#X.$``V#A``.&YC''Z.4Q`:#A`4'`X04)L!`"```)JF
+M40!\'V"OX`(```0`"`!ZX%<!`0`@`-;_+P`8`"!PFP$`(```?!]@U*X"````
+M``@`>N!7@1,`(`!\'V#IVP(```0`")";`0`@``!ZX%<"$0`@`(;4+P!ZX%>"
+M#P`@`'P?8*S@`@``"``(L)L!`"```'K@5P(-`"``?!]@JN`"```$``@`>N!7
+M@0L`(`"FS"_0FP$`(````,!A_/\-0`'^/V``,`<H`'K@5P`<!V`!!0`@@*3,
+M+_";`0`@`/R!#0@#>N!7C@,`((!'U"\`>N!7`0(`(`'^OV&`P?\O$)P!`"``
+M@```(("?S"\`^N97`@(`(("\_R\``0`@`?Z_80#G_R<PG`$`(`"`ELPO`/KF
+M5X$$`""`<=0O`'K@5X("`"``?!]@K.`"`%"<`0`@```(``@`>N!7@0``(`"U
+M_R\0`*X)%`#."02`[0L@@`\X<)P!`"``'!!N"P0^#A``-@X0`#AN8Q1^CE,0
+M&@X0``"@80"`!@B0G`$`(``"?@!00WK@5XV6`"``<@`@`((@4`!\'V"$S`(`
+M``(`$+"<`0`@`(!7]"\`9@4H`7K@5X(!`"`"_A]@`&8%*("0`"``8P4HT)P!
+M`"``!'K@5X$"`"``?!]@J-<"```$``@`>N!7@8P`(`/^'V#PG`$`(`"`8`4H
+M@%3/+X"*`"`0@`8(`WX@8`!\'V!\K@(`;`(`$!"=`0`@`(!:!2@!>N!7@H8`
+M(!#^!D``$M`O`(4`((!7!2@!>N!7,)T!`"``@0$`(`!6!2@$>N!7`H(`(`R`
+M!@@0_B9``+K/+P"``"!0G0$`(`"`4@4H`7K@5X$!`"``404H!'K@5P)]`"`,
+M@`8($/XF0'"=`0`@``!LSR\`>P`@@$T%*`%ZX%>!`0`@`$P%*`1ZX%<">``@
+MD)T!`"``$(`&"`".SB^`=@`@`$D%*`%ZX%>!`0`@@$<%*`1ZX%>PG0$`(`""
+M<P`@$/X&0`"`SB\`<@`@@$0%*`%ZX%>!<``@`$,%*-"=`0`@`(!O`"``0@4H
+M`7K@5X$!`""`0`4H!'K@5X)L`""`4<\O\)T!`"``@&L`(``^!2@!>N!7@0$`
+M((`\!2@$>N!7@F@`(!"`!@@0G@$`(```J,XO`&<`(!"`!@B`E\\O@&4`(!"`
+M!@@`?\\O`&0`(#">`0`@`(`V!2@!>N!7@0$`(``U!2@$>N!7`F$`(!"`!@B`
+M(]`O4)X!`"``@%\`(``R!2@!>N!7@0$`((`P!2@$>N!7@EP`(!"`!@APG@$`
+M(```@LXO`%L`(!#^!D``0]`O@%D`(!"`!@@`7M`O`%@`()">`0`@`!"`!@B`
+M+-`O@%8`(`R`!@@0_B9`@%+/+X!4`""`H\XOL)X!`"``@%,`(``F!2@!>N!7
+M@0$`((`D!2@$>N!7@E``(!"`!@C0G@$`(```@LXO`$\`((`A!2@!>N!7@0$`
+M(``@!2@$>N!7`DP`(/">`0`@`!"`!@@`7<XO@$H`(("?SB^`20`@$(`&"``(
+MT"\`2``@$)\!`"``#(`&"!#^)D``H,XO`$8`((!>SB\`10`@@!<%*`-ZX%<P
+MGP$`(`"!`0`@`!8%*`)ZX%>"!0`@!/X?8``6!2@`@`8(/7K@5U"?`0`@`((!
+M`"`!_A]@`'/.+P`^`"````!0@''.+X`\`"``#P4H<)\!`"```7K@5P([`"`!
+M_C]@`'P?8'RP`@#T`T`0@#@`(``+!2B0GP$`(``!>N!7@0$`((`)!2@$>N!7
+M@C4`(`R`!@@0_B9`@%O/+["?`0`@`(`S`"`0_@9`@(//+P`R`"`0@`8(`(#/
+M+X`P`""`#/0OT)\!`"``@"\`(!"`!@B`LL\O`"X`(!"`!@@`%<\O@"P`(`#K
+M_B_PGP$`(`````!0`*#S+X`J`"`0@`8(`"7/+P`I`"`0_@9``);/+Q"@`0`@
+M`(`G`"`0_@9``.O.+P`F`"`,@`8($/XF0``LT"\`)``@,*`!`"```GZ`@0!\
+MA@%`H`$````&."AG``!4:```5&@``%1H``!0H`$`(``_9P``5&@``$IG``!4
+M9P``7F<``&=G``!P9P``=6<``'"@`0`@`'UG``"&9P``5&@``(EG``",9P``
+ME6<``)YG``!4:```D*`!`"``5&@``%1H``!4:```H6<``*1G``"G9P``JV<`
+M`*UG``"PH`$`(`"V9P``OV<``%1H``!4:```5&@``%1H``#!9P``5&@``-"@
+M`0`@`%1H``#$9P``5&@``%1H``!4:```R&<``,IG``#C9P``\*`!`"``[6<`
+M`/!G``!4:```\V<``%1H``#U9P``^&<``%1H```0H0$`(`!4:```5&@``%1H
+M``!4:```^V<``%1H``!4:```RF<``#"A`0`@`/]G``!4:```5&@``%1H``!4
+M:````F@```5H```(:```4*$!`"``$`"N"02`[0L@@`\X%!!N"P0^#A``-@X0
+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
+M`0B!#``@`'K@5P(!`"`!_A]@4*T!`"````!!$`!\7V"PX`(```0!"`%^`$``
+M#B`8``!!$`7ZX%=PK0$`(`""`P`@`((@4`!\'V`/W0(```)`$``"01"`.>$O
+M@`@`()"M`0`@``"G\2\`?`!`@`P```'^/V"`@O4O@`4`(`!ZX%<!`0`@L*T!
+M`"```((@4``"01``@B!0`'Q?8+#@`@```D$0`'P?8`_=`@#0K0$`(````D`0
+M!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC&'Z.4_"M`0`@`!`:#A`4'`X0`'S?
+M8>_;`@``!`<(`'R_85"S`@`<@480$*X!`"``O($&"""!!A#`@08()($&$/"!
+M1@@`!`$(`'P_8.S;`@`PK@$`(```@$`0`7XA0/"#!A``Q_,O'(4F"`#ZX%>"
+M"P`@`'P_8%"N`0`@`/3;`@``@"`(`(``8`!ZX%>!"``@`'P?8-C;`@``!``(
+M<*X!`"```'K@5P$#`"`"_A]@``!'$`7^'V"\@080%/X?8(`"`""0K@$`(``!
+M_C]@``)'$`7^'V"\@080#_X?8,"!!A``?+]A4+,"`+"N`0`@`/"!1@@`!`$(
+M`'K@5P(!`"``@B!0@```(`'^/V``?!]@T*X!`"``[=L"```"0!``?+]A4+,"
+M`"F%)@@JA08(`('@5XL"`"#PK@$`(``(_A^``)_2+P""(%`I@T80``$`(`'^
+M`$`I@480`'R_81"O`0`@`%"S`@!(_P9``%7M+Q``K@D4`,X)!(#M"R"`#S@8
+M$&X+,*\!`"``!#X.$``V#A``.&YC('Z.4Q`:#A`4'`X0`)JF40""(%!0KP$`
+M(`#\@PT0`'P?8%"S`@``?\!!0'X@0``<!V``!$%0@`GM+W"O`0`@``!\/V`_
+M;````!P'8(!XW"\`?!]@F+("`/__/V``'>TOD*\!`"```'P?8//;`@``!``(
+M!GK@5P(!`"`"_A]@`$+C+X"=[2^PKP$`(````,!A`'KG5X$%`"#\_TU``!P'
+M8`/^/V``V>TO`'K@5]"O`0`@``$"`"!U_A]@`'P_8+D#````$`(H`?Z_80``
+M`%``"=8O\*\!`"``````4`#_W"\!_A]@`-S0+P'^'V"`T-PO````4(#OU2\0
+ML`$`(```?!]@[*X"````0`@`#@$8`'P_8.S;`@``A$`0@(#7+S"P`0`@``#Z
+MYE>!!@`@`((@4/B##1``FJ91_($M"/C_34``'`=@4+`!`"```,CM+P!ZX%<!
+M`@`@=?X?8`!\/V#8`P```/\!*`""(%!PL`$`(```?-]A*MP"`!D"1Q`:`D<0
+M`!P'8`""(%"`O]8O`'P?8)"P`0`@`.C8`@`````(`'K@5P$#`"`8!``(`'K@
+M5X$!`"`!_A]@L+`!`"``&0!'$!H`1Q````!0@+G<+P!\'V!\L@(``!_M+P""
+M(%#0L`$`(```?!]@[=L"```"0!``?!]@3-P"````(`@`^N!7`=+_)_"P`0`@
+M``/^'V``@@`X@-#_)P0^#A``-@X0`#AN8Q!^CE,`?!]@$+$!`"``4+("`(`5
+M[2\```!0!(#M"R"`#S@0$&X+!#X.$``V#A`PL0$`(```.&YC)'Z.4Q`:#A`4
+M'`X0&!X.$!P@#A`@(@X0``"@85"Q`0`@``""P&$`F@9@`"'.+P``(&`!_A]@
+M``1!4(!`X"\``"!B<+$!`"```/KH5X$0`"``HNAA`/KF5X$-`"``_>97[`$`
+M``X!`""0L0$`(`#V_A]"@```(`":!F("H(<0%/X?8`"`AQ````!0$(`'$+"Q
+M`0`@``"(!P@`'@!``!PG8``@2&"`]\DO`"#'00R`YPD`&^A7T+$!`"``!0$`
+M(`":IE&````@`*"F40#ZYU<!`0`@`/KF5X+R_R?PL0$`(```H@A@`((@4(`G
+MTB\0`*X)%`#."1@`[@D<``X*(``N"A"R`0`@``2`[0L@@`\X)!!N"P0^#A``
+M-@X0`#AN8S!^CE,0&@X0,+(!`"``%!P.$!@>#A`<(`X0("(.$"0D#A`H)@X0
+M``#@80""P&%0L@$`(```?!]BM+@"`$H)*`A(!0@(`'R_80")`@``FB!``8%`
+M$'"R`0`@``%^`$``#B`82`%($/_ZX%<+`0`@@/X?8$@!2!`!_E]@D+(!`"``
+M_(5-$`!\'V*TN`(`2@DH"`!\OV$`B0(``)H@0`&%``BPL@$`(`#]@4T0_H5-
+M$`"%``C_@4T0@,?)+P``0&)*"2@(`)H@0-"R`0`@``"!8`@``4@(`WX!@`!\
+M?V*TM@(``"8@0@"'"!`$B0`(\+(!`"``!(&($(#`[B\&@8@0``%("`-^`8``
+M)B!"`(4("(!^`&@0LP$`(```@4@0`7X!0#]^`&```0@0`"0)8("]R2]*"2@(
+M``1!4#"S`0`@``#\`$``AP(`_`0`$`3^(%``_P9```(`0`3^)T``D"`84+,!
+M`"``_(%-"``<9V``)NDO$`"N"10`S@D8`.X)'``."B``+@IPLP$`(``D`$X*
+M*`!N"@2`[0L@@`\X,!!N"P0^#A``-@X0`#AN8Y"S`0`@`"1^CE,0&@X0%!P.
+M$!@>#A`<(`X0("(.$````&(`@J!AL+,!`"``7/[&00`<YV$#?@B``(!&0)`$
+M80@`AH%@D`1A"`"&(4#0LP$`(```AB!``OX@@`#\)D(``@```()H0#3_`4!R
+MB"8(`/R@8/"S`0`@`/#_``"0!&$(`(8A0`"&($`"_B"``()H0#*+@1"0!&$(
+M$+0!`"```(8A0`"&($`"_B"``()H0#*)(0@`B"!H,H.!$)`$80@PM`$`(```
+MAB%``(8@0`+^((!PA*8(`()H0#"+01"0!&$(`(8A0%"T`0`@``"&($`"_B"`
+M<81&"`"":$`QA4$0#/X_8``"0!``#D(8<+0!`"``3H@F"`".(!@``D%0Q84H
+M"`"$($`!`D`0B(A&"``%XE>0M`$`(`""$0`@C(`F"`8"@!``@B!0!`*`$`C^
+M/V``!$%0`(9A4+"T`0`@``#[Z"]`A`8(`'K@5X$"`"!8_@9`!/X_8``$05``
+MAF%0T+0!`"```/?H+P#\)D(``@``X/\(0`3^/V``!$%0`(9A4(#SZ"_PM`$`
+M(``$_@=`$/X_8``$05``AF%0`/'H+P-^"(``@$9`D`1A"!"U`0`@``"&(4``
+MAB!``OX@@(`1`"`!?B)```/A5QR()@@&`H`0,+4!`"``@@<`((R`)@@$`H`0
+M"/X_8``$05``AF%0`.CH+T"$!@A0M0$`(```>N!7`00`(%C^!D`$_C]@``1!
+M4`"&85``Y.@O``$`('"U`0`@`!R()@@`^/\G`)X'8!3^/V``!$%0`(9A4`#@
+MZ"\#?@B`D+4!`"```(!&0)`$80@`AB%``(8@0`+^((``_"9"``(```"":$"P
+MM0$`(``P_P%`!/X_8``$05``AF%0`-GH+P$$)P@"_@!@`'K@5]"U`0`@``$$
+M`"`!_@!@`'K@5X$"`"`8?@=`!OX_8``$05``AF%0\+4!`"```-/H+P-^"(``
+M@$9`E``!")(((0@`!$%0`(9A4(#/Z"\0M@$`(``!?@A``!``&@-^"(``@$9`
+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
+M/V`0O`$`(```!$%0`.O>+P!\OV&<X`(``(`&$`!ZX%<"`0`@`?X?8#"\`0`@
+M```&`"``""`(`(``0`""(%#V_E]`@.C)+P"`!@@`""`(4+P!`"```(`@0`!\
+M'V!<X`(```(`$````%`0`*X)!(#M"R"`#SAPO`$`(``4$&X+!#X.$``V#A``
+M.&YC''Z.4Q`:#A`4'`X0&!X.$)"\`0`@````H&%<_L9!&(@&""!^`&``>N!7
+M`0P`(`R`X`D`B"<(L+P!`"``7/X&0`"")T`>_E]@`)C(+UV$!@@#?@!@`WK@
+M5P(!`"#0O`$`(``>_C]@@```(!C^/V!Z@H80`(@'"``"`$``@(<0`H@'"/"\
+M`0`@```"`%`"@(<0%(@&"``"`%`4@(80``T`(`C^'V!<@$80$+T!`"``````
+M4%V`1A`(B`8(8("&$`J(!@AB@(80#(@&"&2`AA`PO0$`(```?#]@G+@"``"(
+M``AF@(80`H@`"&B`AA`$B``(:H"&$%"]`0`@``B(!@AL@(80"H@&"&Z`AA`,
+MB`8(<("&$!C^/V!Z@H80<+T!`"``!/Y?8`"$!@@`>N!7@0$`(`$$!PA`?@!H
+M`0!'$`&$!@B0O0$`(```>N!7`0$`(`A^`4``$$`8"(0&"`%^`&``>N!7@0$`
+M(+"]`0`@`````%!2@$80@`@`(`'^'V!2@$80'(@&"`!ZX%<"`0`@T+T!`"``
+M%(@&"``"`$``!`!``!!`&`!\'V#$N@(`1`D`"``!X5?PO0$`(``+`0`@`?X?
+M8(```"````!048!&$````%!3@$805(!&$!"^`0`@`$Z`AA`0`*X)%`#."1@`
+M[@D$@.T+((`/.!P0;@L$/@X0,+X!`"```#8.$``X;F,4?HY3$!H.$`!\'V!\
+MW`(`````"`!\/V!0O@$`(`"`W`(``(`@"(`EW2\``*!A`'P?8'#<`@`````(
+M`!K@IW"^`0`@``!\'V!XW`(`````"`!\`%#@`0```'*@00#\)D#@`0``D+X!
+M`"```'P?8)3<`@```@`0`_X?8(#*VR\`F@9@`?X_8``N\R^PO@$`(``"_C]@
+M`'P?8)C<`@```@`0$`"N"02`[0L@@`\X%!!N"]"^`0`@``0^#A``-@X0`#AN
+M8Q!^CE,`?!]@N>$"```$``@`>N!7\+X!`"```04`(`7^'V"`P]LO````4(!I
+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
+M`'Q?8(S``@```"$(`(8@0``"`1#\@2T(\,H!`"```(`@0`!\'V`\N0(```,`
+M$`2`[0L@@`\X%!!N"P0^#A`0RP$`(```-@X0`#AN8Q!^CE,`?!]@U+$"`(#3
+MZ2\```!0!(#M"S#+`0`@`""`#S@0$&X+!#X.$``V#A``.&YC''Z.4Q`:#A`4
+M'`X04,L!`"``&!X.$```H&$`@`8(`'S_8<#;`@``@$<(`'P_8,3;`@!PRP$`
+M(```@"`(`(3@IP2`)@@`\B!``OY`@`!\/V#,VP(``(`@")#+`0`@``"$(```
+M@@`X``#`80"`!@@`>N!7`18`(`2`)@@#_@!0L,L!`"``!7K@5XT-`""`#@`@
+M`'P_8-2R`@!8@0`(`'K@5X$*`"#0RP$`(```@$<(`GKA5X$"`"``?!]@V-L"
+M```$``@`>N!7@08`(/#+`0`@``!\/V#4L@(`5($`"`%^`$!4@0`0`'P_8)RM
+M`@``@``($,P!`"```7X`0`"``!``@`8(@.S.+X`&`"``@`8(@$K=+P`%`"`P
+MS`$`(``"?H"!`'R&`4#,`0````8X[W(``.]R```)<P``%G,``%#,`0`@``ES
+M```6<P```'S_8<#;`@``@$<(``7G5P$$`"``G`<0<,P!`"```GXG@`!\'V#0
+MVP(`````"``"`````@`X``8`(`!ZX5>0S`$`(``"!0`@!(`F"`;ZX%>"`P`@
+M`'P?8/BP`@``!``(`'K@5[#,`0`@``$!`"````!0`##5+P!\_V'`VP(``(!'
+M"`)^(8``?!]@T,P!`"``U-L"``````@``@````(`.```P&$`@$<(``7G5X$#
+M`"#PS`$`(```G`<0`GXG@`!\'V#0VP(`````"``"`````@`X$`"N"1#-`0`@
+M`!0`S@D8`.X)!(#M"R"`#S@<$&X+!#X.$``V#A``.&YC,,T!`"``&'Z.4Q`:
+M#A`4'`X0`'R_8=2R`@`<@48(`WXA@`!\WV%0S0$`(`#DP0(``)Q@0`2!(0@$
+M`@`0`($A"``"`!"`<L8O'(%&"'#-`0`@``-^(8``"()0`)Q@0`2)`1``B0$0
+M)($F"/__($`D@P80D,T!`"```7Y!0`1^@9$;?H:)``0F0!_^(&``F"!0'(,&
+M$(!LQB^PS0$`(``0`*X)%`#."02`[0L@@`\X&!!N"P0^#A``-@X0`#AN8]#-
+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
+MC0@\`"T(``/B5X4``"`X`(T(```B"-#3`0`@``#ZX%>!)@`@`()`8```(0@@
+M^N!7C@$`("#^(%``G&!`\-,!`"``@```(``<9V`!_J9!`)XA4``"`1``A^=7
+M!0$`(`""(%`0U`$`(````@$0`((@4!@"`1`0`$$(```B"``#X5<"]O\G`()`
+M8##4`0`@``#ZYE>!&@`@$`!A"`"&H6`8`"$(`/K@5X(6`"#__Z9!4-0!`"``
+M`(7B5X(!`"``@B!0``("$(`&`"`4`"$(%((!$!``80APU`$`(``0A@`0```B
+M"``#X5<"`P`@&(`A"`#ZX%>!```@&(@!$)#4`0`@`!``80@`!@(00`!M"```
+M(0@@_B!```(!$#P`+0@`@^%7L-0!`"``!0(`(`""(5#\_V!@.``M"`""84``
+M@"$(`/K@5P$$`"#0U`$`(``0`@$0%(`@"!0"`1`0A``0`(`A"!2$`!`8!@$0
+M``(`(/#4`0`@`!`$`1`4!`$0&`8!$`"$`1``BD)@`/KF5X+E_R<$?H)`$-4!
+M`"```7['02!ZYU<.U/\G`?[G42P`+0@`GB!`+`(-$#``+0@PU0$`(```^N!7
+M`0$`(`">(%`P`@T0``"@'Q``K@D4`,X)&`#N"5#5`0`@`!P`#@H$@.T+((`/
+M."`0;@L$/@X0`#8.$``X;F,D?HY3<-4!`"``$!H.$!0<#A`8'@X0'"`.$"`B
+M#A````!B`(+`80'^OV&0U0$`(```GN=1`*`?"``!`$@``0!(``$`2``!`$@`
+M`0!(``$`2+#5`0`@```!`$@``0!(!'X@8`"`H!____]_`'KG5P$!`"#__S]B
+MT-4!`"``@```(`"B*%)``&T(/``M"`"#X5>%```@.`!M"`"`(0CPU0$`(```
+M^N!7@0H`(`'^YT$`@D!@```A""#ZX%>.`0`@(/X@4!#6`0`@``":($"````@
+M`)HF8`!ZYU>!`0`@`*/@5P8"`"```0`@,-8!`"```*/@5XX``"``@B!B$`!!
+M"`"`(0@``^%7@O;_)P3^84!0U@$`(``!_J9!(/KF5P[P_R<``*`?`/KG5P$!
+M`"``(@@0``$`('#6`0`@`````%````@0`)X'8!``K@D4`,X)&`#N"1P`#@H@
+M`"X*D-8!`"``!(#M"R"`#S@D$&X+!#X.$``V#A``.&YC$'Z.4P!\'V"PU@$`
+M(``HL0(`@&'H+P```%`$@.T+((`/.!`0;@L$/@X0`#8.$-#6`0`@```X;F,0
+M?HY3`'P?8+GA`@``!``(`'K@5P("`"!Z_A]@\-8!`"```'P_8%X"````+?TO
+M`'Q?8.#A`@````$(`'P`8````(`0UP$`(```>N!7@0(`(`!\/V#DX0(``(0`
+M"/]_`$``@$`0`'Q?8##7`0`@`.#A`@````$(````0````1``?#]@W>$"``"$
+M(`@`^N!74-<!`"``@0,`(`%^`$````$0`'P_8.3A`@``A``(`7X`0`"`0!!P
+MUP$`(```?#]@Y.$"``"$``@:>N!7"P<`(`!\/V#FX0(``(@`")#7`0`@``%^
+M`$``$$`8`("`$!YZX5<"!0`@````4`!\/V#HX0(`L-<!`"```("`$`+^'V``
+M#``@````4`!\/V#FX0(``("`$`!\/V#0UP$`(`#DX0(``(0`"`9ZX%<)!0`@
+M`'P_8.CA`@``B``(`7X`0/#7`0`@```00!@`@(`09'KA5P(#`"`!_A]@@`(`
+M(````%``?#]@$-@!`!@`Z.$"``"`@!````!0!(#M"R"`#S@0$&X+`!0"`"``
+M!#X.$``V#A``.&YC$'Z.4P!&`"@`>N!7@@$`((![`"@@%`(`(```>N!7@0$`
+M(`2`[0L@@`\X$!!N"P!R]2^`_?\G!#X.$$`4`@`@```V#A``.&YC$'Z.4P!]
+MX%<`\@(`C```((!V]2\`]/\O8!0"`"```'K@5X$``""`=/4O!(#M"R"`#S@0
+M$&X+!#X.$``V#A"`%`(`(```.&YC$'Z.4P!\/V``\P(``'P?8`("``"(@``0
+M`'P?8*`4`@`@`+=Q```"?D"``'P?8+",```"?@"```1`0`!\'V"0P@(`P!0"
+M`"````3@IY3R`!``?!]@``,P<8R``!`%_A]@D(``$`!A]B_@%`(`(```>N!7
+M@0``((!D]2\!_A]@@&#V+X`?X"\$@.T+((`/.``5`@`@`!`0;@L$/@X0`#8.
+M$``X;F,<?HY3&!H.$`""@&`%?D"`(!4"`"```'Q_8'2_`@``A,%``GX@@`"`
+M($`#_B"``(`@4`+^((!`%0(`(```_`!`2*0"`!!^(T``A$$`!`!C"`!\OV!(
+MC`(``(B"0&`5`@`@``@`HP@,`,,(`)JF41`:#A`!_O]@%`X.$``,XV``J^`O
+M@!4"`"```'K@5P(!`"``F@9@@```("/^'V`8`*X)!(#M"R"`#SB@%0(`(``<
+M$&X+!#X.$``V#A``.&YC''Z.4Q`:#A`4'`X0&!X.$,`5`@`@``'^OV$`?#]@
+M=+\"``B`P`D%_@:``'P_8'2_`@```N!!X!4"`"````(```!ZX%<!!@`@`)H&
+M8``<)V"`X?\O```@8`#ZX%<`%@(`(``!`@`@./X?8``$05``2NXO``,`(`B`
+M!P@`',!!`?ZF02`6`@`@``;ZYE<%]?\G````4!``K@D4`,X)&`#N"02`[0L@
+M@`\X0!8"`"``'!!N"P0^#A``-@X0`#AN8QA^CE,0&@X0%!P.$!'^OX%@%@(`
+M(```?-]A!``P``!\7V`0]@(``'P_8!3V`@``?!]@"*@"`(`6`@`@`````1``
+M?!]@R*@"``"``!"`3NXO`#>]+PO^'V``@(84H!8"`"```'P?8`<'````@(84
+M`?X?8```!Q2`7^8O`'P?8%$```#`%@(`(`"`@>8O`'P?8$H`````8N8O`'P?
+M8+=Q````AN8O`'P?8.`6`@`@`/=P````;N8O`'P?8#UP````9>8O`'P?8#IQ
+M``"`<N8O`!<"`"``@.G3+P!U`R@``"!@`/K@5P(0`"````!0@"SF+P``(&`@
+M%P(`(```^N!7@@T`(`'^'V``*N8O```@8`#ZX%<""P`@`OX?8$`7`@`@`(`G
+MYB\``"!@`/K@5X((`"`#_A]@`"7F+P``(&``^N!78!<"`"```@8`(````%!]
+M_C^8`$WK+P``(&``^N!7`@,`(`'^'V"`%P(`(`#Z_C^8`$KK+P``(&``^N!7
+M`0(`(#7^'V``!$%0`!CN+Z`7`@`@`(```"``@@!@$`"N"10`S@D$@.T+((`/
+M.!@0;@L$/@X0P!<"`"```#8.$``X;F,0?HY3`%T#*```(&``^N!7`0(`(#;^
+M'V#@%P(`(```!$%0``_N+X```"````!0!(#M"R"`#S@0$&X+!#X.$``8`@`@
+M```V#A``.&YC$'Z.4P`X`R@$@.T+((`/.!`0;@L$/@X0(!@"`"```#8.$``X
+M;F,0?HY3@)D!*`!ZX%>!`0`@-OX?8`;^/V!`&`(`(```'P`@@)T"*`!ZX%>!
+M`0`@-OX?8`?^/V``'``@````4&`8`@`@``#-Z"\``"!@`/K@5P(5`"`!_A]@
+M@,KH+P``(&``^N!7@!@"`"``@A(`(`/^'V``R.@O```@8`#ZX%<"$``@`OX?
+M8(#%Z"^@&`(`(````"!@`/K@5X(-`""`J.HO@*$!*`!ZX%>!`0`@-OX?8,`8
+M`@`@``G^/V"`#@`@`,("*`!ZX%>!`0`@-OX?8`C^/V"`"P`@X!@"`"```-D"
+M*(#I`B@`]`(H``P`*```(&``^N!7@@,`(`/^'V``&0(`(```?#]@`'T``(`9
+MZR\``"!@`/K@5P$!`"`V_A]@@`,`("`9`@`@`(#!ZB^`J>HO@+#J+X"WZB\`
+MH.HO````4``!`"``!$%00!D"`"``@./M+P2`[0L@@`\X$!!N"P!\'V!\J0(`
+M`'P_8`#S`@!@&0(`(`"`@``0`'P?8$BO`@"$@``0`'R?8,2*`@``?P)``'Q?
+M8(`9`@`@`!S=`@`0``$0$/Y_8!0&`1``@B!0#`(!$`""`&`(``$0H!D"`"``
+M!``!$````1``"`)@`'Q?8&3,`@`0``$0%`8!$`P"`1#`&0(`(```@@!@"``!
+M$`0``1````$0````4`"`#S@$/@X0`#8.$.`9`@`@```X;F,H?HY3$!H.$!0<
+M#A`8'@X0'"`.$"`B#A```"!B`!H"`"```(*@80">YU$```!0_($-$``@"%(`
+M``!0`((@4``$05`@&@(`(`"`W``H```@8`#ZX%<"=P`@`?X?8(#,`"@```!0
+M`?X_8$`:`@`@```$05``V``H```@8`#ZX%>"<@`@`?X?8`#(`"@!_A]@8!H"
+M`"```?X_8``$05"`TP`H```@8`#ZX%<";@`@`OX?8(##`"B`&@(`(`````!0
+M`?X_8``$05``SP`H```@8`#ZX%>":0`@`?X?8*`:`@`@``"_`"@```!0`?X_
+M8`'^7V"`R@`H```@8`#ZX%<"90`@P!H"`"```?X?8("Z`"@!_A]@`?X_8`'^
+M7V``Q@`H```@8`#ZX%?@&@(`(`""8``@`OX?8`"V`"@```!0`?X_8`'^7V"`
+MP0`H```@8``;`@`@``#ZX%<"7``@`?X?8("Q`"@```!0`?X_8`'^7V``O0`H
+M(!L"`"`````@8`#ZX%>"5P`@`?X?8`"M`"@!_A]@`?X_8`'^7V!`&P(`(`"`
+MN``H```@8`#ZX%<"4P`@`OX?8("H`"@```!0`?X_8&`;`@`@``'^7V``M``H
+M```@8`#ZX%>"3@`@`?X?8`"D`"@```!0@!L"`"```?X_8``$05"`KP`H```@
+M8`#ZX%<"2@`@`?X?8("?`"B@&P(`(``!_A]@`?X_8``$05``JP`H```@8`#Z
+MX%>"10`@`OX?8,`;`@`@``";`"@'_M]A````4`'^/V``GD=@`*8`*```(&``
+M^N!7X!L"`"``@D``(`'^'V``E@`H`)P(B`%^X&$```!0`?X_8`">1V``'`(`
+M(`"`H``H```@8`#ZX%<".P`@`?X?8("0`"@!_A]@`?X_8"`<`@`@``">1V``
+MG``H```@8`#ZX%>"-@`@`OX?8`",`"C_?\=!0!P"`"```'KG5PKP_R<```!0
+M`?X_8`">1V``E@`H```@8`#ZX%=@'`(`(`"",``@`?X?8`"&`"@```!0`?X_
+M8``$05"`D0`H```@8(`<`@`@``#ZX%<"+``@_/\-0`"+`"@``"!@`/K@5X(I
+M`"#\@0T(H!P"`"```'K@5P$!`"`G_A]@`"L`(`'^'V"`?``H`?X?8`'^/V#`
+M'`(`(```!$%0`(@`*```(&``^N!7@B(`(`+^'V``>``H#_[?8>`<`@`@````
+M`%`!_C]@``1!4`"#`"@``"!@`/K@5X(=`"`!_A]@`!T"`"```',`*````%`!
+M_C]@``1!4(!^`"@``"!@`/K@5P(9`"`@'0(`(`#\_PU``'@`*```(&``^N!7
+M@A8`(``@"$``$``:_($-"$`=`@`@```0`!@`(.!I`)`'&@'^'V``:0`H`?X?
+M8`'^/V``!$%08!T"`"``@'0`*```(&``^N!7`@\`(`+^'V"`9``H_W_'00!Z
+MYU>`'0(`(`"*Z_\G````4`'^/V``!$%0@&X`*```(&``^N!7`@D`(*`=`@`@
+M``'^'V"`7@`H````4`""(%``!$%0`&H`*```(&``^N!7P!T"`"``@@0`(`'^
+M'V``6@`H`?X?8`""(%``!$%0@&4`*```(&#@'0(`(```^N!7`0(`(&'^'V``
+M!$%0@$WM+P`"`"`"_A]@@%,`*``>`@`@``">AA````!0$`"N"10`S@D8`.X)
+M'``."B``+@H$@.T+(!X"`"``((`/."@0;@L$/@X0`#8.$``X;F,8?HY3$!H.
+M$```H&%`'@(`(`#^_RU`````4(!Q_R\``"!@`/K@5P$"`"!B_A]@``1!4&`>
+M`@`@`(`_[2\`!0`@_HD-"`A^`)``#@`8I7K@5P$!`"`$_A]@@!X"`"``@```
+M(`'^'V``@`80````4!``K@D$@.T+((`/.!@0;@N@'@(`(``$/@X0`#8.$``X
+M;F,<?HY3$!H.$!0<#A```,!A`)JF4<`>`@`@``!ZYU<."@`@_O\M0`":!F"`
+M8/\O```@8`#ZX%<!`@`@X!X"`"``8_X?8``$05"`+NTO@`4`(`":1D``?!]@
+M7*H"```!(`@`'P(`(`#^B0T(`(1`0```@1`!_J9!`!OG5PWV_R<```!0$`"N
+M"2`?`@`@`!0`S@D$@.T+((`/.!P0;@L$/@X0`#8.$``X;F,<?HY30!\"`"``
+M$!H.$!0<#A`8'@X0``#@80""(%``AF%0`'P?8-BL`@!@'P(`(```!@`0`'P?
+M8-RL`@``!@`0`'P?8"RU`@```*`)`'P?8(`?`@`@`"RT`@``?-]A7*H"```!
+M!Q`&_A]@!`$'$`";X%<&!0`@H!\"`"```((`0`!\WV%<J@(```%'"`"&85``
+M``%```:`$`'^($#`'P(`(```F^!7!?O_)P">!V``R_\O```@8`#ZX%<"!@`@
+M`(`'".`?`@`@``%ZX%<!`@`@`'S?85RJ`@`$`0<0`!$`(`":!F``U/\O`"`"
+M`"`````@8`#ZX%<!`@`@9/X?8``$05``">TO``T`(`!\WV$@(`(`(`!<J@(`
+M``%'"$)^`4!?_C]@@!\`*`@!AQ```4<(0`@A"$`@`@`@```#X%<!`@`@!?X?
+M8`0!!Q``@`<0``4`(`!\'V#<K`(`8"`"`"```!H`$`!\'V#8K`(```0`$`'^
+M'V`$`0<0`(`'$(!BPR^`(`(`(`````!0$`"N"10`S@D8`.X)!(#M"R"`#S@<
+M$&X+!'Z.4Z`@`@`@```$05``!`X4`GX@@`"`($`#_B"``_X@B``$#A0`0`X(
+MP"`"`"```('@5PX#`"``0`X(`7X`0```#A0`0`X(`('@5PW]_R?@(`(`(``$
+M?HY#`(`/.`!\/V!``#```(`@"`3^((@!_B!@``(`$``A`@`@`````%``@`\X
+M`'Q_8$``,```@B!``(``:`)^(8``@`!H("$"`"``%WX`8`"``1````!0`(`/
+M.```0&````!0``B"4`#ZX%=`(0(`(`".`P`@``AB0`0&80``@`%X`!``&`%^
+M@D``B>!7C?S_)V`A`@`@``"`#S@$/@X0`#8.$``X;F,0?HY3@!``*``.`!@`
+M@B!0@"$"`"```'Q?8&S@`@```@$0`'Q?8'#@`@```@$0!/Y_8`!\7V"@(0(`
+M(`"TN`(`3`>!$$H#@1`$`T$4!0-!%`!\7V!@X`(```)!%,`A`@`@``!\7V!A
+MX`(```)!%`!\7V!BX`(```)!%`!\7V!HX`(`X"$"`"````(!%`!\7V!DX`(`
+M``(!%`2`[0L@@`\X$!!N"P0^#A``(@(`(```-@X0`#AN8R1^CE,0&@X0%!P.
+M$!@>#A`<(`X0("(.$"`B`@`@`'+^_V$`?+]A```A`!2>1A04GD84`!S'40R<
+M1A0`G$840"("`"``@/X?8@"@1A01_C^"@`_C+P!\'V`#!P```("(%(`-XR]@
+M(@(`(```?!]@!P<```"`B!0`?!]@E+X"``P`(`@`_$!H``P``(`B`@`@``0`
+M(`@`A``4'``@"`#\(&@`#```%```"``"`!04GD84H"("`"``%)Y&%`R<1A0`
+MG$84`*!&%``#XR\``,!A`,0&"`%^`&#`(@(`(```>N!7`@4`(```XR\`'`!0
+M('K@5PT1`"``?+]A```A`.`B`@`@``#$!@@!?@!@`'K@5P'[_R<`?%]@Y,$"
+M``""(%``?+]A`","`"`````A``#$!@@!?@!@`'K@5P$&`"``?+]A```A``3(
+M!@@@(P(`(````($0`GY!0`+^($`<^N!7#0(`(`#$!@@!?@!@`'K@5T`C`@`@
+M``+Z_R<`?%]@Y,("```%`0@!>N!7`@$`(!SZX%<!`0`@8","`"```?X?8``'
+M`"#__A]@`'R_80``(0`(@$84`@4A"`!\'V"`(P(`(``HKP(```)`$`!\'V`4
+ML`(`%G\A0`7^7V"`O+LO````4*`C`@`@`!``K@D4`,X)&`#N"1P`#@H@`"X*
+M!(#M"R"`#S@D$&X+P","`"``!#X.$``V#A``.&YC$'Z.4P!\/V`PO@(`V/\`
+M0`'^7V#@(P(`(```>]XO``X`&`2`[0L@@`\X$!!N"P0^#A``-@X0`#AN8P`D
+M`@`@`!!^CE,`?#]@$+T"`-S_`$``!$%0@'3>+P`.`!@$@.T+("0"`"``((`/
+M.!`0;@L$/@X0`#8.$``X;F,4?HY3$!H.$`!\'V!`)`(`(`"DM@(```$`"`AZ
+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
+M`)HF8``$05!`*@(`(```K]TO`'K@5P()`"`L_P9`"/XF0`'^7V``K-TO`'K@
+M5V`J`@`@``(&`""`_P9`%/XF0``$05``J=TO`'K@5P(#`"!D_P9`@"H"`"``
+M)/XF0``$05``IMTO`'K@5X$``"`!_M]A``['&0!\OV&@*@(`(`!0LP(`G/_F
+M03#^)D``G@=@@(W<+P`<`&@`#L`9`)X'8,`J`@`@``'^/V``!$%0`-K<+P""
+M(%``?!]@\=L"```"0!``'`=@X"H"`"``$`"N"10`S@D8`.X)!(#M"R"`#S@<
+M$&X+!#X.$``V#A``*P(`(```.&YC&'Z.4Q`:#A`4'`X0`'R_83BZ`@`$_P9`
+M1/\F0"`K`@`@`(!_W"\`#L`9)/\&0%3_)D"`?=PO`!P`:``.P!D`@B!00"L"
+M`"```'P?8*[@`@```D`0`'P?8*S@`@```H`0`'P?8*K@`@!@*P(`(````D`0
+M`(-&$``<!V`0`*X)%`#."02`[0L@@`\X&!!N"X`K`@`@``'^/V``?!]@JN`"
+M```"0!``@B!0`'P?8*_@`@```D`0H"L"`"``````4`"`#S@$/@X0`#8.$``X
+M;F,4?HY3$!H.$`!\/V#`*P(`(``0M`(`O/\`0``$05"`?=TO`(`_4`"`(&@?
+M_J")`'P?8.`K`@`@`!]:``"`OL<O`'P?8-)2````IL<O`((@4`!\'V!8W`(`
+M`"P"`"````(`$`!\'V!@W`(```(`$`!\'V!DW`(```(`$`!\'V`@+`(`(`!<
+MW`(```(`$`'^?V``?!]@F-P"```&`!`!_E]@`'P?8$`L`@`@`&G<`@``!$`0
+M`'P?8&K<`@``!$`0`'P?8'S<`@``!@`08"P"`"```'P?8'7<`@```D`0`'P?
+M8&C<`@```D`0`'P?8'#<`@"`+`(`(````@`0`'P?8)S<`@```@`0`'P?8/C<
+M`@```D`0`'P?8*`L`@`@``S=`@```D`0`'P?8`W=`@```D`0`'P?8.W<`@``
+M`D`0P"P"`"```'P?8`_=`@```D`0`'P?8!#=`@```D`0`'P?8-3<`@#@+`(`
+M(````D`0`'P?8-S<`@```D`0`'P?8/#<`@```@`0`'P?8``M`@`@`/3<`@``
+M`@`0`)H&8!``K@D$@.T+((`/.!00;@L`@B!0("T"`"```'P?8-RQ`@`T`P`0
+M````4`"`#S@$/@X0`#8.$``X;F-`+0(`(``@?HY3$!H.$!0<#A`8'@X0'"`.
+M$(#X_R\`#L`9`'7_+V`M`@`@```<`&@`#L`9@+'_+P`<`&@`#L`9`$O_+P`<
+M`&@`#L`9@"T"`"``@,3_+P`<`&@`#L`9@&4`*``<`&@`#L`9`(O_+P`<X&F@
+M+0(`(```CL<9`)JF40!\/V`'W`(``)I`$`/^'V`!@$`0,?Y?8,`M`@`@``*$
+M0!`P_A]@`X!`$`2$0!`!_A]@`'P_8/S;`@``@$`0X"T"`"``!?X?8`&`0!`"
+M_A]@`H!`$`3^'V`#@$`0"_X?8`2`0!``+@(`(``6_A]B!:!`$"S^'V`&@$`0
+M`'P?8-W<`@`*_E]@`&RZ+R`N`@`@``!\'V#HV`(``!H`$`!\'V"`X`(``!I`
+M$`!\'V#SVP(`0"X"`"```"!`$`!\'V"(V`(``!H`$`!\'V#0W`(``!H`$`!\
+M'V!@+@(`(`#HW`(``!H`$`!\'V"$X`(``!H`$`!\'V"(X`(``!H`$(`N`@`@
+M``!\'V",X`(``!H`$`!\'V"0X`(``!H`$`!\'V!,W`(`H"X"`"```!H`$`!\
+M'V"4X`(``!H`$`!\'V"8X`(``!Y`$``<!V#`+@(`(``0`*X)%`#."1@`[@D<
+M``X*!(#M"R"`#S@@$&X+!#X.$.`N`@`@```V#A``.&YC%'Z.4Q`:#A"`D?$O
+M``Z@&0"?\2\`&@!H`"\"`"````Z@&0"/_R\`&@!H``Z@&0!\/V"8X`(``(0`
+M"``:`&@@+P(`(```@$`0`)H&8!``K@D$@.T+((`/.!00;@L`?#]@B-@"`$`O
+M`@`@``"``!``@`\X`'P_8-#<`@``@``0`(`/.`!\/V"$X`(`8"\"`"```(``
+M$````%``@`\X`'P_8)#@`@``@``0`(`/.`!\/V"`+P(`(`#PV`(``(``$`"`
+M#S@`?#]@3-P"``"``!``@`\X`'P_8*`O`@`@`.C<`@``@``0`(`/.`0^#A``
+M-@X0`#AN8Q1^CE,0&@X0P"\"`"```)JF40!\/V",L0(`P/\`0(#IVR\"_B:`
+M``1!4`#\`$#@+P(`(`!0VP(```0`$`'^ID$$^N97"_S_)P!\'V"`8@``@.W_
+M+P`P`@`@``!\'V",8@```.[_+P!\'V`K8P```.C_+P!\'V`;8P``(#`"`"``
+M`.__+Q``K@D$@.T+((`/.!00;@L$/@X0`#8.$``X;F-`,`(`(``0?HY3````
+M4("#SR\`?#]@-+("`,C_`$``!$%0@.O<+V`P`@`@``!\'V`8$```@-O_+P!\
+M'V`P$```@.+_+P":U"\`30`H@#`"`"``!(#M"R"`#S@0$&X+!#X.$``V#A``
+M.&YC$'Z.4P```%"@,`(`(`"`X_XO`'P?8!`0````T?\O!(#M"R"`#S@0$&X+
+M!#X.$,`P`@`@```V#A``.&YC&'Z.4Q`:#A`4'`X0`'S?82"^`@``?P=`X#`"
+M`"``>'\G0`'^7V``VMPO``Z@&5A_!T",?R=```1!4(#7W"\`,0(`(```&@!H
+M``Z@&0'^/V``?!]@T.$"```"`!``@B!0`'P?8"`Q`@`@`*3A`@```D`0`'P?
+M8+CA`@```D`0`'P?8,'A`@```D`00#$"`"```'P?8+GA`@```D`0`'P?8-SA
+M`@```D`0`'P?8.3A`@!@,0(`(````D`0`'P?8.;A`@```H`0`'P?8.CA`@``
+M`H`0`'P?8(`Q`@`@`,+A`@```D`0`'P?8,/A`@```D`0`'P?8,SA`@```D`0
+MH#$"`"```'P?8,#A`@```D`0`'P?8*CA`@```@`0`)H&8!``K@G`,0(`(``4
+M`,X)!(#M"R"`#S@8$&X+`'P_8)"H`@``@``(``!@".`Q`@`@``R&`!`(A@`0
+M&(``"`````@`>N!7`@$`(`;^'V"`%0`@`#("`"``%(``"`````@`>N!7`@$`
+M(`?^'V"`$@`@$(``"```0`@@,@(`(``">N%7!0$`(`"%X5<%`0`@"/X?8(`.
+M`"`$@``(````"$`R`@`@```!X5<-`0`@"?X?8(`+`"`@@``(``!`""R$`!`H
+MA``08#("`"``-(``"`````@`>N!7`@$`(`K^'V"`!@`@,(``"```8`B`,@(`
+M(```!^%7!0$`(`O^'V"``P`@)(``"`````@`@>%7#0$`(*`R`@`@``S^'V"`
+M```@````4`"`#S@```!0`(`/.````%``@`\XP#("`"``!#X.$``V#A``.&YC
+M%'Z.4_S_#4``B_TO````4`2`[0O@,@(`(``@@`\X%!!N"P0^#A``-@X0`#AN
+M8Q1^CE,0&@X0@!#!+P`S`@`@````H&$`^N97`04`((`,P2\!>N!7@@,`(".$
+M!@@`?#]@(#,"`"``U+("`%"!0!!,@0`(`7X`0$R!`!`0`*X)!(#M"R"`#SA`
+M,P(`!``4$&X+`'@"`"``````````````````````````````````````````
+M```@>`(`(````````````````````````````````````````````$!X`@`@
+M````````````````````````````````````````````8'@"`"``````````
+M``````````````````````````````````"`>`(`(```````````````````
+M`````````````````````````*!X`@`@````````````````````````````
+M````````````````P'@"`"``````````````````````````````````````
+M``````#@>`(`(`````````````````````````````````````````````!Y
+M`@`@````````````````````````````````````````````('D"`"``````
+M``````````````````````````````````````!`>0(`(```````````````
+M`````````````````````````````&!Y`@`@````````````````````````
+M````````````````````@'D"`"``````````````````````````````````
+M``````````"@>0(`(```````````````````````````````````````````
+M`,!Y`@`@````````````````````````````````````````````X'D"`"``
+M````````````````````````````````````````````>@(`(```````````
+M`````````````````````````````````"!Z`@`@````````````````````
+M````````````````````````0'H"`"``````````````````````````````
+M``````````````!@>@(`(```````````````````````````````````````
+M`````(!Z`@`@````````````````````````````````````````````H'H"
+M`"````````````````````````````````````````````#`>@(`(```````
+M`````````````````````````````````````.!Z`@`@````````````````
+M`````````````````````````````'L"`"``````````````````````````
+M```````````````````@>P(`(```````````````````````````````````
+M`````````$![`@`@````````````````````````````````````````````
+M8'L"`"````````````````````````````````````````````"`>P(`(```
+M`````````````````````````````````````````*![`@`@````````````
+M````````````````````````````````P'L"`"``````````````````````
+M``````````````````````#@>P(`(```````````````````````````````
+M``````````````!\`@`@````````````````````````````````````````
+M````('P"`"````````````````````````````````````````````!`?`(`
+M(````````````````````````````````````````````&!\`@`@````````
+M````````````````````````````````````@'P"`"``````````````````
+M``````````````````````````"@?`(`(```````````````````````````
+M`````````````````,!\`@`@````````````````````````````````````
+M````````X'P"`"``````````````````````````````````````````````
+M?0(`(````````````````````````````````````````````"!]`@`@````
+M````````````````````````````````````````0'T"`"``````````````
+M``````````````````````````````!@?0(`(```````````````````````
+M`````````````````````(!]`@`@````````````````````````````````
+M````````````H'T"`"``````````````````````````````````````````
+M``#`?0(`(````````````````````````````````````````````.!]`@`@
+M`````````````````````````````````````````````'X"`"``````````
+M```````````````````````````````````@?@(`(```````````````````
+M`````````````````````````$!^`@`@````````````````````````````
+M````````````````8'X"`"``````````````````````````````````````
+M``````"`?@(`(````````````````````````````````````````````*!^
+M`@`@````````````````````````````````````````````P'X"`"``````
+M``````````````````````````````````````#@?@(`(```````````````
+M``````````````````````````````!_`@`@````````````````````````
+M````````````````````('\"`"``````````````````````````````````
+M``````````!`?P(`(```````````````````````````````````````````
+M`&!_`@`@````````````````````````````````````````````@'\"`"``
+M``````````````````````````````````````````"@?P(`(```````````
+M`````````````````````````````````,!_`@`@````````````````````
+M````````````````````````X'\"`"``````````````````````````````
+M````````````````@`(`(```````````````````````````````````````
+M`````""``@`@````````````````````````````````````````````0(`"
+M`"````````````````````````````````````````````!@@`(`(```````
+M`````````````````````````````````````("``@`@````````````````
+M````````````````````````````H(`"`"``````````````````````````
+M``````````````````#`@`(`(```````````````````````````````````
+M`````````."``@`@````````````````````````````````````````````
+M`($"`"`````````````````````````````````````````````@@0(`(```
+M`````````````````````````````````````````$"!`@`@````````````
+M````````````````````````````````8($"`"``````````````````````
+M``````````````````````"`@0(`(```````````````````````````````
+M`````````````*"!`@`@````````````````````````````````````````
+M````P($"`"````````````````````````````````````````````#@@0(`
+M(`````````````````````````````````````````````""`@`@````````
+M````````````````````````````````````((("`"``````````````````
+M``````````````````````````!`@@(`(```````````````````````````
+M`````````````````&""`@`@````````````````````````````````````
+M````````@(("`"````````````````````````````````````````````"@
+M@@(`(````````````````````````````````````````````,""`@`@````
+M````````````````````````````````````````X(("`"``````````````
+M````````````````````````````````@P(`(```````````````````````
+M`````````````````````""#`@`@````````````````````````````````
+M````````````0(,"`"``````````````````````````````````````````
+M``!@@P(`(````````````````````````````````````````````("#`@`@
+M````````````````````````````````````````````H(,"`"``````````
+M``````````````````````````````````#`@P(`(```````````````````
+M`````````````````````````."#`@`@````````````````````````````
+M`````````````````(0"`"``````````````````````````````````````
+M```````@A`(`(````````````````````````````````````````````$"$
+M`@`@````````````````````````````````````````````8(0"`"``````
+M``````````````````````````````````````"`A`(`(```````````````
+M`````````````````````````````*"$`@`@````````````````````````
+M````````````````````P(0"`"``````````````````````````````````
+M``````````#@A`(`(```````````````````````````````````````````
+M``"%`@`@````````````````````````````````````````````((4"`"``
+M``````````````````````````````````````````!`A0(`(```````````
+M`````````````````````````````````&"%`@`@````````````````````
+M````````````````````````@(4"`"``````````````````````````````
+M``````````````"@A0(`(```````````````````````````````````````
+M`````,"%`@`@````````````````````````````````````````````X(4"
+M`"``````````````````````````````````````````````A@(`(```````
+M`````````````````````````````````````""&`@`@````````````````
+M````````````````````````````0(8"`"``````````````````````````
+M``````````````````!@A@(`(```````````````````````````````````
+M`````````("&`@`@````````````````````````````````````````````
+MH(8"`"````````````````````````````````````````````#`A@(`(```
+M`````````````````````````````````````````."&`@`@````````````
+M`````````````````````````````````(<"`"``````````````````````
+M```````````````````````@AP(`(```````````````````````````````
+M`````````````$"'`@`@````````````````````````````````````````
+M````8(<"`"````````````````````````````````````````````"`AP(`
+M(````````````````````````````````````````````*"'`@`@````````
+M````````````````````````````````````P(<"`"``````````````````
+M``````````````````````````#@AP(`(```````````````````````````
+M``````````````````"(`@`@````````````````````````````````````
+M````````((@"`"````````````````````````````````````````````!`
+MB`(`(````````````````````````````````````````````&"(`@`@````
+M````````````````````````````````````````@(@"`"``````````````
+M``````````````````````````````"@B`(`(```````````````````````
+M`````````````````````,"(`@`@````````````````````````````````
+M````````````X(@"`"``````````````````````````````````````````
+M````B0(`(````````````````````````````````````````````"")`@`@
+M````````````````````````````````````````````0(D"`"``````````
+M``````````````````````````````````!@B0(`(```````````````````
+M`````````````````````````(")`@`@````````````````````````````
+M````````````````H(D"`"``````````````````````````````````````
+M``````#`B0(`(````````````````````````````````````````````.")
+M`@`@`````````````````````````````````````````````(H"`"``````
+M```````````````````````````````````````@B@(`(```````````````
+M`````````````````````````````$"*`@`@````````````````````````
+M````````````````````8(H"`"``````````````````````````````````
+M``````````"`B@(`(```````````````````````````````````````````
+M`*"*`@`@````````````````````````````````````````````P(H"`"``
+M``````````````````````````````````````````#@B@(`(```````````
+M``````````````````````````````````"+`@`@````````````````````
+M````````````````````````((L"`"``````````````````````````````
+M``````````````!`BP(`(```````````````````````````````````````
+M`````&"+`@`@````````````````````````````````````````````@(L"
+M`"````````````````````````````````````````````"@BP(`(```````
+M`````````````````````````````````````,"+`@`@````````````````
+M````````````````````````````X(L"`"``````````````````````````
+M````````````````````C`(`(```````````````````````````````````
+M`````````"",`@`@````````````````````````````````````````````
+M0(P"`"```````'A6-!(```````````````````````````````!@C`(`(```
+M`````````````````````````````````````````(",`@`@````````````
+M````````````````````````````````H(P"`"``````````````````````
+M``````````````````````#`C`(`(```````````````````````````````
+M`````````````.",`@`@````````````````````````````````````````
+M`````(T"`"`````````````````````````````````````````````@C0(`
+M(````````````````````````````````````````````$"-`@`@````````
+M````````````````````````````````````8(T"`"``````````````````
+M``````````````````````````"`C0(`(```````````````````````````
+M`````````````````*"-`@`@````````````````````````````````````
+M````````P(T"`"````````````````````````````````````````````#@
+MC0(`(`````````````````````````````````````````````".`@`@````
+M````````````````````````````````````````((X"`"``````````````
+M``````````````````````````````!`C@(`(```````````````````````
+M`````````````````````&".`@`@````````````````````````````````
+M````````````@(X"`"``````````````````````````````````````````
+M``"@C@(`(````````````````````````````````````````````,".`@`@
+M````````````````````````````````````````````X(X"`"``````````
+M````````````````````````````````````CP(`(```````````````````
+M`````````````````````````""/`@`@````````````````````````````
+M````````````````0(\"`"``````````````````````````````````````
+M``````!@CP(`(````````````````````````````````````````````("/
+M`@`@````````````````````````````````````````````H(\"`"``````
+M``````````````````````````````````````#`CP(`(```````````````
+M`````````````````````````````."/`@`@````````````````````````
+M`````````````````````)`"`"``````````````````````````````````
+M```````````@D`(`(```````````````````````````````````````````
+M`$"0`@`@````````````````````````````````````````````8)`"`"``
+M``````````````````````````````````````````"`D`(`(```````````
+M`````````````````````````````````*"0`@`@````````````````````
+M````````````````````````P)`"`"``````````````````````````````
+M``````````````#@D`(`(```````````````````````````````````````
+M``````"1`@`@````````````````````````````````````````````()$"
+M`"````````````````````````````````````````````!`D0(`(```````
+M`````````````````````````````````````&"1`@`@````````````````
+M````````````````````````````@)$"`"``````````````````````````
+M``````````````````"@D0(`(```````````````````````````````````
+M`````````,"1`@`@````````````````````````````````````````````
+MX)$"`"``````````````````````````````````````````````D@(`(```
+M`````````````````````````````````````````""2`@`@````````````
+M````````````````````````````````0)("`"``````````````````````
+M``````````````````````!@D@(`(```````````````````````````````
+M`````````````("2`@`@````````````````````````````````````````
+M````H)("`"````````````````````````````````````````````#`D@(`
+M(````````````````````````````````````````````."2`@`@````````
+M`````````````````````````````````````),"`"``````````````````
+M```````````````````````````@DP(`(```````````````````````````
+M`````````````````$"3`@`@````````````````````````````````````
+M````````8),"`"````````````````````````````````````````````"`
+MDP(`(````````````````````````````````````````````*"3`@`@````
+M````````````````````````````````````````P),"`"``````````````
+M``````````````````````````````#@DP(`(```````````````````````
+M``````````````````````"4`@`@````````````````````````````````
+M````````````()0"`"``````````````````````````````````````````
+M``!`E`(`(````````````````````````````````````````````&"4`@`@
+M````````````````````````````````````````````@)0"`"``````````
+M``````````````````````````````````"@E`(`(```````````````````
+M`````````````````````````,"4`@`@````````````````````````````
+M````````````````X)0"`"``````````````````````````````````````
+M````````E0(`(````````````````````````````````````````````""5
+M`@`@````````````````````````````````````````````0)4"`"``````
+M``````````````````````````````````````!@E0(`(```````````````
+M`````````````````````````````("5`@`@````````````````````````
+M````````````````````H)4"`"``````````````````````````````````
+M``````````#`E0(`(```````````````````````````````````````````
+M`."5`@`@`````````````````````````````````````````````)8"`"``
+M```````````````````````````````````````````@E@(`(```````````
+M`````````````````````````````````$"6`@`@````````````````````
+M````````````````````````8)8"`"``````````````````````````````
+M``````````````"`E@(`(```````````````````````````````````````
+M`````*"6`@`@````````````````````````````````````````````P)8"
+M`"````````````````````````````````````````````#@E@(`(```````
+M``````````````````````````````````````"7`@`@````````````````
+M````````````````````````````()<"`"``````````````````````````
+M``````````````````!`EP(`(```````````````````````````````````
+M`````````&"7`@`@````````````````````````````````````````````
+M@)<"`"````````````````````````````````````````````"@EP(`(```
+M`````````````````````````````````````````,"7`@`@````````````
+M````````````````````````````````X)<"`"``````````````````````
+M````````````````````````F`(`(```````````````````````````````
+M`````````````""8`@`@````````````````````````````````````````
+M````0)@"`"````````````````````````````````````````````!@F`(`
+M(````````````````````````````````````````````("8`@`@````````
+M````````````````````````````````````H)@"`"``````````````````
+M``````````````````````````#`F`(`(```````````````````````````
+M`````````````````."8`@`@````````````````````````````````````
+M`````````)D"`"`````````````````````````````````````````````@
+MF0(`(````````````````````````````````````````````$"9`@`@````
+M````````````````````````````````````````8)D"`"``````````````
+M``````````````````````````````"`F0(`(```````````````````````
+M`````````````````````*"9`@`@````````````````````````````````
+M````````````P)D"`"``````````````````````````````````````````
+M``#@F0(`(`````````````````````````````````````````````":`@`@
+M````````````````````````````````````````````()H"`"``````````
+M``````````````````````````````````!`F@(`(```````````````````
+M`````````````````````````&":`@`@````````````````````````````
+M````````````````@)H"`"``````````````````````````````````````
+M``````"@F@(`(````````````````````````````````````````````,":
+M`@`@````````````````````````````````````````````X)H"`"``````
+M````````````````````````````````````````FP(`(```````````````
+M`````````````````````````````"";`@`@````````````````````````
+M````````````````````0)L"`"``````````````````````````````````
+M``````````!@FP(`(```````````````````````````````````````````
+M`(";`@`@````````````````````````````````````````````H)L"`"``
+M``````````````````````````````````````````#`FP(`(```````````
+M`````````````````````````````````.";`@`@````````````````````
+M`````````````````````````)P"`"``````````````````````````````
+M```````````````@G`(`(```````````````````````````````````````
+M`````$"<`@`@````````````````````````````````````````````8)P"
+M`"````````````````````````````````````````````"`G`(`(```````
+M`````````````````````````````````````*"<`@`@````````````````
+M````````````````````````````P)P"`"``````````````````````````
+M``````````````````#@G`(`(```````````````````````````````````
+M``````````"=`@`@````````````````````````````````````````````
+M()T"`"````````````````````````````````````````````!`G0(`(```
+M`````````````````````````````````````````&"=`@`@````````````
+M````````````````````````````````@)T"`"``````````````````````
+M``````````````````````"@G0(`(```````````````````````````````
+M`````````````,"=`@`@````````````````````````````````````````
+M````X)T"`"``````````````````````````````````````````````G@(`
+M(````````````````````````````````````````````"">`@`@````````
+M````````````````````````````````````0)X"`"``````````````````
+M``````````````````````````!@G@(`(```````````````````````````
+M`````````````````(">`@`@````````````````````````````````````
+M````````H)X"`"````````````````````````````````````````````#`
+MG@(`(````````````````````````````````````````````.">`@`@````
+M`````````````````````````````````````````)\"`"``````````````
+M```````````````````````````````@GP(`(```````````````````````
+M`````````````````````$"?`@`@````````````````````````````````
+M````````````8)\"`"``````````````````````````````````````````
+M``"`GP(`(````````````````````````````````````````````*"?`@`@
+M````````````````````````````````````````````P)\"`"``````````
+M``````````````````````````````````#@GP(`(```````````````````
+M``````````````````````````"@`@`@````````````````````````````
+M````````````````(*`"`"``````````````````````````````````````
+M``````!`H`(`(````````````````````````````````````````````&"@
+M`@`@````````````````````````````````````````````@*`"`"``````
+M``````````````````````````````````````"@H`(`(```````````````
+M`````````````````````````````,"@`@`@````````````````````````
+M````````````````````X*`"`"``````````````````````````````````
+M````````````H0(`(```````````````````````````````````````````
+M`""A`@`@````````````````````````````````````````````0*$"`"``
+M``````````````````````````````````````````!@H0(`(```````````
+M`````````````````````````````````("A`@`@````````````````````
+M````````````````````````H*$"`"``````````````````````````````
+M``````````````#`H0(`(```````````````````````````````````````
+M`````."A`@`@`````````````````````````````````````````````*("
+M`"`````````````````````````````````````````````@H@(`(```````
+M`````````````````````````````````````$"B`@`@````````````````
+M````````````````````````````8*("`"``````````````````````````
+M``````````````````"`H@(`(```````````````````````````````````
+M`````````*"B`@`@````````````````````````````````````````````
+MP*("`"````````````````````````````````````````````#@H@(`(```
+M``````````````````````````````````````````"C`@`@````````````
+M````````````````````````````````(*,"`"``````````````````````
+M``````````````````````!`HP(`(```````````````````````````````
+M`````````````&"C`@`@````````````````````````````````````````
+M````@*,"`"````````````````````````````````````````````"@HP(`
+M(````````````````````````````````````````````,"C`@`@````````
+M````````````````````````````````````X*,"`"``````````````````
+M````````````````````````````I`(`(```````````````````````````
+M`````````````````""D`@`@````````````````````````````````````
+M````````0*0"`"````````````````````````````````````````````!@
+MI`(`(````````````````````````````````````````````("D`@`@````
+M````````````````````````````````````````H*0"`"``````````````
+M``````````````````````````````#`I`(`(```````````````````````
+M`````````````````````."D`@`@````````````````````````````````
+M`````````````*4"`"``````````````````````````````````````````
+M```@I0(`(````````````````````````````````````````````$"E`@`@
+M````````````````````````````````````````````8*4"`"``````````
+M``````````````````````````````````"`I0(`(```````````````````
+M`````````````````````````*"E`@`@````````````````````````````
+M````````````````P*4"`"``````````````````````````````````````
+M``````#@I0(`(`````````````````````````````````````````````"F
+M`@`@````````````````````````````````````````````(*8"`"``````
+M``````````````````````````````````````!`I@(`(```````````````
+M`````````````````````````````&"F`@`@````````````````````````
+M````````````````````@*8"`"``````````````````````````````````
+M``````````"@I@(`(```````````````````````````````````````````
+M`,"F`@`@````````````````````````````````````````````X*8"`"``
+M````````````````````````````````````````````IP(`(```````````
+M`````````````````````````````````""G`@`@````````````````````
+M````````````````````````0*<"`"``````````````````````````````
+M``````````````!@IP(`(```````````````````````````````````````
+M`````("G`@`@````````````````````````````````````````````H*<"
+M`"````````````````````````````````````````````#`IP(`(```````
+M`````````````````````````````````````."G`@`@````````````````
+M`````````````````````````````*@"`"``````````````````````````
+M```````````````````@J`(`(```````````````````````````````````
+M`````````$"H`@`@````````````````````````````````````````````
+M8*@"`"````````````````````````````````````````````"`J`(`(```
+M````````````````````H/("`*#_`@```````````*"H`@`@`$CR`@!`\@(`
+M1/("``$```"`\@(`@/\"````````````P*@"`"``!/("``#R`@``````````
+M`````````````````#``,`#@J`(`(``4`#````(``(``````````Z`,```#Z
+M```!````-``P``"I`@`@`!@`,```!`````$````````0)P```/H```$````@
+M`#``(*D"`"``&``P``````!``````````!`G``"`\/H"!@```#P`,`!`J0(`
+M(`````````````````#_____$"<```"'DP,&`````````&"I`@`@````````
+M````````````````````Q(L"``````#6````@*D"`"``]*P"`/BL`@`(K0(`
+M#*T"`!"M`@`4K0(`&*T"`!RM`@"@J0(`(`#PK`(`\*P"`/"L`@`@K0(`)*T"
+M`"BM`@`LK0(`,*T"`,"I`@`@`#2M`@#PK`(`\*P"`/"L`@`XK0(`/*T"`$"M
+M`@!$K0(`X*D"`"``2*T"`$RM`@!0K0(`5*T"`%BM`@!<K0(`8*T"`&2M`@``
+MJ@(`(`!HK0(`;*T"`'"M`@```````````````````````````""J`@`@`'2M
+M`@!XK0(`?*T"`("M`@"$K0(`B*T"`(RM`@#PK`(`0*H"`"``\*P"`/"L`@"0
+MK0(`\*P"`)2M`@#PK`(`\*P"``"M`@!@J@(`(`#\K`(`\*P"`)BM`@#PK`(`
+MG*T"`*"M`@"DK0(`J*T"`("J`@`@`*RM`@"PK0(`M*T"`/"L`@#PK`(`\*P"
+M`+BM`@"\K0(`H*H"`"``P*T"`,2M`@#(K0(`S*T"`/"L`@#PK`(`\*P"`-"M
+M`@#`J@(`(`#PK`(`U*T"`-BM`@#<K0(`X*T"`.2M`@#HK0(`[*T"`."J`@`@
+M`/"M`@#TK0(`^*T"`/RM`@``K@(`!*X"``BN`@`,K@(``*L"`"``$*X"````
+M`````````````!2N`@!`K@(`1*X"`$BN`@`@JP(`(`!,K@(`4*X"`%2N`@#P
+MK`(`\*P"`/"L`@`8K@(`'*X"`$"K`@`@`""N`@`DK@(`**X"`"RN`@#PK`(`
+M\*P"`/"L`@#LK`(`8*L"`"``!*T"`$2O`@!8K@(`Y,P"`%RN`@#PK`(`\*P"
+M`#"N`@"`JP(`(``TK@(`.*X"`#RN`@#PK`(`8*X"`````````````````*"K
+M`@`@`&2N`@!HK@(`;*X"`'"N`@!\K@(`@*X"`'2N`@``````P*L"`"``````
+M``````"$K@(`B*X"`#"O`@",K@(`D*X"`)2N`@#@JP(`(`"8K@(`G*X"`*"N
+M`@"DK@(`0*\"`*RN`@"HK@(`L*X"``"L`@`@`+2N`@"XK@(`O*X"`,"N`@#$
+MK@(`++("````````````(*P"`"```````,RN`@#0K@(`.*\"`#2O`@#PK`(`
+M\*P"`/"L`@!`K`(`(`#4K@(`\*P"`-BN`@#<K@(`X*X"`.2N`@#TK@(`\*P"
+M`&"L`@`@`.BN`@`0KP(`%*\"`'BN`@#LK@(`C,`"`/"N`@``KP(`@*P"`"``
+M^*X"`!BO`@#ZK@(`_*X"`/ZN`@#HS`(`!*\"`!RO`@"@K`(`(``(KP(`#*\"
+M`#RO`@#8K`(`W*P"`."L`@#DK`(`Z*P"`,"L`@`@`""O`@`BKP(`(Z\"`"2O
+M`@`HKP(`+*\"````````````X*P"`"```````````````````0``````````
+M````````````````K0(`(```````.```````````````````````````````
+M`````""M`@`@````````````````````````````````````````````0*T"
+M`"````````````````````````````````````````````!@K0(`(```````
+M`````````````````````````````````````("M`@`@````````````````
+M````````````````````````````H*T"`"``````````````````````````
+M``````````````````#`K0(`(```````````````````````````````````
+M`````````."M`@`@````````````````````````````````````````````
+M`*X"`"`````````````````````````````````````````````@K@(`(```
+M`````````````````````````````````````````$"N`@`@````````````
+M````````````````````````````````8*X"`"``````````````````````
+M``````````````````````"`K@(`(```````````````````````````````
+M`````````````*"N`@`@````````````````````````````````````````
+M````P*X"`"````````````````````````````````````````````#@K@(`
+M(````````````````````````@````````````````````"O`@`@````````
+M``````````$`````````````````````````(*\"`"````````````!*````
+M``````````````````````````!`KP(`(```````[,P"`!,`````````X*\"
+M``8``0`DL`(`!@`!`&"O`@`@`!RP`@`&``$`````````````````)``!`"RP
+M`@`@``$`@*\"`"``),T"`'`(#````````````)35`@"X`0H```````````"@
+MKP(`(````````````/2O`@`.``$`!+`"``X``0!0L`(`!@`!`,"O`@`@````
+M````````Z*\"``L``0`4L`(`!0`!`%BP`@`-``$`X*\"`"``````````````
+M```````````````W,3,N,RXP````````L`(`(```````4V5P("`S(#(P,#0`
+M`````)\``````````````""P`@`@````````````````````````````````
+M````````````0+`"`"```````````````````````````````````0````$`
+M``!@L`(`(````````````````````````````````````````````("P`@`@
+M``````!697));F9O``4``````S!Q````````````````H+`"`"``````````
+M``````````````````````````````````#`L`(`(```````````````````
+M`````````+2P`@#$L`(``````."P`@`@````````````````````````````
+M`````````````````+$"`"````````````````````````````!R96-E:79E
+M7W1A<VL@L0(`(`!?0T)S96T``````````````````````````````````$"Q
+M`@`@``````#_______\`````````````````````````````8+$"`"``````
+M``````````````````````````````````````"`L0(`(```````````````
+M``!T>'-C:&5D7V4``````````````*"Q`@`@`'1X<V-H961?=&%S:U]#0G-E
+M;0``='AS8VAE9%]39717P+$"`"``97!+97E#86QL8F%C:U-E;0``````````
+M``````````#@L0(`(```````````````````````````````````````````
+M``"R`@`@````````````````````````````````````````````(+("`"``
+M``````$``````````0```.@#``!3>7-1=6%L4V5M80!`L@(`(`!S>7-?<75A
+M;%]#0G-E;0```````````````````````&"R`@`@````````````````````
+M``````````````$`````````@+("`"``````````````````````````````
+M``````````````"@L@(`(```````````````````````````````````````
+M`````,"R`@`@````````````````````````````````````````````X+("
+M`"``````````````````````````````````````````````LP(`(```````
+M`````````````````````````````````````""S`@`@````````````````
+M````````````````````````````0+,"`"```````'-C86YR>%]T<F<``&]R
+M9&5R7V4`=V]R:U]M='A@LP(`(```````4$A97U-H=71$;W=N`````&)C7W-C
+M86Y?90```("S`@`@`')E;&9O<F-E<'-P7V4```!S8V%N7W1A<VM?0T)S96T`
+MH+,"`"````````````````````````````````````````````#`LP(`(```
+M`````````````````````````````````````````."S`@`@````````````
+M`````````````````````````````````+0"`"``8F-N7VUO;E]#0G-E;0``
+M`&%C=&EV:71Y7W1R9P`````@M`(`(```````````````````````````````
+M`````````````$"T`@`@````````````````````````````````````````
+M````8+0"`"````````````````````````````````````````````"`M`(`
+M(````````````````````````````````````````````*"T`@`@````````
+M````````````````````````````````````P+0"`"``````````````````
+M``````````````````````````#@M`(`(```````````````````````````
+M``````````````````"U`@`@````````````````````````````````````
+M````````(+4"`"``````````````````@````````````````````%-Y<W1`
+MM0(`(`!E;2!4:6UE<B!4:')E860``````````````````0```&"U`@`@``4`
+M```*````"@!5````````````````````````````@+4"`"``````````````
+M``````````````#_____`0````````"@M0(`(```````````````````````
+M`````````````````````,"U`@`@````````````````````````````````
+M````````````X+4"`"``````````````````````````````````````````
+M````M@(`(````````````````````````````````````````````""V`@`@
+M````````````````````````````````````````````0+8"`"``````````
+M``````````````````````````````````!@M@(`(```````````````````
+M`````````````````````````("V`@`@````````````````````````````
+M````````````````H+8"`"``````````````````````````````````````
+M``````#`M@(`(````````````````````````````````````````````."V
+M`@`@`````````````````````````````````````````````+<"`"``````
+M```````````````````````````````````````@MP(`(```````````````
+M`````````````````````````````$"W`@`@````````````````````````
+M````````````````````8+<"`"``````````````````````````````````
+M``````````"`MP(`(```````````````````````````````````````````
+M`*"W`@`@``````````````````````````````````````#\#^L/P+<"`"``
+MUP_F#R(`0@#W#XX/P`^0`,H`DP],#IH/[0/_!P0`\P_@MP(`(`#T#PL`%@#Z
+M#]</Z0\G`"H`J@\A#ZT/`P)P!?\'@`````"X`@`@`````````````0``````
+M````````````````````````(+@"`"``````````````````````````````
+M`````````(`^``!`N`(`(```````_P````````"`.`$``/H`````````````
+M`````&"X`@`@`&QB``"43```$E@``%%B```26```$E@``&QB``"43```@+@"
+M`"``$E@``%YB```26```$E@``!)8```26```$E@```````"@N`(`(```````
+M`````````````````````````````````````,"X`@`@````````````````
+M````````````````````````````X+@"`"``````````````````````````
+M````````````````````N0(`(```````````````````````<F5S<&]N<V5?
+M=')G`````""Y`@`@`&%T:6U?=')G````````````````````````````````
+M0+D"`"````````````````````````````````````````````!@N0(`(```
+M````````````````````````````````````<&]W98"Y`@`@`')U<%]S:6=?
+M90```'!O=V5R7VUG;71?90``````````H+D"`"``````````````````````
+M````````````<GA?90````#`N0(`(```````````````````````````````
+M`````````````."Y`@`@````````````````````````````````````````
+M`````+H"`"``````````````````'P`'`!\`_P\````````````````@N@(`
+M(`!M=V%I=%]E`````````````````````````````````$"Z`@`@````````
+M````````````````````````````````````8+H"`"``````````````````
+M``````````````````````````"`N@(`(```````8VUD7W=A:71?9F]R7W)E
+M<W!O;G-E````86QI=J"Z`@`@`&5?<F5S<%]E`````&1S<%]W<FET95]W86ET
+M7W-E;0``P+H"`"````````````````````````````````````````````#@
+MN@(`(``````````*```````P````/````!0````,````#P`1``"[`@`@`!4`
+M$P`:`"``Z`,```,`L`#(`%@;`P````,```!D``H`(+L"`"``%``/``\1$Q4/
+M$1,7#0X/$0\1$A8/$106#0T/$"2[`@!`NP(`(``HNP(`DBH``.@J```:+```
+MS2H``/\K`````````````&"[`@`@``````````````````)9``"*60``1ED`
+M`/-8``#A6```@+L"`"``I5D``&Y8``"L2P``K$L``*Q+``"L2P``K$L``*Q+
+M``"@NP(`(`"P2P``^6```"5T``",8```RUX``,M>```E=```S%\``,"[`@`@
+M`+1>``"47P``)70``"5T```>80``)70``(Q@``#+7@``X+L"`"``RUX``"5T
+M``#,7P``)70``)1?```E=```)70``"5T````O`(`(``E=```*V```,M>``#+
+M7@``)70``/=?```E=```E%\``""\`@`@`"5T```E=```V&```"5T```E=```
+MRUX``,M>```E=```0+P"`"``S%\``"5T``"47P``)70``"5T``"T8```)70`
+M`/]?``!@O`(`(``37P``HV```'Q?``#,7P``E%X``)1?```E=```)70``("\
+M`@`@`!YA```E=```)70``"5T```E=```)70``"5T```E=```H+P"`"``)70`
+M`"5T```E=```)70``"5T```E=```)70``"5T``#`O`(`(``E=```)70``"5T
+M```E=```NU\``"5T`````````````."\`@`@````````````````````````
+M`````````````````````+T"`"`````````````!`````````'1U;F5?=V%I
+M=%]S96T````@O0(`(```````````````````````````````````````!```
+M`$"]`@`@``<````*````"@````H`````&0```!D``$`&``!`!@``8+T"`"``
+M(`,``(`^``"`)0``@`P``"`#```@`P````````````"`O0(`(```````````
+M``````````````````````!P<F]T96-T7Z"]`@`@`'!W<E]D;W=N`````&9O
+M<F-E7W1R9P``````````````P+T"`"```````````````````P``````````
+M``````````````#@O0(`(``````````````````````````````````!````
+M(``P``"^`@`@````````````````````````````````````````````(+X"
+M`"```````````````````````'1X;&]C:U]S96T```````!`O@(`(```````
+M`````````````````````````````````````&"^`@`@``````!L;6%C7W!O
+M=V5R7W!R;V-E<W-?<V5M````````@+X"`"`````````````4`````````%JE
+M``!0`#``5``P`,``,`"@O@(`(````%0`8``P`&0`,`#$`#````!4`*``,`"D
+M`#``T``P`,"^`@`@````5`"P`#``M``P`-0`,````%0``'@"`.#"`@```%K,
+MX+X"`"````!:C`0`(0#__S\`!``A``4`(0``(`(````#``!\`@``OP(`(`#@
+MQ`(```"ES```I8S__S\`!``A```@`@````,`!``A`""_`@`@``4`(0``@`(`
+MX,8"````ZLP``.J,________/P``````0+\"`"``_____P`@`@````,``(0"
+M`.#(`@``@*Z,``"NC/__/P!@OP(`(`#_____`"`"`````P``````_____SYR
+M``````````0``("_`@`@``$```!3>7,@26YI="!487-K````V6H`````````
+M!```H+\"`"``!0```$9R86UE($AA;F1L97(```!#=``````````$``#`OP(`
+M(``+````5%@@4V-H961U;&5R`````+IS``````````0``."_`@`@``T```!1
+M=6%L:71Y(%1A<VL`````S&L`````````!````,`"`"``"0```%-C86X@5&%S
+M:P````````")5@`````````$```@P`(`(``$````0F5A8V]N($UO;B!487-K
+M``$````"!`L6,@```$#``@`@``$"`P0%!@<("0H+#`T.```````````````"
+MLZY;D```8,`"`"``\/#P\`````````````````````````````````````"`
+MP`(`(````````````````````````````````````````````*#``@`@````
+M````````````````````````````````````````P,`"`"``````````````
+M``````````````````````````````#@P`(`(```````````````````````
+M``````````````````````#!`@`@````````````````````````````````
+M````````````(,$"`"``````````````````````````````````````````
+M``!`P0(`(````````````````````````````````````````````&#!`@`@
+M````````````````````````````````````````````@,$"`"``````````
+M``````````````````````````````````"@P0(`(```````````````````
+M`````````````````````````,#!`@`@````````````````````````````
+M````````````````X,$"`"``````````````````````````````````````
+M````````P@(`(````````````````````````````````````````````"#"
+M`@`@````````````````````````````````````````````0,("`"``````
+M``````````````````````````````````````!@P@(`(```````````````
+M`````````````````````````````(#"`@`@````````````````````````
+M````````````````````H,("`"``````````````````````````````````
+M``````````#`P@(`(```````````````````````````````````````````
+M`.#"`@`@`````````````````````````````````````````````,,"`"``
+M```````````````````````````````````````````@PP(`(```````````
+M`````````````````````````````````$##`@`@````````````````````
+M````````````````````````8,,"`"``````````````````````````````
+M``````````````"`PP(`(```````````````````````````````````````
+M`````*##`@`@````````````````````````````````````````````P,,"
+M`"````````````````````````````````````````````#@PP(`(```````
+M``````````````````````````````````````#$`@`@````````````````
+M````````````````````````````(,0"`"``````````````````````````
+M``````````````````!`Q`(`(```````````````````````````````````
+M`````````&#$`@`@````````````````````````````````````````````
+M@,0"`"````````````````````````````````````````````"@Q`(`(```
+M`````````````````````````````````````````,#$`@`@````````````
+M````````````````````````````````X,0"`"``````````````````````
+M````````````````````````Q0(`(```````````````````````````````
+M`````````````"#%`@`@````````````````````````````````````````
+M````0,4"`"````````````````````````````````````````````!@Q0(`
+M(````````````````````````````````````````````(#%`@`@````````
+M````````````````````````````````````H,4"`"``````````````````
+M``````````````````````````#`Q0(`(```````````````````````````
+M`````````````````.#%`@`@````````````````````````````````````
+M`````````,8"`"`````````````````````````````````````````````@
+MQ@(`(````````````````````````````````````````````$#&`@`@````
+M````````````````````````````````````````8,8"`"``````````````
+M``````````````````````````````"`Q@(`(```````````````````````
+M`````````````````````*#&`@`@````````````````````````````````
+M````````````P,8"`"``````````````````````````````````````````
+M``#@Q@(`(`````````````````````````````````````````````#'`@`@
+M````````````````````````````````````````````(,<"`"``````````
+M``````````````````````````````````!`QP(`(```````````````````
+M`````````````````````````&#'`@`@````````````````````````````
+M````````````````@,<"`"``````````````````````````````````````
+M``````"@QP(`(````````````````````````````````````````````,#'
+M`@`@````````````````````````````````````````````X,<"`"``````
+M````````````````````````````````````````R`(`(```````````````
+M`````````````````````````````"#(`@`@````````````````````````
+M````````````````````0,@"`"``````````````````````````````````
+M``````````!@R`(`(```````````````````````````````````````````
+M`(#(`@`@````````````````````````````````````````````H,@"`"``
+M``````````````````````````````````````````#`R`(`(```````````
+M`````````````````````````````````.#(`@`@````````````````````
+M`````````````````````````,D"`"``````````````````````````````
+M```````````````@R0(`(```````````````````````````````````````
+M`````$#)`@`@````````````````````````````````````````````8,D"
+M`"````````````````````````````````````````````"`R0(`(```````
+M`````````````````````````````````````*#)`@`@````````````````
+M````````````````````````````P,D"`"``````````````````````````
+M``````````````````#@R0(`(```````````````````````````````````
+M``````````#*`@`@````````````````````````````````````````````
+M(,H"`"````````````````````````````````````````````!`R@(`(```
+M`````````````````````````````````````````&#*`@`@````````````
+M````````````````````````````````@,H"`"``````````````````````
+M``````````````````````"@R@(`(```````````````````````````````
+M`````````````,#*`@`@````````````````````````````````````````
+M````X,H"`"``````````````````````````````````````````````RP(`
+M(````````````````````````````````````````````"#+`@`@````````
+M````````````````````````````````````0,L"`"``````````````````
+M``````````````````````````!@RP(`(```````````````````````````
+M`````````````````(#+`@`@````````````````````````````````````
+M````````H,L"`"````````````````````````````````````````````#`
+MRP(`(````````````````````````````````````````````.#+`@`@````
+M`````````````````````````````````````````,P"`"``````````````
+M```````````````````````````````@S`(`(```````````````````````
+M`````````````````````$#,`@`@````````````````````````````````
+M````````````8,P"`"``````````````````````````````````````````
+M``"`S`(`(````````````````````````````````````````````*#,`@`@
+M````````````````````````````````````````````P,P"`"``````````
+M``````````````````````````````````#@S`(`(```````````````````
+M``````````````````````````#-`@`@````````````````````````````
+M````````````````(,T"`"``````````````````````````````````````
+M``````!`S0(`(````````````````````````````````````````````&#-
+M`@`@````````````````````````````````````````````@,T"`"``````
+M``````````````````````````````````````"@S0(`(```````````````
+M`````````````````````````````,#-`@`@````````````````````````
+M````````````````````X,T"`"``````````````````````````````````
+M````````````S@(`(```````````````````````````````````````````
+M`"#.`@`@````````````````````````````````````````````0,X"`"``
+M``````````````````````````````````````````!@S@(`(```````````
+M`````````````````````````````````(#.`@`@````````````````````
+M````````````````````````H,X"`"``````````````````````````````
+M``````````````#`S@(`(```````````````````````````````````````
+M`````.#.`@`@`````````````````````````````````````````````,\"
+M`"`````````````````````````````````````````````@SP(`(```````
+M`````````````````````````````````````$#/`@`@````````````````
+M````````````````````````````8,\"`"``````````````````````````
+M``````````````````"`SP(`(```````````````````````````````````
+M`````````*#/`@`@````````````````````````````````````````````
+MP,\"`"````````````````````````````````````````````#@SP(`(```
+M``````````````````````````````````````````#0`@`@````````````
+M````````````````````````````````(-`"`"``````````````````````
+M``````````````````````!`T`(`(```````````````````````````````
+M`````````````&#0`@`@````````````````````````````````````````
+M````@-`"`"````````````````````````````````````````````"@T`(`
+M(````````````````````````````````````````````,#0`@`@````````
+M````````````````````````````````````X-`"`"``````````````````
+M````````````````````````````T0(`(```````````````````````````
+M`````````````````"#1`@`@````````````````````````````````````
+M````````0-$"`"````````````````````````````````````````````!@
+MT0(`(````````````````````````````````````````````(#1`@`@````
+M````````````````````````````````````````H-$"`"``````````````
+M``````````````````````````````#`T0(`(```````````````````````
+M`````````````````````.#1`@`@````````````````````````````````
+M`````````````-("`"``````````````````````````````````````````
+M```@T@(`(````````````````````````````````````````````$#2`@`@
+M````````````````````````````````````````````8-("`"``````````
+M``````````````````````````````````"`T@(`(```````````````````
+M`````````````````````````*#2`@`@````````````````````````````
+M````````````````P-("`"``````````````````````````````````````
+M``````#@T@(`(`````````````````````````````````````````````#3
+M`@`@````````````````````````````````````````````(-,"`"``````
+M``````````````````````````````````````!`TP(`(```````````````
+M`````````````````````````````&#3`@`@````````````````````````
+M````````````````````@-,"`"``````````````````````````````````
+M``````````"@TP(`(```````````````````````````````````````````
+M`,#3`@`@````````````````````````````````````````````X-,"`"``
+M````````````````````````````````````````````U`(`(```````````
+M`````````````````````````````````"#4`@`@````````````````````
+M````````````````````````0-0"`"``````````````````````````````
+M``````````````!@U`(`(```````````````````````````````````````
+M`````(#4`@`@````````````````````````````````````````````H-0"
+M`"````````````````````````````````````````````#`U`(`(```````
+M`````````````````````````````````````.#4`@`@````````````````
+M`````````````````````````````-4"`"``````````````````````````
+M```````````````````@U0(`(```````````````````````````````````
+M`````````$#5`@`@````````````````````````````````````````````
+M8-4"`"````````````````````````````````````````````"`U0(`(```
+M`````````````````````````````````````````*#5`@`@````````````
+M````````````````````````````````P-4"`"``````````````````````
+M``````````````````````#@U0(`(```````````````````````````````
+M``````````````#6`@`@````````````````````````````````````````
+M````(-8"`"````````````````````````````````````````````!`U@(`
+M(````````````````````````````````````````````&#6`@`@````````
+M````````````````````````````````````@-8"`"``````````````````
+M``````````````````````````"@U@(`(```````````````````````````
+M`````````````````,#6`@`@````````````````````````````````````
+M````````X-8"`"``````````````````````````````````````````````
+MUP(`(````````````````````````````````````````````"#7`@`@````
+M````````````````````````````````````````0-<"`"``````````````
+M``````````````````````````````!@UP(`(```````````````````````
+M`````````````````````(#7`@`@````````````````````````````````
+M````````````H-<"`"``````````````````````````````````````````
+M``#`UP(`(````````````````````````````````````````````.#7`@`@
+M`````````````````````````````````````````````-@"`"``````````
+M```````````````````````````````````@V`(`(```````````````````
+M`````````````````````````$#8`@`@````````````````````````````
+M````````````````8-@"`"``````````````````````````````````````
+M``````"`V`(`(````````````````````````````````````````````*#8
+M`@`@````````````````````````````````````````````P-@"`"``````
+M``````````````````````````````````````#@V`(`(```````````````
+M``````````````````````````````#9`@`@````````````````````````
+M````````````````````(-D"`"``````````````````````````````````
+M``````````!`V0(`(```````````````````````````````````````````
+M`&#9`@`@````````````````````````````````````````````@-D"`"``
+M``````````````````````````````````````````"@V0(`(```````````
+M`````````````````````````````````,#9`@`@````````````````````
+M````````````````````````X-D"`"``````````````````````````````
+M````````````````V@(`(```````````````````````````````````````
+M`````"#:`@`@````````````````````````````````````````````0-H"
+M`"````````````````````````````````````````````!@V@(`(```````
+M`````````````````````````````````````(#:`@`@````````````````
+M````````````````````````````H-H"`"``````````````````````````
+M``````````````````#`V@(`(```````````````````````````````````
+M`````````.#:`@`@````````````````````````````````````````````
+M`-L"`"`````````````````````````````````````````````@VP(`(```
+M`````````````````````````````````````````$#;`@`@````````````
+M````````````````````````````````8-L"`"``````````````````````
+M``````````````````````"`VP(`(```````````````````````````````
+M`````````````*#;`@`@````````````````````````````````````````
+M````P-L"`"````````````````````````````````````````````#@VP(`
+M(`````````````````````````````````````````````#<`@`@````````
+M````````````````````````````````````(-P"`"``````````````````
+M``````````````````````````!`W`(`(```````````````````````````
+M`````````````````&#<`@`@````````````````````````````````````
+M````````@-P"`"````````````````````````````````````````````"@
+MW`(`(````````````````````````````````````````````,#<`@`@````
+M````````````````````````````````````````X-P"`"``````````````
+M````````````````````````````````W0(`(```````````````````````
+M`````````````````````"#=`@`@````````````````````````````````
+M````````````0-T"`"``````````````````````````````````````````
+M``!@W0(`(````````````````````````````````````````````(#=`@`@
+M````````````````````````````````````````````H-T"`"``````````
+M``````````````````````````````````#`W0(`(```````````````````
+M`````````````````````````.#=`@`@````````````````````````````
+M`````````````````-X"`"``````````````````````````````````````
+M```````@W@(`(````````````````````````````````````````````$#>
+M`@`@````````````````````````````````````````````8-X"`"``````
+M``````````````````````````````````````"`W@(`(```````````````
+M`````````````````````````````*#>`@`@````````````````````````
+M````````````````````P-X"`"``````````````````````````````````
+M``````````#@W@(`(```````````````````````````````````````````
+M``#?`@`@````````````````````````````````````````````(-\"`"``
+M``````````````````````````````````````````!`WP(`(```````````
+M`````````````````````````````````&#?`@`@````````````````````
+M````````````````````````@-\"`"``````````````````````````````
+M``````````````"@WP(`(```````````````````````````````````````
+M`````,#?`@`@````````````````````````````````````````````X-\"
+M`"``````````````````````````````````````````````X`(`(```````
+M`````````````````````````````````````"#@`@`@````````````````
+M````````````````````````````0.`"`"``````````````````````````
+M``````````````````!@X`(`(```````````````````````````````````
+M`````````(#@`@`@````````````````````````````````````````````
+MH.`"`"````````````````````````````````````````````#`X`(`(```
+M`````````````````````````````````````````.#@`@`@````````````
+M`````````````````````````````````.$"`"``````````````````````
+M```````````````````````@X0(`(```````````````````````````````
+M`````````````$#A`@`@````````````````````````````````````````
+M````8.$"`"````````````````````````````````````````````"`X0(`
+M(````````````````````````````````````````````*#A`@`@````````
+M````````````````````````````````````P.$"`"``````````````````
+M``````````````````````````#@X0(`(```````````````````````````
+M``````````````````#B`@`@````````````````````````````````````
+M````````(.("`"````````````````````````````````````````````!`
+MX@(`(````````````````````````````````````````````&#B`@`@````
+M````````````````````````````````````````@.("`"``````````````
+M``````````````````````````````"@X@(`(```````````````````````
+M`````````````````````,#B`@`@````````````````````````````````
+M````````````X.("`"``````````````````````````````````````````
+M````XP(`(````````````````````````````````````````````"#C`@`@
+M````````````````````````````````````````````0.,"`"``````````
+M``````````````````````````````````!@XP(`(```````````````````
+M`````````````````````````(#C`@`@````````````````````````````
+M````````````````H.,"`"``````````````````````````````````````
+M``````#`XP(`(````````````````````````````````````````````.#C
+M`@`@`````````````````````````````````````````````.0"`"``````
+M```````````````````````````````````````@Y`(`(```````````````
+M`````````````````````````````$#D`@`@````````````````````````
+M````````````````````8.0"`"``````````````````````````````````
+M``````````"`Y`(`(```````````````````````````````````````````
+M`*#D`@`@````````````````````````````````````````````P.0"`"``
+M``````````````````````````````````````````#@Y`(`(```````````
+M``````````````````````````````````#E`@`@````````````````````
+M````````````````````````(.4"`"``````````````````````````````
+M``````````````!`Y0(`(```````````````````````````````````````
+M`````&#E`@`@````````````````````````````````````````````@.4"
+M`"````````````````````````````````````````````"@Y0(`(```````
+M`````````````````````````````````````,#E`@`@````````````````
+M````````````````````````````X.4"`"``````````````````````````
+M````````````````````Y@(`(```````````````````````9F9F9F9F9F9F
+M9F9F9F9F9B#F`@`@`&9F9E5$,R(1$0```````!$1(C,S569F9F9F9F9F9F9F
+M0.8"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9@Y@(`(`!F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9H#F`@`@`&9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FH.8"`"``9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F;`Y@(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9N#F`@`@`&9F9F9F9F9F9F9F9E4S,R(1$0```````!$1(C-$
+M569F`.<"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8@YP(`
+M(`!F9E5$,R(1$0``````````$1$B,T159F9F9F9F9F9F9D#G`@`@`&9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8.<"`"``9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F:`YP(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9J#G`@`@`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9FP.<"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F;@
+MYP(`(`!F9F9F9F9F9F9F9E5$,R(1$0``````````$1$B,T159@#H`@`@`&9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9E5$(.@"`"``1#,B(A$1````
+M```````````1(B(S1%5F9F9F9F9F9F9`Z`(`(`!F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F#H`@`@`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F@.@"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F:@Z`(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9L#H`@`@
+M`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9FX.@"`"``9F9F9F9F
+M9F9F9E5$,R(B$0``````````````$1$B(C,`Z0(`(`!$1%5F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F95,R#I`@`@`"(1`````!$1(D1F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F0.D"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9@Z0(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9D0B$1$`````$8#I
+M`@`@`"(S569F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9E4SH.D"`"``(A$`
+M````$1$B1&9F9F9F9F9F9F9F9F9F9F9F9F9F9F;`Z0(`(`!F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9N#I`@`@`&9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F1"(1$0`````1`.H"`"``(C-59F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F53,@Z@(`(``B$0`````1$2)$9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9D#J`@`@`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F8.H"`"``
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9$(A$1`````!&`Z@(`(``B,U5F9F9F
+M9F9F9F9F9F9F$1$1$1$1`````````````*#J`@`@````````````````$1$1
+M$2(B,S,S1$159F9WB(B9JKN[P.H"`"``S-WN________________________
+M____________[MW@Z@(`(`#,N[NJF8B(=V9F541$,S,S(B(1$1$1````````
+M``````#K`@`@````````````````$1$1$1$`````````````````````(.L"
+M`"`````````````````1$1$1(B(B,S-$1%559F9W=XB9F:I`ZP(`(`"[S-W=
+M[N[N[N[N[N[N[N[N[N[N[N[N[N[N[N[N[MW=S&#K`@`@`+NJF9F(=W=F9E55
+M1$0S,R(B(A$1$1$`````````````@.L"`"``````````````````````````
+M``````````````````"@ZP(`(```````````````````$1$1(B(B,S,S1$15
+M569F=W>(B,#K`@`@`)FJJKO,W=W=W=W=W=W=W=W=W=W=W=W=W=W=W=W,NZJJ
+MX.L"`"``F8B(=W=F9E551$0S,S,B(B(1$1$`````````````````[`(`(```
+M````````````````````"0@'!@<&!000$`T+"0@'!B#L`@`@`"8C(R$,"PH)
+M"0<&!1$1$`X.#0P+,S(Q,`P+"@D.#0H)0.P"`!0`%A02$!(1$`\I*"(A____
+M_WG_>3L``"2P"0`&``0`#@`K``2W#;>4MSH..0Y;4$`;6T``:FE*E+>6#PJP
+M`&```/_7*$$5D)8/`F``UZ2-#+`:L`RP#+`-``@`R;PK8%=!FP\P#P3W`&\`
+M;"ZPP&Y`;`!J!0$OD!0.`F!602$.(@XC#B0/)0\F#B<.<0]]#B`/`&!000%@
+M*$$!8"A!`6`H00)J*$L``"A!```H0PYN0`$H04V00`%!`:1`*$&E0BA#!6X`
+M:@)P*$$!$%B0OXT!8"A!3H<P#LEL0`$104`!$D%``1-!20\`:D-*5$H`:D!*
+M$`X1#A(.$PY`4`(?!,P('P+)2;]`4'J@YK`&L2FQ8;&-L9NQN['8L>^Q0%"%
+MH.>P![%)L4!:0!HA50)@`-<H04%0``#_URA!``#_URA+``#_U[^-*$5.AZ</
+M,`\"W9RP6;%`6H`:(56+L#H..0Y`6L`:B[`A6\YP"``@4213%P`'S`;8(E$`
+M`");04JVH(.P7;*?L)^PA[*)LC2S3;.6LZ&SG["?L'2TG["?L+JSZ;,+M)^P
+M.+1`M%>T:K1?LG6R`````````0`'``$`%P`!`!````````````````(`!0`2
+M`````P`!``$``P`#``,`!-0%:,$!<K`A41<?L\[NH%VRG["?L*BPJ+"(L(BP
+MB+"(L)^PG["(L)^PG["(L(BPB+"?L(BPB+"(L(BPJ+"HL`?47(),W%#=!6C!
+M`7*P(5$7'P/.$:%=LI^PG["HL(BPJ+"HL(BPJ+"?L)^PB+"?L)^PJ+"HL*BP
+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
+A0*^_`&!(0"$@",@A(0;(!&!(0"0/(0X!`"$/)`X!````
+`
+end
diff --git a/sys/contrib/dev/ipw/ipw2100-1.3.fw.uu b/sys/contrib/dev/ipw/ipw2100-1.3.fw.uu
new file mode 100644
index 0000000..4115129
--- /dev/null
+++ b/sys/contrib/dev/ipw/ipw2100-1.3.fw.uu
@@ -0,0 +1,4857 @@
+/*-
+ * TERMS AND CONDITIONS
+ * IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE
+ *
+ * Do not use or load this firmware (the "Software") until you have carefully read
+ * the following terms and conditions. By loading or using the Software, you agree
+ * to the terms of this Agreement. If you do not wish to so agree, do not install
+ * or use the Software.
+ *
+ * LICENSEES:
+ *
+ * Please note:
+ *
+ * * If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT,
+ * applies.
+ * * If you are an Original Equipment Manufacturer (OEM), Independent Hardware
+ * Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement
+ * applies
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * For OEMs, IHVs, and ISVs:
+ *
+ * LICENSE. This Software is licensed for use only in conjunction with Intel
+ * component products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder. Subject to the terms of this Agreement,
+ * Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up
+ * license under Intel's copyrights to: (i) copy the Software internally for your
+ * own development and maintenance purposes; (ii) copy and distribute the Software
+ * to your end-users, but only under a license agreement with terms at least as
+ * restrictive as those contained in Intel's Final, Single User License Agreement,
+ * attached as Exhibit A; and (iii) modify, copy and distribute the end-user
+ * documentation which may accompany the Software, but only in association with
+ * the Software.
+ *
+ * If you are not the final manufacturer or vendor of a computer system or software
+ * program incorporating the Software, then you may transfer a copy of the
+ * Software, including any related documentation (modified or unmodified) to your
+ * recipient for use in accordance with the terms of this Agreement, provided such
+ * recipient agrees to be fully bound by the terms hereof. You shall not otherwise
+ * assign, sublicense, lease, or in any other way transfer or disclose Software to
+ * any third party. You may not, nor may you assist any other person or entity to
+ * modify, translate, convert to another programming language, decompile, reverse
+ * engineer, or disassemble any portion of the Software or otherwise attempt to
+ * derive source code from any object code modules of the Software or any internal
+ * data files generated by the Software. Your rights to redistribute the Software
+ * shall be contingent upon your installation of this Agreement in its entirety in
+ * the same directory as the Software.
+ *
+ * CONFIDENTIALITY. If you wish to have a third party consultant or subcontractor
+ * ("Contractor") perform work on your behalf which involves access to or use of
+ * Software, you shall obtain a written confidentiality agreement from the
+ * Contractor which contains provisions with respect to access to or use of the
+ * Software no less restrictive than those set forth in this Agreement and
+ * excluding any distribution rights, and use for any other purpose. Except as
+ * expressly provided herein, you shall not disclose the terms or existence of
+ * this Agreement or use Intel's name in any publications, advertisements, or
+ * other announcements without Intel's prior written consent. You do not have any
+ * rights to use any Intel trademarks or logos.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if
+ * any, are owned by Intel or its suppliers and licensors and may be protected by
+ * copyright, trademark, patent and trade secret law and international treaties.
+ * Any rights, express or implied, in the intellectual property embodied in the
+ * foregoing, other than those specified in this Agreement, are reserved by Intel
+ * and its suppliers and licensors or otherwise as set forth in any applicable
+ * open source license agreement. You will keep the Software free of liens,
+ * attachments, and other encumbrances. You agree not to remove any proprietary
+ * notices and/or any labels from the Software and accompanying materials without
+ * prior written approval by Intel
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS
+ * BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND
+ * (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST
+ * INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE
+ * INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR
+ * SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS
+ * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT
+ * EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR
+ * INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE
+ * OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS.
+ *
+ * EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH
+ * FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND
+ * LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR
+ * OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant
+ * or assume responsibility for the accuracy or completeness of any information,
+ * text, graphics, links or other items contained within the Software. You assume
+ * all liability, financial or otherwise, associated with Your use or disposition
+ * of the Software.
+ *
+ * APPLICABLE LAW. Claims arising under this Agreement shall be governed by the
+ * laws of State of California], excluding its principles of conflict of laws and
+ * the United Nations Convention on Contracts for the Sale of Goods.
+ *
+ * WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of
+ * this Agreement shall be effective unless in writing and signed by an officer of
+ * Intel. No failure or delay in exercising any right, power, or remedy under
+ * this Agreement shall operate as a waiver of any such right, power or remedy.
+ * Without limiting the foregoing, terms and conditions on any purchase orders or
+ * similar materials submitted by you to Intel, and any terms contained in IntelÂ’s
+ * standard acknowledgment form that are in conflict with these terms, shall be of
+ * no force or effect.
+ *
+ * SEVERABILITY. If any provision of this Agreement is held by a court of
+ * competent jurisdiction to be contrary to law, such provision shall be changed
+ * and interpreted so as to best accomplish the objectives of the original
+ * provision to the fullest extent allowed by law and the remaining provisions of
+ * this Agreement shall remain in full force and effect.
+ *
+ * EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to
+ * applicable import and export regulations of the United States and of the
+ * countries in which each party transacts business, specifically including U.S.
+ * Export Administration Act and Export Administration Regulations. Each party
+ * shall comply with such laws and regulations, as well as all other laws and
+ * regulations applicable to the Software. Without limiting the generality of the
+ * foregoing, each party agrees that it will not export, re-export, transfer or
+ * divert any of the Software or the direct programs thereof to any restricted
+ * place or party in accordance with U.S. export regulations. Note that Software
+ * containing encryption may be subject to additional restrictions.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ *
+ * TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate
+ * its terms. Upon termination, you will immediately destroy the Software or
+ * return all copies of the Software to Intel.
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * EXHIBIT "A"
+ *
+ * SOFTWARE LICENSE AGREEMENT (Final, Single User)
+ *
+ * IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+ *
+ * Do not use or load this firmware image (the "Software") until you have carefully
+ * read the following terms and conditions. By loading or using the Software, you
+ * agree to the terms of this Agreement. If you do not wish to so agree, do not
+ * install or use the Software.
+ *
+ * LICENSE. You may copy and use the Software, subject to these conditions:
+ * 1. This Software is licensed for use only in conjunction with Intel component
+ * products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder.
+ * 2. You may not copy, modify, rent, sell, distribute or transfer any part of the
+ * Software except as provided in this Agreement, and you agree to prevent
+ * unauthorized copying of the Software.
+ * 3. You may not reverse engineer, decompile, or disassemble the Software.
+ * 4. You may not sublicense the Software.
+ * 5. The Software may contain the software or other property of third party
+ * suppliers.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software
+ * remains with Intel or its suppliers. The Software is copyrighted and protected
+ * by the laws of the United States and other countries, and international treaty
+ * provisions. You may not remove any copyright notices from the Software. Intel
+ * may make changes to the Software, or items referenced therein, at any time
+ * without notice, but is not obligated to support or update the Software. Except
+ * as otherwise expressly provided, Intel grants no express or implied right under
+ * Intel patents, copyrights, trademarks, or other intellectual property rights.
+ * You may transfer the Software only if a copy of this license accompanies the
+ * Software and the recipient agrees to be fully bound by these terms.
+ *
+ * EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED
+ * "AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING
+ * WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR
+ * PURPOSE. Intel does not warrant or assume responsibility for the accuracy or
+ * completeness of any information, text, graphics, links or other items contained
+ * within the Software.
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS
+ * INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO
+ * USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR
+ * IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE
+ * LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY
+ * BETWEEN JURISDICTIONS.
+ *
+ * TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if
+ * you violate its terms. Upon termination, you will immediately destroy the
+ * Software.
+ *
+ * APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the
+ * laws of California, excluding its principles of conflict of laws and the United
+ * Nations Convention on Contracts for the Sale of Goods. You may not export the
+ * Software in violation of applicable export laws and regulations. Intel is not
+ * obligated under any other agreements unless they are in writing and signed by
+ * an authorized representative
+ * of Intel.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ */
+#define IPW_FW_VERSION 1.3
+begin 644 ipw2100-1.3.fw
+M`0,``%H1`P#`'P```````"`````?.!@`````_O\?`/[_'P#^_Q\`_O\?`/[_
+M'P#^_Q\@````(```_O\?`/[_'P#^_Q\`_O\?`/[_'P#^_Q\`_O\?`/[_'T``
+M```(````'S@5````4````"```(`/.`!^'Q("```)``$/.`#^'V``_C]@`/Y?
+M8`#^?V!P````(```_I]@`/Z_8`#^WV``_O]@`/X?80#^/V$`_E]A`/Y_89``
+M```@``#^GV$`_K]A`/[?80#^_V$`_A]B`/X_8@#^7V(`_G]BL````"```/Z?
+M8@#^OV(`_M]B`/[_8@#^'V,`_C]C`'R?8^3C`@#0````(``0?HY3`'Q?8QB_
+M`@`@<T(H`/Y_8P#^_Q\`_.]C____^_`````@``"!#S@`_.]K````!`"!#S@`
+M_`]@````!`#\[V/____[$`$``"```($/.`"`[VL`@0\X`/P/8`````0`@0\X
+MJ'Z.4Q`^#A`P`0``(```;``HH)\]*!!^CE,0?HY#@(0`(*A^CE,```X0!`(.
+M$%`!```@``@^#A`0?HY3`.(S*!!^CD,(`.X+`+``(""`#S@`(``(<`$``"``
+M((`/.`"``!(````````````%@6<``H!H`8$/.`-ZXF>0`0``(```!($8@A$`
+M(``$@A@`!((8``6"'P3^(%`$?F!0`@0`,+`!```@``20@`@$D*`(!)#`"`20
+MX`@$B`$1!(H!$02,`1$$C@$1T`$``"``I04`(`1ZX6?___]_(@<`(`-Z@6<#
+M_B!``8$/.`/^84#P`0``(````0`P`92`"`&(01$`@0\X!)"`"`20H`@$B`$1
+M(?K_)Q`"```@``2*`1$#>H%G!)"`"*#X_R<$B`$1`?X@4`%^8%```0`P,`(`
+M`"```92`"`&(01$`@0\X"#@-$/S_'V``?#]@G`(```200`A0`@``(```>N%7
+M!)!@"($!`"`$!``1(/W_)P0&`!$`?#]@Y.,"`'`"```@``3^($!(`@T0`'Q?
+M8``"``!,!`T0`/Z?8%`(#1``A"!`D`(``"``!/X@0/S_(&`$`@T0`(`/.```
+M'SBZ```````?.+X```"P`@``(````!\XP@``````'SC&```````?.,H`````
+M`!\XS@```-`"```@````'SC2```````?.-8```````````````&`OQ____]_
+M\`(``"``____?____W\!@+\?____?____W____]_`8"_'____W\0`P``(`#_
+M__]_____?P&`OQ____]_____?____W\!@+\?____?S`#```@`/___W____]_
+M`8"_'____W____]_____?P&`OQ____]_4`,``"``____?____W\!@+\?____
+M?____W____]_!H"_'Q``#0AP`P``(```>N!7@?[_)P2`OQ____]_#``-$`0`
+M8`@8`(`(`?YA0)`#```@``0&`!`(`(`+,`@-$```+@@`^N!7`@D`(`0`[@L(
+M`&X+L`,``"``#`!."Q``+@L4``X+&`#N"AP`S@H@`*X*)`"."B@`;@K0`P``
+M(``L`$X*,``N"C0`#@HX`.X)/`#."4``K@D@@0\X1'Z.0_`#```@``0`#@@"
+M@!\2"``N"`."'Q(,`(X/$`#N"Q0`K@L8`&X+$`0``"``'`!."R``+@LD``X+
+M*`#N"BP`S@HP`*X*-`"."C@`;@HP!```(``\`$X*0``N"D0`#@I(`.X)3`#.
+M"5``K@E4`(X)6`!N"5`$```@`(@`#@@!?N"O7`!."6``+@ED``X):`#N"&P`
+MS@AP`*X(<`0``"``=`"."'@`;@A\`$X(@``N"(P`#@@2@!\2A``."""!#CB0
+M!```(`"H?HY#@`(.$(0`#A````T(>`8.$`!ZX%=\!`X0(0H`(+`$```@``%^
+M`$````T05!@.$%@6#A!<%`X08!(.$&00#A!H#@X0T`0``"``;`P.$'`*#A!T
+M"`X0`J!?"0.@/PD,>`X0!!0.$`@2#A#P!```(`"(<@X0C'8.$""`#S@4.@X0
+M```-$`P`+0A4&`X0`/K@5Q`%```@`%@6#A`!"0`@7!0.$&`2#A!D$`X0:`X.
+M$&P,#A!P"@X0,`4``"``=`@.$`*@7PD#H#\)#'@.$`04#A`($@X0B'(.$(QV
+M#A!0!0``(``4.@X0"+@`$""`#S@(`(T+((`/.*A^CD,$@+\?____?W`%```@
+M````#0@!>@!0```-$`$-`"`$``X(`H`?$@@`+@@#@A\2D`4``"``#`".#Q``
+M[@L4`*X+5`"."5@`;@F(``X(`7[@KUP`3@FP!0``(`!@`"X)9``."6@`[@AL
+M`,X(<`"N"'0`C@AX`&X(?`!."-`%```@`(``+@B,``X($H`?$H0`#@@@@0XX
+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
+M```@``""86@(_I]G`(8A8``!`#``@B!``((@0`"&(&@`!($9\`L``"````2&
+M'P-^06```0`P``("$`1^@D"@`0`@`'KA5P``@&`0#```(```>N%7_W]!0`&`
+M#S@``D(0`'KA5_]_04`A@`\X`7Z"0#`,```@`*#]_R<``D(0`(-`8`#^/V"!
+M$P`@)`@`(``!X$<!_M]@4`P``"``A04`(`84H!@!_J)`((J>5P`*`(""`@`P
+M``$`0`""($AP#```(```A>!7!@P`0`:$(%``@0\XH`$`(`#^'V$!_A]A`(1`
+M4)`,```@```0!$D%@0!0__^_8`84H!@!_J)`((J>5P`*`(`!_M]@L`P``"``
+M@@(`,``!`$``@B!(`(7@5P8,`$`&A"!0`/[?8`-ZY%?0#```(``"``-0`7KD
+M9P("(U``@0\X```@8""!#SC__Q]@``7A9_`,```@`/]_@4`!!0`@``1@"`"$
+M0`@`A>%7`?X@0*(#`"`!?@!`$`T``"```'KB5_]_@D!"_/\G``1@"""`#S@`
+M``!0_X4@"/\%``@P#0``(````^!7__\?8`N`#S@@@`\X`?X?8```0`@`?$%@
+M_S\``%`-```@``P```@`?`!@_S\``````5``@``0````4`"`#S@$/@X0<`T`
+M`"```#8.$``X;F,T?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A"0#0``(``D)`X0
+M``!`8@""(&(`!.%A`(8!8@":IE$`@B!0_(,-$+`-```@``!\'V`8OP(`````
+M"`!ZX%<!`0`@`?X?8(```"````!0T`T``"```'K@5P(&`""`VB0H_/]-0`""
+M(%``[R0H`'K@5P$"`"#P#0``(`!0_A]@`'P_8%<(````TSLH@%_^+P``H&'T
+M_TU`^/\M0!`.```@``!\'V!,P0(`%```"````1`__A]@`(``$``<QU$(^N=7
+M,`X``"``@0$`(/2!#0@`>N!7`0T`(`'^/V``?!]@]+8"```#0!10#@``(``!
+M10`(`'K@5P(%`"``G@=@`!D>*(".!R@`)`E@`*(H8'`.```@```@2&``$1<H
+M`)X'8("X!R@``@`@`"0)8`"B*&``($A@D`X``"``@`T7*```P&$`@B!0`'P?
+M8/2V`@```T`4`'P?8!B_`@"P#@``(``````(`'K@5P$!`"`!_A]@@```(```
+M`%``>N!7`@8`(-`.```@``":!F"`1_XO@+HD*/R!+0C\_TU``,\D*`!ZX%<!
+M`@`@\`X``"``4/X?8`!\/V"'"````+,[*``<!V`0`*X)%`#."1@`[@D0#P``
+M(``<``X*(``N"B0`3@H$@.T+((`/.#00;@L$/@X0`#8.$#`/```@```X;F,0
+M?HY3`'Q?8*3<`@`&!"$(`/K@5X$2`"`"!&$(4`\``"```@0@"`"#X5>"!``@
+M`P1!"`,$(`@``^%7@@(`(`""(%!P#P``(```?%]@=+8"`$$#01"`$@`@`'Q?
+M8'2V`@!!!6$(`/KA5Y`/```@`(("`"`"!"`(0@-!$`,$(`A#`T$0``0`($(%
+M@0@"!"`(L`\``"```(G@5P(#`"!#!8$(`P0@"`")X%<"`0`@`?XA0(`!`"#0
+M#P``(```@B!0`'Q?8'2V`@!!`T$0`'Q?8*3<`@`&!"$(`/K@5_`/```@`($"
+M`"``?%]@=+8"`$$%80@%^N%7#`$`(``/'B@``0`@$!```"```((@4`""`&`$
+M@.T+((`/.!`0;@L$/@X0`#8.$``X;F,P$```(``8?HY3$!H.$!0<#A```,!A
+M@(TD*```H&$`^N97@@$`(%`0```@`'7^'V"S_C]@@(<[*`""(%``@@!```(`
+M0`)^`(``?%]@<!```"``--<"```$````@>97@0$`(`'^($`%^N!7B_K_)P""
+M`$"0$```(````@!``GX`@`!\7V`TUP(```0`0`@`(`@$`*`)`!P'8+`0```@
+M``"."B@`F@9@@)LB*!``K@D4`,X)!(#M"R"`#S@8$&X+T!```"``!#X.$``V
+M#A``.&YC*'Z.4Q`:#A`4'`X0&!X.$!P@#A#P$```(``@(@X0)"0.$```(&(`
+M@@!B``3A80"&P6$`"*)A`'0D*!`1```@````0&(`>NE7@@$`('7^'V"U_C]`
+M`&X[*``$05``!"%`,!$``"```(0@0`+^((``?!]@--<"``"``````>E7@0$`
+M(`%^04!0$0``(``%>N%7B_K_)P`$(4``A"!``OX@@`#\`$`TUP(`"`"@"'`1
+M```@``0`0`H`H@A@`"`H8`">1V``'&=@`)J&8(`E"R@`)`E@D!$``"``__\_
+M8(#>(R@0`*X)%`#."1@`[@D<``X*(``N"B0`3@JP$0``(``$@.T+((`/."@0
+M;@L`?%]@W*\"```((`@``H$0`@@@"-`1```@``("@1`$"``(!`"!$`"`#S@`
+M?#]@`*\"``"``!``@`\X\!$``"``!#X.$``V#A``.&YC$'Z.4P!\'V"XV0(`
+M``0`"`!ZX%<0$@``(`""!P`@`'P_8"[>`@``A``(`'K@5P(%`"`!_A]@`(!`
+M$#`2```@``!\'V"4W`(```0`"`!ZX%>!`0`@!_X?8`""(%"`>AXH4!(``"``
+M!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC$'Z.4P]^0&AP$@``(```$"$8`'P?
+M8/:N`@``!(`0`'P?8)3<`@``!``(`'K@5Y`2```@`($#`"``?!]@]*X"```(
+M``@`\@4H`'P?8)3;`@``[0XHL!(``"``!(#M"R"`#S@0$&X+!#X.$``V#A``
+M.&YC$'Z.4P'^7V#0$@``(```?#]@D-8"``"$0!``!$%0`'P_8-"V`@`(A4`0
+M`'K@5_`2```@``C^'V"!`0`@`'P_8```"````0`@`'P_8```!`"`8AXH$!,`
+M`"``!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A`P$P``(````*!A
+M`(X&&(!(+2@`?#]@,-T"``"$(`@`^N!7`0(`(%`3```@``!\/V`TW0(``(`@
+M"(`!`"``?#]@X*P"``"`(`@``@!@<!,``"```'K@5X$!`"``?!]@Z*X"```:
+M`!`0`*X)!(#M"R"`#SB0$P``(``4$&X+!#X.$``V#A``.&YC$'Z.4P""(%``
+M?!]@;-T"`+`3```@```"0!"`/`,H!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC
+MT!,``"``$'Z.4P!-`R@$@.T+((`/.!`0;@L$/@X0`#8.$``X;F/P$P``(``8
+M?HY3$!H.$!0<#A```$!@`'P?8)3<`@``!``(`'K@5Q`4```@`((-`"``?-]A
+MI-P"```<IV$`^N!7`0L`(`!ZX5<!"@`@,!0``"```81&$#3^!D"`J/TO`)H&
+M8`"('2@`>N!7@@8`(`'^/V!0%```(```?!]@H-P"```"0!``?!]@C-L"```$
+M(`@`'`=@@&H.*'`4```@``""(%``?!]@H=P"```"0!`0`*X)%`#."02`[0L@
+M@`\XD!0``"``&!!N"P0^#A``-@X0`#AN8Q!^CE,`?`!@```_``!ZX%>P%```
+M(`"!"@`@`'R?8'S;`@``!&((`/KA5P((`"`$``(0`/K@5]`4```@``$#`"``
+MB``("`""$`*(``@*`((0!(@`"`P`@A`!?@%H\!0``"```'R?8'S;`@```$(0
+M"OX?8`""(%"`(QXH!(#M"R"`#S@0%0``(``0$&X+!#X.$``V#A``.&YC&'Z.
+M4Q`:#A`4'`X0`)JF43`5```@``!\'V"HV0(``!I`$`!\'V"4W`(``!I`$`_^
+M7V``?-]A4!4``"``]*X"```$AQ``?!]@]JX"```$@!`/_A]@@$0P*`!\/V!P
+M%0``(`#XK@(``("`$``(!P@`5S`H`'P_8(K<`@``@(`0`'P?8)`5```@``"O
+M`@``&@`0`?Y?8`!\'V#HK@(```0`$`!\'V`4KP(`L!4``"```!H`$&3^/V``
+M?!]@X*X"```"`!``?#]@``D```!\'V#0%0``(``$KP(```(`$`!\'V!`W0(`
+M`!H`$``$05`#?B&``(0@0/`5```@``""($`%_G]@`/P`0$C6`@`!!D`0`7Y!
+M0`1ZX5<+^_\G$!8``"```)JF40!\'V#0K@(``!H`$`'^7V``?!]@T-P"```$
+M`!`P%@``(``'_C]@`'Q_8*3<`@``@D$0!OX?8`&`01``?!]@"*\"`%`6```@
+M```$`!``?!]@H-P"```:0!``?!]@P-P"```:`!``?!]@<!8``"``Q-P"```:
+M`!``?!]@;-T"```:0!``?!]@[-P"```:0!"0%@``(```?!]@.-T"```:`!`/
+M_E]@`'P?8%#9`@``!(`0`'P?8+`6```@`"[>`@``&D`0`'P?8+C9`@``&D`0
+M`'P?8"_>`@``&D`0T!8``"``;OY?8`!\'V`PW@(```0`$`!\'V`TW@(``!I`
+M$`!\'V#P%@``(`"AW`(``!I`$`!\'V"0U@(``!I`$`!\'V"KV0(``!I`$!`7
+M```@``!\'V"IV0(``!I`$`!\'V`4V@(``!I`$`!\'V`HW0(`,!<``"```!I`
+M$`!\'V`PW0(``!I`$`!\'V`LW0(``!H`$`!\'V!0%P``(``TW0(``!H`$`!\
+M'V#4W`(``!H`$`!\'V"TV0(``!H`$'`7```@``!\'V!<W0(``!H`$`!\'V!@
+MW0(``!H`$`!\7V!FW`(`D!<``"``%AI!$!L:01`=`D$0!/X?8!X`01``?!]@
+MN`L``"``@1"P%P``(```O0,H@"<9*`!\'V!\VP(``!I`$`'^/V``?!]@.=X"
+M`-`7```@```"0!`0`*X)%`#."02`[0L@@`\X&!!N"P0^#A``-@X0\!<``"``
+M`#AN8Q!^CE,&_A]@$/X_@`#$'2@$@.T+((`/.!`0;@L0&```(``$/@X0`#8.
+M$``X;F,8?HY3$!H.$!0<#A`!_E]@`'P?8#`8```@`*C9`@``!$`0`'P_8-"V
+M`@`(A4`0`'P?8)3<`@``!``(4!@``"```'K@5X(``"``C1@H`'S?89#6`@``
+M!`<(`'K@5X$)`"!P&```(```?#]@T+8"``F%``@`>N!7`0<`(`":IE$`?!]@
+MJ]D"`)`8```@```:0!``?!]@J=D"```:0!``?!]@%-H"```:0!`)_A]@L!@`
+M`"```((@4("M'2@`&D<0`'P_8-"V`@`)A0`(`'K@5P(!`"#0&```(``!_E]@
+M"85`$!``K@D4`,X)!(#M"R"`#S@8$&X+`?X_8/`8```@``!\'V`(KP(```(`
+M$`"`#S@$/@X0`#8.$``X;F,0?HY3$!D``"`````@8`!\'V!FW`(`'@)`$`!\
+M/V"4W`(``(0@"`#ZX%<P&0``(`"!```@@"L.*`2`[0L@@`\X$!!N"P!ZX%<!
+M`0`@`/K@5U`9```@`(("`"``@B!0`'P?8,#<`@```@`0``8`(`'^7V``?!]@
+M<!D``"``P-P"```$`!``?%]@&+`"``"(``@``($0`H@`"`(`@1"0&0``(``$
+MB``(!`"!$`"`#S@`?#]@4-D"``"`@!``@`\X!#X.$+`9```@```V#A``.&YC
+M''Z.4Q`:#A`4'`X0&!X.$```X&$`@L!AT!D``"```'KG5P(!`"``^N=7@A,`
+M(`!W`B@!_C]@`'P?8&S=`@#P&0``(````D`0`/KG5X("`"````!0`'Q?8&W=
+M`@```$$0@`T`(!`:```@``!\OV%NW0(``(X'&`;^/V"`0OXO``X@&`!\7V!M
+MW0(`,!H``"````!!$`"&85``@^%7B@<`(``(!P@`@(80`@@'"`*`AA!0&@``
+M(``$"`<(!("&$`9^QT$&_J9!`?X!0``.8!@`?%]@;=T"`'`:```@```$(0@`
+M@^%7B_C_)Q``K@D4`,X)&`#N"02`[0L@@`\XD!H``"``'!!N"P0^#A``-@X0
+M`#AN8Q!^CE,`?#]@T*X"``"``!"P&@``(```?#]@E-P"``"$(`@`^N!7@0``
+M(`"C#2@$@.T+((`/.-`:```@`!`0;@L`>N!7@@(`(`""(%``?!]@Q-P"```"
+M`!``!@`@\!H``"```?Y?8`!\'V#$W`(```0`$`!\7V`@L`(``(@`"```@1`0
+M&P``(``"B``(`@"!$`2(``@$`($0`(`/.`0^#A``-@X0`#AN8S`;```@`!!^
+MCE,`?#]@!*\"``"``!``$"`8`'Q?8&;<`@`@`($04!L``"```((`8`#6#2@$
+M@.T+((`/.!`0;@L$/@X0`#8.$``X;F-P&P``(``0?HY3('K@5PT1`"``AF%0
+M`'K@5XX%`"``A(`(`/Q!0)`;```@`"BP`@``"$$0`(2`"`!ZXE<!`@`@`?YA
+M0`'^($``!^!7L!L``"``C?K_)P```%``?%]@*+`"```&@4$``$80`(X!&`!\
+M/V#0&P``(`")W`(``(9`$`!\/V!$KP(`-("`$`!\'V"4W`(```0`"/`;```@
+M``!ZX%>!`0`@`?X?8``$(6"`80TH!(#M"R"`#S@0$&X+$!P``"```'P_8##>
+M`@``@``0`(`/.`0^#A``-@X0`#AN8Q1^CE,P'```(``0&@X0``"@80"`)@@!
+M_D!@`'P?8#3>`@``!$`0"/X`8%`<```@``%ZX%>"!0`@`'P?8(39`@`````(
+M`'K@5P(#`"``?!]@<!P``"``H-P"```$``@`>N!7@0``(`".&"@`@"8("/X`
+M8`!ZX%>0'```(``!`0`@`?X_8(```"``@B!0`'P?8*'<`@```D`0`(`F"+`<
+M```@``+^`&``>N!7`0$`(`'^/V"````@`((@4`!\'V"(W`(`T!P``"````)`
+M$`2`)@@`^N!7`0(`(`!\'V#0M@(`!`,`$``!`"#P'```(`#__S]@`/W_)Q``
+MK@D$@.T+((`/.!00;@L$/@X0`#8.$!`=```@```X;F,4?HY3$!H.$```(&``
+M?+]AG+`"``":!F`)_E]@,!T``"``@(G\+P```%``?#]@`*\"``"``!`&A`8(
+M`7K@5P(!`"!0'0``(``!_A]@`(``$`!\OV&<L`(``(0&"`&$A@D(?H:!`!@`
+M:'`=```@``*$A@D0?H:!`!@`:`.$A@D8?H:!`!@`:`%^`&@`@$80D!T``"``
+M"'X`B`&`1A`(?@"(`H!&$`A^`(@#@$80$`"N"02`[0NP'0``(``@@`\X%!!N
+M"P0^#A``-@X0`#AN8Q!^CE,``"!@`'P?8-`=```@`&;<`@`=`D`0`'P_8)3<
+M`@``A"`(`/K@5X$``""`E`TH\!T``"``!(#M"R"`#S@0$&X+!#X.$``V#A``
+M.&YC%'Z.4Q`:#A`0'@``(````*!A`/KF5X(!`"!P_A]@:/X_8`#..2@`@"8(
+M`'P?8#`>```@`-"V`@`,`P`0`_X`8`!\7V!FW`(`&P!!$`"`)@@$_@!@4!X`
+M`"``%0!!$`"`)@@(_B!@`'P?8$S=`@```@`0`(`F"!#^(&!P'@``(```?!]@
+MC-P"```"`!``@"8(`/P@8``@````?!]@.-T"`)`>```@```"`!``@"8((/X@
+M8`!\'V#0W`(```(`$`"`)@A`_B!@L!X``"```'P?8$3=`@```@`0`(`F"`#\
+M(&```@```'P?8%#=`@#0'@``(````@`0`(`F"`#\(&``"````'P?8)BP`@``
+M`@`0`(`F"/`>```@``#\`&``@````'K@5P$$`"`!_C]@`'P?8"C=`@```D`0
+M$!\``"``!(`F"`!\'V`LW0(```(`$`"`!@@`?`!@```!``!ZX%<P'P``(``!
+M!``@`?X_8`!\'V`PW0(```)`$`B`)@@`?!]@--T"`%`?```@```"`!`0`*X)
+M!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC<!\``"``$'Z.4P`0!B@$@.T+((`/
+M.!`0;@L$/@X0`#8.$``X;F.0'P``(``4?HY3$!H.$`]^(&@`D``8`'R_8?2N
+M`@``@H80`/PN*+`?```@``!\/V#XK@(``("`$`"(!@B`#B\H`'P_8(K<`@``
+M@(`0T!\``"```'P?8)3<`@``!``(`'K@5P$$`"``B`8(`'P_8/:N`@#P'P``
+M(```B"`(@$<$*`!\'V"4VP(`@$(-*!``K@D$@.T+((`/.!`@```@`!00;@L$
+M/@X0`#8.$``X;F,4?HY3$!H.$```H&$`?!]@,"```"``D-P"```:`!`"_B9@
+M`'P?8&;<`@`7`D`0`?XF8!@"0!!0(```(```?#]@E-P"``"$(`@`^N!7@0``
+M((!%#2@(_@9@`'K@5W`@```@``!\/V"@RP(``(@`"`$!`"`0?@!H@```(.]_
+M`&``@(`0D"```"```'P_8*#+`@``B``(@-H,*!``K@D$@.T+((`/.!00;@NP
+M(```(``$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A```*!A`(0F"-`@```@``3Z
+MX%>*`0`@`81&"!!ZX5<,`@`@</X?8`!\/V!S`0``\"```"``@'0Y*`+^!D``
+MA"8(`_Y@@`""84``AF%``'S?84C6`@`0(0``(``"?B=``(8@0`&$1@B`)RPH
+M`(0F"`/^8(``@F%``(9A0#`A```@``&$1@@`G`%``01`$`!\'V"4W`(```0`
+M"`!ZX%<!!@`@4"$``"```(0F"`&"7X``?#]@T+8"``"%``@`!`!H`(%`$`!\
+M'V!P(0``(`!PL0(`(/X_8``$05``!B$H$`"N"10`S@D$@.T+((`/.)`A```@
+M`!@0;@L`?#]@0-T"``"``!``@`\X!#X.$``V#A``.&YCL"$``"``&'Z.4Q`:
+M#A`4'`X0``"@80#]YE?L`0``#@,`(/;^OT'0(0``(```?%]@T+8"`!`!`0@!
+M?@!`$`$!$`!\WV$\W@(````'"/`A```@``":1F``\?LO$/Y&4```!P@,`"`(
+M``/A5P8#`"`,!``0$"(``"```'Q?8-"V`@`0`0$(`7X`0!`!`1`0`*X)%`#.
+M"02`[0LP(@``(``@@`\X&!!N"P!\7V#TM@(`2`DA"$8#@1#\?V!@`((!0%`B
+M```@``A^`$``$"`82`&!$`#]X%?"`0``"P(`(`3^'V!&`8$0<"(``"``#/X!
+M0$@!@1``@`\X`((@4`'^($``?`!0[`$```!ZX%>0(@``(`")_?\G`((`8`"`
+M#S@$/@X0`#8.$``X;F,<?HY3$!H.$+`B```@`!0<#A`8'@X0``"@80""X&$`
+M?-]A!``P`(#&^R\``&<(T"(``"```?KF5P(!`"`0_C]@@```("#^/V``^N=7
+M`0,`(`'^GV#P(@``(```_$9`@+<"``0)01``AF!H@`(`(``(@E``_$9`@+<"
+M`!`C```@``0)01``@F%P^_\A8``"!Q``OOLO````4!``K@D4`,X),",``"``
+M&`#N"02`[0L@@`\X'!!N"P0^#A``-@X0`#AN8QQ^CE-0(P``(``0&@X0%!P.
+M$!@>#A```,!A`)[G40":IE$!!`<(!GK@5W`C```@`(L.`"`&?@!0`_X_8``7
+M_2\!?@!```Y`&`"%YU<*"P`@D",``"```)X'0``>`$````=`!00@"`#ZX%<,
+M!0`@!00@"`[ZX%>P(P``(`")`P`@!00@"`8$``@!?@!0``(`0`YZX%>)```@
+M`?Z_8=`C```@``'^!T``#N`9_W\!0``.0!@`A>=7"_7_)P":!F`0`*X)\",`
+M`"``%`#."1@`[@D$@.T+((`/.!P0;@L$/@X0`#8.$``X;F,0)```(``L?HY3
+M$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0``#@83`D```@``""`&(#_A]@_(%-
+M$/ZA31````!0_X%-$`!\'V"\O0(`4"0``"``('_`0?R!+0H`?#]@C+T"`"C^
+MH$$`?%]B3,$"``"2^R]P)```(```"()0$``I"`">0$``>NA7C@T`(#]^06`$
+M?N&``(#&")`D```@```.8T``?#]@C+T"`#2`(`@$_J!H`)P">0B`(0@`D"!X
+ML"0``"``#((!$`2<`1``#N-``(H#$`-^88`$@"8(`(:@0`"&8$#0)```(```
+MH@$0`'P_8'A6-!($@@(0`7Z"0`%^04``">A7C?+_)_`D```@``"$^R\```!0
+M$`"N"10`S@D8`.X)'``."B``+@HD`$X*$"4``"``!(#M"R"`#S@L$&X+!#X.
+M$``V#A``.&YC)'Z.4Q`:#A`P)0``(``4'`X0&!X.$!P@#A`@(@X0``#@80""
+MP&$`!`%B````4%`E```@```$)P@#^N!7@0(`(`,$)P@5^N!7`B(`(!7ZYU<!
+M(0`@<"4``"```@2G"0!\/V),P0(``'#[+Q2`*`@`@^97C@``(`""H&&0)0``
+M(```?#]@C+T"`"C^P$``?#]B3,$"``S^J$``!$%0`/KF5[`E```@`(X%`"`$
+M@"((`(0@0#_^(&`$_H"```!C"`""(%``B(%`T"4``"````("$`%^04``A>97
+MC?K_)PB`(@@`FB!0"(("$`2`(@CP)0``(```FB!`/_X@8`2"`A"`8OLO````
+M4`!ZX%>!`0`@4/X?8!`F```@`/+^/V``T#@H@%S[+P!\/V),P0(`$(`H"#_^
+M8&``?#]@,"8``"``C+T"`"R`0`@#_B&``(1@0`"$(````@<0!(`A"``""!!0
+M)@``(```6/LO````4``$)P@#^N!7@>'_)P,$)P@5^N!7`@$`('`F```@`!7Z
+MYU<"W_\G$`"N"10`S@D8`.X)'``."B``+@H$@.T+D"8``"``((`/."00;@L$
+M/@X0`#8.$``X;F,H?HY3$!H.$!0<#A"P)@``(``8'@X0'"`.$```P&'\_^U!
+M^/^M00!'^R\`?!]B3,$"`-`F```@`!``*`@__F!@`'P_8(R]`@`L@$`(`_XA
+M@`"$8$``A"``\"8``"```(('$`2`(0@`@@80@$+[+P`$!P@`GB=@`)I&8(#!
+M_R\0)P``(`#X@4T(`'KA5P$%`"``!`<(`GK@5P$!`"`!_C]@@```(#`G```@
+M``""(%``'`=@``(!.`!ZX%>"$@`@_H6M"0!\'V),P0(`4"<``"``@#7[+Q0`
+M*`@`@^97C@``(`""H&$`?#]@C+T"`"C^P$!P)P``(```?!]B3,$"``Q^J$``
+M!$%0`/KF5XX%`"`$@"((`(0@0)`G```@`#_^(&`$_H"```!C"`""(%``B(%`
+M``("$`%^04``A>97L"<``"``C?K_)PB`(@@`FB!0"(("$`2`(@@`FB!`/_X@
+M8`2"`A#0)P``(```*/LO````4!``K@D4`,X)&`#N"1P`#@H$@.T+((`/./`G
+M```@`"@0;@L$/@X0`#8.$``X;F-(?HY3$!H.$!0<#A`8'@X0$"@``"``'"`.
+M$"`B#A`D)`X0*"8.$"PH#A```$!B`((`8OS_+4(P*```(`#X_ZU!`!G[+P!\
+MWV%,P0(`$``G"#_^0&``?#]@C+T"`%`H```@`"R`X`D#?B&``)Y`0`">(```
+M@@@0!``A"`""!A"`%/LO<"@``"````0)"`"B*&``FD9@@)/_+P``8&(`^NE7
+M`IP`(/B!+0J0*```(``0@$@*@'X(8`!ZX%<"'0`@3@@)"`%^($``D``83@*)
+M$+`H```@`(@(*0@!_B!```/@5X*5`"`!_A]@?``)$`!\*4```@``T"@``"``
+MRH4`"`A^`&``>N!7@0(`(`!\/V`XK0(``(``"`%^`$#P*```(```@``0`'P?
+M8+R]`@`D`4`(`'KA5X$!`"#W_RU``*((8!`I```@```"`3C^A:T)`'S?84S!
+M`@"`^_HO%``G"`"#YE>.```@,"D``"```(*@80!\/V",O0(`*/[`0`!\WV%,
+MP0(`#'ZG0``$05!0*0``(```^N97#GX`(`2`(@@`A"!`/_X@8`3^@(```&,(
+M`((@4'`I```@``"(@4```@(0`7Y!0`"%YE>-^O\G`'@`(`!T`B@`>N!7D"D`
+M`"```GL`(`":IE%*!"D(`?X`0$H`21!,"`D(`7X`0$P`B1"P*0``(``$_A]@
+M@*X:*```8&(`^NE7`G4`(`7^'V#\@4T0_(&-"M`I```@`/B!;0H`Y?HO$``G
+M"#_^(&`#_B"``)Y`0`">X$$`J`<0\"D``"``!"8!$(#C^B\`IFE2#WX(8`)^
+M`%`'>N!7#2@`((`H`"`0*@``(`!*!"D(500)"`"!X%>*'``@`7X`4`"!X%>"
+M`P`@`?X?8#`J```@`!@`B1``?"E```(``,J%``@(?@!HRH%`$/R!30CJ_VU`
+M4"H``"```*((8``D*6``TATH``!@8NJ+#0@`>N!7C"0`(``0X!EP*@``(```
+M?-]A3,$"`(#0^B\4`"<(`(/G5XX``"``@N!A`'P_8)`J```@`(R]`@`H_L!`
+M`'S?84S!`@`,?J=```1!4`#ZYU>.!0`@L"H``"``!(`B"`"$($`__B!@!/Z`
+M@```8P@`@B!0`(B!0``"`A#0*@``(``!?D%``(7G5XWZ_R<(@"((`)X@4`B"
+M`A`$@"((`)X@0/`J```@`#_^(&`$@@(0`,/Z+P"F:5*`$0`@"?X?8'P`"1"`
+M#P`@$"L``"``!/X?8'P`"1`E_A]@`$H`(`/^'V!\``D0``P`(`;^'V`P*P``
+M(`!\``D0!/X?8``)`"`'_A]@?``)$`7^'V``!P`@'_X?8%`K```@`(!#`"`"
+M?H"!`'R&`60K``````8XA`H``(0*``#$"@``<"L``"``R`H``(0*``#+"@``
+MSPH``(0*``"`4@8H``!@8@'^OV&0*P``(``!^N97@CH`(`!\'V"\O0(`)`%`
+M"`!ZX5>!)0`@`((@4+`K```@`/>#31#W_RU``*((8``"`3CWA0T(`'K@5X(.
+M`"#^A:T)T"L``"```'S?84S!`@"`I/HO%``G"`"#YE>.```@`(*@80!\/V#P
+M*P``(`",O0(`*/[`0`!\WV%,P0(`#'ZG0``$05``^N97#B<`(!`L```@``2`
+M(@@`A"!`/_X@8`3^@(```&,(`((@4`"(@4```@(0,"P``"```7Y!0`"%YE>-
+M^O\G`"$`(/R!30CJ_VU``*((8``D*6!0+```(```DQTH``!@8NJ+#0@`>N!7
+M#"$`(``0H!D`?-]A3,$"`'`L```@`("1^B\4`"<(`(/F5XX``"``@J!A`'P_
+M8(R]`@`H_L!`D"P``"```'S?84S!`@`,?J=```1!4`#ZYE<.%``@!(`B"`"$
+M($"P+```(``__B!@!/Z`@```8P@`@B!0`(B!0``"`A`!?D%``(7F5]`L```@
+M`(WZ_R<`#@`@_H6M"0!\WV%,P0(``(/Z+Q0`)P@`@^97\"P``"``C@``(`""
+MH&$`?#]@C+T"`"C^P$``?-]A3,$"``Q^IT`0+0``(```!$%0`/KF5XX%`"`$
+M@"((`(0@0#_^(&`$_H"```!C"#`M```@``""(%``B(%```("$`%^04``A>97
+MC?K_)PB`(@@`FB!04"T``"``"(("$`2`(@@`FB!`/_X@8`2"`A"`=?HO`*9I
+M4@"F"6!P+0``(``0`*X)%`#."1@`[@D<``X*(``N"B0`3@HH`&X*+`"."I`M
+M```@``2`[0L@@`\X2!!N"P""(%``!$%0`/P`0&[=`@``!$`0L"T``"```?X`
+M0``.(!C`^N!7"_S_)P!\'V!MW0(```1`$`"`#SC0+0``(``$/@X0`#8.$``X
+M;F,8?HY3$!H.$!0<#A``?+]AZ*P"`/`M```@``"`!@@!>N!7@?W_)P+^'V``
+M@`80`'S?8:3+`@`4?@=`$"X``"```((@4"3^7V``KOLO````4`P`!Q`0`$<0
+M`(`&$!``K@DP+@``(``4`,X)!(#M"R"`#S@8$&X+!/X_8``$05``?!]@\*P"
+M`%`N```@```$`!``?!]@]*P"```$`!``?!]@<*T"```$`!``?!]@<"X``"``
+MF*T"```$`!``?!]@-*T"```$`!``?!]@$*X"```$`!"0+@``(```?!]@H*X"
+M```$`!``?!]@E*X"```$`!``?!]@_*T"`+`N```@```$`!``?!]@A*X"```$
+M`!``?!]@K*X"```$`!``?!]@T"X``"``C*X"```$`!``?!]@C*T"```$`!``
+M?!]@=*T"```$`!#P+@``(```?)]@>*T"``"&85``!$%0``0"$`'^`4``#F`8
+M!'Z"0!`O```@``"#X5>+_/\G`'P?8`2M`@``!``0`'R?8`BM`@``AF%0,"\`
+M`"```(/A5XH#`"``!$%0``0"$`'^`4``#F`8!'Z"0`"#X5=0+P``(`"+_/\G
+M``1!4`!\'V`<K0(```0`$`!\GV`@K0(``(9A4'`O```@``"#X5>*`P`@``1!
+M4``$`A`!_@%```Y@&`1^@D``@^%7D"\``"``B_S_)P`$05``?!]@G*T"```$
+M`!``?)]@H*T"``"&85"P+P``(```@^%7B@,`(``$05``!`(0`?X!0``.8!@$
+M?H)``(/A5]`O```@`(O\_R<`!$%0`'P?8+2M`@``!``0`'R?8+BM`@``AF%0
+M\"\``"```(/A5XH#`"``!$%0``0"$`'^`4``#F`8!'Z"0`"#X5<0,```(`"+
+M_/\G`(9A4`+^(8``!$%0`/P`0+"N`@``!``0`?X!0#`P```@```.8!@%^N%7
+MB_O_)P"`#S@$/@X0`#8.$``X;F,L?HY34#```"``$!H.$!0<#A`8'@X0'"`.
+M$"`B#A`D)`X0*"8.$````&)P,```(```@J!A``3A80"&86(`#$-B@`_Z+P``
+M(&(8_A]@`#7^+Y`P```@``!\'V``B0(``']`0`!\'V#TM@(`1@D@"`"$P$$0
+M_A]@L#```"```(1`0```01``D$<8`"`(8`":)F``CCDH"OXG@`"``%#0,```
+M(``$``<0"!H'$`P@!Q``I@=0"GX`@!0`!Q`0`@<0&/X?8/`P```@```D*6``
+M\S4H`*((8(`"^B\0`*X)%`#."1@`[@D<``X*$#$``"``(``N"B0`3@HH`&X*
+M!(#M"R"`#S@L$&X+!#X.$``V#A`P,0``(```.&YC&'Z.4Q`:#A`4'`X0``#`
+M80#W^2\``*!A`OX?8%`Q```@`(`<_B\`?!]@`(D"``!_0$``?!]@]+8"`$8)
+M(`@%_A]@<#$``"```(1`0```01`"_A]@`!PG8(#A-2@`F@9@`/'Y+Q``K@F0
+M,0``(``4`,X)!(#M"R"`#S@8$&X+!#X.$``V#A``.&YC)'Z.4[`Q```@`!`:
+M#A`4'`X0&!X.$!P@#A`@(@X0``#`80`@"%("_O]AT#$``"``@.7Y+P``H&$`
+M?!]@-+P"``!$``@!>N!7@@$`(`'^'V+P,0``(``!_A]@`",<*(#@^2\``"!B
+M`)X'8``&_B\`?!]@`(D"`!`R```@``!_0$``?!]@]+8"`$8)(`@3_A]@`(1`
+M0```01``G@=@,#(``"```!PG8`#+-2@`H@A@@-KY+P%ZZ%<"`0`@````4``8
+M'"A0,@``(```F@9@@-?Y+Q``K@D4`,X)&`#N"1P`#@H@`"X*!(#M"W`R```@
+M`""`#S@D$&X+!#X.$``V#A``.&YC('Z.4Q`:#A`4'`X0D#(``"``&!X.$!P@
+M#A```*!A`((`8B/^WV$`R_DO``#@82/^'V"P,@``(`"`\/TO`'P?8`")`@``
+M?T!``'P?8/2V`@!&"2`(`(1@0-`R```@``[^'V``A$!```!!$`*:01``@B!0
+M`_Y!0`[ZYE>"!``@\#(``"```/P`0/2V`@`$!0`(``!!$`%^04`!_B!`(/K@
+M5PO\_R<0,P``(```!``@`/P`0/2V`@`D!0`(``!!$`%^04`!_B!`(/K@5S`S
+M```@``O\_R<`'`=@`"`H8`"J-2@`G@=@@+GY+Q``K@D4`,X)4#,``"``&`#N
+M"1P`#@H$@.T+((`/."`0;@L`?!]@X+<"``D%``AP,P``(```>N!7@@D`(`!\
+M'V#0UP(`````"`!ZX%<!!@`@&`0`")`S```@``!ZX%>!!``@`'P?8+/9`@``
+M!``(`7K@5P$#`"`4>N!7L#,``"```0(`(`5ZX%<!`0`@````4(```"`!_A]@
+M`(`/.`0^#A#0,P``(```-@X0`#AN8QA^CE,0&@X0%!P.$```P&&`HODO`'R_
+M8?`S```@`)BY`@`YG480`*/Y+SF%!@@`>N!7@0$`(`3^'V``U`\H$#0``"``
+M``0`(`!\'V#,W@(```0`"`!ZX%>!`0`@5($&"`%^`$`P-```(`!4@080$`"N
+M"10`S@D$@.T+((`/.!@0;@L`?#]@?+<"`%`T```@``"%``@`>N!7`0$`(/]_
+M`$``@4`0`(`/.`A^CE,`-@X0<#0``"```#AN8Q"`#1`0A`T(`GK@5P(!`"`0
+M@``(A`9`$!*$#0B0-```(```$&X+((`/.`A^CD,(?HY3!#X.$``V#A``.&YC
+M%'Z.4[`T```@`!`:#A`0@`T0`)JF41"$#0@!>N!7@08`(``"`"`0@``(T#0`
+M`"``A`9`$!*$K0D`!``@`GK@5P']_R<#>N!7`0(`(%#^'V#P-```(```?#]@
+M\`<``(#S-B@`F@9@$`"N"02`[0L4$&X+((`/.!`U```@``A^CD,(?HY3!#X.
+M$``V#A``.&YC%'Z.4Q`:#A`0@`T0,#4``"```)JF41"$#0@!>N!7@0@`(``$
+M`"`0@"`(7(0`"`A^`&!0-0``(```>N!7@04`((2&0!`2A*T)``0`(`)ZX%<!
+M^_\G`WK@5W`U```@``$"`"!0_A]@`'P_8!0(``"`XC8H`)H&8!``K@D$@.T+
+MD#4``"``%!!N"R"`#S@(?HY#!#X.$``V#A``.&YC%'Z.4Q`:#A"P-0``(```
+M0``H``"@80#ZYE>!$P`@`#P`*`%ZX%<"$@`@3/Y_8-`U```@``""(%`"A@8`
+M`OY`@`!\@4#PW`(````"$`'^`$``#B`8\#4``"``!/K@5XS[_R=0_G]@!?X_
+M8`*&!@`"_D"``'R!0/#<`@`0-@``(`````(0`?X`0``.(!@)^N!7C/O_)U3^
+M?V`*_C]@`H8&`#`V```@``+^0(``?)]@\-P"```(@4$```80`?X`0``.(!@,
+M^N!74#8``"``#/O_)UB$!@@T``(0`'P?8/#<`@``.0<H$`"N"02`[0MP-@``
+M(``@@`\X%!!N"P0^#A``-@X0`#AN8R!^CE,0&@X0%!P.$)`V```@`!@>#A`<
+M(`X0````8@!\/V#HK`(``(``"`%ZX%>!_?\GL#8``"```OX?8`"``!``',=1
+M`!RG00"<ID$"_J:!`'P_8*3+`@#0-@``(```@@9`&@0`"`!ZX%<!!@`@%/[@
+M00":!T``("A@!OY?8/`V```@``"_^B\`>N!7@@(`(`">!D``@B!0#/Y?8`"0
+M^B^``0`@$#<``"```7['00-ZYU<+]/\G````4`!\/V#HK`(``(``$!``K@DP
+M-P``(``4`,X)&`#N"1P`#@H$@.T+((`/."`0;@L`?']@7*H"`%`W```@``"!
+M00@$@6$(`(8`$`!ZX5<!!P`@`?KA5P(&`"!#!"$(<#<``"````)`$$($(0@!
+M`D`0100A"`("0!!$!"$(`P)`$$<$(0B0-P``(``$`D`01@0A"`4"0!````!0
+M`(`/.`!\'V!<J@(`!`$`"+`W```@``"`#S@`?!]@7*H"```!``@`@`\X!#X.
+M$``V#A``.&YCT#<``"``)'Z.4Q`:#A`4'`X0&!X.$`!\WV%<J@(```&G"06$
+M!@CP-P``(``(?B"`!(0&"``"(&@`?!]@'*\"```"@!`;A"8(`'P?8!`X```@
+M`!ZO`@```D`0^/_M00">!V``@B!0`.3_+P!\'V#<KP(`,#@``"```)XG8`;^
+M7V"`*/DO@H0&"`!\/V#DKP(``(!`$(.$!@A0.```(``!@$`0@(0&"`*`0!"!
+MA`8(`X!`$'Z$!@@$@$`0?X0&"'`X```@``6`0!!\A`8(!H!`$'V$!@@'@$`0
+M>H0&"`B`0!![A`8(D#@``"``"8!`$'B$!@@*@$`0A80&"`A^(("$A`8(``(`
+M:`A^(("P.```(`"'A`8(``(`:`A^(("&A`8(``(@:`!\'V`@KP(```(`$-`X
+M```@`$F$)@@`?!]@W*P"```"`!!(A`8("@%'$`!\/V"8R0(`\#@``"```("`
+M$$N$!@@(?B"`2H0&"``"(&@`?!]@X*P"```"`!`0.0``(`!OA`8("'X@@&Z$
+M!@@``B!H`'P?8'S!`@```@`0BX0&"#`Y```@``A^(("*A`8(``(`:`A^((")
+MA`8(``(`:`A^(("(A`8(4#D``"````(@:`!\'V#DK`(```(`$(^$!@@(?B"`
+MCH0&"``"`&AP.0``(``(?B"`C80&"``"`&@(?B"`C(0&"``"(&@`?!]@@,$"
+M`)`Y```@```"`!`0`*X)%`#."1@`[@D$@.T+((`/."00;@L$/@X0L#D``"``
+M`#8.$``X;F,8?HY3$!H.$!0<#A```,!A@*@9*`":IE'0.0``(```?!]@I,L"
+M``P```@`>N!7`@4`(`0`!P@`?`!@_,`?`/`Y```@``!ZX%>"`@`@"'X'0("V
+M`R@`>N!7@@``(`'^OV$`C@88$#H``"``$`"N"10`S@D$@.T+((`/.!@0;@L$
+M/@X0`#8.$``X;F,P.@``(``D?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A`4?N!!
+M#/Y_8%`Z```@``P`H`D`B*8(`)J"0"!^PD$`'$=@!@@B"!'^H$``D"(8<#H`
+M`"```HJ&$`"(I@@`BB!``((F0/>%``KC?BA@`_K@5P(O`""0.@``(```FJ)`
+M`H@F"`"*($#Y_\!`,?ZG0/B%(`A$`D`0``0C"+`Z```@``""0A`!_J)``7[#
+M0``$(P@`@D(0`?ZB0`%^(T``A"`(T#H``"```()"$`"(I@@`FJ)``H@F"`"*
+M($#]_\!`+?ZG0/R%(`CP.@``(`!``D`0``0C"`""0A`!_J)``7[#0``$(P@`
+M@D(0`?ZB0!`[```@``%^`T``!"`(`()"$`*()@@H_B!0+`0""`-ZX%<!!P`@
+M,#L``"````8!0`$$``@"?@!```9@0`"'X%>-`@`@_GY(8`"(I@A0.P``(``"
+MB"8(`(H`0(`4`"`"!@$``WK@5P+Y_R<`A"%"@%,$*'`[```@```.(!@"A`@(
+M`('@5X$"`"#^?DA@`(@F"`*(!@@``@!`D#L``"``@`T`(#"`!P@`?#]@O-X"
+M``"``!`L@"<(`'Q?8+C>`@"P.P``(````@$0!`!'"`"%X%>-`P`@`(7@5X4!
+M`"```"<(``/@5]`[```@``T!`"``@B!0@```(`'^/V``?!]@R-X"```"0!``
+M?!]@\#L``"``R-X"```$``@I@$<0``$`(`"`!D#W!4`0$`"N"10`S@D0/```
+M(``8`.X)'``."B``+@H$@.T+((`/."00;@L!_B!@`/K@5S`\```@`((7`"`$
+M>N!7#10`(``/`"``?#]@0*X"``"```@!?@!`4#P``"```(``$(`0`"``?#]@
+M0*X"``2```@!?@!`!(``$(`-`"!P/```(```?#]@0*X"``B```@!?@!`"(``
+M$(`*`"``?#]@0*X"`)`\```@``R```@!?@!`#(``$(`'`"``?#]@0*X"`!"`
+M``@!?@!`L#P``"``$(``$(`$`"`"?H"!`'R&`<@\``````8X$`\``!8/``#0
+M/```(``<#P``(@\``"@/````?#]@/*X"``"```@!?@!``(``$/`\```@``"`
+M#S@$/@X0`#8.$``X;F,0?HY3`($@*'W^/YB`?_DO$#T``"```'P_8)S+`@``
+M@"`(`(``0`2`[0L@@`\X$!!N"P!\'V`P/0``(`#TM@(``$4`"`"`#S@$/@X0
+M`#8.$``X;F,0?HY3`'Q?8%`]```@`#B^`@``?X%``'K@5P$(`"``"0$(`('@
+M5X(&`"``?#]@<#T``"``%*X"``"```@!?@!``(``$`!\'V`8K@(`$(`A""*$
+M(`B0/0``(``!_E]@@%X#*`'^'V```0`@``*"$````%`$@.T+((`/.+`]```@
+M`!`0;@L$/@X0`#8.$``X;F,D?HY3$!H.$!0<#A`8'@X0T#T``"```)[G40#;
+M'B@``,!A`)JF40```%#\@0T0`'P?8,K>`@#P/0``(```"``(`'K@5P$&`"``
+M?!]@J]D"```$``@`>N!7@@,`(!`^```@``!\'V`4V@(```0`"`!ZX%<"`0`@
+M`)H&8``>`"``?!]@,#X``"```+@"`/__/V``2AXH`'KG5P$%`"#\_TU``!P'
+M8`/^/V!0/@``(`"`"A\H`'K@5X$!`"!P_A]@/?X_8`#&-2@!_O]A`?X_8'`^
+M```@``!\'V`ZO@(```.`$(!!!R@`>N!7@0(`((!`""@`>N!7D#X``"```0$`
+M(`";"B@!_K]A@*4)*`!\'V#*W@(```@`"`!ZX%>P/@``(`"!`@`@`'P?8,"W
+M`@`!_C]@``1!4`!='2@&_C]@`'P?8-`^```@`#J^`@```X`0`/KG5X$%`"``
+M``!0^($-$/R!+0CX_TU`\#X``"```!P'8`#V'B@`>N!7@0$`('7^'V!H_C]@
+M@+$U*`!\'V`0/P``(```N`(``%@>*`#A_R<0`*X)%`#."1@`[@D$@.T+((`/
+M.#`_```@`"00;@L`?!]@V-\"``````@`@`\X!#X.$``V#A``.&YC4#\``"``
+M&'Z.4Q`:#A`4'`X0``#`80P`!P@`>N!7`04`(``<!V!P/P``(```$A`H``"@
+M80":!F"`RR<H`)H&8`"7$"@,``<(`'K@5Y`_```@``+[_R<0`*X)%`#."02`
+M[0L@@`\X&!!N"P0^#A``-@X0L#\``"```#AN8Q1^CE,0&@X0``"@80'^'V`0
+M@$8(&@"!$`#ZX%?0/P``(``"&@`@$(!&"`@$`0@!?@!@`'K@5P$)`"``?#]@
+MM*T"`/`_```@``"```@!?@!``(``$`A^`4``Y2,H`'K@5X$"`"``?#]@$$``
+M`"``:+`"``"```@!?@!``(``$`!\'V"XK0(`$(!&"(`#`"`P0```(```?#]@
+MG*T"``"```@!?@!``(``$`!\'V"@K0(`(@0A"%!````@``'^7V"`!@,H$(!&
+M"!0(00@`?#]@$*X"``"```@`!`!`<$```"```(``$`":!F"`40`H`'P_8)BM
+M`@``@``(`7X`0`"``!"00```(`"`!@`@`_X?8(`$`"`$_A]@@`,`(`'ZX%<!
+M_?\G`OK@5[!````@``']_R<`F@9@@'`0*``!`"``FB9@@*L8*!``K@D$@.T+
+MT$```"``((`/.!00;@L$/@X0`#8.$``X;F,0?HY3`'K@5X$#`"#P0```(```
+M!0`@`'P?8*K9`@```D`0!OX?8("C&"@`!``@!?X?8!!!```@``""(%"`H1@H
+M``(`(`%ZX%<!^O\G`GK@5P'\_R<$@.T+,$$``"``((`/.!`0;@L$/@X0`#8.
+M$``X;F,0?HY3`OX?8`""(%!000``(```FA@H!(#M"R"`#S@0$&X+!#X.$``V
+M#A``.&YC$'Z.4W!!```@````8&``?%]@\*P"`````0@!?@!````!$`!\'V"(
+MK@(`D$$``"``````"`!ZX%>!$``@$(!!"````%!'`$$0%@*!$!@`@1"P00``
+M(``I`$$0$(`A"`&$``@`>N!7@0(`(`*$``@`>N!7`0H`(-!!```@``5ZX%<*
+M"0`@`'R?8$RR`@!$`0((`'K@5X$&`"`0@"$(\$$``"``)``!$````%!R@(`0
+M`'P?8/37`@``AB%@`,8/*"1_`D`00@``(``!_C]@``1!4(#R'"@``0`@`(8!
+M8`!#$"@$@.T+((`/.#!"```@`!`0;@L`CN-0`'Q_8)3;`@`"_H%``?Y?8`"$
+M01`!_G]@4$(``"```(JB4`"`06``>N%7@08`(`""06``>N%7`0$`((#^WV!P
+M0@``(`"````@``S#4`#\0D#POP(```5!"``,06@`!$(0`7Z"0)!"```@``'^
+MXT``AF%``?ZB0`CZX5<.]O\G`'Q_8)3;`@`!CD$0L$(``"```(`/.````%``
+M@`\X!#X.$``V#A``.&YC$'Z.4P!ZX%?00@``(``!!0`@`/K@5P$!`"``@B!0
+M!`*`$`""(%`0`@`0`'8"*/!"```@``!ZX%>!```@`"DU*`2`[0L@@`\X$!!N
+M"P0^#A``-@X0$$,``"```#AN8Q!^CE.`<`(H`'K@5X$``""`(S4H!(#M"R"`
+M#S@P0P``(``0$&X+!#X.$``V#A``.&YC$'Z.4X""`B@``"!@`/K@5U!#```@
+M``$"`"!*_A]@``1!4`!++2B````@````4`2`[0L@@`\X<$,``"``$!!N"P0^
+M#A``-@X0`#AN8QA^CE,0&@X0%!P.$```P&&00P``(`"`K?<O``"@80`<!V"`
+MWRHH``#`80":!F``K?<O`!P'8+!#```@`!``K@D4`,X)!(#M"R"`#S@8$&X+
+M!#X.$``V#A``.&YCT$,``"``&'Z.4Q`:#A`4'`X0``"@8`'^WV$0@(((#(!"
+M"#@(8@CP0P``(``"""$(`(8`4`(`@1`X"&((``@!"``&`$```($0.`AB"!!$
+M```@`!0(`@@`!@!0%`""$``(`0@`!&!``'R_8>"W`@!,A08(,$0``"``"'K@
+M5X(5`"``?#]@U-<"``"$``@`>N!7`1,`(````%!01```(```@$`0`H@!"`!Z
+MX%>"#0`@"?X?8$R!1A`$B`$(`'P@8'!$```@`/\_````D``83H.&$`!\/V!P
+MK@(``(``$`;^`4`"""$(D$0``"``!OX@4`"0(!@`#``H`(H"8(#,_R\`?#]@
+MF*T"``"```BP1```(``!?@!``(``$(R!!@@!?@!`C($&$``<QU$``0`@"OX?
+M8-!$```@`$R!1A``?+]AX+<"`##_!D"`GATH`!P'8!``K@D4`,X)\$0``"``
+M!(#M"R"`#S@8$&X+!'Z.4P`(@E````X0`'P?8."W`@`010``(`"0`X`0`/K@
+M5XP@`""`&``@`80!"!QZX%<+&0`@`'Q?8#!%```@`)RP`@``!`$(`02!"0A^
+MAH$`&`!H`@2!"1!^AH$`&`!H4$4``"```P2!"1A^AH$`&`!H0'X`8`!ZX%>!
+M$0`@"H1!"`!\'V!P10``(`!4L`(`#`1`$`J$00@(?@%@`'K@5X(!`"`0?@%@
+M`'K@5Y!%```@``$,`"!`_E]@`'P?8%2P`@``!(%A`!A`$`A^AHD!&$`0L$4`
+M`"``"'Z&B0(80!`(?H:)`QA`$`"&@6$$!$`0"'Y!B`4$0!#010``(``(?D&(
+M!@1`$`A^08@'!$`0``(`(```;@@`A`$(A7K@5_!%```@`('E_R<``&X(`80!
+M"`)^`$``!@!````.$`$$``@"?@!`$$8``"````@`0``0@!@`B>!7B?C_)P1^
+MCD,`@`\X!#X.$``V#A`P1@``(```.&YC''Z.4Q`:#A`4'`X0&!X.$```X&$,
+M@"<(`(@`"%!&```@```"($`0@`<(.`@`"``"($`!_K]A`'S?8>"W`@!,!0<(
+M<$8``"```7K@5P$"`"`%>N!7`0$`(`'^'V"`(P`@`(A@"`!\WV&01@``(`#@
+MMP(`:0='$`*(``@$>N!7`@<`(`!\7V#4UP(```0!"+!&```@``!ZX%<!'0`@
+M````4```01`$B"`(`/K@5P(!`"`&_A]@T$8``"```!<`(`?^'V``%@`@`GK@
+M5X(7`"``?%]@U-<"```$`0CP1@``(```>N!7`14`(````%```$$0`?KA5P2(
+M(`B"!P`@`/K@5Q!'```@``+X_R=4`0<(`'K@5X$!`"`!_A]@``!!$(`.`"`$
+M_A]@,$<``"``3`%'$``Y]R]4'P<0@#KW+P":IE$`"0`@`/K@5P(!`"!01P``
+M(``"_A]@@`8`(`!\'V"$L`(`````"`)^`&``>N!7`0(`('!'```@``WZX%<"
+M`0`@"_X?8(`!`"`#_A]@`'S?8>"W`@!,`4<0D$<``"```'S?8>"W`@`P?P=`
+M`$<=*`":!F`0`*X)%`#."1@`[@FP1P``(``$@.T+((`/.!P0;@L$/@X0`#8.
+M$``X;F,<?HY3$!H.$-!'```@`!0<#A`8'@X0#`!`"``((0@`A.!!$```"#@(
+MP`D```!0\$<``"``@.0"*``U"B@!_A]@@'G]+P```%``?+]A[MD"`!F`1A`0
+M2```(``:@$80````4`#5`B@`F@9@`((@4("?`R@._C]@`'P?8#!(```@`+/9
+M`@```D`0`'P?8)C:`@```$`(`'KA5X$!`"`$'B<`4$@``"```?X?8``"`3@!
+M_A]@$`"N"10`S@D8`.X)!(#M"R"`#SAP2```(``<$&X+!#X.$``V#A``.&YC
+M''Z.4Q`:#A`4'`X0``#`89!(```@``":IE$`!`<(57K@5X%$`"``-``@!`0G
+M"``<!V"`00`@L$@``"```@0G"``<!V``0``@_/]M0`!\/V!,O0(`%(!`"`!`
+M`0C02```(``"?@!@`'K@5P'^'V`"``!0`(`!$!R```@`?`!H``P``/!(```@
+M`````10`@B!0`'P?8/2V`@`!`T`4`$4`"`!ZX%>"-@`@$$D``"``!/X?8(!E
+M`"B`-``@_/]M0`!\/V!,O0(`%(!`"`!``0@P20``(``"?@!@`'K@5P'^'V`"
+M``!0`(`!$!R```@`?`!H``P``%!)```@`````10`@B!0`'P?8/2V`@`!`T`4
+M@"L`(%#^'V``?#]@<$D``"``?`8```!D-"@`%0`@`?X_8`!\'V!"W@(```)`
+M%(`2`""020``(```?!]@]+8"`$P!0`@`>N%7`20`(``<!V`!_C]@``(!.+!)
+M```@`(`A`"`(>N!7`@T`(`!\'V!8W@(`````"`!ZX%>!```@T$D``"````(`
+M.`!\'V!4W@(`````"`!ZX%>!!P`@``(`.(`&`"#P20``(```?%]@&+T"```$
+M`0@`>N!7`1@`(`""(%```D$0`'P?8!!*```@`!RY`@`!_C]@``1!4`#R&R@`
+M%``@`!P'8("-^R\`$@`@,$H``"``4/X?8`!\/V#6!@```$LT*`#\_R<7>N!7
+MC?S_)P)^@(%02@``(```?(8!7$H`````!CBQ$@``?!(``%H2``!M$@``;1(`
+M`'!*```@`&T2``!M$@``C!(``&T2``",$@``1Q(``"D2```L$@``D$H``"``
+M+Q(``&T2``")$@``7Q(``(P2``",$@``;1(``&T2``"P2@``(`!D$@``C!(`
+M`&T2``"`IOLO``"@80":!F`0`*X)%`#."=!*```@``2`[0L@@`\X'!!N"P0^
+M#A``-@X0`#AN8QQ^CE,0&@X0\$H``"``%!P.$````%#_@4T0`!S'40C^/V``
+M?!]@```A``@"0!002P``(`"`OQXH`'P_8'37`@`L@``0__\-0`!T$"@``*!A
+M`/KF5S!+```@``$$`"``B`8(`!H`0("F_R\``,!A`'KG5P(%`"``F@9@4$L`
+M`"````D0*`!\'V#TM@(``44`"`!ZX%<"\_\G_X4-"`!ZX%=P2P``(`""\?\G
+M`!P'8!``K@D4`,X)!(#M"R"`#S@<$&X+!#X.$)!+```@```V#A``.&YC''Z.
+M4Q`:#A`4'`X0&!X.$`P`0`@`""$(L$L``"```(3@01````@X",`)````4(!J
+M`B@`NPDH`?X?8(#__"_02P``(`````!0`'R_8>[9`@`9@$80&H!&$````%``
+M6P(H`)H&8/!+```@``""(%"`)0,H#OX_8`!\'V"SV0(```)`$`!\'V"8V@(`
+M$$P``"````!`"`!ZX5>!`0`@!!XG``'^'V```@$X`?X?8!``K@DP3```(``4
+M`,X)&`#N"02`[0L@@`\X'!!N"P0^#A``-@X0`#AN8U!,```@`"A^CE,0&@X0
+M%!P.$!@>#A`<(`X0``#`80'^_V$`?!]B<$P``"``3,$"``Q^J$&`D/8O_/]M
+M0`":)F`0`(@(^/^M0`!\7V"03```(`!,O0(`&`!!"```00@`A`(0`'Q?8(R]
+M`@`H`*$(^(%-"+!,```@```*05`$?D&(``GA5X4!`"``"$%0`(0!$``!`"!`
+M?D%`T$P``"``@/W_)PB`0`@`@"$(`(7@5PX!`"``@B!0`((!$/R!30CP3```
+M(``(@"8(``/A5PX#`""`@O8O*/X?8`3^/V``!$%0`!4L*!!-```@```:`"``
+MBJ)0!(#&"`"%XE<&#``@`OXG@`">($`#_B"`,$T``"```'Q?8(R]`@``A&``
+M!'Y#@``&@4``!B$``/P@8/___^]030``(```!F%``((!$`0`0@@``D%X"``B
+M"`"$('@,`@(0`7XC0'!-```@`#_^P&`!_J)`_(%-"`"%XE<%]/\G`OXG@`">
+M($`#_B"`D$T``"```'Q?8(R]`@``A&``!'Y#@`"$@0``?")@____[P"$@4&P
+M30``(````@80`(2!``"$@4$`"`80`(2!``"$04`$`"$(`(A@>-!-```@``@`
+M(0@`AB!X#`(!$(!F]B\```!0`'K@5X(#`"``?#]@\$T``"`````A``#$``@`
+M'`!P`(!`%`'^'V"`$"@H$`"N"10`S@D03@``(``8`.X)'``."@2`[0L@@`\X
+M*!!N"P0^#A``-@X0`#AN8S!.```@`!A^CE,0&@X0%!P.$`":IE$`@B!0`'P?
+M8+C9`@```D`04$X``"```'P?8*#<`@``!``(`'K@5P$&`"``?!]@C=L"```$
+M``AP3@``(```>N!7@@,`(("M"2@`?!]@I-P"``!\/V",VP(``(0@")!.```@
+M```F!R@!_A]@`,T)*"#^'V``FOXO`'P?8#3>`@``!``(L$X``"```'K@5X(:
+M`"``?!]@P-P"``````@`>N!7@0<`(`!\WV'03@``(``8L`(``!P'8(!?%B@`
+M>N!7@1$`(`!\/V`HL`(``?X?8/!.```@`(`#!R@`'`=@@#<F*`!ZX%>!#0`@
+M@`P`(`!\'V#$W`(`$$\``"``````"`!ZX%>!`0`@`'S?82"P`@"`]?\G`'P?
+M8(G<`@`P3P``(```!``(`'K@5X$&`"````!0@%(6*`!ZX%>!!``@`'P_8%!/
+M```@`"BP`@`!_A]@@/8&*````%"`UB4H`'K@5X$``"`!_K]A<$\``"``@-T.
+M*`#ZYE<!`0`@`?X?8``"`"````!0``$`(`#:#BB03P``(```_O\G$`"N"10`
+MS@D$@.T+((`/.!@0;@L0`&`(#```"+!/```@``!ZX%<!!@`@`/KA5P$%`"`X
+MB$$(``@@"`"$(%```H`0T$\``"``.(A!"`(((`@`A"!``@*`$````%"````@
+M#_X?8`"`#SCP3P``(``"_A]@`(`/.`0^#A``-@X0`#AN8R1^CE,0&@X0%!P.
+M$!!0```@`!@>#A`<(`X0("(.$```X&$`\OPO``#`80!\/V+HK@(`,%```"``
+M`(`("`!ZX%>!,0`@#GK@5XTP`"`!?@!0``X`&@!ZYU=04```(`"!+@`@@.G\
+M+P%ZX%<"+0`@`(`("`!ZX%<!`@`@!7K@5W!0```@``T!`"!,!`<(@`@`(`!\
+M/V+HK@(``(`("`9ZX%<%`@`@D%```"``"GK@5PT!`"!0!`<(``0`(`!\/V+H
+MK@(``(`("`MZX%>P4```(``%`@`@#GK@5PT!`"!4!`<(``J@&5@$!P@`"J`8
+M7`0'"-!0```@```*@!A@!`<(``I@&&0$!P@`"L`8`(H'&`"!X5<,`@`@\%``
+M`"```GXH@`!\7V#PW`(```8`(``!XE>,!@`@`GXH@`!\7V`040``(`#PW`(`
+M`(2`00`&!A``?#]BZ*X"``"`"`@.>N!7@A$`(#!1```@``"$0$``#`$0`!``
+M(`"!XE>,!@`@`GXH@`!\7V#PW`(`4%$``"```(2`00`(!A``?#]BZ*X"``"`
+M"`@.>N!7`@H`(`"$0$!P40``(```!@$0@`@`(`"!YE<"?BB``'Q?8/#<`@",
+M`0`@`(1`0)!1```@```(`1"`!``@`(2`00`:!A``?#]BZ*X"``"`"`@.>N!7
+ML%$``"```@$`(`"$0$``"@$0`'P?8/#<`@``S0,H$`"N"10`S@G040``(``8
+M`.X)'``."B``+@H$@.T+((`/."00;@L$/@X0`#8.$/!1```@```X;F,0?HY3
+M`,86*```(&``^N!7`0(`($C^'V``!$%0$%(``"``@'0K*(```"````!0!(#M
+M"R"`#S@0$&X+!#X.$``V#A`P4@``(```.&YC$'Z.4P#]%B@``"!@`/K@5P$"
+M`"!!_A]@``1!4%!2```@`(!L*RB````@````4`2`[0L@@`\X$!!N"P0^#A``
+M-@X0<%(``"```#AN8TA^CE,0&@X0%!P.$!@>#A`<(`X0("(.$"0D#A"04@``
+M(``H)@X0+"@.$#`J#A`T+`X0."X.$````%#T@0T0`*9I4K!2```@``":IE$`
+M',=1`)[G4?R!#1#X@0T0`,?U+P``X&(`?%]@T%(``"``:*H"``@!`0@`>N!7
+M@6\`(`!\/V`<RP(`#(``"`!ZX%?P4@``(``!;0`@`'P_8!S+`@`(@``(!'Y`
+M@!"```@`!$`"`'Q?8!!3```@`&BJ`@```0$(``"@8@"J"F(`+,M2$```"`!Z
+MX%>!"@`@,%,``"``)00`"`!ZX%<"`0`@`)JF48```"`!_K]A`'Q?8&BJ`@!0
+M4P``(````0$($```""8$``@`>N!7`@$`(``<QU&````@`?[?87!3```@``!\
+M7V!HJ@(```$!"!````@C!.`)"(`*"`!\7V!HJ@(`D%,``"````$!$`!ZX%<"
+M`0`@````4`0!`1``?%]@:*H"``@!`0BP4P``(`#_?P!`"`$!$!"`"@@`>N!7
+M`0$`(`/^'V"````@"?X?8-!3```@`/R!31``>NA7`4L`(`""_R\``"!B$(`*
+M"`!ZX%>!```@\%,``"``#``("@!ZZ%>!$``@``@("``@@$+TI0T0`@@("```
+M(&`05```(``,``@*`'KH5P`F8$("`0`@`"S+4H```"``)$!"](%-"#!4```@
+M``/^`$#\?V!@_(&M"/B!S0@#_A]@`"@J8``LBV``9B0H4%0``"`````@8`#Z
+MX%<".0`@`'Q?8$R]`@`\``$(`'P@:``"``!P5```(``T``$(``(`%`!ZZ%>"
+M[_\G`'Q?8&BJ`@`,`2$(`*8`$)!4```@`!"`"@@`>N!7`0,`(`'ZZ%<"`0`@
+M`OX?8(`!`"`#_A]@L%0``"``@```(`3^'V``?%]@:*H"``P!(0@0_D:````!
+M:!%^1X#05```(`````%H&/Y'@````6@$@``0`?[?8A"`"@@`>N!7`0$`(/!4
+M```@``3^'V"````@"OX?8/R!31#XJPT0`'Q?8&BJ`@`,`2$($%4``"```(*`
+M8@C^($`,`P$0`'Q_8,2+`@!X_@%``('@5XX``"`P50``(``,!P$0]/]-0`!\
+M'V*0J`(`&``("`````@(`"@(`_X@@%!5```@``"``$````$0$``("```(`H(
+M?DA"`'/U+P@`*`@!_B!`<%4``"```(/H5XT``"``HB!0``()$`!R]2_T@4T(
+M_(&M"/B!S0B050``(``#_A]@`"@J8`C^?V``+(M@@#LD*```(&``^N!7@@X`
+M(+!5```@``!\7V!,O0(`/``!"`!\(&@``@``-``!"``"`!0`?#]@T%4``"``
+M',L"``B```@!?@!`"(``$!!ZX%<"`0`@````4`B``!#P50``(```?#]@',L"
+M``R```C_?P!`#(``$`!ZX%>"```@`!$I*!!6```@``"F:5(`S"LH```@8`#Z
+MX%<!`@`@1/X?8``$05``\2HH,%8``"``@`8`(`!\7V!HJ@(`"`$!"`!ZX%>!
+M`@`@`'P_8!S+`@!05@``(``,@``(`'K@5P*3_R<`K@M@`%;U+P```%`0`*X)
+M%`#."7!6```@`!@`[@D<``X*(``N"B0`3@HH`&X*+`"."C``K@HT`,X*D%8`
+M`"``.`#N"@2`[0L@@`\X2!!N"P0^#A``-@X0`#AN8Q1^CE.P5@``(``0&@X0
+M``"@80#ZYE<!#0`@$(`&"`!ZX%>!`@`@`)H&8-!6```@`(`:_R\``"!@`/K@
+M5P(+`""`0_4O`'Q?8&BJ`@`(`2$(\%8``"```/K@5X(!`"`$&P$0`!L!$(`!
+M`"`$`2$(")H`$`0;`1`05P``(```?%]@:*H"``@!(0@!_B!`"`,!$(`]]2^`
+M9_\O```@8#!7```@``#ZX%<!`@`@1OX?8``$05"`SBHH@```(````%`0`*X)
+M4%<``"``!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A!P5P``(`"`
+M,?4O``"@88"5%B@``"!@`/K@5P$"`"!`_A]@``1!4)!7```@`(#$*BB``0`@
+M`)H&8(`N]2\```!0$`"N"02`[0L@@`\XL%<``"``%!!N"P0^#A``-@X0`#AN
+M8QQ^CE,0&@X0%!P.$!@>#A#05P``(````,!A`'P_8.BL`@``@``(`7K@5X']
+M_R<"_A]@`(``$/!7```@``">YU$`?%]@I,L"`!`$`0@`>N!7`0L`(`":IE$`
+MFB9`$%@``"```)H@0`+^((``?%]@I,L"``"$`$`:!``(`'K@5X$$`"`P6```
+M(``4?@%```(@0``<!V`&_E]@`)7V+P!ZX%<"`0`@`?[_85!8```@`(`!`"`!
+M_J9!`_KF5XOU_R<```!0`'P_8.BL`@``@``0<%@``"```)X'8!``K@D4`,X)
+M&`#N"02`[0L@@`\X'!!N"P'^8&"06```(```^N%7@@(`(`"$(!@$?@!``?Y@
+M8`#ZX5>!_?\G```@"+!8```@``"$($```@`0`(`/.`0^#A``-@X0`#AN8Q1^
+MCE,0&@X0T%@``"```?X?8`""(%``?%]@`'T```"&85``[@\H`'P?8)C)`@#P
+M6```(```""`(!/K@5P$!`"`!^N!7`@,`(````%``?#]@`'T``!!9```@```$
+M05`!_G]@@`(`(````%``@B!0`'Q?8`!]````AF%0,%D``"``@.0/*`!\OV&`
+MMP(``($&"`!ZX%>!!0`@`'P?8)C)`@!060``(```""`(`((`0``"`$`"?@"`
+M`!H`0!P!``@``@`X````4'!9```@``"!!A`0`*X)!(#M"R"`#S@4$&X+!#X.
+M$``V#A``.&YCD%D``"``&'Z.4Q`:#A`4'`X0`)JF40+^1H``?#]@#,("```"
+MP4&P60``(````0<(`'K@5P$5`"`(`0<(`'K@5X$3`""`Z2`H&`$G"-!9```@
+M```#X%<%`0`@``(@4``!`"#_@S]0`(`@0!`#!Q`"_D:`\%D``"```'P_8`S"
+M`@```L%!&`$'$`!\?V"`MP(```8A0`B!``@06@``(``0`4<(``'A5PP(`"``
+MA@9`!`4`"`%ZX%<"`P`@``$'"#!:```@``B!`!``F@9@`((@4(`+^2\`!``@
+M"`$'"`B!`!``F@9@4%H``"```?X_8(`(^2\``0`@``0`4`B!`!`!_J9!`OKF
+M5P7F_R=P6@``(``0`*X)%`#."02`[0L@@`\X&!!N"P1^CE,`?#]@/-X"`)!:
+M```@``"`@`@0?B)```(.$`P`0@@``F%``(/A5PX+`"`1!$((L%H``"````(A
+M0`+^($``@^%7A0@`(```+@@`A$`(``7@5P(!`"#06@``(```@@!@``8`(`&$
+M0`@"?D%```(A0``"#A``@^%7C@(`(/!:```@``&$0`@``B%``OX@0`"#X5>&
+M]_\G````4`1^CD,`@`\X$%L``"``!#X.$``V#A``.&YC&'Z.4Q`:#A`4'`X0
+M`!S'40!\7V`P6P``(`"8N0(`.@4!"`!ZX%<"'``@$`%A"`#ZX5>!&@`@"@D!
+M"%!;```@``!ZX%<"&0`@"`D!"`%^`$`(`8$0`?X?8`H!@1``A@%@<%L``"``
+M$`"@"10!(0@`@^%7`@(`(`""(%`0`P$0%`,!$``"`""06P``(``(@"$($`,!
+M$`""(%`(`@`0-80F"`'^(&@U@D80`'Q?8+!;```@`)BY`@`\"2$($/X@0#P#
+M@1!R@H80``.!$`'^/V`"`T$0T%L``"``7(0F"+#ZX%<!!@`@`/K@5P$%`"!(
+M^N!7`00`(#@%(0CP6P``(```^N!7780F"`$!`"`0_B!H@```(.__(&!=@D80
+M``H"*!!<```@````P&&`_A]@1X!&$(`'`"``?%]@F+D"``@)`0@`>N!7,%P`
+M`"```@4`(`!\'V`6WP(```0`"`!ZX%>"`@`@`?X?8`!$""A07```(``$_A]@
+M`)H(*(#Y""@`'`=@$`"N"10`S@D$@.T+((`/.'!<```@`!@0;@L```!0`(`/
+M.````%``@`\X````4`"`#S@```!0D%P``"```(`/.`#ZX%>!)P`@"@A`"`!\
+M?V!4K@(``(`A"`"$($"P7```(```@@$0%`B`"`!\?V#0K0(``(`A"`"(($``
+M@@$0%@B`"-!<```@``!\?V#4K0(``(`A"`"(($``@@$0&`B`"`!\?V#8K0(`
+M\%P``"```(`A"`"(($``@@$0&@B`"`!\?V`XK0(``(`A"`"(($`070``(```
+M@@$0'`B`"`!\?V`\K0(``(`A"`"(($``@@$0'@B`"#!=```@``!\?V!`K0(`
+M`(`A"`"(($``@@$0`@B`"`!\?V#\N0(`4%T``"``F($A"`"(($"8@P$0!`B`
+M")R!(0@`B"!`G(,!$`8(@`AP70``(`"@@2$(`(@@0*"#`1`("(`(I($A"`"(
+M($"D@P$0J($A")!=```@``"$($"H@P$0#`A`"*R!(0@`A"!`K(,!$`X(0`BP
+M@2$(L%T``"```(0@0+"#`1`0!"`(M(.!$!$$(`BV@X$0(`@@"+B!`0C070``
+M(````@!`N($!$````%``@`\X!#X.$``V#A``.&YC$'Z.4_!=```@``!\'V`\
+MO`(`@'L:*````%`$@.T+((`/.!`0;@L`?!]@$%X``"``-+T"`"1)``@`@`\X
+M!#X.$``V#A``.&YC$'Z.4P``8&`P7@``(```?!]@)PT```""(%`$_E]@`.7U
+M+P``(&``^N!7`0(`(%!>```@`%+^'V``!$%0@.LI*(```"``@@!@!(#M"R"`
+M#S@0$&X+<%X``"``!#X.$``V#A``.&YC$'Z.4P``8&``?!]@10T```""(%"0
+M7@``(``$_E]@@-KU+P``(&``^N!7`0(`(%/^'V``!$%0`.$I*+!>```@`(``
+M`"``@@!@!(#M"R"`#S@0$&X+!#X.$``V#A``.&YCT%X``"``$'Z.4P``8&``
+M?!]@&@T```""(%`(_E]@`-#U+P``(&#P7@``(```^N!7`0(`(%7^'V``!$%0
+M@-8I*(```"``@@!@!(#M"Q!?```@`""`#S@0$&X+`'K@5X$&`"``?!]@3-X"
+M``````@`>N!7,%\``"``@0<`(`!\/V```"$`#,1`"`'^'V`(@$`4`7X!:`R`
+M0!107P``(`"``P`@`'P_8```(0`,Q``(_'\`8`R`0!0#_A]@"(!`%'!?```@
+M``"`#S@`?#]@6-X"``"``!````!0`(`/.`0^#A``-@X0D%\``"```#AN8Q1^
+MCE,0&@X0`'P?8$'>`@``1``(`'K@5P$#`""P7P``(```?+]A+,("``C_!D``
+M5@$H`/\&0``/("@`?!]@^AP``-!?```@`(`J^B\`)?0O``1!4`!\/V#)W@(`
+M`(1`$``E]"\"_A]@\%\``"```'R_83J]`@``@(80`'R_8?2]`@``_P9`__\_
+M8(`/&B@08```(```?!]@RMX"```(``@`>N!7`0$`(``='"A`@080`'Q?8#!@
+M```@`$R]`@`<``$(`'P@:``,```4``$(``(`%`3^'V``?+]A4&```"``.KT"
+M``"`AA``CR<H````4`!_(2@%_A]@`("&$!``K@EP8```(``$@.T+((`/.!00
+M;@L$/@X0`#8.$``X;F,<?HY3$!H.$)!@```@`!0<#A`8'@X0``#@82C^OV&`
+M"_0O``#`82C^'V``,?@OL&```"```'P?8`")`@``?V!``'P?8/2V`@!&"2`(
+M`(9`0`3^'V#08```(```AF!``(!!$`O^'V`"`$$0````4`,`01``@B!0"'Y!
+M0/!@```@``#\`$#TM@(`)`4`"```01`!?D%``?X@0"#ZX%<+_/\G$&$``"``
+M`)H&8`">)V"`[B\H`!P'8`#^\R\0`*X)%`#."1@`[@DP80``(``$@.T+((`/
+M.!P0;@L$/@X0`#8.$``X;F-0?HY3$!H.$%!A```@`!0<#A`8'@X0@'8G*'+^
+M'V``?#]@```A`!2`0!04@$`4<&$``"```?X?8("B)2@`>N!7@0$`(%S^'V#&
+M_C]@@&$Q*``$05"080``(```?#]@```A``R$0!0`A$`4@/X?8`"`0!3__A]@
+M"(!`%+!A```@`.#_K4$`F@9@@-`?*.C_+4#8_TU``)H&8`#V'RC8@0T(T&$`
+M`"``,GK@5P7[_R<(_A]@`'P_8```(0`,@$`4`?X_8`!\OV'P80``(`#TO0(`
+M)(-&$`!\'V`<N0(`U/]M0`'^/V``!$%0__^?8!!B```@``"\&"@<@08(`7X`
+M0!R!!A``?!]@0=X"``!$``@`>N!7,&(``"```1$`(````%``R/\O^/_-00`<
+M!V``OQ\H`'R_82S"`@!08@``(```_R9`\/_M00`<!V``GD=@`.,?*`B!!@C,
+M@0T0#($&"'!B```@`-"!#1#,_PU``)XG8``<1V``G1\H_($-"/B!+0@`?%]@
+MD&(``"``1-X"``!`00@`?']@2-X"``#`80@`?-]@^AP````(@E"P8@``(```
+MBJ)0`+'Y+X`!`"``?!]@^AP``("V_R\!_C]@`'P?8-!B```@`$2V`@```D`4
+M``1!4`!\'V#-W@(```1`$`C^'V``?#]@\&(``"`````A``R`0!0`,O\O@"__
+M+P`P_R^`+?\O`"0"*`!\OV$08P``(`#TO0(``/\&0/__/V"`K1DH$`"N"10`
+MS@D8`.X)!(#M"S!C```@`""`#SA0$&X+!#X.$``V#A``.&YC)'Z.4Q`:#A`4
+M'`X04&,``"``&!X.$!P@#A`@(@X0``#`80`@"%("_O]A@++S+P``H&%P8P``
+M(```?!]@-+P"``!$``@!>N!7@@$`(`'^'V(!_A]@`/`5*)!C```@`("M\R\`
+M`"!B`)X'8`#3]R\`?!]@`(D"``!_0$``?!]@L&,``"``]+8"`$8)(`@4_A]@
+M`(1`0```01``G@=@`!PG8`"8+RC08P``(```H@A@@*?S+P%ZZ%<"`0`@````
+M4`#E%2@`F@9@@*3S+_!C```@`!``K@D4`,X)&`#N"1P`#@H@`"X*!(#M"R"`
+M#S@D$&X+$&0``"``!#X.$``V#A``.&YC%'Z.4Q`:#A``?!]@Y+8"```!``@P
+M9```(``(>N!7A@(`(("8\R\``*!A@!T-*`":!F``F?,O$`"N"5!D```@``2`
+M[0L@@`\X%!!N"P0^#A``-@X0`#AN8Q1^CE,0&@X0<&0``"``@)'S+P!\/V"0
+MW@(``("@"0`$05``A``0`'P_8)3>`@"09```(```A``0@(_S+P#ZYE>!`0`@
+M`)H&8(!8+"B````@````4+!D```@`!``K@D$@.T+((`/.!00;@L$/@X0`#8.
+M$``X;F,4?HY3T&0``"``$!H.$`"%\R\`?#]@F-X"``"`H`D`!$%0`(0`$`!\
+M/V#P9```(`"<W@(``(0`$`"#\R\`^N97@0$`(`":!F``3"PH@```(!!E```@
+M`````%`0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC,&4``"``,'Z.4Q`:
+M#A`4'`X0&!X.$!P@#A`@(@X0)"0.$```H&%090``(```@@!B`!S'41C^/V(`
+M=/,O``#@80!\'V`TO`(``$0`"'!E```@``%ZX%>"`0`@`?[?80'^'V"`L14H
+M`&_S+P``0&(`H@A@D&4``"``@)3W+P!\'V``B0(``']@0`!\'V#TM@(`1@E`
+M"``&(4"P90``(``&_A]@``9A0`"`01``B`8(`H"`$`*(!@@$@(`0!(@&"-!E
+M```@``:`@!`&B`8("("`$`B(!@@*@(`0"H@&"`R`@!`2A$8(\&4``"``!7KA
+M5X(*`"``?%]@",`"```!`0CX@0T0!`D!"/R!C1`09@``(`#__A]@$X!&$/C_
+M#4``"$`("(2`$`((0`@*A(`0!`A`"#!F```@``R$@!``"$`(#H2`$`((0`@0
+MA(`0!`@`"!*`@!`2A$8(4&8``"``%(1`$!.$!@@6@$`0````4!6`0!`5A`8(
+M`'K@5P$!`"!P9@``(``!_A]@%8!`$!:$!@@`>N!7@@$`(!6$``@"?@!H%8!`
+M$)!F```@`!>$!@@`>N!7@0$`(!6$``@$?@!H%8!`$!B$!@@`>N!7L&8``"``
+M@@$`(!6$``@(?@!H%8!`$!F$1@@`>N%7@0(`(!6$``C09@``(``0?@!H``X`
+M&"!^`&@5@$`0````4!>`0!`4A`8(`'K@5_!F```@``$!`"`0_A]@%X!`$!N$
+M!@@`>N!7@00`(!>$0`@!?@%H$&<``"``%X!`$``.0!@;A`8(`GK@5P(!`"`"
+M?@%H%X!`$`!\'V`P9P``(`#<K`(`````"`1^`&``>N!7@@$`(!>$0`B`?@%H
+M%X!`$%!G```@`!*$1@@`?!]@0-X"```$0!09A$8(`'P?8$'>`@``!$`4<&<`
+M`"```*((8``@*&"`(B\H`"0)8``R\R\!>N=7`@$`(````%"09P``(`"`;Q4H
+M`)X'8``O\R\0`*X)%`#."1@`[@D<``X*(``N"K!G```@`"0`3@H$@.T+((`/
+M.#`0;@L`?#]@M-X"``"``!``@`\XT&<``"``!#X.$``V#A``.&YC$'Z.4P!\
+M'V"0W@(`````"`!ZX%?P9P``(`"""0`@`'P?8)C>`@`````(`'K@5P('`"``
+M?!]@>+<"`!!H```@`/__/V"`#ADH`'P?8)#>`@`````(`'K@5X("`"``?!]@
+M,&@``"``F-X"``````@`>N!7`?G_)P2`[0L@@`\X$!!N"P!\/V!0:```(`!,
+MW@(``(``$`!ZX%>"`@`@`'P_8```(0`,Q``(_G\`8'!H```@``R`0!0`@`\X
+M!#X.$``V#A``.&YC*'Z.4Q`:#A`4'`X0D&@``"``&!X.$!P@#A`@(@X0)"0.
+M$```0&(`@J!A``3!80"&(6*P:```(``1_O]A``GS+P```&(1_A]@@"[W+P!\
+M'V``B0(``']`0-!H```@``!\'V#TM@(`1@D@"`"$8$`(_A]@`(1`0```01`"
+MI$$0\&@``"```YI!$`""(%``^N97C@,`(``$1P@`@@%`!`1`$`%^QT$0:0``
+M(``!_B!``(/F5XW\_R<`G@=@`*(H8`#M+B@`(`A@@/SR+S!I```@`!``K@D4
+M`,X)&`#N"1P`#@H@`"X*)`!."@2`[0L@@`\X4&D``"``*!!N"P!ZX%>!`0`@
+M`'P_8%3>`@``@``0`(`/.`0^#A!P:0``(```-@X0`#AN8RA^CE,0&@X0%!P.
+M$!@>#A`<(`X0("(.$)!I```@`"0D#A```.!A`((`8@`<QU$$_K]A`.OR+P``
+M0&(`?!]@L&D``"``-+P"``!$``@!>N!7@@$`(`'^WV$!_A]@@"@5*`#F\B_0
+M:0``(````"!B`)H&8(`+]R\`?!]@`(D"``!_0$``?']@]+8"`/!I```@`$:)
+M(0@`A(!`%?X?8`"$0$```$$0`)X'0``>`$`#?@"`$&H``"```!X`0````$`"
+M`((03*$!$`":!F``("A@@,PN*`"B"&`P:@``(```W/(O`7KG5P(!`"````!0
+M@!D5*``D"6``V?(O$`"N"5!J```@`!0`S@D8`.X)'``."B``+@HD`$X*!(#M
+M"R"`#S@H$&X+<&H``"``!#X.$``V#A``.&YC%'Z.4Q`:#A``?+]A_+D"``"!
+M!A"0:@``(```?!]@7S$``(#@^"\$_P9`__\_8("\&"@0`*X)!(#M"[!J```@
+M`""`#S@4$&X+!#X.$``V#A``.&YC,'Z.4Q`:#A`4'`X0T&H``"``&!X.$!P@
+M#A`@(@X0)"0.$"@F#A`L*`X0``"`8@""8&+P:@``(```!,%A`(:A80`(0F(`
+MBB)B`)[G40"_\B\```!B`'P?8!!K```@`#2\`@``1``(`7K@5X(!`"`!_O]A
+M`?X?8(#\%"@`?!]@,&L``"``1-X"```<`!0`?!]@2-X"```:`!0`*`I@`*8I
+M8``<1V!0:P``(```FF9@``B"4``DJ6``HLA@@)OX+P'ZYU<"`0`@````4'!K
+M```@`(#S%"@`(`A@`+/R+Q``K@D4`,X)&`#N"1P`#@H@`"X*D&L``"``)`!.
+M"B@`;@HL`(X*!(#M"R"`#S@P$&X+!#X.$``V#A"P:P``(```.&YC''Z.4Q`:
+M#A`4'`X0&!X.$```P&$`>N=7C`X`(-!K```@``YZYU>)#0`@``[G&0">!V``
+M#R`H`?X?8(#D%"@!_A]@\&L``"```'R_832]`@``@484`'P_8'@7````G@=@
+M@,WX+PC_!D`0;```(``*_C]@@(X8*````%``@484````4`#=%"@DG884*($&
+M"#!L```@``!ZX%>!```@@)<`*````%"````@`?X?8!``K@D4`,X)4&P``"``
+M&`#N"02`[0L@@`\X'!!N"P0^#A``-@X0`#AN8SA^CE-P;```(``0&@X0%!P.
+M$!@>#A`<(`X0("(.$"0D#A`H)@X0``!@8I!L```@``"B*%(0@$D*`"0)8`""
+M(%"`Y2`H3@CI"5T$"0C[?P!@L&P``"``70!)$``.`!B("$D(`(7G5PH!`"`$
+M?@!H70!)$``@"%+0;```(`"0!`D(`('G5X$#`"`!?@A``!``&@-^"(```"E`
+MD(0`"/!L```@``"!YU>"_/\G`)X'0``>`$``(`!```X@&`!\24```@``$&T`
+M`"``Z04!"``"`%``#B`80`0)"`!ZX%<!`0`@`)X`4``.(!@P;0``(`!<?LE!
+M>@@)"``.H!F("$D(`'KA5P$$`"``?$E```(``%!M```@`.4%`0@`>N!7`1,`
+M(`'^`$``#B`8@!$`($D$"0@`>N!7<&T``"```1``(`#ZYU>!"``@<@@)"`!\
+M`&#P_P```!``&``>`&B0;0``(`!R`(D03@@)"(@(20@`!>!7@@,`(/__`$``
+M#B`8`'Q)0+!M```@```"``#E!0$(^W\`8.4!01!<!`D(`'Q)0``"``#D`4$0
+MT&T``"``700)"`A^`&CE`4$07@@)".8!@1`$?L=!!/X&4``.H!GP;0``(```
+M[?\G`OX?8/R!31``?$E```(``,4%`0C]@4T0_H--$!!N```@`,0%`0C_@4T0
+M````4,`!`1#`?P%`_(%-""#^/V``IFE@,&X``"```.$4*$`$"0@`>N!7@0<`
+M(`!\?V`\O@(``($A"`C^0(!0;@``(`!_?@!@`7X`4``$`&A8``D0`?X`0`"!
+M`1!8?@E`!/X_8'!N```@```$05``AF%0`-@4*`!\24```@``Y04!"`!ZX%>!
+M`@`@D&X``"``Y'\!0`3^/V``!$%0`(9A4`#3%"@`'`=@`)HF8``$05"P;@``
+M(```AF%0@-`4*!0("0@`>N!7@1``(`-^"(```"E`E(``"-!N```@`)*((`@`
+M!$%0`(9A4(#+%"@!?@A``!``&@-^"(```"E`\&X``"``B80`"$!^`&``>N!7
+M@?C_)X@(20@`>N%7@0<`(`'^/V`0;P``(```?!]@%]\"```"0!``A>=7B@0`
+M(``@"&``)"E@`$0N*#!O```@`````&(!_@=``!#@&8@(20@`A>=7B_O_)P"B
+M"&`0`*X)4&\``"``%`#."1@`[@D<``X*(``N"B0`3@HH`&X*!(#M"R"`#SAP
+M;P``(``X$&X+!#X.$``V#A``.&YC*'Z.4Q`:#A`4'`X0&!X.$)!O```@`!P@
+M#A`@(@X0)"0.$```0&(`@B!B``0!8@"&X6$`",)AL&\``"``@"GR+P``H&$&
+M_A]@`$_V+P!\'V``B0(``']@0`!\'V#0;P``(`#TM@(`1@E`"``&(4`/_A]@
+M``9A0`"`01`"HD`0`Z!`$/!O```@``2D0!`%GD`0!OX?8``<)V"`$2XH`)H&
+M8``A\B\0`*X)$'```"``%`#."1@`[@D<``X*(``N"B0`3@H$@.T+((`/."@0
+M;@LP<```(``$/@X0`#8.$``X;F,4?HY3$!H.$```H&&`%O(O`'P_8%!P```@
+M`%R\`@``F@`0`!?R+P":!F"`$@`H$`"N"02`[0L@@`\X<'```"``%!!N"P0^
+M#A``-@X0`#AN8Q1^CE,0&@X0$`"@"5"$)@B0<```(```^N!7@@0`(`":)F``
+MSRXH`'K@5X$!`"`!_A]@4(!&$+!P```@```!`"````!0@```(`'^'V`0`*X)
+M!(#M"R"`#S@4$&X+T'```"``!#X.$``V#A``.&YC$'Z.4P!\'V`E%P``@$G^
+M+P2`[0OP<```(``@@`\X$!!N"P0^#A``-@X0`#AN8RQ^CE,0&@X0%!P.$!!Q
+M```@`!@>#A`<(`X0("(.$"0D#A`H)@X0```@8@":IE$`GN=1,'$``"```"`(
+M4@#ZZ%<"`0`@#_X?8(`>`""`S?@O``#`80#V\2]0<0``(````&!B@);]+P``
+M0&("?@F``(`(0/P!(`H`I@E@@/3Q+W!Q```@``!ZYU<!%P`@`,7X+P%ZX%>"
+M%0`@````4`5ZZ5>,`@`@D'$``"``"GKI5PD!`"`$_A]@@```(`C^'V``'`!`
+M3'Y`0$P$``BP<0``(```@>A7B@8`(`3ZYU>*!0`@`!P(0%A^0$!8!``(`?XG
+M0-!Q```@``".X!D$?BA``(X`&@"!Z%<*`0`@!/KG5XOZ_R<`"B`8\'$``"``
+M`(H(&`"!X%>)!0`@`@1A"`_^`6``#@`8`P0A"`$$00@0<@``(`#P_F%@!/YA
+MD`".81@`"()0`*K_+X`!`"`C_K]A@```(#!R```@`"?^OV$`F@9@$`"N"10`
+MS@D8`.X)'``."B``+@HD`$X*4'(``"``*`!N"@2`[0L@@`\X+!!N"P0^#A``
+M-@X0`#AN8S!^CE-P<@``(``0&@X0%!P.$!@>#A`<(`X0("(.$"0D#A`H)@X0
+M``!@8I!R```@``""(&(`!$%B`(8!8@7^"$``$,`9`,OQ+P``X&$$_A]@L'(`
+M`"```'R_8?2V`@!&@880`'P_8`")`@`7_A]@!(%`$`'^"4#0<@``(``&@4`0
+M!Z-`$`C_0$``@B!0`?X(0`"!X%<*!``@``0)"/!R```@````01`!?D%``7Y)
+M0@'^($`!_@A``('@5PO\_R<`?+]A$',``"``]+8"`$:)1@A$A08(`'P_8`")
+M`@```F%``8%!$`%^`$`P<P``(```#B`81(%&$/_ZX%<+`0`@@/X?8$2!1A`!
+M_I]@_(E-$%!S```@``!\OV'TM@(`1HE&"`!\/V``B0(```)A0`&%`0C]@4T0
+M<',``"``_HE-$`"%`0C_@4T0`*(H4@!\`4``AP(`_"(`$`1^05"0<P``(```
+M_P!````!0`1^)T``D"`8_(%-"``@:&``,A0H`)X'8+!S```@``"L\2\$_A]@
+M2(&&$$:CAA`0`*X)%`#."1@`[@D<``X*T',``"``(``N"B0`3@HH`&X*!(#M
+M"R"`#S@P$&X+!#X.$``V#A#P<P``(```.&YC%'Z.4Q`:#A``FJ91`/K@5X(`
+M`"`C_K]A`'P?8!!T```@`/2\`@``N!<H`)H&8!``K@D$@.T+((`/.!00;@L$
+M/@X0,'0``"```#8.$``X;F,0?HY3`'P?8#2]`@`D20`(@.O^+P2`[0M0=```
+M(``@@`\X$!!N"P0^#A``-@X0`#AN8Q!^CE,`?!]@/+D"`'!T```@`("L%R@`
+M``!0!(#M"R"`#S@0$&X+!#X.$``V#A``.&YCD'0``"``$'Z.4P```%"`.OTO
+M!(#M"R"`#S@0$&X+!#X.$``V#A"P=```(```.&YC$'Z.4P!\'V#)W@(```0`
+M"`!ZX%<!`0`@````4-!T```@```^_2\$@.T+((`/.!`0;@L`>N!7`10`(`!\
+M7V"8N0(`\'0``"``$`$A"`#ZX%>!$0`@%`%A"`#ZX5<!$``@`(?@5P(#`"`0
+M=0``(````^!7`@X`(`""(%`0`P$0%`,!$``,`"```^!7@@$`(#!U```@``B`
+M(`@0`P$0``8`(`B`0`@`>N%7`0@`(``%X%<"!0`@4'4``"``"`!!"`B$`!``
+M>N%7@@$`(`!\7V"8N0(`%`,!$`""(%!P=0``(``(`@`0``(`(``$(6`(`$$(
+M`'KA5P+X_R<`@`\X!#X.$)!U```@```V#A``.&YC*'Z.4Q`:#A`4'`X0&!X.
+M$!P@#A```.!AL'4``"```)JF40`<QU'\G0T0`&CQ+P!\7V`<L0(```0A"`#Z
+MX%?0=0``(`"!!@`@`!Q!$`!\7V#0UP(````A"`#ZX%>!`P`@&)Q`$/!U```@
+M``V<0!``'`$0`'P_8."W`@!.G8`09IU`$`!A\2\?_A]@$'8``"```'P_8)S<
+M`@``@(`0`'P?8/\#```"@(`0`'P?8+/9`@`P=@``(```!``(!7K@5P$#`"`,
+M>N!7`0(`(`-ZX%<!`0`@!'K@5U!V```@`((!`"````!0@`8%*``$`"`!>N!7
+M`0,`(!1ZX%<!`@`@<'8``"``%7K@5P$!`"````!0`#$`(`!\7V#0UP(````A
+M"`#ZX%>0=@``(``!'P`@&(0`"`!ZX%>!'0`@````4`#]!"B`P!<H````8K!V
+M```@``!ZZ%>!!0`@_/]-0``@"&`#_C]@`/P7*`!ZX%<!`@`@T'8``"``=?X?
+M8`!\/V#+"0```+<N*`'^OV$```!0@`7]+P!6!"CP=@``(``!_A]@@)KW+P``
+M`%"`^/PO`/KG5P$%`"``?%]@T-<"`!!W```@````(0@&A``(@)'^+P!\'V#N
+MV0(``((@4`"__2\`X"$H,'<``"```!S'40!\7V#0UP(````A"!B<0!`-G$`0
+M`!P!$`!\/V!0=P``(`#@MP(`9IU`$`#ZYE>!!0`@^)T-$/R!+0CX_TU``"`(
+M8'!W```@`(#F%R@`>N!7`0(`('7^'V``?#]@]PD``("A+B@`',=1D'<``"``
+M`'P?8.[9`@`9'$`0&AQ`$`""(%"`K_TO`'P?8)#6`@"P=P``(```!``(`'K@
+M5P$!`"````!0`.#\+P;^'V"`U`0H!_X?8-!W```@`(#3!"@(_A]@@-($*```
+M`%"`T00H`!S'40!\/V#@MP(`\'<``"``3IV`$`[^/V``?!]@L]D"```"0!`!
+M_A]@$`"N"10`S@D0>```(``8`.X)'``."@2`[0L@@`\X*!!N"P0^#A``-@X0
+M`#AN8S!X```@`!1^CE,0&@X0`)JF40#I_"\`?!]@.KT"```(``@%>N!74'@`
+M`"``@@0`(`!\/V!@K@(``(``"`%^`$``@``0`'P?8``"``!P>```(```8/DO
+M`?Z_80":!F`0`*X)!(#M"R"`#S@4$&X+!#X.$)!X```@```V#A``.&YC$'Z.
+M4P!\'V#,W@(```0`"`!ZX%>"-P`@L'@``"```'P?8,K>`@``"``(`'K@5P$&
+M`"``?!]@J]D"```$``C0>```(```>N!7@@,`(`!\'V`4V@(```0`"`!ZX%<"
+M`0`@````4/!X```@`(`O`"`!_E]@`'P_8&#>`@``A$`0````4(#!_"\```!0
+M$'D``"``@`H$*`'^'V``5O<O`?X?8`#8`R@`?!]@R=X"```$``@P>0``(```
+M>N!7`0$`(````%"`L/PO`'P?8,K>`@``"``(`'K@5U!Y```@``$3`"``?!]@
+MJ]D"```$``@`>N!7@A``(`!\'V`4V@(`<'D``"````0`"`!ZX%<"#@`@`'P?
+M8,G>`@``!``(`'K@5P$'`""0>0``(```?!]@[MD"``""(%"`</TO`'P?8-#7
+M`@`````(`'K@5[!Y```@`($"`"`8!``(`'K@5P$!`"`!_A]@`*K\+P'^'V``
+M\P,HT'D``"``````4(#!`R@```!0`'P_8&#>`@``@$`0@!``(`'^7V#P>0``
+M(```?!]@S-X"```$0!``?!]@T-<"``````@`>N!7`08`(!!Z```@`!@$``@`
+M>N!7@00`(`!\'V#)W@(```0`"`!ZX%<!`0`@,'H``"```_X_8``%`"`$_C]@
+M``0`(`!\'V#)W@(```0`"`!ZX%=0>@``(``!`0`@!_X_8(```"`(_C]@`'P?
+M8+/9`@```D`0`?X?8'!Z```@``2`[0L@@`\X$!!N"P0^#A``-@X0`#AN8SA^
+MCE,0&@X0D'H``"``%!P.$!@>#A`<(`X0("(.$"0D#A`H)@X0+"@.$`":IE&P
+M>@``(`````!0_($-$`!\'V!@W@(```0`"`!ZX%<!`0`@!/X?8-!Z```@``"P
+M`"``?!]@L]D"```$``@!>N!7`0$`(!1ZX%<"`0`@\'H``"``!?X?8("K`"``
+M?!]@R]D"``$$``@`>N!7@0(`(`!\_V$0>P``(`#0UP(``(`G"`#ZX%<"`0`@
+M`_X?8("E`"`8A``(`'K@5S![```@`(("`""`M!DH`'K@5P$!`"`&_A]@@*$`
+M(("X&"@`?!]B4'L``"``=-<"`$``"!````!0`&8$*(`I%R@``"!B`'Q?8ARQ
+M`@!P>P``(```!`D(`'K@5X("`"``?']BD-8"``"$"0@`>N!7@0,`()![```@
+M`````%``6P0H#OX_8`!\'V"SV0(```)`$`!5`"``^NA7L'L``"``@04`(/S_
+M34``H@A@`_X_8(!<%R@`>N!7`0(`('7^'V#0>P``(```?#]@50@``(`7+B@!
+M_K]A````4`!F_"\```!0@%K\+_![```@``!\_V'0UP(``(`G"`:$``B`]/TO
+M`/KF5X$&`"````!0$'P``"``^($-$`":IE'\@2T(^/]-0`"B"&``4!<H`'K@
+M5P$"`"`P?```(`!U_A]@`'P_8',(````"RXH`'S_8=#7`@``@"<(&(0`"%!\
+M```@``!ZX%<!_M]A`AS'40"6&"@`?!]B=-<"`$0`"!``@"<(<'P``"``#80`
+M"`!ZX%>!`0`@&(0`"`!ZX%>"!``@````4`!\_V&0?```(`#NV0(`&8!'$!J`
+M1Q`4@$<0`)X'8`""(%``#_TO`'Q?8K!\```@`!RQ`@``!`D(`'K@5X("`"``
+M?']BD-8"``"$"0@`>N!7T'P``"``@0,`(`[^/V``?!]@L]D"```"0!````!0
+M@#`$*(`L`"#P?```(```?/]AT-<"``"`)P@-A``(`'K@5P(/`""`@!@H`'P?
+M8A!]```@`'37`@!(``@0`'R?8N"W`@!G!0H(@`(;*`!ZX%>"!P`@,'T``"``
+M````4``G!"@`!`D(`'K@5P(B`"``A`D(`'K@5X(@`"!0?0``(`!,!0H("WK@
+M5P(!`"`(_A]@`%X`(`'^'V``70`@`?Y?8G!]```@``"`)P@-I$`0@'(8*$P`
+M"!``?/]AT-<"``"`)P@8A``(D'T``"```'K@5P(@`"``:!DH`'K@5X$!`"``
+M``!0@!@$*`"R_R>P?0``(```?%]B'+$"```$"0@`>N!7@KG_)P!\?V*0U@(`
+M`(0)"-!]```@``!ZX%<"M_\G`'R?8N"W`@!F!0H(`'K@5P()`"``9!@H\'T`
+M`"```'P?8G37`@!0``@0@(L:*`!ZX%>"`@`@@`8`(`"$"0@0?@``(```>N!7
+M@0@`(``'`"`!_E]B`(`G"!BD0!"`7!@H5``($#!^```@`(`'`""`\"DH`'K@
+M5X($`"````!0``4$*``$"0@`>N!74'X``"```??_)P?^'V``/P`@`OX?8``^
+M`"`!_E]B`(`G"!BD0!!P?@``(`````!0`'R?8N"W`@!F`4H08`D*"%@!BA!B
+M"0H(6@&*$)!^```@`&0)"@A<`8H0`'Q?8ARQ`@``!`D(`'K@5P+%_R<`?']B
+ML'X``"``D-8"``"$"0@`>N!7@L+_)X"]%B@``"!B`/KH5X$%`"#0?@``(`#\
+M_TU``*((8`/^/V``^18H`'K@5P$"`"!U_A]@`'P_8/!^```@``X)````M"TH
+M`?Z_80'^7V(`?/]A[MD"`!FD1Q`:I$<0$'\``"``````4!2`1Q``>N=7`04`
+M(````%``_OLO`)X'8`""(%`P?P``(```OOPO`$T#*`!\GV+@MP(`;"5*$(`!
+M`"``G@=@`((@4%!_```@``"Z_"\`>N=7@0@`(`!\_V'0UP(``(`G"`Z((`@%
+M_D"`<'\``"```(0`&``$0$`"_@"(``1`0`;^`(@`!`!``'R?8N"W`@"0?P``
+M(`!."2H(`?Y?8(`5`R@``@`@`?X?8``X`R@!_A]@`.W[+[!_```@`````%``
+M?)]BX+<"`&P!2A````!0`-4#*`'^'V"`0@LHT'\``"``%/X_8`!\'V"SV0(`
+M``)`$(`E&"@`?!]B=-<"`%@`"!#P?P``(```>N=7`0$`(`""!BB````@@%@&
+M*`!\'V!PL0(`$/X_8!"````@```$05``,Q4H`/KF5P$&`"````!0^($-$/R!
+M+0CX_TU`,(```"```*((8`#.%B@`>N!7`0(`('7^'V``?#]@=@D```")+2A0
+M@```(`````!0$`"N"10`S@D8`.X)'``."B``+@HD`$X**`!N"G"````@`"P`
+MC@H$@.T+((`/.#@0;@L`?!]@R=X"```$``@`@`\XD(```"``!#X.$``V#A``
+M.&YC$'Z.4P!\'V#,W@(```0`"`!ZX%>P@```(``"`0`@````4``,`"``?!]@
+MR=X"```$``@`>N!7`0D`(-"````@`(#6^R\`?#]@8*X"``"```@!?@!``(``
+M$`!\'V#0UP(`\(```"``````"!@$``@`>N!7`0$`(`3^/V"````@"/X_8`!\
+M'V`0@0``(`"SV0(```)`$`'^'V`$@.T+((`/.!`0;@L$/@X0`#8.$#"!```@
+M```X;F,H?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X04($``"````"@80""
+M0&(`!"%B`(;A80`(`F("_A]@@*0#*`!\WV%P@0``(`!TLP(`+'\'0/__/V"`
+MX14H`?X?8("/+"B\)0<0P",'$)"!```@``!\'V"OV0(``!Y`$`'^/V``?!]@
+MK=D"```"0!#%`T<0L($``"```((@4,@#1Q``?!]@KMD"```@0!`I`T<0`/KG
+M5P(!`"#0@0``(``%_A]@@`(`(`'ZYU<"`0`@"/X?8(```"`'_A]@*@%'$/"!
+M```@``C^'X"`+_@O`'S?872S`@#P&P<0@,PJ*`'^/V#'`T<0$((``"``````
+M4!``K@D4`,X)&`#N"1P`#@H@`"X*)`!."@2`[0LP@@``(``@@`\X*!!N"P0^
+M#A``-@X0`#AN8R1^CE,0&@X0%!P.$%""```@`!@>#A`<(`X0("(.$```(&(`
+M@@!B$(#H"0#ZYU<"`@`@<((``"``=?X?8`!\/V!%`@```$,M*``<]B\`>N!7
+M`@$`(`+^'V"0@@``(```#@`@`'P?8++9`@``!``(`7K@5P(!`"`$_A]@@`H`
+M(+""```@``!\/V"8N0(`.84`"`%ZX%>""0`@`'P?8#J]`@``"``(T((``"``
+M`'K@5X$"`"`&>N!7@0$`(%B!``@!?@!`6($`$`!\'V#P@@``(``PUP(```0`
+M"`!ZX%<!]?\G!?X?8```"!````!0`$L`(!"#```@`!"`R`D`>N=7`@(`('7^
+M'V``?#]@=P(``(`M+2@U!"<(,(,``"```?X`8`!ZX%<!!@`@1X0'"`=ZX%>"
+M!``@`'P_8)BY`@!0@P``(``"A0`(`7K@5P("`"``FJ91-9I'$"Z:AQ!)FD<0
+M`)JF47"#```@``!\/V"8N0(``IM`$`!\'V`7WP(```0`"`!ZX%>!`0`@D(,`
+M`"``"(D`"`!ZX%>"`@`@`'P_8)BY`@`(B0`(`GK@5PL"`""P@P``(`"#_A]@
+M1P!'$`/^'V"`Z/\G`)JF40!\'V`7WP(``!I`$-"#```@`#4$)P@"_@!@`'K@
+M5X$"`"!."`<(`'K@5P$!`"#]_P!@\(,``"``-0!'$#4$)P@"_@!@`'K@5P()
+M`"``FJ914!I'$``<!V`0A```(```HBA@`)$L*`"B"&"`BOTO`'K@5P(#`"`$
+M_A]@1P!'$#"$```@``'^'V````@0`)H&8``E`"`U!"<(`OX`:#4`1Q``FJ91
+M4(0``"```'P?8!;?`@``&D`0`'P?8-#7`@`````(`'K@5P$#`"!PA```(```
+M""`(8`*'$`(((`AB`H<0!`@`"&0`AQ`U!"<(`?X`8)"$```@``!ZX%>"!0`@
+M`?X`:#4`1Q``?#]@F+D"`#R)``@0?@!`L(0``"``/(&`$'(`AQ``FJ9121I'
+M$(`#`"!'A`<(!WK@5P$"`"#0A```(`"*_A]@`'P_8,P"````]RPH@OX?8$<`
+M1Q``?!]@.=X"`/"$```@```$``@`>N!7`0,`(`!\/V"<W`(``(@`"%8`AQ`"
+MB``($(4``"``@`(`(`!\/V"8N0(`1HD`"%8`AQ!.B0`(1`"'$#8$!P@PA0``
+M(`!5`$<0`)JF40!\'V"VV@(``!I`$`!\/V"8N0(`"(D`"%"%```@``%^`$`(
+M@8`0`*((8`#@_"\`&@@0`?X?8!``K@D4`,X)<(4``"``&`#N"1P`#@H@`"X*
+M!(#M"R"`#S@D$&X+!#X.$``V#A"0A0``(```.&YC%'Z.4Q`:#A```*!A`'P?
+M8&#>`@``!``(`'K@5["%```@``$!`"````!0@`D`(`'^'V``^?TO`'P_8-BV
+M`@``B`8(T(4``"```("`$`*(!@@"@(`0!(@&"`2`@!``?#]@[MD"``"(!@CP
+MA0``(```@(`0`H@&"`*`@!`$B`8(!("`$`'^'V`0`*X)!(#M"Q"&```@`""`
+M#S@4$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A```*!A,(8``"``````4``+`R@`
+M``!0`!O[+P```%``9`(H`?X?8("O]2]0A@``(```@B!0`'P?8.[9`@`9`D`0
+M&@)`$`""(%``U_LO`'P?8'"&```@`-#7`@`````(`'K@5X$&`"`8!"`(`/K@
+M5P$%`"``?%]@D(8``"``X+<"```((`A8`X$0`@@@"%H#@1`$"``(7`&!$`'^
+M'V"PA@``(`!F`4$0`'P?8-#7`@``&@`0`'P?8.[9`@``B"8(!@*`$-"&```@
+M``*()@@(`H`0!(@F"`H"@!`'A"8($P)`$````%``\`(H\(8``"``#OX_8`!\
+M'V"SV0(```)`$!``K@D$@.T+((`/.!00;@L0AP``(```!$%0`'P?8,O9`@``
+M!$`0``1!4`"$8`@`^N%7@00`(#"'```@``*$8```?`%`R]D"``(&0!`!?@%`
+M``Y`&`*$8```^N%74(<``"``@OO_)P!\'V#+V0(``01`$`/^/V``?!]@[MD"
+M`!("0!!PAP``(```@`\X`'P_8."W`@!0@8`0`(`/.`!\GV"$L`(```""")"'
+M```@``)^@F``>N)7@0``((#^'V``?)]@X+<"`&<!0A!H`T(0L(<``"```'P?
+M8,K9`@``!$`0:@="$`"`#S@`?%]@X+<"``0!`1#0AP``(```?!]@K]H"```"
+M0!``@`\X!#X.$``V#A``.&YC%'Z.4_"'```@`!`:#A```*!A`'P?8&#>`@``
+M!``(`'K@5P$"`"![_A]@$(@``"```'P_8/0"``"`CRPH`'Q?8-3>`@```"$(
+M`(/F5P$Y`"`PB```(``%^N97C@``(`7^OV$`?%]@[-X"```$`0@`>N!7`0P`
+M(%"(```@``#ZYE>!"0`@`OX?8```01`"_D:``'P_8`"Y`@```D%`<(@``"``
+M&`%A"`!\/V#8W@(``(8`$"P!80@`?#]@W-X"``"&`!"0B```(`!``4$(`'P_
+M8.#>`@``A``0@"H`(`'^/V```D$0`"D`(+"(```@``#ZYE>"$``@@`CO+P``
+MH&$```!0`((@4(#]'R@!_C]@T(@``"```'P?8.W>`@```D`0`'P?8/#>`@``
+M`D`0`((@4`!\'V#PB```(`#NW@(```)`$`":!F"``N\O`'P?8.C>`@`````(
+M`7K@5Q")```@`($"`"``?!]@Y-X"```$``@`>N!7`AH`(`""(%``?!]@,(D`
+M`"``[=X"```"0!``%@`@`/CN+P+^1H``?#]@`+D"```"04!0B0``(``8`6$(
+M`'P_8-C>`@``A@`0+`%A"`!\/V#<W@(``(8`$'")```@`$`!00@`?#]@X-X"
+M``"$`!`%_E]@`'P_8`#?`@``A``0D(D``"```?Y?8`!\/V#\W@(``(0`$`!\
+M/V`$WP(``(0`$`!\7V"PB0``(`#4W@(````A"`#ZX%>!`0`@`!H!$(#I[B^`
+M!0`@@.CN+]")```@``3^/V``?!]@\-X"```"0!``?!]@]-X"```:`!````!0
+M\(D``"```OX_8`#8'R@0`*X)!(#M"R"`#S@4$&X+`'P_8)BY`@`0B@``(`!$
+M@8`0`(`/.`0^#A``-@X0`#AN8Q!^CE,!!&`(`'P_8#"*```@`,#9`@`!AD`0
+M``1!4`$$8`@`!^%7"@4`(``$($`"A&`(4(H``"```'PA0,#9`@`"AD`0`7XA
+M0`".0!@!!"`(``/A5PO[_R=PB@``(```?!]@I=H"``!\/V#`V0(`"OY?8`#?
+M[B\$@.T+((`/.)"*```@`!`0;@L$/@X0`#8.$``X;F,0?HY3```@8!6$0`@`
+M?!]@L(H``"``[MD"`!4$0!`6A$`(%@1`$!>$0`@7!$`0&(1`"!@$0!#0B@``
+M(``;A$`(`GKA5XD``"`;!$`0'81`"`!\'V#NV0(`'01`$/"*```@`!Z$0`@>
+M!$`0((@@""`"@!``?#]@V+4"``"$(`@`^N!7$(L``"```0$`(`""(%``0?LO
+M!(#M"R"`#S@0$&X+!#X.$``V#A`PBP``(```.&YC&'Z.4Q`:#A`4'`X0``#`
+M80""H&$`?!]@X+<"`%"+```@`&L%``@`>N!7@@L`(`!\'V"4W`(```0`"`!Z
+MX%<!`@`@<(L``"``"?X?8`!C`B@```!0`%[Z+P-^1X``'$%```1!0`!\?V"0
+MBP``(`!(U@(```8!0`$$(`@"_@%```1`0``<!V``FF9@`)G[+["+```@``G^
+M'V``5P(H$`"N"10`S@D$@.T+((`/.!@0;@L$/@X0T(L``"```#8.$``X;F,8
+M?HY3$!H.$!0<#A````!0`/ST+P!\/V#PBP``(``PUP(``(0`"`!ZX%<!`0`@
+M````4`"`0!"`GNXO``#`81",```@``!\'V"8N0(`.@4`"`!ZX%>"!@`@`'R_
+M8;/9`@``A`8(,(P``"``!7K@5P(!`"`,_A]@@`(`(!1ZX%<"`@`@!/X?8`";
+M`BA0C```(``!_A]@`(!&$``<!V"`ENXO@/@"*!``K@D4`,X)!(#M"W",```@
+M`""`#S@8$&X+!#X.$``V#A``.&YC$'Z.4P!\/V"8N0(`D(P``"``"(D`"`!Z
+MX%>"!@`@.H4`"`%ZX%>!`0`@$($`"`!ZX%>PC```(`""`P`@`'P?8!;?`@``
+M!``(`'K@5P(!`"`!_A]@`#0"*-",```@``2`[0L@@`\X$!!N"P0^#A``-@X0
+M`#AN8R!^CE,0&@X0\(P``"``%!P.$!@>#A`<(`X0``#`80""`&(`GN=1``B"
+M4``(2!`0C0``(``0`*<)7(0&"`Q^(&``^N!7@0$`(/Q^`&!(>N!7@E$`(#"-
+M```@`'R`!@@!>N!7`DD`(``(@E``?!]BF+D"``P)2!!,"0@(4(T``"``1@&(
+M$!@!"`@`>N!7`0,`(``!YU>"```@&`D($`+^'V!PC0``(`!'@$80``@`(``<
+M!V``V`8H@!0`(`!\'V*8N0(`3`D(")"-```@`$8!B!``"()0#`E($!@!"`@`
+M>N!7`?K_)X`%`"`#_A]@L(T``"``1X!&$(#Y_R<`?!]BF+D"`!Q_"$``@A0H
+M@`L`(`7^'V#0C0``(`!'@$80@/7_)P`!YU<"^_\G&`D($`#Z_R<`?!]BF+D"
+M`/"-```@``P%"`@`>N!7@G8`(`'^/V!'@D803`D("$8!B!`8`0@($(X``"``
+M`'K@5P'L_R<``>=7`O/_)P`(@E``]_\G`'P?8IBY`@`PC@``(``("0@(_W\`
+M0`@!B!``"()0"@F($`"9^2^`;``@!?X?8%".```@`$>`1A`!_C]@`'P?8##7
+M`@```D`0`?X?8`"L]"\`?!]B<(X``"``F+D"`$P)"`A&`8@0&`$("`!ZX%>!
+M!``@``'G5P(!`""0C@``(```"()0&`D($`!\'V*8N0(`''\(0`!F%"@``0`@
+M`!P'8+".```@`("Q!B@`?!]BF+D"``@)"`C_?P!`"`&($``(@E`*"8@0T(X`
+M`"```?X_8`!\'V`6WP(```)`$(!9`"`%_A]@1X!&$`'^/V#PC@``(```?!]@
+MM-H"```"0!``?!]BF+D"`$P)"`A&`8@0&`$("!"/```@``!ZX%>!!``@``'G
+M5P(!`"``"()0&`D($`!\'V*8N0(`,(\``"``''\(0`!4%"@``0`@`!P'8("?
+M!B@`?!]BF+D"``@)"`A0CP``(`#_?P!`"`&($``(@E`*"8@0@$D`('R`!@@`
+M?!]BF+D"`'"/```@``0!"!")_A]@`'P_8#`$````10`@`WX`4`9ZX%>-^O\G
+MD(\``"```GZ`@0!\A@&@CP`````&.&LC``!S(P``<R,``),C``"PCP``(`"Y
+M(P``V2,``'HC```(^N!7@CL`('R`!@@!>N!7`C,`(-"/```@``+^'V!'@$80
+M`'P?8IBY`@!,"0@(1@&($(#'`B@`)0`@\(\``"``!?X?8$>`1A``?!]BF+D"
+M`(`B`"`!_C]@1X)&$`!\'V`0D```(`!DW@(````@"`#ZX%>!`0`@`!P'8`""
+M`#@``$@0``0("#"0```@``!ZX%<`?!]BF+D"`$P)"`A&`8@0@0,`(`!\/V`Y
+MW@(`4)```"```(0@"`#ZX%>"*@`@5H"&$(`I`"`("0@(_W\`0`@!B!!PD```
+M(`"`4_DO`"<`(`'^/V``?!]@%M\"```"0!``?!]BF+D"`)"0```@`!@!"`@`
+M>N!7`08`(!``H`@`^N)7@00`(`H)*`@`^N!7L)```"```@,`(`"%_"\8"0@0
+M"?X?8$>`0A`<?PA`@"$4*`7^'V#0D```(`!'@$80`'P?8+;:`@``!``(`'K@
+M5P(#`"`!_C]@`'P?8/"0```@`##7`@```D`0`?X?8(!9]"\`?!]BF+D"``@)
+M"`C_?P!`$)$``"``"`&($``"`"`("0@(_W\`0`@!B!``/?DO`'P?8&3>`@`P
+MD0``(````"`(`/K@5X$.`"``'`=@`((`.``-`"!\@`8(`'P?8E"1```@`)BY
+M`@`$`0@0B?X?8`!\/V"T!```@`@`(`-^`%`&>N!7<)$``"``C?K_)P)^@($`
+M?(8!A)$`````!CC\(P``_",``/PC``"0D0``(``>)```4B0``%(D```!)```
+MB?X?8`!\/V"Y!````%TK*+"1```@``">!V`0`*X)%`#."1@`[@D<``X*!(#M
+M"R"`#S@@$&X+T)$``"``!#X.$``V#A``.&YC''Z.4Q`:#A`4'`X0&!X.$```
+MP&'PD0``(```FJ91$`#G"5R$!P@,?B!@`/K@5X$!`"#\?@!@2'K@5Q"2```@
+M`(()`"``?)]@F+D"`!@!`@@``>=7@@,`(````%`8`0(0,)(``"```_X?8$>`
+M1Q`<?P)``/,3*``!`"``'`=@@#X&*````%!0D@``(```?)]@F+D"``H!@A``
+M$0`@"/K@5P(.`"``?)]@F+D"`'"2```@`!@!`@@`>N!7@08`(!``H`@`^N)7
+M`04`(`H)(@@`^N!7D)(``"``@@,`(`!)_"\```!0&`$"$`G^'V!'@$(0''\"
+M0`#E$RBPD@``(``#_A]@1X!'$`!\'V!DW@(````@"`#ZX%>!`P`@`!P'8-"2
+M```@``""`#@``@`@B/X?8`!\/V""`P```#8K*`!\GV"8N0(`\)(``"``"`D"
+M"/]_`$`(`8(0`)H&8!``K@D4`,X)&`#N"02`[0L0DP``(``@@`\X'!!N"P0^
+M#A``-@X0`#AN8Q!^CE,`?!]@S-X"`#"3```@```$``@`>N!7@0,`(`!\/V"8
+MN0(`4($`"`%^`$!0@0`04),``"``````4(`!`"`!_A]@`&8!*`'^'V`$@.T+
+M((`/.!`0;@MPDP``(``$/@X0`#8.$``X;F,0?HY3`'P?8,S>`@``!``(`'K@
+M5Y"3```@`($?`"``?!]@R=X"```$``@`>N!7`0P`(`!\'V"KV0(`L),``"``
+M``0`"`!ZX%>""0`@`'P?8!3:`@``!``(`'K@5P('`"#0DP``(```?!]@[MD"
+M``""(%"`*/HO`'P?8-#7`@`````(`'K@5_"3```@`($"`"`8!``(`'K@5P$!
+M`"`!_A]@`&+Y+P'^'V``JP`H$)0``"``````4(!Y`"@`@B!0`'P?8&#>`@``
+M`D`0`'P?8,S>`@`PE```(````D`0`'P?8-#7`@`````(&`0`"`!ZX%<`?!]@
+MR=X"`%"4```@```$``@!`P`@`'K@5P$!`"`4_C]@@`,`(`7^/V"``@`@<)0`
+M`"```'K@5P$!`"`._C]@@```(`G^/V``?!]@L]D"```"0!"0E```(``$@.T+
+M((`/.!`0;@L$/@X0`#8.$``X;F,8?HY3$!H.$+"4```@`!0<#A```,!A`(*@
+M80#^$R@`?+]@Q+0"`!R!(@@`@F!`T)0``"```()A0`+^88``?)]@--<"``"(
+M04``B(%````"$`0<`1#PE```(``(&@$0`?X`0!R!`A`0`*X)%`#."02`[0L@
+M@`\X&!!N"Q"5```@``0^#A``-@X0`#AN8S1^CE,0&@X0%!P.$!@>#A`<(`X0
+M,)4``"``("(.$"0D#A`H)@X0+"@.$#`J#A```*!A$("&"@R`)@A0E0``(```
+MB``(``(`0A8("`@/?@!@``[`&0!ZYU<!_G]B`J9I4G"5```@``""(%`!!`@(
+M!'X`8`!ZX%<"`0`@`/KI5X(``"`!_C]@D)4``"```(Y`&`""(%`!!`@(!'X`
+M8`!ZX%>"`0`@`/KI5X(``""PE0``(``!_C]@`(Y`&A8("`@`?`!@\/\````0
+MX!D`>N%7`'P_8M"5```@``"R`@""!``@+(&H"@#ZZE<!`0`@`*H*8(#*!2@`
+M``!0\)4``"```'P_8@"R`@``-@`@)(DH"`X("`@`@>!7`@4`("*)*`@0E@``
+M(``,"`@(`('@5P(#`"`@B2@("@@("`"!X%<"`0`@`?X?8#"6```@`(```"``
+M``!0`'K@5X$$`"``?#]B`+("`"B)"`@`@>=74)8``"```@(`(":)*`@!_@!`
+M``'G5XP-`"``?#]B`+("`"R!J`IPE@``(```^NI7`0$`(`"J"F``N`4H````
+M4`!\/V(`L@(`+($($)"6```@``#ZZ5<!"``@`00("/M_`&`!`$@0"@@("""!
+MB!`,"`@(L)8``"``(H&($`X("`@D@8@0+)L($#"I"!`HGX@0)IV($(`:`"#0
+ME@``(````^=7B0$`(`":!F``K`4H`!@`(`R`)@@"B``(.`B*"/"6```@```(
+M`%``$,`9+(&H"@R`2@@`"&$(`(2A0#"!Z`D4B$<($)<``"```(@`"``"($``
+M!@%``!P`0`!]X%?L`0``#`8`(`":!F`PEP``(`"`H04H+(&H"@#ZZE<!`0`@
+M`*H*8`"?!2@```!0`'P_8E"7```@``"R`@`L@0@0``L`(``*`4```B)``!Q'
+M8(!"[2\,@$H(<)<``"```@@!"``<`$`"`($0%(A'"``<`4`4@(<0`)H&8`"6
+M!2B0EP``(```>NE7@0$`("R!J`D```!0``$`(````%```0`@+($($+"7```@
+M``":!F`0`*X)%`#."1@`[@D<``X*(``N"B0`3@HH`&X*T)<``"``+`"."C``
+MK@H$@.T+((`/.#00;@L$/@X0`#8.$``X;F/PEP``(``8?HY3$!H.$!0<#A``
+M`,!A@!_M+P!\OV&8N0(`.IU&$!"8```@```@[2\YA08(`'K@5X("`"`ZA08(
+M`'K@5P$!`"`$_A]@,)@``"``@$\#*!``K@D4`,X)!(#M"R"`#S@8$&X+!#X.
+M$``V#A!0F```(```.&YC('Z.4Q`:#A`4'`X0&!X.$!P@#A```.!A`(+`87"8
+M```@```$H6$`?!]B,=H"```$"`@`>N!7`@H`(`!\'V!,MP(`D)@``"````0`
+M"`!ZX%>!!P`@``1!4`!\'V`]V@(```1`$`/^'V"PF```(`"`MP`H`?X_8`!\
+M'V!@V@(```(`$````%``@B!0@-P=*-"8```@``'^/V```D@0`'P?8C':`@``
+M!`@(`'K@5P$,`"``!$%0\)@``"````1($`!\'V`XV@(``!X`$`!\'V`TV@(`
+M`!R`$`'^/V`0F0``(```?!]@,-H"```"0!``?!]@,MH"```"0!``?!]@/-H"
+M`#"9```@```:0!``?!]@9-H"```$`!````!0`OX_8`#-'2@0`*X)4)D``"``
+M%`#."1@`[@D<``X*!(#M"R"`#S@@$&X+`'K@5X$#`"!PF0``(```?#]@,MH"
+M``"$``@`>N!7`@,`(`+^'V"``0`@````4)"9```@``!\/V`RV@(``(!`$`"`
+M#S@$/@X0`#8.$``X;F,4?HY3L)D``"``$!H.$`"^#V``?`!@____``)^`(``
+M?+]AQ+0"`(B!!A#0F0``(`"$@08(`7X`0(2!!A``YA0H@($&$`!\/V`PV@(`
+M`(0`"/"9```@``!ZX%>!!``@`)JF40":0!`!_C]@`'P?8#+:`@```D`0$)H`
+M`"``````4`+^/V``LQTH`)JF40!\'V"<V@(``!I`$`!\'V`PF@``(`"DV@(`
+M`!I`$(`C`R@`?!]@N-H"```:`!``?!]@O-H"`%":```@```:`!`0`*X)!(#M
+M"R"`#S@4$&X+!#X.$``V#A``.&YC<)H``"``&'Z.4Q`:#A`4'`X0$`"@"0!\
+M7V`]V@(```0A"`#ZX%>0F@``(``!*``@#``@"`"(``@``@!`.(A&"````4`4
+MB"8(`(0@4+":```@``"0(!@`?%]@--H"```(00@`?/]@:-H"``".8V``]QPH
+MT)H``"``((`#"`!ZX%<!!``@*(`C"`!\7V!@V@(```!!"`1ZX5?PF@``(``!
+M_E]@`@1!4(`7'"@T@,8)@+_L+P!\7V`]V@(```0A"!";```@``#ZX%<!%P`@
+M`((@4``"01``?/]@:-H"`"B`0P@"!&$(,)L``"```'P_8$3:`@``A@`0`P0A
+M"`!\7V!(V@(```(!$`!\7V!0FP``(`!TK@(```(!$`"`(P@`@$`(`'P_8$S:
+M`@``A``0!(`C"'";```@``"`0`@`?#]@4-H"``"$`!``?#]@0-H"``"<`!`L
+MA$,(D)L``"```'P_8%3:`@``A$`0+81#"`!\/V!5V@(``(1`$#2`1@BPFP``
+M(```?#]@6-H"``"$`!"`JNPO````4`+^/V``?1TH@```(-";```@``"H["\0
+M`*X)%`#."02`[0L@@`\X&!!N"P0^#A``-@X0\)L``"```#AN8Q1^CE,`?#]@
+MI-P"``7^8$`"A``(_X%-$`.$``@0G```(`#^@4T0_HDM"`!\'V#4K@(```(`
+M$````%``?+]@V*X"`#"<```@``"``A``#,-0`'P?8(S;`@``!``(``'C5XH2
+M`"``A$$(4)P``"```'KA5PP"`"`.>N%7"0$`(`'^GV"````@``B"4`"$00AP
+MG```(```!"%@`80!"``$`$``@>!7B@<`(`"(`%`!@!^``!!`&)"<```@``!\
+MOV#8K@(``(`""``$`&@`@`(0`?X`0``.(!@`A$$(L)P``"```80!"``$`$``
+M@>!7B_C_)P/^84`!?@-```[`&`!\'V#0G```(`",VP(```0`"``!XU>+[?\G
+M`OX?8(#1]"\!_C]@`'P?8/"<```@`(W;`@```D`0!(#M"R"`#S@4$&X+!#X.
+M$``V#A``.&YC$)T``"``&'Z.4Q`:#A`4'`X0``"@80!\WV%(P0(```1G"`+^
+M08`PG0``(```?#]@A,$"```"`0``>N!7@0X`(`+ZX5>*#0`@`/KF5U"=```@
+M``(!`"`!^N%7@@4`(`!\WV%(P0(```1G"`+^08``?#]@<)T``"``A,$"```"
+M(0``B``(``(@0`'^'V`(@``0`'S?84C!`@"0G0``(```!&<(`OY!@`!\/V"$
+MP0(```(!``'^/V``HO0O``1G"+"=```@``'^`4```$<0`'S?84C!`@``!&<(
+M`OKA5XH1`"``^N97T)T``"``@A``(`'^'V`!_C]@``1!4(!I!"@`>N!7`0L`
+M(``$9PCPG0``(``"_D&``'PA0(3!`@``@``0]OX_0`("@!`4_C]@``*`$!">
+M```@``"*HE`0"@`0``B`"```(D`-_E]@```"0``$`!`#_@&`,)X``"````8`
+M4`2``!`(B@`0`((`8``#`"``?#]@]*@"``R!``A0G@``(``!?@!`#($`$```
+M`%`0`*X)%`#."02`[0L@@`\X&!!N"W">```@``&`'X``$$`8`'P_8,K>`@``
+MB``(``0`<`"`@!``@`\XD)X``"``!#X.$``V#A``.&YC('Z.4Q`:#A`4'`X0
+M`)JF40"^+V"PG@``(``!@%^``'P_8,K>`@``B``(``0`:`"`@!``?!]@.KT"
+M`-">```@```(``@`>N!7`04`(`9ZX%<!!``@`'S?89RX`@`D?P=`\)X``"``
+M^/]M0`'^/V`!_E]@__^?8``>$2@`?-]AG+@"``1_!T`0GP``(`#^_S]@`OY?
+M8(!2$2@`/.PO``4G"`#ZX%<!`0`@`?Z_83"?```@`(`(`"``?#]@R=X"``"$
+M(`@`^N!7`@8`(`!\/V"KV0(`4)\``"```(0@"`#ZX%>"`P`@`'P_8!3:`@``
+MA"`(`/K@5P(!`"!PGP``(``!_E]@``5'$``S["\`^N97@00`(`!\WV&<N`(`
+M!'\'0)"?```@`/S_;4`!_C]@``1!4/__GV``"A$H@"T`(`!\/V#)W@(`L)\`
+M`"```(0@"`#ZX%<"*P`@`'P_8*O9`@``A"`(`/K@5X(H`"#0GP``(```?#]@
+M%-H"``"$(`@`^N!7`B8`((`J^"^`J0XH`'P?8/"?```@`)#<`@`````("'X`
+M8`!ZX%>"`@`@`'P?8`"O`@`````($*```"```7K@5P((`"`#_K]A`(X&&`/^
+M9H``FF%``(9A0`!\7V`PH```(`!(U@(``(0A0`&$(`@"?D%```9!0`"&85"`
+M!?DO`/KF5U"@```@`/__ID&"^/\G`'P?8-#7`@`````(`'K@5X$!`"`8!``(
+M<*```"```'K@5P("`"``?!]@[MD"``#T[2^``0`@`?X?8`#1]R^0H```(`"`
+M_/\G`'P?8-#7`@`````(&`0`"`!ZX%<!!0`@@/L-*+"@```@``!ZX%>!`@`@
+M`?Y?8`!\'V"SV0(```1`$``#`"`4_C]@T*```"``@```(`[^/V``?!]@L]D"
+M```"0!`!_E]@`'P_8,G>`@#PH```(```A$`0````4`!\WV&<N`(```%'$`1_
+M!T`!_C]@``1!4!"A```@`(`3$2@0`*X)%`#."02`[0L@@`\X(!!N"P!\7V#D
+MW@(`,*$``"````0A"`"``'```$$0`(`/.`0^#A``-@X0`#AN8R!^CE-0H0``
+M(``0&@X0%!P.$!@>#A`<(`X0````8@""X&$`!*%A`'S?87"A```@`.7>`@``
+M!"<(`/K@5P("`""!_A]@`'P_8!D(````82DHD*$``"```'P?8.S>`@``!``(
+M`'K@5P)-`"``?!]@U-X"``````BPH0``(```>N!7@4H`(`!ZZ%>!.@`@`'P?
+M8.C>`@`````(`'K@5]"A```@``(X`"``?#]@[=X"``"$(`@`^N!7@0(`(`!\
+M'V#PW@(`\*$``"````0`"`)ZX%<"0@`@`'P?8.3>`@``!``(`'K@5P$(`"`0
+MH@``(``!_E]@`'P_8.W>`@``A$`0````4`!\/V#NW@(``(!`$#"B```@````
+M`%``@B!0@,\<*`/^/V``?!]@\-X"```"0!"`-P`@4*(``"```?X?8`!\WV'E
+MW@(```0G"`#ZX%<!"``@````4`/^/V!PH@``(`"`?08H``0G"`#ZX%<"!0`@
+M`'P_8.[>`@``A"`(`/K@5Y"B```@`(("`"``?#]@[=X"``"$(`@`^N!7@2P`
+M(`!ZX%>""0`@L*(``"```'Q?8/C>`@``!`$(`7X`0``.(!@``$$0"OK@5X(!
+M`"#0H@``(`""_A]@@)<<*``F`"`!_E]@`'P_8.[>`@``A$`0`,47*/"B```@
+M``!\`$#``P```"$`(`)ZX%>"!@`@`?Y?8`!\/V#MW@(`$*,``"```(1`$`/^
+M/V``?!]@\-X"```"0!````!0`'P_8.[>`@`PHP``(```@$`0@!H`(`%ZX%<"
+M"``@``@I*`+^/V``?!]@\-X"`%"C```@```"0!````!0`'P_8.W>`@``@$`0
+M`'P_8.[>`@``@$`0<*,``"``@+07*`!\`$``"@``@!``(('^'V``?#]@9`@`
+M```A*2B0HP``(```#P`@`/KG5P$.`"`*_A]@@%W_+P!\'V#4V@(```0`"+"C
+M```@``%ZX%>"`@`@`'P?8`"Y`@!T!0`(`'K@5X("`"``?!]@T*,``"``U-H"
+M```$``@`>N!7@@4`(`#\!D!``0```?X_8`"9'"CPHP``(``!_E]@`'P?8`"Y
+M`@!T!4`0``$`(`'^/V"`E1PH$`"N"1"D```@`!0`S@D8`.X)'``."@2`[0L@
+M@`\X(!!N"P0^#A``-@X0,*0``"```#AN8Q!^CE,`?!]@Y-X"```$``@`>N!7
+M`@4`(`!\/V!0I```(`#MW@(``(0`"`!ZX%>!`@`@````4`"`0!````!0`OX_
+M8'"D```@`("('"@$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,4?HY3D*0``"``
+M$!H.$```H&$`?!]@Y=X"```$``@`>N!7@2T`(`!\'V"PI```(`#LW@(```0`
+M"`!ZX%<"*P`@`'P?8-3>`@`````(`'K@5]"D```@`($H`"`!_E]@`'P?8-#>
+M`@``!$`0`'P?8.W>`@``!``(\*0``"```'K@5X$"`"``?!]@\-X"```$``@"
+M>N!7@B$`(`2$``@0I0``(``!?@!@`'K@5P$(`"`!A``(('X`8`!ZX%<"!@`@
+M"OX?8#"E```@`(`G_R\`?#]@`+D"`'2%``@`>N!7`1H`(``$05!TA4`04*4`
+M`"``````4`""(%``%P`@!(0`"`%^`&``>N!7`0T`(`K^'V!PI0``(`"`(_\O
+M`'P?8-3:`@``!``(`7K@5X("`"``?#]@`+D"`)"E```@`'2%``@`>N!7@@(`
+M(`!\'V#4V@(```0`"`!ZX%<"#0`@L*4``"```/P&0$`!```!_C]@`%\<*`'^
+M7V``?#]@`+D"`'2%0!#0I0``(`"`"``@`OX_8`!\'V#PW@(```)`$``$05``
+M?!]@[=X"`/"E```@```$0!``?!]@[MX"```$0!``?!]@W-X"``````@`&@!`
+M$*8``"```?X_8`!4'"@0`*X)!(#M"R"`#S@4$&X+!#X.$``V#A`PI@``(```
+M.&YC$'Z.4P!\'V#EW@(```0`"`!ZX%>!'0`@`'P?8%"F```@`.S>`@``!``(
+M`'K@5P(;`"``?!]@U-X"``````@`>N!7<*8``"``@1@`(`!\'V#PW@(```0`
+M"`%ZX%<""@`@`'P?8.W>`@"0I@``(```!``(`'K@5X("`"``?!]@[MX"```$
+M``@`>N!7@0T`(+"F```@``""(%``?!]@U-X"```"`!`%_A]@`/G^+P```%``
+MA@THT*8``"```.`6*(`(`"``?!]@Z-X"``````@`>N!7@@``(("2*"CPI@``
+M(``"_C]@`'P?8/#>`@```D`0@$(7*`!\/V#@W@(``(`@"!"G```@``"``$`!
+M_C]@@#,<*`""(%``?!]@[=X"```"0!``?!]@,*<``"``[MX"```"0!`$@.T+
+M((`/.!`0;@L$/@X0`#8.$``X;F-0IP``(``4?HY3$!H.$(`TZR\`?#]@Y=X"
+M``"$(`@`^N!7`'Q?8'"G```@`-3>`@```"$(`A$`(`#ZX%<!`0`@`OY?8(``
+M`"`!_E]@D*<``"```'P_8.S>`@``A$`0`7KA5P()`"`!_C]@`'Q?8-3>`@"P
+MIP``(````@$0`'R_80"Y`@`<@48(`'P_8-C>`@``A``0,(%&"-"G```@``!\
+M/V#<W@(``(0`$$2!1@@`?#]@X-X"``"$`!``!$%0\*<``"```'P_8,_>`@``
+MA$`0@"+K+X`\`"``^N!7@AL`(`!\/V`0J```(`#PW@(``(0@"`3ZX%<"!``@
+M`OY_8`!\/V#LW@(``(9`$#"H```@``!\/V#TW@(``(`@"(`"`"`!_G]@`'P_
+M8.S>`@``AD`04*@``"```?X_8``"`1``?%]@U-X"````(0@"_B"``'R_80"Y
+M`@!PJ```(```FF!`&(%!"`!\/V#8W@(``(0`$"R!00@`?#]@W-X"`)"H```@
+M``"$`!!`@4$(`'P_8.#>`@``A``0`OY_8`!\/V#PW@(`L*@``"```(9`$``$
+M05``?#]@[=X"``"$0!`!_G]@`'P_8,_>`@#0J```(```AD`0@`?K+P```%`"
+M_C]@@/H;*(`>`"``?#]@Z-X"`/"H```@``"`(`@!^N!7`@8`(`+^?V``?#]@
+M[-X"``"&0!``?#]@$*D``"``\-X"``"&0!``!$%0`'P_8.W>`@``A$`0`!$`
+M(`#ZX%<PJ0``(`""%@`@`'P_8/#>`@``A"`(`?K@5P(&`"``?#]@[=X"`%"I
+M```@``"$(`@`^N!7@@(`(`!\/V#NW@(``(0@"`#ZX%<!`0`@<*D``"```?Y_
+M8(```"`"_G]@`'P_8.S>`@``AD`0`_Y?8`!\/V"0J0``(`#PW@(``(1`$``$
+M05``?#]@[=X"``"$0!``?#]@[MX"`+"I```@``"$0!`!_G]@`'P_8,_>`@``
+MAD`0@.GJ+P```%`"_C]@T*D``"``@-P;*`!\OV$`N0(`6/\&0/__/V"`U!`H
+M$`"N"02`[0OPJ0``(``@@`\X%!!N"P0^#A``-@X0`#AN8QA^CE,0&@X0%!P.
+M$!"J```@``""(%``?!]@T-X"```"0!``?%]@[MX"```$`0@`>N!7,*H``"``
+M`0$`(``"01``!0`@`'Q?8._>`@``!`$(`'K@5P$!`"!0J@``(````D$0@`$`
+M(`!\7V#XW@(```)!$`!\'V#*W@(```@`"'"J```@``!\`&``!````'K@5P$%
+M`"`*_A]@`'W^+P!\7V``N0(`D*H``"``=`4!"`!ZX%>!`0`@`((@4'0#01``
+MS0`@`'R_8?#>`@"PJ@``(```A`8(`WK@5P(\`"``?!]@Z-X"``````@`>N!7
+M`L@`(-"J```@``!\'V#DW@(```0`"`!ZX%>!!P`@`(<`(`!\OV'PW@(`\*H`
+M`"```(!&$`!\GV#LW@(```0""`!ZX%<!P0`@`'Q_8,_>`@`0JP``(```A`$(
+M`'K@5X&^`"``H@`@`?Z_80!\WV'EW@(```0'"#"K```@``!ZX%>!"``@````
+M4`/^/V"`8P4H``"@80`$!P@`>N!74*L``"```@4`(`!\7V#NW@(```0!"`!Z
+MX%>"`@`@`'Q?8.W>`@!PJP``(```!`$(`'K@5X&R`"``^N97`@\`(`!\7V#X
+MW@(```0!")"K```@``%^`$``#B`8``!!$`KZX%>""``@`'R?8.S>`@``!`((
+ML*L``"```'K@5P&'`"``A``@`((@4`""01```D(0`'Q?8.W>`@#0JP``(```
+M`D$0`'Q?8`"Y`@!8?P%`@+X0*`"!`"`!_A]@`'Q?8/"K```@`.[>`@```$$0
+M@)L`(`+ZYE<"`P`@`?X?8`!\7V#MW@(`$*P``"````!!$`/^'V"`V?\G`?KF
+M5X(,`""`ZR<H`OX?8`!\OV$PK```(`#PW@(``(!&$`""(%``?%]@[=X"```"
+M01``?-]AY=X"`%"L```@```$!P@`>N!7@0(`(`"7%B@`?`!```H```'^/V``
+MB1LH<*P``"```'Q_8,_>`@``A`$(`7K@5X&1`""`.``@?/X?8`!\/V"0K```
+M(``S!``````H*(".`"`$>N!7`@D`(`!\'V#TW@(````@"+"L```@``!\'V#4
+MW@(```(`$(#8)R@"_A]@`(!&$`!\WV'EW@(`T*P``"````0'"`!ZX%>!A@`@
+M`(<6*`!\`$``"@```($`(`%ZX%?PK```(`"",``@`'P?8.3>`@``!``(`'K@
+M5X$"`"`!_A]@`'Q?8!"M```@`.W>`@```$$0@'X`(`'^OV$`?-]AY=X"```$
+M!P@`>N!7,*T``"```0L`(`!\'V#HW@(`````"`!ZX%>""``@````4`/^/V!0
+MK0``(`"`(04H``"@80`$!P@`>N!7`@4`(`!\7V#NW@(```0!"'"M```@``!Z
+MX%>"`@`@`'Q?8.W>`@``!`$(`'K@5X%P`"``^N97D*T``"```@H`(`!\7V#X
+MW@(```0!"`%^`$``#B`8``!!$`KZX%>PK0``(`""`0`@@OX?8``[&RB`$0`@
+M`((@4`!\7V#MW@(```)!$-"M```@``'^'V``?%]@[MX"````01"`8``@`OKF
+M5P($`"`!_A]@\*T``"```'Q?8.W>`@```$$0`'R_8?#>`@``@$80@&``(`'Z
+MYE<0K@``(``""@`@`((@4`!\'V#4W@(```(`$`!\WV'EW@(```0'"#"N```@
+M``!ZX%>!`@`@!?X?8``*_B\```!0`)<,*`#Q%2@`?!]@4*X``"``$+,"``'^
+M/V``!$%0`&H/*(!5`"!\_A]@`'P_8*P$``!PK@``(`"`Q"<H`%,`(`)ZX%>"
+M2``@`'P_8-S:`@``@``(`7K@5Y"N```@``(!`"`"_A]@`(``$`!\'V#0UP(`
+M````"`!ZX%>"`@`@L*X``"```'S?8>7>`@``!`<(`'K@5X%)`"``?-]AY=X"
+M```$!PC0K@``(```>N!7`@(`('S^'V``?#]@PP0```"V)R@`?!]@U-X"`/"N
+M```@``````@`>N!7`@(`('S^'V``?#]@R@0``("Q)R@`?!]@$*\``"``Y-X"
+M```$``@`>N!7@0(`(`'^'V``?%]@[=X"````01`PKP``(```>/\G`?Z_80!\
+MWV'EW@(```0'"`!ZX%>!#``@`?X?8%"O```@``/^/V``X00H``"@80`$!P@`
+M>N!7`@4`(`!\7V#NW@(`<*\``"````0!"`!ZX%>"`@`@`'Q?8.W>`@``!`$(
+M`'K@5P$P`""0KP``(```?!]@T-X"```$``@`>N!7@0$`(````%``@B!0`"$;
+M*+"O```@``#ZYE<""P`@`'Q?8/C>`@``!`$(`7X`0``.(!@``$$0T*\``"``
+M"OK@5X($`"``>?\G`'Q_8,_>`@``A`$(`'K@5X)Y_R?PKP``(`""_A]@@/,:
+M*(`B`"`!_A]@`'Q?8._>`@```$$0`!D`(!"P```@``+ZYE>"!0`@`?X?8`!\
+M7V#MW@(```!!$`+^'V``5_\G,+```"```((@4`""01```D(0``)!$(`7`"`!
+M^N97@@P`(`!\WV%0L```(`#EW@(```0'"`!ZX%<!`0`@`?X?8`!3#"@`?)]@
+M[-X"`'"P```@```$`@@`>N!7`@$`(`7^'V"`O?TO`((@4`!\'V#HW@(`D+``
+M`"````(`$`!\?V#/W@(``(0!"`!ZX%<!#0`@`()!$``*`""PL```(`!\_A]@
+M`'P_8#L%````>R<H@`D`('S^'V``?#]@0@4``-"P```@`(!X)R@`!P`@`((@
+M4`!\7V#MW@(```)!$(`%%B@`?`!`\+```"``P`,```'^/V"`]QHH``(`(`!\
+M7V``N0(`6'\!0``9$"@0L0``(``0`*X)%`#."02`[0L@@`\X&!!N"P0^#A``
+M-@X0`#AN8S"Q```@`!A^CE,0&@X0%!P.$```H&$`@L!A`'P?8.7>`@``!``(
+M4+$``"```'K@5X(!`"!Y_A]@Z?X_0(!F)R@`?!]@U-X"``````APL0``(```
+M>N!7`04`(`!\'V#HW@(`````"`%ZX%>!`@`@`'P?8)"Q```@`.S>`@``!``(
+M`'K@5P$!`"`!_A]@@!X`(`!\/V``WP(`L+$``"```(``"`!ZX%<!`0`@_W\`
+M0`"``!``?#]@`-\"``"```C0L0``(```>N!7`@4`(`!\/V#\W@(``(!`"`!\
+M'V#8W@(`````"/"Q```@```!X5<!`0`@`WX!0`"``!``^N97`0@`(`!\/V#\
+MW@(`$+(``"```(!`"`!\?V`$WP(``(0!$``$(6``@^97C0@`(`":!F`PL@``
+M(```FB!0`((!$`#ZX%>""P`@`(0!$(`*`"``?#]@>*X"`%"R```@``"```@!
+M?@!``(``$`!\?V`$WP(``(`A"``#YU<.`0`@<+(``"```((`8(`$`"``'`=@
+M`)P@4`""`1``^N!7`@(`(`!\/V"0L@``(`#\W@(``(!`"(#T_R<0`*X)%`#.
+M"02`[0L@@`\X&!!N"["R```@``!\7V#DW@(```0A"`"``&@``$$0`(`/.`0^
+M#A``-@X0T+(``"```#AN8Q!^CE.`Q.DO`(9A4`!\/V#LW@(``(9`$`!\/V#P
+ML@``(`#0K@(``(`@"`!\7V#4W@(```(!$`!\7V#MW@(```9!$!"S```@``!\
+M7V#NW@(```9!$`#ZX%<"`0`@`?Y?8(```"`#_E]@,+,``"```'P_8/#>`@``
+MA$`0@+KI+P```%`"_C]@@*T:*`2`[0M0LP``(``@@`\X$!!N"P0^#A``-@X0
+M`#AN8QA^CE,0&@X0%!P.$'"S```@`````%``\0LH!?X?8`!>_2\```!0`((@
+M4("E&B@`FJ91D+,``"```'P?8.7>`@``&D`0`'P?8/C>`@``&D`0`'P?8.[>
+M`@"PLP``(```&D`0`'P?8.W>`@``&D`0`'S?8<_>`@``!`<(`'K@5]"S```@
+M`($$`"``?!]@$+,"``'^/V``!$%0`+D.*``:1Q``?!]@\+,``"``6+@"``"\
+M#R@0`*X)%`#."02`[0L@@`\X&!!N"P0^#A`0M```(```-@X0`#AN8Q!^CE,`
+M?!]@Y=X"```$``@`>N!7`0(`(#"T```@`'W^'V``?#]@FP4````+)R@!_C]@
+M`'P?8.7>`@```D`04+0``"```'P?8-3>`@`````(`'K@5X("`"`%_A]@@$3]
+M+P```%!PM```(`"`T0LH@`H`(`7^/V``?!]@`-\"```"`!`!_C]@`'P?8)"T
+M```@`/S>`@```@`0`'P?8`3?`@```@`0@-LF*`+^/V``?!]@L+0``"``\-X"
+M```"0!"`BQ4H`'P`0``*```!_C]@@'T:*`2`[0O0M```(``@@`\X$!!N"P+^
+M7V``?#]@@-\"``"`@`@`?']@N+H"`/"T```@`!"!(0@``^)7!0$`(`3^7V``
+M!0`@%($A"``#XE<&`P`@$+4``"```'P_8'S?`@``@(`(#($A"``#XE>%```@
+M`_Y?8`!ZX%<PM0``(``!$0`@`'Q_8*#?`@``@"$(``/A5X$.`"``A`$0`GKA
+M5U"U```@``$!`"``>N%7@@4`(&(((`C^_R!@8@*`$&X(0`A@""`(<+4``"``
+M`(0@<&`"@!`$`"`(`/P@8/_O__\`!0`@8@@@"`'^(&B0M0``(`!B`H`0;@A`
+M"&`((`@`A"!H8`*`$`0`(`@`_"!H`!```+"U```@``0"`!`!_A]@@```(```
+M`%``@`\X``1!4`!ZX%<!"P`@T+4``"``6`A@"`!\/V"&WP(``(@@"`"#X5>,
+M```@`?Y?8`!\?V#PM0``(`"HWP(``(`A"``#X5<!!0`@`(0!$`!ZX5=B""`(
+M`@$`(!"V```@`/?_(&"````@"/X@:&("@!`!_A]@@```(````%``@`\X,+8`
+M`"```OY?8`!\/V`BWP(``(A@"`!\GV"XN@(`&`DB"`"#X5=0M@``(``*`0`@
+M!/Y?8(`$`"`:"2((`(/A5PH!`"`#_E]@``(`('"V```@`!P)(@@`@^%7C```
+M(``$05``>N!7`0T`(`!\?V"DWP(`D+8``"```(`A"``#X5>!"@`@`(0!$`)Z
+MX5<!`0`@`'KA5X(#`""PM@``(`!B""`(`OX@>&("@!`$`"`(`/P@8/_O__\`
+M`P`@8@@@"-"V```@``+^(&AB`H`0!``@"`#\(&@`$```!`(`$`'^'V"````@
+M\+8``"``````4`"`#S@```!0`(`/.`0^#A``-@X0`#AN8QA^CE,0MP``(``0
+M&@X0%!P.$```H&$"_C]@`'P?8*#?`@```@`0`'P?8#"W```@`)S?`@```@`0
+M`'P?8*3?`@```@`0`!S'40!\'V"LWP(`4+<``"```!P`$``8`"@`F@9@`"D`
+M*`!\?V`@WP(``)R!$`#ZYE=PMP``(``!$@`@``1!4``$84!>B`8(`/PA0!C?
+M`@``@(`0`'Q_8)"W```@`"#?`@``B"$(``(@0`""@1`!?D%`!'KA5XOY_R<`
+M?#]@L+<``"``)-\"``"`@!``?#]@(M\"``"`@!``?#]@,*\"``"``!#0MP``
+M(```',=1I)R&$````%"B@(80L)R&$``$05``!&%``!S'4?"W```@``"&!D"F
+M'(`0`7Y!0`5ZX5>+_/\G$`"N"10`S@D$@.T+$+@``"``((`/.!@0;@L$/@X0
+M`#8.$``X;F,0?HY3`'P?8$C?`@`PN```(```@B!0,/Y?8`!JZB\`?!]@)M\"
+M``""(%`4_E]@@&?J+U"X```@``!\'V"XN@(`"`$@"`!\'V!`WP(```(`$`""
+M(%``?!]@<+@``"``1-\"```"`!``?!]@>-\"```"`!``?!]@?-\"```"`!"0
+MN```(```?!]@@-\"```"`!`$@.T+((`/.!`0;@L$/@X0`#8.$+"X```@```X
+M;F,0?HY3``1!4`!\/V"HWP(``(0`$`!ZX%>!"0`@T+@``"``6`@`"`!\/V"$
+MWP(``("`$`!\/V"XN@(`+(E`"``%X%?PN```(``NB2`("P$`(`"`X*>````@
+M`(3@IP"0'!AD_C]@`&7J+Q"Y```@``!\/V"&WP(``("`$`2`[0L@@`\X$!!N
+M"P0^#A``-@X0,+D``"```#AN8RA^CE,0&@X0%!P.$!@>#A`<(`X0("(.$"0D
+M#A!0N0``(````$!B`((`8@`$X6&`7P4H``"@80'^/V(`',=1`*0(8'"Y```@
+M``!ZX%>!`P`@`GX'@`!\7V"XN@(```0`0&0!(`@`F@9@D+D``"```((`.`"B
+M*$(!?L=!!7KG5P7Y_R<`>NA7`0H`(`!\'V"PN0``(`"@WP(````@"`3ZX%<"
+M`P`@`?X_8`!\'V#5UP(```)`$-"Y```@`````%``-0`@`'P?8*3?`@`````(
+M!'K@5P$!`"`#^N!7\+D``"```@$`(`+^'V"`,``@`/KG5P$O`"``?!]@G-\"
+M``````@0N@``(``$>N!7@@L`(&J(!@@!>N!7@@$`(`!\/V`0)P```"<`(#"Z
+M```@``AZX%>!"0`@``X`&("P&R@`?%]@N+H"`&`!(0@"@&``4+H``"```'P?
+M8"+?`@``""`(`(/A5PD$`"`@"0$(`('@5PH%`"!PN@``(````P`@`WK@5P(%
+M`"!JB`8(@/;_)P3^'V"`'@`@`'P_8)"Z```@`("I`P``&@`@`'P_8*"[#0"`
+M&``@`7K@5P$!`"``>N!7L+H``"```AD`(&J(!@@`#@`8@*`;*`%^`$`#?B!@
+M`'Q?8+BZ`@#0N@``(`!<`0$(`@)```!\'V`BWP(```@@"`"%X%<,$@`@`,00
+M*/"Z```@````P&$`?/]AE-\"``"`!P@```=0`'W@5^@#``".#0`@$+L``"``
+M`'P?8)C?`@`````(```'4`!]X%>X"P``#@H`(&J(!@HPNP``(``#_A]@`?X_
+M8`":1F``,"(H:H@&"``!Z%>!```@`)P'$%"[```@``!\/V"@NPT``'P?8+#?
+M`@```@`0@`(`(`!\'V"PWP(`<+L``"````(`$`/^'V"````@`?X?8!``K@D4
+M`,X)&`#N"1P`#@J0NP``(``@`"X*)`!."@2`[0L@@`\X*!!N"P`$05``?#]@
+MN+H"`+"[```@``:)8`@H@2`(`(/A5XX``"`!_E]@`'K@5X$'`"``?']@T+L`
+M`"``K-\"``"`(0@``^%7`04`(`"$`1``>N%78@@@"`(!`"#PNP``(``0_B!X
+M@```(!#^(&AB`H`0`?X?8(```"````!0`(`/.!"\```@``0^#A``-@X0`#AN
+M8RQ^CE,0&@X0%!P.$!@>#A`<(`X0,+P``"``("(.$"0D#A`H)@X0``"@80+^
+MWV$`^N97@38`(`":!F!0O```(```@`0HD(A&"'2(9@@M_C]@`'Q_8HK?`@``
+M@HD0(_X_8'"\```@``!\7V*,WP(```*)$`K^/V``?#]BCM\"``""B!`9_C]@
+MD+P``"```'P?8I#?`@```H@0`'S_8;BZ`@`\B2<(`(/A5PP!`""PO```(``$
+M_M]A@!8`(#Z))P@`@^%7#`$`(`/^WV$`%``@0(DG"-"\```@```#X%<,"``@
+M+7KA5PP!`"`$_M]A``\`("-ZX5<,`0`@\+P``"```_[?80`-`"`*>N%7"@$`
+M(``<QU$`"P`@&7KA5PH*`"`0O0``(``!_M]A``D`(`":!F``600HEHA&"$*)
+M)P@``^!7C`<`(#"]```@``"("0@``>%7B?3_)P`("0@``>%7"?7_)P"("`@`
+M`>%74+T``"``B_7_)P`("`@``>%7"_;_)P```%"4@(80DH"&$`!\'V!PO0``
+M(``LKP(```0`$`!\/V"<WP(``(``"``!YU>!#@`@`)P`$)"]```@``)ZYU<!
+M`0`@`'KG5X(%`"!BB`8(^W\`8&*`AA!JB"8(L+T``"``8(@&"``"`'!@@(80
+M!(`&"`!\`&#_[___``4`(&*(!@C0O0``(``$?@!H8H"&$&J()@A@B`8(``(`
+M:&"`AA`$@`8(`'P`:/"]```@```0```$@`80`?X?8(```"````!0$`"N"10`
+MS@D8`.X)$+X``"``'``."B``+@HD`$X**`!N"@2`[0L@@`\X+!!N"P0^#A`P
+MO@``(```-@X0`#AN8Q!^CE,`?']@>-\"``"`(0@`?%]@2-\"`%"^```@``("
+M(0``^N!7`@,`(`!\7V!`WP(````A"/__($```@$0<+X``"``@`(`(`!\7V!$
+MWP(````A"/__($```@$0`'Q_8'C?`@"0O@``(```@"$(`/Q`0$C?`@```$$0
+M`?X@0`""`1``?%]@N+H"`+"^```@``@!00@`A>!7`@$`(``$05``A`$0`'K@
+M5X$%`"``?#]@T+X``"``@-\"``"```@!?@!``(``$`!\7V!$WP(````A"`'^
+M`$#PO@``(`````$0@`0`(``$05``?#]@@-\"``"$`!``?%]@0-\"`!"_```@
+M````(0@!_@!````!$`!\7V!$WP(````A"`""`$```@!`,+\``"```WX`@``"
+M`$`"?@"``'Q?8+BZ`@`(`2$(`#CI+P!\/V!0OP``(`!\WP(``(``$`!\/V"$
+MK@(``(``$`2`[0L@@`\X$!!N"W"_```@``!\_V"XN@(``(EC"`"&H4``?-]@
+M&-\"``2,@@``?%]@D+\``"``(-\"```((0@`B"!0`)`@&`"`($```H$0`)`@
+M&`+^@(BPOP``(```$"(8`'Q?8"+?`@``"($0`(S"0```@Q`!_D%``!!A&-"_
+M```@``""@1D>?H:)``9&0`-^06``&$%0`(6#$`!\7V`\WP(`\+\``"`````!
+M$`!\'V`PKP(```(`$`"`#S@`@B!0#`!`"`!ZX5<0P```(``!!``@```@"`B`
+M0`@`!``0``1!4`B$`!`,`$`(_W]!0##````@``P$`!``@@!@`(`/.`P`8`@`
+M^N%7`0(`(`0`8`@(@@$04,```"``!`(`$``!`"`$`@`0``(`$`"&85`(A@`0
+M#`!@"`'^(4!PP```(``,`@`0(``!$`"`#S@,`$`(`'KA5P$3`"`!>N%7``!`
+M")#````@``(%`"``A>!7@A``(`"&85`$!@`0``8`$`P`0`C_?T%`L,```"``
+M#`0`$`B&`!"`#0`@`(7@5X(!`"`(@$`(``0`$``%`"#0P```(``(`&$(`/KA
+M5X$(`"``A^!7@@4`(`B`80@(!@$0`/KA5_#````@`((``"`$!``0`(9A4`B&
+M`!`,`$`(_W]!0`P$`!```P`@$,$``"```(9!8`B`80@`^N%7@O?_)P```%"`
+M```@`?X?8`"`#S@PP0``(``$/@X0`#8.$``X;F,<?HY3$!H.$!0<#A`8'@X0
+M``#`85#!```@``""H&$`!.%A@/3G+P)^)X``?)]@P+`"``"(H$`4@"((<,$`
+M`"```)I@0"2`0@@`A>%7C@,`(`#ZYU<!`@`@`!!!&`"0(!B0P0``(````J%1
+M@```(`":IE$`^N97`0X`(`"&85``?)]@P+`"`+#!```@``P`0@@`@B!0`)O@
+M5P8#`"`&'$$0``1A8`P`00@!_B!`T,$``"```)O@5P7]_R<`?)]@P+`"`!``
+M(@@`FB!0$`("$`)^)X#PP0``(```B*!`%(`B"`":($`4@@(0#`"B"0""(%`,
+M@@$0#`0"$!#"```@`(```"``FJ91`-_G+P":!F`0`*X)%`#."1@`[@D$@.T+
+M,,(``"``((`/.!P0;@L`@B!0`@*`$`@"`!`0`@`0!@)`$!3^/V!0P@``(```
+M`H`0]OX_0`0"@!``@`\X!#X.$``V#A``.&YC$'Z.4W#"```@````8&``@H!@
+M````4````1``^N%7@00`(`"&`6``]?\OD,(``"`````!"`%^`$````$0``8"
+M$`R`80@`^N%7@OO_)P2`[0NPP@``(``@@`\X$!!N"P0^#A``-@X0`#AN8Q!^
+MCE,```!0#_X_8-#"```@``?^7V`"_G]@@`$`*`2`[0L@@`\X$!!N"P0^#A``
+M-@X0\,(``"```#AN8Q!^CE,``*!@``(!0``&P$``?)]@P+`"`#0``@@0PP``
+M(```>N!7@@$`(`!\'V``(`(`-``"$`!\GV#`L`(`!``""###```@``!ZX%>"
+M`P`@"``""`!ZX%<"`@`@!`H"$``*`T`(``(04,,``"``@`$`(`!\GV#`L`(`
+M!`H"$`!\GV#`L`(`*``""``"`$!PPP``(``H``(0+``""``$`$`L``(0,``"
+M"``&`$`P``(0```"")##```@```,`$````(0$``""``,`$`0``(0`(I"8``*
+M`T```>%7L,,``"``!@H`(`E^88``?)]@P+`"`#0``@@`!@!`@,W_+S0``@C0
+MPP``(```!@!`!P1`$#0``@@,`"((``8`0`P"`!`T``((``8`0/##```@``P`
+M`A`!?D%```H#0``!X5<%]O\G!(#M"R"`#S@0$&X+$,0``"``!#X.$``V#A``
+M.&YC$'Z.4QC^'V`'_C]@"/Y?8`7^?V`PQ```(`"`UO\O!(#M"R"`#S@0$&X+
+M!#X.$``V#A``.&YC('Z.4U#$```@`!`:#A`4'`X0``#`80```%#X@0T0!@2G
+M"0!]YU<`(`(`<,0``"``!@4`(`"^#V``?`!@____``)^((``?!]@O+$"```#
+M`!"0Q```(``$_A]@5_X_8(#_)"CX_RU`_/]-0``<!V"`MO\O`(KG+[#$```@
+M``!\7V#`L`(`#`!A"/B!+0@,A@`0#!P!$/R!;0@0`"$(T,0``"```(8@0!`"
+M`1`"_B:``(1`0!0`(0@`AB!0%`(!$("$YR_PQ```(``!^N97`@$`((#B\R^`
+M```@`,;O+Q``K@D4`,X)!(#M"Q#%```@`""`#S@@$&X+!#X.$``V#A``.&YC
+M$'Z.4P'^/V``?!]@,,4``"``D-8"```"0!``?!]@J]D"```"0!`$_A]@`-PE
+M*`C^'V!0Q0``(```?#]@```$```9""@`?#]@^+("`$B!``@!?@!`2($`$'#%
+M```@``2`[0L@@`\X$!!N"P0^#A``-@X0`#AN8Q1^CE,0&@X0D,4``"````"@
+M80#ZX%<!%``@`&\3*`!\/V#\N0(``($@"`R``!"PQ0``(``"A`8(`X2&"0A^
+MAH$`&`!H$("`$`2$!@@%A(8)"'Z&@=#%```@```8`&@&A(8)$'Z&@0`8`&@'
+MA(8)&'Z&@0`8`&@`@``0\,4``"``"(0&"`F$A@D(?H:!`!@`:`J$A@D0?H:!
+M`!@`:`N$A@D0Q@``(``8?H:!`!@`:`2``!`.A`8($'Y`@`V$!@@(?@"```1`
+M0##&```@``R$!@@`!`!`"(``$`!\/V#\N0(`!/\`0(!Q#2@```!04,8``"``
+M$`"N"02`[0L@@`\X%!!N"P0^#A``-@X0`#AN8Q1^CE-PQ@``(``0&@X0``1!
+M4`!\'V!(P0(```1`$`!\'V"0P0(```1`$)#&```@``":IE$"_B:``'P?8(3!
+M`@``@````'K@5P$$`"`"_B:`L,8``"```'P?8(3!`@``@```!`@@"`#ZX%>!
+M_/\G@*[_+P+^)H#0Q@``(```!$%0`/P`0(3!`@``!``0`?X&0``.H!D"^N97
+MB_3_)_#&```@`!``K@D$@.T+((`/.!00;@L$/@X0`#8.$``X;F,\?HY3$,<`
+M`"``$!H.$!0<#A`8'@X0'"`.$"`B#A`D)`X0*"8.$```X&$PQP``(```@@!B
+M``0A8@`<QU'P_TU`]/\M0`!\?V),P0(`%(`)"%#'```@`````1`__A]@`(``
+M$``D25+P@0T(``'G5P8Y`"#\_TU"<,<``"``^/^M00`QYR\`?']B3,$"`!"`
+M*0@`G"!`/_Y@8`!\/V"0QP``(`",O0(`+(!`"`/^(8``A&!``(0@```""1`$
+M@"$(`((&$+#'```@```LYR\`)$E2_H6M"?R%#0@%>N!7@2H`(/R!#0CX@2T(
+MT,<``"```"!(8`"B:&``@@<X```@8`#ZX%>!)@`@`'KG5P$"`"#PQP``(```
+M'`=@@('K+P``0&*`%P`@`(*@80`?YR\4@"D(`(/F5Q#(```@`(X``"``@J!A
+M`'P_8(R]`@`H_L!``'Q_8DS!`@`,_JE`,,@``"````1!4`#ZYE>.!0`@!(`B
+M"`"$($`__B!@!/Z`@```8PA0R```(```@B!0`(B!0``"`A`!?D%``(7F5XWZ
+M_R<(@"((`)H@4'#(```@``B"`A`$@"((`)H@0#_^(&`$@@(0@!'G+P`D25(`
+M>NE7D,@``"```A0`(`":IE'P_TU`]/\M0`!\?V),P0(`%(`)"````1"PR```
+M(``__A]@`(``$``D25+\A0T(`GK@5X(%`"#X@0T($`!`"-#(```@``7^/V!\
+M`@$0`'P_8+R]`@`H@2`(`/K@5P$!`"``@@`X\,@``"````!`8OB!30@`>N%7
+M@0,`(/R%#0@!>N!7`@(`(````%`0R0``(```@B!0``(!.```0&(`G,9!\($-
+M"``!YU<&`0`@`'KI5S#)```@``''_R<`)`E@$`"N"10`S@D8`.X)'``."B``
+M+@HD`$X*4,D``"``*`!N"@2`[0L@@`\X/!!N"P0^#A``-@X0`#AN8T!^CE-P
+MR0``(``0&@X0%!P.$!@>#A`<(`X0("(.$"0D#A`H)@X0`)JF49#)```@`/S_
+M+4``?']@3,$"``2`00CL_XU``'P?8$R]`@`(```(L,D``"``````"````A``
+M?!]@C+T"````@`CL@0T(``@`4`1^`(C0R0``(```!>!7A0$`(``$`%``@``0
+M``$`($!^`$"`_?\G"(!!"/#)```@``"```@`!>!7#@$`(````%``@``0_($-
+M"`!ZX%<!+``@$,H``"``^/\M0O3_;4+P_TU"`'P?8HR]`@``?/]A3,$"``#:
+MYB\PR@``(````,!A!(`'"`-^((`$``@(``)`0``"````@`D0!``!"%#*```@
+M````"1``^NA7@00`(`2`!P@$?B"````("``"`$``HBA@<,H``"```%KH+P``
+MX&$`^N=7@@T`(`!\OV",O0(``'R?8$S!`@"0R@``(```@B!0!``""``"`$`_
+M?@!@!'Y@@`"`0@@```!0``9A0+#*```@``"``1`!_B!``?K@5X7Z_R<(``((
+M`7X`4`@``A`$``((T,H``"```7X`0#]^`&`$``(0`!P'8`#&YB\```!0``,`
+M(``<!V#PR@``(```Q.8O'OX?8`">)V``!$%0@%8<*`!ZX%<""P`@`'P_8!#+
+M```@`.2V`@``@0`(`'K@5X(!`"!0_A]@F/X_8(`M)"@`?#]@,,L``"``Y+8"
+M``"!``C_?P!``($`$/2!K0D`^N97@00`(````%!0RP``(``(@`80#(`&$/B!
+M#0@"@(80@`$`(%#^'V"M_C]@`"4D*'#+```@``":!F`0`*X)%`#."1@`[@D<
+M``X*(``N"B0`3@HH`&X*D,L``"``!(#M"R"`#SA`$&X+!#X.$``V#A``.&YC
+M)'Z.4Q`:#A"PRP``(``4'`X0&!X.$!P@#A`@(@X0`((@4`("@!`(`@`0$`(`
+M$-#+```@`!3^/V```H`0]OX_0`0"@!`4?@!"``"@80!\/V*,O0(`\,L``"``
+M`*+H80!\WV%,P0(``*#F+P@`)P@_^N!7!0,`(("@YB\0S```(``L_A]@!/X_
+M8``$05``,QPH``X`(```)P@$_J"``("'"##,```@```*0D`,@"@(`/Q@:.P!
+M```$`"$(`(8@>`"@('@,`@$04,P``"``""`!$``*HD``A@(0```G"`/^0(`$
+M@"<(`(1`0``:`1!PS```(``(`"<(`?X@0`@"!Q```"<(`?X@0#_^(&```@<0
+M@)#F+Y#,```@`````%``>N!7@@8`(`!\/V#DM@(``($`"`%^`$``@0`0L,P`
+M`"```'P_8$R]`@`,@``(`'Q`:``"```$@``(``0`%(`!`"#0S```(`!0_A]@
+M??X_8(#W(R@0`*X)%`#."1@`[@D<``X*(``N"O#,```@``2`[0L@@`\X)!!N
+M"P0^#A``-@X0`#AN8Q!^CE,`?!]@$,T``"``Y+8"```!``@$>N!7A@``((`!
+M`"@$@.T+((`/.!`0;@LPS0``(``$/@X0`#8.$``X;F,4?HY3$!H.$`!\?V#D
+MM@(``($A"%#-```@`!""'U`,@4$(``0@4`'^'V`!_E]@`'G^+P!ZX%>!$``@
+M<,T``"```'K@5X$/`"``?']@Y+8"``R!00@`@2$(`(7@5P4(`""0S0``(``,
+M`*`)`((@4`P"`!`(@2$(`/K@5P$!`"`,@``0@```(+#-```@``2!`1``?']@
+MY+8"``B!`1`,@4$(`7X!0`R!`1``F@9@T,T``"```'K@5X$#`"`,`*`)`((@
+M4`P"`!"`MO\O`)H&8`!ZX%?PS0``(`""[_\G`'Q_8.2V`@``@2$(`?X`0`R!
+M00@``>%7C@4`(!#.```@```'`"@`>N!7`00`(("O_R\`?']@Y+8"``"!(0@!
+M_@!`,,X``"``#(%!"``!X5>-^O\G$`"N"02`[0L@@`\X%!!N"P0^#A!0S@``
+M(```-@X0`#AN8Q!^CE,!_A]@`?X_8`'^7V"`6/XO`'K@5W#.```@``()`"``
+M?%]@Y+8"``0!(0@`^N!7@08`(`""`&`,`"`(D,X``"``!`,!$`"&85`,!@`0
+M`/K@5X(``"`(!P$0`'Q?8.2V`@"PS@``(``,`2$(__\@0`P#`1`$@.T+((`/
+M.!`0;@L$/@X0`#8.$-#.```@```X;F,<?HY3$!H.$!0<#A`8'@X0``#`80!Z
+MYU<!`0`@\,X``"``````4```1Q``?%]@J-X"```(`0@`>N!7@A<`(`!*_R\0
+MSP``(````*!A`/KF5P%\`"`4_B9``'P?8*S>`@```@`0%(0&"##/```@``EZ
+MX%<!`P`@`'KG5P$!`"`!_A]@``!'$`":!F``=@`@4,\``"``&H@&"`E^`$``
+M$&`8'(0&"`Q^`&``>N!7@@0`(!R$!@APSP``(`#\?@!@``[@&8#ZYU<!`0`@
+M4/KG5P(!`"`(_@%``!!@&)#/```@``!\/V"DW@(``)H`$`":!F``?%]@H-X"
+M`````1`"B"8(L,\``"```(/A5PP"`"``@@%0`'Q?8*C>`@```($0`'Q?8*C>
+M`@#0SP``(```"`$(`'K@5P$,`"``,/\O``"@80#ZYE<!8@`@`'P_8/#/```@
+M`*3>`@``@``(#!H`$`":`!``?%]@J-X"```(`0@"B"8($-```"````/@5PP#
+M`"```@!0``"!$``0`!@`>N!7`O;_)X`!`"`PT```(``"@(80````4```@1"`
+MP?\O``"@80#ZYE<!!``@`'Q?8%#0```@`*#>`@```"$(#((&$``:`1"`%A(H
+M2(`&$(!!`"!8_A]@<-```"```'P_8+T"``"`@R,H`#\`(`B$``C\?@!@``[@
+M&8#ZYU>0T```(``!`0`@4/KG5X(#`"``?!]@K-X"````(`@&B``(`'W@5[#0
+M```@`-H!```),P`@`'Q_8)C>`@``@`$(`'K@5P!\7V"@W@(`T-```"`````A
+M"($"`"``?!]@G-X"``````@(`@`0``(`(`""`1#PT```(```?!]@>+<"`(`;
+M#"@`?%]@H-X"````(0@`?!]@G-X"`!#1```@```"`!"`^N=7`0$`(%#ZYU>"
+M-@`@`'Q?8*#>`@````$(,-$``"```)XG8(`=[2^`,P`@`'Q_8)#>`@``@`$(
+M`'K@5P!\7V!0T0``(`"@W@(````A"($"`"``?!]@E-X"``````@(`@`0``(`
+M('#1```@``""`1``?!]@>+<"```+#"@`?%]@H-X"````(0@`?!]@D-$``"``
+ME-X"```"`!"`)P`@"(0`"/Q^`&``#N`9Y/KG5P$!`""PT0``(`#T^N=7@@,`
+M(`!\'V"TW@(`````"`!ZX%>!$``@``(`.-#1```@`(`/`""D^N=7`@P`(`!\
+M?V"8W@(``(`!"`!ZX%<`?%]@\-$``"``H-X"````(0B!`@`@`'P?8)S>`@``
+M```("`(`$``"`"`0T@``(```@@$0`'P?8'BW`@``]PLH`'Q?8*#>`@```"$(
+M`'P?8##2```@`)S>`@```@`0@!,`(%C^'V``?#]@,`,``(!)(R@`$0`@4-(`
+M`"```'Q?8*#>`@````$(`#S^+X`.`"!8_A]@`'P_8#@#``!PT@``(`"`1",H
+M``P`(`!\'V"LW@(````@"`B$``@,?@!@#'K@5Y#2```@``WZ_R<"?H"!`'R&
+M`:32``````8X(#0``)DT``"9-```L-(``"``F30``&<T``"9-```F30``)DT
+M``!/-```F30``)DT``#0T@``(`"9-```E#0``````%``?%]@H-X"`````1``
+M0O\O`'KG5_#2```@``$!`"`!_A]@``!'$````%`0`*X)%`#."1@`[@D$@.T+
+M$-,``"``((`/.!P0;@L$/@X0`#8.$``X;F,0?HY3`'P_8+'9`@`PTP``(```
+MA"`(`/K@5X$0`"``?%]@=+,"`,@%(0@`^N!7`0X`(%#3```@`-`)80@$""`(
+M`(/A5P(%`"#."6$(`@@@"`"#X5<"`P`@<-,``"``S`DA"``(``@`@>!7`@$`
+M(`'^'V"````@````4`!ZX%>0TP``(`"!!0`@`*WE+P!\/V"QV0(``(0@"`#Z
+MX%<!`@`@`OY?8+#3```@``!\/V"PV0(``(1`%("JY2\$@.T+((`/.!`0;@L$
+M/@X0T-,``"```#8.$``X;F,D?HY3$!H.$!0<#A`8'@X0'"`.$"`B#A#PTP``
+M(````*!A`(+`81"`Y@D`>N=7`00`(`!\/V"8N0(`&($`"!#4```@``!ZX%>!
+M`0`@\OX?8$>`1Q``0P`@-80'"`)^`&``>N!7,-0``"```@(`((K^'V``?#]@
+M+@4``(`*(RA0A`<(`'K@5P(!`"!0U```(```F@9@@(/S+P!\'V`YW@(```0`
+M"`!ZX%=<A`<(_'X`8'#4```@``$&`""`>N!7`@$`(!_^'V"``0`@`'P?8)S<
+M`@``"``(D-0``"``5H"'$`!\'V"<W`(``@@`"``&`""`>N!7`'P_8)BY`@"P
+MU```(``"`0`@2(D`"(```"!*B0`(`'P_8)BY`@!&@8`05H"'$-#4```@`$Z)
+M``A$@(<0-H0'"%6`1Q``@B!028)'$(3^'V!'@$<0\-0``"```?X?8``S^2^`
+M@.4O````8@!\/V"8N0(`$($`"`!ZX%<0U0``(``"`0`@$)L`$``.`"``>N=7
+M`0P`(`B`!A`0FP`07(0'"##5```@`/Q^`&"`>N!7@@H`(`":!F``FB9B"```
+M"!``(`A<A"`(4-4``"``_/X@8%#ZX%>"`@`@"``@"`B""!``V_TO`*((8(``
+M`"!PU0``(````"!B"``@"`#ZX%>"^/\G@`$`(!2!``@(&@`0%)L`$)#5```@
+M``!ZYU>!`0`@`'P_8)BY`@`8FP`0`((@4`!\'V`6WP(`L-4``"````)`$`!\
+M/V"8N0(`"(D`"`)ZX%>*```@@*CP+P`@"&#0U0``(```:.4O`'KG5X$)`"``
+M?#]@F+D"`!S_H$$`F@9@9/X_8/#5```@``!3"R@`>N!7@@(`($>$!P@">N!7
+M`?X?8`(``%``!@`@$-8``"```_X?8(``\2\`F@9@__\_8`!-"RB``@`@1X0'
+M"(!ZX%<PU@``(``"`0`@`?X?8(```"````!0$`"N"10`S@D8`.X)'``."E#6
+M```@`"``+@H$@.T+((`/."00;@L$/@X0`#8.$``X;F,@?HY3<-8``"``$!H.
+M$!0<#A`8'@X0'"`.$````&(`@N!A`'P?8-#7`@"0U@``(``````(`'K@5X$!
+M`"`8!``(`'K@5P(!`"`!_A]@@#$`(+#6```@``!\'V"SV0(```0`"!1ZX%<!
+M`0`@`7K@5X(#`"`#_A]@T-8``"```?X_8``$05"`2OTO``"@80#ZYE<"`0`@
+M````4(`I`"#PU@``(```B`8(`!K`01"<!A!<?D=``((@4!0"AQ`6`H<00`)'
+M$!#7```@``'^?V!#!D<0-AY'$`!\'V#*V0(```0`"$@`1Q!.`H<0,-<``"``
+M`OX?8#4`1Q!*`D<04`)'$%$"1Q!2!D<04P)'$%0"1Q!0UP``(``8_A]@>@"'
+M$!P"AQ!(_A]@7`!'$`!ZZ%>!`0`@$/X?8'#7```@`%T`1Q"````@70)'$`$$
+M`0@!?@!H`0!!$`!\'V#0UP(`D-<``"``````"``((`@$`H$0`@@@"`8"@1`$
+M""`("`*!$``((`BPUP``(``0`H$0`@@@"!("@1`$"``(%`"!$`!\/V#8M@(`
+M`(@`"-#7```@``H`@1`"B``(#`"!$`2(``@.`($0`)H&8`'^/V"`>_\O\-<`
+M`"```'K@5P$$`"``F@9@`(C]+P!\/V`TK0(``(``"`%^`$`0V```(```@``0
+M`-+_)T<$!P@)>N!7`)H&8((!`""`@OTO`OX?8##8```@```!`"``@?TO@-7_
+M)Q``K@D4`,X)&`#N"1P`#@H$@.T+4-@``"``((`/."`0;@L$/@X0`#8.$``X
+M;F,@?HY3$!H.$!0<#A!PV```(``8'@X0'"`.$```X&$`@L!A``2A80"&`6("
+M_B>``/P`0)#8```@``S"`@`('0`0`!L`$`">!V``("A@@#[I+P!ZZ%>!```@
+ML-@``"```!RG80+^)X``_`!`@+<"``@;`!`0`*X)%`#."1@`[@G0V```(``<
+M``X*!(#M"R"`#S@@$&X+`'P?8"C=`@``!``(`'K@5_#8```@``$"`"``?!]@
+M+-T"````(`B``0`@`'P?8'S!`@```"`($-D``"```'P?8-3<`@```@`0`'P?
+M8-3<`@```"`(`'P?8`RO`@`PV0``(````@`0`'P?8##=`@``!``(`'K@5P$"
+M`"``?!]@--T"`%#9```@````(`B``0`@`'P?8."L`@```"`(`'P?8+39`@``
+M`@`0<-D``"```'P?8+39`@```"`(`'P?8!"O`@```@`0`'P?8-3<`@"0V0``
+M(````(`(``1!4`""(%`!@A^```@`8`!ZX%<!`P`@`?Y@0+#9```@``!\`4#8
+MW`(```9`$`%^`4``#D`8`?X@0`[ZX%>%^?\GT-D``"```((@4`!\`4#8W`(`
+M``)`$`"`#S@$/@X0`#8.$``X;F/PV0``(``8?HY3$!H.$!0<#A```*!A`'S?
+M88"W`@```0<(`('F5Q#:```@``$&`"``?!]@F,D"```(``@``"!``(`@0`+^
+M((`"_@:`,-H``"````(`0``<`$`<`0`(``(`.``;!Q`0`*X)%`#."02`[0M0
+MV@``(``@@`\X&!!N"P0^#A``-@X0`#AN8Q!^CE,`?!]@E+$"`'#:```@`(#L
+M"B@$@.T+((`/.!`0;@L$/@X0`#8.$``X;F,8?HY3D-H``"``$!H.$!0<#A``
+M`,!A`(*@80"*!2@`^N97@0(`(````%"PV@``(```2O@O`'P_8)3!`@``@``0
+M`'KG5X$G`"``?!]@H-P"`-#:```@```$``@`>N!7`0D`(`!\'V"AW`(```0`
+M"`!ZX%>"!@`@\-H``"```'P?8"_>`@``!``(`'K@5P($`"``?!]@U+4"````
+M``@0VP``(`#_>^!7`'P?8-C<`@""(0`@@"D`(`'^/V``?!]@+]X"`##;```@
+M```"0!``!$%0`'R?8+C?`@```&((`(0!"`!\(4##WP(`4-L``"```(!`$`'^
+M(4```@(0`'K@5P(+`"``>N%7@@<`(`!M!2APVP``(```FJ91`'P?8+C9`@``
+M&D`0`'P?8"_>`@``&D`0`?X?8)#;```@```N^"\@_A]@`/OL+P!8_2\`F@9@
+M`"$`(`":IE$`?!]@L-L``"``+]X"```:0!```@`@`7X!0``.0!@(>N%7B^W_
+M)PAZX5?0VP``(``"`@`@`)JF40!\(4##WP(``)I`$`!\'V#4M0(`````"/#;
+M```@`/][X%<`?!]@P]\"``(0`""`"@`@`)JF40!\'V`OW@(`$-P``"```!I`
+M$`!\'V"@W`(```0`"`!ZX%>!`@`@`-O_)P!9$B@PW```(```?!]@<+P"`(`&
+M`"``?!]@U+4"``````C_>^!7`'P?8%#<```@`-C<`@`"!0`@`'P_8##>`@``
+M@$`(;OX_8`"&85``!``@<-P``"``!?X_8!3^7V`"_G]@``(`((!.$B@`?!]@
+M<+P"``#Y_R>0W```(``!_I]@`)+T+P!\/V"@K@(``(``"`%^`$``@``0`?X?
+M8+#<```@`!``K@D4`,X)!(#M"R"`#S@8$&X+!#X.$``V#A``.&YCT-P``"``
+M%'Z.4Q`:#A``?+]A]*X"``"(!@@`51<H`'P_8/BN`@#PW```(```@(`0`(@&
+M"(!G%R@`?#]@BMP"``"`@!``B`8(`'P_8!#=```@`/:N`@``B"`(`*/L+P!\
+M/V`HL`(``?X?8(`\]2\`?!]@,-T``"``9MP"`("K]2^`=/\O````4`!\OV&@
+MRP(``("&$`!\'V!0W0``(`",W`(`````"`!ZX%<"`0`@(/X?8`"`AA``?!]@
+MD-P"`'#=```@``````@(?@!@`'K@5X$"`"``?+]AH,L"``"(!@@0?@!HD-T`
+M`"```("&$`!\/V"@NPT``'P?8'2V`@`,`P`0`'R_8:#+`@"PW0``(```B`8(
+M`7X`:`"`AA``?!]@E-L"``"*]2\`B`8(@#3U+]#=```@``!\'V#<KP(`@/7T
+M+P!\'V#0K@(`````"(`^]2\`?!]@\-T``"``D-P"``````@(?@!@`'K@5X("
+M`"``?!]@`*\"``````@0W@``(``!>N!7@@T`(`/^OV$`7.0O`'P_8)3<`@``
+MA"`(`/K@5S#>```@`(("`"``?%]@?+8"```$(0@!_B!```)!$`!9Y"\`C@88
+M4-X``"```((@4`":]2\`^N97__^F00+W_R<`O!TH`'P_8-RO`@!PW@``(``$
+MA"`(`(`@:`!\'V"8W`(```(`$`!\'V#<K`(`````")#>```@``1^`&``>N!7
+M`@4`(`!\/V`$N@(``'P?8!2Z`@```@`0L-X``"```'P_8`BZ`@``?!]@&+H"
+M```"`!`!_A]@`'P_8)3<`@#0W@``(```@$`0$`"N"02`[0L@@`\X%!!N"P0^
+M#A``-@X0`#AN8_#>```@`!!^CE,`1!`H`'Q?8)"N`@```($(``AB8`#ZX5>!
+M&0`@$-\``"``!(`A"`#ZX%<!&``@`'P_8(BN`@``@"`(`(/A5P$2`"`PWP``
+M(`!D@"$(``/@5PX!`"```B!0@```(`"`(%``?%]@=+8"`%#?```@``P!00@%
+M?D&``(7@5PX,`"``?%]@D*X"````(0@`@^%7<-\``"```(`A"`(!`"```@$0
+M@```(``"`A``?%]@=+8"``@!(0B0WP``(```@@$0"`<!$`""(%`$@@$0`'Q?
+M8#2O`@```"$(__\@0+#?```@```"`1``?%]@C*X"```"`1``AH%@`(!A"`#Z
+MX5>!`0`@T-\``"``!(`A"`#ZX%<"Z/\G!(#M"R"`#S@0$&X+!#X.$``V#A#P
+MWP``(```.&YC&'Z.4Q`:#A`4'`X0``"@89*(Q@F4B"8(`'KG5Q#@```@``$$
+M`"``@@!```(`0`-^`(```@!``GX`@``<)V``@>4O,.```"``@```(````%"6
+M@(80`!P'8!``K@D4`,X)!(#M"R"`#SA0X```(``8$&X+!#X.$``V#A``.&YC
+M''Z.4Q`:#A`4'`X0&!X.$'#@```@````H&&*B,8)@!#D+P`<)T``@B9`=HC@
+M"8"(P`F`$.0OD.```"``C(@&"``>`$``$.`9CH@&"``<`$``$,`9`/KG5P$$
+M`""PX```(```'`=``!P`0`-^`(``'`!``GX`@`">)V"`;>4O@```(-#@```@
+M`````%"0@(80`)X'8!``K@D4`,X)&`#N"02`[0L@@`\X\.```"``'!!N"P"&
+M85``?!]@H-P"```&0!`!_C]@`'P?8*'<`@`0X0``(````D`0`'P?8*3<`@`"
+M!D`0`P9`$`0&0!``?!]@C=L"`##A```@```&0!``?!]@C-L"```&0!``@B!0
+M`()`0``"04``AF%04.$``"```'P!0*3<`@`%!D`0!@9`$`<&0!`!_@!```X@
+M&`?ZX%=PX0``(``+^O\G`(`/.`0^#A``-@X0`#AN8Q1^CE,0&@X0``"@89#A
+M```@``"&85!TAH80EH:&$)*&AA"4AH80D(:&$(#JXR\`@B!0L.$``"```()`
+M0`"&85``A$9`@`:!$'8&@1`!_B!`!?K@5PO\_R?0X0``(```Z.,O$`"N"02`
+M[0L@@`\X%!!N"P0^#A``-@X0`#AN8_#A```@`"!^CE,0&@X0%!P.$!@>#A`<
+M(`X0````8@!\/V!TM@(`$.(``"``"(&@"0#ZYE>!"``@`(`&"`B!`!``?#]@
+M-*\"``"`X`DPX@``(```^N=7`@(`(``<QU$`?#]@D*X"``"<`!``?#]@D*X"
+M`%#B```@``"```@`@`80`)H`$``'`"``?!]@B*X"``````B`_QTH<.(``"``
+M``"@80#ZYE<"`0`@````4(`K`"``?#]@-*\"``"`X`F0X@``(`#__P=``(``
+M$`!\/V`TKP(``(#@"0'^YT$`G@`0$`!("+#B```@```<QU&DG(80````4**`
+MAA"@@(80`?X?8+"`AA"DB`8(T.(``"``````0",$(0@`@`9`I@*`$*2(!@@!
+M?@!`I("&$",$(0CPX@``(`"BB`8(`(``0**`AA``$``8L(@F"``FY2^@@(80
+M`'P?8!#C```@`(RN`@``'@`0`?X?8`2`!A!>G(80()Q&$!6<1A`.G$80,.,`
+M`"``6)R&$%J<AA!<G(805IQ&$`""(%``',=1`((&0#0<0!!0XP``(``!_B!`
+M(/K@5PO]_R=HG(80BIR&$&"<AA`?_A]@M("&$'#C```@``!\'V#_`P``MH"&
+M$`":!F``("A@`*@!*`2`!@CP?@!@D.,``"```'K@5P$"`"``F@9@@)H`*``<
+M!V``!P`@`'P?8%#9`@"PXP``(```""`(:(@&"`"``&``$,`9`!P'8`".%BAN
+M@(80`!P'8-#C```@`(!W%BAL@(80:H"&$`":!F`0`*X)%`#."1@`[@D<``X*
+M\.,``"``!(#M"R"`#S@@$&X+`'P_8)"N`@``@"`(`/K@5X$(`"`0Y```(```
+M"&`("(A`"`"%X5<"!0`@`@A@"`J(0`@`A>%7`@,`(##D```@``0(8`@,B$`(
+M`(7A5P(!`"``@@!@``(`(`"`(`@`^N!74.0``"``@O?_)P```%``@`\X`'P?
+M8(BN`@`````(`(`/.`0^#A!PY```(```-@X0`#AN8Q!^CE,`BJ)0`'P?8)"N
+M`@``"@`0`'R?8)#D```@`-S+`@``?!]@=+8"``@)`!``?!]@U=<"```*0!``
+M?!]@L.0``"``-*\"```*`!``?!]@D-8"```$``@`>N!7`((@4($1`"#0Y```
+M(```@@!```(`0`-^`(```@!0`WX`@+A^0$``?)]@W,L"`/#D```@```(04``
+M"&!```B`00`$!A``BJ)0%8I!$""*01`!_B!`$.4``"``"_K@5POW_R<`@@!`
+M``(`0`-^`(```@!0`WX`@``(@$`PY0``(```"@(0`((@4`3^0(``BJ)0`'P!
+M0/37`@`("@`0`?X@0%#E```@`!3ZX%<+_/\G``L`(`""`$```@!``WX`@``"
+M`%`#?@"`<.4``"``N'Y`0`!\GV#<RP(```A!0``(@$$`!`80`?X@0`OZX%>0
+MY0``(``+^?\G`((`0``"`$`#?@"```(`4`-^`(``BJ)0``B`0+#E```@```*
+M`A``?!]@D-8"```$``@`>N!7@@``(`#IY2\$@.T+T.4``"``((`/.!`0;@L$
+M/@X0`#8.$``X;F,0?HY3`'K@5X$%`"#PY0``(``(^N!7!``@"(("`"``_"!H
+M```>``0"`!``9!$H@`$`(!#F```@``#\(&@`$```!`(`$````%`$@.T+((`/
+M.!`0;@L$/@X0,.8``"```#8.$``X;F,<?HY3$!H.$!0<#A`8'@X0``"@80""
+MX&%0Y@``(```^N97`2T`(%Z()@@`?!]@K*X"```"`!``?-]AB*X"`'#F```@
+M````!P@`FB9@`!@-*`+^)X``?%]@L*X"``"$```!?@!`D.8``"```(1`0```
+M`1`$@`8(`GX`:`2`!A!HB`8(``X@&`!\'V"PY@``(`#TK@(```@`"``"`&``
+M#@`8`'P_8%#9`@``B"`(`(X@&-#F```@``"``&``#@`88(@F"`".(!@`@`!X
+M``X`&`!ZX%>!`@`@\.8``"``H(@F"!+ZX%<+`0`@`!(6*(```"!NB`8(:H"&
+M$&J(!@@0YP``(```F@8H:(@&"(`.%B@`?#]@^JX"``"`@!``F@9@`$G_+S#G
+M```@`!:()@@`?!]@X*X"```"`!`.A"8(`'P?8.BN`@```@`04.<``"``$H@F
+M"`!\'V#PK@(```*`$`!\WV&(K@(````G"`#ZX%=PYP``(``!!@`@$/X?8`!_
+MZR\`!$%0```G"""$0!`$@``(_7\`8)#G```@``!\`&#_[___!(``$&"$@!``
+M`0`@!/X?8`!YZR\`?-]AL.<``"``B*X"```:!Q``F@9@@"8%*!``K@D4`,X)
+M&`#N"02`[0O0YP``(``@@`\X'!!N"P0^#A``-@X0`#AN8Q1^CE,0&@X0`'R_
+M8/#G```@`-77`@``A`((`'K@5P$#`"``?+]AB*X"``"`!@B`#``H$.@``"``
+M`((@4`""0A``?+]AB*X"``"`!@@`@B!0`.(,*`""(%`PZ```(```@$8((`)!
+M$`0``0C]?P!@!``!$`""!A``?!]@\*X"`%#H```@```"@!`(_A]@`&/K+P``
+M`%``$@4H$`"N"02`[0L@@`\X<.@``"``%!!N"P!\?V"0K@(``(!!"``$(6``
+M^N!7`1$`(``#X%>0Z```(``"#@`@`'R?8#2O`@```&((__\!0````A``?']@
+MD*X"`+#H```@``"``0@`@>!7`(``"`(!`"``@`$0@```(````1````!0T.@`
+M`"``!(``$`!\7V!TM@(`"`$!"`"``!`(`P$0`'R?8#2O`@#PZ```(````&((
+M`'P?8(RN`@``!@`0``(`(`""0&``@"`(`/K@5Q#I```@``+O_R<`@`\X!#X.
+M$``V#A``.&YC('Z.4Q`:#A`4'`X0,.D``"``&!X.$!P@#A```,!A`)JF40`@
+M"%*`L_XO`'P?8,#<`@!0Z0``(``````(`'K@5P$&`"``?!]@&+`"`(!2_R\`
+M`*!A`/KF5W#I```@`($P`"``F@9@``;J+P!ZX%>"+@`@`)JF48`M`"``?!]@
+MD.D``"``Q-P"``````@`>N!7`0H`(`!\'V`@L`(``$K_+P``H&&PZ0``(```
+M^N97`0<`(`!\_V&(K@(``(!'"`"%YE<"`@`@`GKG5]#I```@`($#`"``FJ91
+M``(`(`":!F``^>DO`'K@5X$``"`!_A]B\.D``"```'KH5P(@`"`!>N=7@0L`
+M(``8`"``?/]AB*X"``"`1P@0Z@``(`!J""$(`!P'8`!\7V``$```@&@>*```
+MH&$`^N97`AD`(##J```@``"`1PAJ""$(;@@!"`"!X%>"%@`@`!P'8`""(%``
+M!$%04.H``"``@&(>*```H&$`"@`@`'S_88BN`@``@$<(6`AA"`!\/V!PZ@``
+M(`!TM@(`&(D`"`"!X5<,#P`@:@@A"``<!V``?%]@`!```)#J```@`(!:'B@`
+M`*!A@`L`(`!\_V&(K@(``(!'"(#Z_R<`?#]@L.H``"``=+8"`"B!``@!?@!`
+M*($`$(`&`"`#>N=7`>?_)P1ZYU?0Z@``(``!^?\G`!P'8`""(%``?%]@`!``
+M``!0'B@``*!A`/KF5_#J```@``+W_R>`Z?\G`/KF5X$0`"``?%]@B=P"```$
+M`0@`>N!7$.L``"```@X`(``$05!6A`8(``'A5PH%`"``A`9`-`0`"`!\(4`P
+MZP``(``HL`(``(!`$`%^`4``#D`85H0&"``!X5<+^_\G````4%#K```@``!\
+M/V`HL`(``(1`0```01!6A`8(`'Q?8(G<`@```$$0<.L``"```'Q?8$2O`@`T
+M`($0`?X?8(!Q\R\`F@9@$`"N"10`S@F0ZP``(``8`.X)'``."@2`[0L@@`\X
+M(!!N"P0^#A``-@X0`#AN8[#K```@`!1^CE,0&@X0``"@80!\OV!TM@(`((D"
+M"`/^/V``#>0OT.L``"```!!@&`!\'V"BW`(``!J`$`!\GV"0K@(```!""``$
+M(6#PZP``(```^N!7`1<`(*"(``@`@>%7B@,`(%Z(``@`!@!07H"`$!#L```@
+M`*"(``@`!@!0H("`$``0`"``?!]@B*X"``````@`@>!7,.P``"``@0T`(`!\
+MGV"0K@(````""`"!X%<`@``(`@$`(````A!0[```(`"````@```!$```@0@`
+M``!0!(``$`!\OV!TM@(`"($""'#L```@``"``!`(@P(0`'P_8#2O`@``@``(
+M_W\`0`"``!``?#]@D.P``"``C*X"``"``!``"")@``$`(`""0&``@"`(`/K@
+M5P+I_R>P[```(``0`*X)!(#M"R"`#S@4$&X+`'K@5X$8`"``!$%0C@2`$-#L
+M```@`(P$@!``!$%0``0A0``"8$"`B($(C@@@"``"(D".`H`0\.P``"``=HAA
+M"(P((`@`@B%`C`*`$`%^(4``CD`8!7KA5POY_R<0[0``(`"*""`(`((@0``"
+M($"`B$`(E`@@"`"$($"4`H`0B@@@"##M```@``""($```B!`=HA`")(((`@`
+MA"!`D@*`$(H((`@$^N!74.T``"``@@$`(``$05"*!(`0``$`(`'^($"*`H`0
+MB@@@"`""($!P[0``(```!$%0``(@0("$@!"*""`(`((@0``"($!VA(`0`(`/
+M.)#M```@``0^#A``-@X0`#AN8Q1^CE,0&@X0``"@80#ZYE<!(@`@L.T``"``
+M`'P?8*2\`@``!``(`'K@5UZ()@@!`0`@H(*&$``>`"#0[0``(`"@B`8(`('@
+M5XD"`"``@>!7BAL`(``"`%`4>N!7"AH`(/#M```@`+"()@@%^N!7B@L`(%Z(
+M)@BBB`8(``(`0**`AA"DB`8($.X``"``````0%Z()@@`@`9`I@*`$*2(!@@!
+M?@!``!``&`7^/V`P[@``(`"`P.,OI(*&$+"()@@!_@!``!`@&+"`AA"BB`8(
+M`+WC+U#N```@`*"`AA``#0`@I(@&"````$``@`9`I@@@"**(!@@``@!0<.X`
+M`"``HH"&$``0`!A>B"8(``(`0**`AA``$``8!?X_8`"UXR^0[@``(`"@@(80
+MI(@&"````$!>B"8(`(`&0*8"@!"DB`8(`7X`0+#N```@```0`!@%_C]@@*_C
+M+Z2"AA`0`*X)!(#M"R"`#S@4$&X+T.X``"``!#X.$``V#A``.&YC&'Z.4Q`:
+M#A`4'`X0``#`80'^OV'P[@``(``$`$<(`'Q_8'2V`@`\A0$0`'P!8```(```
+M>N!7``0G"!#O```@``3^`&`!!P`@`'K@5P+^(&`!`@`@`/K@5P(N`"``U.<O
+M,.\``"``@"\`(`#ZX%>!`0`@@+;I+SQ^($"`*P`@`((@4(`J`"!0[P``(```
+M>N!7@0P`(`!\'V"0K@(`````"`!ZX%>!*``@``0G"'#O```@``+^(&``^N!7
+M!`!'"`0`(`B!`0`@`(0@:`0"`!"``P`@D.\``"```(0@<`0"`!``?%]@<+`"
+M````(0@!_B!```(!$`````BP[P``(```>N!7@O;_)X`>`"``?!]@B*X"````
+M(`@`^N!7`0T`(-#O```@``R(0`@,"`<(``'A5P(%`"`*B$`("@@'"``!X5<"
+M`P`@\.\``"``"(@@"`@(!P@`@>!7`@$`(`'^'V"````@````4`!ZX%<0\```
+M(`"!!``@`'P?8(BN`@`````(`OZ_80!\?V!TM@(`.($A"##P```@``'^($"`
+M`@`@"'X'0(!W_B\`@B!0`'Q_8'2V`@`X@P$04/```"```'K@5X$(`"``!"<(
+M`OX@8`#ZX%<$`$<(!``@"`$$`"!P\```(```A"!H!`(`$`!\/V!TL`(``(``
+M"`%^`$``@``0``0`()#P```@``"$('`$`@`0@`(`(`":IE&``0`@`'P?8*3+
+M`@`,`@`0L/```"```)H&8!``K@D4`,X)!(#M"R"`#S@8$&X+!#X.$``V#A#0
+M\```(```.&YC*'Z.4Q`:#A`4'`X0&!X.$!P@#A```,!A`(*@8?#P```@`!"`
+MY@D.B`<("`"'$!"(!P@*`(<0$H@'"`P`AQ```0XH$/$``"``9``'$".$!PA>
+M`(<0`!P'8("-_R\\@`<(`00`"!!^`&`P\0``(```>N!7!``'"($!`"``?`!H
+M``@````!`"``?`!@__?__U#Q```@``0`!Q`,@.8)`(@G"`">`$((!`@("02(
+M"0A^AH$`&`!H</$``"``%@"'$`H$"`@+!(@)"'Z&@0`8`&@2`(<0@*,!*`!Z
+MX%>0\0``(`""`0`@!``'"!!^`&@$``<0#'ZH0?R;#1`,!`@(`'K@5[#Q```@
+M``(0`"``?!]@B=P"```$8`@`^N%7#01("`(!`"!6!$<0T/$``"````T`(`"%
+MX5<"!P`@`OX&0`!\/V`HL`(``(9!8(!?XR_P\0``(```>N!7@@,`(`0`!P@`
+M?`!H``$``-]_`&`$``<0#01("!#R```@``#W_R<$`$<(`'P!8``!````>N!7
+M@@0`("!^`6@$``<0,/(``"````,`(`0`1PB`_?\G#01("#1^!T`.?BA`@.;A
+M+_R!K0E0\@``(``!A$8(`GX!0``:H$'\FPT0`(0&"`%ZX%>"(@`@`((@4'#R
+M```@`````%``#,-0`81&"``%XU<*%0`@`(9A4/R!K0D`C(9`D/(``"```@1"
+M"']^H6``_$%`\+\"```%00@`A>)7@@4`(`&&7X"P\@``(```$*$8`((B:`"0
+M(!@"!$((@'Y!8`!ZX5>!`P`@`(`":-#R```@```0`!@``@`@`?Y!0``081@$
+M^N%7"_3_)P3ZX5>+!``@\/(``"``_(&M"0",AD`"!$((@'Y!8`!ZX5>!`0`@
+M!`!'"`A^06@0\P``(``$!`<0`7Y#0``0P1C\@:T)`81&"``%XU<+Z_\G#P!'
+M$##S```@``!\7V#TK@(```A!"```06``!>!7@0$`(`0`1P@(?D%H4/,``"``
+M!`0'$`!\7V#TK@(```A!"``"`6!H`(<0_(&M"0&$1@AP\P``(``"?@%``!H`
+M0/R!#1"``0`@!`!'"`A^06@$!`<0_(&M"9#S```@``"$!@@">N!7`@(`(`&$
+M!@@"?@!``!H`0/R!#1#\@:T)L/,``"```(0&"`-ZX%>""@`@`'P?8(BN`@``
+M```(``'G5P(&`"#0\P``(``@!``(`'K@5X$$`"`.!"<(`H0&"`"!X%>!!@`@
+M`?X_8/#S```@``!\'V!TM@(`-`-`$``$`"#\@:T)`H0&"`X`1Q```@`@$/0`
+M`"``!`!'"`!\`6C\P!\`!``'$`"()P@"B`<(``(`0``>X$$P]```(```?']@
+MG+`"``"$(0D!A($)"'Z&@0"8)&D"A($)$'Z&@5#T```@``"8)&D#A($)&'Z&
+M@0"8)&E`_@1@`'K@5P$"`"`$`$<(</0``"```'P!:`!````$``<0`'Q_8)RP
+M`@`&A&$(`_KA5P$!`""0]```(``$^N%7`@(`(`0`1P@`?`%H`(````0`!Q`?
+M_A]@M`"'$+#T```@``!\'V#_`P``M@"'$/R!K0D`F^=7#O$`(`#E`"`"A`8(
+MT/0``"``^H%-$`.$!@C[@4T0^HD-"!@`AQ"`Z0`@`)H&8`#*Y2_P]```(```
+M>N!7@08`(`":!F``1>,O`'K@5X($`"`!_C]@`'P?8!#U```@`*#<`@```D`0
+M`((@4`!\'V"AW`(```)`$`#A`""`>/TO,/4``"``!`!'"$!^`6@$``<0@-X`
+M(`6$!@CZ@4T0!H0&"/N!31!0]0``(`#ZB0T(6`"'$`>$!@@(A(8)"'Z&@0`8
+M`&A<`(<0"80&"'#U```@``J$A@D(?H:!`!@`:%H`AQ``U@`@`'P_8)"P`@``
+M@``(D/4``"```7X`0`"``!`!A`8(''K@5PO2`"``?']@G+`"``"$(0FP]0``
+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
+MG+`"``"$(0D!A($)"'Z&@0"8)&FP^P``(``"A($)$'Z&@0"8)&D#A($)&'Z&
+M@0"8)&D`$B-@!/X`8-#[```@``!ZX%<!`0`@`OX?8"\`1Q`$`$<(`'P!8/]_
+M__\$``<0\/L``"````@`(/R!K0D`A`8(A7K@5P$P_R>)`@`@!GK@5X$7_R<0
+M_```(``'>N!7`1K_)P`#`""M>N!7@2/_)Z]ZX%<!`0`@W7K@5S#\```@``%2
+M_R?\@:T)`80&"`)^`$``&@!`_($-$`"!YU>-]/\G4/P``"```!P'8("JYR\`
+M>N!7@0,`(*`()P@`?%]@HMP"```(`0AP_```(```@>!7C```(``"@1`0`*X)
+M%`#."1@`[@D<``X*!(#M"Y#\```@`""`#S@H$&X+!#X.$``V#A``.&YC)'Z.
+M4Q`:#A`4'`X0L/P``"``&!X.$```H&$`@L!A`/KF5X$Y`"``>N=7@3@`(!``
+MYPG0_```(`"`B`PH9(`&$".$!PA>@(80'_X?8+2`AA``?!]@_P,``/#\```@
+M`+:`AA``F@9@@!+^+PP`1P@`"&$(`(0!0`Q^`$#\@0T0$/T``"```@@A"`"&
+M($``A$!```'A5XXK`"#\@0T(``0@"*WZX%<P_0``(`"""``@!00@"/J#31`&
+M!"`(^X--$/J)+0A8@H80!P0@"%#]```@``@$@`D(?H:!`)@@:%R"AA`)!"`(
+M"@2`"0A^AH$`F"!H</T``"``6H*&$(`=`""%^N!7@AP`(`!\OV!TM@(`,($B
+M"`'^($"0_0``(``P@P(0!@2`"`<$@`D(?H:!`!B":`@$8`@)!(`)"'Z&@;#]
+M```@``"886@`?!]@GML"```(@!``?!]@H-L"```&@!`!A0((T/T``"```'K@
+M5P$!`"`"B8((!(EB"``(HF``AB%@``S#4`#ZX%?P_0``(``!!P`@`(/B5PD&
+M`"``_>!7__\``(D$`"`!_@)```H`8!#^```@``!ZX%>"`@`@`?X`0``"`&``
+M>N!7@@``(`'^WV``#@,8,/X``"```'K@5P$#`""TB(80MH:&$````%``?+]@
+M=+8"```"`"!0_@``(```?+]@=+8"``"%`@@!?@!``(%"$/R!#0@!!"`(`OX@
+M0'#^```@``"``$#\@0T0``'A5XW4_R>T@"8(`'P?8)S<`@```@`0D/X``"``
+M$`"N"10`S@D8`.X)!(#M"R"`#S@D$&X+`'P_8*#+`@"P_@``(```B$`(`7XA
+M8`#ZX%>!"0`@`7X@8`#ZX%<!"@`@`'P_8-#^```@`(C<`@``A"`(`/K@5Q!^
+M(&`"`@`@$'X!8`"!X%>!!@`@\/X``"````4`(`#ZX%<!!0`@$'X!8`!ZX%>"
+M`P`@``(`(!)^(&`0_P``(``2?@%@`('@5P$!`"````!0@```(`'^'V``@`\X
+M!#X.$##_```@```V#A``.&YC''Z.4Q`:#A`4'`X0``#`80":IE$`?%]@4/\`
+M`"``]+8"``%%`0@`>N!7@B$`(/S_+4``?!]@3+T"`!0```AP_P``(```0``(
+M`GX`8`!ZX%<!_A]@`@``4`"``!!010$(`'K@5Y#_```@``(,`"``+P@H`'P_
+M8'37`@`T@``0`'P_8```(0`(Q``(L/\``"``0'X`8`!ZX%>!!``@0/X?8`B`
+M0!0,Q``(OW\`8`R`0!30_P``(``!_A]@`'Q?8/2V`@!0`4$4`'Q?8/2V`@!0
+M10$(`'K@5_#_```@``'T_R<```!0`'Q?8/2V`@!0`4$4`'P?8.2U`@`````(
+M$``!`"```WK@5PT&`"``?!]@_+`"``````@``"`(`'P?8/BP`@`P``$`(```
+M```(````"`"``%`!>N!7C0``((!>!"@`?#]@```A`%```0`@``#$``@!_A]@
+M`'Q?8/2V`@`!`4$4@'X':`"`0!0`F@9@<``!`"``$`"N"10`S@D$@.T+((`/
+M.!P0;@L$/@X0`#8.$``X;F.0``$`(``8?HY3$!H.$!0<#A```*!A`!S'40&$
+M!@@&>N!7"QX`(+```0`@``*$!@@`?-]@I-P"``(`0Q`#A`8(`P!#$`2$!@@$
+M`$,0T``!`"```80&"`$`0Q`!A`8(!GX`4`/^/V``:N$O`7Y`0``.`1CP``$`
+M(```?#]@C-L"``"$0!``"()0``BB8`"!XE>*$@`@``@B0!`!`0`@``"(($``
+M@F9`!81!"`!ZX5>,#``@!81!"`YZX5<)"P`@,`$!`"``!81!"`:$(0@!_B!0
+M`(0@0`[ZX%<)"``@!81!"`"*(D!0`0$`(```BB!``/S`0*3<`@`%!$,0!H0A
+M"`8"0Q`'AB$(!P)#$'`!`0`@``'^(D``CJ`8`7XB0`".@!@!_M]A``(`(/]_
+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
+M`@`0!`<(`'K@5P$0`"``KN8O````8@'^_V$`FJ91D`<!`"```)H&0``:`$`"
+M?@"``'S?8:3+`@``'$!`&@0A"`#ZX%>P!P$`(``!!0`@'``A"``#Z%<.`P`@
+M%'XG0`"``$``@B!0#/Y?8-`'`0`@``!WX"^````@`)[G40'^ID$#^N97"_7_
+M)P#ZYU<!`@`@\`<!`"``````4`!\WV&DRP(`$`!'$````%``?#]@Z*P"``"`
+M`!`0"`$`(``0`*X)%`#."1@`[@D<``X*!(#M"R"`#S@@$&X+!#X.$#`(`0`@
+M```V#A``.&YC,'Z.4Q`:#A`4'`X0&!X.$!P@#A````!04`@!`"``]($-$/B!
+M#1"`%@<H`'P_8'37`@`D@``0\/]-0`!\WV%P"`$`(`"0J`(`$``'"```8`@$
+M``<(```@"`P`!P@`@>!7!0$`()`(`0`@``"``%"````@`(`!4````1``?/]A
+M',L"``2`!P@!?@!`L`@!`"``%(#'"0`<)V``"N`O`(`'"`"!X%<.`0`@``+'
+M48```"#0"`$`(````L!1`'KG5P(!`""`CQ(H@```(`"V$BCP@:T)`!OG5_`(
+M`0`@`(8``"``'*=A`'S_81S+`@`4@,<)!(`'"```!U``@>97$`D!`"``C@``
+M(```H&$`^N97`@$`(````%``'``@`OX?8/R!31`P"0$`(`#]FTT0]/]-0`!\
+MWV&0J`(`%``'"`````@,`"<(!/X@@%`)`0`@``"``$````$0`'S_81S+`@`$
+M@`<(!'X@@!"`!P@``D!`<`D!`"``]($M"`3^9H#\@:T(^('-"`+^'V`!_I]@
+M@+X-*```(&"0"0$`(```^N!7`0(`($/^'V``!$%0@((4*``,`"``?%]@3+T"
+M`+`)`0`@`"P``0@`?"!H``(``"0``0@``@`4!(`'"``:`$`4@"<(T`D!`"``
+M`.??+P2"!Q`0``<(``#@"0Q^!T(`X]XO#``G"`":($#P"0$`(```@^=7C0``
+M(`">(%```@@0`.+>+P#*_R<0`*X)%`#."1`*`0`@`!@`[@D<``X*!(#M"R"`
+M#S@P$&X+!#X.$``V#A``.&YC,`H!`"``,'Z.4Q`:#A`4'`X0&!X.$!P@#A``
+M``!0]($-$/B!#1!0"@$`(`"`UP8H`'P_8'37`@`H@``0\/]-0`!\WV&0J`(`
+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
+M($`4@@<0#(`G"`'^($!0%@$`(``__B!@#(('$`!7W2\```!0`'K@5P($`"``
+M?%]@3+T"`'`6`0`@`!P``0@`?"!H``(``!0``0@``@`4@`$`(%#^'V">_C]@
+MD!8!`"``@,`:*!``K@D4`,X)&`#N"1P`#@H@`"X*)`!."@2`[0NP%@$`(``H
+M$&X+((`/.`1^CD,"_C]@`'P?8-S7`@```D`0"?X_8-`6`0`@``!\'V#>UP(`
+M``*`$`S^/V``?!]@X-<"```"0!``@`\X\!8!`"``!#X.$``V#A``.&YC&'Z.
+M4Q`:#A`4'`X0`'P?8)C)`@`0%P$`(```"``(!'K@5X$W`"``/PDH`'Q?8("W
+M`@`0`2$(``/@5S`7`0`@`(XT`"``?"!``'T``!`#`1```^!7#@$`(````%`0
+M`0$04!<!`"```'P?8)RM`@```"`(`'P?8`2M`@`````(``)`0`!\'V!P%P$`
+M(`"TK0(````@"`!\'V!HL`(`````"`"``%``!"!``'P?8)`7`0`@`!RM`@``
+M```(``*@00!\7V"`MP(`%`$!"`"`1E``$`$8L!<!`"```'P_8(#9`@``A(`0
+M`'K@5X$8`"``?>!7*P$``(P!`"#0%P$`(```?!]@*P$```"`@!``?#]@@-D"
+M``"(``@``!]02@$``/`7`0`@`![^/V``B-XO``#`80)^!X``'`!`````0``<
+M`$`"?@"`$!@!`"```!P`0`9^P($`?%]@@+<"`!@!`0@``>=7@0D`(`!\'V`P
+M&`$`(`"8R0(```@`"`-ZX%<!_A]@@@(`(``<)V``?%]@0`L``%`8`0`@``"&
+M85```@`@`'P_8$`+````'$=@`?Y_8(#]]R\`?%]@<!@!`"``@+<"`!@=`1``
+M?%]@@+<"`!0;`1``"@`@`'P?8)C)`@"0&`$`(```"``(`WK@5P'^'V""`@`@
+M`'P_8`!]````!$%0`?Y_8+`8`0`@```"`"``@B!0`'Q?8`!]````AF%0`/+W
+M+P```%``?%]@T!@!`"``@+<"`!@!`1`0`*X)%`#."02`[0L@@`\X&!!N"P0^
+M#A#P&`$`(```-@X0`#AN8S1^CE,0&@X0%!P.$!@>#A`<(`X0("(.$!`9`0`@
+M`"0D#A`H)@X0``#@80""(&(`AL%A^(4-$`":IE$`&H<0,!D!`"```*((8`'^
+M/V"`4@LH`OX?8/R!#1``_`A"``(``,4%"`A0&0$`(`#]@4T0Q`4("/^!31"(
+MB`@(`'K@5X(&`"#ZA0T(_H%-$'`9`0`@`,!_"$#\@6T((/X_8``$05``GH=@
+M@#C_+UV$"`@(?@!HD!D!`"``78!($`":!F"`-P`@3HCH"``0!%&0A`@(`('C
+M5X$#`""P&0$`(``!?@1``!``&0-^!(``@`A`D`0`"`"!XU>"_/\G`*((8-`9
+M`0`@```0)&``-0`H`(X#0``.`$``$`!```X@&`#\"$(``@``\!D!`"``Z04(
+M"``"`%``#B`80(0("`!ZX%<!`0`@`(X`4``.(!@0&@$`(`#ZA0T(``(`4``,
+MH!D!_@!```X@&/Z!31"(B`@(`('C5S`:`0`@``((`"#__R9``(R@&0#\"$(`
+M`@``X04("/M_`&``#@`84!H!`"``"'X`:.$!2!#`?PA`_(%M""#^/V``FD9@
+M`)Z'8(`;_R]P&@$`(```'``@`/KC5P$#`"`0_E]B`?X`0/Z!31#__R9``(R@
+M&9`:`0`@`(`!`"!ZB`@(!'X`4``00!I<A`@(`/P(0@`"``#D`4@0L!H!`"``
+M780("`A^`&CE`4@07H@(".8!B!``IFE20(0("`!ZX%?0&@$`(`"!`P`@`?Y_
+M8EC^"$`$_C]@`)I&8`"&85``"()0@`O_+_`:`0`@``#\"$(``@``Y'\(0`":
+M:4(`C$D8!/X_8`"&85``"()0$!L!`"````?_+V#^"$`!_BE``(Q`&``D*6``
+MAF%0``B"4(`#_R\P&P$`(`#`?PA``?XF4`",0!C\@6T((/X_8`">AV```/\O
+M__\F0%`;`0`@``",H!D`&H<0$`"N"10`S@D8`.X)'``."B``+@HD`$X*<!L!
+M`"``*`!N"@2`[0L@@`\X-!!N"P/^0(``!(!`D`1B"`!\H$"0&P$`(````@``
+MQ85""``&84!."$`(``Y!&`"$P5"0!&((`(9!0+`;`0`@```&04`"?D&``(1"
+M0#4-01`!_B!``)`@&`/^0(``!(!`T!L!`"``B01""(!^06``>N%7`?3_)P"`
+M#S@$/@X0`#8.$``X;F/P&P$`(``4?HY3$!H.$`!\OV'\K@(``(`&$(!6_R\`
+M@`8(`7K@5Q`<`0`@``(!`""6_C]```,`(`)ZX%>"`0`@`'P_8%@"``"````@
+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
+M`'Q?8)3!`@````$(!`!`"/]_04`$!``0,"(!`"```/K@5X$"`"``?#]B=+8"
+M`$R!"`C`?P!`3($($`!\/V)0(@$`(`!TM@(`3($(""<$(`A`_B!H)P)`$(`6
+M`"`%!`<(_H%-$'`B`0`@``8$!PC_@4T0_HDM"`!\/V)TM@(`3($(""X"@!`'
+M!"<(D"(!`"``"`2'"0A^AH$`F"!H,`*`$`D$)P@*!(<)"'Z&@0"8(&BP(@$`
+M(``R`H`0``D`(`0`)P@`?#]B=+8"`$R!"`@H`@`0``8`(-`B`0`@`/B!S0D`
+M!`<(!WK@5X'8_R>)`0`@!GK@5P'2_R<``@`@\"(!`"``K7K@5P'N_R>O>N!7
+M`??_)_B!S0D!!`<(`GX`0``<`$`0(P$`(`#X@0T0`('F5XWV_R<0`*X)%`#.
+M"1@`[@D<``X*(``N"C`C`0`@``2`[0L@@`\X+!!N"P0^#A``-@X0`#AN8RQ^
+MCE,0&@X04",!`"``%!P.$````%#\@0T0`+<'*```P&$`?+]A2+<"`!R!!@AP
+M(P$`(`````=0`'W@5X`,```.%``@`,#F+QR=!A``?#]@$,`"`)`C`0`@``"!
+M``CL@0T0!(D`"/"!C1`,@08(`7X`4`9ZX%<-#``@L",!`"````8`((`GXR\0
+M@28(`(`@0`!\'V"DRP(`#`(`$``(`"#0(P$`(`#L_PU``%3B+X`&`"``9OPO
+M@`4`(`)^@($`?(8!]",!`/`C`0`@````!CCM2```]$@``/=(```$20``!$D`
+M``1)```$20``$"0!`"``````4`!\OV%(MP(`#($&$/S_+4``?!]@3+T"`#@`
+M``@P)`$`(``````(`(``$/C_34#T_RU``'P?8$S!`@`L```(```!$%`D`0`@
+M`#_^'V``@``0``1!4`!\OV%(MP(`(($&"/R!+0@`@>!7<"0!`"```@T`("2!
+M9@@$@``(`('A5P(+`"`H@68("(``"`"!X5>0)`$`(``""0`@#(``"`!\`&#_
+M/P```'K@5X$&`"``@``(`'P`8+`D`0`@`````)``?>!7````D((#`"#X@2T(
+M`/K@5P$"`"`L@08(T"0!`"```('@5X4``"`!_E]@`'KA5X$.`"``?+]A2+<"
+M``"!!@CP)`$`(``!?@!``($&$`'^'V`$@080````4`B!!A``?!]@Y+4"`!`E
+M`0`@``````@%>N!7A@4`(`#K$2@`?+]A2+<"``B!!@@!?@!`,"4!`"``"($&
+M$`!\'V#DM0(`````"`5ZX%>%^O\G````4`!\OV%0)0$`(`!(MP(`!($&$/R!
+M+0@`?+]A2+<"`""#!A`$@``()($&$'`E`0`@``B```@H@080^($M""R#!A``
+M``!0$`"N"10`S@D$@.T+D"4!`"``((`/."P0;@L$/@X0`#8.$``X;F,0?HY3
+M__\_8(!;`2BP)0$`(``$@.T+((`/.!`0;@L```!0=``-$'@`#1``@`\X````
+M4-`E`0`@`'P`#1"```T0`(`/.`0^#A``-@X0`#AN8QA^CE,0&@X0\"4!`"``
+M%!P.$```H&%X@,8)`*`?"``!`$@``0!(``$`2``!`$@0)@$`(````0!(``$`
+M2``!`$@``0!(!'X@8`"`H!____]_=(`F"#`F`0`@``#ZX%>!'``@`'KG5X$;
+M`"```"<(`/W@5TY$5D2"&0`@4"8!`"````1!4'2$!A!\@"8(`(/F5P(!`"`0
+M!`<0@`(`(!`"!Q!P)@$`(`"`@$8(@(0`$'R`)@A\`@$0%``G"/__($`4`@<0
+M/(`F")`F`0`@``?ZX%<"!@`@!_X_8)""!A`H`"T(`?X@0"@"#1```*`?L"8!
+M`"```)H&8`!+`B@`>N!7@0$`(`"'W"^````@``"@'W"`!@C0)@$`(```>N!7
+M@0$`(%C^!D``<`,H``$`(``$05!8A`80`*`?"/`F`0`@```!`$@``0!(``$`
+M2``!`$@``0!(``$`2``!`$@``0!($"<!`"``!'X@8`"`H!____]_``"@'Q``
+MK@D4`,X)!(#M"R"`#S@P)P$`(``8$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A``
+M`*!A!((&$%`G`0`@`````%`(@`80$(`&$!2`!A`,@`80`*`?"``!`$@``0!(
+M<"<!`"````$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!^0)P$`(`#_
+M__]_`'P_8$Y$5D0`@@80;``M"`#ZX%<!`P`@'(!`"+`G`0`@`!R:`!`8&@$0
+M'(0&$!B"!A"``0`@;!H-$!B:!A`<F@80T"<!`"``<``M"`'^($!P`@T0``"@
+M'P```%`0`*X)!(#M"R"`#SCP)P$`(``4$&X+!#X.$``V#A``.&YC*'Z.4Q`:
+M#A`4'`X0&!X.$!`H`0`@`!P@#A`@(@X0)"0.$```X&$`@@!B``0A8@"&06(`
+M",)A,"@!`"```*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$A0*`$`
+M(````0!(!'X@8`"`H!____]_`OXH8`#ZX%<(@$<(`"`A8'`H`0`@`($!`"``
+M`^A7@@(`(``!`"``^N!7`0$`(`":IE&````@D"@!`"``!_Z_80#ZYE<"!``@
+M"(!'"``$"1`!_BA@`/K@5X$8`""P*`$`(```("%P"(('$``7`"``>N=7@14`
+M(`P`K0D`?#]@=TD``-`H`0`@`'2"!A"$H`80C*(&$(BD!A!XG@80$(`G"`#Z
+MX%>!!``@\"@!`"``?((&$("`(`B`@@80$(`G"("`(`A\F@`0$(`G"(":`!`0
+M*0$`(`"``0`@$)H'$'R:!A"`F@80%(`G"`'^($`4@@<0!_X_8#`I`0`@`#R"
+M!A`!_C]@1((&$"@`+0@!_B!`*`(-$%B<!A```*`?4"D!`"``_WOG5P$!`"!8
+M_@9```(#*`":!F"`5P(HD(`&"(`!`"!P*0$`(``'_K]A``"@'P":!F`0`*X)
+M%`#."1@`[@D<``X*(``N"I`I`0`@`"0`3@H$@.T+((`/."@0;@L```!0;``-
+M$'``#1``@`\XL"D!`"``!#X.$``V#A``.&YC-'Z.4Q`:#A`4'`X0&!X.$!P@
+M#A#0*0$`(``@(@X0)"0.$"@F#A`L*`X0,"H.$```(&(`@J!A``3!8?`I`0`@
+M``"@'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!($"H!`"````$`2`1^
+M(&``@*`?____?P)^)V``^N!7"(`H"($!`"`P*@$`(```FB!@"((($``=`"``
+MFB!H"((($!"`J`D`^N97%(!("%`J`0`@``%F`"`!>N%7`)K&88(9`"",`$<(
+M`GY!8`!ZX5>$`$<(<"H!`"````(A8($!`"```^%7@@(`(``!`"``^N!7`0$`
+M(`""(%"0*@$`(`"````@!_X_8`#ZX%>"$``@"(`H"(@`1P@``@$0C`!'"+`J
+M`0`@``%^06``>N%7@0$`((0`1P@`A"!P"((($`"JJE(0J@@0T"H!`"``%*H(
+M$'0J!Q`H`"T(`?X@0"@"#1```*`?<``'"`!ZX%?P*@$`(`"!`0`@6'X'0(#L
+M`BB````@6"H'$`"JJE*0*@<0`!P'8!`K`0`@`("_`2@`>N!7`5``((#[VR\`
+M3P`@``"@'P!.`"``JJI2,"L!`"``$*H($``D25(`(`A2%(!H"@B`B`HH`"T(
+M`?X@0"@"#1!0*P$`(````*`?`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`
+M2'`K`0`@```!`$@``0!(!'X@8`"`H!____]_#(`H"`#ZX%<!!``@D"L!`"``
+M`*JJ4@RJ"!``FL9A%(!H"@B`*`@`J(!J`'KG5P$=`""P*P$`(`",`&<(`OXA
+M8`#ZX%>$`$<(`"@A8($!`"```^%7@@(`(-`K`0`@```!`"``^N!7`0$`(`""
+M(%"````@!_X_8'P`YPD`^N!7\"L!`"``@A(`((@`1P@`*`$0`?XA8`#ZX%<!
+M`@`@"(`H"(0`1P@0+`$`(```A"!P"((($'P`)P@``^=7`@$`(`":IE$`!``@
+M`!OG5S`L`0`@`((``"``@J!A@`!'"'P`)PB`A``0?``G"'P"`1`4@$@(4"P!
+M`"``_W\A0!2""!``JJI2="H'$)`J!Q``>NE7`@(`(``<1V)P+`$`(```'`=B
+M?"H'$(`!`"!\'`@0?"H'$``<!V(`GL=A__]I0I`L`0`@``#ZZ5<"U_\G$)H(
+M$```H!\`),EA`'KG5P$/`"!\`.<)L"P!`"``<``'"`!ZX%>!`0`@6'X'0("S
+M`B@``0`@`*JJ4E@J!Q#0+`$`(```H!\(``$`2``!`$@``0!(``$`2``!`$@`
+M`0!(``$`2/`L`0`@```!`$@$?B!@`("@'____W\H`"T(`?X@0"@"#1```*`?
+M$"T!`"```!P'8`!_`2@`GL=A`'KG5P+Q_R<`H!\(``$`2``!`$@P+0$`(```
+M`0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'U`M`0`@`/___W\H`"T(
+M__\@0"@"#1```*`?#``M"!``#0@`@>!7<"T!`"```04`(```#0@`>N!7@@,`
+M(`"S_R<`>N%7`;/_)PR`*`B0+0$`(``!_B!`#((($`"Q_R<```!0$`"N"10`
+MS@D8`.X)'``."K`M`0`@`"``+@HD`$X**`!N"BP`C@HP`*X*!(#M"R"`#S@T
+M$&X+T"T!`"``!#X.$``V#A``.&YC$'Z.4X#:`"B`IP(H@'L`*``/`"CP+0$`
+M(`"`=?\O@/C^+P#Z_B\$@.T+((`/.!`0;@L$/@X0`#8.$!`N`0`@```X;F,0
+M?HY3```-"`!]X%?Q\/#P@0(`(`!\'V#P\/#P,"X!`"`````-$("`VB^`\O\O
+M`'P?8/#P\/````T0!``-"("]'"A0+@$`(`````!0```-$("AVB\$@.T+((`/
+M.!`0;@L```!09``-$'`N`0`@`&@`#1``@`\X!#X.$``V#A``.&YC&'Z.4Q`:
+M#A`4'`X0D"X!`"````"@87B`Q@D`H!\(``$`2``!`$@``0!(``$`2``!`$BP
+M+@$`(````0!(``$`2``!`$@$?B!@`("@'____W]T@"8(`/K@5]`N`0`@`($<
+M`"``>N=7@1L`(```)P@`_>!704U%4X(9`"``!$%0\"X!`"``=(0&$'R`)@@`
+M@^97`@$`(`P$!Q"``@`@#`('$("`1@@0+P$`(`"`A``0?(`F"'P"`1`0`"<(
+M__\@0!`"!Q`\@"8(!OK@5S`O`0`@``(&`"`-_C]@D((&$"@`+0@!_B!`*`(-
+M$```H!\`F@9@4"\!`"``@#<!*`!ZX%>!`0`@@'/;+X```"```*`?<(`&"`!Z
+MX%=P+P$`(`"!`0`@6/X&0(!<`B@``0`@``1!4%B$!A``H!\(``$`2)`O`0`@
+M```!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@L"\!`"```("@'___
+M_W\``*`?$`"N"10`S@D$@.T+((`/.!@0;@O0+P$`(``$/@X0`#8.$``X;F,4
+M?HY3$!H.$```H&$$@@80"(0&$/`O`0`@`````%`,@`80$(`&$`"@'P@``0!(
+M``$`2``!`$@``0!($#`!`"````$`2``!`$@``0!(``$`2`1^(&``@*`?____
+M?P!\/V`P,`$`(`!!3453`((&$%P`+0@`^N!7`0,`(!B`0`@8F@`0%!H!$%`P
+M`0`@`!B$!A`4@@80@`$`(%P:#1`4F@80&)H&$&``+0@!_B!`<#`!`"``8`(-
+M$```H!\```!0$`"N"02`[0L@@`\X%!!N"P0^#A"0,`$`(```-@X0`#AN8QQ^
+MCE,0&@X0%!P.$!@>#A```.!A`(+`8;`P`0`@``"@'P@``0!(``$`2``!`$@`
+M`0!(``$`2``!`$@``0!(T#`!`"````$`2`1^(&``@*`?____?PB`)P@`^N!7
+M`0(`(/__($#P,`$`(``(@@<0`)JF48`5`"``>N=7`10`(`P`K0D`?#]@GDL`
+M`!`Q`0`@`'2"!A!XG@80#(`G"`#ZX%>!!``@?((&$("`(`B`@@80,#$!`"``
+M#(`G"("`(`A\F@`0#(`G"(":`!"``0`@#)H'$'R:!A!0,0$`(`"`F@80$(`G
+M"`'^($`0@@<0!OX_8#R"!A`!_C]@1((&$'`Q`0`@`"@`+0@!_B!`*`(-$%B<
+M!A```*`?_WOG5P$!`"!8_@9`D#$!`"``@/L!*`":!F``40$HD(`&"(`!`"`-
+M_K]A``"@'P":!F"P,0$`(``0`*X)%`#."1@`[@D$@.T+((`/.!P0;@L```!0
+M7``-$-`Q`0`@`&``#1``@`\X!#X.$``V#A``.&YC''Z.4Q`:#A`4'`X0\#$!
+M`"``&!X.$```P&$`H!\(``$`2``!`$@``0!(``$`2``!`$@0,@$`(````0!(
+M``$`2``!`$@$?B!@`("@'____W\,`*<)`/KF5S`R`0`@`($1`"!\@"8(`(/F
+M5X(!`"``GN=1#!X'$(`"`"`,`@<04#(!`"``@(!&"("$`!!\@"8(?`(!$!``
+M)PC__R!`$`('$`">YU%P,@$`(`!TG@80*``M"`'^($`H`@T0``"@'W"`!@@`
+M>N!7@0$`()`R`0`@`%C^!D``^0$H@```(%B>!A``GN=1D)X&$`":!F``S``H
+ML#(!`"```'K@5P$#`"``"-LO``(`(`@`)P@!_B!`"`('$```H!_0,@$`(```
+M``!0$`"N"10`S@D8`.X)!(#M"R"`#S@<$&X+!#X.$/`R`0`@```V#A``.&YC
+M&'Z.4Q`:#A`4'`X0$(`-"12`S0D``*!A$#,!`"``-((&$%"$!A!4A@80`((@
+M4`B"!A`,B`80%(H&$`'^`E`P,P$`(```"`!`$(`&$!]^0V`XA`80'_X#8$B`
+M!A`8D`80')`&$%`S`0`@``2"!A`#_A]@/(`&$$""!A!$@@80`'P?8!!0``!@
+M@`80<#,!`"``9)H&$'""!A!<@@80=((&$'B"!A!\@@80@((&$`&$'X"0,P$`
+M(`!,@`80*((&$"R"!A`P@@80`'P_8*M.````F@9@`,[:+[`S`0`@``"@'P@`
+M`0!(``$`2``!`$@``0!(``$`2``!`$@``0!(T#,!`"````$`2`1^(&``@*`?
+M____?P!\/V!$4DA4`((&$!0`+0CP,P$`(```^N!7`0,`()B`0`B8F@`0E!H!
+M$)B$!A"4@@80@`$`(!`T`0`@`!0:#1"4F@80F)H&$!@`+0@!_B!`&`(-$"@`
+M+0@!_B!`,#0!`"``*`(-$```H!\`>N=7`0,`(`":!F``F0`H`'K@5P$)`"!0
+M-`$`(```U=HO``@`(`"@'P@``0!(``$`2``!`$@``0!(``$`2'`T`0`@```!
+M`$@``0!(``$`2`1^(&``@*`?____?R@`+0C__R!`D#0!`"``*`(-$```H!\`
+M``!0$`"N"10`S@D$@.T+((`/.!@0;@NP-`$`(``,``T(`(`/.`""(%`,`@T0
+M$`(-$!P"#1`@`@T0(/X?8-`T`0`@`"0`#1``?!]@FLD"```"0!`!?H!``?Y_
+M8`"&`6``!$%0\#0!`"```7X@8`#ZX%<"`P`@``0`&`%^(4``CD`8`7X@8`#Z
+MX%<0-0$`(``!_?\G``1"$`%^@D`!_F%``/WA5P`!``"%]_\G`'P?8#`U`0`@
+M`)S*`@``AF%0`((@4``"`!`$?@!``?YA0"#ZX5<%_?\G4#4!`"``%`(-$!@"
+M#1`H`@T0`(`/.`0^#A``-@X0`#AN8QQ^CE-P-0$`(``0&@X0%!P.$!@>#A``
+M`.!A`(*@80`$P6$`H!\(``$`2)`U`0`@```!`$@``0!(``$`2``!`$@``0!(
+M``$`2``!`$@$?B!@L#4!`"```("@'____W\X@"<(`(/F5PT8`"``@^97`@4`
+M(`+^0(#0-0$`(```?#]@G,H"```"(0``@^=7`@(`("``30A,@"<(``(A</`U
+M`0`@`"`"#1!(@"<(``('$$B:!Q`0`"T(`(/G5P(.`"`D`$T($#8!`"``.(`G
+M"`"%X%<.#``@`(7F5PX+`"`"?D&``'P_8)S*`@`P-@$`(````B$`$`(-$```
+MH!\H``T(`'K@5X(``"``EMHO`*`?"%`V`0`@```!`$@``0!(``$`2``!`$@`
+M`0!(``$`2``!`$@``0!(<#8!`"``!'X@8`"`H!____]_`)JF48```"`8_K]A
+M``"@'P":!F"0-@$`(``0`*X)%`#."1@`[@D$@.T+((`/.!P0;@L$/@X0`#8.
+M$+`V`0`@```X;F,<?HY3$!H.$!0<#A`8'@X0``#`80""H&$`!.%AT#8!`"``
+M(/KF5P4!`"`/_A]@`$,`(`"@'P@``0!(``$`2``!`$CP-@$`(````0!(``$`
+M2``!`$@``0!(``$`2`1^(&``@*`?____?Q`W`0`@`#@`)P@`@@<0/`!'"`!Z
+MX5<!`P`@.!H'$$@:!Q`!FE^`,#<!`"``3`0'$```H!\`-P`@(`!'"``%YU<"
+M_F"`@0D`(`!\GV!0-P$`(`"<R@(``(@A```#YU<"`P`@`(B!0``$`A`@`$T(
+M3``G"'`W`0`@```"07`@!`T0)``G""``1P@D`@$0(`!'"""$`!`!FE^`D#<!
+M`"``3`0'$``<`"``@B!0`/R!0)S*`@```@(0'`!-"$P`)PBP-P$`(`#_@W]P
+M``8A8!P"#1`@`$T(``9!8"`$#1`!FE^`3`0'$-`W`0`@``".0!@`>N%7`0(`
+M(`!\/V":R0(``H0@```1`"``_$!@\#<!`"```/\```!ZX5>!`P`@"/X@B`".
+M0!@`?#]@FLD"``*$(``0.`$`(``(_B!`@`L`(`#\0&```/\``'KA5X$#`"`0
+M_B"(`(Y`&#`X`0`@``!\/V":R0(``H0@`!#^($``!@`@`/Q`8````/\`>N%7
+M4#@!`"``@0,`(!C^((@`CD`8`'P_8)K)`@`"A"``&/X@0(```"!P.`$`(``@
+M_C]@)`(-$!``+0@``^=7`@4`("0`+0@@^N!7@0(`()`X`0`@``+^((``?)]@
+MG,H"``"((`"````@`((@4!`"#1`X&@<0L#@!`"``2!H'$`/^/V`\`@<0*``M
+M"`'^($`H`@T0``"@'P`<!V#0.`$`(`"`!P`H#``-"!``+0@`@>!7`0(`(```
+M#0@`>N!7@@``(/`X`0`@``!!VB\```!0$`"N"10`S@D8`.X)!(#M"R"`#S@<
+M$&X+$#D!`"``!#X.$``V#A``.&YC&'Z.4Q`:#A`4'`X0``#`80":IE$P.0$`
+M(```H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2%`Y`0`@```!`$@$
+M?B!@`("@'____W\H`"T(__\@0"@"#1!$`"<(<#D!`"```/K@5SP`)P@!!``@
+M`?K@5X$=`"`"^N!7@1P`(`""(%"0.0$`(`!$`@<0/`('$(`:`"``^N!7@1D`
+M($``)P@`^N!7`((@4+`Y`0`@``$"`"!``@<0`_X_8#P"!Q"`%0`@/`('$#@`
+M9P@"_D&`T#D!`"```'R?8)S*`@``""$``/K@5P$#`"`D@$`((!P!$"2<`!#P
+M.0$`(``D!`<0(`('$(`.`"``"(%``!P"$"`<!Q`D'`<0'`!-"!`Z`0`@`$P`
+M)P@`A"!H'`(-$!``30@`>N%7@@$`(!`<#1`D!@T0,#H!`"``@`<`("0`+0@`
+M@^%7!@8`("0&#1!(`($(`(GA5P8$`"!0.@$`(``X`"$(``/B5P$"`"`@`&T(
+M3``A"`"&(&@@`@T0$!P-$'`Z`0`@````H!\,``T($`!-"``!X5<!`@`@```-
+M"`!ZX%>"```@D#H!`"```?Z_80":!F`0`*X)%`#."02`[0L@@`\X&!!N"P0^
+M#A"P.@$`(```-@X0`#AN8Q!^CE,,``T(5``@"%``0`@`@@!@``(!.-`Z`0`@
+M``P`#0@P`"`(`/K@5X$``"``@@`X`*`?"``!`$@``0!(\#H!`"````$`2``!
+M`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!\0.P$`(`#___]_```@8`'^7V`,
+M``T(/`0`$$0$`!`H``T(`7X`0#`[`0`@`"@`#1``@*`?#``-"(`<`"@$@.T+
+M((`/.!`0;@L$/@X04#L!`"```#8.$``X;F,4?HY3$!H.$```H&$,`$T(`'KA
+M5X$#`"!P.P$`(```?!]@E-8"```!X5>!`0`@```-"`!ZX%<!`0`@$_X?8)`[
+M`0`@```0`"``^N97`@$`(````%``#@`@`*`?"``!`$@``0!(L#L!`"````$`
+M2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!_0.P$`(`#___]_!/X_8`P`
+M30@\`@$0`?X_8$0"`1`H`"T(`?X@0/`[`0`@`"@"#1```*`?#`!-"%@:`1!8
+M?@%``*T`*`P`#0B``@`H$#P!`"```/'_)Q``K@D$@.T+((`/.!00;@L$/@X0
+M`#8.$``X;F,P/`$`(``4?HY3$!H.$```H&$`H!\(``$`2``!`$@``0!(``$`
+M2%`\`0`@```!`$@``0!(``$`2``!`$@$?B!@`("@'____W\H`"T(<#P!`"``
+M__\@0"@"#1!$@"8(`/K@5X%6`"``BJ)01(H&$#B`)@B0/`$`(``@@(8(`(GF
+M5P$0`"`D@$8()`0"$""`A@@@"`$0`OY`@+`\`0`@``!\?V"<R@(```8A``"#
+MYE>"3@`@``9A0`"(`1`@`$T(T#P!`"```'KA5X$!`"!,@"8(``(A<"`"#1`0
+M`"T(`(/F5P))`"#P/`$`(``D`$T(`GXA@`!\?V"<R@(``(8@`!`"#1"`10`@
+M```-"!`]`0`@``!ZX%>"1P`@@$8`(`+^0(``?&%`G,H"``"*`1`<`$T(,#T!
+M`"``3(`F"/^#?W``!B%@'`(-$"``30@`>N%7`0$`(`"$(6!0/0$`(``@`@T0
+M'``M"`".0!@`>N%7@0(`(`!\/V":R0(``H0@`'`]`0`@`"0"#1``$@`@"/X@
+MB`".0!@`>N%7`0,`(`!\/V":R0(`D#T!`"```H0@``C^($`D`@T0``T`(`C^
+M((@`CD`8`'KA5P$#`""P/0$`(```?#]@FLD"``*$(``0_B!`)`(-$``(`"`(
+M_B"(`(Y`&-`]`0`@``!ZX5<!`P`@`'P_8)K)`@`"A"``&/X@0"0"#1```P`@
+M\#T!`"``(/X_8"0"#1``BJ)0$`H-$```H!\`*0`@$``M"`"#YE<0/@$`(`""
+M)``@)`!-"`)^(8``?']@G,H"``"&(``0`@T0(`!-"#`^`0`@``!ZX5<!(``@
+M*``M"`'^($`H`@T0``"@'P"@'P@``0!(4#X!`"````$`2``!`$@``0!(``$`
+M2``!`$@``0!(``$`2`1^(&!P/@$`(```@*`?____?R@`+0C__R!`*`(-$"``
+M+0@`CD`8`'KA5Y`^`0`@``$"`"``?#]@FLD"``*$(```#``@"/X@B`".0!@`
+M>N%7L#X!`"``@0(`(`!\/V":R0(``H0@``C^($"`!P`@"/X@B`".0!C0/@$`
+M(```>N%7@0(`(`!\/V":R0(``H0@`!#^($```P`@"/X@B/`^`0`@``".0!@`
+M?#]@FLD"``*$(``8_B!``OY`@`!\?V"<R@(`$#\!`"````8A`$B`8`@D`$T(
+M``?A5X4"`"`0`@T0(`!-"$R`(`@P/P$`(````B%P(`(-$```H!\,``T($``M
+M"`"!X%<!`0`@@+?_)U`_`0`@``!UV2\0`*X)!(#M"R"`#S@4$&X+!#X.$``V
+M#A``.&YC<#\!`"``&'Z.4Q`:#A`4'`X0#`"M"0`<QU$`H!\(``$`2``!`$B0
+M/P$`(````0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'[`_`0`@`/__
+M_W\\@"8(`/K@5X(,`"`<@"8(&((&$"@`+0@`^N!7T#\!`"``@0$`(`'^/V`8
+M@@80@`@`(""`9@@`A^97`0<`(#B`1@CP/P$`(`!(@"8(``/A5P(%`"`"?B&`
+M`'Q?8)S*`@``A(!!``8&$!!``0`@`"0`+0@"_B"``(0@`!`"#1`!_M]A``"@
+M'P`<!V`0`*X),$`!`"``%`#."02`[0L@@`\X&!!N"P0^#A``-@X0`#AN8QA^
+MCE-00`$`(``0&@X0%!P.$```H&$\@`8(!'K@5X()`"``H!\(``$`2'!``0`@
+M```!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@D$`!`"```("@'___
+M_W\H`"T(`?X@0"@"#1```*`?`)H&8``,_R^P0`$`(```"0`@`*`?"``!`$@`
+M`0!(``$`2``!`$@``0!(``$`2-!``0`@```!`$@``0!(!'X@8`"`H!____]_
+M=(#&"0``H!\`>N=7\$`!`"```0$`(`":!F```@<X$`"N"10`S@D$@.T+((`/
+M.!@0;@L000$`(``$/@X0`#8.$``X;F,4?HY3$!H.$`"@'P@``0!(``$`2#!!
+M`0`@```!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?4$$!`"``____
+M?RP`K0D``*`?`)H&8!``K@D$@.T+((`/.!00;@MP00$`(``$/@X0`#8.$``X
+M;F,4?HY3$!H.$```H&$`H!\(``$`2)!!`0`@```!`$@``0!(``$`2``!`$@`
+M`0!(``$`2``!`$@$?B!@L$$!`"```("@'____W\`@$8(`'KA5X$0`"`8@"8(
+M`/K@5P(/`"#000$`(``@>N%7#@$`(!_^/V"````@`7XA4`+^0(!``"T(`(1`
+M0/!!`0`@`#P`+0@``^%7!0(`(``"(5#\_T!@.``M"`"$0$```"$($$(!`"``
+M`/K@5P$$`"`0@@80%(`@"!2"!A`0F@`0```A"!2:`!`P0@$`(``8A`80``(`
+M(!":!A`4F@80&(0&$``:`1```*`?````4%!"`0`@`!``K@D$@.T+((`/.!00
+M;@L$/@X0`#8.$``X;F,4?HY3<$(!`"``$!H.$```H&$`H!\(``$`2``!`$@`
+M`0!(``$`2``!`$B00@$`(````0!(``$`2``!`$@$?B!@`("@'____W\8@&8(
+M`/KA5[!"`0`@``$+`"`0@$8(`(7F5P(#`"``@"$(`(/F5P('`"``@B!0T$(!
+M`"```((!$(`%`"`4@"8(%`(!$!"`1@@0A``0&(!F"`"`(0CP0@$`(```@^97
+M@@$`(!@&`1`0@$8(`(0!$`""(%`8@@80``"@'Q!#`0`@`````%`0`*X)!(#M
+M"R"`#S@4$&X+!#X.$``V#A``.&YC,$,!`"``''Z.4Q@:#A``FJ91+!H-$#`:
+M#1`T&@T01!H-$`!\'V!00P$`(`#\V@(``((@4`":IE$`&@`0!'X`0`'^($`@
+M^N!7!?W_)W!#`0`@``!\'V#\V@(`.``-$$``#1"`?@!`/``-$`!\'V"4U@(`
+MD$,!`"```'P_8&"U`@``?%]@]U```$@`C0A,`*T(4`#-"!`:#A"P0P$`(``4
+M&@X0`'Q_8$U)5$$`#.-@`.7]+U0:#1!8&@T0&`"N"=!#`0`@``2`[0L@@`\X
+M'!!N"P0^#A``-@X0`#AN8R1^CE,0&@X0\$,!`"``%!P.$!@>#A``?>!734E4
+M00$#`"`0`*X)%`#."1@`[@D01`$`(``$@.T+((`/."00;@L`!$%0^(4-$`"@
+M'P@``0!(``$`2#!$`0`@```!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``
+M@*`?4$0!`"``____?T``+0@`@"`(_(,-$`#ZX%<!`0`@_/]-0!B$`!!P1`$`
+M(```!$%00``M"`"$`!!``"T(!/X@0$`"#1`\`$T(`(7@5Y!$`0`@``(!`"`X
+M`"T(0`(-$``$05!$!`T0``"@'P"@'P@``0!(L$0!`"````$`2``!`$@``0!(
+M``$`2``!`$@``0!(``$`2`1^(&#01`$`(```@*`?____?_R!+0@`^N!7@3,`
+M(/R!+0@`@J!A$(`@"/!$`0`@``"#YE>"`0`@``1!4/R%#1``!``@%(!&"!2$
+M`!`0@"8($$4!`"``$`(!$/S_34`8A``0$(`F"/R##1``@"8((/K@5PX"`"`P
+M10$`(``@_B!0`((&$`">YU$``P`@"(#F"0R`Q@D$@"8(`((&$%!%`0`@``#Z
+MX%<!`@`@^/\M0!B"!A`0F@80``$`(``$05`8A`80<$4!`"````"@'P#ZYU<!
+M`0`@`!P'8`""!S@`H!\(``$`2``!`$B010$`(````0!(``$`2``!`$@``0!(
+M``$`2``!`$@$?B!@`("@'[!%`0`@`/___W\8@$8(^/\M0`"%X%>"#P`@`(`F
+M""#ZX%<.`0`@T$4!`"``'_X_8(```"`!_B!0`OY`@$``+0@``B%`/`!-"`"%
+MX%?P10$`(``%`@`@`(0@4/S_0&`X`"T(``(A0`"`0`@`>N%7`00`(!!&`0`@
+M`!"$!A`4`$$(%(0&$!`:`1``@$`(%!H!$!B"!A```@`@,$8!`"``$)H&$!2:
+M!A`8@@80`)H`$```H!\`H!\(``$`2``!`$A01@$`(````0!(``$`2``!`$@`
+M`0!(``$`2``!`$@$?B!@`("@'W!&`0`@`/___W_\@2T(`/K@5X+,_R=$`"T(
+M`/K@5P(&`"`#_C]@D$8!`"``#`!-"#P"`1`!_C]@1`(!$"@`+0@!_B!`*`(-
+M$```H!^P1@$`(``,``T(@*W^+P"M_R<``*`?`*S_)P0^#A``-@X0`#AN8]!&
+M`0`@`!1^CE,0&@X0`'R_87"]`@`<A08(`'K@5P$'`"``?!]@\$8!`"``J]D"
+M```$``@`>N!7@@0`(`!\'V```@```(W?+P```%`01P$`(``<@480`?X_8`!\
+M'V`\KP(```(`$`C^'V`0`*X)!(#M"S!'`0`@`""`#S@4$&X+`?X?8`"`#S@'
+M_A]@`(`/.`7^'V``@`\X4$<!`"``!#X.$``V#A``.&YC$'Z.4P```%``<10H
+M`'K@5P$!`"!P1P$`(``&_A]@@```(`+^'V`$@.T+((`/.!`0;@L$/@X0`#8.
+M$)!'`0`@```X;F,<?HY3$!H.$!0<#A`8'@X0````4(!H%"@`>N!7L$<!`"``
+M`0$`(`;^'V``#``@`"K_+P``H&$`?/]AE-\"``"`!PC01P$`(```@`90`'W@
+M5^@#```.!P`@`'S?89C?`@````<(`(`&4/!'`0`@``!]X%>X"P``C@,`(("+
+M\R\``$!@!/X?8`'^/V``EA`H$$@!`"```)H'$``:!Q`!_A]@$`"N"10`S@D8
+M`.X)!(#M"R"`#S@P2`$`(``<$&X+!#X.$``V#A``.&YC$'Z.4P```%"`5!0H
+M`'K@5U!(`0`@``$!`"`&_A]@@```(`/^'V`$@.T+((`/.!`0;@L&_A]@<$@!
+M`"```(`/.`0^#A``-@X0`#AN8Q!^CE,`?#]@@MD"``"$``B02`$`(```>N!7
+M`04`(````%``@$`0??X_F`!\'V!4L@(```(`$+!(`0`@`(`+_R\`?#]@G-D"
+M``"``!````!0`((@4`"K]R\```!0T$@!`"``!(#M"R"`#S@0$&X+!#X.$``V
+M#A``.&YC&'Z.4Q`:#A#P2`$`(``4'`X0`'S?8=#7`@```&<('(!!"`!ZX5>!
+M%0`@#(0A"!!)`0`@``Z(`0@``N"G!?X\@`"$'!@``B!``OX<B``"($`&_AR(
+M,$D!`"````*@00#\`B@``&<(((`A"!R`00@`A"!``(`@4`#\(&!020$`(```
+M``"``/K@5X$&`"``?-]AT-<"````9P@@@"$(`)H@0'!)`0`@`"""`1`<@$$(
+M`(0@0`"`(%``_"!@````@`#ZX%>"^?\GD$D!`"```'S?8=#7`@```&<(((`A
+M"`#\(%!'`0````/@5P4!`""P20$`(``!_A]@@```(````%`0`*X)%`#."02`
+M[0L@@`\X&!!N"]!)`0`@``0^#A``-@X0`#AN8R!^CE,0&@X0%!P.$!@>#A``
+M`*!A\$D!`"```!S'40!\_V%4L`(``)X'8`""(%`-_E]@`##8+P!\'V`02@$`
+M(`"@RP(```@`"!!^`&``>N!7`0$`(`+^'V"````@`?X?8#!*`0`@````@&$$
+MF$<0"'Z&B0681Q`(?H:)!IA'$`A^AHD'F$<04$H!`"```(*`80"`1Q`(?@"(
+M`8!'$`A^`(@"@$<0"'X`B`.`1Q!P2@$`(```?+]@R]D"``"$`@B``.(O_($-
+M$`!ZX%>"```@_(L-$)!*`0`@`/R!+0@!A``(`GX`0``0X!D`F@9@`)Y'8(#:
+MUB\`G`=`L$H!`"```!#`&0":IT$`?+]@P-D"``"$`@B`]^$O_($-$`!ZX%?0
+M2@$`(`""```@_(L-$/R!+0@!A``(`GX`0``0X!D`F@9@`)Y'8/!*`0`@`(#1
+MUB\`G`=``!#`&0":IT$`?%]@G+`"``8$`0@#>N!7$$L!`"```0$`(`1ZX%<"
+M1@`@W?X?8`#LX2\`>N!7`D0`(`":)F`P2P$`(`#=_A]@`(!`$!C^'V`!@$`0
+M`'P?8`!0\@$"@$`0"'X`B%!+`0`@``.`0!`(?@"(!(!`$`A^`(@%@$`0`'Q_
+M8-#7`@``@($(<$L!`"``)`@""`:`0!`(?@"(!X!`$`!\7V``4/(```2!80B8
+M0!"02P$`(``(?H:)"9A`$`A^AHD*F$`0"'Z&B0N80!``AH%A*`0""+!+`0`@
+M`!A^`(``?`!H`%#R``B`0!`(?@"("8!`$`A^`(@*@$`0T$L!`"``"'X`B`N`
+M0!`!_K]@`(J"80R80!`(?H:)#9A`$``$@6'P2P$`(``.F$`0"'Z&B0^80!`(
+M?H:)$)A`$`A^AHD1F$`0`(:!81!,`0`@`"<$`@@8?@"``'P`:`!0\@`.@$`0
+M"'X`B`^`0!`(?@"(,$P!`"``$(!`$`A^`(@1@$`0$HI&$`C^HH@3BD80%(1&
+M$`A^08A03`$`(``5A$80"'Y!B!:$1A`(?D&(%X1&$`!\7V"<L`(`!@0!"'!,
+M`0`@``)^`%`8?@"``'P`:`!0\@`4@$80"'X`B!6`1A`(?@"(D$P!`"``%H!&
+M$`A^`(@7@$80&/ZF00@$`0@``*!`)@0""`)^`("P3`$`(```"@!H`(!&$`'^
+MID$```!0`(!&$`'^ID$!A``(`GX`0-!,`0`@```<`$``$,`9`("!""<$`@@!
+M@!^``'S_852P`@``@$<0\$P!`"``"'X`B`&`1Q`(?@"(`H!'$`A^`(@#@$<0
+M*`0""`&`'X`030$`(``$@$<0"'X`B`6`1Q`(?@"(!H!'$`A^`(@'@$<0)`@"
+M"#!-`0`@``B`1Q`(?@"("8!'$"8$`@@*@$<0"`0!"`N`1Q``?%]@4$T!`"``
+MG+`"```$`0@!!($)"'Z&@0`8`&@"!($)$'Z&@0`8`&AP30$`(``#!($)&'Z&
+M@0`8`&A`?@!@`'K@5X$,`""%_A]@@)[A+Y!-`0`@``!ZX%>""@`@`)H&8`""
+M(%`>_E]@@+S7+X7^'V``@$80L$T!`"``'/X?8`&`1A!F_A]@!(!&$!C^'V`*
+M@$80`80&"`)^`$#030$`(```'`!``!#`&0!\/V",L`(``(``"`%^`$``@``0
+M`!P'8/!-`0`@`!``K@D4`,X)&`#N"02`[0L@@`\X(!!N"P0^#A``-@X0$$X!
+M`"```#AN8RA^CE,0&@X0%!P.$!@>#A`<(`X0("(.$```X&$P3@$`(```@L!A
+M`)X'8@!\'V`\W@(````@"!#^H$'\FPT0#(``"%!.`0`@```:($(`F^A7CA(`
+M(!&$(`@`F@!``GX`0`"!Z%<%$``@<$X!`"```)X`0`)^`$```>=7!0X`(/R!
+MK0D`A`8(`7K@5PP$`""03@$`(``!A"8(`OY`0`">!V``FB9@@%O6+P&$)@@"
+M_@!``![@0;!.`0`@`/R!K0D!A"8(`OX`0``:H$'\FPT0`)OH5XX$`"`!A"8(
+MT$X!`"```)H`0`)^`$``@>A7!0(`(`">`$`"?@!```'G5P;R_R?P3@$`(`#\
+M@:T)`)H(4`!ZX%>!`@`@`'P_8."W`@"4@0`(`7X`0!!/`0`@`)2!`!``H`=0
+M`!``&!``K@D4`,X)&`#N"1P`#@H@`"X*,$\!`"``!(#M"R"`#S@H$&X+!#X.
+M$``V#A``.&YC&'Z.4Q`:#A!03P$`(``4'`X0``#`80""H&$`?#]@=+8"`!R!
+M0`@!?@%`'($`$'!/`0`@``IZX%<+`0`@````4!R!`!"`,@(H`'P_8'2V`@`<
+M@4`(D$\!`"```GXA@`"$($``@B!``(0@0`+^((``?']@?-0"``"&0$"P3P$`
+M(```AH!!```&$`!\'V"BW`(```@`"!H`@1``>N=7@0L`(-!/`0`@`"+^84``
+M@H%`"`@'"`""(4``@(`0"@@'"`(`@A`,"`<(\$\!`"``!`""$&((!P@$``$0
+M7@@'""H`@1!8"`<("@"!$%H(!P@04`$`(``.`($07`@'"!(`@1"0"`<(%`"!
+M$)8(!P@6`($0`/KF5S!0`0`@``$.`"``?#]@=+8"`!R!0`@"?B&``(0@0`""
+M($``A"!`4%`!`"```OX@@`!\?V!\U`(`'/Y!0``"@4`(B`8(``*!00``AA!P
+M4`$`(``*B`8(`@""$`R(!@@$`((07H@&"`"&0$`H`($06(@&")!0`0`@``@`
+M@1!:B`8(#`"!$%R(!@@0`($0$`"N"10`S@D$@.T+L%`!`"``((`/.!@0;@L$
+M/@X0`#8.$``X;F,@?HY3$!H.$!0<#A#04`$`(``8'@X0``#@80""P&$`FJ91
+M`OX&@`!\/V!`V0(```)``/!0`0`@``!ZX5>"`0`@``(@0`"<`!"``0`@`?ZF
+M003ZYE<+^O\G$%$!`"``!/KF5P(!`"`"_A]@@"0`(/S_+4``'`=@@"'F+P!Z
+MX%<P40$`(`""(0`@_($-"`9ZX%<-(``@`!H`(`+^!H``!$%0`'P@0%!1`0`@
+M`$#9`@``A``0`)X'8``<)V``X^TO`!P'8(!:[B]T_A]@<%$!`"```'P_8$T$
+M``"`8Q,H`OX&@``$05``?"!`0-D"``"$`!"040$`(``0``<(1P1`$`7^'V"`
+M%``@`OX&@``$05``?"!`0-D"`+!1`0`@``"$`!`'_C]@$``'"$<"0!"`ZO\G
+M`OX&@``$05``?"!`T%$!`"``0-D"``"$`!`'_C]@$``'"$<"0!`&_A]@``L`
+M(`+^!H#P40$`(```!$%0`'P@0$#9`@``A``0!_X_8!``!PA'`D`0!/X?8!!2
+M`0`@```&`"`"?H"!`'R&`212`0````8XD%0``%%4``!?5```,%(!`"``:%0`
+M`'%4``![5```D%0``````%`0`*X)%`#."1@`[@E04@$`(``$@.T+((`/."`0
+M;@L$/@X0`#8.$``X;F,@?HY3$!H.$'!2`0`@`!0<#A`8'@X0'"`.$`!\'V"\
+MV0(`````"!``H`D,`$`(D%(!`"````@!"``$X$$$_M]A````4$"`1A`!_E]@
+M0X1&$`!\'V*P4@$`(`#@MP(`:@4H"#:"1A!*@$80`'P_8,K9`@``A"`(2()&
+M$-!2`0`@`$Z`AA`"_C]@-8)&$%"`1A`<@(8048!&$%*$1A!4@$80\%(!`"``
+M4X!&$%R`1A!=@$80`'P?8-#7`@`````(``@@"&""AA`04P$`(``"""`(8H*&
+M$`0((`AD@H80``@@"&R"AA`"""`(;H*&$#!3`0`@``0(``AP@(80`'P_8-BV
+M`@``B``(9H"&$`*(``AH@(804%,!`"``!(@`"&J`AA`8_A]@>H"&$`!\'V`\
+MW@(````@"`"(``AP4P$`(``!?@!@`'K@5P$!`"`"B"`(@```(%`)*`@`@H<0
+M`'P?8)!3`0`@`-#7`@`````("@@`""!^0&``>N%7@@0`(`!\'V+@MP(`L%,!
+M`"``4`D(""!^`&`@>N!7@@$`(-__`&``!`!H`("'$`!\'V#04P$`(``\W@(`
+M```@"`"(``@"?@!@`'K@5P$!`"`$B``(@```(/!3`0`@``K^'V`"@(<0!/X'
+M0@`@"&"`N?XO```(0@``)T``D,`9$%0!`"```/PG0.P!````(`A@`#W_+P``
+M)T``D,`9`'P?8+S9`@`P5`$`(``````(#`!`"`("@1`4@H80"/X_8`!\'V+@
+MMP(`3`-($%!4`0`@``'^7V``?+]AU-<"``"$1A`!_C]@@.SO+P!ZX%<"!``@
+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
+M``1!4`!\'V`QV@(```1`$`'^7V``?#]@<%H!`"``/=H"``"$0!````!0`((@
+M4`"F!2@`?!]@/-H"```$``B06@$`(```>N!7`0$`(`3^'V``8@`@`_X?8`!A
+M`"!X_A]@`'P_8+!:`0`@`-8#````/!(H@&``(`!\'V`PV@(```0`"`!ZX%<!
+M0P`@T%H!`"```/K@5X(,`"`!_E]@`'P_8#W:`@``A$`0`'P_8#+:`@#P6@$`
+M(```A``(`GK@5X(``"``A$`0`'P_8#+:`@``A``(`7K@5Q!;`0`@``(!`"`#
+M_A]@@&[H+P!\!T#``P```?X_8`"1!2@#_A]@,%L!`"```'R_86#:`@"`3@`@
+M`'P_8%S:`@``@``(`'P`4.`!``!06P$`(`"`3``@`'P?8##:`@``!``(`'K@
+M5P$P`"``?']@9-H"`'!;`0`@``"`(0@`^N!7@0,`(`!\'V!`V@(```(`$``$
+M05``A`$0D%L!`"```-(1*`!%`"``?#]@/=H"``"$``@`>N!7@@,`((#.$2BP
+M6P$`(```!$%0`'P_8,2T`@`@A0`0)(4`$``_`"``!$%0`(1`$-!;`0`@``!\
+M'V"8V@(```!`"`!ZX5<!!``@`'P_8#+:`@``A``(\%L!`"```7K@5X(!`"``
+M``!0`((@4``"`3@`?#]@9*X"``"```@07`$`(``!?@!``(``$`!\/V#$M`(`
+M)(%@"""!``@!?@!`(($`$#!<`0`@``EZX%>""@`@``1!4""%`!`!_@%`)($`
+M$"B!``@!?@!`4%P!`"``*($`$`'^7V``?#]@/=H"``"$0!``?!]@.-H"````
+M0`AP7`$`(```!$%``'P_8%S:`@``@``(```!0`"``!"`)0`@`_X?8)!<`0`@
+M`(`[Z"\`?!]@.-H"````0`@`?#]@7-H"``"```@```%`L%P!`"```(``$`!\
+M`%#@`0```?X_8`!>!2@"_A]@`'R_86#:`@#07`$`(`"`&P`@`'P?8##:`@``
+M!``(`'K@5P((`"``!$%0`'P_8/!<`0`@`#W:`@``A$`0`_X?8``NZ"\!_A]@
+M`(`&$````%``@B!0$%T!`"```%0%*`'^7V``?!]@,=H"```$0!``$P`@`'P?
+M8%#:`@`P70$`(``````(`'P_8$S:`@``@"`(`'Q?8-#7`@```&$(#HA!"%!=
+M`0`@`!"(80@`"()0@&[6+P'^'V"`-N`O``1!4`!\'V`\V@(`<%T!`"````1`
+M$("5$2B`"``@>/X?8`!\/V"'!```@.$1*``&`""070$`(``"?H"!`'R&`:!=
+M`0````8XCU8``*]6``#55@``-5<``+!=`0`@``"`!A```0`@`?X_8(`^!2@0
+M`*X)%`#."02`[0L@@`\XT%T!`"``&!!N"P0^#A``-@X0`#AN8QQ^CE,0&@X0
+M%!P.$!@>#A#P70$`(```?+]A0-H"``"`1@@`>N%7`2(`(`!\WV$XV@(````G
+M"!!>`0`@``#ZX%>!'P`@@%\`*`"`1@@``"<(`(0@0`#\H%'@`0``,%X!`"``
+M`!H@4`#\(&````"``/K@5X(&`"``&^!7@04`(`!\WV%07@$`(``XV@(````G
+M"`":H$$`&B!0`/P@8````(``^N!7`@$`('!>`0`@```;X%>"^O\G@%#4+P``
+MX&&`4@`H`!H@4`#\(&````"`D%X!`"```/K@5X(&`"``&^!7@04`(`!\WV$X
+MV@(````G"`":H$&P7@$`(```&B!0`/P@8````(``^N!7`@$`(``;X%>"^O\G
+M`'P?8-!>`0`@`&#:`@`````(`GK@5X(%`"``_"9`X`$```!\'V!<V@(`\%X!
+M`"````(`$`">!V``0]0O`)H&8`'^/V"`%04H``$`(`">!V`07P$`(```0-0O
+M$`"N"10`S@D8`.X)!(#M"R"`#S@<$&X+!`@@"#!?`0`@``#]X%?__P```@4`
+M(`(((`@`_>!7__\```(#`"``"``(4%\!`"```'W@5___```"`0`@`?X?8(``
+M`"````!0`(`/.```H`AP7P$`(```@(`(``IB0``&`1`$`(`(!(!@"`"(84`$
+M!@$0``"!")!?`0`@````H`@`"@)0`("`"``!XE<!`0`@`?X!0`0``1``@`\X
+ML%\!`"````"`"`"`0`@`!>)7`?Y_8`*&85``!>)7`?Y?8`X$05#07P$`(``$
+M`(`(!(`@"``#XE<!_A]@`@``4``#XE<!_C]@#H(@4/!?`0`@``#ZX5<!`@`@
+M`'K@5P$!`"````!0@`0`(`#ZX%<"`@`@$&`!`"```'K@5P$"`"``>N%7`0$`
+M(`'^'V"````@`OX?8`"`#S@P8`$`(```?!]@N+T"```!``@`@`\X!#X.$``V
+M#A``.&YC)'Z.4U!@`0`@`!`:#A`4'`X0&!X.$```H&&`$]0O``#`88#X_R\`
+M`.!A<&`!`"``^/\-0/S_+4"`.``H`'K@5X$``""`=Q$H^($-"``0(!B08`$`
+M(``0?D"(_($-"``>8$`%_@"```(`4`)^`(```@!``WX`@+!@`0`@```&`$``
+M$&`8`'P`8```__\0?B"(!7X!@``$`%`"?@"`T&`!`"````0`0`-^`(```B!`
+M`)``&!!^`(``!@!``(`&$!#^`(CP8`$`(``$@`80`!P'8``#U"\```!0$`"N
+M"10`S@D8`.X)!(#M"Q!A`0`@`""`#S@D$&X+!#X.$``V#A``.&YC&'Z.4_C_
+M#4``XO\O,&$!`"```'K@5X$``"``81$H^(%-"/R!+0@%?F&("WX!B``&8$!0
+M80$`(``,?@&(``9`0!O^`(``!$!`%?X`@``$0$`4_@"```0`0'!A`0`@``2`
+M[0L@@`\X&!!N"P0^#A``-@X0`#AN8Q!^CE,```!AD&$!`"```(+@8``$H6``
+M$`1@`(XC8(#!_R\``,!@`'KC5P(%`""P80$`(`````!0`(`"$`2``A"`!@`@
+M`!`$8`".(V``!``@`(X#8-!A`0`@```0)&"``@`@`7KC5P'\_R<">N-7@?S_
+M)P`!`"``BD)@\&$!`"````(`*``,`V`$@.T+((`/.!`0;@L``*`(`("`"`"(
+M8E`08@$`(```!@$0!`"`"`2`8`@`!F)0!`8!$```H`@`@(`(`(GB5S!B`0`@
+M``8!`"#__P%`!``!$`"`#S@$/@X0`#8.$``X;F,@?HY34&(!`"``$!H.$!0<
+M#A`8'@X0``"@80""X&'\_\U!`?X?8``<)V!P8@$`(`"`V@<H`'K@5P(6`"``
+M?!]@>+8"````0`@`?>%7@#X``)!B`0`@``('`"#\@2T(`/K@5X(%`"````!0
+M`!PG8(#3!R@`>N!7L&(!`"```@\`(/R!+0@``A]0Z`,```"`!Q``R?LO``L`
+M(`!\'V#08@$`(`!XM@(```!`"/R!+0@``@%0``/A5P8!`"``?`!`@3X``/!B
+M`0`@```<QU$`?>!7Z`,```4#`"`!?L=!`'P`4.@#````?>!7$&,!`"``Z`,`
+M``;]_R<`@`<0`+[[+P`<`$``@`80````4!``K@DP8P$`(``4`,X)&`#N"02`
+M[0L@@`\X(!!N"P0^#A``-@X0`#AN8U!C`0`@`!!^CE,`M=,O``1!4`!\/V`N
+MW@(``(1`$`'^7V``?#]@<&,!`"``N-D"``"$0!``L],O`'P_8-C<`@``?!]@
+MN-\"```"`!"08P$`(``!_A]@`?X_8(#<[B\`>N!7`0$`(`;^'V"``0`@`'P?
+M8+!C`0`@`(39`@`````(!(#M"R"`#S@0$&X+!#X.$``V#A``.&YCT&,!`"``
+M&'Z.4Q`:#A`4'`X0`*33+P!\/V"XV0(``(0@"`#ZX%?P8P$`(`""#0`@`'S?
+M83FS`@``!"<(`?K@5P(+`"`!_E]@`'R_81!D`0`@`#JS`@``A$80`'P_8#BS
+M`@``A$`0@)W3+P!\'V!(LP(`,&0!`"``@+3Y+P!\'V#TL@(`;OX_8`")^2\`
+M``!0`(!&$```1Q!09`$`(``'_A]@`((@4``Y]"^````@`);3+P!\'V"$V0(`
+M````"'!D`0`@`!``K@D4`,X)!(#M"R"`#S@8$&X+!#X.$``V#A``.&YCD&0!
+M`"``$'Z.4P"-TR\`!$%0`'P_8"[>`@``A$`0`?Y?8`!\/V"P9`$`(`"XV0(`
+M`(1`$`"+TR\```!0`?X_8`"W[B\`>N!7`0$`(-!D`0`@``;^'V"``0`@`'P?
+M8(39`@`````(!(#M"R"`#S@0$&X+\&0!`"``!#X.$``V#A``.&YC''Z.4Q`:
+M#A`4'`X0&!X.$```X&$090$`(``0@,<)@.CO+P``H&$`^N97@1``(`X()P@(
+MB`8(`('@5S!E`0`@`((.`"`0""<("H@&"`"!X%>"#``@$@@G"`R(!@@`@>!7
+M4&4!`"``@@H`(`!\'V!PL0(`"/X_8``$05``B?@O`)H&8`">)V!P90$`(`"`
+MY/(O````4``6ZR]>B`8(@#WK+P":!F"`%.HO`'K@5Y!E`0`@``$$`"`!_A]@
+M`?X_8``$05"`<.HO``,`(`">!V``<0`HL&4!`"``@`$`(`!\'V"$V0(`````
+M"!``K@D4`,X)&`#N"02`[0O090$`(``@@`\X'!!N"P0^#A``-@X0`#AN8Q!^
+MCE,!_A]@@`?K+_!E`0`@``#-[R\`W.DO`'K@5X$"`"`/_A]@`?X_8`'^7V``
+M8^HO$&8!`"``@`$`(`!\'V"$V0(`````"`2`[0L@@`\X$!!N"P0^#A`P9@$`
+M(```-@X0`#AN8Q!^CE,!_A]@`/WJ+P!\'V"$V0(`````"%!F`0`@``2`[0L@
+M@`\X$!!N"P0^#A``-@X0`#AN8Q!^CE-P_A]@<&8!`"```'P_8*P#``"`PQ`H
+M!(#M"R"`#S@0$&X+!#X.$``V#A"09@$`(```.&YC&'Z.4Q`:#A`4'`X0``#`
+M80'^/V``?!]@G+("`+!F`0`@```"0!`0``<(#GX`0("G[R\``*!A`'P?8+C9
+M`@``!``(T&8!`"```'K@5P$,`"``^N97`0@`(`"O[R\`@>97`)H&8``<)V#P
+M9@$`(`""!``@`+3R+P```%"`Y>HO7H@&"``-ZR\`'`=@`?X_8!!G`0`@``#E
+M]B^`#``@@#7Q+P`!`"``'`=@@%?O+P`<!V``@B!0,&<!`"```.'V+X`(`"``
+M^N97@08`(`"C[R\`@>97`)H&8``<)V!09P$`(``"`P`@`*CR+P```%"`V>HO
+M7H@&"``!ZR\``@`@`"OQ+W!G`0`@```!`"``'`=@`$WO+P!\'V"$V0(`````
+M"!``K@D4`,X)D&<!`"``!(#M"R"`#S@8$&X+!#X.$``V#A``.&YC%'Z.4Q`:
+M#A"P9P$`(````*!A`'P_8+C9`@``A``(`'K@5X$!`"````!0`(!`$-!G`0`@
+M`(#1ZR\`_>97```(`((#`"`!_C]@`'P?8#C>`@```D`0\&<!`"```'P?8$NW
+M`@```D`0"/X?8!``K@D$@.T+((`/.!00;@L0:`$`(```?%]@2[<"```$`0@`
+M>N!7`0$`(`""(%```D$0`((@4#!H`0`@``!\'V`\KP(```(`$````%``@`\X
+M`?Y?8`!\/V#5UP(`4&@!`"```(1`$`!\(&````$``/K@5P(!`""">N!7`@(`
+M(`'^7V!P:`$`(```?#]@@MD"``"$0!``?`!@```0``!ZX%<!`@`@`?Y?8)!H
+M`0`@``!\'V"EL`(```1`$````%``@`\X`?X_8`!\'V#5UP(`L&@!`"````)`
+M$`!\'V""V0(```)`$`!\'V"$V0(`````"`"`#SC0:`$`(``$/@X0`#8.$``X
+M;F,0?HY3#_X?8`""(%`!_E]@``?J+_!H`0`@``2`[0L@@`\X$!!N"P!\'V"$
+MV0(`````"`"`#S@$/@X0$&D!`"```#8.$``X;F,0?HY3</X?8`!\/V!1`P``
+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
+M!@@`_$9```(``,P!01"``@`@$'4!`"```/Q&0``"``#*!0$(('X`:,H!01!1
+MA`8(`'K@5X$"`"`P=0$`(```_$9```(``,H%`0@(?@!HR@%!$%2$!@@`>N!7
+M@0(`(%!U`0`@``#\1D```@``R@4!"$!^`&C*`4$04H0&"`!ZX%>!`@`@<'4!
+M`"```/Q&0``"``#*!0$(@'X`:,H!01``?!]@0-X"``!$``B0=0$`(``$>N!7
+M@@0`(%R$!@C\?@!@@'K@5X("`"``_$9```(``+!U`0`@`,H%`0@!?@!HR@%!
+M$$J$A@@">N)75H@F"`(!`"``@@!`T'4!`"``@```(`"(`(```@!H`/Q&0``"
+M``#&`8$0`/Q&0``"``#P=0$`(`#&"6$(1(@&"`"!X5>,```@Q@&!$`#("B@`
+M_$9```(``!!V`0`@`,8)80@`!@!@Q@&!$``08!A*A(8(`'P?8.#?`@``"``0
+M,'8!`"``5H@F"`!\'V">VP(```*`$`!\'V#<WP(```8`$$B$!@A0=@$`(``!
+M?@!0#WK@5XT'`"``"0`@`((@4``2`"`!_A]@R`%!$'!V`0`@```1`"`"_A]@
+MR`%!$(`/`"`#_A]@R`%!$``.`"`$_A]@D'8!`"``R`%!$(`,`"``@B!0`/Q&
+M0``"````"@`@`GZ`@0!\A@&P=@$`(`"X=@$````&.)A=``":70``IET``)U=
+M``"F70``IET``-!V`0`@`*9=``"@70``IET``*9=``"F70``IET``*9=``"F
+M70``\'8!`"``IET``*-=``#(`T$0`/Q&0``"``#(!0$(`'K@5X(!`"`0=P$`
+M(`#*!0$(!'X`:,H!01!.B"8(B(@&"`"!X%<"`P`@`((@4#!W`0`@``#\1D``
+M`@``W`.!$(R`!@@`!0`@`7X`4`"!X%<"`0`@4'<!`"``C(`&"(```"`<B`8(
+M`/Q&0``"``#<`8$0'(@&"-X!@1!P=P$`(``0`*X)!(#M"R"`#S@4$&X+"'Z.
+M4P0^#A``-@X0`#AN8Y!W`0`@`#A^CE,0&@X0%!P.$!@>#A`<(`X0("(.$"0D
+M#A`H)@X0L'<!`"``+"@.$#`J#A`T+`X0$(H-$!2,#1``@J!A``3A80"&H6+0
+M=P$`(```"()B`GX`@@``"$(#?@B"`'S?88R]`@``(&="``!`0O!W`0`@````
+M24("?DF"`'S?8DS!`@``)"M"`!_1+PB`*`@_^N!7$'@!`"``!0,`((`?T2\9
+M_A]@!/X_8``$05``L@8H@!$`(``D*P`P>`$`(``$_D"``"`G``"$8$``>NI7
+M`!PH0`$!`"`(@$`(@```(%!X`0`@``R`0`@`*D%H`!HA>`">('@,@@$0")X!
+M$`2:`1``A`$0<'@!`"```(`H"`/^8(`$@$D(``:!0!"`+0@`!F%``((!$!2`
+M+0B0>`$`(``$`@(0"(`H"`'^($`(@@@0`(`H"`'^($`__B!@`((($+!X`0`@
+M```,T2\```!0$`"N"10`S@D8`.X)'``."B``+@HD`$X*T'@!`"``*`!N"BP`
+MC@HP`*X*-`#."@2`[0LX$&X+((`/.`A^CD/P>`$`(``$/@X0`#8.$``X;F,D
+M?HY3$!H.$!0<#A`8'@X0'"`.$!!Y`0`@`"`B#A```,!A`!RG80":YD$`FN=!
+M`O[G@0!\/V),P0(`,'D!`"```)X(0@#YT"\`"()0`)[H00"(!Q`$"`@0"`@(
+M$`""(%!0>0$`(``"_D:``!I!0`-^08``?']@C+T"```&80`$_D"```B"4'!Y
+M`0`@``"$@4$`"`80`'KG5P("`"``?)]@!``A``"$04`$"`$0D'D!`"```7KG
+M5X(%`"``?)]@!``A``+^1H``&D%``WY!@`!\?V"P>0$`(`",O0(```9A``3^
+M0(``A$%`"`@!$`'^($!`^N!7"_#_)]!Y`0`@``#HT"\```!0$`"N"10`S@D8
+M`.X)'``."B``+@H$@.T+\'D!`"``((`/."00;@L$/@X0`#8.$``X;F,0?HY3
+M````4`!\/V`0>@$`(``P```)`.O0+P2`[0L@@`\X$!!N"P0^#A``-@X0`#AN
+M8S!Z`0`@`!!^CE,```!0`'P_8#````F`Y=`O!(#M"R"`#S@0$&X+4'H!`"``
+M!#X.$``V#A``.&YC%'Z.4Q`:#A```*!A@/'_+P3^'V!P>@$`(```FB9@`,C1
+M+P#U_R\0`*X)!(#M"R"`#S@4$&X+!#X.$)!Z`0`@```V#A``.&YC%'Z.4Q`:
+M#A```*!A`.K_+P+^'V``FB9@L'H!`"```,31+X#M_R\0`*X)!(#M"R"`#S@4
+M$&X+!#X.$``V#A#0>@$`(```.&YC%'Z.4Q`:#A```*!A@.+_+P'^'V``FB9@
+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
+M``"@80#ZYE>!+``@"/X&0`"FX"^T@`8(`'P_8/"``0`@`)S<`@``@``0`'P?
+M8`"O`@`````(``X`&`!\/V!`W0(`$($!`"```(`@"`'^($``CB`8;HA&"``.
+M01@#_G]@`,O@+P`<QU$P@0$`(`````!0@"C?+P``(&``^N!7@00`(`?ZX%>!
+M`P`@"/K@5U"!`0`@`($"`"`"^N!7@0$`(`%^QT$%>N=7!?G_)P?ZX%>"`@`@
+M<($!`"```'S?87"]`@`X`0<(`7X`0#@!!Q``^N!7@@X`(`":!F"0@0$`(`"`
+MK>8O`)H&8`""(%"`D>PO`'P_8)2N`@``@``(`7X`0+"!`0`@``"``!``?#]@
+M3+`"``B(!@@`@(`0"H@&"`*`@!`,B`8(T($!`"``!("`$`#G]R\`?-]A<+T"
+M`!`!!Q`8`0<0@.7[+P!\/V#P@0$`(`"`K@(``(``$`'^'V``"0`@!_K@5X$'
+M`"``F@9@`'GL+Q""`0`@``!\WV%PO0(`$`$'"!@!!Q"`W?<O$`$'$!_^'V``
+M?#]@,((!`"``G-P"``"`@!``?!]@_P,```*`@!````!0$`"N"10`S@E0@@$`
+M(``$@.T+((`/.!@0;@L`"()0`'KA5XX#`"``!&`(`(9`$'""`0`@``%^@D`!
+M?@!``?X@0``)X5>-_/\G`(`/.`S^OV``@`$0D((!`"``!'Z`0`2(`1`(?H!`
+M"(@!$`I^@$`,B`$0``B"4!B(`1"P@@$`(``<B`$0((@!$"2(`1`HB`$0#/K@
+M5PP4`"``"0`@`(""0-""`0`@`!"(`1"`#@`@`(""0!2(`1``#0`@`(""0""(
+M`1"`"P`@\((!`"```(""0!R(`1``"@`@`(""0"B(`1"`"``@`(""0"2(`1`0
+M@P$`(```!P`@`@J```9ZXE>-!0`@`GZ"@0!\A@$P@P$````&.#"#`0`@`+-@
+M``"V8```TV```+Q@``"Y8```OV```,)@````"H!`4(,!`"```02""`)^@D``
+M"H)``!"B&`"+X%>)]?\G*(`A"`#ZX%=P@P$`(``!$@`@`WX!D``0P!@$A``(
+M_G\`8``0H!@`"@-0`!"`&)"#`0`@```+XU<+!@`@`80`"`-^`%``$``8``'B
+M5XD#`"``B`!`L(,!`"``!00@"`=^`6`!@!^```(`8"R`01```0`@``B"4"R(
+M01#0@P$`(``LA`$(`'K@5X$"`"``?#]@?*X"``"```@!?@!``(``$/"#`0`@
+M`"B`(0@$A``(`7X`8"V`01"``0`@``B"4"R(01`MB$$0$(0!`"```(`/.`0^
+M#A``-@X0`#AN8Q!^CE,`?%]@<-<"````P0@PA`$`(```>N-7`0T`(`!\7V`[
+MLP(```1!"`!ZX5>!"@`@`'Q?8%"$`0`@`."V`@``!$$(`'KA5P((`"`,`*`(
+M$`"`"#@(8@@"B$((<(0!`"````9!4`*$@A`X"&((`(A""``&04``A((0.`AB
+M"!0(0@B0A`$`(```!D%0%`2"$``"`SB````@@//G+P2`[0L@@`\X$!!N"["$
+M`0`@``0^#A``-@X0`#AN8QQ^CE,0&@X0%!P.$`":IE$`?#]@T(0!`"`````A
+M``C$0`@,Q``(``0`8``.P!D@?@=@`'K@5P$!`"#PA`$`(``@_A]@"(!`%!!^
+M!V``>N!7`0(`(!#^'V``?#]@```A`!"%`0`@``B`0!0!?@=@`'K@5P$%`"``
+M?!]@3-X"``````@`>N!7,(4!`"``@0``(``"`#@!_E]@`'P_8```(0`(A$`4
+M"'X'8`!ZX%=0A0$`(`"!#P`@````4/^!31`(_A]@`'P_8```(0`(@$`4`'3W
+M+W"%`0`@``!\/V!TUP(`,(``$/__#4"`*.DO``#`80!ZYU<!!``@D(4!`"``
+M``@'"``<`$``6]@O``"@80#ZYE<"#@`@`!P'8("]Z"^PA0$`(```?!]@]+8"
+M``%%``@`>N!7`O/_)_^%#0@`>N!7@O'_)]"%`0`@``!\/V```"$`",1`"`S$
+M``@`!`!@``X`&$!^`&``>N!7\(4!`"``@00`($#^'V`(@$`4#,0`"+]_`&`,
+M@$`4`?Y?8`!\'V`0A@$`(`#TM@(`4`5`%`":!F`0`*X)%`#."02`[0L@@`\X
+M'!!N"S"&`0`@``0^#A``-@X0`#AN8Q1^CE,0&@X0`'R_8+S9`@``@`((4(8!
+M`"``$`!`"`P`8`@`B($(`OX?8`*`@1`4`($0`)JF44`:01!PA@$`(``!_C]@
+M0P)!$`!\'V#@MP(`:@4`"#8`01!*&D$0`'P?8)"&`0`@`,K9`@``!``(2`!!
+M$$X:@1`"_A]@-0!!$%`:01`<&H$0L(8!`"``41I!$%("01!4&D$04QI!$*#^
+M'V!<`$$071I!$`!\'V#0A@$`(`#0UP(`````"``((`A@`H$0`@@@"&("@1`$
+M""`(9`*!$/"&`0`@```((`AL`H$0`@@@"&X"@1`$"``(<`"!$`!\/V#8M@(`
+M$(<!`"```(@`"&8`@1`"B``(:`"!$`2(``AJ`($0&/X?8'H`@1`PAP$`(``!
+M_A]@``9B0`"`@1``@`((`?X_8("0Z2\`>N!7@@,`(%"'`0`@``!\/V#\K`(`
+M`(``"`%^`$``@``0`)H&8``#`"``?#]@<(<!`"``9*T"``"```@!?@!``(``
+M$`'^'V`0`*X)!(#M"R"`#SB0AP$`(``4$&X+`'P_8-G:`@``@$`0`?X_8`!\
+M'V#8V@(```)`$+"'`0`@``"`#S@$/@X0`#8.$``X;F,0?HY3`'R?8-7:`@``
+M!*((T(<!`"```'Q_8,C:`@``@$$(`(`!$``"0A``B^!7`0,`(`!\/V#PAP$`
+M(`#`V@(``(0`"`!ZX%<!"``@``4`(`#ZX%>!!@`@```A4!"(`0`@``#\(&``
+M``"``/K@5P($`"```>%7`0,`(`#X_R<```!0,(@!`"```(!`$`!\'V#PLP(`
+M`#/U+P2`[0L@@`\X$!!N"P0^#A!0B`$`(```-@X0`#AN8Q!^CE,!^N!7@@$`
+M(`!\7V#,V@(````!$'"(`0`@``!\'V#6V@(```)`$`#ZX%<!!0`@`'P_8,#:
+M`@``A``(D(@!`"```'K@5X$"`"````!0`(!`$`!\'V#PLP(`@"7U+P2`[0NP
+MB`$`(``@@`\X$!!N"P0^#A``-@X0`#AN8Q!^CE,!^N!7@@$`(-"(`0`@``!\
+M7V#$V@(````!$`!\'V#4V@(```)`$`!\/V!TN`(`\(@!`"```(0`"`!ZX%<!
+M`0`@````4`"`0!``?!]@U-H"```$``@0B0$`(```>N!7`04`(`!\/V#`V@(`
+M`(0`"`!ZX%>!`@`@````4#")`0`@``"`0!``?!]@\+,"```3]2\$@.T+((`/
+M.!`0;@L$/@X04(D!`"```#8.$``X;F,0?HY3`?K@5X(!`"``?%]@T-H"````
+M`1!PB0$`(```?!]@U]H"```"0!``^N!7`04`(`!\/V#`V@(``(0`")")`0`@
+M``!ZX%>!`@`@````4`"`0!``?!]@\+,"`(`%]2\$@.T+L(D!`"``((`/.!`0
+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
+M`0`@`&W=`@``!``(``'A5P$/`"`$A`8(`7X`8`!ZX%>!"0`@L)4!`"```'P_
+M8-RO`@`4B$8(!(@`"``!X5<"!0`@$HA&"`*(``C0E0$`(````>%7`@,`(!"(
+M1@@`B``(``'A5P(!`"`!_A]@@```(/"5`0`@`````%``>N!7@@,`(`&$)@@!
+M_@!@`'K@5X$"`"`"_@!@$)8!`"```'K@5P$!`"````!0@```(`'^'V`0`*X)
+M%`#."02`[0LPE@$`(``@@`\X&!!N"P0^#A``-@X0`#AN8Q!^CE,`%>XO`'P?
+M8%"6`0`@`*#<`@``!``(`'K@5P!\'V#4M0(`````"`$$`"#_>^!7<)8!`"``
+M`'P?8-C<`@`!!@`@``_[+P!\'V!PO`(```0`(/][X%>0E@$`(```?!]@V-P"
+M``$$`"``"_LO`'P?8'"\`@```@`@!?X_8+"6`0`@``_^7V`!_G]@@`$`(&[^
+M/V!X_E]@`(9A4``(@E``2]TOT)8!`"``````4("9ZB\`?#]@H*X"``"```@!
+M?@!``(``$`2`[0OPE@$`(``@@`\X$!!N"P""8&``A>!7B@,`(`""($``D"`8
+M`("`8!"7`0`@``!ZXE<"`0`@`(7@5XO\_R<`@(!@`'KB5P$!`"``@@!@,)<!
+M`"``@```(`"&`6``@`\X!#X.$``V#A``.&YC$'Z.4P!ZX%=0EP$`(``"`0`@
+M````4``%`"``?#]@]*X"``"(0`AH""`(`(0@8'"7`0`@``"0(!A@"``(`(``
+M<``0`!B``0`H!(#M"R"`#S@0$&X+D)<!`"`````@8````%``AF%0`8:?@``"
+M0F``>N%7@0``(``0`ABPEP$`(``!_D%``!!A&`3ZX5>+^_\G`(`/.`""(%`!
+M@E^```!!8-"7`0`@``!ZX5<!`0`@`((`8(`"`"`!_B!``(X@&`3ZX%<,^_\G
+M\)<!`"``````4`"`#S@`@F!@`(7@5PP#`"``A"`8`("`8`!ZXE<0F`$`(``"
+M`0`@`(7@5PG]_R<`@(!@`'KB5P$!`"``@@!@@```(#"8`0`@``"&`6``@`\X
+M``1!4`&$?X``@"%@`/K@5P$!`"``D`$84)@!`"````(`(`%^(4``D$`8!'KA
+M5PO[_R<`@`\X!#X.$``V#A!PF`$`(```.&YC$'Z.4P""(%``?!]@M-H"```"
+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
+M(``!`"`(`%[,+P!\`&@```"``'P_8`$`(`B`7,PO!(#M"Y">`0`@`""`#S@0
+M$&X+!#X.$``V#A``.&YC$'Z.4P!\'V`!`"`(L)X!`"``@%;,+P!\`&@``0``
+M`'P_8`$`(`@`5<PO!(#M"R"`#SC0G@$`(``0$&X+!#X.$``V#A``.&YC$'Z.
+M4P!\'V`!`"`(`$_,+_">`0`@``!\/V#LOP(``($@"`"``&@`?#]@`0`@"(!,
+MS"\$@.T+$)\!`"``((`/.!`0;@L$/@X0`#8.$``X;F,4?HY3$!H.$`!\OV$P
+MGP$`(``8`#```#G,+P"`)@@`_"!H`(````""!A``.<PO$`"N"5"?`0`@``2`
+M[0L@@`\X%!!N"P!\'V`0`#``````"`!\(&`/PP``<)\!`"```((?4``"`&@?
+M?@"(`(`/.`!\'V`0`#``````"`)^(&"0GP$`(```@A]0``(`:!]^`(@`@`\X
+M`'P?8!``,``````(!'X@8+"?`0`@``""'U```@!H'WX`B`"`#S@`?!]@$``P
+M``````@(?B!@T)\!`"```((?4``"`&@??@"(`(`/.`0^#A``-@X0`#AN8Q1^
+MCE/PGP$`(``0&@X0``"@80!\'V`0`#``````"`%^(&``@A]0``(`:!"@`0`@
+M`!]^`(@`>N!7@0,`(`!\'V```"`(`"C,+P`:(&``@A]0,*`!`"````(`:!]^
+M`(@0`*X)!(#M"R"`#S@4$&X+`'P?8!``,`!0H`$`(``````(`'P@8`"`````
+M@A]0``(`:!]^`(@`@`\X`'P_8'"@`0`@`!``,```?!]@W*D"``P!``@`@``0
+M`(`/.`0^#A``-@X0D*`!`"```#AN8Q1^CE,0&@X0``"@80/ZYE>!!0`@@`K,
+M+P7^1H"PH`$`(```?#]@W*D"```"04`$`2$(#`%A"`"`0`@`!D%P`(0`$-"@
+M`0`@```(S"\```!0$`"N"02`[0L@@`\X%!!N"P0^#A``-@X0\*`!`"```#AN
+M8Q1^CE,0&@X0``"@80/ZYE>!!0`@@/[++P7^1H`0H0$`(```?#]@W*D"```"
+M04`$`2$(#`%A"`"`0`@`!D%H`(0`$#"A`0`@``#\RR\```!0$`"N"02`[0L@
+M@`\X%!!N"P0^#A``-@X04*$!`"```#AN8Q1^CE,0&@X0`(*@801ZX%<%`0`@
+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
+M@*K^+P``(&``^N!7`E4`(`!\7V`<RP(`#``!"`!ZX%=PIP$`(`"!/0`@`?X?
+M8`#\)T```@``H($`$`!\'V!X5@``I($`$)"G`0`@``7^'V#P@4T0`)XG8`@`
+M`0@$?F"`$``!"``&0`#HA0T0L*<!`"``]/Y_0`!\WV%TJ0(````'"``&`!`$
+M`&`(\/]A8`0&`!#0IP$`(`#P@:T(`_X?8/3^?T``"()0``S#4`#S^2\``"!@
+M`/K@5_"G`0`@`()"`"``?']@3+T"`#R``0@`?"!H``(``#2``0@``@`4$*@!
+M`"``!OX?8/"!31#T@:T)[)L-$```!P@``*!A"'X`0```!Q`PJ`$`(```?%]@
+MQ(L"`'A^(4```^!7C@``(``$!Q#H_TU``'S?85"H`0`@`)"H`@`8``<(````
+M"`@`)P@#_B"``(``0````1`0``<(<*@!`"````#@"0A^!T*`$,LO"``G"`'^
+M($``@^=7C0``(`">(%"0J`$`(````@@0@`_++^B!30CP@:T([('-"`/^'V``
+MFB9@"/Y_8+"H`0`@``'^GV``V?DO```@8`#ZX%>"*``@`'Q_8$R]`@`\@`$(
+MT*@!`"```'P@:``"```T@`$(``(`%`!\7V`<RP(`"``!"`%^`$#PJ`$`(``(
+M``$0$'K@5P(!`"``@B!0"`(!$`!\7V`<RP(`#``!"!"I`0`@`/]_`$`,``$0
+M@&L!*(`&`"#XA0T(!7K@5XT5`"`"?H"!,*D!`"```'R&`3RI`0````8X.6D`
+M`%MI```Q:0``=FH``'9J``!0J0$`(`"T:0`````@8`#ZX%<"%0`@_/]-0`!\
+MOV%,P0(`&/ZF0'"I`0`@`!R`)@CD_XU``'Q_8$R]`@`H@`$(````"````A``
+M?-]AD*D!`"``C+T"`%``9PCD@0T(``8`4`1^`(@``^!7A0,`(``"`%"PJ0$`
+M(`````$0"(`B"````0@``^!7C@(`(``!`"!`?@!`@/O_)]"I`0`@``""(%``
+M`@$0_($-"`!ZX%>"1_\G`'Q?8%2V`@```0$(\*D!`"```'K@5P$$`""`1>PO
+M```@8`#ZX%<!`@`@/_X?8``$05`0J@$`(`"`=``H@```(````%`0`*X)%`#.
+M"1@`[@D<``X*!(#M"S"J`0`@`""`#S@\$&X+!#X.$``V#A``.&YC''Z.4Q`:
+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
+M``@`>N!7@@P`(`!\'V"8R0(```@`"`-ZX%>"`P`@4+`!`"```?X?8`!\/V``
+M?0```'Q?8$`+````AF%0``0`(`1ZX%=PL`$`(`"!`P`@`?X?8`!\/V!`"P``
+M`'Q?8`!]```!_G]@`/GD+Y"P`0`@``'^/V``?!]@@-D"```"@!`:B`<(#@@H
+M"``"`%``$*`9L+`!`"``"(0("`%^`&``>N!7`00`(`!\/V`<K0(``(``"``:
+M`$#0L`$`(```@``0`'P?8""M`@``"@`@#(`I"`"(``@``@!`#`@`"/"P`0`@
+M``!]X%>'@0```@,`(`!\/V#8UP(``(``"``:`$``@``0$+$!`"````4`(`!\
+M/V`$K0(``(``"``:`$``@``0`'P?8`BM`@`PL0$`(``4A"<(`)I&8`#JU"\4
+MB$@(`'P_8'"M`@``@``(``0`0%"Q`0`@``"``!`4A"<(:@@)"`"!X%<"!``@
+MB@@)"````$```"E`<+$!`"``=H@`"``:`$!V@(`0````4'0`B1````@(`*8I
+M8(#=X2^0L0$`(```>N!7`@(`('3^'V``?#]@"@<```!>!R@`I@E@@(7Y+["Q
+M`0`@``"F"6``4>(O`'P?8'"Q`@`"_C]@``1!4(#\[B^`3P`@T+$!`"``%(0G
+M"&H("0@`@>!7`@D`((H("0@```!`&(A'"```*4#PL0$`(`"`B``(``0`0("`
+M@!"*"`D(````0!B(1P@``"E`=H@`"!"R`0`@`````4!V@(`0&(A'"'0(*0@`
+M`@%`=`")$!B(1P@`?#]@,+(!`"``=*T"``"```@`!`!``(``$`!\'V!XK0(`
+M%(0G"(#'U"]0L@$`(```?#]@D*T"``"```@!?@!``(``$'0(*0@`?!]@X-<"
+M`'"R`0`@```$``@`@>!7BP(`(`'^'V``@B!0@'/J+P```%!T`(D0D+(!`"``
+M#@@H"!J(!P@``^!7`0(`(`X`B!````!0"0!($`P`B!"PL@$`(``6A"<("`0(
+M"``"`$`(`$@0%H0G"`D$2`@`A`!`"0!($-"R`0`@```.0!@*"`@(``'A5PH"
+M`"`(A`@(`7X`8`!ZX%>!#0`@\+(!`"```'P_8(RM`@``@``(`7X`0`"``!``
+M``@(`*8I8("MX2\0LP$`(```>N!7`@(`('3^'V``?#]@4@<````N!R@`I@E@
+M@%7Y+S"S`0`@``"F"6``(>(O`'P?8'"Q`@`"_C]@``1!4(#,[B\!_A]@4+,!
+M`"```((@4(!9ZB\`'@`@%H0G"`P("`@`@`!`#`"($(/^'V!PLP$`(``3@$<0
+M`?Z_81:$)P@7A`<(``(`0!>`1Q`$`"@(`*8)8)"S`0`@``'^7V``U/XO`!,`
+M(`!\'V!PL0(``OX_8``$05``P.XOL+,!`"```!``(`?^'V`3@$<0@/O_)P/^
+M'V`3@$<0``T`(`/^'V#0LP$`(``3@$<0@/C_)W3^'V``?#]@M0<````6!R@`
+M"0`@$X0'"/"S`0`@`/)ZX%<!^?\G\7K@5X'Y_R<#>N!7@?7_)XD"`"`!>N!7
+M$+0!`"``@;?_)P)ZX%<!?_\G`/?_)P5ZX%>!\?\G\'K@5P'R_R<PM`$`(`"`
+M]/\G`/KF5P(!`"``I@E@`#/Y+P":!F"````@````4%"T`0`@`!``K@D4`,X)
+M&`#N"1P`#@H@`"X*)`!."B@`;@H$@.T+<+0!`"``((`/."P0;@L$/@X0`#8.
+M$``X;F,P?HY3$!H.$!0<#A"0M`$`(``8'@X0'"`.$/S_34``?+]A3,$"`"3^
+MAD`H@"8(\/]M0+"T`0`@``!\'V!,O0(`.```"`````@`@`$0`'S?88R]`@!X
+M`&<(T+0!`"``\($-"``&`%`$?@"(``/@5X4#`"```@!0```!$`@`(@CPM`$`
+M(`````$(``/@5XX"`"```0`@0'X`0(#[_R<`@B!0``(!$!"U`0`@`/R!#0@`
+M>N!7`6,`(/C_#4+T_^U!`'S?88R]`@``?+]A,+4!`"``3,$"``!YR2\H@"8(
+M`_Y`@'P`)P@`A&!``(0@```""!!0M0$`(``$@"$(`(('$'A^QT`D_J9```1!
+M4`2`(@@`A"!`/_X@8'"U`0`@``3^@(```&,(`((@4`"(@4```@(0`7Y!0`%Z
+MX5>%^O\GD+4!`"``"(`B"`'^(%`(@@(0!(`B"`'^($`__B!@!(("$(!LR2^P
+MM0$`(```@B!0`/K@5P$W`""`4``@`'P_8)"H`@`0@``(``#`"="U`0`@``"`
+MH`D`9<DO`(`F"`'^($```^=7C0``(`"<(%``@@80\+4!`"```&3)+P!\7V`<
+MRP(````!"`%^`$````$0$'K@5P(!`"`0M@$`(```@B!0``(!$`!\/V!4M@(`
+M"($`"`%^`$`(@0`0`OX?8#"V`0`@`(#._"\``"!@`/K@5X)``"#T@0T(`((@
+M4`@"`!``(@`@4+8!`"```'Q?8!S+`@````$(`7X`0````1`0>N!7`@$`(`""
+M(%!PM@$`(````@$0`'P_8)"H`@`0@``(``#`"0"`H`F`3LDO`(`F")"V`0`@
+M``'^($```^=7C0``(`"<(%``@@80@$W)+P+^'V``O_POL+8!`"`````@8`#Z
+MX%<",0`@]($-"`""(%`(`@`0#`(`$``2`"#0M@$`(```?%]@',L"`````0@!
+M?@!````!$!!ZX%<"`0`@`((@4/"V`0`@```"`1``?#]@D*@"`!"```@``,`)
+M`("@"8`^R2\`@"8($+<!`"```?X@0``#YU>-```@`)P@4`""!A"`/<DO`OX?
+M8`"O_"\PMP$`(````"!@`/K@5P(A`"#XA0T("GK@5P(-`"#T@0T(`'K@5U"W
+M`0`@`($+`"`$""`(`/K@5P$!`""`F^$O``D`(/;^/T`$`H`0<+<!`"``@`<`
+M(/B%#0@$?@!0!GK@5XT%`"`"?H"!`'R&`92W`0"0MP$`(`````8X<&T``.QM
+M``"4;0``[&T``+1M``#L;0``M&T``+"W`0`@`/S_34``?+]A3,$"`"3^AD`H
+M@"8(\/]M0`!\'V!,O0(`T+<!`"``.```"`````@`@`$0`'S?88R]`@!X`&<(
+M\($-"``&`%#PMP$`(``$?@"(``/@5X4#`"```@!0```!$`@`(@@```$(``/@
+M5Q"X`0`@`(X"`"```0`@0'X`0(#[_R<`@B!0``(!$/R!#0@`>N!7,+@!`"``
+M`IW_)X#^Z2\``"!@`/K@5P$"`"!%_A]@``1!4`"M_B]0N`$`(`"````@````
+M4!``K@D4`,X)&`#N"1P`#@H$@.T+((`/.'"X`0`@`#`0;@L$/@X0`#8.$``X
+M;F,D?HY3$!H.$!0<#A`8'@X0D+@!`"````#`80""X&$`?!]@"0`@"(`8R2\"
+M?@!@`("_40"`IFFPN`$`(``?_J:)_/\M0`!\7V!,O0(`)``!"`!```@!?@!@
+M`'K@5]"X`0`@``'^'V`"``!0`(``$/C_+4`T``$(`$``"`%^`&``>N!7\+@!
+M`"```?X?8`(``%``@``0`)X'8`'^/V"`&PDH`'P_8-3?`@`0N0$`(```@``0
+M`((@4`!ZX%>!`0`@`(`'"`IZX%>%```@`?X_8#"Y`0`@```$05``^N97@0@`
+M(`!\?V"LO`(`!(`!"`!ZX%<!!@`@4+D!`"```(`!"`!ZX%>"!``@_($-"`!Z
+MX%<"`P`@^($-"`!ZX%=PN0$`(`""`0`@`/K@5X$``"`!_E]@``0'$````%`0
+M`*X)%`#."9"Y`0`@`!@`[@D$@.T+((`/."00;@L`@B!0`'P?8*R\`@`$`@`0
+ML+D!`"```(`/.`0^#A``-@X0`#AN8QA^CE,0&@X0%!P.$`5^((#0N0$`(```
+M@"!0`OX@@`"`($`#_J"!````4`#4_"\``"!@`/K@5_"Y`0`@``(.`"`!_A]@
+M@-'\+P``(&``^N!7@@L`(`!\'V!5;P``$+H!`"``@`?X+P":)D`#_A]@`/3\
+M+P``(&``^N!7`@<`(`!\WV$PN@$`(`!<W@(`````4``<)V``X?PO```'"``:
+M`$``?"!0_`,``%"Z`0`@``+^'V``[?PO```@8`#ZX%<!`@`@:_X?8``$05``
+M:?XO<+H!`"``@```(````%`0`*X)%`#."02`[0L@@`\X&!!N"P0^#A"0N@$`
+M(```-@X0`#AN8R1^CE,0&@X0%!P.$`5^((``@"!0`OX@@+"Z`0`@``"`($`#
+M_L"!````4`'^/V"`W_PO`'R_85S>`@``@`8(T+H!`"```!P`0`!\(%#\`P``
+M^/]-0`+^'V"`\?PO```@8`#ZX%?PN@$`(``")@`@`(`&"```/U#H`P``^($-
+M"``"P$$`'`=@??X_F!"[`0`@``"_R2\``*!A!?X&@``:`%`"?@"``!H`0`-^
+M`(````=0,+L!`"`````_4.@#``#T@PT0!/K@5PX!`"````!0@,[\+_2!+0A0
+MNP$`(``#^N!7C@0`(/3_+4````!0@+S\+P``(&``^N!7@A8`('"[`0`@`/2!
+M+0@#^N!7C?O_)P```%!]_C^8`,?\+P``(&``^N!7D+L!`"```A(`(`'^'V#Z
+M_C^8`,3\+P``(&``^N!7`@\`(`/^'V"PNP$`(```?#]@`'T``(#`_"\``"!@
+M`/K@5X(+`"#Z_C^8`'P?8-"[`0`@`'BV`@```@`0````4`"A_"\``"!@`/K@
+M5P('`"`!_A]@\+L!`"``@)[\+P``(&``^N!7@@0`(`!\'V!*````@,CW+_S_
+M+4`0O`$`(``"_A]@`.+\+P``(&``^N!7`0(`(&S^'V``!$%0`#'^+S"\`0`@
+M```#`"``?!]@U-\"````(`@`F@9@@'$(*````%`0`*X)4+P!`"``%`#."02`
+M[0L@@`\X)!!N"P'^/V``?!]@K+P"```"`!!PO`$`(```@`\X`((@4`!\'V"L
+MO`(```(`$`"`#S@$/@X0`#8.$)"\`0`@```X;F,8?HY3@([P+P!\/V!TUP(`
+M((``$(`<`"@`A\@OL+P!`"``_/\-0/C_+4``=_\O`'K@5X$"`"````!0)OX_
+M8``$05#0O`$`(`"`'/XO@.T%*/R!+0@`^N!7@00`(/B!#0@`F?\O`'K@5_"\
+M`0`@`($"`"````!0)OX_8``$05"`%OXO@.<%*`!]R"_\@2T($+T!`"```/K@
+M5P$'`"``?#]@!``P``"```@$?@!H`(``$`'^_Q\PO0$`(`#___]_____?___
+M_W____]_____?____W____]_@```(%"]`0`@``'^_Q_\@2T(`/K@5P'G_R>`
+M<,@O^($-"`"D_R\`>N!7<+T!`"``@0(`(````%`F_C]@``1!4(`&_B^`UP4H
+M`&W(+P#A_R>0O0$`(``$/@X0`#8.$``X;F,<?HY3$!H.$!0<#A``FJ91`'P?
+M8+"]`0`@`,W>`@``!``(`'K@5P$!`"``UO\O`!@`(`!\'V#0K@(`T+T!`"``
+M````"`!ZX%>!$P`@`'P?8*G9`@``!``(`'K@5P(1`"#PO0$`(```*-`O`'K@
+M5X(/`"``?!]@RMX"```(``@`>N!7`@T`(!"^`0`@``!\'V#)W@(```0`"`!Z
+MX%>!"P`@`%O(+P``P&'\_PU`,+X!`"```?X_8(!U""@`>N!7`!P'8`$%`""`
+M6<@O_($-"`-ZX%=0O@$`(`".`P`@@.O/+P!ZX%<!`@`@`?Z_88#!_R^````@
+M@%3(+W"^`0`@``#ZYE<"`@`@@+S_+P`!`"`!_K]A`.?_)X!+R"\`^N97D+X!
+M`"``@00`((`3T"\`>N!7@@(`(`!\'V#*W@(```@`"`!ZX%>PO@$`(`"!```@
+M`+7_+Q``K@D4`,X)!(#M"R"`#S@<$&X+!#X.$-"^`0`@```V#A``.&YC%'Z.
+M4Q`:#A```*!A`(`&"`)^`%!#>N!7\+X!`"``#94`((!P`"``@B!0`'P?8#S+
+M`@```@`0`/GU+X"A!B@0OP$`(``!>N!7@@$`(`+^'V"`H08H`(\`((">!B@$
+M>N!7@0(`(#"_`0`@``!\'V"0U@(```0`"`!ZX%<!BP`@`_X?8`"<!B@`&,LO
+M4+\!`"```(D`(!"`!@@#?B!@`'P?8'BN`@!L`@`0`)8&*`%ZX%=POP$`(``"
+MA0`@$/X&0`#0RR^`@P`@`),&*`%ZX%>!`0`@@)$&*)"_`0`@``1ZX%>"@``@
+M#(`&"!#^)D``>,LO@'X`(`".!B@!>N!7L+\!`"``@0$`((",!B@$>N!7@GL`
+M(`R`!@@0_B9``"_++X!Y`"#0OP$`(```B08H`7K@5X$!`""`AP8H!'K@5X)V
+M`"`0@`8(`#[*+_"_`0`@``!U`""`A`8H`7K@5X$!`"``@P8H!'K@5P)R`"`0
+M_@9`$,`!`"```#7*+X!P`"``@`8H`7K@5P%O`""`?@8H`&X`((!]!B@PP`$`
+M(``!>N!7@0$`(`!\!B@$>N!7`FL`((`4RR\`:@`@@'D&*%#``0`@``%ZX%>!
+M`0`@`'@&*`1ZX%<"9P`@$(`&"`!6RB^`90`@<,`!`"``$(`&"(!5RR\`9``@
+M$(`&"`!"RR^`8@`@`'(&*`%ZX%>0P`$`(`"!`0`@@'`&*`1ZX%>"7P`@$(`&
+M"(#;RR\`7@`@@&T&*+#``0`@``%ZX%>!`0`@`&P&*`1ZX%<"6P`@$(`&"``R
+MRB^`60`@T,`!`"``$/X&0`#[RR\`6``@$(`&"``6S"^`5@`@$(`&"(#DRR_P
+MP`$`(```50`@#(`&"!#^)D"`%<LO`%,`((!1RB\`4@`@@%;*+Q#!`0`@``!1
+M`"`0@`8(`,G++X!/`"`,@`8($/XF0`!7RB^`30`@,,$!`"``@!?*+X!,`"``
+M7`8H`WK@5X$!`""`6@8H`GK@5X(%`"!0P0$`(``$_A]@@%H&*`"`!@@]>N!7
+M@@$`(`'^'V``*LHO@$4`('#!`0`@`````%"`*,HO`$0`((!3!B@!>N!7@D(`
+M(`'^'V``?#]@D,$!`"``>+`"`!R`0!``0``@@$\&*`%ZX%>!`0`@`$X&*`1Z
+MX%>PP0$`(``"/0`@#(`&"!#^)D"`(LLO`#L`(!#^!D"`2LLO@#D`(-#!`0`@
+M`!"`!@@`1\LO`#@`(`"W]2\`-P`@$(`&"(!YRR^`-0`@\,$!`"``$(`&"`#A
+MRB\`-``@`/3^+P```%"`2O4O`#(`(!"`!@@0P@$`(```\<HO@#``(!"`!@@`
+M?#]@>+`"``R``!``+@`@$(`&"##"`0`@``""(%`$_E]@`$O*+X`K`"`0@`8(
+M%/XF0`+^7V"`2,HO4,(!`"```"D`(!#^!D"`5<LO@"<`(!#^!D``L,HO`"8`
+M(`R`!@APP@$`(``0_B9`@.7++P`D`"`"?H"!`'R&`8S"`0````8XOF\``)#"
+M`0`@`.=P``#G<```YW```-5O``#G<```X&\``.IO``#T;P``L,(!`"``_6\`
+M``9P```+<```$W```!QP``#G<```'W```")P``#0P@$`(``K<```-'```.=P
+M``#G<```YW```.=P```W<```.G```/#"`0`@`#UP``!!<```YW```.=P``!#
+M<```YW```.=P``#G<```$,,!`"``YW```$5P``#G<```YW```$AP``#G<```
+MYW```.=P```PPP$`(`!,<```3G```&=P``!Q<```='```.=P``!W<```YW``
+M`%##`0`@`'EP``!\<```YW```.=P``#G<```YW```.=P``!_<```<,,!`"``
+MYW```.=P``!.<```@W```.=P``"0<```BW```(9P``"0PP$`(`"5<```F'``
+M`)MP```0`*X)!(#M"R"`#S@4$&X+!#X.$+##`0`@```V#A``.&YC('Z.4Q`:
+M#A`4'`X0&!X.$!P@#A```*!AT,,!`"```/KF5P%O`"``FL9A"("F"0```%`(
+M``<0`!P'8``DVB_PPP$`(````,!A`'KG5X%I`"``(`A2#``'"``(0`@``"%`
+M`'S_81#$`0`@``"R`@`T@P<0`@`!`/Q^`&"`>N!7BU4`(`$X`"``6@`@,,0!
+M`"```'P_8.BM`@``@``(`7X`0`"``!"`7``@`'P_8/"M`@!0Q`$`(```@``(
+M`7X`0`"``!"`60`@@)7O+P!\/V!TUP(`/(``$'#$`0`@``!\/V`$K@(``(``
+M"`%^`$``@``0`?X?8@!\'V#0UP(`D,0!`"``````"`!ZX%>!4P`@-($G"!2(
+M8`@$"$`(`(7A5P(%`""PQ`$`(``2B&`(`@A`"`"%X5<"`P`@$(@@"``(``@`
+M@>!7`@$`(-#$`0`@``'^'V"````@````4`!ZX%>!2@`@`?X?8`!\_V$`L@(`
+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
+M`0`@`!0<#A`8'@X0'"`.$`!\'V+@MP(`9`DH"%P)"`@`@>!7\,T!`"```@4`
+M(&()*`A:"0@(`('@5P(#`"!@"2@(6`D("`"!X%<0S@$`(``"`0`@`?X?8(``
+M`"````!0`7K@5P(!`"````!0`%P`(##.`0`@``!\'V"\V0(`````"!``H`D,
+M`$`(``@!"``$P$$`?!]@4,X!`"``R]D"``$$``@,?@!``!#@&0!\'V#`V0(`
+M`00`"`)^`$!PS@$`(```'@!``!#@&0```%!`@$80`?Y?8$.$1A``?!]BX+<"
+M`)#.`0`@`&H%*`@V@D802H!&$`!\/V#*V0(``(0@"$B"1A!.@(80L,X!`"``
+M`OX_8#6"1A!0@$80'("&$%&`1A!2A$805(!&$%.`1A#0S@$`(``@_C]@7()&
+M$%V`1A``?!]@T-<"``````@`""`(8(*&$/#.`0`@``(((`AB@H80!`@@"&2"
+MAA``""`(;(*&$`(((`AN@H80$,\!`"``!`@`"'"`AA``?#]@V+8"``"(``AF
+M@(80`H@`"&B`AA`PSP$`(``$B``(:H"&$!C^'V!Z@(80`'P?8#S>`@```"`(
+M`(@`"%#/`0`@``%^`&``>N!7`0$`(`*((`B````@4`DH"``"AQ``?!]@<,\!
+M`"``T-<"``````@*"``(('Y`8`!ZX5>"!``@`'P?8N"W`@"0SP$`(`!0"0@(
+M('X`8"!ZX%>"`0`@W_\`8``$`&@``(<0`'P?8+#/`0`@`#S>`@```"`(`(@`
+M"`)^`&``>N!7`0$`(`2(``B````@T,\!`"``"OX?8`(`AQ``?!]@/-X"````
+M(`@`B``(!'X`8`!ZX%?PSP$`(``!`0`@!OX`0(`!`"``?!]BX+<"`%A_"$``
+M""`(!`*'$!#0`0`@``(((`@&`H<0!`@`"`@`AQ`*?@="`"`(8(`T[R\`(`!"
+M,-`!`"```!X@0`"0X!D`?"=`[`$````@"&``N.\O`!X@0`"0X!E0T`$`(```
+M?!]@O-D"``````@,`$`(`@*!$!2"AA`(_C]@`'P?8G#0`0`@`."W`@!,`T@0
+M`?Y?8`!\OV'4UP(``(1&$`'^/V"`9^`OD-`!`"```'K@5P($`"``?#]@A-X"
+M``"```@!?@!``(``$````%"PT`$`(```@$80``L`(`!\/V!,K0(``(``"`%^
+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
+M(```M>$O``!`8`3^'V`!_C]@@+_^+P`:!Q``?!]@F-\"`-#6`0`@```:`!``
+M`@`@`'K@5P(!`"````!0@`$`(`'^'V"````@\-8!`"``!/X?8!``K@D4`,X)
+M!(#M"R"`#S@8$&X+!#X.$``V#A`0UP$`(```.&YC$'Z.4P!\'V#`W`(`````
+M"`!ZX%<""@`@`#SM+S#7`0`@``!\/V!PO0(`&($@"``"(%``?!]@L-\"````
+M``@`@>!74-<!`"``!04`(`/^'V"`U_0O`GK@5P(!`"`!_A]@@`(`(`!ZX%=P
+MUP$`(``"`0`@````4(```"`#_A]@!(#M"R"`#S@0$&X+!#X.$)#7`0`@```V
+M#A``.&YC$'Z.4X"7X2\`>N!7@0(`(````%"`6=0OL-<!`"```'K@5X(``"``
+M@M8O!OX?8`2`[0L@@`\X$!!N"P0^#A#0UP$`(```-@X0`#AN8Q!^CE,`?!]@
+MN-D"```$``@`>N!7`0(`(/#7`0`@``#&SB\`>N!7`0P`((`*`"``?!]@H-P"
+M```$``@`>N!7$-@!`"```08`(`!\'V"-VP(```0`"`!ZX%>"`P`@@'?8+P!\
+M'V`PV`$`(`"DW`(``'P_8(S;`@``A"`(`/#5+P```%"`N?0O`'K@5U#8`0`@
+M``$!`"`!_A]@@```(````%`$@.T+((`/.!`0;@L$/@X0<-@!`"```#8.$``X
+M;F,8?HY3$!H.$!0<#A``?-]AK]D"```$!PB0V`$`(```?+]A=+,"`!R!1A"\
+M@08((($&$,"!!@@D@080\(%&"+#8`0`@```$`0@`?#]@K-D"``"`0!`!?B%`
+M\(,&$("6]"\<A28(T-@!`"```/K@5X(+`"``?#]@M-D"``"`(`@`@`!@`'K@
+M5X$(`"#PV`$`(```?!]@N-D"```$``@`>N!7`0,`(`+^'V```$<0!?X?8!#9
+M`0`@`+R!!A`4_A]@@`(`(`'^/V```D<0!?X?8+R!!A`/_A]@,-D!`"``P($&
+M$`!\OV%TLP(`\(%&"``$`0@`>N!7`@$`(`""(%!0V0$`(`"````@`?X_8`!\
+M'V"MV0(```)`$`!\OV%TLP(`*84F"'#9`0`@`"J%!@@`@>!7BP(`(`C^'X``
+M/LTO`((@4"F#1A```0`@D-D!`"```?X`0"F!1A``?+]A=+,"`$C_!D``!NLO
+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
+M`"!8_@9`D.(!`"``!/X_8``$05``AF%0@%/F+P#\)D(``@``X/\(0`3^/V"P
+MX@$`(```!$%0`(9A4`!0YB\$_@=`$/X_8``$05``AF%0@$WF+]#B`0`@``-^
+M"(``@$9`D`1A"`"&(4``AB!``OX@@(`1`"`!?B)`\.(!`"````/A5QR()@@&
+M`H`0@@<`((R`)@@$`H`0"/X_8``$05`0XP$`(```AF%0@$3F+T"$!@@`>N!7
+M`00`(%C^!D`$_C]@``1!4##C`0`@``"&85"`0.8O``$`(!R()@@`^/\G`)X'
+M8!3^/V``!$%04.,!`"```(9A4(`\YB\#?@B``(!&0)`$80@`AB%``(8@0`+^
+M((!PXP$`(```_"9"``(```"":$`P_P%`!/X_8``$05``AF%0@#7F+Y#C`0`@
+M``$$)P@"_@!@`'K@5P$$`"`!_@!@`'K@5X$"`"`8?@=`L.,!`"``!OX_8``$
+M05``AF%0@"_F+P-^"(``@$9`E``!")(((0C0XP$`(```!$%0`(9A4``LYB\!
+M?@A``!``&@-^"(``@$9`B00!"/#C`0`@`$!^`&``>N!7@?C_)P`@"&`0`*X)
+M%`#."1@`[@D<``X*$.0!`"``(``N"@2`[0L@@`\X)!!N"P0^#A``-@X0`#AN
+M8QQ^CE,PY`$`(``0&@X0%!P.$!@>#A``?!]@O-D"``````@0`*`)`'P_8%#D
+M`0`@`,#9`@`!A"`(!/X@0!2"AA``!$%00(1&$`'^/V!#@D80<.0!`"``-H)&
+M$$J$1A``?#]@RMD"``"$(`A(@D803H2&$`+^/V"0Y`$`(``U@D804(1&$!R$
+MAA!1A$804H1&$%2$1A!3A$800/X_8+#D`0`@`%R"1A!=A$80_Y$_&&""AA!B
+M@H809(*&$&R"AA!N@H80T.0!`"``<(*&$`!\?V#8M@(``(@A"&:"AA`"B"$(
+M:(*&$`2((0CPY`$`(`!J@H80#``@"`"(8`@`@L%!`'P?8*_9`@``!``(`GK@
+M5Q#E`0`@``(#`"``@B%``(1`$`%^QT$`!$<0`7['08`&`"``?/]A,.4!`"``
+MR]D"``&$1P@4B(8(``@!0!2`AA`"?D%``((!0`">)V!0Y0$`(`"`A<,O`81'
+M"`)^`4``',!!`'P_8,#9`@`!A"`(`_X`0'#E`0`@```.0!@`>N%7`04`(`!\
+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
+M#A``-@X0`#AN8Q!^CE-0]P$`(```?!]@^+$"`(!/YR\```!0!(#M"R"`#S@0
+M$&X+!#X.$'#W`0`@```V#A``.&YC''Z.4Q`:#A`4'`X0&!X.$```P&$```<(
+MD/<!`"```'S_8839`@``@$<(`'P_8(C9`@``@"`(`(3@IP0`)PBP]P$`(```
+M\B!``OY`@`!\/V"0V0(``(`@"`"$(```@@`X``"@8=#W`0`@````!P@`>N!7
+M@1(`(`0`)P@#_@!0!7K@5PT*`"``"P`@\/<!`"```'P_8/BR`@!8@0`(`'K@
+M5P$'`"``@$<(!GKA5X(%`"`0^`$`(`!4@0`(`7X`0%2!`!``?#]@F*T"``"`
+M``@!?@!``(``$##X`0`@````!P@`6LDO@`8`(```!PB`?]DO``4`(`)^@($`
+M?(8!4/@!`"``6/@!````!CC\?0``_'T```]^```<?@``#WX``!Q^``!P^`$`
+M(```?/]AA-D"``"`1P@`A>97`00`(`":!Q`"_B:``'P?8)#X`0`@`)39`@``
+M```(``(````"`#@`!@`@`'KA5P(%`"`$`"<(L/@!`"``!OK@5X(#`"``?!]@
+M'+$"```$``@`>N!7`0$`(````%#0^`$`(```E\\O`'S_8839`@``@$<(`GXA
+M@`!\'V"8V0(`````"/#X`0`@```"`````@`X``"@80"`1P@`A>97@0,`(`":
+M!Q`"_B:`$/D!`"```'P?8)39`@`````(``(````"`#@0`*X)%`#."1@`[@DP
+M^0$`(``$@.T+((`/.!P0;@L$/@X0`#8.$``X;F,8?HY3$!H.$%#Y`0`@`!0<
+M#A``?+]A^+("`!R!1@@#?B&``'S?89S``@``G&!`</D!`"``!($A"`0"`!``
+M@2$(``(`$(#OP"\<@48(`WXA@``(@E"0^0$`(```G&!`!(D!$`")`1`D@28(
+M__\@0"2#!A`!?D%`!'Z!D;#Y`0`@`!M^AHD`!"9`'_X@8`"8(%`<@P80@.G`
+M+Q``K@D4`,X)T/D!`"``!(#M"R"`#S@8$&X+!#X.$``V#A``.&YC$'Z.4P""
+M(%#P^0$`(```?!]@A-D"```"`!``?%]@-+H"`&Q^`4`D?B%`"?Y_8!#Z`0`@
+M``O^GV"``0`H!(#M"R"`#S@0$&X+`'R_8)#9`@``@`(0,/H!`"```'P?8)39
+M`@```@`0`'P?8)C9`@``!``0`'P?8(C9`@!0^@$`(```"``0`'P?8(S9`@``
+M!@`0`(`/.`0^#A``-@X0`#AN8W#Z`0`@`!1^CE,0&@X0`'P?8/BR`@``?Z!!
+M;'\@0`":!F``!$%0D/H!`"``@*?F+P!\/V#0?0```)H&8``_TR^`YO\O``(`
+M*!``K@FP^@$`(``$@.T+((`/.!00;@L$/@X0`#8.$``X;F,<?HY3$!H.$-#Z
+M`0`@`!0<#A`8'@X0@,;H+P!\WV&<V0(````'$`">YU$`?!]@\/H!`"``J-D"
+M```$``@`>N!7@@(`(`!\'V"HV0(```0`"`!ZX%<0^P$`(`"!_?\G`'R_8?BR
+M`@`H_P9``)XG8("LYB\`>N!7`0X`(##[`0`@```:`"!0A08(`'K@5X($`"``
+M?!]@J=D"```$``@`>N!74/L!`"```@(`($2!!@@!?@!`1($&$(#Z^B\```!0
+M`'S_8:#9`@!P^P$`(``$@`<0`(`'$`">!V"`??\O`'R_8?BR`@!<@>8)`+#H
+M+Y#[`0`@``!\WV&<V0(````'$(#N_R<`?/]AH-D"``">!V"`L?\OL/L!`"``
+M`)X'8(!V_R^`JN@O`'S?89S9`@```"<(``(@4%R!!@C0^P$`(```@>!7A00`
+M(````%`$@`<0`(`'$`">!V``</\O7('F"?#[`0`@`("CZ"\```<0`./_)P`"
+MX%$`XO\G#7K@5P'E_R>`X/\G$/P!`"```'P?8(39`@`````(`(`/.`0^#A``
+M-@X0`#AN8Q1^CE,P_`$`(``0&@X0`'R_87S;`@``F@9@@%'>+P```%``@$80
+M`'P?8%#\`0`@`(39`@`````($`"N"02`[0L@@`\X%!!N"P0^#A``-@X0</P!
+M`"```#AN8QQ^CE,0&@X0%!P.$!@>#A``?!]@A-D"````P`F0_`$`(``!_A]@
+M`'S_83"[`@#\@$<0`'R_87S;`@``F@9@`$3>+[#\`0`@``)ZX%>""@`@`(0&
+M"`)^`&``>N!7@0@`(/R`1Q````!0T/P!`"``@"CP+P!ZX%>"`P`@`'P_8("P
+M`@``@``(`7X`0`"``!#P_`$`(```',=1@`(`(`!\/V!XL`(``(``"`%^`$``
+M@``0````4!#]`0`@``!\OV%\VP(``(!&$``<!V`0`*X)%`#."1@`[@D$@.T+
+M,/T!`"``((`/.!P0;@L$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A!0_0$`(```
+M@L!A``2A80":)F"`=<$O$/X@@!!^!X@``@!``)HF8'#]`0`@``!SP2\0_B"`
+M`!`'&``"`$`*_B:`@'#!+P""`&`0`*X)D/T!`"``%`#."02`[0L@@`\X&!!N
+M"P0^#A``-@X0`#AN8S!^CE.P_0$`(``0&@X0%!P.$!@>#A`<(`X0("(.$"0D
+M#A`H)@X0`'S?8=#]`0`@`)5$````?']B3+("``#_Z4%X_RE``)X'8``$05``
+M/.8O\/T!`"```'P_8,B`````G@=@@-/2+TC_"4",_RE```1!4``XYB\0_@$`
+M(```?!]@EC8```!GS2\`7N@O`'P_8'37`@`<@``0`'Q?8##^`0`@`-"U`@``
+M!"$(`/K@5X(%`""`FM(O`'K@5P$$`"``5L`O4/X!`"````#@80`"!S@``*!A
+M`)X'8`!6P"\`^N97`?;_)P#!T2]P_@$`(``"^N97`'Q_8DRR`@`D_PE`_/]M
+M0`(!`"`V_C]@@```()#^`0`@`#7^/V`!_E]@__^?8(`JY2_\@0T(('X`8`!Z
+MX%>!%0`@L/X!`"```"`(4@'^/V(`?%]@T+4"```$(0@`@@A@`'K@5X$/`"#0
+M_@$`(```)$E2`)[G40`."!@`@B!0@(C1+P!\?V),L@(`2/\)0/#^`0`@`#+^
+M/V"`,N8O`'K@5P(!`"`!_E]B``(`(`'^!T``#N`9$/\!`"``"/KG5POX_R<`
+M>NE7`@(`('#^'V``?#]@J@4```"M_2\P_P$`(`"`.<`O`'Q?8-"U`@``!"$(
+M`*(@<``"01``.<`O`7X(0E#_`0`@``"B*$($>NA7B^O_)_R!#0@$?@!@`'K@
+M5X$)`"``?']B</\!`"``3+("`"3_Z4$`G@=@]_\_8`+^7V``1>4O`'P_8/37
+M`@"0_P$`(``(@``(]W\`8`B``!#\_VU``)X'8`C^/V`!_E]@`_Z?8+#_`0`@
+M```(Y2^`@M$O`'Q_8DRR`@`D_PE`_/\_8`+^7V``/.4OT/\!`"```,G_)P0^
+M#A``-@X0`#AN8R!^CE,0&@X0%!P.$!@>#A#P_P$`(``<(`X0``#@80""`&(!
+M_M]A`)JF40"@'P@``0!(``$`2!```@`@```!`$@``0!(``$`2``!`$@``0!(
+M``$`2`1^(&``@*`?,``"`"``____?P!ZZ%>!+``@0`"-"#P`+0@``^)7A0``
+M(#@`C0A0``(`(````"((`/K@5X$F`"``@D!@```A""#ZX%>.`0`@(/X@4'``
+M`@`@``"<8$"````@`!QG8`'^ID$`GB%0``(!$`"'YU<%`0`@D``"`"```((@
+M4``"`1``@B!0&`(!$!``00@``"((``/A5P+V_R>P``(`(```@D!@`/KF5X$:
+M`"`0`&$(`(:A8!@`(0@`^N!7@A8`(-```@`@`/__ID$`A>)7@@$`(`""(%``
+M`@(0@`8`(!0`(0@4@@$0\``"`"``$`!A"!"&`!```"((``/A5P(#`"`8@"$(
+M`/K@5X$``"`0`0(`(``8B`$0$`!A"``&`A!``&T(```A""#^($```@$0/``M
+M"#`!`@`@``"#X5<%`@`@`((A4/S_8&`X`"T(`()A0`"`(0@`^N!74`$"`"``
+M`00`(!`"`1`4@"`(%`(!$!"$`!``@"$(%(0`$!@&`1!P`0(`(````@`@$`0!
+M$!0$`1`8!@$0`(0!$`"*0F``^N97@N7_)Y`!`@`@``1^@D`!?L=!('KG5P[4
+M_R<!_N=1+``M"`">($`L`@T0L`$"`"``,``M"`#ZX%<!`0`@`)X@4#`"#1``
+M`*`?$`"N"10`S@G0`0(`(``8`.X)'``."@2`[0L@@`\X(!!N"P0^#A``-@X0
+M`#AN8_`!`@`@`"1^CE,0&@X0%!P.$!@>#A`<(`X0("(.$````&(`@L!A$`("
+M`"```?Z_80">YU$`H!\(``$`2``!`$@``0!(``$`2``!`$@P`@(`(````0!(
+M``$`2``!`$@$?B!@`("@'____W\`>N=7`0$`(%`"`@`@`/__/V*````@`*(H
+M4D``;0@\`"T(`(/A5X4``"`X`&T(<`("`"```(`A"`#ZX%>!"@`@`?[G00""
+M0&```"$((/K@5XX!`""0`@(`(``@_B!0`)H@0(```"``FB9@`'KG5X$!`"``
+MH^!7!@(`(+`"`@`@```!`"``H^!7C@``(`""(&(0`$$(`(`A"``#X5>"]O\G
+MT`("`"``!/YA0`'^ID$@^N97#O#_)P``H!\`^N=7`0$`(``B"!#P`@(`(```
+M`0`@````4```"!``G@=@$`"N"10`S@D8`.X)'``."A`#`@`@`"``+@H$@.T+
+M((`/."00;@L$/@X0`#8.$``X;F,0?HY3,`,"`"```'P?8$RQ`@"`T^4O````
+M4`2`[0L@@`\X$!!N"P0^#A!0`P(`(```-@X0`#AN8R!^CE,0&@X0%!P.$!@>
+M#A`<(`X0`?X?8'`#`@`@``!\WV'@MP(```%'$#!_IT$`F@9@R/X_8`"@Y2\`
+M`.!AD`,"`"```"`(4@`A1Q"`K+\O`'Q?8-37`@``!"$(`/K@5X((`""P`P(`
+M(``-^N=7@@(`(`"KOR\`F@9@__\_8("8Y2^````@@*B_+]`#`@`@``!\'V`<
+ML0(```0`"`!ZX%<!`0`@````4(`#`"`!_A]@\`,"`"``@`(`(``@01``H[\O
+M#?KG5P'^'V`!``!0$`"N"10`S@D0!`(`%``8`.X)'``."@2`[0L@@`\X(!!N
+M"P`4`@`@``0^#A``-@X0`#AN8Q!^CE,`1@`H`'K@5X(!`""`>P`H(!0"`"``
+M`'K@5X$!`"`$@.T+((`/.!`0;@N`^/HO@/W_)P0^#A!`%`(`(```-@X0`#AN
+M8Q!^CE,`?>!7`/("`(P``"``_?HO`/3_+V`4`@`@``!ZX%>!```@`/OZ+P2`
+M[0L@@`\X$!!N"P0^#A``-@X0@!0"`"```#AN8Q!^CE,`?#]@`/,"``!\'V`!
+M`@``B(``$`!\'V"@%`(`(`#$?````GY`@`!\'V"AC````GX`@``$0$``?!]@
+M2,$"`,`4`@`@```$X*>4\@`0`'P?8`,`('&,@``0!?X?8)"``!"`Y_LOX!0"
+M`"```'K@5X$``"``Z_HO`?X?8`#G^R\`(N,O!(#M"R"`#S@`%0(`(``0$&X+
+M!#X.$``V#A``.&YC''Z.4Q@:#A``@H!@!7Y`@"`5`@`@``!\?V`LO@(``(3!
+M0`)^((``@"!``_X@@`"`(%`"_B"`0!4"`"```/P`0$BD`@`0?B-``(1!``0`
+M8P@`?+]@2(P"``"(@D!@%0(`(``(`*,(#`##"`":IE$0&@X0`?[_8!0.#A``
+M#.-@@*WC+X`5`@`@``!ZX%<"`0`@`)H&8(```"`C_A]@&`"N"02`[0L@@`\X
+MH!4"`"``'!!N"P0^#A``-@X0`#AN8QQ^CE,0&@X0%!P.$!@>#A#`%0(`(``!
+M_K]A`'P_8"R^`@`(@,`)!?X&@`!\/V`LO@(```+@0>`5`@`@```"````>N!7
+M`08`(`":!F``'"=@@.'_+P``(&``^N!7`!8"`"```0(`(#C^'V``!$%0`/7R
+M+P`#`"`(@`<(`!S`00'^ID$@%@(`(``&^N97!?7_)P```%`0`*X)%`#."1@`
+M[@D$@.T+((`/.$`6`@`@`!P0;@L$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A`1
+M_K^!8!8"`"```'S?800`,```?%]@$/8"``!\/V`4]@(``'P?8`BH`@"`%@(`
+M(`````$0`'P?8,BH`@``@``0@/GR+P`WO2\+_A]@`("&%*`6`@`@``!\'V`'
+M!P```("&%`'^'V````<4@&WL+P!\'V!1````P!8"`"``@(_L+P!\'V!*````
+M`'#L+P!\'V#$?````)3L+P!\'V#@%@(`(``$?````'SL+P!\'V!*>P```'/L
+M+P!\'V!'?```@(#L+P`7`@`@`("AU2^`;0,H```@8`#ZX%<"$``@````4(`Z
+M["\``"!@(!<"`"```/K@5X(-`"`!_A]@`#CL+P``(&``^N!7`@L`(`+^'V!`
+M%P(`(`"`->PO```@8`#ZX%>""``@`_X?8``S["\``"!@`/K@5V`7`@`@``(&
+M`"````!0??X_F`!*\2\``"!@`/K@5P(#`"`!_A]@@!<"`"``^OX_F`!'\2\`
+M`"!@`/K@5P$"`"`U_A]@``1!4`##\B^@%P(`(`"````@`((`8!``K@D4`,X)
+M!(#M"R"`#S@8$&X+!#X.$,`7`@`@```V#A``.&YC$'Z.4X!5`R@``"!@`/K@
+M5P$"`"`V_A]@X!<"`"````1!4`"Z\B^````@````4`2`[0L@@`\X$!!N"P0^
+M#A``&`(`(```-@X0`#AN8Q!^CE.`,`,H!(#M"R"`#S@0$&X+!#X.$"`8`@`@
+M```V#A``.&YC$'Z.4X"9`2@`>N!7@0$`(#;^'V`&_C]@0!@"`"```!\`(`">
+M`B@`>N!7@0$`(#;^'V`'_C]@`!P`(````%!@&`(`(```Q>XO```@8`#ZX%<"
+M%0`@`?X?8(#"[B\``"!@`/K@5X`8`@`@`((2`"`#_A]@`,#N+P``(&``^N!7
+M`A``(`+^'V"`O>XOH!@"`"`````@8`#ZX%>"#0`@@*7P+X"A`2@`>N!7@0$`
+M(#;^'V#`&`(`(``)_C]@@`X`(`#!`B@`>N!7@0$`(#;^'V`(_C]@@`L`(.`8
+M`@`@``#4`BB`X0(H`.P"*``,`"@``"!@`/K@5X(#`"`#_A]@`!D"`"```'P_
+M8`!]``"`%O$O```@8`#ZX%<!`0`@-OX?8(`#`"`@&0(`(`"`OO`O@*;P+X"M
+M\"^`M/`O`)WP+P```%```0`@``1!4$`9`@`@`(".\B\$@.T+((`/.!`0;@L`
+M?!]@>*D"``!\/V``\P(`8!D"`"``@(``$`!\'V!$KP(`A(``$`!\GV#$B@(`
+M`'\"0`!\7V"`&0(`(`#DV@(`$``!$!#^?V`4!@$0`((@4`P"`1``@@!@"``!
+M$*`9`@`@``0``1````$0``@"8`!\7V`<RP(`$``!$!0&`1`,`@$0P!D"`"``
+M`((`8`@``1`$``$0```!$````%``@`\X!#X.$``V#A#@&0(`(```.&YC*'Z.
+M4Q`:#A`4'`X0&!X.$!P@#A`@(@X0```@8@`:`@`@``""H&$`GN=1````4/R!
+M#1``(`A2````4`""(%``!$%0(!H"`"``@-P`*```(&``^N!7`G<`(`'^'V"`
+MS``H````4`'^/V!`&@(`(```!$%0`-@`*```(&``^N!7@G(`(`'^'V``R``H
+M`?X?8&`:`@`@``'^/V``!$%0@-,`*```(&``^N!7`FX`(`+^'V"`PP`H@!H"
+M`"``````4`'^/V``!$%0`,\`*```(&``^N!7@FD`(`'^'V"@&@(`(```OP`H
+M````4`'^/V`!_E]@@,H`*```(&``^N!7`F4`(,`:`@`@``'^'V"`N@`H`?X?
+M8`'^/V`!_E]@`,8`*```(&``^N!7X!H"`"``@F``(`+^'V``M@`H````4`'^
+M/V`!_E]@@,$`*```(&``&P(`(```^N!7`EP`(`'^'V"`L0`H````4`'^/V`!
+M_E]@`+T`*"`;`@`@````(&``^N!7@E<`(`'^'V``K0`H`?X?8`'^/V`!_E]@
+M0!L"`"``@+@`*```(&``^N!7`E,`(`+^'V"`J``H````4`'^/V!@&P(`(``!
+M_E]@`+0`*```(&``^N!7@DX`(`'^'V``I``H````4(`;`@`@``'^/V``!$%0
+M@*\`*```(&``^N!7`DH`(`'^'V"`GP`HH!L"`"```?X?8`'^/V``!$%0`*L`
+M*```(&``^N!7@D4`(`+^'V#`&P(`(```FP`H!_[?80```%`!_C]@`)Y'8`"F
+M`"@``"!@`/K@5^`;`@`@`()``"`!_A]@`)8`*`"<"(@!?N!A````4`'^/V``
+MGD=@`!P"`"``@*``*```(&``^N!7`CL`(`'^'V"`D``H`?X?8`'^/V`@'`(`
+M(```GD=@`)P`*```(&``^N!7@C8`(`+^'V``C``H_W_'04`<`@`@``!ZYU<*
+M\/\G````4`'^/V``GD=@`)8`*```(&``^N!78!P"`"``@C``(`'^'V``A@`H
+M````4`'^/V``!$%0@)$`*```(&"`'`(`(```^N!7`BP`(/S_#4``BP`H```@
+M8`#ZX%>"*0`@_($-"*`<`@`@``!ZX%<!`0`@)_X?8``K`"`!_A]@@'P`*`'^
+M'V`!_C]@P!P"`"````1!4`"(`"@``"!@`/K@5X(B`"`"_A]@`'@`*`_^WV'@
+M'`(`(`````!0`?X_8``$05``@P`H```@8`#ZX%>"'0`@`?X?8``=`@`@``!S
+M`"@```!0`?X_8``$05"`?@`H```@8`#ZX%<"&0`@(!T"`"``_/\-0`!X`"@`
+M`"!@`/K@5X(6`"``(`A``!``&OR!#0A`'0(`(```$``8`"#@:0"0!QH!_A]@
+M`&D`*`'^'V`!_C]@``1!4&`=`@`@`(!T`"@``"!@`/K@5P(/`"`"_A]@@&0`
+M*/]_QT$`>N=7@!T"`"``BNO_)P```%`!_C]@``1!4(!N`"@``"!@`/K@5P()
+M`""@'0(`(``!_A]@@%X`*````%``@B!0``1!4`!J`"@``"!@`/K@5\`=`@`@
+M`(($`"`!_A]@`%H`*`'^'V``@B!0``1!4(!E`"@``"!@X!T"`"```/K@5P$"
+M`"!A_A]@``1!4(#X\2\``@`@`OX?8(!3`"@`'@(`(```GH80````4!``K@D4
+M`,X)&`#N"1P`#@H@`"X*!(#M"R`>`@`@`""`#S@H$&X+!#X.$``V#A``.&YC
+M&'Z.4Q`:#A```*!A0!X"`"``_O\M0````%"`<?\O```@8`#ZX%<!`@`@8OX?
+M8``$05!@'@(`(`"`ZO$O``4`(/Z)#0@(?@"0``X`&*5ZX%<!`0`@!/X?8(`>
+M`@`@`(```"`!_A]@`(`&$````%`0`*X)!(#M"R"`#S@8$&X+H!X"`"``!#X.
+M$``V#A``.&YC''Z.4Q`:#A`4'`X0``#`80":IE'`'@(`(```>N=7#@H`(/[_
+M+4``F@9@@&#_+P``(&``^N!7`0(`(.`>`@`@`&/^'V``!$%0@-GQ+X`%`"``
+MFD9``'P?8%RJ`@```2`(`!\"`"``_HD-"`"$0$```($0`?ZF00`;YU<-]O\G
+M````4!``K@D@'P(`(``4`,X)!(#M"R"`#S@<$&X+!#X.$``V#A``.&YC''Z.
+M4T`?`@`@`!`:#A`4'`X0&!X.$```X&$`@B!0`(9A4`!\'V#4K`(`8!\"`"``
+M``8`$`!\'V#8K`(```8`$`!\'V!0M0(```"@"0!\'V"`'P(`(`!0M`(``'S?
+M85RJ`@```0<0!OX?8`0!!Q``F^!7!@4`(*`?`@`@``""`$``?-]A7*H"```!
+M1P@`AF%0```!0``&@!`!_B!`P!\"`"```)O@5P7[_R<`G@=@`,O_+P``(&``
+M^N!7`@8`(`"`!PC@'P(`(``!>N!7`0(`(`!\WV%<J@(`!`$'$``1`"``F@9@
+M`-3_+P`@`@`@````(&``^N!7`0(`(&3^'V``!$%0`+3Q+P`-`"``?-]A("`"
+M`"``7*H"```!1PA"?@%`7_X_8(`?`"@(`8<0``%'"$`((0A`(`(`(````^!7
+M`0(`(`7^'V`$`0<0`(`'$``%`"``?!]@V*P"`&`@`@`@```:`!``?!]@U*P"
+M```$`!`!_A]@!`$'$`"`!Q"`Z,(O@"`"`"``````4!``K@D4`,X)&`#N"02`
+M[0L@@`\X'!!N"P1^CE.@(`(`(```!$%0``0.%`)^((``@"!``_X@@`/^((@`
+M!`X4`$`.",`@`@`@``"!X%<.`P`@`$`."`%^`$````X4`$`."`"!X%<-_?\G
+MX"`"`"``!'Z.0P"`#S@`?#]@0``P``"`(`@$_B"(`?X@8``"`!``(0(`(```
+M``!0`(`/.`!\?V!``#```((@0`"``&@"?B&``(``:"`A`@`@`!=^`&``@`$0
+M````4`"`#S@``$!@````4``(@E``^N!70"$"`"``C@,`(``(8D`$!F$``(`!
+M>``0`!@!?H)``(G@5XW\_R=@(0(`(```@`\X!#X.$``V#A``.&YC$'Z.4X`0
+M`"@`#@`8`((@4(`A`@`@``!\7V!,W@(```(!$`!\7V!0W@(```(!$`3^?V``
+M?%]@H"$"`"``]+8"`$@'@1!&`X$0``-!%`$#010`?%]@0-X"```"013`(0(`
+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
+M`'R_872S`@"<_^9!,/XF0`">!V"`C]\O`!P`:``.P!G`*@(`(```G@=@`?X_
+M8``$05``W-\O`((@4`!\'V"QV0(```)`$.`J`@`@```<!V`0`*X)%`#."1@`
+M[@D$@.T+((`/.!P0;@L$/@X0`"L"`"```#8.$``X;F,8?HY3$!H.$!0<#A``
+M?+]AG+@"``3_!D`@*P(`(`!$_R9`@('?+P`.P!DD_P9`5/\F0(!_WR\`'`!H
+M``[`&4`K`@`@``""(%``?!]@S-X"```"0!``?!]@RMX"```"@!``?!]@8"L"
+M`"``R=X"```"0!``@T80`!P'8!``K@D4`,X)!(#M"R"`#SB`*P(`(``8$&X+
+M`?X_8`!\'V#)W@(```)`$`""(%``?!]@S=X"`*`K`@`@```"0!````!0`(`/
+M.`0^#A``-@X0`#AN8Q1^CE,0&@X0P"L"`"```'P_8#2T`@"\_P!```1!4(!_
+MX"\`@#]0`(`@:!_^H(G@*P(`(```?!]@&F8```",QR\`?!]@(U\```!YQR\`
+M@B!0`'P?8``L`@`@`"#:`@```@`0`'P?8"C:`@```@`0`'P?8"S:`@```@`0
+M("P"`"```'P?8"3:`@```@`0`?Y_8`!\'V!@V@(```8`$`'^7V!`+`(`(```
+M?!]@,=H"```$0!``?!]@,MH"```$0!``?!]@1-H"`&`L`@`@```&`!``?!]@
+M/=H"```"0!``?!]@,-H"```"0!``?!]@@"P"`"``.-H"```"`!``?!]@9-H"
+M```"`!``?!]@P-H"```"0!"@+`(`(```?!]@U-H"```"0!``?!]@U=H"```"
+M0!``?!]@M=H"`,`L`@`@```"0!``?!]@U]H"```"0!``?!]@V-H"```"0!``
+M?!]@X"P"`"``G-H"```"0!``?!]@I-H"```"0!``?!]@N-H"```"`!``+0(`
+M(```?!]@O-H"```"`!``F@9@$`"N"02`[0L@@`\X%!!N"R`M`@`@``""(%``
+M?!]@`+("`#0#`!````!0`(`/.`0^#A``-@X00"T"`"```#AN8R!^CE,0&@X0
+M%!P.$!@>#A`<(`X0@/C_+P`.P!E@+0(`(`"`<?\O`!P`:``.P!F`L?\O`!P`
+M:``.P!F`2O\O`!P`:(`M`@`@```.P!F`Q/\O`!P`:``.P!F`70`H`!P`:``.
+MP!D`B_\OH"T"`"```!S@:0".QQD`FJ91`'P_8,O9`@``FD`0`_X?8`&`0!#`
+M+0(`(``Q_E]@`H1`$##^'V`#@$`0!(1`$`'^'V``?#]@P-D"`.`M`@`@``"`
+M0!`%_A]@`8!`$`+^'V`"@$`0!/X?8`.`0!`+_A]@`"X"`"``!(!`$!;^'V(%
+MH$`0+/X?8`:`0!``?!]@I=H"``K^7V`@+@(`(`"`:[HO`'P?8-#7`@``&@`0
+M`'P?8&#>`@``&D`0`'P?8$`N`@`@`+/9`@``($`0`'P?8'#7`@``&@`0`'P?
+M8)C:`@``&@`08"X"`"```'P?8+#:`@``&@`0`'P?8&3>`@``&@`0`'P?8&C>
+M`@"`+@(`(```&@`0`'P?8&S>`@``&@`0`'P?8!#:`@``&@`0`'P?8*`N`@`@
+M`'C>`@``&@`0`'P?8'S>`@``'D`0`!P'8!``K@D4`,X)P"X"`"``&`#N"1P`
+M#@H$@.T+((`/."`0;@L$/@X0`#8.$``X;F/@+@(`(``4?HY3$!H.$``8]R\`
+M#J`9@"7W+P`:`&@`#J`9@)#_+P`O`@`@```:`&@`#J`9`'P_8'S>`@``A``(
+M`!H`:`"`0!``F@9@("\"`"``$`"N"02`[0L@@`\X%!!N"P!\/V!PUP(``(``
+M$`"`#SA`+P(`(```?#]@F-H"``"``!``@`\X`'P_8&3>`@``@``0````4&`O
+M`@`@``"`#S@`?#]@$-H"``"``!``@`\X`'P_8+#:`@``@``0@"\"`"```(`/
+M.`0^#A``-@X0`#AN8Q1^CE,0&@X0`)JF40!\/V"@+P(`(`"PL0(`P/\`0`#Q
+MWB\"_B:```1!4`#\`$!`V0(```0`$,`O`@`@``'^ID$$^N97"_S_)P!\'V#B
+M:P```.__+P!\'V#6:P``X"\"`"```/+_+Q``K@D$@.T+((`/.!00;@L$/@X0
+M`#8.$``X;F,`,`(`(``0?HY3````4(#>T"\`?#]@6+("`,C_`$``!$%0`/;?
+M+R`P`@`@``!\'V`V$```@.+_+P!\'V!.$```@.7_+P"&UB^`30`H0#`"`"``
+M!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC$'Z.4P!\'V!@,`(`(``$90```.O^
+M+P!\'V#J#P``@-?_+P2`[0L@@`\X$!!N"X`P`@`@``0^#A``-@X0`#AN8QA^
+MCE,0&@X0%!P.$`!\WV$`N0(`H#`"`"```'\'0'A_)T`!_E]@`.3?+P`.H!E8
+M?P=`C'\G0``$05#`,`(`(`"`X=\O`!H`:``.H!D!_C]@`'P?8/S>`@```@`0
+M`((@4.`P`@`@``!\'V#/W@(```)`$`!\'V#DW@(```)`$`!\'V#MW@(``#$"
+M`"````)`$`!\'V#EW@(```)`$`!\'V`(WP(```)`$`!\'V`@,0(`(``0WP(`
+M``)`$`!\'V`2WP(```*`$`!\'V`4WP(```*`$$`Q`@`@``!\'V#NW@(```)`
+M$`!\'V#OW@(```)`$`!\'V#XW@(`8#$"`"````)`$`!\'V#LW@(```)`$`!\
+M'V#4W@(```(`$`":!F"`,0(`(``0`*X)%`#."02`[0L@@`\X&!!N"P!\/V"0
+MJ`(``(``"*`Q`@`@````8`@,A@`0"(8`$!B```@````(`'K@5P(!`"`&_A]@
+MP#$"`"``@!4`(!2```@````(`'K@5P(!`"`'_A]@@!(`(!"```C@,0(`(```
+M`$`(`GKA5P4!`"``A>%7!0$`(`C^'V"`#@`@!(``"``R`@`@``````@``>%7
+M#0$`(`G^'V"`"P`@((``"```0`@LA``0(#("`"``*(0`$#2```@````(`'K@
+M5P(!`"`*_A]@@`8`(#"```A`,@(`(````&`(``?A5P4!`"`+_A]@@`,`("2`
+M``@````(`('A5V`R`@`@``T!`"`,_A]@@```(````%``@`\X````4`"`#S@`
+M``!0@#("`"```(`/.`0^#A``-@X0`#AN8Q1^CE/\_PU`@)+]+P```%"@,@(`
+M(``$@.T+((`/.!00;@L$/@X0`#8.$``X;F,4?HY3$!H.$,`R`@`@``">P"\`
+M`*!A`/KF5P$%`"``FL`O`7K@5X(#`"`CA`8(X#("`"```'P_8/BR`@!0@4`0
+M3($`"`%^`$!,@0`0$`"N"02`[0L`,P(`"``@@`\X%!!N"P!X`@`@````````
+M````````````````````````````````````('@"`"``````````````````
+M``````````````````````````!`>`(`(```````````````````````````
+M`````````````````&!X`@`@````````````````````````````````````
+M````````@'@"`"````````````````````````````````````````````"@
+M>`(`(````````````````````````````````````````````,!X`@`@````
+M````````````````````````````````````````X'@"`"``````````````
+M````````````````````````````````>0(`(```````````````````````
+M`````````````````````"!Y`@`@````````````````````````````````
+M````````````0'D"`"``````````````````````````````````````````
+M``!@>0(`(````````````````````````````````````````````(!Y`@`@
+M````````````````````````````````````````````H'D"`"``````````
+M``````````````````````````````````#`>0(`(```````````````````
+M`````````````````````````.!Y`@`@````````````````````````````
+M`````````````````'H"`"``````````````````````````````````````
+M```````@>@(`(````````````````````````````````````````````$!Z
+M`@`@````````````````````````````````````````````8'H"`"``````
+M``````````````````````````````````````"`>@(`(```````````````
+M`````````````````````````````*!Z`@`@````````````````````````
+M````````````````````P'H"`"``````````````````````````````````
+M``````````#@>@(`(```````````````````````````````````````````
+M``![`@`@````````````````````````````````````````````('L"`"``
+M``````````````````````````````````````````!`>P(`(```````````
+M`````````````````````````````````&![`@`@````````````````````
+M````````````````````````@'L"`"``````````````````````````````
+M``````````````"@>P(`(```````````````````````````````````````
+M`````,![`@`@````````````````````````````````````````````X'L"
+M`"``````````````````````````````````````````````?`(`(```````
+M`````````````````````````````````````"!\`@`@````````````````
+M````````````````````````````0'P"`"``````````````````````````
+M``````````````````!@?`(`(```````````````````````````````````
+M`````````(!\`@`@````````````````````````````````````````````
+MH'P"`"````````````````````````````````````````````#`?`(`(```
+M`````````````````````````````````````````.!\`@`@````````````
+M`````````````````````````````````'T"`"``````````````````````
+M```````````````````````@?0(`(```````````````````````````````
+M`````````````$!]`@`@````````````````````````````````````````
+M````8'T"`"````````````````````````````````````````````"`?0(`
+M(````````````````````````````````````````````*!]`@`@````````
+M````````````````````````````````````P'T"`"``````````````````
+M``````````````````````````#@?0(`(```````````````````````````
+M``````````````````!^`@`@````````````````````````````````````
+M````````('X"`"````````````````````````````````````````````!`
+M?@(`(````````````````````````````````````````````&!^`@`@````
+M````````````````````````````````````````@'X"`"``````````````
+M``````````````````````````````"@?@(`(```````````````````````
+M`````````````````````,!^`@`@````````````````````````````````
+M````````````X'X"`"``````````````````````````````````````````
+M````?P(`(````````````````````````````````````````````"!_`@`@
+M````````````````````````````````````````````0'\"`"``````````
+M``````````````````````````````````!@?P(`(```````````````````
+M`````````````````````````(!_`@`@````````````````````````````
+M````````````````H'\"`"``````````````````````````````````````
+M``````#`?P(`(````````````````````````````````````````````.!_
+M`@`@`````````````````````````````````````````````(`"`"``````
+M```````````````````````````````````````@@`(`(```````````````
+M`````````````````````````````$"``@`@````````````````````````
+M````````````````````8(`"`"``````````````````````````````````
+M``````````"`@`(`(```````````````````````````````````````````
+M`*"``@`@````````````````````````````````````````````P(`"`"``
+M``````````````````````````````````````````#@@`(`(```````````
+M``````````````````````````````````"!`@`@````````````````````
+M````````````````````````(($"`"``````````````````````````````
+M``````````````!`@0(`(```````````````````````````````````````
+M`````&"!`@`@````````````````````````````````````````````@($"
+M`"````````````````````````````````````````````"@@0(`(```````
+M`````````````````````````````````````,"!`@`@````````````````
+M````````````````````````````X($"`"``````````````````````````
+M````````````````````@@(`(```````````````````````````````````
+M`````````"""`@`@````````````````````````````````````````````
+M0(("`"````````````````````````````````````````````!@@@(`(```
+M`````````````````````````````````````````(""`@`@````````````
+M````````````````````````````````H(("`"``````````````````````
+M``````````````````````#`@@(`(```````````````````````````````
+M`````````````.""`@`@````````````````````````````````````````
+M`````(,"`"`````````````````````````````````````````````@@P(`
+M(````````````````````````````````````````````$"#`@`@````````
+M````````````````````````````````````8(,"`"``````````````````
+M``````````````````````````"`@P(`(```````````````````````````
+M`````````````````*"#`@`@````````````````````````````````````
+M````````P(,"`"````````````````````````````````````````````#@
+M@P(`(`````````````````````````````````````````````"$`@`@````
+M````````````````````````````````````````((0"`"``````````````
+M``````````````````````````````!`A`(`(```````````````````````
+M`````````````````````&"$`@`@````````````````````````````````
+M````````````@(0"`"``````````````````````````````````````````
+M``"@A`(`(````````````````````````````````````````````,"$`@`@
+M````````````````````````````````````````````X(0"`"``````````
+M````````````````````````````````````A0(`(```````````````````
+M`````````````````````````""%`@`@````````````````````````````
+M````````````````0(4"`"``````````````````````````````````````
+M``````!@A0(`(````````````````````````````````````````````("%
+M`@`@````````````````````````````````````````````H(4"`"``````
+M``````````````````````````````````````#`A0(`(```````````````
+M`````````````````````````````."%`@`@````````````````````````
+M`````````````````````(8"`"``````````````````````````````````
+M```````````@A@(`(```````````````````````````````````````````
+M`$"&`@`@````````````````````````````````````````````8(8"`"``
+M``````````````````````````````````````````"`A@(`(```````````
+M`````````````````````````````````*"&`@`@````````````````````
+M````````````````````````P(8"`"``````````````````````````````
+M``````````````#@A@(`(```````````````````````````````````````
+M``````"'`@`@````````````````````````````````````````````((<"
+M`"````````````````````````````````````````````!`AP(`(```````
+M`````````````````````````````````````&"'`@`@````````````````
+M````````````````````````````@(<"`"``````````````````````````
+M``````````````````"@AP(`(```````````````````````````````````
+M`````````,"'`@`@````````````````````````````````````````````
+MX(<"`"``````````````````````````````````````````````B`(`(```
+M`````````````````````````````````````````""(`@`@````````````
+M````````````````````````````````0(@"`"``````````````````````
+M``````````````````````!@B`(`(```````````````````````````````
+M`````````````("(`@`@````````````````````````````````````````
+M````H(@"`"````````````````````````````````````````````#`B`(`
+M(````````````````````````````````````````````."(`@`@````````
+M`````````````````````````````````````(D"`"``````````````````
+M```````````````````````````@B0(`(```````````````````````````
+M`````````````````$")`@`@````````````````````````````````````
+M````````8(D"`"````````````````````````````````````````````"`
+MB0(`(````````````````````````````````````````````*")`@`@````
+M````````````````````````````````````````P(D"`"``````````````
+M``````````````````````````````#@B0(`(```````````````````````
+M``````````````````````"*`@`@````````````````````````````````
+M````````````((H"`"``````````````````````````````````````````
+M``!`B@(`(````````````````````````````````````````````&"*`@`@
+M````````````````````````````````````````````@(H"`"``````````
+M``````````````````````````````````"@B@(`(```````````````````
+M`````````````````````````,"*`@`@````````````````````````````
+M````````````````X(H"`"``````````````````````````````````````
+M````````BP(`(````````````````````````````````````````````""+
+M`@`@````````````````````````````````````````````0(L"`"``````
+M``````````````````````````````````````!@BP(`(```````````````
+M`````````````````````````````("+`@`@````````````````````````
+M````````````````````H(L"`"``````````````````````````````````
+M``````````#`BP(`(```````````````````````````````````````````
+M`."+`@`@`````````````````````````````````````````````(P"`"``
+M```````````````````````````````````````````@C`(`(```````````
+M`````````````````````````````````$",`@`@``````!X5C02````````
+M````````````````````````8(P"`"``````````````````````````````
+M``````````````"`C`(`(```````````````````````````````````````
+M`````*",`@`@````````````````````````````````````````````P(P"
+M`"````````````````````````````````````````````#@C`(`(```````
+M``````````````````````````````````````"-`@`@````````````````
+M````````````````````````````((T"`"``````````````````````````
+M``````````````````!`C0(`(```````````````````````````````````
+M`````````&"-`@`@````````````````````````````````````````````
+M@(T"`"````````````````````````````````````````````"@C0(`(```
+M`````````````````````````````````````````,"-`@`@````````````
+M````````````````````````````````X(T"`"``````````````````````
+M````````````````````````C@(`(```````````````````````````````
+M`````````````"".`@`@````````````````````````````````````````
+M````0(X"`"````````````````````````````````````````````!@C@(`
+M(````````````````````````````````````````````(".`@`@````````
+M````````````````````````````````````H(X"`"``````````````````
+M``````````````````````````#`C@(`(```````````````````````````
+M`````````````````.".`@`@````````````````````````````````````
+M`````````(\"`"`````````````````````````````````````````````@
+MCP(`(````````````````````````````````````````````$"/`@`@````
+M````````````````````````````````````````8(\"`"``````````````
+M``````````````````````````````"`CP(`(```````````````````````
+M`````````````````````*"/`@`@````````````````````````````````
+M````````````P(\"`"``````````````````````````````````````````
+M``#@CP(`(`````````````````````````````````````````````"0`@`@
+M````````````````````````````````````````````()`"`"``````````
+M``````````````````````````````````!`D`(`(```````````````````
+M`````````````````````````&"0`@`@````````````````````````````
+M````````````````@)`"`"``````````````````````````````````````
+M``````"@D`(`(````````````````````````````````````````````,"0
+M`@`@````````````````````````````````````````````X)`"`"``````
+M````````````````````````````````````````D0(`(```````````````
+M`````````````````````````````""1`@`@````````````````````````
+M````````````````````0)$"`"``````````````````````````````````
+M``````````!@D0(`(```````````````````````````````````````````
+M`("1`@`@````````````````````````````````````````````H)$"`"``
+M``````````````````````````````````````````#`D0(`(```````````
+M`````````````````````````````````."1`@`@````````````````````
+M`````````````````````````)("`"``````````````````````````````
+M```````````````@D@(`(```````````````````````````````````````
+M`````$"2`@`@````````````````````````````````````````````8)("
+M`"````````````````````````````````````````````"`D@(`(```````
+M`````````````````````````````````````*"2`@`@````````````````
+M````````````````````````````P)("`"``````````````````````````
+M``````````````````#@D@(`(```````````````````````````````````
+M``````````"3`@`@````````````````````````````````````````````
+M(),"`"````````````````````````````````````````````!`DP(`(```
+M`````````````````````````````````````````&"3`@`@````````````
+M````````````````````````````````@),"`"``````````````````````
+M``````````````````````"@DP(`(```````````````````````````````
+M`````````````,"3`@`@````````````````````````````````````````
+M````X),"`"``````````````````````````````````````````````E`(`
+M(````````````````````````````````````````````""4`@`@````````
+M````````````````````````````````````0)0"`"``````````````````
+M``````````````````````````!@E`(`(```````````````````````````
+M`````````````````("4`@`@````````````````````````````````````
+M````````H)0"`"````````````````````````````````````````````#`
+ME`(`(````````````````````````````````````````````."4`@`@````
+M`````````````````````````````````````````)4"`"``````````````
+M```````````````````````````````@E0(`(```````````````````````
+M`````````````````````$"5`@`@````````````````````````````````
+M````````````8)4"`"``````````````````````````````````````````
+M``"`E0(`(````````````````````````````````````````````*"5`@`@
+M````````````````````````````````````````````P)4"`"``````````
+M``````````````````````````````````#@E0(`(```````````````````
+M``````````````````````````"6`@`@````````````````````````````
+M````````````````()8"`"``````````````````````````````````````
+M``````!`E@(`(````````````````````````````````````````````&"6
+M`@`@````````````````````````````````````````````@)8"`"``````
+M``````````````````````````````````````"@E@(`(```````````````
+M`````````````````````````````,"6`@`@````````````````````````
+M````````````````````X)8"`"``````````````````````````````````
+M````````````EP(`(```````````````````````````````````````````
+M`""7`@`@````````````````````````````````````````````0)<"`"``
+M``````````````````````````````````````````!@EP(`(```````````
+M`````````````````````````````````("7`@`@````````````````````
+M````````````````````````H)<"`"``````````````````````````````
+M``````````````#`EP(`(```````````````````````````````````````
+M`````."7`@`@`````````````````````````````````````````````)@"
+M`"`````````````````````````````````````````````@F`(`(```````
+M`````````````````````````````````````$"8`@`@````````````````
+M````````````````````````````8)@"`"``````````````````````````
+M``````````````````"`F`(`(```````````````````````````````````
+M`````````*"8`@`@````````````````````````````````````````````
+MP)@"`"````````````````````````````````````````````#@F`(`(```
+M``````````````````````````````````````````"9`@`@````````````
+M````````````````````````````````()D"`"``````````````````````
+M``````````````````````!`F0(`(```````````````````````````````
+M`````````````&"9`@`@````````````````````````````````````````
+M````@)D"`"````````````````````````````````````````````"@F0(`
+M(````````````````````````````````````````````,"9`@`@````````
+M````````````````````````````````````X)D"`"``````````````````
+M````````````````````````````F@(`(```````````````````````````
+M`````````````````"":`@`@````````````````````````````````````
+M````````0)H"`"````````````````````````````````````````````!@
+MF@(`(````````````````````````````````````````````(":`@`@````
+M````````````````````````````````````````H)H"`"``````````````
+M``````````````````````````````#`F@(`(```````````````````````
+M`````````````````````.":`@`@````````````````````````````````
+M`````````````)L"`"``````````````````````````````````````````
+M```@FP(`(````````````````````````````````````````````$";`@`@
+M````````````````````````````````````````````8)L"`"``````````
+M``````````````````````````````````"`FP(`(```````````````````
+M`````````````````````````*";`@`@````````````````````````````
+M````````````````P)L"`"``````````````````````````````````````
+M``````#@FP(`(`````````````````````````````````````````````"<
+M`@`@````````````````````````````````````````````()P"`"``````
+M``````````````````````````````````````!`G`(`(```````````````
+M`````````````````````````````&"<`@`@````````````````````````
+M````````````````````@)P"`"``````````````````````````````````
+M``````````"@G`(`(```````````````````````````````````````````
+M`,"<`@`@````````````````````````````````````````````X)P"`"``
+M````````````````````````````````````````````G0(`(```````````
+M`````````````````````````````````""=`@`@````````````````````
+M````````````````````````0)T"`"``````````````````````````````
+M``````````````!@G0(`(```````````````````````````````````````
+M`````("=`@`@````````````````````````````````````````````H)T"
+M`"````````````````````````````````````````````#`G0(`(```````
+M`````````````````````````````````````."=`@`@````````````````
+M`````````````````````````````)X"`"``````````````````````````
+M```````````````````@G@(`(```````````````````````````````````
+M`````````$">`@`@````````````````````````````````````````````
+M8)X"`"````````````````````````````````````````````"`G@(`(```
+M`````````````````````````````````````````*">`@`@````````````
+M````````````````````````````````P)X"`"``````````````````````
+M``````````````````````#@G@(`(```````````````````````````````
+M``````````````"?`@`@````````````````````````````````````````
+M````()\"`"````````````````````````````````````````````!`GP(`
+M(````````````````````````````````````````````&"?`@`@````````
+M````````````````````````````````````@)\"`"``````````````````
+M``````````````````````````"@GP(`(```````````````````````````
+M`````````````````,"?`@`@````````````````````````````````````
+M````````X)\"`"``````````````````````````````````````````````
+MH`(`(````````````````````````````````````````````""@`@`@````
+M````````````````````````````````````````0*`"`"``````````````
+M``````````````````````````````!@H`(`(```````````````````````
+M`````````````````````("@`@`@````````````````````````````````
+M````````````H*`"`"``````````````````````````````````````````
+M``#`H`(`(````````````````````````````````````````````."@`@`@
+M`````````````````````````````````````````````*$"`"``````````
+M```````````````````````````````````@H0(`(```````````````````
+M`````````````````````````$"A`@`@````````````````````````````
+M````````````````8*$"`"``````````````````````````````````````
+M``````"`H0(`(````````````````````````````````````````````*"A
+M`@`@````````````````````````````````````````````P*$"`"``````
+M``````````````````````````````````````#@H0(`(```````````````
+M``````````````````````````````"B`@`@````````````````````````
+M````````````````````(*("`"``````````````````````````````````
+M``````````!`H@(`(```````````````````````````````````````````
+M`&"B`@`@````````````````````````````````````````````@*("`"``
+M``````````````````````````````````````````"@H@(`(```````````
+M`````````````````````````````````,"B`@`@````````````````````
+M````````````````````````X*("`"``````````````````````````````
+M````````````````HP(`(```````````````````````````````````````
+M`````""C`@`@````````````````````````````````````````````0*,"
+M`"````````````````````````````````````````````!@HP(`(```````
+M`````````````````````````````````````("C`@`@````````````````
+M````````````````````````````H*,"`"``````````````````````````
+M``````````````````#`HP(`(```````````````````````````````````
+M`````````."C`@`@````````````````````````````````````````````
+M`*0"`"`````````````````````````````````````````````@I`(`(```
+M`````````````````````````````````````````$"D`@`@````````````
+M````````````````````````````````8*0"`"``````````````````````
+M``````````````````````"`I`(`(```````````````````````````````
+M`````````````*"D`@`@````````````````````````````````````````
+M````P*0"`"````````````````````````````````````````````#@I`(`
+M(`````````````````````````````````````````````"E`@`@````````
+M````````````````````````````````````(*4"`"``````````````````
+M``````````````````````````!`I0(`(```````````````````````````
+M`````````````````&"E`@`@````````````````````````````````````
+M````````@*4"`"````````````````````````````````````````````"@
+MI0(`(````````````````````````````````````````````,"E`@`@````
+M````````````````````````````````````````X*4"`"``````````````
+M````````````````````````````````I@(`(```````````````````````
+M`````````````````````""F`@`@````````````````````````````````
+M````````````0*8"`"``````````````````````````````````````````
+M``!@I@(`(````````````````````````````````````````````("F`@`@
+M````````````````````````````````````````````H*8"`"``````````
+M``````````````````````````````````#`I@(`(```````````````````
+M`````````````````````````."F`@`@````````````````````````````
+M`````````````````*<"`"``````````````````````````````````````
+M```````@IP(`(````````````````````````````````````````````$"G
+M`@`@````````````````````````````````````````````8*<"`"``````
+M``````````````````````````````````````"`IP(`(```````````````
+M`````````````````````````````*"G`@`@````````````````````````
+M````````````````````P*<"`"``````````````````````````````````
+M``````````#@IP(`(```````````````````````````````````````````
+M``"H`@`@````````````````````````````````````````````(*@"`"``
+M``````````````````````````````````````````!`J`(`(```````````
+M`````````````````````````````````&"H`@`@````````````````````
+M````````````````````````@*@"`"```````````````````````*#R`@"@
+M_P(```````````"@J`(`(`!(\@(`0/("`$3R`@`!````@/("`(#_`@``````
+M`````,"H`@`@``3R`@``\@(````````````````````````````P`#``X*@"
+M`"``%``P```"``"``````````.@#````^@```0```#0`,```J0(`(``8`#``
+M``0````!````````$"<```#Z```!````(``P`""I`@`@`!@`,```````0```
+M```````0)P``@/#Z`@8````\`#``0*D"`"``````````````````_____Q`G
+M````AY,#!@````````!@J0(`(````````````````````````````,2+`@#6
+M````\*P"`("I`@`@`/2L`@`$K0(`"*T"``RM`@`0K0(`%*T"`!BM`@#LK`(`
+MH*D"`"``[*P"`.RL`@`<K0(`(*T"`"2M`@`HK0(`+*T"`#"M`@#`J0(`(`#L
+MK`(`[*P"`.RL`@`TK0(`.*T"`#RM`@!`K0(`1*T"`."I`@`@`$BM`@!,K0(`
+M4*T"`%2M`@!8K0(`7*T"`&"M`@!DK0(``*H"`"``:*T"`&RM`@``````````
+M`````````````````'"M`@`@J@(`(`!TK0(`>*T"`'RM`@"`K0(`A*T"`(BM
+M`@#LK`(`[*P"`$"J`@`@`.RL`@",K0(`[*P"`)"M`@#LK`(`[*P"`/RL`@#X
+MK`(`8*H"`"``[*P"`)2M`@#LK`(`F*T"`)RM`@"@K0(`I*T"`*BM`@"`J@(`
+M(`"LK0(`L*T"`.RL`@#LK`(`[*P"`+2M`@"XK0(`O*T"`*"J`@`@`,"M`@#$
+MK0(`R*T"`.RL`@#LK`(`[*P"`,RM`@#LK`(`P*H"`"``T*T"`-2M`@#8K0(`
+MW*T"`."M`@#DK0(`Z*T"`.RM`@#@J@(`(`#PK0(`]*T"`/BM`@#\K0(``*X"
+M``2N`@`(K@(`#*X"``"K`@`@`````````````````!"N`@`\K@(`0*X"`$2N
+M`@!(K@(`(*L"`"``3*X"`%"N`@#LK`(`[*P"`.RL`@`4K@(`&*X"`!RN`@!`
+MJP(`(``@K@(`)*X"`"BN`@#LK`(`[*P"`.RL`@#HK`(``*T"`&"K`@`@`$"O
+M`@!4K@(`G,L"`%BN`@#LK`(`[*P"`"RN`@`PK@(`@*L"`"``-*X"`#BN`@#L
+MK`(`7*X"`````````````````&"N`@"@JP(`(`!DK@(`:*X"`&RN`@!XK@(`
+M?*X"`'"N`@```````````,"K`@`@``````"`K@(`A*X"`"RO`@"(K@(`C*X"
+M`)"N`@"4K@(`X*L"`"``F*X"`)RN`@"@K@(`/*\"`*BN`@"DK@(`K*X"`+"N
+M`@``K`(`(`"TK@(`N*X"`+RN`@#`K@(`4+("`````````````````""L`@`@
+M`,BN`@#,K@(`-*\"`#"O`@#LK`(`[*P"`.RL`@#0K@(`0*P"`"``[*P"`-2N
+M`@#8K@(`W*X"`."N`@#PK@(`[*P"`.2N`@!@K`(`(``,KP(`$*\"`'2N`@#H
+MK@(`1+\"`.RN`@#\K@(`]*X"`("L`@`@`!2O`@#VK@(`^*X"`/JN`@"@RP(`
+M`*\"`!BO`@`$KP(`H*P"`"``"*\"`#BO`@#4K`(`V*P"`-RL`@#@K`(`Y*P"
+M`!RO`@#`K`(`(``>KP(`'Z\"`""O`@`DKP(`**\"`````````````````."L
+M`@`@`````````````0```````````````````````````````*T"`"``.```
+M```````````````````````````````````````@K0(`(```````````````
+M`````````````````````````````$"M`@`@````````````````````````
+M````````````````````8*T"`"``````````````````````````````````
+M``````````"`K0(`(```````````````````````````````````````````
+M`*"M`@`@````````````````````````````````````````````P*T"`"``
+M``````````````````````````````````````````#@K0(`(```````````
+M``````````````````````````````````"N`@`@````````````````````
+M````````````````````````(*X"`"``````````````````````````````
+M``````````````!`K@(`(```````````````````````````````````````
+M`````&"N`@`@````````````````````````````````````````````@*X"
+M`"````````````````````````````````````````````"@K@(`(```````
+M`````````````````````````````````````,"N`@`@````````````````
+M````````````````````````````X*X"`"```````````````````0``````
+M````````````````````KP(`(`````````````$`````````````````````
+M`````````""O`@`@``````!*````````````````````````````````````
+M0*\"`"``I,L"`!,`````````W*\"``8``0`@L`(`!@`!`!BP`@!@KP(`(``&
+M``$`````````````````)``!`"BP`@`@``$`W,L"`("O`@`@`*`(#```````
+M`````'S4`@"X`0H`````````````````H*\"`"```````/"O`@`.``$``+`"
+M``X``0!,L`(`!@`!``````#`KP(`(```````Y*\"``L``0`0L`(`!0`!`%2P
+M`@`-``$``````."O`@`@```````````````````````W,3(N,"XS````````
+M`````+`"`"``1&5C(#$U(#(P,#,``````)\````````````````````@L`(`
+M(````````````````````````````````````````````$"P`@`@````````
+M`````````````````````0````$`````````8+`"`"``````````````````
+M``````````````````````````"`L`(`(```````````````````````````
+M`````````````````*"P`@`@````````````5F5R26YF;P`%`````P`@<0``
+M````````P+`"`"````````````````````````````````````````````#@
+ML`(`(`````````````````````````````````#8L`(`Z+`"``"Q`@`@````
+M````````````````````````````````````````(+$"`"``````````````
+M````````````````````<F5C96EV95]`L0(`(`!T87-K7T-"<V5M````````
+M`````````````````````&"Q`@`@````````````________````````````
+M````````````@+$"`"``````````````````````````````````````````
+M``"@L0(`(```````````````````````='AS8VAE9%]E`````````,"Q`@`@
+M``````!T>'-C:&5D7W1A<VM?0T)S96T``'1X<V-H961?X+$"`"``4V5T5V5P
+M2V5Y0V%L;&)A8VM396T`````````````````L@(`(```````````````````
+M`````````````````````````""R`@`@````````````````````````````
+M````````````````0+("`"`````````````!``````````$```#H`P``4WES
+M475A;%-@L@(`(`!E;6$`<WES7W%U86Q?0T)S96T``````````````````("R
+M`@`@```````````````````````````````````````!````H+("`"``````
+M``````````````````````````````````````#`L@(`(```````````````
+M`````````````````````````````."R`@`@````````````````````````
+M`````````````````````+,"`"``````````````````````````````````
+M```````````@LP(`(```````````````````````````````````````````
+M`$"S`@`@````````````````````````````````````````````8+,"`"``
+M``````````!S8V%N<GA?=')G``!O<F1E<E]E`'=O<FN`LP(`(`!?;71X````
+M`%!(65]3:'5T1&]W;@````!B8U]S8V%N7Z"S`@`@`&4```!R96QF;W)C97!S
+M<%]E````<V-A;E]T87-K7T-"P+,"`"``<V5M````````````````````````
+M``````````````#@LP(`(```````````````````````````````````````
+M``````"T`@`@````````````````````````````````````````````(+0"
+M`"```````&)C;E]M;VY?0T)S96T```!A8W1I=FET>5]T<F=`M`(`(```````
+M`````````````````````````````````````&"T`@`@````````````````
+M````````````````````````````@+0"`"``````````````````````````
+M``````````````````"@M`(`(```````````````````````````````````
+M`````````,"T`@`@````````````````````````````````````````````
+MX+0"`"``````````````````````````````````````````````M0(`(```
+M`````````````````````````````````````````""U`@`@````````````
+M````````````````````````````````0+4"`"``````````````````````
+M`(````````````````````!@M0(`(`!3>7-T96T@5&EM97(@5&AR96%D````
+M`````````````("U`@`@`````````````0````4````*````"@!5````````
+M````H+4"`"````````````````````````````````````````````#`M0(`
+M(````````````````````````````/____\!`````````."U`@`@````````
+M`````````````````````````/P/ZP_7#^8/`+8"`"``(@!"`/</C@_`#Y``
+MR@"3#TP.F@_M`_\'!`#S#_0/"P`@M@(`(``6`/H/UP_I#R<`*@"J#R$/K0\#
+M`G`%_P>``````````$"V`@`@```````!````````````````````````````
+M````````8+8"`"``````````````````````````````````@#X```````"`
+MM@(`(`#_`````````(`X`0``^@``````````````````PFL``*"V`@`@`$)5
+M```"9```IVL```)D```"9```PFL``$)5```"9```P+8"`"``M&L```)D```"
+M9````F0```)D```"9`````````````#@M@(`(```````````````````````
+M``````````````````````"W`@`@````````````````````````````````
+M````````````(+<"`"``````````````````````````````````````````
+M``!`MP(`(```````````````````````<F5S<&]N<V5?=')G`````&"W`@`@
+M`&%T:6U?=')G````````````````````````````````@+<"`"``````````
+M``````````````````!R>%]E``````````"@MP(`(```````````````````
+M`````````````````````````,"W`@`@````````````````````````````
+M````````````````X+<"`"``<&]W97)U<%]S:6=?90```'!O=V5R7VUG;71?
+M90``````N`(`(```````````````````````````````````````!````""X
+M`@`@``<````*````"@````H`````&0```!D``$`&``!`!@``0+@"`"``(`,`
+M`(`^``"`)0``@`P``"`#```@`P````````````!@N`(`(```````````````
+M``````````````````!P<F]T96-T7X"X`@`@`'!W<E]D;W=N`````&9O<F-E
+M7W1R9P``````````````H+@"`"``````````````````````````````````
+M``````````#`N`(`(```````````````````````````````````````````
+M`."X`@`@`!\`!P`?`/\/````````````````;7=A:71?90```````+D"`"``
+M```````````````````````````````````````````@N0(`(```````````
+M`````````````````````````````````$"Y`@`@````````````````````
+M`````````````&-M9%]W86ET8+D"`"``7V9O<E]R97-P;VYS90```&%L:79E
+M7W)E<W!?90````"`N0(`(`!D<W!?=W)I=&5?=V%I=%]S96T`````````````
+M`````*"Y`@`@````````````````````````````````````"@``````P+D"
+M`"``,````#P````4````#`````\`$0`5`!,`&@`@``H```#@N0(`(`#H`P``
+M`P"P`,@`6!L#`````P```&0`"@`4``\`#Q$3%0"Z`@`@``\1$Q<-#@\1#Q$2
+M%@\1%!8-#0\0_+D"``"Z`@`V+0``(+H"`"``C"T```0O``!Q+0``Z2X`````
+M```=4@``SE$``-11``!`N@(`(``-4@``XE$``-)1```;4@``T%$``+%1``#7
+M9```E60``&"Z`@`@`+%D``#-9```OV0``*AD``#69```GF0```-D``#S=0``
+M@+H"`"``7'4``&IU``#"=0``BW4``&AU``#C=0``7G4```````"@N@(`(`#E
+M6@``!'\```!;``!.6@``3EH```1_```16@``(5D``,"Z`@`@`.=9```$?P``
+M&G\``,M:```T6@```%L``#Q9``!.6@``X+H"`"``=ED``!%:``#16```YUD`
+M``1_```:?P``RUH``#1:````NP(`(```6P``/%D``$Y:``!V60``$5H``-%8
+M``#G60``!'\``""[`@`@`!I_``#+6@``-%H```!;```\60``3EH``'99```1
+M6@``0+L"`"``T5@``.=9```$?P``&G\``,M:```T6@```%L``#Q9``!@NP(`
+M(`!.6@``=ED``!%:``#16```YUD```1_```:?P``RUH``("[`@`@`#1:````
+M6P``/%D``$Y:``!V60``$5H``-%8``#G60``H+L"`"``!'\``!I_```$?P``
+M/UH``(1:``"B60``3EH``(M9``#`NP(`(``I6@``\5@``.=9```$?P``"'\`
+M`/5:```$?P``0UH``."[`@`@`)=9``"760``!'\``"E:```$?P``YUD```1_
+M```(?P```+P"`"``!'\```1_```$?P``!'\```1_```$?P``!'\```1_```@
+MO`(`(``$?P``!%H```1_`````````````````````````````$"\`@`@````
+M``````````````````````````````$`````````8+P"`"``='5N95]W86ET
+M7W-E;0````````````````````````"`O`(`(```````````````````````
+M`````````````````````*"\`@`@```````````````````````!````(``P
+M````````````P+P"`"``````````````````````````````````````````
+M``#@O`(`(````````````'1X;&]C:U]S96T```````````````````"]`@`@
+M``````````````````````````````````````!L;6%C(+T"`"``7W!O=V5R
+M7W!R;V-E<W-?<V5M````````__\```````!`O0(`(``4`%JE________``!0
+M`#``5``P`,``,````%0`8``P`&"]`@`@`&0`,`#$`#````!4`*``,`"D`#``
+MT``P````5`"P`#``@+T"`"``M``P`-0`,````%0``'@"`)C!`@```%K,``!:
+MC`0`(0"@O0(`(`#__S\`!``A``4`(0``(`(````#``!\`@"8PP(```"ES,"]
+M`@`@````I8S__S\`!``A```@`@````,`!``A``4`(0``@`(`X+T"`"``F,4"
+M````ZLP``.J,________/P``````_____P`@`@``O@(`(`````,``(0"`)C'
+M`@``@*Z,``"NC/__/P#_____`"`"`""^`@`@`````P``````_____TM]````
+M``````0```$```!3>7,@0+X"`"``26YI="!487-K````2W0`````````!```
+M!0```$9R86U@O@(`(`!E($AA;F1L97(```!H?P`````````$```+````5%@@
+M4X"^`@`@`&-H961U;&5R`````)E^``````````0```T```!1=6%LH+X"`"``
+M:71Y(%1A<VL`````;W8`````````!```"0```%-C86[`O@(`(``@5&%S:P``
+M``````!N8@`````````$```$````0F5A8^"^`@`@`&]N($UO;B!487-K``$`
+M```"!`L6,@````$"`P0%!@<(`+\"`"``"0H+#`T.```````````````"LZY;
+MD```\/#P\``````@OP(`(```````````````````````````````````````
+M`````$"_`@`@````````````````````````````````````````````8+\"
+M`"````````````````````````````````````````````"`OP(`(```````
+M`````````````````````````````````````*"_`@`@````````````````
+M````````````````````````````P+\"`"``````````````````````````
+M``````````````````#@OP(`(```````````````````````````````````
+M``````````#``@`@````````````````````````````````````````````
+M(,`"`"````````````````````````````````````````````!`P`(`(```
+M`````````````````````````````````````````&#``@`@````````````
+M````````````````````````````````@,`"`"``````````````````````
+M``````````````````````"@P`(`(```````````````````````````````
+M`````````````,#``@`@````````````````````````````````````````
+M````X,`"`"``````````````````````````````````````````````P0(`
+M(````````````````````````````````````````````"#!`@`@````````
+M````````````````````````````````````0,$"`"``````````````````
+M``````````````````````````!@P0(`(```````````````````````````
+M`````````````````(#!`@`@````````````````````````````````````
+M````````H,$"`"````````````````````````````````````````````#`
+MP0(`(````````````````````````````````````````````.#!`@`@````
+M`````````````````````````````````````````,("`"``````````````
+M```````````````````````````````@P@(`(```````````````````````
+M`````````````````````$#"`@`@````````````````````````````````
+M````````````8,("`"``````````````````````````````````````````
+M``"`P@(`(````````````````````````````````````````````*#"`@`@
+M````````````````````````````````````````````P,("`"``````````
+M``````````````````````````````````#@P@(`(```````````````````
+M``````````````````````````##`@`@````````````````````````````
+M````````````````(,,"`"``````````````````````````````````````
+M``````!`PP(`(````````````````````````````````````````````&##
+M`@`@````````````````````````````````````````````@,,"`"``````
+M``````````````````````````````````````"@PP(`(```````````````
+M`````````````````````````````,##`@`@````````````````````````
+M````````````````````X,,"`"``````````````````````````````````
+M````````````Q`(`(```````````````````````````````````````````
+M`"#$`@`@````````````````````````````````````````````0,0"`"``
+M``````````````````````````````````````````!@Q`(`(```````````
+M`````````````````````````````````(#$`@`@````````````````````
+M````````````````````````H,0"`"``````````````````````````````
+M``````````````#`Q`(`(```````````````````````````````````````
+M`````.#$`@`@`````````````````````````````````````````````,4"
+M`"`````````````````````````````````````````````@Q0(`(```````
+M`````````````````````````````````````$#%`@`@````````````````
+M````````````````````````````8,4"`"``````````````````````````
+M``````````````````"`Q0(`(```````````````````````````````````
+M`````````*#%`@`@````````````````````````````````````````````
+MP,4"`"````````````````````````````````````````````#@Q0(`(```
+M``````````````````````````````````````````#&`@`@````````````
+M````````````````````````````````(,8"`"``````````````````````
+M``````````````````````!`Q@(`(```````````````````````````````
+M`````````````&#&`@`@````````````````````````````````````````
+M````@,8"`"````````````````````````````````````````````"@Q@(`
+M(````````````````````````````````````````````,#&`@`@````````
+M````````````````````````````````````X,8"`"``````````````````
+M````````````````````````````QP(`(```````````````````````````
+M`````````````````"#'`@`@````````````````````````````````````
+M````````0,<"`"````````````````````````````````````````````!@
+MQP(`(````````````````````````````````````````````(#'`@`@````
+M````````````````````````````````````````H,<"`"``````````````
+M``````````````````````````````#`QP(`(```````````````````````
+M`````````````````````.#'`@`@````````````````````````````````
+M`````````````,@"`"``````````````````````````````````````````
+M```@R`(`(````````````````````````````````````````````$#(`@`@
+M````````````````````````````````````````````8,@"`"``````````
+M``````````````````````````````````"`R`(`(```````````````````
+M`````````````````````````*#(`@`@````````````````````````````
+M````````````````P,@"`"``````````````````````````````````````
+M``````#@R`(`(`````````````````````````````````````````````#)
+M`@`@````````````````````````````````````````````(,D"`"``````
+M``````````````````````````````````````!`R0(`(```````````````
+M`````````````````````````````&#)`@`@````````````````````````
+M````````````````````@,D"`"``````````````````````````````````
+M``````````"@R0(`(```````````````````````````````````````````
+M`,#)`@`@````````````````````````````````````````````X,D"`"``
+M````````````````````````````````````````````R@(`(```````````
+M`````````````````````````````````"#*`@`@````````````````````
+M````````````````````````0,H"`"``````````````````````````````
+M``````````````!@R@(`(```````````````````````````````````````
+M`````(#*`@`@````````````````````````````````````````````H,H"
+M`"````````````````````````````````````````````#`R@(`(```````
+M`````````````````````````````````````.#*`@`@````````````````
+M`````````````````````````````,L"`"``````````````````````````
+M```````````````````@RP(`(```````````````````````````````````
+M`````````$#+`@`@````````````````````````````````````````````
+M8,L"`"````````````````````````````````````````````"`RP(`(```
+M`````````````````````````````````````````*#+`@`@````````````
+M````````````````````````````````P,L"`"``````````````````````
+M``````````````````````#@RP(`(```````````````````````````````
+M``````````````#,`@`@````````````````````````````````````````
+M````(,P"`"````````````````````````````````````````````!`S`(`
+M(````````````````````````````````````````````&#,`@`@````````
+M````````````````````````````````````@,P"`"``````````````````
+M``````````````````````````"@S`(`(```````````````````````````
+M`````````````````,#,`@`@````````````````````````````````````
+M````````X,P"`"``````````````````````````````````````````````
+MS0(`(````````````````````````````````````````````"#-`@`@````
+M````````````````````````````````````````0,T"`"``````````````
+M``````````````````````````````!@S0(`(```````````````````````
+M`````````````````````(#-`@`@````````````````````````````````
+M````````````H,T"`"``````````````````````````````````````````
+M``#`S0(`(````````````````````````````````````````````.#-`@`@
+M`````````````````````````````````````````````,X"`"``````````
+M```````````````````````````````````@S@(`(```````````````````
+M`````````````````````````$#.`@`@````````````````````````````
+M````````````````8,X"`"``````````````````````````````````````
+M``````"`S@(`(````````````````````````````````````````````*#.
+M`@`@````````````````````````````````````````````P,X"`"``````
+M``````````````````````````````````````#@S@(`(```````````````
+M``````````````````````````````#/`@`@````````````````````````
+M````````````````````(,\"`"``````````````````````````````````
+M``````````!`SP(`(```````````````````````````````````````````
+M`&#/`@`@````````````````````````````````````````````@,\"`"``
+M``````````````````````````````````````````"@SP(`(```````````
+M`````````````````````````````````,#/`@`@````````````````````
+M````````````````````````X,\"`"``````````````````````````````
+M````````````````T`(`(```````````````````````````````````````
+M`````"#0`@`@````````````````````````````````````````````0-`"
+M`"````````````````````````````````````````````!@T`(`(```````
+M`````````````````````````````````````(#0`@`@````````````````
+M````````````````````````````H-`"`"``````````````````````````
+M``````````````````#`T`(`(```````````````````````````````````
+M`````````.#0`@`@````````````````````````````````````````````
+M`-$"`"`````````````````````````````````````````````@T0(`(```
+M`````````````````````````````````````````$#1`@`@````````````
+M````````````````````````````````8-$"`"``````````````````````
+M``````````````````````"`T0(`(```````````````````````````````
+M`````````````*#1`@`@````````````````````````````````````````
+M````P-$"`"````````````````````````````````````````````#@T0(`
+M(`````````````````````````````````````````````#2`@`@````````
+M````````````````````````````````````(-("`"``````````````````
+M``````````````````````````!`T@(`(```````````````````````````
+M`````````````````&#2`@`@````````````````````````````````````
+M````````@-("`"````````````````````````````````````````````"@
+MT@(`(````````````````````````````````````````````,#2`@`@````
+M````````````````````````````````````````X-("`"``````````````
+M````````````````````````````````TP(`(```````````````````````
+M`````````````````````"#3`@`@````````````````````````````````
+M````````````0-,"`"``````````````````````````````````````````
+M``!@TP(`(````````````````````````````````````````````(#3`@`@
+M````````````````````````````````````````````H-,"`"``````````
+M``````````````````````````````````#`TP(`(```````````````````
+M`````````````````````````.#3`@`@````````````````````````````
+M`````````````````-0"`"``````````````````````````````````````
+M```````@U`(`(````````````````````````````````````````````$#4
+M`@`@````````````````````````````````````````````8-0"`"``````
+M``````````````````````````````````````"`U`(`(```````````````
+M`````````````````````````````*#4`@`@````````````````````````
+M````````````````````P-0"`"``````````````````````````````````
+M``````````#@U`(`(```````````````````````````````````````````
+M``#5`@`@````````````````````````````````````````````(-4"`"``
+M``````````````````````````````````````````!`U0(`(```````````
+M`````````````````````````````````&#5`@`@````````````````````
+M````````````````````````@-4"`"``````````````````````````````
+M``````````````"@U0(`(```````````````````````````````````````
+M`````,#5`@`@````````````````````````````````````````````X-4"
+M`"``````````````````````````````````````````````U@(`(```````
+M`````````````````````````````````````"#6`@`@````````````````
+M````````````````````````````0-8"`"``````````````````````````
+M``````````````````!@U@(`(```````````````````````````````````
+M`````````(#6`@`@````````````````````````````````````````````
+MH-8"`"````````````````````````````````````````````#`U@(`(```
+M`````````````````````````````````````````.#6`@`@````````````
+M`````````````````````````````````-<"`"``````````````````````
+M```````````````````````@UP(`(```````````````````````````````
+M`````````````$#7`@`@````````````````````````````````````````
+M````8-<"`"````````````````````````````````````````````"`UP(`
+M(````````````````````````````````````````````*#7`@`@````````
+M````````````````````````````````````P-<"`"``````````````````
+M``````````````````````````#@UP(`(```````````````````````````
+M``````````````````#8`@`@````````````````````````````````````
+M````````(-@"`"````````````````````````````````````````````!`
+MV`(`(````````````````````````````````````````````&#8`@`@````
+M````````````````````````````````````````@-@"`"``````````````
+M``````````````````````````````"@V`(`(```````````````````````
+M`````````````````````,#8`@`@````````````````````````````````
+M````````````X-@"`"``````````````````````````````````````````
+M````V0(`(````````````````````````````````````````````"#9`@`@
+M````````````````````````````````````````````0-D"`"``````````
+M``````````````````````````````````!@V0(`(```````````````````
+M`````````````````````````(#9`@`@````````````````````````````
+M````````````````H-D"`"``````````````````````````````````````
+M``````#`V0(`(````````````````````````````````````````````.#9
+M`@`@`````````````````````````````````````````````-H"`"``````
+M```````````````````````````````````````@V@(`(```````````````
+M`````````````````````````````$#:`@`@````````````````````````
+M````````````````````8-H"`"``````````````````````````````````
+M``````````"`V@(`(```````````````````````````````````````````
+M`*#:`@`@````````````````````````````````````````````P-H"`"``
+M``````````````````````````````````````````#@V@(`(```````````
+M``````````````````````````````````#;`@`@````````````````````
+M````````````````````````(-L"`"``````````````````````````````
+M``````````````!`VP(`(```````````````````````````````````````
+M`````&#;`@`@````````````````````````````````````````````@-L"
+M`"````````````````````````````````````````````"@VP(`(```````
+M`````````````````````````````````````,#;`@`@````````````````
+M````````````````````````````X-L"`"``````````````````````````
+M````````````````````W`(`(```````````````````````````````````
+M`````````"#<`@`@````````````````````````````````````````````
+M0-P"`"````````````````````````````````````````````!@W`(`(```
+M`````````````````````````````````````````(#<`@`@````````````
+M````````````````````````````````H-P"`"``````````````````````
+M``````````````````````#`W`(`(```````````````````````````````
+M`````````````.#<`@`@````````````````````````````````````````
+M`````-T"`"`````````````````````````````````````````````@W0(`
+M(````````````````````````````````````````````$#=`@`@````````
+M````````````````````````````````````8-T"`"``````````````````
+M``````````````````````````"`W0(`(```````````````````````````
+M`````````````````*#=`@`@````````````````````````````````````
+M````````P-T"`"````````````````````````````````````````````#@
+MW0(`(`````````````````````````````````````````````#>`@`@````
+M````````````````````````````````````````(-X"`"``````````````
+M``````````````````````````````!`W@(`(```````````````````````
+M`````````````````````&#>`@`@````````````````````````````````
+M````````````@-X"`"``````````````````````````````````````````
+M``"@W@(`(````````````````````````````````````````````,#>`@`@
+M````````````````````````````````````````````X-X"`"``````````
+M````````````````````````````````````WP(`(```````````````````
+M`````````````````````````"#?`@`@````````````````````````````
+M````````````````0-\"`"``````````````````````````````````````
+M``````!@WP(`(````````````````````````````````````````````(#?
+M`@`@````````````````````````````````````````````H-\"`"``````
+M``````````````````````````````````````#`WP(`(```````````````
+M`````````````````````````````.#?`@`@````````````````````````
+M`````````````````````.`"`"``````````````````````````````````
+M```````````@X`(`(```````````````````````````````````````````
+M`$#@`@`@````````````````````````````````````````````8.`"`"``
+M``````````````````````````````````````````"`X`(`(```````````
+M`````````````````````````````````*#@`@`@````````````````````
+M````````````````````````P.`"`"``````````````````````````````
+M``````````````#@X`(`(```````````````````````````````````````
+M``````#A`@`@````````````````````````````````````````````(.$"
+M`"````````````````````````````````````````````!`X0(`(```````
+M`````````````````````````````````````&#A`@`@````````````````
+M````````````````````````````@.$"`"``````````````````````````
+M``````````````````"@X0(`(```````````````````````````````````
+M`````````,#A`@`@````````````````````````````````````````````
+MX.$"`"``````````````````````````````````````````````X@(`(```
+M`````````````````````````````````````````"#B`@`@````````````
+M````````````````````````````````0.("`"``````````````````````
+M``````````````````````!@X@(`(```````````````````````````````
+M`````````````(#B`@`@````````````````````````````````````````
+M````H.("`"````````````````````````````````````````````#`X@(`
+M(````````````````````````````````````````````.#B`@`@````````
+M`````````````````````````````````````.,"`"``````````````````
+M```````````````````````````@XP(`(```````````````````````````
+M`````````````````$#C`@`@````````````````````````````````````
+M````````8.,"`"````````````````````````````````````````````"`
+MXP(`(````````````````````````````````````````````*#C`@`@````
+M````````````````````````````````````````P.,"`"``````````````
+M``````````````````````````````#@XP(`(```````9F9F9F9F9F9F9F9F
+M9F9F9F9F9E5$,R(1$0````#D`@`@`````!$1(C,S569F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F(.0"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9`Y`(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F#D`@`@
+M`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F@.0"`"``9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F:@Y`(`(`!F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9L#D`@`@`%4S,R(1$0```````!$1(C-$569F
+M9F9F9F9F9F9F9F9FX.0"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9E5$,R(1
+M$0``````Y0(`(```````$1$B,T159F9F9F9F9F9F9F9F9F9F9F9F9F9F9B#E
+M`@`@`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F0.4"`"``9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9@Y0(`(`!F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9H#E`@`@`&9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9FH.4"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9E7`Y0(`(`!$,R(1$0``````````$1$B,T159F9F9F9F9F9F9F9F
+M9N#E`@`@`&9F9F9F9F9F9F9F9F9F9F9F9E5$1#,B(A$1`````````.8"`"``
+M```````1(B(S1%5F9F9F9F9F9F9F9F9F9F9F9F9F9F8@Y@(`(`!F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9D#F`@`@`&9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F8.8"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F:`Y@(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9J#F`@`@`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9E5$P.8"
+M`"``,R(B$0``````````````$1$B(C-$1%5F9F9F9F9F9F;@Y@(`(`!F9F9F
+M9F9F9F9F9F9F9F9F9F95,R(1`````!$1(D1F9@#G`@`@`&9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F(.<"`"``9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9F9F9F9`YP(`(`!F9F9F9F9F9F9F9D0B$1$`````$2(S569F
+M9F9F9F9F9F#G`@`@`&9F9F9F9F9F9F9F9F9F9F9F9E4S(A$`````$1$B1&9F
+M@.<"`"``9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F:@YP(`(`!F
+M9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9L#G`@`@`&9F9F9F9F9F
+M9F9F1"(1$0`````1(C-59F9F9F9F9F9FX.<"`"``9F9F9F9F9F9F9F9F9F9F
+M9F9F53,B$0`````1$2)$9F8`Z`(`(`!F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F9F9F9F9F9B#H`@`@`&9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F9F
+M9F9F0.@"`"``9F9F9F9F9F9F9F9$(A$1`````!$B,U5F9F9F9F9F9F9@Z`(`
+M(`!F9F9F$1$1$1$1````````````````````````````$8#H`@`@`!$1$2(B
+M,S,S1$159F9WB(B9JKN[S-WN____________H.@"`"``________________
+M________[MW,N[NJF8B(=V9F543`Z`(`(`!$,S,S(B(1$1$1````````````
+M````````````````$>#H`@`@`!$1$1$`````````````````````````````
+M```````1`.D"`"``$1$1(B(B,S-$1%559F9W=XB9F:J[S-W=[N[N[N[N[NX@
+MZ0(`(`#N[N[N[N[N[N[N[N[N[N[N[MW=S+NJF9F(=W=F9E551$#I`@`@`$0S
+M,R(B(A$1$1$`````````````````````````````8.D"`"``````````````
+M``````````````````````````````"`Z0(`(```$1$1(B(B,S,S1$15569F
+M=W>(B)FJJKO,W=W=W=W=W:#I`@`@`-W=W=W=W=W=W=W=W=W=W=W,NZJJF8B(
+M=W=F9E551$0SP.D"`"``,S,B(B(1$1$`````````````````````````````
+M``#@Z0(`(```````"0@'!@<&!000$`T+"0@'!B8C(R$,"PH)"0<&!0#J`@`@
+M`!$1$`X.#0P+,S(Q,`P+"@D.#0H)%A02$!(1$`\I*"(A(.H"``@`_____WG_
+M>3L``"2P!0`?``0`#P`P`.VV]K9]MSH..0Y;4$`;6T``:FE*?;>6#PJP`&``
+M`/_7*$$5D)8/`F``U]&-#+`:L`RP#+`-``@`W;PK8%=!FP\P#P3W`&\`;"ZP
+MP&Y`;`!J!0$OD!0.`F!602$.(@XC#B0/)0\F#B<.<0]]#B`/`&!000%@*$$!
+M8"A!`6`H00)J*$L``"A!```H0PYN0`$H04V00`%!`:1`*$&E0BA#!6X`:@)P
+M*$$!$%B0[(T!8"A!-X<P#LEL0`$104`!$D%``1-!20\`:D-*5$H`:D!*$`X1
+M#A(.$PY`4`(?!,P('P+)=K]`4'J@YK`&L2FQ8;&-L9NQN['8L>^Q0%"%H.>P
+M![%)L4!:0!HA50)@`-<H04%0``#_URA!``#_URA+``#_U^R-*$4WAZ</,`\"
+MW9RP6;%`6H`:(56+L#H..0Y`6L`:B[`A6\YP"``@4213%P`'S`;8(E$``");
+M04JVH(.P6+*?L)^P@K*$LB^S2+.)LY2SG["?L&>TG["?L*VSW+/^LY^P*[0S
+MM$JT7;1:LG"R`````````0`'``$`%P`!`!````````````````(`!0`2````
+M`P`!``$``P`#``,`!-0%:,$!<K`A41<?L\[NH%BRG["?L*BPJ+"(L(BPB+"(
+ML)^PG["(L)^PG["(L(BPB+"?L(BPB+"(L(BPJ+"HL`?45X),W%#=!6C!`7*P
+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
+>`&!(0"$@",@A(0;(!&!(0"0/(0X!`"$/)`X!````
+`
+end
diff --git a/sys/contrib/dev/iwi/LICENSE b/sys/contrib/dev/iwi/LICENSE
new file mode 100644
index 0000000..fa26c67
--- /dev/null
+++ b/sys/contrib/dev/iwi/LICENSE
@@ -0,0 +1,210 @@
+ TERMS AND CONDITIONS
+ IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE
+
+Do not use or load this firmware (the "Software") until you have carefully read
+the following terms and conditions. By loading or using the Software, you agree
+to the terms of this Agreement. If you do not wish to so agree, do not install
+or use the Software.
+
+LICENSEES:
+
+Please note:
+
+* If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT,
+ applies.
+* If you are an Original Equipment Manufacturer (OEM), Independent Hardware
+ Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement
+ applies
+
+--------------------------------------------------------------------------------
+
+For OEMs, IHVs, and ISVs:
+
+LICENSE. This Software is licensed for use only in conjunction with Intel
+component products. Use of the Software in conjunction with non-Intel component
+products is not licensed hereunder. Subject to the terms of this Agreement,
+Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up
+license under Intel's copyrights to: (i) copy the Software internally for your
+own development and maintenance purposes; (ii) copy and distribute the Software
+to your end-users, but only under a license agreement with terms at least as
+restrictive as those contained in Intel's Final, Single User License Agreement,
+attached as Exhibit A; and (iii) modify, copy and distribute the end-user
+documentation which may accompany the Software, but only in association with
+the Software.
+
+If you are not the final manufacturer or vendor of a computer system or software
+program incorporating the Software, then you may transfer a copy of the
+Software, including any related documentation (modified or unmodified) to your
+recipient for use in accordance with the terms of this Agreement, provided such
+recipient agrees to be fully bound by the terms hereof. You shall not otherwise
+assign, sublicense, lease, or in any other way transfer or disclose Software to
+any third party. You may not, nor may you assist any other person or entity to
+modify, translate, convert to another programming language, decompile, reverse
+engineer, or disassemble any portion of the Software or otherwise attempt to
+derive source code from any object code modules of the Software or any internal
+data files generated by the Software. Your rights to redistribute the Software
+shall be contingent upon your installation of this Agreement in its entirety in
+the same directory as the Software.
+
+CONTRACTORS. For the purpose of this Agreement, and notwithstanding anything
+to the contrary hereunder, solely with respect to the requirements for
+compliance with the terms hereunder, any contractors or consultants that You
+use to perform the work or otherwise assist You in the development or products
+using this Software shall be deemed to be End Users and accordingly, upon
+receipt of the Software, shall be bound by the terms of Exhibit A, Software
+License Agreement. No additional agreement between You and such consultants or
+contractors is required under this Agreement to detail such compliance.
+
+TRADEMARKS. Except as expressly provided herein, you shall not use Intel's
+name in any publications, advertisements, or other announcements without
+Intel's prior written consent. You do not have any rights to use any Intel
+trademarks or logos.
+
+OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if
+any, are owned by Intel or its suppliers and licensors and may be protected by
+copyright, trademark, patent and trade secret law and international treaties.
+Any rights, express or implied, in the intellectual property embodied in the
+foregoing, other than those specified in this Agreement, are reserved by Intel
+and its suppliers and licensors or otherwise as set forth in any applicable
+open source license agreement. You will keep the Software free of liens,
+attachments, and other encumbrances. You agree not to remove any proprietary
+notices and/or any labels from the Software and accompanying materials without
+prior written approval by Intel
+
+LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS
+BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND
+(INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST
+INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE
+INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR
+SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS
+BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT
+EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR
+INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE
+OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS.
+
+EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH
+FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND
+LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR
+OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant
+or assume responsibility for the accuracy or completeness of any information,
+text, graphics, links or other items contained within the Software. You assume
+all liability, financial or otherwise, associated with Your use or disposition
+of the Software.
+
+APPLICABLE LAW. Claims arising under this Agreement shall be governed by the
+laws of State of California], excluding its principles of conflict of laws and
+the United Nations Convention on Contracts for the Sale of Goods.
+
+WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of
+this Agreement shall be effective unless in writing and signed by an officer of
+Intel. No failure or delay in exercising any right, power, or remedy under
+this Agreement shall operate as a waiver of any such right, power or remedy.
+Without limiting the foregoing, terms and conditions on any purchase orders or
+similar materials submitted by you to Intel, and any terms contained in IntelÂ’s
+standard acknowledgment form that are in conflict with these terms, shall be of
+no force or effect.
+
+SEVERABILITY. If any provision of this Agreement is held by a court of
+competent jurisdiction to be contrary to law, such provision shall be changed
+and interpreted so as to best accomplish the objectives of the original
+provision to the fullest extent allowed by law and the remaining provisions of
+this Agreement shall remain in full force and effect.
+
+EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to
+applicable import and export regulations of the United States and of the
+countries in which each party transacts business, specifically including U.S.
+Export Administration Act and Export Administration Regulations. Each party
+shall comply with such laws and regulations, as well as all other laws and
+regulations applicable to the Software. Without limiting the generality of the
+foregoing, each party agrees that it will not export, re-export, transfer or
+divert any of the Software or the direct programs thereof to any restricted
+place or party in accordance with U.S. export regulations. Note that Software
+containing encryption may be subject to additional restrictions.
+
+GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+Use, duplication, or disclosure by the Government is subject to restrictions as
+set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+of the Software by the Government constitutes acknowledgment of Intel's
+proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+2200 Mission College Blvd., Santa Clara, CA 95052.
+
+TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate
+its terms. Upon termination, you will immediately destroy the Software or
+return all copies of the Software to Intel.
+
+--------------------------------------------------------------------------------
+
+EXHIBIT "A"
+
+SOFTWARE LICENSE AGREEMENT (Final, Single User)
+
+IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+
+Do not use or load this firmware image (the "Software") until you have carefully
+read the following terms and conditions. By loading or using the Software, you
+agree to the terms of this Agreement. If you do not wish to so agree, do not
+install or use the Software.
+
+LICENSE. You may copy and use the Software, subject to these conditions:
+1. This Software is licensed for use only in conjunction with Intel component
+ products. Use of the Software in conjunction with non-Intel component
+ products is not licensed hereunder.
+2. You may not copy, modify, rent, sell, distribute or transfer any part of the
+ Software except as provided in this Agreement, and you agree to prevent
+ unauthorized copying of the Software.
+3. You may not reverse engineer, decompile, or disassemble the Software.
+4. You may not sublicense the Software.
+5. The Software may contain the software or other property of third party
+ suppliers.
+
+OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software
+remains with Intel or its suppliers. The Software is copyrighted and protected
+by the laws of the United States and other countries, and international treaty
+provisions. You may not remove any copyright notices from the Software. Intel
+may make changes to the Software, or items referenced therein, at any time
+without notice, but is not obligated to support or update the Software. Except
+as otherwise expressly provided, Intel grants no express or implied right under
+Intel patents, copyrights, trademarks, or other intellectual property rights.
+You may transfer the Software only if a copy of this license accompanies the
+Software and the recipient agrees to be fully bound by these terms.
+
+EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED
+"AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING
+WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR
+PURPOSE. Intel does not warrant or assume responsibility for the accuracy or
+completeness of any information, text, graphics, links or other items contained
+within the Software.
+
+LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR
+ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS
+INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO
+USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR
+IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE
+LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY
+BETWEEN JURISDICTIONS.
+
+TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if
+you violate its terms. Upon termination, you will immediately destroy the
+Software.
+
+APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the
+laws of California, excluding its principles of conflict of laws and the United
+Nations Convention on Contracts for the Sale of Goods. You may not export the
+Software in violation of applicable export laws and regulations. Intel is not
+obligated under any other agreements unless they are in writing and signed by
+an authorized representative
+of Intel.
+
+GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+Use, duplication, or disclosure by the Government is subject to restrictions as
+set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+of the Software by the Government constitutes acknowledgment of Intel's
+proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+2200 Mission College Blvd., Santa Clara, CA 95052.
+
+
+
+
+
diff --git a/sys/contrib/dev/iwi/ipw2200-bss.fw.uu b/sys/contrib/dev/iwi/ipw2200-bss.fw.uu
new file mode 100644
index 0000000..93ed68c
--- /dev/null
+++ b/sys/contrib/dev/iwi/ipw2200-bss.fw.uu
@@ -0,0 +1,4459 @@
+/*-
+ * TERMS AND CONDITIONS
+ * IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE
+ *
+ * Do not use or load this firmware (the "Software") until you have carefully read
+ * the following terms and conditions. By loading or using the Software, you agree
+ * to the terms of this Agreement. If you do not wish to so agree, do not install
+ * or use the Software.
+ *
+ * LICENSEES:
+ *
+ * Please note:
+ *
+ * * If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT,
+ * applies.
+ * * If you are an Original Equipment Manufacturer (OEM), Independent Hardware
+ * Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement
+ * applies
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * For OEMs, IHVs, and ISVs:
+ *
+ * LICENSE. This Software is licensed for use only in conjunction with Intel
+ * component products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder. Subject to the terms of this Agreement,
+ * Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up
+ * license under Intel's copyrights to: (i) copy the Software internally for your
+ * own development and maintenance purposes; (ii) copy and distribute the Software
+ * to your end-users, but only under a license agreement with terms at least as
+ * restrictive as those contained in Intel's Final, Single User License Agreement,
+ * attached as Exhibit A; and (iii) modify, copy and distribute the end-user
+ * documentation which may accompany the Software, but only in association with
+ * the Software.
+ *
+ * If you are not the final manufacturer or vendor of a computer system or software
+ * program incorporating the Software, then you may transfer a copy of the
+ * Software, including any related documentation (modified or unmodified) to your
+ * recipient for use in accordance with the terms of this Agreement, provided such
+ * recipient agrees to be fully bound by the terms hereof. You shall not otherwise
+ * assign, sublicense, lease, or in any other way transfer or disclose Software to
+ * any third party. You may not, nor may you assist any other person or entity to
+ * modify, translate, convert to another programming language, decompile, reverse
+ * engineer, or disassemble any portion of the Software or otherwise attempt to
+ * derive source code from any object code modules of the Software or any internal
+ * data files generated by the Software. Your rights to redistribute the Software
+ * shall be contingent upon your installation of this Agreement in its entirety in
+ * the same directory as the Software.
+ *
+ * CONTRACTORS. For the purpose of this Agreement, and notwithstanding anything
+ * to the contrary hereunder, solely with respect to the requirements for
+ * compliance with the terms hereunder, any contractors or consultants that You
+ * use to perform the work or otherwise assist You in the development or products
+ * using this Software shall be deemed to be End Users and accordingly, upon
+ * receipt of the Software, shall be bound by the terms of Exhibit A, Software
+ * License Agreement. No additional agreement between You and such consultants or
+ * contractors is required under this Agreement to detail such compliance.
+ *
+ * TRADEMARKS. Except as expressly provided herein, you shall not use Intel's
+ * name in any publications, advertisements, or other announcements without
+ * Intel's prior written consent. You do not have any rights to use any Intel
+ * trademarks or logos.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if
+ * any, are owned by Intel or its suppliers and licensors and may be protected by
+ * copyright, trademark, patent and trade secret law and international treaties.
+ * Any rights, express or implied, in the intellectual property embodied in the
+ * foregoing, other than those specified in this Agreement, are reserved by Intel
+ * and its suppliers and licensors or otherwise as set forth in any applicable
+ * open source license agreement. You will keep the Software free of liens,
+ * attachments, and other encumbrances. You agree not to remove any proprietary
+ * notices and/or any labels from the Software and accompanying materials without
+ * prior written approval by Intel
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS
+ * BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND
+ * (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST
+ * INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE
+ * INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR
+ * SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS
+ * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT
+ * EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR
+ * INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE
+ * OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS.
+ *
+ * EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH
+ * FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND
+ * LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR
+ * OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant
+ * or assume responsibility for the accuracy or completeness of any information,
+ * text, graphics, links or other items contained within the Software. You assume
+ * all liability, financial or otherwise, associated with Your use or disposition
+ * of the Software.
+ *
+ * APPLICABLE LAW. Claims arising under this Agreement shall be governed by the
+ * laws of State of California], excluding its principles of conflict of laws and
+ * the United Nations Convention on Contracts for the Sale of Goods.
+ *
+ * WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of
+ * this Agreement shall be effective unless in writing and signed by an officer of
+ * Intel. No failure or delay in exercising any right, power, or remedy under
+ * this Agreement shall operate as a waiver of any such right, power or remedy.
+ * Without limiting the foregoing, terms and conditions on any purchase orders or
+ * similar materials submitted by you to Intel, and any terms contained in IntelÂ’s
+ * standard acknowledgment form that are in conflict with these terms, shall be of
+ * no force or effect.
+ *
+ * SEVERABILITY. If any provision of this Agreement is held by a court of
+ * competent jurisdiction to be contrary to law, such provision shall be changed
+ * and interpreted so as to best accomplish the objectives of the original
+ * provision to the fullest extent allowed by law and the remaining provisions of
+ * this Agreement shall remain in full force and effect.
+ *
+ * EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to
+ * applicable import and export regulations of the United States and of the
+ * countries in which each party transacts business, specifically including U.S.
+ * Export Administration Act and Export Administration Regulations. Each party
+ * shall comply with such laws and regulations, as well as all other laws and
+ * regulations applicable to the Software. Without limiting the generality of the
+ * foregoing, each party agrees that it will not export, re-export, transfer or
+ * divert any of the Software or the direct programs thereof to any restricted
+ * place or party in accordance with U.S. export regulations. Note that Software
+ * containing encryption may be subject to additional restrictions.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ *
+ * TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate
+ * its terms. Upon termination, you will immediately destroy the Software or
+ * return all copies of the Software to Intel.
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * EXHIBIT "A"
+ *
+ * SOFTWARE LICENSE AGREEMENT (Final, Single User)
+ *
+ * IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+ *
+ * Do not use or load this firmware image (the "Software") until you have carefully
+ * read the following terms and conditions. By loading or using the Software, you
+ * agree to the terms of this Agreement. If you do not wish to so agree, do not
+ * install or use the Software.
+ *
+ * LICENSE. You may copy and use the Software, subject to these conditions:
+ * 1. This Software is licensed for use only in conjunction with Intel component
+ * products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder.
+ * 2. You may not copy, modify, rent, sell, distribute or transfer any part of the
+ * Software except as provided in this Agreement, and you agree to prevent
+ * unauthorized copying of the Software.
+ * 3. You may not reverse engineer, decompile, or disassemble the Software.
+ * 4. You may not sublicense the Software.
+ * 5. The Software may contain the software or other property of third party
+ * suppliers.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software
+ * remains with Intel or its suppliers. The Software is copyrighted and protected
+ * by the laws of the United States and other countries, and international treaty
+ * provisions. You may not remove any copyright notices from the Software. Intel
+ * may make changes to the Software, or items referenced therein, at any time
+ * without notice, but is not obligated to support or update the Software. Except
+ * as otherwise expressly provided, Intel grants no express or implied right under
+ * Intel patents, copyrights, trademarks, or other intellectual property rights.
+ * You may transfer the Software only if a copy of this license accompanies the
+ * Software and the recipient agrees to be fully bound by these terms.
+ *
+ * EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED
+ * "AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING
+ * WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR
+ * PURPOSE. Intel does not warrant or assume responsibility for the accuracy or
+ * completeness of any information, text, graphics, links or other items contained
+ * within the Software.
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS
+ * INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO
+ * USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR
+ * IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE
+ * LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY
+ * BETWEEN JURISDICTIONS.
+ *
+ * TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if
+ * you violate its terms. Upon termination, you will immediately destroy the
+ * Software.
+ *
+ * APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the
+ * laws of California, excluding its principles of conflict of laws and the United
+ * Nations Convention on Contracts for the Sale of Goods. You may not export the
+ * Software in violation of applicable export laws and regulations. Intel is not
+ * obligated under any other agreements unless they are in writing and signed by
+ * an authorized representative
+ * of Intel.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ */
+#define IWI_FW_VERSION 3.0
+begin 644 ipw2200-bss.fw
+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
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````]P(`(`,`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```'L`L`%@`$`!0`&P````!@$&)3H```!6X`:@)P*$$!$`Z0P(8!8"A!Q(L`
+M8!!!_F`100!J&4KP:H!*`6I`2@``0%`CH```FK#,L%*QHK$_LLBRY++XL@``
+M`&"I0$!0,:```)NP^[!`6D`:(54"8`#7*$%!4```_]<H00``_]<H2P``_]?`
+MABA%,`_$BZ</,`Y)L```.@XY#D!:P!HWL(R`#``A6P$>`&`)R00>`6`&R2$>
+M!&`#R2(0MH\(``T`%P`'S`;8(E$``");04IIH"RP3K/(L,BP4+-2LV&S<;/T
+MM/FTR+#(L(JWR+#(L#*U-+4VM<BPW;7=M=ZU!K9-L\BP3;,-MCFV:[9WMIJV
+MR+")M\BPTK:)MR!1)%.-`0!B`&8@51<`!,T@4213F+"I`0$`$;$&U/[<*]T%
+M:,$!(+`A42(?)LZDH$ZSR+#(L%"P4+!0L%"P-+!0L,BPR+`TL,BPR+!0L%"P
+M4+#(L%"P4+!0L,BP3;--LTVS4+!0L%"P4+!0L,BP4+#(L%"P4+!!L4!:@!HA
+M53>P+]6I4`$?`LBBMP!@4$`A42(?`L[8H,BP3K/(L,BP4+`TL%"P4+!0L%"P
+MR+#(L(JWR+#(L%"P4+!0L,BP4+!0L%"P4+!-L\BP3;-0L%"P4+!0L#2PR+!0
+ML,BP4+!0L!;<1=W]@I2(_8($@_V"/X/]@@W</-VI4`BA(+"BMX5`````8$A`
+M!F!`0""P`&#$0"[=0%`#'PK(P5`A,P?(:X_`AH-@/HXH0<2+`&"I0$!0ST`'
+M8'9"=T)`0#`/```P#@U@*$%!4,"&*$'$B\]0`1\-R2!0(3,*R`!@SD`,8*5`
+M`[0!9`!F`&#AA""P````8,1`J4`(8$!`,`]9#C`."F`H04%0P(8H0<2+(+`#
+MLD?<(&I52V):(2$!:E5+!<B`6OQJ@$IPL2Y;(2'QR02#+ELA(>W)`&HM2I.X
+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
+M(3,%R890`!\"R89`AE`H00!@AD"#0'9`=T`H02A!*$$H02A!*$$M4"A!0%`%
+M'P+)`0``8!!B<:E``7-!0`%T04`!=4%``79!0`%W04`!>$%``7E!0`%Z04`!
+M>T%``7Q!0`%]04`!?D%``7]!`0``8%Q`74!>0"M0+$`!`*X!$&I52T`!`6I5
+M2P$`&0`9`!D`&0`!`!@`&``8`!@``0``````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````!)#\8/20_&#@!O
+M`&P`:@4!6Y`@:E5+!&YP;`!J!0%BD`)J54NP;E%L`&H%`6F0`6I52P!@S4!F
+M8$M`(&I52P!@84`(:E5+&&#/0$!@SD``8.U`!V#L0`)@ZT`!:E5+'F!N0`!@
+M;T`:8*-``&I02R];[QB`&B]+`6`H00%@*$%:8"A!T6`H00-@*$$);@!@*$&;
+MD`1NT&Q``2A!GY``8"A!*$$`8!!B"Z`(:E5+'^IH8)!B$X*%`<A`R4(0&"$W
+M`LE`8"!@M["J`14`P4!I8)!B$X++0,Q"`62!9N)'XD7D4>-3&``8`/!"C+$!
+M:E5+"&!H50AJ54L7`/G.:&"08A."R$#)0L%`;&"08A."RT#,0@%D@6;B1^)%
+MY%'C4Q@`&`#P0AD`8!F"`0A@54'!4)\9%0#!0$=@D&(3@N1`Y4)"8)!B$X(9
+M`!D`XT(!8(%B$X*%`1@`&`#F0J@!&0`9`!D`&0`#&>!``1\,R3A@D&(3@N=`
+MZ$(68)!B$X(_&>E`'[$W8)!B$X+G0.A"%F"08A."&``8`.E"`&``9.-4Z5`5
+M$1(`YD#K5!``A0$_&`!@J`$8`(4!`!#UCN14Y587``//`6KJ2N90[%00`(4!
+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
+M3D$`-@40(($/.``8;D,@%0`@$/Z?8:`3`"`4_I]A(!(`(!C^GV&@$``@'/Z?
+M82`/`"`@_I]AH`T`("3^GV$@#``@*/Z?8:`*`"`L_I]A(`D`(##^GV&@!P`@
+M-/Z?82`&`"`X_I]AH`0`(#S^GV$@`P`@0/Z?8:`!`"!$_I]A2/Z?840`3@M`
+M`"X+/``."S@`[@HT`,X*,`"N"BP`C@HH`&X*)`!."B``+@H<``X*&`#N"10`
+MS@D0`*X)!(#M"R"`#S@(&&X#J'Z.4Q`^#A"`D0`HH+DZ*!!^CE,0?HY#`*H`
+M(*A^CE,```X0!`(.$`@^#A`0?HY3`(XN*!!^CD,(`.X+@-4`(/___W____]_
+M____?____W____]_____?____W____]_____?____W____]_____?____W__
+M__]_____?____W____]_____?____W____]_J'Z.4Q`^#A"`?P`HH/HZ*!!^
+MCE,0?HY#`)@`(/___W____]_____?____W____]_____?____W____]_____
+M?____W____]_____?____W____]_____?____W____]_____?____W____]_
+MJ'Z.4Q`^#A``<@`HH"\[*!!^CE,0?HY#@(H`(/___W____]_____?____W__
+M__]_____?____W____]_____?____W____]_____?____W____]_____?___
+M_W____]_____?____W____]_J'Z.4Q`^#A"`9``HH+XZ*!!^CE,0?HY#`'T`
+M(/___W____]_____?____W____]_____?____W____]_____?____W____]_
+M____?____W____]_____?____W____]_____?____W____]_J'Z.4Q`^#A``
+M5P`H(%XZ*!!^CE,0?HY#@&\`(`@X#1#\_Q]@`'P_8&`%```$D$`(`'KA5P20
+M8`B!`0`@!`0`$2#]_R<$!@`1`'P_8"3J`@`$_B!`2`(-$`!\7V```@``3`0-
+M$`#^GV!0"`T0`(0@0`3^($#\_R!@!`(-$`"`#S@``!\X:P$`````'SAO`0``
+M```?.',!`````!\X=P$`````'SA[`0`````?.'\!`````!\X@P$`````'SB'
+M`0`````````````!@+\?____?____W____]_`8"_'____W____]_____?P&`
+MOQ____]_____?____W\!@+\?____?____W____]_`8"_'____W____]_____
+M?P&`OQ____]_____?____W\!@+\?____?____W____]_`8"_'____W____]_
+M____?P:`OQ\0``T(`'K@5X'^_R<$@+\?____?PP`#1`$`&`(&`"`"`'^84`$
+M!@`0"`"`"S`(#1```"X(`/K@5P()`"`$`.X+"`!N"PP`3@L0`"X+%``."Q@`
+M[@H<`,X*(`"N"B0`C@HH`&X*+`!."C``+@HT``X*.`#N"3P`S@E``*X)(($/
+M.$1^CD,$``X(`H`?$@@`+@@#@A\2#`".#Q``[@L4`*X+&`!N"QP`3@L@`"X+
+M)``."R@`[@HL`,X*,`"N"C0`C@HX`&X*/`!."D``+@I$``X*2`#N"4P`S@E0
+M`*X)5`"."5@`;@F(``X(`7[@KUP`3@E@`"X)9``."6@`[@AL`,X(<`"N"'0`
+MC@AX`&X(?`!."(``+@B,``X($H`?$H0`#@@@@0XXJ'Z.0P#\[V/____[`($/
+M.`#\[VL````$`($/.`#\#V`````$`/SO8_____L`@0\X`(#O:P"!#S@`_`]@
+M````!`"!#S@@@`\X`"``"""`#S@`@``2@`(.$(0`#A````T(>`8.$`!ZX%=\
+M!`X0(0H`(`%^`$````T05!@.$%@6#A!<%`X08!(.$&00#A!H#@X0;`P.$'`*
+M#A!T"`X0`J!?"0.@/PD,>`X0!!0.$`@2#A"(<@X0C'8.$""`#S@4.@X0```-
+M$`P`+0A4&`X0`/K@5U@6#A`!"0`@7!0.$&`2#A!D$`X0:`X.$&P,#A!P"@X0
+M=`@.$`*@7PD#H#\)#'@.$`04#A`($@X0B'(.$(QV#A`4.@X0"+@`$""`#S@(
+M`(T+((`/.*A^CD,$@+\?____?P``#0@!>@!0```-$`$-`"`$``X(`H`?$@@`
+M+@@#@A\2#`".#Q``[@L4`*X+5`"."5@`;@F(``X(`7[@KUP`3@E@`"X)9``.
+M"6@`[@AL`,X(<`"N"'0`C@AX`&X(?`!."(``+@B,``X($H`?$H0`#@@@@0XX
+MJ'Z.0PP`#0@`>N!7*`!-"*$<`"``>N%7$`"-""(!`"``">!7@@T`(`@`@`L$
+M``X(`H`?$@@`+@@#@A\2#`".#Q``[@L4`*X+5`"."5@`;@F(``X(`7[@KUP`
+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
+M+"AH_E]@``@?""R]`@``?>!7(T(```(#`"#X@0T(@/X_8`@:@!`*`H`0#!J`
+M$`X"@!"1_A]`H$\L*"E^)T#\@0T(]($M"*`<""@,?@!`H++W)R3^GV$```!`
+M``!?$"J[`@``@`\X!#X.$("&]R\```!B`()@8@"B*%(@%@`@`)[G40+^OV$#
+M?@=``GX`D``*(!@`>N=7"H(@4/G[X%<+?#]@^?___P?^`$``#@`8!7Y`@`/^
+M!H``!`!``WX`0`"HIT$`J(="``!*$`+^`(````=0`H`_4`"*`!@1>N!7"0-)
+M$`L#`"``?#]@:0$``*`X+"@+_A]@$/X?8`D!21``>N!7B@(`(`O^'V`@-2PH
+MM_X_0````%`)`4D0`"H`0!`%``@!_BA"`8!&$`+^YT$%^NA7"A@`(`!\GV(@
+MNP(``R+(`0!\7V*`P`(``GKG5P!\OV*\TP(`#`(`(`+^'V``(HA!``!&$`+^
+MWV&U>^=7B@$`(+7_WV$`(HA!`!Q&$-A[YU>)W_\GR'OG5PP)`"``_`E`;-4"
+M```'(`@0!P`(`GX`0`"``%``"L`:$'X'0``L`$``"L`9!?X?8"`?+"@`HBA@
+M!?X?8*`=+"@`+"M@H-;_)P/^OV'">^=7"9JF4:D!`"`>?@=``?Z_82Q^!T"@
+MTO\G``K`&8```"B`<O<G!#X.$"`]]R\0_A]@`'R_82"\`@`4_C]@`/]&0`K^
+M?V`"_I]@(!\C*`"*HE``A08(```?$'"8`@`!A08(```?$'28`@`"A08(```?
+M$'B8`@`#A08(```?$'R8`@`$A08(```?$("8`@`%A08(```?$(28`@`&A08(
+M```?$(B8`@`'A08(```?$(R8`@`(A08(```?$)"8`@`)A08(```?$)28`@"`
+M5/<G!#X.$"`U]R\L_I]A````8@""H&$`!.%AH`4`(``<QU'_A2T((/TK*`C^
+M'V``I`9``08`"`%^QT$``"!`_X4-"``B`$`,`T`0`!WH5XP'`"``'$="`J0&
+M``">)V`@H@TH__]-0``!X&<`?#]B(+P"`('U_R<`O@]@`'Q?8-C(`@`@7C$H
+MH?X_8(#__R<@5/<G+/Z?80!\'V`@]@(`````"!!ZX&<"@`\X``@?""R]`@``
+M?>!7($(```$^`2``!!\(4;4"`!)ZX%<!#``@@*4!(*`)`"``@B!0`((`0%O^
+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
+M0`@``^%7@0,`(`"%(0@8_N"G`)I<0"X$(0@"_B!H+@)!$`((0`@."``(``7@
+M5P$#`"``A0$(&'[@IP":/$`NA``(!'X`:"Z`0!"@"@@H%/\!0(`IY2<`?!]@
+M=+L"```(""`$/@X0H/GD+Q3^GV$`"!\(`-("`/R!C1"@$1<H`?X?8`!\7V!`
+MT`(``'P?8`&1```:_C]@H"P9*`"&85#\_PU``OX_8*!M&2@`!$%0_84-"```
+M'Q!LF`(`H`D7*`+^'V`@,.4G%/Z?80"`X*?___]_____?____W____]_____
+M?____W____]_____?____W____]_____?____W____]_____?R"`#S@`]AU@
+M!#X.$*#FY"\@_I]A`((@4/R##1``#>`?](,-$*0#`"#X@PT0`'P_8/2U`@!(
+M@0`(`7X`0"`2`"!(@0`0`'P`8/]___\`$*`9_/\-0/C_+4`@]_,O]/]-0``!
+MX&<"!0`@^($M"!G^'V`,@$`0!/X?8`Z`@!"@@@\H`)H&8/2!+0@@`@`@`(``
+M$`"^#V"@=1\HL?X_8`!\/V#TM0(`]($-"$R;@!`````(4($`$$2!``@!?@!`
+M1($`$/B!#0C\@2T(H';U+PQ^`$`@#>4G(/Z?800^#A`@S^0O'/Z?80""@&``
+M!,%A%'[@IP!\OV#PX`(``(J\00"*/``$@$8(``/A5P#R?&"!!``@``GB9P("
+M`"`,@$8(!_X`@"`(`"``!`!```D`*``!XE<%`0`@H`8`(`'^'V``B@$`$(`F
+M"/R!#1#\_PU`('TD*``(0F#\@0T(#(`F"`=^`(```@!````'$````%`@^>0G
+M'/Z?811^X*<`?!]@\.`"``"`/$``@!P`!(!`"``!X5<F@`\X!@`!4!"`(`@`
+MA"!`((`/.`"``%`$/@X0H-#D+TC^GV&`?N4O```@8P!\_V*@_P(``'P?8ECA
+M`@`$``@(`(`K"`"!X%<`?!]CN+P"`(("`"#0_A]@H(,9*$+^/V"````@`'\2
+M*``!;`H`I^EG@28`(`0`"`@`@"L(`('@5X$D`"`"?B"`"``("`"JJE(``J`!
+M!(`)"`R`20H``0P0H`@`(`"FR6$%_A]@_(%-$`":YF$(`"<*`WYK0/R!K0@$
+M_A]@`"@J8`":1F#\_V%@H"`-*`"JBF"@XQ`H`OX?8`">IV$`HLAA`!WG9X$2
+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
+M'P@!V`(```'V+UR!)@@5^N"'@P,`(``$'P@`V`(``7X`8`%^`'B@*?XO`GX`
+M0%R!)@@'^N"'@P@`((2!!@@!?@!`A($&$``$'PCTM`(```'@9P$%`""@V`XH
+M`OX?8`!\'V`<LP(`($P!*'W^/YB`@08(7($F"`%^`$"`@080`(W@'X/G_R>`
+M4O8O````4`!^1Q`@B]XG#(%&$`0^#A"`6MXO``'@9P!\'V"XO@(`@0$`(*!"
+M`2C__S]@@```((!D`2@``>!G@8+>)P"^#V``?%]@5-("`*";&"A-_C]@@/__
+M)P0^#A"`6]XO````8@""X&$`!*%A((7@+P"&P6$)>N!7`@,`(`"^#V``?%]@
+M5-("`""4&"A9_C]@@/__)P"`X"\#>N!7`@,`(`"^#V``?%]@5-("`*"/&"A:
+M_C]@@/__)P`@"&``GB=@`)I&8*#^!B@`'&=@((\**````%"`<]XG!#X.$(!!
+MWB^`QOLOH&W>)P```%`$/@X0(#_>+\C^/V``?!]@*+`"`(`G`2@``>!G`6G>
+M)P!\7V!4R`(``'P_8"$"``"@@1@H`+X/8(#__R<```!0=``-$""`#SAX``T0
+M````4'P`#1`@@`\X@``-$`0^#A``.]XO>`#@"0``H&$`H!\(``$`2``!`$@`
+M`0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'____W]T@"8(`(/@9P*?
+MYV<!&@`@`(`G"`#]X%=.1%9$`A@`('R`)@@`',=1`(/F5W2<!A!!`P`@$)P'
+M$!""!Q"`@$8(@(0`$'R`)@A\`@$0%(`G"/__($`4@@<0/(`F"`?ZX%>"!0`@
+M!_X_8)""!A`H`"T(`?X@0"@"#1```*`?(.\!*`":!F```>!G`K_?+X```"``
+M`*`?<(`&"``!X&>!`0`@(.0"*%C^!D"````@6)P&$`"@'P@``0!(``$`2``!
+M`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____?P``H!^`/]XG!#X.
+M$``1WB\``*!A!`(`$````%`(@`80$(`&$!2`!A`,@`80`*`?"``!`$@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_;``M"`"#X&<`
+M_`803D161`$#`"`<@$`(')H`$!@:`1`<A`80(`(`(!B"!A!L&@T0&)H&$!R:
+M!A!P`"T(`?X@0'`"#1```*`?H"G>)P```%`$/@X0``G>+P``H&$`@@!B``0A
+M8@"&06(`".)A`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(
+M!'X@8`"`H!____]_`OKH9PB`)@@A`@`@`*!`8``%Z%>"`@`@``$`(``%X6<!
+M`0`@(`$`(``<QU$'_M]A`!WG9P(#`"`!^NAG``()$($7`"``H"!PH!8`(`B"
+M!A``G^=G@10`(`P`S0ET?`<0TT,``(0@!Q",(@<0B"0'$'@:!Q`0@"8(`(/@
+M9X$$`"!\`@<0@(`@"(`"!Q`0@"8(@(`@"'R<`!`0@"8((`(`(("<`!`0G`80
+M?!P'$(`<!Q`4@"8(`?X@0!2"!A`'_C]@/`('$`'^/V!$`@<0*``M"%@>!Q`!
+M_B!`*`(-$```H!__^^=70H8"*%A^!T"@_`$H`!P'8*`!`""0`,<)!_[?80``
+MH!^@`]XG`!P'8````%!L``T0((`/.'``#1`$/@X0`.'=+P``@&(`@J!A``3!
+M80"@'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?
+M____?P@`*@@">N=G`IH@8$(;`"`(`@H0$`#J"0":P&D`G^=G%``*"B%?`"`(
+M'`H0`7KH5X(7`"",@"<(A(!'"`+ZX&<A`@`@`!PA8``#X5>"`@`@``$`(`"#
+MX&<!`0`@(`$`(`""(%`'_C]@`(/@9P(/`""(@"<(`)P`$(R`)P@!^N!G@0$`
+M((2`)P@``B=P"`(*$`":IE$0&@H0%!H*$"@`+0ATF@<0`?X@0"@"#1```*`?
+M<(`'"``!X&>!`0`@H'D"*%C^!T"````@6)H'$)":!Q"@?0$H`)X'8``!X&<!
+M1P`@`$W?+P!&`"```*`?`$4`(`"B*%(0(@H0`*9I4B@`+0@`)$E2`?X@0"@"
+M#1``GJ=A``"@'P"@'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`
+M2`1^(&``@*`?____?PP`*@@`@^!G`00`(`PB"A`(`"H(`)_G9P"<P&DA&P`@
+M%``*"B`!`"``GD=@`)I&8(P`80B$`"$(`OKA9R$"`"``G(!@`(G@5X("`"``
+M`0`@``GB9P$!`"`@`0`@`((@4`?^/V``@^!G?`"A"0(0`""(`"$(`?KA9P"<
+M`!`!`@`@A``A"`@`:@@`@B%P"`(*$'P`(0@``^%7H0,`(`&>YU$`'^%7@`!A
+M"`&"X&&`A@`0?``A"'R"`1`4`"H(__\@0!0""A``I^EGD"(!$*("`"!T(@$0
+M?"(!$``$06(@`@`@``1A8GP$"1!\(@$0``1!8O]["$*"VO\G$!X*$```H!^`
+M"@`@($@"*%C^"4``H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!
+M`$@$?B!@`("@'____W\H`"T(`?X@0"@"#1```*`?H$4!*`"F"6``FF9B`*?I
+M9P$#`"!P@`D(``'@9WR`J0F"\O\G(//_)UBB"1``H!\(``$`2``!`$@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'____W\H`"T(__\@0"@"#1``
+M`*`?$``-"`P`+0@`@>!7@0$`(```#0@``>!G`;G_)R"7W2<```!0`"'H9P&X
+M_R<,`"H(`?X@0*"V_R<,`@H0!#X.$(!=W2^`N@`H`#X"*`!H`"@`"P`H`(O_
+M+P`B_R^`(_\O@(;=)P0^#A``6]TO```-"`!\OV'P\/#P`'W@5_'P\/"!`0`@
+M(-?=+P`:#1"`]?\O`!H-$*"Y'2@$``T(````4"#YW2\```T0@'[=)P```%!D
+M``T0((`/.&@`#1`$/@X0`%7=+W@`X`D``*!A`*`?"``!`$@``0!(``$`2``!
+M`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_=(`F"`"#X&<"G^=G`1H`
+M(`"`)P@`_>!704U%4P(8`"!\@"8(`!S'40"#YE=TG`8000,`(`R<!Q`,@@<0
+M@(!&"("$`!!\@"8(?`(!$!"`)PC__R!`$(('$#R`)@@&^N!7@@4`(`W^/V"0
+M@@80*``M"`'^($`H`@T0``"@'R`)`2@`F@9@``'@9P+9WB^````@``"@'W"`
+M!@@``>!G@0$`("#^`2A8_@9`@```(%B<!A``H!\(``$`2``!`$@``0!(``$`
+M2``!`$@``0!(``$`2``!`$@$?B!@`("@'____W\``*`?@%G=)P0^#A``*]TO
+M``"@800"`!`(!``0````4`R`!A`0@`80`*`?"``!`$@``0!(``$`2``!`$@`
+M`0!(``$`2``!`$@``0!(!'X@8`"`H!____]_7``M"`"#X&<`_`8004U%4P$#
+M`"`8@$`(&)H`$!0:`1`8A`80(`(`(!2"!A!<&@T0%)H&$!B:!A!@`"T(`?X@
+M0&`"#1```*`?($3=)P```%`$/@X0`!S=+P``P&$`@N!A`*`?"``!`$@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_"``G"`"#X&<!
+M`@`@__\@0`@"!Q`@%0`@`)JF40"?YV<!$P`@#`"M"73\!A"?10``>)P&$`P`
+M)P@`@^!G@00`('R"!A"`@"`(@((&$`P`)PB`@"`(?)H`$`P`)P@@`@`@@)H`
+M$`P:!Q!\F@80@)H&$!``)P@!_B!`$`('$`;^/V`\@@80`?X_8$2"!A`H`"T(
+M6)X&$`'^($`H`@T0``"@'__[YU="J@$H6/X&0*`@`2@`F@9@H`$`()"`I@D-
+M_K]A``"@'Z`DW2<`F@9@````4%P`#1`@@`\X8``-$`0^#A"`^-PO``#`80"@
+M'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____
+M?PP`IPD`F^9G`)[G40$/`"!\@"8(`(/F5T$#`"`,'@<0#`('$("`1@B`A``0
+M?(`F"'P"`1`0`"<(__\@0!`"!Q`H`"T(=)X&$`'^($`H`@T0``"@'W"`!@@`
+M`>!G@0$`(""J`2A8_@9`@```(%B>!A"0G@80(*X`*`":!F```>!G`G[>+P`"
+M`"`(`"<(`?X@0`@"!Q```*`?(`?=)P```%`$/@X0`-C<+P``H&$T`@`04`0`
+M$%0&`!``@B!0"`(`$`P(`!`4"@`0`?X"4``(`$`0@`80'WY#8!_^`V!(@`80
+M$(`-"#B$!A`8@`80'(`&$`2"!A`#_A]@/(`&$$""!A!$@@808/P&$&%)``!D
+MF@80<((&$%R"!A!T@@80>((&$'R"!A"`@@80`80?@$R`!A`H@@80+((&$#""
+M!A``?#]@/T@``"!*WB\`F@9@`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`
+M2``!`$@``0!(!'X@8`"`H!____]_%``M"`"#X&<`_`801%)(5`$#`""8@$`(
+MF)H`$)0:`1"8A`80(`(`()2"!A`4&@T0E)H&$)B:!A`8`"T(`?X@0!@"#1`H
+M`"T(`?X@0"@"#1```*`?%(`-"``!X&>!`@`@(($`*`":!F```>!G`E'>+P`(
+M`"``H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@
+M'____W\H`"T(__\@0"@"#1```*`?(-+<)P```%`@@`\X#``-"``(@E`,"`T0
+M$`@-$!P(#1`@"`T0(/X?8"0`#1``?!]@6-4"``!^0!`!?F!`(`(`(`'^7V``
+M@D$0`?YA0`%^04``?>%7``$```8$`"``@B!0``0!8`%ZX&<"^_\G``0`&`'^
+M($"@_?\G`(X@&`!\/V!8U@(`(`(`(````%``B``0!/X@0`%^`$`@>N!7A?W_
+M)Q0(#1`8"`T0((`/."@(#1`$/@X0`)7<+P``X&$`@J!A``3!80"@'P@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____?SB`)P@`
+M@^97#18`(`"#YE>"!``@`OX@@`#\(`!8U@(``(/G5P("`"!,@"<((`!-"``"
+M(7`@`@T02(`G"``"!Q`0`"T(`(/G5TB:!Q""#``@.(`G""0`30@`A>!7#87F
+M5PX*`"`"?B&``/P@`%C6`@`0`@T0``"@'R@`#0@``>!G@1G>+P"@'P@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____?R`!`"``
+MFJ91&/Z_80``H!\@G=PG`)H&8`0^#A``<]PO``#@80""P&$@^N!7``2A8<8Z
+M`"`/_K]A`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@
+M8`"`H!____]_.(!'"`"$!A`\@"<(`(/@9X$#`"`XG`<02)P'$`&</X!,@@<0
+M``"@'Z`N`"``FJ91(("'"`")YU<`?#]@6-8"`"$)`"`"?F&``()!``"%YU<"
+M`P`@`(*!00`(!A!,@$<((`!M"`"$07`@!`T0)(!G""0&`A`@@$<(((0!$`&<
+M7X!,A`<0H!0`(`":IE$`FJ91`(*!04R`1P@<`&T(_X6?<"``30@`B&%@``A!
+M8"`$#1`!G%^`3(0'$`"/01@<!@T0(0(`(`!^!A`"?$$`6-4"`(`*`"`(_D&(
+M``]!&`$"`"`"?$$`6-4"`*`'`"`(?D%`$/Y!B``/01@!`@`@`GQ!`%C5`@`@
+M!``@$'Y!0!C^08@`#T$800(`("#^7V`"?$$`6-4"`!A^04`D!`T0$`!-"`"%
+MYU<"!``@)`!-""!ZX5<!`@`@`GY!@``"(0`@`0`@$`(-$!`:#1!(F@<0`_X_
+M8#R"!Q`H`"T(.)P'$`'^($`H`@T0``"@'Z`%`"@`G@=@$``-"`P`+0@``^!7
+M2)P'$($!`"````T(``'@9X'2W2\@7MPG`)H&8`0^#A"`,=PO``#`80":IE$`
+MH!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'___
+M_W\H`"T(1`!'"/__($`H`@T0``7A9SP`)PB!`P`@`?K@5P+]X%<"`````1P`
+M(`""(%"@!``@1`('$`"#X&>!&0`@0`!'"``%X6<`@B!0`0(`($`"!Q`#_C]@
+M(!8`(#P"!Q`X`$<(/`('$`)^88``?)]@6-8"``"((0``@^!G`0,`("2`0`@@
+M'`$0))P`$"0$!Q`@#P`@(`('$`"(@4``'`(03``G"!P`;0@`AB!H$`!M""`<
+M!Q``A^%G'`(-$"("`"`D'`<0$!P-$"`(`"`D!`T0)``M"``#X5<&!@`@2("!
+M"``)X5<D!`T0!@0`(#B`(0@``^)7`0(`($R`(0@@`$T(`(0@:"`"#1`0'`T0
+M``"@'Q``#0@,`"T(``/@5P$"`"````T(``'@9P%\OV$!````("[<)P":!F`$
+M/@X0@/W;+PP`+0A4@``(4(`@"`""`#@,``T(,``@"`"#X&<"@@`X`*`?"``!
+M`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_#``M
+M"`'^7V`\A``01(0`$"@`+0@!_B!`*`(-$```H!\@&``H#``-"``;W"<$/@X0
+M`/+;+PP`+0@``*!A`(/@9P)\'V!8UP(``H'@5X$!`"````T(``'@9P$!`""@
+M#P`@$_[?80";YF<`',=1@0T`(`"@'P@``0!(``$`2``!`$@``0!(``$`2``!
+M`$@``0!(``$`2`1^(&``@*`?____?PP`30@$_C]@/`(!$`'^/V!$`@$0*``M
+M"`'^($`H`@T0``"@'PP`#0A8&@`0((L`*%A^`$"@`0`H#``-"*`&W"<`'`=@
+M!#X.$`#@VR\`?!]B6-4"````X&$`H!\(``$`2``!`$@``0!(``$`2``!`$@`
+M`0!(``$`2``!`$@$?B!@`("@'____W\H`"T(__]`0$2`)P@`@^!G*`0-$(%#
+M`"``BJ)01(H'$""`AP@X@"<(`(GG5P!\OV%8U@(`(0X`(`+^8(`D@"<()`("
+M$""`1P@@A``0`)HA``"#YU>".P`@`)J!00`$!A`@`$T(``7A9X$!`"!,@"<(
+M``(A<"`"#1`0`"T(`(/G5P(V`"`D`"T(`OX@@`":(``@-``@$`(-$```#0@`
+M`>!G`NO;)P`D`"``FH%!3(`G"!P`;0C_@S]P(`"-"`""86``">)G'`8-$*$!
+M`"``"@80`(B`8"`(#1``CR$8`B#(8<(*`"`"H&``"/XAB`"/(!@!`@`@`"#(
+M80*@(``@!P`@"/Y@0!#^(8@`CR`8`0(`(``@R&$"H"``H`,`(!#^8$`8_B&(
+M`(\@&($1`"`"H"```"#(81C^8$`D!@T0$``M"`"#YU>"'0`@`OXA@`":(```
+M">)G$`(-$`$;`"`!?B%`*`(-$```H!\`H!\(``$`2``!`$@``0!(``$`2``!
+M`$@``0!(``$`2``!`$@$?B!@`("@'____W\H`"T((`!-"/__($`H`@T0``\A
+M&`$$`"`@"P`@`IP@`"#^/V`D`@T0$`H-$```H!\`.=TO@,7;)PA^(8@`CR`8
+M@0$`(`*<(``@!0`@"/X@0!!^(8@`CR`8@0$`(`*<(``@`@`@$/X@0!A^(8@"
+MG"``&/X@0`+^((``FF``)``M"$B`@0@`B>!7!0(`($R`(0@0!@T0``(A<"`"
+M#1```*`?$``-"`P`+0@``^!7@;;;)X#)_R<$/@X0`(G;+PP`K0D`',=1`*`?
+M"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_
+M/(`F"`"#X&>"#``@'(`F"!B"!A`H`"T(`(/@9P)\/V`!````0@D`(!B"!A`@
+M@&8(`(?F5P$'`"!(@"8(.(!&"``#X5<"!0`@`GXA@`!\7V!8U@(``(2`020`
+M+0@`!@80`OX@@`"$(``!_M]A$`(-$```H!\@G=LG`!P'8`0^#A"`<=LO``"@
+M83P```@$>N!7@@D`(`"@'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(
+M``$`2`1^(&``@*`?____?R@`+0@!_B!`*`(-$```H!^@-/\O`)H&8`"0VR<`
+MH!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'___
+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
+MYF<``,!A(0(`(/_^GV(@60(H&(0)"```@&(">N=7C`$`(`5ZYU<B!``@`H[C
+M4`KZYU?!`@`@`?[_8!:$"0@!_O]@0'K@9P*.XU`">NI7#`$`(`5ZZE>"!0`@
+M`"GJ9X$#`"``C^-G@@(`(``EZ6>!`@`@0H0*"`1ZX%<!`0`@(`$`(`'^7V``
+M!$%0"/KK5X((`""`>NQ7`?X_8@L'`"`$!`@(`7K@5P$%`"`!!`@(`7K@9P)]
+MX&<"````0@$`(!X("`@8"`@(8'X`8"!ZX%>"```@`*(H4@":!F"@)0(H`"@J
+M8```@&``+`M@`!PG8"`R`B@`CD-@``@@0`!\GV#<L@(```$""``"`$``H^AG
+M``$"$($$`"``'`=@H$T"*``D*6``#@`8H!<"*`".(V```2((``(`0``!`A``
+M/M@O```?$/B8`@"`M-4G!#X.$`",U2\``*!A`@@`"``D25($?@!``!``&@``
+M'P@$]P(`("T"*``0`!@``,!A'(`&"`"B*%(1!$`(`?[_801ZX6<`?']B6*T"
+M`""$"0@"GN=1@'K@9P'^/V`!@B!0"'KA9X!^H6%"`@`@`?X_8@)ZX6<"?#]B
+M`@````"CZ&>!`0`@H$\"*``<!V``$$`:`*/H9X$&`"`">NE7#`$`(`5ZZ5>"
+M!``@`"7I9X$"`"``G^=G@@$`($*$"0@$>N!7`0$`("`!`"`!_E]@``1!4``.
+M*1@@_0$H`*((8```@&``(`A@`!PG8*`)`B@`GD=@``@@0`!\'V+<L@(```$(
+M"``"`$``F^9G``$($($$`"``'`=@H#T"*`""(%``#@`8(.\!*`">)V```2@(
+M``(`0``!"!"`%=@O```?$/B8`@``A]4G!#X.$`!<U2\``,!A``H?""ZQ`@``
+M$.`9``0?"/S7`@```>!G`"`(4H$(`"``/^DO``@_"!*Q`@`!>N!7`((@0((!
+M`"`%_```)+$"```%`"`%_```*+$"```00!@`"!\(GKP"```$`$`@`@`@`!#@
+M&0`*'P@8L0(``!!`&`!\OV%8K0(`0X0F"`"#X&>""P`@`)X'0`1\```4F0(`
+M``XG&``.`!@@'``H``1!4``&`"`"?B>0(`,`('2$'U``!`%``'P`0'3)`@`F
+M"``(`GXGD``.`!@`CB`8H`<`*``$05````!BH`(`($.$)@@!^N!7@??_)P+Z
+MX%<!^/\G`(/@9W!^"%`"8]4G``@_"$BU`@"@8=4G``(`4`0^#A`@+]4O0'Y@
+M8`;^@9`@?F!@!?YAD`"(84`$_F&`'WZ`8``"`A@`"`!```8`0``%X6<``&!@
+M@0``(```@1!-_@!``('A5XP#`"``?%]@>,@"``!\/V#'`P``(&P/*`"^#V"`
+M__\GH$_5)P`&`%`??F!@`(*!&``&HD!`?F!@!OYAD`&&GU``!G\("KX"`"!^
+M`&``@F$8#_YA0`"(X:<`\F)0!7X`D!1^X*<`"A\("N`"``"&G$```F`8``H?
+M"`S@`@```@`8``8`0``(`$``!>%G``Q@&($``"```($0``0?"!"T`@```@!`
+M((`/.``&`%`$/@X0(!/5+P+^'V``?+]A)-\"``"`1@@`@B!0@/Y_0"#:%"@`
+M"()0!(!&"`/^'V``@B!0@/Y_0"#7%"@`"()0`#?5)_^1/Q@``H`0`@*`$""`
+M#S@$`H`0`'Q_8!``(`"@`@`@``1!4``$(4`$`B```7Y!0`""@10`?>%7``$`
+M``:`#S@`_/\G!#X.$``'U2\``,!A`'S_81``(`"@"P`@`)JF40":)D``R`<(
+M``(G0`"`@!#___]_____?____W____]_____?____W____]_____?____W__
+M__]_____?____W____]_____?____W____]_____?P'^ID$`_>97``$``(8@
+MU2<`\_\G!#X.$"#OU"\`"()0``,`(`)^`H``?`!`)-\"`*#E_R\(```(`7Z"
+M0"!ZXE<&%]4G@/O_)P0^#A"`\M0O0_[_@0!\'V(DWP(```#`8:`#`"`"_K]A
+M`OXF@`"$0$"@X_\O```!$`@`QPD!_J9!`!WG9P$&`"`B^N97!@4`(`P`!P@`
+M`>!G`"!(8`+Y_R<`O@]@`'Q?8!S2`@"@)`\H%/XG0(#__R<``-\)H.$"```#
+M`"`"_B:``(1`0"#8_R\```$0"`#'"0'^ID$`'>=G`08`("+ZYE<&!0`@#``'
+M"``!X&<`($A@`OG_)P"^#V``?%]@'-("`"`9#R@A_B=`@/__)P#D`2B@`P`@
+M``#`80+^)H``A$!`H,S_+P```1`(`,<)`?ZF02+ZYE<&"0`@`!WG9P`@2&"!
+M!``@#``'"``!X&<"^?\G`+X/8`!\7V`<T@(`H`T/*"_^)T"`__\G`+X/8`!\
+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
+M!@H`(>AG@@<`((S^'V`@O`@H$GXI0"#V$"CX_PU``(XH&*#D$"CX_PU```4`
+M(`"^#V``?%]@Q,<"`"`C#B@'?BE`@/__)W2?1A",_A]@(+0(*!M^*4",_A]@
+MH+((*!]^*4"`"]8O```@8*"P""B+_A]@@`G6+P=ZX%<"?>!7!@```('C_R=U
+MA28(`?K@5P$AZ&>!X?\G"'K@5X("`"````<(^($-$`0`!PB@`0`@_($-$*#B
+M$"CX_PU`^/\-0*#`#R@`@B!0````8HO^'V`@I`@H`"`H8`)ZZ%<-?`A2`@``
+M`(#9_R?__Q]B=)]&$(O^'V`@U_\G2'XI0`1^`(``?"!`E,<"``R```@`?$!H
+M``P```2```@`!``4`(`/.`1^`(``?`!`E,<"``@```@````(((`/.`"``!``
+M?!]@!``@``"`#S@`?!]@!``@``"`#S@$?@"``'P`0)3'`@`$```(`$``"`%^
+M`&`@@`\X`(``$`1^`(``?$!`E,<"``0`(0@`P``(`GK@9P*`#S@,``$(`'P`
+M:``"````@``4`(`/.`0^#A`@L],O'/Z?8:!\U"\``,!A``"@80`<!V`@-_TO
+M_/\M0`1^!X``?%]@E,<"```$($``!$``_($-"````1`,@``(`'Q`:``!```$
+M@``(``0`%"!VU"\`F@9@(.33)QS^GV$$/@X0`*;3+P`!P&$B`P`@`(*@80"L
+M`2B````@`)H!*"`"`"``@`80`7KG5X']_R<`@`8(``'@9X')TR<$?@>``'P@
+M0)3'`@`,@``(`'Q`:``0```$@``(``0`%`#%TR<$/@X0`)73+X``XB\%!"`(
+M!`0`"`C^((```@!H`'P_8"R^`@``?>!7)$(``"*]TR<`@8`0`/V`$"-"````
+MN],G!#X.$`"-TR^`^.$OY`0@".4$``@``E\0E>$"``]^`&```%\0E.$"`("U
+MTR<$/@X0`(_3+P``H&$`@N!A(/+A+P`$P6$``>!G@@,`(`!\7V#DT0(``'P_
+M8$$*```@R@TH`+X/8(#__R<"&B```!H`0`$$8`@`?%]@,+X"``"*`1C0`X$0
+MT@=!$`"#X&<!`>!G`8(@4`$``%``@H<0(*K3)P``1Q`$/@X0`'O3+R!G^2\`
+M`*!A(*73)PB`!A`$/@X0@'_3+P``P&$`(`A2`'S_86BT`@`@`0`@`)JF40'^
+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
+M'V`````@`.O_+P2`[0L@@`\X$!!N"P0^#A``-@X0`#AN8Q!^CE,%>N!7A@(`
+M(`)^((``_`!`^,D"```!``@`Y/\O!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC
+M%'Z.4Q`:#A``?+]A&``P``#CTB\`@"8(`/P@:`"`````@@80`./2+Q``K@D$
+M@.T+((`/.!00;@L`?!]@$``P``!\7V`8`#``````"`!\(&`/SP`````!"``"
+M(&``@A]0``(`:!]^`(@`@`\X`'P?8!``,``````(`GX@8`""'U```@!H'WX`
+MB`"`#S@`?!]@$``P``````@$?B!@`((?4``"`&@??@"(`(`/.`0^#A``-@X0
+M`#AN8Q1^CE,0&@X0``"@80!\'V`0`#``````"`%^(&``@A]0``(`:!]^`(@`
+M>N!7@0,`(`!\'V```"`(`,S2+P`:(&``@A]0``(`:!]^`(@0`*X)!(#M"R"`
+M#S@4$&X+`'P?8!``,``````(`'P@8`"`````@A]0``(`:!]^`(@`@`\X!#X.
+M$``V#A``.&YC$'Z.4P!\'V`4O0(```4`"`1ZX%>-`P`@``4`("#^'V``6_\O
+M``@`(!#^'V"`6?\O@`8`(`"^#V"E_C]``(@,*(`$`"`"?H"!`'R&`=QQ`0``
+M``8X;%P``&E<``!L7```:5P``'Q<```$@.T+((`/.!`0;@L$/@X0`#8.$``X
+M;F,8?HY3$!H.$/S_#4"`SO<O_(%-"`!\/V`4O0(`"($`"````5``?>!7`*`/
+M`(4Y`"``?!]@H)@"````0`@`?!]@&/<"``````@`!$!``'P?8'SW`@`````(
+M``2@002!``@`@`90`'W@5P`"```%`P`@`'P_8`"0`0``?!]@A.$"```"`!``
+M+``@`'W@5P`!```%`P`@`'P_8``@`P``?!]@A.$"```"`!"`)P`@0'K@5P4#
+M`"``?#]@`+`$``!\'V"$X0(```(`$(`C`"`0>N!7!0,`(`!\/V``0`8``'P?
+M8(3A`@```@`0@!\`(`!ZX%>!`@`@,OX_F`!\'V"$X0(```(`$``<`"``?%]@
+M`$`?``!\'V"$X0(```0`$`"%``@#>N!7@A$`(`1ZX%>-`P`@@`4`("#^'V``
+M1?\O@`@`(!#^'V"`0_\O``<`(`"^#V``?#]@(P$``(!4#"B`!``@`GZ`@0!\
+MA@%X<P$````&.-)<``#/7```TEP``,]<``#C7````?X?8``+`"`@_A]@`!W_
+M+P`)`"`0_A]@@!O_+X`'`"``O@]@I?X_0`!*#"B`!0`@!'K@5PW]_R<"?H"!
+M`'R&`=1S`0````8XZ%P``.5<``#H7```Y5P``/I<``````!0@'8`*`!\/V`4
+MO0(`!)L`$/R!30@(A0`0$`"N"02`[0L@@`\X&!!N"P0^#A``-@X0`#AN8Q!^
+MCE,`?!]@%+T"```%``@!>N!7`0,`($#^'V"`"/\O`((@4`!\'V"6W@(```)`
+M$`2`[0L@@`\X$!!N"P0^#A``-@X0`#AN8Q!^CE,`?!]@%+T"```%``@!>N!7
+M`0,`($#^'V"`'/\O`?X_8`!\'V"6W@(```)`$`2`[0L@@`\X$!!N"P0^#A``
+M-@X0`#AN8Q!^CE,`\]\O2@0`"`!\/V`4O0(``(%`$`1ZX%>!$@`@!'K@5XT#
+M`"``!0`@(/X?8`#T_B\`"``@$/X?8(#R_B^`!@`@`+X/8*7^/T``(0PH@`0`
+M(`)^@($`?(8!%'4!````!C@Z70``-UT``#I=```W70``2ET``"#^'V"`ZOXO
+M`'P_8!2]`@``A0`(`7K@5P$#`"!`_A]@`.?^+P""(%``?!]@EMX"```"0!``
+M``!0`$@`*`!\/V``D`$``'P?8(CA`@```@`0`'P_8`!`'P``?!]@A.$"```"
+M`!``?#]@`#`J``!\'V"0X0(```(`$`!\/V``L`0``'P?8(SA`@```@`0!(#M
+M"R"`#S@0$&X+!#X.$``V#A``.&YC''Z.4Q`:#A`4'`X0`'S?883A`@````<(
+M`'W@5P!`'P"""P`@`'R_812]`@``A08(`WK@5X(Q`"#\_PU``%#W+_R!+0@0
+M@P80`'P?8(#A`@``!``(`'K@5P(!`"````<(@`$`(`!\'V"(X0(`````"`!\
+MOV$4O0(`%($&$(`H`"#\_PU``$?W+_R!+0@`?+]A%+T"`!"!!@@`@`!0#($&
+M$!2!)@@`@>!7"2``(`!\'V"`X0(```0`"`%ZX%<"#@`@```'"!2!!A``A08(
+M!'K@5XT#`"``!0`@(/X?8`"[_B\`"``@$/X?8("Y_B^`!@`@`+X/8*7^/T``
+MZ`LH@`0`(`)^@($`?(8!W'8!````!CBL70``J5T``*Q=``"I70``O%T`````
+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
+M`!@`%$!!`)5$$).$)PH/_@A@"/KH9P)\`&CP`````@H`&``$"`H`%F!!`7KH
+M5Q"71!`,#``@YH0'"`]^`&`#^N%7```@0@((`"``!!\(4+4"``!ZX%<,!@`@
+M`OX(0`"``U!`@400`"0!0``:`$`!!0`(#WX`8````$`"?@!````"4"`#`"!0
+M@400`OX(0"`!`"````10(/X?8#"!1!"AA@<(`?X@0@1^`)``'`!```H@&0"*
+MR$$@`4<0FH8'"`1^`)``%`!```I`&0`!1Q"3A@<(!'X`D``6`$`!>NA7$`%'
+M$*P&`"``"F`9YH0'"`1^`)`#^N%7``#@00("`"``!!\(4+4"``!ZX%<)SO\G
+M`OX'0"`!`"````10(/X?8"#1_R<P`4<0`_KA5X('`"``!!\(4+4"``!ZX%>,
+M!0`@H`,`(`""(%``)`%```(`0`@'8`@`C`!`&`=`$`'^($`.^N!7BO3/)X#[
+M_R>@`@`@`((@4*@&80@`C`!`&`=`$`'^($`.^N!7"O#/)X#\_R<$/@X0H+O/
+M+P``P&`@@?PO`((`8```H&"@>?PO`((`8```0&`@QOPO`((`8```8&"@OOPO
+M`((`8```@&#_^^)7`OWA5_____\"?>%7_____P)]XE?_____@@,`(`!\7V!X
+MR`(``'P_8&\$``"@]@DH`+X/8(#__R<`#`-@(&OU+P"*(F"`V,\G`'P?8!29
+M`@``@`\X!#X.$""ISR^W_A]@`'P_8$T%``"`@@0H`'P?8/$<````@B!0("72
+M+P3^7V``T<\G!#X.$""CSR^W_A]@`'P_8%0%``"`?`0H`'P?8,8<````@B!0
+M(!_2+PC^7V``R\\G!#X.$*"=SR\4_I]A`'P?8"#V`@`````(@'K@9P(.`""`
+MB^,O``!@8`!\GV"<O0(`,`4""`".(1@@'N8O__]-0/^%#0@#?B"``'P?8)29
+M`@``A^%G``)`0((&`"``"A\(#N`"`/M_X*<`_!Q`F_?__PA^`)`$?B!`!`8!
+M"``"`$``>N!7"1``&`P``%`"`8(0(,[/)Q3^GV$$/@X0`(_/+Z!9T"\``,!A
+M``"@8:`7U"\"_A]@`'R?8'BS`@"0"0((`'P_8`"(`@`4_E]@``*`00`$1A"4
+M!4((``)@0`&$01`"`@```OX_8`'^7V`@P0@H`!QG8*!1T"\`F@9@`*W/)P0^
+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
+M`%`$`8<0!@D'"`%^`$`&`8<0H.C++P":!F``1LLG!#X.$*`4RR\4_I]AH`;Q
+M+_S_#4#\@0T((%3+)Q3^GV$`A>!7!H0`4`4$`%``@`$0((`/.````%`$/@X0
+M`!?++P``P&$`@@!B``2A82#;RR\``.$)`*`G0``#YU<.G"!0(-O++P""!A"@
+M.,LG````4"`!`"``@B!0`?X@0`7ZX%>&!0`@&/[@IP#\7$`DJP(`*``!"```
+M8`@D``$(````"`"!X5<!^O\G((`/.````%`@@`\X`?X?8`0^#A``!\LO`?[_
+M803^WV&@#``@&/Z_83@`"`@````(``'@9P*^#V#"FP4H8?X_8#0`"`@````(
+M``'@9P($`"`D``@(````"``!X&<"`@`@*``("`````@``>!G@0$`(`"^#V!G
+M_C]@@),%*`'^YT$8_J9!!'['007ZYU<&'\LG`'P_8"2K`@```@=`$```"``!
+MX&<`@@9"@>__)R@`"`@``"`()``("``"`!`P`@@0+`(($#@`"`@````(``'@
+M9P&^#V!!B`4H3OX_8#0`"`@``"`()``("`````@``^!7A0(`(`"^#V"@@P4H
+M4OX_8#0`"`@``"`(*``("`````@``^!7A>S_)P"^#V`@Z_\G5OX_8"`#`"``
+M"()0``1@"`%^@D``AD`0`?X@0`%^`$``">%7C?S_)P"`#S@"?H&((`,`(`"&
+M85```$`(`?YA0`"$`!`$_B!`!'X`0``'XE<.@`\X`/S_)P!\/V`DJP(`"(``
+M"`"`0`@````((,#_)P'^/V`8?N"G`/Q<0"2K`@`T``$(`()@8"@`(0@````(
+M`(`@"""X_R<P`$$(!_X@@`"``$``@`$0((`/.````%`8?N"G`/Q<0"2K`@`T
+M``$(````"""U_R<D`$$(&'[@IP!\7V`DJP(``(0<0#0```@L?D%`````"*"P
+M_R<`<D%`&'[@IP!\7V`DJP(``(0<0#0```@P?D%`````"""L_R<`<D%`!7K@
+M5P""8&"&!``@&'[@IP#\7$`DJP(`.``!"#``(0@````(-`!!"*#K_R<``$$(
+M((`/.`3^'V`$/@X0`+3*+P!\?V!8K0(`&H1!"``#X6<`FJ91`0,`(`1^`$`@
+M]O0O!/XA0``!X&<!?+]A`0```"#9RB<`C@88!#X.$`"QRB\``.!A`'R_85BM
+M`@`:A`8($'K@9P`<QU&!!0`@!/X'0*#M]"\$_B9```'@9P(#`"`0_@=`(.OT
+M+PK^)D```>!G`7S?80$````@T,HG``X'&`0^#A"@ILHO*/Z?80``X&$`@L!A
+M_/\-0/C_+4"@N-DO]/]-0/R!#0BA_C]@``*`$/B!K0D/_C]@#()&$``(``@0
+M?@!0#H"&$*#^'V"@9<LO#8!&$)Z>1A"?G$80"'['B:!ERR^@G$80^($-"/R!
+M+0B@.]LO#'X`0"#1RB<H_I]A!#X.$`"1RB\`!!\(?.`"``-ZX%<*@0`H`%S+
+M+P``H&$@@>$O"?X?8(!=X2\@7,LO`)H&8*!BWB\!_A]@TOX?8*!B_R_X_C]`
+M`+3*)P0^#A"@A<HO&/Z?80`$'PB6W@(```'@9P+G^"\`.`8H`7K@5XX"`""`
+MW/HO````4`""(%`@1_LO`?Y?8(!#`BB`9@(H`"OX+P```%`@VO8O^/\M0```
+M`%#__S]@()?Y+_S_34````!0H+[Y+_C_+4`"_A]@__\_8*"3^2_\_TU``OX?
+M8""[^2_X_RU`!OX?8/__/V`@D/DO_/]-0`;^'V"@M_DO^/\M0`/^'V#__S]@
+MH(SY+_S_34`#_A]@(+3Y+_C_+4`$_A]@__\_8"")^2_\_TU`!/X?8*"P^2_X
+M_RU`!?X?8/__/V"@A?DO_/]-0`7^'V`@K?DO^/\M0`K^'V`@.O`O`?X_8`O^
+M'V"@./`O`((@4```'P@0MP(``'W@5P````("?>!7````!($#`"``?%]@F,@"
+M``!\/V`P`@``H*4$*`"^#V"`__\G@,GW+X`HRR____]_____?____W____]_
+M____?____W____]_____?____W____]_____?____W____]_____?____W__
+M__]_____?____W____]_____?____W____]_____?____W____]_____?___
+M_W____]_____?____W____]_____?____W____]_____?____W____]_____
+M?P!$`"@`#O@OH,,'*`K^'X"@B/<O^/\-0`!\'V`$``#V@-/W+____W____]_
+M____?____W____]_____?____W____]_____?____W____]_____?____W__
+M__]_____?____W____]_____?____W____]_(('W+_C_#4#X@0T(``'@9X';
+M_R<!_O\?`/__)P0^#A``.,HO``&@88$!`"`@@"8(`(/@9P(!`""@8,HG`?X?
+M8"R$!@@``>!G@@$`("V$!@@``>!G`0$`("`!`"`!_A]@````4``!X&<``!\0
+M;+\"``$"`"``?!]@<+\"`(`=\"\@@"8(`H0`"``!X&<"`P`@`'Q?8-R7`@``
+M``$(`7X`0````1`#A``(```_"`RW`@``@^!G@@$`(``(/PBLK0(`@`$`(`#\
+M($#$NP(`_X4@"``#X%<+3<HGH$S*)P""`&```!\(#+<"```!X&<!@`\X`'P?
+M8'2_`@``#O`G```_"`RW`@``@^!G`8`/.``$``A(>N!7`8`/.`!\'V!XOP(`
+M``GP)P0^#A``%\HO``"@80``'P@,MP(```'@9P%`RB<`?!]@<+\"```$\"\$
+MA`8(`7K@9P$]RB<!A`8(('K@9P'^'V`!``!0```?$&R_`@"`.<HG!#X.$"`+
+MRB\4_I]A`'P?8`H`(`B`W<HO`'P_8`H`(`@@W<HO_G\`8"!H]R_\_PU``*?W
+M+R!'RB<4_I]A!#X.$``#RB\`?!]@"@`@"(#6RB\`?#]@"@`@""#6RB\!?@!H
+M`-SW+X`KRB<$/@X0H![*+V#^GV$`FJ91_)L-$/2;#1``*(I2\)L-$`">YU$`
+M)$E2`'P?8PRW`@`%_C]C`'R_8GS@`@``?-]A3+4"``!\?V)<GP(``'P?8L2\
+M`@``?/]BT)<"`*`(`"``F@9@@.W_+Z!M!R@*_A^`(%+W+^3_#4"`O<HO@+[*
+M+^B!#10`2NTO2$$H""!>[2](?TA`1`$($.C!#0@`O<HO]($-"``!X&>!B]\O
+M`"/,+P]ZX(>$!@`@```,"``00!H```<(`'W@9Q_W_P>A`P`@`+)*$-/^'V"@
+MOOXON?X_8"`_V2\```<(`!H'$``IZF>"`@`@`"0)8/S_+4"@M@`H[/]-0`"`
+MZ0G\@0T(``'@9P$7`"``$<PO!7K@5X$!`""`#\PO`7K@5P(4`""`I<HO@#3M
+M+P""(%"@2.TO2'](0$0!"!``)`E@_/\M0*"L`"CL_TU`_($-"``!X&>!"``@
+M`(0*"`%ZX%<,!P`@T?X?8*"K_B_?_C]@(,7@+P;^'V``A`H(`GK@5PL"`"``
+M?!]@```(`(`HV2\``0`@H,#@+P?^'V``F,HO`)G*+^B!#12`).TO2$$H"*`X
+M[2](?TA`1`$($.C!#0B`E\HO(/K++P"B*%()>N!7@0$`(`#XRR\#>N!7@@``
+M(`'^/V+XHPT4^,$-"``!X&<!)0`@`"GJ9P(D`""`BLHO@!GM+P""(%"@+>TO
+M2'](0$0!"!``)`E@_/\M0*"1`"A,?TA``(`)"`"!YU>!`0`@_)L-$"`!`"``
+MF@9@_($-"``!X&<!"@`@T?X?8""/_B^0_C]``(0J"*"-_B_1_A]@3$$H""",
+M_B_1_A]@3$$("*#]`"CP_RU``(0*"`)^`(``?"!`O)<"`/R!``@!?@!`(`P`
+M(/R!`!#2_A]@((7^+Y7^/T``A"H(H(/^+]'^'V!,02@(((+^+]'^'V"@F^`O
+M"/X?8/B;#10`A`H(`GK@5XL!`""@_]@O$/X?@``!`"`@E^`O"?X?8`"`"P@!
+M?@!``(`+$`!MRB\`;LHOZ($-%(#Y["](02@(H`WM+TA_2$!$`0@0Z,$-"(!L
+MRB_XP0T(``'@9P(#`"``>NE7C!T`(```'PA\X0(```'@9X$;`"``?#]B!``P
+M`/C!#0@`@,@*``'@9P)\/V!5`0``0FW^+]'^'V"`7<HO\($-"`1^`&@`+,!J
+M____?____W____]_____?____W____]_____?____W____]_____?____W__
+M__]_____?____W____]_____?____W____]_____?____W\`K`@0____?___
+M_W____]_____?____W____]_____?____W____]_____?____W____]_____
+M?____W____]_____?____W____]_____?____W^`2,HO^,$M"`"#X&<!CO\G
+M`$7*+X"O!R@``>!G@0(`((#2["\`@B!0H.;L+TA_2$!$`0@0T_X?8*!._B_5
+M_C]``(0J""!-_B_3_A]@`&7_+PK^'V`"_C]@(`'G+P/^7V```"!B(`\`*/3_
+M#4#T@2T(H$?^+]/^'V#T@0T(``'@9P$$`"``H^AG`@,`("">RR\!_I]B!7K@
+M5P5U_R<@=_\G\)L-$/";#1`@6^`O"/X?8$Q!"`B@T``H`"B*4@"$"@@">N!7
+MB@$`("!7X"\)_A]@@'#_)Z"\V"\0_A^``&__)P0^#A`@8\DO'/Z?80``P&$`
+M``!0H%3^+_R!#1```:!A`00`(``$'PA\X`(`!'K@5P/^'V`*?!]@!````*"<
+M^"_\_RU``)OF9P""(%`!`@`@_($-"``!X&<!?#]@`0`````"!Q`@D\DG'/Z?
+M800^#A"`8<DO``!`8@!\WV&,W@(````'"`/^'V(,`*`)`'P_8O37`@`<@.8)
+MH"K7+P":!F````!0(H"&$"!=WR\`F@9@+*!'$`/^'V`M@$<0"'X`B"!/`B@N
+M@$<0`WX`8"J`AQ``@"@(2/X?8`"`0!``)>EG`?Y`$*$!`"`!_G]B$?X?8`&`
+M0!``>LLO!GK@AX,!`""`P>4O``'@9P$!`"`@`@`@$:9&$```!PB@A>DO`?X_
+M8*#XWB\`F@9@$80&")]^`&`!>N!7`0@`(`"`*`@!A``("'X`:`&`0!``?#]@
+M&)8"``"```@!?@!``(``$!&$)@B@#?XOTOX?8"R@1Q````<(H'KI+P'^/V`&
+M_A]@+(!'$`?^'V`M@$<0"'X`B*`U`B@N@$<0!WX`8"J`AQ``?#]@%)8"``"`
+M``@!?@!`H%S))P"``!`$/@X0H$#)+TS^GV$`?-]B'_?_!P`!(&(`@N!A``0!
+M8@":IE'PFPT0[)L-$,%J`"``F@<0H!3O+_3_#4``?-]A;,`"``0!!PCT@2T(
+M`(!@4`+^2(``?`%`S+L"`/P!``@!_G]B`('A5P@!!P@.IFE2`("`4`!\`4#@
+MNP(`_`$`"`'^/V(``>)7#`$'"`ZB*%(`@"!0```?"/2[`@`!_I]B`('@5P`!
+M!P@.*(I2``'@9P`D25(!`@`@```?"/B[`@``@>%7A0``(`'^7V*`0\LO!7K@
+M5P4#`"``JJI2`*?I9P*CZ&<"*>IG`B7I9X$``"`!_K]B`'P?8`D`(`@@W<DO
+M`?Y_8@)ZX&<!IFE2````4"!-]2_\_RU``OX?8*!+]2_X_RU`H#C++P"B*%(!
+M>N!7@00`((`VRR\%>N!7`0,`(``URR\#>N!7@0$`((`SRR\)>N!7`@4`(``T
+MRR\``>!G@@,`(``2XR\``>!G`@(`((#4TR\``>!G`7P_8@$`````?%]B?.$"
+M`*#O_2\`(@D0`*(H4@"KZF<"I^EG`0D`(!`!)P@`@^!G@0<`(/R!+0@`@^!G
+M`08`(/B!+0@`@^!G@00`(```*0@`@^!G`@'@9X$"`"```!\(3+4"```MX&<!
+M?#]B`0````"CZ&>!'0`@`'P?8/2K`@``+"M@``1!4.S_;4`@[.HO``B"4```
+M0&+6_A]@H,#]+P`D*6``M,DO(!G++P``8&(%>N!7`'S?87#A`@""`P`@@*#?
+M+_"!#1`!_A]@```'$""QR2\`I@E@@`<`(*"OR2\`I@E@\/\-0*!-!R@!_C]@
+M("?E+P``!Q``$"`8`/W@5___```!`@`@\($-"``#X%>.```@\(,-$`=ZZ5<`
+M!$%0@@,`(```!P@``>!G@0$`(/"!#0@+>N!7C@``(`'^7V``@B!0`*/H9P(%
+MX6<!`@`@[($-"``MX&<!?#]@`0````""(&(`H^AG`*('$`$3`"#P@0T(``'@
+M9X$1`"``?%]@?.`"```$(0@%^N!7@@,`(!%ZX%<-?`"`"@````U\`$``Q/__
+MS00`(```"!`*?@"``'P`0`#4__\```@0!?K@5P%\/V`$``````)!$`!]X%<`
+M"```#0(`(`+ZX%<)?#]@`@`````#`"``?>!7(`@```T#`"`#^N!7"7P_8`,`
+M```@`0`@``)!$``:"!"@],@G3/Z?80!^'Q!\OP(``7Y?$,BM`@``@`\X`7X?
+M$'N_`@``?E\0R:T"``"`#S@$/@X0`+C(+P``H&$`!!\(?.`"``%^`%`$>N!7
+M`!S'4:X6`"``@N!A`+X/8*!.`RB+_C]@@!``(`";YF>!!P`@`'S?873A`@``
+M``!0H*#W+P`<)V``?#]@>.$"`*">]R\!_A]@```'"``:`$``?"!0"`0``*"G
+M]R\$_A]@`'S?80```/:`!@`@`)OF9P*:)F!"I/<O`_X?8`!\WV$```"V``,`
+M(`!\WV$````V`)OF9P*:)F#"G_<O`_X?8`"<!Q"@2@`H`)H&8`!\'V!(;0``
+M`%_R+X#&R"<#?(`!4+P!``!\AD$4;P`````&./#NY]/3````!#X.$*"AR"\X
+M_I]A``#`80!\'V)TX0(````("`!\7V(`!````!P`0`!\X%$(!`````0?"'S@
+M`@`!?@!0!'K@5P":IE$N.``@&_X_8@"^#V"@*P,HMOX_8``L`"``'>=G@1H`
+M(````%"@BO<O`?X_8`'^'V`@??<O\/\M0`3^'V``GB=@()_W+_C_34````@(
+M```I4/B!#0@``B!`"OY`B`#\`&``_/__`(``4```*5`&^N!7`7ZA02X"`"#T
+M@PT0H'_W+P```%#T@2T(!/K@5RX"`"````!0H'#W+_3_+4"`_/\G('OW+P`D
+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
+M(`@H@`8(````"`"!X%>-[?\G`+X/8"#L_R=\_C]@!#X.$``V#A``.&YC$'Z.
+M4X#&["\`?#]@F)@"``"``!`(_A^8@`/K+P#[ZB^`!@`H"OX?8`'^/V``1N,O
+M"_X?8`'^/V"`1.,O````4`!\/V`*`"`(`$2^+P2`[0L@@`\X$!!N"P!\?V`D
+M`#```'Q?8"0!,```?#]@*`$P``!\'V``"`"``(`!$(.&'Q@```$0A88?&`"`
+M`!``@`\X@'X?$,2?`@``@`\X`%@"```8````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````B`(`*&(`````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````0`````````````````
+M`````````````$%"1SHY+C`N,BXV``````!-87(@,C(@,C`P-0``````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````![`'H`>@!Y`'@`>`!W`'8`=@!U`'0`=`!S
+M`'(`<@!Q`'``<`!O`&X`;@!M`%@`6`!7`%8`5@!5`%0`5`!3`%(`4@!1`%``
+M4`!/`$X`3@!-`$P`3`!+`$H`%@`6`!4`%``4`!,`$@`2`!$`$``0``\`#@`-
+M``P`"P`*``D`"``'`!YL"1``````'G$)$``````>=@D0`````!Y["1``````
+M'H`)$0`````>A0D1`````!Z*"1$`````'H\)$0`````>E`D1`````!Z9"1$`
+M````'IX)$0`````>HPD2`````!ZH"1(`````'K0)$@`````,V`,`_0$!``S<
+M`P#]`0$`#.`#`/T!`0`,Y`,`_0$!``SP`P#]`@$!#/0#`/T"`0$,^`,`_0(!
+M`0P*!``'`@("#`P$``<"`@(,#@0`"`("`@P0!``*`P("#!($``H#`@(,%`0`
+M"0,"`@P6!``)`P("#!@$``D#`@(,'`0`"0,"`@P@!``)`P(##"0$``D#`@,,
+M*`0`"`,"`PQ,!``(!`,$#%`$``<$`P0,5`0`!@0#!`Q8!``$!`,$#%P$``0$
+M`P0,8`0`"04#!0QD!``(!0,%#&@$``<%`P4,;`0`!@4#!0QP!``&!0,%#'0$
+M``,%`P8,>00`!08$!@Q]!``%!@0&#($$!0,&!`8,@P0`!`8$!@R%!``$!@0&
+M#(D$``0&!`8,C00``P8$!@``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````8`````````L)@"`!```0#`F`(`$``!`-"8
+M`@`$``$`U)@"``4``0#<F`(`!@`!`$S3`@`$``$```````H!N@"*`$0`.`!X
+M`#0`,``L`"P`*``H`-H`H@"``#P`-`!T`#``+``L`"@`*``H``$"!``!"`($
+M"!`@0```````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````.``@`"@`$``0``@`P`#``
+M%``P```"``"```````````$`````^@```0```#0`,``8`#````0````!````
+M````Z`,``/____\!````.``P`!@`,```$`````(`````````!````/H```$`
+M```@`#``&``P``````!````````````$``````!``0```"`!,``8`#``````
+M`"````````````0```````(@````/``P`````````````````/____\0)P``
+M`(>3`P$````P`3``&``P```@````!``````````$``#___]_`0```%-Y<W1E
+M;2!4:6UE<B!4:')E860```#_``\`#P`/``\`/P`_`#\`/P`"`@("````````
+M````````#P`/``\`#P`_`#\`/P`_``("`@(````````````````/``\`#P`/
+M`#\`/P`_`#\``@("`@````````````````H!N@"*`$0`.`!X`#0`,``L`"P`
+M*``H`-H`H@"``#P`-`!T`#``+``L`"@`*``H``$"!``!"`($"!`@0```````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````"-@"``!P`@```0``````````
+M````````"-P"``"``@!`````````````````````"-T"``"$`@!``````'`"
+M``"``@``A`(`H/("`*#_`@!$\@(`0/("``$````!`````0````$````!````
+M@/("`(#_`@````````````3R`@``\@(`A/("`(3_`@````````````SR`@`(
+M\@(`B/("`(C_`@```````````!3R`@`0\@(`C/("`(S_`@```````````!SR
+M`@`8\@(`D/("`)#_`@```````````"3R`@`@\@(`'````!D`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````"@&Z`(H`1``X`'@`-``P`"P`+``H
+M`"@`V@"B`(``/``T`'0`,``L`"P`*``H`"@``0($``$(`@0($"!`='AS8VAE
+M9%]E```````````````*`;H`B@!$`#@`>``T`#``+``L`"@`*`#:`*(`@``\
+M`#0`=``P`"P`+``H`"@`*``!`@0``0@"!`@0($``````B!,`````````````
+M``````````````````````````````````````````````````````````!D
+M:7-P871C:&5R7V%C=```6J5:I0`````!!`0$!`0$`@0``P0$!`$$!`0$!`0`
+M!`$,`@`2`@$8`@(D`@0P`@A(`A!@`B!L`D`"`0$$`0(+`006`0@"`0$$`0(+
+M`00,`@`2`@$6`0@8`@(D`@0P`@A(`A!@`B!L`D``````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````$(#!(8)#!(8&P````````!!`($"Q8`````````````
+M`0P"!`L6#!(8)#!(8&P```$,`@0+%@P2&"0P2&!L```!"`P2&"0P2&!L````
+M`````P$!``8"!0`J`0``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````#````````````````````````
+M``````````````````````````!M;6%C7W=A:71?9&EN;U]R97-P7W-E;0``
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````')E<W!O;G-E7W1R9P``````````````````````````
+M```````````````````````#`````````0```'-C86Y2>%1R9P``````````
+M`````````````@`'```````'`/W_``````````#]_P``````````````````
+M````````'``````````````````4`!L`"P`7```````!`!X`````````/@``
+M`"4````$````````````````````````````-``Q`#$````````````(````
+M%0`0``(```!`````````````````````````````````````````````````
+M`````````````````````````````````````````````0``````"@&Z`(H`
+M1``X`'@`-``P`"P`+``H`"@`V@"B`(``/``T`'0`,``L`"P`*``H`"@``0($
+M``$(`@0($"!``0("```"````````````````````````````````````````
+M``````````````````````````!M96%S=7)E7W1X<V-H961?90````````#)
+M=```HW0``%%B```Z+P``\%8``-P%```H$```1A````P0```=-@``138```$`
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````"``````````/____\`````````````````````````````````
+M``````````\`````````!00#`@$````!`0$!`@(``'=A:71?9&EN;U]S=&%T
+M:7-T:6-S````````````````````````````````````````````````"@&Z
+M`(H`1``X`'@`-``P`"P`+``H`"@`V@"B`(``/``T`'0`,``L`"P`*``H`"@`
+M`0($``$(`@0($"!`````````````````````````````````````````````
+M`````````````````````````````````````````````````````````)@`
+M````````N`L``"@C```H````"@```#(`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````0````$```````````````````````````````````!R>%]E````
+M```````*`;H`B@!$`#@`>``T`#``+``L`"@`*`#:`*(`@``\`#0`=``P`"P`
+M+``H`"@`*``!`@0``0@"!`@0($````````````````````````````H`````
+M```````````````````````````!`P,``0(#``,#````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````````0`````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````4"`-:YP\``"@Y2&)YFK&ZJBIQ'%45
+M.`ZJ"AP'506]!`T/!0<)"P$#```````````!`0("`P0$!0<-(SK__P"`BRY%
+M%PH4-VX!`0$!`0(#!0<-(P``.DQH@JB_R@<-(P``.@!077%[??__`("++JHJ
+M<1Q%%U45.`ZJ"AP'506]!`H4-PT/;@4'"0L!`P$!`0```0````````$!`0("
+M`@,#!`0%!0``````````````````````````````````````````````````
+M``````````````````!@Z@``````````````````````````````````````
+M`````````````P```*7&A/B9[HWV#?^]UK'>5)%08`,"J<Y]5AGG8K7F39KL
+M18^='T")A_H5[^NRR8X+^^Q!9[/]7^I%OR/W4Y;D6YO"=1SAKCUJ3%IL07X"
+M]4^#7&CT4331"/F3XG.K4V(_*@P(4I5E1EZ=*#"A-P\*M2\)#C8DFQL]WR;-
+M:4[-?Y_J&Q*>'718+C0M-K+<[K3[6_:D379AM\Y]>U(^W7%>EQ/UIFBY```L
+MP6!`'^/(>>VVOM1&C=EG2W+>E-28Z+!*A6N[*L7E3Q;MQ8;7FE5FE!'/BA#I
+M!@2!_O"@1'BZ)>-+\Z+^7<"`B@6M/[PA2'`$\=]CP7=UKV-","`:Y0[];;],
+M@108-28OP^&^HC7,B#DN5Y/R58+\1WJLR.>Z*S*5YJ#`F!G1GG^C9D1^5*L[
+M@PO*C"G'TVL\*'FGXKP=%G:M.]M69$YT'A3;D@H,;$CDN%V?;KWO0Z;$J#FD
+M,3?3B_(RU4.+66ZWVHP!9+'2G.!)M-CZK`?S)<^ORH[TZ4<8$-5OB/!O2G)<
+M)#CQ5\=S49<CRWRAG.@A/MV6W&&&#84/D.!"?,1QJLS8D`4&`?<2'*/"7VKY
+MKM!ID1=8F2<ZN2<XV1/KLRLS(KO2<*F)!Z<SMBTB/)(5(,E)A_^J>%!ZI8\#
+M^%F`"1<:VF4QU\:$N-##@K`I=UH1'LM[_*C6;3HLQJ7XA.Z9]HW_#=:]WK&1
+M5&!0`@/.J59]YQFU8DWF[)J/11^=B4#ZA^\5LNN.R?L+0>RS9U_]1>HCOU/W
+MY):;6W7"X1P]KDQJ;%I^0?4"@T]H7%'TT33Y".*3JW-B4RH_"`R54D9EG5XP
+M*#>A"@\OM0X))#8;F]\]S29.:7_-ZI\2&QV>6'0T+C8MW+*T[EO[I/9V3;=A
+M?<Y2>]T^7G$3EZ;UN6@``,$L0&#C'WG(MNW4OHU&9]ER2Y3>F-2PZ(5*NVO%
+M*D_E[1:&Q9K79E41E(K/Z1`$!OZ!H/!X1"6Z2^.B\UW^@,`%BC^M(;QP2/$$
+M8]]WP:]U0F,@,.4:_0Z_;8%,&!0F-<,OON$UHHC,+CF35U7R_()Z1\BLNN<R
+M*^:5P*`9F)[1HW]$9E1^.ZL+@XS*QREKTR@\IWF\XA8=K7;;.V16=$X4'I+;
+M#`I(;+CDGUV];D/OQ*8YJ#&DTS?RB]4RBT-N6=JW`8RQ9)S22>#8M*SZ\P?/
+M)<JO](Y'Z1`8;]7PB$IO7'(X)%?Q<\>74<LCH7SHG#XAEMUAW`V&#X7@D'Q"
+M<<3,JI#8!@7W`1P2PJ-J7Z[Y:=`7D9E8.B<GN=DXZQ,KLR(STKNI<`>),Z<M
+MMCPB%9+)((=)JO]0>*5Z`X]9^`F`&A=EVM<QA,;0N(+#*;!:=QX1>\NH_&W6
+M+#H``````````````````"@`*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H
+M*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H```````````````````@`P``````
+M`````````````````````````````````````'=A:71?;65A<U]S=&%T:7-T
+M:6-S``````$``````````````&0```````````````$````$!PH*"@`````@
+M`P``(`,``,@```#(````9````-`'``"P!```D`$``&0```!D````(`,``-`'
+M``$"`P0%````````````````````````````````````````````````````
+M`$`?`````````````+`$``````"`EI@`9`````$`````````````````!4;_
+M____````````````````````````````````````````````````````````
+M````````````````````````;7=A:71?90```!``@`&X`.@`Z0#K@+"`@(.S
+MD0```````````````````````````````````````````````'1U;F5?=V%I
+M=%]S96T`````````````````````````````````````````````````````
+M```````````````#`````````/__``#__________^`````C0@```P```(``
+M@`"``(``@`"``(``@`![`'H`>@!Y`'@`>`!W`'8`=@!U`'0`=`!S`'(`<@!Q
+M`'``<`!O`&X`;@!M`%@`6`!7`%8`5@!5`%0`5`!3`%(`4@!1`%``4`!/`$X`
+M3@!-`$P`3`!+`$H`2@!)`$@`2`!'`$8`1@!%`$0`1`!#`$(`0@!!`$``0``)
+M``@`"``'`*H!``"L`0``K@$``+`!``"R`0``M`$``+8!```Q,2PL+"PI`/C_
+M"``P`$``;`"``)T```#[^P4`"@4%````````````````,@``````````````
+M````````````````````````````````````````````````````````````
+M`````&QM86-?<&]W97)?<')O8V5S<U]S96T`````````````````````````
+M`````````````````````````&-A;&EB<F%T:6]N7W-E<75E;F-E7W-E;0``
+M``"!@(*4`@,`@`*#``,*``\````!````````````````````````````````
+M`````````````````'1X;&]C:U]S96T```````````$`%@,"`("`@("`@`L`
+M``#_``$````+.UMS<Z/#VP``````````````````````````("````,`_P``
+M@P``?P```!X!!`$!```````````$`0",W-[@X@```````!\``(,``P#_``$`
+M``#_`````````&X`;@`!````0!\``````````````````````````````0``
+M```````````````)``P`"0`)``<`````````````````````````!0`0`!``
+M$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0
+M`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``@````````````
+M````````````````````````````````````````````````````````````
+M````````````'Q\?'Q\?'Q\?'Q\?'Q\?'Q\?'Q\?'Q\?'Q\A(0P4#!0-%0X6
+M$!@2&A4=&2$:(ALC&R,<)!TE'24>)A\G'R<?)Q\G'R<>)ATE'"0:(A@@%AX5
+M'10<$AH2&A$9$!@0&!`8$!@0&!`8````````'Q\?'Q\?'Q\?'Q\?'R$```,)
+M"0L#"`@*`@<'"0$&!0<!!00&``0#!``#`@/_`@$!_@```/W^_?[\^_O\^_KY
+M^OKX^/CZ]_?W^?7U]O?T\_7U\O'S\_#O\O+O[?#Q[>SN````````````````
+M```````````````````````````````````````"`@;Z^OKZ^OS^````````
+M_/X```````````````````````````(````````````````````````````"
+M`@;Z^OKZ^OS^````````_/X`\WOS=?-N\VCS8O-=TV[3:--BTUVS;K-HLV*S
+M79-NDVB38I-=<VYS:'-B<UU3;E-H4V)373-N,V@S8C-=$VX3:!-B$UU[;GMH
+M>V)[75MN6VA;8EM=.VX[:#MB.UT;;AMH&V(;74-N0VA#8D-=(VXC:"-B(UT#
+M;@-H`V(#76MN:VAK8FM=2VY+:$MB2UTK;BMH*V(K70MN"V@+8@M=\WOS=?-N
+M\VCS8O-=TV[3:--BTUVS;K-HLV*S79-NDVB38I-=^W'[:_ME^V#;;]MJVV?;
+M8]M=NVZ[:+MBXVGC8^->PVS#9L-BPUVC;J-HHV*C78-N@VF#9#MB.UT;;AMH
+M&V(;74-N0VA#8D-=(VXC:"-B(UT#;@-H`V(#76MN:VAK8FM=2VY+:$MB2UTK
+M;BMH*V(K70MN"V@+8@M=\WOS=?-N\VCS8O-=TV[3:--BTUVS<+-JLV2S7Y-O
+MDVB38OM[^W7[;OMH^V3[7]MQVVO;9=M?VUF[;+MGNV&[6N-_XWCC<N-LXV;#
+M=\-PPVJC?Z-YHW*C;*-FHV&#;X-J@V6#7^MQZVOK94-Y0W)#;$-F0V$C<2-K
+M(V8C8`-Q`VL#90-?:W!K9FME2WE+<DML2V<K>"MQ*VLK92M>`$T9'QX`+`$"
+M`````$TA(=3^+`$``````$T9(",`+`$!`````$TA)",`+`'_____`$T?("@`
+M+`$"`````$T.%-3^^O\#`````$T2%-3^\/\"`````$T5&!X`+`$"`````$T1
+M%-3^!0`$`````$TD)M3^YO_]____`$TA*QH`+`'_____`$TA*QX`+`'_____
+M`$T@(-3^YO_^____`$T@(-3^YO\"`````$TA)M3^^O\"`````$TA)M3^\/\#
+M````\`[T#_@0_!$($@P3$!0B%206)A<H&"H9+!HN&S`<-!TX'CP?0"!D(6@B
+M;"-P)'0E>"9\)X`HA"F(*HPKD2R5+9DNFR^=,*$QI3(`````````````````
+M```````R/PX1`````/K_,C\A)P```````#(_*"Q#````]O\R/R@L(P```/;_
+M,C\H+`,```#V_S(_+3!#`.#_```R/RTP(P#@_P``,C\M,`,`:````#(_,3%#
+M`.#_^O\R/S$Q(P#@__K_,C\Q,0,`:`#Z_S(_,C)#`.#_]/\R/S(R(P#@__3_
+M,C\R,@,`:`#Z_SY-#A$`````^O\^32@K`````.__/DDL,```X/\``#Y),3(`
+M`.#_^O]*32TR`````.+_,DT.(``````&`#)-(20`````^O\R324G`````/3_
+M,CDQ,@`````,`")-#A$````````B31(4````````````````````````````
+M`````````````````````````````````"@`````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````&-M9%]W86ET7V9O<E]R97-P;VYS
+M90``$+QU``````````0```$```!3>7,@26YI="!487-K````FG(`````````
+M!```!0```$9R86UE($AA;F1L97(```#,(``````````$```+````5%@@4V-H
+M961U;&5R`````%18``````````0```0```!D:7-P871C:&5R(%1A<VL`````
+M````````````````````````````````````````````````````````````
+M``````````````````````4#`````.K,``#JC/_______S\``````/____\`
+M!`(````#`/____\```````#FS```YHS_____!``@``````#_____!``@``4`
+M(`#_____````````ILP``*:,__\_``0`(```!`(````#``0`(``%`"``_/__
+M_P``````0&K,`$!JC`0`(`#__S\`!``@``4`(```!`(````#`/____\!````
+M`("NC```KHS__S\`_____P`$`@````,``````/_____\____`@````,```"@
+M`#``I``P`-``,````%0!4``P`%0`,`#``#````!4`+``,`"T`#``U``P````
+M5`!-;6%C;6=R+F,````!#`P,#`P,#`P,#``%`0P!#`(,#`P,#`P,#`P,#`,,
+M#`P,#`P,#`P,#`0!#`P,#`P,#`P,#`$,#`P!!@P,"`P,#`P,#`$,!P4,#`P,
+M#`P,`0P,!0P,#`P,#`P,"`@(#`D,!@P,#`P,#`P,#`H,#`P,#`H*"@P,#`4,
+M#`P,#`P,#`P,#`QM;6%C+F,``&-N8W1M9W(N8P````4````*``<`1&EN;RYC
+M``!&<F%M97)X+F,``````````0`!``````````8`&``>`'!W<FUN9RYC````
+M`&ME>5]C;VUP=71A=&EO;BYC``````````````#__________W-P96-T<G5M
+M<&MT+F,```!4>%!O=V5R0V%L:6(N8P````````````````````````$````"
+M````!`````@````0````5'AC=')L+F,`````CX[ZB,+LJ:VP````L0(``+$#
+M``"I_ZK_J_^H/P```````(A_+S`#,!0`,W\',`,P%``S?S\P`S`4`#-_!S``
+M`!@0,W\`,`,`&!`S?P!`!$`8$(B!='5N97(N8P!_`'X`?@!]`'P`?`![`'H`
+M>@!Y`'@`>`!W`'8`=@!U`'0`<P!R`'$`<`!O`&X`;0!L`&L`:@!I`&@`40!1
+M`%``3P!.`$X`30!,`$L`2P!*`$D`2`!(`$<`$``0``\`#@`.``T`#``,``L`
+M"@`*``D`"``(``<`!@`&``4`!``#`,1Z$(`P@!<````9````$0`7`/C_(``,
+M````-0`'`````P```(2`D!"1))(JDSR4`Y5_IB"G"JU_KP^U`^""X2#B0.6@
+MYC+GA>\`E@&8`?-`]"```(`!@0*(0(Y`J2*J(JLBU0+6!?7X@(.?$*@0J8BJ
+M,ZLSKA"SD;8#P!SU$```@0**`*``L0*Y`L(`@0"*`:`!L0*Y`<(<P@```,(4
+M```8[@',Y]'A^^XH^S@`+0`D`"W[..XHX?OGT0',&.X2$NX8S`'1Y_OA*.XX
+M^RT`)``M`#C[*.[[X='GS`'N&!(2&.X!S.?1X?ON*/LX`"T`)``M^SCN*.'[
+MY]$!S!CN$A+N&,P!T>?[X2CN./LM`"0`+0`X^RCN^^'1Y\P![A@2$ACN`<SG
+MT>'[[BC[.``M`"0`+?LX[BCA^^?1`<P8[A(2[AC,`='G^^$H[CC[+0`D`"T`
+M./LH[OOAT>?,`>X8$A(8[@',Y]'A^^XH^S@`+0`D`"W[..XHX?OGT0',&.X2
+M$NX8S`'1Y_OA*.XX^RT`)``M`#C[*.[[X='GS`'\`@;?[=K:!=8GUR36_]/<
+MV-WK_P@@'1T;]PC.^\$&T27G._(O\0CJYN7@Z?#\^QOP+]P@U_3GS?;+\>K>
+M!]H.]`T8&"(M`B[3$\+WV_H&%QTD%PH,W1++)N`M`!H1_A7W'0HF(QDI\1[.
+M%=,;^2(7%A;U"-H/X"8$*RL/.O0O_A<F`#WI)M'^QO35#_PK("8F#PL(ZA;>
+M%^7YZ]/BSM?QW1GV)@D=`A7F$=,`VN#NR_3=Z0KC)/H7)?H^]RT3_B[>+>D8
+M#`TF#B('#^H*RQG-*?0D(!`O!1L0_"#I&N7XZM'QQ?+;Y_K1!<'XSN7WXQWX
+M(!7_*-TMW"K_*20J)R8%%]@`P^G8V@76)]<DUO_3W-C=Z_\((!T=&_<(SOO!
+M!M$EYSOR+_$(ZN;EX.GP_/L;\"_<(-?TY\WVR_'JW@?:#O0-&!@B+0(NTQ/"
+M]]OZ!A<=)!<*#-T2RR;@+0`:$?X5]QT*)B,9*?$>SA73&_DB%Q86]0C:#^`F
+M!"LK#SKT+_X7)@`]Z2;1_L;TU0_\*R`F)@\+".H6WA?E^>O3XL[7\=T9]B8)
+M'0(5YA'3`-K@[LOTW>D*XR3Z%R7Z/O<M$_XNWBWI&`P-)@XB!P_J"LL9S2GT
+M)"`0+P4;$/P@Z1KE^.K1\<7RV^?ZT07!^,[E]^,=^"`5_RC=+=PJ_RDD*B<F
+M!1?8`,/IV-H%UB?7)-;_T]S8W>O_""`='1OW",[[P0;1)><[\B_Q".KFY>#I
+M\/S[&_`OW"#7].?-]LOQZMX'V@[T#1@8(BT"+M,3PO?;^@87'207"@S=$LLF
+MX"T`&A'^%?<="B8C&2GQ'LX5TQOY(A<6%O4(V@_@)@0K*P\Z]"_^%R8`/>DF
+M$A(!`!```````````````````````````0`"```````!``(```````(``0``
+M`````@`!`````````````````````````````````0(```(!``````!T`0(#
+M!`4&!P@)"@L,#0X/$!$2$Q05%A<8&1H;'!T>'R`A(B,D)28G*"DJ*RPM+B\P
+M,3(S-#4V-S@Y.CL\/3X_0$%"0T1%1D=(24I+3$U.3U!14E-455976%E:6UQ=
+M7E]@86)C9&5F9VAI:FML;6YO<'%R<W1U=G=X>7I[?'U^?P`&```PF`!U,/AK
+MU0``R\!@`",``!(```````$!`18!$````````0$.``,!`0`!``0#`P,#`P`*
+M``0*```````!`@```@($!!@8&!@8&!@8&!@8&!@8&!@8&!@8(!@8&!@8&!@8
+M&!@8(!0:&!B4&A@8$!H8&!`:&!@*&A@8"AH8&!`:&!@0&A@8&"`<'!@L)!@8
+M)2`=&C<K!`01#`D&(Q<8&A04%!84%`$``0`"``(``P`#``0`!0`&``@`"@`-
+M`!``%``9`"``*``R`#\`3P!D`'X`G@#(`/L`/`&.`?4!=P(:`^@#ZP0Q!LL'
+MT`E:#(T/E!.F&`<?$"<M,>D]\4T?8H=[@YO'PWCV`0`!``$``0#0````_P`>
+M`/S_```]````)``*`!X`%@````$``@!T`"`````````````````!"BQ>?W]>
+M+`H!`````````````````````````````QA4?U08`P````````````$````1
+M````$0`3`!``/P`!`#\`_P#_``$````9`"H`"@#_````E@`R`&0````!``!A
+M```4`````0`"``,`!``%``8`!P`(``D`"@`+``P`#0`.``\`$``1`!(`$P`4
+M`!4`%@`7`!@`&0`:`!L`'``=`!X`'P`@`"$`(@`C`"0`)0`F`"<`*``I`"H`
+M*P`L`"T`+@`O`#``,0`R`#,`-``U`#8`-P`X`#D`.@`[`#P`/0`^`#\`0`!!
+M`$(`0P!$`$4`1@!'`$@`20!*`$L`3`!-`$X`3P!0`%$`4@!3`%0`50!6`%<`
+M6`!9`%H`6P!<`%T`7@!?`&``80!B`&,`9`!E`&8`9P!H`&D`:@!K`&P`;0!N
+M`&\`<`!Q`'(`<P!T`'4`=@!W`'@`>0!Z`'L`?`!]`'X`?P```!@`+@!"`%4`
+M9P!X`(<`E0"B`*X`N0##`,L`TP#:`.$`Y@#K`.\`\P#V`/@`^@#\`/T`_@#^
+M`/\`_P#_`/\`$@````````#_`/\`KP#M``````!P:'E?:6YI=&EA;&EZ871I
+M;VXN8P`````!``$`KA\``*X3``#O@````````````````````````'!O=V5R
+M7W)E<W5M92YC``!#86QI8E)E8617<FET92YC`````%1E;7!E<F%T=7)E0V%L
+M:6(N8P``5'AD;6%A<F,N8P``4GAD;6%A<F,N8P``V=O=WY>9@@"!@@``V8#;
+M@-V`WX"7@)F`1$-/9F9S970N8P``D)^HKH&`K(*5````1FEL=&5R<T-A;&EB
+M+F,``(*!@*5)44-A;&EB+F,````)"Q08#P````L+%!@+````>W5N:&)=5U).
+M2D5"/CHW-#$```!4>%!O=V5R0V%L:6)"1RYC`````%1X4&]W97)#86QI8D%"
+M1RYC``````````````!,;6%C+F,``%!K='1X+F,`\/#P\```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````#W`@#@!```````````
+M````````Q`D`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+;````````````````````````````````````
+`
+end
diff --git a/sys/contrib/dev/iwi/ipw2200-ibss.fw.uu b/sys/contrib/dev/iwi/ipw2200-ibss.fw.uu
new file mode 100644
index 0000000..a6d5249
--- /dev/null
+++ b/sys/contrib/dev/iwi/ipw2200-ibss.fw.uu
@@ -0,0 +1,4337 @@
+/*-
+ * TERMS AND CONDITIONS
+ * IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE
+ *
+ * Do not use or load this firmware (the "Software") until you have carefully read
+ * the following terms and conditions. By loading or using the Software, you agree
+ * to the terms of this Agreement. If you do not wish to so agree, do not install
+ * or use the Software.
+ *
+ * LICENSEES:
+ *
+ * Please note:
+ *
+ * * If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT,
+ * applies.
+ * * If you are an Original Equipment Manufacturer (OEM), Independent Hardware
+ * Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement
+ * applies
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * For OEMs, IHVs, and ISVs:
+ *
+ * LICENSE. This Software is licensed for use only in conjunction with Intel
+ * component products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder. Subject to the terms of this Agreement,
+ * Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up
+ * license under Intel's copyrights to: (i) copy the Software internally for your
+ * own development and maintenance purposes; (ii) copy and distribute the Software
+ * to your end-users, but only under a license agreement with terms at least as
+ * restrictive as those contained in Intel's Final, Single User License Agreement,
+ * attached as Exhibit A; and (iii) modify, copy and distribute the end-user
+ * documentation which may accompany the Software, but only in association with
+ * the Software.
+ *
+ * If you are not the final manufacturer or vendor of a computer system or software
+ * program incorporating the Software, then you may transfer a copy of the
+ * Software, including any related documentation (modified or unmodified) to your
+ * recipient for use in accordance with the terms of this Agreement, provided such
+ * recipient agrees to be fully bound by the terms hereof. You shall not otherwise
+ * assign, sublicense, lease, or in any other way transfer or disclose Software to
+ * any third party. You may not, nor may you assist any other person or entity to
+ * modify, translate, convert to another programming language, decompile, reverse
+ * engineer, or disassemble any portion of the Software or otherwise attempt to
+ * derive source code from any object code modules of the Software or any internal
+ * data files generated by the Software. Your rights to redistribute the Software
+ * shall be contingent upon your installation of this Agreement in its entirety in
+ * the same directory as the Software.
+ *
+ * CONTRACTORS. For the purpose of this Agreement, and notwithstanding anything
+ * to the contrary hereunder, solely with respect to the requirements for
+ * compliance with the terms hereunder, any contractors or consultants that You
+ * use to perform the work or otherwise assist You in the development or products
+ * using this Software shall be deemed to be End Users and accordingly, upon
+ * receipt of the Software, shall be bound by the terms of Exhibit A, Software
+ * License Agreement. No additional agreement between You and such consultants or
+ * contractors is required under this Agreement to detail such compliance.
+ *
+ * TRADEMARKS. Except as expressly provided herein, you shall not use Intel's
+ * name in any publications, advertisements, or other announcements without
+ * Intel's prior written consent. You do not have any rights to use any Intel
+ * trademarks or logos.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if
+ * any, are owned by Intel or its suppliers and licensors and may be protected by
+ * copyright, trademark, patent and trade secret law and international treaties.
+ * Any rights, express or implied, in the intellectual property embodied in the
+ * foregoing, other than those specified in this Agreement, are reserved by Intel
+ * and its suppliers and licensors or otherwise as set forth in any applicable
+ * open source license agreement. You will keep the Software free of liens,
+ * attachments, and other encumbrances. You agree not to remove any proprietary
+ * notices and/or any labels from the Software and accompanying materials without
+ * prior written approval by Intel
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS
+ * BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND
+ * (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST
+ * INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE
+ * INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR
+ * SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS
+ * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT
+ * EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR
+ * INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE
+ * OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS.
+ *
+ * EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH
+ * FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND
+ * LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR
+ * OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant
+ * or assume responsibility for the accuracy or completeness of any information,
+ * text, graphics, links or other items contained within the Software. You assume
+ * all liability, financial or otherwise, associated with Your use or disposition
+ * of the Software.
+ *
+ * APPLICABLE LAW. Claims arising under this Agreement shall be governed by the
+ * laws of State of California], excluding its principles of conflict of laws and
+ * the United Nations Convention on Contracts for the Sale of Goods.
+ *
+ * WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of
+ * this Agreement shall be effective unless in writing and signed by an officer of
+ * Intel. No failure or delay in exercising any right, power, or remedy under
+ * this Agreement shall operate as a waiver of any such right, power or remedy.
+ * Without limiting the foregoing, terms and conditions on any purchase orders or
+ * similar materials submitted by you to Intel, and any terms contained in IntelÂ’s
+ * standard acknowledgment form that are in conflict with these terms, shall be of
+ * no force or effect.
+ *
+ * SEVERABILITY. If any provision of this Agreement is held by a court of
+ * competent jurisdiction to be contrary to law, such provision shall be changed
+ * and interpreted so as to best accomplish the objectives of the original
+ * provision to the fullest extent allowed by law and the remaining provisions of
+ * this Agreement shall remain in full force and effect.
+ *
+ * EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to
+ * applicable import and export regulations of the United States and of the
+ * countries in which each party transacts business, specifically including U.S.
+ * Export Administration Act and Export Administration Regulations. Each party
+ * shall comply with such laws and regulations, as well as all other laws and
+ * regulations applicable to the Software. Without limiting the generality of the
+ * foregoing, each party agrees that it will not export, re-export, transfer or
+ * divert any of the Software or the direct programs thereof to any restricted
+ * place or party in accordance with U.S. export regulations. Note that Software
+ * containing encryption may be subject to additional restrictions.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ *
+ * TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate
+ * its terms. Upon termination, you will immediately destroy the Software or
+ * return all copies of the Software to Intel.
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * EXHIBIT "A"
+ *
+ * SOFTWARE LICENSE AGREEMENT (Final, Single User)
+ *
+ * IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+ *
+ * Do not use or load this firmware image (the "Software") until you have carefully
+ * read the following terms and conditions. By loading or using the Software, you
+ * agree to the terms of this Agreement. If you do not wish to so agree, do not
+ * install or use the Software.
+ *
+ * LICENSE. You may copy and use the Software, subject to these conditions:
+ * 1. This Software is licensed for use only in conjunction with Intel component
+ * products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder.
+ * 2. You may not copy, modify, rent, sell, distribute or transfer any part of the
+ * Software except as provided in this Agreement, and you agree to prevent
+ * unauthorized copying of the Software.
+ * 3. You may not reverse engineer, decompile, or disassemble the Software.
+ * 4. You may not sublicense the Software.
+ * 5. The Software may contain the software or other property of third party
+ * suppliers.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software
+ * remains with Intel or its suppliers. The Software is copyrighted and protected
+ * by the laws of the United States and other countries, and international treaty
+ * provisions. You may not remove any copyright notices from the Software. Intel
+ * may make changes to the Software, or items referenced therein, at any time
+ * without notice, but is not obligated to support or update the Software. Except
+ * as otherwise expressly provided, Intel grants no express or implied right under
+ * Intel patents, copyrights, trademarks, or other intellectual property rights.
+ * You may transfer the Software only if a copy of this license accompanies the
+ * Software and the recipient agrees to be fully bound by these terms.
+ *
+ * EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED
+ * "AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING
+ * WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR
+ * PURPOSE. Intel does not warrant or assume responsibility for the accuracy or
+ * completeness of any information, text, graphics, links or other items contained
+ * within the Software.
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS
+ * INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO
+ * USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR
+ * IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE
+ * LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY
+ * BETWEEN JURISDICTIONS.
+ *
+ * TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if
+ * you violate its terms. Upon termination, you will immediately destroy the
+ * Software.
+ *
+ * APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the
+ * laws of California, excluding its principles of conflict of laws and the United
+ * Nations Convention on Contracts for the Sale of Goods. You may not export the
+ * Software in violation of applicable export laws and regulations. Intel is not
+ * obligated under any other agreements unless they are in writing and signed by
+ * an authorized representative
+ * of Intel.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ */
+#define IWI_FW_VERSION 3.0
+begin 644 ipw2200-ibss.fw
+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
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````]P(`(`,`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```'L`L`%@`$`!0`&P````!@$&(FH```!6X`:@)P*$$!$`Z0M88!8"A!EXL`
+M8!!!_F`100!J&4KP:H!*`6I`2@``0%`CH```FK#,L%*QHK$_LLBRY++XL@``
+M`&"I0$!0,:```)NP^[!`6D`:(54"8`#7*$%!4```_]<H00``_]<H2P``_]>U
+MABA%,`^7BZ</,`Y)L```.@XY#D!:P!HWL(R`#``A6P$>`&`)R00>`6`&R2$>
+M!&`#R2(0B8\(``T`%P`'S`;8(E$``");04IIH"RP0[/(L,BP1;-'LU:S9K/I
+MM.ZTR+#(L&JWR+#(L">U*;4KM<BPTK72M=.U^[5"L\BP0K,"MBZV8+9LMH^V
+MR+!IM\BPQ[9IMR!1)%.-`0!B`&8@51<`!,T@4213F+"I`0$`$;$&U/[<*]T%
+M:,$!(+`A42(?)LZDH$.SR+#(L%"P4+!0L%"P-+!0L,BPR+`TL,BPR+!0L%"P
+M4+#(L%"P4+!0L,BP0K-"LT*S4+!0L%"P4+!0L,BP4+#(L%"P4+!!L4!:@!HA
+M53>P+]6I4`$?`LB"MP!@4$`A42(?`L[8H,BP0[/(L,BP4+`TL%"P4+!0L%"P
+MR+#(L&JWR+#(L%"P4+!0L,BP4+!0L%"P4+!"L\BP0K-0L%"P4+!0L#2PR+!0
+ML,BP4+!0L!;<1=W]@G2(_8($@_V"-(/]@@W</-VI4`BA(+""MX5`````8$A`
+M!F!`0""P`&#$0"[=0%`#'PK(P5`A,P?(/H^UAH-@$8XH09>+`&"I0$!0ST`'
+M8'9"=T)`0#`/```P#@U@*$%!4+6&*$&7B\]0`1\-R2!0(3,*R`!@SD`,8*5`
+M^+,!9`!F`&#6A""P````8,1`J4`(8$!`,`]9#C`."F`H04%0M88H09>+(+`#
+MLD?<(&I52V):(2$!:E5+!<B`6OQJ@$IPL2Y;(2'QR02#+ELA(>W)`&HM2G.X
+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
+M>T%``7Q!0`%]04`!?D%``7]!`0``8%Q`74!>0"M0+$`!`*X!$&I52T`!`6I5
+M2P$`&0`9`!D`&0`!`!@`&``8`!@``0``````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````!)#\8/20_&#@!O
+M`&P`:@4!+I`":E5+L&Y1;`!J!0$UD`%J54L`8,U`9F!+0"!J54L`8&%`"&I5
+M2QA@ST!`8,Y``&#M0`=@[$`"8.M``6I52QY@;D``8&]`&F"C0`!J4$LO6^\8
+M@!HO2P%@*$$!8"A!6F`H0=%@*$$#8"A!"6X`8"A!9Y`$;M!L0`$H06N0`&`H
+M02A!`&`08@N@"&I52Q_J:&"08M^!A0'(0,E"$!@A-P+)0&`@8(.PJ@$5`,%`
+M:6"08M^!RT#,0@%D@6;B1^)%Y%'C4Q@`&`#P0EBQ`6I52PA@:%4(:E5+%P#Y
+MSFA@D&+?@<A`R4+!0&Q@D&+?@<M`S$(!9(%FXD?B1>11XU,8`!@`\$(9`&`9
+M@@$(8%5!P5"?&14`P4!'8)!BWX'D0.5"0F"08M^!&0`9`.-"`6"!8M^!A0$8
+M`!@`YD*H`1D`&0`9`!D``QG@0`$?#,DX8)!BWX'G0.A"%F"08M^!/QGI0.NP
+M-V"08M^!YT#H0A9@D&+?@1@`&`#I0@!@`&3C5.E0%1$2`.9`ZU00`(4!/Q@`
+M8*@!&`"%`0`0ZH[D5.56%P`#SP%JZDKF4.Q4$`"%`3\8,!X"S#!J`&"H`1@`
+MA0$`$.J.YU3H5A<`!,_J6@(:ZDH!:E5+%F"08M^!A0$8`!@`#@`_&=I`/QC;
+M2@%@@6+?@1@`&``8`!@`#@`#&4$P`\C:4#*QVU`(:E5+`&3/5!<`!\SJ6B$@
+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
+MH!,`(!3^GV$@$@`@&/Z?8:`0`"`<_I]A(`\`("#^GV&@#0`@)/Z?82`,`"`H
+M_I]AH`H`("S^GV$@"0`@,/Z?8:`'`"`T_I]A(`8`(#C^GV&@!``@//Z?82`#
+M`"!`_I]AH`$`($3^GV%(_I]A1`!."T``+@L\``X+.`#N"C0`S@HP`*X*+`".
+M"B@`;@HD`$X*(``N"AP`#@H8`.X)%`#."1``K@D$@.T+((`/.`@8;@.H?HY3
+M$#X.$("1`"B@83<H$'Z.4Q!^CD,`J@`@J'Z.4P``#A`$`@X0"#X.$!!^CE,`
+MD"LH$'Z.0P@`[@N`U0`@____?____W____]_____?____W____]_____?___
+M_W____]_____?____W____]_____?____W____]_____?____W____]_____
+M?____W^H?HY3$#X.$(!_`"B@HC<H$'Z.4Q!^CD,`F``@____?____W____]_
+M____?____W____]_____?____W____]_____?____W____]_____?____W__
+M__]_____?____W____]_____?____W^H?HY3$#X.$`!R`"B@US<H$'Z.4Q!^
+MCD.`B@`@____?____W____]_____?____W____]_____?____W____]_____
+M?____W____]_____?____W____]_____?____W____]_____?____W^H?HY3
+M$#X.$(!D`"B@9C<H$'Z.4Q!^CD,`?0`@____?____W____]_____?____W__
+M__]_____?____W____]_____?____W____]_____?____W____]_____?___
+M_W____]_____?____W^H?HY3$#X.$`!7`"@@!C<H$'Z.4Q!^CD.`;P`@"#@-
+M$/S_'V``?#]@8`4```200`@`>N%7!)!@"($!`"`$!``1(/W_)P0&`!$`?#]@
+M=.\"``3^($!(`@T0`'Q?8``"``!,!`T0`/Z?8%`(#1``A"!`!/X@0/S_(&`$
+M`@T0`(`/.```'SAK`0`````?.&\!`````!\X<P$`````'SAW`0`````?.'L!
+M`````!\X?P$`````'SB#`0`````?.(<!``````````````&`OQ____]_____
+M?____W\!@+\?____?____W____]_`8"_'____W____]_____?P&`OQ____]_
+M____?____W\!@+\?____?____W____]_`8"_'____W____]_____?P&`OQ__
+M__]_____?____W\!@+\?____?____W____]_!H"_'Q``#0@`>N!7@?[_)P2`
+MOQ____]_#``-$`0`8`@8`(`(`?YA0`0&`!`(`(`+,`@-$```+@@`^N!7`@D`
+M(`0`[@L(`&X+#`!."Q``+@L4``X+&`#N"AP`S@H@`*X*)`"."B@`;@HL`$X*
+M,``N"C0`#@HX`.X)/`#."4``K@D@@0\X1'Z.0P0`#@@"@!\2"``N"`."'Q(,
+M`(X/$`#N"Q0`K@L8`&X+'`!."R``+@LD``X+*`#N"BP`S@HP`*X*-`"."C@`
+M;@H\`$X*0``N"D0`#@I(`.X)3`#."5``K@E4`(X)6`!N"8@`#@@!?N"O7`!.
+M"6``+@ED``X):`#N"&P`S@AP`*X(=`"."'@`;@A\`$X(@``N"(P`#@@2@!\2
+MA``."""!#CBH?HY#`/SO8_____L`@0\X`/SO:P````0`@0\X`/P/8`````0`
+M_.]C____^P"!#S@`@.]K`($/.`#\#V`````$`($/.""`#S@`(``(((`/.`"`
+M`!*``@X0A``.$```#0AX!@X0`'K@5WP$#A`A"@`@`7X`0```#1!4&`X06!8.
+M$%P4#A!@$@X09!`.$&@.#A!L#`X0<`H.$'0(#A`"H%\)`Z`_"0QX#A`$%`X0
+M"!(.$(AR#A",=@X0((`/.!0Z#A````T0#``M"%08#A``^N!76!8.$`$)`"!<
+M%`X08!(.$&00#A!H#@X0;`P.$'`*#A!T"`X0`J!?"0.@/PD,>`X0!!0.$`@2
+M#A"(<@X0C'8.$!0Z#A`(N``0((`/.`@`C0L@@`\XJ'Z.0P2`OQ____]_```-
+M"`%Z`%````T0`0T`(`0`#@@"@!\2"``N"`."'Q(,`(X/$`#N"Q0`K@M4`(X)
+M6`!N"8@`#@@!?N"O7`!."6``+@ED``X):`#N"&P`S@AP`*X(=`"."'@`;@A\
+M`$X(@``N"(P`#@@2@!\2A``."""!#CBH?HY##``-"`!ZX%<H`$T(H1P`(`!Z
+MX5<0`(T((@$`(``)X%>"#0`@"`"`"P0`#@@"@!\2"``N"`."'Q(,`(X/$`#N
+M"Q0`K@M4`(X)6`!N"8@`#@@!?N"O7`!."6``+@ED``X):`#N"&P`S@AP`*X(
+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
+MR'OG5PP)`"``_`E`Q-H"```'(`@0!P`(`GX`0`"``%``"L`:$'X'0``L`$``
+M"L`9!?X?8"#<*2@`HBA@!?X?8*#:*2@`+"M@H-;_)P/^OV'">^=7"9JF4:D!
+M`"`>?@=``?Z_82Q^!T"@TO\G``K`&8```"@`$?@G!#X.$*#;]R\0_A]@`'R_
+M8?3!`@`4_C]@`/]&0`K^?V`"_I]@("0A*`"*HE``A08(```?$'"8`@`!A08(
+M```?$'28`@`"A08(```?$'B8`@`#A08(```?$'R8`@`$A08(```?$("8`@`%
+MA08(```?$(28`@`&A08(```?$(B8`@`'A08(```?$(R8`@`(A08(```?$)"8
+M`@`)A08(```?$)28`@``\_<G!#X.$*#3]R\L_I]A````8@""H&$`!.%AH`4`
+M(``<QU'_A2T((+HI*`C^'V``I`9``08`"`%^QT$``"!`_X4-"``B`$`,`T`0
+M`!WH5XP'`"``'$="`J0&``">)V"@=PPH__]-0``!X&<`?#]B],$"`('U_R<`
+MO@]@`'Q?8##.`@"@I"XHH?X_8(#__R>@\O<G+/Z?80!\'V`@]@(`````"!!Z
+MX&<"@`\X``@?"`##`@``?>!7($(```$Z`2``!!\(9;,"`!)ZX%<!#``@@)T!
+M(*`)`"``@B!0`((`0%O^?V``?$!`],$"```'01!N_A]@`0%!$`C^7V``_`!`
+M..8"```$0!`$_G]@`OY`@`!\`4#\F`(```8`$`'^`$``#B`8!?K@5POV_R>`
+MQ?\G!#X.$`"K]R\`?!]@(/8"``````@0>N!G`'P_8B3;`@`"S?<G`*,)*``!
+MH&&/`P`@`'Q?8$S8`@``?#]@I@,``""'+B@`O@]@@/__)X#`"2@``&!A`'S?
+M8=3*`@``F@9@:GXG0&M^1T"@U/DO;'YG0&T$!P@``>!G`'R_8=3&`@`"(@`@
+M`)?E9T$!`"!J!`<(:P0'"````$``&@!`/`4`"'``!Q!T``<0;`0'"``:`$"H
+M!0`(>``'$#B%!@A*>N!71/YF0`+\9D`(`````(8!"`R'!A!\``<0$(5&"`+Z
+MY5<"_>57`0````($`"`,AB$($88!"(0`!Q`2A@$(@`('$(@`!Q"@$``@$X8!
+M"%!ZX5>,"P`@:@0'"`Y^(%``C@`8!WK@5Y`"1Q"+`@`@'WK@5XH!`"`!?B!`
+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
+M((`/.!B``1`<@`$(`7X`0""`#S@<@`$0`(`/.`0^#A``IO(O``#@80""H&$`
+M!,%A````4`'^/V`@W`TH``1!4``!X&<`@`<0@00`(`P`(`@`@@80H/X?8`V`
+M0!``@`8($'X`0```!Q"@Q?(G````4*#$\B<(_A]@`$0?"+FQ`@``@`\X!#X.
+M$""2\B\4_I]A0/X?8/__+4#^_TU`H-'T+_W_;4#_A0T(`'P?8=3&`@````!`
+M`!``0#P%X`AD_A]@__\M0/[_34`@S/0O_?]M0/^%#0@```!``!``0#P%``@`
+M@>-7"PX`4`J``U`$>N!7$/X?8`Q\'V`-````$P%$$"#%\B<4_I]A!#X.$*"+
+M\B\H_I]A````4*`M'"C\_RU`_($-"``!X&<!_?\G(`(`(`'^OV&@3O,O`"`(
+M8`'^ID$$^N97C1$`((!)\R\```!BH%P=*`":!F``F@9@`((@4"`%#"CX_TU`
+M`7K@5X'X_R<4_N:G`/+<80!\_V%`Y@(`^($-"`0```@``>!G`O4-*`"<!T`$
+M_C]@(,HN*`'^7V``F@9@`((@4"#\"RCX_TU``7K@5P+Y_R<@/O,O`"`(8`!\
+M'V`+`0``H&,D*`":)F``[?\G`#CS+R"()"@``*!A`'P?8`#P````U1PHH#?S
+M+P":!F"@I/(G*/Z?800^#A``9?(O()WT+P``H&$/>N"'@P0`(`!\/V!@M`(`
+M`($`"`#\1F#__\?_``0`:`"!`!``_*9A```X``#]YF<?]_\'@8CR)P!\'V!$
+MJP(``)HF8""V$B@`!$%0@(7R)P0^#A`@7O(O``1!4```X&$`@L!A`?X?8*"4
+M#2@!_C]@``'@9\&"\B<(_A]@!``'$`P`H`D<G`80(+0"*`":!F`<@"8($(0`
+M"/A_`&`0@$`0'(`F"!"$``@`'@!H$(!`$`'^!U``"B`8%H!&$/_[X%<```!0
+M@GCR)R!X\B<6@$80!#X.$"!6\B\L_I]A``#`80""`&(`HBA2(!3S+_RC#1``
+M`*!AH'X`*``@"&``?/]A*,,"```!X&<$@0<001(`(``B!Q``?%]B*,$"```D
+M($#_AB`((,L+*/S_34#\@2T(`(/@9X("`"`(H4<0`+X/8""$*2A>_C]@_($M
+M"`2```@``>!G`@(`(*#>_R\$@0<(_($-"`0```@```<0_($-""8B@!````<(
+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
+MK+P"``%^`$``$&`8%X0&"`)^0(``A`````8`0`"$0$````$0^OX?8*!P'B@`
+M'"=@@!D`(`+^'V`2@$80`/Y($#2$!P@@B"8(`7H`8`'^($``D&`8%X0F"*$$
+M`"`"_D"``'R?8'SW`@```"((`(8@0``"`A```)\(J+P"`(`#`"``?)]@&/<"
+M````(@@`AB!```("$```GPBDO`(```0B``"&($``!$)```(!$`>$)@@`?%]@
+MX/<"``'^8%```"$(`(8@0``"`1``?%]@`/@"````(0@"B&8(`(8@0``"`1`1
+MA"<(@/K@9P(!`"```>!G@@$`(!>$)@B@M_\O`"`(8"!D_R\`(`A@@(SL)P"`
+M#S@``#\(J.,"``"((`@`@^!G`H`/.(!ZX&<`?#]@@+P"``$"`""GD1\8<(&`
+M$"`"`"#(_P!`</V`$.</``"\_P!`((`/.""``!`$/@X0`%7L+X!Z_B^@S_,O
+M`?X_8`!\OV$,PP(```H?"%[E`@`(_8806`(``"5^X*<(_AR0E'X@0!N%!@@$
+M_080`(>3`P"!X%<4@P80"P@`(!B%Q@D9A08(&H4F""!`[B\!?@!``!WG9P".
+M`!@"`@`@`?X?8!B!1A`@!@`@&8-&$``!X&<9@T80`@(`((`#`"````!0&(%&
+M$!F!1A"@%?(O````4!MZX%<,`0`@``(`*(!I[">@:^XO````4`!H["<$/@X0
+M(#CL+P```%``"#\(`,,"``#]X%<C0@``P6?P+P3^'V```>!G@6#L)P!I[B\%
+M>N!7!5_L)R!C[B\!_A]@`'P?8```!```S/DO`%SL)P0^#A"`,.PO@&CN+P!\
+MOV&\L@(`*84F"`'^($`/>N"'*8-&$`18[">`LP0H`GK@5X%6["<`L@0H`WK@
+M5P%5["<IA08(`(#^5X93["<@G!DH`OX?8````%```!\0Z+,"````'Q#DLP(`
+MH$_L)RF!1A`$/@X0("#L+P+^'V``EADH`'P?8,BQ`@"@,PTH??X_F`!\/V#P
+MQ`(`"($`"`"!(`B@[/HO#'X`0*!&["<```!0``!?$!C"`@``@`\X!#X.$*`9
+M["\8_I]A@$ON+P5ZX%>&"``@(#,0*/S_#4``?+]A#,,"``"!!@C\@2T(`(`@
+M4`2!!@@`@>!7C@,`(`!\'V`````!@*KY+P'^'V`0@480_($-"`"!!A"@3>PG
+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
+MC,0"`($!`""@0@$H__\_8(```""`9`$H``'@9P%7X"<`O@]@`'Q?8*S7`@`@
+M&!<H3?X_8(#__R<$/@X0`##@+P```&(`@N!A``2A82!:XB\`AL%A"7K@5P(#
+M`"``O@]@`'Q?8*S7`@"@$!<H6?X_8(#__R<`5>(O`WK@5P(#`"``O@]@`'Q?
+M8*S7`@`@#!<H6OX_8(#__R<`(`A@`)XG8`":1F"@N08H`!QG8"#*"2@```!0
+M`$C@)P0^#A``%N`O`/3[+R!"X"<```!0!#X.$*`3X"_(_C]@`'P?8'"O`@"`
+M)P$H``'@9X$]X"<`?%]@I,T"``!\/V`A`@``(/X6*`"^#V"`__\G````4'0`
+M#1`@@`\X>``-$````%!\``T0((`/.(``#1`$/@X0@`_@+W@`X`D``*!A`*`?
+M"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_
+M=(`F"`"#X&<"G^=G`1H`(`"`)P@`_>!73D161`(8`"!\@"8(`!S'40"#YE=T
+MG`8000,`(!"<!Q`0@@<0@(!&"("$`!!\@"8(?`(!$!2`)PC__R!`%(('$#R`
+M)@@'^N!7@@4`(`?^/V"0@@80*``M"`'^($`H`@T0``"@'R#O`2@`F@9@``'@
+M9X*3X2^````@``"@'W"`!@@``>!G@0$`("#D`BA8_@9`@```(%B<!A``H!\(
+M``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'____W\`
+M`*`?`!3@)P0^#A"`Y=\O``"@800"`!````!0"(`&$!"`!A`4@`80#(`&$`"@
+M'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____
+M?VP`+0@`@^!G`/P&$$Y$5D0!`P`@'(!`"!R:`!`8&@$0'(0&$"`"`"`8@@80
+M;!H-$!B:!A`<F@80<``M"`'^($!P`@T0``"@'R#^WR<```!0!#X.$(#=WR\`
+M`*!A`((`8@`$(6(`AD%B``CB80"@'P@``0!(``$`2``!`$@``0!(``$`2``!
+M`$@``0!(``$`2`1^(&``@*`?____?P+ZZ&<(@"8((0(`(`"@0&``!>A7@@(`
+M(``!`"``!>%G`0$`("`!`"``',=1!_[?80`=YV<"`P`@`?KH9P`""1"!%P`@
+M`*`@<*`6`"`(@@80`)_G9X$4`"`,`,T)='P'$"I```"$(`<0C"('$(@D!Q!X
+M&@<0$(`F"`"#X&>!!``@?`('$("`(`B``@<0$(`F"("`(`A\G``0$(`F""`"
+M`""`G``0$)P&$'P<!Q"`'`<0%(`F"`'^($`4@@80!_X_8#P"!Q`!_C]@1`('
+M$"@`+0A8'@<0`?X@0"@"#1```*`?__OG5T*&`BA8?@=`H/P!*``<!V"@`0`@
+MD`#'"0?^WV$``*`?(-C?)P`<!V````!0;``-$""`#SAP``T0!#X.$("UWR\`
+M`(!B`(*@80`$P6$`H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!
+M`$@$?B!@`("@'____W\(`"H(`GKG9P*:(&!"&P`@"`(*$!``Z@D`FL!I`)_G
+M9Q0`"@HA7P`@"!P*$`%ZZ%>"%P`@C(`G"(2`1P@"^N!G(0(`(``<(6```^%7
+M@@(`(``!`"``@^!G`0$`("`!`"``@B!0!_X_8`"#X&<"#P`@B(`G"`"<`!",
+M@"<(`?K@9X$!`""$@"<(``(G<`@""A``FJ91$!H*$!0:"A`H`"T(=)H'$`'^
+M($`H`@T0``"@'W"`!P@``>!G@0$`(*!Y`BA8_@=`@```(%B:!Q"0F@<0H'T!
+M*`">!V```>!G`4<`((`AX2\`1@`@``"@'P!%`"``HBA2$"(*$`"F:5(H`"T(
+M`"1)4@'^($`H`@T0`)ZG80``H!\`H!\(``$`2``!`$@``0!(``$`2``!`$@`
+M`0!(``$`2``!`$@$?B!@`("@'____W\,`"H(`(/@9P$$`"`,(@H0"``J"`"?
+MYV<`G,!I(1L`(!0`"@H@`0`@`)Y'8`":1F",`&$(A``A"`+ZX6<A`@`@`)R`
+M8`")X%>"`@`@``$`(``)XF<!`0`@(`$`(`""(%`'_C]@`(/@9WP`H0D"$``@
+MB``A"`'ZX6<`G``0`0(`((0`(0@(`&H(`((A<`@""A!\`"$(``/A5Z$#`"`!
+MGN=1`!_A5X``80@!@N!A@(8`$'P`(0A\@@$0%``J"/__($`4`@H0`*?I9Y`B
+M`1"B`@`@="(!$'PB`1``!$%B(`(`(``$86)\!`D0?"(!$``$06+_>PA"@MK_
+M)Q`>"A```*`?@`H`("!(`BA8_@E``*`?"``!`$@``0!(``$`2``!`$@``0!(
+M``$`2``!`$@``0!(!'X@8`"`H!____]_*``M"`'^($`H`@T0``"@'Z!%`2@`
+MI@E@`)IF8@"GZ6<!`P`@<(`)"``!X&=\@*D)@O+_)R#S_R=8H@D0`*`?"``!
+M`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_*``M
+M"/__($`H`@T0``"@'Q``#0@,`"T(`('@5X$!`"````T(``'@9P&Y_R>@:]\G
+M````4``AZ&<!N/\G#``J"`'^($"@MO\G#`(*$`0^#A``,M\O@+H`*``^`B@`
+M:``H``L`*`"+_R\`(O\O@"/_+P!;WR<$/@X0@"_?+P``#0@`?+]A\/#P\`!]
+MX%?Q\/#P@0$`(*"KWR\`&@T0@/7_+P`:#1`@CA\H!``-"````%"@S=\O```-
+M$`!3WR<```!09``-$""`#SAH``T0!#X.$(`IWR]X`.`)``"@80"@'P@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____?W2`)@@`
+M@^!G`I_G9P$:`"``@"<(`/W@5T%-15,"&``@?(`F"``<QU$`@^97=)P&$$$#
+M`"`,G`<0#(('$("`1@B`A``0?(`F"'P"`1`0@"<(__\@0!""!Q`\@"8(!OK@
+M5X(%`"`-_C]@D((&$"@`+0@!_B!`*`(-$```H!\@"0$H`)H&8``!X&>"K>`O
+M@```(```H!]P@`8(``'@9X$!`"`@_@$H6/X&0(```"!8G`80`*`?"``!`$@`
+M`0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_``"@'P`N
+MWR<$/@X0@/_>+P``H&$$`@`0"`0`$````%`,@`80$(`&$`"@'P@``0!(``$`
+M2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____?UP`+0@`@^!G
+M`/P&$$%-15,!`P`@&(!`"!B:`!`4&@$0&(0&$"`"`"`4@@807!H-$!2:!A`8
+MF@808``M"`'^($!@`@T0``"@'Z`8WR<```!0!#X.$(#PWB\``,!A`(+@80"@
+M'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____
+M?P@`)P@`@^!G`0(`(/__($`(`@<0(!4`(`":IE$`G^=G`1,`(`P`K0ET_`80
+M]D$``'B<!A`,`"<(`(/@9X$$`"!\@@80@(`@"(""!A`,`"<(@(`@"'R:`!`,
+M`"<((`(`((":`!`,&@<0?)H&$(":!A`0`"<(`?X@0!`"!Q`&_C]@/((&$`'^
+M/V!$@@80*``M"%B>!A`!_B!`*`(-$```H!__^^=70JH!*%C^!D"@(`$H`)H&
+M8*`!`""0@*8)#?Z_80``H!\@^=XG`)H&8````%!<``T0((`/.&``#1`$/@X0
+M`,W>+P``P&$`H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$
+M?B!@`("@'____W\,`*<)`)OF9P">YU$!#P`@?(`F"`"#YE=!`P`@#!X'$`P"
+M!Q"`@$8(@(0`$'R`)@A\`@$0$``G"/__($`0`@<0*``M"'2>!A`!_B!`*`(-
+M$```H!]P@`8(``'@9X$!`"`@J@$H6/X&0(```"!8G@80D)X&$""N`"@`F@9@
+M``'@9X)2X"\``@`@"``G"`'^($`(`@<0``"@'Z#;WB<```!0!#X.$("LWB\`
+M`*!A-`(`$%`$`!!4!@`0`((@4`@"`!`,"``0%`H`$`'^`E``"`!`$(`&$!]^
+M0V`?_@-@2(`&$!"`#0@XA`80&(`&$!R`!A`$@@80`_X?8#R`!A!`@@801((&
+M$&#\!A"X10``9)H&$'""!A!<@@80=((&$'B"!A!\@@80@((&$`&$'X!,@`80
+M*((&$"R"!A`P@@80`'P_8)9$``"@'N`O`)H&8`"@'P@``0!(``$`2``!`$@`
+M`0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____?Q0`+0@`@^!G`/P&$$12
+M2%0!`P`@F(!`")B:`!"4&@$0F(0&$"`"`""4@@80%!H-$)2:!A"8F@80&``M
+M"`'^($`8`@T0*``M"`'^($`H`@T0``"@'Q2`#0@``>!G@0(`(""!`"@`F@9@
+M``'@9X(EX"\`"``@`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@`
+M`0!(!'X@8`"`H!____]_*``M"/__($`H`@T0``"@'Z"FWB<```!0((`/.`P`
+M#0@`"()0#`@-$!`(#1`<"`T0(`@-$"#^'V`D``T0`'P?8+#:`@``?D`0`7Y@
+M0"`"`"`!_E]@`()!$`'^84`!?D%``'WA5P`!```&!``@`((@4``$`6`!>N!G
+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
+M``GB9QP&#1"A`0`@``H&$`"(@&`@"`T0`(\A&`(@R&'""@`@`J!@``C^(8@`
+MCR`8`0(`(``@R&$"H"``(`<`(`C^8$`0_B&(`(\@&`$"`"``(,AA`J`@`*`#
+M`"`0_F!`&/XAB`"/(!B!$0`@`J`@```@R&$8_F!`)`8-$!``+0@`@^=7@AT`
+M(`+^(8``FB````GB9Q`"#1`!&P`@`7XA0"@"#1```*`?`*`?"``!`$@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_*``M""``30C_
+M_R!`*`(-$``/(1@!!``@(`L`(`*<(``@_C]@)`(-$!`*#1```*`?@`W?+P":
+MW2<(?B&(`(\@&($!`"`"G"``(`4`(`C^($`0?B&(`(\@&($!`"`"G"``(`(`
+M(!#^($`8?B&(`IP@`!C^($`"_B"``)I@`"0`+0A(@($(`(G@5P4"`"!,@"$(
+M$`8-$``"(7`@`@T0``"@'Q``#0@,`"T(``/@5P&+W2>`R?\G!#X.$(!=W2\,
+M`*T)`!S'40"@'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^
+M(&``@*`?____?SR`)@@`@^!G@@P`(!R`)@@8@@80*``M"`"#X&<"?#]@`0``
+M`$()`"`8@@80((!F"`"'YE<!!P`@2(`F"#B`1@@``^%7`@4`(`)^(8``?%]@
+ML-L"``"$@$$D`"T(``8&$`+^((``A"```?[?81`"#1```*`?H''=)P`<!V`$
+M/@X0`$;=+P``H&$\```(!'K@5X()`"``H!\(``$`2``!`$@``0!(``$`2``!
+M`$@``0!(``$`2``!`$@$?B!@`("@'____W\H`"T(`?X@0"@"#1```*`?H#3_
+M+P":!F"`9-TG`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(
+M!'X@8`"`H!____]_=(#&"0``H!\`'>=G@5S=)R`"!S@`F@9@`%O=)P0^#A"`
+M+=TO`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`
+MH!____]_+`"M"0``H!^@4=TG`)H&8`0^#A"`)-TO``"@80"@'P@``0!(``$`
+M2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____?P"`1@@`!>%G
+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
+M@@D`(`"$0`@`!>%G`@@`(`&$8`@!!$`(``?A5P(&`"``!>%G`00`(``$8$`!
+MA($(`(1@0`&$80@`!^)7`@(`(*#[_R?_?T%`((`/.`'^'V`@@`\X````4`0^
+M#A"@R-<O0'Y@8`;^@9`@?F!@!?YAD`"(84`$_F&`'WZ`8``"`A@`"`!```8`
+M0``%X6<``&!@@0``(```@1!-_@!``('A5XP#`"``?%]@R,T"``!\/V#'`P``
+MH*T.*`"^#V"`__\G(.G7)P`&`%`??F!@`(*!&``&HD!`?F!@!OYAD`&&GU``
+M!G\(WL,"`"!^`&``@F$8#_YA0`"(X:<`\F)0!7X`D!1^X*<`"A\(6N4"``"&
+MG$```F`8``H?"%SE`@```@`8``8`0``(`$``!>%G``Q@&($``"```($0``0?
+M"'RR`@```@!`((`/.``&`%`$/@X0H*S7+P+^'V``?+]A=.0"``"`1@@`@B!0
+M@/Y_0*`'%"@`"()0!(!&"`/^'V``@B!0@/Y_0*`$%"@`"()0@-#7)_^1/Q@`
+M`H`0`@*`$""`#S@$`H`0`'Q_8!``(`"@`@`@``1!4``$(4`$`B```7Y!0`""
+M@10`?>%7``$```:`#S@`_/\G!#X.$("@UR\``,!A`'S_81``(`"@"P`@`)JF
+M40":)D``R`<(``(G0`"`@!#___]_____?____W____]_____?____W____]_
+M____?____W____]_____?____W____]_____?____W____]_____?P'^ID$`
+M_>97``$```:ZUR<`\_\G!#X.$*"(UR\`"()0``,`(`)^`H``?`!`=.0"`*#E
+M_R\(```(`7Z"0"!ZXE>&L-<G@/O_)P0^#A``C-<O0_[_@0!\'V)TY`(```#`
+M8:`#`"`"_K]A`OXF@`"$0$"@X_\O```!$`@`QPD!_J9!`!WG9P$&`"`B^N97
+M!@4`(`P`!P@``>!G`"!(8`+Y_R<`O@]@`'Q?8'37`@`@9@XH%/XG0(#__R<`
+M`-\)\.8"```#`"`"_B:``(1`0"#8_R\```$0"`#'"0'^ID$`'>=G`08`("+Z
+MYE<&!0`@#``'"``!X&<`($A@`OG_)P"^#V``?%]@=-<"`*!:#B@A_B=`@/__
+M)X!_`2B@`P`@``#`80+^)H``A$!`H,S_+P```1`(`,<)`?ZF02+ZYE<&"0`@
+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
+M`#AN8Q1^CE,0&@X0``"@80!\'V`!`"`(``/6+P`:`&@`?#]@`0`@"``"UB\0
+M`*X)!(#M"R"`#S@4$&X+!#X.$``V#A``.&YC$'Z.4P&&'QB`]/\O!(#M"R"`
+M#S@0$&X+!#X.$``V#A``.&YC$'Z.4X#^'T``\/\O!(#M"R"`#S@0$&X+!#X.
+M$``V#A``.&YC$'Z.4P!\'V`````@`.O_+P2`[0L@@`\X$!!N"P0^#A``-@X0
+M`#AN8Q!^CE,%>N!7A@(`(`)^((``_`!`4,\"```!``@`Y/\O!(#M"R"`#S@0
+M$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A``?+]A&``P``#AU2\`@"8(`/P@:`"`
+M````@@80`.'5+Q``K@D$@.T+((`/.!00;@L`?!]@$``P``!\7V`8`#``````
+M"`!\(&`/SP`````!"``"(&``@A]0``(`:!]^`(@`@`\X`'P?8!``,``````(
+M`GX@8`""'U```@!H'WX`B`"`#S@`?!]@$``P``````@$?B!@`((?4``"`&@?
+M?@"(`(`/.`0^#A``-@X0`#AN8Q1^CE,0&@X0``"@80!\'V`0`#``````"`%^
+M(&``@A]0``(`:!]^`(@`>N!7@0,`(`!\'V```"`(`,K5+P`:(&``@A]0``(`
+M:!]^`(@0`*X)!(#M"R"`#S@4$&X+`'P?8!``,``````(`'P@8`"`````@A]0
+M``(`:!]^`(@`@`\X!#X.$``V#A``.&YC$'Z.4P!\'V#HP@(```4`"`1ZX%>-
+M`P`@``4`("#^'V``6_\O``@`(!#^'V"`6?\O@`8`(`"^#V"E_C]``"X,*(`$
+M`"`"?H"!`'R&`>Q9`0````8X<%8``&U6``!P5@``;58``(!6```$@.T+((`/
+M.!`0;@L$/@X0`#8.$``X;F,8?HY3$!H.$/S_#4``^/@O_(%-"`!\/V#HP@(`
+M"($`"````5``?>!7`*`/`(4Y`"``?!]@H)@"````0`@`?!]@&/<"``````@`
+M!$!``'P?8'SW`@`````(``2@002!``@`@`90`'W@5P`"```%`P`@`'P_8`"0
+M`0``?!]@U.8"```"`!``+``@`'W@5P`!```%`P`@`'P_8``@`P``?!]@U.8"
+M```"`!"`)P`@0'K@5P4#`"``?#]@`+`$``!\'V#4Y@(```(`$(`C`"`0>N!7
+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
+M````0``*@!@`FJ91(`<`(`""(%`"_@=``(`#4$`!1Q``)`%``!H`0`$%``@$
+M?@"0````0`)^`$````)04`%'$`'^ID$"_B!`!_KF5XHM`"``&N%!H83'"0!\
+M'V+EY@(`#WX'8`AZYV<"?`!H\`````(*`!@`$L!!`(H@02"=1!":A"<*#_X(
+M8`CZZ&<"?`!H\`````(*`!@`%$!!`)5$$).$)PH/_@A@"/KH9P)\`&CP````
+M`@H`&``$"`H`%F!!`7KH5Q"71!`,#``@YH0'"`]^`&`#^N%7```@0@((`"``
+M!!\(9+,"``!ZX%<,!@`@`OX(0`"``U!`@400`"0!0``:`$`!!0`(#WX`8```
+M`$`"?@!````"4"`#`"!0@400`OX(0"`!`"````10(/X?8#"!1!"AA@<(`?X@
+M0@1^`)``'`!```H@&0"*R$$@`4<0FH8'"`1^`)``%`!```I`&0`!1Q"3A@<(
+M!'X`D``6`$`!>NA7$`%'$*P&`"``"F`9YH0'"`1^`)`#^N%7``#@00("`"``
+M!!\(9+,"``!ZX%<)SO\G`OX'0"`!`"````10(/X?8"#1_R<P`4<0`_KA5X('
+M`"``!!\(9+,"``!ZX%>,!0`@H`,`(`""(%``)`%```(`0`@'8`@`C`!`&`=`
+M$`'^($`.^N!7BO+2)X#[_R>@`@`@`((@4*@&80@`C`!`&`=`$`'^($`.^N!7
+M"N[2)X#\_R<$/@X0H+G2+P``P&`@O?PO`((`8```H&"@M?PO`((`8```0&`@
+MQOPO`((`8```8&"@OOPO`((`8```@&#_^^)7`OWA5_____\"?>%7_____P)]
+MXE?_____@@,`(`!\7V#(S0(``'P_8&\$``"@G`DH`+X/8(#__R<`#`-@H)3V
+M+P"*(F"`UM(G`'P?8!29`@``@`\X!#X.$""GTB^W_A]@`'P_8$T%````GP0H
+M`'P?8'\9````@B!0H"/5+P3^7V``S](G!#X.$""ATB^W_A]@`'P_8%0%````
+MF00H`'P?8%09````@B!0H!W5+PC^7V``R=(G!#X.$*";TB\4_I]A`'P?8"#V
+M`@`````(@'K@9P(.`""`PN0O``!@8`!\GV!PPP(`,`4""`".(1@@4^<O__]-
+M0/^%#0@#?B"``'P?8)29`@``A^%G``)`0((&`"``"A\(7N4"`/M_X*<`_!Q`
+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
+M!`A@"`"&($```@$0`'Q?8`R8`@```"$(!@A@"`"&($```@$0"`@@"`H(8`@`
+M`A\0$)@"``!\7V`4F`(````A"`"&($```@$0`'Q?8!B8`@```"$(#`A@"`"&
+M($```@$0`'Q?8!R8`@```"$(#@A@"`"&($```@$0`'Q?8/B7`@```"$($@A@
+M"`"&($```@$0`'Q?8/R7`@```"$(%`A@"`"&($```@$0%@@@"!@(8`@``A\0
+M()@"`"(((`@`?%]@))@"```"'Q`LF`(`)`@@"``"'Q`PF`(````A"`"&($``
+M`@$0'@@@""8(8`@``A\0*)@"``!\7V`TF`(````A"`"&($```@$0`'Q?8#B8
+M`@```"$(*`A@"`"&($```@$0*@A`"`!\/V`\F`(``(``"``$`$`@0]$G`(``
+M$``^#A``'M$O$("-$`""`&(`!.%AH.+1+P"&P6$``*!AH`S5+P;^'V``?']@
+M)+("`)")00@`?)]@`(@"```((4`:_A]@``B!0```0A`0A`T($81-"`.`0!`"
+MA$`0`?KG5P'^'V`"``!0!'X`@`)ZX5<%@$`0JP$`(`2@0!`!?@!H!8!`$)2%
+M`0@!_E]@`8!`$!K^'V`&_C]@H/`&*``<9V"@T]$O`)H&8(#GTB<$/@X0``[1
+M+_+^7T(``,!A`(*@80`$`6('?@!`(,S1+P`.(!H``.!A(/;4+P"B"&``?)]@
+M)+("`)`)(@@`?%]@`(@"``"$8$`<_A]@`(1`0```01`"G$$0`7X)0`.`01`(
+M?@"(!(!!$/3^'T`%@$$0"'X`B`:`01`'_@%`H`(`(`""(%``!$`0`7X`0`'^
+MID$!_B!```/G5XP$`"``A$8(@'KA9X'[_R<`O@]@`'Q?8,#-`@`@V0<H^GXI
+M0(#__R>4!0((`*(H8`&`01``A`$(`?Y?8*#3!B@`(&A@H+;1+P">!V``%M$G
+M!#X.$`#GT"\``,!A`'R_8;C.`@`!>N!7`GWG5P(````!`P`@`+X/8`!\/V#I
+M`@``H,P'*`C_1D"`__\G`?X?8`__)D`@VO\O``1!4`)ZYU<```!0(@4`(`_^
+M/V``_T9``OY_8(/^GV"@)/HO`(JB4````%`;_C]@H`0`(`+_1D`$_T9``OY_
+M8(/^GV`@(/HO`(JB4````%`;_C]@!O]&0`+^?V"#_I]@H!SZ+P"*HE"`^]`G
+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
+MC?S_)P"`#S@"?H&((`,`(`"&85```$`(`?YA0`"$`!`$_B!`!'X`0``'XE<.
+M@`\X`/S_)P!\/V"HJ@(`"(``"`"`0`@````((,#_)P'^/V`8?N"G`/Q<0*BJ
+M`@`T``$(`()@8"@`(0@````(`(`@"""X_R<P`$$(!_X@@`"``$``@`$0((`/
+M.````%`8?N"G`/Q<0*BJ`@`T``$(````"""U_R<D`$$(&'[@IP!\7V"HJ@(`
+M`(0<0#0```@L?D%`````"*"P_R<`<D%`&'[@IP!\7V"HJ@(``(0<0#0```@P
+M?D%`````"""L_R<`<D%`!7K@5P""8&"&!``@&'[@IP#\7$"HJ@(`.``!"#``
+M(0@````(-`!!"*#K_R<``$$(((`/.`3^'V`$/@X0()O-+RC^GV$``.!A`(+`
+M8?S_#4#X_RU`H/#:+_3_34#\@0T(H?X_8``"@!#X@:T)#_X_8`R"1A``"``(
+M$'X`4`Z`AA"@_A]@(%K.+PV`1A">GD80GYQ&$`A^QXD@6LXOH)Q&$/B!#0C\
+M@2T(H%?<+PQ^`$"@Q<TG*/Z?800^#A"`A<TO``0?",SE`@`#>N!7BFD`*(!0
+MSB\``*!A(-+B+PG^'V``B>(OH%#.+P":!F`@D-\O`?X?8-+^'V"@=?\O^/X_
+M0("HS2<$/@X0('K-+QC^GV$`!!\(YN,"```!X&>"W?@O@-0%*`%ZX%>.`@`@
+M`-/Z+P```%``@B!0H#W[+P'^7V"`"0(H@"P"*(`A^"\```!0(#7W+_C_+4``
+M``!0__\_8*"-^2_\_TU`````4""U^2_X_RU``OX?8/__/V`@BODO_/]-0`+^
+M'V"@L?DO^/\M0`;^'V#__S]@H(;Y+_S_34`&_A]@(*[Y+_C_+4`#_A]@__\_
+M8""#^2_\_TU``_X?8*"J^2_X_RU`!/X?8/__/V"@?_DO_/]-0`3^'V`@I_DO
+M^/\M0`7^'V#__S]@('SY+_S_34`%_A]@H*/Y+_C_+4`*_A]@(%KQ+P'^/V`+
+M_A]@H%CQ+P""(%```!\(Y+P"``!]X%<````"`GW@5P````2!`P`@`'Q?8/#-
+M`@``?#]@,`(``"!"!"@`O@]@@/__)P#`]R\`'<XO____?____W____]_____
+M?____W____]_____?____W____]_____?____W____]_____?____W____]_
+M____?____W____]_____?____W____]_____?____W____]_____?____W__
+M__]_____?____W____]_____?____W____]_____?____W____]_____?___
+M_W^`+``H@`3X+R`N!R@*_A^`('_W+_C_#4``?!]@!```]@#*]R____]_____
+M?____W____]_____?____W____]_____?____W____]_____?____W____]_
+M____?____W____]_____?____W____]_____?Z!W]R_X_PU`^($-"``!X&>!
+MV_\G`?[_'P#__R<@@`\X`OX?8```'PC@O`(```'@9P&`#S@`?!]@2,4"`(!%
+M\2<``#\(X+P"``"#X&<!@`\X``0`"$AZX%<!@`\X`'P?8$S%`@"`0/$G!#X.
+M$``CS2\``*!A```?"."\`@```>!G`4S-)P!\'V!$Q0(`@#OQ+P2$!@@!>N!G
+M`4G-)P&$!@@@>N!G`?X?8`$``%```!\00,4"`(!%S2<$/@X0(!?-+Q3^GV$`
+M?!]@"@`@"(#IS2\`?#]@"@`@""#IS2_^?P!@(';W+_S_#4``M?<O(%/-)Q3^
+MGV$$/@X0``_-+P!\'V`*`"`(@.+-+P!\/V`*`"`((.+-+P%^`&@`ZO<O@#?-
+M)P0^#A"@*LTO8/Z?80":IE'\FPT0])L-$``HBE+PFPT0`)[G40`D25(`?!]C
+MX+P"``7^/V,`?+]BS.4"``!\WV%@LP(``'Q_8AR?`@``?!]BF,("``!\_V+0
+MEP(`H`@`(`":!F"`[?\OH.\&*`K^'X`@8/<OY/\-0(#)S2^`RLTOZ($-%("!
+M[B](02@(H)7N+TA_2$!$`0@0Z,$-"`#)S2_T@0T(``'@9X'=X"^`+\\O#WK@
+MAX0&`"````P(`!!`&@``!P@`?>!G'_?_!Z$#`"``LDH0T_X?8"#I_B^Y_C]@
+MH(K:+P``!P@`&@<0`"GJ9X("`"``)`E@_/\M0*"-`"CL_TU``(#I"?R!#0@`
+M`>!G`1<`((`=SR\%>N!7@0$`(``<SR\!>N!7`A0`(("QS2\`;.XO`((@4""`
+M[B](?TA`1`$($``D"6#\_RU`H(,`*.S_34#\@0T(``'@9X$(`"``A`H(`7K@
+M5PP'`"#1_A]@(-;^+]_^/V"@+>(O!OX?8`"$"@@">N!7"P(`(`!\'V````@`
+M`'3:+P`!`"`@*>(O!_X?8`"DS2\`I<TOZ($-%`!<[B](02@(('#N+TA_2$!$
+M`0@0Z,$-"("CS2^@!L\O`*(H4@EZX%>!`0`@@`3/+P-ZX%>"```@`?X_8OBC
+M#13XP0T(``'@9P$E`"``*>IG`B0`(("6S2\`4>XO`((@4"!E[B](?TA`1`$(
+M$``D"6#\_RU`H&@`*$Q_2$``@`D(`('G5X$!`"#\FPT0(`$`(`":!F#\@0T(
+M``'@9P$*`"#1_A]@H+G^+Y#^/T``A"H((+C^+]'^'V!,02@(H+;^+]'^'V!,
+M00@(H-0`*/#_+4``A`H(`GX`@`!\($"\EP(`_($`"`%^`$`@#``@_($`$-+^
+M'V"@K_XOE?X_0`"$*@@@KOXOT?X?8$Q!*`B@K/XOT?X?8"`$XB\(_A]@^)L-
+M%`"$"@@">N!7BP$`("!+VB\0_A^```$`(*#_X2\)_A]@`(`+"`%^`$``@`L0
+M`'G-+P!ZS2_H@0T4`#'N+TA!*`@@1>XO2'](0$0!"!#HP0T(@'C-+_C!#0@`
+M`>!G`@,`(`!ZZ5>,'0`@```?",SF`@```>!G@1L`(`!\/V($`#``^,$-"`"`
+MR`H``>!G`GP_8%4!``#"E_XOT?X?8(!IS2_P@0T(!'X`:``LP&K___]_____
+M?____W____]_____?____W____]_____?____W____]_____?____W____]_
+M____?____W____]_____?____W____]_____?P"L"!#___]_____?____W__
+M__]_____?____W____]_____?____W____]_____?____W____]_____?___
+M_W____]_____?____W____]_____?X!4S2_XP2T(`(/@9P&._R<`4<TO@#$'
+M*``!X&>!`@`@``KN+P""(%`@'NXO2'](0$0!"!#3_A]@('G^+]7^/T``A"H(
+MH'?^+]/^'V``9?\O"OX?8`+^/V`@9N@O`_Y?8```(&(@#P`H]/\-0/2!+0@@
+M<OXOT_X?8/2!#0@``>!G`00`(`"CZ&<"`P`@H*K.+P'^GV(%>N!7!77_)R!W
+M_R?PFPT0\)L-$*##X2\(_A]@3$$("*"G`"@`*(I2`(0*"`)ZX%>*`0`@H+_A
+M+PG^'V"`</\G(`C:+Q#^'X``;_\G!#X.$"!OS"\<_I]A``#`80```%`@?_XO
+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
+M(#KX+SO^*$!6"`@(_W_'00`<X*<*_AR`^($-$`">!V#X_RU`(!L`*`">1V`!
+M>N!7`0,`(`"^#V``?%]@F,T"`"`H_2]#_BA`@/__)P`<!V`@=L8G//Z?80"`
+M@`@``*`(!`#`"`2```@`"F)```P`0`"+X5<&B>%7!7P`0`$`````!@$0((`/
+M.`0``1``@$`(``!@"`"%X5<!_I]@`@B"4`"%X5<!_G]@#H9A4`2`(`@$```(
+M``/@5P'^7V`"!$%0``/@5P'^'V`.``!0``GB9P(%X6<B@`\X`@``4``!X&>"
+M`0`@``7A9P*'X6<!`0`@((`/.`'^'V`@@`\X`OX?8`0^#A"@'\8O````80""
+MP&`@[_\O``2A8``!X&`"!@`@````4`#^`A"@!@`@!(`"$``0!&"@`0`@``PC
+M8``,`V``$"1@(`0`*`"*0F```@`@`?KC5P'[_R<"^N-7@?O_)R!!QB<`C@-@
+M`(!@"```@`@$`*`(!(``"``&PE``@`)0``?B5P5\`$#_____``P!$""`#S@$
+M``$0!#X.$*`/QB\<_I]A``"@82`JZB_\_PU`("GJ+_C_#4#\@0T(^($M"`"`
+M`%``@>97C?S_)Z!(QB<<_I]A``2`$!!^08@"!(`0`'Q_8+2L`@`%A$$("'Z!
+M@`2$00@`"$%X!`2`$`>$00@(?H&`!H1!"``(07@&!(`0"81!"`A^@8`(A$$(
+M``A!>`@$@!"@,0`@``S#4`%^8V``AN%`!(Y@``!\OV#LO0(``(1A>`".81@`
+MAF%``(IA0`2)`0D$CF```'R?8.R_`@``A&%X"/YAD`".81@`AF%``(AA0`2)
+M80@`D`%Y``A@"`"084``!H`0`)`A&03^`T$$D&```))A>`".81@`AF%``(IA
+M0`2)00D$D&```))A>`C^89``AF%``(AA0`2)80@`E`%Y`@A@"`"084`"!H`0
+M`)`A&0C^`T$$D&```))A>`".81@`AF%``(IA0`2)00D$D&```))A>`C^89``
+MAF%``(AA0`2)80@`E`%Y!`A@"`"084`$!H`0`)`A&0S^`T$$D&```))A>`".
+M81@`AF%``(IA0`2)00D$D&```))A>`C^89``AF%``(AA0`2)80@`E`%Y!@A@
+M"`"084`&!H`0`)`!&02.8```!F1X`(YA&`"&84``BF%`!(FA"`2.8```!F1X
+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
+M`(``$`2``!``?!]@$/@"``!\/V``]P(```(`4`)^`)`!?@!0`(``$`!\'V"L
+MF`(``'P_8`"6`@```@!0`GX`D`%^`%``@``0`'P?8!"9`@``?#]@Z)@"```"
+M`%`"?@"0`7X`4`"``!`@@`\X````4*#FV"<._A]@!#X.$`",O2\`(`A2`)[G
+M4:`,`"``',=1.(`&"`````@``>!G`KX/8,+(]"^,_C]@-(`&"`````@``>!G
+M`@0`("2`!@@````(``'@9P("`"`H@`8(````"``!X&>!`0`@`+X/8)+^/V"`
+MP/0O`7X(0AA^QT$$_N=!!7KH5P:DO2<`?#]@J*H"``""!T`0```(``'@9P`"
+MIT&![_\G)(`&"`````@P@`80+(`&$#B`!@@````(``'@9P&^#V!!MO0O=/X_
+M8#2`!@@``"`()(`&"`````@``^!7A0(`(`"^#V"@L?0O>/X_8#2`!@@``"`(
+M*(`&"`````@`@>!7C>W_)P"^#V`@[/\G?/X_8`0^#A``-@X0`#AN8Q!^CE,`
+ML>DO`'P_8)B8`@``@``0"/X?F`#NYR^`Y><O@`8`*`K^'V`!_C]@`%KA+PO^
+M'V`!_C]@@%CA+P```%``?#]@"@`@"(`LOB\$@.T+((`/.!`0;@L`?']@)``P
+M``!\7V`D`3```'P_8"@!,```?!]@``@`@`"``1"#AA\8```!$(6&'Q@`@``0
+M`(`/.(!^'Q"$GP(``(`/.`!8`@``&```````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````(@"`'AG````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````$````````````````````
+M``````````!!0D<Z.2XP+C(N-@``````36%R(#(R(#(P,#4`````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````>P!Z`'H`>0!X`'@`=P!V`'8`=0!T`'0`<P!R
+M`'(`<0!P`'``;P!N`&X`;0!8`%@`5P!6`%8`50!4`%0`4P!2`%(`40!0`%``
+M3P!.`$X`30!,`$P`2P!*`!8`%@`5`!0`%``3`!(`$@`1`!``$``/``X`#0`,
+M``L`"@`)``@`!P`>;`D0`````!YQ"1``````'G8)$``````>>PD0`````!Z`
+M"1$`````'H4)$0`````>B@D1`````!Z/"1$`````'I0)$0`````>F0D1````
+M`!Z>"1$`````'J,)$@`````>J`D2`````!ZT"1(`````#-@#`/T!`0`,W`,`
+M_0$!``S@`P#]`0$`#.0#`/T!`0`,\`,`_0(!`0ST`P#]`@$!#/@#`/T"`0$,
+M"@0`!P("`@P,!``'`@("#`X$``@"`@(,$`0`"@,"`@P2!``*`P("#!0$``D#
+M`@(,%@0`"0,"`@P8!``)`P("#!P$``D#`@(,(`0`"0,"`PPD!``)`P(##"@$
+M``@#`@,,3`0`"`0#!`Q0!``'!`,$#%0$``8$`P0,6`0`!`0#!`Q<!``$!`,$
+M#&`$``D%`P4,9`0`"`4#!0QH!``'!0,%#&P$``8%`P4,<`0`!@4#!0QT!``#
+M!0,&#'D$``4&!`8,?00`!08$!@R!!`4#!@0&#(,$``0&!`8,A00`!`8$!@R)
+M!``$!@0&#(T$``,&!`8`````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````&`````````+"8`@`0``$`P)@"`!```0#0F`(`
+M!``!`-28`@`%``$`W)@"``8``0"DV`(`!``!````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````.``@`"@`$``0``@`P`#``%``P```"``"```````````$`````
+M^@```0```#0`,``8`#````0````!````````Z`,``/____\!````.``P`!@`
+M,```$`````(`````````!````/H```$````@`#``&``P``````!`````````
+M```$``````!``0```"`!,``8`#```````"````````````0```````(@````
+M/``P`````````````````/____\0)P```(>3`P$````P`3``&``P```@````
+M!``````````$``#___]_`0```%-Y<W1E;2!4:6UE<B!4:')E860```#_``\`
+M#P`/``\`/P`_`#\`/P`"`@("````````````````#P`/``\`#P`_`#\`/P`_
+M``("`@(````````````````/``\`#P`/`#\`/P`_`#\``@("`@``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````6-T"``!P`@``
+M`0``````````````````6.$"``"``@!`````````````````````6.("``"$
+M`@!``````'`"``"``@``A`(`H/("`*#_`@!$\@(`0/("``$````!`````0``
+M``$````!````@/("`(#_`@````````````3R`@``\@(`A/("`(3_`@``````
+M``````SR`@`(\@(`B/("`(C_`@```````````!3R`@`0\@(`C/("`(S_`@``
+M`````````!SR`@`8\@(`D/("`)#_`@```````````"3R`@`@\@(`````````
+M``````````````````````````````````!T>'-C:&5D7V4`````````````
+M``````"($P``````````````````````````````````````````````````
+M`````````````````````&1I<W!A=&-H97)?86-T``!:I5JE``````$$!`0$
+M!`0"!``#!`0$`00$!`0$!``$`0$,#`P,#`P,#`P,``4!#`$,`@P,#`P,#`P,
+M#`P,`PP,#`P,#`P,#`P,!`$,#`P,#`P,#`P,`0P,#`$&!PL(#`P,#`P,`0P'
+M"PP,#`P,#`P!#`P+#`P,#`P,#`P("`@,"0P,#`P,#`P,#`P,"@P,#`P,"@H*
+M#`P,!0P,#`$,"PP,#`P,!0P"`!("`1@"`B0"!#`""$@"$&`"(&P"0`(!`00!
+M`@L!!!8!"`(!`00!`@L!!`P"`!("`18!"!@"`B0"!#`""$@"$&`"(&P"0```
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````0@,$A@D,$A@;`````````$$
+M`@0+%@`````````````!#`($"Q8,$A@D,$A@;````0P"!`L6#!(8)#!(8&P`
+M``$(#!(8)#!(8&P````````#`0$`!@(%`"H!````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````,`````````````````````````````
+M``````````````````!M;6%C7W=A:71?9&EN;U]R97-P7W-E;0``````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````')E<W!O;G-E7W1R9P``````````````````````````````````
+M```````````````#`````````0```'-C86Y2>%1R9P``````````````````
+M`````@`'```````'`/W_``````````#]_P``````````````````````````
+M'``````````````````4`!L`"P`7```````!`!X`````````/@```"4````$
+M````````````````````````````-``Q`#$````````````(````%0`0``(`
+M``!`````````````````````````````````````````````````````````
+M```````````````````````9;@``_FT``%5<```&+```O5$``*(%``#O#@``
+M#0\``-,.```#,P``*S,```$`````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````"``````````/____\`````````
+M``````````````````````````````````\`````````!00#`@$````!`0$!
+M`@(``'=A:71?9&EN;U]S=&%T:7-T:6-S````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````F```
+M``````"X"P``*",``"@````*````,@``````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````!`````0```````````````````````````````````')X7V4`````
+M`````````````````````````````0,#``$"`P`#`P``````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````$````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````!0(`UKG#P``*#E(8GF:L;JJ
+M*G$<514X#JH*'`=5!;T$#0\%!PD+`0,```````````$!`@(#!`0%!PTC.O__
+M`("++D47"A0W;@$!`0$!`@,%!PTC```Z3&B"J+_*!PTC```Z`%!=<7M]__\`
+M@(LNJBIQ'$47514X#JH*'`=5!;T$"A0W#0]N!0<)"P$#`0$!```!````````
+M`0$!`@("`P,$!`4%````````````````````````````````````````````
+M`````````````````````````&#J````````````````````````````````
+M```````````````````#````I<:$^)GNC?8-_[W6L=Y4D5!@`P*ISGU6&>=B
+MM>9-FNQ%CYT?0(F'^A7OZ[+)C@O[[$%GL_U?ZD6_(_=3EN1;F\)U'.&N/6I,
+M6FQ!?@+U3X-<:/11--$(^9/B<ZM38C\J#`A2E65&7ITH,*$W#PJU+PD.-B2;
+M&SW?)LUI3LU_G^H;$IX==%@N-"TVLMSNM/M;]J1-=F&WSGU[4C[=<5Z7$_6F
+M:+D``"S!8$`?X\AY[;:^U$:-V6=+<MZ4U)CHL$J%:[LJQ>5/%NW%AM>:56:4
+M$<^*$.D&!('^\*!$>+HEXTOSHOY=P("*!:T_O"%(<`3QWV/!=W6O8T(P(!KE
+M#OUMOTR!%!@U)B_#X;ZB-<R(.2Y7D_)5@OQ'>JS(Y[HK,I7FH,"8&=&>?Z-F
+M1'Y4JSN#"\J,*<?3:SPH>:?BO!T6=JT[VU9D3G0>%-N2"@QL2.2X79]NO>]#
+MIL2H.:0Q-].+\C+50XM9;K?:C`%DL=*<X$FTV/JL!_,ESZ_*CO3I1Q@0U6^(
+M\&]*<EPD./%7QW-1ER/+?*&<Z"$^W9;<888-A0^0X$)\Q'&JS-B0!08!]Q(<
+MH\)?:OFNT&F1%UB9)SJY)SC9$^NS*S,BN])PJ8D'IS.V+2(\DA4@R4F'_ZIX
+M4'JECP/X68`)%QK:93'7QH2XT,."L"EW6A$>RWO\J-9M.BS&I?B$[IGVC?\-
+MUKW>L9%48%`"`\ZI5GWG&;5B3>;LFH]%'YV)0/J'[Q6RZX[)^PM![+-G7_U%
+MZB._4_?DEIM;=<+A'#VN3&IL6GY!]0*#3VA<4?31-/D(XI.K<V)3*C\(#)52
+M1F6=7C`H-Z$*#R^U#@DD-AN;WSW-)DYI?\WJGQ(;'9Y8=#0N-BW<LK3N6_ND
+M]G9-MV%]SE)[W3Y><1.7IO6Y:```P2Q`8.,?><BV[=2^C49GV7)+E-Z8U+#H
+MA4J[:\4J3^7M%H;%FM=F51&4BL_I$`0&_H&@\'A$);I+XZ+S7?Z`P`6*/ZTA
+MO'!(\01CWW?!KW5"8R`PY1K]#K]M@4P8%"8UPR^^X36BB,PN.9-75?+\@GI'
+MR*RZYS(KYI7`H!F8GM&C?T1F5'X[JPN#C,K'*6O3*#RG>;SB%AVM=ML[9%9T
+M3A0>DML,"DALN.2?7;UN0^_$ICFH,:33-_*+U3*+0VY9VK<!C+%DG-))X-BT
+MK/KS!\\ERJ_TCD?I$!AOU?"(2F]<<C@D5_%SQY=1RR.A?.B</B&6W6'<#88/
+MA>"0?$)QQ,RJD-@&!?<!'!+"HVI?KOEIT!>1F5@Z)R>YV3CK$RNS(C/2NZEP
+M!XDSIRVV/"(5DLD@ATFJ_U!XI7H#CUGX"8`:%V7:US&$QM"X@L,IL%IW'A%[
+MRZC\;=8L.@``````````````````*``H*"@H*"@H*"@H*"@H*"@H*"@H*"@H
+M*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@``````````````````"`#
+M````````````````````````````````````````````=V%I=%]M96%S7W-T
+M871I<W1I8W,``````0``````````````9````````````````0````0'"@H*
+M`````"`#```@`P``R````,@```!D````T`<``+`$``"0`0``9````&0`````
+M````T`<``0(#!`4`````````````````````````````````````````````
+M````````0!\`````````````L`0``````("6F`!D`````0``````````````
+M```%1O____\`````````````````````````````````````````````````
+M``````````````````````````````!M=V%I=%]E````$`"``;@`Z`#I`.N`
+ML("`@[.1````````````````````````````````````````````````='5N
+M95]W86ET7W-E;0``````````````````````````````````````````````
+M``````````````````````,`````````__\``/__________X````"-"```#
+M````@`"``(``@`"``(``@`"``'L`>@!Z`'D`>`!X`'<`=@!V`'4`=`!T`',`
+M<@!R`'$`<`!P`&\`;@!N`&T`6`!8`%<`5@!6`%4`5`!4`%,`4@!2`%$`4`!0
+M`$\`3@!.`$T`3`!,`$L`2@!*`$D`2`!(`$<`1@!&`$4`1`!$`$,`0@!"`$$`
+M0`!```D`"``(``<`J@$``*P!``"N`0``L`$``+(!``"T`0``M@$``#$Q+"PL
+M+"D`^/\(`#``0`!L`(``G0```/O[!0`*!04````````````````R````````
+M````````````````````````````````````````````````````````````
+M````````````;&UA8U]P;W=E<E]P<F]C97-S7W-E;0``````````````````
+M````````````````````````````````8V%L:6)R871I;VY?<V5Q=65N8V5?
+M<V5M`````(&`@I0"`P"``H,``PH`#P````$`````````````````````````
+M````````````````````````='AL;V-K7W-E;0```````````0`6`P(`@("`
+M@("`"P```/\``0````L[6W-SH\/;```````````````````````````@(```
+M`P#_``"#``!_````'@$$`0$```````````0!`(S<WN#B````````'P``@P`#
+M`/\``0```/\`````````;@!N``$```!`'P``````````````````````````
+M```!``````````````````D`#``)``D`!P`````````````````````````%
+M`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``
+M$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!@`````
+M````````````````````````````````````````````````````````````
+M```````````````````?'Q\?'Q\?'Q\?'Q\?'Q\?'Q\?'Q\?'Q\?'R$A#!0,
+M%`T5#A80&!(:%1T9(1HB&R,;(QPD'24=)1XF'R<?)Q\G'R<?)QXF'24<)!HB
+M&"`6'A4=%!P2&A(:$1D0&!`8$!@0&!`8$!@````````?'Q\?'Q\?'Q\?'Q\?
+M(0```PD)"P,("`H"!P<)`08%!P$%!`8`!`,$``,"`_\"`0'^````_?[]_OS[
+M^_S[^OGZ^OCX^/KW]_?Y]?7V]_3S]?7R\?/S\._R\N_M\/'M[.X`````````
+M``````````````````````````````````````````````("!OKZ^OKZ_/X`
+M``````#\_@```````````````````````````@``````````````````````
+M``````("!OKZ^OKZ_/X```````#\_@#S>_-U\V[S:/-B\UW3;M-HTV+37;-N
+MLVBS8K-=DVZ3:)-BDUUS;G-H<V)S75-N4VA38E-=,VXS:#-B,UT3;A-H$V(3
+M77MN>VA[8GM=6VY;:%MB6UT[;CMH.V([71MN&V@;8AM=0VY#:$-B0UTC;B-H
+M(V(C70-N`V@#8@-=:VYK:&MB:UU+;DMH2V)+72MN*V@K8BM="VX+:`MB"UWS
+M>_-U\V[S:/-B\UW3;M-HTV+37;-NLVBS8K-=DVZ3:)-BDUW[<?MK^V7[8-MO
+MVVK;9]MCVUV[;KMHNV+C:>-CXU[#;,-FPV+#7:-NHVBC8J-=@VZ#:8-D.V([
+M71MN&V@;8AM=0VY#:$-B0UTC;B-H(V(C70-N`V@#8@-=:VYK:&MB:UU+;DMH
+M2V)+72MN*V@K8BM="VX+:`MB"UWS>_-U\V[S:/-B\UW3;M-HTV+37;-PLVJS
+M9+-?DV^3:)-B^WO[=?MN^VC[9/M?VW';:]MEVU_;6;MLNV>[8;M:XW_C>.-R
+MXVSC9L-WPW##:J-_HWFC<J-LHV:C88-O@VJ#98-?ZW'K:^ME0WE#<D-L0V9#
+M82-Q(VLC9B-@`W$#:P-E`U]K<&MF:V5+>4MR2VQ+9RMX*W$K:RME*UX`31D?
+M'@`L`0(`````32$AU/XL`0``````31D@(P`L`0$`````32$D(P`L`?____\`
+M31\@*``L`0(`````30X4U/[Z_P,`````31(4U/[P_P(`````3148'@`L`0(`
+M````31$4U/X%``0`````320FU/[F__W___\`32$K&@`L`?____\`32$K'@`L
+M`?____\`32`@U/[F__[___\`32`@U/[F_P(`````32$FU/[Z_P(`````32$F
+MU/[P_P,```#P#O0/^!#\$0@2#!,0%"(5)!8F%R@8*ADL&BX;,!PT'3@>/!]`
+M(&0A:")L(W`D="5X)GPG@"B$*8@JC"N1+)4MF2Z;+YTPH3&E,@``````````
+M`````````````#(_#A$`````^O\R/R$G````````,C\H+$,```#V_S(_*"PC
+M````]O\R/R@L`P```/;_,C\M,$,`X/\``#(_+3`C`.#_```R/RTP`P!H````
+M,C\Q,4,`X/_Z_S(_,3$C`.#_^O\R/S$Q`P!H`/K_,C\R,D,`X/_T_S(_,C(C
+M`.#_]/\R/S(R`P!H`/K_/DT.$0````#Z_SY-*"L`````[_\^22PP``#@_P``
+M/DDQ,@``X/_Z_TI-+3(`````XO\R30X@``````8`,DTA)`````#Z_S)-)2<`
+M````]/\R.3$R``````P`(DT.$0```````")-$A0`````````````````````
+M````````````````````````````````````````*```````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````8VUD7W=A:71?9F]R7W)E
+M<W!O;G-E```0#&\`````````!````0```%-Y<R!);FET(%1A<VL```#U:P``
+M```````$```%````1G)A;64@2&%N9&QE<@```$8=``````````0```L```!4
+M6"!38VAE9'5L97(`````(5,`````````!```!````&1I<W!A=&-H97(@5&%S
+M:P``````````````````````````````````````````````````````````
+M````````````````````````````!0,`````ZLP``.J,________/P``````
+M_____P`$`@````,`_____P```````.;,``#FC/____\$`"```````/____\$
+M`"``!0`@`/____\```````"FS```IHS__S\`!``@```$`@````,`!``@``4`
+M(`#\____``````!`:LP`0&J,!``@`/__/P`$`"``!0`@```$`@````,`____
+M_P$`````@*Z,``"NC/__/P#_____``0"`````P``````______S___\"````
+M`P```*``,`"D`#``T``P````5`%0`#``5``P`,``,````%0`L``P`+0`,`#4
+M`#````!4`$UM86-M9W(N8P```&UM86,N8P``8VYC=&UG<BYC````!0````H`
+M!P!$:6YO+F,``$9R86UE<G@N8P````````````````````$``0`````````&
+M`!@`'@!P=W)M;F<N8P````!K97E?8V]M<'5T871I;VXN8P``````````````
+M__________]S<&5C=')U;7!K="YC````5'A0;W=E<D-A;&EB+F,`````````
+M```````````````!`````@````0````(````$````%1X8W1R;"YC`````(^.
+M^HC"[*FML````+$"``"Q`P``J?^J_ZO_J#\```````"(?R\P`S`4`#-_!S`#
+M,!0`,W\_,`,P%``S?P<P```8$#-_`#`#`!@0,W\`0`1`&!"(@71U;F5R+F,`
+M?P!^`'X`?0!\`'P`>P!Z`'H`>0!X`'@`=P!V`'8`=0!T`',`<@!Q`'``;P!N
+M`&T`;`!K`&H`:0!H`%$`40!0`$\`3@!.`$T`3`!+`$L`2@!)`$@`2`!'`!``
+M$``/``X`#@`-``P`#``+``H`"@`)``@`"``'``8`!@`%``0``P#$>A"`,(`7
+M````&0```!$`%P#X_R``#````#4`!P````,```"$@)`0D222*I,\E`.5?Z8@
+MIPJM?Z\/M0/@@N$@XD#EH.8RYX7O`)8!F`'S0/0@``"``8$"B$".0*DBJB*K
+M(M4"U@7U^("#GQ"H$*F(JC.K,ZX0LY&V`\`<]1```($"B@"@`+$"N0+"`($`
+MB@&@`;$"N0'"',(```#"%```&.X!S.?1X?ON*/LX`"T`)``M^SCN*.'[Y]$!
+MS!CN$A+N&,P!T>?[X2CN./LM`"0`+0`X^RCN^^'1Y\P![A@2$ACN`<SGT>'[
+M[BC[.``M`"0`+?LX[BCA^^?1`<P8[A(2[AC,`='G^^$H[CC[+0`D`"T`./LH
+M[OOAT>?,`>X8$A(8[@',Y]'A^^XH^S@`+0`D`"W[..XHX?OGT0',&.X2$NX8
+MS`'1Y_OA*.XX^RT`)``M`#C[*.[[X='GS`'N&!(2&.X!S.?1X?ON*/LX`"T`
+M)``M^SCN*.'[Y]$!S!CN$A+N&,P!T>?[X2CN./LM`"0`+0`X^RCN^^'1Y\P!
+M_`(&W^W:V@76)]<DUO_3W-C=Z_\((!T=&_<(SOO!!M$EYSOR+_$(ZN;EX.GP
+M_/L;\"_<(-?TY\WVR_'JW@?:#O0-&!@B+0(NTQ/"]]OZ!A<=)!<*#-T2RR;@
+M+0`:$?X5]QT*)B,9*?$>SA73&_DB%Q86]0C:#^`F!"LK#SKT+_X7)@`]Z2;1
+M_L;TU0_\*R`F)@\+".H6WA?E^>O3XL[7\=T9]B8)'0(5YA'3`-K@[LOTW>D*
+MXR3Z%R7Z/O<M$_XNWBWI&`P-)@XB!P_J"LL9S2GT)"`0+P4;$/P@Z1KE^.K1
+M\<7RV^?ZT07!^,[E]^,=^"`5_RC=+=PJ_RDD*B<F!1?8`,/IV-H%UB?7)-;_
+MT]S8W>O_""`='1OW",[[P0;1)><[\B_Q".KFY>#I\/S[&_`OW"#7].?-]LOQ
+MZMX'V@[T#1@8(BT"+M,3PO?;^@87'207"@S=$LLFX"T`&A'^%?<="B8C&2GQ
+M'LX5TQOY(A<6%O4(V@_@)@0K*P\Z]"_^%R8`/>DFT?[&]-4/_"L@)B8/"PCJ
+M%MX7Y?GKT^+.U_'=&?8F"1T"%>81TP#:X.[+]-WI"N,D^A<E^C[W+1/^+MXM
+MZ1@,#28.(@</Z@K+&<TI]"0@$"\%&Q#\(.D:Y?CJT?'%\MOG^M$%P?C.Y??C
+M'?@@%?\HW2W<*O\I)"HG)@47V`##Z=C:!=8GUR36_]/<V-WK_P@@'1T;]PC.
+M^\$&T27G._(O\0CJYN7@Z?#\^QOP+]P@U_3GS?;+\>K>!]H.]`T8&"(M`B[3
+M$\+WV_H&%QTD%PH,W1++)N`M`!H1_A7W'0HF(QDI\1[.%=,;^2(7%A;U"-H/
+MX"8$*RL/.O0O_A<F`#WI)A(2`0`0``````````````````````````$``@``
+M`````0`"```````"``$```````(``0``````````````````````````````
+M``$"```"`0``````=`$"`P0%!@<("0H+#`T.#Q`1$A,4%187&!D:&QP='A\@
+M(2(C)"4F)R@I*BLL+2XO,#$R,S0U-C<X.3H[/#T^/T!!0D-$149'2$E*2TQ-
+M3D]045)35%565UA96EM<75Y?8&%B8V1E9F=H:6IK;&UN;W!Q<G-T=79W>'EZ
+M>WQ]?G\`!@``,)@`=3#X:]4``,O`8``C```2```````!`0$6`1````````$!
+M#@`#`0$``0`$`P,#`P,`"@`$"@```````0(```("!`08&!@8&!@8&!@8&!@8
+M&!@8&!@8&"`8&!@8&!@8&!@8&"`4&A@8E!H8&!`:&!@0&A@8"AH8&`H:&!@0
+M&A@8$!H8&!@@'!P8+"08&"4@'1HW*P0$$0P)!B,7&!H4%!06%!0!``$``@`"
+M``,``P`$``4`!@`(``H`#0`0`!0`&0`@`"@`,@`_`$\`9`!^`)X`R`#[`#P!
+MC@'U`7<"&@/H`^L$,0;+!]`)6@R-#Y03IA@''Q`G+3'I/?%-'V*'>X.;Q\-X
+M]@$``0`!``$`T````/\`'@#\_P``/0```"0`"@`>`!8````!``(`=``@````
+M`````````````0HL7G]_7BP*`0````````````````````````````,85']4
+M&`,````````````!````$0```!$`$P`0`#\``0`_`/\`_P`!````&0`J``H`
+M_P```)8`,@!D`````0``80``%`````$``@`#``0`!0`&``<`"``)``H`"P`,
+M``T`#@`/`!``$0`2`!,`%``5`!8`%P`8`!D`&@`;`!P`'0`>`!\`(``A`"(`
+M(P`D`"4`)@`G`"@`*0`J`"L`+``M`"X`+P`P`#$`,@`S`#0`-0`V`#<`.``Y
+M`#H`.P`\`#T`/@`_`$``00!"`$,`1`!%`$8`1P!(`$D`2@!+`$P`30!.`$\`
+M4`!1`%(`4P!4`%4`5@!7`%@`60!:`%L`7`!=`%X`7P!@`&$`8@!C`&0`90!F
+M`&<`:`!I`&H`:P!L`&T`;@!O`'``<0!R`',`=`!U`'8`=P!X`'D`>@![`'P`
+M?0!^`'\````8`"X`0@!5`&<`>`"'`)4`H@"N`+D`PP#+`-,`V@#A`.8`ZP#O
+M`/,`]@#X`/H`_`#]`/X`_@#_`/\`_P#_`!(`````````_P#_`*\`[0``````
+M<&AY7VEN:71I86QI>F%T:6]N+F,``````0`!`*X?``"N$P``[X``````````
+M``````````````!P;W=E<E]R97-U;64N8P``0V%L:6)296%D5W)I=&4N8P``
+M``!496UP97)A='5R94-A;&EB+F,``%1X9&UA87)C+F,``%)X9&UA87)C+F,`
+M`-G;W=^7F8(`@8(``-F`VX#=@-^`EX"9@$1#3V9F<V5T+F,``)"?J*Z!@*R"
+ME0```$9I;'1E<G-#86QI8BYC``""@8"E25%#86QI8BYC````"0L4&`\````+
+M"Q08"P```'MU;FAB75=23DI%0CXZ-S0Q````5'A0;W=E<D-A;&EB0D<N8P``
+M``!4>%!O=V5R0V%L:6)!0D<N8P``````````````3&UA8RYC``!0:W1T>"YC
+M`/#P\/``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````/<"`.`$
+M``````````````````#$"0``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+C````````````````````````````````````````````````
+`
+end
diff --git a/sys/contrib/dev/iwi/ipw2200-sniffer.fw.uu b/sys/contrib/dev/iwi/ipw2200-sniffer.fw.uu
new file mode 100644
index 0000000..5a9f0f3
--- /dev/null
+++ b/sys/contrib/dev/iwi/ipw2200-sniffer.fw.uu
@@ -0,0 +1,4386 @@
+/*-
+ * TERMS AND CONDITIONS
+ * IMPORTANT - PLEASE READ BEFORE INSTALLING OR USING THIS INTEL(C) SOFTWARE
+ *
+ * Do not use or load this firmware (the "Software") until you have carefully read
+ * the following terms and conditions. By loading or using the Software, you agree
+ * to the terms of this Agreement. If you do not wish to so agree, do not install
+ * or use the Software.
+ *
+ * LICENSEES:
+ *
+ * Please note:
+ *
+ * * If you are an End-User, only Exhibit A, the SOFTWARE LICENSE AGREEMENT,
+ * applies.
+ * * If you are an Original Equipment Manufacturer (OEM), Independent Hardware
+ * Vendor (IHV), or Independent Software Vendor (ISV), this complete Agreement
+ * applies
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * For OEMs, IHVs, and ISVs:
+ *
+ * LICENSE. This Software is licensed for use only in conjunction with Intel
+ * component products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder. Subject to the terms of this Agreement,
+ * Intel grants to you a nonexclusive, nontransferable, worldwide, fully paid-up
+ * license under Intel's copyrights to: (i) copy the Software internally for your
+ * own development and maintenance purposes; (ii) copy and distribute the Software
+ * to your end-users, but only under a license agreement with terms at least as
+ * restrictive as those contained in Intel's Final, Single User License Agreement,
+ * attached as Exhibit A; and (iii) modify, copy and distribute the end-user
+ * documentation which may accompany the Software, but only in association with
+ * the Software.
+ *
+ * If you are not the final manufacturer or vendor of a computer system or software
+ * program incorporating the Software, then you may transfer a copy of the
+ * Software, including any related documentation (modified or unmodified) to your
+ * recipient for use in accordance with the terms of this Agreement, provided such
+ * recipient agrees to be fully bound by the terms hereof. You shall not otherwise
+ * assign, sublicense, lease, or in any other way transfer or disclose Software to
+ * any third party. You may not, nor may you assist any other person or entity to
+ * modify, translate, convert to another programming language, decompile, reverse
+ * engineer, or disassemble any portion of the Software or otherwise attempt to
+ * derive source code from any object code modules of the Software or any internal
+ * data files generated by the Software. Your rights to redistribute the Software
+ * shall be contingent upon your installation of this Agreement in its entirety in
+ * the same directory as the Software.
+ *
+ * CONTRACTORS. For the purpose of this Agreement, and notwithstanding anything
+ * to the contrary hereunder, solely with respect to the requirements for
+ * compliance with the terms hereunder, any contractors or consultants that You
+ * use to perform the work or otherwise assist You in the development or products
+ * using this Software shall be deemed to be End Users and accordingly, upon
+ * receipt of the Software, shall be bound by the terms of Exhibit A, Software
+ * License Agreement. No additional agreement between You and such consultants or
+ * contractors is required under this Agreement to detail such compliance.
+ *
+ * TRADEMARKS. Except as expressly provided herein, you shall not use Intel's
+ * name in any publications, advertisements, or other announcements without
+ * Intel's prior written consent. You do not have any rights to use any Intel
+ * trademarks or logos.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Software and accompanying materials, if
+ * any, are owned by Intel or its suppliers and licensors and may be protected by
+ * copyright, trademark, patent and trade secret law and international treaties.
+ * Any rights, express or implied, in the intellectual property embodied in the
+ * foregoing, other than those specified in this Agreement, are reserved by Intel
+ * and its suppliers and licensors or otherwise as set forth in any applicable
+ * open source license agreement. You will keep the Software free of liens,
+ * attachments, and other encumbrances. You agree not to remove any proprietary
+ * notices and/or any labels from the Software and accompanying materials without
+ * prior written approval by Intel
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS AND LICENSORS
+ * BE LIABLE FOR ANY DAMAGES WHATSOEVER FROM ANY CAUSE OF ACTION OF ANY KIND
+ * (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS INTERRUPTION, OR LOST
+ * INFORMATION) ARISING OUT OF THE USE, MODIFICATION, OR INABILITY TO USE THE
+ * INTEL SOFTWARE, OR OTHERWISE, NOR FOR PUNITIVE, INCIDENTAL, CONSEQUENTIAL, OR
+ * SPECIAL DAMAGES OF ANY KIND, EVEN IF INTEL OR ITS SUPPLIERS AND LICENSORS HAS
+ * BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. SOME JURISDICTIONS PROHIBIT
+ * EXCLUSION OR LIMITATION OF LIABILITY FOR IMPLIED WARRANTIES, CONSEQUENTIAL OR
+ * INCIDENTAL DAMAGES, SO CERTAIN LIMITATIONS MAY NOT APPLY. YOU MAY ALSO HAVE
+ * OTHER LEGAL RIGHTS THAT VARY BETWEEN JURISDICTIONS.
+ *
+ * EXCLUSION OF WARRANTIES. THE SOFTWARE IS PROVIDED "AS IS" AND POSSIBLY WITH
+ * FAULTS. UNLESS EXPRESSLY AGREED OTHERWISE, INTEL AND ITS SUPPLIERS AND
+ * LICENSORS DISCLAIM ANY AND ALL WARRANTIES AND GUARANTEES, EXPRESS, IMPLIED OR
+ * OTHERWISE, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+ * NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR PURPOSE. Intel does not warrant
+ * or assume responsibility for the accuracy or completeness of any information,
+ * text, graphics, links or other items contained within the Software. You assume
+ * all liability, financial or otherwise, associated with Your use or disposition
+ * of the Software.
+ *
+ * APPLICABLE LAW. Claims arising under this Agreement shall be governed by the
+ * laws of State of California], excluding its principles of conflict of laws and
+ * the United Nations Convention on Contracts for the Sale of Goods.
+ *
+ * WAIVER AND AMENDMENT. No modification, amendment or waiver of any provision of
+ * this Agreement shall be effective unless in writing and signed by an officer of
+ * Intel. No failure or delay in exercising any right, power, or remedy under
+ * this Agreement shall operate as a waiver of any such right, power or remedy.
+ * Without limiting the foregoing, terms and conditions on any purchase orders or
+ * similar materials submitted by you to Intel, and any terms contained in IntelÂ’s
+ * standard acknowledgment form that are in conflict with these terms, shall be of
+ * no force or effect.
+ *
+ * SEVERABILITY. If any provision of this Agreement is held by a court of
+ * competent jurisdiction to be contrary to law, such provision shall be changed
+ * and interpreted so as to best accomplish the objectives of the original
+ * provision to the fullest extent allowed by law and the remaining provisions of
+ * this Agreement shall remain in full force and effect.
+ *
+ * EXPORT RESTRICTIONS. Each party acknowledges that the Software is subject to
+ * applicable import and export regulations of the United States and of the
+ * countries in which each party transacts business, specifically including U.S.
+ * Export Administration Act and Export Administration Regulations. Each party
+ * shall comply with such laws and regulations, as well as all other laws and
+ * regulations applicable to the Software. Without limiting the generality of the
+ * foregoing, each party agrees that it will not export, re-export, transfer or
+ * divert any of the Software or the direct programs thereof to any restricted
+ * place or party in accordance with U.S. export regulations. Note that Software
+ * containing encryption may be subject to additional restrictions.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ *
+ * TERMINATION OF THE AGREEMENT. Intel may terminate this Agreement if you violate
+ * its terms. Upon termination, you will immediately destroy the Software or
+ * return all copies of the Software to Intel.
+ *
+ * --------------------------------------------------------------------------------
+ *
+ * EXHIBIT "A"
+ *
+ * SOFTWARE LICENSE AGREEMENT (Final, Single User)
+ *
+ * IMPORTANT - READ BEFORE COPYING, INSTALLING OR USING.
+ *
+ * Do not use or load this firmware image (the "Software") until you have carefully
+ * read the following terms and conditions. By loading or using the Software, you
+ * agree to the terms of this Agreement. If you do not wish to so agree, do not
+ * install or use the Software.
+ *
+ * LICENSE. You may copy and use the Software, subject to these conditions:
+ * 1. This Software is licensed for use only in conjunction with Intel component
+ * products. Use of the Software in conjunction with non-Intel component
+ * products is not licensed hereunder.
+ * 2. You may not copy, modify, rent, sell, distribute or transfer any part of the
+ * Software except as provided in this Agreement, and you agree to prevent
+ * unauthorized copying of the Software.
+ * 3. You may not reverse engineer, decompile, or disassemble the Software.
+ * 4. You may not sublicense the Software.
+ * 5. The Software may contain the software or other property of third party
+ * suppliers.
+ *
+ * OWNERSHIP OF SOFTWARE AND COPYRIGHTS. Title to all copies of the Software
+ * remains with Intel or its suppliers. The Software is copyrighted and protected
+ * by the laws of the United States and other countries, and international treaty
+ * provisions. You may not remove any copyright notices from the Software. Intel
+ * may make changes to the Software, or items referenced therein, at any time
+ * without notice, but is not obligated to support or update the Software. Except
+ * as otherwise expressly provided, Intel grants no express or implied right under
+ * Intel patents, copyrights, trademarks, or other intellectual property rights.
+ * You may transfer the Software only if a copy of this license accompanies the
+ * Software and the recipient agrees to be fully bound by these terms.
+ *
+ * EXCLUSION OF OTHER WARRANTIES EXCEPT AS PROVIDED ABOVE, THE SOFTWARE IS PROVIDED
+ * "AS IS" WITHOUT ANY EXPRESS OR IMPLIED WARRANTY OF ANY KIND INCLUDING
+ * WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, OR FITNESS FOR A PARTICULAR
+ * PURPOSE. Intel does not warrant or assume responsibility for the accuracy or
+ * completeness of any information, text, graphics, links or other items contained
+ * within the Software.
+ *
+ * LIMITATION OF LIABILITY. IN NO EVENT SHALL INTEL OR ITS SUPPLIERS BE LIABLE FOR
+ * ANY DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, LOST PROFITS, BUSINESS
+ * INTERRUPTION, OR LOST INFORMATION) ARISING OUT OF THE USE OF OR INABILITY TO
+ * USE THE SOFTWARE, EVEN IF INTEL HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGES. SOME JURISDICTIONS PROHIBIT EXCLUSION OR LIMITATION OF LIABILITY FOR
+ * IMPLIED WARRANTIES OR CONSEQUENTIAL OR INCIDENTAL DAMAGES, SO THE ABOVE
+ * LIMITATION MAY NOT APPLY TO YOU. YOU MAY ALSO HAVE OTHER LEGAL RIGHTS THAT VARY
+ * BETWEEN JURISDICTIONS.
+ *
+ * TERMINATION OF THIS AGREEMENT. Intel may terminate this Agreement at any time if
+ * you violate its terms. Upon termination, you will immediately destroy the
+ * Software.
+ *
+ * APPLICABLE LAWS. Claims arising under this Agreement shall be governed by the
+ * laws of California, excluding its principles of conflict of laws and the United
+ * Nations Convention on Contracts for the Sale of Goods. You may not export the
+ * Software in violation of applicable export laws and regulations. Intel is not
+ * obligated under any other agreements unless they are in writing and signed by
+ * an authorized representative
+ * of Intel.
+ *
+ * GOVERNMENT RESTRICTED RIGHTS. The Software is provided with "RESTRICTED RIGHTS."
+ * Use, duplication, or disclosure by the Government is subject to restrictions as
+ * set forth in FAR52.227-14 and DFAR252.227-7013 et seq. or their successors. Use
+ * of the Software by the Government constitutes acknowledgment of Intel's
+ * proprietary rights therein. Contractor or Manufacturer is Intel Corporation,
+ * 2200 Mission College Blvd., Santa Clara, CA 95052.
+ */
+#define IWI_FW_VERSION 3.0
+begin 644 ipw2200-sniffer.fw
+M```#`$`9``#0/P``G(0"``````!(```````?.!@`````_O\?`/[_'P#^_Q\`
+M_O\?`/[_'P#^_Q\`_O\?`/[_'P#^_Q\`_O\?`/[_'P#^_Q\`_O\?`/[_'P``
+M'S@5````4````!0&````@`\X`'X?$@(```D``0\X`/X?8`#^/V``_E]@`/Y_
+M8`#^GV``_K]@`/[?8`#^_V``_A]A`/X_80#^7V$`_G]A`/Z?80#^OV$`_M]A
+M`/[_80#^'V(`_C]B`/Y?8@#^?V(`_I]B`/Z_8@#^WV(`_O]B`/X?8P#^/V,`
+M?)]C-)<"`!!^CE,`?%]C[(X"`"#D/R@`_G]C`/[_'R`!`"`$?HY3$/Z?82`J
+M`"``&(Y3(`$`(`1^CE,4_I]A("<`(``8CE,@`0`@!'Z.4QC^GV$@)``@`!B.
+M4R`!`"`$?HY3'/Z?82`A`"``&(Y3(`$`(`1^CE,@_I]A(!X`(``8CE,@`0`@
+M!'Z.4R3^GV$@&P`@`!B.4R`!`"`$?HY3*/Z?82`8`"``&(Y3(`$`(`1^CE,L
+M_I]A(!4`(``8CE,@`0`@!'Z.4S#^GV$@$@`@`!B.4R`!`"`$?HY3-/Z?82`/
+M`"``&(Y3(`$`(`1^CE,X_I]A(`P`(``8CE,@`0`@!'Z.4SS^GV$@"0`@`!B.
+M4R`!`"`$?HY30/Z?82`&`"``&(Y3(`$`(`1^CE-$_I]A(`,`(``8CE,@`0`@
+M!'Z.4TC^GV$`&(Y31#0.$$`R#A`\,`X0."X.$#0L#A`P*@X0+"@.$"@F#A`D
+M)`X0("(.$!P@#A`8'@X0%!P.$!`:#A``&$Y!`#8%$""!#S@`&&Y#(!4`(!#^
+MGV&@$P`@%/Z?82`2`"`8_I]AH!``(!S^GV$@#P`@(/Z?8:`-`"`D_I]A(`P`
+M("C^GV&@"@`@+/Z?82`)`"`P_I]AH`<`(#3^GV$@!@`@./Z?8:`$`"`\_I]A
+M(`,`($#^GV&@`0`@1/Z?84C^GV%$`$X+0``N"SP`#@LX`.X*-`#."C``K@HL
+M`(X**`!N"B0`3@H@`"X*'``."A@`[@D4`,X)$`"N"02`[0L@@`\X"!AN`R"`
+M#S@`(``(((`/.`"``!(`_.]C____^P"!#S@`_.]K````!`"!#S@`_`]@````
+M!`#\[V/____[`($/.`"`[VL`@0\X`/P/8`````0`@0\X!#X.$``V#A``.&YC
+M&'Z.4Q`:#A`4'`X0`'P?8$,```F`\?\O`'R_80`1,```]?\O``#`80"`!@@`
+M?`!H``("`@"`!A``FJ91____?P'^ID$`_>97`*0``(O]_R<`?!]@P&L`@`!\
+M/V!#```)`.G_+X`\`"@`'`=@`.[_+Q``K@D4`,X)!(#M"R"`#S@8$&X+!#X.
+M$``V#A``.&YC*'Z.4Q`:#A`4'`X0&!X.$!P@#A`@(@X0)"0.$``<QU%2_E]B
+M@?X_8@!\OV$`$3```(`F"`#\`&@```@(`'P`:`````0`?`!@___[_P"`!A``
+MW?\O````8@!\'V`)`"`(`-;_+P``X&$`_"=H````@`!\'V`)`"`(`-3_+P"`
+M)@@$_@!@`'K@5X$``"`!_C]B`(`F"`#\`&@`"````(`&$!_^"&``>N!7@1(`
+M(`!ZZ5>!$0`@@/X(8`!ZX%>!`P`@`(`F"`3^`&``>N!7@0H`('_^*&(0_E]B
+M``H`(`"`)@@$_@!@`'K@5P('`"``G`A@`'K@5P$"`"``_`!H``@```"`!A"`
+M`0`@`/P`8/_W__\`@`80`*((0(!^(&H0_E]B``$`(/]_"4``#D`:'_X(8`!Z
+MX%<!`0`@`'KI5X+N_R<`@"8(`/P`8/_W__\`@`80`'P?8`D`(`@`GB=@@+?_
+M+P`@"&``O?\O$`"N"10`S@D8`.X)'``."B``+@HD`$X*!(#M"R"`#S@H$&X+
+M`?[_'P#__R<$/@X0`#8.$``X;F,0?HY3`'P_8`(`(`B`K?\O!(#M"R"`#S@0
+M$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A``?+]A!``P``"L_R\`P"8(^O\@8`""
+M!A2`K/\O$`"N"02`[0L@@`\X%!!N"P0^#A``-@X0`#AN8QA^CE,0&@X0%!P.
+M$```P&$`?+]A!``P``"C_R\`@"8(^_\@8`"<(&@`@@80`*/_+Q``K@D4`,X)
+M!(#M"R"`#S@8$&X+`'P?8`@`,``````(`(`/.`!\'V`````!@.7_)P```@!H
+M````!#X.$``=P"^``@`H`&K`+X![P"\`R,`O@*W`+P!'P"<$/@X0`!G`+P!\
+M'V``]@(`$'P`$`"(`@`4?``0Y(@"```#`"@`P,`O```?$.R.`@"@M,`O"/X?
+MF(`_P">`?A\09(@"``"`#S@`B`(`-`\`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````]P(`(`,`````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```'L`$`%0`%`!4`$`````!@$&)7H```!6X`:@)P*$$!$`Z0Q(8!8"A!R(L`
+M8!!!_F`100!J&4KP:H!*`6I`2@``0%`CH```FK#,L%*QHK$_LLBRY++XL@``
+M`&"I0$!0,:```)NP^[!`6D`:(54"8`#7*$%!4```_]<H00``_]<H2P``_]?$
+MABA%,`_(BZ</,`Y)L```.@XY#D!:P!HWL(R`#``A6P$>`&`)R00>`6`&R2$>
+M!&`#R2(0NH\(``T`%P`'S`;8(E$``");04IIH"RP3K/(L,BP4+-2LV&S<;/X
+MM/VTR+#(L(ZWR+#(L#:U.+4ZM<BPX;7AM>*U"K9-L\BP3;,1MCVV;[9[MIZV
+MR+"-M\BPUK:-MR!1)%.-`0!B`&8@51<`!,T@4213F+"I`0$`$;$&U/[<*]T%
+M:,$!(+`A42(?)LZDH$ZSR+#(L%"P4+!0L%"P-+!0L,BPR+`TL,BPR+!0L%"P
+M4+#(L%"P4+!0L,BP3;--LTVS4+!0L%"P4+!0L,BP4+#(L%"P4+!!L4!:@!HA
+M53>P+]6I4`$?`LBFMP!@4$`A42(?`L[8H,BP3K/(L,BP4+`TL%"P4+!0L%"P
+MR+#(L(ZWR+#(L%"P4+!0L,BP4+!0L%"P4+!-L\BP3;-0L%"P4+!0L#2PR+!0
+ML,BP4+!0L!;<1=W]@IB(_8($@_V"/X/]@@W</-VI4`BA(+"FMX5`````8$A`
+M!F!`0""P`&#$0"[=0%`#'PK(P5`A,P?(;X_$AH-@0HXH0<B+`&"I0$!0ST`'
+M8'9"=T)`0#`/```P#@U@*$%!4,2&*$'(B\]0`1\-R2!0(3,*R`!@SD`,8*5`
+M![0!9`!F`&#EA""P````8,1`J4`(8$!`,`]9#C`."F`H04%0Q(8H0<B+(+`#
+MLD?<(&I52V):(2$!:E5+!<B`6OQJ@$IPL2Y;(2'QR02#+ELA(>W)`&HM2I>X
+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
+M04"#4"A!`U`A,P7)AE``'P+)AD"&4"A!`&"&0(-`=D!W0"A!*$$H02A!*$$H
+M02U0*$%`4`4?`LD!``!@$&)TJ4`!<T%``71!0`%U04`!=D%``7=!0`%X04`!
+M>4%``7I!0`%[04`!?$%``7U!0`%^04`!?T$!``!@7$!=0%Y`*U`L0`$`K@$0
+M:E5+0`$!:E5+`0`9`!D`&0`9``$`&``8`!@`&``!````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````````````$D/
+MQ@])#\8.`&\`;`!J!0%?D"!J54L$;G!L`&H%`6:0`FI52[!N46P`:@4!;9`!
+M:E5+`&#-0&9@2T`@:E5+`&!A0`AJ54L88,]`0&#.0`!@[4`'8.Q``F#K0`%J
+M54L>8&Y``&!O0!I@HT``:E!++UOO&(`:+TL!8"A!`6`H05E@*$'18"A!`V`H
+M00EN`&`H09^0!&[0;$`!*$&CD`!@*$$H00!@$&(+H`AJ54L?ZFA@D&(7@H4!
+MR$#)0A`8(3<"R4!@(&"[L*H!%0#!0&E@D&(7@LM`S$(!9(%FXD?B1>11XU,8
+M`!@`\$*0L0%J54L(8&A5"&I52Q<`^<YH8)!B%X+(0,E"P4!L8)!B%X++0,Q"
+M`62!9N)'XD7D4>-3&``8`/!"&0!@&8(!"&!50<%0GQD5`,%`1V"08A>"Y$#E
+M0D)@D&(7@AD`&0#C0@%@@6(7@H4!&``8`.9"J`$9`!D`&0`9``,9X$`!'PS)
+M.&"08A>"YT#H0A9@D&(7@C\9Z4`CL3=@D&(7@N=`Z$(68)!B%X(8`!@`Z4(`
+M8`!DXU3I4!41$@#F0.M4$`"%`3\8`&"H`1@`A0$`$/J.Y%3E5A<``\\!:NI*
+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
+M%!P.$!`:#A``&$Y!`#8%$""!#S@`&&Y#(!4`(!#^GV&@$P`@%/Z?82`2`"`8
+M_I]AH!``(!S^GV$@#P`@(/Z?8:`-`"`D_I]A(`P`("C^GV&@"@`@+/Z?82`)
+M`"`P_I]AH`<`(#3^GV$@!@`@./Z?8:`$`"`\_I]A(`,`($#^GV&@`0`@1/Z?
+M84C^GV%$`$X+0``N"SP`#@LX`.X*-`#."C``K@HL`(X**`!N"B0`3@H@`"X*
+M'``."A@`[@D4`,X)$`"N"02`[0L@@`\X"!AN`ZA^CE,0/@X0@)$`*"`I.2@0
+M?HY3$'Z.0P"J`""H?HY3```.$`0"#A`(/@X0$'Z.4X#O+"@0?HY#"`#N"X#5
+M`"#___]_____?____W____]_____?____W____]_____?____W____]_____
+M?____W____]_____?____W____]_____?____W____]_____?ZA^CE,0/@X0
+M@'\`*"!P.2@0?HY3$'Z.0P"8`"#___]_____?____W____]_____?____W__
+M__]_____?____W____]_____?____W____]_____?____W____]_____?___
+M_W____]_____?ZA^CE,0/@X0`'(`*""E.2@0?HY3$'Z.0X"*`"#___]_____
+M?____W____]_____?____W____]_____?____W____]_____?____W____]_
+M____?____W____]_____?____W____]_____?ZA^CE,0/@X0@&0`*"`T.2@0
+M?HY3$'Z.0P!]`"#___]_____?____W____]_____?____W____]_____?___
+M_W____]_____?____W____]_____?____W____]_____?____W____]_____
+M?ZA^CE,0/@X0`%<`**#-."@0?HY3$'Z.0X!O`"`(.`T0_/\?8`!\/V!@!0``
+M!)!`"`!ZX5<$D&`(@0$`(`0$`!$@_?\G!`8`$0!\/V`DZ0(`!/X@0$@"#1``
+M?%]@``(``$P$#1``_I]@4`@-$`"$($`$_B!`_/\@8`0"#1``@`\X```?.&L!
+M`````!\X;P$`````'SAS`0`````?.'<!`````!\X>P$`````'SA_`0`````?
+M.(,!`````!\XAP$``````````````8"_'____W____]_____?P&`OQ____]_
+M____?____W\!@+\?____?____W____]_`8"_'____W____]_____?P&`OQ__
+M__]_____?____W\!@+\?____?____W____]_`8"_'____W____]_____?P&`
+MOQ____]_____?____W\&@+\?$``-"`!ZX%>!_O\G!("_'____W\,``T0!`!@
+M"!@`@`@!_F%`!`8`$`@`@`LP"`T0```N"`#ZX%<""0`@!`#N"P@`;@L,`$X+
+M$``N"Q0`#@L8`.X*'`#."B``K@HD`(X**`!N"BP`3@HP`"X*-``."C@`[@D\
+M`,X)0`"N"2"!#SA$?HY#!``."`*`'Q((`"X(`X(?$@P`C@\0`.X+%`"N"Q@`
+M;@L<`$X+(``N"R0`#@LH`.X*+`#."C``K@HT`(X*.`!N"CP`3@I``"X*1``.
+M"D@`[@E,`,X)4`"N"50`C@E8`&X)B``."`%^X*]<`$X)8``N"60`#@EH`.X(
+M;`#."'``K@AT`(X(>`!N"'P`3@B``"X(C``."!*`'Q*$``X((($..*A^CD,`
+M_.]C____^P"!#S@`_.]K````!`"!#S@`_`]@````!`#\[V/____[`($/.`"`
+M[VL`@0\X`/P/8`````0`@0\X((`/.``@``@@@`\X`(``$H`"#A"$``X0```-
+M"'@&#A``>N!7?`0.$"$*`"`!?@!````-$%08#A!8%@X07!0.$&`2#A!D$`X0
+M:`X.$&P,#A!P"@X0=`@.$`*@7PD#H#\)#'@.$`04#A`($@X0B'(.$(QV#A`@
+M@`\X%#H.$```#1`,`"T(5!@.$`#ZX%=8%@X0`0D`(%P4#A!@$@X09!`.$&@.
+M#A!L#`X0<`H.$'0(#A`"H%\)`Z`_"0QX#A`$%`X0"!(.$(AR#A",=@X0%#H.
+M$`BX`!`@@`\X"`"-"R"`#SBH?HY#!("_'____W\```T(`7H`4```#1`!#0`@
+M!``."`*`'Q((`"X(`X(?$@P`C@\0`.X+%`"N"U0`C@E8`&X)B``."`%^X*]<
+M`$X)8``N"60`#@EH`.X(;`#."'``K@AT`(X(>`!N"'P`3@B``"X(C``."!*`
+M'Q*$``X((($..*A^CD,,``T(`'K@5R@`30BA'``@`'KA5Q``C0@B`0`@``G@
+M5X(-`"`(`(`+!``."`*`'Q((`"X(`X(?$@P`C@\0`.X+%`"N"U0`C@E8`&X)
+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
+M"@(`(`""2!`$_A]@("4`(!(`1Q``_D@0$@)'$`!\/V#D]P(``(``"`%^`$``
+M@``0(`@'"```/P@,M@(``7X`0``08!@7!`<(`GY`@`"$````!@!``(1`0```
+M`1#Z_A]@H&,>*`":)F"`&0`@`OX?8!(`1Q``_D@00`0(""`()P@!>@!@`?X@
+M0`"08!@7!"<(H00`(`+^0(``?)]@?/<"````(@@`AB!```("$```GP@(M@(`
+M@`,`(`!\GV`8]P(````B"`"&($```@(0``"?"`2V`@``!"(``(8@0``$0D``
+M`@$0!P0G"`!\7V#@]P(``?Y@4```(0@`AB!```(!$`!\7V``^`(````A"`((
+M9P@`AB!```(!$!$$*`B`^N!G`@$`(``!X&>"`0`@%P0G"*"V_R\`G@=@H&7_
+M+P">!V``..LG`(`/.```/PA@W0(``(@@"`"#X&<"@`\X@'K@9P!\/V"@M0(`
+M`0(`(*>1'QBP@8`0(`(`(`C^`$"P_8`0YP\``/S_`$`@@`\X8(``$`0^#A"`
+M`.LO`(O^+Z`%\R\!_C]@`'R_84"\`@``"A\(%M\"``C]AA!8`@``)7[@IPC^
+M')"4?B!`&X4&"`3]!A``AY,#`('@5Q2#!A`+"``@&(7&"1F%!@@:A28((.OL
+M+P%^`$``'>=G`(X`&`("`"`!_A]@&(%&$"`&`"`9@T80``'@9QF#1A`"`@`@
+M@`,`(````%`8@480&8%&$"!#\2\```!0&WK@5PP!`"```@`H`!7K)Z`6[2\`
+M``!0@!/K)P0^#A"@X^HO````4``(/P@TO`(``/W@5R-"``!!E>\O!/X?8``!
+MX&<!#.LG`!3M+P5ZX%>%"NLG(`[M+P'^'V``?!]@```$`(#,^2^`!^LG!#X.
+M$`#<ZB^`$^TO`'R_80BT`@`IA28(`?X@0`]ZX(<I@T80A`/K)X!_!"@">N!7
+M`0+K)P!^!"@#>N!7@0#K)RF%!@@`@/Y7!O_J)R"G&2@"_A]@``0?""BT`@``
+M`>!G`00`(`S_!D`@A@PH??X_F`!\/V!4L@(``(``"`%^`$``@``0````4```
+M'Q`(M0(````?$`2U`@`@]>HG*8%&$`0^#A``R.HO``"@82";&2@"_A]@`'P?
+M8!2S`@"@>PPH??X_F/W^'V"@`AXH`)HF8`!\/V`DO@(`"($`"`"!(`B@_OHO
+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
+M`(9A4/S_#4`"_C]@H+45*``$05#]A0T(```?$&R8`@`@31,H`OX?8`!U_2<$
+M/@X0`#8.$``X;F,4?HY3$!H.$``K`"@!>N!7@@D`(`!\OV'0Q0(``($&"`%^
+M($``@P80`'P?8`T!````"18H`($&"`IZX%<%!@`@`'P?8`T!``#`_C]`@`46
+M*`!\'V`````$`(W[+P`"`"````!0`'R_8=#%`@``@080$`"N"02`[0L@@`\X
+M%!!N"P0^#A``-@X0`#AN8R1^CE,0&@X0%!P.$!@>#A`<(`X0("(.$````&(`
+M@B!B``3A80":IE$`^N=7C`8`((`4`"@!>N!7@@(`(`!\WV'0Q0(`!`$'"`%^
+M`$`$`0<0`"`(8("D'B@!_J9!`)OG5XGY_R<`?-]AT,4"``0!!P@`@>A7#0<`
+M(`!\'V`-`0```'P_8+L!``"`[!4H!`$G"`!\'V`-`0``@.H5*`!\'V`````$
+M`'+[+P'^'V```0`@````4`0!!Q`0`*X)%`#."1@`[@D<``X*(``N"@2`[0L@
+M@`\X)!!N"P0^#A``-@X0`#AN8QA^CE,0&@X0`'P?8`P`(`B`<N,O``"@80!\
+M'V``$3``_($-%`#\1F````$``_XF8/S!#0@````(`'P`8`````$`>N%7`@(`
+M(`#ZX%<"`0`@`'K@5P$#`"`!>N%7@@L`(`'ZX%>""@`@`'K@5X()`"``?!]@
+M#0$``&W^/V"`T14H_,$-"```(`@`?!]@#0$```#/%2@`?!]@#0$```":)F``
+MS14H`'P?8`T!``!P_C]@`,L5*`'^'V"````@````4!``K@D$@.T+((`/.!@0
+M;@L$/@X0((CB+R#^GV$!_A]@(%D**/S_+4#\@0T(``'@9P":IE$!$0`@`_X?
+M8/C_+4`@HPHH]/]-0`!\/V#LO@(``($`"``!X&<"`P`@`+X/8`!\7V!HT0(`
+M(#(;**+^/V"`__\G](&M"?]_`$``F^9G`($`$`$'`"````!0!(`&$`B`!A#X
+M@0T(`'W@5P`"```.`P`@`+X/8`!\7V!HT0(`("D;**S^/V"`__\G`("&$`":
+M!F`@L>(G(/Z?800^#A"@;>(O```@8````%``_H`0!(``$"#("2@,@``(`'P_
+M8.R^`@``@0`(`7X`0`"!`!"@/@TH`?X?8("3XB<``!\([+T"``9ZX%<&@`\X
+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
+M#?X?8`R`0!`$_A]@#H"`$/2!#0B@`@`@`1Q`$`!\/V`G`0``()$:*`"^#V``
+M?#]@!MX"``"$``@``>!G`@\`((`E^R\">N!7@04`(``D^R\#>N!7`00`(`!!
+M["\!>N!7@0(`((!;_2\`>N!7]($M"(P$`""````@]($M"`!\7V#\]P(````!
+M"`%^`$````$0H`,`(`/^'V``?%]@]/<"`````0@!?@!````!$`'^'V"@!``@
+M`H!`$`":0!``?#]@^/<"``"```@!?@!``(``$/2!#0@"?D`0A?X?8""I%"BC
+M_C]`^($-"/R!+0@@IO$O#'X`0""FX2<D_I]A!#X.$*!WX2\T_I]A```@8@`@
+M"%(@\?0O_Z%-$``.0!H`?/]A/-T"``"`!P@,`,`)(#7O+P`<!V```!\(`-<"
+M``+ZZ%<8?J!!@@4`(`!\/V+4K0(``81("`"B"&``FB9@(.(4*`)^04`!A`@(
+M`GX`0"`#`"``#F`:````4`":)F`@WA0H`OY?8`+^?V(`)>EG`'P_8J#=`@`!
+M"@`@`'R?8BBN`@`"_A]@`"@J8`":24"@GQXH__]M0/^%#0@`)@!```Y`&@`H
+M"F``&BE`H(@>*/__34#_A0T(`"0`0``.0!H`@`@((`8`(`'^/V``?#]@.*X"
+M`````%``FDE`()8>*/__;4#_A0T(`((@4``F`$``#D`:`(`("``.[R\`?#]B
+M&+`"``&$2`@`!>%G`00`(`"B"&``&BE`(,<4*`)^04`!A`@(`GX`0``D`$``
+M#D`:'``'""(DAQ`L($`0`(`'""!@`"@!_C]@$00'")]^`&`!>N!7`0(`((/^
+M'V"@=10H@_X_0(`"`"``?#]@")8"``"```@!?@!``(``$*!NX2<T_I]A!#X.
+M$(`SX2\`@J!AH#OU+P`$P6$`?%]@6*T"``";YF<`'"=`@@(`($#^'V`@`$$0
+M!?P``"2Q`@```@`@"?X?8"``01`%_```(+$"`!\$(0C[_R!@(!@(*!\"01"`
+M4N$G!#X.$"`YX2\!_A]@(.3W+P`<QU$@^?@O````4`!\GV)8K0(`(`1J"@!\
+M/V"S`0``H%X4*(+^'V````!0`'Q?8M2Q`@``?!]BI-T"``!\_V&>W0(`H`(`
+M("`!21`@!0D(`7X@0`".`!@@`TD0-GK@5PH=`"``(`!`!`0@"`"#X&<!&P`@
+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
+MD((&$"@`+0@!_B!`*`(-$```H!\@[P$H`)H&8``!X&>"\.`O@```(```H!]P
+M@`8(``'@9X$!`"`@VP(H6/X&0(```"!8G`80`*`?"``!`$@``0!(``$`2``!
+M`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_``"@'P!QWR<$/@X0@$+?
+M+P``H&$$`@`0````4`B`!A`0@`80%(`&$`R`!A``H!\(``$`2``!`$@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'____W]L`"T(`(/@9P#\!A!.
+M1%9$`0,`(!R`0`@<F@`0&!H!$!R$!A`@`@`@&((&$&P:#1`8F@80')H&$'``
+M+0@!_B!`<`(-$```H!\@6]\G````4`0^#A"`.M\O``"@80""`&(`!"%B`(9!
+M8@`(XF$`H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@
+M`("@'____W\"^NAG"(`F""$"`"``H$!@``7H5X("`"```0`@``7A9P$!`"`@
+M`0`@`!S'40?^WV$`'>=G`@,`(`'ZZ&<``@D0@1<`(`"@('"@%@`@"((&$`"?
+MYV>!%``@#`#-"71\!Q!P00``A"`'$(PB!Q"()`<0>!H'$!"`)@@`@^!G@00`
+M('P"!Q"`@"`(@`('$!"`)@B`@"`(?)P`$!"`)@@@`@`@@)P`$!"<!A!\'`<0
+M@!P'$!2`)@@!_B!`%((&$`?^/V`\`@<0`?X_8$0"!Q`H`"T(6!X'$`'^($`H
+M`@T0``"@'__[YU="?0(H6'X'0*#\`2@`'`=@H`$`()``QPD'_M]A``"@'R`U
+MWR<`'`=@````4&P`#1`@@`\X<``-$`0^#A"`$M\O``"`8@""H&$`!,%A`*`?
+M"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_
+M"``J"`)ZYV<"FB!@0AL`(`@""A`0`.H)`)K`:0"?YV<4``H*(5\`(`@<"A`!
+M>NA7@A<`((R`)PB$@$<(`OK@9R$"`"``'"%@``/A5X("`"```0`@`(/@9P$!
+M`"`@`0`@`((@4`?^/V``@^!G`@\`((B`)P@`G``0C(`G"`'ZX&>!`0`@A(`G
+M"``")W`(`@H0`)JF41`:"A`4&@H0*``M"'2:!Q`!_B!`*`(-$```H!]P@`<(
+M``'@9X$!`""@<`(H6/X'0(```"!8F@<0D)H'$*!]`2@`G@=@``'@9P%'`""`
+M?N`O`$8`(```H!\`10`@`*(H4A`B"A``IFE2*``M"``D25(!_B!`*`(-$`">
+MIV$``*`?`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@
+M8`"`H!____]_#``J"`"#X&<!!``@#"(*$`@`*@@`G^=G`)S`:2$;`"`4``H*
+M(`$`(`">1V``FD9@C`!A"(0`(0@"^N%G(0(`(`"<@&``B>!7@@(`(``!`"``
+M">)G`0$`("`!`"``@B!0!_X_8`"#X&=\`*$)`A``((@`(0@!^N%G`)P`$`$"
+M`""$`"$("`!J"`""(7`(`@H0?``A"``#X5>A`P`@`9[G40`?X5>``&$(`8+@
+M88"&`!!\`"$(?((!$!0`*@C__R!`%`(*$`"GZ6>0(@$0H@(`('0B`1!\(@$0
+M``1!8B`"`"``!&%B?`0)$'PB`1``!$%B_WL(0H+:_R<0'@H0``"@'X`*`"`@
+M/P(H6/X)0`"@'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^
+M(&``@*`?____?R@`+0@!_B!`*`(-$```H!^@10$H`*8)8`":9F(`I^EG`0,`
+M('"`"0@``>!G?("I"8+R_R<@\_\G6*()$`"@'P@``0!(``$`2``!`$@``0!(
+M``$`2``!`$@``0!(``$`2`1^(&``@*`?____?R@`+0C__R!`*`(-$```H!\0
+M``T(#``M"`"!X%>!`0`@```-"``!X&<!N?\GH,C>)P```%``(>AG`;C_)PP`
+M*@@!_B!`H+;_)PP""A`$/@X0`(_>+X"Z`"@`-0(H`&@`*``+`"@`B_\O`"+_
+M+X`C_R\`N-XG!#X.$(",WB\```T(`'R_8?#P\/``?>!7\?#P\($!`""@"-\O
+M`!H-$(#U_R\`&@T0(.L>*`0`#0@```!0H"K?+P``#1``L-XG````4&0`#1`@
+M@`\X:``-$`0^#A"`AMXO>`#@"0``H&$`H!\(``$`2``!`$@``0!(``$`2``!
+M`$@``0!(``$`2``!`$@$?B!@`("@'____W]T@"8(`(/@9P*?YV<!&@`@`(`G
+M"`#]X%=!3453`A@`('R`)@@`',=1`(/F5W2<!A!!`P`@#)P'$`R"!Q"`@$8(
+M@(0`$'R`)@A\`@$0$(`G"/__($`0@@<0/(`F"`;ZX%>"!0`@#?X_8)""!A`H
+M`"T(`?X@0"@"#1```*`?(`D!*`":!F```>!G@@K@+X```"```*`?<(`&"``!
+MX&>!`0`@(/4!*%C^!D"````@6)P&$`"@'P@``0!(``$`2``!`$@``0!(``$`
+M2``!`$@``0!(``$`2`1^(&``@*`?____?P``H!\`B]XG!#X.$(!<WB\``*!A
+M!`(`$`@$`!````!0#(`&$!"`!A``H!\(``$`2``!`$@``0!(``$`2``!`$@`
+M`0!(``$`2``!`$@$?B!@`("@'____W]<`"T(`(/@9P#\!A!!3453`0,`(!B`
+M0`@8F@`0%!H!$!B$!A`@`@`@%((&$%P:#1`4F@80&)H&$&``+0@!_B!`8`(-
+M$```H!^@==XG````4`0^#A"`3=XO``#`80""X&$`H!\(``$`2``!`$@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'____W\(`"<(`(/@9P$"`"#_
+M_R!`"`('$"`5`"``FJ91`)_G9P$3`"`,`*T)=/P&$#Q#``!XG`80#``G"`"#
+MX&>!!``@?((&$("`(`B`@@80#``G"("`(`A\F@`0#``G""`"`""`F@`0#!H'
+M$'R:!A"`F@80$``G"`'^($`0`@<0!OX_8#R"!A`!_C]@1((&$"@`+0A8G@80
+M`?X@0"@"#1```*`?__OG5T*A`2A8_@9`H"`!*`":!F"@`0`@D("F"0W^OV$`
+M`*`?(%;>)P":!F````!07``-$""`#SA@``T0!#X.$``JWB\``,!A`*`?"``!
+M`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_#`"G
+M"0";YF<`GN=1`0\`('R`)@@`@^9700,`(`P>!Q`,`@<0@(!&"("$`!!\@"8(
+M?`(!$!``)PC__R!`$`('$"@`+0ATG@80`?X@0"@"#1```*`?<(`&"``!X&>!
+M`0`@(*$!*%C^!D"````@6)X&$)">!A`@K@`H`)H&8``!X&>"K]\O``(`(`@`
+M)P@!_B!`"`('$```H!^@.-XG````4`0^#A"`"=XO``"@830"`!!0!``05`8`
+M$`""(%`(`@`0#`@`$!0*`!`!_@)0``@`0!"`!A`??D-@'_X#8$B`!A`0@`T(
+M.(0&$!B`!A`<@`80!((&$`/^'V`\@`800((&$$2"!A!@_`80_D8``&2:!A!P
+M@@807((&$'2"!A!X@@80?((&$(""!A`!A!^`3(`&$"B"!A`L@@80,((&$`!\
+M/V#<10``H'O?+P":!F``H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`
+M2``!`$@$?B!@`("@'____W\4`"T(`(/@9P#\!A!$4DA4`0,`()B`0`B8F@`0
+ME!H!$)B$!A`@`@`@E((&$!0:#1"4F@80F)H&$!@`+0@!_B!`&`(-$"@`+0@!
+M_B!`*`(-$```H!\4@`T(``'@9X$"`"`@@0`H`)H&8``!X&>"@M\O``@`(`"@
+M'P@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____
+M?R@`+0C__R!`*`(-$```H!^@`]XG````4""`#S@,``T(``B"4`P(#1`0"`T0
+M'`@-$"`(#1`@_A]@)``-$`!\'V!@U`(``'Y`$`%^8$`@`@`@`?Y?8`""01`!
+M_F%``7Y!0`!]X5<``0``!@0`(`""(%``!`%@`7K@9P+[_R<`!``8`?X@0*#]
+M_R<`CB`8`'P_8&#5`@`@`@`@````4`"(`!`$_B!``7X`0"!ZX%>%_?\G%`@-
+M$!@(#1`@@`\X*`@-$`0^#A"`QMTO``#@80""H&$`!,%A`*`?"``!`$@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_.(`G"`"#YE<-
+M%@`@`(/F5X($`"`"_B"``/P@`&#5`@``@^=7`@(`($R`)P@@`$T(``(A<"`"
+M#1!(@"<(``('$!``+0@`@^=72)H'$((,`"`X@"<()`!-"`"%X%<-A>97#@H`
+M(`)^(8``_"``8-4"`!`"#1```*`?*``-"``!X&<!2]\O`*`?"``!`$@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@``0!(!'X@8`"`H!____]_(`$`(`":IE$8
+M_K]A``"@'Z#.W2<`F@9@!#X.$("DW2\``.!A`(+`82#ZX%<`!*%AQCH`(`_^
+MOV$`H!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@
+M'____W\X@$<(`(0&$#R`)P@`@^!G@0,`(#B<!Q!(G`<0`9P_@$R"!Q```*`?
+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
+M`(/@9X(,`"`<@"8(&((&$"@`+0@`@^!G`GP_8`$```!""0`@&((&$""`9@@`
+MA^97`0<`($B`)@@X@$8(``/A5P(%`"`"?B&``'Q?8&#5`@``A(!!)``M"``&
+M!A`"_B"``(0@``'^WV$0`@T0``"@'Z#.W"<`'`=@!#X.$`"CW"\``*!A/```
+M"`1ZX%>""0`@`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@``0!(
+M!'X@8`"`H!____]_*``M"`'^($`H`@T0``"@'Z`T_R\`F@9@@,'<)P"@'P@`
+M`0!(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____?W2`
+MQ@D``*`?`!WG9X&YW"<@`@<X`)H&8`"XW"<$/@X0@(K<+P``H&$`H!\(``$`
+M2``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'____W\`@$8(
+M``7A9P$0`"`8@"8(`(/@9X(.`"`@>N%7'_X_8`Y\(5`!`````OY`@$``+0@`
+MA$!`/``M"``#X5<%`@`@``(A4/S_0&`X`"T(`(1`0```(0@`@^!G`00`(!""
+M!A`4@"`(%((&$!":`!```"$(%)H`$*`"`"`8A`80$)H&$!2:!A`8A`80`!H!
+M$```H!\@G=PG````4`0^#A``<-PO``"@80"@'P@``0!(``$`2``!`$@``0!(
+M``$`2``!`$@``0!(``$`2`1^(&``@*`?____?QB`)@@`@^!G@00`(!"`1@@`
+MA>97@@0`(`"`8`@`A^97``1!4((``"``A``0&(0&$```H!\@CMPG````4!2`
+M)@@4`@$0$(!F"!"&`!`8@"8(`(!`"`"%YE>"`0`@&((!$!"`1@@`A``0(/C_
+M)P`$05`$/@X0H%K<+P""(%`(?HY3`)JF42P:#1`P&@T0-!H-$$0:#1``?%]@
+MX-4"`"`"`"``!`%@`!H`$`1^`$`!_B!`(/K@5X7]_R<X!`T00`0-$(!^`4`\
+M``T0`'P?8&#6`@``?#]@.*<"``!\7V"S1P``2`"-"$P`K0A0`,T($!H.$!0:
+M#A``?']@34E402`__B\`#.-@5!H-$%@:#1`(?HY#@'+<)P0^#A`@6-PO./Z?
+M80!]X%=-251!H0$`(`">YU$@?]PG./Z?80":IE'XFPT0_/]-0OC_S4$#_C]B
+M(`4`(`'^'V(,`"T(/*(`$$2@`!`H`"T(`?X@0"@"#1```*`?(##_+PP`#0@`
+MH!\(``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2``!`$@$?B!@`("@'___
+M_W]``$T(```A"`"#X&?\@PT0@0``(!BD`!``&@$00``M"`3^0$`\`"T(``/A
+M5T`$#1`"`0`@.``M"$`"#1`@&``@1!H-$!"`*0@`@^E7000`(/R;#1`4@$D(
+M%(0`$!"`*0@0`@$0&*0`$!"`*0C\@PT0`(`I""#ZX%<.`@`@(/X@4`"""1"@
+M`P`@`"B*4@2`*0@(@(D*`(/@9P"""1`A`@`@#(#I"1B<"1`@`0`@$*8)$!B:
+M"1```*`?`"GJ9R(""C@"G@=@`*`?"``!`$@``0!(``$`2``!`$@``0!(``$`
+M2``!`$@``0!(!'X@8`"`H!____]_&(`I"``#YU>!"@`@``"@'P"@'P@``0!(
+M``$`2``!`$@``0!(``$`2``!`$@``0!(``$`2`1^(&``@*`?____?_R!;0H`
+MI^EG@N#_)T0`+0@`@^!G`<S_)P``H!^`S_\G`(`I""#ZX%<-?#]@'P````[\
+M(%`!`````OY`@$``+0@``D%`/``M"``#X5<%`@`@``(A4/S_0&`X`"T(``)!
+M0```(0@`@^!G`00`(!"""1`4@"`(%(()$!"F`!```"$(%*8`$*#H_R<8A`D0
+M$*8)$!2F"1`8A`D0(.;_)P`F`1`$/@X0(`O<+S3^GV&@Q=PO7/Z?FC#^7X+0
+M``D*``#`81!^"$``?`!@_P\```!\H&D`<`(``(#F"0#^!A`@?@A``'P`8/\/
+M````?&!J`'`"``"`*0H`_@D0````4*"^!BC\_RU`_($-"``!X&<!_?\GT``)
+M"``;X%<")^!7`B'@5P$#`"``O@]@`'Q?8'C'`@"@G!0H#WXJ0(#__R<`)^!7
+M`)X&$((%`"``G^=G`@,`(`"^#V``?%]@>,<"`""7%"@7?BI`@/__)P#\!V@`
+M```0`(`&$`"B"1`@I`8H````4*"MW"\`'`=@H!C<)S3^GV$$/@X0(.W;+S3^
+MGV$`?']B(T(``#S^GYH`@Z!A`'P?8C2\`@"B!0`@``#@80`("`@`?>!7($(`
+M``(#`"``O@]@`'Q?8'3(`@"@AQ0H//X_F(#__R=C_A]@H`\/*`">)V``'A\0
+MI)@"``">!V``FB9@(.GQ+___34```>!G`0,`(`"^#V``?%]@=,@"`"!_%"@&
+M?BI`@/__)_^%+0@`?!]@E)D"``/^0(``!,!!(`4/*&/^'V``"`@(`"?@5X('
+M`"``?!]@*,@"``+^/V`@H@XH``1!4`4$)P@#^N!7`'P?8```(`")`0`@&'P`
+M%"(R`````0`@&'P`%`(R````F^9G`7P?8"S(`@`!!$%009H.*`+^/V``G@=@
+MH'@`*`":)F"@)OPO`?X?8`!\7V*DO`(``$4)"``!X&<!`P`@`+X/8`!\7V!T
+MR`(`H&<4*"I^*D"`__\G`?X?8``!210'!"<((+X8*`":!F`#!`<(``@H"(!^
+M`&@/`4D0`00'"`D!21``!`<(!P%)$`"GX%<`HBA2(@,`(`($!PB`?@!H"P%)
+M$(#^'V"@`0`@#0%)$`L!21`-(TD0!'\)0!#^/V`@A`XH``1!4`[ZYU<"`@`@
+M`)OF9P$!`"``./8O@`$`(``$'PA)WP(`@+WX+P`("`@`)^!7`@8`(`4$!P@)
+M>N!7@00`(`!\7V`@R`(``WZ`@!Q^84`(_A]@`_X_8`"(84"@G@XH``B"4*`/
+MXB\&!`<(``@("#`?21``)^!7`?WF5P(````!_>=7"P````%\'V`TR`(``01!
+M4$%Q#B@(_C]@`%$**`()"0@``)\0*K$"``1^`(```)\0++$"`"!]%R@(_A^`
+M`)OF9P%\'V`PR`(``01!4,%I#B@"_C]@`&#D+P!%"0@!>N!7`0,`(`"^#V``
+M?%]@=,@"`"`Z%"B:?BI`@/__)P`C210@\OLO````4&/^'V"@P`XH`)XG8&/^
+M'V`@OPXH`!PG8""[VR<T_I]A!#X.$("'VR\``*!A`((@8@`$X6$`AL%A(+#=
+M+P`(`F(">N!7`1``(``$"`@``>!G`(@G"($%`"````<(````0`2`"```@`!0
+M`!H@0`"0`!@`@H<0H&O=+PK^/V`@`@`@`!#@&0":`$``@(<0`)KF80``!P@`
+M``!``(`(0``:@!````<(`7X`0*#0W"\*_C]@`(/@9P`"!Q`"`0`@`?X?8```
+M2!``GJ=AH)C;)P":!F`$/@X0`#8.$``X;F,8?HY3$!H.$!0<#A```*!A`/P`
+M8/\_````$,`9`/P&8/\_````$*`9$/X&@`!\/V`B`"`(@#/<+P#\!D``@```
+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
+M@`C7+P``H&$""``(`"1)4@1^`$``$``:```?"`3W`@"@(P(H`!``&```P&$<
+M@`8(`*(H4A$$0`@!_O]A!'KA9P!\?V)8K0(`((0)"`*>YU&`>N!G`?X_8`&"
+M(%`(>N%G@'ZA84("`"`!_C]B`GKA9P)\/V("`````*/H9X$!`""@+0(H`!P'
+M8``00!H`H^AG@08`(`)ZZ5<,`0`@!7KI5X($`"``)>EG@0(`(`"?YV>"`0`@
+M0H0)"`1ZX%<!`0`@(`$`(`'^7V``!$%0``XI&*#S`2@`H@A@``"`8``@"&``
+M'"=@(``"*`">1V``""!``'P?8M2R`@```0@(``(`0`";YF<``0@0@00`(``<
+M!V"@&P(H`((@4``.`!B@Y0$H`)XG8``!*`@``@!```$($`"2V2\``!\0^)@"
+M`(`#UR<$/@X0@-C6+P``P&$`"A\(*K$"```0X!D`!!\(!-<"```!X&<`(`A2
+M@0@`((!9ZB\`"#\(#K$"``%ZX%<`@B!`@@$`(`7\```@L0(```4`(`7\```D
+ML0(``!!`&``('PBFNP(```0`0"`"`"``$.`9``H?"!2Q`@``$$`8`'R_85BM
+M`@!#A"8(`(/@9X(+`"``G@=`!'P``!29`@``#B<8``X`&"`<`"@`!$%0``8`
+M(`)^)Y`@`P`@=(0?4``$`4``?`!`?,@"`"8(``@"?B>0``X`&`".(!B@!P`H
+M``1!4````&*@`@`@0X0F"`'ZX%>!]_\G`OK@5P'X_R<`@^!G<'X(4(+?UB<`
+M"#\(?+0"`"#>UB<``@!0!#X.$*"KUB]`?F!@!OZ!D"!^8&`%_F&0`(AA0`3^
+M88`??H!@``("&``(`$``!@!```7A9P``8&"!```@``"!$$W^`$``@>%7C`,`
+M(`!\7V"`QP(``'P_8,<#```@6`\H`+X/8(#__R<@S-8G``8`4!]^8&``@H$8
+M``:B0$!^8&`&_F&0`8:?4``&?P@2O0(`('X`8`""81@/_F%``(CAIP#R8E`%
+M?@"0%'[@IP`*'P@2WP(``(:<0``"8!@`"A\(%-\"```"`!@`!@!```@`0``%
+MX6<`#&`8@0``(```@1``!!\("+0"```"`$`@@`\X``8`4`0^#A"@C]8O`OX?
+M8`!\OV$LW@(``(!&"`""(%"`_G]`(-$4*``(@E`$@$8(`_X?8`""(%"`_G]`
+M(,X4*``(@E"`L]8G_Y$_&``"@!`"`H`0((`/.`0"@!``?']@$``@`*`"`"``
+M!$%0``0A0`0"(``!?D%``(*!%`!]X5<``0``!H`/.`#\_R<$/@X0@(/6+P``
+MP&$`?/]A$``@`*`+`"``FJ91`)HF0`#(!P@``B=``("`$/___W____]_____
+M?____W____]_____?____W____]_____?____W____]_____?____W____]_
+M____?____W____]_`?ZF00#]YE<``0``!IW6)P#S_R<$/@X0H&O6+P`(@E``
+M`P`@`GX"@`!\`$`LW@(`H.7_+P@```@!?H)`('KB5X:3UB>`^_\G!#X.$`!O
+MUB]#_O^!`'P?8BS>`@```,!AH`,`(`+^OV$"_B:``(1`0*#C_R\```$0"`#'
+M"0'^ID$`'>=G`08`("+ZYE<&!0`@#``'"``!X&<`($A@`OG_)P"^#V``?%]@
+M)-$"`*`0#R@4_B=`@/__)P``WPF@X`(```,`(`+^)H``A$!`(-C_+P```1`(
+M`,<)`?ZF00`=YV<!!@`@(OKF5P8%`"`,``<(``'@9P`@2&`"^?\G`+X/8`!\
+M7V`DT0(`(`4/*"'^)T"`__\G`,(!**`#`"```,!A`OXF@`"$0$"@S/\O```!
+M$`@`QPD!_J9!(OKF5P8)`"``'>=G`"!(8($$`"`,``<(``'@9P+Y_R<`O@]@
+M`'Q?8"31`@"@^0XH+_XG0(#__R<`O@]@`'Q?8"31`@"@]@XH+OXG0(#__R<B
+M^N97`6[6)P"^#V``?%]@)-$"`*#R#B@V_B=`@/__)P0^#A"`0-8O``"_":3@
+M`@``F^9G__[_00(#`"``O@]@`'Q?8"31`@`@[`XH!_XG0(#__R<,@`8(``'@
+M9P(#`"``O@]@`'Q?8"31`@"@YPXH"/XG0(#__R<`?-]A+-X"````!Q`"_A]@
+M`((@4(#^7T"@H0TH!?Y_8`R`!@@`@B!0`'\`4`0`!Q`#_A]@@/Y?0*"=#2@%
+M_G]@"(`&"``!X&>"5=8G`+X/8`!\7V`DT0(`(-L.*!7^)T"`__\G!#X.$(`F
+MUB\``,!A`(/@9P&^#V!!,@\H]/X_0`!\OV&<X`(``(0&"")ZX%>+`P`@`'Q?
+M8"31`@``?#]@ZP$``*#1#B@`O@]@@/__)P,$1P@`!>%G`7Q?0(`````"?@"`
+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
+M``P```2```@`!``4`(`/.`1^`(``?`!`G,8"``@```@````(((`/.`"``!``
+M?!]@!``@``"`#S@`?!]@!``@``"`#S@$?@"``'P`0)S&`@`$```(`$``"`%^
+M`&`@@`\X`(``$`1^`(``?$!`G,8"``0`(0@`P``(`GK@9P*`#S@,``$(`'P`
+M:``"````@``4`(`/.`0^#A"@)]4O'/Z?82#QU2\``,!A``"@80`<!V"@8_TO
+M_/\M0`1^!X``?%]@G,8"```$($``!$``_($-"````1`,@``(`'Q`:``!```$
+M@``(``0`%*#JU2\`F@9@H%C5)QS^GV$$/@X0@!K5+P`!P&$B`P`@`(*@80""
+M`2B````@`'`!*"`"`"``@`80`7KG5X']_R<`@`8(``'@9P$^U2<$?@>``'P@
+M0)S&`@`,@``(`'Q`:``0```$@``(``0`%(`YU2<$/@X0@`G5+P!MXR\%!"`(
+M!`0`"`C^((```@!H`'P_8#2]`@``?>!7)$(``*(QU2<`@8`0`/V`$"-"``"`
+M+]4G!#X.$(`!U2\`9>,OY`0@".4$``@``E\0E>`"``]^`&```%\0E.`"```J
+MU2<$/@X0@`/5+P``H&$`@N!AH%[C+P`$P6$``>!G@@,`(`!\7V#LT`(``'P_
+M8$$*```@K@TH`+X/8(#__R<"&B```!H`0`$$8`@`?%]@.+T"``"*`1C0`X$0
+MT@=!$`"#X&<!`>!G`8(@4`$``%``@H<0H![5)P``1Q```&!@`'P`0-2R`@!0
+M!4`(`GKA5P&"0&`!_A]@H`H`(`"&(6`$/@X0H.C4+P``8&``@L!@``2A8`'Z
+MX6<```!0(0(`(``(@E``!0`HH`$`(```@&`"^N%G`0(`(`'^'V``#"-@H`$`
+M*`"*0F`@#=4G``@`0`""($``_"!`U+("``%ZX%=!`0`@+(D`"!2)``A@?N&G
+M((`/.`"`'$``@F!`!/QA`+2U`@`"^N!7#`$`(`7ZX%>"`P`@`_XA@`"`X*<0
+M_CR(8'[AIV#^'$`@@`\X``(`0````$`$?@!```;@IP+^'(`$?@!`$'X`B""`
+M#S@4?@!`!#X.$*#.U"\``"!@H`$`(````%`!?@!```X`&`QZX%>*`@`@`GQ`
+M`,RU`@``A>!7`?;4)X#[_R<`?#]@C0$``*#9#2@`O@]@(//4)PS^'V```>!G
+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
+M&/<"``````@`!$!``'P?8'SW`@`````(``2@002!``@`@`90`'W@5P`"```%
+M`P`@`'P_8`"0`0``?!]@A.`"```"`!``+``@`'W@5P`!```%`P`@`'P_8``@
+M`P``?!]@A.`"```"`!"`)P`@0'K@5P4#`"``?#]@`+`$``!\'V"$X`(```(`
+M$(`C`"`0>N!7!0,`(`!\/V``0`8``'P?8(3@`@```@`0@!\`(`!ZX%>!`@`@
+M,OX_F`!\'V"$X`(```(`$``<`"``?%]@`$`?``!\'V"$X`(```0`$`"%``@#
+M>N!7@A$`(`1ZX%>-`P`@@`4`("#^'V``1?\O@`@`(!#^'V"`0_\O``<`(`"^
+M#V``?#]@(P$``(!B#"B`!``@`GZ`@0!\A@&$9@$````&.)59``"260``E5D`
+M`))9``"F60```?X?8``+`"`@_A]@`!W_+P`)`"`0_A]@@!O_+X`'`"``O@]@
+MI?X_0`!8#"B`!0`@!'K@5PW]_R<"?H"!`'R&`>!F`0````8XJUD``*A9``"K
+M60``J%D``+U9``````!0@'8`*`!\/V`<O`(`!)L`$/R!30@(A0`0$`"N"02`
+M[0L@@`\X&!!N"P0^#A``-@X0`#AN8Q!^CE,`?!]@'+P"```%``@!>N!7`0,`
+M($#^'V"`"/\O`((@4`!\'V">W0(```)`$`2`[0L@@`\X$!!N"P0^#A``-@X0
+M`#AN8Q!^CE,`?!]@'+P"```%``@!>N!7`0,`($#^'V"`'/\O`?X_8`!\'V">
+MW0(```)`$`2`[0L@@`\X$!!N"P0^#A``-@X0`#AN8Q!^CE.`B>$O2@0`"`!\
+M/V`<O`(``(%`$`1ZX%>!$@`@!'K@5XT#`"``!0`@(/X?8`#T_B\`"``@$/X?
+M8(#R_B^`!@`@`+X/8*7^/T``+PPH@`0`(`)^@($`?(8!(&@!````!CC]60``
+M^ED``/U9``#Z60``#5H``"#^'V"`ZOXO`'P_8!R\`@``A0`(`7K@5P$#`"!`
+M_A]@`.?^+P""(%``?!]@GMT"```"0!````!0`$@`*`!\/V``D`$``'P?8(C@
+M`@```@`0`'P_8`!`'P``?!]@A.`"```"`!``?#]@`#`J``!\'V"0X`(```(`
+M$`!\/V``L`0``'P?8(S@`@```@`0!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC
+M''Z.4Q`:#A`4'`X0`'S?883@`@````<(`'W@5P!`'P"""P`@`'R_81R\`@``
+MA08(`WK@5X(Q`"#\_PU``+3W+_R!+0@0@P80`'P?8(#@`@``!``(`'K@5P(!
+M`"````<(@`$`(`!\'V"(X`(`````"`!\OV$<O`(`%($&$(`H`"#\_PU``*OW
+M+_R!+0@`?+]A'+P"`!"!!@@`@`!0#($&$!2!)@@`@>!7"2``(`!\'V"`X`(`
+M``0`"`%ZX%<"#@`@```'"!2!!A``A08(!'K@5XT#`"``!0`@(/X?8`"[_B\`
+M"``@$/X?8("Y_B^`!@`@`+X/8*7^/T``]@LH@`0`(`)^@($`?(8!Z&D!````
+M!CAO6@``;%H``&]:``!L6@``?UH``````%"`%0`H@!``(`!\'V"(X`(`````
+M"!2!!A``A08(!'K@5XT#`""`!0`@(/X?8`#)_B^`"``@$/X?8(#'_B\`!P`@
+M`+X/8`!\/V`C`0``@.8+*(`$`"`"?H"!`'R&`61J`0````8XC5H``(I:``"-
+M6@``BEH``)Y:```!_A]@``8`*``!`"``@`!0%($&$/R!+0@`?+]A'+P"`!"#
+M!A`0`*X)%`#."02`[0L@@`\X'!!N"P!\/V"`X`(``(!`$`"`#S@`?#]@$``P
+M``!\'V!8IP(`#`$`"`"``!``@`\X!#X.$``V#A``.&YC$'Z.4P!\'V#`:P"`
+M`'P_8$,```D`E-,O!(#M"R"`#S@0$&X+!#X.$``V#A``.&YC%'Z.4Q`:#A``
+M`*!A!?KF5X$%`"``B-,O!?Y&@`!\/V!8IP(```)!0`0!(0@,`6$(`,!`"``&
+M07``A``4@(73+Q``K@D$@.T+((`/.!00;@L$/@X0`#8.$``X;F,4?HY3$!H.
+M$```H&$%^N97@04`((!\TR\%_D:``'P_8%BG`@```D%`!`$A"`P!80@`P$`(
+M``9!:`"$`!0`>M,O$`"N"02`[0L@@`\X%!!N"P5^8(``_$%`6*<"```!00@`
+M0$$(`WK@5P("`"``?$%@____?P"$`!``!@`@!'K@5X($`"``?$%@____?P5^
+M`8``!`!0`GX`@``$`$`"?@"(`(``$(```"``A``0`(`/.`0^#A``-@X0`#AN
+M8QA^CE,0&@X0%!P.$```P&$`@J!A!7XG@`#\`$!8IP(`"`$`"`"$_B\#>N=7
+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
+M=-0"``#_`D``@``0$/\"0`2``!`@_P)`"(``$!3\`!`6WP(`&'\#0!B``!!0
+M_P)`#(``$$#_`D`<_``0<)@"`"#\`!!TF`(```1_"(6T`@`D_``0D)@"``/Z
+MX5<H_``0E)@"`"(&`"`0@``0``0?"(2T`@``>N!7C`,`(&`&`0@```!```K@
+M&`-\`0```0``````0``*@!@`FJ91(`<`(`""(%`"_@=``(`#4$`!1Q``)`%`
+M`!H`0`$%``@$?@"0````0`)^`$````)04`%'$`'^ID$"_B!`!_KF5XHM`"``
+M&N%!H83'"0!\'V*5X`(`#WX'8`AZYV<"?`!H\`````(*`!@`$L!!`(H@02"=
+M1!":A"<*#_X(8`CZZ&<"?`!H\`````(*`!@`%$!!`)5$$).$)PH/_@A@"/KH
+M9P)\`&CP`````@H`&``$"`H`%F!!`7KH5Q"71!`,#``@YH0'"`]^`&`#^N%7
+M```@0@((`"``!!\(A+0"``!ZX%<,!@`@`OX(0`"``U!`@400`"0!0``:`$`!
+M!0`(#WX`8````$`"?@!````"4"`#`"!0@400`OX(0"`!`"````10(/X?8#"!
+M1!"AA@<(`?X@0@1^`)``'`!```H@&0"*R$$@`4<0FH8'"`1^`)``%`!```I`
+M&0`!1Q"3A@<(!'X`D``6`$`!>NA7$`%'$*P&`"``"F`9YH0'"`1^`)`#^N%7
+M``#@00("`"``!!\(A+0"``!ZX%<)SO\G`OX'0"`!`"````10(/X?8"#1_R<P
+M`4<0`_KA5X('`"``!!\(A+0"``!ZX%>,!0`@H`,`(`""(%``)`%```(`0`@'
+M8`@`C`!`&`=`$`'^($`.^N!7"I/1)X#[_R>@`@`@`((@4*@&80@`C`!`&`=`
+M$`'^($`.^N!7BH[1)X#\_R<$/@X0(%K1+P``P&"@F?PO`((`8```H&`@DOPO
+M`((`8```0&`@QOPO`((`8```8&"@OOPO`((`8```@&#_^^)7`OWA5_____\"
+M?>%7_____P)]XE?_____@@,`(`!\7V"`QP(``'P_8&\$``"@!`HH`+X/8(#_
+M_R<`#`-@(,_U+P"*(F``=]$G`'P?8!29`@``@`\X!#X.$*!'T2^W_A]@`'P_
+M8$T%````AP0H`'P?8.$<````@B!0H,/3+P3^7V"`;]$G!#X.$*!!T2^W_A]@
+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
+M%/K@5X$#`"``?%]@>,<"``!\/V!_`P``H*,(*`"^#V"`__\G`'Q?8/#W`@``
+M`"$('`A@"`"&($```@$0`'Q?8.CW`@```"$($`A@"`"&($```@$0`'Q?8`"8
+M`@```"$((`A@"`"&($```@$0`'Q?8`28`@```"$(`@A@"`"&($```@$0`'Q?
+M8`B8`@```"$(!`A@"`"&($```@$0`'Q?8`R8`@```"$(!@A@"`"&($```@$0
+M"`@@"`H(8`@``A\0$)@"``!\7V`4F`(````A"`"&($```@$0`'Q?8!B8`@``
+M`"$(#`A@"`"&($```@$0`'Q?8!R8`@```"$(#@A@"`"&($```@$0`'Q?8/B7
+M`@```"$($@A@"`"&($```@$0`'Q?8/R7`@```"$(%`A@"`"&($```@$0%@@@
+M"!@(8`@``A\0()@"`"(((`@`?%]@))@"```"'Q`LF`(`)`@@"``"'Q`PF`(`
+M```A"`"&($```@$0'@@@""8(8`@``A\0*)@"``!\7V`TF`(````A"`"&($``
+M`@$0`'Q?8#B8`@```"$(*`A@"`"&($```@$0*@A`"`!\/V`\F`(``(``"``$
+M`$"@X\\G`(``$``^#A"`OL\O$("-$`""`&(`!.%A((/0+P"&P6$``*!A("_4
+M+P;^'V``?']@<+,"`)")00@`?)]@`(@"```((4`:_A]@``B!0```0A`0A`T(
+M$81-"`.`0!`"A$`0`?KG5P'^'V`"``!0!'X`@`)ZX5<%@$`0JP$`(`2@0!`!
+M?@!H!8!`$)2%`0@!_E]@`8!`$!K^'V`&_C]@(%,'*``<9V`@=-`O`)H&8("'
+MT2<$/@X0@*[/+_+^7T(``,!A`(*@80`$`6('?@!`H&S0+P`.(!H``.!AH!C4
+M+P"B"&``?)]@<+,"`)`)(@@`?%]@`(@"``"$8$`<_A]@`(1`0```01`"G$$0
+M`7X)0`.`01`(?@"(!(!!$/3^'T`%@$$0"'X`B`:`01`'_@%`H`(`(`""(%``
+M!$`0`7X`0`'^ID$!_B!```/G5XP$`"``A$8(@'KA9X'[_R<`O@]@`'Q?8'C'
+M`@`@00@H^GXI0(#__R>4!0((`*(H8`&`01``A`$(`?Y?8"`V!R@`(&A@(%?0
+M+P">!V"`ML\G!#X.$("'SR\``,!A`'R_87#(`@`!>N!7`GWG5P(````!`P`@
+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
+M`('G5PP'`"`!_DI``X1`$`A^08@$A$`0`(1&"(!ZX6?S_K]`@O7_)P"^#V``
+M?%]@>,<"`*",!2C"_BI`@/__)Y0%`P@`'"=@`0!"$``$`@@!_E]@H($$*`"F
+M:6"@HLTO`"0)8``%S2<$/@X0`.+,+P``@&(`@F!B``1!8@"&(6(`"`)B()O-
+M+P"*PF$``*!A`'S_86"@`@``@0<("'K@5X8'`"`<?N"G`)X<0"`7`"@$*0`0
+M`(%'"!Q^X:<`GCQ`"($`$!R=`!`,IP`0$*4`$!2C`!`8H0`0`7X!0`"!!Q`@
+MDLTO`)H&8(#SS"<$/@X0@,?,+P```&*@C,TO`(+@80``H&$`?-]A1*$"``0)
+M!P@,?N"G`)P<0*`)`"@((0`0!`E'"`Q^X:<`G#Q`#($`$!"?`!`!?@%``!`@
+M&(#ZX%<$`8<0BP(`(````%`$`8<0!@D'"`%^`$`&`8<0H(+-+P":!F``X,PG
+M!#X.$*"NS"\4_I]A(&;Q+_S_#4#\@0T((.[,)Q3^GV$`A>!7!H0`4`4$`%``
+M@`$0((`/.````%`$/@X0`+',+P``P&$`@@!B``2A82!US2\``.$)`*`G0``#
+MYU<.G"!0('7-+P""!A"@TLPG````4"`!`"``@B!0`?X@0`7ZX%>&!0`@&/[@
+MIP#\7$`DJP(`*``!"```8`@D``$(````"`"!X5<!^O\G((`/.````%`@@`\X
+M`?X?8`0^#A``H<PO`?[_803^WV&@#``@&/Z_83@`"`@````(``'@9P*^#V!"
+MI04H8?X_8#0`"`@````(``'@9P($`"`D``@(````"``!X&<"`@`@*``("```
+M``@``>!G@0$`(`"^#V!G_C]@`)T%*`'^YT$8_J9!!'['007ZYU<&N<PG`'P_
+M8"2K`@```@=`$```"``!X&<`@@9"@>__)R@`"`@``"`()``("``"`!`P`@@0
+M+`(($#@`"`@````(``'@9P&^#V#!D04H3OX_8#0`"`@``"`()``("`````@`
+M`^!7A0(`(`"^#V`@C04H4OX_8#0`"`@``"`(*``("`````@``^!7A>S_)P"^
+M#V`@Z_\G5OX_8"`#`"``"()0``1@"`%^@D``AD`0`?X@0`%^`$``">%7C?S_
+M)P"`#S@"?H&((`,`(`"&85```$`(`?YA0`"$`!`$_B!`!'X`0``'XE<.@`\X
+M`/S_)P!\/V`DJP(`"(``"`"`0`@````((,#_)P'^/V`8?N"G`/Q<0"2K`@`T
+M``$(`()@8"@`(0@````(`(`@"""X_R<P`$$(!_X@@`"``$``@`$0((`/.```
+M`%`8?N"G`/Q<0"2K`@`T``$(````"""U_R<D`$$(&'[@IP!\7V`DJP(``(0<
+M0#0```@L?D%`````"*"P_R<`<D%`&'[@IP!\7V`DJP(``(0<0#0```@P?D%`
+M````"""L_R<`<D%`!7K@5P""8&"&!``@&'[@IP#\7$`DJP(`.``!"#``(0@`
+M```(-`!!"*#K_R<``$$(((`/.`3^'V`$/@X0`$[,+P!\?V!8K0(`&H1!"``#
+MX6<`FJ91`0,`(`1^`$`@2/4O!/XA0``!X&<!?+]A`0```"!SS"<`C@88!#X.
+M$`!+S"\``.!A`'R_85BM`@`:A`8($'K@9P`<QU&!!0`@!/X'0*`_]2\$_B9`
+M``'@9P(#`"`0_@=`(#WU+PK^)D```>!G`7S?80$````@:LPG``X'&`0^#A``
+M.\PO``0?"'[?`@`#>N!7"H$`*``&S2\``*!AH,'B+PG^'V``GN(O(`;-+P":
+M!F"@JM\O`?X?8-+^'V"@<O\O^/X_0`!>S"<$/@X0H"_,+QC^GV$`!!\(GMT"
+M```!X&>"\O@O@%<&*`%ZX%>.`@`@`.CZ+P```%``@B!0H%+[+P'^7V"`0P(H
+M@&8"*(`V^"\```!0H`_W+_C_+4````!0__\_8*"B^2_\_TU`````4"#*^2_X
+M_RU``OX?8/__/V`@G_DO_/]-0`+^'V"@QODO^/\M0`;^'V#__S]@H)OY+_S_
+M34`&_A]@(,/Y+_C_+4`#_A]@__\_8""8^2_\_TU``_X?8*"_^2_X_RU`!/X?
+M8/__/V"@E/DO_/]-0`3^'V`@O/DO^/\M0`7^'V#__S]@()'Y+_S_34`%_A]@
+MH+CY+_C_+4`*_A]@H*GP+P'^/V`+_A]@(*CP+P""(%```!\(&+8"``!]X%<`
+M```"`GW@5P````2!`P`@`'Q?8*#'`@``?#]@,`(``""_!"@`O@]@@/__)P#5
+M]R^`TLPO____?____W____]_____?____W____]_____?____W____]_____
+M?____W____]_____?____W____]_____?____W____]_____?____W____]_
+M____?____W____]_____?____W____]_____?____W____]_____?____W__
+M__]_____?____W____]_____?____W\`1``H@!GX+R#D!R@*_A^`()3W+_C_
+M#4``?!]@!```]@#?]R____]_____?____W____]_____?____W____]_____
+M?____W____]_____?____W____]_____?____W____]_____?____W____]_
+M____?Z",]R_X_PU`^($-"``!X&>!V_\G`?[_'P#__R<$/@X0`.+++P`!H&&!
+M`0`@((`F"`"#X&<"`0`@H`K,)P'^'V`LA`8(``'@9X(!`"`MA`8(``'@9P$!
+M`"`@`0`@`?X?8````%```>!G```?$'2^`@`!`@`@`'P?8'B^`@``C?`O((`F
+M"`*$``@``>!G`@,`(`!\7V#<EP(````!"`%^`$````$0`X0`"```/P@4M@(`
+M`(/@9X(!`"``"#\(K*T"`(`!`"``_"!`S+H"`/^%(`@``^!7"_?+)Z#VRR<`
+M@@!@```?"!2V`@```>!G`8`/.`!\'V!\O@(`@'WP)P``/P@4M@(``(/@9P&`
+M#S@`!``(2'K@5P&`#S@`?!]@@+X"`(!X\"<$/@X0`,'++P``H&$``!\(%+8"
+M```!X&<!ZLLG`'P?8'B^`@"`<_`O!(0&"`%ZX&<!Y\LG`80&""!ZX&<!_A]@
+M`0``4```'Q!TO@(`@./+)P0^#A`@M<LO%/Z?80!\'V`*`"`(@(?,+P!\/V`*
+M`"`(((?,+_Y_`&"@<_<O_/\-0("R]R\@\<LG%/Z?800^#A``K<LO`'P?8`H`
+M(`B`@,PO`'P_8`H`(`@@@,PO`7X`:(#G]R^`U<LG!#X.$*#(RR]@_I]A`)JF
+M4?R;#1#TFPT0`"B*4O";#1``GN=1`"1)4@!\'V,4M@(`!?X_8P!\OV)^WP(`
+M`'S?88"T`@``?']B7)\"``!\'V+,NP(``'S_8M"7`@"@"``@`)H&8(#M_R\@
+MC@<H"OX?@*!=]R_D_PU`@&?,+X!HS"_H@0T4@,+M+TA!*`B@UNTO2'](0$0!
+M"!#HP0T(`&?,+_2!#0@``>!G`=C@+P#-S2\/>N"'A`8`(```#`@`$$`:```'
+M"`!]X&<?]_\'H0,`(`"R2A#3_A]@H,[^+[G^/V"@?=HO```'"``:!Q``*>IG
+M@@(`(``D"6#\_RU`H+8`*.S_34``@.D)_($-"``!X&<!%P`@`+O-+P5ZX%>!
+M`0`@@+G-+P%ZX%<"%``@@$_,+P"M[2\`@B!0(,'M+TA_2$!$`0@0`"0)8/S_
+M+4"@K``H[/]-0/R!#0@``>!G@0@`(`"$"@@!>N!7#`<`(-'^'V"@N_XOW_X_
+M8*`%XB\&_A]@`(0*"`)ZX%<+`@`@`'P?8```"```9]HO``$`("`!XB\'_A]@
+M`$+,+P!#S"_H@0T4`)WM+TA!*`@@L>TO2'](0$0!"!#HP0T(@$',+R"DS2\`
+MHBA2"7K@5X$!`"``HLTO`WK@5X(``"`!_C]B^*,-%/C!#0@``>!G`24`(``I
+MZF<")``@@#3,+P"2[2\`@B!0(*;M+TA_2$!$`0@0`"0)8/S_+4"@D0`H3'](
+M0`"`"0@`@>=7@0$`(/R;#1`@`0`@`)H&8/R!#0@``>!G`0H`(-'^'V`@G_XO
+MD/X_0`"$*@B@G?XOT?X?8$Q!*`@@G/XOT?X?8$Q!"`B@_0`H\/\M0`"$"@@"
+M?@"``'P@0+R7`@#\@0`(`7X`0"`,`"#\@0`0TOX?8""5_B^5_C]``(0J"*"3
+M_B_1_A]@3$$H"""2_B_1_A]@(-SA+PC^'V#XFPT4`(0*"`)ZX%>+`0`@(#[:
+M+Q#^'X```0`@H-?A+PG^'V``@`L(`7X`0`"`"Q``%\PO`!C,+^B!#10`<NTO
+M2$$H"""&[2](?TA`1`$($.C!#0B`%LPO^,$-"``!X&<"`P`@`'KI5XP=`"``
+M`!\(?.`"```!X&>!&P`@`'P_8@0`,`#XP0T(`(#("@`!X&<"?#]@50$``$)]
+M_B_1_A]@@`?,+_"!#0@$?@!H`"S`:O___W____]_____?____W____]_____
+M?____W____]_____?____W____]_____?____W____]_____?____W____]_
+M____?____W____]_`*P($/___W____]_____?____W____]_____?____W__
+M__]_____?____W____]_____?____W____]_____?____W____]_____?___
+M_W____]_@/+++_C!+0@`@^!G`8[_)P#ORR\`U0<H``'@9X$"`"``2^TO`((@
+M4"!?[2](?TA`1`$($-/^'V"@7OXOU?X_0`"$*@@@7?XOT_X?8`!E_R\*_A]@
+M`OX_8"!;Z"\#_E]@```@8B`/`"CT_PU`]($M"*!7_B_3_A]@]($-"``!X&<!
+M!``@`*/H9P(#`"`@2,TO`?Z?8@5ZX%<%=?\G('?_)_";#1#PFPT0H)OA+PC^
+M'V!,00@(H-``*``HBE(`A`H(`GK@5XH!`""@E^$O"?X?8(!P_R<@^]DO$/X?
+M@`!O_R<$/@X0(`W++QS^GV$``,!A````4*!D_B_\@0T0``&@80$$`"``!!\(
+M?M\"``1ZX%<#_A]@"GP?8`0````@J/@O_/\M0`";YF<`@B!0`0(`(/R!#0@`
+M`>!G`7P_8`$``````@<0(#W+)QS^GV$$/@X0@`O++P``0&(`?-]AE-T"````
+M!P@#_A]B#`"@"0!\/V+\U@(`'(#F":#,V"\`F@9@````4"*`AA"@J^`O`)H&
+M8"R@1Q`#_A]@+8!'$`A^`(B@8P(H+H!'$`-^`&`J@(<0`(`H"$C^'V``@$`0
+M`"7I9P'^0!"A`0`@`?Y_8A'^'V`!@$`0`"3-+P9ZX(>#`0`@@!#G+P`!X&<!
+M`0`@(`(`(!&F1A````<(H`WJ+P'^/V`@1>`O`)H&8!&$!@B??@!@`7K@5P$(
+M`"``@"@(`80`"`A^`&@!@$`0`'P_8!B6`@``@``(`7X`0`"``!`1A"8(H!W^
+M+]+^'V`LH$<0```'"*`"ZB\!_C]@!OX?8"R`1Q`'_A]@+8!'$`A^`(@@2@(H
+M+H!'$`=^`&`J@(<0`'P_8!26`@``@``(`7X`0*`&RR<`@``0!#X.$*#JRB],
+M_I]A`'S?8A_W_P<``2!B`(+@80`$`6(`FJ91\)L-$.R;#1#!:@`@`)H'$""$
+M[R_T_PU``'S?872_`@`$`0<(]($M"`"`8%`"_DB``'P!0-2Z`@#\`0`(`?Y_
+M8@"!X5<(`0<(#J9I4@"`@%``?`%`Z+H"`/P!``@!_C]B``'B5PP!!P@.HBA2
+M`(`@4```'PC\N@(``?Z?8@"!X%<``0<(#BB*4@`!X&<`)$E2`0(`(```'P@`
+MNP(``('A5X4``"`!_E]B@.W,+P5ZX%<%`P`@`*JJ4@"GZ6<"H^AG`BGJ9P(E
+MZ6>!```@`?Z_8@!\'V`)`"`(((?++P'^?V(">N!G`:9I4@```%"@@O4O_/\M
+M0`+^'V`@@?4O^/\M0*#BS"\`HBA2`7K@5X$$`""`X,PO!7K@5P$#`"``W\PO
+M`WK@5X$!`""`W<PO"7K@5P(%`"``WLPO``'@9X(#`""`3^0O``'@9P("`""`
+M;-4O``'@9P%\/V(!`````'Q?8GS@`@"@__TO`"()$`"B*%(`J^IG`J?I9P$)
+M`"`0`2<(`(/@9X$'`"#\@2T(`(/@9P$&`"#X@2T(`(/@9X$$`"```"D(`(/@
+M9P(!X&>!`@`@```?"("T`@``+>!G`7P_8@$`````H^AG@1T`(`!\'V#TJP(`
+M`"PK8``$05#L_VU`H&3K+P`(@E```$!BUOX?8*#0_2\`)"E@`%[++R##S"\`
+M`&!B!7K@5P!\WV%PX`(`@@,`(`#AX"_P@0T0`?X?8```!Q`@6\LO`*8)8(`'
+M`""@6<LO`*8)8/#_#4`@<P<H`?X_8"!VYB\```<0`!`@&`#]X%?__P```0(`
+M(/"!#0@``^!7C@``(/"##1`'>NE7``1!4((#`"````<(``'@9X$!`"#P@0T(
+M"WK@5XX``"`!_E]@`((@4`"CZ&<"!>%G`0(`(.R!#0@`+>!G`7P_8`$`````
+M@B!B`*/H9P"B!Q`!$P`@\($-"``!X&>!$0`@`'Q?8'[?`@``!"$(!?K@5X(#
+M`"`1>N!7#7P`@`H````-?`!``,3__\T$`"````@0"GX`@`!\`$``U/__```(
+M$`7ZX%<!?#]@!``````"01``?>!7``@```T"`"`"^N!7"7P_8`(``````P`@
+M`'W@5R`(```-`P`@`_K@5PE\/V`#````(`$`(``"01``&@@0H)[*)TS^GV$`
+M?A\0A+X"``%^7Q#(K0(``(`/.`%^'Q"#O@(``'Y?$,FM`@``@`\X!#X.$`!B
+MRB\``*!A``0?"'[?`@`!?@!0!'K@5P`<QU&N%@`@`(+@80"^#V`@:`,HB_X_
+M8(`0`"``F^9G@0<`(`!\WV%TX`(`````4""L]R\`'"=@`'P_8'C@`@`@JO<O
+M`?X?8```!P@`&@!``'P@4`@$```@L_<O!/X?8`!\WV$```#V@`8`(`";YF<"
+MFB9@PJ_W+P/^'V``?-]A````M@`#`"``?-]A````-@";YF<"FB9@0JOW+P/^
+M'V``G`<0H$H`*`":!F``?!]@]&D```#!\B^`<,HG`WR``0"O`0``?(9!P&L`
+M````!CCP[N?3TP````0^#A"@2\HO./Z?80``P&$`?!]B=.`"````"`@`?%]B
+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
+M(+J]+P3^OV``?-]@H/("``!\'V``C`(``'R?8/#?`@`,``(0$`H"$`"&85``
+M?@(0!`8"$`@&`A`@"``@`?X_8`G^`(``?$!``/[__P!\'V``C@(```1`0!3^
+MX*<`B!Q`#`0`$!`*`!``B)Q!``8&$`0&`!`(!@`0`?X@0`3ZX%>,]_\G`'Q?
+M8`#U`@``?#]@`/("`$"$`!`@_A]@1(``$`!\/V!8X`(`#(``$`B$`!````,(
+M`(``$`2``!``?!]@$/@"``!\/V``]P(```(`4`)^`)`!?@!0`(``$`!\'V"L
+MF`(``'P_8`"6`@```@!0`GX`D`%^`%``@``0`'P?8!"9`@``?#]@Z)@"```"
+M`%`"?@"0`7X`4`"``!#%_A]@H-?P+UK^/V`@PKTG````4"!#VB<._A]@!#X.
+M$("<O2\`(`A2`)[G4:`,`"``',=1.(`&"`````@``>!G`KX/8,*@]B^,_C]@
+M-(`&"`````@``>!G`@0`("2`!@@````(``'@9P("`"`H@`8(````"``!X&>!
+M`0`@`+X/8)+^/V"`F/8O`7X(0AA^QT$$_N=!!7KH5X:TO2<`?#]@)*L"``""
+M!T`0```(``'@9P`"IT&![_\G)(`&"`````@P@`80+(`&$#B`!@@````(``'@
+M9P&^#V!!CO8O=/X_8#2`!@@``"`()(`&"`````@``^!7A0(`(`"^#V"@B?8O
+M>/X_8#2`!@@``"`(*(`&"`````@`@>!7C>W_)P"^#V`@[/\G?/X_8`0^#A``
+M-@X0`#AN8Q!^CE,`(>LO`'P_8)B8`@``@``0"/X?F`!>Z2^`5>DO@`8`*`K^
+M'V`!_C]@@`3B+PO^'V`!_C]@``/B+P```%``?#]@"@`@"``]OB\$@.T+((`/
+M.!`0;@L`?']@)``P``!\7V`D`3```'P_8"@!,```?!]@``@`@`"``1"#AA\8
+M```!$(6&'Q@`@``0`(`/.(!^'Q#$GP(``(`/.`!8`@``&```````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````(@"`"AA````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````````````````````$````
+M``````````````````````````!!0D<Z.2XP+C$N-@``````2F%N(#(Q(#(P
+M,#4`````````````````````````````````````````````````````````
+M````````````````````````````````````````>P!Z`'H`>0!X`'@`=P!V
+M`'8`=0!T`'0`<P!R`'(`<0!P`'``;P!N`&X`;0!8`%@`5P!6`%8`50!4`%0`
+M4P!2`%(`40!0`%``3P!.`$X`30!,`$P`2P!*`!8`%@`5`!0`%``3`!(`$@`1
+M`!``$``/``X`#0`,``L`"@`)``@`!P`>;`D0`````!YQ"1``````'G8)$```
+M```>>PD0`````!Z`"1$`````'H4)$0`````>B@D1`````!Z/"1$`````'I0)
+M$0`````>F0D1`````!Z>"1$`````'J,)$@`````>J`D2`````!ZT"1(`````
+M#-@#`/T!`0`,W`,`_0$!``S@`P#]`0$`#.0#`/T!`0`,\`,`_0(!`0ST`P#]
+M`@$!#/@#`/T"`0$,"@0`!P("`@P,!``'`@("#`X$``@"`@(,$`0`"@,"`@P2
+M!``*`P("#!0$``D#`@(,%@0`"0,"`@P8!``)`P("#!P$``D#`@(,(`0`"0,"
+M`PPD!``)`P(##"@$``@#`@,,3`0`"`0#!`Q0!``'!`,$#%0$``8$`P0,6`0`
+M!`0#!`Q<!``$!`,$#&`$``D%`P4,9`0`"`4#!0QH!``'!0,%#&P$``8%`P4,
+M<`0`!@4#!0QT!``#!0,&#'D$``4&!`8,?00`!08$!@R!!`4#!@0&#(,$``0&
+M!`8,A00`!`8$!@R)!``$!@0&#(T$``,&!`8`````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````````````&`````````+"8`@`0``$`
+MP)@"`!```0#0F`(`!``!`-28`@`%``$`W)@"``8``0!4T@(`!``!```````*
+M`;H`B@!$`#@`>``T`#``+``L`"@`*`#:`*(`@``\`#0`=``P`"P`+``H`"@`
+M*``!`@0``0@"!`@0($``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````#@`(``H`
+M!``$``(`,``P`!0`,````@``@``````````!`````/H```$````T`#``&``P
+M```$`````0```````.@#``#_____`0```#@`,``8`#```!`````"````````
+M``0```#Z```!````(``P`!@`,```````0```````````!```````0`$````@
+M`3``&``P```````@```````````$```````"(````#P`,```````````````
+M``#_____$"<```"'DP,!````,`$P`!@`,```(`````0`````````!```____
+M?P$```!3>7-T96T@5&EM97(@5&AR96%D````_P`/``\`#P`/`#\`/P`_`#\`
+M`@("`@````````````````\`#P`/``\`/P`_`#\`/P`"`@("````````````
+M````#P`/``\`#P`_`#\`/P`_``("`@(````````````````*`;H`B@!$`#@`
+M>``T`#``+``L`"@`*`#:`*(`@``\`#0`=``P`"P`+``H`"@`*``!`@0``0@"
+M!`@0($``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````````````````````````````!#7`@``<`(`
+M``$``````````````````!#;`@``@`(`0````````````````````!#<`@``
+MA`(`0`````!P`@``@`(``(0"`*#R`@"@_P(`1/("`$#R`@`!`````0````$`
+M```!`````0```(#R`@"`_P(````````````$\@(``/("`(3R`@"$_P(`````
+M```````,\@(`"/("`(CR`@"(_P(````````````4\@(`$/("`(SR`@",_P(`
+M```````````<\@(`&/("`)#R`@"0_P(````````````D\@(`(/("`!P````9
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````````````````H!N@"*`$0`.`!X
+M`#0`,``L`"P`*``H`-H`H@"``#P`-`!T`#``+``L`"@`*``H``$"!``!"`($
+M"!`@0'1X<V-H961?90``````````````"@&Z`(H`1``X`'@`-``P`"P`+``H
+M`"@`V@"B`(``/``T`'0`,``L`"P`*``H`"@``0($``$(`@0($"!``````(@3
+M````````````````````````````````````````````````````````````
+M````````````9&ES<&%T8VAE<E]A8W0``%JE6J4``````00$!`0$!`($``,$
+M!`0!!`0$!`0$``0!#`(`$@(!&`(")`($,`((2`(08`(@;`)``@$!!`$""P$$
+M%@$(`@$!!`$""P$$#`(`$@(!%@$(&`(")`($,`((2`(08`(@;`)`````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````!"`P2&"0P2&!L`````````00"!`L6
+M``````````````$,`@0+%@P2&"0P2&!L```!#`($"Q8,$A@D,$A@;````0@,
+M$A@D,$A@;`````````,!`0`&`@4`*@$`````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````````````````````````!M;6%C7W=A:71?9&EN;U]R97-P
+M7W-E;0``````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````````')E<W!O;G-E7W1R9P``````````````````
+M```````````````````````````````#`````````0```'-C86Y2>%1R9P``
+M`````````````````````@`'```````'`/W_``````````#]_P``````````
+M````````````````'``````````````````4`!L`"P`7```````!`!X`````
+M````/@```"4````$````````````````````````````-``Q`#$`````````
+M```(````%0`0``(```!`````````````````````````````````````````
+M```````````````````````````````````````````````!```````*`;H`
+MB@!$`#@`>``T`#``+``L`"@`*`#:`*(`@``\`#0`=``P`"P`+``H`"@`*``!
+M`@0``0@"!`@0($`!`@(```(`````````````````````````````````````
+M`````````````````````````````&UE87-U<F5?='AS8VAE9%]E````````
+M`*AQ``""<0``%%\``&<N``#W4P``Y`4```00```B$```Z`\``$0U``!L-0``
+M`0``````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````(``````````_____P``````````````````````````````
+M````````````#P`````````%!`,"`0````$!`0$"`@``=V%I=%]D:6YO7W-T
+M871I<W1I8W,````````````````````````````````````````````````*
+M`;H`B@!$`#@`>``T`#``+``L`"@`*`#:`*(`@``\`#0`=``P`"P`+``H`"@`
+M*``!`@0``0@"!`@0($``````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+MF```````````````````````````````<GA?90``````````"@&Z`(H`1``X
+M`'@`-``P`"P`+``H`"@`V@"B`(``/``T`'0`,``L`"P`*``H`"@``0($``$(
+M`@0($"!````````````````````````````*````````````````````````
+M`````````0,#``$"`P`#`P``````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M```````````````````````````````$````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````%`@#6N</```H.4AB>9JQNJHJ<1Q5%3@.J@H<!U4%O00-#P4'
+M"0L!`P```````````0$"`@,$!`4'#2,Z__\`@(LN11<*%#=N`0$!`0$"`P4'
+M#2,``#I,:(*HO\H'#2,``#H`4%UQ>WW__P"`BRZJ*G$<11=5%3@.J@H<!U4%
+MO00*%#<-#VX%!PD+`0,!`0$```$````````!`0$"`@(#`P0$!04`````````
+M```````````````````````````````````````````````````````#````
+MI<:$^)GNC?8-_[W6L=Y4D5!@`P*ISGU6&>=BM>9-FNQ%CYT?0(F'^A7OZ[+)
+MC@O[[$%GL_U?ZD6_(_=3EN1;F\)U'.&N/6I,6FQ!?@+U3X-<:/11--$(^9/B
+M<ZM38C\J#`A2E65&7ITH,*$W#PJU+PD.-B2;&SW?)LUI3LU_G^H;$IX==%@N
+M-"TVLMSNM/M;]J1-=F&WSGU[4C[=<5Z7$_6F:+D``"S!8$`?X\AY[;:^U$:-
+MV6=+<MZ4U)CHL$J%:[LJQ>5/%NW%AM>:56:4$<^*$.D&!('^\*!$>+HEXTOS
+MHOY=P("*!:T_O"%(<`3QWV/!=W6O8T(P(!KE#OUMOTR!%!@U)B_#X;ZB-<R(
+M.2Y7D_)5@OQ'>JS(Y[HK,I7FH,"8&=&>?Z-F1'Y4JSN#"\J,*<?3:SPH>:?B
+MO!T6=JT[VU9D3G0>%-N2"@QL2.2X79]NO>]#IL2H.:0Q-].+\C+50XM9;K?:
+MC`%DL=*<X$FTV/JL!_,ESZ_*CO3I1Q@0U6^(\&]*<EPD./%7QW-1ER/+?*&<
+MZ"$^W9;<888-A0^0X$)\Q'&JS-B0!08!]Q(<H\)?:OFNT&F1%UB9)SJY)SC9
+M$^NS*S,BN])PJ8D'IS.V+2(\DA4@R4F'_ZIX4'JECP/X68`)%QK:93'7QH2X
+MT,."L"EW6A$>RWO\J-9M.BS&I?B$[IGVC?\-UKW>L9%48%`"`\ZI5GWG&;5B
+M3>;LFH]%'YV)0/J'[Q6RZX[)^PM![+-G7_U%ZB._4_?DEIM;=<+A'#VN3&IL
+M6GY!]0*#3VA<4?31-/D(XI.K<V)3*C\(#)521F6=7C`H-Z$*#R^U#@DD-AN;
+MWSW-)DYI?\WJGQ(;'9Y8=#0N-BW<LK3N6_ND]G9-MV%]SE)[W3Y><1.7IO6Y
+M:```P2Q`8.,?><BV[=2^C49GV7)+E-Z8U+#HA4J[:\4J3^7M%H;%FM=F51&4
+MBL_I$`0&_H&@\'A$);I+XZ+S7?Z`P`6*/ZTAO'!(\01CWW?!KW5"8R`PY1K]
+M#K]M@4P8%"8UPR^^X36BB,PN.9-75?+\@GI'R*RZYS(KYI7`H!F8GM&C?T1F
+M5'X[JPN#C,K'*6O3*#RG>;SB%AVM=ML[9%9T3A0>DML,"DALN.2?7;UN0^_$
+MICFH,:33-_*+U3*+0VY9VK<!C+%DG-))X-BTK/KS!\\ERJ_TCD?I$!AOU?"(
+M2F]<<C@D5_%SQY=1RR.A?.B</B&6W6'<#88/A>"0?$)QQ,RJD-@&!?<!'!+"
+MHVI?KOEIT!>1F5@Z)R>YV3CK$RNS(C/2NZEP!XDSIRVV/"(5DLD@ATFJ_U!X
+MI7H#CUGX"8`:%V7:US&$QM"X@L,IL%IW'A%[RZC\;=8L.@``````````````
+M````*``H*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H*"@H
+M*"@H*"@H*"@H*"@``````````````````"`#````````````````````````
+M````````````````````=V%I=%]M96%S7W-T871I<W1I8W,``````0``````
+M````````9````````````````0````0'"@H*`````"`#```@`P``R````,@`
+M``!D````T`<``+`$``"0`0``9````&0````@`P``T`<``0(#!`4`````````
+M````````````````````````````````````````````0!\`````````````
+ML`0``````("6F`!D`````0`````````````````%1O____\`````````````
+M````````````````````````````````````````````````````````````
+M``````!M=V%I=%]E````$`"``;@`Z`#I`.N`L("`@[.1````````````````
+M````````````````````````````````='5N95]W86ET7W-E;0``````````
+M``````````````````````````````````````````````````````````,`
+M````````__\``/__________X````"-"```#````@`"``(``@`"``(``@`"`
+M`'L`>@!Z`'D`>`!X`'<`=@!V`'4`=`!T`',`<@!R`'$`<`!P`&\`;@!N`&T`
+M6`!8`%<`5@!6`%4`5`!4`%,`4@!2`%$`4`!0`$\`3@!.`$T`3`!,`$L`2@!*
+M`$D`2`!(`$<`1@!&`$4`1`!$`$,`0@!"`$$`0`!```D`"``(``<`J@$``*P!
+M``"N`0``L`$``+(!``"T`0``M@$``#$Q+"PL+"D`^/\(`#``0`!L`(``G0``
+M`/O[!0`*!04````````````````R````````````````````````````````
+M````````````````````````````````````````````````;&UA8U]P;W=E
+M<E]P<F]C97-S7W-E;0``````````````````````````````````````````
+M````````8V%L:6)R871I;VY?<V5Q=65N8V5?<V5M`````(&`@I0"`P"``H,`
+M`PH`#P````$`````````````````````````````````````````````````
+M='AL;V-K7W-E;0```````````0`6`P(`@("`@("`"P```/\``0````L[6W-S
+MH\/;```````````````````````````@(````P#_``"#``!_````'@$$`0$`
+M``````````0!`(S<WN#B````````'P``@P`#`/\``0```/\`````````;@!N
+M``$```!`'P`````````````````````````````!``````````````````D`
+M#``)``D`!P`````````````````````````%`!``$``0`!``$``0`!``$``0
+M`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``$``0`!``
+M$``0`!``$``0`!``$``0`!``$``0`"``````````````````````````````
+M```````````````````````````````````````````````````````?'Q\?
+M'Q\?'Q\?'Q\?'Q\?'Q\?'Q\?'Q\?'R$A#!0,%`T5#A80&!(:%1T9(1HB&R,;
+M(QPD'24=)1XF'R<?)Q\G'R<?)QXF'24<)!HB&"`6'A4=%!P2&A(:$1D0&!`8
+M$!@0&!`8$!@````````?'Q\?'Q\?'Q\?'Q\?(0```PD)"P,("`H"!P<)`08%
+M!P$%!`8`!`,$``,"`_\"`0'^````_?[]_OS[^_S[^OGZ^OCX^/KW]_?Y]?7V
+M]_3S]?7R\?/S\._R\N_M\/'M[.X`````````````````````````````````
+M``````````````````````("!OKZ^OKZ_/X```````#\_@``````````````
+M`````````````@````````````````````````````("!OKZ^OKZ_/X`````
+M``#\_@#S>_-U\V[S:/-B\UW3;M-HTV+37;-NLVBS8K-=DVZ3:)-BDUUS;G-H
+M<V)S75-N4VA38E-=,VXS:#-B,UT3;A-H$V(377MN>VA[8GM=6VY;:%MB6UT[
+M;CMH.V([71MN&V@;8AM=0VY#:$-B0UTC;B-H(V(C70-N`V@#8@-=:VYK:&MB
+M:UU+;DMH2V)+72MN*V@K8BM="VX+:`MB"UWS>_-U\V[S:/-B\UW3;M-HTV+3
+M7;-NLVBS8K-=DVZ3:)-BDUW[<?MK^V7[8-MOVVK;9]MCVUV[;KMHNV+C:>-C
+MXU[#;,-FPV+#7:-NHVBC8J-=@VZ#:8-D.V([71MN&V@;8AM=0VY#:$-B0UTC
+M;B-H(V(C70-N`V@#8@-=:VYK:&MB:UU+;DMH2V)+72MN*V@K8BM="VX+:`MB
+M"UWS>_-U\V[S:/-B\UW3;M-HTV+37;-PLVJS9+-?DV^3:)-B^WO[=?MN^VC[
+M9/M?VW';:]MEVU_;6;MLNV>[8;M:XW_C>.-RXVSC9L-WPW##:J-_HWFC<J-L
+MHV:C88-O@VJ#98-?ZW'K:^ME0WE#<D-L0V9#82-Q(VLC9B-@`W$#:P-E`U]K
+M<&MF:V5+>4MR2VQ+9RMX*W$K:RME*UX`31D?'@`L`0(`````32$AU/XL`0``
+M````31D@(P`L`0$`````32$D(P`L`?____\`31\@*``L`0(`````30X4U/[Z
+M_P,`````31(4U/[P_P(`````3148'@`L`0(`````31$4U/X%``0`````320F
+MU/[F__W___\`32$K&@`L`?____\`32$K'@`L`?____\`32`@U/[F__[___\`
+M32`@U/[F_P(`````32$FU/[Z_P(`````32$FU/[P_P,```#P#O0/^!#\$0@2
+M#!,0%"(5)!8F%R@8*ADL&BX;,!PT'3@>/!]`(&0A:")L(W`D="5X)GPG@"B$
+M*8@JC"N1+)4MF2Z;+YTPH3&E,@```````````````````````#(_#A$`````
+M^O\R/R$G````````,C\H+$,```#V_S(_*"PC````]O\R/R@L`P```/;_,C\M
+M,$,`X/\``#(_+3`C`.#_```R/RTP`P!H````,C\Q,4,`X/_Z_S(_,3$C`.#_
+M^O\R/S$Q`P!H`/K_,C\R,D,`X/_T_S(_,C(C`.#_]/\R/S(R`P!H`/K_/DT.
+M$0````#Z_SY-*"L`````[_\^22PP``#@_P``/DDQ,@``X/_Z_TI-+3(`````
+MXO\R30X@``````8`,DTA)`````#Z_S)-)2<`````]/\R.3$R``````P`(DT.
+M$0```````")-$A0`````````````````````````````````````````````
+M````````````````*```````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````8VUD7W=A:71?9F]R7W)E<W!O;G-E```0FW(`````````
+M!````0```%-Y<R!);FET(%1A<VL```!O;P`````````$```%````1G)A;64@
+M2&%N9&QE<@```/4?``````````0```L```!46"!38VAE9'5L97(`````:%4`
+M````````!```!````&1I<W!A=&-H97(@5&%S:P``````````````````````
+M````````````````````````````````````````````````````````````
+M````!0,`````ZLP``.J,________/P``````_____P`$`@````,`_____P``
+M`````.;,``#FC/____\$`"```````/____\$`"``!0`@`/____\```````"F
+MS```IHS__S\`!``@```$`@````,`!``@``4`(`#\____``````!`:LP`0&J,
+M!``@`/__/P`$`"``!0`@```$`@````,`_____P$`````@*Z,``"NC/__/P#_
+M____``0"`````P``````______S___\"`````P```*``,`"D`#``T``P````
+M5`%0`#``5``P`,``,````%0`L``P`+0`,`#4`#````!4`$UM86-M9W(N8P``
+M``$,#`P,#`P,#`P,``4!#`$,`@P,#`P,#`P,#`P,`PP,#`P,#`P,#`P,!`$,
+M#`P,#`P,#`P,`0P,#`$&#`P(#`P,#`P,`0P'!0P,#`P,#`P!#`P%#`P,#`P,
+M#`P("`@,"0P&#`P,#`P,#`P,"@P,#`P,"@H*#`P,!0P,#`P,#`P,#`P,#&UM
+M86,N8P``8VYC=&UG<BYC````!0````H`!P!$:6YO+F,``$9R86UE<G@N8P``
+M```````!``$`````````!@`8`!X`<'=R;6YG+F,`````:V5Y7V-O;7!U=&%T
+M:6]N+F,``````````````/__________<W!E8W1R=6UP:W0N8P```%1X4&]W
+M97)#86QI8BYC`````````````````````````0````(````$````"````!``
+M``!4>&-T<FPN8P````"/COJ(PNRIK;````"Q`@``L0,``*G_JO^K_Z@_````
+M````B'\O,`,P%``S?P<P`S`4`#-_/S`#,!0`,W\',```&!`S?P`P`P`8$#-_
+M`$`$0!@0B(%T=6YE<BYC`'\`?@!^`'T`?`!\`'L`>@!Z`'D`>`!X`'<`=@!V
+M`'4`=`!S`'(`<0!P`&\`;@!M`&P`:P!J`&D`:`!1`%$`4`!/`$X`3@!-`$P`
+M2P!+`$H`20!(`$@`1P`0`!``#P`.``X`#0`,``P`"P`*``H`"0`(``@`!P`&
+M``8`!0`$``,`Q'H0@#"`%P```!D````1`!<`^/\@``P````U``<````#````
+MA("0$)$DDBJ3/)0#E7^F(*<*K7^O#[4#X(+A(.)`Y:#F,N>%[P"6`9@!\T#T
+M(```@`&!`HA`CD"I(JHBJR+5`M8%]?B`@Y\0J!"IB*HSJS.N$+.1M@/`'/40
+M``"!`HH`H`"Q`KD"P@"!`(H!H`&Q`KD!PAS"````PA0``!CN`<SGT>'[[BC[
+M.``M`"0`+?LX[BCA^^?1`<P8[A(2[AC,`='G^^$H[CC[+0`D`"T`./LH[OOA
+MT>?,`>X8$A(8[@',Y]'A^^XH^S@`+0`D`"W[..XHX?OGT0',&.X2$NX8S`'1
+MY_OA*.XX^RT`)``M`#C[*.[[X='GS`'N&!(2&.X!S.?1X?ON*/LX`"T`)``M
+M^SCN*.'[Y]$!S!CN$A+N&,P!T>?[X2CN./LM`"0`+0`X^RCN^^'1Y\P![A@2
+M$ACN`<SGT>'[[BC[.``M`"0`+?LX[BCA^^?1`<P8[A(2[AC,`='G^^$H[CC[
+M+0`D`"T`./LH[OOAT>?,`?P"!M_MVMH%UB?7)-;_T]S8W>O_""`='1OW",[[
+MP0;1)><[\B_Q".KFY>#I\/S[&_`OW"#7].?-]LOQZMX'V@[T#1@8(BT"+M,3
+MPO?;^@87'207"@S=$LLFX"T`&A'^%?<="B8C&2GQ'LX5TQOY(A<6%O4(V@_@
+M)@0K*P\Z]"_^%R8`/>DFT?[&]-4/_"L@)B8/"PCJ%MX7Y?GKT^+.U_'=&?8F
+M"1T"%>81TP#:X.[+]-WI"N,D^A<E^C[W+1/^+MXMZ1@,#28.(@</Z@K+&<TI
+M]"0@$"\%&Q#\(.D:Y?CJT?'%\MOG^M$%P?C.Y??C'?@@%?\HW2W<*O\I)"HG
+M)@47V`##Z=C:!=8GUR36_]/<V-WK_P@@'1T;]PC.^\$&T27G._(O\0CJYN7@
+MZ?#\^QOP+]P@U_3GS?;+\>K>!]H.]`T8&"(M`B[3$\+WV_H&%QTD%PH,W1++
+M)N`M`!H1_A7W'0HF(QDI\1[.%=,;^2(7%A;U"-H/X"8$*RL/.O0O_A<F`#WI
+M)M'^QO35#_PK("8F#PL(ZA;>%^7YZ]/BSM?QW1GV)@D=`A7F$=,`VN#NR_3=
+MZ0KC)/H7)?H^]RT3_B[>+>D8#`TF#B('#^H*RQG-*?0D(!`O!1L0_"#I&N7X
+MZM'QQ?+;Y_K1!<'XSN7WXQWX(!7_*-TMW"K_*20J)R8%%]@`P^G8V@76)]<D
+MUO_3W-C=Z_\((!T=&_<(SOO!!M$EYSOR+_$(ZN;EX.GP_/L;\"_<(-?TY\WV
+MR_'JW@?:#O0-&!@B+0(NTQ/"]]OZ!A<=)!<*#-T2RR;@+0`:$?X5]QT*)B,9
+M*?$>SA73&_DB%Q86]0C:#^`F!"LK#SKT+_X7)@`]Z282$@$`$```````````
+M```````````````!``(```````$``@```````@`!```````"``$`````````
+M```````````````````````!`@```@$``````'0!`@,$!08'"`D*"PP-#@\0
+M$1(3%!46%Q@9&AL<'1X?("$B(R0E)B<H*2HK+"TN+S`Q,C,T-38W.#DZ.SP]
+M/C]`04)#1$5&1TA)2DM,34Y/4%%24U155E=865I;7%U>7V!A8F-D969G:&EJ
+M:VQM;F]P<7)S='5V=WAY>GM\?7Y_``8``#"8`'4P^&O5``#+P&``(P``$@``
+M`````0$!%@$0```````!`0X``P$!``$`!`,#`P,#``H`!`H```````$"```"
+M`@0$&!@8&!@8&!@8&!@8&!@8&!@8&!@@&!@8&!@8&!@8&!@@%!H8&)0:&!@0
+M&A@8$!H8&`H:&!@*&A@8$!H8&!`:&!@8(!P<&"PD&!@E(!T:-RL$!!$,"08C
+M%Q@:%!04%A04`0`!``(``@`#``,`!``%``8`"``*``T`$``4`!D`(``H`#(`
+M/P!/`&0`?@">`,@`^P`\`8X!]0%W`AH#Z`/K!#$&RP?0"5H,C0^4$Z88!Q\0
+M)RTQZ3WQ31]BAWN#F\?#>/8!``$``0`!`-````#_`!X`_/\``#T````D``H`
+M'@`6`````0`"`'0`(`````````````````$*+%Y_?UXL"@$`````````````
+M```````````````#&%1_5!@#`````````````0```!$````1`!,`$``_``$`
+M/P#_`/\``0```!D`*@`*`/\```"6`#(`9`````$``&$``!0````!``(``P`$
+M``4`!@`'``@`"0`*``L`#``-``X`#P`0`!$`$@`3`!0`%0`6`!<`&``9`!H`
+M&P`<`!T`'@`?`"``(0`B`",`)``E`"8`)P`H`"D`*@`K`"P`+0`N`"\`,``Q
+M`#(`,P`T`#4`-@`W`#@`.0`Z`#L`/``]`#X`/P!``$$`0@!#`$0`10!&`$<`
+M2`!)`$H`2P!,`$T`3@!/`%``40!2`%,`5`!5`%8`5P!8`%D`6@!;`%P`70!>
+M`%\`8`!A`&(`8P!D`&4`9@!G`&@`:0!J`&L`;`!M`&X`;P!P`'$`<@!S`'0`
+M=0!V`'<`>`!Y`'H`>P!\`'T`?@!_````&``N`$(`50!G`'@`AP"5`*(`K@"Y
+M`,,`RP#3`-H`X0#F`.L`[P#S`/8`^`#Z`/P`_0#^`/X`_P#_`/\`_P`2````
+M`````/\`_P"O`.T``````'!H>5]I;FET:6%L:7IA=&EO;BYC``````$``0"N
+M'P``KA,``.^`````````````````````````<&]W97)?<F5S=6UE+F,``$-A
+M;&EB4F5A9%=R:71E+F,`````5&5M<&5R871U<F5#86QI8BYC``!4>&1M86%R
+M8RYC``!2>&1M86%R8RYC``#9V]W?EYF"`(&"``#9@-N`W8#?@)>`F8!$0T]F
+M9G-E="YC``"0GZBN@8"L@I4```!&:6QT97)S0V%L:6(N8P``@H&`I4E10V%L
+M:6(N8P````D+%!@/````"PL4&`L```![=6YH8EU74DY*14(^.C<T,0```%1X
+M4&]W97)#86QI8D)'+F,`````5'A0;W=E<D-A;&EB04)'+F,`````````````
+M`$QM86,N8P``4&MT='@N8P#P\/#P````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M``````````````#W`@#@!```````````````````Q`D`````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+&````````
+`
+end
diff --git a/sys/contrib/dev/nve/adapter.h b/sys/contrib/dev/nve/adapter.h
new file mode 100644
index 0000000..40520e9
--- /dev/null
+++ b/sys/contrib/dev/nve/adapter.h
@@ -0,0 +1,583 @@
+/***************************************************************************\
+|* *|
+|* Copyright 2001-2004 NVIDIA Corporation. All Rights Reserved. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROPRIETARY AND CONFIDENTIAL *|
+|* TO NVIDIA, CORPORATION. USE, REPRODUCTION OR DISCLOSURE TO ANY *|
+|* THIRD PARTY IS SUBJECT TO WRITTEN PRE-APPROVAL BY NVIDIA, CORP. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROVIDED "AS IS" WITHOUT *|
+|* EXPRESS OR IMPLIED WARRANTY OF ANY KIND, INCLUDING ALL IMPLIED *|
+|* WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A *|
+|* PARTICULAR PURPOSE. *|
+|* *|
+\***************************************************************************/
+
+/*
+ FILE: adapter.h
+ DATE: 2/7/00
+
+ This file contains the hardware interface to the ethernet adapter.
+*/
+
+#ifndef _ADAPTER_H_
+#define _ADAPTER_H_
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define HDA_VERSION_STRING "HDR A: $Revision: #46 $"
+
+#ifdef MODS_NETWORK_BUILD
+#ifndef _DRVAPP_H_
+#include "drvapp.h"
+#endif
+#endif
+
+//////////////////////////////////////////////////////////////////
+// For the set and get configuration calls.
+typedef struct _ADAPTER_CONFIG
+{
+ NV_UINT32 ulFlags;
+} ADAPTER_CONFIG, *PADAPTER_CONFIG;
+//////////////////////////////////////////////////////////////////
+
+typedef struct _ADAPTER_WRITE_OFFLOAD
+{
+ NV_UINT32 usBitmask;
+ NV_UINT32 ulMss;
+
+} ADAPTER_WRITE_OFFLOAD;
+
+//////////////////////////////////////////////////////////////////
+// For the ADAPTER_Write1 call.
+/* This scatter gather list should be same as defined in ndis.h by MS.
+ For ULONG_PTR MS header file says that it will be of same size as
+ pointer. It has been defined to take care of casting between differenet
+ sizes.
+*/
+typedef struct _NVSCATTER_GATHER_ELEMENT {
+ NV_UINT32 PhysLow;
+ NV_UINT32 PhysHigh;
+ NV_UINT32 Length;
+ NV_VOID *Reserved;
+} NVSCATTER_GATHER_ELEMENT, *PNVSCATTER_GATHER_ELEMENT;
+
+#ifndef linux
+#pragma warning(disable:4200)
+#endif
+typedef struct _NVSCATTER_GATHER_LIST {
+ NV_UINT32 NumberOfElements;
+ NV_VOID *Reserved;
+ NVSCATTER_GATHER_ELEMENT Elements[0]; // Made 0 sized element to remove MODS compilation error
+ // Elements[0] and Elements[] have the same effect.
+ // sizeof(NVSCATTER_GATHER_LIST) is the same (value of 8) in both cases
+ // And both lead to Warning 4200 in MSVC
+} NVSCATTER_GATHER_LIST, *PNVSCATTER_GATHER_LIST;
+#ifndef linux
+#pragma warning(default:4200)
+#endif
+
+typedef struct _ADAPTER_WRITE_DATA1
+{
+ NV_UINT32 ulTotalLength;
+ PNV_VOID pvID;
+ NV_UINT8 uc8021pPriority;
+ ADAPTER_WRITE_OFFLOAD *psOffload;
+ PNVSCATTER_GATHER_LIST pNVSGL;
+} ADAPTER_WRITE_DATA1, *PADAPTER_WRITE_DATA1;
+
+
+//////////////////////////////////////////////////////////////////
+// For the ADAPTER_Write call.
+typedef struct _ADAPTER_WRITE_ELEMENT
+{
+ PNV_VOID pPhysical;
+ NV_UINT32 ulLength;
+} ADAPTER_WRITE_ELEMENT, *PADAPTER_WRITE_ELEMENT;
+
+
+#define ADAPTER_WRITE_OFFLOAD_BP_SEGOFFLOAD 0
+#define ADAPTER_WRITE_OFFLOAD_BP_IPV4CHECKSUM 1
+#define ADAPTER_WRITE_OFFLOAD_BP_IPV6CHECKSUM 2
+#define ADAPTER_WRITE_OFFLOAD_BP_TCPCHECKSUM 3
+#define ADAPTER_WRITE_OFFLOAD_BP_UDPCHECKSUM 4
+#define ADAPTER_WRITE_OFFLOAD_BP_IPCHECKSUM 5
+
+
+// pvID is a value that will be passed back into OSAPI.pfnPacketWasSent
+// when the transmission completes. if pvID is NULL, the ADAPTER code
+// assumes the caller does not want the pfnPacketWasSent callback.
+typedef struct _ADAPTER_WRITE_DATA
+{
+ NV_UINT32 ulNumberOfElements;
+ NV_UINT32 ulTotalLength;
+ PNV_VOID pvID;
+ NV_UINT8 uc8021pPriority;
+ ADAPTER_WRITE_OFFLOAD *psOffload;
+#ifdef linux
+ ADAPTER_WRITE_ELEMENT sElement[32];
+#else
+ ADAPTER_WRITE_ELEMENT sElement[100];
+#endif
+} ADAPTER_WRITE_DATA, *PADAPTER_WRITE_DATA;
+//////////////////////////////////////////////////////////////////
+
+
+
+//////////////////////////////////////////////////////////////////
+// For the ADAPTER_Read call.
+typedef struct _ADAPTER_READ_ELEMENT
+{
+ PNV_VOID pPhysical;
+ NV_UINT32 ulLength;
+} ADAPTER_READ_ELEMENT, *PADAPTER_READ_ELEMENT;
+
+typedef struct _ADAPTER_READ_OFFLOAD
+{
+ NV_UINT8 ucChecksumStatus;
+
+} ADAPTER_READ_OFFLOAD;
+
+typedef struct _ADAPTER_READ_DATA
+{
+ NV_UINT32 ulNumberOfElements;
+ NV_UINT32 ulTotalLength;
+ PNV_VOID pvID;
+ NV_UINT32 ulFilterMatch;
+ ADAPTER_READ_OFFLOAD sOffload;
+ ADAPTER_READ_ELEMENT sElement[10];
+} ADAPTER_READ_DATA, *PADAPTER_READ_DATA;
+
+
+#define RDFLAG_CHK_NOCHECKSUM 0
+#define RDFLAG_CHK_IPPASSTCPFAIL 1
+#define RDFLAG_CHK_IPPASSUDPFAIL 2
+#define RDFLAG_CHK_IPFAIL 3
+#define RDFLAG_CHK_IPPASSNOTCPUDP 4
+#define RDFLAG_CHK_IPPASSTCPPASS 5
+#define RDFLAG_CHK_IPPASSUDPPASS 6
+#define RDFLAG_CHK_RESERVED 7
+
+
+// The ulFilterMatch flag can be a logical OR of the following
+#define ADREADFL_UNICAST_MATCH 0x00000001
+#define ADREADFL_MULTICAST_MATCH 0x00000002
+#define ADREADFL_BROADCAST_MATCH 0x00000004
+//////////////////////////////////////////////////////////////////
+
+
+
+//////////////////////////////////////////////////////////////////
+// For the ADAPTER_GetPowerCapabilities call.
+typedef struct _ADAPTER_POWERCAPS
+{
+ NV_UINT32 ulPowerFlags;
+ NV_UINT32 ulMagicPacketWakeUpFlags;
+ NV_UINT32 ulPatternWakeUpFlags;
+ NV_UINT32 ulLinkChangeWakeUpFlags;
+ NV_SINT32 iMaxWakeUpPatterns;
+} ADAPTER_POWERCAPS, *PADAPTER_POWERCAPS;
+
+// For the ADAPTER_GetPowerState and ADAPTER_SetPowerState call.
+typedef struct _ADAPTER_POWERSTATE
+{
+ NV_UINT32 ulPowerFlags;
+ NV_UINT32 ulMagicPacketWakeUpFlags;
+ NV_UINT32 ulPatternWakeUpFlags;
+ NV_UINT32 ulLinkChangeWakeUpFlags;
+} ADAPTER_POWERSTATE, *PADAPTER_POWERSTATE;
+
+// Each of the flag fields in the POWERCAPS structure above can have
+// any of the following bitflags set giving the capabilites of the
+// adapter. In the case of the wake up fields, these flags mean that
+// wake up can happen from the specified power state.
+
+// For the POWERSTATE structure, the ulPowerFlags field should just
+// have one of these bits set to go to that particular power state.
+// The WakeUp fields can have one or more of these bits set to indicate
+// what states should be woken up from.
+#define POWER_STATE_D0 0x00000001
+#define POWER_STATE_D1 0x00000002
+#define POWER_STATE_D2 0x00000004
+#define POWER_STATE_D3 0x00000008
+
+#define POWER_STATE_ALL (POWER_STATE_D0 | \
+ POWER_STATE_D1 | \
+ POWER_STATE_D2 | \
+ POWER_STATE_D3)
+//////////////////////////////////////////////////////////////////
+
+
+
+//////////////////////////////////////////////////////////////////
+// The ADAPTER_GetPacketFilterCaps call returns a NV_UINT32 that can
+// have the following capability bits set.
+#define ACCEPT_UNICAST_PACKETS 0x00000001
+#define ACCEPT_MULTICAST_PACKETS 0x00000002
+#define ACCEPT_BROADCAST_PACKETS 0x00000004
+#define ACCEPT_ALL_PACKETS 0x00000008
+
+#define ETH_LENGTH_OF_ADDRESS 6
+
+// The ADAPTER_SetPacketFilter call uses this structure to know what
+// packet filter to set. The ulPacketFilter field can contain some
+// union of the bit flags above. The acMulticastMask array holds a
+// 48 bit MAC address mask with a 0 in every bit position that should
+// be ignored on compare and a 1 in every bit position that should
+// be taken into account when comparing to see if the destination
+// address of a packet should be accepted for multicast.
+typedef struct _PACKET_FILTER
+{
+ NV_UINT32 ulFilterFlags;
+ NV_UINT8 acMulticastAddress[ETH_LENGTH_OF_ADDRESS];
+ NV_UINT8 acMulticastMask[ETH_LENGTH_OF_ADDRESS];
+} PACKET_FILTER, *PPACKET_FILTER;
+//////////////////////////////////////////////////////////////////
+
+
+//////////////////////////////////////////////////////////////////
+// A WAKE_UP_PATTERN is a 128-byte pattern that the adapter can
+// look for in incoming packets to decide when to wake up. Higher-
+// level protocols can use this to, for example, wake up the
+// adapter whenever it sees an IP packet that is addressed to it.
+// A pattern consists of 128 bits of byte masks that indicate
+// which bytes in the packet are relevant to the pattern, plus
+// values for each byte.
+#define WAKE_UP_PATTERN_SIZE 128
+
+typedef struct _WAKE_UP_PATTERN
+{
+ NV_UINT32 aulByteMask[WAKE_UP_PATTERN_SIZE/32];
+ NV_UINT8 acData[WAKE_UP_PATTERN_SIZE];
+} WAKE_UP_PATTERN, *PWAKE_UP_PATTERN;
+
+
+
+//
+//
+// Adapter offload
+//
+typedef struct _ADAPTER_OFFLOAD {
+
+ NV_UINT32 Type;
+ NV_UINT32 Value0;
+
+} ADAPTER_OFFLOAD, *PADAPTER_OFFLOAD;
+
+#define ADAPTER_OFFLOAD_VLAN 0x00000001
+#define ADAPTER_OFFLOAD_IEEE802_1P 0x00000002
+#define ADAPTER_OFFLOAD_IEEE802_1PQ_PAD 0x00000004
+
+//////////////////////////////////////////////////////////////////
+
+// CMNDATA_OS_ADAPTER
+// Structure common to OS and Adapter layers
+// Used for moving data from the OS layer to the adapter layer through SetCommonData
+// function call from OS layer to Adapter layer
+//
+
+typedef struct _CMNDATA_OS_ADAPTER
+{
+#ifndef linux
+ ASF_SEC0_BASE sRegSec0Base;
+#endif
+ NV_UINT32 bFPGA;
+ NV_UINT32 ulFPGAEepromSize;
+ NV_UINT32 bChecksumOffloadEnable;
+ NV_UINT32 ulChecksumOffloadBM;
+ NV_UINT32 ulChecksumOffloadOS;
+ NV_UINT32 ulMediaIF;
+ NV_UINT32 bOemCustomEventRead;
+
+ // Debug only right now
+ //!!! Beware mods is relying on the fields blow.
+ NV_UINT32 ulWatermarkTFBW;
+ NV_UINT32 ulBackoffRseed;
+ NV_UINT32 ulBackoffSlotTime;
+ NV_UINT32 ulModeRegTxReadCompleteEnable;
+ NV_UINT32 ulFatalErrorRegister;
+
+} CMNDATA_OS_ADAPTER;
+
+
+//////////////////////////////////////////////////////////////////
+// The functional typedefs for the ADAPTER Api
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_CLOSE) (PNV_VOID pvContext, NV_UINT8 ucIsPowerDown);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_INIT) (PNV_VOID pvContext, NV_UINT16 usForcedSpeed, NV_UINT8 ucForceDpx, NV_UINT8 ucForceMode, NV_UINT8 ucAsyncMode, NV_UINT32 *puiLinkState);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_DEINIT) (PNV_VOID pvContext, NV_UINT8 ucIsPowerDown);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_START) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_STOP) (PNV_VOID pvContext, NV_UINT8 ucIsPowerDown);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_QUERY_WRITE_SLOTS) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_WRITE) (PNV_VOID pvContext, ADAPTER_WRITE_DATA *pADWriteData);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_WRITE1) (PNV_VOID pvContext, ADAPTER_WRITE_DATA1 *pADWriteData1);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_QUERY_INTERRUPT) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_HANDLE_INTERRUPT) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_DISABLE_INTERRUPTS) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_ENABLE_INTERRUPTS) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_CLEAR_INTERRUPTS) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_CLEAR_TX_DESC) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_GET_LINK_SPEED) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_GET_LINK_MODE) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_GET_LINK_STATE) (PNV_VOID pvContext, NV_UINT32 *pulLinkState);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_IS_LINK_INITIALIZING) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_RESET_PHY_INIT_STATE) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_GET_TRANSMIT_QUEUE_SIZE) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_GET_RECEIVE_QUEUE_SIZE) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_GET_STATISTICS) (PNV_VOID pvContext, PADAPTER_STATS pADStats);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_GET_POWER_CAPS) (PNV_VOID pvContext, PADAPTER_POWERCAPS pADPowerCaps);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_GET_POWER_STATE) (PNV_VOID pvContext, PADAPTER_POWERSTATE pADPowerState);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_SET_POWER_STATE) (PNV_VOID pvContext, PADAPTER_POWERSTATE pADPowerState);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_SET_LOW_SPEED_FOR_PM) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_GET_PACKET_FILTER_CAPS) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_SET_PACKET_FILTER) (PNV_VOID pvContext, PPACKET_FILTER pPacketFilter);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_SET_WAKE_UP_PATTERN) (PNV_VOID pvContext, NV_SINT32 iPattern, PWAKE_UP_PATTERN pPattern);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_ENABLE_WAKE_UP_PATTERN) (PNV_VOID pvContext, NV_SINT32 iPattern, NV_SINT32 iEnable);
+typedef NV_API_CALL NV_SINT32 (* PFN_SET_NODE_ADDRESS) (PNV_VOID pvContext, NV_UINT8 *pNodeAddress);
+typedef NV_API_CALL NV_SINT32 (* PFN_GET_NODE_ADDRESS) (PNV_VOID pvContext, NV_UINT8 *pNodeAddress);
+typedef NV_API_CALL NV_SINT32 (* PFN_GET_ADAPTER_INFO) (PNV_VOID pvContext, PNV_VOID pVoidPtr, NV_SINT32 iType, NV_SINT32 *piLength);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_READ_PHY) (PNV_VOID pvContext, NV_UINT32 ulPhyAddr, NV_UINT32 ulPhyReg, NV_UINT32 *pulValue);
+typedef NV_API_CALL NV_SINT32 (* PFN_ADAPTER_WRITE_PHY) (PNV_VOID pvContext, NV_UINT32 ulPhyAddr, NV_UINT32 ulPhyReg, NV_UINT32 ulValue);
+typedef NV_API_CALL NV_VOID(* PFN_ADAPTER_SET_SPPED_DUPLEX) (PNV_VOID pvContext);
+typedef NV_API_CALL NV_SINT32 (*PFN_REGISTER_OFFLOAD) (PNV_VOID pvContext, PADAPTER_OFFLOAD pOffload);
+typedef NV_API_CALL NV_SINT32 (*PFN_DEREGISTER_OFFLOAD) (PNV_VOID pvContext, PADAPTER_OFFLOAD pOffload);
+typedef NV_API_CALL NV_SINT32 (*PFN_RX_BUFF_READY) (PNV_VOID pvContext, PMEMORY_BLOCK pMemBlock, PNV_VOID pvID);
+
+#ifndef linux
+typedef NV_SINT32 (*PFN_ADAPTER_ASF_SETUPREGISTERS) (PNV_VOID pvContext, NV_SINT32 bInitTime);
+typedef NV_SINT32 (*PFN_ADAPTER_ASF_GETSEC0BASEADDRESS) (PNV_VOID pvContext, ASF_SEC0_BASE **ppsSec0Base);
+typedef NV_SINT32 (*PFN_ADAPTER_ASF_SETSOURCEIPADDRESS) (PNV_VOID pvContext, NV_UINT8 *pucSrcIPAddress);
+typedef NV_SINT32 (*PFN_ADAPTER_ASF_GETDESTIPADDRESS) (PNV_VOID pvContext, NV_UINT8 *pucDestIPAddress);
+typedef NV_SINT32 (*PFN_ADAPTER_ASF_SETDESTIPADDRESS) (PNV_VOID pvContext, NV_UINT8 *pucDestIPAddress);
+typedef NV_SINT32 (*PFN_ADAPTER_ASF_WRITEEEPROMANDSETUPREGISTERS) (PNV_VOID pvContext, NV_BOOLEAN bCompare, PNV_VOID pucValue, PNV_VOID pszSec0BaseMember,
+ NV_UINT16 usCount, NV_UINT32 ulAddressOffset);
+
+typedef NV_SINT32 (*PFN_ADAPTER_ASF_ISASFREADY) (PNV_VOID pvContext, ASF_ASFREADY *psASFReady);
+
+typedef NV_SINT32 (*PFN_ADAPTER_ASF_SETDESTMACADDRESS) (PNV_VOID pvContext, NV_UINT8 *pucDestMACAddress);
+typedef NV_SINT32 (*PFN_ADAPTER_ASF_GETSOURCEMACADDRESS) (PNV_VOID pvContext, NV_UINT8 *pucSrcMACAddress);
+
+typedef NV_SINT32 (*PFN_ADAPTER_ASF_CHECK_FOR_EEPROM_PRESENCE) (PNV_VOID pvContext);
+#endif
+
+typedef NV_API_CALL NV_VOID (*PFN_ADAPTER_SET_COMMONDATA) (PNV_VOID pvContext, CMNDATA_OS_ADAPTER *psOSAdpater);
+typedef NV_API_CALL NV_VOID (*PFN_ADAPTER_SET_CHECKSUMOFFLOAD) (PNV_VOID pvContext, NV_UINT32 bSet);
+
+
+
+typedef struct _ADAPTER_API
+{
+ // The adapter context
+ PNV_VOID pADCX;
+
+ // The adapter interface
+ PFN_ADAPTER_CLOSE pfnClose;
+ PFN_ADAPTER_INIT pfnInit;
+ PFN_ADAPTER_DEINIT pfnDeinit;
+ PFN_ADAPTER_START pfnStart;
+ PFN_ADAPTER_STOP pfnStop;
+ PFN_ADAPTER_QUERY_WRITE_SLOTS pfnQueryWriteSlots;
+ PFN_ADAPTER_WRITE pfnWrite;
+ PFN_ADAPTER_WRITE1 pfnWrite1;
+ PFN_ADAPTER_QUERY_INTERRUPT pfnQueryInterrupt;
+ PFN_ADAPTER_HANDLE_INTERRUPT pfnHandleInterrupt;
+ PFN_ADAPTER_DISABLE_INTERRUPTS pfnDisableInterrupts;
+ PFN_ADAPTER_ENABLE_INTERRUPTS pfnEnableInterrupts;
+ PFN_ADAPTER_CLEAR_INTERRUPTS pfnClearInterrupts;
+ PFN_ADAPTER_CLEAR_TX_DESC pfnClearTxDesc;
+ PFN_ADAPTER_GET_LINK_SPEED pfnGetLinkSpeed;
+ PFN_ADAPTER_GET_LINK_MODE pfnGetLinkMode;
+ PFN_ADAPTER_GET_LINK_STATE pfnGetLinkState;
+ PFN_ADAPTER_IS_LINK_INITIALIZING pfnIsLinkInitializing;
+ PFN_ADAPTER_RESET_PHY_INIT_STATE pfnResetPhyInitState;
+ PFN_ADAPTER_GET_TRANSMIT_QUEUE_SIZE pfnGetTransmitQueueSize;
+ PFN_ADAPTER_GET_RECEIVE_QUEUE_SIZE pfnGetReceiveQueueSize;
+ PFN_ADAPTER_GET_STATISTICS pfnGetStatistics;
+ PFN_ADAPTER_GET_POWER_CAPS pfnGetPowerCaps;
+ PFN_ADAPTER_GET_POWER_STATE pfnGetPowerState;
+ PFN_ADAPTER_SET_POWER_STATE pfnSetPowerState;
+ PFN_ADAPTER_SET_LOW_SPEED_FOR_PM pfnSetLowSpeedForPM;
+ PFN_ADAPTER_GET_PACKET_FILTER_CAPS pfnGetPacketFilterCaps;
+ PFN_ADAPTER_SET_PACKET_FILTER pfnSetPacketFilter;
+ PFN_ADAPTER_SET_WAKE_UP_PATTERN pfnSetWakeUpPattern;
+ PFN_ADAPTER_ENABLE_WAKE_UP_PATTERN pfnEnableWakeUpPattern;
+ PFN_SET_NODE_ADDRESS pfnSetNodeAddress;
+ PFN_GET_NODE_ADDRESS pfnGetNodeAddress;
+ PFN_GET_ADAPTER_INFO pfnGetAdapterInfo;
+ PFN_ADAPTER_SET_SPPED_DUPLEX pfnSetSpeedDuplex;
+ PFN_ADAPTER_READ_PHY pfnReadPhy;
+ PFN_ADAPTER_WRITE_PHY pfnWritePhy;
+ PFN_REGISTER_OFFLOAD pfnRegisterOffload;
+ PFN_DEREGISTER_OFFLOAD pfnDeRegisterOffload;
+ PFN_RX_BUFF_READY pfnRxBuffReady;
+#ifndef linux
+ PFN_ADAPTER_ASF_SETUPREGISTERS pfnASFSetupRegisters;
+ PFN_ADAPTER_ASF_GETSEC0BASEADDRESS pfnASFGetSec0BaseAddress;
+ PFN_ADAPTER_ASF_SETSOURCEIPADDRESS pfnASFSetSourceIPAddress;
+ PFN_ADAPTER_ASF_GETDESTIPADDRESS pfnASFGetDestIPAddress;
+ PFN_ADAPTER_ASF_SETDESTIPADDRESS pfnASFSetDestIPAddress;
+ PFN_ADAPTER_ASF_WRITEEEPROMANDSETUPREGISTERS pfnASFWriteEEPROMAndSetupRegisters;
+ PFN_ADAPTER_ASF_SETDESTMACADDRESS pfnASFSetDestMACAddress;
+ PFN_ADAPTER_ASF_GETSOURCEMACADDRESS pfnASFGetSourceMACAddress;
+ PFN_ADAPTER_ASF_ISASFREADY pfnASFIsASFReady;
+ PFN_ADAPTER_ASF_CHECK_FOR_EEPROM_PRESENCE pfnASFCheckForEepromPresence;
+#endif
+ PFN_ADAPTER_SET_COMMONDATA pfnSetCommonData;
+
+ PFN_ADAPTER_SET_CHECKSUMOFFLOAD pfnSetChecksumOffload;
+
+} ADAPTER_API, *PADAPTER_API;
+//////////////////////////////////////////////////////////////////
+
+#define MAX_PACKET_TO_ACCUMULATE 16
+
+typedef struct _ADAPTER_OPEN_PARAMS
+{
+ PNV_VOID pOSApi; //pointer to OSAPI structure passed from higher layer
+ PNV_VOID pvHardwareBaseAddress; //memory mapped address passed from higher layer
+ NV_UINT32 ulPollInterval; //poll interval in micro seconds. Used in polling mode
+ NV_UINT32 MaxDpcLoop; //Maximum number of times we loop to in function ADAPTER_HandleInterrupt
+ NV_UINT32 MaxRxPkt; //Maximum number of packet we process each time in function UpdateReceiveDescRingData
+ NV_UINT32 MaxTxPkt; //Maximum number of packet we process each time in function UpdateTransmitDescRingData
+ NV_UINT32 MaxRxPktToAccumulate; //maximum number of rx packet we accumulate in UpdateReceiveDescRingData before
+ //indicating packets to OS.
+ NV_UINT32 SentPacketStatusSuccess; //Status returned from adapter layer to higher layer when packet was sent successfully
+ NV_UINT32 SentPacketStatusFailure; ////Status returned from adapter layer to higher layer when packet send was unsuccessful
+ NV_UINT32 SetForcedModeEveryNthRxPacket; //NOT USED: For experiment with descriptor based interrupt
+ NV_UINT32 SetForcedModeEveryNthTxPacket; //NOT USED: For experiment with descriptor based interrupt
+ NV_UINT32 RxForcedInterrupt; //NOT USED: For experiment with descriptor based interrupt
+ NV_UINT32 TxForcedInterrupt; //NOT USED: For experiment with descriptor based interrupt
+ NV_UINT32 DeviceId; //Of MAC
+ NV_UINT32 DeviceType;
+ NV_UINT32 PollIntervalInusForThroughputMode; //Of MAC
+ NV_UINT32 bASFEnabled;
+ NV_UINT32 ulDescriptorVersion;
+ NV_UINT32 ulMaxPacketSize;
+
+
+#define MEDIA_IF_AUTO 0
+#define MEDIA_IF_RGMII 1
+#define MEDIA_IF_MII 2
+ NV_UINT32 ulMediaIF;
+
+ NV_UINT32 PhyPowerIsolationTimeoutInms;
+ NV_UINT32 PhyResetTimeoutInms;
+ NV_UINT32 PhyAutonegotiateTimeoutInms;
+ NV_UINT32 PhyLinkupTimeoutInms;
+ NV_UINT32 PhyRdWrTimeoutInus;
+ NV_UINT32 PhyPowerdownOnClose;
+
+ // Added for Bug 100715
+ NV_UINT32 bDisableMIIInterruptAndReadPhyStatus;
+
+}ADAPTER_OPEN_PARAMS, *PADAPTER_OPEN_PARAMS;
+
+//////////////////////////////////////////////////////////////////
+// This is the one function in the adapter interface that is publicly
+// available. The rest of the interface is returned in the pAdapterApi.
+// The first argument needs to be cast to a OSAPI structure pointer.
+// The second argument should be cast to a ADPATER_API structure pointer.
+NV_API_CALL NV_SINT32 ADAPTER_Open (PADAPTER_OPEN_PARAMS pAdapterOpenParams, PNV_VOID *pvpAdapterApi, NV_UINT32 *pulPhyAddr);
+
+//////////////////////////////////////////////////////////////////
+
+
+
+//////////////////////////////////////////////////////////////////
+// Here are the error codes the adapter function calls return.
+#define ADAPTERERR_NONE 0x0000
+#define ADAPTERERR_COULD_NOT_ALLOC_CONTEXT 0x0001
+#define ADAPTERERR_COULD_NOT_CREATE_CONTEXT 0x0002
+#define ADAPTERERR_COULD_NOT_OPEN_PHY 0x0003
+#define ADAPTERERR_TRANSMIT_QUEUE_FULL 0x0004
+#define ADAPTERERR_COULD_NOT_INIT_PHY 0x0005
+#define ADAPTERERR_PHYS_SIZE_SMALL 0x0006
+#define ADAPTERERR_ERROR 0x0007 // Generic error
+//////////////////////////////////////////////////////////////////
+
+// This block moved from myadap.h
+// nFlag for Stop/Start ReceiverAndOrTransmitter can be an OR of
+// the following two flags
+#define AFFECT_RECEIVER 0x01
+#define AFFECT_TRANSMITTER 0x02
+
+#define REDUCE_LENGTH_BY 48
+
+#define EXTRA_WRITE_SLOT_TO_REDUCE_PER_SEND 4
+#define MAX_TX_DESCS 256
+#define MAX_TX_DESCS_VER2 (256 * 4)
+
+typedef struct _TX_INFO_ADAP
+{
+ NV_UINT32 NoOfDesc;
+ PNV_VOID pvVar2;
+}TX_INFO_ADAP, *PTX_INFO_ADAP;
+
+#define WORKAROUND_FOR_MCP3_TX_STALL
+
+#ifdef WORKAROUND_FOR_MCP3_TX_STALL
+NV_SINT32 ADAPTER_WorkaroundTXHang(PNV_VOID pvContext);
+#endif
+
+//#define TRACK_INIT_TIME
+
+#ifdef TRACK_INIT_TIME
+//This routine is defined in entry.c adapter doesn't link int64.lib
+//We defined here so that its easy to use it in phy as well as mswin
+
+#define MAX_PRINT_INDEX 32
+extern NV_VOID PrintTime(NV_UINT32 ulIndex);
+#define PRINT_INIT_TIME(_a) PrintTime((_a))
+#else
+#define PRINT_INIT_TIME(_a)
+#endif
+
+// Segmentation offload info
+#define DEVCAPS_SEGOL_BP_ENABLE 0
+#define DEVCAPS_SEGOL_BP_IPOPTIONS 1
+#define DEVCAPS_SEGOL_BP_TCPOPTIONS 2
+#define DEVCAPS_SEGOL_BP_SEGSIZE_LO 8
+#define DEVCAPS_SEGOL_BP_SEGSIZE_HI 31
+
+
+// Checksum offload info
+// Byte 0 : V4 TX
+#define DEVCAPS_V4_TX_BP_IPOPTIONS 0
+#define DEVCAPS_V4_TX_BP_TCPOPTIONS 1
+#define DEVCAPS_V4_TX_BP_TCPCHECKSUM 2
+#define DEVCAPS_V4_TX_BP_UDPCHECKSUM 3
+#define DEVCAPS_V4_TX_BP_IPCHECKSUM 4
+
+// Byte 0 : V4 RX
+#define DEVCAPS_V4_RX_BP_IPOPTIONS 8
+#define DEVCAPS_V4_RX_BP_TCPOPTIONS 9
+#define DEVCAPS_V4_RX_BP_TCPCHECKSUM 10
+#define DEVCAPS_V4_RX_BP_UDPCHECKSUM 11
+#define DEVCAPS_V4_RX_BP_IPCHECKSUM 12
+
+// Byte 1 : V6 TX
+#define DEVCAPS_V6_TX_BP_IPOPTIONS 16
+#define DEVCAPS_V6_TX_BP_TCPOPTIONS 17
+#define DEVCAPS_V6_TX_BP_TCPCHECKSUM 18
+#define DEVCAPS_V6_TX_BP_UDPCHECKSUM 19
+
+// Byte 2 : V6 RX
+#define DEVCAPS_V6_RX_BP_IPOPTIONS 24
+#define DEVCAPS_V6_RX_BP_TCPOPTIONS 25
+#define DEVCAPS_V6_RX_BP_TCPCHECKSUM 26
+#define DEVCAPS_V6_RX_BP_UDPCHECKSUM 27
+
+
+#define DESCR_VER_1 1 // MCP1, MCP2 and CK8 descriptor version
+#define DESCR_VER_2 2 // The decsriptor structure for CK8G
+
+// Get device and vendor IDs from 32 bit DeviceVendorID
+#define GET_DEVICEID(x) (((x) >> 16) & 0xFFFF)
+#define GET_VENDORID(x) ((x) & 0xFFFF)
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif // _ADAPTER_H_
diff --git a/sys/contrib/dev/nve/amd64/nvenetlib.README b/sys/contrib/dev/nve/amd64/nvenetlib.README
new file mode 100644
index 0000000..fd4f6b8
--- /dev/null
+++ b/sys/contrib/dev/nve/amd64/nvenetlib.README
@@ -0,0 +1,52 @@
+$FreeBSD$
+
+The installation and use of this software is subject to the following license terms and conditions:
+
+License For Customer Use of NVIDIA Software
+
+IMPORTANT NOTICE -- READ CAREFULLY: This License For Customer Use of NVIDIA Software ("LICENSE") is the agreement which governs use of the software of NVIDIA Corporation and its subsidiaries (“NVIDIA”) enclosed herewith, including computer software and associated printed materials ("SOFTWARE"). By downloading, installing, copying, or otherwise using the SOFTWARE, you agree to be bound by the terms of this LICENSE. If you do not agree to the terms of this LICENSE, do not download, install or use the SOFTWARE.
+
+RECITALS
+Use of NVIDIA's products requires three elements: the SOFTWARE, the hardware on a computer motherboard, and a personal computer. The SOFTWARE is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The SOFTWARE is not sold, and instead is only licensed for use, strictly in accordance with this document. The hardware is protected by various patents, and is sold, but this agreement does not cover that sale, since it may not necessarily be sold as a package with the SOFTWARE. This agreement sets forth the terms and conditions of the SOFTWARE LICENSE only.
+
+1. DEFINITIONS
+
+1.1 Customer. Customer means the entity or individual that installs or uses the SOFTWARE.
+
+2. GRANT OF LICENSE
+
+2.1 Rights and Limitations of Grant. NVIDIA hereby grants Customer the following non-exclusive, non-transferable right to use the SOFTWARE, with the following limitations:
+
+2.1.1 Rights. Customer may install and use one copy of the SOFTWARE on a single computer, and except for making one back-up copy of the Software, may not otherwise copy the SOFTWARE. This LICENSE of SOFTWARE may not be shared or used concurrently on different computers.
+
+2.1.2 Linux/FreeBSD Exception. Notwithstanding the foregoing terms of Section 2.1.1, SOFTWARE designed exclusively for use on the Linux operating system may be copied and redistributed, provided that the binary files thereof are not modified in any way (except for uncompressing/compressing files). SOFTWARE designed exclusively for use on the Linux Operating system but which has been authorized by NVIDIA for use on the FreeBSD Operating System may also be copied and redistributed, provided that the binary files thereof are not modified in any way (except for unzipping of compressed files).
+
+2.1.3 Limitations.
+
+No Reverse Engineering. Customer may not reverse engineer, decompile, or disassemble the SOFTWARE, nor attempt in any other manner to obtain the source code.
+
+No Separation of Components. The SOFTWARE is licensed as a single product. Its component parts may not be separated for use on more than one computer, nor otherwise used separately from the other parts.
+
+No Rental. Customer may not rent or lease the SOFTWARE to someone else.
+
+3. TERMINATION
+
+This LICENSE will automatically terminate if Customer fails to comply with any of the terms and conditions hereof. In such event, Customer must destroy all copies of the SOFTWARE and all of its component parts.
+
+4. COPYRIGHT
+
+All title and copyrights in and to the SOFTWARE (including but not limited to all images, photographs, animations, video, audio, music, text, and other information incorporated into the SOFTWARE), the accompanying printed materials, and any copies of the SOFTWARE, are owned by NVIDIA, or its suppliers. The SOFTWARE is protected by copyright laws and international treaty provisions. Accordingly, Customer is required to treat the SOFTWARE like any other copyrighted material, except as otherwise allowed pursuant to this LICENSE and that it may make one copy of the SOFTWARE solely for backup or archive purposes.
+
+5. APPLICABLE LAW
+
+This agreement shall be deemed to have been made in, and shall be construed pursuant to, the laws of the State of California.
+
+6. DISCLAIMER OF WARRANTIES AND LIMITATION ON LIABILITY
+
+6.1 No Warranties. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE SOFTWARE IS PROVIDED "AS IS" AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+6.2 No Liability for Consequential Damages. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. MISCELLANEOUS
+
+The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. If any provision of this LICENSE is inconsistent with, or cannot be fully enforced under, the law, such provision will be construed as limited to the extent necessary to be consistent with and fully enforceable under the law. This agreement is the final, complete and exclusive agreement between the parties relating to the subject matter hereof, and supersedes all prior or contemporaneous understandings and agreements relating to such subject matter, whether oral or written. Customer agrees that it will not ship, transfer or export the SOFTWARE into any country, or use the SOFTWARE in any manner, prohibited by the United States Bureau of Export Administration or any export laws, restrictions or regulations. This LICENSE may only be modified in writing signed by an authorized officer of NVIDIA.
diff --git a/sys/contrib/dev/nve/amd64/nvenetlib.o.bz2.uu b/sys/contrib/dev/nve/amd64/nvenetlib.o.bz2.uu
new file mode 100644
index 0000000..b4a4428
--- /dev/null
+++ b/sys/contrib/dev/nve/amd64/nvenetlib.o.bz2.uu
@@ -0,0 +1,321 @@
+$FreeBSD$
+begin-base64 644 nvenetlib.o.bz2
+QlpoOTFBWSZTWQrVCikAPRD////////////////////////////+////////////////4ETdfd7c
+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
+6e5tIR140NovoAX/8XckU4UJAK1QopA=
+====
diff --git a/sys/contrib/dev/nve/basetype.h b/sys/contrib/dev/nve/basetype.h
new file mode 100644
index 0000000..fd38148
--- /dev/null
+++ b/sys/contrib/dev/nve/basetype.h
@@ -0,0 +1,281 @@
+/***************************************************************************\
+|* *|
+|* Copyright 2001-2004 NVIDIA Corporation. All Rights Reserved. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROPRIETARY AND CONFIDENTIAL *|
+|* TO NVIDIA, CORPORATION. USE, REPRODUCTION OR DISCLOSURE TO ANY *|
+|* THIRD PARTY IS SUBJECT TO WRITTEN PRE-APPROVAL BY NVIDIA, CORP. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROVIDED "AS IS" WITHOUT *|
+|* EXPRESS OR IMPLIED WARRANTY OF ANY KIND, INCLUDING ALL IMPLIED *|
+|* WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A *|
+|* PARTICULAR PURPOSE. *|
+|* *|
+\***************************************************************************/
+
+
+/*++
+
+File:
+
+ basetype.h
+
+
+Abstract:
+
+ This file contains the base type definitions used by the networking driver.
+
+
+Revision History:
+
+ SNo. Date Author Description
+ 1. 2/7/2000 AJha Created
+
+*/
+
+#ifndef _BASETYPE_H_
+#define _BASETYPE_H_
+
+#ifndef IN
+#define IN
+#endif
+
+#ifndef OUT
+#define OUT
+#endif
+
+//
+// Useful "types"
+
+#ifndef NULL
+#define NULL 0
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+#if 1
+//
+// Don't use as these are going to be deleted soon. Use NV_ instead
+//
+#define VOID void
+typedef VOID *PVOID;
+
+typedef unsigned char UCHAR;
+typedef UCHAR * PUCHAR;
+typedef unsigned short USHORT;
+typedef USHORT * PUSHORT;
+#ifdef linux
+typedef unsigned int ULONG;
+#else
+typedef unsigned long ULONG;
+#endif
+typedef ULONG * PULONG;
+
+typedef char CHAR;
+typedef short SHORT;
+typedef long LONG;
+
+typedef unsigned int UINT;
+typedef unsigned int *PUINT;
+
+
+#endif
+
+
+#define NV_VOID void
+typedef NV_VOID *PNV_VOID;
+
+typedef unsigned long NV_BOOLEAN, *PNV_BOOLEAN;
+
+typedef unsigned char NV_UINT8, *PNV_UINT8;
+typedef unsigned short NV_UINT16, *PNV_UINT16;
+#ifdef linux
+typedef unsigned int NV_UINT32, *PNV_UINT32;
+#else
+typedef unsigned long NV_UINT32, *PNV_UINT32;
+#endif
+
+typedef signed char NV_SINT8, *PNV_SINT8;
+typedef signed short NV_SINT16, *PNV_SINT16;
+typedef signed long NV_SINT32, *PNV_SINT32;
+
+
+#if defined(linux)
+
+ typedef unsigned long long NV_UINT64, *PNV_UINT64;
+ typedef signed long long NV_SINT64, *PNV_SINT64;
+
+#else
+ #if _MSC_VER >= 1200 // MSVC 6.0 onwards
+ typedef unsigned __int64 NV_UINT64, *PNV_UINT64;
+ typedef signed __int64 NV_SINT64, *PNV_SINT64;
+ #else
+ typedef unsigned long NV_UINT64, *PNV_UINT64;
+ typedef signed long NV_SINT64, *PNV_SINT64;
+ #endif
+
+#endif
+
+#ifndef _AMD64_
+typedef unsigned int NV_UINT;
+typedef signed int NV_INT;
+#else
+
+#if defined(linux)
+
+typedef unsigned long long NV_UINT;
+typedef signed long long NV_INT;
+
+#else
+
+typedef unsigned __int64 NV_UINT;
+typedef signed __int64 NV_INT;
+
+#endif
+#endif
+
+
+//
+// Floating point definitions
+//
+typedef float NV_REAL32; // 4-byte floating point
+typedef double NV_REAL64; // 8-byte floating point
+
+
+
+//
+// Bit defintions
+//
+#define NV_BIT(bitpos) (1 << (bitpos))
+
+// NV_BIT_SET
+// Sets the specified bit position (0..31).
+// Parameter bits can be 1 byte to 4 bytes, but the caller needs to make sure bitpos fits into it.
+// x = 0xA0
+// NV_BIT_SET(x, 1)
+// Result: x = 0xA2
+#define NV_BIT_SET(bits, bitpos) ((bits) |= (NV_BIT(bitpos)))
+
+// NV_BIT_CLEAR
+// Clears the specified bit position (0..31)
+// Parameter bits can be 1 byte to 4 bytes, but the caller needs to make sure bitpos fits into it.
+// x = 0xAA
+// NV_BIT_CLEAR(x, 1)
+// Result: x = 0xA8
+#define NV_BIT_CLEAR(bits, bitpos) ((bits) &= (~NV_BIT(bitpos)))
+
+// NV_BIT_GET
+// Gets the bit at the specified bit position (0..31)
+// Parameter bits can be 1 byte to 4 bytes, but the caller needs to make sure bitpos fits into it.
+// Result is either 1 or 0.
+// x = 0xAA
+// NV_BIT_GET(x, 1)
+// Result: x = 1
+#define NV_BIT_GET(bits, bitpos) (((bits) >> (bitpos)) & 0x0001)
+
+
+// NV_BIT_GETVALUE
+// Gets the value from a 32 bit ULONG at specified bit position.
+// Parameter bits needs to be 4 bytes long.
+// Ex. ul32 = 0xFEDCBA98
+// ulVal = NV_BIT_GETVALUE(ul32, 3, 0) : Gets value from Bit position 3 to 0
+// Result : ulVal = 8
+#define NV_BIT_GETVALUE(ulOrigValue, bitposHi, bitposLow) (((ulOrigValue) >> (bitposLow)) & (~(0xFFFFFFFF << ((bitposHi) - (bitposLow) +1))))
+
+// NV_BIT_SETVALUE
+// Set a value in a 32 bit ULONG at a specific bit position.
+// Parameter bits needs to be 4 bytes long.
+// Ex. ul32 = 0xFEDCBA98
+// NV_BIT_SETVALUE(ul32, 0xF, 3, 0) : Sets value at Bit position 3 to 0
+// Result : ul32 becomes 0xFEDCBA9F
+#define NV_BIT_SETVALUE(ulOrigValue, ulWindowValue, bitposHi, bitposLow) \
+ ((ulOrigValue) = ((((ulOrigValue) & (~ ((0xFFFFFFFF >> (31 - (bitposHi))) & (0xFFFFFFFF << (bitposLow))))) | ((ulWindowValue) << (bitposLow)))))
+
+
+#define NV_BYTE(ulus, bytepos) ((ulus >> (8 * (bytepos))) & 0xFF)
+
+
+#define SWAP_U16(us) ((((us) & 0x00FF) << 8) | \
+ (((us) & 0xFF00) >> 8))
+
+#define SWAP_U32(ul) ((((ul) & 0x000000FF) << 24) | \
+ (((ul) & 0x0000FF00) << 8) | \
+ (((ul) & 0x00FF0000) >> 8) | \
+ (((ul) & 0xFF000000) >> 24))
+
+#define NV_FIELD_OFFSET(TYPE, FIELD) ((NV_UINT32)((NV_UINT64)&((TYPE *)0)->FIELD))
+
+#define ADDRESS_OFFSET(structure, member) ((NV_UINT32) ((NV_UINT8 *) &(structure).member \
+ - (NV_UINT8 *) &(structure)))
+
+
+#define NV_MIN(a, b) ((a < b) ? a : b)
+#define NV_MAX(a, b) ((a > b) ? a : b)
+
+#ifdef AMD64
+#define PNV_VOID_TO_NV_UINT64(x) ((NV_UINT64)(x))
+#define PNV_VOID_TO_NV_UINT32(x) ((NV_UINT32)(NV_UINT64)(x))
+#define NV_UINT64_TO_PNV_VOID(x) ((PNV_VOID)(x))
+#define NV_UINT32_TO_PNV_VOID(x) ((PNV_VOID)(NV_UINT64)(x))
+#else
+#define PNV_VOID_TO_NV_UINT64(x) ((NV_UINT64)(NV_UINT32)(x))
+#define PNV_VOID_TO_NV_UINT32(x) ((NV_UINT32)(x))
+#define NV_UINT64_TO_PNV_VOID(x) ((PNV_VOID)(NV_UINT32)(x))
+#define NV_UINT32_TO_PNV_VOID(x) ((PNV_VOID)(x))
+#endif
+
+#define NV_MAKE_TAG32(s) (((NV_UINT32)((s)[3]) << 24) | ((NV_UINT32)((s)[2]) << 16) | \
+ ((NV_UINT32)((s)[1]) << 8) | ((NV_UINT32)((s)[0])))
+
+#define NV_MAKE_TAG64(s) (((NV_UINT64)((s)[7]) << 56) | ((NV_UINT64)((s)[6]) << 48) | \
+ ((NV_UINT64)((s)[5]) << 40) | ((NV_UINT64)((s)[4]) << 32) | \
+ ((NV_UINT64)((s)[3]) << 24) | ((NV_UINT64)((s)[2]) << 16) | \
+ ((NV_UINT64)((s)[1]) << 8) | ((NV_UINT64)((s)[0])))
+
+typedef union _NVLARGE_INTEGER {
+
+#if 0
+ // NO UNNAMED UNIONS ALLOWED !@
+ struct {
+ NV_UINT32 LowPart;
+ NV_SINT32 HighPart;
+ };
+#endif
+
+ struct {
+ NV_UINT32 LowPart;
+ NV_SINT32 HighPart;
+ } u;
+
+ NV_SINT64 QuadPart;
+
+} NVLARGE_INTEGER, *PNVLARGE_INTEGER;
+
+
+#ifndef LINUX
+typedef unsigned short NV_WCHAR;
+#else
+typedef unsigned long NV_WCHAR;
+#endif
+
+typedef NV_WCHAR *PNV_WSTR;
+
+#if defined(linux)
+#if !defined(NV_API_CALL)
+#if defined (__i386__)
+#define NV_API_CALL __attribute__ ((regparm(0)))
+#else
+#define NV_API_CALL
+#endif
+#endif
+#else
+#define NV_API_CALL
+#endif
+
+#endif // _BASETYPE_H_
diff --git a/sys/contrib/dev/nve/drvinfo.h b/sys/contrib/dev/nve/drvinfo.h
new file mode 100644
index 0000000..41c659a
--- /dev/null
+++ b/sys/contrib/dev/nve/drvinfo.h
@@ -0,0 +1,190 @@
+/***************************************************************************\
+|* *|
+|* Copyright 2001-2003 NVIDIA, Corporation. All rights reserved. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROPRIETARY AND CONFIDENTIAL *|
+|* TO NVIDIA, CORPORATION. USE, REPRODUCTION OR DISCLOSURE TO ANY *|
+|* THIRD PARTY IS SUBJECT TO WRITTEN PRE-APPROVAL BY NVIDIA, CORP. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROVIDED "AS IS" WITHOUT *|
+|* EXPRESS OR IMPLIED WARRANTY OF ANY KIND, INCLUDING ALL IMPLIED *|
+|* WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A *|
+|* PARTICULAR PURPOSE. *|
+|* *|
+\***************************************************************************/
+
+/*
+ * This file contains the header info common to the network drivers and applications.
+ * Currently, these applications include ASF, co-installers, and qstats.
+ *
+ *
+ */
+
+#ifndef _DRVINFO_H_
+#define _DRVINFO_H_
+
+// Switch to byte packing, regardless of global packing specified by the compiler switch
+#pragma pack(1)
+
+//////////////////////////////////////////////////////////////////
+// For the ADAPTER_GetStatistics call used by qstats. This
+// is the template used by the legacy driver.
+#define MAX_TRANSMIT_COLISION_STATS 16
+
+#define ADAPTER_STATS_LEGACY_VERSION 1
+#define ADAPTER_STATS_RM_VERSION 2
+
+typedef struct _ADAPTER_STATS_V1
+{
+ NV_UINT32 ulVersion;
+
+ NV_UINT32 ulSuccessfulTransmissions;
+ NV_UINT32 ulFailedTransmissions;
+ NV_UINT32 ulRetryErrors;
+ NV_UINT32 ulUnderflowErrors;
+ NV_UINT32 ulLossOfCarrierErrors;
+ NV_UINT32 ulLateCollisionErrors;
+ NV_UINT32 ulDeferredTransmissions;
+ NV_UINT32 ulExcessDeferredTransmissions;
+ NV_UINT32 aulSuccessfulTransmitsAfterCollisions[MAX_TRANSMIT_COLISION_STATS];
+
+ NV_UINT32 ulMissedFrames;
+ NV_UINT32 ulSuccessfulReceptions;
+ NV_UINT32 ulFailedReceptions;
+ NV_UINT32 ulCRCErrors;
+ NV_UINT32 ulFramingErrors;
+ NV_UINT32 ulOverFlowErrors;
+ NV_UINT32 ulFrameErrorsPrivate; //Not for public.
+ NV_UINT32 ulNullBufferReceivePrivate; //Not for public, These are the packets which we didn't indicate to OS
+
+ //interrupt related statistics
+ NV_UINT32 ulRxInterrupt;
+ NV_UINT32 ulRxInterruptUnsuccessful;
+ NV_UINT32 ulTxInterrupt;
+ NV_UINT32 ulTxInterruptUnsuccessful;
+ NV_UINT32 ulPhyInterrupt;
+
+} ADAPTER_STATS_V1, *PADAPTER_STATS_V1;
+//////////////////////////////////////////////////////////////////
+
+//////////////////////////////////////////////////////////////////
+// For the ADAPTER_GetStatistics call used by qstats. This
+// is the template used by the FD.
+typedef struct _ADAPTER_STATS
+{
+ NV_UINT32 ulVersion;
+ NV_UINT8 ulMacAddress[6];
+
+ //
+ // Tx counters.
+ //
+ NV_UINT64 ulSuccessfulTransmissions;
+ NV_UINT64 ulFailedTransmissions;
+ NV_UINT64 ulRetryErrors;
+ NV_UINT64 ulUnderflowErrors;
+ NV_UINT64 ulLossOfCarrierErrors;
+ NV_UINT64 ulLateCollisionErrors;
+ NV_UINT64 ulDeferredTransmissions;
+ NV_UINT64 ulExcessDeferredTransmissions;
+ NV_UINT64 aulSuccessfulTransmitsAfterCollisions[MAX_TRANSMIT_COLISION_STATS];
+
+ //
+ // New Tx counters for GigE.
+ //
+ NV_UINT64 ulTxByteCount;
+
+ //
+ // Rx counters.
+ //
+ NV_UINT64 ulMissedFrames;
+ NV_UINT64 ulSuccessfulReceptions;
+ NV_UINT64 ulFailedReceptions;
+ NV_UINT64 ulCRCErrors;
+ NV_UINT64 ulLengthErrors;
+ NV_UINT64 ulFramingErrors;
+ NV_UINT64 ulOverFlowErrors;
+ NV_UINT64 ulRxNoBuffer;
+ NV_UINT64 ulFrameErrorsPrivate; //Not for public.
+ NV_UINT64 ulNullBufferReceivePrivate; //Not for public, These are the packets which we didn't indicate to OS
+
+ //
+ // New Rx counters for GigE.
+ //
+ NV_UINT64 ulRxExtraByteCount;
+ NV_UINT64 ulRxFrameTooLongCount;
+ NV_UINT64 ulRxFrameAlignmentErrorCount;
+ NV_UINT64 ulRxLateCollisionErrors;
+ NV_UINT64 ulRxRuntPacketErrors;
+
+ NV_UINT64 ulRxUnicastFrameCount;
+ NV_UINT64 ulRxMulticastFrameCount;
+ NV_UINT64 ulRxBroadcastFrameCount;
+ NV_UINT64 ulRxPromiscuousModeFrameCount;
+
+ //Interrupt related statistics
+ NV_UINT64 ulRxInterrupt;
+ NV_UINT64 ulRxInterruptUnsuccessful;
+ NV_UINT64 ulTxInterrupt;
+ NV_UINT64 ulTxInterruptUnsuccessful;
+ NV_UINT64 ulPhyInterrupt;
+
+
+ //
+ // Handy things to know
+ //
+ NV_UINT64 ulDescriptorVersion;
+ NV_UINT64 ulPollingCfg; // configured for cpu or throughput
+ NV_UINT64 ulPollingState; // current optimizefor state.
+
+ NV_UINT64 ulNumTxDesc;
+ NV_UINT64 ulNumRxDesc;
+
+ //
+ // Useful to determine if TX is stuck.
+ //
+ NV_UINT64 ulNumTxPktsQueued;
+ NV_UINT64 ulNumTxPktsInProgress;
+
+ //
+ // Rx Xsum Cntrs
+ //
+ NV_UINT64 ulNoRxPktsNoXsum;
+ NV_UINT64 ulNoRxPktsXsumIpPassTcpFail;
+ NV_UINT64 ulNoRxPktsXsumIpPassUdpFail;
+ NV_UINT64 ulNoRxPktsXsumIpFail;
+ NV_UINT64 ulNoRxPktsXsumIpPassNoTcpUdp;
+ NV_UINT64 ulNoRxPktsXsumIpPassTcpPass;
+ NV_UINT64 ulNoRxPktsXsumIpPassUdpPass;
+ NV_UINT64 ulNoRxPktsXsumReserved;
+
+#ifdef _PERF_LOOP_CNTRS
+ NV_UINT64 ulNumTxCmplsToProcess;
+ NV_UINT64 ulNumRxCmplsToProcess;
+ NV_UINT64 ulNumIntsToProcess;
+
+ NV_UINT64 IntLoop0Cnt;
+ NV_UINT64 IntLoop1Cnt;
+ NV_UINT64 IntLoop2Cnt;
+ NV_UINT64 IntLoop3Cnt;
+ NV_UINT64 IntLoop4Cnt;
+ NV_UINT64 IntLoop5Cnt;
+ NV_UINT64 IntLoop6To10Cnt;
+ NV_UINT64 IntLoop11Cnt;
+ NV_UINT64 IntMaxLoopCnt;
+
+ NV_UINT64 IntRxCnt0;
+ NV_UINT64 IntTxCnt0;
+
+ NV_UINT64 MaxRxLoopCnt;
+ NV_UINT64 MaxTxLoopCnt;
+
+#endif
+} ADAPTER_STATS, *PADAPTER_STATS;
+//////////////////////////////////////////////////////////////////
+
+#pragma pack()
+
+
+#endif // #define _DRVINFO_H_
+
+
diff --git a/sys/contrib/dev/nve/i386/nvenetlib.README b/sys/contrib/dev/nve/i386/nvenetlib.README
new file mode 100644
index 0000000..fd4f6b8
--- /dev/null
+++ b/sys/contrib/dev/nve/i386/nvenetlib.README
@@ -0,0 +1,52 @@
+$FreeBSD$
+
+The installation and use of this software is subject to the following license terms and conditions:
+
+License For Customer Use of NVIDIA Software
+
+IMPORTANT NOTICE -- READ CAREFULLY: This License For Customer Use of NVIDIA Software ("LICENSE") is the agreement which governs use of the software of NVIDIA Corporation and its subsidiaries (“NVIDIA”) enclosed herewith, including computer software and associated printed materials ("SOFTWARE"). By downloading, installing, copying, or otherwise using the SOFTWARE, you agree to be bound by the terms of this LICENSE. If you do not agree to the terms of this LICENSE, do not download, install or use the SOFTWARE.
+
+RECITALS
+Use of NVIDIA's products requires three elements: the SOFTWARE, the hardware on a computer motherboard, and a personal computer. The SOFTWARE is protected by copyright laws and international copyright treaties, as well as other intellectual property laws and treaties. The SOFTWARE is not sold, and instead is only licensed for use, strictly in accordance with this document. The hardware is protected by various patents, and is sold, but this agreement does not cover that sale, since it may not necessarily be sold as a package with the SOFTWARE. This agreement sets forth the terms and conditions of the SOFTWARE LICENSE only.
+
+1. DEFINITIONS
+
+1.1 Customer. Customer means the entity or individual that installs or uses the SOFTWARE.
+
+2. GRANT OF LICENSE
+
+2.1 Rights and Limitations of Grant. NVIDIA hereby grants Customer the following non-exclusive, non-transferable right to use the SOFTWARE, with the following limitations:
+
+2.1.1 Rights. Customer may install and use one copy of the SOFTWARE on a single computer, and except for making one back-up copy of the Software, may not otherwise copy the SOFTWARE. This LICENSE of SOFTWARE may not be shared or used concurrently on different computers.
+
+2.1.2 Linux/FreeBSD Exception. Notwithstanding the foregoing terms of Section 2.1.1, SOFTWARE designed exclusively for use on the Linux operating system may be copied and redistributed, provided that the binary files thereof are not modified in any way (except for uncompressing/compressing files). SOFTWARE designed exclusively for use on the Linux Operating system but which has been authorized by NVIDIA for use on the FreeBSD Operating System may also be copied and redistributed, provided that the binary files thereof are not modified in any way (except for unzipping of compressed files).
+
+2.1.3 Limitations.
+
+No Reverse Engineering. Customer may not reverse engineer, decompile, or disassemble the SOFTWARE, nor attempt in any other manner to obtain the source code.
+
+No Separation of Components. The SOFTWARE is licensed as a single product. Its component parts may not be separated for use on more than one computer, nor otherwise used separately from the other parts.
+
+No Rental. Customer may not rent or lease the SOFTWARE to someone else.
+
+3. TERMINATION
+
+This LICENSE will automatically terminate if Customer fails to comply with any of the terms and conditions hereof. In such event, Customer must destroy all copies of the SOFTWARE and all of its component parts.
+
+4. COPYRIGHT
+
+All title and copyrights in and to the SOFTWARE (including but not limited to all images, photographs, animations, video, audio, music, text, and other information incorporated into the SOFTWARE), the accompanying printed materials, and any copies of the SOFTWARE, are owned by NVIDIA, or its suppliers. The SOFTWARE is protected by copyright laws and international treaty provisions. Accordingly, Customer is required to treat the SOFTWARE like any other copyrighted material, except as otherwise allowed pursuant to this LICENSE and that it may make one copy of the SOFTWARE solely for backup or archive purposes.
+
+5. APPLICABLE LAW
+
+This agreement shall be deemed to have been made in, and shall be construed pursuant to, the laws of the State of California.
+
+6. DISCLAIMER OF WARRANTIES AND LIMITATION ON LIABILITY
+
+6.1 No Warranties. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, THE SOFTWARE IS PROVIDED "AS IS" AND NVIDIA AND ITS SUPPLIERS DISCLAIM ALL WARRANTIES, EITHER EXPRESS OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+
+6.2 No Liability for Consequential Damages. TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, IN NO EVENT SHALL NVIDIA OR ITS SUPPLIERS BE LIABLE FOR ANY SPECIAL, INCIDENTAL, INDIRECT, OR CONSEQUENTIAL DAMAGES WHATSOEVER (INCLUDING, WITHOUT LIMITATION, DAMAGES FOR LOSS OF BUSINESS PROFITS, BUSINESS INTERRUPTION, LOSS OF BUSINESS INFORMATION, OR ANY OTHER PECUNIARY LOSS) ARISING OUT OF THE USE OF OR INABILITY TO USE THE SOFTWARE, EVEN IF NVIDIA HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+7. MISCELLANEOUS
+
+The United Nations Convention on Contracts for the International Sale of Goods is specifically disclaimed. If any provision of this LICENSE is inconsistent with, or cannot be fully enforced under, the law, such provision will be construed as limited to the extent necessary to be consistent with and fully enforceable under the law. This agreement is the final, complete and exclusive agreement between the parties relating to the subject matter hereof, and supersedes all prior or contemporaneous understandings and agreements relating to such subject matter, whether oral or written. Customer agrees that it will not ship, transfer or export the SOFTWARE into any country, or use the SOFTWARE in any manner, prohibited by the United States Bureau of Export Administration or any export laws, restrictions or regulations. This LICENSE may only be modified in writing signed by an authorized officer of NVIDIA.
diff --git a/sys/contrib/dev/nve/i386/nvenetlib.o.bz2.uu b/sys/contrib/dev/nve/i386/nvenetlib.o.bz2.uu
new file mode 100644
index 0000000..a10177b
--- /dev/null
+++ b/sys/contrib/dev/nve/i386/nvenetlib.o.bz2.uu
@@ -0,0 +1,320 @@
+$FreeBSD$
+begin-base64 644 nvenetlib.o.bz2
+QlpoOTFBWSZTWSDHheUAMsL/////////////////////////////////////////////4EQzTUNc
+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
+WmiaD/8XckU4UJAgx4Xl
+====
diff --git a/sys/contrib/dev/nve/nvenet_version.h b/sys/contrib/dev/nve/nvenet_version.h
new file mode 100644
index 0000000..6e12d88
--- /dev/null
+++ b/sys/contrib/dev/nve/nvenet_version.h
@@ -0,0 +1,29 @@
+/****************************************************************** \
+|* *|
+|* *|
+|* (c) NVIDIA Corporation. All rights reserved *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROPRIETARY AND *|
+|* CONFIDENTIAL *|
+|* TO NVIDIA, CORPORATION. USE, REPORDUCTION OR DISCLOSURE TO ANY *|
+|* THIRD PARTY IS SUBJECT TO WRITTEN PRE-APPROVAL BY NVIDIA CORP. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROVIDED "AS IS" WITHOUT *|
+|* EXPRESS OR IMPLIED WARRANTY OF ANY KIND, INCLUDING ALL IMPLIED *|
+|* WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS *|
+|* FOR A PARTICULAR PURPOSE. *|
+|* *|
+********************************************************************/
+
+#ifndef __NVENET_VERSION_H__
+#define __NVENET_VERSION_H__
+
+#define DRIVER_VERSION_MAJOR "1"
+#define DRIVER_VERSION_MINOR "0"
+#define DRIVER_VERSION_PATCH "13"
+#define DRIVER_VERSION DRIVER_VERSION_MAJOR"."\
+ DRIVER_VERSION_MINOR"-"\
+ DRIVER_VERSION_PATCH
+
+#endif
+
diff --git a/sys/contrib/dev/nve/os.h b/sys/contrib/dev/nve/os.h
new file mode 100644
index 0000000..4749543
--- /dev/null
+++ b/sys/contrib/dev/nve/os.h
@@ -0,0 +1,128 @@
+/***************************************************************************\
+|* *|
+|* Copyright 2001-2004 NVIDIA Corporation. All Rights Reserved. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROPRIETARY AND CONFIDENTIAL *|
+|* TO NVIDIA, CORPORATION. USE, REPRODUCTION OR DISCLOSURE TO ANY *|
+|* THIRD PARTY IS SUBJECT TO WRITTEN PRE-APPROVAL BY NVIDIA, CORP. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROVIDED "AS IS" WITHOUT *|
+|* EXPRESS OR IMPLIED WARRANTY OF ANY KIND, INCLUDING ALL IMPLIED *|
+|* WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A *|
+|* PARTICULAR PURPOSE. *|
+|* *|
+\***************************************************************************/
+
+/*
+ FILE: os.h
+ DATE: 2/7/00
+
+ This file contains the os interface. Note that the os interface is
+ itself an OS-independent API. The OS specific module is implemented
+ by ndis.c for Win9X/NT and linuxnet.c for linux.
+*/
+#ifndef _OS_H_
+#define _OS_H_
+
+#include "phy.h"
+
+#define HDO_VERSION_STRING "HDR O: $Revision: #21 $";
+
+// This is the maximum packet size that we will be sending
+// #define MAX_PACKET_SIZE 2048
+//#define RX_BUFFER_SIZE 2048
+
+#define MIN_PACKET_MTU_SIZE 576
+#define MAX_PACKET_MTU_SIZE 9202
+#define MAX_PACKET_SIZE_2048 2048
+#define MAX_PACKET_SIZE_1514 1514
+#define MAX_PACKET_SIZE_1518 1518
+#define MAX_PACKET_SIZE_JUMBO (9 * 1024)
+
+typedef struct _MEMORY_BLOCK
+{
+ PNV_VOID pLogical;
+ PNV_VOID pPhysical;
+ NV_UINT32 uiLength;
+} MEMORY_BLOCK, *PMEMORY_BLOCK;
+
+#define ALLOC_MEMORY_NONCACHED 0x0001
+#define ALLOC_MEMORY_ALIGNED 0x0002
+
+typedef struct _MEMORY_BLOCKEX
+{
+ PNV_VOID pLogical;
+ PNV_VOID pPhysical;
+ NV_UINT32 uiLength;
+ /* Parameter to OS layer to indicate what type of memory is needed */
+ NV_UINT16 AllocFlags;
+ NV_UINT16 AlignmentSize; //always power of 2
+ /* Following three fields used for aligned memory allocation */
+ PNV_VOID pLogicalOrig;
+ NV_UINT32 pPhysicalOrigLow;
+ NV_UINT32 pPhysicalOrigHigh;
+ NV_UINT32 uiLengthOrig;
+} MEMORY_BLOCKEX, *PMEMORY_BLOCKEX;
+
+
+// The typedefs for the OS functions
+typedef NV_API_CALL NV_SINT32 (* PFN_MEMORY_ALLOC) (PNV_VOID pOSCX, PMEMORY_BLOCK pMem);
+typedef NV_API_CALL NV_SINT32 (* PFN_MEMORY_FREE) (PNV_VOID pOSCX, PMEMORY_BLOCK pMem);
+typedef NV_API_CALL NV_SINT32 (* PFN_MEMORY_ALLOCEX) (PNV_VOID pOSCX, PMEMORY_BLOCKEX pMem);
+typedef NV_API_CALL NV_SINT32 (* PFN_MEMORY_FREEEX) (PNV_VOID pOSCX, PMEMORY_BLOCKEX pMem);
+typedef NV_API_CALL NV_SINT32 (* PFN_CLEAR_MEMORY) (PNV_VOID pOSCX, PNV_VOID pMem, NV_SINT32 iLength);
+typedef NV_API_CALL NV_SINT32 (* PFN_STALL_EXECUTION) (PNV_VOID pOSCX, NV_UINT32 ulTimeInMicroseconds);
+typedef NV_API_CALL NV_SINT32 (* PFN_ALLOC_RECEIVE_BUFFER) (PNV_VOID pOSCX, PMEMORY_BLOCK pMem, PNV_VOID *ppvID);
+typedef NV_API_CALL NV_SINT32 (* PFN_FREE_RECEIVE_BUFFER) (PNV_VOID pOSCX, PMEMORY_BLOCK pMem, PNV_VOID pvID);
+typedef NV_API_CALL NV_SINT32 (* PFN_PACKET_WAS_SENT) (PNV_VOID pOSCX, PNV_VOID pvID, NV_UINT32 ulSuccess);
+typedef NV_API_CALL NV_SINT32 (* PFN_PACKET_WAS_RECEIVED) (PNV_VOID pOSCX, PNV_VOID pvADReadData, NV_UINT32 ulSuccess, NV_UINT8 *pNewBuffer, NV_UINT8 uc8021pPriority);
+typedef NV_API_CALL NV_SINT32 (* PFN_LINK_STATE_HAS_CHANGED) (PNV_VOID pOSCX, NV_SINT32 nEnabled);
+typedef NV_API_CALL NV_SINT32 (* PFN_ALLOC_TIMER) (PNV_VOID pvContext, PNV_VOID *ppvTimer);
+typedef NV_API_CALL NV_SINT32 (* PFN_FREE_TIMER) (PNV_VOID pvContext, PNV_VOID pvTimer);
+typedef NV_API_CALL NV_SINT32 (* PFN_INITIALIZE_TIMER) (PNV_VOID pvContext, PNV_VOID pvTimer, PTIMER_FUNC pvFunc, PNV_VOID pvFuncParameter);
+typedef NV_API_CALL NV_SINT32 (* PFN_SET_TIMER) (PNV_VOID pvContext, PNV_VOID pvTimer, NV_UINT32 dwMillisecondsDelay);
+typedef NV_API_CALL NV_SINT32 (* PFN_CANCEL_TIMER) (PNV_VOID pvContext, PNV_VOID pvTimer);
+
+typedef NV_API_CALL NV_SINT32 (* PFN_PREPROCESS_PACKET) (PNV_VOID pvContext, PNV_VOID pvADReadData, PNV_VOID *ppvID,
+ NV_UINT8 *pNewBuffer, NV_UINT8 uc8021pPriority);
+typedef NV_API_CALL PNV_VOID (* PFN_PREPROCESS_PACKET_NOPQ) (PNV_VOID pvContext, PNV_VOID pvADReadData);
+typedef NV_API_CALL NV_SINT32 (* PFN_INDICATE_PACKETS) (PNV_VOID pvContext, PNV_VOID *ppvID, NV_UINT32 ulNumPacket);
+typedef NV_API_CALL NV_SINT32 (* PFN_LOCK_ALLOC) (PNV_VOID pOSCX, NV_SINT32 iLockType, PNV_VOID *ppvLock);
+typedef NV_API_CALL NV_SINT32 (* PFN_LOCK_ACQUIRE) (PNV_VOID pOSCX, NV_SINT32 iLockType, PNV_VOID pvLock);
+typedef NV_API_CALL NV_SINT32 (* PFN_LOCK_RELEASE) (PNV_VOID pOSCX, NV_SINT32 iLockType, PNV_VOID pvLock);
+typedef NV_API_CALL PNV_VOID (* PFN_RETURN_BUFFER_VIRTUAL) (PNV_VOID pvContext, PNV_VOID pvADReadData);
+
+// Here are the OS functions that those objects below the OS interface
+// can call up to.
+typedef struct _OS_API
+{
+ // OS Context -- this is a parameter to every OS API call
+ PNV_VOID pOSCX;
+
+ // Basic OS functions
+ PFN_MEMORY_ALLOC pfnAllocMemory;
+ PFN_MEMORY_FREE pfnFreeMemory;
+ PFN_MEMORY_ALLOCEX pfnAllocMemoryEx;
+ PFN_MEMORY_FREEEX pfnFreeMemoryEx;
+ PFN_CLEAR_MEMORY pfnClearMemory;
+ PFN_STALL_EXECUTION pfnStallExecution;
+ PFN_ALLOC_RECEIVE_BUFFER pfnAllocReceiveBuffer;
+ PFN_FREE_RECEIVE_BUFFER pfnFreeReceiveBuffer;
+ PFN_PACKET_WAS_SENT pfnPacketWasSent;
+ PFN_PACKET_WAS_RECEIVED pfnPacketWasReceived;
+ PFN_LINK_STATE_HAS_CHANGED pfnLinkStateHasChanged;
+ PFN_ALLOC_TIMER pfnAllocTimer;
+ PFN_FREE_TIMER pfnFreeTimer;
+ PFN_INITIALIZE_TIMER pfnInitializeTimer;
+ PFN_SET_TIMER pfnSetTimer;
+ PFN_CANCEL_TIMER pfnCancelTimer;
+ PFN_PREPROCESS_PACKET pfnPreprocessPacket;
+ PFN_PREPROCESS_PACKET_NOPQ pfnPreprocessPacketNopq;
+ PFN_INDICATE_PACKETS pfnIndicatePackets;
+ PFN_LOCK_ALLOC pfnLockAlloc;
+ PFN_LOCK_ACQUIRE pfnLockAcquire;
+ PFN_LOCK_RELEASE pfnLockRelease;
+ PFN_RETURN_BUFFER_VIRTUAL pfnReturnBufferVirtual;
+} OS_API, *POS_API;
+
+#endif // _OS_H_
diff --git a/sys/contrib/dev/nve/phy.h b/sys/contrib/dev/nve/phy.h
new file mode 100644
index 0000000..87596a5
--- /dev/null
+++ b/sys/contrib/dev/nve/phy.h
@@ -0,0 +1,164 @@
+/***************************************************************************\
+|* *|
+|* Copyright 2001-2004 NVIDIA Corporation. All Rights Reserved. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROPRIETARY AND CONFIDENTIAL *|
+|* TO NVIDIA, CORPORATION. USE, REPRODUCTION OR DISCLOSURE TO ANY *|
+|* THIRD PARTY IS SUBJECT TO WRITTEN PRE-APPROVAL BY NVIDIA, CORP. *|
+|* *|
+|* THE INFORMATION CONTAINED HEREIN IS PROVIDED "AS IS" WITHOUT *|
+|* EXPRESS OR IMPLIED WARRANTY OF ANY KIND, INCLUDING ALL IMPLIED *|
+|* WARRANTIES OF MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A *|
+|* PARTICULAR PURPOSE. *|
+|* *|
+\***************************************************************************/
+
+/*
+ FILE: phy.h
+ DATE: 2/7/00
+
+ This file contains the functional interface to the PHY.
+*/
+#ifndef _PHY_H_
+#define _PHY_H_
+
+//#include "basetype.h"
+//#include "nvevent.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DEFAULT_PHY_ADDRESS 1
+
+
+#define HDP_VERSION_STRING "HDR P: $Revision: #23 $"
+
+//
+// Defaults for PHY timeout values.
+//
+#define PHY_POWER_ISOLATION_MS_TIMEOUT_DEFAULT 50
+#define PHY_RESET_MS_TIMEOUT_DEFAULT 50
+#define PHY_AUTONEG_MS_TIMEOUT_DEFAULT 3000
+#define PHY_LINK_UP_MS_TIMEOUT_DEFAULT 2400
+#define PHY_RDWR_US_TIMEOUT_DEFAULT 2048
+#define PHY_POWER_DOWN_US_TIMEOUT_DEFAULT 500
+
+
+/////////////////////////////////////////////////////////////////////////
+// The phy module knows the values that need to go into the phy registers
+// but typically the method of writing those registers is controlled by
+// another module (usually the adapter because it is really the hardware
+// interface.) Hence, the phy needs routines to call to read and write the
+// phy registers. This structure with appropriate routines will be provided
+// in the PHY_Open call.
+
+typedef NV_API_CALL NV_SINT32 (* PFN_READ_PHY) (PNV_VOID pvData, NV_UINT32 ulPhyAddr, NV_UINT32 ulPhyReg, NV_UINT32 *pulValue);
+typedef NV_API_CALL NV_SINT32 (* PFN_WRITE_PHY) (PNV_VOID pvData, NV_UINT32 ulPhyAddr, NV_UINT32 ulPhyReg, NV_UINT32 ulValue);
+
+typedef struct PHY_SUPPORT_API
+{
+ PNV_VOID pADCX;
+ PFN_READ_PHY pfnRead;
+ PFN_WRITE_PHY pfnWrite;
+ // PFN_EVENT_OCCURED pfnEventOccurred;
+
+ //
+ // These fields are passed down via the FD. FD get's them
+ // from the registry. They allow one to fine tune the timeout
+ // values in the PHY.
+ //
+ NV_UINT32 PhyPowerIsolationTimeoutInms;
+ NV_UINT32 PhyResetTimeoutInms;
+ NV_UINT32 PhyAutonegotiateTimeoutInms;
+ NV_UINT32 PhyLinkupTimeoutInms;
+ NV_UINT32 PhyPowerdownOnCloseInus;
+
+} PHY_SUPPORT_API, *PPHY_SUPPORT_API;
+/////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////
+// The functional typedefs for the PHY Api
+typedef NV_SINT32 (* PFN_PHY_INIT) (PNV_VOID pvContext, NV_UINT32 *pulLinkState, NV_UINT32 PhyMode);
+typedef NV_SINT32 (* PFN_PHY_DEINIT) (PNV_VOID pvContext);
+typedef NV_SINT32 (* PFN_PHY_CLOSE) (PNV_VOID pvContext);
+typedef NV_SINT32 (* PFN_GET_LINK_SPEED) (PNV_VOID pvContext);
+typedef NV_SINT32 (* PFN_GET_LINK_MODE) (PNV_VOID pvContext);
+typedef NV_SINT32 (* PFN_GET_LINK_STATE) (PNV_VOID pvContext, NV_UINT32 *pulLinkState);
+typedef NV_SINT32 (* PFN_IS_LINK_INITIALIZING) (PNV_VOID pvContext);
+typedef NV_SINT32 (* PFN_RESET_PHY_INIT_STATE) (PNV_VOID pvContext);
+typedef NV_SINT32 (* PFN_FORCE_SPEED_DUPLEX) (PNV_VOID pvContext, NV_UINT16 usSpeed, NV_UINT8 ucForceDpx, NV_UINT8 ucForceMode);
+typedef NV_SINT32 (* PFN_PHY_POWERDOWN) (PNV_VOID pvContext);
+typedef NV_SINT32 (* PFN_SET_LOW_SPEED_FOR_PM) (PNV_VOID pvContext);
+
+
+typedef struct _PHY_API
+{
+ // This is the context to pass back in as the first arg on all
+ // the calls in the API below.
+ PNV_VOID pPHYCX;
+
+ PFN_PHY_INIT pfnInit;
+ PFN_PHY_INIT pfnInitFast;
+ PFN_PHY_DEINIT pfnDeinit;
+ PFN_PHY_CLOSE pfnClose;
+ PFN_GET_LINK_SPEED pfnGetLinkSpeed;
+ PFN_GET_LINK_MODE pfnGetLinkMode;
+ PFN_GET_LINK_STATE pfnGetLinkState;
+ PFN_IS_LINK_INITIALIZING pfnIsLinkInitializing;
+ PFN_RESET_PHY_INIT_STATE pfnResetPhyInitState;
+ PFN_FORCE_SPEED_DUPLEX pfnForceSpeedDuplex;
+ PFN_PHY_POWERDOWN pfnPowerdown;
+ PFN_SET_LOW_SPEED_FOR_PM pfnSetLowSpeedForPM;
+} PHY_API, *PPHY_API;
+/////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////
+// This is the one function in the PHY interface that is publicly
+// available. The rest of the interface is returned in the pPhyApi;
+// The first argument needs to be cast to a POS_API structure ptr.
+// On input the second argument is a ptr to a PPHY_SUPPORT_API.
+// On output, the second argument should be treated as a ptr to a
+// PPHY_API and set appropriately.
+extern NV_SINT32 PHY_Open (PNV_VOID pvOSApi, PNV_VOID pPhyApi, NV_UINT32 *pulPhyAddr, NV_UINT32 *pulPhyConnected);
+/////////////////////////////////////////////////////////////////////////
+
+
+/////////////////////////////////////////////////////////////////////////
+// Here are the error codes the phy functions can return.
+#define PHYERR_NONE 0x0000
+#define PHYERR_COULD_NOT_ALLOC_CONTEXT 0x0001
+#define PHYERR_RESET_NEVER_FINISHED 0x0002
+#define PHYERR_NO_AVAILABLE_LINK_SPEED 0x0004
+#define PHYERR_INVALID_SETTINGS 0x0005
+#define PHYERR_READ_FAILED 0x0006
+#define PHYERR_WRITE_FAILED 0x0007
+#define PHYERR_NO_PHY 0x0008
+#define PHYERR_NO_RESOURCE 0x0009
+#define PHYERR_POWER_ISOLATION_TIMEOUT 0x000A
+#define PHYERR_POWER_DOWN_TIMEOUT 0x000B
+#define PHYERR_AUTONEG_TIMEOUT 0x000C
+#define PHYERR_PHY_LINK_SPEED_UNCHANGED 0x000D
+
+#define PHY_INVALID_PHY_ADDR 0xFFFF;
+
+/////////////////////////////////////////////////////////////////////////
+
+// This value can be used in the ulPhyLinkSpeed field.
+#define PHY_LINK_SPEED_UNKNOWN 0x0FFFFFFFF
+
+//
+// Values used to configure PHY mode.
+//
+#define PHY_MODE_MII 1
+#define PHY_MODE_RGMII 2
+
+typedef NV_VOID (* PTIMER_FUNC) (PNV_VOID pvContext);
+
+#ifdef __cplusplus
+} // extern "C"
+#endif
+
+#endif //_PHY_H_
diff --git a/sys/contrib/dev/oltr/COPYRIGHT b/sys/contrib/dev/oltr/COPYRIGHT
new file mode 100644
index 0000000..668a641
--- /dev/null
+++ b/sys/contrib/dev/oltr/COPYRIGHT
@@ -0,0 +1,62 @@
+The oltr driver uses objects and microcode from Olicom's
+OC-3300 PowerMACH Works Kit.
+
+As the Linux driver says..
+==================================================================
+*
+* This driver uses the Token Ring Low Level Driver (TRlld,
+* PowerMach Works) as the lower level driver. The PMW kit is
+* (C) Olicom. The executable object may be distributed along
+* with this driver for the purpose of linking this driver.
+*
+=================================================================
+The low level driver is combined with a FreeBSD specific driver
+supplied in source, which provides all OS dependent functions.
+
+files from olicom are:
+
+trlld.o - Olicom low-level driver interface
+
+trlldmac.o - TMS 380 Microcode for Olicom TMS380 based cards
+trlldbm.o - "bullseye" Microcode for Olicom "bullseye" based cards
+trlldhm.o - "hawkeye" Microcode for Olicom "hawkeye" based cards
+
+The file trlld.o is stored in uuencode format as trlld.o.uu
+It represents a state machine of some kind that has no OS dependencies
+and communicates with the firmware on the cards via a proprietary interface.
+All communication with this module is achieved via functions supplied in
+the FreeBSD specific driver.
+
+The other 3 files have been encoded using file2c(1)
+and represent only microcode to be loaded into the appropriate board
+when found.
+
+Here is the release notice from Olicom regarding these files:
+-------------------------------------------------------------------------------
+OC-3300 PowerMach Works and its components are wholly owned products of
+Olicom A/S
+Nybrovej 114
+2800 Lyngby
+Denmark
+(45) 45 27 00 00
+and are used and distributed with permission. (#SS022499)
+-------------------------------------------------------------------------------
+
+A supporting email is also included.
+---------- Forwarded message ----------
+Date: Wed, 24 Feb 1999 17:07:14 +0100
+From: Starla Scott <sscott@olicom.com>
+To: 'Larry Lile' <lile@stdio.com>
+Subject: RE: FreeBSD Token-ring driver
+
+Larry,
+
+You may freely distribute the driver and/or kit. However, we do request that
+you include an acknowledgement of Olicom's copyright and ownership as
+related to your driver.
+
+Thanks,
+Starla
+Olicom Tech Support
+------------------------------------------------------------------------------
+
diff --git a/sys/contrib/dev/oltr/i386-elf.trlld.o.uu b/sys/contrib/dev/oltr/i386-elf.trlld.o.uu
new file mode 100644
index 0000000..02fabcd
--- /dev/null
+++ b/sys/contrib/dev/oltr/i386-elf.trlld.o.uu
@@ -0,0 +1,1850 @@
+begin 644 trlld.o
+M?T5,1@$!`0````````````$``P`!``````````````#<0@$``````#0`````
+M`"@`"P`'`````````````````(/L%%>+?"0<5E-5BT0D+"7__P``@\`$B]@E
+M__\``%#_5QR+\('C__\``$.!X___``!3_U<<P>`(@\0(9@OP@>;__P``9O?&
+M`0!FB70D(`^%>`(``(M$)"PE__\``%#_5QR(1"0G@\0$BT0D+"7__P``@\`"
+MB]@E__\``%#_5QR+\('C__\``$.!X___``!3_U<<BU0D*(/$",'@"('B__\`
+M`&8+\(M$)"`E__\``('F__\``(/``H/""HOH)?__```[P@^-\0```(M$)"PE
+M__\``(/`!&:+\(M$)"`E__\``(/`"HE$)!B+QB7__P``4/]7'(O8B\8E__\`
+M`$`E__\``%#_5QS!X`B#Q`AF"]B+Q8'C__\``"7__P``.\,/A:@!``"+1"0L
+M)?__``"#P`HE__\``%!7Z!1N``"#Q`B+U8'B__\``#O0#X5]`0``BT0D+"7_
+M_P``4/]7'(A$)"=J8?]7'(M$)#0E__\``(/``B7__P``4/]7'#/2@\0,BE0D
+M(SO0#X5!`0``BT0D+"7__P``@\`#)?__``!0_U<<BU0D'(/$!&:#Q0*+Q27_
+M_P``.\(/C"[___]F,_:-7QR)?"00BVPD+('E__\``(M$)"R#Q00E__\``(/`
+M"F:)1"0<C4<$B_B+QB7_````4(O%)?__``!0_Q=J8?\3BT0D*"7__P``4/\3
+MBM`SP(K"]]`E_P```%"+1"0P)?__``!0_Q=J8?\3B\4E__\``%#_$XK0,\"*
+MPHO6-?X```"#Q"`E__\``('B__\``#O"=7R#Q@)F@?X``7*-BW0D+(M\)!"+
+M1"0@@>;__P``)?\```"#Q@10B\8E__\``%#_5P2+1"0H@>;__P``)?__``!&
+MP?@(@>;__P``)?\```!05O]7!#/`@\00BD0D(U"+1"0P)?__``!0_U<$N`$`
+M``"#Q`A=6UY?@\04PSO_75M>,\!?@\04PSO_._^!_P````"#[%!7BWPD6%93
+M56:+AW(+``!FJ1``=$0SP&:+1Q:#P`PE__\``%"+AUP+``#_4!R+\#/`9HM'
+M%H/`#27__P``4(N'7`L``/]0','@"&8+\('F__\``(/$".LDD#/`9HM'%H/`
+M#"7__P``4(N'7`L``/]0((OP@>;__P``@\0$9HN'<@L``&:I$`!FB70D7G1#
+M,\!FBT<6@\`*)?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`LE__\``%"+AUP+
+M``#_4!S!X`AF"_"!YO__``"#Q`CK(S/`9HM'%H/`"B7__P``4(N'7`L``/]0
+M((OP@>;__P``@\0$9HN'<@L``&:I$`!FB70D7'0[:@$SP&:+1Q:#P`PE__\`
+M`%"+AUP+``#_4`1J`#/`9HM'%H/`#27__P``4(N'7`L``/]0!(/$$.L?._]J
+M`3/`9HM'%H/`#"7__P``4(N'7`L``/]0"(/$"&:+=S2+QH'F__\``,'F""7_
+M_P``P?@(@>8`_P``)?\````+QHOP9HN'<@L``('F__\``&:I$`!T3HO&)?\`
+M``!0,\!FBT<6@\`*)?__``!0BX=<"P``_U`$@>;__P``,\#!_@B!YO\```!6
+M9HM'%H/`"R7__P``4(N'7`L``/]0!(/$$.LCD('F__\``#/`5F:+1Q:#P`HE
+M__\``%"+AUP+``#_4`B#Q`AJ"HN'7`L``/]0-+Z\____@\0$O1````!FA:]R
+M"P``=$4SP&:+1Q:#P`(E__\``%"+AUP+``#_4!R+V#/`9HM'%H/``R7__P``
+M4(N'7`L``/]0','@"&8+V('C__\``(/$".LE._\SP&:+1Q:#P`(E__\``%"+
+MAUP+``#_4""+V('C__\``(/$!(O#@>/__P``P>,()?__``#!^`B!XP#_```E
+M_P````O#9HE$-%2#Q@(/C&'___]FBX=R"P``OD0```!FJ1``=$TSP(I$)%Y0
+M,\!FBT<6@\`,)?__``!0BX=<"P``_U`$,\!FBT0D9L'X""7_````4#/`9HM'
+M%H/`#27__P``4(N'7`L``/]0!(/$$.LDD#/`9HM$)%Y0,\!FBT<6@\`,)?__
+M``!0BX=<"P``_U`(@\0(9HN'<@L``&:I$`!T5(M$)%PE_P```%`SP&:+1Q:#
+MP`HE__\``%"+AUP+``#_4`2+1"1D)?__``#!^`@E_P```%`SP&:+1Q:#P`LE
+M__\``%"+AUP+``#_4`2#Q!#K*(/'`(M$)%PE__\``%`SP&:+1Q:#P`HE__\`
+M`%"+AUP+``#_4`B#Q`B+1"04B(?<$```BD0D%8B'W1```(I$)!:(A]X0``"*
+M1"07B(??$```BT0D&(B'X!```(I$)!F(A^$0``"+1"0\9HF'XA```&:+1"0V
+M9JD`0'11BD0D1HB'Y!```(I$)$>(A^40``"+1"1(B(?F$```BD0D28B'YQ``
+M`(I$)$J(A^@0``"*1"1+B(?I$```9HM$)#9FB8>."P``75M>7X/$4,.0,\F(
+MC^00``"(C^40``"(C^80``"(C^<0``"(C^@0``"(C^D0``#KPX'_`````('_
+M`````(/L&%>+?"0@9HN'H`L``&:I(``/A(\```!FQT<0``G'1V@`````9B7?
+M_V:)AZ`+``"+AY0+``")1Q(SP&B0````9HM'%H/`!R7__P``4(N'7`L``/]0
+M!(/$"%^#Q!C#D&;'1Q``",=':`````!F);__9HF'H`L``(N'D`L``(E'$C/`
+M:)````!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(7X/$&,,[_V:+AZ`+``!F
+MJ4``=:MFBX>@"P``9JF``'1F9B5__V:)AZ`+``!FBX=R"P``9JD`@'0&C4=8
+MZPJ0BX=D"P``@\!84.AA9P``9L='$``*B4<2,\"Z`````(/$!(E7:&B0````
+M9HM'%H/`!R7__P``4(N'7`L``/]0!(/$"%^#Q!C#9HN'H`L``&:I`(!T;V8E
+M_W]FB8>@"P``9HN'F@L``&:I`@!T"S/`9HN'F`L``.L.,\!FBX>8"P``#0``
+M`(!0Z.1F``!FQT<0``;'1V@`````B4<2,\"#Q`1HD````&:+1Q:#P`<E__\`
+M`%"+AUP+``#_4`2#Q`A?@\08PV:+AZ`+``!FJ0`!#X3L_O__9B7__C/)9HF'
+MH`L``&:+AW(+``!FJ0$`=01FN1``,\"*AWT+``")1"04J0$```!T!&:#R0*+
+M1"04J0(```!T!&:#R01FBX>:"P``9JD$`'4.9H/)0&:I"`!T!&:#R2!FQT<0
+M``W'1V@`````B\&!X?__``#!X0@E__\``,'X"('A`/\``"7_````"\$E__\`
+M`(E'$C/`:)````!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(7X/$&,,[_X/L
+M"%>+?"009HM'"F8]@`!T8F:+1P)F/4,`=%@SP&:+1PQ0,\!FBT<*4#/`9HM'
+M"%!J!&H!:@97Z)-<``"#Q!Q?@\0(PX/&`,=';`````!HB````#/`9HM'%H/`
+M!R7__P``4(N'7`L``/]0!(/$"%^#Q`C#BT=HA<!T#<=':`````!7_]"#Q`1F
+MBX>@"P``9H7`=-MFBT<"9CU0`'+19HM'$&:%P'6A5^CC_/__@\0$7X/$",.#
+MQP`[_X'_`````(/L$%>+?"085E-59HN'<@L``&:I$`!T/&H!,\!FBT<6@\`,
+M)?__``!0BX=<"P``_U`$:@`SP&:+1Q:#P`TE__\``%"+AUP+``#_4`2#Q!#K
+M((/'`&H!,\!FBT<6@\`,)?__``!0BX=<"P``_U`(@\0(9HN'<@L``&:I$`!T
+M/FC@````,\!FBT<6@\`*)?__``!0BX=<"P``_U`$:@4SP&:+1Q:#P`LE__\`
+M`%"+AUP+``#_4`2#Q!#K(CO_:.`%```SP&:+1Q:#P`HE__\``%"+AUP+``#_
+M4`B#Q`B^^/___[T0````9H6O<@L``'1%,\!FBT<6@\`")?__``!0BX=<"P``
+M_U`<B]@SP&:+1Q:#P`,E__\``%"+AUP+``#_4!S!X`AF"]B!X___``"#Q`CK
+M)3O_,\!FBT<6@\`")?__``!0BX=<"P``_U`@B]B!X___``"#Q`1FB5PT&(/&
+M`GR%,\"^"````&:+1"064(M$)!@E__\``%`SP&:+1"0:4(M$)!PE__\``%!J
+M`6H$5^A\6@``@\0<75M>7X/$$,.0@^PX5XM\)$!64U5FBX=R"P``9JD0`'0\
+M:(`````SP&:+1Q:#P`HE__\``%"+AUP+``#_4`1J$#/`9HM'%H/`"R7__P``
+M4(N'7`L``/]0!(/$$.L@:(`0```SP&:+1Q:#P`HE__\``%"+AUP+``#_4`B#
+MQ`AFBX=R"P``9JD0`'0W,\!FBT<6@\`")?__``!0BX=<"P``_U`<,\!FBT<6
+M@\`#)?__``!0BX=<"P``_U`<@\0(ZQT[_S/`9HM'%H/``B7__P``4(N'7`L`
+M`/]0((/$!&:+AW(+``!FJ1``=$0SP&:+1Q:#P`(E__\``%"+AUP+``#_4!R+
+M\#/`9HM'%H/``R7__P``4(N'7`L``/]0','@"&8+\('F__\``(/$".LDD#/`
+M9HM'%H/``B7__P``4(N'7`L``/]0((OP@>;__P``@\0$B\:(1"1&9HN'<@L`
+M`&:I$`!T1C/`9HM'%H/``B7__P``4(N'7`L``/]0'(OP,\!FBT<6@\`#)?__
+M``!0BX=<"P``_U`<P>`(9@OP@>;__P``@\0(ZR:#QP`SP&:+1Q:#P`(E__\`
+M`%"+AUP+``#_4""+\('F__\``(/$!(O&B$0D16:+AYH+``!FJ0$`='MFBX=R
+M"P``9JD0`'1%,\!FBT<6@\`")?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`,E
+M__\``%"+AUP+``#_4!S!X`AF"_"!YO__``"#Q`CK)3O_,\!FBT<6@\`")?__
+M``!0BX=<"P``_U`@B_"!YO__``"#Q`2+QHA$)$3&1"1#`3/`,]**1"1&BI>Z
+M"P``.\(/A%X#``"+[XV%F@L``(V]MPL``(E$)"R-A;H+``")1"0TB40D*(V%
+MF`L``(E$)#"+1"0TNA\```"*""+1BD0D0XORA,!U"(7V#X6.````C02UJ!``
+M`&:+\&:+A7(+``!FJ1``=%"+QB7_````4#/`9HM%%H/`"B7__P``4(N%7`L`
+M`/]0!('F__\``#/`P?X(@>;_````5F:+11:#P`LE__\``%"+A5P+``#_4`2#
+MQ!#K)8/'`('F__\``#/`5F:+11:#P`HE__\``%"+A5P+``#_4`B#Q`C&1"1#
+M`(M$)"C^`+H?````(A>-%%+!X@.-A!6\"P``B40D'&:+A7(+``!FJ1``=$8S
+MP&:+11:#P`(E__\``%"+A5P+``#_4!R+V#/`9HM%%H/``R7__P``4(N%7`L`
+M`/]0','@"&8+V('C__\``(/$".LF@\<`,\!FBT46@\`")?__``!0BX5<"P``
+M_U`@B]B!X___``"#Q`2+1"0<9HE8"F:+A7(+``!FJ1``=$0SP&:+11:#P`(E
+M__\``%"+A5P+``#_4!R+V#/`9HM%%H/``R7__P``4(N%7`L``/]0','@"&8+
+MV('C__\``(/$".LDD#/`9HM%%H/``B7__P``4(N%7`L``/]0((O8@>/__P``
+M@\0$9O?#`/YU"HM$)!S&0`X`ZR"*A7T+``"H!'0*N`(```#K"(/'`+@!````
+MBU0D'(A"#HM$)!R+5"0P9HM`"F:+$B7__P``@>+__P``.\)^#HM$)!S&0`X#
+M_X7$$```9O?#`!YU#6;WPP!`=`;_A<@0``!F]\,`$'0&_X7,$```N@,```"+
+M1"0<9B/3B%`/BT0D+&;W``(`=11F]\,`_G0NBT0D'&:+0`IFA<!U(8J5MPL`
+M`(M$)!S^PHB5MPL``,=`$`$```#ID0```(/'`#/2BT0D',=`$`````"+1"0P
+M9HL0BT0D'&:+2`J!X?__``"+PCO(?P*+P8O(BT0D'(E$)#B%R7Y&C9VW"P``
+MC7`0BT0D.+H?````9HM`""7__P``*\B*`_[`B`.*!R+0C112P>(#C805O`L`
+M`(E$)#B+1"0<BT`00(7)B09_PXM$)!QFBU`*9H/J!&:)4`HSP(M4)#2*1"1&
+MBA*!XO\````[P@^%SOS__XO]9HN'F@L``&:I`0`/A!D"``"*AYP+```\`G5S
+M,]*+1"1$)?\```"*E\,.```[PG14B^^-G<,.``"-O<,.``"-M;X.``"*"[@?
+M````(L&-%$"*A<,.``#!X@+^P(@'C8P5Q`X``&;'008``(H6BD$$`L(STH@&
+MBT0D1"7_````BA,[PG7`75M>7X/$.,,[_\9$)$,!,]*+1"1$)?\```"*E\,.
+M```[PG3<B^^-A<,.``"-G<,.``")1"0TC446C;V^#@``B40D+(H3N!\````B
+MPHOPC11VP>("C805Q`X``(E$)"2*1"1#A,!U"(7V#X6*````C8:($```9HOP
+M9HN%<@L``&:I$`!T38O&)?\```!0,\!FBT46@\`*)?__``!0BX5<"P``_U`$
+M@>;__P``,\#!_@B!YO\```!69HM%%H/`"R7__P``4(N%7`L``/]0!(/$$.LB
+M@>;__P``,\!69HM%%H/`"B7__P``4(N%7`L``/]0"(/$",9$)$,`BI7##@``
+MBT0D-/["B!"+1"0L9HL`)?__``"#P`(E__\``%"+A5P+``#_4!R#Q`0EB```
+M`#V(````=`Z+1"0D9L=`!@(`ZSP[_XM$)"QFBP`E__\``(/``B7__P``4(N%
+M7`L``/]0'(/$!(/@1(/X1'0'N`,```#K`C/`BU0D)&:)0@8STHM$)"2*#XI`
+M!`+!B`>+1"1$)?\```"*$SO"#X6E_O__75M>7X/$.,.*E\,.``"X'P```"+"
+M,]**E\`.``"-!$#!X`*-G`?$#@``,\"*1"1%.\(/A"K^__^+ZXV?O@X``(E\
+M)#"-M\`.``"!Q\`.```SP(I5!?["BL*(504STHI5!#O"=2AFQT4&``"+;"0P
+MN1\```#^A<,.```BC<,.``"-#$G!X0*-K`W$#@``,]*+1"0PBH"^#@``_L"(
+M`XM$)#"*@,`.``#^P(@',\"*1"1%BA8[PG6975M>7X/$.,.0C70F`%=6BW0D
+M#&:+?@J+QX'G__\``,'G""7__P``P?@(@><`_P``)?\````+QXOX@>?__P``
+M9O?'``5T7VH`:@!J`('G__\``%=J`&H#5NAP40``5N@J4```9L=&`D4`:@!6
+MBX9L"P``_U`$9L=&!`,`@\0H7E_#5N@&4```9L=&`D4`:@!6BX9L"P``_U`$
+M9L=&!`,`@\0,7E_#:@!J`&H`B\<E__\``%!J`&H#5N@040``@\0<9O?'``AU
+MNL:&CQ````!>7\.!_P````"!_P````"#[!0SP%>+?"0<5E/&1QH`QT0D%`$`
+M``!FBT<6@\`&)?__``!0BX=<"P``_U`<@\0$BMCVPX!U##/`6UY?@\04PX/'
+M`+A_````(L,E_P```%`SP&:+1Q:#P`8E__\``%"+AUP+``#_4`1FBX=R"P``
+M@\0(9JD"``^$F@$``&:I$`!T23/`9HM'%H/`""7__P``4(N'7`L``/]0'(OP
+M,\!FBT<6@\`))?__``!0BX=<"P``_U`<P>`(9@OP@>;__P``B70D&(/$".LF
+M._\SP&:+1Q:#P`@E__\``%"+AUP+``#_4"`E__\``(E$)!2#Q`2+1"009HE$
+M)!XE__\```T`"```9HE$)!IFBX=R"P``9JD0`'1/,\"*1"0:4#/`9HM'%H/`
+M""7__P``4(N'7`L``/]0!#/`9HM$)"+!^`@E_P```%`SP&:+1Q:#P`DE__\`
+M`%"+AUP+``#_4`2#Q!#K)H/'`#/`9HM$)!I0,\!FBT<6@\`()?__``!0BX=<
+M"P``_U`(@\0(,\!FBT0D'@T``0``9HE$)!IFBX=R"P``9JD0`'1/,\"*1"0:
+M4#/`9HM'%H/`""7__P``4(N'7`L``/]0!#/`9HM$)"+!^`@E_P```%`SP&:+
+M1Q:#P`DE__\``%"+AUP+``#_4`2#Q!#K)H/'`#/`9HM$)!I0,\!FBT<6@\`(
+M)?__``!0BX=<"P``_U`(@\0(N`\````BPX/X#'=V_R2%D````#O_5^BN\O__
+M@\0$ZV*05^A"]/__:@$SP&:+1Q:#P`<E__\``%"+AUP+``#_4`17Z"+T___'
+M1"0D`@```(/$$.LND%?HKO'__X/$!.LBD(M';(7`=!K'1VP`````5__0@\0$
+MZPL[_U?HFOS__X/$!&H@,\!FBT<6@\`')?__``!0BX=<"P``_U`$,\!FBT<6
+M@\`')?__``!0BX=<"P``_U`<@\0,J00```!U(&B$````,\!FBT<6@\`')?__
+M``!0BX=<"P``_U`$@\0(6UZ+1"0,7X/$%,.#["Q7BWPD-%:+="0\4XM<)$15
+MBH=Z"P``/`1U#XN':`L``&:+0!#K#8/&`(N':`L``&:+0!)FB4<8,\!H@```
+M`&:+1Q:#P`@E__\``%"+AUP+``#_4`1J#XN'7`L``/]0-#/`9HM'%H/`""7_
+M_P``4(N'7`L``/]0'(/@9(/$$(/(`8A$)#MFBX=R"P``9JD!`'4+BE0D.X#*
+M`HA4)#LSP(I$)#M0,\!FBT<6@\`()?__``!0BX=<"P``_U`$:AZ+AUP+``#_
+M4#1J`#/`9HM'%H/`"27__P``4(N'7`L``/]0!&H>BX=<"P``_U`T9L=$)%``
+MP&:+AW(+``"#Q!AFJ0`$="-FJ0`(=21F@4PD.``(9HM'!F8]"P!T$V:!3"0X
+M``SK"H/'`&:!3"0X`!"+ZXU<)#:-0P%05?_6@\0(A<!U"U-5_]:#Q`B%P'0*
+MQT0D(`$```#K",=$)"``````BT0D((7`#X3<````Z=\#``"#QP"-;"0VN`$`
+M```#Q5!3_]:#Q`B%P'4+55/_UH/$"(7`=`>]`0```.L",^V%[0^$<@(``.FE
+M`P``D(M$)#!F_TPD,&:%P`^$6@(``(OKC5PD-K@!`````\-05?_6@\0(A<!U
+M"U-5_]:#Q`B%P'0'NP$```#K`C/;A=L/A5X#``"+1"0P9O],)#!FA<!UP.M&
+M._]FBT0D+F:%P'2>Z6'___^0:B8SP&:+1Q:#P`@E__\``%"+AUP+``#_4`1F
+MQT<"(@!FQT<$```SP(/$"%U;7E^#Q"S#D(O=Z<D!``"0C6PD-K@!`````\50
+M4__6@\0(A<!U"U53_]:#Q`B%P'0'O0$```#K`C/MA>T/A<X"``"+1"0P9O],
+M)#!FA<`/A(0!``")="00OA````!FA;=R"P``B^MFBUPD-G1+,\"*PU`SP&:+
+M1Q:#P`(E__\``%"+AUP+``#_4`2!X___```SP,'["('C_P```%-FBT<6@\`#
+M)?__``!0BX=<"P``_U`$@\00ZR.0@>/__P``,\!39HM'%H/``B7__P``4(N'
+M7`L``/]0"(/$"(M$)#"+W6;_3"0P9H7`#X5O____BW0D$.GA````D(M$)#!F
+M_TPD,&:%P`^$S@```(OKC5PD-K@!`````\-05?_6@\0(A<!U"U-5_]:#Q`B%
+MP'0'NP$```#K`C/;A=L/A=(!``!FBX=R"P``9JD0`&:+7"0V=$PSP(K#4#/`
+M9HM'%H/``B7__P``4(N'7`L``/]0!('C__\``#/`P?L(@>/_````4V:+1Q:#
+MP`,E__\``%"+AUP+``#_4`2#Q!#K)#O_@>/__P``,\!39HM'%H/``B7__P``
+M4(N'7`L``/]0"(/$"(M$)#!F_TPD,&:%P`^%//___^DS_O__@\<`C6PD,K@!
+M`````\504__6@\0(A<!U"U53_]:#Q`B%P'0'O0$```#K`C/MA>T/A08!``"-
+M;"0TN`$````#Q5!3_]:#Q`B%P'4+55/_UH/$"(7`=`F]`0```.L$._\S[87M
+M#X72````C6PD,+@!`````\504__6@\0(A<!U"U53_]:#Q`B%P'0)O0$```#K
+M!#O_,^V%[0^%G@```+@!````9B-$)#!FB40D+HM$)#`E__\``,'X`6:)1"0P
+M9H7`#X0Y_?__BT0D.&:%1"0R#X4:_?__9HM$)#)FB40D*F:+AW(+``!FJ1``
+M=%\SP(I$)"I0,\!FBT<6@\`,)?__``!0BX=<"P``_U`$,\!FBT0D,L'X""7_
+M````4#/`9HM'%H/`#27__P``4(N'7`L``/]0!(/$$.LV@\<`75M>N`$```!?
+M@\0LPX/'`#/`9HM$)"I0,\!FBT<6@\`,)?__``!0BX=<"P``_U`(@\0(BT0D
+M-&:)1"0J9HN'<@L``&:I$`!T3S/`BD0D*E`SP&:+1Q:#P`HE__\``%"+AUP+
+M``#_4`0SP&:+1"0RP?@()?\```!0,\!FBT<6@\`+)?__``!0BX=<"P``_U`$
+M@\00ZR:#QP`SP&:+1"0J4#/`9HM'%H/`"B7__P``4(N'7`L``/]0"(/$"&:+
+M1"0N9H7`#X0?_?__Z3+\__\[_X/L(%>+1"0LQT0D$`````!6BW0D+%-5QD0D
+M+P%FBP`S_V:%P`^$Q`,``(V&F@L``(E$)!2+1"0XC5@$9HM#"&:%P`^$C@,`
+M`+@?````BHZ_#@``(L&+5"0<9HE$)"R*1"0O0H3`B50D'`^$P0```(M$)!1F
+M]P`0`'0*BT,$N@@```#K!8M#!#/2B!"+1"0L)?__``"-!,4`$@``9HE$)"AF
+MBX9R"P``9JD0`'13BT0D*"7_````4#/`9HM&%H/`!"7__P``4(N&7`L``/]0
+M!(M$)#`E__\``,'X""7_````4#/`9HM&%H/`!27__P``4(N&7`L``/]0!(/$
+M$.LG._^+1"0H)?__``!0,\!FBT86@\`$)?__``!0BX9<"P``_U`(@\0(QD0D
+M+P#IV0```)!FBX9R"P``9JD0`'0[:@`SP&:+1A:#P`(E__\``%"+AEP+``#_
+M4`1J$#/`9HM&%H/``R7__P``4(N&7`L``/]0!(/$$.LB._]H`!```#/`9HM&
+M%H/``B7__P``4(N&7`L``/]0"(/$"(M$)"QFA<!U9V:+AG(+``!FJ1``=#IJ
+M`#/`9HM&%H/`!"7__P``4(N&7`L``/]0!&H2,\!FBT86@\`%)?__``!0BX9<
+M"P``_U`$@\00ZR&0:``2```SP&:+1A:#P`0E__\``%"+AEP+``#_4`B#Q`@S
+MR6:+CG(+``#WP2((``!T!XMK!.L$._^+*XO%P>@0]\$0````9HE$)"AT5(M$
+M)"@E_P```%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`2+1"0P)?__``#!^`@E
+M_P```%`SP&:+1A:#P`,E__\``%"+AEP+``#_4`2#Q!#K*(/'`(M$)"@E__\`
+M`%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`B#Q`AFBX9R"P``9JD0`&:);"0H
+M=%&+1"0H)?\```!0,\!FBT86@\`")?__``!0BX9<"P``_U`$@>7__P``,\#!
+M_0B!Y?\```!59HM&%H/``R7__P``4(N&7`L``/]0!(/$$.LG._^+1"0H)?__
+M``!0,\!FBT86@\`")?__``!0BX9<"P``_U`(@\0(9HM#"&:)1"0H9HN&<@L`
+M`&:I$`!T48M$)"@E_P```%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`2+1"0P
+M)?__``#!^`@E_P```%`SP&:+1A:#P`,E__\``%"+AEP+``#_4`2#Q!#K)8M$
+M)"@E__\``%`SP&:+1A:#P`(E__\``%"+AEP+``#_4`B#Q`AF_XZ\#@``BH:_
+M#@``_L"(AK\.``"#PPR+1"0X1V:+`"7__P``._@/C$W\__]FBX::"P``9JD!
+M`'0)9K\`<.L'@\<`9K\`T&:+AG(+``!FJ1``=%>+QR7_````4#/`9HM&%H/`
+M`B7__P``4(N&7`L``/]0!('G__\``#/`P?\(@>?_````5V:+1A:#P`,E__\`
+M`%"+AEP+``#_4`2#Q!!=6UZ+1"007X/$(,.!Y___```SP%=FBT86@\`")?__
+M``!0BX9<"P``_U`(@\0(Z]"#[!2X'P```%>+?"0<5E.*E[D+``"+7"0H(L(#
+MP(T$0`4H$0``9HOP9HN'<@L``&:I$`!T3XO&)?\```!0,\!FBT<6@\`$)?__
+M``!0BX=<"P``_U`$@>;__P``,\#!_@B!YO\```!69HM'%H/`!27__P``4(N'
+M7`L``/]0!(/$$.LD._^!YO__```SP%9FBT<6@\`$)?__``!0BX=<"P``_U`(
+M@\0(_H>Y"P``,\!FBX=R"P``B40D%*D""```=`2+,^L#BW,$B\;!Z!!FB40D
+M'(M$)!2I$````'14BT0D'"7_````4#/`9HM'%H/``B7__P``4(N'7`L``/]0
+M!(M$)"0E__\``,'X""7_````4#/`9HM'%H/``R7__P``4(N'7`L``/]0!(/$
+M$.LH@\<`BT0D'"7__P``4#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+
+MAW(+``!FJ1``=$Z+QB7_````4#/`9HM'%H/``B7__P``4(N'7`L``/]0!(O&
+M)?__``#!^`@E_P```%`SP&:+1Q:#P`,E__\``%"+AUP+``#_4`2#Q!#K))"+
+MQB7__P``4#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+AW(+``!FJ1``
+M9HMS"'10B\8E_P```%`SP&:+1Q:#P`(E__\``%"+AUP+``#_4`2+QB7__P``
+MP?@()?\```!0,\!FBT<6@\`#)?__``!0BX=<"P``_U`$@\00ZR:#QP"+QB7_
+M_P``4#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+1P)F/5``#X6*````
+M:@$SP&:+1Q:#P`<E__\``%"+AUP+``#_4`1FB[>@"P``@\0(B\9F#0"`9H7V
+M9HF'H`L``'5.9HM'`F8]4`!R1,:'NPL```!FBT<09H7`="O'1VP`````:(@`
+M```SP&:+1Q:#P`<E__\``%"+AUP+``#_4`2#Q`CK"SO_5^@:X?__@\0$9L='
+M`F``6UY?@\04PSO_._^!_P````"#[!!7BWPD&%939HN'<@L``&:I$`!T.6H!
+M,\!FBT<6@\`,)?__``!0BX=<"P``_U`$:@`SP&:+1Q:#P`TE__\``%"+AUP+
+M``#_4`2#Q!#K'6H!,\!FBT<6@\`,)?__``!0BX=<"P``_U`(@\0(9HN'<@L`
+M`&:I$`!T.FH`,\!FBT<6@\`*)?__``!0BX=<"P``_U`$:@HSP&:+1Q:#P`LE
+M__\``%"+AUP+``#_4`2#Q!#K(9!H``H``#/`9HM'%H/`"B7__P``4(N'7`L`
+M`/]0"(/$"&:+AW(+``!FJ1``=#]J`#/`9HM'%H/``B7__P``4(N'7`L``/]0
+M!&B?````,\!FBT<6@\`#)?__``!0BX=<"P``_U`$@\00ZR.#QP!H`)\``#/`
+M9HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+AW(+``!FJ1``=#MJ`#/`9HM'
+M%H/``B7__P``4(N'7`L``/]0!&H`,\!FBT<6@\`#)?__``!0BX=<"P``_U`$
+M@\00ZQ\[_VH`,\!FBT<6@\`")?__``!0BX=<"P``_U`(@\0(9HN'<@L``&:I
+M$`!T.FH`,\!FBT<6@\`")?__``!0BX=<"P``_U`$:@`SP&:+1Q:#P`,E__\`
+M`%"+AUP+``#_4`2#Q!#K'I!J`#/`9HM'%H/``B7__P``4(N'7`L``/]0"(/$
+M"&:+AW(+``!FJ1``=#IJ`#/`9HM'%H/``B7__P``4(N'7`L``/]0!&H`,\!F
+MBT<6@\`#)?__``!0BX=<"P``_U`$@\00ZQZ0:@`SP&:+1Q:#P`(E__\``%"+
+MAUP+``#_4`B#Q`AFBX=R"P``9JD0`&:+=QAT3HO&)?\```!0,\!FBT<6@\`"
+M)?__``!0BX=<"P``_U`$B\8E__\``,'X""7_````4#/`9HM'%H/``R7__P``
+M4(N'7`L``/]0!(/$$.LDD(O&)?__``!0,\!FBT<6@\`")?__``!0BX=<"P``
+M_U`(@\0(9HN'<@L``&:I$`!FBW<8=%"+QB7_````4#/`9HM'%H/``B7__P``
+M4(N'7`L``/]0!('F__\``#/`P?X(@>;_````5F:+1Q:#P`,E__\``%"+AUP+
+M``#_4`2#Q!#K)8/'`('F__\``#/`5F:+1Q:#P`(E__\``%"+AUP+``#_4`B#
+MQ`AFBX=R"P``9JD0`'0Y:@4SP&:+1Q:#P`(E__\``%"+AUP+``#_4`1J!3/`
+M9HM'%H/``R7__P``4(N'7`L``/]0!(/$$.L@:`4%```SP&:+1Q:#P`(E__\`
+M`%"+AUP+``#_4`B#Q`@STF:+EW(+``#WP@"```!T"XUW$(U?".L/@\8`BX=D
+M"P``C7`0C5@(B\;!Z!#WPA````!FB40D&'12BT0D&"7_````4#/`9HM'%H/`
+M`B7__P``4(N'7`L``/]0!(M$)"`E__\``,'X""7_````4#/`9HM'%H/``R7_
+M_P``4(N'7`L``/]0!(/$$.LFD(M$)!@E__\``%`SP&:+1Q:#P`(E__\``%"+
+MAUP+``#_4`B#Q`AFBX=R"P``9JD0`'1.B\8E_P```%`SP&:+1Q:#P`(E__\`
+M`%"+AUP+``#_4`2+QB7__P``P?@()?\```!0,\!FBT<6@\`#)?__``!0BX=<
+M"P``_U`$@\00ZR20B\8E__\``%`SP&:+1Q:#P`(E__\``%"+AUP+``#_4`B#
+MQ`B+P\'H$&:+\&:+AW(+``!FJ1``=%"+QB7_````4#/`9HM'%H/``B7__P``
+M4(N'7`L``/]0!(O&)?__``#!^`@E_P```%`SP&:+1Q:#P`,E__\``%"+AUP+
+M``#_4`2#Q!#K)H/'`(O&)?__``!0,\!FBT<6@\`")?__``!0BX=<"P``_U`(
+M@\0(9HN'<@L``&:I$`!FB_-T38O&)?\```!0,\!FBT<6@\`")?__``!0BX=<
+M"P``_U`$@>;__P``,\#!_@B!YO\```!69HM'%H/``R7__P``4(N'7`L``/]0
+M!(/$$.LB@>;__P``,\!69HM'%H/``B7__P``4(N'7`L``/]0"(/$"&:+AW(+
+M``!FJ1``=$5H@````#/`9HM'%H/`!B7__P``4(N'7`L``/]0!&B0````,\!F
+MBT<6@\`')?__``!0BX=<"P``_U`$@\006UY?@\00PY!H@)```#/`9HM'%H/`
+M!B7__P``4(N'7`L``/]0"(/$"%M>7X/$$,.0._^!_P````"#[`Q7BWPD%%93
+M9HN'<@L``&:I$`!T13/`9HM'%H/`#"7__P``4(N'7`L``/]0'(OP,\!FBT<6
+M@\`-)?__``!0BX=<"P``_U`<P>`(9@OP@>;__P``@\0(ZR4[_S/`9HM'%H/`
+M#"7__P``4(N'7`L``/]0((OP@>;__P``@\0$9HN'<@L``&:I$`!T1#/`9HM'
+M%H/`"B7__P``4(N'7`L``/]0'(O8,\!FBT<6@\`+)?__``!0BX=<"P``_U`<
+MP>`(9@O8@>/__P``@\0(ZR20,\!FBT<6@\`*)?__``!0BX=<"P``_U`@B]B!
+MX___``"#Q`1FBX=R"P``9JD0`&:)7"06=#MJ`3/`9HM'%H/`#"7__P``4(N'
+M7`L``/]0!&H`,\!FBT<6@\`-)?__``!0BX=<"P``_U`$@\00ZQ\[_VH!,\!F
+MBT<6@\`,)?__``!0BX=<"P``_U`(@\0(9HN'<@L``&:I$`!T/FCN````,\!F
+MBT<6@\`*)?__``!0BX=<"P``_U`$:@4SP&:+1Q:#P`LE__\``%"+AUP+``#_
+M4`2#Q!#K(CO_:.X%```SP&:+1Q:#P`HE__\``%"+AUP+``#_4`B#Q`AJ"HN'
+M7`L``/]0-&:+AW(+``"#Q`1FJ1``=#DSP&:+1Q90BX=<"P``_U`<B]@SP&:+
+M1Q9`)?__``!0BX=<"P``_U`<P>`(9@O8@>/__P``@\0(ZQLSP&:+1Q90BX=<
+M"P``_U`@B]B!X___``"#Q`1FBX=R"P``9JD0`'10B\8E_P```%`SP&:+1Q:#
+MP`PE__\``%"+AUP+``#_4`2!YO__```SP,'^"('F_P```%9FBT<6@\`-)?__
+M``!0BX=<"P``_U`$@\00ZR6#QP"!YO__```SP%9FBT<6@\`,)?__``!0BX=<
+M"P``_U`(@\0(9HN'<@L``&:I$`!T63/`BD0D%E`SP&:+1Q:#P`HE__\``%"+
+MAUP+``#_4`0SP&:+1"0>P?@()?\```!0,\!FBT<6@\`+)?__``!0BX=<"P``
+M_U`$@\00B\-;7B7__P``7X/$#,.0,\!FBT0D%E`SP&:+1Q:#P`HE__\``%"+
+MAUP+``#_4`B#Q`CKS(/'`('_`````('_`````(/L#%>+?"045E-59HN'H`L`
+M`&:%P'0^9HM'$&:%P'0LQT=L`````&B(````,\!FBT<6@\`')?__``!0BX=<
+M"P``_U`$@\0(ZPR#QP!7Z,[6__^#Q`1FBX>T"P``9H7`#X3/````,^VX'P``
+M`"*'M@L``(OP9HN'M`L``&:%P'XIC9^T"P``C01VP>`#C80'O`L``%!7Z(;R
+M__]&@\0(@^8?10^_`SOH?-UJ`3/`9HM'%H/`!R7__P``4(N'7`L``/]0!&;'
+M1P)@`&:+MZ`+``"#Q`B+QF8-`(!FA?9FB8>@"P``=55FBT<"9CU0`')+QH>[
+M"P```&:+1Q!FA<!T*<=';`````!HB````#/`9HM'%H/`!R7__P``4(N'7`L`
+M`/]0!(/$".L25^CRU?__@\0$ZP>09L='`E``5^A`T?__9HNWC@L``(/$!(O&
+M@>;__P``P>8(:@`E__\``('F`/\``,'X""7_````"\:+\#/`@>;__P``BH><
+M"P``4&:+AW(+``!FJ0$`=`JX$````.L(@\<`N`0````E__\``%"+QB7__P``
+M4&H`:@!7Z*\T``"#Q!R*AWT+``"H`W1J5^CL^O__9HF'D!```(/$!&:+MZ`+
+M``"+QF8-``%FA?9FB8>@"P``=4%FBT<"9CU0`'(WQH>["P```&:+1Q!FA<!T
+M+\=';`````!HB````#/`9HM'%H/`!R7__P``4(N'7`L``/]0!(/$"%U;7E^#
+MQ`S#5^CJU/__@\0$75M>7X/$#,.#QP"!_P````"!_P````!0BU0D"(M$)`QF
+MBXJ@"P``9@O!9H7)9HF"H`L``'5!9HM"`F8]4`!R-\:"NPL```!FBT(09H7`
+M="O'0FP`````:(@````SP&:+0A:#P`<E__\``%"+@EP+``#_4`2#Q`B#Q`3#
+M4NAFU/__@\0$@\0$PX/'`('_`````('_`````(/L%+C_````5XM\)!Q39B-'
+M"HK8,\"*PSV`````#X2!````@_@"="1J`&H`:@`-``8``"7__P``4&H!:@)7
+MZ$TS``"#Q!Q;7X/$%,-J`&H`:@`SP&:+1PK!^`@-``<``"7__P``4&H`:@)7
+MZ"`S``!H_P```#/`9HM'%H/`!R7__P``4(N'7`L``/]0!&;'1P)%`&;'1P0%
+M`(/$)%M?@\04PSO_9HM'"F:I`(!T"L:'G`L```+K")#&AYP+```!9HN'<@L`
+M`&:I`@AT!#/`ZP6X`$```(E$)`AFBX>:"P``9JD!`'0*N`"```#K!8/'`#/`
+M9L='$``$QT=H``````M$)`B+R"7__P``P?@(@>'__P``P>$()?\```"!X0#_
+M```+P8E'$C/`:)````!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(,\#'1VP`
+M````9L='!`$`9L='`D0`:(@```!FBT<6@\`')?__``!0BX=<"P``_U`$@\0(
+M6U^#Q!3#D(/L#%>+?"045E-FBX=R"P``9JD!`'0)9L='.```ZP>09L='.``0
+M9HN'F@L``&:I!`!U(F:+1SAF#0!`9HN7F@L``&;WP@@`9HE'.'0(9@T`(&:)
+M1SAFB[>8"P``N0`:``!FB4](BH>("P``9HE/2KD9````B$<ZBH>)"P``B$<[
+MBH>*"P``B$<\BH>+"P``B$<]BH>,"P``B$<^BH>-"P``B$<_BX>0"P``B4=`
+MBX>4"P``B4=$B\8E__\``('F__\``,'X"(A/4L'F""7_````@>8`_P``B$]3
+M"\8SR6:)1TR^`@```&:)3TYFB4]0H`````"(1QR@`0```(A''8J&`````(A$
+M-QR*A@$```"(1#<=BH8"````B$0W'HJ&`P```(/&!(/^$HA$-QM\T&:+AW(+
+M``!FJ0"`#X28````C7<<B]:+QL'J",'H&('B`/\```O"B];!X@C!YAB!X@``
+M_P`+P@O&C7<XB4=49L='$``#9L='!#P`9L='`D,`B]:+QL'H&+L`````P>H(
+MB5]H@>(`_P``"\*+UL'B",'F&('B``#_``O""\:)1Q(SP&B0````9HM'%H/`
+M!R7__P``4(N'7`L``/]0!(/$"%M>7X/$#,.#Q@"+AV0+``"^'`````/PB]:+
+MQL'J",'H&('B`/\```O"B];!X@C!YAB!X@``_P`+P@O&B4=4BX=D"P``C7`X
+MZ5/___\[_XUT)@"#[!@SP%>+?"0@5E-59HM'`H/X0P^$@00```^/6`0``(/X
+M)'1O#X\M`0``@_@B#X2(````#X^>````@_@A#X6=!P``,\!FBT<6@\`&)?__
+M``!0BX=<"P``_U`<BMBX<````(/$!"+#@_AP#X1D`@``5^@Z,```9L='!```
+M9L='`B0`N.@#``"#Q`1=6UY?@\08PSO_9HM'!&;_1P1F/0(`=@QFQT<$``!F
+MQT<")0!=6UZXZ`,``%^#Q!C#D&:+1P1F_T<$9CT"`';D9L='!```9L='`B,`
+MZ]:#^",/A?\&``!FBT<$9O]'!&8]'@`/AXL````SP&:+1Q:#P`8E__\``%"+
+MAUP+``#_4!R*V+@P````@\0$(L.#^#`/A+4```"X?P```"+#@_A`#X6D`0``
+M9L='`C``:@!J`&H`:@!J`&H!5^BH+@``@\0<N.@#``!=6UY?@\08PX/X00^$
+MYP````^/V0(``(/X)0^%<`8``&:+1P1F_T<$9CT>`'8N9L='`A``:@!J`&H`
+M:``"``!J`&H!5^A7+@``@\0<N.@#``!=6UY?@\08PX/'`#/`9HM'%H/`!B7_
+M_P``4(N'7`L``/]0'(K8N#````"#Q`0BPX/X,'4[9L='`A``:@!J`&H`N!\`
+M```BPPT``0``)?__``!0:@!J`5?H\RT``(/$'+CH`P``75M>7X/$&,.#QP"X
+M?P```"+#@_A`#X6T````9L='`C``BY=@"P``4HN'7`L``/]0/(/$!+CH`P``
+M75M>7X/$&,,[_S/`9HM'%H/`!B7__P``4(N'7`L``/]0'(/$!(K8]L,0=#)J
+M`&H`:@"X#P```"+##0`!```E__\``%!J`6H"5^AD+0``@\0<N.@#``!=6UY?
+M@\08P_;#8'1#9HM'!&;_1P1F/60`=B5J`&H`:@!H``(``&H!:@)7Z"PM``"#
+MQ!RXZ`,``%U;7E^#Q!C#75M>N&0```!?@\08PX/&`&:+1Q!FA<!U/HM'$CW!
+MXM2+=30SP&:+1P@]__\``'4G,\!FBT<*/='7``!U&C/`9HM'##W%V0``=0TS
+MP&:+1PX]P]0``'1%:@!J`&H`9HN'<@L``&:I`(!T"K@`!```ZPB#QP"X``,`
+M`"7__P``4&H!:@)7Z),L``"#Q!RXZ`,``%U;7E^#Q!C#@\<`:B`SP&:+1Q:#
+MP`<E__\``%"+AUP+``#_4`1HA````#/`9HM'%H/`!R7__P``4(N'7`L``/]0
+M!&;'1RX`"F;'1S`*`&:+AW(+``"#Q!!FJ0"`=`6-1R[K"8N'9`L``(/`+F;'
+M1Q``"V;'1P0"`&;'1P)"`(O(P>@8B]'!Z@B!X@#_```+PHO1P>((P>$8@>(`
+M`/\`"\*Z``````O!B5=HB4<2,\!HD````&:+1Q:#P`<E__\``%"+AUP+``#_
+M4`2#Q`BXZ`,``%U;7E^#Q!C#D(/X0@^%EP,``&:+1P1F_T\$9H7`#X54_/__
+M:@!J`&H`:``$``!J`6H"5^B!*P``@\0<Z3?\__^0@_A0#X30`0``#X_!`0``
+M@_A%='P/CTX#``"#^$0/A44#``!FBT<$9O]/!&:%P`^%`OS__V:+AW(+``!F
+MJ1``#X3'````,\!FBT<6@\`()?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`DE
+M__\``%"+AUP+``#_4!S!X`AF"_"!YO__``")="0@@\0(Z:$```"09HM'!&;_
+M3P1FA<`/A97[__]FBT<&9CT+`'4\,\!FBT<6@\`()?__``!0BX=<"P``_U`<
+M@\@()?\```!0,\!FBT<6@\`()?__``!0BX=<"P``_U`$@\0,5^A+ZO__9L='
+M!```9L='`D$`@\0$N&0```!=6UY?@\08PX/'`#/`9HM'%H/`""7__P``4(N'
+M7`L``/]0("7__P``B40D'(/$!&:+AW(+``!FJ1``=$,SP&:+1Q:#P`8E__\`
+M`%"+AUP+``#_4!R+Z#/`9HM'%H/`!R7__P``4(N'7`L``/]0','@"&8+Z('E
+M__\``(/$".LC,\!FBT<6@\`&)?__``!0BX=<"P``_U`@B^B!Y?__``"#Q`2!
+MY?__``"+1"08527__P``4&H`:``%``!J`6H"5^BS*0``@\0<Z6GZ__^#QP"#
+M^&`/A8\!``!FBX>@"P``9H7`#X0_`0``BH>["P``BLC^P3P"B(^["P``#XXG
+M`0``9HN'<@L``&:I$`!T2C/`9HM'%H/`""7__P``4(N'7`L``/]0'(OP,\!F
+MBT<6@\`))?__``!0BX=<"P``_U`<P>`(9@OP@>;__P``B70D((/$".LG@\<`
+M,\!FBT<6@\`()?__``!0BX=<"P``_U`@)?__``")1"0<@\0$9HN'<@L``&:I
+M$`!T0S/`9HM'%H/`!B7__P``4(N'7`L``/]0'(OH,\!FBT<6@\`')?__``!0
+MBX=<"P``_U`<P>`(9@OH@>7__P``@\0(ZR,SP&:+1Q:#P`8E__\``%"+AUP+
+M``#_4""+Z('E__\``(/$!('E__\``(M$)!A5)?__``!0,\!FBX>@"P``4&H!
+M:@%J!U?H8B@``(/$'+CH`P``75M>7X/$&,,[_XI'&X3`#X0#^?__BD<:BM#^
+MPCP"B%<:#X[Q^/__:@!J`&H`:@-J`6H'5^@A*```@\0<N.@#``!=6UY?@\08
+MPY!=6UXSP%^#Q!C#._^-="8`@^P85XM\)"!6BW0D*%-5B\8E__\``%#_5QPS
+MTB7^````BA4`````"\(E^P```(K8,\"*PU"+QB7__P``4/]7!+@!````@\0,
+M(L.B`````(O&)?__``!0_U<<,](E_@```(H5``````O")?T```"*V#/`BL-0
+MB\8E__\``%#_5P2X`0```(/$#"+#H@````"+QB7__P``4/]7'#/2)?X```"*
+M%0`````+PB7^````BM@SP(K#4(O&)?__``!0_U<$N`$```"#Q`PBPZ(`````
+MB\8E__\``%#_5QPSTB7^````BA4`````"\(E[P```(K8,\"*PU"+QB7__P``
+M4/]7!+@!````@\0,(L.B`````(O&)?__``!0_U<<B\:#Q`0E__\``%#_5QR+
+MQH/$!"7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QPSTB7^
+M````BA4`````"\*#R!"*V#/`BL-0B\8E__\``%#_5P2X`0```(/$#"+#H@``
+M``"+QB7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QR+QH/$
+M!"7__P``4/]7'(O&@\0$)?__``!0_U<<,](E_@```(H5``````O"@\@"BM@S
+MP(K#4(O&)?__``!0_U<$N`$```"#Q`PBPZ(`````B\8E__\``%#_5QR+QH/$
+M!"7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QR+7"0X@\0$
+M@>/_````QT0D'`$```#!XPB!RX````!FA=L/A'<!``"+1"0<A<!T(8O&B^LE
+M__\``%#_5QPSTB7^````BA4`````"\*#R`'K(8O&B^LE__\``%#_5QPSTB7^
+M````BA4`````"\(E_@```(K8,\"*PU"+QB7__P``4/]7!+@!````@\0,(L.B
+M`````(O&)?__``!0_U<<,](E_@```(H5``````O")?T```"*V#/`BL-0B\8E
+M__\``%#_5P2X`0```(/$#"+#H@````"+QB7__P``4/]7'(O&@\0$)?__``!0
+M_U<<B\:#Q`0E__\``%#_5QR+QH/$!"7__P``4/]7'(O&@\0$)?__``!0_U<<
+M,](E_@```(H5``````O"@\@"BM@SP(K#4(O&)?__``!0_U<$N`$```"#Q`PB
+MPZ(`````B\8E__\``%#_5QR+QH/$!"7__P``4/]7'(O&@\0$)?__``!0_U<<
+MB\:#Q`0E__\``%#_5QR+Q8'E__\``"4`@```@\0$C5PM`(E$)!QFA=L/A8G^
+M__]=6UY?@\08PSO_._^!_P````"#[!17BWPD'%:+="0D4U6+QB7__P``4/]7
+M'(A$)"<E_P```(/(("7_````4(O&)?__``!0_U<$Q@4``````(M4)#RX/P``
+M`"+"#8`````E_P```%"+QB7__P``4%?HOOO__XM$)$R#Q!B%P(U0_XE4)#0/
+MA$P!```S[8EL)!B+QB7__P``4/]7'#/2)?X```"*%0`````+PB7]````BM@S
+MP(K#4(O&)?__``!0_U<$N`$```"#Q`PBPZ(`````B\8E__\``%#_5QR+QH/$
+M!"7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``%#_5QR+QH/$!"7_
+M_P``4/]7'#/2)?X```"*%0`````+PH/(`HK8,\"*PU"+QB7__P``4/]7!+@!
+M````@\0,(L.B`````(O&)?__``!0_U<<B\:#Q`0E__\``%#_5QR+QH/$!"7_
+M_P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\``('E__\``%#_5QP#[8/@
+M`3/;@\0$BMB%VW0$9H/-`8M,)!A!B4PD&(/Y$`^,V_[__XM$)#AFB2B-2`*+
+M1"0TB4PD.(7`C5#_B50D-`^%M/[__XO&)?__``!0_U<<,](E_@```(H5````
+M``O")>\```"*V#/`BL-0B\8E__\``%#_5P2X`0```(/$#"+#H@````"+QB7_
+M_P``4/]7'#/2)?X```"*%0`````+PB7[````BM@SP(K#4(O&)?__``!0_U<$
+MN`$```"#Q`PBPX'F__\``*(`````,\"*1"0C4%;_5P2#Q`A=6UY?@\04PX/L
+M#%>+?"045HMT)!R+QB7__P``4/]7'(O&@\0$)?__``!0_U<<B\:#Q`0E__\`
+M`%#_5QR#Q`2!YO__``!6_U<<@\0$7E^#Q`S#._^-="8`@^P(5U93BUPD&&8S
+M_X/#`HO/@\,"@\,"9HMS^HO&@>;__P``P>8()?__``#!^`B!Y@#_```E_P``
+M``O&B_!FBT/Z@>;__P``9@/^9@O(9HMS_(O&@>;__P``P>8()?__``#!^`B!
+MY@#_```E_P````O&B_!FBT/\@>;__P``9@/^9@O(9HMS_HO&@>;__P``P>8(
+M)?__``#!^`B!Y@#_```E_P````O&B_!FBT/^@>;__P``9@/^9@O(@>?__P``
+M9HLSB\:!YO__``#!Y@@E__\``,'X"('F`/\``"7_````"\:+\('F__\``#O^
+M=`DSP%M>7X/$",,STHO!9HL36R7__P``7@O"7X/$",.#QP"#["17BWPD+%93
+M58ML)$"+1"0\)?__``!0_U<<B$0D-X/$!(M$)#PE__\``(/`#&:)1"0JB]@E
+M__\``%#_5QR+\('C__\``$.!X___``!3_U<<P>`(@\0(9@OPBT0D/('F__\`
+M`&:)="0P)?__``"#P`IFB40D+(O8)?__``!0_U<<B_"!X___``!#@>/__P``
+M4_]7','@"(/$"&8+\&H`@>;__P``9HET)#)FBW0D+HO&)?__``!0_U<$:@"!
+MYO__``!&@>;__P``5O]7!(MT)#R#Q!"+QFH`)?__``!0_U<$:@"!YO__``!&
+M@>;__P``5O]7!(M$)$R#Q!`E__\``#/V@\`"C5\<9HO0BT0D/(EL)!`E__\`
+M`(E\)!2+^HUH`XO')?__``!0_Q.+Q27__P``4/\3B$0T((/$"$:#_@A\WV:+
+M="0JBWPD%(M$)#"+;"00)?\```!0B\8E__\``%#_5P2+1"0X@>;__P``)?__
+M``!&P?@(@>;__P``)?\```!05O]7!(MT)#R#Q!`SP(I$)"Y0B\8E__\``%#_
+M5P0SP('F__\``&:+1"0V1L'X"('F__\``"7_````4%;_5P0SP(/$$(I$)#-0
+MBT0D0"7__P``4/]7!(U$)"!0Z`W]__^#Q`R%P'0^B\5%BU0D&(@0B\5%BE0D
+M&8@0B\5%BE0D&H@0B\6*5"0;18@018M4)!R(5?^*5"0=B%4`75M>7X/$),.#
+MQP"X!@```(O]O@4```"%P'3EB\9.Q@<`1X7`=?5=6UY?@\0DPY"-="8`@^P<
+M,\E7BWPD+%9358M$)#1FBV@0BT0D-,9'`03&1S`!9L='$B``9HE/%H'E_/\`
+M`&:);Q!FB4\4BT`4@^#PB4<8A<!T#F;'1QP`(,9''F#K##O_9L=''```QD<>
+M(,9''P"-1"04B]U0:@1J/('C__\``(/#$8M4)#R!X___``"-=R)34NAF^?__
+MC40D*%#H#/S__X/$&(7`=#5&C5PD%$-&0T9#1D-#1HI#^XA&^XI#_(A&_(I#
+M_8A&_8I#_HA&_HI#_XA&_XH#B`;K'(/'`+@&````NP4```"%P'0+B\-+Q@8`
+M1H7`=?6+Q27__P``@\`0)?__``!0BT0D-/]0'(/$!*F`````=`;&1RP0ZP3&
+M1RP$B@^`^0IU)<9'(01=6UXSP%^#Q!S#@\8`QD<?`<9'(00SP%U;7E^#Q!S#
+M._^-1"0F@>7__P``4(M$)#1J`6H&@\41@>7__P``55#HC?C__S/`@\049HM$
+M)":I``$``'0<J0`"``!U#HM$)#1FBT`$9JD$`'4'N`$```#K`C/`A<!UEL9'
+M'P#&1R'_BD<>#`*(1QZ+1"0T9HM`!&:I!`!U$%U;7K@"````7X/$',.#QP!=
+M6UXSP%^#Q!S#._^#[`Q7BWPD((U$)`2+5"044(M$)"!J!"7_````4(M$)"0E
+M__\``%!2Z//W__^-1"084.B9^O__@\08A<!T-D>-3"0$04=!1T%'04%'BD'[
+MB$?[BD'\B$?\BD']B$?]BD'^B$?^BD'_B$?_B@&(!U^#Q`S#D+@&````N04`
+M``"%P'3LB\%)Q@<`1X7`=?5?@\0,PSO_@?\`````@?\`````@^P(5S/_5HMT
+M)!135<9&&P!J"%;HQR0``(/$"*D`"```#X2L````O1````"+QT<]Z`,``'XB
+M:@!J`&H`:@%J`6H&5NA8&P``N`$```"#Q!Q=6UY?@\0(PV:%KG(+``!T0S/`
+M9HM&%H/`""7__P``4(N&7`L``/]0'(O8,\!FBT86@\`))?__``!0BX9<"P``
+M_U`<P>`(9@O8@>/__P``@\0(ZR,SP&:+1A:#P`@E__\``%"+AEP+``#_4""+
+MV('C__\``(/$!/?#``@```^%6?___UU;7C/`7X/$",.#QP"#[`A7BWPD$%9F
+MBX=R"P``9JD0`'1&,\!FBT<6@\`&)?__``!0BX=<"P``_U`<B_`SP&:+1Q:#
+MP`<E__\``%"+AUP+``#_4!S!X`AF"_"+_H'G__\``(/$".LDD#/`9HM'%H/`
+M!B7__P``4(N'7`L``/]0((OX@>?__P``@\0$]\>`````7K@`````#Y7`7X/$
+M",.0@?\`````@?\`````@^P(5XM\)!!69HN'<@L``&:I$`!T1C/`9HM'%H/`
+M""7__P``4(N'7`L``/]0'(OP,\!FBT<6@\`))?__``!0BX=<"P``_U`<P>`(
+M9@OP@>;__P``@\0(ZR:#QP`SP&:+1Q:#P`@E__\``%"+AUP+``#_4""+\('F
+M__\``(/$!(O&@^#W9HOP9HN'<@L``&:I$`!T4(O&)?\```!0,\!FBT<6@\`(
+M)?__``!0BX=<"P``_U`$@>;__P``,\#!_@B!YO\```!69HM'%H/`"27__P``
+M4(N'7`L``/]0!(/$$.LE@\<`@>;__P``,\!69HM'%H/`""7__P``4(N'7`L`
+M`/]0"(/$"&:+AW(+``!FJ1``=$4SP&:+1Q:#P`8E__\``%"+AUP+``#_4!R+
+M\#/`9HM'%H/`!R7__P``4(N'7`L``/]0','@"&8+\(O^@>?__P``@\0(ZR,S
+MP&:+1Q:#P`8E__\``%"+AUP+``#_4""+^('G__\``(/$!/?'@````%ZX````
+M``^5P%^#Q`C#D(/L"%>+?"005F:+AW(+``!FJ1``=$8SP&:+1Q:#P`@E__\`
+M`%"+AUP+``#_4!R+\#/`9HM'%H/`"27__P``4(N'7`L``/]0','@"&8+\('F
+M__\``(/$".LF@\<`,\!FBT<6@\`()?__``!0BX=<"P``_U`@B_"!YO__``"#
+MQ`2+QH/("&:+\&:+AW(+``!FJ1``=%2+QB7_````4#/`9HM'%H/`""7__P``
+M4(N'7`L``/]0!('F__\``#/`P?X(@>;_````5F:+1Q:#P`DE__\``%"+AUP+
+M``#_4`2#Q!!>7X/$",.#QP"!YO__```SP%9FBT<6@\`()?__``!0BX=<"P``
+M_U`(@\0(7E^#Q`C#@^P,5XM\)!16BD<;A,`/A9@```!FBX=R"P``9JD0`'1'
+M,\!FBT<6@\`()?__``!0BX=<"P``_U`<B_`SP&:+1Q:#P`DE__\``%"+AUP+
+M``#_4!S!X`AF"_"!YO__``")="04@\0(ZR0SP&:+1Q:#P`@E__\``%"+AUP+
+M``#_4"`E__\``(E$)!"#Q`2+1"0,)0`+```]``,``'4<N`$```"(1QM>7X/$
+M#,,[_[@!````7E^#Q`S#D&:+AW(+``!FJ1``=$<SP&:+1Q:#P`8E__\``%"+
+MAUP+``#_4!R+\#/`9HM'%H/`!R7__P``4(N'7`L``/]0','@"&8+\(O^@>?_
+M_P``@\0(ZR4[_S/`9HM'%H/`!B7__P``4(N'7`L``/]0((OX@>?__P``@\0$
+M]\>`````#X5Q____7C/`7X/$#,.0@?\`````@?\`````@^P85XM\)"!64U5F
+MBX=R"P``9JD0`'1$,\!FBT<6@\`()?__``!0BX=<"P``_U`<B_`SP&:+1Q:#
+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
+M=H/X0G1]@_A##X2`````@_A$#X2#````@_A%#X2&````@_A&#X2)````@_A0
+M=`6#^&!U/F;'00(S`&:+D:`+``!F@\H09HN!H@L``&:)D:`+``!FA<!U&F:+
+M00)F/3``<A#&@;L+````4>AP_/__@\0$@\0(PY!FQT$",0"#Q`C#._]FQT$"
+M,@"#Q`C#._]FQT$",P"#Q`C#._]FQT$"-`"#Q`C#._]FQT$"-0"#Q`C#._]F
+MQT$"-@"#Q`C#._^#[!0SP%>+?"0<4V:+1P*#^$0/A(P````/C]("``"#^#8/
+MA.$!```/CY\"``"#^#1T<@^/6`(``(/X(0^%MP0``&:+1P1F_T<$9CT*``^&
+MI00``#/`9HN'<`L``(/`,B7__P``4(N'7`L``/]0((/(#R7__P``4%>+AVP+
+M``#_4#1FQT<"$`!J`&H`:@!H``(``&H`:@%7Z)0-``"#Q"CI5`0``#/`9HN'
+M<`L``(/`,B7__P``4(N'7`L``/]0((/$!(O09O?"`@`/A?$```"*A[L+``"*
+MR/[!/`.(C[L+```/CA$$``!FQT<"$`!7Z/T-``"+AV`+``!0BX=<"P``_U`\
+M@\0(,\!J!&H`9HM'`E!J!6H`:@97Z!,-```SP&:+ASX+``!0,\!FBX=P"P``
+M@\`4)?__``!0BX=<"P``_U`,,\!FBX=`"P``4#/`9HN'<`L``(/`%"7__P``
+M4(N'7`L``/]0#(/$+&H/5XN';`L``/]0-&H`,\!FBX=P"P``@\`()?__``!0
+MBX=<"P``_U`,@\005^A4#0``BY=@"P``4HN'7`L``/]0/,>'4`L```````"#
+MQ`CI.@,``#O_@>+__P``@\H!@>+__P``4E>+AVP+``#_4#1F_T<",\EFB4\$
+MB8]0"P``5XN';`L``/]0+&;'1P0``&;_1P*#Q`SI\@(``#O_9HM'!&;_1P1F
+M/0H`#X;>`@``,\!FBX=P"P``@\`R)?__``!0BX=<"P``_U`@@\@!)?__``!0
+M5XN';`L``/]0-,>'4`L```````!FQT<"$`!J`&H`:@!H``(``&H`:@%7Z,,+
+M``"#Q"A7Z'H,``"+CV`+``!1BX=<"P``_U`\@\0(Z6H"```[_X/X-0^%7P(`
+M`&:+1P1F_T<$9CT!``^&30(``%>+AVP+``#_4"QFQT<"-@!FQT<$``"#Q`3I
+M+P(``(/'`(/X0G0/#X\A`@``@_A!#X48`@``9HM'!&;_1P3I"P(``(/'`(/X
+M4`^$-P$``'\U@_A%#X7T`0``9HM'!&;_1P1F/04`#X;B`0``5XN';`L``/]0
+M+&;'1P)&`(/$!.G*`0``._^#^&`/A;\!``!FBX=R"P``BI=,"P``_L)FJ2``
+MB)=,"P``#X38````9HN'M`L``&:%P`^$R````(J'3@L``*@!#X2Z````:@$S
+MP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP&:+AW`+``"#P!HE__\``%"+
+MAUP+``#_4"!J`"4`#P``B]@SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`2#
+MQ!1F@?L``7949L='`D,`_X?8$```9HN'H`L``&8-$`!FB8>@"P``9HN'H@L`
+M`&:%P`^%[@```&:+1P)F/3``#X+@````QH>["P```%?H^_?__X/$!.G+````
+M@\8`9HN'H`L``&:%P'1$BH>["P``BM#^PCP>B)>["P``?C!J`#/`9HN'H@L`
+M`%`SP&:+AZ`+``!0:@%J`6H'5^B^"0``N.@#``"#Q!Q;7X/$%,,SP#/2BH?!
+M#@``BI?"#@``.\)T!OZ'30L``(N'1`L``*D!````C5`!B9=$"P``=$AH%`,`
+M`#/`9HN'<`L``(/`%"7__P``4(N'7`L``/]0#(N'1`L``,'H`5`SP&:+AW`+
+M``"#P!@E__\``%"+AUP+``#_4`R#Q!!;N.@#``!?@\04PY"!_P````"!_P``
+M``"#[`A7BWPD$&H/5XN';`L``/]0-(M$)!R#Q`B%P'0Y:@`SP&:+AW`+``"#
+MP`@E__\``%"+AUP+``#_4`R#Q`A7Z)L)``"+EV`+``!2BX=<"P``_U`\@\0(
+MQX=0"P```````%^#Q`C#D#O_@?\`````@^PT5XM\)#Q64U5FBT<"9CTA`'5R
+M:``#`(`SP&:+AW`+``"#P!0E__\``%"+AUP+``#_4`QJ!8U$)"!0,\!FBX=P
+M"P``@\`8)?__``!0BX=<"P``_U`PBT0D+&:)ASP+``!FBT0D+F:)ASX+``"+
+M1"0P9HF'0`L``(M$)#AFB8=""P``@\04,\!FBX=`"P``#0```(!0,\!FBX=P
+M"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P"P``@\`8)?__``!0BX=<"P``
+M_U`DB_"X_P```&8CQH/$#$B#^`9W;_\DA<0````[_S/`9HN'<`L``(/`&"7_
+M_P``4(N'7`L``/]0)(/$!(O0@_H(#X2;````9L='`A``:@`E__\``,'J$%"!
+MXO__``!2:``!``!J`&H!5^AX!P``@\0<ZQ&#QP"#^$9U"5?H93@``(/$!#/`
+M9HN'0`L``%`SP&:+AW`+``"#P!0E__\``%"+AUP+``#_4`R!YO__```SP('.
+M`(```('F__\``%9FBX=P"P``@\`8)?__``!0BX=<"P``_U`(@\0075M>7X/$
+M-,,SP&:+1P*#^"%T*8/X-G6$9L='`C``5^BH!P``BY=@"P``4HN'7`L``/]0
+M/(/$".EN____9L='`C``:@!J`&H`:@!J`&H!5^BX!@``@\0<Z4[___\SP&:+
+MAW`+``"#P!@E__\``%"+AUP+``#_4"3!Z!!FB40D1#/`9HM'`H/$!(/X,G0[
+M@_A"#X2"````@_A0=`F#^&`/A3`#``"+1"1`9JD`@`^$(@,``&:I``@/A!P"
+M``#&AY\+``!DZ2\"``"+1"1`9JD`@'0X9HN'H`L``&8-$`!FB8>@"P``9HN'
+MH@L``&:%P'4:9HM'`F8],`!R$,:'NPL```!7Z/7S__^#Q`1FQT<",P#IE?[_
+M_X/'`(M$)$!FJ0"`#X0J`0``9JD`"'0,QH>?"P``9.LB@\<`BT0D0&:I``%T
+M"K@0````ZPB#QP"X!````(B'GPL``(M$)$!FJ0`"=`O&AYP+```"ZPD[_\:'
+MG`L```%FQT<"4`#'AT0+````````BX<H"P``C8\H"P``B8<P"P``,]*)ARP+
+M``"*A[8+``"(A[<+``"+GR@+``!FB5,$BP&+6R@[V'7S9HN'M`L``&:%P'1/
+M,]NX'P```"*'M@L``(OH9HN'M`L``&:%P'XTB70D$(V'M`L``(OPC41M`,'@
+M`XV$![P+``!05^AX-```18/$"(/E'T,/OP8[V'S<BW0D$%?HKR8``&H`,\"*
+MAYP+``!0,\"*AY\+``!0,\!FBX>."P``4&H`:@!7Z,<$``"#Q"#I7?W__X/&
+M`&;'1P)#`+@/````9B-$)$"#^`UU,XJ'G@L``(B'GPL``(J'G@L``(3`=5%J
+M`&H`:@!H``@``&H`:@)7Z'P$``"#Q!SK-X/&`(J'G0L``(B'GPL``&H`:@!J
+M`+C_````9B-$)$P-``<``"7__P``4&H`:@)7Z$,$``"#Q!QFQT<$``#IT_S_
+M_Y"+1"1`9JD``70*N!````#K"(/'`+@$````B(>?"P``BT0D0&:I``)T"\:'
+MG`L```+K"3O_QH><"P```6H`,\"*AYP+``!0,\"*AY\+``!0,\!FBX>."P``
+M4&H`:@!7Z-$#``"#Q!SI9_S__Y`SP&:+1P*#^#-T.8/X0W0B@_A0=`6#^&!U
+M=FH`:@!J`&@`"```:@!J`U?HF0,``(/$'&;'1P)$`%?H2@(``(/$!.L'D&;'
+M1P(T`&:+AZ`+``!F#0!`9HF'H`L``&:+AZ(+``!FA<`/A?K[__]FBT<"9CTP
+M``^"[/O__\:'NPL```!7Z#'Q__^#Q`3IU_O__Y!J`(O&)?__``!0,\!FBT<"
+M4&H%:@!J!E?H&P,``(/$'.FQ^___@\<`,\!FBX=P"P``@\`8)?__``!0BX=<
+M"P``_U`D:@!J`,'H$&H`B]@E__\``%!J`&H#5^C:`@``9HM'`H/$(&8]4``/
+M@F?[__]F]\,+#W0.9L='`D,`Z57[__^#Q@#&AX\0````Z4;[___&ATP+````
+MZ3K[__^!_P````"!_P````"#[`@SP%>+?"005E-FBX<^"P``#0```(!0,\!F
+MBX=P"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P"P``@\`8)?__``!0BX=<
+M"P``_U`DB_`SP&:+AW`+``"#P!@E__\``%"+AUP+``#_4"0STH/$$&:+EZ(+
+M``"+SH/A?[@!````T^"+V"7__P``.\)T'VH!,\!FB\)0B\,E__\``%!J!6H`
+M:@97Z.4!``"#Q!QFQX>B"P````!FBT<"9CTQ`'539L='`C``5^B#`@``BY=@
+M"P``4HN'7`L``/]0/(/$"%M>7X/$",.0B\:#X'^#^`=U"5?HZ"<``(/$!(/F
+M?X/^#G0)5^AW[___@\0$6UY?@\0(PY"+QL'H$*D`(```=<AJ`H'C__\``,'N
+M$('F__\``%93:@5J`&H&5^A1`0``@\0<6UY?@\0(PX/'`(UT)@"#[!0STC/)
+M5XM\)!Q64U6*E\$.``"*A[8+``"(C[D+``"(A[<+```SP(J'P@X``(B/N@L`
+M`#O"#X2)````B^^-A6`+``"-M<(.``")1"0<C87"#@``C;W!#@``B40D&(V=
+MO`X``(J5P@X``+D?````(LIJ`8T,2<'A`HV$#<0.``")1"08BPB+1"0@48L`
+M4(N%7`L``/]01(M$)"2#Q`R*E<(.``#^PH@0,]*+1"049@^V0`1F`P-FB0,S
+MP(H&BA<[PG6AB_UFBY>\#@``BH?"#@``9H/Z((B'PPX``'0D)?\```!0,\"*
+MA\$.``!0,\!FB\)0:@)J`6H&5^A`````@\0<9L>'O`X``"``,\F(C[X.``"(
+MC[\.``"(C\`.``"(C\$.``"(C\,.``"(C\(.``!=6UY?@\04PSO_C70F`(/L
+M$%>+1"0<5HMT)!QFB40D"(M$)"0S_XA$)`IFBX:8"P``9HE$)`R+1"0H9HE$
+M)!"+1"0L9HE$)!*+1"0P9HE$)!2+1"0T9HE$)!:+1"0DA,!T+L:&G`L```!F
+MBT8"9L=&`C``9CU``+@`````#Y?`:@"+^%:+AFP+``#_4`2#Q`B*AIP+``"(
+M1"0+C40D"%"+EF`+``!2BX9<"P``_U`X@\0(A?]T"5;H$@```(/$!%Y?@\00
+MPY`[_X'_`````(/L%#/`,])7BWPD'%9358J7N`L``(J'M@L``#O"#X2'````
+MB^^-A;8+``"-G;8+``")1"0<C86T"P``C;6X"P``C;U@"P``B40D&(J5M@L`
+M`+D?````(LIJ`8T,2<'A`XV$#;P+``"+2!11:@%J`(L'4(N%7`L``/]02(M$
+M)#"#Q!2*E;8+``#^PH@0BT0D&&:+E;0+``!F2F:)$#/2,\"*%HH#.\)UHXO]
+M9HN'M`L``&:%P'0K,\"*A[H+``!0,\"*A[<+``!0,\!FBX>T"P``4&H#:@%J
+M!E?H8O[__X/$'#/)9HF/M`L``(B/M@L``(B/MPL``(B/N`L``%?H_OS__X/$
+M!%U;7E^#Q!3#@\<`5U:+="0,N!\```"+3"00(H;!#@``C01`P>`"C;P&Q`X`
+M`(M$)!2)!XI$)!C&1P4`B$<(BH;!#@``_L"(AL$.``!15HN&;`L``/]0((A'
+M!(/$"%Y?PX/'`#O_@?\`````QP7\`P``````_X/L#%>_@````%93QT0D%```
+M``!5B_>!YH"`@(`S_HO6P>H/`_\S^O?&@````'0&@?<$P1VWBTPD&+X!````
+MT^:[``$``"O>@?L``0``#XVC````B\.+#)T`````*\:+US/10XD4A0````"!
+M^_T```!]78O#BPR=`````"O&B]<ST8D4A0````"+UXO#@\,$*\:-+(4`````
+MBP2=]/___S/0B94$````B]<S%)WX____B94(````B]>+#)W\____,]&!^_T`
+M``")E0P```!\HX'[``$``'T?B\.+#)T`````*\:+US/10XD4A0````"!^P`!
+M``!\X8M4)!A"B50D&(/Z"`^,#/___UU;7E^#Q`S#._^-="8`5U93BT0D&%6+
+M="08BUPD%(/^$(LX#XR2````]\,#````="2+QS/2P>@(BA.!Y_\```!.,]=#
+M,P25`````/?#`P```(OX==R+QL'X`H7`C6C_=%>#PP0S>_R+QX'G_P```,'H
+M"#,$O0````"+^,'H"('G_P```#,$O0````"+^,'H"('G_P```#,$O0````"+
+M^,'H"('G_P```#,$O0````"+^(O%387`=:F#Y@.+QDZ%P'0BB\<STL'H"(H3
+M@>?_````0S/7,P25`````(OXB\9.A<!UWHM$)!R).%U;7E_#@\<`@?\`````
+M@?\`````4(M$)!3'!"0`````5[\!````5HUP_U-5BVPD((7`=%.+5"0<BUPD
+M&(U$)!"-2@&#XA^)3"0<C1124,'B`X7VC9P3O`L``'0(,\!FBT,(ZP*+Q2O'
+M4(L+`_E7Z+'^__\SP(/$#&:+0P@S_ROHB\9.A<!UK5U;7HM$)`0]./LBA+@`
+M````#Y7`7X/$!,.-="8`5U93BT0D%(M,)!"+.(I`#Z@!#X2'````BD<(J(!T
+M#;L?````BE<.(MKK`Y`SVXM$)!2-4Q5FBT`*)?__```[PG5=OOK___\SP#/2
+MBH0QB`L``(I4-P@[PG5"1GSJ,\"-?!\.O@8```"*!R7O````/>0```!U*3/`
+MBD<!)>\````]Y````'48BD<"/`-U$8M'`ST`!)`'=!#K!3O_@\8&,\!;7E_#
+M@\<`6UZX`0```%_#@\<`@?\`````@?\`````5XM\)`Q6BW0D#&:+1PAF/34`
+M<S**AGT+```D_(B&?0L``&@``0``5HN&;`L``/]0'&H`:@!J`&H#:@!J!5;H
+M+?K__X/$)#/`BQ>*0@$EP````(/X0'595U;HXO[__X/$"(7`=#**AGT+```D
+M_(B&?0L``&@``0``5HN&;`L``/]0'&H`:@!J`&H!:@!J!5;HW/G__X/$)(J&
+M?0L``*@!=0N*1P^H`W4$QD<.`5Y?PY"*AGT+``"H`G7RZ^R-="8`@^P8,\`S
+MTE>+?"0@5E-5BI?##@``BH?"#@``.\(/A((```")?"0@B\<%P@X``(E$)"2+
+M;"0@C3"->`&-6/J*E<(.``"Y'P```"+*C0Q)P>$"C8P-Q`X``&8/MD$$9@,#
+M9HD#BT0D)(J5P@X``/["B!"*00B$P'4=,\!FBT$&4(L)48N%8`L``%"+A5P+
+M``#_4$2#Q`PSP#/2B@:*%SO"=9V+?"0@,\`STHJ'M@L``(J7MPL``#O"#X0B
+M`0``B7PD$(V'8`L``(E$)""-A[<+``")1"0<C8=R"P``B40D&(O'C9^V"P``
+MC;A]"P``C;"T"P``NA\```"+;"00B@N+1"08(M&-%%+!X@-F]P"``(VL%;P+
+M``!T7(I%#H3`=56+31`SP%%FBT4*4(M$)!B*@+8+```E_P```%"+1"0<4.BL
+M_/__@\00A<!T'8M$)!#_@,@0``"*%_;"!'0(QD4.`NL&.__&10X!9HM5"F:#
+MZ@1FB54*BD40B@L"P8@#9HL&9BM%$&:)!HH'J`-T#E6+5"044NBH_?__@\0(
+M,\"*10Y0BTT448M%$%`SP&:+10I0BT0D,(L0BT0D(%*+@%P+``#_4$B+5"0P
+M@\04,\"*$HH#@>+_````.\(/A13___]=6UY?@\08PY`[_X'_`````(M$)`B+
+M5"0$A<"-2/]T"XO!2<8"`$*%P'7UPY"-="8`9HM,)`2+P8'A__\``,'A""7_
+M_P``P?@(@>$`_P``)?\````+P27__P``PY"-="8`5S/`9HM$)`Q0BT0D#/]0
+M'(OX,\!FBT0D$$`E__\``%"+1"00_U`<P>`(9@OXB\<E__\``(/$"%_#@\<`
+MC70F`#/`BD0D#%`SP&:+1"0,4(M$)`S_4`0SP&:+1"04P?@()?\```!0,\!F
+MBT0D%$`E__\``%"+1"04_U`$@\00PY"+3"0$B]&+P<'J",'H&('B`/\```O"
+MB]'!X@C!X1B!X@``_P`+P@O!PX/'`(UT)@!7BWPD"%9FBX=R"P``9JD0`'15
+M,\`STF:+1Q9FBU0D$`/")?__``!0BX=<"P``_U`<B_`SP&:+1Q8STF:+5"04
+MC400`27__P``4(N'7`L``/]0','@"&8+\(O&)?__``"#Q`A>7\,[_S/`,])F
+MBT<69HM4)!`#PB7__P``4(N'7`L``/]0("7__P``@\0$7E_#@\<`@?\`````
+M@?\`````5XM\)`AFBX=R"P``9JD0`'1:,\`STF:+5"0,BD0D$%`SP&:+1Q8#
+MPB7__P``4(N'7`L``/]0!#/`,])FBT0D&,'X"&:+5"04)?\```!0,\!FBT<6
+MC40"`27__P``4(N'7`L``/]0!(/$$%_#,\`STF:+1"004#/`9HM'%F:+5"00
+M`\(E__\``%"+AUP+``#_4`B#Q`A?PY`[_X'_`````%>+?"0(:/\````SP&:+
+M1Q:#P`<E__\``%"+AUP+``#_4`2+1"04@\0(A<!T7C/`9HM'!H/X`G18@_@#
+M=4YH_@```#/`9HN'<`L``(/`'27__P``4(N'7`L``/]0!&B`````,\!FBX=P
+M"P``@\`?)?__``!0BX=<"P``_U`$:C*+AUP+``#_4#2#Q!1?PX/'`&H',\!F
+MBX=P"P``@\`")?__``!0BX=<"P``_U`$:(`````SP&:+AW`+``"#P`,E__\`
+M`%"+AUP+``#_4`1J,HN'7`L``/]0-(/$%%_#@\<`BU0D!#/`9HM"%E"+DEP+
+M``!2Z,F-__^#Q`C#D(UT)@!7BWPD"%?HE9#__S/`@\0$BY>4$```BD=8`\*+
+MEZ`0``")AY00```SP(N/G!```(I'6@/!BX^L$```B8><$```,\"*1UL#PHN7
+MJ!```(F'H!```#/`BD=>`\*+E[`0``")AZ@0```SP(I'7P/!BX^\$```B8>L
+M$```,\"*1V`#PHN7N!```(F'L!```#/`BD=B`\*+E\`0``")A[@0```SP(I'
+M9`/!B8>\$```,\"*1V4#PHF'P!```(J'?@L``(3`="'&AWX+````C8>4$```
+M4(N78`L``%*+AUP+``#_4$"#Q`A?PSO_._^!_P````!FBTPD"(M4)`2+P8'A
+M__\``,'A""7__P``P?@(@>$`_P``)?\````+P6:)0A"+1"0,B4(2BT0D$(E"
+M:#/`:)````!FBT(6@\`')?__``!0BX)<"P``_U`$@\0(PXUT)@"+5"0$9HM"
+M$&:%P'0KQT)L`````&B(````,\!FBT(6@\`')?__``!0BX)<"P``_U`$@\0(
+MPX/'`%+HLI/__X/$!,,[_X'_`````('_`````%"+5"0(BT)LA<!T#<=";```
+M``!2_]"#Q`2#Q`3#@\<`BT0D#(M4)`A`4%+_5"0,@\0(A<!U%8M,)`R+1"0(
+M45#_5"0,@\0(A<!T";@!````PX/'`#/`PY`[_X'_`````%>+?"0(,\`SR6:+
+M1Q:)3VAFB8^@"P``@\`(B4]L)?__``!0BX=<"P``_U`<@\@()?\```!0,\!F
+MBT<6@\`()?__``!0BX=<"P``_U`$9HN'<@L``(/$#&:I`@!T/#/`9HM'%H/`
+M"27__P``4(N'7`L``/]0'(/(`27_````4#/`9HM'%H/`"27__P``4(N'7`L`
+M`/]0!(/$#%?HH;'__V;'1P)!`&;'1P0``(/$!%_#BU0D"(M,)`124>A!_/__
+MBT0D#&;'0`(A`(/$",.#QP!0BT0D"%=64XU8'%6+;"0<9C/_,_:+Q27__P``
+M4/\3P?@$@>?__P``P><$@\0$"_A&@_X$?-^^_/___XM,)""+QXO1)?__``"!
+MXO__```[PG0NB\>!Y___``#!_P0E__\``,'@#`O'1HOX?-.^!````#/`75M>
+M7X/$!,.0ZP4[_X/&!%U;7K@!````7X/$!,-3,\!FBT0D#%"+1"0,_U`<,](E
+M_@```(H5``````O",]**5"04"\**V#/`BL-0,\!FBT0D%%"+1"04_U`$N`$`
+M```BPX/$#*(`````6\,[_U,SP&:+1"0,4(M$)`S_4!PSTB7^````BA4`````
+M"\(STHI4)!3WTH'B_P```"/"BM@SP(K#4#/`9HM$)!10BT0D%/]0!+@!````
+M(L.#Q`RB`````%O#._\[_X'_`````#/`9HM$)`A0BT0D"/]0'(/@`8/$!,,[
+M_SO_@?\`````@^P85U9356@VE```BT0D-"7__P``BU0D,(/`'B7__P``4%+H
+M>/[__X/$#(7`=!U=6UZX`P```%^#Q!C#N`(```!=6UY?@\08PX/'`&A&D@``
+MBT0D-"7__P``BTPD,(/``B7__P``4%'H,_[__X/$#(7`=<B+1"0P)?__``"#
+MP`-FB40D("7__P``4(M$)##_4!S&1"0I!XK8B$0D*XM$)#"+="0D@\`$B40D
+M'(UX&#/`BL.#X+^)1"08@\0$,\`STHI4)"6*PS/")?\```!0B\8E__\``%"+
+M1"0@_Q!J8?\7B\8E__\``%#_%S/2@\00BE0D)3/"BU0D%(K8,\"*PX/@OSO0
+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
+M%KD$````14-F3HI%_XA#_W0%0CO1=>]F]\;\_W0LB\8E__\``,'X`B7__P``
+M4#/`4V:+1Q:#P!PE__\``%"+AUP+``#_4#"#Q`R+QB7\_P```]AF]\8#``^$
+MT/W__S/`9HM'%H/`'"7__P``4(N'7`L``/]0)(E$)"B#Q`0STF;WQ@,`C40D
+M)`^.H/W__XUH`;\#````9B/^0HH`B50D'(UW_8@#0SO6?2NY!````(I%`$6(
+M`T.*10!%B`-#BD4`18@#0XI%``/118@#0SO6?-Z)5"0<BU0D'#O7#XU-_?__
+MBTPD'(I%`$5!B`.)3"0<0SO/?.Q=6UY?@\0DPSO_:,`````SP(M4)`AFBT(6
+M@\`4)?__``!0BX)<"P``_U`$@\0(PX/'`#O_@?\`````5XM\)`A6BH=\"P``
+MA,!U'6H`,\!FBT<6@\`4)?__``!0BX=<"P``_U`$@\0(,\`S]F:+1Q:#P`8E
+M__\``%"+AUP+``#_4""#Q`2I@````'035^A)DO__@\@!@\0$B_#K)8/&`(I'
+M&X3`=0U7Z-_X__^#Q`2%P'0.5^BB^O__O@$```"#Q`2*AWP+``"$P'4@:,``
+M```SP&:+1Q:#P!0E__\``%"+AUP+``#_4`2#Q`B+QEY?PX/'`#O_@?\`````
+M:,`````SP(M4)`AFBT(6@\`4)?__``!0BX)<"P``_U`$@\0(PX/'`#O_@?\`
+M````5XM\)`AJ`#/`9HN'<`L``(/`+B7__P``4(N'7`L``/]0!&@```"`,\!F
+MBX=P"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P"P``@\`8)?__``!0BX=<
+M"P``_U`D,\!FBX=P"P``@\`4)?__``!0BX=<"P``_U`D@\08/00``("X````
+M``^4P%_#._^-="8`5XM\)!!6,_93BUPD$%6+;"08B\='4%7_TX/$"(7`=`RX
+M`0```%U;7E_#._]&@_X$?.!=6UXSP%_#@\<`C70F`(/L)%=64U6+1"0XBI!.
+M"P``@.+(B)!."P``9HN0<@L``&;WPH``=$"+@!0+```STHE$)##WV(/@!XE$
+M)"2+1"0XBTPD)(N`$`L``(E$)"R+1"0XBX`8"P``*\&Y+````/?QB40D(.LM
+MQT0D("````"+1"0XBX!D"P``@\`(B40D,/?8@^`'B40D)(M$)#B#P`B)1"0L
+MBU0D,#/VBWPD)`/7B50D,(M4)"`[U@^.X````(E\)!"+1"0XC7K_BU0D,(ET
+M)!2-L'(+``"+;"0DBTPD+`/I,]N-7!,0BTPD$(M$)"P#R&;W!H``=!EFQT$&
+M``!FQT$$`(!FQP$0`(E9".L3@\<`,])FB5$&9HD1B5$(9HE1!(M4)!"+1"04
+M@\(L.\>)5"00=15FQT$"``"+5"0PB6DH@\H#B5$,ZSV+5"040HT$4HT4U0``
+M```#T,'B`HM$)#`#T(E1#&;W!H``=0:#R@.)40QFQT$"``"+5"00BT0D+`/0
+MB5$H@\,LBTPD%$&+1"0@B4PD%#O(#XQ)____BUPD)(M$)#B+5"0L,_8#VHM,
+M)"")F"@+```[SHM#*(M`*(M`*(M`*(MX*'YZB5\@BT,HBV\H1HE8)(UY_8M;
+M*#OW?4.)72"+;2B+0RB#Q@0[]XE8)(M;*(E=((MM*(M#*(E8)(M;*(E=((MM
+M*(M#*(E8)(M;*(E=((M#*(MM*(E8)(M;*'R]BT0D(#OP?1B)72"+0RB+;2A&
+MB5@DBU0D((M;*#OR?.B+1"0XBU0D,(F0-`L``&:+@'(+``!FJ8``=`4S_^L&
+MD+^`!0``,_:+1"0XBXAD"P``BT0D.(U,.0@#^(O9]]F#X0<#V8U\#PB)?"0H
+M,_^)7"0P,\F#QRR+5"0H@_X?C6PZU&:)30*)30AFB4T`B5T<9HE-!'469HE-
+M!HM4)#"#R@.)50R+5"0HZQH[_V:)30:+1"0PC10XBT0D*(/*`XE5#(T4.(/#
+M+$:)52B#_B!\I(M<)"B+1"0XON#___^)F!P+``"+0RB+0"B+0"B+0"B+>"B)
+M7R"+?RB+0RB#Q@2)6"2+6RB)7R"+?RB+0RB)6"2+6RB)7R"+?RB+0RB)6"2+
+M6RB)7R"+0RB+?RB)6"2+6RA\OXM$)#B^(````(M4)#")D#@+``"*D$X+``"`
+MR@B+B!P+``")B"0+``")B"`+``"(D$X+``!=6UY?@\0DPY`[_X'_`````(/L
+M2#/`5XM\)%!FBX<\"P``#0```(!0,\!FBX=P"P``@\`4)?__``!0BX=<"P``
+M_U`,:A&-1"004#/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0,(M$)!R#Q!2(
+MA]P0``"*1"0)B(?=$```BD0D"HB'WA```(I$)`N(A]\0``"+1"0,B(?@$```
+MBD0D#8B'X1```(M$)#!FB8?B$```9HM$)"IFJ0!`=$^*1"0ZB(?D$```BD0D
+M.XB'Y1```(M$)#R(A^80``"*1"0]B(?G$```BD0D/HB'Z!```(I$)#^(A^D0
+M``!FBT0D*F:)AXX+``!?@\1(PSO_,\F(C^00``"(C^40``"(C^80``"(C^<0
+M``"(C^@0``"(C^D0``#KQ5>+?"0(:APSP&:+AW`+``"#P!@E__\``%"+AUP+
+M``#_4`PSP&:+1P90,\!FBX>:"P``4#/`BH>?"P``4(N';`L``/]0,%`SP&:+
+MAW`+``"#P!@E__\``%"+AUP+``#_4`R+EX(+```SP%)FBX=P"P``@\`8)?__
+M``!0BX=<"P``_U`,,](SP&:+EY@+``!FBX>&"P``@\($P>(0"\)0,\!FBX=P
+M"P``@\`8)?__``!0BX=<"P``_U`,:```#P`SP&:+AW`+``"#P!@E__\``%"+
+MAUP+``#_4`PSP&:+AW`+``"#P"@E__\``%"+AUP+``#_4"`E\/```%`SP&:+
+MAW`+``"#P!@E__\``%"+AUP+``#_4`R#Q$!?PSO_C70F`(/L"#/`5XM\)!!6
+M4VHJ9HN'<`L``(/`&"7__P``4(N'7`L``/]0##/V@\0(9HNWB`L``(J'GPL`
+M`,'F$#P$=`.#SA`SVXJ??0L``/?#`@```'0#@\X$]\,!````=`.#S@(SVV:+
+MGYH+``#WPT````!T!H'.``0``/?#(````'0&@<X`@```5C/`9HN'<`L``(/`
+M&"7__P``4(N'7`L``/]0#(N7B@L``#/`4F:+AW`+``"#P!@E__\``%"+AUP+
+M``#_4`R+CY`+```SP%%FBX=P"P``@\`8)?__``!0BX=<"P``_U`,BX>4"P``
+M4#/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0##/V@\0@BY8`````,\!29HN'
+M<`L``(/`&"7__P``4(N'7`L``/]0#(/$"(/&!(/^$GS39L='`D(`6UY?@\0(
+MPY`[_X'_`````&H(,\"+5"0(9HN"<`L``(/`&"7__P``4(N"7`L``/]0#(/$
+M",.#QP`[_X'_`````&H(,\"+5"0(9HN"<`L``(/`&"7__P``4(N"7`L``/]0
+M#(/$",.#QP`[_X'_`````%>+?"0(:@HSP&:+AW`+``"#P!@E__\``%"+AUP+
+M``#_4`R+EY0+```SP%)FBX=P"P``@\`8)?__``!0BX=<"P``_U`,@\007\.#
+MQP"-="8`5XM\)`AJ"C/`9HN'<`L``(/`&"7__P``4(N'7`L``/]0#(N7D`L`
+M`#/`4F:+AW`+``"#P!@E__\``%"+AUP+``#_4`R#Q!!?PX/'`(UT)@!75HMT
+M)`PSP&:+AG`+``"#P!@E__\``%"+AEP+``#_4"2+^"7_````BY:4$```BXZ8
+M$````\*+EIP0``")AI00``"+Q\'H""7_`````\&)AI@0``"+Q\'H$,'O&"7_
+M`````\*+EJ`0``")AIP0```SP&:+AG`+``"!Y_\````#^H/`&(F^H!```"7_
+M_P``4(N&7`L``/]0)(OX)?\```"+CJ00``"+EJ@0```#P8N.L!```(F&I!``
+M`(O'P>@()?\````#PHN6K!```(F&J!```(O'P>@0P>\8)?\````#PH'G_P``
+M`(F&K!```#/`9HN&<`L```/Y@\`8B;ZP$```)?__``!0BX9<"P``_U`DB_@E
+M_P```,'O"(N6M!````/"BY:X$```@>?_````B8:T$````_J)OK@0``!6Z"_Z
+M__^#Q!"*AGX+``"$P'0AQH9^"P```(V&E!```%"+CF`+``!1BX9<"P``_U!`
+M@\0(7E_#._^!_P````"!_P````!J$C/`BU0D"&:+@G`+``"#P!@E__\``%"+
+M@EP+``#_4`R#Q`C#@\<`._^!_P````!7BWPD"&H*,\!FBX=P"P``@\`8)?__
+M``!0BX=<"P``_U`,@\0(BH>?"P``N@`!```\!'0$9H/*$#/)BH]]"P``]\$"
+M````=`1F@\H$]\$!````=`1F@\H"@>+__P``,\!29HN'<`L``(/`&"7__P``
+M4(N'7`L``/]0"(/$"%_#D&H(,\"+5"0(9HN"<`L``(/`&"7__P``4(N"7`L`
+M`/]0#(/$",.#QP`[_X'_`````&:+1"0(BU0D!&8+@J`+``!FB8*@"P``9HN"
+MH@L``&:%P'4:9HM"`F8],`!R$,:"NPL```!2Z`;%__^#Q`3#._]7BWPD"%?H
+MQ=?__XN78`L``%*+AUP+``#_4#R#Q`A?PU>+?"0(4S+;#[Z'3@L``*F`````
+M="NI!````'03BH=."P``#""(ATX+``#K%(/&`(J'3@L``"1?@,L$B(=."P``
+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
+MT'749L=#`@``BT,,@\@#B4,,BXXT"P``,\!19HN&<`L``(/`/"7__P``4(N&
+M7`L``/]0#&;'1@)@`(J&3@L```P$@\0(B(9."P``6UY?PSO_@?\`````5XM\
+M)`@SP&:+AT(+``!0,\!FBX=P"P``@\`4)?__``!0BX=<"P``_U`,,\!FBX=P
+M"P``@\`8)?__``!0BX=<"P``_U`D)?__``"#Q`Q?PY!7BWPD"#/)9L='`D$`
+M9HF/H@L``(J'G0L``(B'GPL``#/`9L>'H`L```X`9HE/!%%FBX=P"P``@\`N
+M)?__``!0BX=<"P``_U`$5^BAO/__@\0,7\.!_P````"!_P````"#["`STE>+
+M?"0H5E-5B50D&`^_A[0+``")5"00B40D'(7`=#F*C[<+``"!X?\```"+P8/@
+M'XT$0,'@`XVL![P+```#31")3"0@@^$?C01)P>`#C80'O`L``(E$)"B+MRP+
+M``!FBT8$9JD`0`^$Y`(``(V?3@L``(M$)!R%P`^$7`$``(M4)"B+1"0H,\EF
+MBU(,9HM`"('B__\``&:+#B7__P```]$[P@^-]P```&:+AYH+``!FJ0(`=$J+
+M1"0HBU0D*,9%#@-FBT`(9HM2#"7__P``@>+__P``*\(/A/,```!0BT0D+#/2
+M9HM0#(L(`]&-1A!24.C\____@\0,Z=(````[_XM$)!R+51!"2(E$)!R%P(E5
+M$'\,QD4.`>FS````@\<`BT0D*(M4)"AFBT`(9HM2#"7__P``@>+__P``*\)0
+MB40D*(M$)"R+"`/1C4804E#H_/___XM$)"R+3"0P0#/2B40D+(/@'V:+%BO1
+MC01`P>`#C4P.$(V$![P+``")1"0T9HE0#('B__\``%*+1"0XBP!04>C\____
+M@\08ZS.#QP`SP#/29HL&4(M$)"QFBU`,BP@#T8U&$%)0Z/S___]FBPZ+1"0T
+M9@-(#(/$#&:)2`QFBPYF`TT*9HE-"HH#)/Z(`V:+1@1FJ8`9=$V+1"0<A<!T
+M%8J'?0L``*@$=`?&10X"ZP60QD4.`6:+1@1FJ8``=`;_A\P0``!FBT8$9JD`
+M`70&_X?($```9HM&!&:I`!!T!O^'Q!```&:+1@1FJ0`"#X2S````BTPD$(M$
+M)!Q!A<")3"00#X2>````,])FBU8&@>(`\```P?H(B%4/9HM&!F:I``)T!H#*
+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
+MC[D+``"(C[X.``"(C[\.``"(C\`.``"(C\$.``"(C\(.``"(C\,.``!=6UY?
+M@\00PSO_@^P<5U9358ML)#"+50"!^B"!``!T6EU;7C/`7X/$',-&@_X1<F@S
+M]HM$)#B+WJD$````#X3^````A=L/A/8```!FO@`*B\8E__\``%!5Z!U.``"#
+MQ`B%P'16BT0D*"7__P``]]!F(_CIJP```(/'`,=$)!P`````9L=$)"@PSHM$
+M)#2_#P```(E$)!0S]HL<M0````"%VW2-9HM#"&8]`P`/A7G___^+\^EZ____
+M._]H-I0``(O&)?__``"#P!XE__\``%!5Z%6]__^#Q`R%P'1&BTPD%(O&427_
+M_P``4%7_4Q2+1"0H@\0,0(E$)!R+1"0\BU0D'#O0#XU&`0``BT0D*(M,)!0E
+M__\``/?09B/X@\$TB4PD%(M$)"B#QB`E__\``,'X!&:)1"0H9H'^X`L/A@[_
+M___'1"08`````&;WQP$`#X3@````:$:2``"+1"0<9HL$10````!FB40D*B7_
+M_P``@\`")?__``!05>BLO/__@\0,A<!U-V:+1"0F9JD$`'0*N!P```#K"(/'
+M`+@0````,])FBU0D)@/0@>+__P``4E7H94?__X/$"(7`='@SP&:+1"0F4%7H
+MP+W__X/$"#/VB\B+'+4`````A=MT&#/`B]%FBT,(@>+__P``.\)T"$:#_A%R
+MW3/;A=MT.HM$)#B+$X70=#"+5"04,\!FBT0D)E)05?]3%(M,)"B#Q`Q!BT0D
+M/(E,)!P[R'TFBU0D%(/"-(E4)!2!Y___``"+3"08P?\!08E,)!B#^00/C/K^
+M__^+1"0<75M>7X/$',.#QP"!_P````"!_P````"#[`A75HM$)!2+$('Z(($`
+M`'057KC_____7X/$",,[_S/`7E^#Q`C#N.`/``"+3"049B-$)!PE__\``%!1
+MZ,Y+``"#Q`B%P'77BT0D'"7__P``4(M$)!A0Z,.\__^#Q`B+R&:#^6-TN#/V
+MBSRU`````(7_=!@SP(O19HM'"('B__\``#O"=`A&@_X1<MTS_X7_=(V+5"08
+MBT0D'%(E__\``%"+3"0<4?]7%(/$#%Y?@\0(PY"!_P````"!_P````"+3"0$
+M,\"+D5`+``!29HN!<`L``(/`""7__P``4(N!7`L``/]0#(/$",,[_XUT)@"+
+M5"0$,\!FBT($4(L"_U`<)?\```"#Q`3#@\<`C70F`#/`BU0D!(I$)`A0,\!F
+MBT($4(L"_U`$@\0(PY"-="8`5XM\)`AJ88L'_U`<:F&+!_]0'&IABP?_4!QJ
+M88L'_U`<@\007\,[_SO_@?\`````,\!FBT0D"%"+1"0(BP#_4#2#Q`3#@\<`
+M._^!_P````"#[!PSP%=64XMT)"Q5BUPD-&:+AG`+``"#P#(E__\``%"+AEP+
+M``#_4""+TR7__P``@>+__P``(\*#R`*+^"7__P``4#/`9HN&<`L``(/`,B7_
+M_P``4(N&7`L``/]0"('C__\``#/`@\L"9HE<)#9H4```@&:+AG`+``"#P!0E
+M__\``%"+AEP+``#_4`R[]/___X/$%#/`9HN&<`L``(/`&"7__P``4(N&7`L`
+M`/]0)(E$'""#Q`2#PP1\V<=$)"0`````,]*+QV:+5"0J)?__``"[#````#O"
+M#X0B`0``B^\S_V:+^L'G$('/QP<``&A0``"`,\!FBX9P"P``@\`4)?__``!0
+MBX9<"P``_U`,:+A`8(XSP&:+AG`+``"#P!@E__\``%"+AEP+``#_4`QHV+MR
+M`#/`9HN&<`L``(/`&"7__P``4(N&7`L``/]0#%<SP&:+AG`+``"#P!@E__\`
+M`%"+AEP+``#_4`R!Y?W_```SP%5FBX9P"P``@\`R)?__``!0BX9<"P``_U`(
+MNT3]__^#Q"@SP&:+AG`+``"#P!(E__\``%"+AEP+``#_4""#Q`1#?-\SP+N\
+M`@``9HN&<`L``(/`,B7__P``4(N&7`L``/]0((M4)"B#Q`2+Z"7__P``0HE4
+M)"0STF:+5"0J.\)T#8M$)"2#^&0/C.[^__]H4```@#/`9HN&<`L``(/`%"7_
+M_P``4(N&7`L``/]0#+OT____@\0(BTP<'#/`46:+AG`+``"#P!@E__\``%"+
+MAEP+``#_4`R#Q`B#PP1\V%V[#````%M>7X/$',,[_X/L"#/`5XM\)!!64U5J
+M`&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP&:+AW`+``"#P#(E__\``%"+
+MAUP+``#_4""+\&:!YO[_B\8E__\``%`SP&:+AW`+``"#P#(E__\``%"+AUP+
+M``#_4`AF@>;]_S/`@>;__P``5F:+AW`+``"#P#(E__\``%"+AUP+``#_4`B*
+MATX+```D_HB'3@L``#/`9HN'<`L``(/`$B7__P``4(N'7`L``/]0((/$((OP
+M9H'.``*[#P```&:#SA!F(]Z#^P=^!;L'````A=MT#XU+_[L!````T^/K"(/'
+M`+L!````9H'F_^.*AW\+``"$P'0J,]*+PR7__P``BI=_"P``.\)\%V:!S@`8
+M9HN'@`L``&:I$`!T!6:!S@`$@>;__P``,\!69HN'<`L``(/`$B7__P``4(N'
+M7`L``/]0"(/$"(J'?`L``(3`=2-HG"```#/`9HN'<`L``(/`""7__P``4(N'
+M7`L``/]0#(/$",>'4`L``)P@``"!X___```SP$.*AW\+``"+TXOS@>+__P``
+M.\)^!&8/MMB!YO__``"X_0```"O&@>/__P``B^@E__\``(F'5`L``#/`P>,(
+M"]Z!X___``!39HN'<`L``(/`(B7__P``4(N'7`L``/]0"('E__\``#/`@<T`
+M?P``@>7__P``56:+AW`+``"#P"`E__\``%"+AUP+``#_4`AJ`#/`9HN'<`L`
+M`(/`'B7__P``4(N'7`L``/]0"(/$&+Y<````9HN'<@L``&:I@`!U`X/.`E8S
+MP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`QJ`#/`9HN'<`L``(/`!B7__P``
+M4(N'7`L``/]0"(N''`L``(/FXXF')`L``(F'(`L``(J'3@L```P(B(=."P``
+M,\!69HN'<`L``(/`)"7__P``4(N'7`L``/]0#&;'AT@+`````(/$&%U;7E^#
+MQ`C#@\<`@?\`````@?\`````@^P,5U9358U$)!B+;"0H4%6+5"0LBW0D*%+H
+M<<3__X/$#(7`#X7&````:````("+1"0<)?__``"->`,SP&:+AG`+``#!_P*#
+MP!0E__\``%"+AEP+``#_4`R+3"0@,\!19HN&<`L``(/`&"7__P``4(N&7`L`
+M`/]0#(/$$+L!````._M^1HU$)!A0BT0D*%50Z/O#__^#Q`R%P'0'C4?_.]AU
+M38M4)!@SP%)FBX9P"P``@\`8)?__``!0BX9<"P``_U`,@\0(0SO??+I6BX9L
+M"P``_U`L9L=&`B$`9L=&!```,\"#Q`1=6UY?@\0,PSO_75M>N`$```!?@\0,
+MPX/'`%>_PB```%:^!````&:+5"00BDPD#&8C\H7V=`:!YW____^$R74*@<\`
+M`@``ZPT[_X#Y$'4&@<\``0``P><0@<\`,0``9O?""`!T!H'G_^___X7V=`:!
+MY__?__]FBT0D%&8]#P!U`X//!(O'7E_#._^#[!PSP#/)5XM\)"Q6BW0D+%.+
+M7"0LQD<!!,9',`)FBT809L='$D``9HE/%B7\_P``9HE'$&:)3Q2+1A1FQT<<
+M`$#&1QZB@^#PB4<8BT8PB4<HBT<8A<!T$F:+1@1FJ0(`=`B*1QX,0(A''FH`
+M,\!FBT<0@\`N)?__``!0_U,$QD<?`#/`9HM'$(/`*27__P``4/]3'(/$#"7P
+M````@_@0=0B*1Q\,.(A''S/`9HM'$(/`$B7__P``4/]3(&:)1"0H)?__``"#
+MR"`E__\``%`SP&:+1Q"#P!(E__\``%#_4PB)7"0D9HM'$&:)1"0HC40D'%"-
+M1"0H:@1J(%#HS^?__XM$)"R#Q!PSTB7__P``9HM4)!(#PHM4)!2!XO__```#
+MPC/29HM4)!8E__\``#O"=2Z+1"00B$<BBD0D$8A'(XI$)!*(1R2*1"03B$<E
+MBT0D%(A')HI$)!6(1R?K$#O_,\EFB4\B9HE/)&:)3R:-1"0F4(U$)!QJ`6H-
+M4.A/Y___,\"#Q!!FBT0D)HE$)`RI`0```'0&,\#K&SO_BT0D#*D"````=`FX
+M$````.L'._^X!````,9'(?^(1RR+1"0D)?__``!0,\!FBT<0@\`2)?__``!0
+M_U,(9HM&!(/$"&:I!`!T"S/`6UY?@\0<PSO_6UY?N`(```"#Q!S#C70F`(M$
+M)`3'@%`+````````PY"#[`@SP%=6BW0D%&:+AG`+``"#P!(E__\``%"+AEP+
+M``#_4""+^"7__P``@\@@)?__``!0,\!FBX9P"P``@\`2)?__``!0BX9<"P``
+M_U`(BX9<"P``BU0D)(E$)!1FBX9P"P``4FH(:CAFB40D)(U$)"!0Z.CO__^!
+MY___```SP%=FBX9P"P``@\`2)?__``!0BX9<"P``_U`(@\0D7E^#Q`C#D('_
+M`````('_`````(/L"#/`5U93BW0D&&:+AG`+``"#P!(E__\``%"+AEP+``#_
+M4""+^"7__P``@\@@)?__``!0,\!FBX9P"P``@\`2)?__``!0BX9<"P``_U`(
+MBX9<"P``BU0D*(E$)!AFBX9P"P``4FH(:CAFB40D*(U$)"10Z(?K__^+V#/`
+M@>?__P``5V:+AG`+``"#P!(E__\``%"+AEP+``#_4`B#Q"2+PUM>7X/$",.#
+MQP"-="8`@^P05S/_5HMT)!Q358ML)"AFBT4P9JD`@'0DC5TP:F2+AEP+``#_
+M4#2+QT>#Q`2#^&0/CY`"``!F]P,`@'7?:F2+AEP+``#_4#1J`C/`9HN&<`L`
+M`(/`+B7__P``4(N&7`L``/]0!&H6,\!FBX9P"P``@\`6)?__``!0BX9<"P``
+M_U`$:@8SP&:+AG`+``"#P!8E__\``%"+AEP+``#_4`1J`#/`9HN&<`L``(/`
+M+B7__P``4(N&7`L``/]0!+D`@```,\!FB4U<9HF-B````&H!9HN&<`L``(/`
+M*"7__P``4(N&7`L``/]0"(/$+#/_9HN%B````&:I`(!T)XV=B````&IDBX9<
+M"P``_U`TB\='@\0$@_AD#X^;`0``9O<#`(!UWVIDBX9<"P``_U`T:@(SP&:+
+MAG`+``"#P"XE__\``%"+AEP+``#_4`1J%C/`9HN&<`L``(/`%B7__P``4(N&
+M7`L``/]0!&H&,\!FBX9P"P``@\`6)?__``!0BX9<"P``_U`$:@`SP&:+AG`+
+M``"#P"XE__\``%"+AEP+``#_4`1FQX6T`````(`SVX/$)(V]X````&;W!P"`
+M=0F#QRQ#@_L%?/"#^P5U`C/;C11;C13:P>("C805W@```&:+$&:!X@`!9HD0
+MC11;C13:P>("9L>$%>(``````(T46XT4VL'B`HV$%>````")1"0<9L<``(`S
+MP&H%9HN&<`L``(/`*"7__P``4(N&7`L``/]0"(M$)"2#Q`@S_V;W``"`=">)
+M7"00B]AJ9(N&7`L``/]0-(O'1X/$!(/X9']*9O<#`(!UXXM<)!`SP(T,6V:+
+MA;`````STHT,V8/`!,'A`F:+E`W<````.\)T$+@$````75M>7X/$$,.#QP!=
+M6UXSP%^#Q!##._]=6UZX`P```%^#Q!##@\<`75M>N`(```!?@\00PX/'`%U;
+M7K@!````7X/$$,.#QP`[_X'_`````(/L9#/`5XM\)&Q64U5FBX=P"P``4(N'
+M7`L``/]0(&:)1"1T,\!FBX=P"P``@\`D)?__``!0BX=<"P``_U`DB40D8#/`
+M9HN'<`L``(/`!"7__P``4(N'7`L``/]0)(E$)&`SP&:+AW`+``"#P`@E__\`
+M`%"+AUP+``#_4"!FB40D?C/`9HN'<`L``(/`*B7__P``4(N'7`L``/]0(&:)
+MA"2`````,\!FBX=P"P``@\`2)?__``!0BX=<"P``_U`@9HF$)((````SP&:+
+MAW`+``"#P`PE__\``%"+AUP+``#_4"2+GQ0+``"+EQ`+``#WVXE$)&PSP&:+
+MAW`+``"#XP>#P!"+CQ0+``"--!HE__\``%"+AUP+```#V8E<)'S_4"!H__\`
+M`#/`9HN'<`L``(/`$"7__P``4(N'7`L``/]0"&H`,\!FBX=P"P``4(N'7`L`
+M`/]0"&@=X`<`,\!FBX=P"P``@\`D)?__``!0BX=<"P``_U`,:@`SP&:+AW`+
+M``"#P`0E__\``%"+AUP+``#_4`QJ`#/`9HN'<`L``(/`""7__P``4(N'7`L`
+M`/]0"&H`,\!FBX=P"P``@\`J)?__``!0BX=<"P``_U`(,\!FBX=P"P``@\`R
+M)?__``!0BX=<"P``_U`@)?]_``!0,\!FBX=P"P``@\`R)?__``!0BX=<"P``
+M_U`(,\!FBX=P"P``@\`2)?__``!0BX=<"P``_U`@)?#L``"#R`$E__\``%`S
+MP&:+AW`+``"#P!(E__\``%"+AUP+``#_4`AJ`C/`9HN'<`L``(/`+B7__P``
+M4(N'7`L``/]0!#/`9HN'<`L``(/`%B7__P``4(N'7`L``/]0'(K8,\"*PX/(
+M$(B$).8````E_P```%`SP&:+AW`+``"#P!8E__\``%"+AUP+``#_4`1J`#/`
+M9HN'<`L``(/`+B7__P``4(N'7`L``/]0!#/`9HN'<`L``(/`#"7__P``4(N'
+M7`L``/]0)"7__P``#0```P!0,\!FBX=P"P``@\`,)?__``!0BX=<"P``_U`,
+M:@(SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP(K#@^#OB(0D"P$``"7_
+M````4#/`9HN'<`L``(/`%B7__P``4(N'7`L``/]0!&H`,\!FBX=P"P``@\`N
+M)?__``!0BX=<"P``_U`$@<2H````,]N*@P````!#@_L*B(0>MP$``'+M,]N)
+M?"00BT0D7(VNZ````(E$)&0%W````(E$)&"+1"1<!;@!``")="04B40D3(M$
+M)%P%R`$``+DL````B40D2(V&Y````(E$)!R-AN(```")1"0@C8;@````B40D
+M)(V&W@```(E$)"B-AMP```")1"0LC48,B40D,(U&"(E$)#2-1@:)1"0XC48$
+MB40D/(U&`HOXBT0D/$-FQP80`(M4)$QFQP<```/Q9L<```"+1"0X`_EFQP``
+M!HM$)#2)$(M$)&0#P8E$)&2+1"0PBU0D9(/*`8D0BU0D2(M$)"QFQP`8`(M$
+M)"AFQP```(M$)"1FQP``@(M$)"!FQP```(M$)!R)$(M4)&`#T8M$)#P#P8E5
+M`(E$)#R+1"0XB50D8(M4)#0#P0/1B40D.(M$)#")5"0TBU0D*`/!`]&)1"0P
+MBT0D+(E4)"B+5"0<`\$#T8E$)"R+1"0D`\$#Z8E$)"2+1"0@`\&#^P6)1"0@
+MB50D'`^,'O___XM$)%R+="04BWPD$(/(`8F&O````+D`@```9HN&M@```&8-
+M``%FB8:V````BT0D7&:)3@0%W````&:)3C")AI@!``!FBX:.`0``9@T``6:)
+MAHX!``"+1"1<!=P```!0,\!FBX=P"P``@\`\)?__``!0BX=<"P``_U`,BTPD
+M9#/`46:+AW`+``"#P#@E__\``%"+AUP+``#_4`Q65^AR]___B_`SP&:+AW`+
+M``"#P"0E__\``%"+AUP+``#_4"0-````!5`SP&:+AW`+``"#P"0E__\``%"+
+MAUP+``#_4`QJ9(N'7`L``/]0-(N$))@````E__\``%`SP&:+AW`+``!0BX=<
+M"P``_U`(BX0DB````%`SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`R+E"2,
+M````,\!29HN'<`L``(/`!"7__P``4(N'7`L``/]0##/`9HN$)*X```!0,\!F
+MBX=P"P``@\`()?__``!0BX=<"P``_U`(BX0DM````"7__P``4#/`9HN'<`L`
+M`(/`*B7__P``4(N'7`L``/]0"#/`9HN$)+H```!0,\!FBX=P"P``@\`2)?__
+M``!0BX=<"P``_U`(:@(SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP(J$
+M)-(```!0,\!FBX=P"P``@\`6)?__``!0BX=<"P``_U`$:@`SP&:+AW`+``"#
+MP"XE__\``%"+AUP+``#_4`2+C"3`````,\!19HN'<`L``(/`#"7__P``4(N'
+M7`L``/]0#&H",\!FBX=P"P``@\`N)?__``!0BX=<"P``_U`$,\"*A"3S````
+M4#/`9HN'<`L``(/`%B7__P``4(N'7`L``/]0!&H`,\!FBX=P"P``@\`N)?__
+M``!0BX=<"P``_U`$@<20````A?9T'%U;B\9>7X/$9,,[_[@&````75M>7X/$
+M9,.#QP`SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4"2#Q`2#X!2#^!1UREU;
+M7C/`7X/$9,,[_X'_`````#/`BU0D!&:+1"0(4#/`9HN"<`L``(/`,B7__P``
+M4(N"7`L``/]0"(/$",.0C70F`(/L%#/`5XM\)!Q64U5J`&:+AW`+``"#P"XE
+M__\``%"+AUP+``#_4`0SP&:+AW`+``"#P#(E__\``%"+AUP+``#_4""+\&:!
+MYO[_B\8E__\``%`SP&:+AW`+``"#P#(E__\``%"+AUP+``#_4`AF@>;]_S/`
+M@>;__P``5F:+AW`+``"#P#(E__\``%"+AUP+``#_4`B*ATX+```D_HB'3@L`
+M`#/`9HN'<`L``(/`$B7__P``4(N'7`L``/]0((/$((OP9H/.$+L/````9B/>
+M@_L+?@6["P```(7;=`R-2_^[`0```-/CZP6[`0```&:!YO_CBH=_"P``A,!T
+M*C/2B\,E__\``(J7?PL``#O"?!=F@<X`&&:+AX`+``!FJ1``=`5F@<X`!('F
+M__\``#/`5F:+AW`+``"#P!(E__\``%"+AUP+``#_4`B#Q`B*AWP+``"$P'4C
+M:%P@```SP&:+AW`+``"#P`@E__\``%"+AUP+``#_4`R#Q`C'AU`+``!<(```
+M@>/__P``,\"*AW\+``"-<P&+WCO#=@0SVXK8O0`(```SP"ONB:]4"P``:@)F
+MBX=P"P``@\`N)?__``!0BX=<"P``_U`$,\!FBX=P"P``@\`6)?__``!0BX=<
+M"P``_U`<B$0D+R7_````@\@0)?\```!0,\!FBX=P"P``@\`6)?__``!0BX=<
+M"P``_U`$:`\0#P`SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`QH'Q```#/`
+M9HN'<`L``(/`*"7__P``4(N'7`L``/]0#&H`,\!FBX=P"P``@\`N)?__``!0
+MBX=<"P``_U`$P>L!,\!#P>,0@<L``@``4V:+AW`+``"#P`PE__\``%"+AUP+
+M``#_4`S![0(SP,'N`;KZ`P``P>40*]8+ZE5FBX=P"P``@\`@)?__``!0BX=<
+M"P``_U`,:@(SP&:+AW`+``"#P"XE__\``%"+AUP+``#_4`0SP(I$)&<E[P``
+M`%`SP&:+AW`+``"#P!8E__\``%"+AUP+``#_4`1J`#/`9HN'<`L``(/`+B7_
+M_P``4(N'7`L``/]0!&H`,\!FBX=P"P``4(N'7`L``/]0"(/$7+Y`````9HN'
+M<@L``&:I@`!U`X/.`E8SP&:+AW`+``"#P"0E__\``%"+AUP+``#_4`QJ`#/`
+M9HN'<`L``(/`!"7__P``4(N'7`L``/]0#(/$$(N''`L``(F')`L``(F'(`L`
+M`(J'3@L```P(B(=."P``BX<8"P``/>@!``!R"5?H`/3__X/$!('.````!S/`
+M5F:+AW`+``"#P"0E__\``%"+AUP+``#_4`QFQX=("P````"#Q`A=6UY?@\04
+MPX/'`(UT)@"#[`Q75E-5C40D&(ML)"A058M4)"R+="0H4NAQL/__@\0,A<`/
+MA28!``!H````@(M$)!PE__\``(UX`S/`9HN&<`L``,'_`H/`%"7__P``4(N&
+M7`L``/]0#(M,)"`SP%%FBX9P"P``@\`8)?__``!0BX9<"P``_U`,@\00NP$`
+M```[^WY*C40D&%"+1"0H55#H^Z___X/$#(7`=`N-1_\[V`^%J0```(M4)!@S
+MP%)FBX9P"P``@\`8)?__``!0BX9<"P``_U`,@\0(0SO??+9H\+\`@#/`9HN&
+M<`L``(/`%"7__P``4(N&7`L``/]0#&B0ZE``,\!FBX9P"P``@\`8)?__``!0
+MBX9<"P``_U`,:@`SP&:+AG`+``"#P!@E__\``%"+AEP+``#_4`Q6BX9L"P``
+M_U`L9L=&`B$`9L=&!```,\"#Q!Q=6UY?@\0,PY!=6UZX`0```%^#Q`S#@\<`
+M@^P(,])7BTPD&%:+="084XM<)!@S_V:#^11U!X#[9'4",MMF]\8(`'4%@/MD
+M=06Z`0```&;WQ@0`=`F%TG4%OP$```!F@_D3=0V$VW4)A?]T!;D4````OL(@
+M``"%_W0&@>9_____A-NX``````^4P(E$)!"%P'04@<X`$```9H/Y$W4C@<X@
+M"```ZQN`^Q!U"X'.``$``.L.@\<`@/MD=0:!S@`"``#!YA"!S@`Q``"%TG0&
+M@>;_[___A?]T!H'F_]___XM$)!"%P'4%@/MD=0QF@_D3=0:!S@!"``"`^V1U
+M!H'F_^[__UN+QEY?@\0(PX/'`('_`````('_`````%>+?"0(,\#'AU`+````
+M````:@!FBX=P"P``@\`N)?__``!0BX=<"P``_U`$,\!FBX=P"P``@\`")?__
+M``!0BX=<"P``_U`<@\@&)?\```!0,\!FBX=P"P``@\`")?__``!0BX=<"P``
+M_U`$@\047\.#[`@SP%=6BW0D%&:+AG`+``"#P!(E__\``%"+AEP+``#_4""+
+M^"7__P``@\@@)?__``!0,\!FBX9P"P``@\`2)?__``!0BX9<"P``_U`(BX9<
+M"P``B40D%#/`9HN&<`L``&H"@\`P9HE$)!PSP&:+AG`+``"#P"XE__\``%"+
+MAEP+``#_4`2+5"0LC40D'%)J"&HX4.AVW/__:@`SP&:+AG`+``"#P"XE__\`
+M`%"+AEP+``#_4`2!Y___```SP%=FBX9P"P``@\`2)?__``!0BX9<"P``_U`(
+M@\0T7E^#Q`C#._^!_P````"!_P````"#[`@SP%=64XMT)!AFBX9P"P``@\`2
+M)?__``!0BX9<"P``_U`@B_@E__\``(/(("7__P``4#/`9HN&<`L``(/`$B7_
+M_P``4(N&7`L``/]0"(N&7`L``(E$)!@SP&:+AG`+``!J`H/`,&:)1"0@,\!F
+MBX9P"P``@\`N)?__``!0BX9<"P``_U`$BU0D,(U$)"!2:@AJ.%#HU=?__XO8
+M,\!J`&:+AG`+``"#P"XE__\``%"+AEP+``#_4`2!Y___```SP%=FBX9P"P``
+M@\`2)?__``!0BX9<"P``_U`(@\0TB\-;7E^#Q`C#._^!_P````!05U:+?"08
+M4[D!````BW0D&(A/,(@/B$\!9HEW$+D$````9HE/$F:%SG0)N!P```#K!SO_
+MN!````!FQT<6$`"+UC/)9HE/'('B__\```/0B\9FB5<4)?__``"#P`*)3Q@E
+M__\``%"+1"08_U`<BMB+QB7__P``@\`#)?__``!0BT0D'/]0'(A$)!>#Q`BX
+M`P```"+#BH``````B$<@BD0D#ZB`=!,SP(K#)?P````-``$``(OPZP209C/V
+M@>;__P``P>8+B7<HBD0D#Z@(=`G&1RP0ZP>#Q@#&1RP$QD<>!#/`9HM'%(/`
+M""7__P``4(M$)!C_4!R#Q`2I`@```'0PQD<A!(I''@P8B$<>C4<BBU0D%%`S
+MP&:+1Q104NAO;/__@\0,N`$```!;7E^#Q`3#,\"*1"0/P?@$@^`#BH``````
+MB$<A/`1U"XI''@P0B$<>Z[F0BD<>#`.(1Q[KKCO_@^P,N0$```!7BWPD'%:+
+M="084U6(3P&(3S"+1"0DN00```!FB4<09H7(9HE/$L8'`G0)N!P```#K!SO_
+MN!````!FQT<6$`"+5"0D,\EFB4\<@>+__P```]"+1"0D9HE7%"7__P``@\`"
+MB4\8B]@E__\``%#_5AR(1"0;:@6+PR7__P``4/]6!(M$)#`E__\``(/``XOH
+M)?__``!0_U8<B$0D*XO#:@8E__\``%#_5@2+Q27__P``4/]6'(I4)#>#Q!SV
+MP@&(1"0:=02H@'0EQD<>`&H"B\,E__\``%#_5@2+Q27__P``4/]6'(A$)"5J
+M`^LCD,9''@1J`(O#)?__``!0_U8$B\4E__\``%#_5AR(1"0E:@&+PR7__P``
+M4/]6!(O%)?__``!0_U8<B$0D,(/$&+@'````(D0D&8J``````(A'((M$)!BH
+M`70'QD<L$.L%D,9'+`2+1"08J(!T&+AX````BU0D&"+"#0`#``!FB40D%.L(
+MD&;'1"04``"+1"04)?__``#!X`J)1RB*1"0:J$!T#L9'(02*1QX,"(A''NL5
+M,\"*1"09P?@#@^`'BH``````B$<ABD<A/`1U3(I''@P0B$<>:@:+PR7__P``
+M4/]6!(U'(H'E__\``%!J/%56Z&AN__\SP('C__\``(I$)"]04_]6!(/$(+@!
+M````75M>7X/$#,.#Q@"*1QX,`^NRD('_`````('_`````%>+?"0(,\!FBX=P
+M"P``@\`")?__``!0BX=<"P``_U`<)?<```!0,\!FBX=P"P``@\`")?__``!0
+MBX=<"P``_U`$@\0,7\,[_SO_@?\`````5XM\)`AJ!3/`9HN'<`L``(/``B7_
+M_P``4(N'7`L``/]0!#/`9HN'<`L``(/``R7__P``4(N'7`L``/]0'"7W````
+M4#/`9HN'<`L``(/``R7__P``4(N'7`L``/]0!(/$%%_#D('_`````('_````
+M`%`SP%>+?"0,:@)FBX=P"P``@\`")?__``!0BX=<"P``_U`$,\!FBX=P"P``
+M@\`#)?__``!0BX=<"P``_U`<BU0D'(/$#(K(N`<````BP8'B_P```(J`````
+M`"7_````.\)T5HM$)!`E_P```(J``````(A$)`<\!W8*N`,```!?@\0$PS/`
+M,]**P8I4)`<E^`````O")?\```!0,\!FBX=P"P``@\`#)?__``!0BX=<"P``
+M_U`$@\0(,\!?@\0$PU>+?"0(:@(SP&:+AW`+``"#P`(E__\``%"+AUP+``#_
+M4`0SP&:+AW`+``"#P`,E__\``%"+AUP+``#_4!R*R#/`@\0,BL'!^`,STH/@
+M!XI4)`R*@``````E_P```#O"=#Z*D@`````SP(K!@>+_````P>(#)<<````+
+MPB7_````4#/`9HN'<`L``(/``R7__P``4(N'7`L``/]0!(/$"%_#@\<`@?\`
+M````@?\`````5XM\)`AJ`#/`9HM'%H/`'B7__P``4(N'7`L``/]0!&H(5^A9
+MD?__@\00)0`+```]``,``'42N`$```"(1QM?P[@!````7\.0:@97Z#"1__^#
+MQ`BI@````'7F,\!?PSO_:@0SP(M4)`AFBT(6@\`>)?__``!0BX)<"P``_U`$
+M@\0(PSO_@?\`````@?\`````@^P0,\!7BWPD&%9356:+AW`+``"#P!XE__\`
+M`%"+AUP+``#_4!R*V+@!````(L,E_P```%`SP&:+AW`+``"#P!XE__\``%"+
+MAUP+``#_4`0SP&:+1Q:#P`@E__\``%"+AUP+``#_4""+\+@``P``9B/&@\00
+M/0`#```/A8`"``"+QB7__P``#0`(```E__\``%`SP&:+1Q:#P`@E__\``%"+
+MAUP+``#_4`@SP&:+1Q:#P`XE__\``%"+AUP+``#_4"!FB40D*H/$#&:%P`^$
+M#@(``#/`9HM'%H/`!B7__P``4(N'7`L``/]0(&:)1"0@,\!FBT<6@\`$)?__
+M``!0BX=<"P``_U`@BVPD)(/$"('E__\``"7__P``P>40"^AFBX=R"P``9JD0
+M`'1<9O?&``1T*3/`9HM$)!Y0,\!59HM'%H/`$"7__P``4(N'7`L``/]0*(/$
+M#.F%`0``,\!FBT0D'E`SP%5FBT<6@\`0)?__``!0BX=<"P``_U`0@\0,Z5P!
+M``"#QP`SP&:+1"0>P?@"9HE$)!BX`P```&8C1"0>9O?&``1FB40D%@^$FP``
+M`(M$)!AFA<!T,"7__P``4#/`56:+1Q:#P!`E__\``%"+AUP+``#_4#`SP&:+
+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
+M4`2#Q"1;7\.#QP!0BT0D&%>+?"0@5HMT)!13N00```#&1P$#QD<P`8@'BT0D
+M(&:)1P2+1"0<9HE'#&:%SF:)=Q!FB4\2=`BX'````.L&D+@0````9L='%A``
+MB]8SR6:)3QR!XO__```#T(O&9HE7%"7__P``B4\84(M$)!C_4!R*V(O&)?__
+M``!`)?__``!0BT0D'/]0'(A$)!>#Q`BX<````")$)`^#^'!U"\9''C#&1R$$
+MZQJ0QD<>(HM$)"!F/80*=0>P(@P!B$<>QD<A_[@#````(L.*@`````"(1R"*
+M1"0/J(!T$S/`BL,E_`````T``0``B_#K!)!F,_:!YO__``#!Y@N)=RB*1"0/
+MJ`AT)<9'+!"-1R*+3"044#/`9HM'%%!1Z$!=__^#Q`Q;7E^#Q`3#.__&1RP$
+MZ]D[_X'_`````('_`````(/L#%>_`0```%9358ML)"#'1"08`````(UU!(M4
+M)"0[^G1EC4<')?\```!0:)8```#_%F@!`0``_U4<P>`(:``!``"+V/]5'(/$
+M$`O#/80*```/A*0````]A0H``'0'/88*``!U(F@"`0``_U4<P?@$@^`#B\BX
+M`0```-/@"T0D'(E$)!R#Q`1'@_\(?HUJ`(OU:)8```#_5@0SVX/$"(ML)"2+
+M?"0HB\NX`0```-/@BU0D&(70=5PSP&:+!%T`````4%;H9XS__X/$"(/X!75#
+M5VH$:(0*``!5,\!FBP1=`````%!6Z-7]__^X`0```(/$&%U;7E^#Q`S#D&H`
+M:)8```#_%H/$"#/`75M>7X/$#,,[_T.#^P1\C5U;7C/`7X/$#,.!_P````"!
+M_P````!7BWPD"(M$)`R#P`<E_P```%!HE@```/]7!(M4)!B+3"044FH%:(4*
+M``!1:`(!``#_5QS!^`19@^`#9HL$10`````E__\``%!7Z$+]__^#Q""X`0``
+M`%_#._^!_P````!7BWPD"(M$)`R#P`<E_P```%!HE@```/]7!(M4)!B+3"04
+M4FH&:(8*``!1:`(!``#_5QS!^`19@^`#9HL$10`````E__\``%!7Z.+\__]J
+M`&B6````_U<$@\0HN`$```!?PSO_@?\`````@?\`````@^P45[\!````5E-5
+MBVPD*,=$)!@`````C74$C5T<C4<')?\```!0:)8```#_%F@!`0``_Q/!X`B)
+M1"0<:``!``#_$XM4)""#Q!`+PF:)1"0B,\!FBT0D(CV$"@``#X2-````/84*
+M```/A)8````]A@H```^$MP```.D:`0``._^+3"0PBT0D'%%J!&B$"@``4(M$
+M)#PE__\``%!3Z!_\__^#Q!BX`0```%U;7E^#Q!3#@\<`:@!HE@```/\6BTPD
+M.#/`46H%9HM$)#)0BT0D0%<E__\``%!5Z./[__^X`0```(/$(%U;7E^#Q!3#
+M@\<`BU0D&(E\)!Q"B50D&.F6````._]H`@$``/]5'(M4)#"#Q`3!^`2!XO__
+M``"#X`-FBP1%`````"7__P``.\)TA&@"`0``_U4<BU0D,(/$!,'X!('B__\`
+M`(/@`V:+!$4`````)?__```[PG4\:@!HE@```/\6BT0D.%`SP&H&9HM$)#)0
+MBT0D0%<E__\``%!5Z#O[__^#Q""X`0```%U;7E^#Q!3#@\<`1X/_"`^.?/[_
+M_VH`B]UHE@```/]3!(M$)""#Q`B%P'0W@_@!#X2^_O__BU0D,(M$)"Q2:@1H
+MA`H``&H`)?__``!04^C@^O__@\08N`$```!=6UY?@\04PUU;7C/`7X/$%,,[
+M_XUT)@!7BWPD"&:+AW(+``!FJ0(`=%<SP(J'>PL``(/`!R7_````4&B6````
+MBX=<"P``_U`$:`(!``"+AUP+``#_4!R#R`XE_P```%!H`@$``(N'7`L``/]0
+M!&H`:)8```"+AUP+``#_4`2#Q!Q?PY"-="8`4%=6BW0D%%.+7"0@BWPD)('[
+M/8,)`74(Q@<'ZP:#Q@#&!PC&1P$"QD<P`6:)=Q"Y!````&:)3Q)FA<Z+1"0<
+MB5\$9HE'#'0(N!P```#K!I"X$````&;'1Q80`(O6,\EFB4\<@>+__P```]"+
+MQF:)5Q0E__\``(E/&%"+1"08_U`<B$0D$XO&)?__``!`)?__``!0BT0D'/]0
+M'(K8,\"#Q`B*P\'X!(O6@^`#@>+__P``9HL$10`````E__\``#O"=`HSP%M>
+M7X/$!,.0N`,```"*5"0/(L+VPT"*@`````"(1R!T"\9''C#&1R$$ZPF0QD<>
+M(L9'(?_VPX!T%S/`BD0D#R7\````#0`!``"+\.L&@\<`9C/V@>;__P``P>8+
+M]L,(B7<H=`C&1RP0ZP8[_\9'+`2-1R*+3"044#/`9HM'%%!1Z&=7__^#Q`RX
+M`0```%M>7X/$!,,[_X'_`````%=6BT0D$,'@#(OX)?__```%@`P``"7__P``
+M4(M$)!#_4"2#Q`2+\('^/8,)`70(@?X]@PD"=2.+QR7__P``!80,```E__\`
+M`%"+1"00_U`<@\0$J0$```!U"K@!````7E_#._^!Y___``"+1"0,@<>'#```
+M@>?__P``5_]0','X!(M4)!A25H/@`XM,)!Q19HL$10`````E__\``%"+1"0@
+M4.CY_?__@\087E_#@\<`5XM$)`A64U4S_XU8)(O'P>`,B_`E__\```6`#```
+M)?__``!0_Q.#Q`2+Z(']/8,)`70,@?T]@PD"#X6!````B\8E__\```6$#```
+M)?__``!0BT0D&/]0'(/$!*D!````=%Z!YO__``"+1"04@<:'#```@>;__P``
+M5O]0','X!(/$!(/@`S/29HM4)!AFBP1%`````"7__P``.\)U(XM4)!PSP%)5
+M5XM,)"!FBT0D)%!1Z#K]__^#Q!1=6UY?PSO_1X/_$`^,0____UU;7C/`7\.#
+MQP"!_P````"!_P````!7BWPD"&:+AW(+``!FJ0(`=#XSP&:+AW`+``!`)?__
+M``!0BX=<"P``_U`<@\A`)?\```!0,\!FBX=P"P``0"7__P``4(N'7`L``/]0
+M!(/$#%_#._^!_P````"!_P````!7BWPD"&H`,\!FBT<6@\`4)?__``!0BX=<
+M"P``_U`$,\!FBT<6@\`()?__``!0BX=<"P``_U`@@\0,)0`+```]``,``'42
+MN`$```"(1QM?P[@!````7\.0,\!FBT<6@\`&)?__``!0BX=<"P``_U`@@\0$
+MJ8````!UUC/`7\,[_U>+?"0(BD<;A,!U(C/`9HM'%H/`!B7__P``4(N'7`L`
+M`/]0((/$!*F`````=!ZX`0```%_#@\8`QD<;`5?HCHS__[@!````@\0$7\-7
+MZ*Z*__^#Q`2%P'7?,\!?PX/'`&H`,\"+5"0(9HM"%H/`%"7__P``4(N"7`L`
+M`/]0!#/`@\0(PX'_`````('_`````&C`````,\"+5"0(9HM"%H/`%"7__P``
+M4(N"7`L``/]0!(/$",.#QP`[_X'_`````%>+?"0(,\!FBX=P"P``@\`2)?__
+M``!0BX=<"P``_U`<@^`_4#/`9HN'<`L``(/`$B7__P``4(N'7`L``/]0!(/$
+M#%_#@?\`````@?\`````4(M$)`B*0!N$P'4JBT0D"&:+0!8E__\``(/`%27_
+M_P``4(M$)`R+@%P+``#_4!R#Q`2HP'0*N`$```"#Q`3#D#/`@\0$PSO_._^!
+M_P````!7BWPD"&H`,\!FBT<6@\`4)?__``!0BX=<"P``_U`$,\!FBT<6@\`5
+M)?__``!0BX=<"P``_U`<@\0,J,"X`````%\/E<##._\[_X'_`````%<S_U-F
+MBUPD#(L,O0````"%R708,\"+TV:+00B!XO__```[PG0.1X/_$7+=,\!;7\.#
+MQP!;B\%?PX/'`(UT)@!7,_]3BUPD#(L,O0````"%R70-BU$$.]-T#D>#_Q%R
+MZ#/`6U_#@\<`6XO!7\.#QP!7,_]64S/2BDPD&&:+?"04P><09HM4)!`+^C/V
+MBQRU`````(7;=#>+$_?"P)\``'0GBT,$B]<E`/___X'B`/___SO"=1,SP#/2
+MBD,*BM$[PG4&B\-;7E_#1H/^$7*^6UXSP%_#@?\`````@?\`````N.P0``##
+M._\[_X'_`````(/L"%>+1"005HMT)"2+$(M\)!B!^B"!``!T&5ZX!````%^#
+MQ`C#._^X`@```%Y?@\0(PY!H[!```%?HH7K__V;'1P(``&;'!U*4,\F+1"0<
+MB(^<"P``B8=<"P``BT0D)(F'9`L``(M$)"B)AV`+```SP(F/&`L``(H&4.B0
+M_O__@\0,A<")AV@+``!TFV8/M@9FB4<&BX=H"P``BT!`B8=L"P``9HM&$&:)
+MAW`+``"+AV@+``"+0$!F@S@"=1IFBT849H7`=`EFB4<6ZPN#QP!FBT809HE'
+M%F:+1BYFB8>`"P``BD8MB(=_"P``BX=L"P``A<!T"6H`5_]0!(/$"(N':`L`
+M`(M(.(7)=`=7_U`X@\0$BD8BB(>""P``BD8CB(>#"P``BD8DB(>$"P``BD8E
+MB(>%"P``BD8FB(>&"P``BD8GB(>'"P``BD8AB(=Z"P``BD8>B(=Y"P``BD8,
+MB(=["P``BD8L/`1U#6;'AW(+`````.L+._]FQX=R"P```0"*1AZH`70H9HN'
+M<@L``&8-``%FB8=R"P``BT0D'#T4[_\`=@M>N`,```!?@\0(PXI&'J@(=!)F
+MBX=R"P``9@T$`&:)AW(+``"*1AZH!'029HN'<@L``&8-`"!FB8=R"P``BD8?
+MJ!!T$F:+AW(+``!F#4``9HF'<@L``&:+1P9F/0,`=31FBT8,9H7`=!)FBX=R
+M"P``9@T(`&:)AW(+``"*1A^H`G029HN'<@L``&8-$`!FB8=R"P``,\!FBT<&
+M@_@+=`6#^`QU![@!````ZP(SP(7`=!F*1A^H`7029HN'<@L``&8-`!!FB8=R
+M"P``9HM'!F8]#0!R-XI&'Z@(=!=FBX=R"P``9@V``&:)AW(+``#H.7+__XI&
+M'Z@@=!)FBX=R"P``9@T@`&:)AW(+``"+AVP+``"%P'065_]0#(/$!(7`=0M>
+MN`$```!?@\0(PV;'1P(0`(N';`L``&:#.`%U!,9'&@!>,\!?@\0(PSO_5HMT
+M)`AFBX9R"P``9JD`0'0*N`$```!>PX/'`#/`9HL&/5*4``!U)&:+1@)F/2``
+M=AJ*AGP+``"$P'4*5O^6I`L``(/$!/Z&?`L``#/`7L,SP(M4)`1FBP(]4I0`
+M`'4J9HM"`F8](`!V((J"?`L``(3`=!;^R(B"?`L``(3`=0I2_Y*H"P``@\0$
+MPY"-="8`,\"+5"0$9HL"/5*4``!U&&:+0@)F/2``=@Y2_Y*L"P``@\0$PX/'
+M`#/`PY"-="8`5S/_5HMT)`PSP&:+!CU2E```=21FBT8"9CT@`'8:5O^6L`L`
+M`(/$!(OX@_\!?@E6Z`MU__^#Q`2+QUY?PX/'`#/`BU0D!&:+`CU2E```=2!F
+MBT("9CT@`'864O^2L`L``(/$!(7`N``````/E<##D#/`PY"!_P````"!_P``
+M```SP(M4)`1FBP(]4I0``'439HM"`F8](`!V"5+HH'3__X/$!,.!_P````"!
+M_P````"#[!`SR8M4)!2*@0````!!@_E+B(0*0Q```'+MBH*""P``B(),$```
+MBH*""P``B()U$```BH+<$```B()?$```BH*#"P``B()-$```BH*#"P``B()V
+M$```BH+=$```B()@$```BH*$"P``B().$```BH*$"P``B()W$```BH+>$```
+MB()A$```BH*%"P``B()/$```BH*%"P``B()X$```BH+?$```B()B$```BH*&
+M"P``B()0$```BH*&"P``B()Y$```BH+@$```B()C$```BH*'"P``B()1$```
+MBH*'"P``B()Z$```BH+A$```B()D$```BH),$```#("(@DP0``!FQP0D`0"+
+M@F0+``!FQT0D#$L`!400``")1"0$C8)$$```B40D"&:+@KP.``!FA<!T$FH!
+M:@"-1"0(4%+HS6[__X/$$(/$$,,[_XUT)@!0,\!7BWPD#%9FBT<"A<`/A)L`
+M``"#^!`/A)H```"#^#`/A)$```"#^%!T"8/X8`^%SP```(J'?0L``*@##X2;
+M````5XN';`L``/]0*#/2@\0$B_`E__\``&:+EY`0```KPF:)1"0(9CV@#W97
+MBH=]"P``)/R(AWT+``!H``$``%>+AVP+``#_4!QJ`#/`9HN'D!```('F__\`
+M`%!6:@)J`&H%5^A';/__@\0DZS`[_S/`7E^#Q`3#7KCH`P``7X/$!,.0BT0D
+M"&8]N`MV$&:)MY`0``!7Z-7]__^#Q`2*EX\0``"*PO["J`>(EX\0``!U$FB`
+M````5XN';`L``/]0'(/$"%>+AVP+``#_4!"#Q`1>7X/$!,.0._^!_P````!3
+MBT0D"&:+4`1F_T@$9H72=0JX_____UO#@\<`BU0D"(M$)`R+"KL!`````]F)
+M&HH1B!!;,\##D#O_@?\`````@^P,5HMT)!1FBT8"9CT0`'4*BX9L"P``A<!U
+M&%ZX`@```(/$#,,[_[@!````7H/$#,,[_XM$)!AFBP`E__\``#U2E```=>&+
+M1"08BY9L"P``9HM``F:+$B7__P``@>+__P``.\)UP8M$)!B#P`2)1"0$BT0D
+M&&:+0`1FB40D"(J&>@L``#P$=5^+CF@+``"+EF@+``!FBTD,@>'__P``@<D`
+M@```9@N.<@L``&:)CG(+``"+4B")EJP+``"+EF@+``"+4AB)EK`+``"+EF@+
+M``"+4BB)EJ0+``"+EF@+``"+4C#K48/'`(N.:`L``(N6:`L``&:+20YF"XYR
+M"P``9HF.<@L``(M2)(F6K`L``(N6:`L``(M2'(F6L`L``(N6:`L``(M2+(F6
+MI`L``(N6:`L``(M2-(F6J`L``(U$)`10:`````!6BX9L"P``_U`8@\0,7H/$
+M#,,[_X'_`````%"+1"0(5XH0C7@!A-)U)D>*3_^$R74>1XI7_X32=19'BE?_
+MA-)U#D>*3_^$R74&B@>$P'0',\!?@\0$PU^X`0```(/$!,,[_SO_@?\`````
+M5XM\)`AFBT<"9CU!`'8_BU0D#%)7BX=L"P``_U`(BT0D%(/$"(7`="57Z'%J
+M__^+CV`+``!1BX=<"P``_U`\9L='!```9L='`B(`@\0(7\.+5"0$BT0D"(F"
+MD`L``&:+0@)F/4$`<@]J0%*+@FP+``#_4!R#Q`C#._^!_P````"+5"0$BT0D
+M"(F"E`L``&:+0@)F/4$`=@]J(%*+@FP+``#_4!R#Q`C#._^!_P````!7BWPD
+M"%.*1"00BI]]"P``B(=]"P``9HM'`F8]00!V10^^PS/2BE0D$#/"J0,```!T
+M$F@``0``5XN';`L``/]0'(/$"(I$)!"H`W09]L,#=117BX=L"P``_U`H9HF'
+MD!```(/$!%M?PSO_@?\`````5XM\)`A69HM'`F8]00!V+(M$)!2%P'4DQH=^
+M"P```6B`````5XN';`L``/]0'+@!````@\0(7E_#@\<`5XVWE!```(M$)!2Y
+M%@```(OX,\#SI5]>7\,[_SO_@?\`````BT0D!`^_@+P.``##C70F`(M,)`1F
+MBT$"9CU0`',.N`$```##N`(```##._\/OY&\#@``BT0D"$IFBP`E__\``#O"
+M?>!J`(M4)!!2BT0D$%!1Z-II__\SP(/$$,.-="8`BU0D!+@@````#[^2M`L`
+M`"O"PY"!_P````"!_P````!75HMT)`QFBX:T"P``9CT@`'P17K@"````7\.0
+MN`0```!>7\-FBX9R"P``9JD``701BT0D&(M4)!0#PCT````!=]IFBT8"9CU!
+M`',(7K@!````7\-FBX::"P``9JD"`'0;,\"+3"089HN&F`L``#O(?0I>N`,`
+M``!?PSO_BH:X"P``N1\````BR(M4)!"-#$G!X0.-O`Z\"P``B1>+5"04B5<$
+M9HM4)!AFB5<(BU0D'(E7%&:+1@)F/5``<@Y75HN&;`L``/]0)(/$"&;_AK0+
+M``"*EK@+``#^PC/`B):X"P``7E_#@\<`._^!_P````!J`8M4)`A2BX)L"P``
+M_U`$@\0(PX'_`````('_`````%!64XMT)!"*?"049HM&`F8]$`!T"UNX`0``
+M`%Z#Q`3#9HN&<@L``&:I`"!U3S/`BL>%P'0G@_@$="R#^!!T)X/X9'4*9HM&
+M!F8]$P!T&+@"````6UZ#Q`3#@\<`BH9Y"P``J(!T%C/`9HM&!DB#^!-W"O\D
+MA20'``"#QP!;N`,```!>@\0$PY!J`S/`9HN&<`L``(/``B7__P``4(N&7`L`
+M`/]0!#/`9HN&<`L``(/``R7__P``4(N&7`L``/]0'(A$)!>#Q`RH`70)N!``
+M``#K!SO_N`0````STHK7.\(/A)\!```SP(I$)`N#\`$E_P```%`SP&:+AG`+
+M``"#P`,E__\``%"+AEP+``#_4`2#Q`CI;0$``)!H]P```#/`9HN&<`L``(/`
+M'27__P``4(N&7`L``/]0!#/`9HN&<`L``(/`'R7__P``4(N&7`L``/]0'(/$
+M#(K8]L,!=`>X$````.L%N`0````STHK7.\(/A`\!```SP(K#@_`!)?\```!0
+M,\!FBX9P"P``@\`?)?__``!0BX9<"P``_U`$@\0(Z=\```"#QP`SP&:+AG`+
+M``!`)?__``!0BX9<"P``_U`<@\0$BMCVPPAT";@0````ZP<[_[@$````,]**
+MUSO"#X2?````,\"*PX/P""7_````4#/`9HN&<`L``$`E__\``%"+AEP+``#_
+M4`2#Q`CK=#/`9HN&<`L``(/`$"7__P``4(N&7`L``/]0'(/$!(K8]L.`=`>X
+M$````.L%N`0````STHK7.\)T.S/`BL,U@````"7_````4#/`9HN&<`L``(/`
+M$"7__P``4(N&7`L``/]0!(/$".L,B+Z="P``B+Z>"P``@/\0=0]FBY9R"P``
+M9H/*`>L.._]FBY9R"P``9H'B_O]FB99R"P``6S/`7H/$!,.0@?\`````@?\`
+M````BU0D!(I,)`AFBT("9CT0`'0.N`$```##N`(```##._]FBX)R"P``9JD(
+M('42@/D/=^:+@F@+``"+0$2%P'4)N`,```##@\<`,\"*P5!2BX)H"P``_U!$
+M,\"#Q`C#@\<`5HMT)`A3BEPD$&:+1@)F/1``=!!;N`$```!>P[@#````6U[#
+M9HN&<@L``&:I`"!UZS/`BL.#^`=^"SW_````#X7K`0``,\!FBT8&2(/X"W?+
+M_R2%=`<``#/`BL.#^`(/A,L!``"#^`0/A+X````]_P````^$MP$``&:+AG(+
+M``!FJ00`=9:+AF0+```]%.__`'>)BI9Y"P``@,H#B)9Y"P``@.+OB)9Y"P``
+MZ3<!```SP(K#@_@$=$,]_P````^$;`$``&:+AG(+``!FJ0P`#X5'____BX9D
+M"P``/13O_P`/AS;___^*EGD+``"`R@.(EGD+``#I[0```#O_BI9Y"P``@.+\
+MB)9Y"P``Z=<````SP(K#@_@$=!,]_P````^$8O___^D'`0``@\<`BI9Y"P``
+M@.+\B)9Y"P``@,H0B)9Y"P``Z9X```"#QP`SP(K#@_@$="<]_P````^%T```
+M`(J6>0L``(#*`HB6>0L``(#B[XB6>0L``.MM._^*EGD+``"`XOV(EGD+``"`
+MRA"(EGD+``#K43O_@/L$=$KIC@```#O_,\"*PX/X!'0K/?\```!U?&:+AG(+
+M``!FJ0`0#X57_O__BI9Y"P``@,H"B)9Y"P``ZQ$[_XJ6>0L``(#B_8B6>0L`
+M`(N&:`L``(M`2(7`=!(SP(K#4%:+AF@+``#_4$B#Q`B+1"04B)YZ"P``BI9Y
+M"P``B!"*AGD+``"H`7069HN6<@L``&:!R@`!ZQ1;N`(```!>PV:+EG(+``!F
+M@>+__F:)EG(+``!;,\!>PU"X_P,``%=64XM<)!2+="089B/&)?__```]0`(`
+M``^$\P```#V``@``#X3H````/<`"```/A-T````]``,```^$T@```#T@`P``
+M#X3'````/4`#```/A+P````]8`,```^$L0```(O&)?__``!0_U,<@\0$)>(`
+M``"#^"(/A94```"+QB7__P``@\`#)?__``!0_U,<@\0$)<````"#^$!U=8O&
+M)?__``"#P`0E__\``%#_4QR#Q`2I(````'58B\8E__\``(/`"27__P``4/]3
+M','@"(OXB\8E__\``(/`""7__P``4/]3'(/$"`O'9H7`="-FJ0$`=1V!YO__
+M``"#Q@R!YO__``!6_U,<@\0$J0@```!T"3/`6UY?@\0$PUM>7[@!````@\0$
+MPXUT)@"#[!!75E-5C40D'XML)"2)1"04:/@,``#_51PS_X/$!(K8C74<:F'_
+M%FCX#```_Q8STH/$"(K3.]!T";\!````ZQ`[_T>#_S)\VXM$)!0S_X@8A?\/
+MA<D```"*1"0?J`$/A;T```"-1"0?B40D%&CZ#```_U4<,_^#Q`2*V(UU'&IA
+M_Q9H^@P``/\6,]*#Q`B*TSO0=`J_`0```.L1@\<`1X/_,GS:BT0D%#/_B!B%
+M_W5Q:/@,``#_51R(1"0C@\0$)?\```"I\````'03@^`.@_@(N``````/E,#K
+M!8/'`#/`A<!U/6H.:/@,``#_501J8?]5'&CX#```_U4<@\00@_@.=1YJ`&CX
+M#```_U4$:F'_51QH^`P``/]5'(/$$(7`=`TSP%U;7E^#Q!##@\<`75M>N`$`
+M``!?@\00PX/'`(/L#%:+="044U;HD08``(/$!(7`=2-6Z*3^__^#Q`2%P'0)
+MN@(```#K&#O_5NCN!@``@\0$A<!T![H!````ZP(STH72=$*#^@%T08/Z`G4N
+M:A!H^`P``/]6!(M4)"R+3"0H4E&+1"0L4%;H(00``&H`B]AH^`P``/]6!(/$
+M((O#6UZ#Q`S#._\SV^ORBU0D)(M,)"!248M$)"105NA_`@``B]B#Q!#KUCO_
+M@?\`````5XM$)`A6BW0D%(L0BWPD$('Z(($``'007K@#````7\.X`0```%Y?
+MPS/`BD8(4#/`9HM&`E`SP&:+!E#HX.K__X/$#(O(A<ETUXI&#H3`==!FBT8$
+M9JD!`'3&9HL6BT0D#&:)5P1FBU8"9HE7!HI6/(A7((M6,(/B_(E7*(I6#(A7
+M+6:+5@1FB5<NBE$(B!=75E#_412#Q`Q>7\.0C70F`(/L#%.+1"04BQ"!^B"!
+M``!T$ENX_____X/$#,,SP%N#Q`S#D(M$)!S!X`R+V"7__P``!8`,```E__\`
+M`%"+1"08_U`D4.@&ZO__B40D#(/$"(7`=,<SP&:+PP6$#```)?__``!0BT0D
+M&/]0'(/$!*D!````=*:+3"08BT0D'%%0BU0D'(M$)`Q2_U!,@\0,6X/$#,.!
+M_P````"!_P````"#[`Q7BWPD%%.+%X'Z(($``'056[C_____7X/$#,,[_S/`
+M6U^#Q`S#BT0D((/`!R7_````4&B6````_U<$:`$!``#_5QS!X`AH``$``(O8
+M_U<<:@`+PXO8:)8```#_5P2!X___``!3Z$3I__^)1"0H@\0<A<!TJ8M,)!R+
+M1"0@45!7BT0D&/]03(/$#%M?@\0,PSO_@?\`````@?\`````5HMT)`Q3BUPD
+M(#/`BD8(4#/`9HM&`E`SP&:+!E#H'NG__X/$#(O(A<ET"HM$)!R+$870=0<S
+MP%M>PSO_9HL6B\%FB5,$9HM6`F:)4P9F#[94)!1FB5,,9@^V5"089HE3#HI6
+M/(A3((M6,(/B_(E3*(I6#(A3+6:+5@1FB5,NBE$(B!-;7L,[_SO_@?\`````
+M@^Q4,\E75E-5BT0D;(E,)&")1"1<BT0D:(E,)%"-6`R->"2+1"1P)<"?``")
+M1"14BVPD4,'E"X'-````@%5H^`P``/\3OL#___^#Q`B-1D`+Q5!H^`P``/\3
+M:/P,``#_%XE$-%R#Q`R#Q@1\X(M4)%R^0````%*+3"1848M$)%B#X!]0BT0D
+M7,'X!27_````4(U$)"!0BT0D?%#HT/[__X/$&(OPA?8/A)L```"+1"049JD!
+M`'4L9H-,)!0!B\6#R`10:/@,``#_$XM$)!PE_P```%"+1"1T:/P,``#_4`2#
+MQ!"+5"1<C40D$%)0BTPD<%'_5A2#Q`R%P'0Q@_@"=4>#S015:/@,``#_$XM$
+M)!PE__\``(/(!"7_````4(M$)'1H_`P``/]0!(/$$/]$)&"+1"1TBU0D8#O0
+M?1^+3"1<@\$TB4PD7(M$)%!`B40D4#T``@``#XS4_O__75M>BT0D5%^#Q%3#
+M._^!_P````"#[%@SR5=64U6+1"1PB4PD8(E$)%B+1"1L@\`$B4PD7(E$)%2+
+M1"1LC7@@BT0D7"7_````4(M$)%AH^@P``/\0QT0D6`````"#Q`B+1"10P>`(
+M#0#```"+Z"7__P``4/\7@\0$/8T0```/A0(!``"+1"1L,_:-6"2+Q8T6)?__
+M```+PB7__P``4/\3B40T%(/$!(/&!(/^0'S>P?X"BU0D6%*!YO\```"+1"1X
+MBTPD<"7`GP``4(M$)%A6)?\```!0C40D(%!1Z#3]__^#Q!B+\(7V#X28````
+MBT0D%&:I`0!U*6:#3"04`8M$)!0E_P```%"+Q27__P``@\@$)?__``!0BT0D
+M7/\0@\0(BT0D6(M4)&Q0C40D%%!2_U84@\0,A<!T,(/X`G5'BT0D%('E__\`
+M`"7__P``@\T$@\@$@>7__P``)?\```!0BT0D6%7_$(/$"(M,)&"+1"1X08E,
+M)&`[R'TQBU0D6(/"-(E4)%B+3"1008E,)%"#^1`/C,C^__^+1"1<0(E$)%P]
+M``$```^,E/[__UU;7HM$)%1?@\18PY"!_P````"!_P````!75E-59HML)!B+
+M="04B\4E__\``%#_5APS_X/&'(K8@\0$:F'_%HO%)?__``!0_Q8STH/$"(K3
+M.]!T#;@!````75M>7\.#QP!'@_\R?-2+1"0<B!A=6UXSP%_#D(UT)@!7BWPD
+M"&CX#```_U<D@\0$J0```']U2&@```"`:/@,``#_5PQJ8?]7'&CX#```_U<D
+M@\00/0```(!U)&BG`P"`:/@,``#_5PQJ8?]7'&CX#```_U<D@\00/:0#`(!T
+M!3/`7\.0:@!H^`P``/]7#(/$"+@!````7\,[_X'_`````%>+?"0(:/@,``#_
+M5R2#Q`2I````?W5(:````(!H^`P``/]7#&IA_U<<:/@,``#_5R2#Q!`]````
+M@'4D:*0#`(!H^`P``/]7#&IA_U<<:/@,``#_5R2#Q!`]I`,`@'0%,\!?PY!J
+M`&CX#```_U<,@\0(N`$```!?PSO_@?\`````BU0D!%+H]O[__X/$!(7`=1>+
+M3"0$4>@%]___@\0$A<!T#K@"````P[@!````PSO_BT0D!%#H1O___X/$!(7`
+M=><SP,.!_P````"!_P````"+3"0$9HM!`F8]$`!T#K@!````P[@#````PSO_
+M9HM!!F8]#0!R[HM4)`@SP(F1$`L``(M4)`R)D10+``"+5"00B9$8"P``PY!5
+MB^Q65XMU"(M]#(M-$/.D7UY=PT`H(RET<FQL9"YC("12979I<VEO;CH@("`Q
+M+C$@("0`3VQI8V]M(%123$Q$(#$N,BXP(`HD"E`*5`HP"D`*8`IP"@D#"@M`
+M`H`"P`(``R`#0`-@`P(`````````````````````````````````````````
+M`````````````````````````````````````/P7``!I&```:1@``&D8``!@
+M&```:1@``$@8``!I&```/!@``&D8``!I&```:1@```@8``#X7@``$&```/AB
+M``"P8P``7E\``!AD``!>7P```P``````````````````````````````````
+M````````````````````````````````````````0/_______P`````$````
+M````````````````````````````````````````````````````````````
+M```````````$$`!D````"0,*"P4&!P0!``````````$````20!``#``,````
+M````````````````````````````````````````````````````````````
+M``````````````````D*"PP/`P4'!08'``$#!`0("``%"`8(!P@``0(#"`@$
+M`P0'!08``0("````1I(```(````20!``#``,````````````````````````
+M``````````````````````````````````````````````````````````0`
+M```VE````P````(`````````````````````````````````````````````
+M````````````````````````````````````````````"````(0*```$````
+M`D``````````````````````````````````````````````````````````
+M```````````````````````````````(````A0H```4````"0```````````
+M````````````````````````````````````````````````````````````
+M``````````````````@```"&"@``!@````)`````````````````````````
+M````````````````````````````````````````````````````````````
+M````$````#V#"0$'````$D`0``P`#```````````````````````````````
+M```````````````````````````````````````````````````0````/8,)
+M`@@````20!``#``,````````````````````````````````````````````
+M`````````````````````````````````````$````"-$`$`"@`!``@,````
+M````````````````````````````````````````````````````````````
+M````````````````````````0````(T0`0`+``(#"`PHA/[__O\`````````
+M````````````````````````````````````````````````````````````
+M``````````"`````C1`!``P``P`(#`@$_O\`````````````````````````
+M```````````````````````````````````````````````````````````!
+M``"-$`0`#0`"````"```````````````````````````````````````````
+M``````````````````````````````````````````````(``(T0!``.``,`
+M```(````````````````````````````````````````````````````````
+M````````````````````````````````!```C1`'``\``0$```@`````````
+M````````````````````````````````````````````````````````````
+M``````````````````"```"-$`4`$@`"````"```````````````````````
+M````````````````````````````````````````````````````````````
+M``````@``(T0"``3``$"```(````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M````````````````````````````````````````````````````````````
+M`````````````````````!!`P````"``@```````PG#T]`,`.(0!``I``P``
+M```````&P`$``0`&P`*````,P`L0`%IX:U$````20`P`,C`R,#(P.398-3<V
+M``!L``$`>``!``@!`0"8`0$`F`$!`)@!`0"8`0$`F`$!`&P``0```@$```(!
+M```"`0!H`@$`:`(!`&@"`0!L``$`;``!`&@"`0!H`@$`:`(!`"P#`0!H`P$`
+MP`,!`"`$`0!<!`$`7`0!`%P$`0!<!`$`+`,!`*@$`0"T!`$`M`0!``0````,
+M`````0```%-#3P`!``$``0````@``0(``````````````````````0``````
+M````````!`#Q_P````````````````,``0`````````````````#``(`````
+M`````````````P`#``````````````````,`!``````````````````#``4`
+M`````````````````P`&``````````````````,`!P`````````````````#
+M``@``````````````````P`)``````````````````,`"@`,````````````
+M```$`/'_%````'`/`0!$`````@`!`",````0#@$`7`````(``0`O````8`H!
+M`(@````"``$`-@```/`*`0!H`0```@`!`$````!@#`$`I`$```(``0!*````
+M\`X!`'@````"``$`60```'`.`0!X`````@`!`&4```"0!@$`0`$```(``0!Q
+M````\/H``#@````"``$`>0```(#X``!,`0```@`!`(8```"@\P``9`````(`
+M`0"0````</,``#`````"``$`F0```##S```\`````@`!`*0```"P[0``6`$`
+M``(``0"U`````.@``#0!```"``$`Q@```.#7``#H`````@`!`-T```#PU@``
+MY`````(``0#S````X,<```@(```"``$`_P````#%``#8`@```@`!``H!``!0
+MQ```K`````(``0`@`0``H,,``*0````"``$`-0$``+"Z```8`````@`!`#\!
+M``!@N@``'`````(``0!)`0``0+H``!P````"``$`4@$``&`%`0`L`0```@`!
+M`&`!``"0_```2`````(``0!G`0```+0``)0````"``$`<P$``%"P``#<````
+M`@`!`'\!```0L```0`````(``0"*`0``T*\``$`````"``$`E@$``)"O``!`
+M`````@`!`*`!```0KP``@`````(``0"M`0``0*T``-0````"``$`N0$``#"K
+M```(`@```@`!`,<!``!@J@``R`````(``0#3`0``@*D``-0````"``$`X`$`
+M`("G``#X`0```@`!`.T!```@K@``\`````(``0#Y`0``\*(``(0$```"``$`
+M!`(``("Z```H`````@`!``P"````H@``\`````(``0`6`@``V`8``$L````!
+M``(`)P(``)0&``!$`````0`"`#,"``"`U@``<`````(``0!(`@``,+$``,@"
+M```"``$`6@(``$0&``!0`````0`"`&8"``#T!0``4`````$``@!R`@``I`4`
+M`%`````!``(`?@(``%0%``!0`````0`"`(H"``"0PP``$`````(``0">`@``
+M$+H``"P````"``$`J0(``)#!``#\`0```@`!`+H"```$!0``4`````$``@#&
+M`@``X/(``$@````"``$`T@(``)#R``!(`````@`!`-X"``"T!```4`````$`
+M`@#H`@``$/(``"@````"``$`\P(``.#Q```D`````@`!`/\"``"`\0``8```
+M``(``0`+`P``9`0``%`````!``(`%0,``$#R``!$`````@`!`"8#````\0``
+M@`````(``0`R`P``%`0``%`````!``(`/`,``,0#``!0`````0`"`$<#```0
+M[P``L`````(``0!4`P``H/```%0````"``$`80,``,#O``#4`````@`!`&H#
+M``!T`P``4`````$``@!U`P``T.H``&0````"``$`A`,``"0#``!0`````0`"
+M`(X#``!PZ@``6`````(``0"=`P``U`(``%`````!``(`IP,``$#I```D`0``
+M`@`!`+8#``!`[0``;`````(``0#"`P``0.L``/P!```"``$`RP,``(0"``!0
+M`````0`"`-4#``!0YP``L`````(``0#@`P```.<``$P````"``$`\0,``%#B
+M``#D`````@`!```$``!0Y@``L`````(``0`1!```X-X``"0````"``$`'P0`
+M`(#>``!@`````@`!`"X$```0WP``.`,```(``0`_!```0.,```P#```"``$`
+M2`0``#0"``!0`````0`"`%($``#0W0``I`````(``0!=!```$-T``,`````"
+M``$`;@0``*#<``!D`````@`!`'T$``!0W```2`````(``0".!```,-H``!0"
+M```"``$`EP0``.0!``!0`````0`"`*$$``#<`0``"`````$``@"M!```S`$`
+M`!`````!``(`N00``,0!```(`````0`"`,$$``"\`0``"`````$``@#.!```
+MT-@``&`!```"``$`UP0``&P!``!0`````0`"`.$$``!H`0``!`````$``@#H
+M!```9`$```0````!``(`]`0``%P!```(`````0`"`/T$``#PSP``+`````(`
+M`0`0!0``@-4``/0````"``$`)P4``"#0``#\`P```@`!`#<%```@U```8`$`
+M``(``0!,!0``)`$``#@````!``(`7@4``!@!```*`````0`"`'$%``#0N@``
+M8`(```(``0"#!0``(,$``'`````"``$`F04``#"]``#D`@```@`!`*@%```@
+MP`````$```(``0"\!0``X````#@````!``(`S04``-"A```H`````@`!`-D%
+M``"`H0``2`````(``0#E!0``T)\``+`!```"``$`]@4``$"=``"0`@```@`!
+M``@&``"@FP``E`$```(``0`>!@``()@``'@#```"``$`-`8``'"7``!0````
+M`@`!`$@&``"0D```H`4```(``0!=!@``T(\``,`````"``$`;P8``+"/```@
+M`````@`!`(4&``!PCP``0`````(``0"9!@``0(\``"@````"``$`K`8``)".
+M```H`````@`!`,4&``!`C```*`````(``0#5!@``$(P``"@````"``$`X@8`
+M`/"$``"(`P```@`!`/0&``"PA```/`````(``0#\!@``((0``(P````"``$`
+M!@<``/"#```H`````@`!`!0'```P@P``N`````(``0`D!P```(,``"@````"
+M``$`+@<``%!^``"P!````@`!`#<'``"`?```R`$```(``0!%!P``\'H``(P!
+M```"``$`50<``'!V``!T!````@`!`%T'``!0=@``&`````(``0!E!P``\'4`
+M`%@````"``$`;0<``*!U``!0`````@`!`','```0=0``D`````(``0![!P``
+M`'0``#@````"``$`AP<``.!S```@`````@`!`)`'``"0<P``1`````(``0"=
+M!P``,',``%P````"``$`J`<``*!P``"8`````@`!`+$'``"0;P``0`````(`
+M`0"W!P``(&\``"P````"``$`P`<```!O```<`````@`!`,P'```0;0``Z`$`
+M``(``0#C!P``4&P``+P````"``$`]`<``)!K``"T`````@`!``0(````:P``
+MC`````(``0`-"```$&H``.0````"``$`&`@`````````!````0`#`"$(``#P
+M:```'`$```(``0`I"```D&@``%@````"``$`-P@``!"-``!T`0```@`!`$8(
+M```P9```3`$```(``0!4"```@(@``"`!```"``$`:@@``#"6```X`0```@`!
+M`'X(``#`EP``5`````(``0"-"```$%X``!0&```"``$`G0@``*!=``!H````
+M`@`!`*H(``"06```!`4```(``0"V"```P%<``-`````"``$`QP@``,".``"`
+M`````@`!`-4(``#`C```3`````(``0#E"```<(P``$P````"``$`^@@``,"*
+M``!(`0```@`!``8)``"@B0``'`$```(``0`2"0``L%0``!`#```"``$`)@D`
+M`)!0```4!````@`!`#8)``!`3P``1`$```(``0!$"0``,$X``!`!```"``$`
+M40D``*!,``"0`0```@`!`%\)````3```E`````(``0!M"0```'```)0````"
+M``$`=0D``"!+``#@`````@`!`'T)``"`2@``E`````(``0"'"0``L$@``-`!
+M```"``$`E`D``&!&``!,`@```@`!`)P)``!010``$`$```(``0"E"0```$4`
+M`$P````"``$`K0D``*!"``!@`@```@`!`+0)``#`/@``V`,```(``0#!"0``
+M@&<``!`!```"``$`SPD``+`T```<`@```@`!`-P)```P,P``@`$```(``0#I
+M"0``8#```$0"```"``$`]@D``(`F``"(!@```@`!``@*``#0%0````,```(`
+M`0`5"@``@&4``#P!```"``$`(@H````5``#$`````@`!`"T*``!0#```K`@`
+M``(``0`W"@``L`H``*`!```"``$`1`H``,!F``"X`````@`!`$\*``#P"0``
+MN`````(``0!@"@``0'(``.@````"``$`<`H``-!O```L`````@`!`'@*``"`
+M!P``<`(```(``0"""@``X`(``)0$```"``$`D0H``%!O```\`````@`!`)8*
+M````````V`(```(``0"?"@``C`````$````!``(`J`H``!`M``!$`P```@`!
+M`+@*``"`(P``^`(```(``0#("@``\!X``)`$```"``$`V0H``+`R``!T````
+M`@`!`.D*``#0&```(`8```(``0#Y"@``0'0``+`````"``$`!`L``-`V``#L
+M!P```@`!``P+```@<@``'`````(``0`6"P``\'0``"`````"``$`(PL``$!Q
+M``#@`````@`!`"P+``!4````.`````$``@!#"P``1@````X````!``(`40L`
+M`$(````$`````0`"`%H+```Z````"`````$``@!F"P``,@````@````!``(`
+M;PL``"`````2`````0`"`'<+````````(`````$``@!["P``\+8``%0"```2
+M``$`A0L``%#X```D````$@`!`)\+``!@_@``#````!(``0"Q"P``P/X``!0`
+M```2``$`P@L``&#W```\````$@`!`,X+``#@_```4````!(``0#9"P```/X`
+M`%@````2``$`[`L``-`'`0"H````$@`!`/D+``!@_0``*````!(``0`3#```
+MH+0``%`"```2``$`'0P``.#^``#H````$@`!`#(,``#0_P``%````!(``0!!
+M#```,/T``"@````2``$`5@P``,`)`0"4````$@`!`&D,``#0^0``&`$``!(`
+M`0!S#```P`\!`$@````2``$`@@P```@0`0``````$``!`(P,```0^```-```
+M`!(``0"E#```\/\``+0"```2``$`LPP``"`)`0"4````$@`!`,<,```@]```
+M\`(``!(``0#8#```@`@!`)P````2``$`YPP``!#T```(````$@`!`/@,```P
+M^P``6`$``!(``0`&#0``D/T``&@````2``$`'@T``'#^``!,````$@`!`#$-
+M``"P`@$`8````!(``0!##0``H/<``"P````2``$`60T``%"Y``"T````$@`!
+M`&X-```0]P``4````!(``0![#0``$`,!`%`"```2``$`APT``-#W``!`````
+M$@`!``!T<FQL9&5L9BYO`'1R;&QD+F,`4$-)0DE/4U!R97-E;G0`4$-)0VAE
+M8VM296<`06-C97!T`%!#23%3=V5E<`!00TDR4W=E97``3VQD4$-),5!R97-E
+M;G0`4$-),5!R97-E;G0`4$-),E!R97-E;G0`1V5T0V]D90!396YD5%101G)A
+M;64`4$-)3&]O:W5P`$QO;VMU<$E$`$QO;VMU<%1Y<&4`0V]N9C,Q,S-3;&]T
+M0F%S90!#;VYF,S$R.5-L;W1"87-E`$)U;&QS97EE5W)I=&524$Q%15!R;VT`
+M0G5L;'-E>65296%D4E!,1450<F]M`$1R86EN4EA&:69O`&1R86EN7W1X<G@`
+M2&%W:V5Y95=R:71E4E!,1450<F]M`$AA=VME>65296%D4E!,1450<F]M`$5%
+M35-$96QA>0!%15!O<G1/=70`1450;W)T26X`3D4R,#`P4')E<V5N=`!Z97)O
+M97,`07-I8T5%4F5A9$(`07-I8T5%5W)I=&4`1457<FET94)I=`!%14-L;V-K
+M1&]W;@!%14-L;V-K57``145#;&]C:U!U;'-E`$5%5W)I=&53=&]P`$5%5W)I
+M=&5286YD;VT`07-I8T5%4F5A9%<`1457<FET95-T87)T`$5%1'5M;7E7<FET
+M90!%15=R:71E0GET90!%15)E861">71E`$5%1&5L87D`145296%D0FET`%12
+M;&QD5%105&5M<&QA=&4`061A<'1E<DQI<W0`0G5L;'-E>65(5T-O;F9I9TEN
+M:70`0G5L;'-E>6500TE#;VYF:6<`3T,S-30P5&%B;&4`3T,S,C4P5&%B;&4`
+M3T,S,30Q5&%B;&4`3T,S,30P5&%B;&4`2&%W:V5Y94A70V]N9FEG26YI=`!%
+M;F%B;&500TDT`$AA=VME>6500TE#;VYF:6<`3T,S,3,Y5&%B;&4`1&ES86)L
+M95!#23,`4')E<V5N=%!#23,`4$-),U1A8FQE`$5N86)L95!#23(`1&ES86)L
+M95!#23(`4')E<V5N=%!#23(`4$-),E1A8FQE`%!#23%(5T-O;F9I9TEN:70`
+M1&ES86)L95!#23$`4$-),51A8FQE`$5)4T$R5&%B;&4`0V]N9C,Q,S-3;&]T
+M`$5)4T%/<&5N26YI=`!#;VYF,S$S,P!%25-!,51A8FQE`$U#03-3;&]T0V]N
+M9FEG`$U#03-486)L90!-0T$R4VQO=$-O;F9I9P!-0T$R5&%B;&4`34-!,5-L
+M;W1#;VYF:6<`34-!3W!E;DEN:70`0V]N9C,Q,CD`34-!,51A8FQE`$E303-3
+M971$34$`25-!,U-E=$EN=&5R<G5P=`!)4T$S2%=/<&5N26YI=`!)4T$S2%=#
+M;VYF:6=);FET`$5N86)L93,Q,3A024\`1&ES86)L93,Q,3A024\`25-!,U!)
+M3TEN=&5R<G5P=`!#;VYF,S$Q.`!)4T$S5&%B;&4`25-!,E-E=$1-00!)4T$R
+M4V5T26YT97)R=7!T`$E303)(5T]P96Y);FET`$E303)(5T-O;F9I9TEN:70`
+M0V]N9C,Q,3<`25-!,E1A8FQE`$E303)$34%":71S`$E303));G1":71S`$E3
+M03)$34$`25-!,DEN=$QE=F5L`$-O;F8S,3$U`$E303%486)L90!)4T%$34$`
+M25-!26YT3&5V96P`145?4U!%140`0G5L;'-E>65"87-I8U)E<V5T`$)U;&QS
+M97EE0V]N;F5C=$]P=&EO;G,`0G5L;'-E>65297-T87)T`$)U;&QS97EE0V]D
+M941O=VYL;V%D`$)U;&QS97EE26YT97)F86-E`%181')A:6Y&<F%M94AE861E
+M<@!(87=K97EE0F%S:6-297-E=`!(87=K97EE0V]N;F5C=$]P=&EO;G,`2&%W
+M:V5Y95)E<W1A<G0`2&%W:V5Y94-O9&5$;W=N;&]A9`!(87=K97EE26YT97)F
+M86-E`$1I<V%B;&500TDT`%!R97-E;G100TDT`$AA=VME>65);G1E<G)U<'0`
+M5')A;G-M:71);G1E<G)U<'0`4W!I;C-296-E:79E26YT97)R=7!T`%-P:6XR
+M4F5C96EV94EN=&5R<G5P=`!(87=K97EE4F5A9$U!0U1I;65R`$AA=VME>653
+M971U<%1R86YS;6ET`%-E;F10;VQL26UM961I871E`$AA=VME>65#;&]S94-O
+M;7!L971E9`!(87=K97EE4V5T=7!#;VUM86YD`$AA=VME>65.;T]P97)A=&EO
+M;@!(87=K97EE4F5A9$5R<F]R0V]U;G1E<G,`2&%W:V5Y94U!0U)E<V5T`$AA
+M=VME>65#;&]S90!(87=K97EE2%=/<&5N26YI=`!'971,;VYG`$%S:6-#:&5C
+M:P!00TE(5T]P96Y);FET`%!#25!)3TEN=&5R<G5P=`!%;F%B;&500TD`1&]0
+M0TE024\`4$-)4$E/4')E<V5N=`!00TE(5T-O;F9I9TEN:70`061P5'EP90!%
+M14=E=$1/`$5%0VQE87(`1453970`0VAE8VM)9`!'971435-3:&]R=`!30T)#
+M;&5A<@!3=&%R=$-O;6UA;F0`5$U30V]M;6%N9`!T;7-?;W5T,@!D;W5T,@!T
+M;7-S:&]R=`!3=&]R95IE<F]E<P!2971U<FY#;VUP;&5T961"=69F97)S`%!R
+M;VUI<V-U;W5S0VAE8VL`5')A8V54;V]L4F5M;W9E`$-20T-H96-K`$-O;7!U
+M=&5#4D,`0U)#5&%B;&4`0U)#26YI=`!3971U<%1R86YS;6ET`%5P9&%T94-O
+M=6YT97)S`$5X96-);G1E<G)U<'0`2&%W:V5Y95)E861087)A;65T97)S`$AA
+M=VME>653971U<%)E8V5I=F4`2&%W:V5Y94U!0TEN:70`4W1A='5S26YT97)R
+M=7!T`$AA=VME>65297-E=`!(87=K97EE4&]L;`!(87=K97EE57-E<D-L;W-E
+M`$AA=VME>65296]P96X`2&%W:V5Y95-E=$=R;W5P`$AA=VME>653971&=6YC
+M=&EO;F%L`$AA=VME>65/<&5N`$EN:71#;VUM86YD`$AA=VME>653=&%R=$-O
+M;6UA;F0`3VQD4$E/26YT97)R=7!T`%!R97-E;G1/;&1024\`16YA8FQE36%S
+M=&5R`$1I<V%B;&5-87-T97(`4')E<V5N=$UA<W1E<@!T;7-?:6XR`%=A:710
+M24\`4F5A9$5%0DE!`%1-4U!#24-O;F9I9P!296%D0DE!`$-H96-K0DE!`$5%
+M4&%U<V4`145296%D`$5%3W5T3F]R;4-M9`!2971U<FY"=69F97)S`%)E;W!E
+M;E!H87-E,@!296]P96Y0:&%S934`4F5O<&5N4&AA<V4V`%1R86YS9F5R26YI
+M=$)L;V-K`%1-4TEN=&5R<G5P=`!297-E=$)U9F9E<G,`4FEN9U-T871U<P!4
+M>%)X4W=E97``061A<'1E<D-H96-K`%-E;F13=&%T=7,`0V]M;6%N9$-O;7!L
+M971E9`!297-P;VYD17)R;W)L;V<`=&US;&]N9P!$;T-O;6UA;F0`4F5A9%!A
+M<F%M971E<G,`9&EN,@!435-#:&5C:P!%141)0V]P>0!435-296%D34%#5&EM
+M97(`5$U34V5T=7!296-E:79E`%1-4U-E='5P5')A;G-M:70`5$U34V5T=7!#
+M;VUM86YD`%1-4T-O9&5$;W=N;&]A9`!435--04-);FET`%1-4U!O;&P`5$U3
+M7T-H96-K`%1-4U5S97)#;&]S90!435-297-E=`!0;W=E<DU!0TA?5$U326YT
+M97)F86-E`$Y%,C`P,%!O<G1486(`26YT3&5V96P`:7AT;W1M<V)A<V4`:7AT
+M;V)A<V4`5%)L;&1)1`!?5E\`5%)L;&1&:6YD`%12;&QD26YT97)R=7!T4&]S
+M=%-E<G9I8V4`5%)L;&14<F%N<VUI=$9R964`5%)L;&1296-E:79E1G)E90!4
+M4FQL9$5N86)L90!44FQL9$-L;W-E`%12;&QD1V5T4W1A=&ES=&EC<P!44FQL
+M9$9I;F100TD`5%)L;&13971&=6YC=&EO;F%L061D<F5S<P!44FQL9$]P96X`
+M5%)L;&1296-E:79E1G)A9VUE;G0`5%)L;&1%;65R9V5N8WD`5%)L;&13971'
+M<F]U<$%D9')E<W,`5%)L;&1-0T%3;&]T0V]N9FEG`%12;&QD4&]L;`!44FQL
+M9$%D9$UE;6]R>0!44FQL9$-O<'D`5%)L;&1);G1E<G)U<'10<F5397)V:6-E
+M`%12;&QD4V5T4W!E960`5%)L;&1%25-!4VQO=$-O;F9I9P!44FQL9$%D87!T
+M97));FET`%12;&QD4$-)0V]N9FEG`%12;&QD061A<'1E<E-I>F4`5%)L;&1$
+M;W=N;&]A9`!44FQL9%-E=%!R;VUI<V-U;W5S36]D90!44FQL9%1R86YS;6ET
+M1G)A;64`5%)L;&13971);G1E<G)U<'0`5%)L;&1);G1E<G)U<'10<F5S96YT
+M`%12;&QD24]!9&1R97-S0V]N9FEG`%12;&QD1&ES86)L90!44FQL9%-E=$1-
+M00!44FQL9$EN=&5R<G5P=%-E<G9I8V4``"YT97AT`"YD871A`"YB<W,`+FYO
+M=&4`+G-Y;71A8@`N<W1R=&%B`"YS:'-T<G1A8@`N<F5L+G1E>'0`+G)E;"YD
+M871A`"YC;VUM96YT`'L(```!T@``.PH```'4``#V%P```0,``#@F```!U```
+M@S````'4``!B,0```=0``&0R```!U```[#(```'4``![-````<D``*`U```!
+MZ```J#4```'H``"Q-0```>@``+LU```!Z```Q34```'H``#/-0```>@``#<V
+M```!R```UCH```''``#C/@```=@```L_```!V```(S\```'8``!+/P```=@`
+M`&,_```!V```BS\```'8``"C/P```=@``,L_```!V```&T````'8``!!0```
+M`=@``)%````!V```MT````'8```U00```=@``%9!```!V```?D$```'8``"6
+M00```=@``+Y!```!V```#D(```'8```T0@```=@``-E"```!V```,D,```'8
+M``!:0P```=@``*I#```!V```T$,```'8``!X1````=@``*!$```!V```N$0`
+M``'8``#F1````=@``/)>```!`P``\F@```&F``!2:0```:8``&!I```!I@``
+M<6D```&F``!^:0```:8``)5I```!I@``G6D```&F``"F:0```:8``*QI```!
+MI@``M6D```&F``##:0```:8``-9I```!I@``Y&D```&F``!):@```:8``'=J
+M```!I@``B6H```&F``";:@```:8``*UJ```!I@``V6H```&F``"@<P```=0`
+M`+EU```!V```Z'4```'8```)=@```=@``$!V```!V```SXL```'H```6F0``
+M`OH``'29```"^@``N)D```+Z``#>F0```OH``)2S```!<```@;<```$W``!'
+MN````><``+JX```!-P``O;D```$W``!GRP```78``&;9```!;P``#MH```%N
+M``!NVP```6L``.+;```!:@``9MT```%K``!^W0```6D``"3>```!:@``,]X`
+M``%H``#.Z````>4``/[I```!YP``(.H```'G``"NZ@```><```[K```!YP``
+M8^P```'G``"/[````><``&7N```!YP``C.X```'E``"C[P```><``%#P```!
+MYP``//,```$W``![\P```3<``+_S```!-P``B_@```$V``!R_````14``&4`
+M`0`!`P``9`,!``$#``!8`````>(``%P````!X0``8`````'@``!D`````=\`
+M`&@````!W@``;`````'=``!P`````=P``'0````!VP``>`````':``!\````
+M`=D``)`````!`@``E`````$"``"8`````0(``)P````!`@``H`````$"``"D
+M`````0(``*@````!`@``K`````$"``"P`````0(``+0````!`@``N`````$"
+M``"\`````0(``,`````!`@``Q`````$"``#(`````0(``,P````!`@``T```
+M``$"``#4`````0(``-@````!`@``W`````$"``#D`````:\``.@````!L0``
+M[`````&-``#P`````;```/0````!K0``^`````%Z``#\`````88````!```!
+M@P``!`$```&L```(`0```8(```P!```!>0``$`$```%X```4`0```7<``"@!
+M```!KP``+`$```&Q```P`0```8T``#0!```!L```.`$```&M```\`0```70`
+M`$`!```!A@``1`$```&#``!(`0```:P``$P!```!@@``4`$```%S``!4`0``
+M`7(``%@!```!<0``@`$```%L``"$`0```;@``(@!```!RP``C`$```&Y``"0
+M`0```;P``)@!```!NP``H`$```&Z``"L`0```>,``/@!```!9@``_`$```&X
+M`````@```<L```0"```!N0``"`(```&\```0`@```;L``!@"```!N@``'`(`
+M``%E```@`@```60``"0"```!XP``*`(```%C```L`@```6(``$@"```!8```
+M3`(```%?``!0`@```<L``%0"```!N0``6`(```&\``!<`@```5X``&`"```!
+MNP``9`(```%=``!H`@```;H``&P"```!7```<`(```%;``!T`@```>,``'@"
+M```!6@``?`(```%9``"8`@```5<``)P"```!N```H`(```'+``"D`@```;D`
+M`*@"```!O```L`(```&[``"X`@```;H``,`"```!5@``Q`(```'C``#0`@``
+M`54``.@"```!5P``[`(```&X``#P`@```<L``/0"```!N0``^`(```&\````
+M`P```;L```@#```!N@``$`,```%6```4`P```>,``"`#```!4P``.`,```%7
+M```\`P```;@``$`#```!RP``1`,```&Y``!(`P```;P``%`#```!NP``6`,`
+M``&Z``!@`P```58``&0#```!XP``<`,```%1``"(`P```4\``(P#```!N```
+MD`,```'+``"4`P```;D``)@#```!O```H`,```&[``"H`P```;H``+`#```!
+M3@``M`,```'C``#``P```4T``-@#```!3P``W`,```&X``#@`P```<L``.0#
+M```!N0``Z`,```&\``#P`P```;L``/@#```!N@````0```%.```$!````>,`
+M`!`$```!30``*`0```'````L!````8\``#0$```!N0``/`0```%*``!$!```
+M`9```$P$```!20``4`0```&.``!4!````>,``'@$```!P```?`0```&/``"`
+M!````8\``(0$```!1P``B`0```%'``",!````48``)`$```!1@``E`0```%%
+M``"8!````44``)P$```!DP``H`0```&.``"D!````>,``,@$```!P```S`0`
+M``&/``#0!````<L``-0$```!0P``V`0```%#``#<!````4(``.`$```!0@``
+MY`0```&0``#H!````9```.P$```!DP``\`0```&.``#T!````>,``!@%```!
+M0```(`4```%^```H!0```7T``#`%```!?```.`4```$_```\!0```3X``$`%
+M```!BP``1`4```%[``!H!0```4```'`%```!?@``>`4```%]``"`!0```7P`
+M`(@%```!/P``C`4```$^``"0!0```8L``)0%```!>P``N`4```%```#`!0``
+M`7X``,@%```!?0``T`4```%\``#8!0```3\``-P%```!/@``X`4```&+``#D
+M!0```7L```@&```!0```$`8```%^```8!@```7T``"`&```!?```*`8```$_
+M```L!@```3X``#`&```!BP``-`8```%[``!8!@```3D``&`&```!?@``:`8`
+M``%]``!P!@```7P``'@&```!/P``?`8```$X``"`!@```8L``(0&```!=0``
+ME`8```%M``"8!@```6<``)P&```!80``H`8```%8``"D!@```50``*@&```!
+M4@``K`8```%0``"P!@```4P``+0&```!2P``N`8```%(``"\!@```40``,`&
+M```!00``Q`8```$]``#(!@```3P``,P&```!.P``T`8```$Z```D!P```0(`
+M`"@'```!`@``+`<```$"```P!P```0(``#0'```!`@``.`<```$"```\!P``
+M`0(``$`'```!`@``1`<```$"``!(!P```0(``$P'```!`@``4`<```$"``!4
+M!P```0(``%@'```!`@``7`<```$"``!@!P```0(``&0'```!`@``:`<```$"
+M``!L!P```0(``'`'```!`@``=`<```$"``!X!P```0(``'P'```!`@``@`<`
+M``$"``"$!P```0(``(@'```!`@``C`<```$"``"0!P```0(``)0'```!`@``
+MF`<```$"``"<!P```0(``*`'```!`@``>'!G-'!L=7,@0"@C*2!S=&1D968N
+M:"`R,"XQ(#DT+S$R+S`T(`!A8V]M<#H@4F5L96%S92`U+C`N,&$@,39-87(Y
+M-0!O<'1I;3H@4F5L96%S92`U+C`N,&$@,39-87(Y-0!I,S@V87,Z(%)E;&5A
+M<V4@-2XP+C!A(#$V36%R.34`0"@C*2!T8V]P>2YS(#$N,"`Y."\P."\Q,0!I
+M,S@V87,Z(%)E;&5A<V4@-2XP+C!A(#$V36%R.34`````````````````````
+M`````````````````````````````````````0````$````&`````````$``
+M```<$`$````````````0``````````<````!`````P````````!<$`$`I`<`
+M````````````!``````````-````"`````,``````````!@!```$````````
+M``````0`````````$@````<````````````````8`0`<```````````````!
+M`````````!@````"```````````````<&`$`H!````8```#J````!````!``
+M```@`````P``````````````O"@!`)T-``````````````$`````````*```
+M``,``````````````%DV`0!/```````````````!`````````#(````)````
+M``````````"H-@$`6`,```4````!````!`````@````\````"0``````````
+M`````#H!`"`(```%`````@````0````(````1@````$``````````````"!"
+6`0"Z```````````````!```````````(
+`
+end
diff --git a/sys/contrib/dev/oltr/if_oltr.c b/sys/contrib/dev/oltr/if_oltr.c
new file mode 100644
index 0000000..1f62d41
--- /dev/null
+++ b/sys/contrib/dev/oltr/if_oltr.c
@@ -0,0 +1,1094 @@
+/*
+ * Copyright (c) 1998, Larry Lile
+ * All rights reserved.
+ *
+ * For latest sources and information on this driver, please
+ * go to http://anarchy.stdio.com.
+ *
+ * Questions, comments or suggestions should be directed to
+ * Larry Lile <lile@stdio.com>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/sockio.h>
+#include <sys/malloc.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+#include <net/if_dl.h>
+#include <net/iso88025.h>
+#include <net/if_media.h>
+#include <net/if_types.h>
+#include <net/bpf.h>
+
+#ifndef BPF_MTAP
+#define BPF_MTAP(_ifp, _m) do { \
+ if ((_ifp)->if_bpf) \
+ bpf_mtap((_ifp), (_m)); \
+} while (0)
+#endif
+
+#include <vm/vm.h> /* for vtophys */
+#include <vm/pmap.h> /* for vtophys */
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include "contrib/dev/oltr/trlld.h"
+#include "contrib/dev/oltr/if_oltrvar.h"
+
+/*
+ * Glue function prototypes for PMW kit IO
+ */
+
+#ifndef TRlldInlineIO
+static void DriverOutByte __P((unsigned short, unsigned char));
+static void DriverOutWord __P((unsigned short, unsigned short));
+static void DriverOutDword __P((unsigned short, unsigned long));
+static void DriverRepOutByte __P((unsigned short, unsigned char *, int));
+static void DriverRepOutWord __P((unsigned short, unsigned short *, int));
+static void DriverRepOutDword __P((unsigned short, unsigned long *, int));
+static unsigned char DriverInByte __P((unsigned short));
+static unsigned short DriverInWord __P((unsigned short));
+static unsigned long DriverInDword __P((unsigned short));
+static void DriverRepInByte __P((unsigned short, unsigned char *, int));
+static void DriverRepInWord __P((unsigned short, unsigned short *, int));
+static void DriverRepInDword __P((unsigned short, unsigned long *, int));
+#endif /*TRlldInlineIO*/
+static void DriverSuspend __P((unsigned short));
+static void DriverStatus __P((void *, TRlldStatus_t *));
+static void DriverCloseCompleted __P((void *));
+static void DriverStatistics __P((void *, TRlldStatistics_t *));
+static void DriverTransmitFrameCompleted __P((void *, void *, int));
+static void DriverReceiveFrameCompleted __P((void *, int, int, void *, int));
+
+TRlldDriver_t LldDriver = {
+ TRLLD_VERSION,
+#ifndef TRlldInlineIO
+ DriverOutByte,
+ DriverOutWord,
+ DriverOutDword,
+ DriverRepOutByte,
+ DriverRepOutWord,
+ DriverRepOutDword,
+ DriverInByte,
+ DriverInWord,
+ DriverInDword,
+ DriverRepInByte,
+ DriverRepInWord,
+ DriverRepInDword,
+#endif /*TRlldInlineIO*/
+ DriverSuspend,
+ DriverStatus,
+ DriverCloseCompleted,
+ DriverStatistics,
+ DriverTransmitFrameCompleted,
+ DriverReceiveFrameCompleted,
+};
+
+
+static void oltr_start __P((struct ifnet *));
+static void oltr_close __P((struct oltr_softc *));
+static void oltr_init __P((void *));
+static int oltr_ioctl __P((struct ifnet *, u_long, caddr_t));
+static void oltr_intr __P((void *));
+static int oltr_ifmedia_upd __P((struct ifnet *));
+static void oltr_ifmedia_sts __P((struct ifnet *, struct ifmediareq *));
+
+
+
+int
+oltr_attach(device_t dev)
+{
+
+ struct oltr_softc *sc = device_get_softc(dev);
+ struct ifnet *ifp;
+ int rc = 0;
+ int media = IFM_TOKEN|IFM_TOK_UTP16;
+
+ ifp = sc->ifp = if_alloc(IFT_ISO88025);
+ if (ifp == NULL) {
+ device_printf(dev, "couldn't if_alloc()");
+ return (-1);
+ }
+
+ /*
+ * Allocate interrupt and DMA channel
+ */
+
+ sc->irq_rid = 0;
+ sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->irq_rid,
+ (sc->config.mode & TRLLD_MODE_SHARE_INTERRUPT) ?
+ RF_ACTIVE | RF_SHAREABLE : RF_ACTIVE);
+ if (sc->irq_res == NULL) {
+ device_printf(dev, "couldn't map interrupt\n");
+ if_free(ifp);
+ return (-1);
+ }
+ if (bus_setup_intr(dev, sc->irq_res, INTR_TYPE_NET, NULL, oltr_intr,
+ sc, &sc-> oltr_intrhand)) {
+ device_printf(dev, "couldn't setup interrupt\n");
+ bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res);
+ if_free(ifp);
+ return (-1);
+ }
+
+ /*
+ * Do the ifnet initialization
+ */
+ ifp->if_softc = sc;
+ if_initname(ifp, device_get_name(dev), device_get_unit(dev));
+ ifp->if_init = oltr_init;
+ ifp->if_start = oltr_start;
+ ifp->if_ioctl = oltr_ioctl;
+ ifp->if_flags = IFF_BROADCAST | IFF_NEEDSGIANT;
+ ifp->if_snd.ifq_maxlen = IFQ_MAXLEN;
+
+ /*
+ * Do ifmedia setup.
+ */
+ ifmedia_init(&sc->ifmedia, 0, oltr_ifmedia_upd, oltr_ifmedia_sts);
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS);
+ switch(sc->config.type) {
+ case TRLLD_ADAPTER_PCI7: /* OC-3540 */
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP100, 0, NULL);
+ /* FALL THROUGH */
+ case TRLLD_ADAPTER_PCI4: /* OC-3139 */
+ case TRLLD_ADAPTER_PCI5: /* OC-3140 */
+ case TRLLD_ADAPTER_PCI6: /* OC-3141 */
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_AUTO, 0, NULL);
+ media = IFM_TOKEN|IFM_AUTO;
+ rc = TRlldSetSpeed(sc->TRlldAdapter, 0);
+ /* FALL THROUGH */
+ default:
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP4, 0, NULL);
+ ifmedia_add(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP16, 0, NULL);
+ break;
+ }
+ sc->ifmedia.ifm_media = media;
+ ifmedia_set(&sc->ifmedia, media);
+
+ /*
+ * Attach the interface
+ */
+
+ iso88025_ifattach(ifp, sc->config.macaddress, ISO88025_BPF_SUPPORTED);
+
+ return(0);
+}
+
+
+static void
+oltr_intr(void *xsc)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)xsc;
+
+ if (DEBUG_MASK & DEBUG_INT)
+ printf("I");
+
+ TRlldInterruptService(sc->TRlldAdapter);
+
+ return;
+}
+
+static void
+oltr_start(struct ifnet *ifp)
+{
+ struct oltr_softc *sc = ifp->if_softc;
+ struct mbuf *m0, *m;
+ int copy_len, buffer, frame, fragment, rc, s;
+
+ /*
+ * Check to see if output is already active
+ */
+ if (ifp->if_drv_flags & IFF_DRV_OACTIVE)
+ return;
+
+outloop:
+
+ /*
+ * Make sure we have buffers to transmit with
+ */
+ if (sc->tx_avail <= 0) {
+ printf("oltr%d: tx queue full\n", sc->unit);
+ ifp->if_drv_flags |= IFF_DRV_OACTIVE;
+ return;
+ }
+
+ if (sc->restart == NULL) {
+ IF_DEQUEUE(&ifp->if_snd, m);
+ if (m == NULL)
+ return;
+ } else {
+ m = sc->restart;
+ sc->restart = NULL;
+ }
+
+ m0 = m;
+ frame = RING_BUFFER(sc->tx_frame);
+ buffer = RING_BUFFER(sc->tx_head);
+ fragment = 0;
+ copy_len = 0;
+ sc->frame_ring[frame].FragmentCount = 0;
+
+ while (copy_len < m0->m_pkthdr.len) {
+ sc->frame_ring[frame].FragmentCount++;
+ if (sc->frame_ring[frame].FragmentCount > sc->tx_avail)
+ goto nobuffers;
+ sc->frame_ring[frame].TransmitFragment[fragment].VirtualAddress = sc->tx_ring[buffer].data;
+ sc->frame_ring[frame].TransmitFragment[fragment].PhysicalAddress = sc->tx_ring[buffer].address;
+ sc->frame_ring[frame].TransmitFragment[fragment].count = MIN(m0->m_pkthdr.len - copy_len, TX_BUFFER_LEN);
+ m_copydata(m0, copy_len, MIN(m0->m_pkthdr.len - copy_len, TX_BUFFER_LEN), sc->tx_ring[buffer].data);
+ copy_len += MIN(m0->m_pkthdr.len - copy_len, TX_BUFFER_LEN);
+ fragment++;
+ buffer = RING_BUFFER((buffer + 1));
+ }
+
+ s = splimp();
+ rc = TRlldTransmitFrame(sc->TRlldAdapter, &sc->frame_ring[frame], (void *)&sc->frame_ring[frame]);
+ (void)splx(s);
+
+ if (rc != TRLLD_TRANSMIT_OK) {
+ printf("oltr%d: TRlldTransmitFrame returned %d\n", sc->unit, rc);
+ ifp->if_oerrors++;
+ goto bad;
+ }
+
+ sc->tx_avail -= sc->frame_ring[frame].FragmentCount;
+ sc->tx_head = RING_BUFFER((sc->tx_head + sc->frame_ring[frame].FragmentCount));
+ sc->tx_frame++;
+
+ BPF_MTAP(ifp, m0);
+ /*ifp->if_opackets++;*/
+
+bad:
+ m_freem(m0);
+
+ goto outloop;
+
+nobuffers:
+
+ printf("oltr%d: queue full\n", sc->unit);
+ ifp->if_drv_flags |= IFF_DRV_OACTIVE;
+ ifp->if_oerrors++;
+ /*m_freem(m0);*/
+ sc->restart = m0;
+
+ return;
+}
+
+static void
+oltr_close(struct oltr_softc *sc)
+{
+ /*printf("oltr%d: oltr_close\n", sc->unit);*/
+
+ oltr_stop(sc);
+
+ tsleep(sc, PWAIT, "oltrclose", 30*hz);
+}
+
+void
+oltr_stop(struct oltr_softc *sc)
+{
+ struct ifnet *ifp = sc->ifp;
+
+ /*printf("oltr%d: oltr_stop\n", sc->unit);*/
+
+ ifp->if_flags &= ~IFF_UP;
+ ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
+ TRlldClose(sc->TRlldAdapter, 0);
+ sc->state = OL_CLOSING;
+}
+
+static void
+oltr_init(void * xsc)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)xsc;
+ struct ifnet *ifp = sc->ifp;
+ struct ifmedia *ifm = &sc->ifmedia;
+ int poll = 0, i, rc = 0, s;
+ int work_size;
+
+ /*
+ * Check adapter state, don't allow multiple inits
+ */
+ if (sc->state > OL_CLOSED) {
+ printf("oltr%d: adapter not ready\n", sc->unit);
+ return;
+ }
+
+ s = splimp();
+
+ /*
+ * Initialize Adapter
+ */
+ if ((rc = TRlldAdapterInit(&LldDriver, sc->TRlldAdapter, sc->TRlldAdapter_phys,
+ (void *)sc, &sc->config)) != TRLLD_INIT_OK) {
+ switch(rc) {
+ case TRLLD_INIT_NOT_FOUND:
+ printf("oltr%d: adapter not found\n", sc->unit);
+ break;
+ case TRLLD_INIT_UNSUPPORTED:
+ printf("oltr%d: adapter not supported by low level driver\n", sc->unit);
+ break;
+ case TRLLD_INIT_PHYS16:
+ printf("oltr%d: adapter memory block above 16M cannot DMA\n", sc->unit);
+ break;
+ case TRLLD_INIT_VERSION:
+ printf("oltr%d: low level driver version mismatch\n", sc->unit);
+ break;
+ default:
+ printf("oltr%d: unknown init error %d\n", sc->unit, rc);
+ break;
+ }
+ goto init_failed;
+ }
+ sc->state = OL_INIT;
+
+ switch(sc->config.type) {
+ case TRLLD_ADAPTER_PCI4: /* OC-3139 */
+ work_size = 32 * 1024;
+ break;
+ case TRLLD_ADAPTER_PCI7: /* OC-3540 */
+ work_size = 256;
+ break;
+ default:
+ work_size = 0;
+ }
+
+ if (work_size) {
+ if ((sc->work_memory = malloc(work_size, M_DEVBUF, M_NOWAIT)) == NULL) {
+ printf("oltr%d: failed to allocate work memory (%d octets).\n", sc->unit, work_size);
+ } else {
+ TRlldAddMemory(sc->TRlldAdapter, sc->work_memory,
+ vtophys(sc->work_memory), work_size);
+ }
+ }
+
+ switch(IFM_SUBTYPE(ifm->ifm_media)) {
+ case IFM_AUTO:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, 0); /* TRLLD_SPEED_AUTO */
+ break;
+ case IFM_TOK_UTP4:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_4MBPS);
+ break;
+ case IFM_TOK_UTP16:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS);
+ break;
+ case IFM_TOK_UTP100:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_100MBPS);
+ break;
+ }
+
+ /*
+ * Download adapter micro-code
+ */
+ if (bootverbose)
+ printf("oltr%d: Downloading adapter microcode: ", sc->unit);
+
+ switch(sc->config.mactype) {
+ case TRLLD_MAC_TMS:
+ rc = TRlldDownload(sc->TRlldAdapter, TRlldMacCode);
+ if (bootverbose)
+ printf("TMS-380");
+ break;
+ case TRLLD_MAC_HAWKEYE:
+ rc = TRlldDownload(sc->TRlldAdapter, TRlldHawkeyeMac);
+ if (bootverbose)
+ printf("Hawkeye");
+ break;
+ case TRLLD_MAC_BULLSEYE:
+ rc = TRlldDownload(sc->TRlldAdapter, TRlldBullseyeMac);
+ if (bootverbose)
+ printf("Bullseye");
+ break;
+ default:
+ if (bootverbose)
+ printf("unknown - failed!\n");
+ goto init_failed;
+ break;
+ }
+
+ /*
+ * Check download status
+ */
+ switch(rc) {
+ case TRLLD_DOWNLOAD_OK:
+ if (bootverbose)
+ printf(" - ok\n");
+ break;
+ case TRLLD_DOWNLOAD_ERROR:
+ if (bootverbose)
+ printf(" - failed\n");
+ else
+ printf("oltr%d: adapter microcode download failed\n", sc->unit);
+ goto init_failed;
+ break;
+ case TRLLD_STATE:
+ if (bootverbose)
+ printf(" - not ready\n");
+ goto init_failed;
+ break;
+ }
+
+ /*
+ * Wait for self-test to complete
+ */
+ i = 0;
+ while ((poll++ < SELF_TEST_POLLS) && (sc->state < OL_READY)) {
+ if (DEBUG_MASK & DEBUG_INIT)
+ printf("p");
+ DELAY(TRlldPoll(sc->TRlldAdapter) * 1000);
+ if (TRlldInterruptService(sc->TRlldAdapter) != 0)
+ if (DEBUG_MASK & DEBUG_INIT) printf("i");
+ }
+
+ if (sc->state != OL_CLOSED) {
+ printf("oltr%d: self-test failed\n", sc->unit);
+ goto init_failed;
+ }
+
+ /*
+ * Set up adapter poll
+ */
+ callout_handle_init(&sc->oltr_poll_ch);
+ sc->oltr_poll_ch = timeout(oltr_poll, (void *)sc, 1);
+
+ sc->state = OL_OPENING;
+
+ /*
+ * Open the adapter
+ */
+ rc = TRlldOpen(sc->TRlldAdapter, IF_LLADDR(sc->ifp), sc->GroupAddress,
+ sc->FunctionalAddress, 1552, sc->AdapterMode);
+ switch(rc) {
+ case TRLLD_OPEN_OK:
+ break;
+ case TRLLD_OPEN_STATE:
+ printf("oltr%d: adapter not ready for open\n", sc->unit);
+ (void)splx(s);
+ return;
+ case TRLLD_OPEN_ADDRESS_ERROR:
+ printf("oltr%d: illegal MAC address\n", sc->unit);
+ (void)splx(s);
+ return;
+ case TRLLD_OPEN_MODE_ERROR:
+ printf("oltr%d: illegal open mode\n", sc->unit);
+ (void)splx(s);
+ return;
+ default:
+ printf("oltr%d: unknown open error (%d)\n", sc->unit, rc);
+ (void)splx(s);
+ return;
+ }
+
+ /*
+ * Set promiscious mode for now...
+ */
+ TRlldSetPromiscuousMode(sc->TRlldAdapter, TRLLD_PROM_LLC);
+ ifp->if_flags |= IFF_PROMISC;
+
+ /*
+ * Block on the ring insert and set a timeout
+ */
+ tsleep(sc, PWAIT, "oltropen", 30*hz);
+
+ /*
+ * Set up receive buffer ring
+ */
+ for (i = 0; i < RING_BUFFER_LEN; i++) {
+ rc = TRlldReceiveFragment(sc->TRlldAdapter, (void *)sc->rx_ring[i].data,
+ sc->rx_ring[i].address, RX_BUFFER_LEN, (void *)sc->rx_ring[i].index);
+ if (rc != TRLLD_RECEIVE_OK) {
+ printf("oltr%d: adapter refused receive fragment %d (rc = %d)\n", sc->unit, i, rc);
+ break;
+ }
+ }
+
+ sc->tx_avail = RING_BUFFER_LEN;
+ sc->tx_head = 0;
+ sc->tx_frame = 0;
+
+ sc->restart = NULL;
+
+ ifp->if_drv_flags |= IFF_DRV_RUNNING;
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+
+ /*
+ * Set up adapter statistics poll
+ */
+ /*callout_handle_init(&sc->oltr_stat_ch);*/
+ /*sc->oltr_stat_ch = timeout(oltr_stat, (void *)sc, 1*hz);*/
+
+ (void)splx(s);
+ return;
+
+init_failed:
+ sc->state = OL_DEAD;
+ (void)splx(s);
+ return;
+}
+
+static int
+oltr_ioctl(struct ifnet *ifp, u_long command, caddr_t data)
+{
+ struct oltr_softc *sc = ifp->if_softc;
+ struct ifreq *ifr = (struct ifreq *)data;
+ int error = 0, s;
+
+ s = splimp();
+
+ switch(command) {
+ case SIOCSIFADDR:
+ case SIOCGIFADDR:
+ case SIOCSIFMTU:
+ error = iso88025_ioctl(ifp, command, data);
+ break;
+
+ case SIOCSIFFLAGS:
+ if (ifp->if_flags & IFF_UP) {
+ oltr_init(sc);
+ } else {
+ if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
+ oltr_close(sc);
+ }
+ }
+ break;
+ case SIOCGIFMEDIA:
+ case SIOCSIFMEDIA:
+ error = ifmedia_ioctl(ifp, ifr, &sc->ifmedia, command);
+ break;
+ default:
+ error = EINVAL;
+ break;
+ }
+
+ (void)splx(s);
+
+ return(error);
+}
+
+
+void
+oltr_poll(void *arg)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)arg;
+ int s;
+
+ s = splimp();
+
+ if (DEBUG_MASK & DEBUG_POLL) printf("P");
+
+ /* Set up next adapter poll */
+ sc->oltr_poll_ch = timeout(oltr_poll, (void *)sc, (TRlldPoll(sc->TRlldAdapter) * hz / 1000));
+
+ (void)splx(s);
+}
+
+#ifdef NOTYET
+void
+oltr_stat(void *arg)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)arg;
+ int s;
+
+ s = splimp();
+
+ /* Set up next adapter poll */
+ sc->oltr_stat_ch = timeout(oltr_stat, (void *)sc, 1*hz);
+ if (TRlldGetStatistics(sc->TRlldAdapter, &sc->current, 0) != 0) {
+ /*printf("oltr%d: statistics available immediately...\n", sc->unit);*/
+ DriverStatistics((void *)sc, &sc->current);
+ }
+
+ (void)splx(s);
+}
+#endif
+static int
+oltr_ifmedia_upd(struct ifnet *ifp)
+{
+ struct oltr_softc *sc = ifp->if_softc;
+ struct ifmedia *ifm = &sc->ifmedia;
+ int rc;
+
+ if (IFM_TYPE(ifm->ifm_media) != IFM_TOKEN)
+ return(EINVAL);
+
+ switch(IFM_SUBTYPE(ifm->ifm_media)) {
+ case IFM_AUTO:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, 0); /* TRLLD_SPEED_AUTO */
+ break;
+ case IFM_TOK_UTP4:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_4MBPS);
+ break;
+ case IFM_TOK_UTP16:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS);
+ break;
+ case IFM_TOK_UTP100:
+ rc = TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_100MBPS);
+ break;
+ default:
+ return(EINVAL);
+ break;
+ }
+
+ return(0);
+
+}
+
+static void
+oltr_ifmedia_sts(struct ifnet *ifp, struct ifmediareq *ifmr)
+{
+ struct oltr_softc *sc = ifp->if_softc;
+ struct ifmedia *ifm = &sc->ifmedia;
+
+ /*printf("oltr%d: oltr_ifmedia_sts\n", sc->unit);*/
+
+ ifmr->ifm_active = IFM_TYPE(ifm->ifm_media)|IFM_SUBTYPE(ifm->ifm_media);
+
+}
+
+/*
+ * ---------------------- PMW Callback Functions -----------------------
+ */
+
+void
+DriverStatistics(void *DriverHandle, TRlldStatistics_t *statistics)
+{
+#ifdef NOTYET
+ struct oltr_softc *sc = (struct oltr_softc *)DriverHandle;
+
+ if (sc->statistics.LineErrors != statistics->LineErrors)
+ printf("oltr%d: Line Errors %lu\n", sc->unit,
+ statistics->LineErrors);
+ if (sc->statistics.InternalErrors != statistics->InternalErrors)
+ printf("oltr%d: Internal Errors %lu\n", sc->unit,
+ statistics->InternalErrors);
+ if (sc->statistics.BurstErrors != statistics->BurstErrors)
+ printf("oltr%d: Burst Errors %lu\n", sc->unit,
+ statistics->BurstErrors);
+ if (sc->statistics.AbortDelimiters != statistics->AbortDelimiters)
+ printf("oltr%d: Abort Delimiters %lu\n", sc->unit,
+ statistics->AbortDelimiters);
+ if (sc->statistics.ARIFCIErrors != statistics->ARIFCIErrors)
+ printf("oltr%d: ARIFCI Errors %lu\n", sc->unit,
+ statistics->ARIFCIErrors);
+ if (sc->statistics.LostFrames != statistics->LostFrames)
+ printf("oltr%d: Lost Frames %lu\n", sc->unit,
+ statistics->LostFrames);
+ if (sc->statistics.CongestionErrors != statistics->CongestionErrors)
+ printf("oltr%d: Congestion Errors %lu\n", sc->unit,
+ statistics->CongestionErrors);
+ if (sc->statistics.FrequencyErrors != statistics->FrequencyErrors)
+ printf("oltr%d: Frequency Errors %lu\n", sc->unit,
+ statistics->FrequencyErrors);
+ if (sc->statistics.TokenErrors != statistics->TokenErrors)
+ printf("oltr%d: Token Errors %lu\n", sc->unit,
+ statistics->TokenErrors);
+ if (sc->statistics.DMABusErrors != statistics->DMABusErrors)
+ printf("oltr%d: DMA Bus Errors %lu\n", sc->unit,
+ statistics->DMABusErrors);
+ if (sc->statistics.DMAParityErrors != statistics->DMAParityErrors)
+ printf("oltr%d: DMA Parity Errors %lu\n", sc->unit,
+ statistics->DMAParityErrors);
+ if (sc->statistics.ReceiveLongFrame != statistics->ReceiveLongFrame)
+ printf("oltr%d: Long frames received %lu\n", sc->unit,
+ statistics->ReceiveLongFrame);
+ if (sc->statistics.ReceiveCRCErrors != statistics->ReceiveCRCErrors)
+ printf("oltr%d: Receive CRC Errors %lu\n", sc->unit,
+ statistics->ReceiveCRCErrors);
+ if (sc->statistics.ReceiveOverflow != statistics->ReceiveOverflow)
+ printf("oltr%d: Recieve overflows %lu\n", sc->unit,
+ statistics->ReceiveOverflow);
+ if (sc->statistics.TransmitUnderrun != statistics->TransmitUnderrun)
+ printf("oltr%d: Frequency Errors %lu\n", sc->unit,
+ statistics->TransmitUnderrun);
+ bcopy(statistics, &sc->statistics, sizeof(TRlldStatistics_t));
+#endif
+}
+
+static void
+DriverSuspend(unsigned short MicroSeconds)
+{
+ DELAY(MicroSeconds);
+}
+
+
+static void
+DriverStatus(void *DriverHandle, TRlldStatus_t *Status)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)DriverHandle;
+ struct ifnet *ifp = sc->ifp;
+
+ char *Protocol[] = { /* 0 */ "Unknown",
+ /* 1 */ "TKP",
+ /* 2 */ "TXI" };
+ char *Timeout[] = { /* 0 */ "command",
+ /* 1 */ "transmit",
+ /* 2 */ "interrupt" };
+
+ switch (Status->Type) {
+
+ case TRLLD_STS_ON_WIRE:
+ printf("oltr%d: ring insert (%d Mbps - %s)\n", sc->unit,
+ Status->Specification.OnWireInformation.Speed,
+ Protocol[Status->Specification.OnWireInformation.AccessProtocol]);
+ sc->state = OL_OPEN;
+ wakeup(sc);
+ break;
+ case TRLLD_STS_SELFTEST_STATUS:
+ if (Status->Specification.SelftestStatus == TRLLD_ST_OK) {
+ sc->state = OL_CLOSED;
+ if (bootverbose)
+ printf("oltr%d: self test complete\n", sc->unit);
+ }
+ if (Status->Specification.SelftestStatus & TRLLD_ST_ERROR) {
+ printf("oltr%d: Adapter self test error %d", sc->unit,
+ Status->Specification.SelftestStatus & ~TRLLD_ST_ERROR);
+ sc->state = OL_DEAD;
+ }
+ if (Status->Specification.SelftestStatus & TRLLD_ST_TIMEOUT) {
+ printf("oltr%d: Adapter self test timed out.\n", sc->unit);
+ sc->state = OL_DEAD;
+ }
+ break;
+ case TRLLD_STS_INIT_STATUS:
+ if (Status->Specification.InitStatus == 0x800) {
+ oltr_stop(sc);
+ ifmedia_set(&sc->ifmedia, IFM_TOKEN|IFM_TOK_UTP16);
+ TRlldSetSpeed(sc->TRlldAdapter, TRLLD_SPEED_16MBPS);
+ oltr_init(sc);
+ break;
+ }
+ printf("oltr%d: adapter init failure 0x%03x\n", sc->unit,
+ Status->Specification.InitStatus);
+ oltr_stop(sc);
+ break;
+ case TRLLD_STS_RING_STATUS:
+ if (Status->Specification.RingStatus) {
+ printf("oltr%d: Ring status change: ", sc->unit);
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_SIGNAL_LOSS)
+ printf(" [Signal Loss]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_HARD_ERROR)
+ printf(" [Hard Error]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_SOFT_ERROR)
+ printf(" [Soft Error]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_TRANSMIT_BEACON)
+ printf(" [Beacon]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_LOBE_WIRE_FAULT)
+ printf(" [Wire Fault]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_AUTO_REMOVAL_ERROR)
+ printf(" [Auto Removal]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_REMOVE_RECEIVED)
+ printf(" [Remove Received]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_COUNTER_OVERFLOW)
+ printf(" [Counter Overflow]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_SINGLE_STATION)
+ printf(" [Single Station]");
+ if (Status->Specification.RingStatus &
+ TRLLD_RS_RING_RECOVERY)
+ printf(" [Ring Recovery]");
+ printf("\n");
+ }
+ break;
+ case TRLLD_STS_ADAPTER_CHECK:
+ printf("oltr%d: adapter check (%04x %04x %04x %04x)\n", sc->unit,
+ Status->Specification.AdapterCheck[0],
+ Status->Specification.AdapterCheck[1],
+ Status->Specification.AdapterCheck[2],
+ Status->Specification.AdapterCheck[3]);
+ sc->state = OL_DEAD;
+ oltr_stop(sc);
+ break;
+ case TRLLD_STS_PROMISCUOUS_STOPPED:
+ printf("oltr%d: promiscuous mode ", sc->unit);
+ if (Status->Specification.PromRemovedCause == 1)
+ printf("remove received.");
+ if (Status->Specification.PromRemovedCause == 2)
+ printf("poll failure.");
+ if (Status->Specification.PromRemovedCause == 2)
+ printf("buffer size failure.");
+ printf("\n");
+ ifp->if_flags &= ~IFF_PROMISC;
+ break;
+ case TRLLD_STS_LLD_ERROR:
+ printf("oltr%d: low level driver internal error ", sc->unit);
+ printf("(%04x %04x %04x %04x).\n",
+ Status->Specification.InternalError[0],
+ Status->Specification.InternalError[1],
+ Status->Specification.InternalError[2],
+ Status->Specification.InternalError[3]);
+ sc->state = OL_DEAD;
+ oltr_stop(sc);
+ break;
+ case TRLLD_STS_ADAPTER_TIMEOUT:
+ printf("oltr%d: adapter %s timeout.\n", sc->unit,
+ Timeout[Status->Specification.AdapterTimeout]);
+ break;
+ default:
+ printf("oltr%d: driver status Type = %d\n", sc->unit, Status->Type);
+ break;
+
+ }
+ if (Status->Closed) {
+ sc->state = OL_CLOSING;
+ oltr_stop(sc);
+ }
+
+}
+
+static void
+DriverCloseCompleted(void *DriverHandle)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)DriverHandle;
+
+ printf("oltr%d: adapter closed\n", sc->unit);
+ wakeup(sc);
+ sc->state = OL_CLOSED;
+}
+
+static void
+DriverTransmitFrameCompleted(void *DriverHandle, void *FrameHandle, int TransmitStatus)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)DriverHandle;
+ struct ifnet *ifp = sc->ifp;
+ TRlldTransmit_t *frame = (TRlldTransmit_t *)FrameHandle;
+
+ /*printf("oltr%d: DriverTransmitFrameCompleted\n", sc->unit);*/
+
+ if (TransmitStatus != TRLLD_TRANSMIT_OK) {
+ ifp->if_oerrors++;
+ printf("oltr%d: transmit error %d\n", sc->unit, TransmitStatus);
+ } else {
+ ifp->if_opackets++;
+ }
+
+ sc->tx_avail += frame->FragmentCount;
+
+ if (ifp->if_drv_flags & IFF_DRV_OACTIVE) {
+ printf("oltr%d: queue restart\n", sc->unit);
+ ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
+ oltr_start(ifp);
+ }
+
+
+}
+
+static void
+DriverReceiveFrameCompleted(void *DriverHandle, int ByteCount, int FragmentCount, void *FragmentHandle, int ReceiveStatus)
+{
+ struct oltr_softc *sc = (struct oltr_softc *)DriverHandle;
+ struct ifnet *ifp = sc->ifp;
+ struct mbuf *m0, *m1, *m;
+ int frame_len = ByteCount, i = (int)FragmentHandle, rc, s;
+ int mbuf_offset, mbuf_size, frag_offset, copy_length;
+ char *fragment = sc->rx_ring[RING_BUFFER(i)].data;
+
+ if (sc->state > OL_CLOSED) {
+ if (ReceiveStatus == TRLLD_RCV_OK) {
+ MGETHDR(m0, M_DONTWAIT, MT_DATA);
+ mbuf_size = MHLEN - 2;
+ if (!m0) {
+ ifp->if_ierrors++;
+ goto dropped;
+ }
+ if (ByteCount + 2 > MHLEN) {
+ MCLGET(m0, M_DONTWAIT);
+ mbuf_size = MCLBYTES - 2;
+ if (!(m0->m_flags & M_EXT)) {
+ m_freem(m0);
+ ifp->if_ierrors++;
+ goto dropped;
+ }
+ }
+ m0->m_pkthdr.rcvif = ifp;
+ m0->m_pkthdr.len = ByteCount;
+ m0->m_len = 0;
+ m0->m_data += 2;
+
+ m = m0;
+ mbuf_offset = 0;
+ frag_offset = 0;
+ while (frame_len) {
+ copy_length = MIN3(frame_len,
+ (RX_BUFFER_LEN - frag_offset),
+ (mbuf_size - mbuf_offset));
+ bcopy(fragment + frag_offset, mtod(m, char *) +
+ mbuf_offset, copy_length);
+ m->m_len += copy_length;
+ mbuf_offset += copy_length;
+ frag_offset += copy_length;
+ frame_len -= copy_length;
+
+ if (frag_offset == RX_BUFFER_LEN) {
+ fragment =
+ sc->rx_ring[RING_BUFFER(++i)].data;
+ frag_offset = 0;
+ }
+ if ((mbuf_offset == mbuf_size) && (frame_len > 0)) {
+ MGET(m1, M_DONTWAIT, MT_DATA);
+ mbuf_size = MHLEN;
+ if (!m1) {
+ ifp->if_ierrors++;
+ m_freem(m0);
+ goto dropped;
+ }
+ if (frame_len > MHLEN) {
+ MCLGET(m1, M_DONTWAIT);
+ mbuf_size = MCLBYTES;
+ if (!(m1->m_flags & M_EXT)) {
+ m_freem(m0);
+ m_freem(m1);
+ ifp->if_ierrors++;
+ goto dropped;
+ }
+ }
+ m->m_next = m1;
+ m = m1;
+ mbuf_offset = 0;
+ m->m_len = 0;
+ }
+ }
+ iso88025_input(ifp, m0);
+ } else { /* Receiver error */
+ if (ReceiveStatus != TRLLD_RCV_NO_DATA) {
+ printf("oltr%d: receive error %d\n", sc->unit,
+ ReceiveStatus);
+ ifp->if_ierrors++;
+ }
+ }
+
+dropped:
+ s = splimp();
+ i = (int)FragmentHandle;
+ while (FragmentCount--) {
+ rc = TRlldReceiveFragment(sc->TRlldAdapter,
+ (void *)sc->rx_ring[RING_BUFFER(i)].data,
+ sc->rx_ring[RING_BUFFER(i)].address,
+ RX_BUFFER_LEN, (void *)sc->rx_ring[RING_BUFFER(i)].index);
+ if (rc != TRLLD_RECEIVE_OK) {
+ printf("oltr%d: adapter refused receive fragment %d (rc = %d)\n", sc->unit, i, rc);
+ break;
+ }
+ i++;
+ }
+ (void)splx(s);
+ }
+}
+
+
+/*
+ * ---------------------------- PMW Glue -------------------------------
+ */
+
+#ifndef TRlldInlineIO
+
+static void
+DriverOutByte(unsigned short IOAddress, unsigned char value)
+{
+ outbv(IOAddress, value);
+}
+
+static void
+DriverOutWord(unsigned short IOAddress, unsigned short value)
+{
+ outw(IOAddress, value);
+}
+
+static void
+DriverOutDword(unsigned short IOAddress, unsigned long value)
+{
+ outl(IOAddress, value);
+}
+
+static void
+DriverRepOutByte(unsigned short IOAddress, unsigned char *DataPointer, int ByteCount)
+{
+ outsb(IOAddress, (void *)DataPointer, ByteCount);
+}
+
+static void
+DriverRepOutWord(unsigned short IOAddress, unsigned short *DataPointer, int WordCount)
+{
+ outsw(IOAddress, (void *)DataPointer, WordCount);
+}
+
+static void
+DriverRepOutDword(unsigned short IOAddress, unsigned long *DataPointer, int DWordCount)
+{
+ outsl(IOAddress, (void *)DataPointer, DWordCount);
+}
+
+static unsigned char
+DriverInByte(unsigned short IOAddress)
+{
+ return(inbv(IOAddress));
+}
+
+static unsigned short
+DriverInWord(unsigned short IOAddress)
+{
+ return(inw(IOAddress));
+}
+
+static unsigned long
+DriverInDword(unsigned short IOAddress)
+{
+ return(inl(IOAddress));
+}
+
+static void
+DriverRepInByte(unsigned short IOAddress, unsigned char *DataPointer, int ByteCount)
+{
+ insb(IOAddress, (void *)DataPointer, ByteCount);
+}
+
+static void
+DriverRepInWord(unsigned short IOAddress, unsigned short *DataPointer, int WordCount)
+{
+ insw(IOAddress, (void *)DataPointer, WordCount);
+}
+static void
+DriverRepInDword( unsigned short IOAddress, unsigned long *DataPointer, int DWordCount)
+{
+ insl(IOAddress, (void *)DataPointer, DWordCount);
+}
+#endif /* TRlldInlineIO */
diff --git a/sys/contrib/dev/oltr/if_oltr_isa.c b/sys/contrib/dev/oltr/if_oltr_isa.c
new file mode 100644
index 0000000..e16d6c7
--- /dev/null
+++ b/sys/contrib/dev/oltr/if_oltr_isa.c
@@ -0,0 +1,321 @@
+/*
+ * Copyright (c) 1998, Larry Lile
+ * All rights reserved.
+ *
+ * For latest sources and information on this driver, please
+ * go to http://anarchy.stdio.com.
+ *
+ * Questions, comments or suggestions should be directed to
+ * Larry Lile <lile@stdio.com>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <net/iso88025.h>
+#include <net/if_media.h>
+#include <net/bpf.h>
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#include <isa/isavar.h>
+#include <isa/pnpvar.h>
+
+#include "contrib/dev/oltr/trlld.h"
+#include "contrib/dev/oltr/if_oltrvar.h"
+
+extern TRlldDriver_t LldDriver;
+
+struct AdapterNameEntry {
+ int type;
+ char *name; } ;
+
+static struct AdapterNameEntry AdapterNameList[] = {
+ { 1, "Olicom OC-3115" },
+ { 2, "Olicom ISA 16/4 Adapter (OC-3117)" },
+ { 3, "Olicom ISA 16/4 Adapter (OC-3118)" },
+ { 0, "Olicom Unsupported Adapter" }
+};
+
+static int oltr_isa_probe __P((device_t));
+static int oltr_isa_attach __P((device_t));
+
+static struct isa_pnp_id oltr_ids[] = {
+ { 0x0100833d, NULL }, /* OLC9430 */
+ { 0, NULL },
+};
+
+
+static int
+oltr_isa_probe(dev)
+ device_t dev;
+{
+ TRlldAdapterConfig_t config;
+ struct resource *port_res;
+ int port_rid;
+ struct AdapterNameEntry *list;
+ int error;
+ int iobase;
+ int success;
+
+ error = ISA_PNP_PROBE(device_get_parent(dev), dev, oltr_ids);
+ if (error != 0 && error != ENOENT)
+ return (error);
+
+ iobase = bus_get_resource_start(dev, SYS_RES_IOPORT, 0);
+ if (iobase == 0)
+ return (ENXIO);
+
+ if (error == ENOENT
+ && bus_set_resource(dev, SYS_RES_IOPORT, 0, iobase,
+ OLTR_PORT_COUNT) < 0)
+ return (ENXIO);
+
+ port_rid = 0;
+ port_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &port_rid,
+ 0, ~0, 0, RF_ACTIVE);
+ if (port_res == NULL)
+ return (ENXIO);
+
+ success = TRlldIOAddressConfig(&LldDriver, &config, iobase);
+
+ bus_release_resource(dev, SYS_RES_IOPORT, port_rid, port_res);
+
+ if (!success)
+ return (ENXIO);
+
+ for (list = AdapterNameList;
+ list->type != 0 && list->type != config.type;
+ list++) ;
+ device_set_desc(dev, list->name);
+
+ return (0);
+}
+
+
+static void
+oltr_dmamap_callback(void *arg, bus_dma_segment_t *segs, int nseg, int error)
+{
+ *(unsigned long *)arg = segs->ds_addr;
+}
+
+
+static int
+oltr_isa_attach(dev)
+ device_t dev;
+{
+ struct oltr_softc *sc = device_get_softc(dev);
+ bus_dma_filter_t *filter;
+ void *filter_arg;
+ int scratch_size;
+ int buffer_size;
+ int iobase;
+ int success;
+ int s, i;
+
+ s = splimp();
+
+ bzero(sc, sizeof(struct oltr_softc));
+ sc->unit = device_get_unit(dev);
+ sc->state = OL_UNKNOWN;
+
+ iobase = bus_get_resource_start(dev, SYS_RES_IOPORT, 0);
+ if (iobase == 0) {
+ device_printf(dev, "couldn't get base address\n");
+ goto config_failed;
+ }
+
+ sc->port_res = bus_alloc_resource(dev, SYS_RES_IOPORT, &sc->port_rid,
+ 0, ~0, 0, RF_ACTIVE);
+ if (sc->port_res == NULL) {
+ device_printf(dev, "couldn't allocate io port\n");
+ goto config_failed;
+ }
+
+ success = TRlldIOAddressConfig(&LldDriver, &sc->config, iobase);
+ if (success == 0) {
+ device_printf(dev, "adapter configuration failed\n");
+ goto config_failed;
+ }
+
+ device_printf(dev, "MAC address %6D\n", sc->config.macaddress, ":");
+
+ if (sc->config.dmalevel != TRLLD_DMA_PIO) {
+ sc->drq_rid = 0;
+ sc->drq_res = bus_alloc_resource(dev, SYS_RES_DRQ,
+ &sc->drq_rid, 0, ~0, 1, RF_ACTIVE);
+ if (sc->drq_res == NULL) {
+ device_printf(dev, "couldn't setup dma channel\n");
+ goto config_failed;
+ } else
+ isa_dmacascade(sc->config.dmalevel);
+ }
+
+ filter = NULL;
+ filter_arg = NULL;
+
+ if (bus_dma_tag_create(NULL, 1, 0, BUS_SPACE_MAXADDR_24BIT,
+ BUS_SPACE_MAXADDR, filter,
+ filter_arg, BUS_SPACE_MAXSIZE_24BIT, BUS_SPACE_UNRESTRICTED,
+ BUS_SPACE_MAXSIZE_24BIT, 0, NULL, NULL, &sc->bus_tag) != 0) {
+
+ device_printf(dev, "couldn't setup parent dma tag\n");
+ return (ENOMEM);
+ }
+
+ scratch_size = TRlldAdapterSize();
+ buffer_size = RING_BUFFER_LEN * (RX_BUFFER_LEN + TX_BUFFER_LEN);
+
+ if (bus_dma_tag_create(sc->bus_tag, 1, 0, BUS_SPACE_MAXADDR,
+ BUS_SPACE_MAXADDR, NULL, NULL,
+ scratch_size + buffer_size,
+ 1, BUS_SPACE_MAXSIZE_24BIT, 0,
+ NULL, NULL, &sc->mem_tag) != 0) {
+
+ device_printf(dev, "couldn't setup buffer dma tag\n");
+ goto config_failed;
+ }
+
+ if (bus_dmamem_alloc(sc->mem_tag, (void **)&sc->TRlldAdapter,
+ BUS_DMA_NOWAIT, &sc->mem_map) != 0) {
+
+ device_printf(dev, "couldn't alloc buffer memory\n");
+ goto config_failed;
+ }
+
+ bus_dmamap_load(sc->mem_tag, sc->mem_map, sc->TRlldAdapter,
+ scratch_size + buffer_size, oltr_dmamap_callback,
+ (void *)&sc->TRlldAdapter_phys, 0);
+
+ if (sc->TRlldAdapter_phys == 0) {
+ device_printf(dev, "couldn't load buffer memory\n");
+ goto config_failed;
+ }
+
+ /*
+ * Allocate RX/TX Pools
+ */
+
+ for (i = 0; i < RING_BUFFER_LEN; i++) {
+ sc->rx_ring[i].index = i;
+ sc->rx_ring[i].data = (char *)sc->TRlldAdapter + scratch_size +
+ i * (RX_BUFFER_LEN + TX_BUFFER_LEN);
+ sc->rx_ring[i].address = sc->TRlldAdapter_phys + scratch_size +
+ i * (RX_BUFFER_LEN + TX_BUFFER_LEN);
+ sc->tx_ring[i].index = i;
+ sc->tx_ring[i].data = (char *)sc->TRlldAdapter + scratch_size +
+ i * (RX_BUFFER_LEN + TX_BUFFER_LEN) + RX_BUFFER_LEN;
+ sc->tx_ring[i].address = sc->TRlldAdapter_phys + scratch_size +
+ i * (RX_BUFFER_LEN + TX_BUFFER_LEN) + RX_BUFFER_LEN;
+ }
+
+ if (oltr_attach(dev) != 0)
+ goto config_failed;
+
+ splx(s);
+ return (0);
+
+config_failed:
+
+ if (sc->port_res) {
+ bus_release_resource(dev, SYS_RES_IOPORT,
+ sc->port_rid, sc->port_res);
+ sc->port_res = NULL;
+ sc->port_rid = 0;
+ }
+
+ if (sc->oltr_intrhand) {
+ bus_teardown_intr(dev, sc->irq_res, sc->oltr_intrhand);
+ sc->oltr_intrhand = NULL;
+ }
+
+ if (sc->irq_res) {
+ bus_release_resource(dev, SYS_RES_MEMORY,
+ sc->irq_rid, sc->irq_res);
+ sc->irq_res = NULL;
+ sc->irq_rid = 0;
+ }
+
+ if (sc->drq_res) {
+ bus_release_resource(dev, SYS_RES_DRQ,
+ sc->drq_rid, sc->drq_res);
+ sc->drq_res = NULL;
+ sc->drq_rid = 0;
+ }
+
+ if (sc->TRlldAdapter) {
+ bus_dmamem_free(sc->mem_tag, sc->TRlldAdapter, sc->mem_map);
+ sc->TRlldAdapter = NULL;
+ }
+
+ if (sc->mem_map) {
+ bus_dmamap_destroy(sc->mem_tag, sc->mem_map);
+ sc->mem_map = NULL;
+ }
+
+ if (sc->mem_tag) {
+ bus_dma_tag_destroy(sc->mem_tag);
+ sc->mem_tag = NULL;
+ }
+
+ if (sc->bus_tag) {
+ bus_dma_tag_destroy(sc->bus_tag);
+ sc->bus_tag = NULL;
+ }
+
+ splx(s);
+ return (ENXIO);
+}
+
+
+static device_method_t oltr_isa_methods[] = {
+ /* Device interface */
+ DEVMETHOD(device_probe, oltr_isa_probe),
+ DEVMETHOD(device_attach, oltr_isa_attach),
+
+ { 0, 0 }
+};
+
+static driver_t oltr_isa_driver = {
+ "oltr",
+ oltr_isa_methods,
+ sizeof(struct oltr_softc)
+};
+
+static devclass_t oltr_isa_devclass;
+
+DRIVER_MODULE(oltr, isa, oltr_isa_driver, oltr_isa_devclass, 0, 0);
+MODULE_DEPEND(oltr, isa, 1, 1, 1);
+MODULE_DEPEND(oltr, iso88025, 1, 1, 1);
diff --git a/sys/contrib/dev/oltr/if_oltr_pci.c b/sys/contrib/dev/oltr/if_oltr_pci.c
new file mode 100644
index 0000000..773e9b2
--- /dev/null
+++ b/sys/contrib/dev/oltr/if_oltr_pci.c
@@ -0,0 +1,280 @@
+/*
+ * Copyright (c) 1998, Larry Lile
+ * All rights reserved.
+ *
+ * For latest sources and information on this driver, please
+ * go to http://anarchy.stdio.com.
+ *
+ * Questions, comments or suggestions should be directed to
+ * Larry Lile <lile@stdio.com>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <sys/param.h>
+#include <sys/malloc.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/socket.h>
+
+#include <net/if.h>
+#include <net/if_arp.h>
+#include <net/iso88025.h>
+#include <net/if_media.h>
+#include <net/bpf.h>
+
+#include <vm/vm.h> /* for vtophys */
+#include <vm/pmap.h> /* for vtophys */
+
+#include <machine/bus.h>
+#include <machine/resource.h>
+
+#include <sys/bus.h>
+#include <sys/rman.h>
+
+#if (__FreeBSD_version < 500000)
+#include <pci/pcireg.h>
+#include <pci/pcivar.h>
+#else
+#include <dev/pci/pcireg.h>
+#include <dev/pci/pcivar.h>
+#endif
+
+#include "contrib/dev/oltr/trlld.h"
+#include "contrib/dev/oltr/if_oltrvar.h"
+
+static int oltr_pci_probe __P((device_t));
+static int oltr_pci_attach __P((device_t));
+static int oltr_pci_detach __P((device_t));
+static void oltr_pci_shutdown __P((device_t));
+
+extern TRlldDriver_t LldDriver;
+
+struct AdapterNameEntry {
+ int type;
+ char *name; } ;
+
+static struct AdapterNameEntry AdapterNameList[] = {
+ { 10, "Olicom PCI 16/4 Adapter (OC-3136)" },
+ { 11, "Olicom PCI 16/4 Adapter (OC-3136)" },
+ { 12, "Olicom PCI/II 16/4 Adapter (OC-3137)" },
+ { 13, "Olicom PCI 16/4 Adapter (OC-3139)" },
+ { 14, "Olicom RapidFire 3140 16/4 PCI Adapter (OC-3140)" },
+ { 15, "Olicom RapidFire 3141 Fiber Adapter (OC-3141)" },
+ { 19, "Olicom RapidFire 3540 100/16/4 Adapter (OC-3540)" },
+ { 0, "Olicom Unsupported Adapter" }
+};
+
+static device_method_t oltr_methods[] = {
+ DEVMETHOD(device_probe, oltr_pci_probe),
+ DEVMETHOD(device_attach, oltr_pci_attach),
+ DEVMETHOD(device_detach, oltr_pci_detach),
+ DEVMETHOD(device_shutdown, oltr_pci_shutdown),
+ { 0, 0 }
+};
+
+static driver_t oltr_driver = {
+ "oltr",
+ oltr_methods,
+ sizeof(struct oltr_softc)
+};
+
+static devclass_t oltr_devclass;
+
+DRIVER_MODULE(oltr, pci, oltr_driver, oltr_devclass, 0, 0);
+MODULE_DEPEND(oltr, pci, 1, 1, 1);
+MODULE_DEPEND(oltr, iso88025, 1, 1, 1);
+
+static int
+oltr_pci_probe(device_t dev)
+{
+ int i, rc;
+ char PCIConfigHeader[64];
+ TRlldAdapterConfig_t config;
+ struct AdapterNameEntry *list = AdapterNameList;
+
+ if ((pci_get_vendor(dev) == PCI_VENDOR_OLICOM) &&
+ ((pci_get_device(dev) == 0x0001) ||
+ (pci_get_device(dev) == 0x0004) ||
+ (pci_get_device(dev) == 0x0005) ||
+ (pci_get_device(dev) == 0x0007) ||
+ (pci_get_device(dev) == 0x0008))) {
+
+ for (i = 0; i < sizeof(PCIConfigHeader); i++)
+ PCIConfigHeader[i] = pci_read_config(dev, i, 1);
+
+ rc = TRlldPCIConfig(&LldDriver, &config, PCIConfigHeader);
+ if (rc == TRLLD_PCICONFIG_FAIL) {
+ device_printf(dev, "TRlldPciConfig failed!\n");
+ return(ENXIO);
+ }
+ if (rc == TRLLD_PCICONFIG_VERSION) {
+ device_printf(dev, "wrong LLD version\n");
+ return(ENXIO);
+ }
+ while (list->type != 0 && list->type != config.type)
+ list++;
+ device_set_desc(dev, list->name);
+ return(0);
+ }
+ return(ENXIO);
+}
+
+static int
+oltr_pci_attach(device_t dev)
+{
+ int i, s, scratch_size;
+ u_long command;
+ char PCIConfigHeader[64];
+ struct oltr_softc *sc = device_get_softc(dev);
+
+ s = splimp();
+
+ bzero(sc, sizeof(struct oltr_softc));
+ sc->unit = device_get_unit(dev);
+ sc->state = OL_UNKNOWN;
+
+ for (i = 0; i < sizeof(PCIConfigHeader); i++)
+ PCIConfigHeader[i] = pci_read_config(dev, i, 1);
+
+ switch(TRlldPCIConfig(&LldDriver, &sc->config, PCIConfigHeader)) {
+ case TRLLD_PCICONFIG_OK:
+ break;
+ case TRLLD_PCICONFIG_SET_COMMAND:
+ device_printf(dev, "enabling bus master mode\n");
+ command = pci_read_config(dev, PCIR_COMMAND, 4);
+ pci_write_config(dev, PCIR_COMMAND,
+ (command | PCIM_CMD_BUSMASTEREN), 4);
+ command = pci_read_config(dev, PCIR_COMMAND, 4);
+ if (!(command & PCIM_CMD_BUSMASTEREN)) {
+ device_printf(dev, "failed to enable bus master mode\n");
+ goto config_failed;
+ }
+ break;
+ case TRLLD_PCICONFIG_FAIL:
+ device_printf(dev, "TRlldPciConfig failed!\n");
+ goto config_failed;
+ break;
+ case TRLLD_PCICONFIG_VERSION:
+ device_printf(dev, "wrong LLD version\n");
+ goto config_failed;
+ break;
+ }
+ device_printf(dev, "MAC address %6D\n", sc->config.macaddress, ":");
+
+ scratch_size = TRlldAdapterSize();
+ if (bootverbose)
+ device_printf(dev, "adapter memory block size %d bytes\n", scratch_size);
+ sc->TRlldAdapter = (TRlldAdapter_t)malloc(scratch_size, M_DEVBUF, M_NOWAIT);
+ if (sc->TRlldAdapter == NULL) {
+ device_printf(dev, "couldn't allocate scratch buffer (%d bytes)\n", scratch_size);
+ goto config_failed;
+ }
+ sc->TRlldAdapter_phys = vtophys(sc->TRlldAdapter);
+
+ /*
+ * Allocate RX/TX Pools
+ */
+ for (i = 0; i < RING_BUFFER_LEN; i++) {
+ sc->rx_ring[i].index = i;
+ sc->rx_ring[i].data = (char *)malloc(RX_BUFFER_LEN, M_DEVBUF, M_NOWAIT);
+ sc->rx_ring[i].address = vtophys(sc->rx_ring[i].data);
+ sc->tx_ring[i].index = i;
+ sc->tx_ring[i].data = (char *)malloc(TX_BUFFER_LEN, M_DEVBUF, M_NOWAIT);
+ sc->tx_ring[i].address = vtophys(sc->tx_ring[i].data);
+ if ((!sc->rx_ring[i].data) || (!sc->tx_ring[i].data)) {
+ device_printf(dev, "unable to allocate ring buffers\n");
+ while (i > 0) {
+ if (sc->rx_ring[i].data)
+ free(sc->rx_ring[i].data, M_DEVBUF);
+ if (sc->tx_ring[i].data)
+ free(sc->tx_ring[i].data, M_DEVBUF);
+ i--;
+ }
+ goto config_failed;
+ }
+ }
+
+ if (oltr_attach(dev) == -1)
+ goto config_failed;
+
+ splx(s);
+ return(0);
+
+config_failed:
+
+ splx(s);
+ return(ENXIO);
+}
+
+static int
+oltr_pci_detach(device_t dev)
+{
+ struct oltr_softc *sc = device_get_softc(dev);
+ struct ifnet *ifp = sc->ifp;
+ int s, i;
+
+ device_printf(dev, "driver unloading\n");
+
+ s = splimp();
+
+ iso88025_ifdetach(ifp, ISO88025_BPF_SUPPORTED);
+ if (sc->state > OL_CLOSED)
+ oltr_stop(sc);
+
+ untimeout(oltr_poll, (void *)sc, sc->oltr_poll_ch);
+ /*untimeout(oltr_stat, (void *)sc, sc->oltr_stat_ch);*/
+
+ bus_teardown_intr(dev, sc->irq_res, sc->oltr_intrhand);
+ bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq_res);
+
+ if_free(ifp);
+
+ /* Deallocate all dynamic memory regions */
+ for (i = 0; i < RING_BUFFER_LEN; i++) {
+ free(sc->rx_ring[i].data, M_DEVBUF);
+ free(sc->tx_ring[i].data, M_DEVBUF);
+ }
+ if (sc->work_memory)
+ free(sc->work_memory, M_DEVBUF);
+ free(sc->TRlldAdapter, M_DEVBUF);
+
+ (void)splx(s);
+
+ return(0);
+}
+
+static void
+oltr_pci_shutdown(device_t dev)
+{
+ struct oltr_softc *sc = device_get_softc(dev);
+
+ device_printf(dev, "oltr_pci_shutdown called\n");
+
+ if (sc->state > OL_CLOSED)
+ oltr_stop(sc);
+
+ return;
+}
diff --git a/sys/contrib/dev/oltr/if_oltrvar.h b/sys/contrib/dev/oltr/if_oltrvar.h
new file mode 100644
index 0000000..7b9994d
--- /dev/null
+++ b/sys/contrib/dev/oltr/if_oltrvar.h
@@ -0,0 +1,122 @@
+/*
+ * Copyright (c) 1998, Larry Lile
+ * All rights reserved.
+ *
+ * For latest sources and information on this driver, please
+ * go to http://anarchy.stdio.com.
+ *
+ * Questions, comments or suggestions should be directed to
+ * Larry Lile <lile@stdio.com>.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice unmodified, this list of conditions, and the following
+ * disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+/*#define DEBUG_MASK DEBUG_POLL*/
+
+#ifndef DEBUG_MASK
+#define DEBUG_MASK 0x0000
+#endif
+
+#define DEBUG_POLL 0x0001
+#define DEBUG_INT 0x0002
+#define DEBUG_INIT 0x0004
+#define DEBUG_FN_ENT 0x8000
+
+#define PCI_VENDOR_OLICOM 0x108D
+
+#define OLTR_PORT_COUNT 0x20
+
+#define MIN3(A,B,C) (MIN(A, (MIN(B, C))))
+
+struct oltr_rx_buf {
+ int index;
+ char *data;
+ u_long address;
+};
+
+struct oltr_tx_buf {
+ int index;
+ char *data;
+ u_long address;
+};
+
+#define RING_BUFFER_LEN 16
+#define RING_BUFFER(x) ((RING_BUFFER_LEN - 1) & x)
+#define RX_BUFFER_LEN 2048
+#define TX_BUFFER_LEN 2048
+
+struct oltr_softc {
+ struct ifnet *ifp;
+ struct ifmedia ifmedia;
+ bus_space_handle_t oltr_bhandle;
+ bus_space_tag_t oltr_btag;
+ void *oltr_intrhand;
+ int irq_rid;
+ struct resource *irq_res;
+ int port_rid;
+ struct resource *port_res;
+ int drq_rid;
+ struct resource *drq_res;
+ bus_dma_tag_t bus_tag;
+ bus_dma_tag_t mem_tag;
+ bus_dmamap_t mem_map;
+ bus_addr_t queue_phys;
+ char * queue_addr;
+ int unit;
+ int state;
+#define OL_UNKNOWN 0
+#define OL_INIT 1
+#define OL_READY 2
+#define OL_CLOSING 3
+#define OL_CLOSED 4
+#define OL_OPENING 5
+#define OL_OPEN 6
+#define OL_PROMISC 7
+#define OL_DEAD 8
+ struct oltr_rx_buf rx_ring[RING_BUFFER_LEN];
+ int tx_head, tx_avail, tx_frame;
+ struct oltr_tx_buf tx_ring[RING_BUFFER_LEN];
+ TRlldTransmit_t frame_ring[RING_BUFFER_LEN];
+ struct mbuf *restart;
+ TRlldAdapter_t TRlldAdapter;
+ unsigned long TRlldAdapter_phys;
+ TRlldStatistics_t statistics;
+ TRlldStatistics_t current;
+ TRlldAdapterConfig_t config;
+ u_short AdapterMode;
+ u_long GroupAddress;
+ u_long FunctionalAddress;
+ struct callout_handle oltr_poll_ch;
+ /*struct callout_handle oltr_stat_ch;*/
+ void *work_memory;
+};
+
+#define SELF_TEST_POLLS 32
+
+void oltr_poll __P((void *));
+/*void oltr_stat __P((void *));*/
+
+int oltr_attach __P((device_t dev));
+void oltr_stop __P((struct oltr_softc *));
diff --git a/sys/contrib/dev/oltr/trlld.h b/sys/contrib/dev/oltr/trlld.h
new file mode 100644
index 0000000..988cf35
--- /dev/null
+++ b/sys/contrib/dev/oltr/trlld.h
@@ -0,0 +1,902 @@
+/*
+ ****************************** trlld.h ***********************************
+ *
+ * Copyright (c) 1997
+ * OLICOM A/S
+ * Denmark
+ *
+ * All Rights Reserved
+ *
+ * This source file is subject to the terms and conditions of the
+ * OLICOM Software License Agreement which restricts the manner
+ * in which it may be used.
+ *
+ *---------------------------------------------------------------------------
+ *
+ * Description: PowerMACH Works header file
+ * $FreeBSD$
+ *
+ *---------------------------------------------------------------------------
+ * $Log: J:/usr/project/trlld/libsrc/include/trlld.h_v $
+ *
+ * Rev 1.9 25 Jan 1999 09:56:28 EGS
+ * Added 3150
+ *
+ * Rev 1.8 10 Dec 1998 12:24:52 JHM
+ * version 1.2.0,prominfo structure with shorts.
+ *
+ * Rev 1.7 25 Nov 1998 16:18:48 JHM
+ * Bullseye mac, 100MBPS, mactype in config structure,
+ * 3540 adapter, TRlldTransmitFree, TRlldReceiveFree,
+ * TRlldAdapterName
+ *
+ * Rev 1.6 23 Oct 1998 16:00:36 JHM
+ * hawkeye adapter types
+ *
+ * Rev 1.5 11 Aug 1998 12:22:06 JHM
+ * split hawkeye types into PCI4,5,6
+ *
+ * Rev 1.4 10 Jul 1998 14:39:22 JHM
+ * OC_3140,OC_3250
+ *
+ * Rev 1.3 18 Jun 1998 11:32:20 JHM
+ * AddMemory,OC_3250
+ *
+ * Rev 1.2 18 Apr 1998 15:11:20 JHM
+ *
+ * Rev 1.1 09 Dec 1997 18:17:52 JHM
+ * rel111: TRlldDataPtr_t
+ *
+ * Rev 1.0 24 Nov 1997 11:08:58 JHM
+ * Initial revision.
+
+ Rev 1.5 18 Jun 1997 11:31:36 JHM
+ Checks for version
+
+ Rev 1.4 13 Jun 1997 13:47:34 JHM
+
+ Rev 1.3 13 Jun 1997 13:27:56 JHM
+ DTR support, version change
+
+ Rev 1.2 12 Jun 1997 11:43:20 JHM
+ TRLLD_INTERRUPT_TIMEOUT defined
+
+ Rev 1.1 11 Apr 1997 15:24:18 JHM
+ replaced tabs with spaces
+
+ Rev 1.0 11 Apr 1997 14:43:04 JHM
+ Initial revision.
+ *
+ ****************************************************************************
+*/
+
+#ifndef TRLLD_H
+#define TRLLD_H
+
+/* Data buffer pointers are always 32 bits.
+ For 16:16 it is segment:offset while it for 32:32 is a linear address. */
+
+#ifdef TRlldSmall
+#define TRlldDataPtr_t unsigned char far *
+#define TRlldWordDataPtr_t unsigned short far *
+#define TRlldDWordDataPtr_t unsigned long far *
+#else
+#define TRlldDataPtr_t unsigned char *
+#define TRlldWordDataPtr_t unsigned short *
+#define TRlldDWordDataPtr_t unsigned long *
+#endif
+
+#ifdef __WATCOMC__
+#define CDECL _cdecl
+#else
+#define CDECL
+#endif
+
+/*****************************************************************************/
+/* */
+/* Firmware */
+/* */
+/*****************************************************************************/
+
+extern unsigned char TRlldMacCode[]; /* 3115,17,18,29,33,36,37 */
+extern unsigned char TRlldHawkeyeMac[]; /* 3139,3140,3141,3250 */
+extern unsigned char TRlldBullseyeMac[]; /* 3150,3540 */
+
+/*****************************************************************************/
+/* */
+/* Maximal numbers of concurrent receive and transmit slots */
+/* */
+/*****************************************************************************/
+
+#define TRLLD_MAX_RECEIVE 32
+#define TRLLD_MAX_TRANSMIT 32
+
+/*****************************************************************************/
+/* */
+/* Maximal frame sizes */
+/* */
+/*****************************************************************************/
+
+#define TRLLD_MAXFRAME_100MBPS 18000
+#define TRLLD_MAXFRAME_16MBPS 18000
+#define TRLLD_MAXFRAME_4MBPS 4500
+
+/*****************************************************************************/
+/* */
+/* TRlldStatus contains the adapter status used in a DriverStatus call-back. */
+/* */
+/*****************************************************************************/
+
+struct OnWireInformation {
+ unsigned short RingStatus;
+ unsigned short Speed;
+ unsigned short AccessProtocol;
+ unsigned short Reserved;
+};
+
+typedef struct TRlldStatus {
+ unsigned short Type;
+ unsigned char Closed;
+ unsigned char AccessProtocol;
+ unsigned short MaxFrameSize;
+ unsigned short Reserved;
+ union {
+ unsigned short OnWireRingStatus; /* for compability */
+ unsigned short SelftestStatus;
+ unsigned short InitStatus;
+ unsigned short RingStatus;
+ unsigned short AdapterCheck[4];
+ unsigned short InternalError[4];
+ unsigned short PromRemovedCause;
+ unsigned short AdapterTimeout;
+ struct OnWireInformation OnWireInformation;
+ } Specification;
+} TRlldStatus_t;
+
+/* values of TRlldStatus.Type */
+
+#define TRLLD_STS_ON_WIRE 0
+#define TRLLD_STS_SELFTEST_STATUS 1
+#define TRLLD_STS_INIT_STATUS 2
+#define TRLLD_STS_RING_STATUS 3
+#define TRLLD_STS_ADAPTER_CHECK 4
+#define TRLLD_STS_PROMISCUOUS_STOPPED 5
+#define TRLLD_STS_LLD_ERROR 6
+#define TRLLD_STS_ADAPTER_TIMEOUT 7
+
+/* values of TRlldStatus.Closed */
+
+#define TRLLD_STS_STATUS_OK 0
+#define TRLLD_STS_STATUS_CLOSED 1
+
+/* values of TRlldStatus.AccessProtocol */
+
+#define TRLLD_ACCESS_UNKNOWN 0
+#define TRLLD_ACCESS_TKP 1
+#define TRLLD_ACCESS_TXI 2
+
+/* values of TRlldStatus.SelftestStatus */
+
+#define TRLLD_ST_OK 0
+#define TRLLD_ST_ERROR 0x0100 /* actual errors are 010x, where x is */
+ /* 0: Initial Test Error */
+ /* 1: Adapter Software Checksum Error */
+ /* 2: Adapter RAM Error */
+ /* 4: Instruction Test Error */
+ /* 5: Protocol Handler/RI Hw Error */
+ /* 6: System Interface Register Error */
+
+#define TRLLD_ST_TIMEOUT 0x0200 /* The adapter did not complete */
+ /* selftest after download */
+
+/* values of TRlldStatus.Specification.InitStatus */
+
+/* the most likely cause of an init error (whatever the code) is a wrong */
+/* physical or virtual address of the adapter block in TRlldAdapterInit */
+
+#define TRLLD_INIT_ERROR 0x100 /* actual errors are 010x, where x is */
+ /* 1: Invalid init block (LLD error) */
+ /* 2: Invalid options (LLD error) */
+ /* 3: Invalid rcv burst (LLD error) */
+ /* 4: Invalid xmt burst (LLD error) */
+ /* 5: Invalid DMA threshold (LLDerror)*/
+ /* 6: Invalid scb addr */
+ /* 7: Invalid ssb addr */
+ /* 8: DIO parity error (HW error) */
+ /* 9: DMA timeout (May be interrupt
+ failing if PIO mode or PCI2) */
+ /* A: DMA parity error (HW error) */
+ /* B: DMA bus error (HW error) */
+ /* C: DMA data error */
+ /* D: Adapter check */
+
+#define TRLLD_INIT_TIMEOUT 0x200 /* adapter init did not complete */
+#define TRLLD_INIT_DMA_ERROR 0x300 /* adapter cannot access sys memory */
+#define TRLLD_INIT_INTR_ERROR 0x400 /* adapter cannot interrupt */
+#define TRLLD_OPEN_TIMEOUT 0x500 /* adapter open did not complete */
+ /* within 30 seconds */
+
+#define TRLLD_OPEN_ERROR 0x600 /* actual errors are 06xx, where the */
+ /* bits in x mean: */
+ /* 01: Invalid open options (LLDerror)*/
+ /* 04: TxBuffer count error (LLDerror)*/
+ /* 10: Buffer size error (LLD error) */
+ /* 20: List size error (LLD error) */
+ /* 40: Node address error */
+
+#define TRLLD_OPEN_REPEAT 0x700 /* actual errors are 07xy, where */
+ /* x is the open phase: */
+ /* 1: Lobe media test */
+ /* 2: Physical Insertion */
+ /* 3: Address verification */
+ /* 4: Participation in ring poll */
+ /* 5: Request Initialization */
+ /* 9: Request registration (TXI) */
+ /* A: Lobe Media Test (TXI) */
+ /* B: Address verification (TXI) */
+ /* y is the type of error: */
+ /* 1: Function failure (No Cable ?) */
+ /* 2: Signal loss */
+ /* 5: Timeout */
+ /* 6: Ring failure (TKP) */
+ /* 6: Protocol error (TXI) */
+ /* 7: Ring beaconing */
+ /* 8: Duplicate Node Address (TKP) */
+ /* 8: Insert Denied (TXI) */
+ /* 9: Request Initialization (TKP) */
+ /* 9: Heart beat failure (TXI) */
+ /* A: Remove received */
+ /* B: C-port address changed (TXI) */
+ /* C: Wire Fault (TKP) */
+ /* D: Auto Speed, 1. on ring (TKP) */
+ /* E: Speed sense failed */
+
+/* When opening with FORCE_TXI and only classic token ring attachment is */
+/* possible, the error is Request Registration/Timeout or 0x795 */
+
+#define TRLLD_OPEN_1ST_ON_RING 0x800 /* Speed sense is active, but no other*/
+ /* station is present to set the speed*/
+
+
+/* values of TRlldStatus.Specification.RingStatus */
+
+#define TRLLD_RS_SIGNAL_LOSS 0x8000
+#define TRLLD_RS_HARD_ERROR 0x4000
+#define TRLLD_RS_SOFT_ERROR 0x2000
+#define TRLLD_RS_TRANSMIT_BEACON 0x1000
+#define TRLLD_RS_LOBE_WIRE_FAULT 0x0800
+#define TRLLD_RS_AUTO_REMOVAL_ERROR 0x0400
+#define TRLLD_RS_REMOVE_RECEIVED 0x0100
+#define TRLLD_RS_COUNTER_OVERFLOW 0x0080
+#define TRLLD_RS_SINGLE_STATION 0x0040
+#define TRLLD_RS_RING_RECOVERY 0x0020
+
+/* values of TRlldStatus.Specification.AdapterCheck */
+/* MISSING */
+
+/* values of TRlldStatus.Specification.PromRemovedCause */
+
+#define TRLLD_PROM_REMOVE_RECEIVED 1
+#define TRLLD_PROM_POLL_FAILURE 2
+#define TRLLD_PROM_BUFFER_SIZE 3
+
+/* values of TRlldStatus.Specification.InternalError */
+
+#define TRLLD_INTERNAL_PIO 1 /* A PIO transfer to or from adapter */
+ /* did not complete */
+#define TRLLD_INTERNAL_TX 2 /* Trouble with clean up of tx frames */
+#define TRLLD_INTERNAL_RX 3 /* Trouble with clean up of receive */
+ /* fragments */
+#define TRLLD_INTERNAL_CMD 4 /* error response from adapter */
+#define TRLLD_INTERNAL_STATE 5 /* event happened in unexpected state */
+
+/* values of TRlldStatus.Specification.AdapterTimeout */
+
+#define TRLLD_COMMAND_TIMEOUT 1
+#define TRLLD_TRANSMIT_TIMEOUT 2
+#define TRLLD_INTERRUPT_TIMEOUT 3
+
+
+/*****************************************************************************/
+/* */
+/* TRlldStatistics contains the adapter statistics returned to Driver */
+/* in TRlldStatistics calls and DriverStatistics call-backs */
+/* */
+/*****************************************************************************/
+
+typedef struct TRlldStatistics {
+ unsigned long LineErrors;
+ unsigned long InternalErrors; /* Not maintained by TMS based boards */
+ unsigned long BurstErrors;
+ unsigned long ARIFCIErrors;
+ unsigned long AbortDelimiters; /* Not maintained by TMS based boards */
+ unsigned long LostFrames;
+ unsigned long CongestionErrors;
+ unsigned long FrameCopiedErrors;
+ unsigned long FrequencyErrors; /* Not maintained by TMS based boards */
+ unsigned long TokenErrors;
+ unsigned long DMABusErrors; /* Not maintained by 3139 */
+ unsigned long DMAParityErrors; /* Not maintained by 3139 */
+ unsigned long ReceiveLongFrame; /* Not maintained by TMS based boards */
+ unsigned long ReceiveCRCErrors; /* Not maintained by TMS based boards */
+ unsigned long ReceiveOverflow; /* Not maintained by TMS based boards */
+ unsigned long TransmitUnderrun; /* Not maintained by TMS based boards */
+ unsigned long UnderrunLock; /* Not maintained by TMS based boards */
+ unsigned long OverflowReset;
+ unsigned char UpstreamNeighbour[6];
+ unsigned short RingNumber;
+ unsigned char BeaconingUpstreamNeighbour[6];
+ unsigned short padding;
+} TRlldStatistics_t;
+
+
+/*****************************************************************************/
+/* */
+/* TRlldDriver contains the Driver call-backs */
+/* */
+/*****************************************************************************/
+
+typedef struct TRlldDriver {
+ unsigned long TRlldVersion;
+#ifndef TRlldInlineIO
+ void (CDECL * DriverOutByte)(unsigned short IOAddress,
+ unsigned char Value);
+ void (CDECL * DriverOutWord)(unsigned short IOAddress,
+ unsigned short Value);
+ void (CDECL * DriverOutDWord)(unsigned short IOAddress,
+ unsigned long Value);
+ void (CDECL * DriverRepOutByte)(unsigned short IOAddress,
+ TRlldDataPtr_t DataPointer,
+ int ByteCount);
+ void (CDECL * DriverRepOutWord)(unsigned short IOAddress,
+ TRlldWordDataPtr_t DataPointer,
+ int WordCount);
+ void (CDECL * DriverRepOutDWord)(unsigned short IOAddress,
+ TRlldDWordDataPtr_t DataPointer,
+ int DWordCount);
+ unsigned char (CDECL * DriverInByte)(unsigned short IOAddress);
+ unsigned short (CDECL * DriverInWord)(unsigned short IOAddress);
+ unsigned long (CDECL * DriverInDWord)(unsigned short IOAddress);
+ void (CDECL * DriverRepInByte)(unsigned short IOAddress,
+ TRlldDataPtr_t DataPointer,
+ int ByteCount);
+ void (CDECL * DriverRepInWord)(unsigned short IOAddress,
+ TRlldWordDataPtr_t DataPointer,
+ int WordCount);
+ void (CDECL * DriverRepInDWord)(unsigned short IOAddress,
+ TRlldDWordDataPtr_t DataPointer,
+ int DWordCount);
+#endif
+ void (CDECL * DriverSuspend)(unsigned short MicroSeconds);
+ void (CDECL * DriverStatus)(void * DriverHandle,
+ TRlldStatus_t * Status);
+ void (CDECL * DriverCloseCmpltd)(void * DriverHandle);
+ void (CDECL * DriverStatistics)(void * DriverHandle,
+ TRlldStatistics_t * Statistics);
+ void (CDECL * DriverTxFrameCmpltd)(void * DriverHandle,
+ void * FrameHandle,
+ int TxStatus);
+ void (CDECL * DriverRcvFrameCmpltd)(void * DriverHandle,
+ int ByteCount,
+ int FragmentCount,
+ void * FragmentHandle,
+ int RcvStatus);
+} TRlldDriver_t;
+
+/* Version and model control */
+
+#define TRLLD_VERSION_INLINEIO 0x8000
+#define TRLLD_VERSION_SMALL 0x4000
+#ifdef TRlldInlineIO
+#ifdef TRlldSmall
+#define TRLLD_VERSION 0x4120
+#else
+#define TRLLD_VERSION 0x0120
+#endif
+#else
+#ifdef TRlldSmall
+#define TRLLD_VERSION 0xC120
+#else
+#define TRLLD_VERSION 0x8120
+#endif
+#endif
+
+
+/*****************************************************************************/
+/* */
+/* TRlldAdapterConfig contains the properties found for an adapter */
+/* used when finding and defining adapters to use */
+/* */
+/*****************************************************************************/
+
+
+struct pnp_id {
+ unsigned short vendor;
+ unsigned short device;
+};
+
+struct pci_id {
+ unsigned short vendor;
+ unsigned short device;
+ unsigned char revision;
+ unsigned char reserved_byte;
+ unsigned short reserved_word;
+};
+
+struct pcmcia_id {
+ /* unknown as yet */
+ unsigned char x;
+};
+
+struct pci_slot {
+ unsigned short bus_no;
+ unsigned short device_no;
+};
+
+struct pcmcia_socket {
+ /* unknown as yet */
+ unsigned char x;
+};
+
+typedef struct TRlldAdapterConfig {
+ unsigned char type;
+ unsigned char bus;
+ unsigned short magic;
+ union {
+ struct pnp_id pnp;
+ unsigned long eisa;
+ unsigned short mca;
+ struct pci_id pci;
+ struct pcmcia_id pcmcia;
+ } id;
+ union {
+ unsigned short csn;
+ unsigned short eisa;
+ unsigned short mca;
+ struct pci_slot pci;
+ struct pcmcia_socket pcmcia;
+ } slot;
+ unsigned short iobase0;
+ unsigned short iolength0;
+ unsigned short iobase1;
+ unsigned short iolength1;
+ unsigned long memorybase;
+ unsigned short memorylength;
+ unsigned char mode;
+ unsigned char xmode;
+ unsigned char interruptlevel;
+ unsigned char dmalevel;
+ unsigned char macaddress[6];
+ unsigned long prombase;
+ unsigned char speed;
+ unsigned char cachelinesize;
+ unsigned short pcicommand;
+ unsigned char mactype;
+ unsigned char reserved[3];
+} TRlldAdapterConfig_t;
+
+/* values of TRlldAdapterConfig.Type */
+
+#define TRLLD_ADAPTER_XT 0 /* not supported */
+#define TRLLD_ADAPTER_ISA1 1 /* OC-3115 */
+#define TRLLD_ADAPTER_ISA2 2 /* OC-3117 */
+#define TRLLD_ADAPTER_ISA3 3 /* OC-3118 */
+#define TRLLD_ADAPTER_MCA1 4 /* OC-3129 id A84 */
+#define TRLLD_ADAPTER_MCA2 5 /* OC-3129 id A85 */
+#define TRLLD_ADAPTER_MCA3 6 /* OC-3129 id A86 */
+#define TRLLD_ADAPTER_EISA1 7 /* OC-3133 id 0109833D */
+#define TRLLD_ADAPTER_EISA2 8 /* OC-3133 id 0209833D */
+#define TRLLD_ADAPTER_EISA3 9 /* OC-3135 not supported */
+#define TRLLD_ADAPTER_PCI1 10 /* OC-3136 id 108d0001 rev 1 */
+#define TRLLD_ADAPTER_PCI2 11 /* OC-3136 id 108d0001 rev 2 */
+#define TRLLD_ADAPTER_PCI3 12 /* OC-3137 id 108d0001 rev 3 */
+#define TRLLD_ADAPTER_PCI4 13 /* OC-3139 id 108d0004 rev 2 */
+#define TRLLD_ADAPTER_PCI5 14 /* OC-3140 id 108d0004 rev 3 */
+#define TRLLD_ADAPTER_PCI6 15 /* OC-3141 id 108d0007 rev 1 */
+#define TRLLD_ADAPTER_PCI7 19 /* OC-3540 id 108d0008 rev 1 */
+#define TRLLD_ADAPTER_PCI8 20 /* OC-3150 id 108d000a rev 1 */
+#ifdef PCMCIA
+#define TRLLD_ADAPTER_PCCARD1 16 /* OC-3220 */
+#define TRLLD_ADAPTER_PCCARD2 17 /* OC-3221,OC-3230,OC-3232 */
+#endif
+#define TRLLD_ADAPTER_PCCARD3 18 /* OC-3250 id 108d0005 rev 1 */
+
+/* values of TRlldAdapterConfig.Bus */
+
+#define TRLLD_BUS_ISA 1
+#define TRLLD_BUS_EISA 2
+#define TRLLD_BUS_MCA 3
+#define TRLLD_BUS_PCI 4
+#define TRLLD_BUS_PCMCIA 5
+
+/* values of TRlldAdapterConfig.mode */
+
+#define TRLLD_MODE_16M 0x01 /* needs data buffers below 16 M */
+#define TRLLD_MODE_PHYSICAL 0x02 /* needs valid physical addresses */
+#define TRLLD_MODE_FIXED_CFG 0x04 /* cannot be reconfigured */
+#define TRLLD_MODE_SHORT_SLOT 0x08 /* in short ISA slot, cannot use DMA */
+#define TRLLD_MODE_CANNOT_DISABLE 0x10 /* can not disable interrupt */
+#define TRLLD_MODE_SHARE_INTERRUPT 0x20 /* may share interrupt */
+#define TRLLD_MODE_MEMORY 0x40 /* is configured with a memory window*/
+
+/* values of TRlldAdapterConfig.dma */
+
+#define TRLLD_DMA_PIO 4 /* other values signifies the DMA channel */
+#define TRLLD_DMA_MASTER 0xff /* to use */
+
+/* values of TRlldAdapterConfig.mactype */
+
+ /* download with: */
+#define TRLLD_MAC_TMS 1 /* TRlldMACCode */
+#define TRLLD_MAC_HAWKEYE 2 /* TRlldHawkeyeMAC */
+#define TRLLD_MAC_BULLSEYE 3 /* TRlldBullseyeMAC */
+
+
+typedef void * TRlldAdapter_t;
+typedef void * TRlldAdapterType_t;
+
+#ifndef MAX_FRAGMENTS
+#define MAX_FRAGMENTS 32
+#endif
+
+typedef struct TRlldTransmit {
+ unsigned short FragmentCount;
+ unsigned short TRlldTransmitReserved;
+ struct TRlldTransmitFragment {
+ unsigned long PhysicalAddress;
+ TRlldDataPtr_t VirtualAddress;
+ unsigned short count;
+ unsigned short TRlldTransmitFragmentReserved;
+ } TransmitFragment[MAX_FRAGMENTS];
+} TRlldTransmit_t;
+
+int CDECL TRlldAdapterSize(void);
+
+int CDECL TRlldInit(int TypeCount,
+ TRlldAdapterType_t * AdapterTypeTable);
+
+extern TRlldAdapterType_t CDECL TRlld3115; /* ISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3117;
+extern TRlldAdapterType_t CDECL TRlld3118;
+extern TRlldAdapterType_t CDECL TRlld3129; /* MCA adapters */
+extern TRlldAdapterType_t CDECL TRlld3133; /* EISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3136; /* PCI adapters */
+extern TRlldAdapterType_t CDECL TRlld3137;
+extern TRlldAdapterType_t CDECL TRlld3139; /* Hawkeye adapters */
+extern TRlldAdapterType_t CDECL TRlld3540; /* Bullseye adapters */
+
+#define T3115 &TRlld3115
+#define T3117 &TRlld3117
+#define T3118 &TRlld3118
+#define T3129 &TRlld3129
+#define T3133 &TRlld3133
+#define T3136 &TRlld3136
+#define T3137 &TRlld3137
+#define T3139 &TRlld3139
+#define T3540 &TRlld3540
+
+/* Only for Boot Prom Page Zero code */
+
+extern TRlldAdapterType_t CDECL TRlld3115Boot; /* ISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3117Boot;
+extern TRlldAdapterType_t CDECL TRlld3118Boot;
+extern TRlldAdapterType_t CDECL TRlld3129Boot; /* MCA adapters */
+extern TRlldAdapterType_t CDECL TRlld3133Boot; /* EISA adapters */
+extern TRlldAdapterType_t CDECL TRlld3136Boot; /* PCI adapters */
+extern TRlldAdapterType_t CDECL TRlld3137Boot;
+extern TRlldAdapterType_t CDECL TRlld3139Boot; /* Hawkeye adapters */
+extern TRlldAdapterType_t CDECL TRlld3150Boot;
+extern TRlldAdapterType_t CDECL TRlld3250Boot;
+extern TRlldAdapterType_t CDECL TRlld3540Boot; /* Bullseye adapter */
+
+#define B3115 &TRlld3115Boot
+#define B3117 &TRlld3117Boot
+#define B3118 &TRlld3118Boot
+#define B3129 &TRlld3129Boot
+#define B3133 &TRlld3133Boot
+#define B3136 &TRlld3136Boot
+#define B3137 &TRlld3137Boot
+#define B3139 &TRlld3139Boot
+#define B3150 &TRlld3150Boot
+#define B3250 &TRlld3250Boot
+#define B3540 &TRlld3540Boot
+
+#define TRLLD_INIT_OK 0
+#define TRLLD_INIT_UNKNOWN 5
+
+int CDECL TRlldAdapterInit(TRlldDriver_t * DriverDefinition,
+ TRlldAdapter_t * TRlldAdapter,
+ unsigned long TRlldAdapterPhysical,
+ void * DriverHandle,
+ TRlldAdapterConfig_t * config);
+
+#define TRLLD_INIT_OK 0
+#define TRLLD_INIT_NOT_FOUND 1
+#define TRLLD_INIT_UNSUPPORTED 2
+#define TRLLD_INIT_PHYS16 3
+#define TRLLD_INIT_VERSION 4
+
+int CDECL TRlldSetSpeed(TRlldAdapter_t * adapter,
+ unsigned char speed);
+
+#define TRLLD_SPEED_4MBPS 4
+#define TRLLD_SPEED_16MBPS 16
+#define TRLLD_SPEED_100MBPS 100
+
+int CDECL TRlldSetInterrupt(TRlldAdapter_t * adapter,
+ unsigned char interruptlevel);
+
+int CDECL TRlldSetDMA(TRlldAdapter_t * adapter,
+ unsigned char dma, unsigned char * mode);
+
+#define TRLLD_CONFIG_OK 0
+#define TRLLD_CONFIG_STATE 1
+#define TRLLD_CONFIG_ILLEGAL 2
+#define TRLLD_CONFIG_FAILED 3
+
+int CDECL TRlldSetSpecial(TRlldAdapter_t * adapter,
+ unsigned short param1, unsigned short param2,
+ unsigned short param3, unsigned short param4);
+
+int CDECL TRlldAddMemory(TRlldAdapter_t * adapter,
+ TRlldDataPtr_t virtual,
+ unsigned long physical,
+ long size);
+
+int CDECL TRlldDisable(TRlldAdapter_t * adapter);
+
+#define TRLLD_OK 0
+#define TRLLD_NOT_SUPPORTED 1
+
+void CDECL TRlldEnable(TRlldAdapter_t * adapter);
+
+int CDECL TRlldInterruptPresent(TRlldAdapter_t * adapter);
+
+#define TRLLD_NO_INTERRUPT 0
+#define TRLLD_INTERRUPT 1
+
+int CDECL TRlldInterruptService(TRlldAdapter_t * adapter);
+
+int CDECL TRlldInterruptPreService(TRlldAdapter_t * adapter);
+
+void CDECL TRlldInterruptPostService(TRlldAdapter_t * adapter);
+
+
+int CDECL TRlldPoll(TRlldAdapter_t * adapter);
+
+int CDECL TRlldDownload(TRlldAdapter_t * adapter,
+ char * DownLoadCode);
+
+#define TRLLD_DOWNLOAD_OK 0
+#define TRLLD_DOWNLOAD_ERROR 1
+#define TRLLD_STATE 2
+
+typedef int (CDECL * GetCode_t)(void * handle, unsigned char * maccodebyte);
+
+int CDECL TRlldStreamDownload(TRlldAdapter_t * adapter,
+ GetCode_t procedure, void * handle);
+
+int CDECL TRlldOpen(TRlldAdapter_t * adapter,
+ unsigned char * MACAddress,
+ unsigned long GroupAddress,
+ unsigned long FunctionalAddress,
+ unsigned short MaxFrameSize,
+ unsigned short OpenModes);
+
+#define TRLLD_OPEN_OK 0
+#define TRLLD_OPEN_STATE 1
+#define TRLLD_OPEN_ADDRESS_ERROR 2
+#define TRLLD_OPEN_MODE_ERROR 3
+#define TRLLD_OPEN_MEMORY 4
+
+#define TRLLD_MODE_TX_STATUS 0x01
+#define TRLLD_MODE_RX_SINGLE 0x02
+#define TRLLD_MODE_FORCE_TKP 0x04
+#define TRLLD_MODE_FORCE_TXI 0x08
+#define TRLLD_MODE_TX_CRC 0x10
+
+void CDECL TRlldClose(TRlldAdapter_t * adapter, int immediate);
+
+void CDECL TRlldSetGroupAddress(TRlldAdapter_t * adapter,
+ unsigned long GroupAddress);
+
+void CDECL TRlldSetFunctionalAddress(TRlldAdapter_t * adapter,
+ unsigned long FunctionalAddress);
+
+void CDECL TRlldSetPromiscuousMode(TRlldAdapter_t * adapter,
+ unsigned char mode);
+
+/* mode bits */
+
+#define TRLLD_PROM_LLC 1
+#define TRLLD_PROM_MAC 2
+#define TRLLD_PROM_ERRORFRAMES 4
+
+int CDECL TRlldGetStatistics(TRlldAdapter_t * adapter,
+ TRlldStatistics_t * statistics,
+ int immediate);
+
+#define TRLLD_IMMEDIATE_STATISTICS 1
+
+#define TRLLD_STATISTICS_RETRIEVED 0
+#define TRLLD_STATISTICS_PENDING 1
+
+int CDECL TRlldTransmitFrame(TRlldAdapter_t * adapter,
+ TRlldTransmit_t * TransmitFrame,
+ void * FrameHandle);
+
+#define TRLLD_TRANSMIT_OK 0
+#define TRLLD_TRANSMIT_NOT_OPEN 1
+#define TRLLD_TRANSMIT_TOO_MANY 2
+#define TRLLD_TRANSMIT_MAX16 3
+#define TRLLD_TRANSMIT_SIZE 4
+#define TRLLD_TRANSMIT_EMPTY 5
+
+/* completion flags */
+
+#define TRLLD_TX_OK 0
+#define TRLLD_TX_NOT_PROCESSED 1
+#define TRLLD_TX_NOT_RECOGNIZED 2
+#define TRLLD_TX_NOT_COPIED 3
+
+/* number of free transmit fragments */
+
+int CDECL TRlldTransmitFree(TRlldAdapter_t * adapter);
+
+int CDECL TRlldReceiveFragment(TRlldAdapter_t * adapter,
+ TRlldDataPtr_t FragmentStart,
+ unsigned long FragmentPhysical,
+ int count,
+ void * FragmentHandle);
+
+#define TRLLD_RECEIVE_OK 0
+#define TRLLD_RECEIVE_NOT_OPEN 1
+#define TRLLD_RECEIVE_TOO_MANY 2
+#define TRLLD_RECEIVE_SIZE 3
+#define TRLLD_RECEIVE_MAX16 4
+
+/* completion flags */
+
+#define TRLLD_RCV_OK 0
+#define TRLLD_RCV_NO_DATA 1
+#define TRLLD_RCV_ERROR 2 /* Only when TRLLD_PROM_ERRORFRAMES */
+#define TRLLD_RCV_LONG 3
+
+/* number of free receive fragments */
+
+int CDECL TRlldReceiveFree(TRlldAdapter_t * adapter);
+
+int CDECL TRlldFind(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config_table,
+ unsigned long type_mask,
+ int max);
+
+/* type mask bits */
+
+#define OC_3115 0x0001
+#define OC_3117 0x0002
+#define OC_3118 0x0004
+#define OC_3129 0x0008
+#define OC_3133 0x0010
+#define OC_3136 0x0040
+#define OC_3137 0x0080
+#define OC_3139 0x0100
+#define OC_3140 0x0200
+#define OC_3141 0x0400
+#define OC_3540 0x0800
+#define OC_3150 0x1000
+
+#ifdef PCMCIA
+#define OC_3220 0x0800
+#define OC_3221 0x1000
+#define OC_3230 0x2000
+#define OC_3232 0x4000
+#endif
+
+#define OC_3250 0x8000
+
+int CDECL TRlldIOAddressConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ unsigned short address);
+
+
+#define TRLLD_FIND_OK 1
+#define TRLLD_FIND_ERROR 0
+#define TRLLD_FIND_VERSION -1
+
+int CDECL TRlldEISASlotConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ int slot);
+
+int CDECL TRlldMCASlotConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ int slot);
+
+int CDECL TRlldPCIConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ char * PCIConfigurationSpace);
+
+#define TRLLD_PCICONFIG_OK 0
+#define TRLLD_PCICONFIG_FAIL 1
+#define TRLLD_PCICONFIG_SET_COMMAND 2
+#define TRLLD_PCICONFIG_VERSION 3
+
+
+int CDECL TRlldFindPCI(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config_table,
+ unsigned long type_mask,
+ int max);
+
+#ifdef PCMCIA
+typedef void * PCCardHandle_t;
+
+typedef int (CDECL * GetTupleData_t)(PCCardHandle_t handle,
+ unsigned short TupleIdent,
+ char * TupleData,
+ int length);
+
+int CDECL TRlldPCCardConfig(TRlldDriver_t * driver,
+ TRlldAdapterConfig_t * config,
+ unsigned short address,
+ int irq,
+ GetTupleData_t GetTuple,
+ PCCardHandle_t handle);
+
+#define TRLLD_PCCARD_CONFIG_OK 0
+#define TRLLD_PCCARD_CONFIG_FAIL 1
+#endif
+
+/* Boot Prom Support */
+
+typedef struct TRlldPromInfo {
+ unsigned short PromIdent;
+ short PromPages;
+ short PromPageSize;
+} TRlldPromInfo_t;
+
+int CDECL TRlldMapBootProm(TRlldAdapter_t * adapter,
+ TRlldDataPtr_t prompointer);
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_FAILED 3
+
+int CDECL TRlldGetPromInfo(TRlldAdapter_t * adapter, TRlldPromInfo_t * info);
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_NOT_MOUNTED 1
+#define TRLLD_PROM_NOT_MAPPED 2
+
+void CDECL TRlldSetPromPage(TRlldAdapter_t * adapter, int page);
+
+int CDECL TRlldSetMemoryUse(TRlldAdapter_t * adapter, int use);
+
+#define TRLLD_PROM_TO_MEMORY 0
+#define TRLLD_REGISTERS_TO_MEMORY 1
+
+#define TRLLD_MEMORY_USE_OK 0
+#define TRLLD_MEMORY_USE_NO_MEMORY 1
+#define TRLLD_MEMORY_USE_STATE 2
+#define TRLLD_MEMORY_USE_ILLEGAL 3
+
+int CDECL TRlldPromErase(TRlldAdapter_t * adapter,
+ void (CDECL * delay)(int milliseconds));
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_NOT_MOUNTED 1
+#define TRLLD_PROM_NOT_MAPPED 2
+#define TRLLD_PROM_FAILED 3
+
+int CDECL TRlldPromWrite(TRlldAdapter_t * adapter, char * data,
+ int offset, int count);
+
+#define TRLLD_PROM_OK 0
+#define TRLLD_PROM_NOT_MOUNTED 1
+#define TRLLD_PROM_NOT_MAPPED 2
+#define TRLLD_PROM_FAILED 3
+#define TRLLD_PROM_ILLEGAL 4
+
+void CDECL TRlldEmergency(TRlldAdapter_t * adapter);
+
+/* Convert from TRlldAdapterConfig.type to name string */
+char * CDECL TRlldAdapterName(int type);
+#endif
diff --git a/sys/contrib/dev/oltr/trlldbm.c b/sys/contrib/dev/oltr/trlldbm.c
new file mode 100644
index 0000000..944606d
--- /dev/null
+++ b/sys/contrib/dev/oltr/trlldbm.c
@@ -0,0 +1,2690 @@
+/*
+ * $FreeBSD$
+ *
+ * Copyright (c) 1997
+ * OLICOM A/S
+ * Denmark
+ *
+ * All Rights Reserved
+ *
+ * This source file is subject to the terms and conditions of the
+ * OLICOM Software License Agreement which restricts the manner
+ * in which it may be used.
+ *
+ *---------------------------------------------------------------------------
+ *
+ * Description: Olicom adapter micro-code
+ *
+ *---------------------------------------------------------------------------
+ */
+
+unsigned char TRlldBullseyeMac[] __attribute ((aligned(2))) = {
+ 0x52, 0x94, 0x04, 0x00, 0x02, 0x7d, 0x0b, 0xe7, 0x4f, 0x43, 0x53, 0x4d,
+ 0x41, 0x43, 0x2e, 0x42, 0x55, 0x4c, 0x4c, 0x53, 0x45, 0x59, 0x45, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xea, 0x55, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xb8, 0x00, 0x00, 0xbb, 0x00,
+ 0x00, 0xb9, 0x00, 0x00, 0xba, 0x00, 0x00, 0xbe, 0x00, 0x00, 0xbf, 0x00,
+ 0x00, 0xbd, 0x00, 0x00, 0x8c, 0xc8, 0x8e, 0xd8, 0x8e, 0xc0, 0x8e, 0xd0,
+ 0xb8, 0x20, 0x5f, 0x8b, 0xe0, 0x83, 0x3e, 0x4e, 0x00, 0x00, 0x75, 0x1c,
+ 0x2b, 0xdb, 0x8b, 0xf3, 0xad, 0x8b, 0xd8, 0x8b, 0xc8, 0xd1, 0xe9, 0x49,
+ 0x49, 0xad, 0x03, 0xd8, 0xe2, 0xfb, 0x0b, 0xdb, 0x74, 0x06, 0xc7, 0x06,
+ 0xf2, 0x5d, 0x01, 0x00, 0xb8, 0x00, 0x00, 0x8e, 0xd8, 0xc7, 0x06, 0x0c,
+ 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x0e, 0x00, 0xc7, 0x06, 0x04, 0x00, 0x9a,
+ 0x01, 0x8c, 0x0e, 0x06, 0x00, 0xc7, 0x06, 0x14, 0x00, 0x9a, 0x01, 0x8c,
+ 0x0e, 0x14, 0x00, 0xc7, 0x06, 0x08, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x08,
+ 0x00, 0x90, 0x90, 0x90, 0xc7, 0x06, 0x20, 0x00, 0x10, 0x24, 0x8c, 0x0e,
+ 0x22, 0x00, 0x2b, 0xc0, 0xe7, 0x06, 0xc7, 0x06, 0x30, 0x00, 0xee, 0x0d,
+ 0x8c, 0x0e, 0x32, 0x00, 0xc7, 0x06, 0x34, 0x00, 0xe8, 0x0e, 0x8c, 0x0e,
+ 0x36, 0x00, 0xc7, 0x06, 0x38, 0x00, 0x1a, 0x0f, 0x8c, 0x0e, 0x3a, 0x00,
+ 0xc7, 0x06, 0x3c, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x3e, 0x00, 0xc7, 0x06,
+ 0x08, 0x00, 0x9a, 0x01, 0x8c, 0x0e, 0x0a, 0x00, 0xc7, 0x06, 0x14, 0x00,
+ 0x9a, 0x01, 0x8c, 0x0e, 0x16, 0x00, 0xbb, 0x40, 0x60, 0x8e, 0xc3, 0x26,
+ 0x83, 0x0e, 0x32, 0x00, 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b,
+ 0xc0, 0x26, 0x83, 0x26, 0x32, 0x00, 0xf7, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b,
+ 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x0e, 0x32, 0x00, 0x08, 0x2a, 0xe4, 0xb0,
+ 0x13, 0xe6, 0x10, 0x90, 0x90, 0x90, 0xb0, 0x08, 0xe6, 0x12, 0x90, 0x90,
+ 0x90, 0xb0, 0x09, 0xe6, 0x12, 0x90, 0x90, 0x90, 0xb0, 0xff, 0xe6, 0x12,
+ 0x90, 0x90, 0x90, 0x26, 0x83, 0x26, 0x32, 0x00, 0xf7, 0x90, 0x90, 0x90,
+ 0x33, 0xc0, 0x26, 0xc7, 0x06, 0x44, 0x00, 0xff, 0xff, 0x26, 0xc7, 0x06,
+ 0x46, 0x00, 0xff, 0xff, 0x26, 0x09, 0x06, 0x48, 0x00, 0x26, 0x09, 0x06,
+ 0x4a, 0x00, 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8, 0x0f, 0x27, 0xe7, 0x00,
+ 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, 0x11, 0xe8, 0x89, 0x0a, 0xe8, 0xc7,
+ 0x0a, 0xfb, 0xe9, 0x71, 0x0b, 0x90, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58,
+ 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x0f, 0xf0, 0xf0, 0xf0, 0xf0, 0xe7, 0xe7, 0xe7, 0x30, 0x32,
+ 0x30, 0x33, 0x39, 0x39, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x38, 0x2c,
+ 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x4f, 0x6c, 0x69, 0x63, 0x6f, 0x6d,
+ 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73,
+ 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x5a, 0x21,
+ 0x5a, 0x21, 0xdd, 0x37, 0x8e, 0x3b, 0x8a, 0x3d, 0xd9, 0x3e, 0x1b, 0x40,
+ 0x63, 0x43, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0xcc, 0x41, 0x22, 0x42,
+ 0xb3, 0x42, 0x30, 0x43, 0x35, 0x43, 0x3a, 0x43, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0x5a, 0x21, 0xf2, 0x3a, 0x5a, 0x21, 0x5a, 0x21, 0x72, 0x39,
+ 0xd2, 0x39, 0xd2, 0x39, 0xaf, 0x3a, 0xd2, 0x39, 0xd7, 0x3a, 0x13, 0x3b,
+ 0x5a, 0x21, 0x5a, 0x21, 0xcc, 0x41, 0x22, 0x42, 0xb3, 0x42, 0x30, 0x43,
+ 0x35, 0x43, 0x3a, 0x43, 0x5a, 0x21, 0xec, 0x39, 0x5a, 0x21, 0x77, 0x3a,
+ 0x5a, 0x21, 0x48, 0x3b, 0x6e, 0x3b, 0x17, 0x35, 0x17, 0x35, 0x17, 0x35,
+ 0x17, 0x35, 0xe1, 0x35, 0x0e, 0x37, 0x17, 0x35, 0xf3, 0x35, 0xa1, 0x36,
+ 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37,
+ 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37,
+ 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37,
+ 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x60, 0x37, 0x4d, 0x36,
+ 0x17, 0x35, 0x17, 0x35, 0x17, 0x35, 0x17, 0x35, 0x17, 0x35, 0x80, 0x36,
+ 0x17, 0x35, 0x17, 0x35, 0x92, 0x36, 0x17, 0x35, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x04, 0x05, 0xff, 0xff,
+ 0xff, 0x00, 0x03, 0x00, 0x03, 0x03, 0x00, 0x03, 0x0d, 0x06, 0xff, 0xff,
+ 0x18, 0x06, 0x28, 0x06, 0x28, 0x06, 0x28, 0x06, 0x28, 0x06, 0x00, 0x00,
+ 0x33, 0x06, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x39, 0x06, 0x58, 0x06,
+ 0x9e, 0x06, 0x9e, 0x06, 0x9e, 0x06, 0x6d, 0x06, 0x7d, 0x06, 0x00, 0x00,
+ 0x83, 0x06, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x5a, 0x21, 0xeb, 0x43, 0x5e, 0x17, 0xc7, 0x34, 0xf3, 0x27,
+ 0x85, 0x4a, 0x5a, 0x21, 0x25, 0x44, 0xfe, 0x47, 0x47, 0x46, 0x47, 0x44,
+ 0xba, 0x45, 0xbf, 0x47, 0x83, 0x45, 0x77, 0x47, 0x85, 0x48, 0xcf, 0x48,
+ 0xbc, 0x48, 0x9e, 0x47, 0xdc, 0x48, 0x01, 0x49, 0x2c, 0x49, 0xbf, 0x48,
+ 0x4a, 0x49, 0x16, 0x03, 0x3c, 0x03, 0x5c, 0x03, 0x88, 0x03, 0xae, 0x03,
+ 0x26, 0x04, 0x8c, 0x04, 0xc6, 0x04, 0x10, 0x05, 0x02, 0x06, 0xe8, 0x01,
+ 0x10, 0x03, 0x36, 0x03, 0x64, 0x03, 0x82, 0x03, 0xa8, 0x03, 0x86, 0x04,
+ 0xc0, 0x04, 0x0a, 0x05, 0xfc, 0x05, 0xe4, 0x01, 0x2e, 0x04, 0x94, 0x04,
+ 0x00, 0x03, 0x2a, 0x03, 0x50, 0x03, 0x76, 0x03, 0x9c, 0x03, 0xc2, 0x03,
+ 0xbc, 0x03, 0xda, 0x03, 0x98, 0x05, 0x0e, 0x04, 0x7a, 0x04, 0xb4, 0x04,
+ 0xda, 0x04, 0xfa, 0x04, 0xe0, 0x05, 0x24, 0x05, 0x48, 0x05, 0x64, 0x05,
+ 0x7c, 0x05, 0xf4, 0x03, 0xb0, 0x05, 0xc8, 0x05, 0xc2, 0x5c, 0xca, 0x5c,
+ 0xd6, 0x5c, 0xde, 0x5c, 0xe6, 0x5c, 0x0c, 0x5d, 0x20, 0x5d, 0x28, 0x5d,
+ 0x34, 0x5d, 0x5a, 0x5d, 0x6e, 0x5d, 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5,
+ 0xf6, 0xf7, 0xf8, 0xf9, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0x14, 0x1e,
+ 0x7e, 0x1e, 0xaa, 0x1e, 0x20, 0x1f, 0x42, 0x1f, 0xd4, 0x1f, 0x32, 0x20,
+ 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5e, 0x20, 0x86, 0x20,
+ 0xf2, 0x20, 0x16, 0x21, 0x52, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0xfe, 0x16,
+ 0x2e, 0x18, 0xc2, 0x18, 0xc4, 0x18, 0xe0, 0x18, 0x06, 0x19, 0x22, 0x19,
+ 0xb0, 0x19, 0x26, 0x1a, 0x76, 0x1b, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0x86, 0x22, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0xb2, 0x1b, 0x22, 0x1c, 0xcc, 0x1c, 0x18, 0x1d, 0x9a, 0x1d,
+ 0xba, 0x1d, 0xe8, 0x1d, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21,
+ 0x5a, 0x21, 0x5a, 0x21, 0x5a, 0x21, 0xaa, 0x55, 0x00, 0xff, 0xf6, 0x46,
+ 0x01, 0x01, 0x75, 0x48, 0xc6, 0x86, 0x0e, 0x01, 0x05, 0xe8, 0x73, 0x01,
+ 0xe8, 0x11, 0x06, 0xe8, 0x02, 0x03, 0xe8, 0x60, 0x03, 0x73, 0x19, 0xfe,
+ 0x8e, 0x0e, 0x01, 0x74, 0x0d, 0xe8, 0xae, 0x03, 0x8b, 0x86, 0x0f, 0x01,
+ 0x26, 0xa3, 0x42, 0x00, 0xeb, 0xdf, 0xc7, 0x06, 0xf2, 0x5d, 0x02, 0x00,
+ 0x32, 0xe4, 0x8a, 0x46, 0x00, 0xe8, 0x4c, 0x04, 0x83, 0x3e, 0x4e, 0x00,
+ 0x02, 0x72, 0x03, 0xe8, 0x65, 0x03, 0xa1, 0xf2, 0x5d, 0xe8, 0x25, 0x43,
+ 0xc6, 0x46, 0x01, 0x01, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x27, 0xf6,
+ 0x86, 0x6c, 0x01, 0x01, 0x74, 0x03, 0xe8, 0xb1, 0x55, 0xf6, 0x86, 0x6d,
+ 0x01, 0x01, 0x74, 0x03, 0xe8, 0xff, 0x55, 0xf7, 0x86, 0x82, 0x01, 0x01,
+ 0x00, 0x75, 0x08, 0xf7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0x74, 0x03, 0xe8,
+ 0xdb, 0x52, 0xe8, 0x5e, 0x05, 0xe8, 0x2a, 0x05, 0xe8, 0xa2, 0x04, 0xe8,
+ 0x47, 0x04, 0xf6, 0x86, 0x95, 0x02, 0x01, 0x74, 0x03, 0xe8, 0xdc, 0x1c,
+ 0x33, 0xdb, 0xf6, 0x86, 0xae, 0x02, 0x01, 0x74, 0x16, 0x8a, 0x5e, 0x09,
+ 0x8a, 0x7e, 0x08, 0x38, 0xfb, 0x75, 0x30, 0x80, 0xfb, 0x00, 0x74, 0x07,
+ 0x80, 0xfb, 0x1e, 0x74, 0x02, 0xeb, 0x22, 0x80, 0x7e, 0x06, 0x1e, 0x74,
+ 0x1e, 0x33, 0xdb, 0x8a, 0x5e, 0x07, 0x3a, 0x5e, 0x06, 0x74, 0x14, 0xfa,
+ 0x50, 0x8b, 0x46, 0x06, 0x89, 0x46, 0x0c, 0x58, 0x88, 0x5e, 0x06, 0x32,
+ 0xff, 0xff, 0x97, 0xa4, 0x05, 0xeb, 0x32, 0x8a, 0x5e, 0x09, 0x3a, 0x5e,
+ 0x08, 0x74, 0x2a, 0x50, 0x8b, 0x46, 0x08, 0x89, 0x46, 0x0e, 0x58, 0x80,
+ 0xfb, 0x1e, 0x74, 0x12, 0x80, 0xfb, 0x00, 0x74, 0x0d, 0x80, 0xfb, 0x0c,
+ 0x74, 0x08, 0x80, 0xfb, 0x16, 0x74, 0x03, 0xe8, 0x87, 0x2c, 0x88, 0x5e,
+ 0x08, 0x32, 0xff, 0xfa, 0xff, 0x97, 0x82, 0x05, 0xfb, 0xfa, 0xf7, 0x86,
+ 0xf0, 0x00, 0xff, 0xff, 0x74, 0x0f, 0x8b, 0xb6, 0xf0, 0x00, 0x8b, 0x4c,
+ 0x04, 0xe8, 0xd2, 0x09, 0xfb, 0xff, 0xd1, 0xeb, 0x5c, 0xfb, 0xf7, 0x46,
+ 0x16, 0xff, 0xff, 0x74, 0x27, 0x8d, 0x7e, 0x16, 0xe8, 0x68, 0x06, 0x56,
+ 0x8b, 0x5c, 0x02, 0xd1, 0xe3, 0xff, 0x97, 0xd2, 0x04, 0x5e, 0xe8, 0x6c,
+ 0x06, 0xf7, 0x86, 0xcc, 0x01, 0x01, 0x00, 0x74, 0x09, 0xe8, 0x15, 0x26,
+ 0xc7, 0x86, 0xcc, 0x01, 0x00, 0x00, 0xeb, 0x2d, 0xfa, 0xf7, 0x86, 0x0a,
+ 0x01, 0x01, 0x00, 0x75, 0x13, 0xf6, 0x86, 0xc4, 0x15, 0x80, 0x75, 0x0c,
+ 0xc7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0xfb, 0xe8, 0x7d, 0x3c, 0xeb, 0x11,
+ 0xfa, 0x8b, 0x86, 0x67, 0x02, 0x38, 0xc4, 0x74, 0x07, 0x88, 0x86, 0x68,
+ 0x02, 0xe8, 0x0d, 0x1b, 0xfb, 0xe8, 0xd1, 0x05, 0xe9, 0xcd, 0xfe, 0x8e,
+ 0x46, 0x02, 0x26, 0xc7, 0x06, 0x44, 0x00, 0xff, 0xcb, 0x8e, 0x46, 0x02,
+ 0x26, 0xc7, 0x06, 0x48, 0x00, 0xff, 0xfb, 0xe8, 0xa5, 0x02, 0x33, 0xc0,
+ 0x88, 0x86, 0xb8, 0x01, 0x88, 0x86, 0xb9, 0x01, 0x8e, 0x46, 0x02, 0x26,
+ 0xa2, 0x5a, 0x00, 0x89, 0x86, 0x18, 0x02, 0x89, 0x86, 0x0a, 0x02, 0x89,
+ 0x86, 0x3a, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x4c, 0x00, 0x30,
+ 0x01, 0x8d, 0x86, 0xa8, 0x08, 0x89, 0x86, 0xc0, 0x01, 0x89, 0x86, 0xc2,
+ 0x01, 0xc7, 0x86, 0xc4, 0x01, 0x01, 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x33,
+ 0xc0, 0x8d, 0xbe, 0x58, 0x02, 0xb9, 0x52, 0x00, 0xd1, 0xe9, 0xf3, 0xab,
+ 0xd1, 0xd1, 0xf3, 0xaa, 0x8d, 0xbe, 0xec, 0x05, 0xab, 0xab, 0xaa, 0x8d,
+ 0xbe, 0xf4, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe, 0xb8, 0x02, 0xb9, 0x0b,
+ 0x00, 0xf3, 0xab, 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xc0,
+ 0x02, 0x04, 0x00, 0xbb, 0x02, 0x05, 0xb9, 0x0b, 0x00, 0x8b, 0x3f, 0x03,
+ 0xfd, 0xab, 0xab, 0xab, 0x43, 0x43, 0xe2, 0xf5, 0xbb, 0x18, 0x05, 0xb9,
+ 0x0a, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0xab, 0x43, 0x43, 0xe2, 0xf6,
+ 0xb8, 0x02, 0x00, 0x03, 0x06, 0xcc, 0x5d, 0xe8, 0x1d, 0x05, 0x39, 0x06,
+ 0xcc, 0x5d, 0x75, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00,
+ 0x02, 0xc7, 0x86, 0x0c, 0x02, 0xc8, 0x00, 0xc7, 0x86, 0xfc, 0x01, 0xff,
+ 0xff, 0xc7, 0x86, 0xfa, 0x01, 0x07, 0x00, 0xc6, 0x86, 0x8c, 0x02, 0x00,
+ 0xe8, 0x01, 0x00, 0xc3, 0x8e, 0x46, 0x02, 0x33, 0xc0, 0xfa, 0x89, 0x86,
+ 0xb6, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x50, 0x00, 0x8b, 0x86, 0xa8,
+ 0x15, 0x26, 0xa3, 0x70, 0x00, 0x89, 0x86, 0xb2, 0x01, 0x93, 0xc7, 0x07,
+ 0x00, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff, 0x93, 0xc1, 0xe8, 0x08, 0x26,
+ 0xa3, 0x74, 0x00, 0x8b, 0x86, 0xaa, 0x15, 0x26, 0xa3, 0x78, 0x00, 0x26,
+ 0xa1, 0x78, 0x00, 0x93, 0xc7, 0x47, 0xfc, 0xde, 0xad, 0xc7, 0x47, 0xfe,
+ 0xbe, 0xaf, 0x93, 0xc1, 0xe8, 0x08, 0x26, 0xa3, 0x76, 0x00, 0x33, 0xc0,
+ 0xc6, 0x86, 0x87, 0x02, 0x01, 0x8d, 0xb6, 0xa8, 0x09, 0xc7, 0x86, 0xa6,
+ 0x01, 0xb0, 0x09, 0x01, 0xae, 0xa6, 0x01, 0x89, 0xb6, 0xa8, 0x01, 0x89,
+ 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30, 0x80, 0xc7, 0x44, 0x04, 0x00, 0x00,
+ 0xc6, 0x86, 0x8a, 0x02, 0x01, 0xfb, 0xe8, 0xab, 0x08, 0x80, 0xbe, 0xfe,
+ 0x00, 0x02, 0x74, 0x33, 0xb8, 0x00, 0x40, 0x80, 0xbe, 0xfe, 0x00, 0x00,
+ 0x74, 0x13, 0x25, 0xff, 0x1f, 0x0d, 0x00, 0xa0, 0x83, 0xe0, 0xfd, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c, 0x00, 0x80, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0xa3, 0x40, 0x00, 0xa1, 0xcc, 0x5d, 0x83, 0xc0, 0x02, 0xe8, 0x42,
+ 0x04, 0x39, 0x06, 0xcc, 0x5d, 0x75, 0xf7, 0xc3, 0x8e, 0x46, 0x02, 0x26,
+ 0xc7, 0x06, 0x40, 0x00, 0x08, 0xbe, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x42, 0x00, 0xc8, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x4c, 0x00, 0xa0,
+ 0x00, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x50, 0x00, 0x04, 0x00, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff, 0x90, 0x90, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x80, 0x00, 0x90, 0x90, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff, 0x8e, 0x46, 0x02,
+ 0x26, 0xc7, 0x06, 0x68, 0x00, 0x18, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x0e, 0x4c, 0x00, 0x01, 0x26, 0xa1, 0x32, 0x00, 0xc3, 0xc6, 0x86, 0x0c,
+ 0x01, 0x01, 0xc6, 0x86, 0x0d, 0x01, 0x00, 0xe8, 0x1e, 0x28, 0xa1, 0xcc,
+ 0x5d, 0x83, 0xc0, 0x02, 0x0b, 0xc0, 0x0b, 0xc0, 0x0b, 0xc0, 0x0b, 0xc0,
+ 0x39, 0x06, 0xcc, 0x5d, 0x72, 0xf2, 0x80, 0xbe, 0x0d, 0x01, 0x01, 0x74,
+ 0x03, 0xf9, 0xeb, 0x01, 0xf8, 0xc6, 0x86, 0x0c, 0x01, 0x00, 0xc3, 0xb8,
+ 0x00, 0x00, 0x88, 0x86, 0x06, 0x01, 0x88, 0x86, 0x07, 0x01, 0x88, 0x86,
+ 0x08, 0x01, 0x88, 0x86, 0x09, 0x01, 0x89, 0x86, 0x0a, 0x01, 0x88, 0x86,
+ 0xb8, 0x01, 0x88, 0x86, 0xb9, 0x01, 0x88, 0x86, 0xd1, 0x01, 0xa2, 0x23,
+ 0x5f, 0xc3, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0x26, 0x83, 0x0e, 0x32, 0x00,
+ 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26,
+ 0x32, 0x00, 0xf7, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b,
+ 0xc0, 0x26, 0x83, 0x0e, 0x32, 0x00, 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b,
+ 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, 0x32, 0x00, 0xf7, 0xc3, 0x50, 0x53,
+ 0x52, 0xc6, 0x46, 0x01, 0x00, 0x32, 0xe4, 0x8a, 0x46, 0x00, 0xbb, 0x00,
+ 0xbd, 0x81, 0xeb, 0x00, 0x7d, 0x81, 0xe3, 0x00, 0xff, 0x89, 0x9e, 0xac,
+ 0x15, 0x81, 0xc3, 0x00, 0x01, 0xf7, 0xe3, 0x05, 0x00, 0x7d, 0x89, 0x86,
+ 0xa8, 0x15, 0x03, 0x86, 0xac, 0x15, 0x48, 0x89, 0x86, 0xaa, 0x15, 0x5a,
+ 0x5b, 0x58, 0xc3, 0x51, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00,
+ 0xfc, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x80, 0x00, 0x75,
+ 0x1e, 0xb9, 0xf4, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c, 0x00,
+ 0x00, 0x08, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x80, 0x00,
+ 0x75, 0x05, 0xe8, 0xe2, 0x02, 0xe2, 0xe5, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x4c, 0x00, 0xff, 0xf7, 0x59, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x4c, 0x00, 0x02, 0xc3, 0x50, 0x53, 0xc1, 0xe0, 0x05, 0x05, 0x00, 0x03,
+ 0x8b, 0xd8, 0x8d, 0x86, 0x00, 0x01, 0x89, 0x07, 0x8d, 0x86, 0xd4, 0x01,
+ 0x89, 0x47, 0x02, 0x8d, 0x86, 0xe4, 0x01, 0x89, 0x47, 0x04, 0x8d, 0x86,
+ 0xb0, 0x15, 0x89, 0x47, 0x08, 0x8d, 0x86, 0xc4, 0x15, 0x89, 0x47, 0x06,
+ 0x8d, 0x86, 0xc0, 0x01, 0x89, 0x47, 0x0a, 0xc7, 0x47, 0x0c, 0x38, 0x5f,
+ 0x8d, 0x86, 0x40, 0x02, 0x89, 0x47, 0x0e, 0x8d, 0x06, 0xcc, 0x5d, 0x89,
+ 0x47, 0x10, 0x5b, 0x58, 0xc3, 0x50, 0xf7, 0x86, 0xf6, 0x00, 0x02, 0x00,
+ 0x75, 0x02, 0xeb, 0x4b, 0xf6, 0x86, 0x64, 0x02, 0x01, 0x75, 0x07, 0xf6,
+ 0x86, 0x72, 0x02, 0x01, 0x74, 0x3d, 0xf6, 0x86, 0x89, 0x02, 0x01, 0x74,
+ 0x36, 0xc6, 0x86, 0x89, 0x02, 0x00, 0x8b, 0x86, 0x0a, 0x02, 0xf7, 0x86,
+ 0x12, 0x01, 0x00, 0x40, 0x74, 0x03, 0x25, 0xff, 0xaf, 0xf7, 0x86, 0x12,
+ 0x01, 0x00, 0x20, 0x74, 0x03, 0x25, 0xff, 0xdf, 0x89, 0x86, 0x0a, 0x02,
+ 0x3b, 0x86, 0x3a, 0x02, 0x74, 0x0d, 0x89, 0x86, 0x3a, 0x02, 0x81, 0xa6,
+ 0x3a, 0x02, 0x7f, 0xdf, 0xe8, 0x4e, 0x3f, 0x58, 0xc3, 0x57, 0x56, 0x50,
+ 0x8b, 0x86, 0xe6, 0x02, 0xa9, 0xff, 0xff, 0x74, 0x40, 0x8d, 0xbe, 0xdc,
+ 0x02, 0x8d, 0xb6, 0xec, 0x05, 0xb9, 0x0a, 0x00, 0x83, 0xf9, 0x05, 0x75,
+ 0x04, 0x8d, 0xb6, 0xf4, 0x05, 0xa9, 0x01, 0x00, 0x74, 0x1e, 0x80, 0x3d,
+ 0xff, 0x74, 0x12, 0xfe, 0x05, 0x80, 0x3d, 0xff, 0x75, 0x0b, 0x81, 0x8e,
+ 0x0a, 0x02, 0x80, 0x00, 0xc6, 0x86, 0x89, 0x02, 0x01, 0x80, 0x3c, 0xff,
+ 0x74, 0x02, 0xfe, 0x04, 0xd1, 0xe8, 0x47, 0x46, 0xe2, 0xce, 0xe8, 0x0a,
+ 0x00, 0xc7, 0x86, 0xe6, 0x02, 0x00, 0x00, 0x58, 0x5e, 0x5f, 0xc3, 0xf6,
+ 0x86, 0x5a, 0x02, 0x01, 0x75, 0x27, 0xf6, 0x86, 0xaf, 0x02, 0x01, 0x75,
+ 0x07, 0xf6, 0x86, 0x64, 0x02, 0x01, 0x74, 0x19, 0xc6, 0x86, 0x5a, 0x02,
+ 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x75, 0x0c, 0xbe, 0x7f, 0x4c,
+ 0xe8, 0xa1, 0x03, 0xc7, 0x86, 0xc0, 0x02, 0x04, 0x00, 0xc3, 0xf7, 0x86,
+ 0xb0, 0x15, 0x00, 0x80, 0x75, 0x02, 0xeb, 0x26, 0x8b, 0xb6, 0x60, 0x01,
+ 0x3b, 0xb6, 0x5e, 0x01, 0x74, 0x1c, 0x46, 0x83, 0xe6, 0x07, 0x89, 0xb6,
+ 0x60, 0x01, 0x8b, 0xce, 0xd1, 0xe1, 0xd1, 0xe1, 0x8d, 0xb6, 0x3e, 0x01,
+ 0x03, 0xf1, 0x8b, 0x04, 0x8b, 0x54, 0x02, 0xe9, 0x3e, 0x3f, 0xc3, 0xbb,
+ 0x00, 0x03, 0x83, 0x7f, 0x12, 0x00, 0x74, 0x08, 0xe8, 0xb9, 0x3e, 0xc7,
+ 0x47, 0x12, 0x00, 0x00, 0xc3, 0x53, 0x50, 0x33, 0xc0, 0x88, 0x86, 0xcf,
+ 0x01, 0xa3, 0x34, 0x5f, 0xbb, 0x38, 0x5f, 0x89, 0x1e, 0x2c, 0x5f, 0x89,
+ 0x07, 0x89, 0x47, 0x02, 0x89, 0x47, 0x04, 0xa3, 0x2e, 0x5f, 0xa3, 0x30,
+ 0x5f, 0xa3, 0x32, 0x5f, 0x58, 0x5b, 0xc3, 0x50, 0x8a, 0xe0, 0xe4, 0x12,
+ 0xf6, 0xd4, 0x22, 0xc4, 0xe6, 0x12, 0x58, 0xc3, 0xc6, 0x46, 0x06, 0x00,
+ 0xc6, 0x46, 0x07, 0x00, 0xc6, 0x46, 0x08, 0x00, 0xc6, 0x46, 0x09, 0x00,
+ 0xc6, 0x86, 0xc4, 0x15, 0x80, 0x8d, 0xbe, 0x16, 0x03, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xab, 0xab, 0xab, 0xc3, 0x51, 0x53, 0xb9, 0x10, 0x00, 0xd1, 0xe0,
+ 0xd1, 0xdb, 0xe2, 0xfa, 0x8b, 0xc3, 0x86, 0xc4, 0x5b, 0x59, 0xc3, 0x90,
+ 0x50, 0x53, 0x51, 0x52, 0x57, 0x56, 0x8d, 0x1e, 0x72, 0x05, 0xb8, 0x40,
+ 0x60, 0x8e, 0xc0, 0xff, 0x06, 0x4e, 0x00, 0xc7, 0x06, 0xe8, 0x5d, 0x00,
+ 0x00, 0xc6, 0x06, 0xec, 0x5d, 0x00, 0xc7, 0x06, 0xf0, 0x5d, 0x30, 0x00,
+ 0x8d, 0x3e, 0xea, 0x5d, 0xb8, 0x48, 0x66, 0x89, 0x05, 0x06, 0x33, 0xc0,
+ 0x8e, 0xc0, 0xa3, 0xcc, 0x5d, 0xa3, 0xce, 0x5d, 0xa3, 0xd0, 0x5d, 0x8d,
+ 0x3e, 0xe0, 0x5d, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x8d, 0x3e,
+ 0xe4, 0x5d, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x07, 0x8b, 0xd4,
+ 0xb9, 0x01, 0x00, 0xbb, 0x00, 0x00, 0xbd, 0x48, 0x66, 0x88, 0x5e, 0x00,
+ 0x8b, 0xc3, 0xd1, 0xe0, 0xd1, 0xe0, 0x05, 0x40, 0x60, 0x89, 0x46, 0x02,
+ 0x06, 0x51, 0x8c, 0xd8, 0x8e, 0xc0, 0xbe, 0x80, 0x03, 0x8d, 0xbe, 0x1a,
+ 0x04, 0xb9, 0x05, 0x00, 0xf3, 0xa5, 0x59, 0x07, 0xe8, 0x2f, 0xfd, 0xe8,
+ 0xe2, 0x00, 0x8b, 0xc5, 0x05, 0xa4, 0x08, 0x89, 0x86, 0xa6, 0x08, 0x83,
+ 0xc0, 0x02, 0x8b, 0xe0, 0x68, 0x06, 0x06, 0x81, 0xc5, 0x44, 0x16, 0x43,
+ 0xe2, 0xbf, 0x8b, 0xe2, 0x33, 0xed, 0x5e, 0x5f, 0x5a, 0x59, 0x5b, 0x58,
+ 0xc3, 0x3e, 0x89, 0xa6, 0xa6, 0x08, 0x33, 0xed, 0xbc, 0x20, 0x5f, 0xfa,
+ 0x83, 0x0e, 0xe4, 0x5d, 0x00, 0x74, 0x0d, 0x8b, 0x36, 0xe4, 0x5d, 0x8b,
+ 0x4c, 0x04, 0xe8, 0xd1, 0x03, 0xfb, 0xff, 0xd1, 0xfb, 0x32, 0xff, 0x8a,
+ 0x1e, 0xe8, 0x5d, 0x80, 0x8f, 0xee, 0x5d, 0x00, 0x75, 0x21, 0xd1, 0xe3,
+ 0x8b, 0xaf, 0xea, 0x5d, 0x81, 0xbe, 0xa4, 0x06, 0xa5, 0xa5, 0x74, 0x0c,
+ 0xd1, 0xeb, 0xc6, 0x87, 0xee, 0x5d, 0x01, 0xe8, 0xf2, 0x06, 0xeb, 0x07,
+ 0x8b, 0x86, 0xa6, 0x08, 0x8b, 0xe0, 0xc3, 0xeb, 0xb5, 0xeb, 0xae, 0x60,
+ 0x9c, 0xe8, 0xa9, 0xff, 0x0e, 0xe8, 0x02, 0x00, 0xeb, 0x01, 0xcf, 0x61,
+ 0xc3, 0x50, 0xfa, 0x8b, 0x76, 0x1a, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0x10,
+ 0x8b, 0x04, 0x89, 0x46, 0x1a, 0x0b, 0xc0, 0x75, 0x03, 0x89, 0x46, 0x1c,
+ 0xc7, 0x04, 0x00, 0x00, 0xfb, 0x58, 0xc3, 0x53, 0xfa, 0xc7, 0x04, 0x00,
+ 0x00, 0x8b, 0x5d, 0x02, 0x89, 0x37, 0x89, 0x75, 0x02, 0x83, 0x3d, 0x00,
+ 0x75, 0x02, 0x89, 0x35, 0xfb, 0x5b, 0xc3, 0x50, 0xfa, 0x8b, 0x35, 0x8b,
+ 0x04, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x03, 0x89, 0x45, 0x02, 0xfb, 0x58,
+ 0xc3, 0x50, 0xfa, 0x8b, 0x46, 0x1a, 0x89, 0x04, 0x89, 0x76, 0x1a, 0xf7,
+ 0x46, 0x1a, 0xff, 0xff, 0x75, 0x03, 0x89, 0x76, 0x1a, 0xfb, 0x58, 0xc3,
+ 0x50, 0x53, 0x51, 0x8b, 0xc5, 0x83, 0xc0, 0x1e, 0x89, 0x46, 0x1a, 0x83,
+ 0xc0, 0x48, 0x89, 0x46, 0x1c, 0xb9, 0x09, 0x00, 0x8b, 0xdd, 0x8b, 0xc5,
+ 0x83, 0xc0, 0x26, 0x89, 0x47, 0x1e, 0x83, 0xc3, 0x08, 0x83, 0xc0, 0x08,
+ 0xe2, 0xf5, 0x59, 0x5b, 0x58, 0xc3, 0x60, 0x06, 0x1e, 0xfa, 0x33, 0xdb,
+ 0x8e, 0xdb, 0x83, 0x06, 0xcc, 0x5d, 0x01, 0x73, 0x04, 0x11, 0x1e, 0xce,
+ 0x5d, 0xb9, 0x01, 0x00, 0x8b, 0xaf, 0xea, 0x5d, 0xf6, 0x06, 0x23, 0x5f,
+ 0x01, 0x75, 0x03, 0xe8, 0xe8, 0x46, 0xf7, 0x86, 0xa8, 0x02, 0x01, 0x00,
+ 0x74, 0x30, 0xfe, 0x86, 0x6b, 0x01, 0x80, 0xbe, 0x6b, 0x01, 0x02, 0x73,
+ 0x02, 0xeb, 0x23, 0xc6, 0x86, 0x6b, 0x01, 0x00, 0xf7, 0x86, 0x1c, 0x01,
+ 0x01, 0x00, 0x75, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00,
+ 0x32, 0xfe, 0x81, 0xa6, 0x18, 0x01, 0x32, 0xfe, 0xc7, 0x86, 0xa8, 0x02,
+ 0x00, 0x00, 0xc6, 0x86, 0x6a, 0x01, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x48, 0x00, 0x25, 0x00, 0x02, 0x74, 0x03, 0xe8, 0x44, 0x17, 0xf6, 0x86,
+ 0x58, 0x02, 0x01, 0x74, 0x03, 0xe8, 0xb6, 0x46, 0x8b, 0x86, 0xf6, 0x00,
+ 0x25, 0xd0, 0xe3, 0x89, 0x86, 0x30, 0x02, 0x8a, 0x46, 0x08, 0x3c, 0x06,
+ 0x74, 0x08, 0x3c, 0x0a, 0x74, 0x04, 0x3c, 0x18, 0x75, 0x04, 0xff, 0x86,
+ 0x4a, 0x02, 0x83, 0xc3, 0x02, 0x49, 0x74, 0x03, 0xe9, 0x75, 0xff, 0xf7,
+ 0x06, 0xe0, 0x5d, 0xff, 0xff, 0x74, 0x1f, 0xff, 0x0e, 0xd0, 0x5d, 0x75,
+ 0x19, 0xe8, 0x14, 0x02, 0x8b, 0x1e, 0xe0, 0x5d, 0x0b, 0xdb, 0x74, 0x0e,
+ 0x8b, 0x47, 0x08, 0xa3, 0xd0, 0x5d, 0xf7, 0x06, 0xd0, 0x5d, 0xff, 0xff,
+ 0x74, 0xe7, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0x1f, 0x07, 0x61, 0xcf,
+ 0x60, 0x06, 0x1e, 0xfa, 0x8d, 0x36, 0xd4, 0x5d, 0x83, 0x04, 0x01, 0x83,
+ 0x54, 0x02, 0x00, 0xe8, 0xfb, 0x4a, 0xa0, 0xd2, 0x5d, 0xfe, 0xc0, 0x3c,
+ 0x04, 0x72, 0x08, 0xc6, 0x06, 0xd2, 0x5d, 0x00, 0xe9, 0x0f, 0xff, 0xa2,
+ 0xd2, 0x5d, 0xeb, 0xce, 0x50, 0x57, 0x56, 0xfa, 0x8d, 0x36, 0xd8, 0x5d,
+ 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0x80, 0x3e, 0x23, 0x5f, 0x01,
+ 0x75, 0x0d, 0x8b, 0x36, 0x26, 0x5f, 0x83, 0xfe, 0x14, 0x77, 0x0e, 0xff,
+ 0x94, 0x5c, 0x05, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0x5e, 0x5f, 0x58,
+ 0xcf, 0xe8, 0xaa, 0x4d, 0xeb, 0xf1, 0x57, 0x56, 0x50, 0xfa, 0x8d, 0x36,
+ 0xdc, 0x5d, 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0x80, 0x3e, 0x23,
+ 0x5f, 0x01, 0x75, 0x0d, 0x8b, 0x36, 0x26, 0x5f, 0x83, 0xfe, 0x14, 0x77,
+ 0x0e, 0xff, 0x94, 0x5c, 0x05, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0x58,
+ 0x5e, 0x5f, 0xcf, 0xe8, 0x78, 0x4d, 0xeb, 0xf1, 0x50, 0x53, 0x51, 0x57,
+ 0xe8, 0xab, 0x00, 0xfa, 0x8b, 0x3c, 0x03, 0xfd, 0x89, 0x6d, 0x02, 0x8b,
+ 0x44, 0x02, 0x89, 0x45, 0x04, 0x8b, 0x44, 0x04, 0x89, 0x45, 0x06, 0x0b,
+ 0xc0, 0x75, 0x0e, 0x8b, 0x86, 0x0c, 0x02, 0x0b, 0xc0, 0x75, 0x03, 0xb8,
+ 0xc8, 0x00, 0x89, 0x45, 0x06, 0xf7, 0x06, 0xe0, 0x5d, 0xff, 0xff, 0x75,
+ 0x14, 0x89, 0x3e, 0xe0, 0x5d, 0x89, 0x3e, 0xe2, 0x5d, 0xc7, 0x05, 0x00,
+ 0x00, 0x89, 0x45, 0x08, 0xa3, 0xd0, 0x5d, 0xeb, 0x63, 0x8b, 0x3e, 0xe0,
+ 0x5d, 0x8b, 0x0e, 0xd0, 0x5d, 0x33, 0xdb, 0x3b, 0xc8, 0x72, 0x35, 0x0b,
+ 0xdb, 0x75, 0x17, 0x2b, 0xc8, 0x89, 0x4d, 0x08, 0x8b, 0x34, 0x03, 0xf5,
+ 0x89, 0x44, 0x08, 0x89, 0x3c, 0x89, 0x36, 0xe0, 0x5d, 0xa3, 0xd0, 0x5d,
+ 0xeb, 0x3a, 0x2b, 0x4d, 0x08, 0x2b, 0xc1, 0x8b, 0x34, 0x03, 0xf5, 0x89,
+ 0x44, 0x08, 0x8b, 0x4d, 0x08, 0x2b, 0xc8, 0x89, 0x4d, 0x08, 0x89, 0x37,
+ 0x89, 0x3c, 0xeb, 0x20, 0x8b, 0xdf, 0x8b, 0x3d, 0x0b, 0xff, 0x74, 0x05,
+ 0x03, 0x4d, 0x08, 0xeb, 0xba, 0x2b, 0xc1, 0x8b, 0x34, 0x03, 0xf5, 0x89,
+ 0x44, 0x08, 0x89, 0x37, 0xc7, 0x04, 0x00, 0x00, 0x89, 0x36, 0xe2, 0x5d,
+ 0xfb, 0x5f, 0x59, 0x5b, 0x58, 0xc3, 0x57, 0x53, 0x50, 0x56, 0xfa, 0x8b,
+ 0x1e, 0xe0, 0x5d, 0x33, 0xff, 0x8b, 0x34, 0x03, 0xf5, 0x83, 0x7c, 0x02,
+ 0xff, 0x74, 0x4b, 0x3b, 0xde, 0x75, 0x49, 0x0b, 0xff, 0x74, 0x18, 0x8b,
+ 0x07, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x06, 0x89, 0x3e, 0xe2, 0x5d, 0xeb,
+ 0x2c, 0x8b, 0x4f, 0x08, 0x8b, 0xf8, 0x01, 0x4d, 0x08, 0xeb, 0x22, 0x8b,
+ 0x3f, 0x89, 0x3e, 0xe0, 0x5d, 0x0b, 0xff, 0x75, 0x0c, 0x89, 0x3e, 0xe2,
+ 0x5d, 0xc7, 0x06, 0xd0, 0x5d, 0xff, 0xff, 0xeb, 0x0c, 0xa1, 0xd0, 0x5d,
+ 0x01, 0x45, 0x08, 0x8b, 0x45, 0x08, 0xa3, 0xd0, 0x5d, 0xc7, 0x47, 0x02,
+ 0xff, 0xff, 0xc7, 0x07, 0x00, 0x00, 0xeb, 0x4e, 0x83, 0xcb, 0x00, 0x74,
+ 0x06, 0x8b, 0xfb, 0x8b, 0x1f, 0xeb, 0xa8, 0x83, 0xfd, 0x00, 0x75, 0x05,
+ 0xbb, 0xe4, 0x5d, 0xeb, 0x04, 0x8d, 0x9e, 0xf0, 0x00, 0x8b, 0x1f, 0x83,
+ 0xfb, 0x00, 0x74, 0x2e, 0x3b, 0xde, 0x75, 0x05, 0xe8, 0x6b, 0x00, 0xeb,
+ 0x25, 0x8b, 0xfb, 0x8b, 0x1f, 0x83, 0xcb, 0x00, 0x74, 0x1c, 0x3b, 0xde,
+ 0x75, 0xf3, 0x8b, 0x07, 0x89, 0x05, 0x83, 0xc8, 0x00, 0x75, 0x04, 0x89,
+ 0xbe, 0xf2, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff,
+ 0xeb, 0x00, 0xfb, 0x5e, 0x58, 0x5b, 0x5f, 0xc3, 0x50, 0x53, 0x56, 0x55,
+ 0x8b, 0x1e, 0xe0, 0x5d, 0x8b, 0x6f, 0x02, 0x0b, 0xed, 0x74, 0x06, 0x81,
+ 0xc5, 0xf0, 0x00, 0xeb, 0x03, 0xbd, 0xe4, 0x5d, 0x8b, 0x76, 0x02, 0x8b,
+ 0x07, 0xa3, 0xe0, 0x5d, 0x0b, 0xc0, 0x75, 0x03, 0xa3, 0xe2, 0x5d, 0x89,
+ 0x5e, 0x02, 0x89, 0x1c, 0xc7, 0x07, 0x00, 0x00, 0x83, 0x4e, 0x00, 0x00,
+ 0x75, 0x03, 0x89, 0x5e, 0x00, 0x5d, 0x5e, 0x5b, 0x58, 0xc3, 0x55, 0x53,
+ 0x50, 0x0b, 0xed, 0x74, 0x06, 0x81, 0xc5, 0xf0, 0x00, 0xeb, 0x03, 0xbd,
+ 0xe4, 0x5d, 0x8b, 0x5e, 0x00, 0xc7, 0x47, 0x02, 0xff, 0xff, 0x8b, 0x07,
+ 0xc7, 0x07, 0x00, 0x00, 0x8b, 0xd8, 0x89, 0x5e, 0x00, 0x0b, 0xdb, 0x75,
+ 0x03, 0x89, 0x5e, 0x02, 0x58, 0x5b, 0x5d, 0xc3, 0x50, 0x53, 0x51, 0x57,
+ 0x56, 0xfa, 0x8b, 0x1e, 0xe0, 0x5d, 0x33, 0xff, 0x83, 0xcb, 0x00, 0x74,
+ 0x54, 0x8b, 0xc3, 0x39, 0x6f, 0x02, 0x75, 0x47, 0x0b, 0xff, 0x74, 0x18,
+ 0x8b, 0x37, 0x89, 0x35, 0x8b, 0xc7, 0x0b, 0xf6, 0x75, 0x06, 0x89, 0x3e,
+ 0xe2, 0x5d, 0xeb, 0x2c, 0x8b, 0x4f, 0x08, 0x01, 0x4c, 0x08, 0xeb, 0x24,
+ 0x8b, 0x37, 0x89, 0x36, 0xe0, 0x5d, 0x0b, 0xf6, 0x75, 0x0c, 0x89, 0x36,
+ 0xe2, 0x5d, 0xc7, 0x06, 0xd0, 0x5d, 0xff, 0xff, 0xeb, 0x0e, 0xa1, 0xd0,
+ 0x5d, 0x01, 0x44, 0x08, 0x8b, 0x44, 0x08, 0xa3, 0xd0, 0x5d, 0x33, 0xc0,
+ 0xc7, 0x47, 0x02, 0xff, 0xff, 0xeb, 0x00, 0x8b, 0xf8, 0x8b, 0x1f, 0xeb,
+ 0xa7, 0xfb, 0x5e, 0x5f, 0x59, 0x5b, 0x58, 0xc3, 0x50, 0x53, 0x51, 0x52,
+ 0x8a, 0x8e, 0xad, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x32, 0x00, 0x8a,
+ 0x9e, 0x7d, 0x02, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x57, 0xf6, 0x86,
+ 0xb3, 0x02, 0x01, 0x75, 0x4e, 0x0d, 0x74, 0x80, 0x25, 0x7f, 0x9f, 0x26,
+ 0xa3, 0x32, 0x00, 0xb8, 0x01, 0x00, 0xe8, 0x2d, 0x05, 0x26, 0x83, 0x0e,
+ 0x42, 0x00, 0x04, 0xc6, 0x86, 0xb4, 0x02, 0x00, 0x26, 0xa1, 0x32, 0x00,
+ 0x0d, 0x00, 0x60, 0x26, 0xa3, 0x32, 0x00, 0xb8, 0x00, 0x00, 0xe8, 0x11,
+ 0x05, 0x26, 0xa1, 0x32, 0x00, 0x83, 0xe0, 0xdf, 0x26, 0xa3, 0x32, 0x00,
+ 0xb8, 0x00, 0x00, 0xe8, 0x00, 0x05, 0xe8, 0x83, 0x01, 0x26, 0xa1, 0x8c,
+ 0x00, 0x25, 0xff, 0x07, 0x0d, 0x00, 0xd0, 0x26, 0xa3, 0x8c, 0x00, 0xeb,
+ 0x41, 0xf6, 0x86, 0xb4, 0x02, 0x01, 0x75, 0x3a, 0x26, 0x83, 0x26, 0x42,
+ 0x00, 0xfb, 0x26, 0xa1, 0x32, 0x00, 0x0d, 0xb4, 0x80, 0x25, 0xbf, 0x9f,
+ 0x26, 0xa3, 0x32, 0x00, 0xc6, 0x86, 0xb3, 0x02, 0x00, 0xb8, 0x01, 0x00,
+ 0xe8, 0xc7, 0x04, 0x26, 0xa1, 0x32, 0x00, 0x83, 0xe0, 0xef, 0x26, 0xa3,
+ 0x32, 0x00, 0xc6, 0x86, 0xb4, 0x02, 0x01, 0xc6, 0x06, 0x6f, 0x13, 0x01,
+ 0xb8, 0x00, 0x00, 0xe8, 0xac, 0x04, 0x26, 0xa1, 0x40, 0x00, 0x8b, 0xd8,
+ 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x75, 0x10, 0x83, 0xe0, 0xfd, 0xc6, 0x86,
+ 0x7d, 0x02, 0x01, 0x25, 0xff, 0x1f, 0x0d, 0x00, 0x80, 0xeb, 0x0e, 0x25,
+ 0xff, 0x1f, 0x0d, 0x00, 0x20, 0x83, 0xc8, 0x02, 0xc6, 0x86, 0x7d, 0x02,
+ 0x00, 0xe8, 0xa8, 0x02, 0x0d, 0x00, 0x08, 0xf6, 0x86, 0xaf, 0x02, 0x01,
+ 0x75, 0x03, 0x25, 0xff, 0xf7, 0x33, 0xd8, 0x74, 0x0f, 0x26, 0xa3, 0x40,
+ 0x00, 0xf7, 0xc3, 0x02, 0x00, 0x74, 0x05, 0xc6, 0x06, 0x6f, 0x13, 0x01,
+ 0x26, 0xa1, 0x4c, 0x00, 0x8a, 0x9e, 0x7d, 0x02, 0x8b, 0xd8, 0xf7, 0x86,
+ 0x12, 0x01, 0x10, 0x00, 0x74, 0x05, 0x0d, 0x00, 0x10, 0xeb, 0x03, 0x25,
+ 0xff, 0xef, 0x8a, 0xae, 0x6d, 0x02, 0x80, 0xf9, 0x01, 0x75, 0x04, 0x8a,
+ 0xae, 0x6e, 0x02, 0xf6, 0xc5, 0x01, 0x74, 0x05, 0x83, 0xc8, 0x10, 0xeb,
+ 0x03, 0x83, 0xe0, 0xef, 0xf6, 0x86, 0x6f, 0x02, 0x01, 0x74, 0x0a, 0x83,
+ 0xc8, 0x20, 0xc6, 0x86, 0x7e, 0x02, 0x00, 0xeb, 0x08, 0x83, 0xe0, 0xdf,
+ 0xc6, 0x86, 0x7e, 0x02, 0x01, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x0a,
+ 0xc6, 0x86, 0x7e, 0x02, 0x00, 0x83, 0xc8, 0x40, 0xeb, 0x03, 0x83, 0xe0,
+ 0xbf, 0xf6, 0x86, 0x7d, 0x02, 0x01, 0x74, 0x05, 0x0d, 0x80, 0x00, 0xeb,
+ 0x03, 0x25, 0x7f, 0xff, 0xf6, 0x86, 0x7c, 0x02, 0x01, 0x74, 0x05, 0x0d,
+ 0x00, 0x01, 0xeb, 0x03, 0x25, 0xff, 0xfe, 0xf6, 0x86, 0x7e, 0x02, 0x01,
+ 0x74, 0x05, 0x0d, 0x00, 0x20, 0xeb, 0x03, 0x25, 0xff, 0xdf, 0x33, 0xd8,
+ 0x74, 0x12, 0xf7, 0xc3, 0x20, 0x00, 0x74, 0x05, 0xc6, 0x06, 0x6f, 0x13,
+ 0x01, 0x25, 0xff, 0xf7, 0x26, 0xa3, 0x4c, 0x00, 0x26, 0xa1, 0x50, 0x00,
+ 0x8b, 0xd8, 0x33, 0xd8, 0x74, 0x04, 0x26, 0xa3, 0x50, 0x00, 0xf6, 0x06,
+ 0x6f, 0x13, 0x01, 0x74, 0x25, 0xc6, 0x06, 0x6f, 0x13, 0x00, 0x80, 0xbe,
+ 0xfe, 0x00, 0x02, 0x74, 0x19, 0x26, 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff,
+ 0x90, 0x90, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x80, 0x00, 0x90, 0x90, 0x26,
+ 0x81, 0x26, 0x40, 0x00, 0x7f, 0xff, 0x5a, 0x59, 0x5b, 0x58, 0xc3, 0x00,
+ 0xf6, 0x86, 0xb3, 0x02, 0x01, 0x75, 0x42, 0x50, 0xe8, 0x50, 0x03, 0xb3,
+ 0x00, 0x8a, 0x3e, 0x22, 0x5f, 0xb8, 0x00, 0x80, 0xe8, 0xdf, 0x02, 0x8b,
+ 0xc0, 0x8b, 0xc0, 0x8b, 0xc0, 0xb3, 0x00, 0x8a, 0x3e, 0x22, 0x5f, 0xb8,
+ 0x00, 0x21, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x04, 0x74, 0x03, 0x0d, 0x00,
+ 0x40, 0xe8, 0xc2, 0x02, 0xb3, 0x1b, 0x8a, 0x3e, 0x22, 0x5f, 0xe8, 0x12,
+ 0x02, 0x83, 0xc8, 0x10, 0xe8, 0xb3, 0x02, 0xc6, 0x86, 0xb3, 0x02, 0x01,
+ 0x58, 0xc3, 0x8e, 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x04, 0x00, 0x74,
+ 0x0b, 0xc6, 0x06, 0x23, 0x5f, 0x01, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x02,
+ 0xc6, 0x86, 0xb0, 0x02, 0x00, 0xc6, 0x86, 0xb1, 0x02, 0x00, 0xa8, 0x02,
+ 0x74, 0x26, 0x26, 0x83, 0x26, 0x42, 0x00, 0xcf, 0xf7, 0x86, 0xf4, 0x00,
+ 0x04, 0x00, 0x75, 0x14, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x75, 0x0c,
+ 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x77, 0x05, 0xc6, 0x86, 0xb0, 0x02, 0x01,
+ 0xb0, 0x02, 0xeb, 0x2a, 0xa8, 0x04, 0x74, 0x0e, 0x26, 0x83, 0x0e, 0x42,
+ 0x00, 0x20, 0x26, 0x83, 0x26, 0x42, 0x00, 0xef, 0xeb, 0x18, 0xa8, 0x08,
+ 0x74, 0x08, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x30, 0xeb, 0x0c, 0xa8, 0x10,
+ 0x74, 0x08, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x30, 0xeb, 0x00, 0xf6, 0x06,
+ 0x23, 0x5f, 0x01, 0x74, 0x06, 0x26, 0x83, 0x26, 0x42, 0x00, 0xcf, 0xc3,
+ 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c, 0x00, 0x00, 0x01, 0x90,
+ 0x90, 0x90, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x4c, 0x00, 0xff,
+ 0xfe, 0xc3, 0x8e, 0x46, 0x02, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x1e,
+ 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x0f, 0x80, 0xbe, 0xb0, 0x02, 0x01,
+ 0x75, 0x10, 0x26, 0x83, 0x0e, 0x42, 0x00, 0x02, 0xeb, 0x08, 0xc6, 0x86,
+ 0x6c, 0x01, 0x01, 0xe8, 0x98, 0x47, 0xc3, 0x8e, 0x46, 0x02, 0xf7, 0x86,
+ 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81, 0x26, 0x42, 0x00, 0xff,
+ 0xef, 0xeb, 0x07, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00, 0x10, 0xc3, 0x8e,
+ 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81,
+ 0x0e, 0x42, 0x00, 0x00, 0x10, 0xeb, 0x07, 0x26, 0x81, 0x26, 0x42, 0x00,
+ 0xff, 0xef, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00,
+ 0x80, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x42, 0x00, 0xff, 0x7f,
+ 0xc3, 0xf7, 0x86, 0xf4, 0x00, 0x08, 0x00, 0x74, 0x13, 0xe8, 0xdf, 0xff,
+ 0xeb, 0x39, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x1d, 0x80, 0x7e, 0x06, 0x48,
+ 0x74, 0x23, 0xeb, 0x2b, 0xe8, 0xd7, 0xff, 0x8e, 0x46, 0x02, 0xf7, 0x86,
+ 0xf4, 0x00, 0x10, 0x00, 0x75, 0xe4, 0x80, 0xbe, 0xfe, 0x00, 0x00, 0x75,
+ 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00, 0x40, 0xeb,
+ 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x42, 0x00, 0xff, 0xbf, 0xc3,
+ 0x83, 0xe0, 0xf7, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x04, 0x74, 0x03, 0x83,
+ 0xc8, 0x08, 0xc3, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x77, 0x0a, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x0e, 0x50, 0x00, 0x04, 0xc3, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x0e, 0x90, 0x00, 0x04, 0xc3, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x77,
+ 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x50, 0x00, 0xfb, 0xc3, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x26, 0x90, 0x00, 0xfb, 0xc3, 0x51, 0x50, 0xfa,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x92, 0x00, 0xfb, 0x26, 0x83, 0x26,
+ 0x92, 0x00, 0xfe, 0x90, 0x90, 0x90, 0x90, 0x26, 0x83, 0x0e, 0x92, 0x00,
+ 0x01, 0x90, 0x90, 0x90, 0x90, 0x26, 0xa1, 0x92, 0x00, 0x83, 0xc8, 0x02,
+ 0xb9, 0x20, 0x00, 0xe8, 0x06, 0x00, 0xe2, 0xfb, 0xfb, 0x58, 0x59, 0xc3,
+ 0x53, 0x8e, 0x46, 0x02, 0x24, 0xfe, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90,
+ 0x90, 0x90, 0x0c, 0x01, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x90, 0x5b,
+ 0xc3, 0x51, 0xb1, 0x03, 0xd2, 0xe5, 0xb1, 0x05, 0xd0, 0xe5, 0x72, 0x04,
+ 0x24, 0xfd, 0xeb, 0x02, 0x0c, 0x02, 0xe8, 0xd3, 0xff, 0xfe, 0xc9, 0x75,
+ 0xef, 0x59, 0xc3, 0x9c, 0xfa, 0x51, 0x52, 0xfa, 0x8e, 0x46, 0x02, 0xe8,
+ 0x8f, 0xff, 0x26, 0xa1, 0x92, 0x00, 0x83, 0xe0, 0xfd, 0x83, 0xc8, 0x01,
+ 0x26, 0xa3, 0x92, 0x00, 0x83, 0xc8, 0x04, 0x26, 0xa3, 0x92, 0x00, 0xe8,
+ 0xaa, 0xff, 0x83, 0xc8, 0x02, 0xe8, 0xa4, 0xff, 0x83, 0xc8, 0x02, 0xe8,
+ 0x9e, 0xff, 0x83, 0xe0, 0xfd, 0xe8, 0x98, 0xff, 0x8a, 0xef, 0xe8, 0xac,
+ 0xff, 0x8a, 0xeb, 0xe8, 0xa7, 0xff, 0x83, 0xe0, 0xfb, 0xe8, 0x88, 0xff,
+ 0x83, 0xe0, 0xfe, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x26, 0x8b, 0x0e,
+ 0x92, 0x00, 0xf7, 0xc1, 0x02, 0x00, 0x74, 0x12, 0xa8, 0x02, 0x74, 0x0e,
+ 0xb9, 0x12, 0x00, 0xe8, 0x6a, 0xff, 0xe2, 0xfb, 0xfb, 0x5a, 0x59, 0x9d,
+ 0xf9, 0xc3, 0x0c, 0x01, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x90, 0x90,
+ 0xb1, 0x10, 0x53, 0x33, 0xdb, 0x24, 0xfe, 0x26, 0xa3, 0x92, 0x00, 0x26,
+ 0xa1, 0x92, 0x00, 0xd1, 0xe3, 0xa8, 0x02, 0x74, 0x03, 0x83, 0xcb, 0x01,
+ 0x0c, 0x01, 0x26, 0xa3, 0x92, 0x00, 0x90, 0x90, 0x90, 0x90, 0xfe, 0xc9,
+ 0x75, 0xdf, 0xe8, 0x2f, 0xff, 0x8b, 0xc3, 0x5b, 0xfb, 0x5a, 0x59, 0x9d,
+ 0xf8, 0xc3, 0x9c, 0xfa, 0x51, 0x53, 0x52, 0x50, 0xfa, 0xe8, 0xe9, 0xfe,
+ 0x26, 0xa1, 0x92, 0x00, 0x83, 0xe0, 0xfd, 0x83, 0xc8, 0x01, 0x26, 0xa3,
+ 0x92, 0x00, 0x83, 0xc8, 0x04, 0x26, 0xa3, 0x92, 0x00, 0xe8, 0x04, 0xff,
+ 0x83, 0xc8, 0x02, 0xe8, 0xfe, 0xfe, 0x24, 0xfd, 0xe8, 0xf9, 0xfe, 0x0c,
+ 0x02, 0xe8, 0xf4, 0xfe, 0x8a, 0xef, 0xe8, 0x08, 0xff, 0x8a, 0xeb, 0xe8,
+ 0x03, 0xff, 0x0c, 0x02, 0xe8, 0xe5, 0xfe, 0x24, 0xfd, 0xe8, 0xe0, 0xfe,
+ 0x5b, 0xb1, 0x10, 0xd1, 0xe3, 0x72, 0x04, 0x24, 0xfd, 0xeb, 0x02, 0x0c,
+ 0x02, 0xe8, 0xd0, 0xfe, 0xfe, 0xc9, 0x75, 0xef, 0x24, 0xfb, 0xe8, 0xc7,
+ 0xfe, 0xfb, 0x5a, 0x5b, 0x59, 0x9d, 0xc3, 0x50, 0xe8, 0x8a, 0xfe, 0xb7,
+ 0x00, 0xb3, 0x02, 0xe8, 0xe9, 0xfe, 0x83, 0xf8, 0xff, 0x75, 0x09, 0xfe,
+ 0xc7, 0x80, 0xff, 0x20, 0x75, 0xf1, 0xb7, 0xff, 0x88, 0x3e, 0x22, 0x5f,
+ 0x58, 0xc3, 0x53, 0x40, 0x03, 0x06, 0xcc, 0x5d, 0x8b, 0xd8, 0xe8, 0x62,
+ 0xf6, 0xa1, 0xcc, 0x5d, 0x3b, 0xc3, 0x75, 0xf6, 0x5b, 0xc3, 0xe8, 0x86,
+ 0xf0, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32,
+ 0x00, 0x00, 0x80, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x0b, 0xc6, 0x86,
+ 0x7c, 0x02, 0x00, 0xe8, 0x62, 0xfa, 0xe8, 0xf6, 0xfd, 0x33, 0xc0, 0x88,
+ 0x86, 0x8d, 0x02, 0x88, 0x86, 0x8e, 0x02, 0xc6, 0x86, 0x63, 0x01, 0x01,
+ 0xc7, 0x86, 0x64, 0x01, 0x02, 0x06, 0xc6, 0x86, 0x69, 0x01, 0x02, 0xbe,
+ 0xe5, 0x4c, 0xe8, 0xff, 0xf7, 0xbe, 0xdf, 0x4c, 0xe8, 0xf9, 0xf7, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0x32, 0xfe, 0xc3, 0xc6, 0x86,
+ 0x63, 0x01, 0x00, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x0d, 0xe8, 0x1a,
+ 0xf0, 0xe8, 0xa3, 0x30, 0xc6, 0x46, 0x07, 0x00, 0xe9, 0xb6, 0x00, 0xbe,
+ 0x91, 0x4c, 0xe8, 0x81, 0xf8, 0xbe, 0xdf, 0x4c, 0xe8, 0x7b, 0xf8, 0xc6,
+ 0x86, 0x8d, 0x02, 0x01, 0x80, 0x7e, 0x06, 0x02, 0x74, 0x08, 0x80, 0x7e,
+ 0x06, 0x44, 0x74, 0x09, 0xeb, 0x1c, 0xc6, 0x46, 0x07, 0x04, 0xe9, 0x90,
+ 0x00, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x74, 0x07, 0xc6, 0x46, 0x07,
+ 0x4e, 0xe9, 0x81, 0x00, 0xc6, 0x46, 0x07, 0x46, 0xeb, 0x7b, 0x80, 0x7e,
+ 0x08, 0x08, 0x75, 0xf8, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6, 0x86, 0x6d,
+ 0x02, 0x00, 0xc6, 0x86, 0x61, 0x02, 0x00, 0xc6, 0x86, 0x60, 0x02, 0x00,
+ 0xc6, 0x86, 0x63, 0x02, 0x01, 0xc6, 0x86, 0x6c, 0x02, 0x01, 0xc6, 0x86,
+ 0x70, 0x02, 0x01, 0xf6, 0x86, 0x5c, 0x02, 0x01, 0x74, 0x17, 0x80, 0xbe,
+ 0xab, 0x02, 0x01, 0x74, 0x2c, 0xc6, 0x46, 0x09, 0x0a, 0xc6, 0x86, 0x6f,
+ 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x01, 0xeb, 0x1c, 0xf6, 0x86, 0x5d,
+ 0x02, 0x01, 0x74, 0x15, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x0e, 0xc6,
+ 0x46, 0x09, 0x06, 0xc6, 0x86, 0x5c, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02,
+ 0x01, 0xe8, 0x3e, 0xfc, 0xe8, 0x71, 0xf9, 0xbe, 0xc7, 0x4c, 0xe8, 0x2b,
+ 0xf7, 0xbe, 0x85, 0x4c, 0xe8, 0x25, 0xf7, 0xbe, 0xcd, 0x4c, 0xe8, 0x1f,
+ 0xf7, 0xc3, 0xc6, 0x46, 0x09, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26,
+ 0x44, 0x00, 0x32, 0xfe, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x75, 0x05,
+ 0xc6, 0x86, 0x97, 0x02, 0x01, 0xe8, 0x64, 0x0a, 0xc7, 0x86, 0xc8, 0x01,
+ 0x14, 0x00, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xbe, 0xd3, 0x4c, 0xe8,
+ 0xee, 0xf6, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x01,
+ 0xc6, 0x86, 0x6c, 0x02, 0x01, 0xc6, 0x86, 0x70, 0x02, 0x01, 0xe8, 0x17,
+ 0xf9, 0xb8, 0x01, 0x00, 0xe8, 0x6f, 0xfe, 0xe8, 0xd8, 0xfb, 0xbe, 0x8b,
+ 0x4c, 0xe8, 0xc8, 0xf6, 0xbe, 0xc7, 0x4c, 0xe8, 0xc2, 0xf6, 0x33, 0xc0,
+ 0x89, 0x86, 0xf2, 0x01, 0x89, 0x86, 0xf4, 0x01, 0x89, 0x86, 0xf6, 0x01,
+ 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x44, 0x00, 0xff, 0xf7, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x20, 0x74,
+ 0x10, 0xbe, 0xcd, 0x4c, 0xe8, 0x95, 0xf6, 0xc6, 0x86, 0x61, 0x02, 0x00,
+ 0xc6, 0x86, 0x60, 0x02, 0x00, 0xc3, 0xc3, 0x90, 0xc6, 0x86, 0x5b, 0x02,
+ 0x01, 0xc7, 0x86, 0xce, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xd0, 0x02, 0x00,
+ 0x00, 0xbe, 0x8b, 0x4c, 0xe8, 0x71, 0xf6, 0xe8, 0xf3, 0x14, 0xc3, 0x90,
+ 0xc6, 0x86, 0x5f, 0x02, 0x01, 0xf6, 0x86, 0x88, 0x02, 0x01, 0x74, 0x08,
+ 0xe8, 0x36, 0x17, 0xc6, 0x86, 0x88, 0x02, 0x00, 0xbe, 0x8b, 0x4c, 0xe8,
+ 0x52, 0xf6, 0xf6, 0x86, 0x67, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x07,
+ 0x0c, 0xc3, 0xbe, 0x8b, 0x4c, 0xe8, 0x40, 0xf6, 0xbe, 0xa9, 0x4c, 0xe8,
+ 0x3a, 0xf6, 0xc7, 0x86, 0xc2, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xc4, 0x02,
+ 0x01, 0x00, 0xe8, 0x7c, 0x15, 0xc3, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00,
+ 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00, 0xc6, 0x86, 0x08, 0x01, 0x00, 0x81,
+ 0xa6, 0x0a, 0x02, 0xdf, 0xbf, 0xc6, 0x86, 0x64, 0x02, 0x01, 0xc7, 0x86,
+ 0x2a, 0x02, 0xff, 0xff, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x20, 0x75, 0x18,
+ 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x75, 0x10, 0xbe, 0xcd, 0x4c, 0xe8,
+ 0xf2, 0xf5, 0xc6, 0x86, 0x61, 0x02, 0x00, 0xc6, 0x86, 0x60, 0x02, 0x00,
+ 0xbe, 0x8b, 0x4c, 0xe8, 0x94, 0xf6, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff, 0x7f, 0xb8, 0x00,
+ 0x80, 0xe8, 0xfe, 0x2f, 0xe8, 0x4a, 0xfb, 0xe8, 0xf9, 0xfa, 0xc6, 0x86,
+ 0x62, 0x02, 0x01, 0xc6, 0x86, 0xce, 0x01, 0x00, 0xf7, 0x86, 0xf6, 0x00,
+ 0x04, 0x00, 0x74, 0x05, 0xc6, 0x86, 0xce, 0x01, 0x01, 0xf6, 0x86, 0x58,
+ 0x02, 0x01, 0x75, 0x06, 0xbe, 0x97, 0x4c, 0xe8, 0xa2, 0xf5, 0xff, 0x86,
+ 0xfc, 0x00, 0xc3, 0x90, 0xe8, 0x8b, 0xfb, 0xc6, 0x86, 0x08, 0x01, 0x00,
+ 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x46, 0x0b, 0x00, 0xc6, 0x86, 0x58, 0x02,
+ 0x00, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, 0x62, 0x02, 0x00, 0xc6,
+ 0x86, 0x64, 0x02, 0x00, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xc6, 0x86, 0x67,
+ 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x00,
+ 0xc6, 0x86, 0x6e, 0x02, 0x00, 0xe8, 0x9c, 0xf7, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x0e, 0x40, 0x00, 0x20, 0xf6, 0x86, 0x70, 0x02, 0x01, 0x74, 0x02,
+ 0xeb, 0x23, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08,
+ 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01,
+ 0x01, 0xe8, 0x52, 0x42, 0xe8, 0x01, 0xf7, 0xbe, 0xa3, 0x4c, 0xe8, 0x27,
+ 0xf5, 0xc3, 0xc7, 0x86, 0x32, 0x02, 0x02, 0x00, 0xe8, 0x0f, 0xfb, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32,
+ 0x00, 0x00, 0x80, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75,
+ 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d,
+ 0x01, 0x01, 0xe8, 0x15, 0x42, 0xc6, 0x86, 0x08, 0x01, 0x00, 0xc7, 0x86,
+ 0x22, 0x01, 0x00, 0x00, 0xe8, 0x34, 0xfa, 0xe8, 0x58, 0xfa, 0xf7, 0x86,
+ 0xf4, 0x00, 0x10, 0x00, 0x74, 0x14, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00,
+ 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x42, 0x00, 0x00, 0x40,
+ 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x42, 0x00, 0xff, 0xbf,
+ 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x05, 0xc6, 0x86, 0xfe, 0x00, 0x01,
+ 0xf6, 0x86, 0xbd, 0x01, 0x01, 0x75, 0x02, 0xeb, 0x71, 0x26, 0xff, 0x36,
+ 0x5e, 0x00, 0x26, 0xff, 0x36, 0x60, 0x00, 0x26, 0xff, 0x36, 0x62, 0x00,
+ 0x26, 0xff, 0x36, 0x64, 0x00, 0x26, 0xff, 0x36, 0x66, 0x00, 0x26, 0xff,
+ 0x36, 0x7a, 0x00, 0x26, 0xff, 0x36, 0x7c, 0x00, 0x26, 0xff, 0x36, 0x7e,
+ 0x00, 0x26, 0xff, 0x36, 0x52, 0x00, 0x26, 0xff, 0x36, 0x6a, 0x00, 0x26,
+ 0xff, 0x36, 0x68, 0x00, 0xe8, 0xf7, 0xee, 0x26, 0x8f, 0x06, 0x68, 0x00,
+ 0x26, 0x8f, 0x06, 0x6a, 0x00, 0x26, 0x8f, 0x06, 0x52, 0x00, 0x26, 0x8f,
+ 0x06, 0x7e, 0x00, 0x26, 0x8f, 0x06, 0x7c, 0x00, 0x26, 0x8f, 0x06, 0x7a,
+ 0x00, 0x26, 0x8f, 0x06, 0x66, 0x00, 0x26, 0x8f, 0x06, 0x64, 0x00, 0x26,
+ 0x8f, 0x06, 0x62, 0x00, 0x26, 0x8f, 0x06, 0x60, 0x00, 0x26, 0x8f, 0x06,
+ 0x5e, 0x00, 0xe8, 0x6e, 0xec, 0xe8, 0xff, 0x2e, 0xc6, 0x86, 0xb2, 0x02,
+ 0x00, 0x8d, 0xbe, 0x16, 0x03, 0x8c, 0xd8, 0x8e, 0xc0, 0xab, 0xab, 0xab,
+ 0xf6, 0x86, 0xab, 0x02, 0x01, 0x74, 0x12, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x0e, 0x42, 0x00, 0x04, 0xc6, 0x86, 0xb4, 0x02, 0x00, 0xc6, 0x46, 0x09,
+ 0x1e, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x44, 0x00, 0xff, 0xfb, 0xf7,
+ 0x86, 0x12, 0x01, 0x00, 0x02, 0x74, 0x10, 0xf7, 0x86, 0x20, 0x01, 0x80,
+ 0x00, 0x75, 0x08, 0xbe, 0x51, 0x4d, 0xe8, 0xe7, 0xf3, 0xeb, 0x0d, 0x8e,
+ 0x46, 0x02, 0x33, 0xc0, 0x26, 0xa3, 0x64, 0x00, 0x26, 0xa3, 0x66, 0x00,
+ 0xc3, 0x90, 0x33, 0xc0, 0x88, 0x86, 0x5f, 0x02, 0x88, 0x86, 0x62, 0x02,
+ 0x88, 0x86, 0x64, 0x02, 0x88, 0x86, 0x67, 0x02, 0x88, 0x86, 0x6c, 0x02,
+ 0xbe, 0xd9, 0x4c, 0xe8, 0xba, 0xf3, 0xc6, 0x86, 0xb2, 0x02, 0x01, 0x8e,
+ 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26,
+ 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xbd,
+ 0x40, 0xc3, 0xc7, 0x86, 0x32, 0x02, 0x03, 0x00, 0xe8, 0xcc, 0xeb, 0xc6,
+ 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0xc4, 0xf5,
+ 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x1e, 0xf7, 0x86,
+ 0xf6, 0x00, 0x00, 0x10, 0x74, 0x15, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x40,
+ 0x74, 0x0d, 0xf7, 0x86, 0xf6, 0x00, 0x20, 0x00, 0x74, 0x05, 0xc6, 0x86,
+ 0x78, 0x02, 0x01, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x06, 0xbe, 0x45,
+ 0x4d, 0xe8, 0x50, 0xf3, 0xe8, 0x24, 0xf9, 0xf7, 0x86, 0x12, 0x01, 0x00,
+ 0x84, 0x74, 0x06, 0xc6, 0x46, 0x07, 0x44, 0xeb, 0x06, 0xbe, 0xf7, 0x4c,
+ 0xe8, 0x39, 0xf3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0x32,
+ 0xfe, 0xe8, 0x90, 0x06, 0xc3, 0x90, 0xc7, 0x86, 0x32, 0x02, 0x04, 0x00,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e,
+ 0x32, 0x00, 0x00, 0x80, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xc6, 0x86, 0x6d,
+ 0x02, 0x00, 0xc6, 0x86, 0x7c, 0x02, 0x00, 0xe8, 0x42, 0xf5, 0xe8, 0xd6,
+ 0xf8, 0xb0, 0x00, 0xe8, 0x58, 0x17, 0x33, 0xc0, 0x88, 0x86, 0x8d, 0x02,
+ 0x88, 0x86, 0x8e, 0x02, 0xc6, 0x86, 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64,
+ 0x01, 0x02, 0x06, 0xc6, 0x86, 0x69, 0x01, 0x02, 0x80, 0xbe, 0xfe, 0x00,
+ 0x02, 0x75, 0x2c, 0xc6, 0x86, 0x68, 0x01, 0x02, 0xc7, 0x86, 0x66, 0x01,
+ 0x60, 0x04, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xbe, 0x45, 0x4d, 0xe8, 0xc3,
+ 0xf2, 0xbe, 0x91, 0x4c, 0xe8, 0xbd, 0xf2, 0xbe, 0xf1, 0x4c, 0xe8, 0xb7,
+ 0xf2, 0xbe, 0x3f, 0x4d, 0xe8, 0xb1, 0xf2, 0xe8, 0xae, 0x14, 0xc3, 0xc6,
+ 0x86, 0x68, 0x01, 0x02, 0xc7, 0x86, 0x66, 0x01, 0x20, 0x03, 0x8e, 0x46,
+ 0x02, 0x26, 0xc7, 0x06, 0x5c, 0x00, 0x00, 0x00, 0xbe, 0x91, 0x4c, 0xe8,
+ 0x92, 0xf2, 0xbe, 0xf1, 0x4c, 0xe8, 0x8c, 0xf2, 0x8b, 0xb6, 0x64, 0x01,
+ 0xb9, 0xe8, 0x03, 0xe8, 0x20, 0x11, 0xc3, 0x90, 0xc7, 0x86, 0x32, 0x02,
+ 0x05, 0x00, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x08, 0xc6, 0x86, 0x6d,
+ 0x02, 0x01, 0xe8, 0xab, 0xf4, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x75, 0x04,
+ 0xc6, 0x46, 0x09, 0x16, 0xc6, 0x86, 0x73, 0x02, 0x01, 0xbe, 0x15, 0x4d,
+ 0xe8, 0x55, 0xf2, 0xbe, 0x1b, 0x4d, 0xe8, 0x4f, 0xf2, 0xbe, 0x03, 0x4d,
+ 0xe8, 0x49, 0xf2, 0xbe, 0x2d, 0x4d, 0xe8, 0x43, 0xf2, 0xc7, 0x86, 0xd6,
+ 0x02, 0x01, 0x00, 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xe8, 0xfb, 0x13, 0xc3,
+ 0xc7, 0x86, 0x32, 0x02, 0x07, 0x00, 0xc6, 0x86, 0x6c, 0x02, 0x01, 0xc6,
+ 0x86, 0x60, 0x02, 0x00, 0xc6, 0x86, 0x61, 0x02, 0x00, 0xbe, 0xcd, 0x4c,
+ 0xe8, 0x19, 0xf2, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x75, 0x0d, 0xc6, 0x86,
+ 0x72, 0x02, 0x01, 0xb8, 0x00, 0x80, 0xe8, 0x39, 0x2c, 0xeb, 0x0a, 0x83,
+ 0xa6, 0x0a, 0x02, 0xdf, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc6, 0x86, 0x08,
+ 0x01, 0x00, 0xe8, 0x74, 0xf7, 0xe8, 0x23, 0xf7, 0xf6, 0x06, 0x23, 0x5f,
+ 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x44, 0x00, 0xff,
+ 0xf7, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81,
+ 0x26, 0x32, 0x00, 0xff, 0x7f, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x15,
+ 0xe8, 0xcf, 0xf6, 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xcc,
+ 0x02, 0x00, 0x00, 0xbe, 0xd3, 0x4c, 0xe8, 0xb3, 0xf1, 0xc3, 0xbe, 0x33,
+ 0x4d, 0xe8, 0xac, 0xf1, 0xc6, 0x86, 0x78, 0x02, 0x00, 0xc6, 0x86, 0x74,
+ 0x02, 0x00, 0xc6, 0x86, 0xfe, 0x00, 0x02, 0xe8, 0xda, 0xf3, 0xbe, 0x45,
+ 0x4d, 0xe8, 0x94, 0xf1, 0xc3, 0x90, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6,
+ 0x46, 0x09, 0x1e, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe,
+ 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xc7, 0x86, 0xda, 0x02, 0x05,
+ 0x00, 0xbe, 0x39, 0x4d, 0xe8, 0x6d, 0xf1, 0xb0, 0x00, 0xe8, 0xc6, 0x15,
+ 0xe8, 0x81, 0x13, 0xc3, 0xb8, 0x00, 0x80, 0xe8, 0x90, 0x2b, 0xc6, 0x86,
+ 0x08, 0x01, 0x00, 0xe8, 0xd7, 0xf6, 0xe8, 0x86, 0xf6, 0x8e, 0x46, 0x02,
+ 0x26, 0xc7, 0x06, 0x68, 0x00, 0x18, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff, 0x7f, 0xc3,
+ 0xc7, 0x86, 0x36, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xc6, 0x01, 0xff, 0xff,
+ 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc8, 0x01, 0x14, 0x00,
+ 0x80, 0x7e, 0x07, 0x10, 0x74, 0x4b, 0xb0, 0x00, 0xe8, 0x73, 0x15, 0x80,
+ 0x7e, 0x06, 0x0e, 0x74, 0x02, 0xeb, 0x3e, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff, 0x7f, 0x83,
+ 0xa6, 0x0a, 0x02, 0xdf, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf6, 0x86, 0x5f,
+ 0x02, 0x01, 0x74, 0x1d, 0xf6, 0x86, 0x6a, 0x02, 0x01, 0x74, 0x16, 0xf6,
+ 0x86, 0x67, 0x02, 0x01, 0x75, 0x0f, 0xc6, 0x86, 0x67, 0x02, 0x01, 0xf6,
+ 0x86, 0x58, 0x02, 0x01, 0x75, 0x03, 0xe8, 0x29, 0x0f, 0xc3, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00,
+ 0x00, 0x80, 0xc7, 0x86, 0x36, 0x02, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02,
+ 0x01, 0xe8, 0xf0, 0xf2, 0xe8, 0x9e, 0xf5, 0xbe, 0xaf, 0x4c, 0xe8, 0xa7,
+ 0xf0, 0xe8, 0xb9, 0x0e, 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xc7, 0x86,
+ 0x36, 0x02, 0x03, 0x00, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xc7, 0x86,
+ 0xc8, 0x01, 0x0a, 0x00, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x0f, 0xc6,
+ 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x64, 0x00,
+ 0xff, 0x7f, 0xc6, 0x86, 0x5e, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x01,
+ 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0x98, 0xf2, 0x81, 0xa6, 0x0a, 0x02,
+ 0xff, 0x2f, 0x83, 0x8e, 0x0a, 0x02, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01,
+ 0xbe, 0x79, 0x4c, 0xe8, 0x42, 0xf0, 0xbe, 0x9d, 0x4c, 0xe8, 0x3c, 0xf0,
+ 0xc7, 0x86, 0xbc, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xbe, 0x02, 0x01, 0x00,
+ 0xe8, 0xf1, 0x0d, 0xc3, 0xff, 0x86, 0x48, 0x02, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80,
+ 0xe8, 0xec, 0xf5, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x75, 0x03, 0xe8, 0x95,
+ 0x0d, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26,
+ 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x75,
+ 0x20, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6,
+ 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x21, 0xf2, 0xe8, 0xb2, 0xf1, 0xbe, 0xa3,
+ 0x4c, 0xe8, 0xd8, 0xef, 0xe8, 0xc7, 0xf5, 0xeb, 0x59, 0xc6, 0x86, 0x71,
+ 0x02, 0x01, 0xf6, 0x86, 0x70, 0x02, 0x01, 0x75, 0x4d, 0xe8, 0x98, 0xf1,
+ 0xe8, 0xd9, 0xe8, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, 0x71, 0x02,
+ 0x00, 0xbe, 0xa3, 0x4c, 0xe8, 0xb1, 0xef, 0x8e, 0x46, 0x02, 0xf6, 0x06,
+ 0x23, 0x5f, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb,
+ 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xb9, 0x3c, 0xe8, 0x6b, 0xf5,
+ 0x33, 0xc0, 0x88, 0x86, 0x8d, 0x02, 0x88, 0x86, 0x8e, 0x02, 0xc6, 0x86,
+ 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64, 0x01, 0x02, 0x06, 0xc6, 0x86, 0x69,
+ 0x01, 0x02, 0xc3, 0x90, 0xff, 0x86, 0x48, 0x02, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80,
+ 0xe8, 0x38, 0xf5, 0xc7, 0x86, 0xb8, 0x02, 0x02, 0x00, 0xc7, 0x86, 0xba,
+ 0x02, 0x08, 0x00, 0xc6, 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x64, 0x00, 0xff, 0x7f, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6,
+ 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x79, 0xf1, 0xf6, 0x86, 0x85, 0x02, 0x01,
+ 0x75, 0x06, 0xbe, 0x6d, 0x4c, 0xe8, 0x2c, 0xef, 0x81, 0xa6, 0x0a, 0x02,
+ 0xff, 0x6f, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x89, 0x02,
+ 0x01, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26,
+ 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0x83, 0xbe, 0xca, 0x01, 0x00, 0x74,
+ 0x0d, 0x8b, 0x86, 0xca, 0x01, 0xc7, 0x86, 0xca, 0x01, 0x00, 0x00, 0xe8,
+ 0x2a, 0x10, 0xbe, 0x79, 0x4c, 0xe8, 0xf0, 0xee, 0xc3, 0x90, 0xc7, 0x86,
+ 0x36, 0x02, 0x01, 0x00, 0xc7, 0x86, 0x34, 0x02, 0x02, 0x00, 0xb0, 0x00,
+ 0xe8, 0x3b, 0x13, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x10, 0x8e, 0x46, 0x02,
+ 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x01, 0x26, 0x81, 0x26, 0x32, 0x00, 0xff,
+ 0x7f, 0xc3, 0xc7, 0x86, 0x34, 0x02, 0x03, 0x00, 0xff, 0x86, 0x48, 0x02,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e,
+ 0x32, 0x00, 0x00, 0x80, 0xc6, 0x86, 0x6c, 0x02, 0x00, 0xc6, 0x86, 0x73,
+ 0x02, 0x00, 0xbe, 0xfd, 0x4c, 0xe8, 0x9c, 0xee, 0xbe, 0x09, 0x4d, 0xe8,
+ 0x96, 0xee, 0xbe, 0x21, 0x4d, 0xe8, 0x90, 0xee, 0x80, 0xbe, 0xfe, 0x00,
+ 0x02, 0x74, 0x08, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0xc1, 0xf0, 0x81,
+ 0x8e, 0x0a, 0x02, 0x04, 0x50, 0xc6, 0x86, 0x89, 0x02, 0x01, 0x80, 0xbe,
+ 0xfe, 0x00, 0x02, 0x74, 0x0d, 0xf6, 0x86, 0x65, 0x02, 0x01, 0x74, 0x06,
+ 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x80, 0xe8, 0x31, 0x30, 0xe8, 0xe6, 0x0b,
+ 0xc3, 0x90, 0xc7, 0x86, 0x34, 0x02, 0x04, 0x00, 0xbe, 0xfd, 0x4c, 0xe8,
+ 0x4e, 0xee, 0xbe, 0x09, 0x4d, 0xe8, 0x48, 0xee, 0x81, 0xa6, 0x0a, 0x02,
+ 0xfb, 0x6f, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x89, 0x02,
+ 0x01, 0xc3, 0xc7, 0x86, 0x34, 0x02, 0x05, 0x00, 0x80, 0xbe, 0xfe, 0x00,
+ 0x02, 0x74, 0x1a, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75,
+ 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d,
+ 0x01, 0x01, 0xe8, 0x31, 0x3b, 0x81, 0xa6, 0x0a, 0x02, 0xfb, 0x2f, 0x83,
+ 0x8e, 0x0a, 0x02, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xe8, 0x5e, 0x01,
+ 0xc3, 0x90, 0xc7, 0x86, 0x34, 0x02, 0x01, 0x00, 0xc3, 0x90, 0xc3, 0x53,
+ 0x50, 0x89, 0x86, 0x22, 0x01, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x0f,
+ 0x50, 0xe8, 0x1b, 0xe6, 0xe8, 0xb1, 0x26, 0xc6, 0x46, 0x07, 0x00, 0x58,
+ 0xe9, 0xea, 0x00, 0xf6, 0x86, 0x08, 0x01, 0x01, 0x74, 0x05, 0xe8, 0xfd,
+ 0x27, 0xeb, 0x6c, 0x83, 0xf8, 0x10, 0x75, 0x08, 0x81, 0x8e, 0x1e, 0x01,
+ 0x00, 0x80, 0xeb, 0x5f, 0x83, 0x8e, 0x1e, 0x01, 0x02, 0x8b, 0x9e, 0x0a,
+ 0x02, 0x83, 0xf8, 0x01, 0x75, 0x04, 0x81, 0xcb, 0x00, 0x04, 0x83, 0xf8,
+ 0x0c, 0x75, 0x04, 0x81, 0xcb, 0x00, 0x08, 0x83, 0xf8, 0x0b, 0x75, 0x03,
+ 0x83, 0xcb, 0x02, 0x83, 0xf8, 0x09, 0x75, 0x03, 0x83, 0xcb, 0x04, 0x83,
+ 0xf8, 0x0a, 0x75, 0x09, 0x81, 0xcb, 0x00, 0x01, 0x83, 0x8e, 0x1e, 0x01,
+ 0x04, 0x83, 0xf8, 0x06, 0x75, 0x03, 0x83, 0xcb, 0x01, 0x83, 0xf8, 0x0f,
+ 0x74, 0x19, 0x83, 0xf8, 0x02, 0x75, 0x03, 0x83, 0xcb, 0x08, 0x83, 0xf8,
+ 0x03, 0x75, 0x03, 0x83, 0xcb, 0x08, 0x89, 0x9e, 0x0a, 0x02, 0xc6, 0x86,
+ 0x89, 0x02, 0x01, 0x8a, 0x4e, 0x06, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x72,
+ 0x2e, 0xf7, 0x86, 0x0a, 0x02, 0x08, 0x00, 0x75, 0x1c, 0x80, 0xf9, 0x48,
+ 0x74, 0x11, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x10, 0x80, 0xf9, 0x44,
+ 0x74, 0x05, 0x80, 0xf9, 0x46, 0x75, 0x06, 0xc6, 0x46, 0x07, 0x4c, 0xeb,
+ 0x44, 0xc6, 0x46, 0x07, 0x12, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0x3a, 0xc6,
+ 0x46, 0x07, 0x12, 0xc6, 0x46, 0x09, 0x1e, 0xf6, 0x86, 0xac, 0x02, 0x01,
+ 0x74, 0x1a, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08,
+ 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01,
+ 0x01, 0xe8, 0x1e, 0x3a, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x02, 0xeb,
+ 0x08, 0xc6, 0x46, 0x07, 0x10, 0xc6, 0x46, 0x09, 0x00, 0x58, 0x5b, 0xc3,
+ 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x40, 0x00, 0x02, 0x00, 0x74, 0x0b,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x40, 0x00, 0xfd, 0xeb, 0x09, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x0e, 0x40, 0x00, 0x02, 0xc3, 0x90, 0xc7, 0x86,
+ 0x32, 0x02, 0x01, 0x00, 0xc3, 0xb9, 0x01, 0x01, 0x38, 0xc8, 0x75, 0x19,
+ 0x8b, 0xb6, 0xf6, 0x00, 0x81, 0xe6, 0x00, 0xc0, 0x81, 0xfe, 0x00, 0x80,
+ 0x75, 0x0b, 0xc6, 0x86, 0x5a, 0x02, 0x01, 0xbe, 0x7f, 0x4c, 0xe8, 0x9f,
+ 0xec, 0xc3, 0xc3, 0x90, 0x50, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x18,
+ 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x05, 0xc6, 0x86, 0xfe, 0x00,
+ 0x01, 0xc6, 0x86, 0x95, 0x02, 0x01, 0xe8, 0xbf, 0xee, 0xe8, 0x02, 0x00,
+ 0x58, 0xc3, 0xc7, 0x86, 0x98, 0x02, 0x00, 0x00, 0xc7, 0x86, 0x9a, 0x02,
+ 0x05, 0x00, 0xb8, 0x05, 0x00, 0xe8, 0x1a, 0x00, 0xc7, 0x86, 0xa2, 0x02,
+ 0x05, 0x00, 0xc3, 0x90, 0xc6, 0x86, 0x95, 0x02, 0x00, 0x06, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x26, 0x40, 0x00, 0xdf, 0x07, 0xc3, 0x90, 0x52, 0x53,
+ 0x51, 0xb9, 0x10, 0x27, 0x83, 0xe0, 0x3f, 0x8b, 0xd0, 0xe5, 0x00, 0x50,
+ 0x8b, 0x1e, 0xcc, 0x5d, 0x53, 0xb8, 0xe7, 0x03, 0xf7, 0xe2, 0xf7, 0xf1,
+ 0x5b, 0x03, 0xd8, 0x58, 0x03, 0xc2, 0x3b, 0xc1, 0x72, 0x03, 0x2b, 0xc1,
+ 0x43, 0x8b, 0xcb, 0x41, 0x89, 0x9e, 0x9c, 0x02, 0x89, 0x8e, 0x9e, 0x02,
+ 0x89, 0x86, 0xa0, 0x02, 0x59, 0x5b, 0x5a, 0xc3, 0xa1, 0xcc, 0x5d, 0x3b,
+ 0x86, 0x9e, 0x02, 0x74, 0x0e, 0x3b, 0x86, 0x9c, 0x02, 0x75, 0x0d, 0xe5,
+ 0x00, 0x3b, 0x86, 0xa0, 0x02, 0x72, 0x05, 0xb8, 0x01, 0x00, 0xeb, 0x02,
+ 0x2b, 0xc0, 0x85, 0xc0, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x04, 0x74, 0x0a,
+ 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x75, 0x02, 0xeb, 0x05, 0xb8, 0x01,
+ 0x00, 0xeb, 0x02, 0x2b, 0xc0, 0x85, 0xc0, 0xc3, 0xe8, 0xc1, 0xff, 0x74,
+ 0x1e, 0xb8, 0x02, 0x00, 0xe8, 0x7f, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x54, 0x00, 0x25, 0x24, 0x01, 0x8b, 0xd8, 0x33, 0x86, 0x98, 0x02, 0x75,
+ 0x0a, 0xff, 0x8e, 0xa2, 0x02, 0x74, 0x02, 0xeb, 0x75, 0xeb, 0x23, 0xc7,
+ 0x86, 0xa2, 0x02, 0x05, 0x00, 0x89, 0x9e, 0x98, 0x02, 0xa9, 0x04, 0x00,
+ 0x74, 0x12, 0xf7, 0xc3, 0x04, 0x00, 0x74, 0x07, 0xc6, 0x86, 0x96, 0x02,
+ 0x01, 0xeb, 0x05, 0xc6, 0x86, 0x96, 0x02, 0x00, 0xeb, 0x50, 0x8b, 0x86,
+ 0x98, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x40, 0x00, 0x02, 0x00,
+ 0x74, 0x23, 0x25, 0x04, 0x01, 0x3d, 0x04, 0x01, 0x75, 0x38, 0xe8, 0x81,
+ 0xff, 0x74, 0x2a, 0xc6, 0x86, 0xfe, 0x00, 0x01, 0xe8, 0xa9, 0xed, 0xc7,
+ 0x86, 0x98, 0x02, 0x00, 0x00, 0xb8, 0x05, 0x00, 0xe8, 0x0f, 0xff, 0xeb,
+ 0x1d, 0x25, 0x24, 0x01, 0x3d, 0x24, 0x01, 0x75, 0x15, 0xe8, 0x5e, 0xff,
+ 0x74, 0x07, 0xc6, 0x86, 0xfe, 0x00, 0x00, 0xeb, 0xdb, 0xe8, 0xe4, 0xfe,
+ 0xb8, 0x0e, 0x00, 0xe8, 0x4d, 0xfd, 0xc3, 0x90, 0x55, 0x1e, 0x06, 0x33,
+ 0xed, 0x8e, 0xdd, 0x8b, 0x2e, 0xea, 0x5d, 0x8e, 0x46, 0x02, 0xeb, 0x00,
+ 0x60, 0xfa, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x44, 0x00, 0x89, 0x86, 0x18,
+ 0x01, 0xc7, 0x86, 0x1c, 0x01, 0x01, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x46, 0x00, 0x89, 0x86, 0x1a, 0x01, 0xb8, 0x07, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0xa3, 0x46, 0x00, 0xb8, 0xff, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa3,
+ 0x44, 0x00, 0xfb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x48, 0x00, 0x8b, 0xd8,
+ 0x81, 0xe3, 0xff, 0xfc, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x48, 0x00,
+ 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x4a, 0x00, 0x8e, 0x46, 0x02, 0x26,
+ 0x89, 0x1e, 0x4a, 0x00, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0xa9, 0x00,
+ 0x08, 0x74, 0x0f, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x05, 0xe8, 0x6b,
+ 0x36, 0xeb, 0x03, 0xe8, 0xe8, 0x30, 0xa9, 0x00, 0x01, 0x75, 0x22, 0xf7,
+ 0x86, 0xa8, 0x02, 0x01, 0x00, 0x75, 0x21, 0xa9, 0xcd, 0x01, 0x74, 0x1c,
+ 0x80, 0xbe, 0x6a, 0x01, 0x0a, 0x72, 0x0e, 0xc7, 0x86, 0xa8, 0x02, 0x01,
+ 0x00, 0x81, 0x8e, 0x18, 0x01, 0xcd, 0x00, 0xeb, 0x07, 0xfe, 0x86, 0x6a,
+ 0x01, 0xe8, 0xec, 0x32, 0xa9, 0x00, 0x04, 0x74, 0x29, 0xf7, 0x86, 0x0a,
+ 0x01, 0x01, 0x00, 0x75, 0x21, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x44,
+ 0x00, 0x00, 0x04, 0xe8, 0x8b, 0xe8, 0xc7, 0x44, 0x02, 0x01, 0x00, 0x89,
+ 0x44, 0x04, 0xc7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0x8d, 0x7e, 0x16, 0xe8,
+ 0x95, 0xe8, 0xa9, 0x00, 0x10, 0x74, 0x27, 0x80, 0xbe, 0x0c, 0x01, 0x01,
+ 0x74, 0x20, 0xf6, 0x86, 0xb8, 0x01, 0x01, 0x75, 0x19, 0xe8, 0x61, 0xe8,
+ 0xf7, 0xc6, 0xff, 0xff, 0x74, 0x10, 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6,
+ 0x86, 0xb8, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x69, 0xe8, 0xa9, 0x00,
+ 0x20, 0x74, 0x61, 0x80, 0xbe, 0x0c, 0x01, 0x01, 0x75, 0x07, 0xc6, 0x86,
+ 0x0d, 0x01, 0x01, 0xeb, 0x53, 0x50, 0x26, 0xa1, 0x78, 0x00, 0x26, 0x8b,
+ 0x1e, 0x70, 0x00, 0x3b, 0xc3, 0x77, 0x10, 0x2b, 0x86, 0xa8, 0x15, 0x8b,
+ 0xc8, 0x8b, 0x86, 0xaa, 0x15, 0x2b, 0xc3, 0x03, 0xc1, 0xeb, 0x02, 0x2b,
+ 0xc3, 0x3d, 0x00, 0x02, 0x77, 0x0d, 0xe8, 0xe9, 0xef, 0xc6, 0x86, 0xbc,
+ 0x01, 0x01, 0x83, 0x8e, 0xe6, 0x02, 0x40, 0x58, 0xf6, 0x86, 0xb9, 0x01,
+ 0x01, 0x75, 0x19, 0xe8, 0xfb, 0xe7, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0x10,
+ 0xc7, 0x44, 0x02, 0x04, 0x00, 0xc6, 0x86, 0xb9, 0x01, 0x01, 0x8d, 0x7e,
+ 0x16, 0xe8, 0x03, 0xe8, 0xfa, 0x8b, 0x86, 0x18, 0x01, 0x8e, 0x46, 0x02,
+ 0x26, 0xa3, 0x44, 0x00, 0xc7, 0x86, 0x1c, 0x01, 0x00, 0x00, 0x8b, 0x86,
+ 0x1a, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x46, 0x00, 0x61, 0x07, 0x1f,
+ 0x5d, 0xcf, 0x50, 0x25, 0x00, 0x02, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x48,
+ 0x00, 0x8b, 0x86, 0xcc, 0x02, 0x40, 0x89, 0x86, 0xcc, 0x02, 0x83, 0xf8,
+ 0x01, 0x75, 0x08, 0x56, 0xbe, 0xd3, 0x4c, 0xe8, 0x8a, 0xe9, 0x5e, 0x3b,
+ 0x86, 0xc8, 0x01, 0x76, 0x0a, 0x80, 0xbe, 0x65, 0x02, 0x01, 0x74, 0x03,
+ 0xe8, 0xc1, 0x32, 0x58, 0xc3, 0x8d, 0x71, 0x18, 0x8b, 0x49, 0x14, 0x86,
+ 0xcd, 0x83, 0xe9, 0x04, 0x7e, 0x1b, 0x33, 0xc0, 0x03, 0xf0, 0x8a, 0x04,
+ 0x0a, 0xc0, 0x74, 0x11, 0x3a, 0x54, 0x01, 0x74, 0x17, 0x32, 0xe4, 0x3c,
+ 0xff, 0x74, 0x0a, 0x2b, 0xc8, 0x72, 0x02, 0x77, 0xe7, 0x33, 0xc0, 0xf9,
+ 0xc3, 0x8b, 0x44, 0x02, 0x86, 0xc4, 0xeb, 0xef, 0x0a, 0xe4, 0x75, 0xf1,
+ 0x38, 0xf0, 0x75, 0xed, 0x8d, 0x74, 0x02, 0xf8, 0xc3, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0x8b, 0xb6, 0xa8, 0x15, 0x8b, 0xbe, 0xaa, 0x15, 0x47, 0xa5, 0xa5,
+ 0xa5, 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x07, 0x80, 0xe1, 0xfe, 0x8b, 0xc7,
+ 0x2b, 0xc3, 0x2b, 0xc8, 0x76, 0x0a, 0x81, 0xf9, 0x00, 0x01, 0x73, 0x09,
+ 0xd1, 0xe9, 0xf3, 0xa5, 0x8b, 0x07, 0xe9, 0xd1, 0x01, 0xb9, 0x19, 0x00,
+ 0xf3, 0xa5, 0x33, 0xff, 0xf6, 0x47, 0x0e, 0x80, 0x74, 0x0e, 0x8b, 0x47,
+ 0x14, 0x83, 0xe0, 0x1f, 0x74, 0x0f, 0xa8, 0x01, 0x75, 0x0b, 0x8b, 0xf8,
+ 0xba, 0x80, 0x09, 0x68, 0x45, 0x29, 0xe9, 0xa3, 0x05, 0xe9, 0xd9, 0x02,
+ 0xc3, 0x80, 0x7f, 0x17, 0x02, 0x75, 0xf9, 0x50, 0x56, 0x8b, 0xb6, 0x1a,
+ 0x06, 0x8b, 0x04, 0x5e, 0x3b, 0x86, 0xc6, 0x01, 0x74, 0x07, 0x89, 0x86,
+ 0xc6, 0x01, 0x58, 0xeb, 0x3d, 0x58, 0xeb, 0x12, 0x8a, 0x4f, 0x07, 0x80,
+ 0xe1, 0x3f, 0x74, 0xd8, 0x8a, 0xe9, 0x86, 0x8e, 0xfe, 0x01, 0x38, 0xcd,
+ 0x75, 0x18, 0x57, 0x51, 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0x8c,
+ 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x06, 0x59, 0x5f,
+ 0xeb, 0xb6, 0x57, 0x51, 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0xb9,
+ 0x03, 0x00, 0xf3, 0xa5, 0x59, 0x5f, 0xeb, 0x0d, 0x8b, 0x7e, 0x04, 0x58,
+ 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00, 0x74, 0xf7, 0x80, 0x7e, 0x06,
+ 0x0e, 0x74, 0x08, 0x80, 0x7e, 0x06, 0x48, 0x74, 0x02, 0xeb, 0xe9, 0x50,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0x07, 0xa9, 0x00, 0x40, 0x75, 0xdc, 0x0d,
+ 0x00, 0x40, 0x89, 0x07, 0xe8, 0x8a, 0x00, 0x8b, 0x4f, 0x04, 0x83, 0xc1,
+ 0x03, 0x80, 0xe1, 0xfe, 0x89, 0x7e, 0x04, 0x8b, 0xbe, 0xc2, 0x01, 0x3b,
+ 0xfe, 0x72, 0x11, 0x8d, 0x86, 0xa8, 0x08, 0x05, 0xff, 0x00, 0x2b, 0xc7,
+ 0x3b, 0xc1, 0x7d, 0x0a, 0x8d, 0xbe, 0xa8, 0x08, 0x2b, 0xf7, 0x3b, 0xf1,
+ 0x7c, 0xa6, 0x8b, 0xd7, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8b, 0xf3,
+ 0xd1, 0xe9, 0x83, 0xc7, 0x02, 0x49, 0xad, 0xf3, 0xa5, 0x8b, 0xcf, 0xc7,
+ 0x05, 0x00, 0x00, 0x8b, 0xfa, 0x89, 0x4d, 0x02, 0x51, 0x8b, 0x4d, 0x04,
+ 0x83, 0xe9, 0x04, 0x89, 0x4d, 0x04, 0x59, 0x89, 0x05, 0x8d, 0x86, 0xa8,
+ 0x08, 0x3b, 0xf8, 0x75, 0x0e, 0x8b, 0x86, 0xc0, 0x01, 0x3b, 0x86, 0xc2,
+ 0x01, 0x75, 0x1c, 0x89, 0xbe, 0xc0, 0x01, 0x89, 0x8e, 0xc2, 0x01, 0x8b,
+ 0x7e, 0x04, 0xc7, 0x86, 0xc4, 0x01, 0x00, 0x00, 0xb9, 0x40, 0x60, 0x8e,
+ 0xc1, 0xe8, 0x2b, 0x23, 0xe9, 0x4d, 0xff, 0x97, 0x89, 0x45, 0x02, 0xeb,
+ 0xe2, 0x8b, 0xb6, 0xc0, 0x01, 0xf7, 0x86, 0xc4, 0x01, 0x01, 0x00, 0x75,
+ 0x0f, 0x81, 0x3c, 0x00, 0x80, 0x75, 0x05, 0x8b, 0x74, 0x02, 0xeb, 0xf5,
+ 0x89, 0xb6, 0xc0, 0x01, 0xc3, 0xf7, 0x07, 0x01, 0x09, 0x74, 0x03, 0xe9,
+ 0x9f, 0x01, 0xf7, 0x07, 0x00, 0x10, 0x75, 0x34, 0x68, 0x16, 0x28, 0xe9,
+ 0x0e, 0x27, 0xa8, 0x02, 0x74, 0x22, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x1c,
+ 0x80, 0xbe, 0x62, 0x02, 0x00, 0x74, 0x15, 0x24, 0x28, 0x3c, 0x28, 0x75,
+ 0x0f, 0xf6, 0x47, 0x0e, 0x80, 0x75, 0x64, 0x81, 0x8e, 0xe6, 0x02, 0x80,
+ 0x00, 0xeb, 0x5c, 0x90, 0xeb, 0x59, 0xe9, 0x38, 0xfe, 0x90, 0xeb, 0xd2,
+ 0xeb, 0x34, 0x8b, 0x47, 0x14, 0x83, 0xe0, 0x1f, 0x74, 0x06, 0xa8, 0x01,
+ 0x8b, 0xf8, 0x74, 0x4b, 0xe9, 0x52, 0x01, 0x50, 0x8b, 0x9e, 0xb2, 0x01,
+ 0x8b, 0x07, 0xa9, 0x00, 0x80, 0x75, 0x02, 0x58, 0xc3, 0xa9, 0x00, 0x20,
+ 0x74, 0x0b, 0xff, 0x86, 0x40, 0x02, 0x8b, 0x4f, 0x04, 0x01, 0x8e, 0x42,
+ 0x02, 0xe8, 0xd0, 0x03, 0x75, 0xc4, 0xf7, 0x86, 0xb6, 0x01, 0x00, 0x02,
+ 0x75, 0x11, 0xa9, 0x01, 0x09, 0x75, 0x40, 0x80, 0x7e, 0x07, 0x10, 0x74,
+ 0x3a, 0x80, 0x7e, 0x07, 0x12, 0x74, 0x34, 0xa8, 0x28, 0x75, 0xab, 0x33,
+ 0xff, 0xf6, 0x47, 0x0e, 0x80, 0x75, 0xa7, 0x8b, 0x47, 0x04, 0x83, 0xf8,
+ 0x12, 0x77, 0x05, 0x33, 0xc0, 0xe9, 0xd7, 0x01, 0x83, 0xe8, 0x12, 0x2b,
+ 0xc7, 0x83, 0xf8, 0x04, 0x7c, 0x38, 0x8b, 0x49, 0x16, 0x88, 0xae, 0x08,
+ 0x02, 0x51, 0x80, 0xe1, 0xf0, 0x80, 0xf9, 0x00, 0x74, 0x04, 0x59, 0xe9,
+ 0xdf, 0x00, 0x59, 0x0b, 0xff, 0x74, 0x0f, 0xf6, 0xc1, 0x0f, 0x74, 0xf3,
+ 0x80, 0xf9, 0x33, 0x74, 0xee, 0x80, 0xf9, 0x03, 0x74, 0xe9, 0x86, 0xc4,
+ 0x39, 0x41, 0x14, 0x86, 0xc4, 0x75, 0x03, 0xeb, 0x0d, 0x90, 0xe9, 0x91,
+ 0x01, 0x90, 0xe9, 0x92, 0x01, 0x90, 0xe9, 0x9a, 0x01, 0x90, 0xf6, 0x86,
+ 0x95, 0x02, 0x01, 0x74, 0x11, 0xe8, 0x50, 0xfa, 0x80, 0x7e, 0x06, 0x04,
+ 0x75, 0x08, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0xe2, 0xe8, 0xf6, 0x86,
+ 0x97, 0x02, 0x01, 0x74, 0x28, 0xc6, 0x86, 0x97, 0x02, 0x00, 0xf7, 0x86,
+ 0xf8, 0x00, 0x00, 0x01, 0x74, 0x09, 0x80, 0xbe, 0xfe, 0x00, 0x01, 0x74,
+ 0x14, 0xeb, 0x07, 0x80, 0xbe, 0xfe, 0x00, 0x00, 0x74, 0x0b, 0xb8, 0x0e,
+ 0x00, 0xe8, 0x87, 0xf8, 0xeb, 0x6f, 0xe9, 0x52, 0x01, 0x80, 0xfd, 0x17,
+ 0x77, 0x11, 0x80, 0xfd, 0x01, 0x74, 0xab, 0x80, 0xfd, 0x09, 0x74, 0xa6,
+ 0x80, 0xfd, 0x0a, 0x74, 0xa1, 0xeb, 0x12, 0x80, 0xfd, 0x20, 0x72, 0xe2,
+ 0x80, 0xfd, 0x29, 0x77, 0xdd, 0x80, 0xfd, 0x21, 0x74, 0xd8, 0xe9, 0x62,
+ 0xff, 0x80, 0xfd, 0x10, 0x76, 0x02, 0xeb, 0x05, 0x80, 0xfd, 0x0e, 0x73,
+ 0x1d, 0x53, 0x8b, 0xd9, 0xc1, 0xeb, 0x08, 0x80, 0xe1, 0x0f, 0x3a, 0x8f,
+ 0x78, 0x04, 0x74, 0x23, 0x83, 0xfb, 0x0b, 0x74, 0x19, 0x83, 0xfb, 0x0c,
+ 0x74, 0x14, 0x5b, 0xe9, 0xfa, 0x00, 0x80, 0xe1, 0x0f, 0x80, 0xf9, 0x00,
+ 0x74, 0xf5, 0x80, 0xf9, 0x03, 0x74, 0xf0, 0xe9, 0xa1, 0x01, 0x80, 0xf9,
+ 0x08, 0x75, 0xe7, 0x5b, 0xe9, 0x98, 0x01, 0x5b, 0x5f, 0x8b, 0x9e, 0xb2,
+ 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00, 0x74, 0x28, 0x80, 0x7e, 0x06,
+ 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x1c, 0xf7, 0x86, 0x12,
+ 0x01, 0x00, 0x08, 0x74, 0x06, 0x68, 0x79, 0x29, 0xe9, 0x21, 0xfd, 0xf7,
+ 0x86, 0x12, 0x01, 0x80, 0x00, 0x74, 0x06, 0x68, 0x79, 0x29, 0xe9, 0xf4,
+ 0xfc, 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xb2, 0x01, 0x8b, 0xc3, 0x83, 0xe8,
+ 0x02, 0x3b, 0x86, 0xa8, 0x15, 0x77, 0x04, 0x8b, 0x86, 0xaa, 0x15, 0x8e,
+ 0x46, 0x02, 0x53, 0x26, 0x8b, 0x1e, 0x78, 0x00, 0x81, 0x7f, 0xfc, 0xde,
+ 0xad, 0x75, 0x07, 0x81, 0x7f, 0xfe, 0xbe, 0xaf, 0x74, 0x05, 0xc6, 0x86,
+ 0xbd, 0x01, 0x01, 0x5b, 0x26, 0xa3, 0x78, 0x00, 0x26, 0xa1, 0x78, 0x00,
+ 0x93, 0xc7, 0x47, 0xfc, 0xde, 0xad, 0xc7, 0x47, 0xfe, 0xbe, 0xaf, 0x93,
+ 0xfa, 0x8b, 0x07, 0xa9, 0x00, 0x80, 0x74, 0x17, 0xfb, 0xff, 0x86, 0x3c,
+ 0x01, 0x83, 0xbe, 0x3c, 0x01, 0x05, 0x77, 0x2b, 0x8a, 0x4e, 0x09, 0x3a,
+ 0x4e, 0x08, 0x75, 0x23, 0xe9, 0x22, 0xfe, 0xc6, 0x86, 0xb9, 0x01, 0x00,
+ 0xfb, 0xf6, 0x86, 0xbc, 0x01, 0x01, 0x74, 0x08, 0xc6, 0x86, 0xbc, 0x01,
+ 0x00, 0xe8, 0x2f, 0xeb, 0xc7, 0x86, 0x3c, 0x01, 0x00, 0x00, 0x58, 0xc3,
+ 0xe9, 0x46, 0xff, 0xe8, 0x63, 0xe3, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0xd7,
+ 0xc7, 0x44, 0x02, 0x04, 0x00, 0xc6, 0x86, 0xb9, 0x01, 0x01, 0x8d, 0x7e,
+ 0x16, 0xe8, 0x6b, 0xe3, 0xeb, 0xcb, 0xba, 0x80, 0x02, 0xeb, 0x1d, 0xba,
+ 0x80, 0x01, 0xeb, 0x18, 0xba, 0x80, 0x04, 0xeb, 0x13, 0x5f, 0x5b, 0xf7,
+ 0x86, 0x12, 0x01, 0x00, 0x10, 0x74, 0x06, 0x68, 0x79, 0x29, 0xe9, 0x94,
+ 0xfc, 0xba, 0x80, 0x03, 0x33, 0xc0, 0x8e, 0xc0, 0x68, 0x45, 0x29, 0xe9,
+ 0xc6, 0x01, 0x33, 0xd2, 0x32, 0xed, 0x8a, 0x4d, 0xff, 0x89, 0x55, 0x02,
+ 0x83, 0xc7, 0x05, 0xe2, 0xf8, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x38,
+ 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x0b, 0xc6, 0x46, 0x09, 0x04, 0xc6, 0x86,
+ 0x63, 0x02, 0x00, 0xeb, 0x24, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x21, 0xc6,
+ 0x86, 0x63, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xe8, 0x0c, 0xe7,
+ 0xbe, 0x9d, 0x4c, 0xe8, 0xc6, 0xe4, 0x50, 0x53, 0x33, 0xc0, 0x8e, 0xc0,
+ 0xe8, 0x47, 0x02, 0x5b, 0x58, 0xbb, 0x00, 0x00, 0x8b, 0xf8, 0x8b, 0xf3,
+ 0x5b, 0x57, 0x53, 0x68, 0x43, 0x29, 0xff, 0x66, 0x12, 0xeb, 0x87, 0x8b,
+ 0xc7, 0x8b, 0xbf, 0x90, 0x04, 0x0b, 0xff, 0x78, 0xf4, 0x74, 0xa6, 0x03,
+ 0xfd, 0xf6, 0x45, 0x01, 0x80, 0x75, 0x02, 0xeb, 0x8d, 0xe9, 0x21, 0x01,
+ 0xe9, 0x03, 0x01, 0x5f, 0x5b, 0xba, 0x80, 0x08, 0xe9, 0x75, 0xff, 0x8b,
+ 0x54, 0x02, 0x86, 0xd6, 0x83, 0xc6, 0x02, 0xb0, 0x04, 0xeb, 0x51, 0x5f,
+ 0x5b, 0xba, 0x80, 0x05, 0xe9, 0x61, 0xff, 0x53, 0x8d, 0x71, 0x18, 0x32,
+ 0xff, 0x8a, 0xdd, 0xd1, 0xe3, 0x83, 0xe8, 0x04, 0x0b, 0xc0, 0x74, 0xb7,
+ 0x89, 0x46, 0x04, 0x57, 0x8b, 0xbf, 0x90, 0x04, 0x0b, 0xff, 0x74, 0xc4,
+ 0x79, 0x03, 0xe9, 0x2c, 0xff, 0x03, 0xfd, 0x8e, 0xc7, 0x33, 0xc0, 0x32,
+ 0xed, 0x8a, 0x4d, 0xff, 0x89, 0x45, 0x02, 0x83, 0xc7, 0x05, 0xe2, 0xf8,
+ 0x33, 0xd2, 0x03, 0xf2, 0x8a, 0x4c, 0x01, 0x8a, 0x14, 0x0a, 0xd2, 0x74,
+ 0xb6, 0x80, 0xfa, 0xff, 0x74, 0xa5, 0xb0, 0x02, 0x29, 0x56, 0x04, 0x72,
+ 0xaa, 0x0a, 0xc9, 0x78, 0x92, 0x8a, 0xe1, 0x80, 0xe1, 0x3f, 0x8c, 0xc7,
+ 0x8a, 0x6d, 0xff, 0xeb, 0x12, 0x80, 0x7d, 0x04, 0xff, 0x74, 0x15, 0xeb,
+ 0x92, 0xe9, 0x7b, 0xff, 0xfe, 0xcd, 0x74, 0xf9, 0x83, 0xc7, 0x05, 0x3a,
+ 0x0d, 0x75, 0xf5, 0x3a, 0x55, 0x04, 0x75, 0xe5, 0x8d, 0x44, 0x02, 0x87,
+ 0x45, 0x02, 0x0b, 0xc0, 0x74, 0x09, 0xf6, 0x45, 0x01, 0x80, 0x75, 0xdd,
+ 0x89, 0x45, 0x02, 0x83, 0x7e, 0x04, 0x00, 0x75, 0xa5, 0x33, 0xc0, 0x8c,
+ 0xc6, 0xf6, 0x44, 0x01, 0x80, 0x74, 0x0e, 0x39, 0x44, 0x02, 0x74, 0x60,
+ 0x83, 0xc6, 0x05, 0xf6, 0x44, 0x01, 0x80, 0x75, 0xf2, 0xf6, 0x86, 0x63,
+ 0x02, 0x01, 0x74, 0x36, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x0b, 0xc6, 0x86,
+ 0x63, 0x02, 0x00, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x22, 0x80, 0x7e, 0x08,
+ 0x06, 0x75, 0x1f, 0xc6, 0x86, 0x63, 0x02, 0x00, 0xc6, 0x86, 0x6d, 0x02,
+ 0x01, 0xe8, 0xdc, 0xe5, 0xbe, 0x9d, 0x4c, 0xe8, 0x96, 0xe3, 0x33, 0xc0,
+ 0x8e, 0xc0, 0x53, 0xe8, 0x18, 0x01, 0x5b, 0xbb, 0x00, 0x00, 0x89, 0x5e,
+ 0x04, 0x8b, 0xf3, 0x5f, 0x5b, 0x33, 0xc0, 0x8e, 0xc0, 0x3b, 0xb6, 0xba,
+ 0x01, 0x73, 0x06, 0x68, 0x45, 0x29, 0xff, 0x66, 0x12, 0xe9, 0x69, 0xfd,
+ 0x5f, 0x5b, 0xba, 0x80, 0x07, 0xe9, 0x58, 0xfe, 0x56, 0x57, 0x50, 0x33,
+ 0xc0, 0x8e, 0xc0, 0x8b, 0xb6, 0xa8, 0x15, 0x8b, 0xbe, 0xaa, 0x15, 0x83,
+ 0xc7, 0x01, 0xa5, 0xa5, 0xa5, 0x8b, 0xc3, 0x03, 0x47, 0x04, 0x8b, 0xbe,
+ 0xaa, 0x15, 0x3b, 0xc7, 0x7f, 0x02, 0x32, 0xc0, 0x58, 0x5f, 0x5e, 0xc3,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xf6, 0x41, 0x16, 0x0f, 0x74, 0x60, 0x89, 0x96,
+ 0xee, 0x02, 0x81, 0xfa, 0x80, 0x02, 0x74, 0x13, 0xba, 0x09, 0x04, 0xe8,
+ 0xaf, 0xf9, 0x72, 0x0b, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x18, 0x02, 0x86,
+ 0xe0, 0xeb, 0x06, 0x8b, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xea,
+ 0x02, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x4d, 0x22, 0x57, 0x53, 0xe8, 0x2b,
+ 0x06, 0x5a, 0x5f, 0x72, 0x29, 0x57, 0xe8, 0x26, 0x00, 0xb8, 0x00, 0x0e,
+ 0xab, 0x47, 0xb0, 0x00, 0xaa, 0x8d, 0xb6, 0xe8, 0x02, 0xa5, 0xa5, 0x8d,
+ 0xb6, 0xec, 0x02, 0xa5, 0xa5, 0x55, 0x8b, 0xea, 0x8a, 0x47, 0x16, 0x8a,
+ 0x66, 0x17, 0xab, 0x5d, 0xe8, 0xa1, 0x06, 0x8b, 0xda, 0x5f, 0xc3, 0x55,
+ 0x8b, 0xea, 0x8a, 0x43, 0x16, 0xc0, 0xe0, 0x04, 0x88, 0x41, 0x16, 0xc7,
+ 0x47, 0x06, 0xe0, 0x00, 0x83, 0xe9, 0x06, 0x89, 0x4f, 0x04, 0x0b, 0xff,
+ 0x75, 0x18, 0x8d, 0x76, 0x0e, 0x8d, 0x7f, 0x08, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0xa5, 0xa5, 0xa5, 0x8b, 0xd5, 0x5d, 0x8d, 0xb6, 0x00, 0x03, 0xa5, 0xa5,
+ 0xa5, 0xc3, 0x8b, 0xcf, 0xd1, 0xe9, 0x8d, 0x76, 0x0e, 0x8d, 0x7f, 0x08,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xad, 0x24, 0x7f, 0xab, 0xa5, 0xa5, 0x8b, 0xd5,
+ 0x5d, 0x56, 0x8d, 0xb6, 0x00, 0x03, 0xad, 0x0c, 0x80, 0xab, 0xa5, 0xa5,
+ 0x5e, 0xad, 0x80, 0xcc, 0x80, 0xab, 0x49, 0xf3, 0xa5, 0xc3, 0x8b, 0x86,
+ 0x0c, 0x03, 0x86, 0xe0, 0x89, 0x86, 0x14, 0x02, 0x89, 0x86, 0x06, 0x02,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0xb6, 0x00, 0x03,
+ 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0xb9, 0x2a, 0x00, 0xe8, 0x5f, 0x05, 0x72,
+ 0xd8, 0x8d, 0xb6, 0xf2, 0x02, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1,
+ 0xe9, 0xf3, 0xa5, 0xe9, 0x0d, 0x06, 0xeb, 0x6a, 0xb9, 0x26, 0x00, 0xe8,
+ 0x44, 0x05, 0x72, 0xf6, 0x8d, 0xb6, 0x1c, 0x03, 0x8b, 0xfb, 0x8c, 0xd8,
+ 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xf2, 0x05, 0x8d, 0x7f, 0x08,
+ 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x03, 0x80, 0xe1, 0xfe, 0x57, 0xe8, 0x21,
+ 0x05, 0x5f, 0x8b, 0xd7, 0x72, 0x22, 0x83, 0xe9, 0x08, 0x8d, 0x7f, 0x04,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0xc1, 0xab, 0x8b, 0x86, 0x22, 0x03, 0xab,
+ 0x8b, 0xf2, 0xd1, 0xe9, 0x49, 0xf3, 0xa5, 0xbe, 0x79, 0x4c, 0xe8, 0xef,
+ 0xe1, 0xe9, 0xbb, 0x05, 0xc3, 0xb9, 0x26, 0x00, 0xe8, 0xf3, 0x04, 0x72,
+ 0x11, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xb6, 0x42, 0x03, 0x8b, 0xfb, 0xd1,
+ 0xe9, 0xf3, 0xa5, 0xe9, 0xa1, 0x05, 0xc3, 0xb9, 0x26, 0x00, 0xe8, 0xf3,
+ 0x04, 0x72, 0xf7, 0x8d, 0xb6, 0x68, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xc6, 0x86, 0x67, 0x02, 0x01, 0x80, 0xbe,
+ 0x87, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x74, 0x05, 0x68, 0xc9, 0x31, 0xe9,
+ 0x6e, 0x05, 0xb9, 0x26, 0x00, 0xe8, 0xc8, 0x04, 0x72, 0xcc, 0x8d, 0xb6,
+ 0x8e, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5,
+ 0xc6, 0x86, 0x67, 0x02, 0x01, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0x03,
+ 0xe9, 0x49, 0x05, 0x68, 0xc9, 0x31, 0xe9, 0x43, 0x05, 0xb9, 0x18, 0x00,
+ 0xe8, 0x9d, 0x04, 0x72, 0xa1, 0x8d, 0xb6, 0xb4, 0x03, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x2a, 0x05, 0x83, 0xc1,
+ 0x1c, 0x56, 0x57, 0x52, 0xe8, 0x81, 0x04, 0x5a, 0x5f, 0x5e, 0x72, 0x53,
+ 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x83, 0xe9, 0x08, 0x8b, 0xc1, 0x8d, 0x7f,
+ 0x04, 0xab, 0xba, 0xe0, 0x00, 0x8b, 0xc2, 0xab, 0x8d, 0xb6, 0xd4, 0x03,
+ 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x00, 0x03, 0x80, 0xbe, 0x62, 0x01, 0x01,
+ 0x75, 0x04, 0x8d, 0xb6, 0x00, 0x01, 0xa5, 0xa5, 0xa5, 0x83, 0xe9, 0x0e,
+ 0x80, 0xbe, 0x63, 0x01, 0x02, 0x75, 0x03, 0x83, 0xe9, 0x04, 0x8b, 0xc1,
+ 0x86, 0xe0, 0xab, 0xb8, 0x00, 0x08, 0xab, 0x83, 0xe9, 0x04, 0xb8, 0xff,
+ 0x26, 0xab, 0x8b, 0xc1, 0x86, 0xe0, 0xab, 0x5e, 0xe9, 0xc9, 0x04, 0xeb,
+ 0x69, 0xf6, 0x86, 0x8b, 0x02, 0x01, 0x75, 0x03, 0xe9, 0xfb, 0x04, 0x83,
+ 0xc1, 0x1a, 0x57, 0x52, 0xe8, 0x15, 0x04, 0x5a, 0x5f, 0x72, 0x53, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0x83, 0xe9, 0x08, 0x8b, 0xc1, 0x8d, 0x7f, 0x04, 0xab,
+ 0xb9, 0x07, 0x00, 0x8d, 0xb6, 0xec, 0x03, 0xf3, 0xa5, 0x83, 0xe8, 0x0e,
+ 0x8b, 0xc8, 0x86, 0xe0, 0xab, 0xb8, 0x00, 0x08, 0xab, 0x83, 0xe9, 0x04,
+ 0x8b, 0xc1, 0xb4, 0x26, 0xab, 0xbe, 0x80, 0x03, 0xb9, 0x23, 0x00, 0xf3,
+ 0xa5, 0xc6, 0x86, 0x8b, 0x02, 0x00, 0xe9, 0x77, 0x04, 0xb9, 0x44, 0x00,
+ 0xe8, 0xd1, 0x03, 0x72, 0x11, 0x8d, 0xb6, 0x00, 0x04, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe8, 0x5e, 0x04, 0xc3, 0xb9,
+ 0x36, 0x00, 0xe8, 0xb7, 0x03, 0x72, 0xf7, 0xff, 0x86, 0x56, 0x02, 0x8d,
+ 0xb6, 0xd2, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3,
+ 0xa5, 0x33, 0xc0, 0x8d, 0xbe, 0xec, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe,
+ 0xf4, 0x05, 0xab, 0xab, 0xaa, 0xe9, 0x30, 0x04, 0x8d, 0x4d, 0x3a, 0x57,
+ 0x53, 0xe8, 0x88, 0x03, 0x5a, 0x5f, 0x72, 0x5b, 0x57, 0xe8, 0x83, 0xfd,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x26, 0xab, 0x47, 0xb0, 0x22, 0xaa,
+ 0x8d, 0xb6, 0xe8, 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0x0e, 0x03, 0xa5, 0xa5,
+ 0xa5, 0x8d, 0xb6, 0x14, 0x03, 0xa5, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x44,
+ 0x04, 0xa5, 0xa5, 0x8d, 0xb6, 0x48, 0x04, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6,
+ 0x4e, 0x04, 0xa5, 0x53, 0x8c, 0xdb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x66,
+ 0x00, 0xe8, 0x15, 0xdd, 0x8e, 0xc3, 0xab, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x64, 0x00, 0xe8, 0x08, 0xdd, 0x8e, 0xc3, 0xab, 0x5b, 0xe8, 0xcc, 0x03,
+ 0x8b, 0xda, 0x5f, 0xc3, 0x8d, 0x4d, 0x38, 0x57, 0x53, 0xe8, 0x20, 0x03,
+ 0x5a, 0x5f, 0x72, 0xf3, 0x57, 0xe8, 0x1b, 0xfd, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0xb8, 0x00, 0x24, 0xab, 0x47, 0xb0, 0x23, 0xaa, 0x8d, 0xb6, 0xe8, 0x02,
+ 0xa5, 0xa5, 0x8d, 0xb6, 0x18, 0x04, 0xb9, 0x06, 0x00, 0xf3, 0xa5, 0x8d,
+ 0xb6, 0x5c, 0x04, 0xa5, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x54, 0x04, 0xa5,
+ 0xa5, 0xa5, 0xa5, 0xe8, 0x8a, 0x03, 0x8b, 0xda, 0x5f, 0xc3, 0x8d, 0x4d,
+ 0x3e, 0x57, 0x53, 0xe8, 0xde, 0x02, 0x5a, 0x5f, 0x72, 0x64, 0x57, 0xe8,
+ 0xd9, 0xfc, 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x2a, 0xab, 0x47, 0xb0,
+ 0x24, 0xaa, 0x8d, 0xb6, 0xe8, 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0x2c, 0x04,
+ 0xb9, 0x0a, 0x00, 0xf3, 0xa5, 0x8d, 0xb6, 0x4e, 0x04, 0xa5, 0x53, 0x8c,
+ 0xdb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x66, 0x00, 0xe8, 0x7e, 0xdc, 0x8e,
+ 0xc3, 0xab, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x64, 0x00, 0xe8, 0x71, 0xdc,
+ 0x8e, 0xc3, 0xab, 0x5b, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xb6, 0x64, 0x04,
+ 0xa5, 0x8b, 0x86, 0xfc, 0x01, 0x86, 0xc4, 0xab, 0x8d, 0xb6, 0x68, 0x04,
+ 0xa5, 0x8b, 0x86, 0xfa, 0x01, 0x86, 0xc4, 0xab, 0xe8, 0x19, 0x03, 0x8b,
+ 0xda, 0x5f, 0xc3, 0xb9, 0x3a, 0x00, 0xe8, 0x6f, 0x02, 0x72, 0xf7, 0x8d,
+ 0xb6, 0x6c, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3,
+ 0xa5, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0x03, 0xe9, 0xf5, 0x02, 0x68,
+ 0xc9, 0x31, 0xe9, 0xef, 0x02, 0xb9, 0x26, 0x00, 0xe8, 0x49, 0x02, 0x72,
+ 0xd1, 0xff, 0x86, 0x52, 0x02, 0x8d, 0xb6, 0xa6, 0x04, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x87, 0x02, 0x01,
+ 0x75, 0x03, 0xe9, 0xcb, 0x02, 0x68, 0xc9, 0x31, 0xe9, 0xc5, 0x02, 0xb9,
+ 0x20, 0x00, 0xe8, 0x1f, 0x02, 0x72, 0xa7, 0x8d, 0xb6, 0xf2, 0x01, 0x8d,
+ 0xbe, 0xe6, 0x04, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6,
+ 0xcc, 0x04, 0x8b, 0xfb, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x87, 0x02,
+ 0x01, 0x75, 0x03, 0xe9, 0x9a, 0x02, 0x68, 0xc9, 0x31, 0xe9, 0x94, 0x02,
+ 0x89, 0x86, 0x06, 0x05, 0x86, 0xc4, 0x89, 0x86, 0x12, 0x02, 0xb9, 0x2a,
+ 0x00, 0xe8, 0xe4, 0x01, 0x72, 0x18, 0x8d, 0xb6, 0xec, 0x04, 0x8b, 0xfb,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x87, 0x02,
+ 0x01, 0x75, 0x07, 0xe9, 0x6a, 0x02, 0xe9, 0x5a, 0x01, 0x90, 0x68, 0xc9,
+ 0x31, 0xe9, 0x60, 0x02, 0xb9, 0x18, 0x00, 0xe8, 0xba, 0x01, 0x73, 0x03,
+ 0xe9, 0x3f, 0xff, 0x8d, 0xb6, 0x8a, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x44, 0x02, 0xb9, 0x24, 0x00, 0xe8,
+ 0x9e, 0x01, 0x73, 0x03, 0xe9, 0x23, 0xff, 0x8b, 0x86, 0x34, 0x05, 0x86,
+ 0xc4, 0x89, 0x86, 0x2a, 0x02, 0x8d, 0xb6, 0x16, 0x05, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x1e, 0x02, 0xb9, 0x1c,
+ 0x00, 0xe8, 0x78, 0x01, 0x73, 0x03, 0xe9, 0xfd, 0xfe, 0x8d, 0xb6, 0x3a,
+ 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9,
+ 0x02, 0x02, 0xb9, 0x18, 0x00, 0xe8, 0x5c, 0x01, 0x73, 0x03, 0xe9, 0xe1,
+ 0xfe, 0x8d, 0xb6, 0x56, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1,
+ 0xe9, 0xf3, 0xa5, 0xe9, 0xe6, 0x01, 0xb9, 0x1c, 0x00, 0x50, 0xe8, 0x3f,
+ 0x01, 0x58, 0x73, 0x03, 0xe9, 0xc3, 0xfe, 0x8d, 0xb6, 0x6e, 0x05, 0x8b,
+ 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xc8, 0x01,
+ 0xb9, 0x18, 0x00, 0xe8, 0x22, 0x01, 0x73, 0x03, 0xe9, 0xa7, 0xfe, 0x8d,
+ 0xb6, 0xa2, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3,
+ 0xa5, 0xe9, 0xac, 0x01, 0xb9, 0x18, 0x00, 0xe8, 0x06, 0x01, 0x73, 0x03,
+ 0xe9, 0x8b, 0xfe, 0x8d, 0xb6, 0xba, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x90, 0x01, 0x8b, 0x4f, 0x04, 0x53,
+ 0xe8, 0xe9, 0x00, 0x5e, 0x72, 0x17, 0x89, 0x9e, 0x3c, 0x02, 0x8b, 0xfb,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xc7, 0x86, 0x3e, 0x02,
+ 0x01, 0x00, 0xe9, 0x6f, 0x01, 0xe9, 0x7d, 0x12, 0xb9, 0x18, 0x00, 0xe8,
+ 0xc6, 0x00, 0x8d, 0xb6, 0xb4, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0xd1, 0xe9, 0xf3, 0xa5, 0x33, 0xc0, 0x8d, 0x7f, 0x08, 0xb9, 0x06, 0x00,
+ 0xf3, 0xab, 0xe9, 0x4b, 0x01, 0x53, 0x8b, 0x9e, 0xb0, 0x01, 0x8b, 0xb6,
+ 0xae, 0x01, 0x3b, 0xde, 0x74, 0x15, 0x8a, 0x47, 0x17, 0xf6, 0x44, 0x0e,
+ 0x80, 0x75, 0x0e, 0x38, 0x44, 0x17, 0x75, 0x09, 0x8b, 0x74, 0x02, 0x89,
+ 0xb6, 0xae, 0x01, 0xeb, 0x1a, 0x8b, 0xfe, 0x8b, 0x74, 0x02, 0x3b, 0xde,
+ 0x74, 0x11, 0xf6, 0x44, 0x0e, 0x80, 0x75, 0xf1, 0x38, 0x44, 0x17, 0x75,
+ 0xec, 0x8b, 0x44, 0x02, 0x89, 0x45, 0x02, 0x5b, 0xc3, 0xe8, 0x37, 0xd8,
+ 0xc6, 0x86, 0x87, 0x02, 0x00, 0x8d, 0xb6, 0xa6, 0x01, 0x8d, 0xbe, 0xac,
+ 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x0e, 0x40, 0x00, 0x00, 0x16, 0x8d, 0x9e, 0xa8, 0x12, 0x89, 0x9e,
+ 0xa8, 0x01, 0x89, 0x9e, 0xaa, 0x01, 0xc7, 0x07, 0x30, 0x80, 0xc7, 0x47,
+ 0x04, 0x00, 0x00, 0x83, 0xc3, 0x08, 0x89, 0x9e, 0xa6, 0x01, 0xc6, 0x86,
+ 0x8a, 0x02, 0x01, 0x83, 0xc1, 0x02, 0xeb, 0x4a, 0x8b, 0x9e, 0xac, 0x01,
+ 0x8b, 0xb6, 0xae, 0x01, 0xeb, 0x29, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x74,
+ 0xa8, 0x8d, 0x96, 0xa8, 0x15, 0x8d, 0xbe, 0xa8, 0x12, 0x8b, 0x9e, 0xa6,
+ 0x01, 0x8b, 0xb6, 0xa8, 0x01, 0xeb, 0x18, 0x90, 0x8b, 0x9e, 0xa6, 0x01,
+ 0x8b, 0xb6, 0xa8, 0x01, 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0xcd, 0x8d,
+ 0x96, 0xa8, 0x12, 0x8d, 0xbe, 0xa8, 0x09, 0x83, 0xc1, 0x02, 0x3b, 0xde,
+ 0x73, 0x17, 0x8b, 0xc6, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0x25, 0xc7, 0x07,
+ 0x00, 0x00, 0x83, 0xc3, 0x02, 0xc7, 0x07, 0x00, 0x00, 0x83, 0xe9, 0x02,
+ 0xc3, 0x8b, 0xc2, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xe7, 0x8b,
+ 0xdf, 0x8b, 0xc6, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xdb, 0x3b,
+ 0xb6, 0xae, 0x01, 0x74, 0x11, 0x80, 0xbe, 0x62, 0x02, 0x01, 0x75, 0x05,
+ 0x83, 0x8e, 0xe6, 0x02, 0x02, 0xe8, 0x8e, 0x01, 0xf9, 0xc3, 0x8b, 0x74,
+ 0x02, 0x89, 0xb6, 0xae, 0x01, 0x3b, 0xdd, 0x74, 0x04, 0x3b, 0xde, 0x77,
+ 0xc4, 0x8b, 0xc6, 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0xe9, 0x89, 0xb6, 0xae,
+ 0x01, 0xeb, 0xa7, 0x8b, 0xb6, 0xb0, 0x01, 0x89, 0x5c, 0x02, 0x80, 0x4c,
+ 0x05, 0x80, 0x89, 0x9e, 0xb0, 0x01, 0x03, 0x5f, 0x04, 0x83, 0xc3, 0x06,
+ 0x89, 0x9e, 0xac, 0x01, 0xc6, 0x86, 0x8c, 0x02, 0x01, 0xc3, 0xeb, 0xdf,
+ 0x80, 0xbe, 0x87, 0x02, 0x01, 0x75, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x4c, 0x00, 0x0c, 0x02, 0x80, 0xbe, 0x8a, 0x02, 0x01, 0x74, 0x45, 0x8b,
+ 0xb6, 0xaa, 0x01, 0x89, 0x5c, 0x02, 0x80, 0x4c, 0x05, 0x80, 0x83, 0xc8,
+ 0x04, 0x25, 0xff, 0xf7, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x4c, 0x00, 0x89,
+ 0x9e, 0xaa, 0x01, 0x03, 0x5f, 0x04, 0x83, 0xc3, 0x06, 0x89, 0x9e, 0xa6,
+ 0x01, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x4c, 0x00, 0x0c, 0x02, 0x8b,
+ 0x9e, 0xaa, 0x01, 0xc7, 0x07, 0x00, 0x00, 0x26, 0x89, 0x1e, 0x6c, 0x00,
+ 0x83, 0xc8, 0x08, 0x25, 0xff, 0xf7, 0xeb, 0xcc, 0x8e, 0x46, 0x02, 0x89,
+ 0x9e, 0xa8, 0x01, 0x26, 0x89, 0x1e, 0x6c, 0x00, 0x83, 0xc8, 0x08, 0x25,
+ 0xff, 0xf7, 0xc6, 0x86, 0x8a, 0x02, 0x00, 0xeb, 0xb3, 0x53, 0xf6, 0x86,
+ 0x87, 0x02, 0x01, 0x74, 0x13, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c,
+ 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xe8, 0x65, 0xfe,
+ 0x5b, 0xc3, 0xe9, 0xb8, 0x00, 0x90, 0x80, 0xbe, 0x87, 0x02, 0x00, 0x75,
+ 0xf5, 0x50, 0xfa, 0x8d, 0xb6, 0xac, 0x01, 0x8d, 0xbe, 0xa6, 0x01, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x80, 0xbe, 0x63, 0x01, 0x01, 0x75,
+ 0x16, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x02, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00, 0xff, 0xe3, 0xeb, 0x27, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x02, 0xf6, 0x86, 0xaf,
+ 0x02, 0x01, 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00,
+ 0x00, 0x1c, 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x40, 0x00,
+ 0xff, 0xe3, 0x33, 0xc0, 0x89, 0x86, 0xae, 0x01, 0x40, 0x88, 0x86, 0x87,
+ 0x02, 0x58, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x0a, 0xe8, 0x21, 0xe0,
+ 0x8e, 0x46, 0x02, 0x26, 0xa2, 0x5c, 0x00, 0x8b, 0x9e, 0xa8, 0x01, 0x83,
+ 0x3f, 0x00, 0x74, 0x0f, 0xf7, 0x07, 0x20, 0x00, 0x75, 0x06, 0xc7, 0x07,
+ 0x00, 0x00, 0xeb, 0x03, 0xe8, 0x90, 0x00, 0xf6, 0x86, 0x8c, 0x02, 0x01,
+ 0x74, 0x19, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x6c, 0x00, 0xc6, 0x86,
+ 0x8c, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x08,
+ 0xfb, 0xeb, 0x06, 0xc6, 0x86, 0x8a, 0x02, 0x01, 0xfb, 0xc3, 0x56, 0x8d,
+ 0xb6, 0xa8, 0x09, 0xc7, 0x86, 0xa6, 0x01, 0xb0, 0x09, 0x01, 0xae, 0xa6,
+ 0x01, 0x89, 0xb6, 0xa8, 0x01, 0x89, 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30,
+ 0x80, 0xc7, 0x44, 0x04, 0x00, 0x00, 0xc6, 0x86, 0x8a, 0x02, 0x01, 0x5e,
+ 0xc3, 0xff, 0xa4, 0x22, 0x04, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x32,
+ 0x80, 0x7e, 0x06, 0x46, 0x75, 0x1c, 0xf6, 0x86, 0x7a, 0x02, 0x01, 0x74,
+ 0x15, 0xff, 0x8e, 0xd6, 0x02, 0x75, 0x0f, 0xc6, 0x86, 0x7a, 0x02, 0x00,
+ 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0xd8, 0xdc, 0xeb, 0x10, 0x83, 0xfe,
+ 0x10, 0x74, 0x07, 0x83, 0xfe, 0x0e, 0x74, 0x02, 0xeb, 0x04, 0xff, 0xa4,
+ 0x22, 0x04, 0xc3, 0x8b, 0x9e, 0xa8, 0x01, 0x8b, 0x07, 0xfb, 0xa9, 0x10,
+ 0x00, 0x74, 0x6c, 0xa9, 0x00, 0x80, 0x75, 0x46, 0x8b, 0x77, 0x17, 0x81,
+ 0xe6, 0xff, 0x00, 0xf7, 0x86, 0x3e, 0x02, 0x01, 0x00, 0x74, 0x1b, 0x3b,
+ 0x9e, 0x3c, 0x02, 0x75, 0x15, 0x89, 0x86, 0xcc, 0x15, 0x50, 0x53, 0x56,
+ 0xe8, 0x2e, 0x0f, 0x5e, 0x5b, 0x58, 0xc7, 0x86, 0x3e, 0x02, 0x00, 0x00,
+ 0xeb, 0x18, 0xf7, 0x46, 0x14, 0xff, 0xff, 0x74, 0x11, 0x83, 0xfe, 0x2a,
+ 0x77, 0x0c, 0xd1, 0xe6, 0x68, 0x1a, 0x35, 0xff, 0x66, 0x14, 0x5b, 0x83,
+ 0xc4, 0x02, 0x81, 0x0f, 0x00, 0x80, 0xfa, 0xf6, 0x47, 0x05, 0x80, 0x74,
+ 0x1a, 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xa8, 0x01, 0xf7, 0x07, 0x10, 0x00,
+ 0x74, 0x0d, 0xff, 0x86, 0x3a, 0x01, 0x83, 0xbe, 0x3a, 0x01, 0x06, 0x77,
+ 0x0f, 0xeb, 0x8c, 0xc6, 0x86, 0xb8, 0x01, 0x00, 0xc7, 0x86, 0x3a, 0x01,
+ 0x00, 0x00, 0xfb, 0xc3, 0xe8, 0x16, 0xd8, 0xf7, 0xc6, 0xff, 0xff, 0x74,
+ 0xea, 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6, 0x86, 0xb8, 0x01, 0x01, 0x8d,
+ 0x7e, 0x16, 0xe8, 0x1e, 0xd8, 0xeb, 0xdd, 0xa9, 0x20, 0x00, 0x75, 0x74,
+ 0xf7, 0x47, 0x04, 0x00, 0x80, 0x74, 0x05, 0xe8, 0x08, 0x00, 0x72, 0x9f,
+ 0x53, 0x68, 0x16, 0x35, 0xff, 0xe6, 0x8a, 0x47, 0x17, 0x8b, 0xfb, 0x8b,
+ 0x7d, 0x02, 0x38, 0x45, 0x17, 0x74, 0x09, 0xf7, 0x45, 0x04, 0x00, 0x80,
+ 0x75, 0xf1, 0xf8, 0xc3, 0xf9, 0xc3, 0xa9, 0x20, 0x00, 0x75, 0x05, 0xa9,
+ 0x00, 0x10, 0x75, 0x0c, 0x33, 0xc9, 0xa9, 0x05, 0x00, 0x75, 0x0a, 0xa9,
+ 0x0a, 0x04, 0x74, 0x05, 0x8b, 0x0d, 0xe3, 0x01, 0x49, 0x89, 0x0d, 0xc3,
+ 0x53, 0x8b, 0x4f, 0x04, 0x80, 0xe5, 0x7f, 0x89, 0x4f, 0x04, 0x83, 0xc1,
+ 0x06, 0xe8, 0xb0, 0xfc, 0x72, 0x19, 0x5e, 0x56, 0x8b, 0xfb, 0xd1, 0xe9,
+ 0x83, 0xe9, 0x02, 0x83, 0xc6, 0x04, 0x83, 0xc7, 0x04, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xf3, 0xa5, 0xe8, 0x36, 0xfd, 0xf8, 0x5b, 0xc3, 0x80, 0x7e, 0x08,
+ 0x02, 0x75, 0x0b, 0xa9, 0x20, 0x00, 0x75, 0x06, 0xc7, 0x86, 0xcc, 0x01,
+ 0x01, 0x00, 0xc3, 0x8a, 0x56, 0x06, 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80,
+ 0xfa, 0x44, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x18, 0x80, 0xfa,
+ 0x0c, 0x74, 0x07, 0x80, 0xfa, 0x0e, 0x74, 0x02, 0xeb, 0x0b, 0xa9, 0x20,
+ 0x00, 0x75, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0x3e, 0xeb, 0xc3, 0xb9, 0x06,
+ 0x00, 0xa9, 0x20, 0x00, 0x74, 0x09, 0xb9, 0x08, 0x00, 0xa9, 0x0f, 0x00,
+ 0x75, 0x01, 0xc3, 0xff, 0x86, 0xce, 0x02, 0x83, 0xbe, 0xce, 0x02, 0x02,
+ 0x72, 0x06, 0x8b, 0xc1, 0xe8, 0x1c, 0xeb, 0xc3, 0x53, 0xe8, 0x8d, 0xf7,
+ 0x5b, 0xc3, 0x53, 0x68, 0x16, 0x35, 0xe9, 0x50, 0xf8, 0x80, 0x7e, 0x06,
+ 0x0c, 0x75, 0x1d, 0xa9, 0x00, 0x10, 0x75, 0xee, 0xa9, 0x20, 0x00, 0x74,
+ 0xe9, 0xa8, 0x0a, 0x75, 0x10, 0xff, 0x86, 0xc4, 0x02, 0x83, 0xbe, 0xc4,
+ 0x02, 0x04, 0x72, 0xda, 0xc6, 0x46, 0x07, 0x0e, 0xc3, 0x83, 0xbe, 0xc2,
+ 0x02, 0x04, 0x73, 0xf8, 0xbe, 0xa9, 0x4c, 0xe8, 0xce, 0xd8, 0xeb, 0xf0,
+ 0x8d, 0xbe, 0xc8, 0x02, 0xe8, 0x0f, 0xff, 0x0b, 0xc9, 0x74, 0xe5, 0x53,
+ 0x68, 0x16, 0x35, 0xe9, 0x0b, 0xf8, 0x8d, 0xbe, 0xc0, 0x02, 0xe8, 0xfd,
+ 0xfe, 0x0b, 0xc9, 0x74, 0x03, 0xe9, 0x14, 0xff, 0xc3, 0x53, 0x8a, 0x56,
+ 0x06, 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80, 0xfa, 0x44, 0x74, 0x12, 0x80,
+ 0x7e, 0x08, 0x08, 0x75, 0x34, 0x80, 0xfa, 0x0c, 0x74, 0x07, 0x80, 0xfa,
+ 0x0e, 0x74, 0x02, 0xeb, 0x28, 0xa9, 0x20, 0x00, 0x74, 0x25, 0x80, 0xbe,
+ 0xfe, 0x00, 0x02, 0x74, 0x1c, 0x8b, 0x96, 0x66, 0x01, 0x4a, 0x89, 0x96,
+ 0x66, 0x01, 0x83, 0xfa, 0x01, 0x77, 0x1b, 0xbe, 0x91, 0x4c, 0xe8, 0x6b,
+ 0xd8, 0xc6, 0x86, 0x8a, 0x02, 0x01, 0xe8, 0xe8, 0xf6, 0x5b, 0xc3, 0xfe,
+ 0x8e, 0x68, 0x01, 0x75, 0x05, 0xe8, 0x44, 0x20, 0xeb, 0xf3, 0xbe, 0x91,
+ 0x4c, 0xe8, 0x50, 0xd8, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6,
+ 0x86, 0x8a, 0x02, 0x01, 0xfa, 0xe8, 0xde, 0xf6, 0xeb, 0xdb, 0xa9, 0x20,
+ 0x00, 0x74, 0x41, 0xa9, 0x0f, 0x00, 0x75, 0x25, 0xc6, 0x86, 0x69, 0x02,
+ 0x01, 0xc6, 0x86, 0x6a, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xf2, 0x01, 0xab, 0xab, 0xab, 0x8b, 0x86,
+ 0x0a, 0x02, 0x83, 0x8e, 0x0a, 0x02, 0x40, 0xeb, 0x17, 0x8d, 0x77, 0x0e,
+ 0x8d, 0xbe, 0xf2, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8b,
+ 0x86, 0x0a, 0x02, 0x83, 0xa6, 0x0a, 0x02, 0xbf, 0x33, 0x86, 0x0a, 0x02,
+ 0x74, 0x05, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc3, 0xfb, 0xc3, 0xff, 0xa4,
+ 0xc6, 0x03, 0x53, 0x56, 0x8b, 0xc7, 0xf7, 0x07, 0x00, 0x10, 0x75, 0x18,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xd4, 0x01, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9,
+ 0x03, 0x00, 0xf3, 0xa7, 0x8b, 0xf8, 0x75, 0x0c, 0x81, 0x0f, 0x00, 0x10,
+ 0x80, 0x7e, 0x06, 0x44, 0x74, 0x47, 0xeb, 0x42, 0x8b, 0x49, 0x16, 0x80,
+ 0xf9, 0x00, 0x74, 0x05, 0x80, 0xf9, 0x03, 0x75, 0x38, 0x8d, 0xbe, 0x16,
+ 0x03, 0x83, 0x3d, 0x00, 0x75, 0x0c, 0x83, 0x7d, 0x02, 0x00, 0x75, 0x06,
+ 0x83, 0x7d, 0x04, 0x00, 0x74, 0x23, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x16,
+ 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x8b, 0xf8,
+ 0x74, 0x0f, 0xc7, 0x86, 0x2e, 0x02, 0x0e, 0x00, 0xb8, 0x0b, 0x00, 0xe8,
+ 0x89, 0xe9, 0x5e, 0x5b, 0xc3, 0x8b, 0xf8, 0x5e, 0x5b, 0xff, 0xa4, 0xf2,
+ 0x03, 0xff, 0x86, 0x4c, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x06, 0x00, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0xb9, 0x03,
+ 0x00, 0xf3, 0xa5, 0x8b, 0xb6, 0x1a, 0x06, 0x8b, 0x04, 0x86, 0xe0, 0x89,
+ 0x86, 0x06, 0x02, 0x89, 0x86, 0x16, 0x02, 0x8b, 0xb6, 0x1f, 0x06, 0x8b,
+ 0x04, 0x89, 0x86, 0x1a, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x86, 0x1c, 0x02,
+ 0x8b, 0x44, 0x04, 0x89, 0x86, 0x1e, 0x02, 0x8b, 0xb6, 0x24, 0x06, 0x8b,
+ 0x04, 0x89, 0x86, 0x24, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x86, 0x26, 0x02,
+ 0x8b, 0xb6, 0x1a, 0x06, 0x8b, 0x04, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x56,
+ 0xf7, 0x07, 0x00, 0x10, 0x74, 0x14, 0xf6, 0x47, 0x06, 0x08, 0x75, 0x0b,
+ 0x80, 0xbe, 0x63, 0x02, 0x00, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x04, 0xe9,
+ 0x1b, 0x01, 0x3b, 0x86, 0x0c, 0x03, 0x77, 0xf7, 0x80, 0xbe, 0x62, 0x02,
+ 0x01, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0xea, 0xc6, 0x46, 0x07,
+ 0x10, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0xe0, 0x80, 0xbe, 0x63, 0x02, 0x00,
+ 0x75, 0xd9, 0xc6, 0x46, 0x09, 0x0a, 0xf6, 0x86, 0x0b, 0x02, 0x10, 0x74,
+ 0xce, 0x80, 0xa6, 0x0b, 0x02, 0x6f, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xe9,
+ 0xdf, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x5b, 0xc6, 0x86, 0x58, 0x02,
+ 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c, 0x00, 0xbf, 0xbe, 0x6d,
+ 0x4c, 0xe8, 0xa0, 0xd6, 0x8b, 0xb6, 0x1f, 0x06, 0x8d, 0xbe, 0x00, 0x03,
+ 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x21, 0x83,
+ 0xf8, 0x01, 0x74, 0x1c, 0xff, 0x8e, 0xba, 0x02, 0x75, 0x13, 0xf6, 0x86,
+ 0x5c, 0x02, 0x01, 0x75, 0x0c, 0xc6, 0x86, 0x5c, 0x02, 0x01, 0xc6, 0x46,
+ 0x09, 0x08, 0xe9, 0x94, 0x00, 0xe9, 0x91, 0x00, 0xc7, 0x86, 0xba, 0x02,
+ 0x08, 0x00, 0x83, 0xf8, 0x01, 0x75, 0x0a, 0xc7, 0x86, 0xb8, 0x02, 0x02,
+ 0x00, 0xeb, 0x7e, 0xeb, 0x2e, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x16, 0x03,
+ 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0xe4, 0xff,
+ 0x8e, 0xb8, 0x02, 0x75, 0x14, 0xc7, 0x86, 0xb8, 0x02, 0x02, 0x00, 0xc6,
+ 0x86, 0x58, 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00,
+ 0x40, 0xeb, 0x4e, 0x80, 0xbe, 0x62, 0x02, 0x00, 0x74, 0x0c, 0x80, 0x7e,
+ 0x08, 0x08, 0x74, 0x41, 0xc6, 0x46, 0x09, 0x0a, 0xeb, 0x3b, 0xb7, 0x10,
+ 0x8a, 0x5e, 0x06, 0x80, 0xfb, 0x06, 0x74, 0x1f, 0x80, 0xfb, 0x08, 0x74,
+ 0x1a, 0x80, 0xfb, 0x04, 0x74, 0x15, 0x80, 0xfb, 0x0c, 0x74, 0x10, 0x80,
+ 0xfb, 0x0a, 0x75, 0x07, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xeb, 0x04, 0xb7,
+ 0x12, 0xeb, 0x12, 0x88, 0x7e, 0x07, 0x80, 0xff, 0x12, 0x75, 0x04, 0xc6,
+ 0x46, 0x09, 0x1e, 0xb8, 0x07, 0x00, 0xe8, 0xea, 0xe7, 0xc3, 0xff, 0x86,
+ 0x4c, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x06, 0x00, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x8d, 0xbe, 0x00, 0x02, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa5,
+ 0x80, 0x7e, 0x06, 0x48, 0x74, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0xc3, 0xe7,
+ 0xeb, 0x37, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x26, 0x80, 0x7e, 0x08,
+ 0x16, 0x75, 0x20, 0xc6, 0x46, 0x09, 0x1a, 0xc6, 0x86, 0x73, 0x02, 0x00,
+ 0xc6, 0x86, 0x6c, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x4c,
+ 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80, 0xeb, 0x0a, 0x80,
+ 0x7e, 0x08, 0x18, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x1a, 0xc3, 0x8a, 0x4e,
+ 0x06, 0x80, 0xbe, 0xac, 0x02, 0x01, 0x74, 0x02, 0xeb, 0x06, 0xb8, 0x06,
+ 0x00, 0xe8, 0x77, 0xe7, 0xc3, 0xe9, 0x8e, 0x00, 0xeb, 0x6e, 0xeb, 0x64,
+ 0x80, 0x7e, 0x06, 0x42, 0x75, 0xf3, 0x8b, 0x47, 0x1a, 0x83, 0xf8, 0x00,
+ 0x75, 0xee, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0xe9, 0xf6, 0x86, 0x78,
+ 0x02, 0x01, 0x74, 0x29, 0xc6, 0x86, 0x78, 0x02, 0x00, 0xc6, 0x86, 0xb0,
+ 0x02, 0x01, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x02, 0xc7, 0x86, 0xd8, 0x02,
+ 0x05, 0x00, 0xbe, 0x27, 0x4d, 0xe8, 0x28, 0xd5, 0xf7, 0x86, 0xf6, 0x00,
+ 0x00, 0x08, 0x74, 0x03, 0xe8, 0xa1, 0xf6, 0xeb, 0x45, 0xf6, 0x86, 0x82,
+ 0x02, 0x01, 0x75, 0x18, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x10, 0x74, 0x10,
+ 0xb8, 0x02, 0x00, 0xe8, 0xa3, 0x11, 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46,
+ 0x07, 0x02, 0xeb, 0x26, 0xb8, 0x06, 0x00, 0xe8, 0x05, 0xe7, 0xeb, 0x1e,
+ 0x3d, 0x00, 0x02, 0x75, 0x10, 0xc6, 0x86, 0x7b, 0x02, 0x01, 0xe8, 0xfa,
+ 0x06, 0xbe, 0x0f, 0x4d, 0xe8, 0xe1, 0xd4, 0xeb, 0x09, 0x3d, 0x00, 0x04,
+ 0x75, 0x04, 0xc6, 0x46, 0x07, 0x4a, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x02,
+ 0x00, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x2b, 0x8b, 0x47, 0x1a, 0x83, 0xf8,
+ 0x00, 0x75, 0x10, 0xc6, 0x46, 0x07, 0x48, 0x80, 0x7e, 0x08, 0x1c, 0x75,
+ 0x19, 0xc6, 0x46, 0x09, 0x16, 0xeb, 0x13, 0x86, 0xc4, 0x3d, 0x20, 0x80,
+ 0x75, 0x0c, 0xc7, 0x86, 0x2e, 0x02, 0x11, 0x00, 0xb8, 0x08, 0x00, 0xe8,
+ 0xad, 0xe6, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x0f, 0x00, 0x80, 0x7e, 0x06,
+ 0x44, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x08, 0xb8, 0x06, 0x00,
+ 0xe8, 0x94, 0xe6, 0xeb, 0x0d, 0xf6, 0x86, 0x73, 0x02, 0x01, 0x74, 0x06,
+ 0xbe, 0x1b, 0x4d, 0xe8, 0x76, 0xd4, 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75,
+ 0x14, 0xe8, 0x85, 0xd2, 0xc7, 0x44, 0x02, 0x02, 0x00, 0x8d, 0x7e, 0x16,
+ 0xe8, 0x98, 0xd2, 0xbe, 0x91, 0x4c, 0xe8, 0x0d, 0xd5, 0xc3, 0xf7, 0x86,
+ 0xf6, 0x00, 0x40, 0x00, 0x74, 0x18, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x20,
+ 0x74, 0x10, 0x80, 0x7e, 0x06, 0x08, 0x72, 0x0a, 0x80, 0x7e, 0x06, 0x0e,
+ 0x77, 0x04, 0xc6, 0x46, 0x07, 0x14, 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75,
+ 0x2e, 0xff, 0x8e, 0x66, 0x01, 0x75, 0x1d, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x26, 0x64, 0x00, 0xfd, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x74, 0x06,
+ 0xc6, 0x46, 0x07, 0x4e, 0xeb, 0x11, 0xc6, 0x46, 0x07, 0x46, 0xeb, 0x0b,
+ 0xc6, 0x86, 0x77, 0x02, 0x01, 0xb9, 0x5a, 0x00, 0xe8, 0x06, 0xf3, 0xc3,
+ 0x80, 0x7e, 0x06, 0x44, 0x75, 0x1f, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x64, 0x00, 0x02, 0xc6, 0x86, 0x76, 0x02, 0x00, 0xbe, 0x91, 0x4c, 0xe8,
+ 0xea, 0xd3, 0xb9, 0x5a, 0x00, 0xc6, 0x86, 0x8b, 0x02, 0x01, 0xe8, 0xe0,
+ 0xf2, 0xc3, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x72, 0x18, 0x8a, 0x4e, 0x06,
+ 0x80, 0xf9, 0x44, 0x74, 0x0a, 0x80, 0xf9, 0x46, 0x74, 0x05, 0x80, 0xf9,
+ 0x48, 0x75, 0x06, 0xb8, 0x03, 0x00, 0xe8, 0xce, 0xe5, 0xc3, 0xff, 0x86,
+ 0x50, 0x02, 0xc7, 0x86, 0x2e, 0x02, 0x0b, 0x00, 0x8a, 0x86, 0x58, 0x02,
+ 0x88, 0x86, 0x84, 0x02, 0xc7, 0x86, 0xcc, 0x02, 0x00, 0x00, 0xc6, 0x86,
+ 0x65, 0x02, 0x00, 0x83, 0x8e, 0x0a, 0x02, 0x20, 0x81, 0xa6, 0x0a, 0x02,
+ 0xff, 0x2f, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf6, 0x86, 0x58, 0x02, 0x01,
+ 0x74, 0x38, 0xc6, 0x86, 0x84, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x64, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0a, 0xc6,
+ 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0x8a, 0xa6, 0x84,
+ 0x02, 0x88, 0xa6, 0x58, 0x02, 0xe8, 0xa0, 0xd5, 0x88, 0x86, 0x58, 0x02,
+ 0xc6, 0x46, 0x09, 0x0c, 0xc7, 0x86, 0xca, 0x01, 0x00, 0x01, 0x80, 0x7e,
+ 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x06, 0x80, 0x7e, 0x08, 0x02,
+ 0x75, 0x04, 0xc6, 0x46, 0x09, 0x0c, 0x80, 0x7e, 0x08, 0x06, 0x74, 0x05,
+ 0xc6, 0x86, 0x5e, 0x02, 0x01, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x00, 0x03,
+ 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x06, 0x00, 0xf3, 0xa6, 0x74, 0x08, 0x77,
+ 0x03, 0xe9, 0x95, 0x00, 0xe9, 0xfe, 0x00, 0xf6, 0x47, 0x06, 0x08, 0x75,
+ 0x59, 0x80, 0x7e, 0x08, 0x04, 0x75, 0x53, 0x8b, 0xb6, 0x2a, 0x06, 0x8d,
+ 0xbe, 0x16, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xb8, 0x01,
+ 0x00, 0xf3, 0xa7, 0x74, 0x02, 0xeb, 0x3e, 0xff, 0x86, 0xbe, 0x02, 0x83,
+ 0xbe, 0xbe, 0x02, 0x03, 0x72, 0x30, 0x83, 0xbe, 0xbc, 0x02, 0x03, 0x72,
+ 0x29, 0xc6, 0x46, 0x09, 0x02, 0xc6, 0x86, 0x84, 0x02, 0x01, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x0e, 0x64, 0x00, 0x00, 0x80, 0x8a, 0x86, 0x58, 0x02,
+ 0x8a, 0xa6, 0x84, 0x02, 0x88, 0xa6, 0x58, 0x02, 0xe8, 0x01, 0xd5, 0x88,
+ 0x86, 0x58, 0x02, 0xe8, 0x6d, 0xf3, 0xe9, 0xec, 0x00, 0x80, 0x7e, 0x0a,
+ 0x00, 0x75, 0x1d, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02,
+ 0x00, 0x8a, 0x86, 0x58, 0x02, 0x8a, 0xa6, 0x84, 0x02, 0x88, 0xa6, 0x58,
+ 0x02, 0xe8, 0xd8, 0xd4, 0x88, 0x86, 0x58, 0x02, 0xc6, 0x46, 0x09, 0x0c,
+ 0xb8, 0x00, 0x03, 0xe8, 0xbe, 0xf3, 0xe9, 0xbc, 0x00, 0x80, 0x7e, 0x08,
+ 0x00, 0x75, 0x3d, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x75, 0x16, 0xf6, 0x86,
+ 0x6c, 0x02, 0x01, 0x74, 0x16, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x08,
+ 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x75, 0x16, 0xc6, 0x46, 0x09, 0x0c,
+ 0xe9, 0x92, 0x00, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x9c, 0xf7, 0x86,
+ 0x12, 0x01, 0x00, 0x01, 0x74, 0x94, 0xc6, 0x46, 0x09, 0x04, 0xff, 0x86,
+ 0x4e, 0x02, 0xeb, 0x79, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x73, 0xf6, 0x86,
+ 0x63, 0x02, 0x01, 0x75, 0x0e, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x75,
+ 0x06, 0xc6, 0x46, 0x09, 0x0c, 0xeb, 0x5e, 0xf7, 0x86, 0x12, 0x01, 0x00,
+ 0x01, 0x74, 0x56, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x50, 0x80, 0x7e, 0x08,
+ 0x04, 0x75, 0x2c, 0xc6, 0x46, 0x09, 0x0c, 0x80, 0x7e, 0x0a, 0x00, 0x75,
+ 0x1d, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0x8a,
+ 0x86, 0x58, 0x02, 0x8a, 0xa6, 0x84, 0x02, 0x88, 0xa6, 0x58, 0x02, 0xe8,
+ 0x32, 0xd4, 0x88, 0x86, 0x58, 0x02, 0xe8, 0xc8, 0xef, 0xeb, 0x1e, 0x80,
+ 0x7e, 0x08, 0x00, 0x75, 0x09, 0xf6, 0x86, 0x6c, 0x02, 0x01, 0x74, 0x02,
+ 0xeb, 0xab, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x09, 0xf6, 0x86, 0x63, 0x02,
+ 0x01, 0x75, 0x02, 0xeb, 0x9c, 0x8a, 0x86, 0x84, 0x02, 0x88, 0x86, 0x58,
+ 0x02, 0xc3, 0xc7, 0x86, 0xc6, 0x02, 0x02, 0x00, 0xff, 0x86, 0x46, 0x02,
+ 0xc7, 0x86, 0x2e, 0x02, 0x0c, 0x00, 0x80, 0x7e, 0x06, 0x04, 0x74, 0x06,
+ 0x80, 0x7e, 0x06, 0x06, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0x80, 0x7e,
+ 0x08, 0x00, 0x75, 0x56, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x3b, 0xc6,
+ 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x64, 0x00,
+ 0xff, 0x7f, 0xb8, 0x00, 0x02, 0xe8, 0xb4, 0xf2, 0xf6, 0x86, 0x62, 0x02,
+ 0x01, 0x74, 0x0c, 0xbe, 0x97, 0x4c, 0xe8, 0x73, 0xd1, 0xbe, 0xb5, 0x4c,
+ 0xe8, 0x6d, 0xd1, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0d, 0xc6, 0x86, 0x6d,
+ 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x9a, 0xd3, 0xf6, 0x86,
+ 0x62, 0x02, 0x01, 0x74, 0x34, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xc6, 0x86,
+ 0x5d, 0x02, 0x00, 0xe9, 0xc9, 0x00, 0x80, 0x7e, 0x08, 0x0c, 0x75, 0x24,
+ 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x16, 0xbe,
+ 0x97, 0x4c, 0xe8, 0x2f, 0xd1, 0xbe, 0xb5, 0x4c, 0xe8, 0x29, 0xd1, 0xc6,
+ 0x86, 0x5c, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xe9, 0x9f, 0x00,
+ 0x80, 0x7e, 0x08, 0x02, 0x75, 0xf7, 0xc7, 0x86, 0xcc, 0x01, 0x00, 0x00,
+ 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x0a, 0xc6,
+ 0x86, 0x5c, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0x8d, 0x77, 0x0e,
+ 0x8d, 0xbe, 0x00, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x06, 0x00, 0xf3,
+ 0xa6, 0x74, 0x2e, 0xc6, 0x86, 0x58, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x64, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0a,
+ 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0x07,
+ 0xd3, 0xb8, 0x00, 0x02, 0xe8, 0xf5, 0xf1, 0xc6, 0x46, 0x09, 0x00, 0xeb,
+ 0x3e, 0x8e, 0x46, 0x02, 0x26, 0xa0, 0x5c, 0x00, 0xc6, 0x46, 0x09, 0x00,
+ 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00, 0xc6, 0x86,
+ 0x69, 0x02, 0x00, 0xe8, 0xde, 0xd2, 0x24, 0x07, 0xe8, 0xf7, 0xf4, 0xbe,
+ 0x67, 0x4c, 0xe8, 0x93, 0xd0, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d,
+ 0xbe, 0xf2, 0x01, 0xab, 0xab, 0xab, 0xe8, 0xb2, 0xee, 0xbe, 0xb5, 0x4c,
+ 0xe8, 0x7d, 0xd0, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x03, 0xe8, 0xf9, 0xee,
+ 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0xff, 0x86, 0x54, 0x02, 0xc7, 0x86, 0x2e,
+ 0x02, 0x0f, 0x00, 0xf6, 0x86, 0xce, 0x01, 0x01, 0x74, 0x3b, 0xb8, 0x38,
+ 0x5f, 0xa3, 0x2c, 0x5f, 0x8d, 0x77, 0x0e, 0x8b, 0xf8, 0xa5, 0xa5, 0xa5,
+ 0xc7, 0x06, 0x34, 0x5f, 0x01, 0x00, 0xc6, 0x86, 0xcf, 0x01, 0x00, 0x33,
+ 0xff, 0xba, 0x02, 0x08, 0xe8, 0xc6, 0xe6, 0xbf, 0x2e, 0x5f, 0xb9, 0x03,
+ 0x00, 0xf3, 0xa5, 0x8d, 0x77, 0x0e, 0xbf, 0x2e, 0x5f, 0xb9, 0x03, 0x00,
+ 0xf3, 0xa7, 0x75, 0x05, 0xe8, 0x8b, 0x04, 0xeb, 0x00, 0x8d, 0x77, 0x0e,
+ 0x8d, 0xbe, 0xf2, 0x01, 0xa5, 0xa5, 0xa5, 0x80, 0x7e, 0x06, 0x04, 0x75,
+ 0x04, 0xc6, 0x46, 0x07, 0x08, 0x8b, 0x8e, 0xc6, 0x02, 0xe3, 0x05, 0x49,
+ 0x89, 0x8e, 0xc6, 0x02, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x0a, 0xf6, 0x86,
+ 0x6c, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x07, 0x02, 0xf6, 0x86, 0x58, 0x02,
+ 0x01, 0x75, 0x03, 0xe9, 0x93, 0x00, 0xbe, 0xb5, 0x4c, 0xe8, 0xe4, 0xcf,
+ 0xf7, 0x07, 0x00, 0x10, 0x75, 0x37, 0xc6, 0x86, 0x58, 0x02, 0x00, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x64, 0x00, 0xff, 0x7f, 0xb8, 0x00, 0x02,
+ 0xe8, 0xfd, 0xf0, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x06, 0xbe, 0x97,
+ 0x4c, 0xe8, 0xbc, 0xcf, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x38, 0xc6, 0x86,
+ 0x6d, 0x02, 0x00, 0xc6, 0x86, 0x6f, 0x02, 0x00, 0xe8, 0xe9, 0xd1, 0xeb,
+ 0x29, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x33, 0xc6, 0x86, 0x69, 0x02, 0x01,
+ 0xc6, 0x86, 0x6a, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d,
+ 0x77, 0x0e, 0x8d, 0xbe, 0xf2, 0x01, 0xab, 0xab, 0xab, 0x8b, 0x86, 0x0a,
+ 0x02, 0xa9, 0x40, 0x00, 0x74, 0x02, 0xeb, 0x48, 0x83, 0xc8, 0x40, 0x89,
+ 0x86, 0x0a, 0x02, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xeb, 0x3a, 0x83, 0xa6,
+ 0x0a, 0x02, 0xbf, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77, 0x0e,
+ 0x8d, 0xbe, 0xf2, 0x01, 0xa5, 0xa5, 0xa5, 0xeb, 0x23, 0xf6, 0x86, 0x62,
+ 0x02, 0x01, 0x74, 0x06, 0xbe, 0xb5, 0x4c, 0xe8, 0x4a, 0xcf, 0xc6, 0x86,
+ 0x6b, 0x02, 0x00, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x0b, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xbe, 0x9d, 0x4c, 0xe8, 0x34, 0xcf, 0xc3, 0xeb, 0x61, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xc7, 0x86, 0x2e, 0x02, 0x0d, 0x00, 0xf6, 0x86, 0xce,
+ 0x01, 0x01, 0x74, 0x50, 0x33, 0xff, 0xba, 0x02, 0x08, 0xe8, 0xa1, 0xe5,
+ 0x8b, 0x3e, 0x2c, 0x5f, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x3d, 0x81,
+ 0xff, 0x46, 0x66, 0x73, 0x6f, 0x89, 0x3e, 0x2c, 0x5f, 0x8d, 0x77, 0x0e,
+ 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, 0x05, 0xc6, 0x86, 0xd0, 0x01, 0x01,
+ 0x81, 0xff, 0x46, 0x66, 0x73, 0x56, 0x89, 0x3e, 0x2c, 0x5f, 0x8d, 0x77,
+ 0x0e, 0xa5, 0xa5, 0xa5, 0xff, 0x06, 0x34, 0x5f, 0x8d, 0x77, 0x0e, 0xbf,
+ 0x2e, 0x5f, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x03, 0xe8, 0x36, 0x03,
+ 0x8a, 0x86, 0x0a, 0x02, 0xa8, 0x40, 0x75, 0x3d, 0x80, 0x7e, 0x06, 0x04,
+ 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x3a,
+ 0xf6, 0x86, 0x6c, 0x02, 0x01, 0x74, 0x35, 0xf6, 0x86, 0x58, 0x02, 0x01,
+ 0x74, 0x07, 0xf6, 0x86, 0x69, 0x02, 0x01, 0x75, 0x27, 0xe8, 0xb3, 0x00,
+ 0xc7, 0x86, 0xc8, 0x02, 0x01, 0x00, 0xeb, 0x1c, 0xbf, 0x40, 0x66, 0x33,
+ 0xc0, 0xab, 0xab, 0xab, 0xe8, 0xf3, 0x02, 0xeb, 0xbb, 0x24, 0xbf, 0x88,
+ 0x86, 0x0a, 0x02, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xeb, 0xb6, 0xeb, 0x79,
+ 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x3c, 0xf6, 0x86, 0x69, 0x02, 0x01,
+ 0x74, 0x19, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x12, 0x83, 0xbe, 0xc6,
+ 0x02, 0x00, 0x75, 0x0b, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x05, 0x83, 0x8e,
+ 0xe6, 0x02, 0x08, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6a, 0x02,
+ 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe,
+ 0xf2, 0x01, 0xab, 0xab, 0xab, 0xeb, 0x4b, 0xf6, 0x86, 0x6c, 0x02, 0x01,
+ 0x74, 0x44, 0xf6, 0x86, 0x6b, 0x02, 0x01, 0x75, 0x0d, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xbe, 0x9d, 0x4c, 0xe8, 0x20, 0xce, 0xeb, 0x30, 0xf6, 0x86,
+ 0x62, 0x02, 0x01, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x0c, 0x83,
+ 0xbe, 0xc6, 0x02, 0x00, 0x75, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x08, 0xeb,
+ 0x15, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x0e, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xf2, 0x01, 0xa5, 0xa5, 0xa5, 0xc3, 0x53,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0x16, 0x03, 0x8c,
+ 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, 0x54, 0x8b, 0x44,
+ 0xfe, 0x89, 0x45, 0xfe, 0xf3, 0xa5, 0xbb, 0x02, 0x05, 0xb9, 0x0b, 0x00,
+ 0x8d, 0xb6, 0x16, 0x03, 0xad, 0x8b, 0x14, 0x8b, 0x74, 0x02, 0x8b, 0x3f,
+ 0x03, 0xfd, 0xab, 0x89, 0x15, 0x89, 0x75, 0x02, 0x83, 0xc3, 0x02, 0xe2,
+ 0xf1, 0xf6, 0x86, 0xaf, 0x02, 0x01, 0x75, 0x26, 0x8b, 0xb6, 0x2f, 0x06,
+ 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5, 0x80, 0x7e, 0x06, 0x08, 0x76, 0x0b,
+ 0xc7, 0x86, 0xc8, 0x02, 0x04, 0x00, 0xe8, 0x68, 0xee, 0xeb, 0x0b, 0xc6,
+ 0x86, 0x88, 0x02, 0x01, 0xc7, 0x86, 0xc8, 0x02, 0x01, 0x00, 0x5b, 0xc3,
+ 0xb8, 0x80, 0x0a, 0xf6, 0x86, 0xab, 0x02, 0x01, 0x75, 0x45, 0xf6, 0x86,
+ 0xad, 0x02, 0x01, 0x75, 0x3e, 0xf7, 0x86, 0xf6, 0x00, 0x10, 0x00, 0x75,
+ 0x36, 0xf7, 0x07, 0x82, 0x00, 0x74, 0x2f, 0xc7, 0x86, 0x2e, 0x02, 0x07,
+ 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x01,
+ 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf6, 0x86, 0xac, 0x02, 0x01, 0x75, 0x0c,
+ 0x80, 0x7e, 0x06, 0x08, 0x72, 0x0c, 0x80, 0x7e, 0x06, 0x0e, 0x77, 0x06,
+ 0xb8, 0x0a, 0x00, 0xe8, 0x41, 0xdf, 0xc3, 0x89, 0x86, 0xee, 0x02, 0xe9,
+ 0x1b, 0xea, 0xf7, 0x07, 0x02, 0x00, 0x74, 0x0f, 0x80, 0x7e, 0x06, 0x0c,
+ 0x75, 0x09, 0xc6, 0x86, 0x64, 0x02, 0x01, 0xc6, 0x46, 0x07, 0x0e, 0x8b,
+ 0x86, 0x18, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0x54, 0x06, 0x0b, 0xf6, 0x74,
+ 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x89, 0x86,
+ 0xea, 0x02, 0x8b, 0xb6, 0x3b, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86,
+ 0xc4, 0x89, 0x86, 0x10, 0x02, 0x8b, 0xb6, 0x40, 0x06, 0x0b, 0xf6, 0x74,
+ 0x05, 0x8b, 0xc6, 0xe8, 0xa2, 0x00, 0x8b, 0xb6, 0x45, 0x06, 0x0b, 0xf6,
+ 0x74, 0x07, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x0c, 0x02, 0x8b, 0xb6, 0x4a,
+ 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89, 0x86, 0xfc, 0x01,
+ 0x8b, 0xb6, 0x4f, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89,
+ 0x86, 0xfa, 0x01, 0x8b, 0x07, 0xa9, 0x02, 0x00, 0x75, 0x07, 0xa8, 0x28,
+ 0x74, 0x03, 0xe9, 0x71, 0xff, 0xc7, 0x86, 0xee, 0x02, 0x00, 0x01, 0xe9,
+ 0x8b, 0xe9, 0xc3, 0xf7, 0x07, 0x02, 0x02, 0x74, 0xf9, 0x8b, 0x86, 0x18,
+ 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0x69, 0x06, 0x0b, 0xf6, 0x74, 0x09, 0xad,
+ 0x86, 0xe0, 0x89, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xea, 0x02,
+ 0x8b, 0xb6, 0x5a, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89,
+ 0x86, 0x10, 0x02, 0x8b, 0xb6, 0x5f, 0x06, 0x0b, 0xf6, 0x74, 0x05, 0x8b,
+ 0xc6, 0xe8, 0x20, 0x00, 0x8b, 0xb6, 0x64, 0x06, 0x0b, 0xf6, 0x74, 0x07,
+ 0xad, 0x86, 0xe0, 0x89, 0x86, 0x0c, 0x02, 0x80, 0x7e, 0x06, 0x0c, 0x75,
+ 0x96, 0xc6, 0x86, 0x64, 0x02, 0x01, 0xc6, 0x46, 0x07, 0x0e, 0xeb, 0x8b,
+ 0x53, 0x57, 0x8c, 0xdb, 0x8e, 0xc3, 0xbb, 0x18, 0x05, 0xb9, 0x0a, 0x00,
+ 0x8b, 0xf0, 0xad, 0x8b, 0x34, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x35,
+ 0x83, 0xc3, 0x02, 0xe2, 0xf4, 0x5f, 0x5b, 0xc3, 0x68, 0xe4, 0x2e, 0xeb,
+ 0x08, 0x68, 0x4c, 0x2f, 0xeb, 0x03, 0x68, 0x8e, 0x2f, 0xf7, 0x07, 0x82,
+ 0x02, 0x74, 0x1c, 0x8b, 0x86, 0x18, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0xa0,
+ 0x06, 0x0b, 0xf6, 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x18, 0x02,
+ 0x86, 0xe0, 0x89, 0x86, 0xea, 0x02, 0xc3, 0x83, 0xc4, 0x02, 0xc3, 0x8b,
+ 0x07, 0xf6, 0x86, 0x63, 0x01, 0x01, 0x74, 0x1e, 0xa9, 0x00, 0x20, 0x74,
+ 0x40, 0x56, 0x57, 0xe8, 0xef, 0xc9, 0xc7, 0x44, 0x02, 0x02, 0x00, 0x8d,
+ 0x7e, 0x16, 0xe8, 0x02, 0xca, 0xbe, 0x91, 0x4c, 0xe8, 0x77, 0xcc, 0x5f,
+ 0x5e, 0xc3, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x21, 0xa9, 0x00, 0x10, 0x74,
+ 0x1c, 0xa9, 0x3c, 0x00, 0x75, 0x17, 0xff, 0x86, 0xd2, 0x02, 0xff, 0x86,
+ 0xd0, 0x02, 0x83, 0xbe, 0xd0, 0x02, 0x02, 0x72, 0x05, 0xc6, 0x46, 0x07,
+ 0x0a, 0xc3, 0xe8, 0x20, 0xea, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0,
+ 0x8b, 0x3e, 0x2c, 0x5f, 0x83, 0xc7, 0x06, 0x81, 0xff, 0x46, 0x66, 0x72,
+ 0x03, 0xbf, 0x40, 0x66, 0xab, 0xab, 0xab, 0xf6, 0x86, 0xd0, 0x01, 0x01,
+ 0x74, 0x18, 0xc6, 0x86, 0xcf, 0x01, 0x01, 0xe8, 0x8b, 0xc9, 0xc7, 0x44,
+ 0x02, 0x05, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x9e, 0xc9, 0xc6, 0x86, 0xce,
+ 0x01, 0x00, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x06, 0xbe,
+ 0x5d, 0x4d, 0xe8, 0x53, 0xcb, 0x8d, 0xb6, 0xc4, 0x15, 0x8e, 0x46, 0x02,
+ 0x8a, 0x1c, 0xf6, 0xc3, 0x80, 0x75, 0x0d, 0x80, 0xfb, 0x10, 0x77, 0x14,
+ 0x32, 0xff, 0xd1, 0xe3, 0xff, 0xa7, 0xe0, 0x04, 0xc7, 0x86, 0x0a, 0x01,
+ 0x00, 0x00, 0xc3, 0xb8, 0x00, 0x80, 0xeb, 0x08, 0xb8, 0x00, 0x80, 0xeb,
+ 0x03, 0xb8, 0x00, 0x20, 0x8d, 0xb6, 0xc4, 0x15, 0x89, 0x44, 0x02, 0x80,
+ 0x0c, 0x80, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0xc7, 0x86, 0x0a, 0x01, 0x00,
+ 0x00, 0x26, 0xc7, 0x06, 0x30, 0x00, 0x08, 0x00, 0xc3, 0xeb, 0xe1, 0xb8,
+ 0x04, 0x00, 0x80, 0xbe, 0x06, 0x01, 0x01, 0x75, 0xf4, 0xb8, 0x05, 0x00,
+ 0x80, 0xbe, 0x07, 0x01, 0x01, 0x74, 0xea, 0xc6, 0x86, 0x08, 0x01, 0x01,
+ 0xc6, 0x86, 0xd1, 0x01, 0x00, 0xc6, 0x86, 0x09, 0x01, 0x00, 0x8b, 0x86,
+ 0xf8, 0x00, 0x89, 0x86, 0xf6, 0x00, 0x8d, 0xb6, 0xce, 0x15, 0xb8, 0x03,
+ 0x00, 0xf6, 0x04, 0x80, 0x75, 0xc7, 0x33, 0xc0, 0x39, 0x04, 0x75, 0x1e,
+ 0x39, 0x44, 0x02, 0x75, 0x19, 0x39, 0x44, 0x04, 0x75, 0x14, 0x8b, 0x86,
+ 0x00, 0x01, 0x89, 0x04, 0x8b, 0x86, 0x02, 0x01, 0x89, 0x44, 0x02, 0x8b,
+ 0x86, 0x04, 0x01, 0x89, 0x44, 0x04, 0xad, 0x8b, 0x14, 0x8b, 0x74, 0x02,
+ 0x89, 0x86, 0xd4, 0x01, 0x89, 0x96, 0xd6, 0x01, 0x89, 0xb6, 0xd8, 0x01,
+ 0x8e, 0x46, 0x02, 0x50, 0xe8, 0x8e, 0xc7, 0x26, 0xa3, 0x5e, 0x00, 0x8b,
+ 0xc2, 0xe8, 0x85, 0xc7, 0x26, 0xa3, 0x60, 0x00, 0x8b, 0xc6, 0xe8, 0x7c,
+ 0xc7, 0x26, 0xa3, 0x62, 0x00, 0x58, 0xbb, 0x30, 0x05, 0xb9, 0x16, 0x00,
+ 0x1e, 0x07, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x15, 0x89, 0x75, 0x02,
+ 0x83, 0xc3, 0x02, 0xe2, 0xf1, 0xbb, 0x2c, 0x05, 0x8d, 0x96, 0xdc, 0x15,
+ 0xb8, 0x02, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0x8b, 0xf2, 0xb9, 0x09, 0x00,
+ 0xf3, 0xa5, 0x83, 0xc3, 0x02, 0x48, 0x75, 0xef, 0xf7, 0x86, 0xf6, 0x00,
+ 0x08, 0x00, 0x74, 0x06, 0xbe, 0x5d, 0x4d, 0xe8, 0x3a, 0xca, 0x8d, 0xb6,
+ 0xc4, 0x15, 0x8b, 0x44, 0x08, 0x89, 0x86, 0x12, 0x01, 0x89, 0x86, 0x14,
+ 0x01, 0xf7, 0x86, 0x12, 0x01, 0x01, 0x00, 0x74, 0x08, 0xc7, 0x06, 0x8f,
+ 0x4c, 0x58, 0x02, 0xeb, 0x06, 0xc7, 0x06, 0x8f, 0x4c, 0x08, 0x07, 0x8e,
+ 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x68, 0x00, 0x81, 0xe3, 0xff, 0xf4, 0xa9,
+ 0x04, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74,
+ 0x04, 0x81, 0xcb, 0x00, 0x03, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x68,
+ 0x00, 0x8d, 0xb6, 0xd8, 0x15, 0xe8, 0x64, 0x02, 0x8d, 0xb6, 0xd4, 0x15,
+ 0xe8, 0x23, 0x00, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x74, 0x03, 0xe8, 0x87,
+ 0x16, 0xc6, 0x86, 0x07, 0x01, 0x01, 0xe8, 0xd0, 0x03, 0xe8, 0xc7, 0x05,
+ 0xe9, 0xa2, 0xfe, 0x56, 0x83, 0xc6, 0x08, 0xe8, 0x04, 0x00, 0x5e, 0xe9,
+ 0x97, 0xfe, 0x8e, 0x46, 0x02, 0xb8, 0xc0, 0x00, 0xe8, 0xb2, 0xc6, 0x26,
+ 0xa3, 0x7a, 0x00, 0x8b, 0x04, 0x0d, 0x80, 0x00, 0x89, 0x86, 0xda, 0x01,
+ 0xe8, 0xa2, 0xc6, 0x26, 0xa3, 0x7c, 0x00, 0x8b, 0x44, 0x02, 0x89, 0x86,
+ 0xdc, 0x01, 0xe8, 0x94, 0xc6, 0x26, 0xa3, 0x7e, 0x00, 0xc3, 0x83, 0x8e,
+ 0x1e, 0x01, 0x01, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x8a, 0x46, 0x06, 0x3c,
+ 0x00, 0x74, 0x46, 0x3c, 0x10, 0x75, 0x03, 0xe9, 0x53, 0xfe, 0x3c, 0x12,
+ 0x74, 0x3b, 0x3c, 0x4c, 0x75, 0x03, 0xe9, 0x48, 0xfe, 0x80, 0xbe, 0xfe,
+ 0x00, 0x02, 0x72, 0x1a, 0x3c, 0x48, 0x74, 0x0f, 0xf6, 0x86, 0x72, 0x02,
+ 0x01, 0x74, 0x17, 0x3c, 0x44, 0x74, 0x04, 0x3c, 0x46, 0x75, 0x28, 0xc6,
+ 0x46, 0x07, 0x4c, 0xe9, 0x27, 0xfe, 0x3c, 0x0e, 0x74, 0x17, 0x3c, 0x48,
+ 0x74, 0x19, 0xe8, 0x1c, 0xfe, 0xb8, 0x0f, 0x00, 0xe8, 0x4c, 0xdb, 0xeb,
+ 0x35, 0xe8, 0x11, 0xfe, 0xe8, 0x04, 0x04, 0xeb, 0x2d, 0xc6, 0x46, 0x07,
+ 0x10, 0xeb, 0x20, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75,
+ 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d,
+ 0x01, 0x01, 0xe8, 0x35, 0x16, 0xc6, 0x46, 0x07, 0x12, 0xeb, 0x00, 0xc6,
+ 0x46, 0x09, 0x1e, 0xe9, 0xdf, 0xfd, 0xc3, 0xc6, 0x86, 0x06, 0x01, 0x00,
+ 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03, 0xe9, 0xcf,
+ 0xfd, 0x8b, 0x44, 0x08, 0x89, 0x86, 0xf4, 0x00, 0x8b, 0x44, 0x0a, 0xa9,
+ 0x00, 0x10, 0x74, 0x03, 0x0d, 0x00, 0x01, 0x89, 0x86, 0xf6, 0x00, 0x89,
+ 0x86, 0xf8, 0x00, 0x8b, 0x44, 0x12, 0x0b, 0xc0, 0x75, 0x21, 0xf7, 0x86,
+ 0xf4, 0x00, 0x00, 0x40, 0x74, 0x0b, 0xb8, 0x1f, 0x47, 0xf7, 0x86, 0xf6,
+ 0x00, 0x00, 0x12, 0x75, 0x0e, 0xb8, 0x18, 0x47, 0xf7, 0x86, 0xf6, 0x00,
+ 0x00, 0x01, 0x75, 0x03, 0xb8, 0xc6, 0x11, 0x89, 0x86, 0xfa, 0x00, 0xe8,
+ 0xab, 0x02, 0x8d, 0xbe, 0x56, 0x04, 0x8b, 0x44, 0x0c, 0x89, 0x05, 0x89,
+ 0x86, 0x00, 0x01, 0x8b, 0x44, 0x0e, 0x89, 0x45, 0x02, 0x89, 0x86, 0x02,
+ 0x01, 0x8b, 0x44, 0x10, 0x89, 0x45, 0x04, 0x89, 0x86, 0x04, 0x01, 0x80,
+ 0xbe, 0x62, 0x01, 0x01, 0x75, 0x21, 0x8b, 0x44, 0x0c, 0x89, 0x86, 0xbc,
+ 0x03, 0x89, 0x86, 0xc2, 0x03, 0x8b, 0x44, 0x0e, 0x89, 0x86, 0xbe, 0x03,
+ 0x89, 0x86, 0xc4, 0x03, 0x8b, 0x44, 0x10, 0x89, 0x86, 0xc0, 0x03, 0x89,
+ 0x86, 0xc6, 0x03, 0x8e, 0x46, 0x02, 0x8b, 0x86, 0xfa, 0x00, 0x26, 0xa3,
+ 0x52, 0x00, 0x8b, 0x44, 0x14, 0x26, 0xa3, 0x6a, 0x00, 0x8b, 0x44, 0x16,
+ 0x25, 0xff, 0xf4, 0x83, 0xc8, 0x30, 0x26, 0xa3, 0x68, 0x00, 0x8d, 0x1e,
+ 0x72, 0x05, 0x8b, 0x44, 0x18, 0xc1, 0xe8, 0x04, 0x83, 0xe0, 0x0f, 0xd7,
+ 0xa2, 0x87, 0x03, 0x8b, 0x44, 0x18, 0xc1, 0xe8, 0x0c, 0x83, 0xe0, 0x0f,
+ 0xd7, 0xa2, 0x88, 0x03, 0x33, 0xc0, 0xd7, 0xa2, 0x89, 0x03, 0x06, 0x51,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xbe, 0x80, 0x03, 0x8d, 0xbe, 0x1a, 0x04, 0xb9,
+ 0x05, 0x00, 0xf3, 0xa5, 0x59, 0x07, 0x8b, 0x86, 0xf4, 0x00, 0x25, 0xff,
+ 0xfe, 0xc1, 0xe8, 0x08, 0x89, 0x86, 0x28, 0x02, 0xf7, 0x86, 0xf4, 0x00,
+ 0x04, 0x00, 0x74, 0x0f, 0xf6, 0x06, 0x23, 0x5f, 0x01, 0x75, 0x08, 0xc6,
+ 0x06, 0x23, 0x5f, 0x01, 0xe8, 0xd0, 0x11, 0x80, 0xbe, 0x62, 0x01, 0x01,
+ 0x75, 0x01, 0xc3, 0xc6, 0x86, 0x06, 0x01, 0x01, 0xe9, 0xae, 0xfc, 0x56,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6, 0xdc, 0x02, 0xb9,
+ 0x05, 0x00, 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, 0xdc, 0x02, 0x33, 0xc0,
+ 0x8b, 0xca, 0xf3, 0xab, 0x81, 0xa6, 0x0a, 0x02, 0x7f, 0xdf, 0x5e, 0xe9,
+ 0x87, 0xfc, 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6,
+ 0x40, 0x02, 0xb9, 0x0c, 0x00, 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, 0x40,
+ 0x02, 0x33, 0xc0, 0x8b, 0xca, 0xf3, 0xab, 0x5e, 0xe9, 0x66, 0xfc, 0x83,
+ 0xc6, 0x08, 0xe8, 0x03, 0x00, 0xe9, 0x5d, 0xfc, 0x06, 0x8e, 0x46, 0x02,
+ 0x8b, 0x04, 0x89, 0x86, 0xde, 0x01, 0xe8, 0x74, 0xc4, 0x26, 0xa3, 0x66,
+ 0x00, 0x8b, 0x44, 0x02, 0x23, 0x86, 0xfc, 0x01, 0xe8, 0x66, 0xc4, 0x25,
+ 0xff, 0x7f, 0x26, 0x8b, 0x0e, 0x64, 0x00, 0x81, 0xe1, 0x00, 0x80, 0x0b,
+ 0xc1, 0x26, 0xa3, 0x64, 0x00, 0xe8, 0x51, 0xc4, 0x89, 0x86, 0xe0, 0x01,
+ 0x07, 0xc3, 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03,
+ 0xe9, 0x1d, 0xfc, 0xc6, 0x86, 0x62, 0x01, 0x01, 0xe8, 0x34, 0xfe, 0xc6,
+ 0x86, 0x62, 0x01, 0x00, 0xc6, 0x86, 0x06, 0x01, 0x01, 0xe9, 0x05, 0xfc,
+ 0xb8, 0x11, 0x00, 0xc6, 0x86, 0x62, 0x01, 0x00, 0xe9, 0xfd, 0xfb, 0xc3,
+ 0x8b, 0xd8, 0x26, 0x8b, 0x04, 0x50, 0x33, 0xc0, 0x50, 0x23, 0xc3, 0x8b,
+ 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58,
+ 0x75, 0x3c, 0x05, 0x55, 0x55, 0x73, 0xe9, 0xb8, 0x01, 0x00, 0x50, 0x23,
+ 0xc3, 0x8b, 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b,
+ 0xc1, 0x58, 0x75, 0x22, 0xd1, 0xc0, 0x73, 0xea, 0xf7, 0xd0, 0x50, 0x23,
+ 0xc3, 0x8b, 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b,
+ 0xc1, 0x58, 0x75, 0x0a, 0xd1, 0xc0, 0x72, 0xea, 0xf8, 0x58, 0x26, 0x89,
+ 0x04, 0xc3, 0xf9, 0xeb, 0xf8, 0x8b, 0x44, 0x08, 0x25, 0xff, 0x7b, 0x89,
+ 0x86, 0x12, 0x01, 0x89, 0x86, 0x14, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x8b,
+ 0x1e, 0x68, 0x00, 0x81, 0xe3, 0xff, 0xf4, 0xa9, 0x04, 0x00, 0x74, 0x04,
+ 0x81, 0xcb, 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00,
+ 0x03, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x68, 0x00, 0xe9, 0x69, 0xfb,
+ 0xe9, 0x61, 0xfb, 0x8b, 0x44, 0x08, 0x89, 0x86, 0x30, 0x01, 0xbe, 0x4b,
+ 0x4d, 0xe8, 0x80, 0xc6, 0xe9, 0x56, 0xfb, 0x8b, 0x44, 0x08, 0x8e, 0x46,
+ 0x02, 0x26, 0xa3, 0x6a, 0x00, 0xe9, 0x49, 0xfb, 0x80, 0x7e, 0x06, 0x0e,
+ 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x13, 0x80, 0x7e, 0x08, 0x00,
+ 0x74, 0x06, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x07, 0x8d, 0x5c, 0x08, 0xe8,
+ 0x8a, 0xe8, 0xc3, 0xb8, 0x00, 0x10, 0xe9, 0x27, 0xfb, 0xb8, 0x04, 0x00,
+ 0xf6, 0x86, 0x07, 0x01, 0x01, 0x74, 0x1e, 0x8e, 0x46, 0x02, 0x26, 0xa1,
+ 0x68, 0x00, 0x8b, 0x5c, 0x08, 0x81, 0xe3, 0xff, 0xf4, 0x25, 0x00, 0x0b,
+ 0x0b, 0xd8, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x68, 0x00, 0xb8, 0x00,
+ 0x20, 0xe9, 0xfc, 0xfa, 0xb8, 0x05, 0x00, 0xf6, 0x86, 0x07, 0x01, 0x01,
+ 0x75, 0x11, 0xfa, 0xe8, 0xe6, 0xc7, 0xfa, 0xe8, 0xe7, 0xfa, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x0e, 0x32, 0x00, 0x02, 0xe9, 0xde, 0xfa, 0xe9, 0xd8,
+ 0xfa, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x40, 0x74, 0x0d, 0xc6, 0x86, 0xfe,
+ 0x00, 0x02, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x12, 0x75, 0x12, 0xc6, 0x86,
+ 0xfe, 0x00, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x11, 0x75, 0x05, 0xc6,
+ 0x86, 0xfe, 0x00, 0x00, 0xc3, 0x8b, 0xd0, 0xb8, 0x01, 0x00, 0xe9, 0xa3,
+ 0x01, 0xc3, 0x80, 0xbe, 0xb2, 0x02, 0x01, 0x74, 0x0e, 0x80, 0xbe, 0x07,
+ 0x01, 0x01, 0x75, 0xf1, 0x80, 0xbe, 0x09, 0x01, 0x01, 0x74, 0xea, 0xc6,
+ 0x86, 0x09, 0x01, 0x01, 0xc6, 0x86, 0xb2, 0x02, 0x00, 0x80, 0xbe, 0xfe,
+ 0x00, 0x01, 0x74, 0x0c, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x08, 0x0d,
+ 0x00, 0x08, 0xeb, 0x03, 0x0d, 0x00, 0x01, 0x80, 0xbe, 0xaa, 0x02, 0x01,
+ 0x74, 0x0a, 0x80, 0xbe, 0xac, 0x02, 0x01, 0x74, 0x03, 0x0d, 0x00, 0x04,
+ 0x80, 0xbe, 0xaa, 0x02, 0x01, 0x74, 0x0a, 0x80, 0xbe, 0xab, 0x02, 0x01,
+ 0x74, 0x03, 0x0d, 0x00, 0x02, 0xf7, 0x86, 0xa6, 0x02, 0x01, 0x00, 0x74,
+ 0x03, 0x0d, 0x00, 0x08, 0xa9, 0x00, 0x80, 0x74, 0x1d, 0xc7, 0x86, 0x2e,
+ 0x01, 0x02, 0x00, 0xf6, 0x86, 0x2c, 0x01, 0x01, 0x74, 0x1d, 0x53, 0xbb,
+ 0x40, 0x60, 0x8e, 0xc3, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x02, 0x5b,
+ 0xeb, 0x0d, 0x8a, 0x56, 0x06, 0xd0, 0xe2, 0xd0, 0xe2, 0xd0, 0xe2, 0x24,
+ 0x0f, 0x0a, 0xc2, 0x89, 0x86, 0x38, 0x02, 0x8b, 0xd0, 0xb8, 0x02, 0x00,
+ 0xe9, 0x92, 0x00, 0x8b, 0x96, 0x1e, 0x01, 0x8b, 0x86, 0x12, 0x01, 0xa9,
+ 0x00, 0x02, 0x74, 0x06, 0xf7, 0xc2, 0x05, 0x80, 0x74, 0x0e, 0xc6, 0x86,
+ 0x07, 0x01, 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0xca, 0x80, 0x00,
+ 0x33, 0xc0, 0x89, 0x86, 0x1e, 0x01, 0x89, 0x96, 0x20, 0x01, 0xc7, 0x86,
+ 0x38, 0x02, 0x00, 0x00, 0xf7, 0xc2, 0x01, 0x00, 0x75, 0x22, 0x83, 0xbe,
+ 0x2e, 0x01, 0x03, 0x74, 0x1b, 0xc7, 0x86, 0x2e, 0x01, 0x03, 0x00, 0xf6,
+ 0x86, 0x2c, 0x01, 0x01, 0x74, 0x0e, 0x53, 0xbb, 0x40, 0x60, 0x8e, 0xc3,
+ 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x02, 0x5b, 0xb8, 0x03, 0x00, 0xeb,
+ 0x34, 0x3b, 0xc0, 0x74, 0x00, 0x8b, 0xd0, 0xb8, 0x04, 0x00, 0xeb, 0x29,
+ 0xc3, 0xc6, 0x86, 0xce, 0x01, 0x00, 0xc6, 0x86, 0xcf, 0x01, 0x00, 0x55,
+ 0x33, 0xed, 0xbe, 0x1c, 0x5e, 0xe8, 0xb4, 0xc4, 0x5d, 0xb8, 0x05, 0x00,
+ 0xeb, 0x0f, 0xb8, 0x06, 0x00, 0xeb, 0x0a, 0xb8, 0x07, 0x00, 0xeb, 0x05,
+ 0xb8, 0x08, 0x00, 0xeb, 0x00, 0x8b, 0xb6, 0x60, 0x01, 0x3b, 0xb6, 0x5e,
+ 0x01, 0x75, 0x0a, 0xf7, 0x86, 0xb0, 0x15, 0x00, 0x80, 0x74, 0x02, 0xeb,
+ 0x5f, 0x8b, 0x8e, 0x5e, 0x01, 0x41, 0x80, 0xe1, 0x07, 0x3b, 0xf1, 0x75,
+ 0x20, 0x46, 0x83, 0xe6, 0x07, 0x89, 0xb6, 0x60, 0x01, 0x51, 0x8b, 0xce,
+ 0xd1, 0xe1, 0xd1, 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x8b, 0x0c,
+ 0x83, 0xf9, 0x05, 0x74, 0x03, 0x0d, 0x00, 0x01, 0x59, 0x83, 0xf8, 0x04,
+ 0x75, 0x1a, 0x51, 0xb9, 0x08, 0x00, 0x8d, 0xb6, 0x3e, 0x01, 0x39, 0x04,
+ 0x74, 0x08, 0x83, 0xc6, 0x04, 0xe2, 0xf7, 0x59, 0xeb, 0x06, 0x89, 0x54,
+ 0x02, 0x59, 0xeb, 0x13, 0x89, 0x8e, 0x5e, 0x01, 0xd1, 0xe1, 0xd1, 0xe1,
+ 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x89, 0x04, 0x89, 0x54, 0x02, 0xc3,
+ 0x8d, 0xb6, 0xb0, 0x15, 0x89, 0x54, 0x06, 0xc7, 0x44, 0x04, 0x08, 0x00,
+ 0x3c, 0x05, 0x75, 0x05, 0xc7, 0x44, 0x04, 0x06, 0x00, 0x25, 0xff, 0x7f,
+ 0x89, 0x04, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0x26, 0xc7, 0x06, 0x30, 0x00,
+ 0x00, 0x20, 0xc3, 0x8b, 0x86, 0x14, 0x01, 0x89, 0x86, 0x12, 0x01, 0xc6,
+ 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x08, 0x1e, 0xc6, 0x46, 0x0b, 0x00, 0xc7,
+ 0x86, 0x28, 0x01, 0x00, 0x00, 0xc7, 0x86, 0x2a, 0x01, 0x00, 0x00, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0xe4, 0x01, 0xb9, 0x2b, 0x00,
+ 0xf3, 0xab, 0xc7, 0x86, 0x2a, 0x02, 0xff, 0xff, 0x8e, 0x46, 0x02, 0xb8,
+ 0x02, 0x00, 0xf7, 0x86, 0xf4, 0x00, 0x80, 0x00, 0x74, 0x03, 0x83, 0xc8,
+ 0x01, 0xf7, 0x86, 0xf4, 0x00, 0x40, 0x00, 0x74, 0x03, 0x83, 0xc8, 0x04,
+ 0xf7, 0x86, 0xf4, 0x00, 0x20, 0x00, 0x74, 0x03, 0x83, 0xc8, 0x08, 0x26,
+ 0xa3, 0x4e, 0x00, 0xb0, 0x02, 0xe8, 0x0e, 0xc8, 0xf7, 0x86, 0xf4, 0x00,
+ 0x00, 0x20, 0x74, 0x28, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x74, 0x0c,
+ 0xb8, 0x05, 0x00, 0xe8, 0x27, 0x00, 0xc6, 0x46, 0x07, 0x42, 0xeb, 0x20,
+ 0xf7, 0x86, 0xf6, 0x00, 0x80, 0x00, 0x74, 0x0c, 0xb8, 0x05, 0x00, 0xe8,
+ 0x13, 0x00, 0xc6, 0x46, 0x07, 0x42, 0xeb, 0x0c, 0xb8, 0x02, 0x00, 0xe8,
+ 0x07, 0x00, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x00, 0xc3, 0x50, 0xb0, 0x00,
+ 0x88, 0x86, 0xaa, 0x02, 0x88, 0x86, 0xab, 0x02, 0x88, 0x86, 0xac, 0x02,
+ 0x88, 0x86, 0xad, 0x02, 0x88, 0x86, 0xaf, 0x02, 0x88, 0x86, 0xae, 0x02,
+ 0x58, 0x9c, 0xfa, 0x83, 0xf8, 0x02, 0x74, 0x13, 0x83, 0xf8, 0x05, 0x74,
+ 0x0c, 0xc7, 0x46, 0x12, 0x5a, 0x21, 0xc7, 0x46, 0x14, 0x5a, 0x21, 0xeb,
+ 0x42, 0xeb, 0x21, 0xc6, 0x86, 0xaa, 0x02, 0x01, 0xc6, 0x86, 0xae, 0x02,
+ 0x01, 0xc6, 0x86, 0xaf, 0x02, 0x00, 0xc7, 0x46, 0x12, 0x62, 0x37, 0xc7,
+ 0x46, 0x14, 0x89, 0x34, 0xc7, 0x86, 0xba, 0x01, 0x2c, 0x00, 0xeb, 0x1f,
+ 0xc6, 0x86, 0xac, 0x02, 0x01, 0xc6, 0x86, 0xae, 0x02, 0x00, 0xc6, 0x86,
+ 0xaf, 0x02, 0x01, 0xc7, 0x46, 0x12, 0x66, 0x37, 0xc7, 0x46, 0x14, 0x8d,
+ 0x34, 0xc7, 0x86, 0xba, 0x01, 0x30, 0x00, 0x0e, 0xe8, 0x02, 0x00, 0xeb,
+ 0x01, 0xcf, 0xc3, 0x8c, 0x00, 0x76, 0x4d, 0xbc, 0x02, 0x96, 0x00, 0xac,
+ 0x4d, 0x14, 0x00, 0x96, 0x00, 0xc0, 0x4d, 0x08, 0x07, 0x96, 0x00, 0xfe,
+ 0x4d, 0x6e, 0x00, 0x78, 0x00, 0x64, 0x50, 0x00, 0x00, 0x6e, 0x00, 0xc0,
+ 0x4e, 0xf4, 0x01, 0x6e, 0x00, 0xf0, 0x4e, 0x08, 0x07, 0x6e, 0x00, 0x1c,
+ 0x52, 0x02, 0x00, 0xaa, 0x00, 0x38, 0x4f, 0xfa, 0x00, 0x8c, 0x00, 0x88,
+ 0x4f, 0x02, 0x00, 0x8c, 0x00, 0x8a, 0x4e, 0x3c, 0x00, 0x78, 0x00, 0xf4,
+ 0x4f, 0x04, 0x01, 0x96, 0x00, 0x20, 0x50, 0x64, 0x00, 0x96, 0x00, 0x44,
+ 0x50, 0xdc, 0x05, 0xbe, 0x00, 0x72, 0x51, 0xf4, 0x01, 0xbe, 0x00, 0x72,
+ 0x51, 0x32, 0x00, 0xa0, 0x00, 0xee, 0x52, 0xf4, 0x01, 0xbe, 0x00, 0x9c,
+ 0x51, 0xf4, 0x01, 0x82, 0x00, 0xc0, 0x55, 0x19, 0x00, 0x6e, 0x00, 0xd4,
+ 0x52, 0x14, 0x00, 0x78, 0x00, 0xb0, 0x51, 0xc4, 0x09, 0x6e, 0x00, 0xc4,
+ 0x51, 0x02, 0x00, 0xd2, 0x00, 0x4a, 0x56, 0x2c, 0x01, 0x78, 0x00, 0xc6,
+ 0x54, 0xf0, 0x00, 0x6e, 0x00, 0x46, 0x53, 0x32, 0x00, 0xa0, 0x00, 0xa8,
+ 0x53, 0xbc, 0x02, 0x6e, 0x00, 0xba, 0x53, 0x08, 0x07, 0x6e, 0x00, 0xc8,
+ 0x53, 0xe8, 0x03, 0x6e, 0x00, 0xda, 0x53, 0x14, 0x00, 0x96, 0x00, 0xe6,
+ 0x53, 0x64, 0x00, 0xa0, 0x00, 0xd4, 0x54, 0xf4, 0x01, 0xc8, 0x00, 0x72,
+ 0x4f, 0x02, 0x00, 0x6e, 0x00, 0x16, 0x54, 0x04, 0x00, 0x8c, 0x00, 0x9e,
+ 0x54, 0x14, 0x00, 0x6e, 0x00, 0x84, 0x56, 0x84, 0x03, 0x96, 0x00, 0x92,
+ 0x56, 0x02, 0x00, 0x82, 0x00, 0xc6, 0x52, 0x14, 0x00, 0xb4, 0x00, 0xbe,
+ 0x56, 0x02, 0x00, 0xdc, 0x00, 0x7a, 0x56, 0x64, 0x00, 0xa0, 0x00, 0xe5,
+ 0x55, 0x64, 0x00, 0xc8, 0x00, 0xfc, 0x55, 0x03, 0x00, 0xd2, 0x00, 0x4e,
+ 0x56, 0xf4, 0x01, 0xd2, 0x00, 0x60, 0x56, 0x4c, 0x04, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x80, 0xbe,
+ 0x58, 0x02, 0x01, 0x75, 0x28, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x22, 0xf6,
+ 0x86, 0x69, 0x02, 0x01, 0x74, 0x1c, 0xe8, 0xee, 0xdf, 0xbe, 0x67, 0x4c,
+ 0xe8, 0xb9, 0xc1, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0xf2,
+ 0x01, 0xab, 0xab, 0xab, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc3, 0xe8, 0xa6,
+ 0xe2, 0xeb, 0xdf, 0x90, 0x8a, 0x46, 0x08, 0x3c, 0x0a, 0x75, 0x0b, 0xf6,
+ 0x86, 0x62, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09, 0x04, 0xc3, 0x90,
+ 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x32, 0x80, 0x7e, 0x08, 0x06, 0x75,
+ 0x2c, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x0f, 0xf6, 0x86, 0x62, 0x02, 0x01,
+ 0x74, 0x08, 0xb8, 0x07, 0x00, 0xe8, 0x7b, 0xd3, 0xeb, 0x17, 0xf6, 0x86,
+ 0x62, 0x02, 0x01, 0x74, 0x10, 0xf6, 0x86, 0x5d, 0x02, 0x01, 0x75, 0x09,
+ 0xc6, 0x86, 0x5d, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x08, 0xc3, 0xe9, 0x84,
+ 0x00, 0x90, 0x8a, 0x4e, 0x06, 0x8a, 0x56, 0x08, 0x80, 0xf9, 0x06, 0x74,
+ 0xf1, 0x80, 0xf9, 0x08, 0x74, 0x05, 0x80, 0xf9, 0x0a, 0x75, 0x0a, 0x80,
+ 0xfa, 0x0c, 0x74, 0xe2, 0x80, 0xfa, 0x04, 0x74, 0xdd, 0x80, 0xfa, 0x0c,
+ 0x74, 0x05, 0x80, 0xfa, 0x04, 0x75, 0x59, 0xf6, 0x86, 0x67, 0x02, 0x01,
+ 0x74, 0x52, 0xe8, 0xed, 0x02, 0xf6, 0x86, 0x65, 0x02, 0x01, 0x74, 0x0b,
+ 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x80, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xc6,
+ 0x46, 0x09, 0x06, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x50, 0xc6, 0x86, 0x89,
+ 0x02, 0x01, 0xc6, 0x86, 0x6e, 0x02, 0x01, 0xc6, 0x86, 0x6d, 0x02, 0x01,
+ 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0x28, 0xc3, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x4c, 0x00, 0xfe, 0x26, 0x81, 0x0e, 0x32, 0x00, 0x00, 0x80,
+ 0xbe, 0x73, 0x4c, 0xe8, 0xd2, 0xc0, 0xbe, 0x9d, 0x4c, 0xe8, 0xcc, 0xc0,
+ 0xc3, 0xb8, 0x07, 0x00, 0xe8, 0xd4, 0xd2, 0xeb, 0xf7, 0x90, 0x80, 0xbe,
+ 0xaa, 0x02, 0x01, 0x74, 0x02, 0xeb, 0x2b, 0x80, 0x7e, 0x06, 0x10, 0x75,
+ 0x06, 0xc6, 0x46, 0x07, 0x12, 0xeb, 0x1f, 0x80, 0x7e, 0x08, 0x08, 0x75,
+ 0x19, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8,
+ 0xda, 0xc2, 0xbe, 0xdf, 0x4c, 0xe8, 0x94, 0xc0, 0xbe, 0xe5, 0x4c, 0xe8,
+ 0x8e, 0xc0, 0xc3, 0x90, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x28, 0xc6,
+ 0x86, 0x63, 0x02, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46,
+ 0x09, 0x04, 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x11, 0xc6, 0x86,
+ 0x6d, 0x02, 0x01, 0xe8, 0xa6, 0xc2, 0xbe, 0x9d, 0x4c, 0xe8, 0x60, 0xc0,
+ 0xe8, 0xe7, 0xdd, 0xc3, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x75, 0x31, 0xf7,
+ 0x86, 0xf6, 0x00, 0x00, 0x10, 0x75, 0x21, 0xe8, 0xea, 0xd3, 0xc6, 0x86,
+ 0x97, 0x02, 0x00, 0x8b, 0x86, 0xf8, 0x00, 0x89, 0x86, 0xf6, 0x00, 0xe8,
+ 0x3b, 0xfa, 0xc6, 0x46, 0x07, 0x06, 0xc6, 0x46, 0x06, 0x06, 0xc6, 0x46,
+ 0x09, 0x04, 0xeb, 0x16, 0xb8, 0x0d, 0x00, 0xe8, 0x35, 0xd2, 0xeb, 0x0e,
+ 0x3c, 0x08, 0x72, 0x0a, 0x3c, 0x0c, 0x77, 0x06, 0xb8, 0x05, 0x00, 0xe8,
+ 0x25, 0xd2, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x33, 0xf6, 0x86,
+ 0x58, 0x02, 0x01, 0x75, 0x2c, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x25,
+ 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x03, 0x00, 0x74, 0x11,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x54, 0x00, 0x03, 0xbe, 0x97, 0x4c,
+ 0xe8, 0xe5, 0xbf, 0xeb, 0x08, 0xc6, 0x46, 0x09, 0x04, 0xff, 0x86, 0x4e,
+ 0x02, 0xc3, 0x80, 0x7e, 0x08, 0x18, 0x75, 0x0e, 0xbe, 0x21, 0x4d, 0xe8,
+ 0xce, 0xbf, 0xe8, 0x9d, 0x01, 0xe8, 0x52, 0xdd, 0xeb, 0x00, 0xc3, 0x90,
+ 0x80, 0x7e, 0x08, 0x00, 0x75, 0x35, 0x80, 0xbe, 0x5f, 0x02, 0x01, 0x75,
+ 0x58, 0x80, 0xbe, 0x58, 0x02, 0x01, 0x74, 0x1f, 0xe8, 0x07, 0xde, 0x80,
+ 0x7e, 0x06, 0x0a, 0x75, 0x16, 0xc6, 0x86, 0x67, 0x02, 0x01, 0xc6, 0x46,
+ 0x07, 0x0c, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x40, 0x75, 0x05, 0xc6, 0x86,
+ 0x62, 0x02, 0x01, 0xc3, 0xbe, 0x9d, 0x4c, 0xe8, 0x8a, 0xbf, 0xc3, 0x8a,
+ 0x46, 0x08, 0x3c, 0x04, 0x75, 0x0e, 0xbe, 0x9d, 0x4c, 0xe8, 0x7c, 0xbf,
+ 0xff, 0x86, 0xbc, 0x02, 0xe8, 0x39, 0xdd, 0xc3, 0x3c, 0x06, 0x75, 0xdf,
+ 0xf6, 0x86, 0x63, 0x02, 0x01, 0x75, 0xd8, 0xbe, 0x9d, 0x4c, 0xe8, 0x63,
+ 0xbf, 0xe8, 0xea, 0xdc, 0xc3, 0xc6, 0x86, 0x6a, 0x02, 0x01, 0xc3, 0x90,
+ 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74, 0x22, 0x80, 0x7e, 0x06, 0x0c, 0x75,
+ 0x1b, 0xff, 0x86, 0xc2, 0x02, 0x83, 0xbe, 0xc2, 0x02, 0x04, 0x77, 0x0a,
+ 0xbe, 0xa9, 0x4c, 0xe8, 0x3a, 0xbf, 0xe8, 0x88, 0xde, 0xc3, 0xb8, 0x09,
+ 0x00, 0xe8, 0x3f, 0xd1, 0xc3, 0xeb, 0xfd, 0x90, 0x80, 0x7e, 0x08, 0x02,
+ 0x75, 0x1d, 0x80, 0xbe, 0x62, 0x02, 0x01, 0x74, 0x08, 0xb8, 0x05, 0x00,
+ 0xe8, 0x28, 0xd1, 0xeb, 0x0e, 0xff, 0x86, 0x4e, 0x02, 0xc6, 0x46, 0x09,
+ 0x04, 0xb8, 0x00, 0x01, 0xe8, 0x3d, 0xe0, 0xc3, 0x80, 0x7e, 0x08, 0x00,
+ 0x75, 0x16, 0x80, 0xbe, 0x58, 0x02, 0x01, 0x74, 0x07, 0x80, 0xbe, 0x62,
+ 0x02, 0x00, 0x74, 0x08, 0xff, 0x86, 0x4e, 0x02, 0xc6, 0x46, 0x09, 0x04,
+ 0xc3, 0xe9, 0xb8, 0x00, 0xf6, 0x86, 0xaf, 0x02, 0x01, 0x75, 0x07, 0xf6,
+ 0x86, 0x62, 0x02, 0x01, 0x74, 0xef, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80,
+ 0x74, 0x06, 0xbe, 0x7f, 0x4c, 0xe8, 0xcc, 0xbe, 0x8d, 0xbe, 0xdc, 0x02,
+ 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x05, 0x00, 0x33, 0xc0, 0xf3, 0xaf, 0x74,
+ 0xd0, 0x80, 0xbe, 0xaa, 0x02, 0x01, 0x74, 0x45, 0x80, 0xbe, 0xab, 0x02,
+ 0x01, 0x74, 0x5f, 0x80, 0xbe, 0xac, 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe,
+ 0xad, 0x02, 0x01, 0x74, 0x51, 0xeb, 0x6d, 0xc7, 0x86, 0xc0, 0x02, 0x04,
+ 0x00, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01,
+ 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x14, 0x80, 0x7e, 0x08, 0x16, 0x75,
+ 0x0e, 0xc6, 0x86, 0x5a, 0x02, 0x00, 0xe8, 0xe2, 0xdd, 0xc7, 0x86, 0x2e,
+ 0x02, 0x03, 0x00, 0xeb, 0x3f, 0xc7, 0x86, 0xc0, 0x02, 0x04, 0x00, 0xc6,
+ 0x86, 0x5a, 0x02, 0x00, 0xe8, 0xcc, 0xdd, 0xc7, 0x86, 0x2e, 0x02, 0x03,
+ 0x00, 0x81, 0x8e, 0x0a, 0x02, 0x00, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01,
+ 0xeb, 0x1e, 0xc7, 0x86, 0xc0, 0x02, 0x04, 0x00, 0x81, 0x8e, 0x0a, 0x02,
+ 0x00, 0x20, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00,
+ 0x80, 0x75, 0x05, 0xc6, 0x86, 0x5a, 0x02, 0x00, 0xc3, 0x90, 0xc7, 0x86,
+ 0x36, 0x02, 0x06, 0x00, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x18, 0xb8,
+ 0x00, 0x02, 0x80, 0xbe, 0x65, 0x02, 0x01, 0x74, 0x37, 0xf6, 0x86, 0xac,
+ 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0xad, 0x02, 0x01, 0x74, 0x05, 0xb8,
+ 0x00, 0x05, 0xeb, 0x24, 0xb8, 0x00, 0x04, 0xc7, 0x86, 0x36, 0x02, 0x04,
+ 0x00, 0x8a, 0x4e, 0x08, 0x80, 0xf9, 0x0c, 0x74, 0x13, 0xb8, 0x00, 0x04,
+ 0x80, 0xbe, 0x5e, 0x02, 0x01, 0x74, 0x09, 0xb8, 0x00, 0x03, 0xc7, 0x86,
+ 0x36, 0x02, 0x07, 0x00, 0x89, 0x86, 0x0c, 0x03, 0xc3, 0x90, 0x80, 0x7e,
+ 0x08, 0x08, 0x74, 0x23, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x72, 0x1c, 0x3c,
+ 0x48, 0x74, 0x04, 0x3c, 0x0e, 0x77, 0x14, 0xf6, 0x86, 0x61, 0x02, 0x01,
+ 0x74, 0x0d, 0xf6, 0x86, 0x60, 0x02, 0x01, 0x74, 0x06, 0xb8, 0x0c, 0x00,
+ 0xe8, 0xc0, 0xcf, 0xc3, 0xc6, 0x86, 0x61, 0x02, 0x01, 0x8e, 0x46, 0x02,
+ 0x26, 0x81, 0x26, 0x44, 0x00, 0xff, 0xf7, 0xe8, 0xcc, 0x03, 0xc3, 0x90,
+ 0x80, 0x7e, 0x06, 0x02, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x06,
+ 0xb8, 0x01, 0x00, 0xe8, 0x99, 0xcf, 0xc3, 0x90, 0x51, 0x52, 0x56, 0x80,
+ 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x02, 0xeb, 0x48, 0x33, 0xd2, 0xc6, 0x86,
+ 0x6d, 0x02, 0x00, 0xe8, 0xb2, 0xbf, 0x8d, 0xb6, 0xa6, 0x01, 0x8d, 0xbe,
+ 0xac, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0xc6, 0x86, 0x87,
+ 0x02, 0x00, 0xb0, 0x00, 0xe8, 0xb7, 0xe1, 0xc6, 0x86, 0x68, 0x01, 0x02,
+ 0xc7, 0x86, 0x66, 0x01, 0x20, 0x03, 0xbe, 0x91, 0x4c, 0xe8, 0x48, 0xbd,
+ 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0x8e, 0x46, 0x02, 0x26, 0xc7,
+ 0x06, 0x5c, 0x00, 0x00, 0x00, 0xe8, 0xd2, 0xdb, 0x5e, 0x5a, 0x59, 0xc3,
+ 0x80, 0x7e, 0x06, 0x02, 0x74, 0x0f, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x09,
+ 0x80, 0x7e, 0x08, 0x08, 0x74, 0x03, 0xe9, 0x94, 0x00, 0x80, 0xbe, 0xfe,
+ 0x00, 0x02, 0x75, 0x26, 0xf6, 0x86, 0x76, 0x02, 0x01, 0x74, 0x0b, 0xbe,
+ 0x91, 0x4c, 0xe8, 0x07, 0xbd, 0xe8, 0x04, 0xdf, 0xeb, 0x7b, 0xf6, 0x86,
+ 0x77, 0x02, 0x01, 0x74, 0x0d, 0xc6, 0x86, 0x77, 0x02, 0x00, 0xbe, 0x91,
+ 0x4c, 0xe8, 0xf0, 0xbc, 0xeb, 0x67, 0xfe, 0x8e, 0x68, 0x01, 0x75, 0x05,
+ 0xe8, 0xd1, 0x04, 0xeb, 0x5c, 0xbe, 0x91, 0x4c, 0xe8, 0xdd, 0xbc, 0x80,
+ 0xbe, 0xfe, 0x00, 0x02, 0x75, 0x08, 0xb9, 0x5a, 0x00, 0xe8, 0xd1, 0xdb,
+ 0xeb, 0x47, 0xe8, 0xc2, 0xb7, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x4c,
+ 0x00, 0x00, 0x01, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x4c, 0x00,
+ 0xff, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x5c, 0x00, 0x00, 0x00,
+ 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6, 0x86, 0x8a, 0x02, 0x01,
+ 0x83, 0xbe, 0x66, 0x01, 0x01, 0x75, 0x07, 0xe8, 0x1b, 0xdb, 0xeb, 0x0d,
+ 0xeb, 0x05, 0xe8, 0x2d, 0xdb, 0xeb, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0x96,
+ 0xce, 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75, 0x07, 0xf6, 0x86, 0x76, 0x02,
+ 0x01, 0x75, 0xec, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x80, 0x00, 0x74, 0x10,
+ 0x80, 0x7e, 0x06, 0x14, 0x75, 0x0a, 0xb8, 0x05, 0x00, 0xe8, 0x01, 0xf9,
+ 0xc6, 0x46, 0x07, 0x42, 0xc3, 0x90, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x74,
+ 0x4e, 0xc6, 0x86, 0x70, 0x02, 0x00, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x2c,
+ 0xf6, 0x86, 0x71, 0x02, 0x01, 0x74, 0x25, 0xe9, 0x7b, 0xcc, 0xbe, 0xa3,
+ 0x4c, 0xe8, 0x3c, 0xbc, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x23, 0x5f, 0x01,
+ 0x75, 0x08, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86,
+ 0x6d, 0x01, 0x01, 0xe8, 0x44, 0x09, 0xeb, 0x16, 0x80, 0x7e, 0x06, 0x10,
+ 0x75, 0x10, 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x86, 0x58, 0x02, 0x00, 0xc6,
+ 0x86, 0x6c, 0x02, 0x00, 0xeb, 0xc8, 0xc3, 0xeb, 0xfd, 0x90, 0x80, 0x7e,
+ 0x06, 0x42, 0x75, 0x14, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x72, 0x27, 0xf6,
+ 0x86, 0x74, 0x02, 0x01, 0x75, 0x08, 0xb8, 0x02, 0x00, 0xe8, 0x0e, 0x04,
+ 0xeb, 0x45, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x02, 0xc7, 0x86, 0x30, 0x05,
+ 0x00, 0x02, 0xc6, 0x86, 0x79, 0x02, 0x01, 0xc6, 0x86, 0xb0, 0x02, 0x00,
+ 0xeb, 0x1e, 0xc6, 0x86, 0xb0, 0x02, 0x01, 0xc7, 0x86, 0x34, 0x05, 0x00,
+ 0x02, 0xc7, 0x86, 0x30, 0x05, 0x00, 0x01, 0xf6, 0x86, 0x78, 0x02, 0x01,
+ 0x74, 0x06, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x06, 0xc7, 0x86, 0xd8, 0x02,
+ 0x05, 0x00, 0xbe, 0x27, 0x4d, 0xe8, 0xa8, 0xbb, 0xe8, 0x29, 0xdd, 0xc3,
+ 0x80, 0x7e, 0x08, 0x18, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x1a, 0x75, 0x04,
+ 0xc6, 0x46, 0x09, 0x1c, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x06,
+ 0xb8, 0x05, 0x00, 0xe8, 0x95, 0xcd, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x1c,
+ 0x75, 0x0a, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44,
+ 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44,
+ 0xc3, 0x90, 0xf6, 0x86, 0x73, 0x02, 0x01, 0x74, 0x27, 0xf6, 0x46, 0x06,
+ 0x46, 0x75, 0x18, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x11, 0xc6, 0x86,
+ 0x6f, 0x02, 0x01, 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xe8, 0x85, 0xbd, 0xff,
+ 0x86, 0xd6, 0x02, 0xe8, 0x98, 0xd9, 0xbe, 0x15, 0x4d, 0xe8, 0x38, 0xbb,
+ 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x42, 0x75, 0x35, 0xf6, 0x86, 0x7b, 0x02,
+ 0x01, 0x75, 0x2e, 0x83, 0xbe, 0xd8, 0x02, 0x00, 0x74, 0x29, 0xff, 0x8e,
+ 0xd8, 0x02, 0xbe, 0x27, 0x4d, 0xe8, 0x18, 0xbb, 0x80, 0xbe, 0xfe, 0x00,
+ 0x01, 0x77, 0x13, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x02, 0xf6, 0x86, 0x78,
+ 0x02, 0x01, 0x74, 0x06, 0xc7, 0x86, 0x34, 0x05, 0x00, 0x06, 0xe8, 0x7f,
+ 0xdc, 0xeb, 0x49, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x1c, 0x80,
+ 0xbe, 0xfe, 0x00, 0x00, 0x74, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0x06, 0x03,
+ 0xeb, 0x32, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x05, 0xc6, 0x86,
+ 0xfe, 0x00, 0x01, 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x18, 0xf7, 0x86,
+ 0xf4, 0x00, 0x00, 0x10, 0x74, 0x10, 0xb8, 0x02, 0x00, 0xe8, 0x5d, 0xf7,
+ 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x06, 0xb8, 0x06,
+ 0x00, 0xe8, 0xbf, 0xcc, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x21,
+ 0x80, 0xbe, 0xfe, 0x00, 0x02, 0x74, 0x11, 0xc6, 0x86, 0x6f, 0x02, 0x01,
+ 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xe8, 0xd4, 0xbc, 0xff, 0x86, 0xd6, 0x02,
+ 0xbe, 0x2d, 0x4d, 0xe8, 0x8a, 0xba, 0xe8, 0x4d, 0xdc, 0xc3, 0x80, 0x7e,
+ 0x06, 0x44, 0x75, 0x06, 0xb8, 0x05, 0x00, 0xe8, 0x89, 0xcc, 0xc3, 0x90,
+ 0x80, 0x7e, 0x06, 0x46, 0x75, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0x7b, 0xcc,
+ 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x11, 0xc7, 0x86, 0x2e, 0x02,
+ 0x04, 0x00, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09,
+ 0x18, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x16, 0x42, 0x00, 0xf7, 0xc2,
+ 0x02, 0x00, 0x74, 0x14, 0x8b, 0xc2, 0x83, 0xe0, 0xfd, 0x8e, 0x46, 0x02,
+ 0x26, 0xa3, 0x42, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x16, 0x42, 0x00,
+ 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x03, 0x00,
+ 0x74, 0x10, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x54, 0x00, 0x03, 0xc6,
+ 0x86, 0x59, 0x02, 0x01, 0xeb, 0x00, 0xf6, 0x86, 0x59, 0x02, 0x01, 0x75,
+ 0x14, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x0e, 0xc6, 0x46, 0x09, 0x02, 0xff,
+ 0x86, 0x44, 0x02, 0x81, 0x8e, 0xe6, 0x02, 0x00, 0x02, 0xc6, 0x86, 0x59,
+ 0x02, 0x00, 0xc3, 0x90, 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x10, 0x75, 0x15,
+ 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54, 0x00, 0x03, 0x00, 0x74, 0x09,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x54, 0x00, 0x03, 0xc3, 0x80, 0xbe,
+ 0xb0, 0x02, 0x01, 0x75, 0x3d, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06, 0x54,
+ 0x00, 0x08, 0x00, 0x74, 0x2c, 0xf6, 0x86, 0x61, 0x02, 0x01, 0x74, 0x2a,
+ 0xf6, 0x86, 0x60, 0x02, 0x01, 0x75, 0x23, 0xc7, 0x86, 0x2e, 0x02, 0x0a,
+ 0x00, 0xbe, 0xbb, 0x4c, 0xf7, 0x86, 0x12, 0x01, 0x20, 0x00, 0x74, 0x03,
+ 0xbe, 0xc1, 0x4c, 0xe8, 0x9a, 0xb9, 0xc6, 0x86, 0x60, 0x02, 0x01, 0xeb,
+ 0x05, 0xc6, 0x86, 0x60, 0x02, 0x00, 0xc3, 0x90, 0xbe, 0xd3, 0x4c, 0xe8,
+ 0x86, 0xb9, 0x33, 0xc0, 0x87, 0x86, 0xcc, 0x02, 0x0b, 0xc0, 0x75, 0x14,
+ 0x80, 0xbe, 0x65, 0x02, 0x00, 0x74, 0x0d, 0xc6, 0x86, 0x65, 0x02, 0x00,
+ 0x80, 0xa6, 0x0b, 0x02, 0x7f, 0xe8, 0x3a, 0xfb, 0xc3, 0x80, 0x7e, 0x06,
+ 0x12, 0x75, 0x10, 0xc6, 0x86, 0x08, 0x01, 0x01, 0xc6, 0x86, 0x09, 0x01,
+ 0x00, 0xe8, 0x55, 0xf3, 0xe8, 0x4c, 0xf5, 0xc3, 0xf6, 0x86, 0x6e, 0x01,
+ 0x01, 0x74, 0x15, 0x80, 0xbe, 0x70, 0x01, 0x03, 0x73, 0x07, 0xc6, 0x86,
+ 0x6c, 0x01, 0x01, 0xeb, 0x23, 0xc6, 0x86, 0x6e, 0x01, 0x00, 0xeb, 0x1c,
+ 0xf6, 0x86, 0x6f, 0x01, 0x01, 0x74, 0x15, 0x80, 0xbe, 0x71, 0x01, 0x03,
+ 0x73, 0x07, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xeb, 0x07, 0xc6, 0x86, 0x6f,
+ 0x01, 0x00, 0xeb, 0x00, 0xc3, 0xf7, 0x86, 0xb0, 0x15, 0x00, 0x80, 0x75,
+ 0x07, 0x83, 0xbe, 0xb0, 0x15, 0x05, 0x74, 0x05, 0xc6, 0x86, 0xce, 0x01,
+ 0x01, 0xc3, 0xe8, 0x63, 0xcc, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00,
+ 0x74, 0x09, 0xe8, 0x45, 0xf4, 0xbe, 0x63, 0x4d, 0xe8, 0xed, 0xb8, 0xc3,
+ 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x11, 0x81, 0x8e, 0x0a, 0x02,
+ 0x00, 0x04, 0xc6, 0x86, 0x89, 0x02, 0x01, 0xb8, 0x10, 0x00, 0xe8, 0xe2,
+ 0xca, 0xc3, 0x8b, 0x86, 0x30, 0x01, 0x88, 0xa6, 0x2c, 0x01, 0xc3, 0x90,
+ 0x80, 0x7e, 0x06, 0x4a, 0x75, 0x06, 0xb8, 0x04, 0x00, 0xe8, 0xcb, 0xca,
+ 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x4c, 0x75, 0x25, 0xf6, 0x86, 0x74, 0x02,
+ 0x01, 0x74, 0x07, 0x83, 0xbe, 0xda, 0x02, 0x00, 0x75, 0x0a, 0xc6, 0x46,
+ 0x07, 0x12, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0x0d, 0xff, 0x8e, 0xda, 0x02,
+ 0xbe, 0x39, 0x4d, 0xe8, 0x92, 0xb8, 0xe8, 0xab, 0xda, 0xc3, 0x80, 0xbe,
+ 0xfe, 0x00, 0x02, 0x75, 0x2e, 0x8a, 0x3e, 0x22, 0x5f, 0xb3, 0x01, 0xe8,
+ 0xf1, 0xbe, 0xf6, 0x86, 0x74, 0x02, 0x01, 0x74, 0x24, 0xa9, 0x04, 0x00,
+ 0x75, 0x1d, 0xff, 0x8e, 0xb5, 0x02, 0x75, 0x15, 0xc6, 0x86, 0x74, 0x02,
+ 0x00, 0x8a, 0x4e, 0x06, 0x80, 0xf9, 0x42, 0x74, 0x08, 0xb8, 0x02, 0x00,
+ 0xe8, 0x68, 0xca, 0xeb, 0x41, 0xeb, 0x39, 0xeb, 0x31, 0xa9, 0x04, 0x00,
+ 0x74, 0x2c, 0xc6, 0x86, 0x74, 0x02, 0x01, 0x8a, 0x4e, 0x06, 0x80, 0xf9,
+ 0x4a, 0x75, 0x1d, 0xc6, 0x46, 0x07, 0x42, 0xc6, 0x46, 0x06, 0x42, 0xe8,
+ 0x0d, 0xbe, 0xbe, 0xf7, 0x4c, 0xe8, 0x30, 0xb8, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x44, 0x00, 0x32, 0xfe, 0xeb, 0x08, 0xeb, 0x06, 0xc7, 0x86,
+ 0xb5, 0x02, 0x02, 0x00, 0xbe, 0x45, 0x4d, 0xe8, 0x16, 0xb8, 0xc3, 0x90,
+ 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10, 0x74, 0x26, 0x80, 0x8e, 0xfe, 0x00,
+ 0x00, 0x74, 0x1f, 0xfe, 0x8e, 0xfe, 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x01,
+ 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0x34, 0xba, 0xbe, 0xdf, 0x4c, 0xe8,
+ 0xee, 0xb7, 0xbe, 0xe5, 0x4c, 0xe8, 0xe8, 0xb7, 0xeb, 0x06, 0xb8, 0x01,
+ 0x00, 0xe8, 0xef, 0xc9, 0xc3, 0x90, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x10,
+ 0x74, 0x32, 0x80, 0x8e, 0xfe, 0x00, 0x00, 0x74, 0x2b, 0xfe, 0x8e, 0xfe,
+ 0x00, 0xbe, 0xf7, 0x4c, 0xe8, 0xc5, 0xb7, 0xb0, 0x02, 0xe8, 0x2e, 0xbc,
+ 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xc6, 0x86, 0x6f, 0x02, 0x01, 0xe8, 0xf3,
+ 0xb9, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x40, 0x00, 0x00, 0x1e, 0xe8,
+ 0x7d, 0xbd, 0xeb, 0x03, 0xe8, 0xb0, 0xc9, 0xc3, 0xf6, 0x86, 0x95, 0x02,
+ 0x01, 0x74, 0x0a, 0xa8, 0x24, 0x74, 0x06, 0xc7, 0x86, 0xa2, 0x02, 0x05,
+ 0x00, 0xf6, 0x86, 0xae, 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe, 0x62, 0x02,
+ 0x01, 0x75, 0x58, 0xeb, 0x09, 0xf6, 0x86, 0x72, 0x02, 0x01, 0x75, 0x10,
+ 0xeb, 0x52, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x02, 0xeb, 0x45, 0x80, 0x7e,
+ 0x08, 0x00, 0x75, 0x3f, 0xa8, 0x01, 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02,
+ 0x10, 0xa8, 0x04, 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x04, 0xa8, 0x08,
+ 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x40, 0xa8, 0x20, 0x74, 0x10, 0x81,
+ 0x8e, 0xe6, 0x02, 0x00, 0x01, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x75, 0x03,
+ 0xe8, 0x2a, 0xbc, 0xa8, 0x40, 0x74, 0x05, 0x83, 0x8e, 0xe6, 0x02, 0x01,
+ 0xa8, 0x80, 0x74, 0x03, 0xe8, 0x52, 0x00, 0xa9, 0x00, 0x01, 0x75, 0x01,
+ 0xc3, 0x50, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x04,
+ 0xeb, 0x1b, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x23, 0xc6, 0x46, 0x09, 0x02,
+ 0xff, 0x86, 0x44, 0x02, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74, 0x06, 0x81,
+ 0x8e, 0xe6, 0x02, 0x00, 0x02, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x0e, 0x4c, 0x00, 0x10, 0x8e, 0x46, 0x02, 0x26, 0xc7,
+ 0x06, 0x48, 0x00, 0x00, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x48,
+ 0x00, 0x00, 0x01, 0x58, 0xc3, 0x83, 0x8e, 0xe6, 0x02, 0x20, 0x83, 0x7e,
+ 0x06, 0x08, 0x75, 0x13, 0x8b, 0x8e, 0xce, 0x02, 0x41, 0x89, 0x8e, 0xce,
+ 0x02, 0x80, 0xf9, 0x02, 0x75, 0x05, 0x50, 0xe8, 0x3f, 0xd5, 0x58, 0xc3,
+ 0x50, 0x53, 0x51, 0x8a, 0x4e, 0x06, 0x80, 0xf9, 0x0e, 0x74, 0x1e, 0x80,
+ 0xf9, 0x48, 0x74, 0x19, 0x80, 0xbe, 0x58, 0x02, 0x01, 0x74, 0x46, 0x80,
+ 0xf9, 0x08, 0x72, 0x41, 0x80, 0xf9, 0x0e, 0x77, 0x3c, 0xb8, 0x02, 0x00,
+ 0xe8, 0xa0, 0xc8, 0xeb, 0x34, 0xc7, 0x86, 0x2e, 0x02, 0x05, 0x00, 0xc6,
+ 0x86, 0x65, 0x02, 0x01, 0x8a, 0x46, 0x08, 0x3c, 0x06, 0x74, 0x26, 0x3c,
+ 0x02, 0x74, 0x51, 0x3c, 0x08, 0x74, 0x1a, 0x3c, 0x04, 0x74, 0x16, 0xf6,
+ 0x86, 0xac, 0x02, 0x01, 0x75, 0x13, 0xf6, 0x86, 0xad, 0x02, 0x01, 0x75,
+ 0x0c, 0xc6, 0x46, 0x09, 0x04, 0xff, 0x86, 0x4e, 0x02, 0x59, 0x5b, 0x58,
+ 0xc3, 0x8b, 0x86, 0x0a, 0x02, 0xf6, 0xc4, 0x80, 0x75, 0x0c, 0x80, 0xcc,
+ 0x80, 0x89, 0x86, 0x0a, 0x02, 0xc6, 0x86, 0x89, 0x02, 0x01, 0x81, 0xbe,
+ 0x0c, 0x03, 0x00, 0x02, 0x74, 0xdf, 0xc7, 0x86, 0x0c, 0x03, 0x00, 0x02,
+ 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x74, 0xd2, 0xe8, 0xb4, 0xd3, 0xeb, 0xcd,
+ 0xb8, 0x00, 0x01, 0xe8, 0x56, 0xd7, 0xf6, 0x86, 0x62, 0x02, 0x01, 0x74,
+ 0xc0, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0xba, 0xfa, 0xc7, 0x06, 0x30, 0x00,
+ 0xc0, 0x0e, 0x8c, 0x0e, 0x32, 0x00, 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8,
+ 0xea, 0x09, 0xe7, 0x00, 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, 0x7f, 0xe8,
+ 0xc5, 0xb2, 0xc6, 0x06, 0x24, 0x5f, 0x80, 0xfb, 0xc3, 0xf7, 0x86, 0x82,
+ 0x01, 0x01, 0x00, 0x74, 0x1a, 0xc7, 0x86, 0x82, 0x01, 0x00, 0x00, 0xf6,
+ 0x86, 0x6e, 0x01, 0x01, 0x74, 0x0d, 0xc6, 0x86, 0x6e, 0x01, 0x00, 0xbe,
+ 0x57, 0x4d, 0xe8, 0x81, 0xb6, 0xeb, 0x00, 0xf7, 0x86, 0x8a, 0x01, 0x01,
+ 0x00, 0x74, 0x45, 0xc7, 0x86, 0x8a, 0x01, 0x00, 0x00, 0xf6, 0x86, 0x6f,
+ 0x01, 0x01, 0x74, 0x0d, 0xc6, 0x86, 0x6f, 0x01, 0x00, 0xbe, 0x57, 0x4d,
+ 0xe8, 0x5f, 0xb6, 0xeb, 0x2b, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80,
+ 0x7e, 0x06, 0x48, 0x75, 0x1f, 0xf6, 0x86, 0x61, 0x02, 0x01, 0x74, 0x18,
+ 0xf6, 0x86, 0x60, 0x02, 0x01, 0x75, 0x11, 0xc6, 0x86, 0x60, 0x02, 0x01,
+ 0xc7, 0x86, 0x2e, 0x02, 0x0a, 0x00, 0xb8, 0x0c, 0x00, 0xe8, 0x8f, 0xc7,
+ 0xc3, 0xb9, 0x01, 0x00, 0x33, 0xdb, 0x8b, 0xaf, 0xea, 0x5d, 0x8e, 0x46,
+ 0x02, 0x26, 0x8b, 0x16, 0x54, 0x00, 0x83, 0xe2, 0x08, 0x26, 0xa1, 0x72,
+ 0x00, 0xd1, 0xe8, 0xd0, 0xe8, 0x86, 0xe0, 0xf7, 0xc2, 0x08, 0x00, 0x75,
+ 0x02, 0xeb, 0x67, 0x83, 0xbe, 0x74, 0x01, 0x00, 0x75, 0x04, 0x88, 0xa6,
+ 0x78, 0x01, 0x81, 0xbe, 0x74, 0x01, 0xbc, 0x02, 0x72, 0x06, 0xc7, 0x86,
+ 0x74, 0x01, 0xf4, 0x01, 0x8a, 0xc4, 0x2a, 0xe4, 0x83, 0xf8, 0x7f, 0x75,
+ 0x12, 0x8b, 0x86, 0x74, 0x01, 0xbe, 0xeb, 0x09, 0xf7, 0xe6, 0xbe, 0x20,
+ 0x00, 0xf7, 0xf6, 0x03, 0x86, 0x78, 0x01, 0x89, 0x86, 0x7c, 0x01, 0xff,
+ 0x86, 0x74, 0x01, 0x83, 0xbe, 0x7c, 0x01, 0x7d, 0x72, 0x21, 0x83, 0xbe,
+ 0x88, 0x01, 0x01, 0x74, 0x1a, 0xc7, 0x86, 0x88, 0x01, 0x01, 0x00, 0xc7,
+ 0x86, 0x8a, 0x01, 0x01, 0x00, 0xa1, 0xd4, 0x5d, 0x89, 0x86, 0x8c, 0x01,
+ 0xa1, 0xd6, 0x5d, 0x89, 0x86, 0x8e, 0x01, 0xe9, 0x94, 0x00, 0x83, 0xbe,
+ 0x76, 0x01, 0x00, 0x75, 0x04, 0x88, 0x86, 0x7a, 0x01, 0x81, 0xbe, 0x76,
+ 0x01, 0xbc, 0x02, 0x72, 0x06, 0xc7, 0x86, 0x76, 0x01, 0xf4, 0x01, 0x2a,
+ 0xe4, 0x83, 0xf8, 0x7f, 0x75, 0x12, 0x8b, 0x86, 0x76, 0x01, 0xbe, 0xeb,
+ 0x09, 0xf7, 0xe6, 0xbe, 0x20, 0x00, 0xf7, 0xf6, 0x03, 0x86, 0x7a, 0x01,
+ 0x89, 0x86, 0x7e, 0x01, 0xff, 0x86, 0x76, 0x01, 0x83, 0xbe, 0x80, 0x01,
+ 0x01, 0x74, 0x53, 0x83, 0xf8, 0x1f, 0x72, 0x4e, 0x8d, 0xb6, 0x96, 0x01,
+ 0x83, 0x3c, 0x12, 0x72, 0x45, 0x83, 0x3c, 0x23, 0x77, 0x40, 0x83, 0x7c,
+ 0x02, 0x1f, 0x72, 0x3a, 0x83, 0x7c, 0x02, 0x45, 0x77, 0x34, 0x83, 0x7c,
+ 0x04, 0x12, 0x72, 0x2e, 0x90, 0x83, 0x7c, 0x04, 0x23, 0x77, 0x27, 0x81,
+ 0x7c, 0x06, 0x9c, 0x00, 0x72, 0x20, 0xc7, 0x86, 0x80, 0x01, 0x01, 0x00,
+ 0xc7, 0x86, 0x82, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x88, 0x01, 0x00, 0x00,
+ 0xa1, 0xd4, 0x5d, 0x89, 0x86, 0x84, 0x01, 0xa1, 0xd6, 0x5d, 0x89, 0x86,
+ 0x86, 0x01, 0x83, 0xc3, 0x02, 0x49, 0x74, 0x03, 0xe9, 0xdb, 0xfe, 0xc3,
+ 0x50, 0x51, 0x52, 0x56, 0x57, 0x8e, 0x46, 0x02, 0x83, 0x86, 0x90, 0x01,
+ 0x01, 0x83, 0x96, 0x92, 0x01, 0x00, 0xc7, 0x86, 0x80, 0x01, 0x00, 0x00,
+ 0x26, 0xa1, 0x72, 0x00, 0xd1, 0xe8, 0xd0, 0xe8, 0x86, 0xe0, 0x8d, 0xb6,
+ 0x96, 0x01, 0x26, 0x8b, 0x0e, 0x54, 0x00, 0x83, 0xe1, 0x08, 0x89, 0x8e,
+ 0x94, 0x01, 0xf7, 0xc1, 0x08, 0x00, 0x74, 0x4f, 0x8b, 0x4c, 0x0a, 0x89,
+ 0x4c, 0x0e, 0x8b, 0x4c, 0x06, 0x89, 0x4c, 0x0a, 0x8b, 0x4c, 0x02, 0x89,
+ 0x4c, 0x06, 0x2a, 0xe4, 0x8b, 0xc8, 0x83, 0xf8, 0x7f, 0x75, 0x19, 0xb0,
+ 0x0a, 0xe6, 0x10, 0xe5, 0x00, 0xb1, 0x05, 0xd3, 0xe8, 0x03, 0x86, 0x7e,
+ 0x01, 0x8b, 0xc8, 0xe4, 0x10, 0xa8, 0x10, 0x74, 0x03, 0x83, 0xc1, 0x4f,
+ 0x8b, 0xc1, 0x89, 0x44, 0x02, 0xc7, 0x86, 0x7e, 0x01, 0x00, 0x00, 0xc7,
+ 0x86, 0x76, 0x01, 0x00, 0x00, 0xeb, 0x7f, 0xc7, 0x86, 0x88, 0x01, 0x00,
+ 0x00, 0xeb, 0x77, 0x8b, 0x4c, 0x08, 0x89, 0x4c, 0x0c, 0x8b, 0x4c, 0x04,
+ 0x89, 0x4c, 0x08, 0x8b, 0x0c, 0x89, 0x4c, 0x04, 0x8a, 0xc4, 0x2a, 0xe4,
+ 0x8b, 0xc8, 0x83, 0xf8, 0x7f, 0x75, 0x25, 0xb0, 0x0a, 0xe6, 0x10, 0xe5,
+ 0x00, 0xb1, 0x05, 0xd3, 0xe8, 0x03, 0x86, 0x7c, 0x01, 0x8b, 0xc8, 0xe4,
+ 0x10, 0xa8, 0x10, 0x74, 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0x96, 0x7c, 0x01,
+ 0x83, 0xf9, 0x7f, 0x77, 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0xc1, 0x89, 0x04,
+ 0xc7, 0x86, 0x7c, 0x01, 0x00, 0x00, 0xc7, 0x86, 0x74, 0x01, 0x00, 0x00,
+ 0x83, 0xf8, 0x7d, 0x72, 0xa2, 0x83, 0xbe, 0x88, 0x01, 0x01, 0x74, 0x1a,
+ 0xc7, 0x86, 0x88, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x8a, 0x01, 0x01, 0x00,
+ 0xa1, 0xd4, 0x5d, 0x89, 0x86, 0x84, 0x01, 0xa1, 0xd6, 0x5d, 0x89, 0x86,
+ 0x86, 0x01, 0x5f, 0x5e, 0x5a, 0x59, 0x58, 0xc3, 0x50, 0x51, 0x57, 0x06,
+ 0xfa, 0x8c, 0xd8, 0x8e, 0xc0, 0x2b, 0xc0, 0x8d, 0xbe, 0x72, 0x01, 0xb9,
+ 0x1a, 0x00, 0xf3, 0xab, 0xfb, 0x07, 0x5f, 0x59, 0x58, 0xc3, 0xfa, 0xf6,
+ 0x06, 0x24, 0x5f, 0x80, 0x74, 0x4e, 0xc6, 0x86, 0x6c, 0x01, 0x00, 0xc6,
+ 0x86, 0x6e, 0x01, 0x01, 0xfe, 0x86, 0x70, 0x01, 0x8a, 0x46, 0x00, 0xa2,
+ 0x24, 0x5f, 0xc7, 0x06, 0x26, 0x5f, 0x02, 0x00, 0xc7, 0x06, 0x28, 0x5f,
+ 0x01, 0x00, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0x8b, 0xc8, 0xb8,
+ 0xd6, 0x13, 0xe7, 0x02, 0xb8, 0x4e, 0x03, 0xe7, 0x04, 0x83, 0xc9, 0x46,
+ 0x8b, 0xc1, 0xe7, 0x06, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x42, 0x00,
+ 0x01, 0xbe, 0x57, 0x4d, 0xe8, 0xe5, 0xb2, 0xc6, 0x86, 0x61, 0x02, 0x01,
+ 0xfb, 0xc3, 0xfa, 0xf6, 0x06, 0x24, 0x5f, 0x80, 0x74, 0x49, 0xc6, 0x86,
+ 0x6d, 0x01, 0x00, 0xc6, 0x86, 0x6f, 0x01, 0x01, 0xfe, 0x86, 0x71, 0x01,
+ 0x8a, 0x46, 0x00, 0xa2, 0x24, 0x5f, 0xc7, 0x06, 0x26, 0x5f, 0x0e, 0x00,
+ 0xc7, 0x06, 0x28, 0x5f, 0x02, 0x00, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7,
+ 0x06, 0x8b, 0xc8, 0xb8, 0xf7, 0x03, 0xe7, 0x02, 0xb8, 0xd6, 0x13, 0xe7,
+ 0x04, 0x83, 0xc9, 0x46, 0x8b, 0xc1, 0xe7, 0x06, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x0e, 0x42, 0x00, 0x01, 0xbe, 0x57, 0x4d, 0xe8, 0x8d, 0xb2, 0xfb,
+ 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0x9d,
+ 0x06, 0xe7, 0x02, 0xc7, 0x06, 0x26, 0x5f, 0x04, 0x00, 0xc3, 0xc7, 0x06,
+ 0x26, 0x5f, 0x06, 0x00, 0xc3, 0x90, 0xc7, 0x06, 0x26, 0x5f, 0x08, 0x00,
+ 0xc3, 0x90, 0x53, 0xc7, 0x06, 0x26, 0x5f, 0x0a, 0x00, 0x33, 0xdb, 0x8a,
+ 0x1e, 0x24, 0x5f, 0xd0, 0xe3, 0x8b, 0x9f, 0xea, 0x5d, 0x06, 0x8e, 0x47,
+ 0x02, 0x26, 0x83, 0x26, 0x42, 0x00, 0xfe, 0x07, 0xb8, 0x9d, 0x06, 0xe7,
+ 0x02, 0x5b, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc7,
+ 0x06, 0x26, 0x5f, 0x0c, 0x00, 0xc6, 0x06, 0x24, 0x5f, 0x80, 0xc3, 0x90,
+ 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0xf7, 0x03, 0xe7,
+ 0x02, 0xc7, 0x06, 0x26, 0x5f, 0x10, 0x00, 0xc3, 0x53, 0xc7, 0x06, 0x26,
+ 0x5f, 0x12, 0x00, 0x33, 0xdb, 0x8a, 0x1e, 0x24, 0x5f, 0xd0, 0xe3, 0x8b,
+ 0x9f, 0xea, 0x5d, 0x06, 0x8e, 0x47, 0x02, 0x26, 0x83, 0x26, 0x42, 0x00,
+ 0xfe, 0x07, 0xb8, 0x9d, 0x06, 0xe7, 0x02, 0x5b, 0xc3, 0x90, 0xe5, 0x06,
+ 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc7, 0x06, 0x26, 0x5f, 0x14, 0x00, 0xc6,
+ 0x06, 0x24, 0x5f, 0x80, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7,
+ 0x06, 0xc3, 0x4e, 0x6f, 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x54, 0x78, 0x74,
+ 0x30, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x12,
+ 0x45, 0x23, 0x56, 0x34, 0x00, 0x00, 0x00, 0x00, 0xcd, 0xab, 0xde, 0xbc,
+ 0xef, 0xcd, 0x00, 0x00, 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x49, 0x6d, 0x70,
+ 0x6c, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x65, 0x64, 0x00, 0x54, 0x69, 0x6d,
+ 0x65, 0x72, 0x30, 0x00, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x31, 0x00,
+ 0x00, 0x54, 0x65, 0x73, 0x74, 0x31, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74,
+ 0x32, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x5e, 0x35, 0x56, 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00,
+ 0x00, 0x90, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x8b, 0xc0, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x06, 0x20, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xe0, 0x02, 0xc0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x16,
+ 0x00, 0x02, 0x04, 0x01, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0xe0, 0x03, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x03, 0x06, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x20, 0x00, 0xe0, 0x04, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x04, 0x08, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x05, 0xc0, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x05,
+ 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x06, 0xc0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0x06, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x01,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00, 0xe0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x06, 0x00, 0x08, 0x02, 0x26, 0x00, 0x00, 0x00, 0x00, 0x14, 0x00,
+ 0xe0, 0x08, 0xc0, 0x00, 0x00, 0x00, 0x40, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x20, 0x00, 0x08, 0x1c, 0x26, 0x00, 0x00, 0x00, 0x00,
+ 0x3e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x50, 0x20, 0x0c, 0x23, 0x30, 0x30,
+ 0x30, 0x30, 0xf3, 0xf0, 0xf0, 0xf8, 0xf9, 0xf6, 0x08, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x21, 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x06, 0x2b, 0x00, 0x00,
+ 0x00, 0x00, 0x06, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x28, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x29, 0x20, 0x00, 0x08, 0x00, 0x01, 0x00,
+ 0x04, 0x06, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x34, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x40, 0x25, 0x06, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x12, 0x40, 0x26, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x1a, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x27, 0x08, 0x0a, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00, 0xe0, 0x00,
+ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x16, 0x60, 0x28, 0x04, 0x30, 0x00, 0x00, 0x06, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x11, 0x04, 0x0c,
+ 0x00, 0x01, 0x04, 0x0e, 0x00, 0x02, 0x04, 0x21, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x12, 0x04, 0x0f,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x00, 0xc0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04,
+ 0x30, 0x13, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00, 0xc0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08,
+ 0x03, 0x14, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x03, 0x15, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0xe0, 0x08, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x00, 0x16, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00,
+ 0xe0, 0x07, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x04, 0x30, 0x17, 0x00, 0x00, 0x00, 0x00, 0x30, 0x00,
+ 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x22, 0x60, 0x29, 0x08, 0x2d, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x04, 0x2a, 0x00, 0x00, 0x02, 0x20, 0x80, 0x00, 0x00, 0x06, 0x09, 0x00,
+ 0x00, 0x00, 0x04, 0x03, 0x01, 0x80, 0x00, 0x00, 0x04, 0x02, 0x80, 0x00,
+ 0x00, 0x08, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x80, 0x00, 0x00,
+ 0x08, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x01, 0x26, 0x80, 0x00, 0x00, 0xff,
+ 0x06, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05,
+ 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00,
+ 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, 0x04, 0x04, 0x03, 0x00, 0x00, 0x00,
+ 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x00, 0x04, 0x09,
+ 0x00, 0x00, 0x00, 0x04, 0x03, 0x0c, 0x80, 0x00, 0x00, 0x04, 0x0e, 0x80,
+ 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x0f, 0x80, 0x00,
+ 0x00, 0x04, 0x01, 0x0d, 0x80, 0x00, 0x00, 0x04, 0x04, 0x02, 0x80, 0x00,
+ 0x00, 0x08, 0x22, 0x00, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00, 0x00, 0xff,
+ 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x09, 0x00, 0x00, 0x00, 0x04, 0x00,
+ 0xa5, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00
+};
diff --git a/sys/contrib/dev/oltr/trlldhm.c b/sys/contrib/dev/oltr/trlldhm.c
new file mode 100644
index 0000000..cdcb250
--- /dev/null
+++ b/sys/contrib/dev/oltr/trlldhm.c
@@ -0,0 +1,2519 @@
+/*
+ * $FreeBSD$
+ *
+ * Copyright (c) 1997
+ * OLICOM A/S
+ * Denmark
+ *
+ * All Rights Reserved
+ *
+ * This source file is subject to the terms and conditions of the
+ * OLICOM Software License Agreement which restricts the manner
+ * in which it may be used.
+ *
+ *---------------------------------------------------------------------------
+ *
+ * Description: Olicom adapter micro-code
+ *
+ *---------------------------------------------------------------------------
+ */
+
+unsigned char TRlldHawkeyeMac[] __attribute ((aligned(2))) = {
+ 0x52, 0x94, 0x03, 0x00, 0x02, 0x75, 0xea, 0x12, 0x4f, 0x43, 0x53, 0x4d,
+ 0x41, 0x43, 0x2e, 0x48, 0x41, 0x57, 0x4b, 0x45, 0x59, 0x45, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xea, 0x55, 0x00, 0x00, 0x00, 0xfc, 0xfa, 0xb8, 0x00, 0x00, 0xbb, 0x00,
+ 0x00, 0xb9, 0x00, 0x00, 0xba, 0x00, 0x00, 0xbe, 0x00, 0x00, 0xbf, 0x00,
+ 0x00, 0xbd, 0x00, 0x00, 0x8c, 0xc8, 0x8e, 0xd8, 0x8e, 0xc0, 0x8e, 0xd0,
+ 0xb8, 0x88, 0x56, 0x8b, 0xe0, 0x83, 0x3e, 0x4e, 0x00, 0x00, 0x75, 0x1c,
+ 0x2b, 0xdb, 0x8b, 0xf3, 0xad, 0x8b, 0xd8, 0x8b, 0xc8, 0xd1, 0xe9, 0x49,
+ 0x49, 0xad, 0x03, 0xd8, 0xe2, 0xfb, 0x0b, 0xdb, 0x74, 0x06, 0xc7, 0x06,
+ 0x5a, 0x55, 0x01, 0x00, 0xc7, 0x06, 0x0c, 0x00, 0xa8, 0x01, 0x8c, 0x0e,
+ 0x0e, 0x00, 0xc7, 0x06, 0x04, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x06, 0x00,
+ 0xc7, 0x06, 0x14, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x14, 0x00, 0xc7, 0x06,
+ 0x08, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x08, 0x00, 0x90, 0x90, 0x90, 0xc7,
+ 0x06, 0x20, 0x00, 0x6a, 0x1f, 0x8c, 0x0e, 0x22, 0x00, 0x2b, 0xc0, 0xe7,
+ 0x06, 0xc7, 0x06, 0x30, 0x00, 0x22, 0x0e, 0x8c, 0x0e, 0x32, 0x00, 0xc7,
+ 0x06, 0x34, 0x00, 0x34, 0x0f, 0x8c, 0x0e, 0x36, 0x00, 0xc7, 0x06, 0x38,
+ 0x00, 0x66, 0x0f, 0x8c, 0x0e, 0x3a, 0x00, 0xc7, 0x06, 0x3c, 0x00, 0xa8,
+ 0x01, 0x8c, 0x0e, 0x3e, 0x00, 0xc7, 0x06, 0x08, 0x00, 0xa8, 0x01, 0x8c,
+ 0x0e, 0x0a, 0x00, 0xc7, 0x06, 0x14, 0x00, 0xa8, 0x01, 0x8c, 0x0e, 0x16,
+ 0x00, 0xbb, 0x40, 0x60, 0x8e, 0xc3, 0x26, 0xa1, 0x02, 0x00, 0x25, 0x00,
+ 0x50, 0x89, 0x86, 0x0f, 0x01, 0x26, 0x83, 0x0e, 0x72, 0x00, 0x08, 0x2b,
+ 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, 0x72, 0x00,
+ 0xf7, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x0e,
+ 0x72, 0x00, 0x08, 0x2a, 0xe4, 0xb0, 0x13, 0xe6, 0x10, 0x90, 0x90, 0x90,
+ 0xb0, 0x08, 0xe6, 0x12, 0x90, 0x90, 0x90, 0xb0, 0x09, 0xe6, 0x12, 0x90,
+ 0x90, 0x90, 0xb0, 0xff, 0xe6, 0x12, 0x90, 0x90, 0x90, 0x26, 0x83, 0x26,
+ 0x72, 0x00, 0xf7, 0x8b, 0x86, 0x0f, 0x01, 0x26, 0xa3, 0x02, 0x00, 0x90,
+ 0x90, 0x90, 0x33, 0xc0, 0x26, 0xc7, 0x06, 0x04, 0x00, 0xff, 0xff, 0x26,
+ 0xc7, 0x06, 0x06, 0x00, 0xff, 0xff, 0x26, 0x09, 0x06, 0x08, 0x00, 0x26,
+ 0x09, 0x06, 0x0a, 0x00, 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8, 0x0f, 0x27,
+ 0xe7, 0x00, 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, 0x11, 0xe8, 0xb0, 0x0a,
+ 0xe8, 0xed, 0x0a, 0xfb, 0xe9, 0x96, 0x0b, 0x90, 0x50, 0xb0, 0xa0, 0xe6,
+ 0x10, 0x58, 0xcf, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x01, 0x13, 0xf0, 0xf0, 0xf0, 0xf0, 0xe7, 0xe7, 0xe7, 0x30, 0x32,
+ 0x30, 0x33, 0x39, 0x39, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x20, 0x28, 0x63, 0x29, 0x20, 0x31, 0x39, 0x39, 0x37, 0x20,
+ 0x2d, 0x20, 0x31, 0x39, 0x39, 0x39, 0x20, 0x4f, 0x6c, 0x69, 0x63, 0x6f,
+ 0x6d, 0x2e, 0x20, 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74,
+ 0x73, 0x20, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x20, 0x90,
+ 0x26, 0x1d, 0x26, 0x1d, 0x6f, 0x32, 0x55, 0x35, 0x51, 0x37, 0xa0, 0x38,
+ 0xe2, 0x39, 0x2a, 0x3d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x93, 0x3b,
+ 0xe9, 0x3b, 0x7a, 0x3c, 0xf7, 0x3c, 0xfc, 0x3c, 0x01, 0x3d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x34, 0x35, 0x26, 0x1d, 0x26, 0x1d,
+ 0x04, 0x34, 0x5d, 0x34, 0x5d, 0x34, 0xf1, 0x34, 0x5d, 0x34, 0x19, 0x35,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x93, 0x3b, 0xe9, 0x3b, 0x7a, 0x3c,
+ 0xf7, 0x3c, 0xfc, 0x3c, 0x01, 0x3d, 0x26, 0x1d, 0x70, 0x34, 0x26, 0x1d,
+ 0xb9, 0x34, 0x26, 0x1d, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f,
+ 0x88, 0x30, 0xb6, 0x31, 0xbe, 0x2f, 0x9a, 0x30, 0x48, 0x31, 0x08, 0x32,
+ 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32,
+ 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32,
+ 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32,
+ 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0x08, 0x32, 0xf4, 0x30, 0xbe, 0x2f,
+ 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, 0xbe, 0x2f, 0x27, 0x31, 0xbe, 0x2f,
+ 0xbe, 0x2f, 0x39, 0x31, 0xbe, 0x2f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0xff, 0xff, 0x04, 0x04, 0x05, 0xff, 0xff, 0xff, 0x00,
+ 0x03, 0x00, 0x03, 0x03, 0xb7, 0x05, 0xff, 0xff, 0xc2, 0x05, 0xd2, 0x05,
+ 0xd2, 0x05, 0xd2, 0x05, 0xd2, 0x05, 0x00, 0x00, 0xdd, 0x05, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0xe3, 0x05, 0x02, 0x06, 0x48, 0x06, 0x48, 0x06,
+ 0x48, 0x06, 0x17, 0x06, 0x27, 0x06, 0x00, 0x00, 0x2d, 0x06, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x26, 0x1d,
+ 0xb2, 0x3d, 0xfe, 0x14, 0x6e, 0x2f, 0x17, 0x23, 0xf6, 0x43, 0x26, 0x1d,
+ 0xec, 0x3d, 0x78, 0x41, 0xf5, 0x3f, 0x0e, 0x3e, 0x93, 0x3f, 0x39, 0x41,
+ 0x5c, 0x3f, 0xf1, 0x40, 0xff, 0x41, 0x67, 0x42, 0x36, 0x42, 0x18, 0x41,
+ 0x74, 0x42, 0x99, 0x42, 0xc4, 0x42, 0x57, 0x42, 0xe2, 0x42, 0x0a, 0x03,
+ 0x30, 0x03, 0x50, 0x03, 0x7c, 0x03, 0xa2, 0x03, 0x00, 0x04, 0x66, 0x04,
+ 0xa0, 0x04, 0xea, 0x04, 0xac, 0x05, 0xe4, 0x01, 0x04, 0x03, 0x2a, 0x03,
+ 0x58, 0x03, 0x76, 0x03, 0x9c, 0x03, 0x60, 0x04, 0x9a, 0x04, 0xe4, 0x04,
+ 0xa6, 0x05, 0xe0, 0x01, 0x08, 0x04, 0x6e, 0x04, 0xf4, 0x02, 0x1e, 0x03,
+ 0x44, 0x03, 0x6a, 0x03, 0x90, 0x03, 0xb6, 0x03, 0xb0, 0x03, 0xce, 0x03,
+ 0x72, 0x05, 0xe8, 0x03, 0x54, 0x04, 0x8e, 0x04, 0xb4, 0x04, 0xd4, 0x04,
+ 0x8a, 0x05, 0xfe, 0x04, 0x22, 0x05, 0x3e, 0x05, 0x56, 0x05, 0x2a, 0x54,
+ 0x32, 0x54, 0x3e, 0x54, 0x46, 0x54, 0x4e, 0x54, 0x74, 0x54, 0x88, 0x54,
+ 0x90, 0x54, 0x9c, 0x54, 0xc2, 0x54, 0xd6, 0x54, 0xf0, 0xf1, 0xf2, 0xf3,
+ 0xf4, 0xf5, 0xf6, 0xf7, 0xf8, 0xf9, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6,
+ 0x1a, 0x1a, 0x7e, 0x1a, 0xa2, 0x1a, 0x12, 0x1b, 0x34, 0x1b, 0xcc, 0x1b,
+ 0x2a, 0x1c, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x4e, 0x1c,
+ 0x70, 0x1c, 0xc6, 0x1c, 0xea, 0x1c, 0x1e, 0x1d, 0x26, 0x1d, 0x26, 0x1d,
+ 0x9c, 0x14, 0xc0, 0x15, 0x54, 0x16, 0x56, 0x16, 0x72, 0x16, 0x98, 0x16,
+ 0xb4, 0x16, 0x3e, 0x17, 0xba, 0x17, 0x6c, 0x18, 0x26, 0x1d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0xe4, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0xa8, 0x18, 0xe6, 0x18, 0x5c, 0x19, 0xa2, 0x19,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d,
+ 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0x26, 0x1d, 0xaa, 0x55, 0x00, 0xff,
+ 0xf6, 0x46, 0x01, 0x01, 0x75, 0x6a, 0xc6, 0x86, 0x0e, 0x01, 0x05, 0xe8,
+ 0x90, 0x01, 0xe8, 0x50, 0x06, 0xe8, 0xfc, 0x02, 0xe8, 0x56, 0x03, 0x73,
+ 0x3a, 0xfe, 0x8e, 0x0e, 0x01, 0x74, 0x2e, 0x26, 0x83, 0x0e, 0x72, 0x00,
+ 0x08, 0x2b, 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x26, 0x72, 0x00, 0xf7, 0x2b,
+ 0xc0, 0x2b, 0xc0, 0x26, 0x83, 0x0e, 0x72, 0x00, 0x08, 0x2b, 0xc0, 0x2b,
+ 0xc0, 0x26, 0x83, 0x26, 0x72, 0x00, 0xf7, 0x8b, 0x86, 0x0f, 0x01, 0x26,
+ 0xa3, 0x02, 0x00, 0xeb, 0xbe, 0xc7, 0x06, 0x5a, 0x55, 0x02, 0x00, 0x32,
+ 0xe4, 0x8a, 0x46, 0x00, 0xe8, 0xf6, 0x03, 0x83, 0x3e, 0x4e, 0x00, 0x02,
+ 0x72, 0x03, 0xe8, 0x3a, 0x03, 0xa1, 0x5a, 0x55, 0xe8, 0x7e, 0x3c, 0xc6,
+ 0x46, 0x01, 0x01, 0x90, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, 0x27, 0xf6,
+ 0x86, 0x6c, 0x01, 0x01, 0x74, 0x03, 0xe8, 0x01, 0x4d, 0xf6, 0x86, 0x6d,
+ 0x01, 0x01, 0x74, 0x03, 0xe8, 0x4f, 0x4d, 0xf7, 0x86, 0x82, 0x01, 0x01,
+ 0x00, 0x75, 0x08, 0xf7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0x74, 0x03, 0xe8,
+ 0x2b, 0x4a, 0xe8, 0x7b, 0x05, 0xe8, 0x47, 0x05, 0xe8, 0xbf, 0x04, 0xe8,
+ 0x64, 0x04, 0xf6, 0x86, 0x90, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x1c, 0x18,
+ 0x33, 0xdb, 0xf6, 0x86, 0xa9, 0x02, 0x01, 0x74, 0x16, 0x8a, 0x5e, 0x09,
+ 0x8a, 0x7e, 0x08, 0x38, 0xfb, 0x75, 0x30, 0x80, 0xfb, 0x00, 0x74, 0x07,
+ 0x80, 0xfb, 0x1e, 0x74, 0x02, 0xeb, 0x22, 0x80, 0x7e, 0x06, 0x1e, 0x74,
+ 0x1e, 0x33, 0xdb, 0x8a, 0x5e, 0x07, 0x3a, 0x5e, 0x06, 0x74, 0x14, 0xfa,
+ 0x50, 0x8b, 0x46, 0x06, 0x89, 0x46, 0x0c, 0x58, 0x88, 0x5e, 0x06, 0x32,
+ 0xff, 0xff, 0x97, 0x9a, 0x05, 0xeb, 0x2d, 0x8a, 0x5e, 0x09, 0x3a, 0x5e,
+ 0x08, 0x74, 0x25, 0x50, 0x8b, 0x46, 0x08, 0x89, 0x46, 0x0e, 0x58, 0x80,
+ 0xfb, 0x1e, 0x74, 0x0d, 0x80, 0xfb, 0x00, 0x74, 0x08, 0x80, 0xfb, 0x16,
+ 0x74, 0x03, 0xe8, 0x28, 0x27, 0x88, 0x5e, 0x08, 0x32, 0xff, 0xfa, 0xff,
+ 0x97, 0x78, 0x05, 0xfb, 0xfa, 0xf7, 0x86, 0xf0, 0x00, 0xff, 0xff, 0x74,
+ 0x0f, 0x8b, 0xb6, 0xf0, 0x00, 0x8b, 0x4c, 0x04, 0xe8, 0x0b, 0x0a, 0xfb,
+ 0xff, 0xd1, 0xeb, 0x5c, 0xfb, 0xf7, 0x46, 0x16, 0xff, 0xff, 0x74, 0x27,
+ 0x8d, 0x7e, 0x16, 0xe8, 0x88, 0x06, 0x56, 0x8b, 0x5c, 0x02, 0xd1, 0xe3,
+ 0xff, 0x97, 0xce, 0x04, 0x5e, 0xe8, 0x8c, 0x06, 0xf7, 0x86, 0xc8, 0x01,
+ 0x01, 0x00, 0x74, 0x09, 0xe8, 0x60, 0x21, 0xc7, 0x86, 0xc8, 0x01, 0x00,
+ 0x00, 0xeb, 0x2d, 0xfa, 0xf7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0x75, 0x13,
+ 0xf6, 0x86, 0x6c, 0x15, 0x80, 0x75, 0x0c, 0xc7, 0x86, 0x0a, 0x01, 0x01,
+ 0x00, 0xfb, 0xe8, 0x31, 0x36, 0xeb, 0x11, 0xfa, 0x8b, 0x86, 0x63, 0x02,
+ 0x38, 0xc4, 0x74, 0x07, 0x88, 0x86, 0x64, 0x02, 0xe8, 0x58, 0x16, 0xfb,
+ 0xe8, 0xf1, 0x05, 0xe9, 0xd2, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06,
+ 0x04, 0x00, 0xff, 0xcb, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x08, 0x00,
+ 0xff, 0xfb, 0xe8, 0x53, 0x02, 0x33, 0xc0, 0x88, 0x86, 0xb8, 0x01, 0x88,
+ 0x86, 0xb9, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa2, 0x1a, 0x00, 0x89, 0x86,
+ 0x14, 0x02, 0x89, 0x86, 0x06, 0x02, 0x89, 0x86, 0x36, 0x02, 0x8e, 0x46,
+ 0x02, 0x26, 0xc7, 0x06, 0x0c, 0x00, 0x30, 0x01, 0x8d, 0x86, 0x52, 0x08,
+ 0x89, 0x86, 0xbc, 0x01, 0x89, 0x86, 0xbe, 0x01, 0xc7, 0x86, 0xc0, 0x01,
+ 0x01, 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0x54, 0x02,
+ 0xb9, 0x51, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0xd1, 0xd1, 0xf3, 0xaa, 0x8d,
+ 0xbe, 0x96, 0x05, 0xab, 0xab, 0xaa, 0x8d, 0xbe, 0x9e, 0x05, 0xab, 0xab,
+ 0xaa, 0x8d, 0xbe, 0xae, 0x02, 0xb9, 0x0b, 0x00, 0xf3, 0xab, 0xc7, 0x86,
+ 0xc4, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0xbb, 0xfe,
+ 0x04, 0xb9, 0x0b, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0xab, 0xab, 0x43,
+ 0x43, 0xe2, 0xf5, 0xbb, 0x14, 0x05, 0xb9, 0x0a, 0x00, 0x8b, 0x3f, 0x03,
+ 0xfd, 0xab, 0xab, 0x43, 0x43, 0xe2, 0xf6, 0xb8, 0x02, 0x00, 0x03, 0x06,
+ 0x34, 0x55, 0xe8, 0x3d, 0x05, 0x39, 0x06, 0x34, 0x55, 0x75, 0xf7, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x02, 0xc7, 0x86, 0x08, 0x02,
+ 0xc8, 0x00, 0xc7, 0x86, 0xf8, 0x01, 0xff, 0xff, 0xc7, 0x86, 0xf6, 0x01,
+ 0x07, 0x00, 0xc6, 0x86, 0x87, 0x02, 0x00, 0xe8, 0x01, 0x00, 0xc3, 0x8e,
+ 0x46, 0x02, 0x33, 0xc0, 0x89, 0x86, 0xb6, 0x01, 0x8e, 0x46, 0x02, 0x26,
+ 0xa3, 0x10, 0x00, 0x8b, 0x86, 0x52, 0x15, 0x26, 0xa3, 0x30, 0x00, 0x89,
+ 0x86, 0xb2, 0x01, 0xc1, 0xe8, 0x08, 0x26, 0xa3, 0x34, 0x00, 0x8b, 0x86,
+ 0x54, 0x15, 0x26, 0xa3, 0x38, 0x00, 0xc1, 0xe8, 0x08, 0x26, 0xa3, 0x36,
+ 0x00, 0x33, 0xc0, 0xc6, 0x86, 0x83, 0x02, 0x01, 0x8d, 0xb6, 0x52, 0x09,
+ 0xc7, 0x86, 0xa6, 0x01, 0x5a, 0x09, 0x01, 0xae, 0xa6, 0x01, 0x89, 0xb6,
+ 0xa8, 0x01, 0x89, 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30, 0x80, 0xc7, 0x44,
+ 0x04, 0x00, 0x00, 0xc6, 0x86, 0x86, 0x02, 0x01, 0xe8, 0x01, 0x09, 0xb8,
+ 0x00, 0x40, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x01, 0x74, 0x13, 0x25, 0xff,
+ 0x1f, 0x0d, 0x00, 0xa0, 0x83, 0xe0, 0xfd, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x0e, 0x0c, 0x00, 0x80, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x00, 0x00,
+ 0xa1, 0x34, 0x55, 0x83, 0xc0, 0x02, 0xe8, 0x85, 0x04, 0x39, 0x06, 0x34,
+ 0x55, 0x75, 0xf7, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x00, 0x00,
+ 0x08, 0xbe, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x02, 0x00, 0xc8, 0x8e,
+ 0x46, 0x02, 0x26, 0xc7, 0x06, 0x0c, 0x00, 0xa0, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0xc7, 0x06, 0x10, 0x00, 0x04, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x00, 0x00, 0x7f, 0xff, 0x90, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x0e, 0x00, 0x00, 0x80, 0x00, 0x90, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x00, 0x00, 0x7f, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x28,
+ 0x00, 0x18, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01,
+ 0xc3, 0xc6, 0x86, 0x0c, 0x01, 0x01, 0xc6, 0x86, 0x0d, 0x01, 0x00, 0xe8,
+ 0x06, 0x23, 0xa1, 0x34, 0x55, 0x83, 0xc0, 0x02, 0x0b, 0xc0, 0x0b, 0xc0,
+ 0x0b, 0xc0, 0x0b, 0xc0, 0x39, 0x06, 0x34, 0x55, 0x72, 0xf2, 0x80, 0xbe,
+ 0x0d, 0x01, 0x01, 0x74, 0x03, 0xf9, 0xeb, 0x01, 0xf8, 0xc6, 0x86, 0x0c,
+ 0x01, 0x00, 0xc3, 0xb8, 0x00, 0x00, 0x88, 0x86, 0x06, 0x01, 0x88, 0x86,
+ 0x07, 0x01, 0x88, 0x86, 0x08, 0x01, 0x88, 0x86, 0x09, 0x01, 0x89, 0x86,
+ 0x0a, 0x01, 0x88, 0x86, 0xb8, 0x01, 0x88, 0x86, 0xb9, 0x01, 0x88, 0x86,
+ 0xcd, 0x01, 0xa2, 0x8a, 0x56, 0xc3, 0x50, 0x53, 0x52, 0xc6, 0x46, 0x01,
+ 0x00, 0x32, 0xe4, 0x8a, 0x46, 0x00, 0xbb, 0x00, 0xfd, 0xbb, 0x00, 0xee,
+ 0x83, 0x3e, 0x58, 0x55, 0x20, 0x75, 0x03, 0xbb, 0x00, 0x7d, 0x81, 0xeb,
+ 0x00, 0x75, 0x81, 0xe3, 0x00, 0xff, 0x89, 0x9e, 0x56, 0x15, 0x81, 0xc3,
+ 0x00, 0x01, 0xf7, 0xe3, 0x05, 0x00, 0x75, 0x89, 0x86, 0x52, 0x15, 0x03,
+ 0x86, 0x56, 0x15, 0x48, 0x89, 0x86, 0x54, 0x15, 0x5a, 0x5b, 0x58, 0xc3,
+ 0x51, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfc, 0x8e, 0x46,
+ 0x02, 0x26, 0xf7, 0x06, 0x14, 0x00, 0x80, 0x00, 0x75, 0x1e, 0xb9, 0xf4,
+ 0x01, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x0c, 0x00, 0x00, 0x08, 0x8e,
+ 0x46, 0x02, 0x26, 0xf7, 0x06, 0x14, 0x00, 0x80, 0x00, 0x75, 0x05, 0xe8,
+ 0x54, 0x03, 0xe2, 0xe5, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x0c, 0x00,
+ 0xff, 0xf7, 0x59, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x02,
+ 0xc3, 0x50, 0x53, 0xc1, 0xe0, 0x05, 0x05, 0x00, 0x03, 0x8b, 0xd8, 0x8d,
+ 0x86, 0x00, 0x01, 0x89, 0x07, 0x8d, 0x86, 0xd0, 0x01, 0x89, 0x47, 0x02,
+ 0x8d, 0x86, 0xe0, 0x01, 0x89, 0x47, 0x04, 0x8d, 0x86, 0x58, 0x15, 0x89,
+ 0x47, 0x08, 0x8d, 0x86, 0x6c, 0x15, 0x89, 0x47, 0x06, 0x8d, 0x86, 0xbc,
+ 0x01, 0x89, 0x47, 0x0a, 0xc7, 0x47, 0x0c, 0x9c, 0x56, 0x8d, 0x86, 0x3c,
+ 0x02, 0x89, 0x47, 0x0e, 0x8d, 0x06, 0x34, 0x55, 0x89, 0x47, 0x10, 0xc7,
+ 0x47, 0x14, 0x00, 0x00, 0xc7, 0x47, 0x16, 0x00, 0x00, 0x8d, 0x86, 0xec,
+ 0x15, 0x89, 0x47, 0x18, 0x5b, 0x58, 0xc3, 0x8e, 0x46, 0x02, 0x80, 0xbe,
+ 0x2d, 0x01, 0x01, 0x75, 0x40, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10,
+ 0x00, 0xfb, 0x26, 0xa1, 0x38, 0x00, 0x2d, 0x00, 0x02, 0x3b, 0x86, 0x52,
+ 0x15, 0x73, 0x0c, 0x8b, 0xd8, 0x2b, 0x9e, 0x52, 0x15, 0x8b, 0x86, 0x54,
+ 0x15, 0x2b, 0xc3, 0x26, 0xa3, 0x6c, 0x00, 0x26, 0xa1, 0x12, 0x00, 0x89,
+ 0x86, 0x32, 0x01, 0x26, 0xc7, 0x06, 0x12, 0x00, 0x00, 0x01, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00, 0x05, 0xeb, 0x18, 0x8e, 0x46, 0x02,
+ 0x26, 0x83, 0x26, 0x10, 0x00, 0xfe, 0x8b, 0x86, 0x32, 0x01, 0x26, 0xa3,
+ 0x12, 0x00, 0xb8, 0xff, 0xff, 0x26, 0xa3, 0x6c, 0x00, 0xc3, 0x50, 0xf7,
+ 0x86, 0xf6, 0x00, 0x02, 0x00, 0x75, 0x02, 0xeb, 0x4b, 0xf6, 0x86, 0x60,
+ 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x74, 0x3d, 0xf6,
+ 0x86, 0x85, 0x02, 0x01, 0x74, 0x36, 0xc6, 0x86, 0x85, 0x02, 0x00, 0x8b,
+ 0x86, 0x06, 0x02, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x40, 0x74, 0x03, 0x25,
+ 0xff, 0xaf, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x20, 0x74, 0x03, 0x25, 0xff,
+ 0xdf, 0x89, 0x86, 0x06, 0x02, 0x3b, 0x86, 0x36, 0x02, 0x74, 0x0d, 0x89,
+ 0x86, 0x36, 0x02, 0x81, 0xa6, 0x36, 0x02, 0x7f, 0xdf, 0xe8, 0x8a, 0x38,
+ 0x58, 0xc3, 0x57, 0x56, 0x50, 0x8b, 0x86, 0xda, 0x02, 0xa9, 0xff, 0xff,
+ 0x74, 0x40, 0x8d, 0xbe, 0xd0, 0x02, 0x8d, 0xb6, 0x96, 0x05, 0xb9, 0x0a,
+ 0x00, 0x83, 0xf9, 0x05, 0x75, 0x04, 0x8d, 0xb6, 0x9e, 0x05, 0xa9, 0x01,
+ 0x00, 0x74, 0x1e, 0x80, 0x3d, 0xff, 0x74, 0x12, 0xfe, 0x05, 0x80, 0x3d,
+ 0xff, 0x75, 0x0b, 0x81, 0x8e, 0x06, 0x02, 0x80, 0x00, 0xc6, 0x86, 0x85,
+ 0x02, 0x01, 0x80, 0x3c, 0xff, 0x74, 0x02, 0xfe, 0x04, 0xd1, 0xe8, 0x47,
+ 0x46, 0xe2, 0xce, 0xe8, 0x0a, 0x00, 0xc7, 0x86, 0xda, 0x02, 0x00, 0x00,
+ 0x58, 0x5e, 0x5f, 0xc3, 0xf6, 0x86, 0x56, 0x02, 0x01, 0x75, 0x27, 0xf6,
+ 0x86, 0xaa, 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0x60, 0x02, 0x01, 0x74,
+ 0x19, 0xc6, 0x86, 0x56, 0x02, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80,
+ 0x75, 0x0c, 0xbe, 0xa5, 0x45, 0xe8, 0xb8, 0x03, 0xc7, 0x86, 0xb6, 0x02,
+ 0x04, 0x00, 0xc3, 0xf7, 0x86, 0x58, 0x15, 0x00, 0x80, 0x75, 0x02, 0xeb,
+ 0x26, 0x8b, 0xb6, 0x60, 0x01, 0x3b, 0xb6, 0x5e, 0x01, 0x74, 0x1c, 0x46,
+ 0x83, 0xe6, 0x07, 0x89, 0xb6, 0x60, 0x01, 0x8b, 0xce, 0xd1, 0xe1, 0xd1,
+ 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x8b, 0x04, 0x8b, 0x54, 0x02,
+ 0xe9, 0x7a, 0x38, 0xc3, 0xbb, 0x00, 0x03, 0x83, 0x7f, 0x12, 0x00, 0x74,
+ 0x08, 0xe8, 0xf5, 0x37, 0xc7, 0x47, 0x12, 0x00, 0x00, 0xc3, 0x53, 0x50,
+ 0x33, 0xc0, 0x88, 0x86, 0xcb, 0x01, 0xa3, 0x9a, 0x56, 0xbb, 0x9c, 0x56,
+ 0x89, 0x1e, 0x92, 0x56, 0x89, 0x07, 0x89, 0x47, 0x02, 0x89, 0x47, 0x04,
+ 0xa3, 0x94, 0x56, 0xa3, 0x96, 0x56, 0xa3, 0x98, 0x56, 0x58, 0x5b, 0xc3,
+ 0x50, 0x8a, 0xe0, 0xe4, 0x12, 0xf6, 0xd4, 0x22, 0xc4, 0xe6, 0x12, 0x58,
+ 0xc3, 0xc6, 0x46, 0x06, 0x00, 0xc6, 0x46, 0x07, 0x00, 0xc6, 0x46, 0x08,
+ 0x00, 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x86, 0x6c, 0x15, 0x80, 0x8d, 0xbe,
+ 0x0a, 0x03, 0x8c, 0xd8, 0x8e, 0xc0, 0xab, 0xab, 0xab, 0xc3, 0x51, 0x53,
+ 0xb9, 0x10, 0x00, 0xd1, 0xe0, 0xd1, 0xdb, 0xe2, 0xfa, 0x8b, 0xc3, 0x86,
+ 0xc4, 0x5b, 0x59, 0xc3, 0x50, 0x53, 0x51, 0x52, 0x57, 0x56, 0x8d, 0x1e,
+ 0x68, 0x05, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0xff, 0x06, 0x4e, 0x00, 0xc7,
+ 0x06, 0x50, 0x55, 0x00, 0x00, 0xc6, 0x06, 0x54, 0x55, 0x00, 0xc7, 0x06,
+ 0x58, 0x55, 0x20, 0x00, 0xbb, 0x00, 0x0d, 0x8b, 0x07, 0x81, 0xc3, 0x00,
+ 0x80, 0x3b, 0x07, 0x74, 0x06, 0xc7, 0x06, 0x58, 0x55, 0x40, 0x00, 0x8d,
+ 0x3e, 0x52, 0x55, 0xb8, 0xac, 0x5d, 0x89, 0x05, 0x06, 0x33, 0xc0, 0x8e,
+ 0xc0, 0xa3, 0x34, 0x55, 0xa3, 0x36, 0x55, 0xa3, 0x38, 0x55, 0x8d, 0x3e,
+ 0x48, 0x55, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x8d, 0x3e, 0x4c,
+ 0x55, 0xb9, 0x04, 0x00, 0xd1, 0xe9, 0xf3, 0xab, 0x07, 0x8b, 0xd4, 0xb9,
+ 0x01, 0x00, 0xbb, 0x00, 0x00, 0xbd, 0xac, 0x5d, 0x88, 0x5e, 0x00, 0x8b,
+ 0xc3, 0xd1, 0xe0, 0xd1, 0xe0, 0x05, 0x40, 0x60, 0x89, 0x46, 0x02, 0xe8,
+ 0xb0, 0xfc, 0xe8, 0xe2, 0x00, 0x8b, 0xc5, 0x05, 0x4e, 0x08, 0x89, 0x86,
+ 0x50, 0x08, 0x83, 0xc0, 0x02, 0x8b, 0xe0, 0x68, 0xfc, 0x05, 0x81, 0xc5,
+ 0xec, 0x16, 0x43, 0xe2, 0xd3, 0x8b, 0xe2, 0x33, 0xed, 0x5e, 0x5f, 0x5a,
+ 0x59, 0x5b, 0x58, 0xc3, 0x3e, 0x89, 0xa6, 0x50, 0x08, 0x33, 0xed, 0xbc,
+ 0x88, 0x56, 0xfa, 0x83, 0x0e, 0x4c, 0x55, 0x00, 0x74, 0x0d, 0x8b, 0x36,
+ 0x4c, 0x55, 0x8b, 0x4c, 0x04, 0xe8, 0xea, 0x03, 0xfb, 0xff, 0xd1, 0xfb,
+ 0x32, 0xff, 0x8a, 0x1e, 0x50, 0x55, 0x80, 0x8f, 0x56, 0x55, 0x00, 0x75,
+ 0x21, 0xd1, 0xe3, 0x8b, 0xaf, 0x52, 0x55, 0x81, 0xbe, 0x4e, 0x06, 0xa5,
+ 0xa5, 0x74, 0x0c, 0xd1, 0xeb, 0xc6, 0x87, 0x56, 0x55, 0x01, 0xe8, 0x2c,
+ 0x06, 0xeb, 0x07, 0x8b, 0x86, 0x50, 0x08, 0x8b, 0xe0, 0xc3, 0xeb, 0xb5,
+ 0xeb, 0xae, 0x60, 0x9c, 0xe8, 0xa9, 0xff, 0x0e, 0xe8, 0x02, 0x00, 0xeb,
+ 0x01, 0xcf, 0x61, 0xc3, 0x50, 0xfa, 0x8b, 0x76, 0x1a, 0xf7, 0xc6, 0xff,
+ 0xff, 0x74, 0x10, 0x8b, 0x04, 0x89, 0x46, 0x1a, 0x0b, 0xc0, 0x75, 0x03,
+ 0x89, 0x46, 0x1c, 0xc7, 0x04, 0x00, 0x00, 0xfb, 0x58, 0xc3, 0x53, 0xfa,
+ 0xc7, 0x04, 0x00, 0x00, 0x8b, 0x5d, 0x02, 0x89, 0x37, 0x89, 0x75, 0x02,
+ 0x83, 0x3d, 0x00, 0x75, 0x02, 0x89, 0x35, 0xfb, 0x5b, 0xc3, 0x50, 0xfa,
+ 0x8b, 0x35, 0x8b, 0x04, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x03, 0x89, 0x45,
+ 0x02, 0xfb, 0x58, 0xc3, 0x50, 0xfa, 0x8b, 0x46, 0x1a, 0x89, 0x04, 0x89,
+ 0x76, 0x1a, 0xf7, 0x46, 0x1a, 0xff, 0xff, 0x75, 0x03, 0x89, 0x76, 0x1a,
+ 0xfb, 0x58, 0xc3, 0x50, 0x53, 0x51, 0x8b, 0xc5, 0x83, 0xc0, 0x1e, 0x89,
+ 0x46, 0x1a, 0x83, 0xc0, 0x48, 0x89, 0x46, 0x1c, 0xb9, 0x09, 0x00, 0x8b,
+ 0xdd, 0x8b, 0xc5, 0x83, 0xc0, 0x26, 0x89, 0x47, 0x1e, 0x83, 0xc3, 0x08,
+ 0x83, 0xc0, 0x08, 0xe2, 0xf5, 0x59, 0x5b, 0x58, 0xc3, 0x90, 0x60, 0x06,
+ 0x1e, 0xfa, 0x33, 0xdb, 0x8e, 0xdb, 0x83, 0x06, 0x34, 0x55, 0x01, 0x73,
+ 0x04, 0x11, 0x1e, 0x36, 0x55, 0xb9, 0x01, 0x00, 0x8b, 0xaf, 0x52, 0x55,
+ 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x03, 0xe8, 0xda, 0x3e, 0xf7, 0x06,
+ 0x34, 0x55, 0x07, 0x00, 0x74, 0x10, 0x80, 0xbe, 0x2d, 0x01, 0x01, 0x75,
+ 0x09, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00, 0x01, 0xf7, 0x86,
+ 0xa3, 0x02, 0x01, 0x00, 0x74, 0x30, 0xfe, 0x86, 0x6b, 0x01, 0x80, 0xbe,
+ 0x6b, 0x01, 0x02, 0x73, 0x02, 0xeb, 0x23, 0xc6, 0x86, 0x6b, 0x01, 0x00,
+ 0xf7, 0x86, 0x1c, 0x01, 0x01, 0x00, 0x75, 0x0a, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x04, 0x00, 0x32, 0xfe, 0x81, 0xa6, 0x18, 0x01, 0x32, 0xfe,
+ 0xc7, 0x86, 0xa3, 0x02, 0x00, 0x00, 0xc6, 0x86, 0x6a, 0x01, 0x00, 0x8e,
+ 0x46, 0x02, 0x26, 0xa1, 0x08, 0x00, 0x25, 0x00, 0x02, 0x74, 0x03, 0xe8,
+ 0x1d, 0x12, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x90, 0x3e,
+ 0x8b, 0x86, 0xf6, 0x00, 0x25, 0xd0, 0xe5, 0x89, 0x86, 0x2c, 0x02, 0x8a,
+ 0x46, 0x08, 0x3c, 0x06, 0x74, 0x08, 0x3c, 0x0a, 0x74, 0x04, 0x3c, 0x18,
+ 0x75, 0x04, 0xff, 0x86, 0x46, 0x02, 0x83, 0xc3, 0x02, 0x49, 0x74, 0x03,
+ 0xe9, 0x5d, 0xff, 0xf7, 0x06, 0x48, 0x55, 0xff, 0xff, 0x74, 0x1f, 0xff,
+ 0x0e, 0x38, 0x55, 0x75, 0x19, 0xe8, 0x14, 0x02, 0x8b, 0x1e, 0x48, 0x55,
+ 0x0b, 0xdb, 0x74, 0x0e, 0x8b, 0x47, 0x08, 0xa3, 0x38, 0x55, 0xf7, 0x06,
+ 0x38, 0x55, 0xff, 0xff, 0x74, 0xe7, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58,
+ 0x1f, 0x07, 0x61, 0xcf, 0x60, 0x06, 0x1e, 0xfa, 0x8d, 0x36, 0x3c, 0x55,
+ 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0xe8, 0x17, 0x42, 0xa0, 0x3a,
+ 0x55, 0xfe, 0xc0, 0x3c, 0x04, 0x72, 0x08, 0xc6, 0x06, 0x3a, 0x55, 0x00,
+ 0xe9, 0xf7, 0xfe, 0xa2, 0x3a, 0x55, 0xeb, 0xce, 0x50, 0x57, 0x56, 0xfa,
+ 0x8d, 0x36, 0x40, 0x55, 0x83, 0x04, 0x01, 0x83, 0x54, 0x02, 0x00, 0x80,
+ 0x3e, 0x8a, 0x56, 0x01, 0x75, 0x0d, 0x8b, 0x36, 0x8c, 0x56, 0x83, 0xfe,
+ 0x14, 0x77, 0x0e, 0xff, 0x94, 0x52, 0x05, 0x50, 0xb0, 0xa0, 0xe6, 0x10,
+ 0x58, 0x5e, 0x5f, 0x58, 0xcf, 0xe8, 0xc6, 0x44, 0xeb, 0xf1, 0x57, 0x56,
+ 0x50, 0xfa, 0x8d, 0x36, 0x44, 0x55, 0x83, 0x04, 0x01, 0x83, 0x54, 0x02,
+ 0x00, 0x80, 0x3e, 0x8a, 0x56, 0x01, 0x75, 0x0d, 0x8b, 0x36, 0x8c, 0x56,
+ 0x83, 0xfe, 0x14, 0x77, 0x0e, 0xff, 0x94, 0x52, 0x05, 0x50, 0xb0, 0xa0,
+ 0xe6, 0x10, 0x58, 0x58, 0x5e, 0x5f, 0xcf, 0xe8, 0x94, 0x44, 0xeb, 0xf1,
+ 0x50, 0x53, 0x51, 0x57, 0xe8, 0xab, 0x00, 0xfa, 0x8b, 0x3c, 0x03, 0xfd,
+ 0x89, 0x6d, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x45, 0x04, 0x8b, 0x44, 0x04,
+ 0x89, 0x45, 0x06, 0x0b, 0xc0, 0x75, 0x0e, 0x8b, 0x86, 0x08, 0x02, 0x0b,
+ 0xc0, 0x75, 0x03, 0xb8, 0xc8, 0x00, 0x89, 0x45, 0x06, 0xf7, 0x06, 0x48,
+ 0x55, 0xff, 0xff, 0x75, 0x14, 0x89, 0x3e, 0x48, 0x55, 0x89, 0x3e, 0x4a,
+ 0x55, 0xc7, 0x05, 0x00, 0x00, 0x89, 0x45, 0x08, 0xa3, 0x38, 0x55, 0xeb,
+ 0x63, 0x8b, 0x3e, 0x48, 0x55, 0x8b, 0x0e, 0x38, 0x55, 0x33, 0xdb, 0x3b,
+ 0xc8, 0x72, 0x35, 0x0b, 0xdb, 0x75, 0x17, 0x2b, 0xc8, 0x89, 0x4d, 0x08,
+ 0x8b, 0x34, 0x03, 0xf5, 0x89, 0x44, 0x08, 0x89, 0x3c, 0x89, 0x36, 0x48,
+ 0x55, 0xa3, 0x38, 0x55, 0xeb, 0x3a, 0x2b, 0x4d, 0x08, 0x2b, 0xc1, 0x8b,
+ 0x34, 0x03, 0xf5, 0x89, 0x44, 0x08, 0x8b, 0x4d, 0x08, 0x2b, 0xc8, 0x89,
+ 0x4d, 0x08, 0x89, 0x37, 0x89, 0x3c, 0xeb, 0x20, 0x8b, 0xdf, 0x8b, 0x3d,
+ 0x0b, 0xff, 0x74, 0x05, 0x03, 0x4d, 0x08, 0xeb, 0xba, 0x2b, 0xc1, 0x8b,
+ 0x34, 0x03, 0xf5, 0x89, 0x44, 0x08, 0x89, 0x37, 0xc7, 0x04, 0x00, 0x00,
+ 0x89, 0x36, 0x4a, 0x55, 0xfb, 0x5f, 0x59, 0x5b, 0x58, 0xc3, 0x57, 0x53,
+ 0x50, 0x56, 0xfa, 0x8b, 0x1e, 0x48, 0x55, 0x33, 0xff, 0x8b, 0x34, 0x03,
+ 0xf5, 0x83, 0x7c, 0x02, 0xff, 0x74, 0x4b, 0x3b, 0xde, 0x75, 0x49, 0x0b,
+ 0xff, 0x74, 0x18, 0x8b, 0x07, 0x89, 0x05, 0x0b, 0xc0, 0x75, 0x06, 0x89,
+ 0x3e, 0x4a, 0x55, 0xeb, 0x2c, 0x8b, 0x4f, 0x08, 0x8b, 0xf8, 0x01, 0x4d,
+ 0x08, 0xeb, 0x22, 0x8b, 0x3f, 0x89, 0x3e, 0x48, 0x55, 0x0b, 0xff, 0x75,
+ 0x0c, 0x89, 0x3e, 0x4a, 0x55, 0xc7, 0x06, 0x38, 0x55, 0xff, 0xff, 0xeb,
+ 0x0c, 0xa1, 0x38, 0x55, 0x01, 0x45, 0x08, 0x8b, 0x45, 0x08, 0xa3, 0x38,
+ 0x55, 0xc7, 0x47, 0x02, 0xff, 0xff, 0xc7, 0x07, 0x00, 0x00, 0xeb, 0x4e,
+ 0x83, 0xcb, 0x00, 0x74, 0x06, 0x8b, 0xfb, 0x8b, 0x1f, 0xeb, 0xa8, 0x83,
+ 0xfd, 0x00, 0x75, 0x05, 0xbb, 0x4c, 0x55, 0xeb, 0x04, 0x8d, 0x9e, 0xf0,
+ 0x00, 0x8b, 0x1f, 0x83, 0xfb, 0x00, 0x74, 0x2e, 0x3b, 0xde, 0x75, 0x05,
+ 0xe8, 0x6b, 0x00, 0xeb, 0x25, 0x8b, 0xfb, 0x8b, 0x1f, 0x83, 0xcb, 0x00,
+ 0x74, 0x1c, 0x3b, 0xde, 0x75, 0xf3, 0x8b, 0x07, 0x89, 0x05, 0x83, 0xc8,
+ 0x00, 0x75, 0x04, 0x89, 0xbe, 0xf2, 0x00, 0xc7, 0x07, 0x00, 0x00, 0xc7,
+ 0x47, 0x02, 0xff, 0xff, 0xeb, 0x00, 0xfb, 0x5e, 0x58, 0x5b, 0x5f, 0xc3,
+ 0x50, 0x53, 0x56, 0x55, 0x8b, 0x1e, 0x48, 0x55, 0x8b, 0x6f, 0x02, 0x0b,
+ 0xed, 0x74, 0x06, 0x81, 0xc5, 0xf0, 0x00, 0xeb, 0x03, 0xbd, 0x4c, 0x55,
+ 0x8b, 0x76, 0x02, 0x8b, 0x07, 0xa3, 0x48, 0x55, 0x0b, 0xc0, 0x75, 0x03,
+ 0xa3, 0x4a, 0x55, 0x89, 0x5e, 0x02, 0x89, 0x1c, 0xc7, 0x07, 0x00, 0x00,
+ 0x83, 0x4e, 0x00, 0x00, 0x75, 0x03, 0x89, 0x5e, 0x00, 0x5d, 0x5e, 0x5b,
+ 0x58, 0xc3, 0x55, 0x53, 0x50, 0x0b, 0xed, 0x74, 0x06, 0x81, 0xc5, 0xf0,
+ 0x00, 0xeb, 0x03, 0xbd, 0x4c, 0x55, 0x8b, 0x5e, 0x00, 0xc7, 0x47, 0x02,
+ 0xff, 0xff, 0x8b, 0x07, 0xc7, 0x07, 0x00, 0x00, 0x8b, 0xd8, 0x89, 0x5e,
+ 0x00, 0x0b, 0xdb, 0x75, 0x03, 0x89, 0x5e, 0x02, 0x58, 0x5b, 0x5d, 0xc3,
+ 0x50, 0x53, 0x51, 0x57, 0x56, 0xfa, 0x8b, 0x1e, 0x48, 0x55, 0x33, 0xff,
+ 0x83, 0xcb, 0x00, 0x74, 0x54, 0x8b, 0xc3, 0x39, 0x6f, 0x02, 0x75, 0x47,
+ 0x0b, 0xff, 0x74, 0x18, 0x8b, 0x37, 0x89, 0x35, 0x8b, 0xc7, 0x0b, 0xf6,
+ 0x75, 0x06, 0x89, 0x3e, 0x4a, 0x55, 0xeb, 0x2c, 0x8b, 0x4f, 0x08, 0x01,
+ 0x4c, 0x08, 0xeb, 0x24, 0x8b, 0x37, 0x89, 0x36, 0x48, 0x55, 0x0b, 0xf6,
+ 0x75, 0x0c, 0x89, 0x36, 0x4a, 0x55, 0xc7, 0x06, 0x38, 0x55, 0xff, 0xff,
+ 0xeb, 0x0e, 0xa1, 0x38, 0x55, 0x01, 0x44, 0x08, 0x8b, 0x44, 0x08, 0xa3,
+ 0x38, 0x55, 0x33, 0xc0, 0xc7, 0x47, 0x02, 0xff, 0xff, 0xeb, 0x00, 0x8b,
+ 0xf8, 0x8b, 0x1f, 0xeb, 0xa7, 0xfb, 0x5e, 0x5f, 0x59, 0x5b, 0x58, 0xc3,
+ 0x50, 0x53, 0x51, 0x52, 0x8a, 0x8e, 0xa8, 0x02, 0x8e, 0x46, 0x02, 0x26,
+ 0xa1, 0x00, 0x00, 0x8b, 0xd8, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x01, 0x74,
+ 0x10, 0x83, 0xe0, 0xfd, 0xc6, 0x86, 0x79, 0x02, 0x01, 0x25, 0xff, 0x1f,
+ 0x0d, 0x00, 0x80, 0xeb, 0x0e, 0x25, 0xff, 0x1f, 0x0d, 0x00, 0x20, 0x83,
+ 0xc8, 0x02, 0xc6, 0x86, 0x79, 0x02, 0x00, 0xe8, 0x67, 0x02, 0x0d, 0x00,
+ 0x08, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x03, 0x25, 0xff, 0xf7, 0x33,
+ 0xd8, 0x74, 0x0f, 0x26, 0xa3, 0x00, 0x00, 0xf7, 0xc3, 0x02, 0x00, 0x74,
+ 0x05, 0xc6, 0x06, 0x0a, 0x13, 0x01, 0x26, 0xa1, 0x0c, 0x00, 0x8b, 0xd8,
+ 0xf7, 0x86, 0x12, 0x01, 0x10, 0x00, 0x74, 0x05, 0x0d, 0x00, 0x10, 0xeb,
+ 0x03, 0x25, 0xff, 0xef, 0x8a, 0xae, 0x69, 0x02, 0x80, 0xf9, 0x01, 0x75,
+ 0x04, 0x8a, 0xae, 0x6a, 0x02, 0xf6, 0xc5, 0x01, 0x74, 0x05, 0x83, 0xc8,
+ 0x10, 0xeb, 0x03, 0x83, 0xe0, 0xef, 0xf6, 0x86, 0x6b, 0x02, 0x01, 0x74,
+ 0x0a, 0x83, 0xc8, 0x20, 0xc6, 0x86, 0x7a, 0x02, 0x00, 0xeb, 0x08, 0x83,
+ 0xe0, 0xdf, 0xc6, 0x86, 0x7a, 0x02, 0x01, 0xf6, 0x86, 0x54, 0x02, 0x01,
+ 0x74, 0x0a, 0xc6, 0x86, 0x7a, 0x02, 0x00, 0x83, 0xc8, 0x40, 0xeb, 0x03,
+ 0x83, 0xe0, 0xbf, 0xf6, 0x86, 0x79, 0x02, 0x01, 0x74, 0x05, 0x0d, 0x80,
+ 0x00, 0xeb, 0x03, 0x25, 0x7f, 0xff, 0xf6, 0x86, 0x78, 0x02, 0x01, 0x74,
+ 0x05, 0x0d, 0x00, 0x01, 0xeb, 0x03, 0x25, 0xff, 0xfe, 0xf6, 0x86, 0x7a,
+ 0x02, 0x01, 0x74, 0x05, 0x0d, 0x00, 0x20, 0xeb, 0x03, 0x25, 0xff, 0xdf,
+ 0x33, 0xd8, 0x74, 0x12, 0xf7, 0xc3, 0x20, 0x00, 0x74, 0x05, 0xc6, 0x06,
+ 0x0a, 0x13, 0x01, 0x25, 0xff, 0xf7, 0x26, 0xa3, 0x0c, 0x00, 0x26, 0xa1,
+ 0x10, 0x00, 0x8b, 0xd8, 0x33, 0xd8, 0x74, 0x04, 0x26, 0xa3, 0x10, 0x00,
+ 0xf6, 0x06, 0x0a, 0x13, 0x01, 0x74, 0x1e, 0xc6, 0x06, 0x0a, 0x13, 0x00,
+ 0x26, 0x81, 0x26, 0x00, 0x00, 0x7f, 0xff, 0x90, 0x90, 0x26, 0x81, 0x0e,
+ 0x00, 0x00, 0x80, 0x00, 0x90, 0x90, 0x26, 0x81, 0x26, 0x00, 0x00, 0x7f,
+ 0xff, 0x5a, 0x59, 0x5b, 0x58, 0xc3, 0x00, 0x8e, 0x46, 0x02, 0xf7, 0x86,
+ 0xf4, 0x00, 0x04, 0x00, 0x74, 0x0b, 0xc6, 0x06, 0x8a, 0x56, 0x01, 0x26,
+ 0x83, 0x0e, 0x02, 0x00, 0x02, 0xc6, 0x86, 0xab, 0x02, 0x00, 0xc6, 0x86,
+ 0xac, 0x02, 0x00, 0x81, 0xa6, 0xf6, 0x00, 0xff, 0xfb, 0xa8, 0x01, 0x74,
+ 0x19, 0x81, 0x8e, 0xf6, 0x00, 0x00, 0x04, 0x26, 0x83, 0x0e, 0x02, 0x00,
+ 0x20, 0x26, 0x83, 0x26, 0x02, 0x00, 0xef, 0xc6, 0x86, 0xac, 0x02, 0x01,
+ 0xeb, 0x4d, 0xa8, 0x02, 0x74, 0x1f, 0x26, 0x83, 0x26, 0x02, 0x00, 0xcf,
+ 0xf7, 0x86, 0xf4, 0x00, 0x04, 0x00, 0x75, 0x0d, 0xf7, 0x86, 0x12, 0x01,
+ 0x00, 0x84, 0x75, 0x05, 0xc6, 0x86, 0xab, 0x02, 0x01, 0xb0, 0x02, 0xeb,
+ 0x2a, 0xa8, 0x04, 0x74, 0x0e, 0x26, 0x83, 0x0e, 0x02, 0x00, 0x20, 0x26,
+ 0x83, 0x26, 0x02, 0x00, 0xef, 0xeb, 0x18, 0xa8, 0x08, 0x74, 0x08, 0x26,
+ 0x83, 0x0e, 0x02, 0x00, 0x30, 0xeb, 0x0c, 0xa8, 0x10, 0x74, 0x08, 0x26,
+ 0x83, 0x0e, 0x02, 0x00, 0x30, 0xeb, 0x00, 0xf6, 0x06, 0x8a, 0x56, 0x01,
+ 0x74, 0x06, 0x26, 0x83, 0x26, 0x02, 0x00, 0xcf, 0xc3, 0xc3, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x0e, 0x0c, 0x00, 0x00, 0x01, 0x90, 0x90, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x26, 0x0c, 0x00, 0xff, 0xfe, 0xc3, 0x8e, 0x46, 0x02,
+ 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x0f, 0x80, 0xbe, 0xab, 0x02, 0x01,
+ 0x75, 0x10, 0x26, 0x83, 0x0e, 0x02, 0x00, 0x02, 0xeb, 0x08, 0xc6, 0x86,
+ 0x6c, 0x01, 0x01, 0xe8, 0x9c, 0x3f, 0xc3, 0x8e, 0x46, 0x02, 0xf7, 0x86,
+ 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81, 0x26, 0x02, 0x00, 0xff,
+ 0xef, 0xeb, 0x07, 0x26, 0x81, 0x0e, 0x02, 0x00, 0x00, 0x10, 0xc3, 0x8e,
+ 0x46, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x09, 0x26, 0x81,
+ 0x0e, 0x02, 0x00, 0x00, 0x10, 0xeb, 0x07, 0x26, 0x81, 0x26, 0x02, 0x00,
+ 0xff, 0xef, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x02, 0x00, 0x00,
+ 0x80, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x02, 0x00, 0xff, 0x7f,
+ 0xc3, 0xf7, 0x86, 0xf4, 0x00, 0x08, 0x00, 0x74, 0x13, 0xe8, 0xdf, 0xff,
+ 0xeb, 0x3a, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x1e, 0x80, 0x7e, 0x06, 0x48,
+ 0x74, 0x24, 0xeb, 0x2c, 0xe8, 0xd7, 0xff, 0x8e, 0x46, 0x02, 0xf7, 0x86,
+ 0xf4, 0x00, 0x10, 0x00, 0x75, 0xe4, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x01,
+ 0x75, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x02, 0x00, 0x00, 0x40,
+ 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x02, 0x00, 0xff, 0xbf,
+ 0xc3, 0x83, 0xe0, 0xf7, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x04, 0x74, 0x03,
+ 0x83, 0xc8, 0x08, 0xc3, 0x53, 0x40, 0x03, 0x06, 0x34, 0x55, 0x8b, 0xd8,
+ 0xe8, 0xf7, 0xf8, 0xa1, 0x34, 0x55, 0x3b, 0xc3, 0x75, 0xf6, 0x5b, 0xc3,
+ 0xe8, 0xfb, 0xf2, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02,
+ 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc6, 0x86,
+ 0x78, 0x02, 0x00, 0xe8, 0x1e, 0xfd, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06,
+ 0x10, 0x00, 0x04, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00,
+ 0x04, 0x33, 0xc0, 0x88, 0x86, 0x88, 0x02, 0x88, 0x86, 0x89, 0x02, 0xc6,
+ 0x86, 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64, 0x01, 0xf8, 0x05, 0xc6, 0x86,
+ 0x69, 0x01, 0x02, 0xbe, 0x0b, 0x46, 0xe8, 0xab, 0xfa, 0xbe, 0x05, 0x46,
+ 0xe8, 0xa5, 0xfa, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04, 0x00, 0x32,
+ 0xfe, 0xc3, 0xc6, 0x86, 0x63, 0x01, 0x00, 0x80, 0xbe, 0x62, 0x01, 0x01,
+ 0x75, 0x0d, 0xe8, 0x8d, 0xf2, 0xe8, 0x7d, 0x2c, 0xc6, 0x46, 0x07, 0x00,
+ 0xe9, 0xa7, 0x00, 0xbe, 0xb7, 0x45, 0xe8, 0x2d, 0xfb, 0xbe, 0x05, 0x46,
+ 0xe8, 0x27, 0xfb, 0xc6, 0x86, 0x88, 0x02, 0x01, 0x80, 0x7e, 0x06, 0x02,
+ 0x74, 0x08, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x09, 0xeb, 0x0d, 0xc6, 0x46,
+ 0x07, 0x04, 0xe9, 0x81, 0x00, 0xc6, 0x46, 0x07, 0x46, 0xeb, 0x7b, 0x80,
+ 0x7e, 0x08, 0x08, 0x75, 0xf8, 0xc6, 0x86, 0x81, 0x02, 0x01, 0xc6, 0x86,
+ 0x69, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xc6, 0x86, 0x5c, 0x02,
+ 0x00, 0xc6, 0x86, 0x5f, 0x02, 0x01, 0xc6, 0x86, 0x68, 0x02, 0x01, 0xc6,
+ 0x86, 0x6c, 0x02, 0x01, 0xf6, 0x86, 0x58, 0x02, 0x01, 0x74, 0x17, 0x80,
+ 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x2c, 0xc6, 0x46, 0x09, 0x0a, 0xc6, 0x86,
+ 0x6b, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x01, 0xeb, 0x1c, 0xf6, 0x86,
+ 0x59, 0x02, 0x01, 0x74, 0x15, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x0e,
+ 0xc6, 0x46, 0x09, 0x06, 0xc6, 0x86, 0x58, 0x02, 0x01, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xe8, 0x18, 0xfe, 0xe8, 0x2c, 0xfc, 0xbe, 0xed, 0x45, 0xe8,
+ 0xe6, 0xf9, 0xbe, 0xab, 0x45, 0xe8, 0xe0, 0xf9, 0xbe, 0xf3, 0x45, 0xe8,
+ 0xda, 0xf9, 0xc3, 0x90, 0xc6, 0x46, 0x09, 0x00, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x04, 0x00, 0x32, 0xfe, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x02,
+ 0x75, 0x05, 0xc6, 0x86, 0x92, 0x02, 0x01, 0xe8, 0x30, 0x08, 0xc7, 0x86,
+ 0xc4, 0x01, 0x14, 0x00, 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, 0xbe, 0xf9,
+ 0x45, 0xe8, 0xa8, 0xf9, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xc6, 0x86, 0x68, 0x02, 0x01, 0xc6, 0x86, 0x6c, 0x02, 0x01,
+ 0xe8, 0xd1, 0xfb, 0xb8, 0x01, 0x00, 0xe8, 0x7b, 0xfe, 0xe8, 0xb1, 0xfd,
+ 0xbe, 0xb1, 0x45, 0xe8, 0x82, 0xf9, 0xbe, 0xed, 0x45, 0xe8, 0x7c, 0xf9,
+ 0x33, 0xc0, 0x89, 0x86, 0xee, 0x01, 0x89, 0x86, 0xf0, 0x01, 0x89, 0x86,
+ 0xf2, 0x01, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02,
+ 0x26, 0x81, 0x26, 0x04, 0x00, 0xff, 0xf7, 0xf7, 0x86, 0xf6, 0x00, 0x00,
+ 0x20, 0x74, 0x10, 0xbe, 0xf3, 0x45, 0xe8, 0x4f, 0xf9, 0xc6, 0x86, 0x5d,
+ 0x02, 0x00, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xc3, 0xc3, 0x90, 0xc6, 0x86,
+ 0x57, 0x02, 0x01, 0xc7, 0x86, 0xc4, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc6,
+ 0x02, 0x00, 0x00, 0xbe, 0xb1, 0x45, 0xe8, 0x2b, 0xf9, 0xe8, 0xbf, 0x12,
+ 0xc3, 0x90, 0xc6, 0x86, 0x5b, 0x02, 0x01, 0xf6, 0x86, 0x84, 0x02, 0x01,
+ 0x74, 0x08, 0xe8, 0xb0, 0x14, 0xc6, 0x86, 0x84, 0x02, 0x00, 0xbe, 0xb1,
+ 0x45, 0xe8, 0x0c, 0xf9, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x04, 0xc6,
+ 0x46, 0x07, 0x0c, 0xc3, 0xbe, 0xb1, 0x45, 0xe8, 0xfa, 0xf8, 0xbe, 0xcf,
+ 0x45, 0xe8, 0xf4, 0xf8, 0xc7, 0x86, 0xb8, 0x02, 0x01, 0x00, 0xc7, 0x86,
+ 0xba, 0x02, 0x01, 0x00, 0xe8, 0xf6, 0x12, 0xc3, 0xc7, 0x86, 0xc2, 0x02,
+ 0x00, 0x00, 0xc7, 0x86, 0xc4, 0x01, 0x14, 0x00, 0xc6, 0x86, 0x08, 0x01,
+ 0x00, 0x81, 0xa6, 0x06, 0x02, 0xdf, 0xbf, 0xc6, 0x86, 0x60, 0x02, 0x01,
+ 0xc7, 0x86, 0x26, 0x02, 0xff, 0xff, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x20,
+ 0x75, 0x18, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x84, 0x75, 0x10, 0xbe, 0xf3,
+ 0x45, 0xe8, 0xac, 0xf8, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xc6, 0x86, 0x5c,
+ 0x02, 0x00, 0xbe, 0xb1, 0x45, 0xe8, 0x4e, 0xf9, 0xb8, 0x00, 0x80, 0xe8,
+ 0xec, 0x2b, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01, 0xe8,
+ 0x23, 0xfd, 0xe8, 0xd2, 0xfc, 0xc6, 0x86, 0x5e, 0x02, 0x01, 0xc6, 0x86,
+ 0xca, 0x01, 0x00, 0xf7, 0x86, 0xf6, 0x00, 0x04, 0x00, 0x74, 0x05, 0xc6,
+ 0x86, 0xca, 0x01, 0x01, 0xe8, 0x7c, 0xf3, 0xf6, 0x86, 0x54, 0x02, 0x01,
+ 0x75, 0x06, 0xbe, 0xbd, 0x45, 0xe8, 0x60, 0xf8, 0xff, 0x86, 0xfc, 0x00,
+ 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfb, 0xc6,
+ 0x86, 0x08, 0x01, 0x00, 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x46, 0x0b, 0x00,
+ 0xc6, 0x86, 0x54, 0x02, 0x00, 0xc6, 0x86, 0x68, 0x02, 0x00, 0xc6, 0x86,
+ 0x5e, 0x02, 0x00, 0xc6, 0x86, 0x60, 0x02, 0x00, 0xc6, 0x86, 0x5b, 0x02,
+ 0x00, 0xc6, 0x86, 0x63, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xc6,
+ 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6a, 0x02, 0x00, 0xe8, 0x54, 0xfa,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x00, 0x00, 0x20, 0xf6, 0x86, 0x6c,
+ 0x02, 0x01, 0x74, 0x02, 0xeb, 0x23, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a,
+ 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08,
+ 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0x26, 0x3c, 0xe8, 0xb9, 0xf9, 0xbe,
+ 0xc9, 0x45, 0xe8, 0xdf, 0xf7, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x02, 0x00,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfb, 0x8e, 0x46, 0x02,
+ 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00,
+ 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xf3, 0x3b, 0xc6,
+ 0x86, 0x08, 0x01, 0x00, 0xc7, 0x86, 0x22, 0x01, 0x00, 0x00, 0xe8, 0x0e,
+ 0xfc, 0xe8, 0x32, 0xfc, 0xf7, 0x86, 0xf4, 0x00, 0x10, 0x00, 0x74, 0x14,
+ 0xf7, 0x86, 0xf4, 0x00, 0x02, 0x00, 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x0e, 0x02, 0x00, 0x00, 0x40, 0xeb, 0x0a, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x26, 0x02, 0x00, 0xff, 0xbf, 0xe8, 0x7d, 0xef, 0xe8, 0x6c, 0x2b,
+ 0xc6, 0x86, 0xad, 0x02, 0x00, 0x8d, 0xbe, 0x0a, 0x03, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xab, 0xab, 0xab, 0xf6, 0x86, 0xa6, 0x02, 0x01, 0x74, 0x04, 0xc6,
+ 0x46, 0x09, 0x1e, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x04, 0x00, 0xff,
+ 0xfb, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x02, 0x74, 0x10, 0xf7, 0x86, 0x20,
+ 0x01, 0x80, 0x00, 0x75, 0x08, 0xbe, 0x59, 0x46, 0xe8, 0x3d, 0xf7, 0xeb,
+ 0x0d, 0x8e, 0x46, 0x02, 0x33, 0xc0, 0x26, 0xa3, 0x24, 0x00, 0x26, 0xa3,
+ 0x26, 0x00, 0xc3, 0x90, 0x33, 0xc0, 0x88, 0x86, 0x5b, 0x02, 0x88, 0x86,
+ 0x5e, 0x02, 0x88, 0x86, 0x60, 0x02, 0x88, 0x86, 0x63, 0x02, 0x88, 0x86,
+ 0x68, 0x02, 0xbe, 0xff, 0x45, 0xe8, 0x10, 0xf7, 0xc6, 0x86, 0xad, 0x02,
+ 0x01, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26,
+ 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01,
+ 0xe8, 0x2f, 0x3b, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x03, 0x00, 0xe8, 0xe9,
+ 0xee, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8,
+ 0x1a, 0xf9, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00, 0x00, 0x1e,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00, 0x04, 0xbe, 0x17, 0x46,
+ 0xe8, 0xc1, 0xf6, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04, 0x00, 0x32,
+ 0xfe, 0xe8, 0x2a, 0x05, 0xc3, 0x90, 0xc7, 0x86, 0x2e, 0x02, 0x04, 0x00,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x78, 0x02, 0x00,
+ 0xe8, 0xd1, 0xf8, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x10, 0x00, 0x04,
+ 0x00, 0x32, 0xc0, 0xe8, 0x42, 0x15, 0x33, 0xc0, 0x88, 0x86, 0x88, 0x02,
+ 0x88, 0x86, 0x89, 0x02, 0xc6, 0x86, 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64,
+ 0x01, 0xf8, 0x05, 0xc6, 0x86, 0x69, 0x01, 0x02, 0xc6, 0x86, 0x68, 0x01,
+ 0x02, 0xc7, 0x86, 0x66, 0x01, 0x20, 0x03, 0x8e, 0x46, 0x02, 0x26, 0xc7,
+ 0x06, 0x1c, 0x00, 0x00, 0x00, 0xbe, 0xb7, 0x45, 0xe8, 0x4d, 0xf6, 0xbe,
+ 0x11, 0x46, 0xe8, 0x47, 0xf6, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03,
+ 0xe8, 0xed, 0x0f, 0xc3, 0xc7, 0x86, 0x2e, 0x02, 0x05, 0x00, 0xc6, 0x86,
+ 0x69, 0x02, 0x01, 0xe8, 0x6e, 0xf8, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x75,
+ 0x04, 0xc6, 0x46, 0x09, 0x16, 0xc6, 0x86, 0x72, 0x02, 0x01, 0xbe, 0x35,
+ 0x46, 0xe8, 0x18, 0xf6, 0xbe, 0x3b, 0x46, 0xe8, 0x12, 0xf6, 0xbe, 0x23,
+ 0x46, 0xe8, 0x0c, 0xf6, 0xbe, 0x4d, 0x46, 0xe8, 0x06, 0xf6, 0xc7, 0x86,
+ 0xcc, 0x02, 0x01, 0x00, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xe8, 0x7e, 0x12,
+ 0xc3, 0x90, 0xc7, 0x86, 0x2e, 0x02, 0x07, 0x00, 0xc6, 0x86, 0x68, 0x02,
+ 0x01, 0xc6, 0x86, 0x5c, 0x02, 0x00, 0xc6, 0x86, 0x5d, 0x02, 0x00, 0xbe,
+ 0xf3, 0x45, 0xe8, 0xdb, 0xf5, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x75, 0x0d,
+ 0xc6, 0x86, 0x6e, 0x02, 0x01, 0xb8, 0x00, 0x80, 0xe8, 0x1f, 0x29, 0xeb,
+ 0x0a, 0x83, 0xa6, 0x06, 0x02, 0xdf, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6,
+ 0x86, 0x08, 0x01, 0x00, 0xe8, 0x4e, 0xfa, 0xe8, 0xfd, 0xf9, 0xf6, 0x06,
+ 0x8a, 0x56, 0x01, 0x74, 0x0a, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x04,
+ 0x00, 0xff, 0xf7, 0xe8, 0xc7, 0xf9, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x0c, 0x00, 0x01, 0xe8, 0xa1, 0xf0, 0xc7, 0x86, 0xc4, 0x01, 0x14, 0x00,
+ 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, 0xbe, 0xf9, 0x45, 0xe8, 0x80, 0xf5,
+ 0xc3, 0x90, 0xc7, 0x86, 0x32, 0x02, 0x01, 0x00, 0xc7, 0x86, 0xc2, 0x01,
+ 0xff, 0xff, 0xc7, 0x86, 0xc2, 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc4, 0x01,
+ 0x14, 0x00, 0x80, 0x7e, 0x07, 0x10, 0x74, 0x44, 0x32, 0xc0, 0xe8, 0x1b,
+ 0x14, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x02, 0xeb, 0x37, 0x8e, 0x46, 0x02,
+ 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01, 0x83, 0xa6, 0x06, 0x02, 0xdf, 0xc6,
+ 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0x5b, 0x02, 0x01, 0x74, 0x1d, 0xf6,
+ 0x86, 0x66, 0x02, 0x01, 0x74, 0x16, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x75,
+ 0x0f, 0xc6, 0x86, 0x63, 0x02, 0x01, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75,
+ 0x03, 0xe8, 0x88, 0x0e, 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x0c, 0x00, 0xfe, 0xc7, 0x86, 0x32, 0x02, 0x02, 0x00, 0xc6, 0x86, 0x69,
+ 0x02, 0x01, 0xe8, 0x43, 0xf7, 0xe8, 0x12, 0xf9, 0xbe, 0xd5, 0x45, 0xe8,
+ 0xfa, 0xf4, 0xe8, 0x1e, 0x0e, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x0c, 0x00, 0xfe, 0xc7, 0x86, 0x32, 0x02, 0x03, 0x00, 0xc7, 0x86, 0xc2,
+ 0x02, 0x00, 0x00, 0xc7, 0x86, 0xc4, 0x01, 0x0a, 0x00, 0xf6, 0x86, 0x54,
+ 0x02, 0x01, 0x74, 0x0f, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f, 0xc6, 0x86, 0x5a, 0x02, 0x00,
+ 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8, 0xf3,
+ 0xf6, 0x81, 0xa6, 0x06, 0x02, 0xff, 0x2f, 0x83, 0x8e, 0x06, 0x02, 0x20,
+ 0xc6, 0x86, 0x85, 0x02, 0x01, 0xbe, 0x9f, 0x45, 0xe8, 0x9d, 0xf4, 0xbe,
+ 0xc3, 0x45, 0xe8, 0x97, 0xf4, 0xc7, 0x86, 0xb2, 0x02, 0x01, 0x00, 0xc7,
+ 0x86, 0xb4, 0x02, 0x01, 0x00, 0xe8, 0x5e, 0x0d, 0xc3, 0x90, 0xff, 0x86,
+ 0x44, 0x02, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0x8e,
+ 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10, 0x00, 0x04, 0xf6, 0x86, 0x5f, 0x02,
+ 0x01, 0x75, 0x03, 0xe8, 0x04, 0x0d, 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x0c, 0x00, 0xfe, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x75, 0x26,
+ 0xc6, 0x86, 0x68, 0x02, 0x00, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86,
+ 0x6b, 0x02, 0x00, 0xe8, 0x82, 0xf6, 0xe8, 0x13, 0xf6, 0xbe, 0xc9, 0x45,
+ 0xe8, 0x39, 0xf4, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x10, 0x00, 0xfb,
+ 0xeb, 0x60, 0xc6, 0x86, 0x6d, 0x02, 0x01, 0xf6, 0x86, 0x6c, 0x02, 0x01,
+ 0x75, 0x54, 0xe8, 0xf3, 0xf5, 0xe8, 0xfb, 0xec, 0xc6, 0x86, 0x68, 0x02,
+ 0x00, 0xc6, 0x86, 0x6d, 0x02, 0x00, 0xbe, 0xc9, 0x45, 0xe8, 0x0c, 0xf4,
+ 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83,
+ 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8,
+ 0x30, 0x38, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x10, 0x00, 0x04, 0x00,
+ 0x33, 0xc0, 0x88, 0x86, 0x88, 0x02, 0x88, 0x86, 0x89, 0x02, 0xc6, 0x86,
+ 0x63, 0x01, 0x01, 0xc7, 0x86, 0x64, 0x01, 0xf8, 0x05, 0xc6, 0x86, 0x69,
+ 0x01, 0x02, 0xc3, 0x90, 0xff, 0x86, 0x44, 0x02, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x0c, 0x00, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x10,
+ 0x00, 0x04, 0xc7, 0x86, 0xae, 0x02, 0x02, 0x00, 0xc7, 0x86, 0xb0, 0x02,
+ 0x08, 0x00, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x24, 0x00, 0xff, 0x7f, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86,
+ 0x6b, 0x02, 0x00, 0xe8, 0xce, 0xf5, 0xf6, 0x86, 0x81, 0x02, 0x01, 0x75,
+ 0x06, 0xbe, 0x93, 0x45, 0xe8, 0x81, 0xf3, 0x81, 0xa6, 0x06, 0x02, 0xff,
+ 0x6f, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x85, 0x02, 0x01,
+ 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0x83,
+ 0xbe, 0xc6, 0x01, 0x00, 0x74, 0x0d, 0x8b, 0x86, 0xc6, 0x01, 0xc7, 0x86,
+ 0xc6, 0x01, 0x00, 0x00, 0xe8, 0x45, 0x0f, 0xbe, 0x9f, 0x45, 0xe8, 0x4b,
+ 0xf3, 0xc3, 0xc7, 0x86, 0x32, 0x02, 0x01, 0x00, 0xc7, 0x86, 0x30, 0x02,
+ 0x02, 0x00, 0x32, 0xc0, 0xe8, 0xf9, 0x11, 0x80, 0x7e, 0x06, 0x48, 0x75,
+ 0x09, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x01, 0xc3, 0x90,
+ 0xc7, 0x86, 0x30, 0x02, 0x03, 0x00, 0xff, 0x86, 0x44, 0x02, 0x8e, 0x46,
+ 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xc6, 0x86, 0x68, 0x02, 0x00,
+ 0xc6, 0x86, 0x72, 0x02, 0x00, 0xbe, 0x1d, 0x46, 0xe8, 0x05, 0xf3, 0xbe,
+ 0x29, 0x46, 0xe8, 0xff, 0xf2, 0xbe, 0x41, 0x46, 0xe8, 0xf9, 0xf2, 0xc6,
+ 0x86, 0x6b, 0x02, 0x01, 0xe8, 0x31, 0xf5, 0x81, 0x8e, 0x06, 0x02, 0x04,
+ 0x50, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0x61, 0x02, 0x01, 0x74,
+ 0x06, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x80, 0xe8, 0x80, 0x2d, 0xe8, 0x71,
+ 0x0b, 0xc3, 0xc7, 0x86, 0x30, 0x02, 0x04, 0x00, 0xbe, 0x1d, 0x46, 0xe8,
+ 0xc6, 0xf2, 0xbe, 0x29, 0x46, 0xe8, 0xc0, 0xf2, 0x81, 0xa6, 0x06, 0x02,
+ 0xfb, 0x6f, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x40, 0xc6, 0x86, 0x85, 0x02,
+ 0x01, 0xc3, 0xc7, 0x86, 0x30, 0x02, 0x05, 0x00, 0x8e, 0x46, 0x02, 0xf6,
+ 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd,
+ 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xcc, 0x36, 0x81, 0xa6,
+ 0x06, 0x02, 0xfb, 0x2f, 0x83, 0x8e, 0x06, 0x02, 0x20, 0xc6, 0x86, 0x85,
+ 0x02, 0x01, 0xe8, 0xef, 0x00, 0xc3, 0xc7, 0x86, 0x30, 0x02, 0x01, 0x00,
+ 0xc3, 0x90, 0xc3, 0x53, 0x50, 0x89, 0x86, 0x22, 0x01, 0x80, 0xbe, 0x62,
+ 0x01, 0x01, 0x75, 0x0f, 0x50, 0xe8, 0x62, 0xea, 0xe8, 0x5f, 0x24, 0xc6,
+ 0x46, 0x07, 0x00, 0x58, 0xe9, 0x9d, 0x00, 0xf6, 0x86, 0x08, 0x01, 0x01,
+ 0x74, 0x05, 0xe8, 0xa1, 0x25, 0xeb, 0x57, 0x83, 0xf8, 0x10, 0x75, 0x08,
+ 0x81, 0x8e, 0x1e, 0x01, 0x00, 0x80, 0xeb, 0x4a, 0x83, 0x8e, 0x1e, 0x01,
+ 0x02, 0x8b, 0x9e, 0x06, 0x02, 0x83, 0xf8, 0x01, 0x75, 0x04, 0x81, 0xcb,
+ 0x00, 0x04, 0x83, 0xf8, 0x0c, 0x75, 0x04, 0x81, 0xcb, 0x00, 0x08, 0x83,
+ 0xf8, 0x0b, 0x75, 0x03, 0x83, 0xcb, 0x02, 0x83, 0xf8, 0x09, 0x75, 0x03,
+ 0x83, 0xcb, 0x04, 0x83, 0xf8, 0x0a, 0x75, 0x04, 0x81, 0xcb, 0x00, 0x01,
+ 0x83, 0xf8, 0x06, 0x75, 0x03, 0x83, 0xcb, 0x01, 0x83, 0xf8, 0x0f, 0x74,
+ 0x09, 0x89, 0x9e, 0x06, 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6, 0x46,
+ 0x07, 0x12, 0xc6, 0x46, 0x09, 0x1e, 0xf6, 0x86, 0xa7, 0x02, 0x01, 0x74,
+ 0x1a, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0x26,
+ 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01, 0x01,
+ 0xe8, 0x07, 0x36, 0xf6, 0x86, 0xa5, 0x02, 0x01, 0x75, 0x02, 0xeb, 0x08,
+ 0xc6, 0x46, 0x07, 0x10, 0xc6, 0x46, 0x09, 0x00, 0x58, 0x5b, 0xc3, 0x90,
+ 0xc7, 0x86, 0x2e, 0x02, 0x01, 0x00, 0xc3, 0xb9, 0x01, 0x01, 0x38, 0xc8,
+ 0x75, 0x19, 0x8b, 0xb6, 0xf6, 0x00, 0x81, 0xe6, 0x00, 0xc0, 0x81, 0xfe,
+ 0x00, 0x80, 0x75, 0x0b, 0xc6, 0x86, 0x56, 0x02, 0x01, 0xbe, 0xa5, 0x45,
+ 0xe8, 0x8d, 0xf1, 0xc3, 0xc3, 0x90, 0x50, 0xf7, 0x86, 0xf6, 0x00, 0x00,
+ 0x02, 0x74, 0x06, 0x81, 0x8e, 0xf6, 0x00, 0x00, 0x01, 0xc6, 0x86, 0x90,
+ 0x02, 0x01, 0xe8, 0xb3, 0xf3, 0xe8, 0x02, 0x00, 0x58, 0xc3, 0xc7, 0x86,
+ 0x93, 0x02, 0x00, 0x00, 0xc7, 0x86, 0x95, 0x02, 0x05, 0x00, 0xb8, 0x05,
+ 0x00, 0xe8, 0x1a, 0x00, 0xc7, 0x86, 0x9d, 0x02, 0x05, 0x00, 0xc3, 0x90,
+ 0xc6, 0x86, 0x90, 0x02, 0x00, 0x06, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x00, 0x00, 0xdf, 0x07, 0xc3, 0x90, 0x52, 0x53, 0x51, 0xb9, 0x10, 0x27,
+ 0x83, 0xe0, 0x3f, 0x8b, 0xd0, 0xe5, 0x00, 0x50, 0x8b, 0x1e, 0x34, 0x55,
+ 0x53, 0xb8, 0xe7, 0x03, 0xf7, 0xe2, 0xf7, 0xf1, 0x5b, 0x03, 0xd8, 0x58,
+ 0x03, 0xc2, 0x3b, 0xc1, 0x72, 0x03, 0x2b, 0xc1, 0x43, 0x8b, 0xcb, 0x41,
+ 0x89, 0x9e, 0x97, 0x02, 0x89, 0x8e, 0x99, 0x02, 0x89, 0x86, 0x9b, 0x02,
+ 0x59, 0x5b, 0x5a, 0xc3, 0xa1, 0x34, 0x55, 0x3b, 0x86, 0x99, 0x02, 0x74,
+ 0x0e, 0x3b, 0x86, 0x97, 0x02, 0x75, 0x0d, 0xe5, 0x00, 0x3b, 0x86, 0x9b,
+ 0x02, 0x72, 0x05, 0xb8, 0x01, 0x00, 0xeb, 0x02, 0x2b, 0xc0, 0x85, 0xc0,
+ 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x04, 0x74, 0x0a, 0xf7, 0x86, 0xf6, 0x00,
+ 0x00, 0x02, 0x75, 0x02, 0xeb, 0x05, 0xb8, 0x01, 0x00, 0xeb, 0x02, 0x2b,
+ 0xc0, 0x85, 0xc0, 0xc3, 0xe8, 0xc1, 0xff, 0x74, 0x1e, 0xb8, 0x02, 0x00,
+ 0xe8, 0x7f, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x14, 0x00, 0x25, 0x24,
+ 0x01, 0x8b, 0xd8, 0x33, 0x86, 0x93, 0x02, 0x75, 0x0a, 0xff, 0x8e, 0x9d,
+ 0x02, 0x74, 0x02, 0xeb, 0x77, 0xeb, 0x23, 0xc7, 0x86, 0x9d, 0x02, 0x05,
+ 0x00, 0x89, 0x9e, 0x93, 0x02, 0xa9, 0x04, 0x00, 0x74, 0x12, 0xf7, 0xc3,
+ 0x04, 0x00, 0x74, 0x07, 0xc6, 0x86, 0x91, 0x02, 0x01, 0xeb, 0x05, 0xc6,
+ 0x86, 0x91, 0x02, 0x00, 0xeb, 0x52, 0x8b, 0x86, 0x93, 0x02, 0x8e, 0x46,
+ 0x02, 0x26, 0xf7, 0x06, 0x00, 0x00, 0x02, 0x00, 0x74, 0x24, 0x25, 0x04,
+ 0x01, 0x3d, 0x04, 0x01, 0x75, 0x3a, 0xe8, 0x81, 0xff, 0x74, 0x2c, 0x81,
+ 0x8e, 0xf6, 0x00, 0x00, 0x01, 0xe8, 0x9c, 0xf2, 0xc7, 0x86, 0x93, 0x02,
+ 0x00, 0x00, 0xb8, 0x05, 0x00, 0xe8, 0x0e, 0xff, 0xeb, 0x1e, 0x25, 0x24,
+ 0x01, 0x3d, 0x24, 0x01, 0x75, 0x16, 0xe8, 0x5d, 0xff, 0x74, 0x08, 0x81,
+ 0xa6, 0xf6, 0x00, 0xff, 0xfe, 0xeb, 0xda, 0xe8, 0xe2, 0xfe, 0xb8, 0x0e,
+ 0x00, 0xe8, 0xbf, 0xfd, 0xc3, 0x90, 0x55, 0x1e, 0x06, 0x33, 0xed, 0x8e,
+ 0xdd, 0x8b, 0x2e, 0x52, 0x55, 0x8e, 0x46, 0x02, 0xeb, 0x00, 0x60, 0xfa,
+ 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x04, 0x00, 0x89, 0x86, 0x18, 0x01, 0xc7,
+ 0x86, 0x1c, 0x01, 0x01, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x06, 0x00,
+ 0x89, 0x86, 0x1a, 0x01, 0xb8, 0x07, 0x00, 0x8e, 0x46, 0x02, 0x26, 0xa3,
+ 0x06, 0x00, 0xb8, 0xff, 0xff, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x04, 0x00,
+ 0xfb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x08, 0x00, 0x8b, 0xd8, 0x81, 0xe3,
+ 0xff, 0xfc, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x08, 0x00, 0x8e, 0x46,
+ 0x02, 0x26, 0x8b, 0x1e, 0x0a, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e,
+ 0x0a, 0x00, 0x50, 0xb0, 0xa0, 0xe6, 0x10, 0x58, 0xa9, 0x00, 0x08, 0x74,
+ 0x0f, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, 0x05, 0xe8, 0x79, 0x32, 0xeb,
+ 0x03, 0xe8, 0xb4, 0x2d, 0xa9, 0x00, 0x01, 0x75, 0x20, 0xf7, 0x86, 0xa3,
+ 0x02, 0x01, 0x00, 0x75, 0x1f, 0xa9, 0xcd, 0x01, 0x74, 0x1a, 0x80, 0xbe,
+ 0x6a, 0x01, 0x0a, 0x72, 0x0c, 0xc7, 0x86, 0xa3, 0x02, 0x01, 0x00, 0x81,
+ 0x8e, 0x18, 0x01, 0xcd, 0x00, 0xfe, 0x86, 0x6a, 0x01, 0xe8, 0xfc, 0x2e,
+ 0xa9, 0x00, 0x04, 0x74, 0x29, 0xf7, 0x86, 0x0a, 0x01, 0x01, 0x00, 0x75,
+ 0x21, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x04, 0x00, 0x00, 0x04, 0xe8,
+ 0x66, 0xed, 0xc7, 0x44, 0x02, 0x01, 0x00, 0x89, 0x44, 0x04, 0xc7, 0x86,
+ 0x0a, 0x01, 0x01, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x70, 0xed, 0xa9, 0x00,
+ 0x10, 0x74, 0x27, 0x80, 0xbe, 0x0c, 0x01, 0x01, 0x74, 0x20, 0xf6, 0x86,
+ 0xb8, 0x01, 0x01, 0x75, 0x19, 0xe8, 0x3c, 0xed, 0xf7, 0xc6, 0xff, 0xff,
+ 0x74, 0x10, 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6, 0x86, 0xb8, 0x01, 0x01,
+ 0x8d, 0x7e, 0x16, 0xe8, 0x44, 0xed, 0xa9, 0x00, 0x20, 0x74, 0x2e, 0x80,
+ 0xbe, 0x0c, 0x01, 0x01, 0x75, 0x07, 0xc6, 0x86, 0x0d, 0x01, 0x01, 0xeb,
+ 0x20, 0xf6, 0x86, 0xb9, 0x01, 0x01, 0x75, 0x19, 0xe8, 0x09, 0xed, 0xf7,
+ 0xc6, 0xff, 0xff, 0x74, 0x10, 0xc7, 0x44, 0x02, 0x04, 0x00, 0xc6, 0x86,
+ 0xb9, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x11, 0xed, 0xfa, 0x8b, 0x86,
+ 0x18, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x04, 0x00, 0xc7, 0x86, 0x1c,
+ 0x01, 0x00, 0x00, 0x8b, 0x86, 0x1a, 0x01, 0x8e, 0x46, 0x02, 0x26, 0xa3,
+ 0x06, 0x00, 0x61, 0x07, 0x1f, 0x5d, 0xcf, 0x50, 0x25, 0x00, 0x02, 0x8e,
+ 0x46, 0x02, 0x26, 0xa3, 0x08, 0x00, 0x8b, 0x86, 0xc2, 0x02, 0x40, 0x89,
+ 0x86, 0xc2, 0x02, 0x83, 0xf8, 0x01, 0x75, 0x08, 0x56, 0xbe, 0xf9, 0x45,
+ 0xe8, 0xb1, 0xee, 0x5e, 0x3b, 0x86, 0xc4, 0x01, 0x76, 0x0a, 0x80, 0xbe,
+ 0x61, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x04, 0x2f, 0x58, 0xc3, 0x8d, 0x71,
+ 0x18, 0x8b, 0x49, 0x14, 0x86, 0xcd, 0x83, 0xe9, 0x04, 0x7e, 0x1b, 0x33,
+ 0xc0, 0x03, 0xf0, 0x8a, 0x04, 0x0a, 0xc0, 0x74, 0x11, 0x3a, 0x54, 0x01,
+ 0x74, 0x17, 0x32, 0xe4, 0x3c, 0xff, 0x74, 0x0a, 0x2b, 0xc8, 0x72, 0x02,
+ 0x77, 0xe7, 0x33, 0xc0, 0xf9, 0xc3, 0x8b, 0x44, 0x02, 0x86, 0xc4, 0xeb,
+ 0xef, 0x0a, 0xe4, 0x75, 0xf1, 0x38, 0xf0, 0x75, 0xed, 0x8d, 0x74, 0x02,
+ 0xf8, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0xb6, 0x52, 0x15, 0x8b, 0xbe,
+ 0x54, 0x15, 0x47, 0xa5, 0xa5, 0xa5, 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x07,
+ 0x80, 0xe1, 0xfe, 0x8b, 0xc7, 0x2b, 0xc3, 0x2b, 0xc8, 0x76, 0x0a, 0x81,
+ 0xf9, 0x00, 0x01, 0x73, 0x09, 0xd1, 0xe9, 0xf3, 0xa5, 0x8b, 0x07, 0xe9,
+ 0xc9, 0x01, 0xb9, 0x19, 0x00, 0xf3, 0xa5, 0x33, 0xff, 0xf6, 0x47, 0x0e,
+ 0x80, 0x74, 0x0e, 0x8b, 0x47, 0x14, 0x83, 0xe0, 0x1f, 0x74, 0x0f, 0xa8,
+ 0x01, 0x75, 0x0b, 0x8b, 0xf8, 0xba, 0x80, 0x09, 0x68, 0x5d, 0x24, 0xe9,
+ 0xde, 0x05, 0xe9, 0xcc, 0x02, 0xc3, 0x80, 0x7f, 0x17, 0x02, 0x75, 0xf9,
+ 0x50, 0x56, 0x8b, 0xb6, 0xc4, 0x05, 0x8b, 0x04, 0x5e, 0x3b, 0x86, 0xc2,
+ 0x01, 0x74, 0x07, 0x89, 0x86, 0xc2, 0x01, 0x58, 0xeb, 0x3d, 0x58, 0xeb,
+ 0x12, 0x8a, 0x4f, 0x07, 0x80, 0xe1, 0x3f, 0x74, 0xd8, 0x8a, 0xe9, 0x86,
+ 0x8e, 0xfa, 0x01, 0x38, 0xcd, 0x75, 0x18, 0x57, 0x51, 0x8d, 0xbe, 0xfc,
+ 0x01, 0x8d, 0x77, 0x0e, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3,
+ 0xa7, 0x75, 0x06, 0x59, 0x5f, 0xeb, 0xb6, 0x57, 0x51, 0x8d, 0xbe, 0xfc,
+ 0x01, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x59, 0x5f, 0xeb,
+ 0x0d, 0x8b, 0x7e, 0x04, 0x58, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00,
+ 0x74, 0xf7, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x08, 0x80, 0x7e, 0x06, 0x48,
+ 0x74, 0x02, 0xeb, 0xe9, 0x50, 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0x07, 0xa9,
+ 0x00, 0x40, 0x75, 0xdc, 0x0d, 0x00, 0x40, 0x89, 0x07, 0xe8, 0x8a, 0x00,
+ 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x03, 0x80, 0xe1, 0xfe, 0x89, 0x7e, 0x04,
+ 0x8b, 0xbe, 0xbe, 0x01, 0x3b, 0xfe, 0x72, 0x11, 0x8d, 0x86, 0x52, 0x08,
+ 0x05, 0xff, 0x00, 0x2b, 0xc7, 0x3b, 0xc1, 0x7d, 0x0a, 0x8d, 0xbe, 0x52,
+ 0x08, 0x2b, 0xf7, 0x3b, 0xf1, 0x7c, 0xa6, 0x8b, 0xd7, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0x33, 0xc0, 0x8b, 0xf3, 0xd1, 0xe9, 0x83, 0xc7, 0x02, 0x49, 0xad,
+ 0xf3, 0xa5, 0x8b, 0xcf, 0xc7, 0x05, 0x00, 0x00, 0x8b, 0xfa, 0x89, 0x4d,
+ 0x02, 0x51, 0x8b, 0x4d, 0x04, 0x83, 0xe9, 0x04, 0x89, 0x4d, 0x04, 0x59,
+ 0x89, 0x05, 0x8d, 0x86, 0x52, 0x08, 0x3b, 0xf8, 0x75, 0x0e, 0x8b, 0x86,
+ 0xbc, 0x01, 0x3b, 0x86, 0xbe, 0x01, 0x75, 0x1c, 0x89, 0xbe, 0xbc, 0x01,
+ 0x89, 0x8e, 0xbe, 0x01, 0x8b, 0x7e, 0x04, 0xc7, 0x86, 0xc0, 0x01, 0x00,
+ 0x00, 0xb9, 0x40, 0x60, 0x8e, 0xc1, 0xe8, 0x77, 0x21, 0xe9, 0x4d, 0xff,
+ 0x97, 0x89, 0x45, 0x02, 0xeb, 0xe2, 0x8b, 0xb6, 0xbc, 0x01, 0xf7, 0x86,
+ 0xc0, 0x01, 0x01, 0x00, 0x75, 0x0f, 0x81, 0x3c, 0x00, 0x80, 0x75, 0x05,
+ 0x8b, 0x74, 0x02, 0xeb, 0xf5, 0x89, 0xb6, 0xbc, 0x01, 0xc3, 0xf7, 0x07,
+ 0x01, 0x09, 0x74, 0x03, 0xe9, 0x92, 0x01, 0xf7, 0x07, 0x00, 0x10, 0x75,
+ 0x33, 0x68, 0x3e, 0x23, 0xe9, 0xeb, 0x24, 0xa8, 0x02, 0x74, 0x21, 0x80,
+ 0x7e, 0x08, 0x00, 0x75, 0x1b, 0x80, 0xbe, 0x5e, 0x02, 0x00, 0x74, 0x14,
+ 0x24, 0x28, 0x3c, 0x28, 0x75, 0x0e, 0xf6, 0x47, 0x0e, 0x80, 0x75, 0x67,
+ 0x81, 0x8e, 0xda, 0x02, 0x80, 0x00, 0xeb, 0x5f, 0xeb, 0x5d, 0xe9, 0x39,
+ 0xfe, 0x90, 0xeb, 0xd3, 0xeb, 0x38, 0x8b, 0x47, 0x14, 0x83, 0xe0, 0x1f,
+ 0x74, 0x06, 0xa8, 0x01, 0x8b, 0xf8, 0x74, 0x4f, 0xe9, 0x46, 0x01, 0x50,
+ 0x8b, 0x9e, 0xb2, 0x01, 0x8b, 0x07, 0xa9, 0x00, 0x20, 0x74, 0x0b, 0xff,
+ 0x86, 0x3c, 0x02, 0x8b, 0x4f, 0x04, 0x01, 0x8e, 0x3e, 0x02, 0xe8, 0xb4,
+ 0x03, 0x75, 0xcb, 0xf6, 0x47, 0x07, 0x40, 0x74, 0x05, 0xe8, 0xd1, 0x03,
+ 0xeb, 0x78, 0xf7, 0x86, 0xb6, 0x01, 0x00, 0x02, 0x75, 0x11, 0xa9, 0x01,
+ 0x09, 0x75, 0x6b, 0x80, 0x7e, 0x07, 0x10, 0x74, 0x65, 0x80, 0x7e, 0x07,
+ 0x12, 0x74, 0x5f, 0xa8, 0x28, 0x75, 0xa7, 0x33, 0xff, 0xf6, 0x47, 0x0e,
+ 0x80, 0x75, 0xa3, 0x8b, 0x47, 0x04, 0x83, 0xf8, 0x12, 0x77, 0x05, 0x33,
+ 0xc0, 0xe9, 0xb0, 0x01, 0x83, 0xe8, 0x12, 0x2b, 0xc7, 0x83, 0xf8, 0x04,
+ 0x7c, 0x40, 0x8b, 0x49, 0x16, 0x88, 0xae, 0x04, 0x02, 0x51, 0x80, 0xe1,
+ 0xf0, 0x80, 0xf9, 0x00, 0x74, 0x09, 0x80, 0xf9, 0x30, 0x74, 0x04, 0x59,
+ 0xe9, 0xca, 0x00, 0x59, 0x0b, 0xff, 0x74, 0x0f, 0xf6, 0xc1, 0x0f, 0x74,
+ 0x19, 0x80, 0xf9, 0x33, 0x74, 0x14, 0x80, 0xf9, 0x03, 0x74, 0x0f, 0x86,
+ 0xc4, 0x39, 0x41, 0x14, 0x86, 0xc4, 0x75, 0x02, 0xeb, 0x0c, 0xe9, 0x66,
+ 0x01, 0x90, 0xe9, 0xa4, 0x00, 0x90, 0xe9, 0x63, 0x01, 0x90, 0xf6, 0x86,
+ 0x90, 0x02, 0x01, 0x74, 0x11, 0xe8, 0x7c, 0xfa, 0x80, 0x7e, 0x06, 0x04,
+ 0x75, 0x08, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x02, 0xee, 0xf6, 0x86,
+ 0x92, 0x02, 0x01, 0x74, 0x20, 0xc6, 0x86, 0x92, 0x02, 0x00, 0x50, 0x8b,
+ 0x86, 0xf8, 0x00, 0x33, 0x86, 0xf6, 0x00, 0xa9, 0x00, 0x01, 0x58, 0x74,
+ 0x0c, 0xb8, 0x0e, 0x00, 0xe8, 0x30, 0xf9, 0xeb, 0x64, 0x90, 0xe9, 0x2f,
+ 0x01, 0x80, 0xfd, 0x15, 0x77, 0x11, 0x80, 0xfd, 0x01, 0x74, 0xf3, 0x80,
+ 0xfd, 0x09, 0x74, 0xee, 0x80, 0xfd, 0x0a, 0x74, 0xe9, 0xeb, 0x11, 0x80,
+ 0xfd, 0x20, 0x72, 0xe2, 0x80, 0xfd, 0x29, 0x77, 0xdd, 0x80, 0xfd, 0x21,
+ 0x74, 0xd8, 0xeb, 0x92, 0x80, 0xfd, 0x10, 0x76, 0x02, 0xeb, 0x0a, 0x80,
+ 0xfd, 0x0e, 0x73, 0x28, 0x80, 0xfd, 0x15, 0x77, 0x23, 0x53, 0x8b, 0xd9,
+ 0xc1, 0xeb, 0x08, 0x80, 0xe1, 0x0f, 0x3a, 0x8f, 0x76, 0x04, 0x74, 0x13,
+ 0x83, 0xfb, 0x0b, 0x74, 0x09, 0x83, 0xfb, 0x0c, 0x74, 0x04, 0x5b, 0xe9,
+ 0xd3, 0x00, 0x80, 0xf9, 0x08, 0x75, 0xf7, 0x5b, 0xe9, 0x81, 0x01, 0x5b,
+ 0x5f, 0x8b, 0x9e, 0xb2, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x01, 0x00, 0x74,
+ 0x28, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75,
+ 0x1c, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x08, 0x74, 0x06, 0x68, 0x91, 0x24,
+ 0xe9, 0x2e, 0xfd, 0xf7, 0x86, 0x12, 0x01, 0x80, 0x00, 0x74, 0x06, 0x68,
+ 0x91, 0x24, 0xe9, 0x01, 0xfd, 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xb2, 0x01,
+ 0x8b, 0xc3, 0x83, 0xe8, 0x02, 0x3b, 0x86, 0x52, 0x15, 0x77, 0x04, 0x8b,
+ 0x86, 0x54, 0x15, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x38, 0x00, 0x80, 0xbe,
+ 0x2d, 0x01, 0x01, 0x75, 0x1b, 0x2d, 0x00, 0x02, 0x3b, 0x86, 0x52, 0x15,
+ 0x73, 0x0e, 0x53, 0x8b, 0xd8, 0x2b, 0x9e, 0x52, 0x15, 0x8b, 0x86, 0x54,
+ 0x15, 0x2b, 0xc3, 0x5b, 0x26, 0xa3, 0x6c, 0x00, 0xfa, 0x8b, 0x07, 0xa9,
+ 0x00, 0x80, 0x74, 0x17, 0xfb, 0xff, 0x86, 0x3c, 0x01, 0x83, 0xbe, 0x3c,
+ 0x01, 0x05, 0x77, 0x1c, 0x8a, 0x4e, 0x09, 0x3a, 0x4e, 0x08, 0x75, 0x14,
+ 0xe9, 0x2f, 0xfe, 0xc6, 0x86, 0xb9, 0x01, 0x00, 0xfb, 0xc7, 0x86, 0x3c,
+ 0x01, 0x00, 0x00, 0x58, 0xc3, 0xe9, 0x5d, 0xff, 0xe8, 0x95, 0xe8, 0xf7,
+ 0xc6, 0xff, 0xff, 0x74, 0xe6, 0xc7, 0x44, 0x02, 0x04, 0x00, 0xc6, 0x86,
+ 0xb9, 0x01, 0x01, 0x8d, 0x7e, 0x16, 0xe8, 0x9d, 0xe8, 0xeb, 0xda, 0xba,
+ 0x80, 0x02, 0xeb, 0x1d, 0xba, 0x80, 0x01, 0xeb, 0x18, 0xba, 0x80, 0x04,
+ 0xeb, 0x13, 0x5f, 0x5b, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x10, 0x74, 0x06,
+ 0x68, 0x91, 0x24, 0xe9, 0xb8, 0xfc, 0xba, 0x80, 0x03, 0x33, 0xc0, 0x8e,
+ 0xc0, 0x68, 0x5d, 0x24, 0xe9, 0x25, 0x02, 0x33, 0xd2, 0x32, 0xed, 0x8a,
+ 0x4d, 0xff, 0x89, 0x55, 0x02, 0x83, 0xc7, 0x05, 0xe2, 0xf8, 0xf6, 0x86,
+ 0x5f, 0x02, 0x01, 0x74, 0x38, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x0b, 0xc6,
+ 0x46, 0x09, 0x04, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xeb, 0x24, 0x80, 0x7e,
+ 0x08, 0x06, 0x75, 0x21, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xc6, 0x86, 0x69,
+ 0x02, 0x01, 0xe8, 0x57, 0xec, 0xbe, 0xc3, 0x45, 0xe8, 0x11, 0xea, 0x50,
+ 0x53, 0x33, 0xc0, 0x8e, 0xc0, 0xe8, 0xa6, 0x02, 0x5b, 0x58, 0xbb, 0x00,
+ 0x00, 0x8b, 0xf8, 0x8b, 0xf3, 0x5b, 0x57, 0x53, 0x68, 0x5b, 0x24, 0xff,
+ 0x66, 0x12, 0xeb, 0x87, 0x8b, 0xc7, 0x8b, 0xbf, 0x8c, 0x04, 0x0b, 0xff,
+ 0x78, 0xf4, 0x74, 0xa6, 0x03, 0xfd, 0xf6, 0x45, 0x01, 0x80, 0x75, 0x02,
+ 0xeb, 0x8d, 0xe9, 0x21, 0x01, 0xe9, 0x03, 0x01, 0x5f, 0x5b, 0xba, 0x80,
+ 0x08, 0xe9, 0x75, 0xff, 0x8b, 0x54, 0x02, 0x86, 0xd6, 0x83, 0xc6, 0x02,
+ 0xb0, 0x04, 0xeb, 0x51, 0x5f, 0x5b, 0xba, 0x80, 0x05, 0xe9, 0x61, 0xff,
+ 0x53, 0x8d, 0x71, 0x18, 0x32, 0xff, 0x8a, 0xdd, 0xd1, 0xe3, 0x83, 0xe8,
+ 0x04, 0x0b, 0xc0, 0x74, 0xb7, 0x89, 0x46, 0x04, 0x57, 0x8b, 0xbf, 0x8c,
+ 0x04, 0x0b, 0xff, 0x74, 0xc4, 0x79, 0x03, 0xe9, 0x2c, 0xff, 0x03, 0xfd,
+ 0x8e, 0xc7, 0x33, 0xc0, 0x32, 0xed, 0x8a, 0x4d, 0xff, 0x89, 0x45, 0x02,
+ 0x83, 0xc7, 0x05, 0xe2, 0xf8, 0x33, 0xd2, 0x03, 0xf2, 0x8a, 0x4c, 0x01,
+ 0x8a, 0x14, 0x0a, 0xd2, 0x74, 0xb6, 0x80, 0xfa, 0xff, 0x74, 0xa5, 0xb0,
+ 0x02, 0x29, 0x56, 0x04, 0x72, 0xaa, 0x0a, 0xc9, 0x78, 0x92, 0x8a, 0xe1,
+ 0x80, 0xe1, 0x3f, 0x8c, 0xc7, 0x8a, 0x6d, 0xff, 0xeb, 0x12, 0x80, 0x7d,
+ 0x04, 0xff, 0x74, 0x15, 0xeb, 0x92, 0xe9, 0x7b, 0xff, 0xfe, 0xcd, 0x74,
+ 0xf9, 0x83, 0xc7, 0x05, 0x3a, 0x0d, 0x75, 0xf5, 0x3a, 0x55, 0x04, 0x75,
+ 0xe5, 0x8d, 0x44, 0x02, 0x87, 0x45, 0x02, 0x0b, 0xc0, 0x74, 0x09, 0xf6,
+ 0x45, 0x01, 0x80, 0x75, 0xdd, 0x89, 0x45, 0x02, 0x83, 0x7e, 0x04, 0x00,
+ 0x75, 0xa5, 0x33, 0xc0, 0x8c, 0xc6, 0xf6, 0x44, 0x01, 0x80, 0x74, 0x0e,
+ 0x39, 0x44, 0x02, 0x74, 0x60, 0x83, 0xc6, 0x05, 0xf6, 0x44, 0x01, 0x80,
+ 0x75, 0xf2, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x74, 0x36, 0x80, 0x7e, 0x08,
+ 0x0a, 0x75, 0x0b, 0xc6, 0x86, 0x5f, 0x02, 0x00, 0xc6, 0x46, 0x09, 0x04,
+ 0xeb, 0x22, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x1f, 0xc6, 0x86, 0x5f, 0x02,
+ 0x00, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xe8, 0x27, 0xeb, 0xbe, 0xc3, 0x45,
+ 0xe8, 0xe1, 0xe8, 0x33, 0xc0, 0x8e, 0xc0, 0x53, 0xe8, 0x77, 0x01, 0x5b,
+ 0xbb, 0x00, 0x00, 0x89, 0x5e, 0x04, 0x8b, 0xf3, 0x5f, 0x5b, 0x33, 0xc0,
+ 0x8e, 0xc0, 0x3b, 0xb6, 0xba, 0x01, 0x73, 0x06, 0x68, 0x5d, 0x24, 0xff,
+ 0x66, 0x12, 0xe9, 0x80, 0xfd, 0x5f, 0x5b, 0xba, 0x80, 0x07, 0xe9, 0x58,
+ 0xfe, 0x56, 0x57, 0x50, 0x33, 0xc0, 0x8e, 0xc0, 0x8b, 0xb6, 0x52, 0x15,
+ 0x8b, 0xbe, 0x54, 0x15, 0x83, 0xc7, 0x01, 0xa5, 0xa5, 0xa5, 0x8b, 0xc3,
+ 0x03, 0x47, 0x04, 0x8b, 0xbe, 0x54, 0x15, 0x3b, 0xc7, 0x7f, 0x02, 0x32,
+ 0xc0, 0x58, 0x5f, 0x5e, 0xc3, 0x80, 0xbe, 0x2d, 0x01, 0x01, 0x75, 0x57,
+ 0x53, 0x33, 0xff, 0xf6, 0x47, 0x0e, 0x80, 0x74, 0x0e, 0x8b, 0x47, 0x14,
+ 0x83, 0xe0, 0x1f, 0x74, 0x45, 0xa8, 0x01, 0x75, 0x41, 0x8b, 0xf8, 0x83,
+ 0xc3, 0x06, 0x8d, 0xb6, 0xec, 0x15, 0x33, 0xc0, 0x33, 0xc9, 0x8a, 0x0c,
+ 0x80, 0xf9, 0x00, 0x74, 0x2d, 0x53, 0x46, 0x8a, 0x04, 0x03, 0xd8, 0x80,
+ 0x3c, 0x0e, 0x72, 0x02, 0x03, 0xdf, 0x46, 0x8a, 0x04, 0x3a, 0x07, 0x75,
+ 0x07, 0x5b, 0xfe, 0xc9, 0x74, 0x0a, 0xeb, 0xe5, 0x5b, 0x03, 0xf1, 0x03,
+ 0xf1, 0x4e, 0xeb, 0xd6, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x72, 0x00,
+ 0x00, 0x01, 0x5b, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0xf6, 0x41, 0x16, 0x0f,
+ 0x74, 0x60, 0x89, 0x96, 0xe2, 0x02, 0x81, 0xfa, 0x80, 0x02, 0x74, 0x13,
+ 0xba, 0x09, 0x04, 0xe8, 0x74, 0xf9, 0x72, 0x0b, 0xad, 0x86, 0xe0, 0x89,
+ 0x86, 0x14, 0x02, 0x86, 0xe0, 0xeb, 0x06, 0x8b, 0x86, 0x14, 0x02, 0x86,
+ 0xe0, 0x89, 0x86, 0xde, 0x02, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x4d, 0x22,
+ 0x57, 0x53, 0xe8, 0x9f, 0x05, 0x5a, 0x5f, 0x72, 0x29, 0x57, 0xe8, 0x26,
+ 0x00, 0xb8, 0x00, 0x0e, 0xab, 0x47, 0xb0, 0x00, 0xaa, 0x8d, 0xb6, 0xdc,
+ 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0xe0, 0x02, 0xa5, 0xa5, 0x55, 0x8b, 0xea,
+ 0x8a, 0x47, 0x16, 0x8a, 0x66, 0x17, 0xab, 0x5d, 0xe8, 0x13, 0x06, 0x8b,
+ 0xda, 0x5f, 0xc3, 0x55, 0x8b, 0xea, 0x8a, 0x43, 0x16, 0xc0, 0xe0, 0x04,
+ 0x88, 0x41, 0x16, 0xc7, 0x47, 0x06, 0xe0, 0x00, 0x83, 0xe9, 0x06, 0x89,
+ 0x4f, 0x04, 0x0b, 0xff, 0x75, 0x18, 0x8d, 0x76, 0x0e, 0x8d, 0x7f, 0x08,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8b, 0xd5, 0x5d, 0x8d, 0xb6,
+ 0xf4, 0x02, 0xa5, 0xa5, 0xa5, 0xc3, 0x8b, 0xcf, 0xd1, 0xe9, 0x8d, 0x76,
+ 0x0e, 0x8d, 0x7f, 0x08, 0x8c, 0xd8, 0x8e, 0xc0, 0xad, 0x24, 0x7f, 0xab,
+ 0xa5, 0xa5, 0x8b, 0xd5, 0x5d, 0x56, 0x8d, 0xb6, 0xf4, 0x02, 0xad, 0x0c,
+ 0x80, 0xab, 0xa5, 0xa5, 0x5e, 0xad, 0x80, 0xcc, 0x80, 0xab, 0x49, 0xf3,
+ 0xa5, 0xc3, 0x8b, 0x86, 0x00, 0x03, 0x86, 0xe0, 0x89, 0x86, 0x10, 0x02,
+ 0x89, 0x86, 0x02, 0x02, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0xfc, 0x01,
+ 0x8d, 0xb6, 0xf4, 0x02, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0xb9, 0x2a, 0x00,
+ 0xe8, 0xd3, 0x04, 0x72, 0xd8, 0x8d, 0xb6, 0xe6, 0x02, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x7f, 0x05, 0xb9, 0x26,
+ 0x00, 0xe8, 0xba, 0x04, 0x72, 0x62, 0x8d, 0xb6, 0x10, 0x03, 0x8b, 0xfb,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x66, 0x05, 0x8d,
+ 0x7f, 0x08, 0x8b, 0x4f, 0x04, 0x83, 0xc1, 0x03, 0x80, 0xe1, 0xfe, 0x57,
+ 0xe8, 0x97, 0x04, 0x5f, 0x8b, 0xd7, 0x72, 0x22, 0x83, 0xe9, 0x08, 0x8d,
+ 0x7f, 0x04, 0x8c, 0xd8, 0x8e, 0xc0, 0x8b, 0xc1, 0xab, 0x8b, 0x86, 0x16,
+ 0x03, 0xab, 0x8b, 0xf2, 0xd1, 0xe9, 0x49, 0xf3, 0xa5, 0xbe, 0x9f, 0x45,
+ 0xe8, 0xdd, 0xe6, 0xe9, 0x2f, 0x05, 0xc3, 0xb9, 0x26, 0x00, 0xe8, 0x69,
+ 0x04, 0x72, 0x11, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xb6, 0x36, 0x03, 0x8b,
+ 0xfb, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x15, 0x05, 0xc3, 0xb9, 0x26, 0x00,
+ 0xe8, 0x69, 0x04, 0x72, 0xf7, 0x8d, 0xb6, 0x5c, 0x03, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xc6, 0x86, 0x63, 0x02, 0x01,
+ 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, 0xe8, 0x04, 0x68, 0x9d,
+ 0x2c, 0xe9, 0xe2, 0x04, 0xb9, 0x26, 0x00, 0xe8, 0x3e, 0x04, 0x72, 0xcc,
+ 0x8d, 0xb6, 0x82, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9,
+ 0xf3, 0xa5, 0xc6, 0x86, 0x63, 0x02, 0x01, 0x80, 0xbe, 0x83, 0x02, 0x01,
+ 0x75, 0x03, 0xe9, 0xbd, 0x04, 0x68, 0x9d, 0x2c, 0xe9, 0xb7, 0x04, 0xb9,
+ 0x18, 0x00, 0xe8, 0x13, 0x04, 0x72, 0xa1, 0x8d, 0xb6, 0xa8, 0x03, 0x8b,
+ 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x9e, 0x04,
+ 0x83, 0xc1, 0x1c, 0x56, 0x57, 0x52, 0xe8, 0xf7, 0x03, 0x5a, 0x5f, 0x5e,
+ 0x72, 0x6c, 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x83, 0xe9, 0x08, 0x8b, 0xc1,
+ 0x8d, 0x7f, 0x04, 0xab, 0xba, 0xe0, 0x00, 0x8b, 0xc2, 0xab, 0x8d, 0xb6,
+ 0xc8, 0x03, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0xf4, 0x02, 0x80, 0xbe, 0x62,
+ 0x01, 0x01, 0x75, 0x04, 0x8d, 0xb6, 0x00, 0x01, 0xa5, 0xa5, 0xa5, 0x83,
+ 0xe9, 0x0e, 0x80, 0xbe, 0x63, 0x01, 0x02, 0x75, 0x03, 0x83, 0xe9, 0x04,
+ 0x8b, 0xc1, 0x86, 0xe0, 0xab, 0xb8, 0x00, 0x08, 0xab, 0xb8, 0xff, 0x26,
+ 0xab, 0x83, 0xe9, 0x04, 0x8b, 0xc1, 0x86, 0xe0, 0xab, 0x5e, 0xe9, 0x3d,
+ 0x04, 0xb9, 0x44, 0x00, 0xe8, 0x99, 0x03, 0x72, 0x11, 0x8d, 0xb6, 0xda,
+ 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe8,
+ 0x24, 0x04, 0xc3, 0xb9, 0x36, 0x00, 0xe8, 0x7f, 0x03, 0x72, 0xf7, 0xff,
+ 0x86, 0x52, 0x02, 0x8d, 0xb6, 0x7c, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x33, 0xc0, 0x8d, 0xbe, 0x96, 0x05, 0xab,
+ 0xab, 0xaa, 0x8d, 0xbe, 0x9e, 0x05, 0xab, 0xab, 0xaa, 0xe9, 0xf6, 0x03,
+ 0x8d, 0x4d, 0x3a, 0x57, 0x53, 0xe8, 0x50, 0x03, 0x5a, 0x5f, 0x72, 0x5b,
+ 0x57, 0xe8, 0xd7, 0xfd, 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x26, 0xab,
+ 0x47, 0xb0, 0x22, 0xaa, 0x8d, 0xb6, 0xdc, 0x02, 0xa5, 0xa5, 0x8d, 0xb6,
+ 0x02, 0x03, 0xa5, 0xa5, 0xa5, 0x8d, 0xb6, 0x08, 0x03, 0xa5, 0xa5, 0xa5,
+ 0xa5, 0x8d, 0xb6, 0x1e, 0x04, 0xa5, 0xa5, 0x8d, 0xb6, 0x22, 0x04, 0xa5,
+ 0xa5, 0xa5, 0x8d, 0xb6, 0x28, 0x04, 0xa5, 0x53, 0x8c, 0xdb, 0x8e, 0x46,
+ 0x02, 0x26, 0xa1, 0x26, 0x00, 0xe8, 0x3e, 0xe2, 0x8e, 0xc3, 0xab, 0x8e,
+ 0x46, 0x02, 0x26, 0xa1, 0x24, 0x00, 0xe8, 0x31, 0xe2, 0x8e, 0xc3, 0xab,
+ 0x5b, 0xe8, 0x92, 0x03, 0x8b, 0xda, 0x5f, 0xc3, 0x8d, 0x4d, 0x38, 0x57,
+ 0x53, 0xe8, 0xe8, 0x02, 0x5a, 0x5f, 0x72, 0xf3, 0x57, 0xe8, 0x6f, 0xfd,
+ 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00, 0x24, 0xab, 0x47, 0xb0, 0x23, 0xaa,
+ 0x8d, 0xb6, 0xdc, 0x02, 0xa5, 0xa5, 0x8d, 0xb6, 0xf2, 0x03, 0xb9, 0x06,
+ 0x00, 0xf3, 0xa5, 0x8d, 0xb6, 0x36, 0x04, 0xa5, 0xa5, 0xa5, 0xa5, 0x8d,
+ 0xb6, 0x2e, 0x04, 0xa5, 0xa5, 0xa5, 0xa5, 0xe8, 0x50, 0x03, 0x8b, 0xda,
+ 0x5f, 0xc3, 0x8d, 0x4d, 0x3e, 0x57, 0x53, 0xe8, 0xa6, 0x02, 0x5a, 0x5f,
+ 0x72, 0x64, 0x57, 0xe8, 0x2d, 0xfd, 0x8c, 0xd8, 0x8e, 0xc0, 0xb8, 0x00,
+ 0x2a, 0xab, 0x47, 0xb0, 0x24, 0xaa, 0x8d, 0xb6, 0xdc, 0x02, 0xa5, 0xa5,
+ 0x8d, 0xb6, 0x06, 0x04, 0xb9, 0x0a, 0x00, 0xf3, 0xa5, 0x8d, 0xb6, 0x28,
+ 0x04, 0xa5, 0x53, 0x8c, 0xdb, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x26, 0x00,
+ 0xe8, 0xa7, 0xe1, 0x8e, 0xc3, 0xab, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x24,
+ 0x00, 0xe8, 0x9a, 0xe1, 0x8e, 0xc3, 0xab, 0x5b, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x8d, 0xb6, 0x3e, 0x04, 0xa5, 0x8b, 0x86, 0xf8, 0x01, 0x86, 0xc4, 0xab,
+ 0x8d, 0xb6, 0x42, 0x04, 0xa5, 0x8b, 0x86, 0xf6, 0x01, 0x86, 0xc4, 0xab,
+ 0xe8, 0xdf, 0x02, 0x8b, 0xda, 0x5f, 0xc3, 0xb9, 0x3a, 0x00, 0xe8, 0x37,
+ 0x02, 0x72, 0xf7, 0x8d, 0xb6, 0x46, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03,
+ 0xe9, 0xbb, 0x02, 0x68, 0x9d, 0x2c, 0xe9, 0xb5, 0x02, 0xb9, 0x26, 0x00,
+ 0xe8, 0x11, 0x02, 0x72, 0xd1, 0xff, 0x86, 0x4e, 0x02, 0x8d, 0xb6, 0x80,
+ 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0x80,
+ 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x91, 0x02, 0x68, 0x9d, 0x2c,
+ 0xe9, 0x8b, 0x02, 0xb9, 0x20, 0x00, 0xe8, 0xe7, 0x01, 0x72, 0xa7, 0x8d,
+ 0xb6, 0xee, 0x01, 0x8d, 0xbe, 0xc0, 0x04, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5,
+ 0xa5, 0xa5, 0x8d, 0xb6, 0xa6, 0x04, 0x8b, 0xfb, 0xd1, 0xe9, 0xf3, 0xa5,
+ 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x60, 0x02, 0x68, 0x9d,
+ 0x2c, 0xe9, 0x5a, 0x02, 0x89, 0x86, 0xe0, 0x04, 0x86, 0xc4, 0x89, 0x86,
+ 0x0e, 0x02, 0xb9, 0x2a, 0x00, 0xe8, 0xac, 0x01, 0x72, 0x18, 0x8d, 0xb6,
+ 0xc6, 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5,
+ 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0x07, 0xe9, 0x30, 0x02, 0xe9, 0x22,
+ 0x01, 0x90, 0x68, 0x9d, 0x2c, 0xe9, 0x26, 0x02, 0xb9, 0x18, 0x00, 0xe8,
+ 0x82, 0x01, 0x73, 0x03, 0xe9, 0x3f, 0xff, 0x8d, 0xb6, 0x64, 0x05, 0x8b,
+ 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0x0a, 0x02,
+ 0xb9, 0x24, 0x00, 0xe8, 0x66, 0x01, 0x73, 0x03, 0xe9, 0x23, 0xff, 0x8b,
+ 0x86, 0x0e, 0x05, 0x86, 0xc4, 0x89, 0x86, 0x26, 0x02, 0x8d, 0xb6, 0xf0,
+ 0x04, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9,
+ 0xe4, 0x01, 0xb9, 0x1c, 0x00, 0xe8, 0x40, 0x01, 0x73, 0x03, 0xe9, 0xfd,
+ 0xfe, 0x8d, 0xb6, 0x14, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1,
+ 0xe9, 0xf3, 0xa5, 0xe9, 0xc8, 0x01, 0xb9, 0x18, 0x00, 0xe8, 0x24, 0x01,
+ 0x73, 0x03, 0xe9, 0xe1, 0xfe, 0x8d, 0xb6, 0x30, 0x05, 0x8b, 0xfb, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5, 0xe9, 0xac, 0x01, 0xb9, 0x1c,
+ 0x00, 0x50, 0xe8, 0x07, 0x01, 0x58, 0x73, 0x03, 0xe9, 0xc3, 0xfe, 0x8d,
+ 0xb6, 0x48, 0x05, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3,
+ 0xa5, 0xe9, 0x8e, 0x01, 0x8b, 0x4f, 0x04, 0x53, 0xe8, 0xe9, 0x00, 0x5e,
+ 0x72, 0x17, 0x89, 0x9e, 0x38, 0x02, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0xd1, 0xe9, 0xf3, 0xa5, 0xc7, 0x86, 0x3a, 0x02, 0x01, 0x00, 0xe9, 0x6d,
+ 0x01, 0xe9, 0x70, 0x11, 0xb9, 0x18, 0x00, 0xe8, 0xc6, 0x00, 0x8d, 0xb6,
+ 0xa8, 0x03, 0x8b, 0xfb, 0x8c, 0xd8, 0x8e, 0xc0, 0xd1, 0xe9, 0xf3, 0xa5,
+ 0x33, 0xc0, 0x8d, 0x7f, 0x08, 0xb9, 0x06, 0x00, 0xf3, 0xab, 0xe9, 0x49,
+ 0x01, 0x53, 0x8b, 0x9e, 0xb0, 0x01, 0x8b, 0xb6, 0xae, 0x01, 0x3b, 0xde,
+ 0x74, 0x15, 0x8a, 0x47, 0x17, 0xf6, 0x44, 0x0e, 0x80, 0x75, 0x0e, 0x38,
+ 0x44, 0x17, 0x75, 0x09, 0x8b, 0x74, 0x02, 0x89, 0xb6, 0xae, 0x01, 0xeb,
+ 0x1a, 0x8b, 0xfe, 0x8b, 0x74, 0x02, 0x3b, 0xde, 0x74, 0x11, 0xf6, 0x44,
+ 0x0e, 0x80, 0x75, 0xf1, 0x38, 0x44, 0x17, 0x75, 0xec, 0x8b, 0x44, 0x02,
+ 0x89, 0x45, 0x02, 0x5b, 0xc3, 0xe8, 0x24, 0xdd, 0xc6, 0x86, 0x83, 0x02,
+ 0x00, 0x8d, 0xb6, 0xa6, 0x01, 0x8d, 0xbe, 0xac, 0x01, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0xa5, 0xa5, 0xa5, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00,
+ 0x00, 0x16, 0x8d, 0x9e, 0x52, 0x12, 0x89, 0x9e, 0xa8, 0x01, 0x89, 0x9e,
+ 0xaa, 0x01, 0xc7, 0x07, 0x30, 0x80, 0xc7, 0x47, 0x04, 0x00, 0x00, 0x83,
+ 0xc3, 0x08, 0x89, 0x9e, 0xa6, 0x01, 0xc6, 0x86, 0x86, 0x02, 0x01, 0x83,
+ 0xc1, 0x02, 0xeb, 0x4a, 0x8b, 0x9e, 0xac, 0x01, 0x8b, 0xb6, 0xae, 0x01,
+ 0xeb, 0x29, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x74, 0xa8, 0x8d, 0x96, 0x52,
+ 0x15, 0x8d, 0xbe, 0x52, 0x12, 0x8b, 0x9e, 0xa6, 0x01, 0x8b, 0xb6, 0xa8,
+ 0x01, 0xeb, 0x18, 0x90, 0x8b, 0x9e, 0xa6, 0x01, 0x8b, 0xb6, 0xa8, 0x01,
+ 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75, 0xcd, 0x8d, 0x96, 0x52, 0x12, 0x8d,
+ 0xbe, 0x52, 0x09, 0x83, 0xc1, 0x02, 0x3b, 0xde, 0x73, 0x17, 0x8b, 0xc6,
+ 0x2b, 0xc3, 0x3b, 0xc1, 0x72, 0x25, 0xc7, 0x07, 0x00, 0x00, 0x83, 0xc3,
+ 0x02, 0xc7, 0x07, 0x00, 0x00, 0x83, 0xe9, 0x02, 0xc3, 0x8b, 0xc2, 0x2b,
+ 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xe7, 0x8b, 0xdf, 0x8b, 0xc6, 0x2b,
+ 0xc3, 0x3b, 0xc1, 0x72, 0x02, 0xeb, 0xdb, 0x3b, 0xb6, 0xae, 0x01, 0x74,
+ 0x11, 0x80, 0xbe, 0x5e, 0x02, 0x01, 0x75, 0x05, 0x83, 0x8e, 0xda, 0x02,
+ 0x02, 0xe8, 0x68, 0x01, 0xf9, 0xc3, 0x8b, 0x74, 0x02, 0x89, 0xb6, 0xae,
+ 0x01, 0x3b, 0xdd, 0x74, 0x04, 0x3b, 0xde, 0x77, 0xc4, 0x8b, 0xc6, 0x2b,
+ 0xc3, 0x3b, 0xc1, 0x72, 0xe9, 0x89, 0xb6, 0xae, 0x01, 0xeb, 0xa7, 0x8b,
+ 0xb6, 0xb0, 0x01, 0x89, 0x5c, 0x02, 0x80, 0x4c, 0x05, 0x80, 0x89, 0x9e,
+ 0xb0, 0x01, 0x03, 0x5f, 0x04, 0x83, 0xc3, 0x06, 0x89, 0x9e, 0xac, 0x01,
+ 0xc6, 0x86, 0x87, 0x02, 0x01, 0xc3, 0x80, 0xbe, 0x83, 0x02, 0x01, 0x75,
+ 0xda, 0x8e, 0x46, 0x02, 0x26, 0xa1, 0x0c, 0x00, 0x0c, 0x02, 0x80, 0xbe,
+ 0x86, 0x02, 0x01, 0x74, 0x27, 0x8b, 0xb6, 0xaa, 0x01, 0x89, 0x5c, 0x02,
+ 0x80, 0x4c, 0x05, 0x80, 0x83, 0xc8, 0x04, 0x25, 0xff, 0xf7, 0x8e, 0x46,
+ 0x02, 0x26, 0xa3, 0x0c, 0x00, 0x89, 0x9e, 0xaa, 0x01, 0x03, 0x5f, 0x04,
+ 0x83, 0xc3, 0x06, 0x89, 0x9e, 0xa6, 0x01, 0xc3, 0x8e, 0x46, 0x02, 0x89,
+ 0x9e, 0xa8, 0x01, 0x26, 0x89, 0x1e, 0x2c, 0x00, 0x83, 0xc8, 0x08, 0x25,
+ 0xff, 0xf7, 0xc6, 0x86, 0x86, 0x02, 0x00, 0xeb, 0xd1, 0x53, 0xf6, 0x86,
+ 0x83, 0x02, 0x01, 0x74, 0x0c, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c,
+ 0x00, 0xfe, 0xe8, 0x8c, 0xfe, 0x5b, 0xc3, 0x90, 0xe9, 0xb8, 0x00, 0x90,
+ 0x80, 0xbe, 0x83, 0x02, 0x00, 0x75, 0xf5, 0x50, 0xfa, 0x8d, 0xb6, 0xac,
+ 0x01, 0x8d, 0xbe, 0xa6, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5,
+ 0x80, 0xbe, 0x63, 0x01, 0x01, 0x75, 0x16, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x0e, 0x00, 0x00, 0x00, 0x02, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x00,
+ 0x00, 0xff, 0xe3, 0xeb, 0x27, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x00,
+ 0x00, 0x00, 0x02, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x74, 0x0c, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x0e, 0x00, 0x00, 0x00, 0x1c, 0xeb, 0x0a, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x26, 0x00, 0x00, 0xff, 0xe3, 0x33, 0xc0, 0x89, 0x86,
+ 0xae, 0x01, 0x40, 0x88, 0x86, 0x83, 0x02, 0x58, 0xf6, 0x86, 0x54, 0x02,
+ 0x01, 0x74, 0x0a, 0xe8, 0xe0, 0xe4, 0x8e, 0x46, 0x02, 0x26, 0xa2, 0x1c,
+ 0x00, 0x8b, 0x9e, 0xa8, 0x01, 0x83, 0x3f, 0x00, 0x74, 0x0f, 0xf7, 0x07,
+ 0x20, 0x00, 0x75, 0x06, 0xc7, 0x07, 0x00, 0x00, 0xeb, 0x03, 0xe8, 0x89,
+ 0x00, 0xf6, 0x86, 0x87, 0x02, 0x01, 0x74, 0x19, 0x8e, 0x46, 0x02, 0x26,
+ 0x89, 0x1e, 0x2c, 0x00, 0xc6, 0x86, 0x87, 0x02, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0x83, 0x0e, 0x0c, 0x00, 0x08, 0xfb, 0xeb, 0x06, 0xc6, 0x86, 0x86,
+ 0x02, 0x01, 0xfb, 0xc3, 0x56, 0x8d, 0xb6, 0x52, 0x09, 0xc7, 0x86, 0xa6,
+ 0x01, 0x5a, 0x09, 0x01, 0xae, 0xa6, 0x01, 0x89, 0xb6, 0xa8, 0x01, 0x89,
+ 0xb6, 0xaa, 0x01, 0xc7, 0x04, 0x30, 0x80, 0xc7, 0x44, 0x04, 0x00, 0x00,
+ 0xc6, 0x86, 0x86, 0x02, 0x01, 0x5e, 0xc3, 0xff, 0xa4, 0x20, 0x04, 0x80,
+ 0x7e, 0x06, 0x46, 0x75, 0x1c, 0xf6, 0x86, 0x76, 0x02, 0x01, 0x74, 0x15,
+ 0xff, 0x8e, 0xcc, 0x02, 0x75, 0x0f, 0xc6, 0x86, 0x76, 0x02, 0x00, 0xc6,
+ 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x7d, 0xe2, 0xeb, 0x10, 0x83, 0xfe, 0x10,
+ 0x74, 0x07, 0x83, 0xfe, 0x0e, 0x74, 0x02, 0xeb, 0x04, 0xff, 0xa4, 0x20,
+ 0x04, 0xc3, 0x8b, 0x9e, 0xa8, 0x01, 0x8b, 0x07, 0xfb, 0xa9, 0x10, 0x00,
+ 0x74, 0x6c, 0xa9, 0x00, 0x80, 0x75, 0x46, 0x8b, 0x77, 0x17, 0x81, 0xe6,
+ 0xff, 0x00, 0xf7, 0x86, 0x3a, 0x02, 0x01, 0x00, 0x74, 0x1b, 0x3b, 0x9e,
+ 0x38, 0x02, 0x75, 0x15, 0x89, 0x86, 0x74, 0x15, 0x50, 0x53, 0x56, 0xe8,
+ 0x4e, 0x0e, 0x5e, 0x5b, 0x58, 0xc7, 0x86, 0x3a, 0x02, 0x00, 0x00, 0xeb,
+ 0x18, 0xf7, 0x46, 0x14, 0xff, 0xff, 0x74, 0x11, 0x83, 0xfe, 0x2a, 0x77,
+ 0x0c, 0xd1, 0xe6, 0x68, 0xc1, 0x2f, 0xff, 0x66, 0x14, 0x5b, 0x83, 0xc4,
+ 0x02, 0x81, 0x0f, 0x00, 0x80, 0xfa, 0xf6, 0x47, 0x05, 0x80, 0x74, 0x1a,
+ 0x8b, 0x5f, 0x02, 0x89, 0x9e, 0xa8, 0x01, 0xf7, 0x07, 0x10, 0x00, 0x74,
+ 0x0d, 0xff, 0x86, 0x3a, 0x01, 0x83, 0xbe, 0x3a, 0x01, 0x06, 0x77, 0x0f,
+ 0xeb, 0x8c, 0xc6, 0x86, 0xb8, 0x01, 0x00, 0xc7, 0x86, 0x3a, 0x01, 0x00,
+ 0x00, 0xfb, 0xc3, 0xe8, 0xa2, 0xdd, 0xf7, 0xc6, 0xff, 0xff, 0x74, 0xea,
+ 0xc7, 0x44, 0x02, 0x03, 0x00, 0xc6, 0x86, 0xb8, 0x01, 0x01, 0x8d, 0x7e,
+ 0x16, 0xe8, 0xaa, 0xdd, 0xeb, 0xdd, 0xa9, 0x20, 0x00, 0x75, 0x74, 0xf7,
+ 0x47, 0x04, 0x00, 0x80, 0x74, 0x05, 0xe8, 0x08, 0x00, 0x72, 0x9f, 0x53,
+ 0x68, 0xbd, 0x2f, 0xff, 0xe6, 0x8a, 0x47, 0x17, 0x8b, 0xfb, 0x8b, 0x7d,
+ 0x02, 0x38, 0x45, 0x17, 0x74, 0x09, 0xf7, 0x45, 0x04, 0x00, 0x80, 0x75,
+ 0xf1, 0xf8, 0xc3, 0xf9, 0xc3, 0xa9, 0x20, 0x00, 0x75, 0x05, 0xa9, 0x00,
+ 0x10, 0x75, 0x0c, 0x33, 0xc9, 0xa9, 0x05, 0x00, 0x75, 0x0a, 0xa9, 0x0a,
+ 0x04, 0x74, 0x05, 0x8b, 0x0d, 0xe3, 0x01, 0x49, 0x89, 0x0d, 0xc3, 0x53,
+ 0x8b, 0x4f, 0x04, 0x80, 0xe5, 0x7f, 0x89, 0x4f, 0x04, 0x83, 0xc1, 0x06,
+ 0xe8, 0xdd, 0xfc, 0x72, 0x19, 0x5e, 0x56, 0x8b, 0xfb, 0xd1, 0xe9, 0x83,
+ 0xe9, 0x02, 0x83, 0xc6, 0x04, 0x83, 0xc7, 0x04, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0xf3, 0xa5, 0xe8, 0x61, 0xfd, 0xf8, 0x5b, 0xc3, 0x80, 0x7e, 0x08, 0x02,
+ 0x75, 0x0b, 0xa9, 0x20, 0x00, 0x75, 0x06, 0xc7, 0x86, 0xc8, 0x01, 0x01,
+ 0x00, 0xc3, 0x8a, 0x56, 0x06, 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80, 0xfa,
+ 0x44, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x18, 0x80, 0xfa, 0x0c,
+ 0x74, 0x07, 0x80, 0xfa, 0x0e, 0x74, 0x02, 0xeb, 0x0b, 0xa9, 0x20, 0x00,
+ 0x75, 0x06, 0xb8, 0x01, 0x00, 0xe8, 0x63, 0xec, 0xc3, 0xb9, 0x06, 0x00,
+ 0xa9, 0x20, 0x00, 0x74, 0x09, 0xb9, 0x08, 0x00, 0xa9, 0x0f, 0x00, 0x75,
+ 0x01, 0xc3, 0xff, 0x86, 0xc4, 0x02, 0x83, 0xbe, 0xc4, 0x02, 0x02, 0x72,
+ 0x06, 0x8b, 0xc1, 0xe8, 0x41, 0xec, 0xc3, 0x53, 0xe8, 0x44, 0xf8, 0x5b,
+ 0xc3, 0x53, 0x68, 0xbd, 0x2f, 0xe9, 0xb5, 0xf8, 0x80, 0x7e, 0x06, 0x0c,
+ 0x75, 0x1d, 0xa9, 0x00, 0x10, 0x75, 0xee, 0xa9, 0x20, 0x00, 0x74, 0xe9,
+ 0xa8, 0x0a, 0x75, 0x10, 0xff, 0x86, 0xba, 0x02, 0x83, 0xbe, 0xba, 0x02,
+ 0x04, 0x72, 0xda, 0xc6, 0x46, 0x07, 0x0e, 0xc3, 0x83, 0xbe, 0xb8, 0x02,
+ 0x04, 0x73, 0xf8, 0xbe, 0xcf, 0x45, 0xe8, 0x73, 0xde, 0xeb, 0xf0, 0x8d,
+ 0xbe, 0xbe, 0x02, 0xe8, 0x0f, 0xff, 0x0b, 0xc9, 0x74, 0xe5, 0x53, 0x68,
+ 0xbd, 0x2f, 0xe9, 0x70, 0xf8, 0x8d, 0xbe, 0xb6, 0x02, 0xe8, 0xfd, 0xfe,
+ 0x0b, 0xc9, 0x74, 0x03, 0xe9, 0x14, 0xff, 0xc3, 0x53, 0x8a, 0x56, 0x06,
+ 0x80, 0xfa, 0x02, 0x74, 0x17, 0x80, 0xfa, 0x44, 0x74, 0x12, 0x80, 0x7e,
+ 0x08, 0x08, 0x75, 0x2d, 0x80, 0xfa, 0x0c, 0x74, 0x07, 0x80, 0xfa, 0x0e,
+ 0x74, 0x02, 0xeb, 0x21, 0xa9, 0x20, 0x00, 0x74, 0x1e, 0x8b, 0x96, 0x66,
+ 0x01, 0x4a, 0x89, 0x96, 0x66, 0x01, 0x83, 0xfa, 0x01, 0x77, 0x23, 0xbe,
+ 0xb7, 0x45, 0xe8, 0x17, 0xde, 0xc6, 0x86, 0x86, 0x02, 0x01, 0xe8, 0xa6,
+ 0xf7, 0x5b, 0xc3, 0xfe, 0x8e, 0x68, 0x01, 0x80, 0x8e, 0x68, 0x01, 0x00,
+ 0x75, 0x08, 0xb8, 0x01, 0x00, 0xe8, 0x8b, 0xeb, 0xeb, 0xeb, 0xbe, 0xb7,
+ 0x45, 0xe8, 0xf4, 0xdd, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6,
+ 0x86, 0x86, 0x02, 0x01, 0xfa, 0xe8, 0x94, 0xf7, 0xeb, 0xd3, 0xa9, 0x20,
+ 0x00, 0x74, 0x41, 0xa9, 0x0f, 0x00, 0x75, 0x25, 0xc6, 0x86, 0x65, 0x02,
+ 0x01, 0xc6, 0x86, 0x66, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab, 0x8b, 0x86,
+ 0x06, 0x02, 0x83, 0x8e, 0x06, 0x02, 0x40, 0xeb, 0x17, 0x8d, 0x77, 0x0e,
+ 0x8d, 0xbe, 0xee, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5, 0x8b,
+ 0x86, 0x06, 0x02, 0x83, 0xa6, 0x06, 0x02, 0xbf, 0x33, 0x86, 0x06, 0x02,
+ 0x74, 0x05, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc3, 0xfb, 0xc3, 0xff, 0xa4,
+ 0xc8, 0x03, 0x53, 0x56, 0xf7, 0x07, 0x00, 0x10, 0x74, 0x0a, 0x8b, 0xc7,
+ 0x80, 0x7e, 0x06, 0x44, 0x74, 0x49, 0xeb, 0x44, 0x8b, 0xc7, 0x8b, 0x49,
+ 0x16, 0x80, 0xf9, 0x00, 0x74, 0x05, 0x80, 0xf9, 0x03, 0x75, 0x38, 0x8d,
+ 0xbe, 0x0a, 0x03, 0x83, 0x3d, 0x00, 0x75, 0x0c, 0x83, 0x7d, 0x02, 0x00,
+ 0x75, 0x06, 0x83, 0x7d, 0x04, 0x00, 0x74, 0x23, 0x8b, 0xf8, 0x8d, 0x71,
+ 0x0e, 0x8d, 0xbe, 0x0a, 0x03, 0x8c, 0xd8, 0x8e, 0xc0, 0xb9, 0x03, 0x00,
+ 0xf3, 0xa7, 0x74, 0x0f, 0xc7, 0x86, 0x2a, 0x02, 0x0e, 0x00, 0xb8, 0x0b,
+ 0x00, 0xe8, 0xc3, 0xea, 0x5e, 0x5b, 0xc3, 0x8b, 0xf8, 0x5e, 0x5b, 0xff,
+ 0xa4, 0xf4, 0x03, 0xff, 0x86, 0x48, 0x02, 0xc7, 0x86, 0x2a, 0x02, 0x06,
+ 0x00, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0xbe, 0xfc, 0x01, 0x8d, 0x77, 0x0e,
+ 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x8b, 0xb6, 0xc4, 0x05, 0x8b, 0x04, 0x86,
+ 0xe0, 0x89, 0x86, 0x02, 0x02, 0x89, 0x86, 0x12, 0x02, 0x8b, 0xb6, 0xc9,
+ 0x05, 0x8b, 0x04, 0x89, 0x86, 0x16, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x86,
+ 0x18, 0x02, 0x8b, 0x44, 0x04, 0x89, 0x86, 0x1a, 0x02, 0x8b, 0xb6, 0xce,
+ 0x05, 0x8b, 0x04, 0x89, 0x86, 0x20, 0x02, 0x8b, 0x44, 0x02, 0x89, 0x86,
+ 0x22, 0x02, 0x8b, 0xb6, 0xc4, 0x05, 0x8b, 0x04, 0x80, 0x7e, 0x08, 0x06,
+ 0x75, 0x56, 0xf7, 0x07, 0x00, 0x10, 0x74, 0x14, 0xf6, 0x47, 0x06, 0x08,
+ 0x75, 0x0b, 0x80, 0xbe, 0x5f, 0x02, 0x00, 0x75, 0x04, 0xc6, 0x46, 0x09,
+ 0x04, 0xe9, 0x1b, 0x01, 0x3b, 0x86, 0x00, 0x03, 0x77, 0xf7, 0x80, 0xbe,
+ 0x5e, 0x02, 0x01, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0xea, 0xc6,
+ 0x46, 0x07, 0x10, 0xc6, 0x46, 0x09, 0x1e, 0xeb, 0xe0, 0x80, 0xbe, 0x5f,
+ 0x02, 0x00, 0x75, 0xd9, 0xc6, 0x46, 0x09, 0x0a, 0xf6, 0x86, 0x07, 0x02,
+ 0x10, 0x74, 0xce, 0x80, 0xa6, 0x07, 0x02, 0x6f, 0xc6, 0x86, 0x85, 0x02,
+ 0x01, 0xe9, 0xdf, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x5b, 0xc6, 0x86,
+ 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xbf,
+ 0xbe, 0x93, 0x45, 0xe8, 0x5a, 0xdc, 0x8b, 0xb6, 0xc9, 0x05, 0x8d, 0xbe,
+ 0xf4, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75,
+ 0x21, 0x83, 0xf8, 0x01, 0x74, 0x1c, 0xff, 0x8e, 0xb0, 0x02, 0x75, 0x13,
+ 0xf6, 0x86, 0x58, 0x02, 0x01, 0x75, 0x0c, 0xc6, 0x86, 0x58, 0x02, 0x01,
+ 0xc6, 0x46, 0x09, 0x08, 0xe9, 0x94, 0x00, 0xe9, 0x91, 0x00, 0xc7, 0x86,
+ 0xb0, 0x02, 0x08, 0x00, 0x83, 0xf8, 0x01, 0x75, 0x0a, 0xc7, 0x86, 0xae,
+ 0x02, 0x02, 0x00, 0xeb, 0x7e, 0xeb, 0x2e, 0x8d, 0x77, 0x0e, 0x8d, 0xbe,
+ 0x0a, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75,
+ 0xe4, 0xff, 0x8e, 0xae, 0x02, 0x75, 0x14, 0xc7, 0x86, 0xae, 0x02, 0x02,
+ 0x00, 0xc6, 0x86, 0x54, 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x0c, 0x00, 0x40, 0xeb, 0x4e, 0x80, 0xbe, 0x5e, 0x02, 0x00, 0x74, 0x0c,
+ 0x80, 0x7e, 0x08, 0x08, 0x74, 0x41, 0xc6, 0x46, 0x09, 0x0a, 0xeb, 0x3b,
+ 0xb7, 0x10, 0x8a, 0x5e, 0x06, 0x80, 0xfb, 0x06, 0x74, 0x1f, 0x80, 0xfb,
+ 0x08, 0x74, 0x1a, 0x80, 0xfb, 0x04, 0x74, 0x15, 0x80, 0xfb, 0x0c, 0x74,
+ 0x10, 0x80, 0xfb, 0x0a, 0x75, 0x07, 0xc6, 0x86, 0x5b, 0x02, 0x00, 0xeb,
+ 0x04, 0xb7, 0x12, 0xeb, 0x12, 0x88, 0x7e, 0x07, 0x80, 0xff, 0x12, 0x75,
+ 0x04, 0xc6, 0x46, 0x09, 0x1e, 0xb8, 0x07, 0x00, 0xe8, 0x24, 0xe9, 0xc3,
+ 0xff, 0x86, 0x48, 0x02, 0xc7, 0x86, 0x2a, 0x02, 0x06, 0x00, 0x8c, 0xd8,
+ 0x8e, 0xc0, 0x8d, 0xbe, 0xfc, 0x01, 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00,
+ 0xf3, 0xa5, 0x80, 0x7e, 0x06, 0x48, 0x74, 0x08, 0xb8, 0x06, 0x00, 0xe8,
+ 0xfd, 0xe8, 0xeb, 0x30, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x74, 0x1f, 0x80,
+ 0x7e, 0x08, 0x16, 0x75, 0x19, 0xc6, 0x46, 0x09, 0x1a, 0xc6, 0x86, 0x72,
+ 0x02, 0x00, 0xc6, 0x86, 0x68, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x83,
+ 0x26, 0x0c, 0x00, 0xfe, 0xeb, 0x0a, 0x80, 0x7e, 0x08, 0x18, 0x75, 0x04,
+ 0xc6, 0x46, 0x09, 0x1a, 0xc3, 0x8a, 0x4e, 0x06, 0x80, 0xbe, 0xa7, 0x02,
+ 0x01, 0x74, 0x02, 0xeb, 0x06, 0xb8, 0x06, 0x00, 0xe8, 0xb8, 0xe8, 0xc3,
+ 0x80, 0x7e, 0x06, 0x42, 0x75, 0x42, 0x8b, 0x47, 0x1a, 0x83, 0xf8, 0x00,
+ 0x75, 0x27, 0xf6, 0x86, 0x7e, 0x02, 0x01, 0x75, 0x18, 0xf7, 0x86, 0xf4,
+ 0x00, 0x00, 0x10, 0x74, 0x10, 0xb8, 0x02, 0x00, 0xe8, 0x7c, 0x10, 0xc6,
+ 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x1b, 0xb8, 0x06, 0x00,
+ 0xe8, 0x84, 0xe8, 0xeb, 0x13, 0x3d, 0x00, 0x02, 0x75, 0x0e, 0xc6, 0x86,
+ 0x77, 0x02, 0x01, 0xe8, 0x74, 0x06, 0xbe, 0x2f, 0x46, 0xe8, 0xe0, 0xda,
+ 0xc3, 0xc7, 0x86, 0x2a, 0x02, 0x02, 0x00, 0x80, 0x7e, 0x06, 0x46, 0x75,
+ 0x2b, 0x8b, 0x47, 0x1a, 0x83, 0xf8, 0x00, 0x75, 0x10, 0xc6, 0x46, 0x07,
+ 0x48, 0x80, 0x7e, 0x08, 0x1c, 0x75, 0x19, 0xc6, 0x46, 0x09, 0x16, 0xeb,
+ 0x13, 0x86, 0xc4, 0x3d, 0x20, 0x80, 0x75, 0x0c, 0xc7, 0x86, 0x2a, 0x02,
+ 0x11, 0x00, 0xb8, 0x08, 0x00, 0xe8, 0x37, 0xe8, 0xc3, 0xc7, 0x86, 0x2a,
+ 0x02, 0x0f, 0x00, 0x80, 0x7e, 0x06, 0x44, 0x74, 0x06, 0x80, 0x7e, 0x06,
+ 0x42, 0x75, 0x08, 0xb8, 0x06, 0x00, 0xe8, 0x1e, 0xe8, 0xeb, 0x0d, 0xf6,
+ 0x86, 0x72, 0x02, 0x01, 0x74, 0x06, 0xbe, 0x3b, 0x46, 0xe8, 0x80, 0xda,
+ 0xc3, 0x80, 0x7e, 0x06, 0x44, 0x75, 0x14, 0xe8, 0x76, 0xd8, 0xc7, 0x44,
+ 0x02, 0x02, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x89, 0xd8, 0xbe, 0xb7, 0x45,
+ 0xe8, 0x17, 0xdb, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x40, 0x00, 0x74, 0x18,
+ 0xf7, 0x86, 0xf4, 0x00, 0x00, 0x20, 0x74, 0x10, 0x80, 0x7e, 0x06, 0x08,
+ 0x72, 0x0a, 0x80, 0x7e, 0x06, 0x0e, 0x77, 0x04, 0xc6, 0x46, 0x07, 0x14,
+ 0xc3, 0xff, 0x86, 0x4c, 0x02, 0xc7, 0x86, 0x2a, 0x02, 0x0b, 0x00, 0x8a,
+ 0x86, 0x54, 0x02, 0x88, 0x86, 0x80, 0x02, 0xc7, 0x86, 0xc2, 0x02, 0x00,
+ 0x00, 0xc6, 0x86, 0x61, 0x02, 0x00, 0x83, 0x8e, 0x06, 0x02, 0x20, 0x81,
+ 0xa6, 0x06, 0x02, 0xff, 0x2f, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86,
+ 0x54, 0x02, 0x01, 0x74, 0x38, 0xc6, 0x86, 0x80, 0x02, 0x00, 0x8e, 0x46,
+ 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a, 0x00,
+ 0x75, 0x0a, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00,
+ 0x8a, 0xa6, 0x80, 0x02, 0x88, 0xa6, 0x54, 0x02, 0xe8, 0x25, 0xdc, 0x88,
+ 0x86, 0x54, 0x02, 0xc6, 0x46, 0x09, 0x0c, 0xc7, 0x86, 0xc6, 0x01, 0x00,
+ 0x01, 0x80, 0x7e, 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x06, 0x80,
+ 0x7e, 0x08, 0x02, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x0c, 0x80, 0x7e, 0x08,
+ 0x06, 0x74, 0x05, 0xc6, 0x86, 0x5a, 0x02, 0x01, 0x8d, 0x77, 0x0e, 0x8d,
+ 0xbe, 0xf4, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x06, 0x00, 0xf3, 0xa6,
+ 0x74, 0x08, 0x77, 0x03, 0xe9, 0x95, 0x00, 0xe9, 0xfe, 0x00, 0xf6, 0x47,
+ 0x06, 0x08, 0x75, 0x59, 0x80, 0x7e, 0x08, 0x04, 0x75, 0x53, 0x8b, 0xb6,
+ 0xd4, 0x05, 0x8d, 0xbe, 0x0a, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03,
+ 0x00, 0xb8, 0x01, 0x00, 0xf3, 0xa7, 0x74, 0x02, 0xeb, 0x3e, 0xff, 0x86,
+ 0xb4, 0x02, 0x83, 0xbe, 0xb4, 0x02, 0x03, 0x72, 0x30, 0x83, 0xbe, 0xb2,
+ 0x02, 0x03, 0x72, 0x29, 0xc6, 0x46, 0x09, 0x02, 0xc6, 0x86, 0x80, 0x02,
+ 0x01, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x0e, 0x24, 0x00, 0x00, 0x80, 0x8a,
+ 0x86, 0x54, 0x02, 0x8a, 0xa6, 0x80, 0x02, 0x88, 0xa6, 0x54, 0x02, 0xe8,
+ 0x86, 0xdb, 0x88, 0x86, 0x54, 0x02, 0xe8, 0xb2, 0xf4, 0xe9, 0xec, 0x00,
+ 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x1d, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6,
+ 0x86, 0x6b, 0x02, 0x00, 0x8a, 0x86, 0x54, 0x02, 0x8a, 0xa6, 0x80, 0x02,
+ 0x88, 0xa6, 0x54, 0x02, 0xe8, 0x5d, 0xdb, 0x88, 0x86, 0x54, 0x02, 0xc6,
+ 0x46, 0x09, 0x0c, 0xb8, 0x00, 0x03, 0xe8, 0x03, 0xf5, 0xe9, 0xbc, 0x00,
+ 0x80, 0x7e, 0x08, 0x00, 0x75, 0x3d, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75,
+ 0x16, 0xf6, 0x86, 0x68, 0x02, 0x01, 0x74, 0x16, 0xf6, 0x86, 0x5e, 0x02,
+ 0x01, 0x74, 0x08, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x75, 0x16, 0xc6,
+ 0x46, 0x09, 0x0c, 0xe9, 0x92, 0x00, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74,
+ 0x9c, 0xf7, 0x86, 0x12, 0x01, 0x00, 0x01, 0x74, 0x94, 0xc6, 0x46, 0x09,
+ 0x04, 0xff, 0x86, 0x4a, 0x02, 0xeb, 0x79, 0x80, 0x7e, 0x08, 0x0a, 0x75,
+ 0x73, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x75, 0x0e, 0xf7, 0x86, 0x12, 0x01,
+ 0x00, 0x01, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x0c, 0xeb, 0x5e, 0xf7, 0x86,
+ 0x12, 0x01, 0x00, 0x01, 0x74, 0x56, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x50,
+ 0x80, 0x7e, 0x08, 0x04, 0x75, 0x2c, 0xc6, 0x46, 0x09, 0x0c, 0x80, 0x7e,
+ 0x0a, 0x00, 0x75, 0x1d, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b,
+ 0x02, 0x00, 0x8a, 0x86, 0x54, 0x02, 0x8a, 0xa6, 0x80, 0x02, 0x88, 0xa6,
+ 0x54, 0x02, 0xe8, 0xb7, 0xda, 0x88, 0x86, 0x54, 0x02, 0xe8, 0x5f, 0xf1,
+ 0xeb, 0x1e, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x09, 0xf6, 0x86, 0x68, 0x02,
+ 0x01, 0x74, 0x02, 0xeb, 0xab, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x09, 0xf6,
+ 0x86, 0x5f, 0x02, 0x01, 0x75, 0x02, 0xeb, 0x9c, 0x8a, 0x86, 0x80, 0x02,
+ 0x88, 0x86, 0x54, 0x02, 0xc3, 0xc7, 0x86, 0xbc, 0x02, 0x02, 0x00, 0xff,
+ 0x86, 0x42, 0x02, 0xc7, 0x86, 0x2a, 0x02, 0x0c, 0x00, 0x80, 0x7e, 0x06,
+ 0x04, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x06, 0x75, 0x04, 0xc6, 0x46, 0x07,
+ 0x08, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x56, 0xf6, 0x86, 0x54, 0x02, 0x01,
+ 0x74, 0x3b, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x24, 0x00, 0xff, 0x7f, 0xb8, 0x00, 0x02, 0xe8, 0xf9, 0xf3, 0xf6,
+ 0x86, 0x5e, 0x02, 0x01, 0x74, 0x0c, 0xbe, 0xbd, 0x45, 0xe8, 0xf8, 0xd7,
+ 0xbe, 0xdb, 0x45, 0xe8, 0xf2, 0xd7, 0x80, 0x7e, 0x0a, 0x00, 0x75, 0x0d,
+ 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8, 0x1f,
+ 0xda, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x34, 0xc6, 0x86, 0x58, 0x02,
+ 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00, 0xe9, 0xc9, 0x00, 0x80, 0x7e, 0x08,
+ 0x0c, 0x75, 0x24, 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x5e, 0x02, 0x01,
+ 0x74, 0x16, 0xbe, 0xbd, 0x45, 0xe8, 0xb4, 0xd7, 0xbe, 0xdb, 0x45, 0xe8,
+ 0xae, 0xd7, 0xc6, 0x86, 0x58, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00,
+ 0xe9, 0x9f, 0x00, 0x80, 0x7e, 0x08, 0x02, 0x75, 0xf7, 0xc7, 0x86, 0xc8,
+ 0x01, 0x00, 0x00, 0xc6, 0x46, 0x09, 0x00, 0xf6, 0x86, 0x5e, 0x02, 0x01,
+ 0x74, 0x0a, 0xc6, 0x86, 0x58, 0x02, 0x00, 0xc6, 0x86, 0x59, 0x02, 0x00,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xf4, 0x02, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9,
+ 0x06, 0x00, 0xf3, 0xa6, 0x74, 0x2e, 0xc6, 0x86, 0x54, 0x02, 0x00, 0x8e,
+ 0x46, 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f, 0x80, 0x7e, 0x0a,
+ 0x00, 0x75, 0x0a, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02,
+ 0x00, 0xe8, 0x8c, 0xd9, 0xb8, 0x00, 0x02, 0xe8, 0x3a, 0xf3, 0xc6, 0x46,
+ 0x09, 0x00, 0xeb, 0x3e, 0x8e, 0x46, 0x02, 0x26, 0xa0, 0x1c, 0x00, 0xc6,
+ 0x46, 0x09, 0x00, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x55, 0x02,
+ 0x00, 0xc6, 0x86, 0x65, 0x02, 0x00, 0xe8, 0x63, 0xd9, 0x24, 0x07, 0xe8,
+ 0xde, 0xf5, 0xbe, 0x8d, 0x45, 0xe8, 0x18, 0xd7, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x33, 0xc0, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab, 0xe8, 0x49, 0xf0,
+ 0xbe, 0xdb, 0x45, 0xe8, 0x02, 0xd7, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x03,
+ 0xe8, 0x90, 0xf0, 0xc3, 0x8c, 0xd8, 0x8e, 0xc0, 0xff, 0x86, 0x50, 0x02,
+ 0xc7, 0x86, 0x2a, 0x02, 0x0f, 0x00, 0xf6, 0x86, 0xca, 0x01, 0x01, 0x74,
+ 0x3b, 0xb8, 0x9c, 0x56, 0xa3, 0x92, 0x56, 0x8d, 0x77, 0x0e, 0x8b, 0xf8,
+ 0xa5, 0xa5, 0xa5, 0xc7, 0x06, 0x9a, 0x56, 0x01, 0x00, 0xc6, 0x86, 0xcb,
+ 0x01, 0x00, 0x33, 0xff, 0xba, 0x02, 0x08, 0xe8, 0x24, 0xe8, 0xbf, 0x94,
+ 0x56, 0xb9, 0x03, 0x00, 0xf3, 0xa5, 0x8d, 0x77, 0x0e, 0xbf, 0x94, 0x56,
+ 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x05, 0xe8, 0x8b, 0x04, 0xeb, 0x00,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5, 0xa5, 0x80, 0x7e,
+ 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0x8b, 0x8e, 0xbc, 0x02,
+ 0xe3, 0x05, 0x49, 0x89, 0x8e, 0xbc, 0x02, 0xf7, 0x07, 0x3c, 0x00, 0x75,
+ 0x0a, 0xf6, 0x86, 0x68, 0x02, 0x01, 0x74, 0x03, 0xe8, 0x07, 0x02, 0xf6,
+ 0x86, 0x54, 0x02, 0x01, 0x75, 0x03, 0xe9, 0x93, 0x00, 0xbe, 0xdb, 0x45,
+ 0xe8, 0x69, 0xd6, 0xf7, 0x07, 0x00, 0x10, 0x75, 0x37, 0xc6, 0x86, 0x54,
+ 0x02, 0x00, 0x8e, 0x46, 0x02, 0x26, 0x81, 0x26, 0x24, 0x00, 0xff, 0x7f,
+ 0xb8, 0x00, 0x02, 0xe8, 0x42, 0xf2, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74,
+ 0x06, 0xbe, 0xbd, 0x45, 0xe8, 0x41, 0xd6, 0x80, 0x7e, 0x0a, 0x00, 0x75,
+ 0x38, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xc6, 0x86, 0x6b, 0x02, 0x00, 0xe8,
+ 0x6e, 0xd8, 0xeb, 0x29, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x33, 0xc6, 0x86,
+ 0x65, 0x02, 0x01, 0xc6, 0x86, 0x66, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x33, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab,
+ 0x8b, 0x86, 0x06, 0x02, 0xa9, 0x40, 0x00, 0x74, 0x02, 0xeb, 0x48, 0x83,
+ 0xc8, 0x40, 0x89, 0x86, 0x06, 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xeb,
+ 0x3a, 0x83, 0xa6, 0x06, 0x02, 0xbf, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0,
+ 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5, 0xa5, 0xeb, 0x23,
+ 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x06, 0xbe, 0xdb, 0x45, 0xe8, 0xcf,
+ 0xd5, 0xc6, 0x86, 0x67, 0x02, 0x00, 0xf7, 0x07, 0x3c, 0x00, 0x75, 0x0b,
+ 0xc6, 0x86, 0x67, 0x02, 0x01, 0xbe, 0xc3, 0x45, 0xe8, 0xb9, 0xd5, 0xc3,
+ 0xeb, 0x61, 0x8c, 0xd8, 0x8e, 0xc0, 0xc7, 0x86, 0x2a, 0x02, 0x0d, 0x00,
+ 0xf6, 0x86, 0xca, 0x01, 0x01, 0x74, 0x50, 0x33, 0xff, 0xba, 0x02, 0x08,
+ 0xe8, 0xff, 0xe6, 0x8b, 0x3e, 0x92, 0x56, 0xb9, 0x03, 0x00, 0xf3, 0xa7,
+ 0x75, 0x3d, 0x81, 0xff, 0xaa, 0x5d, 0x73, 0x6f, 0x89, 0x3e, 0x92, 0x56,
+ 0x8d, 0x77, 0x0e, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74, 0x05, 0xc6, 0x86,
+ 0xcc, 0x01, 0x01, 0x81, 0xff, 0xaa, 0x5d, 0x73, 0x56, 0x89, 0x3e, 0x92,
+ 0x56, 0x8d, 0x77, 0x0e, 0xa5, 0xa5, 0xa5, 0xff, 0x06, 0x9a, 0x56, 0x8d,
+ 0x77, 0x0e, 0xbf, 0x94, 0x56, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x75, 0x03,
+ 0xe8, 0x36, 0x03, 0x8a, 0x86, 0x06, 0x02, 0xa8, 0x40, 0x75, 0x3d, 0x80,
+ 0x7e, 0x06, 0x04, 0x75, 0x04, 0xc6, 0x46, 0x07, 0x08, 0xf7, 0x07, 0x3c,
+ 0x00, 0x75, 0x3a, 0xf6, 0x86, 0x68, 0x02, 0x01, 0x74, 0x35, 0xf6, 0x86,
+ 0x54, 0x02, 0x01, 0x74, 0x07, 0xf6, 0x86, 0x65, 0x02, 0x01, 0x75, 0x27,
+ 0xe8, 0xb3, 0x00, 0xc7, 0x86, 0xbe, 0x02, 0x01, 0x00, 0xeb, 0x1c, 0xbf,
+ 0xa4, 0x5d, 0x33, 0xc0, 0xab, 0xab, 0xab, 0xe8, 0xf3, 0x02, 0xeb, 0xbb,
+ 0x24, 0xbf, 0x88, 0x86, 0x06, 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xeb,
+ 0xb6, 0xeb, 0x79, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x3c, 0xf6, 0x86,
+ 0x65, 0x02, 0x01, 0x74, 0x19, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x12,
+ 0x83, 0xbe, 0xbc, 0x02, 0x00, 0x75, 0x0b, 0x80, 0x7e, 0x08, 0x00, 0x75,
+ 0x05, 0x83, 0x8e, 0xda, 0x02, 0x08, 0xc6, 0x86, 0x65, 0x02, 0x01, 0xc6,
+ 0x86, 0x66, 0x02, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0x77,
+ 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xab, 0xab, 0xab, 0xeb, 0x4b, 0xf6, 0x86,
+ 0x68, 0x02, 0x01, 0x74, 0x44, 0xf6, 0x86, 0x67, 0x02, 0x01, 0x75, 0x0d,
+ 0xc6, 0x86, 0x67, 0x02, 0x01, 0xbe, 0xc3, 0x45, 0xe8, 0xa5, 0xd4, 0xeb,
+ 0x30, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x12, 0x80, 0x7e, 0x08, 0x00,
+ 0x75, 0x0c, 0x83, 0xbe, 0xbc, 0x02, 0x00, 0x75, 0x05, 0x83, 0x8e, 0xda,
+ 0x02, 0x08, 0xeb, 0x15, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x74, 0x0e, 0x8c,
+ 0xd8, 0x8e, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe, 0xee, 0x01, 0xa5, 0xa5,
+ 0xa5, 0xc3, 0x53, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x77, 0x0e, 0x8d, 0xbe,
+ 0x0a, 0x03, 0x8c, 0xd9, 0x8e, 0xc1, 0xb9, 0x03, 0x00, 0xf3, 0xa7, 0x74,
+ 0x54, 0x8b, 0x44, 0xfe, 0x89, 0x45, 0xfe, 0xf3, 0xa5, 0xbb, 0xfe, 0x04,
+ 0xb9, 0x0b, 0x00, 0x8d, 0xb6, 0x0a, 0x03, 0xad, 0x8b, 0x14, 0x8b, 0x74,
+ 0x02, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x15, 0x89, 0x75, 0x02, 0x83,
+ 0xc3, 0x02, 0xe2, 0xf1, 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x26, 0x8b,
+ 0xb6, 0xd9, 0x05, 0x8d, 0xbe, 0xea, 0x01, 0xa5, 0xa5, 0x80, 0x7e, 0x06,
+ 0x08, 0x76, 0x0b, 0xc7, 0x86, 0xbe, 0x02, 0x04, 0x00, 0xe8, 0xad, 0xef,
+ 0xeb, 0x0b, 0xc6, 0x86, 0x84, 0x02, 0x01, 0xc7, 0x86, 0xbe, 0x02, 0x01,
+ 0x00, 0x5b, 0xc3, 0xb8, 0x80, 0x0a, 0xf6, 0x86, 0xa6, 0x02, 0x01, 0x75,
+ 0x45, 0xf6, 0x86, 0xa8, 0x02, 0x01, 0x75, 0x3e, 0xf7, 0x86, 0xf6, 0x00,
+ 0x10, 0x00, 0x75, 0x36, 0xf7, 0x07, 0x82, 0x00, 0x74, 0x2f, 0xc7, 0x86,
+ 0x2a, 0x02, 0x07, 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0x8e, 0x06,
+ 0x02, 0x00, 0x01, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0xa7, 0x02,
+ 0x01, 0x75, 0x0c, 0x80, 0x7e, 0x06, 0x08, 0x72, 0x0c, 0x80, 0x7e, 0x06,
+ 0x0e, 0x77, 0x06, 0xb8, 0x0a, 0x00, 0xe8, 0x46, 0xe1, 0xc3, 0x89, 0x86,
+ 0xe2, 0x02, 0xe9, 0xb4, 0xeb, 0xf7, 0x07, 0x02, 0x00, 0x74, 0x0f, 0x80,
+ 0x7e, 0x06, 0x0c, 0x75, 0x09, 0xc6, 0x86, 0x60, 0x02, 0x01, 0xc6, 0x46,
+ 0x07, 0x0e, 0x8b, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0xfe, 0x05,
+ 0x0b, 0xf6, 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x14, 0x02, 0x86,
+ 0xe0, 0x89, 0x86, 0xde, 0x02, 0x8b, 0xb6, 0xe5, 0x05, 0x0b, 0xf6, 0x74,
+ 0x07, 0xad, 0x86, 0xc4, 0x89, 0x86, 0x0c, 0x02, 0x8b, 0xb6, 0xea, 0x05,
+ 0x0b, 0xf6, 0x74, 0x05, 0x8b, 0xc6, 0xe8, 0xa2, 0x00, 0x8b, 0xb6, 0xef,
+ 0x05, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x08, 0x02,
+ 0x8b, 0xb6, 0xf4, 0x05, 0x0b, 0xf6, 0x74, 0x07, 0xad, 0x86, 0xc4, 0x89,
+ 0x86, 0xf8, 0x01, 0x8b, 0xb6, 0xf9, 0x05, 0x0b, 0xf6, 0x74, 0x07, 0xad,
+ 0x86, 0xc4, 0x89, 0x86, 0xf6, 0x01, 0x8b, 0x07, 0xa9, 0x02, 0x00, 0x75,
+ 0x07, 0xa8, 0x28, 0x74, 0x03, 0xe9, 0x71, 0xff, 0xc7, 0x86, 0xe2, 0x02,
+ 0x00, 0x01, 0xe9, 0x24, 0xeb, 0xc3, 0xf7, 0x07, 0x02, 0x02, 0x74, 0xf9,
+ 0x8b, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x8b, 0xb6, 0x13, 0x06, 0x0b, 0xf6,
+ 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x14, 0x02, 0x86, 0xe0, 0x89,
+ 0x86, 0xde, 0x02, 0x8b, 0xb6, 0x04, 0x06, 0x0b, 0xf6, 0x74, 0x07, 0xad,
+ 0x86, 0xc4, 0x89, 0x86, 0x0c, 0x02, 0x8b, 0xb6, 0x09, 0x06, 0x0b, 0xf6,
+ 0x74, 0x05, 0x8b, 0xc6, 0xe8, 0x20, 0x00, 0x8b, 0xb6, 0x0e, 0x06, 0x0b,
+ 0xf6, 0x74, 0x07, 0xad, 0x86, 0xe0, 0x89, 0x86, 0x08, 0x02, 0x80, 0x7e,
+ 0x06, 0x0c, 0x75, 0x96, 0xc6, 0x86, 0x60, 0x02, 0x01, 0xc6, 0x46, 0x07,
+ 0x0e, 0xeb, 0x8b, 0x53, 0x57, 0x8c, 0xdb, 0x8e, 0xc3, 0xbb, 0x14, 0x05,
+ 0xb9, 0x0a, 0x00, 0x8b, 0xf0, 0xad, 0x8b, 0x34, 0x8b, 0x3f, 0x03, 0xfd,
+ 0xab, 0x89, 0x35, 0x83, 0xc3, 0x02, 0xe2, 0xf4, 0x5f, 0x5b, 0xc3, 0x68,
+ 0xf0, 0x29, 0xeb, 0x08, 0x68, 0x58, 0x2a, 0xeb, 0x03, 0x68, 0x9a, 0x2a,
+ 0xf7, 0x07, 0x82, 0x02, 0x74, 0x1c, 0x8b, 0x86, 0x14, 0x02, 0x86, 0xe0,
+ 0x8b, 0xb6, 0x4a, 0x06, 0x0b, 0xf6, 0x74, 0x09, 0xad, 0x86, 0xe0, 0x89,
+ 0x86, 0x14, 0x02, 0x86, 0xe0, 0x89, 0x86, 0xde, 0x02, 0xc3, 0x83, 0xc4,
+ 0x02, 0xc3, 0x8b, 0x07, 0xf6, 0x86, 0x63, 0x01, 0x01, 0x74, 0x1e, 0xa9,
+ 0x00, 0x20, 0x74, 0x40, 0x56, 0x57, 0xe8, 0x5b, 0xd0, 0xc7, 0x44, 0x02,
+ 0x02, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x6e, 0xd0, 0xbe, 0xb7, 0x45, 0xe8,
+ 0xfc, 0xd2, 0x5f, 0x5e, 0xc3, 0x80, 0x7e, 0x06, 0x08, 0x75, 0x21, 0xa9,
+ 0x00, 0x10, 0x74, 0x1c, 0xa9, 0x3c, 0x00, 0x75, 0x17, 0xff, 0x86, 0xc8,
+ 0x02, 0xff, 0x86, 0xc6, 0x02, 0x83, 0xbe, 0xc6, 0x02, 0x02, 0x72, 0x05,
+ 0xc6, 0x46, 0x07, 0x0a, 0xc3, 0xe8, 0xb7, 0xeb, 0xc3, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0x33, 0xc0, 0x8b, 0x3e, 0x92, 0x56, 0x83, 0xc7, 0x06, 0x81, 0xff,
+ 0xaa, 0x5d, 0x72, 0x03, 0xbf, 0xa4, 0x5d, 0xab, 0xab, 0xab, 0xf6, 0x86,
+ 0xcc, 0x01, 0x01, 0x74, 0x18, 0xc6, 0x86, 0xcb, 0x01, 0x01, 0xe8, 0xf7,
+ 0xcf, 0xc7, 0x44, 0x02, 0x05, 0x00, 0x8d, 0x7e, 0x16, 0xe8, 0x0a, 0xd0,
+ 0xc6, 0x86, 0xca, 0x01, 0x00, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00,
+ 0x74, 0x06, 0xbe, 0x65, 0x46, 0xe8, 0xd8, 0xd1, 0x8d, 0xb6, 0x6c, 0x15,
+ 0x8e, 0x46, 0x02, 0x8a, 0x1c, 0xf6, 0xc3, 0x80, 0x75, 0x0d, 0x80, 0xfb,
+ 0x10, 0x77, 0x14, 0x32, 0xff, 0xd1, 0xe3, 0xff, 0xa7, 0xdc, 0x04, 0xc7,
+ 0x86, 0x0a, 0x01, 0x00, 0x00, 0xc3, 0xb8, 0x00, 0x80, 0xeb, 0x08, 0xb8,
+ 0x00, 0x80, 0xeb, 0x03, 0xb8, 0x00, 0x20, 0x8d, 0xb6, 0x6c, 0x15, 0x89,
+ 0x44, 0x02, 0x80, 0x0c, 0x80, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0xc7, 0x86,
+ 0x0a, 0x01, 0x00, 0x00, 0x26, 0xc7, 0x06, 0x70, 0x00, 0x08, 0x00, 0xc3,
+ 0xeb, 0xe1, 0xb8, 0x04, 0x00, 0x80, 0xbe, 0x06, 0x01, 0x01, 0x75, 0xf4,
+ 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x74, 0xea, 0xc6, 0x86,
+ 0x08, 0x01, 0x01, 0xc6, 0x86, 0xcd, 0x01, 0x00, 0xc6, 0x86, 0x09, 0x01,
+ 0x00, 0x8b, 0x86, 0xf8, 0x00, 0x89, 0x86, 0xf6, 0x00, 0x8d, 0xb6, 0x76,
+ 0x15, 0xb8, 0x03, 0x00, 0xf6, 0x04, 0x80, 0x75, 0xc7, 0x33, 0xc0, 0x39,
+ 0x04, 0x75, 0x1e, 0x39, 0x44, 0x02, 0x75, 0x19, 0x39, 0x44, 0x04, 0x75,
+ 0x14, 0x8b, 0x86, 0x00, 0x01, 0x89, 0x04, 0x8b, 0x86, 0x02, 0x01, 0x89,
+ 0x44, 0x02, 0x8b, 0x86, 0x04, 0x01, 0x89, 0x44, 0x04, 0xad, 0x8b, 0x14,
+ 0x8b, 0x74, 0x02, 0x89, 0x86, 0xd0, 0x01, 0x89, 0x96, 0xd2, 0x01, 0x89,
+ 0xb6, 0xd4, 0x01, 0x8e, 0x46, 0x02, 0x50, 0xe8, 0xfc, 0xcd, 0x26, 0xa3,
+ 0x1e, 0x00, 0x8b, 0xc2, 0xe8, 0xf3, 0xcd, 0x26, 0xa3, 0x20, 0x00, 0x8b,
+ 0xc6, 0xe8, 0xea, 0xcd, 0x26, 0xa3, 0x22, 0x00, 0x58, 0xbb, 0x2c, 0x05,
+ 0xb9, 0x13, 0x00, 0x1e, 0x07, 0x8b, 0x3f, 0x03, 0xfd, 0xab, 0x89, 0x15,
+ 0x89, 0x75, 0x02, 0x83, 0xc3, 0x02, 0xe2, 0xf1, 0xbb, 0x28, 0x05, 0x8d,
+ 0x96, 0x84, 0x15, 0xb8, 0x02, 0x00, 0x8b, 0x3f, 0x03, 0xfd, 0x8b, 0xf2,
+ 0xb9, 0x09, 0x00, 0xf3, 0xa5, 0x83, 0xc3, 0x02, 0x48, 0x75, 0xef, 0xf7,
+ 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x06, 0xbe, 0x65, 0x46, 0xe8, 0xbf,
+ 0xd0, 0x8d, 0xb6, 0x6c, 0x15, 0x8b, 0x44, 0x08, 0xf7, 0x86, 0xf4, 0x00,
+ 0x00, 0x20, 0x75, 0x0a, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x0c, 0x75, 0x02,
+ 0xeb, 0x03, 0x25, 0xff, 0x7b, 0x89, 0x86, 0x12, 0x01, 0x89, 0x86, 0x14,
+ 0x01, 0xf7, 0x86, 0x12, 0x01, 0x01, 0x00, 0x74, 0x08, 0xc7, 0x06, 0xb5,
+ 0x45, 0x58, 0x02, 0xeb, 0x06, 0xc7, 0x06, 0xb5, 0x45, 0x08, 0x07, 0x8e,
+ 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x28, 0x00, 0x81, 0xe3, 0xff, 0xf4, 0xa9,
+ 0x04, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74,
+ 0x04, 0x81, 0xcb, 0x00, 0x03, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e, 0x28,
+ 0x00, 0x8d, 0xb6, 0x80, 0x15, 0xe8, 0x02, 0x02, 0x8d, 0xb6, 0x7c, 0x15,
+ 0xe8, 0x20, 0x00, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x74, 0x03, 0xe8, 0x13,
+ 0x14, 0xc6, 0x86, 0x07, 0x01, 0x01, 0xe8, 0x5f, 0x05, 0xe9, 0x90, 0xfe,
+ 0x56, 0x83, 0xc6, 0x08, 0xe8, 0x04, 0x00, 0x5e, 0xe9, 0x85, 0xfe, 0x8e,
+ 0x46, 0x02, 0xb8, 0xc0, 0x00, 0xe8, 0x0e, 0xcd, 0x26, 0xa3, 0x3a, 0x00,
+ 0x8b, 0x04, 0x0d, 0x80, 0x00, 0x89, 0x86, 0xd6, 0x01, 0xe8, 0xfe, 0xcc,
+ 0x26, 0xa3, 0x3c, 0x00, 0x8b, 0x44, 0x02, 0x89, 0x86, 0xd8, 0x01, 0xe8,
+ 0xf0, 0xcc, 0x26, 0xa3, 0x3e, 0x00, 0xc3, 0x83, 0x8e, 0x1e, 0x01, 0x01,
+ 0xc6, 0x86, 0x16, 0x01, 0x00, 0x8a, 0x46, 0x06, 0x3c, 0x00, 0x74, 0x1b,
+ 0x3c, 0x10, 0x74, 0x17, 0x3c, 0x12, 0x74, 0x13, 0x3c, 0x0e, 0x74, 0x17,
+ 0x3c, 0x48, 0x74, 0x19, 0xe8, 0x35, 0xfe, 0xb8, 0x0f, 0x00, 0xe8, 0x6a,
+ 0xdd, 0xeb, 0x35, 0xe8, 0x2a, 0xfe, 0xe8, 0xc7, 0x03, 0xeb, 0x2d, 0xc6,
+ 0x46, 0x07, 0x10, 0xeb, 0x20, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56,
+ 0x01, 0x75, 0x08, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6,
+ 0x86, 0x6d, 0x01, 0x01, 0xe8, 0xef, 0x13, 0xc6, 0x46, 0x07, 0x12, 0xeb,
+ 0x00, 0xc6, 0x46, 0x09, 0x1e, 0xe9, 0xf8, 0xfd, 0xc3, 0xc6, 0x86, 0x06,
+ 0x01, 0x00, 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03,
+ 0xe9, 0xe8, 0xfd, 0x8b, 0x44, 0x08, 0x89, 0x86, 0xf4, 0x00, 0x8b, 0x44,
+ 0x0a, 0xa9, 0x00, 0x02, 0x74, 0x03, 0x0d, 0x00, 0x01, 0x89, 0x86, 0xf6,
+ 0x00, 0x89, 0x86, 0xf8, 0x00, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x04, 0x74,
+ 0x06, 0xb8, 0x01, 0x00, 0xe9, 0xc0, 0xfd, 0x8b, 0x44, 0x12, 0x0b, 0xc0,
+ 0x75, 0x16, 0xb8, 0x18, 0x47, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x01, 0x75,
+ 0x0b, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x02, 0x75, 0x03, 0xb8, 0xc6, 0x11,
+ 0x89, 0x86, 0xfa, 0x00, 0x89, 0x86, 0x32, 0x01, 0x8d, 0xbe, 0x30, 0x04,
+ 0x8b, 0x44, 0x0c, 0x89, 0x05, 0x89, 0x86, 0x00, 0x01, 0x8b, 0x44, 0x0e,
+ 0x89, 0x45, 0x02, 0x89, 0x86, 0x02, 0x01, 0x8b, 0x44, 0x10, 0x89, 0x45,
+ 0x04, 0x89, 0x86, 0x04, 0x01, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x21,
+ 0x8b, 0x44, 0x0c, 0x89, 0x86, 0xb0, 0x03, 0x89, 0x86, 0xb6, 0x03, 0x8b,
+ 0x44, 0x0e, 0x89, 0x86, 0xb2, 0x03, 0x89, 0x86, 0xb8, 0x03, 0x8b, 0x44,
+ 0x10, 0x89, 0x86, 0xb4, 0x03, 0x89, 0x86, 0xba, 0x03, 0x8e, 0x46, 0x02,
+ 0x8b, 0x86, 0xfa, 0x00, 0x26, 0xa3, 0x12, 0x00, 0x8b, 0x44, 0x14, 0x26,
+ 0xa3, 0x2a, 0x00, 0x8b, 0x44, 0x16, 0x25, 0xff, 0xf4, 0x83, 0xc8, 0x30,
+ 0x26, 0xa3, 0x28, 0x00, 0x8b, 0x86, 0xf4, 0x00, 0x25, 0xff, 0xfe, 0xc1,
+ 0xe8, 0x08, 0x89, 0x86, 0x24, 0x02, 0xf7, 0x86, 0xf4, 0x00, 0x04, 0x00,
+ 0x74, 0x0f, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08, 0xc6, 0x06, 0x8a,
+ 0x56, 0x01, 0xe8, 0xbe, 0x0f, 0x80, 0xbe, 0x62, 0x01, 0x01, 0x75, 0x01,
+ 0xc3, 0xc6, 0x86, 0x06, 0x01, 0x01, 0xe9, 0xfb, 0xfc, 0x56, 0x8c, 0xd8,
+ 0x8e, 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6, 0xd0, 0x02, 0xb9, 0x05, 0x00,
+ 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, 0xd0, 0x02, 0x33, 0xc0, 0x8b, 0xca,
+ 0xf3, 0xab, 0x81, 0xa6, 0x06, 0x02, 0x7f, 0xdf, 0x5e, 0xe9, 0xd4, 0xfc,
+ 0x56, 0x8c, 0xd8, 0x8e, 0xc0, 0x8d, 0x7c, 0x08, 0x8d, 0xb6, 0x3c, 0x02,
+ 0xb9, 0x0c, 0x00, 0x8b, 0xd1, 0xf3, 0xa5, 0x8d, 0xbe, 0x3c, 0x02, 0x33,
+ 0xc0, 0x8b, 0xca, 0xf3, 0xab, 0x5e, 0xe9, 0xb3, 0xfc, 0x83, 0xc6, 0x08,
+ 0xe8, 0x03, 0x00, 0xe9, 0xaa, 0xfc, 0x06, 0x8e, 0x46, 0x02, 0x8b, 0x04,
+ 0x89, 0x86, 0xda, 0x01, 0xe8, 0x2f, 0xcb, 0x26, 0xa3, 0x26, 0x00, 0x8b,
+ 0x44, 0x02, 0x23, 0x86, 0xf8, 0x01, 0xe8, 0x21, 0xcb, 0x25, 0xff, 0x7f,
+ 0x26, 0x8b, 0x0e, 0x24, 0x00, 0x81, 0xe1, 0x00, 0x80, 0x0b, 0xc1, 0x26,
+ 0xa3, 0x24, 0x00, 0xe8, 0x0c, 0xcb, 0x89, 0x86, 0xdc, 0x01, 0x07, 0xc3,
+ 0xb8, 0x05, 0x00, 0x80, 0xbe, 0x07, 0x01, 0x01, 0x75, 0x03, 0xe9, 0x6a,
+ 0xfc, 0xc6, 0x86, 0x62, 0x01, 0x01, 0xe8, 0x68, 0xfe, 0xc6, 0x86, 0x62,
+ 0x01, 0x00, 0xc6, 0x86, 0x06, 0x01, 0x01, 0xe9, 0x52, 0xfc, 0xb8, 0x11,
+ 0x00, 0xc6, 0x86, 0x62, 0x01, 0x00, 0xe9, 0x4a, 0xfc, 0xc3, 0x8b, 0xd8,
+ 0x26, 0x8b, 0x04, 0x50, 0x33, 0xc0, 0x50, 0x23, 0xc3, 0x8b, 0xc8, 0x26,
+ 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58, 0x75, 0x3c,
+ 0x05, 0x55, 0x55, 0x73, 0xe9, 0xb8, 0x01, 0x00, 0x50, 0x23, 0xc3, 0x8b,
+ 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58,
+ 0x75, 0x22, 0xd1, 0xc0, 0x73, 0xea, 0xf7, 0xd0, 0x50, 0x23, 0xc3, 0x8b,
+ 0xc8, 0x26, 0x89, 0x04, 0x26, 0x8b, 0x04, 0x23, 0xc3, 0x3b, 0xc1, 0x58,
+ 0x75, 0x0a, 0xd1, 0xc0, 0x72, 0xea, 0xf8, 0x58, 0x26, 0x89, 0x04, 0xc3,
+ 0xf9, 0xeb, 0xf8, 0x8b, 0x44, 0x08, 0x25, 0xff, 0x7b, 0x89, 0x86, 0x12,
+ 0x01, 0x89, 0x86, 0x14, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x1e, 0x28,
+ 0x00, 0x81, 0xe3, 0xff, 0xf4, 0xa9, 0x04, 0x00, 0x74, 0x04, 0x81, 0xcb,
+ 0x00, 0x08, 0xa9, 0x02, 0x00, 0x74, 0x04, 0x81, 0xcb, 0x00, 0x03, 0x8e,
+ 0x46, 0x02, 0x26, 0x89, 0x1e, 0x28, 0x00, 0xe9, 0xb6, 0xfb, 0x8b, 0x44,
+ 0x08, 0x89, 0x86, 0x28, 0x02, 0x86, 0xc4, 0x89, 0x86, 0x62, 0x05, 0xf6,
+ 0x86, 0x73, 0x02, 0x01, 0x75, 0x05, 0xc6, 0x86, 0x74, 0x02, 0x01, 0xc6,
+ 0x86, 0x73, 0x02, 0x00, 0xe9, 0x95, 0xfb, 0x8b, 0x44, 0x08, 0x89, 0x86,
+ 0x30, 0x01, 0xbe, 0x53, 0x46, 0xe8, 0x34, 0xcd, 0xe9, 0x85, 0xfb, 0x8b,
+ 0x44, 0x08, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x2a, 0x00, 0xe9, 0x78, 0xfb,
+ 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75, 0x13,
+ 0x80, 0x7e, 0x08, 0x00, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x07,
+ 0x8d, 0x5c, 0x08, 0xe8, 0xc6, 0xe9, 0xc3, 0xb8, 0x00, 0x10, 0xe9, 0x56,
+ 0xfb, 0xb8, 0x04, 0x00, 0xf6, 0x86, 0x07, 0x01, 0x01, 0x74, 0x1e, 0x8e,
+ 0x46, 0x02, 0x26, 0xa1, 0x28, 0x00, 0x8b, 0x5c, 0x08, 0x81, 0xe3, 0xff,
+ 0xf4, 0x25, 0x00, 0x0b, 0x0b, 0xd8, 0x8e, 0x46, 0x02, 0x26, 0x89, 0x1e,
+ 0x28, 0x00, 0xb8, 0x00, 0x20, 0xe9, 0x2b, 0xfb, 0xb8, 0x05, 0x00, 0xf6,
+ 0x86, 0x07, 0x01, 0x01, 0x75, 0x11, 0xfa, 0xe8, 0x9a, 0xce, 0xfa, 0xe8,
+ 0x16, 0xfb, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x72, 0x00, 0x02, 0xe9,
+ 0x0d, 0xfb, 0xe9, 0x07, 0xfb, 0x8b, 0xd0, 0xb8, 0x01, 0x00, 0xe9, 0xa4,
+ 0x01, 0xc3, 0x80, 0xbe, 0xad, 0x02, 0x01, 0x74, 0x0e, 0x80, 0xbe, 0x07,
+ 0x01, 0x01, 0x75, 0xf1, 0x80, 0xbe, 0x09, 0x01, 0x01, 0x74, 0xea, 0xc6,
+ 0x86, 0x09, 0x01, 0x01, 0xc6, 0x86, 0xad, 0x02, 0x00, 0x8e, 0x46, 0x02,
+ 0x26, 0xf7, 0x06, 0x00, 0x00, 0x02, 0x00, 0x74, 0x08, 0xbe, 0x71, 0x46,
+ 0xe8, 0x79, 0xcc, 0xeb, 0x03, 0x0d, 0x00, 0x01, 0x80, 0xbe, 0xa5, 0x02,
+ 0x01, 0x74, 0x0a, 0x80, 0xbe, 0xa7, 0x02, 0x01, 0x74, 0x03, 0x0d, 0x00,
+ 0x04, 0x80, 0xbe, 0xa5, 0x02, 0x01, 0x74, 0x0a, 0x80, 0xbe, 0xa6, 0x02,
+ 0x01, 0x74, 0x03, 0x0d, 0x00, 0x02, 0xf7, 0x86, 0xa1, 0x02, 0x01, 0x00,
+ 0x74, 0x03, 0x0d, 0x00, 0x08, 0xa9, 0x00, 0x80, 0x74, 0x1d, 0xc7, 0x86,
+ 0x2e, 0x01, 0x02, 0x00, 0xf6, 0x86, 0x2c, 0x01, 0x01, 0x74, 0x1d, 0x53,
+ 0xbb, 0x40, 0x60, 0x8e, 0xc3, 0x26, 0x81, 0x0e, 0x72, 0x00, 0x00, 0x02,
+ 0x5b, 0xeb, 0x0d, 0x8a, 0x56, 0x06, 0xd0, 0xe2, 0xd0, 0xe2, 0xd0, 0xe2,
+ 0x24, 0x0f, 0x0a, 0xc2, 0x89, 0x86, 0x34, 0x02, 0x8b, 0xd0, 0xb8, 0x02,
+ 0x00, 0xe9, 0x92, 0x00, 0x8b, 0x96, 0x1e, 0x01, 0x8b, 0x86, 0x12, 0x01,
+ 0xa9, 0x00, 0x02, 0x74, 0x06, 0xf7, 0xc2, 0x05, 0x80, 0x74, 0x0e, 0xc6,
+ 0x86, 0x07, 0x01, 0x00, 0xc6, 0x86, 0x16, 0x01, 0x00, 0x81, 0xca, 0x80,
+ 0x00, 0x33, 0xc0, 0x89, 0x86, 0x1e, 0x01, 0x89, 0x96, 0x20, 0x01, 0xc7,
+ 0x86, 0x34, 0x02, 0x00, 0x00, 0xf7, 0xc2, 0x01, 0x00, 0x75, 0x22, 0x83,
+ 0xbe, 0x2e, 0x01, 0x03, 0x74, 0x1b, 0xc7, 0x86, 0x2e, 0x01, 0x03, 0x00,
+ 0xf6, 0x86, 0x2c, 0x01, 0x01, 0x74, 0x0e, 0x53, 0xbb, 0x40, 0x60, 0x8e,
+ 0xc3, 0x26, 0x81, 0x0e, 0x72, 0x00, 0x00, 0x02, 0x5b, 0xb8, 0x03, 0x00,
+ 0xeb, 0x34, 0x3b, 0xc0, 0x74, 0x00, 0x8b, 0xd0, 0xb8, 0x04, 0x00, 0xeb,
+ 0x29, 0xc3, 0xc6, 0x86, 0xca, 0x01, 0x00, 0xc6, 0x86, 0xcb, 0x01, 0x00,
+ 0x55, 0x33, 0xed, 0xbe, 0x84, 0x55, 0xe8, 0x8f, 0xcb, 0x5d, 0xb8, 0x05,
+ 0x00, 0xeb, 0x0f, 0xb8, 0x06, 0x00, 0xeb, 0x0a, 0xb8, 0x07, 0x00, 0xeb,
+ 0x05, 0xb8, 0x08, 0x00, 0xeb, 0x00, 0x8b, 0xb6, 0x60, 0x01, 0x3b, 0xb6,
+ 0x5e, 0x01, 0x75, 0x0a, 0xf7, 0x86, 0x58, 0x15, 0x00, 0x80, 0x74, 0x02,
+ 0xeb, 0x5f, 0x8b, 0x8e, 0x5e, 0x01, 0x41, 0x80, 0xe1, 0x07, 0x3b, 0xf1,
+ 0x75, 0x20, 0x46, 0x83, 0xe6, 0x07, 0x89, 0xb6, 0x60, 0x01, 0x51, 0x8b,
+ 0xce, 0xd1, 0xe1, 0xd1, 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x8b,
+ 0x0c, 0x83, 0xf9, 0x05, 0x74, 0x03, 0x0d, 0x00, 0x01, 0x59, 0x83, 0xf8,
+ 0x04, 0x75, 0x1a, 0x51, 0xb9, 0x08, 0x00, 0x8d, 0xb6, 0x3e, 0x01, 0x39,
+ 0x04, 0x74, 0x08, 0x83, 0xc6, 0x04, 0xe2, 0xf7, 0x59, 0xeb, 0x06, 0x89,
+ 0x54, 0x02, 0x59, 0xeb, 0x13, 0x89, 0x8e, 0x5e, 0x01, 0xd1, 0xe1, 0xd1,
+ 0xe1, 0x8d, 0xb6, 0x3e, 0x01, 0x03, 0xf1, 0x89, 0x04, 0x89, 0x54, 0x02,
+ 0xc3, 0x8d, 0xb6, 0x58, 0x15, 0x89, 0x54, 0x06, 0xc7, 0x44, 0x04, 0x08,
+ 0x00, 0x3c, 0x05, 0x75, 0x05, 0xc7, 0x44, 0x04, 0x06, 0x00, 0x25, 0xff,
+ 0x7f, 0x89, 0x04, 0xb8, 0x40, 0x60, 0x8e, 0xc0, 0x26, 0xc7, 0x06, 0x70,
+ 0x00, 0x00, 0x20, 0xc3, 0x8b, 0x86, 0x14, 0x01, 0x89, 0x86, 0x12, 0x01,
+ 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x08, 0x1e, 0xc7, 0x86, 0x28, 0x01,
+ 0x00, 0x00, 0xc7, 0x86, 0x2a, 0x01, 0x00, 0x00, 0x8c, 0xd8, 0x8e, 0xc0,
+ 0x33, 0xc0, 0x8d, 0xbe, 0xe0, 0x01, 0xb9, 0x2b, 0x00, 0xf3, 0xab, 0xc7,
+ 0x86, 0x26, 0x02, 0xff, 0xff, 0xb0, 0x02, 0xe8, 0x1d, 0xce, 0xf7, 0x86,
+ 0xf6, 0x00, 0x80, 0x00, 0x74, 0x0c, 0xb8, 0x05, 0x00, 0xe8, 0x13, 0x00,
+ 0xc6, 0x46, 0x07, 0x42, 0xeb, 0x0c, 0xb8, 0x02, 0x00, 0xe8, 0x07, 0x00,
+ 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x00, 0xc3, 0x50, 0xb0, 0x00, 0x88, 0x86,
+ 0xa5, 0x02, 0x88, 0x86, 0xa6, 0x02, 0x88, 0x86, 0xa7, 0x02, 0x88, 0x86,
+ 0xa8, 0x02, 0x88, 0x86, 0xaa, 0x02, 0x88, 0x86, 0xa9, 0x02, 0x58, 0x9c,
+ 0xfa, 0x83, 0xf8, 0x02, 0x74, 0x13, 0x83, 0xf8, 0x05, 0x74, 0x0c, 0xc7,
+ 0x46, 0x12, 0x26, 0x1d, 0xc7, 0x46, 0x14, 0x26, 0x1d, 0xeb, 0x42, 0xeb,
+ 0x21, 0xc6, 0x86, 0xa5, 0x02, 0x01, 0xc6, 0x86, 0xa9, 0x02, 0x01, 0xc6,
+ 0x86, 0xaa, 0x02, 0x00, 0xc7, 0x46, 0x12, 0x0a, 0x32, 0xc7, 0x46, 0x14,
+ 0x37, 0x2f, 0xc7, 0x86, 0xba, 0x01, 0x2c, 0x00, 0xeb, 0x1f, 0xc6, 0x86,
+ 0xa7, 0x02, 0x01, 0xc6, 0x86, 0xa9, 0x02, 0x00, 0xc6, 0x86, 0xaa, 0x02,
+ 0x01, 0xc7, 0x46, 0x12, 0x0e, 0x32, 0xc7, 0x46, 0x14, 0x3b, 0x2f, 0xc7,
+ 0x86, 0xba, 0x01, 0x2c, 0x00, 0x0e, 0xe8, 0x02, 0x00, 0xeb, 0x01, 0xcf,
+ 0xc3, 0x8c, 0x00, 0x84, 0x46, 0xbc, 0x02, 0x96, 0x00, 0xba, 0x46, 0x14,
+ 0x00, 0x96, 0x00, 0xce, 0x46, 0x08, 0x07, 0x96, 0x00, 0x08, 0x47, 0x6e,
+ 0x00, 0x78, 0x00, 0x88, 0x49, 0x00, 0x00, 0x6e, 0x00, 0xc2, 0x47, 0xf4,
+ 0x01, 0x6e, 0x00, 0xf2, 0x47, 0x08, 0x07, 0x6e, 0x00, 0x30, 0x4b, 0x05,
+ 0x00, 0xaa, 0x00, 0x36, 0x48, 0xfa, 0x00, 0x8c, 0x00, 0xac, 0x48, 0x02,
+ 0x00, 0x8c, 0x00, 0x8c, 0x47, 0x3c, 0x00, 0x78, 0x00, 0x18, 0x49, 0x04,
+ 0x01, 0x96, 0x00, 0x44, 0x49, 0x64, 0x00, 0x96, 0x00, 0x68, 0x49, 0xdc,
+ 0x05, 0xbe, 0x00, 0x8e, 0x4a, 0xf4, 0x01, 0xbe, 0x00, 0x8e, 0x4a, 0x32,
+ 0x00, 0xa0, 0x00, 0xb4, 0x4b, 0xf4, 0x01, 0xbe, 0x00, 0xb8, 0x4a, 0xf4,
+ 0x01, 0x82, 0x00, 0xe6, 0x4d, 0x19, 0x00, 0x6e, 0x00, 0x9b, 0x4b, 0x14,
+ 0x00, 0x78, 0x00, 0xcc, 0x4a, 0xc4, 0x09, 0x6e, 0x00, 0xe0, 0x4a, 0x02,
+ 0x00, 0x78, 0x00, 0xec, 0x4c, 0xf0, 0x00, 0x6e, 0x00, 0x0b, 0x4c, 0x04,
+ 0x00, 0xa0, 0x00, 0x22, 0x4c, 0xbc, 0x02, 0x6e, 0x00, 0x34, 0x4c, 0x08,
+ 0x07, 0x6e, 0x00, 0x42, 0x4c, 0xe8, 0x03, 0x6e, 0x00, 0x54, 0x4c, 0x14,
+ 0x00, 0x96, 0x00, 0x60, 0x4c, 0x64, 0x00, 0xa0, 0x00, 0xfa, 0x4c, 0xf4,
+ 0x01, 0xc8, 0x00, 0x70, 0x48, 0x02, 0x00, 0x6e, 0x00, 0x88, 0x4c, 0x04,
+ 0x00, 0x8c, 0x00, 0xca, 0x4c, 0x14, 0x00, 0xb4, 0x00, 0xf2, 0x4e, 0x64,
+ 0x00, 0xa0, 0x00, 0x0b, 0x4e, 0x05, 0x00, 0xc8, 0x00, 0x20, 0x4e, 0x03,
+ 0x00, 0xd2, 0x00, 0x72, 0x4e, 0xf4, 0x01, 0xd2, 0x00, 0x84, 0x4e, 0x4c,
+ 0x04, 0xdc, 0x00, 0x9e, 0x4e, 0xfa, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x80, 0xbe, 0x54, 0x02,
+ 0x01, 0x75, 0x28, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x22, 0xf6, 0x86, 0x65,
+ 0x02, 0x01, 0x74, 0x1c, 0xe8, 0x3e, 0xe2, 0xbe, 0x8d, 0x45, 0xe8, 0xf7,
+ 0xc8, 0x8c, 0xd8, 0x8e, 0xc0, 0x33, 0xc0, 0x8d, 0xbe, 0xee, 0x01, 0xab,
+ 0xab, 0xab, 0xc6, 0x86, 0x65, 0x02, 0x00, 0xc3, 0xe8, 0xa4, 0xe4, 0xeb,
+ 0xdf, 0x90, 0x8a, 0x46, 0x08, 0x3c, 0x0a, 0x75, 0x0b, 0xf6, 0x86, 0x5e,
+ 0x02, 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09, 0x04, 0xc3, 0x90, 0x80, 0xbe,
+ 0xa6, 0x02, 0x01, 0x74, 0x32, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x2c, 0x80,
+ 0x7e, 0x06, 0x0c, 0x75, 0x0f, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x08,
+ 0xb8, 0x07, 0x00, 0xe8, 0x39, 0xd6, 0xeb, 0x17, 0xf6, 0x86, 0x5e, 0x02,
+ 0x01, 0x74, 0x10, 0xf6, 0x86, 0x59, 0x02, 0x01, 0x75, 0x09, 0xc6, 0x86,
+ 0x59, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x08, 0xc3, 0x8a, 0x4e, 0x06, 0x8a,
+ 0x56, 0x08, 0x80, 0xf9, 0x06, 0x74, 0x71, 0x80, 0xf9, 0x08, 0x74, 0x05,
+ 0x80, 0xf9, 0x0a, 0x75, 0x0a, 0x80, 0xfa, 0x0c, 0x74, 0x62, 0x80, 0xfa,
+ 0x04, 0x74, 0x5d, 0x80, 0xfa, 0x0c, 0x74, 0x05, 0x80, 0xfa, 0x04, 0x75,
+ 0x52, 0xf6, 0x86, 0x63, 0x02, 0x01, 0x74, 0x4b, 0xe8, 0x07, 0x03, 0xf6,
+ 0x86, 0x61, 0x02, 0x01, 0x74, 0x0b, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x80,
+ 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6, 0x46, 0x09, 0x06, 0x81, 0x8e, 0x06,
+ 0x02, 0x00, 0x50, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc6, 0x86, 0x6a, 0x02,
+ 0x01, 0xc6, 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8,
+ 0x6a, 0xca, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26, 0x0c, 0x00, 0xfe, 0xbe,
+ 0x99, 0x45, 0xe8, 0x1b, 0xc8, 0xbe, 0xc3, 0x45, 0xe8, 0x15, 0xc8, 0xc3,
+ 0xb8, 0x07, 0x00, 0xe8, 0x9d, 0xd5, 0xeb, 0xf7, 0x80, 0xbe, 0xa5, 0x02,
+ 0x01, 0x74, 0x02, 0xeb, 0x2b, 0x80, 0x7e, 0x06, 0x10, 0x75, 0x06, 0xc6,
+ 0x46, 0x07, 0x12, 0xeb, 0x1f, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x19, 0xc6,
+ 0x86, 0x69, 0x02, 0x01, 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xe8, 0x24, 0xca,
+ 0xbe, 0x05, 0x46, 0xe8, 0xde, 0xc7, 0xbe, 0x0b, 0x46, 0xe8, 0xd8, 0xc7,
+ 0xc3, 0x90, 0xf6, 0x86, 0x5f, 0x02, 0x01, 0x74, 0x28, 0xc6, 0x86, 0x5f,
+ 0x02, 0x00, 0x80, 0x7e, 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x04,
+ 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x06, 0x75, 0x11, 0xc6, 0x86, 0x69, 0x02,
+ 0x01, 0xe8, 0xf0, 0xc9, 0xbe, 0xc3, 0x45, 0xe8, 0xaa, 0xc7, 0xe8, 0x45,
+ 0xe0, 0xc3, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x75, 0x2e, 0xf7, 0x86, 0xf6,
+ 0x00, 0x00, 0x02, 0x75, 0x1e, 0xe8, 0x40, 0xd6, 0xc6, 0x86, 0x92, 0x02,
+ 0x00, 0x8b, 0x86, 0xf8, 0x00, 0x89, 0x86, 0xf6, 0x00, 0xc6, 0x46, 0x07,
+ 0x06, 0xc6, 0x46, 0x06, 0x06, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x16, 0xb8,
+ 0x0d, 0x00, 0xe8, 0x02, 0xd5, 0xeb, 0x0e, 0x3c, 0x08, 0x72, 0x0a, 0x3c,
+ 0x0c, 0x77, 0x06, 0xb8, 0x05, 0x00, 0xe8, 0xf2, 0xd4, 0xc3, 0x80, 0x7e,
+ 0x08, 0x00, 0x75, 0x33, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75, 0x2c, 0xf6,
+ 0x86, 0x5e, 0x02, 0x01, 0x74, 0x25, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06,
+ 0x14, 0x00, 0x03, 0x00, 0x74, 0x11, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x14, 0x00, 0x03, 0xbe, 0xbd, 0x45, 0xe8, 0x33, 0xc7, 0xeb, 0x08, 0xc6,
+ 0x46, 0x09, 0x04, 0xff, 0x86, 0x4a, 0x02, 0xc3, 0x80, 0x7e, 0x08, 0x18,
+ 0x75, 0x0e, 0xbe, 0x41, 0x46, 0xe8, 0x1c, 0xc7, 0xe8, 0xc3, 0x01, 0xe8,
+ 0xb4, 0xdf, 0xeb, 0x00, 0xc3, 0xf6, 0x86, 0x7c, 0x02, 0x01, 0x75, 0x1e,
+ 0x80, 0xbe, 0x68, 0x02, 0x01, 0x75, 0x17, 0xc6, 0x46, 0x07, 0x12, 0xc6,
+ 0x46, 0x09, 0x1e, 0x83, 0x8e, 0x06, 0x02, 0x08, 0x83, 0x8e, 0x1e, 0x01,
+ 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x00,
+ 0x75, 0x35, 0x80, 0xbe, 0x5b, 0x02, 0x01, 0x75, 0x58, 0x80, 0xbe, 0x54,
+ 0x02, 0x01, 0x74, 0x1f, 0xe8, 0x41, 0xe0, 0x80, 0x7e, 0x06, 0x0a, 0x75,
+ 0x16, 0xc6, 0x86, 0x63, 0x02, 0x01, 0xc6, 0x46, 0x07, 0x0c, 0xf7, 0x86,
+ 0xf6, 0x00, 0x00, 0x40, 0x75, 0x05, 0xc6, 0x86, 0x5e, 0x02, 0x01, 0xc3,
+ 0xbe, 0xc3, 0x45, 0xe8, 0xb2, 0xc6, 0xc3, 0x8a, 0x46, 0x08, 0x3c, 0x04,
+ 0x75, 0x0e, 0xbe, 0xc3, 0x45, 0xe8, 0xa4, 0xc6, 0xff, 0x86, 0xb2, 0x02,
+ 0xe8, 0x73, 0xdf, 0xc3, 0x3c, 0x06, 0x75, 0xdf, 0xf6, 0x86, 0x5f, 0x02,
+ 0x01, 0x75, 0xd8, 0xbe, 0xc3, 0x45, 0xe8, 0x8b, 0xc6, 0xe8, 0x26, 0xdf,
+ 0xc3, 0xc6, 0x86, 0x66, 0x02, 0x01, 0xc3, 0x90, 0x80, 0xbe, 0xa6, 0x02,
+ 0x01, 0x74, 0x22, 0x80, 0x7e, 0x06, 0x0c, 0x75, 0x1b, 0xff, 0x86, 0xb8,
+ 0x02, 0x83, 0xbe, 0xb8, 0x02, 0x04, 0x77, 0x0a, 0xbe, 0xcf, 0x45, 0xe8,
+ 0x62, 0xc6, 0xe8, 0x70, 0xe0, 0xc3, 0xb8, 0x09, 0x00, 0xe8, 0xe7, 0xd3,
+ 0xc3, 0xeb, 0xfd, 0x90, 0x80, 0x7e, 0x08, 0x02, 0x75, 0x1d, 0x80, 0xbe,
+ 0x5e, 0x02, 0x01, 0x74, 0x08, 0xb8, 0x05, 0x00, 0xe8, 0xd0, 0xd3, 0xeb,
+ 0x0e, 0xff, 0x86, 0x4a, 0x02, 0xc6, 0x46, 0x09, 0x04, 0xb8, 0x00, 0x01,
+ 0xe8, 0x25, 0xe2, 0xc3, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x16, 0x80, 0xbe,
+ 0x54, 0x02, 0x01, 0x74, 0x07, 0x80, 0xbe, 0x5e, 0x02, 0x00, 0x74, 0x08,
+ 0xff, 0x86, 0x4a, 0x02, 0xc6, 0x46, 0x09, 0x04, 0xc3, 0xe9, 0xb8, 0x00,
+ 0xf6, 0x86, 0xaa, 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0x5e, 0x02, 0x01,
+ 0x74, 0xef, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x74, 0x06, 0xbe, 0xa5,
+ 0x45, 0xe8, 0xf4, 0xc5, 0x8d, 0xbe, 0xd0, 0x02, 0x8c, 0xd9, 0x8e, 0xc1,
+ 0xb9, 0x05, 0x00, 0x33, 0xc0, 0xf3, 0xaf, 0x74, 0xd0, 0x80, 0xbe, 0xa5,
+ 0x02, 0x01, 0x74, 0x45, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x5f, 0x80,
+ 0xbe, 0xa7, 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe, 0xa8, 0x02, 0x01, 0x74,
+ 0x51, 0xeb, 0x6d, 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0x81, 0x8e, 0x06,
+ 0x02, 0x00, 0x20, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xf6, 0x86, 0x6e, 0x02,
+ 0x01, 0x74, 0x14, 0x80, 0x7e, 0x08, 0x16, 0x75, 0x0e, 0xc6, 0x86, 0x56,
+ 0x02, 0x00, 0xe8, 0xca, 0xdf, 0xc7, 0x86, 0x2a, 0x02, 0x03, 0x00, 0xeb,
+ 0x3f, 0xc7, 0x86, 0xb6, 0x02, 0x04, 0x00, 0xc6, 0x86, 0x56, 0x02, 0x00,
+ 0xe8, 0xb4, 0xdf, 0xc7, 0x86, 0x2a, 0x02, 0x03, 0x00, 0x81, 0x8e, 0x06,
+ 0x02, 0x00, 0x20, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xeb, 0x1e, 0xc7, 0x86,
+ 0xb6, 0x02, 0x04, 0x00, 0x81, 0x8e, 0x06, 0x02, 0x00, 0x20, 0xc6, 0x86,
+ 0x85, 0x02, 0x01, 0xf7, 0x86, 0xf6, 0x00, 0x00, 0x80, 0x75, 0x05, 0xc6,
+ 0x86, 0x56, 0x02, 0x00, 0xc3, 0x90, 0xb8, 0x00, 0x02, 0xc7, 0x86, 0x32,
+ 0x02, 0x06, 0x00, 0x80, 0xbe, 0x61, 0x02, 0x01, 0x74, 0x37, 0xf6, 0x86,
+ 0xa7, 0x02, 0x01, 0x75, 0x07, 0xf6, 0x86, 0xa8, 0x02, 0x01, 0x74, 0x05,
+ 0xb8, 0x00, 0x05, 0xeb, 0x24, 0xb8, 0x00, 0x04, 0xc7, 0x86, 0x32, 0x02,
+ 0x04, 0x00, 0x8a, 0x4e, 0x08, 0x80, 0xf9, 0x0c, 0x74, 0x13, 0xb8, 0x00,
+ 0x04, 0x80, 0xbe, 0x5a, 0x02, 0x01, 0x74, 0x09, 0xb8, 0x00, 0x03, 0xc7,
+ 0x86, 0x32, 0x02, 0x07, 0x00, 0x89, 0x86, 0x00, 0x03, 0xc3, 0x80, 0x7e,
+ 0x08, 0x08, 0x74, 0x23, 0x8a, 0x46, 0x06, 0x3c, 0x04, 0x72, 0x1c, 0x3c,
+ 0x48, 0x74, 0x04, 0x3c, 0x0e, 0x77, 0x14, 0xf6, 0x86, 0x5d, 0x02, 0x01,
+ 0x74, 0x0d, 0xf6, 0x86, 0x5c, 0x02, 0x01, 0x74, 0x06, 0xb8, 0x0c, 0x00,
+ 0xe8, 0x70, 0xd2, 0xc3, 0xc6, 0x86, 0x5d, 0x02, 0x01, 0x8e, 0x46, 0x02,
+ 0x26, 0x81, 0x26, 0x04, 0x00, 0xff, 0xf7, 0xe8, 0xd6, 0x02, 0xc3, 0x90,
+ 0x80, 0x7e, 0x06, 0x02, 0x74, 0x06, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x06,
+ 0xb8, 0x01, 0x00, 0xe8, 0x49, 0xd2, 0xc3, 0x90, 0x51, 0x52, 0x56, 0x33,
+ 0xd2, 0xc6, 0x86, 0x69, 0x02, 0x00, 0xe8, 0xeb, 0xc6, 0x8d, 0xb6, 0xa6,
+ 0x01, 0x8d, 0xbe, 0xac, 0x01, 0x8c, 0xd8, 0x8e, 0xc0, 0xa5, 0xa5, 0xa5,
+ 0xc6, 0x86, 0x83, 0x02, 0x00, 0x32, 0xc0, 0xe8, 0x52, 0xe3, 0xc6, 0x86,
+ 0x68, 0x01, 0x02, 0xc7, 0x86, 0x66, 0x01, 0x20, 0x03, 0xbe, 0xb7, 0x45,
+ 0xe8, 0x81, 0xc4, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0x8e, 0x46,
+ 0x02, 0x26, 0xc7, 0x06, 0x1c, 0x00, 0x00, 0x00, 0xe8, 0x1d, 0xde, 0x5e,
+ 0x5a, 0x59, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x02, 0x74, 0x0e, 0x80, 0x7e,
+ 0x06, 0x44, 0x74, 0x08, 0x80, 0x7e, 0x08, 0x08, 0x74, 0x02, 0xeb, 0x56,
+ 0xfe, 0x8e, 0x68, 0x01, 0x80, 0x8e, 0x68, 0x01, 0x00, 0x74, 0x45, 0xbe,
+ 0xb7, 0x45, 0xe8, 0x43, 0xc4, 0xe8, 0xac, 0xbe, 0x8e, 0x46, 0x02, 0x26,
+ 0x81, 0x0e, 0x0c, 0x00, 0x00, 0x01, 0x90, 0x8e, 0x46, 0x02, 0x26, 0x81,
+ 0x26, 0x0c, 0x00, 0xff, 0xfe, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x1c,
+ 0x00, 0x00, 0x00, 0x8b, 0xb6, 0x64, 0x01, 0xb9, 0xe8, 0x03, 0xc6, 0x86,
+ 0x86, 0x02, 0x01, 0x83, 0xbe, 0x66, 0x01, 0x01, 0x75, 0x05, 0xe8, 0xa2,
+ 0xdd, 0xeb, 0x0b, 0xe8, 0xb6, 0xdd, 0xeb, 0x06, 0xb8, 0x01, 0x00, 0xe8,
+ 0x8d, 0xd1, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x80, 0x00, 0x74, 0x10, 0x80,
+ 0x7e, 0x06, 0x14, 0x75, 0x0a, 0xb8, 0x05, 0x00, 0xe8, 0x60, 0xf9, 0xc6,
+ 0x46, 0x07, 0x42, 0xc3, 0x80, 0xbe, 0xa6, 0x02, 0x01, 0x74, 0x4e, 0xc6,
+ 0x86, 0x6c, 0x02, 0x00, 0x80, 0x7e, 0x08, 0x08, 0x75, 0x2c, 0xf6, 0x86,
+ 0x6d, 0x02, 0x01, 0x74, 0x25, 0xe9, 0xa6, 0xcf, 0xbe, 0xc9, 0x45, 0xe8,
+ 0xc2, 0xc3, 0x8e, 0x46, 0x02, 0xf6, 0x06, 0x8a, 0x56, 0x01, 0x75, 0x08,
+ 0x26, 0x83, 0x26, 0x02, 0x00, 0xfd, 0xeb, 0x08, 0xc6, 0x86, 0x6d, 0x01,
+ 0x01, 0xe8, 0xe6, 0x07, 0xeb, 0x16, 0x80, 0x7e, 0x06, 0x10, 0x75, 0x10,
+ 0xc6, 0x46, 0x09, 0x00, 0xc6, 0x86, 0x54, 0x02, 0x00, 0xc6, 0x86, 0x68,
+ 0x02, 0x00, 0xeb, 0xc8, 0xc3, 0xeb, 0xfd, 0x80, 0x7e, 0x06, 0x42, 0x75,
+ 0x0f, 0xc7, 0x86, 0xce, 0x02, 0x05, 0x00, 0xbe, 0x47, 0x46, 0xe8, 0x7b,
+ 0xc3, 0xe8, 0xbc, 0xdf, 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x18, 0x74, 0x06,
+ 0x80, 0x7e, 0x08, 0x1a, 0x75, 0x04, 0xc6, 0x46, 0x09, 0x1c, 0xc3, 0x90,
+ 0x80, 0x7e, 0x06, 0x46, 0x75, 0x06, 0xb8, 0x05, 0x00, 0xe8, 0xe7, 0xd0,
+ 0xc3, 0x90, 0x80, 0x7e, 0x08, 0x1c, 0x75, 0x0a, 0x80, 0x7e, 0x06, 0x48,
+ 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x42,
+ 0x75, 0x04, 0xc6, 0x46, 0x07, 0x44, 0xc3, 0x90, 0xf6, 0x86, 0x72, 0x02,
+ 0x01, 0x74, 0x20, 0xf6, 0x46, 0x06, 0x46, 0x75, 0x11, 0xc6, 0x86, 0x6b,
+ 0x02, 0x01, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xe8, 0x5e, 0xc5, 0xff, 0x86,
+ 0xcc, 0x02, 0xe8, 0x83, 0xdc, 0xbe, 0x35, 0x46, 0xe8, 0x11, 0xc3, 0xc3,
+ 0x80, 0x7e, 0x06, 0x42, 0x75, 0x3b, 0xf6, 0x86, 0x77, 0x02, 0x01, 0x75,
+ 0x34, 0x83, 0xbe, 0xce, 0x02, 0x00, 0x74, 0x0f, 0xff, 0x8e, 0xce, 0x02,
+ 0xbe, 0x47, 0x46, 0xe8, 0xf2, 0xc2, 0xe8, 0x33, 0xdf, 0xeb, 0x1e, 0xf7,
+ 0x86, 0xf4, 0x00, 0x00, 0x10, 0x74, 0x10, 0xb8, 0x02, 0x00, 0xe8, 0x56,
+ 0xf8, 0xc6, 0x46, 0x09, 0x1e, 0xc6, 0x46, 0x07, 0x02, 0xeb, 0x06, 0xb8,
+ 0x06, 0x00, 0xe8, 0x5e, 0xd0, 0xc3, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x1a,
+ 0xc6, 0x86, 0x6b, 0x02, 0x01, 0xc6, 0x86, 0x76, 0x02, 0x01, 0xe8, 0xfb,
+ 0xc4, 0xff, 0x86, 0xcc, 0x02, 0xbe, 0x4d, 0x46, 0xe8, 0xb1, 0xc2, 0xe8,
+ 0x34, 0xdf, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x44, 0x75, 0x06, 0xb8, 0x05,
+ 0x00, 0xe8, 0x2f, 0xd0, 0xc3, 0x90, 0x80, 0x7e, 0x06, 0x46, 0x75, 0x08,
+ 0xb8, 0x06, 0x00, 0xe8, 0x21, 0xd0, 0xeb, 0x17, 0x80, 0x7e, 0x08, 0x16,
+ 0x75, 0x11, 0xc7, 0x86, 0x2a, 0x02, 0x04, 0x00, 0xf6, 0x86, 0x6e, 0x02,
+ 0x01, 0x74, 0x04, 0xc6, 0x46, 0x09, 0x18, 0xc3, 0x8e, 0x46, 0x02, 0x26,
+ 0x8b, 0x16, 0x02, 0x00, 0xf7, 0xc2, 0x02, 0x00, 0x74, 0x14, 0x8b, 0xc2,
+ 0x83, 0xe0, 0xfd, 0x8e, 0x46, 0x02, 0x26, 0xa3, 0x02, 0x00, 0x8e, 0x46,
+ 0x02, 0x26, 0x89, 0x16, 0x02, 0x00, 0xc3, 0x90, 0x8e, 0x46, 0x02, 0x26,
+ 0xf7, 0x06, 0x14, 0x00, 0x03, 0x00, 0x74, 0x10, 0x8e, 0x46, 0x02, 0x26,
+ 0x83, 0x26, 0x14, 0x00, 0x03, 0xc6, 0x86, 0x55, 0x02, 0x01, 0xeb, 0x00,
+ 0xf6, 0x86, 0x55, 0x02, 0x01, 0x75, 0x14, 0x80, 0x7e, 0x08, 0x00, 0x75,
+ 0x0e, 0xc6, 0x46, 0x09, 0x02, 0xff, 0x86, 0x40, 0x02, 0x81, 0x8e, 0xda,
+ 0x02, 0x00, 0x02, 0xc6, 0x86, 0x55, 0x02, 0x00, 0xc3, 0x90, 0xf7, 0x86,
+ 0xf4, 0x00, 0x00, 0x10, 0x75, 0x15, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06,
+ 0x14, 0x00, 0x03, 0x00, 0x74, 0x09, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x26,
+ 0x14, 0x00, 0x03, 0xc3, 0x80, 0xbe, 0xab, 0x02, 0x01, 0x75, 0x3d, 0x8e,
+ 0x46, 0x02, 0x26, 0xf7, 0x06, 0x14, 0x00, 0x08, 0x00, 0x74, 0x2c, 0xf6,
+ 0x86, 0x5d, 0x02, 0x01, 0x74, 0x2a, 0xf6, 0x86, 0x5c, 0x02, 0x01, 0x75,
+ 0x23, 0xc7, 0x86, 0x2a, 0x02, 0x0a, 0x00, 0xbe, 0xe1, 0x45, 0xf7, 0x86,
+ 0x12, 0x01, 0x20, 0x00, 0x74, 0x03, 0xbe, 0xe7, 0x45, 0xe8, 0xc0, 0xc1,
+ 0xc6, 0x86, 0x5c, 0x02, 0x01, 0xeb, 0x05, 0xc6, 0x86, 0x5c, 0x02, 0x00,
+ 0xc3, 0x90, 0xbe, 0xf9, 0x45, 0xe8, 0xac, 0xc1, 0x33, 0xc0, 0x87, 0x86,
+ 0xc2, 0x02, 0x0b, 0xc0, 0x75, 0x14, 0x80, 0xbe, 0x61, 0x02, 0x00, 0x74,
+ 0x0d, 0xc6, 0x86, 0x61, 0x02, 0x00, 0x80, 0xa6, 0x07, 0x02, 0x7f, 0xe8,
+ 0x38, 0xfc, 0xc3, 0x80, 0x7e, 0x06, 0x12, 0x75, 0x0d, 0xc6, 0x86, 0x08,
+ 0x01, 0x01, 0xc6, 0x86, 0x09, 0x01, 0x00, 0xe8, 0x9a, 0xf6, 0xc3, 0x90,
+ 0xf6, 0x86, 0x6e, 0x01, 0x01, 0x74, 0x15, 0x80, 0xbe, 0x70, 0x01, 0x03,
+ 0x73, 0x07, 0xc6, 0x86, 0x6c, 0x01, 0x01, 0xeb, 0x23, 0xc6, 0x86, 0x6e,
+ 0x01, 0x00, 0xeb, 0x1c, 0xf6, 0x86, 0x6f, 0x01, 0x01, 0x74, 0x15, 0x80,
+ 0xbe, 0x71, 0x01, 0x03, 0x73, 0x07, 0xc6, 0x86, 0x6d, 0x01, 0x01, 0xeb,
+ 0x07, 0xc6, 0x86, 0x6f, 0x01, 0x00, 0xeb, 0x00, 0xc3, 0xf7, 0x86, 0x58,
+ 0x15, 0x00, 0x80, 0x75, 0x07, 0x83, 0xbe, 0x58, 0x15, 0x05, 0x74, 0x05,
+ 0xc6, 0x86, 0xca, 0x01, 0x01, 0xc3, 0xe8, 0x9d, 0xcf, 0xc3, 0xf7, 0x86,
+ 0xf6, 0x00, 0x08, 0x00, 0x74, 0x09, 0xe8, 0x92, 0xf5, 0xbe, 0x6b, 0x46,
+ 0xe8, 0x15, 0xc1, 0xc3, 0xf7, 0x86, 0xf6, 0x00, 0x08, 0x00, 0x74, 0x11,
+ 0x81, 0x8e, 0x06, 0x02, 0x00, 0x04, 0xc6, 0x86, 0x85, 0x02, 0x01, 0xb8,
+ 0x10, 0x00, 0xe8, 0x8a, 0xce, 0xc3, 0x8e, 0x46, 0x02, 0x26, 0xf7, 0x06,
+ 0x00, 0x00, 0x02, 0x00, 0x74, 0x41, 0xbb, 0x00, 0x03, 0x8b, 0x47, 0x14,
+ 0x83, 0xf8, 0x00, 0x74, 0x36, 0x3b, 0x86, 0x2a, 0x01, 0x74, 0x0c, 0x89,
+ 0x86, 0x2a, 0x01, 0xc7, 0x86, 0x28, 0x01, 0x00, 0x00, 0xeb, 0x24, 0xff,
+ 0x86, 0x28, 0x01, 0x83, 0xbe, 0x28, 0x01, 0x02, 0x72, 0x19, 0x83, 0xbe,
+ 0x28, 0x01, 0x18, 0x73, 0x0c, 0x80, 0x7e, 0x08, 0x00, 0x74, 0x0c, 0x80,
+ 0x7e, 0x08, 0x16, 0x74, 0x06, 0xb8, 0x10, 0x00, 0xe8, 0x3c, 0xce, 0xbe,
+ 0x71, 0x46, 0xe8, 0xa7, 0xc0, 0xc3, 0x8b, 0x86, 0x30, 0x01, 0x88, 0xa6,
+ 0x2c, 0x01, 0x86, 0x86, 0x2d, 0x01, 0x32, 0x86, 0x2d, 0x01, 0x74, 0x0f,
+ 0xf6, 0x46, 0x06, 0x0e, 0x74, 0x06, 0xf6, 0x46, 0x06, 0x48, 0x75, 0x03,
+ 0xe8, 0x94, 0xbb, 0xc3, 0xf6, 0x86, 0x90, 0x02, 0x01, 0x74, 0x0a, 0xa8,
+ 0x24, 0x74, 0x06, 0xc7, 0x86, 0x9d, 0x02, 0x05, 0x00, 0xf6, 0x86, 0xa9,
+ 0x02, 0x01, 0x74, 0x09, 0x80, 0xbe, 0x5e, 0x02, 0x01, 0x75, 0x58, 0xeb,
+ 0x09, 0xf6, 0x86, 0x6e, 0x02, 0x01, 0x75, 0x10, 0xeb, 0x52, 0x80, 0x7e,
+ 0x06, 0x0e, 0x74, 0x02, 0xeb, 0x45, 0x80, 0x7e, 0x08, 0x00, 0x75, 0x3f,
+ 0xa8, 0x01, 0x74, 0x05, 0x83, 0x8e, 0xda, 0x02, 0x10, 0xa8, 0x04, 0x74,
+ 0x05, 0x83, 0x8e, 0xda, 0x02, 0x04, 0xa8, 0x08, 0x74, 0x05, 0x83, 0x8e,
+ 0xda, 0x02, 0x40, 0xa8, 0x20, 0x74, 0x10, 0x81, 0x8e, 0xda, 0x02, 0x00,
+ 0x01, 0xf6, 0x86, 0x54, 0x02, 0x01, 0x75, 0x03, 0xe8, 0x2f, 0xc4, 0xa8,
+ 0x40, 0x74, 0x05, 0x83, 0x8e, 0xda, 0x02, 0x01, 0xa8, 0x80, 0x74, 0x03,
+ 0xe8, 0x52, 0x00, 0xa9, 0x00, 0x01, 0x75, 0x01, 0xc3, 0x50, 0x80, 0x7e,
+ 0x08, 0x0a, 0x75, 0x06, 0xc6, 0x46, 0x09, 0x04, 0xeb, 0x1b, 0x80, 0x7e,
+ 0x08, 0x00, 0x75, 0x23, 0xc6, 0x46, 0x09, 0x02, 0xff, 0x86, 0x40, 0x02,
+ 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0x06, 0x81, 0x8e, 0xda, 0x02, 0x00,
+ 0x02, 0xc6, 0x86, 0x69, 0x02, 0x01, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e,
+ 0x0c, 0x00, 0x10, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x08, 0x00, 0x00,
+ 0x00, 0x8e, 0x46, 0x02, 0x26, 0xc7, 0x06, 0x08, 0x00, 0x00, 0x01, 0x58,
+ 0xc3, 0x83, 0x8e, 0xda, 0x02, 0x20, 0x83, 0x7e, 0x06, 0x08, 0x75, 0x13,
+ 0x8b, 0x8e, 0xc4, 0x02, 0x41, 0x89, 0x8e, 0xc4, 0x02, 0x80, 0xf9, 0x02,
+ 0x75, 0x05, 0x50, 0xe8, 0x35, 0xd9, 0x58, 0xc3, 0x50, 0x53, 0x51, 0x8a,
+ 0x4e, 0x06, 0x80, 0xf9, 0x0e, 0x74, 0x1e, 0x80, 0xf9, 0x48, 0x74, 0x19,
+ 0x80, 0xbe, 0x54, 0x02, 0x01, 0x74, 0x46, 0x80, 0xf9, 0x08, 0x72, 0x41,
+ 0x80, 0xf9, 0x0e, 0x77, 0x3c, 0xb8, 0x02, 0x00, 0xe8, 0x04, 0xcd, 0xeb,
+ 0x34, 0xc7, 0x86, 0x2a, 0x02, 0x05, 0x00, 0xc6, 0x86, 0x61, 0x02, 0x01,
+ 0x8a, 0x46, 0x08, 0x3c, 0x06, 0x74, 0x26, 0x3c, 0x02, 0x74, 0x51, 0x3c,
+ 0x08, 0x74, 0x1a, 0x3c, 0x04, 0x74, 0x16, 0xf6, 0x86, 0xa7, 0x02, 0x01,
+ 0x75, 0x13, 0xf6, 0x86, 0xa8, 0x02, 0x01, 0x75, 0x0c, 0xc6, 0x46, 0x09,
+ 0x04, 0xff, 0x86, 0x4a, 0x02, 0x59, 0x5b, 0x58, 0xc3, 0x8b, 0x86, 0x06,
+ 0x02, 0xf6, 0xc4, 0x80, 0x75, 0x0c, 0x80, 0xcc, 0x80, 0x89, 0x86, 0x06,
+ 0x02, 0xc6, 0x86, 0x85, 0x02, 0x01, 0x81, 0xbe, 0x00, 0x03, 0x00, 0x02,
+ 0x74, 0xdf, 0xc7, 0x86, 0x00, 0x03, 0x00, 0x02, 0xf6, 0x86, 0xa5, 0x02,
+ 0x01, 0x74, 0xd2, 0xe8, 0xac, 0xd7, 0xeb, 0xcd, 0xb8, 0x00, 0x01, 0xe8,
+ 0xfa, 0xda, 0xf6, 0x86, 0x5e, 0x02, 0x01, 0x74, 0xc0, 0xc6, 0x46, 0x09,
+ 0x04, 0xeb, 0xba, 0xfa, 0xc7, 0x06, 0x30, 0x00, 0x0c, 0x0f, 0x8c, 0x0e,
+ 0x32, 0x00, 0xb8, 0x00, 0x00, 0xe7, 0x06, 0xb8, 0xea, 0x09, 0xe7, 0x00,
+ 0xb8, 0x09, 0x00, 0xe7, 0x06, 0xb0, 0x7f, 0xe8, 0x92, 0xbb, 0xc6, 0x06,
+ 0x8b, 0x56, 0x80, 0xfb, 0xc3, 0xf7, 0x86, 0x82, 0x01, 0x01, 0x00, 0x74,
+ 0x1a, 0xc7, 0x86, 0x82, 0x01, 0x00, 0x00, 0xf6, 0x86, 0x6e, 0x01, 0x01,
+ 0x74, 0x0d, 0xc6, 0x86, 0x6e, 0x01, 0x00, 0xbe, 0x5f, 0x46, 0xe8, 0x65,
+ 0xbf, 0xeb, 0x00, 0xf7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0x74, 0x45, 0xc7,
+ 0x86, 0x8a, 0x01, 0x00, 0x00, 0xf6, 0x86, 0x6f, 0x01, 0x01, 0x74, 0x0d,
+ 0xc6, 0x86, 0x6f, 0x01, 0x00, 0xbe, 0x5f, 0x46, 0xe8, 0x43, 0xbf, 0xeb,
+ 0x2b, 0x80, 0x7e, 0x06, 0x0e, 0x74, 0x06, 0x80, 0x7e, 0x06, 0x48, 0x75,
+ 0x1f, 0xf6, 0x86, 0x5d, 0x02, 0x01, 0x74, 0x18, 0xf6, 0x86, 0x5c, 0x02,
+ 0x01, 0x75, 0x11, 0xc6, 0x86, 0x5c, 0x02, 0x01, 0xc7, 0x86, 0x2a, 0x02,
+ 0x0a, 0x00, 0xb8, 0x0c, 0x00, 0xe8, 0xf3, 0xcb, 0xc3, 0xb9, 0x01, 0x00,
+ 0x33, 0xdb, 0x8b, 0xaf, 0x52, 0x55, 0x8e, 0x46, 0x02, 0x26, 0x8b, 0x16,
+ 0x14, 0x00, 0x83, 0xe2, 0x08, 0x26, 0xa1, 0x32, 0x00, 0xd1, 0xe8, 0xd0,
+ 0xe8, 0x86, 0xe0, 0xf7, 0xc2, 0x08, 0x00, 0x75, 0x02, 0xeb, 0x67, 0x83,
+ 0xbe, 0x74, 0x01, 0x00, 0x75, 0x04, 0x88, 0xa6, 0x78, 0x01, 0x81, 0xbe,
+ 0x74, 0x01, 0xbc, 0x02, 0x72, 0x06, 0xc7, 0x86, 0x74, 0x01, 0xf4, 0x01,
+ 0x8a, 0xc4, 0x2a, 0xe4, 0x83, 0xf8, 0x7f, 0x75, 0x12, 0x8b, 0x86, 0x74,
+ 0x01, 0xbe, 0xeb, 0x09, 0xf7, 0xe6, 0xbe, 0x20, 0x00, 0xf7, 0xf6, 0x03,
+ 0x86, 0x78, 0x01, 0x89, 0x86, 0x7c, 0x01, 0xff, 0x86, 0x74, 0x01, 0x83,
+ 0xbe, 0x7c, 0x01, 0x7d, 0x72, 0x21, 0x83, 0xbe, 0x88, 0x01, 0x01, 0x74,
+ 0x1a, 0xc7, 0x86, 0x88, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x8a, 0x01, 0x01,
+ 0x00, 0xa1, 0x3c, 0x55, 0x89, 0x86, 0x8c, 0x01, 0xa1, 0x3e, 0x55, 0x89,
+ 0x86, 0x8e, 0x01, 0xe9, 0x94, 0x00, 0x83, 0xbe, 0x76, 0x01, 0x00, 0x75,
+ 0x04, 0x88, 0x86, 0x7a, 0x01, 0x81, 0xbe, 0x76, 0x01, 0xbc, 0x02, 0x72,
+ 0x06, 0xc7, 0x86, 0x76, 0x01, 0xf4, 0x01, 0x2a, 0xe4, 0x83, 0xf8, 0x7f,
+ 0x75, 0x12, 0x8b, 0x86, 0x76, 0x01, 0xbe, 0xeb, 0x09, 0xf7, 0xe6, 0xbe,
+ 0x20, 0x00, 0xf7, 0xf6, 0x03, 0x86, 0x7a, 0x01, 0x89, 0x86, 0x7e, 0x01,
+ 0xff, 0x86, 0x76, 0x01, 0x83, 0xbe, 0x80, 0x01, 0x01, 0x74, 0x53, 0x83,
+ 0xf8, 0x1f, 0x72, 0x4e, 0x8d, 0xb6, 0x96, 0x01, 0x83, 0x3c, 0x12, 0x72,
+ 0x45, 0x83, 0x3c, 0x23, 0x77, 0x40, 0x83, 0x7c, 0x02, 0x1f, 0x72, 0x3a,
+ 0x83, 0x7c, 0x02, 0x45, 0x77, 0x34, 0x83, 0x7c, 0x04, 0x12, 0x72, 0x2e,
+ 0x90, 0x83, 0x7c, 0x04, 0x23, 0x77, 0x27, 0x81, 0x7c, 0x06, 0x9c, 0x00,
+ 0x72, 0x20, 0xc7, 0x86, 0x80, 0x01, 0x01, 0x00, 0xc7, 0x86, 0x82, 0x01,
+ 0x01, 0x00, 0xc7, 0x86, 0x88, 0x01, 0x00, 0x00, 0xa1, 0x3c, 0x55, 0x89,
+ 0x86, 0x84, 0x01, 0xa1, 0x3e, 0x55, 0x89, 0x86, 0x86, 0x01, 0x83, 0xc3,
+ 0x02, 0x49, 0x74, 0x03, 0xe9, 0xdb, 0xfe, 0xc3, 0x50, 0x51, 0x52, 0x56,
+ 0x57, 0x8e, 0x46, 0x02, 0x83, 0x86, 0x90, 0x01, 0x01, 0x83, 0x96, 0x92,
+ 0x01, 0x00, 0xc7, 0x86, 0x80, 0x01, 0x00, 0x00, 0x26, 0xa1, 0x32, 0x00,
+ 0xd1, 0xe8, 0xd0, 0xe8, 0x86, 0xe0, 0x8d, 0xb6, 0x96, 0x01, 0x26, 0x8b,
+ 0x0e, 0x14, 0x00, 0x83, 0xe1, 0x08, 0x89, 0x8e, 0x94, 0x01, 0xf7, 0xc1,
+ 0x08, 0x00, 0x74, 0x4f, 0x8b, 0x4c, 0x0a, 0x89, 0x4c, 0x0e, 0x8b, 0x4c,
+ 0x06, 0x89, 0x4c, 0x0a, 0x8b, 0x4c, 0x02, 0x89, 0x4c, 0x06, 0x2a, 0xe4,
+ 0x8b, 0xc8, 0x83, 0xf8, 0x7f, 0x75, 0x19, 0xb0, 0x0a, 0xe6, 0x10, 0xe5,
+ 0x00, 0xb1, 0x05, 0xd3, 0xe8, 0x03, 0x86, 0x7e, 0x01, 0x8b, 0xc8, 0xe4,
+ 0x10, 0xa8, 0x10, 0x74, 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0xc1, 0x89, 0x44,
+ 0x02, 0xc7, 0x86, 0x7e, 0x01, 0x00, 0x00, 0xc7, 0x86, 0x76, 0x01, 0x00,
+ 0x00, 0xeb, 0x7f, 0xc7, 0x86, 0x88, 0x01, 0x00, 0x00, 0xeb, 0x77, 0x8b,
+ 0x4c, 0x08, 0x89, 0x4c, 0x0c, 0x8b, 0x4c, 0x04, 0x89, 0x4c, 0x08, 0x8b,
+ 0x0c, 0x89, 0x4c, 0x04, 0x8a, 0xc4, 0x2a, 0xe4, 0x8b, 0xc8, 0x83, 0xf8,
+ 0x7f, 0x75, 0x25, 0xb0, 0x0a, 0xe6, 0x10, 0xe5, 0x00, 0xb1, 0x05, 0xd3,
+ 0xe8, 0x03, 0x86, 0x7c, 0x01, 0x8b, 0xc8, 0xe4, 0x10, 0xa8, 0x10, 0x74,
+ 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0x96, 0x7c, 0x01, 0x83, 0xf9, 0x7f, 0x77,
+ 0x03, 0x83, 0xc1, 0x4f, 0x8b, 0xc1, 0x89, 0x04, 0xc7, 0x86, 0x7c, 0x01,
+ 0x00, 0x00, 0xc7, 0x86, 0x74, 0x01, 0x00, 0x00, 0x83, 0xf8, 0x7d, 0x72,
+ 0xa2, 0x83, 0xbe, 0x88, 0x01, 0x01, 0x74, 0x1a, 0xc7, 0x86, 0x88, 0x01,
+ 0x01, 0x00, 0xc7, 0x86, 0x8a, 0x01, 0x01, 0x00, 0xa1, 0x3c, 0x55, 0x89,
+ 0x86, 0x84, 0x01, 0xa1, 0x3e, 0x55, 0x89, 0x86, 0x86, 0x01, 0x5f, 0x5e,
+ 0x5a, 0x59, 0x58, 0xc3, 0x50, 0x51, 0x57, 0x06, 0xfa, 0x8c, 0xd8, 0x8e,
+ 0xc0, 0x2b, 0xc0, 0x8d, 0xbe, 0x72, 0x01, 0xb9, 0x1a, 0x00, 0xf3, 0xab,
+ 0xfb, 0x07, 0x5f, 0x59, 0x58, 0xc3, 0xfa, 0xf6, 0x06, 0x8b, 0x56, 0x80,
+ 0x74, 0x4e, 0xc6, 0x86, 0x6c, 0x01, 0x00, 0xc6, 0x86, 0x6e, 0x01, 0x01,
+ 0xfe, 0x86, 0x70, 0x01, 0x8a, 0x46, 0x00, 0xa2, 0x8b, 0x56, 0xc7, 0x06,
+ 0x8c, 0x56, 0x02, 0x00, 0xc7, 0x06, 0x8e, 0x56, 0x01, 0x00, 0xe5, 0x06,
+ 0x83, 0xe0, 0x09, 0xe7, 0x06, 0x8b, 0xc8, 0xb8, 0xd6, 0x13, 0xe7, 0x02,
+ 0xb8, 0x4e, 0x03, 0xe7, 0x04, 0x83, 0xc9, 0x46, 0x8b, 0xc1, 0xe7, 0x06,
+ 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x02, 0x00, 0x01, 0xbe, 0x5f, 0x46,
+ 0xe8, 0xc9, 0xbb, 0xc6, 0x86, 0x5d, 0x02, 0x01, 0xfb, 0xc3, 0xfa, 0xf6,
+ 0x06, 0x8b, 0x56, 0x80, 0x74, 0x49, 0xc6, 0x86, 0x6d, 0x01, 0x00, 0xc6,
+ 0x86, 0x6f, 0x01, 0x01, 0xfe, 0x86, 0x71, 0x01, 0x8a, 0x46, 0x00, 0xa2,
+ 0x8b, 0x56, 0xc7, 0x06, 0x8c, 0x56, 0x0e, 0x00, 0xc7, 0x06, 0x8e, 0x56,
+ 0x02, 0x00, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0x8b, 0xc8, 0xb8,
+ 0xf7, 0x03, 0xe7, 0x02, 0xb8, 0xd6, 0x13, 0xe7, 0x04, 0x83, 0xc9, 0x46,
+ 0x8b, 0xc1, 0xe7, 0x06, 0x8e, 0x46, 0x02, 0x26, 0x83, 0x0e, 0x02, 0x00,
+ 0x01, 0xbe, 0x5f, 0x46, 0xe8, 0x71, 0xbb, 0xfb, 0xc3, 0x90, 0xe5, 0x06,
+ 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0x9d, 0x06, 0xe7, 0x02, 0xc7,
+ 0x06, 0x8c, 0x56, 0x04, 0x00, 0xc3, 0xc7, 0x06, 0x8c, 0x56, 0x06, 0x00,
+ 0xc3, 0x90, 0xc7, 0x06, 0x8c, 0x56, 0x08, 0x00, 0xc3, 0x90, 0x53, 0xc7,
+ 0x06, 0x8c, 0x56, 0x0a, 0x00, 0x33, 0xdb, 0x8a, 0x1e, 0x8b, 0x56, 0xd0,
+ 0xe3, 0x8b, 0x9f, 0x52, 0x55, 0x06, 0x8e, 0x47, 0x02, 0x26, 0x83, 0x26,
+ 0x02, 0x00, 0xfe, 0x07, 0xb8, 0x9d, 0x06, 0xe7, 0x02, 0x5b, 0xc3, 0x90,
+ 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc7, 0x06, 0x8c, 0x56, 0x0c,
+ 0x00, 0xc6, 0x06, 0x8b, 0x56, 0x80, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0,
+ 0x09, 0xe7, 0x06, 0xc3, 0xb8, 0xf7, 0x03, 0xe7, 0x02, 0xc7, 0x06, 0x8c,
+ 0x56, 0x10, 0x00, 0xc3, 0x53, 0xc7, 0x06, 0x8c, 0x56, 0x12, 0x00, 0x33,
+ 0xdb, 0x8a, 0x1e, 0x8b, 0x56, 0xd0, 0xe3, 0x8b, 0x9f, 0x52, 0x55, 0x06,
+ 0x8e, 0x47, 0x02, 0x26, 0x83, 0x26, 0x02, 0x00, 0xfe, 0x07, 0xb8, 0x9d,
+ 0x06, 0xe7, 0x02, 0x5b, 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7,
+ 0x06, 0xc7, 0x06, 0x8c, 0x56, 0x14, 0x00, 0xc6, 0x06, 0x8b, 0x56, 0x80,
+ 0xc3, 0x90, 0xe5, 0x06, 0x83, 0xe0, 0x09, 0xe7, 0x06, 0xc3, 0x4e, 0x6f,
+ 0x4c, 0x6f, 0x63, 0x61, 0x6c, 0x54, 0x78, 0x74, 0x30, 0x20, 0x20, 0x20,
+ 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x34, 0x12, 0x45, 0x23, 0x56, 0x34,
+ 0x00, 0x00, 0x00, 0x00, 0xcd, 0xab, 0xde, 0xbc, 0xef, 0xcd, 0x00, 0x00,
+ 0x00, 0x00, 0x4e, 0x6f, 0x74, 0x49, 0x6d, 0x70, 0x6c, 0x65, 0x6d, 0x65,
+ 0x6e, 0x74, 0x65, 0x64, 0x00, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x30, 0x00,
+ 0x00, 0x54, 0x69, 0x6d, 0x65, 0x72, 0x31, 0x00, 0x00, 0x54, 0x65, 0x73,
+ 0x74, 0x31, 0x00, 0x00, 0x54, 0x65, 0x73, 0x74, 0x32, 0x00, 0x00, 0x90,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x90, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x70, 0x55, 0x59, 0x4e,
+ 0x0a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x41,
+ 0x41, 0x41, 0x41, 0x41, 0x41, 0x41, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00,
+ 0x06, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00,
+ 0xe0, 0x02, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0x00, 0x02, 0x04, 0x01, 0x00, 0x00, 0x06, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x03, 0xc0, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0x03,
+ 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x04, 0xc0, 0x00,
+ 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12,
+ 0x00, 0x04, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00, 0xe0, 0x05,
+ 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x12, 0x00, 0x05, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x00,
+ 0xe0, 0x06, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x12, 0x00, 0x06, 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00,
+ 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0xe0, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x14, 0x00, 0xe0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x06, 0x00, 0x08, 0x02, 0x26, 0x00, 0x00,
+ 0x00, 0x00, 0x3e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x30, 0x50, 0x20, 0x0c, 0x23,
+ 0x30, 0x30, 0x30, 0x30, 0xf3, 0xf0, 0xf0, 0xf8, 0xf9, 0xf6, 0x08, 0x02,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x14, 0x22, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x06, 0x2b,
+ 0x00, 0x00, 0x00, 0x00, 0x06, 0x2c, 0x00, 0x00, 0x00, 0x00, 0x08, 0x28,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x29, 0x20, 0x00, 0x08, 0x00,
+ 0x01, 0x00, 0x04, 0x06, 0x00, 0x00, 0x04, 0x07, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x34, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x26, 0x40, 0x25, 0x06, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x14, 0x22, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x40, 0x26, 0x06, 0x0b, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x1a, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0c, 0x60, 0x27, 0x08, 0x0a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x00,
+ 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x16, 0x60, 0x28, 0x04, 0x30, 0x00, 0x00, 0x06, 0x0b,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x1e, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10, 0x30, 0x11,
+ 0x04, 0x0c, 0x00, 0x01, 0x04, 0x0e, 0x00, 0x02, 0x04, 0x21, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x03, 0x12,
+ 0x04, 0x0f, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x12, 0x00, 0xe0, 0x00,
+ 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x04, 0x30, 0x13, 0x00, 0x00, 0x00, 0x00, 0x16, 0x00, 0xe0, 0x00,
+ 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x08, 0x03, 0x14, 0x04, 0x0d, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x12, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0xff, 0xff, 0xff, 0xff, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x03, 0x15, 0x00, 0x00, 0x00, 0x00,
+ 0x30, 0x00, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x22, 0x60, 0x29, 0x08, 0x2d, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x08, 0x2e, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x06, 0x0b, 0x00, 0x00, 0x00, 0x00, 0x08, 0x02, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x04, 0x2a, 0x00, 0x00, 0x02, 0x20, 0x80, 0x00, 0x00, 0x06,
+ 0x09, 0x00, 0x00, 0x00, 0x04, 0x03, 0x01, 0x80, 0x00, 0x00, 0x04, 0x02,
+ 0x80, 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x02, 0x02, 0x80,
+ 0x00, 0x00, 0x08, 0x0b, 0x00, 0x00, 0x00, 0x06, 0x01, 0x26, 0x80, 0x00,
+ 0x00, 0xff, 0x06, 0x03, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00,
+ 0x06, 0x05, 0x00, 0x00, 0x00, 0x04, 0x06, 0x00, 0x00, 0x00, 0x04, 0x07,
+ 0x00, 0x00, 0x00, 0x04, 0x09, 0x00, 0x00, 0x00, 0x04, 0x04, 0x03, 0x00,
+ 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x06, 0x05, 0x00, 0x00, 0x00,
+ 0x04, 0x09, 0x00, 0x00, 0x00, 0x04, 0x03, 0x0c, 0x80, 0x00, 0x00, 0x04,
+ 0x0e, 0x80, 0x00, 0x00, 0x04, 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x0f,
+ 0x80, 0x00, 0x00, 0x04, 0x01, 0x0d, 0x80, 0x00, 0x00, 0x04, 0x04, 0x02,
+ 0x80, 0x00, 0x00, 0x08, 0x22, 0x00, 0x00, 0x00, 0xff, 0x23, 0x00, 0x00,
+ 0x00, 0xff, 0x21, 0x00, 0x00, 0x00, 0x04, 0x01, 0x09, 0x00, 0x00, 0x00,
+ 0x04, 0x00, 0xa5, 0xa5, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
+};
diff --git a/sys/contrib/dev/oltr/trlldmac.c b/sys/contrib/dev/oltr/trlldmac.c
new file mode 100644
index 0000000..63cfd3e3
--- /dev/null
+++ b/sys/contrib/dev/oltr/trlldmac.c
@@ -0,0 +1,2641 @@
+/*
+ * $FreeBSD$
+ *
+ * Copyright (c) 1997
+ * OLICOM A/S
+ * Denmark
+ *
+ * All Rights Reserved
+ *
+ * This source file is subject to the terms and conditions of the
+ * OLICOM Software License Agreement which restricts the manner
+ * in which it may be used.
+ *
+ *---------------------------------------------------------------------------
+ *
+ * Description: Olicom adapter micro-code
+ *
+ *---------------------------------------------------------------------------
+ */
+
+unsigned char TRlldMacCode[] __attribute ((aligned(2))) = {
+ 0x52, 0x94, 0x02, 0x00, 0xba, 0x7a, 0x00, 0x00, 0xa0, 0x00, 0x01, 0xc8,
+ 0xe2, 0x28, 0xd4, 0xdb, 0x80, 0x00, 0x40, 0x00, 0x20, 0x00, 0x10, 0x00,
+ 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01, 0x00, 0x00, 0x80, 0x00, 0x40,
+ 0x00, 0x20, 0x00, 0x10, 0x00, 0x08, 0x00, 0x04, 0x00, 0x02, 0x00, 0x01,
+ 0xff, 0x00, 0x00, 0xff, 0xff, 0xf0, 0xf0, 0x00, 0x00, 0x0f, 0xff, 0xff,
+ 0x7f, 0xff, 0x00, 0x03, 0x00, 0x00, 0x00, 0xd4, 0xe7, 0xe7, 0xe7, 0xf2,
+ 0xf2, 0xf8, 0x28, 0x43, 0x29, 0x20, 0x43, 0x4f, 0x50, 0x59, 0x52, 0x49,
+ 0x47, 0x48, 0x54, 0x20, 0x49, 0x42, 0x4d, 0x20, 0x31, 0x39, 0x38, 0x33,
+ 0x2c, 0x34, 0x2c, 0x35, 0x2c, 0x36, 0x28, 0x43, 0x29, 0x20, 0x43, 0x4f,
+ 0x50, 0x59, 0x52, 0x49, 0x47, 0x48, 0x54, 0x20, 0x54, 0x49, 0x20, 0x31,
+ 0x39, 0x38, 0x33, 0x2d, 0x38, 0x39, 0x2c, 0x39, 0x30, 0x2d, 0x39, 0x34,
+ 0x00, 0x00, 0x7b, 0x63, 0xf6, 0xde, 0xf1, 0xcc, 0xed, 0x9c, 0xf7, 0xe2,
+ 0x00, 0x00, 0x00, 0xc4, 0xbd, 0x24, 0x06, 0x4a, 0x06, 0x50, 0x06, 0x4c,
+ 0xda, 0x00, 0x06, 0x4e, 0x00, 0x0f, 0x06, 0x32, 0x00, 0x01, 0x07, 0x50,
+ 0x07, 0x58, 0x07, 0x52, 0xc2, 0xce, 0x07, 0x54, 0x00, 0x0f, 0x07, 0x38,
+ 0x00, 0x01, 0x00, 0xba, 0x00, 0xa0, 0x00, 0xbc, 0xf7, 0xf0, 0x00, 0xbe,
+ 0x00, 0x0f, 0x07, 0x5e, 0x07, 0x3a, 0x07, 0x62, 0x80, 0x40, 0x07, 0x64,
+ 0xc7, 0xb2, 0x07, 0x66, 0xc7, 0x94, 0x07, 0x68, 0xc5, 0x9e, 0x07, 0x98,
+ 0x80, 0x00, 0x07, 0x78, 0x80, 0x00, 0x08, 0xe2, 0x00, 0x04, 0x08, 0xe4,
+ 0x00, 0x01, 0x08, 0xec, 0x00, 0x08, 0x08, 0xf6, 0x00, 0x0a, 0x08, 0xf8,
+ 0x00, 0x06, 0x09, 0x00, 0x00, 0x0c, 0x09, 0x02, 0x00, 0x04, 0x01, 0xae,
+ 0x00, 0x00, 0x09, 0x1e, 0x00, 0x00, 0x09, 0x66, 0x00, 0x00, 0x06, 0x0c,
+ 0x00, 0x13, 0x06, 0x0a, 0x00, 0x20, 0x00, 0x00, 0x00, 0xe0, 0xb3, 0x86,
+ 0x00, 0xe0, 0xb2, 0xe6, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb5, 0x02,
+ 0x00, 0xe0, 0xb6, 0x5e, 0x00, 0xe0, 0xb9, 0x3c, 0x00, 0xe0, 0xb4, 0x12,
+ 0x00, 0xc0, 0xb4, 0x22, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86,
+ 0x00, 0xc0, 0xb4, 0x74, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86,
+ 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86, 0x00, 0xe0, 0xb3, 0x86,
+ 0x00, 0xc0, 0xbd, 0x4a, 0x00, 0xc0, 0xbd, 0xb4, 0x00, 0xc0, 0xbd, 0xf0,
+ 0x00, 0xc0, 0xbe, 0x60, 0x00, 0xc0, 0xbe, 0xe2, 0x00, 0xe0, 0xc0, 0x50,
+ 0x00, 0xe0, 0xbf, 0xf6, 0x00, 0xe0, 0xc1, 0x52, 0x00, 0xe0, 0xc0, 0xe8,
+ 0x00, 0xe0, 0xba, 0x90, 0x00, 0xc0, 0xbb, 0x00, 0x00, 0xc0, 0xbb, 0x5a,
+ 0x00, 0xc0, 0xbb, 0x8c, 0x00, 0xc0, 0xba, 0xb4, 0x00, 0xc0, 0xb3, 0x80,
+ 0x00, 0xc0, 0xb3, 0x80, 0x3f, 0x00, 0x7f, 0x00, 0x5e, 0x00, 0x00, 0x30,
+ 0x00, 0x28, 0x00, 0x43, 0xb6, 0xb6, 0xb6, 0xb6, 0xb5, 0x1c, 0xb5, 0x14,
+ 0xb5, 0x46, 0xb5, 0x46, 0xb5, 0x62, 0xb6, 0xb6, 0x40, 0x00, 0x00, 0x00,
+ 0x20, 0x00, 0x00, 0x00, 0x08, 0x00, 0x20, 0x00, 0x08, 0x00, 0x80, 0x00,
+ 0x08, 0x00, 0x01, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x0c,
+ 0x00, 0x10, 0x00, 0x14, 0x10, 0x0e, 0x0c, 0x0c, 0x0a, 0x0a, 0x0a, 0x0a,
+ 0x00, 0x00, 0xa1, 0xc8, 0x00, 0x09, 0x08, 0x08, 0x00, 0x00, 0xa1, 0xd0,
+ 0x00, 0x11, 0x06, 0x06, 0x00, 0x00, 0xa1, 0xe0, 0x00, 0x21, 0x04, 0x04,
+ 0x00, 0x00, 0xa2, 0x00, 0x00, 0x41, 0x02, 0x02, 0x00, 0x00, 0xa2, 0x40,
+ 0x00, 0x81, 0x00, 0x00, 0x00, 0x00, 0xa2, 0xc0, 0x06, 0xd8, 0x07, 0x98,
+ 0xd7, 0xa2, 0x07, 0x58, 0xc6, 0x56, 0x07, 0x58, 0xc5, 0x5c, 0x07, 0x58,
+ 0xc6, 0xc6, 0x07, 0x58, 0xc6, 0x2e, 0x07, 0x98, 0xd4, 0x7e, 0x07, 0x98,
+ 0xd4, 0x76, 0x07, 0x78, 0xce, 0xea, 0x07, 0x58, 0xc6, 0x8e, 0x07, 0x98,
+ 0xd7, 0x5c, 0x07, 0x78, 0xcf, 0xbe, 0x07, 0x58, 0xd4, 0x8e, 0x07, 0x58,
+ 0xc6, 0x3e, 0x07, 0x58, 0xc6, 0x7c, 0x07, 0x58, 0xc7, 0x40, 0x07, 0x98,
+ 0xd8, 0xd2, 0x07, 0x98, 0xd4, 0xb2, 0x07, 0x78, 0xcf, 0x7e, 0x07, 0xb8,
+ 0xd9, 0x38, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc8, 0x00, 0xce, 0x3e,
+ 0xce, 0xf2, 0xd3, 0xfa, 0xca, 0xba, 0xca, 0xf2, 0xcb, 0x10, 0xcb, 0x9a,
+ 0xcb, 0xbe, 0xcb, 0xda, 0xcc, 0x52, 0xcc, 0x52, 0xcb, 0x86, 0xcc, 0xf0,
+ 0xcb, 0x40, 0x00, 0x00, 0x00, 0x00, 0x2c, 0x00, 0x0c, 0x00, 0x0f, 0x01,
+ 0xfe, 0xff, 0x58, 0x00, 0x0e, 0x00, 0xfe, 0xff, 0x00, 0x0e, 0x70, 0x00,
+ 0x80, 0x40, 0x5e, 0x00, 0xc0, 0xa0, 0xff, 0xdf, 0x18, 0x00, 0xe0, 0x00,
+ 0x78, 0x00, 0x50, 0x00, 0x60, 0x00, 0x70, 0x00, 0x0c, 0x00, 0x00, 0x06,
+ 0x00, 0x00, 0xe3, 0x84, 0x07, 0xe6, 0x07, 0xf4, 0x00, 0x08, 0x00, 0x00,
+ 0xe3, 0x8a, 0x07, 0xea, 0x07, 0xf4, 0x00, 0x06, 0x00, 0x40, 0x0a, 0x00,
+ 0x07, 0xe6, 0x07, 0xee, 0x00, 0x08, 0x00, 0x40, 0x0a, 0x06, 0x07, 0xea,
+ 0x07, 0xee, 0x00, 0x00, 0xc1, 0xe2, 0xd4, 0x8b, 0xff, 0xff, 0xd1, 0xd7,
+ 0xc5, 0xd9, 0xc3, 0xd4, 0x59, 0x3b, 0x09, 0x34, 0x05, 0xfc, 0x09, 0x6c,
+ 0x06, 0xd8, 0x04, 0x06, 0xea, 0x7a, 0x09, 0x30, 0x04, 0x48, 0x08, 0x80,
+ 0x00, 0x06, 0x06, 0x0a, 0x0c, 0x0e, 0xdb, 0xa8, 0xe8, 0x7c, 0xe8, 0xa4,
+ 0xe9, 0x8a, 0xea, 0x8c, 0xea, 0xe6, 0xeb, 0x40, 0xeb, 0xf2, 0xdb, 0xa8,
+ 0xec, 0x74, 0xec, 0x04, 0xe8, 0x62, 0xec, 0x10, 0xec, 0x10, 0xed, 0x3a,
+ 0xed, 0x44, 0xed, 0x4e, 0xe5, 0x62, 0xe7, 0xea, 0xdb, 0x9e, 0xe5, 0xb4,
+ 0xe6, 0x82, 0xe6, 0xf2, 0xe7, 0x6e, 0xe7, 0x92, 0xdb, 0xf6, 0xdb, 0x9e,
+ 0xe4, 0xd2, 0xe4, 0xb4, 0xe4, 0x6e, 0xdb, 0x9e, 0xe7, 0xf6, 0xdb, 0x9e,
+ 0x06, 0x72, 0xdf, 0xa2, 0x07, 0x08, 0x06, 0x72, 0xdf, 0x00, 0x01, 0xf4,
+ 0x06, 0x72, 0xde, 0xe0, 0x07, 0x08, 0x06, 0x7c, 0xe6, 0x5a, 0x00, 0x04,
+ 0x06, 0x7c, 0xdf, 0x24, 0x00, 0x00, 0x06, 0x7c, 0xe7, 0xd8, 0x00, 0xfa,
+ 0x06, 0x86, 0xde, 0x70, 0x00, 0x05, 0x06, 0x90, 0xe8, 0x28, 0x00, 0x28,
+ 0x06, 0x90, 0xdf, 0xfc, 0x01, 0x04, 0x06, 0x90, 0x00, 0x00, 0x00, 0x02,
+ 0x06, 0x90, 0xdf, 0x2c, 0x02, 0xbc, 0x06, 0x9a, 0xdf, 0xb2, 0x05, 0xdc,
+ 0x06, 0x9a, 0xdf, 0x56, 0x00, 0x64, 0x06, 0x9a, 0xdf, 0xb6, 0x00, 0x14,
+ 0x06, 0x9a, 0xe9, 0x1c, 0x06, 0x40, 0x06, 0x9a, 0xdf, 0xbe, 0x00, 0x64,
+ 0x00, 0x00, 0x07, 0x0a, 0x07, 0x0e, 0x07, 0x04, 0x06, 0xd8, 0x07, 0x00,
+ 0x06, 0xf0, 0x06, 0xee, 0x06, 0xec, 0x07, 0x0c, 0x06, 0xe6, 0x07, 0x18,
+ 0x50, 0x00, 0x00, 0xcc, 0x00, 0x03, 0x84, 0x00, 0xa8, 0x00, 0xa0, 0x00,
+ 0x20, 0x00, 0x80, 0x00, 0x40, 0x00, 0x08, 0x00, 0x40, 0x00, 0x80, 0x00,
+ 0x40, 0x00, 0x10, 0x00, 0xf4, 0x40, 0xf3, 0x06, 0xf3, 0x20, 0xf3, 0x3a,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x09, 0x00, 0x09, 0xf3, 0xa8,
+ 0xf3, 0x10, 0xf3, 0x26, 0xf3, 0x40, 0x01, 0x40, 0x01, 0x42, 0x01, 0x42,
+ 0x01, 0x42, 0x00, 0x00, 0x00, 0x7f, 0x00, 0xa0, 0x00, 0xff, 0x02, 0x10,
+ 0x02, 0x1f, 0x02, 0x30, 0x02, 0x3f, 0x02, 0x50, 0x02, 0x5f, 0x02, 0x70,
+ 0x02, 0x7f, 0x02, 0x90, 0x02, 0x9f, 0x02, 0xb0, 0x02, 0xbf, 0x02, 0xd0,
+ 0x02, 0xdf, 0x02, 0xe1, 0x02, 0xff, 0x03, 0x01, 0x03, 0x7f, 0x03, 0x81,
+ 0x03, 0x8f, 0x03, 0x91, 0x03, 0x9f, 0x03, 0xa1, 0x03, 0xaf, 0x03, 0xb1,
+ 0x03, 0xbf, 0x03, 0xc1, 0x03, 0xcf, 0x03, 0xe1, 0x03, 0xff, 0x07, 0xc0,
+ 0x07, 0xff, 0x0c, 0x00, 0x0f, 0xff, 0x30, 0x00, 0x37, 0xff, 0xff, 0xff,
+ 0xff, 0xff, 0xfe, 0xbc, 0x00, 0x07, 0x02, 0x5e, 0x01, 0x00, 0xba, 0xff,
+ 0xba, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0c, 0x01, 0x0a,
+ 0x01, 0x0e, 0x01, 0x10, 0x01, 0x14, 0x00, 0x00, 0x01, 0x12, 0xf8, 0x00,
+ 0x01, 0x16, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0x0a, 0x01, 0x1c,
+ 0x01, 0x82, 0x96, 0x66, 0x96, 0x66, 0x55, 0x55, 0x00, 0x00, 0x01, 0x82,
+ 0x8a, 0x2a, 0x8a, 0x2a, 0xc9, 0x18, 0xc9, 0x18, 0x01, 0x86, 0xa2, 0xaa,
+ 0xa0, 0x1e, 0x55, 0x55, 0x54, 0x1e, 0x01, 0x8a, 0x50, 0x00, 0x00, 0x00,
+ 0xa8, 0x00, 0x00, 0x00, 0x01, 0x8c, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00,
+ 0x00, 0x00, 0x01, 0x8e, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00,
+ 0x01, 0x90, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x92,
+ 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x94, 0x50, 0x00,
+ 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00, 0x01, 0x96, 0x50, 0x00, 0x00, 0x00,
+ 0xa8, 0x00, 0x00, 0x00, 0x01, 0x98, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00,
+ 0x00, 0x00, 0x01, 0x9a, 0x50, 0x00, 0x00, 0x00, 0xa8, 0x00, 0x00, 0x00,
+ 0x01, 0x9c, 0x55, 0x55, 0x7f, 0xc0, 0xaa, 0xaa, 0x7f, 0xc0, 0x00, 0x00,
+ 0x01, 0xa2, 0x01, 0xa4, 0x01, 0xa8, 0x01, 0xaa, 0x01, 0xae, 0x01, 0xb0,
+ 0x01, 0xb2, 0x01, 0x80, 0x00, 0x00, 0x01, 0x88, 0xff, 0x00, 0x01, 0x9e,
+ 0x00, 0xff, 0x01, 0xa0, 0x80, 0x00, 0x01, 0xac, 0x80, 0x00, 0x00, 0x00,
+ 0x01, 0xa6, 0x80, 0x00, 0x00, 0x00, 0x01, 0x80, 0x01, 0xbc, 0x88, 0x00,
+ 0x06, 0x00, 0xc8, 0x00, 0x00, 0x00, 0x80, 0x00, 0x00, 0x30, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x02, 0x00, 0x44, 0xf2, 0x50, 0x00, 0x48, 0xf2, 0x56,
+ 0x00, 0x50, 0xf2, 0x5c, 0x00, 0x60, 0xf2, 0x62, 0x00, 0x78, 0xf2, 0x68,
+ 0xef, 0xc8, 0xee, 0xd6, 0xe9, 0xfc, 0xee, 0xe8, 0x55, 0x14, 0x01, 0xa0,
+ 0xee, 0xaa, 0xe9, 0x90, 0xef, 0x04, 0xef, 0x5e, 0xee, 0xbe, 0xf0, 0x16,
+ 0x00, 0x00, 0x00, 0x1e, 0xef, 0x04, 0xef, 0x50, 0x41, 0x00, 0x41, 0x01,
+ 0xef, 0x74, 0xea, 0x33, 0xee, 0xd6, 0xea, 0x08, 0xee, 0xaa, 0xe9, 0xc4,
+ 0xef, 0x14, 0xef, 0x20, 0xef, 0x74, 0xea, 0x2e, 0xf0, 0x20, 0x00, 0x00,
+ 0xef, 0xf4, 0xee, 0xaa, 0xe9, 0xba, 0xef, 0x14, 0xef, 0x20, 0xef, 0xf4,
+ 0xf0, 0x20, 0x00, 0x00, 0xee, 0xaa, 0xe9, 0xb0, 0xee, 0xca, 0xef, 0x08,
+ 0xef, 0x20, 0xef, 0xf4, 0xee, 0xaa, 0xe9, 0xba, 0xef, 0x14, 0xef, 0x20,
+ 0xef, 0xf4, 0xf0, 0x20, 0x20, 0x00, 0xee, 0xe8, 0x55, 0x14, 0x01, 0xa0,
+ 0xee, 0xd6, 0xea, 0x10, 0xee, 0xaa, 0xe9, 0x90, 0xf0, 0x16, 0x55, 0x50,
+ 0x00, 0x0c, 0xef, 0x04, 0xef, 0x50, 0x01, 0x00, 0x00, 0x00, 0xef, 0x74,
+ 0xea, 0x35, 0xee, 0xbe, 0xf0, 0x16, 0x55, 0x55, 0x00, 0x0c, 0xef, 0x14,
+ 0xef, 0x5e, 0xee, 0xbe, 0xf0, 0x16, 0xff, 0xff, 0x00, 0x08, 0xf0, 0x16,
+ 0x10, 0x02, 0x00, 0x06, 0xef, 0x04, 0xef, 0x50, 0x01, 0x00, 0x01, 0x01,
+ 0xef, 0x74, 0xea, 0x40, 0xee, 0xbe, 0xf0, 0x16, 0xc0, 0x00, 0x00, 0x08,
+ 0xf0, 0x16, 0xff, 0xff, 0x00, 0x0a, 0xf0, 0x16, 0xff, 0xff, 0x00, 0x0c,
+ 0xf0, 0x16, 0x10, 0x0d, 0x00, 0x06, 0xef, 0x04, 0xef, 0x50, 0x01, 0x00,
+ 0x01, 0x01, 0xef, 0x74, 0xea, 0x34, 0xf0, 0x20, 0x20, 0x08, 0xee, 0xbe,
+ 0xf0, 0x10, 0x01, 0x82, 0xc9, 0x02, 0xef, 0x04, 0xef, 0x74, 0xea, 0x40,
+ 0xf0, 0x20, 0x20, 0x34, 0xee, 0xbe, 0xf0, 0x16, 0x10, 0x00, 0x00, 0x06,
+ 0xef, 0x04, 0xf0, 0x84, 0xef, 0x74, 0xea, 0x38, 0xf0, 0x10, 0x01, 0x9c,
+ 0x00, 0x40, 0xee, 0xd6, 0xea, 0x10, 0xee, 0xe8, 0x00, 0xff, 0x07, 0x80,
+ 0xf0, 0xe4, 0x00, 0x03, 0xf1, 0x24, 0xf1, 0x32, 0xe9, 0xd2, 0xf0, 0xf6,
+ 0x00, 0x00, 0xf1, 0x32, 0xe9, 0xdc, 0xf0, 0xf6, 0x00, 0x04, 0xf1, 0x32,
+ 0xe9, 0xe4, 0xf0, 0xf6, 0x00, 0x07, 0xf1, 0x32, 0xe9, 0xec, 0xf0, 0xe4,
+ 0x00, 0x01, 0xf1, 0x32, 0xe9, 0xf4, 0xf0, 0xf6, 0x00, 0x02, 0xf1, 0x32,
+ 0xe9, 0xf4, 0xf0, 0xf6, 0x00, 0x06, 0xf1, 0x32, 0xe9, 0xf4, 0xf0, 0xf6,
+ 0x00, 0x05, 0xf1, 0x32, 0xe9, 0xf4, 0xf0, 0xe4, 0x00, 0x01, 0xf1, 0x08,
+ 0xf0, 0xe4, 0x00, 0x03, 0xf1, 0x16, 0xef, 0x20, 0xf0, 0xa4, 0xe9, 0x98,
+ 0x00, 0x01, 0xf0, 0xa4, 0xe9, 0xe5, 0x00, 0x02, 0xf0, 0xa4, 0xe9, 0xef,
+ 0x00, 0x06, 0xf0, 0xa4, 0xe9, 0xfa, 0x00, 0x05, 0xef, 0x74, 0xea, 0x34,
+ 0xef, 0xf4, 0xee, 0xaa, 0xe9, 0x90, 0xef, 0x14, 0xf0, 0x84, 0xee, 0xca,
+ 0xef, 0x50, 0x01, 0x00, 0x80, 0x00, 0xef, 0x74, 0xea, 0x38, 0xee, 0xbe,
+ 0xf0, 0xbc, 0xf0, 0x10, 0x01, 0x80, 0x8e, 0x41, 0xef, 0x08, 0xef, 0x50,
+ 0x01, 0x00, 0x1b, 0x01, 0xf0, 0xc4, 0xff, 0xe4, 0xef, 0x74, 0xea, 0x3c,
+ 0xf0, 0x7c, 0xee, 0xd6, 0xea, 0x16, 0xee, 0xca, 0xf0, 0x28, 0xee, 0xfa,
+ 0xe0, 0x00, 0xf0, 0x84, 0xef, 0x74, 0xea, 0x46, 0xee, 0xfa, 0xe8, 0x00,
+ 0xef, 0x20, 0xef, 0x74, 0xea, 0x45, 0xee, 0xfa, 0x08, 0x00, 0xf0, 0x84,
+ 0xef, 0x74, 0xea, 0x46, 0xee, 0xfa, 0xf8, 0x00, 0xef, 0x20, 0xef, 0x74,
+ 0xea, 0x45, 0xf0, 0x10, 0x01, 0x80, 0x02, 0x00, 0xee, 0xfa, 0xe0, 0x00,
+ 0xef, 0x20, 0xef, 0x74, 0xea, 0x45, 0xf0, 0x10, 0x01, 0x84, 0x00, 0x00,
+ 0xf0, 0x20, 0x00, 0x34, 0xee, 0xfa, 0x00, 0x00, 0xf0, 0x84, 0xf0, 0x20,
+ 0x60, 0x34, 0xf0, 0xcc, 0xf0, 0x10, 0x01, 0x84, 0x00, 0x00, 0xef, 0x74,
+ 0xea, 0x46, 0xf0, 0x10, 0x01, 0x82, 0xc8, 0x00, 0xee, 0xfa, 0xe0, 0x00,
+ 0xf0, 0x84, 0xee, 0xfa, 0x10, 0x00, 0xf0, 0x84, 0xf0, 0x20, 0x60, 0x34,
+ 0xf0, 0x10, 0x01, 0x80, 0x06, 0x00, 0xee, 0xfa, 0x00, 0x10, 0xf0, 0x36,
+ 0xef, 0xf4, 0xf0, 0x10, 0x01, 0x84, 0x00, 0x00, 0xf0, 0x20, 0x00, 0x34,
+ 0xee, 0xaa, 0xe9, 0x90, 0xee, 0xd6, 0xea, 0x1c, 0xf0, 0x8e, 0xe9, 0x52,
+ 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0xf0, 0x40, 0x00, 0x06, 0xc7, 0x00,
+ 0xef, 0x5e, 0xf0, 0x9a, 0xe0, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e,
+ 0xd0, 0x40, 0x00, 0x06, 0xe0, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0xc0, 0x00,
+ 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x90, 0x40, 0x00, 0x06, 0xa0, 0x00,
+ 0xef, 0x5e, 0xf0, 0x9a, 0x80, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e,
+ 0x50, 0x40, 0x00, 0x06, 0x60, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x40, 0x00,
+ 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x10, 0x40, 0x00, 0x06, 0x20, 0x00,
+ 0xef, 0x5e, 0xf0, 0x9a, 0x00, 0x00, 0xf0, 0x8e, 0xe9, 0x52, 0xee, 0xbe,
+ 0xee, 0xca, 0xef, 0x2e, 0xd0, 0x40, 0x00, 0x06, 0xa6, 0x00, 0xef, 0x5e,
+ 0xf0, 0x9a, 0xc0, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x90, 0x40,
+ 0x00, 0x06, 0xc0, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x80, 0x00, 0xee, 0xbe,
+ 0xee, 0xca, 0xef, 0x2e, 0x50, 0x40, 0x00, 0x06, 0x40, 0x00, 0xef, 0x5e,
+ 0xf0, 0x9a, 0x40, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x70, 0x40,
+ 0x00, 0x06, 0x60, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x60, 0x00, 0xf1, 0x3c,
+ 0xe9, 0x50, 0xee, 0xd6, 0xea, 0x22, 0xee, 0xaa, 0xe9, 0x90, 0xf0, 0x62,
+ 0x55, 0x55, 0x00, 0x16, 0xef, 0x04, 0xef, 0x50, 0x00, 0x00, 0x00, 0x00,
+ 0xef, 0x74, 0xea, 0x4b, 0xef, 0xc8, 0xee, 0xd6, 0xea, 0x22, 0xf0, 0x16,
+ 0x55, 0x55, 0x00, 0x16, 0xee, 0xbe, 0xef, 0x04, 0xef, 0x5e, 0xee, 0xe8,
+ 0x00, 0xff, 0x08, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x0c, 0x00, 0xee, 0xe8,
+ 0x00, 0xff, 0x10, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x14, 0x00, 0xee, 0xe8,
+ 0x00, 0xff, 0x18, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x1c, 0x00, 0xee, 0xe8,
+ 0x00, 0xff, 0x20, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x24, 0x00, 0xee, 0xe8,
+ 0x00, 0xff, 0x28, 0x00, 0xee, 0xe8, 0x00, 0xff, 0x2c, 0x00, 0xef, 0x90,
+ 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0x30, 0x40, 0x00, 0x06, 0x01, 0x00,
+ 0xef, 0x5e, 0xf0, 0x9a, 0x20, 0x00, 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e,
+ 0x70, 0x40, 0x00, 0x06, 0x43, 0x00, 0xef, 0x5e, 0xf0, 0x9a, 0x60, 0x00,
+ 0xee, 0xbe, 0xee, 0xca, 0xef, 0x2e, 0xb0, 0x40, 0x00, 0x06, 0x85, 0x00,
+ 0xef, 0x5e, 0xf0, 0x9a, 0xa0, 0x00, 0xf0, 0x96, 0x01, 0x00, 0x01, 0x03,
+ 0x01, 0x01, 0x00, 0x00, 0x81, 0x00, 0x00, 0x1a, 0x10, 0x40, 0x00, 0x00,
+ 0xa9, 0x98, 0x00, 0x0d, 0x55, 0x55, 0x00, 0x00, 0xa9, 0xa4, 0x00, 0xaa,
+ 0x82, 0x72, 0xa9, 0x4a, 0x5a, 0xa5, 0xe7, 0xda, 0x09, 0x03, 0x9d, 0x11,
+ 0x00, 0x00, 0x81, 0x00, 0x00, 0x04, 0x90, 0xd8, 0x10, 0x00, 0x00, 0x00,
+ 0x81, 0x00, 0x00, 0x04, 0x90, 0xd8, 0xb4, 0xd8, 0x00, 0x00, 0x81, 0x00,
+ 0x00, 0x08, 0x90, 0xd8, 0x16, 0x46, 0x40, 0x00, 0xb4, 0xd8, 0x00, 0x08,
+ 0x00, 0x00, 0x80, 0x00, 0x00, 0x13, 0x10, 0x40, 0x00, 0x16, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x10, 0x00, 0x15, 0x00, 0x00, 0x80, 0x00, 0x00, 0x0f,
+ 0x00, 0x15, 0x00, 0x00, 0x81, 0x00, 0x00, 0x0f, 0x00, 0x06, 0x00, 0x00,
+ 0x80, 0x00, 0x00, 0x12, 0x80, 0x0a, 0x9e, 0x40, 0xc8, 0x00, 0x00, 0x00,
+ 0x80, 0x5e, 0x00, 0x0f, 0x80, 0x06, 0xfe, 0x40, 0xcc, 0x00, 0x00, 0x00,
+ 0x80, 0x04, 0x8e, 0x40, 0xc9, 0x00, 0x80, 0x04, 0x06, 0x00, 0xcc, 0x00,
+ 0x80, 0x04, 0x0a, 0x40, 0xc8, 0x00, 0x80, 0x0a, 0x8a, 0x40, 0xc8, 0x00,
+ 0x00, 0x00, 0x80, 0x5e, 0x00, 0x0f, 0x08, 0x0a, 0x1c, 0x80, 0x00, 0x0a,
+ 0x1a, 0x1c, 0x80, 0x00, 0x0c, 0x1c, 0x80, 0x00, 0x1a, 0x1c, 0x80, 0x00,
+ 0x0e, 0x1a, 0x1c, 0x80, 0x00, 0x04, 0x80, 0x00, 0x02, 0x80, 0x00, 0x02,
+ 0x80, 0x00, 0x00, 0x00, 0xaa, 0x4e, 0x00, 0x2d, 0x00, 0x00, 0x00, 0x00,
+ 0xaa, 0x7a, 0x00, 0x4e, 0x07, 0x58, 0xc5, 0x6a, 0xe0, 0x16, 0x08, 0xe2,
+ 0x08, 0xec, 0x08, 0xf6, 0xe0, 0x16, 0x09, 0x00, 0x09, 0x0a, 0x00, 0x00,
+ 0x00, 0x00, 0x08, 0xe2, 0x00, 0x00, 0x08, 0xec, 0x08, 0xf6, 0x09, 0x00,
+ 0x00, 0x00, 0x07, 0xb8, 0xd8, 0xee, 0x02, 0x80, 0x07, 0xb8, 0xd9, 0x0c,
+ 0xff, 0x84, 0x07, 0xb8, 0xd9, 0x2e, 0x07, 0xb8, 0xd9, 0xa8, 0xda, 0x88,
+ 0xda, 0x7c, 0xda, 0xa2, 0xda, 0xa6, 0xda, 0x9e, 0xdb, 0x86, 0xdb, 0x86,
+ 0xdb, 0x86, 0xda, 0xa8, 0xda, 0xb2, 0xdb, 0x2e, 0xdb, 0x78, 0x00, 0x00,
+ 0xaa, 0xc8, 0x00, 0x09, 0xdb, 0x86, 0x00, 0x00, 0xaa, 0xd0, 0x02, 0xb0,
+ 0x00, 0x07, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x01, 0x08,
+ 0x08, 0x05, 0x08, 0x08, 0x08, 0x00, 0x00, 0x02, 0x04, 0x04, 0x04, 0x04,
+ 0x00, 0x08, 0x0a, 0x00, 0x00, 0x0c, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00,
+ 0x41, 0x04, 0x0b, 0x06, 0xc2, 0x08, 0xe6, 0x00, 0xe7, 0x00, 0x06, 0x04,
+ 0x07, 0x04, 0x03, 0x04, 0x04, 0x06, 0x05, 0x04, 0x88, 0x04, 0x00, 0x03,
+ 0x00, 0x1c, 0x0c, 0x00, 0x80, 0x00, 0xe3, 0xfc, 0xe4, 0x04, 0xe4, 0x48,
+ 0xe4, 0x08, 0xe4, 0x14, 0xe4, 0x1a, 0xe4, 0x3e, 0xe4, 0x0e, 0xe4, 0x5c,
+ 0x06, 0x00, 0x00, 0x00, 0x07, 0x06, 0x0e, 0x14, 0x14, 0x1e, 0x2a, 0x4c,
+ 0x38, 0x7c, 0x3e, 0x78, 0x43, 0x92, 0x58, 0x9c, 0x4d, 0xb2, 0x2f, 0x64,
+ 0x1d, 0x34, 0x6c, 0xd0, 0x23, 0x3e, 0x1d, 0x2a, 0x65, 0xc0, 0x72, 0xe0,
+ 0x78, 0xee, 0x7f, 0xfc, 0x01, 0x32, 0x57, 0x01, 0x11, 0x32, 0x51, 0x81,
+ 0x56, 0x02, 0x55, 0x03, 0x11, 0x54, 0x81, 0x56, 0x02, 0x55, 0x02, 0x54,
+ 0x81, 0x56, 0x76, 0x01, 0x34, 0x02, 0x55, 0x02, 0x54, 0x81, 0x58, 0x02,
+ 0x55, 0x02, 0x54, 0x81, 0x58, 0x02, 0x12, 0x11, 0x52, 0x02, 0x83, 0x58,
+ 0x05, 0x52, 0x04, 0x81, 0x58, 0x05, 0x52, 0x03, 0x15, 0x5c, 0x5b, 0x53,
+ 0x87, 0x52, 0x03, 0x11, 0x51, 0x41, 0x51, 0x78, 0x11, 0x34, 0x11, 0x81,
+ 0x31, 0x20, 0x57, 0x54, 0x53, 0x01, 0x12, 0x5a, 0x51, 0x81, 0x31, 0x20,
+ 0x57, 0x5b, 0x5a, 0x01, 0x11, 0x01, 0x11, 0x51, 0x81, 0x31, 0x20, 0x57,
+ 0x01, 0x15, 0x01, 0x13, 0x01, 0x11, 0x11, 0x11, 0x51, 0x81, 0x58, 0x05,
+ 0x52, 0x02, 0x54, 0x5b, 0x81, 0x5d, 0x05, 0x52, 0x02, 0x54, 0x81, 0x58,
+ 0x02, 0x50, 0x03, 0x13, 0x81, 0x58, 0x02, 0x50, 0x03, 0x11, 0x54, 0x81,
+ 0x5d, 0x72, 0x03, 0x50, 0x03, 0x13, 0x01, 0x13, 0x54, 0x40, 0x00, 0x0e,
+ 0x06, 0x20, 0x06, 0x56, 0xe5, 0x2a, 0x00, 0x24, 0x10, 0x02, 0x00, 0x16,
+ 0x00, 0x02, 0x04, 0x01, 0x07, 0x08, 0xe5, 0x2a, 0x00, 0x20, 0x10, 0x03,
+ 0x00, 0x12, 0x00, 0x03, 0xe4, 0x78, 0x8e, 0x14, 0x00, 0x20, 0x10, 0x04,
+ 0x00, 0x12, 0x00, 0x04, 0xdb, 0xc0, 0x00, 0x20, 0xe0, 0x05, 0x00, 0x12,
+ 0x00, 0x05, 0xdb, 0xc0, 0x00, 0x20, 0xe0, 0x06, 0x00, 0x12, 0x00, 0x06,
+ 0xe7, 0x22, 0x00, 0x12, 0xe0, 0x01, 0x09, 0x6c, 0x06, 0xcc, 0x00, 0x04,
+ 0x00, 0x07, 0x00, 0x00, 0x06, 0x30, 0xe6, 0x42, 0x05, 0xf0, 0xe0, 0x00,
+ 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x05, 0xe2, 0x00, 0x08, 0xff, 0x26,
+ 0x05, 0xdc, 0xe7, 0xae, 0x00, 0x3e, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00,
+ 0x00, 0x02, 0x00, 0x30, 0x50, 0x20, 0x0c, 0x23, 0x05, 0xfc, 0x06, 0x52,
+ 0x06, 0x56, 0x00, 0x00, 0x81, 0x00, 0x00, 0x16, 0xe0, 0x00, 0xc0, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x08, 0x40, 0x2a, 0x04, 0x2a, 0x06, 0x56,
+ 0x00, 0x26, 0xec, 0x71, 0x06, 0x2b, 0x09, 0x72, 0x00, 0x22, 0x00, 0x24,
+ 0xec, 0x87, 0x0c, 0x23, 0x05, 0xfc, 0x08, 0x28, 0x09, 0x34, 0x08, 0x29,
+ 0x07, 0x58, 0x07, 0x78, 0x07, 0x98, 0x00, 0x23, 0x00, 0x2a, 0xec, 0x95,
+ 0x04, 0x06, 0x06, 0xf0, 0x04, 0x07, 0x06, 0xee, 0x00, 0x24, 0xdb, 0xc0,
+ 0x00, 0x34, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00, 0x00, 0x10, 0x00, 0x26,
+ 0x40, 0x25, 0xdb, 0xc0, 0x00, 0x20, 0xe0, 0x00, 0xc0, 0x00, 0x00, 0x00,
+ 0x00, 0x10, 0x00, 0x12, 0x40, 0x26, 0xdb, 0xc0, 0x00, 0x1a, 0xe0, 0x00,
+ 0x00, 0x0c, 0x60, 0x27, 0x08, 0x0a, 0x06, 0xe6, 0xdb, 0xc0, 0x00, 0x24,
+ 0xe0, 0x00, 0x00, 0x16, 0x60, 0x28, 0x04, 0x30, 0x07, 0x06, 0xdc, 0x16,
+ 0x81, 0x00, 0x00, 0x30, 0xe0, 0x00, 0x00, 0x22, 0x60, 0x29, 0x08, 0x2d,
+ 0x07, 0x1c, 0x08, 0x2e, 0x07, 0x22, 0x00, 0x00, 0x02, 0x08, 0x01, 0x06,
+ 0x06, 0x14, 0x08, 0x18, 0x0c, 0x20, 0x0e, 0x26, 0x0f, 0x30, 0x11, 0x34,
+ 0x12, 0x3e, 0x14, 0x42, 0x16, 0x46, 0x0a, 0x1c, 0x18, 0x4a, 0x03, 0x13,
+ 0x83, 0x11, 0x11, 0x01, 0x81, 0x11, 0x81, 0x12, 0x01, 0x13, 0x83, 0x52,
+ 0x85, 0x81, 0x11, 0x85, 0x81, 0x12, 0x81, 0x12, 0x81, 0x19, 0x85, 0x60,
+ 0xc0, 0x00, 0x00, 0x00, 0x00, 0x08, 0x09, 0x6c, 0x00, 0x00, 0x06, 0x30,
+ 0xec, 0xfc, 0x06, 0x54, 0x06, 0x50, 0x02, 0x38, 0x04, 0x21, 0x09, 0x1e,
+ 0x06, 0x0b, 0x06, 0xd8, 0x08, 0x02, 0x06, 0xdc, 0xc0, 0x00, 0xff, 0xff,
+ 0xff, 0xff, 0x00, 0x41, 0x00, 0x41, 0xae, 0x14, 0x00, 0x00, 0x81, 0x00,
+ 0x04, 0x09, 0x07, 0x0c, 0x00, 0x41, 0x00, 0x41, 0x02, 0x14, 0x00, 0x00,
+ 0x81, 0x00, 0x06, 0x0b, 0x06, 0xd8, 0x06, 0x2c, 0x09, 0x76, 0x14, 0x22,
+ 0x09, 0x3a, 0x00, 0x41, 0x00, 0x41, 0x02, 0x54, 0x00, 0x00, 0x81, 0x00,
+ 0x06, 0xd8, 0x84, 0x00, 0x48, 0x00, 0xff, 0xfc, 0x00, 0x09, 0xc0, 0x00,
+ 0x00, 0x00, 0x00, 0x10, 0x00, 0x00, 0xad, 0x80, 0x02, 0x81, 0x00, 0x00,
+ 0x00, 0x00, 0xb0, 0x00, 0x06, 0x44, 0x54, 0x68, 0x69, 0x73, 0x20, 0x63,
+ 0x6f, 0x64, 0x65, 0x20, 0x69, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x65, 0x61,
+ 0x73, 0x65, 0x64, 0x20, 0x75, 0x6e, 0x64, 0x65, 0x72, 0x20, 0x6c, 0x69,
+ 0x63, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x4f, 0x6e, 0x6c, 0x79, 0x2c, 0x20,
+ 0x41, 0x6c, 0x6c, 0x20, 0x72, 0x69, 0x67, 0x68, 0x74, 0x73, 0x20, 0x72,
+ 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x64, 0x2e, 0x01, 0x60, 0x01, 0x42,
+ 0x08, 0x00, 0x16, 0x08, 0x03, 0xb0, 0x04, 0xe0, 0x00, 0x00, 0x01, 0x20,
+ 0x00, 0x00, 0xff, 0xff, 0x13, 0xfc, 0x03, 0x80, 0x07, 0xa0, 0x01, 0x42,
+ 0x08, 0x00, 0x07, 0x20, 0x00, 0x00, 0x04, 0xe0, 0x01, 0x00, 0x07, 0x8b,
+ 0x3d, 0x00, 0x01, 0x60, 0x01, 0x42, 0x00, 0x80, 0x13, 0x09, 0x07, 0x8b,
+ 0x2d, 0x00, 0xc0, 0x20, 0x01, 0x4e, 0x02, 0x80, 0x0f, 0x41, 0x11, 0x02,
+ 0x07, 0x8b, 0x3d, 0x00, 0xc8, 0x0b, 0x01, 0x4a, 0x02, 0x00, 0xa0, 0x00,
+ 0x09, 0xa0, 0xc8, 0x00, 0x01, 0x66, 0x02, 0xe0, 0x00, 0xa0, 0x07, 0xa0,
+ 0x01, 0x04, 0x00, 0x20, 0x01, 0xa0, 0x01, 0x40, 0xfe, 0x00, 0x48, 0x20,
+ 0xe0, 0x2a, 0x01, 0x42, 0x04, 0xe0, 0x01, 0x02, 0x04, 0xe0, 0x09, 0x60,
+ 0x04, 0xe0, 0x01, 0x82, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04, 0x16, 0x03,
+ 0x01, 0xe0, 0x01, 0x40, 0x0c, 0x00, 0x06, 0xa0, 0xb1, 0xbc, 0x07, 0xa0,
+ 0x01, 0x04, 0x00, 0x2d, 0xc2, 0x20, 0xe0, 0x00, 0x02, 0x88, 0xe2, 0x28,
+ 0x16, 0x14, 0x07, 0xa0, 0x01, 0x04, 0x00, 0x2e, 0x01, 0x60, 0x01, 0x42,
+ 0x03, 0x00, 0x16, 0x0d, 0x07, 0xa0, 0x01, 0x04, 0x00, 0x21, 0x07, 0x88,
+ 0xb0, 0x00, 0x07, 0x89, 0xff, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a,
+ 0xe0, 0x02, 0x06, 0xa0, 0xf4, 0x42, 0x10, 0x56, 0x07, 0x88, 0xa0, 0x00,
+ 0x07, 0x89, 0xaf, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a, 0xe0, 0x78,
+ 0x06, 0xa0, 0xf4, 0x42, 0x10, 0x4b, 0x05, 0xa0, 0x01, 0x04, 0x07, 0x88,
+ 0x00, 0x08, 0x07, 0x89, 0x00, 0x7a, 0x03, 0x00, 0x00, 0x01, 0x06, 0xa0,
+ 0xf4, 0x7c, 0x10, 0x40, 0x06, 0xa0, 0xb1, 0xbc, 0x02, 0xe0, 0x03, 0xf4,
+ 0x07, 0x88, 0x00, 0xa0, 0x07, 0x89, 0x00, 0xfe, 0x06, 0xa0, 0xf4, 0x7c,
+ 0x10, 0x35, 0x02, 0xe0, 0x00, 0xa0, 0x04, 0xe0, 0x01, 0x7e, 0x04, 0xc8,
+ 0x02, 0x09, 0x03, 0xf2, 0x62, 0x48, 0xc1, 0xe0, 0x01, 0x40, 0x01, 0xa0,
+ 0x01, 0x40, 0x04, 0x00, 0xce, 0x18, 0x06, 0x09, 0x16, 0xfd, 0x01, 0xa0,
+ 0x01, 0x40, 0x40, 0x00, 0xc8, 0x07, 0x01, 0x40, 0x07, 0x88, 0x03, 0xf4,
+ 0x07, 0x89, 0x3f, 0xfe, 0x06, 0xa0, 0xf4, 0x7c, 0x10, 0x19, 0x02, 0xe0,
+ 0x00, 0xa0, 0x06, 0xa0, 0xf5, 0xa4, 0x10, 0x14, 0xc8, 0x08, 0x04, 0x44,
+ 0xc8, 0x09, 0x04, 0x46, 0x06, 0xa0, 0xf4, 0xd2, 0x10, 0x0d, 0x07, 0x81,
+ 0xe0, 0x7c, 0xc0, 0xb1, 0x13, 0x26, 0xc8, 0x01, 0x00, 0xe0, 0x05, 0xa0,
+ 0x01, 0x04, 0x06, 0x92, 0x10, 0x03, 0xc0, 0x60, 0x00, 0xe0, 0x10, 0xf5,
+ 0x01, 0xe0, 0x01, 0x04, 0x00, 0x10, 0x03, 0xb0, 0x10, 0xff, 0x01, 0xa0,
+ 0x01, 0x04, 0x80, 0x00, 0x03, 0x80, 0x07, 0x80, 0x00, 0xa0, 0x04, 0xc2,
+ 0xcc, 0x80, 0x07, 0x81, 0xb1, 0xaa, 0x02, 0x82, 0x00, 0x1e, 0x16, 0x02,
+ 0x07, 0x81, 0xb1, 0xb4, 0xc4, 0x81, 0x8c, 0x81, 0x16, 0xe9, 0x02, 0x82,
+ 0x00, 0x7c, 0x16, 0xf2, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x5b, 0x07, 0x81,
+ 0xe1, 0x08, 0x07, 0x82, 0x00, 0x04, 0x04, 0xe0, 0x01, 0x80, 0x04, 0xe0,
+ 0x01, 0x82, 0xc4, 0x91, 0x8c, 0xb1, 0x16, 0xd8, 0x02, 0x82, 0x00, 0x7c,
+ 0x16, 0xfa, 0xc8, 0x20, 0xe0, 0x04, 0x01, 0x82, 0xe8, 0x20, 0xe0, 0x0c,
+ 0x01, 0x82, 0xc8, 0x20, 0xe0, 0x10, 0x01, 0x80, 0x07, 0x81, 0xe0, 0x86,
+ 0xc0, 0xb1, 0x13, 0x07, 0xc4, 0xb1, 0x10, 0xfc, 0x07, 0xa0, 0x01, 0x04,
+ 0x00, 0x2e, 0x04, 0x60, 0xb1, 0xaa, 0x07, 0x81, 0xe0, 0x34, 0x07, 0x82,
+ 0x05, 0xfc, 0x07, 0x83, 0x00, 0x0a, 0xcc, 0xb1, 0x06, 0x43, 0x16, 0xfd,
+ 0x02, 0x02, 0x06, 0x00, 0xd0, 0x60, 0x01, 0x4e, 0x13, 0xed, 0x02, 0x21,
+ 0xf7, 0x00, 0x02, 0x21, 0xc0, 0x00, 0xdc, 0x81, 0xd0, 0x60, 0x01, 0x4f,
+ 0xc0, 0xc1, 0x09, 0x41, 0x02, 0x21, 0xf0, 0x00, 0xdc, 0x81, 0x02, 0x43,
+ 0x0f, 0x00, 0x02, 0x23, 0xf0, 0x00, 0xdc, 0x83, 0x02, 0x01, 0x0c, 0x32,
+ 0xc0, 0xa0, 0x04, 0x44, 0xc0, 0xe0, 0x04, 0x46, 0xc1, 0x03, 0x61, 0x02,
+ 0x05, 0x84, 0xc8, 0x04, 0x04, 0x48, 0xc1, 0x03, 0x05, 0x84, 0xa1, 0x04,
+ 0xa1, 0x01, 0xc8, 0x04, 0x0c, 0x30, 0xc1, 0x03, 0x05, 0x84, 0x04, 0xf1,
+ 0x06, 0x04, 0x16, 0xfd, 0x02, 0x08, 0xb0, 0x00, 0x09, 0xa8, 0xc2, 0x60,
+ 0x0c, 0x30, 0x02, 0x29, 0x03, 0xff, 0x09, 0xa9, 0x02, 0x29, 0x00, 0x40,
+ 0x07, 0x80, 0xa0, 0x00, 0x09, 0xa0, 0x07, 0x8a, 0xaf, 0xfe, 0x02, 0x2a,
+ 0x03, 0xff, 0x09, 0xaa, 0x02, 0x01, 0x0c, 0x32, 0x02, 0x05, 0x00, 0x00,
+ 0xc1, 0x03, 0x05, 0x84, 0x07, 0x11, 0x05, 0xc1, 0x05, 0x85, 0x06, 0x04,
+ 0x13, 0x0b, 0x80, 0x85, 0x1a, 0xf9, 0x80, 0x05, 0x1a, 0xf8, 0x82, 0x85,
+ 0x1a, 0xf5, 0x82, 0x05, 0x1a, 0xf4, 0x82, 0x45, 0x1a, 0xf1, 0x10, 0xf1,
+ 0x2d, 0x20, 0x00, 0x02, 0x01, 0x60, 0x01, 0x40, 0x40, 0x00, 0x16, 0x06,
+ 0x07, 0x8a, 0x08, 0x00, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0x10, 0x48,
+ 0x01, 0x60, 0x01, 0x42, 0x80, 0x00, 0x16, 0x06, 0x07, 0x8a, 0x10, 0x00,
+ 0x01, 0xa0, 0x01, 0x42, 0x80, 0x00, 0x10, 0x3e, 0x01, 0x60, 0x01, 0x02,
+ 0x10, 0x00, 0x16, 0x0a, 0x01, 0x60, 0x01, 0x00, 0x04, 0x00, 0x16, 0x06,
+ 0x07, 0x8a, 0x80, 0x00, 0x01, 0xa0, 0x01, 0x02, 0x10, 0x00, 0x10, 0x30,
+ 0x01, 0x60, 0x01, 0x02, 0x08, 0x00, 0x16, 0x0a, 0x01, 0x60, 0x01, 0x00,
+ 0x04, 0x00, 0x16, 0x06, 0x01, 0xa0, 0x01, 0x02, 0x08, 0x00, 0x02, 0x0d,
+ 0x00, 0x01, 0x10, 0x0d, 0x01, 0x60, 0x01, 0x02, 0x04, 0x00, 0x16, 0x16,
+ 0x01, 0x60, 0x01, 0x00, 0x08, 0x00, 0x16, 0x12, 0x01, 0xa0, 0x01, 0x02,
+ 0x04, 0x00, 0x02, 0x0d, 0x00, 0x02, 0xc3, 0xa0, 0x01, 0x0e, 0xc3, 0xe0,
+ 0x01, 0x10, 0x07, 0x8a, 0x20, 0x00, 0x01, 0x60, 0x01, 0x00, 0x80, 0x00,
+ 0x13, 0x0b, 0x07, 0x8a, 0x40, 0x00, 0x10, 0x08, 0x07, 0x8a, 0x00, 0x04,
+ 0x10, 0x05, 0x07, 0x8a, 0x00, 0x02, 0x10, 0x02, 0x07, 0x8a, 0x00, 0x08,
+ 0x03, 0x00, 0x00, 0x00, 0x04, 0xe0, 0x01, 0x82, 0x07, 0x8b, 0x05, 0xe0,
+ 0xce, 0xca, 0xce, 0xcd, 0xce, 0xce, 0xc6, 0xcf, 0xc3, 0x20, 0x07, 0x58,
+ 0x23, 0x20, 0xe0, 0x04, 0x13, 0x12, 0x07, 0x8b, 0xff, 0x18, 0x02, 0x8a,
+ 0x80, 0x00, 0x13, 0x0a, 0x05, 0x8b, 0xa2, 0xcd, 0x02, 0x8a, 0x40, 0x00,
+ 0x13, 0x05, 0x02, 0x8a, 0x20, 0x00, 0x13, 0x02, 0x07, 0x8b, 0xff, 0x1d,
+ 0xc8, 0x0b, 0x01, 0x04, 0x10, 0x0d, 0xd3, 0x20, 0x01, 0x05, 0x11, 0xfd,
+ 0xd8, 0x20, 0x07, 0xdf, 0x01, 0x17, 0x07, 0x8b, 0xff, 0x80, 0xc8, 0x0b,
+ 0x01, 0x04, 0xe8, 0x20, 0xe0, 0x0a, 0x01, 0x00, 0xc2, 0xe0, 0x01, 0x04,
+ 0x22, 0xe0, 0xe1, 0x86, 0x16, 0xfb, 0x02, 0xe0, 0x00, 0xa0, 0x04, 0xe0,
+ 0x01, 0x82, 0xe8, 0x20, 0xe0, 0x0a, 0x01, 0x00, 0xc2, 0xe0, 0x01, 0x00,
+ 0x22, 0xe0, 0xe0, 0x06, 0x13, 0xf8, 0x01, 0xa0, 0x01, 0x40, 0xf6, 0x00,
+ 0x04, 0x60, 0xb0, 0x90, 0x03, 0x00, 0x00, 0x02, 0x07, 0xa0, 0x01, 0x02,
+ 0xdf, 0xff, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02,
+ 0x07, 0x09, 0xc2, 0xa0, 0x01, 0x04, 0x01, 0x8a, 0x00, 0x80, 0x52, 0x4a,
+ 0xd2, 0x89, 0xc8, 0x0a, 0x01, 0x04, 0xd2, 0xa0, 0x01, 0x04, 0x16, 0xf9,
+ 0x05, 0x49, 0x01, 0x89, 0x80, 0x00, 0x01, 0x49, 0x40, 0x00, 0x13, 0x0e,
+ 0xf8, 0x09, 0x07, 0x3a, 0xc2, 0x60, 0x07, 0x36, 0x16, 0x03, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0x04, 0xe0, 0x07, 0x36, 0x04, 0x54, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0x22, 0x60, 0xe1, 0x86, 0x13, 0xc2, 0x04, 0xe0,
+ 0x01, 0x82, 0x04, 0x60, 0xb3, 0xe0, 0x03, 0x00, 0x00, 0x02, 0x07, 0xa0,
+ 0x09, 0x62, 0x03, 0xe8, 0x04, 0xc9, 0xc1, 0xa0, 0x06, 0x34, 0x16, 0x04,
+ 0x06, 0xa0, 0xc2, 0xae, 0x04, 0xe0, 0x09, 0x20, 0x07, 0x86, 0x05, 0xe8,
+ 0x01, 0xa0, 0x01, 0x40, 0x80, 0x00, 0xc2, 0x20, 0x01, 0x84, 0x48, 0x20,
+ 0xe0, 0x08, 0x01, 0x84, 0x22, 0x20, 0xe0, 0x08, 0x13, 0x08, 0x01, 0x60,
+ 0x01, 0xae, 0x00, 0x01, 0x16, 0x04, 0x01, 0xe0, 0x06, 0x34, 0x80, 0x00,
+ 0x10, 0x06, 0xc2, 0x20, 0x09, 0x32, 0x13, 0x06, 0x01, 0xe0, 0x06, 0x34,
+ 0x08, 0x00, 0x04, 0xe0, 0x06, 0x30, 0x07, 0x09, 0x05, 0xa0, 0x05, 0xee,
+ 0x06, 0x20, 0x05, 0xec, 0x16, 0x02, 0xc2, 0x16, 0x16, 0x03, 0xc2, 0x49,
+ 0x16, 0x12, 0x03, 0x80, 0xc5, 0x98, 0xc1, 0xe8, 0x00, 0x02, 0xe9, 0xe0,
+ 0xe0, 0x14, 0x00, 0x04, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x08, 0x06, 0xa0,
+ 0xc2, 0x44, 0xc2, 0x16, 0x13, 0x04, 0xc8, 0x28, 0x00, 0x08, 0x05, 0xec,
+ 0x13, 0xef, 0x04, 0x54, 0x03, 0x00, 0x00, 0x02, 0xc1, 0xe0, 0x01, 0x86,
+ 0x02, 0x47, 0x00, 0x0e, 0xc2, 0xa7, 0xe1, 0x90, 0x04, 0x5a, 0x07, 0x8a,
+ 0xa0, 0x00, 0xc8, 0x0a, 0x01, 0x86, 0xa1, 0xc7, 0x02, 0x27, 0xe1, 0x98,
+ 0xe8, 0x37, 0x06, 0x34, 0xe8, 0x17, 0x06, 0xd2, 0x04, 0xe0, 0x06, 0x30,
+ 0x04, 0x60, 0xb9, 0xc0, 0xe8, 0x0a, 0x06, 0xd2, 0x01, 0xe0, 0x06, 0x34,
+ 0x08, 0x00, 0x04, 0xe0, 0x06, 0x30, 0xe0, 0x20, 0xe0, 0x18, 0x04, 0x5b,
+ 0x05, 0xa0, 0x09, 0x20, 0x88, 0x20, 0x09, 0x20, 0xe0, 0x16, 0x1a, 0xe5,
+ 0x04, 0xe0, 0x09, 0x20, 0x06, 0xa0, 0xe1, 0x18, 0x03, 0x80, 0x05, 0xa0,
+ 0x09, 0x32, 0x03, 0x80, 0xc3, 0x01, 0x13, 0xfb, 0x01, 0x60, 0x09, 0x6a,
+ 0x00, 0x01, 0x13, 0x78, 0x05, 0xa0, 0x09, 0x32, 0x10, 0x75, 0xc0, 0x41,
+ 0x13, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02, 0x11, 0x01,
+ 0x10, 0x7b, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x16, 0x79, 0xd8, 0x20,
+ 0x09, 0x2f, 0x01, 0x83, 0xc0, 0x41, 0x13, 0x04, 0xc8, 0x01, 0x01, 0x8a,
+ 0xc8, 0x01, 0x09, 0x18, 0x07, 0x86, 0x00, 0x43, 0xc8, 0x06, 0x01, 0x6c,
+ 0x02, 0x07, 0xfc, 0x02, 0xc2, 0x17, 0x04, 0x60, 0xb6, 0xfa, 0x04, 0xe0,
+ 0x09, 0x18, 0x61, 0xc7, 0x07, 0x08, 0x01, 0x60, 0xfc, 0x06, 0x00, 0x40,
+ 0x13, 0x02, 0x02, 0x08, 0x00, 0x01, 0x10, 0x09, 0xc2, 0x4c, 0xc3, 0x20,
+ 0xfc, 0x00, 0x13, 0x2a, 0xc8, 0x0c, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02,
+ 0x11, 0x1b, 0x01, 0x4b, 0x01, 0x00, 0x16, 0xf4, 0x22, 0xc8, 0x13, 0x12,
+ 0x01, 0xcb, 0x40, 0x00, 0xc8, 0x0b, 0xfc, 0x02, 0x10, 0x0d, 0xc1, 0xe0,
+ 0x09, 0x18, 0xc3, 0x01, 0x13, 0x21, 0xc2, 0x4c, 0x13, 0x15, 0xc8, 0x0c,
+ 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02, 0x11, 0x06, 0x81, 0xcc, 0x13, 0xd5,
+ 0xc2, 0x4c, 0xc3, 0x20, 0xfc, 0x00, 0x10, 0xf4, 0xc8, 0x09, 0x01, 0x6c,
+ 0xc2, 0xe0, 0xfc, 0x02, 0x16, 0x1e, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00,
+ 0xc3, 0x09, 0x10, 0x19, 0xc8, 0x09, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x02,
+ 0x16, 0x05, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0xc3, 0x09, 0x10, 0x0f,
+ 0xc2, 0xe0, 0x0c, 0x02, 0x11, 0x01, 0x10, 0x1e, 0xd8, 0x20, 0xe2, 0x00,
+ 0x01, 0x83, 0x00, 0x00, 0xb6, 0x44, 0x00, 0x09, 0x09, 0x8b, 0x00, 0x00,
+ 0xb6, 0x4c, 0x0b, 0x36, 0x07, 0xa0, 0x01, 0x8a, 0x00, 0x43, 0x10, 0x13,
+ 0xc8, 0x0c, 0x01, 0x8a, 0xc8, 0x0c, 0x09, 0x18, 0x10, 0x0e, 0x03, 0x00,
+ 0x00, 0x02, 0xc0, 0xe0, 0x01, 0x6c, 0xc3, 0x20, 0x01, 0x8a, 0x98, 0x20,
+ 0x01, 0x83, 0xe2, 0x00, 0x13, 0x81, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40,
+ 0x13, 0xb9, 0x83, 0x01, 0x16, 0x31, 0xc8, 0x03, 0x01, 0x6c, 0x01, 0x40,
+ 0x00, 0x10, 0x16, 0x14, 0xc2, 0xe0, 0x06, 0x2e, 0x13, 0x11, 0xc2, 0xe0,
+ 0x05, 0xf8, 0x13, 0x0e, 0x01, 0xe0, 0x07, 0x3a, 0x80, 0x00, 0x01, 0x80,
+ 0x00, 0x10, 0xc2, 0xe0, 0x07, 0x36, 0x13, 0x06, 0x04, 0xe0, 0x07, 0x36,
+ 0x01, 0x80, 0x00, 0x20, 0x04, 0x60, 0xb9, 0xc0, 0x01, 0x40, 0x00, 0x20,
+ 0x13, 0xf9, 0x03, 0x90, 0x11, 0xff, 0x03, 0x80, 0x01, 0x08, 0x04, 0x00,
+ 0x16, 0x19, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x01, 0x16, 0x15, 0x01, 0x88,
+ 0x1a, 0x00, 0x01, 0xc8, 0x01, 0x00, 0xc5, 0xc8, 0x10, 0x0f, 0x04, 0xe0,
+ 0x09, 0x18, 0x01, 0xc0, 0x00, 0x04, 0x10, 0x15, 0xc1, 0x81, 0xc8, 0x01,
+ 0x01, 0x6c, 0x02, 0x07, 0xfc, 0x00, 0xc0, 0x77, 0xc2, 0x17, 0x01, 0x48,
+ 0x18, 0x00, 0x13, 0xe4, 0x01, 0x40, 0x00, 0x40, 0x16, 0x15, 0x01, 0x80,
+ 0x00, 0x45, 0xc1, 0x46, 0xd0, 0x20, 0xfc, 0x07, 0x81, 0x60, 0x09, 0x18,
+ 0x13, 0xe6, 0xc2, 0xe0, 0xfc, 0x08, 0x11, 0x08, 0xc2, 0xe0, 0xfc, 0x0e,
+ 0x15, 0x07, 0x13, 0x06, 0xc2, 0xe0, 0xfc, 0x14, 0x15, 0x03, 0x13, 0x02,
+ 0x01, 0xc0, 0x00, 0x01, 0x01, 0x48, 0x01, 0x00, 0x13, 0x11, 0x01, 0x40,
+ 0x40, 0x80, 0x13, 0x5b, 0x04, 0x60, 0xb6, 0x66, 0x01, 0x48, 0x00, 0x01,
+ 0x16, 0x03, 0x01, 0x40, 0x40, 0x00, 0x16, 0x0b, 0x01, 0xc8, 0x40, 0x00,
+ 0x05, 0xa0, 0x09, 0x32, 0xc5, 0xc8, 0x10, 0x05, 0x01, 0xc0, 0x00, 0x40,
+ 0x01, 0x40, 0x00, 0x04, 0x13, 0xef, 0x05, 0xc7, 0xc2, 0xd7, 0x62, 0xc4,
+ 0x05, 0x0b, 0x02, 0x2b, 0xff, 0xfc, 0xc5, 0xcb, 0x15, 0x02, 0x81, 0x46,
+ 0x13, 0x5d, 0x01, 0x08, 0x5e, 0x00, 0x16, 0x5a, 0x01, 0x08, 0x00, 0x88,
+ 0x16, 0x13, 0x02, 0x86, 0x00, 0x43, 0x16, 0x1e, 0x01, 0x40, 0x40, 0x00,
+ 0x13, 0x0b, 0x01, 0x08, 0x00, 0x03, 0x13, 0x08, 0xc2, 0x84, 0x02, 0x2a,
+ 0xff, 0xd8, 0xc8, 0x06, 0x01, 0x6c, 0x68, 0x0a, 0xfc, 0x04, 0x10, 0x66,
+ 0x04, 0x60, 0xb8, 0xa8, 0x01, 0x40, 0x00, 0x01, 0x13, 0xea, 0x01, 0x08,
+ 0x00, 0x02, 0x16, 0xe7, 0x01, 0x48, 0x00, 0x01, 0x16, 0xe4, 0x07, 0x8a,
+ 0x00, 0x80, 0x06, 0xa0, 0xb5, 0x32, 0x10, 0xdf, 0xc0, 0x00, 0x11, 0xee,
+ 0xc2, 0x60, 0x09, 0x6a, 0x01, 0x40, 0x40, 0x00, 0x13, 0x0a, 0x01, 0x48,
+ 0x00, 0x01, 0x13, 0x2e, 0x01, 0x48, 0x00, 0x02, 0x13, 0x04, 0x01, 0x49,
+ 0x00, 0x04, 0x16, 0xe0, 0x10, 0x00, 0x01, 0x49, 0x00, 0x01, 0x13, 0x12,
+ 0x01, 0x40, 0x40, 0x80, 0x16, 0x01, 0xc1, 0x46, 0x04, 0xe0, 0xfc, 0x00,
+ 0x07, 0x87, 0x05, 0xf8, 0xc2, 0x17, 0x13, 0x14, 0x05, 0xc7, 0xc8, 0x17,
+ 0x01, 0x6c, 0xc8, 0x05, 0xfc, 0x00, 0xc5, 0xc6, 0x04, 0x60, 0xb6, 0x66,
+ 0x02, 0x07, 0xfc, 0x02, 0xa1, 0xe0, 0x09, 0x2c, 0xcd, 0xe0, 0x05, 0xee,
+ 0xc5, 0xe0, 0xfc, 0x04, 0xc8, 0x20, 0x09, 0x2c, 0xfc, 0x04, 0x10, 0xe2,
+ 0xcd, 0xc5, 0xc5, 0xc6, 0x04, 0x60, 0xb6, 0x66, 0x04, 0x60, 0xb8, 0x8c,
+ 0xc8, 0x06, 0x01, 0x6c, 0x81, 0x85, 0x13, 0x1a, 0xc2, 0xe0, 0xfc, 0x04,
+ 0x15, 0x17, 0xc2, 0x86, 0xa2, 0x8a, 0xc1, 0xaa, 0x0c, 0x32, 0xc8, 0x06,
+ 0x01, 0x6c, 0xa8, 0x0b, 0xfc, 0x04, 0x09, 0x1a, 0xc8, 0x0a, 0x01, 0x6c,
+ 0xc2, 0xe0, 0xfc, 0x02, 0x04, 0xe0, 0xfc, 0x00, 0xc8, 0x06, 0x01, 0x6c,
+ 0xc8, 0x0b, 0xfc, 0x02, 0x06, 0xa0, 0xc1, 0x9c, 0xc8, 0x06, 0x01, 0x6c,
+ 0x04, 0xe0, 0xfc, 0x00, 0x01, 0xa0, 0xfc, 0x02, 0x00, 0x02, 0x07, 0x87,
+ 0x06, 0x30, 0x01, 0xe7, 0x00, 0x04, 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27,
+ 0x00, 0x0c, 0xc2, 0x05, 0x06, 0xa0, 0xc2, 0x5a, 0x01, 0xc0, 0x00, 0x20,
+ 0x04, 0x60, 0xb6, 0x66, 0x01, 0x48, 0x18, 0x00, 0x13, 0x03, 0x01, 0x48,
+ 0x10, 0x00, 0x16, 0x02, 0x05, 0xa0, 0x09, 0x32, 0x02, 0x86, 0x00, 0x43,
+ 0x13, 0x03, 0x01, 0x40, 0x40, 0x80, 0x13, 0x9f, 0xc8, 0x06, 0x01, 0x6c,
+ 0x04, 0xe0, 0xfc, 0x00, 0xc2, 0x85, 0x06, 0xa0, 0xc1, 0x9c, 0x06, 0x20,
+ 0x09, 0x62, 0x16, 0xe6, 0x06, 0xa0, 0xe1, 0x18, 0x10, 0xe3, 0xc2, 0xa0,
+ 0x05, 0xf6, 0x16, 0x52, 0xc8, 0x19, 0x05, 0xf0, 0xc2, 0xa9, 0x00, 0x0a,
+ 0x11, 0x0d, 0xf2, 0xa0, 0x09, 0x2e, 0xd8, 0x0a, 0x01, 0x80, 0xc8, 0x29,
+ 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04, 0xc8, 0x09,
+ 0x05, 0xf4, 0x10, 0x42, 0xc8, 0x29, 0x00, 0x06, 0x01, 0x6c, 0xc8, 0x20,
+ 0xfc, 0x0e, 0x01, 0xbc, 0xc8, 0x20, 0xfc, 0x10, 0x01, 0xb0, 0xc8, 0x20,
+ 0xfc, 0x12, 0x01, 0xb2, 0xf2, 0xa0, 0x09, 0x2e, 0x01, 0x8a, 0x10, 0x00,
+ 0x01, 0xa0, 0x01, 0x80, 0xc4, 0x00, 0x10, 0xe1, 0x01, 0x47, 0x00, 0x08,
+ 0x16, 0x06, 0xc2, 0xa8, 0x00, 0x06, 0x06, 0xa0, 0xc1, 0x9c, 0x04, 0xe8,
+ 0x00, 0x06, 0x01, 0x07, 0x00, 0x20, 0x13, 0x2d, 0x04, 0xe8, 0x00, 0x02,
+ 0x10, 0x37, 0x04, 0xe0, 0xfc, 0x00, 0x06, 0xa0, 0xc1, 0x9c, 0x10, 0x25,
+ 0x03, 0x00, 0x00, 0x02, 0xc2, 0x20, 0x01, 0x8c, 0xc0, 0xe0, 0x01, 0x6c,
+ 0xc2, 0x20, 0x05, 0xf4, 0xc8, 0x28, 0x00, 0x08, 0x01, 0x6c, 0xc1, 0xe8,
+ 0x00, 0x0a, 0xc3, 0x20, 0xfc, 0x02, 0x01, 0x0c, 0xfe, 0x00, 0x16, 0x3b,
+ 0x01, 0x47, 0x00, 0x40, 0x13, 0x50, 0xc2, 0x60, 0x05, 0xf0, 0x16, 0xab,
+ 0x04, 0xe0, 0x05, 0xf4, 0xca, 0x0c, 0x00, 0x08, 0x01, 0x47, 0x00, 0x80,
+ 0x16, 0xcd, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x6c, 0xc2, 0xa0, 0xfc, 0x00,
+ 0x16, 0xd6, 0xc1, 0xe8, 0x00, 0x02, 0xc2, 0xd7, 0x16, 0x0f, 0x02, 0x27,
+ 0x00, 0x10, 0x04, 0xd8, 0xc2, 0x57, 0x13, 0x0e, 0x05, 0xc7, 0xc2, 0x57,
+ 0xc6, 0x48, 0xc5, 0xc8, 0xc8, 0x03, 0x01, 0x6c, 0x11, 0x0d, 0x03, 0x90,
+ 0x11, 0xff, 0x03, 0x80, 0x04, 0xd7, 0x01, 0xc3, 0x80, 0x00, 0x10, 0xed,
+ 0x01, 0xe7, 0xff, 0xf4, 0x00, 0x20, 0xcd, 0xc8, 0xc5, 0xc8, 0x10, 0xf0,
+ 0x03, 0x90, 0x11, 0xf8, 0x02, 0xe0, 0x00, 0xc0, 0xc3, 0x60, 0x00, 0xfa,
+ 0xc3, 0xa0, 0x00, 0xfc, 0xc3, 0xe0, 0x00, 0xfe, 0x04, 0x54, 0xc2, 0xe8,
+ 0x00, 0x08, 0xc2, 0xa8, 0x00, 0x06, 0xc3, 0x0c, 0x11, 0x33, 0x23, 0x20,
+ 0xe0, 0x0a, 0x13, 0x45, 0x23, 0x20, 0xe0, 0x10, 0x13, 0x46, 0x23, 0x20,
+ 0xe0, 0x0e, 0x13, 0x13, 0x21, 0xe0, 0xe0, 0x16, 0x16, 0xb6, 0x23, 0x20,
+ 0xe0, 0x06, 0x16, 0x03, 0x27, 0x20, 0xe4, 0x68, 0x13, 0x0a, 0xc2, 0xe8,
+ 0x00, 0x08, 0xc2, 0xa8, 0x00, 0x06, 0x01, 0x4c, 0x00, 0x88, 0x16, 0xa9,
+ 0x01, 0x0c, 0x00, 0x44, 0x16, 0xa6, 0x06, 0x20, 0x09, 0x16, 0x13, 0xa3,
+ 0xc8, 0x0a, 0x01, 0x6c, 0xc8, 0x20, 0xe0, 0x04, 0xfc, 0x02, 0xc8, 0x0b,
+ 0x01, 0x6c, 0x07, 0xa0, 0xfc, 0x02, 0x81, 0x00, 0xc3, 0x20, 0x01, 0x80,
+ 0x01, 0xa0, 0x01, 0x80, 0xc4, 0x00, 0xc8, 0x0c, 0x01, 0x80, 0xc8, 0x0a,
+ 0x01, 0x8c, 0x10, 0xac, 0xc2, 0x0a, 0x13, 0x0f, 0xc8, 0x08, 0x01, 0x6c,
+ 0xc2, 0xa0, 0xfc, 0x00, 0xc3, 0x20, 0xfc, 0x02, 0x23, 0x20, 0xe0, 0x12,
+ 0x16, 0xf5, 0xc8, 0x0b, 0x01, 0x6c, 0xc8, 0x0c, 0xfc, 0x02, 0x04, 0x60,
+ 0xb9, 0x48, 0x07, 0x8a, 0x04, 0x00, 0x04, 0x60, 0xb3, 0x8a, 0x07, 0x8a,
+ 0x00, 0x20, 0x04, 0x60, 0xb3, 0x8a, 0x07, 0x8a, 0x02, 0x00, 0x27, 0x20,
+ 0xe0, 0x0e, 0x16, 0x02, 0x06, 0xa0, 0xb5, 0x32, 0xc2, 0xa8, 0x00, 0x06,
+ 0x04, 0x60, 0xb9, 0x66, 0x03, 0x00, 0x00, 0x02, 0x01, 0xc0, 0x00, 0x10,
+ 0xc2, 0xe0, 0x06, 0x2e, 0x13, 0x08, 0xc2, 0xe0, 0x05, 0xf8, 0x13, 0x05,
+ 0x01, 0xe0, 0x07, 0x3a, 0x80, 0x00, 0x01, 0x80, 0x00, 0x10, 0x03, 0x90,
+ 0x7f, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc2, 0x20, 0x05, 0xf6,
+ 0xe2, 0x20, 0x05, 0xf4, 0x16, 0x0e, 0xd8, 0x20, 0x09, 0x2e, 0x01, 0x80,
+ 0xc8, 0x2b, 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04,
+ 0xc8, 0x0b, 0x05, 0xf4, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x07, 0x87,
+ 0x05, 0xf0, 0x04, 0xdb, 0xc2, 0x57, 0x16, 0x05, 0xcd, 0xcb, 0xc5, 0xcb,
+ 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x05, 0xc7, 0xc2, 0x57, 0xc6, 0x4b,
+ 0xc5, 0xcb, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02,
+ 0xc2, 0x0b, 0xc3, 0x20, 0x05, 0xf4, 0x13, 0x0f, 0xc2, 0xa8, 0x00, 0x0a,
+ 0x01, 0x4a, 0x00, 0x10, 0x16, 0x16, 0x22, 0xa0, 0xe0, 0x04, 0x16, 0x1a,
+ 0xc3, 0x08, 0x06, 0xa0, 0xbb, 0xfe, 0xc2, 0x0c, 0xc3, 0x20, 0x05, 0xf4,
+ 0x16, 0x13, 0x01, 0x68, 0x00, 0x0a, 0x00, 0x10, 0x13, 0x03, 0xc2, 0xe0,
+ 0x05, 0xf6, 0x16, 0x05, 0x06, 0xa0, 0xbc, 0x40, 0x03, 0x90, 0xff, 0xff,
+ 0x03, 0x80, 0x07, 0x87, 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x44, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0x07, 0x87, 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x8a,
+ 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0x07, 0x87, 0x05, 0xf0, 0xc2, 0xcb,
+ 0x16, 0x08, 0x06, 0xa0, 0xbb, 0xfe, 0x07, 0x20, 0x05, 0xf6, 0xcb, 0x60,
+ 0x05, 0xf4, 0x00, 0x02, 0x03, 0x80, 0x04, 0xe0, 0x05, 0xf6, 0xc2, 0x20,
+ 0x05, 0xf4, 0x16, 0x05, 0xc2, 0x17, 0x13, 0x03, 0xc5, 0xd8, 0x06, 0xa0,
+ 0xbc, 0x40, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc2, 0x8b, 0x06, 0xa0,
+ 0xbb, 0xfe, 0xc1, 0xca, 0x02, 0x27, 0x00, 0x10, 0x07, 0x88, 0x05, 0xf0,
+ 0xc1, 0x88, 0xc2, 0x18, 0x13, 0x26, 0x82, 0xa8, 0x00, 0x02, 0x16, 0xfa,
+ 0xc2, 0xe8, 0x00, 0x0a, 0x22, 0xe0, 0xe0, 0x1e, 0x16, 0xf5, 0xc5, 0x98,
+ 0x22, 0xe0, 0xe0, 0x1c, 0x16, 0x0b, 0xc8, 0x28, 0x00, 0x06, 0x00, 0xf4,
+ 0x02, 0xe0, 0x00, 0xe0, 0x06, 0xa0, 0xc1, 0x9c, 0x02, 0xe0, 0x00, 0xc0,
+ 0x04, 0xe8, 0x00, 0x06, 0x22, 0xe0, 0xe0, 0x18, 0x13, 0xe4, 0xea, 0x20,
+ 0xe0, 0x22, 0x00, 0x0a, 0xea, 0xa0, 0xe0, 0x18, 0x00, 0x04, 0x04, 0xda,
+ 0x06, 0xa0, 0xc2, 0x44, 0x06, 0x47, 0xc2, 0x06, 0x10, 0xd8, 0xc8, 0x06,
+ 0x05, 0xf2, 0xcb, 0x60, 0x05, 0xf4, 0x00, 0x02, 0x04, 0x54, 0xc2, 0x20,
+ 0x05, 0xf4, 0x13, 0x13, 0x01, 0xe0, 0x01, 0x9c, 0x40, 0x00, 0x0b, 0x8b,
+ 0x0b, 0x8b, 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00, 0x16, 0x0a, 0xc2, 0x60,
+ 0x01, 0x6c, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x6c, 0xc2, 0xa0, 0xfc, 0x02,
+ 0x11, 0x03, 0xc8, 0x09, 0x01, 0x6c, 0x04, 0x5b, 0xc8, 0x09, 0x01, 0x6c,
+ 0xc2, 0x4b, 0x07, 0x87, 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x8a, 0x04, 0xe0,
+ 0x05, 0xf4, 0x04, 0x59, 0xc2, 0xa8, 0x00, 0x0a, 0x11, 0x0d, 0xf2, 0xa0,
+ 0x09, 0x2e, 0xd8, 0x0a, 0x01, 0x80, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x8c,
+ 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04, 0xc8, 0x08, 0x05, 0xf4, 0x04, 0x5b,
+ 0xc3, 0x20, 0x01, 0x6c, 0xc8, 0x28, 0x00, 0x06, 0x01, 0x6c, 0xc8, 0x20,
+ 0xfc, 0x0e, 0x01, 0xbc, 0xc8, 0x20, 0xfc, 0x10, 0x01, 0xb0, 0xc8, 0x20,
+ 0xfc, 0x12, 0x01, 0xb2, 0xc8, 0x0c, 0x01, 0x6c, 0xf2, 0xa0, 0x09, 0x2e,
+ 0x01, 0x8a, 0x10, 0x00, 0x01, 0xa0, 0x01, 0x80, 0xc4, 0x00, 0x10, 0xdd,
+ 0x07, 0x33, 0x07, 0x33, 0x10, 0x0c, 0x07, 0x13, 0x07, 0x23, 0x00, 0x02,
+ 0xc8, 0xcb, 0x00, 0x06, 0x02, 0x23, 0x00, 0x18, 0xcc, 0xe0, 0x01, 0x6c,
+ 0xcc, 0xcd, 0xcc, 0xce, 0xcc, 0xcf, 0x07, 0x83, 0x06, 0x30, 0xc1, 0xd3,
+ 0x13, 0x0a, 0x07, 0x83, 0x07, 0x36, 0xc1, 0xd3, 0x13, 0x06, 0x07, 0x83,
+ 0x00, 0xa0, 0x00, 0x93, 0xc8, 0x0c, 0x01, 0x6c, 0x03, 0x80, 0x07, 0x63,
+ 0x00, 0x02, 0x15, 0x2a, 0xc2, 0x63, 0x00, 0x04, 0x42, 0x63, 0x00, 0x06,
+ 0x13, 0xdb, 0xc3, 0x63, 0x00, 0x1a, 0xd2, 0x49, 0x13, 0x0c, 0x06, 0xc9,
+ 0x72, 0x49, 0xd2, 0x69, 0xe1, 0xc0, 0x06, 0xc9, 0x72, 0x49, 0x48, 0xe9,
+ 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02, 0x04, 0x52, 0xc2, 0x69,
+ 0xe1, 0xc0, 0x72, 0x49, 0x02, 0x29, 0x00, 0x10, 0xc2, 0xc3, 0xa2, 0xe9,
+ 0xe1, 0xa8, 0xc3, 0x1b, 0x02, 0x89, 0x00, 0x12, 0x13, 0x0f, 0xc6, 0xdc,
+ 0x16, 0x03, 0x48, 0xe9, 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02,
+ 0xcb, 0x4c, 0x00, 0x04, 0x03, 0x90, 0x01, 0xff, 0x00, 0x93, 0xc8, 0x0c,
+ 0x01, 0x6c, 0x03, 0x80, 0xc8, 0x0c, 0x01, 0x6c, 0xc6, 0xe0, 0xfc, 0x00,
+ 0x16, 0xf1, 0x48, 0xe9, 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02,
+ 0xcb, 0x4c, 0x00, 0x04, 0x10, 0xed, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xdb,
+ 0xc2, 0x63, 0x00, 0x04, 0x42, 0x4b, 0x13, 0x9f, 0xd2, 0x49, 0x13, 0x0e,
+ 0x06, 0xc9, 0x72, 0x49, 0xd2, 0x69, 0xe1, 0xc0, 0x06, 0xc9, 0x72, 0x49,
+ 0x48, 0xe9, 0xe0, 0x04, 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0xc2, 0x69, 0xe1, 0xc0, 0x72, 0x49, 0x02, 0x29,
+ 0x00, 0x10, 0xc2, 0xc3, 0xa2, 0xe9, 0xe1, 0xa8, 0xc3, 0x1b, 0x02, 0x89,
+ 0x00, 0x12, 0x13, 0x0c, 0xc6, 0xdc, 0x16, 0x03, 0x48, 0xe9, 0xe0, 0x04,
+ 0x00, 0x04, 0xcb, 0x49, 0x00, 0x02, 0xcb, 0x4c, 0x00, 0x04, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0xc8, 0x0c, 0x01, 0x6c, 0xc6, 0xe0, 0xfc, 0x00,
+ 0x16, 0xf4, 0x10, 0xf0, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xbb, 0xc1, 0xbb,
+ 0xd1, 0x86, 0x13, 0x03, 0xea, 0x86, 0x00, 0x04, 0x10, 0x13, 0xd1, 0xa6,
+ 0xe1, 0xc0, 0x06, 0xc6, 0x71, 0x86, 0xc1, 0xca, 0xa1, 0xe6, 0xe1, 0xb8,
+ 0xea, 0xa6, 0xe0, 0x14, 0x00, 0x04, 0xc2, 0x1b, 0x02, 0x86, 0x00, 0x02,
+ 0x16, 0x03, 0x06, 0xa0, 0xc2, 0x6a, 0x10, 0x02, 0x06, 0xa0, 0xc2, 0x44,
+ 0x04, 0xda, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xab, 0x00, 0x06,
+ 0x07, 0x8c, 0x05, 0xe8, 0xc2, 0x5c, 0x13, 0x16, 0xc1, 0xa0, 0x05, 0xec,
+ 0x81, 0x8a, 0x1a, 0x1a, 0xc1, 0xc6, 0xc2, 0x09, 0xc2, 0x59, 0x13, 0x20,
+ 0xa1, 0xe9, 0x00, 0x08, 0x82, 0x87, 0x12, 0xf9, 0xa2, 0xa9, 0x00, 0x08,
+ 0x62, 0x87, 0xca, 0xca, 0x00, 0x08, 0x6a, 0x4a, 0x00, 0x08, 0xc6, 0xc9,
+ 0xc6, 0x0b, 0x03, 0x80, 0xca, 0xca, 0x00, 0x08, 0xc8, 0x0a, 0x05, 0xec,
+ 0x04, 0xdb, 0xcf, 0x0b, 0xc7, 0x0b, 0x03, 0x80, 0x61, 0x8a, 0xca, 0x46,
+ 0x00, 0x08, 0xca, 0xca, 0x00, 0x08, 0xc8, 0x0a, 0x05, 0xec, 0xc6, 0xc9,
+ 0xc7, 0x0b, 0x03, 0x80, 0x62, 0x87, 0xca, 0xca, 0x00, 0x08, 0x04, 0xdb,
+ 0xc6, 0x0b, 0xcb, 0x0b, 0x00, 0x02, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02,
+ 0xc1, 0xbb, 0xc2, 0xdb, 0x07, 0x8c, 0x05, 0xe8, 0xc2, 0x4c, 0x04, 0xed,
+ 0x00, 0x02, 0xc2, 0x09, 0xc2, 0x59, 0x13, 0x18, 0x81, 0xa9, 0x00, 0x02,
+ 0x16, 0xfa, 0x82, 0xe9, 0x00, 0x04, 0x16, 0xf7, 0xcb, 0x49, 0x00, 0x04,
+ 0xc2, 0x99, 0xc6, 0x0a, 0x13, 0x0a, 0x83, 0x08, 0x13, 0x04, 0xaa, 0xa9,
+ 0x00, 0x08, 0x00, 0x08, 0x03, 0x80, 0xa8, 0x2a, 0x00, 0x08, 0x05, 0xec,
+ 0x03, 0x80, 0xcb, 0x08, 0x00, 0x02, 0x03, 0x80, 0x07, 0x2d, 0x00, 0x02,
+ 0x07, 0x8c, 0x00, 0x08, 0xa3, 0x06, 0xc2, 0x4c, 0xc2, 0x09, 0xc2, 0x59,
+ 0x13, 0x13, 0x82, 0xe9, 0x00, 0x04, 0x16, 0xfa, 0x07, 0xad, 0x00, 0x02,
+ 0x00, 0x01, 0xcb, 0x49, 0x00, 0x04, 0xc6, 0x19, 0x13, 0x01, 0x03, 0x80,
+ 0x83, 0x08, 0x16, 0x04, 0x49, 0xa0, 0xe0, 0x14, 0x00, 0x04, 0x03, 0x80,
+ 0xcb, 0x08, 0x00, 0x02, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0x06, 0x0b,
+ 0x11, 0x1f, 0x13, 0x4d, 0x07, 0x8b, 0x4e, 0x00, 0x01, 0x60, 0x01, 0x42,
+ 0x00, 0x80, 0x13, 0x09, 0x07, 0x8b, 0x3a, 0x00, 0xc1, 0x20, 0x01, 0x4e,
+ 0x02, 0x84, 0x0f, 0x41, 0x11, 0x02, 0x07, 0x8b, 0x4e, 0x00, 0xc8, 0x0b,
+ 0x01, 0x44, 0x07, 0xa0, 0x09, 0x62, 0x03, 0xe8, 0x01, 0xe0, 0x01, 0x40,
+ 0x02, 0x00, 0x01, 0xe0, 0x01, 0x40, 0x20, 0x00, 0x07, 0x84, 0xbc, 0xa0,
+ 0x04, 0x60, 0xbc, 0xae, 0xc8, 0x20, 0xe0, 0x16, 0x00, 0xe0, 0xc2, 0xe0,
+ 0x09, 0x6a, 0x22, 0xe0, 0xe0, 0x10, 0x13, 0x03, 0xe8, 0x20, 0xe0, 0x14,
+ 0x00, 0xe0, 0xc8, 0x20, 0xe0, 0x04, 0x01, 0x82, 0xc8, 0x20, 0x00, 0xe2,
+ 0x01, 0x8a, 0x04, 0xe0, 0x09, 0x18, 0x04, 0xe0, 0x05, 0xf4, 0x04, 0xe0,
+ 0x05, 0xf8, 0x04, 0xe0, 0x05, 0xf0, 0x04, 0xe0, 0x07, 0x42, 0x07, 0xa0,
+ 0x01, 0x88, 0x00, 0x20, 0xc2, 0xe0, 0x09, 0x30, 0x13, 0x09, 0x07, 0xa0,
+ 0x01, 0x88, 0x00, 0x80, 0xe8, 0x20, 0xe0, 0x16, 0x01, 0x80, 0x01, 0xe0,
+ 0x01, 0x82, 0x03, 0x00, 0x07, 0x8b, 0xa0, 0x00, 0xe8, 0x0b, 0x01, 0x86,
+ 0x03, 0x80, 0x04, 0xe0, 0x01, 0x86, 0x01, 0xe0, 0x01, 0x9c, 0x00, 0x40,
+ 0x01, 0xe0, 0x01, 0x9c, 0x40, 0x00, 0x04, 0xcb, 0x03, 0xb0, 0x06, 0x0b,
+ 0x13, 0x04, 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00, 0x16, 0xf9, 0x04, 0xe0,
+ 0x01, 0x82, 0xe8, 0x20, 0xe0, 0x08, 0x09, 0x6a, 0x07, 0x8b, 0x80, 0x00,
+ 0xc8, 0x0b, 0x07, 0x98, 0xc8, 0x0b, 0x07, 0x78, 0xc8, 0x20, 0xe0, 0x04,
+ 0x01, 0x82, 0x07, 0x8b, 0x87, 0x6f, 0x48, 0x0b, 0x07, 0x3a, 0xc2, 0xe0,
+ 0x07, 0x50, 0x02, 0x8b, 0x07, 0x58, 0x13, 0x10, 0xe8, 0x20, 0xe0, 0x0a,
+ 0x01, 0x00, 0xc2, 0xe0, 0x01, 0x00, 0x22, 0xe0, 0xe0, 0x06, 0x13, 0xf8,
+ 0x07, 0x8b, 0x07, 0x58, 0xc8, 0x0b, 0x07, 0x50, 0x07, 0x8b, 0xc5, 0x6a,
+ 0xc8, 0x0b, 0x07, 0x52, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc2, 0xe0,
+ 0x09, 0x1a, 0x13, 0x0c, 0x06, 0x20, 0x09, 0x1c, 0xc8, 0x0b, 0x01, 0x6c,
+ 0xc8, 0x20, 0xfc, 0x00, 0x09, 0x1a, 0xcb, 0x4b, 0x00, 0x02, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0xc0, 0x41, 0x13, 0x0f, 0x80, 0x81, 0x13, 0x0d,
+ 0xa0, 0x82, 0xc2, 0xe2, 0x0c, 0x32, 0x09, 0x12, 0xc8, 0x0b, 0x01, 0x6c,
+ 0x04, 0xe0, 0xfc, 0x00, 0xc3, 0x20, 0xfc, 0x02, 0x11, 0x07, 0xc8, 0x02,
+ 0xfc, 0x00, 0x04, 0xed, 0x00, 0x02, 0x04, 0xe0, 0x01, 0x6c, 0x03, 0x80,
+ 0xcb, 0x42, 0x00, 0x02, 0xc8, 0x02, 0x01, 0x6c, 0xc0, 0x8b, 0x03, 0x80,
+ 0x03, 0x00, 0x00, 0x02, 0x07, 0x83, 0x80, 0x00, 0xc2, 0x60, 0x09, 0x7e,
+ 0xc1, 0x09, 0x02, 0x24, 0xff, 0xf8, 0x08, 0xa9, 0x02, 0x01, 0x00, 0x00,
+ 0x02, 0x02, 0x00, 0x00, 0x02, 0x0b, 0x00, 0x00, 0x02, 0x0c, 0x00, 0x00,
+ 0x02, 0x07, 0x00, 0x00, 0xcb, 0x2c, 0x0c, 0x32, 0x0c, 0x32, 0x13, 0x06,
+ 0x05, 0x8b, 0x05, 0xcc, 0x88, 0x0b, 0x04, 0x46, 0x1b, 0x27, 0x10, 0xf6,
+ 0xc2, 0x09, 0xc2, 0x8b, 0x06, 0x08, 0x13, 0x0a, 0x05, 0x8b, 0x05, 0xcc,
+ 0x88, 0x0b, 0x04, 0x46, 0x1b, 0x1d, 0xcb, 0x2c, 0x0c, 0x32, 0x0c, 0x32,
+ 0x16, 0xed, 0x10, 0xf4, 0xc0, 0x82, 0x13, 0x14, 0xc8, 0x02, 0x01, 0x6c,
+ 0xc8, 0x0a, 0xfc, 0x00, 0xc8, 0x0a, 0x01, 0x6c, 0x04, 0xe0, 0xfc, 0x00,
+ 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0xc8, 0x04, 0xfc, 0x04, 0xc2, 0x0a,
+ 0xa2, 0x08, 0xca, 0x02, 0x0c, 0x32, 0xc0, 0x8a, 0x05, 0x87, 0x10, 0xd6,
+ 0xc0, 0x4a, 0x10, 0xee, 0xcb, 0x47, 0x00, 0x02, 0x04, 0xe0, 0x01, 0x6c,
+ 0x07, 0x8b, 0x00, 0x43, 0x04, 0xe0, 0x0c, 0x00, 0x03, 0x00, 0x00, 0x02,
+ 0xc8, 0x0b, 0x01, 0x6c, 0xc2, 0x8b, 0x06, 0xa0, 0xc1, 0xa0, 0x03, 0x90,
+ 0x00, 0x7f, 0x03, 0x80, 0x01, 0xa0, 0xfc, 0x02, 0x00, 0x20, 0x01, 0x60,
+ 0x09, 0x6a, 0x00, 0x01, 0x16, 0x0b, 0x02, 0x0a, 0xfc, 0x02, 0xa2, 0xa0,
+ 0x09, 0x2c, 0xce, 0xa0, 0x05, 0xee, 0xc6, 0xa0, 0xfc, 0x04, 0xc8, 0x20,
+ 0x09, 0x2c, 0xfc, 0x04, 0x07, 0x8a, 0x05, 0xf8, 0xc2, 0x5a, 0x13, 0x08,
+ 0x05, 0xca, 0xc2, 0x5a, 0xc8, 0x09, 0x01, 0x6c, 0xc8, 0x0b, 0xfc, 0x00,
+ 0xc6, 0x8b, 0x10, 0x02, 0xce, 0x8b, 0xc6, 0x8b, 0x20, 0x20, 0xe0, 0x1a,
+ 0x16, 0x05, 0xe8, 0x20, 0xe0, 0x04, 0x07, 0x3a, 0x04, 0xe0, 0x07, 0x36,
+ 0x03, 0x90, 0x00, 0x7f, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc8, 0x0b,
+ 0x01, 0x6c, 0x04, 0xcc, 0x04, 0xe0, 0xfc, 0x00, 0xc2, 0x8b, 0x06, 0xa0,
+ 0xc1, 0xae, 0x03, 0x90, 0x00, 0x7f, 0x03, 0x80, 0x07, 0xa0, 0xfc, 0x02,
+ 0x80, 0x00, 0xc8, 0x20, 0xe1, 0x8c, 0xfc, 0x04, 0xc0, 0x41, 0x16, 0x0f,
+ 0xd8, 0x20, 0xe2, 0x00, 0x01, 0x83, 0x00, 0x00, 0xc1, 0x82, 0x00, 0x15,
+ 0x0b, 0x8b, 0x00, 0x00, 0xc1, 0x96, 0x0c, 0xa8, 0xc8, 0x0a, 0x01, 0x8a,
+ 0x04, 0x5b, 0xc8, 0x0a, 0x01, 0x6c, 0xc3, 0x20, 0xfc, 0x00, 0x04, 0xe0,
+ 0xfc, 0x00, 0x02, 0x8a, 0x00, 0x43, 0x13, 0xdf, 0x07, 0xa0, 0xfc, 0x02,
+ 0x80, 0x00, 0xc8, 0x04, 0xfc, 0x04, 0x98, 0x20, 0x09, 0x84, 0x09, 0x1d,
+ 0x13, 0x0a, 0xc8, 0x20, 0x09, 0x1a, 0xfc, 0x00, 0xc8, 0x0a, 0x09, 0x1a,
+ 0x05, 0xa0, 0x09, 0x1c, 0xc2, 0x8c, 0x16, 0xe5, 0x04, 0x5b, 0xc0, 0x41,
+ 0x13, 0x10, 0xa2, 0x8a, 0xca, 0x82, 0x0c, 0x32, 0x09, 0x1a, 0xc8, 0x02,
+ 0x01, 0x6c, 0xc8, 0x0a, 0xfc, 0x00, 0xc0, 0x8a, 0x98, 0x20, 0x01, 0x83,
+ 0xe2, 0x00, 0x13, 0x09, 0xc2, 0x8c, 0x16, 0xd3, 0x04, 0x5b, 0xc0, 0x4a,
+ 0xc0, 0x8a, 0x98, 0x20, 0x01, 0x83, 0xe2, 0x00, 0x16, 0x1b, 0x01, 0xe0,
+ 0x01, 0x9c, 0x00, 0x40, 0x07, 0xa0, 0x09, 0x64, 0x70, 0x00, 0x01, 0x60,
+ 0x01, 0x9c, 0x00, 0x40, 0x13, 0x07, 0x06, 0x20, 0x09, 0x64, 0x16, 0xf9,
+ 0x02, 0x0a, 0x01, 0x00, 0x04, 0x60, 0xb3, 0x8a, 0x01, 0x60, 0x0c, 0x02,
+ 0x01, 0x00, 0x13, 0xe2, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83, 0x07, 0xa0,
+ 0x0c, 0x02, 0x80, 0x00, 0xc8, 0x0a, 0x01, 0x8a, 0xc8, 0x0a, 0x09, 0x18,
+ 0x10, 0xd7, 0x04, 0xd8, 0xc2, 0x57, 0x16, 0x03, 0xcd, 0xc8, 0xc5, 0xc8,
+ 0x04, 0x5b, 0x05, 0xc7, 0xc2, 0x57, 0xc6, 0x48, 0xc5, 0xc8, 0x04, 0x5b,
+ 0xc8, 0x08, 0x01, 0x6c, 0xa2, 0x08, 0xca, 0x20, 0xfc, 0x00, 0x0c, 0x32,
+ 0x09, 0x18, 0x10, 0x02, 0xc8, 0x08, 0x01, 0x6c, 0x04, 0xe0, 0xfc, 0x00,
+ 0xc2, 0x57, 0x16, 0x03, 0xcd, 0xc8, 0xc5, 0xc8, 0x04, 0x5b, 0x05, 0xc7,
+ 0xc8, 0x17, 0x01, 0x6c, 0xc8, 0x08, 0xfc, 0x00, 0xc5, 0xc8, 0x04, 0x5b,
+ 0xc6, 0x17, 0x16, 0x02, 0xc9, 0xc8, 0x00, 0x02, 0xc5, 0xc8, 0x04, 0x5b,
+ 0xc2, 0x17, 0xc8, 0x08, 0x01, 0x6c, 0x13, 0x07, 0xc5, 0xe0, 0xfc, 0x00,
+ 0xa2, 0x08, 0xc8, 0x28, 0x0c, 0x32, 0xfc, 0x00, 0x09, 0x18, 0x04, 0x5b,
+ 0x01, 0x60, 0x01, 0x82, 0x20, 0x00, 0x16, 0x0a, 0xc2, 0x60, 0x01, 0x84,
+ 0x01, 0xa0, 0x01, 0x82, 0x20, 0x00, 0x01, 0xe0, 0x01, 0x82, 0x20, 0x00,
+ 0xc8, 0x09, 0x01, 0x84, 0x04, 0xc9, 0x04, 0x5b, 0x06, 0xa0, 0xc5, 0x1c,
+ 0x04, 0xd3, 0x04, 0xe0, 0x01, 0x02, 0xe8, 0x20, 0xe0, 0x14, 0x01, 0x00,
+ 0xc8, 0x20, 0xe0, 0x16, 0x01, 0x04, 0x2c, 0x05, 0x48, 0x20, 0xe0, 0x14,
+ 0x01, 0x00, 0x07, 0x8c, 0x0a, 0x00, 0x07, 0x8d, 0x07, 0xd8, 0x07, 0x8e,
+ 0x00, 0x18, 0xcf, 0x7c, 0x06, 0x4e, 0x16, 0xfd, 0x02, 0xe0, 0x07, 0xd8,
+ 0x07, 0x8f, 0xff, 0x11, 0x02, 0x8b, 0x59, 0x3b, 0x16, 0x21, 0x02, 0x8a,
+ 0x59, 0x3b, 0x13, 0x1e, 0x05, 0x8f, 0x20, 0x20, 0xe0, 0x16, 0x16, 0x01,
+ 0x10, 0x19, 0x20, 0x20, 0xe0, 0x04, 0x16, 0x16, 0x01, 0x00, 0x00, 0xbf,
+ 0x16, 0x13, 0x07, 0x8b, 0x40, 0xc0, 0x01, 0x00, 0x60, 0x00, 0x13, 0x10,
+ 0x01, 0x40, 0x60, 0x00, 0x16, 0x0b, 0x07, 0x8b, 0x44, 0xc4, 0xc3, 0xa0,
+ 0x01, 0x02, 0x48, 0x0e, 0x01, 0x02, 0x01, 0x4e, 0x10, 0x00, 0x16, 0x04,
+ 0x07, 0x8f, 0xff, 0x18, 0x04, 0x60, 0xc4, 0xf2, 0xc3, 0x0b, 0xc3, 0x4b,
+ 0x20, 0x20, 0xe0, 0x0a, 0x16, 0x02, 0x02, 0x6b, 0x20, 0x20, 0x20, 0x20,
+ 0xe0, 0x0c, 0x16, 0x02, 0x02, 0x6c, 0x20, 0x00, 0x20, 0x20, 0xe0, 0x0e,
+ 0x16, 0x02, 0x02, 0x6c, 0x00, 0x20, 0x05, 0x8f, 0x20, 0x20, 0xe0, 0x10,
+ 0x16, 0x07, 0x02, 0x6d, 0x00, 0x20, 0x21, 0x20, 0xe0, 0x22, 0x13, 0xe4,
+ 0xc1, 0x04, 0x16, 0x02, 0x07, 0x84, 0x7f, 0xfe, 0x05, 0x8f, 0x20, 0x20,
+ 0xe0, 0x12, 0x16, 0x02, 0x02, 0x6d, 0x20, 0x00, 0x21, 0x60, 0xe0, 0x22,
+ 0x13, 0xd7, 0xc1, 0x45, 0x16, 0x02, 0x07, 0x85, 0x7f, 0xfe, 0x05, 0x8f,
+ 0xd1, 0x86, 0x13, 0x0b, 0x25, 0xa0, 0xe0, 0x26, 0x13, 0x08, 0x05, 0x8f,
+ 0x26, 0x20, 0xe0, 0x22, 0x16, 0x04, 0x05, 0x8f, 0x26, 0xa0, 0xe0, 0x22,
+ 0x13, 0x02, 0x04, 0x60, 0xc4, 0xf2, 0xd8, 0x01, 0x08, 0xec, 0xd8, 0x20,
+ 0x07, 0xdb, 0x09, 0x00, 0xd8, 0x02, 0x08, 0xf6, 0xd8, 0x20, 0x07, 0xdd,
+ 0x08, 0xe2, 0x02, 0xe0, 0x07, 0x58, 0xd8, 0x20, 0x07, 0xef, 0x07, 0xf4,
+ 0xd8, 0x20, 0x07, 0xf1, 0x07, 0xf6, 0xd8, 0x20, 0x07, 0xf3, 0x07, 0xf8,
+ 0x02, 0x09, 0x00, 0x06, 0x04, 0xcb, 0x02, 0x0f, 0x07, 0xee, 0x05, 0x8f,
+ 0xdf, 0xcb, 0x06, 0x09, 0x16, 0xfc, 0x06, 0xa0, 0xc5, 0x1c, 0x07, 0x89,
+ 0xe3, 0x5c, 0x04, 0xe0, 0x01, 0x1a, 0xc8, 0x20, 0x07, 0xe4, 0x01, 0x18,
+ 0xc8, 0x19, 0x01, 0x0c, 0xc8, 0x39, 0x01, 0x0a, 0xc8, 0x39, 0x01, 0x12,
+ 0x16, 0x09, 0xc3, 0x79, 0x02, 0x0f, 0xe0, 0x00, 0x63, 0x4f, 0x02, 0x2d,
+ 0xa0, 0x00, 0xc8, 0x0d, 0x01, 0x14, 0x10, 0x02, 0xc8, 0x39, 0x01, 0x14,
+ 0xc3, 0xf9, 0xc8, 0x3f, 0x01, 0x0e, 0xc8, 0x1f, 0x01, 0x10, 0x04, 0xe0,
+ 0x09, 0x14, 0xc2, 0xb9, 0xc8, 0x1a, 0x01, 0x00, 0x06, 0x96, 0x02, 0x89,
+ 0xe3, 0x84, 0x16, 0xe0, 0x07, 0x8f, 0xff, 0x1c, 0x07, 0x8c, 0x0a, 0x00,
+ 0x07, 0x8d, 0xe3, 0x84, 0x07, 0x8e, 0x00, 0x10, 0x8f, 0x7c, 0x16, 0x44,
+ 0x06, 0x4e, 0x16, 0xfc, 0xc3, 0xa0, 0x07, 0xe2, 0xc3, 0xe0, 0x07, 0xe0,
+ 0x83, 0xce, 0x14, 0x01, 0xc3, 0xce, 0xc8, 0x0f, 0x01, 0x1a, 0x07, 0x8c,
+ 0xe3, 0x94, 0x07, 0x8d, 0x0a, 0x00, 0x07, 0x8e, 0xe3, 0xa4, 0x63, 0x8c,
+ 0xcf, 0x7c, 0x06, 0x4e, 0x16, 0xfd, 0x04, 0xe0, 0x09, 0x30, 0x01, 0x20,
+ 0x01, 0x42, 0x04, 0x00, 0x16, 0x02, 0x07, 0x20, 0x09, 0x30, 0xc2, 0x60,
+ 0x01, 0x62, 0x04, 0xe0, 0x01, 0x62, 0x07, 0x8e, 0x80, 0x00, 0x07, 0x8c,
+ 0x09, 0x34, 0x07, 0x8d, 0x00, 0x06, 0xdf, 0x3e, 0x05, 0x8e, 0x06, 0x0d,
+ 0x16, 0xfc, 0xd3, 0xfe, 0x06, 0xcf, 0x05, 0x8e, 0xd3, 0xfe, 0x06, 0xcf,
+ 0x07, 0x8c, 0x09, 0x34, 0xc8, 0x09, 0x01, 0x62, 0x04, 0xc9, 0xa3, 0x5c,
+ 0xe2, 0x7c, 0xa3, 0x5c, 0xe2, 0x7c, 0xa3, 0x5c, 0xe2, 0x7c, 0x13, 0x02,
+ 0x83, 0xcd, 0x13, 0x09, 0x07, 0x20, 0x09, 0x34, 0x10, 0x06, 0x07, 0x8f,
+ 0xff, 0x19, 0xa3, 0xcd, 0xc8, 0x0f, 0x01, 0x04, 0x10, 0xff, 0x01, 0xa0,
+ 0x01, 0x02, 0x10, 0x00, 0xc3, 0xe0, 0x07, 0xee, 0x43, 0xe0, 0xe0, 0x06,
+ 0xc8, 0x0f, 0x01, 0x00, 0xc0, 0x20, 0xe0, 0x04, 0x04, 0xe0, 0x06, 0xfe,
+ 0x04, 0xd3, 0x04, 0xe0, 0x01, 0x04, 0x04, 0x60, 0xc5, 0x6a, 0x07, 0x8c,
+ 0x0a, 0x00, 0x07, 0x8d, 0x00, 0x18, 0x07, 0x8e, 0x59, 0x3b, 0xcf, 0x0e,
+ 0x06, 0x4d, 0x16, 0xfd, 0x04, 0x5b, 0x01, 0x93, 0x80, 0x00, 0x04, 0x20,
+ 0xe2, 0xc0, 0xd0, 0x60, 0x07, 0x98, 0x13, 0x1c, 0x03, 0x00, 0x00, 0x02,
+ 0xc0, 0xa0, 0x07, 0x46, 0xc8, 0x12, 0x07, 0x46, 0x16, 0x02, 0x01, 0x93,
+ 0x00, 0x20, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x20, 0xe2, 0xe8, 0x01, 0x93,
+ 0x20, 0x00, 0x01, 0x80, 0x40, 0x00, 0x01, 0x00, 0x00, 0xfe, 0x16, 0x49,
+ 0xc3, 0xc4, 0x16, 0x25, 0xc3, 0xd3, 0x43, 0xc5, 0x16, 0x0c, 0xc3, 0xe0,
+ 0x07, 0x98, 0x11, 0x03, 0x02, 0xe0, 0x07, 0x98, 0x04, 0x51, 0xc3, 0xe0,
+ 0x07, 0x78, 0x11, 0x0a, 0x02, 0xe0, 0x07, 0x78, 0x04, 0x51, 0x11, 0xd3,
+ 0x01, 0x4f, 0x20, 0x00, 0x13, 0xe4, 0x01, 0x4f, 0x00, 0x20, 0x13, 0xd1,
+ 0x2c, 0x05, 0xa0, 0x41, 0x04, 0x21, 0xe2, 0xc0, 0x07, 0x8b, 0xc5, 0x6a,
+ 0x01, 0x00, 0x40, 0x00, 0x13, 0x0f, 0xc3, 0xdd, 0x02, 0x4f, 0x00, 0x0f,
+ 0xe1, 0x2f, 0xe0, 0x14, 0x04, 0x5b, 0xc3, 0xe4, 0xe1, 0xc0, 0x73, 0xcf,
+ 0x41, 0x2f, 0xe0, 0x14, 0xc3, 0x6f, 0xea, 0x8c, 0x07, 0x8b, 0xc5, 0x6a,
+ 0xc2, 0x4b, 0xc2, 0xa0, 0x07, 0xf4, 0x07, 0x8c, 0x00, 0x08, 0xc0, 0xbd,
+ 0xc3, 0xa0, 0x07, 0xea, 0xc3, 0xe0, 0x07, 0xec, 0x06, 0xa0, 0xc7, 0x5e,
+ 0x01, 0xc0, 0x40, 0x00, 0xd8, 0x02, 0x01, 0x17, 0x02, 0x62, 0xff, 0x80,
+ 0x06, 0xa0, 0xc7, 0xb2, 0xc8, 0x02, 0x01, 0x04, 0x03, 0x90, 0x60, 0x3f,
+ 0x04, 0x59, 0xc3, 0xc0, 0x73, 0xcf, 0xc3, 0xef, 0xe1, 0xc0, 0x73, 0xcf,
+ 0xc3, 0xaf, 0xea, 0x7e, 0xc3, 0x9e, 0x02, 0x4e, 0x00, 0x0f, 0x21, 0x2e,
+ 0xe0, 0x14, 0x13, 0x08, 0x40, 0x2f, 0xe0, 0x14, 0xa3, 0xcf, 0x04, 0x2f,
+ 0xe2, 0xf0, 0x01, 0x40, 0x40, 0x00, 0x13, 0xa4, 0xc3, 0xc4, 0x16, 0xc7,
+ 0x01, 0x00, 0x00, 0xfe, 0x16, 0xe6, 0x10, 0x9e, 0x01, 0x40, 0x40, 0x00,
+ 0x16, 0x05, 0xe0, 0x20, 0xe0, 0x14, 0x02, 0x65, 0x58, 0x00, 0x10, 0x96,
+ 0xd8, 0x20, 0x07, 0xde, 0x01, 0x17, 0x07, 0x8f, 0xff, 0x86, 0xc8, 0x0f,
+ 0x01, 0x04, 0x01, 0xc0, 0x40, 0x00, 0x02, 0x45, 0xa7, 0xff, 0x10, 0x8a,
+ 0xc3, 0x20, 0x06, 0xfe, 0x27, 0x20, 0xe3, 0x38, 0x13, 0x07, 0x23, 0x20,
+ 0xe0, 0x22, 0x13, 0x1a, 0x02, 0x65, 0xdf, 0xff, 0x40, 0x20, 0xe0, 0x14,
+ 0xe0, 0x20, 0xe0, 0x16, 0xc8, 0x0c, 0x08, 0xe6, 0x07, 0x8d, 0x08, 0xe2,
+ 0x04, 0x58, 0x48, 0x20, 0xe0, 0x08, 0x06, 0xfe, 0xc3, 0x20, 0x08, 0xe6,
+ 0x27, 0x20, 0xe3, 0x38, 0x16, 0x19, 0x03, 0x80, 0xc3, 0x02, 0xc2, 0x6c,
+ 0x00, 0x0a, 0x06, 0x99, 0x04, 0x60, 0xc5, 0x6a, 0xc2, 0xa0, 0x07, 0xf4,
+ 0x07, 0x8c, 0x00, 0x01, 0x07, 0x8d, 0x06, 0x06, 0x04, 0xce, 0xc3, 0xe0,
+ 0x06, 0x08, 0x13, 0x01, 0x06, 0x97, 0xd8, 0x20, 0x06, 0x07, 0x01, 0x17,
+ 0x07, 0x8b, 0xff, 0x82, 0xc8, 0x0b, 0x01, 0x04, 0x06, 0xa0, 0xcb, 0xe4,
+ 0x04, 0x60, 0xc5, 0x6a, 0xc2, 0xa0, 0x07, 0xee, 0x07, 0x8c, 0x00, 0x06,
+ 0x07, 0x8d, 0x08, 0xee, 0xc3, 0xa0, 0x07, 0xe6, 0xc3, 0xe0, 0x07, 0xe8,
+ 0x06, 0x97, 0xc2, 0xa0, 0x07, 0xf4, 0x07, 0x8d, 0x08, 0xf4, 0x04, 0xdd,
+ 0x07, 0x8c, 0x00, 0x02, 0x06, 0x97, 0x07, 0x8d, 0x80, 0x00, 0xc2, 0xa0,
+ 0x08, 0xee, 0x88, 0x0a, 0x06, 0x0c, 0x1b, 0x14, 0x07, 0x82, 0xc7, 0x2e,
+ 0xc3, 0xa0, 0x08, 0xf0, 0xc3, 0xe0, 0x08, 0xf2, 0x07, 0x8b, 0xe3, 0x0c,
+ 0x02, 0x8a, 0x00, 0x14, 0x1a, 0x04, 0x07, 0x8b, 0xea, 0x7a, 0x02, 0x2a,
+ 0xff, 0xec, 0xa2, 0x8a, 0xa2, 0xca, 0xc2, 0xdb, 0x13, 0x01, 0x06, 0x9b,
+ 0xc8, 0x20, 0x08, 0xee, 0x08, 0xf2, 0xc8, 0x20, 0xe0, 0x20, 0x08, 0xee,
+ 0xc8, 0x0d, 0x08, 0xf0, 0x07, 0x8d, 0x08, 0xec, 0xe0, 0x20, 0xe0, 0x18,
+ 0x02, 0x65, 0x58, 0x00, 0x04, 0x58, 0x02, 0x45, 0xa7, 0xff, 0x03, 0x80,
+ 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02,
+ 0x00, 0x06, 0x16, 0x07, 0x88, 0x01, 0x05, 0xee, 0x16, 0xf9, 0x10, 0x39,
+ 0xd0, 0x60, 0x01, 0x03, 0x13, 0xf1, 0x02, 0x01, 0x01, 0x0a, 0xcc, 0x4c,
+ 0xcc, 0x4c, 0xcc, 0x4e, 0xcc, 0x4f, 0x07, 0xb1, 0x00, 0x40, 0xcc, 0x4d,
+ 0xc8, 0x0a, 0x01, 0x00, 0x04, 0x5b, 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21,
+ 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06, 0x16, 0x07, 0x88, 0x01,
+ 0x05, 0xee, 0x16, 0xf9, 0x10, 0x1e, 0xd0, 0x60, 0x01, 0x03, 0x13, 0xf1,
+ 0x02, 0x01, 0x01, 0x0a, 0xcc, 0x4c, 0xcc, 0x4c, 0xcc, 0x4e, 0xcc, 0x4f,
+ 0x07, 0xb1, 0x00, 0x40, 0xcc, 0x4d, 0xc8, 0x0a, 0x01, 0x00, 0x03, 0xa0,
+ 0xd0, 0x60, 0x01, 0x03, 0x13, 0x01, 0x04, 0x5b, 0xc0, 0x60, 0x05, 0xee,
+ 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06, 0x16, 0xf7,
+ 0x88, 0x01, 0x05, 0xee, 0x16, 0xf9, 0x04, 0xcd, 0x07, 0x8a, 0x40, 0x00,
+ 0xc3, 0x20, 0x01, 0x00, 0x01, 0x0c, 0x80, 0x00, 0x13, 0x02, 0x07, 0x8a,
+ 0x20, 0x00, 0xc3, 0xa0, 0x01, 0x0e, 0xc3, 0xe0, 0x01, 0x10, 0x03, 0xb0,
+ 0xc3, 0x20, 0x07, 0x58, 0x23, 0x20, 0xe0, 0x04, 0x13, 0x02, 0x04, 0x60,
+ 0xc4, 0xec, 0x04, 0x60, 0xb3, 0x8a, 0x07, 0x8d, 0x20, 0x00, 0x20, 0x20,
+ 0xe0, 0x0a, 0x16, 0x01, 0x04, 0x5b, 0x02, 0x0d, 0x0c, 0x32, 0xc2, 0x5d,
+ 0x11, 0x01, 0x04, 0xdd, 0x05, 0xcd, 0x88, 0x0d, 0x0c, 0x30, 0x16, 0xf9,
+ 0xc2, 0x60, 0x06, 0x0a, 0x07, 0x8d, 0x09, 0x6a, 0x06, 0xa0, 0xcc, 0x24,
+ 0x02, 0x09, 0x00, 0x6e, 0xc3, 0xe0, 0x09, 0x30, 0x16, 0x03, 0x01, 0xe0,
+ 0x09, 0x6a, 0x00, 0x10, 0xc2, 0xe0, 0x09, 0x6a, 0x02, 0x0f, 0x01, 0x00,
+ 0x26, 0xc9, 0x13, 0x02, 0x04, 0x60, 0xca, 0xb6, 0x02, 0x09, 0x12, 0x00,
+ 0x01, 0x4b, 0x00, 0x10, 0x13, 0x02, 0x02, 0x09, 0x13, 0x00, 0xd8, 0x09,
+ 0x09, 0x2e, 0x07, 0x8f, 0x40, 0x00, 0x07, 0x89, 0x09, 0x6c, 0x04, 0xcb,
+ 0xe2, 0xf9, 0xe2, 0xf9, 0xe2, 0xf9, 0x16, 0x07, 0x07, 0x8b, 0x09, 0x34,
+ 0x07, 0x8c, 0x09, 0x6c, 0xcf, 0x3b, 0xcf, 0x3b, 0xc7, 0x1b, 0xc3, 0x20,
+ 0x09, 0x6c, 0x11, 0x19, 0x07, 0x8f, 0x20, 0x00, 0x07, 0x89, 0x09, 0x7a,
+ 0x06, 0xa0, 0xc8, 0x98, 0x06, 0xa0, 0xc8, 0x98, 0x10, 0x12, 0xce, 0x4c,
+ 0x04, 0x5b, 0xc3, 0x19, 0x16, 0x02, 0x07, 0x8c, 0x00, 0x1a, 0xc3, 0x4c,
+ 0x02, 0x2d, 0xff, 0xf8, 0x02, 0x0a, 0x00, 0x09, 0x02, 0x2d, 0xff, 0xfa,
+ 0x13, 0xf2, 0x06, 0x0a, 0x16, 0xfb, 0x04, 0x60, 0xca, 0xb6, 0x07, 0x8f,
+ 0x10, 0x00, 0xc2, 0xd9, 0x11, 0xfa, 0x16, 0x02, 0x07, 0x8b, 0x04, 0x00,
+ 0xc3, 0x4b, 0x02, 0x8d, 0x00, 0x20, 0x14, 0x02, 0x02, 0x0d, 0x00, 0x20,
+ 0x02, 0x8d, 0x04, 0x00, 0x12, 0x02, 0x02, 0x0d, 0x04, 0x00, 0x02, 0x2d,
+ 0xff, 0xf8, 0xc8, 0x0d, 0x09, 0x2c, 0x02, 0x2b, 0x03, 0xff, 0x01, 0x8b,
+ 0x03, 0xff, 0xce, 0x4b, 0x04, 0xcb, 0x04, 0xe0, 0x05, 0xf8, 0x04, 0xe0,
+ 0x09, 0x66, 0xc8, 0x20, 0x0c, 0x30, 0x09, 0x80, 0x07, 0xa0, 0x09, 0x82,
+ 0xdf, 0xfe, 0x07, 0x8d, 0xdf, 0xfe, 0xc3, 0xe0, 0x07, 0xd8, 0x23, 0xe0,
+ 0xe0, 0x16, 0x16, 0x24, 0xc3, 0xe0, 0x0c, 0x30, 0x63, 0x4f, 0x04, 0xff,
+ 0x04, 0xff, 0x06, 0x4d, 0x16, 0xfd, 0x07, 0x8d, 0xdf, 0xfe, 0x04, 0x20,
+ 0xea, 0x62, 0xc3, 0xa0, 0xea, 0x62, 0xc3, 0xee, 0x00, 0x12, 0x16, 0xc1,
+ 0xc3, 0x6e, 0x00, 0x18, 0x09, 0xad, 0x07, 0x8c, 0xe0, 0x00, 0x09, 0xac,
+ 0x63, 0x0d, 0x13, 0x0c, 0xc3, 0x6e, 0x00, 0x18, 0x09, 0xad, 0x02, 0x2d,
+ 0x00, 0x40, 0x0a, 0x1d, 0x02, 0x2d, 0x0c, 0x32, 0x07, 0xbd, 0x7f, 0xff,
+ 0x06, 0x0c, 0x16, 0xfc, 0xc3, 0x20, 0x04, 0x46, 0x02, 0x8c, 0x00, 0x80,
+ 0x1a, 0x13, 0x02, 0xac, 0xc8, 0x0c, 0x00, 0x9a, 0x02, 0xe0, 0x00, 0x80,
+ 0x07, 0x88, 0x00, 0x80, 0xc2, 0x60, 0x04, 0x46, 0x06, 0xa0, 0xf4, 0xd2,
+ 0x10, 0x02, 0x00, 0x9d, 0x10, 0x05, 0x00, 0x9d, 0x07, 0x8f, 0x08, 0x00,
+ 0x04, 0x60, 0xca, 0xb6, 0x2d, 0x4b, 0xc3, 0x81, 0x05, 0xc9, 0x07, 0x8f,
+ 0x10, 0x00, 0x02, 0x8e, 0x00, 0x02, 0x11, 0xf6, 0x07, 0x8f, 0x04, 0x00,
+ 0x05, 0xc9, 0xc2, 0xd9, 0x26, 0xe0, 0xe0, 0x26, 0x16, 0x02, 0x02, 0x2b,
+ 0x00, 0x06, 0xc6, 0x4b, 0xc3, 0x4b, 0x72, 0xcb, 0x02, 0x2e, 0xff, 0xfe,
+ 0x83, 0x8b, 0x1b, 0xe6, 0x06, 0xcd, 0x73, 0x4d, 0x82, 0xcd, 0x1b, 0xe2,
+ 0x04, 0xe0, 0x09, 0x1a, 0x04, 0xe0, 0x09, 0x1c, 0xc3, 0x4d, 0x13, 0x02,
+ 0x66, 0x60, 0xe0, 0x12, 0x05, 0xc9, 0x04, 0xcf, 0x2d, 0x81, 0xc8, 0x01,
+ 0x01, 0x6c, 0x13, 0xd4, 0xc8, 0x0f, 0xfc, 0x00, 0xc3, 0xc1, 0x06, 0x0d,
+ 0x15, 0xf7, 0x02, 0x0d, 0x07, 0x36, 0x02, 0x0e, 0x08, 0x98, 0x02, 0x0c,
+ 0x00, 0x03, 0xcb, 0x8d, 0x00, 0x02, 0x2d, 0x81, 0xcb, 0x81, 0x00, 0x06,
+ 0x13, 0xc3, 0x04, 0xee, 0x00, 0x0c, 0x02, 0x2e, 0x00, 0x18, 0x06, 0x0c,
+ 0x16, 0xf4, 0x04, 0xe0, 0x08, 0x96, 0x2e, 0x1f, 0xc3, 0xb9, 0xc3, 0xd9,
+ 0x07, 0x89, 0x00, 0x12, 0x07, 0x8d, 0x09, 0x3a, 0x06, 0xa0, 0xcc, 0x24,
+ 0xc3, 0x60, 0x07, 0xd8, 0x23, 0x60, 0xe0, 0x16, 0x16, 0x09, 0xe8, 0x20,
+ 0xe0, 0x10, 0x09, 0x6a, 0xe8, 0x20, 0xe0, 0x18, 0x07, 0x98, 0xe8, 0x20,
+ 0xe0, 0x12, 0x07, 0x78, 0xc3, 0x60, 0x09, 0x6a, 0x23, 0x60, 0xe0, 0x1e,
+ 0x16, 0x03, 0x48, 0x20, 0xe3, 0xa4, 0x09, 0x6a, 0x23, 0x60, 0xe0, 0x22,
+ 0x13, 0x06, 0x27, 0x60, 0xe3, 0xa6, 0x13, 0x03, 0xe8, 0x20, 0xe0, 0x10,
+ 0x09, 0x6a, 0x2d, 0x20, 0x00, 0x00, 0x07, 0x8e, 0x00, 0x00, 0x06, 0xa0,
+ 0xcc, 0x04, 0x05, 0x4e, 0x2c, 0x0e, 0xc0, 0xa0, 0x08, 0x04, 0xc3, 0xef,
+ 0x00, 0x06, 0x16, 0x1b, 0xc3, 0xa0, 0x09, 0x72, 0xc3, 0xe0, 0x09, 0x74,
+ 0x06, 0xa0, 0xca, 0xf2, 0xc3, 0xa0, 0x09, 0x76, 0xc3, 0xe0, 0x09, 0x78,
+ 0x06, 0xa0, 0xcb, 0x10, 0xe0, 0x20, 0xe0, 0x0a, 0xc3, 0x60, 0x07, 0xd8,
+ 0x23, 0x60, 0xe0, 0x16, 0x16, 0x05, 0x04, 0xe0, 0x06, 0x2e, 0x41, 0x60,
+ 0xe0, 0x04, 0x2e, 0x4d, 0x07, 0x8d, 0x80, 0x00, 0x04, 0x52, 0x73, 0xcf,
+ 0x02, 0x2f, 0x02, 0x00, 0xc3, 0x4f, 0x04, 0x52, 0x20, 0x20, 0xe0, 0x0a,
+ 0x13, 0x03, 0x07, 0x8d, 0x10, 0x00, 0x04, 0x5b, 0x40, 0x20, 0xe0, 0x0a,
+ 0x02, 0x40, 0xf0, 0xff, 0x07, 0x8e, 0x00, 0x02, 0x06, 0xa0, 0xcc, 0x04,
+ 0x05, 0x4e, 0x2c, 0x0e, 0xc0, 0xa0, 0x08, 0x04, 0x06, 0xa0, 0xcb, 0xe4,
+ 0xc3, 0x60, 0x07, 0xd8, 0x23, 0x60, 0xe0, 0x16, 0x16, 0x66, 0x04, 0x20,
+ 0xea, 0x76, 0x10, 0x63, 0x02, 0x6e, 0x80, 0x00, 0x07, 0x8d, 0xc0, 0x00,
+ 0xc8, 0x0d, 0x01, 0xa6, 0xc8, 0x0e, 0x09, 0x72, 0xc8, 0x0f, 0x09, 0x74,
+ 0xc8, 0x0e, 0x01, 0xa8, 0xc8, 0x0f, 0x01, 0xaa, 0x10, 0x12, 0x01, 0x8f,
+ 0x00, 0x01, 0x07, 0x8a, 0x09, 0x76, 0xe3, 0xa0, 0x09, 0x4e, 0xce, 0x8e,
+ 0x01, 0x9a, 0xff, 0xfe, 0xe3, 0xe0, 0x09, 0x50, 0xe6, 0x8f, 0x07, 0x8a,
+ 0x01, 0xac, 0xce, 0x8e, 0x01, 0x9a, 0xff, 0xfe, 0xe6, 0x8f, 0x20, 0x20,
+ 0xe0, 0x0a, 0x13, 0x3f, 0x07, 0x8d, 0x10, 0x00, 0x04, 0x5b, 0x20, 0x20,
+ 0xe0, 0x0a, 0x13, 0x03, 0x02, 0x0d, 0x10, 0x00, 0x04, 0x5b, 0xc3, 0x8e,
+ 0x13, 0x04, 0x01, 0xe0, 0x09, 0x50, 0x01, 0x00, 0x10, 0x06, 0x01, 0xa0,
+ 0x09, 0x50, 0x01, 0x00, 0x01, 0xa0, 0x09, 0x78, 0x01, 0x00, 0xc3, 0xa0,
+ 0x09, 0x76, 0xc3, 0xe0, 0x09, 0x78, 0xe3, 0xa0, 0x09, 0x4e, 0xe3, 0xe0,
+ 0x09, 0x50, 0xc8, 0x0e, 0x01, 0xac, 0xc8, 0x0f, 0x01, 0xae, 0xc8, 0x0e,
+ 0x09, 0x76, 0xc8, 0x0f, 0x09, 0x78, 0x10, 0x19, 0x02, 0x6e, 0x80, 0x00,
+ 0xc8, 0x0e, 0x01, 0xa6, 0x20, 0x20, 0xe0, 0x0a, 0x13, 0x12, 0x02, 0x0d,
+ 0x10, 0x00, 0x04, 0x5b, 0x07, 0x8d, 0x07, 0x28, 0x07, 0x89, 0x00, 0x0e,
+ 0x06, 0xa0, 0xcc, 0x2a, 0x07, 0x8d, 0x07, 0x28, 0x04, 0xfd, 0x02, 0x8d,
+ 0x07, 0x36, 0x16, 0xfc, 0x48, 0x20, 0xe0, 0x14, 0x06, 0xfe, 0x07, 0x8d,
+ 0x80, 0x00, 0x04, 0x52, 0xc2, 0xa0, 0x07, 0xee, 0x07, 0x8c, 0x00, 0x04,
+ 0x07, 0x8d, 0x08, 0xf0, 0x06, 0x97, 0xc2, 0x7d, 0xc3, 0x5d, 0x43, 0x60,
+ 0xe0, 0x22, 0x06, 0xa0, 0xcc, 0x2a, 0x10, 0xef, 0xc8, 0x0e, 0x06, 0x06,
+ 0xc8, 0x0f, 0x06, 0x08, 0x10, 0xea, 0x03, 0xb0, 0x01, 0xa0, 0x07, 0x60,
+ 0x00, 0x26, 0x02, 0x40, 0xc0, 0x00, 0x04, 0xe0, 0x06, 0x06, 0x07, 0x8c,
+ 0x40, 0x10, 0x44, 0xcc, 0x04, 0xe0, 0x06, 0xfe, 0x07, 0x85, 0x80, 0x40,
+ 0x04, 0x5b, 0xc8, 0x02, 0x08, 0x04, 0x07, 0x8f, 0x07, 0xfa, 0xcb, 0xce,
+ 0x00, 0x02, 0x07, 0x8e, 0x07, 0x36, 0xcb, 0xce, 0x00, 0x04, 0x07, 0x8d,
+ 0x06, 0x30, 0x07, 0x8e, 0x00, 0x10, 0x2c, 0x4d, 0x04, 0x5b, 0xc2, 0xa0,
+ 0x07, 0xf2, 0x10, 0x02, 0xc2, 0xa0, 0x07, 0xf8, 0xc8, 0x0b, 0x08, 0xea,
+ 0xc3, 0x09, 0x13, 0x0a, 0x06, 0xa0, 0xc7, 0x94, 0xc2, 0xa0, 0x01, 0x00,
+ 0xe2, 0xa0, 0xe0, 0x06, 0xa3, 0x4c, 0xa3, 0xcc, 0x17, 0x01, 0x05, 0x8e,
+ 0x62, 0x4c, 0xc2, 0xe0, 0x08, 0xea, 0x04, 0x5b, 0x07, 0x8d, 0x10, 0x00,
+ 0x20, 0x20, 0xe0, 0x0a, 0x13, 0x01, 0x04, 0x5b, 0x02, 0x0d, 0x00, 0x6e,
+ 0xc3, 0xe0, 0x09, 0x30, 0x16, 0x02, 0x01, 0xce, 0x00, 0x10, 0x27, 0x8d,
+ 0x13, 0x03, 0x02, 0x0d, 0x01, 0x00, 0x04, 0x52, 0x03, 0x00, 0x00, 0x02,
+ 0xc3, 0x60, 0x09, 0x6a, 0x02, 0x4d, 0x80, 0x08, 0x02, 0x4e, 0x7f, 0xf7,
+ 0xe3, 0x8d, 0xc3, 0xe0, 0x07, 0xd8, 0x23, 0xe0, 0xe0, 0x16, 0x13, 0x04,
+ 0x07, 0x8d, 0x00, 0x06, 0x27, 0x8d, 0x13, 0x02, 0xe3, 0xa0, 0xe0, 0x10,
+ 0xc8, 0x0e, 0x09, 0x6a, 0x02, 0x0d, 0x12, 0x00, 0x01, 0x4e, 0x00, 0x10,
+ 0x13, 0x02, 0x02, 0x0d, 0x13, 0x00, 0xd8, 0x0d, 0x09, 0x2e, 0xc3, 0x60,
+ 0x01, 0x80, 0x02, 0x4e, 0x00, 0x01, 0x02, 0x4d, 0xff, 0xfe, 0xe3, 0x4e,
+ 0xc8, 0x0d, 0x01, 0x80, 0xd8, 0x20, 0xe2, 0x40, 0x09, 0x2f, 0x01, 0x20,
+ 0x09, 0x6a, 0x00, 0x06, 0x13, 0x03, 0xd8, 0x20, 0xe1, 0xd0, 0x09, 0x2f,
+ 0x98, 0x20, 0x01, 0x83, 0xe2, 0x00, 0x13, 0x03, 0xd8, 0x20, 0x09, 0x2f,
+ 0x01, 0x83, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60, 0xcb, 0xb8, 0x20, 0x20,
+ 0xe0, 0x0a, 0x13, 0x03, 0x02, 0x0d, 0x10, 0x00, 0x04, 0x5b, 0x02, 0x09,
+ 0x00, 0x08, 0x02, 0x0d, 0x09, 0x58, 0x06, 0xa0, 0xcc, 0x24, 0x07, 0xa0,
+ 0x02, 0x02, 0x00, 0x00, 0x02, 0x0d, 0x04, 0x00, 0xc3, 0xe0, 0x09, 0x58,
+ 0x01, 0x0f, 0x7c, 0x00, 0x13, 0x01, 0x04, 0x52, 0xc3, 0x8f, 0x02, 0x4e,
+ 0x00, 0x0f, 0x13, 0xfb, 0x02, 0x8e, 0x00, 0x0f, 0x13, 0xf8, 0x02, 0x0d,
+ 0x40, 0x00, 0xc2, 0x4f, 0x09, 0x49, 0x02, 0x49, 0x00, 0x3f, 0x01, 0x09,
+ 0x00, 0x01, 0x16, 0xef, 0x02, 0x89, 0x00, 0x06, 0x1a, 0xec, 0x02, 0x89,
+ 0x00, 0x20, 0x14, 0xe9, 0x06, 0xc9, 0x09, 0x1f, 0x02, 0x4f, 0x40, 0x00,
+ 0xe2, 0x4f, 0x02, 0x69, 0x80, 0x00, 0xc8, 0x09, 0x09, 0x58, 0x02, 0x0f,
+ 0xff, 0xff, 0xc2, 0x4e, 0x09, 0x1f, 0x06, 0x09, 0x16, 0xfd, 0x05, 0x4f,
+ 0x02, 0x0d, 0x20, 0x00, 0xc2, 0x60, 0x09, 0x5a, 0x13, 0xd4, 0x26, 0x4f,
+ 0x16, 0xd2, 0x02, 0x0d, 0x10, 0x00, 0xc2, 0x60, 0x09, 0x5c, 0x13, 0xcd,
+ 0x26, 0x4f, 0x16, 0xcb, 0x02, 0x0d, 0x30, 0x00, 0x88, 0x20, 0x09, 0x5a,
+ 0x09, 0x5c, 0x13, 0xc5, 0xc3, 0xe0, 0x09, 0x5a, 0xc2, 0x4e, 0x0a, 0x1f,
+ 0x06, 0x09, 0x16, 0xfd, 0xe3, 0xe0, 0x09, 0x5e, 0xc8, 0x0f, 0x09, 0x5a,
+ 0xc3, 0xe0, 0x09, 0x5c, 0xc2, 0x4e, 0x0a, 0x1f, 0x06, 0x09, 0x16, 0xfd,
+ 0xe3, 0xe0, 0x09, 0x5e, 0xc8, 0x0f, 0x09, 0x5c, 0x02, 0x0f, 0xff, 0xff,
+ 0xc2, 0x4e, 0x0a, 0x1f, 0x06, 0x09, 0x16, 0xfd, 0x02, 0x0d, 0x08, 0x00,
+ 0xc2, 0x60, 0x09, 0x5e, 0x26, 0x4f, 0x16, 0xa5, 0x05, 0x4f, 0xc8, 0x0f,
+ 0x09, 0x5e, 0x02, 0x0f, 0x02, 0x02, 0x02, 0x0e, 0x00, 0x03, 0xc3, 0x60,
+ 0x01, 0x40, 0x02, 0x0c, 0xce, 0x26, 0x01, 0xa0, 0x01, 0x40, 0x04, 0x00,
+ 0x05, 0xcf, 0x02, 0x09, 0x55, 0x55, 0x06, 0x9c, 0x05, 0x49, 0x06, 0x9c,
+ 0x07, 0x09, 0x06, 0x9c, 0x05, 0x49, 0x06, 0x9c, 0x06, 0x0e, 0x16, 0xf4,
+ 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0xc8, 0x0d, 0x01, 0x40, 0x02, 0x09,
+ 0x00, 0x08, 0x02, 0x0e, 0x09, 0x58, 0x02, 0x0f, 0x02, 0x02, 0xcf, 0xfe,
+ 0x06, 0x49, 0x16, 0xfd, 0x04, 0x60, 0xcb, 0xb8, 0xc7, 0xc9, 0x82, 0x5f,
+ 0x16, 0x01, 0x04, 0x5b, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0xc8, 0x0d,
+ 0x01, 0x40, 0x02, 0x0d, 0x01, 0x00, 0x04, 0x52, 0x00, 0x00, 0xd8, 0xee,
+ 0x00, 0x92, 0xc2, 0xad, 0x00, 0x02, 0xc2, 0x6d, 0x00, 0x00, 0x16, 0x05,
+ 0x07, 0xaa, 0x00, 0x02, 0x07, 0x36, 0x2c, 0x9a, 0x03, 0x80, 0x2c, 0xea,
+ 0x00, 0x02, 0xcb, 0x41, 0x00, 0x00, 0x03, 0x80, 0xc3, 0x2d, 0x00, 0x18,
+ 0x07, 0xac, 0x00, 0x02, 0x07, 0x36, 0x4b, 0x20, 0xea, 0xa6, 0x00, 0x0a,
+ 0xeb, 0x20, 0xea, 0xa0, 0x00, 0x0a, 0x2e, 0x9c, 0x03, 0x80, 0xc2, 0xa0,
+ 0xe0, 0x22, 0x04, 0x60, 0xb3, 0x8a, 0xc0, 0xed, 0x00, 0x18, 0x06, 0xa0,
+ 0xd9, 0x5e, 0x03, 0x80, 0xc2, 0x44, 0xc0, 0xc3, 0x13, 0x02, 0x06, 0xa0,
+ 0xd9, 0x5e, 0xc3, 0x19, 0xcb, 0x09, 0x00, 0x18, 0x05, 0xc9, 0xcb, 0x19,
+ 0x00, 0x16, 0xc2, 0x4c, 0x02, 0x2c, 0x00, 0x1a, 0xcf, 0x0d, 0xcf, 0x0e,
+ 0xc7, 0x0f, 0x00, 0x99, 0x04, 0x5b, 0x07, 0x8c, 0x09, 0x0a, 0xc2, 0x9c,
+ 0x22, 0xa0, 0xe0, 0x14, 0x13, 0x06, 0xc2, 0xa0, 0x07, 0x58, 0x22, 0xa0,
+ 0xe0, 0x20, 0x16, 0x01, 0x03, 0x80, 0xc1, 0x03, 0x04, 0xc3, 0x07, 0x8a,
+ 0x00, 0x04, 0xa2, 0x84, 0x00, 0x00, 0xd9, 0x80, 0x00, 0x0b, 0xcf, 0x3a,
+ 0x00, 0x00, 0xd9, 0x8a, 0x00, 0xb2, 0x02, 0xe0, 0x07, 0x58, 0x07, 0x8d,
+ 0x09, 0x0a, 0xc8, 0x0b, 0x07, 0xc2, 0x06, 0xa0, 0xc5, 0xa2, 0xc2, 0xe0,
+ 0x07, 0xc2, 0xe0, 0x20, 0xe0, 0x20, 0x02, 0xe0, 0x07, 0xb8, 0x04, 0x5b,
+ 0xc3, 0x2d, 0x00, 0x18, 0xc2, 0x8c, 0xc2, 0x60, 0x01, 0x6c, 0xc8, 0x0a,
+ 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x00, 0x13, 0x02, 0xc2, 0x8b, 0x10, 0xf9,
+ 0xc8, 0x09, 0x01, 0x6c, 0x07, 0x8b, 0x05, 0xf8, 0xc2, 0x5b, 0x13, 0x0c,
+ 0x05, 0xcb, 0xc2, 0x5b, 0xc6, 0xca, 0xc2, 0xe0, 0x01, 0x6c, 0xc8, 0x09,
+ 0x01, 0x6c, 0xc8, 0x0c, 0xfc, 0x00, 0xc8, 0x0b, 0x01, 0x6c, 0x10, 0x02,
+ 0xce, 0xcc, 0xc6, 0xca, 0xc2, 0xa0, 0x00, 0xe0, 0x22, 0xa0, 0xe0, 0x1a,
+ 0x16, 0x06, 0xe8, 0x20, 0xe0, 0x04, 0x07, 0x3a, 0x48, 0x20, 0xe0, 0x1a,
+ 0x00, 0xe0, 0x03, 0x80, 0xd3, 0xe0, 0xe3, 0xab, 0xc1, 0xe0, 0x06, 0xa8,
+ 0x16, 0x05, 0x02, 0x07, 0x06, 0xa2, 0x06, 0xa0, 0xc2, 0x96, 0x16, 0x0b,
+ 0xc1, 0xe0, 0x06, 0xba, 0x16, 0x20, 0x02, 0x07, 0x06, 0xb4, 0x06, 0xa0,
+ 0xc2, 0x96, 0x13, 0x1b, 0x02, 0x07, 0x06, 0xb8, 0x10, 0x02, 0x02, 0x07,
+ 0x06, 0xa6, 0xc1, 0x60, 0xfc, 0x02, 0xc8, 0x25, 0x00, 0x0c, 0xfc, 0x02,
+ 0xc9, 0xc5, 0x00, 0x0c, 0x00, 0x00, 0xda, 0x3c, 0x00, 0x0b, 0xcd, 0xf5,
+ 0x00, 0x00, 0xda, 0x46, 0x19, 0x3a, 0xc5, 0xf5, 0x01, 0xb7, 0x00, 0x28,
+ 0x02, 0x27, 0xff, 0xf4, 0x07, 0xa7, 0x00, 0x04, 0xdb, 0x48, 0x2e, 0x97,
+ 0x10, 0xd5, 0x03, 0x00, 0x00, 0x02, 0x06, 0xa0, 0xc2, 0xae, 0x03, 0x00,
+ 0x00, 0x0f, 0x2c, 0x20, 0xed, 0x48, 0x93, 0xe0, 0xe3, 0xab, 0x16, 0x03,
+ 0x02, 0x81, 0x00, 0x16, 0x16, 0xc7, 0xc1, 0x21, 0xea, 0xb0, 0x04, 0x54,
+ 0x93, 0xe0, 0xe0, 0x10, 0x16, 0x03, 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0x0b,
+ 0xd3, 0xcf, 0x16, 0x09, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x06, 0x07, 0x84,
+ 0x00, 0x20, 0xe8, 0x04, 0x06, 0xd2, 0xd2, 0xa0, 0xe0, 0x0c, 0x04, 0x60,
+ 0xdb, 0xc0, 0x04, 0x60, 0xde, 0x34, 0x10, 0x7b, 0xc1, 0x22, 0x00, 0x04,
+ 0x04, 0xe2, 0x00, 0x02, 0x04, 0x54, 0xc8, 0x02, 0x01, 0x6c, 0xa0, 0x82,
+ 0xc8, 0x22, 0x0c, 0x32, 0xfc, 0x00, 0x02, 0x02, 0xfc, 0x00, 0x93, 0xe0,
+ 0xe3, 0xaa, 0x13, 0x70, 0x06, 0xa0, 0xdc, 0xc6, 0x48, 0xa0, 0xe0, 0x04,
+ 0x00, 0x0e, 0x02, 0x85, 0x00, 0x07, 0x13, 0x0e, 0x01, 0x0e, 0x00, 0x03,
+ 0x13, 0x0b, 0x23, 0xa0, 0xe0, 0x22, 0x16, 0x03, 0xd2, 0xa0, 0xe0, 0x0e,
+ 0x10, 0x02, 0xd2, 0xa0, 0xe3, 0xa8, 0x01, 0x8e, 0x00, 0x03, 0x10, 0x5a,
+ 0xc8, 0x05, 0x06, 0xfc, 0xc0, 0xc3, 0x16, 0x53, 0x43, 0xa0, 0xe0, 0x10,
+ 0x88, 0x22, 0x00, 0x0e, 0x09, 0x6c, 0x16, 0x0a, 0x88, 0x22, 0x00, 0x10,
+ 0x09, 0x6e, 0x16, 0x06, 0x88, 0x22, 0x00, 0x12, 0x09, 0x70, 0x16, 0x02,
+ 0xe3, 0xa0, 0xe0, 0x10, 0x02, 0x85, 0x00, 0x09, 0x13, 0x02, 0x06, 0xa0,
+ 0xe2, 0xe4, 0xa1, 0x45, 0xc1, 0x65, 0xe3, 0xac, 0x04, 0x55, 0xc0, 0x62,
+ 0x00, 0x04, 0xc8, 0x22, 0x00, 0x06, 0x01, 0x6c, 0x02, 0x82, 0x04, 0x48,
+ 0x1b, 0x02, 0x43, 0xa0, 0xe0, 0x0c, 0xc1, 0x22, 0x00, 0x0e, 0x04, 0x51,
+ 0xc0, 0x42, 0x04, 0xe1, 0x00, 0x02, 0xc0, 0xa2, 0x00, 0x0c, 0xc1, 0x22,
+ 0x00, 0x0a, 0x21, 0x20, 0xe0, 0x18, 0x13, 0x07, 0xc8, 0xa1, 0x00, 0x0a,
+ 0x00, 0x0a, 0xc8, 0xa1, 0x00, 0x08, 0x00, 0x08, 0x10, 0xe2, 0xc8, 0x22,
+ 0x00, 0x06, 0x01, 0x6c, 0x06, 0xa0, 0xe1, 0xa2, 0x04, 0x60, 0xdb, 0x9e,
+ 0xc8, 0x02, 0x06, 0xd4, 0xc1, 0x62, 0x00, 0x02, 0xc1, 0x65, 0xe3, 0xce,
+ 0x04, 0x55, 0x10, 0x0b, 0x07, 0x85, 0x03, 0xf4, 0x04, 0xf5, 0xcd, 0x60,
+ 0xed, 0x26, 0x06, 0xa0, 0xe3, 0xce, 0xe3, 0xa0, 0xe0, 0x0c, 0x2e, 0xa0,
+ 0x03, 0xf4, 0x04, 0x60, 0xda, 0x04, 0x06, 0xa0, 0xe0, 0x6e, 0x10, 0x0c,
+ 0x06, 0xa0, 0xe1, 0xa2, 0x10, 0x09, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x06,
+ 0x06, 0xa0, 0xe1, 0xa2, 0xc8, 0x03, 0x09, 0x2a, 0xd2, 0xa0, 0xe3, 0xaa,
+ 0x06, 0xa0, 0xdc, 0x32, 0x92, 0xa0, 0xe0, 0x26, 0x16, 0x0c, 0xd3, 0xe0,
+ 0xe0, 0x26, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x0a, 0xc1, 0x0a, 0x83, 0xc4,
+ 0x13, 0x07, 0xc3, 0xc4, 0xc1, 0x24, 0xe3, 0xd2, 0x04, 0x54, 0x93, 0xca,
+ 0x13, 0xdc, 0xd3, 0xca, 0x03, 0xb0, 0xd8, 0x0f, 0x06, 0x59, 0x71, 0x04,
+ 0xc1, 0x24, 0xe3, 0xde, 0x04, 0x54, 0x23, 0xa0, 0xe0, 0x0c, 0x13, 0xd1,
+ 0xc3, 0x4d, 0x13, 0xcf, 0x07, 0x86, 0x00, 0x02, 0x07, 0x84, 0x00, 0x26,
+ 0x23, 0x46, 0x13, 0x03, 0x06, 0x44, 0xa1, 0x86, 0x10, 0xfb, 0x43, 0x46,
+ 0x10, 0xb9, 0x07, 0x85, 0x07, 0x1c, 0x07, 0x86, 0x04, 0x1a, 0x6d, 0x76,
+ 0x6d, 0x76, 0x6d, 0x76, 0x05, 0xc6, 0x6d, 0x76, 0x6d, 0x76, 0x6d, 0x76,
+ 0x07, 0x83, 0x90, 0x00, 0x10, 0xbe, 0xc3, 0x0b, 0x07, 0x86, 0x01, 0x00,
+ 0x07, 0x85, 0x80, 0x00, 0xc1, 0x20, 0x06, 0xd2, 0x13, 0x37, 0x04, 0xc4,
+ 0xc0, 0x60, 0x06, 0xd2, 0x20, 0x45, 0x13, 0x04, 0x05, 0x84, 0x09, 0x15,
+ 0x16, 0xf9, 0x10, 0x2e, 0xd3, 0xcf, 0x16, 0x06, 0x23, 0xe0, 0xe0, 0x14,
+ 0x16, 0x03, 0x01, 0x0e, 0x00, 0x03, 0x13, 0x03, 0x04, 0xe0, 0x06, 0xd2,
+ 0x10, 0x23, 0xd0, 0x64, 0x07, 0x1c, 0xb0, 0x46, 0x18, 0x10, 0xd9, 0x01,
+ 0x07, 0x1c, 0x23, 0x60, 0xe0, 0x20, 0x13, 0x0b, 0x07, 0x81, 0x00, 0x18,
+ 0xc0, 0x61, 0xe3, 0xee, 0x88, 0x11, 0xed, 0x26, 0x13, 0x04, 0x02, 0x08,
+ 0x80, 0x18, 0x06, 0xa0, 0xe0, 0x22, 0xd0, 0x64, 0x07, 0x28, 0xb0, 0x46,
+ 0x18, 0x08, 0xd9, 0x01, 0x07, 0x28, 0xb0, 0x46, 0x17, 0x04, 0x07, 0x83,
+ 0x80, 0x40, 0x06, 0xa0, 0xe3, 0x56, 0x48, 0x05, 0x06, 0xd2, 0x16, 0xca,
+ 0xc1, 0x20, 0x09, 0x32, 0x16, 0x01, 0x04, 0x5c, 0x02, 0x04, 0x00, 0x07,
+ 0x06, 0x20, 0x09, 0x32, 0x02, 0x05, 0x01, 0x00, 0x10, 0xc7, 0xc3, 0x0b,
+ 0x04, 0xc5, 0xc0, 0x42, 0x04, 0xc7, 0xc2, 0x20, 0x01, 0x6c, 0xa1, 0xe1,
+ 0x00, 0x04, 0xc8, 0x11, 0x01, 0x6c, 0x16, 0xfb, 0xc8, 0x08, 0x01, 0x6c,
+ 0x04, 0xc8, 0x43, 0xa0, 0xe0, 0x1a, 0xc1, 0x22, 0x00, 0x0e, 0x15, 0x0d,
+ 0x13, 0x0c, 0xe3, 0xa0, 0xe0, 0x1a, 0x06, 0xa0, 0xe3, 0x40, 0xc2, 0x08,
+ 0x13, 0x48, 0x02, 0x88, 0x00, 0x12, 0x1b, 0x45, 0x22, 0x20, 0xe0, 0x22,
+ 0x13, 0x42, 0xc1, 0x02, 0xa1, 0x08, 0x05, 0x08, 0x02, 0x28, 0xff, 0xf2,
+ 0xa2, 0x07, 0x07, 0x83, 0x80, 0x01, 0x02, 0x88, 0x00, 0x04, 0x11, 0x6e,
+ 0xc2, 0x64, 0x00, 0x16, 0xd2, 0x49, 0x16, 0x02, 0x81, 0x02, 0x16, 0x31,
+ 0x01, 0x09, 0xf0, 0x00, 0x16, 0x28, 0xc1, 0x49, 0x71, 0x45, 0x04, 0xc3,
+ 0x02, 0x85, 0x00, 0x09, 0x13, 0x7c, 0x07, 0x83, 0x80, 0x02, 0xc1, 0xa4,
+ 0x00, 0x14, 0x81, 0x88, 0x16, 0x76, 0x05, 0x83, 0x02, 0x85, 0x00, 0x10,
+ 0x1b, 0x13, 0x05, 0x83, 0x99, 0x49, 0xea, 0xd0, 0x13, 0x0a, 0x98, 0x09,
+ 0xe0, 0x0e, 0x16, 0x6b, 0x98, 0x25, 0xea, 0xd0, 0xe0, 0x0c, 0x16, 0x67,
+ 0xc1, 0xe0, 0x06, 0xec, 0x16, 0x64, 0x04, 0xc3, 0xc2, 0x52, 0x13, 0x0f,
+ 0x07, 0x83, 0x80, 0x09, 0xc1, 0xe0, 0x09, 0x6a, 0x01, 0x47, 0x10, 0x00,
+ 0x16, 0x5a, 0xc0, 0xa0, 0x01, 0x6c, 0x06, 0xa0, 0xe1, 0xfa, 0x04, 0x60,
+ 0xdb, 0x9e, 0x04, 0x60, 0xdb, 0xa8, 0x07, 0x89, 0x07, 0x0e, 0x04, 0xc7,
+ 0xd1, 0xe5, 0xea, 0xe1, 0x13, 0x05, 0x06, 0xc7, 0x02, 0x27, 0xea, 0xf2,
+ 0xce, 0x77, 0x15, 0xfe, 0xc0, 0x44, 0x02, 0x21, 0x00, 0x18, 0x02, 0x28,
+ 0xff, 0xfc, 0x13, 0x36, 0xc1, 0x91, 0xd1, 0x86, 0x13, 0x1f, 0x06, 0xc6,
+ 0x07, 0x87, 0x07, 0x0e, 0xc0, 0xf7, 0x02, 0x46, 0xbf, 0xff, 0x02, 0x43,
+ 0x3f, 0xff, 0x91, 0xa0, 0xed, 0x4d, 0x16, 0x09, 0x03, 0xb0, 0x98, 0x20,
+ 0xe0, 0x0e, 0x06, 0x5d, 0x16, 0x0f, 0xc8, 0x21, 0x00, 0x02, 0x07, 0x0c,
+ 0x10, 0x17, 0x82, 0x47, 0x1b, 0x0c, 0x90, 0xc6, 0x16, 0xeb, 0x06, 0x47,
+ 0x04, 0xf7, 0x03, 0xb0, 0x98, 0x20, 0x06, 0x5d, 0x06, 0x57, 0x13, 0x0c,
+ 0x07, 0x83, 0x80, 0x05, 0x10, 0x1c, 0xc0, 0xd1, 0x20, 0xe0, 0xe0, 0x16,
+ 0x16, 0x03, 0x07, 0x83, 0x80, 0x08, 0x10, 0x15, 0x44, 0x60, 0xe0, 0x26,
+ 0x71, 0x86, 0xa0, 0x46, 0x62, 0x06, 0x07, 0x83, 0x80, 0x05, 0xc2, 0x08,
+ 0x15, 0xcb, 0x16, 0x0b, 0x04, 0xc3, 0x07, 0x87, 0x07, 0x0e, 0xc0, 0x77,
+ 0x82, 0x47, 0x1b, 0x05, 0x20, 0x60, 0xe0, 0x06, 0x16, 0xfa, 0x07, 0x83,
+ 0x80, 0x07, 0x04, 0x5c, 0x92, 0xa0, 0xe0, 0x0e, 0x16, 0x11, 0xc8, 0x20,
+ 0xe0, 0x20, 0x07, 0x08, 0x04, 0xe0, 0x01, 0x84, 0x05, 0x60, 0x07, 0x02,
+ 0x13, 0x3f, 0x48, 0x20, 0xe0, 0x06, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18,
+ 0x07, 0x83, 0xc0, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0xc8, 0x20, 0xe0, 0x1e,
+ 0x07, 0x02, 0xe3, 0xa0, 0xe0, 0x04, 0x02, 0x08, 0x80, 0x24, 0x06, 0xa0,
+ 0xe0, 0x22, 0x10, 0x36, 0xc1, 0x20, 0x01, 0x84, 0x02, 0x44, 0x88, 0x00,
+ 0x13, 0x1e, 0x48, 0x04, 0x01, 0x84, 0x06, 0x20, 0x07, 0x02, 0x16, 0xf1,
+ 0x23, 0xa0, 0xe0, 0x22, 0x16, 0x05, 0x43, 0xa0, 0xe0, 0x22, 0xd2, 0xa0,
+ 0xe0, 0x0e, 0x10, 0xd3, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x04, 0x98, 0x20,
+ 0xe3, 0xa9, 0x06, 0x65, 0x16, 0x06, 0x92, 0xa0, 0xe0, 0x0e, 0x13, 0xc9,
+ 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0xd7, 0x07, 0x83, 0x00, 0x02, 0x04, 0x60,
+ 0xdb, 0xb8, 0xe8, 0x20, 0xe0, 0x06, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18,
+ 0x07, 0x20, 0x07, 0x02, 0x43, 0xa0, 0xe0, 0x04, 0xc8, 0x20, 0xe4, 0x6e,
+ 0x01, 0x86, 0x88, 0x20, 0xe0, 0x20, 0x07, 0x08, 0x16, 0x03, 0xc8, 0x20,
+ 0xeb, 0x0a, 0x07, 0x08, 0x04, 0x60, 0xdb, 0xc0, 0x01, 0x0e, 0x00, 0x03,
+ 0x13, 0x16, 0xd3, 0xcf, 0x16, 0x08, 0x23, 0xa0, 0xe0, 0x20, 0x16, 0x03,
+ 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0x02, 0xd2, 0xa0, 0xe0, 0x0e, 0x01, 0x8e,
+ 0x00, 0x03, 0x10, 0x09, 0xc1, 0x60, 0x01, 0x84, 0x21, 0x60, 0xe0, 0x0a,
+ 0x16, 0x04, 0x07, 0x83, 0x84, 0x00, 0x04, 0x60, 0xdb, 0xb8, 0xc8, 0x20,
+ 0xe0, 0x2e, 0x01, 0x84, 0x02, 0x08, 0x80, 0x06, 0x06, 0xa0, 0xe0, 0x22,
+ 0x04, 0x60, 0xdb, 0xc0, 0xe3, 0x60, 0xe0, 0x20, 0x04, 0x60, 0xdb, 0xc0,
+ 0x93, 0xe0, 0xe0, 0x26, 0x16, 0x10, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x0d,
+ 0x23, 0xa0, 0xe0, 0x06, 0x13, 0x02, 0xe3, 0x60, 0xe0, 0x1c, 0xe3, 0x60,
+ 0xe0, 0x18, 0x43, 0xa0, 0xe0, 0x06, 0x02, 0x08, 0x80, 0x3c, 0x06, 0xa0,
+ 0xe0, 0x22, 0x04, 0x60, 0xdb, 0xc0, 0x92, 0xa0, 0xe3, 0xa8, 0x13, 0x03,
+ 0x92, 0xa0, 0xe3, 0xa9, 0x16, 0x1e, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x08,
+ 0x98, 0x20, 0xe3, 0xa9, 0x06, 0x65, 0x13, 0x04, 0x07, 0x83, 0x00, 0x07,
+ 0x04, 0x60, 0xdb, 0xb8, 0xd2, 0xa0, 0xe0, 0x0e, 0xc8, 0x20, 0xe0, 0x20,
+ 0x07, 0x08, 0x27, 0xa0, 0xe0, 0x04, 0x16, 0x0b, 0xc8, 0x20, 0xe0, 0x1e,
+ 0x07, 0x08, 0x93, 0xe0, 0xe3, 0xa8, 0x16, 0x05, 0x23, 0xa0, 0xe0, 0x12,
+ 0x13, 0x02, 0x06, 0x20, 0x07, 0x08, 0x04, 0x60, 0xdb, 0xc0, 0x23, 0xe0,
+ 0xe0, 0x14, 0x13, 0x36, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x0e, 0x06, 0x6f,
+ 0x16, 0x0f, 0xd3, 0xcf, 0x16, 0x2f, 0xd2, 0xa0, 0xe3, 0xa8, 0x04, 0x60,
+ 0xdb, 0xc0, 0x92, 0xa0, 0xe0, 0x0c, 0x16, 0x28, 0x23, 0xe0, 0xe0, 0x14,
+ 0x13, 0xf6, 0x07, 0x83, 0x00, 0x06, 0x10, 0x07, 0x07, 0x83, 0x00, 0x05,
+ 0x93, 0xe0, 0xe0, 0x0e, 0x16, 0x02, 0x07, 0x83, 0x00, 0x07, 0x04, 0x60,
+ 0xdb, 0xb8, 0xe3, 0x60, 0xe0, 0x12, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x0d,
+ 0x98, 0x20, 0xe0, 0x0c, 0x06, 0x65, 0x16, 0x03, 0xd8, 0x20, 0xe3, 0xa9,
+ 0x06, 0x65, 0x10, 0x0c, 0xc1, 0x20, 0x01, 0x84, 0x21, 0x20, 0xe0, 0x06,
+ 0x16, 0xd6, 0x48, 0x20, 0xe0, 0x06, 0x01, 0x84, 0x02, 0x08, 0x80, 0x30,
+ 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0xdb, 0xc0, 0x02, 0x04, 0x00, 0x64,
+ 0x06, 0x04, 0x16, 0xfe, 0x04, 0x5b, 0xe3, 0xa0, 0xe0, 0x0a, 0xc2, 0x08,
+ 0x11, 0x02, 0x43, 0xa0, 0xe0, 0x0a, 0x42, 0x20, 0xe0, 0x04, 0x02, 0x28,
+ 0xe3, 0xee, 0xc0, 0x58, 0xc0, 0x02, 0x88, 0x11, 0xed, 0x26, 0x16, 0x03,
+ 0x2c, 0xd1, 0xc0, 0x58, 0x04, 0xd1, 0xc0, 0x80, 0x01, 0x0e, 0x10, 0x00,
+ 0x13, 0x0f, 0xcc, 0x60, 0xed, 0x26, 0x05, 0xc8, 0xcc, 0x78, 0x16, 0x03,
+ 0x06, 0x41, 0xcc, 0x60, 0x06, 0xd6, 0xc4, 0x58, 0x16, 0x02, 0xc4, 0x60,
+ 0x07, 0x00, 0x02, 0x21, 0xff, 0xfa, 0x2c, 0x91, 0x04, 0x5b, 0xc3, 0x0b,
+ 0x06, 0xa0, 0xe1, 0x0a, 0x06, 0xa0, 0xe0, 0xe4, 0xc2, 0x08, 0x16, 0x05,
+ 0xc2, 0x62, 0x00, 0x02, 0x26, 0x60, 0xe4, 0x68, 0x16, 0x0d, 0xc2, 0x42,
+ 0x05, 0xc9, 0xce, 0x60, 0xed, 0x4a, 0xc6, 0x60, 0xeb, 0x0c, 0x06, 0xa0,
+ 0xe1, 0x4c, 0xca, 0x18, 0x00, 0x0a, 0x46, 0x20, 0xe0, 0x26, 0x16, 0x04,
+ 0xc0, 0xa0, 0x01, 0x6c, 0x2e, 0x12, 0x10, 0x1d, 0xc1, 0x12, 0x13, 0x05,
+ 0xc1, 0x60, 0x01, 0x6c, 0x2e, 0x14, 0xc8, 0x05, 0x01, 0x6c, 0x04, 0xd2,
+ 0x06, 0x48, 0x07, 0x84, 0x00, 0x02, 0xc1, 0x48, 0xc0, 0xa0, 0x01, 0x6c,
+ 0xc0, 0x02, 0x06, 0xa0, 0xe3, 0xce, 0xc5, 0x60, 0xfc, 0x02, 0x02, 0x07,
+ 0x06, 0xa2, 0x02, 0x25, 0xff, 0xf4, 0xc8, 0x05, 0xfc, 0x02, 0xc2, 0x20,
+ 0x01, 0x6c, 0x06, 0xa0, 0xc2, 0x5a, 0x04, 0x5c, 0xc2, 0x42, 0x02, 0x29,
+ 0x00, 0x08, 0xc2, 0x39, 0x02, 0x48, 0xc0, 0x00, 0x02, 0x88, 0xc0, 0x00,
+ 0x16, 0x08, 0x8e, 0x60, 0xe0, 0x2e, 0x16, 0x05, 0x86, 0x60, 0xe0, 0x2e,
+ 0x16, 0x02, 0x04, 0xc8, 0x04, 0x5b, 0x07, 0x08, 0x04, 0x5b, 0x88, 0x20,
+ 0xe1, 0x8e, 0x01, 0x6c, 0x16, 0x02, 0x04, 0x60, 0xdb, 0xa8, 0x04, 0x5b,
+ 0x07, 0x88, 0x01, 0xae, 0xe8, 0x20, 0xe0, 0x0e, 0x01, 0x80, 0x06, 0x08,
+ 0x16, 0xfe, 0x48, 0x20, 0xe0, 0x0e, 0x01, 0x80, 0x04, 0x5b, 0x04, 0xc2,
+ 0x23, 0xa0, 0xe0, 0x0c, 0x16, 0x0a, 0x2f, 0x20, 0x06, 0x30, 0x07, 0x82,
+ 0xff, 0xdf, 0x2c, 0x02, 0x02, 0x82, 0x03, 0xf4, 0x16, 0xfa, 0x43, 0xa0,
+ 0xe0, 0x0c, 0x04, 0x5b, 0xc2, 0x42, 0x07, 0x88, 0x00, 0x0e, 0xa2, 0x09,
+ 0x02, 0x29, 0x00, 0x08, 0xce, 0x78, 0xce, 0x78, 0xce, 0x78, 0xce, 0x60,
+ 0x09, 0x6c, 0xce, 0x60, 0x09, 0x6e, 0xce, 0x60, 0x09, 0x70, 0x23, 0xa0,
+ 0xe0, 0x1a, 0x16, 0x0f, 0xc2, 0x58, 0x02, 0x49, 0x1f, 0x80, 0x2a, 0x60,
+ 0xe0, 0x14, 0xe8, 0xa0, 0xe0, 0x04, 0x00, 0x0e, 0xc6, 0x09, 0x02, 0x49,
+ 0x1f, 0x00, 0x06, 0xc9, 0xa2, 0x09, 0xa8, 0x89, 0x00, 0x04, 0x02, 0x28,
+ 0x00, 0x02, 0xc2, 0x58, 0x0a, 0x49, 0x02, 0x49, 0xf0, 0x00, 0xd6, 0x09,
+ 0x04, 0xe2, 0x00, 0x06, 0x04, 0x5b, 0x07, 0x00, 0xc0, 0x82, 0x13, 0x53,
+ 0xc0, 0xa0, 0x01, 0x6c, 0xc1, 0xa0, 0xfc, 0x06, 0x02, 0x46, 0x00, 0x0f,
+ 0x02, 0x86, 0x00, 0x01, 0x12, 0x3d, 0x88, 0x06, 0x06, 0xf2, 0x16, 0x12,
+ 0x02, 0x01, 0xfc, 0x0e, 0x88, 0x31, 0x06, 0xf4, 0x16, 0x0d, 0x88, 0x31,
+ 0x06, 0xf6, 0x16, 0x0a, 0x88, 0x31, 0x06, 0xf8, 0x16, 0x07, 0x02, 0x86,
+ 0x00, 0x02, 0x16, 0x2c, 0x88, 0x20, 0x07, 0x0a, 0x06, 0xfa, 0x13, 0x28,
+ 0xc1, 0x20, 0x09, 0x6a, 0x01, 0x44, 0x08, 0x00, 0x13, 0x06, 0x02, 0x86,
+ 0x00, 0x02, 0x16, 0x20, 0x01, 0x44, 0x00, 0x80, 0x16, 0x1d, 0x07, 0x00,
+ 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x19, 0x02, 0x82, 0x00, 0x43, 0x13, 0x16,
+ 0x02, 0x00, 0xfc, 0x02, 0xc0, 0x40, 0x01, 0xb0, 0x00, 0x20, 0x01, 0x60,
+ 0x09, 0x6a, 0x00, 0x01, 0x16, 0x07, 0xa0, 0x60, 0x09, 0x2c, 0xcc, 0x60,
+ 0x05, 0xee, 0xc4, 0x50, 0xc4, 0x20, 0x09, 0x2c, 0x07, 0x80, 0x07, 0x36,
+ 0x07, 0x81, 0x00, 0x40, 0x2c, 0x40, 0x04, 0xc0, 0x07, 0x84, 0x06, 0xf2,
+ 0xcd, 0x06, 0x02, 0x01, 0xfc, 0x0e, 0xcd, 0x31, 0xcd, 0x31, 0xcd, 0x31,
+ 0xc5, 0x20, 0x07, 0x0a, 0xc0, 0x00, 0x13, 0x01, 0x2e, 0x12, 0x04, 0xe0,
+ 0x01, 0x6c, 0x04, 0x5b, 0xc8, 0x0b, 0x09, 0x22, 0x06, 0xa0, 0xe2, 0x72,
+ 0x02, 0x08, 0x80, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0x80, 0x30,
+ 0x06, 0xa0, 0xe0, 0x22, 0xc2, 0xe0, 0x09, 0x22, 0x04, 0x5b, 0xc3, 0x0b,
+ 0x48, 0x20, 0xeb, 0x0e, 0x01, 0x82, 0x48, 0x20, 0xe4, 0x6c, 0x01, 0x80,
+ 0x48, 0x20, 0xe0, 0x22, 0x01, 0xae, 0x48, 0x20, 0xe0, 0x22, 0x09, 0x78,
+ 0x43, 0x60, 0xe0, 0x18, 0x43, 0xa0, 0xe0, 0x08, 0x02, 0x08, 0x00, 0x42,
+ 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x5c, 0xc3, 0x0b, 0xe8, 0x20, 0xe0, 0x0e,
+ 0x01, 0x82, 0xe8, 0x20, 0xe0, 0x22, 0x01, 0xae, 0xe8, 0x20, 0xe0, 0x22,
+ 0x09, 0x78, 0xe3, 0xa0, 0xe0, 0x08, 0xe3, 0x60, 0xe0, 0x18, 0x43, 0xa0,
+ 0xe0, 0x06, 0x02, 0x08, 0x80, 0x3c, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08,
+ 0x80, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x5c, 0xc3, 0x0b, 0x07, 0x83,
+ 0x68, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0x07, 0x83, 0x80, 0x10, 0x06, 0xa0,
+ 0xe3, 0x56, 0x04, 0x5c, 0xc3, 0x0b, 0x06, 0xa0, 0xe3, 0x40, 0xa2, 0x02,
+ 0xc2, 0x68, 0x00, 0x14, 0x02, 0x29, 0xff, 0xfc, 0x13, 0x24, 0x02, 0x28,
+ 0x00, 0x18, 0x07, 0x87, 0x00, 0x0e, 0x07, 0x81, 0x07, 0x0e, 0x04, 0xf1,
+ 0x06, 0x47, 0x15, 0xfd, 0xc0, 0x58, 0x03, 0xb0, 0x78, 0x01, 0x06, 0x63,
+ 0x02, 0x41, 0x00, 0x3f, 0x13, 0x0e, 0x02, 0x81, 0x00, 0x1f, 0x1b, 0x0b,
+ 0xa0, 0x41, 0xc0, 0x61, 0xe4, 0x4e, 0xc1, 0xf8, 0x06, 0xc7, 0x71, 0xc7,
+ 0x06, 0x47, 0xcc, 0x78, 0x06, 0x47, 0x15, 0xfd, 0x10, 0x04, 0xc0, 0x58,
+ 0x06, 0xc1, 0x70, 0x41, 0xa2, 0x01, 0xc2, 0x49, 0x15, 0xe5, 0x04, 0x5c,
+ 0x23, 0xa0, 0xe0, 0x1a, 0x13, 0x02, 0x04, 0xc8, 0x04, 0x5b, 0xc2, 0x22,
+ 0x00, 0x14, 0x02, 0x48, 0x1f, 0x00, 0x06, 0xc8, 0x04, 0x5b, 0x02, 0x83,
+ 0x00, 0x0f, 0x1b, 0x17, 0xc1, 0xa0, 0x06, 0xd4, 0x13, 0x35, 0x02, 0x26,
+ 0x00, 0x04, 0xcd, 0xa0, 0xed, 0x26, 0xc5, 0x83, 0x13, 0x04, 0xc2, 0x4a,
+ 0x0a, 0x39, 0xe0, 0xc9, 0xc5, 0x83, 0x07, 0x86, 0x07, 0x36, 0x07, 0x87,
+ 0x00, 0x10, 0xc2, 0x20, 0x06, 0xd4, 0x04, 0xe0, 0x06, 0xd4, 0x2c, 0x46,
+ 0x04, 0x5b, 0xc0, 0x60, 0x06, 0xfe, 0xc2, 0x20, 0x09, 0x6a, 0x02, 0x48,
+ 0x60, 0x00, 0x22, 0x20, 0xe0, 0x06, 0x16, 0x04, 0xe2, 0x20, 0xe0, 0x0a,
+ 0xe2, 0x20, 0xe0, 0x18, 0x0a, 0x13, 0x18, 0x04, 0x05, 0x41, 0x48, 0x03,
+ 0x06, 0xfe, 0x10, 0x06, 0x02, 0x83, 0x00, 0x02, 0x16, 0x01, 0x09, 0x13,
+ 0xe8, 0x03, 0x06, 0xfe, 0x40, 0xc8, 0x40, 0xc1, 0x13, 0x05, 0x07, 0x88,
+ 0x07, 0x36, 0x07, 0x89, 0x40, 0x00, 0x2c, 0x48, 0x04, 0x5b, 0x04, 0xc9,
+ 0xc1, 0x24, 0xeb, 0x24, 0xc1, 0x84, 0x71, 0x86, 0x02, 0x26, 0xeb, 0xd6,
+ 0x06, 0xc4, 0x71, 0x04, 0x02, 0x24, 0xeb, 0x4c, 0xd2, 0x14, 0x09, 0xc8,
+ 0xa2, 0x08, 0x03, 0xb0, 0xd8, 0x34, 0x06, 0x5f, 0x02, 0x47, 0x00, 0x0f,
+ 0xa1, 0xc7, 0xc2, 0x28, 0xeb, 0x12, 0x04, 0x58, 0xcd, 0x76, 0x06, 0x47,
+ 0x16, 0xfd, 0x10, 0x32, 0xc2, 0x36, 0x10, 0x26, 0x09, 0x17, 0xa1, 0x47,
+ 0x10, 0x2d, 0x09, 0x17, 0x61, 0x47, 0x10, 0x2a, 0x43, 0xa0, 0xe0, 0x16,
+ 0x04, 0x5b, 0x43, 0xa0, 0xe0, 0x16, 0xc2, 0x49, 0x16, 0x03, 0xc2, 0x44,
+ 0xc8, 0x06, 0x09, 0x22, 0xc1, 0x27, 0xec, 0xe6, 0xc1, 0x84, 0x71, 0x86,
+ 0x02, 0x26, 0xed, 0x1c, 0x06, 0xc4, 0x71, 0x04, 0x02, 0x24, 0xed, 0x02,
+ 0x10, 0xd3, 0xc1, 0x09, 0xc1, 0xa0, 0x09, 0x22, 0x04, 0xc9, 0x10, 0x10,
+ 0xc2, 0x36, 0xd5, 0x78, 0x41, 0x60, 0xe0, 0x22, 0x05, 0xc5, 0x10, 0x0a,
+ 0xcd, 0x78, 0x06, 0x47, 0x15, 0xfd, 0x10, 0x06, 0x23, 0xa0, 0xe0, 0x16,
+ 0x16, 0xcd, 0xc2, 0x49, 0x16, 0xec, 0x10, 0xd6, 0xe3, 0xa0, 0xe0, 0x16,
+ 0x10, 0xbb, 0x02, 0x08, 0x80, 0x5a, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x3e,
+ 0x92, 0xa0, 0xe0, 0x0c, 0x16, 0x15, 0x02, 0x44, 0x5e, 0x00, 0x16, 0x14,
+ 0x48, 0x20, 0xe4, 0x6c, 0x01, 0x80, 0x06, 0xa0, 0xe2, 0x9e, 0xc8, 0x20,
+ 0x01, 0x9e, 0x01, 0x9e, 0x2e, 0xe0, 0x00, 0x01, 0x43, 0xa0, 0xe0, 0x18,
+ 0xd2, 0xa0, 0xe0, 0x26, 0x07, 0x83, 0x00, 0x10, 0x06, 0xa0, 0xe3, 0x56,
+ 0x04, 0x60, 0xdb, 0xc0, 0x07, 0x84, 0x00, 0x08, 0x04, 0x60, 0xdb, 0x88,
+ 0x07, 0x85, 0x02, 0x03, 0xc8, 0x05, 0x06, 0xce, 0x43, 0xa0, 0xe0, 0x12,
+ 0x04, 0xe0, 0x06, 0xfa, 0x06, 0xa0, 0xe2, 0xd0, 0x02, 0x08, 0x80, 0x48,
+ 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x11, 0x27, 0xa0, 0xe0, 0x2c, 0x16, 0x04,
+ 0x02, 0x08, 0x80, 0x54, 0x06, 0xa0, 0xe0, 0x22, 0x07, 0x83, 0xa8, 0x00,
+ 0x88, 0x20, 0x07, 0x08, 0xe0, 0x20, 0x16, 0x02, 0x07, 0x83, 0xe8, 0x00,
+ 0x06, 0xa0, 0xe3, 0x56, 0x02, 0x08, 0x00, 0x36, 0x06, 0xa0, 0xe0, 0x22,
+ 0xe8, 0x20, 0xe0, 0x0c, 0x01, 0x82, 0x23, 0xa0, 0xe0, 0x18, 0x13, 0x06,
+ 0xe3, 0xa0, 0xe0, 0x18, 0x2e, 0xe0, 0x00, 0x00, 0xc0, 0x41, 0x16, 0xfa,
+ 0x06, 0xa0, 0xe1, 0x2e, 0xc0, 0x82, 0x13, 0x02, 0x02, 0x4f, 0xff, 0x80,
+ 0x04, 0xc4, 0xd1, 0x0f, 0x06, 0xc4, 0x04, 0x60, 0xdb, 0x88, 0x06, 0xa0,
+ 0xe5, 0x50, 0x02, 0x08, 0x80, 0x36, 0x07, 0xa0, 0x06, 0xd6, 0xe5, 0x3e,
+ 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x10, 0x06, 0xa0, 0xe5, 0x50, 0xd1, 0x20,
+ 0x06, 0xce, 0x13, 0xe6, 0x78, 0x20, 0xe0, 0x12, 0x06, 0xce, 0x10, 0xe2,
+ 0xc1, 0x20, 0x04, 0x16, 0x0a, 0x14, 0x06, 0xc4, 0x91, 0x0a, 0x16, 0x01,
+ 0x04, 0x5b, 0x04, 0x60, 0xdb, 0xc0, 0x04, 0xca, 0x04, 0xcd, 0x04, 0xce,
+ 0x04, 0xcf, 0x04, 0xe0, 0x06, 0xa8, 0x04, 0xe0, 0x06, 0xba, 0x07, 0x84,
+ 0x01, 0xa0, 0x07, 0x85, 0x00, 0x10, 0x04, 0xf4, 0x06, 0x45, 0x15, 0xfd,
+ 0x07, 0x84, 0x06, 0xd8, 0x07, 0x85, 0x07, 0x34, 0x61, 0x44, 0x04, 0xf4,
+ 0x06, 0x45, 0x15, 0xfd, 0x07, 0x84, 0x00, 0xc8, 0xc8, 0x04, 0x07, 0x00,
+ 0x07, 0x84, 0x7f, 0xff, 0xc8, 0x04, 0x06, 0xf0, 0x07, 0x84, 0x00, 0x06,
+ 0xc8, 0x04, 0x06, 0xee, 0x03, 0xb0, 0xd8, 0x20, 0xe0, 0x10, 0x06, 0x65,
+ 0x04, 0x60, 0xdb, 0xc0, 0xf8, 0x20, 0xed, 0x71, 0x01, 0x82, 0xc8, 0x20,
+ 0xe0, 0x10, 0x06, 0xc6, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xc8, 0x2e, 0xe0,
+ 0x00, 0x00, 0x06, 0xa0, 0xe1, 0x2e, 0xc8, 0x20, 0x09, 0x6c, 0x01, 0xa0,
+ 0xc8, 0x20, 0x09, 0x6e, 0x01, 0xa2, 0xc8, 0x20, 0x09, 0x70, 0x01, 0xa4,
+ 0xc8, 0x20, 0x09, 0x6e, 0x01, 0xb0, 0xc8, 0x20, 0x09, 0x70, 0x01, 0xb2,
+ 0xc8, 0x20, 0x09, 0x70, 0x06, 0xcc, 0xf8, 0x20, 0xed, 0x70, 0x01, 0x80,
+ 0x06, 0xa0, 0xe1, 0x18, 0x48, 0x20, 0xe0, 0x04, 0x01, 0x80, 0x04, 0xe0,
+ 0x01, 0x9e, 0x02, 0x08, 0x80, 0x12, 0x06, 0xa0, 0xe0, 0x22, 0x07, 0x84,
+ 0x00, 0x0a, 0x07, 0x85, 0x03, 0xf4, 0x88, 0x20, 0x06, 0xc6, 0xe0, 0x20,
+ 0x1b, 0x04, 0x07, 0x84, 0x00, 0x1c, 0x07, 0x85, 0x03, 0xf8, 0x06, 0xa0,
+ 0xe3, 0xce, 0x07, 0x85, 0xe6, 0x42, 0xc8, 0x05, 0x03, 0xf8, 0x23, 0xa0,
+ 0xe0, 0x0c, 0x13, 0x23, 0xe3, 0xa0, 0xe0, 0x0c, 0x2e, 0xa0, 0x03, 0xf4,
+ 0x10, 0x1e, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x10, 0x06, 0x65, 0x16, 0x19,
+ 0x02, 0x44, 0x5e, 0x00, 0x16, 0x04, 0x06, 0x20, 0x06, 0xc6, 0x16, 0xd7,
+ 0x10, 0x08, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x10, 0x06, 0x65, 0x16, 0x0d,
+ 0x06, 0x20, 0x06, 0xc8, 0x16, 0xc4, 0x01, 0x0e, 0x00, 0x03, 0x13, 0x03,
+ 0x07, 0x83, 0x82, 0x00, 0x10, 0x02, 0x07, 0x83, 0x00, 0x01, 0x04, 0x60,
+ 0xdb, 0xb8, 0x04, 0x60, 0xdb, 0x9e, 0x01, 0x0e, 0x00, 0x03, 0x13, 0x0a,
+ 0x02, 0x08, 0x80, 0x0c, 0x06, 0xa0, 0xe0, 0x22, 0xe3, 0xe0, 0xe0, 0x14,
+ 0xc8, 0x20, 0xe4, 0x6e, 0x01, 0x86, 0x10, 0x26, 0x48, 0x20, 0xe0, 0x0c,
+ 0x01, 0x82, 0x2e, 0xe0, 0x00, 0x01, 0xc1, 0x60, 0x09, 0x1e, 0x0a, 0x35,
+ 0xe8, 0x05, 0x01, 0x82, 0xc1, 0x20, 0x09, 0x6a, 0x01, 0x04, 0x00, 0x06,
+ 0x13, 0x06, 0xd8, 0x20, 0xe1, 0xd0, 0x09, 0x2f, 0xd8, 0x20, 0xe1, 0xd0,
+ 0x01, 0x83, 0x21, 0x20, 0xe0, 0x22, 0x16, 0x03, 0xe8, 0x20, 0xe0, 0x22,
+ 0x01, 0x80, 0x21, 0x20, 0xe0, 0x04, 0x16, 0x04, 0xe3, 0xa0, 0xe0, 0x14,
+ 0x04, 0x60, 0xdf, 0xb6, 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22,
+ 0xe8, 0x20, 0xe0, 0x08, 0x01, 0x82, 0x04, 0x60, 0xdb, 0x9e, 0xc8, 0x20,
+ 0xe4, 0x6e, 0x01, 0x86, 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22,
+ 0xc2, 0x20, 0x09, 0x1e, 0xa2, 0x08, 0x05, 0x08, 0xc8, 0x28, 0xe0, 0x22,
+ 0x06, 0xca, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xc6, 0xc8, 0x20, 0xe0, 0x20,
+ 0x06, 0xc8, 0xe3, 0x60, 0xe0, 0x16, 0x04, 0x60, 0xdb, 0xc0, 0xc1, 0x44,
+ 0x02, 0x44, 0x5e, 0x00, 0x16, 0xf8, 0x25, 0x60, 0xe4, 0x68, 0x16, 0x0f,
+ 0x06, 0x20, 0x06, 0xc6, 0x16, 0xf2, 0x06, 0x20, 0x06, 0xca, 0x13, 0x03,
+ 0x05, 0xa0, 0x06, 0xcc, 0x10, 0xe6, 0x03, 0xb0, 0xd8, 0x20, 0xe0, 0x0c,
+ 0x06, 0x65, 0x04, 0x60, 0xdb, 0xc0, 0x06, 0x20, 0x06, 0xc8, 0x16, 0xe3,
+ 0x88, 0x20, 0x09, 0x70, 0x06, 0xcc, 0x16, 0x03, 0x07, 0x83, 0x00, 0x08,
+ 0x10, 0x02, 0x07, 0x83, 0x00, 0x0c, 0x04, 0x60, 0xdb, 0xb8, 0x04, 0x60,
+ 0xdb, 0xc0, 0x23, 0xa0, 0xe0, 0x08, 0x13, 0x03, 0x23, 0x60, 0xe0, 0x12,
+ 0x16, 0x06, 0x03, 0xb0, 0xd8, 0x20, 0xe3, 0xa9, 0x06, 0x65, 0x04, 0x60,
+ 0xdb, 0xc0, 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60,
+ 0xdb, 0x9e, 0x02, 0x08, 0x80, 0x00, 0x06, 0xa0, 0xe0, 0x22, 0xc8, 0x20,
+ 0xe0, 0x1e, 0x06, 0xc6, 0xc8, 0x20, 0xe0, 0x1e, 0x06, 0xc8, 0xe3, 0x60,
+ 0xe0, 0x10, 0x04, 0x60, 0xdb, 0xc0, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x19,
+ 0xc1, 0x44, 0x02, 0x44, 0x1e, 0x00, 0x16, 0xf5, 0x25, 0x60, 0xe4, 0x68,
+ 0x16, 0x06, 0x06, 0x20, 0x06, 0xc8, 0x16, 0xef, 0x04, 0xc2, 0x04, 0x60,
+ 0xec, 0x20, 0x02, 0x08, 0x80, 0x1e, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x07,
+ 0x06, 0x20, 0x06, 0xc6, 0x16, 0xe4, 0x07, 0x83, 0x00, 0x09, 0x06, 0xa0,
+ 0xdb, 0xb8, 0x04, 0x60, 0xdb, 0x9e, 0x04, 0xce, 0x04, 0xe0, 0x09, 0x2a,
+ 0xd3, 0xe0, 0xe3, 0xaa, 0xc2, 0x8f, 0xc8, 0x20, 0xe4, 0x70, 0x01, 0x86,
+ 0x48, 0x20, 0xe0, 0x08, 0x01, 0x82, 0x07, 0x86, 0x00, 0x05, 0x07, 0x84,
+ 0x06, 0x72, 0xc1, 0x54, 0x13, 0x01, 0x2c, 0xd4, 0x02, 0x24, 0x00, 0x0a,
+ 0x06, 0x06, 0x16, 0xf9, 0x02, 0x08, 0x80, 0x2a, 0x06, 0xa0, 0xe0, 0x22,
+ 0x2c, 0x20, 0xe0, 0x1a, 0x04, 0x60, 0xda, 0x6a, 0x06, 0xa0, 0xe2, 0x72,
+ 0x04, 0xcd, 0x23, 0xa0, 0xe0, 0x1c, 0x13, 0x0d, 0x01, 0x0e, 0x00, 0x03,
+ 0x13, 0x0a, 0xe3, 0xa0, 0xe0, 0x1c, 0x03, 0xb0, 0xd8, 0x20, 0xe0, 0x10,
+ 0x06, 0x65, 0xd2, 0xa0, 0xe0, 0x26, 0x04, 0xcf, 0x10, 0x08, 0x2d, 0x20,
+ 0x00, 0x01, 0xc0, 0xe0, 0x09, 0x2a, 0x06, 0xa0, 0xe3, 0x56, 0xd2, 0xa0,
+ 0xe3, 0xab, 0x04, 0x60, 0xdb, 0xc0, 0x06, 0xa0, 0xe0, 0xe4, 0xc2, 0x08,
+ 0x13, 0x19, 0x07, 0x83, 0x80, 0x80, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x02,
+ 0x07, 0x83, 0x00, 0x0a, 0x04, 0x60, 0xdb, 0xb4, 0xc1, 0x20, 0x06, 0x06,
+ 0x13, 0x0d, 0x06, 0xa0, 0xe0, 0xe4, 0xc2, 0x08, 0x13, 0x09, 0x07, 0x83,
+ 0x00, 0x0b, 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x02, 0x07, 0x83, 0x80, 0x01,
+ 0x04, 0x60, 0xdb, 0xb4, 0x07, 0x83, 0x80, 0x0a, 0x04, 0x60, 0xdb, 0xa2,
+ 0x93, 0xe0, 0xe0, 0x0e, 0x13, 0x5e, 0x93, 0xe0, 0xe0, 0x10, 0x13, 0x17,
+ 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x04, 0x07, 0x83, 0x00, 0x07, 0x04, 0x60,
+ 0xdb, 0xb4, 0x07, 0x83, 0xa0, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0x07, 0x83,
+ 0x48, 0x00, 0x06, 0xa0, 0xe3, 0x56, 0xd2, 0xa0, 0xe0, 0x10, 0xc8, 0x20,
+ 0xe0, 0x1c, 0x06, 0xca, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xcc, 0x06, 0xa0,
+ 0xe2, 0x72, 0x02, 0x08, 0x80, 0x4e, 0x06, 0xa0, 0xe0, 0x22, 0x23, 0xa0,
+ 0xe0, 0x1c, 0x13, 0x20, 0x88, 0x20, 0x09, 0x6c, 0x07, 0x0e, 0x16, 0x1c,
+ 0x88, 0x20, 0x09, 0x6e, 0x07, 0x10, 0x16, 0x18, 0x88, 0x20, 0x09, 0x70,
+ 0x07, 0x12, 0x16, 0x14, 0x88, 0x20, 0x07, 0x0a, 0xe0, 0x22, 0x13, 0x10,
+ 0x06, 0x20, 0x06, 0xca, 0x16, 0x38, 0xe3, 0xa0, 0xe0, 0x20, 0x10, 0x06,
+ 0x23, 0xe0, 0xe0, 0x14, 0x16, 0xca, 0xe3, 0xa0, 0xe0, 0x22, 0x04, 0xc2,
+ 0xd2, 0xa0, 0xe3, 0xaa, 0x04, 0x60, 0xdb, 0xa8, 0xc8, 0x20, 0xe0, 0x1c,
+ 0x06, 0xca, 0x88, 0xa0, 0x06, 0xdc, 0x00, 0x0e, 0x16, 0x10, 0x88, 0xa0,
+ 0x06, 0xde, 0x00, 0x10, 0x16, 0x0c, 0x88, 0xa0, 0x06, 0xe0, 0x00, 0x12,
+ 0x16, 0x08, 0x06, 0x20, 0x06, 0xcc, 0x16, 0x19, 0xe8, 0x20, 0xe0, 0x0e,
+ 0x01, 0x82, 0xe3, 0xa0, 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x20, 0x06, 0xcc,
+ 0x10, 0x10, 0x23, 0xa0, 0xe0, 0x10, 0x16, 0x08, 0xc1, 0x64, 0x00, 0x06,
+ 0x21, 0x60, 0xe0, 0x0c, 0x13, 0x08, 0xd2, 0xa0, 0xe3, 0xa8, 0x10, 0x05,
+ 0x88, 0x20, 0x07, 0x0a, 0x07, 0x08, 0x12, 0x96, 0x10, 0x00, 0x04, 0x60,
+ 0xdb, 0xa8, 0x93, 0xe0, 0xe0, 0x0e, 0x13, 0x50, 0x93, 0xe0, 0xe3, 0xa9,
+ 0x13, 0x4d, 0x93, 0xe0, 0xe3, 0xa8, 0x13, 0x1c, 0x06, 0xa0, 0xe2, 0xd0,
+ 0x23, 0xa0, 0xe0, 0x10, 0x13, 0x45, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x06,
+ 0xe3, 0x60, 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x22, 0x07, 0x06, 0x10, 0x34,
+ 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x31, 0xc1, 0x60, 0x09, 0x6a, 0x21, 0x60,
+ 0xe0, 0x12, 0x16, 0x2c, 0x06, 0xa0, 0xea, 0x34, 0x10, 0x31, 0xd2, 0xa0,
+ 0xe3, 0xa8, 0x10, 0x2e, 0xe3, 0xa0, 0xe0, 0x12, 0x06, 0xa0, 0xea, 0x34,
+ 0xc1, 0x64, 0x00, 0x06, 0x21, 0x60, 0xe0, 0x0c, 0x13, 0x25, 0x88, 0x20,
+ 0x07, 0x0e, 0x06, 0xdc, 0x16, 0x14, 0x88, 0x20, 0x07, 0x10, 0x06, 0xde,
+ 0x16, 0x10, 0x88, 0x20, 0x07, 0x12, 0x06, 0xe0, 0x16, 0x0c, 0x98, 0x20,
+ 0x06, 0xce, 0x06, 0xcf, 0x13, 0x15, 0x06, 0x20, 0x06, 0xce, 0x16, 0x12,
+ 0xe3, 0x60, 0xe0, 0x1a, 0xd2, 0xa0, 0xe0, 0x0c, 0x10, 0x0d, 0xe3, 0x60,
+ 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x32, 0x07, 0x06, 0x06, 0xa0, 0xe2, 0x72,
+ 0x02, 0x08, 0x80, 0x48, 0x06, 0xa0, 0xe0, 0x22, 0xd2, 0xa0, 0xe3, 0xa9,
+ 0x04, 0x60, 0xdb, 0xa8, 0x88, 0x22, 0x00, 0x0e, 0x09, 0x6c, 0x1a, 0xc9,
+ 0x1b, 0x0b, 0x88, 0x22, 0x00, 0x10, 0x09, 0x6e, 0x1a, 0xc4, 0x1b, 0x06,
+ 0x88, 0x22, 0x00, 0x12, 0x09, 0x70, 0x1a, 0xbf, 0x1b, 0x01, 0x04, 0x5b,
+ 0xc1, 0x60, 0x01, 0x6c, 0x02, 0x85, 0x00, 0x43, 0x13, 0xe1, 0x93, 0xe0,
+ 0xe3, 0xa8, 0x16, 0xde, 0xc8, 0xa0, 0xed, 0x58, 0x00, 0x02, 0x07, 0x84,
+ 0x00, 0x0e, 0xc1, 0x42, 0xc0, 0xa0, 0x01, 0x6c, 0xc0, 0x02, 0x02, 0x25,
+ 0x00, 0x48, 0x07, 0x81, 0xea, 0x86, 0x07, 0x83, 0xae, 0x14, 0x04, 0x60,
+ 0xed, 0x92, 0x02, 0x02, 0xfc, 0x00, 0x10, 0xca, 0x98, 0x20, 0xe0, 0x0e,
+ 0x06, 0x65, 0x16, 0x03, 0xd8, 0x20, 0xe3, 0xa8, 0x06, 0x65, 0x93, 0xe0,
+ 0xe3, 0xa9, 0x13, 0x0d, 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x19, 0x23, 0xa0,
+ 0xe0, 0x10, 0x13, 0x16, 0xe3, 0x60, 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x20,
+ 0x07, 0x06, 0x06, 0xa0, 0xe2, 0x72, 0x43, 0xa0, 0xe0, 0x18, 0x2e, 0xe0,
+ 0x00, 0x01, 0xd2, 0xa0, 0xe0, 0x26, 0x07, 0x83, 0x00, 0x10, 0x06, 0xa0,
+ 0xe3, 0x56, 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x02, 0x06, 0xa0, 0xe2, 0x54,
+ 0x43, 0xa0, 0xe0, 0x2c, 0xc8, 0x20, 0xe0, 0x20, 0x09, 0x24, 0x04, 0x60,
+ 0xdb, 0xa8, 0x43, 0xa0, 0xe0, 0x0e, 0xc1, 0xa0, 0x09, 0x24, 0x13, 0x02,
+ 0x06, 0x20, 0x09, 0x24, 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x03, 0x23, 0xa0,
+ 0xe0, 0x08, 0x16, 0x26, 0x02, 0x08, 0x80, 0x42, 0x06, 0xa0, 0xe0, 0x22,
+ 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x1f, 0x23, 0xa0, 0xe0, 0x10, 0x16, 0x0a,
+ 0xc1, 0x22, 0x00, 0x02, 0x25, 0x20, 0xe4, 0x68, 0x16, 0x23, 0x07, 0x83,
+ 0x80, 0x20, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x12, 0x06, 0xa0, 0xe2, 0x72,
+ 0x23, 0xe0, 0xe0, 0x14, 0x16, 0x02, 0x06, 0xa0, 0xe2, 0x54, 0xe3, 0x60,
+ 0xe0, 0x1e, 0xc8, 0x20, 0xe0, 0x20, 0x07, 0x06, 0x23, 0xa0, 0xe0, 0x08,
+ 0x16, 0x03, 0x23, 0xa0, 0xe0, 0x06, 0x13, 0x51, 0x98, 0x20, 0xe0, 0x0e,
+ 0x06, 0x65, 0x16, 0x03, 0xd8, 0x20, 0xe3, 0xa8, 0x06, 0x65, 0xc1, 0x22,
+ 0x00, 0x02, 0x25, 0x20, 0xe4, 0x68, 0x13, 0x0e, 0x07, 0x83, 0x00, 0x20,
+ 0x06, 0xa0, 0xe3, 0x56, 0xc8, 0x22, 0x00, 0x0e, 0x06, 0xe6, 0xc8, 0x22,
+ 0x00, 0x10, 0x06, 0xe8, 0xc8, 0x22, 0x00, 0x12, 0x06, 0xea, 0x10, 0x37,
+ 0x88, 0x22, 0x00, 0x0e, 0x06, 0xdc, 0x16, 0x08, 0x88, 0x22, 0x00, 0x10,
+ 0x06, 0xde, 0x16, 0x04, 0x88, 0x22, 0x00, 0x12, 0x06, 0xe0, 0x13, 0x0b,
+ 0xc8, 0x22, 0x00, 0x0e, 0x06, 0xdc, 0xc8, 0x22, 0x00, 0x10, 0x06, 0xde,
+ 0xc8, 0x22, 0x00, 0x12, 0x06, 0xe0, 0xe3, 0x60, 0xe0, 0x14, 0x23, 0xa0,
+ 0xe0, 0x0e, 0x16, 0x08, 0xc1, 0xa0, 0x09, 0x24, 0x16, 0x1a, 0x07, 0x86,
+ 0x10, 0x00, 0xe8, 0x06, 0x06, 0xd2, 0x10, 0x15, 0xe3, 0xa0, 0xe0, 0x0e,
+ 0x23, 0xa0, 0xe0, 0x08, 0x16, 0x09, 0xe3, 0xa0, 0xe0, 0x06, 0x04, 0xe0,
+ 0x06, 0xe6, 0x04, 0xe0, 0x06, 0xe8, 0x04, 0xe0, 0x06, 0xea, 0x10, 0x07,
+ 0x02, 0x08, 0x80, 0x36, 0x07, 0xa0, 0x06, 0xd6, 0xdf, 0xe2, 0x06, 0xa0,
+ 0xe0, 0x22, 0x04, 0x60, 0xdb, 0xa8, 0x98, 0x20, 0x06, 0x65, 0xe0, 0x10,
+ 0x16, 0x03, 0xd8, 0x20, 0xe0, 0x0e, 0x06, 0x65, 0x04, 0x60, 0xdb, 0xa8,
+ 0x23, 0xe0, 0xe0, 0x14, 0x13, 0x02, 0x04, 0x60, 0xdb, 0xa8, 0x10, 0x2e,
+ 0x03, 0xb0, 0x98, 0x20, 0xe3, 0xa9, 0x06, 0x6f, 0x16, 0x19, 0xc2, 0x24,
+ 0x00, 0x08, 0x11, 0x16, 0xe3, 0xe0, 0xe0, 0x14, 0x07, 0x83, 0x00, 0x00,
+ 0x06, 0xa0, 0xe3, 0x56, 0x23, 0xa0, 0xe0, 0x14, 0x13, 0x04, 0x02, 0x08,
+ 0x80, 0x06, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0x00, 0x1e, 0x06, 0xa0,
+ 0xe0, 0x22, 0x23, 0xa0, 0xe0, 0x08, 0x13, 0x02, 0x06, 0xa0, 0xe2, 0x54,
+ 0xc0, 0x82, 0x16, 0x02, 0x04, 0x60, 0xdb, 0xc0, 0xe8, 0x20, 0xed, 0x74,
+ 0x06, 0xf0, 0x99, 0x20, 0xe0, 0x0e, 0x00, 0x16, 0x16, 0x05, 0x04, 0xe0,
+ 0x06, 0xec, 0x48, 0x20, 0xe0, 0x14, 0x06, 0xf0, 0x07, 0x83, 0x00, 0x01,
+ 0x04, 0x60, 0xdb, 0xa2, 0xc2, 0x64, 0x00, 0x14, 0x02, 0x24, 0x00, 0x18,
+ 0xc1, 0xc4, 0x61, 0xc2, 0x02, 0x27, 0xff, 0xfc, 0xc1, 0x74, 0xc1, 0x85,
+ 0x71, 0x45, 0x02, 0x85, 0x00, 0x27, 0x16, 0x46, 0xc1, 0x54, 0x02, 0x45,
+ 0xff, 0xcf, 0x16, 0x42, 0x04, 0xc8, 0xc1, 0x64, 0x00, 0x08, 0x15, 0x06,
+ 0x13, 0x05, 0xc2, 0x24, 0x00, 0x0e, 0x02, 0x48, 0x1f, 0x00, 0x06, 0xc8,
+ 0x02, 0x28, 0x00, 0x11, 0xa2, 0x04, 0x98, 0x18, 0xed, 0x79, 0x16, 0x32,
+ 0xc1, 0x42, 0x02, 0x25, 0x00, 0x04, 0x65, 0x47, 0xc2, 0x35, 0xcd, 0x74,
+ 0x06, 0x48, 0x15, 0xfd, 0xc0, 0xa0, 0x01, 0x6c, 0xc1, 0x02, 0xc8, 0x04,
+ 0x01, 0x6c, 0xc1, 0xa0, 0xfc, 0x00, 0x13, 0x05, 0xc8, 0x20, 0xeb, 0x10,
+ 0xfc, 0x02, 0xc1, 0x06, 0x10, 0xf6, 0xc8, 0x02, 0x01, 0x6c, 0xc8, 0x20,
+ 0xed, 0x58, 0xfc, 0x02, 0x07, 0x81, 0xec, 0xfc, 0xc0, 0x04, 0x07, 0x83,
+ 0x02, 0x10, 0x07, 0x84, 0x00, 0x0e, 0x10, 0x3b, 0x07, 0x84, 0x00, 0x0c,
+ 0xc0, 0xe2, 0x00, 0x08, 0x02, 0x05, 0xfc, 0x00, 0xc0, 0xa0, 0x01, 0x6c,
+ 0xc0, 0x02, 0xc1, 0xa0, 0xfc, 0x00, 0x13, 0x2f, 0x04, 0xe0, 0xfc, 0x00,
+ 0x2e, 0x16, 0x10, 0x2b, 0xc8, 0xa0, 0xed, 0x7a, 0x00, 0x0e, 0xc8, 0xa0,
+ 0xed, 0x7c, 0x00, 0x10, 0xc8, 0xa0, 0xed, 0x7e, 0x00, 0x12, 0x07, 0x83,
+ 0x80, 0x06, 0x04, 0x60, 0xdb, 0xa2, 0x04, 0x60, 0xdb, 0xc0, 0x07, 0x84,
+ 0x00, 0x10, 0x07, 0x85, 0x00, 0x34, 0x10, 0x09, 0x07, 0x84, 0x00, 0x12,
+ 0x07, 0x85, 0x00, 0x32, 0x10, 0x04, 0x07, 0x84, 0x00, 0x14, 0x07, 0x85,
+ 0x00, 0x38, 0x06, 0xa0, 0xe1, 0x0a, 0xc8, 0x85, 0x00, 0x04, 0x06, 0xa0,
+ 0xe1, 0x4c, 0xc8, 0xa0, 0xed, 0x58, 0x00, 0x02, 0xc0, 0xa0, 0x01, 0x6c,
+ 0xc0, 0x02, 0x06, 0x48, 0xc1, 0x48, 0x06, 0xa0, 0xe3, 0xce, 0x02, 0x07,
+ 0x06, 0xa2, 0xc5, 0x60, 0xfc, 0x02, 0x02, 0x25, 0xff, 0xf4, 0xc8, 0x05,
+ 0xfc, 0x02, 0xc2, 0x20, 0x01, 0x6c, 0x06, 0xa0, 0xc2, 0x5a, 0x04, 0x60,
+ 0xdb, 0x9e, 0x06, 0xa0, 0xe3, 0xce, 0x02, 0x07, 0x06, 0xb4, 0x10, 0xef,
+ 0xc3, 0x0b, 0x03, 0x00, 0x00, 0x02, 0x07, 0x82, 0x00, 0xc0, 0xc8, 0x20,
+ 0x00, 0x0c, 0x00, 0xc0, 0xc8, 0x20, 0x00, 0x0e, 0x00, 0xc2, 0xc8, 0x20,
+ 0x00, 0x10, 0x00, 0xc4, 0xc8, 0x20, 0x00, 0x12, 0x00, 0xc6, 0xc8, 0x20,
+ 0x00, 0x14, 0x00, 0xc8, 0xc8, 0x20, 0x00, 0x16, 0x00, 0xca, 0xc8, 0x20,
+ 0x00, 0x04, 0x00, 0xcc, 0xc8, 0x20, 0x00, 0x06, 0x00, 0xce, 0xc8, 0x02,
+ 0x00, 0x0c, 0x07, 0xa0, 0x00, 0x0e, 0xee, 0x3c, 0xc8, 0x02, 0x00, 0x10,
+ 0x07, 0xa0, 0x00, 0x12, 0xee, 0x46, 0xc8, 0x02, 0x00, 0x14, 0x07, 0xa0,
+ 0x00, 0x16, 0xee, 0x76, 0xc8, 0x02, 0x00, 0x04, 0x07, 0xa0, 0x00, 0x06,
+ 0xee, 0x8c, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04, 0x16, 0x09, 0x01, 0xe0,
+ 0x01, 0x40, 0x08, 0x00, 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0x01, 0xe0,
+ 0x01, 0x40, 0x04, 0x00, 0x06, 0xa0, 0xf1, 0x4c, 0x02, 0x05, 0x80, 0x00,
+ 0xd8, 0x05, 0x04, 0x80, 0x04, 0xc7, 0x03, 0x00, 0x00, 0x0f, 0x07, 0x88,
+ 0x10, 0x00, 0x02, 0x09, 0x20, 0x00, 0x07, 0x8a, 0xee, 0xa4, 0x02, 0x03,
+ 0xe5, 0xfe, 0x04, 0x5a, 0x03, 0x00, 0x00, 0x00, 0xd2, 0x20, 0x01, 0x87,
+ 0x10, 0x06, 0x03, 0x00, 0x00, 0x00, 0xc2, 0x20, 0x01, 0x8a, 0x02, 0x08,
+ 0x1a, 0x00, 0xc2, 0x60, 0x00, 0xae, 0xda, 0x48, 0x04, 0x80, 0x05, 0x89,
+ 0x02, 0x89, 0x00, 0x06, 0x15, 0x07, 0x07, 0x88, 0x80, 0x00, 0xda, 0x48,
+ 0x04, 0x80, 0xc8, 0x09, 0x00, 0xae, 0x03, 0x80, 0x02, 0xe0, 0x00, 0xa0,
+ 0x04, 0x5c, 0x03, 0x00, 0x00, 0x00, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x20,
+ 0x13, 0xe2, 0xc2, 0x20, 0x01, 0x8c, 0x02, 0x08, 0x1c, 0x00, 0x10, 0xe3,
+ 0x03, 0x00, 0x00, 0x00, 0x01, 0x60, 0x01, 0x40, 0x40, 0x00, 0x16, 0xec,
+ 0x01, 0xa0, 0x01, 0x40, 0x40, 0x00, 0x02, 0x08, 0x02, 0x00, 0x10, 0xd7,
+ 0xc0, 0xb3, 0x06, 0x92, 0x10, 0xfd, 0xc0, 0xb3, 0xc0, 0x48, 0xcc, 0x72,
+ 0xcc, 0x72, 0xc1, 0x32, 0xcc, 0x44, 0xdc, 0x72, 0x06, 0x04, 0x16, 0xfd,
+ 0x04, 0x5b, 0xc0, 0x48, 0x02, 0x02, 0xe9, 0x90, 0x07, 0x84, 0x00, 0x06,
+ 0x10, 0xf6, 0x02, 0x02, 0xe5, 0xde, 0xc0, 0x49, 0x07, 0x84, 0x00, 0x06,
+ 0x10, 0xf0, 0xc0, 0xb3, 0xc1, 0x32, 0x02, 0x01, 0x00, 0x01, 0xd0, 0x44,
+ 0x06, 0xc1, 0x02, 0x44, 0x00, 0xff, 0x10, 0xe7, 0xc1, 0x33, 0xc0, 0x73,
+ 0xd1, 0x44, 0x02, 0x44, 0x00, 0xff, 0xdc, 0x45, 0x06, 0x04, 0x16, 0xfd,
+ 0x04, 0x5a, 0x06, 0xa0, 0xf0, 0xcc, 0xc8, 0x33, 0x01, 0x9e, 0x04, 0x5a,
+ 0x06, 0xa0, 0xee, 0xca, 0xc1, 0x89, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40,
+ 0xc8, 0x06, 0x01, 0x8a, 0xc1, 0x88, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40,
+ 0xc8, 0x06, 0x01, 0x8c, 0x04, 0xc2, 0xc1, 0xc7, 0x16, 0x03, 0x06, 0x02,
+ 0x16, 0xfc, 0x10, 0x4d, 0x04, 0x5a, 0x06, 0xa0, 0xf0, 0x16, 0xc1, 0x89,
+ 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8a, 0xc1, 0x88,
+ 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8c, 0xc8, 0x33,
+ 0x01, 0x9e, 0x10, 0xe8, 0x8a, 0x33, 0x00, 0x02, 0x16, 0x38, 0x8a, 0x73,
+ 0x00, 0x02, 0x16, 0x35, 0x04, 0x5a, 0x8a, 0x20, 0xe9, 0x8a, 0x00, 0x02,
+ 0x16, 0x30, 0x8a, 0x60, 0xe9, 0x8e, 0x00, 0x02, 0x16, 0x2c, 0x07, 0x82,
+ 0xea, 0x34, 0x10, 0x01, 0xc0, 0xb3, 0x02, 0x04, 0x04, 0x80, 0xd1, 0x52,
+ 0x13, 0x03, 0x9d, 0x32, 0x16, 0x22, 0x10, 0xfb, 0x07, 0x85, 0x80, 0x00,
+ 0xd8, 0x05, 0x04, 0x80, 0x04, 0xc7, 0x04, 0x5a, 0xc8, 0x20, 0x00, 0xc0,
+ 0x00, 0x0c, 0xc8, 0x20, 0x00, 0xc2, 0x00, 0x0e, 0xc8, 0x20, 0x00, 0xc4,
+ 0x00, 0x10, 0xc8, 0x20, 0x00, 0xc6, 0x00, 0x12, 0xc8, 0x20, 0x00, 0xc8,
+ 0x00, 0x14, 0xc8, 0x20, 0x00, 0xca, 0x00, 0x16, 0xc8, 0x20, 0x00, 0xcc,
+ 0x00, 0x04, 0xc8, 0x20, 0x00, 0xce, 0x00, 0x06, 0x03, 0x00, 0x00, 0x0f,
+ 0x05, 0xcc, 0x04, 0x5c, 0x04, 0xe0, 0x01, 0x82, 0x02, 0x02, 0xe5, 0xd8,
+ 0xc8, 0x32, 0x01, 0x82, 0xc8, 0x32, 0x01, 0x80, 0x06, 0xa0, 0xef, 0xe2,
+ 0xc8, 0x12, 0x01, 0x82, 0xc2, 0xca, 0x07, 0x84, 0x07, 0xd0, 0x04, 0xe0,
+ 0x01, 0x84, 0x06, 0x04, 0x16, 0xfc, 0xc1, 0x20, 0x01, 0x84, 0x16, 0xe9,
+ 0x02, 0x04, 0x00, 0x32, 0x07, 0x85, 0x80, 0x00, 0xd8, 0x05, 0x04, 0x80,
+ 0x04, 0xc7, 0xc1, 0x60, 0x01, 0x86, 0x06, 0x04, 0x16, 0xfc, 0xc1, 0x20,
+ 0x01, 0x84, 0x04, 0x5b, 0xc0, 0xb3, 0xc4, 0xb3, 0x04, 0x5b, 0xc0, 0x48,
+ 0xc0, 0xb3, 0xa0, 0x73, 0xc4, 0x42, 0x04, 0x5b, 0x88, 0x33, 0x01, 0x84,
+ 0x16, 0xe6, 0x04, 0x5a, 0xc1, 0x89, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40,
+ 0xc8, 0x06, 0x01, 0x8a, 0x04, 0x5b, 0x04, 0xc5, 0x07, 0xa0, 0x01, 0x9c,
+ 0x00, 0x40, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x13, 0x03, 0x06, 0x05,
+ 0x16, 0xf7, 0x04, 0x5c, 0x04, 0x5b, 0x06, 0xa0, 0xf0, 0x6a, 0xc0, 0x60,
+ 0x01, 0x40, 0xc8, 0x05, 0x01, 0x40, 0xc5, 0x02, 0xc8, 0x01, 0x01, 0x40,
+ 0x04, 0x5a, 0x06, 0xa0, 0xf0, 0x6a, 0xa1, 0x08, 0x10, 0xf4, 0xc0, 0xb3,
+ 0xc1, 0x33, 0xc1, 0x60, 0x01, 0x40, 0x01, 0x85, 0x04, 0x00, 0x01, 0xc5,
+ 0x10, 0x00, 0x04, 0x5b, 0xc1, 0x08, 0xc2, 0x09, 0xc2, 0x44, 0x04, 0x5b,
+ 0x02, 0x05, 0x00, 0xc8, 0x06, 0x05, 0x16, 0xfe, 0x04, 0x5b, 0xc1, 0x33,
+ 0xc0, 0x03, 0xc0, 0xc4, 0x04, 0x5b, 0xc0, 0xc0, 0x04, 0x5b, 0x94, 0xe0,
+ 0x01, 0x9e, 0x16, 0xc2, 0x05, 0xc3, 0x04, 0x5b, 0xc0, 0x73, 0x06, 0xa0,
+ 0xf0, 0xe4, 0x02, 0x2d, 0x00, 0x08, 0x07, 0x85, 0x00, 0x08, 0x9f, 0x71,
+ 0x16, 0xb7, 0x06, 0x05, 0x16, 0xfc, 0x04, 0x5a, 0x02, 0x02, 0xe5, 0xe4,
+ 0x04, 0x60, 0xee, 0xce, 0x8c, 0xe9, 0x00, 0x04, 0x16, 0xad, 0x04, 0x5b,
+ 0xc1, 0x20, 0x01, 0x80, 0x07, 0x85, 0x07, 0xd0, 0x01, 0xe0, 0x01, 0x80,
+ 0x04, 0x00, 0x06, 0x45, 0x16, 0xfe, 0xc8, 0x04, 0x01, 0x80, 0x04, 0x5b,
+ 0xc1, 0x33, 0xc3, 0x48, 0xc1, 0x04, 0x13, 0x04, 0x02, 0x2d, 0x04, 0x00,
+ 0x06, 0x04, 0x16, 0xfc, 0x04, 0x5b, 0xc3, 0x8d, 0x06, 0xa0, 0xf0, 0xe4,
+ 0xc1, 0x8d, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc7, 0x86, 0x04, 0x5a,
+ 0xc1, 0x8d, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06, 0x01, 0x8a,
+ 0x04, 0x5b, 0xc1, 0x8d, 0x09, 0xa6, 0x02, 0x66, 0x00, 0x40, 0xc8, 0x06,
+ 0x01, 0x8c, 0x04, 0x5b, 0xc0, 0x4d, 0x02, 0x04, 0x00, 0x28, 0x07, 0x85,
+ 0x55, 0x00, 0x04, 0x60, 0xee, 0xf2, 0xc0, 0x4d, 0xc0, 0xb3, 0xc1, 0x32,
+ 0x04, 0x60, 0xee, 0xb6, 0xc1, 0x33, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04,
+ 0x16, 0x01, 0x04, 0x5b, 0xc0, 0xc4, 0x04, 0x5b, 0x07, 0x89, 0xe5, 0x26,
+ 0xc2, 0x39, 0x13, 0x07, 0xc6, 0x39, 0x86, 0x39, 0x16, 0x25, 0xc6, 0x39,
+ 0x86, 0x39, 0x16, 0x22, 0x10, 0xf7, 0x02, 0x02, 0xf1, 0x6a, 0x04, 0xc4,
+ 0x04, 0xc5, 0xc2, 0x39, 0x13, 0x02, 0x04, 0x60, 0xf1, 0xa6, 0x02, 0x02,
+ 0xf1, 0x78, 0x04, 0xc4, 0xc2, 0x39, 0x13, 0x03, 0xc1, 0x79, 0x04, 0x60,
+ 0xf1, 0xa6, 0x02, 0x02, 0xf1, 0x88, 0x04, 0xc5, 0xc2, 0x39, 0x13, 0x03,
+ 0xc1, 0x39, 0x04, 0x60, 0xf1, 0xa6, 0xc0, 0x79, 0xc0, 0xb9, 0x60, 0x81,
+ 0x05, 0xc2, 0x09, 0x12, 0x04, 0xf1, 0x06, 0x02, 0x16, 0xfd, 0x04, 0x5b,
+ 0x04, 0x5c, 0x02, 0x01, 0xaa, 0xaa, 0xc6, 0x01, 0xe0, 0x44, 0x40, 0x45,
+ 0x80, 0x58, 0x16, 0xf8, 0x02, 0x01, 0x00, 0x14, 0x06, 0x01, 0x16, 0xfe,
+ 0x02, 0x01, 0x55, 0x55, 0xc6, 0x01, 0xe0, 0x44, 0x40, 0x45, 0x80, 0x58,
+ 0x16, 0xed, 0x04, 0x52, 0x02, 0xe0, 0x00, 0xa0, 0x07, 0x88, 0x00, 0xc0,
+ 0x02, 0x09, 0xf2, 0x20, 0x07, 0x84, 0xe5, 0xea, 0x02, 0x05, 0x00, 0x01,
+ 0xc2, 0x8b, 0x04, 0xcc, 0x06, 0xa0, 0xf2, 0x2a, 0x2c, 0x60, 0x00, 0x01,
+ 0x06, 0x99, 0x2c, 0xa0, 0x00, 0x02, 0x06, 0x99, 0x2d, 0x20, 0x00, 0x04,
+ 0x06, 0x99, 0x2e, 0x20, 0x00, 0x08, 0x06, 0x99, 0x2f, 0xa0, 0x00, 0x10,
+ 0x05, 0x8c, 0x16, 0x09, 0xcc, 0x80, 0xc4, 0x81, 0x07, 0x83, 0xf2, 0x6e,
+ 0xc0, 0x88, 0x04, 0x02, 0x05, 0x8c, 0x16, 0x01, 0x10, 0x33, 0x02, 0xe0,
+ 0x00, 0xa0, 0x04, 0x5a, 0x05, 0x8c, 0x16, 0xfb, 0xcc, 0x80, 0xc4, 0x81,
+ 0x0a, 0x15, 0xc0, 0xb4, 0xc0, 0x12, 0xcc, 0x88, 0xc0, 0x52, 0xc4, 0xb4,
+ 0x06, 0x42, 0x04, 0x5b, 0x07, 0x2d, 0x00, 0x18, 0x8b, 0x41, 0x00, 0x0a,
+ 0x16, 0xec, 0x82, 0xc1, 0x16, 0xea, 0x02, 0xc2, 0x02, 0x42, 0x02, 0x00,
+ 0x16, 0xe6, 0x03, 0x80, 0x07, 0x81, 0x00, 0x01, 0x10, 0xf1, 0x02, 0x01,
+ 0x00, 0x02, 0x10, 0xee, 0x02, 0x01, 0x00, 0x04, 0x10, 0xeb, 0x02, 0x01,
+ 0x00, 0x08, 0x10, 0xe8, 0x02, 0x01, 0x00, 0x10, 0x10, 0xe5, 0x02, 0xa1,
+ 0x8b, 0x41, 0x00, 0x10, 0x13, 0x02, 0x04, 0x60, 0xf2, 0x1a, 0x07, 0x2d,
+ 0x00, 0x18, 0x03, 0x80, 0x02, 0x09, 0x08, 0x00, 0x02, 0x03, 0x00, 0x04,
+ 0x04, 0xc7, 0x06, 0xa0, 0xf3, 0x9a, 0x01, 0x60, 0x01, 0x1c, 0x00, 0x04,
+ 0x16, 0x1c, 0x01, 0xa0, 0x01, 0x40, 0x08, 0x00, 0x01, 0xe0, 0x01, 0x40,
+ 0x10, 0x00, 0x02, 0x04, 0x00, 0x01, 0xce, 0x44, 0x06, 0xc4, 0xc6, 0x44,
+ 0x01, 0xa0, 0x01, 0x40, 0x10, 0x00, 0x06, 0x49, 0x01, 0xa0, 0x01, 0x40,
+ 0x40, 0x00, 0x01, 0xe0, 0x01, 0x40, 0x04, 0x00, 0x01, 0xe0, 0x01, 0x40,
+ 0x08, 0x00, 0x06, 0xa0, 0xf4, 0x38, 0x06, 0xa0, 0xf4, 0x38, 0x05, 0xc7,
+ 0x02, 0x04, 0xe4, 0xa4, 0x04, 0xe0, 0x03, 0xd0, 0xc1, 0x74, 0xc1, 0xb4,
+ 0x05, 0x86, 0x13, 0x1c, 0x02, 0xe0, 0x00, 0xc0, 0x02, 0x00, 0x00, 0x00,
+ 0xc0, 0x40, 0xc0, 0x80, 0xc0, 0xc0, 0xc1, 0x00, 0xc1, 0x40, 0xc1, 0x80,
+ 0xc1, 0xc0, 0xc2, 0x00, 0xc2, 0x40, 0xc2, 0x80, 0xc2, 0xc0, 0xc3, 0x00,
+ 0xc3, 0x40, 0xc3, 0x80, 0xc3, 0xc0, 0x04, 0xa0, 0x00, 0xaa, 0x03, 0xd0,
+ 0x03, 0xd0, 0x10, 0x3f, 0x05, 0x85, 0x81, 0x85, 0x13, 0xe1, 0x10, 0xe4,
+ 0x05, 0xc7, 0x02, 0x05, 0x7f, 0xff, 0xa1, 0x45, 0x03, 0xd0, 0x03, 0xd0,
+ 0x10, 0x34, 0xcc, 0xc0, 0xc4, 0xc1, 0x02, 0x03, 0x00, 0x28, 0x06, 0xa0,
+ 0xf3, 0x9a, 0x01, 0xe0, 0x01, 0x42, 0x10, 0x00, 0x05, 0xc7, 0x03, 0xd0,
+ 0x03, 0xd0, 0x10, 0x27, 0x05, 0xc7, 0xc1, 0xa0, 0x01, 0x4a, 0x07, 0xa0,
+ 0x01, 0x4a, 0x0e, 0x00, 0x01, 0xa0, 0x01, 0x40, 0x02, 0x00, 0x07, 0x20,
+ 0x01, 0x44, 0xc1, 0x60, 0x01, 0x44, 0x02, 0x85, 0xff, 0x00, 0x16, 0x17,
+ 0x01, 0xe0, 0x01, 0x40, 0x22, 0x00, 0x02, 0x05, 0x00, 0xc0, 0x06, 0x05,
+ 0x03, 0xd0, 0x16, 0xfd, 0xc1, 0x60, 0x01, 0x46, 0x02, 0x85, 0xff, 0x00,
+ 0x13, 0x0a, 0x02, 0x05, 0x33, 0x93, 0x06, 0x05, 0x00, 0x00, 0xf3, 0x80,
+ 0x00, 0x0b, 0x10, 0x00, 0x00, 0x00, 0xf3, 0x8a, 0x04, 0x9c, 0x03, 0xd0,
+ 0x16, 0xf8, 0x10, 0x51, 0xc8, 0x06, 0x01, 0x4a, 0xcc, 0xc0, 0xc4, 0xc1,
+ 0x10, 0x4b, 0xc0, 0x13, 0xcc, 0xc8, 0xc0, 0x53, 0x02, 0x02, 0xf3, 0xaa,
+ 0xc4, 0xc2, 0x06, 0x43, 0x04, 0x5b, 0xc0, 0x60, 0x00, 0xae, 0x02, 0xc4,
+ 0x02, 0x44, 0x00, 0x0f, 0x88, 0x44, 0xe4, 0x8a, 0x16, 0x3c, 0x02, 0x81,
+ 0x00, 0x08, 0x13, 0x27, 0xc1, 0x21, 0xe4, 0x9c, 0xc1, 0x14, 0x21, 0x21,
+ 0xe4, 0x7a, 0x16, 0x33, 0xc1, 0x21, 0xe4, 0x82, 0x02, 0x81, 0x00, 0x00,
+ 0x13, 0x0b, 0x02, 0x0d, 0x00, 0xa0, 0x83, 0x84, 0x13, 0x09, 0x05, 0xc4,
+ 0x83, 0x84, 0x13, 0x06, 0x05, 0xc4, 0x83, 0x84, 0x13, 0x03, 0x10, 0x23,
+ 0x81, 0x0e, 0x16, 0x21, 0xc1, 0x21, 0xe4, 0x9c, 0x45, 0x21, 0xe4, 0x7a,
+ 0x01, 0xe0, 0x01, 0x42, 0x10, 0x00, 0x01, 0xa0, 0x01, 0x42, 0x10, 0x00,
+ 0xc3, 0xa1, 0xe4, 0x94, 0x02, 0x0f, 0x00, 0x2f, 0x03, 0x80, 0x01, 0xa0,
+ 0x01, 0x40, 0x02, 0x00, 0x01, 0xa0, 0x01, 0x40, 0x80, 0x00, 0xc0, 0x6d,
+ 0x00, 0x0a, 0x13, 0x09, 0x02, 0x81, 0x12, 0x5c, 0x1b, 0x06, 0x02, 0x0e,
+ 0xf3, 0x90, 0x02, 0x0f, 0x00, 0x0f, 0x03, 0x80, 0x05, 0xca, 0x02, 0xe0,
+ 0x00, 0xa0, 0x04, 0x5a, 0xce, 0x59, 0x88, 0x20, 0xe4, 0xa4, 0xe4, 0xa4,
+ 0x10, 0xf8, 0x04, 0xc1, 0x62, 0x48, 0x05, 0x89, 0xc0, 0xa0, 0x01, 0x6c,
+ 0xc8, 0x08, 0x01, 0x6c, 0x02, 0x03, 0xfc, 0x00, 0x02, 0x04, 0x02, 0x00,
+ 0xa0, 0x73, 0x06, 0x04, 0x16, 0xfd, 0x05, 0x88, 0x06, 0x09, 0x16, 0xf4,
+ 0xc8, 0x02, 0x01, 0x6c, 0x86, 0x81, 0x16, 0x02, 0x03, 0xd0, 0x05, 0xcb,
+ 0x04, 0x5b, 0xc0, 0x48, 0xc0, 0x89, 0x60, 0x81, 0x05, 0xc2, 0x04, 0x5b,
+ 0xc3, 0x0b, 0x06, 0xa0, 0xf4, 0x72, 0xcc, 0x41, 0x06, 0x42, 0x16, 0xfd,
+ 0x06, 0xa0, 0xf4, 0x72, 0xc1, 0x01, 0x8c, 0x44, 0x16, 0x12, 0x05, 0xc4,
+ 0x06, 0x42, 0x16, 0xfb, 0x02, 0x04, 0xf4, 0xb8, 0x02, 0x03, 0x01, 0x01,
+ 0x06, 0x94, 0x02, 0x03, 0x5a, 0x5a, 0x06, 0x94, 0x05, 0x43, 0x06, 0x94,
+ 0x07, 0x03, 0x06, 0x94, 0x04, 0xc3, 0x06, 0x94, 0x05, 0xcc, 0x04, 0x5c,
+ 0xc1, 0xcb, 0x06, 0xa0, 0xf4, 0x72, 0xcc, 0x43, 0x06, 0x42, 0x16, 0xfd,
+ 0x06, 0xa0, 0xf4, 0x72, 0x8c, 0x43, 0x16, 0xf5, 0x06, 0x42, 0x16, 0xfc,
+ 0x04, 0x57, 0xc2, 0x8b, 0xc0, 0x08, 0xc1, 0x49, 0x05, 0x85, 0x02, 0x80,
+ 0x00, 0x40, 0x11, 0x03, 0x02, 0x80, 0x00, 0x4f, 0x12, 0x45, 0x02, 0x01,
+ 0xf4, 0x72, 0x09, 0xa1, 0x80, 0x01, 0x13, 0x40, 0x02, 0x01, 0xf5, 0xa2,
+ 0x09, 0xa1, 0x80, 0x01, 0x13, 0x3b, 0xc0, 0x60, 0x00, 0x06, 0x09, 0xa1,
+ 0x80, 0x01, 0x13, 0x36, 0x05, 0x81, 0x80, 0x01, 0x13, 0x33, 0xc0, 0x4a,
+ 0x09, 0xa1, 0x80, 0x01, 0x13, 0x2f, 0xc8, 0x00, 0x01, 0x6a, 0x02, 0x80,
+ 0x00, 0x80, 0x14, 0x17, 0x02, 0x01, 0xf8, 0x00, 0xc1, 0xa0, 0x01, 0x40,
+ 0x01, 0xa0, 0x01, 0x40, 0x04, 0x00, 0x02, 0x02, 0x10, 0x00, 0x02, 0x03,
+ 0x04, 0x00, 0xcc, 0xb1, 0x06, 0x43, 0x16, 0xfd, 0x01, 0xa0, 0x01, 0x40,
+ 0x40, 0x00, 0x02, 0x08, 0xf8, 0x10, 0xc8, 0x06, 0x01, 0x40, 0xc0, 0x00,
+ 0x13, 0x02, 0x02, 0x08, 0xf8, 0x00, 0x02, 0x09, 0xfb, 0xfe, 0x06, 0xa0,
+ 0xf4, 0x7c, 0x10, 0x25, 0x02, 0x80, 0x00, 0x80, 0x14, 0x09, 0x02, 0x01,
+ 0xf8, 0x00, 0x02, 0x02, 0x10, 0x00, 0x02, 0x03, 0x04, 0x00, 0xcc, 0x72,
+ 0x06, 0x43, 0x16, 0xfd, 0x05, 0x80, 0x02, 0x80, 0x00, 0x80, 0x12, 0x04,
+ 0x01, 0x60, 0x01, 0x04, 0x00, 0x20, 0x13, 0x05, 0x81, 0x40, 0x16, 0xab,
+ 0x02, 0x80, 0x00, 0x80, 0x14, 0x0b, 0x07, 0xa0, 0x01, 0x6a, 0x00, 0x7e,
+ 0x02, 0x02, 0x10, 0x00, 0x02, 0x03, 0x04, 0x00, 0x04, 0xc1, 0xcc, 0x81,
+ 0x06, 0x43, 0x16, 0xfd, 0x05, 0xca, 0x04, 0x5a, 0x02, 0x00, 0xf5, 0x94,
+ 0x02, 0x01, 0xf6, 0xc4, 0x02, 0x40, 0xfc, 0x00, 0x02, 0x41, 0xfc, 0x00,
+ 0x80, 0x40, 0x13, 0x04, 0x07, 0xa0, 0x01, 0x04, 0x00, 0x3c, 0x04, 0x5b,
+ 0x04, 0xc0, 0x02, 0x01, 0x00, 0x08, 0x02, 0x02, 0x12, 0x00, 0xc1, 0xe0,
+ 0x01, 0x40, 0x01, 0xa0, 0x01, 0x40, 0x04, 0x00, 0x02, 0x03, 0x01, 0x00,
+ 0xc8, 0x00, 0x01, 0x6a, 0xcc, 0xa0, 0xf8, 0x10, 0x05, 0x80, 0x06, 0x03,
+ 0x16, 0xf9, 0x02, 0x22, 0x02, 0x00, 0x06, 0x01, 0x16, 0xf3, 0x01, 0xa0,
+ 0x01, 0x40, 0x40, 0x00, 0xc8, 0x07, 0x01, 0x40, 0x02, 0x00, 0x08, 0x00,
+ 0xc0, 0x40, 0x06, 0x01, 0xc8, 0x01, 0x01, 0x6a, 0x02, 0x61, 0x80, 0x00,
+ 0xc8, 0x01, 0xf8, 0x10, 0x06, 0x00, 0x16, 0xf6, 0x04, 0xc0, 0x04, 0xc8,
+ 0x04, 0xc9, 0x02, 0x03, 0x08, 0x00, 0xc8, 0x00, 0x01, 0x6a, 0xc1, 0x80,
+ 0x02, 0x66, 0x80, 0x00, 0xc1, 0x20, 0xf8, 0x10, 0x81, 0x06, 0x16, 0x15,
+ 0xc2, 0x08, 0x13, 0x06, 0x05, 0x80, 0x06, 0x03, 0x16, 0xf2, 0xc2, 0x08,
+ 0x13, 0x0d, 0x10, 0x19, 0x07, 0xa0, 0xf8, 0x10, 0x55, 0x55, 0xc1, 0x20,
+ 0xf8, 0x10, 0x02, 0x84, 0x55, 0x55, 0x16, 0x02, 0xc2, 0x06, 0x10, 0xf0,
+ 0x81, 0x06, 0x13, 0xee, 0x04, 0x5b, 0x07, 0xa0, 0xf8, 0x10, 0x55, 0x55,
+ 0xc1, 0x60, 0xf8, 0x10, 0x81, 0x05, 0x13, 0x03, 0x02, 0x85, 0x55, 0x55,
+ 0x16, 0xf5, 0xc2, 0x08, 0x13, 0xe1, 0xc2, 0x40, 0x06, 0x09, 0x02, 0x48,
+ 0x07, 0xff, 0x04, 0xc0, 0x02, 0x01, 0x00, 0x08, 0x02, 0x02, 0x12, 0x00,
+ 0x02, 0x03, 0x01, 0x00, 0xc8, 0x00, 0x01, 0x6a, 0xc8, 0x32, 0xf8, 0x10,
+ 0x05, 0x80, 0x06, 0x03, 0x16, 0xf9, 0x02, 0x22, 0x02, 0x00, 0x06, 0x01,
+ 0x16, 0xf3, 0x02, 0x88, 0x00, 0x40, 0x15, 0x13, 0x02, 0x89, 0x00, 0x4f,
+ 0x11, 0x10, 0x04, 0xc0, 0x02, 0x02, 0x12, 0x00, 0x02, 0x01, 0x00, 0x08,
+ 0x02, 0x03, 0x01, 0x00, 0xcc, 0x80, 0x06, 0x03, 0x16, 0xfd, 0x02, 0x22,
+ 0x02, 0x00, 0x06, 0x01, 0x16, 0xf7, 0x05, 0xcb, 0x04, 0x5b, 0x07, 0xa0,
+ 0x01, 0x04, 0x00, 0x37, 0x04, 0x5b, 0x28, 0x43, 0x29, 0x31, 0x39, 0x38,
+ 0x33, 0x2d, 0x38, 0x38, 0x20, 0x42, 0x59, 0x20, 0x54, 0x49, 0xc2, 0x4b,
+ 0x02, 0xa8, 0x00, 0x98, 0x07, 0x83, 0x00, 0x02, 0x02, 0x28, 0x00, 0x08,
+ 0xc6, 0x23, 0xe4, 0xf6, 0x06, 0x48, 0xc0, 0xc4, 0x0a, 0x73, 0x17, 0x65,
+ 0x06, 0xa0, 0xf7, 0xc4, 0xc1, 0xc8, 0x05, 0xc7, 0x02, 0x03, 0x00, 0xa5,
+ 0x03, 0xb0, 0xcd, 0xf8, 0xcd, 0xf8, 0x02, 0xa6, 0x62, 0x06, 0x02, 0x88,
+ 0x00, 0x0a, 0x16, 0x57, 0x29, 0x03, 0x16, 0x55, 0x29, 0x05, 0x80, 0xc4,
+ 0x16, 0x52, 0x09, 0x15, 0x17, 0x50, 0x09, 0x15, 0x18, 0x4e, 0x02, 0x85,
+ 0x00, 0x29, 0x16, 0x4b, 0x05, 0xc6, 0x00, 0x96, 0x07, 0x03, 0x04, 0xc4,
+ 0x06, 0x45, 0x00, 0x95, 0x05, 0x44, 0x16, 0x43, 0x81, 0x44, 0x16, 0x41,
+ 0x03, 0x00, 0x00, 0x05, 0x02, 0xc4, 0x03, 0x00, 0x00, 0x0a, 0x02, 0x44,
+ 0x00, 0x0f, 0x02, 0x84, 0x00, 0x05, 0x16, 0x37, 0x02, 0xc4, 0x03, 0x00,
+ 0x00, 0x0f, 0x02, 0x44, 0x00, 0x0f, 0x02, 0x84, 0x00, 0x0a, 0x16, 0x2f,
+ 0x02, 0x04, 0xff, 0xfe, 0x13, 0x2c, 0x15, 0x2b, 0x1a, 0x2a, 0x05, 0x84,
+ 0x12, 0x28, 0x15, 0x27, 0x1a, 0x26, 0x18, 0x25, 0x05, 0x84, 0x16, 0x23,
+ 0x1b, 0x22, 0x17, 0x21, 0x05, 0x84, 0x13, 0x1f, 0x1a, 0x1e, 0x11, 0x1d,
+ 0x06, 0x04, 0x16, 0x1b, 0x02, 0xa5, 0xc1, 0xc5, 0x02, 0x25, 0x00, 0x06,
+ 0x02, 0x03, 0xa5, 0xa5, 0xc1, 0x83, 0x00, 0x95, 0x38, 0x03, 0x00, 0x94,
+ 0x02, 0x83, 0x6b, 0x2e, 0x16, 0x0e, 0x02, 0x84, 0x1c, 0x59, 0x16, 0x0b,
+ 0x02, 0x24, 0x00, 0x69, 0x00, 0x95, 0x3c, 0x03, 0x00, 0x94, 0x81, 0x83,
+ 0x16, 0x04, 0x02, 0x84, 0x00, 0x69, 0x16, 0x01, 0x05, 0xc9, 0x04, 0x59,
+ 0xd0, 0xc3, 0x13, 0xfd, 0x1c, 0x01, 0x10, 0xfb, 0x90, 0xe0, 0xe4, 0xfd,
+ 0x16, 0xf8, 0x06, 0xc3, 0xd0, 0xc3, 0x1c, 0xf5, 0x16, 0xf4, 0x90, 0xe0,
+ 0xe4, 0xfa, 0x16, 0xf1, 0x04, 0x5b, 0xc3, 0x0b, 0x02, 0x09, 0xe4, 0xfe,
+ 0x06, 0xa0, 0xf1, 0x50, 0x05, 0xcc, 0x04, 0x5c, 0x07, 0x88, 0xb0, 0x00,
+ 0x07, 0x89, 0xff, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a, 0xe0, 0x02,
+ 0x06, 0xa0, 0xf4, 0x42, 0x00, 0x00, 0x07, 0x88, 0xa0, 0x00, 0x07, 0x89,
+ 0xaf, 0xfe, 0x09, 0xa8, 0x09, 0xa9, 0x07, 0x8a, 0xe0, 0x78, 0x06, 0xa0,
+ 0xf4, 0x42, 0x00, 0x00, 0x06, 0xa0, 0xf6, 0xde, 0x00, 0x00, 0x10, 0xe6,
+ 0x10, 0xe5, 0x00, 0x00, 0xf8, 0x26, 0x07, 0x93, 0x00, 0x00, 0x00, 0x00,
+ 0xff, 0xb8, 0x00, 0x48, 0x28, 0x43, 0x29, 0x31, 0x39, 0x38, 0x33, 0x2d,
+ 0x38, 0x39, 0x2c, 0x39, 0x30, 0x2d, 0x39, 0x34, 0x20, 0x54, 0x65, 0x78,
+ 0x61, 0x73, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x72, 0x75, 0x6d, 0x65, 0x6e,
+ 0x74, 0x73, 0x0a, 0x28, 0x43, 0x29, 0x31, 0x39, 0x38, 0x33, 0x2c, 0x34,
+ 0x2c, 0x35, 0x2c, 0x36, 0x20, 0x49, 0x42, 0x4d, 0x20, 0x43, 0x6f, 0x72,
+ 0x70, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa0, 0x34, 0xff, 0xb8,
+ 0x00, 0x80, 0xb0, 0x3e, 0x20, 0x00, 0x90, 0x00, 0x0d, 0xd2, 0x45, 0x4f,
+ 0x20, 0x56, 0x32, 0x32, 0x38, 0x2e, 0x31, 0x30, 0x2e, 0x31, 0x38, 0x20,
+ 0x20, 0x28, 0x43, 0x29, 0x20, 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67,
+ 0x68, 0x74, 0x20, 0x4f, 0x6c, 0x69, 0x63, 0x6f, 0x6d, 0x20, 0x31, 0x39,
+ 0x39, 0x38, 0x2e, 0x00, 0x03, 0x00, 0x00, 0x02, 0xc0, 0xa0, 0x01, 0x6a,
+ 0xc3, 0x0e, 0x09, 0xac, 0xc8, 0x0c, 0x01, 0x6a, 0xc3, 0x0e, 0x02, 0x4c,
+ 0x03, 0xff, 0xd8, 0xec, 0xf8, 0x00, 0x13, 0xc0, 0x05, 0x83, 0x02, 0x43,
+ 0x00, 0x3f, 0xd8, 0xec, 0xf8, 0x01, 0x13, 0xc0, 0xc8, 0x02, 0x01, 0x6a,
+ 0x05, 0xce, 0x03, 0x90, 0xef, 0xff, 0x03, 0x80, 0x11, 0x08, 0xc3, 0xbc,
+ 0xdf, 0xbc, 0x06, 0x0d, 0x16, 0xfd, 0x05, 0x8c, 0x01, 0x8c, 0x00, 0x01,
+ 0x10, 0x12, 0xc3, 0xbc, 0xc3, 0xfc, 0x01, 0x8d, 0x80, 0x00, 0x13, 0x0d,
+ 0x01, 0x0d, 0x40, 0x00, 0x16, 0x04, 0xdf, 0x8f, 0x06, 0x0d, 0x16, 0xfd,
+ 0x10, 0x06, 0x01, 0x8d, 0x40, 0x01, 0x13, 0x03, 0xcf, 0x8f, 0x06, 0x4d,
+ 0x16, 0xfd, 0xc3, 0x7c, 0x16, 0xe3, 0x04, 0x5b, 0xc1, 0x60, 0x01, 0x6c,
+ 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c,
+ 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x0e, 0xc8, 0x0d, 0x01, 0x6c,
+ 0x07, 0x0f, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02,
+ 0x88, 0x0f, 0xfc, 0x06, 0x13, 0xf8, 0xd8, 0x20, 0xe0, 0x0a, 0xfc, 0x06,
+ 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x8f, 0xfc, 0x00, 0xc1, 0x5f, 0x13, 0xe0,
+ 0x04, 0xff, 0x07, 0xbf, 0x81, 0x00, 0x07, 0x20, 0xff, 0xfe, 0xc7, 0xc2,
+ 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0,
+ 0x01, 0x03, 0x13, 0xf8, 0xc2, 0x8a, 0x16, 0x23, 0xc8, 0x0d, 0x01, 0x8c,
+ 0xc2, 0xcd, 0xc3, 0x20, 0x01, 0x6c, 0x07, 0x8a, 0x00, 0x01, 0xd2, 0x8e,
+ 0x15, 0x2d, 0x05, 0xa0, 0x10, 0x84, 0x07, 0x8d, 0x01, 0x04, 0x01, 0x5d,
+ 0x21, 0x00, 0x16, 0x03, 0x07, 0x9d, 0xde, 0x8c, 0x10, 0x25, 0x01, 0x5d,
+ 0x01, 0x00, 0x16, 0x22, 0xc3, 0xdd, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f,
+ 0x04, 0x80, 0xc7, 0x4f, 0x01, 0x5d, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xe0,
+ 0x07, 0x78, 0x80, 0x00, 0x10, 0x15, 0xc3, 0xe0, 0x01, 0x6c, 0xc8, 0x09,
+ 0x01, 0x6c, 0x13, 0x08, 0xc8, 0x0d, 0xfc, 0x00, 0xc2, 0x4f, 0x05, 0x87,
+ 0xf1, 0xce, 0xc3, 0x8e, 0x11, 0xda, 0x10, 0x06, 0xc2, 0x0d, 0xc2, 0x4f,
+ 0x07, 0x87, 0x00, 0x01, 0xd1, 0xce, 0x11, 0xd3, 0x05, 0xa0, 0x10, 0x84,
+ 0xc8, 0x06, 0x07, 0x92, 0x07, 0x81, 0x01, 0x0a, 0x01, 0x60, 0x13, 0x0c,
+ 0x10, 0x00, 0x16, 0x04, 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x20, 0xfc, 0x06,
+ 0x03, 0x90, 0xa0, 0x07, 0x02, 0xe0, 0x07, 0x78, 0x06, 0x9b, 0x02, 0xe0,
+ 0x08, 0x5c, 0xcc, 0x66, 0x00, 0x04, 0xcc, 0x43, 0xcc, 0x76, 0xcc, 0x76,
+ 0xc8, 0x44, 0x00, 0x02, 0xc4, 0x45, 0x07, 0xa1, 0xff, 0xee, 0x60, 0x81,
+ 0xc3, 0x45, 0xc0, 0xb6, 0x80, 0xc2, 0x1b, 0x63, 0xc3, 0x96, 0x04, 0xf6,
+ 0x02, 0x46, 0xfe, 0xf8, 0x01, 0x4e, 0x40, 0x00, 0x16, 0x02, 0x04, 0x60,
+ 0x90, 0xaa, 0x07, 0x81, 0x01, 0x0a, 0xa1, 0x02, 0xc0, 0x83, 0x02, 0x22,
+ 0x00, 0x06, 0x60, 0x84, 0x15, 0x25, 0x07, 0x84, 0x00, 0x06, 0xc0, 0x83,
+ 0xc8, 0x05, 0x01, 0x6c, 0xc8, 0x02, 0xfc, 0x04, 0x07, 0xa0, 0xfc, 0x02,
+ 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0xc1, 0x60, 0x01, 0x6c, 0xc8, 0x06,
+ 0x07, 0x92, 0x02, 0xe0, 0x07, 0x78, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c,
+ 0xc8, 0x05, 0x01, 0x6c, 0xc1, 0x60, 0xfc, 0x00, 0x16, 0x16, 0x10, 0xf1,
+ 0xc8, 0x06, 0x07, 0x92, 0x03, 0x90, 0x80, 0x03, 0x02, 0xe0, 0x07, 0x78,
+ 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0x10, 0x0b, 0xc3, 0xe6, 0x00, 0x06,
+ 0x13, 0xf3, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02,
+ 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0xcc, 0x66, 0x00, 0x04, 0xcc, 0x42,
+ 0xcc, 0x76, 0xcc, 0x76, 0xc8, 0x44, 0x00, 0x02, 0xc4, 0x45, 0x07, 0xa1,
+ 0xff, 0xee, 0x60, 0x81, 0x05, 0xa0, 0x10, 0x84, 0x65, 0x82, 0x15, 0x0e,
+ 0xa0, 0xb6, 0xc3, 0x96, 0x04, 0xf6, 0x02, 0x46, 0xfe, 0xf8, 0x01, 0x4e,
+ 0x40, 0x00, 0x16, 0xb1, 0xa0, 0x84, 0x07, 0x84, 0x00, 0x06, 0x60, 0x84,
+ 0x04, 0x60, 0x90, 0xaa, 0x02, 0x26, 0xff, 0xfc, 0xc0, 0x36, 0xc0, 0x76,
+ 0x10, 0x06, 0x02, 0x26, 0xff, 0xfa, 0xc0, 0x36, 0xc0, 0x76, 0xc0, 0x83,
+ 0x65, 0x82, 0x07, 0x84, 0x00, 0x06, 0xa0, 0x42, 0x17, 0x01, 0x05, 0x80,
+ 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x8f, 0xfc, 0x00, 0xc1, 0x7f, 0x16, 0x09,
+ 0xc1, 0x60, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b,
+ 0x02, 0xe0, 0x08, 0x5c, 0x10, 0xf1, 0x07, 0xbf, 0x80, 0x00, 0x04, 0xe0,
+ 0xff, 0xfe, 0xc7, 0xc3, 0xc0, 0xb6, 0xc3, 0x96, 0x04, 0xf6, 0x02, 0x46,
+ 0xfe, 0xf8, 0x27, 0xa0, 0x08, 0x98, 0x13, 0x0d, 0xc3, 0xc5, 0xc8, 0x0e,
+ 0x08, 0x8e, 0xc3, 0xa0, 0x08, 0x90, 0xc0, 0xee, 0xff, 0xfe, 0x05, 0xa0,
+ 0x08, 0xa0, 0x16, 0x32, 0x05, 0xa0, 0x08, 0x9e, 0x10, 0x2f, 0x07, 0x83,
+ 0x03, 0xf8, 0x06, 0x20, 0x08, 0x9c, 0x13, 0x02, 0x04, 0x60, 0x95, 0x0c,
+ 0xc3, 0xe0, 0x08, 0x9a, 0x83, 0xe0, 0x08, 0x98, 0x13, 0x08, 0xc8, 0x0f,
+ 0x08, 0x98, 0x04, 0xe0, 0x08, 0x9e, 0x04, 0xe0, 0x08, 0xa0, 0x27, 0x8f,
+ 0x16, 0xdf, 0x04, 0x60, 0x95, 0x0c, 0xc8, 0x0f, 0x01, 0x6c, 0x07, 0xa0,
+ 0xfc, 0x02, 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0, 0xfc, 0x04,
+ 0xc8, 0x3e, 0xfc, 0x06, 0xc3, 0xe0, 0xfc, 0x00, 0x16, 0x0b, 0xc3, 0xe0,
+ 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0,
+ 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c, 0x10, 0xf2, 0x60, 0x9e, 0x87, 0x82,
+ 0x15, 0xe4, 0xa0, 0x9e, 0x02, 0x82, 0x00, 0xe0, 0x15, 0x1b, 0x02, 0x82,
+ 0x00, 0x70, 0x15, 0x35, 0xc3, 0xa0, 0x08, 0x8e, 0x03, 0x00, 0x00, 0x0f,
+ 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8,
+ 0x07, 0x8f, 0x01, 0x0a, 0xcf, 0xc2, 0x07, 0x3f, 0xcf, 0xc0, 0xcf, 0xc1,
+ 0xcb, 0xc4, 0x00, 0x02, 0xc7, 0xc5, 0x07, 0xaf, 0xff, 0xee, 0x60, 0x81,
+ 0x04, 0x60, 0x90, 0xaa, 0xc8, 0x0f, 0x01, 0x6c, 0x07, 0xa0, 0xfc, 0x02,
+ 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0, 0xfc, 0x04, 0xc3, 0xc2,
+ 0x09, 0x2f, 0xa3, 0xcf, 0xc8, 0x0f, 0xfc, 0x06, 0x60, 0x8f, 0xc3, 0xe0,
+ 0xfc, 0x00, 0x16, 0x0b, 0xc3, 0xe0, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78,
+ 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c,
+ 0x10, 0xf2, 0xc8, 0x0f, 0x01, 0x6c, 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00,
+ 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0, 0xfc, 0x04, 0x01, 0xc2, 0x80, 0x00,
+ 0xc8, 0x02, 0xfc, 0x06, 0xc3, 0xe0, 0xfc, 0x00, 0x16, 0x0b, 0xc3, 0xe0,
+ 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0,
+ 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c, 0x10, 0xf2, 0xc8, 0x0f, 0x01, 0x6c,
+ 0x07, 0xa0, 0xfc, 0x02, 0x80, 0x00, 0x04, 0xe0, 0xff, 0xfe, 0x04, 0xe0,
+ 0xfc, 0x04, 0xc3, 0x8f, 0xc3, 0xe0, 0xfc, 0x00, 0x16, 0x0b, 0xc3, 0xe0,
+ 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd, 0x06, 0x9b, 0x02, 0xe0,
+ 0x08, 0x5c, 0xc8, 0x0f, 0x01, 0x6c, 0x10, 0xf2, 0xc8, 0x05, 0x01, 0x6c,
+ 0xc0, 0xa0, 0xfc, 0x06, 0x15, 0x0f, 0x01, 0x82, 0x80, 0x00, 0xc3, 0xc2,
+ 0x06, 0x0f, 0x01, 0x8f, 0x00, 0x01, 0xc8, 0x0f, 0x08, 0x5a, 0xc8, 0x0f,
+ 0xfc, 0x04, 0x63, 0xc2, 0x05, 0x0f, 0xc8, 0x0f, 0x08, 0x58, 0x10, 0x05,
+ 0x07, 0xa0, 0x00, 0x1a, 0x95, 0x3e, 0xc8, 0x02, 0xfc, 0x04, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0x04, 0xe0, 0x01, 0x02, 0x07, 0x8f, 0x01, 0x0a, 0x07, 0x3f,
+ 0xcf, 0xc2, 0xcf, 0xc0, 0xcf, 0xc1, 0xcb, 0xc4, 0x00, 0x02, 0xc7, 0xc5,
+ 0x07, 0xaf, 0xff, 0xee, 0x68, 0x81, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00,
+ 0x16, 0x05, 0xc8, 0x0d, 0x01, 0x6c, 0xd8, 0x20, 0xe0, 0x0a, 0xfc, 0x06,
+ 0xc2, 0x8a, 0x16, 0x13, 0xc8, 0x0d, 0x01, 0x8c, 0xc2, 0xcd, 0xc3, 0x0e,
+ 0x07, 0x8a, 0x00, 0x01, 0xc3, 0xa0, 0x08, 0x8e, 0xd2, 0x8e, 0x03, 0x00,
+ 0x00, 0x0f, 0x01, 0x60, 0x01, 0x00, 0x08, 0x00, 0x13, 0xfc, 0x03, 0x00,
+ 0x00, 0x02, 0x04, 0x60, 0x91, 0x54, 0xc8, 0x09, 0x01, 0x6c, 0x13, 0x08,
+ 0xc8, 0x0d, 0xfc, 0x00, 0xc2, 0x4e, 0x05, 0x87, 0xc3, 0xa0, 0x08, 0x8e,
+ 0xf1, 0xce, 0x10, 0xeb, 0xc2, 0x0d, 0xc2, 0x4e, 0x07, 0x87, 0x00, 0x01,
+ 0xc3, 0xa0, 0x08, 0x8e, 0xd1, 0xce, 0x10, 0xe3, 0xa0, 0x43, 0x17, 0x01,
+ 0x05, 0x80, 0xc8, 0x05, 0x01, 0x6c, 0x07, 0x8f, 0xfc, 0x00, 0xc1, 0x7f,
+ 0x16, 0x09, 0xc1, 0x60, 0x01, 0x6c, 0x02, 0xe0, 0x07, 0x78, 0x04, 0xcd,
+ 0x06, 0x9b, 0x02, 0xe0, 0x08, 0x5c, 0x10, 0xf1, 0x07, 0xbf, 0x80, 0x00,
+ 0x04, 0xe0, 0xff, 0xfe, 0xc7, 0xc3, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0,
+ 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x07, 0x8f,
+ 0x01, 0x0a, 0xcf, 0xc2, 0xcf, 0xc3, 0xcf, 0xc0, 0xcf, 0xc1, 0xcb, 0xc4,
+ 0x00, 0x02, 0xc7, 0xc5, 0x07, 0xaf, 0xff, 0xee, 0x60, 0x81, 0x60, 0x83,
+ 0x15, 0xd3, 0xa0, 0x83, 0x04, 0x60, 0x91, 0xb6, 0x03, 0x00, 0x00, 0x02,
+ 0xc8, 0x0c, 0x01, 0x6a, 0xc3, 0x20, 0xf8, 0x00, 0xc8, 0x0c, 0x01, 0x6a,
+ 0xc1, 0xa0, 0xf8, 0x06, 0x11, 0x10, 0xc8, 0x06, 0xf8, 0x04, 0x04, 0xe4,
+ 0xff, 0xf6, 0xcd, 0x06, 0x02, 0x24, 0x00, 0x04, 0xc9, 0x0b, 0x00, 0x02,
+ 0xc5, 0x0c, 0x07, 0xa4, 0xff, 0xee, 0x68, 0x81, 0x03, 0x90, 0x0a, 0x07,
+ 0x03, 0x80, 0x01, 0x86, 0x80, 0x00, 0xc1, 0x46, 0x06, 0x06, 0x01, 0x86,
+ 0x00, 0x01, 0xc8, 0x06, 0xf8, 0x04, 0x04, 0xe4, 0xff, 0xf6, 0xcd, 0x05,
+ 0x02, 0x24, 0x00, 0x04, 0xc9, 0x0b, 0x00, 0x02, 0xc5, 0x0c, 0x07, 0xa4,
+ 0xff, 0xee, 0x68, 0x81, 0x61, 0x46, 0x07, 0xa0, 0x00, 0x1a, 0x95, 0xa8,
+ 0x03, 0x90, 0x08, 0x07, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02, 0xc8, 0x0c,
+ 0x01, 0x6a, 0xc1, 0xa6, 0xf8, 0x06, 0xc3, 0x20, 0xf8, 0x00, 0xc8, 0x0c,
+ 0x01, 0x6a, 0xc8, 0x06, 0xf8, 0x06, 0xc8, 0x05, 0xf8, 0x04, 0xc3, 0x20,
+ 0xf8, 0x00, 0x04, 0xe0, 0xf8, 0x00, 0x07, 0xa0, 0xf8, 0x02, 0x81, 0x00,
+ 0x07, 0x20, 0xfb, 0xfe, 0x07, 0xa0, 0x01, 0x00, 0x20, 0x81, 0x03, 0x90,
+ 0x02, 0x07, 0x03, 0x80, 0xc2, 0x84, 0xc3, 0x0a, 0xc8, 0x0a, 0x01, 0x6a,
+ 0x01, 0x20, 0xf8, 0x02, 0x81, 0x00, 0x13, 0x09, 0x01, 0x20, 0xf8, 0x02,
+ 0xfe, 0x00, 0x16, 0x0a, 0xc2, 0xa0, 0xf8, 0x00, 0x16, 0xf2, 0x06, 0xa0,
+ 0x97, 0xb6, 0xc2, 0xa0, 0xf8, 0x00, 0x16, 0xee, 0x06, 0xa0, 0x97, 0xb6,
+ 0xc2, 0xa0, 0xf8, 0x02, 0x11, 0x09, 0x01, 0x0a, 0x02, 0x00, 0x16, 0x55,
+ 0x01, 0x0a, 0x14, 0x00, 0x13, 0x5f, 0x01, 0x4a, 0x10, 0x00, 0x16, 0x33,
+ 0x07, 0x0a, 0x26, 0xa0, 0x08, 0x9e, 0x16, 0x02, 0xc2, 0xa0, 0x08, 0xa0,
+ 0x09, 0x5a, 0x05, 0x0a, 0x02, 0x2a, 0x08, 0x10, 0xc8, 0x0a, 0x08, 0x9c,
+ 0x04, 0xe0, 0x08, 0x98, 0x07, 0x8a, 0x7f, 0xfe, 0x98, 0x0a, 0x07, 0x2c,
+ 0x13, 0x0a, 0x98, 0x0a, 0x07, 0x20, 0x13, 0x07, 0x06, 0xca, 0x98, 0x0a,
+ 0x07, 0x2c, 0x13, 0x03, 0x98, 0x0a, 0x07, 0x20, 0x16, 0x0a, 0x01, 0xe0,
+ 0x06, 0xd2, 0x08, 0x00, 0x01, 0xe0, 0x06, 0x34, 0x08, 0x00, 0x04, 0xe0,
+ 0x06, 0x30, 0x04, 0xcb, 0x10, 0x0c, 0x07, 0x8a, 0x01, 0x00, 0xb8, 0x0a,
+ 0x07, 0x2c, 0x17, 0x02, 0x78, 0x0a, 0x07, 0x2c, 0xb8, 0x0a, 0x07, 0x20,
+ 0x17, 0x02, 0x78, 0x0a, 0x07, 0x20, 0xc2, 0xa0, 0xfb, 0xfe, 0x02, 0x4a,
+ 0x01, 0x00, 0x01, 0xca, 0x80, 0x00, 0xc8, 0x0a, 0xf8, 0x02, 0xc8, 0x0c,
+ 0x01, 0x6a, 0xc2, 0xa0, 0xf8, 0x02, 0x11, 0x07, 0x07, 0xa0, 0xf8, 0x02,
+ 0x80, 0x00, 0xc8, 0x20, 0xf8, 0x00, 0x01, 0x6a, 0x10, 0xf6, 0x07, 0x8a,
+ 0x01, 0x8c, 0xc6, 0x8c, 0xc2, 0xcb, 0x03, 0x90, 0xff, 0xdf, 0x13, 0x32,
+ 0x03, 0x80, 0x01, 0x4a, 0x06, 0x00, 0x13, 0x0a, 0x01, 0xe0, 0x06, 0xd2,
+ 0x02, 0x00, 0x01, 0xe0, 0x06, 0x34, 0x08, 0x00, 0x04, 0xe0, 0x06, 0x30,
+ 0x01, 0xcb, 0x00, 0x01, 0x88, 0x05, 0x01, 0x6a, 0x13, 0x1a, 0xc3, 0x20,
+ 0xfb, 0xfe, 0x16, 0x08, 0x04, 0xe0, 0xf8, 0x02, 0xc8, 0x20, 0xf8, 0x00,
+ 0x01, 0x6a, 0x16, 0xf4, 0x06, 0xa0, 0x97, 0xb6, 0xd2, 0xa0, 0xe0, 0x12,
+ 0xc8, 0x0a, 0xf8, 0x02, 0xc3, 0x20, 0xf8, 0x00, 0x13, 0x06, 0xc2, 0xa0,
+ 0xf8, 0x02, 0x11, 0xd3, 0xc2, 0x8c, 0x04, 0x60, 0x95, 0xe6, 0x06, 0xa0,
+ 0x97, 0xb6, 0xc8, 0x0a, 0xf8, 0x02, 0x07, 0x8a, 0x01, 0x8c, 0x01, 0x4b,
+ 0x00, 0x01, 0x04, 0x5b, 0x07, 0x8b, 0x00, 0xda, 0xce, 0xcd, 0xce, 0xce,
+ 0xc6, 0xcf, 0x02, 0xe0, 0x00, 0xc0, 0x04, 0x54, 0x06, 0xa0, 0x95, 0xe2,
+ 0x16, 0x25, 0xc0, 0x82, 0x13, 0x0b, 0xc6, 0x81, 0xc8, 0x09, 0x01, 0x6a,
+ 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0xc1, 0x01, 0xc1, 0x42, 0x04, 0xc2,
+ 0xc0, 0xc0, 0x10, 0xe8, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00,
+ 0xc2, 0x45, 0x04, 0xc3, 0x10, 0xe1, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80,
+ 0x03, 0x00, 0x00, 0x02, 0x86, 0x8a, 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00,
+ 0x16, 0xf6, 0x86, 0x8a, 0xc8, 0x05, 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x02,
+ 0xfe, 0x00, 0x16, 0xd8, 0xc0, 0x82, 0x13, 0x0d, 0xc6, 0x81, 0xc8, 0x09,
+ 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0xc1, 0x01, 0xc1, 0x42,
+ 0x04, 0xc2, 0xc0, 0xc0, 0x03, 0x90, 0x00, 0x1f, 0x03, 0x80, 0xc8, 0x09,
+ 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x04, 0xc3, 0x03, 0x90,
+ 0x00, 0x1f, 0x03, 0x80, 0x02, 0xe0, 0x08, 0x6a, 0xc2, 0x8b, 0x02, 0x2a,
+ 0xff, 0xfc, 0x04, 0x60, 0xb3, 0x8a, 0xc0, 0x82, 0x13, 0x07, 0xc6, 0x81,
+ 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x10, 0x06,
+ 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x04, 0xc0,
+ 0x06, 0xa0, 0x99, 0x16, 0xc0, 0xc0, 0xc1, 0x01, 0xc1, 0x42, 0x04, 0xc2,
+ 0x10, 0x9b, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x03, 0x00, 0x00, 0x02,
+ 0x86, 0x8a, 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00, 0x16, 0xf6, 0x86, 0x8a,
+ 0xc8, 0x05, 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x02, 0xfe, 0x00, 0x13, 0x03,
+ 0x06, 0xa0, 0x95, 0xe2, 0x13, 0xd6, 0xc0, 0x82, 0x13, 0x07, 0xc6, 0x81,
+ 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x10, 0x06,
+ 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45, 0x04, 0xc0,
+ 0x06, 0xa0, 0x99, 0x16, 0xc0, 0xc0, 0xc1, 0x01, 0xc1, 0x42, 0x04, 0xc2,
+ 0x03, 0x90, 0x00, 0x1f, 0x03, 0x80, 0x03, 0x90, 0xff, 0xff, 0x03, 0x80,
+ 0x03, 0x00, 0x00, 0x02, 0x88, 0x08, 0x01, 0x8c, 0x01, 0x60, 0x01, 0x9c,
+ 0x40, 0x00, 0x16, 0xf5, 0x88, 0x08, 0x01, 0x8c, 0xc0, 0xe0, 0x01, 0x6c,
+ 0xc2, 0x20, 0x05, 0xf4, 0x13, 0x02, 0x04, 0x60, 0xb9, 0x4c, 0x02, 0xe0,
+ 0x08, 0x6a, 0x01, 0x03, 0x00, 0xff, 0x13, 0x11, 0x01, 0x43, 0x04, 0x00,
+ 0x13, 0x0e, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04, 0xf8, 0x00, 0xc2, 0x45,
+ 0xc1, 0x60, 0x08, 0x96, 0x02, 0x85, 0x97, 0xf6, 0x16, 0x02, 0x06, 0xa0,
+ 0x99, 0x16, 0x02, 0x43, 0x03, 0x00, 0x02, 0xe0, 0x00, 0xe0, 0x01, 0x20,
+ 0x08, 0x70, 0x01, 0x00, 0x16, 0x2f, 0xc2, 0x20, 0x05, 0xf4, 0x16, 0x2c,
+ 0xc2, 0x60, 0x05, 0xf0, 0x13, 0x12, 0xc8, 0x19, 0x05, 0xf0, 0xc2, 0xa9,
+ 0x00, 0x0a, 0x11, 0x02, 0xf2, 0xa0, 0x09, 0x2e, 0xd8, 0x0a, 0x01, 0x80,
+ 0xc8, 0x29, 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16, 0x00, 0x04,
+ 0xc8, 0x09, 0x05, 0xf4, 0x10, 0x17, 0x02, 0xe0, 0x08, 0x6a, 0x01, 0x83,
+ 0x06, 0x00, 0x16, 0x05, 0xc1, 0x42, 0x13, 0x08, 0xc0, 0xc0, 0xc1, 0x01,
+ 0x04, 0xc2, 0xd8, 0x20, 0x09, 0x2e, 0x01, 0x80, 0xc8, 0x04, 0x01, 0x8c,
+ 0x02, 0xe0, 0x00, 0xe0, 0x07, 0xa0, 0x00, 0x14, 0x08, 0x6a, 0xc8, 0x20,
+ 0x08, 0x96, 0x00, 0x16, 0xc8, 0x03, 0x01, 0x6c, 0x11, 0x03, 0x03, 0x90,
+ 0x11, 0xff, 0x03, 0x80, 0x04, 0x60, 0xb9, 0xc0, 0xc8, 0x04, 0x01, 0x6a,
+ 0x10, 0x03, 0xc8, 0x20, 0xf8, 0x00, 0x01, 0x6a, 0xc3, 0x20, 0xf8, 0x02,
+ 0x01, 0x4c, 0x01, 0x00, 0x16, 0xf8, 0xc1, 0x60, 0x10, 0x86, 0x02, 0x45,
+ 0x00, 0x1f, 0x06, 0xcc, 0xd9, 0x4c, 0x10, 0x88, 0x13, 0x0d, 0x05, 0xa0,
+ 0x10, 0x86, 0x06, 0x03, 0x01, 0x03, 0x00, 0xff, 0x13, 0x52, 0xc1, 0x20,
+ 0xf8, 0x00, 0xc8, 0x04, 0x01, 0x6a, 0x16, 0xe8, 0x06, 0xa0, 0x97, 0xb6,
+ 0x01, 0x0c, 0x00, 0xfe, 0x16, 0xf0, 0xc3, 0x20, 0x01, 0x6a, 0xc8, 0x04,
+ 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x0e, 0x80, 0x00, 0x13, 0x07, 0xc1, 0x20,
+ 0xf8, 0x14, 0x01, 0x84, 0x60, 0xff, 0x02, 0x84, 0x02, 0x00, 0x1b, 0x33,
+ 0xc1, 0x20, 0xf8, 0x08, 0x11, 0x0c, 0x88, 0x20, 0xf8, 0x0c, 0x01, 0xa4,
+ 0x16, 0x2f, 0x88, 0x20, 0xf8, 0x0a, 0x01, 0xa2, 0x16, 0x2b, 0x88, 0x04,
+ 0x01, 0xa0, 0x13, 0x25, 0x10, 0x27, 0xc1, 0x20, 0xf8, 0x0a, 0x11, 0x09,
+ 0x25, 0x20, 0x01, 0xac, 0x16, 0x1e, 0xc1, 0x20, 0xf8, 0x0c, 0x25, 0x20,
+ 0x01, 0xae, 0x16, 0x19, 0x10, 0x1b, 0x02, 0x84, 0xff, 0xff, 0x16, 0x0a,
+ 0x88, 0x04, 0xf8, 0x0c, 0x16, 0x07, 0x41, 0x20, 0xf8, 0x08, 0x13, 0x0f,
+ 0x02, 0x84, 0x3f, 0xff, 0x13, 0x0c, 0x10, 0x0e, 0x88, 0x04, 0x01, 0xa8,
+ 0x16, 0x0b, 0x88, 0x20, 0xf8, 0x0c, 0x01, 0xaa, 0x16, 0x07, 0x88, 0x20,
+ 0xf8, 0x08, 0x01, 0xa6, 0x16, 0x03, 0xd9, 0x60, 0xee, 0xa8, 0x10, 0x88,
+ 0xc8, 0x0c, 0x01, 0x6a, 0x10, 0xa8, 0x01, 0x43, 0x20, 0x00, 0x16, 0x07,
+ 0x07, 0x85, 0x01, 0x04, 0x01, 0x55, 0x21, 0x00, 0x16, 0x03, 0x07, 0x95,
+ 0xde, 0x8c, 0x04, 0x5b, 0x01, 0x55, 0x01, 0x00, 0x16, 0xfc, 0xc1, 0x15,
+ 0x01, 0xc4, 0xff, 0x00, 0x01, 0x84, 0x04, 0x80, 0xc5, 0x44, 0x01, 0x55,
+ 0x20, 0x00, 0x13, 0xf1, 0x01, 0xe0, 0x07, 0x78, 0x80, 0x00, 0x04, 0x5b,
+ 0x03, 0x00, 0x00, 0x02, 0xc2, 0x0b, 0xc3, 0x20, 0x05, 0xf4, 0x16, 0x08,
+ 0xc3, 0x20, 0x08, 0x70, 0x01, 0x0c, 0x00, 0xff, 0x13, 0x1a, 0x01, 0x4c,
+ 0x04, 0x00, 0x13, 0x17, 0xc2, 0xa8, 0x00, 0x0a, 0x01, 0x4a, 0x00, 0x10,
+ 0x16, 0x46, 0x01, 0x4a, 0x80, 0x00, 0x16, 0x19, 0xc3, 0x08, 0x06, 0xa0,
+ 0x9a, 0xf4, 0xc2, 0x0c, 0xc3, 0x20, 0x05, 0xf4, 0x16, 0x12, 0xc3, 0x20,
+ 0x08, 0x70, 0x01, 0x0c, 0x00, 0xff, 0x13, 0x03, 0x01, 0x4c, 0x04, 0x00,
+ 0x16, 0x0a, 0x01, 0x68, 0x00, 0x0a, 0x00, 0x10, 0x13, 0x03, 0x01, 0x0c,
+ 0x01, 0x00, 0x16, 0x2d, 0x06, 0xa0, 0xbc, 0x40, 0x10, 0x04, 0x07, 0x87,
+ 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x8a, 0x01, 0xe0, 0x08, 0x70, 0x02, 0x00,
+ 0x07, 0xa0, 0x00, 0x14, 0x00, 0xe0, 0x07, 0xa0, 0x00, 0x16, 0x98, 0x4e,
+ 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0xa8, 0xc3, 0xa9, 0xa0, 0xcf, 0xec,
+ 0xe9, 0xe3, 0xef, 0xed, 0xa0, 0xb1, 0xb9, 0xb9, 0xb6, 0x00, 0x03, 0x00,
+ 0x00, 0x02, 0xc2, 0x20, 0x08, 0x70, 0x16, 0x0c, 0xd8, 0x20, 0x09, 0x2e,
+ 0x01, 0x80, 0xc8, 0x2b, 0x00, 0x06, 0x01, 0x8c, 0x07, 0xa0, 0x09, 0x16,
+ 0x00, 0x04, 0xc8, 0x0b, 0x05, 0xf4, 0x10, 0x05, 0xc2, 0x0b, 0x07, 0x87,
+ 0x05, 0xf0, 0x06, 0xa0, 0xc2, 0x44, 0x01, 0xe0, 0x08, 0x70, 0x02, 0x00,
+ 0x07, 0xa0, 0x00, 0x14, 0x00, 0xe0, 0x07, 0xa0, 0x00, 0x16, 0x98, 0x4e,
+ 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0xc2, 0x20, 0x05, 0xf4, 0x13, 0x02,
+ 0x04, 0x60, 0xbc, 0x04, 0x02, 0xa8, 0xc8, 0x08, 0x08, 0x84, 0x02, 0xe0,
+ 0x08, 0x6a, 0x01, 0x03, 0x00, 0xff, 0x13, 0x22, 0x01, 0x43, 0x04, 0x00,
+ 0x13, 0x1f, 0x01, 0xe0, 0x01, 0x9c, 0x40, 0x00, 0x0b, 0xab, 0x0b, 0xab,
+ 0x01, 0x60, 0x01, 0x9c, 0x40, 0x00, 0x16, 0x16, 0xc8, 0x04, 0x01, 0x6a,
+ 0xc2, 0xe0, 0xf8, 0x02, 0x11, 0x0f, 0xc8, 0x09, 0x01, 0x6a, 0xc8, 0x04,
+ 0xf8, 0x00, 0xc2, 0x45, 0xc1, 0x60, 0x08, 0x96, 0x02, 0x85, 0x97, 0xf6,
+ 0x16, 0x02, 0x06, 0xa0, 0x99, 0x16, 0x02, 0x43, 0x03, 0x00, 0x10, 0x02,
+ 0x01, 0xc3, 0x04, 0x00, 0x00, 0x9d, 0x04, 0x5b, 0x03, 0x00, 0x00, 0x02,
+ 0x07, 0x87, 0x05, 0xf0, 0xc2, 0xcb, 0x16, 0x0f, 0x06, 0xa0, 0x9a, 0xf4,
+ 0x01, 0xe0, 0x08, 0x70, 0x01, 0x00, 0x07, 0xa0, 0x00, 0x14, 0x00, 0xe0,
+ 0x07, 0xa0, 0x00, 0x16, 0x98, 0x4e, 0xcb, 0x60, 0x05, 0xf4, 0x00, 0x02,
+ 0x03, 0x80, 0xc2, 0x20, 0x08, 0x70, 0x01, 0x88, 0x01, 0x00, 0xc8, 0x08,
+ 0x08, 0x70, 0x01, 0x08, 0x04, 0x00, 0x16, 0x03, 0x01, 0x08, 0x00, 0xff,
+ 0x16, 0x08, 0xc2, 0x20, 0x05, 0xf4, 0x16, 0x05, 0xc2, 0x17, 0x13, 0x04,
+ 0xc5, 0xd8, 0x06, 0xa0, 0xbc, 0x40, 0x03, 0x80, 0x02, 0xe0, 0x08, 0x6a,
+ 0x01, 0x83, 0x06, 0x00, 0x16, 0x05, 0xc1, 0x42, 0x13, 0x08, 0xc0, 0xc0,
+ 0xc1, 0x01, 0x04, 0xc2, 0xd8, 0x20, 0x09, 0x2e, 0x01, 0x80, 0xc8, 0x04,
+ 0x01, 0x8c, 0x02, 0xe0, 0x00, 0xc0, 0x07, 0xa0, 0x00, 0x14, 0x08, 0x6a,
+ 0xc8, 0x20, 0x08, 0x96, 0x00, 0x16, 0x03, 0x80, 0xc8, 0x01, 0x01, 0x6a,
+ 0x13, 0x05, 0xc2, 0xe0, 0xf8, 0x02, 0x11, 0x02, 0x06, 0xa0, 0x97, 0xb6,
+ 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x13, 0x01, 0x03, 0x80, 0xd8, 0x20,
+ 0x09, 0x2f, 0x01, 0x83, 0xc0, 0x41, 0x13, 0x04, 0xc8, 0x01, 0x01, 0x8a,
+ 0xc8, 0x01, 0x09, 0x18, 0x07, 0x85, 0x00, 0x43, 0x01, 0x20, 0x0c, 0x06,
+ 0x00, 0xc0, 0x16, 0x20, 0xc2, 0x20, 0x0c, 0x02, 0x06, 0x08, 0x01, 0x08,
+ 0xfe, 0x03, 0x16, 0x1a, 0x07, 0x8a, 0x00, 0x24, 0x62, 0xa0, 0x0c, 0x04,
+ 0xc8, 0x0a, 0x0c, 0x04, 0x07, 0x87, 0x06, 0x30, 0x01, 0xe7, 0x00, 0x04,
+ 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x0c, 0xc2, 0x57, 0x16, 0x04,
+ 0xcd, 0xc5, 0xc5, 0xc5, 0x04, 0x60, 0xb9, 0xc0, 0x05, 0xc7, 0xc8, 0x17,
+ 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, 0x10, 0xf7, 0x04, 0x60, 0xf8, 0xfe,
+ 0x03, 0x00, 0x00, 0x02, 0xc3, 0x20, 0x01, 0x8a, 0x98, 0x20, 0xe0, 0x10,
+ 0x01, 0x83, 0x13, 0xba, 0x01, 0x20, 0x01, 0x9c, 0x00, 0x40, 0x13, 0x02,
+ 0x06, 0xa0, 0xd7, 0xd8, 0xc1, 0x41, 0x83, 0x05, 0x16, 0x01, 0x03, 0x80,
+ 0xc8, 0x05, 0x01, 0x6a, 0xc2, 0x20, 0xf8, 0x02, 0x01, 0x40, 0x00, 0x40,
+ 0x16, 0x12, 0x88, 0x01, 0x09, 0x18, 0x16, 0x07, 0xc8, 0x20, 0x09, 0x1a,
+ 0x09, 0x18, 0x04, 0xe0, 0x09, 0x1a, 0x01, 0xc0, 0x00, 0x04, 0x01, 0x80,
+ 0x40, 0x40, 0x01, 0x20, 0xf8, 0x06, 0x00, 0xc0, 0x16, 0x02, 0x01, 0xc0,
+ 0x40, 0x00, 0x01, 0x48, 0x01, 0x00, 0x16, 0x55, 0x01, 0xc0, 0x00, 0x40,
+ 0x01, 0x00, 0x40, 0x04, 0x13, 0x50, 0x01, 0x40, 0x40, 0x00, 0x16, 0x48,
+ 0x01, 0xa0, 0x07, 0x78, 0x40, 0x00, 0x01, 0x80, 0x40, 0x00, 0x01, 0x48,
+ 0x00, 0x01, 0x16, 0x3d, 0x01, 0x80, 0x00, 0x04, 0xc1, 0x41, 0xc0, 0x60,
+ 0xf8, 0x00, 0x04, 0xe0, 0xf8, 0x00, 0x07, 0x8b, 0x03, 0xea, 0x62, 0xe0,
+ 0xf8, 0x04, 0xc8, 0x0b, 0xf8, 0x04, 0x85, 0x05, 0x16, 0x02, 0xc5, 0x01,
+ 0x10, 0x10, 0xc8, 0x14, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00, 0x13, 0x06,
+ 0xc8, 0x20, 0xf8, 0x00, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00, 0x16, 0xfa,
+ 0xc8, 0x01, 0xf8, 0x00, 0x16, 0x02, 0xc0, 0xa0, 0x01, 0x6a, 0x01, 0x08,
+ 0xfe, 0x00, 0x16, 0x4a, 0xc8, 0x05, 0x01, 0x6a, 0x07, 0x87, 0x06, 0x30,
+ 0x01, 0xe7, 0x00, 0x04, 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x0c,
+ 0xa1, 0x45, 0xc9, 0x60, 0xf8, 0x00, 0x0c, 0x32, 0x04, 0xe0, 0xf8, 0x00,
+ 0x09, 0x15, 0xc2, 0x57, 0x16, 0x31, 0xcd, 0xc5, 0xc5, 0xc5, 0x01, 0xc0,
+ 0x00, 0x20, 0xc1, 0x41, 0x10, 0x0e, 0x01, 0x40, 0x00, 0x04, 0x16, 0x05,
+ 0x01, 0x80, 0x00, 0x04, 0x01, 0xe0, 0xf8, 0x02, 0x40, 0x00, 0xc1, 0x60,
+ 0xf8, 0x00, 0x01, 0x00, 0x40, 0x00, 0x16, 0x01, 0xc0, 0x45, 0x83, 0x05,
+ 0x16, 0x87, 0xc2, 0xe0, 0x09, 0x18, 0x16, 0x10, 0x01, 0x00, 0x00, 0x04,
+ 0x16, 0x0d, 0x98, 0x20, 0xe0, 0x10, 0x01, 0x83, 0x13, 0x09, 0x07, 0x8b,
+ 0xd7, 0x5e, 0x01, 0x40, 0x00, 0x40, 0x13, 0x02, 0x07, 0x8b, 0xd7, 0xa4,
+ 0xc8, 0x0b, 0x00, 0x12, 0x01, 0x00, 0x00, 0x20, 0x16, 0x01, 0x03, 0x80,
+ 0x01, 0x80, 0x00, 0x20, 0x04, 0x60, 0xb9, 0xc0, 0x05, 0xc7, 0xc8, 0x17,
+ 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, 0x10, 0xca, 0xc1, 0x81, 0x06, 0xa0,
+ 0xf9, 0x32, 0xc1, 0x46, 0x10, 0xd8, 0x05, 0xa0, 0x09, 0x32, 0xc0, 0x41,
+ 0x16, 0x01, 0x03, 0x80, 0xc3, 0x20, 0x00, 0x12, 0x04, 0x5c, 0x03, 0x00,
+ 0x00, 0x00, 0x03, 0xb0, 0x10, 0xff, 0x03, 0x80, 0x20, 0x00, 0x9d, 0xd2,
+ 0x02, 0x2f, 0x00, 0x00, 0x20, 0x00, 0xc7, 0x46, 0x00, 0x88, 0xc0, 0x60,
+ 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06,
+ 0x13, 0x04, 0x01, 0x20, 0x01, 0x00, 0x08, 0x00, 0x13, 0x04, 0x88, 0x01,
+ 0x05, 0xee, 0x16, 0xf5, 0x10, 0x35, 0x07, 0x81, 0x01, 0x0a, 0xcc, 0x4c,
+ 0xcc, 0x4c, 0xcc, 0x4e, 0xcc, 0x4f, 0x07, 0xb1, 0x00, 0x40, 0xc4, 0x4d,
+ 0xc8, 0x0a, 0x01, 0x00, 0x04, 0x5b, 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21,
+ 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02, 0x00, 0x06, 0x13, 0x04, 0x01, 0x20,
+ 0x01, 0x00, 0x08, 0x00, 0x13, 0x04, 0x88, 0x01, 0x05, 0xee, 0x16, 0xf5,
+ 0x10, 0x19, 0x07, 0x81, 0x01, 0x0a, 0xcc, 0x4c, 0xcc, 0x4c, 0xcc, 0x4e,
+ 0xcc, 0x4f, 0x07, 0xb1, 0x00, 0x40, 0xc4, 0x4d, 0xc8, 0x0a, 0x01, 0x00,
+ 0xc0, 0x60, 0x05, 0xee, 0x02, 0x21, 0x03, 0xe8, 0x01, 0x20, 0x01, 0x02,
+ 0x00, 0x06, 0x13, 0x01, 0x04, 0x5b, 0x88, 0x01, 0x05, 0xee, 0x16, 0xf8,
+ 0x10, 0x01, 0x20, 0x00, 0xce, 0x3e, 0x0a, 0x32, 0x07, 0x8d, 0x10, 0x00,
+ 0x20, 0x0d, 0x16, 0x28, 0x07, 0x8d, 0x08, 0x00, 0x01, 0x40, 0x02, 0x00,
+ 0x13, 0x23, 0x01, 0xc0, 0x02, 0x00, 0x07, 0x8f, 0x97, 0xf6, 0xc3, 0x8e,
+ 0x11, 0x02, 0x07, 0x8f, 0x97, 0x6a, 0xc8, 0x0f, 0x08, 0x96, 0xc3, 0x60,
+ 0x00, 0x16, 0x02, 0x8d, 0x98, 0x4e, 0x13, 0x02, 0xc8, 0x0f, 0x00, 0x16,
+ 0x07, 0x8f, 0x03, 0xf8, 0x02, 0x4e, 0x40, 0x00, 0xc8, 0x0e, 0x08, 0x98,
+ 0xc8, 0x0e, 0x08, 0x9a, 0x13, 0x05, 0x07, 0x8e, 0xee, 0x60, 0xc3, 0xfe,
+ 0xc8, 0x0e, 0x08, 0x90, 0xc8, 0x0f, 0x08, 0x62, 0x04, 0x20, 0xea, 0x7a,
+ 0x04, 0x5b, 0x07, 0x8d, 0x10, 0x00, 0x20, 0x0d, 0x16, 0xfb, 0x07, 0x8d,
+ 0x08, 0x00, 0x01, 0x40, 0x04, 0x00, 0x13, 0xf6, 0x07, 0x8d, 0x40, 0x00,
+ 0x01, 0x0e, 0x00, 0x01, 0x16, 0xf1, 0x01, 0xc0, 0x04, 0x00, 0x06, 0x0f,
+ 0x01, 0x8f, 0x80, 0x00, 0xc8, 0x0f, 0x08, 0x8c, 0xc3, 0xce, 0x01, 0x8e,
+ 0xe0, 0x00, 0x05, 0x0e, 0xc8, 0x0e, 0x08, 0x4c, 0xa8, 0x0e, 0x08, 0x8c,
+ 0x09, 0xdf, 0x02, 0x4f, 0x00, 0x04, 0x02, 0x2f, 0x03, 0xf0, 0xc8, 0x0f,
+ 0x08, 0x8a, 0x01, 0x85, 0x00, 0x40, 0x04, 0x20, 0xea, 0x7a, 0xc0, 0x41,
+ 0x13, 0xfe, 0x03, 0x00, 0x00, 0x02, 0x88, 0x01, 0x00, 0xe2, 0x13, 0x36,
+ 0xc8, 0x01, 0x01, 0x6c, 0x01, 0x20, 0xfc, 0x06, 0x00, 0xc0, 0x13, 0x30,
+ 0xc0, 0xe0, 0xfc, 0x02, 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02, 0x07, 0xa0,
+ 0xfc, 0x04, 0x03, 0xee, 0xc8, 0x04, 0xfc, 0x76, 0xc8, 0x04, 0xfc, 0xe6,
+ 0xc8, 0x04, 0xfd, 0x56, 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04, 0xfe, 0x36,
+ 0xc8, 0x04, 0xfe, 0xa6, 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04, 0xff, 0x86,
+ 0x07, 0x8e, 0xfc, 0x00, 0xc0, 0x5e, 0x04, 0xde, 0xc8, 0x20, 0x00, 0xe4,
+ 0x01, 0x6c, 0xc8, 0x06, 0xfc, 0x00, 0xc8, 0x06, 0x00, 0xe4, 0x01, 0x43,
+ 0x01, 0x00, 0x13, 0x0a, 0x03, 0x00, 0x00, 0x0f, 0x03, 0x00, 0x00, 0x02,
+ 0x88, 0x01, 0x00, 0xe2, 0x13, 0xf9, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xd0,
+ 0x03, 0x00, 0x00, 0x0f, 0x01, 0x60, 0x07, 0x58, 0x14, 0x00, 0x16, 0xbf,
+ 0x07, 0x83, 0xfc, 0x76, 0x02, 0xe0, 0x08, 0x5c, 0x04, 0x60, 0x91, 0x6a,
+ 0x02, 0x2d, 0x00, 0x06, 0xc0, 0xa0, 0x08, 0x4c, 0x04, 0x60, 0xd3, 0x36,
+ 0x01, 0x00, 0x07, 0xff, 0x16, 0x11, 0x01, 0xc0, 0x07, 0xff, 0x01, 0x00,
+ 0x20, 0x00, 0x16, 0x29, 0x01, 0xc0, 0x20, 0x00, 0x07, 0x8f, 0x08, 0x92,
+ 0xc7, 0xc1, 0xc8, 0x0f, 0x00, 0xe8, 0xc0, 0x60, 0x05, 0xf8, 0x04, 0xe0,
+ 0x05, 0xf8, 0x10, 0x1f, 0x01, 0x40, 0x20, 0x00, 0x16, 0x0b, 0xc0, 0x60,
+ 0x05, 0xf8, 0x16, 0xf7, 0x01, 0x80, 0x20, 0x00, 0x07, 0xa0, 0x00, 0xe8,
+ 0x07, 0x7a, 0xc0, 0x60, 0x08, 0x92, 0x10, 0x0f, 0xc3, 0xdd, 0x13, 0x05,
+ 0x03, 0x90, 0x00, 0x17, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0x24, 0x40, 0x13, 0xcd, 0xc8, 0x01, 0x01, 0x6c, 0x88, 0x01,
+ 0x00, 0xe2, 0x16, 0x24, 0xc3, 0xdd, 0x16, 0xea, 0x84, 0xc4, 0x13, 0xed,
+ 0x01, 0x20, 0xfc, 0x06, 0x00, 0xc0, 0x16, 0x53, 0x01, 0xc0, 0x40, 0x00,
+ 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0,
+ 0x01, 0x03, 0x13, 0xf8, 0x01, 0x40, 0x40, 0x00, 0x16, 0xe4, 0xc3, 0xdd,
+ 0x13, 0xf3, 0x03, 0x90, 0x00, 0x17, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06,
+ 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb, 0x07, 0x86, 0x03, 0xf4, 0x61, 0x89,
+ 0x04, 0x60, 0xd4, 0x28, 0xc0, 0xe0, 0xfc, 0x02, 0x13, 0xf8, 0xc1, 0xa0,
+ 0x08, 0x8a, 0x61, 0x89, 0x61, 0xa0, 0xfc, 0x04, 0x15, 0x0a, 0x04, 0x60,
+ 0xd2, 0x78, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02,
+ 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0xcd, 0x4a, 0xcd, 0x46, 0xcd, 0x47,
+ 0xcd, 0x48, 0xc9, 0x49, 0x00, 0x02, 0xc5, 0x41, 0x07, 0xa5, 0xff, 0xee,
+ 0xe0, 0x81, 0x02, 0x25, 0xff, 0xf8, 0x04, 0x60, 0xd2, 0x74, 0x03, 0x90,
+ 0x00, 0x17, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c,
+ 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0,
+ 0x01, 0x03, 0x13, 0xf8, 0x88, 0x01, 0x00, 0xe2, 0x16, 0xcd, 0xc3, 0xdd,
+ 0x16, 0xec, 0x84, 0xc4, 0x13, 0xf1, 0x61, 0x83, 0x02, 0x23, 0x00, 0x70,
+ 0x84, 0xc4, 0x16, 0xfc, 0xa1, 0x83, 0xcd, 0x4a, 0xcd, 0x46, 0xcd, 0x47,
+ 0xcd, 0x48, 0xc9, 0x49, 0x00, 0x02, 0xc5, 0x41, 0x07, 0xa5, 0xff, 0xee,
+ 0xe0, 0x81, 0x02, 0x25, 0xff, 0xf8, 0x62, 0x86, 0x15, 0x43, 0xa1, 0x8a,
+ 0xa2, 0x46, 0xa0, 0x86, 0x17, 0x21, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0x05, 0xa0, 0x10, 0x80, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x03,
+ 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x11, 0x01, 0x5e, 0x01, 0x00, 0x16, 0x0e,
+ 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f,
+ 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xc0, 0x80, 0x00, 0x10, 0x02,
+ 0x05, 0xa0, 0x10, 0x80, 0xc1, 0x8a, 0x88, 0x02, 0x08, 0x8c, 0x15, 0x3f,
+ 0xc2, 0xac, 0x00, 0x04, 0x13, 0x3e, 0x01, 0x8a, 0x80, 0x00, 0xc1, 0xfc,
+ 0xc2, 0x3c, 0x04, 0xfc, 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c,
+ 0x11, 0x28, 0x05, 0x06, 0x13, 0xa3, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0,
+ 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x10, 0xaf,
+ 0xa2, 0x46, 0xa2, 0x06, 0x17, 0x01, 0x05, 0x87, 0xa0, 0x86, 0x04, 0xc6,
+ 0x17, 0x93, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0,
+ 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x01, 0x5e,
+ 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x8b, 0x01, 0x5e,
+ 0x01, 0x00, 0x16, 0x88, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f,
+ 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xc0,
+ 0x80, 0x00, 0x04, 0x60, 0xd0, 0x9e, 0x04, 0x60, 0xd5, 0xa0, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0xc2, 0xac, 0x00, 0x04, 0x16, 0xb7, 0xc3, 0xdd, 0x13, 0xf3,
+ 0x03, 0x90, 0x01, 0xb7, 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01,
+ 0x01, 0x6c, 0x10, 0xeb, 0xa1, 0x8a, 0xa2, 0x46, 0xa0, 0x86, 0x17, 0x21,
+ 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00,
+ 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x05, 0xa0, 0x10, 0x80,
+ 0x01, 0x5e, 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x11,
+ 0x01, 0x5e, 0x01, 0x00, 0x16, 0x0e, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00,
+ 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1,
+ 0x01, 0xc0, 0x80, 0x00, 0x10, 0x02, 0x05, 0xa0, 0x10, 0x80, 0xc1, 0x8a,
+ 0x88, 0x02, 0x08, 0x8c, 0x15, 0x15, 0xc2, 0xac, 0x00, 0x04, 0x16, 0x14,
+ 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0,
+ 0x01, 0x03, 0x13, 0xf8, 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x01, 0xb7,
+ 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb,
+ 0x04, 0x60, 0xd5, 0xa0, 0x01, 0x8a, 0x80, 0x00, 0xc1, 0xfc, 0xc2, 0x3c,
+ 0x04, 0xfc, 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28,
+ 0x05, 0x06, 0x04, 0x60, 0xd0, 0x54, 0x62, 0x86, 0x17, 0xaf, 0xa1, 0x82,
+ 0xc0, 0xa0, 0x08, 0x4c, 0x61, 0x82, 0xc3, 0xe0, 0x10, 0x82, 0x02, 0x4f,
+ 0x00, 0x1f, 0x0a, 0x2f, 0xcb, 0xc6, 0x10, 0xa8, 0xcb, 0xc3, 0x10, 0xaa,
+ 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02, 0x07, 0xa0, 0xfc, 0x04, 0x03, 0xee,
+ 0x07, 0x83, 0xfc, 0x76, 0x07, 0x89, 0x00, 0x06, 0xc2, 0xac, 0x00, 0x04,
+ 0x13, 0x08, 0xc1, 0xfc, 0xc2, 0x3c, 0x04, 0xfc, 0x02, 0x8c, 0x11, 0xe8,
+ 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0x05, 0xa0, 0x10, 0x82, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x3b,
+ 0x07, 0x9e, 0xde, 0x8c, 0x05, 0xa0, 0x10, 0x80, 0xc4, 0xc4, 0xc8, 0x04,
+ 0xfc, 0xe6, 0xc8, 0x04, 0xfd, 0x56, 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04,
+ 0xfe, 0x36, 0xc8, 0x04, 0xfe, 0xa6, 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04,
+ 0xff, 0x86, 0x07, 0x8e, 0xfc, 0x00, 0xc0, 0x5e, 0x04, 0xde, 0xc8, 0x20,
+ 0x00, 0xe4, 0x01, 0x6c, 0xc3, 0xe0, 0x00, 0xe2, 0x13, 0x40, 0xc7, 0x86,
+ 0xc8, 0x06, 0x00, 0xe4, 0x04, 0xc6, 0xc2, 0x8a, 0x15, 0x31, 0x13, 0x0a,
+ 0x05, 0xa0, 0x10, 0x80, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00,
+ 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0xc2, 0xac, 0x00, 0x04,
+ 0x16, 0x19, 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x01, 0xb7, 0x06, 0x9b,
+ 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb, 0x01, 0x5e,
+ 0x01, 0x00, 0x16, 0xc4, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f,
+ 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x13, 0xb9, 0x01, 0xc0,
+ 0x80, 0x00, 0x10, 0xb8, 0xc1, 0xfc, 0xc2, 0x3c, 0x04, 0xfc, 0x02, 0x8c,
+ 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28, 0xc2, 0x8a, 0x11, 0xd0,
+ 0xc3, 0xdd, 0x16, 0x02, 0x04, 0x60, 0xcf, 0xe8, 0x03, 0x90, 0x00, 0x17,
+ 0x06, 0x9b, 0x04, 0x60, 0xcf, 0xd4, 0x07, 0x8e, 0xd3, 0x1a, 0xc8, 0x20,
+ 0x08, 0x94, 0x01, 0x6a, 0x16, 0x03, 0xc8, 0x06, 0x08, 0x94, 0x04, 0x5e,
+ 0xc8, 0x06, 0xf8, 0x00, 0xc8, 0x06, 0x00, 0xe4, 0xc1, 0xa0, 0x08, 0x94,
+ 0x98, 0x20, 0xe0, 0x10, 0x01, 0x83, 0x16, 0x19, 0x01, 0xe0, 0x01, 0x9c,
+ 0x00, 0x40, 0x07, 0x8f, 0x03, 0xe8, 0x0b, 0x8f, 0x0b, 0x8f, 0x06, 0x0f,
+ 0x13, 0x1a, 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x16, 0xf8, 0x01, 0x60,
+ 0x0c, 0x02, 0x01, 0x00, 0x13, 0x12, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83,
+ 0x07, 0xa0, 0x0c, 0x02, 0x80, 0x00, 0x0b, 0x8f, 0x0b, 0x8f, 0xc8, 0x06,
+ 0x01, 0x8a, 0xc8, 0x06, 0x09, 0x18, 0x07, 0xa0, 0x00, 0x12, 0x9c, 0x56,
+ 0x01, 0xe0, 0x00, 0xe0, 0x00, 0x40, 0x04, 0xe0, 0x08, 0x94, 0xc8, 0x06,
+ 0x00, 0xe2, 0x01, 0x40, 0x20, 0x00, 0x13, 0x07, 0xc0, 0x41, 0x13, 0x03,
+ 0xc8, 0x06, 0xfc, 0x00, 0x04, 0x5e, 0xc0, 0x46, 0x04, 0x5e, 0xc3, 0xe0,
+ 0x08, 0x92, 0x16, 0xf8, 0xc8, 0x06, 0x08, 0x92, 0x04, 0x5e, 0xcd, 0x4a,
+ 0xcd, 0x46, 0xcd, 0x47, 0xcd, 0x48, 0xc9, 0x49, 0x00, 0x02, 0xc5, 0x41,
+ 0x07, 0xa5, 0xff, 0xee, 0xe0, 0x81, 0x02, 0x25, 0xff, 0xf8, 0x62, 0x86,
+ 0x15, 0x57, 0xa1, 0x8a, 0xa2, 0x46, 0xa0, 0x86, 0x17, 0x21, 0x07, 0x8e,
+ 0x01, 0x04, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02,
+ 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x05, 0xa0, 0x10, 0x80, 0x01, 0x5e,
+ 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c, 0x10, 0x11, 0x01, 0x5e,
+ 0x01, 0x00, 0x16, 0x0e, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f,
+ 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x13, 0xf1, 0x01, 0xc0,
+ 0x80, 0x00, 0x10, 0x02, 0x05, 0xa0, 0x10, 0x80, 0xc1, 0x8a, 0x88, 0x02,
+ 0x08, 0x8c, 0x15, 0x15, 0xc2, 0xac, 0x00, 0x04, 0x16, 0x14, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x01, 0xb7, 0x06, 0x9b,
+ 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb, 0x04, 0x60,
+ 0xd5, 0xa0, 0x01, 0x8a, 0x80, 0x00, 0xc1, 0xfc, 0xc2, 0x3c, 0x04, 0xfc,
+ 0x02, 0x8c, 0x11, 0xe8, 0x16, 0x02, 0x07, 0x8c, 0x11, 0x28, 0x05, 0x06,
+ 0x13, 0x09, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02,
+ 0xd3, 0xa0, 0x01, 0x03, 0x13, 0xf8, 0x10, 0x9b, 0xa2, 0x06, 0x17, 0x01,
+ 0x05, 0x87, 0xa0, 0x86, 0x17, 0x1e, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00,
+ 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03,
+ 0x13, 0xf8, 0x01, 0x5e, 0x21, 0x00, 0x16, 0x03, 0x07, 0x9e, 0xde, 0x8c,
+ 0x10, 0x0e, 0x01, 0x5e, 0x01, 0x00, 0x16, 0x0b, 0xc3, 0xde, 0x01, 0xcf,
+ 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00,
+ 0x13, 0xf1, 0x01, 0xc0, 0x80, 0x00, 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02,
+ 0x07, 0x83, 0xfc, 0x76, 0x07, 0x89, 0x00, 0x06, 0x07, 0x8e, 0xfc, 0x00,
+ 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0, 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0,
+ 0x01, 0x03, 0x13, 0xf8, 0xc4, 0xc4, 0xc8, 0x04, 0xfc, 0xe6, 0xc8, 0x04,
+ 0xfd, 0x56, 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04, 0xfe, 0x36, 0xc8, 0x04,
+ 0xfe, 0xa6, 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04, 0xff, 0x86, 0xc0, 0x5e,
+ 0x04, 0xde, 0xc8, 0x20, 0x00, 0xe4, 0x01, 0x6c, 0xc3, 0xe0, 0x00, 0xe2,
+ 0x13, 0x08, 0xc7, 0x86, 0xc8, 0x06, 0x00, 0xe4, 0x04, 0xc6, 0xc8, 0x01,
+ 0x01, 0x6c, 0x04, 0x60, 0xd0, 0x9e, 0x07, 0x8e, 0xd5, 0x8e, 0x04, 0x60,
+ 0xd3, 0x98, 0x62, 0x46, 0x60, 0x86, 0x03, 0x00, 0x00, 0x0f, 0x03, 0xd0,
+ 0x03, 0x00, 0x00, 0x02, 0xd3, 0xe0, 0x01, 0x03, 0x13, 0xf8, 0x88, 0x01,
+ 0x00, 0xe2, 0x16, 0x0a, 0xc3, 0xdd, 0x13, 0xf3, 0x03, 0x90, 0x00, 0x17,
+ 0x06, 0x9b, 0x02, 0x2d, 0x00, 0x06, 0xc8, 0x01, 0x01, 0x6c, 0x10, 0xeb,
+ 0xc0, 0xe0, 0xfc, 0x02, 0x13, 0x09, 0xc1, 0xa0, 0x08, 0x8a, 0x61, 0x89,
+ 0x61, 0xa0, 0xfc, 0x04, 0x06, 0x20, 0x10, 0x80, 0x04, 0x60, 0xd2, 0x78,
+ 0x07, 0x86, 0x03, 0xf4, 0x61, 0x89, 0xa0, 0x86, 0x15, 0x02, 0x07, 0x82,
+ 0x7f, 0xff, 0xc1, 0x81, 0x07, 0x20, 0xfc, 0x02, 0x07, 0xa0, 0xfc, 0x04,
+ 0x03, 0xee, 0x07, 0x83, 0xfc, 0x76, 0x07, 0x89, 0x00, 0x06, 0x07, 0x8e,
+ 0xfc, 0x00, 0xc4, 0xc4, 0xc8, 0x04, 0xfc, 0xe6, 0xc8, 0x04, 0xfd, 0x56,
+ 0xc8, 0x04, 0xfd, 0xc6, 0xc8, 0x04, 0xfe, 0x36, 0xc8, 0x04, 0xfe, 0xa6,
+ 0xc8, 0x04, 0xff, 0x16, 0xc8, 0x04, 0xff, 0x86, 0xc0, 0x5e, 0x04, 0xde,
+ 0xc8, 0x20, 0x00, 0xe4, 0x01, 0x6c, 0xc3, 0xe0, 0x00, 0xe2, 0x13, 0x07,
+ 0xc7, 0x86, 0xc8, 0x06, 0x00, 0xe4, 0x04, 0xc6, 0xc8, 0x01, 0x01, 0x6c,
+ 0x10, 0xae, 0x07, 0x8e, 0xd6, 0x40, 0x04, 0x60, 0xd3, 0x98, 0xc1, 0x60,
+ 0xf8, 0x00, 0x83, 0x05, 0x13, 0x0c, 0xc8, 0x05, 0x01, 0x6a, 0xc2, 0x20,
+ 0xf8, 0x02, 0x13, 0xf7, 0x15, 0x14, 0x06, 0xa0, 0x97, 0xb6, 0xc0, 0x60,
+ 0xf8, 0x00, 0x83, 0x01, 0x16, 0x6d, 0x04, 0x60, 0xb9, 0xc0, 0x06, 0xa0,
+ 0xf9, 0x32, 0x80, 0x45, 0x16, 0x4f, 0x04, 0x60, 0xb9, 0xc0, 0x06, 0xa0,
+ 0x97, 0xb6, 0xc2, 0x20, 0xf8, 0x02, 0x11, 0xfb, 0x13, 0xe2, 0x01, 0xa0,
+ 0x07, 0x78, 0x40, 0x00, 0xc1, 0x41, 0xc0, 0x60, 0xf8, 0x00, 0x01, 0x48,
+ 0x00, 0x01, 0x16, 0x3e, 0x04, 0xe0, 0xf8, 0x00, 0x07, 0x8b, 0x03, 0xea,
+ 0x62, 0xe0, 0xf8, 0x04, 0xc8, 0x0b, 0xf8, 0x04, 0x85, 0x05, 0x16, 0x02,
+ 0xc5, 0x01, 0x10, 0x10, 0xc8, 0x14, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00,
+ 0x13, 0x06, 0xc8, 0x20, 0xf8, 0x00, 0x01, 0x6a, 0x88, 0x05, 0xf8, 0x00,
+ 0x16, 0xfa, 0xc8, 0x01, 0xf8, 0x00, 0x16, 0x02, 0xc0, 0xa0, 0x01, 0x6a,
+ 0x01, 0x08, 0xfe, 0x00, 0x16, 0xcc, 0xc8, 0x05, 0x01, 0x6a, 0x01, 0xe0,
+ 0xf8, 0x02, 0x00, 0x20, 0x07, 0x87, 0x06, 0x30, 0x01, 0xe7, 0x00, 0x04,
+ 0x00, 0x40, 0x04, 0xd7, 0x02, 0x27, 0x00, 0x0c, 0xa1, 0x45, 0xc9, 0x60,
+ 0xf8, 0x00, 0x0c, 0x32, 0x04, 0xe0, 0xf8, 0x00, 0x09, 0x15, 0xc2, 0x57,
+ 0x16, 0x03, 0xcd, 0xc5, 0xc5, 0xc5, 0x10, 0x06, 0x05, 0xc7, 0xc8, 0x17,
+ 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00, 0xc5, 0xc5, 0x83, 0x01, 0x13, 0xa9,
+ 0xc8, 0x01, 0x01, 0x6a, 0x01, 0x20, 0xf8, 0x06, 0x00, 0xc0, 0x13, 0xad,
+ 0x01, 0x60, 0xf8, 0x02, 0x01, 0x00, 0x16, 0x05, 0xc0, 0x60, 0xf8, 0x00,
+ 0x83, 0x01, 0x16, 0xf2, 0x10, 0x9a, 0x07, 0xa0, 0x00, 0x12, 0xd7, 0xa4,
+ 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x13, 0x93, 0xc8, 0x01, 0x01, 0x6a,
+ 0x01, 0x60, 0xf8, 0x02, 0x01, 0x00, 0x16, 0x89, 0x07, 0xa0, 0x00, 0x12,
+ 0xd7, 0x5e, 0x10, 0xea, 0x03, 0x00, 0x00, 0x02, 0xc3, 0x20, 0x01, 0x8a,
+ 0x13, 0x1d, 0x83, 0x01, 0x13, 0x0e, 0xc8, 0x01, 0x01, 0x6a, 0x01, 0x20,
+ 0xf8, 0x06, 0x00, 0xc0, 0x13, 0x86, 0x01, 0x60, 0xf8, 0x02, 0x01, 0x00,
+ 0x16, 0x07, 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x16, 0xf2, 0x03, 0x90,
+ 0xbf, 0xff, 0x03, 0x80, 0x07, 0xa0, 0x00, 0x12, 0xd7, 0xa4, 0xc0, 0x60,
+ 0xf8, 0x00, 0x83, 0x01, 0x16, 0x0b, 0x03, 0x90, 0xbf, 0xff, 0x03, 0x80,
+ 0x10, 0x18, 0x03, 0x00, 0x00, 0x02, 0xc3, 0x20, 0x01, 0x8a, 0x13, 0x13,
+ 0x83, 0x01, 0x13, 0x0e, 0xc8, 0x01, 0x01, 0x6a, 0x01, 0x60, 0xf8, 0x02,
+ 0x01, 0x00, 0x16, 0x04, 0x07, 0xa0, 0x00, 0x12, 0xd7, 0x5e, 0x10, 0xdd,
+ 0xc0, 0x60, 0xf8, 0x00, 0x83, 0x01, 0x16, 0xf2, 0x03, 0x90, 0xbf, 0xff,
+ 0x03, 0x80, 0x07, 0x8b, 0x9c, 0x72, 0xc3, 0x01, 0x13, 0x39, 0xc2, 0x4c,
+ 0xc8, 0x0c, 0x01, 0x6a, 0xc2, 0x20, 0xf8, 0x02, 0x11, 0x2d, 0xc2, 0x4c,
+ 0xc3, 0x20, 0xf8, 0x00, 0x16, 0xf7, 0xc8, 0x09, 0x01, 0x6a, 0xc2, 0x20,
+ 0xf8, 0x02, 0x16, 0x2a, 0x01, 0xe0, 0xf8, 0x02, 0x19, 0x00, 0x05, 0xa0,
+ 0x13, 0x80, 0x10, 0x24, 0x01, 0xe0, 0xf8, 0x02, 0x19, 0x00, 0x05, 0xa0,
+ 0x13, 0x80, 0xc8, 0x0c, 0x01, 0x8a, 0x07, 0x89, 0x09, 0x18, 0xc2, 0x19,
+ 0x13, 0x01, 0x05, 0xc9, 0xc6, 0x4c, 0xc2, 0x20, 0x00, 0x12, 0x02, 0x88,
+ 0xd7, 0x5e, 0x16, 0x03, 0x01, 0xc0, 0x00, 0x40, 0x10, 0x05, 0x02, 0x88,
+ 0xd7, 0xa4, 0x16, 0x05, 0x01, 0x80, 0x40, 0x40, 0x07, 0xa0, 0x00, 0x12,
+ 0x9c, 0x56, 0x04, 0x5b, 0xc8, 0x09, 0x01, 0x6a, 0xc2, 0x20, 0xf8, 0x02,
+ 0x16, 0xe2, 0x10, 0xdc, 0xc2, 0x20, 0x0c, 0x02, 0x11, 0x01, 0x10, 0xe5,
+ 0xd8, 0x20, 0xe0, 0x10, 0x01, 0x83, 0x07, 0x88, 0x00, 0x05, 0x0b, 0x88,
+ 0x0b, 0x88, 0x06, 0x08, 0x16, 0xfc, 0x07, 0xa0, 0x01, 0x8a, 0x00, 0x43,
+ 0x10, 0xd8, 0x20, 0x00, 0xd8, 0x70, 0x00, 0x7f, 0x00, 0x00, 0x20, 0x00,
+ 0xf8, 0x30, 0x05, 0xec, 0x68, 0x04, 0x09, 0x32, 0xd3, 0xcf, 0x16, 0x30,
+ 0x01, 0x4f, 0x00, 0x80, 0x16, 0x2d, 0x01, 0x0e, 0x00, 0x03, 0x16, 0x2a,
+ 0xd1, 0x04, 0x13, 0x01, 0x07, 0x04, 0x06, 0xc4, 0x07, 0x03, 0x07, 0x88,
+ 0x07, 0x23, 0xb6, 0x04, 0x18, 0x0d, 0x01, 0x4d, 0x00, 0x02, 0x13, 0x0f,
+ 0xc0, 0x60, 0x06, 0x7c, 0x02, 0x81, 0x06, 0x30, 0x13, 0x0a, 0x07, 0x88,
+ 0x80, 0x18, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x05, 0x76, 0x04, 0x96, 0x03,
+ 0x13, 0x02, 0xd6, 0x01, 0x10, 0xee, 0x07, 0x88, 0x07, 0x2f, 0xb6, 0x04,
+ 0x18, 0x03, 0x96, 0x03, 0x13, 0x05, 0x04, 0x5c, 0x76, 0x04, 0x96, 0x03,
+ 0x13, 0x05, 0xd6, 0x03, 0x07, 0x83, 0x80, 0x40, 0x06, 0xa0, 0xe3, 0x56,
+ 0x04, 0x5c, 0x03, 0x00, 0x00, 0x02, 0xc1, 0x4b, 0x02, 0x85, 0x00, 0x43,
+ 0x13, 0x2c, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x04, 0x16, 0x06, 0xc8, 0x05,
+ 0x01, 0x6c, 0x01, 0x60, 0xfc, 0x02, 0x00, 0x20, 0x13, 0x07, 0x06, 0xa0,
+ 0xf9, 0x32, 0x03, 0x90, 0x04, 0x77, 0x03, 0x80, 0xc8, 0x0a, 0x01, 0x6c,
+ 0xc2, 0xa0, 0xfc, 0x00, 0x16, 0xfb, 0xc2, 0xa0, 0x01, 0x6c, 0x07, 0x89,
+ 0x03, 0xea, 0x62, 0x60, 0xfc, 0x04, 0xc8, 0x09, 0xfc, 0x04, 0x07, 0x89,
+ 0x05, 0xf8, 0xc2, 0xd9, 0x16, 0x02, 0xce, 0x45, 0x10, 0x05, 0x05, 0xc9,
+ 0xc8, 0x19, 0x01, 0x6c, 0xc8, 0x05, 0xfc, 0x00, 0xc6, 0x4a, 0x01, 0xa0,
+ 0x07, 0x78, 0x07, 0xff, 0x10, 0xe0, 0x07, 0xa0, 0x0c, 0x02, 0x80, 0x00,
+ 0x07, 0xa0, 0x0c, 0x04, 0x00, 0x28, 0xc0, 0x41, 0x16, 0xd8, 0xd8, 0x20,
+ 0xe0, 0x10, 0x01, 0x83, 0x07, 0x89, 0x00, 0x05, 0x0b, 0x89, 0x0b, 0x89,
+ 0x06, 0x09, 0x16, 0xfc, 0xc8, 0x05, 0x01, 0x8a, 0x07, 0xa0, 0x00, 0x12,
+ 0x9c, 0x56, 0x01, 0xe0, 0x00, 0xe0, 0x00, 0x40, 0x10, 0xc6, 0xc2, 0x85,
+ 0xc2, 0x60, 0x07, 0x80, 0xc8, 0x0a, 0x01, 0x6a, 0x07, 0x20, 0xf8, 0x02,
+ 0x07, 0xa0, 0xf8, 0x04, 0x03, 0xee, 0xc8, 0x09, 0xf8, 0x76, 0xc8, 0x09,
+ 0xf8, 0xe6, 0xc8, 0x09, 0xf9, 0x56, 0xc8, 0x09, 0xf9, 0xc6, 0xc8, 0x09,
+ 0xfa, 0x36, 0xc8, 0x09, 0xfa, 0xa6, 0xc8, 0x09, 0xfb, 0x16, 0xc8, 0x09,
+ 0xfb, 0x86, 0xc8, 0x09, 0xfb, 0xf6, 0xc2, 0xa0, 0xf8, 0x00, 0x16, 0xe4,
+ 0xc2, 0xa0, 0x01, 0x6a, 0xc0, 0x41, 0x13, 0x06, 0xc8, 0x02, 0x01, 0x6a,
+ 0xc8, 0x05, 0xf8, 0x00, 0xc0, 0x8a, 0x04, 0x5b, 0xc8, 0x20, 0x08, 0x94,
+ 0x01, 0x6a, 0x16, 0x05, 0x82, 0x85, 0x16, 0x07, 0xc8, 0x05, 0x08, 0x94,
+ 0x04, 0x5b, 0xc8, 0x05, 0xf8, 0x00, 0xc1, 0x60, 0x08, 0x94, 0x98, 0x20,
+ 0xe0, 0x10, 0x01, 0x83, 0x16, 0x19, 0x01, 0xe0, 0x01, 0x9c, 0x00, 0x40,
+ 0x07, 0x89, 0x03, 0xe8, 0x0b, 0x89, 0x0b, 0x89, 0x06, 0x09, 0x13, 0x14,
+ 0x01, 0x60, 0x01, 0x9c, 0x00, 0x40, 0x16, 0xf8, 0x01, 0x60, 0x0c, 0x02,
+ 0x01, 0x00, 0x13, 0x0c, 0xd8, 0x20, 0x09, 0x2f, 0x01, 0x83, 0x07, 0xa0,
+ 0x0c, 0x02, 0x80, 0x00, 0x0b, 0x89, 0x0b, 0x89, 0xc8, 0x05, 0x01, 0x8a,
+ 0xc8, 0x05, 0x09, 0x18, 0x04, 0xe0, 0x08, 0x94, 0xc0, 0x54, 0x16, 0x02,
+ 0xc5, 0x05, 0x10, 0x04, 0xc8, 0x02, 0x01, 0x6a, 0xc8, 0x05, 0xf8, 0x00,
+ 0xc0, 0x45, 0xc0, 0x8a, 0x07, 0xa0, 0x00, 0x12, 0x9c, 0x56, 0x01, 0xe0,
+ 0x00, 0xe0, 0x00, 0x40, 0x04, 0x5b, 0x07, 0x20, 0x0c, 0xb8, 0x07, 0x83,
+ 0x80, 0x00, 0x04, 0x5b, 0x07, 0xa0, 0xfc, 0x04, 0x03, 0xee, 0xc2, 0x20,
+ 0x07, 0x80, 0xc8, 0x08, 0xfc, 0x76, 0xc8, 0x08, 0xfc, 0xe6, 0xc8, 0x08,
+ 0xfd, 0x56, 0xc8, 0x08, 0xfd, 0xc6, 0xc8, 0x08, 0xfe, 0x36, 0xc8, 0x08,
+ 0xfe, 0xa6, 0xc8, 0x08, 0xff, 0x16, 0xc8, 0x08, 0xff, 0x86, 0xc8, 0x08,
+ 0xff, 0xf6, 0x04, 0x60, 0xc0, 0xc6, 0xc3, 0xa0, 0x00, 0xe2, 0xc8, 0x0e,
+ 0x08, 0x66, 0xc8, 0x0e, 0x01, 0x6c, 0xc3, 0xa0, 0xfc, 0x00, 0x06, 0x0d,
+ 0x16, 0xfa, 0x04, 0xe0, 0xfc, 0x00, 0xc8, 0x20, 0x01, 0x6c, 0x08, 0x7c,
+ 0xc8, 0x0e, 0x00, 0xe2, 0xc8, 0x0e, 0x07, 0x7a, 0x04, 0xe0, 0x08, 0x94,
+ 0x04, 0xe0, 0x0c, 0xb8, 0x07, 0x8d, 0x00, 0x10, 0x04, 0x5b, 0x03, 0x00,
+ 0x00, 0x02, 0x07, 0x09, 0xc2, 0xa0, 0x01, 0x04, 0x01, 0x8a, 0x00, 0x80,
+ 0x52, 0x4a, 0xd2, 0x89, 0x01, 0xca, 0x25, 0x00, 0xc8, 0x0a, 0x01, 0x04,
+ 0xd2, 0xa0, 0x01, 0x04, 0x01, 0x0a, 0xda, 0x00, 0x16, 0xf5, 0x52, 0x4a,
+ 0x01, 0xa0, 0x08, 0xa0, 0xff, 0x00, 0x07, 0xa0, 0x08, 0xa8, 0x10, 0x00,
+ 0x01, 0xc9, 0x05, 0x00, 0x07, 0x8a, 0x07, 0x78, 0x02, 0x89, 0x5f, 0xff,
+ 0x16, 0x19, 0x01, 0x5a, 0x80, 0x00, 0x16, 0x0f, 0x07, 0x89, 0xde, 0x8c,
+ 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, 0x13, 0x02, 0x01, 0x89, 0x04, 0x00,
+ 0xc8, 0x09, 0x01, 0x04, 0x01, 0x9a, 0x80, 0x00, 0x03, 0x90, 0xff, 0xff,
+ 0x03, 0x80, 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, 0x16, 0x22, 0x03, 0x90,
+ 0xff, 0xff, 0x03, 0x80, 0x05, 0x49, 0x01, 0x89, 0x80, 0x00, 0x01, 0x49,
+ 0x40, 0x00, 0x13, 0x23, 0x01, 0x49, 0x20, 0x00, 0x16, 0x2f, 0x01, 0x5a,
+ 0x80, 0x00, 0x16, 0x0e, 0x01, 0x9a, 0x80, 0x00, 0x07, 0x8a, 0xde, 0x8c,
+ 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, 0x13, 0x02, 0x01, 0x8a, 0x04, 0x00,
+ 0xc8, 0x0a, 0x01, 0x04, 0x01, 0x89, 0x20, 0x00, 0xd2, 0x49, 0x16, 0x05,
+ 0x03, 0x90, 0xff, 0xff, 0x03, 0x80, 0x07, 0x89, 0x20, 0x00, 0xf8, 0x09,
+ 0x07, 0x3a, 0xc2, 0x60, 0x07, 0x36, 0x13, 0xf6, 0x04, 0xe0, 0x07, 0x36,
+ 0x04, 0x54, 0x04, 0xca, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a,
+ 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a, 0x87, 0x4a,
+ 0x06, 0x0a, 0x16, 0xf4, 0x04, 0x60, 0xb3, 0xf0, 0x01, 0x5a, 0x80, 0x00,
+ 0x13, 0x04, 0x01, 0x20, 0x07, 0x58, 0x20, 0xfe, 0x13, 0xdb, 0xc2, 0xa0,
+ 0x01, 0x04, 0x01, 0xca, 0xff, 0x00, 0x01, 0x8a, 0x04, 0x80, 0xc8, 0x0a,
+ 0x01, 0x04, 0x01, 0x60, 0x01, 0x04, 0x20, 0x00, 0x16, 0xcf, 0x01, 0xc9,
+ 0x20, 0x00, 0x07, 0x8a, 0x07, 0x78, 0x10, 0xb9, 0x01, 0x60, 0x07, 0x58,
+ 0x10, 0x00, 0x16, 0x13, 0x01, 0x20, 0x05, 0xee, 0x00, 0x07, 0x16, 0x0f,
+ 0xc1, 0xa0, 0x08, 0xa0, 0x06, 0xc6, 0xd1, 0xe0, 0x01, 0x03, 0x13, 0x14,
+ 0x71, 0x86, 0x06, 0xc6, 0x01, 0x20, 0x01, 0x04, 0x20, 0x00, 0x13, 0x22,
+ 0x71, 0x86, 0xc8, 0x06, 0x08, 0xa0, 0x01, 0x60, 0x01, 0x82, 0x20, 0x00,
+ 0x16, 0x06, 0x01, 0xa0, 0x01, 0x82, 0x20, 0x00, 0x01, 0xe0, 0x01, 0x82,
+ 0x20, 0x00, 0x04, 0x5b, 0x07, 0x87, 0x01, 0x0c, 0x07, 0x88, 0x08, 0xa2,
+ 0x02, 0x26, 0xff, 0x00, 0x18, 0x04, 0xce, 0x37, 0xce, 0x37, 0xc6, 0x17,
+ 0x10, 0xe2, 0x8e, 0x37, 0x16, 0xdf, 0x8e, 0x37, 0x16, 0xdd, 0x86, 0x17,
+ 0x16, 0xdb, 0xd1, 0x86, 0x16, 0xda, 0x10, 0x11, 0x02, 0x26, 0x01, 0x00,
+ 0x18, 0x0e, 0x19, 0xdb, 0xc1, 0xe0, 0x01, 0x04, 0x01, 0xc7, 0xff, 0x00,
+ 0x01, 0x87, 0x04, 0x80, 0xc8, 0x07, 0x01, 0x04, 0x01, 0x20, 0x01, 0x04,
+ 0x20, 0x00, 0x16, 0xce, 0x10, 0xce, 0x04, 0xe0, 0x08, 0xa8, 0x04, 0x5b,
+ 0xc0, 0xe0, 0x07, 0x5c, 0xc8, 0x03, 0x01, 0x6c, 0xc3, 0x43, 0xc2, 0xc3,
+ 0xa2, 0xcb, 0xc2, 0xeb, 0x0c, 0x32, 0xc8, 0x0b, 0xfc, 0x00, 0x13, 0x07,
+ 0xc8, 0x0b, 0x01, 0x6c, 0xc2, 0xe0, 0xfc, 0x00, 0x16, 0xfb, 0xc3, 0x60,
+ 0x01, 0x6c, 0x07, 0x8b, 0x03, 0xea, 0x62, 0xe0, 0xfc, 0x04, 0xc8, 0x0b,
+ 0xfc, 0x04, 0x07, 0x8b, 0x05, 0xf8, 0x03, 0x00, 0x00, 0x02, 0xc3, 0x9b,
+ 0x16, 0x02, 0xce, 0xc3, 0x10, 0x05, 0x05, 0xcb, 0xc8, 0x1b, 0x01, 0x6c,
+ 0xc8, 0x03, 0xfc, 0x00, 0xc6, 0xcd, 0x01, 0xa0, 0x07, 0x78, 0x07, 0xff,
+ 0x03, 0x00, 0x00, 0x0f, 0x04, 0x20, 0xea, 0x7a, 0x07, 0x8e, 0x01, 0x04,
+ 0x03, 0x00, 0x00, 0x02, 0xc3, 0xde, 0x01, 0x4f, 0x20, 0x00, 0x16, 0x08,
+ 0x01, 0x20, 0x07, 0x78, 0x80, 0x00, 0x16, 0x04, 0x03, 0x00, 0x00, 0x0f,
+ 0x04, 0x60, 0xc5, 0xc6, 0x01, 0xcf, 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80,
+ 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00, 0x16, 0x04, 0x01, 0x60, 0x07, 0x78,
+ 0x80, 0x00, 0x16, 0xf0, 0xc3, 0xdd, 0x02, 0x4f, 0x00, 0x0f, 0xe1, 0x2f,
+ 0xe0, 0x14, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x5b, 0x03, 0x00, 0x00, 0x0f,
+ 0x10, 0x08, 0x06, 0xa0, 0xc7, 0x7e, 0x01, 0xc2, 0xff, 0x80, 0x01, 0x82,
+ 0x24, 0x00, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02, 0x01, 0x5e,
+ 0x20, 0x00, 0x16, 0xf0, 0xc7, 0x82, 0x03, 0x00, 0x00, 0x0f, 0x03, 0x90,
+ 0x60, 0x3f, 0x04, 0x59, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02,
+ 0x01, 0x5e, 0x20, 0x00, 0x13, 0x06, 0xc3, 0xde, 0x01, 0xcf, 0xff, 0x00,
+ 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60,
+ 0xc5, 0x60, 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02, 0x01, 0x5e,
+ 0x20, 0x00, 0x16, 0x10, 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60, 0xc6, 0x22,
+ 0x07, 0x8e, 0x01, 0x04, 0x03, 0x00, 0x00, 0x02, 0x01, 0x5e, 0x20, 0x00,
+ 0x16, 0x09, 0x07, 0xa0, 0x01, 0x04, 0xdb, 0x86, 0x01, 0x85, 0x58, 0x00,
+ 0x03, 0x00, 0x00, 0x0f, 0x04, 0x60, 0xc5, 0x6a, 0xc3, 0xde, 0x01, 0xcf,
+ 0xff, 0x00, 0x01, 0x8f, 0x04, 0x80, 0xc7, 0x8f, 0x01, 0x5e, 0x20, 0x00,
+ 0x13, 0xee, 0x01, 0xc0, 0x00, 0x80, 0x01, 0xc5, 0x58, 0x00, 0x10, 0xee,
+ 0x07, 0x8e, 0x80, 0x20, 0xc2, 0x60, 0x01, 0x62, 0x04, 0xe0, 0x01, 0x62,
+ 0x07, 0x8c, 0x09, 0x34, 0xcf, 0x1e, 0x11, 0x16, 0xc3, 0x5e, 0xc3, 0xfe,
+ 0xcf, 0x1e, 0xe3, 0x5e, 0xa3, 0xfe, 0xcf, 0x1e, 0xe3, 0x5e, 0x13, 0x0e,
+ 0xa3, 0xfe, 0x83, 0xfe, 0x16, 0x0b, 0xc3, 0x7e, 0x05, 0x4d, 0x83, 0x6e,
+ 0xff, 0xf6, 0x16, 0x06, 0x02, 0x8e, 0x80, 0x30, 0x16, 0xf8, 0xc8, 0x09,
+ 0x01, 0x62, 0x04, 0x5b, 0xc8, 0x09, 0x01, 0x62, 0x07, 0x20, 0x09, 0x34,
+ 0x04, 0x5b, 0x04, 0xe0, 0x01, 0x68, 0xc8, 0x20, 0x07, 0xe4, 0x01, 0x18,
+ 0xc3, 0x60, 0x07, 0xe2, 0x07, 0x8f, 0x00, 0x81, 0xd3, 0xe0, 0x07, 0xf4,
+ 0x01, 0x4d, 0x40, 0x00, 0x16, 0x01, 0x05, 0x8f, 0xc8, 0x0f, 0x07, 0xf8,
+ 0x07, 0x8f, 0x00, 0x81, 0xd3, 0xe0, 0x07, 0xee, 0x01, 0x4d, 0x80, 0x00,
+ 0x16, 0x01, 0x05, 0x8f, 0xc8, 0x0f, 0x07, 0xee, 0x01, 0x8d, 0xc0, 0x00,
+ 0xc8, 0x0d, 0x01, 0x1a, 0x04, 0x60, 0xc4, 0x16, 0x07, 0x8c, 0xee, 0x00,
+ 0x06, 0xa0, 0x90, 0x94, 0x07, 0x8c, 0xed, 0x90, 0x06, 0xa0, 0x90, 0x94,
+ 0x04, 0xe0, 0x01, 0x04, 0x04, 0x60, 0xc5, 0x6a, 0x02, 0x85, 0x00, 0x0e,
+ 0x1a, 0x05, 0x01, 0x09, 0x0f, 0x00, 0x13, 0x02, 0x04, 0x60, 0xdd, 0x6a,
+ 0x99, 0x49, 0xea, 0xd0, 0x04, 0x60, 0xdd, 0x54, 0x20, 0x00, 0xb3, 0xcc,
+ 0x00, 0x14, 0x07, 0x8b, 0x01, 0x04, 0x01, 0x5b, 0x20, 0x00, 0x16, 0xfd,
+ 0xd8, 0x20, 0x07, 0xdf, 0x01, 0x17, 0x07, 0x9b, 0xdf, 0x80, 0x20, 0x00,
+ 0xff, 0xc0, 0x00, 0x2a, 0x03, 0x00, 0x00, 0x00, 0x01, 0xe0, 0x01, 0x00,
+ 0x00, 0x80, 0x06, 0x4e, 0x02, 0x01, 0xef, 0xfa, 0xcc, 0x4d, 0xcc, 0x4e,
+ 0xc4, 0x4f, 0x02, 0x00, 0x00, 0x01, 0xc8, 0x00, 0xef, 0xe0, 0x88, 0x00,
+ 0xef, 0xe0, 0x13, 0xfd, 0x02, 0xe0, 0xef, 0xe0, 0x03, 0x80, 0x20, 0x00,
+ 0xae, 0x00, 0x00, 0xaa, 0xc3, 0xce, 0x10, 0x32, 0x00, 0x00, 0xc0, 0x3c,
+ 0x08, 0x4e, 0x00, 0x00, 0xc0, 0x20, 0x07, 0x78, 0x00, 0x00, 0x00, 0x02,
+ 0x08, 0x56, 0x01, 0x0c, 0x00, 0x08, 0x08, 0x62, 0x03, 0xf8, 0x00, 0x06,
+ 0x00, 0x00, 0x12, 0x00, 0x00, 0x02, 0x08, 0x7e, 0x01, 0x8c, 0x00, 0x02,
+ 0x07, 0x78, 0x07, 0xff, 0x00, 0x06, 0x07, 0x7e, 0xfc, 0x76, 0xbe, 0xad,
+ 0x01, 0x0a, 0x00, 0x08, 0x07, 0x8a, 0x00, 0x06, 0x00, 0x00, 0xcf, 0x7a,
+ 0x11, 0x28, 0x00, 0x04, 0x13, 0xa0, 0x13, 0xa0, 0x90, 0x2a, 0x00, 0x02,
+ 0x08, 0x96, 0x97, 0x6a, 0xc0, 0x04, 0x08, 0x9e, 0x00, 0x00, 0x00, 0x00,
+ 0x00, 0x80, 0x9d, 0xc8, 0x01, 0x80, 0x01, 0x00, 0x01, 0x38, 0x01, 0x7c,
+ 0x01, 0xce, 0x02, 0x32, 0x02, 0xae, 0x03, 0x42, 0x03, 0xf8, 0x03, 0xf8,
+ 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8,
+ 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8,
+ 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8,
+ 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8, 0x03, 0xf8,
+ 0x03, 0xf8, 0x03, 0xf8, 0xcc, 0x00, 0x20, 0x00, 0xb2, 0x98, 0x00, 0x04,
+ 0x02, 0x09, 0x14, 0x00, 0x20, 0x00, 0xb2, 0xa8, 0x00, 0x02, 0x90, 0x00,
+ 0x20, 0x00, 0xb1, 0x00, 0x00, 0x02, 0x90, 0x00, 0x20, 0x00, 0xf8, 0x08,
+ 0x00, 0x02, 0x90, 0x00, 0x20, 0x00, 0xc8, 0xbe, 0x00, 0x04, 0xc2, 0xcb,
+ 0xc2, 0xcb, 0x20, 0x00, 0xbf, 0xb4, 0x00, 0x08, 0x88, 0x0b, 0x07, 0x98,
+ 0x88, 0x0b, 0x07, 0x78, 0x20, 0x00, 0xc0, 0x54, 0x00, 0x04, 0x06, 0xa0,
+ 0xfa, 0x06, 0x20, 0x00, 0xc0, 0x5e, 0x00, 0x04, 0x07, 0x84, 0x07, 0x7a,
+ 0x20, 0x00, 0xc0, 0xc2, 0x00, 0x04, 0x04, 0x60, 0xfa, 0x10, 0x20, 0x00,
+ 0xc9, 0xc0, 0x00, 0x02, 0x16, 0xe2, 0x20, 0x00, 0xc9, 0xc2, 0x00, 0x04,
+ 0x06, 0xa0, 0xfa, 0x42, 0x20, 0x00, 0xc9, 0xe8, 0x00, 0x04, 0x04, 0x60,
+ 0xca, 0x0c, 0x20, 0x00, 0xb9, 0xa0, 0x00, 0x04, 0x04, 0x60, 0x98, 0xa0,
+ 0x20, 0x00, 0xbb, 0x92, 0x00, 0x04, 0x06, 0xa0, 0x9a, 0xf4, 0x20, 0x00,
+ 0xbc, 0x20, 0x00, 0x04, 0xc1, 0xe0, 0xfc, 0x02, 0x20, 0x00, 0xc5, 0x5c,
+ 0x00, 0x04, 0x04, 0x60, 0xfc, 0xec, 0x20, 0x00, 0xc5, 0xa2, 0x00, 0x04,
+ 0x04, 0x60, 0xfc, 0x78, 0x20, 0x00, 0xc5, 0xda, 0x00, 0x04, 0x04, 0x60,
+ 0xfc, 0xc6, 0x20, 0x00, 0xc6, 0x1c, 0x00, 0x04, 0x04, 0x60, 0xfd, 0x0e,
+ 0x20, 0x00, 0xc2, 0xe6, 0x00, 0x06, 0x01, 0x20, 0x01, 0x00, 0x00, 0x80,
+ 0x20, 0x00, 0xc3, 0xd4, 0x00, 0x02, 0x01, 0x17, 0x20, 0x00, 0xa2, 0xca,
+ 0x00, 0x02, 0xc5, 0x60, 0x20, 0x00, 0xa2, 0xd2, 0x00, 0x02, 0xfd, 0x24,
+ 0x20, 0x00, 0xa2, 0xf2, 0x00, 0x02, 0xfd, 0x24, 0x20, 0x00, 0xa3, 0x18,
+ 0x00, 0x02, 0xce, 0x98, 0x20, 0x00, 0xc5, 0x6e, 0x00, 0x02, 0x10, 0x0c,
+ 0x20, 0x00, 0xc4, 0x0c, 0x00, 0x04, 0x06, 0xa0, 0xfd, 0xaa, 0x20, 0x00,
+ 0xcc, 0x38, 0x00, 0x02, 0xc7, 0x7e, 0x20, 0x00, 0xa0, 0xc4, 0x00, 0x02,
+ 0xc7, 0x7e, 0x20, 0x00, 0xc5, 0xec, 0x00, 0x02, 0xc7, 0xb4, 0x20, 0x00,
+ 0xa0, 0xc0, 0x00, 0x02, 0xc7, 0xb4, 0x20, 0x00, 0xc5, 0x14, 0x00, 0x04,
+ 0x04, 0x60, 0xfd, 0xec, 0x20, 0x00, 0xc4, 0xe6, 0x00, 0x04, 0x06, 0xa0,
+ 0xfd, 0x60, 0x20, 0x00, 0xc8, 0x2c, 0x00, 0x02, 0x06, 0x69, 0x20, 0x00,
+ 0xcc, 0x60, 0x00, 0x02, 0x06, 0x69, 0x20, 0x00, 0xdc, 0x68, 0x00, 0x02,
+ 0x04, 0x5c, 0x20, 0x00, 0xdc, 0xb8, 0x00, 0x04, 0x04, 0x60, 0xf8, 0x30,
+ 0x20, 0x00, 0xdd, 0x50, 0x00, 0x04, 0x04, 0x60, 0xfe, 0x04, 0x20, 0x80,
+ 0xb4, 0x88, 0x00, 0x02, 0xfb, 0x88, 0x20, 0x80, 0xdf, 0x06, 0x00, 0x02,
+ 0x08, 0xa8, 0x20, 0x00, 0xa0, 0x34, 0x00, 0x0a, 0x00, 0x02, 0x28, 0xf1,
+ 0xf0, 0xf1, 0xf8, 0xe7, 0xe7, 0xe7, 0x20, 0x00, 0xb2, 0x3c, 0x00, 0x02,
+ 0x06, 0x03, 0x20, 0x00, 0xa1, 0x16, 0x00, 0x02, 0x9c, 0x56, 0x20, 0x00,
+ 0xa1, 0x1a, 0x00, 0x02, 0x98, 0x4e, 0x20, 0x00, 0xa1, 0x1c, 0x00, 0x04,
+ 0x08, 0x4e, 0x95, 0xa8, 0x20, 0x00, 0xa1, 0x22, 0x00, 0x02, 0xfa, 0x76,
+ 0x20, 0x00, 0xa1, 0x66, 0x00, 0x02, 0xf8, 0x9a, 0x20, 0x00, 0xa1, 0x6e,
+ 0x00, 0x02, 0x9a, 0x22, 0x20, 0x00, 0xa1, 0x72, 0x00, 0x02, 0x9b, 0x56,
+ 0x20, 0x00, 0xa1, 0x7a, 0x00, 0x02, 0x9a, 0xb0, 0x20, 0x00, 0xa1, 0x80,
+ 0x00, 0x04, 0xef, 0xc0, 0xff, 0xc0, 0x20, 0x00, 0xa1, 0x9c, 0x00, 0x02,
+ 0x9d, 0xb8, 0x20, 0x00, 0xa0, 0xb0, 0x00, 0x02, 0xce, 0xe8, 0x20, 0x00,
+ 0xa0, 0xac, 0x00, 0x02, 0x07, 0x78, 0x20, 0x00, 0xa2, 0xe6, 0x00, 0x02,
+ 0xfc, 0x1c, 0x20, 0x00, 0xf5, 0xc4, 0x00, 0x02, 0x00, 0x02, 0x20, 0x00,
+ 0xf6, 0x7a, 0x00, 0x02, 0x00, 0x02, 0x20, 0x00, 0xf6, 0xae, 0x00, 0x02,
+ 0x00, 0x02, 0x20, 0x00, 0xf5, 0xfa, 0x00, 0x02, 0x02, 0x00, 0x20, 0x00,
+ 0xf6, 0x18, 0x00, 0x02, 0x02, 0x00, 0x20, 0x00, 0xc5, 0xc8, 0x00, 0x04,
+ 0xc2, 0xa0, 0x07, 0xf8, 0x20, 0x00, 0xc6, 0x9a, 0x00, 0x04, 0xc2, 0xa0,
+ 0x07, 0xf8, 0x20, 0x00, 0xc6, 0xdc, 0x00, 0x04, 0xc2, 0xa0, 0x07, 0xf8,
+ 0x20, 0x00, 0xcc, 0x24, 0x00, 0x04, 0xc2, 0xa0, 0x07, 0xee, 0x20, 0x00,
+ 0xa3, 0x64, 0x00, 0x02, 0x07, 0xf8, 0x20, 0x00, 0xa3, 0x6e, 0x00, 0x02,
+ 0x07, 0xf8, 0x20, 0x00, 0xc3, 0xa6, 0x00, 0x02, 0x3f, 0xfe, 0x20, 0x00,
+ 0xa4, 0x46, 0x00, 0x02, 0x07, 0x08, 0x30, 0x00, 0x90, 0xf0, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0x92, 0x2a, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0x93, 0x5c, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0x94, 0x5a, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0x95, 0x16, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xcf, 0xe2, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd0, 0x14, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd0, 0x5e, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd0, 0x98, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd0, 0xea, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd1, 0x52, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd1, 0x76, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd1, 0xb6, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd1, 0xec, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd2, 0x3c, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd2, 0xca, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd3, 0x30, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd4, 0x5a, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd4, 0xaa, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd4, 0xea, 0x00, 0x06,
+ 0xc3, 0xa0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd5, 0x0a, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd5, 0x54, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xd5, 0xae, 0x00, 0x06,
+ 0xc3, 0xe0, 0xf0, 0x00, 0x11, 0xf8, 0x30, 0x00, 0xfb, 0x9e, 0x00, 0x06,
+ 0xc1, 0xe0, 0xf0, 0x00, 0x11, 0x14, 0x30, 0x00, 0xc7, 0x4e, 0x00, 0x06,
+ 0x01, 0x60, 0xf0, 0x00, 0x80, 0x00, 0x30, 0x00, 0xc7, 0x86, 0x00, 0x06,
+ 0x01, 0x60, 0xf0, 0x00, 0x80, 0x00, 0x30, 0x00, 0xc7, 0xbc, 0x00, 0x06,
+ 0x01, 0x60, 0xf0, 0x00, 0x80, 0x00, 0x30, 0x00, 0x95, 0x5e, 0x00, 0x04,
+ 0xed, 0x03, 0xed, 0x03, 0x30, 0x00, 0x95, 0x8a, 0x00, 0x04, 0xed, 0x03,
+ 0xed, 0x03, 0x34, 0x00, 0x91, 0xa4, 0x00, 0x02, 0x60, 0x82, 0x34, 0x00,
+ 0x92, 0x44, 0x00, 0x02, 0x60, 0x82, 0x34, 0x00, 0x93, 0x78, 0x00, 0x02,
+ 0x60, 0x82, 0x34, 0x00, 0x94, 0x7a, 0x00, 0x02, 0x68, 0x82, 0x34, 0x00,
+ 0x95, 0x32, 0x00, 0x02, 0x60, 0x82, 0x34, 0x00, 0x95, 0x6c, 0x00, 0x02,
+ 0x68, 0x82, 0x34, 0x00, 0x95, 0x98, 0x00, 0x02, 0x68, 0x82, 0x34, 0x00,
+ 0x95, 0xda, 0x00, 0x02, 0x20, 0x82, 0x38, 0x00, 0xd0, 0x76, 0x00, 0x02,
+ 0xe0, 0x82, 0x38, 0x00, 0xd0, 0xca, 0x00, 0x02, 0xe0, 0x82, 0x38, 0x00,
+ 0xd4, 0x3a, 0x00, 0x02, 0xe0, 0x82, 0x20, 0x00, 0xa0, 0x02, 0x00, 0x02,
+ 0xf9, 0xe0, 0x20, 0x00, 0xa0, 0x7a, 0x00, 0x02, 0xe5, 0x18, 0x20, 0x80,
+ 0xa0, 0x02, 0x00, 0x02, 0x5b, 0x58, 0x20, 0x80, 0xa0, 0x7a, 0x00, 0x02,
+ 0x83, 0xa0, 0x30, 0x00, 0xa0, 0x02, 0x00, 0x02, 0xae, 0x4f, 0x30, 0x00,
+ 0xa0, 0x7a, 0x00, 0x02, 0x2f, 0xfc, 0x30, 0x80, 0xa0, 0x02, 0x00, 0x02,
+ 0x0f, 0xc7, 0x30, 0x80, 0xa0, 0x7a, 0x00, 0x02, 0xce, 0x84, 0x34, 0x00,
+ 0xa0, 0x02, 0x00, 0x02, 0xae, 0x4f, 0x34, 0x00, 0xa0, 0x7a, 0x00, 0x02,
+ 0x2f, 0xf4, 0x34, 0x80, 0xa0, 0x02, 0x00, 0x02, 0x0f, 0xc7, 0x34, 0x80,
+ 0xa0, 0x7a, 0x00, 0x02, 0xce, 0x7c, 0x38, 0x00, 0xa0, 0x02, 0x00, 0x02,
+ 0xae, 0x52, 0x38, 0x00, 0xa0, 0x7a, 0x00, 0x02, 0x2f, 0xf1, 0x38, 0x80,
+ 0xa0, 0x02, 0x00, 0x02, 0x0f, 0xca, 0x38, 0x80, 0xa0, 0x7a, 0x00, 0x02,
+ 0xce, 0x79, 0x00, 0x00, 0x80, 0x00, 0x09, 0xfc, 0x53, 0x4d, 0x41, 0x43,
+ 0x2e, 0x30, 0x30, 0x2e, 0x33, 0x38, 0x20, 0x20, 0x28, 0x43, 0x29, 0x20,
+ 0x43, 0x6f, 0x70, 0x79, 0x72, 0x69, 0x67, 0x68, 0x74, 0x20, 0x4f, 0x6c,
+ 0x69, 0x63, 0x6f, 0x6d, 0x20, 0x31, 0x39, 0x39, 0x38, 0x2e, 0x00, 0x00,
+ 0x07, 0xa0, 0x13, 0x04, 0xc4, 0x00, 0x01, 0x60, 0x09, 0x6a, 0x80, 0x00,
+ 0x16, 0x03, 0x01, 0xa0, 0x09, 0x6a, 0x00, 0x60, 0x01, 0x60, 0x09, 0x6a,
+ 0x00, 0x40, 0x16, 0x34, 0x01, 0x20, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x30,
+ 0xd8, 0x20, 0x09, 0x2e, 0x13, 0x06, 0xd8, 0x20, 0x01, 0x80, 0x13, 0x08,
+ 0xd8, 0x20, 0x01, 0x82, 0x13, 0x0a, 0x07, 0xa0, 0x13, 0x00, 0x87, 0xe0,
+ 0x07, 0xa0, 0x13, 0x02, 0xed, 0xb6, 0x07, 0xa0, 0x13, 0x14, 0x00, 0x04,
+ 0x06, 0xa0, 0x84, 0xd0, 0x07, 0xa0, 0x13, 0x0c, 0x04, 0x00, 0xd8, 0x20,
+ 0xef, 0x54, 0x09, 0x2e, 0x01, 0xe0, 0x13, 0x0c, 0x10, 0x00, 0x01, 0xa0,
+ 0x13, 0x0c, 0x28, 0x00, 0x01, 0x60, 0x09, 0x6a, 0x00, 0x20, 0x16, 0x03,
+ 0x01, 0xe0, 0x13, 0x0c, 0x28, 0x00, 0x07, 0xa0, 0x13, 0x4c, 0x00, 0x02,
+ 0x02, 0x0a, 0x00, 0x02, 0x01, 0xe0, 0x13, 0x0e, 0x01, 0x80, 0x10, 0x09,
+ 0x07, 0xa0, 0x13, 0x00, 0xdb, 0xc4, 0x07, 0xa0, 0x13, 0x02, 0xea, 0xb0,
+ 0x01, 0xa0, 0x13, 0x0c, 0x38, 0x00, 0x06, 0xa0, 0xdc, 0x32, 0xc2, 0xe0,
+ 0x13, 0x00, 0x04, 0x5b, 0x01, 0x4e, 0x00, 0x40, 0x16, 0x02, 0x04, 0x60,
+ 0xcc, 0xb4, 0x02, 0x0d, 0x12, 0x00, 0x04, 0x60, 0xcc, 0xa6, 0x01, 0x60,
+ 0x13, 0x0c, 0x10, 0x00, 0x13, 0x02, 0x04, 0x60, 0xe3, 0xce, 0xc8, 0x0b,
+ 0x13, 0x52, 0x06, 0xa0, 0xe3, 0xce, 0xd8, 0x20, 0xe0, 0x0a, 0xfc, 0x06,
+ 0xc2, 0xe0, 0x13, 0x52, 0x04, 0x5b, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00,
+ 0x16, 0x06, 0x02, 0x84, 0x00, 0x12, 0x13, 0x15, 0x02, 0x84, 0x00, 0x14,
+ 0x13, 0x2d, 0x06, 0xa0, 0xe3, 0xce, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00,
+ 0x16, 0x0a, 0xd8, 0x20, 0xe0, 0x0a, 0x04, 0x06, 0x88, 0x20, 0x13, 0x54,
+ 0x03, 0xf8, 0x13, 0x03, 0x07, 0xa0, 0x03, 0xf8, 0x81, 0x8c, 0x04, 0x60,
+ 0xdb, 0x96, 0x02, 0x04, 0x00, 0x08, 0x06, 0xa0, 0xe3, 0xce, 0x07, 0xa0,
+ 0x03, 0xf8, 0x81, 0x8c, 0x02, 0x05, 0x04, 0x04, 0x02, 0x06, 0xef, 0x5c,
+ 0xcd, 0x76, 0xcd, 0x76, 0x02, 0x25, 0x00, 0x0c, 0xcd, 0x76, 0xcd, 0x76,
+ 0xcd, 0x76, 0xcd, 0x60, 0x13, 0x12, 0xcd, 0x76, 0xcd, 0x60, 0x13, 0x4c,
+ 0xcd, 0x76, 0xc5, 0x60, 0x09, 0x1e, 0x10, 0xe3, 0x02, 0x04, 0x00, 0x08,
+ 0x06, 0xa0, 0xe3, 0xce, 0x07, 0xa0, 0x03, 0xf8, 0x81, 0x8c, 0x02, 0x05,
+ 0x04, 0x04, 0x02, 0x06, 0xef, 0x6a, 0xcd, 0x76, 0xcd, 0x76, 0x02, 0x25,
+ 0x00, 0x0c, 0xcd, 0x76, 0xcd, 0x76, 0x10, 0xd1, 0x04, 0x60, 0x87, 0xe0,
+ 0x01, 0x4f, 0x00, 0x0a, 0x16, 0x03, 0x01, 0x4f, 0x00, 0x80, 0x04, 0x5b,
+ 0x04, 0x60, 0xda, 0x04, 0xc0, 0xc3, 0x13, 0x06, 0x01, 0x60, 0x13, 0x0c,
+ 0x10, 0x00, 0x16, 0x02, 0x01, 0xd6, 0x00, 0x80, 0x07, 0x86, 0x07, 0x36,
+ 0x04, 0x60, 0xe3, 0x7a, 0xa0, 0x60, 0x13, 0x02, 0xc1, 0x11, 0x04, 0x54,
+ 0x01, 0x48, 0x40, 0x00, 0x16, 0x06, 0x01, 0x88, 0x40, 0x00, 0x02, 0x28,
+ 0xef, 0x00, 0x04, 0x60, 0xe0, 0x36, 0x02, 0x28, 0xe3, 0xee, 0x04, 0x60,
+ 0xe0, 0x36, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x06, 0x02, 0x85,
+ 0x00, 0x12, 0x13, 0x0a, 0x02, 0x85, 0x00, 0x14, 0x13, 0x07, 0x02, 0x85,
+ 0x00, 0x15, 0x13, 0x24, 0x02, 0x85, 0x00, 0x10, 0x04, 0x60, 0xdd, 0x4c,
+ 0x02, 0x03, 0x80, 0x02, 0x88, 0x24, 0x00, 0x14, 0xe0, 0x1c, 0x16, 0x19,
+ 0x05, 0x83, 0x05, 0x83, 0x92, 0x60, 0xef, 0x9e, 0x16, 0x14, 0x05, 0x83,
+ 0x99, 0x20, 0xe0, 0x0e, 0x00, 0x18, 0x16, 0x0f, 0x05, 0x83, 0x05, 0x83,
+ 0x02, 0x85, 0x00, 0x12, 0x16, 0x05, 0x99, 0x20, 0xef, 0xa0, 0x00, 0x19,
+ 0x16, 0x06, 0x10, 0x04, 0x99, 0x20, 0xef, 0xa1, 0x00, 0x19, 0x16, 0x01,
+ 0x04, 0xc3, 0x04, 0x5c, 0x02, 0x03, 0x80, 0x02, 0x88, 0x24, 0x00, 0x14,
+ 0xe0, 0x1e, 0x16, 0xf9, 0x05, 0x83, 0x05, 0x83, 0x92, 0x60, 0xef, 0x9e,
+ 0x16, 0xf4, 0x04, 0xc3, 0x10, 0xf2, 0x02, 0x85, 0x00, 0x15, 0x13, 0x09,
+ 0x02, 0x85, 0x00, 0x09, 0x13, 0x02, 0x06, 0xa0, 0xe2, 0xe4, 0xa1, 0x45,
+ 0xc1, 0x65, 0xe3, 0xac, 0x04, 0x55, 0x06, 0xa0, 0xe1, 0xa2, 0x01, 0x60,
+ 0x13, 0x0c, 0x04, 0x00, 0x16, 0x19, 0x01, 0x4f, 0x00, 0x80, 0x16, 0x09,
+ 0x01, 0xe0, 0x13, 0x0e, 0x20, 0x00, 0x02, 0x03, 0x80, 0x10, 0x06, 0xa0,
+ 0xe3, 0x56, 0x06, 0xa0, 0xe2, 0x72, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0x10,
+ 0x07, 0xa0, 0x13, 0x00, 0x87, 0xe0, 0x07, 0xa0, 0x13, 0x02, 0xed, 0xb6,
+ 0x01, 0x8f, 0x00, 0x80, 0x02, 0x0a, 0x00, 0x08, 0x04, 0x60, 0x80, 0xbe,
+ 0x02, 0x0d, 0x80, 0x00, 0x01, 0x60, 0x13, 0x0c, 0x10, 0x00, 0x16, 0x02,
+ 0x02, 0x0d, 0x80, 0x80, 0x04, 0x52, 0x01, 0x60, 0x13, 0x0e, 0x20, 0x00,
+ 0x16, 0x02, 0x02, 0x03, 0x82, 0x00, 0x04, 0x60, 0xdb, 0xb8, 0x02, 0x8f,
+ 0x00, 0x06, 0x16, 0x56, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0xa0, 0x05, 0xa0,
+ 0x13, 0x16, 0x06, 0xa0, 0x85, 0x30, 0x02, 0x08, 0xc0, 0x00, 0x06, 0xa0,
+ 0xe0, 0x22, 0x01, 0xcd, 0x04, 0x00, 0x10, 0x48, 0x02, 0x8f, 0x00, 0x02,
+ 0x16, 0x45, 0x02, 0x08, 0xc0, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd,
+ 0x08, 0x00, 0x10, 0x3e, 0x93, 0xe0, 0xef, 0xa3, 0x13, 0x03, 0x93, 0xe0,
+ 0xef, 0xa4, 0x16, 0x38, 0xd2, 0xa0, 0xef, 0xa5, 0x10, 0x35, 0x02, 0x8f,
+ 0x00, 0x06, 0x16, 0x32, 0x02, 0x03, 0x00, 0x03, 0x04, 0x60, 0x82, 0xc2,
+ 0x93, 0xe0, 0xef, 0xa5, 0x16, 0x2b, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0x80,
+ 0x06, 0xa0, 0x85, 0x30, 0x04, 0xcf, 0x02, 0x0a, 0x00, 0x04, 0x02, 0x08,
+ 0xc0, 0x1e, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x03, 0x68, 0x00, 0x06, 0xa0,
+ 0xe3, 0x56, 0x02, 0x03, 0x80, 0x10, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x16,
+ 0x02, 0x8f, 0x00, 0x04, 0x16, 0x13, 0x02, 0x03, 0x00, 0x03, 0x04, 0x60,
+ 0x82, 0xc2, 0x02, 0x8f, 0x00, 0x02, 0x16, 0x7a, 0x01, 0x60, 0x13, 0x0e,
+ 0x00, 0x08, 0x16, 0x02, 0x04, 0x60, 0x85, 0x56, 0x02, 0x0a, 0x00, 0x04,
+ 0x02, 0x08, 0xc0, 0x1e, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x6d, 0x01, 0x60,
+ 0x13, 0x0e, 0x40, 0x00, 0x16, 0x69, 0x02, 0x8f, 0x00, 0x06, 0x16, 0x07,
+ 0x01, 0xe0, 0x13, 0x0e, 0x00, 0xa0, 0x05, 0xa0, 0x13, 0x16, 0x06, 0xa0,
+ 0x85, 0x30, 0x02, 0x08, 0xc0, 0x30, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd,
+ 0x01, 0x00, 0x10, 0x58, 0x93, 0xe0, 0xef, 0xa3, 0x16, 0x55, 0x02, 0x08,
+ 0xc0, 0x36, 0x06, 0xa0, 0xe0, 0x22, 0x07, 0xa0, 0x07, 0x08, 0x00, 0x05,
+ 0x01, 0x60, 0x13, 0x0e, 0x04, 0x00, 0x16, 0x03, 0x07, 0xa0, 0x07, 0x08,
+ 0x00, 0x02, 0x02, 0x05, 0x03, 0xf8, 0x02, 0x04, 0x00, 0x04, 0x04, 0x60,
+ 0x80, 0xfa, 0xc1, 0x20, 0x01, 0x84, 0x02, 0x44, 0x88, 0x00, 0x13, 0x12,
+ 0x48, 0x04, 0x01, 0x84, 0x06, 0x20, 0x07, 0x02, 0x16, 0x08, 0x01, 0xe0,
+ 0x13, 0x0e, 0x04, 0x00, 0x07, 0x83, 0xc0, 0x00, 0x06, 0xa0, 0xe3, 0x56,
+ 0x10, 0x2f, 0x02, 0x08, 0xc0, 0x3c, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x2a,
+ 0x01, 0xe0, 0x01, 0x82, 0x40, 0x00, 0x06, 0xa0, 0xe0, 0x18, 0x07, 0x20,
+ 0x07, 0x02, 0x01, 0x8e, 0x80, 0x00, 0x01, 0xa0, 0x13, 0x0e, 0x06, 0x00,
+ 0x10, 0x1d, 0x02, 0x8f, 0x00, 0x02, 0x16, 0x1a, 0x01, 0x20, 0x13, 0x0e,
+ 0x00, 0x40, 0x16, 0x16, 0xc2, 0x20, 0x13, 0x14, 0x13, 0x09, 0x06, 0x20,
+ 0x13, 0x14, 0x02, 0x08, 0xc0, 0x42, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd,
+ 0x08, 0x00, 0x10, 0x0a, 0x01, 0x60, 0x13, 0x0c, 0x20, 0x00, 0x13, 0x02,
+ 0x04, 0x60, 0x85, 0x56, 0x02, 0x03, 0x00, 0x05, 0x04, 0x60, 0x82, 0xc2,
+ 0x04, 0x60, 0x87, 0xe0, 0x02, 0x8f, 0x00, 0x06, 0x16, 0x04, 0x02, 0x03,
+ 0x00, 0x05, 0x04, 0x60, 0x82, 0xc2, 0x01, 0x60, 0x13, 0x0e, 0x20, 0x00,
+ 0x16, 0xf3, 0x93, 0xe0, 0xef, 0xa2, 0x16, 0xf0, 0x01, 0xa0, 0x13, 0x0e,
+ 0x50, 0x80, 0x06, 0xa0, 0x85, 0x30, 0x01, 0xce, 0x00, 0x01, 0xd2, 0xa0,
+ 0xef, 0xa3, 0x07, 0xa0, 0x07, 0x08, 0x00, 0x05, 0x01, 0x60, 0x13, 0x0e,
+ 0x04, 0x00, 0x16, 0x03, 0x07, 0xa0, 0x07, 0x08, 0x00, 0x02, 0x02, 0x08,
+ 0xc0, 0x36, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x0c, 0x06, 0xa0,
+ 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x18, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0xd0,
+ 0x02, 0x8f, 0x00, 0x08, 0x16, 0xcd, 0x07, 0xa0, 0x13, 0x14, 0x00, 0x0c,
+ 0x04, 0x60, 0x80, 0x74, 0xc3, 0x0b, 0x06, 0xa0, 0x85, 0x48, 0x06, 0xa0,
+ 0x84, 0xf2, 0xc2, 0xcc, 0x04, 0xe0, 0x13, 0x0e, 0x04, 0xe0, 0x13, 0x16,
+ 0x04, 0xe0, 0x06, 0xdc, 0x04, 0xe0, 0x06, 0xde, 0x04, 0xe0, 0x06, 0xe0,
+ 0x04, 0x5b, 0x02, 0x06, 0x00, 0x05, 0x02, 0x04, 0x13, 0x1a, 0xc1, 0x54,
+ 0x13, 0x01, 0x2c, 0xd4, 0x02, 0x24, 0x00, 0x0a, 0x06, 0x06, 0x16, 0xf9,
+ 0x04, 0x5b, 0x02, 0x06, 0x00, 0x05, 0x02, 0x04, 0x06, 0x72, 0xc1, 0x54,
+ 0x13, 0x01, 0x2c, 0xd4, 0x02, 0x24, 0x00, 0x0a, 0x06, 0x06, 0x16, 0xf9,
+ 0x04, 0x5b, 0x01, 0x60, 0x13, 0x0e, 0x08, 0x00, 0x16, 0x03, 0x01, 0xe0,
+ 0x01, 0x82, 0x20, 0x00, 0x01, 0x60, 0x13, 0x0e, 0x00, 0x80, 0x16, 0x04,
+ 0x01, 0xe0, 0x01, 0x82, 0x0a, 0x00, 0x10, 0x03, 0x01, 0xa0, 0x01, 0x82,
+ 0x0a, 0x00, 0x04, 0x5b, 0x01, 0xa0, 0x01, 0x82, 0x28, 0x00, 0x01, 0xe0,
+ 0x01, 0x82, 0x10, 0x00, 0x04, 0x5b, 0x06, 0xa0, 0x84, 0xf2, 0x04, 0xe0,
+ 0x13, 0x0e, 0xd8, 0x20, 0x13, 0x06, 0x09, 0x2e, 0xd8, 0x20, 0x13, 0x08,
+ 0x01, 0x80, 0xd8, 0x20, 0x13, 0x0a, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18,
+ 0x04, 0x60, 0xe5, 0x62, 0xc0, 0x62, 0x00, 0x04, 0xc8, 0x22, 0x00, 0x06,
+ 0x01, 0x6c, 0x02, 0x82, 0x04, 0x00, 0x1b, 0x0d, 0x01, 0x8e, 0x08, 0x00,
+ 0x02, 0x8f, 0x00, 0x06, 0x16, 0x08, 0x06, 0x20, 0x13, 0x16, 0x16, 0x05,
+ 0x01, 0xa0, 0x13, 0x0e, 0x00, 0xa0, 0x06, 0xa0, 0x85, 0x30, 0xc1, 0x22,
+ 0x00, 0x0e, 0x04, 0x51, 0xc8, 0x02, 0x01, 0x6c, 0xa0, 0x82, 0xc8, 0x22,
+ 0x0c, 0x32, 0xfc, 0x00, 0x02, 0x02, 0xfc, 0x00, 0x93, 0xe0, 0xe3, 0xaa,
+ 0x13, 0x71, 0x06, 0xa0, 0xdc, 0xc6, 0x01, 0xa2, 0x00, 0x0e, 0x80, 0x00,
+ 0xc8, 0x05, 0x06, 0xfc, 0xc0, 0xc3, 0x16, 0x43, 0x01, 0x22, 0x00, 0x16,
+ 0x0f, 0x00, 0x16, 0x10, 0x88, 0x22, 0x00, 0x0e, 0x09, 0x6c, 0x16, 0x0c,
+ 0x88, 0x22, 0x00, 0x10, 0x09, 0x6e, 0x16, 0x08, 0x88, 0x22, 0x00, 0x12,
+ 0x09, 0x70, 0x16, 0x04, 0x06, 0xa0, 0xe1, 0xa2, 0x04, 0x60, 0x87, 0xe0,
+ 0x98, 0xa0, 0xef, 0xa6, 0x00, 0x16, 0x13, 0x04, 0x98, 0xa0, 0xef, 0xa7,
+ 0x00, 0x16, 0x16, 0x15, 0xc2, 0xe0, 0x06, 0xdc, 0x16, 0x06, 0xc2, 0xe0,
+ 0x06, 0xde, 0x16, 0x03, 0xc2, 0xe0, 0x06, 0xe0, 0x13, 0x0c, 0x88, 0x22,
+ 0x00, 0x0e, 0x06, 0xdc, 0x16, 0x71, 0x88, 0x22, 0x00, 0x10, 0x06, 0xde,
+ 0x16, 0x6d, 0x88, 0x22, 0x00, 0x12, 0x06, 0xe0, 0x16, 0x69, 0x02, 0x85,
+ 0x00, 0x09, 0x13, 0x0b, 0x02, 0x85, 0x00, 0x15, 0x13, 0x08, 0x02, 0x85,
+ 0x00, 0x12, 0x13, 0x0d, 0x02, 0x85, 0x00, 0x14, 0x13, 0x0e, 0x06, 0xa0,
+ 0xe2, 0xe4, 0xa1, 0x45, 0xc1, 0x65, 0xef, 0x72, 0x04, 0x55, 0x06, 0xa0,
+ 0xe0, 0x6e, 0x04, 0x60, 0x87, 0xe0, 0xc8, 0x24, 0x00, 0x1a, 0x13, 0x4e,
+ 0x10, 0xf4, 0xc8, 0x24, 0x00, 0x1a, 0x13, 0x50, 0x10, 0xf0, 0x01, 0x20,
+ 0x13, 0x0e, 0x02, 0x00, 0x16, 0x07, 0x04, 0xe0, 0x01, 0x84, 0x01, 0xa0,
+ 0x01, 0x82, 0x40, 0x00, 0x06, 0xa0, 0xe0, 0x18, 0x07, 0xa0, 0x07, 0x02,
+ 0x00, 0x04, 0x01, 0xe0, 0x13, 0x0e, 0x02, 0x00, 0x01, 0xce, 0x80, 0x00,
+ 0x02, 0x08, 0xc0, 0x3c, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0x87, 0xe0,
+ 0x06, 0xa0, 0xe1, 0xa2, 0x04, 0x60, 0x87, 0xe0, 0x06, 0xa0, 0xe1, 0xa2,
+ 0x02, 0x03, 0x00, 0x05, 0x01, 0x4f, 0x00, 0x80, 0x16, 0x02, 0x02, 0x03,
+ 0x82, 0x00, 0x04, 0x60, 0x82, 0xc2, 0x01, 0x60, 0x13, 0x0e, 0x20, 0x00,
+ 0x16, 0x24, 0x93, 0xe0, 0xef, 0xa2, 0x16, 0x0c, 0x01, 0x60, 0x13, 0x0e,
+ 0x20, 0x00, 0x16, 0x28, 0x02, 0x03, 0xa0, 0x00, 0x06, 0xa0, 0xe3, 0x56,
+ 0x01, 0xa0, 0x13, 0x0e, 0x50, 0x00, 0x10, 0x03, 0x93, 0xe0, 0xef, 0xa3,
+ 0x16, 0x1d, 0x01, 0xce, 0x00, 0x02, 0xd2, 0xa0, 0xef, 0xa4, 0x02, 0x08,
+ 0xc0, 0x0c, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x18, 0x06, 0xa0,
+ 0xe0, 0x22, 0x10, 0x10, 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x03, 0x00, 0x0b,
+ 0x10, 0x04, 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x03, 0x00, 0x05, 0x01, 0x4f,
+ 0x00, 0x80, 0x16, 0x02, 0x02, 0x03, 0x82, 0x00, 0x04, 0x60, 0x82, 0xc2,
+ 0x10, 0xbd, 0x02, 0x8f, 0x00, 0x02, 0x13, 0xf1, 0x02, 0x8f, 0x00, 0x04,
+ 0x13, 0xee, 0x01, 0x60, 0x13, 0x0e, 0x40, 0x00, 0x16, 0xf5, 0x02, 0x08,
+ 0xc0, 0x48, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0xf0, 0x02, 0x8f, 0x00, 0x02,
+ 0x16, 0xab, 0xc0, 0xe0, 0x13, 0x4e, 0x16, 0x0e, 0x01, 0x60, 0x13, 0x0c,
+ 0x08, 0x00, 0x13, 0xa8, 0x01, 0xe0, 0x13, 0x0e, 0x00, 0x48, 0x06, 0xa0,
+ 0xe1, 0xa2, 0x02, 0x08, 0xc0, 0x24, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0x22,
+ 0x02, 0x83, 0x00, 0x02, 0x16, 0xd9, 0xc8, 0x24, 0x00, 0x0e, 0x06, 0xdc,
+ 0xc8, 0x24, 0x00, 0x10, 0x06, 0xde, 0xc8, 0x24, 0x00, 0x12, 0x06, 0xe0,
+ 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x08, 0xc0, 0x24, 0x06, 0xa0, 0xe0, 0x22,
+ 0x01, 0xe0, 0x13, 0x0e, 0x00, 0x40, 0xc0, 0xe0, 0x13, 0x12, 0x16, 0x04,
+ 0x01, 0xa0, 0x13, 0x0e, 0x08, 0x01, 0x10, 0x06, 0x02, 0x83, 0x00, 0x01,
+ 0x16, 0x03, 0x01, 0xe0, 0x13, 0x0e, 0x08, 0x01, 0x10, 0x17, 0x02, 0x8f,
+ 0x00, 0x06, 0x16, 0xb6, 0xc0, 0xe0, 0x13, 0x50, 0x02, 0x83, 0x00, 0x00,
+ 0x16, 0x05, 0x06, 0xa0, 0xe1, 0xa2, 0x02, 0x0a, 0x00, 0x0a, 0x10, 0x0a,
+ 0x02, 0x83, 0x80, 0x20, 0x16, 0x04, 0x02, 0x03, 0x00, 0x08, 0x04, 0x60,
+ 0x82, 0xc2, 0x16, 0xa4, 0x04, 0x60, 0xda, 0x04, 0x92, 0xa0, 0xe0, 0x26,
+ 0x16, 0x0d, 0xd3, 0xe0, 0xe0, 0x26, 0x01, 0x4f, 0x00, 0x80, 0x13, 0x07,
+ 0xc1, 0x0a, 0x83, 0xc4, 0x13, 0x08, 0xc3, 0xc4, 0xc1, 0x24, 0xed, 0xd6,
+ 0x04, 0x54, 0x10, 0x03, 0x93, 0xca, 0x13, 0xec, 0xd3, 0xca, 0x03, 0xb0,
+ 0xd8, 0x0f, 0x06, 0x59, 0x71, 0x04, 0xc1, 0x24, 0xed, 0xe2, 0x04, 0x54,
+ 0xf8, 0x20, 0xef, 0x54, 0x01, 0x80, 0xf8, 0x20, 0xef, 0x56, 0x01, 0x82,
+ 0x06, 0xa0, 0xe0, 0x18, 0x2e, 0xe0, 0x00, 0x00, 0xc8, 0x20, 0x09, 0x6c,
+ 0x01, 0xa0, 0xc8, 0x20, 0x09, 0x6e, 0x01, 0xa2, 0xc8, 0x20, 0x09, 0x70,
+ 0x01, 0xa4, 0x02, 0x08, 0xc0, 0x06, 0x06, 0xa0, 0xe0, 0x22, 0x10, 0xcc,
+ 0x07, 0xa0, 0x06, 0xc6, 0x02, 0x00, 0x07, 0xa0, 0x06, 0xc8, 0x00, 0x02,
+ 0xd8, 0x20, 0xef, 0x58, 0x09, 0x2e, 0xd8, 0x20, 0xef, 0x58, 0x01, 0x80,
+ 0xd8, 0x20, 0xef, 0x5a, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18, 0x04, 0xe0,
+ 0x01, 0x9e, 0x02, 0x08, 0xc0, 0x2a, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x04,
+ 0x00, 0x0a, 0x02, 0x05, 0x03, 0xf4, 0x06, 0xa0, 0xe3, 0xce, 0x07, 0xa0,
+ 0x03, 0xf8, 0x88, 0x94, 0x01, 0x4e, 0x08, 0x00, 0x13, 0xa9, 0x01, 0xce,
+ 0x08, 0x00, 0x2e, 0xa0, 0x03, 0xf4, 0x10, 0xa4, 0x03, 0xb0, 0x98, 0x20,
+ 0xe0, 0x0e, 0x06, 0x65, 0x16, 0x9f, 0x92, 0xa0, 0xe0, 0x26, 0x16, 0x9c,
+ 0x02, 0x44, 0x5e, 0x00, 0x16, 0x0b, 0x06, 0x20, 0x06, 0xc6, 0x16, 0xdd,
+ 0x02, 0x0a, 0x00, 0x06, 0x10, 0x95, 0x03, 0xb0, 0x98, 0x20, 0xe0, 0x0e,
+ 0x06, 0x65, 0x16, 0x8e, 0x06, 0x20, 0x06, 0xc8, 0x16, 0xc5, 0x04, 0x60,
+ 0xe6, 0x6a, 0xd8, 0x20, 0xef, 0x54, 0x09, 0x2e, 0xd8, 0x20, 0xef, 0x54,
+ 0x01, 0x80, 0xd8, 0x20, 0xef, 0x56, 0x01, 0x82, 0x06, 0xa0, 0xe0, 0x18,
+ 0x01, 0xe0, 0x13, 0x0e, 0x40, 0x20, 0x07, 0xa0, 0x13, 0x16, 0x00, 0x01,
+ 0x02, 0x08, 0xc0, 0x30, 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x48,
+ 0x06, 0xa0, 0xe0, 0x22, 0x02, 0x08, 0xc0, 0x12, 0x06, 0xa0, 0xe0, 0x22,
+ 0x02, 0x08, 0xc0, 0x00, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0xcd, 0x04, 0x00,
+ 0x04, 0x60, 0x87, 0xe0, 0x06, 0xa0, 0x85, 0x48, 0x01, 0xce, 0x00, 0x20,
+ 0x2e, 0xe0, 0x00, 0x00, 0x04, 0xcd, 0x06, 0xa0, 0x85, 0x0a, 0x02, 0x08,
+ 0xc0, 0x4e, 0x06, 0xa0, 0xe0, 0x22, 0x04, 0x60, 0x87, 0xe0, 0x01, 0xa0,
+ 0x13, 0x0e, 0x00, 0x80, 0x06, 0xa0, 0x85, 0x22, 0x01, 0xcf, 0x00, 0x80,
+ 0x01, 0xe0, 0x13, 0x0e, 0x10, 0x00, 0x01, 0x60, 0x13, 0x0e, 0x00, 0x01,
+ 0x16, 0x04, 0x07, 0x88, 0x80, 0x06, 0x06, 0xa0, 0xe0, 0x22, 0x01, 0x20,
+ 0x13, 0x0e, 0x20, 0x00, 0x16, 0x07, 0x01, 0xe0, 0x13, 0x0e, 0x20, 0x00,
+ 0x04, 0xc3, 0x06, 0xa0, 0xe3, 0x56, 0x10, 0x0e, 0x01, 0x8e, 0x00, 0x03,
+ 0x02, 0x03, 0x00, 0x10, 0x06, 0xa0, 0xe3, 0x56, 0x01, 0x60, 0x13, 0x0e,
+ 0x00, 0x10, 0x16, 0x04, 0x02, 0x03, 0x80, 0x08, 0x06, 0xa0, 0xe3, 0x56,
+ 0xc8, 0x20, 0xe4, 0x6e, 0x01, 0x86, 0x2e, 0xe0, 0x00, 0x01, 0x01, 0x8e,
+ 0x00, 0x20, 0x04, 0x60, 0x87, 0xdc, 0x02, 0x03, 0xa8, 0x00, 0x01, 0x60,
+ 0x07, 0x08, 0x00, 0x02, 0x16, 0x02, 0x02, 0x03, 0xe8, 0x00, 0x06, 0xa0,
+ 0xe3, 0x56, 0x01, 0x4e, 0x00, 0x20, 0x13, 0x06, 0x01, 0xce, 0x00, 0x20,
+ 0x2e, 0xe0, 0x00, 0x00, 0xc0, 0x41, 0x16, 0xfa, 0x06, 0xa0, 0xe1, 0x2e,
+ 0x02, 0x4a, 0xff, 0x00, 0x02, 0x4f, 0xff, 0x80, 0x02, 0x05, 0x03, 0xf8,
+ 0x02, 0x04, 0x00, 0x04, 0x04, 0x60, 0x80, 0xfa, 0x02, 0x4a, 0xff, 0x00,
+ 0x02, 0x4f, 0xff, 0x80, 0x04, 0x60, 0x87, 0xdc, 0x06, 0xa0, 0x85, 0x48,
+ 0x04, 0x60, 0x87, 0xdc, 0x06, 0xa0, 0x84, 0xf2, 0x04, 0xe0, 0x13, 0x0e,
+ 0x01, 0xce, 0x00, 0x08, 0x04, 0x60, 0xe7, 0xf6, 0x00, 0x00, 0x89, 0xfc,
+ 0x06, 0x05, 0x00, 0x00, 0x00, 0x00, 0xad, 0x90, 0x00, 0x62, 0xc0, 0x80,
+ 0x13, 0x00, 0x00, 0x00, 0x00, 0x02, 0x13, 0x00, 0xdb, 0xc4, 0x00, 0x02,
+ 0x13, 0x02, 0xea, 0xb0, 0x00, 0x02, 0x13, 0x54, 0xdc, 0x16, 0x00, 0x02,
+ 0x09, 0x1e, 0x00, 0x00, 0x00, 0x02, 0x13, 0x12, 0x00, 0x01, 0x00, 0x00,
+ 0xda, 0x88, 0xda, 0x7c, 0x86, 0x6e, 0xda, 0xa6, 0xda, 0x9e, 0xdb, 0x86,
+ 0xdb, 0x86, 0xdb, 0x86, 0xda, 0xa8, 0x85, 0xa8, 0x85, 0x78, 0xdb, 0x78,
+ 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x86, 0xdb, 0x9e, 0x88, 0x14,
+ 0x88, 0x44, 0x88, 0xca, 0x89, 0x14, 0x89, 0x32, 0xdb, 0xf6, 0x89, 0x9a,
+ 0x89, 0xd8, 0x89, 0xe4, 0xe4, 0x6e, 0xdb, 0x9e, 0x89, 0xec, 0xdb, 0x9e,
+ 0x00, 0x00, 0xaf, 0x00, 0x00, 0xa8, 0x13, 0x24, 0x82, 0xd2, 0x00, 0x14,
+ 0x13, 0x1a, 0x82, 0xf4, 0x00, 0x04, 0x13, 0x38, 0x83, 0x08, 0x02, 0xbc,
+ 0x13, 0x1a, 0x83, 0x1a, 0x07, 0x08, 0x13, 0x1a, 0x83, 0x28, 0x03, 0xe8,
+ 0x13, 0x1a, 0x83, 0x58, 0x00, 0xf0, 0x13, 0x1a, 0x83, 0x66, 0x00, 0x14,
+ 0x13, 0x24, 0x88, 0xb6, 0x00, 0x04, 0x13, 0x2e, 0x83, 0x86, 0x00, 0x64,
+ 0x13, 0x2e, 0x83, 0xb0, 0x00, 0x02, 0x13, 0x42, 0x83, 0xde, 0x00, 0x05,
+ 0x13, 0x1a, 0x84, 0x26, 0x00, 0x04, 0x13, 0x38, 0x84, 0x64, 0x01, 0xf4,
+ 0x13, 0x1a, 0x84, 0xc0, 0x00, 0x14, 0xae, 0x00, 0xd9, 0x00, 0x02, 0x00,
+ 0xd9, 0x00, 0x00, 0x1e, 0x10, 0x00, 0x00, 0x10, 0x30, 0x11, 0x04, 0x0c,
+ 0x04, 0x0e, 0x04, 0x21, 0x00, 0x12, 0x10, 0x00, 0x00, 0x04, 0x30, 0x13,
+ 0xdb, 0xa8, 0xe8, 0x7c, 0x86, 0xbe, 0x86, 0xa8, 0x86, 0xa8, 0x87, 0x26,
+ 0x86, 0xa8, 0xeb, 0xf2, 0xdb, 0xa8, 0x86, 0xa0, 0xec, 0x04, 0xe8, 0x62,
+ 0xec, 0x10, 0xec, 0x10, 0xed, 0x3a, 0xed, 0x44, 0xed, 0x4e, 0x86, 0xa0,
+ 0x87, 0x44, 0x86, 0xa0, 0x87, 0xb2, 0x86, 0xa0, 0x03, 0x00, 0x0f, 0x0d,
+ 0x00, 0x02, 0x04, 0x06, 0x00, 0x03, 0x00, 0x00, 0xb2, 0xa8, 0x00, 0x02,
+ 0x80, 0x00, 0x00, 0x00, 0xb1, 0x00, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00,
+ 0xf8, 0x08, 0x00, 0x02, 0x80, 0x00, 0x00, 0x00, 0xb9, 0x0c, 0x00, 0x06,
+ 0x48, 0x20, 0x13, 0x04, 0x01, 0x80, 0x00, 0x00, 0xba, 0x38, 0x00, 0x06,
+ 0x48, 0x20, 0x13, 0x04, 0x01, 0x80, 0x00, 0x00, 0xbc, 0x88, 0x00, 0x06,
+ 0x48, 0x20, 0x13, 0x04, 0x01, 0x80, 0x00, 0x00, 0xca, 0xaa, 0x00, 0x04,
+ 0x04, 0x60, 0x82, 0xb0, 0x00, 0x00, 0xc8, 0x2c, 0x00, 0x02, 0x06, 0x09,
+ 0x00, 0x00, 0xcc, 0x60, 0x00, 0x02, 0x06, 0x09, 0x00, 0x00, 0xdb, 0x1c,
+ 0x00, 0x04, 0x04, 0x60, 0x82, 0x56, 0x00, 0x00, 0xe0, 0xc8, 0x00, 0x02,
+ 0x80, 0xda, 0x00, 0x00, 0xed, 0x74, 0x00, 0x02, 0x80, 0xda, 0x00, 0x00,
+ 0xed, 0x94, 0x00, 0x02, 0x80, 0xda, 0x00, 0x00, 0xe7, 0xae, 0x00, 0x04,
+ 0x06, 0xa0, 0x81, 0x90, 0x00, 0x00, 0xe5, 0xb0, 0x00, 0x04, 0x04, 0x60,
+ 0x80, 0x28, 0x00, 0x00, 0xdb, 0xc0, 0x00, 0x04, 0x04, 0x60, 0x80, 0xbe,
+ 0x00, 0x00, 0xda, 0x76, 0x00, 0x04, 0x04, 0x60, 0x81, 0xb8, 0x00, 0x00,
+ 0xe0, 0x32, 0x00, 0x04, 0x04, 0x60, 0x81, 0xc0, 0x00, 0x00, 0xdb, 0x92,
+ 0x00, 0x04, 0x04, 0x60, 0x80, 0xfa, 0x00, 0x00, 0xe3, 0x76, 0x00, 0x04,
+ 0x04, 0x60, 0x81, 0xa0, 0x00, 0x00, 0xdd, 0x48, 0x00, 0x04, 0x04, 0x60,
+ 0x81, 0xda, 0x00, 0x00, 0xcc, 0xa2, 0x00, 0x04, 0x04, 0x60, 0x80, 0xc8,
+ 0x00, 0x01, 0x00, 0x00, 0x00, 0x00
+};
diff --git a/sys/contrib/ia64/libuwx/src/Makefile b/sys/contrib/ia64/libuwx/src/Makefile
new file mode 100644
index 0000000..7cc0f2d
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/Makefile
@@ -0,0 +1,71 @@
+# Makefile for IPF unwind express library, libuwx.
+#
+# To build a cross-unwind library (i.e., one hosted on a
+# non-IPF, non-HP-UX system), omit the "self" callbacks
+# and the dependency on libuca by setting SELFOBJS and
+# SELFLIBS to empty strings.
+
+AR = ar
+RANLIB = :
+
+OTHERCFLAGS =
+# OTHERCFLAGS = -DUWX_TRACE_ENABLE # Enables trace output
+# OTHERCFLAGS = +DD64 # Builds 64-bit library
+
+CFLAGS = -O $(OTHERCFLAGS)
+
+OBJS = uwx_bstream.o uwx_context.o uwx_env.o uwx_scoreboard.o \
+ uwx_step.o uwx_str.o uwx_swap.o uwx_symbols.o \
+ uwx_trace.o uwx_uinfo.o uwx_utable.o
+
+# SELFOBJS = # For cross-unwind library
+# SELFOBJS = uwx_self.o uwx_self_context.o uwx_ttrace.o
+SELFOBJS = uwx_self.o uwx_self_context.o
+
+# SELFLIBS = # For cross-unwind library
+SELFLIBS = -luca
+
+libuwx.a: $(OBJS) $(SELFOBJS)
+ $(AR) rv libuwx.a $?
+ $(RANLIB) libuwx.a
+
+libuwx.so: $(OBJS) $(SELFOBJS)
+ ld -b -o libuwx.so $(OBJS) $(SELFOBJS) $(SELFLIBS)
+
+libuwx.sl: $(OBJS) $(SELFOBJS)
+ ld -b -o libuwx.sl $(OBJS) $(SELFOBJS) $(SELFLIBS)
+
+clean:
+ rm -f $(OBJS) $(SELFOBJS) libuwx.a libuwx.so libuwx.sl
+
+uwx_bstream.o: uwx.h uwx_env.h uwx_bstream.h
+
+uwx_context.o: uwx.h uwx_env.h uwx_scoreboard.h uwx_step.h uwx_trace.h
+
+uwx_env.o: uwx.h uwx_env.h uwx_scoreboard.h uwx_str.h uwx_trace.h
+
+uwx_scoreboard.o: uwx.h uwx_env.h uwx_scoreboard.h uwx_trace.h
+
+uwx_step.o: uwx.h uwx_env.h uwx_context.h uwx_utable.h \
+ uwx_uinfo.h uwx_scoreboard.h uwx_str.h uwx_trace.h
+
+uwx_str.o: uwx.h uwx_env.h uwx_str.h
+
+uwx_swap.o: uwx.h uwx_env.h uwx_swap.h
+
+uwx_symbols.o: uwx.h uwx_env.h uwx_symbols.h
+
+uwx_trace.o: uwx.h uwx_env.h uwx_uinfo.h uwx_scoreboard.h uwx_trace.h
+
+uwx_uinfo.o: uwx.h uwx_env.h uwx_uinfo.h uwx_utable.h \
+ uwx_scoreboard.h uwx_bstream.h uwx_trace.h
+
+uwx_utable.o: uwx.h uwx_env.h uwx_utable.h uwx_swap.h uwx_trace.h
+
+uwx_self.o: uwx.h uwx_env.h uwx_context.h uwx_trace.h uwx_self.h \
+ uwx_symbols.h
+
+uwx_self_context.o: uwx_self_context.s
+ $(CC) -c $(CFLAGS) -o uwx_self_context.o uwx_self_context.s
+
+uwx_ttrace.o: uwx.h uwx_env.h uwx_context.h uwx_trace.h uwx_ttrace.h
diff --git a/sys/contrib/ia64/libuwx/src/uwx.h b/sys/contrib/ia64/libuwx/src/uwx.h
new file mode 100644
index 0000000..8fdbb43
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx.h
@@ -0,0 +1,418 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef __UWX_INCLUDED
+#define __UWX_INCLUDED 1
+
+#ifndef _KERNEL
+#include <stdlib.h>
+#include <inttypes.h>
+#else
+#include <sys/param.h>
+#include <sys/systm.h>
+#endif
+
+#if defined(__cplusplus)
+#define __EXTERN_C extern "C"
+#else
+#define __EXTERN_C extern
+#endif
+
+#define UWX_VERSION 3 /* Version id for callback interfaces */
+
+/* Unwind environment structure (opaque) */
+struct uwx_env;
+
+/* Symbol Cache for uwx_find_symbol (opaque) */
+struct uwx_symbol_cache;
+
+/* Allocate and free callbacks */
+typedef void *(*alloc_cb)(size_t size);
+typedef void (*free_cb)(void *ptr);
+__EXTERN_C int uwx_register_alloc_cb(alloc_cb alloc, free_cb free);
+
+/* Allocate and initialize an unwind environment */
+__EXTERN_C struct uwx_env *uwx_init(void);
+
+/* Free an unwind environment */
+__EXTERN_C int uwx_free(struct uwx_env *env);
+
+/* Put unwind express into cross-process mode */
+__EXTERN_C int uwx_set_remote(struct uwx_env *env, int is_big_endian_target);
+
+/* Put unwind express into reduced-context mode (no floating-point regs) */
+__EXTERN_C int uwx_set_nofr(struct uwx_env *env);
+
+/* Copy-in callback */
+typedef int (*copyin_cb)(
+ int request, /* request code (see below) */
+ char *loc, /* local (destination) address */
+ uint64_t rem, /* remote (source) address */
+ int len, /* number of bytes to copy */
+ intptr_t tok); /* callback token */
+
+/* Lookup IP callback */
+typedef int (*lookupip_cb)(
+ int request, /* request code (see below) */
+ uint64_t ip, /* IP of current frame */
+ intptr_t tok, /* callback token */
+ uint64_t **vecp); /* parameter vector (in/out) */
+
+/* Register copy-in and lookup IP callbacks */
+__EXTERN_C int uwx_register_callbacks(
+ struct uwx_env *env, /* unwind environment */
+ intptr_t tok, /* callback token */
+ copyin_cb copyin, /* copy-in callback */
+ lookupip_cb lookupip); /* lookup IP callback */
+
+/* Initialize a context with the basic info needed to start an unwind */
+__EXTERN_C int uwx_init_context(
+ struct uwx_env *env, /* unwind environment */
+ uint64_t ip, /* IP (instruction pointer) */
+ uint64_t sp, /* SP (stack pointer) */
+ uint64_t bsp, /* BSP (backing store pointer) */
+ uint64_t cfm); /* CFM (current frame marker) */
+
+/* Set the value of a specific register in the current context (non fp) */
+__EXTERN_C int uwx_set_reg(
+ struct uwx_env *env, /* unwind environment */
+ int regid, /* register id (see below) */
+ uint64_t val); /* register value */
+
+/* Set the value of a floating-point register in the current context */
+__EXTERN_C int uwx_set_fr(
+ struct uwx_env *env, /* unwind environment */
+ int regid, /* register id (see below) */
+ uint64_t *val); /* register value (ptr to 16 bytes) */
+ /* (memory spill format) */
+
+/* Initialize the unwind history */
+__EXTERN_C int uwx_init_history(struct uwx_env *env);
+
+/* Step one frame */
+__EXTERN_C int uwx_step(struct uwx_env *env);
+
+/* Get module name and text base, if available, for current frame */
+__EXTERN_C int uwx_get_module_info(
+ struct uwx_env *env, /* unwind environment */
+ char **modp, /* load module name (out) */
+ uint64_t *text_base); /* base address of text segment (out) */
+
+/* Get function start address for current frame */
+__EXTERN_C int uwx_get_funcstart(
+ struct uwx_env *env, /* unwind environment */
+ uint64_t *funcstart); /* function start address (out) */
+
+/* Get symbol information, if available, for current frame */
+__EXTERN_C int uwx_get_sym_info(
+ struct uwx_env *env, /* unwind environment */
+ char **modp, /* load module name (out) */
+ char **symp, /* function name (out) */
+ uint64_t *offsetp); /* offset from start of function (out) */
+
+/* Get symbol information, given module name and IP */
+__EXTERN_C int uwx_find_symbol(
+ struct uwx_env *env, /* unwind environment */
+ struct uwx_symbol_cache **cachep,
+ /* ptr to symbol cache ptr (in/out) */
+ char *mod, /* load module name */
+ uint64_t relip, /* IP, relative to text segment */
+ char **symp, /* function name (out) */
+ uint64_t *offsetp); /* offset from start of function (out) */
+
+/* Release memory used by symbol cache */
+__EXTERN_C void uwx_release_symbol_cache(
+ struct uwx_env *env, /* unwind environment */
+ struct uwx_symbol_cache *symbol_cache);
+ /* symbol cache ptr */
+
+/* Get the value of a register from the current context */
+__EXTERN_C int uwx_get_reg(
+ struct uwx_env *env, /* unwind environment */
+ int regid, /* register id (see below) */
+ uint64_t *valp); /* register value (out) */
+
+/* Get the NaT bit of a GR from the current context */
+__EXTERN_C int uwx_get_nat(
+ struct uwx_env *env, /* unwind environment */
+ int regid, /* register id (see below) */
+ int *natp); /* NaT value (out: 0 or 1) */
+
+/* Get the spill location for a register in the current context */
+__EXTERN_C int uwx_get_spill_loc(
+ struct uwx_env *env, /* unwind environment */
+ int regid, /* register id (see below) */
+ uint64_t *dispp); /* disposition code (see below) (out) */
+
+/* Get the ABI context code (if uwx_step returned UWX_ABI_FRAME) */
+__EXTERN_C int uwx_get_abi_context_code(struct uwx_env *env);
+
+/* Increment/Decrement the bsp by a number of slots */
+/* (accounts for NaT collections) */
+__EXTERN_C uint64_t uwx_add_to_bsp(uint64_t bsp, int nslots);
+
+/* Return status codes for uwx_ APIs */
+#define UWX_OK 0
+#define UWX_BOTTOM 1 /* Hit bottom of stack */
+#define UWX_ABI_FRAME 2 /* Hit ABI-dependent frame */
+#define UWX_ERR_NOENV (-1) /* No uwx_env allocated */
+#define UWX_ERR_IPNOTFOUND (-2) /* Lookup IP c/b returned NOTFOUND */
+#define UWX_ERR_LOOKUPERR (-3) /* Lookup IP c/b returned ERR */
+#define UWX_ERR_BADKEY (-4) /* Bad result vector key */
+#define UWX_ERR_COPYIN_UTBL (-5) /* Error reading unwind table */
+#define UWX_ERR_COPYIN_UINFO (-6) /* Error reading unwind info */
+#define UWX_ERR_COPYIN_MSTK (-7) /* Error reading memory stack */
+#define UWX_ERR_COPYIN_RSTK (-8) /* Error reading register stack */
+#define UWX_ERR_COPYIN_REG (-9) /* Error reading context register */
+#define UWX_ERR_NOUENTRY (-10) /* No unwind table entry for ip */
+#define UWX_ERR_NOUDESC (-11) /* No unwind descriptor covers ip */
+#define UWX_ERR_BADUDESC (-12) /* Bad unwind descriptor */
+#define UWX_ERR_NOMEM (-13) /* Out of memory */
+#define UWX_ERR_PROLOG_UF (-14) /* Prologue underflow */
+#define UWX_ERR_UNDEFLABEL (-15) /* Undefined label in copy_state */
+#define UWX_ERR_BADREGID (-16) /* Bad register identifier */
+#define UWX_ERR_CANTUNWIND (-17) /* Can't unwind */
+#define UWX_ERR_NOCALLBACKS (-18) /* No callbacks registered */
+#define UWX_ERR_NOCONTEXT (-19) /* Context not initialized */
+#define UWX_ERR_UCACCESS (-20) /* Failure in libuca */
+#define UWX_ERR_NOSYM (-21) /* Symbol not found */
+
+/* Request codes for copyin callback */
+#define UWX_COPYIN_UINFO 1 /* Reading unwind info */
+#define UWX_COPYIN_MSTACK 2 /* Reading memory stack */
+#define UWX_COPYIN_RSTACK 3 /* Reading RSE backing store */
+#define UWX_COPYIN_REG 4 /* Reading initial register state */
+
+/* Request codes for lookup IP callback */
+#define UWX_LKUP_LOOKUP 1 /* Lookup IP */
+#define UWX_LKUP_FREE 2 /* Free result vector */
+#define UWX_LKUP_SYMBOLS 3 /* Lookup symbolic information */
+#define UWX_LKUP_MODULE 4 /* Get module name */
+
+/* Return status codes for lookup IP callback */
+#define UWX_LKUP_NOTFOUND 0 /* IP not found */
+#define UWX_LKUP_ERR 1 /* Other error */
+#define UWX_LKUP_UTABLE 2 /* Returned ref to unwind table */
+#define UWX_LKUP_FDESC 3 /* Returned frame description */
+#define UWX_LKUP_SYMINFO 4 /* Returned symbolic information */
+#define UWX_LKUP_REMAP 5 /* Returned remapped IP */
+#define UWX_LKUP_UINFO 6 /* Returned unw info block ptr */
+
+/* The lookup IP callback receives a parameter vector, and returns */
+/* one on success. This vector is a series of key/value pairs; each */
+/* even-numbered slot is a key, and each odd-numbered slot is a */
+/* corresponding value. The vector is terminated by a pair whose */
+/* key is 0. */
+#define UWX_KEY_END 0 /* End of vector */
+
+/* Keys passed to lookup IP callback */
+#define UWX_KEY_PREDS 1 /* Predicate registers */
+#define UWX_KEY_VERSION 2 /* Version id of unwind engine */
+/* UWX_KEY_FUNCSTART (below) may also be passed with the UWX_LKUP_SYMINFO */
+/* request. */
+
+/* Keys returned with UWX_LKUP_UTABLE */
+/* These key/value pairs describe the unwind table corresponding */
+/* to the load module in which the current IP resides. */
+#define UWX_KEY_TBASE 1 /* Base address of text seg */
+#define UWX_KEY_UFLAGS 2 /* Unwind flags (optional) */
+#define UWX_KEY_USTART 3 /* Base of unwind tbl */
+#define UWX_KEY_UEND 4 /* End of unwind tbl */
+#define UWX_KEY_GP 7 /* GP value for module */
+
+/* Keys returned with UWX_LKUP_FDESC */
+/* These key/value pairs describe the state of the frame at the */
+/* given IP. They are typically used for dynamically-generated code. */
+/* If UWX_KEY_CONTEXT is returned, it must be the only key returned. */
+/* Use UWX_KEY_GP for the module's gp value. */
+#define UWX_KEY_FSIZE 1 /* Frame size */
+#define UWX_KEY_SPILL(reg_id) (2 | ((reg_id) << 4)) /* Reg spilled */
+#define UWX_KEY_CONTEXT 3 /* ABI-dep. context */
+
+/* Keys returned with UWX_LKUP_REMAP */
+#define UWX_KEY_NEWIP 5 /* Remapped IP */
+
+/* Keys returned with UWX_LKUP_UINFO */
+/* Use UWX_KEY_GP for the module's gp value. */
+/* Use UWX_KEY_FUNCSTART for the start address of the function */
+/* Use UWX_KEY_UFLAGS for the unwind flags (optional) */
+#define UWX_KEY_UINFO 6 /* Address of unwind info block */
+
+/* Keys returned with UWX_LKUP_SYMINFO */
+/* These keys may be returned with UWX_LKUP_FDESC or UWX_LKUP_UINFO, */
+/* if the information is cheap to obtain. */
+/* Use UWX_KEY_TBASE for the base of the text segment */
+#define UWX_KEY_MODULE 17 /* Name of load module */
+#define UWX_KEY_FUNC 18 /* Name of function */
+#define UWX_KEY_FUNCSTART 19 /* Address of start of function */
+
+/* Register identifiers */
+/* For use in UWX_LKUP_FDESC result vectors and context access APIs. */
+/* "no spill info": These regs aren't spilled directly, so */
+/* result vectors must not describe these registers. */
+/* The result vector must describe the related register or */
+/* pseudo register instead (ip:rp, sp:psp, bsp/cfm:pfs). */
+/* "pseudo register": Not a machine register, but treated as */
+/* one for unwind purposes. */
+#define UWX_REG_IP 0 /* ip (no spill info) */
+#define UWX_REG_SP 1 /* sp (no spill info) */
+#define UWX_REG_BSP 2 /* ar.bsp (no spill info) */
+#define UWX_REG_CFM 3 /* cfm (no spill info) */
+#define UWX_REG_RP 4 /* rp (pseudo-register) */
+#define UWX_REG_PSP 5 /* psp (pseudo-register) */
+#define UWX_REG_PFS 6 /* pfs (pseudo-register) */
+#define UWX_REG_PREDS 7 /* p0 - p63 */
+#define UWX_REG_PRIUNAT 8 /* primary unat (pseudo-register) */
+#define UWX_REG_AR_BSPSTORE 9 /* ar.bspstore */
+#define UWX_REG_AR_RNAT 10 /* ar.rnat */
+#define UWX_REG_AR_UNAT 11 /* ar.unat */
+#define UWX_REG_AR_FPSR 12 /* ar.fpsr */
+#define UWX_REG_AR_LC 13 /* ar.lc */
+#define UWX_REG_AR_PFS 14 /* ar.pfs */
+#define UWX_REG_GP 15 /* gp (pseudo-register) */
+#define UWX_REG_GR(gr) (0x100 | (gr))
+#define UWX_REG_FR(fr) (0x200 | (fr))
+#define UWX_REG_BR(br) (0x300 | (br))
+
+/* for backwards compatibility with previous releases... */
+#define UWX_REG_BSPSTORE UWX_REG_AR_BSPSTORE
+#define UWX_REG_RNAT UWX_REG_AR_RNAT
+#define UWX_REG_UNAT UWX_REG_AR_UNAT
+#define UWX_REG_FPSR UWX_REG_AR_FPSR
+#define UWX_REG_LC UWX_REG_AR_LC
+
+/* Values corresponding to UWX_KEY_SPILL keys indicate the disposition */
+/* of the spilled register -- either in the memory stack or in another */
+/* register. The PSP register may also have a disposition of "SPPLUS", */
+/* indicating that its value is SP plus a fixed constant. */
+#define UWX_DISP_NONE 0 /* Not spilled */
+#define UWX_DISP_SPPLUS(k) (1 | (k)) /* PSP = SP+constant */
+#define UWX_DISP_SPREL(disp) (2 | (disp)) /* Spilled at [SP+disp] */
+#define UWX_DISP_PSPREL(disp) (3 | (disp)) /* Spilled at [PSP+16-disp] */
+#define UWX_DISP_REG(reg) (4 | ((reg) << 4)) /* Saved to another reg. */
+
+/* The uwx_get_spill_loc() routine returns a spill location for a */
+/* given register in the current context. It will return a disposition */
+/* code of UWX_DISP_NONE, UWX_DISP_REG(reg), or one of the following */
+/* to indicate that the spilled value can be found in the memory */
+/* stack or the register stack backing store. */
+#define UWX_DISP_MSTK(addr) (5 | (addr)) /* Spilled in mem. stack */
+#define UWX_DISP_RSTK(addr) (6 | (addr)) /* Spilled in reg. stack */
+
+/* Extract the disposition code, offset, address, or register id */
+/* from a disposition returned from uwx_get_spill_loc(). */
+/* Compare the extracted disp code against UWX_DISP_REG(0), etc. */
+#define UWX_GET_DISP_CODE(disp) ((int)(disp) & 0x07)
+#define UWX_GET_DISP_OFFSET(disp) ((disp) & ~(uint64_t)0x07)
+#define UWX_GET_DISP_ADDR(disp) ((disp) & ~(uint64_t)0x07)
+#define UWX_GET_DISP_REGID(disp) ((int)(disp) >> 4)
+
+#undef __EXTERN_C
+
+#if defined(__cplusplus)
+
+class UnwindExpress {
+
+public:
+
+ UnwindExpress() {
+ env = uwx_init();
+ }
+
+ ~UnwindExpress() {
+ if (env != 0)
+ uwx_free(env);
+ env = 0;
+ }
+
+ int init_context(uint64_t ip, uint64_t sp, uint64_t bsp, uint64_t cfm) {
+ return uwx_init_context(env, ip, sp, bsp, cfm);
+ }
+
+ int init_history() {
+ return uwx_init_history(env);
+ }
+
+ int set_reg(int regid, uint64_t val) {
+ return uwx_set_reg(env, regid, val);
+ }
+
+ int set_fr(int regid, uint64_t *valp) {
+ return uwx_set_fr(env, regid, valp);
+ }
+
+ int step() {
+ return uwx_step(env);
+ }
+
+ int get_module_info(char **modp, uint64_t *text_base_p) {
+ return uwx_get_module_info(env, modp, text_base_p);
+ }
+
+ int get_funcstart(uint64_t *funcstart) {
+ return uwx_get_funcstart(env, funcstart);
+ }
+
+ int get_sym_info(char **modp, char **symp, uint64_t *offsetp) {
+ return uwx_get_sym_info(env, modp, symp, offsetp);
+ }
+
+ int find_symbol(struct uwx_symbol_cache **cachep,
+ char *mod, uint64_t relip, char **symp, uint64_t *offsetp) {
+ return uwx_find_symbol(env, cachep, mod, relip, symp, offsetp);
+ }
+
+ void release_symbol_cache(struct uwx_symbol_cache *symbol_cache) {
+ uwx_release_symbol_cache(env, symbol_cache);
+ }
+
+ int get_reg(int regid, uint64_t *valp) {
+ return uwx_get_reg(env, regid, valp);
+ }
+
+ int get_nat(int regid, int *natp) {
+ return uwx_get_nat(env, regid, natp);
+ }
+
+ int get_spill_loc(int regid, uint64_t *dispp) {
+ return uwx_get_spill_loc(env, regid, dispp);
+ }
+
+ int get_abi_context_code() {
+ return uwx_get_abi_context_code(env);
+ }
+
+ struct uwx_env *get_env() {
+ return env;
+ }
+
+protected:
+
+ struct uwx_env *env;
+
+};
+
+#endif /* __cplusplus */
+
+#endif /* __UWX_INCLUDED */
diff --git a/sys/contrib/ia64/libuwx/src/uwx_bstream.c b/sys/contrib/ia64/libuwx/src/uwx_bstream.c
new file mode 100644
index 0000000..1495ed3
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_bstream.c
@@ -0,0 +1,181 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "uwx_env.h"
+#include "uwx_bstream.h"
+
+
+/* uwx_init_bstream: initialize a byte stream for reading */
+
+void uwx_init_bstream(
+ struct uwx_bstream *bstream,
+ struct uwx_env *env,
+ uint64_t source,
+ unsigned int len,
+ int request)
+{
+ bstream->buf = 0;
+ if (env->remote) {
+ bstream->source = source;
+ bstream->bufp = (unsigned char *) &bstream->buf;
+ bstream->nbuf = 0;
+ bstream->copyin = env->copyin;
+ bstream->cb_token = env->cb_token;
+ bstream->request = request;
+ }
+ else {
+ bstream->source = 0;
+ bstream->bufp = (unsigned char *) (intptr_t) source;
+ bstream->nbuf = len;
+ bstream->copyin = 0;
+ bstream->cb_token = 0;
+ bstream->request = 0;
+ }
+ bstream->ntotal = len;
+ bstream->peekc = -1;
+}
+
+
+/* uwx_get_byte: read the next byte from the byte stream */
+
+int uwx_get_byte(struct uwx_bstream *bstream)
+{
+ int len;
+ int n;
+ int b;
+
+ if (bstream->peekc >= 0) {
+ b = bstream->peekc;
+ bstream->peekc = -1;
+ return b;
+ }
+ if (bstream->ntotal <= 0)
+ return -1;
+ if (bstream->nbuf <= 0) {
+ if (bstream->source & 0x7 || bstream->ntotal < sizeof(uint64_t))
+ len = sizeof(uint32_t);
+ else
+ len = sizeof(uint64_t);
+ n = (*bstream->copyin)(bstream->request, (char *)&bstream->buf,
+ bstream->source, len, bstream->cb_token);
+ if (n != len)
+ return -1;
+ bstream->bufp = (unsigned char *) &bstream->buf;
+ bstream->nbuf = n;
+ bstream->source += n;
+ }
+
+ b = *bstream->bufp++;
+ bstream->nbuf--;
+ bstream->ntotal--;
+ return b;
+}
+
+
+/* uwx_unget_byte: push a byte back onto the byte stream */
+
+int uwx_unget_byte(struct uwx_bstream *bstream, int b)
+{
+ bstream->peekc = b;
+ return 0;
+}
+
+
+/* uwx_get_uleb128: read a ULEB128 value from the byte stream */
+
+int uwx_get_uleb128(struct uwx_bstream *bstream, uint64_t *valp)
+{
+ uint64_t val;
+ int i;
+ int b;
+
+ b = uwx_get_byte(bstream);
+ val = (uint64_t)(b & 0x7f) << 56;
+ for (i = 0; i < 8; i++) {
+ val = val >> 7;
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 56;
+ }
+ }
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 63;
+ }
+ if (b & 0x80)
+ return -1;
+ *valp = val;
+ return 0;
+}
+
+#if 0
+int uwx_get_uleb128_alt(struct uwx_bstream *bstream, uint64_t *valp)
+{
+ uint64_t val;
+ int b;
+
+ b = uwx_get_byte(bstream);
+ val = b & 0x7f;
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 7;
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 14;
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 21;
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 28;
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 35;
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 42;
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 49;
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 56;
+ if (b & 0x80) {
+ b = uwx_get_byte(bstream);
+ val |= (uint64_t)(b & 0x7f) << 63;
+ if (b & 0x80)
+ return -1;
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ }
+ *valp = val;
+ return 0;
+}
+#endif
diff --git a/sys/contrib/ia64/libuwx/src/uwx_bstream.h b/sys/contrib/ia64/libuwx/src/uwx_bstream.h
new file mode 100644
index 0000000..c2fe5da
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_bstream.h
@@ -0,0 +1,59 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+struct uwx_bstream {
+ copyin_cb copyin;
+ intptr_t cb_token;
+ uint64_t source;
+ uint64_t buf;
+ unsigned char *bufp;
+ int nbuf;
+ unsigned int ntotal;
+ int request;
+ int peekc;
+};
+
+/* uwx_init_bstream: initialize a byte stream for reading */
+
+extern void uwx_init_bstream(
+ struct uwx_bstream *bstream,
+ struct uwx_env *env,
+ uint64_t source,
+ unsigned int len,
+ int request);
+
+
+/* uwx_get_byte: read the next byte from the byte stream */
+
+extern int uwx_get_byte(struct uwx_bstream *bstream);
+
+
+/* uwx_unget_byte: push a byte back onto the byte stream */
+
+extern int uwx_unget_byte(struct uwx_bstream *bstream, int b);
+
+
+/* uwx_get_uleb128: read a ULEB128 value from the byte stream */
+
+extern int uwx_get_uleb128(struct uwx_bstream *bstream, uint64_t *val);
diff --git a/sys/contrib/ia64/libuwx/src/uwx_context.c b/sys/contrib/ia64/libuwx/src/uwx_context.c
new file mode 100644
index 0000000..9b1054a
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_context.c
@@ -0,0 +1,408 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "uwx_env.h"
+#include "uwx_scoreboard.h"
+#include "uwx_step.h"
+#include "uwx_trace.h"
+
+int uwx_init_context(
+ struct uwx_env *env,
+ uint64_t ip,
+ uint64_t sp,
+ uint64_t bsp,
+ uint64_t cfm)
+{
+ int i;
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ env->context.special[UWX_REG_IP] = ip;
+ env->context.special[UWX_REG_SP] = sp;
+ env->context.special[UWX_REG_BSP] = bsp;
+ env->context.special[UWX_REG_CFM] = cfm;
+ for (i = UWX_REG_RP; i < NSPECIALREG; i++)
+ env->context.special[i] = 0;
+ for (i = 0; i < NPRESERVEDGR; i++)
+ env->context.gr[i] = 0;
+ env->context.valid_regs = VALID_BASIC4;
+ env->context.valid_frs = 0;
+ env->rstate = 0;
+ (void)uwx_init_history(env);
+ return UWX_OK;
+}
+
+int uwx_get_reg(struct uwx_env *env, int regid, uint64_t *valp)
+{
+ int status;
+ int sor;
+ int rrb_gr;
+ uint64_t bsp;
+ int n;
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ status = UWX_OK;
+
+ if (regid == UWX_REG_GR(12))
+ regid = UWX_REG_SP;
+ if (regid < NSPECIALREG && (env->context.valid_regs & (1 << regid)))
+ *valp = env->context.special[regid];
+ else if (regid == UWX_REG_PSP || regid == UWX_REG_RP ||
+ regid == UWX_REG_PFS) {
+ status = uwx_restore_markers(env);
+ if (status != UWX_OK)
+ return status;
+ *valp = env->context.special[regid];
+ }
+ else if (regid >= UWX_REG_GR(4) && regid <= UWX_REG_GR(7) &&
+ (env->context.valid_regs &
+ (1 << (regid - UWX_REG_GR(4) + VALID_GR_SHIFT))) )
+ *valp = env->context.gr[regid - UWX_REG_GR(4)];
+ else if (regid >= UWX_REG_GR(32) && regid <= UWX_REG_GR(127)) {
+ if (env->copyin == 0)
+ return UWX_ERR_NOCALLBACKS;
+ bsp = env->context.special[UWX_REG_BSP];
+ TRACE_C_GET_REG(regid, bsp)
+ regid -= UWX_REG_GR(32);
+ sor = (((int) env->context.special[UWX_REG_CFM] >> 14) & 0x0f) * 8;
+ rrb_gr = ((int) env->context.special[UWX_REG_CFM] >> 18) & 0x7f;
+ if (sor != 0 && rrb_gr != 0 && regid < sor) {
+ TRACE_C_ROTATE_GR(regid, sor, rrb_gr, (regid+rrb_gr)%sor)
+ regid = (regid + rrb_gr) % sor;
+ }
+ bsp = uwx_add_to_bsp(bsp, regid);
+ n = (*env->copyin)(UWX_COPYIN_RSTACK, (char *)valp,
+ bsp, DWORDSZ, env->cb_token);
+ if (n != DWORDSZ)
+ status = UWX_ERR_COPYIN_RSTK;
+ }
+ else if (regid == UWX_REG_GR(0))
+ *valp = 0;
+ else if (regid >= UWX_REG_BR(1) && regid <= UWX_REG_BR(5) &&
+ (env->context.valid_regs &
+ (1 << (regid - UWX_REG_BR(1) + VALID_BR_SHIFT))) )
+ *valp = env->context.br[regid - UWX_REG_BR(1)];
+ else if (regid >= UWX_REG_FR(2) && regid <= UWX_REG_FR(5) &&
+ (env->context.valid_frs & (1 << (regid - UWX_REG_FR(2)))) ) {
+ valp[0] = env->context.fr[regid - UWX_REG_FR(2)].part0;
+ valp[1] = env->context.fr[regid - UWX_REG_FR(2)].part1;
+ }
+ else if (regid >= UWX_REG_FR(16) && regid <= UWX_REG_FR(31) &&
+ (env->context.valid_frs & (1 << (regid - UWX_REG_FR(16) + 4))) ) {
+ valp[0] = env->context.fr[regid - UWX_REG_FR(16) + 4].part0;
+ valp[1] = env->context.fr[regid - UWX_REG_FR(16) + 4].part1;
+ }
+ else if ( (regid < NSPECIALREG) ||
+ (regid >= UWX_REG_GR(1) && regid <= UWX_REG_GR(31)) ||
+ (regid >= UWX_REG_BR(0) && regid <= UWX_REG_BR(7)) ) {
+ if (env->copyin == 0)
+ return UWX_ERR_NOCALLBACKS;
+ n = (*env->copyin)(UWX_COPYIN_REG, (char *)valp,
+ regid, DWORDSZ, env->cb_token);
+ if (n != DWORDSZ)
+ status = UWX_ERR_COPYIN_REG;
+ }
+ else if (regid >= UWX_REG_FR(2) && regid <= UWX_REG_FR(127)) {
+ if (env->copyin == 0)
+ return UWX_ERR_NOCALLBACKS;
+ n = (*env->copyin)(UWX_COPYIN_REG, (char *)valp,
+ regid, 2*DWORDSZ, env->cb_token);
+ if (n != 2*DWORDSZ)
+ status = UWX_ERR_COPYIN_REG;
+ }
+ else if (regid == UWX_REG_FR(0)) {
+ valp[0] = 0;
+ valp[1] = 0;
+ }
+ else if (regid == UWX_REG_FR(1)) {
+ valp[0] = 0x000000000000ffffULL;
+ valp[1] = 0x8000000000000000ULL;
+ }
+ else
+ status = UWX_ERR_BADREGID;
+ return status;
+}
+
+int uwx_get_nat(struct uwx_env *env, int regid, int *natp)
+{
+ int status;
+ int sor;
+ int rrb_gr;
+ uint64_t bsp;
+ uint64_t natcollp;
+ uint64_t natcoll;
+ int n;
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ status = UWX_OK;
+
+ if (regid >= UWX_REG_GR(4) && regid <= UWX_REG_GR(7) &&
+ (env->context.valid_regs &
+ (1 << (regid - UWX_REG_GR(4) + VALID_GR_SHIFT))) ) {
+ *natp = (env->context.special[UWX_REG_PRIUNAT] >>
+ (regid - UWX_REG_GR(4)) ) & 0x01;
+ }
+ else if (regid >= UWX_REG_GR(32) && regid <= UWX_REG_GR(127)) {
+ if (env->copyin == 0)
+ return UWX_ERR_NOCALLBACKS;
+ bsp = env->context.special[UWX_REG_BSP];
+ regid -= UWX_REG_GR(32);
+ sor = (((int) env->context.special[UWX_REG_CFM] >> 14) & 0x0f) * 8;
+ rrb_gr = ((int) env->context.special[UWX_REG_CFM] >> 18) & 0x7f;
+ if (sor != 0 && rrb_gr != 0 && regid < sor) {
+ regid = (regid + rrb_gr) % sor;
+ }
+ bsp = uwx_add_to_bsp(bsp, regid);
+ natcollp = bsp | 0x01f8;
+ n = (*env->copyin)(UWX_COPYIN_RSTACK, (char *)&natcoll,
+ natcollp, DWORDSZ, env->cb_token);
+ if (n != DWORDSZ)
+ return UWX_ERR_COPYIN_RSTK;
+ *natp = (int)(natcoll >> (((int)bsp >> 3) & 0x3f)) & 0x01;
+ }
+ else if (regid == UWX_REG_GR(0))
+ *natp = 0;
+ else
+ status = UWX_ERR_BADREGID;
+ return status;
+}
+
+int uwx_get_spill_loc(struct uwx_env *env, int regid, uint64_t *dispp)
+{
+ int status;
+ int sor;
+ int rrb_gr;
+ uint64_t bsp;
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ status = UWX_OK;
+
+ if (regid == UWX_REG_GR(12))
+ regid = UWX_REG_SP;
+ if (regid < NSPECIALREG) {
+ if (regid == UWX_REG_PSP || regid == UWX_REG_RP ||
+ regid == UWX_REG_PFS) {
+ if (!(env->context.valid_regs & (1 << regid))) {
+ status = uwx_restore_markers(env);
+ if (status != UWX_OK)
+ return status;
+ }
+ }
+ *dispp = env->history.special[regid];
+ }
+ else if (regid >= UWX_REG_GR(4) && regid <= UWX_REG_GR(7))
+ *dispp = env->history.gr[regid - UWX_REG_GR(4)];
+ else if (regid >= UWX_REG_GR(32) && regid <= UWX_REG_GR(127)) {
+ bsp = env->context.special[UWX_REG_BSP];
+ regid -= UWX_REG_GR(32);
+ sor = (((int) env->context.special[UWX_REG_CFM] >> 14) & 0x0f) * 8;
+ rrb_gr = ((int) env->context.special[UWX_REG_CFM] >> 18) & 0x7f;
+ if (sor != 0 && rrb_gr != 0 && regid < sor)
+ regid = (regid + rrb_gr) % sor;
+ bsp = uwx_add_to_bsp(bsp, regid);
+ *dispp = UWX_DISP_RSTK(bsp);
+ }
+ else if (regid >= UWX_REG_BR(1) && regid <= UWX_REG_GR(5))
+ *dispp = env->history.br[regid - UWX_REG_BR(1)];
+ else if (regid >= UWX_REG_FR(2) && regid <= UWX_REG_FR(5))
+ *dispp = env->history.fr[regid - UWX_REG_FR(2)];
+ else if (regid >= UWX_REG_FR(16) && regid <= UWX_REG_FR(31))
+ *dispp = env->history.fr[regid - UWX_REG_FR(16) + 4];
+ else if ( (regid >= UWX_REG_GR(1) && regid <= UWX_REG_GR(31)) ||
+ (regid >= UWX_REG_BR(0) && regid <= UWX_REG_BR(7)) ||
+ (regid >= UWX_REG_FR(2) && regid <= UWX_REG_FR(127)) )
+ *dispp = UWX_DISP_REG(regid);
+ else
+ status = UWX_ERR_BADREGID;
+ return status;
+}
+
+int uwx_set_reg(struct uwx_env *env, int regid, uint64_t val)
+{
+ int status;
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ if (regid == UWX_REG_GR(12))
+ regid = UWX_REG_SP;
+ if (regid < NSPECIALREG) {
+ env->context.special[regid] = val;
+ env->context.valid_regs |= 1 << regid;
+ status = UWX_OK;
+ }
+ else if (regid >= UWX_REG_GR(4) && regid <= UWX_REG_GR(7)) {
+ env->context.gr[regid - UWX_REG_GR(4)] = val;
+ env->context.valid_regs |=
+ 1 << (regid - UWX_REG_GR(4) + VALID_GR_SHIFT);
+ status = UWX_OK;
+ }
+ else if (regid >= UWX_REG_GR(32) && regid <= UWX_REG_GR(127)) {
+ status = UWX_ERR_BADREGID;
+ }
+ else if (regid >= UWX_REG_BR(1) && regid <= UWX_REG_BR(5)) {
+ env->context.br[regid - UWX_REG_BR(1)] = val;
+ env->context.valid_regs |=
+ 1 << (regid - UWX_REG_BR(1) + VALID_BR_SHIFT);
+ status = UWX_OK;
+ }
+ else
+ status = UWX_ERR_BADREGID;
+ return status;
+}
+
+int uwx_set_fr(struct uwx_env *env, int regid, uint64_t *val)
+{
+
+ if (regid >= UWX_REG_FR(2) && regid <= UWX_REG_FR(5))
+ regid -= UWX_REG_FR(2);
+ else if (regid >= UWX_REG_FR(16) && regid <= UWX_REG_FR(31))
+ regid -= UWX_REG_FR(16) - 4;
+ else
+ return UWX_ERR_BADREGID;
+
+ env->context.fr[regid].part0 = val[0];
+ env->context.fr[regid].part1 = val[1];
+ env->context.valid_frs |= 1 << regid;
+ env->nsbreg = NSBREG;
+ return UWX_OK;
+}
+
+uint64_t uwx_add_to_bsp(uint64_t bsp, int nslots)
+{
+ int bias;
+
+ /*
+ * Here's a picture of the backing store as modeled in
+ * the computations below. "X" marks NaT collections at
+ * every 0x1f8 mod 0x200 address.
+ *
+ * To make the NaT adjustments easier, we bias the current bsp
+ * by enough slots to place it at the previous NaT collection.
+ * Then we need to add the bias to the number of slots,
+ * then add 1 for every 63 slots to account for NaT collections.
+ * Then we can remove the bias again and add the adjusted
+ * number of slots to the bsp.
+ *
+ * 0 1f8 3f8
+ * +---------------------------------------------------------------+
+ * | X X|
+ * +---------------------------------------------------------------+
+ * <-------- bias -------->
+ * <--- nslots --->
+ * ^
+ * |
+ * bsp
+ * <------------ nslots + bias ----------->
+
+ * When subtracting from bsp, we avoid depending on the sign of
+ * the quotient by adding 63*8 before division and subtracting 8
+ * after division. (Assumes that we will never be called upon
+ * to subtract more than 504 slots from bsp.)
+ *
+ * 0 1f8 3f8
+ * +---------------------------------------------------------------+
+ * | X X|
+ * +---------------------------------------------------------------+
+ * <-- bias -->
+ * <--- (-nslots) --->
+ * ^
+ * |
+ * bsp
+ * <----------------->
+ * -(nslots + bias)
+ */
+
+ bias = ((unsigned int)bsp & 0x1f8) / DWORDSZ;
+ nslots += (nslots + bias + 63*8) / 63 - 8;
+ return bsp + nslots * DWORDSZ;
+}
+
+#if 0
+int uwx_selftest_bsp_arithmetic()
+{
+ int i;
+ int j;
+ int r;
+ uint64_t bstore[161];
+ uint64_t *bsp;
+ uint64_t *p;
+ int failed = 0;
+
+ printf("uwx_selftest_bsp_arithmetic: bsp at %08lx\n", (unsigned int)bstore);
+ r = 0;
+ bsp = bstore;
+ for (i = 0; i < 161; i++) {
+ if (((unsigned int)bsp & 0x1f8) == 0x1f8)
+ *bsp++ = 1000 + r;
+ else
+ *bsp++ = r++;
+ }
+
+ printf("uwx_selftest_bsp_arithmetic: plus tests...\n");
+ bsp = bstore;
+ for (i = 0; i < 64; i++) {
+ r = (int)*bsp;
+ if (r >= 1000)
+ r -= 1000;
+ for (j = 0; j < 96; j++) {
+ p = (uint64_t *)(intptr_t)uwx_add_to_bsp((uint64_t)bsp, j);
+ if (*p != (r + j)) {
+ failed++;
+ printf("%d [%08lx] + %d -> %08lx ",
+ i, (unsigned int)bsp, j, (unsigned int)p);
+ printf("(read %d instead of %d)\n", (int)*p, r + j);
+ }
+ }
+ bsp++;
+ }
+
+ printf("uwx_selftest_bsp_arithmetic: minus tests...\n");
+ bsp = &bstore[161];
+ for (i = 63; i >= 0; i--) {
+ bsp--;
+ r = (int)*bsp;
+ if (r >= 1000)
+ r -= 1000;
+ for (j = 0; j < 96; j++) {
+ p = (uint64_t *)(intptr_t)uwx_add_to_bsp((uint64_t)bsp, -j);
+ if (*p != (r - j)) {
+ failed++;
+ printf("%d [%08lx] - %d -> %08lx ",
+ i, (unsigned int)bsp, j, (unsigned int)p);
+ printf("(read %d instead of %d)\n", (int)*p, r - j);
+ }
+ }
+ }
+
+ return failed;
+}
+#endif
diff --git a/sys/contrib/ia64/libuwx/src/uwx_context.h b/sys/contrib/ia64/libuwx/src/uwx_context.h
new file mode 100644
index 0000000..1f172db
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_context.h
@@ -0,0 +1,25 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+extern uint64_t uwx_add_to_bsp(uint64_t bsp, int nslots);
diff --git a/sys/contrib/ia64/libuwx/src/uwx_env.c b/sys/contrib/ia64/libuwx/src/uwx_env.c
new file mode 100644
index 0000000..252e397
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_env.c
@@ -0,0 +1,221 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef _KERNEL
+#include <stdlib.h>
+#endif
+
+#include "uwx_env.h"
+#include "uwx_scoreboard.h"
+#include "uwx_str.h"
+#include "uwx_trace.h"
+
+#ifdef _KERNEL
+static struct uwx_env uwx_env;
+#define free(p) /* nullified */
+#define malloc(sz) ((sz == sizeof(uwx_env)) ? &uwx_env : NULL)
+#endif
+
+alloc_cb uwx_allocate_cb = 0;
+free_cb uwx_free_cb = 0;
+
+int uwx_register_alloc_cb(alloc_cb alloc, free_cb free)
+{
+ uwx_allocate_cb = alloc;
+ uwx_free_cb = free;
+ return UWX_OK;
+}
+
+int uwx_init_history(struct uwx_env *env)
+{
+ int i;
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ for (i = 0; i < NSPECIALREG; i++)
+ env->history.special[i] = UWX_DISP_REG(i);;
+ for (i = 0; i < NPRESERVEDGR; i++)
+ env->history.gr[i] = UWX_DISP_REG(UWX_REG_GR(4+i));
+ for (i = 0; i < NPRESERVEDBR; i++)
+ env->history.br[i] = UWX_DISP_REG(UWX_REG_BR(1+i));
+ for (i = 0; i < 4; i++)
+ env->history.fr[i] = UWX_DISP_REG(UWX_REG_FR(2+i));
+ for ( ; i < NPRESERVEDFR; i++)
+ env->history.fr[i] = UWX_DISP_REG(UWX_REG_FR(12+i));
+
+ return UWX_OK;
+}
+
+int uwx_init_env(struct uwx_env *env, size_t total_size)
+{
+ int i;
+ struct uwx_str_pool *str_pool;
+ struct uwx_scoreboard *scoreboards;
+
+ str_pool = (struct uwx_str_pool *)(env + 1);
+ scoreboards = (struct uwx_scoreboard *)(str_pool + 1);
+
+ if (sizeof(struct uwx_env) + sizeof(struct uwx_str_pool) > total_size)
+ return UWX_ERR_NOMEM;
+ total_size -= sizeof(struct uwx_env) + sizeof(struct uwx_str_pool);
+
+ env->context.valid_regs = 0;
+ env->context.valid_frs = 0;
+ for (i = 0; i < NSPECIALREG; i++)
+ env->context.special[i] = 0;
+ for (i = 0; i < NPRESERVEDGR; i++)
+ env->context.gr[i] = 0;
+ for (i = 0; i < NPRESERVEDBR; i++)
+ env->context.br[i] = 0;
+ for (i = 0; i < NPRESERVEDFR; i++) {
+ env->context.fr[i].part0 = 0;
+ env->context.fr[i].part1 = 0;
+ }
+ env->rstate = 0;
+ env->remapped_ip = 0;
+ env->function_offset = 0;
+ env->ptr_size = DWORDSZ;
+ env->uinfo_hdr = 0;
+ env->uinfo_end = 0;
+ env->code_start = 0;
+ env->text_base = 0;
+ (void)uwx_init_history(env);
+ if (uwx_allocate_cb != NULL)
+ env->allocate_cb = uwx_allocate_cb;
+ else
+ env->allocate_cb = NULL;
+ if (uwx_free_cb != NULL)
+ env->free_cb = uwx_free_cb;
+ else
+ env->free_cb = NULL;
+ env->free_scoreboards = 0;
+ env->used_scoreboards = 0;
+ env->labeled_scoreboards = 0;
+ (void)uwx_init_str_pool(env, str_pool);
+ env->module_name = 0;
+ env->function_name = 0;
+ env->cb_token = 0;
+ env->copyin = 0;
+ env->lookupip = 0;
+ env->remote = 0;
+ env->byte_swap = 0;
+ env->abi_context = 0;
+ env->nsbreg = NSBREG;
+ env->nscoreboards = 0;
+ env->on_heap = 0;
+ env->trace = 0;
+ TRACE_INIT
+ for (i = 0; total_size >= sizeof(struct uwx_scoreboard); i++) {
+ (void) uwx_prealloc_scoreboard(env, &scoreboards[i]);
+ total_size -= sizeof(struct uwx_scoreboard);
+ }
+ return UWX_OK;
+}
+
+int uwx_set_nofr(struct uwx_env *env)
+{
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ env->nsbreg = NSBREG_NOFR;
+ return UWX_OK;
+}
+
+struct uwx_env *uwx_init()
+{
+ struct uwx_env *env;
+ size_t total_size;
+
+ total_size = sizeof(struct uwx_env) +
+ sizeof(struct uwx_str_pool) +
+ NSCOREBOARDS * sizeof(struct uwx_scoreboard);
+
+ if (uwx_allocate_cb == 0)
+ env = (struct uwx_env *) malloc(total_size);
+ else
+ env = (struct uwx_env *) (*uwx_allocate_cb)(total_size);
+ if (env != 0) {
+ uwx_init_env(env, total_size);
+ env->on_heap = 1;
+ }
+ return env;
+}
+
+int uwx_set_remote(struct uwx_env *env, int is_big_endian_target)
+{
+ int is_big_endian_host;
+ char *p;
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ env->remote = 1;
+
+ is_big_endian_host = 1;
+ p = (char *)&is_big_endian_host;
+ *p = 0;
+ if (is_big_endian_target == is_big_endian_host)
+ env->byte_swap = 0;
+ else
+ env->byte_swap = 1;
+
+ return UWX_OK;
+}
+
+int uwx_register_callbacks(
+ struct uwx_env *env,
+ intptr_t tok,
+ copyin_cb copyin,
+ lookupip_cb lookupip)
+{
+ if (env == 0)
+ return UWX_ERR_NOENV;
+ env->cb_token = tok;
+ env->copyin = copyin;
+ env->lookupip = lookupip;
+ return UWX_OK;
+}
+
+int uwx_get_abi_context_code(struct uwx_env *env)
+{
+ if (env == 0)
+ return UWX_ERR_NOENV;
+ return env->abi_context;
+}
+
+int uwx_free(struct uwx_env *env)
+{
+ if (env != 0) {
+ uwx_free_scoreboards(env);
+ uwx_free_str_pool(env);
+ if (env->on_heap) {
+ if (env->free_cb == 0)
+ free((void *)env);
+ else
+ (*env->free_cb)((void *)env);
+ }
+ }
+ return UWX_OK;
+}
diff --git a/sys/contrib/ia64/libuwx/src/uwx_env.h b/sys/contrib/ia64/libuwx/src/uwx_env.h
new file mode 100644
index 0000000..71b9d66
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_env.h
@@ -0,0 +1,111 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "uwx.h"
+
+#define WORDSZ 4
+#define DWORDSZ 8
+#define BUNDLESZ 16
+#define SLOTSPERBUNDLE 3
+
+#define UNWIND_TBL_32BIT 0x8000000000000000LL
+
+#define UNW_VER(x) ((x) >> 48)
+#define UNW_FLAG_MASK 0x0000ffff00000000LL
+#define UNW_FLAG_EHANDLER 0x0000000100000000LL
+#define UNW_FLAG_UHANDLER 0x0000000200000000LL
+#define UNW_LENGTH(x) ((x) & 0x00000000ffffffffLL)
+
+struct uwx_scoreboard;
+
+#define NSCOREBOARDS 8 /* Initial allocation of scoreboards */
+
+#define NSPECIALREG 16 /* Must be even, so FRs are aligned */
+#define NPRESERVEDGR 4
+#define NPRESERVEDBR 5
+#define NPRESERVEDFR 20
+
+struct uwx_fpreg {
+ uint64_t part0;
+ uint64_t part1;
+};
+
+struct uwx_context {
+ unsigned int valid_regs;
+ unsigned int valid_frs;
+ uint64_t special[NSPECIALREG];
+ uint64_t gr[NPRESERVEDGR];
+ uint64_t br[NPRESERVEDBR];
+ struct uwx_fpreg fr[NPRESERVEDFR];
+};
+
+#define VALID_GR_SHIFT NSPECIALREG
+#define VALID_BR_SHIFT (NSPECIALREG + NPRESERVEDGR)
+
+#define VALID_BASIC4 0x0f /* IP, SP, BSP, CFM */
+#define VALID_MARKERS 0x70 /* RP, PSP, PFS */
+
+struct uwx_history {
+ uint64_t special[NSPECIALREG];
+ uint64_t gr[NPRESERVEDGR];
+ uint64_t br[NPRESERVEDBR];
+ uint64_t fr[NPRESERVEDFR];
+};
+
+struct uwx_str_pool;
+
+struct uwx_env {
+ struct uwx_context context;
+ uint64_t *rstate;
+ uint64_t remapped_ip;
+ int64_t function_offset;
+ uint64_t ptr_size;
+ uint64_t uinfo_hdr;
+ uint64_t uinfo_end;
+ uint64_t code_start;
+ uint64_t text_base;
+ struct uwx_history history;
+ alloc_cb allocate_cb;
+ free_cb free_cb;
+ struct uwx_scoreboard *free_scoreboards;
+ struct uwx_scoreboard *used_scoreboards;
+ struct uwx_scoreboard *labeled_scoreboards;
+ struct uwx_str_pool *string_pool;
+ char *module_name;
+ char *function_name;
+ intptr_t cb_token;
+ copyin_cb copyin;
+ lookupip_cb lookupip;
+ int remote;
+ int byte_swap;
+ int abi_context;
+ int nsbreg;
+ int nscoreboards;
+ int on_heap;
+ int trace;
+};
+
+extern alloc_cb uwx_allocate_cb;
+extern free_cb uwx_free_cb;
+extern int uwx_init_env(struct uwx_env *env, size_t total_size);
diff --git a/sys/contrib/ia64/libuwx/src/uwx_scoreboard.c b/sys/contrib/ia64/libuwx/src/uwx_scoreboard.c
new file mode 100644
index 0000000..d68a6e1
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_scoreboard.c
@@ -0,0 +1,315 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef _KERNEL
+#include <stdlib.h>
+#endif
+
+#include "uwx_env.h"
+#include "uwx_scoreboard.h"
+#include "uwx_trace.h"
+
+#ifdef _KERNEL
+static unsigned short uwx_allocated;
+static struct uwx_scoreboard uwx_scoreboard[sizeof(uwx_allocated) << 3];
+
+static void
+free(struct uwx_scoreboard *p)
+{
+ int idx = p - uwx_scoreboard;
+ uwx_allocated &= ~(1 << idx);
+}
+
+static struct uwx_scoreboard *
+malloc(size_t sz)
+{
+ int idx;
+ if (sz != sizeof(struct uwx_scoreboard))
+ return (NULL);
+ for (idx = 0; idx < (sizeof(uwx_allocated) << 3); idx++) {
+ if ((uwx_allocated & (1 << idx)) == 0) {
+ uwx_allocated |= 1 << idx;
+ return (uwx_scoreboard + idx);
+ }
+ }
+ return (NULL);
+}
+#endif
+
+
+void uwx_prealloc_scoreboard(struct uwx_env *env, struct uwx_scoreboard *sb)
+{
+ sb->id = env->nscoreboards++;
+ sb->nextused = env->used_scoreboards;
+ sb->prealloc = 1;
+ env->used_scoreboards = sb;
+ TRACE_B_PREALLOC(sb->id)
+}
+
+struct uwx_scoreboard *uwx_alloc_scoreboard(struct uwx_env *env)
+{
+ struct uwx_scoreboard *sb;
+ int i;
+
+ if (env->free_scoreboards != 0) {
+ sb = env->free_scoreboards;
+ env->free_scoreboards = sb->nextfree;
+ TRACE_B_REUSE(sb->id)
+ }
+ else {
+ if (env->allocate_cb == 0)
+ sb = (struct uwx_scoreboard *)
+ malloc(sizeof(struct uwx_scoreboard));
+ else
+ sb = (struct uwx_scoreboard *)
+ (*env->allocate_cb)(sizeof(struct uwx_scoreboard));
+ if (sb == 0)
+ return 0;
+ sb->id = env->nscoreboards++;
+ sb->nextused = env->used_scoreboards;
+ sb->prealloc = 0;
+ env->used_scoreboards = sb;
+ TRACE_B_ALLOC(sb->id)
+ }
+
+ sb->nextstack = 0;
+ sb->nextlabel = 0;
+ for (i = 0; i < env->nsbreg; i++)
+ sb->rstate[i] = UWX_DISP_NONE;
+ sb->rstate[SBREG_RP] = UWX_DISP_REG(UWX_REG_BR(0));
+ sb->rstate[SBREG_PSP] = UWX_DISP_SPPLUS(0);
+ sb->rstate[SBREG_PFS] = UWX_DISP_REG(UWX_REG_AR_PFS);
+ sb->rstate[SBREG_PRIUNAT] = UWX_DISP_REG(UWX_REG_AR_UNAT);
+ sb->label = 0;
+ return sb;
+}
+
+static
+void uwx_reclaim_scoreboards(struct uwx_env *env)
+{
+ struct uwx_scoreboard *sb;
+
+ env->free_scoreboards = 0;
+ for (sb = env->used_scoreboards; sb != 0; sb = sb->nextused) {
+ sb->nextfree = env->free_scoreboards;
+ env->free_scoreboards = sb;
+ }
+ env->labeled_scoreboards = 0;
+}
+
+struct uwx_scoreboard *uwx_init_scoreboards(struct uwx_env *env)
+{
+ struct uwx_scoreboard *sb;
+
+ uwx_reclaim_scoreboards(env);
+ sb = uwx_alloc_scoreboard(env);
+ return sb;
+}
+
+struct uwx_scoreboard *uwx_new_scoreboard(
+ struct uwx_env *env,
+ struct uwx_scoreboard *prevsb)
+{
+ int i;
+ struct uwx_scoreboard *sb;
+
+ sb = uwx_alloc_scoreboard(env);
+ if (sb == 0)
+ return 0;
+ sb->nextstack = prevsb;
+ for (i = 0; i < env->nsbreg; i++)
+ sb->rstate[i] = prevsb->rstate[i];
+ return sb;
+}
+
+struct uwx_scoreboard *uwx_pop_scoreboards(
+ struct uwx_env *env,
+ struct uwx_scoreboard *sb,
+ int ecount)
+{
+ struct uwx_scoreboard *next;
+
+ while (ecount > 0) {
+ next = sb->nextstack;
+ TRACE_B_POP(sb->id)
+ sb->nextstack = 0;
+ sb->nextfree = env->free_scoreboards;
+ env->free_scoreboards = sb;
+ sb = next;
+ if (sb == 0)
+ return 0;
+ ecount--;
+ }
+ return sb;
+}
+
+int uwx_label_scoreboard(
+ struct uwx_env *env,
+ struct uwx_scoreboard *sb,
+ int label)
+{
+ struct uwx_scoreboard *new;
+ struct uwx_scoreboard *back;
+ struct uwx_scoreboard *next;
+ int i;
+
+ TRACE_B_LABEL(label)
+
+ /* Copy the current stack, storing reverse links */
+ /* in the "nextstack" field. */
+
+ back = 0;
+ new = 0;
+ while (sb != 0) {
+ TRACE_B_LABEL_COPY(sb->id)
+ new = uwx_alloc_scoreboard(env);
+ if (new == 0)
+ return UWX_ERR_NOMEM;
+ new->nextstack = back;
+ for (i = 0; i < env->nsbreg; i++)
+ new->rstate[i] = sb->rstate[i];
+ sb = sb->nextstack;
+ back = new;
+ }
+
+ /* The "new" pointer now points to the bottom of the new stack, */
+ /* and the "nextstack" links lead towards the top. */
+ /* Now go back down the stack, reversing the stack links to their */
+ /* proper direction. */
+
+ back = 0;
+ while (new != 0) {
+ next = new->nextstack;
+ new->nextstack = back;
+ TRACE_B_LABEL_REVERSE(back, new)
+ back = new;
+ new = next;
+ }
+
+ /* The "back" pointer now points to the top of the stack. */
+
+ back->label = label;
+ back->nextlabel = env->labeled_scoreboards;
+ env->labeled_scoreboards = back;
+ return UWX_OK;
+}
+
+int uwx_copy_scoreboard(
+ struct uwx_env *env,
+ struct uwx_scoreboard *sb,
+ int label)
+{
+ struct uwx_scoreboard *next;
+ struct uwx_scoreboard *next2;
+ struct uwx_scoreboard *lsb;
+ struct uwx_scoreboard *new;
+ struct uwx_scoreboard *back;
+ int i;
+
+ TRACE_B_COPY(label, sb->id)
+
+ /* Free the existing stack. */
+
+ next = sb->nextstack;
+ while (next != 0) {
+ TRACE_B_COPY_FREE(next->id)
+ next2 = next->nextstack;
+ next->nextstack = 0;
+ next->nextfree = env->free_scoreboards;
+ env->free_scoreboards = next;
+ next = next2;
+ }
+
+ /* Find the scoreboard with the requested label. */
+
+ for (lsb = env->labeled_scoreboards; lsb != 0; lsb = lsb->nextlabel) {
+ if (lsb->label == label)
+ break;
+ }
+
+ if (lsb == 0)
+ return UWX_ERR_UNDEFLABEL;
+
+ TRACE_B_COPY_FOUND(lsb->id)
+
+ /* Copy the labeled scoreboard. */
+
+ sb->nextstack = 0;
+ sb->nextlabel = 0;
+ for (i = 0; i < env->nsbreg; i++)
+ sb->rstate[i] = lsb->rstate[i];
+ sb->label = 0;
+
+ /* Now copy its stack, storing reverse links in the nextstack field. */
+
+ back = sb;
+ new = 0;
+ for (next = lsb->nextstack; next != 0; next = next->nextstack) {
+ TRACE_B_COPY_COPY(next->id)
+ new = uwx_alloc_scoreboard(env);
+ if (new == 0)
+ return UWX_ERR_NOMEM;
+ new->nextstack = back;
+ for (i = 0; i < env->nsbreg; i++)
+ new->rstate[i] = next->rstate[i];
+ back = new;
+ }
+
+ /* The "new" pointer now points to the bottom of the new stack, */
+ /* and the "nextstack" links lead towards the top. */
+ /* Now go back down the stack, reversing the nextstack links to their */
+ /* proper direction. */
+
+ back = 0;
+ while (new != 0) {
+ next = new->nextstack;
+ new->nextstack = back;
+ TRACE_B_COPY_REVERSE(back, new)
+ back = new;
+ new = next;
+ }
+
+ return UWX_OK;
+}
+
+void uwx_free_scoreboards(struct uwx_env *env)
+{
+ struct uwx_scoreboard *sb;
+ struct uwx_scoreboard *next;
+
+ for (sb = env->used_scoreboards; sb != 0; sb = next) {
+ TRACE_B_FREE(sb->id)
+ next = sb->nextused;
+ if (!sb->prealloc) {
+ if (env->free_cb == 0)
+ free((void *)sb);
+ else
+ (*env->free_cb)((void *)sb);
+ }
+ }
+ env->free_scoreboards = 0;
+ env->used_scoreboards = 0;
+ env->labeled_scoreboards = 0;
+}
+
diff --git a/sys/contrib/ia64/libuwx/src/uwx_scoreboard.h b/sys/contrib/ia64/libuwx/src/uwx_scoreboard.h
new file mode 100644
index 0000000..752b8fb
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_scoreboard.h
@@ -0,0 +1,84 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#define NSB_SPECIAL 9
+#define NSB_GR 4
+#define NSB_BR 5
+#define NSB_FR 20
+
+#define SBREG_RP 0
+#define SBREG_PSP 1
+#define SBREG_PFS 2
+#define SBREG_PREDS 3
+#define SBREG_UNAT 4
+#define SBREG_PRIUNAT 5
+#define SBREG_RNAT 6
+#define SBREG_LC 7
+#define SBREG_FPSR 8
+#define SBREG_GR (0 + NSB_SPECIAL)
+#define SBREG_BR (SBREG_GR + NSB_GR)
+#define SBREG_FR (SBREG_BR + NSB_BR)
+
+#define NSBREG_NOFR (NSB_SPECIAL + NSB_GR + NSB_BR)
+#define NSBREG (NSB_SPECIAL + NSB_GR + NSB_BR + NSB_FR)
+
+struct uwx_scoreboard {
+ struct uwx_scoreboard *nextused;
+ struct uwx_scoreboard *nextfree;
+ struct uwx_scoreboard *nextstack;
+ struct uwx_scoreboard *nextlabel;
+ uint64_t rstate[NSBREG];
+ int label;
+ int id;
+ int prealloc;
+};
+
+extern void uwx_prealloc_scoreboard(
+ struct uwx_env *env,
+ struct uwx_scoreboard *sb);
+
+extern struct uwx_scoreboard *uwx_alloc_scoreboard(struct uwx_env *env);
+
+extern struct uwx_scoreboard *uwx_init_scoreboards(struct uwx_env *env);
+
+extern struct uwx_scoreboard *uwx_new_scoreboard(
+ struct uwx_env *env,
+ struct uwx_scoreboard *prevsb);
+
+extern struct uwx_scoreboard *uwx_pop_scoreboards(
+ struct uwx_env *env,
+ struct uwx_scoreboard *sb,
+ int ecount);
+
+extern int uwx_label_scoreboard(
+ struct uwx_env *env,
+ struct uwx_scoreboard *sb,
+ int label);
+
+extern int uwx_copy_scoreboard(
+ struct uwx_env *env,
+ struct uwx_scoreboard *sb,
+ int label);
+
+extern void uwx_free_scoreboards(struct uwx_env *env);
diff --git a/sys/contrib/ia64/libuwx/src/uwx_self.c b/sys/contrib/ia64/libuwx/src/uwx_self.c
new file mode 100644
index 0000000..5f47205
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_self.c
@@ -0,0 +1,442 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include <stdlib.h>
+#include <string.h>
+#include <crt0.h>
+#include <dlfcn.h>
+#include <sys/uc_access.h>
+
+#include "uwx_env.h"
+#include "uwx_context.h"
+#include "uwx_trace.h"
+#include "uwx_self.h"
+#include "uwx_self_info.h"
+
+#define UWX_ABI_HPUX_SIGCONTEXT 0x0101 /* abi = HP-UX, context = 1 */
+
+void uwx_free_load_module_cache(struct uwx_self_info *info);
+
+int uwx_self_init_info_block(struct uwx_env *env, struct uwx_self_info *info)
+{
+ info->env = env;
+ info->ucontext = 0;
+ info->bspstore = 0;
+ info->sendsig_start = __load_info->li_sendsig_txt;
+ info->sendsig_end = __load_info->li_sendsig_txt +
+ __load_info->li_sendsig_tsz;
+ info->on_heap = 0;
+ info->trace = env->trace;
+ info->load_module_cache = NULL;
+
+ return UWX_OK;
+}
+
+struct uwx_self_info *uwx_self_init_info(struct uwx_env *env)
+{
+ struct uwx_self_info *info;
+
+ info = (struct uwx_self_info *)
+ (*env->allocate_cb)(sizeof(struct uwx_self_info));
+ if (info == 0)
+ return 0;
+
+ uwx_self_init_info_block(env, info);
+ info->on_heap = 1;
+ return info;
+}
+
+int uwx_self_free_info(struct uwx_self_info *info)
+{
+ int i;
+
+ if (info->load_module_cache != NULL)
+ uwx_free_load_module_cache(info);
+ if (info->on_heap)
+ (*info->env->free_cb)((void *)info);
+ return UWX_OK;
+}
+
+int uwx_self_init_from_sigcontext(
+ struct uwx_env *env,
+ struct uwx_self_info *info,
+ ucontext_t *ucontext)
+{
+ int status;
+ uint16_t reason;
+ uint64_t ip;
+ uint64_t sp;
+ uint64_t bsp;
+ uint64_t cfm;
+ unsigned int nat;
+ uint64_t ec;
+ int adj;
+
+ info->ucontext = ucontext;
+ status = __uc_get_reason(ucontext, &reason);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
+ status = __uc_get_ip(ucontext, &ip);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
+ status = __uc_get_grs(ucontext, 12, 1, &sp, &nat);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
+ status = __uc_get_cfm(ucontext, &cfm);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
+#ifdef NEW_UC_GET_AR
+ status = __uc_get_ar_bsp(ucontext, &bsp);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
+ status = __uc_get_ar_bspstore(ucontext, &info->bspstore);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
+ status = __uc_get_ar_ec(ucontext, &ec);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
+#else
+ status = __uc_get_ar(ucontext, 17, &bsp);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
+ status = __uc_get_ar(ucontext, 18, &info->bspstore);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
+ status = __uc_get_ar(ucontext, 66, &ec);
+ if (status != 0)
+ return UWX_ERR_UCACCESS;
+#endif
+ /* The returned bsp needs to be adjusted. */
+ /* For interrupt frames, where bsp was advanced by a cover */
+ /* instruction, subtract sof (size of frame). For non-interrupt */
+ /* frames, where bsp was advanced by br.call, subtract sol */
+ /* (size of locals). */
+ if (reason != 0)
+ adj = (unsigned int)cfm & 0x7f; /* interrupt frame */
+ else
+ adj = ((unsigned int)cfm >> 7) & 0x7f; /* non-interrupt frame */
+ bsp = uwx_add_to_bsp(bsp, -adj);
+ cfm |= ec << 52;
+ uwx_init_context(env, ip, sp, bsp, cfm);
+ return UWX_OK;
+}
+
+int uwx_self_do_context_frame(
+ struct uwx_env *env,
+ struct uwx_self_info *info)
+{
+ int abi_context;
+ int status;
+ uint64_t ucontext;
+
+ abi_context = uwx_get_abi_context_code(env);
+ if (abi_context != UWX_ABI_HPUX_SIGCONTEXT)
+ return UWX_SELF_ERR_BADABICONTEXT;
+ status = uwx_get_reg(env, UWX_REG_GR(32), (uint64_t *)&ucontext);
+ if (status != UWX_OK)
+ return status;
+ return uwx_self_init_from_sigcontext(env, info,
+ (ucontext_t *)(intptr_t)ucontext);
+}
+
+int uwx_self_copyin(
+ int request,
+ char *loc,
+ uint64_t rem,
+ int len,
+ intptr_t tok)
+{
+ int status;
+ int regid;
+ unsigned int nat;
+ struct uwx_self_info *info = (struct uwx_self_info *) tok;
+ unsigned long *wp;
+ uint64_t *dp;
+
+ status = -1;
+
+ dp = (uint64_t *) loc;
+
+ switch (request) {
+ case UWX_COPYIN_UINFO:
+ case UWX_COPYIN_MSTACK:
+ if (len == 4) {
+ wp = (unsigned long *) loc;
+ *wp = *(unsigned long *)(intptr_t)rem;
+ TRACE_SELF_COPYIN4(rem, len, wp)
+ status = 0;
+ }
+ else if (len == 8) {
+ *dp = *(uint64_t *)(intptr_t)rem;
+ TRACE_SELF_COPYIN8(rem, len, dp)
+ status = 0;
+ }
+ break;
+ case UWX_COPYIN_RSTACK:
+ if (len == 8) {
+ if (info->ucontext == 0 && rem == (info->bspstore | 0x1f8)) {
+ *dp = info->env->context.special[UWX_REG_AR_RNAT];
+ status = 0;
+ }
+ else if (info->ucontext == 0 || rem < info->bspstore) {
+ *dp = *(uint64_t *)(intptr_t)rem;
+ TRACE_SELF_COPYIN8(rem, len, dp)
+ status = 0;
+ }
+ else {
+ status = __uc_get_rsebs(info->ucontext,
+ (uint64_t *)(intptr_t)rem, 1, dp);
+ }
+ }
+ break;
+ case UWX_COPYIN_REG:
+ regid = (int)rem;
+ if (info->ucontext != 0) {
+ if (len == 8) {
+ if (rem == UWX_REG_PREDS)
+ status = __uc_get_prs(info->ucontext, dp);
+ else if (rem == UWX_REG_AR_PFS)
+ status = __uc_get_ar(info->ucontext, 64, dp);
+ else if (rem == UWX_REG_AR_RNAT)
+ status = __uc_get_ar(info->ucontext, 19, dp);
+ else if (rem == UWX_REG_AR_UNAT)
+ status = __uc_get_ar(info->ucontext, 36, dp);
+ else if (rem == UWX_REG_AR_FPSR)
+ status = __uc_get_ar(info->ucontext, 40, dp);
+ else if (rem == UWX_REG_AR_LC)
+ status = __uc_get_ar(info->ucontext, 65, dp);
+ else if (regid >= UWX_REG_GR(1) &&
+ regid <= UWX_REG_GR(31))
+ status = __uc_get_grs(info->ucontext,
+ regid - UWX_REG_GR(0), 1, dp, &nat);
+ else if (regid >= UWX_REG_BR(0) &&
+ regid <= UWX_REG_BR(7))
+ status = __uc_get_brs(info->ucontext,
+ regid - UWX_REG_BR(0), 1, dp);
+ }
+ else if (len == 16) {
+ if (regid >= UWX_REG_FR(2) && regid <= UWX_REG_FR(127)) {
+ status = __uc_get_frs(info->ucontext,
+ regid - UWX_REG_FR(0), 1, (fp_regval_t *)dp);
+ }
+ }
+ }
+ break;
+ }
+ if (status != 0)
+ return 0;
+ return len;
+}
+
+#define MODULE_CACHE_SIZE 4
+
+struct load_module_cache {
+ int clock;
+ char *names[MODULE_CACHE_SIZE];
+ struct load_module_desc descs[MODULE_CACHE_SIZE];
+ struct uwx_symbol_cache *symbol_cache;
+};
+
+void uwx_free_load_module_cache(struct uwx_self_info *info)
+{
+ int i;
+
+ for (i = 0; i < MODULE_CACHE_SIZE; i++) {
+ if (info->load_module_cache->names[i] != NULL)
+ (*info->env->free_cb)((void *)info->load_module_cache->names[i]);
+ }
+
+ if (info->load_module_cache->symbol_cache != NULL)
+ uwx_release_symbol_cache(info->env,
+ info->load_module_cache->symbol_cache);
+
+ (*info->env->free_cb)((void *)info->load_module_cache);
+}
+
+struct load_module_desc *uwx_get_modinfo(
+ struct uwx_self_info *info,
+ uint64_t ip,
+ char **module_name_p)
+{
+ int i;
+ UINT64 handle;
+ struct load_module_cache *cache;
+ struct load_module_desc *desc;
+ char *module_name;
+
+ cache = info->load_module_cache;
+ if (cache == NULL) {
+ cache = (struct load_module_cache *)
+ (*info->env->allocate_cb)(sizeof(struct load_module_cache));
+ if (cache == NULL)
+ return NULL;
+ for (i = 0; i < MODULE_CACHE_SIZE; i++) {
+ desc = &cache->descs[i];
+ desc->text_base = 0;
+ desc->text_size = 0;
+ cache->names[i] = NULL;
+ }
+ cache->clock = 0;
+ cache->symbol_cache = NULL;
+ info->load_module_cache = cache;
+ }
+ for (i = 0; i < MODULE_CACHE_SIZE; i++) {
+ desc = &cache->descs[i];
+ if (ip >= desc->text_base && ip < desc->text_base + desc->text_size)
+ break;
+ }
+ if (i >= MODULE_CACHE_SIZE) {
+ i = cache->clock;
+ cache->clock = (cache->clock + 1) % MODULE_CACHE_SIZE;
+ desc = &cache->descs[i];
+ handle = dlmodinfo(ip, desc, sizeof(*desc), 0, 0, 0);
+ if (handle == 0)
+ return NULL;
+ if (cache->names[i] != NULL)
+ (*info->env->free_cb)(cache->names[i]);
+ cache->names[i] = NULL;
+ }
+ if (module_name_p != NULL) {
+ if (cache->names[i] == NULL) {
+ module_name = dlgetname(desc, sizeof(*desc), 0, 0, 0);
+ if (module_name != NULL) {
+ cache->names[i] = (char *)
+ (*info->env->allocate_cb)(strlen(module_name)+1);
+ if (cache->names[i] != NULL)
+ strcpy(cache->names[i], module_name);
+ }
+ }
+ *module_name_p = cache->names[i];
+ }
+ return desc;
+}
+
+int uwx_self_lookupip(
+ int request,
+ uint64_t ip,
+ intptr_t tok,
+ uint64_t **resultp)
+{
+ struct uwx_self_info *info = (struct uwx_self_info *) tok;
+ UINT64 handle;
+ struct load_module_desc *desc;
+ uint64_t *unwind_base;
+ uint64_t *rvec;
+ char *module_name;
+ char *func_name;
+ uint64_t offset;
+ int i;
+ int status;
+
+ if (request == UWX_LKUP_LOOKUP) {
+ TRACE_SELF_LOOKUP(ip)
+ if (ip >= info->sendsig_start && ip < info->sendsig_end) {
+ i = 0;
+ rvec = info->rvec;
+ rvec[i++] = UWX_KEY_CONTEXT;
+ rvec[i++] = UWX_ABI_HPUX_SIGCONTEXT;
+ rvec[i++] = UWX_KEY_END;
+ rvec[i++] = 0;
+ *resultp = rvec;
+ return UWX_LKUP_FDESC;
+ }
+ else {
+ desc = uwx_get_modinfo(info, ip, NULL);
+ if (desc == NULL)
+ return UWX_LKUP_ERR;
+ unwind_base = (uint64_t *) (intptr_t) desc->unwind_base;
+ TRACE_SELF_LOOKUP_DESC(desc->text_base,
+ desc->linkage_ptr, unwind_base)
+ i = 0;
+ rvec = info->rvec;
+ rvec[i++] = UWX_KEY_TBASE;
+ rvec[i++] = desc->text_base;
+ rvec[i++] = UWX_KEY_UFLAGS;
+ rvec[i++] = unwind_base[0];
+ rvec[i++] = UWX_KEY_USTART;
+ rvec[i++] = desc->text_base + unwind_base[1];
+ rvec[i++] = UWX_KEY_UEND;
+ rvec[i++] = desc->text_base + unwind_base[2];
+ rvec[i++] = UWX_KEY_GP;
+ rvec[i++] = desc->linkage_ptr;
+ rvec[i++] = UWX_KEY_END;
+ rvec[i++] = 0;
+ *resultp = rvec;
+ return UWX_LKUP_UTABLE;
+ }
+ }
+ else if (request == UWX_LKUP_FREE) {
+ return 0;
+ }
+ else if (request == UWX_LKUP_MODULE) {
+ desc = uwx_get_modinfo(info, ip, &module_name);
+ if (desc == NULL)
+ return UWX_LKUP_ERR;
+ if (module_name == NULL)
+ return UWX_LKUP_ERR;
+ i = 0;
+ rvec = info->rvec;
+ rvec[i++] = UWX_KEY_MODULE;
+ rvec[i++] = (uint64_t)(intptr_t)module_name;
+ rvec[i++] = UWX_KEY_TBASE;
+ rvec[i++] = desc->text_base;
+ rvec[i++] = UWX_KEY_END;
+ rvec[i++] = 0;
+ *resultp = rvec;
+ return UWX_LKUP_SYMINFO;
+ }
+ else if (request == UWX_LKUP_SYMBOLS) {
+ rvec = *resultp;
+ for (i = 0; rvec[i] != UWX_KEY_END; i += 2) {
+ if (rvec[i] == UWX_KEY_FUNCSTART)
+ ip = rvec[i+1];
+ }
+ desc = uwx_get_modinfo(info, ip, &module_name);
+ if (desc == NULL)
+ return UWX_LKUP_ERR;
+ if (module_name == NULL)
+ return UWX_LKUP_ERR;
+ status = uwx_find_symbol(info->env,
+ &info->load_module_cache->symbol_cache,
+ module_name, ip - desc->text_base,
+ &func_name, &offset);
+ i = 0;
+ rvec = info->rvec;
+ rvec[i++] = UWX_KEY_MODULE;
+ rvec[i++] = (uint64_t)(intptr_t)module_name;
+ rvec[i++] = UWX_KEY_TBASE;
+ rvec[i++] = desc->text_base;
+ if (status == UWX_OK) {
+ rvec[i++] = UWX_KEY_FUNC;
+ rvec[i++] = (uint64_t)(intptr_t)func_name;
+ rvec[i++] = UWX_KEY_FUNCSTART;
+ rvec[i++] = ip - offset;
+ }
+ rvec[i++] = UWX_KEY_END;
+ rvec[i++] = 0;
+ *resultp = rvec;
+ return UWX_LKUP_SYMINFO;
+ }
+ return UWX_LKUP_ERR;
+}
diff --git a/sys/contrib/ia64/libuwx/src/uwx_self.h b/sys/contrib/ia64/libuwx/src/uwx_self.h
new file mode 100644
index 0000000..ada3184
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_self.h
@@ -0,0 +1,112 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef __UWX_SELF_INCLUDED
+#define __UWX_SELF_INCLUDED 1
+
+#include <signal.h>
+
+#ifndef __UWX_INCLUDED
+#include "uwx.h"
+#endif /* __UWX_INCLUDED */
+
+#if defined(__cplusplus)
+#define __EXTERN_C extern "C"
+#else
+#define __EXTERN_C extern
+#endif
+
+struct uwx_self_info;
+
+__EXTERN_C struct uwx_self_info *uwx_self_init_info(struct uwx_env *env);
+
+__EXTERN_C int uwx_self_free_info(struct uwx_self_info *info);
+
+__EXTERN_C int uwx_self_init_context(struct uwx_env *env);
+
+__EXTERN_C int uwx_self_init_from_sigcontext(
+ struct uwx_env *env,
+ struct uwx_self_info *info,
+ ucontext_t *ucontext);
+
+__EXTERN_C int uwx_self_do_context_frame(
+ struct uwx_env *env,
+ struct uwx_self_info *info);
+
+__EXTERN_C int uwx_self_copyin(
+ int request,
+ char *loc,
+ uint64_t rem,
+ int len,
+ intptr_t tok);
+
+__EXTERN_C int uwx_self_lookupip(
+ int request,
+ uint64_t ip,
+ intptr_t tok,
+ uint64_t **resultp);
+
+#define UWX_SELF_ERR_BADABICONTEXT (-101)
+
+#undef __EXTERN_C
+
+#if defined(__cplusplus)
+
+class UnwindExpressSelf : public UnwindExpress {
+
+public:
+
+ UnwindExpressSelf() {
+ info = uwx_self_init_info(env);
+ (void)uwx_register_callbacks(env, (intptr_t)info,
+ uwx_self_copyin, uwx_self_lookupip);
+ }
+
+ ~UnwindExpressSelf() {
+ if (info != 0)
+ uwx_self_free_info(info);
+ info = 0;
+ }
+
+ int init_context() {
+ return uwx_self_init_context(env);
+ }
+
+ int init_context(ucontext_t *ucontext) {
+ return uwx_self_init_from_sigcontext(env, info, ucontext);
+ }
+
+ int do_context_frame() {
+ return uwx_self_do_context_frame(env, info);
+ }
+
+protected:
+
+ struct uwx_self_info *info;
+
+};
+
+#endif /* __cplusplus */
+
+#endif /* __UWX_SELF_INCLUDED */
diff --git a/sys/contrib/ia64/libuwx/src/uwx_self_context.s b/sys/contrib/ia64/libuwx/src/uwx_self_context.s
new file mode 100644
index 0000000..e2986eb
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_self_context.s
@@ -0,0 +1,383 @@
+// Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+// Permission is hereby granted, free of charge, to any person
+// obtaining a copy of this software and associated documentation
+// files (the "Software"), to deal in the Software without
+// restriction, including without limitation the rights to use,
+// copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the
+// Software is furnished to do so, subject to the following
+// conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+// OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+// HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+// OTHER DEALINGS IN THE SOFTWARE.
+
+#ifdef _LP64
+#define SWIZZLE add
+#define STPTR st8
+#else
+#define SWIZZLE addp4
+#define STPTR st4
+#endif
+
+rRP = r14
+rPFS = r15
+rUNAT = r16
+rRNAT = r17
+rENV0 = r18
+rENV1 = r19
+rENV2 = r20
+rNSLOT = r21
+rBSP = r22
+rPBSP = r23
+rRSC = r24
+rNATP = r25
+rBIAS = r26
+rRSC0 = r27
+rTMP1 = r28
+rTMP2 = r29
+rTMP3 = r30
+rTMP4 = r31
+rTMP5 = r8
+rMYPFS = r9
+rPSP = r10
+
+VALID_IP = 1
+VALID_SP = 1 << 1
+VALID_BSP = 1 << 2
+VALID_CFM = 1 << 3
+VALID_PREDS = 1 << 7
+VALID_PRIUNAT = 1 << 8
+VALID_RNAT = 1 << 10
+VALID_UNAT = 1 << 11
+VALID_FPSR = 1 << 12
+VALID_LC = 1 << 13
+VALID_GRS = 0xf << 16
+VALID_BRS = 0x1f << 20
+VALID_BASIC4 = VALID_IP | VALID_SP | VALID_BSP | VALID_CFM
+VALID_SPEC = VALID_PREDS | VALID_PRIUNAT | VALID_RNAT | VALID_UNAT | VALID_FPSR | VALID_LC
+VALID_REGS = VALID_BASIC4 | VALID_SPEC | VALID_GRS | VALID_BRS
+VALID_FRS = 0xfffff
+// valid_regs and valid_frs are separate unsigned int fields.
+// In order to store them with a single st8, we need to know
+// the endianness.
+#ifdef __LITTLE_ENDIAN__
+VALID_BITS = (VALID_FRS << 32) | VALID_REGS
+#else
+VALID_BITS = (VALID_REGS << 32) | VALID_FRS
+#endif
+
+ .text
+
+// int uwx_self_init_context(struct uwx_env *env);
+//
+// Stores a snapshot of the caller's context in the uwx_env structure.
+
+ .proc uwx_self_init_context
+ .global uwx_self_init_context
+uwx_self_init_context:
+ .prologue
+ alloc rPFS = ar.pfs, 1, 0, 0, 0
+ mov rUNAT = ar.unat
+ .body
+ SWIZZLE rENV0 = r0, r32 // rENV0 = &env
+ ;;
+ flushrs
+ extr.u rNSLOT = rPFS, 7, 7 // nslots = pfs.sol
+ mov rRP = b0
+ ;;
+ mov rRSC = ar.rsc
+ add rENV1 = 136, rENV0 // rENV1 = &env->context.gr[0]
+ add rENV2 = 144, rENV0 // rENV2 = &env->context.gr[1]
+ ;;
+ and rRSC0 = -4, rRSC // clear ar.rsc.mode
+ adds rNATP = 0x1f8, r0
+ mov rTMP1 = b1
+ ;;
+ st8.spill [rENV1] = r4, 16 // env+136: r4
+ st8.spill [rENV2] = r5, 16 // env+144: r5
+ mov rTMP2 = b2
+ ;;
+ st8.spill [rENV1] = r6, 16 // env+152: r6
+ st8.spill [rENV2] = r7, 16 // env+160: r7
+ mov rTMP3 = b3
+ ;;
+ st8 [rENV1] = rTMP1, 16 // env+168: b1
+ st8 [rENV2] = rTMP2, 16 // env+176: b2
+ mov rTMP1 = b4
+ ;;
+ st8 [rENV1] = rTMP3, 16 // env+184: b3
+ st8 [rENV2] = rTMP1, 16 // env+192: b4
+ mov rTMP2 = b5
+ ;;
+ st8 [rENV1] = rTMP2 // env+200: b5
+ mov ar.rsc = rRSC0 // enforced lazy mode
+ add rENV1 = 8, rENV0
+ ;;
+ mov rRNAT = ar.rnat // get copy of ar.rnat
+ movl rTMP1 = VALID_BITS // valid_regs: ip, sp, bsp, cfm,
+ // preds, priunat, rnat, unat, fpsr,
+ // lc, grs, brs
+ // = 0x1ff3d8f00000000
+ ;;
+ mov ar.rsc = rRSC // restore ar.rsc
+ mov rBSP = ar.bsp
+ add rTMP3 = 136, rENV0 // spill_loc = &env->context.gr[0]
+ ;;
+ mov rTMP2 = ar.unat
+ nop
+ extr.u rTMP3 = rTMP3, 3, 6 // bitpos = spill_loc{8:3}
+ ;;
+ and rBIAS = rBSP, rNATP // bias = (bsp & 0x1f8) ...
+ sub rTMP4 = 64, rTMP3 // (64 - bitpos)
+ shr rTMP5 = rTMP2, rTMP3 // (unat >> bitpos)
+ ;;
+ nop
+ extr.u rBIAS = rBIAS, 3, 6 // ... div 8
+ shl rTMP2 = rTMP2, rTMP4 // (unat << (64 - bitpos))
+ ;;
+ or rTMP2 = rTMP2, rTMP5 // rotate_right(unat, bitpos)
+ nop
+ mov rTMP4 = pr
+ ;;
+ st8 [rENV0] = rTMP1, 16 // env+0: valid_regs mask
+ st8 [rENV1] = rRP, 24 // env+8: ip (my rp)
+ sub rBIAS = rNSLOT, rBIAS // bias = nslots - bias
+ ;;
+ cmp.lt p6, p0 = 0, rBIAS // if (0 < bias) ...
+ cmp.lt p7, p0 = 63, rBIAS // if (63 < bias) ...
+ ;;
+ st8 [rENV0] = r12, 48 // env+16: sp
+ st8 [rENV1] = rPFS, 40 // env+32: cfm (my pfs)
+(p6) add rNSLOT = 1, rNSLOT // ... nslots++
+ ;;
+ st8 [rENV0] = rTMP4, 24 // env+64: preds
+ st8 [rENV1] = rTMP2, 24 // env+72: priunat
+(p7) add rNSLOT = 1, rNSLOT // ... nslots++
+ ;;
+ st8 [rENV0] = rRNAT, -64 // env+88: ar.rnat
+ st8 [rENV1] = rUNAT, 8 // env+96: ar.unat
+ dep.z rTMP3 = rNSLOT, 3, 7 // (nslots << 3)
+ ;;
+ sub rPBSP = rBSP, rTMP3 // prev_bsp = bsp - (nslots << 3)
+ mov rTMP3 = ar.fpsr
+ mov rTMP1 = ar.lc
+ ;;
+ st8 [rENV0] = rPBSP, 184 // env+24: bsp (my prev bsp)
+ st8 [rENV1] = rTMP3, 8 // env+104: ar.fpsr
+ add rENV2 = 320, rENV2 // rENV2 = &env->context.rstate
+ ;;
+ st8 [rENV1] = rTMP1, 112 // env+112: ar.lc
+ STPTR [rENV2] = r0 // env+528: env->rstate = 0
+ nop
+ ;;
+ // THIS CODE NEEDS TO BE SCHEDULED!!!
+ stf.spill [rENV0] = f2, 32 // env+208: f2
+ stf.spill [rENV1] = f3, 32 // env+224: f3
+ ;;
+ stf.spill [rENV0] = f4, 32 // env+240: f4
+ stf.spill [rENV1] = f5, 32 // env+256: f5
+ ;;
+ stf.spill [rENV0] = f16, 32 // env+272: f16
+ stf.spill [rENV1] = f17, 32 // env+288: f17
+ ;;
+ stf.spill [rENV0] = f18, 32 // env+304: f16
+ stf.spill [rENV1] = f19, 32 // env+320: f17
+ ;;
+ stf.spill [rENV0] = f20, 32 // env+336: f16
+ stf.spill [rENV1] = f21, 32 // env+352: f17
+ ;;
+ stf.spill [rENV0] = f22, 32 // env+368: f16
+ stf.spill [rENV1] = f23, 32 // env+384: f17
+ ;;
+ stf.spill [rENV0] = f24, 32 // env+400: f16
+ stf.spill [rENV1] = f25, 32 // env+416: f17
+ ;;
+ stf.spill [rENV0] = f26, 32 // env+432: f16
+ stf.spill [rENV1] = f27, 32 // env+448: f17
+ ;;
+ stf.spill [rENV0] = f28, 32 // env+464: f16
+ stf.spill [rENV1] = f29, 32 // env+480: f17
+ ;;
+ stf.spill [rENV0] = f30, 32 // env+496: f16
+ stf.spill [rENV1] = f31, 32 // env+512: f17
+ ;;
+ mov ar.unat = rUNAT
+ mov ret0 = r0 // return UWX_OK
+ br.ret.sptk b0
+ .endp
+
+// uwx_self_install_context(
+// struct uwx_env *env,
+// uint64_t r15,
+// uint64_t r16,
+// uint64_t r17,
+// uint64_t r18,
+// uint64_t ret
+// );
+//
+// Installs the given context, and sets the landing pad binding
+// registers r15-r18 to the values given.
+// Returns the value "ret" to the new context (for testing --
+// when transferring to a landing pad, the new context won't
+// care about the return value).
+
+ .proc uwx_self_install_context
+ .global uwx_self_install_context
+uwx_self_install_context:
+ .prologue
+ alloc rMYPFS = ar.pfs, 6, 0, 0, 0
+ .body
+ SWIZZLE rENV0 = r0, r32 // rENV0 = &env
+ ;;
+
+ // THIS CODE NEEDS TO BE SCHEDULED!!!
+
+ // Restore GR 4-7 and ar.unat
+ add rENV1 = 136, rENV0 // &env->context.gr[0]
+ add rENV2 = 72, rENV0 // &env->context.priunat
+ ;;
+ ld8 rTMP2 = [rENV2], 24 // env+72: priunat
+ extr.u rTMP3 = rENV1, 3, 6 // bitpos = spill_loc{8:3}
+ ;;
+ ld8 rUNAT = [rENV2], 48 // env+96: ar.unat
+ sub rTMP4 = 64, rTMP3 // (64 - bitpos)
+ shl rTMP5 = rTMP2, rTMP3 // (unat << bitpos)
+ ;;
+ shr rTMP2 = rTMP2, rTMP4 // (unat >> (64 - bitpos))
+ ;;
+ or rTMP2 = rTMP2, rTMP5 // rotate_left(unat, bitpos)
+ ;;
+ mov ar.unat = rTMP2 // put priunat in place
+ ;;
+ ld8.fill r4 = [rENV1], 16 // env+136: r4
+ ld8.fill r5 = [rENV2], 16 // env+144: r5
+ ;;
+ ld8.fill r6 = [rENV1], 16 // env+152: r6
+ ld8.fill r7 = [rENV2], 16 // env+160: r7
+ ;;
+ mov ar.unat = rUNAT // restore real ar.unat
+
+ // Restore BR 1-5
+ ld8 rTMP1 = [rENV1], 16 // env+168: b1
+ ld8 rTMP2 = [rENV2], 16 // env+176: b2
+ ;;
+ ld8 rTMP3 = [rENV1], 16 // env+184: b3
+ ld8 rTMP4 = [rENV2], -168 // env+192: b4
+ mov b1 = rTMP1
+ ;;
+ ld8 rTMP1 = [rENV1], -168 // env+200: b5
+ mov b2 = rTMP2
+ mov b3 = rTMP3
+ mov b4 = rTMP4
+ ;;
+ mov b5 = rTMP1
+
+ // Restore ar.bsp, ar.pfs, and ar.rnat
+ ld8 rPFS = [rENV1], 56 // env+32: cfm (+saved ar.ec)
+ mov rRSC = ar.rsc
+ adds rBIAS = 0x1f8, r0
+ ;;
+ flushrs
+ ld8 rRNAT = [rENV1], -24 // env+88: ar.rnat
+ ld8 rPBSP = [rENV2], 88 // env+24: prev_bsp
+ and rRSC0 = -4, rRSC // clear ar.rsc.mode
+ ;;
+ mov ar.rsc = rRSC0 // enforced lazy mode
+ extr.u rNSLOT = rPFS, 7, 7 // nslots = pfs.sol
+ ;;
+ invala
+ and rBIAS = rPBSP, rBIAS // bias = prev_bsp & 0x1f8 ...
+ ;;
+ extr.u rBIAS = rBIAS, 3, 6 // ... div 8
+ ;;
+ add rBIAS = rNSLOT, rBIAS // bias += nslots
+ ;;
+ cmp.lt p6, p0 = 63, rBIAS // if (63 < bias) ...
+ cmp.lt p7, p0 = 126, rBIAS // if (126 < bias) ...
+ ;;
+(p6) add rNSLOT = 1, rNSLOT // ... nslots++
+ ;;
+(p7) add rNSLOT = 1, rNSLOT // ... nslots++
+ ;;
+ dep.z rTMP3 = rNSLOT, 3, 7 // (nslots << 3)
+ ;;
+ add rBSP = rPBSP, rTMP3 // bsp = prev_bsp + (nslots << 3)
+ ;;
+ mov ar.bspstore = rBSP // restore ar.bsp
+ ;;
+ mov ar.rnat = rRNAT // restore ar.rnat
+ mov ar.pfs = rPFS // restore ar.pfs
+ ;;
+ mov ar.rsc = rRSC // restore ar.rsc
+
+ // Restore preds and ar.lc
+ ld8 rTMP1 = [rENV1], -56 // env+64: preds
+ ld8 rTMP2 = [rENV2], -96 // env+112: ar.lc
+ ;;
+ mov pr = rTMP1
+ mov ar.lc = rTMP2
+
+ // Get previous sp and ip
+ ld8 rRP = [rENV1], 96 // env+8: ip (my rp)
+ ld8 rPSP = [rENV2], 112 // env+16: sp
+ ;;
+
+ // Restore ar.fpsr and gp
+ ld8 rTMP1 = [rENV1], 104 // env+104: ar.fpsr
+ ld8 r1 = [rENV2], 96 // env+128: gp
+ ;;
+ mov ar.fpsr = rTMP1 // restore ar.fpsr
+
+ // Restore FR 2-5 and 16-31
+ ldf.fill f2 = [rENV1], 32 // env+208: f2
+ ldf.fill f3 = [rENV2], 32 // env+224: f3
+ ;;
+ ldf.fill f4 = [rENV1], 32 // env+240: f4
+ ldf.fill f5 = [rENV2], 32 // env+256: f5
+ ;;
+ ldf.fill f16 = [rENV1], 32 // env+272: f16
+ ldf.fill f17 = [rENV2], 32 // env+288: f17
+ ;;
+ ldf.fill f18 = [rENV1], 32 // env+304: f16
+ ldf.fill f19 = [rENV2], 32 // env+320: f17
+ ;;
+ ldf.fill f20 = [rENV1], 32 // env+336: f16
+ ldf.fill f21 = [rENV2], 32 // env+352: f17
+ ;;
+ ldf.fill f22 = [rENV1], 32 // env+368: f16
+ ldf.fill f23 = [rENV2], 32 // env+384: f17
+ ;;
+ ldf.fill f24 = [rENV1], 32 // env+400: f16
+ ldf.fill f25 = [rENV2], 32 // env+416: f17
+ ;;
+ ldf.fill f26 = [rENV1], 32 // env+432: f16
+ ldf.fill f27 = [rENV2], 32 // env+448: f17
+ ;;
+ ldf.fill f28 = [rENV1], 32 // env+464: f16
+ ldf.fill f29 = [rENV2], 32 // env+480: f17
+ ;;
+ ldf.fill f30 = [rENV1], 32 // env+496: f16
+ ldf.fill f31 = [rENV2], 32 // env+512: f17
+
+ // Set landing pad parameter registers
+ mov r15 = r33
+ mov r16 = r34
+ mov r17 = r35
+ mov r18 = r36
+
+ // Restore previous sp and Return
+ mov ret0 = r37
+ mov sp = rPSP
+ mov b0 = rRP
+ br.ret.sptk b0
+
+ .endp
diff --git a/sys/contrib/ia64/libuwx/src/uwx_self_info.h b/sys/contrib/ia64/libuwx/src/uwx_self_info.h
new file mode 100644
index 0000000..1d1cc57
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_self_info.h
@@ -0,0 +1,44 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#define MAX_RVEC_SIZE 12
+
+struct load_module_cache;
+
+struct uwx_self_info {
+ struct uwx_env *env;
+ ucontext_t *ucontext;
+ uint64_t bspstore;
+ uint64_t rvec[MAX_RVEC_SIZE];
+ uint64_t sendsig_start;
+ uint64_t sendsig_end;
+ int on_heap;
+ int trace;
+ struct load_module_cache *load_module_cache;
+};
+
+extern int uwx_self_init_info_block(
+ struct uwx_env *env,
+ struct uwx_self_info *info
+ );
diff --git a/sys/contrib/ia64/libuwx/src/uwx_step.c b/sys/contrib/ia64/libuwx/src/uwx_step.c
new file mode 100644
index 0000000..42b8c93
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_step.c
@@ -0,0 +1,827 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "uwx_env.h"
+#include "uwx_utable.h"
+#include "uwx_uinfo.h"
+#include "uwx_scoreboard.h"
+#include "uwx_str.h"
+#include "uwx_step.h"
+#include "uwx_trace.h"
+
+/*
+ * uwx_step.c
+ *
+ * This file contains the routines for stepping from one frame
+ * into its callers frame. The context for the current frame
+ * is maintained inside the current unwind environment
+ * (struct uwx_env), and is updated with each call to
+ * uwx_step() to refer to the previous frame.
+ */
+
+
+/* Forward Declarations */
+
+int uwx_decode_uvec(struct uwx_env *env, uint64_t *uvec, uint64_t **rstate);
+int uwx_restore_reg(struct uwx_env *env, uint64_t rstate,
+ uint64_t *valp, uint64_t *histp);
+int uwx_restore_freg(struct uwx_env *env, uint64_t rstate,
+ uint64_t *valp, uint64_t *histp);
+int uwx_restore_nat(struct uwx_env *env, uint64_t rstate, int unat);
+
+
+/* uwx_lookupip_hook: Hook routine so dynamic instrumentation */
+/* tools can intercept Lookup IP events. When not */
+/* intercepted, it just returns "Not found", so that */
+/* the callback routine is invoked. */
+
+/*ARGSUSED*/
+int uwx_lookupip_hook(int request, uint64_t ip, intptr_t tok, uint64_t **vecp,
+ size_t uvecsize)
+{
+ return UWX_LKUP_NOTFOUND;
+}
+
+
+/* uwx_get_frame_info: Gets unwind info for current frame */
+static
+int uwx_get_frame_info(struct uwx_env *env)
+{
+ int i;
+ int status;
+ int cbstatus;
+ int cbcalled = 0;
+ uint64_t ip;
+ uint64_t *uvec;
+ uint64_t *rstate;
+ struct uwx_utable_entry uentry;
+ uint64_t uvecout[UVECSIZE];
+
+ if (env->copyin == 0 || env->lookupip == 0)
+ return UWX_ERR_NOCALLBACKS;
+
+ env->ptr_size = DWORDSZ;
+ env->code_start = 0;
+ env->function_offset = -1LL;
+ env->function_name = 0;
+ env->module_name = 0;
+ env->abi_context = 0;
+ uwx_reset_str_pool(env);
+
+ /* Use the lookup IP callback routine to find out about the */
+ /* current IP. If the predicate registers are valid, pass them */
+ /* in the uvec. */
+
+ /* When self-unwinding, we call a hook routine before the */
+ /* callback. If the application is running under control of */
+ /* a dynamic instrumentation tool, that tool will have an */
+ /* opportunity to intercept lookup IP requests. */
+
+ i = 0;
+ uvecout[i++] = UWX_KEY_VERSION;
+ uvecout[i++] = UWX_VERSION;
+ if (env->context.valid_regs & (1 << UWX_REG_PREDS)) {
+ uvecout[i++] = UWX_KEY_PREDS;
+ uvecout[i++] = env->context.special[UWX_REG_PREDS];
+ }
+ uvecout[i++] = UWX_KEY_END;
+ uvecout[i++] = 0;
+ uvec = uvecout;
+ cbstatus = UWX_LKUP_NOTFOUND;
+ ip = env->context.special[UWX_REG_IP];
+ env->remapped_ip = ip;
+
+ /* Call the hook routine. */
+
+ if (env->remote == 0)
+ cbstatus = uwx_lookupip_hook(UWX_LKUP_LOOKUP, ip, env->cb_token, &uvec,
+ sizeof(uvecout));
+
+ /* If the hook routine remapped the IP, use the new IP for */
+ /* the callback instead of the original IP. */
+
+ if (cbstatus == UWX_LKUP_REMAP) {
+ for (i = 0; uvec[i] != UWX_KEY_END; i += 2) {
+ switch ((int)uvec[i]) {
+ case UWX_KEY_NEWIP:
+ ip = uvec[i+1];
+ break;
+ }
+ }
+ env->remapped_ip = ip;
+ }
+
+ /* Now call the callback routine unless the hook routine gave */
+ /* us all the info. */
+
+ if (cbstatus == UWX_LKUP_NOTFOUND || cbstatus == UWX_LKUP_REMAP) {
+ cbcalled = 1;
+ cbstatus = (*env->lookupip)(UWX_LKUP_LOOKUP, ip, env->cb_token, &uvec);
+ }
+
+ /* If the callback routine remapped the IP, call it one more time */
+ /* with the new IP. */
+
+ if (cbstatus == UWX_LKUP_REMAP) {
+ for (i = 0; uvec[i] != UWX_KEY_END; i += 2) {
+ switch ((int)uvec[i]) {
+ case UWX_KEY_NEWIP:
+ ip = uvec[i+1];
+ break;
+ }
+ }
+ env->remapped_ip = ip;
+ cbstatus = (*env->lookupip)(UWX_LKUP_LOOKUP, ip, env->cb_token, &uvec);
+ }
+
+ /* If NOTFOUND, there's nothing we can do but return an error. */
+
+ if (cbstatus == UWX_LKUP_NOTFOUND) {
+ status = UWX_ERR_IPNOTFOUND;
+ }
+
+ /* If the callback returns an unwind table, we need to */
+ /* search the table for an unwind entry that describes the */
+ /* code region of interest, then decode the unwind information */
+ /* associated with that unwind table entry, and store the */
+ /* resulting register state array in the unwind environment */
+ /* block. */
+
+ else if (cbstatus == UWX_LKUP_UTABLE) {
+ status = uwx_search_utable(env, ip, uvec, &uentry);
+ if (cbcalled)
+ (void) (*env->lookupip)(UWX_LKUP_FREE, 0, env->cb_token, &uvec);
+ if (status == UWX_OK) {
+ env->ptr_size = uentry.ptr_size;
+ env->code_start = uentry.code_start;
+ status = uwx_decode_uinfo(env, &uentry, &rstate);
+ }
+ if (status == UWX_ERR_NOUENTRY || status == UWX_ERR_NOUDESC)
+ status = uwx_default_rstate(env, &rstate);
+ if (status == UWX_OK)
+ env->rstate = rstate;
+ }
+
+ /* If the callback returns an unwind info block, we can */
+ /* proceed directly to decoding the unwind information. */
+
+ else if (cbstatus == UWX_LKUP_UINFO) {
+ uentry.ptr_size = DWORDSZ;
+ uentry.code_start = 0;
+ uentry.code_end = 0;
+ uentry.unwind_info = 0;
+ uentry.unwind_flags = 0;
+ for (i = 0; uvec[i] != UWX_KEY_END; i += 2) {
+ switch ((int)uvec[i]) {
+ case UWX_KEY_UFLAGS:
+ uentry.unwind_flags = uvec[i+1];
+ if (uentry.unwind_flags & UNWIND_TBL_32BIT)
+ uentry.ptr_size = WORDSZ;
+ break;
+ case UWX_KEY_UINFO:
+ uentry.unwind_info = uvec[i+1];
+ break;
+ case UWX_KEY_GP:
+ uwx_set_reg(env, UWX_REG_GP, uvec[i+1]);
+ break;
+ case UWX_KEY_MODULE:
+ env->module_name =
+ uwx_alloc_str(env, (char *)(intptr_t)(uvec[i+1]));
+ break;
+ case UWX_KEY_FUNC:
+ env->function_name =
+ uwx_alloc_str(env, (char *)(intptr_t)(uvec[i+1]));
+ break;
+ case UWX_KEY_FUNCSTART:
+ uentry.code_start = uvec[i+1];
+ env->code_start = uentry.code_start;
+ break;
+ }
+ }
+ env->ptr_size = uentry.ptr_size;
+ if (cbcalled)
+ (void) (*env->lookupip)(UWX_LKUP_FREE, 0, env->cb_token, &uvec);
+ status = uwx_decode_uinfo(env, &uentry, &rstate);
+ if (status == UWX_ERR_NOUDESC)
+ status = uwx_default_rstate(env, &rstate);
+ if (status == UWX_OK)
+ env->rstate = rstate;
+ }
+
+ /* If the callback returns a frame description (in the form */
+ /* of an update vector), convert the update vector into a */
+ /* register state array, then invoke the callback again to */
+ /* let it free any memory it allocated. */
+
+ else if (cbstatus == UWX_LKUP_FDESC) {
+ status = uwx_decode_uvec(env, uvec, &rstate);
+ if (cbcalled)
+ (void) (*env->lookupip)(UWX_LKUP_FREE, 0, env->cb_token, &uvec);
+ if (status == UWX_OK)
+ env->rstate = rstate;
+ }
+
+ /* Any other return from the callback is an error. */
+
+ else {
+ status = UWX_ERR_LOOKUPERR;
+ }
+ return status;
+}
+
+
+/* uwx_restore_markers: Restores the stack markers -- PSP, RP, PFS */
+
+int uwx_restore_markers(struct uwx_env *env)
+{
+ int status;
+ uint64_t val;
+ uint64_t hist;
+
+ if ((env->context.valid_regs & VALID_BASIC4) != VALID_BASIC4)
+ return UWX_ERR_NOCONTEXT;
+
+ /* If we haven't already obtained the frame info for the */
+ /* current frame, get it now. */
+
+ if (env->rstate == 0) {
+ status = uwx_get_frame_info(env);
+ if (status != UWX_OK)
+ return status;
+ }
+
+ TRACE_S_STEP(env->rstate)
+
+ if (env->rstate[SBREG_PSP] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env, env->rstate[SBREG_PSP], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ env->context.special[UWX_REG_PSP] = val;
+ env->history.special[UWX_REG_PSP] = hist;
+ env->context.valid_regs |= 1 << UWX_REG_PSP;
+ TRACE_S_RESTORE_REG("PSP", env->rstate[SBREG_PSP], val)
+ }
+
+ if (env->rstate[SBREG_RP] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env, env->rstate[SBREG_RP], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ env->context.special[UWX_REG_RP] = val;
+ env->history.special[UWX_REG_RP] = hist;
+ env->context.valid_regs |= 1 << UWX_REG_RP;
+ TRACE_S_RESTORE_REG("RP", env->rstate[SBREG_RP], val)
+ }
+
+ if (env->rstate[SBREG_PFS] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env, env->rstate[SBREG_PFS], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ env->context.special[UWX_REG_PFS] = val;
+ env->history.special[UWX_REG_PFS] = hist;
+ env->context.valid_regs |= 1 << UWX_REG_PFS;
+ TRACE_S_RESTORE_REG("PFS", env->rstate[SBREG_PFS], val)
+ }
+
+ return UWX_OK;
+}
+
+/* uwx_get_module_info: Gets module name and text base for current frame */
+
+int uwx_get_module_info(
+ struct uwx_env *env,
+ char **modp,
+ uint64_t *text_base)
+{
+ int i;
+ int status;
+ int cbstatus;
+ uint64_t ip;
+ uint64_t *uvec;
+ uint64_t uvecout[UVECSIZE];
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ /* If we haven't already obtained the frame info for the */
+ /* current frame, get it now. */
+
+ if (env->rstate == 0) {
+ status = uwx_get_frame_info(env);
+ if (status != UWX_OK)
+ return status;
+ }
+
+ /* Get the module name from the lookup IP callback. */
+ if (env->module_name == 0) {
+ ip = env->remapped_ip;
+ i = 0;
+ if (env->function_offset >= 0) {
+ uvecout[i++] = UWX_KEY_FUNCSTART;
+ uvecout[i++] = ip - env->function_offset;
+ }
+ uvecout[i++] = UWX_KEY_END;
+ uvecout[i++] = 0;
+ uvec = uvecout;
+ cbstatus = (*env->lookupip)(UWX_LKUP_MODULE, ip, env->cb_token, &uvec);
+
+ if (cbstatus == UWX_LKUP_SYMINFO) {
+ for (i = 0; uvec[i] != UWX_KEY_END; i += 2) {
+ switch ((int)uvec[i]) {
+ case UWX_KEY_TBASE:
+ env->text_base = uvec[i+1];
+ break;
+ case UWX_KEY_MODULE:
+ env->module_name =
+ uwx_alloc_str(env, (char *)(intptr_t)(uvec[i+1]));
+ break;
+ case UWX_KEY_FUNC:
+ env->function_name =
+ uwx_alloc_str(env, (char *)(intptr_t)(uvec[i+1]));
+ break;
+ case UWX_KEY_FUNCSTART:
+ env->function_offset = ip - uvec[i+1];
+ break;
+ }
+ }
+ (void) (*env->lookupip)(UWX_LKUP_FREE, 0, env->cb_token, &uvec);
+ }
+ }
+
+ *modp = env->module_name;
+ *text_base = env->text_base;
+
+ return UWX_OK;
+}
+
+/* uwx_get_funcstart: Gets start address of function from current frame */
+
+int uwx_get_funcstart(
+ struct uwx_env *env,
+ uint64_t *funcstart)
+{
+ int status;
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ /* If we haven't already obtained the frame info for the */
+ /* current frame, get it now. */
+
+ if (env->rstate == 0) {
+ status = uwx_get_frame_info(env);
+ if (status != UWX_OK)
+ return status;
+ }
+
+ *funcstart = env->remapped_ip - env->function_offset;
+
+ return UWX_OK;
+}
+
+/* uwx_get_sym_info: Gets symbolic info from current frame */
+/* (Will make a UWX_LKUP_SYMBOLS callback if info */
+/* was not provided by UWX_LKUP_LOOKUP callback) */
+
+int uwx_get_sym_info(
+ struct uwx_env *env,
+ char **modp,
+ char **symp,
+ uint64_t *offsetp)
+{
+ int status;
+ int cbstatus;
+ uint64_t ip;
+ uint64_t *uvec;
+ uint64_t uvecout[UVECSIZE];
+ int i;
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ /* If we haven't already obtained the frame info for the */
+ /* current frame, get it now. */
+
+ if (env->rstate == 0) {
+ status = uwx_get_frame_info(env);
+ if (status != UWX_OK)
+ return status;
+ }
+
+ /* Get the symbolic information from the lookup IP callback. */
+ if (env->function_name == 0) {
+ ip = env->remapped_ip;
+ i = 0;
+ if (env->function_offset >= 0) {
+ uvecout[i++] = UWX_KEY_FUNCSTART;
+ uvecout[i++] = ip - env->function_offset;
+ }
+ uvecout[i++] = UWX_KEY_END;
+ uvecout[i++] = 0;
+ uvec = uvecout;
+ cbstatus = (*env->lookupip)(UWX_LKUP_SYMBOLS, ip, env->cb_token, &uvec);
+
+ if (cbstatus == UWX_LKUP_SYMINFO) {
+ for (i = 0; uvec[i] != UWX_KEY_END; i += 2) {
+ switch ((int)uvec[i]) {
+ case UWX_KEY_MODULE:
+ env->module_name =
+ uwx_alloc_str(env, (char *)(intptr_t)(uvec[i+1]));
+ break;
+ case UWX_KEY_FUNC:
+ env->function_name =
+ uwx_alloc_str(env, (char *)(intptr_t)(uvec[i+1]));
+ break;
+ case UWX_KEY_FUNCSTART:
+ env->function_offset = ip - uvec[i+1];
+ break;
+ }
+ }
+ (void) (*env->lookupip)(UWX_LKUP_FREE, 0, env->cb_token, &uvec);
+ }
+ }
+
+ *modp = env->module_name;
+ *symp = env->function_name;
+ *offsetp = env->function_offset;
+
+ return UWX_OK;
+}
+
+
+/* uwx_step: Steps from the current frame to the previous frame */
+
+int uwx_step(struct uwx_env *env)
+{
+ int i;
+ int status;
+ int pfs_sol;
+ int dispcode;
+ uint64_t val;
+ uint64_t fval[2];
+ uint64_t hist;
+ uint64_t tempgr[NPRESERVEDGR];
+ int needpriunat;
+ int unat;
+ int tempnat;
+
+ if (env == 0)
+ return UWX_ERR_NOENV;
+
+ /* Complete the current context by restoring the current values */
+ /* of psp, rp, and pfs. */
+
+ if (env->rstate == 0 ||
+ (env->context.valid_regs & VALID_MARKERS) != VALID_MARKERS) {
+ status = uwx_restore_markers(env);
+ if (status != UWX_OK)
+ return status;
+ }
+
+ /* Check for bottom of stack (rp == 0). */
+
+ if (env->context.special[UWX_REG_RP] == 0)
+ return UWX_BOTTOM;
+
+ /* Find where the primary unat is saved, get a copy. */
+ /* Then, as we restore the GRs, we'll merge the NaT bits into the */
+ /* priunat register in the context. */
+ /* (Make sure we need it, though, before we try to get it, */
+ /* because the attempt to get it might invoke the copy-in callback. */
+ /* We don't need the priunat unless one of GR 4-7 was */
+ /* saved to the memory stack.) */
+
+ needpriunat = 0;
+ for (i = 0; i < NSB_GR; i++) {
+ dispcode = UWX_GET_DISP_CODE(env->rstate[SBREG_GR + i]);
+ if (dispcode == UWX_DISP_SPREL(0) || dispcode == UWX_DISP_PSPREL(0))
+ needpriunat = 1;
+ }
+ unat = 0;
+ if (needpriunat && env->rstate[SBREG_PRIUNAT] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env, env->rstate[SBREG_PRIUNAT], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ unat = (int) val;
+ env->history.special[UWX_REG_PRIUNAT] = hist;
+ TRACE_S_RESTORE_REG("PRIUNAT", env->rstate[SBREG_PRIUNAT], val)
+ }
+
+ /* Retrieve saved values of the preserved GRs into temporaries. */
+
+ tempnat = (int) env->context.special[UWX_REG_PRIUNAT];
+ for (i = 0; i < NSB_GR; i++) {
+ if (env->rstate[SBREG_GR + i] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env,
+ env->rstate[SBREG_GR + i], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ tempgr[i] = val;
+ if (uwx_restore_nat(env, env->rstate[SBREG_GR + i], unat))
+ tempnat |= 1 << i;
+ else
+ tempnat &= ~(1 << i);
+ env->history.gr[i] = hist;
+ env->context.valid_regs |= 1 << (i + VALID_GR_SHIFT);
+ TRACE_S_RESTORE_GR(i, env->rstate[SBREG_GR + i], val)
+ }
+ }
+
+ /* Now we have everything we need to step back to the previous frame. */
+
+ /* Restore preserved BRs. */
+
+ for (i = 0; i < NSB_BR; i++) {
+ if (env->rstate[SBREG_BR + i] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env,
+ env->rstate[SBREG_BR + i], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ env->context.br[i] = val;
+ env->history.br[i] = hist;
+ env->context.valid_regs |= 1 << (i + VALID_BR_SHIFT);
+ TRACE_S_RESTORE_BR(i, env->rstate[SBREG_BR + i], val)
+ }
+ }
+
+ /* Restore preserved FRs. */
+
+ if (env->nsbreg == NSBREG) {
+ for (i = 0; i < NSB_FR; i++) {
+ if (env->rstate[SBREG_FR + i] != UWX_DISP_NONE) {
+ status = uwx_restore_freg(env,
+ env->rstate[SBREG_FR + i], fval, &hist);
+ if (status != UWX_OK)
+ return status;
+ env->context.fr[i].part0 = fval[0];
+ env->context.fr[i].part1 = fval[1];
+ env->history.fr[i] = hist;
+ env->context.valid_frs |= 1 << i;
+ TRACE_S_RESTORE_FR(i, env->rstate[SBREG_FR + i], fval)
+ }
+ }
+ }
+
+ /* Restore other preserved regs. */
+
+ if (env->rstate[SBREG_PREDS] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env, env->rstate[SBREG_PREDS], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ env->context.special[UWX_REG_PREDS] = val;
+ env->history.special[UWX_REG_PREDS] = hist;
+ env->context.valid_regs |= 1 << UWX_REG_PREDS;
+ TRACE_S_RESTORE_REG("PREDS", env->rstate[SBREG_PREDS], val)
+ }
+ if (env->rstate[SBREG_RNAT] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env, env->rstate[SBREG_RNAT], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ env->context.special[UWX_REG_AR_RNAT] = val;
+ env->history.special[UWX_REG_AR_RNAT] = hist;
+ env->context.valid_regs |= 1 << UWX_REG_AR_RNAT;
+ TRACE_S_RESTORE_REG("RNAT", env->rstate[SBREG_RNAT], val)
+ }
+ if (env->rstate[SBREG_UNAT] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env, env->rstate[SBREG_UNAT], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ env->context.special[UWX_REG_AR_UNAT] = val;
+ env->history.special[UWX_REG_AR_UNAT] = hist;
+ env->context.valid_regs |= 1 << UWX_REG_AR_UNAT;
+ TRACE_S_RESTORE_REG("UNAT", env->rstate[SBREG_UNAT], val)
+ }
+ if (env->rstate[SBREG_FPSR] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env, env->rstate[SBREG_FPSR], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ env->context.special[UWX_REG_AR_FPSR] = val;
+ env->history.special[UWX_REG_AR_FPSR] = hist;
+ env->context.valid_regs |= 1 << UWX_REG_AR_FPSR;
+ TRACE_S_RESTORE_REG("FPSR", env->rstate[SBREG_FPSR], val)
+ }
+ if (env->rstate[SBREG_LC] != UWX_DISP_NONE) {
+ status = uwx_restore_reg(env, env->rstate[SBREG_LC], &val, &hist);
+ if (status != UWX_OK)
+ return status;
+ env->context.special[UWX_REG_AR_LC] = val;
+ env->history.special[UWX_REG_AR_LC] = hist;
+ env->context.valid_regs |= 1 << UWX_REG_AR_LC;
+ TRACE_S_RESTORE_REG("LC", env->rstate[SBREG_LC], val)
+ }
+
+ /* Restore preserved GRs from temporaries. */
+
+ for (i = 0; i < NSB_GR; i++) {
+ if (env->rstate[SBREG_GR + i] != UWX_DISP_NONE)
+ env->context.gr[i] = tempgr[i];
+ }
+ env->context.special[UWX_REG_PRIUNAT] = tempnat;
+
+ /* Restore the frame markers. */
+
+ env->context.special[UWX_REG_IP] = env->context.special[UWX_REG_RP];
+ env->history.special[UWX_REG_IP] = env->history.special[UWX_REG_RP];
+
+ env->context.special[UWX_REG_SP] = env->context.special[UWX_REG_PSP];
+ env->history.special[UWX_REG_SP] = env->history.special[UWX_REG_PSP];
+
+ pfs_sol = ((unsigned int)env->context.special[UWX_REG_PFS] >> 7) & 0x7f;
+ env->context.special[UWX_REG_BSP] = uwx_add_to_bsp(
+ env->context.special[UWX_REG_BSP],
+ -pfs_sol);
+
+ env->context.special[UWX_REG_CFM] = env->context.special[UWX_REG_PFS];
+ env->history.special[UWX_REG_CFM] = env->history.special[UWX_REG_PFS];
+
+ env->context.special[UWX_REG_RP] = 0;
+
+ /* The frame info for the new frame isn't yet available. */
+
+ env->rstate = 0;
+ env->context.valid_regs &= ~VALID_MARKERS;
+
+ return UWX_OK;
+}
+
+
+/* uwx_decode_uvec: Converts the update vector into a register state array */
+
+int uwx_decode_uvec(struct uwx_env *env, uint64_t *uvec, uint64_t **rstate)
+{
+ int i;
+ int status;
+
+ status = uwx_default_rstate(env, rstate);
+ if (status != UWX_OK)
+ return status;
+
+ for (i = 0; uvec[i] != UWX_KEY_END; i += 2) {
+ switch ((int)uvec[i]) {
+ case UWX_KEY_CONTEXT:
+ env->abi_context = (int)(uvec[i+1]);
+ status = UWX_ABI_FRAME;
+ break;
+ case UWX_KEY_GP:
+ uwx_set_reg(env, UWX_REG_GP, uvec[i+1]);
+ break;
+ case UWX_KEY_MODULE:
+ env->module_name =
+ uwx_alloc_str(env, (char *)(intptr_t)(uvec[i+1]));
+ break;
+ case UWX_KEY_FUNC:
+ env->function_name =
+ uwx_alloc_str(env, (char *)(intptr_t)(uvec[i+1]));
+ break;
+ case UWX_KEY_FUNCSTART:
+ env->function_offset = env->remapped_ip - uvec[i+1];
+ break;
+ default:
+ return UWX_ERR_CANTUNWIND;
+ }
+ }
+ return status;
+}
+
+
+/* uwx_restore_reg: Restores a register according to the scoreboard */
+
+#define COPYIN_MSTACK_8(dest, src) \
+ (env->remote? \
+ (*env->copyin)(UWX_COPYIN_MSTACK, (dest), (src), \
+ DWORDSZ, env->cb_token) : \
+ (*(uint64_t *)(intptr_t)(dest) = \
+ *(uint64_t *)(intptr_t)(src), DWORDSZ) )
+
+int uwx_restore_reg(struct uwx_env *env, uint64_t rstate,
+ uint64_t *valp, uint64_t *histp)
+{
+ int status;
+ uint64_t p;
+ int n;
+ int regid;
+
+ status = UWX_OK;
+
+ switch (UWX_GET_DISP_CODE(rstate)) {
+ case UWX_DISP_SPPLUS(0):
+ *valp = env->context.special[UWX_REG_SP] +
+ UWX_GET_DISP_OFFSET(rstate);
+ *histp = UWX_DISP_NONE;
+ break;
+ case UWX_DISP_SPREL(0):
+ p = env->context.special[UWX_REG_SP] +
+ UWX_GET_DISP_OFFSET(rstate);
+ n = COPYIN_MSTACK_8((char *)valp, p);
+ if (n != DWORDSZ)
+ status = UWX_ERR_COPYIN_MSTK;
+ *histp = UWX_DISP_MSTK(p);
+ break;
+ case UWX_DISP_PSPREL(0):
+ p = env->context.special[UWX_REG_PSP] + 16 -
+ UWX_GET_DISP_OFFSET(rstate);
+ n = COPYIN_MSTACK_8((char *)valp, p);
+ if (n != DWORDSZ)
+ status = UWX_ERR_COPYIN_MSTK;
+ *histp = UWX_DISP_MSTK(p);
+ break;
+ case UWX_DISP_REG(0):
+ regid = UWX_GET_DISP_REGID(rstate);
+ status = uwx_get_reg(env, regid, valp);
+ (void) uwx_get_spill_loc(env, regid, histp);
+ break;
+ }
+ return status;
+}
+
+#define COPYIN_MSTACK_16(dest, src) \
+ (env->remote? \
+ (*env->copyin)(UWX_COPYIN_MSTACK, (dest), (src), \
+ 2*DWORDSZ, env->cb_token) : \
+ (*(uint64_t *)(intptr_t)(dest) = *(uint64_t *)(intptr_t)(src), \
+ *(uint64_t *)(intptr_t)((dest)+8) = \
+ *(uint64_t *)(intptr_t)((src)+8), \
+ 2*DWORDSZ) )
+
+int uwx_restore_freg(struct uwx_env *env, uint64_t rstate,
+ uint64_t *valp, uint64_t *histp)
+{
+ int status;
+ uint64_t p;
+ int n;
+ int regid;
+
+ status = UWX_OK;
+
+ switch (UWX_GET_DISP_CODE(rstate)) {
+ case UWX_DISP_SPREL(0):
+ p = env->context.special[UWX_REG_SP] +
+ UWX_GET_DISP_OFFSET(rstate);
+ n = COPYIN_MSTACK_16((char *)valp, p);
+ if (n != 2*DWORDSZ)
+ status = UWX_ERR_COPYIN_MSTK;
+ *histp = UWX_DISP_MSTK(p);
+ break;
+ case UWX_DISP_PSPREL(0):
+ p = env->context.special[UWX_REG_PSP] + 16 -
+ UWX_GET_DISP_OFFSET(rstate);
+ n = COPYIN_MSTACK_16((char *)valp, p);
+ if (n != 2*DWORDSZ)
+ status = UWX_ERR_COPYIN_MSTK;
+ *histp = UWX_DISP_MSTK(p);
+ break;
+ case UWX_DISP_REG(0):
+ regid = UWX_GET_DISP_REGID(rstate);
+ status = uwx_get_reg(env, regid, valp);
+ (void) uwx_get_spill_loc(env, regid, histp);
+ break;
+ }
+ return status;
+}
+
+/* uwx_restore_nat: Returns the saved NaT bit for a preserved GR */
+
+int uwx_restore_nat(struct uwx_env *env, uint64_t rstate, int unat)
+{
+ int nat;
+ uint64_t p;
+
+ nat = 0;
+ switch (UWX_GET_DISP_CODE(rstate)) {
+ case UWX_DISP_SPREL(0):
+ p = env->context.special[UWX_REG_SP] +
+ UWX_GET_DISP_OFFSET(rstate);
+ nat = (unat >> (((int)p >> 3) & 0x3f)) & 0x01;
+ break;
+ case UWX_DISP_PSPREL(0):
+ p = env->context.special[UWX_REG_PSP] + 16 -
+ UWX_GET_DISP_OFFSET(rstate);
+ nat = (unat >> (((int)p >> 3) & 0x3f)) & 0x01;
+ break;
+ case UWX_DISP_REG(0):
+ (void) uwx_get_nat(env, UWX_GET_DISP_REGID(rstate), &nat);
+ break;
+ }
+ return nat;
+}
+
diff --git a/sys/contrib/ia64/libuwx/src/uwx_step.h b/sys/contrib/ia64/libuwx/src/uwx_step.h
new file mode 100644
index 0000000..0f41521
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_step.h
@@ -0,0 +1,30 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#define UVECSIZE 20 /* Size of uvec supplied by unwind engine */
+ /* for callback's use. */
+
+extern int uwx_lookupip_hook(int request, uint64_t ip, intptr_t tok,
+ uint64_t **vecp, size_t uvecsize);
+extern int uwx_restore_markers(struct uwx_env *env);
diff --git a/sys/contrib/ia64/libuwx/src/uwx_str.c b/sys/contrib/ia64/libuwx/src/uwx_str.c
new file mode 100644
index 0000000..8e66f1c
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_str.c
@@ -0,0 +1,128 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifndef _KERNEL
+#include <string.h>
+#endif
+
+#include "uwx_env.h"
+#include "uwx_str.h"
+
+#ifdef _KERNEL
+static struct uwx_str_pool uwx_str_pool;
+#define free(p) /* nullified */
+#define malloc(sz) ((sz == sizeof(uwx_str_pool)) ? &uwx_str_pool : NULL)
+#endif
+
+/*
+ * uwx_str.c
+ *
+ * This file contains the routines for maintaining a string
+ * pool for the unwind environment. We preallocate enough
+ * space for most purposes so that no memory allocation is
+ * necessary during a normal unwind. If we do need more,
+ * we use the allocate callback, if one is provided.
+ *
+ * The string pool is reused with each call to step(),
+ * and is completely freed when the unwind environment is
+ * freed.
+ */
+
+
+int uwx_init_str_pool(struct uwx_env *env, struct uwx_str_pool *pool)
+{
+ if (pool == 0)
+ return UWX_ERR_NOMEM;
+
+ pool->next = 0;
+ pool->size = STRPOOLSIZE;
+ pool->used = 0;
+
+ env->string_pool = pool;
+
+ return UWX_OK;
+}
+
+void uwx_free_str_pool(struct uwx_env *env)
+{
+ struct uwx_str_pool *pool;
+ struct uwx_str_pool *next;
+
+ /* The first pool is preallocated as part of the uwx_env. Don't free it! */
+ pool = env->string_pool;
+ if (pool != 0)
+ pool = pool->next;
+ for (; pool != 0; pool = next) {
+ next = pool->next;
+ if (env->free_cb == 0)
+ free(pool);
+ else
+ (*env->free_cb)(pool);
+ }
+}
+
+char *uwx_alloc_str(struct uwx_env *env, char *str)
+{
+ int len;
+ int size;
+ struct uwx_str_pool *pool;
+ struct uwx_str_pool *prev;
+ char *p;
+
+ len = strlen(str) + 1;
+ prev = 0;
+ for (pool = env->string_pool; pool != 0; pool = pool->next) {
+ prev = pool;
+ if (pool->size - pool->used >= len)
+ break;
+ }
+ if (pool == 0) {
+ size = STRPOOLSIZE;
+ if (len > size)
+ size = len;
+ size += sizeof(struct uwx_str_pool) - STRPOOLSIZE;
+ if (env->allocate_cb == 0)
+ pool = (struct uwx_str_pool *) malloc(size);
+ else
+ pool = (struct uwx_str_pool *) (*env->allocate_cb)(size);
+ if (env->string_pool == 0)
+ return 0;
+ pool->next = 0;
+ pool->size = size;
+ pool->used = 0;
+ prev->next = pool;
+ }
+ p = pool->pool + pool->used;
+ strcpy(p, str);
+ pool->used += len;
+ return p;
+}
+
+void uwx_reset_str_pool(struct uwx_env *env)
+{
+ struct uwx_str_pool *pool;
+
+ for (pool = env->string_pool; pool != 0; pool = pool->next)
+ pool->used = 0;
+}
diff --git a/sys/contrib/ia64/libuwx/src/uwx_str.h b/sys/contrib/ia64/libuwx/src/uwx_str.h
new file mode 100644
index 0000000..5e85d6a
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_str.h
@@ -0,0 +1,37 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#define STRPOOLSIZE (400-sizeof(void *)-2*sizeof(int))
+
+struct uwx_str_pool {
+ struct uwx_str_pool *next;
+ int size;
+ int used;
+ char pool[STRPOOLSIZE];
+};
+
+extern int uwx_init_str_pool(struct uwx_env *env, struct uwx_str_pool *pool);
+extern void uwx_free_str_pool(struct uwx_env *env);
+extern char *uwx_alloc_str(struct uwx_env *env, char *str);
+extern void uwx_reset_str_pool(struct uwx_env *env);
diff --git a/sys/contrib/ia64/libuwx/src/uwx_swap.c b/sys/contrib/ia64/libuwx/src/uwx_swap.c
new file mode 100644
index 0000000..5917393
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_swap.c
@@ -0,0 +1,70 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "uwx_env.h"
+#include "uwx_swap.h"
+
+void uwx_swap4(uint32_t *w)
+{
+ unsigned char *p;
+ unsigned char t[4];
+
+ p = (unsigned char *) w;
+
+ t[0] = p[0];
+ t[1] = p[1];
+ t[2] = p[2];
+ t[3] = p[3];
+
+ p[0] = t[3];
+ p[1] = t[2];
+ p[2] = t[1];
+ p[3] = t[0];
+}
+
+void uwx_swap8(uint64_t *dw)
+{
+ unsigned char *p;
+ unsigned char t[8];
+
+ p = (unsigned char *) dw;
+
+ t[0] = p[0];
+ t[1] = p[1];
+ t[2] = p[2];
+ t[3] = p[3];
+ t[4] = p[4];
+ t[5] = p[5];
+ t[6] = p[6];
+ t[7] = p[7];
+
+ p[0] = t[7];
+ p[1] = t[6];
+ p[2] = t[5];
+ p[3] = t[4];
+ p[4] = t[3];
+ p[5] = t[2];
+ p[6] = t[1];
+ p[7] = t[0];
+}
diff --git a/sys/contrib/ia64/libuwx/src/uwx_swap.h b/sys/contrib/ia64/libuwx/src/uwx_swap.h
new file mode 100644
index 0000000..70d921c
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_swap.h
@@ -0,0 +1,26 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+extern void uwx_swap4(uint32_t *w);
+extern void uwx_swap8(uint64_t *dw);
diff --git a/sys/contrib/ia64/libuwx/src/uwx_symbols.c b/sys/contrib/ia64/libuwx/src/uwx_symbols.c
new file mode 100644
index 0000000..b91c2db
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_symbols.c
@@ -0,0 +1,850 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#ifdef USE_CLEAN_NAMESPACE
+#define fopen _fopen
+#define fseek _fseek
+#define fread _fread
+#define fclose _fclose
+#endif /* USE_CLEAN_NAMESPACE */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <inttypes.h>
+#include <elf.h>
+
+#include "uwx.h"
+#include "uwx_env.h"
+
+#ifdef USE_CLEAN_NAMESPACE
+/*
+ * Moved the defines above the include of stdio.h,
+ * so we don't need these unless that causes problems
+ * and we have to move them back down here.
+ * #define fopen _fopen
+ * #define fseek _fseek
+ * #define fread _fread
+ * #define fclose _fclose
+ * extern FILE *_fopen(const char *, const char *);
+ * extern int _fseek(FILE *, long int, int);
+ * extern size_t _fread(void *, size_t, size_t, FILE *);
+ * extern int _fclose(FILE *);
+ */
+#endif /* USE_CLEAN_NAMESPACE */
+
+struct uwx_symbol_cache {
+ char *module_name;
+ int nsyms;
+ uint64_t *sym_values;
+ char **sym_names;
+ char *strings;
+};
+
+
+int uwx_read_func_symbols(
+ struct uwx_env *env,
+ struct uwx_symbol_cache *cache,
+ char *module_name);
+
+
+int uwx_find_symbol(
+ struct uwx_env *env,
+ struct uwx_symbol_cache **symbol_cache_p,
+ char *module_name,
+ uint64_t relip,
+ char **func_name_p,
+ uint64_t *offset_p)
+{
+ int status;
+ int i;
+ uint64_t offset;
+ uint64_t best_offset;
+ char *best_name;
+ struct symbol *sym;
+ struct uwx_symbol_cache *cache = NULL;
+
+ /* Allocate a symbol cache on first call */
+ if (symbol_cache_p != NULL)
+ cache = *symbol_cache_p;
+ if (cache == NULL) {
+ cache = (struct uwx_symbol_cache *)
+ (*env->allocate_cb)(sizeof(struct uwx_symbol_cache));
+ if (cache == NULL)
+ return UWX_ERR_NOMEM;
+ cache->module_name = NULL;
+ cache->nsyms = 0;
+ cache->sym_values = NULL;
+ cache->sym_names = NULL;
+ cache->strings = NULL;
+ if (symbol_cache_p != NULL)
+ *symbol_cache_p = cache;
+ }
+
+ /* Read function symbols from the object file */
+ status = uwx_read_func_symbols(env, cache, module_name);
+ if (status != UWX_OK)
+ return status;
+
+ /* Search for best match */
+ best_offset = ~(uint64_t)0;
+ best_name = NULL;
+ for (i = 0; i < cache->nsyms; i++) {
+ if (cache->sym_values[i] == relip) {
+ *func_name_p = cache->sym_names[i];
+ *offset_p = 0;
+ if (symbol_cache_p == NULL)
+ uwx_release_symbol_cache(env, cache);
+ return UWX_OK;
+ }
+ if (relip > cache->sym_values[i]) {
+ offset = relip - cache->sym_values[i];
+ if (offset < best_offset) {
+ best_offset = offset;
+ best_name = cache->sym_names[i];
+ }
+ }
+ }
+ if (best_name == NULL)
+ return UWX_ERR_NOSYM;
+
+ if (symbol_cache_p == NULL)
+ uwx_release_symbol_cache(env, cache);
+
+ *func_name_p = best_name;
+ *offset_p = best_offset;
+ return UWX_OK;
+}
+
+
+void uwx_release_symbol_cache(
+ struct uwx_env *env,
+ struct uwx_symbol_cache *symbol_cache)
+{
+ if (symbol_cache->module_name != NULL)
+ (*env->free_cb)(symbol_cache->module_name);
+ if (symbol_cache->sym_values != NULL)
+ (*env->free_cb)(symbol_cache->sym_values);
+ if (symbol_cache->sym_names != NULL)
+ (*env->free_cb)(symbol_cache->sym_names);
+ if (symbol_cache->strings != NULL)
+ (*env->free_cb)(symbol_cache->strings);
+ (*env->free_cb)(symbol_cache);
+}
+
+
+#define ELF_ERR_NOMEM UWX_ERR_NOMEM /* Out of memory */
+#define ELF_ERR_OPEN UWX_ERR_NOSYM /* Can't open file */
+
+#define ELF_ERR_NOHEADER UWX_ERR_NOSYM /* Can't read ELF header */
+#define ELF_ERR_NOTELF UWX_ERR_NOSYM /* Not an ELF file */
+#define ELF_ERR_HEADER_SIZE UWX_ERR_NOSYM /* Invalid e_ehsize */
+#define ELF_ERR_INVALID_CLASS UWX_ERR_NOSYM /* Invalid EI_CLASS */
+#define ELF_ERR_INVALID_DATA UWX_ERR_NOSYM /* Invalid EI_DATA */
+
+#define ELF_ERR_READ_SECTHDR UWX_ERR_NOSYM /* Can't read section headers */
+#define ELF_ERR_SECTHDR_SIZE UWX_ERR_NOSYM /* Invalid e_shentsize */
+
+#define ELF_ERR_READ_PROGHDR UWX_ERR_NOSYM /* Can't read program headers */
+#define ELF_ERR_PROGHDR_SIZE UWX_ERR_NOSYM /* Invalid e_phentsize */
+
+#define ELF_ERR_READ_SECTION UWX_ERR_NOSYM /* Can't read section contents */
+
+#define ELF_ERR_READ_SYMTAB UWX_ERR_NOSYM /* Can't read symbol table */
+#define ELF_ERR_SYMTAB_SIZE UWX_ERR_NOSYM /* Invalid sh_entsize for symtab */
+
+
+struct elf_file {
+ uint64_t phoff;
+ uint64_t shoff;
+ uint64_t text_base;
+ uint64_t text_end;
+ alloc_cb allocate_cb;
+ free_cb free_cb;
+ const char *filename;
+ FILE *fd;
+ struct elf_section *sections;
+ struct elf_symbol *symbols;
+ char *symbol_strings;
+ int native_data;
+ int source_class;
+ int source_data;
+ int ehsize;
+ int phentsize;
+ int phnum;
+ int shentsize;
+ int shnum;
+ int nsyms;
+};
+
+struct elf_section {
+ uint64_t flags;
+ uint64_t addr;
+ uint64_t offset;
+ uint64_t size;
+ uint64_t entsize;
+ char *contents;
+ struct elf_symbol *symbols;
+ int type;
+ int link;
+ int info;
+ int nelems;
+};
+
+struct elf_symbol {
+ uint64_t value;
+ char *namep;
+ int name;
+ int type;
+ int shndx;
+};
+
+
+static void elf_swap_bytes(char *buf, char *template)
+{
+ int i;
+ int sz;
+ char temp[16];
+
+ while (sz = *template++) {
+ if (sz > 16)
+ exit(1);
+ for (i = 0; i < sz; i++)
+ temp[i] = buf[i];
+ for (i = 0; i < sz; i++)
+ buf[i] = temp[sz-i-1];
+ buf += sz;
+ }
+}
+
+
+static int elf_read_section(struct elf_file *ef, int shndx)
+{
+ struct elf_section *sect;
+
+ if (shndx < 0 || shndx > ef->shnum)
+ return 0;
+
+ sect = &ef->sections[shndx];
+
+ /* Return if section has already been read */
+ if (sect->contents != NULL)
+ return 0;
+
+ sect->contents = (*ef->allocate_cb)(sect->size);
+ if (sect->contents == NULL)
+ return ELF_ERR_NOMEM;
+
+ fseek(ef->fd, (long)sect->offset, SEEK_SET);
+ if (fread(sect->contents, 1, sect->size, ef->fd) != sect->size)
+ return ELF_ERR_READ_SECTION;
+
+ return 0;
+}
+
+
+static char template_elf32_sym[] = {4, 4, 4, 1, 1, 2, 0};
+static char template_elf64_sym[] = {4, 1, 1, 2, 8, 8, 0};
+
+static int elf_read_symtab_section(struct elf_file *ef, int shndx)
+{
+ int i;
+ int nsyms;
+ long size;
+ union {
+ Elf32_Sym sym32;
+ Elf64_Sym sym64;
+ } sym;
+ struct elf_section *sect;
+ struct elf_symbol *syms;
+ struct elf_symbol *symp;
+ char *strtab;
+
+ sect = &ef->sections[shndx];
+
+ /* Return if section has already been read */
+ if (sect->symbols != NULL)
+ return 0;
+
+ if (ef->source_class == ELFCLASS32) {
+ if (sect->entsize != sizeof(sym.sym32))
+ return ELF_ERR_SYMTAB_SIZE;
+ }
+ else {
+ if (sect->entsize != sizeof(sym.sym64))
+ return ELF_ERR_SYMTAB_SIZE;
+ }
+
+ nsyms = sect->nelems;
+ syms = (struct elf_symbol *)
+ (*ef->allocate_cb)(sizeof(struct elf_symbol) * nsyms);
+ if (syms == NULL)
+ return ELF_ERR_NOMEM;
+
+ /* Read the symbol table */
+ fseek(ef->fd, (long)sect->offset, SEEK_SET);
+ for (i = 0; i < nsyms; i++) {
+
+ symp = &syms[i];
+
+ /* Read the next symbol table entry */
+ if (fread((char *)&sym, sect->entsize, 1, ef->fd) != 1) {
+ (*ef->free_cb)(syms);
+ return ELF_ERR_READ_SYMTAB;
+ }
+
+ /* Get fields from appropriate structure */
+ if (ef->source_class == ELFCLASS32) {
+ /* Swap bytes if necessary */
+ if (ef->source_data != ef->native_data)
+ elf_swap_bytes((char *)&sym, template_elf32_sym);
+ symp->name = sym.sym32.st_name;
+ symp->type = sym.sym32.st_info & 0x0f;
+ symp->shndx = sym.sym32.st_shndx;
+ symp->value = sym.sym32.st_value;
+ }
+ else {
+ /* Swap bytes if necessary */
+ if (ef->source_data != ef->native_data)
+ elf_swap_bytes((char *)&sym, template_elf64_sym);
+ symp->name = sym.sym64.st_name;
+ symp->type = sym.sym64.st_info & 0x0f;
+ symp->shndx = sym.sym64.st_shndx;
+ symp->value = sym.sym64.st_value;
+ }
+ symp->namep = NULL;
+
+ }
+
+ /* Read the symbol string table and convert section names */
+ /* from string table offsets to pointers */
+ if (sect->link > 0 && sect->link < ef->shnum) {
+ if (elf_read_section(ef, sect->link) == 0) {
+ strtab = ef->sections[sect->link].contents;
+ for (i = 0; i < nsyms; i++) {
+ symp = &syms[i];
+ symp->namep = strtab + symp->name;
+ }
+ ef->symbol_strings = strtab;
+ ef->sections[sect->link].contents = NULL;
+ }
+ }
+
+ sect->symbols = syms;
+ return 0;
+}
+
+
+static char template_elf32_phdr[] = {4, 4, 4, 4, 4, 4, 4, 4, 0};
+static char template_elf64_phdr[] = {4, 4, 8, 8, 8, 8, 8, 8, 0};
+
+static int elf_read_prog_hdrs(struct elf_file *ef)
+{
+ int i;
+ union {
+ Elf32_Phdr hdr32;
+ Elf64_Phdr hdr64;
+ } header;
+ uint64_t vaddr;
+ uint64_t memsz;
+ uint64_t unwind_base;
+ int type;
+
+ if (ef->phnum == 0)
+ return 0;
+
+ if (ef->source_class == ELFCLASS32) {
+ if (ef->phentsize != sizeof(header.hdr32))
+ return ELF_ERR_PROGHDR_SIZE;
+ }
+ else {
+ if (ef->phentsize != sizeof(header.hdr64))
+ return ELF_ERR_PROGHDR_SIZE;
+ }
+
+ /* Look for the PT_IA_64_UNWIND segment */
+ /* (That will help us identify the text segment) */
+
+ fseek(ef->fd, (long)ef->phoff, SEEK_SET);
+ for (i = 0; i < ef->phnum; i++) {
+
+ /* Read the next program header */
+ if (fread((char *)&header, ef->phentsize, 1, ef->fd) != 1)
+ return ELF_ERR_READ_PROGHDR;
+
+ /* Get fields from appropriate structure */
+ if (ef->source_class == ELFCLASS32) {
+ /* Swap bytes in header fields if necessary */
+ if (ef->source_data != ef->native_data)
+ elf_swap_bytes((char *)&header, template_elf32_phdr);
+ type = header.hdr32.p_type;
+ vaddr = header.hdr32.p_vaddr;
+ }
+ else {
+ /* Swap bytes in header fields if necessary */
+ if (ef->source_data != ef->native_data)
+ elf_swap_bytes((char *)&header, template_elf64_phdr);
+ type = header.hdr64.p_type;
+ vaddr = header.hdr64.p_vaddr;
+ }
+
+ if (type == PT_IA_64_UNWIND) {
+ unwind_base = vaddr;
+ break;
+ }
+
+ }
+
+ /* Now look for the PT_LOAD segment that includes the unwind segment */
+
+ fseek(ef->fd, (long)ef->phoff, SEEK_SET);
+ for (i = 0; i < ef->phnum; i++) {
+
+ /* Read the next program header */
+ if (fread((char *)&header, ef->phentsize, 1, ef->fd) != 1)
+ return ELF_ERR_READ_PROGHDR;
+
+ /* Get fields from appropriate structure */
+ if (ef->source_class == ELFCLASS32) {
+ /* Swap bytes in header fields if necessary */
+ if (ef->source_data != ef->native_data)
+ elf_swap_bytes((char *)&header, template_elf32_phdr);
+ type = header.hdr32.p_type;
+ vaddr = header.hdr32.p_vaddr;
+ memsz = header.hdr32.p_memsz;
+ }
+ else {
+ /* Swap bytes in header fields if necessary */
+ if (ef->source_data != ef->native_data)
+ elf_swap_bytes((char *)&header, template_elf64_phdr);
+ type = header.hdr64.p_type;
+ vaddr = header.hdr64.p_vaddr;
+ memsz = header.hdr64.p_memsz;
+ }
+
+ if (type == PT_LOAD &&
+ vaddr <= unwind_base && unwind_base < vaddr + memsz) {
+ ef->text_base = vaddr;
+ ef->text_end = vaddr + memsz;
+ break;
+ }
+
+ }
+
+ return 0;
+}
+
+
+static char template_elf32_shdr[] = {4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0};
+static char template_elf64_shdr[] = {4, 4, 8, 8, 8, 8, 4, 4, 8, 8, 0};
+
+static int elf_read_sect_hdrs(struct elf_file *ef)
+{
+ int i;
+ long size;
+ int err;
+ union {
+ Elf32_Shdr hdr32;
+ Elf64_Shdr hdr64;
+ } header;
+ struct elf_section *sect;
+ char *shstrtab;
+
+ if (ef->source_class == ELFCLASS32) {
+ if (ef->shentsize != sizeof(header.hdr32))
+ return ELF_ERR_SECTHDR_SIZE;
+ }
+ else {
+ if (ef->shentsize != sizeof(header.hdr64))
+ return ELF_ERR_SECTHDR_SIZE;
+ }
+
+ fseek(ef->fd, (long)ef->shoff, SEEK_SET);
+ ef->sections = (struct elf_section *)
+ (*ef->allocate_cb)(sizeof(struct elf_section) * ef->shnum);
+ if (ef->sections == NULL)
+ return ELF_ERR_NOMEM;
+
+ /* Read the section header table */
+ for (i = 0; i < ef->shnum; i++) {
+
+ sect = &ef->sections[i];
+
+ /* Read the next section header */
+ if (fread((char *)&header, ef->shentsize, 1, ef->fd) != 1) {
+ (*ef->free_cb)(ef->sections);
+ return ELF_ERR_READ_SECTHDR;
+ }
+
+ /* Get fields from appropriate structure */
+ if (ef->source_class == ELFCLASS32) {
+ /* Swap bytes in header fields if necessary */
+ if (ef->source_data != ef->native_data)
+ elf_swap_bytes((char *)&header, template_elf32_shdr);
+ sect->type = header.hdr32.sh_type;
+ sect->flags = header.hdr32.sh_flags;
+ sect->addr = header.hdr32.sh_addr;
+ sect->offset = header.hdr32.sh_offset;
+ sect->size = header.hdr32.sh_size;
+ sect->link = header.hdr32.sh_link;
+ sect->info = header.hdr32.sh_info;
+ sect->entsize = header.hdr32.sh_entsize;
+ }
+ else {
+ /* Swap bytes in header fields if necessary */
+ if (ef->source_data != ef->native_data)
+ elf_swap_bytes((char *)&header, template_elf64_shdr);
+ sect->type = header.hdr64.sh_type;
+ sect->flags = header.hdr64.sh_flags;
+ sect->addr = header.hdr64.sh_addr;
+ sect->offset = header.hdr64.sh_offset;
+ sect->size = header.hdr64.sh_size;
+ sect->link = header.hdr64.sh_link;
+ sect->info = header.hdr64.sh_info;
+ sect->entsize = header.hdr64.sh_entsize;
+ }
+ sect->contents = NULL;
+ sect->symbols = NULL;
+ if (sect->entsize > 0)
+ sect->nelems = sect->size / sect->entsize;
+
+ }
+
+ return 0;
+}
+
+
+static char template_elf32_ehdr[] = {2, 2, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 2, 0};
+static char template_elf64_ehdr[] = {2, 2, 4, 8, 8, 8, 4, 2, 2, 2, 2, 2, 2, 0};
+
+static int elf_read_header(struct elf_file *ef)
+{
+ union {
+ char ident[EI_NIDENT];
+ Elf32_Ehdr hdr32;
+ Elf64_Ehdr hdr64;
+ } header;
+
+ /* Read the ELF header */
+ fseek(ef->fd, 0L, SEEK_SET);
+ if (fread((char *)header.ident, EI_NIDENT, 1, ef->fd) != 1) {
+ return ELF_ERR_NOHEADER;
+ }
+
+ /* Verify that this is an ELF file */
+ if (header.ident[EI_MAG0] != ELFMAG0 ||
+ header.ident[EI_MAG1] != ELFMAG1 ||
+ header.ident[EI_MAG2] != ELFMAG2 ||
+ header.ident[EI_MAG3] != ELFMAG3) {
+ return ELF_ERR_NOTELF;
+ }
+
+ /* Get header fields from the byte array e_ident */
+ /* (These are independent of EI_CLASS and EI_DATA) */
+ ef->source_class = header.ident[EI_CLASS];
+ ef->source_data = header.ident[EI_DATA];
+
+ /* Verify EI_CLASS and EI_DATA */
+ if (header.ident[EI_CLASS] != ELFCLASS32 &&
+ header.ident[EI_CLASS] != ELFCLASS64) {
+ return ELF_ERR_INVALID_CLASS;
+ }
+ if (header.ident[EI_DATA] != ELFDATA2LSB &&
+ header.ident[EI_DATA] != ELFDATA2MSB) {
+ return ELF_ERR_INVALID_DATA;
+ }
+
+ /* Get remaining header fields from appropriate structure */
+ if (ef->source_class == ELFCLASS32) {
+ if (fread((char *)&header.hdr32 + EI_NIDENT,
+ sizeof(header.hdr32) - EI_NIDENT, 1, ef->fd) != 1)
+ return ELF_ERR_NOHEADER;
+ /* Swap bytes in header fields if necessary */
+ if (ef->source_data != ef->native_data)
+ elf_swap_bytes((char *)&header + EI_NIDENT, template_elf32_ehdr);
+ ef->phoff = header.hdr32.e_phoff;
+ ef->shoff = header.hdr32.e_shoff;
+ ef->ehsize = header.hdr32.e_ehsize;
+ ef->phentsize = header.hdr32.e_phentsize;
+ ef->phnum = header.hdr32.e_phnum;
+ ef->shentsize = header.hdr32.e_shentsize;
+ ef->shnum = header.hdr32.e_shnum;
+ if (ef->ehsize != sizeof(header.hdr32)) {
+ return ELF_ERR_HEADER_SIZE;
+ }
+ }
+ else {
+ if (fread((char *)&header.hdr64 + EI_NIDENT,
+ sizeof(header.hdr64) - EI_NIDENT, 1, ef->fd) != 1)
+ return ELF_ERR_NOHEADER;
+ /* Swap bytes in header fields if necessary */
+ if (ef->source_data != ef->native_data)
+ elf_swap_bytes((char *)&header + EI_NIDENT, template_elf64_ehdr);
+ ef->phoff = header.hdr64.e_phoff;
+ ef->shoff = header.hdr64.e_shoff;
+ ef->ehsize = header.hdr64.e_ehsize;
+ ef->phentsize = header.hdr64.e_phentsize;
+ ef->phnum = header.hdr64.e_phnum;
+ ef->shentsize = header.hdr64.e_shentsize;
+ ef->shnum = header.hdr64.e_shnum;
+ if (ef->ehsize != sizeof(header.hdr64)) {
+ return ELF_ERR_HEADER_SIZE;
+ }
+ }
+
+ return 0;
+}
+
+
+static struct elf_file *elf_new(struct uwx_env *env)
+{
+ int native_be;
+ char *p;
+ struct elf_file *ef;
+
+ ef = (struct elf_file *)(*env->allocate_cb)(sizeof(struct elf_file));
+ if (ef == NULL)
+ return NULL;
+
+ /* Determine the native byte order */
+ p = (char *)&native_be;
+ native_be = 1; /* Assume big-endian */
+ *p = 0; /* Sets be == 0 only if little-endian */
+
+ ef->allocate_cb = env->allocate_cb;
+ ef->free_cb = env->free_cb;
+ ef->filename = NULL;
+ ef->native_data = (native_be ? ELFDATA2MSB : ELFDATA2LSB);
+ ef->fd = NULL;
+ ef->source_class = 0;
+ ef->source_data = 0;
+ ef->phoff = 0;
+ ef->shoff = 0;
+ ef->text_base = 0;
+ ef->text_end = 0;
+ ef->ehsize = 0;
+ ef->phentsize = 0;
+ ef->phnum = 0;
+ ef->shentsize = 0;
+ ef->shnum = 0;
+ ef->sections = NULL;
+ ef->symbols = NULL;
+ ef->symbol_strings = NULL;
+ ef->nsyms = 0;
+ return ef;
+}
+
+
+static int elf_open(struct elf_file *ef, const char *filename)
+{
+ int err;
+
+ ef->filename = filename;
+
+ ef->fd = fopen(filename, "r");
+ if (ef->fd == NULL)
+ return ELF_ERR_OPEN;
+
+ if ((err = elf_read_header(ef)) != 0)
+ return err;
+
+ if ((err = elf_read_sect_hdrs(ef)) != 0)
+ return err;
+
+ if ((err = elf_read_prog_hdrs(ef)) != 0)
+ return err;
+
+ return 0;
+}
+
+
+static void elf_free_sections(struct elf_file *ef)
+{
+ int i;
+ struct elf_section *sect;
+
+ for (i = 0; i < ef->shnum; i++) {
+ sect = &ef->sections[i];
+ if (sect->contents != NULL)
+ (*ef->free_cb)(sect->contents);
+ if ((sect->type == SHT_SYMTAB || sect->type == SHT_DYNSYM)
+ && sect->symbols != NULL)
+ (*ef->free_cb)(sect->symbols);
+ }
+ (*ef->free_cb)(ef->sections);
+}
+
+
+static void elf_close(struct elf_file *ef)
+{
+ if (ef->fd != NULL) {
+ fclose(ef->fd);
+ ef->fd = NULL;
+ }
+}
+
+
+static void elf_free(struct elf_file *ef)
+{
+ elf_close(ef);
+ if (ef->sections != NULL)
+ elf_free_sections(ef);
+ (*ef->free_cb)(ef);
+}
+
+
+static int elf_read_symbols(struct elf_file *ef)
+{
+ int i;
+ int err;
+ struct elf_section *sect;
+
+ for (i = 1; i < ef->shnum; i++) {
+ sect = &ef->sections[i];
+ if (sect->type == SHT_SYMTAB) {
+ if (elf_read_symtab_section(ef, i) == 0) {
+ ef->symbols = sect->symbols;
+ ef->nsyms = sect->nelems;
+#ifdef DEBUG_SYMBOLS
+ printf("Read %d symbols from SHT_SYMTAB section\n", ef->nsyms);
+#endif /* DEBUG_SYMBOLS */
+ return 0;
+ }
+ }
+ }
+ for (i = 1; i < ef->shnum; i++) {
+ sect = &ef->sections[i];
+ if (sect->type == SHT_DYNSYM) {
+ if (elf_read_symtab_section(ef, i) == 0) {
+ ef->symbols = sect->symbols;
+ ef->nsyms = sect->nelems;
+#ifdef DEBUG_SYMBOLS
+ printf("Read %d symbols from SHT_DYNSYM section\n", ef->nsyms);
+#endif /* DEBUG_SYMBOLS */
+ return 0;
+ }
+ }
+ }
+ return UWX_ERR_NOSYM;
+}
+
+
+#define SYM_IS_DEFINED(sym) \
+ ((sym)->shndx != SHN_UNDEF)
+
+#define SYM_IS_IN_TEXT_SEGMENT(value) \
+ ((value) >= ef->text_base && (value) < ef->text_end)
+
+#define SYM_HAS_INTERESTING_TYPE(type) ( \
+ (type) == STT_FUNC || \
+ (type) == STT_OBJECT || \
+ (type) == STT_HP_STUB \
+ )
+
+#define SYM_IS_INTERESTING(sym) ( \
+ SYM_IS_DEFINED(sym) && \
+ SYM_IS_IN_TEXT_SEGMENT((sym)->value) && \
+ SYM_HAS_INTERESTING_TYPE((sym)->type) \
+ )
+
+int uwx_read_func_symbols(
+ struct uwx_env *env,
+ struct uwx_symbol_cache *cache,
+ char *module_name)
+{
+ int i, j;
+ int status;
+ struct elf_file *ef;
+ struct elf_symbol *sym;
+ int nfuncsyms;
+ char **names;
+ uint64_t *values;
+
+ if (module_name != NULL &&
+ cache->module_name != NULL &&
+ strcmp(module_name, cache->module_name) == 0)
+ return UWX_OK;
+
+ if (cache->sym_names != NULL)
+ (*env->free_cb)(cache->sym_names);
+ if (cache->sym_values != NULL)
+ (*env->free_cb)(cache->sym_values);
+ if (cache->strings != NULL)
+ (*env->free_cb)(cache->strings);
+
+ ef = elf_new(env);
+ if (ef == NULL)
+ return UWX_ERR_NOMEM;
+ status = elf_open(ef, module_name);
+ if (status != 0)
+ return UWX_ERR_NOSYM;
+ status = elf_read_symbols(ef);
+ if (status != 0)
+ return UWX_ERR_NOSYM;
+
+ nfuncsyms = 0;
+ for (i = 0; i < ef->nsyms; i++) {
+ sym = &ef->symbols[i];
+ if (SYM_IS_INTERESTING(sym))
+ nfuncsyms++;
+ }
+
+ names = (char **)(*env->allocate_cb)(nfuncsyms * sizeof(char *));
+ if (names == NULL)
+ return UWX_ERR_NOMEM;
+ values = (uint64_t *)(*env->allocate_cb)(nfuncsyms * sizeof(uint64_t));
+ if (values == NULL)
+ return UWX_ERR_NOMEM;
+
+ j = 0;
+ for (i = 0; i < ef->nsyms; i++) {
+ sym = &ef->symbols[i];
+ if (SYM_IS_INTERESTING(sym)) {
+ if (j >= nfuncsyms) /* should not happen! */
+ break;
+ names[j] = sym->namep;
+ values[j] = sym->value - ef->text_base;
+ j++;
+ }
+ }
+
+ cache->module_name = (char *)(*env->allocate_cb)(strlen(module_name)+1);
+ if (cache->module_name != NULL) {
+ strcpy(cache->module_name, module_name);
+ cache->nsyms = nfuncsyms;
+ cache->sym_names = names;
+ cache->sym_values = values;
+ cache->strings = ef->symbol_strings;
+ ef->symbol_strings = NULL;
+ }
+
+ elf_close(ef);
+ elf_free(ef);
+
+#ifdef DEBUG_SYMBOLS
+ printf("Cached %d interesting symbols\n", nfuncsyms);
+#endif /* DEBUG_SYMBOLS */
+
+ return UWX_OK;
+}
diff --git a/sys/contrib/ia64/libuwx/src/uwx_symbols.h b/sys/contrib/ia64/libuwx/src/uwx_symbols.h
new file mode 100644
index 0000000..83b0bfe
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_symbols.h
@@ -0,0 +1,38 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+struct uwx_env;
+struct uwx_symbol_cache;
+
+extern int uwx_find_symbol(
+ struct uwx_env *env,
+ struct uwx_symbol_cache **symbol_cache_p,
+ char *module_name,
+ uint64_t relip,
+ char **func_name_p,
+ uint64_t *offset_p);
+
+extern void uwx_release_symbol_cache(
+ struct uwx_env *env,
+ struct uwx_symbol_cache *symbol_cache);
diff --git a/sys/contrib/ia64/libuwx/src/uwx_trace.c b/sys/contrib/ia64/libuwx/src/uwx_trace.c
new file mode 100644
index 0000000..0338dbe
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_trace.c
@@ -0,0 +1,166 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "uwx_env.h"
+#include "uwx_utable.h"
+#include "uwx_uinfo.h"
+#include "uwx_scoreboard.h"
+#include "uwx_trace.h"
+
+#ifdef UWX_TRACE_ENABLE
+
+void uwx_trace_init(struct uwx_env *env)
+{
+ char *tstr;
+
+ tstr = getenv("UWX_TRACE");
+ if (tstr != NULL) {
+ while (*tstr != '\0') {
+ switch (*tstr) {
+ case 'i': env->trace |= UWX_TRACE_UINFO; break;
+ case 't': env->trace |= UWX_TRACE_UTABLE; break;
+ case 'b': env->trace |= UWX_TRACE_SB; break;
+ case 'r': env->trace |= UWX_TRACE_RSTATE; break;
+ case 's': env->trace |= UWX_TRACE_STEP; break;
+ case 'c': env->trace |= UWX_TRACE_CONTEXT; break;
+ case 'C': env->trace |= UWX_TRACE_COPYIN; break;
+ case 'L': env->trace |= UWX_TRACE_LOOKUPIP; break;
+ case '?':
+#ifdef _KERNEL
+ fprintf(stderr, "UWX_TRACE flag `%c' unknown.\n", *tstr);
+#else
+ fprintf(stderr, "UWX_TRACE flags:\n");
+ fprintf(stderr, " i: unwind info\n");
+ fprintf(stderr, " t: unwind table searching\n");
+ fprintf(stderr, " b: scoreboard management\n");
+ fprintf(stderr, " r: register state vector\n");
+ fprintf(stderr, " s: step\n");
+ fprintf(stderr, " c: context\n");
+ fprintf(stderr, " C: copyin callback\n");
+ fprintf(stderr, " L: lookup ip callback\n");
+ exit(1);
+#endif
+ }
+ tstr++;
+ }
+ }
+}
+
+char *uwx_sb_rnames[] = {
+ "RP", "PSP", "PFS",
+ "PREDS", "UNAT", "PRIUNAT", "RNAT", "LC", "FPSR",
+ "GR4", "GR5", "GR6", "GR7",
+ "BR1", "BR2", "BR3", "BR4", "BR5",
+ "FR2", "FR3", "FR4", "FR5",
+ "FR16", "FR17", "FR18", "FR19",
+ "FR20", "FR21", "FR22", "FR23",
+ "FR24", "FR25", "FR26", "FR27",
+ "FR28", "FR29", "FR30", "FR31",
+};
+
+void uwx_dump_rstate(int regid, uint64_t rstate)
+{
+ int reg;
+
+ if (rstate == UWX_DISP_NONE)
+ return;
+ fprintf(stderr, " %-7s", uwx_sb_rnames[regid]);
+ switch (UWX_GET_DISP_CODE(rstate)) {
+ case UWX_DISP_NONE:
+ fprintf(stderr, " unchanged\n");
+ break;
+ case UWX_DISP_SPPLUS(0):
+ fprintf(stderr, " SP + %d\n", (int)rstate & ~0x07);
+ break;
+ case UWX_DISP_SPREL(0):
+ fprintf(stderr, " [SP + %d]\n", (int)rstate & ~0x07);
+ break;
+ case UWX_DISP_PSPREL(0):
+ fprintf(stderr, " [PSP + 16 - %d]\n", (int)rstate & ~0x07);
+ break;
+ case UWX_DISP_REG(0):
+ reg = UWX_GET_DISP_REGID(rstate);
+ if (reg == UWX_REG_AR_PFS)
+ fprintf(stderr, " AR.PFS\n");
+ else if (reg == UWX_REG_AR_UNAT)
+ fprintf(stderr, " AR.UNAT\n");
+ else if (reg >= UWX_REG_GR(0) && reg < UWX_REG_GR(128))
+ fprintf(stderr, " GR%d\n", reg - UWX_REG_GR(0));
+ else if (reg >= UWX_REG_FR(0) && reg < UWX_REG_FR(128))
+ fprintf(stderr, " FR%d\n", reg - UWX_REG_FR(0));
+ else if (reg >= UWX_REG_BR(0) && reg < UWX_REG_BR(8))
+ fprintf(stderr, " BR%d\n", reg - UWX_REG_BR(0));
+ else
+ fprintf(stderr, " <reg %d>\n", reg);
+ break;
+ default:
+ fprintf(stderr, " <%08lx>\n", (long)rstate);
+ break;
+ }
+}
+
+void uwx_dump_scoreboard(
+ struct uwx_scoreboard *scoreboard,
+ int nsbreg,
+ struct uwx_rhdr *rhdr,
+ int cur_slot,
+ int ip_slot)
+{
+ int i;
+
+ if (rhdr->is_prologue)
+ fprintf(stderr, " Prologue region (start = %d, length = %d)\n",
+ (int)cur_slot, (int)rhdr->rlen);
+ else
+ fprintf(stderr, " Body region (start = %d, length = %d, ecount = %d)\n",
+ cur_slot, (int)rhdr->rlen, rhdr->ecount);
+ if (ip_slot < rhdr->rlen)
+ fprintf(stderr, " IP is in this region (offset = %d)\n", ip_slot);
+ for (i = 0; i < nsbreg; i++)
+ uwx_dump_rstate(i, scoreboard->rstate[i]);
+}
+
+void uwx_dump_uinfo_block(
+ struct uwx_utable_entry *uentry,
+ unsigned int ulen)
+{
+ int i;
+ uint32_t *uinfo = (uint32_t *)(intptr_t)uentry->unwind_info;
+
+ ulen += DWORDSZ; /* Include unwind info header */
+ if (uentry->unwind_flags & UNWIND_TBL_32BIT) /* and personality routine */
+ ulen += WORDSZ;
+ else
+ ulen += DWORDSZ;
+ while (ulen >= WORDSZ) {
+ fprintf(stderr, " %08lx: ", (unsigned long)uinfo);
+ for (i = 0; i < 4 * WORDSZ && ulen >= WORDSZ; i += WORDSZ) {
+ fprintf(stderr, " %04x", *uinfo++);
+ ulen -= WORDSZ;
+ }
+ fprintf(stderr, "\n");
+ }
+}
+
+#endif /* UWX_TRACE_ENABLE */
diff --git a/sys/contrib/ia64/libuwx/src/uwx_trace.h b/sys/contrib/ia64/libuwx/src/uwx_trace.h
new file mode 100644
index 0000000..9202a38
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_trace.h
@@ -0,0 +1,370 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#define UWX_TRACE_SB 1 /* UWX_TRACE=b: scoreboard mgmt */
+#define UWX_TRACE_UINFO 2 /* UWX_TRACE=i: unwind info */
+#define UWX_TRACE_RSTATE 4 /* UWX_TRACE=r: reg state vector */
+#define UWX_TRACE_STEP 8 /* UWX_TRACE=s: step */
+#define UWX_TRACE_UTABLE 16 /* UWX_TRACE=t: unwind tbl search */
+#define UWX_TRACE_CONTEXT 32 /* UWX_TRACE=c: context */
+#define UWX_TRACE_COPYIN 64 /* UWX_TRACE=C: copyin callback */
+#define UWX_TRACE_LOOKUPIP 128 /* UWX_TRACE=L: lookupip callback */
+
+#ifdef UWX_TRACE_ENABLE
+
+#ifdef _KERNEL
+#define fprintf(f, ...) printf(__VA_ARGS__)
+#endif
+
+extern void uwx_trace_init(struct uwx_env *env);
+
+struct uwx_utable_entry;
+
+extern void uwx_dump_uinfo_block(struct uwx_utable_entry *, unsigned int);
+
+extern void uwx_dump_rstate(int regid, uint64_t rstate);
+
+struct uwx_rhdr;
+
+extern void uwx_dump_scoreboard(
+ struct uwx_scoreboard *scoreboard,
+ int nsbreg,
+ struct uwx_rhdr *rhdr,
+ int cur_slot,
+ int ip_slot);
+
+#define TRACE_INIT uwx_trace_init(env);
+
+#define TRACE_B_REUSE(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_alloc_scoreboard: reuse id %d\n", (id));
+
+#define TRACE_B_PREALLOC(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_prealloc_scoreboard: prealloc id %d\n", (id));
+
+#define TRACE_B_ALLOC(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_alloc_scoreboard: alloc id %d\n", (id));
+
+#define TRACE_B_POP(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_pop_scoreboards: free id %d\n", (id));
+
+#define TRACE_B_LABEL(label) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_label_scoreboard: label %d\n", (label));
+
+#define TRACE_B_LABEL_COPY(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_label_scoreboard: copy id %d\n", (id));
+
+#define TRACE_B_LABEL_REVERSE(back, new) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_label_scoreboard: reverse link %d -> %d\n", \
+ (new)->id, ((back) == 0) ? -1 : (back)->id);
+
+#define TRACE_B_COPY(label, id) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_copy_scoreboard: label %d, cur sb id %d\n", (label), (id));
+
+#define TRACE_B_COPY_FREE(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_copy_scoreboard: free id %d\n", (id));
+
+#define TRACE_B_COPY_FOUND(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_copy_scoreboard: found id %d\n", (id));
+
+#define TRACE_B_COPY_COPY(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_copy_scoreboard: copy id %d\n", (id));
+
+#define TRACE_B_COPY_REVERSE(back, new) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_copy_scoreboard: reverse link %d -> %d\n", \
+ (new)->id, ((back) == 0) ? -1 : (back)->id);
+
+#define TRACE_B_FREE(id) \
+ if (env->trace & UWX_TRACE_SB) \
+ fprintf(stderr, "uwx_free_scoreboards: free id %d\n", (id));
+
+#define TRACE_I_DECODE_RHDR_1(name, b0) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_rhdr: %02x %s\n", \
+ (b0), (name));
+
+#define TRACE_I_DECODE_RHDR_1L(name, b0, val) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_rhdr: %02x %08x %s\n", \
+ (b0), (int)(val), (name));
+
+#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_rhdr: %02x %02x %08x %s\n", \
+ (b0), (b1), (int)(val), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_1(name, b0) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_prologue: %02x %s\n", \
+ (b0), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_prologue: %02x %08x %s\n", \
+ (b0), (int)(val), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_prologue: %02x %08x %08x %s\n", \
+ (b0), (int)(val1), (int)(val2), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_prologue: %02x %02x %s\n", \
+ (b0), (b1), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, val) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_prologue: %02x %02x %08x %s\n", \
+ (b0), (b1), (int)(val), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_prologue: %02x %02x %02x %s\n", \
+ (b0), (b1), (b2), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_prologue: %02x %02x %02x %02x %s\n", \
+ (b0), (b1), (b2), (b3), (name));
+
+#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_prologue: spill base = %08x\n", (int)(spill_base));
+
+#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_prologue: gr_mem_mask = %02x; gr_gr_mask = %02x\n", \
+ (gr_mem_mask), (gr_gr_mask));
+
+#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_prologue: ngr = %d\n", (ngr));
+
+#define TRACE_I_DECODE_BODY_1(name, b0) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_body: %02x %s\n", \
+ (b0), (name));
+
+#define TRACE_I_DECODE_BODY_1L(name, b0, val) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_body: %02x %08x %s\n", \
+ (b0), (int)(val), (name));
+
+#define TRACE_I_DECODE_BODY_1LL(name, b0, val1, val2) \
+ if (env->trace & UWX_TRACE_UINFO) \
+ fprintf(stderr, "uwx_decode_body: %02x %08x %08x %s\n", \
+ (b0), (int)(val1), (int)(val2), (name));
+
+#define TRACE_R_UIB(uentry, ulen) \
+ if (env->trace & UWX_TRACE_RSTATE) { \
+ fprintf(stderr, "Unwind info block (info = %08x %08x, flags = %08x %08x, ulen = %d)\n", \
+ (unsigned int)((uentry)->unwind_info >> 32), \
+ (unsigned int)(uentry)->unwind_info, \
+ (unsigned int)((uentry)->unwind_flags >> 32), \
+ (unsigned int)(uentry)->unwind_flags, \
+ (ulen)); \
+ if (!env->remote) uwx_dump_uinfo_block(uentry, ulen); \
+ }
+
+#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot) \
+ if (env->trace & UWX_TRACE_RSTATE) \
+ uwx_dump_scoreboard(scoreboard, env->nsbreg, \
+ &(rhdr), cur_slot, ip_slot);
+
+#define TRACE_S_STEP(rstate) \
+ if (env->trace & UWX_TRACE_STEP) { \
+ fprintf(stderr, "uwx_restore_markers:\n"); \
+ uwx_dump_rstate(SBREG_RP, (rstate)[SBREG_RP]); \
+ uwx_dump_rstate(SBREG_PSP, (rstate)[SBREG_PSP]); \
+ uwx_dump_rstate(SBREG_PFS, (rstate)[SBREG_PFS]); \
+ }
+
+#define TRACE_S_RESTORE_REG(regname, rstate, val) \
+ if (env->trace & UWX_TRACE_STEP) \
+ fprintf(stderr, " restore %-7s (rstate = %08x %08x) = %08x %08x\n", \
+ regname, \
+ (unsigned int) ((rstate) >> 32), \
+ (unsigned int) (rstate), \
+ (unsigned int) ((val) >> 32), \
+ (unsigned int) (val));
+
+#define TRACE_S_RESTORE_GR(regid, rstate, val) \
+ if (env->trace & UWX_TRACE_STEP) \
+ fprintf(stderr, " restore GR%d (rstate = %08x %08x) = %08x %08x\n", \
+ (regid) + 4, \
+ (unsigned int) ((rstate) >> 32), \
+ (unsigned int) (rstate), \
+ (unsigned int) ((val) >> 32), \
+ (unsigned int) (val));
+
+#define TRACE_S_RESTORE_BR(regid, rstate, val) \
+ if (env->trace & UWX_TRACE_STEP) \
+ fprintf(stderr, " restore BR%d (rstate = %08x %08x) = %08x %08x\n", \
+ (regid) + 1, \
+ (unsigned int) ((rstate) >> 32), \
+ (unsigned int) (rstate), \
+ (unsigned int) ((val) >> 32), \
+ (unsigned int) (val));
+
+#define TRACE_S_RESTORE_FR(regid, rstate, fval) \
+ if (env->trace & UWX_TRACE_STEP) \
+ fprintf(stderr, " restore FR%d (rstate = %08x %08x) = %08x %08x %08x %08x\n", \
+ (regid) + 1, \
+ (unsigned int) ((rstate) >> 32), \
+ (unsigned int) (rstate), \
+ (unsigned int) ((fval[0]) >> 32), \
+ (unsigned int) (fval[0]), \
+ (unsigned int) ((fval[1]) >> 32), \
+ (unsigned int) (fval[1]));
+
+#define TRACE_T_SEARCH32(ip) \
+ if (env->trace & UWX_TRACE_UTABLE) \
+ fprintf(stderr, "uwx_search_utable32 (relative ip = %08x)\n", (ip));
+
+#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end) \
+ if (env->trace & UWX_TRACE_UTABLE) \
+ fprintf(stderr, " lb/ub = %d/%d, mid = %d, start/end = %08x %08x\n", \
+ lb, ub, mid, code_start, code_end);
+
+#define TRACE_C_GET_REG(regid, bsp) \
+ if (env->trace & UWX_TRACE_CONTEXT) \
+ fprintf(stderr, "uwx_get_reg (gr%d, bsp = %08x %08x)\n", \
+ (regid) - UWX_REG_GR(0), \
+ (unsigned int) ((bsp) >> 32), \
+ (unsigned int) (bsp));
+
+#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid) \
+ if (env->trace & UWX_TRACE_CONTEXT) \
+ fprintf(stderr, "uwx_get_reg (gr%d, sor = %d, rrb = %d) --> gr%d\n", \
+ (regid) + 32, \
+ (sor), \
+ (rrb_gr), \
+ (newregid) + 32);
+
+#define TRACE_SELF_COPYIN4(rem, len, wp) \
+ if (info->trace & UWX_TRACE_COPYIN) \
+ fprintf(stderr, "copyin (rem = %08x %08x, len = %d, val = %08x)\n", \
+ (unsigned int) ((rem) >> 32), \
+ (unsigned int) (rem), \
+ (len), *(wp));
+
+#define TRACE_SELF_COPYIN8(rem, len, dp) \
+ if (info->trace & UWX_TRACE_COPYIN) \
+ fprintf(stderr, "copyin (rem = %08x %08x, len = %d, val = %08x %08x)\n", \
+ (unsigned int) ((rem) >> 32), \
+ (unsigned int) (rem), \
+ (len), \
+ ((unsigned int *)(dp))[0], \
+ ((unsigned int *)(dp))[1]);
+
+#define TRACE_SELF_LOOKUP(ip) \
+ if (info->trace & UWX_TRACE_LOOKUPIP) \
+ fprintf(stderr, "Lookup IP callback: ip = %08x %08x\n", \
+ (unsigned int) ((ip) >> 32), \
+ (unsigned int) (ip));
+
+#define TRACE_SELF_LOOKUP_DESC(text_base, linkage_ptr, unwind_base) \
+ if (info->trace & UWX_TRACE_LOOKUPIP) { \
+ fprintf(stderr, " text base: %08x %08x\n", \
+ (unsigned int) ((text_base) >> 32), \
+ (unsigned int) (text_base)); \
+ fprintf(stderr, " linkage ptr: %08x %08x\n", \
+ (unsigned int) ((linkage_ptr) >> 32), \
+ (unsigned int) (linkage_ptr)); \
+ fprintf(stderr, " unwind base: %08x %08x\n", \
+ (unsigned int) ((uint64_t)(unwind_base) >> 32), \
+ (unsigned int) (unwind_base)); \
+ fprintf(stderr, " unwind flags: %08x %08x\n", \
+ (unsigned int) ((unwind_base)[0] >> 32), \
+ (unsigned int) (unwind_base)[0]); \
+ fprintf(stderr, " unwind start: %08x %08x\n", \
+ (unsigned int) (((text_base)+(unwind_base)[1]) >> 32), \
+ (unsigned int) ((text_base)+(unwind_base)[1])); \
+ fprintf(stderr, " unwind end: %08x %08x\n", \
+ (unsigned int) (((text_base)+(unwind_base)[2]) >> 32), \
+ (unsigned int) ((text_base)+(unwind_base)[2])); \
+ }
+
+#else /* !UWX_TRACE_ENABLE */
+
+#define TRACE_INIT
+#define TRACE_B_REUSE(id)
+#define TRACE_B_PREALLOC(id)
+#define TRACE_B_ALLOC(id)
+#define TRACE_B_POP(id)
+#define TRACE_B_LABEL(label)
+#define TRACE_B_LABEL_COPY(id)
+#define TRACE_B_LABEL_REVERSE(back, new)
+#define TRACE_B_COPY(label, id)
+#define TRACE_B_COPY_FREE(id)
+#define TRACE_B_COPY_FOUND(id)
+#define TRACE_B_COPY_COPY(id)
+#define TRACE_B_COPY_REVERSE(back, new)
+#define TRACE_B_FREE(id)
+#define TRACE_I_DECODE_RHDR_1(name, b0)
+#define TRACE_I_DECODE_RHDR_1L(name, b0, val)
+#define TRACE_I_DECODE_RHDR_2L(name, b0, b1, val)
+#define TRACE_I_DECODE_PROLOGUE_1(name, b0)
+#define TRACE_I_DECODE_PROLOGUE_1L(name, b0, val)
+#define TRACE_I_DECODE_PROLOGUE_1LL(name, b0, val1, val2)
+#define TRACE_I_DECODE_PROLOGUE_2(name, b0, b1)
+#define TRACE_I_DECODE_PROLOGUE_2L(name, b0, b1, parm1)
+#define TRACE_I_DECODE_PROLOGUE_3(name, b0, b1, b2)
+#define TRACE_I_DECODE_PROLOGUE_4(name, b0, b1, b2, b3)
+#define TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base)
+#define TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask)
+#define TRACE_I_DECODE_PROLOGUE_NSPILL(ngr)
+#define TRACE_I_DECODE_BODY_1(name, b0)
+#define TRACE_I_DECODE_BODY_1L(name, b0, parm1)
+#define TRACE_I_DECODE_BODY_1LL(name, b0, parm1, parm2)
+#define TRACE_R_UIB(uentry, ulen)
+#define TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot)
+#define TRACE_S_STEP(rstate)
+#define TRACE_S_RESTORE_REG(regname, rstate, val)
+#define TRACE_S_RESTORE_GR(regid, rstate, val)
+#define TRACE_S_RESTORE_BR(regid, rstate, val)
+#define TRACE_S_RESTORE_FR(regid, rstate, val)
+#define TRACE_T_SEARCH32(ip)
+#define TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end)
+#define TRACE_C_GET_REG(regid, bsp)
+#define TRACE_C_ROTATE_GR(regid, sor, rrb_gr, newregid)
+#define TRACE_SELF_COPYIN4(rem, len, wp)
+#define TRACE_SELF_COPYIN8(rem, len, dp)
+#define TRACE_SELF_LOOKUP(ip)
+#define TRACE_SELF_LOOKUP_DESC(text_base, linkage_ptr, unwind_base)
+
+#endif /* UWX_TRACE_ENABLE */
+
diff --git a/sys/contrib/ia64/libuwx/src/uwx_uinfo.c b/sys/contrib/ia64/libuwx/src/uwx_uinfo.c
new file mode 100644
index 0000000..5f63b7e
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_uinfo.c
@@ -0,0 +1,1119 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "uwx_env.h"
+#include "uwx_uinfo.h"
+#include "uwx_utable.h"
+#include "uwx_scoreboard.h"
+#include "uwx_bstream.h"
+#include "uwx_trace.h"
+#include "uwx_swap.h"
+
+int uwx_count_ones(unsigned int mask);
+
+/*
+ * uwx_uinfo.c
+ *
+ * This file contains the routines for reading and decoding
+ * the unwind information block.
+ *
+ * The main entry point, uwx_decode_uinfo(), is given a pointer
+ * to an unwind table entry and a pointer (passed by reference)
+ * to be filled in with a pointer to an update vector. It will
+ * read and decode the unwind descriptors contained in the
+ * unwind information block, then build the register state array,
+ * which describes the actions necessary to step from the current
+ * frame to the previous one.
+ */
+
+#define COPYIN_UINFO_4(dest, src) \
+ (env->remote? \
+ (*env->copyin)(UWX_COPYIN_UINFO, (dest), (src), \
+ WORDSZ, env->cb_token) : \
+ (*(uint32_t *)(intptr_t)(dest) = *(uint32_t *)(intptr_t)(src), WORDSZ) )
+
+#define COPYIN_UINFO_8(dest, src) \
+ (env->remote? \
+ (*env->copyin)(UWX_COPYIN_UINFO, (dest), (src), \
+ DWORDSZ, env->cb_token) : \
+ (*(uint64_t *)(intptr_t)(dest) = *(uint64_t *)(intptr_t)(src), DWORDSZ) )
+
+
+/* uwx_default_rstate: Returns the default register state for a leaf routine */
+
+int uwx_default_rstate(struct uwx_env *env, uint64_t **rstatep)
+{
+ struct uwx_scoreboard *sb;
+
+ sb = uwx_init_scoreboards(env);
+ *rstatep = sb->rstate;
+ return UWX_OK;
+}
+
+
+/* uwx_decode_uinfo: Decodes unwind info region */
+
+int uwx_decode_uinfo(
+ struct uwx_env *env,
+ struct uwx_utable_entry *uentry,
+ uint64_t **rstatep)
+{
+ uint64_t uinfohdr;
+ unsigned int ulen;
+ int len;
+ struct uwx_bstream bstream;
+ struct uwx_scoreboard *scoreboard;
+ int ip_slot;
+ int cur_slot;
+ int status;
+ struct uwx_rhdr rhdr;
+
+ /* Remember the offset from the start of the function */
+ /* to the current IP. This helps the client find */
+ /* the symbolic information. */
+
+ env->function_offset = env->remapped_ip - uentry->code_start;
+
+ /* Read the unwind info header using the copyin callback. */
+ /* (If we're reading a 32-bit unwind table, we need to */
+ /* read the header as two 32-bit pieces to preserve the */
+ /* guarantee that we always call copyin for aligned */
+ /* 4-byte or 8-byte chunks.) */
+ /* Then compute the length of the unwind descriptor */
+ /* region and initialize a byte stream to read it. */
+
+ if (uentry->unwind_flags & UNWIND_TBL_32BIT) {
+ len = COPYIN_UINFO_4((char *)&uinfohdr, uentry->unwind_info);
+ len += COPYIN_UINFO_4((char *)&uinfohdr + WORDSZ,
+ uentry->unwind_info + WORDSZ);
+ }
+ else
+ len = COPYIN_UINFO_8((char *)&uinfohdr, uentry->unwind_info);
+ if (len != DWORDSZ)
+ return UWX_ERR_COPYIN_UINFO;
+ if (env->byte_swap)
+ uwx_swap8(&uinfohdr);
+ if (uentry->unwind_flags & UNWIND_TBL_32BIT)
+ ulen = UNW_LENGTH(uinfohdr) * WORDSZ;
+ else
+ ulen = UNW_LENGTH(uinfohdr) * DWORDSZ;
+ uwx_init_bstream(&bstream, env,
+ uentry->unwind_info + DWORDSZ, ulen, UWX_COPYIN_UINFO);
+
+ /* Save the header and a pointer to the personality routine ptr */
+ /* for later use in exception handling. */
+
+ env->uinfo_hdr = uinfohdr;
+ env->uinfo_end = uentry->unwind_info + DWORDSZ + ulen;
+
+ TRACE_R_UIB(uentry, ulen)
+
+ /* Create an initial scoreboard for tracking the unwind state. */
+
+ scoreboard = uwx_init_scoreboards(env);
+
+ /* Prepare to read and decode the unwind regions described */
+ /* by the unwind info block. Find the target "ip" slot */
+ /* relative to the beginning of the region. The lower 4 bits */
+ /* of the actual IP encode the slot number within a bundle. */
+
+ cur_slot = 0;
+ ip_slot = (int) ((env->context.special[UWX_REG_IP] & ~0x0fLL)
+ - uentry->code_start)
+ / BUNDLESZ * SLOTSPERBUNDLE
+ + (unsigned int) (env->context.special[UWX_REG_IP] & 0x0f);
+
+ /* Loop over the regions in the unwind info block. */
+
+ for (;;) {
+
+ /* Decode the next region header. */
+ /* We have an error if we reach the end of the info block, */
+ /* since we should have found our target ip slot by then. */
+ /* We also have an error if the next byte isn't a region */
+ /* header record. */
+
+ status = uwx_decode_rhdr(env, &bstream, &rhdr);
+ if (status != UWX_OK)
+ return status;
+
+ /* If a prologue region, get a new scoreboard, pushing */
+ /* the previous one onto the prologue stack. Then read */
+ /* and decode the prologue region records. */
+
+ if (rhdr.is_prologue) {
+ scoreboard = uwx_new_scoreboard(env, scoreboard);
+ if (scoreboard == 0)
+ return UWX_ERR_NOMEM;
+ status = uwx_decode_prologue(env, &bstream,
+ scoreboard, &rhdr, ip_slot);
+ }
+
+ /* If a body region, read and decode the body region */
+ /* records. If the body has an epilogue count, */
+ /* uwx_decode_body will note that in the region header */
+ /* record for use at the bottom of the loop. */
+
+ else {
+ status = uwx_decode_body(env, &bstream, scoreboard, &rhdr, ip_slot);
+ }
+
+ if (status != UWX_OK)
+ return status;
+
+ TRACE_R_DUMP_SB(scoreboard, rhdr, cur_slot, ip_slot)
+
+ /* If the target ip slot is within this region, we're done. */
+ /* Return the scoreboard's register state array. */
+
+ if (ip_slot < rhdr.rlen) {
+ *rstatep = scoreboard->rstate;
+ return UWX_OK;
+ }
+
+ /* Otherwise, update the current ip slot, pop the */
+ /* scoreboard stack based on the epilogue count, */
+ /* and loop back around for the next region. */
+
+ cur_slot += rhdr.rlen;
+ ip_slot -= rhdr.rlen;
+ if (rhdr.ecount > 0) {
+ scoreboard = uwx_pop_scoreboards(env, scoreboard, rhdr.ecount);
+ if (scoreboard == 0)
+ return UWX_ERR_PROLOG_UF;
+ }
+ }
+ /*NOTREACHED*/
+}
+
+
+/* uwx_decode_rhdr: Decodes a region header record */
+
+int uwx_decode_rhdr(
+ struct uwx_env *env,
+ struct uwx_bstream *bstream,
+ struct uwx_rhdr *rhdr)
+{
+ int b0;
+ int b1;
+ uint64_t val;
+ int status;
+
+ /* Get the first byte of the next descriptor record. */
+ b0 = uwx_get_byte(bstream);
+ if (b0 < 0)
+ return UWX_ERR_NOUDESC;
+
+ /* Initialize region header record. */
+
+ rhdr->is_prologue = 0;
+ rhdr->rlen = 0;
+ rhdr->mask = 0;
+ rhdr->grsave = 0;
+ rhdr->ecount = 0;
+
+ /* Format R1 */
+
+ if (b0 < 0x40) {
+ if ((b0 & 0x20) == 0) {
+ TRACE_I_DECODE_RHDR_1("(R1) prologue", b0)
+ rhdr->is_prologue = 1;
+ }
+ else {
+ TRACE_I_DECODE_RHDR_1("(R1) body", b0)
+ }
+ rhdr->rlen = b0 & 0x1f;
+ }
+
+ /* Format R2 */
+
+ else if (b0 < 0x60) {
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ status = uwx_get_uleb128(bstream, &val);
+ if (status != 0)
+ return UWX_ERR_BADUDESC;
+ TRACE_I_DECODE_RHDR_2L("(R2) prologue_gr", b0, b1, val)
+ rhdr->is_prologue = 1;
+ rhdr->rlen = (unsigned int) val;
+ rhdr->mask = ((b0 & 0x07) << 1) | (b1 >> 7);
+ rhdr->grsave = b1 & 0x7f;
+ }
+
+ /* Format R3 */
+
+ else if (b0 < 0x80) {
+ status = uwx_get_uleb128(bstream, &val);
+ if (status != 0)
+ return UWX_ERR_BADUDESC;
+ if ((b0 & 0x03) == 0) {
+ TRACE_I_DECODE_RHDR_1L("(R3) prologue", b0, val)
+ rhdr->is_prologue = 1;
+ }
+ else {
+ TRACE_I_DECODE_RHDR_1L("(R3) body", b0, val)
+ }
+ rhdr->rlen = (unsigned int) val;
+ }
+
+ /* Otherwise, not a region header record. */
+
+ else {
+ TRACE_I_DECODE_RHDR_1("(?)", b0)
+ return UWX_ERR_BADUDESC;
+ }
+
+ return UWX_OK;
+}
+
+
+/* uwx_decode_prologue: Decodes a prologue region */
+
+int uwx_decode_prologue(
+ struct uwx_env *env,
+ struct uwx_bstream *bstream,
+ struct uwx_scoreboard *scoreboard,
+ struct uwx_rhdr *rhdr,
+ int ip_slot)
+{
+ int status;
+ int reg;
+ int mask;
+ int b0;
+ int b1;
+ int b2;
+ int b3;
+ int r;
+ int t;
+ int i;
+ uint64_t parm1;
+ uint64_t parm2;
+ uint64_t newrstate[NSBREG];
+ int tspill[NSBREG];
+ int priunat_mem_rstate;
+ int t_priunat_mem;
+ unsigned int gr_mem_mask;
+ unsigned int br_mem_mask;
+ unsigned int fr_mem_mask;
+ unsigned int gr_gr_mask;
+ unsigned int br_gr_mask;
+ int ngr;
+ int nbr;
+ int nfr;
+ unsigned int spill_base;
+ unsigned int gr_base;
+ unsigned int br_base;
+ unsigned int fr_base;
+
+ /* Initialize an array of register states from the current */
+ /* scoreboard, along with a parallel array of spill times. */
+ /* We use this as a temporary scoreboard, then update the */
+ /* real scoreboard at the end of the procedure. */
+ /* We initialize the spill time to (rhdr.rlen - 1) so that */
+ /* spills without a "when" descriptor will take effect */
+ /* at the end of the prologue region. */
+ /* (Boundary condition: all actions in a zero-length prologue */
+ /* will appear to have happened in the instruction slot */
+ /* immediately preceding the prologue.) */
+
+ for (i = 0; i < env->nsbreg; i++) {
+ newrstate[i] = scoreboard->rstate[i];
+ tspill[i] = rhdr->rlen - 1;
+ }
+ priunat_mem_rstate = UWX_DISP_NONE;
+ t_priunat_mem = rhdr->rlen - 1;
+
+ fr_mem_mask = 0;
+ gr_mem_mask = 0;
+ br_mem_mask = 0;
+ gr_gr_mask = 0;
+ br_gr_mask = 0;
+ nfr = 127;
+ ngr = 127;
+ nbr = 127;
+ spill_base = 0;
+
+ /* If prologue_gr header record supplied mask and grsave, */
+ /* record these in the scoreboard. */
+
+ reg = rhdr->grsave;
+ mask = rhdr->mask;
+ if (mask & 0x8) {
+ newrstate[SBREG_RP] = UWX_DISP_REG(UWX_REG_GR(reg));
+ reg++;
+ }
+ if (mask & 0x4) {
+ newrstate[SBREG_PFS] = UWX_DISP_REG(UWX_REG_GR(reg));
+ reg++;
+ }
+ if (mask & 0x2) {
+ newrstate[SBREG_PSP] = UWX_DISP_REG(UWX_REG_GR(reg));
+ reg++;
+ }
+ if (mask & 0x1) {
+ newrstate[SBREG_PREDS] = UWX_DISP_REG(UWX_REG_GR(reg));
+ reg++;
+ }
+
+ /* Read prologue descriptor records until */
+ /* we hit another region header. */
+
+ for (;;) {
+
+ b0 = uwx_get_byte(bstream);
+
+ if (b0 < 0x80) {
+ /* Return the last byte read to the byte stream, since it's */
+ /* really the first byte of the next region header record. */
+ if (b0 >= 0)
+ (void) uwx_unget_byte(bstream, b0);
+ break;
+ }
+
+ switch ((b0 & 0x70) >> 4) {
+
+ case 0: /* 1000 xxxx */
+ case 1: /* 1001 xxxx */
+ /* Format P1 (br_mem) */
+ TRACE_I_DECODE_PROLOGUE_1("(P1) br_mem", b0)
+ br_mem_mask = b0 & 0x1f;
+ break;
+
+ case 2: /* 1010 xxxx */
+ /* Format P2 (br_gr) */
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ TRACE_I_DECODE_PROLOGUE_2("(P2) br_gr", b0, b1)
+ mask = ((b0 & 0x0f) << 1) | (b1 >> 7);
+ reg = b1 & 0x7f;
+ br_gr_mask = mask;
+ for (i = 0; i < NSB_BR && mask != 0; i++) {
+ if (mask & 0x01) {
+ newrstate[SBREG_BR + i] = UWX_DISP_REG(UWX_REG_GR(reg));
+ reg++;
+ }
+ mask = mask >> 1;
+ }
+ break;
+
+ case 3: /* 1011 xxxx */
+ /* Format P3 */
+ if (b0 < 0xb8) {
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ r = ((b0 & 0x7) << 1) | (b1 >> 7);
+ reg = b1 & 0x7f;
+ switch (r) {
+ case 0: /* psp_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) psp_gr", b0, b1)
+ newrstate[SBREG_PSP] = UWX_DISP_REG(UWX_REG_GR(reg));
+ break;
+ case 1: /* rp_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) rp_gr", b0, b1)
+ newrstate[SBREG_RP] = UWX_DISP_REG(UWX_REG_GR(reg));
+ break;
+ case 2: /* pfs_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) pfs_gr", b0, b1)
+ newrstate[SBREG_PFS] = UWX_DISP_REG(UWX_REG_GR(reg));
+ break;
+ case 3: /* preds_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) preds_gr", b0, b1)
+ newrstate[SBREG_PREDS] =
+ UWX_DISP_REG(UWX_REG_GR(reg));
+ break;
+ case 4: /* unat_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) unat_gr", b0, b1)
+ newrstate[SBREG_UNAT] =
+ UWX_DISP_REG(UWX_REG_GR(reg));
+ break;
+ case 5: /* lc_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) lc_gr", b0, b1)
+ newrstate[SBREG_LC] =
+ UWX_DISP_REG(UWX_REG_GR(reg));
+ break;
+ case 6: /* rp_br */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) rp_br", b0, b1)
+ scoreboard->rstate[SBREG_RP] =
+ UWX_DISP_REG(UWX_REG_BR(reg));
+ if (newrstate[SBREG_RP] ==
+ UWX_DISP_REG(UWX_REG_BR(0)))
+ newrstate[SBREG_RP] =
+ UWX_DISP_REG(UWX_REG_BR(reg));
+ break;
+ case 7: /* rnat_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) rnat_gr", b0, b1)
+ newrstate[SBREG_RNAT] =
+ UWX_DISP_REG(UWX_REG_GR(reg));
+ break;
+ case 8: /* bsp_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) bsp_gr", b0, b1)
+ /* Don't track BSP yet */
+ return UWX_ERR_CANTUNWIND;
+ /* break; */
+ case 9: /* bspstore_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) bspstore_gr", b0, b1)
+ /* Don't track BSPSTORE yet */
+ return UWX_ERR_CANTUNWIND;
+ /* break; */
+ case 10: /* fpsr_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) fpsr_gr", b0, b1)
+ newrstate[SBREG_FPSR] =
+ UWX_DISP_REG(UWX_REG_GR(reg));
+ break;
+ case 11: /* priunat_gr */
+ TRACE_I_DECODE_PROLOGUE_2("(P3) priunat_gr", b0, b1)
+ newrstate[SBREG_PRIUNAT] =
+ UWX_DISP_REG(UWX_REG_GR(reg));
+ break;
+ default:
+ TRACE_I_DECODE_PROLOGUE_2("(P3) ??", b0, b1)
+ return UWX_ERR_BADUDESC;
+ }
+ }
+
+ /* Format P4 (spill_mask) */
+ else if (b0 == 0xb8) {
+ TRACE_I_DECODE_PROLOGUE_1("(P4) spill_mask", b0)
+ /* The spill_mask descriptor is followed by */
+ /* an imask field whose length is determined */
+ /* by the region length: there are two mask */
+ /* bits per instruction slot in the region. */
+ /* We decode these bits two at a time, counting */
+ /* the number of FRs, GRs, and BRs that are */
+ /* saved up to the slot of interest. Other */
+ /* descriptors describe which sets of these */
+ /* registers are spilled, and we put those */
+ /* two pieces of information together at the */
+ /* end of the main loop. */
+ t = 0;
+ nfr = 0;
+ ngr = 0;
+ nbr = 0;
+ while (t < rhdr->rlen) {
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ for (i = 0; i < 4 && (t + i) < ip_slot; i++) {
+ switch (b1 & 0xc0) {
+ case 0x00: break;
+ case 0x40: nfr++; break;
+ case 0x80: ngr++; break;
+ case 0xc0: nbr++; break;
+ }
+ b1 = b1 << 2;
+ }
+ t += 4;
+ }
+ }
+
+ /* Format P5 (frgr_mem) */
+ else if (b0 == 0xb9) {
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ b2 = uwx_get_byte(bstream);
+ if (b2 < 0)
+ return UWX_ERR_BADUDESC;
+ b3 = uwx_get_byte(bstream);
+ if (b3 < 0)
+ return UWX_ERR_BADUDESC;
+ TRACE_I_DECODE_PROLOGUE_4("(P5) frgr_mem", b0, b1, b2, b3)
+ gr_mem_mask = b1 >> 4;
+ fr_mem_mask = ((b1 & 0x0f) << 16) | (b2 << 8) | b3;
+ }
+
+ /* Invalid descriptor record */
+ else {
+ TRACE_I_DECODE_PROLOGUE_1("(?)", b0)
+ return UWX_ERR_BADUDESC;
+ }
+
+ break;
+
+ case 4: /* 1100 xxxx */
+ /* Format P6 (fr_mem) */
+ TRACE_I_DECODE_PROLOGUE_1("(P6) fr_mem", b0)
+ fr_mem_mask = b0 & 0x0f;
+ break;
+
+ case 5: /* 1101 xxxx */
+ /* Format P6 (gr_mem) */
+ TRACE_I_DECODE_PROLOGUE_1("(P6) gr_mem", b0)
+ gr_mem_mask = b0 & 0x0f;
+ break;
+
+ case 6: /* 1110 xxxx */
+ /* Format P7 */
+ r = b0 & 0xf;
+ status = uwx_get_uleb128(bstream, &parm1);
+ if (status != 0)
+ return UWX_ERR_BADUDESC;
+ switch (r) {
+ case 0: /* mem_stack_f */
+ status = uwx_get_uleb128(bstream, &parm2);
+ if (status != 0)
+ return UWX_ERR_BADUDESC;
+ TRACE_I_DECODE_PROLOGUE_1LL("(P7) mem_stack_f", b0, parm1, parm2)
+ newrstate[SBREG_PSP] = UWX_DISP_SPPLUS(parm2 * 16);
+ tspill[SBREG_PSP] = (int) parm1;
+ break;
+ case 1: /* mem_stack_v */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) mem_stack_v", b0, parm1)
+ tspill[SBREG_PSP] = (int) parm1;
+ break;
+ case 2: /* spill_base */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) spill_base", b0, parm1)
+ spill_base = 4 * (unsigned int) parm1;
+ break;
+ case 3: /* psp_sprel */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) psp_sprel", b0, parm1)
+ newrstate[SBREG_PSP] = UWX_DISP_SPREL(parm1 * 4);
+ break;
+ case 4: /* rp_when */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) rp_when", b0, parm1)
+ tspill[SBREG_RP] = (int) parm1;
+ break;
+ case 5: /* rp_psprel */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) rp_psprel", b0, parm1)
+ newrstate[SBREG_RP] = UWX_DISP_PSPREL(parm1 * 4);
+ break;
+ case 6: /* pfs_when */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) pfs_when", b0, parm1)
+ tspill[SBREG_PFS] = (int) parm1;
+ break;
+ case 7: /* pfs_psprel */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) pfs_psprel", b0, parm1)
+ newrstate[SBREG_PFS] = UWX_DISP_PSPREL(parm1 * 4);
+ break;
+ case 8: /* preds_when */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) preds_when", b0, parm1)
+ tspill[SBREG_PREDS] = (int) parm1;
+ break;
+ case 9: /* preds_psprel */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) preds_psprel", b0, parm1)
+ newrstate[SBREG_PREDS] = UWX_DISP_PSPREL(parm1 * 4);
+ break;
+ case 10: /* lc_when */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) lc_when", b0, parm1)
+ tspill[SBREG_LC] = (int) parm1;
+ break;
+ case 11: /* lc_psprel */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) lc_psprel", b0, parm1)
+ newrstate[SBREG_LC] = UWX_DISP_PSPREL(parm1 * 4);
+ break;
+ case 12: /* unat_when */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) unat_when", b0, parm1)
+ tspill[SBREG_UNAT] = (int) parm1;
+ break;
+ case 13: /* unat_psprel */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) unat_psprel", b0, parm1)
+ newrstate[SBREG_UNAT] = UWX_DISP_PSPREL(parm1 * 4);
+ break;
+ case 14: /* fpsr_when */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) fpsr_when", b0, parm1)
+ tspill[SBREG_FPSR] = (int) parm1;
+ break;
+ case 15: /* fpsr_psprel */
+ TRACE_I_DECODE_PROLOGUE_1L("(P7) fpsr_psprel", b0, parm1)
+ newrstate[SBREG_FPSR] = UWX_DISP_PSPREL(parm1 * 4);
+ break;
+ }
+ break;
+
+ case 7: /* 1111 xxxx */
+ /* Format P8 */
+ if (b0 == 0xf0) {
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ status = uwx_get_uleb128(bstream, &parm1);
+ if (status != 0)
+ return UWX_ERR_BADUDESC;
+ switch (b1) {
+ case 1: /* rp_sprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) rp_sprel", b0, b1, parm1)
+ newrstate[SBREG_RP] = UWX_DISP_SPREL(parm1 * 4);
+ break;
+ case 2: /* pfs_sprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) pfs_sprel", b0, b1, parm1)
+ newrstate[SBREG_PFS] = UWX_DISP_SPREL(parm1 * 4);
+ break;
+ case 3: /* preds_sprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) preds_sprel", b0, b1, parm1)
+ newrstate[SBREG_PREDS] = UWX_DISP_SPREL(parm1 * 4);
+ break;
+ case 4: /* lc_sprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) lc_sprel", b0, b1, parm1)
+ newrstate[SBREG_LC] = UWX_DISP_SPREL(parm1 * 4);
+ break;
+ case 5: /* unat_sprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) unat_sprel", b0, b1, parm1)
+ newrstate[SBREG_UNAT] = UWX_DISP_SPREL(parm1 * 4);
+ break;
+ case 6: /* fpsr_sprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) fpsr_sprel", b0, b1, parm1)
+ newrstate[SBREG_FPSR] = UWX_DISP_SPREL(parm1 * 4);
+ break;
+ case 7: /* bsp_when */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) bsp_when", b0, b1, parm1)
+ /* Don't track BSP yet */
+ return UWX_ERR_CANTUNWIND;
+ /* break; */
+ case 8: /* bsp_psprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) bsp_psprel", b0, b1, parm1)
+ /* Don't track BSP yet */
+ return UWX_ERR_CANTUNWIND;
+ /* break; */
+ case 9: /* bsp_sprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) bsp_sprel", b0, b1, parm1)
+ /* Don't track BSP yet */
+ return UWX_ERR_CANTUNWIND;
+ /* break; */
+ case 10: /* bspstore_when */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) bspstore_when", b0, b1, parm1)
+ /* Don't track BSP yet */
+ return UWX_ERR_CANTUNWIND;
+ /* break; */
+ case 11: /* bspstore_psprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) bspstore_psprel", b0, b1, parm1)
+ /* Don't track BSP yet */
+ return UWX_ERR_CANTUNWIND;
+ /* break; */
+ case 12: /* bspstore_sprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) bspstore_sprel", b0, b1, parm1)
+ /* Don't track BSP yet */
+ return UWX_ERR_CANTUNWIND;
+ /* break; */
+ case 13: /* rnat_when */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) rnat_when", b0, b1, parm1)
+ tspill[SBREG_RNAT] = (int) parm1;
+ break;
+ case 14: /* rnat_psprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) rnat_psprel", b0, b1, parm1)
+ newrstate[SBREG_RNAT] = UWX_DISP_PSPREL(parm1 * 4);
+ break;
+ case 15: /* rnat_sprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) rnat_sprel", b0, b1, parm1)
+ newrstate[SBREG_RNAT] = UWX_DISP_SPREL(parm1 * 4);
+ break;
+ case 16: /* priunat_when_gr */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) priunat_when_gr", b0, b1, parm1)
+ tspill[SBREG_PRIUNAT] = (int) parm1;
+ break;
+ case 17: /* priunat_psprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) priunat_psprel", b0, b1, parm1)
+ priunat_mem_rstate = UWX_DISP_PSPREL(parm1 * 4);
+ break;
+ case 18: /* priunat_sprel */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) priunat_sprel", b0, b1, parm1)
+ priunat_mem_rstate = UWX_DISP_SPREL(parm1 * 4);
+ break;
+ case 19: /* priunat_when_mem */
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) priunat_when_mem", b0, b1, parm1)
+ t_priunat_mem = (int) parm1;
+ break;
+ default:
+ TRACE_I_DECODE_PROLOGUE_2L("(P8) ??", b0, b1, parm1)
+ return UWX_ERR_BADUDESC;
+ }
+ }
+
+ /* Format P9 (gr_gr) */
+ else if (b0 == 0xf1) {
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ b2 = uwx_get_byte(bstream);
+ if (b2 < 0)
+ return UWX_ERR_BADUDESC;
+ TRACE_I_DECODE_PROLOGUE_3("(P9) gr_gr", b0, b1, b2)
+ mask = b1 & 0x0f;
+ reg = b2 & 0x7f;
+ gr_gr_mask = mask;
+ for (i = 0; i < NSB_GR && mask != 0; i++) {
+ if (mask & 0x01) {
+ newrstate[SBREG_GR + i] =
+ UWX_DISP_REG(UWX_REG_GR(reg));
+ reg++;
+ }
+ mask = mask >> 1;
+ }
+ }
+
+ /* Format X1 */
+ else if (b0 == 0xf9) {
+ TRACE_I_DECODE_PROLOGUE_1("(X1)", b0)
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ /* Don't support X-format descriptors yet */
+ return UWX_ERR_CANTUNWIND;
+ }
+
+ /* Format X2 */
+ else if (b0 == 0xfa) {
+ TRACE_I_DECODE_PROLOGUE_1("(X2)", b0)
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ b2 = uwx_get_byte(bstream);
+ if (b2 < 0)
+ return UWX_ERR_BADUDESC;
+ /* Don't support X-format descriptors yet */
+ return UWX_ERR_CANTUNWIND;
+ }
+
+ /* Format X3 */
+ else if (b0 == 0xfb) {
+ TRACE_I_DECODE_PROLOGUE_1("(X3)", b0)
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ b2 = uwx_get_byte(bstream);
+ if (b2 < 0)
+ return UWX_ERR_BADUDESC;
+ /* Don't support X-format descriptors yet */
+ return UWX_ERR_CANTUNWIND;
+ }
+
+ /* Format X4 */
+ else if (b0 == 0xfc) {
+ TRACE_I_DECODE_PROLOGUE_1("(X4)", b0)
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ b2 = uwx_get_byte(bstream);
+ if (b2 < 0)
+ return UWX_ERR_BADUDESC;
+ b3 = uwx_get_byte(bstream);
+ if (b3 < 0)
+ return UWX_ERR_BADUDESC;
+ /* Don't support X-format descriptors yet */
+ return UWX_ERR_CANTUNWIND;
+ }
+
+ /* Format P10 */
+ else if (b0 == 0xff) {
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ b2 = uwx_get_byte(bstream);
+ if (b2 < 0)
+ return UWX_ERR_BADUDESC;
+ TRACE_I_DECODE_PROLOGUE_3("(P10) abi", b0, b1, b2)
+ env->abi_context = (b1 << 8) | b2;
+ return UWX_ABI_FRAME;
+ }
+
+ /* Invalid descriptor record */
+ else {
+ TRACE_I_DECODE_PROLOGUE_1("(?)", b0)
+ return UWX_ERR_BADUDESC;
+ }
+ break;
+ }
+ }
+
+ /* Process the masks of spilled GRs, FRs, and BRs to */
+ /* determine when and where each register was saved. */
+
+ fr_base = spill_base + 16 * uwx_count_ones(fr_mem_mask);
+ br_base = fr_base + 8 * uwx_count_ones(br_mem_mask);
+ gr_base = br_base + 8 * uwx_count_ones(gr_mem_mask);
+ TRACE_I_DECODE_PROLOGUE_SPILL_BASE(spill_base)
+ TRACE_I_DECODE_PROLOGUE_MASKS(gr_mem_mask, gr_gr_mask)
+ TRACE_I_DECODE_PROLOGUE_NSPILL(ngr)
+ for (i = 0; ngr > 0 && i <= NSB_GR; i++) {
+ if (gr_mem_mask & 1) {
+ newrstate[SBREG_GR + i] = UWX_DISP_PSPREL(gr_base);
+ tspill[SBREG_GR + i] = 0;
+ gr_base -= 8;
+ ngr--;
+ }
+ else if (gr_gr_mask & 1) {
+ tspill[SBREG_GR + i] = 0;
+ ngr--;
+ }
+ gr_gr_mask = gr_gr_mask >> 1;
+ gr_mem_mask = gr_mem_mask >> 1;
+ }
+ for (i = 0; nbr > 0 && i <= NSB_BR; i++) {
+ if (br_mem_mask & 1) {
+ newrstate[SBREG_BR + i] = UWX_DISP_PSPREL(br_base);
+ tspill[SBREG_BR + i] = 0;
+ br_base -= 8;
+ nbr--;
+ }
+ else if (br_gr_mask & 1) {
+ tspill[SBREG_BR + i] = 0;
+ nbr--;
+ }
+ br_gr_mask = br_gr_mask >> 1;
+ br_mem_mask = br_mem_mask >> 1;
+ }
+ for (i = 0; nfr > 0 && i <= NSB_FR; i++) {
+ if (fr_mem_mask & 1) {
+ newrstate[SBREG_FR + i] = UWX_DISP_PSPREL(fr_base);
+ tspill[SBREG_FR + i] = 0;
+ fr_base -= 16;
+ nfr--;
+ }
+ fr_mem_mask = fr_mem_mask >> 1;
+ }
+
+ /* Update the scoreboard. */
+
+ for (i = 0; i < env->nsbreg; i++) {
+ if (ip_slot >= rhdr->rlen || ip_slot > tspill[i])
+ scoreboard->rstate[i] = newrstate[i];
+ }
+ if (priunat_mem_rstate != UWX_DISP_NONE && ip_slot > t_priunat_mem)
+ scoreboard->rstate[SBREG_PRIUNAT] = priunat_mem_rstate;
+
+ return UWX_OK;
+}
+
+int uwx_count_ones(unsigned int mask)
+{
+ mask = (mask & 0x55555555) + ((mask & 0xaaaaaaaa) >> 1);
+ mask = (mask & 0x33333333) + ((mask & 0xcccccccc) >> 2);
+ mask = (mask & 0x0f0f0f0f) + ((mask & 0xf0f0f0f0) >> 4);
+ mask = (mask & 0x00ff00ff) + ((mask & 0xff00ff00) >> 8);
+ return (mask & 0x0000ffff) + ((mask & 0xffff0000) >> 16);
+}
+
+/* uwx_decode_body: Decodes a body region */
+
+int uwx_decode_body(
+ struct uwx_env *env,
+ struct uwx_bstream *bstream,
+ struct uwx_scoreboard *scoreboard,
+ struct uwx_rhdr *rhdr,
+ int ip_slot)
+{
+ int status;
+ int b0;
+ int b1;
+ int b2;
+ int b3;
+ int label;
+ int ecount;
+ int i;
+ uint64_t parm1;
+ uint64_t parm2;
+ uint64_t newrstate[NSBREG];
+ int tspill[NSBREG];
+ int t_sp_restore;
+
+ /* Initialize an array of register states from the current */
+ /* scoreboard, along with a parallel array of spill times. */
+ /* We use this as a temporary scoreboard, then update the */
+ /* real scoreboard at the end of the procedure. */
+ /* We initialize the spill time to (rhdr.rlen - 1) so that */
+ /* spills without a "when" descriptor will take effect */
+ /* at the end of the prologue region. */
+ /* (Boundary condition: all actions in a zero-length prologue */
+ /* will appear to have happened in the instruction slot */
+ /* immediately preceding the prologue.) */
+
+ for (i = 0; i < env->nsbreg; i++) {
+ newrstate[i] = scoreboard->rstate[i];
+ tspill[i] = rhdr->rlen - 1;
+ }
+ t_sp_restore = rhdr->rlen - 1;
+
+ /* Read body descriptor records until */
+ /* we hit another region header. */
+
+ for (;;) {
+
+ b0 = uwx_get_byte(bstream);
+
+ if (b0 < 0x80) {
+ /* Return the last byte read to the byte stream, since it's */
+ /* really the first byte of the next region header record. */
+ if (b0 >= 0)
+ (void) uwx_unget_byte(bstream, b0);
+ break;
+ }
+
+ /* Format B1 (label_state) */
+ if (b0 < 0xa0) {
+ TRACE_I_DECODE_BODY_1("(B1) label_state", b0)
+ label = b0 & 0x1f;
+ status = uwx_label_scoreboard(env, scoreboard, label);
+ if (status != UWX_OK)
+ return (status);
+ }
+
+ /* Format B1 (copy_state) */
+ else if (b0 < 0xc0) {
+ TRACE_I_DECODE_BODY_1("(B1) copy_state", b0)
+ label = b0 & 0x1f;
+ status = uwx_copy_scoreboard(env, scoreboard, label);
+ if (status != UWX_OK)
+ return (status);
+ for (i = 0; i < env->nsbreg; i++) {
+ newrstate[i] = scoreboard->rstate[i];
+ tspill[i] = rhdr->rlen;
+ }
+ }
+
+ /* Format B2 (epilogue) */
+ else if (b0 < 0xe0) {
+ ecount = b0 & 0x1f;
+ status = uwx_get_uleb128(bstream, &parm1);
+ if (status != 0)
+ return UWX_ERR_BADUDESC;
+ TRACE_I_DECODE_BODY_1L("(B2) epilogue", b0, parm1)
+ rhdr->ecount = ecount + 1;
+ t_sp_restore = rhdr->rlen - (unsigned int) parm1;
+ }
+
+ /* Format B3 (epilogue) */
+ else if (b0 == 0xe0) {
+ status = uwx_get_uleb128(bstream, &parm1);
+ if (status != 0)
+ return UWX_ERR_BADUDESC;
+ status = uwx_get_uleb128(bstream, &parm2);
+ if (status != 0)
+ return UWX_ERR_BADUDESC;
+ TRACE_I_DECODE_BODY_1LL("(B3) epilogue", b0, parm1, parm2)
+ t_sp_restore = rhdr->rlen - (unsigned int) parm1;
+ rhdr->ecount = (unsigned int) parm2 + 1;
+ }
+
+ /* Format B4 (label_state) */
+ else if (b0 == 0xf0) {
+ status = uwx_get_uleb128(bstream, &parm1);
+ if (status != 0)
+ return UWX_ERR_BADUDESC;
+ TRACE_I_DECODE_BODY_1L("(B4) label_state", b0, parm1)
+ label = (int) parm1;
+ status = uwx_label_scoreboard(env, scoreboard, label);
+ if (status != UWX_OK)
+ return (status);
+ }
+
+ /* Format B4 (copy_state) */
+ else if (b0 == 0xf8) {
+ status = uwx_get_uleb128(bstream, &parm1);
+ if (status != 0)
+ return UWX_ERR_BADUDESC;
+ TRACE_I_DECODE_BODY_1L("(B4) copy_state", b0, parm1)
+ label = (int) parm1;
+ status = uwx_copy_scoreboard(env, scoreboard, label);
+ if (status != UWX_OK)
+ return (status);
+ for (i = 0; i < env->nsbreg; i++) {
+ newrstate[i] = scoreboard->rstate[i];
+ tspill[i] = rhdr->rlen;
+ }
+ }
+
+ /* Format X1 */
+ else if (b0 == 0xf9) {
+ TRACE_I_DECODE_BODY_1("(X1)", b0)
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ /* Don't support X-format descriptors yet */
+ return UWX_ERR_CANTUNWIND;
+ }
+
+ /* Format X2 */
+ else if (b0 == 0xfa) {
+ TRACE_I_DECODE_BODY_1("(X2)", b0)
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ b2 = uwx_get_byte(bstream);
+ if (b2 < 0)
+ return UWX_ERR_BADUDESC;
+ /* Don't support X-format descriptors yet */
+ return UWX_ERR_CANTUNWIND;
+ }
+
+ /* Format X3 */
+ else if (b0 == 0xfb) {
+ TRACE_I_DECODE_BODY_1("(X3)", b0)
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ b2 = uwx_get_byte(bstream);
+ if (b2 < 0)
+ return UWX_ERR_BADUDESC;
+ /* Don't support X-format descriptors yet */
+ return UWX_ERR_CANTUNWIND;
+ }
+
+ /* Format X4 */
+ else if (b0 == 0xfc) {
+ TRACE_I_DECODE_BODY_1("(X4)", b0)
+ b1 = uwx_get_byte(bstream);
+ if (b1 < 0)
+ return UWX_ERR_BADUDESC;
+ b2 = uwx_get_byte(bstream);
+ if (b2 < 0)
+ return UWX_ERR_BADUDESC;
+ b3 = uwx_get_byte(bstream);
+ if (b3 < 0)
+ return UWX_ERR_BADUDESC;
+ /* Don't support X-format descriptors yet */
+ return UWX_ERR_CANTUNWIND;
+ }
+
+ /* Invalid descriptor record */
+ else {
+ TRACE_I_DECODE_BODY_1("(?)", b0)
+ return UWX_ERR_BADUDESC;
+ }
+ }
+
+ /* Update the scoreboard. */
+
+ for (i = 0; i < env->nsbreg; i++) {
+ if (ip_slot > tspill[i])
+ scoreboard->rstate[i] = newrstate[i];
+ }
+
+ /* If we've passed the point in the epilogue where sp */
+ /* is restored, update the scoreboard entry for PSP */
+ /* and reset any entries for registers saved in memory. */
+
+ if (rhdr->ecount > 0 && ip_slot > t_sp_restore) {
+ scoreboard->rstate[SBREG_PSP] = UWX_DISP_SPPLUS(0);
+ for (i = 0; i < env->nsbreg; i++) {
+ if (UWX_GET_DISP_CODE(scoreboard->rstate[i]) == UWX_DISP_SPREL(0) ||
+ UWX_GET_DISP_CODE(scoreboard->rstate[i]) == UWX_DISP_PSPREL(0))
+ scoreboard->rstate[i] = UWX_DISP_NONE;
+ }
+ }
+
+ return UWX_OK;
+}
+
diff --git a/sys/contrib/ia64/libuwx/src/uwx_uinfo.h b/sys/contrib/ia64/libuwx/src/uwx_uinfo.h
new file mode 100644
index 0000000..1bb477c
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_uinfo.h
@@ -0,0 +1,66 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+struct uwx_utable_entry;
+
+extern int uwx_decode_uinfo(
+ struct uwx_env *env,
+ struct uwx_utable_entry *uentry,
+ uint64_t **rstatep);
+
+extern int uwx_default_rstate(
+ struct uwx_env *env,
+ uint64_t **rstatep);
+
+/* Region header record */
+
+struct uwx_rhdr {
+ int is_prologue; /* true if prologue region */
+ unsigned int rlen; /* length of region (# instruction slots) */
+ int mask; /* register save mask */
+ int grsave; /* first gr used for saving */
+ unsigned int ecount; /* epilogue count (0 = no epilogue) */
+ unsigned int epilogue_t; /* epilogue "t" value */
+};
+
+struct uwx_bstream;
+
+extern int uwx_decode_rhdr(
+ struct uwx_env *env,
+ struct uwx_bstream *bstream,
+ struct uwx_rhdr *rhdr);
+
+extern int uwx_decode_prologue(
+ struct uwx_env *env,
+ struct uwx_bstream *bstream,
+ struct uwx_scoreboard *scoreboard,
+ struct uwx_rhdr *rhdr,
+ int ip_slot);
+
+extern int uwx_decode_body(
+ struct uwx_env *env,
+ struct uwx_bstream *bstream,
+ struct uwx_scoreboard *scoreboard,
+ struct uwx_rhdr *rhdr,
+ int ip_slot);
diff --git a/sys/contrib/ia64/libuwx/src/uwx_utable.c b/sys/contrib/ia64/libuwx/src/uwx_utable.c
new file mode 100644
index 0000000..908a3ae
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_utable.c
@@ -0,0 +1,273 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+#include "uwx_env.h"
+#include "uwx_utable.h"
+#include "uwx_swap.h"
+#include "uwx_trace.h"
+
+/*
+ * uwx_utable.c
+ *
+ * This file contains the routines for searching an unwind table.
+ * The main entry point, uwx_search_utable(), gets the
+ * necessary information from the lookup ip callback's result
+ * vector, determines whether the table is 32-bit or 64-bit,
+ * then invokes the binary search routine for that format.
+ */
+
+
+/* Forward declarations */
+
+int uwx_search_utable32(
+ struct uwx_env *env,
+ uint32_t ip,
+ uint32_t text_base,
+ uint32_t unwind_start,
+ uint32_t unwind_end,
+ struct uwx_utable_entry *uentry);
+
+int uwx_search_utable64(
+ struct uwx_env *env,
+ uint64_t ip,
+ uint64_t text_base,
+ uint64_t unwind_start,
+ uint64_t unwind_end,
+ struct uwx_utable_entry *uentry);
+
+
+/* uwx_search_utable: Searches an unwind table for IP in current context */
+
+int uwx_search_utable(
+ struct uwx_env *env,
+ uint64_t ip,
+ uint64_t *uvec,
+ struct uwx_utable_entry *uentry)
+{
+ uint64_t text_base;
+ uint64_t unwind_flags;
+ uint64_t unwind_start;
+ uint64_t unwind_end;
+ int keys;
+ int status;
+
+ /* Get unwind table information from the result vector. */
+ /* Make sure all three required values are given. */
+
+ keys = 0;
+ text_base = 0;
+ unwind_flags = 0;
+ unwind_start = 0;
+ unwind_end = 0;
+ while (*uvec != 0) {
+ switch ((int)*uvec++) {
+ case UWX_KEY_TBASE:
+ keys |= 1;
+ env->text_base = text_base = *uvec++;
+ break;
+ case UWX_KEY_UFLAGS:
+ unwind_flags = *uvec++;
+ break;
+ case UWX_KEY_USTART:
+ keys |= 2;
+ unwind_start = *uvec++;
+ break;
+ case UWX_KEY_UEND:
+ keys |= 4;
+ unwind_end = *uvec++;
+ break;
+ case UWX_KEY_GP:
+ uwx_set_reg(env, UWX_REG_GP, *uvec++);
+ break;
+ default:
+ return UWX_ERR_BADKEY;
+ }
+ }
+ if (keys != 7)
+ return UWX_ERR_BADKEY;
+
+ /* Copy the unwind flags into the unwind entry. */
+ /* (uwx_decode_uinfo needs to know whether it's 32-bit or 64-bit.) */
+
+ uentry->unwind_flags = unwind_flags;
+
+ /* Call the appropriate binary search routine. */
+
+ if (unwind_flags & UNWIND_TBL_32BIT)
+ status = uwx_search_utable32(env,
+ (uint32_t) ip,
+ (uint32_t) text_base,
+ (uint32_t) unwind_start,
+ (uint32_t) unwind_end,
+ uentry);
+ else
+ status = uwx_search_utable64(env,
+ ip, text_base, unwind_start, unwind_end, uentry);
+
+ return status;
+}
+
+
+/* uwx_search_utable32: Binary search of 32-bit unwind table */
+
+#define COPYIN_UINFO_4(dest, src) \
+ (env->remote? \
+ (*env->copyin)(UWX_COPYIN_UINFO, (dest), (src), \
+ WORDSZ, env->cb_token) : \
+ (*(uint32_t *)(dest) = *(uint32_t *)(src), WORDSZ) )
+
+#define SWIZZLE(x) (((uint64_t)((x) & 0xc0000000) << 31) | (x))
+
+int uwx_search_utable32(
+ struct uwx_env *env,
+ uint32_t ip,
+ uint32_t text_base,
+ uint32_t unwind_start,
+ uint32_t unwind_end,
+ struct uwx_utable_entry *uentry)
+{
+ int lb;
+ int ub;
+ int mid;
+ int len;
+ uint32_t code_start;
+ uint32_t code_end;
+ uint32_t unwind_info;
+
+ /* Since the unwind table uses segment-relative offsets, convert */
+ /* the IP in the current context to a segment-relative offset. */
+
+ ip -= text_base;
+
+ TRACE_T_SEARCH32(ip)
+
+ /* Standard binary search. */
+ /* Might modify this to do interpolation in the future. */
+
+ lb = 0;
+ ub = (unwind_end - unwind_start) / (3 * WORDSZ);
+ mid = 0;
+ while (ub > lb) {
+ mid = (lb + ub) / 2;
+ len = COPYIN_UINFO_4((char *)&code_start,
+ (uintptr_t)(unwind_start+mid*3*WORDSZ));
+ len += COPYIN_UINFO_4((char *)&code_end,
+ (uintptr_t)(unwind_start+mid*3*WORDSZ+WORDSZ));
+ if (len != 2 * WORDSZ)
+ return UWX_ERR_COPYIN_UTBL;
+ if (env->byte_swap) {
+ uwx_swap4(&code_start);
+ uwx_swap4(&code_end);
+ }
+ TRACE_T_BINSEARCH32(lb, ub, mid, code_start, code_end)
+ if (ip >= code_end)
+ lb = mid + 1;
+ else if (ip < code_start)
+ ub = mid;
+ else
+ break;
+ }
+ if (ub <= lb)
+ return UWX_ERR_NOUENTRY;
+ len = COPYIN_UINFO_4((char *)&unwind_info,
+ (uintptr_t)(unwind_start+mid*3*WORDSZ+2*WORDSZ));
+ if (len != WORDSZ)
+ return UWX_ERR_COPYIN_UTBL;
+ if (env->byte_swap)
+ uwx_swap4(&unwind_info);
+ uentry->ptr_size = WORDSZ;
+ uentry->code_start = SWIZZLE(text_base + code_start);
+ uentry->code_end = SWIZZLE(text_base + code_end);
+ uentry->unwind_info = SWIZZLE(text_base + unwind_info);
+ return UWX_OK;
+}
+
+
+/* uwx_search_utable64: Binary search of 64-bit unwind table */
+
+#define COPYIN_UINFO_8(dest, src) \
+ (env->remote? \
+ (*env->copyin)(UWX_COPYIN_UINFO, (dest), (src), \
+ DWORDSZ, env->cb_token) : \
+ (*(uint64_t *)(intptr_t)(dest) = *(uint64_t *)(intptr_t)(src), DWORDSZ) )
+
+int uwx_search_utable64(
+ struct uwx_env *env,
+ uint64_t ip,
+ uint64_t text_base,
+ uint64_t unwind_start,
+ uint64_t unwind_end,
+ struct uwx_utable_entry *uentry)
+{
+ int lb;
+ int ub;
+ int mid;
+ int len;
+ uint64_t code_start;
+ uint64_t code_end;
+ uint64_t unwind_info;
+
+ /* Since the unwind table uses segment-relative offsets, convert */
+ /* the IP in the current context to a segment-relative offset. */
+
+ ip -= text_base;
+
+ /* Standard binary search. */
+ /* Might modify this to do interpolation in the future. */
+
+ lb = 0;
+ ub = (unwind_end - unwind_start) / (3 * DWORDSZ);
+ mid = 0;
+ while (ub > lb) {
+ mid = (lb + ub) / 2;
+ len = COPYIN_UINFO_8((char *)&code_start, unwind_start+mid*3*DWORDSZ);
+ len += COPYIN_UINFO_8((char *)&code_end,
+ unwind_start+mid*3*DWORDSZ+DWORDSZ);
+ if (len != 2 * DWORDSZ)
+ return UWX_ERR_COPYIN_UTBL;
+ if (env->byte_swap) {
+ uwx_swap8(&code_start);
+ uwx_swap8(&code_end);
+ }
+ if (ip >= code_end)
+ lb = mid + 1;
+ else if (ip < code_start)
+ ub = mid;
+ else
+ break;
+ }
+ if (ub <= lb)
+ return UWX_ERR_NOUENTRY;
+ len = COPYIN_UINFO_8((char *)&unwind_info,
+ unwind_start+mid*3*DWORDSZ+2*DWORDSZ);
+ if (len != DWORDSZ)
+ return UWX_ERR_COPYIN_UTBL;
+ if (env->byte_swap)
+ uwx_swap8(&unwind_info);
+ uentry->ptr_size = DWORDSZ;
+ uentry->code_start = text_base + code_start;
+ uentry->code_end = text_base + code_end;
+ uentry->unwind_info = text_base + unwind_info;
+ return UWX_OK;
+}
diff --git a/sys/contrib/ia64/libuwx/src/uwx_utable.h b/sys/contrib/ia64/libuwx/src/uwx_utable.h
new file mode 100644
index 0000000..69f1cc7
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/src/uwx_utable.h
@@ -0,0 +1,37 @@
+/*
+Copyright (c) 2003-2006 Hewlett-Packard Development Company, L.P.
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.
+*/
+
+struct uwx_utable_entry {
+ uint64_t ptr_size;
+ uint64_t code_start;
+ uint64_t code_end;
+ uint64_t unwind_info;
+ uint64_t unwind_flags;
+};
+
+extern int uwx_search_utable(
+ struct uwx_env *env,
+ uint64_t ip,
+ uint64_t *uvec,
+ struct uwx_utable_entry *uentry);
diff --git a/sys/contrib/ia64/libuwx/test/Makefile b/sys/contrib/ia64/libuwx/test/Makefile
new file mode 100644
index 0000000..11251d4
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/test/Makefile
@@ -0,0 +1,14 @@
+UWXINCDIR = ../include
+UWXLIBDIR = ../lib/ipf32
+
+CFLAGS = -O -I $(UWXINCDIR)
+LDFLAGS = -L $(UWXLIBDIR)
+
+dumpmyself: dumpmyself.o dump_context.o primeregs.o
+ $(CC) -o dumpmyself $(LDFLAGS) dumpmyself.o dump_context.o primeregs.o -luwx
+
+
+dumpmyself.o: $(UWXINCDIR)/uwx.h $(UWXINCDIR)/uwx_self.h
+
+dump_context.o:
+primeregs.o:
diff --git a/sys/contrib/ia64/libuwx/test/dump_context.c b/sys/contrib/ia64/libuwx/test/dump_context.c
new file mode 100644
index 0000000..db46e3d
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/test/dump_context.c
@@ -0,0 +1,100 @@
+#include <stdio.h>
+#include <inttypes.h>
+
+#define IP 0
+#define SP 1
+#define BSP 2
+#define CFM 3
+#define RP 4
+#define PSP 5
+#define PFS 6
+#define PREDS 7
+#define PRIUNAT 8
+#define AR_BSPSTORE 9
+#define AR_RNAT 10
+#define AR_UNAT 11
+#define AR_FPSR 12
+#define AR_LC 13
+#define AR_PFS 14
+#define GR4 16
+#define GR5 17
+#define GR6 18
+#define GR7 19
+#define BR1 20
+#define BR2 21
+#define BR3 22
+#define BR4 23
+#define BR5 24
+
+void dump_context(uint64_t *context)
+{
+ int i, j;
+ unsigned int valid;
+ uint64_t val;
+ static char *names[] = {
+ /* 0 */ "ip", "sp", "bsp", "cfm",
+ /* 4 */ "rp", "psp", "pfs", "preds",
+ /* 8 */ "priunat", "ar.bspstore", "ar.rnat", "ar.unat",
+ /* 12 */ "ar.fpsr", "ar.lc", "ar.pfs", "(pad)",
+ /* 16 */ "gr4", "gr5", "gr6", "gr7",
+ /* 20 */ "br1", "br2", "br3", "br4", "br5"
+ };
+ static int col1[] = {
+ IP,
+ SP,
+ BSP,
+ CFM,
+ RP,
+ PSP,
+ PFS,
+ AR_RNAT,
+ AR_UNAT,
+ AR_FPSR,
+ AR_LC,
+ AR_PFS,
+ };
+ static int col2[] = {
+ PREDS,
+ PRIUNAT,
+ GR4,
+ GR5,
+ GR6,
+ GR7,
+ BR1,
+ BR2,
+ BR3,
+ BR4,
+ BR5,
+ };
+
+#define NCOL1 (sizeof(col1)/sizeof(int))
+#define NCOL2 (sizeof(col2)/sizeof(int))
+#define NPRINT (NCOL1 > NCOL2 ? NCOL1 : NCOL2)
+
+ valid = (unsigned int)(context[0] >> 32);
+ printf(" valid_regs (%08lx):", valid);
+ for (i = 0; i <= BR5; i++) {
+ if (valid & 1) printf(" %s", names[i]);
+ valid >>= 1;
+ }
+ printf("\n");
+ for (i = 0; i < NPRINT; i++) {
+ if (i < NCOL1) {
+ j = col1[i];
+ val = context[j+1];
+ printf(" %-8s %08x %08x", names[j],
+ (unsigned int)(val >> 32),
+ (unsigned int)val);
+ }
+ else
+ printf(" ");
+ if (i < NCOL2) {
+ j = col2[i];
+ val = context[j+1];
+ printf(" %-8s %08x %08x", names[j],
+ (unsigned int)(val >> 32),
+ (unsigned int)val);
+ }
+ putchar('\n');
+ }
+}
diff --git a/sys/contrib/ia64/libuwx/test/dumpmyself.c b/sys/contrib/ia64/libuwx/test/dumpmyself.c
new file mode 100644
index 0000000..c2b63d0
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/test/dumpmyself.c
@@ -0,0 +1,106 @@
+#include "uwx.h"
+#include "uwx_self.h"
+
+struct uwx_env *uenv;
+struct uwx_self_info *cbinfo;
+
+extern int uwx_get_frame_info(struct uwx_env *uenv);
+
+extern void dump_context(uint64_t *context);
+
+extern void prime_registers();
+
+int main(int argc, char **argv)
+{
+ int status;
+ unsigned int *wp;
+ uenv = uwx_init();
+ printf("uwx_init returned %08x\n", uenv);
+ cbinfo = uwx_self_init_info(uenv);
+ status = uwx_register_callbacks(
+ uenv,
+ (intptr_t)cbinfo,
+ uwx_self_copyin,
+ uwx_self_lookupip);
+ printf("uwx_register_callbacks returned %d\n", status);
+ uwx_self_init_context(uenv);
+ printf("In main():\n");
+ dump_context((uint64_t *)uenv);
+ prime_registers();
+ uwx_free(uenv);
+ return 0;
+}
+
+int func1(void)
+{
+ uwx_self_init_context(uenv);
+ printf("In func1():\n");
+ dump_context((uint64_t *)uenv);
+ return func2();
+}
+
+int func2(void)
+{
+ uwx_self_init_context(uenv);
+ printf("In func2():\n");
+ dump_context((uint64_t *)uenv);
+ return func3();
+}
+
+int func3(void)
+{
+ uwx_self_init_context(uenv);
+ printf("In func3():\n");
+ dump_context((uint64_t *)uenv);
+ return func4();
+}
+
+int func4(void)
+{
+ int status;
+ int foo[10];
+ uint64_t *p;
+ uint64_t disp;
+ uint64_t val;
+
+ func5(foo);
+ uwx_self_init_context(uenv);
+ uwx_init_history(uenv);
+ printf("In func4():\n");
+ dump_context((uint64_t *)uenv);
+ for (;;) {
+ status = uwx_step(uenv);
+ if (status != UWX_OK) {
+ printf("uwx_step returned %d\n", status);
+ break;
+ }
+ status = uwx_get_reg(uenv, UWX_REG_PFS, &val);
+ if (status != UWX_OK) {
+ printf("uwx_get_reg returned %d\n", status);
+ break;
+ }
+ printf("After step:\n");
+ dump_context((uint64_t *)uenv);
+ status = uwx_get_spill_loc(uenv, UWX_REG_IP, &disp);
+ if (status == UWX_OK) {
+ p = (uint64_t *)(disp & ~0x7LL);
+ if ((disp & 0x7) == UWX_DISP_RSTK(0))
+ printf("IP spilled to backing store %08x = %08x\n",
+ (int)p, (int)(*p));
+ else if ((disp & 0x7) == UWX_DISP_MSTK(0))
+ printf("IP spilled to mem stack %08x = %08x\n",
+ (int)p, (int)(*p));
+ else if ((disp & 0x7) == UWX_DISP_REG(0))
+ printf("IP found in register %08x\n", (int)disp >> 4);
+ else
+ printf("IP history not available\n");
+ }
+ }
+ return 0;
+}
+
+int func5(int *foo)
+{
+ foo[0] = 0;
+ return 0;
+}
diff --git a/sys/contrib/ia64/libuwx/test/primeregs.s b/sys/contrib/ia64/libuwx/test/primeregs.s
new file mode 100644
index 0000000..12444a2
--- /dev/null
+++ b/sys/contrib/ia64/libuwx/test/primeregs.s
@@ -0,0 +1,93 @@
+ .text
+ .proc prime_registers
+ .global prime_registers
+
+prime_registers:
+
+ .prologue
+
+ .save ar.pfs, r32
+ alloc r32 = ar.pfs, 0, 3, 0, 0
+ .save rp, r33
+ mov r33 = b0
+ .save ar.unat, r34
+ mov r34 = ar.unat
+ add r14 = -56, sp
+ add r15 = -48, sp
+ .fframe 80
+ add sp = -80, sp
+ mov r16 = b1
+ ;;
+
+ .save.g 0x1
+ st8.spill [r14] = r4, 16
+ .save.g 0x2
+ st8.spill [r15] = r5, 16
+ mov r17 = b2
+ ;;
+ .save.g 0x4
+ st8.spill [r14] = r6, 16
+ .save.g 0x8
+ st8.spill [r15] = r7, 16
+ mov r18 = b3
+ ;;
+ .save.b 0x1
+ st8 [r14] = r16, 16
+ .save.b 0x2
+ st8 [r15] = r17, 16
+ mov r19 = b4
+ ;;
+ .save.b 0x4
+ st8 [r14] = r18, 16
+ .save.b 0x8
+ st8 [r15] = r19
+ mov r20 = b5
+ ;;
+ .save.b 0x10
+ st8 [r14] = r20
+
+ .body
+
+ dep.z r4 = -0x34, 16, 32
+ ;;
+ add r5 = 1, r4
+ add r6 = 2, r4
+ ;;
+ add r7 = 3, r4
+ ;;
+
+ .global func1
+ .type func1, @function
+ br.call.sptk b0 = func1
+ ;;
+
+ add r14 = 80, sp
+ add r15 = 88, sp
+ ;;
+ ld8 r20 = [r15], -16
+ ;;
+ ld8 r19 = [r14], -16
+ ld8 r18 = [r15], -16
+ mov b5 = r20
+ ;;
+ ld8 r17 = [r14], -16
+ ld8 r16 = [r15], -16
+ mov b4 = r19
+ ;;
+ ld8.fill r7 = [r14], -16
+ ld8.fill r6 = [r15], -16
+ mov b3 = r18
+ ;;
+ ld8.fill r5 = [r14]
+ ld8.fill r4 = [r15]
+ mov b2 = r17
+ mov b1 = r16
+
+ .restore sp
+ mov ar.pfs = r32
+ ;;
+ add sp = 80, sp
+ mov ar.unat = r34
+ mov b0 = r33
+ br.ret.sptk b0
+ .endp
diff --git a/sys/contrib/ipfilter/netinet/IPFILTER.LICENCE b/sys/contrib/ipfilter/netinet/IPFILTER.LICENCE
new file mode 100644
index 0000000..1ee473d
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/IPFILTER.LICENCE
@@ -0,0 +1,30 @@
+$FreeBSD$
+
+Copyright (C) 1993-2002 by Darren Reed.
+
+The author accepts no responsibility for the use of this software and
+provides it on an ``as is'' basis without express or implied warranty.
+
+Redistribution and use, with or without modification, in source and binary
+forms, are permitted provided that this notice is preserved in its entirety
+and due credit is given to the original author and the contributors.
+
+The licence and distribution terms for any publically available version or
+derivative of this code cannot be changed. i.e. this code cannot simply be
+copied, in part or in whole, and put under another distribution licence
+[including the GNU Public Licence.]
+
+THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+SUCH DAMAGE.
+
+I hate legalese, don't you ?
+
diff --git a/sys/contrib/ipfilter/netinet/QNX_OCL.txt b/sys/contrib/ipfilter/netinet/QNX_OCL.txt
new file mode 100644
index 0000000..b623776
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/QNX_OCL.txt
@@ -0,0 +1,277 @@
+$FreeBSD$
+
+ End User License Certificate (EULA) End User License Certificate
+ (EULA)
+ Support Support
+ QNX Source Licenses QNX Source Licenses
+ License of the month
+ Confidential Source License
+ Version 1.0
+
+QNX Open Community License Version 1.0
+
+ THIS QNX OPEN COMMUNITY LICENSE ( "THE OCL", OR "THIS AGREEMENT")
+ APPLIES TO PROGRAMS THAT QNX SOFTWARE SYSTEMS LTD. ("QSS") EXPRESSLY
+ ELECTS TO LICENSE UNDER THE OCL TERMS. IT ALSO APPLIES TO DERIVATIVE
+ WORKS CREATED UNDER THIS AGREEMENT THAT CREATORS ELECT TO LICENSE TO
+ OTHERS IN SOURCE CODE FORM. ANY USE, REPRODUCTION, MODIFICATION OR
+ DISTRIBUTION OF SUCH PROGRAMS CONSTITUTES RECIPIENT'S ACCEPTANCE OF
+ THE OCL. THE LICENSE RIGHTS GRANTED BELOW ARE CONDITIONAL UPON
+ RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT AND THE FORMATION OF A
+ BINDING CONTRACT. NOTHING ELSE GRANTS PERMISSION TO USE, REPRODUCE,
+ MODIFY OR DISTRIBUTE SUCH PROGRAMS OR THEIR DERIVATIVE WORKS. THESE
+ ACTIONS ARE OTHERWISE PROHIBITED. CONTACT QSS IF OTHER STEPS ARE
+ REQUIRED LOCALLY TO CREATE A BINDING CONTRACT.
+
+ The OCL is intended to promote the development, use and distribution
+ of derivative works created from QSS source code. This includes
+ commercial distribution of object code versions under the terms of
+ Recipient's own license agreement and, at Recipient's option, sharing
+ of source code modifications within the QNX developer's community. The
+ license granted under the OCL is royalty free. Recipient is entitled
+ to charge royalties for object code versions of derivative works that
+ originate with Recipient. If Recipient elects to license source code
+ for its derivative works to others, then it must be licensed under the
+ OCL. The terms of the OCL are as follows:
+
+1. DEFINITIONS
+
+ "Contribution" means:
+
+ a. in the case of QSS: (i) the Original Program, where the Original
+ Program originates from QSS, (ii) changes and/or additions to
+ Unrestricted Open Source, where the Original Program originates
+ from Unrestricted Open Source and where such changes and/or
+ additions originate from QSS, and (iii) changes and/or additions
+ to the Program where such changes and/or additions originate from
+ QSS.
+ b. in the case of each Contributor, changes and/or additions to the
+ Program, where such changes and/or additions originate from and
+ are distributed by that particular Contributor.
+
+ A Contribution 'originates' from a Contributor if it was added to the
+ Program by such Contributor itself or anyone acting on such
+ Contributor's behalf. Contributions do not include additions to the
+ Program which: (i) are separate modules of software distributed in
+ conjunction with the Program under their own license agreement, and
+ (ii) are not derivative works of the Program.
+
+ "Contributor" means QSS and any other entity that distributes the
+ Program.
+
+ "Licensed Patents " mean patent claims licensable by Contributor to
+ others, which are necessarily infringed by the use or sale of its
+ Contribution alone or when combined with the Program.
+
+ "Unrestricted Open Source" means published source code that is
+ licensed for free use and distribution under an unrestricted licensing
+ and distribution model, such as the Berkley Software Design ("BSD")
+ and "BSD-like" licenses. It specifically excludes any source code
+ licensed under any version of the GNU General Public License (GPL) or
+ the GNU Lesser/Library GPL. All "Unrestricted Open Source" license
+ terms appear or are clearly identified in the header of any affected
+ source code for the Original Program.
+
+ "Original Program" means the original version of the software
+ accompanying this Agreement as released by QSS, including source code,
+ object code and documentation, if any.
+
+ "Program" means the Original Program and Contributions.
+
+ "Recipient" means anyone who receives the Program under this
+ Agreement, including all Contributors.
+
+2. GRANT OF RIGHTS
+
+ a. Subject to the terms of this Agreement, each Contributor hereby
+ grants Recipient a non-exclusive, worldwide, royalty-free
+ copyright license to reproduce, prepare derivative works of,
+ publicly display, publicly perform, and directly and indirectly
+ sublicense and distribute the Contribution of such Contributor, if
+ any, and such derivative works, in source code and object code
+ form.
+ b. Subject to the terms of this Agreement, each Contributor hereby
+ grants Recipient a non-exclusive, worldwide, royalty-free patent
+ license under Licensed Patents to make, use, sell, offer to sell,
+ import and otherwise transfer the Contribution of such
+ Contributor, if any, in source code and object code form. This
+ patent license shall apply to the combination of the Contribution
+ and the Program if, at the time the Contribution is added by the
+ Contributor, such addition of the Contribution causes such
+ combination to be covered by the Licensed Patents. The patent
+ license shall not apply to any other combinations which include
+ the Contribution.
+ c. Recipient understands that although each Contributor grants the
+ licenses to its Contributions set forth herein, no assurances are
+ provided by any Contributor that the Program does not infringe the
+ patent or other intellectual property rights of any other entity.
+ Each Contributor disclaims any liability to Recipient for claims
+ brought by any other entity based on infringement of intellectual
+ property rights or otherwise. As a condition to exercising the
+ rights and licenses granted hereunder, each Recipient hereby
+ assumes sole responsibility to secure any other intellectual
+ property rights needed, if any. For example, if a third party
+ patent license is required to allow Recipient to distribute the
+ Program, it is Recipient's responsibility to acquire that license
+ before distributing the Program.
+ d. Each Contributor represents that to its knowledge it has
+ sufficient copyright rights in its Contribution, if any, to grant
+ the copyright license set forth in this Agreement.
+
+ 3. REQUIREMENTS
+
+ A Contributor may choose to distribute the Program in object code form
+ under its own license agreement, provided that:
+
+ a. it complies with the terms and conditions of this Agreement; and
+ b. its license agreement:
+ i. effectively disclaims on behalf of all Contributors all
+ warranties and conditions, express and implied, including
+ warranties or conditions of title and non-infringement, and
+ implied warranties or conditions of merchantability and
+ fitness for a particular purpose;
+ ii. effectively excludes on behalf of all Contributors all
+ liability for damages, including direct, indirect, special,
+ incidental and consequential damages, such as lost profits;
+ and
+ iii. states that any provisions which differ from this Agreement
+ are offered by that Contributor alone and not by any other
+ party.
+
+ If the Program is made available in source code form:
+
+ a. it must be made available under this Agreement; and
+ b. a copy of this Agreement must be included with each copy of the
+ Program. Each Contributor must include the following in a
+ conspicuous location in the Program along with any other copyright
+ or attribution statements required by the terms of any applicable
+ Unrestricted Open Source license:
+ Copyright {date here}, QNX Software Systems Ltd. and others. All
+ Rights Reserved.
+
+ In addition, each Contributor must identify itself as the originator
+ of its Contribution, if any, in a manner that reasonably allows
+ subsequent Recipients to identify the originator of the Contribution.
+
+ 4. COMMERCIAL DISTRIBUTION
+
+ Commercial distributors of software may accept certain
+ responsibilities with respect to end users, business partners and the
+ like. While this license is intended to facilitate the commercial use
+ of the Program, the Contributor who includes the Program in a
+ commercial product offering should do so in a manner which does not
+ create potential liability for other Contributors. Therefore, if a
+ Contributor includes the Program in a commercial product offering,
+ such Contributor ("Commercial Contributor") hereby agrees to defend
+ and indemnify every other Contributor ("Indemnified Contributor")
+ against any losses, damages and costs (collectively "Losses") arising
+ from claims, lawsuits and other legal actions brought by a third party
+ against the Indemnified Contributor to the extent caused by the acts
+ or omissions of such Commercial Contributor in connection with its
+ distribution of the Program in a commercial product offering. The
+ obligations in this section do not apply to any claims or Losses
+ relating to any actual or alleged intellectual property infringement.
+ In order to qualify, an Indemnified Contributor must: a) promptly
+ notify the Commercial Contributor in writing of such claim, and b)
+ allow the Commercial Contributor to control, and cooperate with the
+ Commercial Contributor in, the defense and any related settlement
+ negotiations. The Indemnified Contributor may participate in any such
+ claim at its own expense.
+
+ For example, a Contributor might include the Program in a commercial
+ product offering, Product X. That Contributor is then a Commercial
+ Contributor. If that Commercial Contributor then makes performance
+ claims, or offers warranties related to Product X, those performance
+ claims and warranties are such Commercial Contributor's responsibility
+ alone. Under this section, the Commercial Contributor would have to
+ defend claims against the other Contributors related to those
+ performance claims and warranties, and if a court requires any other
+ Contributor to pay any damages as a result, the Commercial Contributor
+ must pay those damages.
+
+ 5. NO WARRANTY
+
+ Recipient acknowledges that there may be errors or bugs in the Program
+ and that it is imperative that Recipient conduct thorough testing to
+ identify and correct any problems prior to the productive use or
+ commercial release of any products that use the Program, and prior to
+ the release of any modifications, updates or enhancements thereto.
+
+ EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS
+ PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY
+ WARRANTIES OR CONDITIONS OF TITLE, NON- INFRINGEMENT, MERCHANTABILITY
+ OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely
+ responsible for determining the appropriateness of using and
+ distributing the Program and assumes all risks associated with its
+ exercise of rights under this Agreement, including but not limited to
+ the risks and costs of program errors, compliance with applicable
+ laws, damage to or loss of data, programs or equipment, and
+ unavailability or interruption of operations.
+
+ 6. DISCLAIMER OF LIABILITY
+
+ EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR
+ ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING
+ WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF
+ LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR
+ DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED
+ HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+ 7. GENERAL
+
+ If any provision of this Agreement is invalid or unenforceable under
+ applicable law, it shall not affect the validity or enforceability of
+ the remainder of the terms of this Agreement, and without further
+ action by the parties hereto, such provision shall be reformed to the
+ minimum extent necessary to make such provision valid and enforceable.
+
+ If Recipient institutes patent litigation against a Contributor with
+ respect to a patent applicable to software (including a cross-claim or
+ counterclaim in a lawsuit), then any patent licenses granted by that
+ Contributor to such recipient under this Agreement shall terminate as
+ of the date such litigation is filed. In addition, If Recipient
+ institutes patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Program
+ itself (excluding combinations of the Program with other software or
+ hardware) infringes such Recipient's patent(s), then such Recipient's
+ rights granted under Section 2(b) shall terminate as of the date such
+ litigation is filed.
+
+ All Recipient's rights under this Agreement shall terminate if it
+ fails to comply with any of the material terms or conditions of this
+ Agreement and does not cure such failure in a reasonable period of
+ time after becoming aware of such noncompliance. If all Recipient's
+ rights under this Agreement terminate, Recipient agrees to cease use
+ and distribution of the Program as soon as reasonably practicable.
+ However, Recipient's obligations under this Agreement and any licenses
+ granted by Recipient relating to the Program shall continue and
+ survive.
+
+ QSS may publish new versions (including revisions) of this Agreement
+ from time to time. Each new version of the Agreement will be given a
+ distinguishing version number. The Program (including Contributions)
+ may always be distributed subject to the version of the Agreement
+ under which it was received. In addition, after a new version of the
+ Agreement is published, Contributor may elect to distribute the
+ Program (including its Contributions) under the new version. No one
+ other than QSS has the right to modify this Agreement. Except as
+ expressly stated in Sections 2(a) and 2(b) above, Recipient receives
+ no rights or licenses to the intellectual property of any Contributor
+ under this Agreement, whether expressly, by implication, estoppel or
+ otherwise. All rights in the Program not expressly granted under this
+ Agreement are reserved.
+
+ This Agreement is governed by the laws in force in the Province of
+ Ontario, Canada without regard to the conflict of law provisions
+ therein. The parties expressly disclaim the provisions of the United
+ Nations Convention on Contracts for the International Sale of Goods.
+ No party to this Agreement will bring a legal action under this
+ Agreement more than one year after the cause of action arose. Each
+ party waives its rights to a jury trial in any resulting litigation.
+
+ * QNX is a registered trademark of QNX Software Systems Ltd.
+
+ Document Version: ocl1_00
diff --git a/sys/contrib/ipfilter/netinet/fil.c b/sys/contrib/ipfilter/netinet/fil.c
new file mode 100644
index 0000000..014fb0f
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/fil.c
@@ -0,0 +1,7319 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1993-2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#if defined(__NetBSD__)
+# if (NetBSD >= 199905) && !defined(IPFILTER_LKM) && defined(_KERNEL)
+# if (__NetBSD_Version__ < 399001400)
+# include "opt_ipfilter_log.h"
+# else
+# include "opt_ipfilter.h"
+# endif
+# endif
+#endif
+#if defined(_KERNEL) && defined(__FreeBSD_version) && \
+ (__FreeBSD_version >= 220000)
+# if (__FreeBSD_version >= 400000)
+# if !defined(IPFILTER_LKM)
+# include "opt_inet6.h"
+# endif
+# if (__FreeBSD_version == 400019)
+# define CSUM_DELAY_DATA
+# endif
+# endif
+# include <sys/filio.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#if (defined(__SVR4) || defined(__svr4__)) && defined(sun)
+# include <sys/filio.h>
+#endif
+#if !defined(_AIX51)
+# include <sys/fcntl.h>
+#endif
+#if defined(_KERNEL)
+# include <sys/systm.h>
+# include <sys/file.h>
+#else
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+# include <stddef.h>
+# include <sys/file.h>
+# define _KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+#endif
+#if !defined(__SVR4) && !defined(__svr4__) && !defined(__hpux) && \
+ !defined(linux)
+# include <sys/mbuf.h>
+#else
+# if !defined(linux)
+# include <sys/byteorder.h>
+# endif
+# if (SOLARIS2 < 5) && defined(sun)
+# include <sys/dditypes.h>
+# endif
+#endif
+#ifdef __hpux
+# define _NET_ROUTE_INCLUDED
+#endif
+#if !defined(linux)
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#if !defined(_KERNEL) && defined(__FreeBSD__)
+# if (__FreeBSD_version >= 504000)
+# undef _RADIX_H_
+# endif
+# include "radix_ipf.h"
+#endif
+#ifdef __osf__
+# include "radix_ipf.h"
+#else
+# include <net/route.h>
+#endif
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#if !defined(linux)
+# include <netinet/ip_var.h>
+#endif
+#if defined(__sgi) && defined(IFF_DRVRLOCK) /* IRIX 6 */
+# include <sys/hashing.h>
+# include <netinet/in_var.h>
+#endif
+#include <netinet/tcp.h>
+#if (!defined(__sgi) && !defined(AIX)) || defined(_KERNEL)
+# include <netinet/udp.h>
+# include <netinet/ip_icmp.h>
+#endif
+#ifdef __hpux
+# undef _NET_ROUTE_INCLUDED
+#endif
+#ifdef __osf__
+# undef _RADIX_H_
+#endif
+#include "netinet/ip_compat.h"
+#ifdef USE_INET6
+# include <netinet/icmp6.h>
+# if !SOLARIS && defined(_KERNEL) && !defined(__osf__) && !defined(__hpux)
+# include <netinet6/in6_var.h>
+# endif
+#endif
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_proxy.h"
+#include "netinet/ip_auth.h"
+#ifdef IPFILTER_SCAN
+# include "netinet/ip_scan.h"
+#endif
+#ifdef IPFILTER_SYNC
+# include "netinet/ip_sync.h"
+#endif
+#include "netinet/ip_pool.h"
+#include "netinet/ip_htable.h"
+#ifdef IPFILTER_COMPILED
+# include "netinet/ip_rules.h"
+#endif
+#if defined(IPFILTER_BPF) && defined(_KERNEL)
+# include <net/bpf.h>
+#endif
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+# if defined(_KERNEL) && !defined(IPFILTER_LKM)
+# include "opt_ipfilter.h"
+# endif
+#endif
+#include "netinet/ipl.h"
+/* END OF INCLUDES */
+
+#include <machine/in_cksum.h>
+
+#if !defined(lint)
+static const char sccsid[] = "@(#)fil.c 1.36 6/5/96 (C) 1993-2000 Darren Reed";
+static const char rcsid[] = "@(#)$FreeBSD$";
+/* static const char rcsid[] = "@(#)$Id: fil.c,v 2.243.2.78 2006/03/29 11:19:54 darrenr Exp $"; */
+#endif
+
+#ifndef _KERNEL
+# include "ipf.h"
+# include "ipt.h"
+# include "bpf-ipf.h"
+extern int opts;
+#endif /* _KERNEL */
+
+
+fr_info_t frcache[2][8];
+struct filterstats frstats[2];
+struct frentry *ipfilter[2][2] = { { NULL, NULL }, { NULL, NULL } },
+ *ipfilter6[2][2] = { { NULL, NULL }, { NULL, NULL } },
+ *ipacct6[2][2] = { { NULL, NULL }, { NULL, NULL } },
+ *ipacct[2][2] = { { NULL, NULL }, { NULL, NULL } },
+ *ipnatrules[2][2] = { { NULL, NULL }, { NULL, NULL } };
+struct frgroup *ipfgroups[IPL_LOGSIZE][2];
+char ipfilter_version[] = IPL_VERSION;
+int fr_refcnt = 0;
+/*
+ * For fr_running:
+ * 0 == loading, 1 = running, -1 = disabled, -2 = unloading
+ */
+int fr_running = 0;
+int fr_flags = IPF_LOGGING;
+int fr_active = 0;
+int fr_control_forwarding = 0;
+int fr_update_ipid = 0;
+u_short fr_ip_id = 0;
+int fr_chksrc = 0; /* causes a system crash if enabled */
+int fr_minttl = 4;
+int fr_icmpminfragmtu = 68;
+u_long fr_frouteok[2] = {0, 0};
+u_long fr_userifqs = 0;
+u_long fr_badcoalesces[2] = {0, 0};
+u_char ipf_iss_secret[32];
+#if defined(IPFILTER_DEFAULT_BLOCK)
+int fr_pass = FR_BLOCK|FR_NOMATCH;
+#else
+int fr_pass = (IPF_DEFAULT_PASS)|FR_NOMATCH;
+#endif
+int fr_features = 0
+#ifdef IPFILTER_LKM
+ | IPF_FEAT_LKM
+#endif
+#ifdef IPFILTER_LOG
+ | IPF_FEAT_LOG
+#endif
+#ifdef IPFILTER_LOOKUP
+ | IPF_FEAT_LOOKUP
+#endif
+#ifdef IPFILTER_BPF
+ | IPF_FEAT_BPF
+#endif
+#ifdef IPFILTER_COMPILED
+ | IPF_FEAT_COMPILED
+#endif
+#ifdef IPFILTER_CKSUM
+ | IPF_FEAT_CKSUM
+#endif
+#ifdef IPFILTER_SYNC
+ | IPF_FEAT_SYNC
+#endif
+#ifdef IPFILTER_SCAN
+ | IPF_FEAT_SCAN
+#endif
+#ifdef USE_INET6
+ | IPF_FEAT_IPV6
+#endif
+ ;
+
+static INLINE int fr_ipfcheck __P((fr_info_t *, frentry_t *, int));
+static int fr_portcheck __P((frpcmp_t *, u_short *));
+static int frflushlist __P((int, minor_t, int *, frentry_t **));
+static ipfunc_t fr_findfunc __P((ipfunc_t));
+static frentry_t *fr_firewall __P((fr_info_t *, u_32_t *));
+static int fr_funcinit __P((frentry_t *fr));
+static INLINE void frpr_ah __P((fr_info_t *));
+static INLINE void frpr_esp __P((fr_info_t *));
+static INLINE void frpr_gre __P((fr_info_t *));
+static INLINE void frpr_udp __P((fr_info_t *));
+static INLINE void frpr_tcp __P((fr_info_t *));
+static INLINE void frpr_icmp __P((fr_info_t *));
+static INLINE void frpr_ipv4hdr __P((fr_info_t *));
+static INLINE int frpr_pullup __P((fr_info_t *, int));
+static INLINE void frpr_short __P((fr_info_t *, int));
+static INLINE int frpr_tcpcommon __P((fr_info_t *));
+static INLINE int frpr_udpcommon __P((fr_info_t *));
+static int fr_updateipid __P((fr_info_t *));
+#ifdef IPFILTER_LOOKUP
+static int fr_grpmapinit __P((frentry_t *fr));
+static INLINE void *fr_resolvelookup __P((u_int, u_int, i6addr_t *, lookupfunc_t *));
+#endif
+static void frsynclist __P((frentry_t *, void *));
+static ipftuneable_t *fr_findtunebyname __P((const char *));
+static ipftuneable_t *fr_findtunebycookie __P((void *, void **));
+static int ipf_geniter __P((ipftoken_t *, ipfgeniter_t *));
+static int ipf_frruleiter __P((void *, int, void *));
+static void ipf_unlinktoken __P((ipftoken_t *));
+
+
+/*
+ * bit values for identifying presence of individual IP options
+ * All of these tables should be ordered by increasing key value on the left
+ * hand side to allow for binary searching of the array and include a trailer
+ * with a 0 for the bitmask for linear searches to easily find the end with.
+ */
+const struct optlist ipopts[20] = {
+ { IPOPT_NOP, 0x000001 },
+ { IPOPT_RR, 0x000002 },
+ { IPOPT_ZSU, 0x000004 },
+ { IPOPT_MTUP, 0x000008 },
+ { IPOPT_MTUR, 0x000010 },
+ { IPOPT_ENCODE, 0x000020 },
+ { IPOPT_TS, 0x000040 },
+ { IPOPT_TR, 0x000080 },
+ { IPOPT_SECURITY, 0x000100 },
+ { IPOPT_LSRR, 0x000200 },
+ { IPOPT_E_SEC, 0x000400 },
+ { IPOPT_CIPSO, 0x000800 },
+ { IPOPT_SATID, 0x001000 },
+ { IPOPT_SSRR, 0x002000 },
+ { IPOPT_ADDEXT, 0x004000 },
+ { IPOPT_VISA, 0x008000 },
+ { IPOPT_IMITD, 0x010000 },
+ { IPOPT_EIP, 0x020000 },
+ { IPOPT_FINN, 0x040000 },
+ { 0, 0x000000 }
+};
+
+#ifdef USE_INET6
+struct optlist ip6exthdr[] = {
+ { IPPROTO_HOPOPTS, 0x000001 },
+ { IPPROTO_IPV6, 0x000002 },
+ { IPPROTO_ROUTING, 0x000004 },
+ { IPPROTO_FRAGMENT, 0x000008 },
+ { IPPROTO_ESP, 0x000010 },
+ { IPPROTO_AH, 0x000020 },
+ { IPPROTO_NONE, 0x000040 },
+ { IPPROTO_DSTOPTS, 0x000080 },
+ { IPPROTO_MOBILITY, 0x000100 },
+ { 0, 0 }
+};
+#endif
+
+struct optlist tcpopts[] = {
+ { TCPOPT_NOP, 0x000001 },
+ { TCPOPT_MAXSEG, 0x000002 },
+ { TCPOPT_WINDOW, 0x000004 },
+ { TCPOPT_SACK_PERMITTED, 0x000008 },
+ { TCPOPT_SACK, 0x000010 },
+ { TCPOPT_TIMESTAMP, 0x000020 },
+ { 0, 0x000000 }
+};
+
+/*
+ * bit values for identifying presence of individual IP security options
+ */
+const struct optlist secopt[8] = {
+ { IPSO_CLASS_RES4, 0x01 },
+ { IPSO_CLASS_TOPS, 0x02 },
+ { IPSO_CLASS_SECR, 0x04 },
+ { IPSO_CLASS_RES3, 0x08 },
+ { IPSO_CLASS_CONF, 0x10 },
+ { IPSO_CLASS_UNCL, 0x20 },
+ { IPSO_CLASS_RES2, 0x40 },
+ { IPSO_CLASS_RES1, 0x80 }
+};
+
+
+/*
+ * Table of functions available for use with call rules.
+ */
+static ipfunc_resolve_t fr_availfuncs[] = {
+#ifdef IPFILTER_LOOKUP
+ { "fr_srcgrpmap", fr_srcgrpmap, fr_grpmapinit },
+ { "fr_dstgrpmap", fr_dstgrpmap, fr_grpmapinit },
+#endif
+ { "", NULL, NULL }
+};
+
+
+/*
+ * The next section of code is a a collection of small routines that set
+ * fields in the fr_info_t structure passed based on properties of the
+ * current packet. There are different routines for the same protocol
+ * for each of IPv4 and IPv6. Adding a new protocol, for which there
+ * will "special" inspection for setup, is now more easily done by adding
+ * a new routine and expanding the frpr_ipinit*() function rather than by
+ * adding more code to a growing switch statement.
+ */
+#ifdef USE_INET6
+static INLINE int frpr_ah6 __P((fr_info_t *));
+static INLINE void frpr_esp6 __P((fr_info_t *));
+static INLINE void frpr_gre6 __P((fr_info_t *));
+static INLINE void frpr_udp6 __P((fr_info_t *));
+static INLINE void frpr_tcp6 __P((fr_info_t *));
+static INLINE void frpr_icmp6 __P((fr_info_t *));
+static INLINE int frpr_ipv6hdr __P((fr_info_t *));
+static INLINE void frpr_short6 __P((fr_info_t *, int));
+static INLINE int frpr_hopopts6 __P((fr_info_t *));
+static INLINE int frpr_mobility6 __P((fr_info_t *));
+static INLINE int frpr_routing6 __P((fr_info_t *));
+static INLINE int frpr_dstopts6 __P((fr_info_t *));
+static INLINE void frpr_fragment6 __P((fr_info_t *));
+static INLINE int frpr_ipv6exthdr __P((fr_info_t *, int, int));
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_short6 */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* This is function enforces the 'is a packet too short to be legit' rule */
+/* for IPv6 and marks the packet with FI_SHORT if so. See function comment */
+/* for frpr_short() for more details. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_short6(fin, xmin)
+fr_info_t *fin;
+int xmin;
+{
+
+ if (fin->fin_dlen < xmin)
+ fin->fin_flx |= FI_SHORT;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_ipv6hdr */
+/* Returns: int - 0 = IPv6 packet intact, -1 = packet lost */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* Copy values from the IPv6 header into the fr_info_t struct and call the */
+/* per-protocol analyzer if it exists. In validating the packet, a protocol*/
+/* analyzer may pullup or free the packet itself so we need to be vigiliant */
+/* of that possibility arising. */
+/* ------------------------------------------------------------------------ */
+static INLINE int frpr_ipv6hdr(fin)
+fr_info_t *fin;
+{
+ ip6_t *ip6 = (ip6_t *)fin->fin_ip;
+ int p, go = 1, i, hdrcount;
+ fr_ip_t *fi = &fin->fin_fi;
+
+ fin->fin_off = 0;
+
+ fi->fi_tos = 0;
+ fi->fi_optmsk = 0;
+ fi->fi_secmsk = 0;
+ fi->fi_auth = 0;
+
+ p = ip6->ip6_nxt;
+ fi->fi_ttl = ip6->ip6_hlim;
+ fi->fi_src.in6 = ip6->ip6_src;
+ fi->fi_dst.in6 = ip6->ip6_dst;
+ fin->fin_id = (u_short)(ip6->ip6_flow & 0xffff);
+
+ hdrcount = 0;
+ while (go && !(fin->fin_flx & (FI_BAD|FI_SHORT))) {
+ switch (p)
+ {
+ case IPPROTO_UDP :
+ frpr_udp6(fin);
+ go = 0;
+ break;
+
+ case IPPROTO_TCP :
+ frpr_tcp6(fin);
+ go = 0;
+ break;
+
+ case IPPROTO_ICMPV6 :
+ frpr_icmp6(fin);
+ go = 0;
+ break;
+
+ case IPPROTO_GRE :
+ frpr_gre6(fin);
+ go = 0;
+ break;
+
+ case IPPROTO_HOPOPTS :
+ p = frpr_hopopts6(fin);
+ break;
+
+ case IPPROTO_MOBILITY :
+ p = frpr_mobility6(fin);
+ break;
+
+ case IPPROTO_DSTOPTS :
+ p = frpr_dstopts6(fin);
+ break;
+
+ case IPPROTO_ROUTING :
+ p = frpr_routing6(fin);
+ break;
+
+ case IPPROTO_AH :
+ p = frpr_ah6(fin);
+ break;
+
+ case IPPROTO_ESP :
+ frpr_esp6(fin);
+ go = 0;
+ break;
+
+ case IPPROTO_IPV6 :
+ for (i = 0; ip6exthdr[i].ol_bit != 0; i++)
+ if (ip6exthdr[i].ol_val == p) {
+ fin->fin_flx |= ip6exthdr[i].ol_bit;
+ break;
+ }
+ go = 0;
+ break;
+
+ case IPPROTO_NONE :
+ go = 0;
+ break;
+
+ case IPPROTO_FRAGMENT :
+ frpr_fragment6(fin);
+ go = 0;
+ break;
+
+ default :
+ go = 0;
+ break;
+ }
+ hdrcount++;
+
+ /*
+ * It is important to note that at this point, for the
+ * extension headers (go != 0), the entire header may not have
+ * been pulled up when the code gets to this point. This is
+ * only done for "go != 0" because the other header handlers
+ * will all pullup their complete header. The other indicator
+ * of an incomplete packet is that this was just an extension
+ * header.
+ */
+ if ((go != 0) && (p != IPPROTO_NONE) &&
+ (frpr_pullup(fin, 0) == -1)) {
+ p = IPPROTO_NONE;
+ go = 0;
+ }
+ }
+ fi->fi_p = p;
+
+ /*
+ * Some of the above functions, like frpr_esp6(), can call fr_pullup
+ * and destroy whatever packet was here. The caller of this function
+ * expects us to return -1 if there is a problem with fr_pullup.
+ */
+ if (fin->fin_m == NULL)
+ return -1;
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_ipv6exthdr */
+/* Returns: int - value of the next header or IPPROTO_NONE if error */
+/* Parameters: fin(I) - pointer to packet information */
+/* multiple(I) - flag indicating yes/no if multiple occurances */
+/* of this extension header are allowed. */
+/* proto(I) - protocol number for this extension header */
+/* */
+/* IPv6 Only */
+/* ------------------------------------------------------------------------ */
+static INLINE int frpr_ipv6exthdr(fin, multiple, proto)
+fr_info_t *fin;
+int multiple, proto;
+{
+ struct ip6_ext *hdr;
+ u_short shift;
+ int i;
+
+ fin->fin_flx |= FI_V6EXTHDR;
+
+ /* 8 is default length of extension hdr */
+ if ((fin->fin_dlen - 8) < 0) {
+ fin->fin_flx |= FI_SHORT;
+ return IPPROTO_NONE;
+ }
+
+ if (frpr_pullup(fin, 8) == -1)
+ return IPPROTO_NONE;
+
+ hdr = fin->fin_dp;
+ switch (proto)
+ {
+ case IPPROTO_FRAGMENT :
+ shift = 8;
+ break;
+ default :
+ shift = 8 + (hdr->ip6e_len << 3);
+ break;
+ }
+
+ if (shift > fin->fin_dlen) { /* Nasty extension header length? */
+ fin->fin_flx |= FI_BAD;
+ return IPPROTO_NONE;
+ }
+
+ for (i = 0; ip6exthdr[i].ol_bit != 0; i++)
+ if (ip6exthdr[i].ol_val == proto) {
+ /*
+ * Most IPv6 extension headers are only allowed once.
+ */
+ if ((multiple == 0) &&
+ ((fin->fin_optmsk & ip6exthdr[i].ol_bit) != 0))
+ fin->fin_flx |= FI_BAD;
+ else
+ fin->fin_optmsk |= ip6exthdr[i].ol_bit;
+ break;
+ }
+
+ fin->fin_exthdr = fin->fin_dp;
+ fin->fin_dp = (char *)fin->fin_dp + shift;
+ fin->fin_dlen -= shift;
+
+ return hdr->ip6e_nxt;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_hopopts6 */
+/* Returns: int - value of the next header or IPPROTO_NONE if error */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* This is function checks pending hop by hop options extension header */
+/* ------------------------------------------------------------------------ */
+static INLINE int frpr_hopopts6(fin)
+fr_info_t *fin;
+{
+ return frpr_ipv6exthdr(fin, 0, IPPROTO_HOPOPTS);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_mobility6 */
+/* Returns: int - value of the next header or IPPROTO_NONE if error */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* This is function checks the IPv6 mobility extension header */
+/* ------------------------------------------------------------------------ */
+static INLINE int frpr_mobility6(fin)
+fr_info_t *fin;
+{
+ return frpr_ipv6exthdr(fin, 0, IPPROTO_MOBILITY);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_routing6 */
+/* Returns: int - value of the next header or IPPROTO_NONE if error */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* This is function checks pending routing extension header */
+/* ------------------------------------------------------------------------ */
+static INLINE int frpr_routing6(fin)
+fr_info_t *fin;
+{
+ struct ip6_ext *hdr;
+
+ if (frpr_ipv6exthdr(fin, 0, IPPROTO_ROUTING) == IPPROTO_NONE)
+ return IPPROTO_NONE;
+ hdr = fin->fin_exthdr;
+
+ if ((hdr->ip6e_len & 1) != 0) {
+ /*
+ * The routing header data is made up of 128 bit IPv6 addresses
+ * which means it must be a multiple of 2 lots of 8 in length.
+ */
+ fin->fin_flx |= FI_BAD;
+ /*
+ * Compensate for the changes made in frpr_ipv6exthdr()
+ */
+ fin->fin_dlen += 8 + (hdr->ip6e_len << 3);
+ fin->fin_dp = hdr;
+ return IPPROTO_NONE;
+ }
+
+ return hdr->ip6e_nxt;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_fragment6 */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* Examine the IPv6 fragment header and extract fragment offset information.*/
+/* */
+/* We don't know where the transport layer header (or whatever is next is), */
+/* as it could be behind destination options (amongst others). Because */
+/* there is no fragment cache, there is no knowledge about whether or not an*/
+/* upper layer header has been seen (or where it ends) and thus we are not */
+/* able to continue processing beyond this header with any confidence. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_fragment6(fin)
+fr_info_t *fin;
+{
+ struct ip6_frag *frag;
+ int extoff;
+
+ fin->fin_flx |= FI_FRAG;
+
+ if (frpr_ipv6exthdr(fin, 0, IPPROTO_FRAGMENT) == IPPROTO_NONE)
+ return;
+
+ extoff = (char *)fin->fin_exthdr - (char *)fin->fin_dp;
+
+ if (frpr_pullup(fin, sizeof(*frag)) == -1)
+ return;
+
+ fin->fin_exthdr = (char *)fin->fin_dp + extoff;
+ frag = fin->fin_exthdr;
+ /*
+ * Fragment but no fragmentation info set? Bad packet...
+ */
+ if (frag->ip6f_offlg == 0) {
+ fin->fin_flx |= FI_BAD;
+ return;
+ }
+
+ fin->fin_off = frag->ip6f_offlg & IP6F_OFF_MASK;
+ fin->fin_off <<= 3;
+ if (fin->fin_off != 0)
+ fin->fin_flx |= FI_FRAGBODY;
+
+ fin->fin_dp = (char *)fin->fin_dp + sizeof(*frag);
+ fin->fin_dlen -= sizeof(*frag);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_dstopts6 */
+/* Returns: int - value of the next header or IPPROTO_NONE if error */
+/* Parameters: fin(I) - pointer to packet information */
+/* nextheader(I) - stores next header value */
+/* */
+/* IPv6 Only */
+/* This is function checks pending destination options extension header */
+/* ------------------------------------------------------------------------ */
+static INLINE int frpr_dstopts6(fin)
+fr_info_t *fin;
+{
+ return frpr_ipv6exthdr(fin, 1, IPPROTO_DSTOPTS);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_icmp6 */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* This routine is mainly concerned with determining the minimum valid size */
+/* for an ICMPv6 packet. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_icmp6(fin)
+fr_info_t *fin;
+{
+ int minicmpsz = sizeof(struct icmp6_hdr);
+ struct icmp6_hdr *icmp6;
+
+ if (frpr_pullup(fin, ICMP6ERR_MINPKTLEN - sizeof(ip6_t)) == -1)
+ return;
+
+ if (fin->fin_dlen > 1) {
+ ip6_t *ip6;
+
+ icmp6 = fin->fin_dp;
+
+ fin->fin_data[0] = *(u_short *)icmp6;
+
+ switch (icmp6->icmp6_type)
+ {
+ case ICMP6_ECHO_REPLY :
+ case ICMP6_ECHO_REQUEST :
+ minicmpsz = ICMP6ERR_MINPKTLEN - sizeof(ip6_t);
+ break;
+ case ICMP6_DST_UNREACH :
+ case ICMP6_PACKET_TOO_BIG :
+ case ICMP6_TIME_EXCEEDED :
+ case ICMP6_PARAM_PROB :
+ fin->fin_flx |= FI_ICMPERR;
+ if ((fin->fin_m != NULL) &&
+ (M_LEN(fin->fin_m) < fin->fin_plen)) {
+ if (fr_coalesce(fin) != 1)
+ return;
+ }
+
+ if (frpr_pullup(fin, ICMP6ERR_MINPKTLEN) == -1)
+ return;
+
+ /*
+ * If the destination of this packet doesn't match the
+ * source of the original packet then this packet is
+ * not correct.
+ */
+ icmp6 = fin->fin_dp;
+ ip6 = (ip6_t *)((char *)icmp6 + ICMPERR_ICMPHLEN);
+ if (IP6_NEQ(&fin->fin_fi.fi_dst,
+ (i6addr_t *)&ip6->ip6_src))
+ fin->fin_flx |= FI_BAD;
+
+ minicmpsz = ICMP6ERR_IPICMPHLEN - sizeof(ip6_t);
+ break;
+ default :
+ break;
+ }
+ }
+
+ frpr_short6(fin, minicmpsz);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_udp6 */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* Analyse the packet for IPv6/UDP properties. */
+/* Is not expected to be called for fragmented packets. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_udp6(fin)
+fr_info_t *fin;
+{
+
+ frpr_short6(fin, sizeof(struct udphdr));
+
+ if (frpr_udpcommon(fin) == 0) {
+ u_char p = fin->fin_p;
+
+ fin->fin_p = IPPROTO_UDP;
+ fr_checkv6sum(fin);
+ fin->fin_p = p;
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_tcp6 */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* Analyse the packet for IPv6/TCP properties. */
+/* Is not expected to be called for fragmented packets. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_tcp6(fin)
+fr_info_t *fin;
+{
+
+ frpr_short6(fin, sizeof(struct tcphdr));
+
+ if (frpr_tcpcommon(fin) == 0) {
+ u_char p = fin->fin_p;
+
+ fin->fin_p = IPPROTO_TCP;
+ fr_checkv6sum(fin);
+ fin->fin_p = p;
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_esp6 */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* Analyse the packet for ESP properties. */
+/* The minimum length is taken to be the SPI (32bits) plus a tail (32bits) */
+/* even though the newer ESP packets must also have a sequence number that */
+/* is 32bits as well, it is not possible(?) to determine the version from a */
+/* simple packet header. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_esp6(fin)
+fr_info_t *fin;
+{
+
+ frpr_short6(fin, sizeof(grehdr_t));
+
+ (void) frpr_pullup(fin, 8);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_ah6 */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv6 Only */
+/* Analyse the packet for AH properties. */
+/* The minimum length is taken to be the combination of all fields in the */
+/* header being present and no authentication data (null algorithm used.) */
+/* ------------------------------------------------------------------------ */
+static INLINE int frpr_ah6(fin)
+fr_info_t *fin;
+{
+ authhdr_t *ah;
+
+ frpr_short6(fin, 12);
+
+ if (frpr_pullup(fin, sizeof(*ah)) == -1)
+ return IPPROTO_NONE;
+
+ ah = (authhdr_t *)fin->fin_dp;
+ return ah->ah_next;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_gre6 */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* Analyse the packet for GRE properties. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_gre6(fin)
+fr_info_t *fin;
+{
+ grehdr_t *gre;
+
+ frpr_short6(fin, sizeof(grehdr_t));
+
+ if (frpr_pullup(fin, sizeof(grehdr_t)) == -1)
+ return;
+
+ gre = fin->fin_dp;
+ if (GRE_REV(gre->gr_flags) == 1)
+ fin->fin_data[0] = gre->gr_call;
+}
+#endif /* USE_INET6 */
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_pullup */
+/* Returns: int - 0 == pullup succeeded, -1 == failure */
+/* Parameters: fin(I) - pointer to packet information */
+/* plen(I) - length (excluding L3 header) to pullup */
+/* */
+/* Short inline function to cut down on code duplication to perform a call */
+/* to fr_pullup to ensure there is the required amount of data, */
+/* consecutively in the packet buffer. */
+/* ------------------------------------------------------------------------ */
+static INLINE int frpr_pullup(fin, plen)
+fr_info_t *fin;
+int plen;
+{
+ if (fin->fin_m != NULL) {
+ if (fin->fin_dp != NULL)
+ plen += (char *)fin->fin_dp -
+ ((char *)fin->fin_ip + fin->fin_hlen);
+ plen += fin->fin_hlen;
+ if (M_LEN(fin->fin_m) < plen) {
+#if defined(_KERNEL)
+ if (fr_pullup(fin->fin_m, fin, plen) == NULL)
+ return -1;
+#else
+ /*
+ * Fake fr_pullup failing
+ */
+ *fin->fin_mp = NULL;
+ fin->fin_m = NULL;
+ fin->fin_ip = NULL;
+ return -1;
+#endif
+ }
+ }
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_short */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* xmin(I) - minimum header size */
+/* */
+/* Check if a packet is "short" as defined by xmin. The rule we are */
+/* applying here is that the packet must not be fragmented within the layer */
+/* 4 header. That is, it must not be a fragment that has its offset set to */
+/* start within the layer 4 header (hdrmin) or if it is at offset 0, the */
+/* entire layer 4 header must be present (min). */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_short(fin, xmin)
+fr_info_t *fin;
+int xmin;
+{
+
+ if (fin->fin_off == 0) {
+ if (fin->fin_dlen < xmin)
+ fin->fin_flx |= FI_SHORT;
+ } else if (fin->fin_off < xmin) {
+ fin->fin_flx |= FI_SHORT;
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_icmp */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv4 Only */
+/* Do a sanity check on the packet for ICMP (v4). In nearly all cases, */
+/* except extrememly bad packets, both type and code will be present. */
+/* The expected minimum size of an ICMP packet is very much dependent on */
+/* the type of it. */
+/* */
+/* XXX - other ICMP sanity checks? */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_icmp(fin)
+fr_info_t *fin;
+{
+ int minicmpsz = sizeof(struct icmp);
+ icmphdr_t *icmp;
+ ip_t *oip;
+
+ if (fin->fin_off != 0) {
+ frpr_short(fin, ICMPERR_ICMPHLEN);
+ return;
+ }
+
+ if (frpr_pullup(fin, ICMPERR_ICMPHLEN) == -1)
+ return;
+
+ if (fin->fin_dlen > 1) {
+ icmp = fin->fin_dp;
+
+ fin->fin_data[0] = *(u_short *)icmp;
+
+ switch (icmp->icmp_type)
+ {
+ case ICMP_ECHOREPLY :
+ case ICMP_ECHO :
+ /* Router discovery messaes - RFC 1256 */
+ case ICMP_ROUTERADVERT :
+ case ICMP_ROUTERSOLICIT :
+ minicmpsz = ICMP_MINLEN;
+ break;
+ /*
+ * type(1) + code(1) + cksum(2) + id(2) seq(2) +
+ * 3 * timestamp(3 * 4)
+ */
+ case ICMP_TSTAMP :
+ case ICMP_TSTAMPREPLY :
+ minicmpsz = 20;
+ break;
+ /*
+ * type(1) + code(1) + cksum(2) + id(2) seq(2) +
+ * mask(4)
+ */
+ case ICMP_MASKREQ :
+ case ICMP_MASKREPLY :
+ minicmpsz = 12;
+ break;
+ /*
+ * type(1) + code(1) + cksum(2) + id(2) seq(2) + ip(20+)
+ */
+ case ICMP_UNREACH :
+#ifdef icmp_nextmtu
+ if (icmp->icmp_code == ICMP_UNREACH_NEEDFRAG) {
+ if (icmp->icmp_nextmtu < fr_icmpminfragmtu)
+ fin->fin_flx |= FI_BAD;
+ }
+#endif
+ case ICMP_SOURCEQUENCH :
+ case ICMP_REDIRECT :
+ case ICMP_TIMXCEED :
+ case ICMP_PARAMPROB :
+ fin->fin_flx |= FI_ICMPERR;
+ if (fr_coalesce(fin) != 1)
+ return;
+ /*
+ * ICMP error packets should not be generated for IP
+ * packets that are a fragment that isn't the first
+ * fragment.
+ */
+ oip = (ip_t *)((char *)fin->fin_dp + ICMPERR_ICMPHLEN);
+ if ((ntohs(oip->ip_off) & IP_OFFMASK) != 0)
+ fin->fin_flx |= FI_BAD;
+
+ /*
+ * If the destination of this packet doesn't match the
+ * source of the original packet then this packet is
+ * not correct.
+ */
+ if (oip->ip_src.s_addr != fin->fin_daddr)
+ fin->fin_flx |= FI_BAD;
+
+ /*
+ * If the destination of this packet doesn't match the
+ * source of the original packet then this packet is
+ * not correct.
+ */
+ if (oip->ip_src.s_addr != fin->fin_daddr)
+ fin->fin_flx |= FI_BAD;
+ break;
+ default :
+ break;
+ }
+
+ if (fin->fin_dlen >= 6) /* ID field */
+ fin->fin_data[1] = icmp->icmp_id;
+ }
+
+ frpr_short(fin, minicmpsz);
+
+ fr_checkv4sum(fin);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_tcpcommon */
+/* Returns: int - 0 = header ok, 1 = bad packet, -1 = buffer error */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* TCP header sanity checking. Look for bad combinations of TCP flags, */
+/* and make some checks with how they interact with other fields. */
+/* If compiled with IPFILTER_CKSUM, check to see if the TCP checksum is */
+/* valid and mark the packet as bad if not. */
+/* ------------------------------------------------------------------------ */
+static INLINE int frpr_tcpcommon(fin)
+fr_info_t *fin;
+{
+ int flags, tlen;
+ tcphdr_t *tcp;
+
+ fin->fin_flx |= FI_TCPUDP;
+ if (fin->fin_off != 0)
+ return 0;
+
+ if (frpr_pullup(fin, sizeof(*tcp)) == -1)
+ return -1;
+ tcp = fin->fin_dp;
+
+ if (fin->fin_dlen > 3) {
+ fin->fin_sport = ntohs(tcp->th_sport);
+ fin->fin_dport = ntohs(tcp->th_dport);
+ }
+
+ if ((fin->fin_flx & FI_SHORT) != 0)
+ return 1;
+
+ /*
+ * Use of the TCP data offset *must* result in a value that is at
+ * least the same size as the TCP header.
+ */
+ tlen = TCP_OFF(tcp) << 2;
+ if (tlen < sizeof(tcphdr_t)) {
+ fin->fin_flx |= FI_BAD;
+ return 1;
+ }
+
+ flags = tcp->th_flags;
+ fin->fin_tcpf = tcp->th_flags;
+
+ /*
+ * If the urgent flag is set, then the urgent pointer must
+ * also be set and vice versa. Good TCP packets do not have
+ * just one of these set.
+ */
+ if ((flags & TH_URG) != 0 && (tcp->th_urp == 0)) {
+ fin->fin_flx |= FI_BAD;
+#if 0
+ } else if ((flags & TH_URG) == 0 && (tcp->th_urp != 0)) {
+ /*
+ * Ignore this case (#if 0) as it shows up in "real"
+ * traffic with bogus values in the urgent pointer field.
+ */
+ fin->fin_flx |= FI_BAD;
+#endif
+ } else if (((flags & (TH_SYN|TH_FIN)) != 0) &&
+ ((flags & (TH_RST|TH_ACK)) == TH_RST)) {
+ /* TH_FIN|TH_RST|TH_ACK seems to appear "naturally" */
+ fin->fin_flx |= FI_BAD;
+#if 1
+ } else if (((flags & TH_SYN) != 0) &&
+ ((flags & (TH_URG|TH_PUSH)) != 0)) {
+ /*
+ * SYN with URG and PUSH set is not for normal TCP but it is
+ * possible(?) with T/TCP...but who uses T/TCP?
+ */
+ fin->fin_flx |= FI_BAD;
+#endif
+ } else if (!(flags & TH_ACK)) {
+ /*
+ * If the ack bit isn't set, then either the SYN or
+ * RST bit must be set. If the SYN bit is set, then
+ * we expect the ACK field to be 0. If the ACK is
+ * not set and if URG, PSH or FIN are set, consdier
+ * that to indicate a bad TCP packet.
+ */
+ if ((flags == TH_SYN) && (tcp->th_ack != 0)) {
+ /*
+ * Cisco PIX sets the ACK field to a random value.
+ * In light of this, do not set FI_BAD until a patch
+ * is available from Cisco to ensure that
+ * interoperability between existing systems is
+ * achieved.
+ */
+ /*fin->fin_flx |= FI_BAD*/;
+ } else if (!(flags & (TH_RST|TH_SYN))) {
+ fin->fin_flx |= FI_BAD;
+ } else if ((flags & (TH_URG|TH_PUSH|TH_FIN)) != 0) {
+ fin->fin_flx |= FI_BAD;
+ }
+ }
+
+ /*
+ * At this point, it's not exactly clear what is to be gained by
+ * marking up which TCP options are and are not present. The one we
+ * are most interested in is the TCP window scale. This is only in
+ * a SYN packet [RFC1323] so we don't need this here...?
+ * Now if we were to analyse the header for passive fingerprinting,
+ * then that might add some weight to adding this...
+ */
+ if (tlen == sizeof(tcphdr_t))
+ return 0;
+
+ if (frpr_pullup(fin, tlen) == -1)
+ return -1;
+
+#if 0
+ ip = fin->fin_ip;
+ s = (u_char *)(tcp + 1);
+ off = IP_HL(ip) << 2;
+# ifdef _KERNEL
+ if (fin->fin_mp != NULL) {
+ mb_t *m = *fin->fin_mp;
+
+ if (off + tlen > M_LEN(m))
+ return;
+ }
+# endif
+ for (tlen -= (int)sizeof(*tcp); tlen > 0; ) {
+ opt = *s;
+ if (opt == '\0')
+ break;
+ else if (opt == TCPOPT_NOP)
+ ol = 1;
+ else {
+ if (tlen < 2)
+ break;
+ ol = (int)*(s + 1);
+ if (ol < 2 || ol > tlen)
+ break;
+ }
+
+ for (i = 9, mv = 4; mv >= 0; ) {
+ op = ipopts + i;
+ if (opt == (u_char)op->ol_val) {
+ optmsk |= op->ol_bit;
+ break;
+ }
+ }
+ tlen -= ol;
+ s += ol;
+ }
+#endif /* 0 */
+
+ return 0;
+}
+
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_udpcommon */
+/* Returns: int - 0 = header ok, 1 = bad packet */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* Extract the UDP source and destination ports, if present. If compiled */
+/* with IPFILTER_CKSUM, check to see if the UDP checksum is valid. */
+/* ------------------------------------------------------------------------ */
+static INLINE int frpr_udpcommon(fin)
+fr_info_t *fin;
+{
+ udphdr_t *udp;
+
+ fin->fin_flx |= FI_TCPUDP;
+
+ if (!fin->fin_off && (fin->fin_dlen > 3)) {
+ if (frpr_pullup(fin, sizeof(*udp)) == -1) {
+ fin->fin_flx |= FI_SHORT;
+ return 1;
+ }
+
+ udp = fin->fin_dp;
+
+ fin->fin_sport = ntohs(udp->uh_sport);
+ fin->fin_dport = ntohs(udp->uh_dport);
+ }
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_tcp */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv4 Only */
+/* Analyse the packet for IPv4/TCP properties. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_tcp(fin)
+fr_info_t *fin;
+{
+
+ frpr_short(fin, sizeof(tcphdr_t));
+
+ if (frpr_tcpcommon(fin) == 0)
+ fr_checkv4sum(fin);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_udp */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv4 Only */
+/* Analyse the packet for IPv4/UDP properties. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_udp(fin)
+fr_info_t *fin;
+{
+
+ frpr_short(fin, sizeof(udphdr_t));
+
+ if (frpr_udpcommon(fin) == 0)
+ fr_checkv4sum(fin);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_esp */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* Analyse the packet for ESP properties. */
+/* The minimum length is taken to be the SPI (32bits) plus a tail (32bits) */
+/* even though the newer ESP packets must also have a sequence number that */
+/* is 32bits as well, it is not possible(?) to determine the version from a */
+/* simple packet header. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_esp(fin)
+fr_info_t *fin;
+{
+
+ if (fin->fin_off == 0) {
+ frpr_short(fin, 8);
+ (void) frpr_pullup(fin, 8);
+ }
+
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_ah */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* Analyse the packet for AH properties. */
+/* The minimum length is taken to be the combination of all fields in the */
+/* header being present and no authentication data (null algorithm used.) */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_ah(fin)
+fr_info_t *fin;
+{
+ authhdr_t *ah;
+ int len;
+
+ frpr_short(fin, sizeof(*ah));
+
+ if (((fin->fin_flx & FI_SHORT) != 0) || (fin->fin_off != 0))
+ return;
+
+ if (frpr_pullup(fin, sizeof(*ah)) == -1)
+ return;
+
+ ah = (authhdr_t *)fin->fin_dp;
+
+ len = (ah->ah_plen + 2) << 2;
+ frpr_short(fin, len);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_gre */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* Analyse the packet for GRE properties. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_gre(fin)
+fr_info_t *fin;
+{
+ grehdr_t *gre;
+
+ frpr_short(fin, sizeof(*gre));
+
+ if (fin->fin_off != 0)
+ return;
+
+ if (frpr_pullup(fin, sizeof(*gre)) == -1)
+ return;
+
+ if (fin->fin_off == 0) {
+ gre = fin->fin_dp;
+ if (GRE_REV(gre->gr_flags) == 1)
+ fin->fin_data[0] = gre->gr_call;
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frpr_ipv4hdr */
+/* Returns: void */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* IPv4 Only */
+/* Analyze the IPv4 header and set fields in the fr_info_t structure. */
+/* Check all options present and flag their presence if any exist. */
+/* ------------------------------------------------------------------------ */
+static INLINE void frpr_ipv4hdr(fin)
+fr_info_t *fin;
+{
+ u_short optmsk = 0, secmsk = 0, auth = 0;
+ int hlen, ol, mv, p, i;
+ const struct optlist *op;
+ u_char *s, opt;
+ u_short off;
+ fr_ip_t *fi;
+ ip_t *ip;
+
+ fi = &fin->fin_fi;
+ hlen = fin->fin_hlen;
+
+ ip = fin->fin_ip;
+ p = ip->ip_p;
+ fi->fi_p = p;
+ fi->fi_tos = ip->ip_tos;
+ fin->fin_id = ip->ip_id;
+ off = ip->ip_off;
+
+ /* Get both TTL and protocol */
+ fi->fi_p = ip->ip_p;
+ fi->fi_ttl = ip->ip_ttl;
+#if 0
+ (*(((u_short *)fi) + 1)) = (*(((u_short *)ip) + 4));
+#endif
+
+ /* Zero out bits not used in IPv6 address */
+ fi->fi_src.i6[1] = 0;
+ fi->fi_src.i6[2] = 0;
+ fi->fi_src.i6[3] = 0;
+ fi->fi_dst.i6[1] = 0;
+ fi->fi_dst.i6[2] = 0;
+ fi->fi_dst.i6[3] = 0;
+
+ fi->fi_saddr = ip->ip_src.s_addr;
+ fi->fi_daddr = ip->ip_dst.s_addr;
+
+ /*
+ * set packet attribute flags based on the offset and
+ * calculate the byte offset that it represents.
+ */
+ off &= IP_MF|IP_OFFMASK;
+ if (off != 0) {
+ int morefrag = off & IP_MF;
+
+ fi->fi_flx |= FI_FRAG;
+ off &= IP_OFFMASK;
+ if (off != 0) {
+ fin->fin_flx |= FI_FRAGBODY;
+ off <<= 3;
+ if ((off + fin->fin_dlen > 65535) ||
+ (fin->fin_dlen == 0) ||
+ ((morefrag != 0) && ((fin->fin_dlen & 7) != 0))) {
+ /*
+ * The length of the packet, starting at its
+ * offset cannot exceed 65535 (0xffff) as the
+ * length of an IP packet is only 16 bits.
+ *
+ * Any fragment that isn't the last fragment
+ * must have a length greater than 0 and it
+ * must be an even multiple of 8.
+ */
+ fi->fi_flx |= FI_BAD;
+ }
+ }
+ }
+ fin->fin_off = off;
+
+ /*
+ * Call per-protocol setup and checking
+ */
+ switch (p)
+ {
+ case IPPROTO_UDP :
+ frpr_udp(fin);
+ break;
+ case IPPROTO_TCP :
+ frpr_tcp(fin);
+ break;
+ case IPPROTO_ICMP :
+ frpr_icmp(fin);
+ break;
+ case IPPROTO_AH :
+ frpr_ah(fin);
+ break;
+ case IPPROTO_ESP :
+ frpr_esp(fin);
+ break;
+ case IPPROTO_GRE :
+ frpr_gre(fin);
+ break;
+ }
+
+ ip = fin->fin_ip;
+ if (ip == NULL)
+ return;
+
+ /*
+ * If it is a standard IP header (no options), set the flag fields
+ * which relate to options to 0.
+ */
+ if (hlen == sizeof(*ip)) {
+ fi->fi_optmsk = 0;
+ fi->fi_secmsk = 0;
+ fi->fi_auth = 0;
+ return;
+ }
+
+ /*
+ * So the IP header has some IP options attached. Walk the entire
+ * list of options present with this packet and set flags to indicate
+ * which ones are here and which ones are not. For the somewhat out
+ * of date and obscure security classification options, set a flag to
+ * represent which classification is present.
+ */
+ fi->fi_flx |= FI_OPTIONS;
+
+ for (s = (u_char *)(ip + 1), hlen -= (int)sizeof(*ip); hlen > 0; ) {
+ opt = *s;
+ if (opt == '\0')
+ break;
+ else if (opt == IPOPT_NOP)
+ ol = 1;
+ else {
+ if (hlen < 2)
+ break;
+ ol = (int)*(s + 1);
+ if (ol < 2 || ol > hlen)
+ break;
+ }
+ for (i = 9, mv = 4; mv >= 0; ) {
+ op = ipopts + i;
+ if ((opt == (u_char)op->ol_val) && (ol > 4)) {
+ optmsk |= op->ol_bit;
+ if (opt == IPOPT_SECURITY) {
+ const struct optlist *sp;
+ u_char sec;
+ int j, m;
+
+ sec = *(s + 2); /* classification */
+ for (j = 3, m = 2; m >= 0; ) {
+ sp = secopt + j;
+ if (sec == sp->ol_val) {
+ secmsk |= sp->ol_bit;
+ auth = *(s + 3);
+ auth *= 256;
+ auth += *(s + 4);
+ break;
+ }
+ if (sec < sp->ol_val)
+ j -= m;
+ else
+ j += m;
+ m--;
+ }
+ }
+ break;
+ }
+ if (opt < op->ol_val)
+ i -= mv;
+ else
+ i += mv;
+ mv--;
+ }
+ hlen -= ol;
+ s += ol;
+ }
+
+ /*
+ *
+ */
+ if (auth && !(auth & 0x0100))
+ auth &= 0xff00;
+ fi->fi_optmsk = optmsk;
+ fi->fi_secmsk = secmsk;
+ fi->fi_auth = auth;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_makefrip */
+/* Returns: void */
+/* Parameters: hlen(I) - length of IP packet header */
+/* ip(I) - pointer to the IP header */
+/* fin(IO) - pointer to packet information */
+/* */
+/* Compact the IP header into a structure which contains just the info. */
+/* which is useful for comparing IP headers with and store this information */
+/* in the fr_info_t structure pointer to by fin. At present, it is assumed */
+/* this function will be called with either an IPv4 or IPv6 packet. */
+/* ------------------------------------------------------------------------ */
+int fr_makefrip(hlen, ip, fin)
+int hlen;
+ip_t *ip;
+fr_info_t *fin;
+{
+ int v;
+
+ fin->fin_nat = NULL;
+ fin->fin_state = NULL;
+ fin->fin_depth = 0;
+ fin->fin_hlen = (u_short)hlen;
+ fin->fin_ip = ip;
+ fin->fin_rule = 0xffffffff;
+ fin->fin_group[0] = -1;
+ fin->fin_group[1] = '\0';
+ fin->fin_dp = (char *)ip + hlen;
+
+ v = fin->fin_v;
+ if (v == 4) {
+ fin->fin_plen = ip->ip_len;
+ fin->fin_dlen = fin->fin_plen - hlen;
+
+ frpr_ipv4hdr(fin);
+#ifdef USE_INET6
+ } else if (v == 6) {
+ fin->fin_plen = ntohs(((ip6_t *)ip)->ip6_plen);
+ fin->fin_dlen = fin->fin_plen;
+ fin->fin_plen += hlen;
+
+ if (frpr_ipv6hdr(fin) == -1)
+ return -1;
+#endif
+ }
+ if (fin->fin_ip == NULL)
+ return -1;
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_portcheck */
+/* Returns: int - 1 == port matched, 0 == port match failed */
+/* Parameters: frp(I) - pointer to port check `expression' */
+/* pop(I) - pointer to port number to evaluate */
+/* */
+/* Perform a comparison of a port number against some other(s), using a */
+/* structure with compare information stored in it. */
+/* ------------------------------------------------------------------------ */
+static INLINE int fr_portcheck(frp, pop)
+frpcmp_t *frp;
+u_short *pop;
+{
+ u_short tup, po;
+ int err = 1;
+
+ tup = *pop;
+ po = frp->frp_port;
+
+ /*
+ * Do opposite test to that required and continue if that succeeds.
+ */
+ switch (frp->frp_cmp)
+ {
+ case FR_EQUAL :
+ if (tup != po) /* EQUAL */
+ err = 0;
+ break;
+ case FR_NEQUAL :
+ if (tup == po) /* NOTEQUAL */
+ err = 0;
+ break;
+ case FR_LESST :
+ if (tup >= po) /* LESSTHAN */
+ err = 0;
+ break;
+ case FR_GREATERT :
+ if (tup <= po) /* GREATERTHAN */
+ err = 0;
+ break;
+ case FR_LESSTE :
+ if (tup > po) /* LT or EQ */
+ err = 0;
+ break;
+ case FR_GREATERTE :
+ if (tup < po) /* GT or EQ */
+ err = 0;
+ break;
+ case FR_OUTRANGE :
+ if (tup >= po && tup <= frp->frp_top) /* Out of range */
+ err = 0;
+ break;
+ case FR_INRANGE :
+ if (tup <= po || tup >= frp->frp_top) /* In range */
+ err = 0;
+ break;
+ case FR_INCRANGE :
+ if (tup < po || tup > frp->frp_top) /* Inclusive range */
+ err = 0;
+ break;
+ default :
+ break;
+ }
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_tcpudpchk */
+/* Returns: int - 1 == protocol matched, 0 == check failed */
+/* Parameters: fin(I) - pointer to packet information */
+/* ft(I) - pointer to structure with comparison data */
+/* */
+/* Compares the current pcket (assuming it is TCP/UDP) information with a */
+/* structure containing information that we want to match against. */
+/* ------------------------------------------------------------------------ */
+int fr_tcpudpchk(fin, ft)
+fr_info_t *fin;
+frtuc_t *ft;
+{
+ int err = 1;
+
+ /*
+ * Both ports should *always* be in the first fragment.
+ * So far, I cannot find any cases where they can not be.
+ *
+ * compare destination ports
+ */
+ if (ft->ftu_dcmp)
+ err = fr_portcheck(&ft->ftu_dst, &fin->fin_dport);
+
+ /*
+ * compare source ports
+ */
+ if (err && ft->ftu_scmp)
+ err = fr_portcheck(&ft->ftu_src, &fin->fin_sport);
+
+ /*
+ * If we don't have all the TCP/UDP header, then how can we
+ * expect to do any sort of match on it ? If we were looking for
+ * TCP flags, then NO match. If not, then match (which should
+ * satisfy the "short" class too).
+ */
+ if (err && (fin->fin_p == IPPROTO_TCP)) {
+ if (fin->fin_flx & FI_SHORT)
+ return !(ft->ftu_tcpf | ft->ftu_tcpfm);
+ /*
+ * Match the flags ? If not, abort this match.
+ */
+ if (ft->ftu_tcpfm &&
+ ft->ftu_tcpf != (fin->fin_tcpf & ft->ftu_tcpfm)) {
+ FR_DEBUG(("f. %#x & %#x != %#x\n", fin->fin_tcpf,
+ ft->ftu_tcpfm, ft->ftu_tcpf));
+ err = 0;
+ }
+ }
+ return err;
+}
+
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_ipfcheck */
+/* Returns: int - 0 == match, 1 == no match */
+/* Parameters: fin(I) - pointer to packet information */
+/* fr(I) - pointer to filter rule */
+/* portcmp(I) - flag indicating whether to attempt matching on */
+/* TCP/UDP port data. */
+/* */
+/* Check to see if a packet matches an IPFilter rule. Checks of addresses, */
+/* port numbers, etc, for "standard" IPFilter rules are all orchestrated in */
+/* this function. */
+/* ------------------------------------------------------------------------ */
+static INLINE int fr_ipfcheck(fin, fr, portcmp)
+fr_info_t *fin;
+frentry_t *fr;
+int portcmp;
+{
+ u_32_t *ld, *lm, *lip;
+ fripf_t *fri;
+ fr_ip_t *fi;
+ int i;
+
+ fi = &fin->fin_fi;
+ fri = fr->fr_ipf;
+ lip = (u_32_t *)fi;
+ lm = (u_32_t *)&fri->fri_mip;
+ ld = (u_32_t *)&fri->fri_ip;
+
+ /*
+ * first 32 bits to check coversion:
+ * IP version, TOS, TTL, protocol
+ */
+ i = ((*lip & *lm) != *ld);
+ FR_DEBUG(("0. %#08x & %#08x != %#08x\n",
+ ntohl(*lip), ntohl(*lm), ntohl(*ld)));
+ if (i)
+ return 1;
+
+ /*
+ * Next 32 bits is a constructed bitmask indicating which IP options
+ * are present (if any) in this packet.
+ */
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("1. %#08x & %#08x != %#08x\n",
+ ntohl(*lip), ntohl(*lm), ntohl(*ld)));
+ if (i)
+ return 1;
+
+ lip++, lm++, ld++;
+ /*
+ * Unrolled loops (4 each, for 32 bits) for address checks.
+ */
+ /*
+ * Check the source address.
+ */
+#ifdef IPFILTER_LOOKUP
+ if (fr->fr_satype == FRI_LOOKUP) {
+ i = (*fr->fr_srcfunc)(fr->fr_srcptr, fi->fi_v, lip);
+ if (i == -1)
+ return 1;
+ lip += 3;
+ lm += 3;
+ ld += 3;
+ } else {
+#endif
+ i = ((*lip & *lm) != *ld);
+ FR_DEBUG(("2a. %#08x & %#08x != %#08x\n",
+ ntohl(*lip), ntohl(*lm), ntohl(*ld)));
+ if (fi->fi_v == 6) {
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("2b. %#08x & %#08x != %#08x\n",
+ ntohl(*lip), ntohl(*lm), ntohl(*ld)));
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("2c. %#08x & %#08x != %#08x\n",
+ ntohl(*lip), ntohl(*lm), ntohl(*ld)));
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("2d. %#08x & %#08x != %#08x\n",
+ ntohl(*lip), ntohl(*lm), ntohl(*ld)));
+ } else {
+ lip += 3;
+ lm += 3;
+ ld += 3;
+ }
+#ifdef IPFILTER_LOOKUP
+ }
+#endif
+ i ^= (fr->fr_flags & FR_NOTSRCIP) >> 6;
+ if (i)
+ return 1;
+
+ /*
+ * Check the destination address.
+ */
+ lip++, lm++, ld++;
+#ifdef IPFILTER_LOOKUP
+ if (fr->fr_datype == FRI_LOOKUP) {
+ i = (*fr->fr_dstfunc)(fr->fr_dstptr, fi->fi_v, lip);
+ if (i == -1)
+ return 1;
+ lip += 3;
+ lm += 3;
+ ld += 3;
+ } else {
+#endif
+ i = ((*lip & *lm) != *ld);
+ FR_DEBUG(("3a. %#08x & %#08x != %#08x\n",
+ ntohl(*lip), ntohl(*lm), ntohl(*ld)));
+ if (fi->fi_v == 6) {
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("3b. %#08x & %#08x != %#08x\n",
+ ntohl(*lip), ntohl(*lm), ntohl(*ld)));
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("3c. %#08x & %#08x != %#08x\n",
+ ntohl(*lip), ntohl(*lm), ntohl(*ld)));
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("3d. %#08x & %#08x != %#08x\n",
+ ntohl(*lip), ntohl(*lm), ntohl(*ld)));
+ } else {
+ lip += 3;
+ lm += 3;
+ ld += 3;
+ }
+#ifdef IPFILTER_LOOKUP
+ }
+#endif
+ i ^= (fr->fr_flags & FR_NOTDSTIP) >> 7;
+ if (i)
+ return 1;
+ /*
+ * IP addresses matched. The next 32bits contains:
+ * mast of old IP header security & authentication bits.
+ */
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("4. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+
+ /*
+ * Next we have 32 bits of packet flags.
+ */
+ lip++, lm++, ld++;
+ i |= ((*lip & *lm) != *ld);
+ FR_DEBUG(("5. %#08x & %#08x != %#08x\n",
+ *lip, *lm, *ld));
+
+ if (i == 0) {
+ /*
+ * If a fragment, then only the first has what we're
+ * looking for here...
+ */
+ if (portcmp) {
+ if (!fr_tcpudpchk(fin, &fr->fr_tuc))
+ i = 1;
+ } else {
+ if (fr->fr_dcmp || fr->fr_scmp ||
+ fr->fr_tcpf || fr->fr_tcpfm)
+ i = 1;
+ if (fr->fr_icmpm || fr->fr_icmp) {
+ if (((fi->fi_p != IPPROTO_ICMP) &&
+ (fi->fi_p != IPPROTO_ICMPV6)) ||
+ fin->fin_off || (fin->fin_dlen < 2))
+ i = 1;
+ else if ((fin->fin_data[0] & fr->fr_icmpm) !=
+ fr->fr_icmp) {
+ FR_DEBUG(("i. %#x & %#x != %#x\n",
+ fin->fin_data[0],
+ fr->fr_icmpm, fr->fr_icmp));
+ i = 1;
+ }
+ }
+ }
+ }
+ return i;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_scanlist */
+/* Returns: int - result flags of scanning filter list */
+/* Parameters: fin(I) - pointer to packet information */
+/* pass(I) - default result to return for filtering */
+/* */
+/* Check the input/output list of rules for a match to the current packet. */
+/* If a match is found, the value of fr_flags from the rule becomes the */
+/* return value and fin->fin_fr points to the matched rule. */
+/* */
+/* This function may be called recusively upto 16 times (limit inbuilt.) */
+/* When unwinding, it should finish up with fin_depth as 0. */
+/* */
+/* Could be per interface, but this gets real nasty when you don't have, */
+/* or can't easily change, the kernel source code to . */
+/* ------------------------------------------------------------------------ */
+int fr_scanlist(fin, pass)
+fr_info_t *fin;
+u_32_t pass;
+{
+ int rulen, portcmp, off, logged, skip;
+ struct frentry *fr, *fnext;
+ u_32_t passt, passo;
+
+ /*
+ * Do not allow nesting deeper than 16 levels.
+ */
+ if (fin->fin_depth >= 16)
+ return pass;
+
+ fr = fin->fin_fr;
+
+ /*
+ * If there are no rules in this list, return now.
+ */
+ if (fr == NULL)
+ return pass;
+
+ skip = 0;
+ logged = 0;
+ portcmp = 0;
+ fin->fin_depth++;
+ fin->fin_fr = NULL;
+ off = fin->fin_off;
+
+ if ((fin->fin_flx & FI_TCPUDP) && (fin->fin_dlen > 3) && !off)
+ portcmp = 1;
+
+ for (rulen = 0; fr; fr = fnext, rulen++) {
+ fnext = fr->fr_next;
+ if (skip != 0) {
+ FR_VERBOSE(("%d (%#x)\n", skip, fr->fr_flags));
+ skip--;
+ continue;
+ }
+
+ /*
+ * In all checks below, a null (zero) value in the
+ * filter struture is taken to mean a wildcard.
+ *
+ * check that we are working for the right interface
+ */
+#ifdef _KERNEL
+ if (fr->fr_ifa && fr->fr_ifa != fin->fin_ifp)
+ continue;
+#else
+ if (opts & (OPT_VERBOSE|OPT_DEBUG))
+ printf("\n");
+ FR_VERBOSE(("%c", FR_ISSKIP(pass) ? 's' :
+ FR_ISPASS(pass) ? 'p' :
+ FR_ISACCOUNT(pass) ? 'A' :
+ FR_ISAUTH(pass) ? 'a' :
+ (pass & FR_NOMATCH) ? 'n' :'b'));
+ if (fr->fr_ifa && fr->fr_ifa != fin->fin_ifp)
+ continue;
+ FR_VERBOSE((":i"));
+#endif
+
+ switch (fr->fr_type)
+ {
+ case FR_T_IPF :
+ case FR_T_IPF|FR_T_BUILTIN :
+ if (fr_ipfcheck(fin, fr, portcmp))
+ continue;
+ break;
+#if defined(IPFILTER_BPF)
+ case FR_T_BPFOPC :
+ case FR_T_BPFOPC|FR_T_BUILTIN :
+ {
+ u_char *mc;
+
+ if (*fin->fin_mp == NULL)
+ continue;
+ if (fin->fin_v != fr->fr_v)
+ continue;
+ mc = (u_char *)fin->fin_m;
+ if (!bpf_filter(fr->fr_data, mc, fin->fin_plen, 0))
+ continue;
+ break;
+ }
+#endif
+ case FR_T_CALLFUNC|FR_T_BUILTIN :
+ {
+ frentry_t *f;
+
+ f = (*fr->fr_func)(fin, &pass);
+ if (f != NULL)
+ fr = f;
+ else
+ continue;
+ break;
+ }
+ default :
+ break;
+ }
+
+ if ((fin->fin_out == 0) && (fr->fr_nattag.ipt_num[0] != 0)) {
+ if (fin->fin_nattag == NULL)
+ continue;
+ if (fr_matchtag(&fr->fr_nattag, fin->fin_nattag) == 0)
+ continue;
+ }
+ FR_VERBOSE(("=%s.%d *", fr->fr_group, rulen));
+
+ passt = fr->fr_flags;
+
+ /*
+ * Allowing a rule with the "keep state" flag set to match
+ * packets that have been tagged "out of window" by the TCP
+ * state tracking is foolish as the attempt to add a new
+ * state entry to the table will fail.
+ */
+ if ((passt & FR_KEEPSTATE) && (fin->fin_flx & FI_OOW))
+ continue;
+
+ /*
+ * If the rule is a "call now" rule, then call the function
+ * in the rule, if it exists and use the results from that.
+ * If the function pointer is bad, just make like we ignore
+ * it, except for increasing the hit counter.
+ */
+ if ((passt & FR_CALLNOW) != 0) {
+ frentry_t *frs;
+
+ ATOMIC_INC64(fr->fr_hits);
+ if ((fr->fr_func != NULL) &&
+ (fr->fr_func == (ipfunc_t)-1))
+ continue;
+
+ frs = fin->fin_fr;
+ fin->fin_fr = fr;
+ fr = (*fr->fr_func)(fin, &passt);
+ if (fr == NULL) {
+ fin->fin_fr = frs;
+ continue;
+ }
+ passt = fr->fr_flags;
+ }
+ fin->fin_fr = fr;
+
+#ifdef IPFILTER_LOG
+ /*
+ * Just log this packet...
+ */
+ if ((passt & FR_LOGMASK) == FR_LOG) {
+ if (ipflog(fin, passt) == -1) {
+ if (passt & FR_LOGORBLOCK) {
+ passt &= ~FR_CMDMASK;
+ passt |= FR_BLOCK|FR_QUICK;
+ }
+ ATOMIC_INCL(frstats[fin->fin_out].fr_skip);
+ }
+ ATOMIC_INCL(frstats[fin->fin_out].fr_pkl);
+ logged = 1;
+ }
+#endif /* IPFILTER_LOG */
+ fr->fr_bytes += (U_QUAD_T)fin->fin_plen;
+ passo = pass;
+ if (FR_ISSKIP(passt))
+ skip = fr->fr_arg;
+ else if ((passt & FR_LOGMASK) != FR_LOG)
+ pass = passt;
+ if (passt & (FR_RETICMP|FR_FAKEICMP))
+ fin->fin_icode = fr->fr_icode;
+ FR_DEBUG(("pass %#x\n", pass));
+ ATOMIC_INC64(fr->fr_hits);
+ fin->fin_rule = rulen;
+ (void) strncpy(fin->fin_group, fr->fr_group, FR_GROUPLEN);
+ if (fr->fr_grp != NULL) {
+ fin->fin_fr = *fr->fr_grp;
+ passt = fr_scanlist(fin, pass);
+ if (fin->fin_fr == NULL) {
+ fin->fin_rule = rulen;
+ (void) strncpy(fin->fin_group, fr->fr_group,
+ FR_GROUPLEN);
+ fin->fin_fr = fr;
+ passt = pass;
+ }
+ if (fin->fin_flx & FI_DONTCACHE)
+ logged = 1;
+ pass = passt;
+ }
+
+ if (passt & FR_QUICK) {
+ /*
+ * Finally, if we've asked to track state for this
+ * packet, set it up. Add state for "quick" rules
+ * here so that if the action fails we can consider
+ * the rule to "not match" and keep on processing
+ * filter rules.
+ */
+ if ((pass & FR_KEEPSTATE) &&
+ !(fin->fin_flx & FI_STATE)) {
+ int out = fin->fin_out;
+
+ fin->fin_fr = fr;
+ if (fr_addstate(fin, NULL, 0) != NULL) {
+ ATOMIC_INCL(frstats[out].fr_ads);
+ } else {
+ ATOMIC_INCL(frstats[out].fr_bads);
+ pass = passo;
+ continue;
+ }
+ }
+ break;
+ }
+ }
+ if (logged)
+ fin->fin_flx |= FI_DONTCACHE;
+ fin->fin_depth--;
+ return pass;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_acctpkt */
+/* Returns: frentry_t* - always returns NULL */
+/* Parameters: fin(I) - pointer to packet information */
+/* passp(IO) - pointer to current/new filter decision (unused) */
+/* */
+/* Checks a packet against accounting rules, if there are any for the given */
+/* IP protocol version. */
+/* */
+/* N.B.: this function returns NULL to match the prototype used by other */
+/* functions called from the IPFilter "mainline" in fr_check(). */
+/* ------------------------------------------------------------------------ */
+frentry_t *fr_acctpkt(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ char group[FR_GROUPLEN];
+ frentry_t *fr, *frsave;
+ u_32_t pass, rulen;
+
+ passp = passp;
+#ifdef USE_INET6
+ if (fin->fin_v == 6)
+ fr = ipacct6[fin->fin_out][fr_active];
+ else
+#endif
+ fr = ipacct[fin->fin_out][fr_active];
+
+ if (fr != NULL) {
+ frsave = fin->fin_fr;
+ bcopy(fin->fin_group, group, FR_GROUPLEN);
+ rulen = fin->fin_rule;
+ fin->fin_fr = fr;
+ pass = fr_scanlist(fin, FR_NOMATCH);
+ if (FR_ISACCOUNT(pass)) {
+ ATOMIC_INCL(frstats[0].fr_acct);
+ }
+ fin->fin_fr = frsave;
+ bcopy(group, fin->fin_group, FR_GROUPLEN);
+ fin->fin_rule = rulen;
+ }
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_firewall */
+/* Returns: frentry_t* - returns pointer to matched rule, if no matches */
+/* were found, returns NULL. */
+/* Parameters: fin(I) - pointer to packet information */
+/* passp(IO) - pointer to current/new filter decision (unused) */
+/* */
+/* Applies an appropriate set of firewall rules to the packet, to see if */
+/* there are any matches. The first check is to see if a match can be seen */
+/* in the cache. If not, then search an appropriate list of rules. Once a */
+/* matching rule is found, take any appropriate actions as defined by the */
+/* rule - except logging. */
+/* ------------------------------------------------------------------------ */
+static frentry_t *fr_firewall(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ frentry_t *fr;
+ fr_info_t *fc;
+ u_32_t pass;
+ int out;
+
+ out = fin->fin_out;
+ pass = *passp;
+
+ /*
+ * If a packet is found in the auth table, then skip checking
+ * the access lists for permission but we do need to consider
+ * the result as if it were from the ACL's.
+ */
+ fc = &frcache[out][CACHE_HASH(fin)];
+ READ_ENTER(&ipf_frcache);
+ if (!bcmp((char *)fin, (char *)fc, FI_CSIZE)) {
+ /*
+ * copy cached data so we can unlock the mutexes earlier.
+ */
+ bcopy((char *)fc, (char *)fin, FI_COPYSIZE);
+ RWLOCK_EXIT(&ipf_frcache);
+ ATOMIC_INCL(frstats[out].fr_chit);
+
+ if ((fr = fin->fin_fr) != NULL) {
+ ATOMIC_INC64(fr->fr_hits);
+ pass = fr->fr_flags;
+ }
+ } else {
+ RWLOCK_EXIT(&ipf_frcache);
+
+#ifdef USE_INET6
+ if (fin->fin_v == 6)
+ fin->fin_fr = ipfilter6[out][fr_active];
+ else
+#endif
+ fin->fin_fr = ipfilter[out][fr_active];
+ if (fin->fin_fr != NULL)
+ pass = fr_scanlist(fin, fr_pass);
+
+ if (((pass & FR_KEEPSTATE) == 0) &&
+ ((fin->fin_flx & FI_DONTCACHE) == 0)) {
+ WRITE_ENTER(&ipf_frcache);
+ bcopy((char *)fin, (char *)fc, FI_COPYSIZE);
+ RWLOCK_EXIT(&ipf_frcache);
+ }
+ if ((pass & FR_NOMATCH)) {
+ ATOMIC_INCL(frstats[out].fr_nom);
+ }
+ fr = fin->fin_fr;
+ }
+
+ /*
+ * Apply packets per second rate-limiting to a rule as required.
+ */
+ if ((fr != NULL) && (fr->fr_pps != 0) &&
+ !ppsratecheck(&fr->fr_lastpkt, &fr->fr_curpps, fr->fr_pps)) {
+ pass &= ~(FR_CMDMASK|FR_DUP|FR_RETICMP|FR_RETRST);
+ pass |= FR_BLOCK;
+ ATOMIC_INCL(frstats[out].fr_ppshit);
+ }
+
+ /*
+ * If we fail to add a packet to the authorization queue, then we
+ * drop the packet later. However, if it was added then pretend
+ * we've dropped it already.
+ */
+ if (FR_ISAUTH(pass)) {
+ if (fr_newauth(fin->fin_m, fin) != 0) {
+#ifdef _KERNEL
+ if ((pass & FR_RETMASK) == 0)
+ fin->fin_m = *fin->fin_mp = NULL;
+#else
+ ;
+#endif
+ fin->fin_error = 0;
+ } else
+ fin->fin_error = ENOSPC;
+ }
+
+ if ((fr != NULL) && (fr->fr_func != NULL) &&
+ (fr->fr_func != (ipfunc_t)-1) && !(pass & FR_CALLNOW))
+ (void) (*fr->fr_func)(fin, &pass);
+
+ /*
+ * If a rule is a pre-auth rule, check again in the list of rules
+ * loaded for authenticated use. It does not particulary matter
+ * if this search fails because a "preauth" result, from a rule,
+ * is treated as "not a pass", hence the packet is blocked.
+ */
+ if (FR_ISPREAUTH(pass)) {
+ if ((fin->fin_fr = ipauth) != NULL)
+ pass = fr_scanlist(fin, fr_pass);
+ }
+
+ /*
+ * If the rule has "keep frag" and the packet is actually a fragment,
+ * then create a fragment state entry.
+ */
+ if ((pass & (FR_KEEPFRAG|FR_KEEPSTATE)) == FR_KEEPFRAG) {
+ if (fin->fin_flx & FI_FRAG) {
+ if (fr_newfrag(fin, pass) == -1) {
+ ATOMIC_INCL(frstats[out].fr_bnfr);
+ } else {
+ ATOMIC_INCL(frstats[out].fr_nfr);
+ }
+ } else {
+ ATOMIC_INCL(frstats[out].fr_cfr);
+ }
+ }
+
+ fr = fin->fin_fr;
+
+ if (passp != NULL)
+ *passp = pass;
+
+ return fr;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_check */
+/* Returns: int - 0 == packet allowed through, */
+/* User space: */
+/* -1 == packet blocked */
+/* 1 == packet not matched */
+/* -2 == requires authentication */
+/* Kernel: */
+/* > 0 == filter error # for packet */
+/* Parameters: ip(I) - pointer to start of IPv4/6 packet */
+/* hlen(I) - length of header */
+/* ifp(I) - pointer to interface this packet is on */
+/* out(I) - 0 == packet going in, 1 == packet going out */
+/* mp(IO) - pointer to caller's buffer pointer that holds this */
+/* IP packet. */
+/* Solaris & HP-UX ONLY : */
+/* qpi(I) - pointer to STREAMS queue information for this */
+/* interface & direction. */
+/* */
+/* fr_check() is the master function for all IPFilter packet processing. */
+/* It orchestrates: Network Address Translation (NAT), checking for packet */
+/* authorisation (or pre-authorisation), presence of related state info., */
+/* generating log entries, IP packet accounting, routing of packets as */
+/* directed by firewall rules and of course whether or not to allow the */
+/* packet to be further processed by the kernel. */
+/* */
+/* For packets blocked, the contents of "mp" will be NULL'd and the buffer */
+/* freed. Packets passed may be returned with the pointer pointed to by */
+/* by "mp" changed to a new buffer. */
+/* ------------------------------------------------------------------------ */
+int fr_check(ip, hlen, ifp, out
+#if defined(_KERNEL) && defined(MENTAT)
+, qif, mp)
+void *qif;
+#else
+, mp)
+#endif
+mb_t **mp;
+ip_t *ip;
+int hlen;
+void *ifp;
+int out;
+{
+ /*
+ * The above really sucks, but short of writing a diff
+ */
+ fr_info_t frinfo;
+ fr_info_t *fin = &frinfo;
+ u_32_t pass = fr_pass;
+ frentry_t *fr = NULL;
+ int v = IP_V(ip);
+ mb_t *mc = NULL;
+ mb_t *m;
+ /*
+ * The first part of fr_check() deals with making sure that what goes
+ * into the filtering engine makes some sense. Information about the
+ * the packet is distilled, collected into a fr_info_t structure and
+ * the an attempt to ensure the buffer the packet is in is big enough
+ * to hold all the required packet headers.
+ */
+#ifdef _KERNEL
+# ifdef MENTAT
+ qpktinfo_t *qpi = qif;
+
+ if ((u_int)ip & 0x3)
+ return 2;
+# else
+ SPL_INT(s);
+# endif
+
+ READ_ENTER(&ipf_global);
+
+ if (fr_running <= 0) {
+ RWLOCK_EXIT(&ipf_global);
+ return 0;
+ }
+
+ bzero((char *)fin, sizeof(*fin));
+
+# ifdef MENTAT
+ if (qpi->qpi_flags & QF_GROUP)
+ fin->fin_flx |= FI_MBCAST;
+ m = qpi->qpi_m;
+ fin->fin_qfm = m;
+ fin->fin_qpi = qpi;
+# else /* MENTAT */
+
+ m = *mp;
+
+# if defined(M_MCAST)
+ if ((m->m_flags & M_MCAST) != 0)
+ fin->fin_flx |= FI_MBCAST|FI_MULTICAST;
+# endif
+# if defined(M_MLOOP)
+ if ((m->m_flags & M_MLOOP) != 0)
+ fin->fin_flx |= FI_MBCAST|FI_MULTICAST;
+# endif
+# if defined(M_BCAST)
+ if ((m->m_flags & M_BCAST) != 0)
+ fin->fin_flx |= FI_MBCAST|FI_BROADCAST;
+# endif
+# ifdef M_CANFASTFWD
+ /*
+ * XXX For now, IP Filter and fast-forwarding of cached flows
+ * XXX are mutually exclusive. Eventually, IP Filter should
+ * XXX get a "can-fast-forward" filter rule.
+ */
+ m->m_flags &= ~M_CANFASTFWD;
+# endif /* M_CANFASTFWD */
+# ifdef CSUM_DELAY_DATA
+ /*
+ * disable delayed checksums.
+ */
+ if (m->m_pkthdr.csum_flags & CSUM_DELAY_DATA) {
+ in_delayed_cksum(m);
+ m->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
+ }
+# endif /* CSUM_DELAY_DATA */
+# endif /* MENTAT */
+#else
+ READ_ENTER(&ipf_global);
+
+ bzero((char *)fin, sizeof(*fin));
+ m = *mp;
+#endif /* _KERNEL */
+
+ fin->fin_v = v;
+ fin->fin_m = m;
+ fin->fin_ip = ip;
+ fin->fin_mp = mp;
+ fin->fin_out = out;
+ fin->fin_ifp = ifp;
+ fin->fin_error = ENETUNREACH;
+ fin->fin_hlen = (u_short)hlen;
+ fin->fin_dp = (char *)ip + hlen;
+
+ fin->fin_ipoff = (char *)ip - MTOD(m, char *);
+
+ SPL_NET(s);
+
+#ifdef USE_INET6
+ if (v == 6) {
+ ATOMIC_INCL(frstats[out].fr_ipv6);
+ /*
+ * Jumbo grams are quite likely too big for internal buffer
+ * structures to handle comfortably, for now, so just drop
+ * them.
+ */
+ if (((ip6_t *)ip)->ip6_plen == 0) {
+ pass = FR_BLOCK|FR_NOMATCH;
+ goto finished;
+ }
+ } else
+#endif
+ {
+#if (defined(OpenBSD) && OpenBSD >= 200311) && defined(_KERNEL)
+ ip->ip_len = ntohs(ip->ip_len);
+ ip->ip_off = ntohs(ip->ip_off);
+#endif
+ }
+
+ if (fr_makefrip(hlen, ip, fin) == -1) {
+ pass = FR_BLOCK|FR_NOMATCH;
+ goto finished;
+ }
+
+ /*
+ * For at least IPv6 packets, if a m_pullup() fails then this pointer
+ * becomes NULL and so we have no packet to free.
+ */
+ if (*fin->fin_mp == NULL)
+ goto finished;
+
+ if (!out) {
+ if (v == 4) {
+#ifdef _KERNEL
+ if (fr_chksrc && !fr_verifysrc(fin)) {
+ ATOMIC_INCL(frstats[0].fr_badsrc);
+ fin->fin_flx |= FI_BADSRC;
+ }
+#endif
+ if (fin->fin_ip->ip_ttl < fr_minttl) {
+ ATOMIC_INCL(frstats[0].fr_badttl);
+ fin->fin_flx |= FI_LOWTTL;
+ }
+ }
+#ifdef USE_INET6
+ else if (v == 6) {
+ if (((ip6_t *)ip)->ip6_hlim < fr_minttl) {
+ ATOMIC_INCL(frstats[0].fr_badttl);
+ fin->fin_flx |= FI_LOWTTL;
+ }
+ }
+#endif
+ }
+
+ if (fin->fin_flx & FI_SHORT) {
+ ATOMIC_INCL(frstats[out].fr_short);
+ }
+
+ READ_ENTER(&ipf_mutex);
+
+ /*
+ * Check auth now. This, combined with the check below to see if apass
+ * is 0 is to ensure that we don't count the packet twice, which can
+ * otherwise occur when we reprocess it. As it is, we only count it
+ * after it has no auth. table matchup. This also stops NAT from
+ * occuring until after the packet has been auth'd.
+ */
+ fr = fr_checkauth(fin, &pass);
+ if (!out) {
+ if (fr_checknatin(fin, &pass) == -1) {
+ goto filterdone;
+ }
+ }
+ if (!out)
+ (void) fr_acctpkt(fin, NULL);
+
+ if (fr == NULL)
+ if ((fin->fin_flx & (FI_FRAG|FI_BAD)) == FI_FRAG)
+ fr = fr_knownfrag(fin, &pass);
+ if (fr == NULL)
+ fr = fr_checkstate(fin, &pass);
+
+ if ((pass & FR_NOMATCH) || (fr == NULL))
+ fr = fr_firewall(fin, &pass);
+
+ /*
+ * If we've asked to track state for this packet, set it up.
+ * Here rather than fr_firewall because fr_checkauth may decide
+ * to return a packet for "keep state"
+ */
+ if ((pass & FR_KEEPSTATE) && !(fin->fin_flx & FI_STATE)) {
+ if (fr_addstate(fin, NULL, 0) != NULL) {
+ ATOMIC_INCL(frstats[out].fr_ads);
+ } else {
+ ATOMIC_INCL(frstats[out].fr_bads);
+ if (FR_ISPASS(pass)) {
+ pass &= ~FR_CMDMASK;
+ pass |= FR_BLOCK;
+ }
+ }
+ }
+
+ fin->fin_fr = fr;
+
+ /*
+ * Only count/translate packets which will be passed on, out the
+ * interface.
+ */
+ if (out && FR_ISPASS(pass)) {
+ (void) fr_acctpkt(fin, NULL);
+
+ if (fr_checknatout(fin, &pass) == -1) {
+ ;
+ } else if ((fr_update_ipid != 0) && (v == 4)) {
+ if (fr_updateipid(fin) == -1) {
+ ATOMIC_INCL(frstats[1].fr_ipud);
+ pass &= ~FR_CMDMASK;
+ pass |= FR_BLOCK;
+ } else {
+ ATOMIC_INCL(frstats[0].fr_ipud);
+ }
+ }
+ }
+
+filterdone:
+#ifdef IPFILTER_LOG
+ if ((fr_flags & FF_LOGGING) || (pass & FR_LOGMASK)) {
+ (void) fr_dolog(fin, &pass);
+ }
+#endif
+
+ /*
+ * The FI_STATE flag is cleared here so that calling fr_checkstate
+ * will work when called from inside of fr_fastroute. Although
+ * there is a similar flag, FI_NATED, for NAT, it does have the same
+ * impact on code execution.
+ */
+ if (fin->fin_state != NULL) {
+ fr_statederef((ipstate_t **)&fin->fin_state);
+ fin->fin_flx ^= FI_STATE;
+ }
+
+ if (fin->fin_nat != NULL) {
+ fr_natderef((nat_t **)&fin->fin_nat);
+ }
+
+ /*
+ * Up the reference on fr_lock and exit ipf_mutex. fr_fastroute
+ * only frees up the lock on ipf_global and the generation of a
+ * packet below could cause a recursive call into IPFilter.
+ * Hang onto the filter rule just in case someone decides to remove
+ * or flush it in the meantime.
+ */
+ if (fr != NULL) {
+ MUTEX_ENTER(&fr->fr_lock);
+ fr->fr_ref++;
+ MUTEX_EXIT(&fr->fr_lock);
+ }
+
+ RWLOCK_EXIT(&ipf_mutex);
+
+ if ((pass & FR_RETMASK) != 0) {
+ /*
+ * Should we return an ICMP packet to indicate error
+ * status passing through the packet filter ?
+ * WARNING: ICMP error packets AND TCP RST packets should
+ * ONLY be sent in repsonse to incoming packets. Sending them
+ * in response to outbound packets can result in a panic on
+ * some operating systems.
+ */
+ if (!out) {
+ if (pass & FR_RETICMP) {
+ int dst;
+
+ if ((pass & FR_RETMASK) == FR_FAKEICMP)
+ dst = 1;
+ else
+ dst = 0;
+ (void) fr_send_icmp_err(ICMP_UNREACH, fin, dst);
+ ATOMIC_INCL(frstats[0].fr_ret);
+ } else if (((pass & FR_RETMASK) == FR_RETRST) &&
+ !(fin->fin_flx & FI_SHORT)) {
+ if (((fin->fin_flx & FI_OOW) != 0) ||
+ (fr_send_reset(fin) == 0)) {
+ ATOMIC_INCL(frstats[1].fr_ret);
+ }
+ }
+
+ /*
+ * When using return-* with auth rules, the auth code
+ * takes over disposing of this packet.
+ */
+ if (FR_ISAUTH(pass) && (fin->fin_m != NULL)) {
+ fin->fin_m = *fin->fin_mp = NULL;
+ }
+ } else {
+ if (pass & FR_RETRST)
+ fin->fin_error = ECONNRESET;
+ }
+ }
+
+ /*
+ * If we didn't drop off the bottom of the list of rules (and thus
+ * the 'current' rule fr is not NULL), then we may have some extra
+ * instructions about what to do with a packet.
+ * Once we're finished return to our caller, freeing the packet if
+ * we are dropping it (* BSD ONLY *).
+ */
+ if (fr != NULL) {
+ frdest_t *fdp;
+
+ fdp = &fr->fr_tifs[fin->fin_rev];
+
+ if (!out && (pass & FR_FASTROUTE)) {
+ /*
+ * For fastroute rule, no destioation interface defined
+ * so pass NULL as the frdest_t parameter
+ */
+ (void) fr_fastroute(fin->fin_m, mp, fin, NULL);
+ m = *mp = NULL;
+ } else if ((fdp->fd_ifp != NULL) &&
+ (fdp->fd_ifp != (struct ifnet *)-1)) {
+ /* this is for to rules: */
+ (void) fr_fastroute(fin->fin_m, mp, fin, fdp);
+ m = *mp = NULL;
+ }
+
+ /*
+ * Generate a duplicated packet.
+ */
+ if ((pass & FR_DUP) != 0) {
+ mc = M_DUPLICATE(fin->fin_m);
+ if (mc != NULL)
+ (void) fr_fastroute(mc, &mc, fin, &fr->fr_dif);
+ }
+
+ (void) fr_derefrule(&fr);
+ }
+
+finished:
+ if (!FR_ISPASS(pass)) {
+ ATOMIC_INCL(frstats[out].fr_block);
+ if (*mp != NULL) {
+ FREE_MB_T(*mp);
+ m = *mp = NULL;
+ }
+ } else {
+ ATOMIC_INCL(frstats[out].fr_pass);
+#if defined(_KERNEL) && defined(__sgi)
+ if ((fin->fin_hbuf != NULL) &&
+ (mtod(fin->fin_m, struct ip *) != fin->fin_ip)) {
+ COPYBACK(fin->fin_m, 0, fin->fin_plen, fin->fin_hbuf);
+ }
+#endif
+ }
+
+ SPL_X(s);
+ RWLOCK_EXIT(&ipf_global);
+
+#ifdef _KERNEL
+# if defined(OpenBSD) && OpenBSD >= 200311
+ if (FR_ISPASS(pass) && (v == 4)) {
+ ip = fin->fin_ip;
+ ip->ip_len = ntohs(ip->ip_len);
+ ip->ip_off = ntohs(ip->ip_off);
+ }
+# endif
+ return (FR_ISPASS(pass)) ? 0 : fin->fin_error;
+#else /* _KERNEL */
+ FR_VERBOSE(("fin_flx %#x pass %#x ", fin->fin_flx, pass));
+ if ((pass & FR_NOMATCH) != 0)
+ return 1;
+
+ if ((pass & FR_RETMASK) != 0)
+ switch (pass & FR_RETMASK)
+ {
+ case FR_RETRST :
+ return 3;
+ case FR_RETICMP :
+ return 4;
+ case FR_FAKEICMP :
+ return 5;
+ }
+
+ switch (pass & FR_CMDMASK)
+ {
+ case FR_PASS :
+ return 0;
+ case FR_BLOCK :
+ return -1;
+ case FR_AUTH :
+ return -2;
+ case FR_ACCOUNT :
+ return -3;
+ case FR_PREAUTH :
+ return -4;
+ }
+ return 2;
+#endif /* _KERNEL */
+}
+
+
+#ifdef IPFILTER_LOG
+/* ------------------------------------------------------------------------ */
+/* Function: fr_dolog */
+/* Returns: frentry_t* - returns contents of fin_fr (no change made) */
+/* Parameters: fin(I) - pointer to packet information */
+/* passp(IO) - pointer to current/new filter decision (unused) */
+/* */
+/* Checks flags set to see how a packet should be logged, if it is to be */
+/* logged. Adjust statistics based on its success or not. */
+/* ------------------------------------------------------------------------ */
+frentry_t *fr_dolog(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ u_32_t pass;
+ int out;
+
+ out = fin->fin_out;
+ pass = *passp;
+
+ if ((fr_flags & FF_LOGNOMATCH) && (pass & FR_NOMATCH)) {
+ pass |= FF_LOGNOMATCH;
+ ATOMIC_INCL(frstats[out].fr_npkl);
+ goto logit;
+ } else if (((pass & FR_LOGMASK) == FR_LOGP) ||
+ (FR_ISPASS(pass) && (fr_flags & FF_LOGPASS))) {
+ if ((pass & FR_LOGMASK) != FR_LOGP)
+ pass |= FF_LOGPASS;
+ ATOMIC_INCL(frstats[out].fr_ppkl);
+ goto logit;
+ } else if (((pass & FR_LOGMASK) == FR_LOGB) ||
+ (FR_ISBLOCK(pass) && (fr_flags & FF_LOGBLOCK))) {
+ if ((pass & FR_LOGMASK) != FR_LOGB)
+ pass |= FF_LOGBLOCK;
+ ATOMIC_INCL(frstats[out].fr_bpkl);
+logit:
+ if (ipflog(fin, pass) == -1) {
+ ATOMIC_INCL(frstats[out].fr_skip);
+
+ /*
+ * If the "or-block" option has been used then
+ * block the packet if we failed to log it.
+ */
+ if ((pass & FR_LOGORBLOCK) &&
+ FR_ISPASS(pass)) {
+ pass &= ~FR_CMDMASK;
+ pass |= FR_BLOCK;
+ }
+ }
+ *passp = pass;
+ }
+
+ return fin->fin_fr;
+}
+#endif /* IPFILTER_LOG */
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipf_cksum */
+/* Returns: u_short - IP header checksum */
+/* Parameters: addr(I) - pointer to start of buffer to checksum */
+/* len(I) - length of buffer in bytes */
+/* */
+/* Calculate the two's complement 16 bit checksum of the buffer passed. */
+/* */
+/* N.B.: addr should be 16bit aligned. */
+/* ------------------------------------------------------------------------ */
+u_short ipf_cksum(addr, len)
+u_short *addr;
+int len;
+{
+ u_32_t sum = 0;
+
+ for (sum = 0; len > 1; len -= 2)
+ sum += *addr++;
+
+ /* mop up an odd byte, if necessary */
+ if (len == 1)
+ sum += *(u_char *)addr;
+
+ /*
+ * add back carry outs from top 16 bits to low 16 bits
+ */
+ sum = (sum >> 16) + (sum & 0xffff); /* add hi 16 to low 16 */
+ sum += (sum >> 16); /* add carry */
+ return (u_short)(~sum);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_cksum */
+/* Returns: u_short - layer 4 checksum */
+/* Parameters: m(I ) - pointer to buffer holding packet */
+/* ip(I) - pointer to IP header */
+/* l4proto(I) - protocol to caclulate checksum for */
+/* l4hdr(I) - pointer to layer 4 header */
+/* l3len(I) - length of layer 4 data plus layer 3 header */
+/* */
+/* Calculates the TCP checksum for the packet held in "m", using the data */
+/* in the IP header "ip" to seed it. */
+/* */
+/* NB: This function assumes we've pullup'd enough for all of the IP header */
+/* and the TCP header. We also assume that data blocks aren't allocated in */
+/* odd sizes. */
+/* */
+/* For IPv6, l3len excludes extension header size. */
+/* */
+/* Expects ip_len to be in host byte order when called. */
+/* ------------------------------------------------------------------------ */
+u_short fr_cksum(m, ip, l4proto, l4hdr, l3len)
+mb_t *m;
+ip_t *ip;
+int l4proto, l3len;
+void *l4hdr;
+{
+ u_short *sp, slen, sumsave, l4hlen, *csump;
+ u_int sum, sum2;
+ int hlen;
+#ifdef USE_INET6
+ ip6_t *ip6;
+#endif
+
+ csump = NULL;
+ sumsave = 0;
+ l4hlen = 0;
+ sp = NULL;
+ slen = 0;
+ hlen = 0;
+ sum = 0;
+
+ /*
+ * Add up IP Header portion
+ */
+#ifdef USE_INET6
+ if (IP_V(ip) == 4) {
+#endif
+ hlen = IP_HL(ip) << 2;
+ slen = l3len - hlen;
+ sum = htons((u_short)l4proto);
+ sum += htons(slen);
+ sp = (u_short *)&ip->ip_src;
+ sum += *sp++; /* ip_src */
+ sum += *sp++;
+ sum += *sp++; /* ip_dst */
+ sum += *sp++;
+#ifdef USE_INET6
+ } else if (IP_V(ip) == 6) {
+ ip6 = (ip6_t *)ip;
+ hlen = sizeof(*ip6);
+ slen = l3len - hlen;
+ sum = htons((u_short)l4proto);
+ sum += htons(slen);
+ sp = (u_short *)&ip6->ip6_src;
+ sum += *sp++; /* ip6_src */
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++; /* ip6_dst */
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ sum += *sp++;
+ }
+#endif
+
+ switch (l4proto)
+ {
+ case IPPROTO_UDP :
+ csump = &((udphdr_t *)l4hdr)->uh_sum;
+ l4hlen = sizeof(udphdr_t);
+ break;
+
+ case IPPROTO_TCP :
+ csump = &((tcphdr_t *)l4hdr)->th_sum;
+ l4hlen = sizeof(tcphdr_t);
+ break;
+ case IPPROTO_ICMP :
+ csump = &((icmphdr_t *)l4hdr)->icmp_cksum;
+ l4hlen = 4;
+ sum = 0;
+ break;
+ default :
+ break;
+ }
+
+ if (csump != NULL) {
+ sumsave = *csump;
+ *csump = 0;
+ }
+
+ l4hlen = l4hlen; /* LINT */
+
+#ifdef _KERNEL
+# ifdef MENTAT
+ {
+ void *rp = m->b_rptr;
+
+ if ((unsigned char *)ip > m->b_rptr && (unsigned char *)ip < m->b_wptr)
+ m->b_rptr = (u_char *)ip;
+ sum2 = ip_cksum(m, hlen, sum); /* hlen == offset */
+ m->b_rptr = rp;
+ sum2 = (u_short)(~sum2 & 0xffff);
+ }
+# else /* MENTAT */
+# if defined(BSD) || defined(sun)
+# if BSD >= 199103
+ m->m_data += hlen;
+# else
+ m->m_off += hlen;
+# endif
+ m->m_len -= hlen;
+ sum2 = in_cksum(m, slen);
+ m->m_len += hlen;
+# if BSD >= 199103
+ m->m_data -= hlen;
+# else
+ m->m_off -= hlen;
+# endif
+ /*
+ * Both sum and sum2 are partial sums, so combine them together.
+ */
+ sum += ~sum2 & 0xffff;
+ while (sum > 0xffff)
+ sum = (sum & 0xffff) + (sum >> 16);
+ sum2 = ~sum & 0xffff;
+# else /* defined(BSD) || defined(sun) */
+{
+ union {
+ u_char c[2];
+ u_short s;
+ } bytes;
+ u_short len = ip->ip_len;
+# if defined(__sgi)
+ int add;
+# endif
+
+ /*
+ * Add up IP Header portion
+ */
+ if (sp != (u_short *)l4hdr)
+ sp = (u_short *)l4hdr;
+
+ switch (l4proto)
+ {
+ case IPPROTO_UDP :
+ sum += *sp++; /* sport */
+ sum += *sp++; /* dport */
+ sum += *sp++; /* udp length */
+ sum += *sp++; /* checksum */
+ break;
+
+ case IPPROTO_TCP :
+ sum += *sp++; /* sport */
+ sum += *sp++; /* dport */
+ sum += *sp++; /* seq */
+ sum += *sp++;
+ sum += *sp++; /* ack */
+ sum += *sp++;
+ sum += *sp++; /* off */
+ sum += *sp++; /* win */
+ sum += *sp++; /* checksum */
+ sum += *sp++; /* urp */
+ break;
+ case IPPROTO_ICMP :
+ sum = *sp++; /* type/code */
+ sum += *sp++; /* checksum */
+ break;
+ }
+
+# ifdef __sgi
+ /*
+ * In case we had to copy the IP & TCP header out of mbufs,
+ * skip over the mbuf bits which are the header
+ */
+ if ((caddr_t)ip != mtod(m, caddr_t)) {
+ hlen = (caddr_t)sp - (caddr_t)ip;
+ while (hlen) {
+ add = MIN(hlen, m->m_len);
+ sp = (u_short *)(mtod(m, caddr_t) + add);
+ hlen -= add;
+ if (add == m->m_len) {
+ m = m->m_next;
+ if (!hlen) {
+ if (!m)
+ break;
+ sp = mtod(m, u_short *);
+ }
+ PANIC((!m),("fr_cksum(1): not enough data"));
+ }
+ }
+ }
+# endif
+
+ len -= (l4hlen + hlen);
+ if (len <= 0)
+ goto nodata;
+
+ while (len > 1) {
+ if (((caddr_t)sp - mtod(m, caddr_t)) >= m->m_len) {
+ m = m->m_next;
+ PANIC((!m),("fr_cksum(2): not enough data"));
+ sp = mtod(m, u_short *);
+ }
+ if (((caddr_t)(sp + 1) - mtod(m, caddr_t)) > m->m_len) {
+ bytes.c[0] = *(u_char *)sp;
+ m = m->m_next;
+ PANIC((!m),("fr_cksum(3): not enough data"));
+ sp = mtod(m, u_short *);
+ bytes.c[1] = *(u_char *)sp;
+ sum += bytes.s;
+ sp = (u_short *)((u_char *)sp + 1);
+ }
+ if ((u_long)sp & 1) {
+ bcopy((char *)sp++, (char *)&bytes.s, sizeof(bytes.s));
+ sum += bytes.s;
+ } else
+ sum += *sp++;
+ len -= 2;
+ }
+
+ if (len != 0)
+ sum += ntohs(*(u_char *)sp << 8);
+nodata:
+ while (sum > 0xffff)
+ sum = (sum & 0xffff) + (sum >> 16);
+ sum2 = (u_short)(~sum & 0xffff);
+}
+# endif /* defined(BSD) || defined(sun) */
+# endif /* MENTAT */
+#else /* _KERNEL */
+ /*
+ * Add up IP Header portion
+ */
+ if (sp != (u_short *)l4hdr)
+ sp = (u_short *)l4hdr;
+
+ for (; slen > 1; slen -= 2)
+ sum += *sp++;
+ if (slen)
+ sum += ntohs(*(u_char *)sp << 8);
+ while (sum > 0xffff)
+ sum = (sum & 0xffff) + (sum >> 16);
+ sum2 = (u_short)(~sum & 0xffff);
+#endif /* _KERNEL */
+ if (csump != NULL)
+ *csump = sumsave;
+ return sum2;
+}
+
+
+#if defined(_KERNEL) && ( ((BSD < 199103) && !defined(MENTAT)) || \
+ defined(__sgi) ) && !defined(linux) && !defined(_AIX51)
+/*
+ * Copyright (c) 1982, 1986, 1988, 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)uipc_mbuf.c 8.2 (Berkeley) 1/4/94
+ * $Id: fil.c,v 2.243.2.109 2007/05/31 12:27:33 darrenr Exp $
+ */
+/*
+ * Copy data from an mbuf chain starting "off" bytes from the beginning,
+ * continuing for "len" bytes, into the indicated buffer.
+ */
+void
+m_copydata(m, off, len, cp)
+ mb_t *m;
+ int off;
+ int len;
+ caddr_t cp;
+{
+ unsigned count;
+
+ if (off < 0 || len < 0)
+ panic("m_copydata");
+ while (off > 0) {
+ if (m == 0)
+ panic("m_copydata");
+ if (off < m->m_len)
+ break;
+ off -= m->m_len;
+ m = m->m_next;
+ }
+ while (len > 0) {
+ if (m == 0)
+ panic("m_copydata");
+ count = MIN(m->m_len - off, len);
+ bcopy(mtod(m, caddr_t) + off, cp, count);
+ len -= count;
+ cp += count;
+ off = 0;
+ m = m->m_next;
+ }
+}
+
+
+/*
+ * Copy data from a buffer back into the indicated mbuf chain,
+ * starting "off" bytes from the beginning, extending the mbuf
+ * chain if necessary.
+ */
+void
+m_copyback(m0, off, len, cp)
+ struct mbuf *m0;
+ int off;
+ int len;
+ caddr_t cp;
+{
+ int mlen;
+ struct mbuf *m = m0, *n;
+ int totlen = 0;
+
+ if (m0 == 0)
+ return;
+ while (off > (mlen = m->m_len)) {
+ off -= mlen;
+ totlen += mlen;
+ if (m->m_next == 0) {
+ n = m_getclr(M_DONTWAIT, m->m_type);
+ if (n == 0)
+ goto out;
+ n->m_len = min(MLEN, len + off);
+ m->m_next = n;
+ }
+ m = m->m_next;
+ }
+ while (len > 0) {
+ mlen = min(m->m_len - off, len);
+ bcopy(cp, off + mtod(m, caddr_t), (unsigned)mlen);
+ cp += mlen;
+ len -= mlen;
+ mlen += off;
+ off = 0;
+ totlen += mlen;
+ if (len == 0)
+ break;
+ if (m->m_next == 0) {
+ n = m_get(M_DONTWAIT, m->m_type);
+ if (n == 0)
+ break;
+ n->m_len = min(MLEN, len);
+ m->m_next = n;
+ }
+ m = m->m_next;
+ }
+out:
+#if 0
+ if (((m = m0)->m_flags & M_PKTHDR) && (m->m_pkthdr.len < totlen))
+ m->m_pkthdr.len = totlen;
+#endif
+ return;
+}
+#endif /* (_KERNEL) && ( ((BSD < 199103) && !MENTAT) || __sgi) */
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_findgroup */
+/* Returns: frgroup_t * - NULL = group not found, else pointer to group */
+/* Parameters: group(I) - group name to search for */
+/* unit(I) - device to which this group belongs */
+/* set(I) - which set of rules (inactive/inactive) this is */
+/* fgpp(O) - pointer to place to store pointer to the pointer */
+/* to where to add the next (last) group or where */
+/* to delete group from. */
+/* */
+/* Search amongst the defined groups for a particular group number. */
+/* ------------------------------------------------------------------------ */
+frgroup_t *fr_findgroup(group, unit, set, fgpp)
+char *group;
+minor_t unit;
+int set;
+frgroup_t ***fgpp;
+{
+ frgroup_t *fg, **fgp;
+
+ /*
+ * Which list of groups to search in is dependent on which list of
+ * rules are being operated on.
+ */
+ fgp = &ipfgroups[unit][set];
+
+ while ((fg = *fgp) != NULL) {
+ if (strncmp(group, fg->fg_name, FR_GROUPLEN) == 0)
+ break;
+ else
+ fgp = &fg->fg_next;
+ }
+ if (fgpp != NULL)
+ *fgpp = fgp;
+ return fg;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_addgroup */
+/* Returns: frgroup_t * - NULL == did not create group, */
+/* != NULL == pointer to the group */
+/* Parameters: num(I) - group number to add */
+/* head(I) - rule pointer that is using this as the head */
+/* flags(I) - rule flags which describe the type of rule it is */
+/* unit(I) - device to which this group will belong to */
+/* set(I) - which set of rules (inactive/inactive) this is */
+/* Write Locks: ipf_mutex */
+/* */
+/* Add a new group head, or if it already exists, increase the reference */
+/* count to it. */
+/* ------------------------------------------------------------------------ */
+frgroup_t *fr_addgroup(group, head, flags, unit, set)
+char *group;
+void *head;
+u_32_t flags;
+minor_t unit;
+int set;
+{
+ frgroup_t *fg, **fgp;
+ u_32_t gflags;
+
+ if (group == NULL)
+ return NULL;
+
+ if (unit == IPL_LOGIPF && *group == '\0')
+ return NULL;
+
+ fgp = NULL;
+ gflags = flags & FR_INOUT;
+
+ fg = fr_findgroup(group, unit, set, &fgp);
+ if (fg != NULL) {
+ if (fg->fg_flags == 0)
+ fg->fg_flags = gflags;
+ else if (gflags != fg->fg_flags)
+ return NULL;
+ fg->fg_ref++;
+ return fg;
+ }
+ KMALLOC(fg, frgroup_t *);
+ if (fg != NULL) {
+ fg->fg_head = head;
+ fg->fg_start = NULL;
+ fg->fg_next = *fgp;
+ bcopy(group, fg->fg_name, FR_GROUPLEN);
+ fg->fg_flags = gflags;
+ fg->fg_ref = 1;
+ *fgp = fg;
+ }
+ return fg;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_delgroup */
+/* Returns: Nil */
+/* Parameters: group(I) - group name to delete */
+/* unit(I) - device to which this group belongs */
+/* set(I) - which set of rules (inactive/inactive) this is */
+/* Write Locks: ipf_mutex */
+/* */
+/* Attempt to delete a group head. */
+/* Only do this when its reference count reaches 0. */
+/* ------------------------------------------------------------------------ */
+void fr_delgroup(group, unit, set)
+char *group;
+minor_t unit;
+int set;
+{
+ frgroup_t *fg, **fgp;
+
+ fg = fr_findgroup(group, unit, set, &fgp);
+ if (fg == NULL)
+ return;
+
+ fg->fg_ref--;
+ if (fg->fg_ref == 0) {
+ *fgp = fg->fg_next;
+ KFREE(fg);
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_getrulen */
+/* Returns: frentry_t * - NULL == not found, else pointer to rule n */
+/* Parameters: unit(I) - device for which to count the rule's number */
+/* flags(I) - which set of rules to find the rule in */
+/* group(I) - group name */
+/* n(I) - rule number to find */
+/* */
+/* Find rule # n in group # g and return a pointer to it. Return NULl if */
+/* group # g doesn't exist or there are less than n rules in the group. */
+/* ------------------------------------------------------------------------ */
+frentry_t *fr_getrulen(unit, group, n)
+int unit;
+char *group;
+u_32_t n;
+{
+ frentry_t *fr;
+ frgroup_t *fg;
+
+ fg = fr_findgroup(group, unit, fr_active, NULL);
+ if (fg == NULL)
+ return NULL;
+ for (fr = fg->fg_head; fr && n; fr = fr->fr_next, n--)
+ ;
+ if (n != 0)
+ return NULL;
+ return fr;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_rulen */
+/* Returns: int - >= 0 - rule number, -1 == search failed */
+/* Parameters: unit(I) - device for which to count the rule's number */
+/* fr(I) - pointer to rule to match */
+/* */
+/* Return the number for a rule on a specific filtering device. */
+/* ------------------------------------------------------------------------ */
+int fr_rulen(unit, fr)
+int unit;
+frentry_t *fr;
+{
+ frentry_t *fh;
+ frgroup_t *fg;
+ u_32_t n = 0;
+
+ if (fr == NULL)
+ return -1;
+ fg = fr_findgroup(fr->fr_group, unit, fr_active, NULL);
+ if (fg == NULL)
+ return -1;
+ for (fh = fg->fg_head; fh; n++, fh = fh->fr_next)
+ if (fh == fr)
+ break;
+ if (fh == NULL)
+ return -1;
+ return n;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frflushlist */
+/* Returns: int - >= 0 - number of flushed rules */
+/* Parameters: set(I) - which set of rules (inactive/inactive) this is */
+/* unit(I) - device for which to flush rules */
+/* flags(I) - which set of rules to flush */
+/* nfreedp(O) - pointer to int where flush count is stored */
+/* listp(I) - pointer to list to flush pointer */
+/* Write Locks: ipf_mutex */
+/* */
+/* Recursively flush rules from the list, descending groups as they are */
+/* encountered. if a rule is the head of a group and it has lost all its */
+/* group members, then also delete the group reference. nfreedp is needed */
+/* to store the accumulating count of rules removed, whereas the returned */
+/* value is just the number removed from the current list. The latter is */
+/* needed to correctly adjust reference counts on rules that define groups. */
+/* */
+/* NOTE: Rules not loaded from user space cannot be flushed. */
+/* ------------------------------------------------------------------------ */
+static int frflushlist(set, unit, nfreedp, listp)
+int set;
+minor_t unit;
+int *nfreedp;
+frentry_t **listp;
+{
+ int freed = 0, i;
+ frentry_t *fp;
+
+ while ((fp = *listp) != NULL) {
+ if ((fp->fr_type & FR_T_BUILTIN) ||
+ !(fp->fr_flags & FR_COPIED)) {
+ listp = &fp->fr_next;
+ continue;
+ }
+ *listp = fp->fr_next;
+ if (fp->fr_grp != NULL) {
+ i = frflushlist(set, unit, nfreedp, fp->fr_grp);
+ fp->fr_ref -= i;
+ }
+
+ if (fp->fr_grhead != NULL) {
+ fr_delgroup(fp->fr_grhead, unit, set);
+ *fp->fr_grhead = '\0';
+ }
+
+ ASSERT(fp->fr_ref > 0);
+ fp->fr_next = NULL;
+ if (fr_derefrule(&fp) == 0)
+ freed++;
+ }
+ *nfreedp += freed;
+ return freed;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frflush */
+/* Returns: int - >= 0 - number of flushed rules */
+/* Parameters: unit(I) - device for which to flush rules */
+/* flags(I) - which set of rules to flush */
+/* */
+/* Calls flushlist() for all filter rules (accounting, firewall - both IPv4 */
+/* and IPv6) as defined by the value of flags. */
+/* ------------------------------------------------------------------------ */
+int frflush(unit, proto, flags)
+minor_t unit;
+int proto, flags;
+{
+ int flushed = 0, set;
+
+ WRITE_ENTER(&ipf_mutex);
+ bzero((char *)frcache, sizeof(frcache));
+
+ set = fr_active;
+ if ((flags & FR_INACTIVE) == FR_INACTIVE)
+ set = 1 - set;
+
+ if (flags & FR_OUTQUE) {
+ if (proto == 0 || proto == 6) {
+ (void) frflushlist(set, unit,
+ &flushed, &ipfilter6[1][set]);
+ (void) frflushlist(set, unit,
+ &flushed, &ipacct6[1][set]);
+ }
+ if (proto == 0 || proto == 4) {
+ (void) frflushlist(set, unit,
+ &flushed, &ipfilter[1][set]);
+ (void) frflushlist(set, unit,
+ &flushed, &ipacct[1][set]);
+ }
+ }
+ if (flags & FR_INQUE) {
+ if (proto == 0 || proto == 6) {
+ (void) frflushlist(set, unit,
+ &flushed, &ipfilter6[0][set]);
+ (void) frflushlist(set, unit,
+ &flushed, &ipacct6[0][set]);
+ }
+ if (proto == 0 || proto == 4) {
+ (void) frflushlist(set, unit,
+ &flushed, &ipfilter[0][set]);
+ (void) frflushlist(set, unit,
+ &flushed, &ipacct[0][set]);
+ }
+ }
+ RWLOCK_EXIT(&ipf_mutex);
+
+ if (unit == IPL_LOGIPF) {
+ int tmp;
+
+ tmp = frflush(IPL_LOGCOUNT, proto, flags);
+ if (tmp >= 0)
+ flushed += tmp;
+ }
+ return flushed;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: memstr */
+/* Returns: char * - NULL if failed, != NULL pointer to matching bytes */
+/* Parameters: src(I) - pointer to byte sequence to match */
+/* dst(I) - pointer to byte sequence to search */
+/* slen(I) - match length */
+/* dlen(I) - length available to search in */
+/* */
+/* Search dst for a sequence of bytes matching those at src and extend for */
+/* slen bytes. */
+/* ------------------------------------------------------------------------ */
+char *memstr(src, dst, slen, dlen)
+const char *src;
+char *dst;
+size_t slen, dlen;
+{
+ char *s = NULL;
+
+ while (dlen >= slen) {
+ if (bcmp(src, dst, slen) == 0) {
+ s = dst;
+ break;
+ }
+ dst++;
+ dlen--;
+ }
+ return s;
+}
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fixskip */
+/* Returns: Nil */
+/* Parameters: listp(IO) - pointer to start of list with skip rule */
+/* rp(I) - rule added/removed with skip in it. */
+/* addremove(I) - adjustment (-1/+1) to make to skip count, */
+/* depending on whether a rule was just added */
+/* or removed. */
+/* */
+/* Adjust all the rules in a list which would have skip'd past the position */
+/* where we are inserting to skip to the right place given the change. */
+/* ------------------------------------------------------------------------ */
+void fr_fixskip(listp, rp, addremove)
+frentry_t **listp, *rp;
+int addremove;
+{
+ int rules, rn;
+ frentry_t *fp;
+
+ rules = 0;
+ for (fp = *listp; (fp != NULL) && (fp != rp); fp = fp->fr_next)
+ rules++;
+
+ if (!fp)
+ return;
+
+ for (rn = 0, fp = *listp; fp && (fp != rp); fp = fp->fr_next, rn++)
+ if (FR_ISSKIP(fp->fr_flags) && (rn + fp->fr_arg >= rules))
+ fp->fr_arg += addremove;
+}
+
+
+#ifdef _KERNEL
+/* ------------------------------------------------------------------------ */
+/* Function: count4bits */
+/* Returns: int - >= 0 - number of consecutive bits in input */
+/* Parameters: ip(I) - 32bit IP address */
+/* */
+/* IPv4 ONLY */
+/* count consecutive 1's in bit mask. If the mask generated by counting */
+/* consecutive 1's is different to that passed, return -1, else return # */
+/* of bits. */
+/* ------------------------------------------------------------------------ */
+int count4bits(ip)
+u_32_t ip;
+{
+ u_32_t ipn;
+ int cnt = 0, i, j;
+
+ ip = ipn = ntohl(ip);
+ for (i = 32; i; i--, ipn *= 2)
+ if (ipn & 0x80000000)
+ cnt++;
+ else
+ break;
+ ipn = 0;
+ for (i = 32, j = cnt; i; i--, j--) {
+ ipn *= 2;
+ if (j > 0)
+ ipn++;
+ }
+ if (ipn == ip)
+ return cnt;
+ return -1;
+}
+
+
+# if 0
+/* ------------------------------------------------------------------------ */
+/* Function: count6bits */
+/* Returns: int - >= 0 - number of consecutive bits in input */
+/* Parameters: msk(I) - pointer to start of IPv6 bitmask */
+/* */
+/* IPv6 ONLY */
+/* count consecutive 1's in bit mask. */
+/* ------------------------------------------------------------------------ */
+int count6bits(msk)
+u_32_t *msk;
+{
+ int i = 0, k;
+ u_32_t j;
+
+ for (k = 3; k >= 0; k--)
+ if (msk[k] == 0xffffffff)
+ i += 32;
+ else {
+ for (j = msk[k]; j; j <<= 1)
+ if (j & 0x80000000)
+ i++;
+ }
+ return i;
+}
+# endif
+#endif /* _KERNEL */
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frsynclist */
+/* Returns: void */
+/* Parameters: fr(I) - start of filter list to sync interface names for */
+/* ifp(I) - interface pointer for limiting sync lookups */
+/* Write Locks: ipf_mutex */
+/* */
+/* Walk through a list of filter rules and resolve any interface names into */
+/* pointers. Where dynamic addresses are used, also update the IP address */
+/* used in the rule. The interface pointer is used to limit the lookups to */
+/* a specific set of matching names if it is non-NULL. */
+/* ------------------------------------------------------------------------ */
+static void frsynclist(fr, ifp)
+frentry_t *fr;
+void *ifp;
+{
+ frdest_t *fdp;
+ int v, i;
+
+ for (; fr; fr = fr->fr_next) {
+ v = fr->fr_v;
+
+ /*
+ * Lookup all the interface names that are part of the rule.
+ */
+ for (i = 0; i < 4; i++) {
+ if ((ifp != NULL) && (fr->fr_ifas[i] != ifp))
+ continue;
+ fr->fr_ifas[i] = fr_resolvenic(fr->fr_ifnames[i], v);
+ }
+
+ if (fr->fr_type == FR_T_IPF) {
+ if (fr->fr_satype != FRI_NORMAL &&
+ fr->fr_satype != FRI_LOOKUP) {
+ (void)fr_ifpaddr(v, fr->fr_satype,
+ fr->fr_ifas[fr->fr_sifpidx],
+ &fr->fr_src, &fr->fr_smsk);
+ }
+ if (fr->fr_datype != FRI_NORMAL &&
+ fr->fr_datype != FRI_LOOKUP) {
+ (void)fr_ifpaddr(v, fr->fr_datype,
+ fr->fr_ifas[fr->fr_difpidx],
+ &fr->fr_dst, &fr->fr_dmsk);
+ }
+ }
+
+ fdp = &fr->fr_tifs[0];
+ if ((ifp == NULL) || (fdp->fd_ifp == ifp))
+ fr_resolvedest(fdp, v);
+
+ fdp = &fr->fr_tifs[1];
+ if ((ifp == NULL) || (fdp->fd_ifp == ifp))
+ fr_resolvedest(fdp, v);
+
+ fdp = &fr->fr_dif;
+ if ((ifp == NULL) || (fdp->fd_ifp == ifp)) {
+ fr_resolvedest(fdp, v);
+
+ fr->fr_flags &= ~FR_DUP;
+ if ((fdp->fd_ifp != (void *)-1) &&
+ (fdp->fd_ifp != NULL))
+ fr->fr_flags |= FR_DUP;
+ }
+
+#ifdef IPFILTER_LOOKUP
+ if (fr->fr_type == FR_T_IPF && fr->fr_satype == FRI_LOOKUP &&
+ fr->fr_srcptr == NULL) {
+ fr->fr_srcptr = fr_resolvelookup(fr->fr_srctype,
+ fr->fr_srcsubtype,
+ &fr->fr_slookup,
+ &fr->fr_srcfunc);
+ }
+ if (fr->fr_type == FR_T_IPF && fr->fr_datype == FRI_LOOKUP &&
+ fr->fr_dstptr == NULL) {
+ fr->fr_dstptr = fr_resolvelookup(fr->fr_dsttype,
+ fr->fr_dstsubtype,
+ &fr->fr_dlookup,
+ &fr->fr_dstfunc);
+ }
+#endif
+ }
+}
+
+
+#ifdef _KERNEL
+/* ------------------------------------------------------------------------ */
+/* Function: frsync */
+/* Returns: void */
+/* Parameters: Nil */
+/* */
+/* frsync() is called when we suspect that the interface list or */
+/* information about interfaces (like IP#) has changed. Go through all */
+/* filter rules, NAT entries and the state table and check if anything */
+/* needs to be changed/updated. */
+/* ------------------------------------------------------------------------ */
+void frsync(ifp)
+void *ifp;
+{
+ int i;
+
+# if !SOLARIS
+ fr_natsync(ifp);
+ fr_statesync(ifp);
+# endif
+
+ WRITE_ENTER(&ipf_mutex);
+ frsynclist(ipacct[0][fr_active], ifp);
+ frsynclist(ipacct[1][fr_active], ifp);
+ frsynclist(ipfilter[0][fr_active], ifp);
+ frsynclist(ipfilter[1][fr_active], ifp);
+ frsynclist(ipacct6[0][fr_active], ifp);
+ frsynclist(ipacct6[1][fr_active], ifp);
+ frsynclist(ipfilter6[0][fr_active], ifp);
+ frsynclist(ipfilter6[1][fr_active], ifp);
+
+ for (i = 0; i < IPL_LOGSIZE; i++) {
+ frgroup_t *g;
+
+ for (g = ipfgroups[i][0]; g != NULL; g = g->fg_next)
+ frsynclist(g->fg_start, ifp);
+ for (g = ipfgroups[i][1]; g != NULL; g = g->fg_next)
+ frsynclist(g->fg_start, ifp);
+ }
+ RWLOCK_EXIT(&ipf_mutex);
+}
+
+
+/*
+ * In the functions below, bcopy() is called because the pointer being
+ * copied _from_ in this instance is a pointer to a char buf (which could
+ * end up being unaligned) and on the kernel's local stack.
+ */
+/* ------------------------------------------------------------------------ */
+/* Function: copyinptr */
+/* Returns: int - 0 = success, else failure */
+/* Parameters: src(I) - pointer to the source address */
+/* dst(I) - destination address */
+/* size(I) - number of bytes to copy */
+/* */
+/* Copy a block of data in from user space, given a pointer to the pointer */
+/* to start copying from (src) and a pointer to where to store it (dst). */
+/* NB: src - pointer to user space pointer, dst - kernel space pointer */
+/* ------------------------------------------------------------------------ */
+int copyinptr(src, dst, size)
+void *src, *dst;
+size_t size;
+{
+ caddr_t ca;
+ int error;
+
+# if SOLARIS
+ error = COPYIN(src, (caddr_t)&ca, sizeof(ca));
+ if (error != 0)
+ return error;
+# else
+ bcopy(src, (caddr_t)&ca, sizeof(ca));
+# endif
+ error = COPYIN(ca, dst, size);
+ if (error != 0)
+ error = EFAULT;
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: copyoutptr */
+/* Returns: int - 0 = success, else failure */
+/* Parameters: src(I) - pointer to the source address */
+/* dst(I) - destination address */
+/* size(I) - number of bytes to copy */
+/* */
+/* Copy a block of data out to user space, given a pointer to the pointer */
+/* to start copying from (src) and a pointer to where to store it (dst). */
+/* NB: src - kernel space pointer, dst - pointer to user space pointer. */
+/* ------------------------------------------------------------------------ */
+int copyoutptr(src, dst, size)
+void *src, *dst;
+size_t size;
+{
+ caddr_t ca;
+ int error;
+
+ bcopy(dst, (caddr_t)&ca, sizeof(ca));
+ error = COPYOUT(src, ca, size);
+ if (error != 0)
+ error = EFAULT;
+ return error;
+}
+#endif
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_lock */
+/* Returns: (void) */
+/* Parameters: data(I) - pointer to lock value to set */
+/* lockp(O) - pointer to location to store old lock value */
+/* */
+/* Get the new value for the lock integer, set it and return the old value */
+/* in *lockp. */
+/* ------------------------------------------------------------------------ */
+void fr_lock(data, lockp)
+caddr_t data;
+int *lockp;
+{
+ int arg;
+
+ BCOPYIN(data, (caddr_t)&arg, sizeof(arg));
+ BCOPYOUT((caddr_t)lockp, data, sizeof(*lockp));
+ *lockp = arg;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_getstat */
+/* Returns: Nil */
+/* Parameters: fiop(I) - pointer to ipfilter stats structure */
+/* */
+/* Stores a copy of current pointers, counters, etc, in the friostat */
+/* structure. */
+/* ------------------------------------------------------------------------ */
+void fr_getstat(fiop)
+friostat_t *fiop;
+{
+ int i, j;
+
+ bcopy((char *)frstats, (char *)fiop->f_st, sizeof(filterstats_t) * 2);
+ fiop->f_locks[IPL_LOGSTATE] = fr_state_lock;
+ fiop->f_locks[IPL_LOGNAT] = fr_nat_lock;
+ fiop->f_locks[IPL_LOGIPF] = fr_frag_lock;
+ fiop->f_locks[IPL_LOGAUTH] = fr_auth_lock;
+
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 2; j++) {
+ fiop->f_ipf[i][j] = ipfilter[i][j];
+ fiop->f_acct[i][j] = ipacct[i][j];
+ fiop->f_ipf6[i][j] = ipfilter6[i][j];
+ fiop->f_acct6[i][j] = ipacct6[i][j];
+ }
+
+ fiop->f_ticks = fr_ticks;
+ fiop->f_active = fr_active;
+ fiop->f_froute[0] = fr_frouteok[0];
+ fiop->f_froute[1] = fr_frouteok[1];
+
+ fiop->f_running = fr_running;
+ for (i = 0; i < IPL_LOGSIZE; i++) {
+ fiop->f_groups[i][0] = ipfgroups[i][0];
+ fiop->f_groups[i][1] = ipfgroups[i][1];
+ }
+#ifdef IPFILTER_LOG
+ fiop->f_logging = 1;
+#else
+ fiop->f_logging = 0;
+#endif
+ fiop->f_defpass = fr_pass;
+ fiop->f_features = fr_features;
+ (void) strncpy(fiop->f_version, ipfilter_version,
+ sizeof(fiop->f_version));
+}
+
+
+#ifdef USE_INET6
+int icmptoicmp6types[ICMP_MAXTYPE+1] = {
+ ICMP6_ECHO_REPLY, /* 0: ICMP_ECHOREPLY */
+ -1, /* 1: UNUSED */
+ -1, /* 2: UNUSED */
+ ICMP6_DST_UNREACH, /* 3: ICMP_UNREACH */
+ -1, /* 4: ICMP_SOURCEQUENCH */
+ ND_REDIRECT, /* 5: ICMP_REDIRECT */
+ -1, /* 6: UNUSED */
+ -1, /* 7: UNUSED */
+ ICMP6_ECHO_REQUEST, /* 8: ICMP_ECHO */
+ -1, /* 9: UNUSED */
+ -1, /* 10: UNUSED */
+ ICMP6_TIME_EXCEEDED, /* 11: ICMP_TIMXCEED */
+ ICMP6_PARAM_PROB, /* 12: ICMP_PARAMPROB */
+ -1, /* 13: ICMP_TSTAMP */
+ -1, /* 14: ICMP_TSTAMPREPLY */
+ -1, /* 15: ICMP_IREQ */
+ -1, /* 16: ICMP_IREQREPLY */
+ -1, /* 17: ICMP_MASKREQ */
+ -1, /* 18: ICMP_MASKREPLY */
+};
+
+
+int icmptoicmp6unreach[ICMP_MAX_UNREACH] = {
+ ICMP6_DST_UNREACH_ADDR, /* 0: ICMP_UNREACH_NET */
+ ICMP6_DST_UNREACH_ADDR, /* 1: ICMP_UNREACH_HOST */
+ -1, /* 2: ICMP_UNREACH_PROTOCOL */
+ ICMP6_DST_UNREACH_NOPORT, /* 3: ICMP_UNREACH_PORT */
+ -1, /* 4: ICMP_UNREACH_NEEDFRAG */
+ ICMP6_DST_UNREACH_NOTNEIGHBOR, /* 5: ICMP_UNREACH_SRCFAIL */
+ ICMP6_DST_UNREACH_ADDR, /* 6: ICMP_UNREACH_NET_UNKNOWN */
+ ICMP6_DST_UNREACH_ADDR, /* 7: ICMP_UNREACH_HOST_UNKNOWN */
+ -1, /* 8: ICMP_UNREACH_ISOLATED */
+ ICMP6_DST_UNREACH_ADMIN, /* 9: ICMP_UNREACH_NET_PROHIB */
+ ICMP6_DST_UNREACH_ADMIN, /* 10: ICMP_UNREACH_HOST_PROHIB */
+ -1, /* 11: ICMP_UNREACH_TOSNET */
+ -1, /* 12: ICMP_UNREACH_TOSHOST */
+ ICMP6_DST_UNREACH_ADMIN, /* 13: ICMP_UNREACH_ADMIN_PROHIBIT */
+};
+int icmpreplytype6[ICMP6_MAXTYPE + 1];
+#endif
+
+int icmpreplytype4[ICMP_MAXTYPE + 1];
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_matchicmpqueryreply */
+/* Returns: int - 1 if "icmp" is a valid reply to "ic" else 0. */
+/* Parameters: v(I) - IP protocol version (4 or 6) */
+/* ic(I) - ICMP information */
+/* icmp(I) - ICMP packet header */
+/* rev(I) - direction (0 = forward/1 = reverse) of packet */
+/* */
+/* Check if the ICMP packet defined by the header pointed to by icmp is a */
+/* reply to one as described by what's in ic. If it is a match, return 1, */
+/* else return 0 for no match. */
+/* ------------------------------------------------------------------------ */
+int fr_matchicmpqueryreply(v, ic, icmp, rev)
+int v;
+icmpinfo_t *ic;
+icmphdr_t *icmp;
+int rev;
+{
+ int ictype;
+
+ ictype = ic->ici_type;
+
+ if (v == 4) {
+ /*
+ * If we matched its type on the way in, then when going out
+ * it will still be the same type.
+ */
+ if ((!rev && (icmp->icmp_type == ictype)) ||
+ (rev && (icmpreplytype4[ictype] == icmp->icmp_type))) {
+ if (icmp->icmp_type != ICMP_ECHOREPLY)
+ return 1;
+ if (icmp->icmp_id == ic->ici_id)
+ return 1;
+ }
+ }
+#ifdef USE_INET6
+ else if (v == 6) {
+ if ((!rev && (icmp->icmp_type == ictype)) ||
+ (rev && (icmpreplytype6[ictype] == icmp->icmp_type))) {
+ if (icmp->icmp_type != ICMP6_ECHO_REPLY)
+ return 1;
+ if (icmp->icmp_id == ic->ici_id)
+ return 1;
+ }
+ }
+#endif
+ return 0;
+}
+
+
+#ifdef IPFILTER_LOOKUP
+/* ------------------------------------------------------------------------ */
+/* Function: fr_resolvelookup */
+/* Returns: void * - NULL = failure, else success. */
+/* Parameters: type(I) - type of lookup these parameters are for. */
+/* subtype(I) - whether the info below contains number/name */
+/* info(I) - pointer to name/number of the lookup data */
+/* funcptr(IO) - pointer to pointer for storing IP address */
+/* searching function. */
+/* */
+/* Search for the "table" number passed in amongst those configured for */
+/* that particular type. If the type is recognised then the function to */
+/* call to do the IP address search will be change, regardless of whether */
+/* or not the "table" number exists. */
+/* ------------------------------------------------------------------------ */
+static void *fr_resolvelookup(type, subtype, info, funcptr)
+u_int type, subtype;
+i6addr_t *info;
+lookupfunc_t *funcptr;
+{
+ char label[FR_GROUPLEN], *name;
+ iphtable_t *iph;
+ ip_pool_t *ipo;
+ void *ptr;
+
+ if (subtype == 0) {
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(label, sizeof(label), "%u", info->iplookupnum);
+#else
+ (void) sprintf(label, "%u", info->iplookupnum);
+#endif
+ name = label;
+ } else if (subtype == 1) {
+ /*
+ * Because iplookupname is currently only a 12 character
+ * string and FR_GROUPLEN is 16, copy all of it into the
+ * label buffer and add on a NULL at the end.
+ */
+ strncpy(label, info->iplookupname, sizeof(info->iplookupname));
+ label[sizeof(info->iplookupname)] = '\0';
+ name = label;
+ } else {
+ return NULL;
+ }
+
+ READ_ENTER(&ip_poolrw);
+
+ switch (type)
+ {
+ case IPLT_POOL :
+# if (defined(__osf__) && defined(_KERNEL))
+ ptr = NULL;
+ *funcptr = NULL;
+# else
+ ipo = ip_pool_find(IPL_LOGIPF, name);
+ ptr = ipo;
+ if (ipo != NULL) {
+ ATOMIC_INC32(ipo->ipo_ref);
+ }
+ *funcptr = ip_pool_search;
+# endif
+ break;
+ case IPLT_HASH :
+ iph = fr_findhtable(IPL_LOGIPF, name);
+ ptr = iph;
+ if (iph != NULL) {
+ ATOMIC_INC32(iph->iph_ref);
+ }
+ *funcptr = fr_iphmfindip;
+ break;
+ default:
+ ptr = NULL;
+ *funcptr = NULL;
+ break;
+ }
+ RWLOCK_EXIT(&ip_poolrw);
+
+ return ptr;
+}
+#endif
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: frrequest */
+/* Returns: int - 0 == success, > 0 == errno value */
+/* Parameters: unit(I) - device for which this is for */
+/* req(I) - ioctl command (SIOC*) */
+/* data(I) - pointr to ioctl data */
+/* set(I) - 1 or 0 (filter set) */
+/* makecopy(I) - flag indicating whether data points to a rule */
+/* in kernel space & hence doesn't need copying. */
+/* */
+/* This function handles all the requests which operate on the list of */
+/* filter rules. This includes adding, deleting, insertion. It is also */
+/* responsible for creating groups when a "head" rule is loaded. Interface */
+/* names are resolved here and other sanity checks are made on the content */
+/* of the rule structure being loaded. If a rule has user defined timeouts */
+/* then make sure they are created and initialised before exiting. */
+/* ------------------------------------------------------------------------ */
+int frrequest(unit, req, data, set, makecopy)
+int unit;
+ioctlcmd_t req;
+int set, makecopy;
+caddr_t data;
+{
+ frentry_t frd, *fp, *f, **fprev, **ftail;
+ int error = 0, in, v;
+ void *ptr, *uptr;
+ u_int *p, *pp;
+ frgroup_t *fg;
+ char *group;
+
+ fg = NULL;
+ fp = &frd;
+ if (makecopy != 0) {
+ error = fr_inobj(data, fp, IPFOBJ_FRENTRY);
+ if (error)
+ return EFAULT;
+ if ((fp->fr_flags & FR_T_BUILTIN) != 0)
+ return EINVAL;
+ fp->fr_ref = 0;
+ fp->fr_flags |= FR_COPIED;
+ } else {
+ fp = (frentry_t *)data;
+ if ((fp->fr_type & FR_T_BUILTIN) == 0)
+ return EINVAL;
+ fp->fr_flags &= ~FR_COPIED;
+ }
+
+ if (((fp->fr_dsize == 0) && (fp->fr_data != NULL)) ||
+ ((fp->fr_dsize != 0) && (fp->fr_data == NULL)))
+ return EINVAL;
+
+ v = fp->fr_v;
+ uptr = fp->fr_data;
+
+ /*
+ * Only filter rules for IPv4 or IPv6 are accepted.
+ */
+ if (v == 4)
+ /*EMPTY*/;
+#ifdef USE_INET6
+ else if (v == 6)
+ /*EMPTY*/;
+#endif
+ else {
+ return EINVAL;
+ }
+
+ /*
+ * If the rule is being loaded from user space, i.e. we had to copy it
+ * into kernel space, then do not trust the function pointer in the
+ * rule.
+ */
+ if ((makecopy == 1) && (fp->fr_func != NULL)) {
+ if (fr_findfunc(fp->fr_func) == NULL)
+ return ESRCH;
+ error = fr_funcinit(fp);
+ if (error != 0)
+ return error;
+ }
+
+ ptr = NULL;
+ /*
+ * Check that the group number does exist and that its use (in/out)
+ * matches what the rule is.
+ */
+ if (!strncmp(fp->fr_grhead, "0", FR_GROUPLEN))
+ *fp->fr_grhead = '\0';
+ group = fp->fr_group;
+ if (!strncmp(group, "0", FR_GROUPLEN))
+ *group = '\0';
+
+ if (FR_ISACCOUNT(fp->fr_flags))
+ unit = IPL_LOGCOUNT;
+
+ if ((req != (int)SIOCZRLST) && (*group != '\0')) {
+ fg = fr_findgroup(group, unit, set, NULL);
+ if (fg == NULL)
+ return ESRCH;
+ if (fg->fg_flags == 0)
+ fg->fg_flags = fp->fr_flags & FR_INOUT;
+ else if (fg->fg_flags != (fp->fr_flags & FR_INOUT))
+ return ESRCH;
+ }
+
+ in = (fp->fr_flags & FR_INQUE) ? 0 : 1;
+
+ /*
+ * Work out which rule list this change is being applied to.
+ */
+ ftail = NULL;
+ fprev = NULL;
+ if (unit == IPL_LOGAUTH)
+ fprev = &ipauth;
+ else if (v == 4) {
+ if (FR_ISACCOUNT(fp->fr_flags))
+ fprev = &ipacct[in][set];
+ else if ((fp->fr_flags & (FR_OUTQUE|FR_INQUE)) != 0)
+ fprev = &ipfilter[in][set];
+ } else if (v == 6) {
+ if (FR_ISACCOUNT(fp->fr_flags))
+ fprev = &ipacct6[in][set];
+ else if ((fp->fr_flags & (FR_OUTQUE|FR_INQUE)) != 0)
+ fprev = &ipfilter6[in][set];
+ }
+ if (fprev == NULL)
+ return ESRCH;
+
+ if (*group != '\0') {
+ if (!fg && !(fg = fr_findgroup(group, unit, set, NULL)))
+ return ESRCH;
+ fprev = &fg->fg_start;
+ }
+
+ /*
+ * Copy in extra data for the rule.
+ */
+ if (fp->fr_dsize != 0) {
+ if (makecopy != 0) {
+ KMALLOCS(ptr, void *, fp->fr_dsize);
+ if (!ptr)
+ return ENOMEM;
+ error = COPYIN(uptr, ptr, fp->fr_dsize);
+ if (error != 0)
+ error = EFAULT;
+ } else {
+ ptr = uptr;
+ error = 0;
+ }
+ if (error != 0) {
+ KFREES(ptr, fp->fr_dsize);
+ return ENOMEM;
+ }
+ fp->fr_data = ptr;
+ } else
+ fp->fr_data = NULL;
+
+ /*
+ * Perform per-rule type sanity checks of their members.
+ */
+ switch (fp->fr_type & ~FR_T_BUILTIN)
+ {
+#if defined(IPFILTER_BPF)
+ case FR_T_BPFOPC :
+ if (fp->fr_dsize == 0)
+ return EINVAL;
+ if (!bpf_validate(ptr, fp->fr_dsize/sizeof(struct bpf_insn))) {
+ if (makecopy && fp->fr_data != NULL) {
+ KFREES(fp->fr_data, fp->fr_dsize);
+ }
+ return EINVAL;
+ }
+ break;
+#endif
+ case FR_T_IPF :
+ if (fp->fr_dsize != sizeof(fripf_t))
+ return EINVAL;
+
+ /*
+ * Allowing a rule with both "keep state" and "with oow" is
+ * pointless because adding a state entry to the table will
+ * fail with the out of window (oow) flag set.
+ */
+ if ((fp->fr_flags & FR_KEEPSTATE) && (fp->fr_flx & FI_OOW))
+ return EINVAL;
+
+ switch (fp->fr_satype)
+ {
+ case FRI_BROADCAST :
+ case FRI_DYNAMIC :
+ case FRI_NETWORK :
+ case FRI_NETMASKED :
+ case FRI_PEERADDR :
+ if (fp->fr_sifpidx < 0 || fp->fr_sifpidx > 3) {
+ if (makecopy && fp->fr_data != NULL) {
+ KFREES(fp->fr_data, fp->fr_dsize);
+ }
+ return EINVAL;
+ }
+ break;
+#ifdef IPFILTER_LOOKUP
+ case FRI_LOOKUP :
+ fp->fr_srcptr = fr_resolvelookup(fp->fr_srctype,
+ fp->fr_srcsubtype,
+ &fp->fr_slookup,
+ &fp->fr_srcfunc);
+ if (fp->fr_srcptr == NULL)
+ return ESRCH;
+ break;
+#endif
+ default :
+ break;
+ }
+
+ switch (fp->fr_datype)
+ {
+ case FRI_BROADCAST :
+ case FRI_DYNAMIC :
+ case FRI_NETWORK :
+ case FRI_NETMASKED :
+ case FRI_PEERADDR :
+ if (fp->fr_difpidx < 0 || fp->fr_difpidx > 3) {
+ if (makecopy && fp->fr_data != NULL) {
+ KFREES(fp->fr_data, fp->fr_dsize);
+ }
+ return EINVAL;
+ }
+ break;
+#ifdef IPFILTER_LOOKUP
+ case FRI_LOOKUP :
+ fp->fr_dstptr = fr_resolvelookup(fp->fr_dsttype,
+ fp->fr_dstsubtype,
+ &fp->fr_dlookup,
+ &fp->fr_dstfunc);
+ if (fp->fr_dstptr == NULL)
+ return ESRCH;
+ break;
+#endif
+ default :
+ break;
+ }
+ break;
+ case FR_T_NONE :
+ break;
+ case FR_T_CALLFUNC :
+ break;
+ case FR_T_COMPIPF :
+ break;
+ default :
+ if (makecopy && fp->fr_data != NULL) {
+ KFREES(fp->fr_data, fp->fr_dsize);
+ }
+ return EINVAL;
+ }
+
+ /*
+ * Lookup all the interface names that are part of the rule.
+ */
+ frsynclist(fp, NULL);
+ fp->fr_statecnt = 0;
+
+ /*
+ * Look for an existing matching filter rule, but don't include the
+ * next or interface pointer in the comparison (fr_next, fr_ifa).
+ * This elminates rules which are indentical being loaded. Checksum
+ * the constant part of the filter rule to make comparisons quicker
+ * (this meaning no pointers are included).
+ */
+ for (fp->fr_cksum = 0, p = (u_int *)&fp->fr_func, pp = &fp->fr_cksum;
+ p < pp; p++)
+ fp->fr_cksum += *p;
+ pp = (u_int *)(fp->fr_caddr + fp->fr_dsize);
+ for (p = (u_int *)fp->fr_data; p < pp; p++)
+ fp->fr_cksum += *p;
+
+ WRITE_ENTER(&ipf_mutex);
+
+ /*
+ * Now that the filter rule lists are locked, we can walk the
+ * chain of them without fear.
+ */
+ ftail = fprev;
+ for (f = *ftail; (f = *ftail) != NULL; ftail = &f->fr_next) {
+ if (fp->fr_collect <= f->fr_collect) {
+ ftail = fprev;
+ f = NULL;
+ break;
+ }
+ fprev = ftail;
+ }
+ bzero((char *)frcache, sizeof(frcache));
+
+ for (; (f = *ftail) != NULL; ftail = &f->fr_next) {
+ if ((fp->fr_cksum != f->fr_cksum) ||
+ (f->fr_dsize != fp->fr_dsize))
+ continue;
+ if (bcmp((char *)&f->fr_func, (char *)&fp->fr_func, FR_CMPSIZ))
+ continue;
+ if ((!ptr && !f->fr_data) ||
+ (ptr && f->fr_data &&
+ !bcmp((char *)ptr, (char *)f->fr_data, f->fr_dsize)))
+ break;
+ }
+
+ /*
+ * If zero'ing statistics, copy current to caller and zero.
+ */
+ if (req == (ioctlcmd_t)SIOCZRLST) {
+ if (f == NULL)
+ error = ESRCH;
+ else {
+ /*
+ * Copy and reduce lock because of impending copyout.
+ * Well we should, but if we do then the atomicity of
+ * this call and the correctness of fr_hits and
+ * fr_bytes cannot be guaranteed. As it is, this code
+ * only resets them to 0 if they are successfully
+ * copied out into user space.
+ */
+ bcopy((char *)f, (char *)fp, sizeof(*f));
+ /* MUTEX_DOWNGRADE(&ipf_mutex); */
+
+ /*
+ * When we copy this rule back out, set the data
+ * pointer to be what it was in user space.
+ */
+ fp->fr_data = uptr;
+ error = fr_outobj(data, fp, IPFOBJ_FRENTRY);
+
+ if (error == 0) {
+ if ((f->fr_dsize != 0) && (uptr != NULL))
+ error = COPYOUT(f->fr_data, uptr,
+ f->fr_dsize);
+ if (error != 0)
+ error = EFAULT;
+ if (error == 0) {
+ f->fr_hits = 0;
+ f->fr_bytes = 0;
+ }
+ }
+ }
+
+ if ((ptr != NULL) && (makecopy != 0)) {
+ KFREES(ptr, fp->fr_dsize);
+ }
+ RWLOCK_EXIT(&ipf_mutex);
+ return error;
+ }
+
+ if (!f) {
+ /*
+ * At the end of this, ftail must point to the place where the
+ * new rule is to be saved/inserted/added.
+ * For SIOCAD*FR, this should be the last rule in the group of
+ * rules that have equal fr_collect fields.
+ * For SIOCIN*FR, ...
+ */
+ if (req == (ioctlcmd_t)SIOCADAFR ||
+ req == (ioctlcmd_t)SIOCADIFR) {
+
+ for (ftail = fprev; (f = *ftail) != NULL; ) {
+ if (f->fr_collect > fp->fr_collect)
+ break;
+ ftail = &f->fr_next;
+ }
+ f = NULL;
+ ptr = NULL;
+ error = 0;
+ } else if (req == (ioctlcmd_t)SIOCINAFR ||
+ req == (ioctlcmd_t)SIOCINIFR) {
+ while ((f = *fprev) != NULL) {
+ if (f->fr_collect >= fp->fr_collect)
+ break;
+ fprev = &f->fr_next;
+ }
+ ftail = fprev;
+ if (fp->fr_hits != 0) {
+ while (fp->fr_hits && (f = *ftail)) {
+ if (f->fr_collect != fp->fr_collect)
+ break;
+ fprev = ftail;
+ ftail = &f->fr_next;
+ fp->fr_hits--;
+ }
+ }
+ f = NULL;
+ ptr = NULL;
+ error = 0;
+ }
+ }
+
+ /*
+ * Request to remove a rule.
+ */
+ if (req == (ioctlcmd_t)SIOCRMAFR || req == (ioctlcmd_t)SIOCRMIFR) {
+ if (!f)
+ error = ESRCH;
+ else {
+ /*
+ * Do not allow activity from user space to interfere
+ * with rules not loaded that way.
+ */
+ if ((makecopy == 1) && !(f->fr_flags & FR_COPIED)) {
+ error = EPERM;
+ goto done;
+ }
+
+ /*
+ * Return EBUSY if the rule is being reference by
+ * something else (eg state information.
+ */
+ if (f->fr_ref > 1) {
+ error = EBUSY;
+ goto done;
+ }
+#ifdef IPFILTER_SCAN
+ if (f->fr_isctag[0] != '\0' &&
+ (f->fr_isc != (struct ipscan *)-1))
+ ipsc_detachfr(f);
+#endif
+ if ((fg != NULL) && (fg->fg_head != NULL))
+ fg->fg_head->fr_ref--;
+ if (unit == IPL_LOGAUTH) {
+ error = fr_preauthcmd(req, f, ftail);
+ goto done;
+ }
+ if (*f->fr_grhead != '\0')
+ fr_delgroup(f->fr_grhead, unit, set);
+ fr_fixskip(ftail, f, -1);
+ *ftail = f->fr_next;
+ f->fr_next = NULL;
+ (void) fr_derefrule(&f);
+ }
+ } else {
+ /*
+ * Not removing, so we must be adding/inserting a rule.
+ */
+ if (f)
+ error = EEXIST;
+ else {
+ if (unit == IPL_LOGAUTH) {
+ error = fr_preauthcmd(req, fp, ftail);
+ goto done;
+ }
+ if (makecopy) {
+ KMALLOC(f, frentry_t *);
+ } else
+ f = fp;
+ if (f != NULL) {
+ if (fg != NULL && fg->fg_head != NULL)
+ fg->fg_head->fr_ref++;
+ if (fp != f)
+ bcopy((char *)fp, (char *)f,
+ sizeof(*f));
+ MUTEX_NUKE(&f->fr_lock);
+ MUTEX_INIT(&f->fr_lock, "filter rule lock");
+#ifdef IPFILTER_SCAN
+ if (f->fr_isctag[0] != '\0' &&
+ ipsc_attachfr(f))
+ f->fr_isc = (struct ipscan *)-1;
+#endif
+ f->fr_hits = 0;
+ if (makecopy != 0)
+ f->fr_ref = 1;
+ f->fr_next = *ftail;
+ *ftail = f;
+ if (req == (ioctlcmd_t)SIOCINIFR ||
+ req == (ioctlcmd_t)SIOCINAFR)
+ fr_fixskip(ftail, f, 1);
+ f->fr_grp = NULL;
+ group = f->fr_grhead;
+ if (*group != '\0') {
+ fg = fr_addgroup(group, f, f->fr_flags,
+ unit, set);
+ if (fg != NULL)
+ f->fr_grp = &fg->fg_start;
+ }
+ } else
+ error = ENOMEM;
+ }
+ }
+done:
+ RWLOCK_EXIT(&ipf_mutex);
+ if ((ptr != NULL) && (error != 0) && (makecopy != 0)) {
+ KFREES(ptr, fp->fr_dsize);
+ }
+ return (error);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_funcinit */
+/* Returns: int - 0 == success, else ESRCH: cannot resolve rule details */
+/* Parameters: fr(I) - pointer to filter rule */
+/* */
+/* If a rule is a call rule, then check if the function it points to needs */
+/* an init function to be called now the rule has been loaded. */
+/* ------------------------------------------------------------------------ */
+static int fr_funcinit(fr)
+frentry_t *fr;
+{
+ ipfunc_resolve_t *ft;
+ int err;
+
+ err = ESRCH;
+
+ for (ft = fr_availfuncs; ft->ipfu_addr != NULL; ft++)
+ if (ft->ipfu_addr == fr->fr_func) {
+ err = 0;
+ if (ft->ipfu_init != NULL)
+ err = (*ft->ipfu_init)(fr);
+ break;
+ }
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_findfunc */
+/* Returns: ipfunc_t - pointer to function if found, else NULL */
+/* Parameters: funcptr(I) - function pointer to lookup */
+/* */
+/* Look for a function in the table of known functions. */
+/* ------------------------------------------------------------------------ */
+static ipfunc_t fr_findfunc(funcptr)
+ipfunc_t funcptr;
+{
+ ipfunc_resolve_t *ft;
+
+ for (ft = fr_availfuncs; ft->ipfu_addr != NULL; ft++)
+ if (ft->ipfu_addr == funcptr)
+ return funcptr;
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_resolvefunc */
+/* Returns: int - 0 == success, else error */
+/* Parameters: data(IO) - ioctl data pointer to ipfunc_resolve_t struct */
+/* */
+/* Copy in a ipfunc_resolve_t structure and then fill in the missing field. */
+/* This will either be the function name (if the pointer is set) or the */
+/* function pointer if the name is set. When found, fill in the other one */
+/* so that the entire, complete, structure can be copied back to user space.*/
+/* ------------------------------------------------------------------------ */
+int fr_resolvefunc(data)
+void *data;
+{
+ ipfunc_resolve_t res, *ft;
+
+ BCOPYIN(data, &res, sizeof(res));
+
+ if (res.ipfu_addr == NULL && res.ipfu_name[0] != '\0') {
+ for (ft = fr_availfuncs; ft->ipfu_addr != NULL; ft++)
+ if (strncmp(res.ipfu_name, ft->ipfu_name,
+ sizeof(res.ipfu_name)) == 0) {
+ res.ipfu_addr = ft->ipfu_addr;
+ res.ipfu_init = ft->ipfu_init;
+ if (COPYOUT(&res, data, sizeof(res)) != 0)
+ return EFAULT;
+ return 0;
+ }
+ }
+ if (res.ipfu_addr != NULL && res.ipfu_name[0] == '\0') {
+ for (ft = fr_availfuncs; ft->ipfu_addr != NULL; ft++)
+ if (ft->ipfu_addr == res.ipfu_addr) {
+ (void) strncpy(res.ipfu_name, ft->ipfu_name,
+ sizeof(res.ipfu_name));
+ res.ipfu_init = ft->ipfu_init;
+ if (COPYOUT(&res, data, sizeof(res)) != 0)
+ return EFAULT;
+ return 0;
+ }
+ }
+ return ESRCH;
+}
+
+
+#if !defined(_KERNEL) || (!defined(__NetBSD__) && !defined(__OpenBSD__) && !defined(__FreeBSD__)) || \
+ (defined(__FreeBSD__) && (__FreeBSD_version < 501000)) || \
+ (defined(__NetBSD__) && (__NetBSD_Version__ < 105000000)) || \
+ (defined(__OpenBSD__) && (OpenBSD < 200006))
+/*
+ * From: NetBSD
+ * ppsratecheck(): packets (or events) per second limitation.
+ */
+int
+ppsratecheck(lasttime, curpps, maxpps)
+ struct timeval *lasttime;
+ int *curpps;
+ int maxpps; /* maximum pps allowed */
+{
+ struct timeval tv, delta;
+ int rv;
+
+ GETKTIME(&tv);
+
+ delta.tv_sec = tv.tv_sec - lasttime->tv_sec;
+ delta.tv_usec = tv.tv_usec - lasttime->tv_usec;
+ if (delta.tv_usec < 0) {
+ delta.tv_sec--;
+ delta.tv_usec += 1000000;
+ }
+
+ /*
+ * check for 0,0 is so that the message will be seen at least once.
+ * if more than one second have passed since the last update of
+ * lasttime, reset the counter.
+ *
+ * we do increment *curpps even in *curpps < maxpps case, as some may
+ * try to use *curpps for stat purposes as well.
+ */
+ if ((lasttime->tv_sec == 0 && lasttime->tv_usec == 0) ||
+ delta.tv_sec >= 1) {
+ *lasttime = tv;
+ *curpps = 0;
+ rv = 1;
+ } else if (maxpps < 0)
+ rv = 1;
+ else if (*curpps < maxpps)
+ rv = 1;
+ else
+ rv = 0;
+ *curpps = *curpps + 1;
+
+ return (rv);
+}
+#endif
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_derefrule */
+/* Returns: int - 0 == rule freed up, else rule not freed */
+/* Parameters: fr(I) - pointer to filter rule */
+/* */
+/* Decrement the reference counter to a rule by one. If it reaches zero, */
+/* free it and any associated storage space being used by it. */
+/* ------------------------------------------------------------------------ */
+int fr_derefrule(frp)
+frentry_t **frp;
+{
+ frentry_t *fr;
+
+ fr = *frp;
+ *frp = NULL;
+
+ MUTEX_ENTER(&fr->fr_lock);
+ fr->fr_ref--;
+ if (fr->fr_ref == 0) {
+ MUTEX_EXIT(&fr->fr_lock);
+ MUTEX_DESTROY(&fr->fr_lock);
+
+#ifdef IPFILTER_LOOKUP
+ if (fr->fr_type == FR_T_IPF && fr->fr_satype == FRI_LOOKUP)
+ ip_lookup_deref(fr->fr_srctype, fr->fr_srcptr);
+ if (fr->fr_type == FR_T_IPF && fr->fr_datype == FRI_LOOKUP)
+ ip_lookup_deref(fr->fr_dsttype, fr->fr_dstptr);
+#endif
+
+ if (fr->fr_dsize) {
+ KFREES(fr->fr_data, fr->fr_dsize);
+ }
+ if ((fr->fr_flags & FR_COPIED) != 0) {
+ KFREE(fr);
+ return 0;
+ }
+ return 1;
+ } else {
+ MUTEX_EXIT(&fr->fr_lock);
+ }
+ return -1;
+}
+
+
+#ifdef IPFILTER_LOOKUP
+/* ------------------------------------------------------------------------ */
+/* Function: fr_grpmapinit */
+/* Returns: int - 0 == success, else ESRCH because table entry not found*/
+/* Parameters: fr(I) - pointer to rule to find hash table for */
+/* */
+/* Looks for group hash table fr_arg and stores a pointer to it in fr_ptr. */
+/* fr_ptr is later used by fr_srcgrpmap and fr_dstgrpmap. */
+/* ------------------------------------------------------------------------ */
+static int fr_grpmapinit(fr)
+frentry_t *fr;
+{
+ char name[FR_GROUPLEN];
+ iphtable_t *iph;
+
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(name, sizeof(name), "%d", fr->fr_arg);
+#else
+ (void) sprintf(name, "%d", fr->fr_arg);
+#endif
+ iph = fr_findhtable(IPL_LOGIPF, name);
+ if (iph == NULL)
+ return ESRCH;
+ if ((iph->iph_flags & FR_INOUT) != (fr->fr_flags & FR_INOUT))
+ return ESRCH;
+ fr->fr_ptr = iph;
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_srcgrpmap */
+/* Returns: frentry_t * - pointer to "new last matching" rule or NULL */
+/* Parameters: fin(I) - pointer to packet information */
+/* passp(IO) - pointer to current/new filter decision (unused) */
+/* */
+/* Look for a rule group head in a hash table, using the source address as */
+/* the key, and descend into that group and continue matching rules against */
+/* the packet. */
+/* ------------------------------------------------------------------------ */
+frentry_t *fr_srcgrpmap(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ frgroup_t *fg;
+ void *rval;
+
+ rval = fr_iphmfindgroup(fin->fin_fr->fr_ptr, &fin->fin_src);
+ if (rval == NULL)
+ return NULL;
+
+ fg = rval;
+ fin->fin_fr = fg->fg_start;
+ (void) fr_scanlist(fin, *passp);
+ return fin->fin_fr;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_dstgrpmap */
+/* Returns: frentry_t * - pointer to "new last matching" rule or NULL */
+/* Parameters: fin(I) - pointer to packet information */
+/* passp(IO) - pointer to current/new filter decision (unused) */
+/* */
+/* Look for a rule group head in a hash table, using the destination */
+/* address as the key, and descend into that group and continue matching */
+/* rules against the packet. */
+/* ------------------------------------------------------------------------ */
+frentry_t *fr_dstgrpmap(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ frgroup_t *fg;
+ void *rval;
+
+ rval = fr_iphmfindgroup(fin->fin_fr->fr_ptr, &fin->fin_dst);
+ if (rval == NULL)
+ return NULL;
+
+ fg = rval;
+ fin->fin_fr = fg->fg_start;
+ (void) fr_scanlist(fin, *passp);
+ return fin->fin_fr;
+}
+#endif /* IPFILTER_LOOKUP */
+
+/*
+ * Queue functions
+ * ===============
+ * These functions manage objects on queues for efficient timeouts. There are
+ * a number of system defined queues as well as user defined timeouts. It is
+ * expected that a lock is held in the domain in which the queue belongs
+ * (i.e. either state or NAT) when calling any of these functions that prevents
+ * fr_freetimeoutqueue() from being called at the same time as any other.
+ */
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_addtimeoutqueue */
+/* Returns: struct ifqtq * - NULL if malloc fails, else pointer to */
+/* timeout queue with given interval. */
+/* Parameters: parent(I) - pointer to pointer to parent node of this list */
+/* of interface queues. */
+/* seconds(I) - timeout value in seconds for this queue. */
+/* */
+/* This routine first looks for a timeout queue that matches the interval */
+/* being requested. If it finds one, increments the reference counter and */
+/* returns a pointer to it. If none are found, it allocates a new one and */
+/* inserts it at the top of the list. */
+/* */
+/* Locking. */
+/* It is assumed that the caller of this function has an appropriate lock */
+/* held (exclusively) in the domain that encompases 'parent'. */
+/* ------------------------------------------------------------------------ */
+ipftq_t *fr_addtimeoutqueue(parent, seconds)
+ipftq_t **parent;
+u_int seconds;
+{
+ ipftq_t *ifq;
+ u_int period;
+
+ period = seconds * IPF_HZ_DIVIDE;
+
+ MUTEX_ENTER(&ipf_timeoutlock);
+ for (ifq = *parent; ifq != NULL; ifq = ifq->ifq_next) {
+ if (ifq->ifq_ttl == period) {
+ /*
+ * Reset the delete flag, if set, so the structure
+ * gets reused rather than freed and reallocated.
+ */
+ MUTEX_ENTER(&ifq->ifq_lock);
+ ifq->ifq_flags &= ~IFQF_DELETE;
+ ifq->ifq_ref++;
+ MUTEX_EXIT(&ifq->ifq_lock);
+ MUTEX_EXIT(&ipf_timeoutlock);
+
+ return ifq;
+ }
+ }
+
+ KMALLOC(ifq, ipftq_t *);
+ if (ifq != NULL) {
+ ifq->ifq_ttl = period;
+ ifq->ifq_head = NULL;
+ ifq->ifq_tail = &ifq->ifq_head;
+ ifq->ifq_next = *parent;
+ ifq->ifq_pnext = parent;
+ ifq->ifq_ref = 1;
+ ifq->ifq_flags = IFQF_USER;
+ *parent = ifq;
+ fr_userifqs++;
+ MUTEX_NUKE(&ifq->ifq_lock);
+ MUTEX_INIT(&ifq->ifq_lock, "ipftq mutex");
+ }
+ MUTEX_EXIT(&ipf_timeoutlock);
+ return ifq;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_deletetimeoutqueue */
+/* Returns: int - new reference count value of the timeout queue */
+/* Parameters: ifq(I) - timeout queue which is losing a reference. */
+/* Locks: ifq->ifq_lock */
+/* */
+/* This routine must be called when we're discarding a pointer to a timeout */
+/* queue object, taking care of the reference counter. */
+/* */
+/* Now that this just sets a DELETE flag, it requires the expire code to */
+/* check the list of user defined timeout queues and call the free function */
+/* below (currently commented out) to stop memory leaking. It is done this */
+/* way because the locking may not be sufficient to safely do a free when */
+/* this function is called. */
+/* ------------------------------------------------------------------------ */
+int fr_deletetimeoutqueue(ifq)
+ipftq_t *ifq;
+{
+
+ ifq->ifq_ref--;
+ if ((ifq->ifq_ref == 0) && ((ifq->ifq_flags & IFQF_USER) != 0)) {
+ ifq->ifq_flags |= IFQF_DELETE;
+ }
+
+ return ifq->ifq_ref;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_freetimeoutqueue */
+/* Parameters: ifq(I) - timeout queue which is losing a reference. */
+/* Returns: Nil */
+/* */
+/* Locking: */
+/* It is assumed that the caller of this function has an appropriate lock */
+/* held (exclusively) in the domain that encompases the callers "domain". */
+/* The ifq_lock for this structure should not be held. */
+/* */
+/* Remove a user definde timeout queue from the list of queues it is in and */
+/* tidy up after this is done. */
+/* ------------------------------------------------------------------------ */
+void fr_freetimeoutqueue(ifq)
+ipftq_t *ifq;
+{
+
+
+ if (((ifq->ifq_flags & IFQF_DELETE) == 0) || (ifq->ifq_ref != 0) ||
+ ((ifq->ifq_flags & IFQF_USER) == 0)) {
+ printf("fr_freetimeoutqueue(%lx) flags 0x%x ttl %d ref %d\n",
+ (u_long)ifq, ifq->ifq_flags, ifq->ifq_ttl,
+ ifq->ifq_ref);
+ return;
+ }
+
+ /*
+ * Remove from its position in the list.
+ */
+ *ifq->ifq_pnext = ifq->ifq_next;
+ if (ifq->ifq_next != NULL)
+ ifq->ifq_next->ifq_pnext = ifq->ifq_pnext;
+
+ MUTEX_DESTROY(&ifq->ifq_lock);
+ ATOMIC_DEC(fr_userifqs);
+ KFREE(ifq);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_deletequeueentry */
+/* Returns: Nil */
+/* Parameters: tqe(I) - timeout queue entry to delete */
+/* ifq(I) - timeout queue to remove entry from */
+/* */
+/* Remove a tail queue entry from its queue and make it an orphan. */
+/* fr_deletetimeoutqueue is called to make sure the reference count on the */
+/* queue is correct. We can't, however, call fr_freetimeoutqueue because */
+/* the correct lock(s) may not be held that would make it safe to do so. */
+/* ------------------------------------------------------------------------ */
+void fr_deletequeueentry(tqe)
+ipftqent_t *tqe;
+{
+ ipftq_t *ifq;
+
+ ifq = tqe->tqe_ifq;
+
+ MUTEX_ENTER(&ifq->ifq_lock);
+
+ if (tqe->tqe_pnext != NULL) {
+ *tqe->tqe_pnext = tqe->tqe_next;
+ if (tqe->tqe_next != NULL)
+ tqe->tqe_next->tqe_pnext = tqe->tqe_pnext;
+ else /* we must be the tail anyway */
+ ifq->ifq_tail = tqe->tqe_pnext;
+
+ tqe->tqe_pnext = NULL;
+ tqe->tqe_ifq = NULL;
+ }
+
+ (void) fr_deletetimeoutqueue(ifq);
+
+ MUTEX_EXIT(&ifq->ifq_lock);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_queuefront */
+/* Returns: Nil */
+/* Parameters: tqe(I) - pointer to timeout queue entry */
+/* */
+/* Move a queue entry to the front of the queue, if it isn't already there. */
+/* ------------------------------------------------------------------------ */
+void fr_queuefront(tqe)
+ipftqent_t *tqe;
+{
+ ipftq_t *ifq;
+
+ ifq = tqe->tqe_ifq;
+ if (ifq == NULL)
+ return;
+
+ MUTEX_ENTER(&ifq->ifq_lock);
+ if (ifq->ifq_head != tqe) {
+ *tqe->tqe_pnext = tqe->tqe_next;
+ if (tqe->tqe_next)
+ tqe->tqe_next->tqe_pnext = tqe->tqe_pnext;
+ else
+ ifq->ifq_tail = tqe->tqe_pnext;
+
+ tqe->tqe_next = ifq->ifq_head;
+ ifq->ifq_head->tqe_pnext = &tqe->tqe_next;
+ ifq->ifq_head = tqe;
+ tqe->tqe_pnext = &ifq->ifq_head;
+ }
+ MUTEX_EXIT(&ifq->ifq_lock);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_queueback */
+/* Returns: Nil */
+/* Parameters: tqe(I) - pointer to timeout queue entry */
+/* */
+/* Move a queue entry to the back of the queue, if it isn't already there. */
+/* ------------------------------------------------------------------------ */
+void fr_queueback(tqe)
+ipftqent_t *tqe;
+{
+ ipftq_t *ifq;
+
+ ifq = tqe->tqe_ifq;
+ if (ifq == NULL)
+ return;
+ tqe->tqe_die = fr_ticks + ifq->ifq_ttl;
+
+ MUTEX_ENTER(&ifq->ifq_lock);
+ if (tqe->tqe_next != NULL) { /* at the end already ? */
+ /*
+ * Remove from list
+ */
+ *tqe->tqe_pnext = tqe->tqe_next;
+ tqe->tqe_next->tqe_pnext = tqe->tqe_pnext;
+
+ /*
+ * Make it the last entry.
+ */
+ tqe->tqe_next = NULL;
+ tqe->tqe_pnext = ifq->ifq_tail;
+ *ifq->ifq_tail = tqe;
+ ifq->ifq_tail = &tqe->tqe_next;
+ }
+ MUTEX_EXIT(&ifq->ifq_lock);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_queueappend */
+/* Returns: Nil */
+/* Parameters: tqe(I) - pointer to timeout queue entry */
+/* ifq(I) - pointer to timeout queue */
+/* parent(I) - owing object pointer */
+/* */
+/* Add a new item to this queue and put it on the very end. */
+/* ------------------------------------------------------------------------ */
+void fr_queueappend(tqe, ifq, parent)
+ipftqent_t *tqe;
+ipftq_t *ifq;
+void *parent;
+{
+
+ MUTEX_ENTER(&ifq->ifq_lock);
+ tqe->tqe_parent = parent;
+ tqe->tqe_pnext = ifq->ifq_tail;
+ *ifq->ifq_tail = tqe;
+ ifq->ifq_tail = &tqe->tqe_next;
+ tqe->tqe_next = NULL;
+ tqe->tqe_ifq = ifq;
+ tqe->tqe_die = fr_ticks + ifq->ifq_ttl;
+ ifq->ifq_ref++;
+ MUTEX_EXIT(&ifq->ifq_lock);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_movequeue */
+/* Returns: Nil */
+/* Parameters: tq(I) - pointer to timeout queue information */
+/* oifp(I) - old timeout queue entry was on */
+/* nifp(I) - new timeout queue to put entry on */
+/* */
+/* Move a queue entry from one timeout queue to another timeout queue. */
+/* If it notices that the current entry is already last and does not need */
+/* to move queue, the return. */
+/* ------------------------------------------------------------------------ */
+void fr_movequeue(tqe, oifq, nifq)
+ipftqent_t *tqe;
+ipftq_t *oifq, *nifq;
+{
+ /*
+ * Is the operation here going to be a no-op ?
+ */
+ MUTEX_ENTER(&oifq->ifq_lock);
+ if ((oifq != nifq) || (*oifq->ifq_tail != tqe)) {
+ /*
+ * Remove from the old queue
+ */
+ *tqe->tqe_pnext = tqe->tqe_next;
+ if (tqe->tqe_next)
+ tqe->tqe_next->tqe_pnext = tqe->tqe_pnext;
+ else
+ oifq->ifq_tail = tqe->tqe_pnext;
+ tqe->tqe_next = NULL;
+
+ /*
+ * If we're moving from one queue to another, release the
+ * lock on the old queue and get a lock on the new queue.
+ * For user defined queues, if we're moving off it, call
+ * delete in case it can now be freed.
+ */
+ if (oifq != nifq) {
+ tqe->tqe_ifq = NULL;
+
+ (void) fr_deletetimeoutqueue(oifq);
+
+ MUTEX_EXIT(&oifq->ifq_lock);
+
+ MUTEX_ENTER(&nifq->ifq_lock);
+
+ tqe->tqe_ifq = nifq;
+ nifq->ifq_ref++;
+ }
+
+ /*
+ * Add to the bottom of the new queue
+ */
+ tqe->tqe_die = fr_ticks + nifq->ifq_ttl;
+ tqe->tqe_pnext = nifq->ifq_tail;
+ *nifq->ifq_tail = tqe;
+ nifq->ifq_tail = &tqe->tqe_next;
+ }
+ MUTEX_EXIT(&nifq->ifq_lock);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_updateipid */
+/* Returns: int - 0 == success, -1 == error (packet should be droppped) */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* When we are doing NAT, change the IP of every packet to represent a */
+/* single sequence of packets coming from the host, hiding any host */
+/* specific sequencing that might otherwise be revealed. If the packet is */
+/* a fragment, then store the 'new' IPid in the fragment cache and look up */
+/* the fragment cache for non-leading fragments. If a non-leading fragment */
+/* has no match in the cache, return an error. */
+/* ------------------------------------------------------------------------ */
+static int fr_updateipid(fin)
+fr_info_t *fin;
+{
+ u_short id, ido, sums;
+ u_32_t sumd, sum;
+ ip_t *ip;
+
+ if (fin->fin_off != 0) {
+ sum = fr_ipid_knownfrag(fin);
+ if (sum == 0xffffffff)
+ return -1;
+ sum &= 0xffff;
+ id = (u_short)sum;
+ } else {
+ id = fr_nextipid(fin);
+ if (fin->fin_off == 0 && (fin->fin_flx & FI_FRAG) != 0)
+ (void) fr_ipid_newfrag(fin, (u_32_t)id);
+ }
+
+ ip = fin->fin_ip;
+ ido = ntohs(ip->ip_id);
+ if (id == ido)
+ return 0;
+ ip->ip_id = htons(id);
+ CALC_SUMD(ido, id, sumd); /* DESTRUCTIVE MACRO! id,ido change */
+ sum = (~ntohs(ip->ip_sum)) & 0xffff;
+ sum += sumd;
+ sum = (sum >> 16) + (sum & 0xffff);
+ sum = (sum >> 16) + (sum & 0xffff);
+ sums = ~(u_short)sum;
+ ip->ip_sum = htons(sums);
+ return 0;
+}
+
+
+#ifdef NEED_FRGETIFNAME
+/* ------------------------------------------------------------------------ */
+/* Function: fr_getifname */
+/* Returns: char * - pointer to interface name */
+/* Parameters: ifp(I) - pointer to network interface */
+/* buffer(O) - pointer to where to store interface name */
+/* */
+/* Constructs an interface name in the buffer passed. The buffer passed is */
+/* expected to be at least LIFNAMSIZ in bytes big. If buffer is passed in */
+/* as a NULL pointer then return a pointer to a static array. */
+/* ------------------------------------------------------------------------ */
+char *fr_getifname(ifp, buffer)
+struct ifnet *ifp;
+char *buffer;
+{
+ static char namebuf[LIFNAMSIZ];
+# if defined(MENTAT) || defined(__FreeBSD__) || defined(__osf__) || \
+ defined(__sgi) || defined(linux) || defined(_AIX51) || \
+ (defined(sun) && !defined(__SVR4) && !defined(__svr4__))
+ int unit, space;
+ char temp[20];
+ char *s;
+# endif
+
+ if (buffer == NULL)
+ buffer = namebuf;
+ (void) strncpy(buffer, ifp->if_name, LIFNAMSIZ);
+ buffer[LIFNAMSIZ - 1] = '\0';
+# if defined(MENTAT) || defined(__FreeBSD__) || defined(__osf__) || \
+ defined(__sgi) || defined(_AIX51) || \
+ (defined(sun) && !defined(__SVR4) && !defined(__svr4__))
+ for (s = buffer; *s; s++)
+ ;
+ unit = ifp->if_unit;
+ space = LIFNAMSIZ - (s - buffer);
+ if (space > 0) {
+# if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(temp, sizeof(temp), "%d", unit);
+# else
+ (void) sprintf(temp, "%d", unit);
+# endif
+ (void) strncpy(s, temp, space);
+ }
+# endif
+ return buffer;
+}
+#endif
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_ioctlswitch */
+/* Returns: int - -1 continue processing, else ioctl return value */
+/* Parameters: unit(I) - device unit opened */
+/* data(I) - pointer to ioctl data */
+/* cmd(I) - ioctl command */
+/* mode(I) - mode value */
+/* uid(I) - uid making the ioctl call */
+/* ctx(I) - pointer to context data */
+/* */
+/* Based on the value of unit, call the appropriate ioctl handler or return */
+/* EIO if ipfilter is not running. Also checks if write perms are req'd */
+/* for the device in order to execute the ioctl. */
+/* ------------------------------------------------------------------------ */
+int fr_ioctlswitch(unit, data, cmd, mode, uid, ctx)
+int unit, mode, uid;
+ioctlcmd_t cmd;
+void *data, *ctx;
+{
+ int error = 0;
+
+ switch (unit)
+ {
+ case IPL_LOGIPF :
+ error = fr_ipf_ioctl(data, cmd, mode, uid, ctx);
+ break;
+ case IPL_LOGNAT :
+ if (fr_running > 0)
+ error = fr_nat_ioctl(data, cmd, mode, uid, ctx);
+ else
+ error = EIO;
+ break;
+ case IPL_LOGSTATE :
+ if (fr_running > 0)
+ error = fr_state_ioctl(data, cmd, mode, uid, ctx);
+ else
+ error = EIO;
+ break;
+ case IPL_LOGAUTH :
+ if (fr_running > 0)
+ error = fr_auth_ioctl(data, cmd, mode, uid, ctx);
+ else
+ error = EIO;
+ break;
+ case IPL_LOGSYNC :
+#ifdef IPFILTER_SYNC
+ if (fr_running > 0)
+ error = fr_sync_ioctl(data, cmd, mode, uid, ctx);
+ else
+#endif
+ error = EIO;
+ break;
+ case IPL_LOGSCAN :
+#ifdef IPFILTER_SCAN
+ if (fr_running > 0)
+ error = fr_scan_ioctl(data, cmd, mode, uid, ctx);
+ else
+#endif
+ error = EIO;
+ break;
+ case IPL_LOGLOOKUP :
+#ifdef IPFILTER_LOOKUP
+ if (fr_running > 0)
+ error = ip_lookup_ioctl(data, cmd, mode, uid, ctx);
+ else
+#endif
+ error = EIO;
+ break;
+ default :
+ error = EIO;
+ break;
+ }
+
+ return error;
+}
+
+
+/*
+ * This array defines the expected size of objects coming into the kernel
+ * for the various recognised object types.
+ */
+static int fr_objbytes[IPFOBJ_COUNT][2] = {
+ { 1, sizeof(struct frentry) }, /* frentry */
+ { 0, sizeof(struct friostat) },
+ { 0, sizeof(struct fr_info) },
+ { 0, sizeof(struct fr_authstat) },
+ { 0, sizeof(struct ipfrstat) },
+ { 0, sizeof(struct ipnat) },
+ { 0, sizeof(struct natstat) },
+ { 0, sizeof(struct ipstate_save) },
+ { 1, sizeof(struct nat_save) }, /* nat_save */
+ { 0, sizeof(struct natlookup) },
+ { 1, sizeof(struct ipstate) }, /* ipstate */
+ { 0, sizeof(struct ips_stat) },
+ { 0, sizeof(struct frauth) },
+ { 0, sizeof(struct ipftune) },
+ { 0, sizeof(struct nat) }, /* nat_t */
+ { 0, sizeof(struct ipfruleiter) },
+ { 0, sizeof(struct ipfgeniter) },
+ { 0, sizeof(struct ipftable) },
+ { 0, sizeof(struct ipflookupiter) },
+ { 0, sizeof(struct ipftq) * IPF_TCP_NSTATES },
+};
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_inobj */
+/* Returns: int - 0 = success, else failure */
+/* Parameters: data(I) - pointer to ioctl data */
+/* ptr(I) - pointer to store real data in */
+/* type(I) - type of structure being moved */
+/* */
+/* Copy in the contents of what the ipfobj_t points to. In future, we */
+/* add things to check for version numbers, sizes, etc, to make it backward */
+/* compatible at the ABI for user land. */
+/* ------------------------------------------------------------------------ */
+int fr_inobj(data, ptr, type)
+void *data;
+void *ptr;
+int type;
+{
+ ipfobj_t obj;
+ int error = 0;
+
+ if ((type < 0) || (type >= IPFOBJ_COUNT))
+ return EINVAL;
+
+ BCOPYIN((caddr_t)data, (caddr_t)&obj, sizeof(obj));
+
+ if (obj.ipfo_type != type)
+ return EINVAL;
+
+#ifndef IPFILTER_COMPAT
+ if ((fr_objbytes[type][0] & 1) != 0) {
+ if (obj.ipfo_size < fr_objbytes[type][1])
+ return EINVAL;
+ } else if (obj.ipfo_size != fr_objbytes[type][1]) {
+ return EINVAL;
+ }
+#else
+ if (obj.ipfo_rev != IPFILTER_VERSION)
+ /* XXX compatibility hook here */
+ ;
+ if ((fr_objbytes[type][0] & 1) != 0) {
+ if (obj.ipfo_size < fr_objbytes[type][1])
+ /* XXX compatibility hook here */
+ return EINVAL;
+ } else if (obj.ipfo_size != fr_objbytes[type][1])
+ /* XXX compatibility hook here */
+ return EINVAL;
+#endif
+
+ if ((fr_objbytes[type][0] & 1) != 0) {
+ error = COPYIN((caddr_t)obj.ipfo_ptr, (caddr_t)ptr,
+ fr_objbytes[type][1]);
+ } else {
+ error = COPYIN((caddr_t)obj.ipfo_ptr, (caddr_t)ptr,
+ obj.ipfo_size);
+ }
+ if (error != 0)
+ error = EFAULT;
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_inobjsz */
+/* Returns: int - 0 = success, else failure */
+/* Parameters: data(I) - pointer to ioctl data */
+/* ptr(I) - pointer to store real data in */
+/* type(I) - type of structure being moved */
+/* sz(I) - size of data to copy */
+/* */
+/* As per fr_inobj, except the size of the object to copy in is passed in */
+/* but it must not be smaller than the size defined for the type and the */
+/* type must allow for varied sized objects. The extra requirement here is */
+/* that sz must match the size of the object being passed in - this is not */
+/* not possible nor required in fr_inobj(). */
+/* ------------------------------------------------------------------------ */
+int fr_inobjsz(data, ptr, type, sz)
+void *data;
+void *ptr;
+int type, sz;
+{
+ ipfobj_t obj;
+ int error;
+
+ if ((type < 0) || (type >= IPFOBJ_COUNT))
+ return EINVAL;
+ if (((fr_objbytes[type][0] & 1) == 0) || (sz < fr_objbytes[type][1]))
+ return EINVAL;
+
+ BCOPYIN((caddr_t)data, (caddr_t)&obj, sizeof(obj));
+
+ if (obj.ipfo_type != type)
+ return EINVAL;
+
+#ifndef IPFILTER_COMPAT
+ if (obj.ipfo_size != sz)
+ return EINVAL;
+#else
+ if (obj.ipfo_rev != IPFILTER_VERSION)
+ /* XXX compatibility hook here */
+ ;
+ if (obj.ipfo_size != sz)
+ /* XXX compatibility hook here */
+ return EINVAL;
+#endif
+
+ error = COPYIN((caddr_t)obj.ipfo_ptr, (caddr_t)ptr, sz);
+ if (error != 0)
+ error = EFAULT;
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_outobjsz */
+/* Returns: int - 0 = success, else failure */
+/* Parameters: data(I) - pointer to ioctl data */
+/* ptr(I) - pointer to store real data in */
+/* type(I) - type of structure being moved */
+/* sz(I) - size of data to copy */
+/* */
+/* As per fr_outobj, except the size of the object to copy out is passed in */
+/* but it must not be smaller than the size defined for the type and the */
+/* type must allow for varied sized objects. The extra requirement here is */
+/* that sz must match the size of the object being passed in - this is not */
+/* not possible nor required in fr_outobj(). */
+/* ------------------------------------------------------------------------ */
+int fr_outobjsz(data, ptr, type, sz)
+void *data;
+void *ptr;
+int type, sz;
+{
+ ipfobj_t obj;
+ int error;
+
+ if ((type < 0) || (type > IPFOBJ_COUNT) ||
+ ((fr_objbytes[type][0] & 1) == 0) ||
+ (sz < fr_objbytes[type][1]))
+ return EINVAL;
+
+ BCOPYIN((caddr_t)data, (caddr_t)&obj, sizeof(obj));
+
+ if (obj.ipfo_type != type)
+ return EINVAL;
+
+#ifndef IPFILTER_COMPAT
+ if (obj.ipfo_size != sz)
+ return EINVAL;
+#else
+ if (obj.ipfo_rev != IPFILTER_VERSION)
+ /* XXX compatibility hook here */
+ ;
+ if (obj.ipfo_size != sz)
+ /* XXX compatibility hook here */
+ return EINVAL;
+#endif
+
+ error = COPYOUT((caddr_t)ptr, (caddr_t)obj.ipfo_ptr, sz);
+ if (error != 0)
+ error = EFAULT;
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_outobj */
+/* Returns: int - 0 = success, else failure */
+/* Parameters: data(I) - pointer to ioctl data */
+/* ptr(I) - pointer to store real data in */
+/* type(I) - type of structure being moved */
+/* */
+/* Copy out the contents of what ptr is to where ipfobj points to. In */
+/* future, we add things to check for version numbers, sizes, etc, to make */
+/* it backward compatible at the ABI for user land. */
+/* ------------------------------------------------------------------------ */
+int fr_outobj(data, ptr, type)
+void *data;
+void *ptr;
+int type;
+{
+ ipfobj_t obj;
+ int error;
+
+ if ((type < 0) || (type > IPFOBJ_COUNT))
+ return EINVAL;
+
+ BCOPYIN((caddr_t)data, (caddr_t)&obj, sizeof(obj));
+
+ if (obj.ipfo_type != type)
+ return EINVAL;
+
+#ifndef IPFILTER_COMPAT
+ if ((fr_objbytes[type][0] & 1) != 0) {
+ if (obj.ipfo_size < fr_objbytes[type][1])
+ return EINVAL;
+ } else if (obj.ipfo_size != fr_objbytes[type][1])
+ return EINVAL;
+#else
+ if (obj.ipfo_rev != IPFILTER_VERSION)
+ /* XXX compatibility hook here */
+ ;
+ if ((fr_objbytes[type][0] & 1) != 0) {
+ if (obj.ipfo_size < fr_objbytes[type][1])
+ /* XXX compatibility hook here */
+ return EINVAL;
+ } else if (obj.ipfo_size != fr_objbytes[type][1])
+ /* XXX compatibility hook here */
+ return EINVAL;
+#endif
+
+ error = COPYOUT((caddr_t)ptr, (caddr_t)obj.ipfo_ptr, obj.ipfo_size);
+ if (error != 0)
+ error = EFAULT;
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_checkl4sum */
+/* Returns: int - 0 = good, -1 = bad, 1 = cannot check */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* If possible, calculate the layer 4 checksum for the packet. If this is */
+/* not possible, return without indicating a failure or success but in a */
+/* way that is ditinguishable. */
+/* ------------------------------------------------------------------------ */
+int fr_checkl4sum(fin)
+fr_info_t *fin;
+{
+ u_short sum, hdrsum, *csump;
+ udphdr_t *udp;
+ int dosum;
+
+ if ((fin->fin_flx & FI_NOCKSUM) != 0)
+ return 0;
+
+ /*
+ * If the TCP packet isn't a fragment, isn't too short and otherwise
+ * isn't already considered "bad", then validate the checksum. If
+ * this check fails then considered the packet to be "bad".
+ */
+ if ((fin->fin_flx & (FI_FRAG|FI_SHORT|FI_BAD)) != 0)
+ return 1;
+
+ csump = NULL;
+ hdrsum = 0;
+ dosum = 0;
+ sum = 0;
+
+#if SOLARIS && defined(_KERNEL) && (SOLARIS2 >= 6) && defined(ICK_VALID)
+ if (dohwcksum && ((*fin->fin_mp)->b_ick_flag == ICK_VALID)) {
+ hdrsum = 0;
+ sum = 0;
+ } else {
+#endif
+ switch (fin->fin_p)
+ {
+ case IPPROTO_TCP :
+ csump = &((tcphdr_t *)fin->fin_dp)->th_sum;
+ dosum = 1;
+ break;
+
+ case IPPROTO_UDP :
+ udp = fin->fin_dp;
+ if (udp->uh_sum != 0) {
+ csump = &udp->uh_sum;
+ dosum = 1;
+ }
+ break;
+
+ case IPPROTO_ICMP :
+ csump = &((struct icmp *)fin->fin_dp)->icmp_cksum;
+ dosum = 1;
+ break;
+
+ default :
+ return 1;
+ /*NOTREACHED*/
+ }
+
+ if (csump != NULL)
+ hdrsum = *csump;
+
+ if (dosum) {
+ sum = fr_cksum(fin->fin_m, fin->fin_ip,
+ fin->fin_p, fin->fin_dp,
+ fin->fin_dlen + fin->fin_hlen);
+ }
+#if SOLARIS && defined(_KERNEL) && (SOLARIS2 >= 6) && defined(ICK_VALID)
+ }
+#endif
+#if !defined(_KERNEL)
+ if (sum == hdrsum) {
+ FR_DEBUG(("checkl4sum: %hx == %hx\n", sum, hdrsum));
+ } else {
+ FR_DEBUG(("checkl4sum: %hx != %hx\n", sum, hdrsum));
+ }
+#endif
+ if (hdrsum == sum)
+ return 0;
+ return -1;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_ifpfillv4addr */
+/* Returns: int - 0 = address update, -1 = address not updated */
+/* Parameters: atype(I) - type of network address update to perform */
+/* sin(I) - pointer to source of address information */
+/* mask(I) - pointer to source of netmask information */
+/* inp(I) - pointer to destination address store */
+/* inpmask(I) - pointer to destination netmask store */
+/* */
+/* Given a type of network address update (atype) to perform, copy */
+/* information from sin/mask into inp/inpmask. If ipnmask is NULL then no */
+/* netmask update is performed unless FRI_NETMASKED is passed as atype, in */
+/* which case the operation fails. For all values of atype other than */
+/* FRI_NETMASKED, if inpmask is non-NULL then the mask is set to an all 1s */
+/* value. */
+/* ------------------------------------------------------------------------ */
+int fr_ifpfillv4addr(atype, sin, mask, inp, inpmask)
+int atype;
+struct sockaddr_in *sin, *mask;
+struct in_addr *inp, *inpmask;
+{
+ if (inpmask != NULL && atype != FRI_NETMASKED)
+ inpmask->s_addr = 0xffffffff;
+
+ if (atype == FRI_NETWORK || atype == FRI_NETMASKED) {
+ if (atype == FRI_NETMASKED) {
+ if (inpmask == NULL)
+ return -1;
+ inpmask->s_addr = mask->sin_addr.s_addr;
+ }
+ inp->s_addr = sin->sin_addr.s_addr & mask->sin_addr.s_addr;
+ } else {
+ inp->s_addr = sin->sin_addr.s_addr;
+ }
+ return 0;
+}
+
+
+#ifdef USE_INET6
+/* ------------------------------------------------------------------------ */
+/* Function: fr_ifpfillv6addr */
+/* Returns: int - 0 = address update, -1 = address not updated */
+/* Parameters: atype(I) - type of network address update to perform */
+/* sin(I) - pointer to source of address information */
+/* mask(I) - pointer to source of netmask information */
+/* inp(I) - pointer to destination address store */
+/* inpmask(I) - pointer to destination netmask store */
+/* */
+/* Given a type of network address update (atype) to perform, copy */
+/* information from sin/mask into inp/inpmask. If ipnmask is NULL then no */
+/* netmask update is performed unless FRI_NETMASKED is passed as atype, in */
+/* which case the operation fails. For all values of atype other than */
+/* FRI_NETMASKED, if inpmask is non-NULL then the mask is set to an all 1s */
+/* value. */
+/* ------------------------------------------------------------------------ */
+int fr_ifpfillv6addr(atype, sin, mask, inp, inpmask)
+int atype;
+struct sockaddr_in6 *sin, *mask;
+struct in_addr *inp, *inpmask;
+{
+ i6addr_t *src, *dst, *and, *dmask;
+
+ src = (i6addr_t *)&sin->sin6_addr;
+ and = (i6addr_t *)&mask->sin6_addr;
+ dst = (i6addr_t *)inp;
+ dmask = (i6addr_t *)inpmask;
+
+ if (inpmask != NULL && atype != FRI_NETMASKED) {
+ dmask->i6[0] = 0xffffffff;
+ dmask->i6[1] = 0xffffffff;
+ dmask->i6[2] = 0xffffffff;
+ dmask->i6[3] = 0xffffffff;
+ }
+
+ if (atype == FRI_NETWORK || atype == FRI_NETMASKED) {
+ if (atype == FRI_NETMASKED) {
+ if (inpmask == NULL)
+ return -1;
+ dmask->i6[0] = and->i6[0];
+ dmask->i6[1] = and->i6[1];
+ dmask->i6[2] = and->i6[2];
+ dmask->i6[3] = and->i6[3];
+ }
+
+ dst->i6[0] = src->i6[0] & and->i6[0];
+ dst->i6[1] = src->i6[1] & and->i6[1];
+ dst->i6[2] = src->i6[2] & and->i6[2];
+ dst->i6[3] = src->i6[3] & and->i6[3];
+ } else {
+ dst->i6[0] = src->i6[0];
+ dst->i6[1] = src->i6[1];
+ dst->i6[2] = src->i6[2];
+ dst->i6[3] = src->i6[3];
+ }
+ return 0;
+}
+#endif
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_matchtag */
+/* Returns: 0 == mismatch, 1 == match. */
+/* Parameters: tag1(I) - pointer to first tag to compare */
+/* tag2(I) - pointer to second tag to compare */
+/* */
+/* Returns true (non-zero) or false(0) if the two tag structures can be */
+/* considered to be a match or not match, respectively. The tag is 16 */
+/* bytes long (16 characters) but that is overlayed with 4 32bit ints so */
+/* compare the ints instead, for speed. tag1 is the master of the */
+/* comparison. This function should only be called with both tag1 and tag2 */
+/* as non-NULL pointers. */
+/* ------------------------------------------------------------------------ */
+int fr_matchtag(tag1, tag2)
+ipftag_t *tag1, *tag2;
+{
+ if (tag1 == tag2)
+ return 1;
+
+ if ((tag1->ipt_num[0] == 0) && (tag2->ipt_num[0] == 0))
+ return 1;
+
+ if ((tag1->ipt_num[0] == tag2->ipt_num[0]) &&
+ (tag1->ipt_num[1] == tag2->ipt_num[1]) &&
+ (tag1->ipt_num[2] == tag2->ipt_num[2]) &&
+ (tag1->ipt_num[3] == tag2->ipt_num[3]))
+ return 1;
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_coalesce */
+/* Returns: 1 == success, -1 == failure, 0 == no change */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* Attempt to get all of the packet data into a single, contiguous buffer. */
+/* If this call returns a failure then the buffers have also been freed. */
+/* ------------------------------------------------------------------------ */
+int fr_coalesce(fin)
+fr_info_t *fin;
+{
+ if ((fin->fin_flx & FI_COALESCE) != 0)
+ return 1;
+
+ /*
+ * If the mbuf pointers indicate that there is no mbuf to work with,
+ * return but do not indicate success or failure.
+ */
+ if (fin->fin_m == NULL || fin->fin_mp == NULL)
+ return 0;
+
+#if defined(_KERNEL)
+ if (fr_pullup(fin->fin_m, fin, fin->fin_plen) == NULL) {
+ ATOMIC_INCL(fr_badcoalesces[fin->fin_out]);
+# ifdef MENTAT
+ FREE_MB_T(*fin->fin_mp);
+# endif
+ *fin->fin_mp = NULL;
+ fin->fin_m = NULL;
+ return -1;
+ }
+#else
+ fin = fin; /* LINT */
+#endif
+ return 1;
+}
+
+
+/*
+ * The following table lists all of the tunable variables that can be
+ * accessed via SIOCIPFGET/SIOCIPFSET/SIOCIPFGETNEXt. The format of each row
+ * in the table below is as follows:
+ *
+ * pointer to value, name of value, minimum, maximum, size of the value's
+ * container, value attribute flags
+ *
+ * For convienience, IPFT_RDONLY means the value is read-only, IPFT_WRDISABLED
+ * means the value can only be written to when IPFilter is loaded but disabled.
+ * The obvious implication is if neither of these are set then the value can be
+ * changed at any time without harm.
+ */
+ipftuneable_t ipf_tuneables[] = {
+ /* filtering */
+ { { &fr_flags }, "fr_flags", 0, 0xffffffff,
+ sizeof(fr_flags), 0, NULL },
+ { { &fr_active }, "fr_active", 0, 0,
+ sizeof(fr_active), IPFT_RDONLY, NULL },
+ { { &fr_control_forwarding }, "fr_control_forwarding", 0, 1,
+ sizeof(fr_control_forwarding), 0, NULL },
+ { { &fr_update_ipid }, "fr_update_ipid", 0, 1,
+ sizeof(fr_update_ipid), 0, NULL },
+ { { &fr_chksrc }, "fr_chksrc", 0, 1,
+ sizeof(fr_chksrc), 0, NULL },
+ { { &fr_minttl }, "fr_minttl", 0, 1,
+ sizeof(fr_minttl), 0, NULL },
+ { { &fr_icmpminfragmtu }, "fr_icmpminfragmtu", 0, 1,
+ sizeof(fr_icmpminfragmtu), 0, NULL },
+ { { &fr_pass }, "fr_pass", 0, 0xffffffff,
+ sizeof(fr_pass), 0, NULL },
+ /* state */
+ { { &fr_tcpidletimeout }, "fr_tcpidletimeout", 1, 0x7fffffff,
+ sizeof(fr_tcpidletimeout), IPFT_WRDISABLED, NULL },
+ { { &fr_tcpclosewait }, "fr_tcpclosewait", 1, 0x7fffffff,
+ sizeof(fr_tcpclosewait), IPFT_WRDISABLED, NULL },
+ { { &fr_tcplastack }, "fr_tcplastack", 1, 0x7fffffff,
+ sizeof(fr_tcplastack), IPFT_WRDISABLED, NULL },
+ { { &fr_tcptimeout }, "fr_tcptimeout", 1, 0x7fffffff,
+ sizeof(fr_tcptimeout), IPFT_WRDISABLED, NULL },
+ { { &fr_tcpclosed }, "fr_tcpclosed", 1, 0x7fffffff,
+ sizeof(fr_tcpclosed), IPFT_WRDISABLED, NULL },
+ { { &fr_tcphalfclosed }, "fr_tcphalfclosed", 1, 0x7fffffff,
+ sizeof(fr_tcphalfclosed), IPFT_WRDISABLED, NULL },
+ { { &fr_udptimeout }, "fr_udptimeout", 1, 0x7fffffff,
+ sizeof(fr_udptimeout), IPFT_WRDISABLED, NULL },
+ { { &fr_udpacktimeout }, "fr_udpacktimeout", 1, 0x7fffffff,
+ sizeof(fr_udpacktimeout), IPFT_WRDISABLED, NULL },
+ { { &fr_icmptimeout }, "fr_icmptimeout", 1, 0x7fffffff,
+ sizeof(fr_icmptimeout), IPFT_WRDISABLED, NULL },
+ { { &fr_icmpacktimeout }, "fr_icmpacktimeout", 1, 0x7fffffff,
+ sizeof(fr_icmpacktimeout), IPFT_WRDISABLED, NULL },
+ { { &fr_iptimeout }, "fr_iptimeout", 1, 0x7fffffff,
+ sizeof(fr_iptimeout), IPFT_WRDISABLED, NULL },
+ { { &fr_statemax }, "fr_statemax", 1, 0x7fffffff,
+ sizeof(fr_statemax), 0, NULL },
+ { { &fr_statesize }, "fr_statesize", 1, 0x7fffffff,
+ sizeof(fr_statesize), IPFT_WRDISABLED, NULL },
+ { { &fr_state_lock }, "fr_state_lock", 0, 1,
+ sizeof(fr_state_lock), IPFT_RDONLY, NULL },
+ { { &fr_state_maxbucket }, "fr_state_maxbucket", 1, 0x7fffffff,
+ sizeof(fr_state_maxbucket), IPFT_WRDISABLED, NULL },
+ { { &fr_state_maxbucket_reset }, "fr_state_maxbucket_reset", 0, 1,
+ sizeof(fr_state_maxbucket_reset), IPFT_WRDISABLED, NULL },
+ { { &ipstate_logging }, "ipstate_logging", 0, 1,
+ sizeof(ipstate_logging), 0, NULL },
+ /* nat */
+ { { &fr_nat_lock }, "fr_nat_lock", 0, 1,
+ sizeof(fr_nat_lock), IPFT_RDONLY, NULL },
+ { { &ipf_nattable_sz }, "ipf_nattable_sz", 1, 0x7fffffff,
+ sizeof(ipf_nattable_sz), IPFT_WRDISABLED, NULL },
+ { { &ipf_nattable_max }, "ipf_nattable_max", 1, 0x7fffffff,
+ sizeof(ipf_nattable_max), 0, NULL },
+ { { &ipf_natrules_sz }, "ipf_natrules_sz", 1, 0x7fffffff,
+ sizeof(ipf_natrules_sz), IPFT_WRDISABLED, NULL },
+ { { &ipf_rdrrules_sz }, "ipf_rdrrules_sz", 1, 0x7fffffff,
+ sizeof(ipf_rdrrules_sz), IPFT_WRDISABLED, NULL },
+ { { &ipf_hostmap_sz }, "ipf_hostmap_sz", 1, 0x7fffffff,
+ sizeof(ipf_hostmap_sz), IPFT_WRDISABLED, NULL },
+ { { &fr_nat_maxbucket }, "fr_nat_maxbucket", 1, 0x7fffffff,
+ sizeof(fr_nat_maxbucket), IPFT_WRDISABLED, NULL },
+ { { &fr_nat_maxbucket_reset }, "fr_nat_maxbucket_reset", 0, 1,
+ sizeof(fr_nat_maxbucket_reset), IPFT_WRDISABLED, NULL },
+ { { &nat_logging }, "nat_logging", 0, 1,
+ sizeof(nat_logging), 0, NULL },
+ { { &fr_defnatage }, "fr_defnatage", 1, 0x7fffffff,
+ sizeof(fr_defnatage), IPFT_WRDISABLED, NULL },
+ { { &fr_defnatipage }, "fr_defnatipage", 1, 0x7fffffff,
+ sizeof(fr_defnatipage), IPFT_WRDISABLED, NULL },
+ { { &fr_defnaticmpage }, "fr_defnaticmpage", 1, 0x7fffffff,
+ sizeof(fr_defnaticmpage), IPFT_WRDISABLED, NULL },
+ { { &fr_nat_doflush }, "fr_nat_doflush", 0, 1,
+ sizeof(fr_nat_doflush), 0, NULL },
+ /* proxy */
+ { { &ipf_proxy_debug }, "ipf_proxy_debug", 0, 10,
+ sizeof(ipf_proxy_debug), 0, 0 },
+ /* frag */
+ { { &ipfr_size }, "ipfr_size", 1, 0x7fffffff,
+ sizeof(ipfr_size), IPFT_WRDISABLED, NULL },
+ { { &fr_ipfrttl }, "fr_ipfrttl", 1, 0x7fffffff,
+ sizeof(fr_ipfrttl), IPFT_WRDISABLED, NULL },
+#ifdef IPFILTER_LOG
+ /* log */
+ { { &ipl_suppress }, "ipl_suppress", 0, 1,
+ sizeof(ipl_suppress), 0, NULL },
+ { { &ipl_logmax }, "ipl_logmax", 0, 0x7fffffff,
+ sizeof(ipl_logmax), IPFT_WRDISABLED, NULL },
+ { { &ipl_logall }, "ipl_logall", 0, 1,
+ sizeof(ipl_logall), 0, NULL },
+ { { &ipl_logsize }, "ipl_logsize", 0, 0x80000,
+ sizeof(ipl_logsize), 0, NULL },
+#endif
+ { { NULL }, NULL, 0, 0,
+ 0, 0, NULL }
+};
+
+static ipftuneable_t *ipf_tunelist = NULL;
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_findtunebycookie */
+/* Returns: NULL = search failed, else pointer to tune struct */
+/* Parameters: cookie(I) - cookie value to search for amongst tuneables */
+/* next(O) - pointer to place to store the cookie for the */
+/* "next" tuneable, if it is desired. */
+/* */
+/* This function is used to walk through all of the existing tunables with */
+/* successive calls. It searches the known tunables for the one which has */
+/* a matching value for "cookie" - ie its address. When returning a match, */
+/* the next one to be found may be returned inside next. */
+/* ------------------------------------------------------------------------ */
+static ipftuneable_t *fr_findtunebycookie(cookie, next)
+void *cookie, **next;
+{
+ ipftuneable_t *ta, **tap;
+
+ for (ta = ipf_tuneables; ta->ipft_name != NULL; ta++)
+ if (ta == cookie) {
+ if (next != NULL) {
+ /*
+ * If the next entry in the array has a name
+ * present, then return a pointer to it for
+ * where to go next, else return a pointer to
+ * the dynaminc list as a key to search there
+ * next. This facilitates a weak linking of
+ * the two "lists" together.
+ */
+ if ((ta + 1)->ipft_name != NULL)
+ *next = ta + 1;
+ else
+ *next = &ipf_tunelist;
+ }
+ return ta;
+ }
+
+ for (tap = &ipf_tunelist; (ta = *tap) != NULL; tap = &ta->ipft_next)
+ if (tap == cookie) {
+ if (next != NULL)
+ *next = &ta->ipft_next;
+ return ta;
+ }
+
+ if (next != NULL)
+ *next = NULL;
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_findtunebyname */
+/* Returns: NULL = search failed, else pointer to tune struct */
+/* Parameters: name(I) - name of the tuneable entry to find. */
+/* */
+/* Search the static array of tuneables and the list of dynamic tuneables */
+/* for an entry with a matching name. If we can find one, return a pointer */
+/* to the matching structure. */
+/* ------------------------------------------------------------------------ */
+static ipftuneable_t *fr_findtunebyname(name)
+const char *name;
+{
+ ipftuneable_t *ta;
+
+ for (ta = ipf_tuneables; ta->ipft_name != NULL; ta++)
+ if (!strcmp(ta->ipft_name, name)) {
+ return ta;
+ }
+
+ for (ta = ipf_tunelist; ta != NULL; ta = ta->ipft_next)
+ if (!strcmp(ta->ipft_name, name)) {
+ return ta;
+ }
+
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_addipftune */
+/* Returns: int - 0 == success, else failure */
+/* Parameters: newtune - pointer to new tune struct to add to tuneables */
+/* */
+/* Appends the tune structure pointer to by "newtune" to the end of the */
+/* current list of "dynamic" tuneable parameters. Once added, the owner */
+/* of the object is not expected to ever change "ipft_next". */
+/* ------------------------------------------------------------------------ */
+int fr_addipftune(newtune)
+ipftuneable_t *newtune;
+{
+ ipftuneable_t *ta, **tap;
+
+ ta = fr_findtunebyname(newtune->ipft_name);
+ if (ta != NULL)
+ return EEXIST;
+
+ for (tap = &ipf_tunelist; *tap != NULL; tap = &(*tap)->ipft_next)
+ ;
+
+ newtune->ipft_next = NULL;
+ *tap = newtune;
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_delipftune */
+/* Returns: int - 0 == success, else failure */
+/* Parameters: oldtune - pointer to tune struct to remove from the list of */
+/* current dynamic tuneables */
+/* */
+/* Search for the tune structure, by pointer, in the list of those that are */
+/* dynamically added at run time. If found, adjust the list so that this */
+/* structure is no longer part of it. */
+/* ------------------------------------------------------------------------ */
+int fr_delipftune(oldtune)
+ipftuneable_t *oldtune;
+{
+ ipftuneable_t *ta, **tap;
+
+ for (tap = &ipf_tunelist; (ta = *tap) != NULL; tap = &ta->ipft_next)
+ if (ta == oldtune) {
+ *tap = oldtune->ipft_next;
+ oldtune->ipft_next = NULL;
+ return 0;
+ }
+
+ return ESRCH;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_ipftune */
+/* Returns: int - 0 == success, else failure */
+/* Parameters: cmd(I) - ioctl command number */
+/* data(I) - pointer to ioctl data structure */
+/* */
+/* Implement handling of SIOCIPFGETNEXT, SIOCIPFGET and SIOCIPFSET. These */
+/* three ioctls provide the means to access and control global variables */
+/* within IPFilter, allowing (for example) timeouts and table sizes to be */
+/* changed without rebooting, reloading or recompiling. The initialisation */
+/* and 'destruction' routines of the various components of ipfilter are all */
+/* each responsible for handling their own values being too big. */
+/* ------------------------------------------------------------------------ */
+int fr_ipftune(cmd, data)
+ioctlcmd_t cmd;
+void *data;
+{
+ ipftuneable_t *ta;
+ ipftune_t tu;
+ void *cookie;
+ int error;
+
+ error = fr_inobj(data, &tu, IPFOBJ_TUNEABLE);
+ if (error != 0)
+ return error;
+
+ tu.ipft_name[sizeof(tu.ipft_name) - 1] = '\0';
+ cookie = tu.ipft_cookie;
+ ta = NULL;
+
+ switch (cmd)
+ {
+ case SIOCIPFGETNEXT :
+ /*
+ * If cookie is non-NULL, assume it to be a pointer to the last
+ * entry we looked at, so find it (if possible) and return a
+ * pointer to the next one after it. The last entry in the
+ * the table is a NULL entry, so when we get to it, set cookie
+ * to NULL and return that, indicating end of list, erstwhile
+ * if we come in with cookie set to NULL, we are starting anew
+ * at the front of the list.
+ */
+ if (cookie != NULL) {
+ ta = fr_findtunebycookie(cookie, &tu.ipft_cookie);
+ } else {
+ ta = ipf_tuneables;
+ tu.ipft_cookie = ta + 1;
+ }
+ if (ta != NULL) {
+ /*
+ * Entry found, but does the data pointed to by that
+ * row fit in what we can return?
+ */
+ if (ta->ipft_sz > sizeof(tu.ipft_un))
+ return EINVAL;
+
+ tu.ipft_vlong = 0;
+ if (ta->ipft_sz == sizeof(u_long))
+ tu.ipft_vlong = *ta->ipft_plong;
+ else if (ta->ipft_sz == sizeof(u_int))
+ tu.ipft_vint = *ta->ipft_pint;
+ else if (ta->ipft_sz == sizeof(u_short))
+ tu.ipft_vshort = *ta->ipft_pshort;
+ else if (ta->ipft_sz == sizeof(u_char))
+ tu.ipft_vchar = *ta->ipft_pchar;
+
+ tu.ipft_sz = ta->ipft_sz;
+ tu.ipft_min = ta->ipft_min;
+ tu.ipft_max = ta->ipft_max;
+ tu.ipft_flags = ta->ipft_flags;
+ bcopy(ta->ipft_name, tu.ipft_name,
+ MIN(sizeof(tu.ipft_name),
+ strlen(ta->ipft_name) + 1));
+ }
+ error = fr_outobj(data, &tu, IPFOBJ_TUNEABLE);
+ break;
+
+ case SIOCIPFGET :
+ case SIOCIPFSET :
+ /*
+ * Search by name or by cookie value for a particular entry
+ * in the tuning paramter table.
+ */
+ error = ESRCH;
+ if (cookie != NULL) {
+ ta = fr_findtunebycookie(cookie, NULL);
+ if (ta != NULL)
+ error = 0;
+ } else if (tu.ipft_name[0] != '\0') {
+ ta = fr_findtunebyname(tu.ipft_name);
+ if (ta != NULL)
+ error = 0;
+ }
+ if (error != 0)
+ break;
+
+ if (cmd == (ioctlcmd_t)SIOCIPFGET) {
+ /*
+ * Fetch the tuning parameters for a particular value
+ */
+ tu.ipft_vlong = 0;
+ if (ta->ipft_sz == sizeof(u_long))
+ tu.ipft_vlong = *ta->ipft_plong;
+ else if (ta->ipft_sz == sizeof(u_int))
+ tu.ipft_vint = *ta->ipft_pint;
+ else if (ta->ipft_sz == sizeof(u_short))
+ tu.ipft_vshort = *ta->ipft_pshort;
+ else if (ta->ipft_sz == sizeof(u_char))
+ tu.ipft_vchar = *ta->ipft_pchar;
+ tu.ipft_cookie = ta;
+ tu.ipft_sz = ta->ipft_sz;
+ tu.ipft_min = ta->ipft_min;
+ tu.ipft_max = ta->ipft_max;
+ tu.ipft_flags = ta->ipft_flags;
+ error = fr_outobj(data, &tu, IPFOBJ_TUNEABLE);
+
+ } else if (cmd == (ioctlcmd_t)SIOCIPFSET) {
+ /*
+ * Set an internal parameter. The hard part here is
+ * getting the new value safely and correctly out of
+ * the kernel (given we only know its size, not type.)
+ */
+ u_long in;
+
+ if (((ta->ipft_flags & IPFT_WRDISABLED) != 0) &&
+ (fr_running > 0)) {
+ error = EBUSY;
+ break;
+ }
+
+ in = tu.ipft_vlong;
+ if (in < ta->ipft_min || in > ta->ipft_max) {
+ error = EINVAL;
+ break;
+ }
+
+ if (ta->ipft_sz == sizeof(u_long)) {
+ tu.ipft_vlong = *ta->ipft_plong;
+ *ta->ipft_plong = in;
+ } else if (ta->ipft_sz == sizeof(u_int)) {
+ tu.ipft_vint = *ta->ipft_pint;
+ *ta->ipft_pint = (u_int)(in & 0xffffffff);
+ } else if (ta->ipft_sz == sizeof(u_short)) {
+ tu.ipft_vshort = *ta->ipft_pshort;
+ *ta->ipft_pshort = (u_short)(in & 0xffff);
+ } else if (ta->ipft_sz == sizeof(u_char)) {
+ tu.ipft_vchar = *ta->ipft_pchar;
+ *ta->ipft_pchar = (u_char)(in & 0xff);
+ }
+ error = fr_outobj(data, &tu, IPFOBJ_TUNEABLE);
+ }
+ break;
+
+ default :
+ error = EINVAL;
+ break;
+ }
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_initialise */
+/* Returns: int - 0 == success, < 0 == failure */
+/* Parameters: None. */
+/* */
+/* Call of the initialise functions for all the various subsystems inside */
+/* of IPFilter. If any of them should fail, return immeadiately a failure */
+/* BUT do not try to recover from the error here. */
+/* ------------------------------------------------------------------------ */
+int fr_initialise()
+{
+ int i;
+
+ bzero(&frstats, sizeof(frstats));
+
+#ifdef IPFILTER_LOG
+ i = fr_loginit();
+ if (i < 0)
+ return -10 + i;
+#endif
+ i = fr_natinit();
+ if (i < 0)
+ return -20 + i;
+
+ i = fr_stateinit();
+ if (i < 0)
+ return -30 + i;
+
+ i = fr_authinit();
+ if (i < 0)
+ return -40 + i;
+
+ i = fr_fraginit();
+ if (i < 0)
+ return -50 + i;
+
+ i = appr_init();
+ if (i < 0)
+ return -60 + i;
+
+#ifdef IPFILTER_SYNC
+ i = ipfsync_init();
+ if (i < 0)
+ return -70 + i;
+#endif
+#ifdef IPFILTER_SCAN
+ i = ipsc_init();
+ if (i < 0)
+ return -80 + i;
+#endif
+#ifdef IPFILTER_LOOKUP
+ i = ip_lookup_init();
+ if (i < 0)
+ return -90 + i;
+#endif
+#ifdef IPFILTER_COMPILED
+ ipfrule_add();
+#endif
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_deinitialise */
+/* Returns: None. */
+/* Parameters: None. */
+/* */
+/* Call all the various subsystem cleanup routines to deallocate memory or */
+/* destroy locks or whatever they've done that they need to now undo. */
+/* The order here IS important as there are some cross references of */
+/* internal data structures. */
+/* ------------------------------------------------------------------------ */
+void fr_deinitialise()
+{
+ fr_fragunload();
+ fr_authunload();
+ fr_natunload();
+ fr_stateunload();
+#ifdef IPFILTER_SCAN
+ fr_scanunload();
+#endif
+ appr_unload();
+
+#ifdef IPFILTER_COMPILED
+ ipfrule_remove();
+#endif
+
+ (void) frflush(IPL_LOGIPF, 0, FR_INQUE|FR_OUTQUE|FR_INACTIVE);
+ (void) frflush(IPL_LOGIPF, 0, FR_INQUE|FR_OUTQUE);
+ (void) frflush(IPL_LOGCOUNT, 0, FR_INQUE|FR_OUTQUE|FR_INACTIVE);
+ (void) frflush(IPL_LOGCOUNT, 0, FR_INQUE|FR_OUTQUE);
+
+#ifdef IPFILTER_LOOKUP
+ ip_lookup_unload();
+#endif
+
+#ifdef IPFILTER_LOG
+ fr_logunload();
+#endif
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_zerostats */
+/* Returns: int - 0 = success, else failure */
+/* Parameters: data(O) - pointer to pointer for copying data back to */
+/* */
+/* Copies the current statistics out to userspace and then zero's the */
+/* current ones in the kernel. The lock is only held across the bzero() as */
+/* the copyout may result in paging (ie network activity.) */
+/* ------------------------------------------------------------------------ */
+int fr_zerostats(data)
+caddr_t data;
+{
+ friostat_t fio;
+ int error;
+
+ fr_getstat(&fio);
+ error = fr_outobj(data, &fio, IPFOBJ_IPFSTAT);
+ if (error)
+ return EFAULT;
+
+ WRITE_ENTER(&ipf_mutex);
+ bzero(&frstats, sizeof(frstats));
+ RWLOCK_EXIT(&ipf_mutex);
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_resolvedest */
+/* Returns: Nil */
+/* Parameters: fdp(IO) - pointer to destination information to resolve */
+/* v(I) - IP protocol version to match */
+/* */
+/* Looks up an interface name in the frdest structure pointed to by fdp and */
+/* if a matching name can be found for the particular IP protocol version */
+/* then store the interface pointer in the frdest struct. If no match is */
+/* found, then set the interface pointer to be -1 as NULL is considered to */
+/* indicate there is no information at all in the structure. */
+/* ------------------------------------------------------------------------ */
+void fr_resolvedest(fdp, v)
+frdest_t *fdp;
+int v;
+{
+ void *ifp;
+
+ ifp = NULL;
+ v = v; /* LINT */
+
+ if (*fdp->fd_ifname != '\0') {
+ ifp = GETIFP(fdp->fd_ifname, v);
+ if (ifp == NULL)
+ ifp = (void *)-1;
+ }
+ fdp->fd_ifp = ifp;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_resolvenic */
+/* Returns: void* - NULL = wildcard name, -1 = failed to find NIC, else */
+/* pointer to interface structure for NIC */
+/* Parameters: name(I) - complete interface name */
+/* v(I) - IP protocol version */
+/* */
+/* Look for a network interface structure that firstly has a matching name */
+/* to that passed in and that is also being used for that IP protocol */
+/* version (necessary on some platforms where there are separate listings */
+/* for both IPv4 and IPv6 on the same physical NIC. */
+/* */
+/* One might wonder why name gets terminated with a \0 byte in here. The */
+/* reason is an interface name could get into the kernel structures of ipf */
+/* in any number of ways and so long as they all use the same sized array */
+/* to put the name in, it makes sense to ensure it gets null terminated */
+/* before it is used for its intended purpose - finding its match in the */
+/* kernel's list of configured interfaces. */
+/* */
+/* NOTE: This SHOULD ONLY be used with IPFilter structures that have an */
+/* array for the name that is LIFNAMSIZ bytes (at least) in length. */
+/* ------------------------------------------------------------------------ */
+void *fr_resolvenic(name, v)
+char *name;
+int v;
+{
+ void *nic;
+
+ if (name[0] == '\0')
+ return NULL;
+
+ if ((name[1] == '\0') && ((name[0] == '-') || (name[0] == '*'))) {
+ return NULL;
+ }
+
+ name[LIFNAMSIZ - 1] = '\0';
+
+ nic = GETIFP(name, v);
+ if (nic == NULL)
+ nic = (void *)-1;
+ return nic;
+}
+
+
+ipftoken_t *ipftokenhead = NULL, **ipftokentail = &ipftokenhead;
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipf_expiretokens */
+/* Returns: None. */
+/* Parameters: None. */
+/* */
+/* This function is run every ipf tick to see if there are any tokens that */
+/* have been held for too long and need to be freed up. */
+/* ------------------------------------------------------------------------ */
+void ipf_expiretokens()
+{
+ ipftoken_t *it;
+ void *data;
+
+ WRITE_ENTER(&ipf_tokens);
+ while ((it = ipftokenhead) != NULL) {
+ if (it->ipt_die > fr_ticks)
+ break;
+
+ data = it->ipt_data;
+
+ ipf_freetoken(it);
+ }
+ RWLOCK_EXIT(&ipf_tokens);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipf_deltoken */
+/* Returns: int - 0 = success, else error */
+/* Parameters: type(I) - the token type to match */
+/* uid(I) - uid owning the token */
+/* ptr(I) - context pointer for the token */
+/* */
+/* This function looks for a a token in the current list that matches up */
+/* the fields (type, uid, ptr). If none is found, ESRCH is returned, else */
+/* call ipf_freetoken() to remove it from the list. */
+/* ------------------------------------------------------------------------ */
+int ipf_deltoken(type, uid, ptr)
+int type, uid;
+void *ptr;
+{
+ ipftoken_t *it;
+ int error = ESRCH;
+
+ WRITE_ENTER(&ipf_tokens);
+ for (it = ipftokenhead; it != NULL; it = it->ipt_next)
+ if (ptr == it->ipt_ctx && type == it->ipt_type &&
+ uid == it->ipt_uid) {
+ ipf_freetoken(it);
+ error = 0;
+ break;
+ }
+ RWLOCK_EXIT(&ipf_tokens);
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipf_findtoken */
+/* Returns: ipftoken_t * - NULL if no memory, else pointer to token */
+/* Parameters: type(I) - the token type to match */
+/* uid(I) - uid owning the token */
+/* ptr(I) - context pointer for the token */
+/* */
+/* This function looks for a live token in the list of current tokens that */
+/* matches the tuple (type, uid, ptr). If one cannot be found then one is */
+/* allocated. If one is found then it is moved to the top of the list of */
+/* currently active tokens. */
+/* */
+/* NOTE: It is by design that this function returns holding a read lock on */
+/* ipf_tokens. Callers must make sure they release it! */
+/* ------------------------------------------------------------------------ */
+ipftoken_t *ipf_findtoken(type, uid, ptr)
+int type, uid;
+void *ptr;
+{
+ ipftoken_t *it, *new;
+
+ KMALLOC(new, ipftoken_t *);
+
+ WRITE_ENTER(&ipf_tokens);
+ for (it = ipftokenhead; it != NULL; it = it->ipt_next) {
+ if (it->ipt_alive == 0)
+ continue;
+ if (ptr == it->ipt_ctx && type == it->ipt_type &&
+ uid == it->ipt_uid)
+ break;
+ }
+
+ if (it == NULL) {
+ it = new;
+ new = NULL;
+ if (it == NULL)
+ return NULL;
+ it->ipt_data = NULL;
+ it->ipt_ctx = ptr;
+ it->ipt_uid = uid;
+ it->ipt_type = type;
+ it->ipt_next = NULL;
+ it->ipt_alive = 1;
+ } else {
+ if (new != NULL) {
+ KFREE(new);
+ new = NULL;
+ }
+
+ ipf_unlinktoken(it);
+ }
+ it->ipt_pnext = ipftokentail;
+ *ipftokentail = it;
+ ipftokentail = &it->ipt_next;
+ it->ipt_next = NULL;
+
+ it->ipt_die = fr_ticks + 2;
+
+ MUTEX_DOWNGRADE(&ipf_tokens);
+
+ return it;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipf_unlinktoken */
+/* Returns: None. */
+/* Parameters: token(I) - pointer to token structure */
+/* */
+/* This function unlinks a token structure from the linked list of tokens */
+/* that "own" it. The head pointer never needs to be explicitly adjusted */
+/* but the tail does due to the linked list implementation. */
+/* ------------------------------------------------------------------------ */
+static void ipf_unlinktoken(token)
+ipftoken_t *token;
+{
+
+ if (ipftokentail == &token->ipt_next)
+ ipftokentail = token->ipt_pnext;
+
+ *token->ipt_pnext = token->ipt_next;
+ if (token->ipt_next != NULL)
+ token->ipt_next->ipt_pnext = token->ipt_pnext;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipf_freetoken */
+/* Returns: None. */
+/* Parameters: token(I) - pointer to token structure */
+/* */
+/* This function unlinks a token from the linked list and on the path to */
+/* free'ing the data, it calls the dereference function that is associated */
+/* with the type of data pointed to by the token as it is considered to */
+/* hold a reference to it. */
+/* ------------------------------------------------------------------------ */
+void ipf_freetoken(token)
+ipftoken_t *token;
+{
+ void *data, **datap;
+
+ ipf_unlinktoken(token);
+
+ data = token->ipt_data;
+ datap = &data;
+
+ if ((data != NULL) && (data != (void *)-1)) {
+ switch (token->ipt_type)
+ {
+ case IPFGENITER_IPF :
+ (void) fr_derefrule((frentry_t **)datap);
+ break;
+ case IPFGENITER_IPNAT :
+ WRITE_ENTER(&ipf_nat);
+ fr_ipnatderef((ipnat_t **)datap);
+ RWLOCK_EXIT(&ipf_nat);
+ break;
+ case IPFGENITER_NAT :
+ fr_natderef((nat_t **)datap);
+ break;
+ case IPFGENITER_STATE :
+ fr_statederef((ipstate_t **)datap);
+ break;
+ case IPFGENITER_FRAG :
+#ifdef USE_MUTEXES
+ fr_fragderef((ipfr_t **)datap, &ipf_frag);
+#else
+ fr_fragderef((ipfr_t **)datap);
+#endif
+ break;
+ case IPFGENITER_NATFRAG :
+#ifdef USE_MUTEXES
+ fr_fragderef((ipfr_t **)datap, &ipf_natfrag);
+#else
+ fr_fragderef((ipfr_t **)datap);
+#endif
+ break;
+ case IPFGENITER_HOSTMAP :
+ fr_hostmapdel((hostmap_t **)datap);
+ break;
+ default :
+#ifdef IPFILTER_LOOKUP
+ ip_lookup_iterderef(token->ipt_type, data);
+#endif
+ break;
+ }
+ }
+
+ KFREE(token);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipf_getnextrule */
+/* Returns: int - 0 = success, else error */
+/* Parameters: t(I) - pointer to destination information to resolve */
+/* ptr(I) - pointer to ipfobj_t to copyin from user space */
+/* */
+/* This function's first job is to bring in the ipfruleiter_t structure via */
+/* the ipfobj_t structure to determine what should be the next rule to */
+/* return. Once the ipfruleiter_t has been brought in, it then tries to */
+/* find the 'next rule'. This may include searching rule group lists or */
+/* just be as simple as looking at the 'next' field in the rule structure. */
+/* When we have found the rule to return, increase its reference count and */
+/* if we used an existing rule to get here, decrease its reference count. */
+/* ------------------------------------------------------------------------ */
+int ipf_getnextrule(ipftoken_t *t, void *ptr)
+{
+ frentry_t *fr, *next, zero;
+ int error, count, out;
+ ipfruleiter_t it;
+ frgroup_t *fg;
+ char *dst;
+
+ if (t == NULL || ptr == NULL)
+ return EFAULT;
+ error = fr_inobj(ptr, &it, IPFOBJ_IPFITER);
+ if (error != 0)
+ return error;
+ if ((it.iri_inout < 0) || (it.iri_inout > 3))
+ return EINVAL;
+ if ((it.iri_active != 0) && (it.iri_active != 1))
+ return EINVAL;
+ if (it.iri_nrules == 0)
+ return ENOSPC;
+ if (it.iri_rule == NULL)
+ return EFAULT;
+
+ out = it.iri_inout & F_OUT;
+ fr = t->ipt_data;
+ READ_ENTER(&ipf_mutex);
+ if (fr == NULL) {
+ if (*it.iri_group == '\0') {
+ if ((it.iri_inout & F_ACIN) != 0) {
+ if (it.iri_v == 4)
+ next = ipacct[out][it.iri_active];
+ else
+ next = ipacct6[out][it.iri_active];
+ } else {
+ if (it.iri_v == 4)
+ next = ipfilter[out][it.iri_active];
+ else
+ next = ipfilter6[out][it.iri_active];
+ }
+ } else {
+ fg = fr_findgroup(it.iri_group, IPL_LOGIPF,
+ it.iri_active, NULL);
+ if (fg != NULL)
+ next = fg->fg_start;
+ else
+ next = NULL;
+ }
+ } else {
+ next = fr->fr_next;
+ }
+
+ dst = (char *)it.iri_rule;
+ /*
+ * The ipfruleiter may ask for more than 1 rule at a time to be
+ * copied out, so long as that many exist in the list to start with!
+ */
+ for (count = it.iri_nrules; count > 0; count--) {
+ if (next != NULL) {
+ MUTEX_ENTER(&next->fr_lock);
+ next->fr_ref++;
+ MUTEX_EXIT(&next->fr_lock);
+ t->ipt_data = next;
+ } else {
+ bzero(&zero, sizeof(zero));
+ next = &zero;
+ ipf_freetoken(t);
+ fr = NULL;
+ t = NULL;
+ count = 1;
+ }
+ RWLOCK_EXIT(&ipf_mutex);
+
+ if (fr != NULL) {
+ (void) fr_derefrule(&fr);
+ }
+
+ error = COPYOUT(next, dst, sizeof(*next));
+ if (error != 0)
+ return EFAULT;
+
+ if (next->fr_data != NULL) {
+ dst += sizeof(*next);
+ error = COPYOUT(next->fr_data, dst, next->fr_dsize);
+ if (error != 0)
+ error = EFAULT;
+ else
+ dst += next->fr_dsize;
+ }
+
+ if ((count == 1) || (next->fr_next == NULL) || (error != 0))
+ break;
+
+ READ_ENTER(&ipf_mutex);
+ fr = next;
+ next = fr->fr_next;
+ }
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_frruleiter */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - the token type to match */
+/* uid(I) - uid owning the token */
+/* ptr(I) - context pointer for the token */
+/* */
+/* This function serves as a stepping stone between fr_ipf_ioctl and */
+/* ipf_getnextrule. It's role is to find the right token in the kernel for */
+/* the process doing the ioctl and use that to ask for the next rule. */
+/* ------------------------------------------------------------------------ */
+static int ipf_frruleiter(data, uid, ctx)
+void *data, *ctx;
+int uid;
+{
+ ipftoken_t *token;
+ int error;
+
+ token = ipf_findtoken(IPFGENITER_IPF, uid, ctx);
+ if (token != NULL)
+ error = ipf_getnextrule(token, data);
+ else
+ error = EFAULT;
+ RWLOCK_EXIT(&ipf_tokens);
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_geniter */
+/* Returns: int - 0 = success, else error */
+/* Parameters: token(I) - pointer to ipftoken_t structure */
+/* itp(I) - */
+/* */
+/* ------------------------------------------------------------------------ */
+static int ipf_geniter(token, itp)
+ipftoken_t *token;
+ipfgeniter_t *itp;
+{
+ int error;
+
+ switch (itp->igi_type)
+ {
+ case IPFGENITER_FRAG :
+#ifdef USE_MUTEXES
+ error = fr_nextfrag(token, itp,
+ &ipfr_list, &ipfr_tail, &ipf_frag);
+#else
+ error = fr_nextfrag(token, itp, &ipfr_list, &ipfr_tail);
+#endif
+ break;
+ default :
+ error = EINVAL;
+ break;
+ }
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_genericiter */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - the token type to match */
+/* uid(I) - uid owning the token */
+/* ptr(I) - context pointer for the token */
+/* */
+/* ------------------------------------------------------------------------ */
+int ipf_genericiter(data, uid, ctx)
+void *data, *ctx;
+int uid;
+{
+ ipftoken_t *token;
+ ipfgeniter_t iter;
+ int error;
+
+ error = fr_inobj(data, &iter, IPFOBJ_GENITER);
+ if (error != 0)
+ return error;
+
+ token = ipf_findtoken(iter.igi_type, uid, ctx);
+ if (token != NULL) {
+ token->ipt_subtype = iter.igi_type;
+ error = ipf_geniter(token, &iter);
+ } else
+ error = EFAULT;
+ RWLOCK_EXIT(&ipf_tokens);
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_ipf_ioctl */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - the token type to match */
+/* cmd(I) - the ioctl command number */
+/* mode(I) - mode flags for the ioctl */
+/* uid(I) - uid owning the token */
+/* ptr(I) - context pointer for the token */
+/* */
+/* This function handles all of the ioctl command that are actually isssued */
+/* to the /dev/ipl device. */
+/* ------------------------------------------------------------------------ */
+int fr_ipf_ioctl(data, cmd, mode, uid, ctx)
+caddr_t data;
+ioctlcmd_t cmd;
+int mode, uid;
+void *ctx;
+{
+ friostat_t fio;
+ int error, tmp;
+ SPL_INT(s);
+
+ switch (cmd)
+ {
+ case SIOCFRENB :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ error = BCOPYIN((caddr_t)data, (caddr_t)&tmp,
+ sizeof(tmp));
+ if (error != 0) {
+ error = EFAULT;
+ break;
+ }
+
+ RWLOCK_EXIT(&ipf_global);
+ WRITE_ENTER(&ipf_global);
+ if (tmp) {
+ if (fr_running > 0)
+ error = 0;
+ else
+ error = ipfattach();
+ if (error == 0)
+ fr_running = 1;
+ else
+ (void) ipfdetach();
+ } else {
+ error = ipfdetach();
+ if (error == 0)
+ fr_running = -1;
+ }
+ }
+ break;
+
+ case SIOCIPFSET :
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ break;
+ }
+ /* FALLTHRU */
+ case SIOCIPFGETNEXT :
+ case SIOCIPFGET :
+ error = fr_ipftune(cmd, (void *)data);
+ break;
+
+ case SIOCSETFF :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ error = BCOPYIN((caddr_t)data, (caddr_t)&fr_flags,
+ sizeof(fr_flags));
+ if (error != 0)
+ error = EFAULT;
+ }
+ break;
+
+ case SIOCGETFF :
+ error = BCOPYOUT((caddr_t)&fr_flags, (caddr_t)data,
+ sizeof(fr_flags));
+ if (error != 0)
+ error = EFAULT;
+ break;
+
+ case SIOCFUNCL :
+ error = fr_resolvefunc((void *)data);
+ break;
+
+ case SIOCINAFR :
+ case SIOCRMAFR :
+ case SIOCADAFR :
+ case SIOCZRLST :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else
+ error = frrequest(IPL_LOGIPF, cmd, (caddr_t)data,
+ fr_active, 1);
+ break;
+
+ case SIOCINIFR :
+ case SIOCRMIFR :
+ case SIOCADIFR :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else
+ error = frrequest(IPL_LOGIPF, cmd, (caddr_t)data,
+ 1 - fr_active, 1);
+ break;
+
+ case SIOCSWAPA :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ WRITE_ENTER(&ipf_mutex);
+ bzero((char *)frcache, sizeof(frcache[0]) * 2);
+ error = BCOPYOUT((caddr_t)&fr_active, (caddr_t)data,
+ sizeof(fr_active));
+ if (error != 0)
+ error = EFAULT;
+ else
+ fr_active = 1 - fr_active;
+ RWLOCK_EXIT(&ipf_mutex);
+ }
+ break;
+
+ case SIOCGETFS :
+ fr_getstat(&fio);
+ error = fr_outobj((void *)data, &fio, IPFOBJ_IPFSTAT);
+ break;
+
+ case SIOCFRZST :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else
+ error = fr_zerostats((caddr_t)data);
+ break;
+
+ case SIOCIPFFL :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ error = BCOPYIN((caddr_t)data, (caddr_t)&tmp,
+ sizeof(tmp));
+ if (!error) {
+ tmp = frflush(IPL_LOGIPF, 4, tmp);
+ error = BCOPYOUT((caddr_t)&tmp, (caddr_t)data,
+ sizeof(tmp));
+ if (error != 0)
+ error = EFAULT;
+ } else
+ error = EFAULT;
+ }
+ break;
+
+#ifdef USE_INET6
+ case SIOCIPFL6 :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ error = BCOPYIN((caddr_t)data, (caddr_t)&tmp,
+ sizeof(tmp));
+ if (!error) {
+ tmp = frflush(IPL_LOGIPF, 6, tmp);
+ error = BCOPYOUT((caddr_t)&tmp, (caddr_t)data,
+ sizeof(tmp));
+ if (error != 0)
+ error = EFAULT;
+ } else
+ error = EFAULT;
+ }
+ break;
+#endif
+
+ case SIOCSTLCK :
+ error = BCOPYIN((caddr_t)data, (caddr_t)&tmp, sizeof(tmp));
+ if (error == 0) {
+ fr_state_lock = tmp;
+ fr_nat_lock = tmp;
+ fr_frag_lock = tmp;
+ fr_auth_lock = tmp;
+ } else
+ error = EFAULT;
+ break;
+
+#ifdef IPFILTER_LOG
+ case SIOCIPFFB :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ tmp = ipflog_clear(IPL_LOGIPF);
+ error = BCOPYOUT((caddr_t)&tmp, (caddr_t)data,
+ sizeof(tmp));
+ if (error)
+ error = EFAULT;
+ }
+ break;
+#endif /* IPFILTER_LOG */
+
+ case SIOCFRSYN :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ RWLOCK_EXIT(&ipf_global);
+ WRITE_ENTER(&ipf_global);
+#ifdef MENTAT
+ error = ipfsync();
+#else
+ frsync(NULL);
+ error = 0;
+#endif
+
+ }
+ break;
+
+ case SIOCGFRST :
+ error = fr_outobj((void *)data, fr_fragstats(),
+ IPFOBJ_FRAGSTAT);
+ break;
+
+#ifdef IPFILTER_LOG
+ case FIONREAD :
+ tmp = (int)iplused[IPL_LOGIPF];
+
+ error = BCOPYOUT((caddr_t)&tmp, (caddr_t)data, sizeof(tmp));
+ break;
+#endif
+
+ case SIOCIPFITER :
+ SPL_SCHED(s);
+ error = ipf_frruleiter(data, uid, ctx);
+ SPL_X(s);
+ break;
+
+ case SIOCGENITER :
+ SPL_SCHED(s);
+ error = ipf_genericiter(data, uid, ctx);
+ SPL_X(s);
+ break;
+ break;
+
+ case SIOCIPFDELTOK :
+ SPL_SCHED(s);
+ error = BCOPYIN((caddr_t)data, (caddr_t)&tmp, sizeof(tmp));
+ if (error == 0)
+ error = ipf_deltoken(tmp, uid, ctx);
+ SPL_X(s);
+ break;
+ break;
+
+ default :
+ error = EINVAL;
+ break;
+ }
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipf_queueflush */
+/* Returns: int - number of entries flushed (0 = none) */
+/* Parameters: deletefn(I) - function to call to delete entry */
+/* ipfqs(I) - top of the list of ipf internal queues */
+/* userqs(I) - top of the list of user defined timeouts */
+/* */
+/* This fucntion gets called when the state/NAT hash tables fill up and we */
+/* need to try a bit harder to free up some space. The algorithm used is */
+/* to look for the oldest entries on each timeout queue and free them if */
+/* they are within the given window we are considering. Where the window */
+/* starts and the steps taken to increase its size depend upon how long ipf */
+/* has been running (fr_ticks.) Anything modified in the last 30 seconds */
+/* is not touched. */
+/* touched */
+/* die fr_ticks 30*1.5 1800*1.5 | 43200*1.5 */
+/* | | | | | | */
+/* future <--+----------+--------+-----------+-----+-----+-----------> past */
+/* now \_int=30s_/ \_int=1hr_/ \_int=12hr */
+/* */
+/* Points to note: */
+/* - tqe_die is the time, in the future, when entries die. */
+/* - tqe_die - fr_ticks is how long left the connection has to live in ipf */
+/* ticks. */
+/* - tqe_touched is when the entry was last used by NAT/state */
+/* - the closer tqe_touched is to fr_ticks, the further tqe_die will be for */
+/* any given timeout queue and vice versa. */
+/* - both tqe_die and tqe_touched increase over time */
+/* - timeout queues are sorted with the highest value of tqe_die at the */
+/* bottom and therefore the smallest values of each are at the top */
+/* */
+/* We start by setting up a maximum range to scan for things to move of */
+/* iend (newest) to istart (oldest) in chunks of "interval". If nothing is */
+/* found in that range, "interval" is adjusted (so long as it isn't 30) and */
+/* we start again with a new value for "iend" and "istart". The downside */
+/* of the current implementation is that it may return removing just 1 entry*/
+/* every time (pathological case) where it could remove more. */
+/* ------------------------------------------------------------------------ */
+int ipf_queueflush(deletefn, ipfqs, userqs)
+ipftq_delete_fn_t deletefn;
+ipftq_t *ipfqs, *userqs;
+{
+ u_long interval, istart, iend;
+ ipftq_t *ifq, *ifqnext;
+ ipftqent_t *tqe, *tqn;
+ int removed;
+
+ /*
+ * NOTE: Use of "* 15 / 10" is required here because if "* 1.5" is
+ * used then the operations are upgraded to floating point
+ * and kernels don't like floating point...
+ */
+ if (fr_ticks > IPF_TTLVAL(43200 * 15 / 10)) {
+ istart = IPF_TTLVAL(86400 * 4);
+ interval = IPF_TTLVAL(43200);
+ } else if (fr_ticks > IPF_TTLVAL(1800 * 15 / 10)) {
+ istart = IPF_TTLVAL(43200);
+ interval = IPF_TTLVAL(1800);
+ } else if (fr_ticks > IPF_TTLVAL(30 * 15 / 10)) {
+ istart = IPF_TTLVAL(1800);
+ interval = IPF_TTLVAL(30);
+ } else {
+ return 0;
+ }
+ if (istart > fr_ticks) {
+ istart = (fr_ticks / interval) * interval;
+ }
+
+ iend = fr_ticks - interval;
+ if (istart > iend)
+ istart = iend - interval;
+ removed = 0;
+
+ while (removed == 0) {
+ u_long try;
+
+ try = fr_ticks - istart;
+
+ for (ifq = ipfqs; ifq != NULL; ifq = ifq->ifq_next) {
+ for (tqn = ifq->ifq_head; ((tqe = tqn) != NULL); ) {
+ if (try < tqe->tqe_touched)
+ break;
+ tqn = tqe->tqe_next;
+ if ((*deletefn)(tqe->tqe_parent) == 0)
+ removed++;
+ }
+ }
+
+ for (ifq = userqs; ifq != NULL; ifq = ifqnext) {
+ ifqnext = ifq->ifq_next;
+
+ for (tqn = ifq->ifq_head; ((tqe = tqn) != NULL); ) {
+ if (try < tqe->tqe_touched)
+ break;
+ tqn = tqe->tqe_next;
+ if ((*deletefn)(tqe->tqe_parent) == 0)
+ removed++;
+ }
+ }
+
+ istart -= interval;
+ if (try >= iend) {
+ if (interval == IPF_TTLVAL(43200)) {
+ interval = IPF_TTLVAL(1800);
+ } else if (interval == IPF_TTLVAL(1800)) {
+ interval = IPF_TTLVAL(30);
+ } else {
+ break;
+ }
+ if (interval >= fr_ticks)
+ break;
+
+ iend = fr_ticks - interval;
+ }
+ }
+
+ return removed;
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_auth.c b/sys/contrib/ipfilter/netinet/ip_auth.c
new file mode 100644
index 0000000..e6d3d50
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_auth.c
@@ -0,0 +1,1052 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1998-2003 by Darren Reed & Guido van Rooij.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#if !defined(_KERNEL)
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# define _KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+#endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 220000)
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#if !defined(linux)
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if defined(_KERNEL)
+# include <sys/systm.h>
+# if !defined(__SVR4) && !defined(__svr4__) && !defined(linux)
+# include <sys/mbuf.h>
+# endif
+#endif
+#if defined(__SVR4) || defined(__svr4__)
+# include <sys/filio.h>
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+#if (defined(_BSDI_VERSION) && _BSDI_VERSION >= 199802) || \
+ (__FreeBSD_version >= 400000)
+# include <sys/queue.h>
+#endif
+#if defined(__NetBSD__) || defined(__OpenBSD__) || defined(bsdi)
+# include <machine/cpu.h>
+#endif
+#if defined(_KERNEL) && defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)
+# include <sys/proc.h>
+#endif
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#if !defined(_KERNEL) && !defined(__osf__) && !defined(__sgi)
+# define KERNEL
+# define _KERNEL
+# define NOT_KERNEL
+#endif
+#if !defined(linux)
+# include <netinet/ip_var.h>
+#endif
+#ifdef NOT_KERNEL
+# undef _KERNEL
+# undef KERNEL
+#endif
+#include <netinet/tcp.h>
+#if defined(IRIX) && (IRIX < 60516) /* IRIX < 6 */
+extern struct ifqueue ipintrq; /* ip packet input queue */
+#else
+# if !defined(__hpux) && !defined(linux)
+# if __FreeBSD_version >= 300000
+# include <net/if_var.h>
+# if __FreeBSD_version >= 500042
+# define IF_QFULL _IF_QFULL
+# define IF_DROP _IF_DROP
+# endif /* __FreeBSD_version >= 500042 */
+# endif
+# include <netinet/in_var.h>
+# include <netinet/tcp_fsm.h>
+# endif
+#endif
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_auth.h"
+#if !defined(MENTAT) && !defined(linux)
+# include <net/netisr.h>
+# ifdef __FreeBSD__
+# include <machine/cpufunc.h>
+# endif
+#endif
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+# if defined(_KERNEL) && !defined(IPFILTER_LKM)
+# include <sys/libkern.h>
+# include <sys/systm.h>
+# endif
+#endif
+/* END OF INCLUDES */
+
+#if !defined(lint)
+static const char rcsid[] = "@(#)$FreeBSD$";
+/* static const char rcsid[] = "@(#)$Id: ip_auth.c,v 2.73.2.13 2006/03/29 11:19:55 darrenr Exp $"; */
+#endif
+
+
+#if SOLARIS && defined(_KERNEL)
+extern kcondvar_t ipfauthwait;
+extern struct pollhead iplpollhead[IPL_LOGSIZE];
+#endif /* SOLARIS */
+#if defined(linux) && defined(_KERNEL)
+wait_queue_head_t fr_authnext_linux;
+#endif
+
+int fr_authsize = FR_NUMAUTH;
+int fr_authused = 0;
+int fr_defaultauthage = 600;
+int fr_auth_lock = 0;
+int fr_auth_init = 0;
+fr_authstat_t fr_authstats;
+static frauth_t *fr_auth = NULL;
+mb_t **fr_authpkts = NULL;
+int fr_authstart = 0, fr_authend = 0, fr_authnext = 0;
+frauthent_t *fae_list = NULL;
+frentry_t *ipauth = NULL,
+ *fr_authlist = NULL;
+
+void fr_authderef __P((frauthent_t **));
+int fr_authgeniter __P((ipftoken_t *, ipfgeniter_t *));
+int fr_authreply __P((char *));
+int fr_authwait __P((char *));
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_authinit */
+/* Returns: int - 0 == success, else error */
+/* Parameters: None */
+/* */
+/* Allocate memory and initialise data structures used in handling auth */
+/* rules. */
+/* ------------------------------------------------------------------------ */
+int fr_authinit()
+{
+ KMALLOCS(fr_auth, frauth_t *, fr_authsize * sizeof(*fr_auth));
+ if (fr_auth != NULL)
+ bzero((char *)fr_auth, fr_authsize * sizeof(*fr_auth));
+ else
+ return -1;
+
+ KMALLOCS(fr_authpkts, mb_t **, fr_authsize * sizeof(*fr_authpkts));
+ if (fr_authpkts != NULL)
+ bzero((char *)fr_authpkts, fr_authsize * sizeof(*fr_authpkts));
+ else
+ return -2;
+
+ MUTEX_INIT(&ipf_authmx, "ipf auth log mutex");
+ RWLOCK_INIT(&ipf_auth, "ipf IP User-Auth rwlock");
+#if SOLARIS && defined(_KERNEL)
+ cv_init(&ipfauthwait, "ipf auth condvar", CV_DRIVER, NULL);
+#endif
+#if defined(linux) && defined(_KERNEL)
+ init_waitqueue_head(&fr_authnext_linux);
+#endif
+
+ fr_auth_init = 1;
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_checkauth */
+/* Returns: frentry_t* - pointer to ipf rule if match found, else NULL */
+/* Parameters: fin(I) - pointer to ipftoken structure */
+/* passp(I) - pointer to ipfgeniter structure */
+/* */
+/* Check if a packet has authorization. If the packet is found to match an */
+/* authorization result and that would result in a feedback loop (i.e. it */
+/* will end up returning FR_AUTH) then return FR_BLOCK instead. */
+/* ------------------------------------------------------------------------ */
+frentry_t *fr_checkauth(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ frentry_t *fr;
+ frauth_t *fra;
+ u_32_t pass;
+ u_short id;
+ ip_t *ip;
+ int i;
+
+ if (fr_auth_lock || !fr_authused)
+ return NULL;
+
+ ip = fin->fin_ip;
+ id = ip->ip_id;
+
+ READ_ENTER(&ipf_auth);
+ for (i = fr_authstart; i != fr_authend; ) {
+ /*
+ * index becomes -2 only after an SIOCAUTHW. Check this in
+ * case the same packet gets sent again and it hasn't yet been
+ * auth'd.
+ */
+ fra = fr_auth + i;
+ if ((fra->fra_index == -2) && (id == fra->fra_info.fin_id) &&
+ !bcmp((char *)fin, (char *)&fra->fra_info, FI_CSIZE)) {
+ /*
+ * Avoid feedback loop.
+ */
+ if (!(pass = fra->fra_pass) || (FR_ISAUTH(pass)))
+ pass = FR_BLOCK;
+ /*
+ * Create a dummy rule for the stateful checking to
+ * use and return. Zero out any values we don't
+ * trust from userland!
+ */
+ if ((pass & FR_KEEPSTATE) || ((pass & FR_KEEPFRAG) &&
+ (fin->fin_flx & FI_FRAG))) {
+ KMALLOC(fr, frentry_t *);
+ if (fr) {
+ bcopy((char *)fra->fra_info.fin_fr,
+ (char *)fr, sizeof(*fr));
+ fr->fr_grp = NULL;
+ fr->fr_ifa = fin->fin_ifp;
+ fr->fr_func = NULL;
+ fr->fr_ref = 1;
+ fr->fr_flags = pass;
+ fr->fr_ifas[1] = NULL;
+ fr->fr_ifas[2] = NULL;
+ fr->fr_ifas[3] = NULL;
+ }
+ } else
+ fr = fra->fra_info.fin_fr;
+ fin->fin_fr = fr;
+ RWLOCK_EXIT(&ipf_auth);
+
+ WRITE_ENTER(&ipf_auth);
+ /*
+ * fr_authlist is populated with the rules malloc'd
+ * above and only those.
+ */
+ if ((fr != NULL) && (fr != fra->fra_info.fin_fr)) {
+ fr->fr_next = fr_authlist;
+ fr_authlist = fr;
+ }
+ fr_authstats.fas_hits++;
+ fra->fra_index = -1;
+ fr_authused--;
+ if (i == fr_authstart) {
+ while (fra->fra_index == -1) {
+ i++;
+ fra++;
+ if (i == fr_authsize) {
+ i = 0;
+ fra = fr_auth;
+ }
+ fr_authstart = i;
+ if (i == fr_authend)
+ break;
+ }
+ if (fr_authstart == fr_authend) {
+ fr_authnext = 0;
+ fr_authstart = fr_authend = 0;
+ }
+ }
+ RWLOCK_EXIT(&ipf_auth);
+ if (passp != NULL)
+ *passp = pass;
+ ATOMIC_INC64(fr_authstats.fas_hits);
+ return fr;
+ }
+ i++;
+ if (i == fr_authsize)
+ i = 0;
+ }
+ fr_authstats.fas_miss++;
+ RWLOCK_EXIT(&ipf_auth);
+ ATOMIC_INC64(fr_authstats.fas_miss);
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_newauth */
+/* Returns: int - 0 == success, else error */
+/* Parameters: m(I) - pointer to mb_t with packet in it */
+/* fin(I) - pointer to packet information */
+/* */
+/* Check if we have room in the auth array to hold details for another */
+/* packet. If we do, store it and wake up any user programs which are */
+/* waiting to hear about these events. */
+/* ------------------------------------------------------------------------ */
+int fr_newauth(m, fin)
+mb_t *m;
+fr_info_t *fin;
+{
+#if defined(_KERNEL) && defined(MENTAT)
+ qpktinfo_t *qpi = fin->fin_qpi;
+#endif
+ frauth_t *fra;
+#if !defined(sparc) && !defined(m68k)
+ ip_t *ip;
+#endif
+ int i;
+
+ if (fr_auth_lock)
+ return 0;
+
+ WRITE_ENTER(&ipf_auth);
+ if (fr_authstart > fr_authend) {
+ fr_authstats.fas_nospace++;
+ RWLOCK_EXIT(&ipf_auth);
+ return 0;
+ } else {
+ if (fr_authused == fr_authsize) {
+ fr_authstats.fas_nospace++;
+ RWLOCK_EXIT(&ipf_auth);
+ return 0;
+ }
+ }
+
+ fr_authstats.fas_added++;
+ fr_authused++;
+ i = fr_authend++;
+ if (fr_authend == fr_authsize)
+ fr_authend = 0;
+ RWLOCK_EXIT(&ipf_auth);
+
+ fra = fr_auth + i;
+ fra->fra_index = i;
+ if (fin->fin_fr != NULL)
+ fra->fra_pass = fin->fin_fr->fr_flags;
+ else
+ fra->fra_pass = 0;
+ fra->fra_age = fr_defaultauthage;
+ bcopy((char *)fin, (char *)&fra->fra_info, sizeof(*fin));
+#if !defined(sparc) && !defined(m68k)
+ /*
+ * No need to copyback here as we want to undo the changes, not keep
+ * them.
+ */
+ ip = fin->fin_ip;
+# if defined(MENTAT) && defined(_KERNEL)
+ if ((ip == (ip_t *)m->b_rptr) && (fin->fin_v == 4))
+# endif
+ {
+ register u_short bo;
+
+ bo = ip->ip_len;
+ ip->ip_len = htons(bo);
+ bo = ip->ip_off;
+ ip->ip_off = htons(bo);
+ }
+#endif
+#if SOLARIS && defined(_KERNEL)
+ COPYIFNAME(fin->fin_ifp, fra->fra_info.fin_ifname);
+ m->b_rptr -= qpi->qpi_off;
+ fr_authpkts[i] = *(mblk_t **)fin->fin_mp;
+ fra->fra_q = qpi->qpi_q; /* The queue can disappear! */
+ fra->fra_m = *fin->fin_mp;
+ fra->fra_info.fin_mp = &fra->fra_m;
+ cv_signal(&ipfauthwait);
+ pollwakeup(&iplpollhead[IPL_LOGAUTH], POLLIN|POLLRDNORM);
+#else
+ fr_authpkts[i] = m;
+ WAKEUP(&fr_authnext,0);
+#endif
+ return 1;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_auth_ioctl */
+/* Returns: int - 0 == success, else error */
+/* Parameters: data(IO) - pointer to ioctl data */
+/* cmd(I) - ioctl command */
+/* mode(I) - mode flags associated with open descriptor */
+/* uid(I) - uid associatd with application making the call */
+/* ctx(I) - pointer for context */
+/* */
+/* This function handles all of the ioctls recognised by the auth component */
+/* in IPFilter - ie ioctls called on an open fd for /dev/ipauth */
+/* ------------------------------------------------------------------------ */
+int fr_auth_ioctl(data, cmd, mode, uid, ctx)
+caddr_t data;
+ioctlcmd_t cmd;
+int mode, uid;
+void *ctx;
+{
+ int error = 0, i;
+ SPL_INT(s);
+
+ switch (cmd)
+ {
+ case SIOCGENITER :
+ {
+ ipftoken_t *token;
+ ipfgeniter_t iter;
+
+ error = fr_inobj(data, &iter, IPFOBJ_GENITER);
+ if (error != 0)
+ break;
+
+ SPL_SCHED(s);
+ token = ipf_findtoken(IPFGENITER_AUTH, uid, ctx);
+ if (token != NULL)
+ error = fr_authgeniter(token, &iter);
+ else
+ error = ESRCH;
+ RWLOCK_EXIT(&ipf_tokens);
+ SPL_X(s);
+
+ break;
+ }
+
+ case SIOCADAFR :
+ case SIOCRMAFR :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else
+ error = frrequest(IPL_LOGAUTH, cmd, data,
+ fr_active, 1);
+ break;
+
+ case SIOCSTLCK :
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ break;
+ }
+ fr_lock(data, &fr_auth_lock);
+ break;
+
+ case SIOCATHST:
+ fr_authstats.fas_faelist = fae_list;
+ error = fr_outobj(data, &fr_authstats, IPFOBJ_AUTHSTAT);
+ break;
+
+ case SIOCIPFFL:
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_auth);
+ i = fr_authflush();
+ RWLOCK_EXIT(&ipf_auth);
+ SPL_X(s);
+ error = BCOPYOUT((char *)&i, data, sizeof(i));
+ if (error != 0)
+ error = EFAULT;
+ break;
+
+ case SIOCAUTHW:
+ error = fr_authwait(data);
+ break;
+
+ case SIOCAUTHR:
+ error = fr_authreply(data);
+ break;
+
+ default :
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_authunload */
+/* Returns: None */
+/* Parameters: None */
+/* */
+/* Free all network buffer memory used to keep saved packets. */
+/* ------------------------------------------------------------------------ */
+void fr_authunload()
+{
+ register int i;
+ register frauthent_t *fae, **faep;
+ frentry_t *fr, **frp;
+ mb_t *m;
+
+ if (fr_auth != NULL) {
+ KFREES(fr_auth, fr_authsize * sizeof(*fr_auth));
+ fr_auth = NULL;
+ }
+
+ if (fr_authpkts != NULL) {
+ for (i = 0; i < fr_authsize; i++) {
+ m = fr_authpkts[i];
+ if (m != NULL) {
+ FREE_MB_T(m);
+ fr_authpkts[i] = NULL;
+ }
+ }
+ KFREES(fr_authpkts, fr_authsize * sizeof(*fr_authpkts));
+ fr_authpkts = NULL;
+ }
+
+ faep = &fae_list;
+ while ((fae = *faep) != NULL) {
+ *faep = fae->fae_next;
+ KFREE(fae);
+ }
+ ipauth = NULL;
+
+ if (fr_authlist != NULL) {
+ for (frp = &fr_authlist; ((fr = *frp) != NULL); ) {
+ if (fr->fr_ref == 1) {
+ *frp = fr->fr_next;
+ KFREE(fr);
+ } else
+ frp = &fr->fr_next;
+ }
+ }
+
+ if (fr_auth_init == 1) {
+# if SOLARIS && defined(_KERNEL)
+ cv_destroy(&ipfauthwait);
+# endif
+ MUTEX_DESTROY(&ipf_authmx);
+ RW_DESTROY(&ipf_auth);
+
+ fr_auth_init = 0;
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_authexpire */
+/* Returns: None */
+/* Parameters: None */
+/* */
+/* Slowly expire held auth records. Timeouts are set in expectation of */
+/* this being called twice per second. */
+/* ------------------------------------------------------------------------ */
+void fr_authexpire()
+{
+ frauthent_t *fae, **faep;
+ frentry_t *fr, **frp;
+ frauth_t *fra;
+ mb_t *m;
+ int i;
+ SPL_INT(s);
+
+ if (fr_auth_lock)
+ return;
+
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_auth);
+ for (i = 0, fra = fr_auth; i < fr_authsize; i++, fra++) {
+ fra->fra_age--;
+ if ((fra->fra_age == 0) && (m = fr_authpkts[i])) {
+ FREE_MB_T(m);
+ fr_authpkts[i] = NULL;
+ fr_auth[i].fra_index = -1;
+ fr_authstats.fas_expire++;
+ fr_authused--;
+ }
+ }
+
+ /*
+ * Expire pre-auth rules
+ */
+ for (faep = &fae_list; ((fae = *faep) != NULL); ) {
+ fae->fae_age--;
+ if (fae->fae_age == 0) {
+ fr_authderef(&fae);
+ fr_authstats.fas_expire++;
+ } else
+ faep = &fae->fae_next;
+ }
+ if (fae_list != NULL)
+ ipauth = &fae_list->fae_fr;
+ else
+ ipauth = NULL;
+
+ for (frp = &fr_authlist; ((fr = *frp) != NULL); ) {
+ if (fr->fr_ref == 1) {
+ *frp = fr->fr_next;
+ KFREE(fr);
+ } else
+ frp = &fr->fr_next;
+ }
+ RWLOCK_EXIT(&ipf_auth);
+ SPL_X(s);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_preauthcmd */
+/* Returns: int - 0 == success, else error */
+/* Parameters: cmd(I) - ioctl command for rule */
+/* fr(I) - pointer to ipf rule */
+/* fptr(I) - pointer to caller's 'fr' */
+/* */
+/* ------------------------------------------------------------------------ */
+int fr_preauthcmd(cmd, fr, frptr)
+ioctlcmd_t cmd;
+frentry_t *fr, **frptr;
+{
+ frauthent_t *fae, **faep;
+ int error = 0;
+ SPL_INT(s);
+
+ if ((cmd != SIOCADAFR) && (cmd != SIOCRMAFR))
+ return EIO;
+
+ for (faep = &fae_list; ((fae = *faep) != NULL); ) {
+ if (&fae->fae_fr == fr)
+ break;
+ else
+ faep = &fae->fae_next;
+ }
+
+ if (cmd == (ioctlcmd_t)SIOCRMAFR) {
+ if (fr == NULL || frptr == NULL)
+ error = EINVAL;
+ else if (fae == NULL)
+ error = ESRCH;
+ else {
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_auth);
+ *faep = fae->fae_next;
+ if (ipauth == &fae->fae_fr)
+ ipauth = fae_list ? &fae_list->fae_fr : NULL;
+ RWLOCK_EXIT(&ipf_auth);
+ SPL_X(s);
+
+ KFREE(fae);
+ }
+ } else if (fr != NULL && frptr != NULL) {
+ KMALLOC(fae, frauthent_t *);
+ if (fae != NULL) {
+ bcopy((char *)fr, (char *)&fae->fae_fr,
+ sizeof(*fr));
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_auth);
+ fae->fae_age = fr_defaultauthage;
+ fae->fae_fr.fr_hits = 0;
+ fae->fae_fr.fr_next = *frptr;
+ fae->fae_ref = 1;
+ *frptr = &fae->fae_fr;
+ fae->fae_next = *faep;
+ *faep = fae;
+ ipauth = &fae_list->fae_fr;
+ RWLOCK_EXIT(&ipf_auth);
+ SPL_X(s);
+ } else
+ error = ENOMEM;
+ } else
+ error = EINVAL;
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_authflush */
+/* Returns: int - number of auth entries flushed */
+/* Parameters: None */
+/* Locks: WRITE(ipf_auth) */
+/* */
+/* This function flushs the fr_authpkts array of any packet data with */
+/* references still there. */
+/* It is expected that the caller has already acquired the correct locks or */
+/* set the priority level correctly for this to block out other code paths */
+/* into these data structures. */
+/* ------------------------------------------------------------------------ */
+int fr_authflush()
+{
+ register int i, num_flushed;
+ mb_t *m;
+
+ if (fr_auth_lock)
+ return -1;
+
+ num_flushed = 0;
+
+ for (i = 0 ; i < fr_authsize; i++) {
+ m = fr_authpkts[i];
+ if (m != NULL) {
+ FREE_MB_T(m);
+ fr_authpkts[i] = NULL;
+ fr_auth[i].fra_index = -1;
+ /* perhaps add & use a flush counter inst.*/
+ fr_authstats.fas_expire++;
+ fr_authused--;
+ num_flushed++;
+ }
+ }
+
+ fr_authstart = 0;
+ fr_authend = 0;
+ fr_authnext = 0;
+
+ return num_flushed;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_auth_waiting */
+/* Returns: int - number of packets in the auth queue */
+/* Parameters: None */
+/* */
+/* Returns the numbers of packets queued up, waiting to be processed with */
+/* a pair of SIOCAUTHW and SIOCAUTHR calls. */
+/* ------------------------------------------------------------------------ */
+int fr_auth_waiting()
+{
+ return (fr_authnext != fr_authend) && fr_authpkts[fr_authnext];
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_authgeniter */
+/* Returns: int - 0 == success, else error */
+/* Parameters: token(I) - pointer to ipftoken structure */
+/* itp(I) - pointer to ipfgeniter structure */
+/* */
+/* ------------------------------------------------------------------------ */
+int fr_authgeniter(token, itp)
+ipftoken_t *token;
+ipfgeniter_t *itp;
+{
+ frauthent_t *fae, *next, zero;
+ int error;
+
+ if (itp->igi_data == NULL)
+ return EFAULT;
+
+ if (itp->igi_type != IPFGENITER_AUTH)
+ return EINVAL;
+
+ fae = token->ipt_data;
+ READ_ENTER(&ipf_auth);
+ if (fae == NULL) {
+ next = fae_list;
+ } else {
+ next = fae->fae_next;
+ }
+
+ if (next != NULL) {
+ /*
+ * If we find an auth entry to use, bump its reference count
+ * so that it can be used for is_next when we come back.
+ */
+ ATOMIC_INC(next->fae_ref);
+ if (next->fae_next == NULL) {
+ ipf_freetoken(token);
+ token = NULL;
+ } else {
+ token->ipt_data = next;
+ }
+ } else {
+ bzero(&zero, sizeof(zero));
+ next = &zero;
+ }
+ RWLOCK_EXIT(&ipf_auth);
+
+ /*
+ * If we had a prior pointer to an auth entry, release it.
+ */
+ if (fae != NULL) {
+ WRITE_ENTER(&ipf_auth);
+ fr_authderef(&fae);
+ RWLOCK_EXIT(&ipf_auth);
+ }
+
+ /*
+ * This should arguably be via fr_outobj() so that the auth
+ * structure can (if required) be massaged going out.
+ */
+ error = COPYOUT(next, itp->igi_data, sizeof(*next));
+ if (error != 0)
+ error = EFAULT;
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_authderef */
+/* Returns: None */
+/* Parameters: faep(IO) - pointer to caller's frauthent_t pointer */
+/* Locks: WRITE(ipf_auth) */
+/* */
+/* This function unconditionally sets the pointer in the caller to NULL, */
+/* to make it clear that it should no longer use that pointer, and drops */
+/* the reference count on the structure by 1. If it reaches 0, free it up. */
+/* ------------------------------------------------------------------------ */
+void fr_authderef(faep)
+frauthent_t **faep;
+{
+ frauthent_t *fae;
+
+ fae = *faep;
+ *faep = NULL;
+
+ fae->fae_ref--;
+ if (fae->fae_ref == 0) {
+ KFREE(fae);
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_authwait */
+/* Returns: int - 0 == success, else error */
+/* Parameters: data(I) - pointer to data from ioctl call */
+/* */
+/* This function is called when an application is waiting for a packet to */
+/* match an "auth" rule by issuing an SIOCAUTHW ioctl. If there is already */
+/* a packet waiting on the queue then we will return that _one_ immediately.*/
+/* If there are no packets present in the queue (fr_authpkts) then we go to */
+/* sleep. */
+/* ------------------------------------------------------------------------ */
+int fr_authwait(data)
+char *data;
+{
+ frauth_t auth, *au = &auth;
+ int error, len, i;
+ mb_t *m;
+ char *t;
+#if defined(_KERNEL) && !defined(MENTAT) && !defined(linux) && \
+ (!defined(__FreeBSD_version) || (__FreeBSD_version < 501000))
+ SPL_INT(s);
+#endif
+
+fr_authioctlloop:
+ error = fr_inobj(data, au, IPFOBJ_FRAUTH);
+ if (error != 0)
+ return error;
+
+ /*
+ * XXX Locks are held below over calls to copyout...a better
+ * solution needs to be found so this isn't necessary. The situation
+ * we are trying to guard against here is an error in the copyout
+ * steps should not cause the packet to "disappear" from the queue.
+ */
+ READ_ENTER(&ipf_auth);
+
+ /*
+ * If fr_authnext is not equal to fr_authend it will be because there
+ * is a packet waiting to be delt with in the fr_authpkts array. We
+ * copy as much of that out to user space as requested.
+ */
+ if ((fr_authnext != fr_authend) && fr_authpkts[fr_authnext]) {
+ error = fr_outobj(data, &fr_auth[fr_authnext], IPFOBJ_FRAUTH);
+ if (error != 0)
+ return error;
+
+ if (auth.fra_len != 0 && auth.fra_buf != NULL) {
+ /*
+ * Copy packet contents out to user space if
+ * requested. Bail on an error.
+ */
+ m = fr_authpkts[fr_authnext];
+ len = MSGDSIZE(m);
+ if (len > auth.fra_len)
+ len = auth.fra_len;
+ auth.fra_len = len;
+
+ for (t = auth.fra_buf; m && (len > 0); ) {
+ i = MIN(M_LEN(m), len);
+ error = copyoutptr(MTOD(m, char *), &t, i);
+ len -= i;
+ t += i;
+ if (error != 0)
+ return error;
+ m = m->m_next;
+ }
+ }
+ RWLOCK_EXIT(&ipf_auth);
+ if (error != 0)
+ return error;
+
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_auth);
+ fr_authnext++;
+ if (fr_authnext == fr_authsize)
+ fr_authnext = 0;
+ RWLOCK_EXIT(&ipf_auth);
+ SPL_X(s);
+
+ return 0;
+ }
+ RWLOCK_EXIT(&ipf_auth);
+
+ /*
+ * We exit ipf_global here because a program that enters in
+ * here will have a lock on it and goto sleep having this lock.
+ * If someone were to do an 'ipf -D' the system would then
+ * deadlock. The catch with releasing it here is that the
+ * caller of this function expects it to be held when we
+ * return so we have to reacquire it in here.
+ */
+ RWLOCK_EXIT(&ipf_global);
+
+ MUTEX_ENTER(&ipf_authmx);
+#ifdef _KERNEL
+# if SOLARIS
+ error = 0;
+ if (!cv_wait_sig(&ipfauthwait, &ipf_authmx.ipf_lk))
+ error = EINTR;
+# else /* SOLARIS */
+# ifdef __hpux
+ {
+ lock_t *l;
+
+ l = get_sleep_lock(&fr_authnext);
+ error = sleep(&fr_authnext, PZERO+1);
+ spinunlock(l);
+ }
+# else
+# ifdef __osf__
+ error = mpsleep(&fr_authnext, PSUSP|PCATCH, "fr_authnext", 0,
+ &ipf_authmx, MS_LOCK_SIMPLE);
+# else
+ error = SLEEP(&fr_authnext, "fr_authnext");
+# endif /* __osf__ */
+# endif /* __hpux */
+# endif /* SOLARIS */
+#endif
+ MUTEX_EXIT(&ipf_authmx);
+ READ_ENTER(&ipf_global);
+ if (error == 0)
+ goto fr_authioctlloop;
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_authreply */
+/* Returns: int - 0 == success, else error */
+/* Parameters: data(I) - pointer to data from ioctl call */
+/* */
+/* This function is called by an application when it wants to return a */
+/* decision on a packet using the SIOCAUTHR ioctl. This is after it has */
+/* received information using an SIOCAUTHW. The decision returned in the */
+/* form of flags, the same as those used in each rule. */
+/* ------------------------------------------------------------------------ */
+int fr_authreply(data)
+char *data;
+{
+ frauth_t auth, *au = &auth, *fra;
+ int error, i;
+ mb_t *m;
+ SPL_INT(s);
+
+ error = fr_inobj(data, &auth, IPFOBJ_FRAUTH);
+ if (error != 0)
+ return error;
+
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_auth);
+
+ i = au->fra_index;
+ fra = fr_auth + i;
+ error = 0;
+
+ /*
+ * Check the validity of the information being returned with two simple
+ * checks. First, the auth index value should be within the size of
+ * the array and second the packet id being returned should also match.
+ */
+ if ((i < 0) || (i >= fr_authsize) ||
+ (fra->fra_info.fin_id != au->fra_info.fin_id)) {
+ RWLOCK_EXIT(&ipf_auth);
+ SPL_X(s);
+ return ESRCH;
+ }
+
+ m = fr_authpkts[i];
+ fra->fra_index = -2;
+ fra->fra_pass = au->fra_pass;
+ fr_authpkts[i] = NULL;
+
+ RWLOCK_EXIT(&ipf_auth);
+
+ /*
+ * Re-insert the packet back into the packet stream flowing through
+ * the kernel in a manner that will mean IPFilter sees the packet
+ * again. This is not the same as is done with fastroute,
+ * deliberately, as we want to resume the normal packet processing
+ * path for it.
+ */
+#ifdef _KERNEL
+ if ((m != NULL) && (au->fra_info.fin_out != 0)) {
+ error = ipf_inject(&fra->fra_info, m);
+ if (error != 0) {
+ error = ENOBUFS;
+ fr_authstats.fas_sendfail++;
+ } else {
+ fr_authstats.fas_sendok++;
+ }
+ } else if (m) {
+ error = ipf_inject(&fra->fra_info, m);
+ if (error != 0) {
+ error = ENOBUFS;
+ fr_authstats.fas_quefail++;
+ } else {
+ fr_authstats.fas_queok++;
+ }
+ } else {
+ error = EINVAL;
+ }
+
+ /*
+ * If we experience an error which will result in the packet
+ * not being processed, make sure we advance to the next one.
+ */
+ if (error == ENOBUFS) {
+ fr_authused--;
+ fra->fra_index = -1;
+ fra->fra_pass = 0;
+ if (i == fr_authstart) {
+ while (fra->fra_index == -1) {
+ i++;
+ if (i == fr_authsize)
+ i = 0;
+ fr_authstart = i;
+ if (i == fr_authend)
+ break;
+ }
+ if (fr_authstart == fr_authend) {
+ fr_authnext = 0;
+ fr_authstart = fr_authend = 0;
+ }
+ }
+ }
+#endif /* _KERNEL */
+ SPL_X(s);
+
+ return 0;
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_auth.h b/sys/contrib/ipfilter/netinet/ip_auth.h
new file mode 100644
index 0000000..36c4bac
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_auth.h
@@ -0,0 +1,71 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1997-2001 by Darren Reed & Guido Van Rooij.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $FreeBSD$
+ * Id: ip_auth.h,v 2.16.2.2 2006/03/16 06:45:49 darrenr Exp $
+ *
+ */
+#ifndef __IP_AUTH_H__
+#define __IP_AUTH_H__
+
+#define FR_NUMAUTH 32
+
+typedef struct frauth {
+ int fra_age;
+ int fra_len;
+ int fra_index;
+ u_32_t fra_pass;
+ fr_info_t fra_info;
+ char *fra_buf;
+#ifdef MENTAT
+ queue_t *fra_q;
+ mb_t *fra_m;
+#endif
+} frauth_t;
+
+typedef struct frauthent {
+ struct frentry fae_fr;
+ struct frauthent *fae_next;
+ struct frauthent **fae_pnext;
+ u_long fae_age;
+ int fae_ref;
+} frauthent_t;
+
+typedef struct fr_authstat {
+ U_QUAD_T fas_hits;
+ U_QUAD_T fas_miss;
+ u_long fas_nospace;
+ u_long fas_added;
+ u_long fas_sendfail;
+ u_long fas_sendok;
+ u_long fas_queok;
+ u_long fas_quefail;
+ u_long fas_expire;
+ frauthent_t *fas_faelist;
+} fr_authstat_t;
+
+
+extern frentry_t *ipauth;
+extern struct fr_authstat fr_authstats;
+extern int fr_defaultauthage;
+extern int fr_authstart;
+extern int fr_authend;
+extern int fr_authsize;
+extern int fr_authused;
+extern int fr_auth_lock;
+extern frentry_t *fr_checkauth __P((fr_info_t *, u_32_t *));
+extern void fr_authexpire __P((void));
+extern int fr_authinit __P((void));
+extern void fr_authunload __P((void));
+extern int fr_authflush __P((void));
+extern mb_t **fr_authpkts;
+extern int fr_newauth __P((mb_t *, fr_info_t *));
+extern int fr_preauthcmd __P((ioctlcmd_t, frentry_t *, frentry_t **));
+extern int fr_auth_ioctl __P((caddr_t, ioctlcmd_t, int, int, void *));
+extern int fr_auth_waiting __P((void));
+
+#endif /* __IP_AUTH_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_compat.h b/sys/contrib/ipfilter/netinet/ip_compat.h
new file mode 100644
index 0000000..93ac208
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_compat.h
@@ -0,0 +1,2435 @@
+/*
+ * Copyright (C) 1993-2001, 2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * @(#)ip_compat.h 1.8 1/14/96
+ * $FreeBSD$
+ * Id: ip_compat.h,v 2.142.2.36 2006/03/26 05:50:29 darrenr Exp $
+ */
+
+#ifndef __IP_COMPAT_H__
+#define __IP_COMPAT_H__
+
+#ifndef __P
+# ifdef __STDC__
+# define __P(x) x
+# else
+# define __P(x) ()
+# endif
+#endif
+#ifndef __STDC__
+# undef const
+# define const
+#endif
+
+#if defined(_KERNEL) || defined(KERNEL) || defined(__KERNEL__)
+# undef KERNEL
+# undef _KERNEL
+# undef __KERNEL__
+# define KERNEL
+# define _KERNEL
+# define __KERNEL__
+#endif
+
+#ifndef SOLARIS
+#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+#endif
+#if defined(SOLARIS2) && SOLARIS2 >= 8
+# ifndef USE_INET6
+# define USE_INET6
+# endif
+#endif
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 400000) && \
+ !defined(_KERNEL) && !defined(USE_INET6) && !defined(NOINET6)
+# define USE_INET6
+#endif
+#if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 105000000) && \
+ !defined(_KERNEL) && !defined(USE_INET6)
+# define USE_INET6
+# define IPFILTER_M_IPFILTER
+#endif
+#if defined(OpenBSD) && (OpenBSD >= 200206) && \
+ !defined(_KERNEL) && !defined(USE_INET6)
+# define USE_INET6
+#endif
+#if defined(__osf__)
+# define USE_INET6
+#endif
+#if defined(linux) && (!defined(_KERNEL) || defined(CONFIG_IPV6))
+# define USE_INET6
+#endif
+#if defined(HPUXREV) && (HPUXREV >= 1111)
+# define USE_INET6
+#endif
+
+#if defined(BSD) && (BSD < 199103) && defined(__osf__)
+# undef BSD
+# define BSD 199103
+#endif
+
+#if defined(__SVR4) || defined(__svr4__) || defined(__sgi)
+# define index strchr
+# if !defined(_KERNEL)
+# define bzero(a,b) memset(a,0,b)
+# define bcmp memcmp
+# define bcopy(a,b,c) memmove(b,a,c)
+# endif
+#endif
+
+#ifndef LIFNAMSIZ
+# ifdef IF_NAMESIZE
+# define LIFNAMSIZ IF_NAMESIZE
+# else
+# ifdef IFNAMSIZ
+# define LIFNAMSIZ IFNAMSIZ
+# else
+# define LIFNAMSIZ 16
+# endif
+# endif
+#endif
+
+#if defined(__sgi) || defined(bsdi) || defined(__hpux) || defined(hpux)
+struct ether_addr {
+ u_char ether_addr_octet[6];
+};
+#endif
+
+#if defined(__sgi) && !defined(IPFILTER_LKM)
+# ifdef __STDC__
+# define IPL_EXTERN(ep) ipfilter##ep
+# else
+# define IPL_EXTERN(ep) ipfilter/**/ep
+# endif
+#else
+# ifdef __STDC__
+# define IPL_EXTERN(ep) ipl##ep
+# else
+# define IPL_EXTERN(ep) ipl/**/ep
+# endif
+#endif
+
+/*
+ * This is a workaround for <sys/uio.h> troubles on FreeBSD and OpenBSD.
+ */
+#ifndef linux
+# ifndef _KERNEL
+# define ADD_KERNEL
+# define _KERNEL
+# define KERNEL
+# endif
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# ifdef ADD_KERNEL
+# undef _KERNEL
+# undef KERNEL
+# endif
+#endif
+
+
+/* ----------------------------------------------------------------------- */
+/* S O L A R I S */
+/* ----------------------------------------------------------------------- */
+#if SOLARIS
+# define MENTAT 1
+# include <sys/cmn_err.h>
+# include <sys/isa_defs.h>
+# include <sys/stream.h>
+# include <sys/ioccom.h>
+# include <sys/sysmacros.h>
+# include <sys/kmem.h>
+# if defined(SOLARIS2) && SOLARIS2 >= 10
+# include <sys/procset.h>
+# include <sys/proc.h>
+# include <sys/devops.h>
+# include <sys/ddi_impldefs.h>
+# endif
+/*
+ * because Solaris 2 defines these in two places :-/
+ */
+# ifndef KERNEL
+# define _KERNEL
+# undef RES_INIT
+# endif /* _KERNEL */
+
+# if defined(SOLARIS2) && SOLARIS2 >= 8
+# include <netinet/ip6.h>
+# include <netinet/icmp6.h>
+# endif
+
+# include <inet/common.h>
+/* These 5 are defined in <inet/ip.h> and <netinet/ip.h> */
+# undef IPOPT_EOL
+# undef IPOPT_NOP
+# undef IPOPT_LSRR
+# undef IPOPT_RR
+# undef IPOPT_SSRR
+# ifdef i386
+# define _SYS_PROMIF_H
+# endif
+# include <inet/ip.h>
+# undef COPYOUT
+# include <inet/ip_ire.h>
+# ifndef KERNEL
+# undef _KERNEL
+# endif
+# if defined(SOLARIS2) && SOLARIS2 >= 8
+# define SNPRINTF snprintf
+
+# include <inet/ip_if.h>
+# define ipif_local_addr ipif_lcl_addr
+/* Only defined in private include file */
+# ifndef V4_PART_OF_V6
+# define V4_PART_OF_V6(v6) v6.s6_addr32[3]
+# endif
+struct ip6_ext {
+ u_char ip6e_nxt;
+ u_char ip6e_len;
+};
+# endif /* SOLARIS2 >= 8 */
+
+# if defined(SOLARIS2) && SOLARIS2 >= 6
+# include <sys/atomic.h>
+typedef uint32_t u_32_t;
+# else
+typedef unsigned int u_32_t;
+# endif
+# define U_32_T 1
+
+# ifdef _KERNEL
+# define KRWLOCK_T krwlock_t
+# define KMUTEX_T kmutex_t
+# include "qif.h"
+# include "pfil.h"
+# if defined(SOLARIS2) && SOLARIS2 >= 6
+# if SOLARIS2 == 6
+# define ATOMIC_INCL(x) atomic_add_long((uint32_t*)&(x), 1)
+# define ATOMIC_DECL(x) atomic_add_long((uint32_t*)&(x), -1)
+# else
+# define ATOMIC_INCL(x) atomic_add_long(&(x), 1)
+# define ATOMIC_DECL(x) atomic_add_long(&(x), -1)
+# endif /* SOLARIS2 == 6 */
+# define ATOMIC_INC64(x) atomic_add_64((uint64_t*)&(x), 1)
+# define ATOMIC_INC32(x) atomic_add_32((uint32_t*)&(x), 1)
+# define ATOMIC_INC16(x) atomic_add_16((uint16_t*)&(x), 1)
+# define ATOMIC_DEC64(x) atomic_add_64((uint64_t*)&(x), -1)
+# define ATOMIC_DEC32(x) atomic_add_32((uint32_t*)&(x), -1)
+# define ATOMIC_DEC16(x) atomic_add_16((uint16_t*)&(x), -1)
+# else
+# define ATOMIC_INC(x) { mutex_enter(&ipf_rw); (x)++; \
+ mutex_exit(&ipf_rw); }
+# define ATOMIC_DEC(x) { mutex_enter(&ipf_rw); (x)--; \
+ mutex_exit(&ipf_rw); }
+# endif /* SOLARIS2 >= 6 */
+# define USE_MUTEXES
+# define MUTEX_ENTER(x) mutex_enter(&(x)->ipf_lk)
+# define READ_ENTER(x) rw_enter(&(x)->ipf_lk, RW_READER)
+# define WRITE_ENTER(x) rw_enter(&(x)->ipf_lk, RW_WRITER)
+# define MUTEX_DOWNGRADE(x) rw_downgrade(&(x)->ipf_lk)
+# define RWLOCK_INIT(x, y) rw_init(&(x)->ipf_lk, (y), \
+ RW_DRIVER, NULL)
+# define RWLOCK_EXIT(x) rw_exit(&(x)->ipf_lk)
+# define RW_DESTROY(x) rw_destroy(&(x)->ipf_lk)
+# define MUTEX_INIT(x, y) mutex_init(&(x)->ipf_lk, (y), \
+ MUTEX_DRIVER, NULL)
+# define MUTEX_DESTROY(x) mutex_destroy(&(x)->ipf_lk)
+# define MUTEX_NUKE(x) bzero((x), sizeof(*(x)))
+# define MUTEX_EXIT(x) mutex_exit(&(x)->ipf_lk)
+# define COPYIN(a,b,c) copyin((caddr_t)(a), (caddr_t)(b), (c))
+# define COPYOUT(a,b,c) copyout((caddr_t)(a), (caddr_t)(b), (c))
+# define BCOPYIN(a,b,c) copyin((caddr_t)(a), (caddr_t)(b), (c))
+# define BCOPYOUT(a,b,c) copyout((caddr_t)(a), (caddr_t)(b), (c))
+# define UIOMOVE(a,b,c,d) uiomove((caddr_t)a,b,c,d)
+# define KFREE(x) kmem_free((char *)(x), sizeof(*(x)))
+# define KFREES(x,s) kmem_free((char *)(x), (s))
+# define SPL_SCHED(x) ;
+# define SPL_NET(x) ;
+# define SPL_IMP(x) ;
+# undef SPL_X
+# define SPL_X(x) ;
+# ifdef sparc
+# define ntohs(x) (x)
+# define ntohl(x) (x)
+# define htons(x) (x)
+# define htonl(x) (x)
+# endif /* sparc */
+# define KMALLOC(a,b) (a) = (b)kmem_alloc(sizeof(*(a)), KM_NOSLEEP)
+# define KMALLOCS(a,b,c) (a) = (b)kmem_alloc((c), KM_NOSLEEP)
+# define GET_MINOR(x) getminor(x)
+extern void *get_unit __P((char *, int));
+# define GETIFP(n, v) get_unit(n, v)
+# define IFNAME(x) ((qif_t *)x)->qf_name
+# define COPYIFNAME(x, b) \
+ (void) strncpy(b, ((qif_t *)x)->qf_name, \
+ LIFNAMSIZ)
+# define GETKTIME(x) uniqtime((struct timeval *)x)
+# define MSGDSIZE(x) msgdsize(x)
+# define M_LEN(x) ((x)->b_wptr - (x)->b_rptr)
+# define M_DUPLICATE(x) dupmsg((x))
+# define MTOD(m,t) ((t)((m)->b_rptr))
+# define MTYPE(m) ((m)->b_datap->db_type)
+# define FREE_MB_T(m) freemsg(m)
+# define m_next b_cont
+# define CACHE_HASH(x) (((qpktinfo_t *)(x)->fin_qpi)->qpi_num & 7)
+# define IPF_PANIC(x,y) if (x) { printf y; cmn_err(CE_PANIC, "ipf_panic"); }
+typedef mblk_t mb_t;
+# endif /* _KERNEL */
+
+# if defined(SOLARIS2) && (SOLARIS2 >= 7)
+# ifdef lint
+# define ALIGN32(ptr) (ptr ? 0L : 0L)
+# define ALIGN16(ptr) (ptr ? 0L : 0L)
+# else
+# define ALIGN32(ptr) (ptr)
+# define ALIGN16(ptr) (ptr)
+# endif
+# endif
+
+# if defined(SOLARIS2) && SOLARIS2 < 6
+typedef struct uio uio_t;
+# endif
+typedef int ioctlcmd_t;
+
+# define OS_RECOGNISED 1
+
+#endif /* SOLARIS */
+
+/* ----------------------------------------------------------------------- */
+/* H P U X */
+/* ----------------------------------------------------------------------- */
+#ifdef __hpux
+# define MENTAT 1
+# include <sys/sysmacros.h>
+# include <sys/spinlock.h>
+# include <sys/lock.h>
+# include <sys/stream.h>
+# ifdef USE_INET6
+# include <netinet/if_ether.h>
+# include <netinet/ip6.h>
+# include <netinet/icmp6.h>
+typedef struct ip6_hdr ip6_t;
+# endif
+
+# ifdef _KERNEL
+# define SNPRINTF sprintf
+# if (HPUXREV >= 1111)
+# define IPL_SELECT
+# ifdef IPL_SELECT
+# include <machine/sys/user.h>
+# include <sys/kthread_iface.h>
+# define READ_COLLISION 0x01
+
+typedef struct iplog_select_s {
+ kthread_t *read_waiter;
+ int state;
+} iplog_select_t;
+# endif
+# endif
+
+# define GETKTIME(x) uniqtime((struct timeval *)x)
+
+# if HPUXREV == 1111
+# include "kern_svcs.h"
+# else
+# include <sys/kern_svcs.h>
+# endif
+# undef ti_flags
+# undef TCP_NODELAY
+# undef TCP_MAXSEG
+# include <sys/reg.h>
+# include "../netinet/ip_info.h"
+/*
+ * According to /usr/include/sys/spinlock.h on HP-UX 11.00, these functions
+ * are available. Attempting to use them actually results in unresolved
+ * symbols when it comes time to load the module.
+ * This has been fixed! Yipee!
+ */
+# if 1
+# ifdef __LP64__
+# define ATOMIC_INCL(x) lock_and_incr_int64(&ipf_rw.ipf_lk, &(x), 1)
+# define ATOMIC_DECL(x) lock_and_incr_int64(&ipf_rw.ipf_lk, &(x), -1)
+# else
+# define ATOMIC_INCL(x) lock_and_incr_int32(&ipf_rw.ipf_lk, &(x), 1)
+# define ATOMIC_DECL(x) lock_and_incr_int32(&ipf_rw.ipf_lk, &(x), -1)
+# endif
+# define ATOMIC_INC64(x) lock_and_incr_int64(&ipf_rw.ipf_lk, &(x), 1)
+# define ATOMIC_INC32(x) lock_and_incr_int32(&ipf_rw.ipf_lk, &(x), 1)
+# define ATOMIC_INC16(x) lock_and_incr_int16(&ipf_rw.ipf_lk, &(x), 1)
+# define ATOMIC_DEC64(x) lock_and_incr_int64(&ipf_rw.ipf_lk, &(x), -1)
+# define ATOMIC_DEC32(x) lock_and_incr_int32(&ipf_rw.ipf_lk, &(x), -1)
+# define ATOMIC_DEC16(x) lock_and_incr_int16(&ipf_rw.ipf_lk, &(x), -1)
+# else /* 0 */
+# define ATOMIC_INC64(x) { MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_DEC64(x) { MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_INC32(x) { MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_DEC32(x) { MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_INCL(x) { MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_DECL(x) { MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_INC(x) { MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_DEC(x) { MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw); }
+# endif
+# define ip_cksum ip_csuma
+# define memcpy(a,b,c) bcopy((caddr_t)b, (caddr_t)a, c)
+# define USE_MUTEXES
+# define MUTEX_INIT(x, y) initlock(&(x)->ipf_lk, 0, 0, (y))
+# define MUTEX_ENTER(x) spinlock(&(x)->ipf_lk)
+# define MUTEX_EXIT(x) spinunlock(&(x)->ipf_lk);
+# define MUTEX_DESTROY(x)
+# define MUTEX_NUKE(x) bzero((char *)(x), sizeof(*(x)))
+# define KMUTEX_T lock_t
+# define kmutex_t lock_t /* for pfil.h */
+# define krwlock_t lock_t /* for pfil.h */
+/*
+ * The read-write lock implementation in HP-UX 11.0 is crippled - it can
+ * only be used by threads working in a user context!
+ * This has been fixed! Yipee! (Or at least it does in 11.00, not 11.11..)
+ */
+# if HPUXREV < 1111
+# define MUTEX_DOWNGRADE(x) lock_write_to_read(x)
+# define KRWLOCK_T struct rw_lock
+# define READ_ENTER(x) lock_read(&(x)->ipf_lk)
+# define WRITE_ENTER(x) lock_write(&(x)->ipf_lk)
+# if HPUXREV >= 1111
+# define RWLOCK_INIT(x, y) rwlock_init4(&(x)->ipf_lk, 0, RWLCK_CANSLEEP, 0, y)
+# else
+# define RWLOCK_INIT(x, y) lock_init3(&(x)->ipf_lk, 0, 1, 0, 0, y)
+# endif
+# define RWLOCK_EXIT(x) lock_done(&(x)->ipf_lk)
+# else
+# define KRWLOCK_T lock_t
+# define KMUTEX_T lock_t
+# define READ_ENTER(x) MUTEX_ENTER(x)
+# define WRITE_ENTER(x) MUTEX_ENTER(x)
+# define MUTEX_DOWNGRADE(x)
+# define RWLOCK_INIT(x, y) initlock(&(x)->ipf_lk, 0, 0, y)
+# define RWLOCK_EXIT(x) MUTEX_EXIT(x)
+# endif
+# define RW_DESTROY(x)
+# define COPYIN(a,b,c) copyin((caddr_t)(a), (caddr_t)(b), (c))
+# define COPYOUT(a,b,c) copyout((caddr_t)(a), (caddr_t)(b), (c))
+# define SPL_SCHED(x) ;
+# define SPL_NET(x) ;
+# define SPL_IMP(x) ;
+# undef SPL_X
+# define SPL_X(x) ;
+extern void *get_unit __P((char *, int));
+# define GETIFP(n, v) get_unit(n, v)
+# define IFNAME(x, b) ((ill_t *)x)->ill_name
+# define COPYIFNAME(x, b) \
+ (void) strncpy(b, ((qif_t *)x)->qf_name, \
+ LIFNAMSIZ)
+# define UIOMOVE(a,b,c,d) uiomove((caddr_t)a,b,c,d)
+# define SLEEP(id, n) { lock_t *_l = get_sleep_lock((caddr_t)id); \
+ sleep(id, PZERO+1); \
+ spinunlock(_l); \
+ }
+# define WAKEUP(id,x) { lock_t *_l = get_sleep_lock((caddr_t)id); \
+ wakeup(id + x); \
+ spinunlock(_l); \
+ }
+# define POLLWAKEUP(x) ;
+# define KMALLOC(a, b) MALLOC((a), b, sizeof(*(a)), M_IOSYS, M_NOWAIT)
+# define KMALLOCS(a, b, c) MALLOC((a), b, (c), M_IOSYS, M_NOWAIT)
+# define KFREE(x) kmem_free((char *)(x), sizeof(*(x)))
+# define KFREES(x,s) kmem_free((char *)(x), (s))
+# define MSGDSIZE(x) msgdsize(x)
+# define M_LEN(x) ((x)->b_wptr - (x)->b_rptr)
+# define M_DUPLICATE(x) dupmsg((x))
+# define MTOD(m,t) ((t)((m)->b_rptr))
+# define MTYPE(m) ((m)->b_datap->db_type)
+# define FREE_MB_T(m) freemsg(m)
+# define m_next b_cont
+# define IPF_PANIC(x,y) if (x) { printf y; panic("ipf_panic"); }
+typedef mblk_t mb_t;
+
+# define CACHE_HASH(x) (((qpktinfo_t *)(x)->fin_qpi)->qpi_num & 7)
+
+# include "qif.h"
+# include "pfil.h"
+
+# else /* _KERNEL */
+
+typedef unsigned char uchar_t;
+
+# ifndef _SYS_STREAM_INCLUDED
+typedef char * mblk_t;
+typedef void * queue_t;
+typedef u_long ulong;
+# endif
+# include <netinet/ip_info.h>
+
+# endif /* _KERNEL */
+
+# ifdef lint
+# define ALIGN32(ptr) (ptr ? 0L : 0L)
+# define ALIGN16(ptr) (ptr ? 0L : 0L)
+# else
+# define ALIGN32(ptr) (ptr)
+# define ALIGN16(ptr) (ptr)
+# endif
+
+typedef struct uio uio_t;
+typedef int ioctlcmd_t;
+typedef int minor_t;
+typedef unsigned int u_32_t;
+# define U_32_T 1
+
+# define OS_RECOGNISED 1
+
+#endif /* __hpux */
+
+/* ----------------------------------------------------------------------- */
+/* I R I X */
+/* ----------------------------------------------------------------------- */
+#ifdef __sgi
+# undef MENTAT
+# if IRIX < 60500
+typedef struct uio uio_t;
+# endif
+typedef int ioctlcmd_t;
+typedef u_int32_t u_32_t;
+# define U_32_T 1
+
+# ifdef INET6
+# define USE_INET6
+# endif
+
+# define hz HZ
+# include <sys/ksynch.h>
+# define IPF_LOCK_PL plhi
+# include <sys/sema.h>
+# undef kmutex_t
+typedef struct {
+ lock_t *l;
+ int pl;
+} kmutex_t;
+
+# ifdef MUTEX_INIT
+# define KMUTEX_T mutex_t
+# else
+# define KMUTEX_T kmutex_t
+# define KRWLOCK_T kmutex_t
+# endif
+
+# ifdef _KERNEL
+# define ATOMIC_INC(x) { MUTEX_ENTER(&ipf_rw); \
+ (x)++; MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_DEC(x) { MUTEX_ENTER(&ipf_rw); \
+ (x)--; MUTEX_EXIT(&ipf_rw); }
+# define USE_MUTEXES
+# ifdef MUTEX_INIT
+# include <sys/atomic_ops.h>
+# define ATOMIC_INCL(x) atomicAddUlong(&(x), 1)
+# define ATOMIC_INC64(x) atomicAddUint64(&(x), 1)
+# define ATOMIC_INC32(x) atomicAddUint(&(x), 1)
+# define ATOMIC_INC16 ATOMIC_INC
+# define ATOMIC_DECL(x) atomicAddUlong(&(x), -1)
+# define ATOMIC_DEC64(x) atomicAddUint64(&(x), -1)
+# define ATOMIC_DEC32(x) atomicAddUint(&(x), -1)
+# define ATOMIC_DEC16 ATOMIC_DEC
+# undef MUTEX_INIT
+# define MUTEX_INIT(x, y) mutex_init(&(x)->ipf_lk, \
+ MUTEX_DEFAULT, y)
+# undef MUTEX_ENTER
+# define MUTEX_ENTER(x) mutex_lock(&(x)->ipf_lk, 0)
+# undef MUTEX_EXIT
+# define MUTEX_EXIT(x) mutex_unlock(&(x)->ipf_lk)
+# undef MUTEX_DESTROY
+# define MUTEX_DESTROY(x) mutex_destroy(&(x)->ipf_lk)
+# define MUTEX_DOWNGRADE(x) mrdemote(&(x)->ipf_lk)
+# define KRWLOCK_T mrlock_t
+# define RWLOCK_INIT(x, y) mrinit(&(x)->ipf_lk, y)
+# undef RW_DESTROY
+# define RW_DESTROY(x) mrfree(&(x)->ipf_lk)
+# define READ_ENTER(x) RW_RDLOCK(&(x)->ipf_lk)
+# define WRITE_ENTER(x) RW_WRLOCK(&(x)->ipf_lk)
+# define RWLOCK_EXIT(x) RW_UNLOCK(&(x)->ipf_lk)
+# else
+# define READ_ENTER(x) MUTEX_ENTER(&(x)->ipf_lk)
+# define WRITE_ENTER(x) MUTEX_ENTER(&(x)->ipf_lk)
+# define MUTEX_DOWNGRADE(x) ;
+# define RWLOCK_EXIT(x) MUTEX_EXIT(&(x)->ipf_lk)
+# define MUTEX_EXIT(x) UNLOCK((x)->ipf_lk.l, (x)->ipf_lk.pl);
+# define MUTEX_INIT(x,y) (x)->ipf_lk.l = LOCK_ALLOC((uchar_t)-1, IPF_LOCK_PL, (lkinfo_t *)-1, KM_NOSLEEP)
+# define MUTEX_DESTROY(x) LOCK_DEALLOC((x)->ipf_lk.l)
+# define MUTEX_ENTER(x) (x)->ipf_lk.pl = LOCK((x)->ipf_lk.l, \
+ IPF_LOCK_PL);
+# endif
+# define MUTEX_NUKE(x) bzero((x), sizeof(*(x)))
+# define FREE_MB_T(m) m_freem(m)
+# define MTOD(m,t) mtod(m,t)
+# define COPYIN(a,b,c) (bcopy((caddr_t)(a), (caddr_t)(b), (c)), 0)
+# define COPYOUT(a,b,c) (bcopy((caddr_t)(a), (caddr_t)(b), (c)), 0)
+# define UIOMOVE(a,b,c,d) uiomove((caddr_t)a,b,c,d)
+# define SLEEP(id, n) sleep((id), PZERO+1)
+# define WAKEUP(id,x) wakeup(id+x)
+# define POLLWAKEUP(x) ;
+# define KFREE(x) kmem_free((char *)(x), sizeof(*(x)))
+# define KFREES(x,s) kmem_free((char *)(x), (s))
+# define GETIFP(n,v) ifunit(n)
+# include <sys/kmem.h>
+# include <sys/ddi.h>
+# define KMALLOC(a,b) (a) = (b)kmem_alloc(sizeof(*(a)), KM_NOSLEEP)
+# define KMALLOCS(a,b,c) (a) = (b)kmem_alloc((c), KM_NOSLEEP)
+# define GET_MINOR(x) getminor(x)
+# define USE_SPL 1
+# define SPL_IMP(x) (x) = splimp()
+# define SPL_NET(x) (x) = splnet()
+# define SPL_SCHED(x) (x) = splsched()
+# define SPL_X(x) (void) splx(x)
+extern void m_copydata __P((struct mbuf *, int, int, caddr_t));
+extern void m_copyback __P((struct mbuf *, int, int, caddr_t));
+# define MSGDSIZE(x) mbufchainlen(x)
+# define M_LEN(x) (x)->m_len
+# define M_DUPLICATE(x) m_copy((x), 0, M_COPYALL)
+# define GETKTIME(x) microtime((struct timeval *)x)
+# define CACHE_HASH(x) ((IFNAME(fin->fin_ifp)[0] + \
+ ((struct ifnet *)fin->fin_ifp)->if_unit) & 7)
+# define IPF_PANIC(x,y) if (x) { printf y; panic("ipf_panic"); }
+typedef struct mbuf mb_t;
+# else
+# undef RW_DESTROY
+# undef MUTEX_INIT
+# undef MUTEX_DESTROY
+# endif /* _KERNEL */
+
+# define OS_RECOGNISED 1
+
+#endif /* __sgi */
+
+/* ----------------------------------------------------------------------- */
+/* T R U 6 4 */
+/* ----------------------------------------------------------------------- */
+#ifdef __osf__
+# undef MENTAT
+
+# include <kern/lock.h>
+# include <sys/sysmacros.h>
+
+# ifdef _KERNEL
+# define KMUTEX_T simple_lock_data_t
+# define KRWLOCK_T lock_data_t
+# include <net/net_globals.h>
+# define USE_MUTEXES
+# define READ_ENTER(x) lock_read(&(x)->ipf_lk)
+# define WRITE_ENTER(x) lock_write(&(x)->ipf_lk)
+# define MUTEX_DOWNGRADE(x) lock_write_to_read(&(x)->ipf_lk)
+# define RWLOCK_INIT(x, y) lock_init(&(x)->ipf_lk, TRUE)
+# define RWLOCK_EXIT(x) lock_done(&(x)->ipf_lk)
+# define RW_DESTROY(x) lock_terminate(&(x)->ipf_lk)
+# define MUTEX_ENTER(x) simple_lock(&(x)->ipf_lk)
+# define MUTEX_INIT(x, y) simple_lock_init(&(x)->ipf_lk)
+# define MUTEX_DESTROY(x) simple_lock_terminate(&(x)->ipf_lk)
+# define MUTEX_EXIT(x) simple_unlock(&(x)->ipf_lk)
+# define MUTEX_NUKE(x) bzero(x, sizeof(*(x)))
+# define ATOMIC_INC64(x) atomic_incq((uint64_t*)&(x))
+# define ATOMIC_DEC64(x) atomic_decq((uint64_t*)&(x))
+# define ATOMIC_INC32(x) atomic_incl((uint32_t*)&(x))
+# define ATOMIC_DEC32(x) atomic_decl((uint32_t*)&(x))
+# define ATOMIC_INC16(x) { simple_lock(&ipf_rw); (x)++; \
+ simple_unlock(&ipf_rw); }
+# define ATOMIC_DEC16(x) { simple_lock(&ipf_rw); (x)--; \
+ simple_unlock(&ipf_rw); }
+# define ATOMIC_INCL(x) atomic_incl((uint32_t*)&(x))
+# define ATOMIC_DECL(x) atomic_decl((uint32_t*)&(x))
+# define ATOMIC_INC(x) { simple_lock(&ipf_rw); (x)++; \
+ simple_unlock(&ipf_rw); }
+# define ATOMIC_DEC(x) { simple_lock(&ipf_rw); (x)--; \
+ simple_unlock(&ipf_rw); }
+# define SPL_SCHED(x) ;
+# define SPL_NET(x) ;
+# define SPL_IMP(x) ;
+# undef SPL_X
+# define SPL_X(x) ;
+# define UIOMOVE(a,b,c,d) uiomove((caddr_t)a, b, d)
+# define FREE_MB_T(m) m_freem(m)
+# define MTOD(m,t) mtod(m,t)
+# define GETIFP(n, v) ifunit(n)
+# define GET_MINOR getminor
+# define WAKEUP(id,x) wakeup(id + x)
+# define POLLWAKEUP(x) ;
+# define COPYIN(a,b,c) copyin((caddr_t)(a), (caddr_t)(b), (c))
+# define COPYOUT(a,b,c) copyout((caddr_t)(a), (caddr_t)(b), (c))
+# define KMALLOC(a, b) MALLOC((a), b, sizeof(*(a)), M_PFILT, M_NOWAIT)
+# define KMALLOCS(a, b, c) MALLOC((a), b, (c), M_PFILT, \
+ ((c) > 4096) ? M_WAITOK : M_NOWAIT)
+# define KFREE(x) FREE((x), M_PFILT)
+# define KFREES(x,s) FREE((x), M_PFILT)
+# define MSGDSIZE(x) mbufchainlen(x)
+# define M_LEN(x) (x)->m_len
+# define M_DUPLICATE(x) m_copy((x), 0, M_COPYALL)
+# define GETKTIME(x) microtime((struct timeval *)x)
+# define CACHE_HASH(x) ((IFNAME(fin->fin_ifp)[0] + \
+ ((struct ifnet *)fin->fin_ifp)->if_unit) & 7)
+# define IPF_PANIC(x,y) if (x) { printf y; panic("ipf_panic"); }
+typedef struct mbuf mb_t;
+# endif /* _KERNEL */
+
+# if (defined(_KERNEL) || defined(_NO_BITFIELDS) || (__STDC__ == 1))
+# define IP_V(x) ((x)->ip_vhl >> 4)
+# define IP_HL(x) ((x)->ip_vhl & 0xf)
+# define IP_V_A(x,y) (x)->ip_vhl |= (((y) << 4) & 0xf0)
+# define IP_HL_A(x,y) (x)->ip_vhl |= ((y) & 0xf)
+# define TCP_X2(x) ((x)->th_xoff & 0xf)
+# define TCP_X2_A(x,y) (x)->th_xoff |= ((y) & 0xf)
+# define TCP_OFF(x) ((x)->th_xoff >> 4)
+# define TCP_OFF_A(x,y) (x)->th_xoff |= (((y) << 4) & 0xf0)
+# endif
+
+/*
+ * These are from's Solaris' #defines for little endian.
+ */
+#define IP6F_MORE_FRAG 0x0100
+#define IP6F_RESERVED_MASK 0x0600
+#define IP6F_OFF_MASK 0xf8ff
+
+struct ip6_ext {
+ u_char ip6e_nxt;
+ u_char ip6e_len;
+};
+
+typedef int ioctlcmd_t;
+/*
+ * Really, any arch where sizeof(long) != sizeof(int).
+ */
+typedef unsigned int u_32_t;
+# define U_32_T 1
+
+# define OS_RECOGNISED 1
+#endif /* __osf__ */
+
+/* ----------------------------------------------------------------------- */
+/* N E T B S D */
+/* ----------------------------------------------------------------------- */
+#ifdef __NetBSD__
+# if (NetBSD >= 199905) && !defined(IPFILTER_LKM) && defined(_KERNEL)
+# include "opt_ipfilter.h"
+# endif
+# if defined(_KERNEL)
+# include <sys/systm.h>
+# else
+# include <stddef.h>
+# endif
+# if defined(_KERNEL) && !defined(IPFILTER_LKM)
+# include "bpfilter.h"
+# if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 104110000)
+# include "opt_inet.h"
+# endif
+# ifdef INET6
+# define USE_INET6
+# endif
+# if (__NetBSD_Version__ >= 105000000)
+# define HAVE_M_PULLDOWN 1
+# endif
+# endif
+
+# if (__NetBSD_Version__ >= 499000000)
+typedef char * caddr_t;
+# endif
+
+# ifdef _KERNEL
+# if (__NetBSD_Version__ >= 399001400)
+# define KMALLOCS(a, b, c) (a) = (b)malloc((c), _M_IPF, M_NOWAIT)
+# endif
+# define MSGDSIZE(x) mbufchainlen(x)
+# define M_LEN(x) (x)->m_len
+# define M_DUPLICATE(x) m_copy((x), 0, M_COPYALL)
+# define GETKTIME(x) microtime((struct timeval *)x)
+# define IPF_PANIC(x,y) if (x) { printf y; panic("ipf_panic"); }
+# define COPYIN(a,b,c) copyin((caddr_t)(a), (caddr_t)(b), (c))
+# define COPYOUT(a,b,c) copyout((caddr_t)(a), (caddr_t)(b), (c))
+typedef struct mbuf mb_t;
+# endif /* _KERNEL */
+# if (NetBSD <= 1991011) && (NetBSD >= 199606)
+# define IFNAME(x) ((struct ifnet *)x)->if_xname
+# define COPYIFNAME(x, b) \
+ (void) strncpy(b, \
+ ((struct ifnet *)x)->if_xname, \
+ LIFNAMSIZ)
+# define CACHE_HASH(x) ((((struct ifnet *)fin->fin_ifp)->if_index)&7)
+# else
+# define CACHE_HASH(x) ((IFNAME(fin->fin_ifp)[0] + \
+ ((struct ifnet *)fin->fin_ifp)->if_unit) & 7)
+# endif
+typedef struct uio uio_t;
+typedef u_long ioctlcmd_t;
+typedef int minor_t;
+typedef u_int32_t u_32_t;
+# define U_32_T 1
+
+# define OS_RECOGNISED 1
+#endif /* __NetBSD__ */
+
+
+/* ----------------------------------------------------------------------- */
+/* F R E E B S D */
+/* ----------------------------------------------------------------------- */
+#ifdef __FreeBSD__
+# if defined(_KERNEL)
+# if (__FreeBSD_version >= 500000)
+# include "opt_bpf.h"
+# else
+# include "bpf.h"
+# endif
+# if defined(__FreeBSD_version) && (__FreeBSD_version >= 400000)
+# include "opt_inet6.h"
+# endif
+# if defined(INET6) && !defined(USE_INET6)
+# define USE_INET6
+# endif
+# endif
+
+# if defined(_KERNEL)
+# if (__FreeBSD_version >= 400000)
+/*
+ * When #define'd, the 5.2.1 kernel panics when used with the ftp proxy.
+ * There may be other, safe, kernels but this is not extensively tested yet.
+ */
+# define HAVE_M_PULLDOWN
+# endif
+# if !defined(IPFILTER_LKM) && (__FreeBSD_version >= 300000)
+# include "opt_ipfilter.h"
+# endif
+# define COPYIN(a,b,c) copyin((caddr_t)(a), (caddr_t)(b), (c))
+# define COPYOUT(a,b,c) copyout((caddr_t)(a), (caddr_t)(b), (c))
+
+# if (__FreeBSD_version >= 500043)
+# define NETBSD_PF
+# endif
+# endif /* _KERNEL */
+
+# if (__FreeBSD_version >= 500043)
+# include <sys/mutex.h>
+# include <sys/sx.h>
+/*
+ * Whilst the sx(9) locks on FreeBSD have the right semantics and interface
+ * for what we want to use them for, despite testing showing they work -
+ * with a WITNESS kernel, it generates LOR messages.
+ */
+# define KMUTEX_T struct mtx
+# if (__FreeBSD_version < 700000)
+# define KRWLOCK_T struct mtx
+# else
+# define KRWLOCK_T struct sx
+# endif
+# endif
+
+# if (__FreeBSD_version >= 501113)
+# include <net/if_var.h>
+# define IFNAME(x) ((struct ifnet *)x)->if_xname
+# define COPYIFNAME(x, b) \
+ (void) strncpy(b, \
+ ((struct ifnet *)x)->if_xname, \
+ LIFNAMSIZ)
+# endif
+# if (__FreeBSD_version >= 500043)
+# define CACHE_HASH(x) ((((struct ifnet *)fin->fin_ifp)->if_index) & 7)
+# else
+# define CACHE_HASH(x) ((IFNAME(fin->fin_ifp)[0] + \
+ ((struct ifnet *)fin->fin_ifp)->if_unit) & 7)
+# endif
+
+# ifdef _KERNEL
+# define GETKTIME(x) microtime((struct timeval *)x)
+
+# if (__FreeBSD_version >= 500002)
+# include <netinet/in_systm.h>
+# include <netinet/ip.h>
+# include <machine/in_cksum.h>
+# endif
+
+# if (__FreeBSD_version >= 500043)
+# define USE_MUTEXES
+# define MUTEX_ENTER(x) mtx_lock(&(x)->ipf_lk)
+# define MUTEX_EXIT(x) mtx_unlock(&(x)->ipf_lk)
+# define MUTEX_INIT(x,y) mtx_init(&(x)->ipf_lk, (y), NULL,\
+ MTX_DEF)
+# define MUTEX_DESTROY(x) mtx_destroy(&(x)->ipf_lk)
+# define MUTEX_NUKE(x) bzero((x), sizeof(*(x)))
+/*
+ * Whilst the sx(9) locks on FreeBSD have the right semantics and interface
+ * for what we want to use them for, despite testing showing they work -
+ * with a WITNESS kernel, it generates LOR messages.
+ */
+# if (__FreeBSD_version < 700000)
+# define READ_ENTER(x) mtx_lock(&(x)->ipf_lk)
+# define WRITE_ENTER(x) mtx_lock(&(x)->ipf_lk)
+# define RWLOCK_EXIT(x) mtx_unlock(&(x)->ipf_lk)
+# define MUTEX_DOWNGRADE(x) ;
+# define RWLOCK_INIT(x,y) mtx_init(&(x)->ipf_lk, (y), NULL,\
+ MTX_DEF)
+# define RW_DESTROY(x) mtx_destroy(&(x)->ipf_lk)
+# else
+# define READ_ENTER(x) sx_slock(&(x)->ipf_lk)
+# define WRITE_ENTER(x) sx_xlock(&(x)->ipf_lk)
+# define MUTEX_DOWNGRADE(x) sx_downgrade(&(x)->ipf_lk)
+# define RWLOCK_INIT(x, y) sx_init(&(x)->ipf_lk, (y))
+# define RW_DESTROY(x) sx_destroy(&(x)->ipf_lk)
+# ifdef sx_unlock
+# define RWLOCK_EXIT(x) sx_unlock(&(x)->ipf_lk)
+# else
+# define RWLOCK_EXIT(x) do { \
+ if ((x)->ipf_lk.sx_cnt < 0) \
+ sx_xunlock(&(x)->ipf_lk); \
+ else \
+ sx_sunlock(&(x)->ipf_lk); \
+ } while (0)
+# endif
+# endif
+# include <machine/atomic.h>
+# define ATOMIC_INC(x) { mtx_lock(&ipf_rw.ipf_lk); (x)++; \
+ mtx_unlock(&ipf_rw.ipf_lk); }
+# define ATOMIC_DEC(x) { mtx_lock(&ipf_rw.ipf_lk); (x)--; \
+ mtx_unlock(&ipf_rw.ipf_lk); }
+# define ATOMIC_INCL(x) atomic_add_long(&(x), 1)
+# define ATOMIC_INC64(x) ATOMIC_INC(x)
+# define ATOMIC_INC32(x) atomic_add_32((u_int *)&(x), 1)
+# define ATOMIC_INC16(x) atomic_add_16(&(x), 1)
+# define ATOMIC_DECL(x) atomic_add_long(&(x), -1)
+# define ATOMIC_DEC64(x) ATOMIC_DEC(x)
+# define ATOMIC_DEC32(x) atomic_add_32((u_int *)&(x), -1)
+# define ATOMIC_DEC16(x) atomic_add_16(&(x), -1)
+# define SPL_X(x) ;
+# define SPL_NET(x) ;
+# define SPL_IMP(x) ;
+# define SPL_SCHED(x) ;
+extern int in_cksum __P((struct mbuf *, int));
+# endif /* __FreeBSD_version >= 500043 */
+# define MSGDSIZE(x) mbufchainlen(x)
+# define M_LEN(x) (x)->m_len
+# define M_DUPLICATE(x) m_copy((x), 0, M_COPYALL)
+# define IPF_PANIC(x,y) if (x) { printf y; panic("ipf_panic"); }
+typedef struct mbuf mb_t;
+# endif /* _KERNEL */
+
+# if __FreeBSD__ < 3
+# include <machine/spl.h>
+# else
+# if __FreeBSD__ == 3
+# if defined(IPFILTER_LKM) && !defined(ACTUALLY_LKM_NOT_KERNEL)
+# define ACTUALLY_LKM_NOT_KERNEL
+# endif
+# endif
+# endif
+
+# if (__FreeBSD_version >= 300000)
+typedef u_long ioctlcmd_t;
+# else
+typedef int ioctlcmd_t;
+# endif
+typedef struct uio uio_t;
+typedef int minor_t;
+typedef u_int32_t u_32_t;
+# define U_32_T 1
+
+# define OS_RECOGNISED 1
+#endif /* __FreeBSD__ */
+
+
+/* ----------------------------------------------------------------------- */
+/* O P E N B S D */
+/* ----------------------------------------------------------------------- */
+#ifdef __OpenBSD__
+# ifdef INET6
+# define USE_INET6
+# endif
+
+# ifdef _KERNEL
+# if !defined(IPFILTER_LKM)
+# include "bpfilter.h"
+# endif
+# if (OpenBSD >= 200311)
+# define SNPRINTF snprintf
+# if defined(USE_INET6)
+# include "netinet6/in6_var.h"
+# include "netinet6/nd6.h"
+# endif
+# endif
+# if (OpenBSD >= 200012)
+# define HAVE_M_PULLDOWN 1
+# endif
+# define COPYIN(a,b,c) copyin((caddr_t)(a), (caddr_t)(b), (c))
+# define COPYOUT(a,b,c) copyout((caddr_t)(a), (caddr_t)(b), (c))
+# define GETKTIME(x) microtime((struct timeval *)x)
+# define MSGDSIZE(x) mbufchainlen(x)
+# define M_LEN(x) (x)->m_len
+# define M_DUPLICATE(x) m_copy((x), 0, M_COPYALL)
+# define IPF_PANIC(x,y) if (x) { printf y; panic("ipf_panic"); }
+typedef struct mbuf mb_t;
+# endif /* _KERNEL */
+# if (OpenBSD >= 199603)
+# define IFNAME(x, b) ((struct ifnet *)x)->if_xname
+# define COPYIFNAME(x, b) \
+ (void) strncpy(b, \
+ ((struct ifnet *)x)->if_xname, \
+ LIFNAMSIZ)
+# define CACHE_HASH(x) ((((struct ifnet *)fin->fin_ifp)->if_index)&7)
+# else
+# define CACHE_HASH(x) ((IFNAME(fin->fin_ifp)[0] + \
+ ((struct ifnet *)fin->fin_ifp)->if_unit) & 7)
+# endif
+
+typedef struct uio uio_t;
+typedef u_long ioctlcmd_t;
+typedef int minor_t;
+typedef u_int32_t u_32_t;
+# define U_32_T 1
+
+# define OS_RECOGNISED 1
+#endif /* __OpenBSD__ */
+
+
+/* ----------------------------------------------------------------------- */
+/* B S D O S */
+/* ----------------------------------------------------------------------- */
+#ifdef _BSDI_VERSION
+# ifdef INET6
+# define USE_INET6
+# endif
+
+# ifdef _KERNEL
+# define GETKTIME(x) microtime((struct timeval *)x)
+# define MSGDSIZE(x) mbufchainlen(x)
+# define M_LEN(x) (x)->m_len
+# define M_DUPLICATE(x) m_copy((x), 0, M_COPYALL)
+# define CACHE_HASH(x) ((IFNAME(fin->fin_ifp)[0] + \
+ ((struct ifnet *)fin->fin_ifp)->if_unit) & 7)
+typedef struct mbuf mb_t;
+# endif /* _KERNEL */
+
+# if (_BSDI_VERSION >= 199701)
+typedef u_long ioctlcmd_t;
+# else
+typedef int ioctlcmd_t;
+# endif
+typedef u_int32_t u_32_t;
+# define U_32_T 1
+
+#endif /* _BSDI_VERSION */
+
+
+/* ----------------------------------------------------------------------- */
+/* S U N O S 4 */
+/* ----------------------------------------------------------------------- */
+#if defined(sun) && !defined(OS_RECOGNISED) /* SunOS4 */
+# ifdef _KERNEL
+# include <sys/kmem_alloc.h>
+# define GETKTIME(x) uniqtime((struct timeval *)x)
+# define MSGDSIZE(x) mbufchainlen(x)
+# define M_LEN(x) (x)->m_len
+# define M_DUPLICATE(x) m_copy((x), 0, M_COPYALL)
+# define CACHE_HASH(x) ((IFNAME(fin->fin_ifp)[0] + \
+ ((struct ifnet *)fin->fin_ifp)->if_unit) & 7)
+# define GETIFP(n, v) ifunit(n, IFNAMSIZ)
+# define KFREE(x) kmem_free((char *)(x), sizeof(*(x)))
+# define KFREES(x,s) kmem_free((char *)(x), (s))
+# define SLEEP(id, n) sleep((id), PZERO+1)
+# define WAKEUP(id,x) wakeup(id + x)
+# define POLLWAKEUP(x) ;
+# define UIOMOVE(a,b,c,d) uiomove((caddr_t)a,b,c,d)
+# define IPF_PANIC(x,y) if (x) { printf y; panic("ipf_panic"); }
+
+extern void m_copydata __P((struct mbuf *, int, int, caddr_t));
+extern void m_copyback __P((struct mbuf *, int, int, caddr_t));
+
+typedef struct mbuf mb_t;
+# endif
+
+typedef struct uio uio_t;
+typedef int ioctlcmd_t;
+typedef int minor_t;
+typedef unsigned int u_32_t;
+# define U_32_T 1
+
+# define OS_RECOGNISED 1
+
+#endif /* SunOS 4 */
+
+/* ----------------------------------------------------------------------- */
+/* L I N U X */
+/* ----------------------------------------------------------------------- */
+#if defined(linux) && !defined(OS_RECOGNISED)
+#include <linux/config.h>
+#include <linux/version.h>
+# if (LINUX >= 20600) && defined(_KERNEL)
+# define HDR_T_PRIVATE 1
+# endif
+# undef USE_INET6
+# ifdef USE_INET6
+struct ip6_ext {
+ u_char ip6e_nxt;
+ u_char ip6e_len;
+};
+# endif
+
+# ifdef _KERNEL
+# define IPF_PANIC(x,y) if (x) { printf y; panic("ipf_panic"); }
+# define COPYIN(a,b,c) copy_from_user((caddr_t)(b), (caddr_t)(a), (c))
+# define COPYOUT(a,b,c) copy_to_user((caddr_t)(b), (caddr_t)(a), (c))
+# define FREE_MB_T(m) kfree_skb(m)
+# define GETKTIME(x) do_gettimeofday((struct timeval *)x)
+# define POLLWAKEUP(x) ;
+# ifdef wait_event_interruptible
+# define SLEEP(x,s) wait_event_interruptible((*(x##_linux)), 0)
+# else
+# define SLEEP(x,s) 0, interruptible_sleep_on(x##_linux)
+# endif
+# define WAKEUP(x,y) wake_up(x##_linux + y)
+# define UIOMOVE(a,b,c,d) uiomove(a,b,c,d)
+# define USE_MUTEXES
+# define KRWLOCK_T rwlock_t
+# define KMUTEX_T spinlock_t
+# define MUTEX_INIT(x,y) spin_lock_init(&(x)->ipf_lk)
+# define MUTEX_ENTER(x) spin_lock(&(x)->ipf_lk)
+# define MUTEX_EXIT(x) spin_unlock(&(x)->ipf_lk)
+# define MUTEX_DESTROY(x) do { } while (0)
+# define MUTEX_NUKE(x) bzero(&(x)->ipf_lk, sizeof((x)->ipf_lk))
+# define READ_ENTER(x) ipf_read_enter(x)
+# define WRITE_ENTER(x) ipf_write_enter(x)
+# define RWLOCK_INIT(x,y) ipf_rw_init(x, y)
+# define RW_DESTROY(x) do { } while (0)
+# define RWLOCK_EXIT(x) ipf_rw_exit(x)
+# define MUTEX_DOWNGRADE(x) ipf_rw_downgrade(x)
+# define ATOMIC_INCL(x) MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw)
+# define ATOMIC_DECL(x) MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw)
+# define ATOMIC_INC64(x) MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw)
+# define ATOMIC_INC32(x) MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw)
+# define ATOMIC_INC16(x) MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw)
+# define ATOMIC_DEC64(x) MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw)
+# define ATOMIC_DEC32(x) MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw)
+# define ATOMIC_DEC16(x) MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw)
+# define SPL_SCHED(x) do { } while (0)
+# define SPL_IMP(x) do { } while (0)
+# define SPL_NET(x) do { } while (0)
+# define SPL_X(x) do { } while (0)
+# define IFNAME(x) ((struct net_device*)x)->name
+# define CACHE_HASH(x) ((IFNAME(fin->fin_ifp)[0] + \
+ ((struct net_device *)fin->fin_ifp)->ifindex) & 7)
+typedef struct sk_buff mb_t;
+extern void m_copydata __P((mb_t *, int, int, caddr_t));
+extern void m_copyback __P((mb_t *, int, int, caddr_t));
+extern void m_adj __P((mb_t *, int));
+extern mb_t *m_pullup __P((mb_t *, int));
+# define mbuf sk_buff
+
+# define mtod(m, t) ((t)(m)->data)
+# define m_data data
+# define m_len len
+# define m_next next
+# define M_DUPLICATE(m) skb_clone((m), in_interrupt() ? GFP_ATOMIC : \
+ GFP_KERNEL)
+# define MSGDSIZE(m) (m)->len
+# define M_LEN(m) (m)->len
+
+# define splnet(x) ;
+# define printf printk
+# define bcopy(s,d,z) memmove(d, s, z)
+# define bzero(s,z) memset(s, 0, z)
+# define bcmp(a,b,z) memcmp(a, b, z)
+
+# define ifnet net_device
+# define if_xname name
+# define if_unit ifindex
+
+# define KMALLOC(x,t) (x) = (t)kmalloc(sizeof(*(x)), \
+ in_interrupt() ? GFP_ATOMIC : GFP_KERNEL)
+# define KFREE(x) kfree(x)
+# define KMALLOCS(x,t,s) (x) = (t)kmalloc((s), \
+ in_interrupt() ? GFP_ATOMIC : GFP_KERNEL)
+# define KFREES(x,s) kfree(x)
+
+# define GETIFP(n,v) dev_get_by_name(n)
+
+# else
+# include <net/ethernet.h>
+
+struct mbuf {
+};
+
+# ifndef _NET_ROUTE_H
+struct rtentry {
+};
+# endif
+
+struct ifnet {
+ char if_xname[IFNAMSIZ];
+ int if_unit;
+ int (* if_output) __P((struct ifnet *, struct mbuf *, struct sockaddr *, struct rtentry *));
+ struct ifaddr *if_addrlist;
+};
+# define IFNAME(x) ((struct ifnet *)x)->if_xname
+
+# endif /* _KERNEL */
+
+# define COPYIFNAME(x, b) \
+ (void) strncpy(b, \
+ ((struct ifnet *)x)->if_xname, \
+ LIFNAMSIZ)
+
+# include <linux/fs.h>
+# define FWRITE FMODE_WRITE
+# define FREAD FMODE_READ
+
+# define __USE_MISC 1
+# define __FAVOR_BSD 1
+
+typedef struct uio {
+ struct iovec *uio_iov;
+ void *uio_file;
+ char *uio_buf;
+ int uio_iovcnt;
+ int uio_offset;
+ size_t uio_resid;
+ int uio_rw;
+} uio_t;
+
+extern int uiomove __P((caddr_t, size_t, int, struct uio *));
+
+# define UIO_READ 1
+# define UIO_WRITE 2
+
+typedef u_long ioctlcmd_t;
+typedef int minor_t;
+typedef u_int32_t u_32_t;
+# define U_32_T 1
+
+# define OS_RECOGNISED 1
+
+#endif
+
+
+/* ----------------------------------------------------------------------- */
+/* A I X */
+/* ----------------------------------------------------------------------- */
+#if defined(_AIX51)
+# undef MENTAT
+
+# include <sys/lock.h>
+# include <sys/sysmacros.h>
+
+# ifdef _KERNEL
+# define rw_read_locked(x) 0
+# include <net/net_globals.h>
+# include <net/net_malloc.h>
+# define KMUTEX_T simple_lock_t
+# define KRWLOCK_T complex_lock_t
+# define USE_MUTEXES 1
+# define USE_SPL 1
+# define READ_ENTER(x) lock_read((x)->ipf_lk)
+# define WRITE_ENTER(x) lock_write((x)->ipf_lk)
+# define MUTEX_DOWNGRADE(x) lock_write_to_read((x)->ipf_lk)
+# define RWLOCK_INIT(x, y) lock_alloc(&(x)->ipf_lk, \
+ LOCK_ALLOC_PIN, \
+ (u_short)y, 0); \
+ lock_init((x)->ipf_lk, TRUE)
+# define RWLOCK_EXIT(x) lock_done((x)->ipf_lk)
+# define RW_DESTROY(x) lock_free(&(x)->ipf_lk)
+# define MUTEX_ENTER(x) simple_lock((x)->ipf_lk)
+# define MUTEX_INIT(x, y) lock_alloc(&(x)->ipf_lk, \
+ LOCK_ALLOC_PIN, \
+ (u_short)y, 0); \
+ simple_lock_init((x)->ipf_lk)
+# define MUTEX_DESTROY(x) lock_free(&(x)->ipf_lk)
+# define MUTEX_EXIT(x) simple_unlock((x)->ipf_lk)
+# define MUTEX_NUKE(x) bzero(&(x)->ipf_lk, sizeof((x)->ipf_lk))
+# define ATOMIC_INC64(x) { MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_DEC64(x) { MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_INC32(x) { MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_DEC32(x) { MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_INCL(x) { MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_DECL(x) { MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_INC(x) { MUTEX_ENTER(&ipf_rw); (x)++; \
+ MUTEX_EXIT(&ipf_rw); }
+# define ATOMIC_DEC(x) { MUTEX_ENTER(&ipf_rw); (x)--; \
+ MUTEX_EXIT(&ipf_rw); }
+# define SPL_SCHED(x) x = splsched()
+# define SPL_NET(x) x = splnet()
+# define SPL_IMP(x) x = splimp()
+# undef SPL_X
+# define SPL_X(x) splx(x)
+# define UIOMOVE(a,b,c,d) uiomove((caddr_t)a,b,c,d)
+extern void* getifp __P((char *, int));
+# define GETIFP(n, v) getifp(n, v)
+# define GET_MINOR minor
+# define SLEEP(id, n) sleepx((id), PZERO+1, 0)
+# define WAKEUP(id,x) wakeup(id)
+# define POLLWAKEUP(x) ;
+# define COPYIN(a,b,c) copyin((caddr_t)(a), (caddr_t)(b), (c))
+# define COPYOUT(a,b,c) copyout((caddr_t)(a), (caddr_t)(b), (c))
+# define KMALLOC(a, b) MALLOC((a), b, sizeof(*(a)), M_TEMP, M_NOWAIT)
+# define KMALLOCS(a, b, c) MALLOC((a), b, (c), M_TEMP, \
+ ((c) > 4096) ? M_WAITOK : M_NOWAIT)
+# define KFREE(x) FREE((x), M_TEMP)
+# define KFREES(x,s) FREE((x), M_TEMP)
+# define MSGDSIZE(x) mbufchainlen(x)
+# define M_LEN(x) (x)->m_len
+# define M_DUPLICATE(x) m_copy((x), 0, M_COPYALL)
+# define GETKTIME(x)
+# define CACHE_HASH(x) ((IFNAME(fin->fin_ifp)[0] + \
+ ((struct ifnet *)fin->fin_ifp)->if_unit) & 7)
+# define IPF_PANIC(x,y)
+typedef struct mbuf mb_t;
+# endif /* _KERNEL */
+
+/*
+ * These are from's Solaris' #defines for little endian.
+ */
+#if !defined(IP6F_MORE_FRAG)
+# define IP6F_MORE_FRAG 0x0100
+#endif
+#if !defined(IP6F_RESERVED_MASK)
+# define IP6F_RESERVED_MASK 0x0600
+#endif
+#if !defined(IP6F_OFF_MASK)
+# define IP6F_OFF_MASK 0xf8ff
+#endif
+
+struct ip6_ext {
+ u_char ip6e_nxt;
+ u_char ip6e_len;
+};
+
+typedef int ioctlcmd_t;
+typedef int minor_t;
+/*
+ * Really, any arch where sizeof(long) != sizeof(int).
+ */
+typedef unsigned int u_32_t;
+# define U_32_T 1
+
+# define OS_RECOGNISED 1
+#endif /* _AIX51 */
+
+
+#ifndef OS_RECOGNISED
+#error ip_compat.h does not recognise this platform/OS.
+#endif
+
+
+/* ----------------------------------------------------------------------- */
+/* G E N E R I C */
+/* ----------------------------------------------------------------------- */
+#ifndef OS_RECOGNISED
+#endif
+
+/*
+ * For BSD kernels, if bpf is in the kernel, enable ipfilter to use bpf in
+ * filter rules.
+ */
+#if !defined(IPFILTER_BPF)
+# if (defined(NBPF) && (NBPF > 0)) || (defined(DEV_BPF) && (DEV_BPF > 0)) || \
+ (defined(NBPFILTER) && (NBPFILTER > 0))
+# define IPFILTER_BPF
+# endif
+#endif
+
+/*
+ * Userland locking primitives
+ */
+typedef struct {
+ char *eMm_owner;
+ char *eMm_heldin;
+ u_int eMm_magic;
+ int eMm_held;
+ int eMm_heldat;
+#if defined(__hpux) || defined(__linux)
+ char eMm_fill[8];
+#endif
+} eMmutex_t;
+
+typedef struct {
+ char *eMrw_owner;
+ char *eMrw_heldin;
+ u_int eMrw_magic;
+ short eMrw_read;
+ short eMrw_write;
+ int eMrw_heldat;
+#ifdef __hpux
+ char eMm_fill[24];
+#endif
+} eMrwlock_t;
+
+typedef union {
+#ifdef KMUTEX_T
+ struct {
+ KMUTEX_T ipf_slk;
+ char *ipf_lname;
+ } ipf_lkun_s;
+#endif
+ eMmutex_t ipf_emu;
+} ipfmutex_t;
+
+typedef union {
+#ifdef KRWLOCK_T
+ struct {
+ KRWLOCK_T ipf_slk;
+ char *ipf_lname;
+ int ipf_sr;
+ int ipf_sw;
+ u_int ipf_magic;
+ } ipf_lkun_s;
+#endif
+ eMrwlock_t ipf_emu;
+} ipfrwlock_t;
+
+#define ipf_lk ipf_lkun_s.ipf_slk
+#define ipf_lname ipf_lkun_s.ipf_lname
+#define ipf_isr ipf_lkun_s.ipf_sr
+#define ipf_isw ipf_lkun_s.ipf_sw
+#define ipf_magic ipf_lkun_s.ipf_magic
+
+#if !defined(__GNUC__) || \
+ (defined(__FreeBSD_version) && (__FreeBSD_version >= 503000))
+# ifndef INLINE
+# define INLINE
+# endif
+#else
+# define INLINE __inline__
+#endif
+
+#if defined(linux) && defined(_KERNEL)
+extern void ipf_read_enter __P((ipfrwlock_t *));
+extern void ipf_write_enter __P((ipfrwlock_t *));
+extern void ipf_rw_exit __P((ipfrwlock_t *));
+extern void ipf_rw_init __P((ipfrwlock_t *, char *));
+extern void ipf_rw_downgrade __P((ipfrwlock_t *));
+#endif
+
+/*
+ * In a non-kernel environment, there are a lot of macros that need to be
+ * filled in to be null-ops or to point to some compatibility function,
+ * somewhere in userland.
+ */
+#ifndef _KERNEL
+typedef struct mb_s {
+ struct mb_s *mb_next;
+ int mb_len;
+ u_long mb_buf[2048];
+} mb_t;
+# undef m_next
+# define m_next mb_next
+# define MSGDSIZE(x) (x)->mb_len /* XXX - from ipt.c */
+# define M_LEN(x) (x)->mb_len
+# define M_DUPLICATE(x) (x)
+# define GETKTIME(x) gettimeofday((struct timeval *)(x), NULL)
+# undef MTOD
+# define MTOD(m, t) ((t)(m)->mb_buf)
+# define FREE_MB_T(x)
+# define SLEEP(x,y) 1;
+# define WAKEUP(x,y) ;
+# define POLLWAKEUP(y) ;
+# define IPF_PANIC(x,y) ;
+# define PANIC(x,y) ;
+# define SPL_SCHED(x) ;
+# define SPL_NET(x) ;
+# define SPL_IMP(x) ;
+# define SPL_X(x) ;
+# define KMALLOC(a,b) (a) = (b)malloc(sizeof(*a))
+# define KMALLOCS(a,b,c) (a) = (b)malloc(c)
+# define KFREE(x) free(x)
+# define KFREES(x,s) free(x)
+# define GETIFP(x, v) get_unit(x,v)
+# define COPYIN(a,b,c) bcopywrap((a), (b), (c))
+# define COPYOUT(a,b,c) bcopywrap((a), (b), (c))
+# define COPYDATA(m, o, l, b) bcopy(MTOD((mb_t *)m, char *) + (o), \
+ (b), (l))
+# define COPYBACK(m, o, l, b) bcopy((b), \
+ MTOD((mb_t *)m, char *) + (o), \
+ (l))
+# define UIOMOVE(a,b,c,d) ipfuiomove(a,b,c,d)
+extern void m_copydata __P((mb_t *, int, int, caddr_t));
+extern int ipfuiomove __P((caddr_t, int, int, struct uio *));
+extern int bcopywrap __P((void *, void *, size_t));
+# ifndef CACHE_HASH
+# define CACHE_HASH(x) ((IFNAME(fin->fin_ifp)[0] + \
+ ((struct ifnet *)fin->fin_ifp)->if_unit) & 7)
+# endif
+
+# define MUTEX_DESTROY(x) eMmutex_destroy(&(x)->ipf_emu)
+# define MUTEX_ENTER(x) eMmutex_enter(&(x)->ipf_emu, \
+ __FILE__, __LINE__)
+# define MUTEX_EXIT(x) eMmutex_exit(&(x)->ipf_emu)
+# define MUTEX_INIT(x,y) eMmutex_init(&(x)->ipf_emu, y)
+# define MUTEX_NUKE(x) bzero((x), sizeof(*(x)))
+
+# define MUTEX_DOWNGRADE(x) eMrwlock_downgrade(&(x)->ipf_emu, \
+ __FILE__, __LINE__)
+# define READ_ENTER(x) eMrwlock_read_enter(&(x)->ipf_emu, \
+ __FILE__, __LINE__)
+# define RWLOCK_INIT(x, y) eMrwlock_init(&(x)->ipf_emu, y)
+# define RWLOCK_EXIT(x) eMrwlock_exit(&(x)->ipf_emu)
+# define RW_DESTROY(x) eMrwlock_destroy(&(x)->ipf_emu)
+# define WRITE_ENTER(x) eMrwlock_write_enter(&(x)->ipf_emu, \
+ __FILE__, \
+ __LINE__)
+
+# define USE_MUTEXES 1
+
+extern void eMmutex_destroy __P((eMmutex_t *));
+extern void eMmutex_enter __P((eMmutex_t *, char *, int));
+extern void eMmutex_exit __P((eMmutex_t *));
+extern void eMmutex_init __P((eMmutex_t *, char *));
+extern void eMrwlock_destroy __P((eMrwlock_t *));
+extern void eMrwlock_exit __P((eMrwlock_t *));
+extern void eMrwlock_init __P((eMrwlock_t *, char *));
+extern void eMrwlock_read_enter __P((eMrwlock_t *, char *, int));
+extern void eMrwlock_write_enter __P((eMrwlock_t *, char *, int));
+extern void eMrwlock_downgrade __P((eMrwlock_t *, char *, int));
+
+#endif
+
+#define MAX_IPV4HDR ((0xf << 2) + sizeof(struct icmp) + sizeof(ip_t) + 8)
+
+#ifndef IP_OFFMASK
+# define IP_OFFMASK 0x1fff
+#endif
+
+
+/*
+ * On BSD's use quad_t as a guarantee for getting at least a 64bit sized
+ * object.
+ */
+#if (BSD > 199306)
+# define USE_QUAD_T
+# define U_QUAD_T unsigned long long
+# define QUAD_T long long
+#else /* BSD > 199306 */
+# define U_QUAD_T u_long
+# define QUAD_T long
+#endif /* BSD > 199306 */
+
+
+#ifdef USE_INET6
+# if defined(__NetBSD__) || defined(__OpenBSD__) || defined(__FreeBSD__) || \
+ defined(__osf__) || defined(linux)
+# include <netinet/ip6.h>
+# include <netinet/icmp6.h>
+# if !defined(linux)
+# if defined(_KERNEL) && !defined(__osf__)
+# include <netinet6/ip6_var.h>
+# endif
+# endif
+typedef struct ip6_hdr ip6_t;
+# endif
+#endif
+
+#ifndef MAX
+# define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#endif
+
+#if defined(_KERNEL)
+# ifdef MENTAT
+# define COPYDATA mb_copydata
+# define COPYBACK mb_copyback
+# else
+# define COPYDATA m_copydata
+# define COPYBACK m_copyback
+# endif
+# if (BSD >= 199306) || defined(__FreeBSD__)
+# if (defined(__NetBSD_Version__) && (__NetBSD_Version__ < 105180000)) || \
+ defined(__FreeBSD__) || (defined(OpenBSD) && (OpenBSD < 200206)) || \
+ defined(_BSDI_VERSION)
+# include <vm/vm.h>
+# endif
+# if !defined(__FreeBSD__) || (defined (__FreeBSD_version) && \
+ (__FreeBSD_version >= 300000))
+# if (defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 105180000)) || \
+ (defined(OpenBSD) && (OpenBSD >= 200111))
+# include <uvm/uvm_extern.h>
+# else
+# include <vm/vm_extern.h>
+extern vm_map_t kmem_map;
+# endif
+# include <sys/proc.h>
+# else /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD_version >= 300000) */
+# include <vm/vm_kern.h>
+# endif /* !__FreeBSD__ || (__FreeBSD__ && __FreeBSD_version >= 300000) */
+
+# ifdef IPFILTER_M_IPFILTER
+# include <sys/malloc.h>
+MALLOC_DECLARE(M_IPFILTER);
+# define _M_IPF M_IPFILTER
+# else /* IPFILTER_M_IPFILTER */
+# ifdef M_PFIL
+# define _M_IPF M_PFIL
+# else
+# ifdef M_IPFILTER
+# define _M_IPF M_IPFILTER
+# else
+# define _M_IPF M_TEMP
+# endif /* M_IPFILTER */
+# endif /* M_PFIL */
+# endif /* IPFILTER_M_IPFILTER */
+# define KMALLOC(a, b) MALLOC((a), b, sizeof(*(a)), _M_IPF, M_NOWAIT)
+# if !defined(KMALLOCS)
+# define KMALLOCS(a, b, c) MALLOC((a), b, (c), _M_IPF, M_NOWAIT)
+# endif
+# define KFREE(x) FREE((x), _M_IPF)
+# define KFREES(x,s) FREE((x), _M_IPF)
+# define UIOMOVE(a,b,c,d) uiomove(a,b,d)
+# define SLEEP(id, n) tsleep((id), PPAUSE|PCATCH, n, 0)
+# define WAKEUP(id,x) wakeup(id+x)
+# define POLLWAKEUP(x) selwakeup(ipfselwait+x)
+# define GETIFP(n, v) ifunit(n)
+# endif /* (Free)BSD */
+
+# if !defined(USE_MUTEXES) && !defined(SPL_NET)
+# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199407)) || \
+ (defined(OpenBSD) && (OpenBSD >= 200006))
+# define SPL_NET(x) x = splsoftnet()
+# else
+# define SPL_IMP(x) x = splimp()
+# define SPL_NET(x) x = splnet()
+# endif /* NetBSD && (NetBSD <= 1991011) && (NetBSD >= 199407) */
+# define SPL_SCHED(x) x = splsched()
+# define SPL_X(x) (void) splx(x)
+# endif /* !USE_MUTEXES */
+
+# ifndef FREE_MB_T
+# define FREE_MB_T(m) m_freem(m)
+# endif
+
+# ifndef MTOD
+# define MTOD(m,t) mtod(m,t)
+# endif
+
+# ifndef COPYIN
+# define COPYIN(a,b,c) (bcopy((caddr_t)(a), (caddr_t)(b), (c)), 0)
+# define COPYOUT(a,b,c) (bcopy((caddr_t)(a), (caddr_t)(b), (c)), 0)
+# endif
+
+# ifndef KMALLOC
+# define KMALLOC(a,b) (a) = (b)new_kmem_alloc(sizeof(*(a)), \
+ KMEM_NOSLEEP)
+# define KMALLOCS(a,b,c) (a) = (b)new_kmem_alloc((c), KMEM_NOSLEEP)
+# endif
+
+# ifndef GET_MINOR
+# define GET_MINOR(x) minor(x)
+# endif
+# define PANIC(x,y) if (x) panic y
+#endif /* _KERNEL */
+
+#ifndef IFNAME
+# define IFNAME(x) ((struct ifnet *)x)->if_name
+#endif
+#ifndef COPYIFNAME
+# define NEED_FRGETIFNAME
+extern char *fr_getifname __P((struct ifnet *, char *));
+# define COPYIFNAME(x, b) \
+ fr_getifname((struct ifnet *)x, b)
+#endif
+
+#ifndef ASSERT
+# define ASSERT(x)
+#endif
+
+#ifndef BCOPYIN
+# define BCOPYIN(a,b,c) (bcopy((caddr_t)(a), (caddr_t)(b), (c)), 0)
+# define BCOPYOUT(a,b,c) (bcopy((caddr_t)(a), (caddr_t)(b), (c)), 0)
+#endif
+
+/*
+ * Because the ctype(3) posix definition, if used "safely" in code everywhere,
+ * would mean all normal code that walks through strings needed casts. Yuck.
+ */
+#define ISALNUM(x) isalnum((u_char)(x))
+#define ISALPHA(x) isalpha((u_char)(x))
+#define ISASCII(x) isascii((u_char)(x))
+#define ISDIGIT(x) isdigit((u_char)(x))
+#define ISPRINT(x) isprint((u_char)(x))
+#define ISSPACE(x) isspace((u_char)(x))
+#define ISUPPER(x) isupper((u_char)(x))
+#define ISXDIGIT(x) isxdigit((u_char)(x))
+#define ISLOWER(x) islower((u_char)(x))
+#define TOUPPER(x) toupper((u_char)(x))
+#define TOLOWER(x) tolower((u_char)(x))
+
+/*
+ * If mutexes aren't being used, turn all the mutex functions into null-ops.
+ */
+#if !defined(USE_MUTEXES)
+# define USE_SPL 1
+# undef RW_DESTROY
+# undef MUTEX_INIT
+# undef MUTEX_NUKE
+# undef MUTEX_DESTROY
+# define MUTEX_ENTER(x) ;
+# define READ_ENTER(x) ;
+# define WRITE_ENTER(x) ;
+# define MUTEX_DOWNGRADE(x) ;
+# define RWLOCK_INIT(x, y) ;
+# define RWLOCK_EXIT(x) ;
+# define RW_DESTROY(x) ;
+# define MUTEX_EXIT(x) ;
+# define MUTEX_INIT(x,y) ;
+# define MUTEX_DESTROY(x) ;
+# define MUTEX_NUKE(x) ;
+#endif /* !USE_MUTEXES */
+#ifndef ATOMIC_INC
+# define ATOMIC_INC(x) (x)++
+# define ATOMIC_DEC(x) (x)--
+#endif
+
+#if defined(USE_SPL) && defined(_KERNEL)
+# define SPL_INT(x) int x
+#else
+# define SPL_INT(x)
+#endif
+
+/*
+ * If there are no atomic operations for bit sizes defined, define them to all
+ * use a generic one that works for all sizes.
+ */
+#ifndef ATOMIC_INCL
+# define ATOMIC_INCL ATOMIC_INC
+# define ATOMIC_INC64 ATOMIC_INC
+# define ATOMIC_INC32 ATOMIC_INC
+# define ATOMIC_INC16 ATOMIC_INC
+# define ATOMIC_DECL ATOMIC_DEC
+# define ATOMIC_DEC64 ATOMIC_DEC
+# define ATOMIC_DEC32 ATOMIC_DEC
+# define ATOMIC_DEC16 ATOMIC_DEC
+#endif
+
+#ifndef HDR_T_PRIVATE
+typedef struct tcphdr tcphdr_t;
+typedef struct udphdr udphdr_t;
+#endif
+typedef struct icmp icmphdr_t;
+typedef struct ip ip_t;
+typedef struct ether_header ether_header_t;
+typedef struct tcpiphdr tcpiphdr_t;
+
+#ifndef FR_GROUPLEN
+# define FR_GROUPLEN 16
+#endif
+
+#ifndef offsetof
+# define offsetof(t,m) (int)((&((t *)0L)->m))
+#endif
+
+/*
+ * This set of macros has been brought about because on Tru64 it is not
+ * possible to easily assign or examine values in a structure that are
+ * bit fields.
+ */
+#ifndef IP_V
+# define IP_V(x) (x)->ip_v
+#endif
+#ifndef IP_V_A
+# define IP_V_A(x,y) (x)->ip_v = (y)
+#endif
+#ifndef IP_HL
+# define IP_HL(x) (x)->ip_hl
+#endif
+#ifndef IP_HL_A
+# define IP_HL_A(x,y) (x)->ip_hl = ((y) & 0xf)
+#endif
+#ifndef TCP_X2
+# define TCP_X2(x) (x)->th_x2
+#endif
+#ifndef TCP_X2_A
+# define TCP_X2_A(x,y) (x)->th_x2 = (y)
+#endif
+#ifndef TCP_OFF
+# define TCP_OFF(x) (x)->th_off
+#endif
+#ifndef TCP_OFF_A
+# define TCP_OFF_A(x,y) (x)->th_off = (y)
+#endif
+#define IPMINLEN(i, h) ((i)->ip_len >= (IP_HL(i) * 4 + sizeof(struct h)))
+
+
+/*
+ * XXX - This is one of those *awful* hacks which nobody likes
+ */
+#ifdef ultrix
+#define A_A
+#else
+#define A_A &
+#endif
+
+#define TCPF_ALL (TH_FIN|TH_SYN|TH_RST|TH_PUSH|TH_ACK|TH_URG|\
+ TH_ECN|TH_CWR)
+
+#if (BSD >= 199306) && !defined(m_act)
+# define m_act m_nextpkt
+#endif
+
+/*
+ * Security Options for Intenet Protocol (IPSO) as defined in RFC 1108.
+ *
+ * Basic Option
+ *
+ * 00000001 - (Reserved 4)
+ * 00111101 - Top Secret
+ * 01011010 - Secret
+ * 10010110 - Confidential
+ * 01100110 - (Reserved 3)
+ * 11001100 - (Reserved 2)
+ * 10101011 - Unclassified
+ * 11110001 - (Reserved 1)
+ */
+#define IPSO_CLASS_RES4 0x01
+#define IPSO_CLASS_TOPS 0x3d
+#define IPSO_CLASS_SECR 0x5a
+#define IPSO_CLASS_CONF 0x96
+#define IPSO_CLASS_RES3 0x66
+#define IPSO_CLASS_RES2 0xcc
+#define IPSO_CLASS_UNCL 0xab
+#define IPSO_CLASS_RES1 0xf1
+
+#define IPSO_AUTH_GENSER 0x80
+#define IPSO_AUTH_ESI 0x40
+#define IPSO_AUTH_SCI 0x20
+#define IPSO_AUTH_NSA 0x10
+#define IPSO_AUTH_DOE 0x08
+#define IPSO_AUTH_UN 0x06
+#define IPSO_AUTH_FTE 0x01
+
+/*
+ * IP option #defines
+ */
+#undef IPOPT_RR
+#define IPOPT_RR 7
+#undef IPOPT_ZSU
+#define IPOPT_ZSU 10 /* ZSU */
+#undef IPOPT_MTUP
+#define IPOPT_MTUP 11 /* MTUP */
+#undef IPOPT_MTUR
+#define IPOPT_MTUR 12 /* MTUR */
+#undef IPOPT_ENCODE
+#define IPOPT_ENCODE 15 /* ENCODE */
+#undef IPOPT_TS
+#define IPOPT_TS 68
+#undef IPOPT_TR
+#define IPOPT_TR 82 /* TR */
+#undef IPOPT_SECURITY
+#define IPOPT_SECURITY 130
+#undef IPOPT_LSRR
+#define IPOPT_LSRR 131
+#undef IPOPT_E_SEC
+#define IPOPT_E_SEC 133 /* E-SEC */
+#undef IPOPT_CIPSO
+#define IPOPT_CIPSO 134 /* CIPSO */
+#undef IPOPT_SATID
+#define IPOPT_SATID 136
+#ifndef IPOPT_SID
+# define IPOPT_SID IPOPT_SATID
+#endif
+#undef IPOPT_SSRR
+#define IPOPT_SSRR 137
+#undef IPOPT_ADDEXT
+#define IPOPT_ADDEXT 147 /* ADDEXT */
+#undef IPOPT_VISA
+#define IPOPT_VISA 142 /* VISA */
+#undef IPOPT_IMITD
+#define IPOPT_IMITD 144 /* IMITD */
+#undef IPOPT_EIP
+#define IPOPT_EIP 145 /* EIP */
+#undef IPOPT_RTRALRT
+#define IPOPT_RTRALRT 148 /* RTRALRT */
+#undef IPOPT_SDB
+#define IPOPT_SDB 149
+#undef IPOPT_NSAPA
+#define IPOPT_NSAPA 150
+#undef IPOPT_DPS
+#define IPOPT_DPS 151
+#undef IPOPT_UMP
+#define IPOPT_UMP 152
+#undef IPOPT_FINN
+#define IPOPT_FINN 205 /* FINN */
+
+#ifndef TCPOPT_EOL
+# define TCPOPT_EOL 0
+#endif
+#ifndef TCPOPT_NOP
+# define TCPOPT_NOP 1
+#endif
+#ifndef TCPOPT_MAXSEG
+# define TCPOPT_MAXSEG 2
+#endif
+#ifndef TCPOLEN_MAXSEG
+# define TCPOLEN_MAXSEG 4
+#endif
+#ifndef TCPOPT_WINDOW
+# define TCPOPT_WINDOW 3
+#endif
+#ifndef TCPOLEN_WINDOW
+# define TCPOLEN_WINDOW 3
+#endif
+#ifndef TCPOPT_SACK_PERMITTED
+# define TCPOPT_SACK_PERMITTED 4
+#endif
+#ifndef TCPOLEN_SACK_PERMITTED
+# define TCPOLEN_SACK_PERMITTED 2
+#endif
+#ifndef TCPOPT_SACK
+# define TCPOPT_SACK 5
+#endif
+#ifndef TCPOPT_TIMESTAMP
+# define TCPOPT_TIMESTAMP 8
+#endif
+
+#ifndef ICMP_MINLEN
+# define ICMP_MINLEN 8
+#endif
+#ifndef ICMP_ECHOREPLY
+# define ICMP_ECHOREPLY 0
+#endif
+#ifndef ICMP_UNREACH
+# define ICMP_UNREACH 3
+#endif
+#ifndef ICMP_UNREACH_NET
+# define ICMP_UNREACH_NET 0
+#endif
+#ifndef ICMP_UNREACH_HOST
+# define ICMP_UNREACH_HOST 1
+#endif
+#ifndef ICMP_UNREACH_PROTOCOL
+# define ICMP_UNREACH_PROTOCOL 2
+#endif
+#ifndef ICMP_UNREACH_PORT
+# define ICMP_UNREACH_PORT 3
+#endif
+#ifndef ICMP_UNREACH_NEEDFRAG
+# define ICMP_UNREACH_NEEDFRAG 4
+#endif
+#ifndef ICMP_UNREACH_SRCFAIL
+# define ICMP_UNREACH_SRCFAIL 5
+#endif
+#ifndef ICMP_UNREACH_NET_UNKNOWN
+# define ICMP_UNREACH_NET_UNKNOWN 6
+#endif
+#ifndef ICMP_UNREACH_HOST_UNKNOWN
+# define ICMP_UNREACH_HOST_UNKNOWN 7
+#endif
+#ifndef ICMP_UNREACH_ISOLATED
+# define ICMP_UNREACH_ISOLATED 8
+#endif
+#ifndef ICMP_UNREACH_NET_PROHIB
+# define ICMP_UNREACH_NET_PROHIB 9
+#endif
+#ifndef ICMP_UNREACH_HOST_PROHIB
+# define ICMP_UNREACH_HOST_PROHIB 10
+#endif
+#ifndef ICMP_UNREACH_TOSNET
+# define ICMP_UNREACH_TOSNET 11
+#endif
+#ifndef ICMP_UNREACH_TOSHOST
+# define ICMP_UNREACH_TOSHOST 12
+#endif
+#ifndef ICMP_UNREACH_ADMIN_PROHIBIT
+# define ICMP_UNREACH_ADMIN_PROHIBIT 13
+#endif
+#ifndef ICMP_UNREACH_FILTER
+# define ICMP_UNREACH_FILTER 13
+#endif
+#ifndef ICMP_UNREACH_HOST_PRECEDENCE
+# define ICMP_UNREACH_HOST_PRECEDENCE 14
+#endif
+#ifndef ICMP_UNREACH_PRECEDENCE_CUTOFF
+# define ICMP_UNREACH_PRECEDENCE_CUTOFF 15
+#endif
+#ifndef ICMP_SOURCEQUENCH
+# define ICMP_SOURCEQUENCH 4
+#endif
+#ifndef ICMP_REDIRECT_NET
+# define ICMP_REDIRECT_NET 0
+#endif
+#ifndef ICMP_REDIRECT_HOST
+# define ICMP_REDIRECT_HOST 1
+#endif
+#ifndef ICMP_REDIRECT_TOSNET
+# define ICMP_REDIRECT_TOSNET 2
+#endif
+#ifndef ICMP_REDIRECT_TOSHOST
+# define ICMP_REDIRECT_TOSHOST 3
+#endif
+#ifndef ICMP_ALTHOSTADDR
+# define ICMP_ALTHOSTADDR 6
+#endif
+#ifndef ICMP_TIMXCEED
+# define ICMP_TIMXCEED 11
+#endif
+#ifndef ICMP_TIMXCEED_INTRANS
+# define ICMP_TIMXCEED_INTRANS 0
+#endif
+#ifndef ICMP_TIMXCEED_REASS
+# define ICMP_TIMXCEED_REASS 1
+#endif
+#ifndef ICMP_PARAMPROB
+# define ICMP_PARAMPROB 12
+#endif
+#ifndef ICMP_PARAMPROB_ERRATPTR
+# define ICMP_PARAMPROB_ERRATPTR 0
+#endif
+#ifndef ICMP_PARAMPROB_OPTABSENT
+# define ICMP_PARAMPROB_OPTABSENT 1
+#endif
+#ifndef ICMP_PARAMPROB_LENGTH
+# define ICMP_PARAMPROB_LENGTH 2
+#endif
+#ifndef ICMP_TSTAMP
+# define ICMP_TSTAMP 13
+#endif
+#ifndef ICMP_TSTAMPREPLY
+# define ICMP_TSTAMPREPLY 14
+#endif
+#ifndef ICMP_IREQ
+# define ICMP_IREQ 15
+#endif
+#ifndef ICMP_IREQREPLY
+# define ICMP_IREQREPLY 16
+#endif
+#ifndef ICMP_MASKREQ
+# define ICMP_MASKREQ 17
+#endif
+#ifndef ICMP_MASKREPLY
+# define ICMP_MASKREPLY 18
+#endif
+#ifndef ICMP_TRACEROUTE
+# define ICMP_TRACEROUTE 30
+#endif
+#ifndef ICMP_DATACONVERR
+# define ICMP_DATACONVERR 31
+#endif
+#ifndef ICMP_MOBILE_REDIRECT
+# define ICMP_MOBILE_REDIRECT 32
+#endif
+#ifndef ICMP_IPV6_WHEREAREYOU
+# define ICMP_IPV6_WHEREAREYOU 33
+#endif
+#ifndef ICMP_IPV6_IAMHERE
+# define ICMP_IPV6_IAMHERE 34
+#endif
+#ifndef ICMP_MOBILE_REGREQUEST
+# define ICMP_MOBILE_REGREQUEST 35
+#endif
+#ifndef ICMP_MOBILE_REGREPLY
+# define ICMP_MOBILE_REGREPLY 36
+#endif
+#ifndef ICMP_SKIP
+# define ICMP_SKIP 39
+#endif
+#ifndef ICMP_PHOTURIS
+# define ICMP_PHOTURIS 40
+#endif
+#ifndef ICMP_PHOTURIS_UNKNOWN_INDEX
+# define ICMP_PHOTURIS_UNKNOWN_INDEX 1
+#endif
+#ifndef ICMP_PHOTURIS_AUTH_FAILED
+# define ICMP_PHOTURIS_AUTH_FAILED 2
+#endif
+#ifndef ICMP_PHOTURIS_DECRYPT_FAILED
+# define ICMP_PHOTURIS_DECRYPT_FAILED 3
+#endif
+#ifndef IPVERSION
+# define IPVERSION 4
+#endif
+#ifndef IPOPT_MINOFF
+# define IPOPT_MINOFF 4
+#endif
+#ifndef IPOPT_COPIED
+# define IPOPT_COPIED(x) ((x)&0x80)
+#endif
+#ifndef IPOPT_EOL
+# define IPOPT_EOL 0
+#endif
+#ifndef IPOPT_NOP
+# define IPOPT_NOP 1
+#endif
+#ifndef IP_MF
+# define IP_MF ((u_short)0x2000)
+#endif
+#ifndef ETHERTYPE_IP
+# define ETHERTYPE_IP ((u_short)0x0800)
+#endif
+#ifndef TH_FIN
+# define TH_FIN 0x01
+#endif
+#ifndef TH_SYN
+# define TH_SYN 0x02
+#endif
+#ifndef TH_RST
+# define TH_RST 0x04
+#endif
+#ifndef TH_PUSH
+# define TH_PUSH 0x08
+#endif
+#ifndef TH_ACK
+# define TH_ACK 0x10
+#endif
+#ifndef TH_URG
+# define TH_URG 0x20
+#endif
+#undef TH_ACKMASK
+#define TH_ACKMASK (TH_FIN|TH_SYN|TH_RST|TH_ACK)
+
+#ifndef IPOPT_EOL
+# define IPOPT_EOL 0
+#endif
+#ifndef IPOPT_NOP
+# define IPOPT_NOP 1
+#endif
+#ifndef IPOPT_RR
+# define IPOPT_RR 7
+#endif
+#ifndef IPOPT_TS
+# define IPOPT_TS 68
+#endif
+#ifndef IPOPT_SECURITY
+# define IPOPT_SECURITY 130
+#endif
+#ifndef IPOPT_LSRR
+# define IPOPT_LSRR 131
+#endif
+#ifndef IPOPT_SATID
+# define IPOPT_SATID 136
+#endif
+#ifndef IPOPT_SSRR
+# define IPOPT_SSRR 137
+#endif
+#ifndef IPOPT_SECUR_UNCLASS
+# define IPOPT_SECUR_UNCLASS ((u_short)0x0000)
+#endif
+#ifndef IPOPT_SECUR_CONFID
+# define IPOPT_SECUR_CONFID ((u_short)0xf135)
+#endif
+#ifndef IPOPT_SECUR_EFTO
+# define IPOPT_SECUR_EFTO ((u_short)0x789a)
+#endif
+#ifndef IPOPT_SECUR_MMMM
+# define IPOPT_SECUR_MMMM ((u_short)0xbc4d)
+#endif
+#ifndef IPOPT_SECUR_RESTR
+# define IPOPT_SECUR_RESTR ((u_short)0xaf13)
+#endif
+#ifndef IPOPT_SECUR_SECRET
+# define IPOPT_SECUR_SECRET ((u_short)0xd788)
+#endif
+#ifndef IPOPT_SECUR_TOPSECRET
+# define IPOPT_SECUR_TOPSECRET ((u_short)0x6bc5)
+#endif
+#ifndef IPOPT_OLEN
+# define IPOPT_OLEN 1
+#endif
+#ifndef IPPROTO_HOPOPTS
+# define IPPROTO_HOPOPTS 0
+#endif
+#ifndef IPPROTO_ENCAP
+# define IPPROTO_ENCAP 4
+#endif
+#ifndef IPPROTO_IPV6
+# define IPPROTO_IPV6 41
+#endif
+#ifndef IPPROTO_ROUTING
+# define IPPROTO_ROUTING 43
+#endif
+#ifndef IPPROTO_FRAGMENT
+# define IPPROTO_FRAGMENT 44
+#endif
+#ifndef IPPROTO_GRE
+# define IPPROTO_GRE 47 /* GRE encaps RFC 1701 */
+#endif
+#ifndef IPPROTO_ESP
+# define IPPROTO_ESP 50
+#endif
+#ifndef IPPROTO_AH
+# define IPPROTO_AH 51
+#endif
+#ifndef IPPROTO_ICMPV6
+# define IPPROTO_ICMPV6 58
+#endif
+#ifndef IPPROTO_NONE
+# define IPPROTO_NONE 59
+#endif
+#ifndef IPPROTO_DSTOPTS
+# define IPPROTO_DSTOPTS 60
+#endif
+#ifndef IPPROTO_MOBILITY
+# define IPPROTO_MOBILITY 135
+#endif
+
+#ifndef ICMP_ROUTERADVERT
+# define ICMP_ROUTERADVERT 9
+#endif
+#ifndef ICMP_ROUTERSOLICIT
+# define ICMP_ROUTERSOLICIT 10
+#endif
+#ifndef ICMP6_DST_UNREACH
+# define ICMP6_DST_UNREACH 1
+#endif
+#ifndef ICMP6_PACKET_TOO_BIG
+# define ICMP6_PACKET_TOO_BIG 2
+#endif
+#ifndef ICMP6_TIME_EXCEEDED
+# define ICMP6_TIME_EXCEEDED 3
+#endif
+#ifndef ICMP6_PARAM_PROB
+# define ICMP6_PARAM_PROB 4
+#endif
+
+#ifndef ICMP6_ECHO_REQUEST
+# define ICMP6_ECHO_REQUEST 128
+#endif
+#ifndef ICMP6_ECHO_REPLY
+# define ICMP6_ECHO_REPLY 129
+#endif
+#ifndef ICMP6_MEMBERSHIP_QUERY
+# define ICMP6_MEMBERSHIP_QUERY 130
+#endif
+#ifndef MLD6_LISTENER_QUERY
+# define MLD6_LISTENER_QUERY 130
+#endif
+#ifndef ICMP6_MEMBERSHIP_REPORT
+# define ICMP6_MEMBERSHIP_REPORT 131
+#endif
+#ifndef MLD6_LISTENER_REPORT
+# define MLD6_LISTENER_REPORT 131
+#endif
+#ifndef ICMP6_MEMBERSHIP_REDUCTION
+# define ICMP6_MEMBERSHIP_REDUCTION 132
+#endif
+#ifndef MLD6_LISTENER_DONE
+# define MLD6_LISTENER_DONE 132
+#endif
+#ifndef ND_ROUTER_SOLICIT
+# define ND_ROUTER_SOLICIT 133
+#endif
+#ifndef ND_ROUTER_ADVERT
+# define ND_ROUTER_ADVERT 134
+#endif
+#ifndef ND_NEIGHBOR_SOLICIT
+# define ND_NEIGHBOR_SOLICIT 135
+#endif
+#ifndef ND_NEIGHBOR_ADVERT
+# define ND_NEIGHBOR_ADVERT 136
+#endif
+#ifndef ND_REDIRECT
+# define ND_REDIRECT 137
+#endif
+#ifndef ICMP6_ROUTER_RENUMBERING
+# define ICMP6_ROUTER_RENUMBERING 138
+#endif
+#ifndef ICMP6_WRUREQUEST
+# define ICMP6_WRUREQUEST 139
+#endif
+#ifndef ICMP6_WRUREPLY
+# define ICMP6_WRUREPLY 140
+#endif
+#ifndef ICMP6_FQDN_QUERY
+# define ICMP6_FQDN_QUERY 139
+#endif
+#ifndef ICMP6_FQDN_REPLY
+# define ICMP6_FQDN_REPLY 140
+#endif
+#ifndef ICMP6_NI_QUERY
+# define ICMP6_NI_QUERY 139
+#endif
+#ifndef ICMP6_NI_REPLY
+# define ICMP6_NI_REPLY 140
+#endif
+#ifndef MLD6_MTRACE_RESP
+# define MLD6_MTRACE_RESP 200
+#endif
+#ifndef MLD6_MTRACE
+# define MLD6_MTRACE 201
+#endif
+#ifndef ICMP6_HADISCOV_REQUEST
+# define ICMP6_HADISCOV_REQUEST 202
+#endif
+#ifndef ICMP6_HADISCOV_REPLY
+# define ICMP6_HADISCOV_REPLY 203
+#endif
+#ifndef ICMP6_MOBILEPREFIX_SOLICIT
+# define ICMP6_MOBILEPREFIX_SOLICIT 204
+#endif
+#ifndef ICMP6_MOBILEPREFIX_ADVERT
+# define ICMP6_MOBILEPREFIX_ADVERT 205
+#endif
+#ifndef ICMP6_MAXTYPE
+# define ICMP6_MAXTYPE 205
+#endif
+
+#ifndef ICMP6_DST_UNREACH_NOROUTE
+# define ICMP6_DST_UNREACH_NOROUTE 0
+#endif
+#ifndef ICMP6_DST_UNREACH_ADMIN
+# define ICMP6_DST_UNREACH_ADMIN 1
+#endif
+#ifndef ICMP6_DST_UNREACH_NOTNEIGHBOR
+# define ICMP6_DST_UNREACH_NOTNEIGHBOR 2
+#endif
+#ifndef ICMP6_DST_UNREACH_BEYONDSCOPE
+# define ICMP6_DST_UNREACH_BEYONDSCOPE 2
+#endif
+#ifndef ICMP6_DST_UNREACH_ADDR
+# define ICMP6_DST_UNREACH_ADDR 3
+#endif
+#ifndef ICMP6_DST_UNREACH_NOPORT
+# define ICMP6_DST_UNREACH_NOPORT 4
+#endif
+#ifndef ICMP6_TIME_EXCEED_TRANSIT
+# define ICMP6_TIME_EXCEED_TRANSIT 0
+#endif
+#ifndef ICMP6_TIME_EXCEED_REASSEMBLY
+# define ICMP6_TIME_EXCEED_REASSEMBLY 1
+#endif
+
+#ifndef ICMP6_NI_SUCCESS
+# define ICMP6_NI_SUCCESS 0
+#endif
+#ifndef ICMP6_NI_REFUSED
+# define ICMP6_NI_REFUSED 1
+#endif
+#ifndef ICMP6_NI_UNKNOWN
+# define ICMP6_NI_UNKNOWN 2
+#endif
+
+#ifndef ICMP6_ROUTER_RENUMBERING_COMMAND
+# define ICMP6_ROUTER_RENUMBERING_COMMAND 0
+#endif
+#ifndef ICMP6_ROUTER_RENUMBERING_RESULT
+# define ICMP6_ROUTER_RENUMBERING_RESULT 1
+#endif
+#ifndef ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET
+# define ICMP6_ROUTER_RENUMBERING_SEQNUM_RESET 255
+#endif
+
+#ifndef ICMP6_PARAMPROB_HEADER
+# define ICMP6_PARAMPROB_HEADER 0
+#endif
+#ifndef ICMP6_PARAMPROB_NEXTHEADER
+# define ICMP6_PARAMPROB_NEXTHEADER 1
+#endif
+#ifndef ICMP6_PARAMPROB_OPTION
+# define ICMP6_PARAMPROB_OPTION 2
+#endif
+
+#ifndef ICMP6_NI_SUBJ_IPV6
+# define ICMP6_NI_SUBJ_IPV6 0
+#endif
+#ifndef ICMP6_NI_SUBJ_FQDN
+# define ICMP6_NI_SUBJ_FQDN 1
+#endif
+#ifndef ICMP6_NI_SUBJ_IPV4
+# define ICMP6_NI_SUBJ_IPV4 2
+#endif
+
+/*
+ * ECN is a new addition to TCP - RFC 2481
+ */
+#ifndef TH_ECN
+# define TH_ECN 0x40
+#endif
+#ifndef TH_CWR
+# define TH_CWR 0x80
+#endif
+#define TH_ECNALL (TH_ECN|TH_CWR)
+
+/*
+ * TCP States
+ */
+#define IPF_TCPS_LISTEN 0 /* listening for connection */
+#define IPF_TCPS_SYN_SENT 1 /* active, have sent syn */
+#define IPF_TCPS_SYN_RECEIVED 2 /* have send and received syn */
+#define IPF_TCPS_HALF_ESTAB 3 /* for connections not fully "up" */
+/* states < IPF_TCPS_ESTABLISHED are those where connections not established */
+#define IPF_TCPS_ESTABLISHED 4 /* established */
+#define IPF_TCPS_CLOSE_WAIT 5 /* rcvd fin, waiting for close */
+/* states > IPF_TCPS_CLOSE_WAIT are those where user has closed */
+#define IPF_TCPS_FIN_WAIT_1 6 /* have closed, sent fin */
+#define IPF_TCPS_CLOSING 7 /* closed xchd FIN; await FIN ACK */
+#define IPF_TCPS_LAST_ACK 8 /* had fin and close; await FIN ACK */
+/* states > IPF_TCPS_CLOSE_WAIT && < IPF_TCPS_FIN_WAIT_2 await ACK of FIN */
+#define IPF_TCPS_FIN_WAIT_2 9 /* have closed, fin is acked */
+#define IPF_TCPS_TIME_WAIT 10 /* in 2*msl quiet wait after close */
+#define IPF_TCPS_CLOSED 11 /* closed */
+#define IPF_TCP_NSTATES 12
+
+#define TCP_MSL 120
+
+#undef ICMP_MAX_UNREACH
+#define ICMP_MAX_UNREACH 14
+#undef ICMP_MAXTYPE
+#define ICMP_MAXTYPE 18
+
+#ifndef IFNAMSIZ
+#define IFNAMSIZ 16
+#endif
+
+#ifndef LOG_FTP
+# define LOG_FTP (11<<3)
+#endif
+#ifndef LOG_AUTHPRIV
+# define LOG_AUTHPRIV (10<<3)
+#endif
+#ifndef LOG_AUDIT
+# define LOG_AUDIT (13<<3)
+#endif
+#ifndef LOG_NTP
+# define LOG_NTP (12<<3)
+#endif
+#ifndef LOG_SECURITY
+# define LOG_SECURITY (13<<3)
+#endif
+#ifndef LOG_LFMT
+# define LOG_LFMT (14<<3)
+#endif
+#ifndef LOG_CONSOLE
+# define LOG_CONSOLE (14<<3)
+#endif
+
+/*
+ * ICMP error replies have an IP header (20 bytes), 8 bytes of ICMP data,
+ * another IP header and then 64 bits of data, totalling 56. Of course,
+ * the last 64 bits is dependent on that being available.
+ */
+#define ICMPERR_ICMPHLEN 8
+#define ICMPERR_IPICMPHLEN (20 + 8)
+#define ICMPERR_MINPKTLEN (20 + 8 + 20)
+#define ICMPERR_MAXPKTLEN (20 + 8 + 20 + 8)
+#define ICMP6ERR_MINPKTLEN (40 + 8)
+#define ICMP6ERR_IPICMPHLEN (40 + 8 + 40)
+
+#ifndef MIN
+# define MIN(a,b) (((a)<(b))?(a):(b))
+#endif
+
+#ifdef IPF_DEBUG
+# define DPRINT(x) printf x
+#else
+# define DPRINT(x)
+#endif
+
+#ifdef RESCUE
+# undef IPFILTER_BPF
+#endif
+
+#endif /* __IP_COMPAT_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_fil.h b/sys/contrib/ipfilter/netinet/ip_fil.h
new file mode 100644
index 0000000..dc5a473
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_fil.h
@@ -0,0 +1,1551 @@
+/*
+ * Copyright (C) 1993-2001, 2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * @(#)ip_fil.h 1.35 6/5/96
+ * $FreeBSD$
+ * Id: ip_fil.h,v 2.170.2.29 2006/03/29 11:19:55 darrenr Exp $
+ */
+
+#ifndef __IP_FIL_H__
+#define __IP_FIL_H__
+
+#include "netinet/ip_compat.h"
+
+#ifndef SOLARIS
+# define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+#endif
+
+#ifndef __P
+# ifdef __STDC__
+# define __P(x) x
+# else
+# define __P(x) ()
+# endif
+#endif
+
+#if defined(__STDC__) || defined(__GNUC__) || defined(_AIX51)
+# define SIOCADAFR _IOW('r', 60, struct ipfobj)
+# define SIOCRMAFR _IOW('r', 61, struct ipfobj)
+# define SIOCSETFF _IOW('r', 62, u_int)
+# define SIOCGETFF _IOR('r', 63, u_int)
+# define SIOCGETFS _IOWR('r', 64, struct ipfobj)
+# define SIOCIPFFL _IOWR('r', 65, int)
+# define SIOCIPFFB _IOR('r', 66, int)
+# define SIOCADIFR _IOW('r', 67, struct ipfobj)
+# define SIOCRMIFR _IOW('r', 68, struct ipfobj)
+# define SIOCSWAPA _IOR('r', 69, u_int)
+# define SIOCINAFR _IOW('r', 70, struct ipfobj)
+# define SIOCINIFR _IOW('r', 71, struct ipfobj)
+# define SIOCFRENB _IOW('r', 72, u_int)
+# define SIOCFRSYN _IOW('r', 73, u_int)
+# define SIOCFRZST _IOWR('r', 74, struct ipfobj)
+# define SIOCZRLST _IOWR('r', 75, struct ipfobj)
+# define SIOCAUTHW _IOWR('r', 76, struct ipfobj)
+# define SIOCAUTHR _IOWR('r', 77, struct ipfobj)
+# define SIOCSTAT1 _IOWR('r', 78, struct ipfobj)
+# define SIOCSTLCK _IOWR('r', 79, u_int)
+# define SIOCSTPUT _IOWR('r', 80, struct ipfobj)
+# define SIOCSTGET _IOWR('r', 81, struct ipfobj)
+# define SIOCSTGSZ _IOWR('r', 82, struct ipfobj)
+# define SIOCSTAT2 _IOWR('r', 83, struct ipfobj)
+# define SIOCSETLG _IOWR('r', 84, int)
+# define SIOCGETLG _IOWR('r', 85, int)
+# define SIOCFUNCL _IOWR('r', 86, struct ipfunc_resolve)
+# define SIOCIPFGETNEXT _IOWR('r', 87, struct ipfobj)
+# define SIOCIPFGET _IOWR('r', 88, struct ipfobj)
+# define SIOCIPFSET _IOWR('r', 89, struct ipfobj)
+# define SIOCIPFL6 _IOWR('r', 90, int)
+# define SIOCIPFITER _IOWR('r', 91, struct ipfobj)
+# define SIOCGENITER _IOWR('r', 92, struct ipfobj)
+# define SIOCGTABL _IOWR('r', 93, struct ipfobj)
+# define SIOCIPFDELTOK _IOWR('r', 94, int)
+# define SIOCLOOKUPITER _IOWR('r', 95, struct ipfobj)
+# define SIOCGTQTAB _IOWR('r', 96, struct ipfobj)
+#else
+# define SIOCADAFR _IOW(r, 60, struct ipfobj)
+# define SIOCRMAFR _IOW(r, 61, struct ipfobj)
+# define SIOCSETFF _IOW(r, 62, u_int)
+# define SIOCGETFF _IOR(r, 63, u_int)
+# define SIOCGETFS _IOWR(r, 64, struct ipfobj)
+# define SIOCIPFFL _IOWR(r, 65, int)
+# define SIOCIPFFB _IOR(r, 66, int)
+# define SIOCADIFR _IOW(r, 67, struct ipfobj)
+# define SIOCRMIFR _IOW(r, 68, struct ipfobj)
+# define SIOCSWAPA _IOR(r, 69, u_int)
+# define SIOCINAFR _IOW(r, 70, struct ipfobj)
+# define SIOCINIFR _IOW(r, 71, struct ipfobj)
+# define SIOCFRENB _IOW(r, 72, u_int)
+# define SIOCFRSYN _IOW(r, 73, u_int)
+# define SIOCFRZST _IOWR(r, 74, struct ipfobj)
+# define SIOCZRLST _IOWR(r, 75, struct ipfobj)
+# define SIOCAUTHW _IOWR(r, 76, struct ipfobj)
+# define SIOCAUTHR _IOWR(r, 77, struct ipfobj)
+# define SIOCSTAT1 _IOWR(r, 78, struct ipfobj)
+# define SIOCSTLCK _IOWR(r, 79, u_int)
+# define SIOCSTPUT _IOWR(r, 80, struct ipfobj)
+# define SIOCSTGET _IOWR(r, 81, struct ipfobj)
+# define SIOCSTGSZ _IOWR(r, 82, struct ipfobj)
+# define SIOCSTAT2 _IOWR(r, 83, struct ipfobj)
+# define SIOCSETLG _IOWR(r, 84, int)
+# define SIOCGETLG _IOWR(r, 85, int)
+# define SIOCFUNCL _IOWR(r, 86, struct ipfunc_resolve)
+# define SIOCIPFGETNEXT _IOWR(r, 87, struct ipfobj)
+# define SIOCIPFGET _IOWR(r, 88, struct ipfobj)
+# define SIOCIPFSET _IOWR(r, 89, struct ipfobj)
+# define SIOCIPFL6 _IOWR(r, 90, int)
+# define SIOCIPFITER _IOWR(r, 91, struct ipfobj)
+# define SIOCGENITER _IOWR(r, 92, struct ipfobj)
+# define SIOCGTABL _IOWR(r, 93, struct ipfobj)
+# define SIOCIPFDELTOK _IOWR(r, 94, int)
+# define SIOCLOOKUPITER _IOWR(r, 95, struct ipfobj)
+# define SIOCGTQTAB _IOWR(r, 96, struct ipfobj)
+#endif
+#define SIOCADDFR SIOCADAFR
+#define SIOCDELFR SIOCRMAFR
+#define SIOCINSFR SIOCINAFR
+#define SIOCATHST SIOCSTAT1
+#define SIOCGFRST SIOCSTAT2
+
+
+struct ipscan;
+struct ifnet;
+
+
+typedef int (* lookupfunc_t) __P((void *, int, void *));
+
+/*
+ * i6addr is used as a container for both IPv4 and IPv6 addresses, as well
+ * as other types of objects, depending on its qualifier.
+ */
+#ifdef USE_INET6
+typedef union i6addr {
+ u_32_t i6[4];
+ struct in_addr in4;
+ struct in6_addr in6;
+ void *vptr[2];
+ lookupfunc_t lptr[2];
+ struct {
+ u_short type;
+ u_short subtype;
+ char label[12];
+ } i6un;
+} i6addr_t;
+#else
+typedef union i6addr {
+ u_32_t i6[4];
+ struct in_addr in4;
+ void *vptr[2];
+ lookupfunc_t lptr[2];
+ struct {
+ u_short type;
+ u_short subtype;
+ char label[12];
+ } i6un;
+} i6addr_t;
+#endif
+
+#define in4_addr in4.s_addr
+#define iplookupnum i6[1]
+#define iplookupname i6un.label
+#define iplookuptype i6un.type
+#define iplookupsubtype i6un.subtype
+/*
+ * NOTE: These DO overlap the above on 64bit systems and this IS recognised.
+ */
+#define iplookupptr vptr[0]
+#define iplookupfunc lptr[1]
+
+#define I60(x) (((i6addr_t *)(x))->i6[0])
+#define I61(x) (((i6addr_t *)(x))->i6[1])
+#define I62(x) (((i6addr_t *)(x))->i6[2])
+#define I63(x) (((i6addr_t *)(x))->i6[3])
+#define HI60(x) ntohl(((i6addr_t *)(x))->i6[0])
+#define HI61(x) ntohl(((i6addr_t *)(x))->i6[1])
+#define HI62(x) ntohl(((i6addr_t *)(x))->i6[2])
+#define HI63(x) ntohl(((i6addr_t *)(x))->i6[3])
+
+#define IP6_EQ(a,b) ((I63(a) == I63(b)) && (I62(a) == I62(b)) && \
+ (I61(a) == I61(b)) && (I60(a) == I60(b)))
+#define IP6_NEQ(a,b) ((I63(a) != I63(b)) || (I62(a) != I62(b)) || \
+ (I61(a) != I61(b)) || (I60(a) != I60(b)))
+#define IP6_ISZERO(a) ((I60(a) | I61(a) | I62(a) | I63(a)) == 0)
+#define IP6_NOTZERO(a) ((I60(a) | I61(a) | I62(a) | I63(a)) != 0)
+#define IP6_GT(a,b) (HI60(a) > HI60(b) || (HI60(a) == HI60(b) && \
+ (HI61(a) > HI61(b) || (HI61(a) == HI61(b) && \
+ (HI62(a) > HI62(b) || (HI62(a) == HI62(b) && \
+ HI63(a) > HI63(b)))))))
+#define IP6_LT(a,b) (HI60(a) < HI60(b) || (HI60(a) == HI60(b) && \
+ (HI61(a) < HI61(b) || (HI61(a) == HI61(b) && \
+ (HI62(a) < HI62(b) || (HI62(a) == HI62(b) && \
+ HI63(a) < HI63(b)))))))
+#define NLADD(n,x) htonl(ntohl(n) + (x))
+#define IP6_INC(a) \
+ { i6addr_t *_i6 = (i6addr_t *)(a); \
+ _i6->i6[0] = NLADD(_i6->i6[0], 1); \
+ if (_i6->i6[0] == 0) { \
+ _i6->i6[0] = NLADD(_i6->i6[1], 1); \
+ if (_i6->i6[1] == 0) { \
+ _i6->i6[0] = NLADD(_i6->i6[2], 1); \
+ if (_i6->i6[2] == 0) { \
+ _i6->i6[0] = NLADD(_i6->i6[3], 1); \
+ } \
+ } \
+ } \
+ }
+#define IP6_ADD(a,x,d) \
+ { i6addr_t *_s = (i6addr_t *)(a); \
+ i6addr_t *_d = (i6addr_t *)(d); \
+ _d->i6[0] = NLADD(_s->i6[0], x); \
+ if (ntohl(_d->i6[0]) < ntohl(_s->i6[0])) { \
+ _d->i6[1] = NLADD(_d->i6[1], 1); \
+ if (ntohl(_d->i6[1]) < ntohl(_s->i6[1])) { \
+ _d->i6[2] = NLADD(_d->i6[2], 1); \
+ if (ntohl(_d->i6[2]) < ntohl(_s->i6[2])) { \
+ _d->i6[3] = NLADD(_d->i6[3], 1); \
+ } \
+ } \
+ } \
+ }
+#define IP6_AND(a,b,d) { i6addr_t *_s1 = (i6addr_t *)(a); \
+ i6addr_t *_s2 = (i6addr_t *)(d); \
+ i6addr_t *_d = (i6addr_t *)(d); \
+ _d->i6[0] = _s1->i6[0] & _s2->i6[0]; \
+ _d->i6[1] = _s1->i6[1] & _s2->i6[1]; \
+ _d->i6[2] = _s1->i6[2] & _s2->i6[2]; \
+ _d->i6[3] = _s1->i6[3] & _s2->i6[3]; \
+ }
+#define IP6_MERGE(a,b,c) \
+ { i6addr_t *_d, *_s1, *_s2; \
+ _d = (i6addr_t *)(a); \
+ _s1 = (i6addr_t *)(b); \
+ _s2 = (i6addr_t *)(c); \
+ _d->i6[0] |= _s1->i6[0] & ~_s2->i6[0]; \
+ _d->i6[1] |= _s1->i6[1] & ~_s2->i6[1]; \
+ _d->i6[2] |= _s1->i6[2] & ~_s2->i6[2]; \
+ _d->i6[2] |= _s1->i6[3] & ~_s2->i6[3]; \
+ }
+
+
+typedef struct fr_ip {
+ u_32_t fi_v:4; /* IP version */
+ u_32_t fi_xx:4; /* spare */
+ u_32_t fi_tos:8; /* IP packet TOS */
+ u_32_t fi_ttl:8; /* IP packet TTL */
+ u_32_t fi_p:8; /* IP packet protocol */
+ u_32_t fi_optmsk; /* bitmask composed from IP options */
+ i6addr_t fi_src; /* source address from packet */
+ i6addr_t fi_dst; /* destination address from packet */
+ u_short fi_secmsk; /* bitmask composed from IP security options */
+ u_short fi_auth; /* authentication code from IP sec. options */
+ u_32_t fi_flx; /* packet flags */
+ u_32_t fi_tcpmsk; /* TCP options set/reset */
+ u_32_t fi_res1; /* RESERVED */
+} fr_ip_t;
+
+/*
+ * For use in fi_flx
+ */
+#define FI_TCPUDP 0x0001 /* TCP/UCP implied comparison*/
+#define FI_OPTIONS 0x0002
+#define FI_FRAG 0x0004
+#define FI_SHORT 0x0008
+#define FI_NATED 0x0010
+#define FI_MULTICAST 0x0020
+#define FI_BROADCAST 0x0040
+#define FI_MBCAST 0x0080
+#define FI_STATE 0x0100
+#define FI_BADNAT 0x0200
+#define FI_BAD 0x0400
+#define FI_OOW 0x0800 /* Out of state window, else match */
+#define FI_ICMPERR 0x1000
+#define FI_FRAGBODY 0x2000
+#define FI_BADSRC 0x4000
+#define FI_LOWTTL 0x8000
+#define FI_CMP 0xcfe3 /* Not FI_FRAG,FI_NATED,FI_FRAGTAIL */
+#define FI_ICMPCMP 0x0003 /* Flags we can check for ICMP error packets */
+#define FI_WITH 0xeffe /* Not FI_TCPUDP */
+#define FI_V6EXTHDR 0x10000
+#define FI_COALESCE 0x20000
+#define FI_NOCKSUM 0x20000000 /* don't do a L4 checksum validation */
+#define FI_DONTCACHE 0x40000000 /* don't cache the result */
+#define FI_IGNORE 0x80000000
+
+#define fi_saddr fi_src.in4.s_addr
+#define fi_daddr fi_dst.in4.s_addr
+#define fi_srcnum fi_src.iplookupnum
+#define fi_dstnum fi_dst.iplookupnum
+#define fi_srcname fi_src.iplookupname
+#define fi_dstname fi_dst.iplookupname
+#define fi_srctype fi_src.iplookuptype
+#define fi_dsttype fi_dst.iplookuptype
+#define fi_srcsubtype fi_src.iplookupsubtype
+#define fi_dstsubtype fi_dst.iplookupsubtype
+#define fi_srcptr fi_src.iplookupptr
+#define fi_dstptr fi_dst.iplookupptr
+#define fi_srcfunc fi_src.iplookupfunc
+#define fi_dstfunc fi_dst.iplookupfunc
+
+
+/*
+ * These are both used by the state and NAT code to indicate that one port or
+ * the other should be treated as a wildcard.
+ * NOTE: When updating, check bit masks in ip_state.h and update there too.
+ */
+#define SI_W_SPORT 0x00000100
+#define SI_W_DPORT 0x00000200
+#define SI_WILDP (SI_W_SPORT|SI_W_DPORT)
+#define SI_W_SADDR 0x00000400
+#define SI_W_DADDR 0x00000800
+#define SI_WILDA (SI_W_SADDR|SI_W_DADDR)
+#define SI_NEWFR 0x00001000
+#define SI_CLONE 0x00002000
+#define SI_CLONED 0x00004000
+
+
+typedef struct fr_info {
+ void *fin_ifp; /* interface packet is `on' */
+ fr_ip_t fin_fi; /* IP Packet summary */
+ union {
+ u_short fid_16[2]; /* TCP/UDP ports, ICMP code/type */
+ u_32_t fid_32;
+ } fin_dat;
+ int fin_out; /* in or out ? 1 == out, 0 == in */
+ int fin_rev; /* state only: 1 = reverse */
+ u_short fin_hlen; /* length of IP header in bytes */
+ u_char fin_tcpf; /* TCP header flags (SYN, ACK, etc) */
+ u_char fin_icode; /* ICMP error to return */
+ u_32_t fin_rule; /* rule # last matched */
+ char fin_group[FR_GROUPLEN]; /* group number, -1 for none */
+ struct frentry *fin_fr; /* last matching rule */
+ void *fin_dp; /* start of data past IP header */
+ int fin_dlen; /* length of data portion of packet */
+ int fin_plen;
+ int fin_ipoff; /* # bytes from buffer start to hdr */
+ u_short fin_id; /* IP packet id field */
+ u_short fin_off;
+ int fin_depth; /* Group nesting depth */
+ int fin_error; /* Error code to return */
+ void *fin_nat;
+ void *fin_state;
+ void *fin_nattag;
+ void *fin_exthdr;
+ ip_t *fin_ip;
+ mb_t **fin_mp; /* pointer to pointer to mbuf */
+ mb_t *fin_m; /* pointer to mbuf */
+#ifdef MENTAT
+ mb_t *fin_qfm; /* pointer to mblk where pkt starts */
+ void *fin_qpi;
+ char fin_ifname[LIFNAMSIZ];
+#endif
+#ifdef __sgi
+ void *fin_hbuf;
+#endif
+} fr_info_t;
+
+#define fin_v fin_fi.fi_v
+#define fin_p fin_fi.fi_p
+#define fin_flx fin_fi.fi_flx
+#define fin_optmsk fin_fi.fi_optmsk
+#define fin_secmsk fin_fi.fi_secmsk
+#define fin_auth fin_fi.fi_auth
+#define fin_src fin_fi.fi_src.in4
+#define fin_src6 fin_fi.fi_src.in6
+#define fin_saddr fin_fi.fi_saddr
+#define fin_dst fin_fi.fi_dst.in4
+#define fin_dst6 fin_fi.fi_dst.in6
+#define fin_daddr fin_fi.fi_daddr
+#define fin_data fin_dat.fid_16
+#define fin_sport fin_dat.fid_16[0]
+#define fin_dport fin_dat.fid_16[1]
+#define fin_ports fin_dat.fid_32
+
+#define IPF_IN 0
+#define IPF_OUT 1
+
+typedef struct frentry *(*ipfunc_t) __P((fr_info_t *, u_32_t *));
+typedef int (*ipfuncinit_t) __P((struct frentry *));
+
+typedef struct ipfunc_resolve {
+ char ipfu_name[32];
+ ipfunc_t ipfu_addr;
+ ipfuncinit_t ipfu_init;
+} ipfunc_resolve_t;
+
+/*
+ * Size for compares on fr_info structures
+ */
+#define FI_CSIZE offsetof(fr_info_t, fin_icode)
+#define FI_LCSIZE offsetof(fr_info_t, fin_dp)
+
+/*
+ * Size for copying cache fr_info structure
+ */
+#define FI_COPYSIZE offsetof(fr_info_t, fin_dp)
+
+/*
+ * Structure for holding IPFilter's tag information
+ */
+#define IPFTAG_LEN 16
+typedef struct {
+ union {
+ u_32_t iptu_num[4];
+ char iptu_tag[IPFTAG_LEN];
+ } ipt_un;
+ int ipt_not;
+} ipftag_t;
+
+#define ipt_tag ipt_un.iptu_tag
+#define ipt_num ipt_un.iptu_num
+
+
+/*
+ * This structure is used to hold information about the next hop for where
+ * to forward a packet.
+ */
+typedef struct frdest {
+ void *fd_ifp;
+ i6addr_t fd_ip6;
+ char fd_ifname[LIFNAMSIZ];
+} frdest_t;
+
+#define fd_ip fd_ip6.in4
+
+
+/*
+ * This structure holds information about a port comparison.
+ */
+typedef struct frpcmp {
+ int frp_cmp; /* data for port comparisons */
+ u_short frp_port; /* top port for <> and >< */
+ u_short frp_top; /* top port for <> and >< */
+} frpcmp_t;
+
+#define FR_NONE 0
+#define FR_EQUAL 1
+#define FR_NEQUAL 2
+#define FR_LESST 3
+#define FR_GREATERT 4
+#define FR_LESSTE 5
+#define FR_GREATERTE 6
+#define FR_OUTRANGE 7
+#define FR_INRANGE 8
+#define FR_INCRANGE 9
+
+/*
+ * Structure containing all the relevant TCP things that can be checked in
+ * a filter rule.
+ */
+typedef struct frtuc {
+ u_char ftu_tcpfm; /* tcp flags mask */
+ u_char ftu_tcpf; /* tcp flags */
+ frpcmp_t ftu_src;
+ frpcmp_t ftu_dst;
+} frtuc_t;
+
+#define ftu_scmp ftu_src.frp_cmp
+#define ftu_dcmp ftu_dst.frp_cmp
+#define ftu_sport ftu_src.frp_port
+#define ftu_dport ftu_dst.frp_port
+#define ftu_stop ftu_src.frp_top
+#define ftu_dtop ftu_dst.frp_top
+
+#define FR_TCPFMAX 0x3f
+
+/*
+ * This structure makes up what is considered to be the IPFilter specific
+ * matching components of a filter rule, as opposed to the data structures
+ * used to define the result which are in frentry_t and not here.
+ */
+typedef struct fripf {
+ fr_ip_t fri_ip;
+ fr_ip_t fri_mip; /* mask structure */
+
+ u_short fri_icmpm; /* data for ICMP packets (mask) */
+ u_short fri_icmp;
+
+ frtuc_t fri_tuc;
+ int fri_satype; /* addres type */
+ int fri_datype; /* addres type */
+ int fri_sifpidx; /* doing dynamic addressing */
+ int fri_difpidx; /* index into fr_ifps[] to use when */
+} fripf_t;
+
+#define fri_dlookup fri_mip.fi_dst
+#define fri_slookup fri_mip.fi_src
+#define fri_dstnum fri_mip.fi_dstnum
+#define fri_srcnum fri_mip.fi_srcnum
+#define fri_dstname fri_mip.fi_dstname
+#define fri_srcname fri_mip.fi_srcname
+#define fri_dstptr fri_mip.fi_dstptr
+#define fri_srcptr fri_mip.fi_srcptr
+
+#define FRI_NORMAL 0 /* Normal address */
+#define FRI_DYNAMIC 1 /* dynamic address */
+#define FRI_LOOKUP 2 /* address is a pool # */
+#define FRI_RANGE 3 /* address/mask is a range */
+#define FRI_NETWORK 4 /* network address from if */
+#define FRI_BROADCAST 5 /* broadcast address from if */
+#define FRI_PEERADDR 6 /* Peer address for P-to-P */
+#define FRI_NETMASKED 7 /* network address with netmask from if */
+
+
+typedef struct frentry * (* frentfunc_t) __P((fr_info_t *));
+
+typedef struct frentry {
+ ipfmutex_t fr_lock;
+ struct frentry *fr_next;
+ struct frentry **fr_grp;
+ struct ipscan *fr_isc;
+ void *fr_ifas[4];
+ void *fr_ptr; /* for use with fr_arg */
+ char *fr_comment; /* text comment for rule */
+ int fr_ref; /* reference count - for grouping */
+ int fr_statecnt; /* state count - for limit rules */
+ /*
+ * The line number from a file is here because we need to be able to
+ * match the rule generated with ``grep rule ipf.conf | ipf -rf -''
+ * with the rule loaded using ``ipf -f ipf.conf'' - thus it can't be
+ * on the other side of fr_func.
+ */
+ int fr_flineno; /* line number from conf file */
+ /*
+ * These are only incremented when a packet matches this rule and
+ * it is the last match
+ */
+ U_QUAD_T fr_hits;
+ U_QUAD_T fr_bytes;
+
+ /*
+ * For PPS rate limiting
+ */
+ struct timeval fr_lastpkt;
+ int fr_curpps;
+
+ union {
+ void *fru_data;
+ caddr_t fru_caddr;
+ fripf_t *fru_ipf;
+ frentfunc_t fru_func;
+ } fr_dun;
+
+ /*
+ * Fields after this may not change whilst in the kernel.
+ */
+ ipfunc_t fr_func; /* call this function */
+ int fr_dsize;
+ int fr_pps;
+ int fr_statemax; /* max reference count */
+ u_32_t fr_type;
+ u_32_t fr_flags; /* per-rule flags && options (see below) */
+ u_32_t fr_logtag; /* user defined log tag # */
+ u_32_t fr_collect; /* collection number */
+ u_int fr_arg; /* misc. numeric arg for rule */
+ u_int fr_loglevel; /* syslog log facility + priority */
+ u_int fr_age[2]; /* non-TCP timeouts */
+ u_char fr_v;
+ u_char fr_icode; /* return ICMP code */
+ char fr_group[FR_GROUPLEN]; /* group to which this rule belongs */
+ char fr_grhead[FR_GROUPLEN]; /* group # which this rule starts */
+ ipftag_t fr_nattag;
+ char fr_ifnames[4][LIFNAMSIZ];
+ char fr_isctag[16];
+ frdest_t fr_tifs[2]; /* "to"/"reply-to" interface */
+ frdest_t fr_dif; /* duplicate packet interface */
+ /*
+ * This must be last and will change after loaded into the kernel.
+ */
+ u_int fr_cksum; /* checksum on filter rules for performance */
+} frentry_t;
+
+#define fr_caddr fr_dun.fru_caddr
+#define fr_data fr_dun.fru_data
+#define fr_dfunc fr_dun.fru_func
+#define fr_ipf fr_dun.fru_ipf
+#define fr_ip fr_ipf->fri_ip
+#define fr_mip fr_ipf->fri_mip
+#define fr_icmpm fr_ipf->fri_icmpm
+#define fr_icmp fr_ipf->fri_icmp
+#define fr_tuc fr_ipf->fri_tuc
+#define fr_satype fr_ipf->fri_satype
+#define fr_datype fr_ipf->fri_datype
+#define fr_sifpidx fr_ipf->fri_sifpidx
+#define fr_difpidx fr_ipf->fri_difpidx
+#define fr_proto fr_ip.fi_p
+#define fr_mproto fr_mip.fi_p
+#define fr_ttl fr_ip.fi_ttl
+#define fr_mttl fr_mip.fi_ttl
+#define fr_tos fr_ip.fi_tos
+#define fr_mtos fr_mip.fi_tos
+#define fr_tcpfm fr_tuc.ftu_tcpfm
+#define fr_tcpf fr_tuc.ftu_tcpf
+#define fr_scmp fr_tuc.ftu_scmp
+#define fr_dcmp fr_tuc.ftu_dcmp
+#define fr_dport fr_tuc.ftu_dport
+#define fr_sport fr_tuc.ftu_sport
+#define fr_stop fr_tuc.ftu_stop
+#define fr_dtop fr_tuc.ftu_dtop
+#define fr_dst fr_ip.fi_dst.in4
+#define fr_daddr fr_ip.fi_dst.in4.s_addr
+#define fr_src fr_ip.fi_src.in4
+#define fr_saddr fr_ip.fi_src.in4.s_addr
+#define fr_dmsk fr_mip.fi_dst.in4
+#define fr_dmask fr_mip.fi_dst.in4.s_addr
+#define fr_smsk fr_mip.fi_src.in4
+#define fr_smask fr_mip.fi_src.in4.s_addr
+#define fr_dstnum fr_ip.fi_dstnum
+#define fr_srcnum fr_ip.fi_srcnum
+#define fr_dlookup fr_ip.fi_dst
+#define fr_slookup fr_ip.fi_src
+#define fr_dstname fr_ip.fi_dstname
+#define fr_srcname fr_ip.fi_srcname
+#define fr_dsttype fr_ip.fi_dsttype
+#define fr_srctype fr_ip.fi_srctype
+#define fr_dstsubtype fr_ip.fi_dstsubtype
+#define fr_srcsubtype fr_ip.fi_srcsubtype
+#define fr_dstptr fr_mip.fi_dstptr
+#define fr_srcptr fr_mip.fi_srcptr
+#define fr_dstfunc fr_mip.fi_dstfunc
+#define fr_srcfunc fr_mip.fi_srcfunc
+#define fr_optbits fr_ip.fi_optmsk
+#define fr_optmask fr_mip.fi_optmsk
+#define fr_secbits fr_ip.fi_secmsk
+#define fr_secmask fr_mip.fi_secmsk
+#define fr_authbits fr_ip.fi_auth
+#define fr_authmask fr_mip.fi_auth
+#define fr_flx fr_ip.fi_flx
+#define fr_mflx fr_mip.fi_flx
+#define fr_ifname fr_ifnames[0]
+#define fr_oifname fr_ifnames[2]
+#define fr_ifa fr_ifas[0]
+#define fr_oifa fr_ifas[2]
+#define fr_tif fr_tifs[0]
+#define fr_rif fr_tifs[1]
+
+#define FR_NOLOGTAG 0
+
+#ifndef offsetof
+#define offsetof(t,m) (int)((&((t *)0L)->m))
+#endif
+#define FR_CMPSIZ (sizeof(struct frentry) - \
+ offsetof(struct frentry, fr_func))
+
+/*
+ * fr_type
+ */
+#define FR_T_NONE 0
+#define FR_T_IPF 1 /* IPF structures */
+#define FR_T_BPFOPC 2 /* BPF opcode */
+#define FR_T_CALLFUNC 3 /* callout to function in fr_func only */
+#define FR_T_COMPIPF 4 /* compiled C code */
+#define FR_T_BUILTIN 0x80000000 /* rule is in kernel space */
+
+/*
+ * fr_flags
+ */
+#define FR_CALL 0x00000 /* call rule */
+#define FR_BLOCK 0x00001 /* do not allow packet to pass */
+#define FR_PASS 0x00002 /* allow packet to pass */
+#define FR_AUTH 0x00003 /* use authentication */
+#define FR_PREAUTH 0x00004 /* require preauthentication */
+#define FR_ACCOUNT 0x00005 /* Accounting rule */
+#define FR_SKIP 0x00006 /* skip rule */
+#define FR_DIVERT 0x00007 /* divert rule */
+#define FR_CMDMASK 0x0000f
+#define FR_LOG 0x00010 /* Log */
+#define FR_LOGB 0x00011 /* Log-fail */
+#define FR_LOGP 0x00012 /* Log-pass */
+#define FR_LOGMASK (FR_LOG|FR_CMDMASK)
+#define FR_CALLNOW 0x00020 /* call another function (fr_func) if matches */
+#define FR_NOTSRCIP 0x00040
+#define FR_NOTDSTIP 0x00080
+#define FR_QUICK 0x00100 /* match & stop processing list */
+#define FR_KEEPFRAG 0x00200 /* keep fragment information */
+#define FR_KEEPSTATE 0x00400 /* keep `connection' state information */
+#define FR_FASTROUTE 0x00800 /* bypass normal routing */
+#define FR_RETRST 0x01000 /* Return TCP RST packet - reset connection */
+#define FR_RETICMP 0x02000 /* Return ICMP unreachable packet */
+#define FR_FAKEICMP 0x03000 /* Return ICMP unreachable with fake source */
+#define FR_OUTQUE 0x04000 /* outgoing packets */
+#define FR_INQUE 0x08000 /* ingoing packets */
+#define FR_LOGBODY 0x10000 /* Log the body */
+#define FR_LOGFIRST 0x20000 /* Log the first byte if state held */
+#define FR_LOGORBLOCK 0x40000 /* block the packet if it can't be logged */
+#define FR_DUP 0x80000 /* duplicate packet */
+#define FR_FRSTRICT 0x100000 /* strict frag. cache */
+#define FR_STSTRICT 0x200000 /* strict keep state */
+#define FR_NEWISN 0x400000 /* new ISN for outgoing TCP */
+#define FR_NOICMPERR 0x800000 /* do not match ICMP errors in state */
+#define FR_STATESYNC 0x1000000 /* synchronize state to slave */
+#define FR_NOMATCH 0x8000000 /* no match occured */
+ /* 0x10000000 FF_LOGPASS */
+ /* 0x20000000 FF_LOGBLOCK */
+ /* 0x40000000 FF_LOGNOMATCH */
+ /* 0x80000000 FF_BLOCKNONIP */
+#define FR_COPIED 0x40000000 /* copied from user space */
+#define FR_INACTIVE 0x80000000 /* only used when flush'ing rules */
+
+#define FR_RETMASK (FR_RETICMP|FR_RETRST|FR_FAKEICMP)
+#define FR_ISBLOCK(x) (((x) & FR_CMDMASK) == FR_BLOCK)
+#define FR_ISPASS(x) (((x) & FR_CMDMASK) == FR_PASS)
+#define FR_ISAUTH(x) (((x) & FR_CMDMASK) == FR_AUTH)
+#define FR_ISPREAUTH(x) (((x) & FR_CMDMASK) == FR_PREAUTH)
+#define FR_ISACCOUNT(x) (((x) & FR_CMDMASK) == FR_ACCOUNT)
+#define FR_ISSKIP(x) (((x) & FR_CMDMASK) == FR_SKIP)
+#define FR_ISNOMATCH(x) ((x) & FR_NOMATCH)
+#define FR_INOUT (FR_INQUE|FR_OUTQUE)
+
+/*
+ * recognized flags for SIOCGETFF and SIOCSETFF, and get put in fr_flags
+ */
+#define FF_LOGPASS 0x10000000
+#define FF_LOGBLOCK 0x20000000
+#define FF_LOGNOMATCH 0x40000000
+#define FF_LOGGING (FF_LOGPASS|FF_LOGBLOCK|FF_LOGNOMATCH)
+#define FF_BLOCKNONIP 0x80000000 /* Solaris2 Only */
+
+
+/*
+ * Structure that passes information on what/how to flush to the kernel.
+ */
+typedef struct ipfflush {
+ int ipflu_how;
+ int ipflu_arg;
+} ipfflush_t;
+
+
+/*
+ *
+ */
+typedef struct ipfgetctl {
+ u_int ipfg_min; /* min value */
+ u_int ipfg_current; /* current value */
+ u_int ipfg_max; /* max value */
+ u_int ipfg_default; /* default value */
+ u_int ipfg_steps; /* value increments */
+ char ipfg_name[40]; /* tag name for this control */
+} ipfgetctl_t;
+
+typedef struct ipfsetctl {
+ int ipfs_which; /* 0 = min 1 = current 2 = max 3 = default */
+ u_int ipfs_value; /* min value */
+ char ipfs_name[40]; /* tag name for this control */
+} ipfsetctl_t;
+
+
+/*
+ * Some of the statistics below are in their own counters, but most are kept
+ * in this single structure so that they can all easily be collected and
+ * copied back as required.
+ */
+typedef struct filterstats {
+ u_long fr_pass; /* packets allowed */
+ u_long fr_block; /* packets denied */
+ u_long fr_nom; /* packets which don't match any rule */
+ u_long fr_short; /* packets which are short */
+ u_long fr_ppkl; /* packets allowed and logged */
+ u_long fr_bpkl; /* packets denied and logged */
+ u_long fr_npkl; /* packets unmatched and logged */
+ u_long fr_pkl; /* packets logged */
+ u_long fr_skip; /* packets to be logged but buffer full */
+ u_long fr_ret; /* packets for which a return is sent */
+ u_long fr_acct; /* packets for which counting was performed */
+ u_long fr_bnfr; /* bad attempts to allocate fragment state */
+ u_long fr_nfr; /* new fragment state kept */
+ u_long fr_cfr; /* add new fragment state but complete pkt */
+ u_long fr_bads; /* bad attempts to allocate packet state */
+ u_long fr_ads; /* new packet state kept */
+ u_long fr_chit; /* cached hit */
+ u_long fr_tcpbad; /* TCP checksum check failures */
+ u_long fr_pull[2]; /* good and bad pullup attempts */
+ u_long fr_badsrc; /* source received doesn't match route */
+ u_long fr_badttl; /* TTL in packet doesn't reach minimum */
+ u_long fr_bad; /* bad IP packets to the filter */
+ u_long fr_ipv6; /* IPv6 packets in/out */
+ u_long fr_ppshit; /* dropped because of pps ceiling */
+ u_long fr_ipud; /* IP id update failures */
+} filterstats_t;
+
+/*
+ * Log structure. Each packet header logged is prepended by one of these.
+ * Following this in the log records read from the device will be an ipflog
+ * structure which is then followed by any packet data.
+ */
+typedef struct iplog {
+ u_32_t ipl_magic;
+ u_int ipl_count;
+ struct timeval ipl_time;
+ size_t ipl_dsize;
+ struct iplog *ipl_next;
+} iplog_t;
+
+#define ipl_sec ipl_time.tv_sec
+#define ipl_usec ipl_time.tv_usec
+
+#define IPL_MAGIC 0x49504c4d /* 'IPLM' */
+#define IPL_MAGIC_NAT 0x49504c4e /* 'IPLN' */
+#define IPL_MAGIC_STATE 0x49504c53 /* 'IPLS' */
+#define IPLOG_SIZE sizeof(iplog_t)
+
+typedef struct ipflog {
+#if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199603)) || \
+ (defined(OpenBSD) && (OpenBSD >= 199603))
+#else
+ u_int fl_unit;
+#endif
+ u_32_t fl_rule;
+ u_32_t fl_flags;
+ u_32_t fl_lflags;
+ u_32_t fl_logtag;
+ ipftag_t fl_nattag;
+ u_short fl_plen; /* extra data after hlen */
+ u_short fl_loglevel; /* syslog log level */
+ char fl_group[FR_GROUPLEN];
+ u_char fl_hlen; /* length of IP headers saved */
+ u_char fl_dir;
+ u_char fl_xxx[2]; /* pad */
+ char fl_ifname[LIFNAMSIZ];
+} ipflog_t;
+
+#ifndef IPF_LOGGING
+# define IPF_LOGGING 0
+#endif
+#ifndef IPF_DEFAULT_PASS
+# define IPF_DEFAULT_PASS FR_PASS
+#endif
+
+#define DEFAULT_IPFLOGSIZE 8192
+#ifndef IPFILTER_LOGSIZE
+# define IPFILTER_LOGSIZE DEFAULT_IPFLOGSIZE
+#else
+# if IPFILTER_LOGSIZE < DEFAULT_IPFLOGSIZE
+# error IPFILTER_LOGSIZE too small. Must be >= DEFAULT_IPFLOGSIZE
+# endif
+#endif
+
+#define IPF_OPTCOPY 0x07ff00 /* bit mask of copied options */
+
+/*
+ * Device filenames for reading log information. Use ipf on Solaris2 because
+ * ipl is already a name used by something else.
+ */
+#ifndef IPL_NAME
+# if SOLARIS
+# define IPL_NAME "/dev/ipf"
+# else
+# define IPL_NAME "/dev/ipl"
+# endif
+#endif
+/*
+ * Pathnames for various IP Filter control devices. Used by LKM
+ * and userland, so defined here.
+ */
+#define IPNAT_NAME "/dev/ipnat"
+#define IPSTATE_NAME "/dev/ipstate"
+#define IPAUTH_NAME "/dev/ipauth"
+#define IPSYNC_NAME "/dev/ipsync"
+#define IPSCAN_NAME "/dev/ipscan"
+#define IPLOOKUP_NAME "/dev/iplookup"
+
+#define IPL_LOGIPF 0 /* Minor device #'s for accessing logs */
+#define IPL_LOGNAT 1
+#define IPL_LOGSTATE 2
+#define IPL_LOGAUTH 3
+#define IPL_LOGSYNC 4
+#define IPL_LOGSCAN 5
+#define IPL_LOGLOOKUP 6
+#define IPL_LOGCOUNT 7
+#define IPL_LOGMAX 7
+#define IPL_LOGSIZE IPL_LOGMAX + 1
+#define IPL_LOGALL -1
+#define IPL_LOGNONE -2
+
+/*
+ * For SIOCGETFS
+ */
+typedef struct friostat {
+ struct filterstats f_st[2];
+ struct frentry *f_ipf[2][2];
+ struct frentry *f_acct[2][2];
+ struct frentry *f_ipf6[2][2];
+ struct frentry *f_acct6[2][2];
+ struct frentry *f_auth;
+ struct frgroup *f_groups[IPL_LOGSIZE][2];
+ u_long f_froute[2];
+ u_long f_ticks;
+ int f_locks[IPL_LOGMAX];
+ size_t f_kmutex_sz;
+ size_t f_krwlock_sz;
+ int f_defpass; /* default pass - from fr_pass */
+ int f_active; /* 1 or 0 - active rule set */
+ int f_running; /* 1 if running, else 0 */
+ int f_logging; /* 1 if enabled, else 0 */
+ int f_features;
+ char f_version[32]; /* version string */
+} friostat_t;
+
+#define f_fin f_ipf[0]
+#define f_fin6 f_ipf6[0]
+#define f_fout f_ipf[1]
+#define f_fout6 f_ipf6[1]
+#define f_acctin f_acct[0]
+#define f_acctin6 f_acct6[0]
+#define f_acctout f_acct[1]
+#define f_acctout6 f_acct6[1]
+
+#define IPF_FEAT_LKM 0x001
+#define IPF_FEAT_LOG 0x002
+#define IPF_FEAT_LOOKUP 0x004
+#define IPF_FEAT_BPF 0x008
+#define IPF_FEAT_COMPILED 0x010
+#define IPF_FEAT_CKSUM 0x020
+#define IPF_FEAT_SYNC 0x040
+#define IPF_FEAT_SCAN 0x080
+#define IPF_FEAT_IPV6 0x100
+
+typedef struct optlist {
+ u_short ol_val;
+ int ol_bit;
+} optlist_t;
+
+
+/*
+ * Group list structure.
+ */
+typedef struct frgroup {
+ struct frgroup *fg_next;
+ struct frentry *fg_head;
+ struct frentry *fg_start;
+ u_32_t fg_flags;
+ int fg_ref;
+ char fg_name[FR_GROUPLEN];
+} frgroup_t;
+
+#define FG_NAME(g) (*(g)->fg_name == '\0' ? "" : (g)->fg_name)
+
+
+/*
+ * Used by state and NAT tables
+ */
+typedef struct icmpinfo {
+ u_short ici_id;
+ u_short ici_seq;
+ u_char ici_type;
+} icmpinfo_t;
+
+typedef struct udpinfo {
+ u_short us_sport;
+ u_short us_dport;
+} udpinfo_t;
+
+
+typedef struct tcpdata {
+ u_32_t td_end;
+ u_32_t td_maxend;
+ u_32_t td_maxwin;
+ u_32_t td_winscale;
+ u_32_t td_maxseg;
+ int td_winflags;
+} tcpdata_t;
+
+#define TCP_WSCALE_MAX 14
+
+#define TCP_WSCALE_SEEN 0x00000001
+#define TCP_WSCALE_FIRST 0x00000002
+#define TCP_SACK_PERMIT 0x00000004
+
+
+typedef struct tcpinfo {
+ u_short ts_sport;
+ u_short ts_dport;
+ tcpdata_t ts_data[2];
+} tcpinfo_t;
+
+
+/*
+ * Structures to define a GRE header as seen in a packet.
+ */
+struct grebits {
+ u_32_t grb_C:1;
+ u_32_t grb_R:1;
+ u_32_t grb_K:1;
+ u_32_t grb_S:1;
+ u_32_t grb_s:1;
+ u_32_t grb_recur:1;
+ u_32_t grb_A:1;
+ u_32_t grb_flags:3;
+ u_32_t grb_ver:3;
+ u_short grb_ptype;
+};
+
+typedef struct grehdr {
+ union {
+ struct grebits gru_bits;
+ u_short gru_flags;
+ } gr_un;
+ u_short gr_len;
+ u_short gr_call;
+} grehdr_t;
+
+#define gr_flags gr_un.gru_flags
+#define gr_bits gr_un.gru_bits
+#define gr_ptype gr_bits.grb_ptype
+#define gr_C gr_bits.grb_C
+#define gr_R gr_bits.grb_R
+#define gr_K gr_bits.grb_K
+#define gr_S gr_bits.grb_S
+#define gr_s gr_bits.grb_s
+#define gr_recur gr_bits.grb_recur
+#define gr_A gr_bits.grb_A
+#define gr_ver gr_bits.grb_ver
+
+/*
+ * GRE information tracked by "keep state"
+ */
+typedef struct greinfo {
+ u_short gs_call[2];
+ u_short gs_flags;
+ u_short gs_ptype;
+} greinfo_t;
+
+#define GRE_REV(x) ((ntohs(x) >> 13) & 7)
+
+
+/*
+ * Format of an Authentication header
+ */
+typedef struct authhdr {
+ u_char ah_next;
+ u_char ah_plen;
+ u_short ah_reserved;
+ u_32_t ah_spi;
+ u_32_t ah_seq;
+ /* Following the sequence number field is 0 or more bytes of */
+ /* authentication data, as specified by ah_plen - RFC 2402. */
+} authhdr_t;
+
+
+/*
+ * Timeout tail queue list member
+ */
+typedef struct ipftqent {
+ struct ipftqent **tqe_pnext;
+ struct ipftqent *tqe_next;
+ struct ipftq *tqe_ifq;
+ void *tqe_parent; /* pointer back to NAT/state struct */
+ u_long tqe_die; /* when this entriy is to die */
+ u_long tqe_touched;
+ int tqe_flags;
+ int tqe_state[2]; /* current state of this entry */
+} ipftqent_t;
+
+#define TQE_RULEBASED 0x00000001
+
+
+/*
+ * Timeout tail queue head for IPFilter
+ */
+typedef struct ipftq {
+ ipfmutex_t ifq_lock;
+ u_int ifq_ttl;
+ ipftqent_t *ifq_head;
+ ipftqent_t **ifq_tail;
+ struct ipftq *ifq_next;
+ struct ipftq **ifq_pnext;
+ int ifq_ref;
+ u_int ifq_flags;
+} ipftq_t;
+
+#define IFQF_USER 0x01 /* User defined aging */
+#define IFQF_DELETE 0x02 /* Marked for deletion */
+#define IFQF_PROXY 0x04 /* Timeout queue in use by a proxy */
+
+#define IPF_HZ_MULT 1
+#define IPF_HZ_DIVIDE 2 /* How many times a second ipfilter */
+ /* checks its timeout queues. */
+#define IPF_TTLVAL(x) (((x) / IPF_HZ_MULT) * IPF_HZ_DIVIDE)
+
+typedef int (*ipftq_delete_fn_t)(void *);
+
+/*
+ * Structure to define address for pool lookups.
+ */
+typedef struct {
+ u_char adf_len;
+ i6addr_t adf_addr;
+} addrfamily_t;
+
+
+/*
+ * Object structure description. For passing through in ioctls.
+ */
+typedef struct ipfobj {
+ u_32_t ipfo_rev; /* IPFilter version number */
+ u_32_t ipfo_size; /* size of object at ipfo_ptr */
+ void *ipfo_ptr; /* pointer to object */
+ int ipfo_type; /* type of object being pointed to */
+ int ipfo_offset; /* bytes from ipfo_ptr where to start */
+ u_char ipfo_xxxpad[32]; /* reserved for future use */
+} ipfobj_t;
+
+#define IPFOBJ_FRENTRY 0 /* struct frentry */
+#define IPFOBJ_IPFSTAT 1 /* struct friostat */
+#define IPFOBJ_IPFINFO 2 /* struct fr_info */
+#define IPFOBJ_AUTHSTAT 3 /* struct fr_authstat */
+#define IPFOBJ_FRAGSTAT 4 /* struct ipfrstat */
+#define IPFOBJ_IPNAT 5 /* struct ipnat */
+#define IPFOBJ_NATSTAT 6 /* struct natstat */
+#define IPFOBJ_STATESAVE 7 /* struct ipstate_save */
+#define IPFOBJ_NATSAVE 8 /* struct nat_save */
+#define IPFOBJ_NATLOOKUP 9 /* struct natlookup */
+#define IPFOBJ_IPSTATE 10 /* struct ipstate */
+#define IPFOBJ_STATESTAT 11 /* struct ips_stat */
+#define IPFOBJ_FRAUTH 12 /* struct frauth */
+#define IPFOBJ_TUNEABLE 13 /* struct ipftune */
+#define IPFOBJ_NAT 14 /* struct nat */
+#define IPFOBJ_IPFITER 15 /* struct ipfruleiter */
+#define IPFOBJ_GENITER 16 /* struct ipfgeniter */
+#define IPFOBJ_GTABLE 17 /* struct ipftable */
+#define IPFOBJ_LOOKUPITER 18 /* struct ipflookupiter */
+#define IPFOBJ_STATETQTAB 19 /* struct ipftq [NSTATES] */
+#define IPFOBJ_COUNT 20 /* How many #defines are above this? */
+
+
+typedef union ipftunevalptr {
+ void *ipftp_void;
+ u_long *ipftp_long;
+ u_int *ipftp_int;
+ u_short *ipftp_short;
+ u_char *ipftp_char;
+} ipftunevalptr_t;
+
+typedef struct ipftuneable {
+ ipftunevalptr_t ipft_una;
+ const char *ipft_name;
+ u_long ipft_min;
+ u_long ipft_max;
+ int ipft_sz;
+ int ipft_flags;
+ struct ipftuneable *ipft_next;
+} ipftuneable_t;
+
+#define ipft_addr ipft_una.ipftp_void
+#define ipft_plong ipft_una.ipftp_long
+#define ipft_pint ipft_una.ipftp_int
+#define ipft_pshort ipft_una.ipftp_short
+#define ipft_pchar ipft_una.ipftp_char
+
+#define IPFT_RDONLY 1 /* read-only */
+#define IPFT_WRDISABLED 2 /* write when disabled only */
+
+typedef union ipftuneval {
+ u_long ipftu_long;
+ u_int ipftu_int;
+ u_short ipftu_short;
+ u_char ipftu_char;
+} ipftuneval_t;
+
+typedef struct ipftune {
+ void *ipft_cookie;
+ ipftuneval_t ipft_un;
+ u_long ipft_min;
+ u_long ipft_max;
+ int ipft_sz;
+ int ipft_flags;
+ char ipft_name[80];
+} ipftune_t;
+
+#define ipft_vlong ipft_un.ipftu_long
+#define ipft_vint ipft_un.ipftu_int
+#define ipft_vshort ipft_un.ipftu_short
+#define ipft_vchar ipft_un.ipftu_char
+
+/*
+ *
+ */
+typedef struct ipfruleiter {
+ int iri_inout;
+ char iri_group[FR_GROUPLEN];
+ int iri_active;
+ int iri_nrules;
+ int iri_v;
+ frentry_t *iri_rule;
+} ipfruleiter_t;
+
+/*
+ * Values for iri_inout
+ */
+#define F_IN 0
+#define F_OUT 1
+#define F_ACIN 2
+#define F_ACOUT 3
+
+
+typedef struct ipfgeniter {
+ int igi_type;
+ int igi_nitems;
+ void *igi_data;
+} ipfgeniter_t;
+
+#define IPFGENITER_IPF 0
+#define IPFGENITER_NAT 1
+#define IPFGENITER_IPNAT 2
+#define IPFGENITER_FRAG 3
+#define IPFGENITER_AUTH 4
+#define IPFGENITER_STATE 5
+#define IPFGENITER_NATFRAG 6
+#define IPFGENITER_HOSTMAP 7
+#define IPFGENITER_LOOKUP 8
+
+typedef struct ipftable {
+ int ita_type;
+ void *ita_table;
+} ipftable_t;
+
+#define IPFTABLE_BUCKETS 1
+
+
+/*
+ *
+ */
+typedef struct ipftoken {
+ struct ipftoken *ipt_next;
+ struct ipftoken **ipt_pnext;
+ void *ipt_ctx;
+ void *ipt_data;
+ u_long ipt_die;
+ int ipt_type;
+ int ipt_uid;
+ int ipt_subtype;
+ int ipt_alive;
+} ipftoken_t;
+
+
+/*
+** HPUX Port
+*/
+#ifdef __hpux
+/* HP-UX locking sequence deadlock detection module lock MAJOR ID */
+# define IPF_SMAJ 0 /* temp assignment XXX, not critical */
+#endif
+
+#if !defined(CDEV_MAJOR) && defined (__FreeBSD_version) && \
+ (__FreeBSD_version >= 220000)
+# define CDEV_MAJOR 79
+#endif
+
+/*
+ * Post NetBSD 1.2 has the PFIL interface for packet filters. This turns
+ * on those hooks. We don't need any special mods in non-IP Filter code
+ * with this!
+ */
+#if (defined(NetBSD) && (NetBSD > 199609) && (NetBSD <= 1991011)) || \
+ (defined(NetBSD1_2) && NetBSD1_2 > 1) || \
+ (defined(__FreeBSD__) && (__FreeBSD_version >= 500043))
+# if defined(NetBSD) && (NetBSD >= 199905)
+# define PFIL_HOOKS
+# endif
+# ifdef PFIL_HOOKS
+# define NETBSD_PF
+# endif
+#endif
+
+#ifdef _KERNEL
+# define FR_VERBOSE(verb_pr)
+# define FR_DEBUG(verb_pr)
+#else
+extern void debug __P((char *, ...));
+extern void verbose __P((char *, ...));
+# define FR_VERBOSE(verb_pr) verbose verb_pr
+# define FR_DEBUG(verb_pr) debug verb_pr
+#endif
+
+
+#ifndef _KERNEL
+extern int fr_check __P((struct ip *, int, void *, int, mb_t **));
+extern int (*fr_checkp) __P((ip_t *, int, void *, int, mb_t **));
+extern int ipf_log __P((void));
+extern struct ifnet *get_unit __P((char *, int));
+extern char *get_ifname __P((struct ifnet *));
+# if defined(__NetBSD__) || defined(__OpenBSD__) || \
+ (_BSDI_VERSION >= 199701) || (__FreeBSD_version >= 300000)
+extern int iplioctl __P((int, ioctlcmd_t, caddr_t, int));
+# else
+extern int iplioctl __P((int, ioctlcmd_t, caddr_t, int));
+# endif
+extern int iplopen __P((dev_t, int));
+extern int iplclose __P((dev_t, int));
+extern void m_freem __P((mb_t *));
+extern int bcopywrap __P((void *, void *, size_t));
+#else /* #ifndef _KERNEL */
+# ifdef BSD
+# if (defined(__NetBSD__) && (__NetBSD_Version__ < 399000000)) || \
+ defined(__osf__) || \
+ (defined(__FreeBSD_version) && (__FreeBSD_version < 500043))
+# include <sys/select.h>
+# else
+# include <sys/selinfo.h>
+# endif
+extern struct selinfo ipfselwait[IPL_LOGSIZE];
+# endif
+# if defined(__NetBSD__) && defined(PFIL_HOOKS)
+extern void ipfilterattach __P((int));
+# endif
+extern int ipl_enable __P((void));
+extern int ipl_disable __P((void));
+extern int ipf_inject __P((fr_info_t *, mb_t *));
+# ifdef MENTAT
+extern int fr_check __P((struct ip *, int, void *, int, void *,
+ mblk_t **));
+# if SOLARIS
+# if SOLARIS2 >= 7
+extern int iplioctl __P((dev_t, int, intptr_t, int, cred_t *, int *));
+# else
+extern int iplioctl __P((dev_t, int, int *, int, cred_t *, int *));
+# endif
+extern int iplopen __P((dev_t *, int, int, cred_t *));
+extern int iplclose __P((dev_t, int, int, cred_t *));
+extern int iplread __P((dev_t, uio_t *, cred_t *));
+extern int iplwrite __P((dev_t, uio_t *, cred_t *));
+# endif
+# ifdef __hpux
+extern int iplopen __P((dev_t, int, intptr_t, int));
+extern int iplclose __P((dev_t, int, int));
+extern int iplioctl __P((dev_t, int, caddr_t, int));
+extern int iplread __P((dev_t, uio_t *));
+extern int iplwrite __P((dev_t, uio_t *));
+extern int iplselect __P((dev_t, int));
+# endif
+extern int fr_qout __P((queue_t *, mblk_t *));
+# else /* MENTAT */
+extern int fr_check __P((struct ip *, int, void *, int, mb_t **));
+extern int (*fr_checkp) __P((ip_t *, int, void *, int, mb_t **));
+extern size_t mbufchainlen __P((mb_t *));
+# ifdef __sgi
+# include <sys/cred.h>
+extern int iplioctl __P((dev_t, int, caddr_t, int, cred_t *, int *));
+extern int iplopen __P((dev_t *, int, int, cred_t *));
+extern int iplclose __P((dev_t, int, int, cred_t *));
+extern int iplread __P((dev_t, uio_t *, cred_t *));
+extern int iplwrite __P((dev_t, uio_t *, cred_t *));
+extern int ipfilter_sgi_attach __P((void));
+extern void ipfilter_sgi_detach __P((void));
+extern void ipfilter_sgi_intfsync __P((void));
+# else
+# ifdef IPFILTER_LKM
+extern int iplidentify __P((char *));
+# endif
+# if (defined(_BSDI_VERSION) && _BSDI_VERSION >= 199510) || \
+ (__FreeBSD_version >= 220000) || \
+ (NetBSD >= 199511) || defined(__OpenBSD__)
+# if defined(__NetBSD__) || \
+ (defined(_BSDI_VERSION) && _BSDI_VERSION >= 199701) || \
+ defined(__OpenBSD__) || (__FreeBSD_version >= 300000)
+# if (__FreeBSD_version >= 500024)
+# if (__FreeBSD_version >= 502116)
+extern int iplioctl __P((struct cdev*, u_long, caddr_t, int, struct thread *));
+# else
+extern int iplioctl __P((dev_t, u_long, caddr_t, int, struct thread *));
+# endif /* __FreeBSD_version >= 502116 */
+# else
+# if (__NetBSD_Version__ >= 499001000)
+extern int iplioctl __P((dev_t, u_long, void *, int, struct lwp *));
+# else
+# if (__NetBSD_Version__ >= 399001400)
+extern int iplioctl __P((dev_t, u_long, caddr_t, int, struct lwp *));
+# else
+extern int iplioctl __P((dev_t, u_long, caddr_t, int, struct proc *));
+# endif
+# endif
+# endif /* __FreeBSD_version >= 500024 */
+# else
+extern int iplioctl __P((dev_t, int, caddr_t, int, struct thread *));
+# endif
+# if (__FreeBSD_version >= 500024)
+# if (__FreeBSD_version >= 502116)
+extern int iplopen __P((struct cdev*, int, int, struct thread *));
+extern int iplclose __P((struct cdev*, int, int, struct thread *));
+# else
+extern int iplopen __P((dev_t, int, int, struct thread *));
+extern int iplclose __P((dev_t, int, int, struct thread *));
+# endif /* __FreeBSD_version >= 502116 */
+# else
+# if (__NetBSD_Version__ >= 399001400)
+extern int iplopen __P((dev_t, int, int, struct lwp *));
+extern int iplclose __P((dev_t, int, int, struct lwp *));
+# else
+extern int iplopen __P((dev_t, int, int, struct proc *));
+extern int iplclose __P((dev_t, int, int, struct proc *));
+# endif /* __NetBSD_Version__ >= 399001400 */
+# endif /* __FreeBSD_version >= 500024 */
+# else
+# ifdef linux
+extern int iplioctl __P((struct inode *, struct file *, u_int, u_long));
+# else
+extern int iplopen __P((dev_t, int));
+extern int iplclose __P((dev_t, int));
+extern int iplioctl __P((dev_t, int, caddr_t, int));
+# endif
+# endif /* (_BSDI_VERSION >= 199510) */
+# if BSD >= 199306
+# if (__FreeBSD_version >= 502116)
+extern int iplread __P((struct cdev*, struct uio *, int));
+extern int iplwrite __P((struct cdev*, struct uio *, int));
+# else
+extern int iplread __P((dev_t, struct uio *, int));
+extern int iplwrite __P((dev_t, struct uio *, int));
+# endif /* __FreeBSD_version >= 502116 */
+# else
+# ifndef linux
+extern int iplread __P((dev_t, struct uio *));
+extern int iplwrite __P((dev_t, struct uio *));
+# endif
+# endif /* BSD >= 199306 */
+# endif /* __ sgi */
+# endif /* MENTAT */
+
+#endif /* #ifndef _KERNEL */
+
+extern ipfmutex_t ipl_mutex, ipf_authmx, ipf_rw, ipf_hostmap;
+extern ipfmutex_t ipf_timeoutlock, ipf_stinsert, ipf_natio, ipf_nat_new;
+extern ipfrwlock_t ipf_mutex, ipf_global, ip_poolrw, ipf_ipidfrag;
+extern ipfrwlock_t ipf_frag, ipf_state, ipf_nat, ipf_natfrag, ipf_auth;
+extern ipfrwlock_t ipf_frcache, ipf_tokens;
+
+extern char *memstr __P((const char *, char *, size_t, size_t));
+extern int count4bits __P((u_32_t));
+extern int frrequest __P((int, ioctlcmd_t, caddr_t, int, int));
+extern char *getifname __P((struct ifnet *));
+extern int ipfattach __P((void));
+extern int ipfdetach __P((void));
+extern u_short ipf_cksum __P((u_short *, int));
+extern int copyinptr __P((void *, void *, size_t));
+extern int copyoutptr __P((void *, void *, size_t));
+extern int fr_fastroute __P((mb_t *, mb_t **, fr_info_t *, frdest_t *));
+extern int fr_inobj __P((void *, void *, int));
+extern int fr_inobjsz __P((void *, void *, int, int));
+extern int fr_ioctlswitch __P((int, void *, ioctlcmd_t, int, int, void *));
+extern int fr_ipf_ioctl __P((caddr_t, ioctlcmd_t, int, int, void *));
+extern int fr_ipftune __P((ioctlcmd_t, void *));
+extern int fr_outobj __P((void *, void *, int));
+extern int fr_outobjsz __P((void *, void *, int, int));
+extern void *fr_pullup __P((mb_t *, fr_info_t *, int));
+extern void fr_resolvedest __P((struct frdest *, int));
+extern int fr_resolvefunc __P((void *));
+extern void *fr_resolvenic __P((char *, int));
+extern int fr_send_icmp_err __P((int, fr_info_t *, int));
+extern int fr_send_reset __P((fr_info_t *));
+#if (__FreeBSD_version < 501000) || !defined(_KERNEL)
+extern int ppsratecheck __P((struct timeval *, int *, int));
+#endif
+extern ipftq_t *fr_addtimeoutqueue __P((ipftq_t **, u_int));
+extern void fr_deletequeueentry __P((ipftqent_t *));
+extern int fr_deletetimeoutqueue __P((ipftq_t *));
+extern void fr_freetimeoutqueue __P((ipftq_t *));
+extern void fr_movequeue __P((ipftqent_t *, ipftq_t *, ipftq_t *));
+extern void fr_queueappend __P((ipftqent_t *, ipftq_t *, void *));
+extern void fr_queueback __P((ipftqent_t *));
+extern void fr_queuefront __P((ipftqent_t *));
+extern void fr_checkv4sum __P((fr_info_t *));
+extern int fr_checkl4sum __P((fr_info_t *));
+extern int fr_ifpfillv4addr __P((int, struct sockaddr_in *,
+ struct sockaddr_in *, struct in_addr *,
+ struct in_addr *));
+extern int fr_coalesce __P((fr_info_t *));
+#ifdef USE_INET6
+extern void fr_checkv6sum __P((fr_info_t *));
+extern int fr_ifpfillv6addr __P((int, struct sockaddr_in6 *,
+ struct sockaddr_in6 *, struct in_addr *,
+ struct in_addr *));
+#endif
+
+extern int fr_addipftune __P((ipftuneable_t *));
+extern int fr_delipftune __P((ipftuneable_t *));
+
+extern int frflush __P((minor_t, int, int));
+extern void frsync __P((void *));
+extern frgroup_t *fr_addgroup __P((char *, void *, u_32_t, minor_t, int));
+extern int fr_derefrule __P((frentry_t **));
+extern void fr_delgroup __P((char *, minor_t, int));
+extern frgroup_t *fr_findgroup __P((char *, minor_t, int, frgroup_t ***));
+
+extern int fr_loginit __P((void));
+extern int ipflog_canread __P((int));
+extern int ipflog_clear __P((minor_t));
+extern int ipflog_read __P((minor_t, uio_t *));
+extern int ipflog __P((fr_info_t *, u_int));
+extern int ipllog __P((int, fr_info_t *, void **, size_t *, int *, int));
+extern void fr_logunload __P((void));
+
+extern frentry_t *fr_acctpkt __P((fr_info_t *, u_32_t *));
+extern int fr_copytolog __P((int, char *, int));
+extern u_short fr_cksum __P((mb_t *, ip_t *, int, void *, int));
+extern void fr_deinitialise __P((void));
+extern frentry_t *fr_dolog __P((fr_info_t *, u_32_t *));
+extern frentry_t *fr_dstgrpmap __P((fr_info_t *, u_32_t *));
+extern void fr_fixskip __P((frentry_t **, frentry_t *, int));
+extern void fr_forgetifp __P((void *));
+extern frentry_t *fr_getrulen __P((int, char *, u_32_t));
+extern void fr_getstat __P((struct friostat *));
+extern int fr_ifpaddr __P((int, int, void *,
+ struct in_addr *, struct in_addr *));
+extern int fr_initialise __P((void));
+extern void fr_lock __P((caddr_t, int *));
+extern int fr_makefrip __P((int, ip_t *, fr_info_t *));
+extern int fr_matchtag __P((ipftag_t *, ipftag_t *));
+extern int fr_matchicmpqueryreply __P((int, icmpinfo_t *,
+ struct icmp *, int));
+extern u_32_t fr_newisn __P((fr_info_t *));
+extern u_short fr_nextipid __P((fr_info_t *));
+extern int ipf_queueflush __P((ipftq_delete_fn_t, ipftq_t *, ipftq_t *));
+extern int fr_rulen __P((int, frentry_t *));
+extern int fr_scanlist __P((fr_info_t *, u_32_t));
+extern frentry_t *fr_srcgrpmap __P((fr_info_t *, u_32_t *));
+extern int fr_tcpudpchk __P((fr_info_t *, frtuc_t *));
+extern int fr_verifysrc __P((fr_info_t *fin));
+extern int fr_zerostats __P((char *));
+extern ipftoken_t *ipf_findtoken __P((int, int, void *));
+extern int ipf_getnextrule __P((ipftoken_t *, void *));
+extern void ipf_expiretokens __P((void));
+extern void ipf_freetoken __P((ipftoken_t *));
+extern int ipf_deltoken __P((int,int, void *));
+extern int ipfsync __P((void));
+extern int ipf_genericiter __P((void *, int, void *));
+
+extern int fr_running;
+extern u_long fr_frouteok[2];
+extern int fr_pass;
+extern int fr_flags;
+extern int fr_active;
+extern int fr_chksrc;
+extern int fr_minttl;
+extern int fr_refcnt;
+extern int fr_control_forwarding;
+extern int fr_update_ipid;
+extern int nat_logging;
+extern int ipstate_logging;
+extern int ipl_suppress;
+extern int ipl_logmax;
+extern int ipl_logall;
+extern int ipl_logsize;
+extern u_long fr_ticks;
+extern fr_info_t frcache[2][8];
+extern char ipfilter_version[];
+extern iplog_t **iplh[IPL_LOGMAX+1], *iplt[IPL_LOGMAX+1];
+extern int iplused[IPL_LOGMAX + 1];
+extern struct frentry *ipfilter[2][2], *ipacct[2][2];
+#ifdef USE_INET6
+extern struct frentry *ipfilter6[2][2], *ipacct6[2][2];
+extern int icmptoicmp6types[ICMP_MAXTYPE+1];
+extern int icmptoicmp6unreach[ICMP_MAX_UNREACH];
+extern int icmpreplytype6[ICMP6_MAXTYPE + 1];
+#endif
+extern int icmpreplytype4[ICMP_MAXTYPE + 1];
+extern struct frgroup *ipfgroups[IPL_LOGSIZE][2];
+extern struct filterstats frstats[];
+extern frentry_t *ipfrule_match __P((fr_info_t *));
+extern u_char ipf_iss_secret[32];
+extern ipftuneable_t ipf_tuneables[];
+
+#endif /* __IP_FIL_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c b/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c
new file mode 100644
index 0000000..aeefb03
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_fil_freebsd.c
@@ -0,0 +1,1660 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1993-2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if !defined(lint)
+static const char sccsid[] = "@(#)ip_fil.c 2.41 6/5/96 (C) 1993-2000 Darren Reed";
+static const char rcsid[] = "@(#)$Id: ip_fil_freebsd.c,v 2.53.2.46 2007/05/11 13:41:53 darrenr Exp $";
+#endif
+
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 400000) && \
+ !defined(KLD_MODULE) && !defined(IPFILTER_LKM)
+# include "opt_inet6.h"
+#endif
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 440000) && \
+ !defined(KLD_MODULE) && !defined(IPFILTER_LKM)
+# include "opt_random_ip_id.h"
+#endif
+#include <sys/param.h>
+#if defined(__FreeBSD__) && !defined(__FreeBSD_version)
+# if defined(IPFILTER_LKM)
+# ifndef __FreeBSD_cc_version
+# include <osreldate.h>
+# else
+# if __FreeBSD_cc_version < 430000
+# include <osreldate.h>
+# endif
+# endif
+# endif
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#if __FreeBSD_version >= 220000
+# include <sys/fcntl.h>
+# include <sys/filio.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#include <sys/time.h>
+#include <sys/systm.h>
+#if (__FreeBSD_version >= 300000)
+# include <sys/dirent.h>
+#else
+# include <sys/dir.h>
+#endif
+#if !defined(__hpux)
+# include <sys/mbuf.h>
+#endif
+#include <sys/protosw.h>
+#include <sys/socket.h>
+#if __FreeBSD_version >= 500043
+# include <sys/selinfo.h>
+#else
+# include <sys/select.h>
+#endif
+
+#include <net/if.h>
+#if __FreeBSD_version >= 300000
+# include <net/if_var.h>
+# if __FreeBSD_version >= 500043
+# include <net/netisr.h>
+# endif
+# if !defined(IPFILTER_LKM)
+# include "opt_ipfilter.h"
+# endif
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_var.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/ip_var.h>
+#include <netinet/tcp.h>
+#if defined(__osf__)
+# include <netinet/tcp_timer.h>
+#endif
+#include <netinet/udp.h>
+#include <netinet/tcpip.h>
+#include <netinet/ip_icmp.h>
+#ifndef _KERNEL
+# include "netinet/ipf.h"
+#endif
+#include "netinet/ip_compat.h"
+#ifdef USE_INET6
+# include <netinet/icmp6.h>
+#endif
+#include "netinet/ip_fil.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_proxy.h"
+#include "netinet/ip_auth.h"
+#ifdef IPFILTER_SYNC
+#include "netinet/ip_sync.h"
+#endif
+#ifdef IPFILTER_SCAN
+#include "netinet/ip_scan.h"
+#endif
+#include "netinet/ip_pool.h"
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+#endif
+#include <sys/kernel.h>
+#ifdef CSUM_DATA_VALID
+#include <machine/in_cksum.h>
+#endif
+extern int ip_optcopy __P((struct ip *, struct ip *));
+
+#if (__FreeBSD_version > 460000)
+extern int path_mtu_discovery;
+#endif
+
+# ifdef IPFILTER_M_IPFILTER
+MALLOC_DEFINE(M_IPFILTER, "ipfilter", "IP Filter packet filter data structures");
+# endif
+
+
+#if !defined(__osf__)
+extern struct protosw inetsw[];
+#endif
+
+static int (*fr_savep) __P((ip_t *, int, void *, int, struct mbuf **));
+static int fr_send_ip __P((fr_info_t *, mb_t *, mb_t **));
+# ifdef USE_MUTEXES
+ipfmutex_t ipl_mutex, ipf_authmx, ipf_rw, ipf_stinsert;
+ipfmutex_t ipf_nat_new, ipf_natio, ipf_timeoutlock;
+ipfrwlock_t ipf_mutex, ipf_global, ipf_ipidfrag, ipf_frcache, ipf_tokens;
+ipfrwlock_t ipf_frag, ipf_state, ipf_nat, ipf_natfrag, ipf_auth;
+# endif
+int ipf_locks_done = 0;
+
+#if (__FreeBSD_version >= 300000)
+struct callout_handle fr_slowtimer_ch;
+#endif
+struct selinfo ipfselwait[IPL_LOGSIZE];
+
+#if (__FreeBSD_version >= 500011)
+# include <sys/conf.h>
+# if defined(NETBSD_PF)
+# include <net/pfil.h>
+# include <netinet/ipprotosw.h>
+/*
+ * We provide the fr_checkp name just to minimize changes later.
+ */
+int (*fr_checkp) __P((ip_t *ip, int hlen, void *ifp, int out, mb_t **mp));
+# endif /* NETBSD_PF */
+#endif /* __FreeBSD_version >= 500011 */
+
+
+#if (__FreeBSD_version >= 502103)
+static eventhandler_tag ipf_arrivetag, ipf_departtag, ipf_clonetag;
+
+static void ipf_ifevent(void *arg);
+
+static void ipf_ifevent(arg)
+void *arg;
+{
+ frsync(NULL);
+}
+#endif
+
+
+#if (__FreeBSD_version >= 501108) && defined(_KERNEL)
+
+static int
+fr_check_wrapper(void *arg, struct mbuf **mp, struct ifnet *ifp, int dir)
+{
+ struct ip *ip = mtod(*mp, struct ip *);
+ return fr_check(ip, ip->ip_hl << 2, ifp, (dir == PFIL_OUT), mp);
+}
+
+# ifdef USE_INET6
+# include <netinet/ip6.h>
+
+static int
+fr_check_wrapper6(void *arg, struct mbuf **mp, struct ifnet *ifp, int dir)
+{
+ return (fr_check(mtod(*mp, struct ip *), sizeof(struct ip6_hdr),
+ ifp, (dir == PFIL_OUT), mp));
+}
+# endif
+#endif /* __FreeBSD_version >= 501108 */
+#if defined(IPFILTER_LKM)
+int iplidentify(s)
+char *s;
+{
+ if (strcmp(s, "ipl") == 0)
+ return 1;
+ return 0;
+}
+#endif /* IPFILTER_LKM */
+
+
+int ipfattach()
+{
+#ifdef USE_SPL
+ int s;
+#endif
+#if defined(NETBSD_PF) && (__FreeBSD_version >= 500011)
+ int error = 0;
+# if __FreeBSD_version >= 501108
+ struct pfil_head *ph_inet;
+# ifdef USE_INET6
+ struct pfil_head *ph_inet6;
+# endif
+# endif
+#endif
+
+ SPL_NET(s);
+ if (fr_running > 0) {
+ SPL_X(s);
+ return EBUSY;
+ }
+
+ MUTEX_INIT(&ipf_rw, "ipf rw mutex");
+ MUTEX_INIT(&ipf_timeoutlock, "ipf timeout queue mutex");
+ RWLOCK_INIT(&ipf_ipidfrag, "ipf IP NAT-Frag rwlock");
+ RWLOCK_INIT(&ipf_tokens, "ipf token rwlock");
+ ipf_locks_done = 1;
+
+ if (fr_initialise() < 0) {
+ SPL_X(s);
+ return EIO;
+ }
+
+
+# ifdef NETBSD_PF
+# if __FreeBSD_version >= 500011
+# if __FreeBSD_version >= 501108
+ ph_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET);
+# ifdef USE_INET6
+ ph_inet6 = pfil_head_get(PFIL_TYPE_AF, AF_INET6);
+# endif
+ if (ph_inet == NULL
+# ifdef USE_INET6
+ && ph_inet6 == NULL
+# endif
+ )
+ return ENODEV;
+
+ if (ph_inet != NULL)
+ error = pfil_add_hook((void *)fr_check_wrapper, NULL,
+ PFIL_IN|PFIL_OUT, ph_inet);
+ else
+ error = 0;
+# else
+ error = pfil_add_hook((void *)fr_check, PFIL_IN|PFIL_OUT,
+ &inetsw[ip_protox[IPPROTO_IP]].pr_pfh);
+# endif
+ if (error) {
+# ifdef USE_INET6
+ goto pfil_error;
+# else
+ fr_deinitialise();
+ SPL_X(s);
+ return error;
+# endif
+ }
+# else
+ pfil_add_hook((void *)fr_check, PFIL_IN|PFIL_OUT);
+# endif
+# ifdef USE_INET6
+# if __FreeBSD_version >= 501108
+ if (ph_inet6 != NULL)
+ error = pfil_add_hook((void *)fr_check_wrapper6, NULL,
+ PFIL_IN|PFIL_OUT, ph_inet6);
+ else
+ error = 0;
+ if (error) {
+ pfil_remove_hook((void *)fr_check_wrapper6, NULL,
+ PFIL_IN|PFIL_OUT, ph_inet6);
+# else
+ error = pfil_add_hook((void *)fr_check, PFIL_IN|PFIL_OUT,
+ &inet6sw[ip6_protox[IPPROTO_IPV6]].pr_pfh);
+ if (error) {
+ pfil_remove_hook((void *)fr_check, PFIL_IN|PFIL_OUT,
+ &inetsw[ip_protox[IPPROTO_IP]].pr_pfh);
+# endif
+pfil_error:
+ fr_deinitialise();
+ SPL_X(s);
+ return error;
+ }
+# endif
+# endif
+
+#if (__FreeBSD_version >= 502103)
+ ipf_arrivetag = EVENTHANDLER_REGISTER(ifnet_arrival_event, \
+ ipf_ifevent, NULL, \
+ EVENTHANDLER_PRI_ANY);
+ ipf_departtag = EVENTHANDLER_REGISTER(ifnet_departure_event, \
+ ipf_ifevent, NULL, \
+ EVENTHANDLER_PRI_ANY);
+ ipf_clonetag = EVENTHANDLER_REGISTER(if_clone_event, ipf_ifevent, \
+ NULL, EVENTHANDLER_PRI_ANY);
+#endif
+
+ if (fr_checkp != fr_check) {
+ fr_savep = fr_checkp;
+ fr_checkp = fr_check;
+ }
+
+ bzero((char *)ipfselwait, sizeof(ipfselwait));
+ bzero((char *)frcache, sizeof(frcache));
+ fr_running = 1;
+
+ if (fr_control_forwarding & 1)
+ ipforwarding = 1;
+
+ SPL_X(s);
+#if (__FreeBSD_version >= 300000)
+ fr_slowtimer_ch = timeout(fr_slowtimer, NULL,
+ (hz / IPF_HZ_DIVIDE) * IPF_HZ_MULT);
+#else
+ timeout(fr_slowtimer, NULL, (hz / IPF_HZ_DIVIDE) * IPF_HZ_MULT);
+#endif
+ return 0;
+}
+
+
+/*
+ * Disable the filter by removing the hooks from the IP input/output
+ * stream.
+ */
+int ipfdetach()
+{
+#ifdef USE_SPL
+ int s;
+#endif
+#if defined(NETBSD_PF) && (__FreeBSD_version >= 500011)
+ int error = 0;
+# if __FreeBSD_version >= 501108
+ struct pfil_head *ph_inet;
+# ifdef USE_INET6
+ struct pfil_head *ph_inet6;
+# endif
+# endif
+#endif
+
+ if (fr_control_forwarding & 2)
+ ipforwarding = 0;
+
+#if (__FreeBSD_version >= 502103)
+ if (ipf_arrivetag != NULL) {
+ EVENTHANDLER_DEREGISTER(ifnet_arrival_event, ipf_arrivetag);
+ }
+ if (ipf_departtag != NULL) {
+ EVENTHANDLER_DEREGISTER(ifnet_departure_event, ipf_departtag);
+ }
+ if (ipf_clonetag != NULL) {
+ EVENTHANDLER_DEREGISTER(if_clone_event, ipf_clonetag);
+ }
+#endif
+
+ SPL_NET(s);
+
+#if (__FreeBSD_version >= 300000)
+ if (fr_slowtimer_ch.callout != NULL)
+ untimeout(fr_slowtimer, NULL, fr_slowtimer_ch);
+ bzero(&fr_slowtimer_ch, sizeof(fr_slowtimer_ch));
+#else
+ untimeout(fr_slowtimer, NULL);
+#endif /* FreeBSD */
+
+#ifndef NETBSD_PF
+ if (fr_checkp != NULL)
+ fr_checkp = fr_savep;
+ fr_savep = NULL;
+#endif
+
+#ifdef NETBSD_PF
+# if (__FreeBSD_version >= 500011)
+# if (__FreeBSD_version >= 501108)
+ ph_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET);
+ if (ph_inet != NULL)
+ error = pfil_remove_hook((void *)fr_check_wrapper, NULL,
+ PFIL_IN|PFIL_OUT, ph_inet);
+ else
+ error = 0;
+# else
+ error = pfil_remove_hook((void *)fr_check, PFIL_IN|PFIL_OUT,
+ &inetsw[ip_protox[IPPROTO_IP]].pr_pfh);
+# endif
+ if (error) {
+ SPL_X(s);
+ return error;
+ }
+# else
+ pfil_remove_hook((void *)fr_check, PFIL_IN|PFIL_OUT);
+# endif
+# ifdef USE_INET6
+# if (__FreeBSD_version >= 501108)
+ ph_inet6 = pfil_head_get(PFIL_TYPE_AF, AF_INET6);
+ if (ph_inet6 != NULL)
+ error = pfil_remove_hook((void *)fr_check_wrapper6, NULL,
+ PFIL_IN|PFIL_OUT, ph_inet6);
+ else
+ error = 0;
+# else
+ error = pfil_remove_hook((void *)fr_check, PFIL_IN|PFIL_OUT,
+ &inet6sw[ip6_protox[IPPROTO_IPV6]].pr_pfh);
+# endif
+ if (error) {
+ SPL_X(s);
+ return error;
+ }
+# endif
+#endif
+ fr_deinitialise();
+
+ fr_running = -2;
+
+ (void) frflush(IPL_LOGIPF, 0, FR_INQUE|FR_OUTQUE|FR_INACTIVE);
+ (void) frflush(IPL_LOGIPF, 0, FR_INQUE|FR_OUTQUE);
+
+ if (ipf_locks_done == 1) {
+ MUTEX_DESTROY(&ipf_timeoutlock);
+ MUTEX_DESTROY(&ipf_rw);
+ RW_DESTROY(&ipf_ipidfrag);
+ RW_DESTROY(&ipf_tokens);
+ ipf_locks_done = 0;
+ }
+
+ SPL_X(s);
+
+ return 0;
+}
+
+
+/*
+ * Filter ioctl interface.
+ */
+int iplioctl(dev, cmd, data, mode
+# if defined(_KERNEL) && ((BSD >= 199506) || (__FreeBSD_version >= 220000))
+, p)
+# if (__FreeBSD_version >= 500024)
+struct thread *p;
+# if (__FreeBSD_version >= 500043)
+# define p_uid td_ucred->cr_ruid
+# else
+# define p_uid t_proc->p_cred->p_ruid
+# endif
+# else
+struct proc *p;
+# define p_uid p_cred->p_ruid
+# endif /* __FreeBSD_version >= 500024 */
+# else
+)
+# endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 502116)
+struct cdev *dev;
+#else
+dev_t dev;
+#endif
+ioctlcmd_t cmd;
+caddr_t data;
+int mode;
+{
+ int error = 0, unit = 0;
+ SPL_INT(s);
+
+#if (BSD >= 199306) && defined(_KERNEL)
+ if ((securelevel >= 3) && (mode & FWRITE))
+ return EPERM;
+#endif
+
+ unit = GET_MINOR(dev);
+ if ((IPL_LOGMAX < unit) || (unit < 0))
+ return ENXIO;
+
+ if (fr_running <= 0) {
+ if (unit != IPL_LOGIPF)
+ return EIO;
+ if (cmd != SIOCIPFGETNEXT && cmd != SIOCIPFGET &&
+ cmd != SIOCIPFSET && cmd != SIOCFRENB &&
+ cmd != SIOCGETFS && cmd != SIOCGETFF)
+ return EIO;
+ }
+
+ SPL_NET(s);
+ READ_ENTER(&ipf_global);
+
+ error = fr_ioctlswitch(unit, data, cmd, mode, p->p_uid, p);
+ if (error != -1) {
+ RWLOCK_EXIT(&ipf_global);
+ SPL_X(s);
+ return error;
+ }
+
+ RWLOCK_EXIT(&ipf_global);
+ SPL_X(s);
+
+ return error;
+}
+
+
+#if 0
+void fr_forgetifp(ifp)
+void *ifp;
+{
+ register frentry_t *f;
+
+ WRITE_ENTER(&ipf_mutex);
+ for (f = ipacct[0][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipacct[1][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipfilter[0][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipfilter[1][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+#ifdef USE_INET6
+ for (f = ipacct6[0][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipacct6[1][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipfilter6[0][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+ for (f = ipfilter6[1][fr_active]; (f != NULL); f = f->fr_next)
+ if (f->fr_ifa == ifp)
+ f->fr_ifa = (void *)-1;
+#endif
+ RWLOCK_EXIT(&ipf_mutex);
+ fr_natsync(ifp);
+}
+#endif
+
+
+/*
+ * routines below for saving IP headers to buffer
+ */
+int iplopen(dev, flags
+#if ((BSD >= 199506) || (__FreeBSD_version >= 220000)) && defined(_KERNEL)
+, devtype, p)
+int devtype;
+# if (__FreeBSD_version >= 500024)
+struct thread *p;
+# else
+struct proc *p;
+# endif /* __FreeBSD_version >= 500024 */
+#else
+)
+#endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 502116)
+struct cdev *dev;
+#else
+dev_t dev;
+#endif
+int flags;
+{
+ u_int min = GET_MINOR(dev);
+
+ if (IPL_LOGMAX < min)
+ min = ENXIO;
+ else
+ min = 0;
+ return min;
+}
+
+
+int iplclose(dev, flags
+#if ((BSD >= 199506) || (__FreeBSD_version >= 220000)) && defined(_KERNEL)
+, devtype, p)
+int devtype;
+# if (__FreeBSD_version >= 500024)
+struct thread *p;
+# else
+struct proc *p;
+# endif /* __FreeBSD_version >= 500024 */
+#else
+)
+#endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 502116)
+struct cdev *dev;
+#else
+dev_t dev;
+#endif
+int flags;
+{
+ u_int min = GET_MINOR(dev);
+
+ if (IPL_LOGMAX < min)
+ min = ENXIO;
+ else
+ min = 0;
+ return min;
+}
+
+/*
+ * iplread/ipllog
+ * both of these must operate with at least splnet() lest they be
+ * called during packet processing and cause an inconsistancy to appear in
+ * the filter lists.
+ */
+#if (BSD >= 199306)
+int iplread(dev, uio, ioflag)
+int ioflag;
+#else
+int iplread(dev, uio)
+#endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 502116)
+struct cdev *dev;
+#else
+dev_t dev;
+#endif
+register struct uio *uio;
+{
+ u_int xmin = GET_MINOR(dev);
+
+ if (fr_running < 1)
+ return EIO;
+
+ if (xmin < 0)
+ return ENXIO;
+
+# ifdef IPFILTER_SYNC
+ if (xmin == IPL_LOGSYNC)
+ return ipfsync_read(uio);
+# endif
+
+#ifdef IPFILTER_LOG
+ return ipflog_read(xmin, uio);
+#else
+ return ENXIO;
+#endif
+}
+
+
+/*
+ * iplwrite
+ * both of these must operate with at least splnet() lest they be
+ * called during packet processing and cause an inconsistancy to appear in
+ * the filter lists.
+ */
+#if (BSD >= 199306)
+int iplwrite(dev, uio, ioflag)
+int ioflag;
+#else
+int iplwrite(dev, uio)
+#endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 502116)
+struct cdev *dev;
+#else
+dev_t dev;
+#endif
+register struct uio *uio;
+{
+
+ if (fr_running < 1)
+ return EIO;
+
+#ifdef IPFILTER_SYNC
+ if (GET_MINOR(dev) == IPL_LOGSYNC)
+ return ipfsync_write(uio);
+#endif
+ return ENXIO;
+}
+
+
+/*
+ * fr_send_reset - this could conceivably be a call to tcp_respond(), but that
+ * requires a large amount of setting up and isn't any more efficient.
+ */
+int fr_send_reset(fin)
+fr_info_t *fin;
+{
+ struct tcphdr *tcp, *tcp2;
+ int tlen = 0, hlen;
+ struct mbuf *m;
+#ifdef USE_INET6
+ ip6_t *ip6;
+#endif
+ ip_t *ip;
+
+ tcp = fin->fin_dp;
+ if (tcp->th_flags & TH_RST)
+ return -1; /* feedback loop */
+
+#ifndef IPFILTER_CKSUM
+ if (fr_checkl4sum(fin) == -1)
+ return -1;
+#endif
+
+ tlen = fin->fin_dlen - (TCP_OFF(tcp) << 2) +
+ ((tcp->th_flags & TH_SYN) ? 1 : 0) +
+ ((tcp->th_flags & TH_FIN) ? 1 : 0);
+
+#ifdef USE_INET6
+ hlen = (fin->fin_v == 6) ? sizeof(ip6_t) : sizeof(ip_t);
+#else
+ hlen = sizeof(ip_t);
+#endif
+#ifdef MGETHDR
+ MGETHDR(m, M_DONTWAIT, MT_HEADER);
+#else
+ MGET(m, M_DONTWAIT, MT_HEADER);
+#endif
+ if (m == NULL)
+ return -1;
+ if (sizeof(*tcp2) + hlen > MLEN) {
+ MCLGET(m, M_DONTWAIT);
+ if ((m->m_flags & M_EXT) == 0) {
+ FREE_MB_T(m);
+ return -1;
+ }
+ }
+
+ m->m_len = sizeof(*tcp2) + hlen;
+#if (BSD >= 199103)
+ m->m_data += max_linkhdr;
+ m->m_pkthdr.len = m->m_len;
+ m->m_pkthdr.rcvif = (struct ifnet *)0;
+#endif
+ ip = mtod(m, struct ip *);
+ bzero((char *)ip, hlen);
+#ifdef USE_INET6
+ ip6 = (ip6_t *)ip;
+#endif
+ tcp2 = (struct tcphdr *)((char *)ip + hlen);
+ tcp2->th_sport = tcp->th_dport;
+ tcp2->th_dport = tcp->th_sport;
+
+ if (tcp->th_flags & TH_ACK) {
+ tcp2->th_seq = tcp->th_ack;
+ tcp2->th_flags = TH_RST;
+ tcp2->th_ack = 0;
+ } else {
+ tcp2->th_seq = 0;
+ tcp2->th_ack = ntohl(tcp->th_seq);
+ tcp2->th_ack += tlen;
+ tcp2->th_ack = htonl(tcp2->th_ack);
+ tcp2->th_flags = TH_RST|TH_ACK;
+ }
+ TCP_X2_A(tcp2, 0);
+ TCP_OFF_A(tcp2, sizeof(*tcp2) >> 2);
+ tcp2->th_win = tcp->th_win;
+ tcp2->th_sum = 0;
+ tcp2->th_urp = 0;
+
+#ifdef USE_INET6
+ if (fin->fin_v == 6) {
+ ip6->ip6_flow = ((ip6_t *)fin->fin_ip)->ip6_flow;
+ ip6->ip6_plen = htons(sizeof(struct tcphdr));
+ ip6->ip6_nxt = IPPROTO_TCP;
+ ip6->ip6_hlim = 0;
+ ip6->ip6_src = fin->fin_dst6;
+ ip6->ip6_dst = fin->fin_src6;
+ tcp2->th_sum = in6_cksum(m, IPPROTO_TCP,
+ sizeof(*ip6), sizeof(*tcp2));
+ return fr_send_ip(fin, m, &m);
+ }
+#endif
+ ip->ip_p = IPPROTO_TCP;
+ ip->ip_len = htons(sizeof(struct tcphdr));
+ ip->ip_src.s_addr = fin->fin_daddr;
+ ip->ip_dst.s_addr = fin->fin_saddr;
+ tcp2->th_sum = in_cksum(m, hlen + sizeof(*tcp2));
+ ip->ip_len = hlen + sizeof(*tcp2);
+ return fr_send_ip(fin, m, &m);
+}
+
+
+static int fr_send_ip(fin, m, mpp)
+fr_info_t *fin;
+mb_t *m, **mpp;
+{
+ fr_info_t fnew;
+ ip_t *ip, *oip;
+ int hlen;
+
+ ip = mtod(m, ip_t *);
+ bzero((char *)&fnew, sizeof(fnew));
+
+ IP_V_A(ip, fin->fin_v);
+ switch (fin->fin_v)
+ {
+ case 4 :
+ fnew.fin_v = 4;
+ oip = fin->fin_ip;
+ IP_HL_A(ip, sizeof(*oip) >> 2);
+ ip->ip_tos = oip->ip_tos;
+ ip->ip_id = fin->fin_ip->ip_id;
+#if (__FreeBSD_version > 460000)
+ ip->ip_off = path_mtu_discovery ? IP_DF : 0;
+#else
+ ip->ip_off = 0;
+#endif
+ ip->ip_ttl = ip_defttl;
+ ip->ip_sum = 0;
+ hlen = sizeof(*oip);
+ break;
+#ifdef USE_INET6
+ case 6 :
+ {
+ ip6_t *ip6 = (ip6_t *)ip;
+
+ ip6->ip6_vfc = 0x60;
+ ip6->ip6_hlim = IPDEFTTL;
+
+ fnew.fin_v = 6;
+ hlen = sizeof(*ip6);
+ break;
+ }
+#endif
+ default :
+ return EINVAL;
+ }
+#ifdef IPSEC
+ m->m_pkthdr.rcvif = NULL;
+#endif
+
+ fnew.fin_ifp = fin->fin_ifp;
+ fnew.fin_flx = FI_NOCKSUM;
+ fnew.fin_m = m;
+ fnew.fin_ip = ip;
+ fnew.fin_mp = mpp;
+ fnew.fin_hlen = hlen;
+ fnew.fin_dp = (char *)ip + hlen;
+ (void) fr_makefrip(hlen, ip, &fnew);
+
+ return fr_fastroute(m, mpp, &fnew, NULL);
+}
+
+
+int fr_send_icmp_err(type, fin, dst)
+int type;
+fr_info_t *fin;
+int dst;
+{
+ int err, hlen, xtra, iclen, ohlen, avail, code;
+ struct in_addr dst4;
+ struct icmp *icmp;
+ struct mbuf *m;
+ void *ifp;
+#ifdef USE_INET6
+ ip6_t *ip6;
+ struct in6_addr dst6;
+#endif
+ ip_t *ip, *ip2;
+
+ if ((type < 0) || (type > ICMP_MAXTYPE))
+ return -1;
+
+ code = fin->fin_icode;
+#ifdef USE_INET6
+ if ((code < 0) || (code > sizeof(icmptoicmp6unreach)/sizeof(int)))
+ return -1;
+#endif
+
+#ifndef IPFILTER_CKSUM
+ if (fr_checkl4sum(fin) == -1)
+ return -1;
+#endif
+#ifdef MGETHDR
+ MGETHDR(m, M_DONTWAIT, MT_HEADER);
+#else
+ MGET(m, M_DONTWAIT, MT_HEADER);
+#endif
+ if (m == NULL)
+ return -1;
+ avail = MHLEN;
+
+ xtra = 0;
+ hlen = 0;
+ ohlen = 0;
+ ifp = fin->fin_ifp;
+ if (fin->fin_v == 4) {
+ if ((fin->fin_p == IPPROTO_ICMP) &&
+ !(fin->fin_flx & FI_SHORT))
+ switch (ntohs(fin->fin_data[0]) >> 8)
+ {
+ case ICMP_ECHO :
+ case ICMP_TSTAMP :
+ case ICMP_IREQ :
+ case ICMP_MASKREQ :
+ break;
+ default :
+ FREE_MB_T(m);
+ return 0;
+ }
+
+ if (dst == 0) {
+ if (fr_ifpaddr(4, FRI_NORMAL, ifp,
+ &dst4, NULL) == -1) {
+ FREE_MB_T(m);
+ return -1;
+ }
+ } else
+ dst4.s_addr = fin->fin_daddr;
+
+ hlen = sizeof(ip_t);
+ ohlen = fin->fin_hlen;
+ if (fin->fin_hlen < fin->fin_plen)
+ xtra = MIN(fin->fin_dlen, 8);
+ else
+ xtra = 0;
+ }
+
+#ifdef USE_INET6
+ else if (fin->fin_v == 6) {
+ hlen = sizeof(ip6_t);
+ ohlen = sizeof(ip6_t);
+ type = icmptoicmp6types[type];
+ if (type == ICMP6_DST_UNREACH)
+ code = icmptoicmp6unreach[code];
+
+ if (hlen + sizeof(*icmp) + max_linkhdr +
+ fin->fin_plen > avail) {
+ MCLGET(m, M_DONTWAIT);
+ if ((m->m_flags & M_EXT) == 0) {
+ FREE_MB_T(m);
+ return -1;
+ }
+ avail = MCLBYTES;
+ }
+ xtra = MIN(fin->fin_plen,
+ avail - hlen - sizeof(*icmp) - max_linkhdr);
+ if (dst == 0) {
+ if (fr_ifpaddr(6, FRI_NORMAL, ifp,
+ (struct in_addr *)&dst6, NULL) == -1) {
+ FREE_MB_T(m);
+ return -1;
+ }
+ } else
+ dst6 = fin->fin_dst6;
+ }
+#endif
+ else {
+ FREE_MB_T(m);
+ return -1;
+ }
+
+ iclen = hlen + sizeof(*icmp);
+ avail -= (max_linkhdr + iclen);
+ if (avail < 0) {
+ FREE_MB_T(m);
+ return -1;
+ }
+ if (xtra > avail)
+ xtra = avail;
+ iclen += xtra;
+ m->m_data += max_linkhdr;
+ m->m_pkthdr.rcvif = (struct ifnet *)0;
+ m->m_pkthdr.len = iclen;
+ m->m_len = iclen;
+ ip = mtod(m, ip_t *);
+ icmp = (struct icmp *)((char *)ip + hlen);
+ ip2 = (ip_t *)&icmp->icmp_ip;
+
+ icmp->icmp_type = type;
+ icmp->icmp_code = fin->fin_icode;
+ icmp->icmp_cksum = 0;
+#ifdef icmp_nextmtu
+ if (type == ICMP_UNREACH &&
+ fin->fin_icode == ICMP_UNREACH_NEEDFRAG && ifp)
+ icmp->icmp_nextmtu = htons(((struct ifnet *)ifp)->if_mtu);
+#endif
+
+ bcopy((char *)fin->fin_ip, (char *)ip2, ohlen);
+
+#ifdef USE_INET6
+ ip6 = (ip6_t *)ip;
+ if (fin->fin_v == 6) {
+ ip6->ip6_flow = ((ip6_t *)fin->fin_ip)->ip6_flow;
+ ip6->ip6_plen = htons(iclen - hlen);
+ ip6->ip6_nxt = IPPROTO_ICMPV6;
+ ip6->ip6_hlim = 0;
+ ip6->ip6_src = dst6;
+ ip6->ip6_dst = fin->fin_src6;
+ if (xtra > 0)
+ bcopy((char *)fin->fin_ip + ohlen,
+ (char *)&icmp->icmp_ip + ohlen, xtra);
+ icmp->icmp_cksum = in6_cksum(m, IPPROTO_ICMPV6,
+ sizeof(*ip6), iclen - hlen);
+ } else
+#endif
+ {
+ ip2->ip_len = htons(ip2->ip_len);
+ ip2->ip_off = htons(ip2->ip_off);
+ ip->ip_p = IPPROTO_ICMP;
+ ip->ip_src.s_addr = dst4.s_addr;
+ ip->ip_dst.s_addr = fin->fin_saddr;
+
+ if (xtra > 0)
+ bcopy((char *)fin->fin_ip + ohlen,
+ (char *)&icmp->icmp_ip + ohlen, xtra);
+ icmp->icmp_cksum = ipf_cksum((u_short *)icmp,
+ sizeof(*icmp) + 8);
+ ip->ip_len = iclen;
+ ip->ip_p = IPPROTO_ICMP;
+ }
+ err = fr_send_ip(fin, m, &m);
+ return err;
+}
+
+
+#if !defined(IPFILTER_LKM) && (__FreeBSD_version < 300000)
+# if (BSD < 199306)
+int iplinit __P((void));
+
+int
+# else
+void iplinit __P((void));
+
+void
+# endif
+iplinit()
+{
+ if (ipfattach() != 0)
+ printf("IP Filter failed to attach\n");
+ ip_init();
+}
+#endif /* __FreeBSD_version < 300000 */
+
+
+int fr_fastroute(m0, mpp, fin, fdp)
+mb_t *m0, **mpp;
+fr_info_t *fin;
+frdest_t *fdp;
+{
+ register struct ip *ip, *mhip;
+ register struct mbuf *m = m0;
+ register struct route *ro;
+ int len, off, error = 0, hlen, code;
+ struct ifnet *ifp, *sifp;
+ struct sockaddr_in *dst;
+ struct route iproute;
+ u_short ip_off;
+ frentry_t *fr;
+
+ ro = NULL;
+
+#ifdef M_WRITABLE
+ /*
+ * HOT FIX/KLUDGE:
+ *
+ * If the mbuf we're about to send is not writable (because of
+ * a cluster reference, for example) we'll need to make a copy
+ * of it since this routine modifies the contents.
+ *
+ * If you have non-crappy network hardware that can transmit data
+ * from the mbuf, rather than making a copy, this is gonna be a
+ * problem.
+ */
+ if (M_WRITABLE(m) == 0) {
+ m0 = m_dup(m, M_DONTWAIT);
+ if (m0 != 0) {
+ FREE_MB_T(m);
+ m = m0;
+ *mpp = m;
+ } else {
+ error = ENOBUFS;
+ FREE_MB_T(m);
+ goto done;
+ }
+ }
+#endif
+
+#ifdef USE_INET6
+ if (fin->fin_v == 6) {
+ /*
+ * currently "to <if>" and "to <if>:ip#" are not supported
+ * for IPv6
+ */
+#if (__FreeBSD_version >= 490000)
+ return ip6_output(m0, NULL, NULL, 0, NULL, NULL, NULL);
+#else
+ return ip6_output(m0, NULL, NULL, 0, NULL, NULL);
+#endif
+ }
+#endif
+
+ hlen = fin->fin_hlen;
+ ip = mtod(m0, struct ip *);
+
+ /*
+ * Route packet.
+ */
+ ro = &iproute;
+ bzero((caddr_t)ro, sizeof (*ro));
+ dst = (struct sockaddr_in *)&ro->ro_dst;
+ dst->sin_family = AF_INET;
+ dst->sin_addr = ip->ip_dst;
+
+ fr = fin->fin_fr;
+ if (fdp != NULL)
+ ifp = fdp->fd_ifp;
+ else
+ ifp = fin->fin_ifp;
+
+ if ((ifp == NULL) && (!fr || !(fr->fr_flags & FR_FASTROUTE))) {
+ error = -2;
+ goto bad;
+ }
+
+ if ((fdp != NULL) && (fdp->fd_ip.s_addr != 0))
+ dst->sin_addr = fdp->fd_ip;
+
+ dst->sin_len = sizeof(*dst);
+ rtalloc(ro);
+
+ if ((ifp == NULL) && (ro->ro_rt != NULL))
+ ifp = ro->ro_rt->rt_ifp;
+
+ if ((ro->ro_rt == NULL) || (ifp == NULL)) {
+ if (in_localaddr(ip->ip_dst))
+ error = EHOSTUNREACH;
+ else
+ error = ENETUNREACH;
+ goto bad;
+ }
+ if (ro->ro_rt->rt_flags & RTF_GATEWAY)
+ dst = (struct sockaddr_in *)ro->ro_rt->rt_gateway;
+ if (ro->ro_rt)
+ ro->ro_rt->rt_use++;
+
+ /*
+ * For input packets which are being "fastrouted", they won't
+ * go back through output filtering and miss their chance to get
+ * NAT'd and counted. Duplicated packets aren't considered to be
+ * part of the normal packet stream, so do not NAT them or pass
+ * them through stateful checking, etc.
+ */
+ if ((fdp != &fr->fr_dif) && (fin->fin_out == 0)) {
+ sifp = fin->fin_ifp;
+ fin->fin_ifp = ifp;
+ fin->fin_out = 1;
+ (void) fr_acctpkt(fin, NULL);
+ fin->fin_fr = NULL;
+ if (!fr || !(fr->fr_flags & FR_RETMASK)) {
+ u_32_t pass;
+
+ if (fr_checkstate(fin, &pass) != NULL)
+ fr_statederef((ipstate_t **)&fin->fin_state);
+ }
+
+ switch (fr_checknatout(fin, NULL))
+ {
+ case 0 :
+ break;
+ case 1 :
+ fr_natderef((nat_t **)&fin->fin_nat);
+ ip->ip_sum = 0;
+ break;
+ case -1 :
+ error = -1;
+ goto done;
+ break;
+ }
+
+ fin->fin_ifp = sifp;
+ fin->fin_out = 0;
+ } else
+ ip->ip_sum = 0;
+ /*
+ * If small enough for interface, can just send directly.
+ */
+ if (ip->ip_len <= ifp->if_mtu) {
+ ip->ip_len = htons(ip->ip_len);
+ ip->ip_off = htons(ip->ip_off);
+
+ if (!ip->ip_sum)
+ ip->ip_sum = in_cksum(m, hlen);
+ error = (*ifp->if_output)(ifp, m, (struct sockaddr *)dst,
+ ro->ro_rt);
+ goto done;
+ }
+ /*
+ * Too large for interface; fragment if possible.
+ * Must be able to put at least 8 bytes per fragment.
+ */
+ ip_off = ntohs(ip->ip_off);
+ if (ip_off & IP_DF) {
+ error = EMSGSIZE;
+ goto bad;
+ }
+ len = (ifp->if_mtu - hlen) &~ 7;
+ if (len < 8) {
+ error = EMSGSIZE;
+ goto bad;
+ }
+
+ {
+ int mhlen, firstlen = len;
+ struct mbuf **mnext = &m->m_act;
+
+ /*
+ * Loop through length of segment after first fragment,
+ * make new header and copy data of each part and link onto chain.
+ */
+ m0 = m;
+ mhlen = sizeof (struct ip);
+ for (off = hlen + len; off < ip->ip_len; off += len) {
+#ifdef MGETHDR
+ MGETHDR(m, M_DONTWAIT, MT_HEADER);
+#else
+ MGET(m, M_DONTWAIT, MT_HEADER);
+#endif
+ if (m == 0) {
+ m = m0;
+ error = ENOBUFS;
+ goto bad;
+ }
+ m->m_data += max_linkhdr;
+ mhip = mtod(m, struct ip *);
+ bcopy((char *)ip, (char *)mhip, sizeof(*ip));
+ if (hlen > sizeof (struct ip)) {
+ mhlen = ip_optcopy(ip, mhip) + sizeof (struct ip);
+ IP_HL_A(mhip, mhlen >> 2);
+ }
+ m->m_len = mhlen;
+ mhip->ip_off = ((off - hlen) >> 3) + ip_off;
+ if (off + len >= ip->ip_len)
+ len = ip->ip_len - off;
+ else
+ mhip->ip_off |= IP_MF;
+ mhip->ip_len = htons((u_short)(len + mhlen));
+ *mnext = m;
+ m->m_next = m_copy(m0, off, len);
+ if (m->m_next == 0) {
+ error = ENOBUFS; /* ??? */
+ goto sendorfree;
+ }
+ m->m_pkthdr.len = mhlen + len;
+ m->m_pkthdr.rcvif = NULL;
+ mhip->ip_off = htons((u_short)mhip->ip_off);
+ mhip->ip_sum = 0;
+ mhip->ip_sum = in_cksum(m, mhlen);
+ mnext = &m->m_act;
+ }
+ /*
+ * Update first fragment by trimming what's been copied out
+ * and updating header, then send each fragment (in order).
+ */
+ m_adj(m0, hlen + firstlen - ip->ip_len);
+ ip->ip_len = htons((u_short)(hlen + firstlen));
+ ip->ip_off = htons((u_short)IP_MF);
+ ip->ip_sum = 0;
+ ip->ip_sum = in_cksum(m0, hlen);
+sendorfree:
+ for (m = m0; m; m = m0) {
+ m0 = m->m_act;
+ m->m_act = 0;
+ if (error == 0)
+ error = (*ifp->if_output)(ifp, m,
+ (struct sockaddr *)dst, ro->ro_rt);
+ else
+ FREE_MB_T(m);
+ }
+ }
+done:
+ if (!error)
+ fr_frouteok[0]++;
+ else
+ fr_frouteok[1]++;
+
+ if ((ro != NULL) && (ro->ro_rt != NULL)) {
+ RTFREE(ro->ro_rt);
+ }
+ *mpp = NULL;
+ return 0;
+bad:
+ if (error == EMSGSIZE) {
+ sifp = fin->fin_ifp;
+ code = fin->fin_icode;
+ fin->fin_icode = ICMP_UNREACH_NEEDFRAG;
+ fin->fin_ifp = ifp;
+ (void) fr_send_icmp_err(ICMP_UNREACH, fin, 1);
+ fin->fin_ifp = sifp;
+ fin->fin_icode = code;
+ }
+ FREE_MB_T(m);
+ goto done;
+}
+
+
+int fr_verifysrc(fin)
+fr_info_t *fin;
+{
+ struct sockaddr_in *dst;
+ struct route iproute;
+
+ bzero((char *)&iproute, sizeof(iproute));
+ dst = (struct sockaddr_in *)&iproute.ro_dst;
+ dst->sin_len = sizeof(*dst);
+ dst->sin_family = AF_INET;
+ dst->sin_addr = fin->fin_src;
+ rtalloc(&iproute);
+ if (iproute.ro_rt == NULL)
+ return 0;
+ return (fin->fin_ifp == iproute.ro_rt->rt_ifp);
+}
+
+
+/*
+ * return the first IP Address associated with an interface
+ */
+int fr_ifpaddr(v, atype, ifptr, inp, inpmask)
+int v, atype;
+void *ifptr;
+struct in_addr *inp, *inpmask;
+{
+#ifdef USE_INET6
+ struct in6_addr *inp6 = NULL;
+#endif
+ struct sockaddr *sock, *mask;
+ struct sockaddr_in *sin;
+ struct ifaddr *ifa;
+ struct ifnet *ifp;
+
+ if ((ifptr == NULL) || (ifptr == (void *)-1))
+ return -1;
+
+ sin = NULL;
+ ifp = ifptr;
+
+ if (v == 4)
+ inp->s_addr = 0;
+#ifdef USE_INET6
+ else if (v == 6)
+ bzero((char *)inp, sizeof(struct in6_addr));
+#endif
+#if (__FreeBSD_version >= 300000)
+ ifa = TAILQ_FIRST(&ifp->if_addrhead);
+#else
+ ifa = ifp->if_addrlist;
+#endif /* __FreeBSD_version >= 300000 */
+
+ sock = ifa->ifa_addr;
+ while (sock != NULL && ifa != NULL) {
+ sin = (struct sockaddr_in *)sock;
+ if ((v == 4) && (sin->sin_family == AF_INET))
+ break;
+#ifdef USE_INET6
+ if ((v == 6) && (sin->sin_family == AF_INET6)) {
+ inp6 = &((struct sockaddr_in6 *)sin)->sin6_addr;
+ if (!IN6_IS_ADDR_LINKLOCAL(inp6) &&
+ !IN6_IS_ADDR_LOOPBACK(inp6))
+ break;
+ }
+#endif
+#if (__FreeBSD_version >= 300000)
+ ifa = TAILQ_NEXT(ifa, ifa_link);
+#else
+ ifa = ifa->ifa_next;
+#endif /* __FreeBSD_version >= 300000 */
+ if (ifa != NULL)
+ sock = ifa->ifa_addr;
+ }
+
+ if (ifa == NULL || sin == NULL)
+ return -1;
+
+ mask = ifa->ifa_netmask;
+ if (atype == FRI_BROADCAST)
+ sock = ifa->ifa_broadaddr;
+ else if (atype == FRI_PEERADDR)
+ sock = ifa->ifa_dstaddr;
+
+ if (sock == NULL)
+ return -1;
+
+#ifdef USE_INET6
+ if (v == 6) {
+ return fr_ifpfillv6addr(atype, (struct sockaddr_in6 *)sock,
+ (struct sockaddr_in6 *)mask,
+ inp, inpmask);
+ }
+#endif
+ return fr_ifpfillv4addr(atype, (struct sockaddr_in *)sock,
+ (struct sockaddr_in *)mask, inp, inpmask);
+}
+
+
+u_32_t fr_newisn(fin)
+fr_info_t *fin;
+{
+ u_32_t newiss;
+#if (__FreeBSD_version >= 400000)
+ newiss = arc4random();
+#else
+ static iss_seq_off = 0;
+ u_char hash[16];
+ MD5_CTX ctx;
+
+ /*
+ * Compute the base value of the ISS. It is a hash
+ * of (saddr, sport, daddr, dport, secret).
+ */
+ MD5Init(&ctx);
+
+ MD5Update(&ctx, (u_char *) &fin->fin_fi.fi_src,
+ sizeof(fin->fin_fi.fi_src));
+ MD5Update(&ctx, (u_char *) &fin->fin_fi.fi_dst,
+ sizeof(fin->fin_fi.fi_dst));
+ MD5Update(&ctx, (u_char *) &fin->fin_dat, sizeof(fin->fin_dat));
+
+ MD5Update(&ctx, ipf_iss_secret, sizeof(ipf_iss_secret));
+
+ MD5Final(hash, &ctx);
+
+ memcpy(&newiss, hash, sizeof(newiss));
+
+ /*
+ * Now increment our "timer", and add it in to
+ * the computed value.
+ *
+ * XXX Use `addin'?
+ * XXX TCP_ISSINCR too large to use?
+ */
+ iss_seq_off += 0x00010000;
+ newiss += iss_seq_off;
+#endif
+ return newiss;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_nextipid */
+/* Returns: int - 0 == success, -1 == error (packet should be droppped) */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* Returns the next IPv4 ID to use for this packet. */
+/* ------------------------------------------------------------------------ */
+u_short fr_nextipid(fin)
+fr_info_t *fin;
+{
+#ifndef RANDOM_IP_ID
+ static u_short ipid = 0;
+ u_short id;
+
+ MUTEX_ENTER(&ipf_rw);
+ id = ipid++;
+ MUTEX_EXIT(&ipf_rw);
+#else
+ u_short id;
+
+ id = ip_randomid();
+#endif
+
+ return id;
+}
+
+
+INLINE void fr_checkv4sum(fin)
+fr_info_t *fin;
+{
+#ifdef CSUM_DATA_VALID
+ int manual = 0;
+ u_short sum;
+ ip_t *ip;
+ mb_t *m;
+
+ if ((fin->fin_flx & FI_NOCKSUM) != 0)
+ return;
+
+ m = fin->fin_m;
+ if (m == NULL) {
+ manual = 1;
+ goto skipauto;
+ }
+ ip = fin->fin_ip;
+
+ if (m->m_pkthdr.csum_flags & CSUM_DATA_VALID) {
+ if (m->m_pkthdr.csum_flags & CSUM_PSEUDO_HDR)
+ sum = m->m_pkthdr.csum_data;
+ else
+ sum = in_pseudo(ip->ip_src.s_addr, ip->ip_dst.s_addr,
+ htonl(m->m_pkthdr.csum_data +
+ fin->fin_ip->ip_len + fin->fin_p));
+ sum ^= 0xffff;
+ if (sum != 0)
+ fin->fin_flx |= FI_BAD;
+ } else
+ manual = 1;
+skipauto:
+# ifdef IPFILTER_CKSUM
+ if (manual != 0)
+ if (fr_checkl4sum(fin) == -1)
+ fin->fin_flx |= FI_BAD;
+# else
+ ;
+# endif
+#else
+# ifdef IPFILTER_CKSUM
+ if (fr_checkl4sum(fin) == -1)
+ fin->fin_flx |= FI_BAD;
+# endif
+#endif
+}
+
+
+#ifdef USE_INET6
+INLINE void fr_checkv6sum(fin)
+fr_info_t *fin;
+{
+# ifdef IPFILTER_CKSUM
+ if (fr_checkl4sum(fin) == -1)
+ fin->fin_flx |= FI_BAD;
+# endif
+}
+#endif /* USE_INET6 */
+
+
+size_t mbufchainlen(m0)
+struct mbuf *m0;
+{
+ size_t len;
+
+ if ((m0->m_flags & M_PKTHDR) != 0) {
+ len = m0->m_pkthdr.len;
+ } else {
+ struct mbuf *m;
+
+ for (m = m0, len = 0; m != NULL; m = m->m_next)
+ len += m->m_len;
+ }
+ return len;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_pullup */
+/* Returns: NULL == pullup failed, else pointer to protocol header */
+/* Parameters: m(I) - pointer to buffer where data packet starts */
+/* fin(I) - pointer to packet information */
+/* len(I) - number of bytes to pullup */
+/* */
+/* Attempt to move at least len bytes (from the start of the buffer) into a */
+/* single buffer for ease of access. Operating system native functions are */
+/* used to manage buffers - if necessary. If the entire packet ends up in */
+/* a single buffer, set the FI_COALESCE flag even though fr_coalesce() has */
+/* not been called. Both fin_ip and fin_dp are updated before exiting _IF_ */
+/* and ONLY if the pullup succeeds. */
+/* */
+/* We assume that 'min' is a pointer to a buffer that is part of the chain */
+/* of buffers that starts at *fin->fin_mp. */
+/* ------------------------------------------------------------------------ */
+void *fr_pullup(min, fin, len)
+mb_t *min;
+fr_info_t *fin;
+int len;
+{
+ int out = fin->fin_out, dpoff, ipoff;
+ mb_t *m = min;
+ char *ip;
+
+ if (m == NULL)
+ return NULL;
+
+ ip = (char *)fin->fin_ip;
+ if ((fin->fin_flx & FI_COALESCE) != 0)
+ return ip;
+
+ ipoff = fin->fin_ipoff;
+ if (fin->fin_dp != NULL)
+ dpoff = (char *)fin->fin_dp - (char *)ip;
+ else
+ dpoff = 0;
+
+ if (M_LEN(m) < len) {
+#ifdef MHLEN
+ /*
+ * Assume that M_PKTHDR is set and just work with what is left
+ * rather than check..
+ * Should not make any real difference, anyway.
+ */
+ if (len > MHLEN)
+#else
+ if (len > MLEN)
+#endif
+ {
+#ifdef HAVE_M_PULLDOWN
+ if (m_pulldown(m, 0, len, NULL) == NULL)
+ m = NULL;
+#else
+ FREE_MB_T(*fin->fin_mp);
+ m = NULL;
+#endif
+ } else
+ {
+ m = m_pullup(m, len);
+ }
+ *fin->fin_mp = m;
+ fin->fin_m = m;
+ if (m == NULL) {
+ ATOMIC_INCL(frstats[out].fr_pull[1]);
+ return NULL;
+ }
+ ip = MTOD(m, char *) + ipoff;
+ }
+
+ ATOMIC_INCL(frstats[out].fr_pull[0]);
+ fin->fin_ip = (ip_t *)ip;
+ if (fin->fin_dp != NULL)
+ fin->fin_dp = (char *)fin->fin_ip + dpoff;
+
+ if (len == fin->fin_plen)
+ fin->fin_flx |= FI_COALESCE;
+ return ip;
+}
+
+
+int ipf_inject(fin, m)
+fr_info_t *fin;
+mb_t *m;
+{
+ int error = 0;
+
+ if (fin->fin_out == 0) {
+#if (__FreeBSD_version >= 501000)
+ netisr_dispatch(NETISR_IP, m);
+#else
+ struct ifqueue *ifq;
+
+ ifq = &ipintrq;
+
+# ifdef _IF_QFULL
+ if (_IF_QFULL(ifq))
+# else
+ if (IF_QFULL(ifq))
+# endif
+ {
+# ifdef _IF_DROP
+ _IF_DROP(ifq);
+# else
+ IF_DROP(ifq);
+# endif
+ FREE_MB_T(m);
+ error = ENOBUFS;
+ } else {
+ IF_ENQUEUE(ifq, m);
+ }
+#endif
+ } else {
+#if (__FreeBSD_version >= 470102)
+ error = ip_output(m, NULL, NULL, IP_FORWARDING, NULL, NULL);
+#else
+ error = ip_output(m, NULL, NULL, IP_FORWARDING, NULL);
+#endif
+ }
+
+ return error;
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_frag.c b/sys/contrib/ipfilter/netinet/ip_frag.c
new file mode 100644
index 0000000..02e7bd1
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_frag.c
@@ -0,0 +1,993 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1993-2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#ifdef __hpux
+# include <sys/timeout.h>
+#endif
+#if !defined(_KERNEL)
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+# define _KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+#endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 220000)
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#if !defined(linux)
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if defined(_KERNEL)
+# include <sys/systm.h>
+# if !defined(__SVR4) && !defined(__svr4__)
+# include <sys/mbuf.h>
+# endif
+#endif
+#if !defined(__SVR4) && !defined(__svr4__)
+# if defined(_KERNEL) && !defined(__sgi) && !defined(AIX)
+# include <sys/kernel.h>
+# endif
+#else
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#if !defined(linux)
+# include <netinet/ip_var.h>
+#endif
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_auth.h"
+#include "netinet/ip_proxy.h"
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+# if defined(_KERNEL)
+# ifndef IPFILTER_LKM
+# include <sys/libkern.h>
+# include <sys/systm.h>
+# endif
+extern struct callout_handle fr_slowtimer_ch;
+# endif
+#endif
+#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104230000)
+# include <sys/callout.h>
+extern struct callout fr_slowtimer_ch;
+#endif
+#if defined(__OpenBSD__)
+# include <sys/timeout.h>
+extern struct timeout fr_slowtimer_ch;
+#endif
+/* END OF INCLUDES */
+
+#if !defined(lint)
+static const char sccsid[] = "@(#)ip_frag.c 1.11 3/24/96 (C) 1993-2000 Darren Reed";
+static const char rcsid[] = "@(#)$FreeBSD$";
+/* static const char rcsid[] = "@(#)$Id: ip_frag.c,v 2.77.2.5 2006/02/26 08:26:54 darrenr Exp $";*/
+#endif
+
+
+ipfr_t *ipfr_list = NULL;
+ipfr_t **ipfr_tail = &ipfr_list;
+
+ipfr_t *ipfr_natlist = NULL;
+ipfr_t **ipfr_nattail = &ipfr_natlist;
+
+ipfr_t *ipfr_ipidlist = NULL;
+ipfr_t **ipfr_ipidtail = &ipfr_ipidlist;
+
+static ipfr_t **ipfr_heads;
+static ipfr_t **ipfr_nattab;
+static ipfr_t **ipfr_ipidtab;
+
+static ipfrstat_t ipfr_stats;
+static int ipfr_inuse = 0;
+int ipfr_size = IPFT_SIZE;
+
+int fr_ipfrttl = 120; /* 60 seconds */
+int fr_frag_lock = 0;
+int fr_frag_init = 0;
+u_long fr_ticks = 0;
+
+
+static ipfr_t *ipfr_newfrag __P((fr_info_t *, u_32_t, ipfr_t **));
+static ipfr_t *fr_fraglookup __P((fr_info_t *, ipfr_t **));
+static void fr_fragdelete __P((ipfr_t *, ipfr_t ***));
+static void fr_fragfree __P((ipfr_t *));
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fraginit */
+/* Returns: int - 0 == success, -1 == error */
+/* Parameters: Nil */
+/* */
+/* Initialise the hash tables for the fragment cache lookups. */
+/* ------------------------------------------------------------------------ */
+int fr_fraginit()
+{
+ KMALLOCS(ipfr_heads, ipfr_t **, ipfr_size * sizeof(ipfr_t *));
+ if (ipfr_heads == NULL)
+ return -1;
+ bzero((char *)ipfr_heads, ipfr_size * sizeof(ipfr_t *));
+
+ KMALLOCS(ipfr_nattab, ipfr_t **, ipfr_size * sizeof(ipfr_t *));
+ if (ipfr_nattab == NULL)
+ return -1;
+ bzero((char *)ipfr_nattab, ipfr_size * sizeof(ipfr_t *));
+
+ KMALLOCS(ipfr_ipidtab, ipfr_t **, ipfr_size * sizeof(ipfr_t *));
+ if (ipfr_ipidtab == NULL)
+ return -1;
+ bzero((char *)ipfr_ipidtab, ipfr_size * sizeof(ipfr_t *));
+
+ RWLOCK_INIT(&ipf_frag, "ipf fragment rwlock");
+ fr_frag_init = 1;
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fragunload */
+/* Returns: Nil */
+/* Parameters: Nil */
+/* */
+/* Free all memory allocated whilst running and from initialisation. */
+/* ------------------------------------------------------------------------ */
+void fr_fragunload()
+{
+ if (fr_frag_init == 1) {
+ fr_fragclear();
+
+ RW_DESTROY(&ipf_frag);
+ fr_frag_init = 0;
+ }
+
+ if (ipfr_heads != NULL)
+ KFREES(ipfr_heads, ipfr_size * sizeof(ipfr_t *));
+ ipfr_heads = NULL;
+
+ if (ipfr_nattab != NULL)
+ KFREES(ipfr_nattab, ipfr_size * sizeof(ipfr_t *));
+ ipfr_nattab = NULL;
+
+ if (ipfr_ipidtab != NULL)
+ KFREES(ipfr_ipidtab, ipfr_size * sizeof(ipfr_t *));
+ ipfr_ipidtab = NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fragstats */
+/* Returns: ipfrstat_t* - pointer to struct with current frag stats */
+/* Parameters: Nil */
+/* */
+/* Updates ipfr_stats with current information and returns a pointer to it */
+/* ------------------------------------------------------------------------ */
+ipfrstat_t *fr_fragstats()
+{
+ ipfr_stats.ifs_table = ipfr_heads;
+ ipfr_stats.ifs_nattab = ipfr_nattab;
+ ipfr_stats.ifs_inuse = ipfr_inuse;
+ return &ipfr_stats;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipfr_newfrag */
+/* Returns: ipfr_t * - pointer to fragment cache state info or NULL */
+/* Parameters: fin(I) - pointer to packet information */
+/* table(I) - pointer to frag table to add to */
+/* */
+/* Add a new entry to the fragment cache, registering it as having come */
+/* through this box, with the result of the filter operation. */
+/* ------------------------------------------------------------------------ */
+static ipfr_t *ipfr_newfrag(fin, pass, table)
+fr_info_t *fin;
+u_32_t pass;
+ipfr_t *table[];
+{
+ ipfr_t *fra, frag;
+ u_int idx, off;
+ frentry_t *fr;
+ ip_t *ip;
+
+ if (ipfr_inuse >= IPFT_SIZE)
+ return NULL;
+
+ if ((fin->fin_flx & (FI_FRAG|FI_BAD)) != FI_FRAG)
+ return NULL;
+
+ ip = fin->fin_ip;
+
+ if (pass & FR_FRSTRICT)
+ if (fin->fin_off != 0)
+ return NULL;
+
+ frag.ipfr_p = ip->ip_p;
+ idx = ip->ip_p;
+ frag.ipfr_id = ip->ip_id;
+ idx += ip->ip_id;
+ frag.ipfr_tos = ip->ip_tos;
+ frag.ipfr_src.s_addr = ip->ip_src.s_addr;
+ idx += ip->ip_src.s_addr;
+ frag.ipfr_dst.s_addr = ip->ip_dst.s_addr;
+ idx += ip->ip_dst.s_addr;
+ frag.ipfr_ifp = fin->fin_ifp;
+ idx *= 127;
+ idx %= IPFT_SIZE;
+
+ frag.ipfr_optmsk = fin->fin_fi.fi_optmsk & IPF_OPTCOPY;
+ frag.ipfr_secmsk = fin->fin_fi.fi_secmsk;
+ frag.ipfr_auth = fin->fin_fi.fi_auth;
+
+ /*
+ * first, make sure it isn't already there...
+ */
+ for (fra = table[idx]; (fra != NULL); fra = fra->ipfr_hnext)
+ if (!bcmp((char *)&frag.ipfr_ifp, (char *)&fra->ipfr_ifp,
+ IPFR_CMPSZ)) {
+ ipfr_stats.ifs_exists++;
+ return NULL;
+ }
+
+ /*
+ * allocate some memory, if possible, if not, just record that we
+ * failed to do so.
+ */
+ KMALLOC(fra, ipfr_t *);
+ if (fra == NULL) {
+ ipfr_stats.ifs_nomem++;
+ return NULL;
+ }
+
+ fr = fin->fin_fr;
+ fra->ipfr_rule = fr;
+ if (fr != NULL) {
+ MUTEX_ENTER(&fr->fr_lock);
+ fr->fr_ref++;
+ MUTEX_EXIT(&fr->fr_lock);
+ }
+
+ /*
+ * Insert the fragment into the fragment table, copy the struct used
+ * in the search using bcopy rather than reassign each field.
+ * Set the ttl to the default.
+ */
+ if ((fra->ipfr_hnext = table[idx]) != NULL)
+ table[idx]->ipfr_hprev = &fra->ipfr_hnext;
+ fra->ipfr_hprev = table + idx;
+ fra->ipfr_data = NULL;
+ table[idx] = fra;
+ bcopy((char *)&frag.ipfr_ifp, (char *)&fra->ipfr_ifp, IPFR_CMPSZ);
+ fra->ipfr_ttl = fr_ticks + fr_ipfrttl;
+
+ /*
+ * Compute the offset of the expected start of the next packet.
+ */
+ off = ip->ip_off & IP_OFFMASK;
+ if (off == 0)
+ fra->ipfr_seen0 = 1;
+ fra->ipfr_off = off + (fin->fin_dlen >> 3);
+ fra->ipfr_pass = pass;
+ fra->ipfr_ref = 1;
+ ipfr_stats.ifs_new++;
+ ipfr_inuse++;
+ return fra;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_newfrag */
+/* Returns: int - 0 == success, -1 == error */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* Add a new entry to the fragment cache table based on the current packet */
+/* ------------------------------------------------------------------------ */
+int fr_newfrag(fin, pass)
+u_32_t pass;
+fr_info_t *fin;
+{
+ ipfr_t *fra;
+
+ if ((fin->fin_v != 4) || (fr_frag_lock != 0))
+ return -1;
+
+ WRITE_ENTER(&ipf_frag);
+ fra = ipfr_newfrag(fin, pass, ipfr_heads);
+ if (fra != NULL) {
+ *ipfr_tail = fra;
+ fra->ipfr_prev = ipfr_tail;
+ ipfr_tail = &fra->ipfr_next;
+ if (ipfr_list == NULL)
+ ipfr_list = fra;
+ fra->ipfr_next = NULL;
+ }
+ RWLOCK_EXIT(&ipf_frag);
+ return fra ? 0 : -1;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_nat_newfrag */
+/* Returns: int - 0 == success, -1 == error */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT structure */
+/* */
+/* Create a new NAT fragment cache entry based on the current packet and */
+/* the NAT structure for this "session". */
+/* ------------------------------------------------------------------------ */
+int fr_nat_newfrag(fin, pass, nat)
+fr_info_t *fin;
+u_32_t pass;
+nat_t *nat;
+{
+ ipfr_t *fra;
+
+ if ((fin->fin_v != 4) || (fr_frag_lock != 0))
+ return 0;
+
+ WRITE_ENTER(&ipf_natfrag);
+ fra = ipfr_newfrag(fin, pass, ipfr_nattab);
+ if (fra != NULL) {
+ fra->ipfr_data = nat;
+ nat->nat_data = fra;
+ *ipfr_nattail = fra;
+ fra->ipfr_prev = ipfr_nattail;
+ ipfr_nattail = &fra->ipfr_next;
+ fra->ipfr_next = NULL;
+ }
+ RWLOCK_EXIT(&ipf_natfrag);
+ return fra ? 0 : -1;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_ipid_newfrag */
+/* Returns: int - 0 == success, -1 == error */
+/* Parameters: fin(I) - pointer to packet information */
+/* ipid(I) - new IP ID for this fragmented packet */
+/* */
+/* Create a new fragment cache entry for this packet and store, as a data */
+/* pointer, the new IP ID value. */
+/* ------------------------------------------------------------------------ */
+int fr_ipid_newfrag(fin, ipid)
+fr_info_t *fin;
+u_32_t ipid;
+{
+ ipfr_t *fra;
+
+ if ((fin->fin_v != 4) || (fr_frag_lock))
+ return 0;
+
+ WRITE_ENTER(&ipf_ipidfrag);
+ fra = ipfr_newfrag(fin, 0, ipfr_ipidtab);
+ if (fra != NULL) {
+ fra->ipfr_data = (void *)(uintptr_t)ipid;
+ *ipfr_ipidtail = fra;
+ fra->ipfr_prev = ipfr_ipidtail;
+ ipfr_ipidtail = &fra->ipfr_next;
+ fra->ipfr_next = NULL;
+ }
+ RWLOCK_EXIT(&ipf_ipidfrag);
+ return fra ? 0 : -1;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fraglookup */
+/* Returns: ipfr_t * - pointer to ipfr_t structure if there's a */
+/* matching entry in the frag table, else NULL */
+/* Parameters: fin(I) - pointer to packet information */
+/* table(I) - pointer to fragment cache table to search */
+/* */
+/* Check the fragment cache to see if there is already a record of this */
+/* packet with its filter result known. */
+/* ------------------------------------------------------------------------ */
+static ipfr_t *fr_fraglookup(fin, table)
+fr_info_t *fin;
+ipfr_t *table[];
+{
+ ipfr_t *f, frag;
+ u_int idx;
+ ip_t *ip;
+
+ if ((fin->fin_flx & (FI_FRAG|FI_BAD)) != FI_FRAG)
+ return NULL;
+
+ /*
+ * For fragments, we record protocol, packet id, TOS and both IP#'s
+ * (these should all be the same for all fragments of a packet).
+ *
+ * build up a hash value to index the table with.
+ */
+ ip = fin->fin_ip;
+ frag.ipfr_p = ip->ip_p;
+ idx = ip->ip_p;
+ frag.ipfr_id = ip->ip_id;
+ idx += ip->ip_id;
+ frag.ipfr_tos = ip->ip_tos;
+ frag.ipfr_src.s_addr = ip->ip_src.s_addr;
+ idx += ip->ip_src.s_addr;
+ frag.ipfr_dst.s_addr = ip->ip_dst.s_addr;
+ idx += ip->ip_dst.s_addr;
+ frag.ipfr_ifp = fin->fin_ifp;
+ idx *= 127;
+ idx %= IPFT_SIZE;
+
+ frag.ipfr_optmsk = fin->fin_fi.fi_optmsk & IPF_OPTCOPY;
+ frag.ipfr_secmsk = fin->fin_fi.fi_secmsk;
+ frag.ipfr_auth = fin->fin_fi.fi_auth;
+
+ /*
+ * check the table, careful to only compare the right amount of data
+ */
+ for (f = table[idx]; f; f = f->ipfr_hnext)
+ if (!bcmp((char *)&frag.ipfr_ifp, (char *)&f->ipfr_ifp,
+ IPFR_CMPSZ)) {
+ u_short off;
+
+ /*
+ * We don't want to let short packets match because
+ * they could be compromising the security of other
+ * rules that want to match on layer 4 fields (and
+ * can't because they have been fragmented off.)
+ * Why do this check here? The counter acts as an
+ * indicator of this kind of attack, whereas if it was
+ * elsewhere, it wouldn't know if other matching
+ * packets had been seen.
+ */
+ if (fin->fin_flx & FI_SHORT) {
+ ATOMIC_INCL(ipfr_stats.ifs_short);
+ continue;
+ }
+
+ /*
+ * XXX - We really need to be guarding against the
+ * retransmission of (src,dst,id,offset-range) here
+ * because a fragmented packet is never resent with
+ * the same IP ID# (or shouldn't).
+ */
+ off = ip->ip_off & IP_OFFMASK;
+ if (f->ipfr_seen0) {
+ if (off == 0) {
+ ATOMIC_INCL(ipfr_stats.ifs_retrans0);
+ continue;
+ }
+ } else if (off == 0)
+ f->ipfr_seen0 = 1;
+
+ if (f != table[idx]) {
+ ipfr_t **fp;
+
+ /*
+ * Move fragment info. to the top of the list
+ * to speed up searches. First, delink...
+ */
+ fp = f->ipfr_hprev;
+ (*fp) = f->ipfr_hnext;
+ if (f->ipfr_hnext != NULL)
+ f->ipfr_hnext->ipfr_hprev = fp;
+ /*
+ * Then put back at the top of the chain.
+ */
+ f->ipfr_hnext = table[idx];
+ table[idx]->ipfr_hprev = &f->ipfr_hnext;
+ f->ipfr_hprev = table + idx;
+ table[idx] = f;
+ }
+
+ /*
+ * If we've follwed the fragments, and this is the
+ * last (in order), shrink expiration time.
+ */
+ if (off == f->ipfr_off) {
+ if (!(ip->ip_off & IP_MF))
+ f->ipfr_ttl = fr_ticks + 1;
+ f->ipfr_off = (fin->fin_dlen >> 3) + off;
+ } else if (f->ipfr_pass & FR_FRSTRICT)
+ continue;
+ ATOMIC_INCL(ipfr_stats.ifs_hits);
+ return f;
+ }
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_nat_knownfrag */
+/* Returns: nat_t* - pointer to 'parent' NAT structure if frag table */
+/* match found, else NULL */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* Functional interface for NAT lookups of the NAT fragment cache */
+/* ------------------------------------------------------------------------ */
+nat_t *fr_nat_knownfrag(fin)
+fr_info_t *fin;
+{
+ nat_t *nat;
+ ipfr_t *ipf;
+
+ if ((fin->fin_v != 4) || (fr_frag_lock) || !ipfr_natlist)
+ return NULL;
+ READ_ENTER(&ipf_natfrag);
+ ipf = fr_fraglookup(fin, ipfr_nattab);
+ if (ipf != NULL) {
+ nat = ipf->ipfr_data;
+ /*
+ * This is the last fragment for this packet.
+ */
+ if ((ipf->ipfr_ttl == fr_ticks + 1) && (nat != NULL)) {
+ nat->nat_data = NULL;
+ ipf->ipfr_data = NULL;
+ }
+ } else
+ nat = NULL;
+ RWLOCK_EXIT(&ipf_natfrag);
+ return nat;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_ipid_knownfrag */
+/* Returns: u_32_t - IPv4 ID for this packet if match found, else */
+/* return 0xfffffff to indicate no match. */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* Functional interface for IP ID lookups of the IP ID fragment cache */
+/* ------------------------------------------------------------------------ */
+u_32_t fr_ipid_knownfrag(fin)
+fr_info_t *fin;
+{
+ ipfr_t *ipf;
+ u_32_t id;
+
+ if ((fin->fin_v != 4) || (fr_frag_lock) || !ipfr_ipidlist)
+ return 0xffffffff;
+
+ READ_ENTER(&ipf_ipidfrag);
+ ipf = fr_fraglookup(fin, ipfr_ipidtab);
+ if (ipf != NULL)
+ id = (u_32_t)(uintptr_t)ipf->ipfr_data;
+ else
+ id = 0xffffffff;
+ RWLOCK_EXIT(&ipf_ipidfrag);
+ return id;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_knownfrag */
+/* Returns: frentry_t* - pointer to filter rule if a match is found in */
+/* the frag cache table, else NULL. */
+/* Parameters: fin(I) - pointer to packet information */
+/* passp(O) - pointer to where to store rule flags resturned */
+/* */
+/* Functional interface for normal lookups of the fragment cache. If a */
+/* match is found, return the rule pointer and flags from the rule, except */
+/* that if FR_LOGFIRST is set, reset FR_LOG. */
+/* ------------------------------------------------------------------------ */
+frentry_t *fr_knownfrag(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ frentry_t *fr = NULL;
+ ipfr_t *fra;
+ u_32_t pass;
+
+ if ((fin->fin_v != 4) || (fr_frag_lock) || (ipfr_list == NULL))
+ return NULL;
+
+ READ_ENTER(&ipf_frag);
+ fra = fr_fraglookup(fin, ipfr_heads);
+ if (fra != NULL) {
+ fr = fra->ipfr_rule;
+ fin->fin_fr = fr;
+ if (fr != NULL) {
+ pass = fr->fr_flags;
+ if ((pass & FR_LOGFIRST) != 0)
+ pass &= ~(FR_LOGFIRST|FR_LOG);
+ *passp = pass;
+ }
+ }
+ RWLOCK_EXIT(&ipf_frag);
+ return fr;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_forget */
+/* Returns: Nil */
+/* Parameters: ptr(I) - pointer to data structure */
+/* */
+/* Search through all of the fragment cache entries and wherever a pointer */
+/* is found to match ptr, reset it to NULL. */
+/* ------------------------------------------------------------------------ */
+void fr_forget(ptr)
+void *ptr;
+{
+ ipfr_t *fr;
+
+ WRITE_ENTER(&ipf_frag);
+ for (fr = ipfr_list; fr; fr = fr->ipfr_next)
+ if (fr->ipfr_data == ptr)
+ fr->ipfr_data = NULL;
+ RWLOCK_EXIT(&ipf_frag);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_forgetnat */
+/* Returns: Nil */
+/* Parameters: ptr(I) - pointer to data structure */
+/* */
+/* Search through all of the fragment cache entries for NAT and wherever a */
+/* pointer is found to match ptr, reset it to NULL. */
+/* ------------------------------------------------------------------------ */
+void fr_forgetnat(ptr)
+void *ptr;
+{
+ ipfr_t *fr;
+
+ WRITE_ENTER(&ipf_natfrag);
+ for (fr = ipfr_natlist; fr; fr = fr->ipfr_next)
+ if (fr->ipfr_data == ptr)
+ fr->ipfr_data = NULL;
+ RWLOCK_EXIT(&ipf_natfrag);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fragdelete */
+/* Returns: Nil */
+/* Parameters: fra(I) - pointer to fragment structure to delete */
+/* tail(IO) - pointer to the pointer to the tail of the frag */
+/* list */
+/* */
+/* Remove a fragment cache table entry from the table & list. Also free */
+/* the filter rule it is associated with it if it is no longer used as a */
+/* result of decreasing the reference count. */
+/* ------------------------------------------------------------------------ */
+static void fr_fragdelete(fra, tail)
+ipfr_t *fra, ***tail;
+{
+
+ if (fra->ipfr_next)
+ fra->ipfr_next->ipfr_prev = fra->ipfr_prev;
+ *fra->ipfr_prev = fra->ipfr_next;
+ if (*tail == &fra->ipfr_next)
+ *tail = fra->ipfr_prev;
+
+ if (fra->ipfr_hnext)
+ fra->ipfr_hnext->ipfr_hprev = fra->ipfr_hprev;
+ *fra->ipfr_hprev = fra->ipfr_hnext;
+
+ if (fra->ipfr_rule != NULL) {
+ (void) fr_derefrule(&fra->ipfr_rule);
+ }
+
+ if (fra->ipfr_ref <= 0)
+ fr_fragfree(fra);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fragfree */
+/* Returns: Nil */
+/* Parameters: fra - pointer to frag structure to free */
+/* */
+/* Take care of the details associated with deleting an entry from the frag */
+/* cache. Currently this just means bumping stats correctly after freeing */
+/* ------------------------------------------------------------------------ */
+static void fr_fragfree(fra)
+ipfr_t *fra;
+{
+ KFREE(fra);
+ ipfr_stats.ifs_expire++;
+ ipfr_inuse--;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fragclear */
+/* Returns: Nil */
+/* Parameters: Nil */
+/* */
+/* Free memory in use by fragment state information kept. Do the normal */
+/* fragment state stuff first and then the NAT-fragment table. */
+/* ------------------------------------------------------------------------ */
+void fr_fragclear()
+{
+ ipfr_t *fra;
+ nat_t *nat;
+
+ WRITE_ENTER(&ipf_frag);
+ while ((fra = ipfr_list) != NULL) {
+ fra->ipfr_ref--;
+ fr_fragdelete(fra, &ipfr_tail);
+ }
+ ipfr_tail = &ipfr_list;
+ RWLOCK_EXIT(&ipf_frag);
+
+ WRITE_ENTER(&ipf_nat);
+ WRITE_ENTER(&ipf_natfrag);
+ while ((fra = ipfr_natlist) != NULL) {
+ nat = fra->ipfr_data;
+ if (nat != NULL) {
+ if (nat->nat_data == fra)
+ nat->nat_data = NULL;
+ }
+ fra->ipfr_ref--;
+ fr_fragdelete(fra, &ipfr_nattail);
+ }
+ ipfr_nattail = &ipfr_natlist;
+ RWLOCK_EXIT(&ipf_natfrag);
+ RWLOCK_EXIT(&ipf_nat);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fragexpire */
+/* Returns: Nil */
+/* Parameters: Nil */
+/* */
+/* Expire entries in the fragment cache table that have been there too long */
+/* ------------------------------------------------------------------------ */
+void fr_fragexpire()
+{
+ ipfr_t **fp, *fra;
+ nat_t *nat;
+ SPL_INT(s);
+
+ if (fr_frag_lock)
+ return;
+
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_frag);
+ /*
+ * Go through the entire table, looking for entries to expire,
+ * which is indicated by the ttl being less than or equal to fr_ticks.
+ */
+ for (fp = &ipfr_list; ((fra = *fp) != NULL); ) {
+ if (fra->ipfr_ttl > fr_ticks)
+ break;
+ fra->ipfr_ref--;
+ fr_fragdelete(fra, &ipfr_tail);
+ }
+ RWLOCK_EXIT(&ipf_frag);
+
+ WRITE_ENTER(&ipf_ipidfrag);
+ for (fp = &ipfr_ipidlist; ((fra = *fp) != NULL); ) {
+ if (fra->ipfr_ttl > fr_ticks)
+ break;
+ fra->ipfr_ref--;
+ fr_fragdelete(fra, &ipfr_ipidtail);
+ }
+ RWLOCK_EXIT(&ipf_ipidfrag);
+
+ /*
+ * Same again for the NAT table, except that if the structure also
+ * still points to a NAT structure, and the NAT structure points back
+ * at the one to be free'd, NULL the reference from the NAT struct.
+ * NOTE: We need to grab both mutex's early, and in this order so as
+ * to prevent a deadlock if both try to expire at the same time.
+ * The extra if() statement here is because it locks out all NAT
+ * operations - no need to do that if there are no entries in this
+ * list, right?
+ */
+ if (ipfr_natlist != NULL) {
+ WRITE_ENTER(&ipf_nat);
+ WRITE_ENTER(&ipf_natfrag);
+ for (fp = &ipfr_natlist; ((fra = *fp) != NULL); ) {
+ if (fra->ipfr_ttl > fr_ticks)
+ break;
+ nat = fra->ipfr_data;
+ if (nat != NULL) {
+ if (nat->nat_data == fra)
+ nat->nat_data = NULL;
+ }
+ fra->ipfr_ref--;
+ fr_fragdelete(fra, &ipfr_nattail);
+ }
+ RWLOCK_EXIT(&ipf_natfrag);
+ RWLOCK_EXIT(&ipf_nat);
+ }
+ SPL_X(s);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_slowtimer */
+/* Returns: Nil */
+/* Parameters: Nil */
+/* */
+/* Slowly expire held state for fragments. Timeouts are set * in */
+/* expectation of this being called twice per second. */
+/* ------------------------------------------------------------------------ */
+#if !defined(_KERNEL) || (!SOLARIS && !defined(__hpux) && !defined(__sgi) && \
+ !defined(__osf__) && !defined(linux))
+# if defined(_KERNEL) && ((BSD >= 199103) || defined(__sgi))
+void fr_slowtimer __P((void *ptr))
+# else
+int fr_slowtimer()
+# endif
+{
+ READ_ENTER(&ipf_global);
+
+ ipf_expiretokens();
+ fr_fragexpire();
+ fr_timeoutstate();
+ fr_natexpire();
+ fr_authexpire();
+ fr_ticks++;
+ if (fr_running <= 0)
+ goto done;
+# ifdef _KERNEL
+# if defined(__NetBSD__) && (__NetBSD_Version__ >= 104240000)
+ callout_reset(&fr_slowtimer_ch, hz / 2, fr_slowtimer, NULL);
+# else
+# if defined(__OpenBSD__)
+ timeout_add(&fr_slowtimer_ch, hz/2);
+# else
+# if (__FreeBSD_version >= 300000)
+ fr_slowtimer_ch = timeout(fr_slowtimer, NULL, hz/2);
+# else
+# ifdef linux
+ ;
+# else
+ timeout(fr_slowtimer, NULL, hz/2);
+# endif
+# endif /* FreeBSD */
+# endif /* OpenBSD */
+# endif /* NetBSD */
+# endif
+done:
+ RWLOCK_EXIT(&ipf_global);
+# if (BSD < 199103) || !defined(_KERNEL)
+ return 0;
+# endif
+}
+#endif /* !SOLARIS && !defined(__hpux) && !defined(__sgi) */
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_nextfrag */
+/* Returns: int - 0 == success, else error */
+/* Parameters: token(I) - pointer to token information for this caller */
+/* itp(I) - pointer to generic iterator from caller */
+/* top(I) - top of the fragment list */
+/* tail(I) - tail of the fragment list */
+/* lock(I) - fragment cache lock */
+/* */
+/* This function is used to interate through the list of entries in the */
+/* fragment cache. It increases the reference count on the one currently */
+/* being returned so that the caller can come back and resume from it later.*/
+/* */
+/* This function is used for both the NAT fragment cache as well as the ipf */
+/* fragment cache - hence the reason for passing in top, tail and lock. */
+/* ------------------------------------------------------------------------ */
+int fr_nextfrag(token, itp, top, tail
+#ifdef USE_MUTEXES
+, lock
+#endif
+)
+ipftoken_t *token;
+ipfgeniter_t *itp;
+ipfr_t **top, ***tail;
+#ifdef USE_MUTEXES
+ipfrwlock_t *lock;
+#endif
+{
+ ipfr_t *frag, *next, zero;
+ int error = 0;
+
+ frag = token->ipt_data;
+ if (frag == (ipfr_t *)-1) {
+ ipf_freetoken(token);
+ return ESRCH;
+ }
+
+ READ_ENTER(lock);
+ if (frag == NULL)
+ next = *top;
+ else
+ next = frag->ipfr_next;
+
+ if (next != NULL) {
+ ATOMIC_INC(next->ipfr_ref);
+ token->ipt_data = next;
+ } else {
+ bzero(&zero, sizeof(zero));
+ next = &zero;
+ token->ipt_data = (void *)-1;
+ }
+ RWLOCK_EXIT(lock);
+
+ if (frag != NULL) {
+ WRITE_ENTER(lock);
+ frag->ipfr_ref--;
+ if (frag->ipfr_ref <= 0)
+ fr_fragfree(frag);
+ RWLOCK_EXIT(lock);
+ }
+
+ error = COPYOUT(next, itp->igi_data, sizeof(*next));
+ if (error != 0)
+ error = EFAULT;
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fragderef */
+/* Returns: Nil */
+/* Parameters: frp(IO) - pointer to fragment structure to deference */
+/* lock(I) - lock associated with the fragment */
+/* */
+/* This function dereferences a fragment structure (ipfr_t). The pointer */
+/* passed in will always be reset back to NULL, even if the structure is */
+/* not freed, to enforce the notion that the caller is no longer entitled */
+/* to use the pointer it is dropping the reference to. */
+/* ------------------------------------------------------------------------ */
+void fr_fragderef(frp
+#ifdef USE_MUTEXES
+, lock
+#endif
+)
+ipfr_t **frp;
+#ifdef USE_MUTEXES
+ipfrwlock_t *lock;
+#endif
+{
+ ipfr_t *fra;
+
+ fra = *frp;
+ *frp = NULL;
+
+ WRITE_ENTER(lock);
+ fra->ipfr_ref--;
+ if (fra->ipfr_ref <= 0)
+ fr_fragfree(fra);
+ RWLOCK_EXIT(lock);
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_frag.h b/sys/contrib/ipfilter/netinet/ip_frag.h
new file mode 100644
index 0000000..227dbcd
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_frag.h
@@ -0,0 +1,108 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1993-2001 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * @(#)ip_frag.h 1.5 3/24/96
+ * $FreeBSD$
+ * Id: ip_frag.h,v 2.23.2.1 2004/03/29 16:21:56 darrenr Exp
+ */
+
+#ifndef __IP_FRAG_H__
+#define __IP_FRAG_H__
+
+#define IPFT_SIZE 257
+
+typedef struct ipfr {
+ struct ipfr *ipfr_hnext, **ipfr_hprev;
+ struct ipfr *ipfr_next, **ipfr_prev;
+ void *ipfr_data;
+ frentry_t *ipfr_rule;
+ u_long ipfr_ttl;
+ int ipfr_ref;
+ u_short ipfr_off;
+ u_short ipfr_seen0;
+ /*
+ * All of the fields, from ipfr_ifp to ipfr_pass, are compared
+ * using bcmp to see if an identical entry is present. It is
+ * therefore important for this set to remain together.
+ */
+ void *ipfr_ifp;
+ struct in_addr ipfr_src;
+ struct in_addr ipfr_dst;
+ u_32_t ipfr_optmsk;
+ u_short ipfr_secmsk;
+ u_short ipfr_auth;
+ u_short ipfr_id;
+ u_char ipfr_p;
+ u_char ipfr_tos;
+ u_32_t ipfr_pass;
+} ipfr_t;
+
+
+typedef struct ipfrstat {
+ u_long ifs_exists; /* add & already exists */
+ u_long ifs_nomem;
+ u_long ifs_new;
+ u_long ifs_hits;
+ u_long ifs_expire;
+ u_long ifs_inuse;
+ u_long ifs_retrans0;
+ u_long ifs_short;
+ struct ipfr **ifs_table;
+ struct ipfr **ifs_nattab;
+} ipfrstat_t;
+
+#define IPFR_CMPSZ (offsetof(ipfr_t, ipfr_pass) - \
+ offsetof(ipfr_t, ipfr_ifp))
+
+extern ipfr_t *ipfr_list, **ipfr_tail;
+extern ipfr_t *ipfr_natlist, **ipfr_nattail;
+extern int ipfr_size;
+extern int fr_ipfrttl;
+extern int fr_frag_lock;
+extern int fr_fraginit __P((void));
+extern void fr_fragunload __P((void));
+extern ipfrstat_t *fr_fragstats __P((void));
+
+extern int fr_newfrag __P((fr_info_t *, u_32_t));
+extern frentry_t *fr_knownfrag __P((fr_info_t *, u_32_t *));
+
+extern int fr_nat_newfrag __P((fr_info_t *, u_32_t, struct nat *));
+extern nat_t *fr_nat_knownfrag __P((fr_info_t *));
+
+extern int fr_ipid_newfrag __P((fr_info_t *, u_32_t));
+extern u_32_t fr_ipid_knownfrag __P((fr_info_t *));
+#ifdef USE_MUTEXES
+extern void fr_fragderef __P((ipfr_t **, ipfrwlock_t *));
+extern int fr_nextfrag __P((ipftoken_t *, ipfgeniter_t *, ipfr_t **, \
+ ipfr_t ***, ipfrwlock_t *));
+#else
+extern void fr_fragderef __P((ipfr_t **));
+extern int fr_nextfrag __P((ipftoken_t *, ipfgeniter_t *, ipfr_t **, \
+ ipfr_t ***));
+#endif
+
+extern void fr_forget __P((void *));
+extern void fr_forgetnat __P((void *));
+extern void fr_fragclear __P((void));
+extern void fr_fragexpire __P((void));
+
+#if defined(_KERNEL) && ((BSD >= 199306) || SOLARIS || defined(__sgi) \
+ || defined(__osf__) || (defined(__sgi) && (IRIX >= 60500)))
+# if defined(SOLARIS2) && (SOLARIS2 < 7)
+extern void fr_slowtimer __P((void));
+# else
+extern void fr_slowtimer __P((void *));
+# endif
+#else
+# if defined(linux) && defined(_KERNEL)
+extern void fr_slowtimer __P((long));
+# else
+extern int fr_slowtimer __P((void));
+# endif
+#endif
+
+#endif /* __IP_FRAG_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_ftp_pxy.c b/sys/contrib/ipfilter/netinet/ip_ftp_pxy.c
new file mode 100644
index 0000000..f56a690
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_ftp_pxy.c
@@ -0,0 +1,1431 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1997-2003 by Darren Reed
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * Simple FTP transparent proxy for in-kernel use. For use with the NAT
+ * code.
+ *
+ * $FreeBSD$
+ * Id: ip_ftp_pxy.c,v 2.88.2.19 2006/04/01 10:14:53 darrenr Exp $
+ */
+
+#define IPF_FTP_PROXY
+
+#define IPF_MINPORTLEN 18
+#define IPF_MAXPORTLEN 30
+#define IPF_MIN227LEN 39
+#define IPF_MAX227LEN 51
+#define IPF_MIN229LEN 47
+#define IPF_MAX229LEN 51
+
+#define FTPXY_GO 0
+#define FTPXY_INIT 1
+#define FTPXY_USER_1 2
+#define FTPXY_USOK_1 3
+#define FTPXY_PASS_1 4
+#define FTPXY_PAOK_1 5
+#define FTPXY_AUTH_1 6
+#define FTPXY_AUOK_1 7
+#define FTPXY_ADAT_1 8
+#define FTPXY_ADOK_1 9
+#define FTPXY_ACCT_1 10
+#define FTPXY_ACOK_1 11
+#define FTPXY_USER_2 12
+#define FTPXY_USOK_2 13
+#define FTPXY_PASS_2 14
+#define FTPXY_PAOK_2 15
+
+/*
+ * Values for FTP commands. Numerics cover 0-999
+ */
+#define FTPXY_C_PASV 1000
+
+int ippr_ftp_client __P((fr_info_t *, ip_t *, nat_t *, ftpinfo_t *, int));
+int ippr_ftp_complete __P((char *, size_t));
+int ippr_ftp_in __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_ftp_init __P((void));
+void ippr_ftp_fini __P((void));
+int ippr_ftp_new __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_ftp_out __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_ftp_pasv __P((fr_info_t *, ip_t *, nat_t *, ftpinfo_t *, int));
+int ippr_ftp_epsv __P((fr_info_t *, ip_t *, nat_t *, ftpside_t *, int));
+int ippr_ftp_port __P((fr_info_t *, ip_t *, nat_t *, ftpside_t *, int));
+int ippr_ftp_process __P((fr_info_t *, nat_t *, ftpinfo_t *, int));
+int ippr_ftp_server __P((fr_info_t *, ip_t *, nat_t *, ftpinfo_t *, int));
+int ippr_ftp_valid __P((ftpinfo_t *, int, char *, size_t));
+int ippr_ftp_server_valid __P((ftpside_t *, char *, size_t));
+int ippr_ftp_client_valid __P((ftpside_t *, char *, size_t));
+u_short ippr_ftp_atoi __P((char **));
+int ippr_ftp_pasvreply __P((fr_info_t *, ip_t *, nat_t *, ftpside_t *,
+ u_int, char *, char *, u_int));
+
+
+int ftp_proxy_init = 0;
+int ippr_ftp_pasvonly = 0;
+int ippr_ftp_insecure = 0; /* Do not require logins before transfers */
+int ippr_ftp_pasvrdr = 0;
+int ippr_ftp_forcepasv = 0; /* PASV must be last command prior to 227 */
+#if defined(_KERNEL)
+int ippr_ftp_debug = 0;
+#else
+int ippr_ftp_debug = 2;
+#endif
+/*
+ * 1 - security
+ * 2 - errors
+ * 3 - error debugging
+ * 4 - parsing errors
+ * 5 - parsing info
+ * 6 - parsing debug
+ */
+
+static frentry_t ftppxyfr;
+static ipftuneable_t ftptune = {
+ { &ippr_ftp_debug },
+ "ippr_ftp_debug",
+ 0,
+ 10,
+ sizeof(ippr_ftp_debug),
+ 0,
+ NULL
+};
+
+
+/*
+ * Initialize local structures.
+ */
+int ippr_ftp_init()
+{
+ bzero((char *)&ftppxyfr, sizeof(ftppxyfr));
+ ftppxyfr.fr_ref = 1;
+ ftppxyfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ MUTEX_INIT(&ftppxyfr.fr_lock, "FTP Proxy Mutex");
+ ftp_proxy_init = 1;
+ (void) fr_addipftune(&ftptune);
+
+ return 0;
+}
+
+
+void ippr_ftp_fini()
+{
+ (void) fr_delipftune(&ftptune);
+
+ if (ftp_proxy_init == 1) {
+ MUTEX_DESTROY(&ftppxyfr.fr_lock);
+ ftp_proxy_init = 0;
+ }
+}
+
+
+int ippr_ftp_new(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ ftpinfo_t *ftp;
+ ftpside_t *f;
+
+ KMALLOC(ftp, ftpinfo_t *);
+ if (ftp == NULL)
+ return -1;
+
+ fin = fin; /* LINT */
+ nat = nat; /* LINT */
+
+ aps->aps_data = ftp;
+ aps->aps_psiz = sizeof(ftpinfo_t);
+
+ bzero((char *)ftp, sizeof(*ftp));
+ f = &ftp->ftp_side[0];
+ f->ftps_rptr = f->ftps_buf;
+ f->ftps_wptr = f->ftps_buf;
+ f = &ftp->ftp_side[1];
+ f->ftps_rptr = f->ftps_buf;
+ f->ftps_wptr = f->ftps_buf;
+ ftp->ftp_passok = FTPXY_INIT;
+ ftp->ftp_incok = 0;
+ return 0;
+}
+
+
+int ippr_ftp_port(fin, ip, nat, f, dlen)
+fr_info_t *fin;
+ip_t *ip;
+nat_t *nat;
+ftpside_t *f;
+int dlen;
+{
+ tcphdr_t *tcp, tcph, *tcp2 = &tcph;
+ char newbuf[IPF_FTPBUFSZ], *s;
+ struct in_addr swip, swip2;
+ u_int a1, a2, a3, a4;
+ int inc, off, flags;
+ u_short a5, a6, sp;
+ size_t nlen, olen;
+ fr_info_t fi;
+ nat_t *nat2;
+ mb_t *m;
+
+ m = fin->fin_m;
+ tcp = (tcphdr_t *)fin->fin_dp;
+ off = (char *)tcp - (char *)ip + (TCP_OFF(tcp) << 2) + fin->fin_ipoff;
+
+ /*
+ * Check for client sending out PORT message.
+ */
+ if (dlen < IPF_MINPORTLEN) {
+ if (ippr_ftp_debug > 1)
+ printf("ippr_ftp_port:dlen(%d) < IPF_MINPORTLEN\n",
+ dlen);
+ return 0;
+ }
+ /*
+ * Skip the PORT command + space
+ */
+ s = f->ftps_rptr + 5;
+ /*
+ * Pick out the address components, two at a time.
+ */
+ a1 = ippr_ftp_atoi(&s);
+ if (s == NULL) {
+ if (ippr_ftp_debug > 1)
+ printf("ippr_ftp_port:ippr_ftp_atoi(%d) failed\n", 1);
+ return 0;
+ }
+ a2 = ippr_ftp_atoi(&s);
+ if (s == NULL) {
+ if (ippr_ftp_debug > 1)
+ printf("ippr_ftp_port:ippr_ftp_atoi(%d) failed\n", 2);
+ return 0;
+ }
+
+ /*
+ * Check that IP address in the PORT/PASV reply is the same as the
+ * sender of the command - prevents using PORT for port scanning.
+ */
+ a1 <<= 16;
+ a1 |= a2;
+ if (((nat->nat_dir == NAT_OUTBOUND) &&
+ (a1 != ntohl(nat->nat_inip.s_addr))) ||
+ ((nat->nat_dir == NAT_INBOUND) &&
+ (a1 != ntohl(nat->nat_oip.s_addr)))) {
+ if (ippr_ftp_debug > 0)
+ printf("ippr_ftp_port:%s != nat->nat_inip\n", "a1");
+ return APR_ERR(1);
+ }
+
+ a5 = ippr_ftp_atoi(&s);
+ if (s == NULL) {
+ if (ippr_ftp_debug > 1)
+ printf("ippr_ftp_port:ippr_ftp_atoi(%d) failed\n", 3);
+ return 0;
+ }
+ if (*s == ')')
+ s++;
+
+ /*
+ * check for CR-LF at the end.
+ */
+ if (*s == '\n')
+ s--;
+ if ((*s == '\r') && (*(s + 1) == '\n')) {
+ s += 2;
+ a6 = a5 & 0xff;
+ } else {
+ if (ippr_ftp_debug > 1)
+ printf("ippr_ftp_port:missing %s\n", "cr-lf");
+ return 0;
+ }
+
+ a5 >>= 8;
+ a5 &= 0xff;
+ sp = a5 << 8 | a6;
+ /*
+ * Don't allow the PORT command to specify a port < 1024 due to
+ * security crap.
+ */
+ if (sp < 1024) {
+ if (ippr_ftp_debug > 0)
+ printf("ippr_ftp_port:sp(%d) < 1024\n", sp);
+ return 0;
+ }
+ /*
+ * Calculate new address parts for PORT command
+ */
+ if (nat->nat_dir == NAT_INBOUND)
+ a1 = ntohl(nat->nat_oip.s_addr);
+ else
+ a1 = ntohl(ip->ip_src.s_addr);
+ a2 = (a1 >> 16) & 0xff;
+ a3 = (a1 >> 8) & 0xff;
+ a4 = a1 & 0xff;
+ a1 >>= 24;
+ olen = s - f->ftps_rptr;
+ /* DO NOT change this to snprintf! */
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(newbuf, sizeof(newbuf), "%s %u,%u,%u,%u,%u,%u\r\n",
+ "PORT", a1, a2, a3, a4, a5, a6);
+#else
+ (void) sprintf(newbuf, "%s %u,%u,%u,%u,%u,%u\r\n",
+ "PORT", a1, a2, a3, a4, a5, a6);
+#endif
+
+ nlen = strlen(newbuf);
+ inc = nlen - olen;
+ if ((inc + ip->ip_len) > 65535) {
+ if (ippr_ftp_debug > 0)
+ printf("ippr_ftp_port:inc(%d) + ip->ip_len > 65535\n",
+ inc);
+ return 0;
+ }
+
+#if !defined(_KERNEL)
+ bcopy(newbuf, MTOD(m, char *) + off, nlen);
+#else
+# if defined(MENTAT)
+ if (inc < 0)
+ (void)adjmsg(m, inc);
+# else /* defined(MENTAT) */
+ /*
+ * m_adj takes care of pkthdr.len, if required and treats inc<0 to
+ * mean remove -len bytes from the end of the packet.
+ * The mbuf chain will be extended if necessary by m_copyback().
+ */
+ if (inc < 0)
+ m_adj(m, inc);
+# endif /* defined(MENTAT) */
+#endif /* !defined(_KERNEL) */
+ COPYBACK(m, off, nlen, newbuf);
+
+ if (inc != 0) {
+ ip->ip_len += inc;
+ fin->fin_dlen += inc;
+ fin->fin_plen += inc;
+ }
+
+ /*
+ * The server may not make the connection back from port 20, but
+ * it is the most likely so use it here to check for a conflicting
+ * mapping.
+ */
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ fi.fin_state = NULL;
+ fi.fin_nat = NULL;
+ fi.fin_flx |= FI_IGNORE;
+ fi.fin_data[0] = sp;
+ fi.fin_data[1] = fin->fin_data[1] - 1;
+ /*
+ * Add skeleton NAT entry for connection which will come back the
+ * other way.
+ */
+ if (nat->nat_dir == NAT_OUTBOUND)
+ nat2 = nat_outlookup(&fi, NAT_SEARCH|IPN_TCP, nat->nat_p,
+ nat->nat_inip, nat->nat_oip);
+ else
+ nat2 = nat_inlookup(&fi, NAT_SEARCH|IPN_TCP, nat->nat_p,
+ nat->nat_inip, nat->nat_oip);
+ if (nat2 == NULL) {
+ int slen;
+
+ slen = ip->ip_len;
+ ip->ip_len = fin->fin_hlen + sizeof(*tcp2);
+ bzero((char *)tcp2, sizeof(*tcp2));
+ tcp2->th_win = htons(8192);
+ tcp2->th_sport = htons(sp);
+ TCP_OFF_A(tcp2, 5);
+ tcp2->th_flags = TH_SYN;
+ tcp2->th_dport = 0; /* XXX - don't specify remote port */
+ fi.fin_data[1] = 0;
+ fi.fin_dlen = sizeof(*tcp2);
+ fi.fin_plen = fi.fin_hlen + sizeof(*tcp2);
+ fi.fin_dp = (char *)tcp2;
+ fi.fin_fr = &ftppxyfr;
+ fi.fin_out = nat->nat_dir;
+ fi.fin_flx &= FI_LOWTTL|FI_FRAG|FI_TCPUDP|FI_OPTIONS|FI_IGNORE;
+ swip = ip->ip_src;
+ swip2 = ip->ip_dst;
+ if (nat->nat_dir == NAT_OUTBOUND) {
+ fi.fin_fi.fi_saddr = nat->nat_inip.s_addr;
+ ip->ip_src = nat->nat_inip;
+ } else if (nat->nat_dir == NAT_INBOUND) {
+ fi.fin_fi.fi_saddr = nat->nat_oip.s_addr;
+ ip->ip_src = nat->nat_oip;
+ }
+
+ flags = NAT_SLAVE|IPN_TCP|SI_W_DPORT;
+ if (nat->nat_dir == NAT_INBOUND)
+ flags |= NAT_NOTRULEPORT;
+ nat2 = nat_new(&fi, nat->nat_ptr, NULL, flags, nat->nat_dir);
+
+ if (nat2 != NULL) {
+ (void) nat_proto(&fi, nat2, IPN_TCP);
+ nat_update(&fi, nat2, nat->nat_ptr);
+ fi.fin_ifp = NULL;
+ if (nat->nat_dir == NAT_INBOUND) {
+ fi.fin_fi.fi_daddr = nat->nat_inip.s_addr;
+ ip->ip_dst = nat->nat_inip;
+ }
+ (void) fr_addstate(&fi, NULL, SI_W_DPORT);
+ if (fi.fin_state != NULL)
+ fr_statederef((ipstate_t **)&fi.fin_state);
+ }
+ ip->ip_len = slen;
+ ip->ip_src = swip;
+ ip->ip_dst = swip2;
+ }
+ return APR_INC(inc);
+}
+
+
+int ippr_ftp_client(fin, ip, nat, ftp, dlen)
+fr_info_t *fin;
+nat_t *nat;
+ftpinfo_t *ftp;
+ip_t *ip;
+int dlen;
+{
+ char *rptr, *wptr, cmd[6], c;
+ ftpside_t *f;
+ int inc, i;
+
+ inc = 0;
+ f = &ftp->ftp_side[0];
+ rptr = f->ftps_rptr;
+ wptr = f->ftps_wptr;
+
+ for (i = 0; (i < 5) && (i < dlen); i++) {
+ c = rptr[i];
+ if (ISALPHA(c)) {
+ cmd[i] = TOUPPER(c);
+ } else {
+ cmd[i] = c;
+ }
+ }
+ cmd[i] = '\0';
+
+ ftp->ftp_incok = 0;
+ if (!strncmp(cmd, "USER ", 5) || !strncmp(cmd, "XAUT ", 5)) {
+ if (ftp->ftp_passok == FTPXY_ADOK_1 ||
+ ftp->ftp_passok == FTPXY_AUOK_1) {
+ ftp->ftp_passok = FTPXY_USER_2;
+ ftp->ftp_incok = 1;
+ } else {
+ ftp->ftp_passok = FTPXY_USER_1;
+ ftp->ftp_incok = 1;
+ }
+ } else if (!strncmp(cmd, "AUTH ", 5)) {
+ ftp->ftp_passok = FTPXY_AUTH_1;
+ ftp->ftp_incok = 1;
+ } else if (!strncmp(cmd, "PASS ", 5)) {
+ if (ftp->ftp_passok == FTPXY_USOK_1) {
+ ftp->ftp_passok = FTPXY_PASS_1;
+ ftp->ftp_incok = 1;
+ } else if (ftp->ftp_passok == FTPXY_USOK_2) {
+ ftp->ftp_passok = FTPXY_PASS_2;
+ ftp->ftp_incok = 1;
+ }
+ } else if ((ftp->ftp_passok == FTPXY_AUOK_1) &&
+ !strncmp(cmd, "ADAT ", 5)) {
+ ftp->ftp_passok = FTPXY_ADAT_1;
+ ftp->ftp_incok = 1;
+ } else if ((ftp->ftp_passok == FTPXY_PAOK_1 ||
+ ftp->ftp_passok == FTPXY_PAOK_2) &&
+ !strncmp(cmd, "ACCT ", 5)) {
+ ftp->ftp_passok = FTPXY_ACCT_1;
+ ftp->ftp_incok = 1;
+ } else if ((ftp->ftp_passok == FTPXY_GO) && !ippr_ftp_pasvonly &&
+ !strncmp(cmd, "PORT ", 5)) {
+ inc = ippr_ftp_port(fin, ip, nat, f, dlen);
+ } else if (ippr_ftp_insecure && !ippr_ftp_pasvonly &&
+ !strncmp(cmd, "PORT ", 5)) {
+ inc = ippr_ftp_port(fin, ip, nat, f, dlen);
+ }
+
+ while ((*rptr++ != '\n') && (rptr < wptr))
+ ;
+ f->ftps_rptr = rptr;
+ return inc;
+}
+
+
+int ippr_ftp_pasv(fin, ip, nat, ftp, dlen)
+fr_info_t *fin;
+ip_t *ip;
+nat_t *nat;
+ftpinfo_t *ftp;
+int dlen;
+{
+ u_int a1, a2, a3, a4, data_ip;
+ char newbuf[IPF_FTPBUFSZ];
+ const char *brackets[2];
+ u_short a5, a6;
+ ftpside_t *f;
+ char *s;
+
+ if (ippr_ftp_forcepasv != 0 &&
+ ftp->ftp_side[0].ftps_cmds != FTPXY_C_PASV) {
+ if (ippr_ftp_debug > 0)
+ printf("ippr_ftp_pasv:ftps_cmds(%d) != FTPXY_C_PASV\n",
+ ftp->ftp_side[0].ftps_cmds);
+ return 0;
+ }
+
+ f = &ftp->ftp_side[1];
+
+#define PASV_REPLEN 24
+ /*
+ * Check for PASV reply message.
+ */
+ if (dlen < IPF_MIN227LEN) {
+ if (ippr_ftp_debug > 1)
+ printf("ippr_ftp_pasv:dlen(%d) < IPF_MIN227LEN\n",
+ dlen);
+ return 0;
+ } else if (strncmp(f->ftps_rptr,
+ "227 Entering Passive Mod", PASV_REPLEN)) {
+ if (ippr_ftp_debug > 0)
+ printf("ippr_ftp_pasv:%d reply wrong\n", 227);
+ return 0;
+ }
+
+ brackets[0] = "";
+ brackets[1] = "";
+ /*
+ * Skip the PASV reply + space
+ */
+ s = f->ftps_rptr + PASV_REPLEN;
+ while (*s && !ISDIGIT(*s)) {
+ if (*s == '(') {
+ brackets[0] = "(";
+ brackets[1] = ")";
+ }
+ s++;
+ }
+
+ /*
+ * Pick out the address components, two at a time.
+ */
+ a1 = ippr_ftp_atoi(&s);
+ if (s == NULL) {
+ if (ippr_ftp_debug > 1)
+ printf("ippr_ftp_pasv:ippr_ftp_atoi(%d) failed\n", 1);
+ return 0;
+ }
+ a2 = ippr_ftp_atoi(&s);
+ if (s == NULL) {
+ if (ippr_ftp_debug > 1)
+ printf("ippr_ftp_pasv:ippr_ftp_atoi(%d) failed\n", 2);
+ return 0;
+ }
+
+ /*
+ * check that IP address in the PASV reply is the same as the
+ * sender of the command - prevents using PASV for port scanning.
+ */
+ a1 <<= 16;
+ a1 |= a2;
+
+ if (((nat->nat_dir == NAT_INBOUND) &&
+ (a1 != ntohl(nat->nat_inip.s_addr))) ||
+ ((nat->nat_dir == NAT_OUTBOUND) &&
+ (a1 != ntohl(nat->nat_oip.s_addr)))) {
+ if (ippr_ftp_debug > 0)
+ printf("ippr_ftp_pasv:%s != nat->nat_oip\n", "a1");
+ return 0;
+ }
+
+ a5 = ippr_ftp_atoi(&s);
+ if (s == NULL) {
+ if (ippr_ftp_debug > 1)
+ printf("ippr_ftp_pasv:ippr_ftp_atoi(%d) failed\n", 3);
+ return 0;
+ }
+
+ if (*s == ')')
+ s++;
+ if (*s == '.')
+ s++;
+ if (*s == '\n')
+ s--;
+ /*
+ * check for CR-LF at the end.
+ */
+ if ((*s == '\r') && (*(s + 1) == '\n')) {
+ s += 2;
+ } else {
+ if (ippr_ftp_debug > 1)
+ printf("ippr_ftp_pasv:missing %s", "cr-lf\n");
+ return 0;
+ }
+
+ a6 = a5 & 0xff;
+ a5 >>= 8;
+ /*
+ * Calculate new address parts for 227 reply
+ */
+ if (nat->nat_dir == NAT_INBOUND) {
+ data_ip = nat->nat_outip.s_addr;
+ a1 = ntohl(data_ip);
+ } else
+ data_ip = htonl(a1);
+
+ a2 = (a1 >> 16) & 0xff;
+ a3 = (a1 >> 8) & 0xff;
+ a4 = a1 & 0xff;
+ a1 >>= 24;
+
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(newbuf, sizeof(newbuf), "%s %s%u,%u,%u,%u,%u,%u%s\r\n",
+ "227 Entering Passive Mode", brackets[0], a1, a2, a3, a4,
+ a5, a6, brackets[1]);
+#else
+ (void) sprintf(newbuf, "%s %s%u,%u,%u,%u,%u,%u%s\r\n",
+ "227 Entering Passive Mode", brackets[0], a1, a2, a3, a4,
+ a5, a6, brackets[1]);
+#endif
+ return ippr_ftp_pasvreply(fin, ip, nat, f, (a5 << 8 | a6),
+ newbuf, s, data_ip);
+}
+
+int ippr_ftp_pasvreply(fin, ip, nat, f, port, newmsg, s, data_ip)
+fr_info_t *fin;
+ip_t *ip;
+nat_t *nat;
+ftpside_t *f;
+u_int port;
+char *newmsg;
+char *s;
+u_int data_ip;
+{
+ int inc, off, nflags, sflags;
+ tcphdr_t *tcp, tcph, *tcp2;
+ struct in_addr swip, swip2;
+ struct in_addr data_addr;
+ size_t nlen, olen;
+ fr_info_t fi;
+ nat_t *nat2;
+ mb_t *m;
+
+ m = fin->fin_m;
+ tcp = (tcphdr_t *)fin->fin_dp;
+ off = (char *)tcp - (char *)ip + (TCP_OFF(tcp) << 2) + fin->fin_ipoff;
+
+ data_addr.s_addr = data_ip;
+ tcp2 = &tcph;
+ inc = 0;
+
+
+ olen = s - f->ftps_rptr;
+ nlen = strlen(newmsg);
+ inc = nlen - olen;
+ if ((inc + ip->ip_len) > 65535) {
+ if (ippr_ftp_debug > 0)
+ printf("ippr_ftp_pasv:inc(%d) + ip->ip_len > 65535\n",
+ inc);
+ return 0;
+ }
+
+#if !defined(_KERNEL)
+ bcopy(newmsg, MTOD(m, char *) + off, nlen);
+#else
+# if defined(MENTAT)
+ if (inc < 0)
+ (void)adjmsg(m, inc);
+# else /* defined(MENTAT) */
+ /*
+ * m_adj takes care of pkthdr.len, if required and treats inc<0 to
+ * mean remove -len bytes from the end of the packet.
+ * The mbuf chain will be extended if necessary by m_copyback().
+ */
+ if (inc < 0)
+ m_adj(m, inc);
+# endif /* defined(MENTAT) */
+#endif /* !defined(_KERNEL) */
+ COPYBACK(m, off, nlen, newmsg);
+
+ if (inc != 0) {
+ ip->ip_len += inc;
+ fin->fin_dlen += inc;
+ fin->fin_plen += inc;
+ }
+
+ /*
+ * Add skeleton NAT entry for connection which will come back the
+ * other way.
+ */
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ fi.fin_state = NULL;
+ fi.fin_nat = NULL;
+ fi.fin_flx |= FI_IGNORE;
+ fi.fin_data[0] = 0;
+ fi.fin_data[1] = port;
+ nflags = IPN_TCP|SI_W_SPORT;
+ if (ippr_ftp_pasvrdr && f->ftps_ifp)
+ nflags |= SI_W_DPORT;
+ if (nat->nat_dir == NAT_OUTBOUND)
+ nat2 = nat_outlookup(&fi, nflags|NAT_SEARCH,
+ nat->nat_p, nat->nat_inip, nat->nat_oip);
+ else
+ nat2 = nat_inlookup(&fi, nflags|NAT_SEARCH,
+ nat->nat_p, nat->nat_inip, nat->nat_oip);
+ if (nat2 == NULL) {
+ int slen;
+
+ slen = ip->ip_len;
+ ip->ip_len = fin->fin_hlen + sizeof(*tcp2);
+ bzero((char *)tcp2, sizeof(*tcp2));
+ tcp2->th_win = htons(8192);
+ tcp2->th_sport = 0; /* XXX - fake it for nat_new */
+ TCP_OFF_A(tcp2, 5);
+ tcp2->th_flags = TH_SYN;
+ fi.fin_data[1] = port;
+ fi.fin_dlen = sizeof(*tcp2);
+ tcp2->th_dport = htons(port);
+ fi.fin_data[0] = 0;
+ fi.fin_dp = (char *)tcp2;
+ fi.fin_plen = fi.fin_hlen + sizeof(*tcp);
+ fi.fin_fr = &ftppxyfr;
+ fi.fin_out = nat->nat_dir;
+ fi.fin_flx &= FI_LOWTTL|FI_FRAG|FI_TCPUDP|FI_OPTIONS|FI_IGNORE;
+ swip = ip->ip_src;
+ swip2 = ip->ip_dst;
+ if (nat->nat_dir == NAT_OUTBOUND) {
+ fi.fin_fi.fi_daddr = data_addr.s_addr;
+ fi.fin_fi.fi_saddr = nat->nat_inip.s_addr;
+ ip->ip_dst = data_addr;
+ ip->ip_src = nat->nat_inip;
+ } else if (nat->nat_dir == NAT_INBOUND) {
+ fi.fin_fi.fi_saddr = nat->nat_oip.s_addr;
+ fi.fin_fi.fi_daddr = nat->nat_outip.s_addr;
+ ip->ip_src = nat->nat_oip;
+ ip->ip_dst = nat->nat_outip;
+ }
+
+ sflags = nflags;
+ nflags |= NAT_SLAVE;
+ if (nat->nat_dir == NAT_INBOUND)
+ nflags |= NAT_NOTRULEPORT;
+ nat2 = nat_new(&fi, nat->nat_ptr, NULL, nflags, nat->nat_dir);
+ if (nat2 != NULL) {
+ (void) nat_proto(&fi, nat2, IPN_TCP);
+ nat_update(&fi, nat2, nat->nat_ptr);
+ fi.fin_ifp = NULL;
+ if (nat->nat_dir == NAT_INBOUND) {
+ fi.fin_fi.fi_daddr = nat->nat_inip.s_addr;
+ ip->ip_dst = nat->nat_inip;
+ }
+ (void) fr_addstate(&fi, NULL, sflags);
+ if (fi.fin_state != NULL)
+ fr_statederef((ipstate_t **)&fi.fin_state);
+ }
+
+ ip->ip_len = slen;
+ ip->ip_src = swip;
+ ip->ip_dst = swip2;
+ }
+ return inc;
+}
+
+
+int ippr_ftp_server(fin, ip, nat, ftp, dlen)
+fr_info_t *fin;
+ip_t *ip;
+nat_t *nat;
+ftpinfo_t *ftp;
+int dlen;
+{
+ char *rptr, *wptr;
+ ftpside_t *f;
+ int inc;
+
+ inc = 0;
+ f = &ftp->ftp_side[1];
+ rptr = f->ftps_rptr;
+ wptr = f->ftps_wptr;
+
+ if (*rptr == ' ')
+ goto server_cmd_ok;
+ if (!ISDIGIT(*rptr) || !ISDIGIT(*(rptr + 1)) || !ISDIGIT(*(rptr + 2)))
+ return 0;
+ if (ftp->ftp_passok == FTPXY_GO) {
+ if (!strncmp(rptr, "227 ", 4))
+ inc = ippr_ftp_pasv(fin, ip, nat, ftp, dlen);
+ else if (!strncmp(rptr, "229 ", 4))
+ inc = ippr_ftp_epsv(fin, ip, nat, f, dlen);
+ } else if (ippr_ftp_insecure && !strncmp(rptr, "227 ", 4)) {
+ inc = ippr_ftp_pasv(fin, ip, nat, ftp, dlen);
+ } else if (ippr_ftp_insecure && !strncmp(rptr, "229 ", 4)) {
+ inc = ippr_ftp_epsv(fin, ip, nat, f, dlen);
+ } else if (*rptr == '5' || *rptr == '4')
+ ftp->ftp_passok = FTPXY_INIT;
+ else if (ftp->ftp_incok) {
+ if (*rptr == '3') {
+ if (ftp->ftp_passok == FTPXY_ACCT_1)
+ ftp->ftp_passok = FTPXY_GO;
+ else
+ ftp->ftp_passok++;
+ } else if (*rptr == '2') {
+ switch (ftp->ftp_passok)
+ {
+ case FTPXY_USER_1 :
+ case FTPXY_USER_2 :
+ case FTPXY_PASS_1 :
+ case FTPXY_PASS_2 :
+ case FTPXY_ACCT_1 :
+ ftp->ftp_passok = FTPXY_GO;
+ break;
+ default :
+ ftp->ftp_passok += 3;
+ break;
+ }
+ }
+ }
+server_cmd_ok:
+ ftp->ftp_incok = 0;
+
+ while ((*rptr++ != '\n') && (rptr < wptr))
+ ;
+ f->ftps_rptr = rptr;
+ return inc;
+}
+
+
+/*
+ * Look to see if the buffer starts with something which we recognise as
+ * being the correct syntax for the FTP protocol.
+ */
+int ippr_ftp_client_valid(ftps, buf, len)
+ftpside_t *ftps;
+char *buf;
+size_t len;
+{
+ register char *s, c, pc;
+ register size_t i = len;
+ char cmd[5];
+
+ s = buf;
+
+ if (ftps->ftps_junk == 1)
+ return 1;
+
+ if (i < 5) {
+ if (ippr_ftp_debug > 3)
+ printf("ippr_ftp_client_valid:i(%d) < 5\n", (int)i);
+ return 2;
+ }
+
+ i--;
+ c = *s++;
+
+ if (ISALPHA(c)) {
+ cmd[0] = TOUPPER(c);
+ c = *s++;
+ i--;
+ if (ISALPHA(c)) {
+ cmd[1] = TOUPPER(c);
+ c = *s++;
+ i--;
+ if (ISALPHA(c)) {
+ cmd[2] = TOUPPER(c);
+ c = *s++;
+ i--;
+ if (ISALPHA(c)) {
+ cmd[3] = TOUPPER(c);
+ c = *s++;
+ i--;
+ if ((c != ' ') && (c != '\r'))
+ goto bad_client_command;
+ } else if ((c != ' ') && (c != '\r'))
+ goto bad_client_command;
+ } else
+ goto bad_client_command;
+ } else
+ goto bad_client_command;
+ } else {
+bad_client_command:
+ if (ippr_ftp_debug > 3)
+ printf("%s:bad:junk %d len %d/%d c 0x%x buf [%*.*s]\n",
+ "ippr_ftp_client_valid",
+ ftps->ftps_junk, (int)len, (int)i, c,
+ (int)len, (int)len, buf);
+ return 1;
+ }
+
+ for (; i; i--) {
+ pc = c;
+ c = *s++;
+ if ((pc == '\r') && (c == '\n')) {
+ cmd[4] = '\0';
+ if (!strcmp(cmd, "PASV"))
+ ftps->ftps_cmds = FTPXY_C_PASV;
+ else
+ ftps->ftps_cmds = 0;
+ return 0;
+ }
+ }
+#if !defined(_KERNEL)
+ printf("ippr_ftp_client_valid:junk after cmd[%*.*s]\n",
+ (int)len, (int)len, buf);
+#endif
+ return 2;
+}
+
+
+int ippr_ftp_server_valid(ftps, buf, len)
+ftpside_t *ftps;
+char *buf;
+size_t len;
+{
+ register char *s, c, pc;
+ register size_t i = len;
+ int cmd;
+
+ s = buf;
+ cmd = 0;
+
+ if (ftps->ftps_junk == 1)
+ return 1;
+
+ if (i < 5) {
+ if (ippr_ftp_debug > 3)
+ printf("ippr_ftp_servert_valid:i(%d) < 5\n", (int)i);
+ return 2;
+ }
+
+ c = *s++;
+ i--;
+ if (c == ' ')
+ goto search_eol;
+
+ if (ISDIGIT(c)) {
+ cmd = (c - '0') * 100;
+ c = *s++;
+ i--;
+ if (ISDIGIT(c)) {
+ cmd += (c - '0') * 10;
+ c = *s++;
+ i--;
+ if (ISDIGIT(c)) {
+ cmd += (c - '0');
+ c = *s++;
+ i--;
+ if ((c != '-') && (c != ' '))
+ goto bad_server_command;
+ } else
+ goto bad_server_command;
+ } else
+ goto bad_server_command;
+ } else {
+bad_server_command:
+ if (ippr_ftp_debug > 3)
+ printf("%s:bad:junk %d len %d/%d c 0x%x buf [%*.*s]\n",
+ "ippr_ftp_server_valid",
+ ftps->ftps_junk, (int)len, (int)i,
+ c, (int)len, (int)len, buf);
+ return 1;
+ }
+search_eol:
+ for (; i; i--) {
+ pc = c;
+ c = *s++;
+ if ((pc == '\r') && (c == '\n')) {
+ ftps->ftps_cmds = cmd;
+ return 0;
+ }
+ }
+ if (ippr_ftp_debug > 3)
+ printf("ippr_ftp_server_valid:junk after cmd[%*.*s]\n",
+ (int)len, (int)len, buf);
+ return 2;
+}
+
+
+int ippr_ftp_valid(ftp, side, buf, len)
+ftpinfo_t *ftp;
+int side;
+char *buf;
+size_t len;
+{
+ ftpside_t *ftps;
+ int ret;
+
+ ftps = &ftp->ftp_side[side];
+
+ if (side == 0)
+ ret = ippr_ftp_client_valid(ftps, buf, len);
+ else
+ ret = ippr_ftp_server_valid(ftps, buf, len);
+ return ret;
+}
+
+
+/*
+ * For map rules, the following applies:
+ * rv == 0 for outbound processing,
+ * rv == 1 for inbound processing.
+ * For rdr rules, the following applies:
+ * rv == 0 for inbound processing,
+ * rv == 1 for outbound processing.
+ */
+int ippr_ftp_process(fin, nat, ftp, rv)
+fr_info_t *fin;
+nat_t *nat;
+ftpinfo_t *ftp;
+int rv;
+{
+ int mlen, len, off, inc, i, sel, sel2, ok, ackoff, seqoff;
+ char *rptr, *wptr, *s;
+ u_32_t thseq, thack;
+ ap_session_t *aps;
+ ftpside_t *f, *t;
+ tcphdr_t *tcp;
+ ip_t *ip;
+ mb_t *m;
+
+ m = fin->fin_m;
+ ip = fin->fin_ip;
+ tcp = (tcphdr_t *)fin->fin_dp;
+ off = (char *)tcp - (char *)ip + (TCP_OFF(tcp) << 2) + fin->fin_ipoff;
+
+ f = &ftp->ftp_side[rv];
+ t = &ftp->ftp_side[1 - rv];
+ thseq = ntohl(tcp->th_seq);
+ thack = ntohl(tcp->th_ack);
+
+#ifdef __sgi
+ mlen = fin->fin_plen - off;
+#else
+ mlen = MSGDSIZE(m) - off;
+#endif
+ if (ippr_ftp_debug > 4)
+ printf("ippr_ftp_process: mlen %d\n", mlen);
+
+ if ((mlen == 0) && ((tcp->th_flags & TH_OPENING) == TH_OPENING)) {
+ f->ftps_seq[0] = thseq + 1;
+ t->ftps_seq[0] = thack;
+ return 0;
+ } else if (mlen < 0) {
+ return 0;
+ }
+
+ aps = nat->nat_aps;
+
+ sel = aps->aps_sel[1 - rv];
+ sel2 = aps->aps_sel[rv];
+ if (rv == 0) {
+ seqoff = aps->aps_seqoff[sel];
+ if (aps->aps_seqmin[sel] > seqoff + thseq)
+ seqoff = aps->aps_seqoff[!sel];
+ ackoff = aps->aps_ackoff[sel2];
+ if (aps->aps_ackmin[sel2] > ackoff + thack)
+ ackoff = aps->aps_ackoff[!sel2];
+ } else {
+ seqoff = aps->aps_ackoff[sel];
+ if (ippr_ftp_debug > 2)
+ printf("seqoff %d thseq %x ackmin %x\n", seqoff, thseq,
+ aps->aps_ackmin[sel]);
+ if (aps->aps_ackmin[sel] > seqoff + thseq)
+ seqoff = aps->aps_ackoff[!sel];
+
+ ackoff = aps->aps_seqoff[sel2];
+ if (ippr_ftp_debug > 2)
+ printf("ackoff %d thack %x seqmin %x\n", ackoff, thack,
+ aps->aps_seqmin[sel2]);
+ if (ackoff > 0) {
+ if (aps->aps_seqmin[sel2] > ackoff + thack)
+ ackoff = aps->aps_seqoff[!sel2];
+ } else {
+ if (aps->aps_seqmin[sel2] > thack)
+ ackoff = aps->aps_seqoff[!sel2];
+ }
+ }
+ if (ippr_ftp_debug > 2) {
+ printf("%s: %x seq %x/%d ack %x/%d len %d/%d off %d\n",
+ rv ? "IN" : "OUT", tcp->th_flags, thseq, seqoff,
+ thack, ackoff, mlen, fin->fin_plen, off);
+ printf("sel %d seqmin %x/%x offset %d/%d\n", sel,
+ aps->aps_seqmin[sel], aps->aps_seqmin[sel2],
+ aps->aps_seqoff[sel], aps->aps_seqoff[sel2]);
+ printf("sel %d ackmin %x/%x offset %d/%d\n", sel2,
+ aps->aps_ackmin[sel], aps->aps_ackmin[sel2],
+ aps->aps_ackoff[sel], aps->aps_ackoff[sel2]);
+ }
+
+ /*
+ * XXX - Ideally, this packet should get dropped because we now know
+ * that it is out of order (and there is no real danger in doing so
+ * apart from causing packets to go through here ordered).
+ */
+ if (ippr_ftp_debug > 2) {
+ printf("rv %d t:seq[0] %x seq[1] %x %d/%d\n",
+ rv, t->ftps_seq[0], t->ftps_seq[1], seqoff, ackoff);
+ }
+
+ ok = 0;
+ if (t->ftps_seq[0] == 0) {
+ t->ftps_seq[0] = thack;
+ ok = 1;
+ } else {
+ if (ackoff == 0) {
+ if (t->ftps_seq[0] == thack)
+ ok = 1;
+ else if (t->ftps_seq[1] == thack) {
+ t->ftps_seq[0] = thack;
+ ok = 1;
+ }
+ } else {
+ if (t->ftps_seq[0] + ackoff == thack)
+ ok = 1;
+ else if (t->ftps_seq[0] == thack + ackoff)
+ ok = 1;
+ else if (t->ftps_seq[1] + ackoff == thack) {
+ t->ftps_seq[0] = thack - ackoff;
+ ok = 1;
+ } else if (t->ftps_seq[1] == thack + ackoff) {
+ t->ftps_seq[0] = thack - ackoff;
+ ok = 1;
+ }
+ }
+ }
+
+ if (ippr_ftp_debug > 2) {
+ if (!ok)
+ printf("%s ok\n", "not");
+ }
+
+ if (!mlen) {
+ if (t->ftps_seq[0] + ackoff != thack) {
+ if (ippr_ftp_debug > 1) {
+ printf("%s:seq[0](%x) + (%x) != (%x)\n",
+ "ippr_ftp_process", t->ftps_seq[0],
+ ackoff, thack);
+ }
+ return APR_ERR(1);
+ }
+
+ if (ippr_ftp_debug > 2) {
+ printf("ippr_ftp_process:f:seq[0] %x seq[1] %x\n",
+ f->ftps_seq[0], f->ftps_seq[1]);
+ }
+
+ if (tcp->th_flags & TH_FIN) {
+ if (thseq == f->ftps_seq[1]) {
+ f->ftps_seq[0] = f->ftps_seq[1] - seqoff;
+ f->ftps_seq[1] = thseq + 1 - seqoff;
+ } else {
+ if (ippr_ftp_debug > 1) {
+ printf("FIN: thseq %x seqoff %d ftps_seq %x %x\n",
+ thseq, seqoff, f->ftps_seq[0], f->ftps_seq[1]);
+ }
+ return APR_ERR(1);
+ }
+ }
+ f->ftps_len = 0;
+ return 0;
+ }
+
+ ok = 0;
+ if ((thseq == f->ftps_seq[0]) || (thseq == f->ftps_seq[1])) {
+ ok = 1;
+ /*
+ * Retransmitted data packet.
+ */
+ } else if ((thseq + mlen == f->ftps_seq[0]) ||
+ (thseq + mlen == f->ftps_seq[1])) {
+ ok = 1;
+ }
+
+ if (ok == 0) {
+ inc = thseq - f->ftps_seq[0];
+ if (ippr_ftp_debug > 1) {
+ printf("inc %d sel %d rv %d\n", inc, sel, rv);
+ printf("th_seq %x ftps_seq %x/%x\n",
+ thseq, f->ftps_seq[0], f->ftps_seq[1]);
+ printf("ackmin %x ackoff %d\n", aps->aps_ackmin[sel],
+ aps->aps_ackoff[sel]);
+ printf("seqmin %x seqoff %d\n", aps->aps_seqmin[sel],
+ aps->aps_seqoff[sel]);
+ }
+
+ return APR_ERR(1);
+ }
+
+ inc = 0;
+ rptr = f->ftps_rptr;
+ wptr = f->ftps_wptr;
+ f->ftps_seq[0] = thseq;
+ f->ftps_seq[1] = f->ftps_seq[0] + mlen;
+ f->ftps_len = mlen;
+
+ while (mlen > 0) {
+ len = MIN(mlen, sizeof(f->ftps_buf) - (wptr - rptr));
+ COPYDATA(m, off, len, wptr);
+ mlen -= len;
+ off += len;
+ wptr += len;
+
+ if (ippr_ftp_debug > 3)
+ printf("%s:len %d/%d off %d wptr %lx junk %d [%*.*s]\n",
+ "ippr_ftp_process",
+ len, mlen, off, (u_long)wptr, f->ftps_junk,
+ len, len, rptr);
+
+ f->ftps_wptr = wptr;
+ if (f->ftps_junk != 0) {
+ i = f->ftps_junk;
+ f->ftps_junk = ippr_ftp_valid(ftp, rv, rptr,
+ wptr - rptr);
+
+ if (ippr_ftp_debug > 5)
+ printf("%s:junk %d -> %d\n",
+ "ippr_ftp_process", i, f->ftps_junk);
+
+ if (f->ftps_junk != 0) {
+ if (wptr - rptr == sizeof(f->ftps_buf)) {
+ if (ippr_ftp_debug > 4)
+ printf("%s:full buffer\n",
+ "ippr_ftp_process");
+ f->ftps_rptr = f->ftps_buf;
+ f->ftps_wptr = f->ftps_buf;
+ rptr = f->ftps_rptr;
+ wptr = f->ftps_wptr;
+ /*
+ * Because we throw away data here that
+ * we would otherwise parse, set the
+ * junk flag to indicate just ignore
+ * any data upto the next CRLF.
+ */
+ f->ftps_junk = 1;
+ continue;
+ }
+ }
+ }
+
+ while ((f->ftps_junk == 0) && (wptr > rptr)) {
+ len = wptr - rptr;
+ f->ftps_junk = ippr_ftp_valid(ftp, rv, rptr, len);
+
+ if (ippr_ftp_debug > 3) {
+ printf("%s=%d len %d rv %d ptr %lx/%lx ",
+ "ippr_ftp_valid",
+ f->ftps_junk, len, rv, (u_long)rptr,
+ (u_long)wptr);
+ printf("buf [%*.*s]\n", len, len, rptr);
+ }
+
+ if (f->ftps_junk == 0) {
+ f->ftps_rptr = rptr;
+ if (rv)
+ inc += ippr_ftp_server(fin, ip, nat,
+ ftp, len);
+ else
+ inc += ippr_ftp_client(fin, ip, nat,
+ ftp, len);
+ rptr = f->ftps_rptr;
+ wptr = f->ftps_wptr;
+ }
+ }
+
+ /*
+ * Off to a bad start so lets just forget about using the
+ * ftp proxy for this connection.
+ */
+ if ((f->ftps_cmds == 0) && (f->ftps_junk == 1)) {
+ /* f->ftps_seq[1] += inc; */
+
+ if (ippr_ftp_debug > 1)
+ printf("%s:cmds == 0 junk == 1\n",
+ "ippr_ftp_process");
+ return APR_ERR(2);
+ }
+
+ if ((f->ftps_junk != 0) && (rptr < wptr)) {
+ for (s = rptr; s < wptr; s++) {
+ if ((*s == '\r') && (s + 1 < wptr) &&
+ (*(s + 1) == '\n')) {
+ rptr = s + 2;
+ f->ftps_junk = 0;
+ break;
+ }
+ }
+ }
+
+ if (rptr == wptr) {
+ rptr = wptr = f->ftps_buf;
+ } else {
+ /*
+ * Compact the buffer back to the start. The junk
+ * flag should already be set and because we're not
+ * throwing away any data, it is preserved from its
+ * current state.
+ */
+ if (rptr > f->ftps_buf) {
+ bcopy(rptr, f->ftps_buf, len);
+ wptr -= rptr - f->ftps_buf;
+ rptr = f->ftps_buf;
+ }
+ }
+ f->ftps_rptr = rptr;
+ f->ftps_wptr = wptr;
+ }
+
+ /* f->ftps_seq[1] += inc; */
+ if (tcp->th_flags & TH_FIN)
+ f->ftps_seq[1]++;
+ if (ippr_ftp_debug > 3) {
+#ifdef __sgi
+ mlen = fin->fin_plen;
+#else
+ mlen = MSGDSIZE(m);
+#endif
+ mlen -= off;
+ printf("ftps_seq[1] = %x inc %d len %d\n",
+ f->ftps_seq[1], inc, mlen);
+ }
+
+ f->ftps_rptr = rptr;
+ f->ftps_wptr = wptr;
+ return APR_INC(inc);
+}
+
+
+int ippr_ftp_out(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ ftpinfo_t *ftp;
+ int rev;
+
+ ftp = aps->aps_data;
+ if (ftp == NULL)
+ return 0;
+
+ rev = (nat->nat_dir == NAT_OUTBOUND) ? 0 : 1;
+ if (ftp->ftp_side[1 - rev].ftps_ifp == NULL)
+ ftp->ftp_side[1 - rev].ftps_ifp = fin->fin_ifp;
+
+ return ippr_ftp_process(fin, nat, ftp, rev);
+}
+
+
+int ippr_ftp_in(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ ftpinfo_t *ftp;
+ int rev;
+
+ ftp = aps->aps_data;
+ if (ftp == NULL)
+ return 0;
+
+ rev = (nat->nat_dir == NAT_OUTBOUND) ? 0 : 1;
+ if (ftp->ftp_side[rev].ftps_ifp == NULL)
+ ftp->ftp_side[rev].ftps_ifp = fin->fin_ifp;
+
+ return ippr_ftp_process(fin, nat, ftp, 1 - rev);
+}
+
+
+/*
+ * ippr_ftp_atoi - implement a version of atoi which processes numbers in
+ * pairs separated by commas (which are expected to be in the range 0 - 255),
+ * returning a 16 bit number combining either side of the , as the MSB and
+ * LSB.
+ */
+u_short ippr_ftp_atoi(ptr)
+char **ptr;
+{
+ register char *s = *ptr, c;
+ register u_char i = 0, j = 0;
+
+ while (((c = *s++) != '\0') && ISDIGIT(c)) {
+ i *= 10;
+ i += c - '0';
+ }
+ if (c != ',') {
+ *ptr = NULL;
+ return 0;
+ }
+ while (((c = *s++) != '\0') && ISDIGIT(c)) {
+ j *= 10;
+ j += c - '0';
+ }
+ *ptr = s;
+ i &= 0xff;
+ j &= 0xff;
+ return (i << 8) | j;
+}
+
+
+int ippr_ftp_epsv(fin, ip, nat, f, dlen)
+fr_info_t *fin;
+ip_t *ip;
+nat_t *nat;
+ftpside_t *f;
+int dlen;
+{
+ char newbuf[IPF_FTPBUFSZ];
+ char *s;
+ u_short ap = 0;
+
+#define EPSV_REPLEN 33
+ /*
+ * Check for EPSV reply message.
+ */
+ if (dlen < IPF_MIN229LEN)
+ return (0);
+ else if (strncmp(f->ftps_rptr,
+ "229 Entering Extended Passive Mode", EPSV_REPLEN))
+ return (0);
+
+ /*
+ * Skip the EPSV command + space
+ */
+ s = f->ftps_rptr + 33;
+ while (*s && !ISDIGIT(*s))
+ s++;
+
+ /*
+ * As per RFC 2428, there are no addres components in the EPSV
+ * response. So we'll go straight to getting the port.
+ */
+ while (*s && ISDIGIT(*s)) {
+ ap *= 10;
+ ap += *s++ - '0';
+ }
+
+ if (!*s)
+ return 0;
+
+ if (*s == '|')
+ s++;
+ if (*s == ')')
+ s++;
+ if (*s == '\n')
+ s--;
+ /*
+ * check for CR-LF at the end.
+ */
+ if ((*s == '\r') && (*(s + 1) == '\n')) {
+ s += 2;
+ } else
+ return 0;
+
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(newbuf, sizeof(newbuf), "%s (|||%u|)\r\n",
+ "229 Entering Extended Passive Mode", ap);
+#else
+ (void) sprintf(newbuf, "%s (|||%u|)\r\n",
+ "229 Entering Extended Passive Mode", ap);
+#endif
+
+ return ippr_ftp_pasvreply(fin, ip, nat, f, (u_int)ap, newbuf, s,
+ ip->ip_src.s_addr);
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_htable.c b/sys/contrib/ipfilter/netinet/ip_htable.c
new file mode 100644
index 0000000..3882156
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_htable.c
@@ -0,0 +1,654 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1993-2001, 2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/errno.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#if !defined(_KERNEL)
+# include <stdlib.h>
+# include <string.h>
+# define _KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+#endif
+#include <sys/socket.h>
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+#endif
+#if defined(__FreeBSD__)
+# include <sys/cdefs.h>
+# include <sys/proc.h>
+#endif
+#if !defined(__svr4__) && !defined(__SVR4) && !defined(__hpux) && \
+ !defined(linux)
+# include <sys/mbuf.h>
+#endif
+#if defined(_KERNEL)
+# include <sys/systm.h>
+#else
+# include <stdio.h>
+#endif
+#include <netinet/in.h>
+#include <net/if.h>
+
+#include "netinet/ip_compat.h"
+#include "netinet/ip_fil.h"
+#include "netinet/ip_lookup.h"
+#include "netinet/ip_htable.h"
+/* END OF INCLUDES */
+
+#if !defined(lint)
+static const char rcsid[] = "@(#)$Id: ip_htable.c,v 2.34.2.9 2007/02/02 23:06:16 darrenr Exp $";
+#endif
+
+#ifdef IPFILTER_LOOKUP
+static iphtent_t *fr_iphmfind __P((iphtable_t *, struct in_addr *));
+static u_long ipht_nomem[IPL_LOGSIZE] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+static u_long ipf_nhtables[IPL_LOGSIZE] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+static u_long ipf_nhtnodes[IPL_LOGSIZE] = { 0, 0, 0, 0, 0, 0, 0, 0 };
+
+iphtable_t *ipf_htables[IPL_LOGSIZE] = { NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL };
+
+
+void fr_htable_unload()
+{
+ iplookupflush_t fop;
+
+ fop.iplf_unit = IPL_LOGALL;
+ (void)fr_flushhtable(&fop);
+}
+
+
+int fr_gethtablestat(op)
+iplookupop_t *op;
+{
+ iphtstat_t stats;
+
+ if (op->iplo_size != sizeof(stats))
+ return EINVAL;
+
+ stats.iphs_tables = ipf_htables[op->iplo_unit];
+ stats.iphs_numtables = ipf_nhtables[op->iplo_unit];
+ stats.iphs_numnodes = ipf_nhtnodes[op->iplo_unit];
+ stats.iphs_nomem = ipht_nomem[op->iplo_unit];
+
+ return COPYOUT(&stats, op->iplo_struct, sizeof(stats));
+
+}
+
+
+/*
+ * Create a new hash table using the template passed.
+ */
+int fr_newhtable(op)
+iplookupop_t *op;
+{
+ iphtable_t *iph, *oiph;
+ char name[FR_GROUPLEN];
+ int err, i, unit;
+
+ unit = op->iplo_unit;
+ if ((op->iplo_arg & IPHASH_ANON) == 0)
+ iph = fr_existshtable(unit, op->iplo_name);
+ else
+ iph = NULL;
+
+ if (iph == NULL) {
+ KMALLOC(iph, iphtable_t *);
+ if (iph == NULL) {
+ ipht_nomem[op->iplo_unit]++;
+ return ENOMEM;
+ }
+ err = COPYIN(op->iplo_struct, iph, sizeof(*iph));
+ if (err != 0) {
+ KFREE(iph);
+ return EFAULT;
+ }
+ } else {
+ if ((iph->iph_flags & IPHASH_DELETE) == 0)
+ return EEXIST;
+ }
+
+ if (iph->iph_unit != unit) {
+ if ((iph->iph_flags & IPHASH_DELETE) == 0) {
+ KFREE(iph);
+ }
+ return EINVAL;
+ }
+
+ if ((op->iplo_arg & IPHASH_ANON) != 0) {
+ i = IPHASH_ANON;
+ do {
+ i++;
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(name, sizeof(name), "%u", i);
+#else
+ (void)sprintf(name, "%u", i);
+#endif
+ for (oiph = ipf_htables[unit]; oiph != NULL;
+ oiph = oiph->iph_next)
+ if (strncmp(oiph->iph_name, name,
+ sizeof(oiph->iph_name)) == 0)
+ break;
+ } while (oiph != NULL);
+
+ (void)strncpy(iph->iph_name, name, sizeof(iph->iph_name));
+ (void)strncpy(op->iplo_name, name, sizeof(op->iplo_name));
+ iph->iph_type |= IPHASH_ANON;
+ }
+
+ if ((iph->iph_flags & IPHASH_DELETE) == 0) {
+ KMALLOCS(iph->iph_table, iphtent_t **,
+ iph->iph_size * sizeof(*iph->iph_table));
+ if (iph->iph_table == NULL) {
+ if ((iph->iph_flags & IPHASH_DELETE) == 0) {
+ KFREE(iph);
+ }
+ ipht_nomem[unit]++;
+ return ENOMEM;
+ }
+
+ bzero((char *)iph->iph_table,
+ iph->iph_size * sizeof(*iph->iph_table));
+ iph->iph_masks = 0;
+ iph->iph_list = NULL;
+
+ iph->iph_ref = 1;
+ iph->iph_next = ipf_htables[unit];
+ iph->iph_pnext = &ipf_htables[unit];
+ if (ipf_htables[unit] != NULL)
+ ipf_htables[unit]->iph_pnext = &iph->iph_next;
+ ipf_htables[unit] = iph;
+
+ ipf_nhtables[unit]++;
+ }
+
+ iph->iph_flags &= ~IPHASH_DELETE;
+
+ return 0;
+}
+
+
+/*
+ */
+int fr_removehtable(unit, name)
+int unit;
+char *name;
+{
+ iphtable_t *iph;
+
+ iph = fr_findhtable(unit, name);
+ if (iph == NULL)
+ return ESRCH;
+
+ if (iph->iph_unit != unit) {
+ return EINVAL;
+ }
+
+ if (iph->iph_ref != 0) {
+ (void) fr_clearhtable(iph);
+ iph->iph_flags |= IPHASH_DELETE;
+ return 0;
+ }
+
+ fr_delhtable(iph);
+
+ return 0;
+}
+
+
+int fr_clearhtable(iph)
+iphtable_t *iph;
+{
+ iphtent_t *ipe;
+
+ while ((ipe = iph->iph_list) != NULL)
+ if (fr_delhtent(iph, ipe) != 0)
+ return 1;
+ return 0;
+}
+
+
+int fr_delhtable(iph)
+iphtable_t *iph;
+{
+
+ if (fr_clearhtable(iph) != 0)
+ return 1;
+
+ if (iph->iph_pnext != NULL)
+ *iph->iph_pnext = iph->iph_next;
+ if (iph->iph_next != NULL)
+ iph->iph_next->iph_pnext = iph->iph_pnext;
+
+ ipf_nhtables[iph->iph_unit]--;
+
+ return fr_derefhtable(iph);
+}
+
+
+/*
+ * Delete an entry from a hash table.
+ */
+int fr_delhtent(iph, ipe)
+iphtable_t *iph;
+iphtent_t *ipe;
+{
+
+ if (ipe->ipe_phnext != NULL)
+ *ipe->ipe_phnext = ipe->ipe_hnext;
+ if (ipe->ipe_hnext != NULL)
+ ipe->ipe_hnext->ipe_phnext = ipe->ipe_phnext;
+
+ if (ipe->ipe_pnext != NULL)
+ *ipe->ipe_pnext = ipe->ipe_next;
+ if (ipe->ipe_next != NULL)
+ ipe->ipe_next->ipe_pnext = ipe->ipe_pnext;
+
+ switch (iph->iph_type & ~IPHASH_ANON)
+ {
+ case IPHASH_GROUPMAP :
+ if (ipe->ipe_group != NULL)
+ fr_delgroup(ipe->ipe_group, IPL_LOGIPF, fr_active);
+ break;
+
+ default :
+ ipe->ipe_ptr = NULL;
+ ipe->ipe_value = 0;
+ break;
+ }
+
+ return fr_derefhtent(ipe);
+}
+
+
+int fr_derefhtable(iph)
+iphtable_t *iph;
+{
+ int refs;
+
+ iph->iph_ref--;
+ refs = iph->iph_ref;
+
+ if (iph->iph_ref == 0) {
+ KFREES(iph->iph_table, iph->iph_size * sizeof(*iph->iph_table));
+ KFREE(iph);
+ }
+
+ return refs;
+}
+
+
+int fr_derefhtent(ipe)
+iphtent_t *ipe;
+{
+
+ ipe->ipe_ref--;
+ if (ipe->ipe_ref == 0) {
+ ipf_nhtnodes[ipe->ipe_unit]--;
+
+ KFREE(ipe);
+
+ return 0;
+ }
+
+ return ipe->ipe_ref;
+}
+
+
+iphtable_t *fr_existshtable(unit, name)
+int unit;
+char *name;
+{
+ iphtable_t *iph;
+
+ for (iph = ipf_htables[unit]; iph != NULL; iph = iph->iph_next)
+ if (strncmp(iph->iph_name, name, sizeof(iph->iph_name)) == 0)
+ break;
+ return iph;
+}
+
+
+iphtable_t *fr_findhtable(unit, name)
+int unit;
+char *name;
+{
+ iphtable_t *iph;
+
+ iph = fr_existshtable(unit, name);
+ if ((iph != NULL) && (iph->iph_flags & IPHASH_DELETE) == 0)
+ return iph;
+
+ return NULL;
+}
+
+
+size_t fr_flushhtable(op)
+iplookupflush_t *op;
+{
+ iphtable_t *iph;
+ size_t freed;
+ int i;
+
+ freed = 0;
+
+ for (i = 0; i <= IPL_LOGMAX; i++) {
+ if (op->iplf_unit == i || op->iplf_unit == IPL_LOGALL) {
+ while ((iph = ipf_htables[i]) != NULL) {
+ if (fr_delhtable(iph) == 0) {
+ freed++;
+ } else {
+ iph->iph_flags |= IPHASH_DELETE;
+ }
+ }
+ }
+ }
+
+ return freed;
+}
+
+
+/*
+ * Add an entry to a hash table.
+ */
+int fr_addhtent(iph, ipeo)
+iphtable_t *iph;
+iphtent_t *ipeo;
+{
+ iphtent_t *ipe;
+ u_int hv;
+ int bits;
+
+ KMALLOC(ipe, iphtent_t *);
+ if (ipe == NULL)
+ return -1;
+
+ bcopy((char *)ipeo, (char *)ipe, sizeof(*ipe));
+ ipe->ipe_addr.in4_addr &= ipe->ipe_mask.in4_addr;
+ ipe->ipe_addr.in4_addr = ntohl(ipe->ipe_addr.in4_addr);
+ bits = count4bits(ipe->ipe_mask.in4_addr);
+ ipe->ipe_mask.in4_addr = ntohl(ipe->ipe_mask.in4_addr);
+
+ hv = IPE_HASH_FN(ipe->ipe_addr.in4_addr, ipe->ipe_mask.in4_addr,
+ iph->iph_size);
+ ipe->ipe_ref = 1;
+ ipe->ipe_hnext = iph->iph_table[hv];
+ ipe->ipe_phnext = iph->iph_table + hv;
+
+ if (iph->iph_table[hv] != NULL)
+ iph->iph_table[hv]->ipe_phnext = &ipe->ipe_hnext;
+ iph->iph_table[hv] = ipe;
+
+ ipe->ipe_next = iph->iph_list;
+ ipe->ipe_pnext = &iph->iph_list;
+ if (ipe->ipe_next != NULL)
+ ipe->ipe_next->ipe_pnext = &ipe->ipe_next;
+ iph->iph_list = ipe;
+
+ if ((bits >= 0) && (bits != 32))
+ iph->iph_masks |= 1 << bits;
+
+ switch (iph->iph_type & ~IPHASH_ANON)
+ {
+ case IPHASH_GROUPMAP :
+ ipe->ipe_ptr = fr_addgroup(ipe->ipe_group, NULL,
+ iph->iph_flags, IPL_LOGIPF,
+ fr_active);
+ break;
+
+ default :
+ ipe->ipe_ptr = NULL;
+ ipe->ipe_value = 0;
+ break;
+ }
+
+ ipe->ipe_unit = iph->iph_unit;
+ ipf_nhtnodes[ipe->ipe_unit]++;
+
+ return 0;
+}
+
+
+void *fr_iphmfindgroup(tptr, aptr)
+void *tptr, *aptr;
+{
+ struct in_addr *addr;
+ iphtable_t *iph;
+ iphtent_t *ipe;
+ void *rval;
+
+ READ_ENTER(&ip_poolrw);
+ iph = tptr;
+ addr = aptr;
+
+ ipe = fr_iphmfind(iph, addr);
+ if (ipe != NULL)
+ rval = ipe->ipe_ptr;
+ else
+ rval = NULL;
+ RWLOCK_EXIT(&ip_poolrw);
+ return rval;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_iphmfindip */
+/* Returns: int - 0 == +ve match, -1 == error, 1 == -ve/no match */
+/* Parameters: tptr(I) - pointer to the pool to search */
+/* ipversion(I) - IP protocol version (4 or 6) */
+/* aptr(I) - pointer to address information */
+/* */
+/* Search the hash table for a given address and return a search result. */
+/* ------------------------------------------------------------------------ */
+int fr_iphmfindip(tptr, ipversion, aptr)
+void *tptr, *aptr;
+int ipversion;
+{
+ struct in_addr *addr;
+ iphtable_t *iph;
+ iphtent_t *ipe;
+ int rval;
+
+ if (ipversion != 4)
+ return -1;
+
+ if (tptr == NULL || aptr == NULL)
+ return -1;
+
+ iph = tptr;
+ addr = aptr;
+
+ READ_ENTER(&ip_poolrw);
+ ipe = fr_iphmfind(iph, addr);
+ if (ipe != NULL)
+ rval = 0;
+ else
+ rval = 1;
+ RWLOCK_EXIT(&ip_poolrw);
+ return rval;
+}
+
+
+/* Locks: ip_poolrw */
+static iphtent_t *fr_iphmfind(iph, addr)
+iphtable_t *iph;
+struct in_addr *addr;
+{
+ u_32_t hmsk, msk, ips;
+ iphtent_t *ipe;
+ u_int hv;
+
+ hmsk = iph->iph_masks;
+ msk = 0xffffffff;
+maskloop:
+ ips = ntohl(addr->s_addr) & msk;
+ hv = IPE_HASH_FN(ips, msk, iph->iph_size);
+ for (ipe = iph->iph_table[hv]; (ipe != NULL); ipe = ipe->ipe_hnext) {
+ if (ipe->ipe_mask.in4_addr != msk ||
+ ipe->ipe_addr.in4_addr != ips) {
+ continue;
+ }
+ break;
+ }
+
+ if ((ipe == NULL) && (hmsk != 0)) {
+ while (hmsk != 0) {
+ msk <<= 1;
+ if (hmsk & 0x80000000)
+ break;
+ hmsk <<= 1;
+ }
+ if (hmsk != 0) {
+ hmsk <<= 1;
+ goto maskloop;
+ }
+ }
+ return ipe;
+}
+
+
+int fr_htable_getnext(token, ilp)
+ipftoken_t *token;
+ipflookupiter_t *ilp;
+{
+ iphtent_t *node, zn, *nextnode;
+ iphtable_t *iph, zp, *nextiph;
+ int err;
+
+ err = 0;
+ iph = NULL;
+ node = NULL;
+ nextiph = NULL;
+ nextnode = NULL;
+
+ READ_ENTER(&ip_poolrw);
+
+ switch (ilp->ili_otype)
+ {
+ case IPFLOOKUPITER_LIST :
+ iph = token->ipt_data;
+ if (iph == NULL) {
+ nextiph = ipf_htables[(int)ilp->ili_unit];
+ } else {
+ nextiph = iph->iph_next;
+ }
+
+ if (nextiph != NULL) {
+ ATOMIC_INC(nextiph->iph_ref);
+ if (nextiph->iph_next == NULL)
+ token->ipt_alive = 0;
+ } else {
+ bzero((char *)&zp, sizeof(zp));
+ nextiph = &zp;
+ }
+ break;
+
+ case IPFLOOKUPITER_NODE :
+ node = token->ipt_data;
+ if (node == NULL) {
+ iph = fr_findhtable(ilp->ili_unit, ilp->ili_name);
+ if (iph == NULL)
+ err = ESRCH;
+ else {
+ nextnode = iph->iph_list;
+ }
+ } else {
+ nextnode = node->ipe_next;
+ }
+
+ if (nextnode != NULL) {
+ ATOMIC_INC(nextnode->ipe_ref);
+ if (nextnode->ipe_next == NULL)
+ token->ipt_alive = 0;
+ } else {
+ bzero((char *)&zn, sizeof(zn));
+ nextnode = &zn;
+ }
+ break;
+ default :
+ err = EINVAL;
+ break;
+ }
+
+ RWLOCK_EXIT(&ip_poolrw);
+ if (err != 0)
+ return err;
+
+ switch (ilp->ili_otype)
+ {
+ case IPFLOOKUPITER_LIST :
+ if (iph != NULL) {
+ WRITE_ENTER(&ip_poolrw);
+ fr_derefhtable(iph);
+ RWLOCK_EXIT(&ip_poolrw);
+ }
+ token->ipt_data = nextiph;
+ err = COPYOUT(nextiph, ilp->ili_data, sizeof(*nextiph));
+ if (err != 0)
+ err = EFAULT;
+ break;
+
+ case IPFLOOKUPITER_NODE :
+ if (node != NULL) {
+ WRITE_ENTER(&ip_poolrw);
+ fr_derefhtent(node);
+ RWLOCK_EXIT(&ip_poolrw);
+ }
+ token->ipt_data = nextnode;
+ err = COPYOUT(nextnode, ilp->ili_data, sizeof(*nextnode));
+ if (err != 0)
+ err = EFAULT;
+ break;
+ }
+
+ return err;
+}
+
+
+void fr_htable_iterderef(otype, unit, data)
+u_int otype;
+int unit;
+void *data;
+{
+
+ if (data == NULL)
+ return;
+
+ if (unit < 0 || unit > IPL_LOGMAX)
+ return;
+
+ switch (otype)
+ {
+ case IPFLOOKUPITER_LIST :
+ WRITE_ENTER(&ip_poolrw);
+ fr_derefhtable((iphtable_t *)data);
+ RWLOCK_EXIT(&ip_poolrw);
+ break;
+
+ case IPFLOOKUPITER_NODE :
+ WRITE_ENTER(&ip_poolrw);
+ fr_derefhtent((iphtent_t *)data);
+ RWLOCK_EXIT(&ip_poolrw);
+ break;
+ default :
+ break;
+ }
+}
+
+#endif /* IPFILTER_LOOKUP */
diff --git a/sys/contrib/ipfilter/netinet/ip_htable.h b/sys/contrib/ipfilter/netinet/ip_htable.h
new file mode 100644
index 0000000..2c08812
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_htable.h
@@ -0,0 +1,78 @@
+#ifndef __IP_HTABLE_H__
+#define __IP_HTABLE_H__
+
+#include "netinet/ip_lookup.h"
+
+typedef struct iphtent_s {
+ struct iphtent_s *ipe_next, **ipe_pnext;
+ struct iphtent_s *ipe_hnext, **ipe_phnext;
+ void *ipe_ptr;
+ i6addr_t ipe_addr;
+ i6addr_t ipe_mask;
+ int ipe_ref;
+ int ipe_unit;
+ union {
+ char ipeu_char[16];
+ u_long ipeu_long;
+ u_int ipeu_int;
+ }ipe_un;
+} iphtent_t;
+
+#define ipe_value ipe_un.ipeu_int
+#define ipe_group ipe_un.ipeu_char
+
+#define IPE_HASH_FN(a, m, s) (((a) * (m)) % (s))
+
+
+typedef struct iphtable_s {
+ ipfrwlock_t iph_rwlock;
+ struct iphtable_s *iph_next, **iph_pnext;
+ struct iphtent_s **iph_table;
+ struct iphtent_s *iph_list;
+ size_t iph_size; /* size of hash table */
+ u_long iph_seed; /* hashing seed */
+ u_32_t iph_flags;
+ u_int iph_unit; /* IPL_LOG* */
+ u_int iph_ref;
+ u_int iph_type; /* lookup or group map - IPHASH_* */
+ u_int iph_masks; /* IPv4 netmasks in use */
+ char iph_name[FR_GROUPLEN]; /* hash table number */
+} iphtable_t;
+
+/* iph_type */
+#define IPHASH_LOOKUP 0
+#define IPHASH_GROUPMAP 1
+#define IPHASH_DELETE 2
+#define IPHASH_ANON 0x80000000
+
+
+typedef struct iphtstat_s {
+ iphtable_t *iphs_tables;
+ u_long iphs_numtables;
+ u_long iphs_numnodes;
+ u_long iphs_nomem;
+ u_long iphs_pad[16];
+} iphtstat_t;
+
+
+extern iphtable_t *ipf_htables[IPL_LOGSIZE];
+
+extern iphtable_t *fr_existshtable __P((int, char *));
+extern int fr_clearhtable __P((iphtable_t *));
+extern void fr_htable_unload __P((void));
+extern int fr_newhtable __P((iplookupop_t *));
+extern iphtable_t *fr_findhtable __P((int, char *));
+extern int fr_removehtable __P((int, char *));
+extern size_t fr_flushhtable __P((iplookupflush_t *));
+extern int fr_addhtent __P((iphtable_t *, iphtent_t *));
+extern int fr_delhtent __P((iphtable_t *, iphtent_t *));
+extern int fr_derefhtable __P((iphtable_t *));
+extern int fr_derefhtent __P((iphtent_t *));
+extern int fr_delhtable __P((iphtable_t *));
+extern void *fr_iphmfindgroup __P((void *, void *));
+extern int fr_iphmfindip __P((void *, int, void *));
+extern int fr_gethtablestat __P((iplookupop_t *));
+extern int fr_htable_getnext __P((ipftoken_t *, ipflookupiter_t *));
+extern void fr_htable_iterderef __P((u_int, int, void *));
+
+#endif /* __IP_HTABLE_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_ipsec_pxy.c b/sys/contrib/ipfilter/netinet/ip_ipsec_pxy.c
new file mode 100644
index 0000000..e88a6b9
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_ipsec_pxy.c
@@ -0,0 +1,341 @@
+/*
+ * Copyright (C) 2001-2003 by Darren Reed
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * Simple ISAKMP transparent proxy for in-kernel use. For use with the NAT
+ * code.
+ *
+ * $Id: ip_ipsec_pxy.c,v 2.20.2.8 2006/07/14 06:12:14 darrenr Exp $
+ *
+ */
+#define IPF_IPSEC_PROXY
+
+
+int ippr_ipsec_init __P((void));
+void ippr_ipsec_fini __P((void));
+int ippr_ipsec_new __P((fr_info_t *, ap_session_t *, nat_t *));
+void ippr_ipsec_del __P((ap_session_t *));
+int ippr_ipsec_inout __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_ipsec_match __P((fr_info_t *, ap_session_t *, nat_t *));
+
+static frentry_t ipsecfr;
+static ipftq_t *ipsecnattqe;
+static ipftq_t *ipsecstatetqe;
+static char ipsec_buffer[1500];
+
+int ipsec_proxy_init = 0;
+int ipsec_proxy_ttl = 60;
+
+/*
+ * IPSec application proxy initialization.
+ */
+int ippr_ipsec_init()
+{
+ bzero((char *)&ipsecfr, sizeof(ipsecfr));
+ ipsecfr.fr_ref = 1;
+ ipsecfr.fr_flags = FR_OUTQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ MUTEX_INIT(&ipsecfr.fr_lock, "IPsec proxy rule lock");
+ ipsec_proxy_init = 1;
+
+ ipsecnattqe = fr_addtimeoutqueue(&nat_utqe, ipsec_proxy_ttl);
+ if (ipsecnattqe == NULL)
+ return -1;
+ ipsecstatetqe = fr_addtimeoutqueue(&ips_utqe, ipsec_proxy_ttl);
+ if (ipsecstatetqe == NULL) {
+ if (fr_deletetimeoutqueue(ipsecnattqe) == 0)
+ fr_freetimeoutqueue(ipsecnattqe);
+ ipsecnattqe = NULL;
+ return -1;
+ }
+
+ ipsecnattqe->ifq_flags |= IFQF_PROXY;
+ ipsecstatetqe->ifq_flags |= IFQF_PROXY;
+
+ ipsecfr.fr_age[0] = ipsec_proxy_ttl;
+ ipsecfr.fr_age[1] = ipsec_proxy_ttl;
+ return 0;
+}
+
+
+void ippr_ipsec_fini()
+{
+ if (ipsecnattqe != NULL) {
+ if (fr_deletetimeoutqueue(ipsecnattqe) == 0)
+ fr_freetimeoutqueue(ipsecnattqe);
+ }
+ ipsecnattqe = NULL;
+ if (ipsecstatetqe != NULL) {
+ if (fr_deletetimeoutqueue(ipsecstatetqe) == 0)
+ fr_freetimeoutqueue(ipsecstatetqe);
+ }
+ ipsecstatetqe = NULL;
+
+ if (ipsec_proxy_init == 1) {
+ MUTEX_DESTROY(&ipsecfr.fr_lock);
+ ipsec_proxy_init = 0;
+ }
+}
+
+
+/*
+ * Setup for a new IPSEC proxy.
+ */
+int ippr_ipsec_new(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ ipsec_pxy_t *ipsec;
+ fr_info_t fi;
+ ipnat_t *ipn;
+ char *ptr;
+ int p, off, dlen, ttl;
+ mb_t *m;
+ ip_t *ip;
+
+ off = fin->fin_plen - fin->fin_dlen + fin->fin_ipoff;
+ bzero(ipsec_buffer, sizeof(ipsec_buffer));
+ ip = fin->fin_ip;
+ m = fin->fin_m;
+
+ dlen = M_LEN(m) - off;
+ if (dlen < 16)
+ return -1;
+ COPYDATA(m, off, MIN(sizeof(ipsec_buffer), dlen), ipsec_buffer);
+
+ if (nat_outlookup(fin, 0, IPPROTO_ESP, nat->nat_inip,
+ ip->ip_dst) != NULL)
+ return -1;
+
+ aps->aps_psiz = sizeof(*ipsec);
+ KMALLOCS(aps->aps_data, ipsec_pxy_t *, sizeof(*ipsec));
+ if (aps->aps_data == NULL)
+ return -1;
+
+ ipsec = aps->aps_data;
+ bzero((char *)ipsec, sizeof(*ipsec));
+
+ /*
+ * Create NAT rule against which the tunnel/transport mapping is
+ * created. This is required because the current NAT rule does not
+ * describe ESP but UDP instead.
+ */
+ ipn = &ipsec->ipsc_rule;
+ ttl = IPF_TTLVAL(ipsecnattqe->ifq_ttl);
+ ipn->in_tqehead[0] = fr_addtimeoutqueue(&nat_utqe, ttl);
+ ipn->in_tqehead[1] = fr_addtimeoutqueue(&nat_utqe, ttl);
+ ipn->in_ifps[0] = fin->fin_ifp;
+ ipn->in_apr = NULL;
+ ipn->in_use = 1;
+ ipn->in_hits = 1;
+ ipn->in_nip = ntohl(nat->nat_outip.s_addr);
+ ipn->in_ippip = 1;
+ ipn->in_inip = nat->nat_inip.s_addr;
+ ipn->in_inmsk = 0xffffffff;
+ ipn->in_outip = fin->fin_saddr;
+ ipn->in_outmsk = nat->nat_outip.s_addr;
+ ipn->in_srcip = fin->fin_saddr;
+ ipn->in_srcmsk = 0xffffffff;
+ ipn->in_redir = NAT_MAP;
+ bcopy(nat->nat_ptr->in_ifnames[0], ipn->in_ifnames[0],
+ sizeof(ipn->in_ifnames[0]));
+ ipn->in_p = IPPROTO_ESP;
+
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ fi.fin_state = NULL;
+ fi.fin_nat = NULL;
+ fi.fin_fi.fi_p = IPPROTO_ESP;
+ fi.fin_fr = &ipsecfr;
+ fi.fin_data[0] = 0;
+ fi.fin_data[1] = 0;
+ p = ip->ip_p;
+ ip->ip_p = IPPROTO_ESP;
+ fi.fin_flx &= ~(FI_TCPUDP|FI_STATE|FI_FRAG);
+ fi.fin_flx |= FI_IGNORE;
+
+ ptr = ipsec_buffer;
+ bcopy(ptr, (char *)ipsec->ipsc_icookie, sizeof(ipsec_cookie_t));
+ ptr += sizeof(ipsec_cookie_t);
+ bcopy(ptr, (char *)ipsec->ipsc_rcookie, sizeof(ipsec_cookie_t));
+ /*
+ * The responder cookie should only be non-zero if the initiator
+ * cookie is non-zero. Therefore, it is safe to assume(!) that the
+ * cookies are both set after copying if the responder is non-zero.
+ */
+ if ((ipsec->ipsc_rcookie[0]|ipsec->ipsc_rcookie[1]) != 0)
+ ipsec->ipsc_rckset = 1;
+
+ ipsec->ipsc_nat = nat_new(&fi, ipn, &ipsec->ipsc_nat,
+ NAT_SLAVE|SI_WILDP, NAT_OUTBOUND);
+ if (ipsec->ipsc_nat != NULL) {
+ (void) nat_proto(&fi, ipsec->ipsc_nat, 0);
+ nat_update(&fi, ipsec->ipsc_nat, ipn);
+
+ fi.fin_data[0] = 0;
+ fi.fin_data[1] = 0;
+ ipsec->ipsc_state = fr_addstate(&fi, &ipsec->ipsc_state,
+ SI_WILDP);
+ if (fi.fin_state != NULL)
+ fr_statederef((ipstate_t **)&fi.fin_state);
+ }
+ ip->ip_p = p & 0xff;
+ return 0;
+}
+
+
+/*
+ * For outgoing IKE packets. refresh timeouts for NAT & state entries, if
+ * we can. If they have disappeared, recreate them.
+ */
+int ippr_ipsec_inout(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ ipsec_pxy_t *ipsec;
+ fr_info_t fi;
+ ip_t *ip;
+ int p;
+
+ if ((fin->fin_out == 1) && (nat->nat_dir == NAT_INBOUND))
+ return 0;
+
+ if ((fin->fin_out == 0) && (nat->nat_dir == NAT_OUTBOUND))
+ return 0;
+
+ ipsec = aps->aps_data;
+
+ if (ipsec != NULL) {
+ ip = fin->fin_ip;
+ p = ip->ip_p;
+
+ if ((ipsec->ipsc_nat == NULL) || (ipsec->ipsc_state == NULL)) {
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ fi.fin_state = NULL;
+ fi.fin_nat = NULL;
+ fi.fin_fi.fi_p = IPPROTO_ESP;
+ fi.fin_fr = &ipsecfr;
+ fi.fin_data[0] = 0;
+ fi.fin_data[1] = 0;
+ ip->ip_p = IPPROTO_ESP;
+ fi.fin_flx &= ~(FI_TCPUDP|FI_STATE|FI_FRAG);
+ fi.fin_flx |= FI_IGNORE;
+ }
+
+ /*
+ * Update NAT timeout/create NAT if missing.
+ */
+ if (ipsec->ipsc_nat != NULL)
+ fr_queueback(&ipsec->ipsc_nat->nat_tqe);
+ else {
+ ipsec->ipsc_nat = nat_new(&fi, &ipsec->ipsc_rule,
+ &ipsec->ipsc_nat,
+ NAT_SLAVE|SI_WILDP,
+ nat->nat_dir);
+ if (ipsec->ipsc_nat != NULL) {
+ (void) nat_proto(&fi, ipsec->ipsc_nat, 0);
+ nat_update(&fi, ipsec->ipsc_nat,
+ &ipsec->ipsc_rule);
+ }
+ }
+
+ /*
+ * Update state timeout/create state if missing.
+ */
+ READ_ENTER(&ipf_state);
+ if (ipsec->ipsc_state != NULL) {
+ fr_queueback(&ipsec->ipsc_state->is_sti);
+ ipsec->ipsc_state->is_die = nat->nat_age;
+ RWLOCK_EXIT(&ipf_state);
+ } else {
+ RWLOCK_EXIT(&ipf_state);
+ fi.fin_data[0] = 0;
+ fi.fin_data[1] = 0;
+ ipsec->ipsc_state = fr_addstate(&fi,
+ &ipsec->ipsc_state,
+ SI_WILDP);
+ if (fi.fin_state != NULL)
+ fr_statederef((ipstate_t **)&fi.fin_state);
+ }
+ ip->ip_p = p;
+ }
+ return 0;
+}
+
+
+/*
+ * This extends the NAT matching to be based on the cookies associated with
+ * a session and found at the front of IKE packets. The cookies are always
+ * in the same order (not reversed depending on packet flow direction as with
+ * UDP/TCP port numbers).
+ */
+int ippr_ipsec_match(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ ipsec_pxy_t *ipsec;
+ u_32_t cookies[4];
+ mb_t *m;
+ int off;
+
+ nat = nat; /* LINT */
+
+ if ((fin->fin_dlen < sizeof(cookies)) || (fin->fin_flx & FI_FRAG))
+ return -1;
+
+ off = fin->fin_plen - fin->fin_dlen + fin->fin_ipoff;
+ ipsec = aps->aps_data;
+ m = fin->fin_m;
+ COPYDATA(m, off, sizeof(cookies), (char *)cookies);
+
+ if ((cookies[0] != ipsec->ipsc_icookie[0]) ||
+ (cookies[1] != ipsec->ipsc_icookie[1]))
+ return -1;
+
+ if (ipsec->ipsc_rckset == 0) {
+ if ((cookies[2]|cookies[3]) == 0) {
+ return 0;
+ }
+ ipsec->ipsc_rckset = 1;
+ ipsec->ipsc_rcookie[0] = cookies[2];
+ ipsec->ipsc_rcookie[1] = cookies[3];
+ return 0;
+ }
+
+ if ((cookies[2] != ipsec->ipsc_rcookie[0]) ||
+ (cookies[3] != ipsec->ipsc_rcookie[1]))
+ return -1;
+ return 0;
+}
+
+
+/*
+ * clean up after ourselves.
+ */
+void ippr_ipsec_del(aps)
+ap_session_t *aps;
+{
+ ipsec_pxy_t *ipsec;
+
+ ipsec = aps->aps_data;
+
+ if (ipsec != NULL) {
+ /*
+ * Don't bother changing any of the NAT structure details,
+ * *_del() is on a callback from aps_free(), from nat_delete()
+ */
+
+ READ_ENTER(&ipf_state);
+ if (ipsec->ipsc_state != NULL) {
+ ipsec->ipsc_state->is_die = fr_ticks + 1;
+ ipsec->ipsc_state->is_me = NULL;
+ fr_queuefront(&ipsec->ipsc_state->is_sti);
+ }
+ RWLOCK_EXIT(&ipf_state);
+
+ ipsec->ipsc_state = NULL;
+ ipsec->ipsc_nat = NULL;
+ }
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_irc_pxy.c b/sys/contrib/ipfilter/netinet/ip_irc_pxy.c
new file mode 100644
index 0000000..5bb252a
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_irc_pxy.c
@@ -0,0 +1,433 @@
+/*
+ * Copyright (C) 2000-2003 Darren Reed
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: ip_irc_pxy.c,v 2.39.2.6 2006/07/14 06:12:14 darrenr Exp $
+ */
+
+#define IPF_IRC_PROXY
+
+#define IPF_IRCBUFSZ 96 /* This *MUST* be >= 64! */
+
+
+int ippr_irc_init __P((void));
+void ippr_irc_fini __P((void));
+int ippr_irc_new __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_irc_out __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_irc_send __P((fr_info_t *, nat_t *));
+int ippr_irc_complete __P((ircinfo_t *, char *, size_t));
+u_short ipf_irc_atoi __P((char **));
+
+static frentry_t ircnatfr;
+
+int irc_proxy_init = 0;
+
+
+/*
+ * Initialize local structures.
+ */
+int ippr_irc_init()
+{
+ bzero((char *)&ircnatfr, sizeof(ircnatfr));
+ ircnatfr.fr_ref = 1;
+ ircnatfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ MUTEX_INIT(&ircnatfr.fr_lock, "IRC proxy rule lock");
+ irc_proxy_init = 1;
+
+ return 0;
+}
+
+
+void ippr_irc_fini()
+{
+ if (irc_proxy_init == 1) {
+ MUTEX_DESTROY(&ircnatfr.fr_lock);
+ irc_proxy_init = 0;
+ }
+}
+
+
+const char *ippr_irc_dcctypes[] = {
+ "CHAT ", /* CHAT chat ipnumber portnumber */
+ "SEND ", /* SEND filename ipnumber portnumber */
+ "MOVE ",
+ "TSEND ",
+ "SCHAT ",
+ NULL,
+};
+
+
+/*
+ * :A PRIVMSG B :^ADCC CHAT chat 0 0^A\r\n
+ * PRIVMSG B ^ADCC CHAT chat 0 0^A\r\n
+ */
+
+
+int ippr_irc_complete(ircp, buf, len)
+ircinfo_t *ircp;
+char *buf;
+size_t len;
+{
+ register char *s, c;
+ register size_t i;
+ u_32_t l;
+ int j, k;
+
+ ircp->irc_ipnum = 0;
+ ircp->irc_port = 0;
+
+ if (len < 31)
+ return 0;
+ s = buf;
+ c = *s++;
+ i = len - 1;
+
+ if ((c != ':') && (c != 'P'))
+ return 0;
+
+ if (c == ':') {
+ /*
+ * Loosely check that the source is a nickname of some sort
+ */
+ s++;
+ c = *s;
+ ircp->irc_snick = s;
+ if (!ISALPHA(c))
+ return 0;
+ i--;
+ for (c = *s; !ISSPACE(c) && (i > 0); i--)
+ c = *s++;
+ if (i < 31)
+ return 0;
+ if (c != 'P')
+ return 0;
+ } else
+ ircp->irc_snick = NULL;
+
+ /*
+ * Check command string
+ */
+ if (strncmp(s, "PRIVMSG ", 8))
+ return 0;
+ i -= 8;
+ s += 8;
+ c = *s;
+ ircp->irc_dnick = s;
+
+ /*
+ * Loosely check that the destination is a nickname of some sort
+ */
+ if (!ISALPHA(c))
+ return 0;
+ for (; !ISSPACE(c) && (i > 0); i--)
+ c = *s++;
+ if (i < 20)
+ return 0;
+ s++,
+ i--;
+
+ /*
+ * Look for a ^A to start the DCC
+ */
+ c = *s;
+ if (c == ':') {
+ s++;
+ c = *s;
+ }
+
+ if (strncmp(s, "\001DCC ", 4))
+ return 0;
+
+ i -= 4;
+ s += 4;
+
+ /*
+ * Check for a recognised DCC command
+ */
+ for (j = 0, k = 0; ippr_irc_dcctypes[j]; j++) {
+ k = MIN(strlen(ippr_irc_dcctypes[j]), i);
+ if (!strncmp(ippr_irc_dcctypes[j], s, k))
+ break;
+ }
+ if (!ippr_irc_dcctypes[j])
+ return 0;
+
+ ircp->irc_type = s;
+ i -= k;
+ s += k;
+
+ if (i < 11)
+ return 0;
+
+ /*
+ * Check for the arg
+ */
+ c = *s;
+ if (ISSPACE(c))
+ return 0;
+ ircp->irc_arg = s;
+ for (; (c != ' ') && (c != '\001') && (i > 0); i--)
+ c = *s++;
+
+ if (c == '\001') /* In reality a ^A can quote another ^A...*/
+ return 0;
+
+ if (i < 5)
+ return 0;
+
+ s++;
+ i--;
+ c = *s;
+ if (!ISDIGIT(c))
+ return 0;
+ ircp->irc_addr = s;
+ /*
+ * Get the IP#
+ */
+ for (l = 0; ISDIGIT(c) && (i > 0); i--) {
+ l *= 10;
+ l += c - '0';
+ c = *s++;
+ }
+
+ if (i < 4)
+ return 0;
+
+ if (c != ' ')
+ return 0;
+
+ ircp->irc_ipnum = l;
+ s++;
+ i--;
+ c = *s;
+ if (!ISDIGIT(c))
+ return 0;
+ /*
+ * Get the port#
+ */
+ for (l = 0; ISDIGIT(c) && (i > 0); i--) {
+ l *= 10;
+ l += c - '0';
+ c = *s++;
+ }
+ if (i < 3)
+ return 0;
+ if (strncmp(s, "\001\r\n", 3))
+ return 0;
+ s += 3;
+ ircp->irc_len = s - buf;
+ ircp->irc_port = l;
+ return 1;
+}
+
+
+int ippr_irc_new(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ ircinfo_t *irc;
+
+ KMALLOC(irc, ircinfo_t *);
+ if (irc == NULL)
+ return -1;
+
+ fin = fin; /* LINT */
+ nat = nat; /* LINT */
+
+ aps->aps_data = irc;
+ aps->aps_psiz = sizeof(ircinfo_t);
+
+ bzero((char *)irc, sizeof(*irc));
+ return 0;
+}
+
+
+int ippr_irc_send(fin, nat)
+fr_info_t *fin;
+nat_t *nat;
+{
+ char ctcpbuf[IPF_IRCBUFSZ], newbuf[IPF_IRCBUFSZ];
+ tcphdr_t *tcp, tcph, *tcp2 = &tcph;
+ int off, inc = 0, i, dlen;
+ size_t nlen = 0, olen;
+ struct in_addr swip;
+ u_short a5, sp;
+ ircinfo_t *irc;
+ fr_info_t fi;
+ nat_t *nat2;
+ u_int a1;
+ ip_t *ip;
+ mb_t *m;
+#ifdef MENTAT
+ mb_t *m1;
+#endif
+
+ m = fin->fin_m;
+ ip = fin->fin_ip;
+ tcp = (tcphdr_t *)fin->fin_dp;
+ bzero(ctcpbuf, sizeof(ctcpbuf));
+ off = (char *)tcp - (char *)ip + (TCP_OFF(tcp) << 2) + fin->fin_ipoff;
+
+#ifdef __sgi
+ dlen = fin->fin_plen - off;
+#else
+ dlen = MSGDSIZE(m) - off;
+#endif
+ if (dlen <= 0)
+ return 0;
+ COPYDATA(m, off, MIN(sizeof(ctcpbuf), dlen), ctcpbuf);
+
+ if (dlen <= 0)
+ return 0;
+ ctcpbuf[sizeof(ctcpbuf) - 1] = '\0';
+ *newbuf = '\0';
+
+ irc = nat->nat_aps->aps_data;
+ if (ippr_irc_complete(irc, ctcpbuf, dlen) == 0)
+ return 0;
+
+ /*
+ * check that IP address in the PORT/PASV reply is the same as the
+ * sender of the command - prevents using PORT for port scanning.
+ */
+ if (irc->irc_ipnum != ntohl(nat->nat_inip.s_addr))
+ return 0;
+
+ a5 = irc->irc_port;
+
+ /*
+ * Calculate new address parts for the DCC command
+ */
+ a1 = ntohl(ip->ip_src.s_addr);
+ olen = irc->irc_len;
+ i = irc->irc_addr - ctcpbuf;
+ i++;
+ (void) strncpy(newbuf, ctcpbuf, i);
+ /* DO NOT change these! */
+#if defined(SNPRINTF) && defined(KERNEL)
+ SNPRINTF(newbuf, sizeof(newbuf) - i, "%u %u\001\r\n", a1, a5);
+#else
+ (void) sprintf(newbuf, "%u %u\001\r\n", a1, a5);
+#endif
+
+ nlen = strlen(newbuf);
+ inc = nlen - olen;
+
+ if ((inc + ip->ip_len) > 65535)
+ return 0;
+
+#ifdef MENTAT
+ for (m1 = m; m1->b_cont; m1 = m1->b_cont)
+ ;
+ if ((inc > 0) && (m1->b_datap->db_lim - m1->b_wptr < inc)) {
+ mblk_t *nm;
+
+ /* alloc enough to keep same trailer space for lower driver */
+ nm = allocb(nlen, BPRI_MED);
+ PANIC((!nm),("ippr_irc_out: allocb failed"));
+
+ nm->b_band = m1->b_band;
+ nm->b_wptr += nlen;
+
+ m1->b_wptr -= olen;
+ PANIC((m1->b_wptr < m1->b_rptr),
+ ("ippr_irc_out: cannot handle fragmented data block"));
+
+ linkb(m1, nm);
+ } else {
+# if SOLARIS && defined(ICK_VALID)
+ if (m1->b_datap->db_struiolim == m1->b_wptr)
+ m1->b_datap->db_struiolim += inc;
+ m1->b_datap->db_struioflag &= ~STRUIO_IP;
+# endif
+ m1->b_wptr += inc;
+ }
+#else
+ if (inc < 0)
+ m_adj(m, inc);
+ /* the mbuf chain will be extended if necessary by m_copyback() */
+#endif
+ COPYBACK(m, off, nlen, newbuf);
+
+ if (inc != 0) {
+#if defined(MENTAT) || defined(__sgi)
+ register u_32_t sum1, sum2;
+
+ sum1 = ip->ip_len;
+ sum2 = ip->ip_len + inc;
+
+ /* Because ~1 == -2, We really need ~1 == -1 */
+ if (sum1 > sum2)
+ sum2--;
+ sum2 -= sum1;
+ sum2 = (sum2 & 0xffff) + (sum2 >> 16);
+
+ fix_outcksum(fin, &ip->ip_sum, sum2);
+#endif
+ ip->ip_len += inc;
+ }
+
+ /*
+ * Add skeleton NAT entry for connection which will come back the
+ * other way.
+ */
+ sp = htons(a5);
+ /*
+ * Don't allow the PORT command to specify a port < 1024 due to
+ * security crap.
+ */
+ if (ntohs(sp) < 1024)
+ return 0;
+
+ /*
+ * The server may not make the connection back from port 20, but
+ * it is the most likely so use it here to check for a conflicting
+ * mapping.
+ */
+ bcopy((caddr_t)fin, (caddr_t)&fi, sizeof(fi));
+ fi.fin_data[0] = sp;
+ fi.fin_data[1] = fin->fin_data[1];
+ nat2 = nat_outlookup(fin, IPN_TCP, nat->nat_p, nat->nat_inip,
+ ip->ip_dst);
+ if (nat2 == NULL) {
+ bcopy((caddr_t)fin, (caddr_t)&fi, sizeof(fi));
+ bzero((char *)tcp2, sizeof(*tcp2));
+ tcp2->th_win = htons(8192);
+ tcp2->th_sport = sp;
+ tcp2->th_dport = 0; /* XXX - don't specify remote port */
+ fi.fin_state = NULL;
+ fi.fin_nat = NULL;
+ fi.fin_data[0] = ntohs(sp);
+ fi.fin_data[1] = 0;
+ fi.fin_dp = (char *)tcp2;
+ fi.fin_fr = &ircnatfr;
+ fi.fin_dlen = sizeof(*tcp2);
+ fi.fin_plen = fi.fin_hlen + sizeof(*tcp2);
+ swip = ip->ip_src;
+ ip->ip_src = nat->nat_inip;
+ nat2 = nat_new(&fi, nat->nat_ptr, NULL,
+ NAT_SLAVE|IPN_TCP|SI_W_DPORT, NAT_OUTBOUND);
+ if (nat2 != NULL) {
+ (void) nat_proto(&fi, nat2, 0);
+ nat_update(&fi, nat2, nat2->nat_ptr);
+
+ (void) fr_addstate(&fi, NULL, SI_W_DPORT);
+ if (fi.fin_state != NULL)
+ fr_statederef((ipstate_t **)&fi.fin_state);
+ }
+ ip->ip_src = swip;
+ }
+ return inc;
+}
+
+
+int ippr_irc_out(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ aps = aps; /* LINT */
+ return ippr_irc_send(fin, nat);
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_log.c b/sys/contrib/ipfilter/netinet/ip_log.c
new file mode 100644
index 0000000..83454f0
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_log.c
@@ -0,0 +1,699 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1997-2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $FreeBSD$
+ * Id: ip_log.c,v 2.75.2.11 2006/03/26 13:50:47 darrenr Exp $
+ */
+#include <sys/param.h>
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \
+ defined(_KERNEL)
+# if (__NetBSD_Version__ < 399001400)
+# include "opt_ipfilter_log.h"
+# else
+# include "opt_ipfilter.h"
+# endif
+#endif
+#if defined(__FreeBSD__) && !defined(IPFILTER_LKM)
+# if defined(_KERNEL)
+# if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
+# include "opt_ipfilter.h"
+# endif
+# else
+# include <osreldate.h>
+# endif
+#endif
+#ifndef SOLARIS
+# define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/file.h>
+#ifndef _KERNEL
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+# include <ctype.h>
+# define _KERNEL
+# define KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+# undef KERNEL
+#endif
+#if __FreeBSD_version >= 220000 && defined(_KERNEL)
+# include <sys/fcntl.h>
+# include <sys/filio.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#include <sys/time.h>
+#if defined(_KERNEL)
+# include <sys/systm.h>
+# if defined(NetBSD) && (__NetBSD_Version__ >= 104000000)
+# include <sys/proc.h>
+# endif
+#endif /* _KERNEL */
+#if !SOLARIS && !defined(__hpux) && !defined(linux)
+# if (defined(NetBSD) && NetBSD > 199609) || \
+ (defined(OpenBSD) && OpenBSD > 199603) || \
+ (__FreeBSD_version >= 300000)
+# include <sys/dirent.h>
+# else
+# include <sys/dir.h>
+# endif
+# include <sys/mbuf.h>
+# include <sys/select.h>
+# if __FreeBSD_version >= 500000
+# include <sys/selinfo.h>
+# endif
+#else
+# if !defined(__hpux) && defined(_KERNEL)
+# include <sys/filio.h>
+# include <sys/cred.h>
+# include <sys/ddi.h>
+# include <sys/sunddi.h>
+# include <sys/ksynch.h>
+# include <sys/kmem.h>
+# include <sys/mkdev.h>
+# include <sys/dditypes.h>
+# include <sys/cmn_err.h>
+# endif /* !__hpux */
+#endif /* !SOLARIS && !__hpux */
+#if !defined(linux)
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#if __FreeBSD_version >= 300000
+# include <net/if_var.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#ifdef __sgi
+# include <sys/ddi.h>
+# ifdef IFF_DRVRLOCK /* IRIX6 */
+# include <sys/hashing.h>
+# endif
+#endif
+#if !defined(__hpux) && !defined(linux) && \
+ !(defined(__sgi) && !defined(IFF_DRVRLOCK)) /*IRIX<6*/
+# include <netinet/in_var.h>
+#endif
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#ifdef USE_INET6
+# include <netinet/icmp6.h>
+#endif
+#if !defined(linux)
+# include <netinet/ip_var.h>
+#endif
+#ifndef _KERNEL
+# include <syslog.h>
+#endif
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_auth.h"
+#if (__FreeBSD_version >= 300000) || defined(__NetBSD__)
+# include <sys/malloc.h>
+#endif
+/* END OF INCLUDES */
+
+#ifdef IPFILTER_LOG
+
+# if defined(IPL_SELECT)
+# include <machine/sys/user.h>
+# include <sys/kthread_iface.h>
+# define READ_COLLISION 0x001
+
+iplog_select_t iplog_ss[IPL_LOGMAX+1];
+
+extern int selwait;
+# endif /* IPL_SELECT */
+
+# if defined(linux) && defined(_KERNEL)
+wait_queue_head_t iplh_linux[IPL_LOGSIZE];
+# endif
+# if SOLARIS && defined(_KERNEL)
+extern kcondvar_t iplwait;
+extern struct pollhead iplpollhead[IPL_LOGSIZE];
+# endif
+
+iplog_t **iplh[IPL_LOGSIZE], *iplt[IPL_LOGSIZE], *ipll[IPL_LOGSIZE];
+int iplused[IPL_LOGSIZE];
+static fr_info_t iplcrc[IPL_LOGSIZE];
+int ipl_suppress = 1;
+int ipl_logmax = IPL_LOGMAX;
+int ipl_logall = 0;
+int ipl_log_init = 0;
+int ipl_logsize = IPFILTER_LOGSIZE;
+int ipl_magic[IPL_LOGSIZE] = { IPL_MAGIC, IPL_MAGIC_NAT, IPL_MAGIC_STATE,
+ IPL_MAGIC, IPL_MAGIC, IPL_MAGIC,
+ IPL_MAGIC, IPL_MAGIC };
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_loginit */
+/* Returns: int - 0 == success (always returned) */
+/* Parameters: Nil */
+/* */
+/* Initialise log buffers & pointers. Also iniialised the CRC to a local */
+/* secret for use in calculating the "last log checksum". */
+/* ------------------------------------------------------------------------ */
+int fr_loginit()
+{
+ int i;
+
+ for (i = IPL_LOGMAX; i >= 0; i--) {
+ iplt[i] = NULL;
+ ipll[i] = NULL;
+ iplh[i] = &iplt[i];
+ iplused[i] = 0;
+ bzero((char *)&iplcrc[i], sizeof(iplcrc[i]));
+# ifdef IPL_SELECT
+ iplog_ss[i].read_waiter = 0;
+ iplog_ss[i].state = 0;
+# endif
+# if defined(linux) && defined(_KERNEL)
+ init_waitqueue_head(iplh_linux + i);
+# endif
+ }
+
+# if SOLARIS && defined(_KERNEL)
+ cv_init(&iplwait, "ipl condvar", CV_DRIVER, NULL);
+# endif
+ MUTEX_INIT(&ipl_mutex, "ipf log mutex");
+
+ ipl_log_init = 1;
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_logunload */
+/* Returns: Nil */
+/* Parameters: Nil */
+/* */
+/* Clean up any log data that has accumulated without being read. */
+/* ------------------------------------------------------------------------ */
+void fr_logunload()
+{
+ int i;
+
+ if (ipl_log_init == 0)
+ return;
+
+ for (i = IPL_LOGMAX; i >= 0; i--)
+ (void) ipflog_clear(i);
+
+# if SOLARIS && defined(_KERNEL)
+ cv_destroy(&iplwait);
+# endif
+ MUTEX_DESTROY(&ipl_mutex);
+
+ ipl_log_init = 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipflog */
+/* Returns: int - 0 == success, -1 == failure */
+/* Parameters: fin(I) - pointer to packet information */
+/* flags(I) - flags from filter rules */
+/* */
+/* Create a log record for a packet given that it has been triggered by a */
+/* rule (or the default setting). Calculate the transport protocol header */
+/* size using predetermined size of a couple of popular protocols and thus */
+/* how much data to copy into the log, including part of the data body if */
+/* requested. */
+/* ------------------------------------------------------------------------ */
+int ipflog(fin, flags)
+fr_info_t *fin;
+u_int flags;
+{
+ register size_t hlen;
+ int types[2], mlen;
+ size_t sizes[2];
+ void *ptrs[2];
+ ipflog_t ipfl;
+ u_char p;
+ mb_t *m;
+# if (SOLARIS || defined(__hpux)) && defined(_KERNEL)
+ qif_t *ifp;
+# else
+ struct ifnet *ifp;
+# endif /* SOLARIS || __hpux */
+
+ m = fin->fin_m;
+ if (m == NULL)
+ return -1;
+
+ ipfl.fl_nattag.ipt_num[0] = 0;
+ ifp = fin->fin_ifp;
+ hlen = fin->fin_hlen;
+ /*
+ * calculate header size.
+ */
+ if (fin->fin_off == 0) {
+ p = fin->fin_fi.fi_p;
+ if (p == IPPROTO_TCP)
+ hlen += MIN(sizeof(tcphdr_t), fin->fin_dlen);
+ else if (p == IPPROTO_UDP)
+ hlen += MIN(sizeof(udphdr_t), fin->fin_dlen);
+ else if (p == IPPROTO_ICMP) {
+ struct icmp *icmp;
+
+ icmp = (struct icmp *)fin->fin_dp;
+
+ /*
+ * For ICMP, if the packet is an error packet, also
+ * include the information about the packet which
+ * caused the error.
+ */
+ switch (icmp->icmp_type)
+ {
+ case ICMP_UNREACH :
+ case ICMP_SOURCEQUENCH :
+ case ICMP_REDIRECT :
+ case ICMP_TIMXCEED :
+ case ICMP_PARAMPROB :
+ hlen += MIN(sizeof(struct icmp) + 8,
+ fin->fin_dlen);
+ break;
+ default :
+ hlen += MIN(sizeof(struct icmp),
+ fin->fin_dlen);
+ break;
+ }
+ }
+# ifdef USE_INET6
+ else if (p == IPPROTO_ICMPV6) {
+ struct icmp6_hdr *icmp;
+
+ icmp = (struct icmp6_hdr *)fin->fin_dp;
+
+ /*
+ * For ICMPV6, if the packet is an error packet, also
+ * include the information about the packet which
+ * caused the error.
+ */
+ if (icmp->icmp6_type < 128) {
+ hlen += MIN(sizeof(struct icmp6_hdr) + 8,
+ fin->fin_dlen);
+ } else {
+ hlen += MIN(sizeof(struct icmp6_hdr),
+ fin->fin_dlen);
+ }
+ }
+# endif
+ }
+ /*
+ * Get the interface number and name to which this packet is
+ * currently associated.
+ */
+# if (SOLARIS || defined(__hpux)) && defined(_KERNEL)
+ ipfl.fl_unit = (u_int)ifp->qf_ppa;
+ COPYIFNAME(ifp, ipfl.fl_ifname);
+# else
+# if (defined(NetBSD) && (NetBSD <= 1991011) && (NetBSD >= 199603)) || \
+ (defined(OpenBSD) && (OpenBSD >= 199603)) || defined(linux) || \
+ (defined(__FreeBSD__) && (__FreeBSD_version >= 501113))
+ COPYIFNAME(ifp, ipfl.fl_ifname);
+# else
+ ipfl.fl_unit = (u_int)ifp->if_unit;
+# if defined(_KERNEL)
+ if ((ipfl.fl_ifname[0] = ifp->if_name[0]))
+ if ((ipfl.fl_ifname[1] = ifp->if_name[1]))
+ if ((ipfl.fl_ifname[2] = ifp->if_name[2]))
+ ipfl.fl_ifname[3] = ifp->if_name[3];
+# else
+ (void) strncpy(ipfl.fl_ifname, IFNAME(ifp), sizeof(ipfl.fl_ifname));
+ ipfl.fl_ifname[sizeof(ipfl.fl_ifname) - 1] = '\0';
+# endif
+# endif
+# endif /* __hpux || SOLARIS */
+ mlen = fin->fin_plen - hlen;
+ if (!ipl_logall) {
+ mlen = (flags & FR_LOGBODY) ? MIN(mlen, 128) : 0;
+ } else if ((flags & FR_LOGBODY) == 0) {
+ mlen = 0;
+ }
+ if (mlen < 0)
+ mlen = 0;
+ ipfl.fl_plen = (u_char)mlen;
+ ipfl.fl_hlen = (u_char)hlen;
+ ipfl.fl_rule = fin->fin_rule;
+ (void) strncpy(ipfl.fl_group, fin->fin_group, FR_GROUPLEN);
+ if (fin->fin_fr != NULL) {
+ ipfl.fl_loglevel = fin->fin_fr->fr_loglevel;
+ ipfl.fl_logtag = fin->fin_fr->fr_logtag;
+ } else {
+ ipfl.fl_loglevel = 0xffff;
+ ipfl.fl_logtag = FR_NOLOGTAG;
+ }
+ if (fin->fin_nattag != NULL)
+ bcopy(fin->fin_nattag, (void *)&ipfl.fl_nattag,
+ sizeof(ipfl.fl_nattag));
+ ipfl.fl_flags = flags;
+ ipfl.fl_dir = fin->fin_out;
+ ipfl.fl_lflags = fin->fin_flx;
+ ptrs[0] = (void *)&ipfl;
+ sizes[0] = sizeof(ipfl);
+ types[0] = 0;
+# if defined(MENTAT) && defined(_KERNEL)
+ /*
+ * Are we copied from the mblk or an aligned array ?
+ */
+ if (fin->fin_ip == (ip_t *)m->b_rptr) {
+ ptrs[1] = m;
+ sizes[1] = hlen + mlen;
+ types[1] = 1;
+ } else {
+ ptrs[1] = fin->fin_ip;
+ sizes[1] = hlen + mlen;
+ types[1] = 0;
+ }
+# else
+ ptrs[1] = m;
+ sizes[1] = hlen + mlen;
+ types[1] = 1;
+# endif /* MENTAT */
+ return ipllog(IPL_LOGIPF, fin, ptrs, sizes, types, 2);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipllog */
+/* Returns: int - 0 == success, -1 == failure */
+/* Parameters: dev(I) - device that owns this log record */
+/* fin(I) - pointer to packet information */
+/* items(I) - array of pointers to log data */
+/* itemsz(I) - array of size of valid memory pointed to */
+/* types(I) - type of data pointed to by items pointers */
+/* cnt(I) - number of elements in arrays items/itemsz/types */
+/* */
+/* Takes an array of parameters and constructs one record to include the */
+/* miscellaneous packet information, as well as packet data, for reading */
+/* from the log device. */
+/* ------------------------------------------------------------------------ */
+int ipllog(dev, fin, items, itemsz, types, cnt)
+int dev;
+fr_info_t *fin;
+void **items;
+size_t *itemsz;
+int *types, cnt;
+{
+ caddr_t buf, ptr;
+ iplog_t *ipl;
+ size_t len;
+ int i;
+ SPL_INT(s);
+
+ /*
+ * Check to see if this log record has a CRC which matches the last
+ * record logged. If it does, just up the count on the previous one
+ * rather than create a new one.
+ */
+ if (ipl_suppress) {
+ MUTEX_ENTER(&ipl_mutex);
+ if ((fin != NULL) && (fin->fin_off == 0)) {
+ if ((ipll[dev] != NULL) &&
+ bcmp((char *)fin, (char *)&iplcrc[dev],
+ FI_LCSIZE) == 0) {
+ ipll[dev]->ipl_count++;
+ MUTEX_EXIT(&ipl_mutex);
+ return 0;
+ }
+ bcopy((char *)fin, (char *)&iplcrc[dev], FI_LCSIZE);
+ } else
+ bzero((char *)&iplcrc[dev], FI_CSIZE);
+ MUTEX_EXIT(&ipl_mutex);
+ }
+
+ /*
+ * Get the total amount of data to be logged.
+ */
+ for (i = 0, len = sizeof(iplog_t); i < cnt; i++)
+ len += itemsz[i];
+
+ /*
+ * check that we have space to record this information and can
+ * allocate that much.
+ */
+ KMALLOCS(buf, caddr_t, len);
+ if (buf == NULL)
+ return -1;
+ SPL_NET(s);
+ MUTEX_ENTER(&ipl_mutex);
+ if ((iplused[dev] + len) > ipl_logsize) {
+ MUTEX_EXIT(&ipl_mutex);
+ SPL_X(s);
+ KFREES(buf, len);
+ return -1;
+ }
+ iplused[dev] += len;
+ MUTEX_EXIT(&ipl_mutex);
+ SPL_X(s);
+
+ /*
+ * advance the log pointer to the next empty record and deduct the
+ * amount of space we're going to use.
+ */
+ ipl = (iplog_t *)buf;
+ ipl->ipl_magic = ipl_magic[dev];
+ ipl->ipl_count = 1;
+ ipl->ipl_next = NULL;
+ ipl->ipl_dsize = len;
+#ifdef _KERNEL
+ GETKTIME(&ipl->ipl_sec);
+#else
+ ipl->ipl_sec = 0;
+ ipl->ipl_usec = 0;
+#endif
+
+ /*
+ * Loop through all the items to be logged, copying each one to the
+ * buffer. Use bcopy for normal data or the mb_t copyout routine.
+ */
+ for (i = 0, ptr = buf + sizeof(*ipl); i < cnt; i++) {
+ if (types[i] == 0) {
+ bcopy(items[i], ptr, itemsz[i]);
+ } else if (types[i] == 1) {
+ COPYDATA(items[i], 0, itemsz[i], ptr);
+ }
+ ptr += itemsz[i];
+ }
+ SPL_NET(s);
+ MUTEX_ENTER(&ipl_mutex);
+ ipll[dev] = ipl;
+ *iplh[dev] = ipl;
+ iplh[dev] = &ipl->ipl_next;
+
+ /*
+ * Now that the log record has been completed and added to the queue,
+ * wake up any listeners who may want to read it.
+ */
+# if SOLARIS && defined(_KERNEL)
+ cv_signal(&iplwait);
+ MUTEX_EXIT(&ipl_mutex);
+ pollwakeup(&iplpollhead[dev], POLLRDNORM);
+# else
+ MUTEX_EXIT(&ipl_mutex);
+ WAKEUP(iplh, dev);
+ POLLWAKEUP(dev);
+# endif
+ SPL_X(s);
+# ifdef IPL_SELECT
+ iplog_input_ready(dev);
+# endif
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipflog_read */
+/* Returns: int - 0 == success, else error value. */
+/* Parameters: unit(I) - device we are reading from */
+/* uio(O) - pointer to information about where to store data */
+/* */
+/* Called to handle a read on an IPFilter device. Returns only complete */
+/* log messages - will not partially copy a log record out to userland. */
+/* */
+/* NOTE: This function will block and wait for a signal to return data if */
+/* there is none present. Asynchronous I/O is not implemented. */
+/* ------------------------------------------------------------------------ */
+int ipflog_read(unit, uio)
+minor_t unit;
+struct uio *uio;
+{
+ size_t dlen, copied;
+ int error = 0;
+ iplog_t *ipl;
+ SPL_INT(s);
+
+ /*
+ * Sanity checks. Make sure the minor # is valid and we're copying
+ * a valid chunk of data.
+ */
+ if (IPL_LOGMAX < unit)
+ return ENXIO;
+ if (uio->uio_resid == 0)
+ return 0;
+ if ((uio->uio_resid < sizeof(iplog_t)) ||
+ (uio->uio_resid > ipl_logsize))
+ return EINVAL;
+
+ /*
+ * Lock the log so we can snapshot the variables. Wait for a signal
+ * if the log is empty.
+ */
+ SPL_NET(s);
+ MUTEX_ENTER(&ipl_mutex);
+
+ while (iplt[unit] == NULL) {
+# if SOLARIS && defined(_KERNEL)
+ if (!cv_wait_sig(&iplwait, &ipl_mutex.ipf_lk)) {
+ MUTEX_EXIT(&ipl_mutex);
+ return EINTR;
+ }
+# else
+# if defined(__hpux) && defined(_KERNEL)
+ lock_t *l;
+
+# ifdef IPL_SELECT
+ if (uio->uio_fpflags & (FNBLOCK|FNDELAY)) {
+ /* this is no blocking system call */
+ MUTEX_EXIT(&ipl_mutex);
+ return 0;
+ }
+# endif
+
+ MUTEX_EXIT(&ipl_mutex);
+ l = get_sleep_lock(&iplh[unit]);
+ error = sleep(&iplh[unit], PZERO+1);
+ spinunlock(l);
+# else
+# if defined(__osf__) && defined(_KERNEL)
+ error = mpsleep(&iplh[unit], PSUSP|PCATCH, "iplread", 0,
+ &ipl_mutex, MS_LOCK_SIMPLE);
+# else
+ MUTEX_EXIT(&ipl_mutex);
+ SPL_X(s);
+ error = SLEEP(unit + iplh, "ipl sleep");
+# endif /* __osf__ */
+# endif /* __hpux */
+ if (error)
+ return error;
+ SPL_NET(s);
+ MUTEX_ENTER(&ipl_mutex);
+# endif /* SOLARIS */
+ }
+
+# if (BSD >= 199101) || defined(__FreeBSD__) || defined(__osf__)
+ uio->uio_rw = UIO_READ;
+# endif
+
+ for (copied = 0; (ipl = iplt[unit]) != NULL; copied += dlen) {
+ dlen = ipl->ipl_dsize;
+ if (dlen > uio->uio_resid)
+ break;
+ /*
+ * Don't hold the mutex over the uiomove call.
+ */
+ iplt[unit] = ipl->ipl_next;
+ iplused[unit] -= dlen;
+ MUTEX_EXIT(&ipl_mutex);
+ SPL_X(s);
+ error = UIOMOVE((caddr_t)ipl, dlen, UIO_READ, uio);
+ if (error) {
+ SPL_NET(s);
+ MUTEX_ENTER(&ipl_mutex);
+ ipl->ipl_next = iplt[unit];
+ iplt[unit] = ipl;
+ iplused[unit] += dlen;
+ break;
+ }
+ MUTEX_ENTER(&ipl_mutex);
+ KFREES((caddr_t)ipl, dlen);
+ SPL_NET(s);
+ }
+ if (!iplt[unit]) {
+ iplused[unit] = 0;
+ iplh[unit] = &iplt[unit];
+ ipll[unit] = NULL;
+ }
+
+ MUTEX_EXIT(&ipl_mutex);
+ SPL_X(s);
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipflog_clear */
+/* Returns: int - number of log bytes cleared. */
+/* Parameters: unit(I) - device we are reading from */
+/* */
+/* Deletes all queued up log records for a given output device. */
+/* ------------------------------------------------------------------------ */
+int ipflog_clear(unit)
+minor_t unit;
+{
+ iplog_t *ipl;
+ int used;
+ SPL_INT(s);
+
+ SPL_NET(s);
+ MUTEX_ENTER(&ipl_mutex);
+ while ((ipl = iplt[unit]) != NULL) {
+ iplt[unit] = ipl->ipl_next;
+ KFREES((caddr_t)ipl, ipl->ipl_dsize);
+ }
+ iplh[unit] = &iplt[unit];
+ ipll[unit] = NULL;
+ used = iplused[unit];
+ iplused[unit] = 0;
+ bzero((char *)&iplcrc[unit], FI_CSIZE);
+ MUTEX_EXIT(&ipl_mutex);
+ SPL_X(s);
+ return used;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipflog_canread */
+/* Returns: int - 0 == no data to read, 1 = data present */
+/* Parameters: unit(I) - device we are reading from */
+/* */
+/* Returns an indication of whether or not there is data present in the */
+/* current buffer for the selected ipf device. */
+/* ------------------------------------------------------------------------ */
+int ipflog_canread(unit)
+int unit;
+{
+ return iplt[unit] != NULL;
+}
+#endif /* IPFILTER_LOG */
diff --git a/sys/contrib/ipfilter/netinet/ip_lookup.c b/sys/contrib/ipfilter/netinet/ip_lookup.c
new file mode 100644
index 0000000..12b1f4a
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_lookup.c
@@ -0,0 +1,659 @@
+/*
+ * Copyright (C) 2002-2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#if defined(__osf__)
+# define _PROTO_NET_H_
+#endif
+#include <sys/param.h>
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#if __FreeBSD_version >= 220000 && defined(_KERNEL)
+# include <sys/fcntl.h>
+# include <sys/filio.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#if !defined(_KERNEL)
+# include <string.h>
+# define _KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+#endif
+#include <sys/socket.h>
+#if (defined(__osf__) || defined(AIX) || defined(__hpux) || defined(__sgi)) && defined(_KERNEL)
+# include "radix_ipf_local.h"
+# define _RADIX_H_
+#endif
+#include <net/if.h>
+#if defined(__FreeBSD__)
+# include <sys/cdefs.h>
+# include <sys/proc.h>
+#endif
+#if defined(_KERNEL)
+# include <sys/systm.h>
+# if !defined(__SVR4) && !defined(__svr4__)
+# include <sys/mbuf.h>
+# endif
+#endif
+#include <netinet/in.h>
+
+#include "netinet/ip_compat.h"
+#include "netinet/ip_fil.h"
+#include "netinet/ip_pool.h"
+#include "netinet/ip_htable.h"
+#include "netinet/ip_lookup.h"
+/* END OF INCLUDES */
+
+#if !defined(lint)
+static const char rcsid[] = "@(#)$Id: ip_lookup.c,v 2.35.2.15 2007/05/26 13:05:13 darrenr Exp $";
+#endif
+
+#ifdef IPFILTER_LOOKUP
+int ip_lookup_inited = 0;
+
+static int iplookup_addnode __P((caddr_t));
+static int iplookup_delnode __P((caddr_t data));
+static int iplookup_addtable __P((caddr_t));
+static int iplookup_deltable __P((caddr_t));
+static int iplookup_stats __P((caddr_t));
+static int iplookup_flush __P((caddr_t));
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: iplookup_init */
+/* Returns: int - 0 = success, else error */
+/* Parameters: Nil */
+/* */
+/* Initialise all of the subcomponents of the lookup infrstructure. */
+/* ------------------------------------------------------------------------ */
+int ip_lookup_init()
+{
+
+ if (ip_pool_init() == -1)
+ return -1;
+
+ RWLOCK_INIT(&ip_poolrw, "ip pool rwlock");
+
+ ip_lookup_inited = 1;
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: iplookup_unload */
+/* Returns: int - 0 = success, else error */
+/* Parameters: Nil */
+/* */
+/* Free up all pool related memory that has been allocated whilst IPFilter */
+/* has been running. Also, do any other deinitialisation required such */
+/* ip_lookup_init() can be called again, safely. */
+/* ------------------------------------------------------------------------ */
+void ip_lookup_unload()
+{
+ ip_pool_fini();
+ fr_htable_unload();
+
+ if (ip_lookup_inited == 1) {
+ RW_DESTROY(&ip_poolrw);
+ ip_lookup_inited = 0;
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: iplookup_ioctl */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(IO) - pointer to ioctl data to be copied to/from user */
+/* space. */
+/* cmd(I) - ioctl command number */
+/* mode(I) - file mode bits used with open */
+/* */
+/* Handle ioctl commands sent to the ioctl device. For the most part, this */
+/* involves just calling another function to handle the specifics of each */
+/* command. */
+/* ------------------------------------------------------------------------ */
+int ip_lookup_ioctl(data, cmd, mode, uid, ctx)
+caddr_t data;
+ioctlcmd_t cmd;
+int mode, uid;
+void *ctx;
+{
+ int err;
+ SPL_INT(s);
+
+ mode = mode; /* LINT */
+
+ SPL_NET(s);
+
+ switch (cmd)
+ {
+ case SIOCLOOKUPADDNODE :
+ case SIOCLOOKUPADDNODEW :
+ WRITE_ENTER(&ip_poolrw);
+ err = iplookup_addnode(data);
+ RWLOCK_EXIT(&ip_poolrw);
+ break;
+
+ case SIOCLOOKUPDELNODE :
+ case SIOCLOOKUPDELNODEW :
+ WRITE_ENTER(&ip_poolrw);
+ err = iplookup_delnode(data);
+ RWLOCK_EXIT(&ip_poolrw);
+ break;
+
+ case SIOCLOOKUPADDTABLE :
+ WRITE_ENTER(&ip_poolrw);
+ err = iplookup_addtable(data);
+ RWLOCK_EXIT(&ip_poolrw);
+ break;
+
+ case SIOCLOOKUPDELTABLE :
+ WRITE_ENTER(&ip_poolrw);
+ err = iplookup_deltable(data);
+ RWLOCK_EXIT(&ip_poolrw);
+ break;
+
+ case SIOCLOOKUPSTAT :
+ case SIOCLOOKUPSTATW :
+ WRITE_ENTER(&ip_poolrw);
+ err = iplookup_stats(data);
+ RWLOCK_EXIT(&ip_poolrw);
+ break;
+
+ case SIOCLOOKUPFLUSH :
+ WRITE_ENTER(&ip_poolrw);
+ err = iplookup_flush(data);
+ RWLOCK_EXIT(&ip_poolrw);
+ break;
+
+ case SIOCLOOKUPITER :
+ err = ip_lookup_iterate(data, uid, ctx);
+ break;
+
+ default :
+ err = EINVAL;
+ break;
+ }
+ SPL_X(s);
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: iplookup_addnode */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - pointer to data from ioctl call */
+/* */
+/* Add a new data node to a lookup structure. First, check to see if the */
+/* parent structure refered to by name exists and if it does, then go on to */
+/* add a node to it. */
+/* ------------------------------------------------------------------------ */
+static int iplookup_addnode(data)
+caddr_t data;
+{
+ ip_pool_node_t node, *m;
+ iplookupop_t op;
+ iphtable_t *iph;
+ iphtent_t hte;
+ ip_pool_t *p;
+ int err;
+
+ err = BCOPYIN(data, &op, sizeof(op));
+ if (err != 0)
+ return EFAULT;
+
+ if (op.iplo_unit < 0 || op.iplo_unit > IPL_LOGMAX)
+ return EINVAL;
+
+ op.iplo_name[sizeof(op.iplo_name) - 1] = '\0';
+
+ switch (op.iplo_type)
+ {
+ case IPLT_POOL :
+ if (op.iplo_size != sizeof(node))
+ return EINVAL;
+
+ err = COPYIN(op.iplo_struct, &node, sizeof(node));
+ if (err != 0)
+ return EFAULT;
+
+ p = ip_pool_find(op.iplo_unit, op.iplo_name);
+ if (p == NULL)
+ return ESRCH;
+
+ /*
+ * add an entry to a pool - return an error if it already
+ * exists remove an entry from a pool - if it exists
+ * - in both cases, the pool *must* exist!
+ */
+ m = ip_pool_findeq(p, &node.ipn_addr, &node.ipn_mask);
+ if (m)
+ return EEXIST;
+ err = ip_pool_insert(p, &node.ipn_addr.adf_addr,
+ &node.ipn_mask.adf_addr, node.ipn_info);
+ break;
+
+ case IPLT_HASH :
+ if (op.iplo_size != sizeof(hte))
+ return EINVAL;
+
+ err = COPYIN(op.iplo_struct, &hte, sizeof(hte));
+ if (err != 0)
+ return EFAULT;
+
+ iph = fr_findhtable(op.iplo_unit, op.iplo_name);
+ if (iph == NULL)
+ return ESRCH;
+ err = fr_addhtent(iph, &hte);
+ break;
+
+ default :
+ err = EINVAL;
+ break;
+ }
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: iplookup_delnode */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - pointer to data from ioctl call */
+/* */
+/* Delete a node from a lookup table by first looking for the table it is */
+/* in and then deleting the entry that gets found. */
+/* ------------------------------------------------------------------------ */
+static int iplookup_delnode(data)
+caddr_t data;
+{
+ ip_pool_node_t node, *m;
+ iplookupop_t op;
+ iphtable_t *iph;
+ iphtent_t hte;
+ ip_pool_t *p;
+ int err;
+
+ err = 0;
+ BCOPYIN(data, &op, sizeof(op));
+
+ if (op.iplo_unit < 0 || op.iplo_unit > IPL_LOGMAX)
+ return EINVAL;
+
+ op.iplo_name[sizeof(op.iplo_name) - 1] = '\0';
+
+ switch (op.iplo_type)
+ {
+ case IPLT_POOL :
+ if (op.iplo_size != sizeof(node))
+ return EINVAL;
+
+ err = COPYIN(op.iplo_struct, &node, sizeof(node));
+ if (err != 0)
+ return EFAULT;
+
+ p = ip_pool_find(op.iplo_unit, op.iplo_name);
+ if (!p)
+ return ESRCH;
+
+ m = ip_pool_findeq(p, &node.ipn_addr, &node.ipn_mask);
+ if (m == NULL)
+ return ENOENT;
+ err = ip_pool_remove(p, m);
+ break;
+
+ case IPLT_HASH :
+ if (op.iplo_size != sizeof(hte))
+ return EINVAL;
+
+ err = COPYIN(op.iplo_struct, &hte, sizeof(hte));
+ if (err != 0)
+ return EFAULT;
+
+ iph = fr_findhtable(op.iplo_unit, op.iplo_name);
+ if (iph == NULL)
+ return ESRCH;
+ err = fr_delhtent(iph, &hte);
+ break;
+
+ default :
+ err = EINVAL;
+ break;
+ }
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: iplookup_addtable */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - pointer to data from ioctl call */
+/* */
+/* Create a new lookup table, if one doesn't already exist using the name */
+/* for this one. */
+/* ------------------------------------------------------------------------ */
+static int iplookup_addtable(data)
+caddr_t data;
+{
+ iplookupop_t op;
+ int err;
+
+ err = BCOPYIN(data, &op, sizeof(op));
+ if (err != 0)
+ return EFAULT;
+
+ if (op.iplo_unit < 0 || op.iplo_unit > IPL_LOGMAX)
+ return EINVAL;
+
+ op.iplo_name[sizeof(op.iplo_name) - 1] = '\0';
+
+ switch (op.iplo_type)
+ {
+ case IPLT_POOL :
+ if (ip_pool_find(op.iplo_unit, op.iplo_name) != NULL)
+ err = EEXIST;
+ else
+ err = ip_pool_create(&op);
+ break;
+
+ case IPLT_HASH :
+ if (fr_findhtable(op.iplo_unit, op.iplo_name) != NULL)
+ err = EEXIST;
+ else
+ err = fr_newhtable(&op);
+ break;
+
+ default :
+ err = EINVAL;
+ break;
+ }
+
+ /*
+ * For anonymous pools, copy back the operation struct because in the
+ * case of success it will contain the new table's name.
+ */
+ if ((err == 0) && ((op.iplo_arg & LOOKUP_ANON) != 0)) {
+ err = BCOPYOUT(&op, data, sizeof(op));
+ if (err != 0)
+ err = EFAULT;
+ }
+
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: iplookup_deltable */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - pointer to data from ioctl call */
+/* */
+/* Decodes ioctl request to remove a particular hash table or pool and */
+/* calls the relevant function to do the cleanup. */
+/* ------------------------------------------------------------------------ */
+static int iplookup_deltable(data)
+caddr_t data;
+{
+ iplookupop_t op;
+ int err;
+
+ err = BCOPYIN(data, &op, sizeof(op));
+ if (err != 0)
+ return EFAULT;
+
+ if (op.iplo_unit < 0 || op.iplo_unit > IPL_LOGMAX)
+ return EINVAL;
+
+ op.iplo_name[sizeof(op.iplo_name) - 1] = '\0';
+
+ /*
+ * create a new pool - fail if one already exists with
+ * the same #
+ */
+ switch (op.iplo_type)
+ {
+ case IPLT_POOL :
+ err = ip_pool_destroy(op.iplo_unit, op.iplo_name);
+ break;
+
+ case IPLT_HASH :
+ err = fr_removehtable(op.iplo_unit, op.iplo_name);
+ break;
+
+ default :
+ err = EINVAL;
+ break;
+ }
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: iplookup_stats */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - pointer to data from ioctl call */
+/* */
+/* Copy statistical information from inside the kernel back to user space. */
+/* ------------------------------------------------------------------------ */
+static int iplookup_stats(data)
+caddr_t data;
+{
+ iplookupop_t op;
+ int err;
+
+ err = BCOPYIN(data, &op, sizeof(op));
+ if (err != 0)
+ return EFAULT;
+
+ if (op.iplo_unit < 0 || op.iplo_unit > IPL_LOGMAX)
+ return EINVAL;
+
+ switch (op.iplo_type)
+ {
+ case IPLT_POOL :
+ err = ip_pool_statistics(&op);
+ break;
+
+ case IPLT_HASH :
+ err = fr_gethtablestat(&op);
+ break;
+
+ default :
+ err = EINVAL;
+ break;
+ }
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: iplookup_flush */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - pointer to data from ioctl call */
+/* */
+/* A flush is called when we want to flush all the nodes from a particular */
+/* entry in the hash table/pool or want to remove all groups from those. */
+/* ------------------------------------------------------------------------ */
+static int iplookup_flush(data)
+caddr_t data;
+{
+ int err, unit, num, type;
+ iplookupflush_t flush;
+
+ err = BCOPYIN(data, &flush, sizeof(flush));
+ if (err != 0)
+ return EFAULT;
+
+ unit = flush.iplf_unit;
+ if ((unit < 0 || unit > IPL_LOGMAX) && (unit != IPLT_ALL))
+ return EINVAL;
+
+ flush.iplf_name[sizeof(flush.iplf_name) - 1] = '\0';
+
+ type = flush.iplf_type;
+ err = EINVAL;
+ num = 0;
+
+ if (type == IPLT_POOL || type == IPLT_ALL) {
+ err = 0;
+ num = ip_pool_flush(&flush);
+ }
+
+ if (type == IPLT_HASH || type == IPLT_ALL) {
+ err = 0;
+ num += fr_flushhtable(&flush);
+ }
+
+ if (err == 0) {
+ flush.iplf_count = num;
+ err = BCOPYOUT(&flush, data, sizeof(flush));
+ if (err != 0)
+ err = EFAULT;
+ }
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_lookup_delref */
+/* Returns: void */
+/* Parameters: type(I) - table type to operate on */
+/* ptr(I) - pointer to object to remove reference for */
+/* */
+/* This function organises calling the correct deref function for a given */
+/* type of object being passed into it. */
+/* ------------------------------------------------------------------------ */
+void ip_lookup_deref(type, ptr)
+int type;
+void *ptr;
+{
+ if (ptr == NULL)
+ return;
+
+ WRITE_ENTER(&ip_poolrw);
+ switch (type)
+ {
+ case IPLT_POOL :
+ ip_pool_deref(ptr);
+ break;
+
+ case IPLT_HASH :
+ fr_derefhtable(ptr);
+ break;
+ }
+ RWLOCK_EXIT(&ip_poolrw);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_lookup_iterate */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - pointer to data from ioctl call */
+/* */
+/* Decodes ioctl request to step through either hash tables or pools. */
+/* ------------------------------------------------------------------------ */
+int ip_lookup_iterate(data, uid, ctx)
+void *data;
+int uid;
+void *ctx;
+{
+ ipflookupiter_t iter;
+ ipftoken_t *token;
+ int err;
+ SPL_INT(s);
+
+ err = fr_inobj(data, &iter, IPFOBJ_LOOKUPITER);
+ if (err != 0)
+ return err;
+
+ if (iter.ili_unit < 0 || iter.ili_unit > IPL_LOGMAX)
+ return EINVAL;
+
+ if (iter.ili_ival != IPFGENITER_LOOKUP)
+ return EINVAL;
+
+ SPL_SCHED(s);
+ token = ipf_findtoken(iter.ili_key, uid, ctx);
+ if (token == NULL) {
+ RWLOCK_EXIT(&ipf_tokens);
+ SPL_X(s);
+ return ESRCH;
+ }
+
+ switch (iter.ili_type)
+ {
+ case IPLT_POOL :
+ err = ip_pool_getnext(token, &iter);
+ break;
+ case IPLT_HASH :
+ err = fr_htable_getnext(token, &iter);
+ break;
+ default :
+ err = EINVAL;
+ break;
+ }
+ RWLOCK_EXIT(&ipf_tokens);
+ SPL_X(s);
+
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: iplookup_iterderef */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - pointer to data from ioctl call */
+/* */
+/* Decodes ioctl request to remove a particular hash table or pool and */
+/* calls the relevant function to do the cleanup. */
+/* ------------------------------------------------------------------------ */
+void ip_lookup_iterderef(type, data)
+u_32_t type;
+void *data;
+{
+ iplookupiterkey_t key;
+
+ key.ilik_key = type;
+
+ if (key.ilik_unstr.ilik_ival != IPFGENITER_LOOKUP)
+ return;
+
+ switch (key.ilik_unstr.ilik_type)
+ {
+ case IPLT_HASH :
+ fr_htable_iterderef((u_int)key.ilik_unstr.ilik_otype,
+ (int)key.ilik_unstr.ilik_unit, data);
+ break;
+ case IPLT_POOL :
+ ip_pool_iterderef((u_int)key.ilik_unstr.ilik_otype,
+ (int)key.ilik_unstr.ilik_unit, data);
+ break;
+ }
+}
+
+
+
+#else /* IPFILTER_LOOKUP */
+
+/*ARGSUSED*/
+int ip_lookup_ioctl(data, cmd, mode, uid, ctx)
+caddr_t data;
+ioctlcmd_t cmd;
+int mode, uid;
+void *ctx;
+{
+ return EIO;
+}
+#endif /* IPFILTER_LOOKUP */
diff --git a/sys/contrib/ipfilter/netinet/ip_lookup.h b/sys/contrib/ipfilter/netinet/ip_lookup.h
new file mode 100644
index 0000000..4b90655
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_lookup.h
@@ -0,0 +1,96 @@
+
+#ifndef __IP_LOOKUP_H__
+#define __IP_LOOKUP_H__
+
+#if defined(__STDC__) || defined(__GNUC__) || defined(_AIX51)
+# define SIOCLOOKUPADDTABLE _IOWR('r', 60, struct iplookupop)
+# define SIOCLOOKUPDELTABLE _IOWR('r', 61, struct iplookupop)
+# define SIOCLOOKUPSTAT _IOWR('r', 64, struct iplookupop)
+# define SIOCLOOKUPSTATW _IOW('r', 64, struct iplookupop)
+# define SIOCLOOKUPFLUSH _IOWR('r', 65, struct iplookupflush)
+# define SIOCLOOKUPADDNODE _IOWR('r', 67, struct iplookupop)
+# define SIOCLOOKUPADDNODEW _IOW('r', 67, struct iplookupop)
+# define SIOCLOOKUPDELNODE _IOWR('r', 68, struct iplookupop)
+# define SIOCLOOKUPDELNODEW _IOW('r', 68, struct iplookupop)
+#else
+# define SIOCLOOKUPADDTABLE _IOWR(r, 60, struct iplookupop)
+# define SIOCLOOKUPDELTABLE _IOWR(r, 61, struct iplookupop)
+# define SIOCLOOKUPSTAT _IOWR(r, 64, struct iplookupop)
+# define SIOCLOOKUPSTATW _IOW(r, 64, struct iplookupop)
+# define SIOCLOOKUPFLUSH _IOWR(r, 65, struct iplookupflush)
+# define SIOCLOOKUPADDNODE _IOWR(r, 67, struct iplookupop)
+# define SIOCLOOKUPADDNODEW _IOW(r, 67, struct iplookupop)
+# define SIOCLOOKUPDELNODE _IOWR(r, 68, struct iplookupop)
+# define SIOCLOOKUPDELNODEW _IOW(r, 68, struct iplookupop)
+#endif
+
+typedef struct iplookupop {
+ int iplo_type; /* IPLT_* */
+ int iplo_unit; /* IPL_LOG* */
+ u_int iplo_arg;
+ char iplo_name[FR_GROUPLEN];
+ size_t iplo_size; /* sizeof struct at iplo_struct */
+ void *iplo_struct;
+} iplookupop_t;
+
+#define LOOKUP_ANON 0x80000000
+
+
+typedef struct iplookupflush {
+ int iplf_type; /* IPLT_* */
+ int iplf_unit; /* IPL_LOG* */
+ u_int iplf_arg;
+ size_t iplf_count;
+ char iplf_name[FR_GROUPLEN];
+} iplookupflush_t;
+
+typedef struct iplookuplink {
+ int ipll_type; /* IPLT_* */
+ int ipll_unit; /* IPL_LOG* */
+ u_int ipll_num;
+ char ipll_group[FR_GROUPLEN];
+} iplookuplink_t;
+
+#define IPLT_ALL -1
+#define IPLT_NONE 0
+#define IPLT_POOL 1
+#define IPLT_HASH 2
+
+#define IPLT_ANON 0x80000000
+
+
+typedef union {
+ struct iplookupiterkey {
+ char ilik_ival;
+ u_char ilik_type; /* IPLT_* */
+ u_char ilik_otype;
+ char ilik_unit; /* IPL_LOG* */
+ } ilik_unstr;
+ u_32_t ilik_key;
+} iplookupiterkey_t;
+
+typedef struct ipflookupiter {
+ int ili_nitems;
+ iplookupiterkey_t ili_lkey;
+ char ili_name[FR_GROUPLEN];
+ void *ili_data;
+} ipflookupiter_t;
+
+#define ili_key ili_lkey.ilik_key
+#define ili_ival ili_lkey.ilik_unstr.ilik_ival
+#define ili_unit ili_lkey.ilik_unstr.ilik_unit
+#define ili_type ili_lkey.ilik_unstr.ilik_type
+#define ili_otype ili_lkey.ilik_unstr.ilik_otype
+
+#define IPFLOOKUPITER_LIST 0
+#define IPFLOOKUPITER_NODE 1
+
+
+extern int ip_lookup_init __P((void));
+extern int ip_lookup_ioctl __P((caddr_t, ioctlcmd_t, int, int, void *));
+extern void ip_lookup_unload __P((void));
+extern void ip_lookup_deref __P((int, void *));
+extern int ip_lookup_iterate __P((void *, int, void *));
+extern void ip_lookup_iterderef __P((u_32_t, void *));
+
+#endif /* __IP_LOOKUP_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_nat.c b/sys/contrib/ipfilter/netinet/ip_nat.c
new file mode 100644
index 0000000..a6a77dc
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_nat.c
@@ -0,0 +1,5340 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1995-2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#if defined(_KERNEL) && defined(__NetBSD_Version__) && \
+ (__NetBSD_Version__ >= 399002000)
+# include <sys/kauth.h>
+#endif
+#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \
+ defined(_KERNEL)
+#if defined(__NetBSD_Version__) && (__NetBSD_Version__ < 399001400)
+# include "opt_ipfilter_log.h"
+# else
+# include "opt_ipfilter.h"
+# endif
+#endif
+#if !defined(_KERNEL)
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+# define _KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+#endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 220000)
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+#else
+# include <sys/ioctl.h>
+#endif
+#if !defined(AIX)
+# include <sys/fcntl.h>
+#endif
+#if !defined(linux)
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if defined(_KERNEL)
+# include <sys/systm.h>
+# if !defined(__SVR4) && !defined(__svr4__)
+# include <sys/mbuf.h>
+# endif
+#endif
+#if defined(__SVR4) || defined(__svr4__)
+# include <sys/filio.h>
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+#if __FreeBSD_version >= 300000
+# include <sys/queue.h>
+#endif
+#include <net/if.h>
+#if __FreeBSD_version >= 300000
+# include <net/if_var.h>
+# if defined(_KERNEL) && !defined(IPFILTER_LKM)
+# include "opt_ipfilter.h"
+# endif
+#endif
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+
+#ifdef RFC1825
+# include <vpn/md5.h>
+# include <vpn/ipsec.h>
+extern struct ifnet vpnif;
+#endif
+
+#if !defined(linux)
+# include <netinet/ip_var.h>
+#endif
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_proxy.h"
+#ifdef IPFILTER_SYNC
+#include "netinet/ip_sync.h"
+#endif
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+#endif
+/* END OF INCLUDES */
+
+#undef SOCKADDR_IN
+#define SOCKADDR_IN struct sockaddr_in
+
+#if !defined(lint)
+static const char sccsid[] = "@(#)ip_nat.c 1.11 6/5/96 (C) 1995 Darren Reed";
+static const char rcsid[] = "@(#)$FreeBSD$";
+/* static const char rcsid[] = "@(#)$Id: ip_nat.c,v 2.195.2.56 2006/04/01 10:15:34 darrenr Exp $";*/
+#endif
+
+
+/* ======================================================================== */
+/* How the NAT is organised and works. */
+/* */
+/* Inside (interface y) NAT Outside (interface x) */
+/* -------------------- -+- ------------------------------------- */
+/* Packet going | out, processsed by fr_checknatout() for x */
+/* ------------> | ------------> */
+/* src=10.1.1.1 | src=192.1.1.1 */
+/* | */
+/* | in, processed by fr_checknatin() for x */
+/* <------------ | <------------ */
+/* dst=10.1.1.1 | dst=192.1.1.1 */
+/* -------------------- -+- ------------------------------------- */
+/* fr_checknatout() - changes ip_src and if required, sport */
+/* - creates a new mapping, if required. */
+/* fr_checknatin() - changes ip_dst and if required, dport */
+/* */
+/* In the NAT table, internal source is recorded as "in" and externally */
+/* seen as "out". */
+/* ======================================================================== */
+
+
+nat_t **nat_table[2] = { NULL, NULL },
+ *nat_instances = NULL;
+ipnat_t *nat_list = NULL;
+u_int ipf_nattable_max = NAT_TABLE_MAX;
+u_int ipf_nattable_sz = NAT_TABLE_SZ;
+u_int ipf_natrules_sz = NAT_SIZE;
+u_int ipf_rdrrules_sz = RDR_SIZE;
+u_int ipf_hostmap_sz = HOSTMAP_SIZE;
+u_int fr_nat_maxbucket = 0,
+ fr_nat_maxbucket_reset = 1;
+u_32_t nat_masks = 0;
+u_32_t rdr_masks = 0;
+u_long nat_last_force_flush = 0;
+ipnat_t **nat_rules = NULL;
+ipnat_t **rdr_rules = NULL;
+hostmap_t **ipf_hm_maptable = NULL;
+hostmap_t *ipf_hm_maplist = NULL;
+ipftq_t nat_tqb[IPF_TCP_NSTATES];
+ipftq_t nat_udptq;
+ipftq_t nat_icmptq;
+ipftq_t nat_iptq;
+ipftq_t *nat_utqe = NULL;
+int fr_nat_doflush = 0;
+#ifdef IPFILTER_LOG
+int nat_logging = 1;
+#else
+int nat_logging = 0;
+#endif
+
+u_long fr_defnatage = DEF_NAT_AGE,
+ fr_defnatipage = 120, /* 60 seconds */
+ fr_defnaticmpage = 6; /* 3 seconds */
+natstat_t nat_stats;
+int fr_nat_lock = 0;
+int fr_nat_init = 0;
+#if SOLARIS
+extern int pfil_delayed_copy;
+#endif
+
+static int nat_flush_entry __P((void *));
+static int nat_flushtable __P((void));
+static int nat_clearlist __P((void));
+static void nat_addnat __P((struct ipnat *));
+static void nat_addrdr __P((struct ipnat *));
+static void nat_delete __P((struct nat *, int));
+static void nat_delrdr __P((struct ipnat *));
+static void nat_delnat __P((struct ipnat *));
+static int fr_natgetent __P((caddr_t));
+static int fr_natgetsz __P((caddr_t));
+static int fr_natputent __P((caddr_t, int));
+static int nat_extraflush __P((int));
+static void nat_tabmove __P((nat_t *));
+static int nat_match __P((fr_info_t *, ipnat_t *));
+static INLINE int nat_newmap __P((fr_info_t *, nat_t *, natinfo_t *));
+static INLINE int nat_newrdr __P((fr_info_t *, nat_t *, natinfo_t *));
+static hostmap_t *nat_hostmap __P((ipnat_t *, struct in_addr,
+ struct in_addr, struct in_addr, u_32_t));
+static int nat_icmpquerytype4 __P((int));
+static int nat_siocaddnat __P((ipnat_t *, ipnat_t **, int));
+static void nat_siocdelnat __P((ipnat_t *, ipnat_t **, int));
+static int nat_finalise __P((fr_info_t *, nat_t *, natinfo_t *,
+ tcphdr_t *, nat_t **, int));
+static int nat_resolverule __P((ipnat_t *));
+static nat_t *fr_natclone __P((fr_info_t *, nat_t *));
+static void nat_mssclamp __P((tcphdr_t *, u_32_t, fr_info_t *, u_short *));
+static int nat_wildok __P((nat_t *, int, int, int, int));
+static int nat_getnext __P((ipftoken_t *, ipfgeniter_t *));
+static int nat_iterator __P((ipftoken_t *, ipfgeniter_t *));
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natinit */
+/* Returns: int - 0 == success, -1 == failure */
+/* Parameters: Nil */
+/* */
+/* Initialise all of the NAT locks, tables and other structures. */
+/* ------------------------------------------------------------------------ */
+int fr_natinit()
+{
+ int i;
+
+ KMALLOCS(nat_table[0], nat_t **, sizeof(nat_t *) * ipf_nattable_sz);
+ if (nat_table[0] != NULL)
+ bzero((char *)nat_table[0], ipf_nattable_sz * sizeof(nat_t *));
+ else
+ return -1;
+
+ KMALLOCS(nat_table[1], nat_t **, sizeof(nat_t *) * ipf_nattable_sz);
+ if (nat_table[1] != NULL)
+ bzero((char *)nat_table[1], ipf_nattable_sz * sizeof(nat_t *));
+ else
+ return -2;
+
+ KMALLOCS(nat_rules, ipnat_t **, sizeof(ipnat_t *) * ipf_natrules_sz);
+ if (nat_rules != NULL)
+ bzero((char *)nat_rules, ipf_natrules_sz * sizeof(ipnat_t *));
+ else
+ return -3;
+
+ KMALLOCS(rdr_rules, ipnat_t **, sizeof(ipnat_t *) * ipf_rdrrules_sz);
+ if (rdr_rules != NULL)
+ bzero((char *)rdr_rules, ipf_rdrrules_sz * sizeof(ipnat_t *));
+ else
+ return -4;
+
+ KMALLOCS(ipf_hm_maptable, hostmap_t **, \
+ sizeof(hostmap_t *) * ipf_hostmap_sz);
+ if (ipf_hm_maptable != NULL)
+ bzero((char *)ipf_hm_maptable,
+ sizeof(hostmap_t *) * ipf_hostmap_sz);
+ else
+ return -5;
+ ipf_hm_maplist = NULL;
+
+ KMALLOCS(nat_stats.ns_bucketlen[0], u_long *,
+ ipf_nattable_sz * sizeof(u_long));
+ if (nat_stats.ns_bucketlen[0] == NULL)
+ return -6;
+ bzero((char *)nat_stats.ns_bucketlen[0],
+ ipf_nattable_sz * sizeof(u_long));
+
+ KMALLOCS(nat_stats.ns_bucketlen[1], u_long *,
+ ipf_nattable_sz * sizeof(u_long));
+ if (nat_stats.ns_bucketlen[1] == NULL)
+ return -7;
+
+ bzero((char *)nat_stats.ns_bucketlen[1],
+ ipf_nattable_sz * sizeof(u_long));
+
+ if (fr_nat_maxbucket == 0) {
+ for (i = ipf_nattable_sz; i > 0; i >>= 1)
+ fr_nat_maxbucket++;
+ fr_nat_maxbucket *= 2;
+ }
+
+ fr_sttab_init(nat_tqb);
+ /*
+ * Increase this because we may have "keep state" following this too
+ * and packet storms can occur if this is removed too quickly.
+ */
+ nat_tqb[IPF_TCPS_CLOSED].ifq_ttl = fr_tcplastack;
+ nat_tqb[IPF_TCP_NSTATES - 1].ifq_next = &nat_udptq;
+ nat_udptq.ifq_ttl = fr_defnatage;
+ nat_udptq.ifq_ref = 1;
+ nat_udptq.ifq_head = NULL;
+ nat_udptq.ifq_tail = &nat_udptq.ifq_head;
+ MUTEX_INIT(&nat_udptq.ifq_lock, "nat ipftq udp tab");
+ nat_udptq.ifq_next = &nat_icmptq;
+ nat_icmptq.ifq_ttl = fr_defnaticmpage;
+ nat_icmptq.ifq_ref = 1;
+ nat_icmptq.ifq_head = NULL;
+ nat_icmptq.ifq_tail = &nat_icmptq.ifq_head;
+ MUTEX_INIT(&nat_icmptq.ifq_lock, "nat icmp ipftq tab");
+ nat_icmptq.ifq_next = &nat_iptq;
+ nat_iptq.ifq_ttl = fr_defnatipage;
+ nat_iptq.ifq_ref = 1;
+ nat_iptq.ifq_head = NULL;
+ nat_iptq.ifq_tail = &nat_iptq.ifq_head;
+ MUTEX_INIT(&nat_iptq.ifq_lock, "nat ip ipftq tab");
+ nat_iptq.ifq_next = NULL;
+
+ for (i = 0; i < IPF_TCP_NSTATES; i++) {
+ if (nat_tqb[i].ifq_ttl < fr_defnaticmpage)
+ nat_tqb[i].ifq_ttl = fr_defnaticmpage;
+#ifdef LARGE_NAT
+ else if (nat_tqb[i].ifq_ttl > fr_defnatage)
+ nat_tqb[i].ifq_ttl = fr_defnatage;
+#endif
+ }
+
+ /*
+ * Increase this because we may have "keep state" following
+ * this too and packet storms can occur if this is removed
+ * too quickly.
+ */
+ nat_tqb[IPF_TCPS_CLOSED].ifq_ttl = nat_tqb[IPF_TCPS_LAST_ACK].ifq_ttl;
+
+ RWLOCK_INIT(&ipf_nat, "ipf IP NAT rwlock");
+ RWLOCK_INIT(&ipf_natfrag, "ipf IP NAT-Frag rwlock");
+ MUTEX_INIT(&ipf_nat_new, "ipf nat new mutex");
+ MUTEX_INIT(&ipf_natio, "ipf nat io mutex");
+
+ fr_nat_init = 1;
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_addrdr */
+/* Returns: Nil */
+/* Parameters: n(I) - pointer to NAT rule to add */
+/* */
+/* Adds a redirect rule to the hash table of redirect rules and the list of */
+/* loaded NAT rules. Updates the bitmask indicating which netmasks are in */
+/* use by redirect rules. */
+/* ------------------------------------------------------------------------ */
+static void nat_addrdr(n)
+ipnat_t *n;
+{
+ ipnat_t **np;
+ u_32_t j;
+ u_int hv;
+ int k;
+
+ k = count4bits(n->in_outmsk);
+ if ((k >= 0) && (k != 32))
+ rdr_masks |= 1 << k;
+ j = (n->in_outip & n->in_outmsk);
+ hv = NAT_HASH_FN(j, 0, ipf_rdrrules_sz);
+ np = rdr_rules + hv;
+ while (*np != NULL)
+ np = &(*np)->in_rnext;
+ n->in_rnext = NULL;
+ n->in_prnext = np;
+ n->in_hv = hv;
+ *np = n;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_addnat */
+/* Returns: Nil */
+/* Parameters: n(I) - pointer to NAT rule to add */
+/* */
+/* Adds a NAT map rule to the hash table of rules and the list of loaded */
+/* NAT rules. Updates the bitmask indicating which netmasks are in use by */
+/* redirect rules. */
+/* ------------------------------------------------------------------------ */
+static void nat_addnat(n)
+ipnat_t *n;
+{
+ ipnat_t **np;
+ u_32_t j;
+ u_int hv;
+ int k;
+
+ k = count4bits(n->in_inmsk);
+ if ((k >= 0) && (k != 32))
+ nat_masks |= 1 << k;
+ j = (n->in_inip & n->in_inmsk);
+ hv = NAT_HASH_FN(j, 0, ipf_natrules_sz);
+ np = nat_rules + hv;
+ while (*np != NULL)
+ np = &(*np)->in_mnext;
+ n->in_mnext = NULL;
+ n->in_pmnext = np;
+ n->in_hv = hv;
+ *np = n;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_delrdr */
+/* Returns: Nil */
+/* Parameters: n(I) - pointer to NAT rule to delete */
+/* */
+/* Removes a redirect rule from the hash table of redirect rules. */
+/* ------------------------------------------------------------------------ */
+static void nat_delrdr(n)
+ipnat_t *n;
+{
+ if (n->in_rnext)
+ n->in_rnext->in_prnext = n->in_prnext;
+ *n->in_prnext = n->in_rnext;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_delnat */
+/* Returns: Nil */
+/* Parameters: n(I) - pointer to NAT rule to delete */
+/* */
+/* Removes a NAT map rule from the hash table of NAT map rules. */
+/* ------------------------------------------------------------------------ */
+static void nat_delnat(n)
+ipnat_t *n;
+{
+ if (n->in_mnext != NULL)
+ n->in_mnext->in_pmnext = n->in_pmnext;
+ *n->in_pmnext = n->in_mnext;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_hostmap */
+/* Returns: struct hostmap* - NULL if no hostmap could be created, */
+/* else a pointer to the hostmapping to use */
+/* Parameters: np(I) - pointer to NAT rule */
+/* real(I) - real IP address */
+/* map(I) - mapped IP address */
+/* port(I) - destination port number */
+/* Write Locks: ipf_nat */
+/* */
+/* Check if an ip address has already been allocated for a given mapping */
+/* that is not doing port based translation. If is not yet allocated, then */
+/* create a new entry if a non-NULL NAT rule pointer has been supplied. */
+/* ------------------------------------------------------------------------ */
+static struct hostmap *nat_hostmap(np, src, dst, map, port)
+ipnat_t *np;
+struct in_addr src;
+struct in_addr dst;
+struct in_addr map;
+u_32_t port;
+{
+ hostmap_t *hm;
+ u_int hv;
+
+ hv = (src.s_addr ^ dst.s_addr);
+ hv += src.s_addr;
+ hv += dst.s_addr;
+ hv %= HOSTMAP_SIZE;
+ for (hm = ipf_hm_maptable[hv]; hm; hm = hm->hm_next)
+ if ((hm->hm_srcip.s_addr == src.s_addr) &&
+ (hm->hm_dstip.s_addr == dst.s_addr) &&
+ ((np == NULL) || (np == hm->hm_ipnat)) &&
+ ((port == 0) || (port == hm->hm_port))) {
+ hm->hm_ref++;
+ return hm;
+ }
+
+ if (np == NULL)
+ return NULL;
+
+ KMALLOC(hm, hostmap_t *);
+ if (hm) {
+ hm->hm_next = ipf_hm_maplist;
+ hm->hm_pnext = &ipf_hm_maplist;
+ if (ipf_hm_maplist != NULL)
+ ipf_hm_maplist->hm_pnext = &hm->hm_next;
+ ipf_hm_maplist = hm;
+ hm->hm_hnext = ipf_hm_maptable[hv];
+ hm->hm_phnext = ipf_hm_maptable + hv;
+ if (ipf_hm_maptable[hv] != NULL)
+ ipf_hm_maptable[hv]->hm_phnext = &hm->hm_hnext;
+ ipf_hm_maptable[hv] = hm;
+ hm->hm_ipnat = np;
+ hm->hm_srcip = src;
+ hm->hm_dstip = dst;
+ hm->hm_mapip = map;
+ hm->hm_ref = 1;
+ hm->hm_port = port;
+ }
+ return hm;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_hostmapdel */
+/* Returns: Nil */
+/* Parameters: hmp(I) - pointer to hostmap structure pointer */
+/* Write Locks: ipf_nat */
+/* */
+/* Decrement the references to this hostmap structure by one. If this */
+/* reaches zero then remove it and free it. */
+/* ------------------------------------------------------------------------ */
+void fr_hostmapdel(hmp)
+struct hostmap **hmp;
+{
+ struct hostmap *hm;
+
+ hm = *hmp;
+ *hmp = NULL;
+
+ hm->hm_ref--;
+ if (hm->hm_ref == 0) {
+ if (hm->hm_hnext)
+ hm->hm_hnext->hm_phnext = hm->hm_phnext;
+ *hm->hm_phnext = hm->hm_hnext;
+ if (hm->hm_next)
+ hm->hm_next->hm_pnext = hm->hm_pnext;
+ *hm->hm_pnext = hm->hm_next;
+ KFREE(hm);
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fix_outcksum */
+/* Returns: Nil */
+/* Parameters: fin(I) - pointer to packet information */
+/* sp(I) - location of 16bit checksum to update */
+/* n((I) - amount to adjust checksum by */
+/* */
+/* Adjusts the 16bit checksum by "n" for packets going out. */
+/* ------------------------------------------------------------------------ */
+void fix_outcksum(fin, sp, n)
+fr_info_t *fin;
+u_short *sp;
+u_32_t n;
+{
+ u_short sumshort;
+ u_32_t sum1;
+
+ if (n == 0)
+ return;
+
+ if (n & NAT_HW_CKSUM) {
+ n &= 0xffff;
+ n += fin->fin_dlen;
+ n = (n & 0xffff) + (n >> 16);
+ *sp = n & 0xffff;
+ return;
+ }
+ sum1 = (~ntohs(*sp)) & 0xffff;
+ sum1 += (n);
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ /* Again */
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ sumshort = ~(u_short)sum1;
+ *(sp) = htons(sumshort);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fix_incksum */
+/* Returns: Nil */
+/* Parameters: fin(I) - pointer to packet information */
+/* sp(I) - location of 16bit checksum to update */
+/* n((I) - amount to adjust checksum by */
+/* */
+/* Adjusts the 16bit checksum by "n" for packets going in. */
+/* ------------------------------------------------------------------------ */
+void fix_incksum(fin, sp, n)
+fr_info_t *fin;
+u_short *sp;
+u_32_t n;
+{
+ u_short sumshort;
+ u_32_t sum1;
+
+ if (n == 0)
+ return;
+
+ if (n & NAT_HW_CKSUM) {
+ n &= 0xffff;
+ n += fin->fin_dlen;
+ n = (n & 0xffff) + (n >> 16);
+ *sp = n & 0xffff;
+ return;
+ }
+ sum1 = (~ntohs(*sp)) & 0xffff;
+ sum1 += ~(n) & 0xffff;
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ /* Again */
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ sumshort = ~(u_short)sum1;
+ *(sp) = htons(sumshort);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fix_datacksum */
+/* Returns: Nil */
+/* Parameters: sp(I) - location of 16bit checksum to update */
+/* n((I) - amount to adjust checksum by */
+/* */
+/* Fix_datacksum is used *only* for the adjustments of checksums in the */
+/* data section of an IP packet. */
+/* */
+/* The only situation in which you need to do this is when NAT'ing an */
+/* ICMP error message. Such a message, contains in its body the IP header */
+/* of the original IP packet, that causes the error. */
+/* */
+/* You can't use fix_incksum or fix_outcksum in that case, because for the */
+/* kernel the data section of the ICMP error is just data, and no special */
+/* processing like hardware cksum or ntohs processing have been done by the */
+/* kernel on the data section. */
+/* ------------------------------------------------------------------------ */
+void fix_datacksum(sp, n)
+u_short *sp;
+u_32_t n;
+{
+ u_short sumshort;
+ u_32_t sum1;
+
+ if (n == 0)
+ return;
+
+ sum1 = (~ntohs(*sp)) & 0xffff;
+ sum1 += (n);
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ /* Again */
+ sum1 = (sum1 >> 16) + (sum1 & 0xffff);
+ sumshort = ~(u_short)sum1;
+ *(sp) = htons(sumshort);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_nat_ioctl */
+/* Returns: int - 0 == success, != 0 == failure */
+/* Parameters: data(I) - pointer to ioctl data */
+/* cmd(I) - ioctl command integer */
+/* mode(I) - file mode bits used with open */
+/* */
+/* Processes an ioctl call made to operate on the IP Filter NAT device. */
+/* ------------------------------------------------------------------------ */
+int fr_nat_ioctl(data, cmd, mode, uid, ctx)
+ioctlcmd_t cmd;
+caddr_t data;
+int mode, uid;
+void *ctx;
+{
+ ipnat_t *nat, *nt, *n = NULL, **np = NULL;
+ int error = 0, ret, arg, getlock;
+ ipnat_t natd;
+ SPL_INT(s);
+
+#if (BSD >= 199306) && defined(_KERNEL)
+# if defined(__NetBSD_Version__) && (__NetBSD_Version__ >= 399002000)
+ if ((mode & FWRITE) &&
+ kauth_authorize_network(curlwp->l_cred, KAUTH_NETWORK_FIREWALL,
+ KAUTH_REQ_NETWORK_FIREWALL_FW,
+ NULL, NULL, NULL)) {
+ return EPERM;
+ }
+# else
+ if ((securelevel >= 3) && (mode & FWRITE)) {
+ return EPERM;
+ }
+# endif
+#endif
+
+#if defined(__osf__) && defined(_KERNEL)
+ getlock = 0;
+#else
+ getlock = (mode & NAT_LOCKHELD) ? 0 : 1;
+#endif
+
+ nat = NULL; /* XXX gcc -Wuninitialized */
+ if (cmd == (ioctlcmd_t)SIOCADNAT) {
+ KMALLOC(nt, ipnat_t *);
+ } else {
+ nt = NULL;
+ }
+
+ if ((cmd == (ioctlcmd_t)SIOCADNAT) || (cmd == (ioctlcmd_t)SIOCRMNAT)) {
+ if (mode & NAT_SYSSPACE) {
+ bcopy(data, (char *)&natd, sizeof(natd));
+ error = 0;
+ } else {
+ error = fr_inobj(data, &natd, IPFOBJ_IPNAT);
+ }
+ }
+
+ if (error != 0)
+ goto done;
+
+ /*
+ * For add/delete, look to see if the NAT entry is already present
+ */
+ if ((cmd == (ioctlcmd_t)SIOCADNAT) || (cmd == (ioctlcmd_t)SIOCRMNAT)) {
+ nat = &natd;
+ if (nat->in_v == 0) /* For backward compat. */
+ nat->in_v = 4;
+ nat->in_flags &= IPN_USERFLAGS;
+ if ((nat->in_redir & NAT_MAPBLK) == 0) {
+ if ((nat->in_flags & IPN_SPLIT) == 0)
+ nat->in_inip &= nat->in_inmsk;
+ if ((nat->in_flags & IPN_IPRANGE) == 0)
+ nat->in_outip &= nat->in_outmsk;
+ }
+ MUTEX_ENTER(&ipf_natio);
+ for (np = &nat_list; ((n = *np) != NULL); np = &n->in_next)
+ if (bcmp((char *)&nat->in_flags, (char *)&n->in_flags,
+ IPN_CMPSIZ) == 0) {
+ if (nat->in_redir == NAT_REDIRECT &&
+ nat->in_pnext != n->in_pnext)
+ continue;
+ break;
+ }
+ }
+
+ switch (cmd)
+ {
+#ifdef IPFILTER_LOG
+ case SIOCIPFFB :
+ {
+ int tmp;
+
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ tmp = ipflog_clear(IPL_LOGNAT);
+ error = BCOPYOUT((char *)&tmp, (char *)data,
+ sizeof(tmp));
+ if (error != 0)
+ error = EFAULT;
+ }
+ break;
+ }
+
+ case SIOCSETLG :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ error = BCOPYIN((char *)data, (char *)&nat_logging,
+ sizeof(nat_logging));
+ if (error != 0)
+ error = EFAULT;
+ }
+ break;
+
+ case SIOCGETLG :
+ error = BCOPYOUT((char *)&nat_logging, (char *)data,
+ sizeof(nat_logging));
+ if (error != 0)
+ error = EFAULT;
+ break;
+
+ case FIONREAD :
+ arg = iplused[IPL_LOGNAT];
+ error = BCOPYOUT(&arg, data, sizeof(arg));
+ if (error != 0)
+ error = EFAULT;
+ break;
+#endif
+ case SIOCADNAT :
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ } else if (n != NULL) {
+ error = EEXIST;
+ } else if (nt == NULL) {
+ error = ENOMEM;
+ }
+ if (error != 0) {
+ MUTEX_EXIT(&ipf_natio);
+ break;
+ }
+ bcopy((char *)nat, (char *)nt, sizeof(*n));
+ error = nat_siocaddnat(nt, np, getlock);
+ MUTEX_EXIT(&ipf_natio);
+ if (error == 0)
+ nt = NULL;
+ break;
+
+ case SIOCRMNAT :
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ n = NULL;
+ } else if (n == NULL) {
+ error = ESRCH;
+ }
+
+ if (error != 0) {
+ MUTEX_EXIT(&ipf_natio);
+ break;
+ }
+ nat_siocdelnat(n, np, getlock);
+
+ MUTEX_EXIT(&ipf_natio);
+ n = NULL;
+ break;
+
+ case SIOCGNATS :
+ nat_stats.ns_table[0] = nat_table[0];
+ nat_stats.ns_table[1] = nat_table[1];
+ nat_stats.ns_list = nat_list;
+ nat_stats.ns_maptable = ipf_hm_maptable;
+ nat_stats.ns_maplist = ipf_hm_maplist;
+ nat_stats.ns_nattab_sz = ipf_nattable_sz;
+ nat_stats.ns_nattab_max = ipf_nattable_max;
+ nat_stats.ns_rultab_sz = ipf_natrules_sz;
+ nat_stats.ns_rdrtab_sz = ipf_rdrrules_sz;
+ nat_stats.ns_hostmap_sz = ipf_hostmap_sz;
+ nat_stats.ns_instances = nat_instances;
+ nat_stats.ns_apslist = ap_sess_list;
+ nat_stats.ns_ticks = fr_ticks;
+ error = fr_outobj(data, &nat_stats, IPFOBJ_NATSTAT);
+ break;
+
+ case SIOCGNATL :
+ {
+ natlookup_t nl;
+
+ if (getlock) {
+ READ_ENTER(&ipf_nat);
+ }
+ error = fr_inobj(data, &nl, IPFOBJ_NATLOOKUP);
+ if (error == 0) {
+ if (nat_lookupredir(&nl) != NULL) {
+ error = fr_outobj(data, &nl, IPFOBJ_NATLOOKUP);
+ } else {
+ error = ESRCH;
+ }
+ }
+ if (getlock) {
+ RWLOCK_EXIT(&ipf_nat);
+ }
+ break;
+ }
+
+ case SIOCIPFFL : /* old SIOCFLNAT & SIOCCNATL */
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ break;
+ }
+ if (getlock) {
+ WRITE_ENTER(&ipf_nat);
+ }
+
+ error = BCOPYIN(data, &arg, sizeof(arg));
+ if (error != 0)
+ error = EFAULT;
+ else {
+ if (arg == 0)
+ ret = nat_flushtable();
+ else if (arg == 1)
+ ret = nat_clearlist();
+ else
+ ret = nat_extraflush(arg);
+ }
+
+ if (getlock) {
+ RWLOCK_EXIT(&ipf_nat);
+ }
+ if (error == 0) {
+ error = BCOPYOUT(&ret, data, sizeof(ret));
+ }
+ break;
+
+ case SIOCPROXY :
+ error = appr_ioctl(data, cmd, mode, ctx);
+ break;
+
+ case SIOCSTLCK :
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ } else {
+ fr_lock(data, &fr_nat_lock);
+ }
+ break;
+
+ case SIOCSTPUT :
+ if ((mode & FWRITE) != 0) {
+ error = fr_natputent(data, getlock);
+ } else {
+ error = EACCES;
+ }
+ break;
+
+ case SIOCSTGSZ :
+ if (fr_nat_lock) {
+ if (getlock) {
+ READ_ENTER(&ipf_nat);
+ }
+ error = fr_natgetsz(data);
+ if (getlock) {
+ RWLOCK_EXIT(&ipf_nat);
+ }
+ } else
+ error = EACCES;
+ break;
+
+ case SIOCSTGET :
+ if (fr_nat_lock) {
+ if (getlock) {
+ READ_ENTER(&ipf_nat);
+ }
+ error = fr_natgetent(data);
+ if (getlock) {
+ RWLOCK_EXIT(&ipf_nat);
+ }
+ } else
+ error = EACCES;
+ break;
+
+ case SIOCGENITER :
+ {
+ ipfgeniter_t iter;
+ ipftoken_t *token;
+
+ SPL_SCHED(s);
+ error = fr_inobj(data, &iter, IPFOBJ_GENITER);
+ if (error == 0) {
+ token = ipf_findtoken(iter.igi_type, uid, ctx);
+ if (token != NULL) {
+ error = nat_iterator(token, &iter);
+ }
+ RWLOCK_EXIT(&ipf_tokens);
+ }
+ SPL_X(s);
+ break;
+ }
+
+ case SIOCIPFDELTOK :
+ error = BCOPYIN((caddr_t)data, (caddr_t)&arg, sizeof(arg));
+ if (error == 0) {
+ SPL_SCHED(s);
+ error = ipf_deltoken(arg, uid, ctx);
+ SPL_X(s);
+ } else {
+ error = EFAULT;
+ }
+ break;
+
+ case SIOCGTQTAB :
+ error = fr_outobj(data, nat_tqb, IPFOBJ_STATETQTAB);
+ break;
+
+ default :
+ error = EINVAL;
+ break;
+ }
+done:
+ if (nt != NULL)
+ KFREE(nt);
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_siocaddnat */
+/* Returns: int - 0 == success, != 0 == failure */
+/* Parameters: n(I) - pointer to new NAT rule */
+/* np(I) - pointer to where to insert new NAT rule */
+/* getlock(I) - flag indicating if lock on ipf_nat is held */
+/* Mutex Locks: ipf_natio */
+/* */
+/* Handle SIOCADNAT. Resolve and calculate details inside the NAT rule */
+/* from information passed to the kernel, then add it to the appropriate */
+/* NAT rule table(s). */
+/* ------------------------------------------------------------------------ */
+static int nat_siocaddnat(n, np, getlock)
+ipnat_t *n, **np;
+int getlock;
+{
+ int error = 0, i, j;
+
+ if (nat_resolverule(n) != 0)
+ return ENOENT;
+
+ if ((n->in_age[0] == 0) && (n->in_age[1] != 0))
+ return EINVAL;
+
+ n->in_use = 0;
+ if (n->in_redir & NAT_MAPBLK)
+ n->in_space = USABLE_PORTS * ~ntohl(n->in_outmsk);
+ else if (n->in_flags & IPN_AUTOPORTMAP)
+ n->in_space = USABLE_PORTS * ~ntohl(n->in_inmsk);
+ else if (n->in_flags & IPN_IPRANGE)
+ n->in_space = ntohl(n->in_outmsk) - ntohl(n->in_outip);
+ else if (n->in_flags & IPN_SPLIT)
+ n->in_space = 2;
+ else if (n->in_outmsk != 0)
+ n->in_space = ~ntohl(n->in_outmsk);
+ else
+ n->in_space = 1;
+
+ /*
+ * Calculate the number of valid IP addresses in the output
+ * mapping range. In all cases, the range is inclusive of
+ * the start and ending IP addresses.
+ * If to a CIDR address, lose 2: broadcast + network address
+ * (so subtract 1)
+ * If to a range, add one.
+ * If to a single IP address, set to 1.
+ */
+ if (n->in_space) {
+ if ((n->in_flags & IPN_IPRANGE) != 0)
+ n->in_space += 1;
+ else
+ n->in_space -= 1;
+ } else
+ n->in_space = 1;
+
+ if ((n->in_outmsk != 0xffffffff) && (n->in_outmsk != 0) &&
+ ((n->in_flags & (IPN_IPRANGE|IPN_SPLIT)) == 0))
+ n->in_nip = ntohl(n->in_outip) + 1;
+ else if ((n->in_flags & IPN_SPLIT) &&
+ (n->in_redir & NAT_REDIRECT))
+ n->in_nip = ntohl(n->in_inip);
+ else
+ n->in_nip = ntohl(n->in_outip);
+ if (n->in_redir & NAT_MAP) {
+ n->in_pnext = ntohs(n->in_pmin);
+ /*
+ * Multiply by the number of ports made available.
+ */
+ if (ntohs(n->in_pmax) >= ntohs(n->in_pmin)) {
+ n->in_space *= (ntohs(n->in_pmax) -
+ ntohs(n->in_pmin) + 1);
+ /*
+ * Because two different sources can map to
+ * different destinations but use the same
+ * local IP#/port #.
+ * If the result is smaller than in_space, then
+ * we may have wrapped around 32bits.
+ */
+ i = n->in_inmsk;
+ if ((i != 0) && (i != 0xffffffff)) {
+ j = n->in_space * (~ntohl(i) + 1);
+ if (j >= n->in_space)
+ n->in_space = j;
+ else
+ n->in_space = 0xffffffff;
+ }
+ }
+ /*
+ * If no protocol is specified, multiple by 256 to allow for
+ * at least one IP:IP mapping per protocol.
+ */
+ if ((n->in_flags & IPN_TCPUDPICMP) == 0) {
+ j = n->in_space * 256;
+ if (j >= n->in_space)
+ n->in_space = j;
+ else
+ n->in_space = 0xffffffff;
+ }
+ }
+
+ /* Otherwise, these fields are preset */
+
+ if (getlock) {
+ WRITE_ENTER(&ipf_nat);
+ }
+ n->in_next = NULL;
+ *np = n;
+
+ if (n->in_age[0] != 0)
+ n->in_tqehead[0] = fr_addtimeoutqueue(&nat_utqe, n->in_age[0]);
+
+ if (n->in_age[1] != 0)
+ n->in_tqehead[1] = fr_addtimeoutqueue(&nat_utqe, n->in_age[1]);
+
+ if (n->in_redir & NAT_REDIRECT) {
+ n->in_flags &= ~IPN_NOTDST;
+ nat_addrdr(n);
+ }
+ if (n->in_redir & (NAT_MAP|NAT_MAPBLK)) {
+ n->in_flags &= ~IPN_NOTSRC;
+ nat_addnat(n);
+ }
+ MUTEX_INIT(&n->in_lock, "ipnat rule lock");
+
+ n = NULL;
+ nat_stats.ns_rules++;
+#if SOLARIS
+ pfil_delayed_copy = 0;
+#endif
+ if (getlock) {
+ RWLOCK_EXIT(&ipf_nat); /* WRITE */
+ }
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_resolvrule */
+/* Returns: Nil */
+/* Parameters: n(I) - pointer to NAT rule */
+/* */
+/* Handle SIOCADNAT. Resolve and calculate details inside the NAT rule */
+/* from information passed to the kernel, then add it to the appropriate */
+/* NAT rule table(s). */
+/* ------------------------------------------------------------------------ */
+static int nat_resolverule(n)
+ipnat_t *n;
+{
+ n->in_ifnames[0][LIFNAMSIZ - 1] = '\0';
+ n->in_ifps[0] = fr_resolvenic(n->in_ifnames[0], 4);
+
+ n->in_ifnames[1][LIFNAMSIZ - 1] = '\0';
+ if (n->in_ifnames[1][0] == '\0') {
+ (void) strncpy(n->in_ifnames[1], n->in_ifnames[0], LIFNAMSIZ);
+ n->in_ifps[1] = n->in_ifps[0];
+ } else {
+ n->in_ifps[1] = fr_resolvenic(n->in_ifnames[1], 4);
+ }
+
+ if (n->in_plabel[0] != '\0') {
+ n->in_apr = appr_lookup(n->in_p, n->in_plabel);
+ if (n->in_apr == NULL)
+ return -1;
+ }
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_siocdelnat */
+/* Returns: int - 0 == success, != 0 == failure */
+/* Parameters: n(I) - pointer to new NAT rule */
+/* np(I) - pointer to where to insert new NAT rule */
+/* getlock(I) - flag indicating if lock on ipf_nat is held */
+/* Mutex Locks: ipf_natio */
+/* */
+/* Handle SIOCADNAT. Resolve and calculate details inside the NAT rule */
+/* from information passed to the kernel, then add it to the appropriate */
+/* NAT rule table(s). */
+/* ------------------------------------------------------------------------ */
+static void nat_siocdelnat(n, np, getlock)
+ipnat_t *n, **np;
+int getlock;
+{
+ if (getlock) {
+ WRITE_ENTER(&ipf_nat);
+ }
+ if (n->in_redir & NAT_REDIRECT)
+ nat_delrdr(n);
+ if (n->in_redir & (NAT_MAPBLK|NAT_MAP))
+ nat_delnat(n);
+ if (nat_list == NULL) {
+ nat_masks = 0;
+ rdr_masks = 0;
+ }
+
+ if (n->in_tqehead[0] != NULL) {
+ if (fr_deletetimeoutqueue(n->in_tqehead[0]) == 0) {
+ fr_freetimeoutqueue(n->in_tqehead[1]);
+ }
+ }
+
+ if (n->in_tqehead[1] != NULL) {
+ if (fr_deletetimeoutqueue(n->in_tqehead[1]) == 0) {
+ fr_freetimeoutqueue(n->in_tqehead[1]);
+ }
+ }
+
+ *np = n->in_next;
+
+ if (n->in_use == 0) {
+ if (n->in_apr)
+ appr_free(n->in_apr);
+ KFREE(n);
+ nat_stats.ns_rules--;
+#if SOLARIS
+ if (nat_stats.ns_rules == 0)
+ pfil_delayed_copy = 1;
+#endif
+ } else {
+ n->in_flags |= IPN_DELETE;
+ n->in_next = NULL;
+ }
+ if (getlock) {
+ RWLOCK_EXIT(&ipf_nat); /* READ/WRITE */
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natgetsz */
+/* Returns: int - 0 == success, != 0 is the error value. */
+/* Parameters: data(I) - pointer to natget structure with kernel pointer */
+/* get the size of. */
+/* */
+/* Handle SIOCSTGSZ. */
+/* Return the size of the nat list entry to be copied back to user space. */
+/* The size of the entry is stored in the ng_sz field and the enture natget */
+/* structure is copied back to the user. */
+/* ------------------------------------------------------------------------ */
+static int fr_natgetsz(data)
+caddr_t data;
+{
+ ap_session_t *aps;
+ nat_t *nat, *n;
+ natget_t ng;
+
+ if (BCOPYIN(data, &ng, sizeof(ng)) != 0)
+ return EFAULT;
+
+ nat = ng.ng_ptr;
+ if (!nat) {
+ nat = nat_instances;
+ ng.ng_sz = 0;
+ /*
+ * Empty list so the size returned is 0. Simple.
+ */
+ if (nat == NULL) {
+ if (BCOPYOUT(&ng, data, sizeof(ng)) != 0)
+ return EFAULT;
+ return 0;
+ }
+ } else {
+ /*
+ * Make sure the pointer we're copying from exists in the
+ * current list of entries. Security precaution to prevent
+ * copying of random kernel data.
+ */
+ for (n = nat_instances; n; n = n->nat_next)
+ if (n == nat)
+ break;
+ if (!n)
+ return ESRCH;
+ }
+
+ /*
+ * Incluse any space required for proxy data structures.
+ */
+ ng.ng_sz = sizeof(nat_save_t);
+ aps = nat->nat_aps;
+ if (aps != NULL) {
+ ng.ng_sz += sizeof(ap_session_t) - 4;
+ if (aps->aps_data != 0)
+ ng.ng_sz += aps->aps_psiz;
+ }
+
+ if (BCOPYOUT(&ng, data, sizeof(ng)) != 0)
+ return EFAULT;
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natgetent */
+/* Returns: int - 0 == success, != 0 is the error value. */
+/* Parameters: data(I) - pointer to natget structure with kernel pointer */
+/* to NAT structure to copy out. */
+/* */
+/* Handle SIOCSTGET. */
+/* Copies out NAT entry to user space. Any additional data held for a */
+/* proxy is also copied, as to is the NAT rule which was responsible for it */
+/* ------------------------------------------------------------------------ */
+static int fr_natgetent(data)
+caddr_t data;
+{
+ int error, outsize;
+ ap_session_t *aps;
+ nat_save_t *ipn, ipns;
+ nat_t *n, *nat;
+
+ error = fr_inobj(data, &ipns, IPFOBJ_NATSAVE);
+ if (error != 0)
+ return error;
+
+ if ((ipns.ipn_dsize < sizeof(ipns)) || (ipns.ipn_dsize > 81920))
+ return EINVAL;
+
+ KMALLOCS(ipn, nat_save_t *, ipns.ipn_dsize);
+ if (ipn == NULL)
+ return ENOMEM;
+
+ ipn->ipn_dsize = ipns.ipn_dsize;
+ nat = ipns.ipn_next;
+ if (nat == NULL) {
+ nat = nat_instances;
+ if (nat == NULL) {
+ if (nat_instances == NULL)
+ error = ENOENT;
+ goto finished;
+ }
+ } else {
+ /*
+ * Make sure the pointer we're copying from exists in the
+ * current list of entries. Security precaution to prevent
+ * copying of random kernel data.
+ */
+ for (n = nat_instances; n; n = n->nat_next)
+ if (n == nat)
+ break;
+ if (n == NULL) {
+ error = ESRCH;
+ goto finished;
+ }
+ }
+ ipn->ipn_next = nat->nat_next;
+
+ /*
+ * Copy the NAT structure.
+ */
+ bcopy((char *)nat, &ipn->ipn_nat, sizeof(*nat));
+
+ /*
+ * If we have a pointer to the NAT rule it belongs to, save that too.
+ */
+ if (nat->nat_ptr != NULL)
+ bcopy((char *)nat->nat_ptr, (char *)&ipn->ipn_ipnat,
+ sizeof(ipn->ipn_ipnat));
+
+ /*
+ * If we also know the NAT entry has an associated filter rule,
+ * save that too.
+ */
+ if (nat->nat_fr != NULL)
+ bcopy((char *)nat->nat_fr, (char *)&ipn->ipn_fr,
+ sizeof(ipn->ipn_fr));
+
+ /*
+ * Last but not least, if there is an application proxy session set
+ * up for this NAT entry, then copy that out too, including any
+ * private data saved along side it by the proxy.
+ */
+ aps = nat->nat_aps;
+ outsize = ipn->ipn_dsize - sizeof(*ipn) + sizeof(ipn->ipn_data);
+ if (aps != NULL) {
+ char *s;
+
+ if (outsize < sizeof(*aps)) {
+ error = ENOBUFS;
+ goto finished;
+ }
+
+ s = ipn->ipn_data;
+ bcopy((char *)aps, s, sizeof(*aps));
+ s += sizeof(*aps);
+ outsize -= sizeof(*aps);
+ if ((aps->aps_data != NULL) && (outsize >= aps->aps_psiz))
+ bcopy(aps->aps_data, s, aps->aps_psiz);
+ else
+ error = ENOBUFS;
+ }
+ if (error == 0) {
+ error = fr_outobjsz(data, ipn, IPFOBJ_NATSAVE, ipns.ipn_dsize);
+ }
+
+finished:
+ if (ipn != NULL) {
+ KFREES(ipn, ipns.ipn_dsize);
+ }
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natputent */
+/* Returns: int - 0 == success, != 0 is the error value. */
+/* Parameters: data(I) - pointer to natget structure with NAT */
+/* structure information to load into the kernel */
+/* getlock(I) - flag indicating whether or not a write lock */
+/* on ipf_nat is already held. */
+/* */
+/* Handle SIOCSTPUT. */
+/* Loads a NAT table entry from user space, including a NAT rule, proxy and */
+/* firewall rule data structures, if pointers to them indicate so. */
+/* ------------------------------------------------------------------------ */
+static int fr_natputent(data, getlock)
+caddr_t data;
+int getlock;
+{
+ nat_save_t ipn, *ipnn;
+ ap_session_t *aps;
+ nat_t *n, *nat;
+ frentry_t *fr;
+ fr_info_t fin;
+ ipnat_t *in;
+ int error;
+
+ error = fr_inobj(data, &ipn, IPFOBJ_NATSAVE);
+ if (error != 0)
+ return error;
+
+ /*
+ * Initialise early because of code at junkput label.
+ */
+ in = NULL;
+ aps = NULL;
+ nat = NULL;
+ ipnn = NULL;
+ fr = NULL;
+
+ /*
+ * New entry, copy in the rest of the NAT entry if it's size is more
+ * than just the nat_t structure.
+ */
+ if (ipn.ipn_dsize > sizeof(ipn)) {
+ if (ipn.ipn_dsize > 81920) {
+ error = ENOMEM;
+ goto junkput;
+ }
+
+ KMALLOCS(ipnn, nat_save_t *, ipn.ipn_dsize);
+ if (ipnn == NULL)
+ return ENOMEM;
+
+ error = fr_inobjsz(data, ipnn, IPFOBJ_NATSAVE, ipn.ipn_dsize);
+ if (error != 0) {
+ error = EFAULT;
+ goto junkput;
+ }
+ } else
+ ipnn = &ipn;
+
+ KMALLOC(nat, nat_t *);
+ if (nat == NULL) {
+ error = ENOMEM;
+ goto junkput;
+ }
+
+ bcopy((char *)&ipnn->ipn_nat, (char *)nat, sizeof(*nat));
+ /*
+ * Initialize all these so that nat_delete() doesn't cause a crash.
+ */
+ bzero((char *)nat, offsetof(struct nat, nat_tqe));
+ nat->nat_tqe.tqe_pnext = NULL;
+ nat->nat_tqe.tqe_next = NULL;
+ nat->nat_tqe.tqe_ifq = NULL;
+ nat->nat_tqe.tqe_parent = nat;
+
+ /*
+ * Restore the rule associated with this nat session
+ */
+ in = ipnn->ipn_nat.nat_ptr;
+ if (in != NULL) {
+ KMALLOC(in, ipnat_t *);
+ nat->nat_ptr = in;
+ if (in == NULL) {
+ error = ENOMEM;
+ goto junkput;
+ }
+ bzero((char *)in, offsetof(struct ipnat, in_next6));
+ bcopy((char *)&ipnn->ipn_ipnat, (char *)in, sizeof(*in));
+ in->in_use = 1;
+ in->in_flags |= IPN_DELETE;
+
+ ATOMIC_INC(nat_stats.ns_rules);
+
+ if (nat_resolverule(in) != 0) {
+ error = ESRCH;
+ goto junkput;
+ }
+ }
+
+ /*
+ * Check that the NAT entry doesn't already exist in the kernel.
+ *
+ * For NAT_OUTBOUND, we're lookup for a duplicate MAP entry. To do
+ * this, we check to see if the inbound combination of addresses and
+ * ports is already known. Similar logic is applied for NAT_INBOUND.
+ *
+ */
+ bzero((char *)&fin, sizeof(fin));
+ fin.fin_p = nat->nat_p;
+ if (nat->nat_dir == NAT_OUTBOUND) {
+ fin.fin_ifp = nat->nat_ifps[0];
+ fin.fin_data[0] = ntohs(nat->nat_oport);
+ fin.fin_data[1] = ntohs(nat->nat_outport);
+ if (getlock) {
+ READ_ENTER(&ipf_nat);
+ }
+ n = nat_inlookup(&fin, nat->nat_flags, fin.fin_p,
+ nat->nat_oip, nat->nat_inip);
+ if (getlock) {
+ RWLOCK_EXIT(&ipf_nat);
+ }
+ if (n != NULL) {
+ error = EEXIST;
+ goto junkput;
+ }
+ } else if (nat->nat_dir == NAT_INBOUND) {
+ fin.fin_ifp = nat->nat_ifps[0];
+ fin.fin_data[0] = ntohs(nat->nat_outport);
+ fin.fin_data[1] = ntohs(nat->nat_oport);
+ if (getlock) {
+ READ_ENTER(&ipf_nat);
+ }
+ n = nat_outlookup(&fin, nat->nat_flags, fin.fin_p,
+ nat->nat_outip, nat->nat_oip);
+ if (getlock) {
+ RWLOCK_EXIT(&ipf_nat);
+ }
+ if (n != NULL) {
+ error = EEXIST;
+ goto junkput;
+ }
+ } else {
+ error = EINVAL;
+ goto junkput;
+ }
+
+ /*
+ * Restore ap_session_t structure. Include the private data allocated
+ * if it was there.
+ */
+ aps = nat->nat_aps;
+ if (aps != NULL) {
+ KMALLOC(aps, ap_session_t *);
+ nat->nat_aps = aps;
+ if (aps == NULL) {
+ error = ENOMEM;
+ goto junkput;
+ }
+ bcopy(ipnn->ipn_data, (char *)aps, sizeof(*aps));
+ if (in != NULL)
+ aps->aps_apr = in->in_apr;
+ else
+ aps->aps_apr = NULL;
+ if (aps->aps_psiz != 0) {
+ if (aps->aps_psiz > 81920) {
+ error = ENOMEM;
+ goto junkput;
+ }
+ KMALLOCS(aps->aps_data, void *, aps->aps_psiz);
+ if (aps->aps_data == NULL) {
+ error = ENOMEM;
+ goto junkput;
+ }
+ bcopy(ipnn->ipn_data + sizeof(*aps), aps->aps_data,
+ aps->aps_psiz);
+ } else {
+ aps->aps_psiz = 0;
+ aps->aps_data = NULL;
+ }
+ }
+
+ /*
+ * If there was a filtering rule associated with this entry then
+ * build up a new one.
+ */
+ fr = nat->nat_fr;
+ if (fr != NULL) {
+ if ((nat->nat_flags & SI_NEWFR) != 0) {
+ KMALLOC(fr, frentry_t *);
+ nat->nat_fr = fr;
+ if (fr == NULL) {
+ error = ENOMEM;
+ goto junkput;
+ }
+ ipnn->ipn_nat.nat_fr = fr;
+ fr->fr_ref = 1;
+ (void) fr_outobj(data, ipnn, IPFOBJ_NATSAVE);
+ bcopy((char *)&ipnn->ipn_fr, (char *)fr, sizeof(*fr));
+
+ fr->fr_ref = 1;
+ fr->fr_dsize = 0;
+ fr->fr_data = NULL;
+ fr->fr_type = FR_T_NONE;
+
+ MUTEX_NUKE(&fr->fr_lock);
+ MUTEX_INIT(&fr->fr_lock, "nat-filter rule lock");
+ } else {
+ if (getlock) {
+ READ_ENTER(&ipf_nat);
+ }
+ for (n = nat_instances; n; n = n->nat_next)
+ if (n->nat_fr == fr)
+ break;
+
+ if (n != NULL) {
+ MUTEX_ENTER(&fr->fr_lock);
+ fr->fr_ref++;
+ MUTEX_EXIT(&fr->fr_lock);
+ }
+ if (getlock) {
+ RWLOCK_EXIT(&ipf_nat);
+ }
+
+ if (!n) {
+ error = ESRCH;
+ goto junkput;
+ }
+ }
+ }
+
+ if (ipnn != &ipn) {
+ KFREES(ipnn, ipn.ipn_dsize);
+ ipnn = NULL;
+ }
+
+ if (getlock) {
+ WRITE_ENTER(&ipf_nat);
+ }
+ error = nat_insert(nat, nat->nat_rev);
+ if ((error == 0) && (aps != NULL)) {
+ aps->aps_next = ap_sess_list;
+ ap_sess_list = aps;
+ }
+ if (getlock) {
+ RWLOCK_EXIT(&ipf_nat);
+ }
+
+ if (error == 0)
+ return 0;
+
+ error = ENOMEM;
+
+junkput:
+ if (fr != NULL)
+ (void) fr_derefrule(&fr);
+
+ if ((ipnn != NULL) && (ipnn != &ipn)) {
+ KFREES(ipnn, ipn.ipn_dsize);
+ }
+ if (nat != NULL) {
+ if (aps != NULL) {
+ if (aps->aps_data != NULL) {
+ KFREES(aps->aps_data, aps->aps_psiz);
+ }
+ KFREE(aps);
+ }
+ if (in != NULL) {
+ if (in->in_apr)
+ appr_free(in->in_apr);
+ KFREE(in);
+ }
+ KFREE(nat);
+ }
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_delete */
+/* Returns: Nil */
+/* Parameters: natd(I) - pointer to NAT structure to delete */
+/* logtype(I) - type of LOG record to create before deleting */
+/* Write Lock: ipf_nat */
+/* */
+/* Delete a nat entry from the various lists and table. If NAT logging is */
+/* enabled then generate a NAT log record for this event. */
+/* ------------------------------------------------------------------------ */
+static void nat_delete(nat, logtype)
+struct nat *nat;
+int logtype;
+{
+ struct ipnat *ipn;
+
+ if (logtype != 0 && nat_logging != 0)
+ nat_log(nat, logtype);
+
+ MUTEX_ENTER(&ipf_nat_new);
+
+ /*
+ * Take it as a general indication that all the pointers are set if
+ * nat_pnext is set.
+ */
+ if (nat->nat_pnext != NULL) {
+ nat_stats.ns_bucketlen[0][nat->nat_hv[0]]--;
+ nat_stats.ns_bucketlen[1][nat->nat_hv[1]]--;
+
+ *nat->nat_pnext = nat->nat_next;
+ if (nat->nat_next != NULL) {
+ nat->nat_next->nat_pnext = nat->nat_pnext;
+ nat->nat_next = NULL;
+ }
+ nat->nat_pnext = NULL;
+
+ *nat->nat_phnext[0] = nat->nat_hnext[0];
+ if (nat->nat_hnext[0] != NULL) {
+ nat->nat_hnext[0]->nat_phnext[0] = nat->nat_phnext[0];
+ nat->nat_hnext[0] = NULL;
+ }
+ nat->nat_phnext[0] = NULL;
+
+ *nat->nat_phnext[1] = nat->nat_hnext[1];
+ if (nat->nat_hnext[1] != NULL) {
+ nat->nat_hnext[1]->nat_phnext[1] = nat->nat_phnext[1];
+ nat->nat_hnext[1] = NULL;
+ }
+ nat->nat_phnext[1] = NULL;
+
+ if ((nat->nat_flags & SI_WILDP) != 0)
+ nat_stats.ns_wilds--;
+ }
+
+ if (nat->nat_me != NULL) {
+ *nat->nat_me = NULL;
+ nat->nat_me = NULL;
+ }
+
+ if (nat->nat_tqe.tqe_ifq != NULL)
+ fr_deletequeueentry(&nat->nat_tqe);
+
+ if (logtype == NL_EXPIRE)
+ nat_stats.ns_expire++;
+
+ nat->nat_ref--;
+ if (nat->nat_ref > 0) {
+ MUTEX_EXIT(&ipf_nat_new);
+ return;
+ }
+
+ /*
+ * At this point, nat_ref can be either 0 or -1
+ */
+
+#ifdef IPFILTER_SYNC
+ if (nat->nat_sync)
+ ipfsync_del(nat->nat_sync);
+#endif
+
+ if (nat->nat_fr != NULL)
+ (void) fr_derefrule(&nat->nat_fr);
+
+ if (nat->nat_hm != NULL)
+ fr_hostmapdel(&nat->nat_hm);
+
+ /*
+ * If there is an active reference from the nat entry to its parent
+ * rule, decrement the rule's reference count and free it too if no
+ * longer being used.
+ */
+ ipn = nat->nat_ptr;
+ if (ipn != NULL) {
+ fr_ipnatderef(&ipn);
+ }
+
+ MUTEX_DESTROY(&nat->nat_lock);
+
+ aps_free(nat->nat_aps);
+ nat_stats.ns_inuse--;
+ MUTEX_EXIT(&ipf_nat_new);
+
+ /*
+ * If there's a fragment table entry too for this nat entry, then
+ * dereference that as well. This is after nat_lock is released
+ * because of Tru64.
+ */
+ fr_forgetnat((void *)nat);
+
+ KFREE(nat);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_flushtable */
+/* Returns: int - number of NAT rules deleted */
+/* Parameters: Nil */
+/* */
+/* Deletes all currently active NAT sessions. In deleting each NAT entry a */
+/* log record should be emitted in nat_delete() if NAT logging is enabled. */
+/* ------------------------------------------------------------------------ */
+/*
+ * nat_flushtable - clear the NAT table of all mapping entries.
+ */
+static int nat_flushtable()
+{
+ nat_t *nat;
+ int j = 0;
+
+ /*
+ * ALL NAT mappings deleted, so lets just make the deletions
+ * quicker.
+ */
+ if (nat_table[0] != NULL)
+ bzero((char *)nat_table[0],
+ sizeof(nat_table[0]) * ipf_nattable_sz);
+ if (nat_table[1] != NULL)
+ bzero((char *)nat_table[1],
+ sizeof(nat_table[1]) * ipf_nattable_sz);
+
+ while ((nat = nat_instances) != NULL) {
+ nat_delete(nat, NL_FLUSH);
+ j++;
+ }
+
+ nat_stats.ns_inuse = 0;
+ return j;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_clearlist */
+/* Returns: int - number of NAT/RDR rules deleted */
+/* Parameters: Nil */
+/* */
+/* Delete all rules in the current list of rules. There is nothing elegant */
+/* about this cleanup: simply free all entries on the list of rules and */
+/* clear out the tables used for hashed NAT rule lookups. */
+/* ------------------------------------------------------------------------ */
+static int nat_clearlist()
+{
+ ipnat_t *n, **np = &nat_list;
+ int i = 0;
+
+ if (nat_rules != NULL)
+ bzero((char *)nat_rules, sizeof(*nat_rules) * ipf_natrules_sz);
+ if (rdr_rules != NULL)
+ bzero((char *)rdr_rules, sizeof(*rdr_rules) * ipf_rdrrules_sz);
+
+ while ((n = *np) != NULL) {
+ *np = n->in_next;
+ if (n->in_use == 0) {
+ if (n->in_apr != NULL)
+ appr_free(n->in_apr);
+ KFREE(n);
+ nat_stats.ns_rules--;
+ } else {
+ n->in_flags |= IPN_DELETE;
+ n->in_next = NULL;
+ }
+ i++;
+ }
+#if SOLARIS
+ pfil_delayed_copy = 1;
+#endif
+ nat_masks = 0;
+ rdr_masks = 0;
+ return i;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_newmap */
+/* Returns: int - -1 == error, 0 == success */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT entry */
+/* ni(I) - pointer to structure with misc. information needed */
+/* to create new NAT entry. */
+/* */
+/* Given an empty NAT structure, populate it with new information about a */
+/* new NAT session, as defined by the matching NAT rule. */
+/* ni.nai_ip is passed in uninitialised and must be set, in host byte order,*/
+/* to the new IP address for the translation. */
+/* ------------------------------------------------------------------------ */
+static INLINE int nat_newmap(fin, nat, ni)
+fr_info_t *fin;
+nat_t *nat;
+natinfo_t *ni;
+{
+ u_short st_port, dport, sport, port, sp, dp;
+ struct in_addr in, inb;
+ hostmap_t *hm;
+ u_32_t flags;
+ u_32_t st_ip;
+ ipnat_t *np;
+ nat_t *natl;
+ int l;
+
+ /*
+ * If it's an outbound packet which doesn't match any existing
+ * record, then create a new port
+ */
+ l = 0;
+ hm = NULL;
+ np = ni->nai_np;
+ st_ip = np->in_nip;
+ st_port = np->in_pnext;
+ flags = ni->nai_flags;
+ sport = ni->nai_sport;
+ dport = ni->nai_dport;
+
+ /*
+ * Do a loop until we either run out of entries to try or we find
+ * a NAT mapping that isn't currently being used. This is done
+ * because the change to the source is not (usually) being fixed.
+ */
+ do {
+ port = 0;
+ in.s_addr = htonl(np->in_nip);
+ if (l == 0) {
+ /*
+ * Check to see if there is an existing NAT
+ * setup for this IP address pair.
+ */
+ hm = nat_hostmap(np, fin->fin_src, fin->fin_dst,
+ in, 0);
+ if (hm != NULL)
+ in.s_addr = hm->hm_mapip.s_addr;
+ } else if ((l == 1) && (hm != NULL)) {
+ fr_hostmapdel(&hm);
+ }
+ in.s_addr = ntohl(in.s_addr);
+
+ nat->nat_hm = hm;
+
+ if ((np->in_outmsk == 0xffffffff) && (np->in_pnext == 0)) {
+ if (l > 0)
+ return -1;
+ }
+
+ if (np->in_redir == NAT_BIMAP &&
+ np->in_inmsk == np->in_outmsk) {
+ /*
+ * map the address block in a 1:1 fashion
+ */
+ in.s_addr = np->in_outip;
+ in.s_addr |= fin->fin_saddr & ~np->in_inmsk;
+ in.s_addr = ntohl(in.s_addr);
+
+ } else if (np->in_redir & NAT_MAPBLK) {
+ if ((l >= np->in_ppip) || ((l > 0) &&
+ !(flags & IPN_TCPUDP)))
+ return -1;
+ /*
+ * map-block - Calculate destination address.
+ */
+ in.s_addr = ntohl(fin->fin_saddr);
+ in.s_addr &= ntohl(~np->in_inmsk);
+ inb.s_addr = in.s_addr;
+ in.s_addr /= np->in_ippip;
+ in.s_addr &= ntohl(~np->in_outmsk);
+ in.s_addr += ntohl(np->in_outip);
+ /*
+ * Calculate destination port.
+ */
+ if ((flags & IPN_TCPUDP) &&
+ (np->in_ppip != 0)) {
+ port = ntohs(sport) + l;
+ port %= np->in_ppip;
+ port += np->in_ppip *
+ (inb.s_addr % np->in_ippip);
+ port += MAPBLK_MINPORT;
+ port = htons(port);
+ }
+
+ } else if ((np->in_outip == 0) &&
+ (np->in_outmsk == 0xffffffff)) {
+ /*
+ * 0/32 - use the interface's IP address.
+ */
+ if ((l > 0) ||
+ fr_ifpaddr(4, FRI_NORMAL, fin->fin_ifp,
+ &in, NULL) == -1)
+ return -1;
+ in.s_addr = ntohl(in.s_addr);
+
+ } else if ((np->in_outip == 0) && (np->in_outmsk == 0)) {
+ /*
+ * 0/0 - use the original source address/port.
+ */
+ if (l > 0)
+ return -1;
+ in.s_addr = ntohl(fin->fin_saddr);
+
+ } else if ((np->in_outmsk != 0xffffffff) &&
+ (np->in_pnext == 0) && ((l > 0) || (hm == NULL)))
+ np->in_nip++;
+
+ natl = NULL;
+
+ if ((flags & IPN_TCPUDP) &&
+ ((np->in_redir & NAT_MAPBLK) == 0) &&
+ (np->in_flags & IPN_AUTOPORTMAP)) {
+ /*
+ * "ports auto" (without map-block)
+ */
+ if ((l > 0) && (l % np->in_ppip == 0)) {
+ if (l > np->in_space) {
+ return -1;
+ } else if ((l > np->in_ppip) &&
+ np->in_outmsk != 0xffffffff)
+ np->in_nip++;
+ }
+ if (np->in_ppip != 0) {
+ port = ntohs(sport);
+ port += (l % np->in_ppip);
+ port %= np->in_ppip;
+ port += np->in_ppip *
+ (ntohl(fin->fin_saddr) %
+ np->in_ippip);
+ port += MAPBLK_MINPORT;
+ port = htons(port);
+ }
+
+ } else if (((np->in_redir & NAT_MAPBLK) == 0) &&
+ (flags & IPN_TCPUDPICMP) && (np->in_pnext != 0)) {
+ /*
+ * Standard port translation. Select next port.
+ */
+ port = htons(np->in_pnext++);
+
+ if (np->in_pnext > ntohs(np->in_pmax)) {
+ np->in_pnext = ntohs(np->in_pmin);
+ if (np->in_outmsk != 0xffffffff)
+ np->in_nip++;
+ }
+ }
+
+ if (np->in_flags & IPN_IPRANGE) {
+ if (np->in_nip > ntohl(np->in_outmsk))
+ np->in_nip = ntohl(np->in_outip);
+ } else {
+ if ((np->in_outmsk != 0xffffffff) &&
+ ((np->in_nip + 1) & ntohl(np->in_outmsk)) >
+ ntohl(np->in_outip))
+ np->in_nip = ntohl(np->in_outip) + 1;
+ }
+
+ if ((port == 0) && (flags & (IPN_TCPUDPICMP|IPN_ICMPQUERY)))
+ port = sport;
+
+ /*
+ * Here we do a lookup of the connection as seen from
+ * the outside. If an IP# pair already exists, try
+ * again. So if you have A->B becomes C->B, you can
+ * also have D->E become C->E but not D->B causing
+ * another C->B. Also take protocol and ports into
+ * account when determining whether a pre-existing
+ * NAT setup will cause an external conflict where
+ * this is appropriate.
+ */
+ inb.s_addr = htonl(in.s_addr);
+ sp = fin->fin_data[0];
+ dp = fin->fin_data[1];
+ fin->fin_data[0] = fin->fin_data[1];
+ fin->fin_data[1] = htons(port);
+ natl = nat_inlookup(fin, flags & ~(SI_WILDP|NAT_SEARCH),
+ (u_int)fin->fin_p, fin->fin_dst, inb);
+ fin->fin_data[0] = sp;
+ fin->fin_data[1] = dp;
+
+ /*
+ * Has the search wrapped around and come back to the
+ * start ?
+ */
+ if ((natl != NULL) &&
+ (np->in_pnext != 0) && (st_port == np->in_pnext) &&
+ (np->in_nip != 0) && (st_ip == np->in_nip))
+ return -1;
+ l++;
+ } while (natl != NULL);
+
+ if (np->in_space > 0)
+ np->in_space--;
+
+ /* Setup the NAT table */
+ nat->nat_inip = fin->fin_src;
+ nat->nat_outip.s_addr = htonl(in.s_addr);
+ nat->nat_oip = fin->fin_dst;
+ if (nat->nat_hm == NULL)
+ nat->nat_hm = nat_hostmap(np, fin->fin_src, fin->fin_dst,
+ nat->nat_outip, 0);
+
+ /*
+ * The ICMP checksum does not have a pseudo header containing
+ * the IP addresses
+ */
+ ni->nai_sum1 = LONG_SUM(ntohl(fin->fin_saddr));
+ ni->nai_sum2 = LONG_SUM(in.s_addr);
+ if ((flags & IPN_TCPUDP)) {
+ ni->nai_sum1 += ntohs(sport);
+ ni->nai_sum2 += ntohs(port);
+ }
+
+ if (flags & IPN_TCPUDP) {
+ nat->nat_inport = sport;
+ nat->nat_outport = port; /* sport */
+ nat->nat_oport = dport;
+ ((tcphdr_t *)fin->fin_dp)->th_sport = port;
+ } else if (flags & IPN_ICMPQUERY) {
+ ((icmphdr_t *)fin->fin_dp)->icmp_id = port;
+ nat->nat_inport = port;
+ nat->nat_outport = port;
+ } else if (fin->fin_p == IPPROTO_GRE) {
+#if 0
+ nat->nat_gre.gs_flags = ((grehdr_t *)fin->fin_dp)->gr_flags;
+ if (GRE_REV(nat->nat_gre.gs_flags) == 1) {
+ nat->nat_oport = 0;/*fin->fin_data[1];*/
+ nat->nat_inport = 0;/*fin->fin_data[0];*/
+ nat->nat_outport = 0;/*fin->fin_data[0];*/
+ nat->nat_call[0] = fin->fin_data[0];
+ nat->nat_call[1] = fin->fin_data[0];
+ }
+#endif
+ }
+ ni->nai_ip.s_addr = in.s_addr;
+ ni->nai_port = port;
+ ni->nai_nport = dport;
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_newrdr */
+/* Returns: int - -1 == error, 0 == success (no move), 1 == success and */
+/* allow rule to be moved if IPN_ROUNDR is set. */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT entry */
+/* ni(I) - pointer to structure with misc. information needed */
+/* to create new NAT entry. */
+/* */
+/* ni.nai_ip is passed in uninitialised and must be set, in host byte order,*/
+/* to the new IP address for the translation. */
+/* ------------------------------------------------------------------------ */
+static INLINE int nat_newrdr(fin, nat, ni)
+fr_info_t *fin;
+nat_t *nat;
+natinfo_t *ni;
+{
+ u_short nport, dport, sport;
+ struct in_addr in, inb;
+ u_short sp, dp;
+ hostmap_t *hm;
+ u_32_t flags;
+ ipnat_t *np;
+ nat_t *natl;
+ int move;
+
+ move = 1;
+ hm = NULL;
+ in.s_addr = 0;
+ np = ni->nai_np;
+ flags = ni->nai_flags;
+ sport = ni->nai_sport;
+ dport = ni->nai_dport;
+
+ /*
+ * If the matching rule has IPN_STICKY set, then we want to have the
+ * same rule kick in as before. Why would this happen? If you have
+ * a collection of rdr rules with "round-robin sticky", the current
+ * packet might match a different one to the previous connection but
+ * we want the same destination to be used.
+ */
+ if (((np->in_flags & (IPN_ROUNDR|IPN_SPLIT)) != 0) &&
+ ((np->in_flags & IPN_STICKY) != 0)) {
+ hm = nat_hostmap(NULL, fin->fin_src, fin->fin_dst, in,
+ (u_32_t)dport);
+ if (hm != NULL) {
+ in.s_addr = ntohl(hm->hm_mapip.s_addr);
+ np = hm->hm_ipnat;
+ ni->nai_np = np;
+ move = 0;
+ }
+ }
+
+ /*
+ * Otherwise, it's an inbound packet. Most likely, we don't
+ * want to rewrite source ports and source addresses. Instead,
+ * we want to rewrite to a fixed internal address and fixed
+ * internal port.
+ */
+ if (np->in_flags & IPN_SPLIT) {
+ in.s_addr = np->in_nip;
+
+ if ((np->in_flags & (IPN_ROUNDR|IPN_STICKY)) == IPN_STICKY) {
+ hm = nat_hostmap(NULL, fin->fin_src, fin->fin_dst,
+ in, (u_32_t)dport);
+ if (hm != NULL) {
+ in.s_addr = hm->hm_mapip.s_addr;
+ move = 0;
+ }
+ }
+
+ if (hm == NULL || hm->hm_ref == 1) {
+ if (np->in_inip == htonl(in.s_addr)) {
+ np->in_nip = ntohl(np->in_inmsk);
+ move = 0;
+ } else {
+ np->in_nip = ntohl(np->in_inip);
+ }
+ }
+
+ } else if ((np->in_inip == 0) && (np->in_inmsk == 0xffffffff)) {
+ /*
+ * 0/32 - use the interface's IP address.
+ */
+ if (fr_ifpaddr(4, FRI_NORMAL, fin->fin_ifp, &in, NULL) == -1)
+ return -1;
+ in.s_addr = ntohl(in.s_addr);
+
+ } else if ((np->in_inip == 0) && (np->in_inmsk== 0)) {
+ /*
+ * 0/0 - use the original destination address/port.
+ */
+ in.s_addr = ntohl(fin->fin_daddr);
+
+ } else if (np->in_redir == NAT_BIMAP &&
+ np->in_inmsk == np->in_outmsk) {
+ /*
+ * map the address block in a 1:1 fashion
+ */
+ in.s_addr = np->in_inip;
+ in.s_addr |= fin->fin_daddr & ~np->in_inmsk;
+ in.s_addr = ntohl(in.s_addr);
+ } else {
+ in.s_addr = ntohl(np->in_inip);
+ }
+
+ if ((np->in_pnext == 0) || ((flags & NAT_NOTRULEPORT) != 0))
+ nport = dport;
+ else {
+ /*
+ * Whilst not optimized for the case where
+ * pmin == pmax, the gain is not significant.
+ */
+ if (((np->in_flags & IPN_FIXEDDPORT) == 0) &&
+ (np->in_pmin != np->in_pmax)) {
+ nport = ntohs(dport) - ntohs(np->in_pmin) +
+ ntohs(np->in_pnext);
+ nport = htons(nport);
+ } else
+ nport = np->in_pnext;
+ }
+
+ /*
+ * When the redirect-to address is set to 0.0.0.0, just
+ * assume a blank `forwarding' of the packet. We don't
+ * setup any translation for this either.
+ */
+ if (in.s_addr == 0) {
+ if (nport == dport)
+ return -1;
+ in.s_addr = ntohl(fin->fin_daddr);
+ }
+
+ /*
+ * Check to see if this redirect mapping already exists and if
+ * it does, return "failure" (allowing it to be created will just
+ * cause one or both of these "connections" to stop working.)
+ */
+ inb.s_addr = htonl(in.s_addr);
+ sp = fin->fin_data[0];
+ dp = fin->fin_data[1];
+ fin->fin_data[1] = fin->fin_data[0];
+ fin->fin_data[0] = ntohs(nport);
+ natl = nat_outlookup(fin, flags & ~(SI_WILDP|NAT_SEARCH),
+ (u_int)fin->fin_p, inb, fin->fin_src);
+ fin->fin_data[0] = sp;
+ fin->fin_data[1] = dp;
+ if (natl != NULL)
+ return -1;
+
+ nat->nat_inip.s_addr = htonl(in.s_addr);
+ nat->nat_outip = fin->fin_dst;
+ nat->nat_oip = fin->fin_src;
+ if ((nat->nat_hm == NULL) && ((np->in_flags & IPN_STICKY) != 0))
+ nat->nat_hm = nat_hostmap(np, fin->fin_src, fin->fin_dst, in,
+ (u_32_t)dport);
+
+ ni->nai_sum1 = LONG_SUM(ntohl(fin->fin_daddr)) + ntohs(dport);
+ ni->nai_sum2 = LONG_SUM(in.s_addr) + ntohs(nport);
+
+ ni->nai_ip.s_addr = in.s_addr;
+ ni->nai_nport = nport;
+ ni->nai_port = sport;
+
+ if (flags & IPN_TCPUDP) {
+ nat->nat_inport = nport;
+ nat->nat_outport = dport;
+ nat->nat_oport = sport;
+ ((tcphdr_t *)fin->fin_dp)->th_dport = nport;
+ } else if (flags & IPN_ICMPQUERY) {
+ ((icmphdr_t *)fin->fin_dp)->icmp_id = nport;
+ nat->nat_inport = nport;
+ nat->nat_outport = nport;
+ } else if (fin->fin_p == IPPROTO_GRE) {
+#if 0
+ nat->nat_gre.gs_flags = ((grehdr_t *)fin->fin_dp)->gr_flags;
+ if (GRE_REV(nat->nat_gre.gs_flags) == 1) {
+ nat->nat_call[0] = fin->fin_data[0];
+ nat->nat_call[1] = fin->fin_data[1];
+ nat->nat_oport = 0; /*fin->fin_data[0];*/
+ nat->nat_inport = 0; /*fin->fin_data[1];*/
+ nat->nat_outport = 0; /*fin->fin_data[1];*/
+ }
+#endif
+ }
+
+ return move;
+}
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_new */
+/* Returns: nat_t* - NULL == failure to create new NAT structure, */
+/* else pointer to new NAT structure */
+/* Parameters: fin(I) - pointer to packet information */
+/* np(I) - pointer to NAT rule */
+/* natsave(I) - pointer to where to store NAT struct pointer */
+/* flags(I) - flags describing the current packet */
+/* direction(I) - direction of packet (in/out) */
+/* Write Lock: ipf_nat */
+/* */
+/* Attempts to create a new NAT entry. Does not actually change the packet */
+/* in any way. */
+/* */
+/* This fucntion is in three main parts: (1) deal with creating a new NAT */
+/* structure for a "MAP" rule (outgoing NAT translation); (2) deal with */
+/* creating a new NAT structure for a "RDR" rule (incoming NAT translation) */
+/* and (3) building that structure and putting it into the NAT table(s). */
+/* */
+/* NOTE: natsave should NOT be used top point back to an ipstate_t struct */
+/* as it can result in memory being corrupted. */
+/* ------------------------------------------------------------------------ */
+nat_t *nat_new(fin, np, natsave, flags, direction)
+fr_info_t *fin;
+ipnat_t *np;
+nat_t **natsave;
+u_int flags;
+int direction;
+{
+ u_short port = 0, sport = 0, dport = 0, nport = 0;
+ tcphdr_t *tcp = NULL;
+ hostmap_t *hm = NULL;
+ struct in_addr in;
+ nat_t *nat, *natl;
+ u_int nflags;
+ natinfo_t ni;
+ u_32_t sumd;
+ int move;
+#if SOLARIS && defined(_KERNEL) && (SOLARIS2 >= 6) && defined(ICK_M_CTL_MAGIC)
+ qpktinfo_t *qpi = fin->fin_qpi;
+#endif
+
+ if (nat_stats.ns_inuse >= ipf_nattable_max) {
+ nat_stats.ns_memfail++;
+ fr_nat_doflush = 1;
+ return NULL;
+ }
+
+ move = 1;
+ nflags = np->in_flags & flags;
+ nflags &= NAT_FROMRULE;
+
+ ni.nai_np = np;
+ ni.nai_nflags = nflags;
+ ni.nai_flags = flags;
+ ni.nai_dport = 0;
+ ni.nai_sport = 0;
+
+ /* Give me a new nat */
+ KMALLOC(nat, nat_t *);
+ if (nat == NULL) {
+ nat_stats.ns_memfail++;
+ /*
+ * Try to automatically tune the max # of entries in the
+ * table allowed to be less than what will cause kmem_alloc()
+ * to fail and try to eliminate panics due to out of memory
+ * conditions arising.
+ */
+ if (ipf_nattable_max > ipf_nattable_sz) {
+ ipf_nattable_max = nat_stats.ns_inuse - 100;
+ printf("ipf_nattable_max reduced to %d\n",
+ ipf_nattable_max);
+ }
+ return NULL;
+ }
+
+ if (flags & IPN_TCPUDP) {
+ tcp = fin->fin_dp;
+ ni.nai_sport = htons(fin->fin_sport);
+ ni.nai_dport = htons(fin->fin_dport);
+ } else if (flags & IPN_ICMPQUERY) {
+ /*
+ * In the ICMP query NAT code, we translate the ICMP id fields
+ * to make them unique. This is indepedent of the ICMP type
+ * (e.g. in the unlikely event that a host sends an echo and
+ * an tstamp request with the same id, both packets will have
+ * their ip address/id field changed in the same way).
+ */
+ /* The icmp_id field is used by the sender to identify the
+ * process making the icmp request. (the receiver justs
+ * copies it back in its response). So, it closely matches
+ * the concept of source port. We overlay sport, so we can
+ * maximally reuse the existing code.
+ */
+ ni.nai_sport = ((icmphdr_t *)fin->fin_dp)->icmp_id;
+ ni.nai_dport = ni.nai_sport;
+ }
+
+ bzero((char *)nat, sizeof(*nat));
+ nat->nat_flags = flags;
+ nat->nat_redir = np->in_redir;
+
+ if ((flags & NAT_SLAVE) == 0) {
+ MUTEX_ENTER(&ipf_nat_new);
+ }
+
+ /*
+ * Search the current table for a match.
+ */
+ if (direction == NAT_OUTBOUND) {
+ /*
+ * We can now arrange to call this for the same connection
+ * because ipf_nat_new doesn't protect the code path into
+ * this function.
+ */
+ natl = nat_outlookup(fin, nflags, (u_int)fin->fin_p,
+ fin->fin_src, fin->fin_dst);
+ if (natl != NULL) {
+ KFREE(nat);
+ nat = natl;
+ goto done;
+ }
+
+ move = nat_newmap(fin, nat, &ni);
+ if (move == -1)
+ goto badnat;
+
+ np = ni.nai_np;
+ in = ni.nai_ip;
+ } else {
+ /*
+ * NAT_INBOUND is used only for redirects rules
+ */
+ natl = nat_inlookup(fin, nflags, (u_int)fin->fin_p,
+ fin->fin_src, fin->fin_dst);
+ if (natl != NULL) {
+ KFREE(nat);
+ nat = natl;
+ goto done;
+ }
+
+ move = nat_newrdr(fin, nat, &ni);
+ if (move == -1)
+ goto badnat;
+
+ np = ni.nai_np;
+ in = ni.nai_ip;
+ }
+ port = ni.nai_port;
+ nport = ni.nai_nport;
+
+ if ((move == 1) && (np->in_flags & IPN_ROUNDR)) {
+ if (np->in_redir == NAT_REDIRECT) {
+ nat_delrdr(np);
+ nat_addrdr(np);
+ } else if (np->in_redir == NAT_MAP) {
+ nat_delnat(np);
+ nat_addnat(np);
+ }
+ }
+
+ if (flags & IPN_TCPUDP) {
+ sport = ni.nai_sport;
+ dport = ni.nai_dport;
+ } else if (flags & IPN_ICMPQUERY) {
+ sport = ni.nai_sport;
+ dport = 0;
+ }
+
+ CALC_SUMD(ni.nai_sum1, ni.nai_sum2, sumd);
+ nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
+#if SOLARIS && defined(_KERNEL) && (SOLARIS2 >= 6) && defined(ICK_M_CTL_MAGIC)
+ if ((flags & IPN_TCP) && dohwcksum &&
+ (((ill_t *)qpi->qpi_ill)->ill_ick.ick_magic == ICK_M_CTL_MAGIC)) {
+ if (direction == NAT_OUTBOUND)
+ ni.nai_sum1 = LONG_SUM(in.s_addr);
+ else
+ ni.nai_sum1 = LONG_SUM(ntohl(fin->fin_saddr));
+ ni.nai_sum1 += LONG_SUM(ntohl(fin->fin_daddr));
+ ni.nai_sum1 += 30;
+ ni.nai_sum1 = (ni.nai_sum1 & 0xffff) + (ni.nai_sum1 >> 16);
+ nat->nat_sumd[1] = NAT_HW_CKSUM|(ni.nai_sum1 & 0xffff);
+ } else
+#endif
+ nat->nat_sumd[1] = nat->nat_sumd[0];
+
+ if ((flags & IPN_TCPUDPICMP) && ((sport != port) || (dport != nport))) {
+ if (direction == NAT_OUTBOUND)
+ ni.nai_sum1 = LONG_SUM(ntohl(fin->fin_saddr));
+ else
+ ni.nai_sum1 = LONG_SUM(ntohl(fin->fin_daddr));
+
+ ni.nai_sum2 = LONG_SUM(in.s_addr);
+
+ CALC_SUMD(ni.nai_sum1, ni.nai_sum2, sumd);
+ nat->nat_ipsumd = (sumd & 0xffff) + (sumd >> 16);
+ } else {
+ nat->nat_ipsumd = nat->nat_sumd[0];
+ if (!(flags & IPN_TCPUDPICMP)) {
+ nat->nat_sumd[0] = 0;
+ nat->nat_sumd[1] = 0;
+ }
+ }
+
+ if (nat_finalise(fin, nat, &ni, tcp, natsave, direction) == -1) {
+ goto badnat;
+ }
+ if (flags & SI_WILDP)
+ nat_stats.ns_wilds++;
+ goto done;
+badnat:
+ nat_stats.ns_badnat++;
+ if ((hm = nat->nat_hm) != NULL)
+ fr_hostmapdel(&hm);
+ KFREE(nat);
+ nat = NULL;
+done:
+ if ((flags & NAT_SLAVE) == 0) {
+ MUTEX_EXIT(&ipf_nat_new);
+ }
+ return nat;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_finalise */
+/* Returns: int - 0 == sucess, -1 == failure */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT entry */
+/* ni(I) - pointer to structure with misc. information needed */
+/* to create new NAT entry. */
+/* Write Lock: ipf_nat */
+/* */
+/* This is the tail end of constructing a new NAT entry and is the same */
+/* for both IPv4 and IPv6. */
+/* ------------------------------------------------------------------------ */
+/*ARGSUSED*/
+static int nat_finalise(fin, nat, ni, tcp, natsave, direction)
+fr_info_t *fin;
+nat_t *nat;
+natinfo_t *ni;
+tcphdr_t *tcp;
+nat_t **natsave;
+int direction;
+{
+ frentry_t *fr;
+ ipnat_t *np;
+
+ np = ni->nai_np;
+
+ if (np->in_ifps[0] != NULL) {
+ COPYIFNAME(np->in_ifps[0], nat->nat_ifnames[0]);
+ }
+ if (np->in_ifps[1] != NULL) {
+ COPYIFNAME(np->in_ifps[1], nat->nat_ifnames[1]);
+ }
+#ifdef IPFILTER_SYNC
+ if ((nat->nat_flags & SI_CLONE) == 0)
+ nat->nat_sync = ipfsync_new(SMC_NAT, fin, nat);
+#endif
+
+ nat->nat_me = natsave;
+ nat->nat_dir = direction;
+ nat->nat_ifps[0] = np->in_ifps[0];
+ nat->nat_ifps[1] = np->in_ifps[1];
+ nat->nat_ptr = np;
+ nat->nat_p = fin->fin_p;
+ nat->nat_mssclamp = np->in_mssclamp;
+
+ if ((np->in_apr != NULL) && ((ni->nai_flags & NAT_SLAVE) == 0))
+ if (appr_new(fin, nat) == -1)
+ return -1;
+
+ if (nat_insert(nat, fin->fin_rev) == 0) {
+ if (nat_logging)
+ nat_log(nat, (u_int)np->in_redir);
+ np->in_use++;
+ fr = fin->fin_fr;
+ nat->nat_fr = fr;
+ if (fr != NULL) {
+ MUTEX_ENTER(&fr->fr_lock);
+ fr->fr_ref++;
+ MUTEX_EXIT(&fr->fr_lock);
+ }
+ return 0;
+ }
+
+ /*
+ * nat_insert failed, so cleanup time...
+ */
+ return -1;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_insert */
+/* Returns: int - 0 == sucess, -1 == failure */
+/* Parameters: nat(I) - pointer to NAT structure */
+/* rev(I) - flag indicating forward/reverse direction of packet */
+/* Write Lock: ipf_nat */
+/* */
+/* Insert a NAT entry into the hash tables for searching and add it to the */
+/* list of active NAT entries. Adjust global counters when complete. */
+/* ------------------------------------------------------------------------ */
+int nat_insert(nat, rev)
+nat_t *nat;
+int rev;
+{
+ u_int hv1, hv2;
+ nat_t **natp;
+
+ /*
+ * Try and return an error as early as possible, so calculate the hash
+ * entry numbers first and then proceed.
+ */
+ if ((nat->nat_flags & (SI_W_SPORT|SI_W_DPORT)) == 0) {
+ hv1 = NAT_HASH_FN(nat->nat_inip.s_addr, nat->nat_inport,
+ 0xffffffff);
+ hv1 = NAT_HASH_FN(nat->nat_oip.s_addr, hv1 + nat->nat_oport,
+ ipf_nattable_sz);
+ hv2 = NAT_HASH_FN(nat->nat_outip.s_addr, nat->nat_outport,
+ 0xffffffff);
+ hv2 = NAT_HASH_FN(nat->nat_oip.s_addr, hv2 + nat->nat_oport,
+ ipf_nattable_sz);
+ } else {
+ hv1 = NAT_HASH_FN(nat->nat_inip.s_addr, 0, 0xffffffff);
+ hv1 = NAT_HASH_FN(nat->nat_oip.s_addr, hv1, ipf_nattable_sz);
+ hv2 = NAT_HASH_FN(nat->nat_outip.s_addr, 0, 0xffffffff);
+ hv2 = NAT_HASH_FN(nat->nat_oip.s_addr, hv2, ipf_nattable_sz);
+ }
+
+ if (nat_stats.ns_bucketlen[0][hv1] >= fr_nat_maxbucket ||
+ nat_stats.ns_bucketlen[1][hv2] >= fr_nat_maxbucket) {
+ return -1;
+ }
+
+ nat->nat_hv[0] = hv1;
+ nat->nat_hv[1] = hv2;
+
+ MUTEX_INIT(&nat->nat_lock, "nat entry lock");
+
+ nat->nat_rev = rev;
+ nat->nat_ref = 1;
+ nat->nat_bytes[0] = 0;
+ nat->nat_pkts[0] = 0;
+ nat->nat_bytes[1] = 0;
+ nat->nat_pkts[1] = 0;
+
+ nat->nat_ifnames[0][LIFNAMSIZ - 1] = '\0';
+ nat->nat_ifps[0] = fr_resolvenic(nat->nat_ifnames[0], 4);
+
+ if (nat->nat_ifnames[1][0] != '\0') {
+ nat->nat_ifnames[1][LIFNAMSIZ - 1] = '\0';
+ nat->nat_ifps[1] = fr_resolvenic(nat->nat_ifnames[1], 4);
+ } else {
+ (void) strncpy(nat->nat_ifnames[1], nat->nat_ifnames[0],
+ LIFNAMSIZ);
+ nat->nat_ifnames[1][LIFNAMSIZ - 1] = '\0';
+ nat->nat_ifps[1] = nat->nat_ifps[0];
+ }
+
+ nat->nat_next = nat_instances;
+ nat->nat_pnext = &nat_instances;
+ if (nat_instances)
+ nat_instances->nat_pnext = &nat->nat_next;
+ nat_instances = nat;
+
+ natp = &nat_table[0][hv1];
+ if (*natp)
+ (*natp)->nat_phnext[0] = &nat->nat_hnext[0];
+ nat->nat_phnext[0] = natp;
+ nat->nat_hnext[0] = *natp;
+ *natp = nat;
+ nat_stats.ns_bucketlen[0][hv1]++;
+
+ natp = &nat_table[1][hv2];
+ if (*natp)
+ (*natp)->nat_phnext[1] = &nat->nat_hnext[1];
+ nat->nat_phnext[1] = natp;
+ nat->nat_hnext[1] = *natp;
+ *natp = nat;
+ nat_stats.ns_bucketlen[1][hv2]++;
+
+ fr_setnatqueue(nat, rev);
+
+ nat_stats.ns_added++;
+ nat_stats.ns_inuse++;
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_icmperrorlookup */
+/* Returns: nat_t* - point to matching NAT structure */
+/* Parameters: fin(I) - pointer to packet information */
+/* dir(I) - direction of packet (in/out) */
+/* */
+/* Check if the ICMP error message is related to an existing TCP, UDP or */
+/* ICMP query nat entry. It is assumed that the packet is already of the */
+/* the required length. */
+/* ------------------------------------------------------------------------ */
+nat_t *nat_icmperrorlookup(fin, dir)
+fr_info_t *fin;
+int dir;
+{
+ int flags = 0, type, minlen;
+ icmphdr_t *icmp, *orgicmp;
+ tcphdr_t *tcp = NULL;
+ u_short data[2];
+ nat_t *nat;
+ ip_t *oip;
+ u_int p;
+
+ icmp = fin->fin_dp;
+ type = icmp->icmp_type;
+ /*
+ * Does it at least have the return (basic) IP header ?
+ * Only a basic IP header (no options) should be with an ICMP error
+ * header. Also, if it's not an error type, then return.
+ */
+ if ((fin->fin_hlen != sizeof(ip_t)) || !(fin->fin_flx & FI_ICMPERR))
+ return NULL;
+
+ /*
+ * Check packet size
+ */
+ oip = (ip_t *)((char *)fin->fin_dp + 8);
+ minlen = IP_HL(oip) << 2;
+ if ((minlen < sizeof(ip_t)) ||
+ (fin->fin_plen < ICMPERR_IPICMPHLEN + minlen))
+ return NULL;
+ /*
+ * Is the buffer big enough for all of it ? It's the size of the IP
+ * header claimed in the encapsulated part which is of concern. It
+ * may be too big to be in this buffer but not so big that it's
+ * outside the ICMP packet, leading to TCP deref's causing problems.
+ * This is possible because we don't know how big oip_hl is when we
+ * do the pullup early in fr_check() and thus can't gaurantee it is
+ * all here now.
+ */
+#ifdef _KERNEL
+ {
+ mb_t *m;
+
+ m = fin->fin_m;
+# if defined(MENTAT)
+ if ((char *)oip + fin->fin_dlen - ICMPERR_ICMPHLEN > (char *)m->b_wptr)
+ return NULL;
+# else
+ if ((char *)oip + fin->fin_dlen - ICMPERR_ICMPHLEN >
+ (char *)fin->fin_ip + M_LEN(m))
+ return NULL;
+# endif
+ }
+#endif
+
+ if (fin->fin_daddr != oip->ip_src.s_addr)
+ return NULL;
+
+ p = oip->ip_p;
+ if (p == IPPROTO_TCP)
+ flags = IPN_TCP;
+ else if (p == IPPROTO_UDP)
+ flags = IPN_UDP;
+ else if (p == IPPROTO_ICMP) {
+ orgicmp = (icmphdr_t *)((char *)oip + (IP_HL(oip) << 2));
+
+ /* see if this is related to an ICMP query */
+ if (nat_icmpquerytype4(orgicmp->icmp_type)) {
+ data[0] = fin->fin_data[0];
+ data[1] = fin->fin_data[1];
+ fin->fin_data[0] = 0;
+ fin->fin_data[1] = orgicmp->icmp_id;
+
+ flags = IPN_ICMPERR|IPN_ICMPQUERY;
+ /*
+ * NOTE : dir refers to the direction of the original
+ * ip packet. By definition the icmp error
+ * message flows in the opposite direction.
+ */
+ if (dir == NAT_INBOUND)
+ nat = nat_inlookup(fin, flags, p, oip->ip_dst,
+ oip->ip_src);
+ else
+ nat = nat_outlookup(fin, flags, p, oip->ip_dst,
+ oip->ip_src);
+ fin->fin_data[0] = data[0];
+ fin->fin_data[1] = data[1];
+ return nat;
+ }
+ }
+
+ if (flags & IPN_TCPUDP) {
+ minlen += 8; /* + 64bits of data to get ports */
+ if (fin->fin_plen < ICMPERR_IPICMPHLEN + minlen)
+ return NULL;
+
+ data[0] = fin->fin_data[0];
+ data[1] = fin->fin_data[1];
+ tcp = (tcphdr_t *)((char *)oip + (IP_HL(oip) << 2));
+ fin->fin_data[0] = ntohs(tcp->th_dport);
+ fin->fin_data[1] = ntohs(tcp->th_sport);
+
+ if (dir == NAT_INBOUND) {
+ nat = nat_inlookup(fin, flags, p, oip->ip_dst,
+ oip->ip_src);
+ } else {
+ nat = nat_outlookup(fin, flags, p, oip->ip_dst,
+ oip->ip_src);
+ }
+ fin->fin_data[0] = data[0];
+ fin->fin_data[1] = data[1];
+ return nat;
+ }
+ if (dir == NAT_INBOUND)
+ return nat_inlookup(fin, 0, p, oip->ip_dst, oip->ip_src);
+ else
+ return nat_outlookup(fin, 0, p, oip->ip_dst, oip->ip_src);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_icmperror */
+/* Returns: nat_t* - point to matching NAT structure */
+/* Parameters: fin(I) - pointer to packet information */
+/* nflags(I) - NAT flags for this packet */
+/* dir(I) - direction of packet (in/out) */
+/* */
+/* Fix up an ICMP packet which is an error message for an existing NAT */
+/* session. This will correct both packet header data and checksums. */
+/* */
+/* This should *ONLY* be used for incoming ICMP error packets to make sure */
+/* a NAT'd ICMP packet gets correctly recognised. */
+/* ------------------------------------------------------------------------ */
+nat_t *nat_icmperror(fin, nflags, dir)
+fr_info_t *fin;
+u_int *nflags;
+int dir;
+{
+ u_32_t sum1, sum2, sumd, sumd2;
+ struct in_addr a1, a2;
+ int flags, dlen, odst;
+ icmphdr_t *icmp;
+ u_short *csump;
+ tcphdr_t *tcp;
+ nat_t *nat;
+ ip_t *oip;
+ void *dp;
+
+ if ((fin->fin_flx & (FI_SHORT|FI_FRAGBODY)))
+ return NULL;
+ /*
+ * nat_icmperrorlookup() will return NULL for `defective' packets.
+ */
+ if ((fin->fin_v != 4) || !(nat = nat_icmperrorlookup(fin, dir)))
+ return NULL;
+
+ tcp = NULL;
+ csump = NULL;
+ flags = 0;
+ sumd2 = 0;
+ *nflags = IPN_ICMPERR;
+ icmp = fin->fin_dp;
+ oip = (ip_t *)&icmp->icmp_ip;
+ dp = (((char *)oip) + (IP_HL(oip) << 2));
+ if (oip->ip_p == IPPROTO_TCP) {
+ tcp = (tcphdr_t *)dp;
+ csump = (u_short *)&tcp->th_sum;
+ flags = IPN_TCP;
+ } else if (oip->ip_p == IPPROTO_UDP) {
+ udphdr_t *udp;
+
+ udp = (udphdr_t *)dp;
+ tcp = (tcphdr_t *)dp;
+ csump = (u_short *)&udp->uh_sum;
+ flags = IPN_UDP;
+ } else if (oip->ip_p == IPPROTO_ICMP)
+ flags = IPN_ICMPQUERY;
+ dlen = fin->fin_plen - ((char *)dp - (char *)fin->fin_ip);
+
+ /*
+ * Need to adjust ICMP header to include the real IP#'s and
+ * port #'s. Only apply a checksum change relative to the
+ * IP address change as it will be modified again in fr_checknatout
+ * for both address and port. Two checksum changes are
+ * necessary for the two header address changes. Be careful
+ * to only modify the checksum once for the port # and twice
+ * for the IP#.
+ */
+
+ /*
+ * Step 1
+ * Fix the IP addresses in the offending IP packet. You also need
+ * to adjust the IP header checksum of that offending IP packet.
+ *
+ * Normally, you would expect that the ICMP checksum of the
+ * ICMP error message needs to be adjusted as well for the
+ * IP address change in oip.
+ * However, this is a NOP, because the ICMP checksum is
+ * calculated over the complete ICMP packet, which includes the
+ * changed oip IP addresses and oip->ip_sum. However, these
+ * two changes cancel each other out (if the delta for
+ * the IP address is x, then the delta for ip_sum is minus x),
+ * so no change in the icmp_cksum is necessary.
+ *
+ * Inbound ICMP
+ * ------------
+ * MAP rule, SRC=a,DST=b -> SRC=c,DST=b
+ * - response to outgoing packet (a,b)=>(c,b) (OIP_SRC=c,OIP_DST=b)
+ * - OIP_SRC(c)=nat_outip, OIP_DST(b)=nat_oip
+ *
+ * RDR rule, SRC=a,DST=b -> SRC=a,DST=c
+ * - response to outgoing packet (c,a)=>(b,a) (OIP_SRC=b,OIP_DST=a)
+ * - OIP_SRC(b)=nat_outip, OIP_DST(a)=nat_oip
+ *
+ * Outbound ICMP
+ * -------------
+ * MAP rule, SRC=a,DST=b -> SRC=c,DST=b
+ * - response to incoming packet (b,c)=>(b,a) (OIP_SRC=b,OIP_DST=a)
+ * - OIP_SRC(a)=nat_oip, OIP_DST(c)=nat_inip
+ *
+ * RDR rule, SRC=a,DST=b -> SRC=a,DST=c
+ * - response to incoming packet (a,b)=>(a,c) (OIP_SRC=a,OIP_DST=c)
+ * - OIP_SRC(a)=nat_oip, OIP_DST(c)=nat_inip
+ *
+ */
+ odst = (oip->ip_dst.s_addr == nat->nat_oip.s_addr) ? 1 : 0;
+ if (odst == 1) {
+ a1.s_addr = ntohl(nat->nat_inip.s_addr);
+ a2.s_addr = ntohl(oip->ip_src.s_addr);
+ oip->ip_src.s_addr = htonl(a1.s_addr);
+ } else {
+ a1.s_addr = ntohl(nat->nat_outip.s_addr);
+ a2.s_addr = ntohl(oip->ip_dst.s_addr);
+ oip->ip_dst.s_addr = htonl(a1.s_addr);
+ }
+
+ sumd = a2.s_addr - a1.s_addr;
+ if (sumd != 0) {
+ if (a1.s_addr > a2.s_addr)
+ sumd--;
+ sumd = ~sumd;
+
+ fix_datacksum(&oip->ip_sum, sumd);
+ }
+
+ sumd2 = sumd;
+ sum1 = 0;
+ sum2 = 0;
+
+ /*
+ * Fix UDP pseudo header checksum to compensate for the
+ * IP address change.
+ */
+ if (((flags & IPN_TCPUDP) != 0) && (dlen >= 4)) {
+ /*
+ * Step 2 :
+ * For offending TCP/UDP IP packets, translate the ports as
+ * well, based on the NAT specification. Of course such
+ * a change may be reflected in the ICMP checksum as well.
+ *
+ * Since the port fields are part of the TCP/UDP checksum
+ * of the offending IP packet, you need to adjust that checksum
+ * as well... except that the change in the port numbers should
+ * be offset by the checksum change. However, the TCP/UDP
+ * checksum will also need to change if there has been an
+ * IP address change.
+ */
+ if (odst == 1) {
+ sum1 = ntohs(nat->nat_inport);
+ sum2 = ntohs(tcp->th_sport);
+
+ tcp->th_sport = htons(sum1);
+ } else {
+ sum1 = ntohs(nat->nat_outport);
+ sum2 = ntohs(tcp->th_dport);
+
+ tcp->th_dport = htons(sum1);
+ }
+
+ sumd += sum1 - sum2;
+ if (sumd != 0 || sumd2 != 0) {
+ /*
+ * At this point, sumd is the delta to apply to the
+ * TCP/UDP header, given the changes in both the IP
+ * address and the ports and sumd2 is the delta to
+ * apply to the ICMP header, given the IP address
+ * change delta that may need to be applied to the
+ * TCP/UDP checksum instead.
+ *
+ * If we will both the IP and TCP/UDP checksums
+ * then the ICMP checksum changes by the address
+ * delta applied to the TCP/UDP checksum. If we
+ * do not change the TCP/UDP checksum them we
+ * apply the delta in ports to the ICMP checksum.
+ */
+ if (oip->ip_p == IPPROTO_UDP) {
+ if ((dlen >= 8) && (*csump != 0)) {
+ fix_datacksum(csump, sumd);
+ } else {
+ sumd2 = sum1 - sum2;
+ if (sum2 > sum1)
+ sumd2--;
+ }
+ } else if (oip->ip_p == IPPROTO_TCP) {
+ if (dlen >= 18) {
+ fix_datacksum(csump, sumd);
+ } else {
+ sumd2 = sum2 - sum1;
+ if (sum1 > sum2)
+ sumd2--;
+ }
+ }
+
+ if (sumd2 != 0) {
+ sumd2 = (sumd2 & 0xffff) + (sumd2 >> 16);
+ sumd2 = (sumd2 & 0xffff) + (sumd2 >> 16);
+ sumd2 = (sumd2 & 0xffff) + (sumd2 >> 16);
+ fix_incksum(fin, &icmp->icmp_cksum, sumd2);
+ }
+ }
+ } else if (((flags & IPN_ICMPQUERY) != 0) && (dlen >= 8)) {
+ icmphdr_t *orgicmp;
+
+ /*
+ * XXX - what if this is bogus hl and we go off the end ?
+ * In this case, nat_icmperrorlookup() will have returned NULL.
+ */
+ orgicmp = (icmphdr_t *)dp;
+
+ if (odst == 1) {
+ if (orgicmp->icmp_id != nat->nat_inport) {
+
+ /*
+ * Fix ICMP checksum (of the offening ICMP
+ * query packet) to compensate the change
+ * in the ICMP id of the offending ICMP
+ * packet.
+ *
+ * Since you modify orgicmp->icmp_id with
+ * a delta (say x) and you compensate that
+ * in origicmp->icmp_cksum with a delta
+ * minus x, you don't have to adjust the
+ * overall icmp->icmp_cksum
+ */
+ sum1 = ntohs(orgicmp->icmp_id);
+ sum2 = ntohs(nat->nat_inport);
+ CALC_SUMD(sum1, sum2, sumd);
+ orgicmp->icmp_id = nat->nat_inport;
+ fix_datacksum(&orgicmp->icmp_cksum, sumd);
+ }
+ } /* nat_dir == NAT_INBOUND is impossible for icmp queries */
+ }
+ return nat;
+}
+
+
+/*
+ * NB: these lookups don't lock access to the list, it assumed that it has
+ * already been done!
+ */
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_inlookup */
+/* Returns: nat_t* - NULL == no match, */
+/* else pointer to matching NAT entry */
+/* Parameters: fin(I) - pointer to packet information */
+/* flags(I) - NAT flags for this packet */
+/* p(I) - protocol for this packet */
+/* src(I) - source IP address */
+/* mapdst(I) - destination IP address */
+/* */
+/* Lookup a nat entry based on the mapped destination ip address/port and */
+/* real source address/port. We use this lookup when receiving a packet, */
+/* we're looking for a table entry, based on the destination address. */
+/* */
+/* NOTE: THE PACKET BEING CHECKED (IF FOUND) HAS A MAPPING ALREADY. */
+/* */
+/* NOTE: IT IS ASSUMED THAT ipf_nat IS ONLY HELD WITH A READ LOCK WHEN */
+/* THIS FUNCTION IS CALLED WITH NAT_SEARCH SET IN nflags. */
+/* */
+/* flags -> relevant are IPN_UDP/IPN_TCP/IPN_ICMPQUERY that indicate if */
+/* the packet is of said protocol */
+/* ------------------------------------------------------------------------ */
+nat_t *nat_inlookup(fin, flags, p, src, mapdst)
+fr_info_t *fin;
+u_int flags, p;
+struct in_addr src , mapdst;
+{
+ u_short sport, dport;
+ grehdr_t *gre;
+ ipnat_t *ipn;
+ u_int sflags;
+ nat_t *nat;
+ int nflags;
+ u_32_t dst;
+ void *ifp;
+ u_int hv;
+
+ ifp = fin->fin_ifp;
+ sport = 0;
+ dport = 0;
+ gre = NULL;
+ dst = mapdst.s_addr;
+ sflags = flags & NAT_TCPUDPICMP;
+
+ switch (p)
+ {
+ case IPPROTO_TCP :
+ case IPPROTO_UDP :
+ sport = htons(fin->fin_data[0]);
+ dport = htons(fin->fin_data[1]);
+ break;
+ case IPPROTO_ICMP :
+ if (flags & IPN_ICMPERR)
+ sport = fin->fin_data[1];
+ else
+ dport = fin->fin_data[1];
+ break;
+ default :
+ break;
+ }
+
+
+ if ((flags & SI_WILDP) != 0)
+ goto find_in_wild_ports;
+
+ hv = NAT_HASH_FN(dst, dport, 0xffffffff);
+ hv = NAT_HASH_FN(src.s_addr, hv + sport, ipf_nattable_sz);
+ nat = nat_table[1][hv];
+ for (; nat; nat = nat->nat_hnext[1]) {
+ if (nat->nat_ifps[0] != NULL) {
+ if ((ifp != NULL) && (ifp != nat->nat_ifps[0]))
+ continue;
+ } else if (ifp != NULL)
+ nat->nat_ifps[0] = ifp;
+
+ nflags = nat->nat_flags;
+
+ if (nat->nat_oip.s_addr == src.s_addr &&
+ nat->nat_outip.s_addr == dst &&
+ (((p == 0) &&
+ (sflags == (nat->nat_flags & IPN_TCPUDPICMP)))
+ || (p == nat->nat_p))) {
+ switch (p)
+ {
+#if 0
+ case IPPROTO_GRE :
+ if (nat->nat_call[1] != fin->fin_data[0])
+ continue;
+ break;
+#endif
+ case IPPROTO_ICMP :
+ if ((flags & IPN_ICMPERR) != 0) {
+ if (nat->nat_outport != sport)
+ continue;
+ } else {
+ if (nat->nat_outport != dport)
+ continue;
+ }
+ break;
+ case IPPROTO_TCP :
+ case IPPROTO_UDP :
+ if (nat->nat_oport != sport)
+ continue;
+ if (nat->nat_outport != dport)
+ continue;
+ break;
+ default :
+ break;
+ }
+
+ ipn = nat->nat_ptr;
+ if ((ipn != NULL) && (nat->nat_aps != NULL))
+ if (appr_match(fin, nat) != 0)
+ continue;
+ return nat;
+ }
+ }
+
+ /*
+ * So if we didn't find it but there are wildcard members in the hash
+ * table, go back and look for them. We do this search and update here
+ * because it is modifying the NAT table and we want to do this only
+ * for the first packet that matches. The exception, of course, is
+ * for "dummy" (FI_IGNORE) lookups.
+ */
+find_in_wild_ports:
+ if (!(flags & NAT_TCPUDP) || !(flags & NAT_SEARCH))
+ return NULL;
+ if (nat_stats.ns_wilds == 0)
+ return NULL;
+
+ RWLOCK_EXIT(&ipf_nat);
+
+ hv = NAT_HASH_FN(dst, 0, 0xffffffff);
+ hv = NAT_HASH_FN(src.s_addr, hv, ipf_nattable_sz);
+
+ WRITE_ENTER(&ipf_nat);
+
+ nat = nat_table[1][hv];
+ for (; nat; nat = nat->nat_hnext[1]) {
+ if (nat->nat_ifps[0] != NULL) {
+ if ((ifp != NULL) && (ifp != nat->nat_ifps[0]))
+ continue;
+ } else if (ifp != NULL)
+ nat->nat_ifps[0] = ifp;
+
+ if (nat->nat_p != fin->fin_p)
+ continue;
+ if (nat->nat_oip.s_addr != src.s_addr ||
+ nat->nat_outip.s_addr != dst)
+ continue;
+
+ nflags = nat->nat_flags;
+ if (!(nflags & (NAT_TCPUDP|SI_WILDP)))
+ continue;
+
+ if (nat_wildok(nat, (int)sport, (int)dport, nflags,
+ NAT_INBOUND) == 1) {
+ if ((fin->fin_flx & FI_IGNORE) != 0)
+ break;
+ if ((nflags & SI_CLONE) != 0) {
+ nat = fr_natclone(fin, nat);
+ if (nat == NULL)
+ break;
+ } else {
+ MUTEX_ENTER(&ipf_nat_new);
+ nat_stats.ns_wilds--;
+ MUTEX_EXIT(&ipf_nat_new);
+ }
+ nat->nat_oport = sport;
+ nat->nat_outport = dport;
+ nat->nat_flags &= ~(SI_W_DPORT|SI_W_SPORT);
+ nat_tabmove(nat);
+ break;
+ }
+ }
+
+ MUTEX_DOWNGRADE(&ipf_nat);
+
+ return nat;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_tabmove */
+/* Returns: Nil */
+/* Parameters: nat(I) - pointer to NAT structure */
+/* Write Lock: ipf_nat */
+/* */
+/* This function is only called for TCP/UDP NAT table entries where the */
+/* original was placed in the table without hashing on the ports and we now */
+/* want to include hashing on port numbers. */
+/* ------------------------------------------------------------------------ */
+static void nat_tabmove(nat)
+nat_t *nat;
+{
+ nat_t **natp;
+ u_int hv;
+
+ if (nat->nat_flags & SI_CLONE)
+ return;
+
+ /*
+ * Remove the NAT entry from the old location
+ */
+ if (nat->nat_hnext[0])
+ nat->nat_hnext[0]->nat_phnext[0] = nat->nat_phnext[0];
+ *nat->nat_phnext[0] = nat->nat_hnext[0];
+ nat_stats.ns_bucketlen[0][nat->nat_hv[0]]--;
+
+ if (nat->nat_hnext[1])
+ nat->nat_hnext[1]->nat_phnext[1] = nat->nat_phnext[1];
+ *nat->nat_phnext[1] = nat->nat_hnext[1];
+ nat_stats.ns_bucketlen[1][nat->nat_hv[1]]--;
+
+ /*
+ * Add into the NAT table in the new position
+ */
+ hv = NAT_HASH_FN(nat->nat_inip.s_addr, nat->nat_inport, 0xffffffff);
+ hv = NAT_HASH_FN(nat->nat_oip.s_addr, hv + nat->nat_oport,
+ ipf_nattable_sz);
+ nat->nat_hv[0] = hv;
+ natp = &nat_table[0][hv];
+ if (*natp)
+ (*natp)->nat_phnext[0] = &nat->nat_hnext[0];
+ nat->nat_phnext[0] = natp;
+ nat->nat_hnext[0] = *natp;
+ *natp = nat;
+ nat_stats.ns_bucketlen[0][hv]++;
+
+ hv = NAT_HASH_FN(nat->nat_outip.s_addr, nat->nat_outport, 0xffffffff);
+ hv = NAT_HASH_FN(nat->nat_oip.s_addr, hv + nat->nat_oport,
+ ipf_nattable_sz);
+ nat->nat_hv[1] = hv;
+ natp = &nat_table[1][hv];
+ if (*natp)
+ (*natp)->nat_phnext[1] = &nat->nat_hnext[1];
+ nat->nat_phnext[1] = natp;
+ nat->nat_hnext[1] = *natp;
+ *natp = nat;
+ nat_stats.ns_bucketlen[1][hv]++;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_outlookup */
+/* Returns: nat_t* - NULL == no match, */
+/* else pointer to matching NAT entry */
+/* Parameters: fin(I) - pointer to packet information */
+/* flags(I) - NAT flags for this packet */
+/* p(I) - protocol for this packet */
+/* src(I) - source IP address */
+/* dst(I) - destination IP address */
+/* rw(I) - 1 == write lock on ipf_nat held, 0 == read lock. */
+/* */
+/* Lookup a nat entry based on the source 'real' ip address/port and */
+/* destination address/port. We use this lookup when sending a packet out, */
+/* we're looking for a table entry, based on the source address. */
+/* */
+/* NOTE: THE PACKET BEING CHECKED (IF FOUND) HAS A MAPPING ALREADY. */
+/* */
+/* NOTE: IT IS ASSUMED THAT ipf_nat IS ONLY HELD WITH A READ LOCK WHEN */
+/* THIS FUNCTION IS CALLED WITH NAT_SEARCH SET IN nflags. */
+/* */
+/* flags -> relevant are IPN_UDP/IPN_TCP/IPN_ICMPQUERY that indicate if */
+/* the packet is of said protocol */
+/* ------------------------------------------------------------------------ */
+nat_t *nat_outlookup(fin, flags, p, src, dst)
+fr_info_t *fin;
+u_int flags, p;
+struct in_addr src , dst;
+{
+ u_short sport, dport;
+ u_int sflags;
+ ipnat_t *ipn;
+ u_32_t srcip;
+ nat_t *nat;
+ int nflags;
+ void *ifp;
+ u_int hv;
+
+ ifp = fin->fin_ifp;
+ srcip = src.s_addr;
+ sflags = flags & IPN_TCPUDPICMP;
+ sport = 0;
+ dport = 0;
+
+ switch (p)
+ {
+ case IPPROTO_TCP :
+ case IPPROTO_UDP :
+ sport = htons(fin->fin_data[0]);
+ dport = htons(fin->fin_data[1]);
+ break;
+ case IPPROTO_ICMP :
+ if (flags & IPN_ICMPERR)
+ sport = fin->fin_data[1];
+ else
+ dport = fin->fin_data[1];
+ break;
+ default :
+ break;
+ }
+
+ if ((flags & SI_WILDP) != 0)
+ goto find_out_wild_ports;
+
+ hv = NAT_HASH_FN(srcip, sport, 0xffffffff);
+ hv = NAT_HASH_FN(dst.s_addr, hv + dport, ipf_nattable_sz);
+ nat = nat_table[0][hv];
+ for (; nat; nat = nat->nat_hnext[0]) {
+ if (nat->nat_ifps[1] != NULL) {
+ if ((ifp != NULL) && (ifp != nat->nat_ifps[1]))
+ continue;
+ } else if (ifp != NULL)
+ nat->nat_ifps[1] = ifp;
+
+ nflags = nat->nat_flags;
+
+ if (nat->nat_inip.s_addr == srcip &&
+ nat->nat_oip.s_addr == dst.s_addr &&
+ (((p == 0) && (sflags == (nflags & NAT_TCPUDPICMP)))
+ || (p == nat->nat_p))) {
+ switch (p)
+ {
+#if 0
+ case IPPROTO_GRE :
+ if (nat->nat_call[1] != fin->fin_data[0])
+ continue;
+ break;
+#endif
+ case IPPROTO_TCP :
+ case IPPROTO_UDP :
+ if (nat->nat_oport != dport)
+ continue;
+ if (nat->nat_inport != sport)
+ continue;
+ break;
+ default :
+ break;
+ }
+
+ ipn = nat->nat_ptr;
+ if ((ipn != NULL) && (nat->nat_aps != NULL))
+ if (appr_match(fin, nat) != 0)
+ continue;
+ return nat;
+ }
+ }
+
+ /*
+ * So if we didn't find it but there are wildcard members in the hash
+ * table, go back and look for them. We do this search and update here
+ * because it is modifying the NAT table and we want to do this only
+ * for the first packet that matches. The exception, of course, is
+ * for "dummy" (FI_IGNORE) lookups.
+ */
+find_out_wild_ports:
+ if (!(flags & NAT_TCPUDP) || !(flags & NAT_SEARCH))
+ return NULL;
+ if (nat_stats.ns_wilds == 0)
+ return NULL;
+
+ RWLOCK_EXIT(&ipf_nat);
+
+ hv = NAT_HASH_FN(srcip, 0, 0xffffffff);
+ hv = NAT_HASH_FN(dst.s_addr, hv, ipf_nattable_sz);
+
+ WRITE_ENTER(&ipf_nat);
+
+ nat = nat_table[0][hv];
+ for (; nat; nat = nat->nat_hnext[0]) {
+ if (nat->nat_ifps[1] != NULL) {
+ if ((ifp != NULL) && (ifp != nat->nat_ifps[1]))
+ continue;
+ } else if (ifp != NULL)
+ nat->nat_ifps[1] = ifp;
+
+ if (nat->nat_p != fin->fin_p)
+ continue;
+ if ((nat->nat_inip.s_addr != srcip) ||
+ (nat->nat_oip.s_addr != dst.s_addr))
+ continue;
+
+ nflags = nat->nat_flags;
+ if (!(nflags & (NAT_TCPUDP|SI_WILDP)))
+ continue;
+
+ if (nat_wildok(nat, (int)sport, (int)dport, nflags,
+ NAT_OUTBOUND) == 1) {
+ if ((fin->fin_flx & FI_IGNORE) != 0)
+ break;
+ if ((nflags & SI_CLONE) != 0) {
+ nat = fr_natclone(fin, nat);
+ if (nat == NULL)
+ break;
+ } else {
+ MUTEX_ENTER(&ipf_nat_new);
+ nat_stats.ns_wilds--;
+ MUTEX_EXIT(&ipf_nat_new);
+ }
+ nat->nat_inport = sport;
+ nat->nat_oport = dport;
+ if (nat->nat_outport == 0)
+ nat->nat_outport = sport;
+ nat->nat_flags &= ~(SI_W_DPORT|SI_W_SPORT);
+ nat_tabmove(nat);
+ break;
+ }
+ }
+
+ MUTEX_DOWNGRADE(&ipf_nat);
+
+ return nat;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_lookupredir */
+/* Returns: nat_t* - NULL == no match, */
+/* else pointer to matching NAT entry */
+/* Parameters: np(I) - pointer to description of packet to find NAT table */
+/* entry for. */
+/* */
+/* Lookup the NAT tables to search for a matching redirect */
+/* The contents of natlookup_t should imitate those found in a packet that */
+/* would be translated - ie a packet coming in for RDR or going out for MAP.*/
+/* We can do the lookup in one of two ways, imitating an inbound or */
+/* outbound packet. By default we assume outbound, unless IPN_IN is set. */
+/* For IN, the fields are set as follows: */
+/* nl_real* = source information */
+/* nl_out* = destination information (translated) */
+/* For an out packet, the fields are set like this: */
+/* nl_in* = source information (untranslated) */
+/* nl_out* = destination information (translated) */
+/* ------------------------------------------------------------------------ */
+nat_t *nat_lookupredir(np)
+natlookup_t *np;
+{
+ fr_info_t fi;
+ nat_t *nat;
+
+ bzero((char *)&fi, sizeof(fi));
+ if (np->nl_flags & IPN_IN) {
+ fi.fin_data[0] = ntohs(np->nl_realport);
+ fi.fin_data[1] = ntohs(np->nl_outport);
+ } else {
+ fi.fin_data[0] = ntohs(np->nl_inport);
+ fi.fin_data[1] = ntohs(np->nl_outport);
+ }
+ if (np->nl_flags & IPN_TCP)
+ fi.fin_p = IPPROTO_TCP;
+ else if (np->nl_flags & IPN_UDP)
+ fi.fin_p = IPPROTO_UDP;
+ else if (np->nl_flags & (IPN_ICMPERR|IPN_ICMPQUERY))
+ fi.fin_p = IPPROTO_ICMP;
+
+ /*
+ * We can do two sorts of lookups:
+ * - IPN_IN: we have the `real' and `out' address, look for `in'.
+ * - default: we have the `in' and `out' address, look for `real'.
+ */
+ if (np->nl_flags & IPN_IN) {
+ if ((nat = nat_inlookup(&fi, np->nl_flags, fi.fin_p,
+ np->nl_realip, np->nl_outip))) {
+ np->nl_inip = nat->nat_inip;
+ np->nl_inport = nat->nat_inport;
+ }
+ } else {
+ /*
+ * If nl_inip is non null, this is a lookup based on the real
+ * ip address. Else, we use the fake.
+ */
+ if ((nat = nat_outlookup(&fi, np->nl_flags, fi.fin_p,
+ np->nl_inip, np->nl_outip))) {
+
+ if ((np->nl_flags & IPN_FINDFORWARD) != 0) {
+ fr_info_t fin;
+ bzero((char *)&fin, sizeof(fin));
+ fin.fin_p = nat->nat_p;
+ fin.fin_data[0] = ntohs(nat->nat_outport);
+ fin.fin_data[1] = ntohs(nat->nat_oport);
+ if (nat_inlookup(&fin, np->nl_flags, fin.fin_p,
+ nat->nat_outip,
+ nat->nat_oip) != NULL) {
+ np->nl_flags &= ~IPN_FINDFORWARD;
+ }
+ }
+
+ np->nl_realip = nat->nat_outip;
+ np->nl_realport = nat->nat_outport;
+ }
+ }
+
+ return nat;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_match */
+/* Returns: int - 0 == no match, 1 == match */
+/* Parameters: fin(I) - pointer to packet information */
+/* np(I) - pointer to NAT rule */
+/* */
+/* Pull the matching of a packet against a NAT rule out of that complex */
+/* loop inside fr_checknatin() and lay it out properly in its own function. */
+/* ------------------------------------------------------------------------ */
+static int nat_match(fin, np)
+fr_info_t *fin;
+ipnat_t *np;
+{
+ frtuc_t *ft;
+
+ if (fin->fin_v != 4)
+ return 0;
+
+ if (np->in_p && fin->fin_p != np->in_p)
+ return 0;
+
+ if (fin->fin_out) {
+ if (!(np->in_redir & (NAT_MAP|NAT_MAPBLK)))
+ return 0;
+ if (((fin->fin_fi.fi_saddr & np->in_inmsk) != np->in_inip)
+ ^ ((np->in_flags & IPN_NOTSRC) != 0))
+ return 0;
+ if (((fin->fin_fi.fi_daddr & np->in_srcmsk) != np->in_srcip)
+ ^ ((np->in_flags & IPN_NOTDST) != 0))
+ return 0;
+ } else {
+ if (!(np->in_redir & NAT_REDIRECT))
+ return 0;
+ if (((fin->fin_fi.fi_saddr & np->in_srcmsk) != np->in_srcip)
+ ^ ((np->in_flags & IPN_NOTSRC) != 0))
+ return 0;
+ if (((fin->fin_fi.fi_daddr & np->in_outmsk) != np->in_outip)
+ ^ ((np->in_flags & IPN_NOTDST) != 0))
+ return 0;
+ }
+
+ ft = &np->in_tuc;
+ if (!(fin->fin_flx & FI_TCPUDP) ||
+ (fin->fin_flx & (FI_SHORT|FI_FRAGBODY))) {
+ if (ft->ftu_scmp || ft->ftu_dcmp)
+ return 0;
+ return 1;
+ }
+
+ return fr_tcpudpchk(fin, ft);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_update */
+/* Returns: Nil */
+/* Parameters: nat(I) - pointer to NAT structure */
+/* np(I) - pointer to NAT rule */
+/* */
+/* Updates the lifetime of a NAT table entry for non-TCP packets. Must be */
+/* called with fin_rev updated - i.e. after calling nat_proto(). */
+/* ------------------------------------------------------------------------ */
+void nat_update(fin, nat, np)
+fr_info_t *fin;
+nat_t *nat;
+ipnat_t *np;
+{
+ ipftq_t *ifq, *ifq2;
+ ipftqent_t *tqe;
+
+ MUTEX_ENTER(&nat->nat_lock);
+ tqe = &nat->nat_tqe;
+ ifq = tqe->tqe_ifq;
+
+ /*
+ * We allow over-riding of NAT timeouts from NAT rules, even for
+ * TCP, however, if it is TCP and there is no rule timeout set,
+ * then do not update the timeout here.
+ */
+ if (np != NULL)
+ ifq2 = np->in_tqehead[fin->fin_rev];
+ else
+ ifq2 = NULL;
+
+ if (nat->nat_p == IPPROTO_TCP && ifq2 == NULL) {
+ (void) fr_tcp_age(&nat->nat_tqe, fin, nat_tqb, 0);
+ } else {
+ if (ifq2 == NULL) {
+ if (nat->nat_p == IPPROTO_UDP)
+ ifq2 = &nat_udptq;
+ else if (nat->nat_p == IPPROTO_ICMP)
+ ifq2 = &nat_icmptq;
+ else
+ ifq2 = &nat_iptq;
+ }
+
+ fr_movequeue(tqe, ifq, ifq2);
+ }
+ MUTEX_EXIT(&nat->nat_lock);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_checknatout */
+/* Returns: int - -1 == packet failed NAT checks so block it, */
+/* 0 == no packet translation occurred, */
+/* 1 == packet was successfully translated. */
+/* Parameters: fin(I) - pointer to packet information */
+/* passp(I) - pointer to filtering result flags */
+/* */
+/* Check to see if an outcoming packet should be changed. ICMP packets are */
+/* first checked to see if they match an existing entry (if an error), */
+/* otherwise a search of the current NAT table is made. If neither results */
+/* in a match then a search for a matching NAT rule is made. Create a new */
+/* NAT entry if a we matched a NAT rule. Lastly, actually change the */
+/* packet header(s) as required. */
+/* ------------------------------------------------------------------------ */
+int fr_checknatout(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ struct ifnet *ifp, *sifp;
+ icmphdr_t *icmp = NULL;
+ tcphdr_t *tcp = NULL;
+ int rval, natfailed;
+ ipnat_t *np = NULL;
+ u_int nflags = 0;
+ u_32_t ipa, iph;
+ int natadd = 1;
+ frentry_t *fr;
+ nat_t *nat;
+
+ if (nat_stats.ns_rules == 0 || fr_nat_lock != 0)
+ return 0;
+
+ natfailed = 0;
+ fr = fin->fin_fr;
+ sifp = fin->fin_ifp;
+ if (fr != NULL) {
+ ifp = fr->fr_tifs[fin->fin_rev].fd_ifp;
+ if ((ifp != NULL) && (ifp != (void *)-1))
+ fin->fin_ifp = ifp;
+ }
+ ifp = fin->fin_ifp;
+
+ if (!(fin->fin_flx & FI_SHORT) && (fin->fin_off == 0)) {
+ switch (fin->fin_p)
+ {
+ case IPPROTO_TCP :
+ nflags = IPN_TCP;
+ break;
+ case IPPROTO_UDP :
+ nflags = IPN_UDP;
+ break;
+ case IPPROTO_ICMP :
+ icmp = fin->fin_dp;
+
+ /*
+ * This is an incoming packet, so the destination is
+ * the icmp_id and the source port equals 0
+ */
+ if (nat_icmpquerytype4(icmp->icmp_type))
+ nflags = IPN_ICMPQUERY;
+ break;
+ default :
+ break;
+ }
+
+ if ((nflags & IPN_TCPUDP))
+ tcp = fin->fin_dp;
+ }
+
+ ipa = fin->fin_saddr;
+
+ READ_ENTER(&ipf_nat);
+
+ if ((fin->fin_p == IPPROTO_ICMP) && !(nflags & IPN_ICMPQUERY) &&
+ (nat = nat_icmperror(fin, &nflags, NAT_OUTBOUND)))
+ /*EMPTY*/;
+ else if ((fin->fin_flx & FI_FRAG) && (nat = fr_nat_knownfrag(fin)))
+ natadd = 0;
+ else if ((nat = nat_outlookup(fin, nflags|NAT_SEARCH, (u_int)fin->fin_p,
+ fin->fin_src, fin->fin_dst))) {
+ nflags = nat->nat_flags;
+ } else {
+ u_32_t hv, msk, nmsk;
+
+ /*
+ * If there is no current entry in the nat table for this IP#,
+ * create one for it (if there is a matching rule).
+ */
+ RWLOCK_EXIT(&ipf_nat);
+ msk = 0xffffffff;
+ nmsk = nat_masks;
+ WRITE_ENTER(&ipf_nat);
+maskloop:
+ iph = ipa & htonl(msk);
+ hv = NAT_HASH_FN(iph, 0, ipf_natrules_sz);
+ for (np = nat_rules[hv]; np; np = np->in_mnext)
+ {
+ if ((np->in_ifps[1] && (np->in_ifps[1] != ifp)))
+ continue;
+ if (np->in_v != fin->fin_v)
+ continue;
+ if (np->in_p && (np->in_p != fin->fin_p))
+ continue;
+ if ((np->in_flags & IPN_RF) && !(np->in_flags & nflags))
+ continue;
+ if (np->in_flags & IPN_FILTER) {
+ if (!nat_match(fin, np))
+ continue;
+ } else if ((ipa & np->in_inmsk) != np->in_inip)
+ continue;
+
+ if ((fr != NULL) &&
+ !fr_matchtag(&np->in_tag, &fr->fr_nattag))
+ continue;
+
+ if (*np->in_plabel != '\0') {
+ if (((np->in_flags & IPN_FILTER) == 0) &&
+ (np->in_dport != tcp->th_dport))
+ continue;
+ if (appr_ok(fin, tcp, np) == 0)
+ continue;
+ }
+
+ if ((nat = nat_new(fin, np, NULL, nflags,
+ NAT_OUTBOUND))) {
+ np->in_hits++;
+ break;
+ } else
+ natfailed = -1;
+ }
+ if ((np == NULL) && (nmsk != 0)) {
+ while (nmsk) {
+ msk <<= 1;
+ if (nmsk & 0x80000000)
+ break;
+ nmsk <<= 1;
+ }
+ if (nmsk != 0) {
+ nmsk <<= 1;
+ goto maskloop;
+ }
+ }
+ MUTEX_DOWNGRADE(&ipf_nat);
+ }
+
+ if (nat != NULL) {
+ rval = fr_natout(fin, nat, natadd, nflags);
+ if (rval == 1) {
+ MUTEX_ENTER(&nat->nat_lock);
+ nat->nat_ref++;
+ MUTEX_EXIT(&nat->nat_lock);
+ nat->nat_touched = fr_ticks;
+ fin->fin_nat = nat;
+ }
+ } else
+ rval = natfailed;
+ RWLOCK_EXIT(&ipf_nat);
+
+ if (rval == -1) {
+ if (passp != NULL)
+ *passp = FR_BLOCK;
+ fin->fin_flx |= FI_BADNAT;
+ }
+ fin->fin_ifp = sifp;
+ return rval;
+}
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natout */
+/* Returns: int - -1 == packet failed NAT checks so block it, */
+/* 1 == packet was successfully translated. */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT structure */
+/* natadd(I) - flag indicating if it is safe to add frag cache */
+/* nflags(I) - NAT flags set for this packet */
+/* */
+/* Translate a packet coming "out" on an interface. */
+/* ------------------------------------------------------------------------ */
+int fr_natout(fin, nat, natadd, nflags)
+fr_info_t *fin;
+nat_t *nat;
+int natadd;
+u_32_t nflags;
+{
+ icmphdr_t *icmp;
+ u_short *csump;
+ tcphdr_t *tcp;
+ ipnat_t *np;
+ int i;
+
+ tcp = NULL;
+ icmp = NULL;
+ csump = NULL;
+ np = nat->nat_ptr;
+
+ if ((natadd != 0) && (fin->fin_flx & FI_FRAG) && (np != NULL))
+ (void) fr_nat_newfrag(fin, 0, nat);
+
+ MUTEX_ENTER(&nat->nat_lock);
+ nat->nat_bytes[1] += fin->fin_plen;
+ nat->nat_pkts[1]++;
+ MUTEX_EXIT(&nat->nat_lock);
+
+ /*
+ * Fix up checksums, not by recalculating them, but
+ * simply computing adjustments.
+ * This is only done for STREAMS based IP implementations where the
+ * checksum has already been calculated by IP. In all other cases,
+ * IPFilter is called before the checksum needs calculating so there
+ * is no call to modify whatever is in the header now.
+ */
+ if (fin->fin_v == 4) {
+ if (nflags == IPN_ICMPERR) {
+ u_32_t s1, s2, sumd;
+
+ s1 = LONG_SUM(ntohl(fin->fin_saddr));
+ s2 = LONG_SUM(ntohl(nat->nat_outip.s_addr));
+ CALC_SUMD(s1, s2, sumd);
+ fix_outcksum(fin, &fin->fin_ip->ip_sum, sumd);
+ }
+#if !defined(_KERNEL) || defined(MENTAT) || defined(__sgi) || \
+ defined(linux) || defined(BRIDGE_IPF)
+ else {
+ /*
+ * Strictly speaking, this isn't necessary on BSD
+ * kernels because they do checksum calculation after
+ * this code has run BUT if ipfilter is being used
+ * to do NAT as a bridge, that code doesn't exist.
+ */
+ if (nat->nat_dir == NAT_OUTBOUND)
+ fix_outcksum(fin, &fin->fin_ip->ip_sum,
+ nat->nat_ipsumd);
+ else
+ fix_incksum(fin, &fin->fin_ip->ip_sum,
+ nat->nat_ipsumd);
+ }
+#endif
+ }
+
+ if (!(fin->fin_flx & FI_SHORT) && (fin->fin_off == 0)) {
+ if ((nat->nat_outport != 0) && (nflags & IPN_TCPUDP)) {
+ tcp = fin->fin_dp;
+
+ tcp->th_sport = nat->nat_outport;
+ fin->fin_data[0] = ntohs(nat->nat_outport);
+ }
+
+ if ((nat->nat_outport != 0) && (nflags & IPN_ICMPQUERY)) {
+ icmp = fin->fin_dp;
+ icmp->icmp_id = nat->nat_outport;
+ }
+
+ csump = nat_proto(fin, nat, nflags);
+ }
+
+ fin->fin_ip->ip_src = nat->nat_outip;
+
+ nat_update(fin, nat, np);
+
+ /*
+ * The above comments do not hold for layer 4 (or higher) checksums...
+ */
+ if (csump != NULL) {
+ if (nat->nat_dir == NAT_OUTBOUND)
+ fix_outcksum(fin, csump, nat->nat_sumd[1]);
+ else
+ fix_incksum(fin, csump, nat->nat_sumd[1]);
+ }
+#ifdef IPFILTER_SYNC
+ ipfsync_update(SMC_NAT, fin, nat->nat_sync);
+#endif
+ /* ------------------------------------------------------------- */
+ /* A few quick notes: */
+ /* Following are test conditions prior to calling the */
+ /* appr_check routine. */
+ /* */
+ /* A NULL tcp indicates a non TCP/UDP packet. When dealing */
+ /* with a redirect rule, we attempt to match the packet's */
+ /* source port against in_dport, otherwise we'd compare the */
+ /* packet's destination. */
+ /* ------------------------------------------------------------- */
+ if ((np != NULL) && (np->in_apr != NULL)) {
+ i = appr_check(fin, nat);
+ if (i == 0)
+ i = 1;
+ } else
+ i = 1;
+ ATOMIC_INCL(nat_stats.ns_mapped[1]);
+ fin->fin_flx |= FI_NATED;
+ return i;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_checknatin */
+/* Returns: int - -1 == packet failed NAT checks so block it, */
+/* 0 == no packet translation occurred, */
+/* 1 == packet was successfully translated. */
+/* Parameters: fin(I) - pointer to packet information */
+/* passp(I) - pointer to filtering result flags */
+/* */
+/* Check to see if an incoming packet should be changed. ICMP packets are */
+/* first checked to see if they match an existing entry (if an error), */
+/* otherwise a search of the current NAT table is made. If neither results */
+/* in a match then a search for a matching NAT rule is made. Create a new */
+/* NAT entry if a we matched a NAT rule. Lastly, actually change the */
+/* packet header(s) as required. */
+/* ------------------------------------------------------------------------ */
+int fr_checknatin(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ u_int nflags, natadd;
+ int rval, natfailed;
+ struct ifnet *ifp;
+ struct in_addr in;
+ icmphdr_t *icmp;
+ tcphdr_t *tcp;
+ u_short dport;
+ ipnat_t *np;
+ nat_t *nat;
+ u_32_t iph;
+
+ if (nat_stats.ns_rules == 0 || fr_nat_lock != 0)
+ return 0;
+
+ tcp = NULL;
+ icmp = NULL;
+ dport = 0;
+ natadd = 1;
+ nflags = 0;
+ natfailed = 0;
+ ifp = fin->fin_ifp;
+
+ if (!(fin->fin_flx & FI_SHORT) && (fin->fin_off == 0)) {
+ switch (fin->fin_p)
+ {
+ case IPPROTO_TCP :
+ nflags = IPN_TCP;
+ break;
+ case IPPROTO_UDP :
+ nflags = IPN_UDP;
+ break;
+ case IPPROTO_ICMP :
+ icmp = fin->fin_dp;
+
+ /*
+ * This is an incoming packet, so the destination is
+ * the icmp_id and the source port equals 0
+ */
+ if (nat_icmpquerytype4(icmp->icmp_type)) {
+ nflags = IPN_ICMPQUERY;
+ dport = icmp->icmp_id;
+ } break;
+ default :
+ break;
+ }
+
+ if ((nflags & IPN_TCPUDP)) {
+ tcp = fin->fin_dp;
+ dport = tcp->th_dport;
+ }
+ }
+
+ in = fin->fin_dst;
+
+ READ_ENTER(&ipf_nat);
+
+ if ((fin->fin_p == IPPROTO_ICMP) && !(nflags & IPN_ICMPQUERY) &&
+ (nat = nat_icmperror(fin, &nflags, NAT_INBOUND)))
+ /*EMPTY*/;
+ else if ((fin->fin_flx & FI_FRAG) && (nat = fr_nat_knownfrag(fin)))
+ natadd = 0;
+ else if ((nat = nat_inlookup(fin, nflags|NAT_SEARCH, (u_int)fin->fin_p,
+ fin->fin_src, in))) {
+ nflags = nat->nat_flags;
+ } else {
+ u_32_t hv, msk, rmsk;
+
+ RWLOCK_EXIT(&ipf_nat);
+ rmsk = rdr_masks;
+ msk = 0xffffffff;
+ WRITE_ENTER(&ipf_nat);
+ /*
+ * If there is no current entry in the nat table for this IP#,
+ * create one for it (if there is a matching rule).
+ */
+maskloop:
+ iph = in.s_addr & htonl(msk);
+ hv = NAT_HASH_FN(iph, 0, ipf_rdrrules_sz);
+ for (np = rdr_rules[hv]; np; np = np->in_rnext) {
+ if (np->in_ifps[0] && (np->in_ifps[0] != ifp))
+ continue;
+ if (np->in_v != fin->fin_v)
+ continue;
+ if (np->in_p && (np->in_p != fin->fin_p))
+ continue;
+ if ((np->in_flags & IPN_RF) && !(np->in_flags & nflags))
+ continue;
+ if (np->in_flags & IPN_FILTER) {
+ if (!nat_match(fin, np))
+ continue;
+ } else {
+ if ((in.s_addr & np->in_outmsk) != np->in_outip)
+ continue;
+ if (np->in_pmin &&
+ ((ntohs(np->in_pmax) < ntohs(dport)) ||
+ (ntohs(dport) < ntohs(np->in_pmin))))
+ continue;
+ }
+
+ if (*np->in_plabel != '\0') {
+ if (!appr_ok(fin, tcp, np)) {
+ continue;
+ }
+ }
+
+ nat = nat_new(fin, np, NULL, nflags, NAT_INBOUND);
+ if (nat != NULL) {
+ np->in_hits++;
+ break;
+ } else
+ natfailed = -1;
+ }
+
+ if ((np == NULL) && (rmsk != 0)) {
+ while (rmsk) {
+ msk <<= 1;
+ if (rmsk & 0x80000000)
+ break;
+ rmsk <<= 1;
+ }
+ if (rmsk != 0) {
+ rmsk <<= 1;
+ goto maskloop;
+ }
+ }
+ MUTEX_DOWNGRADE(&ipf_nat);
+ }
+ if (nat != NULL) {
+ rval = fr_natin(fin, nat, natadd, nflags);
+ if (rval == 1) {
+ MUTEX_ENTER(&nat->nat_lock);
+ nat->nat_ref++;
+ MUTEX_EXIT(&nat->nat_lock);
+ nat->nat_touched = fr_ticks;
+ fin->fin_nat = nat;
+ }
+ } else
+ rval = natfailed;
+ RWLOCK_EXIT(&ipf_nat);
+
+ if (rval == -1) {
+ if (passp != NULL)
+ *passp = FR_BLOCK;
+ fin->fin_flx |= FI_BADNAT;
+ }
+ return rval;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natin */
+/* Returns: int - -1 == packet failed NAT checks so block it, */
+/* 1 == packet was successfully translated. */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT structure */
+/* natadd(I) - flag indicating if it is safe to add frag cache */
+/* nflags(I) - NAT flags set for this packet */
+/* Locks Held: ipf_nat (READ) */
+/* */
+/* Translate a packet coming "in" on an interface. */
+/* ------------------------------------------------------------------------ */
+int fr_natin(fin, nat, natadd, nflags)
+fr_info_t *fin;
+nat_t *nat;
+int natadd;
+u_32_t nflags;
+{
+ icmphdr_t *icmp;
+ u_short *csump;
+ tcphdr_t *tcp;
+ ipnat_t *np;
+ int i;
+
+ tcp = NULL;
+ csump = NULL;
+ np = nat->nat_ptr;
+ fin->fin_fr = nat->nat_fr;
+
+ if (np != NULL) {
+ if ((natadd != 0) && (fin->fin_flx & FI_FRAG))
+ (void) fr_nat_newfrag(fin, 0, nat);
+
+ /* ------------------------------------------------------------- */
+ /* A few quick notes: */
+ /* Following are test conditions prior to calling the */
+ /* appr_check routine. */
+ /* */
+ /* A NULL tcp indicates a non TCP/UDP packet. When dealing */
+ /* with a map rule, we attempt to match the packet's */
+ /* source port against in_dport, otherwise we'd compare the */
+ /* packet's destination. */
+ /* ------------------------------------------------------------- */
+ if (np->in_apr != NULL) {
+ i = appr_check(fin, nat);
+ if (i == -1) {
+ return -1;
+ }
+ }
+ }
+
+#ifdef IPFILTER_SYNC
+ ipfsync_update(SMC_NAT, fin, nat->nat_sync);
+#endif
+
+ MUTEX_ENTER(&nat->nat_lock);
+ nat->nat_bytes[0] += fin->fin_plen;
+ nat->nat_pkts[0]++;
+ MUTEX_EXIT(&nat->nat_lock);
+
+ fin->fin_ip->ip_dst = nat->nat_inip;
+ fin->fin_fi.fi_daddr = nat->nat_inip.s_addr;
+ if (nflags & IPN_TCPUDP)
+ tcp = fin->fin_dp;
+
+ /*
+ * Fix up checksums, not by recalculating them, but
+ * simply computing adjustments.
+ * Why only do this for some platforms on inbound packets ?
+ * Because for those that it is done, IP processing is yet to happen
+ * and so the IPv4 header checksum has not yet been evaluated.
+ * Perhaps it should always be done for the benefit of things like
+ * fast forwarding (so that it doesn't need to be recomputed) but with
+ * header checksum offloading, perhaps it is a moot point.
+ */
+#if !defined(_KERNEL) || defined(MENTAT) || defined(__sgi) || \
+ defined(__osf__) || defined(linux)
+ if (nat->nat_dir == NAT_OUTBOUND)
+ fix_incksum(fin, &fin->fin_ip->ip_sum, nat->nat_ipsumd);
+ else
+ fix_outcksum(fin, &fin->fin_ip->ip_sum, nat->nat_ipsumd);
+#endif
+
+ if (!(fin->fin_flx & FI_SHORT) && (fin->fin_off == 0)) {
+ if ((nat->nat_inport != 0) && (nflags & IPN_TCPUDP)) {
+ tcp->th_dport = nat->nat_inport;
+ fin->fin_data[1] = ntohs(nat->nat_inport);
+ }
+
+
+ if ((nat->nat_inport != 0) && (nflags & IPN_ICMPQUERY)) {
+ icmp = fin->fin_dp;
+
+ icmp->icmp_id = nat->nat_inport;
+ }
+
+ csump = nat_proto(fin, nat, nflags);
+ }
+
+ nat_update(fin, nat, np);
+
+ /*
+ * The above comments do not hold for layer 4 (or higher) checksums...
+ */
+ if (csump != NULL) {
+ if (nat->nat_dir == NAT_OUTBOUND)
+ fix_incksum(fin, csump, nat->nat_sumd[0]);
+ else
+ fix_outcksum(fin, csump, nat->nat_sumd[0]);
+ }
+ ATOMIC_INCL(nat_stats.ns_mapped[0]);
+ fin->fin_flx |= FI_NATED;
+ if (np != NULL && np->in_tag.ipt_num[0] != 0)
+ fin->fin_nattag = &np->in_tag;
+ return 1;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_proto */
+/* Returns: u_short* - pointer to transport header checksum to update, */
+/* NULL if the transport protocol is not recognised */
+/* as needing a checksum update. */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT structure */
+/* nflags(I) - NAT flags set for this packet */
+/* */
+/* Return the pointer to the checksum field for each protocol so understood.*/
+/* If support for making other changes to a protocol header is required, */
+/* that is not strictly 'address' translation, such as clamping the MSS in */
+/* TCP down to a specific value, then do it from here. */
+/* ------------------------------------------------------------------------ */
+u_short *nat_proto(fin, nat, nflags)
+fr_info_t *fin;
+nat_t *nat;
+u_int nflags;
+{
+ icmphdr_t *icmp;
+ u_short *csump;
+ tcphdr_t *tcp;
+ udphdr_t *udp;
+
+ csump = NULL;
+ if (fin->fin_out == 0) {
+ fin->fin_rev = (nat->nat_dir == NAT_OUTBOUND);
+ } else {
+ fin->fin_rev = (nat->nat_dir == NAT_INBOUND);
+ }
+
+ switch (fin->fin_p)
+ {
+ case IPPROTO_TCP :
+ tcp = fin->fin_dp;
+
+ csump = &tcp->th_sum;
+
+ /*
+ * Do a MSS CLAMPING on a SYN packet,
+ * only deal IPv4 for now.
+ */
+ if ((nat->nat_mssclamp != 0) && (tcp->th_flags & TH_SYN) != 0)
+ nat_mssclamp(tcp, nat->nat_mssclamp, fin, csump);
+
+ break;
+
+ case IPPROTO_UDP :
+ udp = fin->fin_dp;
+
+ if (udp->uh_sum)
+ csump = &udp->uh_sum;
+ break;
+
+ case IPPROTO_ICMP :
+ icmp = fin->fin_dp;
+
+ if ((nflags & IPN_ICMPQUERY) != 0) {
+ if (icmp->icmp_cksum != 0)
+ csump = &icmp->icmp_cksum;
+ }
+ break;
+ }
+ return csump;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natunload */
+/* Returns: Nil */
+/* Parameters: Nil */
+/* */
+/* Free all memory used by NAT structures allocated at runtime. */
+/* ------------------------------------------------------------------------ */
+void fr_natunload()
+{
+ ipftq_t *ifq, *ifqnext;
+
+ (void) nat_clearlist();
+ (void) nat_flushtable();
+
+ /*
+ * Proxy timeout queues are not cleaned here because although they
+ * exist on the NAT list, appr_unload is called after fr_natunload
+ * and the proxies actually are responsible for them being created.
+ * Should the proxy timeouts have their own list? There's no real
+ * justification as this is the only complication.
+ */
+ for (ifq = nat_utqe; ifq != NULL; ifq = ifqnext) {
+ ifqnext = ifq->ifq_next;
+ if (((ifq->ifq_flags & IFQF_PROXY) == 0) &&
+ (fr_deletetimeoutqueue(ifq) == 0))
+ fr_freetimeoutqueue(ifq);
+ }
+
+ if (nat_table[0] != NULL) {
+ KFREES(nat_table[0], sizeof(nat_t *) * ipf_nattable_sz);
+ nat_table[0] = NULL;
+ }
+ if (nat_table[1] != NULL) {
+ KFREES(nat_table[1], sizeof(nat_t *) * ipf_nattable_sz);
+ nat_table[1] = NULL;
+ }
+ if (nat_rules != NULL) {
+ KFREES(nat_rules, sizeof(ipnat_t *) * ipf_natrules_sz);
+ nat_rules = NULL;
+ }
+ if (rdr_rules != NULL) {
+ KFREES(rdr_rules, sizeof(ipnat_t *) * ipf_rdrrules_sz);
+ rdr_rules = NULL;
+ }
+ if (ipf_hm_maptable != NULL) {
+ KFREES(ipf_hm_maptable, sizeof(hostmap_t *) * ipf_hostmap_sz);
+ ipf_hm_maptable = NULL;
+ }
+ if (nat_stats.ns_bucketlen[0] != NULL) {
+ KFREES(nat_stats.ns_bucketlen[0],
+ sizeof(u_long *) * ipf_nattable_sz);
+ nat_stats.ns_bucketlen[0] = NULL;
+ }
+ if (nat_stats.ns_bucketlen[1] != NULL) {
+ KFREES(nat_stats.ns_bucketlen[1],
+ sizeof(u_long *) * ipf_nattable_sz);
+ nat_stats.ns_bucketlen[1] = NULL;
+ }
+
+ if (fr_nat_maxbucket_reset == 1)
+ fr_nat_maxbucket = 0;
+
+ if (fr_nat_init == 1) {
+ fr_nat_init = 0;
+ fr_sttab_destroy(nat_tqb);
+
+ RW_DESTROY(&ipf_natfrag);
+ RW_DESTROY(&ipf_nat);
+
+ MUTEX_DESTROY(&ipf_nat_new);
+ MUTEX_DESTROY(&ipf_natio);
+
+ MUTEX_DESTROY(&nat_udptq.ifq_lock);
+ MUTEX_DESTROY(&nat_icmptq.ifq_lock);
+ MUTEX_DESTROY(&nat_iptq.ifq_lock);
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natexpire */
+/* Returns: Nil */
+/* Parameters: Nil */
+/* */
+/* Check all of the timeout queues for entries at the top which need to be */
+/* expired. */
+/* ------------------------------------------------------------------------ */
+void fr_natexpire()
+{
+ ipftq_t *ifq, *ifqnext;
+ ipftqent_t *tqe, *tqn;
+ int i;
+ SPL_INT(s);
+
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_nat);
+ for (ifq = nat_tqb, i = 0; ifq != NULL; ifq = ifq->ifq_next) {
+ for (tqn = ifq->ifq_head; ((tqe = tqn) != NULL); i++) {
+ if (tqe->tqe_die > fr_ticks)
+ break;
+ tqn = tqe->tqe_next;
+ nat_delete(tqe->tqe_parent, NL_EXPIRE);
+ }
+ }
+
+ for (ifq = nat_utqe; ifq != NULL; ifq = ifqnext) {
+ ifqnext = ifq->ifq_next;
+
+ for (tqn = ifq->ifq_head; ((tqe = tqn) != NULL); i++) {
+ if (tqe->tqe_die > fr_ticks)
+ break;
+ tqn = tqe->tqe_next;
+ nat_delete(tqe->tqe_parent, NL_EXPIRE);
+ }
+ }
+
+ for (ifq = nat_utqe; ifq != NULL; ifq = ifqnext) {
+ ifqnext = ifq->ifq_next;
+
+ if (((ifq->ifq_flags & IFQF_DELETE) != 0) &&
+ (ifq->ifq_ref == 0)) {
+ fr_freetimeoutqueue(ifq);
+ }
+ }
+
+ if (fr_nat_doflush != 0) {
+ nat_extraflush(2);
+ fr_nat_doflush = 0;
+ }
+
+ RWLOCK_EXIT(&ipf_nat);
+ SPL_X(s);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natsync */
+/* Returns: Nil */
+/* Parameters: ifp(I) - pointer to network interface */
+/* */
+/* Walk through all of the currently active NAT sessions, looking for those */
+/* which need to have their translated address updated. */
+/* ------------------------------------------------------------------------ */
+void fr_natsync(ifp)
+void *ifp;
+{
+ u_32_t sum1, sum2, sumd;
+ struct in_addr in;
+ ipnat_t *n;
+ nat_t *nat;
+ void *ifp2;
+ SPL_INT(s);
+
+ if (fr_running <= 0)
+ return;
+
+ /*
+ * Change IP addresses for NAT sessions for any protocol except TCP
+ * since it will break the TCP connection anyway. The only rules
+ * which will get changed are those which are "map ... -> 0/32",
+ * where the rule specifies the address is taken from the interface.
+ */
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_nat);
+
+ if (fr_running <= 0) {
+ RWLOCK_EXIT(&ipf_nat);
+ return;
+ }
+
+ for (nat = nat_instances; nat; nat = nat->nat_next) {
+ if ((nat->nat_flags & IPN_TCP) != 0)
+ continue;
+ n = nat->nat_ptr;
+ if ((n == NULL) ||
+ (n->in_outip != 0) || (n->in_outmsk != 0xffffffff))
+ continue;
+ if (((ifp == NULL) || (ifp == nat->nat_ifps[0]) ||
+ (ifp == nat->nat_ifps[1]))) {
+ nat->nat_ifps[0] = GETIFP(nat->nat_ifnames[0], 4);
+ if (nat->nat_ifnames[1][0] != '\0') {
+ nat->nat_ifps[1] = GETIFP(nat->nat_ifnames[1],
+ 4);
+ } else
+ nat->nat_ifps[1] = nat->nat_ifps[0];
+ ifp2 = nat->nat_ifps[0];
+ if (ifp2 == NULL)
+ continue;
+
+ /*
+ * Change the map-to address to be the same as the
+ * new one.
+ */
+ sum1 = nat->nat_outip.s_addr;
+ if (fr_ifpaddr(4, FRI_NORMAL, ifp2, &in, NULL) != -1)
+ nat->nat_outip = in;
+ sum2 = nat->nat_outip.s_addr;
+
+ if (sum1 == sum2)
+ continue;
+ /*
+ * Readjust the checksum adjustment to take into
+ * account the new IP#.
+ */
+ CALC_SUMD(sum1, sum2, sumd);
+ /* XXX - dont change for TCP when solaris does
+ * hardware checksumming.
+ */
+ sumd += nat->nat_sumd[0];
+ nat->nat_sumd[0] = (sumd & 0xffff) + (sumd >> 16);
+ nat->nat_sumd[1] = nat->nat_sumd[0];
+ }
+ }
+
+ for (n = nat_list; (n != NULL); n = n->in_next) {
+ if ((ifp == NULL) || (n->in_ifps[0] == ifp))
+ n->in_ifps[0] = fr_resolvenic(n->in_ifnames[0], 4);
+ if ((ifp == NULL) || (n->in_ifps[1] == ifp))
+ n->in_ifps[1] = fr_resolvenic(n->in_ifnames[1], 4);
+ }
+ RWLOCK_EXIT(&ipf_nat);
+ SPL_X(s);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_icmpquerytype4 */
+/* Returns: int - 1 == success, 0 == failure */
+/* Parameters: icmptype(I) - ICMP type number */
+/* */
+/* Tests to see if the ICMP type number passed is a query/response type or */
+/* not. */
+/* ------------------------------------------------------------------------ */
+static int nat_icmpquerytype4(icmptype)
+int icmptype;
+{
+
+ /*
+ * For the ICMP query NAT code, it is essential that both the query
+ * and the reply match on the NAT rule. Because the NAT structure
+ * does not keep track of the icmptype, and a single NAT structure
+ * is used for all icmp types with the same src, dest and id, we
+ * simply define the replies as queries as well. The funny thing is,
+ * altough it seems silly to call a reply a query, this is exactly
+ * as it is defined in the IPv4 specification
+ */
+
+ switch (icmptype)
+ {
+
+ case ICMP_ECHOREPLY:
+ case ICMP_ECHO:
+ /* route aedvertisement/solliciation is currently unsupported: */
+ /* it would require rewriting the ICMP data section */
+ case ICMP_TSTAMP:
+ case ICMP_TSTAMPREPLY:
+ case ICMP_IREQ:
+ case ICMP_IREQREPLY:
+ case ICMP_MASKREQ:
+ case ICMP_MASKREPLY:
+ return 1;
+ default:
+ return 0;
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_log */
+/* Returns: Nil */
+/* Parameters: nat(I) - pointer to NAT structure */
+/* type(I) - type of log entry to create */
+/* */
+/* Creates a NAT log entry. */
+/* ------------------------------------------------------------------------ */
+void nat_log(nat, type)
+struct nat *nat;
+u_int type;
+{
+#ifdef IPFILTER_LOG
+# ifndef LARGE_NAT
+ struct ipnat *np;
+ int rulen;
+# endif
+ struct natlog natl;
+ void *items[1];
+ size_t sizes[1];
+ int types[1];
+
+ natl.nl_inip = nat->nat_inip;
+ natl.nl_outip = nat->nat_outip;
+ natl.nl_origip = nat->nat_oip;
+ natl.nl_bytes[0] = nat->nat_bytes[0];
+ natl.nl_bytes[1] = nat->nat_bytes[1];
+ natl.nl_pkts[0] = nat->nat_pkts[0];
+ natl.nl_pkts[1] = nat->nat_pkts[1];
+ natl.nl_origport = nat->nat_oport;
+ natl.nl_inport = nat->nat_inport;
+ natl.nl_outport = nat->nat_outport;
+ natl.nl_p = nat->nat_p;
+ natl.nl_type = type;
+ natl.nl_rule = -1;
+# ifndef LARGE_NAT
+ if (nat->nat_ptr != NULL) {
+ for (rulen = 0, np = nat_list; np; np = np->in_next, rulen++)
+ if (np == nat->nat_ptr) {
+ natl.nl_rule = rulen;
+ break;
+ }
+ }
+# endif
+ items[0] = &natl;
+ sizes[0] = sizeof(natl);
+ types[0] = 0;
+
+ (void) ipllog(IPL_LOGNAT, NULL, items, sizes, types, 1);
+#endif
+}
+
+
+#if defined(__OpenBSD__)
+/* ------------------------------------------------------------------------ */
+/* Function: nat_ifdetach */
+/* Returns: Nil */
+/* Parameters: ifp(I) - pointer to network interface */
+/* */
+/* Compatibility interface for OpenBSD to trigger the correct updating of */
+/* interface references within IPFilter. */
+/* ------------------------------------------------------------------------ */
+void nat_ifdetach(ifp)
+void *ifp;
+{
+ frsync(ifp);
+ return;
+}
+#endif
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_ipnatderef */
+/* Returns: Nil */
+/* Parameters: isp(I) - pointer to pointer to NAT rule */
+/* Write Locks: ipf_nat */
+/* */
+/* ------------------------------------------------------------------------ */
+void fr_ipnatderef(inp)
+ipnat_t **inp;
+{
+ ipnat_t *in;
+
+ in = *inp;
+ *inp = NULL;
+ in->in_space++;
+ in->in_use--;
+ if (in->in_use == 0 && (in->in_flags & IPN_DELETE)) {
+ if (in->in_apr)
+ appr_free(in->in_apr);
+ KFREE(in);
+ nat_stats.ns_rules--;
+#if SOLARIS
+ if (nat_stats.ns_rules == 0)
+ pfil_delayed_copy = 1;
+#endif
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natderef */
+/* Returns: Nil */
+/* Parameters: isp(I) - pointer to pointer to NAT table entry */
+/* */
+/* Decrement the reference counter for this NAT table entry and free it if */
+/* there are no more things using it. */
+/* ------------------------------------------------------------------------ */
+void fr_natderef(natp)
+nat_t **natp;
+{
+ nat_t *nat;
+
+ nat = *natp;
+ *natp = NULL;
+ WRITE_ENTER(&ipf_nat);
+ nat->nat_ref--;
+ if (nat->nat_ref == 0)
+ nat_delete(nat, NL_EXPIRE);
+ RWLOCK_EXIT(&ipf_nat);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_natclone */
+/* Returns: ipstate_t* - NULL == cloning failed, */
+/* else pointer to new state structure */
+/* Parameters: fin(I) - pointer to packet information */
+/* is(I) - pointer to master state structure */
+/* Write Lock: ipf_nat */
+/* */
+/* Create a "duplcate" state table entry from the master. */
+/* ------------------------------------------------------------------------ */
+static nat_t *fr_natclone(fin, nat)
+fr_info_t *fin;
+nat_t *nat;
+{
+ frentry_t *fr;
+ nat_t *clone;
+ ipnat_t *np;
+
+ KMALLOC(clone, nat_t *);
+ if (clone == NULL)
+ return NULL;
+ bcopy((char *)nat, (char *)clone, sizeof(*clone));
+
+ MUTEX_NUKE(&clone->nat_lock);
+
+ clone->nat_aps = NULL;
+ /*
+ * Initialize all these so that nat_delete() doesn't cause a crash.
+ */
+ clone->nat_tqe.tqe_pnext = NULL;
+ clone->nat_tqe.tqe_next = NULL;
+ clone->nat_tqe.tqe_ifq = NULL;
+ clone->nat_tqe.tqe_parent = clone;
+
+ clone->nat_flags &= ~SI_CLONE;
+ clone->nat_flags |= SI_CLONED;
+
+ if (clone->nat_hm)
+ clone->nat_hm->hm_ref++;
+
+ if (nat_insert(clone, fin->fin_rev) == -1) {
+ KFREE(clone);
+ return NULL;
+ }
+ np = clone->nat_ptr;
+ if (np != NULL) {
+ if (nat_logging)
+ nat_log(clone, (u_int)np->in_redir);
+ np->in_use++;
+ }
+ fr = clone->nat_fr;
+ if (fr != NULL) {
+ MUTEX_ENTER(&fr->fr_lock);
+ fr->fr_ref++;
+ MUTEX_EXIT(&fr->fr_lock);
+ }
+
+ /*
+ * Because the clone is created outside the normal loop of things and
+ * TCP has special needs in terms of state, initialise the timeout
+ * state of the new NAT from here.
+ */
+ if (clone->nat_p == IPPROTO_TCP) {
+ (void) fr_tcp_age(&clone->nat_tqe, fin, nat_tqb,
+ clone->nat_flags);
+ }
+#ifdef IPFILTER_SYNC
+ clone->nat_sync = ipfsync_new(SMC_NAT, fin, clone);
+#endif
+ if (nat_logging)
+ nat_log(clone, NL_CLONE);
+ return clone;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_wildok */
+/* Returns: int - 1 == packet's ports match wildcards */
+/* 0 == packet's ports don't match wildcards */
+/* Parameters: nat(I) - NAT entry */
+/* sport(I) - source port */
+/* dport(I) - destination port */
+/* flags(I) - wildcard flags */
+/* dir(I) - packet direction */
+/* */
+/* Use NAT entry and packet direction to determine which combination of */
+/* wildcard flags should be used. */
+/* ------------------------------------------------------------------------ */
+static int nat_wildok(nat, sport, dport, flags, dir)
+nat_t *nat;
+int sport;
+int dport;
+int flags;
+int dir;
+{
+ /*
+ * When called by dir is set to
+ * nat_inlookup NAT_INBOUND (0)
+ * nat_outlookup NAT_OUTBOUND (1)
+ *
+ * We simply combine the packet's direction in dir with the original
+ * "intended" direction of that NAT entry in nat->nat_dir to decide
+ * which combination of wildcard flags to allow.
+ */
+
+ switch ((dir << 1) | nat->nat_dir)
+ {
+ case 3: /* outbound packet / outbound entry */
+ if (((nat->nat_inport == sport) ||
+ (flags & SI_W_SPORT)) &&
+ ((nat->nat_oport == dport) ||
+ (flags & SI_W_DPORT)))
+ return 1;
+ break;
+ case 2: /* outbound packet / inbound entry */
+ if (((nat->nat_outport == sport) ||
+ (flags & SI_W_DPORT)) &&
+ ((nat->nat_oport == dport) ||
+ (flags & SI_W_SPORT)))
+ return 1;
+ break;
+ case 1: /* inbound packet / outbound entry */
+ if (((nat->nat_oport == sport) ||
+ (flags & SI_W_DPORT)) &&
+ ((nat->nat_outport == dport) ||
+ (flags & SI_W_SPORT)))
+ return 1;
+ break;
+ case 0: /* inbound packet / inbound entry */
+ if (((nat->nat_oport == sport) ||
+ (flags & SI_W_SPORT)) &&
+ ((nat->nat_outport == dport) ||
+ (flags & SI_W_DPORT)))
+ return 1;
+ break;
+ default:
+ break;
+ }
+
+ return(0);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_mssclamp */
+/* Returns: Nil */
+/* Parameters: tcp(I) - pointer to TCP header */
+/* maxmss(I) - value to clamp the TCP MSS to */
+/* fin(I) - pointer to packet information */
+/* csump(I) - pointer to TCP checksum */
+/* */
+/* Check for MSS option and clamp it if necessary. If found and changed, */
+/* then the TCP header checksum will be updated to reflect the change in */
+/* the MSS. */
+/* ------------------------------------------------------------------------ */
+static void nat_mssclamp(tcp, maxmss, fin, csump)
+tcphdr_t *tcp;
+u_32_t maxmss;
+fr_info_t *fin;
+u_short *csump;
+{
+ u_char *cp, *ep, opt;
+ int hlen, advance;
+ u_32_t mss, sumd;
+
+ hlen = TCP_OFF(tcp) << 2;
+ if (hlen > sizeof(*tcp)) {
+ cp = (u_char *)tcp + sizeof(*tcp);
+ ep = (u_char *)tcp + hlen;
+
+ while (cp < ep) {
+ opt = cp[0];
+ if (opt == TCPOPT_EOL)
+ break;
+ else if (opt == TCPOPT_NOP) {
+ cp++;
+ continue;
+ }
+
+ if (cp + 1 >= ep)
+ break;
+ advance = cp[1];
+ if ((cp + advance > ep) || (advance <= 0))
+ break;
+ switch (opt)
+ {
+ case TCPOPT_MAXSEG:
+ if (advance != 4)
+ break;
+ mss = cp[2] * 256 + cp[3];
+ if (mss > maxmss) {
+ cp[2] = maxmss / 256;
+ cp[3] = maxmss & 0xff;
+ CALC_SUMD(mss, maxmss, sumd);
+ fix_outcksum(fin, csump, sumd);
+ }
+ break;
+ default:
+ /* ignore unknown options */
+ break;
+ }
+
+ cp += advance;
+ }
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_setnatqueue */
+/* Returns: Nil */
+/* Parameters: nat(I)- pointer to NAT structure */
+/* rev(I) - forward(0) or reverse(1) direction */
+/* Locks: ipf_nat (read or write) */
+/* */
+/* Put the NAT entry on its default queue entry, using rev as a helped in */
+/* determining which queue it should be placed on. */
+/* ------------------------------------------------------------------------ */
+void fr_setnatqueue(nat, rev)
+nat_t *nat;
+int rev;
+{
+ ipftq_t *oifq, *nifq;
+
+ if (nat->nat_ptr != NULL)
+ nifq = nat->nat_ptr->in_tqehead[rev];
+ else
+ nifq = NULL;
+
+ if (nifq == NULL) {
+ switch (nat->nat_p)
+ {
+ case IPPROTO_UDP :
+ nifq = &nat_udptq;
+ break;
+ case IPPROTO_ICMP :
+ nifq = &nat_icmptq;
+ break;
+ case IPPROTO_TCP :
+ nifq = nat_tqb + nat->nat_tqe.tqe_state[rev];
+ break;
+ default :
+ nifq = &nat_iptq;
+ break;
+ }
+ }
+
+ oifq = nat->nat_tqe.tqe_ifq;
+ /*
+ * If it's currently on a timeout queue, move it from one queue to
+ * another, else put it on the end of the newly determined queue.
+ */
+ if (oifq != NULL)
+ fr_movequeue(&nat->nat_tqe, oifq, nifq);
+ else
+ fr_queueappend(&nat->nat_tqe, nifq, nat);
+ return;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_getnext */
+/* Returns: int - 0 == ok, else error */
+/* Parameters: t(I) - pointer to ipftoken structure */
+/* itp(I) - pointer to ipfgeniter_t structure */
+/* */
+/* Fetch the next nat/ipnat structure pointer from the linked list and */
+/* copy it out to the storage space pointed to by itp_data. The next item */
+/* in the list to look at is put back in the ipftoken struture. */
+/* If we call ipf_freetoken, the accompanying pointer is set to NULL because*/
+/* ipf_freetoken will call a deref function for us and we dont want to call */
+/* that twice (second time would be in the second switch statement below. */
+/* ------------------------------------------------------------------------ */
+static int nat_getnext(t, itp)
+ipftoken_t *t;
+ipfgeniter_t *itp;
+{
+ hostmap_t *hm, *nexthm = NULL, zerohm;
+ ipnat_t *ipn, *nextipnat = NULL, zeroipn;
+ nat_t *nat, *nextnat = NULL, zeronat;
+ int error = 0, count;
+ ipftoken_t *freet;
+ char *dst;
+
+ freet = NULL;
+
+ READ_ENTER(&ipf_nat);
+
+ switch (itp->igi_type)
+ {
+ case IPFGENITER_HOSTMAP :
+ hm = t->ipt_data;
+ if (hm == NULL) {
+ nexthm = ipf_hm_maplist;
+ } else {
+ nexthm = hm->hm_next;
+ }
+ break;
+
+ case IPFGENITER_IPNAT :
+ ipn = t->ipt_data;
+ if (ipn == NULL) {
+ nextipnat = nat_list;
+ } else {
+ nextipnat = ipn->in_next;
+ }
+ break;
+
+ case IPFGENITER_NAT :
+ nat = t->ipt_data;
+ if (nat == NULL) {
+ nextnat = nat_instances;
+ } else {
+ nextnat = nat->nat_next;
+ }
+ break;
+ default :
+ RWLOCK_EXIT(&ipf_nat);
+ return EINVAL;
+ }
+
+ dst = itp->igi_data;
+ for (count = itp->igi_nitems; count > 0; count--) {
+ switch (itp->igi_type)
+ {
+ case IPFGENITER_HOSTMAP :
+ if (nexthm != NULL) {
+ if (nexthm->hm_next == NULL) {
+ freet = t;
+ count = 1;
+ hm = NULL;
+ }
+ if (count == 1) {
+ ATOMIC_INC32(nexthm->hm_ref);
+ }
+ } else {
+ bzero(&zerohm, sizeof(zerohm));
+ nexthm = &zerohm;
+ count = 1;
+ }
+ break;
+
+ case IPFGENITER_IPNAT :
+ if (nextipnat != NULL) {
+ if (nextipnat->in_next == NULL) {
+ freet = t;
+ count = 1;
+ ipn = NULL;
+ }
+ if (count == 1) {
+ MUTEX_ENTER(&nextipnat->in_lock);
+ nextipnat->in_use++;
+ MUTEX_EXIT(&nextipnat->in_lock);
+ }
+ } else {
+ bzero(&zeroipn, sizeof(zeroipn));
+ nextipnat = &zeroipn;
+ count = 1;
+ }
+ break;
+
+ case IPFGENITER_NAT :
+ if (nextnat != NULL) {
+ if (nextnat->nat_next == NULL) {
+ count = 1;
+ freet = t;
+ nat = NULL;
+ }
+ if (count == 1) {
+ MUTEX_ENTER(&nextnat->nat_lock);
+ nextnat->nat_ref++;
+ MUTEX_EXIT(&nextnat->nat_lock);
+ }
+ } else {
+ bzero(&zeronat, sizeof(zeronat));
+ nextnat = &zeronat;
+ count = 1;
+ }
+ break;
+ default :
+ break;
+ }
+ RWLOCK_EXIT(&ipf_nat);
+
+ if (freet != NULL) {
+ ipf_freetoken(freet);
+ freet = NULL;
+ }
+
+ switch (itp->igi_type)
+ {
+ case IPFGENITER_HOSTMAP :
+ if (hm != NULL) {
+ WRITE_ENTER(&ipf_nat);
+ fr_hostmapdel(&hm);
+ RWLOCK_EXIT(&ipf_nat);
+ }
+ t->ipt_data = nexthm;
+ error = COPYOUT(nexthm, dst, sizeof(*nexthm));
+ if (error != 0)
+ error = EFAULT;
+ else
+ dst += sizeof(*nexthm);
+ break;
+
+ case IPFGENITER_IPNAT :
+ if (ipn != NULL)
+ fr_ipnatderef(&ipn);
+ t->ipt_data = nextipnat;
+ error = COPYOUT(nextipnat, dst, sizeof(*nextipnat));
+ if (error != 0)
+ error = EFAULT;
+ else
+ dst += sizeof(*nextipnat);
+ break;
+
+ case IPFGENITER_NAT :
+ if (nat != NULL)
+ fr_natderef(&nat);
+ t->ipt_data = nextnat;
+ error = COPYOUT(nextnat, dst, sizeof(*nextnat));
+ if (error != 0)
+ error = EFAULT;
+ else
+ dst += sizeof(*nextnat);
+ break;
+ }
+
+ if ((count == 1) || (error != 0))
+ break;
+
+ READ_ENTER(&ipf_nat);
+
+ switch (itp->igi_type)
+ {
+ case IPFGENITER_HOSTMAP :
+ hm = nexthm;
+ nexthm = hm->hm_next;
+ break;
+
+ case IPFGENITER_IPNAT :
+ ipn = nextipnat;
+ nextipnat = ipn->in_next;
+ break;
+
+ case IPFGENITER_NAT :
+ nat = nextnat;
+ nextnat = nat->nat_next;
+ break;
+ default :
+ break;
+ }
+ }
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_iterator */
+/* Returns: int - 0 == ok, else error */
+/* Parameters: token(I) - pointer to ipftoken structure */
+/* itp(I) - pointer to ipfgeniter_t structure */
+/* */
+/* This function acts as a handler for the SIOCGENITER ioctls that use a */
+/* generic structure to iterate through a list. There are three different */
+/* linked lists of NAT related information to go through: NAT rules, active */
+/* NAT mappings and the NAT fragment cache. */
+/* ------------------------------------------------------------------------ */
+static int nat_iterator(token, itp)
+ipftoken_t *token;
+ipfgeniter_t *itp;
+{
+ int error;
+
+ if (itp->igi_data == NULL)
+ return EFAULT;
+
+ token->ipt_subtype = itp->igi_type;
+
+ switch (itp->igi_type)
+ {
+ case IPFGENITER_HOSTMAP :
+ case IPFGENITER_IPNAT :
+ case IPFGENITER_NAT :
+ error = nat_getnext(token, itp);
+ break;
+
+ case IPFGENITER_NATFRAG :
+#ifdef USE_MUTEXES
+ error = fr_nextfrag(token, itp, &ipfr_natlist,
+ &ipfr_nattail, &ipf_natfrag);
+#else
+ error = fr_nextfrag(token, itp, &ipfr_natlist, &ipfr_nattail);
+#endif
+ break;
+ default :
+ error = EINVAL;
+ break;
+ }
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_extraflush */
+/* Returns: int - 0 == success, -1 == failure */
+/* Parameters: which(I) - how to flush the active NAT table */
+/* Write Locks: ipf_nat */
+/* */
+/* Flush nat tables. Three actions currently defined: */
+/* which == 0 : flush all nat table entries */
+/* which == 1 : flush TCP connections which have started to close but are */
+/* stuck for some reason. */
+/* which == 2 : flush TCP connections which have been idle for a long time, */
+/* starting at > 4 days idle and working back in successive half-*/
+/* days to at most 12 hours old. If this fails to free enough */
+/* slots then work backwards in half hour slots to 30 minutes. */
+/* If that too fails, then work backwards in 30 second intervals */
+/* for the last 30 minutes to at worst 30 seconds idle. */
+/* ------------------------------------------------------------------------ */
+static int nat_extraflush(which)
+int which;
+{
+ ipftq_t *ifq, *ifqnext;
+ nat_t *nat, **natp;
+ ipftqent_t *tqn;
+ int removed;
+ SPL_INT(s);
+
+ removed = 0;
+
+ SPL_NET(s);
+
+ switch (which)
+ {
+ case 0 :
+ /*
+ * Style 0 flush removes everything...
+ */
+ for (natp = &nat_instances; ((nat = *natp) != NULL); ) {
+ nat_delete(nat, NL_FLUSH);
+ removed++;
+ }
+ break;
+
+ case 1 :
+ /*
+ * Since we're only interested in things that are closing,
+ * we can start with the appropriate timeout queue.
+ */
+ for (ifq = nat_tqb + IPF_TCPS_CLOSE_WAIT; ifq != NULL;
+ ifq = ifq->ifq_next) {
+
+ for (tqn = ifq->ifq_head; tqn != NULL; ) {
+ nat = tqn->tqe_parent;
+ tqn = tqn->tqe_next;
+ if (nat->nat_p != IPPROTO_TCP)
+ break;
+ nat_delete(nat, NL_EXPIRE);
+ removed++;
+ }
+ }
+
+ /*
+ * Also need to look through the user defined queues.
+ */
+ for (ifq = nat_utqe; ifq != NULL; ifq = ifqnext) {
+ ifqnext = ifq->ifq_next;
+ for (tqn = ifq->ifq_head; tqn != NULL; ) {
+ nat = tqn->tqe_parent;
+ tqn = tqn->tqe_next;
+ if (nat->nat_p != IPPROTO_TCP)
+ continue;
+
+ if ((nat->nat_tcpstate[0] >
+ IPF_TCPS_ESTABLISHED) &&
+ (nat->nat_tcpstate[1] >
+ IPF_TCPS_ESTABLISHED)) {
+ nat_delete(nat, NL_EXPIRE);
+ removed++;
+ }
+ }
+ }
+ break;
+
+ /*
+ * Args 5-11 correspond to flushing those particular states
+ * for TCP connections.
+ */
+ case IPF_TCPS_CLOSE_WAIT :
+ case IPF_TCPS_FIN_WAIT_1 :
+ case IPF_TCPS_CLOSING :
+ case IPF_TCPS_LAST_ACK :
+ case IPF_TCPS_FIN_WAIT_2 :
+ case IPF_TCPS_TIME_WAIT :
+ case IPF_TCPS_CLOSED :
+ tqn = nat_tqb[which].ifq_head;
+ while (tqn != NULL) {
+ nat = tqn->tqe_parent;
+ tqn = tqn->tqe_next;
+ nat_delete(nat, NL_FLUSH);
+ removed++;
+ }
+ break;
+
+ default :
+ if (which < 30)
+ break;
+
+ /*
+ * Take a large arbitrary number to mean the number of seconds
+ * for which which consider to be the maximum value we'll allow
+ * the expiration to be.
+ */
+ which = IPF_TTLVAL(which);
+ for (natp = &nat_instances; ((nat = *natp) != NULL); ) {
+ if (fr_ticks - nat->nat_touched > which) {
+ nat_delete(nat, NL_FLUSH);
+ removed++;
+ } else
+ natp = &nat->nat_next;
+ }
+ break;
+ }
+
+ if (which != 2) {
+ SPL_X(s);
+ return removed;
+ }
+
+ /*
+ * Asked to remove inactive entries because the table is full.
+ */
+ if (fr_ticks - nat_last_force_flush > IPF_TTLVAL(5)) {
+ nat_last_force_flush = fr_ticks;
+ removed = ipf_queueflush(nat_flush_entry, nat_tqb, nat_utqe);
+ }
+
+ SPL_X(s);
+ return removed;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: nat_flush_entry */
+/* Returns: 0 - always succeeds */
+/* Parameters: entry(I) - pointer to NAT entry */
+/* Write Locks: ipf_nat */
+/* */
+/* This function is a stepping stone between ipf_queueflush() and */
+/* nat_dlete(). It is used so we can provide a uniform interface via the */
+/* ipf_queueflush() function. Since the nat_delete() function returns void */
+/* we translate that to mean it always succeeds in deleting something. */
+/* ------------------------------------------------------------------------ */
+static int nat_flush_entry(entry)
+void *entry;
+{
+ nat_delete(entry, NL_FLUSH);
+ return 0;
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_nat.h b/sys/contrib/ipfilter/netinet/ip_nat.h
new file mode 100644
index 0000000..5484eac
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_nat.h
@@ -0,0 +1,468 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1995-2001, 2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * @(#)ip_nat.h 1.5 2/4/96
+ * $FreeBSD$
+ * Id: ip_nat.h,v 2.90.2.9 2005/03/28 11:09:55 darrenr Exp
+ */
+
+#ifndef __IP_NAT_H__
+#define __IP_NAT_H__
+
+#ifndef SOLARIS
+#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+#endif
+
+#if defined(__STDC__) || defined(__GNUC__) || defined(_AIX51)
+#define SIOCADNAT _IOW('r', 60, struct ipfobj)
+#define SIOCRMNAT _IOW('r', 61, struct ipfobj)
+#define SIOCGNATS _IOWR('r', 62, struct ipfobj)
+#define SIOCGNATL _IOWR('r', 63, struct ipfobj)
+#else
+#define SIOCADNAT _IOW(r, 60, struct ipfobj)
+#define SIOCRMNAT _IOW(r, 61, struct ipfobj)
+#define SIOCGNATS _IOWR(r, 62, struct ipfobj)
+#define SIOCGNATL _IOWR(r, 63, struct ipfobj)
+#endif
+
+#undef LARGE_NAT /* define this if you're setting up a system to NAT
+ * LARGE numbers of networks/hosts - i.e. in the
+ * hundreds or thousands. In such a case, you should
+ * also change the RDR_SIZE and NAT_SIZE below to more
+ * appropriate sizes. The figures below were used for
+ * a setup with 1000-2000 networks to NAT.
+ */
+#ifndef NAT_SIZE
+# ifdef LARGE_NAT
+# define NAT_SIZE 2047
+# else
+# define NAT_SIZE 127
+# endif
+#endif
+#ifndef RDR_SIZE
+# ifdef LARGE_NAT
+# define RDR_SIZE 2047
+# else
+# define RDR_SIZE 127
+# endif
+#endif
+#ifndef HOSTMAP_SIZE
+# ifdef LARGE_NAT
+# define HOSTMAP_SIZE 8191
+# else
+# define HOSTMAP_SIZE 2047
+# endif
+#endif
+#ifndef NAT_TABLE_MAX
+/*
+ * This is newly introduced and for the sake of "least surprise", the numbers
+ * present aren't what we'd normally use for creating a proper hash table.
+ */
+# ifdef LARGE_NAT
+# define NAT_TABLE_MAX 180000
+# else
+# define NAT_TABLE_MAX 30000
+# endif
+#endif
+#ifndef NAT_TABLE_SZ
+# ifdef LARGE_NAT
+# define NAT_TABLE_SZ 16383
+# else
+# define NAT_TABLE_SZ 2047
+# endif
+#endif
+#ifndef APR_LABELLEN
+#define APR_LABELLEN 16
+#endif
+#define NAT_HW_CKSUM 0x80000000
+
+#define DEF_NAT_AGE 1200 /* 10 minutes (600 seconds) */
+
+struct ipstate;
+struct ap_session;
+
+typedef struct nat {
+ ipfmutex_t nat_lock;
+ struct nat *nat_next;
+ struct nat **nat_pnext;
+ struct nat *nat_hnext[2];
+ struct nat **nat_phnext[2];
+ struct hostmap *nat_hm;
+ void *nat_data;
+ struct nat **nat_me;
+ struct ipstate *nat_state;
+ struct ap_session *nat_aps; /* proxy session */
+ frentry_t *nat_fr; /* filter rule ptr if appropriate */
+ struct ipnat *nat_ptr; /* pointer back to the rule */
+ void *nat_ifps[2];
+ void *nat_sync;
+ ipftqent_t nat_tqe;
+ u_32_t nat_flags;
+ u_32_t nat_sumd[2]; /* ip checksum delta for data segment*/
+ u_32_t nat_ipsumd; /* ip checksum delta for ip header */
+ u_32_t nat_mssclamp; /* if != zero clamp MSS to this */
+ i6addr_t nat_inip6;
+ i6addr_t nat_outip6;
+ i6addr_t nat_oip6; /* other ip */
+ U_QUAD_T nat_pkts[2];
+ U_QUAD_T nat_bytes[2];
+ union {
+ udpinfo_t nat_unu;
+ tcpinfo_t nat_unt;
+ icmpinfo_t nat_uni;
+ greinfo_t nat_ugre;
+ } nat_un;
+ u_short nat_oport; /* other port */
+ u_short nat_use;
+ u_char nat_p; /* protocol for NAT */
+ int nat_dir;
+ int nat_ref; /* reference count */
+ int nat_hv[2];
+ char nat_ifnames[2][LIFNAMSIZ];
+ int nat_rev; /* 0 = forward, 1 = reverse */
+ int nat_redir; /* copy of in_redir */
+} nat_t;
+
+#define nat_inip nat_inip6.in4
+#define nat_outip nat_outip6.in4
+#define nat_oip nat_oip6.in4
+#define nat_age nat_tqe.tqe_die
+#define nat_inport nat_un.nat_unt.ts_sport
+#define nat_outport nat_un.nat_unt.ts_dport
+#define nat_type nat_un.nat_uni.ici_type
+#define nat_seq nat_un.nat_uni.ici_seq
+#define nat_id nat_un.nat_uni.ici_id
+#define nat_tcpstate nat_tqe.tqe_state
+#define nat_die nat_tqe.tqe_die
+#define nat_touched nat_tqe.tqe_touched
+
+/*
+ * Values for nat_dir
+ */
+#define NAT_INBOUND 0
+#define NAT_OUTBOUND 1
+
+/*
+ * Definitions for nat_flags
+ */
+#define NAT_TCP 0x0001 /* IPN_TCP */
+#define NAT_UDP 0x0002 /* IPN_UDP */
+#define NAT_ICMPERR 0x0004 /* IPN_ICMPERR */
+#define NAT_ICMPQUERY 0x0008 /* IPN_ICMPQUERY */
+#define NAT_SEARCH 0x0010
+#define NAT_SLAVE 0x0020 /* Slave connection for a proxy */
+#define NAT_NOTRULEPORT 0x0040 /* Don't use the port # in the NAT rule */
+
+#define NAT_TCPUDP (NAT_TCP|NAT_UDP)
+#define NAT_TCPUDPICMP (NAT_TCP|NAT_UDP|NAT_ICMPERR)
+#define NAT_TCPUDPICMPQ (NAT_TCP|NAT_UDP|NAT_ICMPQUERY)
+#define NAT_FROMRULE (NAT_TCP|NAT_UDP)
+
+/* 0x0100 reserved for FI_W_SPORT */
+/* 0x0200 reserved for FI_W_DPORT */
+/* 0x0400 reserved for FI_W_SADDR */
+/* 0x0800 reserved for FI_W_DADDR */
+/* 0x1000 reserved for FI_W_NEWFR */
+/* 0x2000 reserved for SI_CLONE */
+/* 0x4000 reserved for SI_CLONED */
+/* 0x8000 reserved for SI_IGNOREPKT */
+
+#define NAT_DEBUG 0x800000
+
+typedef struct ipnat {
+ ipfmutex_t in_lock;
+ struct ipnat *in_next; /* NAT rule list next */
+ struct ipnat *in_rnext; /* rdr rule hash next */
+ struct ipnat **in_prnext; /* prior rdr next ptr */
+ struct ipnat *in_mnext; /* map rule hash next */
+ struct ipnat **in_pmnext; /* prior map next ptr */
+ struct ipftq *in_tqehead[2];
+ void *in_ifps[2];
+ void *in_apr;
+ char *in_comment;
+ i6addr_t in_next6;
+ u_long in_space;
+ u_long in_hits;
+ u_int in_use;
+ u_int in_hv;
+ int in_flineno; /* conf. file line number */
+ u_short in_pnext;
+ u_char in_v;
+ u_char in_xxx;
+ /* From here to the end is covered by IPN_CMPSIZ */
+ u_32_t in_flags;
+ u_32_t in_mssclamp; /* if != 0 clamp MSS to this */
+ u_int in_age[2];
+ int in_redir; /* see below for values */
+ int in_p; /* protocol. */
+ i6addr_t in_in[2];
+ i6addr_t in_out[2];
+ i6addr_t in_src[2];
+ frtuc_t in_tuc;
+ u_short in_port[2];
+ u_short in_ppip; /* ports per IP. */
+ u_short in_ippip; /* IP #'s per IP# */
+ char in_ifnames[2][LIFNAMSIZ];
+ char in_plabel[APR_LABELLEN]; /* proxy label. */
+ ipftag_t in_tag;
+} ipnat_t;
+
+#define in_pmin in_port[0] /* Also holds static redir port */
+#define in_pmax in_port[1]
+#define in_nextip in_next6.in4
+#define in_nip in_next6.in4.s_addr
+#define in_inip in_in[0].in4.s_addr
+#define in_inmsk in_in[1].in4.s_addr
+#define in_outip in_out[0].in4.s_addr
+#define in_outmsk in_out[1].in4.s_addr
+#define in_srcip in_src[0].in4.s_addr
+#define in_srcmsk in_src[1].in4.s_addr
+#define in_scmp in_tuc.ftu_scmp
+#define in_dcmp in_tuc.ftu_dcmp
+#define in_stop in_tuc.ftu_stop
+#define in_dtop in_tuc.ftu_dtop
+#define in_sport in_tuc.ftu_sport
+#define in_dport in_tuc.ftu_dport
+
+/*
+ * Bit definitions for in_flags
+ */
+#define IPN_ANY 0x00000
+#define IPN_TCP 0x00001
+#define IPN_UDP 0x00002
+#define IPN_TCPUDP (IPN_TCP|IPN_UDP)
+#define IPN_ICMPERR 0x00004
+#define IPN_TCPUDPICMP (IPN_TCP|IPN_UDP|IPN_ICMPERR)
+#define IPN_ICMPQUERY 0x00008
+#define IPN_TCPUDPICMPQ (IPN_TCP|IPN_UDP|IPN_ICMPQUERY)
+#define IPN_RF (IPN_TCPUDP|IPN_DELETE|IPN_ICMPERR)
+#define IPN_AUTOPORTMAP 0x00010
+#define IPN_IPRANGE 0x00020
+#define IPN_FILTER 0x00040
+#define IPN_SPLIT 0x00080
+#define IPN_ROUNDR 0x00100
+#define IPN_NOTSRC 0x04000
+#define IPN_NOTDST 0x08000
+#define IPN_DYNSRCIP 0x10000 /* dynamic src IP# */
+#define IPN_DYNDSTIP 0x20000 /* dynamic dst IP# */
+#define IPN_DELETE 0x40000
+#define IPN_STICKY 0x80000
+#define IPN_FRAG 0x100000
+#define IPN_FIXEDDPORT 0x200000
+#define IPN_FINDFORWARD 0x400000
+#define IPN_IN 0x800000
+#define IPN_USERFLAGS (IPN_TCPUDP|IPN_AUTOPORTMAP|IPN_IPRANGE|IPN_SPLIT|\
+ IPN_ROUNDR|IPN_FILTER|IPN_NOTSRC|IPN_NOTDST|\
+ IPN_FRAG|IPN_STICKY|IPN_FIXEDDPORT|IPN_ICMPQUERY)
+
+/*
+ * Values for in_redir
+ */
+#define NAT_MAP 0x01
+#define NAT_REDIRECT 0x02
+#define NAT_BIMAP (NAT_MAP|NAT_REDIRECT)
+#define NAT_MAPBLK 0x04
+
+#define MAPBLK_MINPORT 1024 /* don't use reserved ports for src port */
+#define USABLE_PORTS (65536 - MAPBLK_MINPORT)
+
+#define IPN_CMPSIZ (sizeof(ipnat_t) - offsetof(ipnat_t, in_flags))
+
+typedef struct natlookup {
+ struct in_addr nl_inip;
+ struct in_addr nl_outip;
+ struct in_addr nl_realip;
+ int nl_flags;
+ u_short nl_inport;
+ u_short nl_outport;
+ u_short nl_realport;
+} natlookup_t;
+
+
+typedef struct nat_save {
+ void *ipn_next;
+ struct nat ipn_nat;
+ struct ipnat ipn_ipnat;
+ struct frentry ipn_fr;
+ int ipn_dsize;
+ char ipn_data[4];
+} nat_save_t;
+
+#define ipn_rule ipn_nat.nat_fr
+
+typedef struct natget {
+ void *ng_ptr;
+ int ng_sz;
+} natget_t;
+
+
+/*
+ * This structure gets used to help NAT sessions keep the same NAT rule (and
+ * thus translation for IP address) when:
+ * (a) round-robin redirects are in use
+ * (b) different IP add
+ */
+typedef struct hostmap {
+ struct hostmap *hm_hnext;
+ struct hostmap **hm_phnext;
+ struct hostmap *hm_next;
+ struct hostmap **hm_pnext;
+ struct ipnat *hm_ipnat;
+ struct in_addr hm_srcip;
+ struct in_addr hm_dstip;
+ struct in_addr hm_mapip;
+ u_32_t hm_port;
+ int hm_ref;
+} hostmap_t;
+
+
+/*
+ * Structure used to pass information in to nat_newmap and nat_newrdr.
+ */
+typedef struct natinfo {
+ ipnat_t *nai_np;
+ u_32_t nai_sum1;
+ u_32_t nai_sum2;
+ u_32_t nai_nflags;
+ u_32_t nai_flags;
+ struct in_addr nai_ip;
+ u_short nai_port;
+ u_short nai_nport;
+ u_short nai_sport;
+ u_short nai_dport;
+} natinfo_t;
+
+
+typedef struct natstat {
+ u_long ns_mapped[2];
+ u_long ns_rules;
+ u_long ns_added;
+ u_long ns_expire;
+ u_long ns_inuse;
+ u_long ns_logged;
+ u_long ns_logfail;
+ u_long ns_memfail;
+ u_long ns_badnat;
+ u_long ns_addtrpnt;
+ nat_t **ns_table[2];
+ hostmap_t **ns_maptable;
+ ipnat_t *ns_list;
+ void *ns_apslist;
+ u_int ns_wilds;
+ u_int ns_nattab_sz;
+ u_int ns_nattab_max;
+ u_int ns_rultab_sz;
+ u_int ns_rdrtab_sz;
+ u_int ns_trpntab_sz;
+ u_int ns_hostmap_sz;
+ nat_t *ns_instances;
+ hostmap_t *ns_maplist;
+ u_long *ns_bucketlen[2];
+ u_long ns_ticks;
+} natstat_t;
+
+typedef struct natlog {
+ struct in_addr nl_origip;
+ struct in_addr nl_outip;
+ struct in_addr nl_inip;
+ u_short nl_origport;
+ u_short nl_outport;
+ u_short nl_inport;
+ u_short nl_type;
+ int nl_rule;
+ U_QUAD_T nl_pkts[2];
+ U_QUAD_T nl_bytes[2];
+ u_char nl_p;
+} natlog_t;
+
+
+#define NL_NEWMAP NAT_MAP
+#define NL_NEWRDR NAT_REDIRECT
+#define NL_NEWBIMAP NAT_BIMAP
+#define NL_NEWBLOCK NAT_MAPBLK
+#define NL_CLONE 0xfffd
+#define NL_FLUSH 0xfffe
+#define NL_EXPIRE 0xffff
+
+#define NAT_HASH_FN(k,l,m) (((k) + ((k) >> 12) + l) % (m))
+
+#define LONG_SUM(in) (((in) & 0xffff) + ((in) >> 16))
+
+#define CALC_SUMD(s1, s2, sd) { \
+ (s1) = ((s1) & 0xffff) + ((s1) >> 16); \
+ (s2) = ((s2) & 0xffff) + ((s2) >> 16); \
+ /* Do it twice */ \
+ (s1) = ((s1) & 0xffff) + ((s1) >> 16); \
+ (s2) = ((s2) & 0xffff) + ((s2) >> 16); \
+ /* Because ~1 == -2, We really need ~1 == -1 */ \
+ if ((s1) > (s2)) (s2)--; \
+ (sd) = (s2) - (s1); \
+ (sd) = ((sd) & 0xffff) + ((sd) >> 16); }
+
+#define NAT_SYSSPACE 0x80000000
+#define NAT_LOCKHELD 0x40000000
+
+
+extern u_int ipf_nattable_sz;
+extern u_int ipf_nattable_max;
+extern u_int ipf_natrules_sz;
+extern u_int ipf_rdrrules_sz;
+extern u_int ipf_hostmap_sz;
+extern u_int fr_nat_maxbucket;
+extern u_int fr_nat_maxbucket_reset;
+extern int fr_nat_lock;
+extern int fr_nat_doflush;
+extern void fr_natsync __P((void *));
+extern u_long fr_defnatage;
+extern u_long fr_defnaticmpage;
+extern u_long fr_defnatipage;
+ /* nat_table[0] -> hashed list sorted by inside (ip, port) */
+ /* nat_table[1] -> hashed list sorted by outside (ip, port) */
+extern nat_t **nat_table[2];
+extern nat_t *nat_instances;
+extern ipnat_t *nat_list;
+extern ipnat_t **nat_rules;
+extern ipnat_t **rdr_rules;
+extern ipftq_t *nat_utqe;
+extern natstat_t nat_stats;
+
+#if defined(__OpenBSD__)
+extern void nat_ifdetach __P((void *));
+#endif
+extern int fr_nat_ioctl __P((caddr_t, ioctlcmd_t, int, int, void *));
+extern int fr_natinit __P((void));
+extern nat_t *nat_new __P((fr_info_t *, ipnat_t *, nat_t **, u_int, int));
+extern nat_t *nat_outlookup __P((fr_info_t *, u_int, u_int, struct in_addr,
+ struct in_addr));
+extern void fix_datacksum __P((u_short *, u_32_t));
+extern nat_t *nat_inlookup __P((fr_info_t *, u_int, u_int, struct in_addr,
+ struct in_addr));
+extern nat_t *nat_tnlookup __P((fr_info_t *, int));
+extern nat_t *nat_maplookup __P((void *, u_int, struct in_addr,
+ struct in_addr));
+extern nat_t *nat_lookupredir __P((natlookup_t *));
+extern nat_t *nat_icmperrorlookup __P((fr_info_t *, int));
+extern nat_t *nat_icmperror __P((fr_info_t *, u_int *, int));
+extern int nat_insert __P((nat_t *, int));
+
+extern int fr_checknatout __P((fr_info_t *, u_32_t *));
+extern int fr_natout __P((fr_info_t *, nat_t *, int, u_32_t));
+extern int fr_checknatin __P((fr_info_t *, u_32_t *));
+extern int fr_natin __P((fr_info_t *, nat_t *, int, u_32_t));
+extern void fr_natunload __P((void));
+extern void fr_natexpire __P((void));
+extern void nat_log __P((struct nat *, u_int));
+extern void fix_incksum __P((fr_info_t *, u_short *, u_32_t));
+extern void fix_outcksum __P((fr_info_t *, u_short *, u_32_t));
+extern void fr_ipnatderef __P((ipnat_t **));
+extern void fr_natderef __P((nat_t **));
+extern u_short *nat_proto __P((fr_info_t *, nat_t *, u_int));
+extern void nat_update __P((fr_info_t *, nat_t *, ipnat_t *));
+extern void fr_setnatqueue __P((nat_t *, int));
+extern void fr_hostmapdel __P((hostmap_t **));
+
+#endif /* __IP_NAT_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_netbios_pxy.c b/sys/contrib/ipfilter/netinet/ip_netbios_pxy.c
new file mode 100644
index 0000000..1a0b2a2
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_netbios_pxy.c
@@ -0,0 +1,118 @@
+/*
+ * Simple netbios-dgm transparent proxy for in-kernel use.
+ * For use with the NAT code.
+ * $Id: ip_netbios_pxy.c,v 2.8.2.1 2005/08/20 13:48:23 darrenr Exp $
+ */
+
+/*-
+ * Copyright (c) 2002-2003 Paul J. Ledbetter III
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Id: ip_netbios_pxy.c,v 2.8.2.1 2005/08/20 13:48:23 darrenr Exp $
+ */
+
+#define IPF_NETBIOS_PROXY
+
+int ippr_netbios_init __P((void));
+void ippr_netbios_fini __P((void));
+int ippr_netbios_out __P((fr_info_t *, ap_session_t *, nat_t *));
+
+static frentry_t netbiosfr;
+
+int netbios_proxy_init = 0;
+
+/*
+ * Initialize local structures.
+ */
+int ippr_netbios_init()
+{
+ bzero((char *)&netbiosfr, sizeof(netbiosfr));
+ netbiosfr.fr_ref = 1;
+ netbiosfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ MUTEX_INIT(&netbiosfr.fr_lock, "NETBIOS proxy rule lock");
+ netbios_proxy_init = 1;
+
+ return 0;
+}
+
+
+void ippr_netbios_fini()
+{
+ if (netbios_proxy_init == 1) {
+ MUTEX_DESTROY(&netbiosfr.fr_lock);
+ netbios_proxy_init = 0;
+ }
+}
+
+
+int ippr_netbios_out(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ char dgmbuf[6];
+ int off, dlen;
+ udphdr_t *udp;
+ ip_t *ip;
+ mb_t *m;
+
+ aps = aps; /* LINT */
+ nat = nat; /* LINT */
+
+ m = fin->fin_m;
+ dlen = fin->fin_dlen - sizeof(*udp);
+ /*
+ * no net bios datagram could possibly be shorter than this
+ */
+ if (dlen < 11)
+ return 0;
+
+ ip = fin->fin_ip;
+ udp = (udphdr_t *)fin->fin_dp;
+ off = (char *)udp - (char *)ip + sizeof(*udp) + fin->fin_ipoff;
+
+ /*
+ * move past the
+ * ip header;
+ * udp header;
+ * 4 bytes into the net bios dgm header.
+ * According to rfc1002, this should be the exact location of
+ * the source address/port
+ */
+ off += 4;
+
+ /* Copy NATed source Address/port*/
+ dgmbuf[0] = (char)((ip->ip_src.s_addr ) &0xFF);
+ dgmbuf[1] = (char)((ip->ip_src.s_addr >> 8) &0xFF);
+ dgmbuf[2] = (char)((ip->ip_src.s_addr >> 16)&0xFF);
+ dgmbuf[3] = (char)((ip->ip_src.s_addr >> 24)&0xFF);
+
+ dgmbuf[4] = (char)((udp->uh_sport )&0xFF);
+ dgmbuf[5] = (char)((udp->uh_sport >> 8)&0xFF);
+
+ /* replace data in packet */
+ COPYBACK(m, off, sizeof(dgmbuf), dgmbuf);
+
+ return 0;
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_pool.c b/sys/contrib/ipfilter/netinet/ip_pool.c
new file mode 100644
index 0000000..b7e9946
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_pool.c
@@ -0,0 +1,1005 @@
+/*
+ * Copyright (C) 1993-2001, 2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#if defined(__osf__)
+# define _PROTO_NET_H_
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/file.h>
+#if !defined(_KERNEL) && !defined(__KERNEL__)
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# define _KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+#else
+# include <sys/systm.h>
+# if defined(NetBSD) && (__NetBSD_Version__ >= 104000000)
+# include <sys/proc.h>
+# endif
+#endif
+#include <sys/time.h>
+#if !defined(linux)
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if defined(_KERNEL) && (!defined(__SVR4) && !defined(__svr4__))
+# include <sys/mbuf.h>
+#endif
+#if defined(__SVR4) || defined(__svr4__)
+# include <sys/filio.h>
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+#if defined(__FreeBSD_version) && (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+#endif
+
+#if defined(_KERNEL) && (defined(__osf__) || defined(AIX) || \
+ defined(__hpux) || defined(__sgi))
+# include "radix_ipf_local.h"
+# define _RADIX_H_
+#endif
+#include <net/if.h>
+#include <netinet/in.h>
+
+#include "netinet/ip_compat.h"
+#include "netinet/ip_fil.h"
+#include "netinet/ip_pool.h"
+
+#if defined(IPFILTER_LOOKUP) && defined(_KERNEL) && \
+ ((BSD >= 198911) && !defined(__osf__) && \
+ !defined(__hpux) && !defined(__sgi))
+static int rn_freenode __P((struct radix_node *, void *));
+#endif
+
+/* END OF INCLUDES */
+
+#if !defined(lint)
+static const char sccsid[] = "@(#)ip_fil.c 2.41 6/5/96 (C) 1993-2000 Darren Reed";
+static const char rcsid[] = "@(#)$Id: ip_pool.c,v 2.55.2.20 2007/05/31 12:27:35 darrenr Exp $";
+#endif
+
+#ifdef IPFILTER_LOOKUP
+
+# ifndef RADIX_NODE_HEAD_LOCK
+# define RADIX_NODE_HEAD_LOCK(x) ;
+# endif
+# ifndef RADIX_NODE_HEAD_UNLOCK
+# define RADIX_NODE_HEAD_UNLOCK(x) ;
+# endif
+
+static void ip_pool_clearnodes __P((ip_pool_t *));
+static void *ip_pool_exists __P((int, char *));
+
+ip_pool_stat_t ipoolstat;
+ipfrwlock_t ip_poolrw;
+
+/*
+ * Binary tree routines from Sedgewick and enhanced to do ranges of addresses.
+ * NOTE: Insertion *MUST* be from greatest range to least for it to work!
+ * These should be replaced, eventually, by something else - most notably a
+ * interval searching method. The important feature is to be able to find
+ * the best match.
+ *
+ * So why not use a radix tree for this? As the first line implies, it
+ * has been written to work with a _range_ of addresses. A range is not
+ * necessarily a match with any given netmask so what we end up dealing
+ * with is an interval tree. Implementations of these are hard to find
+ * and the one herein is far from bug free.
+ *
+ * Sigh, in the end I became convinced that the bugs the code contained did
+ * not make it worthwhile not using radix trees. For now the radix tree from
+ * 4.4 BSD is used, but this is not viewed as a long term solution.
+ */
+ip_pool_t *ip_pool_list[IPL_LOGSIZE] = { NULL, NULL, NULL, NULL,
+ NULL, NULL, NULL, NULL };
+
+
+#ifdef TEST_POOL
+void treeprint __P((ip_pool_t *));
+
+int
+main(argc, argv)
+ int argc;
+ char *argv[];
+{
+ addrfamily_t a, b;
+ iplookupop_t op;
+ ip_pool_t *ipo;
+ i6addr_t ip;
+
+ RWLOCK_INIT(&ip_poolrw, "poolrw");
+ ip_pool_init();
+
+ bzero((char *)&a, sizeof(a));
+ bzero((char *)&b, sizeof(b));
+ bzero((char *)&ip, sizeof(ip));
+ bzero((char *)&op, sizeof(op));
+ strcpy(op.iplo_name, "0");
+
+ if (ip_pool_create(&op) == 0)
+ ipo = ip_pool_exists(0, "0");
+
+ a.adf_addr.in4.s_addr = 0x0a010203;
+ b.adf_addr.in4.s_addr = 0xffffffff;
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 1);
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 1);
+
+ a.adf_addr.in4.s_addr = 0x0a000000;
+ b.adf_addr.in4.s_addr = 0xff000000;
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 0);
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 0);
+
+ a.adf_addr.in4.s_addr = 0x0a010100;
+ b.adf_addr.in4.s_addr = 0xffffff00;
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 1);
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 1);
+
+ a.adf_addr.in4.s_addr = 0x0a010200;
+ b.adf_addr.in4.s_addr = 0xffffff00;
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 0);
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 0);
+
+ a.adf_addr.in4.s_addr = 0x0a010000;
+ b.adf_addr.in4.s_addr = 0xffff0000;
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 1);
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 1);
+
+ a.adf_addr.in4.s_addr = 0x0a01020f;
+ b.adf_addr.in4.s_addr = 0xffffffff;
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 1);
+ ip_pool_insert(ipo, &a.adf_addr, &b.adf_addr, 1);
+#ifdef DEBUG_POOL
+treeprint(ipo);
+#endif
+ ip.in4.s_addr = 0x0a00aabb;
+ printf("search(%#x) = %d (0)\n", ip.in4.s_addr,
+ ip_pool_search(ipo, 4, &ip));
+
+ ip.in4.s_addr = 0x0a000001;
+ printf("search(%#x) = %d (0)\n", ip.in4.s_addr,
+ ip_pool_search(ipo, 4, &ip));
+
+ ip.in4.s_addr = 0x0a000101;
+ printf("search(%#x) = %d (0)\n", ip.in4.s_addr,
+ ip_pool_search(ipo, 4, &ip));
+
+ ip.in4.s_addr = 0x0a010001;
+ printf("search(%#x) = %d (1)\n", ip.in4.s_addr,
+ ip_pool_search(ipo, 4, &ip));
+
+ ip.in4.s_addr = 0x0a010101;
+ printf("search(%#x) = %d (1)\n", ip.in4.s_addr,
+ ip_pool_search(ipo, 4, &ip));
+
+ ip.in4.s_addr = 0x0a010201;
+ printf("search(%#x) = %d (0)\n", ip.in4.s_addr,
+ ip_pool_search(ipo, 4, &ip));
+
+ ip.in4.s_addr = 0x0a010203;
+ printf("search(%#x) = %d (1)\n", ip.in4.s_addr,
+ ip_pool_search(ipo, 4, &ip));
+
+ ip.in4.s_addr = 0x0a01020f;
+ printf("search(%#x) = %d (1)\n", ip.in4.s_addr,
+ ip_pool_search(ipo, 4, &ip));
+
+ ip.in4.s_addr = 0x0b00aabb;
+ printf("search(%#x) = %d (-1)\n", ip.in4.s_addr,
+ ip_pool_search(ipo, 4, &ip));
+
+#ifdef DEBUG_POOL
+treeprint(ipo);
+#endif
+
+ ip_pool_fini();
+
+ return 0;
+}
+
+
+void
+treeprint(ipo)
+ip_pool_t *ipo;
+{
+ ip_pool_node_t *c;
+
+ for (c = ipo->ipo_list; c != NULL; c = c->ipn_next)
+ printf("Node %p(%s) (%#x/%#x) = %d hits %lu\n",
+ c, c->ipn_name, c->ipn_addr.adf_addr.in4.s_addr,
+ c->ipn_mask.adf_addr.in4.s_addr,
+ c->ipn_info, c->ipn_hits);
+}
+#endif /* TEST_POOL */
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_init */
+/* Returns: int - 0 = success, else error */
+/* */
+/* Initialise the routing table data structures where required. */
+/* ------------------------------------------------------------------------ */
+int ip_pool_init()
+{
+
+ bzero((char *)&ipoolstat, sizeof(ipoolstat));
+
+#if (!defined(_KERNEL) || (BSD < 199306))
+ rn_init();
+#endif
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_fini */
+/* Returns: int - 0 = success, else error */
+/* Locks: WRITE(ipf_global) */
+/* */
+/* Clean up all the pool data structures allocated and call the cleanup */
+/* function for the radix tree that supports the pools. ip_pool_destroy() is*/
+/* used to delete the pools one by one to ensure they're properly freed up. */
+/* ------------------------------------------------------------------------ */
+void ip_pool_fini()
+{
+ ip_pool_t *p, *q;
+ int i;
+
+ ASSERT(rw_read_locked(&ipf_global.ipf_lk) == 0);
+
+ for (i = 0; i <= IPL_LOGMAX; i++) {
+ for (q = ip_pool_list[i]; (p = q) != NULL; ) {
+ q = p->ipo_next;
+ (void) ip_pool_destroy(i, p->ipo_name);
+ }
+ }
+
+#if (!defined(_KERNEL) || (BSD < 199306))
+ rn_fini();
+#endif
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_statistics */
+/* Returns: int - 0 = success, else error */
+/* Parameters: op(I) - pointer to lookup operation arguments */
+/* */
+/* Copy the current statistics out into user space, collecting pool list */
+/* pointers as appropriate for later use. */
+/* ------------------------------------------------------------------------ */
+int ip_pool_statistics(op)
+iplookupop_t *op;
+{
+ ip_pool_stat_t stats;
+ int unit, i, err = 0;
+
+ if (op->iplo_size != sizeof(ipoolstat))
+ return EINVAL;
+
+ bcopy((char *)&ipoolstat, (char *)&stats, sizeof(stats));
+ unit = op->iplo_unit;
+ if (unit == IPL_LOGALL) {
+ for (i = 0; i < IPL_LOGSIZE; i++)
+ stats.ipls_list[i] = ip_pool_list[i];
+ } else if (unit >= 0 && unit < IPL_LOGSIZE) {
+ if (op->iplo_name[0] != '\0')
+ stats.ipls_list[unit] = ip_pool_exists(unit,
+ op->iplo_name);
+ else
+ stats.ipls_list[unit] = ip_pool_list[unit];
+ } else
+ err = EINVAL;
+ if (err == 0)
+ err = COPYOUT(&stats, op->iplo_struct, sizeof(stats));
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_exists */
+/* Returns: int - 0 = success, else error */
+/* Parameters: ipo(I) - pointer to the pool getting the new node. */
+/* */
+/* Find a matching pool inside the collection of pools for a particular */
+/* device, indicated by the unit number. */
+/* ------------------------------------------------------------------------ */
+static void *ip_pool_exists(unit, name)
+int unit;
+char *name;
+{
+ ip_pool_t *p;
+
+ for (p = ip_pool_list[unit]; p != NULL; p = p->ipo_next)
+ if (strncmp(p->ipo_name, name, sizeof(p->ipo_name)) == 0)
+ break;
+ return p;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_find */
+/* Returns: int - 0 = success, else error */
+/* Parameters: ipo(I) - pointer to the pool getting the new node. */
+/* */
+/* Find a matching pool inside the collection of pools for a particular */
+/* device, indicated by the unit number. If it is marked for deletion then */
+/* pretend it does not exist. */
+/* ------------------------------------------------------------------------ */
+void *ip_pool_find(unit, name)
+int unit;
+char *name;
+{
+ ip_pool_t *p;
+
+ p = ip_pool_exists(unit, name);
+ if ((p != NULL) && (p->ipo_flags & IPOOL_DELETE))
+ return NULL;
+
+ return p;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_findeq */
+/* Returns: int - 0 = success, else error */
+/* Parameters: ipo(I) - pointer to the pool getting the new node. */
+/* addr(I) - pointer to address information to delete */
+/* mask(I) - */
+/* */
+/* Searches for an exact match of an entry in the pool. */
+/* ------------------------------------------------------------------------ */
+ip_pool_node_t *ip_pool_findeq(ipo, addr, mask)
+ip_pool_t *ipo;
+addrfamily_t *addr, *mask;
+{
+ struct radix_node *n;
+ SPL_INT(s);
+
+ SPL_NET(s);
+ RADIX_NODE_HEAD_LOCK(ipo->ipo_head);
+ n = ipo->ipo_head->rnh_lookup(addr, mask, ipo->ipo_head);
+ RADIX_NODE_HEAD_UNLOCK(ipo->ipo_head);
+ SPL_X(s);
+ return (ip_pool_node_t *)n;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_search */
+/* Returns: int - 0 == +ve match, -1 == error, 1 == -ve/no match */
+/* Parameters: tptr(I) - pointer to the pool to search */
+/* version(I) - IP protocol version (4 or 6) */
+/* dptr(I) - pointer to address information */
+/* */
+/* Search the pool for a given address and return a search result. */
+/* ------------------------------------------------------------------------ */
+int ip_pool_search(tptr, ipversion, dptr)
+void *tptr;
+int ipversion;
+void *dptr;
+{
+ struct radix_node *rn;
+ ip_pool_node_t *m;
+ i6addr_t *addr;
+ addrfamily_t v;
+ ip_pool_t *ipo;
+ int rv;
+
+ ipo = tptr;
+ if (ipo == NULL)
+ return -1;
+
+ rv = 1;
+ m = NULL;
+ addr = (i6addr_t *)dptr;
+ bzero(&v, sizeof(v));
+ v.adf_len = offsetof(addrfamily_t, adf_addr);
+
+ if (ipversion == 4) {
+ v.adf_len += sizeof(addr->in4);
+ v.adf_addr.in4 = addr->in4;
+#ifdef USE_INET6
+ } else if (ipversion == 6) {
+ v.adf_len += sizeof(addr->in6);
+ v.adf_addr.in6 = addr->in6;
+#endif
+ } else
+ return -1;
+
+ READ_ENTER(&ip_poolrw);
+
+ RADIX_NODE_HEAD_LOCK(ipo->ipo_head);
+ rn = ipo->ipo_head->rnh_matchaddr(&v, ipo->ipo_head);
+ RADIX_NODE_HEAD_UNLOCK(ipo->ipo_head);
+
+ if ((rn != NULL) && ((rn->rn_flags & RNF_ROOT) == 0)) {
+ m = (ip_pool_node_t *)rn;
+ ipo->ipo_hits++;
+ m->ipn_hits++;
+ rv = m->ipn_info;
+ }
+ RWLOCK_EXIT(&ip_poolrw);
+ return rv;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_insert */
+/* Returns: int - 0 = success, else error */
+/* Parameters: ipo(I) - pointer to the pool getting the new node. */
+/* addr(I) - address being added as a node */
+/* mask(I) - netmask to with the node being added */
+/* info(I) - extra information to store in this node. */
+/* Locks: WRITE(ip_poolrw) */
+/* */
+/* Add another node to the pool given by ipo. The three parameters passed */
+/* in (addr, mask, info) shold all be stored in the node. */
+/* ------------------------------------------------------------------------ */
+int ip_pool_insert(ipo, addr, mask, info)
+ip_pool_t *ipo;
+i6addr_t *addr, *mask;
+int info;
+{
+ struct radix_node *rn;
+ ip_pool_node_t *x;
+
+ ASSERT(rw_read_locked(&ip_poolrw.ipf_lk) == 0);
+
+ KMALLOC(x, ip_pool_node_t *);
+ if (x == NULL) {
+ return ENOMEM;
+ }
+
+ bzero(x, sizeof(*x));
+
+ x->ipn_info = info;
+ (void)strncpy(x->ipn_name, ipo->ipo_name, sizeof(x->ipn_name));
+
+ bcopy(addr, &x->ipn_addr.adf_addr, sizeof(*addr));
+ x->ipn_addr.adf_len = sizeof(x->ipn_addr);
+ bcopy(mask, &x->ipn_mask.adf_addr, sizeof(*mask));
+ x->ipn_mask.adf_len = sizeof(x->ipn_mask);
+
+ RADIX_NODE_HEAD_LOCK(ipo->ipo_head);
+ rn = ipo->ipo_head->rnh_addaddr(&x->ipn_addr, &x->ipn_mask,
+ ipo->ipo_head, x->ipn_nodes);
+ RADIX_NODE_HEAD_UNLOCK(ipo->ipo_head);
+#ifdef DEBUG_POOL
+ printf("Added %p at %p\n", x, rn);
+#endif
+
+ if (rn == NULL) {
+ KFREE(x);
+ return ENOMEM;
+ }
+
+ x->ipn_ref = 1;
+ x->ipn_next = ipo->ipo_list;
+ x->ipn_pnext = &ipo->ipo_list;
+ if (ipo->ipo_list != NULL)
+ ipo->ipo_list->ipn_pnext = &x->ipn_next;
+ ipo->ipo_list = x;
+
+ ipoolstat.ipls_nodes++;
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_create */
+/* Returns: int - 0 = success, else error */
+/* Parameters: op(I) - pointer to iplookup struct with call details */
+/* Locks: WRITE(ip_poolrw) */
+/* */
+/* Creates a new group according to the paramters passed in via the */
+/* iplookupop structure. Does not check to see if the group already exists */
+/* when being inserted - assume this has already been done. If the pool is */
+/* marked as being anonymous, give it a new, unique, identifier. Call any */
+/* other functions required to initialise the structure. */
+/* */
+/* If the structure is flagged for deletion then reset the flag and return, */
+/* as this likely means we've tried to free a pool that is in use (flush) */
+/* and now want to repopulate it with "new" data. */
+/* ------------------------------------------------------------------------ */
+int ip_pool_create(op)
+iplookupop_t *op;
+{
+ char name[FR_GROUPLEN];
+ int poolnum, unit;
+ ip_pool_t *h;
+
+ ASSERT(rw_read_locked(&ip_poolrw.ipf_lk) == 0);
+
+ unit = op->iplo_unit;
+
+ if ((op->iplo_arg & LOOKUP_ANON) == 0)
+ h = ip_pool_exists(unit, op->iplo_name);
+ else
+ h = NULL;
+
+ if (h != NULL) {
+ if ((h->ipo_flags & IPOOL_DELETE) != 0) {
+ h->ipo_flags &= ~IPOOL_DELETE;
+ return 0;
+ }
+ return EEXIST;
+ } else {
+ KMALLOC(h, ip_pool_t *);
+ if (h == NULL)
+ return ENOMEM;
+ bzero(h, sizeof(*h));
+
+ if (rn_inithead((void **)&h->ipo_head,
+ offsetof(addrfamily_t, adf_addr) << 3) == 0) {
+ KFREE(h);
+ return ENOMEM;
+ }
+ }
+
+ if ((op->iplo_arg & LOOKUP_ANON) != 0) {
+ ip_pool_t *p;
+
+ h->ipo_flags |= IPOOL_ANON;
+ poolnum = LOOKUP_ANON;
+
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(name, sizeof(name), "%x", poolnum);
+#else
+ (void)sprintf(name, "%x", poolnum);
+#endif
+
+ for (p = ip_pool_list[unit]; p != NULL; ) {
+ if (strncmp(name, p->ipo_name,
+ sizeof(p->ipo_name)) == 0) {
+ poolnum++;
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(name, sizeof(name), "%x", poolnum);
+#else
+ (void)sprintf(name, "%x", poolnum);
+#endif
+ p = ip_pool_list[unit];
+ } else
+ p = p->ipo_next;
+ }
+
+ (void)strncpy(h->ipo_name, name, sizeof(h->ipo_name));
+ (void)strncpy(op->iplo_name, name, sizeof(op->iplo_name));
+ } else {
+ (void)strncpy(h->ipo_name, op->iplo_name, sizeof(h->ipo_name));
+ }
+
+ if ((h->ipo_flags & IPOOL_DELETE) == 0) {
+ h->ipo_ref = 1;
+ h->ipo_list = NULL;
+ h->ipo_unit = unit;
+ h->ipo_next = ip_pool_list[unit];
+ if (ip_pool_list[unit] != NULL)
+ ip_pool_list[unit]->ipo_pnext = &h->ipo_next;
+ h->ipo_pnext = &ip_pool_list[unit];
+ ip_pool_list[unit] = h;
+
+ ipoolstat.ipls_pools++;
+ }
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_remove */
+/* Returns: int - 0 = success, else error */
+/* Parameters: ipo(I) - pointer to the pool to remove the node from. */
+/* ipe(I) - address being deleted as a node */
+/* Locks: WRITE(ip_poolrw) */
+/* */
+/* Remove a node from the pool given by ipo. */
+/* ------------------------------------------------------------------------ */
+int ip_pool_remove(ipo, ipe)
+ip_pool_t *ipo;
+ip_pool_node_t *ipe;
+{
+
+ ASSERT(rw_read_locked(&ip_poolrw.ipf_lk) == 0);
+
+ if (ipe->ipn_pnext != NULL)
+ *ipe->ipn_pnext = ipe->ipn_next;
+ if (ipe->ipn_next != NULL)
+ ipe->ipn_next->ipn_pnext = ipe->ipn_pnext;
+
+ RADIX_NODE_HEAD_LOCK(ipo->ipo_head);
+ ipo->ipo_head->rnh_deladdr(&ipe->ipn_addr, &ipe->ipn_mask,
+ ipo->ipo_head);
+ RADIX_NODE_HEAD_UNLOCK(ipo->ipo_head);
+
+ ip_pool_node_deref(ipe);
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_destroy */
+/* Returns: int - 0 = success, else error */
+/* Parameters: op(I) - information about the pool to remove */
+/* Locks: WRITE(ip_poolrw) or WRITE(ipf_global) */
+/* */
+/* Search for a pool using paramters passed in and if it's not otherwise */
+/* busy, free it. If it is busy, clear all of its nodes, mark it for being */
+/* deleted and return an error saying it is busy. */
+/* */
+/* NOTE: Because this function is called out of ipfdetach() where ip_poolrw */
+/* may not be initialised, we can't use an ASSERT to enforce the locking */
+/* assertion that one of the two (ip_poolrw,ipf_global) is held. */
+/* ------------------------------------------------------------------------ */
+int ip_pool_destroy(unit, name)
+int unit;
+char *name;
+{
+ ip_pool_t *ipo;
+
+ ipo = ip_pool_exists(unit, name);
+ if (ipo == NULL)
+ return ESRCH;
+
+ if (ipo->ipo_ref != 1) {
+ ip_pool_clearnodes(ipo);
+ ipo->ipo_flags |= IPOOL_DELETE;
+ return 0;
+ }
+
+ ip_pool_free(ipo);
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_flush */
+/* Returns: int - number of pools deleted */
+/* Parameters: fp(I) - which pool(s) to flush */
+/* Locks: WRITE(ip_poolrw) or WRITE(ipf_global) */
+/* */
+/* Free all pools associated with the device that matches the unit number */
+/* passed in with operation. */
+/* */
+/* NOTE: Because this function is called out of ipfdetach() where ip_poolrw */
+/* may not be initialised, we can't use an ASSERT to enforce the locking */
+/* assertion that one of the two (ip_poolrw,ipf_global) is held. */
+/* ------------------------------------------------------------------------ */
+int ip_pool_flush(fp)
+iplookupflush_t *fp;
+{
+ int i, num = 0, unit, err;
+ ip_pool_t *p, *q;
+ iplookupop_t op;
+
+ unit = fp->iplf_unit;
+
+ for (i = 0; i <= IPL_LOGMAX; i++) {
+ if (unit != IPLT_ALL && i != unit)
+ continue;
+ for (q = ip_pool_list[i]; (p = q) != NULL; ) {
+ op.iplo_unit = i;
+ (void)strncpy(op.iplo_name, p->ipo_name,
+ sizeof(op.iplo_name));
+ q = p->ipo_next;
+ err = ip_pool_destroy(op.iplo_unit, op.iplo_name);
+ if (err == 0)
+ num++;
+ else
+ break;
+ }
+ }
+ return num;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_free */
+/* Returns: void */
+/* Parameters: ipo(I) - pointer to pool structure */
+/* Locks: WRITE(ip_poolrw) or WRITE(ipf_global) */
+/* */
+/* Deletes the pool strucutre passed in from the list of pools and deletes */
+/* all of the address information stored in it, including any tree data */
+/* structures also allocated. */
+/* */
+/* NOTE: Because this function is called out of ipfdetach() where ip_poolrw */
+/* may not be initialised, we can't use an ASSERT to enforce the locking */
+/* assertion that one of the two (ip_poolrw,ipf_global) is held. */
+/* ------------------------------------------------------------------------ */
+void ip_pool_free(ipo)
+ip_pool_t *ipo;
+{
+
+ ip_pool_clearnodes(ipo);
+
+ if (ipo->ipo_next != NULL)
+ ipo->ipo_next->ipo_pnext = ipo->ipo_pnext;
+ *ipo->ipo_pnext = ipo->ipo_next;
+ rn_freehead(ipo->ipo_head);
+ KFREE(ipo);
+
+ ipoolstat.ipls_pools--;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_clearnodes */
+/* Returns: void */
+/* Parameters: ipo(I) - pointer to pool structure */
+/* Locks: WRITE(ip_poolrw) or WRITE(ipf_global) */
+/* */
+/* Deletes all nodes stored in a pool structure. */
+/* ------------------------------------------------------------------------ */
+static void ip_pool_clearnodes(ipo)
+ip_pool_t *ipo;
+{
+ ip_pool_node_t *n;
+
+ RADIX_NODE_HEAD_LOCK(ipo->ipo_head);
+ while ((n = ipo->ipo_list) != NULL) {
+ ipo->ipo_head->rnh_deladdr(&n->ipn_addr, &n->ipn_mask,
+ ipo->ipo_head);
+
+ *n->ipn_pnext = n->ipn_next;
+ if (n->ipn_next)
+ n->ipn_next->ipn_pnext = n->ipn_pnext;
+
+ KFREE(n);
+
+ ipoolstat.ipls_nodes--;
+ }
+ RADIX_NODE_HEAD_UNLOCK(ipo->ipo_head);
+
+ ipo->ipo_list = NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_deref */
+/* Returns: void */
+/* Parameters: ipo(I) - pointer to pool structure */
+/* Locks: WRITE(ip_poolrw) */
+/* */
+/* Drop the number of known references to this pool structure by one and if */
+/* we arrive at zero known references, free it. */
+/* ------------------------------------------------------------------------ */
+void ip_pool_deref(ipo)
+ip_pool_t *ipo;
+{
+
+ ASSERT(rw_read_locked(&ip_poolrw.ipf_lk) == 0);
+
+ ipo->ipo_ref--;
+
+ if (ipo->ipo_ref == 0)
+ ip_pool_free(ipo);
+
+ else if ((ipo->ipo_ref == 1) && (ipo->ipo_flags & IPOOL_DELETE))
+ ip_pool_destroy(ipo->ipo_unit, ipo->ipo_name);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_node_deref */
+/* Returns: void */
+/* Parameters: ipn(I) - pointer to pool structure */
+/* Locks: WRITE(ip_poolrw) */
+/* */
+/* Drop a reference to the pool node passed in and if we're the last, free */
+/* it all up and adjust the stats accordingly. */
+/* ------------------------------------------------------------------------ */
+void ip_pool_node_deref(ipn)
+ip_pool_node_t *ipn;
+{
+
+ ipn->ipn_ref--;
+
+ if (ipn->ipn_ref == 0) {
+ KFREE(ipn);
+ ipoolstat.ipls_nodes--;
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_getnext */
+/* Returns: void */
+/* Parameters: token(I) - pointer to pool structure */
+/* Parameters: ilp(IO) - pointer to pool iterating structure */
+/* */
+/* ------------------------------------------------------------------------ */
+int ip_pool_getnext(token, ilp)
+ipftoken_t *token;
+ipflookupiter_t *ilp;
+{
+ ip_pool_node_t *node, zn, *nextnode;
+ ip_pool_t *ipo, zp, *nextipo;
+ int err;
+
+ err = 0;
+ node = NULL;
+ nextnode = NULL;
+ ipo = NULL;
+ nextipo = NULL;
+
+ READ_ENTER(&ip_poolrw);
+
+ switch (ilp->ili_otype)
+ {
+ case IPFLOOKUPITER_LIST :
+ ipo = token->ipt_data;
+ if (ipo == NULL) {
+ nextipo = ip_pool_list[(int)ilp->ili_unit];
+ } else {
+ nextipo = ipo->ipo_next;
+ }
+
+ if (nextipo != NULL) {
+ ATOMIC_INC(nextipo->ipo_ref);
+ if (nextipo->ipo_next == NULL)
+ token->ipt_alive = 0;
+ } else {
+ bzero((char *)&zp, sizeof(zp));
+ nextipo = &zp;
+ }
+ break;
+
+ case IPFLOOKUPITER_NODE :
+ node = token->ipt_data;
+ if (node == NULL) {
+ ipo = ip_pool_exists(ilp->ili_unit, ilp->ili_name);
+ if (ipo == NULL)
+ err = ESRCH;
+ else {
+ nextnode = ipo->ipo_list;
+ ipo = NULL;
+ }
+ } else {
+ nextnode = node->ipn_next;
+ }
+
+ if (nextnode != NULL) {
+ ATOMIC_INC(nextnode->ipn_ref);
+ if (nextnode->ipn_next == NULL)
+ token->ipt_alive = 0;
+ } else {
+ bzero((char *)&zn, sizeof(zn));
+ nextnode = &zn;
+ }
+ break;
+ default :
+ err = EINVAL;
+ break;
+ }
+
+ RWLOCK_EXIT(&ip_poolrw);
+
+ if (err != 0)
+ return err;
+
+ switch (ilp->ili_otype)
+ {
+ case IPFLOOKUPITER_LIST :
+ if (ipo != NULL) {
+ WRITE_ENTER(&ip_poolrw);
+ ip_pool_deref(ipo);
+ RWLOCK_EXIT(&ip_poolrw);
+ }
+ token->ipt_data = nextipo;
+ err = COPYOUT(nextipo, ilp->ili_data, sizeof(*nextipo));
+ if (err != 0)
+ err = EFAULT;
+ break;
+
+ case IPFLOOKUPITER_NODE :
+ if (node != NULL) {
+ WRITE_ENTER(&ip_poolrw);
+ ip_pool_node_deref(node);
+ RWLOCK_EXIT(&ip_poolrw);
+ }
+ token->ipt_data = nextnode;
+ err = COPYOUT(nextnode, ilp->ili_data, sizeof(*nextnode));
+ if (err != 0)
+ err = EFAULT;
+ break;
+ }
+
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ip_pool_iterderef */
+/* Returns: void */
+/* Parameters: ipn(I) - pointer to pool structure */
+/* Locks: WRITE(ip_poolrw) */
+/* */
+/* ------------------------------------------------------------------------ */
+void ip_pool_iterderef(otype, unit, data)
+u_int otype;
+int unit;
+void *data;
+{
+
+ if (data == NULL)
+ return;
+
+ if (unit < 0 || unit > IPL_LOGMAX)
+ return;
+
+ switch (otype)
+ {
+ case IPFLOOKUPITER_LIST :
+ WRITE_ENTER(&ip_poolrw);
+ ip_pool_deref((ip_pool_t *)data);
+ RWLOCK_EXIT(&ip_poolrw);
+ break;
+
+ case IPFLOOKUPITER_NODE :
+ WRITE_ENTER(&ip_poolrw);
+ ip_pool_node_deref((ip_pool_node_t *)data);
+ RWLOCK_EXIT(&ip_poolrw);
+ break;
+ default :
+ break;
+ }
+}
+
+
+# if defined(_KERNEL) && ((BSD >= 198911) && !defined(__osf__) && \
+ !defined(__hpux) && !defined(__sgi))
+static int
+rn_freenode(struct radix_node *n, void *p)
+{
+ struct radix_node_head *rnh = p;
+ struct radix_node *d;
+
+ d = rnh->rnh_deladdr(n->rn_key, NULL, rnh);
+ if (d != NULL) {
+ FreeS(d, max_keylen + 2 * sizeof (*d));
+ }
+ return 0;
+}
+
+
+void
+rn_freehead(rnh)
+ struct radix_node_head *rnh;
+{
+
+ RADIX_NODE_HEAD_LOCK(rnh);
+ (*rnh->rnh_walktree)(rnh, rn_freenode, rnh);
+
+ rnh->rnh_addaddr = NULL;
+ rnh->rnh_deladdr = NULL;
+ rnh->rnh_matchaddr = NULL;
+ rnh->rnh_lookup = NULL;
+ rnh->rnh_walktree = NULL;
+ RADIX_NODE_HEAD_UNLOCK(rnh);
+
+ Free(rnh);
+}
+# endif
+#endif /* IPFILTER_LOOKUP */
diff --git a/sys/contrib/ipfilter/netinet/ip_pool.h b/sys/contrib/ipfilter/netinet/ip_pool.h
new file mode 100644
index 0000000..927276f
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_pool.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 1993-2001, 2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: ip_pool.h,v 2.26.2.5 2007/01/14 14:06:12 darrenr Exp $
+ */
+
+#ifndef __IP_POOL_H__
+#define __IP_POOL_H__
+
+#if defined(_KERNEL) && !defined(__osf__) && !defined(__hpux) && \
+ !defined(linux) && !defined(sun) && !defined(AIX)
+# include <net/radix.h>
+extern void rn_freehead __P((struct radix_node_head *));
+# define FreeS(p, z) KFREES(p, z)
+extern int max_keylen;
+#else
+# if defined(__osf__) || defined(__hpux)
+# include "radix_ipf_local.h"
+# define radix_mask ipf_radix_mask
+# define radix_node ipf_radix_node
+# define radix_node_head ipf_radix_node_head
+# else
+# include "radix_ipf.h"
+# endif
+#endif
+#include "netinet/ip_lookup.h"
+
+#define IP_POOL_NOMATCH 0
+#define IP_POOL_POSITIVE 1
+
+typedef struct ip_pool_node {
+ struct radix_node ipn_nodes[2];
+ addrfamily_t ipn_addr;
+ addrfamily_t ipn_mask;
+ int ipn_info;
+ int ipn_ref;
+char ipn_name[FR_GROUPLEN];
+u_long ipn_hits;
+ struct ip_pool_node *ipn_next, **ipn_pnext;
+} ip_pool_node_t;
+
+
+typedef struct ip_pool_s {
+ struct ip_pool_s *ipo_next;
+ struct ip_pool_s **ipo_pnext;
+ struct radix_node_head *ipo_head;
+ ip_pool_node_t *ipo_list;
+ u_long ipo_hits;
+ int ipo_unit;
+ int ipo_flags;
+ int ipo_ref;
+ char ipo_name[FR_GROUPLEN];
+} ip_pool_t;
+
+#define IPOOL_DELETE 0x01
+#define IPOOL_ANON 0x02
+
+
+typedef struct ip_pool_stat {
+ u_long ipls_pools;
+ u_long ipls_tables;
+ u_long ipls_nodes;
+ ip_pool_t *ipls_list[IPL_LOGSIZE];
+} ip_pool_stat_t;
+
+
+extern ip_pool_stat_t ipoolstat;
+extern ip_pool_t *ip_pool_list[IPL_LOGSIZE];
+
+extern int ip_pool_search __P((void *, int, void *));
+extern int ip_pool_init __P((void));
+extern void ip_pool_fini __P((void));
+extern int ip_pool_create __P((iplookupop_t *));
+extern int ip_pool_insert __P((ip_pool_t *, i6addr_t *, i6addr_t *, int));
+extern int ip_pool_remove __P((ip_pool_t *, ip_pool_node_t *));
+extern int ip_pool_destroy __P((int, char *));
+extern void ip_pool_free __P((ip_pool_t *));
+extern void ip_pool_deref __P((ip_pool_t *));
+extern void ip_pool_node_deref __P((ip_pool_node_t *));
+extern void *ip_pool_find __P((int, char *));
+extern ip_pool_node_t *ip_pool_findeq __P((ip_pool_t *,
+ addrfamily_t *, addrfamily_t *));
+extern int ip_pool_flush __P((iplookupflush_t *));
+extern int ip_pool_statistics __P((iplookupop_t *));
+extern int ip_pool_getnext __P((ipftoken_t *, ipflookupiter_t *));
+extern void ip_pool_iterderef __P((u_int, int, void *));
+
+#endif /* __IP_POOL_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_pptp_pxy.c b/sys/contrib/ipfilter/netinet/ip_pptp_pxy.c
new file mode 100644
index 0000000..3924d4b
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_pptp_pxy.c
@@ -0,0 +1,530 @@
+/*
+ * Copyright (C) 2002-2003 by Darren Reed
+ *
+ * Simple PPTP transparent proxy for in-kernel use. For use with the NAT
+ * code.
+ *
+ * $Id: ip_pptp_pxy.c,v 2.10.2.15 2006/10/31 12:11:23 darrenr Exp $
+ *
+ */
+#define IPF_PPTP_PROXY
+
+typedef struct pptp_hdr {
+ u_short pptph_len;
+ u_short pptph_type;
+ u_32_t pptph_cookie;
+} pptp_hdr_t;
+
+#define PPTP_MSGTYPE_CTL 1
+#define PPTP_MTCTL_STARTREQ 1
+#define PPTP_MTCTL_STARTREP 2
+#define PPTP_MTCTL_STOPREQ 3
+#define PPTP_MTCTL_STOPREP 4
+#define PPTP_MTCTL_ECHOREQ 5
+#define PPTP_MTCTL_ECHOREP 6
+#define PPTP_MTCTL_OUTREQ 7
+#define PPTP_MTCTL_OUTREP 8
+#define PPTP_MTCTL_INREQ 9
+#define PPTP_MTCTL_INREP 10
+#define PPTP_MTCTL_INCONNECT 11
+#define PPTP_MTCTL_CLEAR 12
+#define PPTP_MTCTL_DISCONNECT 13
+#define PPTP_MTCTL_WANERROR 14
+#define PPTP_MTCTL_LINKINFO 15
+
+
+int ippr_pptp_init __P((void));
+void ippr_pptp_fini __P((void));
+int ippr_pptp_new __P((fr_info_t *, ap_session_t *, nat_t *));
+void ippr_pptp_del __P((ap_session_t *));
+int ippr_pptp_inout __P((fr_info_t *, ap_session_t *, nat_t *));
+void ippr_pptp_donatstate __P((fr_info_t *, nat_t *, pptp_pxy_t *));
+int ippr_pptp_message __P((fr_info_t *, nat_t *, pptp_pxy_t *, pptp_side_t *));
+int ippr_pptp_nextmessage __P((fr_info_t *, nat_t *, pptp_pxy_t *, int));
+int ippr_pptp_mctl __P((fr_info_t *, nat_t *, pptp_pxy_t *, pptp_side_t *));
+
+static frentry_t pptpfr;
+
+int pptp_proxy_init = 0;
+int ippr_pptp_debug = 0;
+int ippr_pptp_gretimeout = IPF_TTLVAL(120); /* 2 minutes */
+
+
+/*
+ * PPTP application proxy initialization.
+ */
+int ippr_pptp_init()
+{
+ bzero((char *)&pptpfr, sizeof(pptpfr));
+ pptpfr.fr_ref = 1;
+ pptpfr.fr_age[0] = ippr_pptp_gretimeout;
+ pptpfr.fr_age[1] = ippr_pptp_gretimeout;
+ pptpfr.fr_flags = FR_OUTQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ MUTEX_INIT(&pptpfr.fr_lock, "PPTP proxy rule lock");
+ pptp_proxy_init = 1;
+
+ return 0;
+}
+
+
+void ippr_pptp_fini()
+{
+ if (pptp_proxy_init == 1) {
+ MUTEX_DESTROY(&pptpfr.fr_lock);
+ pptp_proxy_init = 0;
+ }
+}
+
+
+/*
+ * Setup for a new PPTP proxy.
+ *
+ * NOTE: The printf's are broken up with %s in them to prevent them being
+ * optimised into puts statements on FreeBSD (this doesn't exist in the kernel)
+ */
+int ippr_pptp_new(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ pptp_pxy_t *pptp;
+ ipnat_t *ipn;
+ ip_t *ip;
+
+ ip = fin->fin_ip;
+
+ if (nat_outlookup(fin, 0, IPPROTO_GRE, nat->nat_inip,
+ ip->ip_dst) != NULL) {
+ if (ippr_pptp_debug > 0)
+ printf("ippr_pptp_new: GRE session %s\n",
+ "already exists");
+ return -1;
+ }
+
+ aps->aps_psiz = sizeof(*pptp);
+ KMALLOCS(aps->aps_data, pptp_pxy_t *, sizeof(*pptp));
+ if (aps->aps_data == NULL) {
+ if (ippr_pptp_debug > 0)
+ printf("ippr_pptp_new: malloc for aps_data %s\n",
+ "failed");
+ return -1;
+ }
+
+ /*
+ * Create NAT rule against which the tunnel/transport mapping is
+ * created. This is required because the current NAT rule does not
+ * describe GRE but TCP instead.
+ */
+ pptp = aps->aps_data;
+ bzero((char *)pptp, sizeof(*pptp));
+ ipn = &pptp->pptp_rule;
+ ipn->in_ifps[0] = fin->fin_ifp;
+ ipn->in_apr = NULL;
+ ipn->in_use = 1;
+ ipn->in_hits = 1;
+ ipn->in_ippip = 1;
+ if (nat->nat_dir == NAT_OUTBOUND) {
+ ipn->in_nip = ntohl(nat->nat_outip.s_addr);
+ ipn->in_outip = fin->fin_saddr;
+ ipn->in_redir = NAT_MAP;
+ } else if (nat->nat_dir == NAT_INBOUND) {
+ ipn->in_nip = 0;
+ ipn->in_outip = nat->nat_outip.s_addr;
+ ipn->in_redir = NAT_REDIRECT;
+ }
+ ipn->in_inip = nat->nat_inip.s_addr;
+ ipn->in_inmsk = 0xffffffff;
+ ipn->in_outmsk = 0xffffffff;
+ ipn->in_srcip = fin->fin_saddr;
+ ipn->in_srcmsk = 0xffffffff;
+ bcopy(nat->nat_ptr->in_ifnames[0], ipn->in_ifnames[0],
+ sizeof(ipn->in_ifnames[0]));
+ ipn->in_p = IPPROTO_GRE;
+
+ pptp->pptp_side[0].pptps_wptr = pptp->pptp_side[0].pptps_buffer;
+ pptp->pptp_side[1].pptps_wptr = pptp->pptp_side[1].pptps_buffer;
+ return 0;
+}
+
+
+void ippr_pptp_donatstate(fin, nat, pptp)
+fr_info_t *fin;
+nat_t *nat;
+pptp_pxy_t *pptp;
+{
+ fr_info_t fi;
+ grehdr_t gre;
+ nat_t *nat2;
+ u_char p;
+ ip_t *ip;
+
+ ip = fin->fin_ip;
+ p = ip->ip_p;
+
+ nat2 = pptp->pptp_nat;
+ if ((nat2 == NULL) || (pptp->pptp_state == NULL)) {
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ bzero((char *)&gre, sizeof(gre));
+ fi.fin_state = NULL;
+ fi.fin_nat = NULL;
+ fi.fin_fi.fi_p = IPPROTO_GRE;
+ fi.fin_fr = &pptpfr;
+ if ((nat->nat_dir == NAT_OUTBOUND && fin->fin_out) ||
+ (nat->nat_dir == NAT_INBOUND && !fin->fin_out)) {
+ fi.fin_data[0] = pptp->pptp_call[0];
+ fi.fin_data[1] = pptp->pptp_call[1];
+ } else {
+ fi.fin_data[0] = pptp->pptp_call[1];
+ fi.fin_data[1] = pptp->pptp_call[0];
+ }
+ ip = fin->fin_ip;
+ ip->ip_p = IPPROTO_GRE;
+ fi.fin_flx &= ~(FI_TCPUDP|FI_STATE|FI_FRAG);
+ fi.fin_flx |= FI_IGNORE;
+ fi.fin_dp = &gre;
+ gre.gr_flags = htons(1 << 13);
+ if (fin->fin_out && nat->nat_dir == NAT_INBOUND) {
+ fi.fin_fi.fi_saddr = fin->fin_fi.fi_daddr;
+ fi.fin_fi.fi_daddr = nat->nat_outip.s_addr;
+ } else if (!fin->fin_out && nat->nat_dir == NAT_OUTBOUND) {
+ fi.fin_fi.fi_saddr = nat->nat_inip.s_addr;
+ fi.fin_fi.fi_daddr = fin->fin_fi.fi_saddr;
+ }
+ }
+
+ /*
+ * Update NAT timeout/create NAT if missing.
+ */
+ if (nat2 != NULL)
+ fr_queueback(&nat2->nat_tqe);
+ else {
+ nat2 = nat_new(&fi, &pptp->pptp_rule, &pptp->pptp_nat,
+ NAT_SLAVE, nat->nat_dir);
+ pptp->pptp_nat = nat2;
+ if (nat2 != NULL) {
+ (void) nat_proto(&fi, nat2, 0);
+ nat_update(&fi, nat2, nat2->nat_ptr);
+ }
+ }
+
+ READ_ENTER(&ipf_state);
+ if (pptp->pptp_state != NULL) {
+ fr_queueback(&pptp->pptp_state->is_sti);
+ RWLOCK_EXIT(&ipf_state);
+ } else {
+ RWLOCK_EXIT(&ipf_state);
+ if (nat2 != NULL) {
+ if (nat->nat_dir == NAT_INBOUND)
+ fi.fin_fi.fi_daddr = nat2->nat_inip.s_addr;
+ else
+ fi.fin_fi.fi_saddr = nat2->nat_inip.s_addr;
+ }
+ fi.fin_ifp = NULL;
+ pptp->pptp_state = fr_addstate(&fi, &pptp->pptp_state,
+ 0);
+ if (fi.fin_state != NULL)
+ fr_statederef((ipstate_t **)&fi.fin_state);
+ }
+ ip->ip_p = p;
+ return;
+}
+
+
+/*
+ * Try and build up the next PPTP message in the TCP stream and if we can
+ * build it up completely (fits in our buffer) then pass it off to the message
+ * parsing function.
+ */
+int ippr_pptp_nextmessage(fin, nat, pptp, rev)
+fr_info_t *fin;
+nat_t *nat;
+pptp_pxy_t *pptp;
+int rev;
+{
+ static const char *funcname = "ippr_pptp_nextmessage";
+ pptp_side_t *pptps;
+ u_32_t start, end;
+ pptp_hdr_t *hdr;
+ tcphdr_t *tcp;
+ int dlen, off;
+ u_short len;
+ char *msg;
+
+ tcp = fin->fin_dp;
+ dlen = fin->fin_dlen - (TCP_OFF(tcp) << 2);
+ start = ntohl(tcp->th_seq);
+ pptps = &pptp->pptp_side[rev];
+ off = (char *)tcp - (char *)fin->fin_ip + (TCP_OFF(tcp) << 2) +
+ fin->fin_ipoff;
+
+ if (dlen <= 0)
+ return 0;
+ /*
+ * If the complete data packet is before what we expect to see
+ * "next", just ignore it as the chances are we've already seen it.
+ * The next if statement following this one really just causes packets
+ * ahead of what we've seen to be dropped, implying that something in
+ * the middle went missing and we want to see that first.
+ */
+ end = start + dlen;
+ if (pptps->pptps_next > end && pptps->pptps_next > start)
+ return 0;
+
+ if (pptps->pptps_next != start) {
+ if (ippr_pptp_debug > 5)
+ printf("%s: next (%x) != start (%x)\n", funcname,
+ pptps->pptps_next, start);
+ return -1;
+ }
+
+ msg = (char *)fin->fin_dp + (TCP_OFF(tcp) << 2);
+
+ while (dlen > 0) {
+ off += pptps->pptps_bytes;
+ if (pptps->pptps_gothdr == 0) {
+ /*
+ * PPTP has an 8 byte header that inclues the cookie.
+ * The start of every message should include one and
+ * it should match 1a2b3c4d. Byte order is ignored,
+ * deliberately, when printing out the error.
+ */
+ len = MIN(8 - pptps->pptps_bytes, dlen);
+ COPYDATA(fin->fin_m, off, len, pptps->pptps_wptr);
+ pptps->pptps_bytes += len;
+ pptps->pptps_wptr += len;
+ hdr = (pptp_hdr_t *)pptps->pptps_buffer;
+ if (pptps->pptps_bytes == 8) {
+ pptps->pptps_next += 8;
+ if (ntohl(hdr->pptph_cookie) != 0x1a2b3c4d) {
+ if (ippr_pptp_debug > 1)
+ printf("%s: bad cookie (%x)\n",
+ funcname,
+ hdr->pptph_cookie);
+ return -1;
+ }
+ }
+ dlen -= len;
+ msg += len;
+ off += len;
+
+ pptps->pptps_gothdr = 1;
+ len = ntohs(hdr->pptph_len);
+ pptps->pptps_len = len;
+ pptps->pptps_nexthdr += len;
+
+ /*
+ * If a message is too big for the buffer, just set
+ * the fields for the next message to come along.
+ * The messages defined in RFC 2637 will not exceed
+ * 512 bytes (in total length) so this is likely a
+ * bad data packet, anyway.
+ */
+ if (len > sizeof(pptps->pptps_buffer)) {
+ if (ippr_pptp_debug > 3)
+ printf("%s: message too big (%d)\n",
+ funcname, len);
+ pptps->pptps_next = pptps->pptps_nexthdr;
+ pptps->pptps_wptr = pptps->pptps_buffer;
+ pptps->pptps_gothdr = 0;
+ pptps->pptps_bytes = 0;
+ pptps->pptps_len = 0;
+ break;
+ }
+ }
+
+ len = MIN(pptps->pptps_len - pptps->pptps_bytes, dlen);
+ COPYDATA(fin->fin_m, off, len, pptps->pptps_wptr);
+ pptps->pptps_bytes += len;
+ pptps->pptps_wptr += len;
+ pptps->pptps_next += len;
+
+ if (pptps->pptps_len > pptps->pptps_bytes)
+ break;
+
+ ippr_pptp_message(fin, nat, pptp, pptps);
+ pptps->pptps_wptr = pptps->pptps_buffer;
+ pptps->pptps_gothdr = 0;
+ pptps->pptps_bytes = 0;
+ pptps->pptps_len = 0;
+
+ start += len;
+ msg += len;
+ dlen -= len;
+ }
+
+ return 0;
+}
+
+
+/*
+ * handle a complete PPTP message
+ */
+int ippr_pptp_message(fin, nat, pptp, pptps)
+fr_info_t *fin;
+nat_t *nat;
+pptp_pxy_t *pptp;
+pptp_side_t *pptps;
+{
+ pptp_hdr_t *hdr = (pptp_hdr_t *)pptps->pptps_buffer;
+
+ switch (ntohs(hdr->pptph_type))
+ {
+ case PPTP_MSGTYPE_CTL :
+ ippr_pptp_mctl(fin, nat, pptp, pptps);
+ break;
+
+ default :
+ break;
+ }
+ return 0;
+}
+
+
+/*
+ * handle a complete PPTP control message
+ */
+int ippr_pptp_mctl(fin, nat, pptp, pptps)
+fr_info_t *fin;
+nat_t *nat;
+pptp_pxy_t *pptp;
+pptp_side_t *pptps;
+{
+ u_short *buffer = (u_short *)(pptps->pptps_buffer);
+ pptp_side_t *pptpo;
+
+ if (pptps == &pptp->pptp_side[0])
+ pptpo = &pptp->pptp_side[1];
+ else
+ pptpo = &pptp->pptp_side[0];
+
+ /*
+ * Breakout to handle all the various messages. Most are just state
+ * transition.
+ */
+ switch (ntohs(buffer[4]))
+ {
+ case PPTP_MTCTL_STARTREQ :
+ pptps->pptps_state = PPTP_MTCTL_STARTREQ;
+ break;
+ case PPTP_MTCTL_STARTREP :
+ if (pptpo->pptps_state == PPTP_MTCTL_STARTREQ)
+ pptps->pptps_state = PPTP_MTCTL_STARTREP;
+ break;
+ case PPTP_MTCTL_STOPREQ :
+ pptps->pptps_state = PPTP_MTCTL_STOPREQ;
+ break;
+ case PPTP_MTCTL_STOPREP :
+ if (pptpo->pptps_state == PPTP_MTCTL_STOPREQ)
+ pptps->pptps_state = PPTP_MTCTL_STOPREP;
+ break;
+ case PPTP_MTCTL_ECHOREQ :
+ pptps->pptps_state = PPTP_MTCTL_ECHOREQ;
+ break;
+ case PPTP_MTCTL_ECHOREP :
+ if (pptpo->pptps_state == PPTP_MTCTL_ECHOREQ)
+ pptps->pptps_state = PPTP_MTCTL_ECHOREP;
+ break;
+ case PPTP_MTCTL_OUTREQ :
+ pptps->pptps_state = PPTP_MTCTL_OUTREQ;
+ break;
+ case PPTP_MTCTL_OUTREP :
+ if (pptpo->pptps_state == PPTP_MTCTL_OUTREQ) {
+ pptps->pptps_state = PPTP_MTCTL_OUTREP;
+ pptp->pptp_call[0] = buffer[7];
+ pptp->pptp_call[1] = buffer[6];
+ ippr_pptp_donatstate(fin, nat, pptp);
+ }
+ break;
+ case PPTP_MTCTL_INREQ :
+ pptps->pptps_state = PPTP_MTCTL_INREQ;
+ break;
+ case PPTP_MTCTL_INREP :
+ if (pptpo->pptps_state == PPTP_MTCTL_INREQ) {
+ pptps->pptps_state = PPTP_MTCTL_INREP;
+ pptp->pptp_call[0] = buffer[7];
+ pptp->pptp_call[1] = buffer[6];
+ ippr_pptp_donatstate(fin, nat, pptp);
+ }
+ break;
+ case PPTP_MTCTL_INCONNECT :
+ pptps->pptps_state = PPTP_MTCTL_INCONNECT;
+ break;
+ case PPTP_MTCTL_CLEAR :
+ pptps->pptps_state = PPTP_MTCTL_CLEAR;
+ break;
+ case PPTP_MTCTL_DISCONNECT :
+ pptps->pptps_state = PPTP_MTCTL_DISCONNECT;
+ break;
+ case PPTP_MTCTL_WANERROR :
+ pptps->pptps_state = PPTP_MTCTL_WANERROR;
+ break;
+ case PPTP_MTCTL_LINKINFO :
+ pptps->pptps_state = PPTP_MTCTL_LINKINFO;
+ break;
+ }
+
+ return 0;
+}
+
+
+/*
+ * For outgoing PPTP packets. refresh timeouts for NAT & state entries, if
+ * we can. If they have disappeared, recreate them.
+ */
+int ippr_pptp_inout(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ pptp_pxy_t *pptp;
+ tcphdr_t *tcp;
+ int rev;
+
+ if ((fin->fin_out == 1) && (nat->nat_dir == NAT_INBOUND))
+ rev = 1;
+ else if ((fin->fin_out == 0) && (nat->nat_dir == NAT_OUTBOUND))
+ rev = 1;
+ else
+ rev = 0;
+
+ tcp = (tcphdr_t *)fin->fin_dp;
+ if ((tcp->th_flags & TH_OPENING) == TH_OPENING) {
+ pptp = (pptp_pxy_t *)aps->aps_data;
+ pptp->pptp_side[1 - rev].pptps_next = ntohl(tcp->th_ack);
+ pptp->pptp_side[1 - rev].pptps_nexthdr = ntohl(tcp->th_ack);
+ pptp->pptp_side[rev].pptps_next = ntohl(tcp->th_seq) + 1;
+ pptp->pptp_side[rev].pptps_nexthdr = ntohl(tcp->th_seq) + 1;
+ }
+ return ippr_pptp_nextmessage(fin, nat, (pptp_pxy_t *)aps->aps_data,
+ rev);
+}
+
+
+/*
+ * clean up after ourselves.
+ */
+void ippr_pptp_del(aps)
+ap_session_t *aps;
+{
+ pptp_pxy_t *pptp;
+
+ pptp = aps->aps_data;
+
+ if (pptp != NULL) {
+ /*
+ * Don't bother changing any of the NAT structure details,
+ * *_del() is on a callback from aps_free(), from nat_delete()
+ */
+
+ READ_ENTER(&ipf_state);
+ if (pptp->pptp_state != NULL) {
+ pptp->pptp_state->is_die = fr_ticks + 1;
+ pptp->pptp_state->is_me = NULL;
+ fr_queuefront(&pptp->pptp_state->is_sti);
+ }
+ RWLOCK_EXIT(&ipf_state);
+
+ pptp->pptp_state = NULL;
+ pptp->pptp_nat = NULL;
+ }
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_proxy.c b/sys/contrib/ipfilter/netinet/ip_proxy.c
new file mode 100644
index 0000000..b04331e
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_proxy.c
@@ -0,0 +1,857 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1997-2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/file.h>
+#if !defined(AIX)
+# include <sys/fcntl.h>
+#endif
+#if !defined(_KERNEL) && !defined(__KERNEL__)
+# include <stdio.h>
+# include <string.h>
+# include <stdlib.h>
+# include <ctype.h>
+# define _KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+#endif
+#if !defined(linux)
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if defined(_KERNEL)
+# if !defined(__NetBSD__) && !defined(sun) && !defined(__osf__) && \
+ !defined(__OpenBSD__) && !defined(__hpux) && !defined(__sgi) && \
+ !defined(AIX)
+# include <sys/ctype.h>
+# endif
+# include <sys/systm.h>
+# if !defined(__SVR4) && !defined(__svr4__)
+# include <sys/mbuf.h>
+# endif
+#endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 220000)
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+# if (__FreeBSD_version >= 300000) && !defined(IPFILTER_LKM)
+# include "opt_ipfilter.h"
+# endif
+#else
+# include <sys/ioctl.h>
+#endif
+#if defined(__SVR4) || defined(__svr4__)
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+#if __FreeBSD__ > 2
+# include <sys/queue.h>
+#endif
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#ifndef linux
+# include <netinet/ip_var.h>
+#endif
+#include <netinet/tcp.h>
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_proxy.h"
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+#endif
+
+#include "netinet/ip_ftp_pxy.c"
+#include "netinet/ip_rcmd_pxy.c"
+# include "netinet/ip_pptp_pxy.c"
+#if defined(_KERNEL)
+# include "netinet/ip_irc_pxy.c"
+# include "netinet/ip_raudio_pxy.c"
+# include "netinet/ip_netbios_pxy.c"
+#endif
+#include "netinet/ip_ipsec_pxy.c"
+#include "netinet/ip_rpcb_pxy.c"
+
+/* END OF INCLUDES */
+
+#if !defined(lint)
+static const char rcsid[] = "@(#)$Id: ip_proxy.c,v 2.62.2.20 2007/05/31 12:27:36 darrenr Exp $";
+#endif
+
+static int appr_fixseqack __P((fr_info_t *, ip_t *, ap_session_t *, int ));
+
+#define AP_SESS_SIZE 53
+
+#if defined(_KERNEL)
+int ipf_proxy_debug = 0;
+#else
+int ipf_proxy_debug = 2;
+#endif
+ap_session_t *ap_sess_tab[AP_SESS_SIZE];
+ap_session_t *ap_sess_list = NULL;
+aproxy_t *ap_proxylist = NULL;
+aproxy_t ap_proxies[] = {
+#ifdef IPF_FTP_PROXY
+ { NULL, "ftp", (char)IPPROTO_TCP, 0, 0, ippr_ftp_init, ippr_ftp_fini,
+ ippr_ftp_new, NULL, ippr_ftp_in, ippr_ftp_out, NULL, NULL },
+#endif
+#ifdef IPF_IRC_PROXY
+ { NULL, "irc", (char)IPPROTO_TCP, 0, 0, ippr_irc_init, ippr_irc_fini,
+ ippr_irc_new, NULL, NULL, ippr_irc_out, NULL, NULL },
+#endif
+#ifdef IPF_RCMD_PROXY
+ { NULL, "rcmd", (char)IPPROTO_TCP, 0, 0, ippr_rcmd_init, ippr_rcmd_fini,
+ ippr_rcmd_new, NULL, ippr_rcmd_in, ippr_rcmd_out, NULL, NULL },
+#endif
+#ifdef IPF_RAUDIO_PROXY
+ { NULL, "raudio", (char)IPPROTO_TCP, 0, 0, ippr_raudio_init, ippr_raudio_fini,
+ ippr_raudio_new, NULL, ippr_raudio_in, ippr_raudio_out, NULL, NULL },
+#endif
+#ifdef IPF_MSNRPC_PROXY
+ { NULL, "msnrpc", (char)IPPROTO_TCP, 0, 0, ippr_msnrpc_init, ippr_msnrpc_fini,
+ ippr_msnrpc_new, NULL, ippr_msnrpc_in, ippr_msnrpc_out, NULL, NULL },
+#endif
+#ifdef IPF_NETBIOS_PROXY
+ { NULL, "netbios", (char)IPPROTO_UDP, 0, 0, ippr_netbios_init, ippr_netbios_fini,
+ NULL, NULL, NULL, ippr_netbios_out, NULL, NULL },
+#endif
+#ifdef IPF_IPSEC_PROXY
+ { NULL, "ipsec", (char)IPPROTO_UDP, 0, 0,
+ ippr_ipsec_init, ippr_ipsec_fini, ippr_ipsec_new, ippr_ipsec_del,
+ ippr_ipsec_inout, ippr_ipsec_inout, ippr_ipsec_match, NULL },
+#endif
+#ifdef IPF_PPTP_PROXY
+ { NULL, "pptp", (char)IPPROTO_TCP, 0, 0,
+ ippr_pptp_init, ippr_pptp_fini, ippr_pptp_new, ippr_pptp_del,
+ ippr_pptp_inout, ippr_pptp_inout, NULL, NULL },
+#endif
+#ifdef IPF_H323_PROXY
+ { NULL, "h323", (char)IPPROTO_TCP, 0, 0, ippr_h323_init, ippr_h323_fini,
+ ippr_h323_new, ippr_h323_del, ippr_h323_in, NULL, NULL, NULL },
+ { NULL, "h245", (char)IPPROTO_TCP, 0, 0, NULL, NULL,
+ ippr_h245_new, NULL, NULL, ippr_h245_out, NULL, NULL },
+#endif
+#ifdef IPF_RPCB_PROXY
+# if 0
+ { NULL, "rpcbt", (char)IPPROTO_TCP, 0, 0,
+ ippr_rpcb_init, ippr_rpcb_fini, ippr_rpcb_new, ippr_rpcb_del,
+ ippr_rpcb_in, ippr_rpcb_out, NULL, NULL },
+# endif
+ { NULL, "rpcbu", (char)IPPROTO_UDP, 0, 0,
+ ippr_rpcb_init, ippr_rpcb_fini, ippr_rpcb_new, ippr_rpcb_del,
+ ippr_rpcb_in, ippr_rpcb_out, NULL, NULL },
+#endif
+ { NULL, "", '\0', 0, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }
+};
+
+/*
+ * Dynamically add a new kernel proxy. Ensure that it is unique in the
+ * collection compiled in and dynamically added.
+ */
+int appr_add(ap)
+aproxy_t *ap;
+{
+ aproxy_t *a;
+
+ for (a = ap_proxies; a->apr_p; a++)
+ if ((a->apr_p == ap->apr_p) &&
+ !strncmp(a->apr_label, ap->apr_label,
+ sizeof(ap->apr_label))) {
+ if (ipf_proxy_debug > 1)
+ printf("appr_add: %s/%d already present (B)\n",
+ a->apr_label, a->apr_p);
+ return -1;
+ }
+
+ for (a = ap_proxylist; (a != NULL); a = a->apr_next)
+ if ((a->apr_p == ap->apr_p) &&
+ !strncmp(a->apr_label, ap->apr_label,
+ sizeof(ap->apr_label))) {
+ if (ipf_proxy_debug > 1)
+ printf("appr_add: %s/%d already present (D)\n",
+ a->apr_label, a->apr_p);
+ return -1;
+ }
+ ap->apr_next = ap_proxylist;
+ ap_proxylist = ap;
+ if (ap->apr_init != NULL)
+ return (*ap->apr_init)();
+ return 0;
+}
+
+
+/*
+ * Check to see if the proxy this control request has come through for
+ * exists, and if it does and it has a control function then invoke that
+ * control function.
+ */
+int appr_ctl(ctl)
+ap_ctl_t *ctl;
+{
+ aproxy_t *a;
+ int error;
+
+ a = appr_lookup(ctl->apc_p, ctl->apc_label);
+ if (a == NULL) {
+ if (ipf_proxy_debug > 1)
+ printf("appr_ctl: can't find %s/%d\n",
+ ctl->apc_label, ctl->apc_p);
+ error = ESRCH;
+ } else if (a->apr_ctl == NULL) {
+ if (ipf_proxy_debug > 1)
+ printf("appr_ctl: no ctl function for %s/%d\n",
+ ctl->apc_label, ctl->apc_p);
+ error = ENXIO;
+ } else {
+ error = (*a->apr_ctl)(a, ctl);
+ if ((error != 0) && (ipf_proxy_debug > 1))
+ printf("appr_ctl: %s/%d ctl error %d\n",
+ a->apr_label, a->apr_p, error);
+ }
+ return error;
+}
+
+
+/*
+ * Delete a proxy that has been added dynamically from those available.
+ * If it is in use, return 1 (do not destroy NOW), not in use 0 or -1
+ * if it cannot be matched.
+ */
+int appr_del(ap)
+aproxy_t *ap;
+{
+ aproxy_t *a, **app;
+
+ for (app = &ap_proxylist; ((a = *app) != NULL); app = &a->apr_next)
+ if (a == ap) {
+ a->apr_flags |= APR_DELETE;
+ *app = a->apr_next;
+ if (ap->apr_ref != 0) {
+ if (ipf_proxy_debug > 2)
+ printf("appr_del: orphaning %s/%d\n",
+ ap->apr_label, ap->apr_p);
+ return 1;
+ }
+ return 0;
+ }
+ if (ipf_proxy_debug > 1)
+ printf("appr_del: proxy %lx not found\n", (u_long)ap);
+ return -1;
+}
+
+
+/*
+ * Return 1 if the packet is a good match against a proxy, else 0.
+ */
+int appr_ok(fin, tcp, nat)
+fr_info_t *fin;
+tcphdr_t *tcp;
+ipnat_t *nat;
+{
+ aproxy_t *apr = nat->in_apr;
+ u_short dport = nat->in_dport;
+
+ if ((apr == NULL) || (apr->apr_flags & APR_DELETE) ||
+ (fin->fin_p != apr->apr_p))
+ return 0;
+ if ((tcp == NULL) && dport)
+ return 0;
+ return 1;
+}
+
+
+int appr_ioctl(data, cmd, mode, ctx)
+caddr_t data;
+ioctlcmd_t cmd;
+int mode;
+void *ctx;
+{
+ ap_ctl_t ctl;
+ caddr_t ptr;
+ int error;
+
+ mode = mode; /* LINT */
+
+ switch (cmd)
+ {
+ case SIOCPROXY :
+ BCOPYIN(data, &ctl, sizeof(ctl));
+ ptr = NULL;
+
+ if (ctl.apc_dsize > 0) {
+ KMALLOCS(ptr, caddr_t, ctl.apc_dsize);
+ if (ptr == NULL)
+ error = ENOMEM;
+ else {
+ error = copyinptr(ctl.apc_data, ptr,
+ ctl.apc_dsize);
+ if (error == 0)
+ ctl.apc_data = ptr;
+ }
+ } else {
+ ctl.apc_data = NULL;
+ error = 0;
+ }
+
+ if (error == 0)
+ error = appr_ctl(&ctl);
+
+ if (ptr != NULL) {
+ KFREES(ptr, ctl.apc_dsize);
+ }
+ break;
+
+ default :
+ error = EINVAL;
+ }
+ return error;
+}
+
+
+/*
+ * If a proxy has a match function, call that to do extended packet
+ * matching.
+ */
+int appr_match(fin, nat)
+fr_info_t *fin;
+nat_t *nat;
+{
+ aproxy_t *apr;
+ ipnat_t *ipn;
+ int result;
+
+ ipn = nat->nat_ptr;
+ if (ipf_proxy_debug > 8)
+ printf("appr_match(%lx,%lx) aps %lx ptr %lx\n",
+ (u_long)fin, (u_long)nat, (u_long)nat->nat_aps,
+ (u_long)ipn);
+
+ if ((fin->fin_flx & (FI_SHORT|FI_BAD)) != 0) {
+ if (ipf_proxy_debug > 0)
+ printf("appr_match: flx 0x%x (BAD|SHORT)\n",
+ fin->fin_flx);
+ return -1;
+ }
+
+ apr = ipn->in_apr;
+ if ((apr == NULL) || (apr->apr_flags & APR_DELETE)) {
+ if (ipf_proxy_debug > 0)
+ printf("appr_match:apr %lx apr_flags 0x%x\n",
+ (u_long)apr, apr ? apr->apr_flags : 0);
+ return -1;
+ }
+
+ if (apr->apr_match != NULL) {
+ result = (*apr->apr_match)(fin, nat->nat_aps, nat);
+ if (result != 0) {
+ if (ipf_proxy_debug > 4)
+ printf("appr_match: result %d\n", result);
+ return -1;
+ }
+ }
+ return 0;
+}
+
+
+/*
+ * Allocate a new application proxy structure and fill it in with the
+ * relevant details. call the init function once complete, prior to
+ * returning.
+ */
+int appr_new(fin, nat)
+fr_info_t *fin;
+nat_t *nat;
+{
+ register ap_session_t *aps;
+ aproxy_t *apr;
+
+ if (ipf_proxy_debug > 8)
+ printf("appr_new(%lx,%lx) \n", (u_long)fin, (u_long)nat);
+
+ if ((nat->nat_ptr == NULL) || (nat->nat_aps != NULL)) {
+ if (ipf_proxy_debug > 0)
+ printf("appr_new: nat_ptr %lx nat_aps %lx\n",
+ (u_long)nat->nat_ptr, (u_long)nat->nat_aps);
+ return -1;
+ }
+
+ apr = nat->nat_ptr->in_apr;
+
+ if ((apr->apr_flags & APR_DELETE) ||
+ (fin->fin_p != apr->apr_p)) {
+ if (ipf_proxy_debug > 2)
+ printf("appr_new: apr_flags 0x%x p %d/%d\n",
+ apr->apr_flags, fin->fin_p, apr->apr_p);
+ return -1;
+ }
+
+ KMALLOC(aps, ap_session_t *);
+ if (!aps) {
+ if (ipf_proxy_debug > 0)
+ printf("appr_new: malloc failed (%lu)\n",
+ (u_long)sizeof(ap_session_t));
+ return -1;
+ }
+
+ bzero((char *)aps, sizeof(*aps));
+ aps->aps_p = fin->fin_p;
+ aps->aps_data = NULL;
+ aps->aps_apr = apr;
+ aps->aps_psiz = 0;
+ if (apr->apr_new != NULL)
+ if ((*apr->apr_new)(fin, aps, nat) == -1) {
+ if ((aps->aps_data != NULL) && (aps->aps_psiz != 0)) {
+ KFREES(aps->aps_data, aps->aps_psiz);
+ }
+ KFREE(aps);
+ if (ipf_proxy_debug > 2)
+ printf("appr_new: new(%lx) failed\n",
+ (u_long)apr->apr_new);
+ return -1;
+ }
+ aps->aps_nat = nat;
+ aps->aps_next = ap_sess_list;
+ ap_sess_list = aps;
+ nat->nat_aps = aps;
+
+ return 0;
+}
+
+
+/*
+ * Check to see if a packet should be passed through an active proxy routine
+ * if one has been setup for it. We don't need to check the checksum here if
+ * IPFILTER_CKSUM is defined because if it is, a failed check causes FI_BAD
+ * to be set.
+ */
+int appr_check(fin, nat)
+fr_info_t *fin;
+nat_t *nat;
+{
+#if SOLARIS && defined(_KERNEL) && (SOLARIS2 >= 6)
+# if defined(ICK_VALID)
+ mb_t *m;
+# endif
+ int dosum = 1;
+#endif
+ tcphdr_t *tcp = NULL;
+ udphdr_t *udp = NULL;
+ ap_session_t *aps;
+ aproxy_t *apr;
+ ip_t *ip;
+ short rv;
+ int err;
+#if !defined(_KERNEL) || defined(MENTAT) || defined(__sgi)
+ u_32_t s1, s2, sd;
+#endif
+
+ if (fin->fin_flx & FI_BAD) {
+ if (ipf_proxy_debug > 0)
+ printf("appr_check: flx 0x%x (BAD)\n", fin->fin_flx);
+ return -1;
+ }
+
+#ifndef IPFILTER_CKSUM
+ if ((fin->fin_out == 0) && (fr_checkl4sum(fin) == -1)) {
+ if (ipf_proxy_debug > 0)
+ printf("appr_check: l4 checksum failure %d\n",
+ fin->fin_p);
+ if (fin->fin_p == IPPROTO_TCP)
+ frstats[fin->fin_out].fr_tcpbad++;
+ return -1;
+ }
+#endif
+
+ aps = nat->nat_aps;
+ if ((aps != NULL) && (aps->aps_p == fin->fin_p)) {
+ /*
+ * If there is data in this packet to be proxied then try and
+ * get it all into the one buffer, else drop it.
+ */
+#if defined(MENTAT) || defined(HAVE_M_PULLDOWN)
+ if ((fin->fin_dlen > 0) && !(fin->fin_flx & FI_COALESCE))
+ if (fr_coalesce(fin) == -1) {
+ if (ipf_proxy_debug > 0)
+ printf("appr_check: fr_coalesce failed %x\n", fin->fin_flx);
+ return -1;
+ }
+#endif
+ ip = fin->fin_ip;
+
+ switch (fin->fin_p)
+ {
+ case IPPROTO_TCP :
+ tcp = (tcphdr_t *)fin->fin_dp;
+
+#if SOLARIS && defined(_KERNEL) && (SOLARIS2 >= 6) && defined(ICK_VALID)
+ m = fin->fin_qfm;
+ if (dohwcksum && (m->b_ick_flag == ICK_VALID))
+ dosum = 0;
+#endif
+ /*
+ * Don't bother the proxy with these...or in fact,
+ * should we free up proxy stuff when seen?
+ */
+ if ((fin->fin_tcpf & TH_RST) != 0)
+ break;
+ /*FALLTHROUGH*/
+ case IPPROTO_UDP :
+ udp = (udphdr_t *)fin->fin_dp;
+ break;
+ default :
+ break;
+ }
+
+ apr = aps->aps_apr;
+ err = 0;
+ if (fin->fin_out != 0) {
+ if (apr->apr_outpkt != NULL)
+ err = (*apr->apr_outpkt)(fin, aps, nat);
+ } else {
+ if (apr->apr_inpkt != NULL)
+ err = (*apr->apr_inpkt)(fin, aps, nat);
+ }
+
+ rv = APR_EXIT(err);
+ if (((ipf_proxy_debug > 0) && (rv != 0)) ||
+ (ipf_proxy_debug > 8))
+ printf("appr_check: out %d err %x rv %d\n",
+ fin->fin_out, err, rv);
+ if (rv == 1)
+ return -1;
+
+ if (rv == 2) {
+ appr_free(apr);
+ nat->nat_aps = NULL;
+ return -1;
+ }
+
+ /*
+ * If err != 0 then the data size of the packet has changed
+ * so we need to recalculate the header checksums for the
+ * packet.
+ */
+#if !defined(_KERNEL) || defined(MENTAT) || defined(__sgi)
+ if (err != 0) {
+ short adjlen = err & 0xffff;
+
+ s1 = LONG_SUM(fin->fin_plen - adjlen);
+ s2 = LONG_SUM(fin->fin_plen);
+ CALC_SUMD(s1, s2, sd);
+ fix_outcksum(fin, &ip->ip_sum, sd);
+ }
+#endif
+
+ /*
+ * For TCP packets, we may need to adjust the sequence and
+ * acknowledgement numbers to reflect changes in size of the
+ * data stream.
+ *
+ * For both TCP and UDP, recalculate the layer 4 checksum,
+ * regardless, as we can't tell (here) if data has been
+ * changed or not.
+ */
+ if (tcp != NULL) {
+ err = appr_fixseqack(fin, ip, aps, APR_INC(err));
+#if SOLARIS && defined(_KERNEL) && (SOLARIS2 >= 6)
+ if (dosum)
+ tcp->th_sum = fr_cksum(fin->fin_qfm, ip,
+ IPPROTO_TCP, tcp,
+ fin->fin_plen);
+#else
+ tcp->th_sum = fr_cksum(fin->fin_m, ip,
+ IPPROTO_TCP, tcp,
+ fin->fin_plen);
+#endif
+ } else if ((udp != NULL) && (udp->uh_sum != 0)) {
+#if SOLARIS && defined(_KERNEL) && (SOLARIS2 >= 6)
+ if (dosum)
+ udp->uh_sum = fr_cksum(fin->fin_qfm, ip,
+ IPPROTO_UDP, udp,
+ fin->fin_plen);
+#else
+ udp->uh_sum = fr_cksum(fin->fin_m, ip,
+ IPPROTO_UDP, udp,
+ fin->fin_plen);
+#endif
+ }
+ aps->aps_bytes += fin->fin_plen;
+ aps->aps_pkts++;
+ return 1;
+ }
+ return 0;
+}
+
+
+/*
+ * Search for an proxy by the protocol it is being used with and its name.
+ */
+aproxy_t *appr_lookup(pr, name)
+u_int pr;
+char *name;
+{
+ aproxy_t *ap;
+
+ if (ipf_proxy_debug > 8)
+ printf("appr_lookup(%d,%s)\n", pr, name);
+
+ for (ap = ap_proxies; ap->apr_p; ap++)
+ if ((ap->apr_p == pr) &&
+ !strncmp(name, ap->apr_label, sizeof(ap->apr_label))) {
+ ap->apr_ref++;
+ return ap;
+ }
+
+ for (ap = ap_proxylist; ap; ap = ap->apr_next)
+ if ((ap->apr_p == pr) &&
+ !strncmp(name, ap->apr_label, sizeof(ap->apr_label))) {
+ ap->apr_ref++;
+ return ap;
+ }
+ if (ipf_proxy_debug > 2)
+ printf("appr_lookup: failed for %d/%s\n", pr, name);
+ return NULL;
+}
+
+
+void appr_free(ap)
+aproxy_t *ap;
+{
+ ap->apr_ref--;
+}
+
+
+void aps_free(aps)
+ap_session_t *aps;
+{
+ ap_session_t *a, **ap;
+ aproxy_t *apr;
+
+ if (!aps)
+ return;
+
+ for (ap = &ap_sess_list; ((a = *ap) != NULL); ap = &a->aps_next)
+ if (a == aps) {
+ *ap = a->aps_next;
+ break;
+ }
+
+ apr = aps->aps_apr;
+ if ((apr != NULL) && (apr->apr_del != NULL))
+ (*apr->apr_del)(aps);
+
+ if ((aps->aps_data != NULL) && (aps->aps_psiz != 0))
+ KFREES(aps->aps_data, aps->aps_psiz);
+ KFREE(aps);
+}
+
+
+/*
+ * returns 2 if ack or seq number in TCP header is changed, returns 0 otherwise
+ */
+static int appr_fixseqack(fin, ip, aps, inc)
+fr_info_t *fin;
+ip_t *ip;
+ap_session_t *aps;
+int inc;
+{
+ int sel, ch = 0, out, nlen;
+ u_32_t seq1, seq2;
+ tcphdr_t *tcp;
+ short inc2;
+
+ tcp = (tcphdr_t *)fin->fin_dp;
+ out = fin->fin_out;
+ /*
+ * fin->fin_plen has already been adjusted by 'inc'.
+ */
+ nlen = fin->fin_plen;
+ nlen -= (IP_HL(ip) << 2) + (TCP_OFF(tcp) << 2);
+
+ inc2 = inc;
+ inc = (int)inc2;
+
+ if (out != 0) {
+ seq1 = (u_32_t)ntohl(tcp->th_seq);
+ sel = aps->aps_sel[out];
+
+ /* switch to other set ? */
+ if ((aps->aps_seqmin[!sel] > aps->aps_seqmin[sel]) &&
+ (seq1 > aps->aps_seqmin[!sel])) {
+ if (ipf_proxy_debug > 7)
+ printf("proxy out switch set seq %d -> %d %x > %x\n",
+ sel, !sel, seq1,
+ aps->aps_seqmin[!sel]);
+ sel = aps->aps_sel[out] = !sel;
+ }
+
+ if (aps->aps_seqoff[sel]) {
+ seq2 = aps->aps_seqmin[sel] - aps->aps_seqoff[sel];
+ if (seq1 > seq2) {
+ seq2 = aps->aps_seqoff[sel];
+ seq1 += seq2;
+ tcp->th_seq = htonl(seq1);
+ ch = 1;
+ }
+ }
+
+ if (inc && (seq1 > aps->aps_seqmin[!sel])) {
+ aps->aps_seqmin[sel] = seq1 + nlen - 1;
+ aps->aps_seqoff[sel] = aps->aps_seqoff[sel] + inc;
+ if (ipf_proxy_debug > 7)
+ printf("proxy seq set %d at %x to %d + %d\n",
+ sel, aps->aps_seqmin[sel],
+ aps->aps_seqoff[sel], inc);
+ }
+
+ /***/
+
+ seq1 = ntohl(tcp->th_ack);
+ sel = aps->aps_sel[1 - out];
+
+ /* switch to other set ? */
+ if ((aps->aps_ackmin[!sel] > aps->aps_ackmin[sel]) &&
+ (seq1 > aps->aps_ackmin[!sel])) {
+ if (ipf_proxy_debug > 7)
+ printf("proxy out switch set ack %d -> %d %x > %x\n",
+ sel, !sel, seq1,
+ aps->aps_ackmin[!sel]);
+ sel = aps->aps_sel[1 - out] = !sel;
+ }
+
+ if (aps->aps_ackoff[sel] && (seq1 > aps->aps_ackmin[sel])) {
+ seq2 = aps->aps_ackoff[sel];
+ tcp->th_ack = htonl(seq1 - seq2);
+ ch = 1;
+ }
+ } else {
+ seq1 = ntohl(tcp->th_seq);
+ sel = aps->aps_sel[out];
+
+ /* switch to other set ? */
+ if ((aps->aps_ackmin[!sel] > aps->aps_ackmin[sel]) &&
+ (seq1 > aps->aps_ackmin[!sel])) {
+ if (ipf_proxy_debug > 7)
+ printf("proxy in switch set ack %d -> %d %x > %x\n",
+ sel, !sel, seq1, aps->aps_ackmin[!sel]);
+ sel = aps->aps_sel[out] = !sel;
+ }
+
+ if (aps->aps_ackoff[sel]) {
+ seq2 = aps->aps_ackmin[sel] - aps->aps_ackoff[sel];
+ if (seq1 > seq2) {
+ seq2 = aps->aps_ackoff[sel];
+ seq1 += seq2;
+ tcp->th_seq = htonl(seq1);
+ ch = 1;
+ }
+ }
+
+ if (inc && (seq1 > aps->aps_ackmin[!sel])) {
+ aps->aps_ackmin[!sel] = seq1 + nlen - 1;
+ aps->aps_ackoff[!sel] = aps->aps_ackoff[sel] + inc;
+
+ if (ipf_proxy_debug > 7)
+ printf("proxy ack set %d at %x to %d + %d\n",
+ !sel, aps->aps_seqmin[!sel],
+ aps->aps_seqoff[sel], inc);
+ }
+
+ /***/
+
+ seq1 = ntohl(tcp->th_ack);
+ sel = aps->aps_sel[1 - out];
+
+ /* switch to other set ? */
+ if ((aps->aps_seqmin[!sel] > aps->aps_seqmin[sel]) &&
+ (seq1 > aps->aps_seqmin[!sel])) {
+ if (ipf_proxy_debug > 7)
+ printf("proxy in switch set seq %d -> %d %x > %x\n",
+ sel, !sel, seq1, aps->aps_seqmin[!sel]);
+ sel = aps->aps_sel[1 - out] = !sel;
+ }
+
+ if (aps->aps_seqoff[sel] != 0) {
+ if (ipf_proxy_debug > 7)
+ printf("sel %d seqoff %d seq1 %x seqmin %x\n",
+ sel, aps->aps_seqoff[sel], seq1,
+ aps->aps_seqmin[sel]);
+ if (seq1 > aps->aps_seqmin[sel]) {
+ seq2 = aps->aps_seqoff[sel];
+ tcp->th_ack = htonl(seq1 - seq2);
+ ch = 1;
+ }
+ }
+ }
+
+ if (ipf_proxy_debug > 8)
+ printf("appr_fixseqack: seq %x ack %x\n",
+ (u_32_t)ntohl(tcp->th_seq), (u_32_t)ntohl(tcp->th_ack));
+ return ch ? 2 : 0;
+}
+
+
+/*
+ * Initialise hook for kernel application proxies.
+ * Call the initialise routine for all the compiled in kernel proxies.
+ */
+int appr_init()
+{
+ aproxy_t *ap;
+ int err = 0;
+
+ for (ap = ap_proxies; ap->apr_p; ap++) {
+ if (ap->apr_init != NULL) {
+ err = (*ap->apr_init)();
+ if (err != 0)
+ break;
+ }
+ }
+ return err;
+}
+
+
+/*
+ * Unload hook for kernel application proxies.
+ * Call the finialise routine for all the compiled in kernel proxies.
+ */
+void appr_unload()
+{
+ aproxy_t *ap;
+
+ for (ap = ap_proxies; ap->apr_p; ap++)
+ if (ap->apr_fini != NULL)
+ (*ap->apr_fini)();
+ for (ap = ap_proxylist; ap; ap = ap->apr_next)
+ if (ap->apr_fini != NULL)
+ (*ap->apr_fini)();
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_proxy.h b/sys/contrib/ipfilter/netinet/ip_proxy.h
new file mode 100644
index 0000000..1bcfc60
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_proxy.h
@@ -0,0 +1,462 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1997-2001 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $FreeBSD$
+ * Id: ip_proxy.h,v 2.31.2.2 2005/03/12 19:33:48 darrenr Exp
+ */
+
+#ifndef __IP_PROXY_H__
+#define __IP_PROXY_H__
+
+#ifndef SOLARIS
+#define SOLARIS (defined(sun) && (defined(__svr4__) || defined(__SVR4)))
+#endif
+
+#if defined(__STDC__) || defined(__GNUC__) || defined(_AIX51)
+#define SIOCPROXY _IOWR('r', 64, struct ap_control)
+#else
+#define SIOCPROXY _IOWR(r, 64, struct ap_control)
+#endif
+
+#ifndef APR_LABELLEN
+#define APR_LABELLEN 16
+#endif
+#define AP_SESS_SIZE 53
+
+struct nat;
+struct ipnat;
+struct ipstate;
+
+typedef struct ap_tcp {
+ u_short apt_sport; /* source port */
+ u_short apt_dport; /* destination port */
+ short apt_sel[2]; /* {seq,ack}{off,min} set selector */
+ short apt_seqoff[2]; /* sequence # difference */
+ u_32_t apt_seqmin[2]; /* don't change seq-off until after this */
+ short apt_ackoff[2]; /* sequence # difference */
+ u_32_t apt_ackmin[2]; /* don't change seq-off until after this */
+ u_char apt_state[2]; /* connection state */
+} ap_tcp_t;
+
+typedef struct ap_udp {
+ u_short apu_sport; /* source port */
+ u_short apu_dport; /* destination port */
+} ap_udp_t;
+
+typedef struct ap_session {
+ struct aproxy *aps_apr;
+ union {
+ struct ap_tcp apu_tcp;
+ struct ap_udp apu_udp;
+ } aps_un;
+ u_int aps_flags;
+ U_QUAD_T aps_bytes; /* bytes sent */
+ U_QUAD_T aps_pkts; /* packets sent */
+ void *aps_nat; /* pointer back to nat struct */
+ void *aps_data; /* private data */
+ int aps_p; /* protocol */
+ int aps_psiz; /* size of private data */
+ struct ap_session *aps_hnext;
+ struct ap_session *aps_next;
+} ap_session_t;
+
+#define aps_sport aps_un.apu_tcp.apt_sport
+#define aps_dport aps_un.apu_tcp.apt_dport
+#define aps_sel aps_un.apu_tcp.apt_sel
+#define aps_seqoff aps_un.apu_tcp.apt_seqoff
+#define aps_seqmin aps_un.apu_tcp.apt_seqmin
+#define aps_state aps_un.apu_tcp.apt_state
+#define aps_ackoff aps_un.apu_tcp.apt_ackoff
+#define aps_ackmin aps_un.apu_tcp.apt_ackmin
+
+
+typedef struct ap_control {
+ char apc_label[APR_LABELLEN];
+ u_char apc_p;
+ /*
+ * The following fields are upto the proxy's apr_ctl routine to deal
+ * with. When the proxy gets this in kernel space, apc_data will
+ * point to a malloc'd region of memory of apc_dsize bytes. If the
+ * proxy wants to keep that memory, it must set apc_data to NULL
+ * before it returns. It is expected if this happens that it will
+ * take care to free it in apr_fini or otherwise as appropriate.
+ * apc_cmd is provided as a standard place to put simple commands,
+ * with apc_arg being available to put a simple arg.
+ */
+ u_long apc_cmd;
+ u_long apc_arg;
+ void *apc_data;
+ size_t apc_dsize;
+} ap_ctl_t;
+
+
+typedef struct aproxy {
+ struct aproxy *apr_next;
+ char apr_label[APR_LABELLEN]; /* Proxy label # */
+ u_char apr_p; /* protocol */
+ int apr_ref; /* +1 per rule referencing it */
+ int apr_flags;
+ int (* apr_init) __P((void));
+ void (* apr_fini) __P((void));
+ int (* apr_new) __P((fr_info_t *, ap_session_t *, struct nat *));
+ void (* apr_del) __P((ap_session_t *));
+ int (* apr_inpkt) __P((fr_info_t *, ap_session_t *, struct nat *));
+ int (* apr_outpkt) __P((fr_info_t *, ap_session_t *, struct nat *));
+ int (* apr_match) __P((fr_info_t *, ap_session_t *, struct nat *));
+ int (* apr_ctl) __P((struct aproxy *, struct ap_control *));
+} aproxy_t;
+
+#define APR_DELETE 1
+
+#define APR_ERR(x) ((x) << 16)
+#define APR_EXIT(x) (((x) >> 16) & 0xffff)
+#define APR_INC(x) ((x) & 0xffff)
+
+/*
+ * Generic #define's to cover missing things in the kernel
+ */
+#ifndef isdigit
+#define isdigit(x) ((x) >= '0' && (x) <= '9')
+#endif
+#ifndef isupper
+#define isupper(x) (((unsigned)(x) >= 'A') && ((unsigned)(x) <= 'Z'))
+#endif
+#ifndef islower
+#define islower(x) (((unsigned)(x) >= 'a') && ((unsigned)(x) <= 'z'))
+#endif
+#ifndef isalpha
+#define isalpha(x) (isupper(x) || islower(x))
+#endif
+#ifndef toupper
+#define toupper(x) (isupper(x) ? (x) : (x) - 'a' + 'A')
+#endif
+#ifndef isspace
+#define isspace(x) (((x) == ' ') || ((x) == '\r') || ((x) == '\n') || \
+ ((x) == '\t') || ((x) == '\b'))
+#endif
+
+/*
+ * This is the scratch buffer size used to hold strings from the TCP stream
+ * that we may want to parse. It's an arbitrary size, really, but it must
+ * be at least as large as IPF_FTPBUFSZ.
+ */
+#define FTP_BUFSZ 120
+
+/*
+ * This buffer, however, doesn't need to be nearly so big. It just needs to
+ * be able to squeeze in the largest command it needs to rewrite, Which ones
+ * does it rewrite? EPRT, PORT, 227 replies.
+ */
+#define IPF_FTPBUFSZ 80 /* This *MUST* be >= 53! */
+
+typedef struct ftpside {
+ char *ftps_rptr;
+ char *ftps_wptr;
+ void *ftps_ifp;
+ u_32_t ftps_seq[2];
+ u_32_t ftps_len;
+ int ftps_junk; /* 2 = no cr/lf yet, 1 = cannot parse */
+ int ftps_cmds;
+ char ftps_buf[FTP_BUFSZ];
+} ftpside_t;
+
+typedef struct ftpinfo {
+ int ftp_passok;
+ int ftp_incok;
+ ftpside_t ftp_side[2];
+} ftpinfo_t;
+
+
+/*
+ * For the irc proxy.
+ */
+typedef struct ircinfo {
+ size_t irc_len;
+ char *irc_snick;
+ char *irc_dnick;
+ char *irc_type;
+ char *irc_arg;
+ char *irc_addr;
+ u_32_t irc_ipnum;
+ u_short irc_port;
+} ircinfo_t;
+
+
+/*
+ * Real audio proxy structure and #defines
+ */
+typedef struct raudio_s {
+ int rap_seenpna;
+ int rap_seenver;
+ int rap_version;
+ int rap_eos; /* End Of Startup */
+ int rap_gotid;
+ int rap_gotlen;
+ int rap_mode;
+ int rap_sdone;
+ u_short rap_plport;
+ u_short rap_prport;
+ u_short rap_srport;
+ char rap_svr[19];
+ u_32_t rap_sbf; /* flag to indicate which of the 19 bytes have
+ * been filled
+ */
+ u_32_t rap_sseq;
+} raudio_t;
+
+#define RA_ID_END 0
+#define RA_ID_UDP 1
+#define RA_ID_ROBUST 7
+
+#define RAP_M_UDP 1
+#define RAP_M_ROBUST 2
+#define RAP_M_TCP 4
+#define RAP_M_UDP_ROBUST (RAP_M_UDP|RAP_M_ROBUST)
+
+
+/*
+ * MSN RPC proxy
+ */
+typedef struct msnrpcinfo {
+ u_int mri_flags;
+ int mri_cmd[2];
+ u_int mri_valid;
+ struct in_addr mri_raddr;
+ u_short mri_rport;
+} msnrpcinfo_t;
+
+
+/*
+ * IPSec proxy
+ */
+typedef u_32_t ipsec_cookie_t[2];
+
+typedef struct ipsec_pxy {
+ ipsec_cookie_t ipsc_icookie;
+ ipsec_cookie_t ipsc_rcookie;
+ int ipsc_rckset;
+ ipnat_t ipsc_rule;
+ nat_t *ipsc_nat;
+ struct ipstate *ipsc_state;
+} ipsec_pxy_t;
+
+/*
+ * PPTP proxy
+ */
+typedef struct pptp_side {
+ u_32_t pptps_nexthdr;
+ u_32_t pptps_next;
+ int pptps_state;
+ int pptps_gothdr;
+ int pptps_len;
+ int pptps_bytes;
+ char *pptps_wptr;
+ char pptps_buffer[512];
+} pptp_side_t;
+
+typedef struct pptp_pxy {
+ ipnat_t pptp_rule;
+ nat_t *pptp_nat;
+ struct ipstate *pptp_state;
+ u_short pptp_call[2];
+ pptp_side_t pptp_side[2];
+} pptp_pxy_t;
+
+
+/*
+ * Sun RPCBIND proxy
+ */
+#define RPCB_MAXMSG 888
+#define RPCB_RES_PMAP 0 /* Response contains a v2 port. */
+#define RPCB_RES_STRING 1 /* " " " v3 (GETADDR) string. */
+#define RPCB_RES_LIST 2 /* " " " v4 (GETADDRLIST) list. */
+#define RPCB_MAXREQS 32 /* Arbitrary limit on tracked transactions */
+
+#define RPCB_REQMIN 40
+#define RPCB_REQMAX 888
+#define RPCB_REPMIN 20
+#define RPCB_REPMAX 604 /* XXX double check this! */
+
+/*
+ * These macros determine the number of bytes between p and the end of
+ * r->rs_buf relative to l.
+ */
+#define RPCB_BUF_END(r) (char *)((r)->rm_msgbuf + (r)->rm_buflen)
+#define RPCB_BUF_GEQ(r, p, l) \
+ ((RPCB_BUF_END((r)) > (char *)(p)) && \
+ ((RPCB_BUF_END((r)) - (char *)(p)) >= (l)))
+#define RPCB_BUF_EQ(r, p, l) \
+ (RPCB_BUF_END((r)) == ((char *)(p) + (l)))
+
+/*
+ * The following correspond to RPC(B) detailed in RFC183[13].
+ */
+#define RPCB_CALL 0
+#define RPCB_REPLY 1
+#define RPCB_MSG_VERSION 2
+#define RPCB_PROG 100000
+#define RPCB_GETPORT 3
+#define RPCB_GETADDR 3
+#define RPCB_GETADDRLIST 11
+#define RPCB_MSG_ACCEPTED 0
+#define RPCB_MSG_DENIED 1
+
+/* BEGIN (Generic XDR structures) */
+typedef struct xdr_string {
+ u_32_t *xs_len;
+ char *xs_str;
+} xdr_string_t;
+
+typedef struct xdr_auth {
+ /* u_32_t xa_flavor; */
+ xdr_string_t xa_string;
+} xdr_auth_t;
+
+typedef struct xdr_uaddr {
+ u_32_t xu_ip;
+ u_short xu_port;
+ xdr_string_t xu_str;
+} xdr_uaddr_t;
+
+typedef struct xdr_proto {
+ u_int xp_proto;
+ xdr_string_t xp_str;
+} xdr_proto_t;
+
+#define xu_xslen xu_str.xs_len
+#define xu_xsstr xu_str.xs_str
+#define xp_xslen xp_str.xs_len
+#define xp_xsstr xp_str.xs_str
+/* END (Generic XDR structures) */
+
+/* BEGIN (RPC call structures) */
+typedef struct pmap_args {
+ /* u_32_t pa_prog; */
+ /* u_32_t pa_vers; */
+ u_32_t *pa_prot;
+ /* u_32_t pa_port; */
+} pmap_args_t;
+
+typedef struct rpcb_args {
+ /* u_32_t *ra_prog; */
+ /* u_32_t *ra_vers; */
+ xdr_proto_t ra_netid;
+ xdr_uaddr_t ra_maddr;
+ /* xdr_string_t ra_owner; */
+} rpcb_args_t;
+
+typedef struct rpc_call {
+ /* u_32_t rc_rpcvers; */
+ /* u_32_t rc_prog; */
+ u_32_t *rc_vers;
+ u_32_t *rc_proc;
+ xdr_auth_t rc_authcred;
+ xdr_auth_t rc_authverf;
+ union {
+ pmap_args_t ra_pmapargs;
+ rpcb_args_t ra_rpcbargs;
+ } rpcb_args;
+} rpc_call_t;
+
+#define rc_pmapargs rpcb_args.ra_pmapargs
+#define rc_rpcbargs rpcb_args.ra_rpcbargs
+/* END (RPC call structures) */
+
+/* BEGIN (RPC reply structures) */
+typedef struct rpcb_entry {
+ xdr_uaddr_t re_maddr;
+ xdr_proto_t re_netid;
+ /* u_32_t re_semantics; */
+ xdr_string_t re_family;
+ xdr_proto_t re_proto;
+ u_32_t *re_more; /* 1 == another entry follows */
+} rpcb_entry_t;
+
+typedef struct rpcb_listp {
+ u_32_t *rl_list; /* 1 == list follows */
+ int rl_cnt;
+ rpcb_entry_t rl_entries[2]; /* TCP / UDP only */
+} rpcb_listp_t;
+
+typedef struct rpc_resp {
+ /* u_32_t rr_acceptdeny; */
+ /* Omitted 'message denied' fork; we don't care about rejects. */
+ xdr_auth_t rr_authverf;
+ /* u_32_t *rr_astat; */
+ union {
+ u_32_t *resp_pmap;
+ xdr_uaddr_t resp_getaddr;
+ rpcb_listp_t resp_getaddrlist;
+ } rpcb_reply;
+} rpc_resp_t;
+
+#define rr_v2 rpcb_reply.resp_pmap
+#define rr_v3 rpcb_reply.resp_getaddr
+#define rr_v4 rpcb_reply.resp_getaddrlist
+/* END (RPC reply structures) */
+
+/* BEGIN (RPC message structure & macros) */
+typedef struct rpc_msg {
+ char rm_msgbuf[RPCB_MAXMSG]; /* RPCB data buffer */
+ u_int rm_buflen;
+ u_32_t *rm_xid;
+ /* u_32_t Call vs Reply */
+ union {
+ rpc_call_t rb_call;
+ rpc_resp_t rb_resp;
+ } rm_body;
+} rpc_msg_t;
+
+#define rm_call rm_body.rb_call
+#define rm_resp rm_body.rb_resp
+/* END (RPC message structure & macros) */
+
+/*
+ * These code paths aren't hot enough to warrant per transaction
+ * mutexes.
+ */
+typedef struct rpcb_xact {
+ struct rpcb_xact *rx_next;
+ struct rpcb_xact **rx_pnext;
+ u_32_t rx_xid; /* RPC transmission ID */
+ u_int rx_type; /* RPCB response type */
+ u_int rx_ref; /* reference count */
+ u_int rx_proto; /* transport protocol (v2 only) */
+} rpcb_xact_t;
+
+typedef struct rpcb_session {
+ ipfmutex_t rs_rxlock;
+ rpcb_xact_t *rs_rxlist;
+} rpcb_session_t;
+
+/*
+ * For an explanation, please see the following:
+ * RFC1832 - Sections 3.11, 4.4, and 4.5.
+ */
+#define XDRALIGN(x) ((((x) % 4) != 0) ? ((((x) + 3) / 4) * 4) : (x))
+
+extern ap_session_t *ap_sess_tab[AP_SESS_SIZE];
+extern ap_session_t *ap_sess_list;
+extern aproxy_t ap_proxies[];
+extern int ippr_ftp_pasvonly;
+extern int ipf_proxy_debug;
+
+extern int appr_add __P((aproxy_t *));
+extern int appr_ctl __P((ap_ctl_t *));
+extern int appr_del __P((aproxy_t *));
+extern int appr_init __P((void));
+extern void appr_unload __P((void));
+extern int appr_ok __P((fr_info_t *, tcphdr_t *, struct ipnat *));
+extern int appr_match __P((fr_info_t *, struct nat *));
+extern void appr_free __P((aproxy_t *));
+extern void aps_free __P((ap_session_t *));
+extern int appr_check __P((fr_info_t *, struct nat *));
+extern aproxy_t *appr_lookup __P((u_int, char *));
+extern int appr_new __P((fr_info_t *, struct nat *));
+extern int appr_ioctl __P((caddr_t, ioctlcmd_t, int, void *));
+
+#endif /* __IP_PROXY_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_raudio_pxy.c b/sys/contrib/ipfilter/netinet/ip_raudio_pxy.c
new file mode 100644
index 0000000..2729dc6
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_raudio_pxy.c
@@ -0,0 +1,339 @@
+/* $FreeBSD$ */
+
+/*
+ * $FreeBSD$
+ * Copyright (C) 1998-2003 by Darren Reed
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: ip_raudio_pxy.c,v 1.40.2.4 2006/07/14 06:12:17 darrenr Exp $
+ */
+
+#define IPF_RAUDIO_PROXY
+
+
+int ippr_raudio_init __P((void));
+void ippr_raudio_fini __P((void));
+int ippr_raudio_new __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_raudio_in __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_raudio_out __P((fr_info_t *, ap_session_t *, nat_t *));
+
+static frentry_t raudiofr;
+
+int raudio_proxy_init = 0;
+
+
+/*
+ * Real Audio application proxy initialization.
+ */
+int ippr_raudio_init()
+{
+ bzero((char *)&raudiofr, sizeof(raudiofr));
+ raudiofr.fr_ref = 1;
+ raudiofr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ MUTEX_INIT(&raudiofr.fr_lock, "Real Audio proxy rule lock");
+ raudio_proxy_init = 1;
+
+ return 0;
+}
+
+
+void ippr_raudio_fini()
+{
+ if (raudio_proxy_init == 1) {
+ MUTEX_DESTROY(&raudiofr.fr_lock);
+ raudio_proxy_init = 0;
+ }
+}
+
+
+/*
+ * Setup for a new proxy to handle Real Audio.
+ */
+int ippr_raudio_new(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ raudio_t *rap;
+
+ KMALLOCS(aps->aps_data, void *, sizeof(raudio_t));
+ if (aps->aps_data == NULL)
+ return -1;
+
+ fin = fin; /* LINT */
+ nat = nat; /* LINT */
+
+ bzero(aps->aps_data, sizeof(raudio_t));
+ rap = aps->aps_data;
+ aps->aps_psiz = sizeof(raudio_t);
+ rap->rap_mode = RAP_M_TCP; /* default is for TCP */
+ return 0;
+}
+
+
+
+int ippr_raudio_out(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ raudio_t *rap = aps->aps_data;
+ unsigned char membuf[512 + 1], *s;
+ u_short id = 0;
+ tcphdr_t *tcp;
+ int off, dlen;
+ int len = 0;
+ mb_t *m;
+
+ nat = nat; /* LINT */
+
+ /*
+ * If we've already processed the start messages, then nothing left
+ * for the proxy to do.
+ */
+ if (rap->rap_eos == 1)
+ return 0;
+
+ m = fin->fin_m;
+ tcp = (tcphdr_t *)fin->fin_dp;
+ off = (char *)tcp - (char *)fin->fin_ip;
+ off += (TCP_OFF(tcp) << 2) + fin->fin_ipoff;
+
+#ifdef __sgi
+ dlen = fin->fin_plen - off;
+#else
+ dlen = MSGDSIZE(m) - off;
+#endif
+ if (dlen <= 0)
+ return 0;
+
+ if (dlen > sizeof(membuf))
+ dlen = sizeof(membuf);
+
+ bzero((char *)membuf, sizeof(membuf));
+ COPYDATA(m, off, dlen, (char *)membuf);
+ /*
+ * In all the startup parsing, ensure that we don't go outside
+ * the packet buffer boundary.
+ */
+ /*
+ * Look for the start of connection "PNA" string if not seen yet.
+ */
+ if (rap->rap_seenpna == 0) {
+ s = (u_char *)memstr("PNA", (char *)membuf, 3, dlen);
+ if (s == NULL)
+ return 0;
+ s += 3;
+ rap->rap_seenpna = 1;
+ } else
+ s = membuf;
+
+ /*
+ * Directly after the PNA will be the version number of this
+ * connection.
+ */
+ if (rap->rap_seenpna == 1 && rap->rap_seenver == 0) {
+ if ((s + 1) - membuf < dlen) {
+ rap->rap_version = (*s << 8) | *(s + 1);
+ s += 2;
+ rap->rap_seenver = 1;
+ } else
+ return 0;
+ }
+
+ /*
+ * Now that we've been past the PNA and version number, we're into the
+ * startup messages block. This ends when a message with an ID of 0.
+ */
+ while ((rap->rap_eos == 0) && ((s + 1) - membuf < dlen)) {
+ if (rap->rap_gotid == 0) {
+ id = (*s << 8) | *(s + 1);
+ s += 2;
+ rap->rap_gotid = 1;
+ if (id == RA_ID_END) {
+ rap->rap_eos = 1;
+ break;
+ }
+ } else if (rap->rap_gotlen == 0) {
+ len = (*s << 8) | *(s + 1);
+ s += 2;
+ rap->rap_gotlen = 1;
+ }
+
+ if (rap->rap_gotid == 1 && rap->rap_gotlen == 1) {
+ if (id == RA_ID_UDP) {
+ rap->rap_mode &= ~RAP_M_TCP;
+ rap->rap_mode |= RAP_M_UDP;
+ rap->rap_plport = (*s << 8) | *(s + 1);
+ } else if (id == RA_ID_ROBUST) {
+ rap->rap_mode |= RAP_M_ROBUST;
+ rap->rap_prport = (*s << 8) | *(s + 1);
+ }
+ s += len;
+ rap->rap_gotlen = 0;
+ rap->rap_gotid = 0;
+ }
+ }
+ return 0;
+}
+
+
+int ippr_raudio_in(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ unsigned char membuf[IPF_MAXPORTLEN + 1], *s;
+ tcphdr_t *tcp, tcph, *tcp2 = &tcph;
+ raudio_t *rap = aps->aps_data;
+ struct in_addr swa, swb;
+ int off, dlen, slen;
+ int a1, a2, a3, a4;
+ u_short sp, dp;
+ fr_info_t fi;
+ tcp_seq seq;
+ nat_t *nat2;
+ u_char swp;
+ ip_t *ip;
+ mb_t *m;
+
+ /*
+ * Wait until we've seen the end of the start messages and even then
+ * only proceed further if we're using UDP. If they want to use TCP
+ * then data is sent back on the same channel that is already open.
+ */
+ if (rap->rap_sdone != 0)
+ return 0;
+
+ m = fin->fin_m;
+ tcp = (tcphdr_t *)fin->fin_dp;
+ off = (char *)tcp - (char *)fin->fin_ip;
+ off += (TCP_OFF(tcp) << 2) + fin->fin_ipoff;
+
+#ifdef __sgi
+ dlen = fin->fin_plen - off;
+#else
+ dlen = MSGDSIZE(m) - off;
+#endif
+ if (dlen <= 0)
+ return 0;
+
+ if (dlen > sizeof(membuf))
+ dlen = sizeof(membuf);
+
+ bzero((char *)membuf, sizeof(membuf));
+ COPYDATA(m, off, dlen, (char *)membuf);
+
+ seq = ntohl(tcp->th_seq);
+ /*
+ * Check to see if the data in this packet is of interest to us.
+ * We only care for the first 19 bytes coming back from the server.
+ */
+ if (rap->rap_sseq == 0) {
+ s = (u_char *)memstr("PNA", (char *)membuf, 3, dlen);
+ if (s == NULL)
+ return 0;
+ a1 = s - membuf;
+ dlen -= a1;
+ a1 = 0;
+ rap->rap_sseq = seq;
+ a2 = MIN(dlen, sizeof(rap->rap_svr));
+ } else if (seq <= rap->rap_sseq + sizeof(rap->rap_svr)) {
+ /*
+ * seq # which is the start of data and from that the offset
+ * into the buffer array.
+ */
+ a1 = seq - rap->rap_sseq;
+ a2 = MIN(dlen, sizeof(rap->rap_svr));
+ a2 -= a1;
+ s = membuf;
+ } else
+ return 0;
+
+ for (a3 = a1, a4 = a2; (a4 > 0) && (a3 < 19) && (a3 >= 0); a4--,a3++) {
+ rap->rap_sbf |= (1 << a3);
+ rap->rap_svr[a3] = *s++;
+ }
+
+ if ((rap->rap_sbf != 0x7ffff) || (!rap->rap_eos)) /* 19 bits */
+ return 0;
+ rap->rap_sdone = 1;
+
+ s = (u_char *)rap->rap_svr + 11;
+ if (((*s << 8) | *(s + 1)) == RA_ID_ROBUST) {
+ s += 2;
+ rap->rap_srport = (*s << 8) | *(s + 1);
+ }
+
+ ip = fin->fin_ip;
+ swp = ip->ip_p;
+ swa = ip->ip_src;
+ swb = ip->ip_dst;
+
+ ip->ip_p = IPPROTO_UDP;
+ ip->ip_src = nat->nat_inip;
+ ip->ip_dst = nat->nat_oip;
+
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ bzero((char *)tcp2, sizeof(*tcp2));
+ TCP_OFF_A(tcp2, 5);
+ fi.fin_state = NULL;
+ fi.fin_nat = NULL;
+ fi.fin_flx |= FI_IGNORE;
+ fi.fin_dp = (char *)tcp2;
+ fi.fin_fr = &raudiofr;
+ fi.fin_dlen = sizeof(*tcp2);
+ fi.fin_plen = fi.fin_hlen + sizeof(*tcp2);
+ tcp2->th_win = htons(8192);
+ slen = ip->ip_len;
+ ip->ip_len = fin->fin_hlen + sizeof(*tcp);
+
+ if (((rap->rap_mode & RAP_M_UDP_ROBUST) == RAP_M_UDP_ROBUST) &&
+ (rap->rap_srport != 0)) {
+ dp = rap->rap_srport;
+ sp = rap->rap_prport;
+ tcp2->th_sport = htons(sp);
+ tcp2->th_dport = htons(dp);
+ fi.fin_data[0] = dp;
+ fi.fin_data[1] = sp;
+ fi.fin_out = 0;
+ nat2 = nat_new(&fi, nat->nat_ptr, NULL,
+ NAT_SLAVE|IPN_UDP | (sp ? 0 : SI_W_SPORT),
+ NAT_OUTBOUND);
+ if (nat2 != NULL) {
+ (void) nat_proto(&fi, nat2, IPN_UDP);
+ nat_update(&fi, nat2, nat2->nat_ptr);
+
+ (void) fr_addstate(&fi, NULL, (sp ? 0 : SI_W_SPORT));
+ if (fi.fin_state != NULL)
+ fr_statederef((ipstate_t **)&fi.fin_state);
+ }
+ }
+
+ if ((rap->rap_mode & RAP_M_UDP) == RAP_M_UDP) {
+ sp = rap->rap_plport;
+ tcp2->th_sport = htons(sp);
+ tcp2->th_dport = 0; /* XXX - don't specify remote port */
+ fi.fin_data[0] = sp;
+ fi.fin_data[1] = 0;
+ fi.fin_out = 1;
+ nat2 = nat_new(&fi, nat->nat_ptr, NULL,
+ NAT_SLAVE|IPN_UDP|SI_W_DPORT,
+ NAT_OUTBOUND);
+ if (nat2 != NULL) {
+ (void) nat_proto(&fi, nat2, IPN_UDP);
+ nat_update(&fi, nat2, nat2->nat_ptr);
+
+ (void) fr_addstate(&fi, NULL, SI_W_DPORT);
+ if (fi.fin_state != NULL)
+ fr_statederef((ipstate_t **)&fi.fin_state);
+ }
+ }
+
+ ip->ip_p = swp;
+ ip->ip_len = slen;
+ ip->ip_src = swa;
+ ip->ip_dst = swb;
+ return 0;
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c b/sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c
new file mode 100644
index 0000000..dc92bf5
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_rcmd_pxy.c
@@ -0,0 +1,239 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1998-2003 by Darren Reed
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * $Id: ip_rcmd_pxy.c,v 1.41.2.7 2006/07/14 06:12:18 darrenr Exp $
+ *
+ * Simple RCMD transparent proxy for in-kernel use. For use with the NAT
+ * code.
+ * $FreeBSD$
+ */
+
+#define IPF_RCMD_PROXY
+
+
+int ippr_rcmd_init __P((void));
+void ippr_rcmd_fini __P((void));
+int ippr_rcmd_new __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_rcmd_out __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_rcmd_in __P((fr_info_t *, ap_session_t *, nat_t *));
+u_short ipf_rcmd_atoi __P((char *));
+int ippr_rcmd_portmsg __P((fr_info_t *, ap_session_t *, nat_t *));
+
+static frentry_t rcmdfr;
+
+int rcmd_proxy_init = 0;
+
+
+/*
+ * RCMD application proxy initialization.
+ */
+int ippr_rcmd_init()
+{
+ bzero((char *)&rcmdfr, sizeof(rcmdfr));
+ rcmdfr.fr_ref = 1;
+ rcmdfr.fr_flags = FR_INQUE|FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ MUTEX_INIT(&rcmdfr.fr_lock, "RCMD proxy rule lock");
+ rcmd_proxy_init = 1;
+
+ return 0;
+}
+
+
+void ippr_rcmd_fini()
+{
+ if (rcmd_proxy_init == 1) {
+ MUTEX_DESTROY(&rcmdfr.fr_lock);
+ rcmd_proxy_init = 0;
+ }
+}
+
+
+/*
+ * Setup for a new RCMD proxy.
+ */
+int ippr_rcmd_new(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ tcphdr_t *tcp = (tcphdr_t *)fin->fin_dp;
+
+ fin = fin; /* LINT */
+ nat = nat; /* LINT */
+
+ aps->aps_psiz = sizeof(u_32_t);
+ KMALLOCS(aps->aps_data, u_32_t *, sizeof(u_32_t));
+ if (aps->aps_data == NULL) {
+#ifdef IP_RCMD_PROXY_DEBUG
+ printf("ippr_rcmd_new:KMALLOCS(%d) failed\n", sizeof(u_32_t));
+#endif
+ return -1;
+ }
+ *(u_32_t *)aps->aps_data = 0;
+ aps->aps_sport = tcp->th_sport;
+ aps->aps_dport = tcp->th_dport;
+ return 0;
+}
+
+
+/*
+ * ipf_rcmd_atoi - implement a simple version of atoi
+ */
+u_short ipf_rcmd_atoi(ptr)
+char *ptr;
+{
+ register char *s = ptr, c;
+ register u_short i = 0;
+
+ while (((c = *s++) != '\0') && ISDIGIT(c)) {
+ i *= 10;
+ i += c - '0';
+ }
+ return i;
+}
+
+
+int ippr_rcmd_portmsg(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ tcphdr_t *tcp, tcph, *tcp2 = &tcph;
+ struct in_addr swip, swip2;
+ int off, dlen, nflags;
+ char portbuf[8], *s;
+ fr_info_t fi;
+ u_short sp;
+ nat_t *nat2;
+ ip_t *ip;
+ mb_t *m;
+
+ tcp = (tcphdr_t *)fin->fin_dp;
+
+ if (tcp->th_flags & TH_SYN) {
+ *(u_32_t *)aps->aps_data = htonl(ntohl(tcp->th_seq) + 1);
+ return 0;
+ }
+
+ if ((*(u_32_t *)aps->aps_data != 0) &&
+ (tcp->th_seq != *(u_32_t *)aps->aps_data))
+ return 0;
+
+ m = fin->fin_m;
+ ip = fin->fin_ip;
+ off = (char *)tcp - (char *)ip + (TCP_OFF(tcp) << 2) + fin->fin_ipoff;
+
+#ifdef __sgi
+ dlen = fin->fin_plen - off;
+#else
+ dlen = MSGDSIZE(m) - off;
+#endif
+ if (dlen <= 0)
+ return 0;
+
+ bzero(portbuf, sizeof(portbuf));
+ COPYDATA(m, off, MIN(sizeof(portbuf), dlen), portbuf);
+
+ portbuf[sizeof(portbuf) - 1] = '\0';
+ s = portbuf;
+ sp = ipf_rcmd_atoi(s);
+ if (sp == 0) {
+#ifdef IP_RCMD_PROXY_DEBUG
+ printf("ippr_rcmd_portmsg:sp == 0 dlen %d [%s]\n",
+ dlen, portbuf);
+#endif
+ return 0;
+ }
+
+ /*
+ * Add skeleton NAT entry for connection which will come back the
+ * other way.
+ */
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ fi.fin_state = NULL;
+ fi.fin_nat = NULL;
+ fi.fin_flx |= FI_IGNORE;
+ fi.fin_data[0] = sp;
+ fi.fin_data[1] = 0;
+ if (nat->nat_dir == NAT_OUTBOUND)
+ nat2 = nat_outlookup(&fi, NAT_SEARCH|IPN_TCP, nat->nat_p,
+ nat->nat_inip, nat->nat_oip);
+ else
+ nat2 = nat_inlookup(&fi, NAT_SEARCH|IPN_TCP, nat->nat_p,
+ nat->nat_inip, nat->nat_oip);
+ if (nat2 == NULL) {
+ int slen;
+
+ slen = ip->ip_len;
+ ip->ip_len = fin->fin_hlen + sizeof(*tcp);
+ bzero((char *)tcp2, sizeof(*tcp2));
+ tcp2->th_win = htons(8192);
+ tcp2->th_sport = htons(sp);
+ tcp2->th_dport = 0; /* XXX - don't specify remote port */
+ TCP_OFF_A(tcp2, 5);
+ tcp2->th_flags = TH_SYN;
+ fi.fin_dp = (char *)tcp2;
+ fi.fin_fr = &rcmdfr;
+ fi.fin_dlen = sizeof(*tcp2);
+ fi.fin_plen = fi.fin_hlen + sizeof(*tcp2);
+ fi.fin_flx &= FI_LOWTTL|FI_FRAG|FI_TCPUDP|FI_OPTIONS|FI_IGNORE;
+ nflags = NAT_SLAVE|IPN_TCP|SI_W_DPORT;
+
+ swip = ip->ip_src;
+ swip2 = ip->ip_dst;
+
+ if (nat->nat_dir == NAT_OUTBOUND) {
+ fi.fin_fi.fi_saddr = nat->nat_inip.s_addr;
+ ip->ip_src = nat->nat_inip;
+ } else {
+ fi.fin_fi.fi_saddr = nat->nat_oip.s_addr;
+ ip->ip_src = nat->nat_oip;
+ nflags |= NAT_NOTRULEPORT;
+ }
+
+ nat2 = nat_new(&fi, nat->nat_ptr, NULL, nflags, nat->nat_dir);
+
+ if (nat2 != NULL) {
+ (void) nat_proto(&fi, nat2, IPN_TCP);
+ nat_update(&fi, nat2, nat2->nat_ptr);
+ fi.fin_ifp = NULL;
+ if (nat->nat_dir == NAT_INBOUND) {
+ fi.fin_fi.fi_daddr = nat->nat_inip.s_addr;
+ ip->ip_dst = nat->nat_inip;
+ }
+ (void) fr_addstate(&fi, NULL, SI_W_DPORT);
+ if (fi.fin_state != NULL)
+ fr_statederef((ipstate_t **)&fi.fin_state);
+ }
+ ip->ip_len = slen;
+ ip->ip_src = swip;
+ ip->ip_dst = swip2;
+ }
+ return 0;
+}
+
+
+int ippr_rcmd_out(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ if (nat->nat_dir == NAT_OUTBOUND)
+ return ippr_rcmd_portmsg(fin, aps, nat);
+ return 0;
+}
+
+
+int ippr_rcmd_in(fin, aps, nat)
+fr_info_t *fin;
+ap_session_t *aps;
+nat_t *nat;
+{
+ if (nat->nat_dir == NAT_INBOUND)
+ return ippr_rcmd_portmsg(fin, aps, nat);
+ return 0;
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_rpcb_pxy.c b/sys/contrib/ipfilter/netinet/ip_rpcb_pxy.c
new file mode 100644
index 0000000..4350bf4
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_rpcb_pxy.c
@@ -0,0 +1,1464 @@
+/*
+ * Copyright (C) 2002-2003 by Ryan Beasley <ryanb@goddamnbastard.org>
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+/*
+ * Overview:
+ * This is an in-kernel application proxy for Sun's RPCBIND (nee portmap)
+ * protocol as defined in RFC1833. It is far from complete, mostly
+ * lacking in less-likely corner cases, but it's definitely functional.
+ *
+ * Invocation:
+ * rdr <int> <e_ip>/32 port <e_p> -> <i_ip> port <i_p> udp proxy rpcbu
+ *
+ * If the host running IP Filter is the same as the RPC server, it's
+ * perfectly legal for both the internal and external addresses and ports
+ * to match.
+ *
+ * When triggered by appropriate IP NAT rules, this proxy works by
+ * examining data contained in received packets. Requests and replies are
+ * modified, NAT and state table entries created, etc., as necessary.
+ */
+/*
+ * TODO / NOTES
+ *
+ * o Must implement locking to protect proxy session data.
+ * o Fragmentation isn't supported.
+ * o Only supports UDP.
+ * o Doesn't support multiple RPC records in a single request.
+ * o Errors should be more fine-grained. (e.g., malloc failure vs.
+ * illegal RPCB request / reply)
+ * o Even with the limit on the total amount of recorded transactions,
+ * should there be a timeout on transaction removal?
+ * o There is a potential collision between cloning, wildcard NAT and
+ * state entries. There should be an appr_getport routine for
+ * to avoid this.
+ * o The enclosed hack of STREAMS support is pretty sick and most likely
+ * broken.
+ *
+ * $Id: ip_rpcb_pxy.c,v 2.25.2.6 2007/01/17 11:34:54 darrenr Exp $
+ */
+
+#define IPF_RPCB_PROXY
+
+/*
+ * Function prototypes
+ */
+int ippr_rpcb_init __P((void));
+void ippr_rpcb_fini __P((void));
+int ippr_rpcb_new __P((fr_info_t *, ap_session_t *, nat_t *));
+void ippr_rpcb_del __P((ap_session_t *));
+int ippr_rpcb_in __P((fr_info_t *, ap_session_t *, nat_t *));
+int ippr_rpcb_out __P((fr_info_t *, ap_session_t *, nat_t *));
+
+static void ippr_rpcb_flush __P((rpcb_session_t *));
+static int ippr_rpcb_decodereq __P((fr_info_t *, nat_t *,
+ rpcb_session_t *, rpc_msg_t *));
+static int ippr_rpcb_skipauth __P((rpc_msg_t *, xdr_auth_t *, u_32_t **));
+static int ippr_rpcb_insert __P((rpcb_session_t *, rpcb_xact_t *));
+static int ippr_rpcb_xdrrpcb __P((rpc_msg_t *, u_32_t *, rpcb_args_t *));
+static int ippr_rpcb_getuaddr __P((rpc_msg_t *, xdr_uaddr_t *,
+ u_32_t **));
+static u_int ippr_rpcb_atoi __P((char *));
+static int ippr_rpcb_modreq __P((fr_info_t *, nat_t *, rpc_msg_t *,
+ mb_t *, u_int));
+static int ippr_rpcb_decoderep __P((fr_info_t *, nat_t *,
+ rpcb_session_t *, rpc_msg_t *, rpcb_xact_t **));
+static rpcb_xact_t * ippr_rpcb_lookup __P((rpcb_session_t *, u_32_t));
+static void ippr_rpcb_deref __P((rpcb_session_t *, rpcb_xact_t *));
+static int ippr_rpcb_getproto __P((rpc_msg_t *, xdr_proto_t *,
+ u_32_t **));
+static int ippr_rpcb_getnat __P((fr_info_t *, nat_t *, u_int, u_int));
+static int ippr_rpcb_modv3 __P((fr_info_t *, nat_t *, rpc_msg_t *,
+ mb_t *, u_int));
+static int ippr_rpcb_modv4 __P((fr_info_t *, nat_t *, rpc_msg_t *,
+ mb_t *, u_int));
+static void ippr_rpcb_fixlen __P((fr_info_t *, int));
+
+/*
+ * Global variables
+ */
+static frentry_t rpcbfr; /* Skeleton rule for reference by entities
+ this proxy creates. */
+static int rpcbcnt; /* Upper bound of allocated RPCB sessions. */
+ /* XXX rpcbcnt still requires locking. */
+
+int rpcb_proxy_init = 0;
+
+
+/*
+ * Since rpc_msg contains only pointers, one should use this macro as a
+ * handy way to get to the goods. (In case you're wondering about the name,
+ * this started as BYTEREF -> BREF -> B.)
+ */
+#define B(r) (u_32_t)ntohl(*(r))
+
+/*
+ * Public subroutines
+ */
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_init */
+/* Returns: int - 0 == success */
+/* Parameters: (void) */
+/* */
+/* Initialize the filter rule entry and session limiter. */
+/* -------------------------------------------------------------------- */
+int
+ippr_rpcb_init()
+{
+ rpcbcnt = 0;
+
+ bzero((char *)&rpcbfr, sizeof(rpcbfr));
+ rpcbfr.fr_ref = 1;
+ rpcbfr.fr_flags = FR_PASS|FR_QUICK|FR_KEEPSTATE;
+ MUTEX_INIT(&rpcbfr.fr_lock, "ipf Sun RPCB proxy rule lock");
+ rpcb_proxy_init = 1;
+
+ return(0);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_fini */
+/* Returns: void */
+/* Parameters: (void) */
+/* */
+/* Destroy rpcbfr's mutex to avoid a lock leak. */
+/* -------------------------------------------------------------------- */
+void
+ippr_rpcb_fini()
+{
+ if (rpcb_proxy_init == 1) {
+ MUTEX_DESTROY(&rpcbfr.fr_lock);
+ rpcb_proxy_init = 0;
+ }
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_new */
+/* Returns: int - -1 == failure, 0 == success */
+/* Parameters: fin(I) - pointer to packet information */
+/* aps(I) - pointer to proxy session structure */
+/* nat(I) - pointer to NAT session structure */
+/* */
+/* Allocate resources for per-session proxy structures. */
+/* -------------------------------------------------------------------- */
+int
+ippr_rpcb_new(fin, aps, nat)
+ fr_info_t *fin;
+ ap_session_t *aps;
+ nat_t *nat;
+{
+ rpcb_session_t *rs;
+
+ fin = fin; /* LINT */
+ nat = nat; /* LINT */
+
+ KMALLOC(rs, rpcb_session_t *);
+ if (rs == NULL)
+ return(-1);
+
+ bzero((char *)rs, sizeof(*rs));
+ MUTEX_INIT(&rs->rs_rxlock, "ipf Sun RPCB proxy session lock");
+
+ aps->aps_data = rs;
+
+ return(0);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_del */
+/* Returns: void */
+/* Parameters: aps(I) - pointer to proxy session structure */
+/* */
+/* Free up a session's list of RPCB requests. */
+/* -------------------------------------------------------------------- */
+void
+ippr_rpcb_del(aps)
+ ap_session_t *aps;
+{
+ rpcb_session_t *rs;
+ rs = (rpcb_session_t *)aps->aps_data;
+
+ MUTEX_ENTER(&rs->rs_rxlock);
+ ippr_rpcb_flush(rs);
+ MUTEX_EXIT(&rs->rs_rxlock);
+ MUTEX_DESTROY(&rs->rs_rxlock);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_in */
+/* Returns: int - APR_ERR(1) == drop the packet, */
+/* APR_ERR(2) == kill the proxy session, */
+/* else change in packet length (in bytes) */
+/* Parameters: fin(I) - pointer to packet information */
+/* ip(I) - pointer to packet header */
+/* aps(I) - pointer to proxy session structure */
+/* nat(I) - pointer to NAT session structure */
+/* */
+/* Given a presumed RPCB request, perform some minor tests and pass off */
+/* for decoding. Also pass packet off for a rewrite if necessary. */
+/* -------------------------------------------------------------------- */
+int
+ippr_rpcb_in(fin, aps, nat)
+ fr_info_t *fin;
+ ap_session_t *aps;
+ nat_t *nat;
+{
+ rpc_msg_t rpcmsg, *rm;
+ rpcb_session_t *rs;
+ u_int off, dlen;
+ mb_t *m;
+ int rv;
+
+ /* Disallow fragmented or illegally short packets. */
+ if ((fin->fin_flx & (FI_FRAG|FI_SHORT)) != 0)
+ return(APR_ERR(1));
+
+ /* Perform basic variable initialization. */
+ rs = (rpcb_session_t *)aps->aps_data;
+
+ m = fin->fin_m;
+ off = (char *)fin->fin_dp - (char *)fin->fin_ip;
+ off += sizeof(udphdr_t) + fin->fin_ipoff;
+ dlen = fin->fin_dlen - sizeof(udphdr_t);
+
+ /* Disallow packets outside legal range for supported requests. */
+ if ((dlen < RPCB_REQMIN) || (dlen > RPCB_REQMAX))
+ return(APR_ERR(1));
+
+ /* Copy packet over to convenience buffer. */
+ rm = &rpcmsg;
+ bzero((char *)rm, sizeof(*rm));
+ COPYDATA(m, off, dlen, (caddr_t)&rm->rm_msgbuf);
+ rm->rm_buflen = dlen;
+
+ /* Send off to decode request. */
+ rv = ippr_rpcb_decodereq(fin, nat, rs, rm);
+
+ switch(rv)
+ {
+ case -1:
+ return(APR_ERR(1));
+ /*NOTREACHED*/
+ break;
+ case 0:
+ break;
+ case 1:
+ rv = ippr_rpcb_modreq(fin, nat, rm, m, off);
+ break;
+ default:
+ /*CONSTANTCONDITION*/
+ IPF_PANIC(1, ("illegal rv %d (ippr_rpcb_req)", rv));
+ }
+
+ return(rv);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_out */
+/* Returns: int - APR_ERR(1) == drop the packet, */
+/* APR_ERR(2) == kill the proxy session, */
+/* else change in packet length (in bytes) */
+/* Parameters: fin(I) - pointer to packet information */
+/* ip(I) - pointer to packet header */
+/* aps(I) - pointer to proxy session structure */
+/* nat(I) - pointer to NAT session structure */
+/* */
+/* Given a presumed RPCB reply, perform some minor tests and pass off */
+/* for decoding. If the message indicates a successful request with */
+/* valid addressing information, create NAT and state structures to */
+/* allow direct communication between RPC client and server. */
+/* -------------------------------------------------------------------- */
+int
+ippr_rpcb_out(fin, aps, nat)
+ fr_info_t *fin;
+ ap_session_t *aps;
+ nat_t *nat;
+{
+ rpc_msg_t rpcmsg, *rm;
+ rpcb_session_t *rs;
+ rpcb_xact_t *rx;
+ u_int off, dlen;
+ int rv, diff;
+ mb_t *m;
+
+ /* Disallow fragmented or illegally short packets. */
+ if ((fin->fin_flx & (FI_FRAG|FI_SHORT)) != 0)
+ return(APR_ERR(1));
+
+ /* Perform basic variable initialization. */
+ rs = (rpcb_session_t *)aps->aps_data;
+ rx = NULL;
+
+ m = fin->fin_m;
+ off = (char *)fin->fin_dp - (char *)fin->fin_ip;
+ off += sizeof(udphdr_t) + fin->fin_ipoff;
+ dlen = fin->fin_dlen - sizeof(udphdr_t);
+ diff = 0;
+
+ /* Disallow packets outside legal range for supported requests. */
+ if ((dlen < RPCB_REPMIN) || (dlen > RPCB_REPMAX))
+ return(APR_ERR(1));
+
+ /* Copy packet over to convenience buffer. */
+ rm = &rpcmsg;
+ bzero((char *)rm, sizeof(*rm));
+ COPYDATA(m, off, dlen, (caddr_t)&rm->rm_msgbuf);
+ rm->rm_buflen = dlen;
+
+ rx = NULL; /* XXX gcc */
+
+ /* Send off to decode reply. */
+ rv = ippr_rpcb_decoderep(fin, nat, rs, rm, &rx);
+
+ switch(rv)
+ {
+ case -1: /* Bad packet */
+ if (rx != NULL) {
+ MUTEX_ENTER(&rs->rs_rxlock);
+ ippr_rpcb_deref(rs, rx);
+ MUTEX_EXIT(&rs->rs_rxlock);
+ }
+ return(APR_ERR(1));
+ /*NOTREACHED*/
+ break;
+ case 0: /* Negative reply / request rejected */
+ break;
+ case 1: /* Positive reply */
+ /*
+ * With the IP address embedded in a GETADDR(LIST) reply,
+ * we'll need to rewrite the packet in the very possible
+ * event that the internal & external addresses aren't the
+ * same. (i.e., this box is either a router or rpcbind
+ * only listens on loopback.)
+ */
+ if (nat->nat_inip.s_addr != nat->nat_outip.s_addr) {
+ if (rx->rx_type == RPCB_RES_STRING)
+ diff = ippr_rpcb_modv3(fin, nat, rm, m, off);
+ else if (rx->rx_type == RPCB_RES_LIST)
+ diff = ippr_rpcb_modv4(fin, nat, rm, m, off);
+ }
+ break;
+ default:
+ /*CONSTANTCONDITION*/
+ IPF_PANIC(1, ("illegal rv %d (ippr_rpcb_decoderep)", rv));
+ }
+
+ if (rx != NULL) {
+ MUTEX_ENTER(&rs->rs_rxlock);
+ /* XXX Gross hack - I'm overloading the reference
+ * counter to deal with both threads and retransmitted
+ * requests. One deref signals that this thread is
+ * finished with rx, and the other signals that we've
+ * processed its reply.
+ */
+ ippr_rpcb_deref(rs, rx);
+ ippr_rpcb_deref(rs, rx);
+ MUTEX_EXIT(&rs->rs_rxlock);
+ }
+
+ return(diff);
+}
+
+/*
+ * Private support subroutines
+ */
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_flush */
+/* Returns: void */
+/* Parameters: rs(I) - pointer to RPCB session structure */
+/* */
+/* Simply flushes the list of outstanding transactions, if any. */
+/* -------------------------------------------------------------------- */
+static void
+ippr_rpcb_flush(rs)
+ rpcb_session_t *rs;
+{
+ rpcb_xact_t *r1, *r2;
+
+ r1 = rs->rs_rxlist;
+ if (r1 == NULL)
+ return;
+
+ while (r1 != NULL) {
+ r2 = r1;
+ r1 = r1->rx_next;
+ KFREE(r2);
+ }
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_decodereq */
+/* Returns: int - -1 == bad request or critical failure, */
+/* 0 == request successfully decoded, */
+/* 1 == request successfully decoded; requires */
+/* address rewrite/modification */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT session structure */
+/* rs(I) - pointer to RPCB session structure */
+/* rm(I) - pointer to RPC message structure */
+/* */
+/* Take a presumed RPCB request, decode it, and store the results in */
+/* the transaction list. If the internal target address needs to be */
+/* modified, store its location in ptr. */
+/* WARNING: It's the responsibility of the caller to make sure there */
+/* is enough room in rs_buf for the basic RPC message "preamble". */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_decodereq(fin, nat, rs, rm)
+ fr_info_t *fin;
+ nat_t *nat;
+ rpcb_session_t *rs;
+ rpc_msg_t *rm;
+{
+ rpcb_args_t *ra;
+ u_32_t xdr, *p;
+ rpc_call_t *rc;
+ rpcb_xact_t rx;
+ int mod;
+
+ p = (u_32_t *)rm->rm_msgbuf;
+ mod = 0;
+
+ bzero((char *)&rx, sizeof(rx));
+ rc = &rm->rm_call;
+
+ rm->rm_xid = p;
+ rx.rx_xid = B(p++); /* Record this message's XID. */
+
+ /* Parse out and test the RPC header. */
+ if ((B(p++) != RPCB_CALL) ||
+ (B(p++) != RPCB_MSG_VERSION) ||
+ (B(p++) != RPCB_PROG))
+ return(-1);
+
+ /* Record the RPCB version and procedure. */
+ rc->rc_vers = p++;
+ rc->rc_proc = p++;
+
+ /* Bypass RPC authentication stuff. */
+ if (ippr_rpcb_skipauth(rm, &rc->rc_authcred, &p) != 0)
+ return(-1);
+ if (ippr_rpcb_skipauth(rm, &rc->rc_authverf, &p) != 0)
+ return(-1);
+
+ /* Compare RPCB version and procedure numbers. */
+ switch(B(rc->rc_vers))
+ {
+ case 2:
+ /* This proxy only supports PMAP_GETPORT. */
+ if (B(rc->rc_proc) != RPCB_GETPORT)
+ return(-1);
+
+ /* Portmap requests contain four 4 byte parameters. */
+ if (RPCB_BUF_EQ(rm, p, 16) == 0)
+ return(-1);
+
+ p += 2; /* Skip requested program and version numbers. */
+
+ /* Sanity check the requested protocol. */
+ xdr = B(p);
+ if (!(xdr == IPPROTO_UDP || xdr == IPPROTO_TCP))
+ return(-1);
+
+ rx.rx_type = RPCB_RES_PMAP;
+ rx.rx_proto = xdr;
+ break;
+ case 3:
+ case 4:
+ /* GETADDRLIST is exclusive to v4; GETADDR for v3 & v4 */
+ switch(B(rc->rc_proc))
+ {
+ case RPCB_GETADDR:
+ rx.rx_type = RPCB_RES_STRING;
+ rx.rx_proto = (u_int)fin->fin_p;
+ break;
+ case RPCB_GETADDRLIST:
+ if (B(rc->rc_vers) != 4)
+ return(-1);
+ rx.rx_type = RPCB_RES_LIST;
+ break;
+ default:
+ return(-1);
+ }
+
+ ra = &rc->rc_rpcbargs;
+
+ /* Decode the 'struct rpcb' request. */
+ if (ippr_rpcb_xdrrpcb(rm, p, ra) != 0)
+ return(-1);
+
+ /* Are the target address & port valid? */
+ if ((ra->ra_maddr.xu_ip != nat->nat_outip.s_addr) ||
+ (ra->ra_maddr.xu_port != nat->nat_outport))
+ return(-1);
+
+ /* Do we need to rewrite this packet? */
+ if ((nat->nat_outip.s_addr != nat->nat_inip.s_addr) ||
+ (nat->nat_outport != nat->nat_inport))
+ mod = 1;
+ break;
+ default:
+ return(-1);
+ }
+
+ MUTEX_ENTER(&rs->rs_rxlock);
+ if (ippr_rpcb_insert(rs, &rx) != 0) {
+ MUTEX_EXIT(&rs->rs_rxlock);
+ return(-1);
+ }
+ MUTEX_EXIT(&rs->rs_rxlock);
+
+ return(mod);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_skipauth */
+/* Returns: int -- -1 == illegal auth parameters (lengths) */
+/* 0 == valid parameters, pointer advanced */
+/* Parameters: rm(I) - pointer to RPC message structure */
+/* auth(I) - pointer to RPC auth structure */
+/* buf(IO) - pointer to location within convenience buffer */
+/* */
+/* Record auth data length & location of auth data, then advance past */
+/* it. */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_skipauth(rm, auth, buf)
+ rpc_msg_t *rm;
+ xdr_auth_t *auth;
+ u_32_t **buf;
+{
+ u_32_t *p, xdr;
+
+ p = *buf;
+
+ /* Make sure we have enough space for expected fixed auth parms. */
+ if (RPCB_BUF_GEQ(rm, p, 8) == 0)
+ return(-1);
+
+ p++; /* We don't care about auth_flavor. */
+
+ auth->xa_string.xs_len = p;
+ xdr = B(p++); /* Length of auth_data */
+
+ /* Test for absurdity / illegality of auth_data length. */
+ if ((XDRALIGN(xdr) < xdr) || (RPCB_BUF_GEQ(rm, p, XDRALIGN(xdr)) == 0))
+ return(-1);
+
+ auth->xa_string.xs_str = (char *)p;
+
+ p += XDRALIGN(xdr); /* Advance our location. */
+
+ *buf = (u_32_t *)p;
+
+ return(0);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_insert */
+/* Returns: int -- -1 == list insertion failed, */
+/* 0 == item successfully added */
+/* Parameters: rs(I) - pointer to RPCB session structure */
+/* rx(I) - pointer to RPCB transaction structure */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_insert(rs, rx)
+ rpcb_session_t *rs;
+ rpcb_xact_t *rx;
+{
+ rpcb_xact_t *rxp;
+
+ rxp = ippr_rpcb_lookup(rs, rx->rx_xid);
+ if (rxp != NULL) {
+ ++rxp->rx_ref;
+ return(0);
+ }
+
+ if (rpcbcnt == RPCB_MAXREQS)
+ return(-1);
+
+ KMALLOC(rxp, rpcb_xact_t *);
+ if (rxp == NULL)
+ return(-1);
+
+ bcopy((char *)rx, (char *)rxp, sizeof(*rx));
+
+ if (rs->rs_rxlist != NULL)
+ rs->rs_rxlist->rx_pnext = &rxp->rx_next;
+
+ rxp->rx_pnext = &rs->rs_rxlist;
+ rxp->rx_next = rs->rs_rxlist;
+ rs->rs_rxlist = rxp;
+
+ rxp->rx_ref = 1;
+
+ ++rpcbcnt;
+
+ return(0);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_xdrrpcb */
+/* Returns: int -- -1 == failure to properly decode the request */
+/* 0 == rpcb successfully decoded */
+/* Parameters: rs(I) - pointer to RPCB session structure */
+/* p(I) - pointer to location within session buffer */
+/* rpcb(O) - pointer to rpcb (xdr type) structure */
+/* */
+/* Decode a XDR encoded rpcb structure and record its contents in rpcb */
+/* within only the context of TCP/UDP over IP networks. */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_xdrrpcb(rm, p, ra)
+ rpc_msg_t *rm;
+ u_32_t *p;
+ rpcb_args_t *ra;
+{
+ if (!RPCB_BUF_GEQ(rm, p, 20))
+ return(-1);
+
+ /* Bypass target program & version. */
+ p += 2;
+
+ /* Decode r_netid. Must be "tcp" or "udp". */
+ if (ippr_rpcb_getproto(rm, &ra->ra_netid, &p) != 0)
+ return(-1);
+
+ /* Decode r_maddr. */
+ if (ippr_rpcb_getuaddr(rm, &ra->ra_maddr, &p) != 0)
+ return(-1);
+
+ /* Advance to r_owner and make sure it's empty. */
+ if (!RPCB_BUF_EQ(rm, p, 4) || (B(p) != 0))
+ return(-1);
+
+ return(0);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_getuaddr */
+/* Returns: int -- -1 == illegal string, */
+/* 0 == string parsed; contents recorded */
+/* Parameters: rm(I) - pointer to RPC message structure */
+/* xu(I) - pointer to universal address structure */
+/* p(IO) - pointer to location within message buffer */
+/* */
+/* Decode the IP address / port at p and record them in xu. */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_getuaddr(rm, xu, p)
+ rpc_msg_t *rm;
+ xdr_uaddr_t *xu;
+ u_32_t **p;
+{
+ char *c, *i, *b, *pp;
+ u_int d, dd, l, t;
+ char uastr[24];
+
+ /* Test for string length. */
+ if (!RPCB_BUF_GEQ(rm, *p, 4))
+ return(-1);
+
+ xu->xu_xslen = (*p)++;
+ xu->xu_xsstr = (char *)*p;
+
+ /* Length check */
+ l = B(xu->xu_xslen);
+ if (l < 11 || l > 23 || !RPCB_BUF_GEQ(rm, *p, XDRALIGN(l)))
+ return(-1);
+
+ /* Advance p */
+ *(char **)p += XDRALIGN(l);
+
+ /* Copy string to local buffer & terminate C style */
+ bcopy(xu->xu_xsstr, uastr, l);
+ uastr[l] = '\0';
+
+ i = (char *)&xu->xu_ip;
+ pp = (char *)&xu->xu_port;
+
+ /*
+ * Expected format: a.b.c.d.e.f where [a-d] correspond to bytes of
+ * an IP address and [ef] are the bytes of a L4 port.
+ */
+ if (!(ISDIGIT(uastr[0]) && ISDIGIT(uastr[l-1])))
+ return(-1);
+ b = uastr;
+ for (c = &uastr[1], d = 0, dd = 0; c < &uastr[l-1]; c++) {
+ if (ISDIGIT(*c)) {
+ dd = 0;
+ continue;
+ }
+ if (*c == '.') {
+ if (dd != 0)
+ return(-1);
+
+ /* Check for ASCII byte. */
+ *c = '\0';
+ t = ippr_rpcb_atoi(b);
+ if (t > 255)
+ return(-1);
+
+ /* Aim b at beginning of the next byte. */
+ b = c + 1;
+
+ /* Switch off IP addr vs port parsing. */
+ if (d < 4)
+ i[d++] = t & 0xff;
+ else
+ pp[d++ - 4] = t & 0xff;
+
+ dd = 1;
+ continue;
+ }
+ return(-1);
+ }
+ if (d != 5) /* String must contain exactly 5 periods. */
+ return(-1);
+
+ /* Handle the last byte (port low byte) */
+ t = ippr_rpcb_atoi(b);
+ if (t > 255)
+ return(-1);
+ pp[d - 4] = t & 0xff;
+
+ return(0);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_atoi (XXX should be generic for all proxies) */
+/* Returns: int -- integer representation of supplied string */
+/* Parameters: ptr(I) - input string */
+/* */
+/* Simple version of atoi(3) ripped from ip_rcmd_pxy.c. */
+/* -------------------------------------------------------------------- */
+static u_int
+ippr_rpcb_atoi(ptr)
+ char *ptr;
+{
+ register char *s = ptr, c;
+ register u_int i = 0;
+
+ while (((c = *s++) != '\0') && ISDIGIT(c)) {
+ i *= 10;
+ i += c - '0';
+ }
+ return i;
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_modreq */
+/* Returns: int -- change in datagram length */
+/* APR_ERR(2) - critical failure */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT session */
+/* rm(I) - pointer to RPC message structure */
+/* m(I) - pointer to mbuf chain */
+/* off(I) - current offset within mbuf chain */
+/* */
+/* When external and internal addresses differ, we rewrite the former */
+/* with the latter. (This is exclusive to protocol versions 3 & 4). */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_modreq(fin, nat, rm, m, off)
+ fr_info_t *fin;
+ nat_t *nat;
+ rpc_msg_t *rm;
+ mb_t *m;
+ u_int off;
+{
+ u_int len, xlen, pos, bogo;
+ rpcb_args_t *ra;
+ char uaddr[24];
+ udphdr_t *udp;
+ char *i, *p;
+ int diff;
+
+ ra = &rm->rm_call.rc_rpcbargs;
+ i = (char *)&nat->nat_inip.s_addr;
+ p = (char *)&nat->nat_inport;
+
+ /* Form new string. */
+ bzero(uaddr, sizeof(uaddr)); /* Just in case we need padding. */
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(uaddr, sizeof(uaddr),
+#else
+ (void) sprintf(uaddr,
+#endif
+ "%u.%u.%u.%u.%u.%u", i[0] & 0xff, i[1] & 0xff,
+ i[2] & 0xff, i[3] & 0xff, p[0] & 0xff, p[1] & 0xff);
+ len = strlen(uaddr);
+ xlen = XDRALIGN(len);
+
+ /* Determine mbuf offset to start writing to. */
+ pos = (char *)ra->ra_maddr.xu_xslen - rm->rm_msgbuf;
+ off += pos;
+
+ /* Write new string length. */
+ bogo = htonl(len);
+ COPYBACK(m, off, 4, (caddr_t)&bogo);
+ off += 4;
+
+ /* Write new string. */
+ COPYBACK(m, off, xlen, uaddr);
+ off += xlen;
+
+ /* Write in zero r_owner. */
+ bogo = 0;
+ COPYBACK(m, off, 4, (caddr_t)&bogo);
+
+ /* Determine difference in data lengths. */
+ diff = xlen - XDRALIGN(B(ra->ra_maddr.xu_xslen));
+
+ /*
+ * If our new string has a different length, make necessary
+ * adjustments.
+ */
+ if (diff != 0) {
+ udp = fin->fin_dp;
+ udp->uh_ulen = htons(ntohs(udp->uh_ulen) + diff);
+ fin->fin_ip->ip_len += diff;
+ fin->fin_dlen += diff;
+ fin->fin_plen += diff;
+ /* XXX Storage lengths. */
+ }
+
+ return(diff);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_decoderep */
+/* Returns: int - -1 == bad request or critical failure, */
+/* 0 == valid, negative reply */
+/* 1 == vaddlid, positive reply; needs no changes */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT session structure */
+/* rs(I) - pointer to RPCB session structure */
+/* rm(I) - pointer to RPC message structure */
+/* rxp(O) - pointer to RPCB transaction structure */
+/* */
+/* Take a presumed RPCB reply, extract the XID, search for the original */
+/* request information, and determine whether the request was accepted */
+/* or rejected. With a valid accepted reply, go ahead and create NAT */
+/* and state entries, and finish up by rewriting the packet as */
+/* required. */
+/* */
+/* WARNING: It's the responsibility of the caller to make sure there */
+/* is enough room in rs_buf for the basic RPC message "preamble". */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_decoderep(fin, nat, rs, rm, rxp)
+ fr_info_t *fin;
+ nat_t *nat;
+ rpcb_session_t *rs;
+ rpc_msg_t *rm;
+ rpcb_xact_t **rxp;
+{
+ rpcb_listp_t *rl;
+ rpcb_entry_t *re;
+ rpcb_xact_t *rx;
+ u_32_t xdr, *p;
+ rpc_resp_t *rr;
+ int rv, cnt;
+
+ p = (u_32_t *)rm->rm_msgbuf;
+
+ bzero((char *)&rx, sizeof(rx));
+ rr = &rm->rm_resp;
+
+ rm->rm_xid = p;
+ xdr = B(p++); /* Record this message's XID. */
+
+ /* Lookup XID */
+ MUTEX_ENTER(&rs->rs_rxlock);
+ if ((rx = ippr_rpcb_lookup(rs, xdr)) == NULL) {
+ MUTEX_EXIT(&rs->rs_rxlock);
+ return(-1);
+ }
+ ++rx->rx_ref; /* per thread reference */
+ MUTEX_EXIT(&rs->rs_rxlock);
+
+ *rxp = rx;
+
+ /* Test call vs reply */
+ if (B(p++) != RPCB_REPLY)
+ return(-1);
+
+ /* Test reply_stat */
+ switch(B(p++))
+ {
+ case RPCB_MSG_DENIED:
+ return(0);
+ case RPCB_MSG_ACCEPTED:
+ break;
+ default:
+ return(-1);
+ }
+
+ /* Bypass RPC authentication stuff. */
+ if (ippr_rpcb_skipauth(rm, &rr->rr_authverf, &p) != 0)
+ return(-1);
+
+ /* Test accept status */
+ if (!RPCB_BUF_GEQ(rm, p, 4))
+ return(-1);
+ if (B(p++) != 0)
+ return(0);
+
+ /* Parse out the expected reply */
+ switch(rx->rx_type)
+ {
+ case RPCB_RES_PMAP:
+ /* There must be only one 4 byte argument. */
+ if (!RPCB_BUF_EQ(rm, p, 4))
+ return(-1);
+
+ rr->rr_v2 = p;
+ xdr = B(rr->rr_v2);
+
+ /* Reply w/ a 0 port indicates service isn't registered */
+ if (xdr == 0)
+ return(0);
+
+ /* Is the value sane? */
+ if (xdr > 65535)
+ return(-1);
+
+ /* Create NAT & state table entries. */
+ if (ippr_rpcb_getnat(fin, nat, rx->rx_proto, (u_int)xdr) != 0)
+ return(-1);
+ break;
+ case RPCB_RES_STRING:
+ /* Expecting a XDR string; need 4 bytes for length */
+ if (!RPCB_BUF_GEQ(rm, p, 4))
+ return(-1);
+
+ rr->rr_v3.xu_str.xs_len = p++;
+ rr->rr_v3.xu_str.xs_str = (char *)p;
+
+ xdr = B(rr->rr_v3.xu_xslen);
+
+ /* A null string indicates an unregistered service */
+ if ((xdr == 0) && RPCB_BUF_EQ(rm, p, 0))
+ return(0);
+
+ /* Decode the target IP address / port. */
+ if (ippr_rpcb_getuaddr(rm, &rr->rr_v3, &p) != 0)
+ return(-1);
+
+ /* Validate the IP address and port contained. */
+ if (nat->nat_inip.s_addr != rr->rr_v3.xu_ip)
+ return(-1);
+
+ /* Create NAT & state table entries. */
+ if (ippr_rpcb_getnat(fin, nat, rx->rx_proto,
+ (u_int)rr->rr_v3.xu_port) != 0)
+ return(-1);
+ break;
+ case RPCB_RES_LIST:
+ if (!RPCB_BUF_GEQ(rm, p, 4))
+ return(-1);
+ /* rpcb_entry_list_ptr */
+ switch(B(p))
+ {
+ case 0:
+ return(0);
+ /*NOTREACHED*/
+ break;
+ case 1:
+ break;
+ default:
+ return(-1);
+ }
+ rl = &rr->rr_v4;
+ rl->rl_list = p++;
+ cnt = 0;
+
+ for(;;) {
+ re = &rl->rl_entries[rl->rl_cnt];
+ if (ippr_rpcb_getuaddr(rm, &re->re_maddr, &p) != 0)
+ return(-1);
+ if (ippr_rpcb_getproto(rm, &re->re_netid, &p) != 0)
+ return(-1);
+ /* re_semantics & re_pfamily length */
+ if (!RPCB_BUF_GEQ(rm, p, 12))
+ return(-1);
+ p++; /* Skipping re_semantics. */
+ xdr = B(p++);
+ if ((xdr != 4) || strncmp((char *)p, "inet", 4))
+ return(-1);
+ p++;
+ if (ippr_rpcb_getproto(rm, &re->re_proto, &p) != 0)
+ return(-1);
+ if (!RPCB_BUF_GEQ(rm, p, 4))
+ return(-1);
+ re->re_more = p;
+ if (B(re->re_more) > 1) /* 0,1 only legal values */
+ return(-1);
+ ++rl->rl_cnt;
+ ++cnt;
+ if (B(re->re_more) == 0)
+ break;
+ /* Replies in max out at 2; TCP and/or UDP */
+ if (cnt > 2)
+ return(-1);
+ p++;
+ }
+
+ for(rl->rl_cnt = 0; rl->rl_cnt < cnt; rl->rl_cnt++) {
+ re = &rl->rl_entries[rl->rl_cnt];
+ rv = ippr_rpcb_getnat(fin, nat,
+ re->re_proto.xp_proto,
+ (u_int)re->re_maddr.xu_port);
+ if (rv != 0)
+ return(-1);
+ }
+ break;
+ default:
+ /*CONSTANTCONDITION*/
+ IPF_PANIC(1, ("illegal rx_type %d", rx->rx_type));
+ }
+
+ return(1);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_lookup */
+/* Returns: rpcb_xact_t * - NULL == no matching record, */
+/* else pointer to relevant entry */
+/* Parameters: rs(I) - pointer to RPCB session */
+/* xid(I) - XID to look for */
+/* -------------------------------------------------------------------- */
+static rpcb_xact_t *
+ippr_rpcb_lookup(rs, xid)
+ rpcb_session_t *rs;
+ u_32_t xid;
+{
+ rpcb_xact_t *rx;
+
+ if (rs->rs_rxlist == NULL)
+ return(NULL);
+
+ for (rx = rs->rs_rxlist; rx != NULL; rx = rx->rx_next)
+ if (rx->rx_xid == xid)
+ break;
+
+ return(rx);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_deref */
+/* Returns: (void) */
+/* Parameters: rs(I) - pointer to RPCB session */
+/* rx(I) - pointer to RPC transaction struct to remove */
+/* force(I) - indicates to delete entry regardless of */
+/* reference count */
+/* Locking: rs->rs_rxlock must be held write only */
+/* */
+/* Free the RPCB transaction record rx from the chain of entries. */
+/* -------------------------------------------------------------------- */
+static void
+ippr_rpcb_deref(rs, rx)
+ rpcb_session_t *rs;
+ rpcb_xact_t *rx;
+{
+ rs = rs; /* LINT */
+
+ if (rx == NULL)
+ return;
+
+ if (--rx->rx_ref != 0)
+ return;
+
+ if (rx->rx_next != NULL)
+ rx->rx_next->rx_pnext = rx->rx_pnext;
+
+ *rx->rx_pnext = rx->rx_next;
+
+ KFREE(rx);
+
+ --rpcbcnt;
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_getproto */
+/* Returns: int - -1 == illegal protocol/netid, */
+/* 0 == legal protocol/netid */
+/* Parameters: rm(I) - pointer to RPC message structure */
+/* xp(I) - pointer to netid structure */
+/* p(IO) - pointer to location within packet buffer */
+/* */
+/* Decode netid/proto stored at p and record its numeric value. */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_getproto(rm, xp, p)
+ rpc_msg_t *rm;
+ xdr_proto_t *xp;
+ u_32_t **p;
+{
+ u_int len;
+
+ /* Must have 4 bytes for length & 4 bytes for "tcp" or "udp". */
+ if (!RPCB_BUF_GEQ(rm, p, 8))
+ return(-1);
+
+ xp->xp_xslen = (*p)++;
+ xp->xp_xsstr = (char *)*p;
+
+ /* Test the string length. */
+ len = B(xp->xp_xslen);
+ if (len != 3)
+ return(-1);
+
+ /* Test the actual string & record the protocol accordingly. */
+ if (!strncmp((char *)xp->xp_xsstr, "tcp\0", 4))
+ xp->xp_proto = IPPROTO_TCP;
+ else if (!strncmp((char *)xp->xp_xsstr, "udp\0", 4))
+ xp->xp_proto = IPPROTO_UDP;
+ else {
+ return(-1);
+ }
+
+ /* Advance past the string. */
+ (*p)++;
+
+ return(0);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_getnat */
+/* Returns: int -- -1 == failed to create table entries, */
+/* 0 == success */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT table entry */
+/* proto(I) - transport protocol for new entries */
+/* port(I) - new port to use w/ wildcard table entries */
+/* */
+/* Create state and NAT entries to handle an anticipated connection */
+/* attempt between RPC client and server. */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_getnat(fin, nat, proto, port)
+ fr_info_t *fin;
+ nat_t *nat;
+ u_int proto;
+ u_int port;
+{
+ ipnat_t *ipn, ipnat;
+ tcphdr_t tcp;
+ ipstate_t *is;
+ fr_info_t fi;
+ nat_t *natl;
+ int nflags;
+
+ ipn = nat->nat_ptr;
+
+ /* Generate dummy fr_info */
+ bcopy((char *)fin, (char *)&fi, sizeof(fi));
+ fi.fin_state = NULL;
+ fi.fin_nat = NULL;
+ fi.fin_out = 0;
+ fi.fin_src = fin->fin_dst;
+ fi.fin_dst = nat->nat_outip;
+ fi.fin_p = proto;
+ fi.fin_sport = 0;
+ fi.fin_dport = port & 0xffff;
+ fi.fin_flx |= FI_IGNORE;
+
+ bzero((char *)&tcp, sizeof(tcp));
+ tcp.th_dport = htons(port);
+
+ if (proto == IPPROTO_TCP) {
+ tcp.th_win = htons(8192);
+ TCP_OFF_A(&tcp, sizeof(tcphdr_t) >> 2);
+ fi.fin_dlen = sizeof(tcphdr_t);
+ tcp.th_flags = TH_SYN;
+ nflags = NAT_TCP;
+ } else {
+ fi.fin_dlen = sizeof(udphdr_t);
+ nflags = NAT_UDP;
+ }
+
+ nflags |= SI_W_SPORT|NAT_SEARCH;
+ fi.fin_dp = &tcp;
+ fi.fin_plen = fi.fin_hlen + fi.fin_dlen;
+
+ /*
+ * Search for existing NAT & state entries. Pay close attention to
+ * mutexes / locks grabbed from lookup routines, as not doing so could
+ * lead to bad things.
+ *
+ * If successful, fr_stlookup returns with ipf_state locked. We have
+ * no use for this lock, so simply unlock it if necessary.
+ */
+ is = fr_stlookup(&fi, &tcp, NULL);
+ if (is != NULL) {
+ RWLOCK_EXIT(&ipf_state);
+ }
+
+ RWLOCK_EXIT(&ipf_nat);
+
+ WRITE_ENTER(&ipf_nat);
+ natl = nat_inlookup(&fi, nflags, proto, fi.fin_src, fi.fin_dst);
+
+ if ((natl != NULL) && (is != NULL)) {
+ MUTEX_DOWNGRADE(&ipf_nat);
+ return(0);
+ }
+
+ /* Slightly modify the following structures for actual use in creating
+ * NAT and/or state entries. We're primarily concerned with stripping
+ * flags that may be detrimental to the creation process or simply
+ * shouldn't be associated with a table entry.
+ */
+ fi.fin_fr = &rpcbfr;
+ fi.fin_flx &= ~FI_IGNORE;
+ nflags &= ~NAT_SEARCH;
+
+ if (natl == NULL) {
+ /* XXX Since we're just copying the original ipn contents
+ * back, would we be better off just sending a pointer to
+ * the 'temp' copy off to nat_new instead?
+ */
+ /* Generate template/bogus NAT rule. */
+ bcopy((char *)ipn, (char *)&ipnat, sizeof(ipnat));
+ ipn->in_flags = nflags & IPN_TCPUDP;
+ ipn->in_apr = NULL;
+ ipn->in_p = proto;
+ ipn->in_pmin = htons(fi.fin_dport);
+ ipn->in_pmax = htons(fi.fin_dport);
+ ipn->in_pnext = htons(fi.fin_dport);
+ ipn->in_space = 1;
+ ipn->in_ippip = 1;
+ if (ipn->in_flags & IPN_FILTER) {
+ ipn->in_scmp = 0;
+ ipn->in_dcmp = 0;
+ }
+ *ipn->in_plabel = '\0';
+
+ /* Create NAT entry. return NULL if this fails. */
+ natl = nat_new(&fi, ipn, NULL, nflags|SI_CLONE|NAT_SLAVE,
+ NAT_INBOUND);
+
+ bcopy((char *)&ipnat, (char *)ipn, sizeof(ipnat));
+
+ if (natl == NULL) {
+ MUTEX_DOWNGRADE(&ipf_nat);
+ return(-1);
+ }
+
+ ipn->in_use++;
+ (void) nat_proto(&fi, natl, nflags);
+ nat_update(&fi, natl, natl->nat_ptr);
+ }
+ MUTEX_DOWNGRADE(&ipf_nat);
+
+ if (is == NULL) {
+ /* Create state entry. Return NULL if this fails. */
+ fi.fin_dst = nat->nat_inip;
+ fi.fin_nat = (void *)natl;
+ fi.fin_flx |= FI_NATED;
+ fi.fin_flx &= ~FI_STATE;
+ nflags &= NAT_TCPUDP;
+ nflags |= SI_W_SPORT|SI_CLONE;
+
+ is = fr_addstate(&fi, NULL, nflags);
+ if (is == NULL) {
+ /*
+ * XXX nat_delete is private to ip_nat.c. Should
+ * check w/ Darren about this one.
+ *
+ * nat_delete(natl, NL_EXPIRE);
+ */
+ return(-1);
+ }
+ if (fi.fin_state != NULL)
+ fr_statederef((ipstate_t **)&fi.fin_state);
+ }
+
+ return(0);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_modv3 */
+/* Returns: int -- change in packet length */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT session */
+/* rm(I) - pointer to RPC message structure */
+/* m(I) - pointer to mbuf chain */
+/* off(I) - offset within mbuf chain */
+/* */
+/* Write a new universal address string to this packet, adjusting */
+/* lengths as necessary. */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_modv3(fin, nat, rm, m, off)
+ fr_info_t *fin;
+ nat_t *nat;
+ rpc_msg_t *rm;
+ mb_t *m;
+ u_int off;
+{
+ u_int len, xlen, pos, bogo;
+ rpc_resp_t *rr;
+ char uaddr[24];
+ char *i, *p;
+ int diff;
+
+ rr = &rm->rm_resp;
+ i = (char *)&nat->nat_outip.s_addr;
+ p = (char *)&rr->rr_v3.xu_port;
+
+ /* Form new string. */
+ bzero(uaddr, sizeof(uaddr)); /* Just in case we need padding. */
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(uaddr, sizeof(uaddr),
+#else
+ (void) sprintf(uaddr,
+#endif
+ "%u.%u.%u.%u.%u.%u", i[0] & 0xff, i[1] & 0xff,
+ i[2] & 0xff, i[3] & 0xff, p[0] & 0xff, p[1] & 0xff);
+ len = strlen(uaddr);
+ xlen = XDRALIGN(len);
+
+ /* Determine mbuf offset to write to. */
+ pos = (char *)rr->rr_v3.xu_xslen - rm->rm_msgbuf;
+ off += pos;
+
+ /* Write new string length. */
+ bogo = htonl(len);
+ COPYBACK(m, off, 4, (caddr_t)&bogo);
+ off += 4;
+
+ /* Write new string. */
+ COPYBACK(m, off, xlen, uaddr);
+
+ /* Determine difference in data lengths. */
+ diff = xlen - XDRALIGN(B(rr->rr_v3.xu_xslen));
+
+ /*
+ * If our new string has a different length, make necessary
+ * adjustments.
+ */
+ if (diff != 0)
+ ippr_rpcb_fixlen(fin, diff);
+
+ return(diff);
+}
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_modv4 */
+/* Returns: int -- change in packet length */
+/* Parameters: fin(I) - pointer to packet information */
+/* nat(I) - pointer to NAT session */
+/* rm(I) - pointer to RPC message structure */
+/* m(I) - pointer to mbuf chain */
+/* off(I) - offset within mbuf chain */
+/* */
+/* Write new rpcb_entry list, adjusting lengths as necessary. */
+/* -------------------------------------------------------------------- */
+static int
+ippr_rpcb_modv4(fin, nat, rm, m, off)
+ fr_info_t *fin;
+ nat_t *nat;
+ rpc_msg_t *rm;
+ mb_t *m;
+ u_int off;
+{
+ u_int len, xlen, pos, bogo;
+ rpcb_listp_t *rl;
+ rpcb_entry_t *re;
+ rpc_resp_t *rr;
+ char uaddr[24];
+ int diff, cnt;
+ char *i, *p;
+
+ diff = 0;
+ rr = &rm->rm_resp;
+ rl = &rr->rr_v4;
+
+ i = (char *)&nat->nat_outip.s_addr;
+
+ /* Determine mbuf offset to write to. */
+ re = &rl->rl_entries[0];
+ pos = (char *)re->re_maddr.xu_xslen - rm->rm_msgbuf;
+ off += pos;
+
+ for (cnt = 0; cnt < rl->rl_cnt; cnt++) {
+ re = &rl->rl_entries[cnt];
+ p = (char *)&re->re_maddr.xu_port;
+
+ /* Form new string. */
+ bzero(uaddr, sizeof(uaddr)); /* Just in case we need
+ padding. */
+#if defined(SNPRINTF) && defined(_KERNEL)
+ SNPRINTF(uaddr, sizeof(uaddr),
+#else
+ (void) sprintf(uaddr,
+#endif
+ "%u.%u.%u.%u.%u.%u", i[0] & 0xff,
+ i[1] & 0xff, i[2] & 0xff, i[3] & 0xff,
+ p[0] & 0xff, p[1] & 0xff);
+ len = strlen(uaddr);
+ xlen = XDRALIGN(len);
+
+ /* Write new string length. */
+ bogo = htonl(len);
+ COPYBACK(m, off, 4, (caddr_t)&bogo);
+ off += 4;
+
+ /* Write new string. */
+ COPYBACK(m, off, xlen, uaddr);
+ off += xlen;
+
+ /* Record any change in length. */
+ diff += xlen - XDRALIGN(B(re->re_maddr.xu_xslen));
+
+ /* If the length changed, copy back the rest of this entry. */
+ len = ((char *)re->re_more + 4) -
+ (char *)re->re_netid.xp_xslen;
+ if (diff != 0) {
+ COPYBACK(m, off, len, (caddr_t)re->re_netid.xp_xslen);
+ }
+ off += len;
+ }
+
+ /*
+ * If our new string has a different length, make necessary
+ * adjustments.
+ */
+ if (diff != 0)
+ ippr_rpcb_fixlen(fin, diff);
+
+ return(diff);
+}
+
+
+/* -------------------------------------------------------------------- */
+/* Function: ippr_rpcb_fixlen */
+/* Returns: (void) */
+/* Parameters: fin(I) - pointer to packet information */
+/* len(I) - change in packet length */
+/* */
+/* Adjust various packet related lengths held in structure and packet */
+/* header fields. */
+/* -------------------------------------------------------------------- */
+static void
+ippr_rpcb_fixlen(fin, len)
+ fr_info_t *fin;
+ int len;
+{
+ udphdr_t *udp;
+
+ udp = fin->fin_dp;
+ udp->uh_ulen = htons(ntohs(udp->uh_ulen) + len);
+ fin->fin_ip->ip_len += len;
+ fin->fin_dlen += len;
+ fin->fin_plen += len;
+}
+
+#undef B
diff --git a/sys/contrib/ipfilter/netinet/ip_rules.c b/sys/contrib/ipfilter/netinet/ip_rules.c
new file mode 100644
index 0000000..f080ec5b
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_rules.c
@@ -0,0 +1,229 @@
+/* $FreeBSD$ */
+
+/*
+* Copyright (C) 1993-2000 by Darren Reed.
+*
+* Redistribution and use in source and binary forms are permitted
+* provided that this notice is preserved and due credit is given
+* to the original author and the contributors.
+*/
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/socket.h>
+#if !defined(__FreeBSD__) && !defined(__OpenBSD__) && !defined(__sgi)
+# include <sys/systm.h>
+#endif
+#include <sys/errno.h>
+#include <sys/param.h>
+#if !defined(__SVR4) && !defined(__svr4__) && !defined(__hpux)
+# include <sys/mbuf.h>
+#endif
+#if defined(__FreeBSD__) && (__FreeBSD_version > 220000)
+# include <sys/sockio.h>
+#else
+# include <sys/ioctl.h>
+#endif /* FreeBSD */
+#include <net/if.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#include "netinet/ip_compat.h"
+#include "netinet/ip_fil.h"
+
+#include "netinet/ip_rules.h"
+
+#ifndef _KERNEL
+# include <string.h>
+#endif /* _KERNEL */
+
+#ifdef IPFILTER_COMPILED
+
+static u_long in_rule__0[] = {
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xffffffff, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80000000, 0x8002, 0, 0, 0, 0xffff, 0, 0, 0x4, 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
+};
+
+static u_long out_rule__0[] = {
+0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0xffffffff, 0, 0, 0, 0, 0, 0, 0x1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x80000000, 0x4002, 0, 0, 0, 0xffff, 0, 0, 0x4, 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
+};
+
+frentry_t *ipf_rules_in_[1] = {
+ (frentry_t *)&in_rule__0
+};
+
+frentry_t *ipfrule_match_in_(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ frentry_t *fr = NULL;
+
+ fr = (frentry_t *)&in_rule__0;
+ return fr;
+}
+
+frentry_t *ipf_rules_out_[1] = {
+ (frentry_t *)&out_rule__0
+};
+
+frentry_t *ipfrule_match_out_(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ frentry_t *fr = NULL;
+
+ fr = (frentry_t *)&out_rule__0;
+ return fr;
+}
+static frentry_t ipfrule_out_;
+
+int ipfrule_add_out_()
+{
+ int i, j, err = 0, max;
+ frentry_t *fp;
+
+ max = sizeof(ipf_rules_out_)/sizeof(frentry_t *);
+ for (i = 0; i < max; i++) {
+ fp = ipf_rules_out_[i];
+ fp->fr_next = NULL;
+ for (j = i + 1; j < max; j++)
+ if (strncmp(fp->fr_group,
+ ipf_rules_out_[j]->fr_group,
+ FR_GROUPLEN) == 0) {
+ fp->fr_next = ipf_rules_out_[j];
+ break;
+ }
+ }
+
+ fp = &ipfrule_out_;
+ bzero((char *)fp, sizeof(*fp));
+ fp->fr_type = FR_T_CALLFUNC|FR_T_BUILTIN;
+ fp->fr_flags = FR_OUTQUE|FR_NOMATCH;
+ fp->fr_data = (void *)ipf_rules_out_[0];
+ fp->fr_dsize = sizeof(ipf_rules_out_[0]);
+ fp->fr_v = 4;
+ fp->fr_func = (ipfunc_t)ipfrule_match_out_;
+ err = frrequest(IPL_LOGIPF, SIOCADDFR, (caddr_t)fp, fr_active, 0);
+ return err;
+}
+
+
+int ipfrule_remove_out_()
+{
+ int err = 0, i;
+ frentry_t *fp;
+
+ /*
+ * Try to remove the outbound rule.
+ */
+ if (ipfrule_out_.fr_ref > 0) {
+ err = EBUSY;
+ } else {
+ i = sizeof(ipf_rules_out_)/sizeof(frentry_t *) - 1;
+ for (; i >= 0; i--) {
+ fp = ipf_rules_out_[i];
+ if (fp->fr_ref > 1) {
+ err = EBUSY;
+ break;
+ }
+ }
+ }
+ if (err == 0)
+ err = frrequest(IPL_LOGIPF, SIOCDELFR,
+ (caddr_t)&ipfrule_out_, fr_active, 0);
+ if (err)
+ return err;
+
+
+ return err;
+}
+static frentry_t ipfrule_in_;
+
+int ipfrule_add_in_()
+{
+ int i, j, err = 0, max;
+ frentry_t *fp;
+
+ max = sizeof(ipf_rules_in_)/sizeof(frentry_t *);
+ for (i = 0; i < max; i++) {
+ fp = ipf_rules_in_[i];
+ fp->fr_next = NULL;
+ for (j = i + 1; j < max; j++)
+ if (strncmp(fp->fr_group,
+ ipf_rules_in_[j]->fr_group,
+ FR_GROUPLEN) == 0) {
+ fp->fr_next = ipf_rules_in_[j];
+ break;
+ }
+ }
+
+ fp = &ipfrule_in_;
+ bzero((char *)fp, sizeof(*fp));
+ fp->fr_type = FR_T_CALLFUNC|FR_T_BUILTIN;
+ fp->fr_flags = FR_INQUE|FR_NOMATCH;
+ fp->fr_data = (void *)ipf_rules_in_[0];
+ fp->fr_dsize = sizeof(ipf_rules_in_[0]);
+ fp->fr_v = 4;
+ fp->fr_func = (ipfunc_t)ipfrule_match_in_;
+ err = frrequest(IPL_LOGIPF, SIOCADDFR, (caddr_t)fp, fr_active, 0);
+ return err;
+}
+
+
+int ipfrule_remove_in_()
+{
+ int err = 0, i;
+ frentry_t *fp;
+
+ /*
+ * Try to remove the inbound rule.
+ */
+ if (ipfrule_in_.fr_ref > 0) {
+ err = EBUSY;
+ } else {
+ i = sizeof(ipf_rules_in_)/sizeof(frentry_t *) - 1;
+ for (; i >= 0; i--) {
+ fp = ipf_rules_in_[i];
+ if (fp->fr_ref > 1) {
+ err = EBUSY;
+ break;
+ }
+ }
+ }
+ if (err == 0)
+ err = frrequest(IPL_LOGIPF, SIOCDELFR,
+ (caddr_t)&ipfrule_in_, fr_active, 0);
+ if (err)
+ return err;
+
+
+ return err;
+}
+
+int ipfrule_add()
+{
+ int err;
+
+ err = ipfrule_add_out_();
+ if (err != 0)
+ return err;
+ err = ipfrule_add_in_();
+ if (err != 0)
+ return err;
+ return 0;
+}
+
+
+int ipfrule_remove()
+{
+ int err;
+
+ err = ipfrule_remove_out_();
+ if (err != 0)
+ return err;
+ err = ipfrule_remove_in_();
+ if (err != 0)
+ return err;
+ return 0;
+}
+#endif /* IPFILTER_COMPILED */
diff --git a/sys/contrib/ipfilter/netinet/ip_rules.h b/sys/contrib/ipfilter/netinet/ip_rules.h
new file mode 100644
index 0000000..37e3646
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_rules.h
@@ -0,0 +1,16 @@
+/* $FreeBSD$ */
+
+extern int ipfrule_add __P((void));
+extern int ipfrule_remove __P((void));
+
+extern frentry_t *ipfrule_match_out_ __P((fr_info_t *, u_32_t *));
+extern frentry_t *ipf_rules_out_[1];
+
+extern int ipfrule_add_out_ __P((void));
+extern int ipfrule_remove_out_ __P((void));
+
+extern frentry_t *ipfrule_match_in_ __P((fr_info_t *, u_32_t *));
+extern frentry_t *ipf_rules_in_[1];
+
+extern int ipfrule_add_in_ __P((void));
+extern int ipfrule_remove_in_ __P((void));
diff --git a/sys/contrib/ipfilter/netinet/ip_scan.c b/sys/contrib/ipfilter/netinet/ip_scan.c
new file mode 100644
index 0000000..ad37216
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_scan.c
@@ -0,0 +1,599 @@
+/*
+ * Copyright (C) 1995-2001 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#include <sys/param.h>
+#if defined(__hpux) && (HPUXREV >= 1111) && !defined(_KERNEL)
+# include <sys/kern_svcs.h>
+#endif
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/errno.h>
+#if !defined(_KERNEL)
+# include <stdlib.h>
+# include <string.h>
+# define _KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+#else
+# include <sys/systm.h>
+# if !defined(__svr4__) && !defined(__SVR4)
+# include <sys/mbuf.h>
+# endif
+#endif
+#include <sys/socket.h>
+#if !defined(__hpux) && !defined(__osf__) && !defined(linux) && !defined(AIX)
+# include <sys/ioccom.h>
+#endif
+#ifdef __FreeBSD__
+# include <sys/filio.h>
+# include <sys/malloc.h>
+#else
+# include <sys/ioctl.h>
+#endif
+
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+
+#include <net/if.h>
+
+
+#include "netinet/ip_compat.h"
+#include "netinet/ip_fil.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_scan.h"
+/* END OF INCLUDES */
+
+#if !defined(lint)
+static const char sccsid[] = "@(#)ip_state.c 1.8 6/5/96 (C) 1993-2000 Darren Reed";
+static const char rcsid[] = "@(#)$Id: ip_scan.c,v 2.40.2.9 2007/03/13 09:42:05 darrenr Exp $";
+#endif
+
+#ifdef IPFILTER_SCAN /* endif at bottom of file */
+
+
+ipscan_t *ipsc_list = NULL,
+ *ipsc_tail = NULL;
+ipscanstat_t ipsc_stat;
+# ifdef USE_MUTEXES
+ipfrwlock_t ipsc_rwlock;
+# endif
+
+# ifndef isalpha
+# define isalpha(x) (((x) >= 'A' && 'Z' >= (x)) || \
+ ((x) >= 'a' && 'z' >= (x)))
+# endif
+
+
+int ipsc_add __P((caddr_t));
+int ipsc_delete __P((caddr_t));
+struct ipscan *ipsc_lookup __P((char *));
+int ipsc_matchstr __P((sinfo_t *, char *, int));
+int ipsc_matchisc __P((ipscan_t *, ipstate_t *, int, int, int *));
+int ipsc_match __P((ipstate_t *));
+
+static int ipsc_inited = 0;
+
+
+int ipsc_init()
+{
+ RWLOCK_INIT(&ipsc_rwlock, "ip scan rwlock");
+ ipsc_inited = 1;
+ return 0;
+}
+
+
+void fr_scanunload()
+{
+ if (ipsc_inited == 1) {
+ RW_DESTROY(&ipsc_rwlock);
+ ipsc_inited = 0;
+ }
+}
+
+
+int ipsc_add(data)
+caddr_t data;
+{
+ ipscan_t *i, *isc;
+ int err;
+
+ KMALLOC(isc, ipscan_t *);
+ if (!isc)
+ return ENOMEM;
+
+ err = copyinptr(data, isc, sizeof(*isc));
+ if (err) {
+ KFREE(isc);
+ return err;
+ }
+
+ WRITE_ENTER(&ipsc_rwlock);
+
+ i = ipsc_lookup(isc->ipsc_tag);
+ if (i) {
+ RWLOCK_EXIT(&ipsc_rwlock);
+ KFREE(isc);
+ return EEXIST;
+ }
+
+ if (ipsc_tail) {
+ ipsc_tail->ipsc_next = isc;
+ isc->ipsc_pnext = &ipsc_tail->ipsc_next;
+ ipsc_tail = isc;
+ } else {
+ ipsc_list = isc;
+ ipsc_tail = isc;
+ isc->ipsc_pnext = &ipsc_list;
+ }
+ isc->ipsc_next = NULL;
+
+ isc->ipsc_hits = 0;
+ isc->ipsc_fref = 0;
+ isc->ipsc_sref = 0;
+ isc->ipsc_active = 0;
+
+ ipsc_stat.iscs_entries++;
+ RWLOCK_EXIT(&ipsc_rwlock);
+ return 0;
+}
+
+
+int ipsc_delete(data)
+caddr_t data;
+{
+ ipscan_t isc, *i;
+ int err;
+
+ err = copyinptr(data, &isc, sizeof(isc));
+ if (err)
+ return err;
+
+ WRITE_ENTER(&ipsc_rwlock);
+
+ i = ipsc_lookup(isc.ipsc_tag);
+ if (i == NULL)
+ err = ENOENT;
+ else {
+ if (i->ipsc_fref) {
+ RWLOCK_EXIT(&ipsc_rwlock);
+ return EBUSY;
+ }
+
+ *i->ipsc_pnext = i->ipsc_next;
+ if (i->ipsc_next)
+ i->ipsc_next->ipsc_pnext = i->ipsc_pnext;
+ else {
+ if (i->ipsc_pnext == &ipsc_list)
+ ipsc_tail = NULL;
+ else
+ ipsc_tail = *(*i->ipsc_pnext)->ipsc_pnext;
+ }
+
+ ipsc_stat.iscs_entries--;
+ KFREE(i);
+ }
+ RWLOCK_EXIT(&ipsc_rwlock);
+ return err;
+}
+
+
+struct ipscan *ipsc_lookup(tag)
+char *tag;
+{
+ ipscan_t *i;
+
+ for (i = ipsc_list; i; i = i->ipsc_next)
+ if (!strcmp(i->ipsc_tag, tag))
+ return i;
+ return NULL;
+}
+
+
+int ipsc_attachfr(fr)
+struct frentry *fr;
+{
+ ipscan_t *i;
+
+ if (fr->fr_isctag[0]) {
+ READ_ENTER(&ipsc_rwlock);
+ i = ipsc_lookup(fr->fr_isctag);
+ if (i != NULL) {
+ ATOMIC_INC32(i->ipsc_fref);
+ }
+ RWLOCK_EXIT(&ipsc_rwlock);
+ if (i == NULL)
+ return ENOENT;
+ fr->fr_isc = i;
+ }
+ return 0;
+}
+
+
+int ipsc_attachis(is)
+struct ipstate *is;
+{
+ frentry_t *fr;
+ ipscan_t *i;
+
+ READ_ENTER(&ipsc_rwlock);
+ fr = is->is_rule;
+ if (fr) {
+ i = fr->fr_isc;
+ if ((i != NULL) && (i != (ipscan_t *)-1)) {
+ is->is_isc = i;
+ ATOMIC_INC32(i->ipsc_sref);
+ if (i->ipsc_clen)
+ is->is_flags |= IS_SC_CLIENT;
+ else
+ is->is_flags |= IS_SC_MATCHC;
+ if (i->ipsc_slen)
+ is->is_flags |= IS_SC_SERVER;
+ else
+ is->is_flags |= IS_SC_MATCHS;
+ }
+ }
+ RWLOCK_EXIT(&ipsc_rwlock);
+ return 0;
+}
+
+
+int ipsc_detachfr(fr)
+struct frentry *fr;
+{
+ ipscan_t *i;
+
+ i = fr->fr_isc;
+ if (i != NULL) {
+ ATOMIC_DEC32(i->ipsc_fref);
+ }
+ return 0;
+}
+
+
+int ipsc_detachis(is)
+struct ipstate *is;
+{
+ ipscan_t *i;
+
+ READ_ENTER(&ipsc_rwlock);
+ if ((i = is->is_isc) && (i != (ipscan_t *)-1)) {
+ ATOMIC_DEC32(i->ipsc_sref);
+ is->is_isc = NULL;
+ is->is_flags &= ~(IS_SC_CLIENT|IS_SC_SERVER);
+ }
+ RWLOCK_EXIT(&ipsc_rwlock);
+ return 0;
+}
+
+
+/*
+ * 'string' compare for scanning
+ */
+int ipsc_matchstr(sp, str, n)
+sinfo_t *sp;
+char *str;
+int n;
+{
+ char *s, *t, *up;
+ int i = n;
+
+ if (i > sp->s_len)
+ i = sp->s_len;
+ up = str;
+
+ for (s = sp->s_txt, t = sp->s_msk; i; i--, s++, t++, up++)
+ switch ((int)*t)
+ {
+ case '.' :
+ if (*s != *up)
+ return 1;
+ break;
+ case '?' :
+ if (!ISALPHA(*up) || ((*s & 0x5f) != (*up & 0x5f)))
+ return 1;
+ break;
+ case '*' :
+ break;
+ }
+ return 0;
+}
+
+
+/*
+ * Returns 3 if both server and client match, 2 if just server,
+ * 1 if just client
+ */
+int ipsc_matchisc(isc, is, cl, sl, maxm)
+ipscan_t *isc;
+ipstate_t *is;
+int cl, sl, maxm[2];
+{
+ int i, j, k, n, ret = 0, flags;
+
+ flags = is->is_flags;
+
+ /*
+ * If we've already matched more than what is on offer, then
+ * assume we have a better match already and forget this one.
+ */
+ if (maxm != NULL) {
+ if (isc->ipsc_clen < maxm[0])
+ return 0;
+ if (isc->ipsc_slen < maxm[1])
+ return 0;
+ j = maxm[0];
+ k = maxm[1];
+ } else {
+ j = 0;
+ k = 0;
+ }
+
+ if (!isc->ipsc_clen)
+ ret = 1;
+ else if (((flags & (IS_SC_MATCHC|IS_SC_CLIENT)) == IS_SC_CLIENT) &&
+ cl && isc->ipsc_clen) {
+ i = 0;
+ n = MIN(cl, isc->ipsc_clen);
+ if ((n > 0) && (!maxm || (n >= maxm[1]))) {
+ if (!ipsc_matchstr(&isc->ipsc_cl, is->is_sbuf[0], n)) {
+ i++;
+ ret |= 1;
+ if (n > j)
+ j = n;
+ }
+ }
+ }
+
+ if (!isc->ipsc_slen)
+ ret |= 2;
+ else if (((flags & (IS_SC_MATCHS|IS_SC_SERVER)) == IS_SC_SERVER) &&
+ sl && isc->ipsc_slen) {
+ i = 0;
+ n = MIN(cl, isc->ipsc_slen);
+ if ((n > 0) && (!maxm || (n >= maxm[1]))) {
+ if (!ipsc_matchstr(&isc->ipsc_sl, is->is_sbuf[1], n)) {
+ i++;
+ ret |= 2;
+ if (n > k)
+ k = n;
+ }
+ }
+ }
+
+ if (maxm && (ret == 3)) {
+ maxm[0] = j;
+ maxm[1] = k;
+ }
+ return ret;
+}
+
+
+int ipsc_match(is)
+ipstate_t *is;
+{
+ int i, j, k, n, cl, sl, maxm[2];
+ ipscan_t *isc, *lm;
+ tcpdata_t *t;
+
+ for (cl = 0, n = is->is_smsk[0]; n & 1; n >>= 1)
+ cl++;
+ for (sl = 0, n = is->is_smsk[1]; n & 1; n >>= 1)
+ sl++;
+
+ j = 0;
+ isc = is->is_isc;
+ if (isc != NULL) {
+ /*
+ * Known object to scan for.
+ */
+ i = ipsc_matchisc(isc, is, cl, sl, NULL);
+ if (i & 1) {
+ is->is_flags |= IS_SC_MATCHC;
+ is->is_flags &= ~IS_SC_CLIENT;
+ } else if (cl >= isc->ipsc_clen)
+ is->is_flags &= ~IS_SC_CLIENT;
+ if (i & 2) {
+ is->is_flags |= IS_SC_MATCHS;
+ is->is_flags &= ~IS_SC_SERVER;
+ } else if (sl >= isc->ipsc_slen)
+ is->is_flags &= ~IS_SC_SERVER;
+ } else {
+ i = 0;
+ lm = NULL;
+ maxm[0] = 0;
+ maxm[1] = 0;
+ for (k = 0, isc = ipsc_list; isc; isc = isc->ipsc_next) {
+ i = ipsc_matchisc(isc, is, cl, sl, maxm);
+ if (i) {
+ /*
+ * We only want to remember the best match
+ * and the number of times we get a best
+ * match.
+ */
+ if ((j == 3) && (i < 3))
+ continue;
+ if ((i == 3) && (j != 3))
+ k = 1;
+ else
+ k++;
+ j = i;
+ lm = isc;
+ }
+ }
+ if (k == 1)
+ isc = lm;
+ if (isc == NULL)
+ return 0;
+
+ /*
+ * No matches or partial matches, so reset the respective
+ * search flag.
+ */
+ if (!(j & 1))
+ is->is_flags &= ~IS_SC_CLIENT;
+
+ if (!(j & 2))
+ is->is_flags &= ~IS_SC_SERVER;
+
+ /*
+ * If we found the best match, then set flags appropriately.
+ */
+ if ((j == 3) && (k == 1)) {
+ is->is_flags &= ~(IS_SC_SERVER|IS_SC_CLIENT);
+ is->is_flags |= (IS_SC_MATCHS|IS_SC_MATCHC);
+ }
+ }
+
+ /*
+ * If the acknowledged side of a connection has moved past the data in
+ * which we are interested, then reset respective flag.
+ */
+ t = &is->is_tcp.ts_data[0];
+ if (t->td_end > is->is_s0[0] + 15)
+ is->is_flags &= ~IS_SC_CLIENT;
+
+ t = &is->is_tcp.ts_data[1];
+ if (t->td_end > is->is_s0[1] + 15)
+ is->is_flags &= ~IS_SC_SERVER;
+
+ /*
+ * Matching complete ?
+ */
+ j = ISC_A_NONE;
+ if ((is->is_flags & IS_SC_MATCHALL) == IS_SC_MATCHALL) {
+ j = isc->ipsc_action;
+ ipsc_stat.iscs_acted++;
+ } else if ((is->is_isc != NULL) &&
+ ((is->is_flags & IS_SC_MATCHALL) != IS_SC_MATCHALL) &&
+ !(is->is_flags & (IS_SC_CLIENT|IS_SC_SERVER))) {
+ /*
+ * Matching failed...
+ */
+ j = isc->ipsc_else;
+ ipsc_stat.iscs_else++;
+ }
+
+ switch (j)
+ {
+ case ISC_A_CLOSE :
+ /*
+ * If as a result of a successful match we are to
+ * close a connection, change the "keep state" info.
+ * to block packets and generate TCP RST's.
+ */
+ is->is_pass &= ~FR_RETICMP;
+ is->is_pass |= FR_RETRST;
+ break;
+ default :
+ break;
+ }
+
+ return i;
+}
+
+
+/*
+ * check if a packet matches what we're scanning for
+ */
+int ipsc_packet(fin, is)
+fr_info_t *fin;
+ipstate_t *is;
+{
+ int i, j, rv, dlen, off, thoff;
+ u_32_t seq, s0;
+ tcphdr_t *tcp;
+
+ rv = !IP6_EQ(&fin->fin_fi.fi_src, &is->is_src);
+ tcp = fin->fin_dp;
+ seq = ntohl(tcp->th_seq);
+
+ if (!is->is_s0[rv])
+ return 1;
+
+ /*
+ * check if this packet has more data that falls within the first
+ * 16 bytes sent in either direction.
+ */
+ s0 = is->is_s0[rv];
+ off = seq - s0;
+ if ((off > 15) || (off < 0))
+ return 1;
+ thoff = TCP_OFF(tcp) << 2;
+ dlen = fin->fin_dlen - thoff;
+ if (dlen <= 0)
+ return 1;
+ if (dlen > 16)
+ dlen = 16;
+ if (off + dlen > 16)
+ dlen = 16 - off;
+
+ j = 0xffff >> (16 - dlen);
+ i = (0xffff & j) << off;
+#ifdef _KERNEL
+ COPYDATA(*(mb_t **)fin->fin_mp, fin->fin_plen - fin->fin_dlen + thoff,
+ dlen, (caddr_t)is->is_sbuf[rv] + off);
+#endif
+ is->is_smsk[rv] |= i;
+ for (j = 0, i = is->is_smsk[rv]; i & 1; i >>= 1)
+ j++;
+ if (j == 0)
+ return 1;
+
+ (void) ipsc_match(is);
+#if 0
+ /*
+ * There is the potential here for plain text passwords to get
+ * buffered and stored for some time...
+ */
+ if (!(is->is_flags & IS_SC_CLIENT))
+ bzero(is->is_sbuf[0], sizeof(is->is_sbuf[0]));
+ if (!(is->is_flags & IS_SC_SERVER))
+ bzero(is->is_sbuf[1], sizeof(is->is_sbuf[1]));
+#endif
+ return 0;
+}
+
+
+int fr_scan_ioctl(data, cmd, mode, uid, ctx)
+caddr_t data;
+ioctlcmd_t cmd;
+int mode, uid;
+void *ctx;
+{
+ ipscanstat_t ipscs;
+ int err = 0;
+
+ switch (cmd)
+ {
+ case SIOCADSCA :
+ err = ipsc_add(data);
+ break;
+ case SIOCRMSCA :
+ err = ipsc_delete(data);
+ break;
+ case SIOCGSCST :
+ bcopy((char *)&ipsc_stat, (char *)&ipscs, sizeof(ipscs));
+ ipscs.iscs_list = ipsc_list;
+ BCOPYOUT(&ipscs, data, sizeof(ipscs));
+ break;
+ default :
+ err = EINVAL;
+ break;
+ }
+
+ return err;
+}
+#endif /* IPFILTER_SCAN */
diff --git a/sys/contrib/ipfilter/netinet/ip_scan.h b/sys/contrib/ipfilter/netinet/ip_scan.h
new file mode 100644
index 0000000..4772d28
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_scan.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (C) 1993-2001 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * @(#)ip_fil.h 1.35 6/5/96
+ * $Id: ip_scan.h,v 2.9.2.2 2006/07/14 06:12:19 darrenr Exp $
+ */
+
+#ifndef __IP_SCAN_H__
+#define __IP_SCAN_H__ 1
+
+#ifdef sun
+# include <sys/ioccom.h>
+#endif
+
+#define IPSCAN_NAME "/dev/ipscan"
+#define IPL_SCAN IPSCAN_NAME
+#define ISC_TLEN 16
+
+
+struct fr_info;
+struct frentry;
+struct ip;
+struct ipstate;
+
+
+#if defined(__STDC__) || defined(__GNUC__) || defined(_AIX51)
+# define SIOCADSCA _IOWR('r', 60, struct ipscan *)
+# define SIOCRMSCA _IOWR('r', 61, struct ipscan *)
+# define SIOCGSCST _IOWR('r', 62, struct ipscan *)
+#else
+# define SIOCADSCA _IOWR(r, 60, struct ipscan *)
+# define SIOCRMSCA _IOWR(r, 61, struct ipscan *)
+# define SIOCGSCST _IOWR(r, 62, struct ipscan *)
+#endif
+
+struct action {
+ int act_val; /* what to do */
+ struct in_addr act_ip; /* redirect IP# */
+ u_short act_port; /* redirect port number */
+ int act_else; /* what to do */
+ struct in_addr act_eip; /* redirect IP# */
+ u_short act_eport; /* redirect port number */
+};
+
+
+typedef struct sinfo {
+ char s_txt[ISC_TLEN]; /* text to match */
+ char s_msk[ISC_TLEN]; /* mask of the above to check */
+ int s_len; /* length of server text */
+} sinfo_t;
+
+
+typedef struct ipscan {
+ struct ipscan *ipsc_next;
+ struct ipscan **ipsc_pnext;
+ char ipsc_tag[ISC_TLEN]; /* table entry protocol tag */
+ sinfo_t ipsc_si[2]; /* client/server side information */
+ int ipsc_hits; /* times this has been matched */
+ int ipsc_active; /* # of active matches */
+ int ipsc_fref; /* # of references from filter rules */
+ int ipsc_sref; /* # of references from state entries */
+ struct action ipsc_act;
+} ipscan_t;
+
+
+#define ipsc_cl ipsc_si[0]
+#define ipsc_sl ipsc_si[1]
+#define ipsc_ctxt ipsc_cl.s_txt
+#define ipsc_cmsk ipsc_cl.s_msk
+#define ipsc_clen ipsc_cl.s_len
+#define ipsc_stxt ipsc_sl.s_txt
+#define ipsc_smsk ipsc_sl.s_msk
+#define ipsc_slen ipsc_sl.s_len
+#define ipsc_action ipsc_act.act_val
+#define ipsc_ip ipsc_act.act_ip
+#define ipsc_port ipsc_act.act_port
+#define ipsc_else ipsc_act.act_else
+#define ipsc_eip ipsc_act.act_eip
+#define ipsc_eport ipsc_act.act_eport
+
+#define ISC_A_NONE 0
+#define ISC_A_TRACK 1
+#define ISC_A_CLOSE 2
+#define ISC_A_REDIRECT 3
+
+
+typedef struct ipscanstat {
+ struct ipscan *iscs_list;
+ u_long iscs_acted;
+ u_long iscs_else;
+ int iscs_entries;
+} ipscanstat_t;
+
+
+extern int fr_scan_ioctl __P((caddr_t, ioctlcmd_t, int, int, void *));
+extern int ipsc_init __P((void));
+extern int ipsc_attachis __P((struct ipstate *));
+extern int ipsc_attachfr __P((struct frentry *));
+extern int ipsc_detachis __P((struct ipstate *));
+extern int ipsc_detachfr __P((struct frentry *));
+extern int ipsc_packet __P((struct fr_info *, struct ipstate *));
+extern void fr_scanunload __P((void));
+
+#endif /* __IP_SCAN_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_state.c b/sys/contrib/ipfilter/netinet/ip_state.c
new file mode 100644
index 0000000..39a094a
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_state.c
@@ -0,0 +1,4155 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1995-2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/file.h>
+#if defined(__NetBSD__) && (NetBSD >= 199905) && !defined(IPFILTER_LKM) && \
+ defined(_KERNEL)
+# if (__NetBSD_Version__ < 399001400)
+# include "opt_ipfilter_log.h"
+# else
+# include "opt_ipfilter.h"
+# endif
+#endif
+#if defined(_KERNEL) && defined(__FreeBSD_version) && \
+ (__FreeBSD_version >= 400000) && !defined(KLD_MODULE)
+#include "opt_inet6.h"
+#endif
+#if !defined(_KERNEL) && !defined(__KERNEL__)
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# define _KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+#endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 220000)
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+# if (__FreeBSD_version >= 300000) && !defined(IPFILTER_LKM)
+# include "opt_ipfilter.h"
+# endif
+#else
+# include <sys/ioctl.h>
+#endif
+#include <sys/time.h>
+#if !defined(linux)
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if defined(_KERNEL)
+# include <sys/systm.h>
+# if !defined(__SVR4) && !defined(__svr4__)
+# include <sys/mbuf.h>
+# endif
+#endif
+#if defined(__SVR4) || defined(__svr4__)
+# include <sys/filio.h>
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#if !defined(linux)
+# include <netinet/ip_var.h>
+#endif
+#if !defined(__hpux) && !defined(linux)
+# include <netinet/tcp_fsm.h>
+#endif
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_proxy.h"
+#ifdef IPFILTER_SYNC
+#include "netinet/ip_sync.h"
+#endif
+#ifdef IPFILTER_SCAN
+#include "netinet/ip_scan.h"
+#endif
+#ifdef USE_INET6
+#include <netinet/icmp6.h>
+#endif
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+# if defined(_KERNEL) && !defined(IPFILTER_LKM)
+# include <sys/libkern.h>
+# include <sys/systm.h>
+# endif
+#endif
+/* END OF INCLUDES */
+
+
+#if !defined(lint)
+static const char sccsid[] = "@(#)ip_state.c 1.8 6/5/96 (C) 1993-2000 Darren Reed";
+static const char rcsid[] = "@(#)$Id: ip_state.c,v 2.186.2.69 2007/05/26 13:05:14 darrenr Exp $";
+#endif
+
+static ipstate_t **ips_table = NULL;
+static u_long *ips_seed = NULL;
+static int ips_num = 0;
+static u_long ips_last_force_flush = 0;
+ips_stat_t ips_stats;
+
+#ifdef USE_INET6
+static ipstate_t *fr_checkicmp6matchingstate __P((fr_info_t *));
+#endif
+static ipstate_t *fr_matchsrcdst __P((fr_info_t *, ipstate_t *, i6addr_t *,
+ i6addr_t *, tcphdr_t *, u_32_t));
+static ipstate_t *fr_checkicmpmatchingstate __P((fr_info_t *));
+static int fr_state_flush __P((int, int));
+static int fr_state_flush_entry __P((void *));
+static ips_stat_t *fr_statetstats __P((void));
+static int fr_delstate __P((ipstate_t *, int));
+static int fr_state_remove __P((caddr_t));
+static void fr_ipsmove __P((ipstate_t *, u_int));
+static int fr_tcpstate __P((fr_info_t *, tcphdr_t *, ipstate_t *));
+static int fr_tcpoptions __P((fr_info_t *, tcphdr_t *, tcpdata_t *));
+static ipstate_t *fr_stclone __P((fr_info_t *, tcphdr_t *, ipstate_t *));
+static void fr_fixinisn __P((fr_info_t *, ipstate_t *));
+static void fr_fixoutisn __P((fr_info_t *, ipstate_t *));
+static void fr_checknewisn __P((fr_info_t *, ipstate_t *));
+static int fr_stateiter __P((ipftoken_t *, ipfgeniter_t *));
+static int fr_stgettable __P((char *));
+
+int fr_stputent __P((caddr_t));
+int fr_stgetent __P((caddr_t));
+
+#define ONE_DAY IPF_TTLVAL(1 * 86400) /* 1 day */
+#define FIVE_DAYS (5 * ONE_DAY)
+#define DOUBLE_HASH(x) (((x) + ips_seed[(x) % fr_statesize]) % fr_statesize)
+
+u_long fr_tcpidletimeout = FIVE_DAYS,
+ fr_tcpclosewait = IPF_TTLVAL(2 * TCP_MSL),
+ fr_tcplastack = IPF_TTLVAL(30),
+ fr_tcptimeout = IPF_TTLVAL(2 * TCP_MSL),
+ fr_tcptimewait = IPF_TTLVAL(2 * TCP_MSL),
+ fr_tcpclosed = IPF_TTLVAL(30),
+ fr_tcphalfclosed = IPF_TTLVAL(2 * 3600), /* 2 hours */
+ fr_udptimeout = IPF_TTLVAL(120),
+ fr_udpacktimeout = IPF_TTLVAL(12),
+ fr_icmptimeout = IPF_TTLVAL(60),
+ fr_icmpacktimeout = IPF_TTLVAL(6),
+ fr_iptimeout = IPF_TTLVAL(60);
+int fr_statemax = IPSTATE_MAX,
+ fr_statesize = IPSTATE_SIZE;
+int fr_state_doflush = 0,
+ fr_state_lock = 0,
+ fr_state_maxbucket = 0,
+ fr_state_maxbucket_reset = 1,
+ fr_state_init = 0;
+ipftq_t ips_tqtqb[IPF_TCP_NSTATES],
+ ips_udptq,
+ ips_udpacktq,
+ ips_iptq,
+ ips_icmptq,
+ ips_icmpacktq,
+ ips_deletetq,
+ *ips_utqe = NULL;
+#ifdef IPFILTER_LOG
+int ipstate_logging = 1;
+#else
+int ipstate_logging = 0;
+#endif
+ipstate_t *ips_list = NULL;
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_stateinit */
+/* Returns: int - 0 == success, -1 == failure */
+/* Parameters: Nil */
+/* */
+/* Initialise all the global variables used within the state code. */
+/* This action also includes initiailising locks. */
+/* ------------------------------------------------------------------------ */
+int fr_stateinit()
+{
+ int i;
+
+ KMALLOCS(ips_table, ipstate_t **, fr_statesize * sizeof(ipstate_t *));
+ if (ips_table == NULL)
+ return -1;
+ bzero((char *)ips_table, fr_statesize * sizeof(ipstate_t *));
+
+ KMALLOCS(ips_seed, u_long *, fr_statesize * sizeof(*ips_seed));
+ if (ips_seed == NULL)
+ return -2;
+ for (i = 0; i < fr_statesize; i++) {
+ /*
+ * XXX - ips_seed[X] should be a random number of sorts.
+ */
+#if (__FreeBSD_version >= 400000)
+ ips_seed[i] = arc4random();
+#else
+ ips_seed[i] = ((u_long)ips_seed + i) * fr_statesize;
+ ips_seed[i] ^= 0xa5a55a5a;
+ ips_seed[i] *= (u_long)ips_seed;
+ ips_seed[i] ^= 0x5a5aa5a5;
+ ips_seed[i] *= fr_statemax;
+#endif
+ }
+
+ /* fill icmp reply type table */
+ for (i = 0; i <= ICMP_MAXTYPE; i++)
+ icmpreplytype4[i] = -1;
+ icmpreplytype4[ICMP_ECHO] = ICMP_ECHOREPLY;
+ icmpreplytype4[ICMP_TSTAMP] = ICMP_TSTAMPREPLY;
+ icmpreplytype4[ICMP_IREQ] = ICMP_IREQREPLY;
+ icmpreplytype4[ICMP_MASKREQ] = ICMP_MASKREPLY;
+#ifdef USE_INET6
+ /* fill icmp reply type table */
+ for (i = 0; i <= ICMP6_MAXTYPE; i++)
+ icmpreplytype6[i] = -1;
+ icmpreplytype6[ICMP6_ECHO_REQUEST] = ICMP6_ECHO_REPLY;
+ icmpreplytype6[ICMP6_MEMBERSHIP_QUERY] = ICMP6_MEMBERSHIP_REPORT;
+ icmpreplytype6[ICMP6_NI_QUERY] = ICMP6_NI_REPLY;
+ icmpreplytype6[ND_ROUTER_SOLICIT] = ND_ROUTER_ADVERT;
+ icmpreplytype6[ND_NEIGHBOR_SOLICIT] = ND_NEIGHBOR_ADVERT;
+#endif
+
+ KMALLOCS(ips_stats.iss_bucketlen, u_long *,
+ fr_statesize * sizeof(u_long));
+ if (ips_stats.iss_bucketlen == NULL)
+ return -1;
+ bzero((char *)ips_stats.iss_bucketlen, fr_statesize * sizeof(u_long));
+
+ if (fr_state_maxbucket == 0) {
+ for (i = fr_statesize; i > 0; i >>= 1)
+ fr_state_maxbucket++;
+ fr_state_maxbucket *= 2;
+ }
+
+ ips_stats.iss_tcptab = ips_tqtqb;
+ fr_sttab_init(ips_tqtqb);
+ ips_tqtqb[IPF_TCP_NSTATES - 1].ifq_next = &ips_udptq;
+ ips_udptq.ifq_ttl = (u_long)fr_udptimeout;
+ ips_udptq.ifq_ref = 1;
+ ips_udptq.ifq_head = NULL;
+ ips_udptq.ifq_tail = &ips_udptq.ifq_head;
+ MUTEX_INIT(&ips_udptq.ifq_lock, "ipftq udp tab");
+ ips_udptq.ifq_next = &ips_udpacktq;
+ ips_udpacktq.ifq_ttl = (u_long)fr_udpacktimeout;
+ ips_udpacktq.ifq_ref = 1;
+ ips_udpacktq.ifq_head = NULL;
+ ips_udpacktq.ifq_tail = &ips_udpacktq.ifq_head;
+ MUTEX_INIT(&ips_udpacktq.ifq_lock, "ipftq udpack tab");
+ ips_udpacktq.ifq_next = &ips_icmptq;
+ ips_icmptq.ifq_ttl = (u_long)fr_icmptimeout;
+ ips_icmptq.ifq_ref = 1;
+ ips_icmptq.ifq_head = NULL;
+ ips_icmptq.ifq_tail = &ips_icmptq.ifq_head;
+ MUTEX_INIT(&ips_icmptq.ifq_lock, "ipftq icmp tab");
+ ips_icmptq.ifq_next = &ips_icmpacktq;
+ ips_icmpacktq.ifq_ttl = (u_long)fr_icmpacktimeout;
+ ips_icmpacktq.ifq_ref = 1;
+ ips_icmpacktq.ifq_head = NULL;
+ ips_icmpacktq.ifq_tail = &ips_icmpacktq.ifq_head;
+ MUTEX_INIT(&ips_icmpacktq.ifq_lock, "ipftq icmpack tab");
+ ips_icmpacktq.ifq_next = &ips_iptq;
+ ips_iptq.ifq_ttl = (u_long)fr_iptimeout;
+ ips_iptq.ifq_ref = 1;
+ ips_iptq.ifq_head = NULL;
+ ips_iptq.ifq_tail = &ips_iptq.ifq_head;
+ MUTEX_INIT(&ips_iptq.ifq_lock, "ipftq ip tab");
+ ips_iptq.ifq_next = &ips_deletetq;
+ ips_deletetq.ifq_ttl = (u_long)1;
+ ips_deletetq.ifq_ref = 1;
+ ips_deletetq.ifq_head = NULL;
+ ips_deletetq.ifq_tail = &ips_deletetq.ifq_head;
+ MUTEX_INIT(&ips_deletetq.ifq_lock, "state delete queue");
+ ips_deletetq.ifq_next = NULL;
+
+ RWLOCK_INIT(&ipf_state, "ipf IP state rwlock");
+ MUTEX_INIT(&ipf_stinsert, "ipf state insert mutex");
+ fr_state_init = 1;
+
+ ips_last_force_flush = fr_ticks;
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_stateunload */
+/* Returns: Nil */
+/* Parameters: Nil */
+/* */
+/* Release and destroy any resources acquired or initialised so that */
+/* IPFilter can be unloaded or re-initialised. */
+/* ------------------------------------------------------------------------ */
+void fr_stateunload()
+{
+ ipftq_t *ifq, *ifqnext;
+ ipstate_t *is;
+
+ while ((is = ips_list) != NULL)
+ fr_delstate(is, ISL_UNLOAD);
+
+ /*
+ * Proxy timeout queues are not cleaned here because although they
+ * exist on the state list, appr_unload is called after fr_stateunload
+ * and the proxies actually are responsible for them being created.
+ * Should the proxy timeouts have their own list? There's no real
+ * justification as this is the only complicationA
+ */
+ for (ifq = ips_utqe; ifq != NULL; ifq = ifqnext) {
+ ifqnext = ifq->ifq_next;
+ if (((ifq->ifq_flags & IFQF_PROXY) == 0) &&
+ (fr_deletetimeoutqueue(ifq) == 0))
+ fr_freetimeoutqueue(ifq);
+ }
+
+ ips_stats.iss_inuse = 0;
+ ips_num = 0;
+
+ if (fr_state_init == 1) {
+ fr_sttab_destroy(ips_tqtqb);
+ MUTEX_DESTROY(&ips_udptq.ifq_lock);
+ MUTEX_DESTROY(&ips_icmptq.ifq_lock);
+ MUTEX_DESTROY(&ips_udpacktq.ifq_lock);
+ MUTEX_DESTROY(&ips_icmpacktq.ifq_lock);
+ MUTEX_DESTROY(&ips_iptq.ifq_lock);
+ MUTEX_DESTROY(&ips_deletetq.ifq_lock);
+ }
+
+ if (ips_table != NULL) {
+ KFREES(ips_table, fr_statesize * sizeof(*ips_table));
+ ips_table = NULL;
+ }
+
+ if (ips_seed != NULL) {
+ KFREES(ips_seed, fr_statesize * sizeof(*ips_seed));
+ ips_seed = NULL;
+ }
+
+ if (ips_stats.iss_bucketlen != NULL) {
+ KFREES(ips_stats.iss_bucketlen, fr_statesize * sizeof(u_long));
+ ips_stats.iss_bucketlen = NULL;
+ }
+
+ if (fr_state_maxbucket_reset == 1)
+ fr_state_maxbucket = 0;
+
+ if (fr_state_init == 1) {
+ fr_state_init = 0;
+ RW_DESTROY(&ipf_state);
+ MUTEX_DESTROY(&ipf_stinsert);
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_statetstats */
+/* Returns: ips_state_t* - pointer to state stats structure */
+/* Parameters: Nil */
+/* */
+/* Put all the current numbers and pointers into a single struct and return */
+/* a pointer to it. */
+/* ------------------------------------------------------------------------ */
+static ips_stat_t *fr_statetstats()
+{
+ ips_stats.iss_active = ips_num;
+ ips_stats.iss_statesize = fr_statesize;
+ ips_stats.iss_statemax = fr_statemax;
+ ips_stats.iss_table = ips_table;
+ ips_stats.iss_list = ips_list;
+ ips_stats.iss_ticks = fr_ticks;
+ return &ips_stats;
+}
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_state_remove */
+/* Returns: int - 0 == success, != 0 == failure */
+/* Parameters: data(I) - pointer to state structure to delete from table */
+/* */
+/* Search for a state structure that matches the one passed, according to */
+/* the IP addresses and other protocol specific information. */
+/* ------------------------------------------------------------------------ */
+static int fr_state_remove(data)
+caddr_t data;
+{
+ ipstate_t *sp, st;
+ int error;
+
+ sp = &st;
+ error = fr_inobj(data, &st, IPFOBJ_IPSTATE);
+ if (error)
+ return EFAULT;
+
+ WRITE_ENTER(&ipf_state);
+ for (sp = ips_list; sp; sp = sp->is_next)
+ if ((sp->is_p == st.is_p) && (sp->is_v == st.is_v) &&
+ !bcmp((caddr_t)&sp->is_src, (caddr_t)&st.is_src,
+ sizeof(st.is_src)) &&
+ !bcmp((caddr_t)&sp->is_dst, (caddr_t)&st.is_src,
+ sizeof(st.is_dst)) &&
+ !bcmp((caddr_t)&sp->is_ps, (caddr_t)&st.is_ps,
+ sizeof(st.is_ps))) {
+ fr_delstate(sp, ISL_REMOVE);
+ RWLOCK_EXIT(&ipf_state);
+ return 0;
+ }
+ RWLOCK_EXIT(&ipf_state);
+ return ESRCH;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_state_ioctl */
+/* Returns: int - 0 == success, != 0 == failure */
+/* Parameters: data(I) - pointer to ioctl data */
+/* cmd(I) - ioctl command integer */
+/* mode(I) - file mode bits used with open */
+/* */
+/* Processes an ioctl call made to operate on the IP Filter state device. */
+/* ------------------------------------------------------------------------ */
+int fr_state_ioctl(data, cmd, mode, uid, ctx)
+caddr_t data;
+ioctlcmd_t cmd;
+int mode, uid;
+void *ctx;
+{
+ int arg, ret, error = 0;
+ SPL_INT(s);
+
+ switch (cmd)
+ {
+ /*
+ * Delete an entry from the state table.
+ */
+ case SIOCDELST :
+ error = fr_state_remove(data);
+ break;
+
+ /*
+ * Flush the state table
+ */
+ case SIOCIPFFL :
+ error = BCOPYIN(data, (char *)&arg, sizeof(arg));
+ if (error != 0) {
+ error = EFAULT;
+ } else {
+ WRITE_ENTER(&ipf_state);
+ ret = fr_state_flush(arg, 4);
+ RWLOCK_EXIT(&ipf_state);
+ error = BCOPYOUT((char *)&ret, data, sizeof(ret));
+ if (error != 0)
+ error = EFAULT;
+ }
+ break;
+
+#ifdef USE_INET6
+ case SIOCIPFL6 :
+ error = BCOPYIN(data, (char *)&arg, sizeof(arg));
+ if (error != 0) {
+ error = EFAULT;
+ } else {
+ WRITE_ENTER(&ipf_state);
+ ret = fr_state_flush(arg, 6);
+ RWLOCK_EXIT(&ipf_state);
+ error = BCOPYOUT((char *)&ret, data, sizeof(ret));
+ if (error != 0)
+ error = EFAULT;
+ }
+ break;
+#endif
+#ifdef IPFILTER_LOG
+ /*
+ * Flush the state log.
+ */
+ case SIOCIPFFB :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ int tmp;
+
+ tmp = ipflog_clear(IPL_LOGSTATE);
+ error = BCOPYOUT((char *)&tmp, data, sizeof(tmp));
+ if (error != 0)
+ error = EFAULT;
+ }
+ break;
+
+ /*
+ * Turn logging of state information on/off.
+ */
+ case SIOCSETLG :
+ if (!(mode & FWRITE))
+ error = EPERM;
+ else {
+ error = BCOPYIN((char *)data, (char *)&ipstate_logging,
+ sizeof(ipstate_logging));
+ if (error != 0)
+ error = EFAULT;
+ }
+ break;
+
+ /*
+ * Return the current state of logging.
+ */
+ case SIOCGETLG :
+ error = BCOPYOUT((char *)&ipstate_logging, (char *)data,
+ sizeof(ipstate_logging));
+ if (error != 0)
+ error = EFAULT;
+ break;
+
+ /*
+ * Return the number of bytes currently waiting to be read.
+ */
+ case FIONREAD :
+ arg = iplused[IPL_LOGSTATE]; /* returned in an int */
+ error = BCOPYOUT((char *)&arg, data, sizeof(arg));
+ if (error != 0)
+ error = EFAULT;
+ break;
+#endif
+
+ /*
+ * Get the current state statistics.
+ */
+ case SIOCGETFS :
+ error = fr_outobj(data, fr_statetstats(), IPFOBJ_STATESTAT);
+ break;
+
+ /*
+ * Lock/Unlock the state table. (Locking prevents any changes, which
+ * means no packets match).
+ */
+ case SIOCSTLCK :
+ if (!(mode & FWRITE)) {
+ error = EPERM;
+ } else {
+ fr_lock(data, &fr_state_lock);
+ }
+ break;
+
+ /*
+ * Add an entry to the current state table.
+ */
+ case SIOCSTPUT :
+ if (!fr_state_lock || !(mode &FWRITE)) {
+ error = EACCES;
+ break;
+ }
+ error = fr_stputent(data);
+ break;
+
+ /*
+ * Get a state table entry.
+ */
+ case SIOCSTGET :
+ if (!fr_state_lock) {
+ error = EACCES;
+ break;
+ }
+ error = fr_stgetent(data);
+ break;
+
+ /*
+ * Return a copy of the hash table bucket lengths
+ */
+ case SIOCSTAT1 :
+ error = BCOPYOUT(ips_stats.iss_bucketlen, data,
+ fr_statesize * sizeof(u_long));
+ if (error != 0)
+ error = EFAULT;
+ break;
+
+ case SIOCGENITER :
+ {
+ ipftoken_t *token;
+ ipfgeniter_t iter;
+
+ error = fr_inobj(data, &iter, IPFOBJ_GENITER);
+ if (error != 0)
+ break;
+
+ SPL_SCHED(s);
+ token = ipf_findtoken(IPFGENITER_STATE, uid, ctx);
+ if (token != NULL)
+ error = fr_stateiter(token, &iter);
+ else
+ error = ESRCH;
+ RWLOCK_EXIT(&ipf_tokens);
+ SPL_X(s);
+ break;
+ }
+
+ case SIOCGTABL :
+ error = fr_stgettable(data);
+ break;
+
+ case SIOCIPFDELTOK :
+ error = BCOPYIN(data, (char *)&arg, sizeof(arg));
+ if (error != 0) {
+ error = EFAULT;
+ } else {
+ SPL_SCHED(s);
+ error = ipf_deltoken(arg, uid, ctx);
+ SPL_X(s);
+ }
+ break;
+
+ case SIOCGTQTAB :
+ error = fr_outobj(data, ips_tqtqb, IPFOBJ_STATETQTAB);
+ break;
+
+ default :
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_stgetent */
+/* Returns: int - 0 == success, != 0 == failure */
+/* Parameters: data(I) - pointer to state structure to retrieve from table */
+/* */
+/* Copy out state information from the kernel to a user space process. If */
+/* there is a filter rule associated with the state entry, copy that out */
+/* as well. The entry to copy out is taken from the value of "ips_next" in */
+/* the struct passed in and if not null and not found in the list of current*/
+/* state entries, the retrieval fails. */
+/* ------------------------------------------------------------------------ */
+int fr_stgetent(data)
+caddr_t data;
+{
+ ipstate_t *is, *isn;
+ ipstate_save_t ips;
+ int error;
+
+ error = fr_inobj(data, &ips, IPFOBJ_STATESAVE);
+ if (error)
+ return EFAULT;
+
+ isn = ips.ips_next;
+ if (isn == NULL) {
+ isn = ips_list;
+ if (isn == NULL) {
+ if (ips.ips_next == NULL)
+ return ENOENT;
+ return 0;
+ }
+ } else {
+ /*
+ * Make sure the pointer we're copying from exists in the
+ * current list of entries. Security precaution to prevent
+ * copying of random kernel data.
+ */
+ for (is = ips_list; is; is = is->is_next)
+ if (is == isn)
+ break;
+ if (!is)
+ return ESRCH;
+ }
+ ips.ips_next = isn->is_next;
+ bcopy((char *)isn, (char *)&ips.ips_is, sizeof(ips.ips_is));
+ ips.ips_rule = isn->is_rule;
+ if (isn->is_rule != NULL)
+ bcopy((char *)isn->is_rule, (char *)&ips.ips_fr,
+ sizeof(ips.ips_fr));
+ error = fr_outobj(data, &ips, IPFOBJ_STATESAVE);
+ if (error)
+ return EFAULT;
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_stputent */
+/* Returns: int - 0 == success, != 0 == failure */
+/* Parameters: data(I) - pointer to state information struct */
+/* */
+/* This function implements the SIOCSTPUT ioctl: insert a state entry into */
+/* the state table. If the state info. includes a pointer to a filter rule */
+/* then also add in an orphaned rule (will not show up in any "ipfstat -io" */
+/* output. */
+/* ------------------------------------------------------------------------ */
+int fr_stputent(data)
+caddr_t data;
+{
+ ipstate_t *is, *isn;
+ ipstate_save_t ips;
+ int error, out, i;
+ frentry_t *fr;
+ char *name;
+
+ error = fr_inobj(data, &ips, IPFOBJ_STATESAVE);
+ if (error)
+ return EFAULT;
+
+ KMALLOC(isn, ipstate_t *);
+ if (isn == NULL)
+ return ENOMEM;
+
+ bcopy((char *)&ips.ips_is, (char *)isn, sizeof(*isn));
+ bzero((char *)isn, offsetof(struct ipstate, is_pkts));
+ isn->is_sti.tqe_pnext = NULL;
+ isn->is_sti.tqe_next = NULL;
+ isn->is_sti.tqe_ifq = NULL;
+ isn->is_sti.tqe_parent = isn;
+ isn->is_ifp[0] = NULL;
+ isn->is_ifp[1] = NULL;
+ isn->is_ifp[2] = NULL;
+ isn->is_ifp[3] = NULL;
+ isn->is_sync = NULL;
+ fr = ips.ips_rule;
+
+ if (fr == NULL) {
+ READ_ENTER(&ipf_state);
+ fr_stinsert(isn, 0);
+ MUTEX_EXIT(&isn->is_lock);
+ RWLOCK_EXIT(&ipf_state);
+ return 0;
+ }
+
+ if (isn->is_flags & SI_NEWFR) {
+ KMALLOC(fr, frentry_t *);
+ if (fr == NULL) {
+ KFREE(isn);
+ return ENOMEM;
+ }
+ bcopy((char *)&ips.ips_fr, (char *)fr, sizeof(*fr));
+ out = fr->fr_flags & FR_OUTQUE ? 1 : 0;
+ isn->is_rule = fr;
+ ips.ips_is.is_rule = fr;
+ MUTEX_NUKE(&fr->fr_lock);
+ MUTEX_INIT(&fr->fr_lock, "state filter rule lock");
+
+ /*
+ * Look up all the interface names in the rule.
+ */
+ for (i = 0; i < 4; i++) {
+ name = fr->fr_ifnames[i];
+ fr->fr_ifas[i] = fr_resolvenic(name, fr->fr_v);
+ name = isn->is_ifname[i];
+ isn->is_ifp[i] = fr_resolvenic(name, isn->is_v);
+ }
+
+ fr->fr_ref = 0;
+ fr->fr_dsize = 0;
+ fr->fr_data = NULL;
+ fr->fr_type = FR_T_NONE;
+
+ fr_resolvedest(&fr->fr_tifs[0], fr->fr_v);
+ fr_resolvedest(&fr->fr_tifs[1], fr->fr_v);
+ fr_resolvedest(&fr->fr_dif, fr->fr_v);
+
+ /*
+ * send a copy back to userland of what we ended up
+ * to allow for verification.
+ */
+ error = fr_outobj(data, &ips, IPFOBJ_STATESAVE);
+ if (error) {
+ KFREE(isn);
+ MUTEX_DESTROY(&fr->fr_lock);
+ KFREE(fr);
+ return EFAULT;
+ }
+ READ_ENTER(&ipf_state);
+ fr_stinsert(isn, 0);
+ MUTEX_EXIT(&isn->is_lock);
+ RWLOCK_EXIT(&ipf_state);
+
+ } else {
+ READ_ENTER(&ipf_state);
+ for (is = ips_list; is; is = is->is_next)
+ if (is->is_rule == fr) {
+ fr_stinsert(isn, 0);
+ MUTEX_EXIT(&isn->is_lock);
+ break;
+ }
+
+ if (is == NULL) {
+ KFREE(isn);
+ isn = NULL;
+ }
+ RWLOCK_EXIT(&ipf_state);
+
+ return (isn == NULL) ? ESRCH : 0;
+ }
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_stinsert */
+/* Returns: Nil */
+/* Parameters: is(I) - pointer to state structure */
+/* rev(I) - flag indicating forward/reverse direction of packet */
+/* */
+/* Inserts a state structure into the hash table (for lookups) and the list */
+/* of state entries (for enumeration). Resolves all of the interface names */
+/* to pointers and adjusts running stats for the hash table as appropriate. */
+/* */
+/* Locking: it is assumed that some kind of lock on ipf_state is held. */
+/* Exits with is_lock initialised and held. */
+/* ------------------------------------------------------------------------ */
+void fr_stinsert(is, rev)
+ipstate_t *is;
+int rev;
+{
+ frentry_t *fr;
+ u_int hv;
+ int i;
+
+ MUTEX_INIT(&is->is_lock, "ipf state entry");
+
+ fr = is->is_rule;
+ if (fr != NULL) {
+ MUTEX_ENTER(&fr->fr_lock);
+ fr->fr_ref++;
+ fr->fr_statecnt++;
+ MUTEX_EXIT(&fr->fr_lock);
+ }
+
+ /*
+ * Look up all the interface names in the state entry.
+ */
+ for (i = 0; i < 4; i++) {
+ if (is->is_ifp[i] != NULL)
+ continue;
+ is->is_ifp[i] = fr_resolvenic(is->is_ifname[i], is->is_v);
+ }
+
+ /*
+ * If we could trust is_hv, then the modulous would not be needed, but
+ * when running with IPFILTER_SYNC, this stops bad values.
+ */
+ hv = is->is_hv % fr_statesize;
+ is->is_hv = hv;
+
+ /*
+ * We need to get both of these locks...the first because it is
+ * possible that once the insert is complete another packet might
+ * come along, match the entry and want to update it.
+ */
+ MUTEX_ENTER(&is->is_lock);
+ MUTEX_ENTER(&ipf_stinsert);
+
+ /*
+ * add into list table.
+ */
+ if (ips_list != NULL)
+ ips_list->is_pnext = &is->is_next;
+ is->is_pnext = &ips_list;
+ is->is_next = ips_list;
+ ips_list = is;
+
+ if (ips_table[hv] != NULL)
+ ips_table[hv]->is_phnext = &is->is_hnext;
+ else
+ ips_stats.iss_inuse++;
+ is->is_phnext = ips_table + hv;
+ is->is_hnext = ips_table[hv];
+ ips_table[hv] = is;
+ ips_stats.iss_bucketlen[hv]++;
+ ips_num++;
+ MUTEX_EXIT(&ipf_stinsert);
+
+ fr_setstatequeue(is, rev);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_addstate */
+/* Returns: ipstate_t* - NULL == failure, else pointer to new state */
+/* Parameters: fin(I) - pointer to packet information */
+/* stsave(O) - pointer to place to save pointer to created */
+/* state structure. */
+/* flags(I) - flags to use when creating the structure */
+/* */
+/* Creates a new IP state structure from the packet information collected. */
+/* Inserts it into the state table and appends to the bottom of the active */
+/* list. If the capacity of the table has reached the maximum allowed then */
+/* the call will fail and a flush is scheduled for the next timeout call. */
+/* */
+/* NOTE: The use of stsave to point to nat_state will result in memory */
+/* corruption. It should only be used to point to objects that will */
+/* either outlive this (not expired) or will deref the ip_state_t */
+/* when they are deleted. */
+/* ------------------------------------------------------------------------ */
+ipstate_t *fr_addstate(fin, stsave, flags)
+fr_info_t *fin;
+ipstate_t **stsave;
+u_int flags;
+{
+ ipstate_t *is, ips;
+ struct icmp *ic;
+ u_int pass, hv;
+ frentry_t *fr;
+ tcphdr_t *tcp;
+ grehdr_t *gre;
+ int out;
+
+ if (fr_state_lock ||
+ (fin->fin_flx & (FI_SHORT|FI_STATE|FI_FRAGBODY|FI_BAD)))
+ return NULL;
+
+ if ((fin->fin_flx & FI_OOW) && !(fin->fin_tcpf & TH_SYN))
+ return NULL;
+
+ /*
+ * If a "keep state" rule has reached the maximum number of references
+ * to it, then schedule an automatic flush in case we can clear out
+ * some "dead old wood". Note that because the lock isn't held on
+ * fr it is possible that we could overflow. The cost of overflowing
+ * is being ignored here as the number by which it can overflow is
+ * a product of the number of simultaneous threads that could be
+ * executing in here, so a limit of 100 won't result in 200, but could
+ * result in 101 or 102.
+ */
+ fr = fin->fin_fr;
+ if (fr != NULL) {
+ if ((ips_num >= fr_statemax) && (fr->fr_statemax == 0)) {
+ ATOMIC_INCL(ips_stats.iss_max);
+ fr_state_doflush = 1;
+ return NULL;
+ }
+ if ((fr->fr_statemax != 0) &&
+ (fr->fr_statecnt >= fr->fr_statemax)) {
+ ATOMIC_INCL(ips_stats.iss_maxref);
+ return NULL;
+ }
+ }
+
+ pass = (fr == NULL) ? 0 : fr->fr_flags;
+
+ ic = NULL;
+ tcp = NULL;
+ out = fin->fin_out;
+ is = &ips;
+ bzero((char *)is, sizeof(*is));
+ is->is_die = 1 + fr_ticks;
+
+ /*
+ * Copy and calculate...
+ */
+ hv = (is->is_p = fin->fin_fi.fi_p);
+ is->is_src = fin->fin_fi.fi_src;
+ hv += is->is_saddr;
+ is->is_dst = fin->fin_fi.fi_dst;
+ hv += is->is_daddr;
+#ifdef USE_INET6
+ if (fin->fin_v == 6) {
+ /*
+ * For ICMPv6, we check to see if the destination address is
+ * a multicast address. If it is, do not include it in the
+ * calculation of the hash because the correct reply will come
+ * back from a real address, not a multicast address.
+ */
+ if ((is->is_p == IPPROTO_ICMPV6) &&
+ IN6_IS_ADDR_MULTICAST(&is->is_dst.in6)) {
+ /*
+ * So you can do keep state with neighbour discovery.
+ *
+ * Here we could use the address from the neighbour
+ * solicit message to put in the state structure and
+ * we could use that without a wildcard flag too...
+ */
+ flags |= SI_W_DADDR;
+ hv -= is->is_daddr;
+ } else {
+ hv += is->is_dst.i6[1];
+ hv += is->is_dst.i6[2];
+ hv += is->is_dst.i6[3];
+ }
+ hv += is->is_src.i6[1];
+ hv += is->is_src.i6[2];
+ hv += is->is_src.i6[3];
+ }
+#endif
+
+ switch (is->is_p)
+ {
+#ifdef USE_INET6
+ case IPPROTO_ICMPV6 :
+ ic = fin->fin_dp;
+
+ switch (ic->icmp_type)
+ {
+ case ICMP6_ECHO_REQUEST :
+ is->is_icmp.ici_type = ic->icmp_type;
+ hv += (is->is_icmp.ici_id = ic->icmp_id);
+ break;
+ case ICMP6_MEMBERSHIP_QUERY :
+ case ND_ROUTER_SOLICIT :
+ case ND_NEIGHBOR_SOLICIT :
+ case ICMP6_NI_QUERY :
+ is->is_icmp.ici_type = ic->icmp_type;
+ break;
+ default :
+ return NULL;
+ }
+ ATOMIC_INCL(ips_stats.iss_icmp);
+ break;
+#endif
+ case IPPROTO_ICMP :
+ ic = fin->fin_dp;
+
+ switch (ic->icmp_type)
+ {
+ case ICMP_ECHO :
+ case ICMP_TSTAMP :
+ case ICMP_IREQ :
+ case ICMP_MASKREQ :
+ is->is_icmp.ici_type = ic->icmp_type;
+ hv += (is->is_icmp.ici_id = ic->icmp_id);
+ break;
+ default :
+ return NULL;
+ }
+ ATOMIC_INCL(ips_stats.iss_icmp);
+ break;
+
+ case IPPROTO_GRE :
+ gre = fin->fin_dp;
+
+ is->is_gre.gs_flags = gre->gr_flags;
+ is->is_gre.gs_ptype = gre->gr_ptype;
+ if (GRE_REV(is->is_gre.gs_flags) == 1) {
+ is->is_call[0] = fin->fin_data[0];
+ is->is_call[1] = fin->fin_data[1];
+ }
+ break;
+
+ case IPPROTO_TCP :
+ tcp = fin->fin_dp;
+
+ if (tcp->th_flags & TH_RST)
+ return NULL;
+ /*
+ * The endian of the ports doesn't matter, but the ack and
+ * sequence numbers do as we do mathematics on them later.
+ */
+ is->is_sport = htons(fin->fin_data[0]);
+ is->is_dport = htons(fin->fin_data[1]);
+ if ((flags & (SI_W_DPORT|SI_W_SPORT)) == 0) {
+ hv += is->is_sport;
+ hv += is->is_dport;
+ }
+
+ /*
+ * If this is a real packet then initialise fields in the
+ * state information structure from the TCP header information.
+ */
+
+ is->is_maxdwin = 1;
+ is->is_maxswin = ntohs(tcp->th_win);
+ if (is->is_maxswin == 0)
+ is->is_maxswin = 1;
+
+ if ((fin->fin_flx & FI_IGNORE) == 0) {
+ is->is_send = ntohl(tcp->th_seq) + fin->fin_dlen -
+ (TCP_OFF(tcp) << 2) +
+ ((tcp->th_flags & TH_SYN) ? 1 : 0) +
+ ((tcp->th_flags & TH_FIN) ? 1 : 0);
+ is->is_maxsend = is->is_send;
+
+ /*
+ * Window scale option is only present in
+ * SYN/SYN-ACK packet.
+ */
+ if ((tcp->th_flags & ~(TH_FIN|TH_ACK|TH_ECNALL)) ==
+ TH_SYN &&
+ (TCP_OFF(tcp) > (sizeof(tcphdr_t) >> 2))) {
+ if (fr_tcpoptions(fin, tcp,
+ &is->is_tcp.ts_data[0]) == -1) {
+ fin->fin_flx |= FI_BAD;
+ }
+ }
+
+ if ((fin->fin_out != 0) && (pass & FR_NEWISN) != 0) {
+ fr_checknewisn(fin, is);
+ fr_fixoutisn(fin, is);
+ }
+
+ if ((tcp->th_flags & TH_OPENING) == TH_SYN)
+ flags |= IS_TCPFSM;
+ else {
+ is->is_maxdwin = is->is_maxswin * 2;
+ is->is_dend = ntohl(tcp->th_ack);
+ is->is_maxdend = ntohl(tcp->th_ack);
+ is->is_maxdwin *= 2;
+ }
+ }
+
+ /*
+ * If we're creating state for a starting connection, start the
+ * timer on it as we'll never see an error if it fails to
+ * connect.
+ */
+ ATOMIC_INCL(ips_stats.iss_tcp);
+ break;
+
+ case IPPROTO_UDP :
+ tcp = fin->fin_dp;
+
+ is->is_sport = htons(fin->fin_data[0]);
+ is->is_dport = htons(fin->fin_data[1]);
+ if ((flags & (SI_W_DPORT|SI_W_SPORT)) == 0) {
+ hv += tcp->th_dport;
+ hv += tcp->th_sport;
+ }
+ ATOMIC_INCL(ips_stats.iss_udp);
+ break;
+
+ default :
+ break;
+ }
+ hv = DOUBLE_HASH(hv);
+ is->is_hv = hv;
+ is->is_rule = fr;
+ is->is_flags = flags & IS_INHERITED;
+
+ /*
+ * Look for identical state.
+ */
+ for (is = ips_table[is->is_hv % fr_statesize]; is != NULL;
+ is = is->is_hnext) {
+ if (bcmp(&ips.is_src, &is->is_src,
+ offsetof(struct ipstate, is_ps) -
+ offsetof(struct ipstate, is_src)) == 0)
+ break;
+ }
+ if (is != NULL)
+ return NULL;
+
+ if (ips_stats.iss_bucketlen[hv] >= fr_state_maxbucket) {
+ ATOMIC_INCL(ips_stats.iss_bucketfull);
+ return NULL;
+ }
+ KMALLOC(is, ipstate_t *);
+ if (is == NULL) {
+ ATOMIC_INCL(ips_stats.iss_nomem);
+ return NULL;
+ }
+ bcopy((char *)&ips, (char *)is, sizeof(*is));
+ /*
+ * Do not do the modulous here, it is done in fr_stinsert().
+ */
+ if (fr != NULL) {
+ (void) strncpy(is->is_group, fr->fr_group, FR_GROUPLEN);
+ if (fr->fr_age[0] != 0) {
+ is->is_tqehead[0] = fr_addtimeoutqueue(&ips_utqe,
+ fr->fr_age[0]);
+ is->is_sti.tqe_flags |= TQE_RULEBASED;
+ }
+ if (fr->fr_age[1] != 0) {
+ is->is_tqehead[1] = fr_addtimeoutqueue(&ips_utqe,
+ fr->fr_age[1]);
+ is->is_sti.tqe_flags |= TQE_RULEBASED;
+ }
+
+ is->is_tag = fr->fr_logtag;
+
+ /*
+ * The name '-' is special for network interfaces and causes
+ * a NULL name to be present, always, allowing packets to
+ * match it, regardless of their interface.
+ */
+ if ((fin->fin_ifp == NULL) ||
+ (fr->fr_ifnames[out << 1][0] == '-' &&
+ fr->fr_ifnames[out << 1][1] == '\0')) {
+ is->is_ifp[out << 1] = fr->fr_ifas[0];
+ strncpy(is->is_ifname[out << 1], fr->fr_ifnames[0],
+ sizeof(fr->fr_ifnames[0]));
+ } else {
+ is->is_ifp[out << 1] = fin->fin_ifp;
+ COPYIFNAME(fin->fin_ifp, is->is_ifname[out << 1]);
+ }
+
+ is->is_ifp[(out << 1) + 1] = fr->fr_ifas[1];
+ strncpy(is->is_ifname[(out << 1) + 1], fr->fr_ifnames[1],
+ sizeof(fr->fr_ifnames[1]));
+
+ is->is_ifp[(1 - out) << 1] = fr->fr_ifas[2];
+ strncpy(is->is_ifname[((1 - out) << 1)], fr->fr_ifnames[2],
+ sizeof(fr->fr_ifnames[2]));
+
+ is->is_ifp[((1 - out) << 1) + 1] = fr->fr_ifas[3];
+ strncpy(is->is_ifname[((1 - out) << 1) + 1], fr->fr_ifnames[3],
+ sizeof(fr->fr_ifnames[3]));
+ } else {
+ pass = fr_flags;
+ is->is_tag = FR_NOLOGTAG;
+
+ if (fin->fin_ifp != NULL) {
+ is->is_ifp[out << 1] = fin->fin_ifp;
+ COPYIFNAME(fin->fin_ifp, is->is_ifname[out << 1]);
+ }
+ }
+
+ /*
+ * It may seem strange to set is_ref to 2, but fr_check() will call
+ * fr_statederef() after calling fr_addstate() and the idea is to
+ * have it exist at the end of fr_check() with is_ref == 1.
+ */
+ is->is_ref = 2;
+ is->is_pass = pass;
+ is->is_pkts[0] = 0, is->is_bytes[0] = 0;
+ is->is_pkts[1] = 0, is->is_bytes[1] = 0;
+ is->is_pkts[2] = 0, is->is_bytes[2] = 0;
+ is->is_pkts[3] = 0, is->is_bytes[3] = 0;
+ if ((fin->fin_flx & FI_IGNORE) == 0) {
+ is->is_pkts[out] = 1;
+ is->is_bytes[out] = fin->fin_plen;
+ is->is_flx[out][0] = fin->fin_flx & FI_CMP;
+ is->is_flx[out][0] &= ~FI_OOW;
+ }
+
+ if (pass & FR_STSTRICT)
+ is->is_flags |= IS_STRICT;
+
+ if (pass & FR_STATESYNC)
+ is->is_flags |= IS_STATESYNC;
+
+ /*
+ * We want to check everything that is a property of this packet,
+ * but we don't (automatically) care about it's fragment status as
+ * this may change.
+ */
+ is->is_v = fin->fin_v;
+ is->is_opt[0] = fin->fin_optmsk;
+ is->is_optmsk[0] = 0xffffffff;
+ is->is_optmsk[1] = 0xffffffff;
+ if (is->is_v == 6) {
+ is->is_opt[0] &= ~0x8;
+ is->is_optmsk[0] &= ~0x8;
+ is->is_optmsk[1] &= ~0x8;
+ }
+ is->is_me = stsave;
+ is->is_sec = fin->fin_secmsk;
+ is->is_secmsk = 0xffff;
+ is->is_auth = fin->fin_auth;
+ is->is_authmsk = 0xffff;
+ if (flags & (SI_WILDP|SI_WILDA)) {
+ ATOMIC_INCL(ips_stats.iss_wild);
+ }
+ is->is_rulen = fin->fin_rule;
+
+
+ if (pass & FR_LOGFIRST)
+ is->is_pass &= ~(FR_LOGFIRST|FR_LOG);
+
+ READ_ENTER(&ipf_state);
+
+ fr_stinsert(is, fin->fin_rev);
+
+ if (fin->fin_p == IPPROTO_TCP) {
+ /*
+ * If we're creating state for a starting connection, start the
+ * timer on it as we'll never see an error if it fails to
+ * connect.
+ */
+ (void) fr_tcp_age(&is->is_sti, fin, ips_tqtqb, is->is_flags);
+ MUTEX_EXIT(&is->is_lock);
+#ifdef IPFILTER_SCAN
+ if ((is->is_flags & SI_CLONE) == 0)
+ (void) ipsc_attachis(is);
+#endif
+ } else {
+ MUTEX_EXIT(&is->is_lock);
+ }
+#ifdef IPFILTER_SYNC
+ if ((is->is_flags & IS_STATESYNC) && ((is->is_flags & SI_CLONE) == 0))
+ is->is_sync = ipfsync_new(SMC_STATE, fin, is);
+#endif
+ if (ipstate_logging)
+ ipstate_log(is, ISL_NEW);
+
+ RWLOCK_EXIT(&ipf_state);
+ fin->fin_state = is;
+ fin->fin_rev = IP6_NEQ(&is->is_dst, &fin->fin_daddr);
+ fin->fin_flx |= FI_STATE;
+ if (fin->fin_flx & FI_FRAG)
+ (void) fr_newfrag(fin, pass ^ FR_KEEPSTATE);
+
+ return is;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_tcpoptions */
+/* Returns: int - 1 == packet matches state entry, 0 == it does not, */
+/* -1 == packet has bad TCP options data */
+/* Parameters: fin(I) - pointer to packet information */
+/* tcp(I) - pointer to TCP packet header */
+/* td(I) - pointer to TCP data held as part of the state */
+/* */
+/* Look after the TCP header for any options and deal with those that are */
+/* present. Record details about those that we recogise. */
+/* ------------------------------------------------------------------------ */
+static int fr_tcpoptions(fin, tcp, td)
+fr_info_t *fin;
+tcphdr_t *tcp;
+tcpdata_t *td;
+{
+ int off, mlen, ol, i, len, retval;
+ char buf[64], *s, opt;
+ mb_t *m = NULL;
+
+ len = (TCP_OFF(tcp) << 2);
+ if (fin->fin_dlen < len)
+ return 0;
+ len -= sizeof(*tcp);
+
+ off = fin->fin_plen - fin->fin_dlen + sizeof(*tcp) + fin->fin_ipoff;
+
+ m = fin->fin_m;
+ mlen = MSGDSIZE(m) - off;
+ if (len > mlen) {
+ len = mlen;
+ retval = 0;
+ } else {
+ retval = 1;
+ }
+
+ COPYDATA(m, off, len, buf);
+
+ for (s = buf; len > 0; ) {
+ opt = *s;
+ if (opt == TCPOPT_EOL)
+ break;
+ else if (opt == TCPOPT_NOP)
+ ol = 1;
+ else {
+ if (len < 2)
+ break;
+ ol = (int)*(s + 1);
+ if (ol < 2 || ol > len)
+ break;
+
+ /*
+ * Extract the TCP options we are interested in out of
+ * the header and store them in the the tcpdata struct.
+ */
+ switch (opt)
+ {
+ case TCPOPT_WINDOW :
+ if (ol == TCPOLEN_WINDOW) {
+ i = (int)*(s + 2);
+ if (i > TCP_WSCALE_MAX)
+ i = TCP_WSCALE_MAX;
+ else if (i < 0)
+ i = 0;
+ td->td_winscale = i;
+ td->td_winflags |= TCP_WSCALE_SEEN|
+ TCP_WSCALE_FIRST;
+ } else
+ retval = -1;
+ break;
+ case TCPOPT_MAXSEG :
+ /*
+ * So, if we wanted to set the TCP MAXSEG,
+ * it should be done here...
+ */
+ if (ol == TCPOLEN_MAXSEG) {
+ i = (int)*(s + 2);
+ i <<= 8;
+ i += (int)*(s + 3);
+ td->td_maxseg = i;
+ } else
+ retval = -1;
+ break;
+ case TCPOPT_SACK_PERMITTED :
+ if (ol == TCPOLEN_SACK_PERMITTED)
+ td->td_winflags |= TCP_SACK_PERMIT;
+ else
+ retval = -1;
+ break;
+ }
+ }
+ len -= ol;
+ s += ol;
+ }
+ return retval;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_tcpstate */
+/* Returns: int - 1 == packet matches state entry, 0 == it does not */
+/* Parameters: fin(I) - pointer to packet information */
+/* tcp(I) - pointer to TCP packet header */
+/* is(I) - pointer to master state structure */
+/* */
+/* Check to see if a packet with TCP headers fits within the TCP window. */
+/* Change timeout depending on whether new packet is a SYN-ACK returning */
+/* for a SYN or a RST or FIN which indicate time to close up shop. */
+/* ------------------------------------------------------------------------ */
+static int fr_tcpstate(fin, tcp, is)
+fr_info_t *fin;
+tcphdr_t *tcp;
+ipstate_t *is;
+{
+ int source, ret = 0, flags;
+ tcpdata_t *fdata, *tdata;
+
+ source = !fin->fin_rev;
+ if (((is->is_flags & IS_TCPFSM) != 0) && (source == 1) &&
+ (ntohs(is->is_sport) != fin->fin_data[0]))
+ source = 0;
+ fdata = &is->is_tcp.ts_data[!source];
+ tdata = &is->is_tcp.ts_data[source];
+
+ MUTEX_ENTER(&is->is_lock);
+
+ /*
+ * If a SYN packet is received for a connection that is on the way out
+ * but hasn't yet departed then advance this session along the way.
+ */
+ if ((tcp->th_flags & TH_OPENING) == TH_SYN) {
+ if ((is->is_state[0] > IPF_TCPS_ESTABLISHED) &&
+ (is->is_state[1] > IPF_TCPS_ESTABLISHED)) {
+ is->is_state[!source] = IPF_TCPS_CLOSED;
+ fr_movequeue(&is->is_sti, is->is_sti.tqe_ifq,
+ &ips_deletetq);
+ MUTEX_ENTER(&is->is_lock);
+ return 0;
+ }
+ }
+
+ if (fr_tcpinwindow(fin, fdata, tdata, tcp, is->is_flags)) {
+#ifdef IPFILTER_SCAN
+ if (is->is_flags & (IS_SC_CLIENT|IS_SC_SERVER)) {
+ ipsc_packet(fin, is);
+ if (FR_ISBLOCK(is->is_pass)) {
+ MUTEX_EXIT(&is->is_lock);
+ return 1;
+ }
+ }
+#endif
+
+ /*
+ * Nearing end of connection, start timeout.
+ */
+ ret = fr_tcp_age(&is->is_sti, fin, ips_tqtqb, is->is_flags);
+ if (ret == 0) {
+ MUTEX_EXIT(&is->is_lock);
+ return 0;
+ }
+
+ /*
+ * set s0's as appropriate. Use syn-ack packet as it
+ * contains both pieces of required information.
+ */
+ /*
+ * Window scale option is only present in SYN/SYN-ACK packet.
+ * Compare with ~TH_FIN to mask out T/TCP setups.
+ */
+ flags = tcp->th_flags & ~(TH_FIN|TH_ECNALL);
+ if (flags == (TH_SYN|TH_ACK)) {
+ is->is_s0[source] = ntohl(tcp->th_ack);
+ is->is_s0[!source] = ntohl(tcp->th_seq) + 1;
+ if ((TCP_OFF(tcp) > (sizeof(tcphdr_t) >> 2))) {
+ if (fr_tcpoptions(fin, tcp, fdata) == -1)
+ fin->fin_flx |= FI_BAD;
+ }
+ if ((fin->fin_out != 0) && (is->is_pass & FR_NEWISN))
+ fr_checknewisn(fin, is);
+ } else if (flags == TH_SYN) {
+ is->is_s0[source] = ntohl(tcp->th_seq) + 1;
+ if ((TCP_OFF(tcp) > (sizeof(tcphdr_t) >> 2))) {
+ if (fr_tcpoptions(fin, tcp, fdata) == -1)
+ fin->fin_flx |= FI_BAD;
+ }
+
+ if ((fin->fin_out != 0) && (is->is_pass & FR_NEWISN))
+ fr_checknewisn(fin, is);
+
+ }
+ ret = 1;
+ } else {
+ fin->fin_flx |= FI_OOW;
+ }
+ MUTEX_EXIT(&is->is_lock);
+ return ret;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_checknewisn */
+/* Returns: Nil */
+/* Parameters: fin(I) - pointer to packet information */
+/* is(I) - pointer to master state structure */
+/* */
+/* Check to see if this TCP connection is expecting and needs a new */
+/* sequence number for a particular direction of the connection. */
+/* */
+/* NOTE: This does not actually change the sequence numbers, only gets new */
+/* one ready. */
+/* ------------------------------------------------------------------------ */
+static void fr_checknewisn(fin, is)
+fr_info_t *fin;
+ipstate_t *is;
+{
+ u_32_t sumd, old, new;
+ tcphdr_t *tcp;
+ int i;
+
+ i = fin->fin_rev;
+ tcp = fin->fin_dp;
+
+ if (((i == 0) && !(is->is_flags & IS_ISNSYN)) ||
+ ((i == 1) && !(is->is_flags & IS_ISNACK))) {
+ old = ntohl(tcp->th_seq);
+ new = fr_newisn(fin);
+ is->is_isninc[i] = new - old;
+ CALC_SUMD(old, new, sumd);
+ is->is_sumd[i] = (sumd & 0xffff) + (sumd >> 16);
+
+ is->is_flags |= ((i == 0) ? IS_ISNSYN : IS_ISNACK);
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_tcpinwindow */
+/* Returns: int - 1 == packet inside TCP "window", 0 == not inside. */
+/* Parameters: fin(I) - pointer to packet information */
+/* fdata(I) - pointer to tcp state informatio (forward) */
+/* tdata(I) - pointer to tcp state informatio (reverse) */
+/* tcp(I) - pointer to TCP packet header */
+/* */
+/* Given a packet has matched addresses and ports, check to see if it is */
+/* within the TCP data window. In a show of generosity, allow packets that */
+/* are within the window space behind the current sequence # as well. */
+/* ------------------------------------------------------------------------ */
+int fr_tcpinwindow(fin, fdata, tdata, tcp, flags)
+fr_info_t *fin;
+tcpdata_t *fdata, *tdata;
+tcphdr_t *tcp;
+int flags;
+{
+ tcp_seq seq, ack, end;
+ int ackskew, tcpflags;
+ u_32_t win, maxwin;
+ int dsize, inseq;
+
+ /*
+ * Find difference between last checked packet and this packet.
+ */
+ tcpflags = tcp->th_flags;
+ seq = ntohl(tcp->th_seq);
+ ack = ntohl(tcp->th_ack);
+ if (tcpflags & TH_SYN)
+ win = ntohs(tcp->th_win);
+ else
+ win = ntohs(tcp->th_win) << fdata->td_winscale;
+
+ /*
+ * A window of 0 produces undesirable behaviour from this function.
+ */
+ if (win == 0)
+ win = 1;
+
+ dsize = fin->fin_dlen - (TCP_OFF(tcp) << 2) +
+ ((tcpflags & TH_SYN) ? 1 : 0) + ((tcpflags & TH_FIN) ? 1 : 0);
+
+ /*
+ * if window scaling is present, the scaling is only allowed
+ * for windows not in the first SYN packet. In that packet the
+ * window is 65535 to specify the largest window possible
+ * for receivers not implementing the window scale option.
+ * Currently, we do not assume TTCP here. That means that
+ * if we see a second packet from a host (after the initial
+ * SYN), we can assume that the receiver of the SYN did
+ * already send back the SYN/ACK (and thus that we know if
+ * the receiver also does window scaling)
+ */
+ if (!(tcpflags & TH_SYN) && (fdata->td_winflags & TCP_WSCALE_FIRST)) {
+ fdata->td_winflags &= ~TCP_WSCALE_FIRST;
+ fdata->td_maxwin = win;
+ }
+
+ end = seq + dsize;
+
+ if ((fdata->td_end == 0) &&
+ (!(flags & IS_TCPFSM) ||
+ ((tcpflags & TH_OPENING) == TH_OPENING))) {
+ /*
+ * Must be a (outgoing) SYN-ACK in reply to a SYN.
+ */
+ fdata->td_end = end - 1;
+ fdata->td_maxwin = 1;
+ fdata->td_maxend = end + win;
+ }
+
+ if (!(tcpflags & TH_ACK)) { /* Pretend an ack was sent */
+ ack = tdata->td_end;
+ } else if (((tcpflags & (TH_ACK|TH_RST)) == (TH_ACK|TH_RST)) &&
+ (ack == 0)) {
+ /* gross hack to get around certain broken tcp stacks */
+ ack = tdata->td_end;
+ }
+
+ maxwin = tdata->td_maxwin;
+ ackskew = tdata->td_end - ack;
+
+ /*
+ * Strict sequencing only allows in-order delivery.
+ */
+ if ((flags & IS_STRICT) != 0) {
+ if (seq != fdata->td_end) {
+ return 0;
+ }
+ }
+
+#define SEQ_GE(a,b) ((int)((a) - (b)) >= 0)
+#define SEQ_GT(a,b) ((int)((a) - (b)) > 0)
+ inseq = 0;
+ if ((SEQ_GE(fdata->td_maxend, end)) &&
+ (SEQ_GE(seq, fdata->td_end - maxwin)) &&
+/* XXX what about big packets */
+#define MAXACKWINDOW 66000
+ (-ackskew <= (MAXACKWINDOW)) &&
+ ( ackskew <= (MAXACKWINDOW << fdata->td_winscale))) {
+ inseq = 1;
+ /*
+ * Microsoft Windows will send the next packet to the right of the
+ * window if SACK is in use.
+ */
+ } else if ((seq == fdata->td_maxend) && (ackskew == 0) &&
+ (fdata->td_winflags & TCP_SACK_PERMIT) &&
+ (tdata->td_winflags & TCP_SACK_PERMIT)) {
+ inseq = 1;
+ /*
+ * Sometimes a TCP RST will be generated with only the ACK field
+ * set to non-zero.
+ */
+ } else if ((seq == 0) && (tcpflags == (TH_RST|TH_ACK)) &&
+ (ackskew >= -1) && (ackskew <= 1)) {
+ inseq = 1;
+ } else if (!(flags & IS_TCPFSM)) {
+ int i;
+
+ i = (fin->fin_rev << 1) + fin->fin_out;
+
+#if 0
+ if (is_pkts[i]0 == 0) {
+ /*
+ * Picking up a connection in the middle, the "next"
+ * packet seen from a direction that is new should be
+ * accepted, even if it appears out of sequence.
+ */
+ inseq = 1;
+ } else
+#endif
+ if (!(fdata->td_winflags &
+ (TCP_WSCALE_SEEN|TCP_WSCALE_FIRST))) {
+ /*
+ * No TCPFSM and no window scaling, so make some
+ * extra guesses.
+ */
+ if ((seq == fdata->td_maxend) && (ackskew == 0))
+ inseq = 1;
+ else if (SEQ_GE(seq + maxwin, fdata->td_end - maxwin))
+ inseq = 1;
+ }
+ }
+
+ /* TRACE(inseq, fdata, tdata, seq, end, ack, ackskew, win, maxwin) */
+
+ if (inseq) {
+ /* if ackskew < 0 then this should be due to fragmented
+ * packets. There is no way to know the length of the
+ * total packet in advance.
+ * We do know the total length from the fragment cache though.
+ * Note however that there might be more sessions with
+ * exactly the same source and destination parameters in the
+ * state cache (and source and destination is the only stuff
+ * that is saved in the fragment cache). Note further that
+ * some TCP connections in the state cache are hashed with
+ * sport and dport as well which makes it not worthwhile to
+ * look for them.
+ * Thus, when ackskew is negative but still seems to belong
+ * to this session, we bump up the destinations end value.
+ */
+ if (ackskew < 0)
+ tdata->td_end = ack;
+
+ /* update max window seen */
+ if (fdata->td_maxwin < win)
+ fdata->td_maxwin = win;
+ if (SEQ_GT(end, fdata->td_end))
+ fdata->td_end = end;
+ if (SEQ_GE(ack + win, tdata->td_maxend))
+ tdata->td_maxend = ack + win;
+ return 1;
+ }
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_stclone */
+/* Returns: ipstate_t* - NULL == cloning failed, */
+/* else pointer to new state structure */
+/* Parameters: fin(I) - pointer to packet information */
+/* tcp(I) - pointer to TCP/UDP header */
+/* is(I) - pointer to master state structure */
+/* */
+/* Create a "duplcate" state table entry from the master. */
+/* ------------------------------------------------------------------------ */
+static ipstate_t *fr_stclone(fin, tcp, is)
+fr_info_t *fin;
+tcphdr_t *tcp;
+ipstate_t *is;
+{
+ ipstate_t *clone;
+ u_32_t send;
+
+ if (ips_num == fr_statemax) {
+ ATOMIC_INCL(ips_stats.iss_max);
+ fr_state_doflush = 1;
+ return NULL;
+ }
+ KMALLOC(clone, ipstate_t *);
+ if (clone == NULL)
+ return NULL;
+ bcopy((char *)is, (char *)clone, sizeof(*clone));
+
+ MUTEX_NUKE(&clone->is_lock);
+
+ clone->is_die = ONE_DAY + fr_ticks;
+ clone->is_state[0] = 0;
+ clone->is_state[1] = 0;
+ send = ntohl(tcp->th_seq) + fin->fin_dlen - (TCP_OFF(tcp) << 2) +
+ ((tcp->th_flags & TH_SYN) ? 1 : 0) +
+ ((tcp->th_flags & TH_FIN) ? 1 : 0);
+
+ if (fin->fin_rev == 1) {
+ clone->is_dend = send;
+ clone->is_maxdend = send;
+ clone->is_send = 0;
+ clone->is_maxswin = 1;
+ clone->is_maxdwin = ntohs(tcp->th_win);
+ if (clone->is_maxdwin == 0)
+ clone->is_maxdwin = 1;
+ } else {
+ clone->is_send = send;
+ clone->is_maxsend = send;
+ clone->is_dend = 0;
+ clone->is_maxdwin = 1;
+ clone->is_maxswin = ntohs(tcp->th_win);
+ if (clone->is_maxswin == 0)
+ clone->is_maxswin = 1;
+ }
+
+ clone->is_flags &= ~SI_CLONE;
+ clone->is_flags |= SI_CLONED;
+ fr_stinsert(clone, fin->fin_rev);
+ clone->is_ref = 2;
+ if (clone->is_p == IPPROTO_TCP) {
+ (void) fr_tcp_age(&clone->is_sti, fin, ips_tqtqb,
+ clone->is_flags);
+ }
+ MUTEX_EXIT(&clone->is_lock);
+#ifdef IPFILTER_SCAN
+ (void) ipsc_attachis(is);
+#endif
+#ifdef IPFILTER_SYNC
+ if (is->is_flags & IS_STATESYNC)
+ clone->is_sync = ipfsync_new(SMC_STATE, fin, clone);
+#endif
+ return clone;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_matchsrcdst */
+/* Returns: Nil */
+/* Parameters: fin(I) - pointer to packet information */
+/* is(I) - pointer to state structure */
+/* src(I) - pointer to source address */
+/* dst(I) - pointer to destination address */
+/* tcp(I) - pointer to TCP/UDP header */
+/* */
+/* Match a state table entry against an IP packet. The logic below is that */
+/* ret gets set to one if the match succeeds, else remains 0. If it is */
+/* still 0 after the test. no match. */
+/* ------------------------------------------------------------------------ */
+static ipstate_t *fr_matchsrcdst(fin, is, src, dst, tcp, cmask)
+fr_info_t *fin;
+ipstate_t *is;
+i6addr_t *src, *dst;
+tcphdr_t *tcp;
+u_32_t cmask;
+{
+ int ret = 0, rev, out, flags, flx = 0, idx;
+ u_short sp, dp;
+ u_32_t cflx;
+ void *ifp;
+
+ rev = IP6_NEQ(&is->is_dst, dst);
+ ifp = fin->fin_ifp;
+ out = fin->fin_out;
+ flags = is->is_flags;
+ sp = 0;
+ dp = 0;
+
+ if (tcp != NULL) {
+ sp = htons(fin->fin_sport);
+ dp = ntohs(fin->fin_dport);
+ }
+ if (!rev) {
+ if (tcp != NULL) {
+ if (!(flags & SI_W_SPORT) && (sp != is->is_sport))
+ rev = 1;
+ else if (!(flags & SI_W_DPORT) && (dp != is->is_dport))
+ rev = 1;
+ }
+ }
+
+ idx = (out << 1) + rev;
+
+ /*
+ * If the interface for this 'direction' is set, make sure it matches.
+ * An interface name that is not set matches any, as does a name of *.
+ */
+ if ((is->is_ifp[idx] == ifp) || (is->is_ifp[idx] == NULL &&
+ (*is->is_ifname[idx] == '\0' || *is->is_ifname[idx] == '-' ||
+ *is->is_ifname[idx] == '*')))
+ ret = 1;
+
+ if (ret == 0)
+ return NULL;
+ ret = 0;
+
+ /*
+ * Match addresses and ports.
+ */
+ if (rev == 0) {
+ if ((IP6_EQ(&is->is_dst, dst) || (flags & SI_W_DADDR)) &&
+ (IP6_EQ(&is->is_src, src) || (flags & SI_W_SADDR))) {
+ if (tcp) {
+ if ((sp == is->is_sport || flags & SI_W_SPORT)&&
+ (dp == is->is_dport || flags & SI_W_DPORT))
+ ret = 1;
+ } else {
+ ret = 1;
+ }
+ }
+ } else {
+ if ((IP6_EQ(&is->is_dst, src) || (flags & SI_W_DADDR)) &&
+ (IP6_EQ(&is->is_src, dst) || (flags & SI_W_SADDR))) {
+ if (tcp) {
+ if ((dp == is->is_sport || flags & SI_W_SPORT)&&
+ (sp == is->is_dport || flags & SI_W_DPORT))
+ ret = 1;
+ } else {
+ ret = 1;
+ }
+ }
+ }
+
+ if (ret == 0)
+ return NULL;
+
+ /*
+ * Whether or not this should be here, is questionable, but the aim
+ * is to get this out of the main line.
+ */
+ if (tcp == NULL)
+ flags = is->is_flags & ~(SI_WILDP|SI_NEWFR|SI_CLONE|SI_CLONED);
+
+ /*
+ * Only one of the source or destination address can be flaged as a
+ * wildcard. Fill in the missing address, if set.
+ * For IPv6, if the address being copied in is multicast, then
+ * don't reset the wild flag - multicast causes it to be set in the
+ * first place!
+ */
+ if ((flags & (SI_W_SADDR|SI_W_DADDR))) {
+ fr_ip_t *fi = &fin->fin_fi;
+
+ if ((flags & SI_W_SADDR) != 0) {
+ if (rev == 0) {
+#ifdef USE_INET6
+ if (is->is_v == 6 &&
+ IN6_IS_ADDR_MULTICAST(&fi->fi_src.in6))
+ /*EMPTY*/;
+ else
+#endif
+ {
+ is->is_src = fi->fi_src;
+ is->is_flags &= ~SI_W_SADDR;
+ }
+ } else {
+#ifdef USE_INET6
+ if (is->is_v == 6 &&
+ IN6_IS_ADDR_MULTICAST(&fi->fi_dst.in6))
+ /*EMPTY*/;
+ else
+#endif
+ {
+ is->is_src = fi->fi_dst;
+ is->is_flags &= ~SI_W_SADDR;
+ }
+ }
+ } else if ((flags & SI_W_DADDR) != 0) {
+ if (rev == 0) {
+#ifdef USE_INET6
+ if (is->is_v == 6 &&
+ IN6_IS_ADDR_MULTICAST(&fi->fi_dst.in6))
+ /*EMPTY*/;
+ else
+#endif
+ {
+ is->is_dst = fi->fi_dst;
+ is->is_flags &= ~SI_W_DADDR;
+ }
+ } else {
+#ifdef USE_INET6
+ if (is->is_v == 6 &&
+ IN6_IS_ADDR_MULTICAST(&fi->fi_src.in6))
+ /*EMPTY*/;
+ else
+#endif
+ {
+ is->is_dst = fi->fi_src;
+ is->is_flags &= ~SI_W_DADDR;
+ }
+ }
+ }
+ if ((is->is_flags & (SI_WILDA|SI_WILDP)) == 0) {
+ ATOMIC_DECL(ips_stats.iss_wild);
+ }
+ }
+
+ flx = fin->fin_flx & cmask;
+ cflx = is->is_flx[out][rev];
+
+ /*
+ * Match up any flags set from IP options.
+ */
+ if ((cflx && (flx != (cflx & cmask))) ||
+ ((fin->fin_optmsk & is->is_optmsk[rev]) != is->is_opt[rev]) ||
+ ((fin->fin_secmsk & is->is_secmsk) != is->is_sec) ||
+ ((fin->fin_auth & is->is_authmsk) != is->is_auth))
+ return NULL;
+
+ /*
+ * Only one of the source or destination port can be flagged as a
+ * wildcard. When filling it in, fill in a copy of the matched entry
+ * if it has the cloning flag set.
+ */
+ if ((fin->fin_flx & FI_IGNORE) != 0) {
+ fin->fin_rev = rev;
+ return is;
+ }
+
+ if ((flags & (SI_W_SPORT|SI_W_DPORT))) {
+ if ((flags & SI_CLONE) != 0) {
+ ipstate_t *clone;
+
+ clone = fr_stclone(fin, tcp, is);
+ if (clone == NULL)
+ return NULL;
+ is = clone;
+ } else {
+ ATOMIC_DECL(ips_stats.iss_wild);
+ }
+
+ if ((flags & SI_W_SPORT) != 0) {
+ if (rev == 0) {
+ is->is_sport = sp;
+ is->is_send = ntohl(tcp->th_seq);
+ } else {
+ is->is_sport = dp;
+ is->is_send = ntohl(tcp->th_ack);
+ }
+ is->is_maxsend = is->is_send + 1;
+ } else if ((flags & SI_W_DPORT) != 0) {
+ if (rev == 0) {
+ is->is_dport = dp;
+ is->is_dend = ntohl(tcp->th_ack);
+ } else {
+ is->is_dport = sp;
+ is->is_dend = ntohl(tcp->th_seq);
+ }
+ is->is_maxdend = is->is_dend + 1;
+ }
+ is->is_flags &= ~(SI_W_SPORT|SI_W_DPORT);
+ if ((flags & SI_CLONED) && ipstate_logging)
+ ipstate_log(is, ISL_CLONE);
+ }
+
+ ret = -1;
+
+ if (is->is_flx[out][rev] == 0) {
+ is->is_flx[out][rev] = flx;
+ is->is_opt[rev] = fin->fin_optmsk;
+ if (is->is_v == 6) {
+ is->is_opt[rev] &= ~0x8;
+ is->is_optmsk[rev] &= ~0x8;
+ }
+ }
+
+ /*
+ * Check if the interface name for this "direction" is set and if not,
+ * fill it in.
+ */
+ if (is->is_ifp[idx] == NULL &&
+ (*is->is_ifname[idx] == '\0' || *is->is_ifname[idx] == '*')) {
+ is->is_ifp[idx] = ifp;
+ COPYIFNAME(ifp, is->is_ifname[idx]);
+ }
+ fin->fin_rev = rev;
+ return is;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_checkicmpmatchingstate */
+/* Returns: Nil */
+/* Parameters: fin(I) - pointer to packet information */
+/* */
+/* If we've got an ICMP error message, using the information stored in the */
+/* ICMP packet, look for a matching state table entry. */
+/* */
+/* If we return NULL then no lock on ipf_state is held. */
+/* If we return non-null then a read-lock on ipf_state is held. */
+/* ------------------------------------------------------------------------ */
+static ipstate_t *fr_checkicmpmatchingstate(fin)
+fr_info_t *fin;
+{
+ ipstate_t *is, **isp;
+ u_short sport, dport;
+ u_char pr;
+ int backward, i, oi;
+ i6addr_t dst, src;
+ struct icmp *ic;
+ u_short savelen;
+ icmphdr_t *icmp;
+ fr_info_t ofin;
+ tcphdr_t *tcp;
+ int type, len;
+ ip_t *oip;
+ u_int hv;
+
+ /*
+ * Does it at least have the return (basic) IP header ?
+ * Is it an actual recognised ICMP error type?
+ * Only a basic IP header (no options) should be with
+ * an ICMP error header.
+ */
+ if ((fin->fin_v != 4) || (fin->fin_hlen != sizeof(ip_t)) ||
+ (fin->fin_plen < ICMPERR_MINPKTLEN) ||
+ !(fin->fin_flx & FI_ICMPERR))
+ return NULL;
+ ic = fin->fin_dp;
+ type = ic->icmp_type;
+
+ oip = (ip_t *)((char *)ic + ICMPERR_ICMPHLEN);
+ /*
+ * Check if the at least the old IP header (with options) and
+ * 8 bytes of payload is present.
+ */
+ if (fin->fin_plen < ICMPERR_MAXPKTLEN + ((IP_HL(oip) - 5) << 2))
+ return NULL;
+
+ /*
+ * Sanity Checks.
+ */
+ len = fin->fin_dlen - ICMPERR_ICMPHLEN;
+ if ((len <= 0) || ((IP_HL(oip) << 2) > len))
+ return NULL;
+
+ /*
+ * Is the buffer big enough for all of it ? It's the size of the IP
+ * header claimed in the encapsulated part which is of concern. It
+ * may be too big to be in this buffer but not so big that it's
+ * outside the ICMP packet, leading to TCP deref's causing problems.
+ * This is possible because we don't know how big oip_hl is when we
+ * do the pullup early in fr_check() and thus can't guarantee it is
+ * all here now.
+ */
+#ifdef _KERNEL
+ {
+ mb_t *m;
+
+ m = fin->fin_m;
+# if defined(MENTAT)
+ if ((char *)oip + len > (char *)m->b_wptr)
+ return NULL;
+# else
+ if ((char *)oip + len > (char *)fin->fin_ip + m->m_len)
+ return NULL;
+# endif
+ }
+#endif
+ bcopy((char *)fin, (char *)&ofin, sizeof(*fin));
+
+ /*
+ * in the IPv4 case we must zero the i6addr union otherwise
+ * the IP6_EQ and IP6_NEQ macros produce the wrong results because
+ * of the 'junk' in the unused part of the union
+ */
+ bzero((char *)&src, sizeof(src));
+ bzero((char *)&dst, sizeof(dst));
+
+ /*
+ * we make an fin entry to be able to feed it to
+ * matchsrcdst note that not all fields are encessary
+ * but this is the cleanest way. Note further we fill
+ * in fin_mp such that if someone uses it we'll get
+ * a kernel panic. fr_matchsrcdst does not use this.
+ *
+ * watch out here, as ip is in host order and oip in network
+ * order. Any change we make must be undone afterwards, like
+ * oip->ip_off - it is still in network byte order so fix it.
+ */
+ savelen = oip->ip_len;
+ oip->ip_len = len;
+ oip->ip_off = ntohs(oip->ip_off);
+
+ ofin.fin_flx = FI_NOCKSUM;
+ ofin.fin_v = 4;
+ ofin.fin_ip = oip;
+ ofin.fin_m = NULL; /* if dereferenced, panic XXX */
+ ofin.fin_mp = NULL; /* if dereferenced, panic XXX */
+ (void) fr_makefrip(IP_HL(oip) << 2, oip, &ofin);
+ ofin.fin_ifp = fin->fin_ifp;
+ ofin.fin_out = !fin->fin_out;
+ /*
+ * Reset the short and bad flag here because in fr_matchsrcdst()
+ * the flags for the current packet (fin_flx) are compared against
+ * those for the existing session.
+ */
+ ofin.fin_flx &= ~(FI_BAD|FI_SHORT);
+
+ /*
+ * Put old values of ip_len and ip_off back as we don't know
+ * if we have to forward the packet (or process it again.
+ */
+ oip->ip_len = savelen;
+ oip->ip_off = htons(oip->ip_off);
+
+ switch (oip->ip_p)
+ {
+ case IPPROTO_ICMP :
+ /*
+ * an ICMP error can only be generated as a result of an
+ * ICMP query, not as the response on an ICMP error
+ *
+ * XXX theoretically ICMP_ECHOREP and the other reply's are
+ * ICMP query's as well, but adding them here seems strange XXX
+ */
+ if ((ofin.fin_flx & FI_ICMPERR) != 0)
+ return NULL;
+
+ /*
+ * perform a lookup of the ICMP packet in the state table
+ */
+ icmp = (icmphdr_t *)((char *)oip + (IP_HL(oip) << 2));
+ hv = (pr = oip->ip_p);
+ src.in4 = oip->ip_src;
+ hv += src.in4.s_addr;
+ dst.in4 = oip->ip_dst;
+ hv += dst.in4.s_addr;
+ hv += icmp->icmp_id;
+ hv = DOUBLE_HASH(hv);
+
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hv]; ((is = *isp) != NULL); ) {
+ isp = &is->is_hnext;
+ if ((is->is_p != pr) || (is->is_v != 4))
+ continue;
+ if (is->is_pass & FR_NOICMPERR)
+ continue;
+ is = fr_matchsrcdst(&ofin, is, &src, &dst,
+ NULL, FI_ICMPCMP);
+ if (is != NULL) {
+ /*
+ * i : the index of this packet (the icmp
+ * unreachable)
+ * oi : the index of the original packet found
+ * in the icmp header (i.e. the packet
+ * causing this icmp)
+ * backward : original packet was backward
+ * compared to the state
+ */
+ backward = IP6_NEQ(&is->is_src, &src);
+ fin->fin_rev = !backward;
+ i = (!backward << 1) + fin->fin_out;
+ oi = (backward << 1) + ofin.fin_out;
+ if (is->is_icmppkts[i] > is->is_pkts[oi])
+ continue;
+ ips_stats.iss_hits++;
+ is->is_icmppkts[i]++;
+ return is;
+ }
+ }
+ RWLOCK_EXIT(&ipf_state);
+ return NULL;
+ case IPPROTO_TCP :
+ case IPPROTO_UDP :
+ break;
+ default :
+ return NULL;
+ }
+
+ tcp = (tcphdr_t *)((char *)oip + (IP_HL(oip) << 2));
+ dport = tcp->th_dport;
+ sport = tcp->th_sport;
+
+ hv = (pr = oip->ip_p);
+ src.in4 = oip->ip_src;
+ hv += src.in4.s_addr;
+ dst.in4 = oip->ip_dst;
+ hv += dst.in4.s_addr;
+ hv += dport;
+ hv += sport;
+ hv = DOUBLE_HASH(hv);
+
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hv]; ((is = *isp) != NULL); ) {
+ isp = &is->is_hnext;
+ /*
+ * Only allow this icmp though if the
+ * encapsulated packet was allowed through the
+ * other way around. Note that the minimal amount
+ * of info present does not allow for checking against
+ * tcp internals such as seq and ack numbers. Only the
+ * ports are known to be present and can be even if the
+ * short flag is set.
+ */
+ if ((is->is_p == pr) && (is->is_v == 4) &&
+ (is = fr_matchsrcdst(&ofin, is, &src, &dst,
+ tcp, FI_ICMPCMP))) {
+ /*
+ * i : the index of this packet (the icmp unreachable)
+ * oi : the index of the original packet found in the
+ * icmp header (i.e. the packet causing this icmp)
+ * backward : original packet was backward compared to
+ * the state
+ */
+ backward = IP6_NEQ(&is->is_src, &src);
+ fin->fin_rev = !backward;
+ i = (!backward << 1) + fin->fin_out;
+ oi = (backward << 1) + ofin.fin_out;
+
+ if (((is->is_pass & FR_NOICMPERR) != 0) ||
+ (is->is_icmppkts[i] > is->is_pkts[oi]))
+ break;
+ ips_stats.iss_hits++;
+ is->is_icmppkts[i]++;
+ /*
+ * we deliberately do not touch the timeouts
+ * for the accompanying state table entry.
+ * It remains to be seen if that is correct. XXX
+ */
+ return is;
+ }
+ }
+ RWLOCK_EXIT(&ipf_state);
+ return NULL;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_ipsmove */
+/* Returns: Nil */
+/* Parameters: is(I) - pointer to state table entry */
+/* hv(I) - new hash value for state table entry */
+/* Write Locks: ipf_state */
+/* */
+/* Move a state entry from one position in the hash table to another. */
+/* ------------------------------------------------------------------------ */
+static void fr_ipsmove(is, hv)
+ipstate_t *is;
+u_int hv;
+{
+ ipstate_t **isp;
+ u_int hvm;
+
+ ASSERT(rw_read_locked(&ipf_state.ipf_lk) == 0);
+
+ hvm = is->is_hv;
+ /*
+ * Remove the hash from the old location...
+ */
+ isp = is->is_phnext;
+ if (is->is_hnext)
+ is->is_hnext->is_phnext = isp;
+ *isp = is->is_hnext;
+ if (ips_table[hvm] == NULL)
+ ips_stats.iss_inuse--;
+ ips_stats.iss_bucketlen[hvm]--;
+
+ /*
+ * ...and put the hash in the new one.
+ */
+ hvm = DOUBLE_HASH(hv);
+ is->is_hv = hvm;
+ isp = &ips_table[hvm];
+ if (*isp)
+ (*isp)->is_phnext = &is->is_hnext;
+ else
+ ips_stats.iss_inuse++;
+ ips_stats.iss_bucketlen[hvm]++;
+ is->is_phnext = isp;
+ is->is_hnext = *isp;
+ *isp = is;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_stlookup */
+/* Returns: ipstate_t* - NULL == no matching state found, */
+/* else pointer to state information is returned */
+/* Parameters: fin(I) - pointer to packet information */
+/* tcp(I) - pointer to TCP/UDP header. */
+/* */
+/* Search the state table for a matching entry to the packet described by */
+/* the contents of *fin. */
+/* */
+/* If we return NULL then no lock on ipf_state is held. */
+/* If we return non-null then a read-lock on ipf_state is held. */
+/* ------------------------------------------------------------------------ */
+ipstate_t *fr_stlookup(fin, tcp, ifqp)
+fr_info_t *fin;
+tcphdr_t *tcp;
+ipftq_t **ifqp;
+{
+ u_int hv, hvm, pr, v, tryagain;
+ ipstate_t *is, **isp;
+ u_short dport, sport;
+ i6addr_t src, dst;
+ struct icmp *ic;
+ ipftq_t *ifq;
+ int oow;
+
+ is = NULL;
+ ifq = NULL;
+ tcp = fin->fin_dp;
+ ic = (struct icmp *)tcp;
+ hv = (pr = fin->fin_fi.fi_p);
+ src = fin->fin_fi.fi_src;
+ dst = fin->fin_fi.fi_dst;
+ hv += src.in4.s_addr;
+ hv += dst.in4.s_addr;
+
+ v = fin->fin_fi.fi_v;
+#ifdef USE_INET6
+ if (v == 6) {
+ hv += fin->fin_fi.fi_src.i6[1];
+ hv += fin->fin_fi.fi_src.i6[2];
+ hv += fin->fin_fi.fi_src.i6[3];
+
+ if ((fin->fin_p == IPPROTO_ICMPV6) &&
+ IN6_IS_ADDR_MULTICAST(&fin->fin_fi.fi_dst.in6)) {
+ hv -= dst.in4.s_addr;
+ } else {
+ hv += fin->fin_fi.fi_dst.i6[1];
+ hv += fin->fin_fi.fi_dst.i6[2];
+ hv += fin->fin_fi.fi_dst.i6[3];
+ }
+ }
+#endif
+
+ /*
+ * Search the hash table for matching packet header info.
+ */
+ switch (pr)
+ {
+#ifdef USE_INET6
+ case IPPROTO_ICMPV6 :
+ tryagain = 0;
+ if (v == 6) {
+ if ((ic->icmp_type == ICMP6_ECHO_REQUEST) ||
+ (ic->icmp_type == ICMP6_ECHO_REPLY)) {
+ hv += ic->icmp_id;
+ }
+ }
+ READ_ENTER(&ipf_state);
+icmp6again:
+ hvm = DOUBLE_HASH(hv);
+ for (isp = &ips_table[hvm]; ((is = *isp) != NULL); ) {
+ isp = &is->is_hnext;
+ /*
+ * If a connection is about to be deleted, no packets
+ * are allowed to match it.
+ */
+ if (is->is_sti.tqe_ifq == &ips_deletetq)
+ continue;
+
+ if ((is->is_p != pr) || (is->is_v != v))
+ continue;
+ is = fr_matchsrcdst(fin, is, &src, &dst, NULL, FI_CMP);
+ if (is != NULL &&
+ fr_matchicmpqueryreply(v, &is->is_icmp,
+ ic, fin->fin_rev)) {
+ if (fin->fin_rev)
+ ifq = &ips_icmpacktq;
+ else
+ ifq = &ips_icmptq;
+ break;
+ }
+ }
+
+ if (is != NULL) {
+ if ((tryagain != 0) && !(is->is_flags & SI_W_DADDR)) {
+ hv += fin->fin_fi.fi_src.i6[0];
+ hv += fin->fin_fi.fi_src.i6[1];
+ hv += fin->fin_fi.fi_src.i6[2];
+ hv += fin->fin_fi.fi_src.i6[3];
+ fr_ipsmove(is, hv);
+ MUTEX_DOWNGRADE(&ipf_state);
+ }
+ break;
+ }
+ RWLOCK_EXIT(&ipf_state);
+
+ /*
+ * No matching icmp state entry. Perhaps this is a
+ * response to another state entry.
+ *
+ * XXX With some ICMP6 packets, the "other" address is already
+ * in the packet, after the ICMP6 header, and this could be
+ * used in place of the multicast address. However, taking
+ * advantage of this requires some significant code changes
+ * to handle the specific types where that is the case.
+ */
+ if ((ips_stats.iss_wild != 0) && (v == 6) && (tryagain == 0) &&
+ !IN6_IS_ADDR_MULTICAST(&fin->fin_fi.fi_src.in6)) {
+ hv -= fin->fin_fi.fi_src.i6[0];
+ hv -= fin->fin_fi.fi_src.i6[1];
+ hv -= fin->fin_fi.fi_src.i6[2];
+ hv -= fin->fin_fi.fi_src.i6[3];
+ tryagain = 1;
+ WRITE_ENTER(&ipf_state);
+ goto icmp6again;
+ }
+
+ is = fr_checkicmp6matchingstate(fin);
+ if (is != NULL)
+ return is;
+ break;
+#endif
+
+ case IPPROTO_ICMP :
+ if (v == 4) {
+ hv += ic->icmp_id;
+ }
+ hv = DOUBLE_HASH(hv);
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hv]; ((is = *isp) != NULL); ) {
+ isp = &is->is_hnext;
+ if ((is->is_p != pr) || (is->is_v != v))
+ continue;
+ is = fr_matchsrcdst(fin, is, &src, &dst, NULL, FI_CMP);
+ if ((is != NULL) &&
+ (ic->icmp_id == is->is_icmp.ici_id) &&
+ fr_matchicmpqueryreply(v, &is->is_icmp,
+ ic, fin->fin_rev)) {
+ if (fin->fin_rev)
+ ifq = &ips_icmpacktq;
+ else
+ ifq = &ips_icmptq;
+ break;
+ }
+ }
+ if (is == NULL) {
+ RWLOCK_EXIT(&ipf_state);
+ }
+ break;
+
+ case IPPROTO_TCP :
+ case IPPROTO_UDP :
+ ifqp = NULL;
+ sport = htons(fin->fin_data[0]);
+ hv += sport;
+ dport = htons(fin->fin_data[1]);
+ hv += dport;
+ oow = 0;
+ tryagain = 0;
+ READ_ENTER(&ipf_state);
+retry_tcpudp:
+ hvm = DOUBLE_HASH(hv);
+ for (isp = &ips_table[hvm]; ((is = *isp) != NULL); ) {
+ isp = &is->is_hnext;
+ if ((is->is_p != pr) || (is->is_v != v))
+ continue;
+ fin->fin_flx &= ~FI_OOW;
+ is = fr_matchsrcdst(fin, is, &src, &dst, tcp, FI_CMP);
+ if (is != NULL) {
+ if (pr == IPPROTO_TCP) {
+ if (!fr_tcpstate(fin, tcp, is)) {
+ oow |= fin->fin_flx & FI_OOW;
+ continue;
+ }
+ }
+ break;
+ }
+ }
+ if (is != NULL) {
+ if (tryagain &&
+ !(is->is_flags & (SI_CLONE|SI_WILDP|SI_WILDA))) {
+ hv += dport;
+ hv += sport;
+ fr_ipsmove(is, hv);
+ MUTEX_DOWNGRADE(&ipf_state);
+ }
+ break;
+ }
+ RWLOCK_EXIT(&ipf_state);
+
+ if (!tryagain && ips_stats.iss_wild) {
+ hv -= dport;
+ hv -= sport;
+ tryagain = 1;
+ WRITE_ENTER(&ipf_state);
+ goto retry_tcpudp;
+ }
+ fin->fin_flx |= oow;
+ break;
+
+#if 0
+ case IPPROTO_GRE :
+ gre = fin->fin_dp;
+ if (GRE_REV(gre->gr_flags) == 1) {
+ hv += gre->gr_call;
+ }
+ /* FALLTHROUGH */
+#endif
+ default :
+ ifqp = NULL;
+ hvm = DOUBLE_HASH(hv);
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hvm]; ((is = *isp) != NULL); ) {
+ isp = &is->is_hnext;
+ if ((is->is_p != pr) || (is->is_v != v))
+ continue;
+ is = fr_matchsrcdst(fin, is, &src, &dst, NULL, FI_CMP);
+ if (is != NULL) {
+ ifq = &ips_iptq;
+ break;
+ }
+ }
+ if (is == NULL) {
+ RWLOCK_EXIT(&ipf_state);
+ }
+ break;
+ }
+
+ if (is != NULL) {
+ if (((is->is_sti.tqe_flags & TQE_RULEBASED) != 0) &&
+ (is->is_tqehead[fin->fin_rev] != NULL))
+ ifq = is->is_tqehead[fin->fin_rev];
+ if (ifq != NULL && ifqp != NULL)
+ *ifqp = ifq;
+ }
+ return is;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_updatestate */
+/* Returns: Nil */
+/* Parameters: fin(I) - pointer to packet information */
+/* is(I) - pointer to state table entry */
+/* Read Locks: ipf_state */
+/* */
+/* Updates packet and byte counters for a newly received packet. Seeds the */
+/* fragment cache with a new entry as required. */
+/* ------------------------------------------------------------------------ */
+void fr_updatestate(fin, is, ifq)
+fr_info_t *fin;
+ipstate_t *is;
+ipftq_t *ifq;
+{
+ ipftqent_t *tqe;
+ int i, pass;
+
+ i = (fin->fin_rev << 1) + fin->fin_out;
+
+ /*
+ * For TCP packets, ifq == NULL. For all others, check if this new
+ * queue is different to the last one it was on and move it if so.
+ */
+ tqe = &is->is_sti;
+ MUTEX_ENTER(&is->is_lock);
+ if ((tqe->tqe_flags & TQE_RULEBASED) != 0)
+ ifq = is->is_tqehead[fin->fin_rev];
+
+ if (ifq != NULL)
+ fr_movequeue(tqe, tqe->tqe_ifq, ifq);
+
+ is->is_pkts[i]++;
+ is->is_bytes[i] += fin->fin_plen;
+ MUTEX_EXIT(&is->is_lock);
+
+#ifdef IPFILTER_SYNC
+ if (is->is_flags & IS_STATESYNC)
+ ipfsync_update(SMC_STATE, fin, is->is_sync);
+#endif
+
+ ATOMIC_INCL(ips_stats.iss_hits);
+
+ fin->fin_fr = is->is_rule;
+
+ /*
+ * If this packet is a fragment and the rule says to track fragments,
+ * then create a new fragment cache entry.
+ */
+ pass = is->is_pass;
+ if ((fin->fin_flx & FI_FRAG) && FR_ISPASS(pass))
+ (void) fr_newfrag(fin, pass ^ FR_KEEPSTATE);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_checkstate */
+/* Returns: frentry_t* - NULL == search failed, */
+/* else pointer to rule for matching state */
+/* Parameters: ifp(I) - pointer to interface */
+/* passp(I) - pointer to filtering result flags */
+/* */
+/* Check if a packet is associated with an entry in the state table. */
+/* ------------------------------------------------------------------------ */
+frentry_t *fr_checkstate(fin, passp)
+fr_info_t *fin;
+u_32_t *passp;
+{
+ ipstate_t *is;
+ frentry_t *fr;
+ tcphdr_t *tcp;
+ ipftq_t *ifq;
+ u_int pass;
+
+ if (fr_state_lock || (ips_list == NULL) ||
+ (fin->fin_flx & (FI_SHORT|FI_STATE|FI_FRAGBODY|FI_BAD)))
+ return NULL;
+
+ is = NULL;
+ if ((fin->fin_flx & FI_TCPUDP) ||
+ (fin->fin_fi.fi_p == IPPROTO_ICMP)
+#ifdef USE_INET6
+ || (fin->fin_fi.fi_p == IPPROTO_ICMPV6)
+#endif
+ )
+ tcp = fin->fin_dp;
+ else
+ tcp = NULL;
+
+ /*
+ * Search the hash table for matching packet header info.
+ */
+ ifq = NULL;
+ is = fin->fin_state;
+ if (is == NULL)
+ is = fr_stlookup(fin, tcp, &ifq);
+ switch (fin->fin_p)
+ {
+#ifdef USE_INET6
+ case IPPROTO_ICMPV6 :
+ if (is != NULL)
+ break;
+ if (fin->fin_v == 6) {
+ is = fr_checkicmp6matchingstate(fin);
+ if (is != NULL)
+ goto matched;
+ }
+ break;
+#endif
+ case IPPROTO_ICMP :
+ if (is != NULL)
+ break;
+ /*
+ * No matching icmp state entry. Perhaps this is a
+ * response to another state entry.
+ */
+ is = fr_checkicmpmatchingstate(fin);
+ if (is != NULL)
+ goto matched;
+ break;
+ case IPPROTO_TCP :
+ if (is == NULL)
+ break;
+
+ if (is->is_pass & FR_NEWISN) {
+ if (fin->fin_out == 0)
+ fr_fixinisn(fin, is);
+ else if (fin->fin_out == 1)
+ fr_fixoutisn(fin, is);
+ }
+ break;
+ default :
+ if (fin->fin_rev)
+ ifq = &ips_udpacktq;
+ else
+ ifq = &ips_udptq;
+ break;
+ }
+ if (is == NULL) {
+ ATOMIC_INCL(ips_stats.iss_miss);
+ return NULL;
+ }
+
+matched:
+ fr = is->is_rule;
+ if (fr != NULL) {
+ if ((fin->fin_out == 0) && (fr->fr_nattag.ipt_num[0] != 0)) {
+ if (fin->fin_nattag == NULL)
+ return NULL;
+ if (fr_matchtag(&fr->fr_nattag, fin->fin_nattag) != 0)
+ return NULL;
+ }
+ (void) strncpy(fin->fin_group, fr->fr_group, FR_GROUPLEN);
+ fin->fin_icode = fr->fr_icode;
+ }
+
+ fin->fin_rule = is->is_rulen;
+ pass = is->is_pass;
+ fr_updatestate(fin, is, ifq);
+
+ fin->fin_state = is;
+ is->is_touched = fr_ticks;
+ MUTEX_ENTER(&is->is_lock);
+ is->is_ref++;
+ MUTEX_EXIT(&is->is_lock);
+ RWLOCK_EXIT(&ipf_state);
+ fin->fin_flx |= FI_STATE;
+ if ((pass & FR_LOGFIRST) != 0)
+ pass &= ~(FR_LOGFIRST|FR_LOG);
+ *passp = pass;
+ return fr;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fixoutisn */
+/* Returns: Nil */
+/* Parameters: fin(I) - pointer to packet information */
+/* is(I) - pointer to master state structure */
+/* */
+/* Called only for outbound packets, adjusts the sequence number and the */
+/* TCP checksum to match that change. */
+/* ------------------------------------------------------------------------ */
+static void fr_fixoutisn(fin, is)
+fr_info_t *fin;
+ipstate_t *is;
+{
+ tcphdr_t *tcp;
+ int rev;
+ u_32_t seq;
+
+ tcp = fin->fin_dp;
+ rev = fin->fin_rev;
+ if ((is->is_flags & IS_ISNSYN) != 0) {
+ if (rev == 0) {
+ seq = ntohl(tcp->th_seq);
+ seq += is->is_isninc[0];
+ tcp->th_seq = htonl(seq);
+ fix_outcksum(fin, &tcp->th_sum, is->is_sumd[0]);
+ }
+ }
+ if ((is->is_flags & IS_ISNACK) != 0) {
+ if (rev == 1) {
+ seq = ntohl(tcp->th_seq);
+ seq += is->is_isninc[1];
+ tcp->th_seq = htonl(seq);
+ fix_outcksum(fin, &tcp->th_sum, is->is_sumd[1]);
+ }
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_fixinisn */
+/* Returns: Nil */
+/* Parameters: fin(I) - pointer to packet information */
+/* is(I) - pointer to master state structure */
+/* */
+/* Called only for inbound packets, adjusts the acknowledge number and the */
+/* TCP checksum to match that change. */
+/* ------------------------------------------------------------------------ */
+static void fr_fixinisn(fin, is)
+fr_info_t *fin;
+ipstate_t *is;
+{
+ tcphdr_t *tcp;
+ int rev;
+ u_32_t ack;
+
+ tcp = fin->fin_dp;
+ rev = fin->fin_rev;
+ if ((is->is_flags & IS_ISNSYN) != 0) {
+ if (rev == 1) {
+ ack = ntohl(tcp->th_ack);
+ ack -= is->is_isninc[0];
+ tcp->th_ack = htonl(ack);
+ fix_incksum(fin, &tcp->th_sum, is->is_sumd[0]);
+ }
+ }
+ if ((is->is_flags & IS_ISNACK) != 0) {
+ if (rev == 0) {
+ ack = ntohl(tcp->th_ack);
+ ack -= is->is_isninc[1];
+ tcp->th_ack = htonl(ack);
+ fix_incksum(fin, &tcp->th_sum, is->is_sumd[1]);
+ }
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_statesync */
+/* Returns: Nil */
+/* Parameters: ifp(I) - pointer to interface */
+/* */
+/* Walk through all state entries and if an interface pointer match is */
+/* found then look it up again, based on its name in case the pointer has */
+/* changed since last time. */
+/* */
+/* If ifp is passed in as being non-null then we are only doing updates for */
+/* existing, matching, uses of it. */
+/* ------------------------------------------------------------------------ */
+void fr_statesync(ifp)
+void *ifp;
+{
+ ipstate_t *is;
+ int i;
+
+ if (fr_running <= 0)
+ return;
+
+ WRITE_ENTER(&ipf_state);
+
+ if (fr_running <= 0) {
+ RWLOCK_EXIT(&ipf_state);
+ return;
+ }
+
+ for (is = ips_list; is; is = is->is_next) {
+ /*
+ * Look up all the interface names in the state entry.
+ */
+ for (i = 0; i < 4; i++) {
+ if (ifp == NULL || ifp == is->is_ifp[i])
+ is->is_ifp[i] = fr_resolvenic(is->is_ifname[i],
+ is->is_v);
+ }
+ }
+ RWLOCK_EXIT(&ipf_state);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_delstate */
+/* Returns: int - 0 = entry deleted, else reference count on struct */
+/* Parameters: is(I) - pointer to state structure to delete */
+/* why(I) - if not 0, log reason why it was deleted */
+/* Write Locks: ipf_state */
+/* */
+/* Deletes a state entry from the enumerated list as well as the hash table */
+/* and timeout queue lists. Make adjustments to hash table statistics and */
+/* global counters as required. */
+/* ------------------------------------------------------------------------ */
+static int fr_delstate(is, why)
+ipstate_t *is;
+int why;
+{
+
+ ASSERT(rw_read_locked(&ipf_state.ipf_lk) == 0);
+
+ /*
+ * Since we want to delete this, remove it from the state table,
+ * where it can be found & used, first.
+ */
+ if (is->is_phnext != NULL) {
+ *is->is_phnext = is->is_hnext;
+ if (is->is_hnext != NULL)
+ is->is_hnext->is_phnext = is->is_phnext;
+ if (ips_table[is->is_hv] == NULL)
+ ips_stats.iss_inuse--;
+ ips_stats.iss_bucketlen[is->is_hv]--;
+
+ is->is_phnext = NULL;
+ is->is_hnext = NULL;
+ }
+
+ /*
+ * Because ips_stats.iss_wild is a count of entries in the state
+ * table that have wildcard flags set, only decerement it once
+ * and do it here.
+ */
+ if (is->is_flags & (SI_WILDP|SI_WILDA)) {
+ if (!(is->is_flags & SI_CLONED)) {
+ ATOMIC_DECL(ips_stats.iss_wild);
+ }
+ is->is_flags &= ~(SI_WILDP|SI_WILDA);
+ }
+
+ /*
+ * Next, remove it from the timeout queue it is in.
+ */
+ if (is->is_sti.tqe_ifq != NULL)
+ fr_deletequeueentry(&is->is_sti);
+
+ if (is->is_me != NULL) {
+ *is->is_me = NULL;
+ is->is_me = NULL;
+ }
+
+ /*
+ * If it is still in use by something else, do not go any further,
+ * but note that at this point it is now an orphan. How can this
+ * be? fr_state_flush() calls fr_delete() directly because it wants
+ * to empty the table out and if something has a hold on a state
+ * entry (such as ipfstat), it'll do the deref path that'll bring
+ * us back here to do the real delete & free.
+ */
+ is->is_ref--;
+ if (is->is_ref > 0)
+ return is->is_ref;
+
+ if (is->is_tqehead[0] != NULL) {
+ if (fr_deletetimeoutqueue(is->is_tqehead[0]) == 0)
+ fr_freetimeoutqueue(is->is_tqehead[0]);
+ }
+ if (is->is_tqehead[1] != NULL) {
+ if (fr_deletetimeoutqueue(is->is_tqehead[1]) == 0)
+ fr_freetimeoutqueue(is->is_tqehead[1]);
+ }
+
+#ifdef IPFILTER_SYNC
+ if (is->is_sync)
+ ipfsync_del(is->is_sync);
+#endif
+#ifdef IPFILTER_SCAN
+ (void) ipsc_detachis(is);
+#endif
+
+ /*
+ * Now remove it from the linked list of known states
+ */
+ if (is->is_pnext != NULL) {
+ *is->is_pnext = is->is_next;
+
+ if (is->is_next != NULL)
+ is->is_next->is_pnext = is->is_pnext;
+
+ is->is_pnext = NULL;
+ is->is_next = NULL;
+ }
+
+ if (ipstate_logging != 0 && why != 0)
+ ipstate_log(is, why);
+
+ if (is->is_p == IPPROTO_TCP)
+ ips_stats.iss_fin++;
+ else
+ ips_stats.iss_expire++;
+
+ if (is->is_rule != NULL) {
+ is->is_rule->fr_statecnt--;
+ (void) fr_derefrule(&is->is_rule);
+ }
+
+ MUTEX_DESTROY(&is->is_lock);
+ KFREE(is);
+ ips_num--;
+
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_timeoutstate */
+/* Returns: Nil */
+/* Parameters: Nil */
+/* */
+/* Slowly expire held state for thingslike UDP and ICMP. The algorithm */
+/* used here is to keep the queue sorted with the oldest things at the top */
+/* and the youngest at the bottom. So if the top one doesn't need to be */
+/* expired then neither will any under it. */
+/* ------------------------------------------------------------------------ */
+void fr_timeoutstate()
+{
+ ipftq_t *ifq, *ifqnext;
+ ipftqent_t *tqe, *tqn;
+ ipstate_t *is;
+ SPL_INT(s);
+
+ SPL_NET(s);
+ WRITE_ENTER(&ipf_state);
+ for (ifq = ips_tqtqb; ifq != NULL; ifq = ifq->ifq_next)
+ for (tqn = ifq->ifq_head; ((tqe = tqn) != NULL); ) {
+ if (tqe->tqe_die > fr_ticks)
+ break;
+ tqn = tqe->tqe_next;
+ is = tqe->tqe_parent;
+ fr_delstate(is, ISL_EXPIRE);
+ }
+
+ for (ifq = ips_utqe; ifq != NULL; ifq = ifqnext) {
+ ifqnext = ifq->ifq_next;
+
+ for (tqn = ifq->ifq_head; ((tqe = tqn) != NULL); ) {
+ if (tqe->tqe_die > fr_ticks)
+ break;
+ tqn = tqe->tqe_next;
+ is = tqe->tqe_parent;
+ fr_delstate(is, ISL_EXPIRE);
+ }
+ }
+
+ for (ifq = ips_utqe; ifq != NULL; ifq = ifqnext) {
+ ifqnext = ifq->ifq_next;
+
+ if (((ifq->ifq_flags & IFQF_DELETE) != 0) &&
+ (ifq->ifq_ref == 0)) {
+ fr_freetimeoutqueue(ifq);
+ }
+ }
+
+ if (fr_state_doflush) {
+ (void) fr_state_flush(2, 0);
+ fr_state_doflush = 0;
+ }
+
+ RWLOCK_EXIT(&ipf_state);
+ SPL_X(s);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_state_flush */
+/* Returns: int - 0 == success, -1 == failure */
+/* Parameters: Nil */
+/* Write Locks: ipf_state */
+/* */
+/* Flush state tables. Three actions currently defined: */
+/* which == 0 : flush all state table entries */
+/* which == 1 : flush TCP connections which have started to close but are */
+/* stuck for some reason. */
+/* which == 2 : flush TCP connections which have been idle for a long time, */
+/* starting at > 4 days idle and working back in successive half-*/
+/* days to at most 12 hours old. If this fails to free enough */
+/* slots then work backwards in half hour slots to 30 minutes. */
+/* If that too fails, then work backwards in 30 second intervals */
+/* for the last 30 minutes to at worst 30 seconds idle. */
+/* ------------------------------------------------------------------------ */
+static int fr_state_flush(which, proto)
+int which, proto;
+{
+ ipftq_t *ifq, *ifqnext;
+ ipftqent_t *tqe, *tqn;
+ ipstate_t *is, **isp;
+ int removed;
+ SPL_INT(s);
+
+ removed = 0;
+
+ SPL_NET(s);
+
+ switch (which)
+ {
+ case 0 :
+ /*
+ * Style 0 flush removes everything...
+ */
+ for (isp = &ips_list; ((is = *isp) != NULL); ) {
+ if ((proto != 0) && (is->is_v != proto)) {
+ isp = &is->is_next;
+ continue;
+ }
+ if (fr_delstate(is, ISL_FLUSH) == 0)
+ removed++;
+ else
+ isp = &is->is_next;
+ }
+ break;
+
+ case 1 :
+ /*
+ * Since we're only interested in things that are closing,
+ * we can start with the appropriate timeout queue.
+ */
+ for (ifq = ips_tqtqb + IPF_TCPS_CLOSE_WAIT; ifq != NULL;
+ ifq = ifq->ifq_next) {
+
+ for (tqn = ifq->ifq_head; ((tqe = tqn) != NULL); ) {
+ tqn = tqe->tqe_next;
+ is = tqe->tqe_parent;
+ if (is->is_p != IPPROTO_TCP)
+ break;
+ if (fr_delstate(is, ISL_EXPIRE) == 0)
+ removed++;
+ }
+ }
+
+ /*
+ * Also need to look through the user defined queues.
+ */
+ for (ifq = ips_utqe; ifq != NULL; ifq = ifqnext) {
+ ifqnext = ifq->ifq_next;
+ for (tqn = ifq->ifq_head; ((tqe = tqn) != NULL); ) {
+ tqn = tqe->tqe_next;
+ is = tqe->tqe_parent;
+ if (is->is_p != IPPROTO_TCP)
+ continue;
+
+ if ((is->is_state[0] > IPF_TCPS_ESTABLISHED) &&
+ (is->is_state[1] > IPF_TCPS_ESTABLISHED)) {
+ if (fr_delstate(is, ISL_EXPIRE) == 0)
+ removed++;
+ }
+ }
+ }
+ break;
+
+ case 2 :
+ break;
+
+ /*
+ * Args 5-11 correspond to flushing those particular states
+ * for TCP connections.
+ */
+ case IPF_TCPS_CLOSE_WAIT :
+ case IPF_TCPS_FIN_WAIT_1 :
+ case IPF_TCPS_CLOSING :
+ case IPF_TCPS_LAST_ACK :
+ case IPF_TCPS_FIN_WAIT_2 :
+ case IPF_TCPS_TIME_WAIT :
+ case IPF_TCPS_CLOSED :
+ tqn = ips_tqtqb[which].ifq_head;
+ while (tqn != NULL) {
+ tqe = tqn;
+ tqn = tqe->tqe_next;
+ is = tqe->tqe_parent;
+ if (fr_delstate(is, ISL_FLUSH) == 0)
+ removed++;
+ }
+ break;
+
+ default :
+ if (which < 30)
+ break;
+
+ /*
+ * Take a large arbitrary number to mean the number of seconds
+ * for which which consider to be the maximum value we'll allow
+ * the expiration to be.
+ */
+ which = IPF_TTLVAL(which);
+ for (isp = &ips_list; ((is = *isp) != NULL); ) {
+ if ((proto == 0) || (is->is_v == proto)) {
+ if (fr_ticks - is->is_touched > which) {
+ if (fr_delstate(is, ISL_FLUSH) == 0) {
+ removed++;
+ continue;
+ }
+ }
+ }
+ isp = &is->is_next;
+ }
+ break;
+ }
+
+ if (which != 2) {
+ SPL_X(s);
+ return removed;
+ }
+
+ /*
+ * Asked to remove inactive entries because the table is full.
+ */
+ if (fr_ticks - ips_last_force_flush > IPF_TTLVAL(5)) {
+ ips_last_force_flush = fr_ticks;
+ removed = ipf_queueflush(fr_state_flush_entry, ips_tqtqb,
+ ips_utqe);
+ }
+
+ SPL_X(s);
+ return removed;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_state_flush_entry */
+/* Returns: int - 0 = entry deleted, else not deleted */
+/* Parameters: entry(I) - pointer to state structure to delete */
+/* Write Locks: ipf_state */
+/* */
+/* This function is a stepping stone between ipf_queueflush() and */
+/* fr_delstate(). It is used so we can provide a uniform interface via the */
+/* ipf_queueflush() function. */
+/* ------------------------------------------------------------------------ */
+static int fr_state_flush_entry(entry)
+void *entry;
+{
+ return fr_delstate(entry, ISL_FLUSH);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_tcp_age */
+/* Returns: int - 1 == state transition made, 0 == no change (rejected) */
+/* Parameters: tq(I) - pointer to timeout queue information */
+/* fin(I) - pointer to packet information */
+/* tqtab(I) - TCP timeout queue table this is in */
+/* flags(I) - flags from state/NAT entry */
+/* */
+/* Rewritten by Arjan de Vet <Arjan.deVet@adv.iae.nl>, 2000-07-29: */
+/* */
+/* - (try to) base state transitions on real evidence only, */
+/* i.e. packets that are sent and have been received by ipfilter; */
+/* diagram 18.12 of TCP/IP volume 1 by W. Richard Stevens was used. */
+/* */
+/* - deal with half-closed connections correctly; */
+/* */
+/* - store the state of the source in state[0] such that ipfstat */
+/* displays the state as source/dest instead of dest/source; the calls */
+/* to fr_tcp_age have been changed accordingly. */
+/* */
+/* Internal Parameters: */
+/* */
+/* state[0] = state of source (host that initiated connection) */
+/* state[1] = state of dest (host that accepted the connection) */
+/* */
+/* dir == 0 : a packet from source to dest */
+/* dir == 1 : a packet from dest to source */
+/* */
+/* A typical procession for a connection is as follows: */
+/* */
+/* +--------------+-------------------+ */
+/* | Side '0' | Side '1' | */
+/* +--------------+-------------------+ */
+/* | 0 -> 1 (SYN) | | */
+/* | | 0 -> 2 (SYN-ACK) | */
+/* | 1 -> 3 (ACK) | | */
+/* | | 2 -> 4 (ACK-PUSH) | */
+/* | 3 -> 4 (ACK) | | */
+/* | ... | ... | */
+/* | | 4 -> 6 (FIN-ACK) | */
+/* | 4 -> 5 (ACK) | | */
+/* | | 6 -> 6 (ACK-PUSH) | */
+/* | 5 -> 5 (ACK) | | */
+/* | 5 -> 8 (FIN) | | */
+/* | | 6 -> 10 (ACK) | */
+/* +--------------+-------------------+ */
+/* */
+/* Locking: it is assumed that the parent of the tqe structure is locked. */
+/* ------------------------------------------------------------------------ */
+int fr_tcp_age(tqe, fin, tqtab, flags)
+ipftqent_t *tqe;
+fr_info_t *fin;
+ipftq_t *tqtab;
+int flags;
+{
+ int dlen, ostate, nstate, rval, dir;
+ u_char tcpflags;
+ tcphdr_t *tcp;
+
+ tcp = fin->fin_dp;
+
+ rval = 0;
+ dir = fin->fin_rev;
+ tcpflags = tcp->th_flags;
+ dlen = fin->fin_dlen - (TCP_OFF(tcp) << 2);
+
+ if (tcpflags & TH_RST) {
+ if (!(tcpflags & TH_PUSH) && !dlen)
+ nstate = IPF_TCPS_CLOSED;
+ else
+ nstate = IPF_TCPS_CLOSE_WAIT;
+ rval = 1;
+ } else {
+ ostate = tqe->tqe_state[1 - dir];
+ nstate = tqe->tqe_state[dir];
+
+ switch (nstate)
+ {
+ case IPF_TCPS_LISTEN: /* 0 */
+ if ((tcpflags & TH_OPENING) == TH_OPENING) {
+ /*
+ * 'dir' received an S and sends SA in
+ * response, LISTEN -> SYN_RECEIVED
+ */
+ nstate = IPF_TCPS_SYN_RECEIVED;
+ rval = 1;
+ } else if ((tcpflags & TH_OPENING) == TH_SYN) {
+ /* 'dir' sent S, LISTEN -> SYN_SENT */
+ nstate = IPF_TCPS_SYN_SENT;
+ rval = 1;
+ }
+ /*
+ * the next piece of code makes it possible to get
+ * already established connections into the state table
+ * after a restart or reload of the filter rules; this
+ * does not work when a strict 'flags S keep state' is
+ * used for tcp connections of course
+ */
+ if (((flags & IS_TCPFSM) == 0) &&
+ ((tcpflags & TH_ACKMASK) == TH_ACK)) {
+ /*
+ * we saw an A, guess 'dir' is in ESTABLISHED
+ * mode
+ */
+ switch (ostate)
+ {
+ case IPF_TCPS_LISTEN :
+ case IPF_TCPS_SYN_RECEIVED :
+ nstate = IPF_TCPS_HALF_ESTAB;
+ rval = 1;
+ break;
+ case IPF_TCPS_HALF_ESTAB :
+ case IPF_TCPS_ESTABLISHED :
+ nstate = IPF_TCPS_ESTABLISHED;
+ rval = 1;
+ break;
+ default :
+ break;
+ }
+ }
+ /*
+ * TODO: besides regular ACK packets we can have other
+ * packets as well; it is yet to be determined how we
+ * should initialize the states in those cases
+ */
+ break;
+
+ case IPF_TCPS_SYN_SENT: /* 1 */
+ if ((tcpflags & ~(TH_ECN|TH_CWR)) == TH_SYN) {
+ /*
+ * A retransmitted SYN packet. We do not reset
+ * the timeout here to fr_tcptimeout because a
+ * connection connect timeout does not renew
+ * after every packet that is sent. We need to
+ * set rval so as to indicate the packet has
+ * passed the check for its flags being valid
+ * in the TCP FSM. Setting rval to 2 has the
+ * result of not resetting the timeout.
+ */
+ rval = 2;
+ } else if ((tcpflags & (TH_SYN|TH_FIN|TH_ACK)) ==
+ TH_ACK) {
+ /*
+ * we see an A from 'dir' which is in SYN_SENT
+ * state: 'dir' sent an A in response to an SA
+ * which it received, SYN_SENT -> ESTABLISHED
+ */
+ nstate = IPF_TCPS_ESTABLISHED;
+ rval = 1;
+ } else if (tcpflags & TH_FIN) {
+ /*
+ * we see an F from 'dir' which is in SYN_SENT
+ * state and wants to close its side of the
+ * connection; SYN_SENT -> FIN_WAIT_1
+ */
+ nstate = IPF_TCPS_FIN_WAIT_1;
+ rval = 1;
+ } else if ((tcpflags & TH_OPENING) == TH_OPENING) {
+ /*
+ * we see an SA from 'dir' which is already in
+ * SYN_SENT state, this means we have a
+ * simultaneous open; SYN_SENT -> SYN_RECEIVED
+ */
+ nstate = IPF_TCPS_SYN_RECEIVED;
+ rval = 1;
+ }
+ break;
+
+ case IPF_TCPS_SYN_RECEIVED: /* 2 */
+ if ((tcpflags & (TH_SYN|TH_FIN|TH_ACK)) == TH_ACK) {
+ /*
+ * we see an A from 'dir' which was in
+ * SYN_RECEIVED state so it must now be in
+ * established state, SYN_RECEIVED ->
+ * ESTABLISHED
+ */
+ nstate = IPF_TCPS_ESTABLISHED;
+ rval = 1;
+ } else if ((tcpflags & ~(TH_ECN|TH_CWR)) ==
+ TH_OPENING) {
+ /*
+ * We see an SA from 'dir' which is already in
+ * SYN_RECEIVED state.
+ */
+ rval = 2;
+ } else if (tcpflags & TH_FIN) {
+ /*
+ * we see an F from 'dir' which is in
+ * SYN_RECEIVED state and wants to close its
+ * side of the connection; SYN_RECEIVED ->
+ * FIN_WAIT_1
+ */
+ nstate = IPF_TCPS_FIN_WAIT_1;
+ rval = 1;
+ }
+ break;
+
+ case IPF_TCPS_HALF_ESTAB: /* 3 */
+ if (tcpflags & TH_FIN) {
+ nstate = IPF_TCPS_FIN_WAIT_1;
+ rval = 1;
+ } else if ((tcpflags & TH_ACKMASK) == TH_ACK) {
+ /*
+ * If we've picked up a connection in mid
+ * flight, we could be looking at a follow on
+ * packet from the same direction as the one
+ * that created this state. Recognise it but
+ * do not advance the entire connection's
+ * state.
+ */
+ switch (ostate)
+ {
+ case IPF_TCPS_LISTEN :
+ case IPF_TCPS_SYN_SENT :
+ case IPF_TCPS_SYN_RECEIVED :
+ rval = 1;
+ break;
+ case IPF_TCPS_HALF_ESTAB :
+ case IPF_TCPS_ESTABLISHED :
+ nstate = IPF_TCPS_ESTABLISHED;
+ rval = 1;
+ break;
+ default :
+ break;
+ }
+ }
+ break;
+
+ case IPF_TCPS_ESTABLISHED: /* 4 */
+ rval = 1;
+ if (tcpflags & TH_FIN) {
+ /*
+ * 'dir' closed its side of the connection;
+ * this gives us a half-closed connection;
+ * ESTABLISHED -> FIN_WAIT_1
+ */
+ if (ostate == IPF_TCPS_FIN_WAIT_1) {
+ nstate = IPF_TCPS_CLOSING;
+ } else {
+ nstate = IPF_TCPS_FIN_WAIT_1;
+ }
+ } else if (tcpflags & TH_ACK) {
+ /*
+ * an ACK, should we exclude other flags here?
+ */
+ if (ostate == IPF_TCPS_FIN_WAIT_1) {
+ /*
+ * We know the other side did an active
+ * close, so we are ACKing the recvd
+ * FIN packet (does the window matching
+ * code guarantee this?) and go into
+ * CLOSE_WAIT state; this gives us a
+ * half-closed connection
+ */
+ nstate = IPF_TCPS_CLOSE_WAIT;
+ } else if (ostate < IPF_TCPS_CLOSE_WAIT) {
+ /*
+ * still a fully established
+ * connection reset timeout
+ */
+ nstate = IPF_TCPS_ESTABLISHED;
+ }
+ }
+ break;
+
+ case IPF_TCPS_CLOSE_WAIT: /* 5 */
+ rval = 1;
+ if (tcpflags & TH_FIN) {
+ /*
+ * application closed and 'dir' sent a FIN,
+ * we're now going into LAST_ACK state
+ */
+ nstate = IPF_TCPS_LAST_ACK;
+ } else {
+ /*
+ * we remain in CLOSE_WAIT because the other
+ * side has closed already and we did not
+ * close our side yet; reset timeout
+ */
+ nstate = IPF_TCPS_CLOSE_WAIT;
+ }
+ break;
+
+ case IPF_TCPS_FIN_WAIT_1: /* 6 */
+ rval = 1;
+ if ((tcpflags & TH_ACK) &&
+ ostate > IPF_TCPS_CLOSE_WAIT) {
+ /*
+ * if the other side is not active anymore
+ * it has sent us a FIN packet that we are
+ * ack'ing now with an ACK; this means both
+ * sides have now closed the connection and
+ * we go into TIME_WAIT
+ */
+ /*
+ * XXX: how do we know we really are ACKing
+ * the FIN packet here? does the window code
+ * guarantee that?
+ */
+ nstate = IPF_TCPS_TIME_WAIT;
+ } else {
+ /*
+ * we closed our side of the connection
+ * already but the other side is still active
+ * (ESTABLISHED/CLOSE_WAIT); continue with
+ * this half-closed connection
+ */
+ nstate = IPF_TCPS_FIN_WAIT_1;
+ }
+ break;
+
+ case IPF_TCPS_CLOSING: /* 7 */
+ if ((tcpflags & (TH_FIN|TH_ACK)) == TH_ACK) {
+ nstate = IPF_TCPS_TIME_WAIT;
+ }
+ rval = 1;
+ break;
+
+ case IPF_TCPS_LAST_ACK: /* 8 */
+ if (tcpflags & TH_ACK) {
+ if ((tcpflags & TH_PUSH) || dlen)
+ /*
+ * there is still data to be delivered,
+ * reset timeout
+ */
+ rval = 1;
+ else
+ rval = 2;
+ }
+ /*
+ * we cannot detect when we go out of LAST_ACK state to
+ * CLOSED because that is based on the reception of ACK
+ * packets; ipfilter can only detect that a packet
+ * has been sent by a host
+ */
+ break;
+
+ case IPF_TCPS_FIN_WAIT_2: /* 9 */
+ /* NOT USED */
+#if 0
+ rval = 1;
+ if ((tcpflags & TH_OPENING) == TH_OPENING) {
+ nstate = IPF_TCPS_SYN_RECEIVED;
+ } else if (tcpflags & TH_SYN) {
+ nstate = IPF_TCPS_SYN_SENT;
+ } else if ((tcpflags & (TH_FIN|TH_ACK)) != 0) {
+ nstate = IPF_TCPS_TIME_WAIT;
+ }
+#endif
+ break;
+
+ case IPF_TCPS_TIME_WAIT: /* 10 */
+ /* we're in 2MSL timeout now */
+ rval = 2;
+ if (ostate == IPF_TCPS_LAST_ACK) {
+ nstate = IPF_TCPS_CLOSED;
+ }
+ break;
+
+ case IPF_TCPS_CLOSED: /* 11 */
+ rval = 2;
+ break;
+
+ default :
+#if defined(_KERNEL)
+# if SOLARIS
+ cmn_err(CE_NOTE,
+ "tcp %lx flags %x si %lx nstate %d ostate %d\n",
+ (u_long)tcp, tcpflags, (u_long)tqe,
+ nstate, ostate);
+# else
+ printf("tcp %lx flags %x si %lx nstate %d ostate %d\n",
+ (u_long)tcp, tcpflags, (u_long)tqe,
+ nstate, ostate);
+# endif
+#else
+ abort();
+#endif
+ break;
+ }
+ }
+
+ /*
+ * If rval == 2 then do not update the queue position, but treat the
+ * packet as being ok.
+ */
+ if (rval == 2)
+ rval = 1;
+ else if (rval == 1) {
+ tqe->tqe_state[dir] = nstate;
+ if ((tqe->tqe_flags & TQE_RULEBASED) == 0)
+ fr_movequeue(tqe, tqe->tqe_ifq, tqtab + nstate);
+ }
+
+ return rval;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipstate_log */
+/* Returns: Nil */
+/* Parameters: is(I) - pointer to state structure */
+/* type(I) - type of log entry to create */
+/* */
+/* Creates a state table log entry using the state structure and type info. */
+/* passed in. Log packet/byte counts, source/destination address and other */
+/* protocol specific information. */
+/* ------------------------------------------------------------------------ */
+void ipstate_log(is, type)
+struct ipstate *is;
+u_int type;
+{
+#ifdef IPFILTER_LOG
+ struct ipslog ipsl;
+ size_t sizes[1];
+ void *items[1];
+ int types[1];
+
+ /*
+ * Copy information out of the ipstate_t structure and into the
+ * structure used for logging.
+ */
+ ipsl.isl_type = type;
+ ipsl.isl_pkts[0] = is->is_pkts[0] + is->is_icmppkts[0];
+ ipsl.isl_bytes[0] = is->is_bytes[0];
+ ipsl.isl_pkts[1] = is->is_pkts[1] + is->is_icmppkts[1];
+ ipsl.isl_bytes[1] = is->is_bytes[1];
+ ipsl.isl_pkts[2] = is->is_pkts[2] + is->is_icmppkts[2];
+ ipsl.isl_bytes[2] = is->is_bytes[2];
+ ipsl.isl_pkts[3] = is->is_pkts[3] + is->is_icmppkts[3];
+ ipsl.isl_bytes[3] = is->is_bytes[3];
+ ipsl.isl_src = is->is_src;
+ ipsl.isl_dst = is->is_dst;
+ ipsl.isl_p = is->is_p;
+ ipsl.isl_v = is->is_v;
+ ipsl.isl_flags = is->is_flags;
+ ipsl.isl_tag = is->is_tag;
+ ipsl.isl_rulen = is->is_rulen;
+ (void) strncpy(ipsl.isl_group, is->is_group, FR_GROUPLEN);
+
+ if (ipsl.isl_p == IPPROTO_TCP || ipsl.isl_p == IPPROTO_UDP) {
+ ipsl.isl_sport = is->is_sport;
+ ipsl.isl_dport = is->is_dport;
+ if (ipsl.isl_p == IPPROTO_TCP) {
+ ipsl.isl_state[0] = is->is_state[0];
+ ipsl.isl_state[1] = is->is_state[1];
+ }
+ } else if (ipsl.isl_p == IPPROTO_ICMP) {
+ ipsl.isl_itype = is->is_icmp.ici_type;
+ } else if (ipsl.isl_p == IPPROTO_ICMPV6) {
+ ipsl.isl_itype = is->is_icmp.ici_type;
+ } else {
+ ipsl.isl_ps.isl_filler[0] = 0;
+ ipsl.isl_ps.isl_filler[1] = 0;
+ }
+
+ items[0] = &ipsl;
+ sizes[0] = sizeof(ipsl);
+ types[0] = 0;
+
+ if (ipllog(IPL_LOGSTATE, NULL, items, sizes, types, 1)) {
+ ATOMIC_INCL(ips_stats.iss_logged);
+ } else {
+ ATOMIC_INCL(ips_stats.iss_logfail);
+ }
+#endif
+}
+
+
+#ifdef USE_INET6
+/* ------------------------------------------------------------------------ */
+/* Function: fr_checkicmp6matchingstate */
+/* Returns: ipstate_t* - NULL == no match found, */
+/* else pointer to matching state entry */
+/* Parameters: fin(I) - pointer to packet information */
+/* Locks: NULL == no locks, else Read Lock on ipf_state */
+/* */
+/* If we've got an ICMPv6 error message, using the information stored in */
+/* the ICMPv6 packet, look for a matching state table entry. */
+/* ------------------------------------------------------------------------ */
+static ipstate_t *fr_checkicmp6matchingstate(fin)
+fr_info_t *fin;
+{
+ struct icmp6_hdr *ic6, *oic;
+ int type, backward, i;
+ ipstate_t *is, **isp;
+ u_short sport, dport;
+ i6addr_t dst, src;
+ u_short savelen;
+ icmpinfo_t *ic;
+ fr_info_t ofin;
+ tcphdr_t *tcp;
+ ip6_t *oip6;
+ u_char pr;
+ u_int hv;
+
+ /*
+ * Does it at least have the return (basic) IP header ?
+ * Is it an actual recognised ICMP error type?
+ * Only a basic IP header (no options) should be with
+ * an ICMP error header.
+ */
+ if ((fin->fin_v != 6) || (fin->fin_plen < ICMP6ERR_MINPKTLEN) ||
+ !(fin->fin_flx & FI_ICMPERR))
+ return NULL;
+
+ ic6 = fin->fin_dp;
+ type = ic6->icmp6_type;
+
+ oip6 = (ip6_t *)((char *)ic6 + ICMPERR_ICMPHLEN);
+ if (fin->fin_plen < sizeof(*oip6))
+ return NULL;
+
+ bcopy((char *)fin, (char *)&ofin, sizeof(*fin));
+ ofin.fin_v = 6;
+ ofin.fin_ifp = fin->fin_ifp;
+ ofin.fin_out = !fin->fin_out;
+ ofin.fin_m = NULL; /* if dereferenced, panic XXX */
+ ofin.fin_mp = NULL; /* if dereferenced, panic XXX */
+
+ /*
+ * We make a fin entry to be able to feed it to
+ * matchsrcdst. Note that not all fields are necessary
+ * but this is the cleanest way. Note further we fill
+ * in fin_mp such that if someone uses it we'll get
+ * a kernel panic. fr_matchsrcdst does not use this.
+ *
+ * watch out here, as ip is in host order and oip6 in network
+ * order. Any change we make must be undone afterwards.
+ */
+ savelen = oip6->ip6_plen;
+ oip6->ip6_plen = fin->fin_dlen - ICMPERR_ICMPHLEN;
+ ofin.fin_flx = FI_NOCKSUM;
+ ofin.fin_ip = (ip_t *)oip6;
+ (void) fr_makefrip(sizeof(*oip6), (ip_t *)oip6, &ofin);
+ ofin.fin_flx &= ~(FI_BAD|FI_SHORT);
+ oip6->ip6_plen = savelen;
+
+ if (oip6->ip6_nxt == IPPROTO_ICMPV6) {
+ oic = (struct icmp6_hdr *)(oip6 + 1);
+ /*
+ * an ICMP error can only be generated as a result of an
+ * ICMP query, not as the response on an ICMP error
+ *
+ * XXX theoretically ICMP_ECHOREP and the other reply's are
+ * ICMP query's as well, but adding them here seems strange XXX
+ */
+ if (!(oic->icmp6_type & ICMP6_INFOMSG_MASK))
+ return NULL;
+
+ /*
+ * perform a lookup of the ICMP packet in the state table
+ */
+ hv = (pr = oip6->ip6_nxt);
+ src.in6 = oip6->ip6_src;
+ hv += src.in4.s_addr;
+ dst.in6 = oip6->ip6_dst;
+ hv += dst.in4.s_addr;
+ hv += oic->icmp6_id;
+ hv += oic->icmp6_seq;
+ hv = DOUBLE_HASH(hv);
+
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hv]; ((is = *isp) != NULL); ) {
+ ic = &is->is_icmp;
+ isp = &is->is_hnext;
+ if ((is->is_p == pr) &&
+ !(is->is_pass & FR_NOICMPERR) &&
+ (oic->icmp6_id == ic->ici_id) &&
+ (oic->icmp6_seq == ic->ici_seq) &&
+ (is = fr_matchsrcdst(&ofin, is, &src,
+ &dst, NULL, FI_ICMPCMP))) {
+ /*
+ * in the state table ICMP query's are stored
+ * with the type of the corresponding ICMP
+ * response. Correct here
+ */
+ if (((ic->ici_type == ICMP6_ECHO_REPLY) &&
+ (oic->icmp6_type == ICMP6_ECHO_REQUEST)) ||
+ (ic->ici_type - 1 == oic->icmp6_type )) {
+ ips_stats.iss_hits++;
+ backward = IP6_NEQ(&is->is_dst, &src);
+ fin->fin_rev = !backward;
+ i = (backward << 1) + fin->fin_out;
+ is->is_icmppkts[i]++;
+ return is;
+ }
+ }
+ }
+ RWLOCK_EXIT(&ipf_state);
+ return NULL;
+ }
+
+ hv = (pr = oip6->ip6_nxt);
+ src.in6 = oip6->ip6_src;
+ hv += src.i6[0];
+ hv += src.i6[1];
+ hv += src.i6[2];
+ hv += src.i6[3];
+ dst.in6 = oip6->ip6_dst;
+ hv += dst.i6[0];
+ hv += dst.i6[1];
+ hv += dst.i6[2];
+ hv += dst.i6[3];
+
+ if ((oip6->ip6_nxt == IPPROTO_TCP) || (oip6->ip6_nxt == IPPROTO_UDP)) {
+ tcp = (tcphdr_t *)(oip6 + 1);
+ dport = tcp->th_dport;
+ sport = tcp->th_sport;
+ hv += dport;
+ hv += sport;
+ } else
+ tcp = NULL;
+ hv = DOUBLE_HASH(hv);
+
+ READ_ENTER(&ipf_state);
+ for (isp = &ips_table[hv]; ((is = *isp) != NULL); ) {
+ isp = &is->is_hnext;
+ /*
+ * Only allow this icmp though if the
+ * encapsulated packet was allowed through the
+ * other way around. Note that the minimal amount
+ * of info present does not allow for checking against
+ * tcp internals such as seq and ack numbers.
+ */
+ if ((is->is_p != pr) || (is->is_v != 6) ||
+ (is->is_pass & FR_NOICMPERR))
+ continue;
+ is = fr_matchsrcdst(&ofin, is, &src, &dst, tcp, FI_ICMPCMP);
+ if (is != NULL) {
+ ips_stats.iss_hits++;
+ backward = IP6_NEQ(&is->is_dst, &src);
+ fin->fin_rev = !backward;
+ i = (backward << 1) + fin->fin_out;
+ is->is_icmppkts[i]++;
+ /*
+ * we deliberately do not touch the timeouts
+ * for the accompanying state table entry.
+ * It remains to be seen if that is correct. XXX
+ */
+ return is;
+ }
+ }
+ RWLOCK_EXIT(&ipf_state);
+ return NULL;
+}
+#endif
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_sttab_init */
+/* Returns: Nil */
+/* Parameters: tqp(I) - pointer to an array of timeout queues for TCP */
+/* */
+/* Initialise the array of timeout queues for TCP. */
+/* ------------------------------------------------------------------------ */
+void fr_sttab_init(tqp)
+ipftq_t *tqp;
+{
+ int i;
+
+ for (i = IPF_TCP_NSTATES - 1; i >= 0; i--) {
+ tqp[i].ifq_ttl = 0;
+ tqp[i].ifq_ref = 1;
+ tqp[i].ifq_head = NULL;
+ tqp[i].ifq_tail = &tqp[i].ifq_head;
+ tqp[i].ifq_next = tqp + i + 1;
+ MUTEX_INIT(&tqp[i].ifq_lock, "ipftq tcp tab");
+ }
+ tqp[IPF_TCP_NSTATES - 1].ifq_next = NULL;
+ tqp[IPF_TCPS_CLOSED].ifq_ttl = fr_tcpclosed;
+ tqp[IPF_TCPS_LISTEN].ifq_ttl = fr_tcptimeout;
+ tqp[IPF_TCPS_SYN_SENT].ifq_ttl = fr_tcptimeout;
+ tqp[IPF_TCPS_SYN_RECEIVED].ifq_ttl = fr_tcptimeout;
+ tqp[IPF_TCPS_ESTABLISHED].ifq_ttl = fr_tcpidletimeout;
+ tqp[IPF_TCPS_CLOSE_WAIT].ifq_ttl = fr_tcphalfclosed;
+ tqp[IPF_TCPS_FIN_WAIT_1].ifq_ttl = fr_tcphalfclosed;
+ tqp[IPF_TCPS_CLOSING].ifq_ttl = fr_tcptimeout;
+ tqp[IPF_TCPS_LAST_ACK].ifq_ttl = fr_tcplastack;
+ tqp[IPF_TCPS_FIN_WAIT_2].ifq_ttl = fr_tcpclosewait;
+ tqp[IPF_TCPS_TIME_WAIT].ifq_ttl = fr_tcptimewait;
+ tqp[IPF_TCPS_HALF_ESTAB].ifq_ttl = fr_tcptimeout;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_sttab_destroy */
+/* Returns: Nil */
+/* Parameters: tqp(I) - pointer to an array of timeout queues for TCP */
+/* */
+/* Do whatever is necessary to "destroy" each of the entries in the array */
+/* of timeout queues for TCP. */
+/* ------------------------------------------------------------------------ */
+void fr_sttab_destroy(tqp)
+ipftq_t *tqp;
+{
+ int i;
+
+ for (i = IPF_TCP_NSTATES - 1; i >= 0; i--)
+ MUTEX_DESTROY(&tqp[i].ifq_lock);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_statederef */
+/* Returns: Nil */
+/* Parameters: isp(I) - pointer to pointer to state table entry */
+/* */
+/* Decrement the reference counter for this state table entry and free it */
+/* if there are no more things using it. */
+/* */
+/* When operating in userland (ipftest), we have no timers to clear a state */
+/* entry. Therefore, we make a few simple tests before deleting an entry */
+/* outright. We compare states on each side looking for a combination of */
+/* TIME_WAIT (should really be FIN_WAIT_2?) and LAST_ACK. Then we factor */
+/* in packet direction with the interface list to make sure we don't */
+/* prematurely delete an entry on a final inbound packet that's we're also */
+/* supposed to route elsewhere. */
+/* */
+/* Internal parameters: */
+/* state[0] = state of source (host that initiated connection) */
+/* state[1] = state of dest (host that accepted the connection) */
+/* */
+/* dir == 0 : a packet from source to dest */
+/* dir == 1 : a packet from dest to source */
+/* ------------------------------------------------------------------------ */
+void fr_statederef(isp)
+ipstate_t **isp;
+{
+ ipstate_t *is;
+
+ is = *isp;
+ *isp = NULL;
+ WRITE_ENTER(&ipf_state);
+ is->is_ref--;
+ if (is->is_ref == 0) {
+ is->is_ref++; /* To counter ref-- in fr_delstate() */
+ fr_delstate(is, ISL_EXPIRE);
+#ifndef _KERNEL
+ } else if ((is->is_sti.tqe_state[0] > IPF_TCPS_ESTABLISHED) ||
+ (is->is_sti.tqe_state[1] > IPF_TCPS_ESTABLISHED)) {
+ fr_delstate(is, ISL_ORPHAN);
+#endif
+ }
+ RWLOCK_EXIT(&ipf_state);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_setstatequeue */
+/* Returns: Nil */
+/* Parameters: is(I) - pointer to state structure */
+/* rev(I) - forward(0) or reverse(1) direction */
+/* Locks: ipf_state (read or write) */
+/* */
+/* Put the state entry on its default queue entry, using rev as a helped in */
+/* determining which queue it should be placed on. */
+/* ------------------------------------------------------------------------ */
+void fr_setstatequeue(is, rev)
+ipstate_t *is;
+int rev;
+{
+ ipftq_t *oifq, *nifq;
+
+
+ if ((is->is_sti.tqe_flags & TQE_RULEBASED) != 0)
+ nifq = is->is_tqehead[rev];
+ else
+ nifq = NULL;
+
+ if (nifq == NULL) {
+ switch (is->is_p)
+ {
+#ifdef USE_INET6
+ case IPPROTO_ICMPV6 :
+ if (rev == 1)
+ nifq = &ips_icmpacktq;
+ else
+ nifq = &ips_icmptq;
+ break;
+#endif
+ case IPPROTO_ICMP :
+ if (rev == 1)
+ nifq = &ips_icmpacktq;
+ else
+ nifq = &ips_icmptq;
+ break;
+ case IPPROTO_TCP :
+ nifq = ips_tqtqb + is->is_state[rev];
+ break;
+
+ case IPPROTO_UDP :
+ if (rev == 1)
+ nifq = &ips_udpacktq;
+ else
+ nifq = &ips_udptq;
+ break;
+
+ default :
+ nifq = &ips_iptq;
+ break;
+ }
+ }
+
+ oifq = is->is_sti.tqe_ifq;
+ /*
+ * If it's currently on a timeout queue, move it from one queue to
+ * another, else put it on the end of the newly determined queue.
+ */
+ if (oifq != NULL)
+ fr_movequeue(&is->is_sti, oifq, nifq);
+ else
+ fr_queueappend(&is->is_sti, nifq, is);
+ return;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_stateiter */
+/* Returns: int - 0 == success, else error */
+/* Parameters: token(I) - pointer to ipftoken structure */
+/* itp(I) - pointer to ipfgeniter structure */
+/* */
+/* This function handles the SIOCGENITER ioctl for the state tables and */
+/* walks through the list of entries in the state table list (ips_list.) */
+/* ------------------------------------------------------------------------ */
+static int fr_stateiter(token, itp)
+ipftoken_t *token;
+ipfgeniter_t *itp;
+{
+ ipstate_t *is, *next, zero;
+ int error, count;
+ char *dst;
+
+ if (itp->igi_data == NULL)
+ return EFAULT;
+
+ if (itp->igi_nitems == 0)
+ return ENOSPC;
+
+ if (itp->igi_type != IPFGENITER_STATE)
+ return EINVAL;
+
+ is = token->ipt_data;
+ if (is == (void *)-1) {
+ ipf_freetoken(token);
+ return ESRCH;
+ }
+
+ error = 0;
+ dst = itp->igi_data;
+
+ READ_ENTER(&ipf_state);
+ if (is == NULL) {
+ next = ips_list;
+ } else {
+ next = is->is_next;
+ }
+
+ for (count = itp->igi_nitems; count > 0; count--) {
+ if (next != NULL) {
+ /*
+ * If we find a state entry to use, bump its
+ * reference count so that it can be used for
+ * is_next when we come back.
+ */
+ MUTEX_ENTER(&next->is_lock);
+ next->is_ref++;
+ MUTEX_EXIT(&next->is_lock);
+ token->ipt_data = next;
+ } else {
+ bzero(&zero, sizeof(zero));
+ next = &zero;
+ token->ipt_data = (void *)-1;
+ count = 1;
+ }
+ RWLOCK_EXIT(&ipf_state);
+
+ /*
+ * If we had a prior pointer to a state entry, release it.
+ */
+ if (is != NULL) {
+ fr_statederef(&is);
+ }
+
+ /*
+ * This should arguably be via fr_outobj() so that the state
+ * structure can (if required) be massaged going out.
+ */
+ error = COPYOUT(next, dst, sizeof(*next));
+ if (error != 0)
+ error = EFAULT;
+ if ((count == 1) || (error != 0))
+ break;
+
+ dst += sizeof(*next);
+ READ_ENTER(&ipf_state);
+ is = next;
+ next = is->is_next;
+ }
+
+ return error;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_stgettable */
+/* Returns: int - 0 = success, else error */
+/* Parameters: data(I) - pointer to ioctl data */
+/* */
+/* This function handles ioctl requests for tables of state information. */
+/* At present the only table it deals with is the hash bucket statistics. */
+/* ------------------------------------------------------------------------ */
+static int fr_stgettable(data)
+char *data;
+{
+ ipftable_t table;
+ int error;
+
+ error = fr_inobj(data, &table, IPFOBJ_GTABLE);
+ if (error != 0)
+ return error;
+
+ if (table.ita_type != IPFTABLE_BUCKETS)
+ return EINVAL;
+
+ error = COPYOUT(ips_stats.iss_bucketlen, table.ita_table,
+ fr_statesize * sizeof(u_long));
+ if (error != 0)
+ error = EFAULT;
+ return error;
+}
diff --git a/sys/contrib/ipfilter/netinet/ip_state.h b/sys/contrib/ipfilter/netinet/ip_state.h
new file mode 100644
index 0000000..ca7e454
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_state.h
@@ -0,0 +1,263 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1995-2001 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * @(#)ip_state.h 1.3 1/12/96 (C) 1995 Darren Reed
+ * $FreeBSD$
+ * Id: ip_state.h,v 2.68.2.3 2005/03/03 14:24:11 darrenr Exp
+ */
+#ifndef __IP_STATE_H__
+#define __IP_STATE_H__
+
+#if defined(__STDC__) || defined(__GNUC__) || defined(_AIX51)
+# define SIOCDELST _IOW('r', 61, struct ipfobj)
+#else
+# define SIOCDELST _IOW(r, 61, struct ipfobj)
+#endif
+
+struct ipscan;
+
+#ifndef IPSTATE_SIZE
+# define IPSTATE_SIZE 5737
+#endif
+#ifndef IPSTATE_MAX
+# define IPSTATE_MAX 4013 /* Maximum number of states held */
+#endif
+
+#define PAIRS(s1,d1,s2,d2) ((((s1) == (s2)) && ((d1) == (d2))) ||\
+ (((s1) == (d2)) && ((d1) == (s2))))
+#define IPPAIR(s1,d1,s2,d2) PAIRS((s1).s_addr, (d1).s_addr, \
+ (s2).s_addr, (d2).s_addr)
+
+
+typedef struct ipstate {
+ ipfmutex_t is_lock;
+ struct ipstate *is_next;
+ struct ipstate **is_pnext;
+ struct ipstate *is_hnext;
+ struct ipstate **is_phnext;
+ struct ipstate **is_me;
+ void *is_ifp[4];
+ void *is_sync;
+ frentry_t *is_rule;
+ struct ipftq *is_tqehead[2];
+ struct ipscan *is_isc;
+ U_QUAD_T is_pkts[4];
+ U_QUAD_T is_bytes[4];
+ U_QUAD_T is_icmppkts[4];
+ struct ipftqent is_sti;
+ u_int is_frage[2];
+ int is_ref; /* reference count */
+ int is_isninc[2];
+ u_short is_sumd[2];
+ i6addr_t is_src;
+ i6addr_t is_dst;
+ u_int is_pass;
+ u_char is_p; /* Protocol */
+ u_char is_v;
+ u_32_t is_hv;
+ u_32_t is_tag;
+ u_32_t is_opt[2]; /* packet options set */
+ u_32_t is_optmsk[2]; /* " " mask */
+ u_short is_sec; /* security options set */
+ u_short is_secmsk; /* " " mask */
+ u_short is_auth; /* authentication options set */
+ u_short is_authmsk; /* " " mask */
+ union {
+ icmpinfo_t is_ics;
+ tcpinfo_t is_ts;
+ udpinfo_t is_us;
+ greinfo_t is_ug;
+ } is_ps;
+ u_32_t is_flags;
+ int is_flx[2][2];
+ u_32_t is_rulen; /* rule number when created */
+ u_32_t is_s0[2];
+ u_short is_smsk[2];
+ char is_group[FR_GROUPLEN];
+ char is_sbuf[2][16];
+ char is_ifname[4][LIFNAMSIZ];
+} ipstate_t;
+
+#define is_die is_sti.tqe_die
+#define is_state is_sti.tqe_state
+#define is_touched is_sti.tqe_touched
+#define is_saddr is_src.in4.s_addr
+#define is_daddr is_dst.in4.s_addr
+#define is_icmp is_ps.is_ics
+#define is_type is_icmp.ici_type
+#define is_code is_icmp.ici_code
+#define is_tcp is_ps.is_ts
+#define is_udp is_ps.is_us
+#define is_send is_tcp.ts_data[0].td_end
+#define is_dend is_tcp.ts_data[1].td_end
+#define is_maxswin is_tcp.ts_data[0].td_maxwin
+#define is_maxdwin is_tcp.ts_data[1].td_maxwin
+#define is_maxsend is_tcp.ts_data[0].td_maxend
+#define is_maxdend is_tcp.ts_data[1].td_maxend
+#define is_swinscale is_tcp.ts_data[0].td_winscale
+#define is_dwinscale is_tcp.ts_data[1].td_winscale
+#define is_swinflags is_tcp.ts_data[0].td_winflags
+#define is_dwinflags is_tcp.ts_data[1].td_winflags
+#define is_sport is_tcp.ts_sport
+#define is_dport is_tcp.ts_dport
+#define is_ifpin is_ifp[0]
+#define is_ifpout is_ifp[2]
+#define is_gre is_ps.is_ug
+#define is_call is_gre.gs_call
+
+#define IS_WSPORT SI_W_SPORT /* 0x00100 */
+#define IS_WDPORT SI_W_DPORT /* 0x00200 */
+#define IS_WSADDR SI_W_SADDR /* 0x00400 */
+#define IS_WDADDR SI_W_DADDR /* 0x00800 */
+#define IS_NEWFR SI_NEWFR /* 0x01000 */
+#define IS_CLONE SI_CLONE /* 0x02000 */
+#define IS_CLONED SI_CLONED /* 0x04000 */
+#define IS_TCPFSM 0x10000
+#define IS_STRICT 0x20000
+#define IS_ISNSYN 0x40000
+#define IS_ISNACK 0x80000
+#define IS_STATESYNC 0x100000
+/*
+ * IS_SC flags are for scan-operations that need to be recognised in state.
+ */
+#define IS_SC_CLIENT 0x10000000
+#define IS_SC_SERVER 0x20000000
+#define IS_SC_MATCHC 0x40000000
+#define IS_SC_MATCHS 0x80000000
+#define IS_SC_MATCHALL (IS_SC_MATCHC|IS_SC_MATCHC)
+#define IS_SC_ALL (IS_SC_MATCHC|IS_SC_MATCHC|IS_SC_CLIENT|IS_SC_SERVER)
+
+/*
+ * Flags that can be passed into fr_addstate
+ */
+#define IS_INHERITED 0x0fffff00
+
+#define TH_OPENING (TH_SYN|TH_ACK)
+/*
+ * is_flags:
+ * Bits 0 - 3 are use as a mask with the current packet's bits to check for
+ * whether it is short, tcp/udp, a fragment or the presence of IP options.
+ * Bits 4 - 7 are set from the initial packet and contain what the packet
+ * anded with bits 0-3 must match.
+ * Bits 8,9 are used to indicate wildcard source/destination port matching.
+ * Bits 10,11 are reserved for other wildcard flag compatibility.
+ * Bits 12,13 are for scaning.
+ */
+
+typedef struct ipstate_save {
+ void *ips_next;
+ struct ipstate ips_is;
+ struct frentry ips_fr;
+} ipstate_save_t;
+
+#define ips_rule ips_is.is_rule
+
+
+typedef struct ipslog {
+ U_QUAD_T isl_pkts[4];
+ U_QUAD_T isl_bytes[4];
+ i6addr_t isl_src;
+ i6addr_t isl_dst;
+ u_32_t isl_tag;
+ u_short isl_type;
+ union {
+ u_short isl_filler[2];
+ u_short isl_ports[2];
+ u_short isl_icmp;
+ } isl_ps;
+ u_char isl_v;
+ u_char isl_p;
+ u_char isl_flags;
+ u_char isl_state[2];
+ u_32_t isl_rulen;
+ char isl_group[FR_GROUPLEN];
+} ipslog_t;
+
+#define isl_sport isl_ps.isl_ports[0]
+#define isl_dport isl_ps.isl_ports[1]
+#define isl_itype isl_ps.isl_icmp
+
+#define ISL_NEW 0
+#define ISL_CLONE 1
+#define ISL_EXPIRE 0xffff
+#define ISL_FLUSH 0xfffe
+#define ISL_REMOVE 0xfffd
+#define ISL_INTERMEDIATE 0xfffc
+#define ISL_KILLED 0xfffb
+#define ISL_ORPHAN 0xfffa
+#define ISL_UNLOAD 0xfff9
+
+
+typedef struct ips_stat {
+ u_long iss_hits;
+ u_long iss_miss;
+ u_long iss_max;
+ u_long iss_maxref;
+ u_long iss_tcp;
+ u_long iss_udp;
+ u_long iss_icmp;
+ u_long iss_nomem;
+ u_long iss_expire;
+ u_long iss_fin;
+ u_long iss_active;
+ u_long iss_logged;
+ u_long iss_logfail;
+ u_long iss_inuse;
+ u_long iss_wild;
+ u_long iss_killed;
+ u_long iss_ticks;
+ u_long iss_bucketfull;
+ int iss_statesize;
+ int iss_statemax;
+ ipstate_t **iss_table;
+ ipstate_t *iss_list;
+ u_long *iss_bucketlen;
+ ipftq_t *iss_tcptab;
+} ips_stat_t;
+
+
+extern u_long fr_tcpidletimeout;
+extern u_long fr_tcpclosewait;
+extern u_long fr_tcplastack;
+extern u_long fr_tcptimeout;
+extern u_long fr_tcpclosed;
+extern u_long fr_tcphalfclosed;
+extern u_long fr_udptimeout;
+extern u_long fr_udpacktimeout;
+extern u_long fr_icmptimeout;
+extern u_long fr_icmpacktimeout;
+extern u_long fr_iptimeout;
+extern int fr_statemax;
+extern int fr_statesize;
+extern int fr_state_lock;
+extern int fr_state_maxbucket;
+extern int fr_state_maxbucket_reset;
+extern ipstate_t *ips_list;
+extern ipftq_t *ips_utqe;
+extern ipftq_t ips_tqtqb[IPF_TCP_NSTATES];
+
+extern int fr_stateinit __P((void));
+extern ipstate_t *fr_addstate __P((fr_info_t *, ipstate_t **, u_int));
+extern frentry_t *fr_checkstate __P((struct fr_info *, u_32_t *));
+extern ipstate_t *fr_stlookup __P((fr_info_t *, tcphdr_t *, ipftq_t **));
+extern void fr_statesync __P((void *));
+extern void fr_timeoutstate __P((void));
+extern int fr_tcp_age __P((struct ipftqent *, struct fr_info *,
+ struct ipftq *, int));
+extern int fr_tcpinwindow __P((struct fr_info *, struct tcpdata *,
+ struct tcpdata *, tcphdr_t *, int));
+extern void fr_stateunload __P((void));
+extern void ipstate_log __P((struct ipstate *, u_int));
+extern int fr_state_ioctl __P((caddr_t, ioctlcmd_t, int, int, void *));
+extern void fr_stinsert __P((struct ipstate *, int));
+extern void fr_sttab_init __P((struct ipftq *));
+extern void fr_sttab_destroy __P((struct ipftq *));
+extern void fr_updatestate __P((fr_info_t *, ipstate_t *, ipftq_t *));
+extern void fr_statederef __P((ipstate_t **));
+extern void fr_setstatequeue __P((ipstate_t *, int));
+
+#endif /* __IP_STATE_H__ */
diff --git a/sys/contrib/ipfilter/netinet/ip_sync.c b/sys/contrib/ipfilter/netinet/ip_sync.c
new file mode 100644
index 0000000..6b277ae
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_sync.c
@@ -0,0 +1,1020 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1995-1998 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+#if defined(KERNEL) || defined(_KERNEL)
+# undef KERNEL
+# undef _KERNEL
+# define KERNEL 1
+# define _KERNEL 1
+#endif
+#include <sys/errno.h>
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/file.h>
+#if !defined(_KERNEL) && !defined(__KERNEL__)
+# include <stdio.h>
+# include <stdlib.h>
+# include <string.h>
+# define _KERNEL
+# define KERNEL
+# ifdef __OpenBSD__
+struct file;
+# endif
+# include <sys/uio.h>
+# undef _KERNEL
+# undef KERNEL
+#else
+# include <sys/systm.h>
+# if !defined(__SVR4) && !defined(__svr4__)
+# include <sys/mbuf.h>
+# endif
+#endif
+#if defined(__NetBSD__) && (__NetBSD_Version__ >= 104000000)
+# include <sys/proc.h>
+#endif
+#if defined(_KERNEL) && (__FreeBSD_version >= 220000)
+# include <sys/filio.h>
+# include <sys/fcntl.h>
+# if (__FreeBSD_version >= 300000) && !defined(IPFILTER_LKM)
+# include "opt_ipfilter.h"
+# endif
+#else
+# include <sys/ioctl.h>
+#endif
+#include <sys/time.h>
+#if !defined(linux)
+# include <sys/protosw.h>
+#endif
+#include <sys/socket.h>
+#if defined(__SVR4) || defined(__svr4__)
+# include <sys/filio.h>
+# include <sys/byteorder.h>
+# ifdef _KERNEL
+# include <sys/dditypes.h>
+# endif
+# include <sys/stream.h>
+# include <sys/kmem.h>
+#endif
+
+#include <net/if.h>
+#ifdef sun
+# include <net/af.h>
+#endif
+#include <net/route.h>
+#include <netinet/in.h>
+#include <netinet/in_systm.h>
+#include <netinet/ip.h>
+#include <netinet/tcp.h>
+#if !defined(linux)
+# include <netinet/ip_var.h>
+#endif
+#if !defined(__hpux) && !defined(linux)
+# include <netinet/tcp_fsm.h>
+#endif
+#include <netinet/udp.h>
+#include <netinet/ip_icmp.h>
+#include "netinet/ip_compat.h"
+#include <netinet/tcpip.h>
+#include "netinet/ip_fil.h"
+#include "netinet/ip_nat.h"
+#include "netinet/ip_frag.h"
+#include "netinet/ip_state.h"
+#include "netinet/ip_proxy.h"
+#include "netinet/ip_sync.h"
+#ifdef USE_INET6
+#include <netinet/icmp6.h>
+#endif
+#if (__FreeBSD_version >= 300000)
+# include <sys/malloc.h>
+# if defined(_KERNEL) && !defined(IPFILTER_LKM)
+# include <sys/libkern.h>
+# include <sys/systm.h>
+# endif
+#endif
+/* END OF INCLUDES */
+
+#if !defined(lint)
+static const char rcsid[] = "@(#)$Id: ip_sync.c,v 2.40.2.8 2006/07/14 06:12:20 darrenr Exp $";
+#endif
+
+#define SYNC_STATETABSZ 256
+#define SYNC_NATTABSZ 256
+
+#ifdef IPFILTER_SYNC
+ipfmutex_t ipf_syncadd, ipsl_mutex;
+ipfrwlock_t ipf_syncstate, ipf_syncnat;
+#if SOLARIS && defined(_KERNEL)
+kcondvar_t ipslwait;
+#endif
+synclist_t *syncstatetab[SYNC_STATETABSZ];
+synclist_t *syncnattab[SYNC_NATTABSZ];
+synclogent_t synclog[SYNCLOG_SZ];
+syncupdent_t syncupd[SYNCLOG_SZ];
+u_int ipf_syncnum = 1;
+u_int ipf_syncwrap = 0;
+u_int sl_idx = 0, /* next available sync log entry */
+ su_idx = 0, /* next available sync update entry */
+ sl_tail = 0, /* next sync log entry to read */
+ su_tail = 0; /* next sync update entry to read */
+int ipf_sync_debug = 0;
+
+
+# if !defined(sparc) && !defined(__hppa)
+void ipfsync_tcporder __P((int, struct tcpdata *));
+void ipfsync_natorder __P((int, struct nat *));
+void ipfsync_storder __P((int, struct ipstate *));
+# endif
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_init */
+/* Returns: int - 0 == success, -1 == failure */
+/* Parameters: Nil */
+/* */
+/* Initialise all of the locks required for the sync code and initialise */
+/* any data structures, as required. */
+/* ------------------------------------------------------------------------ */
+int ipfsync_init()
+{
+ RWLOCK_INIT(&ipf_syncstate, "add things to state sync table");
+ RWLOCK_INIT(&ipf_syncnat, "add things to nat sync table");
+ MUTEX_INIT(&ipf_syncadd, "add things to sync table");
+ MUTEX_INIT(&ipsl_mutex, "add things to sync table");
+# if SOLARIS && defined(_KERNEL)
+ cv_init(&ipslwait, "ipsl condvar", CV_DRIVER, NULL);
+# endif
+
+ bzero((char *)syncnattab, sizeof(syncnattab));
+ bzero((char *)syncstatetab, sizeof(syncstatetab));
+
+ return 0;
+}
+
+
+# if !defined(sparc) && !defined(__hppa)
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_tcporder */
+/* Returns: Nil */
+/* Parameters: way(I) - direction of byte order conversion. */
+/* td(IO) - pointer to data to be converted. */
+/* */
+/* Do byte swapping on values in the TCP state information structure that */
+/* need to be used at both ends by the host in their native byte order. */
+/* ------------------------------------------------------------------------ */
+void ipfsync_tcporder(way, td)
+int way;
+tcpdata_t *td;
+{
+ if (way) {
+ td->td_maxwin = htons(td->td_maxwin);
+ td->td_end = htonl(td->td_end);
+ td->td_maxend = htonl(td->td_maxend);
+ } else {
+ td->td_maxwin = ntohs(td->td_maxwin);
+ td->td_end = ntohl(td->td_end);
+ td->td_maxend = ntohl(td->td_maxend);
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_natorder */
+/* Returns: Nil */
+/* Parameters: way(I) - direction of byte order conversion. */
+/* nat(IO) - pointer to data to be converted. */
+/* */
+/* Do byte swapping on values in the NAT data structure that need to be */
+/* used at both ends by the host in their native byte order. */
+/* ------------------------------------------------------------------------ */
+void ipfsync_natorder(way, n)
+int way;
+nat_t *n;
+{
+ if (way) {
+ n->nat_age = htonl(n->nat_age);
+ n->nat_flags = htonl(n->nat_flags);
+ n->nat_ipsumd = htonl(n->nat_ipsumd);
+ n->nat_use = htonl(n->nat_use);
+ n->nat_dir = htonl(n->nat_dir);
+ } else {
+ n->nat_age = ntohl(n->nat_age);
+ n->nat_flags = ntohl(n->nat_flags);
+ n->nat_ipsumd = ntohl(n->nat_ipsumd);
+ n->nat_use = ntohl(n->nat_use);
+ n->nat_dir = ntohl(n->nat_dir);
+ }
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_storder */
+/* Returns: Nil */
+/* Parameters: way(I) - direction of byte order conversion. */
+/* ips(IO) - pointer to data to be converted. */
+/* */
+/* Do byte swapping on values in the IP state data structure that need to */
+/* be used at both ends by the host in their native byte order. */
+/* ------------------------------------------------------------------------ */
+void ipfsync_storder(way, ips)
+int way;
+ipstate_t *ips;
+{
+ ipfsync_tcporder(way, &ips->is_tcp.ts_data[0]);
+ ipfsync_tcporder(way, &ips->is_tcp.ts_data[1]);
+
+ if (way) {
+ ips->is_hv = htonl(ips->is_hv);
+ ips->is_die = htonl(ips->is_die);
+ ips->is_pass = htonl(ips->is_pass);
+ ips->is_flags = htonl(ips->is_flags);
+ ips->is_opt[0] = htonl(ips->is_opt[0]);
+ ips->is_opt[1] = htonl(ips->is_opt[1]);
+ ips->is_optmsk[0] = htonl(ips->is_optmsk[0]);
+ ips->is_optmsk[1] = htonl(ips->is_optmsk[1]);
+ ips->is_sec = htons(ips->is_sec);
+ ips->is_secmsk = htons(ips->is_secmsk);
+ ips->is_auth = htons(ips->is_auth);
+ ips->is_authmsk = htons(ips->is_authmsk);
+ ips->is_s0[0] = htonl(ips->is_s0[0]);
+ ips->is_s0[1] = htonl(ips->is_s0[1]);
+ ips->is_smsk[0] = htons(ips->is_smsk[0]);
+ ips->is_smsk[1] = htons(ips->is_smsk[1]);
+ } else {
+ ips->is_hv = ntohl(ips->is_hv);
+ ips->is_die = ntohl(ips->is_die);
+ ips->is_pass = ntohl(ips->is_pass);
+ ips->is_flags = ntohl(ips->is_flags);
+ ips->is_opt[0] = ntohl(ips->is_opt[0]);
+ ips->is_opt[1] = ntohl(ips->is_opt[1]);
+ ips->is_optmsk[0] = ntohl(ips->is_optmsk[0]);
+ ips->is_optmsk[1] = ntohl(ips->is_optmsk[1]);
+ ips->is_sec = ntohs(ips->is_sec);
+ ips->is_secmsk = ntohs(ips->is_secmsk);
+ ips->is_auth = ntohs(ips->is_auth);
+ ips->is_authmsk = ntohs(ips->is_authmsk);
+ ips->is_s0[0] = ntohl(ips->is_s0[0]);
+ ips->is_s0[1] = ntohl(ips->is_s0[1]);
+ ips->is_smsk[0] = ntohl(ips->is_smsk[0]);
+ ips->is_smsk[1] = ntohl(ips->is_smsk[1]);
+ }
+}
+# else /* !defined(sparc) && !defined(__hppa) */
+# define ipfsync_tcporder(x,y)
+# define ipfsync_natorder(x,y)
+# define ipfsync_storder(x,y)
+# endif /* !defined(sparc) && !defined(__hppa) */
+
+/* enable this for debugging */
+
+# ifdef _KERNEL
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_write */
+/* Returns: int - 0 == success, else error value. */
+/* Parameters: uio(I) - pointer to information about data to write */
+/* */
+/* Moves data from user space into the kernel and uses it for updating data */
+/* structures in the state/NAT tables. */
+/* ------------------------------------------------------------------------ */
+int ipfsync_write(uio)
+struct uio *uio;
+{
+ synchdr_t sh;
+
+ /*
+ * THIS MUST BE SUFFICIENT LARGE TO STORE
+ * ANY POSSIBLE DATA TYPE
+ */
+ char data[2048];
+
+ int err = 0;
+
+# if (BSD >= 199306) || defined(__FreeBSD__) || defined(__osf__)
+ uio->uio_rw = UIO_WRITE;
+# endif
+
+ /* Try to get bytes */
+ while (uio->uio_resid > 0) {
+
+ if (uio->uio_resid >= sizeof(sh)) {
+
+ err = UIOMOVE((caddr_t)&sh, sizeof(sh), UIO_WRITE, uio);
+
+ if (err) {
+ if (ipf_sync_debug > 2)
+ printf("uiomove(header) failed: %d\n",
+ err);
+ return err;
+ }
+
+ /* convert to host order */
+ sh.sm_magic = ntohl(sh.sm_magic);
+ sh.sm_len = ntohl(sh.sm_len);
+ sh.sm_num = ntohl(sh.sm_num);
+
+ if (ipf_sync_debug > 8)
+ printf("[%d] Read v:%d p:%d cmd:%d table:%d rev:%d len:%d magic:%x\n",
+ sh.sm_num, sh.sm_v, sh.sm_p, sh.sm_cmd,
+ sh.sm_table, sh.sm_rev, sh.sm_len,
+ sh.sm_magic);
+
+ if (sh.sm_magic != SYNHDRMAGIC) {
+ if (ipf_sync_debug > 2)
+ printf("uiomove(header) invalud %s\n",
+ "magic");
+ return EINVAL;
+ }
+
+ if (sh.sm_v != 4 && sh.sm_v != 6) {
+ if (ipf_sync_debug > 2)
+ printf("uiomove(header) invalid %s\n",
+ "protocol");
+ return EINVAL;
+ }
+
+ if (sh.sm_cmd > SMC_MAXCMD) {
+ if (ipf_sync_debug > 2)
+ printf("uiomove(header) invalid %s\n",
+ "command");
+ return EINVAL;
+ }
+
+
+ if (sh.sm_table > SMC_MAXTBL) {
+ if (ipf_sync_debug > 2)
+ printf("uiomove(header) invalid %s\n",
+ "table");
+ return EINVAL;
+ }
+
+ } else {
+ /* unsufficient data, wait until next call */
+ if (ipf_sync_debug > 2)
+ printf("uiomove(header) insufficient data");
+ return EAGAIN;
+ }
+
+
+ /*
+ * We have a header, so try to read the amount of data
+ * needed for the request
+ */
+
+ /* not supported */
+ if (sh.sm_len == 0) {
+ if (ipf_sync_debug > 2)
+ printf("uiomove(data zero length %s\n",
+ "not supported");
+ return EINVAL;
+ }
+
+ if (uio->uio_resid >= sh.sm_len) {
+
+ err = UIOMOVE((caddr_t)data, sh.sm_len, UIO_WRITE, uio);
+
+ if (err) {
+ if (ipf_sync_debug > 2)
+ printf("uiomove(data) failed: %d\n",
+ err);
+ return err;
+ }
+
+ if (ipf_sync_debug > 7)
+ printf("uiomove(data) %d bytes read\n",
+ sh.sm_len);
+
+ if (sh.sm_table == SMC_STATE)
+ err = ipfsync_state(&sh, data);
+ else if (sh.sm_table == SMC_NAT)
+ err = ipfsync_nat(&sh, data);
+ if (ipf_sync_debug > 7)
+ printf("[%d] Finished with error %d\n",
+ sh.sm_num, err);
+
+ } else {
+ /* insufficient data, wait until next call */
+ if (ipf_sync_debug > 2)
+ printf("uiomove(data) %s %d bytes, got %d\n",
+ "insufficient data, need",
+ sh.sm_len, uio->uio_resid);
+ return EAGAIN;
+ }
+ }
+
+ /* no more data */
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_read */
+/* Returns: int - 0 == success, else error value. */
+/* Parameters: uio(O) - pointer to information about where to store data */
+/* */
+/* This function is called when a user program wants to read some data */
+/* for pending state/NAT updates. If no data is available, the caller is */
+/* put to sleep, pending a wakeup from the "lower half" of this code. */
+/* ------------------------------------------------------------------------ */
+int ipfsync_read(uio)
+struct uio *uio;
+{
+ syncupdent_t *su;
+ synclogent_t *sl;
+ int err = 0;
+
+ if ((uio->uio_resid & 3) || (uio->uio_resid < 8))
+ return EINVAL;
+
+# if (BSD >= 199306) || defined(__FreeBSD__) || defined(__osf__)
+ uio->uio_rw = UIO_READ;
+# endif
+
+ MUTEX_ENTER(&ipsl_mutex);
+ while ((sl_tail == sl_idx) && (su_tail == su_idx)) {
+# if SOLARIS && defined(_KERNEL)
+ if (!cv_wait_sig(&ipslwait, &ipsl_mutex)) {
+ MUTEX_EXIT(&ipsl_mutex);
+ return EINTR;
+ }
+# else
+# ifdef __hpux
+ {
+ lock_t *l;
+
+ l = get_sleep_lock(&sl_tail);
+ err = sleep(&sl_tail, PZERO+1);
+ if (err) {
+ MUTEX_EXIT(&ipsl_mutex);
+ return EINTR;
+ }
+ spinunlock(l);
+ }
+# else /* __hpux */
+# ifdef __osf__
+ err = mpsleep(&sl_tail, PSUSP|PCATCH, "ipl sleep", 0,
+ &ipsl_mutex, MS_LOCK_SIMPLE);
+ if (err)
+ return EINTR;
+# else
+ MUTEX_EXIT(&ipsl_mutex);
+ err = SLEEP(&sl_tail, "ipl sleep");
+ if (err)
+ return EINTR;
+ MUTEX_ENTER(&ipsl_mutex);
+# endif /* __osf__ */
+# endif /* __hpux */
+# endif /* SOLARIS */
+ }
+ MUTEX_EXIT(&ipsl_mutex);
+
+ READ_ENTER(&ipf_syncstate);
+ while ((sl_tail < sl_idx) && (uio->uio_resid > sizeof(*sl))) {
+ sl = synclog + sl_tail++;
+ err = UIOMOVE((caddr_t)sl, sizeof(*sl), UIO_READ, uio);
+ if (err != 0)
+ break;
+ }
+
+ while ((su_tail < su_idx) && (uio->uio_resid > sizeof(*su))) {
+ su = syncupd + su_tail;
+ su_tail++;
+ err = UIOMOVE((caddr_t)su, sizeof(*su), UIO_READ, uio);
+ if (err != 0)
+ break;
+ if (su->sup_hdr.sm_sl != NULL)
+ su->sup_hdr.sm_sl->sl_idx = -1;
+ }
+
+ MUTEX_ENTER(&ipf_syncadd);
+ if (su_tail == su_idx)
+ su_tail = su_idx = 0;
+ if (sl_tail == sl_idx)
+ sl_tail = sl_idx = 0;
+ MUTEX_EXIT(&ipf_syncadd);
+ RWLOCK_EXIT(&ipf_syncstate);
+ return err;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_state */
+/* Returns: int - 0 == success, else error value. */
+/* Parameters: sp(I) - pointer to sync packet data header */
+/* uio(I) - pointer to user data for further information */
+/* */
+/* Updates the state table according to information passed in the sync */
+/* header. As required, more data is fetched from the uio structure but */
+/* varies depending on the contents of the sync header. This function can */
+/* create a new state entry or update one. Deletion is left to the state */
+/* structures being timed out correctly. */
+/* ------------------------------------------------------------------------ */
+int ipfsync_state(sp, data)
+synchdr_t *sp;
+void *data;
+{
+ synctcp_update_t su;
+ ipstate_t *is, sn;
+ synclist_t *sl;
+ frentry_t *fr;
+ u_int hv;
+ int err = 0;
+
+ hv = sp->sm_num & (SYNC_STATETABSZ - 1);
+
+ switch (sp->sm_cmd)
+ {
+ case SMC_CREATE :
+
+ bcopy(data, &sn, sizeof(sn));
+ KMALLOC(is, ipstate_t *);
+ if (is == NULL) {
+ err = ENOMEM;
+ break;
+ }
+
+ KMALLOC(sl, synclist_t *);
+ if (sl == NULL) {
+ err = ENOMEM;
+ KFREE(is);
+ break;
+ }
+
+ bzero((char *)is, offsetof(ipstate_t, is_die));
+ bcopy((char *)&sn.is_die, (char *)&is->is_die,
+ sizeof(*is) - offsetof(ipstate_t, is_die));
+ ipfsync_storder(0, is);
+
+ /*
+ * We need to find the same rule on the slave as was used on
+ * the master to create this state entry.
+ */
+ READ_ENTER(&ipf_mutex);
+ fr = fr_getrulen(IPL_LOGIPF, sn.is_group, sn.is_rulen);
+ if (fr != NULL) {
+ MUTEX_ENTER(&fr->fr_lock);
+ fr->fr_ref++;
+ fr->fr_statecnt++;
+ MUTEX_EXIT(&fr->fr_lock);
+ }
+ RWLOCK_EXIT(&ipf_mutex);
+
+ if (ipf_sync_debug > 4)
+ printf("[%d] Filter rules = %p\n", sp->sm_num, fr);
+
+ is->is_rule = fr;
+ is->is_sync = sl;
+
+ sl->sl_idx = -1;
+ sl->sl_ips = is;
+ bcopy(sp, &sl->sl_hdr, sizeof(struct synchdr));
+
+ WRITE_ENTER(&ipf_syncstate);
+ WRITE_ENTER(&ipf_state);
+
+ sl->sl_pnext = syncstatetab + hv;
+ sl->sl_next = syncstatetab[hv];
+ if (syncstatetab[hv] != NULL)
+ syncstatetab[hv]->sl_pnext = &sl->sl_next;
+ syncstatetab[hv] = sl;
+ MUTEX_DOWNGRADE(&ipf_syncstate);
+ fr_stinsert(is, sp->sm_rev);
+ /*
+ * Do not initialise the interface pointers for the state
+ * entry as the full complement of interface names may not
+ * be present.
+ *
+ * Put this state entry on its timeout queue.
+ */
+ /*fr_setstatequeue(is, sp->sm_rev);*/
+ break;
+
+ case SMC_UPDATE :
+ bcopy(data, &su, sizeof(su));
+
+ if (ipf_sync_debug > 4)
+ printf("[%d] Update age %lu state %d/%d \n",
+ sp->sm_num, su.stu_age, su.stu_state[0],
+ su.stu_state[1]);
+
+ READ_ENTER(&ipf_syncstate);
+ for (sl = syncstatetab[hv]; (sl != NULL); sl = sl->sl_next)
+ if (sl->sl_hdr.sm_num == sp->sm_num)
+ break;
+ if (sl == NULL) {
+ if (ipf_sync_debug > 1)
+ printf("[%d] State not found - can't update\n",
+ sp->sm_num);
+ RWLOCK_EXIT(&ipf_syncstate);
+ err = ENOENT;
+ break;
+ }
+
+ READ_ENTER(&ipf_state);
+
+ if (ipf_sync_debug > 6)
+ printf("[%d] Data from state v:%d p:%d cmd:%d table:%d rev:%d\n",
+ sp->sm_num, sl->sl_hdr.sm_v, sl->sl_hdr.sm_p,
+ sl->sl_hdr.sm_cmd, sl->sl_hdr.sm_table,
+ sl->sl_hdr.sm_rev);
+
+ is = sl->sl_ips;
+
+ MUTEX_ENTER(&is->is_lock);
+ switch (sp->sm_p)
+ {
+ case IPPROTO_TCP :
+ /* XXX FV --- shouldn't we do ntohl/htonl???? XXX */
+ is->is_send = su.stu_data[0].td_end;
+ is->is_maxsend = su.stu_data[0].td_maxend;
+ is->is_maxswin = su.stu_data[0].td_maxwin;
+ is->is_state[0] = su.stu_state[0];
+ is->is_dend = su.stu_data[1].td_end;
+ is->is_maxdend = su.stu_data[1].td_maxend;
+ is->is_maxdwin = su.stu_data[1].td_maxwin;
+ is->is_state[1] = su.stu_state[1];
+ break;
+ default :
+ break;
+ }
+
+ if (ipf_sync_debug > 6)
+ printf("[%d] Setting timers for state\n", sp->sm_num);
+
+ fr_setstatequeue(is, sp->sm_rev);
+
+ MUTEX_EXIT(&is->is_lock);
+ break;
+
+ default :
+ err = EINVAL;
+ break;
+ }
+
+ if (err == 0) {
+ RWLOCK_EXIT(&ipf_state);
+ RWLOCK_EXIT(&ipf_syncstate);
+ }
+
+ if (ipf_sync_debug > 6)
+ printf("[%d] Update completed with error %d\n",
+ sp->sm_num, err);
+
+ return err;
+}
+# endif /* _KERNEL */
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_del */
+/* Returns: Nil */
+/* Parameters: sl(I) - pointer to synclist object to delete */
+/* */
+/* Deletes an object from the synclist table and free's its memory. */
+/* ------------------------------------------------------------------------ */
+void ipfsync_del(sl)
+synclist_t *sl;
+{
+ WRITE_ENTER(&ipf_syncstate);
+ *sl->sl_pnext = sl->sl_next;
+ if (sl->sl_next != NULL)
+ sl->sl_next->sl_pnext = sl->sl_pnext;
+ if (sl->sl_idx != -1)
+ syncupd[sl->sl_idx].sup_hdr.sm_sl = NULL;
+ RWLOCK_EXIT(&ipf_syncstate);
+ KFREE(sl);
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_nat */
+/* Returns: int - 0 == success, else error value. */
+/* Parameters: sp(I) - pointer to sync packet data header */
+/* uio(I) - pointer to user data for further information */
+/* */
+/* Updates the NAT table according to information passed in the sync */
+/* header. As required, more data is fetched from the uio structure but */
+/* varies depending on the contents of the sync header. This function can */
+/* create a new NAT entry or update one. Deletion is left to the NAT */
+/* structures being timed out correctly. */
+/* ------------------------------------------------------------------------ */
+int ipfsync_nat(sp, data)
+synchdr_t *sp;
+void *data;
+{
+ syncupdent_t su;
+ nat_t *n, *nat;
+ synclist_t *sl;
+ u_int hv = 0;
+ int err;
+
+ READ_ENTER(&ipf_syncstate);
+
+ switch (sp->sm_cmd)
+ {
+ case SMC_CREATE :
+ KMALLOC(n, nat_t *);
+ if (n == NULL) {
+ err = ENOMEM;
+ break;
+ }
+
+ KMALLOC(sl, synclist_t *);
+ if (sl == NULL) {
+ err = ENOMEM;
+ KFREE(n);
+ break;
+ }
+
+ nat = (nat_t *)data;
+ bzero((char *)n, offsetof(nat_t, nat_age));
+ bcopy((char *)&nat->nat_age, (char *)&n->nat_age,
+ sizeof(*n) - offsetof(nat_t, nat_age));
+ ipfsync_natorder(0, n);
+ n->nat_sync = sl;
+
+ sl->sl_idx = -1;
+ sl->sl_ipn = n;
+ sl->sl_num = ntohl(sp->sm_num);
+
+ WRITE_ENTER(&ipf_nat);
+ sl->sl_pnext = syncstatetab + hv;
+ sl->sl_next = syncstatetab[hv];
+ if (syncstatetab[hv] != NULL)
+ syncstatetab[hv]->sl_pnext = &sl->sl_next;
+ syncstatetab[hv] = sl;
+ nat_insert(n, sl->sl_rev);
+ RWLOCK_EXIT(&ipf_nat);
+ break;
+
+ case SMC_UPDATE :
+ bcopy(data, &su, sizeof(su));
+
+ READ_ENTER(&ipf_syncstate);
+ for (sl = syncstatetab[hv]; (sl != NULL); sl = sl->sl_next)
+ if (sl->sl_hdr.sm_num == sp->sm_num)
+ break;
+ if (sl == NULL) {
+ err = ENOENT;
+ break;
+ }
+
+ READ_ENTER(&ipf_nat);
+
+ nat = sl->sl_ipn;
+
+ MUTEX_ENTER(&nat->nat_lock);
+ fr_setnatqueue(nat, sl->sl_rev);
+ MUTEX_EXIT(&nat->nat_lock);
+
+ RWLOCK_EXIT(&ipf_nat);
+
+ break;
+
+ default :
+ err = EINVAL;
+ break;
+ }
+
+ RWLOCK_EXIT(&ipf_syncstate);
+ return 0;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_new */
+/* Returns: synclist_t* - NULL == failure, else pointer to new synclist */
+/* data structure. */
+/* Parameters: tab(I) - type of synclist_t to create */
+/* fin(I) - pointer to packet information */
+/* ptr(I) - pointer to owning object */
+/* */
+/* Creates a new sync table entry and notifies any sleepers that it's there */
+/* waiting to be processed. */
+/* ------------------------------------------------------------------------ */
+synclist_t *ipfsync_new(tab, fin, ptr)
+int tab;
+fr_info_t *fin;
+void *ptr;
+{
+ synclist_t *sl, *ss;
+ synclogent_t *sle;
+ u_int hv, sz;
+
+ if (sl_idx == SYNCLOG_SZ)
+ return NULL;
+ KMALLOC(sl, synclist_t *);
+ if (sl == NULL)
+ return NULL;
+
+ MUTEX_ENTER(&ipf_syncadd);
+ /*
+ * Get a unique number for this synclist_t. The number is only meant
+ * to be unique for the lifetime of the structure and may be reused
+ * later.
+ */
+ ipf_syncnum++;
+ if (ipf_syncnum == 0) {
+ ipf_syncnum = 1;
+ ipf_syncwrap = 1;
+ }
+
+ hv = ipf_syncnum & (SYNC_STATETABSZ - 1);
+ while (ipf_syncwrap != 0) {
+ for (ss = syncstatetab[hv]; ss; ss = ss->sl_next)
+ if (ss->sl_hdr.sm_num == ipf_syncnum)
+ break;
+ if (ss == NULL)
+ break;
+ ipf_syncnum++;
+ hv = ipf_syncnum & (SYNC_STATETABSZ - 1);
+ }
+ /*
+ * Use the synch number of the object as the hash key. Should end up
+ * with relatively even distribution over time.
+ * XXX - an attacker could lunch an DoS attack, of sorts, if they are
+ * the only one causing new table entries by only keeping open every
+ * nth connection they make, where n is a value in the interval
+ * [0, SYNC_STATETABSZ-1].
+ */
+ sl->sl_pnext = syncstatetab + hv;
+ sl->sl_next = syncstatetab[hv];
+ syncstatetab[hv] = sl;
+ sl->sl_num = ipf_syncnum;
+ MUTEX_EXIT(&ipf_syncadd);
+
+ sl->sl_magic = htonl(SYNHDRMAGIC);
+ sl->sl_v = fin->fin_v;
+ sl->sl_p = fin->fin_p;
+ sl->sl_cmd = SMC_CREATE;
+ sl->sl_idx = -1;
+ sl->sl_table = tab;
+ sl->sl_rev = fin->fin_rev;
+ if (tab == SMC_STATE) {
+ sl->sl_ips = ptr;
+ sz = sizeof(*sl->sl_ips);
+ } else if (tab == SMC_NAT) {
+ sl->sl_ipn = ptr;
+ sz = sizeof(*sl->sl_ipn);
+ } else {
+ ptr = NULL;
+ sz = 0;
+ }
+ sl->sl_len = sz;
+
+ /*
+ * Create the log entry to be read by a user daemon. When it has been
+ * finished and put on the queue, send a signal to wakeup any waiters.
+ */
+ MUTEX_ENTER(&ipf_syncadd);
+ sle = synclog + sl_idx++;
+ bcopy((char *)&sl->sl_hdr, (char *)&sle->sle_hdr,
+ sizeof(sle->sle_hdr));
+ sle->sle_hdr.sm_num = htonl(sle->sle_hdr.sm_num);
+ sle->sle_hdr.sm_len = htonl(sle->sle_hdr.sm_len);
+ if (ptr != NULL) {
+ bcopy((char *)ptr, (char *)&sle->sle_un, sz);
+ if (tab == SMC_STATE) {
+ ipfsync_storder(1, &sle->sle_un.sleu_ips);
+ } else if (tab == SMC_NAT) {
+ ipfsync_natorder(1, &sle->sle_un.sleu_ipn);
+ }
+ }
+ MUTEX_EXIT(&ipf_syncadd);
+
+ MUTEX_ENTER(&ipsl_mutex);
+# if SOLARIS
+# ifdef _KERNEL
+ cv_signal(&ipslwait);
+# endif
+ MUTEX_EXIT(&ipsl_mutex);
+# else
+ MUTEX_EXIT(&ipsl_mutex);
+# ifdef _KERNEL
+ wakeup(&sl_tail);
+# endif
+# endif
+ return sl;
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: ipfsync_update */
+/* Returns: Nil */
+/* Parameters: tab(I) - type of synclist_t to create */
+/* fin(I) - pointer to packet information */
+/* sl(I) - pointer to synchronisation object */
+/* */
+/* For outbound packets, only, create an sync update record for the user */
+/* process to read. */
+/* ------------------------------------------------------------------------ */
+void ipfsync_update(tab, fin, sl)
+int tab;
+fr_info_t *fin;
+synclist_t *sl;
+{
+ synctcp_update_t *st;
+ syncupdent_t *slu;
+ ipstate_t *ips;
+ nat_t *nat;
+
+ if (fin->fin_out == 0 || sl == NULL)
+ return;
+
+ WRITE_ENTER(&ipf_syncstate);
+ MUTEX_ENTER(&ipf_syncadd);
+ if (sl->sl_idx == -1) {
+ slu = syncupd + su_idx;
+ sl->sl_idx = su_idx++;
+ bcopy((char *)&sl->sl_hdr, (char *)&slu->sup_hdr,
+ sizeof(slu->sup_hdr));
+ slu->sup_hdr.sm_magic = htonl(SYNHDRMAGIC);
+ slu->sup_hdr.sm_sl = sl;
+ slu->sup_hdr.sm_cmd = SMC_UPDATE;
+ slu->sup_hdr.sm_table = tab;
+ slu->sup_hdr.sm_num = htonl(sl->sl_num);
+ slu->sup_hdr.sm_len = htonl(sizeof(struct synctcp_update));
+ slu->sup_hdr.sm_rev = fin->fin_rev;
+# if 0
+ if (fin->fin_p == IPPROTO_TCP) {
+ st->stu_len[0] = 0;
+ st->stu_len[1] = 0;
+ }
+# endif
+ } else
+ slu = syncupd + sl->sl_idx;
+ MUTEX_EXIT(&ipf_syncadd);
+ MUTEX_DOWNGRADE(&ipf_syncstate);
+
+ /*
+ * Only TCP has complex timeouts, others just use default timeouts.
+ * For TCP, we only need to track the connection state and window.
+ */
+ if (fin->fin_p == IPPROTO_TCP) {
+ st = &slu->sup_tcp;
+ if (tab == SMC_STATE) {
+ ips = sl->sl_ips;
+ st->stu_age = htonl(ips->is_die);
+ st->stu_data[0].td_end = ips->is_send;
+ st->stu_data[0].td_maxend = ips->is_maxsend;
+ st->stu_data[0].td_maxwin = ips->is_maxswin;
+ st->stu_state[0] = ips->is_state[0];
+ st->stu_data[1].td_end = ips->is_dend;
+ st->stu_data[1].td_maxend = ips->is_maxdend;
+ st->stu_data[1].td_maxwin = ips->is_maxdwin;
+ st->stu_state[1] = ips->is_state[1];
+ } else if (tab == SMC_NAT) {
+ nat = sl->sl_ipn;
+ st->stu_age = htonl(nat->nat_age);
+ }
+ }
+ RWLOCK_EXIT(&ipf_syncstate);
+
+ MUTEX_ENTER(&ipsl_mutex);
+# if SOLARIS
+# ifdef _KERNEL
+ cv_signal(&ipslwait);
+# endif
+ MUTEX_EXIT(&ipsl_mutex);
+# else
+ MUTEX_EXIT(&ipsl_mutex);
+# ifdef _KERNEL
+ wakeup(&sl_tail);
+# endif
+# endif
+}
+
+
+/* ------------------------------------------------------------------------ */
+/* Function: fr_sync_ioctl */
+/* Returns: int - 0 == success, != 0 == failure */
+/* Parameters: data(I) - pointer to ioctl data */
+/* cmd(I) - ioctl command integer */
+/* mode(I) - file mode bits used with open */
+/* */
+/* This function currently does not handle any ioctls and so just returns */
+/* EINVAL on all occasions. */
+/* ------------------------------------------------------------------------ */
+int fr_sync_ioctl(data, cmd, mode, uid, ctx)
+caddr_t data;
+ioctlcmd_t cmd;
+int mode, uid;
+void *ctx;
+{
+ return EINVAL;
+}
+
+
+int ipfsync_canread()
+{
+ return !((sl_tail == sl_idx) && (su_tail == su_idx));
+}
+
+
+int ipfsync_canwrite()
+{
+ return 1;
+}
+#endif /* IPFILTER_SYNC */
diff --git a/sys/contrib/ipfilter/netinet/ip_sync.h b/sys/contrib/ipfilter/netinet/ip_sync.h
new file mode 100644
index 0000000..8104db3
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ip_sync.h
@@ -0,0 +1,117 @@
+/*
+ * Copyright (C) 1993-2001 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * @(#)ip_fil.h 1.35 6/5/96
+ * $Id: ip_sync.h,v 2.11.2.4 2006/07/14 06:12:20 darrenr Exp $
+ */
+
+#ifndef __IP_SYNC_H__
+#define __IP_SYNC_H__
+
+typedef struct synchdr {
+ u_32_t sm_magic; /* magic */
+ u_char sm_v; /* version: 4,6 */
+ u_char sm_p; /* protocol */
+ u_char sm_cmd; /* command */
+ u_char sm_table; /* NAT, STATE, etc */
+ u_int sm_num; /* table entry number */
+ int sm_rev; /* forward/reverse */
+ int sm_len; /* length of the data section */
+ struct synclist *sm_sl; /* back pointer to parent */
+} synchdr_t;
+
+
+#define SYNHDRMAGIC 0x0FF51DE5
+
+/*
+ * Commands
+ * No delete required as expirey will take care of that!
+ */
+#define SMC_CREATE 0 /* pass ipstate_t after synchdr_t */
+#define SMC_UPDATE 1
+#define SMC_MAXCMD 1
+
+/*
+ * Tables
+ */
+#define SMC_NAT 0
+#define SMC_STATE 1
+#define SMC_MAXTBL 1
+
+
+/*
+ * Only TCP requires "more" information than just a reference to the entry
+ * for which an update is being made.
+ */
+typedef struct synctcp_update {
+ u_long stu_age;
+ tcpdata_t stu_data[2];
+ int stu_state[2];
+} synctcp_update_t;
+
+
+typedef struct synclist {
+ struct synclist *sl_next;
+ struct synclist **sl_pnext;
+ int sl_idx; /* update index */
+ struct synchdr sl_hdr;
+ union {
+ struct ipstate *slu_ips;
+ struct nat *slu_ipn;
+ void *slu_ptr;
+ } sl_un;
+} synclist_t;
+
+#define sl_ptr sl_un.slu_ptr
+#define sl_ips sl_un.slu_ips
+#define sl_ipn sl_un.slu_ipn
+#define sl_magic sl_hdr.sm_magic
+#define sl_v sl_hdr.sm_v
+#define sl_p sl_hdr.sm_p
+#define sl_cmd sl_hdr.sm_cmd
+#define sl_rev sl_hdr.sm_rev
+#define sl_table sl_hdr.sm_table
+#define sl_num sl_hdr.sm_num
+#define sl_len sl_hdr.sm_len
+
+/*
+ * NOTE: SYNCLOG_SZ is defined *low*. It should be the next power of two
+ * up for whatever number of packets per second you expect to see. Be
+ * warned: this index's a table of large elements (upto 272 bytes in size
+ * each), and thus a size of 8192, for example, results in a 2MB table.
+ * The lesson here is not to use small machines for running fast firewalls
+ * (100BaseT) in sync, where you might have upwards of 10k pps.
+ */
+#define SYNCLOG_SZ 256
+
+typedef struct synclogent {
+ struct synchdr sle_hdr;
+ union {
+ struct ipstate sleu_ips;
+ struct nat sleu_ipn;
+ } sle_un;
+} synclogent_t;
+
+typedef struct syncupdent { /* 28 or 32 bytes */
+ struct synchdr sup_hdr;
+ struct synctcp_update sup_tcp;
+} syncupdent_t;
+
+extern synclogent_t synclog[SYNCLOG_SZ];
+
+
+extern int fr_sync_ioctl __P((caddr_t, ioctlcmd_t, int, int, void *));
+extern synclist_t *ipfsync_new __P((int, fr_info_t *, void *));
+extern void ipfsync_del __P((synclist_t *));
+extern void ipfsync_update __P((int, fr_info_t *, synclist_t *));
+extern int ipfsync_init __P((void));
+extern int ipfsync_nat __P((synchdr_t *sp, void *data));
+extern int ipfsync_state __P((synchdr_t *sp, void *data));
+extern int ipfsync_read __P((struct uio *uio));
+extern int ipfsync_write __P((struct uio *uio));
+extern int ipfsync_canread __P((void));
+extern int ipfsync_canwrite __P((void));
+
+#endif /* IP_SYNC */
diff --git a/sys/contrib/ipfilter/netinet/ipl.h b/sys/contrib/ipfilter/netinet/ipl.h
new file mode 100644
index 0000000..22b8d51
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/ipl.h
@@ -0,0 +1,20 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 1993-2001, 2003 by Darren Reed.
+ *
+ * See the IPFILTER.LICENCE file for details on licencing.
+ *
+ * @(#)ipl.h 1.21 6/5/96
+ * $FreeBSD$
+ * Id: ipl.h,v 2.52.2.14 2006/04/01 20:09:42 darrenr Exp $
+ */
+
+#ifndef __IPL_H__
+#define __IPL_H__
+
+#define IPL_VERSION "IP Filter: v4.1.23"
+
+#define IPFILTER_VERSION 4012300
+
+#endif
diff --git a/sys/contrib/ipfilter/netinet/mlfk_ipl.c b/sys/contrib/ipfilter/netinet/mlfk_ipl.c
new file mode 100644
index 0000000..9166712
--- /dev/null
+++ b/sys/contrib/ipfilter/netinet/mlfk_ipl.c
@@ -0,0 +1,353 @@
+/* $FreeBSD$ */
+
+/*
+ * Copyright (C) 2000 by Darren Reed.
+ *
+ * $FreeBSD$
+ * See the IPFILTER.LICENCE file for details on licencing.
+ */
+
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/conf.h>
+#include <sys/socket.h>
+#include <sys/sysctl.h>
+#include <sys/select.h>
+#if __FreeBSD_version >= 500000
+# include <sys/selinfo.h>
+#endif
+#include <net/if.h>
+#include <netinet/in_systm.h>
+#include <netinet/in.h>
+
+
+#include <netinet/ipl.h>
+#include <netinet/ip_compat.h>
+#include <netinet/ip_fil.h>
+#include <netinet/ip_state.h>
+#include <netinet/ip_nat.h>
+#include <netinet/ip_auth.h>
+#include <netinet/ip_frag.h>
+#include <netinet/ip_sync.h>
+
+#if __FreeBSD_version >= 502116
+static struct cdev *ipf_devs[IPL_LOGSIZE];
+#else
+static dev_t ipf_devs[IPL_LOGSIZE];
+#endif
+
+static int sysctl_ipf_int ( SYSCTL_HANDLER_ARGS );
+static int ipf_modload(void);
+static int ipf_modunload(void);
+
+SYSCTL_DECL(_net_inet);
+#define SYSCTL_IPF(parent, nbr, name, access, ptr, val, descr) \
+ SYSCTL_OID(parent, nbr, name, CTLTYPE_INT|access, \
+ ptr, val, sysctl_ipf_int, "I", descr);
+#define CTLFLAG_OFF 0x00800000 /* IPFilter must be disabled */
+#define CTLFLAG_RWO (CTLFLAG_RW|CTLFLAG_OFF)
+SYSCTL_NODE(_net_inet, OID_AUTO, ipf, CTLFLAG_RW, 0, "IPF");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_flags, CTLFLAG_RW, &fr_flags, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_pass, CTLFLAG_RW, &fr_pass, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_active, CTLFLAG_RD, &fr_active, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcpidletimeout, CTLFLAG_RWO,
+ &fr_tcpidletimeout, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcphalfclosed, CTLFLAG_RWO,
+ &fr_tcphalfclosed, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcpclosewait, CTLFLAG_RWO,
+ &fr_tcpclosewait, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcplastack, CTLFLAG_RWO,
+ &fr_tcplastack, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcptimeout, CTLFLAG_RWO,
+ &fr_tcptimeout, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_tcpclosed, CTLFLAG_RWO,
+ &fr_tcpclosed, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_udptimeout, CTLFLAG_RWO,
+ &fr_udptimeout, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_udpacktimeout, CTLFLAG_RWO,
+ &fr_udpacktimeout, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_icmptimeout, CTLFLAG_RWO,
+ &fr_icmptimeout, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_defnatage, CTLFLAG_RWO,
+ &fr_defnatage, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_ipfrttl, CTLFLAG_RW,
+ &fr_ipfrttl, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_running, CTLFLAG_RD,
+ &fr_running, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_statesize, CTLFLAG_RWO,
+ &fr_statesize, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_statemax, CTLFLAG_RWO,
+ &fr_statemax, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, ipf_nattable_sz, CTLFLAG_RWO,
+ &ipf_nattable_sz, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, ipf_natrules_sz, CTLFLAG_RWO,
+ &ipf_natrules_sz, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, ipf_rdrrules_sz, CTLFLAG_RWO,
+ &ipf_rdrrules_sz, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, ipf_hostmap_sz, CTLFLAG_RWO,
+ &ipf_hostmap_sz, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_authsize, CTLFLAG_RWO,
+ &fr_authsize, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_authused, CTLFLAG_RD,
+ &fr_authused, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_defaultauthage, CTLFLAG_RW,
+ &fr_defaultauthage, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_chksrc, CTLFLAG_RW, &fr_chksrc, 0, "");
+SYSCTL_IPF(_net_inet_ipf, OID_AUTO, fr_minttl, CTLFLAG_RW, &fr_minttl, 0, "");
+
+#define CDEV_MAJOR 79
+#include <sys/poll.h>
+#if __FreeBSD_version >= 500043
+# include <sys/select.h>
+static int iplpoll(struct cdev *dev, int events, struct thread *td);
+
+static struct cdevsw ipl_cdevsw = {
+# if __FreeBSD_version >= 502103
+ .d_version = D_VERSION,
+ .d_flags = 0, /* D_NEEDGIANT - Should be SMP safe */
+# endif
+ .d_open = iplopen,
+ .d_close = iplclose,
+ .d_read = iplread,
+ .d_write = iplwrite,
+ .d_ioctl = iplioctl,
+ .d_name = "ipl",
+# if __FreeBSD_version >= 500043
+ .d_poll = iplpoll,
+# endif
+# if __FreeBSD_version < 600000
+ .d_maj = CDEV_MAJOR,
+# endif
+};
+#else
+static int iplpoll(dev_t dev, int events, struct proc *p);
+
+static struct cdevsw ipl_cdevsw = {
+ /* open */ iplopen,
+ /* close */ iplclose,
+ /* read */ iplread,
+ /* write */ iplwrite,
+ /* ioctl */ iplioctl,
+ /* poll */ iplpoll,
+ /* mmap */ nommap,
+ /* strategy */ nostrategy,
+ /* name */ "ipl",
+ /* maj */ CDEV_MAJOR,
+ /* dump */ nodump,
+ /* psize */ nopsize,
+ /* flags */ 0,
+# if (__FreeBSD_version < 500043)
+ /* bmaj */ -1,
+# endif
+# if (__FreeBSD_version > 430000)
+ /* kqfilter */ NULL
+# endif
+};
+#endif
+
+static char *ipf_devfiles[] = { IPL_NAME, IPNAT_NAME, IPSTATE_NAME, IPAUTH_NAME,
+ IPSYNC_NAME, IPSCAN_NAME, IPLOOKUP_NAME, NULL };
+
+
+static int
+ipfilter_modevent(module_t mod, int type, void *unused)
+{
+ int error = 0;
+
+ switch (type)
+ {
+ case MOD_LOAD :
+ error = ipf_modload();
+ break;
+
+ case MOD_UNLOAD :
+ error = ipf_modunload();
+ break;
+ default:
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+
+static int
+ipf_modload()
+{
+ char *defpass, *c, *str;
+ int i, j, error;
+
+ RWLOCK_INIT(&ipf_global, "ipf filter load/unload mutex");
+ RWLOCK_INIT(&ipf_mutex, "ipf filter rwlock");
+ RWLOCK_INIT(&ipf_frcache, "ipf cache rwlock");
+
+ error = ipfattach();
+ if (error) {
+ RW_DESTROY(&ipf_global);
+ RW_DESTROY(&ipf_mutex);
+ RW_DESTROY(&ipf_frcache);
+ return error;
+ }
+
+ for (i = 0; i < IPL_LOGSIZE; i++)
+ ipf_devs[i] = NULL;
+
+ for (i = 0; (str = ipf_devfiles[i]); i++) {
+ c = NULL;
+ for(j = strlen(str); j > 0; j--)
+ if (str[j] == '/') {
+ c = str + j + 1;
+ break;
+ }
+ if (!c)
+ c = str;
+ ipf_devs[i] = make_dev(&ipl_cdevsw, i, 0, 0, 0600, c);
+ }
+
+ if (FR_ISPASS(fr_pass))
+ defpass = "pass";
+ else if (FR_ISBLOCK(fr_pass))
+ defpass = "block";
+ else
+ defpass = "no-match -> block";
+
+ printf("%s initialized. Default = %s all, Logging = %s%s\n",
+ ipfilter_version, defpass,
+#ifdef IPFILTER_LOG
+ "enabled",
+#else
+ "disabled",
+#endif
+#ifdef IPFILTER_COMPILED
+ " (COMPILED)"
+#else
+ ""
+#endif
+ );
+ return 0;
+}
+
+
+static int
+ipf_modunload()
+{
+ int error, i;
+
+ if (fr_refcnt)
+ return EBUSY;
+
+ if (fr_running >= 0) {
+ error = ipfdetach();
+ if (error != 0)
+ return error;
+ } else
+ error = 0;
+
+ RW_DESTROY(&ipf_global);
+ RW_DESTROY(&ipf_mutex);
+ RW_DESTROY(&ipf_frcache);
+
+ fr_running = -2;
+
+ for (i = 0; ipf_devfiles[i]; i++) {
+ if (ipf_devs[i] != NULL)
+ destroy_dev(ipf_devs[i]);
+ }
+
+ printf("%s unloaded\n", ipfilter_version);
+
+ return error;
+}
+
+
+static moduledata_t ipfiltermod = {
+ "ipfilter",
+ ipfilter_modevent,
+ 0
+};
+
+
+DECLARE_MODULE(ipfilter, ipfiltermod, SI_SUB_PROTO_DOMAIN, SI_ORDER_ANY);
+#ifdef MODULE_VERSION
+MODULE_VERSION(ipfilter, 1);
+#endif
+
+
+#ifdef SYSCTL_IPF
+int
+sysctl_ipf_int ( SYSCTL_HANDLER_ARGS )
+{
+ int error = 0;
+
+ if (arg1)
+ error = SYSCTL_OUT(req, arg1, sizeof(int));
+ else
+ error = SYSCTL_OUT(req, &arg2, sizeof(int));
+
+ if (error || !req->newptr)
+ return (error);
+
+ if (!arg1)
+ error = EPERM;
+ else {
+ if ((oidp->oid_kind & CTLFLAG_OFF) && (fr_running > 0))
+ error = EBUSY;
+ else
+ error = SYSCTL_IN(req, arg1, sizeof(int));
+ }
+ return (error);
+}
+#endif
+
+
+static int
+#if __FreeBSD_version >= 500043
+iplpoll(struct cdev *dev, int events, struct thread *td)
+#else
+iplpoll(dev_t dev, int events, struct proc *td)
+#endif
+{
+ u_int xmin = GET_MINOR(dev);
+ int revents;
+
+ if (xmin < 0 || xmin > IPL_LOGMAX)
+ return 0;
+
+ revents = 0;
+
+ switch (xmin)
+ {
+ case IPL_LOGIPF :
+ case IPL_LOGNAT :
+ case IPL_LOGSTATE :
+#ifdef IPFILTER_LOG
+ if ((events & (POLLIN | POLLRDNORM)) && ipflog_canread(xmin))
+ revents |= events & (POLLIN | POLLRDNORM);
+#endif
+ break;
+ case IPL_LOGAUTH :
+ if ((events & (POLLIN | POLLRDNORM)) && fr_auth_waiting())
+ revents |= events & (POLLIN | POLLRDNORM);
+ break;
+ case IPL_LOGSYNC :
+#ifdef IPFILTER_SYNC
+ if ((events & (POLLIN | POLLRDNORM)) && ipfsync_canread())
+ revents |= events & (POLLIN | POLLRDNORM);
+ if ((events & (POLLOUT | POLLWRNORM)) && ipfsync_canwrite())
+ revents |= events & (POLLOUT | POLLWRNORM);
+#endif
+ break;
+ case IPL_LOGSCAN :
+ case IPL_LOGLOOKUP :
+ default :
+ break;
+ }
+
+ if ((revents == 0) && ((events & (POLLIN|POLLRDNORM)) != 0))
+ selrecord(td, &ipfselwait[xmin]);
+
+ return revents;
+}
diff --git a/sys/contrib/ngatm/FREEBSD-Xlist b/sys/contrib/ngatm/FREEBSD-Xlist
new file mode 100644
index 0000000..0ead0cc
--- /dev/null
+++ b/sys/contrib/ngatm/FREEBSD-Xlist
@@ -0,0 +1,15 @@
+#$FreeBSD$
+*/README
+*/VERSION
+*/Makefile.in
+*/Makefile.pre
+*/Makefile.post
+*/aclocal.m4
+*/config
+*/configure
+*/configure.ac
+*/libngatm
+*/man
+*/snmp_atm
+*/snmp_ilmid
+*/sscop
diff --git a/sys/contrib/ngatm/FREEBSD-upgrade b/sys/contrib/ngatm/FREEBSD-upgrade
new file mode 100644
index 0000000..cb167ac
--- /dev/null
+++ b/sys/contrib/ngatm/FREEBSD-upgrade
@@ -0,0 +1,26 @@
+$FreeBSD$
+
+This is the part of the NgATM stuff that is shared by kernel and user.
+Be careful to feed changes back to the maintainer <harti@freebsd.org>,
+because the code here is actually shared with other environments besides
+FreeBSD.
+
+Import should be done by:
+
+ 1. Put the distribution into a clean directory.
+
+ 2. Remove any unneeded files.
+
+ 3. cvs import \
+ -m "Virgin import of NgATM shared kernel/user part X.Y" \
+ src/sys/contrib/ngatm/netnatm BEGEMOT NGATM_X_Y
+
+ 4. resolve conflicts
+
+ 5. check-out the imported stuff
+
+ 6. Re-generate files by calling ./genfiles
+
+ 7. If neccessary commit the re-generated files
+
+harti
diff --git a/sys/contrib/ngatm/netnatm/addr.h b/sys/contrib/ngatm/netnatm/addr.h
new file mode 100644
index 0000000..c1ba20e
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/addr.h
@@ -0,0 +1,42 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/addr.h,v 1.3 2004/07/08 08:21:45 brandt Exp $
+ */
+#ifndef _NETNATM_ADDR_H_
+#define _NETNATM_ADDR_H_
+
+int uni_str2nsap(u_char *, const char *);
+void uni_nsap2str(char *, const u_char *, int);
+
+void uni_prefix2str(char *, const u_char *, u_int, int);
+
+int uni_e1642nsap(u_char *, const char *);
+int uni_nsap2e164(char *, const u_char *, int);
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/api/atmapi.h b/sys/contrib/ngatm/netnatm/api/atmapi.h
new file mode 100644
index 0000000..887f548
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/atmapi.h
@@ -0,0 +1,291 @@
+/*
+ * Copyright (c) 2003-2004
+ * Hartmut Brandt
+ * All rights reserved.
+ *
+ * Copyright (c) 2001-2002
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Author: Harti Brandt <harti@freebsd.org>
+ *
+ * Redistribution of this software and documentation and use in source and
+ * binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ *
+ * 1. Redistributions of source code or documentation must retain the above
+ * copyright notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHORS
+ * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHORS OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/api/atmapi.h,v 1.1 2004/07/08 08:21:48 brandt Exp $
+ *
+ * ATM API as defined per af-saa-0108
+ */
+#ifndef _NETNATM_API_ATMAPI_H_
+#define _NETNATM_API_ATMAPI_H_
+
+#include <sys/types.h>
+
+/* size of an endpointlen including trailing \0 */
+#define ATM_EPNAMSIZ 65
+
+enum atmstate {
+ ATM_A0, /* non existent */
+ ATM_A1, /* initial */
+ ATM_A2, /* outgoing call preparation */
+ ATM_A3, /* outgoing call requested */
+ ATM_A4, /* incoming call preparation */
+ ATM_A5, /* wait incoming call */
+ ATM_A6, /* incoming call present */
+ ATM_A7, /* incoming call requested */
+ ATM_A8, /* p2p data transfer */
+ ATM_A9, /* p2mp root data transfer */
+ ATM_A10, /* p2mp leaf data transfer */
+ ATM_A11, /* terminated */
+};
+
+enum atmop {
+ ATMOP_RESP, /* 0 */
+ ATMOP_ABORT_CONNECTION,
+ ATMOP_ACCEPT_INCOMING_CALL,
+ ATMOP_ADD_PARTY,
+ ATMOP_ADD_PARTY_REJECT,
+ ATMOP_ADD_PARTY_SUCCESS, /* 5 */
+ ATMOP_ARRIVAL_OF_INCOMING_CALL,
+ ATMOP_CALL_RELEASE,
+ ATMOP_CONNECT_OUTGOING_CALL,
+ ATMOP_DROP_PARTY,
+ ATMOP_GET_LOCAL_PORT_INFO, /* 10 */
+ ATMOP_P2MP_CALL_ACTIVE,
+ ATMOP_P2P_CALL_ACTIVE,
+ ATMOP_PREPARE_INCOMING_CALL,
+ ATMOP_PREPARE_OUTGOING_CALL,
+ ATMOP_QUERY_CONNECTION_ATTRIBUTES, /* 15 */
+ ATMOP_REJECT_INCOMING_CALL,
+ ATMOP_SET_CONNECTION_ATTRIBUTES,
+ ATMOP_WAIT_ON_INCOMING_CALL,
+ ATMOP_SET_CONNECTION_ATTRIBUTES_X,
+ ATMOP_QUERY_CONNECTION_ATTRIBUTES_X, /* 20 */
+ ATMOP_QUERY_STATE,
+};
+
+#define ATM_DEFINE_ERRORS \
+ DEF(ATMERR_OK, 0, "OK") \
+ DEF(ATMERR_SYS, -1, "syscall error") \
+ DEF(ATMERR_BAD_OP, -2, "bad operation") \
+ DEF(ATMERR_BAD_ARGS, -3, "bad arguments for operation") \
+ DEF(ATMERR_BAD_STATE, -4, "operation in bad state") \
+ DEF(ATMERR_BAD_ATTR, -5, "unknown attribute") \
+ DEF(ATMERR_BAD_VALUE, -6, "bad attribute value") \
+ DEF(ATMERR_BUSY, -7, "busy") \
+ DEF(ATMERR_RDONLY, -8, "read-only attribute") \
+ DEF(ATMERR_BAD_SAP, -9, "bad SAP") \
+ DEF(ATMERR_OVERLAP, -10,"overlaping SAP") \
+ DEF(ATMERR_BAD_ENDPOINT, -11,"bad ATM endpoint") \
+ DEF(ATMERR_PREVIOUSLY_ABORTED,-12,"previously aborted") \
+ DEF(ATMERR_NO_CALL, -13,"no incoming call") \
+ DEF(ATMERR_BAD_LEAF_IDENT, -14,"bad leaf identifier") \
+ DEF(ATMERR_BAD_PORT, -15,"unknown port") \
+ DEF(ATMERR_BAD_SIGNAL, -29-UNIAPI_ERROR_BAD_SIGNAL, "bad signal")\
+ DEF(ATMERR_BADCU, -29-UNIAPI_ERROR_BADCU, "bad coordinator state")\
+ DEF(ATMERR_BAD_CALLSTATE, -29-UNIAPI_ERROR_BAD_CALLSTATE, "bad call state")\
+ DEF(ATMERR_BAD_EPSTATE, -29-UNIAPI_ERROR_BAD_EPSTATE, "bad party state")\
+ DEF(ATMERR_BAD_UNIARG, -29-UNIAPI_ERROR_BAD_ARG, "bad uni argument")\
+ DEF(ATMERR_BAD_CALL, -29-UNIAPI_ERROR_BAD_CALL, "unknown call")\
+ DEF(ATMERR_BAD_PARTY, -29-UNIAPI_ERROR_BAD_PARTY, "unknown party")\
+ DEF(ATMERR_BAD_CTYPE, -29-UNIAPI_ERROR_BAD_CTYPE, "wrong call type")\
+ DEF(ATMERR_BAD_IE, -29-UNIAPI_ERROR_BAD_IE, "bad information element")\
+ DEF(ATMERR_EPREF_INUSE, -29-UNIAPI_ERROR_EPREF_INUSE, "endpoint reference in use")\
+ DEF(ATMERR_MISSING_IE, -29-UNIAPI_ERROR_MISSING_IE, "missing information element")\
+ DEF(ATMERR_ENCODING, -29-UNIAPI_ERROR_ENCODING, "encoding error")\
+ DEF(ATMERR_NOMEM, -29-UNIAPI_ERROR_NOMEM, "no memory")\
+ DEF(ATMERR_UNIBUSY, -29-UNIAPI_ERROR_BUSY, "uni process busy")
+
+#define ATM_MKUNIERR(E) (-29 - (E))
+
+enum atm_error {
+#define DEF(NAME,VAL,STR) NAME = (VAL),
+ATM_DEFINE_ERRORS
+#undef DEF
+};
+
+enum atm_attribute {
+ ATM_ATTR_NONE = 0,
+ ATM_ATTR_BLLI_SELECTOR,
+ ATM_ATTR_BLLI,
+ ATM_ATTR_BEARER,
+ ATM_ATTR_TRAFFIC,
+ ATM_ATTR_QOS,
+ ATM_ATTR_EXQOS,
+ ATM_ATTR_CALLED,
+ ATM_ATTR_CALLEDSUB,
+ ATM_ATTR_CALLING,
+ ATM_ATTR_CALLINGSUB,
+ ATM_ATTR_AAL,
+ ATM_ATTR_EPREF,
+ ATM_ATTR_CONNED,
+ ATM_ATTR_CONNEDSUB,
+ ATM_ATTR_EETD,
+ ATM_ATTR_ABRSETUP,
+ ATM_ATTR_ABRADD,
+ ATM_ATTR_CONNID,
+ ATM_ATTR_MDCR,
+};
+
+struct atm_resp {
+ int32_t resp;
+ uint32_t data; /* type of attached data */
+};
+enum {
+ ATMRESP_NONE, /* no data */
+ ATMRESP_ATTRS, /* attribute(s) */
+ ATMRESP_PORTS, /* port info */
+ ATMRESP_STATE, /* endpoint state */
+ ATMRESP_EXSTAT, /* extended status */
+};
+
+struct atm_abort_connection {
+ struct uni_ie_cause cause;
+};
+
+struct atm_query_connection_attributes {
+ uint32_t attr;
+};
+struct atm_set_connection_attributes {
+ uint32_t attr;
+};
+struct atm_query_connection_attributes_x {
+ uint32_t count;
+#if defined(__GNUC__) && __GNUC__ < 3
+ uint32_t attr[0];
+#else
+ uint32_t attr[];
+#endif
+};
+struct atm_set_connection_attributes_x {
+ uint32_t count;
+#if defined(__GNUC__) && __GNUC__ < 3
+ uint32_t attr[0];
+#else
+ uint32_t attr[];
+#endif
+};
+struct atm_prepare_incoming_call {
+ struct uni_sap sap;
+ uint32_t queue_size;
+};
+struct atm_connect_outgoing_call {
+ struct uni_ie_called called;
+};
+struct atm_call_release {
+ struct uni_ie_cause cause[2];
+};
+struct atm_p2p_call_active {
+ struct uni_ie_connid connid;
+};
+struct atm_p2mp_call_active {
+ struct uni_ie_connid connid;
+};
+struct atm_accept_incoming_call {
+ char newep[ATM_EPNAMSIZ];
+};
+struct atm_reject_incoming_call {
+ struct uni_ie_cause cause;
+};
+struct atm_add_party {
+ uint16_t leaf_ident;
+ struct uni_ie_called called;
+};
+struct atm_add_party_success {
+ uint16_t leaf_ident;
+};
+struct atm_add_party_reject {
+ uint16_t leaf_ident;
+ struct uni_ie_cause cause;
+};
+struct atm_drop_party {
+ uint16_t leaf_ident;
+ struct uni_ie_cause cause;
+};
+
+/*
+ * Get local port info. If port is 0, information on all ports is returned,
+ * otherwise only on the named port.
+ * The response consists of a header with two counters, a list of ports
+ * (struct atm_port_info) and a list of addresses (struct uni_addr).
+ * The port to which an address belongs is implicit in the num_addrs field
+ * of the port.
+ */
+struct atm_get_local_port_info {
+ uint32_t port;
+};
+
+struct atm_port_list {
+ uint32_t num_ports; /* number of ports */
+ uint32_t num_addrs; /* total number of addresses */
+};
+
+struct atm_port_info {
+ uint32_t port;
+ uint32_t pcr;
+ uint32_t max_vpi_bits;
+ uint32_t max_vci_bits;
+ uint32_t max_svpc_vpi;
+ uint32_t max_svcc_vpi;
+ uint32_t min_svcc_vci;
+ u_char esi[6];
+ uint32_t num_addrs; /* number of addresses on this port */
+};
+
+/*
+ * Endpoint state info
+ */
+struct atm_epstate {
+ char name[ATM_EPNAMSIZ];
+ uint8_t state;
+};
+
+/*
+ * Extended status information.
+ */
+struct atm_exstatus {
+ uint32_t neps; /* endpoints */
+ uint32_t nports; /* ports */
+ uint32_t nconns; /* connections */
+ uint32_t nparties; /* number of parties */
+};
+struct atm_exstatus_ep {
+ char name[ATM_EPNAMSIZ];
+ uint8_t state; /* Ux */
+};
+struct atm_exstatus_port {
+ uint32_t portno;
+ uint8_t state;
+};
+struct atm_exstatus_conn {
+ uint32_t id;
+ uint32_t cref; /* (flag << 23) | cref */
+ uint32_t port;
+ char ep[ATM_EPNAMSIZ]; /* \0 - none */
+ uint8_t state; /* Cx */
+};
+struct atm_exstatus_party {
+ uint32_t connid;
+ uint16_t epref;
+ uint8_t state; /* Px */
+};
+#endif
diff --git a/sys/contrib/ngatm/netnatm/api/cc_conn.c b/sys/contrib/ngatm/netnatm/api/cc_conn.c
new file mode 100644
index 0000000..a8e1b38
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/cc_conn.c
@@ -0,0 +1,2096 @@
+/*
+ * Copyright (c) 2003-2004
+ * Hartmut Brandt
+ * All rights reserved.
+ *
+ * Copyright (c) 2001-2002
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Author: Harti Brandt <harti@freebsd.org>
+ *
+ * Redistribution of this software and documentation and use in source and
+ * binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ *
+ * 1. Redistributions of source code or documentation must retain the above
+ * copyright notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHOR
+ * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHOR OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/api/cc_conn.c,v 1.2 2004/07/16 18:45:11 brandt Exp $
+ *
+ * ATM API as defined per af-saa-0108
+ *
+ * Lower half - connection handling
+ */
+#include <netnatm/unimsg.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/api/unisap.h>
+#include <netnatm/sig/unidef.h>
+#include <netnatm/api/atmapi.h>
+#include <netnatm/api/ccatm.h>
+#include <netnatm/api/ccpriv.h>
+
+static const char *stab[] = {
+#define DEF(N) [N] = #N,
+ CONN_STATES
+#undef DEF
+};
+
+static const char *ptab[] = {
+#define DEF(N) [PARTY_##N] = #N,
+ PARTY_STATES
+#undef DEF
+};
+
+const char *
+cc_conn_state2str(u_int s)
+{
+ if (s >= sizeof(stab) / sizeof(stab[0]) || stab[s] == NULL)
+ return ("?");
+ return (stab[s]);
+}
+
+__inline void
+cc_conn_set_state(struct ccconn *conn, enum conn_state ns)
+{
+ if (conn->state != ns) {
+ if (conn->cc->log & CCLOG_CONN_STATE)
+ cc_conn_log(conn, "%s -> %s",
+ stab[conn->state], stab[ns]);
+ conn->state = ns;
+ }
+}
+
+const char *
+cc_party_state2str(u_int s)
+{
+ if (s >= sizeof(ptab) / sizeof(ptab[0]) || ptab[s] == NULL)
+ return ("?");
+ return (ptab[s]);
+}
+
+__inline void
+cc_party_set_state(struct ccparty *party, enum party_state ns)
+{
+
+ if (party->state != ns) {
+ if (party->conn->cc->log & CCLOG_PARTY_STATE)
+ cc_party_log(party, "%s -> %s",
+ ptab[party->state], ptab[ns]);
+ party->state = ns;
+ }
+}
+
+/*
+ * Remove connection from its user's queue
+ */
+__inline void
+cc_disconnect_from_user(struct ccconn *conn)
+{
+
+ if (conn->user == NULL)
+ cc_conn_log(conn, "no %s", "user");
+ else {
+ TAILQ_REMOVE(&conn->user->connq, conn, connq_link);
+ conn->user->queue_act--;
+ conn->user = NULL;
+ }
+}
+
+/*
+ * Put connection on user queue
+ */
+__inline void
+cc_connect_to_user(struct ccconn *conn, struct ccuser *user)
+{
+
+ if (conn->user != NULL)
+ cc_conn_log(conn, "still connected to %p", conn->user);
+ conn->user = user;
+ TAILQ_INSERT_TAIL(&user->connq, conn, connq_link);
+ conn->user->queue_act++;
+}
+
+/*
+ * Send a signal to the UNI stack for this connection
+ */
+static void
+cc_send_uni(struct ccconn *conn, u_int op, struct uni_msg *msg)
+{
+ struct ccreq *r;
+
+ r = CCZALLOC(sizeof(*r));
+ if (r == NULL) {
+ if (msg != NULL)
+ uni_msg_destroy(msg);
+ cc_conn_log(conn, "no memory for cookie op=%u", op);
+ return;
+ }
+
+ if ((r->cookie = ++conn->port->cc->cookie) == 0)
+ r->cookie = ++conn->port->cc->cookie;
+ r->req = op;
+ r->conn = conn;
+
+ TAILQ_INSERT_TAIL(&conn->port->cookies, r, link);
+
+ conn->port->cc->funcs->send_uni(conn, conn->port->uarg, op,
+ r->cookie, msg);
+}
+
+/*
+ * Send a RELEASE.request for this connection.
+ */
+static void
+do_release_request(struct ccconn *conn, const struct uni_ie_cause cause[2])
+{
+ struct uni_msg *u;
+ struct uniapi_release_request *req;
+
+ if ((u = uni_msg_alloc(sizeof(*req))) == NULL)
+ return;
+ req = uni_msg_wptr(u, struct uniapi_release_request *);
+ memset(req, 0, sizeof(*req));
+ u->b_wptr += sizeof(struct uniapi_release_request);
+
+ req->release.hdr.cref = conn->cref;
+ req->release.hdr.act = UNI_MSGACT_DEFAULT;
+
+ if (cause == NULL) {
+ IE_SETPRESENT(req->release.cause[0]);
+ req->release.cause[0].h.act = UNI_IEACT_DEFAULT;
+ req->release.cause[0].loc = UNI_CAUSE_LOC_USER;
+ req->release.cause[0].cause = UNI_CAUSE_UNSPEC;
+ } else {
+ req->release.cause[0] = cause[0];
+ req->release.cause[1] = cause[1];
+ }
+
+ cc_send_uni(conn, UNIAPI_RELEASE_request, u);
+}
+
+/*
+ * Make a RELEASE.response for this connection
+ */
+static void
+do_release_response(struct ccconn *conn, uint8_t cause, struct uni_ie_cause *ie)
+{
+ struct uni_msg *u;
+ struct uniapi_release_response *resp;
+
+ if ((u = uni_msg_alloc(sizeof(*resp))) == NULL)
+ return;
+ resp = uni_msg_wptr(u, struct uniapi_release_response *);
+ memset(resp, 0, sizeof(*resp));
+ u->b_wptr += sizeof(struct uniapi_release_response);
+
+ resp->release_compl.hdr.cref = conn->cref;
+ resp->release_compl.hdr.act = UNI_MSGACT_DEFAULT;
+
+ if (ie != NULL)
+ resp->release_compl.cause[0] = *ie;
+
+ if (cause != 0) {
+ IE_SETPRESENT(resp->release_compl.cause[0]);
+ resp->release_compl.cause[0].h.act = UNI_IEACT_DEFAULT;
+ resp->release_compl.cause[0].loc = UNI_CAUSE_LOC_USER;
+ resp->release_compl.cause[0].cause = cause;
+ }
+
+ cc_send_uni(conn, UNIAPI_RELEASE_response, u);
+}
+
+/**********************************************************************
+ *
+ * INSTANCE handling
+ */
+struct ccconn *
+cc_conn_create(struct ccdata *cc)
+{
+ struct ccconn *conn;
+
+ conn = CCZALLOC(sizeof(*conn));
+ if (conn == NULL)
+ return (NULL);
+
+ conn->state = CONN_NULL;
+ conn->port = NULL;
+ conn->cc = cc;
+ LIST_INIT(&conn->parties);
+
+ LIST_INSERT_HEAD(&cc->orphaned_conns, conn, port_link);
+
+ if (conn->cc->log & CCLOG_CONN_INST)
+ cc_conn_log(conn, "created %s", "orphaned");
+
+ return (conn);
+}
+
+/*
+ * assign to port
+ */
+void
+cc_conn_ins_port(struct ccconn *conn, struct ccport *port)
+{
+
+ if (conn->port != NULL) {
+ cc_conn_log(conn, "conn is already on port %u",
+ conn->port->param.port);
+ cc_conn_rem_port(conn);
+ }
+ LIST_REMOVE(conn, port_link);
+
+ conn->port = port;
+ LIST_INSERT_HEAD(&port->conn_list, conn, port_link);
+
+}
+
+/*
+ * remove from port
+ */
+void
+cc_conn_rem_port(struct ccconn *conn)
+{
+
+ if (conn->port == NULL) {
+ cc_conn_log(conn, "conn not on any %s", "port");
+ return;
+ }
+ LIST_REMOVE(conn, port_link);
+ conn->port = NULL;
+ LIST_INSERT_HEAD(&conn->cc->orphaned_conns, conn, port_link);
+}
+
+static void
+cc_conn_flush_cookies(struct ccconn *conn)
+{
+ struct ccreq *r, *r1;
+
+ if (conn->port == NULL)
+ return;
+ TAILQ_FOREACH_SAFE(r, &conn->port->cookies, link, r1) {
+ if (r->conn == conn) {
+ TAILQ_REMOVE(&conn->port->cookies, r, link);
+ CCFREE(r);
+ }
+ }
+}
+
+__inline void
+cc_conn_reset_acceptor(struct ccconn *conn)
+{
+ if (conn->acceptor != NULL) {
+ conn->acceptor->accepted = NULL;
+ conn->acceptor = NULL;
+ }
+}
+
+/*
+ * Destroy a connection
+ */
+void
+cc_conn_destroy(struct ccconn *conn)
+{
+ struct ccparty *p;
+
+ if (conn->cc->log & CCLOG_CONN_INST)
+ cc_conn_log(conn, "destroy%s", "");
+
+ if (conn->user != NULL) {
+ cc_conn_log(conn, "still connected to user %p\n", conn->user);
+ conn->user->queue_act--;
+ TAILQ_REMOVE(&conn->user->connq, conn, connq_link);
+ }
+
+ if (conn->acceptor != NULL)
+ conn->acceptor->accepted = NULL;
+
+ cc_conn_flush_cookies(conn);
+ cc_conn_sig_flush(conn);
+
+ LIST_REMOVE(conn, port_link);
+ while ((p = LIST_FIRST(&conn->parties)) != NULL) {
+ LIST_REMOVE(p, link);
+ CCFREE(p);
+ }
+
+ CCFREE(conn);
+}
+
+struct ccparty *
+cc_party_create(struct ccconn *conn, u_int ident, u_int flag)
+{
+ struct ccparty *party;
+
+ party = CCZALLOC(sizeof(*party));
+ if (party == NULL)
+ return (NULL);
+
+ party->conn = conn;
+ party->state = PARTY_NULL;
+ IE_SETPRESENT(party->epref);
+ party->epref.flag = flag;
+ party->epref.epref = ident;
+ LIST_INSERT_HEAD(&conn->parties, party, link);
+
+ if (party->conn->cc->log & CCLOG_PARTY_INST)
+ cc_party_log(party, "created %u.%u", flag, ident);
+
+ return (party);
+}
+
+static void
+cc_party_destroy(struct ccparty *party)
+{
+
+ if (party->conn->cc->log & CCLOG_PARTY_INST)
+ cc_party_log(party, "destroyed %u.%u", party->epref.flag,
+ party->epref.epref);
+
+ LIST_REMOVE(party, link);
+ CCFREE(party);
+}
+
+static struct ccparty *
+cc_party_find(struct ccconn *conn, u_int ident)
+{
+ struct ccparty *party;
+
+ LIST_FOREACH(party, &conn->parties, link)
+ if (party->epref.epref == ident)
+ return (party);
+ return (NULL);
+}
+/*
+ * Abort connection from down stream (because of the UNI hook beeing
+ * disconnected). This is called from two places:
+ * 1) the shutdown code.
+ * In this case the connections should be already dissociated from
+ * users and be only in states waiting for the UNI stack.
+ * 2) from the disconnect code.
+ */
+void
+cc_conn_abort(struct ccconn *conn, int shutdown)
+{
+ struct ccuser *u = conn->user;
+ struct ccparty *p, *p1;
+
+ if (shutdown) {
+ CCASSERT(u == NULL, ("still in use"));
+ CCASSERT(conn->acceptor == NULL, ("still in use"));
+ cc_conn_destroy(conn);
+ return;
+ }
+
+ /*
+ * Look whether any parties are blocked waiting for a response
+ * from the stack. We don't use extra party states to handle
+ * user aborts, so check that there is a user before using it.
+ */
+ if (u == NULL) {
+ while ((p = LIST_FIRST(&conn->parties)) != NULL)
+ cc_party_destroy(p);
+ } else {
+ LIST_FOREACH_SAFE(p, &conn->parties, link, p1) {
+ switch (p->state) {
+
+ case PARTY_NULL: /* P0 */
+ /* should not happen */
+ goto dpty;
+
+ case PARTY_ACTIVE: /* P1 */
+ /* don't send a drop - user'll get a rel */
+ goto dpty;
+
+ case PARTY_ADD_WAIT_CREATE: /* P2 */
+ case PARTY_ADD_WAIT_OK: /* P3 */
+ /* we're adding - synthesise an error */
+ cc_user_sig(u, USER_SIG_ADD_PARTY_ERR,
+ NULL, ATMERR_BAD_PORT);
+ goto dpty;
+
+ case PARTY_ADD_WAIT_ACK: /* P4 */
+ /* don't send a drop - user'll get a rel */
+ goto dpty;
+
+ case PARTY_DROP_WAIT_OK: /* P5 */
+ case PARTY_DROP_WAIT_ACK: /* P6 */
+ case PARTY_ADD_DROP_WAIT_OK: /* P11 */
+ /* we're dropping - synthesis an ok */
+ cc_user_sig(u, USER_SIG_DROP_PARTY_OK,
+ NULL, p->epref.epref);
+ goto dpty;
+
+ case PARTY_WAIT_DESTROY: /* P7 */
+ goto dpty;
+
+ case PARTY_WAIT_SETUP_COMPL: /* P8 */
+ case PARTY_WAIT_SETUP_CONF: /* P10 */
+ /* first party - nothing to do */
+ goto dpty;
+
+ case PARTY_WAIT_DROP_ACK_OK: /* P9 */
+ case PARTY_ADD_DROPACK_WAIT_OK:/* P12 */
+ /* we're dropping - nothing to do */
+ goto dpty;
+ }
+ cc_party_log(p, "bad uabort for party in state %s",
+ ptab[p->state]);
+ dpty:
+ cc_party_destroy(p);
+ }
+ }
+
+ /*
+ * Now do what the connection needs
+ */
+ switch (conn->state) {
+
+ case CONN_NULL: /* 0 */
+ case CONN_OUT_PREPARING: /* 1 */
+ /* may not happen because we're not associated with
+ * aport yet */
+ break;
+
+ case CONN_OUT_WAIT_CREATE: /* 2 */
+ case CONN_OUT_WAIT_OK: /* 3 */
+ case CONN_OUT_WAIT_DESTROY: /* 37 */
+ /* return an error to the user, go back to C1/U1
+ * reset cref (for C37, C3) and cookie */
+ conn->cref.flag = 0;
+ conn->cref.cref = 0;
+ cc_conn_flush_cookies(conn);
+ cc_conn_set_state(conn, CONN_OUT_PREPARING);
+ cc_conn_rem_port(conn);
+ cc_user_sig(u, USER_SIG_CONNECT_OUTGOING_ERR,
+ NULL, ATMERR_BAD_PORT);
+ return;
+
+ case CONN_OUT_WAIT_CONF: /* 4 */
+ case CONN_ACTIVE: /* 5 */
+ case CONN_IN_WAIT_COMPL: /* 13 */
+ /* emulate a RELEASE.confirm */
+ memset(&u->cause, 0, sizeof(u->cause));
+ cc_user_sig(u, USER_SIG_RELEASE_CONFIRM, NULL, 0);
+ cc_disconnect_from_user(conn);
+ cc_conn_destroy(conn);
+ return;
+
+ case CONN_IN_PREPARING: /* 10 */
+ case CONN_AB_WAIT_REQ_OK: /* 33 */
+ case CONN_AB_WAIT_RESP_OK: /* 34 */
+ case CONN_AB_FLUSH_IND: /* 35 */
+ /* no user - destroy */
+ cc_conn_destroy(conn);
+ return;
+
+ case CONN_IN_ARRIVED: /* 11 */
+ u->aborted = 1;
+ cc_disconnect_from_user(conn);
+ cc_conn_destroy(conn);
+ return;
+
+ case CONN_IN_WAIT_ACCEPT_OK: /* 12 */
+ /* return ACCEPT error */
+ cc_disconnect_from_user(conn);
+ cc_conn_reset_acceptor(conn);
+ cc_user_sig(u, USER_SIG_ACCEPT_ERR,
+ u, ATMERR_PREVIOUSLY_ABORTED);
+ cc_conn_destroy(conn);
+ return;
+
+ case CONN_REJ_WAIT_OK: /* 14 */
+ /* return REJECT ok */
+ cc_disconnect_from_user(conn);
+ cc_conn_destroy(conn);
+ cc_user_sig(u, USER_SIG_REJECT_OK, NULL, 0);
+ return;
+
+ case CONN_REL_IN_WAIT_OK: /* 15 */
+ case CONN_REL_WAIT_OK: /* 20 */
+ /* confirm destroy */
+ if (u != NULL) {
+ /* connection not aborted */
+ memset(&u->cause, 0, sizeof(u->cause));
+ cc_user_sig(u, USER_SIG_RELEASE_CONFIRM, NULL, 0);
+ cc_disconnect_from_user(conn);
+ }
+ cc_conn_destroy(conn);
+ return;
+
+ case CONN_IN_WAITING: /* 21 */
+ /* user has not seen the connection - destroy */
+ cc_disconnect_from_user(conn);
+ cc_conn_destroy(conn);
+ return;
+ }
+ cc_conn_log(conn, "bad state %s", stab[conn->state]);
+}
+
+#ifdef DEBUG_MATCH
+static void
+print_sap(const struct uni_sap *sap)
+{
+ static const char *const tags[] = {
+ [UNISVE_ABSENT] "absent",
+ [UNISVE_PRESENT]"present",
+ [UNISVE_ANY] "any",
+ };
+ u_int i;
+
+ printf("addr={%s", tags[sap->addr.tag]);
+ if (sap->addr.tag == UNISVE_PRESENT) {
+ printf(",%d-%d", sap->addr.type, sap->addr.plan);
+ for (i = 0; i < sap->addr.len; i++)
+ printf("%c%02x", ",:"[i!=0], sap->addr.addr[i]);
+ }
+ printf("}\n");
+
+ printf("selector={%s", tags[sap->selector.tag]);
+ if (sap->selector.tag == UNISVE_PRESENT)
+ printf(",%02x", sap->selector.selector);
+ printf("}\n");
+
+ printf("blli_id2={%s", tags[sap->blli_id2.tag]);
+ if (sap->blli_id2.tag == UNISVE_PRESENT)
+ printf(",%02x,%02x", sap->blli_id2.proto, sap->blli_id2.user);
+ printf("}\n");
+
+ printf("blli_id3={%s", tags[sap->blli_id3.tag]);
+ if (sap->blli_id3.tag == UNISVE_PRESENT)
+ printf(",%02x,%02x,%02x,%06x,%04x,%d",
+ sap->blli_id3.proto, sap->blli_id3.user,
+ sap->blli_id3.ipi, sap->blli_id3.oui,
+ sap->blli_id3.pid, sap->blli_id3.noipi);
+ printf("}\n");
+
+ printf("bhli={%s", tags[sap->bhli.tag]);
+ if (sap->bhli.tag == UNISVE_PRESENT) {
+ printf(",%d", sap->bhli.type);
+ for (i = 0; i < sap->bhli.len; i++)
+ printf("%c%02x", ",:"[i!=0], sap->bhli.info[i]);
+ }
+ printf("}\n");
+}
+#endif
+
+/*********************************************************************
+ *
+ * DISPATCH incoming call
+ */
+void
+cc_conn_dispatch(struct ccconn *conn)
+{
+ struct ccdata *priv = conn->port->cc;
+ struct ccuser *user;
+ u_int blli_index;
+
+#ifdef DEBUG_MATCH
+ static char buf[1000];
+ static struct unicx cx;
+ static int init = 1;
+
+ if (init) {
+ uni_initcx(&cx);
+ init = 0;
+ }
+#endif
+
+ /*
+ * Do call dispatching according to 4.6
+ */
+#ifdef DEBUG_MATCH
+ printf("+++++ DISPATCH++++++\n");
+#endif
+ for (blli_index = 0; blli_index < UNI_NUM_IE_BLLI; blli_index++) {
+ if (blli_index > 0 && !IE_ISGOOD(conn->blli[blli_index]))
+ break;
+#ifdef DEBUG_MATCH
+ if (IE_ISPRESENT(conn->called)) {
+ uni_print_ie(buf, sizeof(buf), UNI_IE_CALLED,
+ (union uni_ieall *)&conn->called, &cx);
+ printf("called=%s\n", buf);
+ }
+ if (IE_ISPRESENT(conn->bhli)) {
+ uni_print_ie(buf, sizeof(buf), UNI_IE_BHLI,
+ (union uni_ieall *)&conn->bhli, &cx);
+ printf("bhli=%s\n", buf);
+ }
+ if (IE_ISPRESENT(conn->blli[blli_index])) {
+ uni_print_ie(buf, sizeof(buf), UNI_IE_BLLI,
+ (union uni_ieall *)&conn->blli[blli_index], &cx);
+ printf("%s\n", buf);
+ }
+#endif
+ LIST_FOREACH(user, &priv->user_list, node_link) {
+ if ((user->state == USER_IN_WAITING ||
+ user->state == USER_IN_ARRIVED ||
+ user->state == USER_IN_WAIT_ACC ||
+ user->state == USER_IN_WAIT_REJ) &&
+ !unisve_is_catchall(user->sap)) {
+#ifdef DEBUG_MATCH
+ printf("TRYING user=%p\n", user);
+ print_sap(user->sap);
+#endif
+ if (unisve_match(user->sap, &conn->called,
+ &conn->blli[blli_index], &conn->bhli))
+ goto found;
+ }
+ }
+ }
+#ifdef DEBUG_MATCH
+ printf("TRYING CATCHALL\n");
+#endif
+ blli_index = 0;
+ LIST_FOREACH(user, &priv->user_list, node_link) {
+ if ((user->state == USER_IN_WAITING ||
+ user->state == USER_IN_ARRIVED ||
+ user->state == USER_IN_WAIT_ACC ||
+ user->state == USER_IN_WAIT_REJ) &&
+ unisve_is_catchall(user->sap))
+ goto found;
+ }
+#ifdef DEBUG_MATCH
+ printf("SORRY\n");
+#endif
+
+ /*
+ * No application found - reject call.
+ */
+ do_release_response(conn, UNI_CAUSE_INCOMP, NULL);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ return;
+
+ found:
+#ifdef DEBUG_MATCH
+ printf("MATCH\n");
+#endif
+ if (user->queue_max == user->queue_act) {
+ do_release_response(conn, UNI_CAUSE_BUSY, NULL);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ return;
+ }
+
+ if (blli_index == 0 && !IE_ISGOOD(conn->blli[blli_index]))
+ conn->blli_selector = 0;
+ else
+ conn->blli_selector = blli_index + 1;
+
+ cc_conn_set_state(conn, CONN_IN_WAITING);
+ cc_connect_to_user(conn, user);
+
+ cc_user_sig(user, USER_SIG_SETUP_IND, NULL, 0);
+}
+
+static void
+cc_party_setup_conf(struct ccconn *conn)
+{
+ struct ccparty *party;
+
+ party = cc_party_find(conn, conn->epref.epref);
+ if (party == NULL) {
+ cc_party_log(party, "no party for %s",
+ cc_conn_sigtab[CONN_SIG_SETUP_CONFIRM]);
+ return;
+ }
+ if (party->state != PARTY_WAIT_SETUP_CONF) {
+ cc_party_log(party, "bad state=%s for signal=%s",
+ ptab[party->state], cc_conn_sigtab[CONN_SIG_SETUP_CONFIRM]);
+ return;
+ }
+ cc_party_set_state(party, PARTY_ACTIVE);
+}
+
+static void
+cc_party_add_ack_ind(struct ccconn *conn, const struct uni_ie_epref *epref)
+{
+ struct ccparty *party;
+
+ party = cc_party_find(conn, epref->epref);
+ if (party == NULL) {
+ cc_party_log(party, "no party for %s",
+ cc_conn_sigtab[CONN_SIG_PARTY_ADD_ACK_IND]);
+ }
+ if (party->state != PARTY_ADD_WAIT_ACK) {
+ cc_party_log(party, "bad state=%s for signal=%s",
+ ptab[party->state],
+ cc_conn_sigtab[CONN_SIG_PARTY_ADD_ACK_IND]);
+ return;
+ }
+ cc_party_set_state(party, PARTY_ACTIVE);
+ cc_user_sig(conn->user, USER_SIG_ADD_PARTY_ACK,
+ NULL, epref->epref);
+}
+
+static void
+cc_party_add_rej_ind(struct ccconn *conn, const struct uni_ie_epref *epref)
+{
+ struct ccparty *party;
+
+ party = cc_party_find(conn, epref->epref);
+ if (party == NULL) {
+ cc_party_log(party, "no party for %s",
+ cc_conn_sigtab[CONN_SIG_PARTY_ADD_REJ_IND]);
+ return;
+ }
+ if (party->state != PARTY_ADD_WAIT_ACK) {
+ cc_party_log(party, "bad state=%s for signal=%s",
+ ptab[party->state],
+ cc_conn_sigtab[CONN_SIG_PARTY_ADD_REJ_IND]);
+ return;
+ }
+ cc_party_set_state(party, PARTY_WAIT_DESTROY);
+ cc_user_sig(conn->user, USER_SIG_ADD_PARTY_REJ, NULL, epref->epref);
+}
+
+static void
+cc_party_drop_ack_ind(struct ccconn *conn,
+ const struct uni_drop_party *drop)
+{
+ struct ccparty *party;
+
+ party = cc_party_find(conn, drop->epref.epref);
+ if (party == NULL) {
+ cc_party_log(party, "no party for %s",
+ ptab[CONN_SIG_DROP_PARTY_ACK_IND]);
+ return;
+ }
+ switch (party->state) {
+
+ case PARTY_ACTIVE: /* P1 */
+ memset(&conn->user->cause[1], 0, sizeof(conn->user->cause[1]));
+ conn->user->cause[0] = drop->cause;
+ cc_party_set_state(party, PARTY_WAIT_DESTROY);
+ cc_user_sig(conn->user, USER_SIG_DROP_PARTY_IND,
+ NULL, party->epref.epref);
+ break;
+
+ case PARTY_ADD_WAIT_ACK: /* P4 */
+ memset(&conn->user->cause[1], 0, sizeof(conn->user->cause[1]));
+ conn->user->cause[0] = drop->cause;
+ cc_party_set_state(party, PARTY_WAIT_DESTROY);
+ cc_user_sig(conn->user, USER_SIG_ADD_PARTY_REJ,
+ NULL, party->epref.epref);
+ break;
+
+ case PARTY_DROP_WAIT_ACK: /* P6 */
+ cc_party_set_state(party, PARTY_WAIT_DESTROY);
+ cc_user_sig(conn->user, USER_SIG_DROP_PARTY_OK, NULL, 0);
+ break;
+
+ case PARTY_WAIT_SETUP_COMPL: /* P8 */
+ case PARTY_WAIT_SETUP_CONF: /* P10 */
+ cc_party_set_state(party, PARTY_WAIT_DESTROY);
+ break;
+
+ default:
+ cc_party_log(party, "bad state=%s for signal=%s",
+ ptab[party->state],
+ cc_conn_sigtab[CONN_SIG_DROP_PARTY_ACK_IND]);
+ break;
+ }
+}
+
+/*
+ * Handle a signal to this connection
+ */
+void
+cc_conn_sig_handle(struct ccconn *conn, enum conn_sig sig,
+ void *arg, u_int iarg)
+{
+ struct ccparty *party;
+
+ if (conn->cc->log & CCLOG_CONN_SIG)
+ cc_conn_log(conn, "signal %s in state %s", cc_conn_sigtab[sig],
+ stab[conn->state]);
+
+ switch (sig) {
+
+ case CONN_SIG_CONNECT_OUTGOING:
+ /* Do SETUP */
+ {
+ struct uni_msg *u;
+ struct uniapi_setup_request *setup;
+
+ if (conn->state != CONN_OUT_PREPARING)
+ goto bad_state;
+
+ if (IE_ISGOOD(conn->bearer) &&
+ conn->bearer.cfg == UNI_BEARER_MP) {
+ IE_SETPRESENT(conn->epref);
+ conn->epref.flag = 0;
+ conn->epref.epref = 0;
+ }
+
+ /*
+ * Construct message to UNI.
+ */
+ u = uni_msg_alloc(sizeof(struct uniapi_setup_request));
+ if (u == NULL) {
+ cc_user_sig(conn->user, USER_SIG_CONNECT_OUTGOING_ERR,
+ NULL, ATMERR_NOMEM);
+ return;
+ }
+ setup = uni_msg_wptr(u, struct uniapi_setup_request *);
+ memset(setup, 0, sizeof(*setup));
+ u->b_wptr += sizeof(struct uniapi_setup_request);
+
+ setup->setup.hdr.act = UNI_MSGACT_DEFAULT;
+ memcpy(setup->setup.blli, conn->blli, sizeof(conn->blli));
+ setup->setup.bearer = conn->bearer;
+ setup->setup.traffic = conn->traffic;
+ setup->setup.qos = conn->qos;
+ setup->setup.exqos = conn->exqos;
+ setup->setup.called = conn->called;
+ setup->setup.calledsub[0] = conn->calledsub;
+ setup->setup.aal = conn->aal;
+ setup->setup.epref = conn->epref;
+ setup->setup.eetd = conn->eetd;
+ setup->setup.abrsetup = conn->abrsetup;
+ setup->setup.abradd = conn->abradd;
+ setup->setup.calling = conn->calling;
+ setup->setup.callingsub[0] = conn->callingsub;
+ setup->setup.connid = conn->connid;
+ memcpy(setup->setup.tns, conn->tns, sizeof(conn->tns));
+ setup->setup.atraffic = conn->atraffic;
+ setup->setup.mintraffic = conn->mintraffic;
+ setup->setup.cscope = conn->cscope;
+ setup->setup.bhli = conn->bhli;
+ setup->setup.mdcr = conn->mdcr;
+
+ cc_conn_set_state(conn, CONN_OUT_WAIT_CREATE);
+ cc_send_uni(conn, UNIAPI_SETUP_request, u);
+
+ break;
+ }
+
+
+ case CONN_SIG_ARRIVAL:
+ /* user informed of arrival of this call */
+ if (conn->state != CONN_IN_WAITING)
+ goto bad_state;
+ cc_conn_set_state(conn, CONN_IN_ARRIVED);
+ break;
+
+
+ case CONN_SIG_RELEASE:
+ {
+ /* Release this call */
+ struct uni_msg *u;
+ struct uniapi_release_request *req;
+
+ if (conn->state != CONN_ACTIVE &&
+ conn->state != CONN_IN_WAIT_COMPL)
+ goto bad_state;
+
+ if ((u = uni_msg_alloc(sizeof(*req))) == NULL)
+ return;
+
+ req = uni_msg_wptr(u, struct uniapi_release_request *);
+ memset(req, 0, sizeof(*req));
+ u->b_wptr += sizeof(struct uniapi_release_request);
+
+ req->release.hdr.cref = conn->cref;
+ req->release.hdr.act = UNI_MSGACT_DEFAULT;
+
+ req->release.cause[0] = conn->cause[0];
+ req->release.cause[1] = conn->cause[1];
+
+ if (conn->state == CONN_ACTIVE)
+ cc_conn_set_state(conn, CONN_REL_WAIT_OK);
+ else
+ cc_conn_set_state(conn, CONN_REL_IN_WAIT_OK);
+
+ cc_send_uni(conn, UNIAPI_RELEASE_request, u);
+ break;
+ }
+
+ case CONN_SIG_REJECT:
+ {
+ /* reject from user */
+ struct ccuser *user = conn->user;
+
+ if (conn->state != CONN_IN_ARRIVED) {
+ cc_user_sig(user, USER_SIG_REJECT_ERR,
+ NULL, ATMERR_BAD_STATE);
+ break;
+ }
+ cc_conn_set_state(conn, CONN_REJ_WAIT_OK);
+ do_release_response(conn, 0, conn->cause);
+ break;
+ }
+
+
+ case CONN_SIG_ACCEPT:
+ {
+ /* User accepts. */
+ struct ccuser *newep = arg;
+ struct uni_msg *u;
+ struct uniapi_setup_response *resp;
+ struct ccuser *user = conn->user;
+
+ if (conn->state != CONN_IN_ARRIVED) {
+ cc_user_sig(user, USER_SIG_ACCEPT_ERR,
+ NULL, ATMERR_PREVIOUSLY_ABORTED);
+ break;
+ }
+
+ u = uni_msg_alloc(sizeof(struct uniapi_setup_response));
+ if (u == NULL) {
+ cc_user_sig(user, USER_SIG_ACCEPT_ERR,
+ NULL, ATMERR_NOMEM);
+ return;
+ }
+
+ /*
+ * Link to the new endpoint
+ */
+ conn->acceptor = newep;
+ newep->accepted = conn;
+
+ /*
+ * Construct connect message
+ */
+ resp = uni_msg_wptr(u, struct uniapi_setup_response *);
+ memset(resp, 0, sizeof(*resp));
+ u->b_wptr += sizeof(*resp);
+
+ resp->connect.hdr.act = UNI_MSGACT_DEFAULT;
+ resp->connect.hdr.cref = conn->cref;
+
+ /*
+ * attributes
+ */
+ if (conn->dirty_attr && CCDIRTY_AAL)
+ resp->connect.aal = conn->aal;
+ if (conn->dirty_attr && CCDIRTY_BLLI)
+ resp->connect.blli =
+ conn->blli[conn->blli_selector - 1];
+ if (conn->dirty_attr && CCDIRTY_CONNID)
+ resp->connect.connid = conn->connid;
+ /* XXX NOTIFY */
+ if (conn->dirty_attr && CCDIRTY_EETD)
+ resp->connect.eetd = conn->eetd;
+ /* XXX GIT */
+ /* XXX UU */
+ if (conn->dirty_attr && CCDIRTY_TRAFFIC)
+ resp->connect.traffic = conn->traffic;
+ if (conn->dirty_attr && CCDIRTY_EXQOS)
+ resp->connect.exqos = conn->exqos;
+ if (conn->dirty_attr && CCDIRTY_ABRSETUP)
+ resp->connect.abrsetup = conn->abrsetup;
+ if (conn->dirty_attr && CCDIRTY_ABRADD)
+ resp->connect.abradd = conn->abradd;
+
+ /*
+ * If the SETUP had an endpoint reference - echo it back
+ */
+ if (IE_ISPRESENT(conn->epref)) {
+ resp->connect.epref = conn->epref;
+ resp->connect.epref.flag = !resp->connect.epref.flag;
+ }
+
+ cc_conn_set_state(conn, CONN_IN_WAIT_ACCEPT_OK);
+ cc_send_uni(conn, UNIAPI_SETUP_response, u);
+ break;
+ }
+
+
+ case CONN_SIG_ADD_PARTY:
+ {
+ /* request to add party from user */
+ struct uni_msg *u;
+ struct uniapi_add_party_request *req;
+
+ if (conn->state != CONN_ACTIVE)
+ goto bad_state;
+
+ /* create the party */
+ party = cc_party_create(conn, (u_int)(uintptr_t)arg, 0);
+ if (party == NULL) {
+ cc_user_sig(conn->user, USER_SIG_ADD_PARTY_ERR,
+ NULL, ATMERR_NOMEM);
+ return;
+ }
+ party->called = conn->called;
+
+ /* Construct message to UNI. */
+ u = uni_msg_alloc(sizeof(struct uniapi_setup_request));
+ if (u == NULL) {
+ cc_party_destroy(party);
+ cc_user_sig(conn->user, USER_SIG_ADD_PARTY_ERR,
+ NULL, ATMERR_NOMEM);
+ return;
+ }
+
+ req = uni_msg_wptr(u, struct uniapi_add_party_request *);
+ memset(req, 0, sizeof(*req));
+ u->b_wptr += sizeof(struct uniapi_add_party_request);
+
+ req->add.hdr.act = UNI_MSGACT_DEFAULT;
+ req->add.hdr.cref = conn->cref;
+ req->add.epref = party->epref;
+ req->add.called = party->called;
+
+ cc_party_set_state(party, PARTY_ADD_WAIT_CREATE);
+ cc_send_uni(conn, UNIAPI_ADD_PARTY_request, u);
+ break;
+ }
+
+
+ case CONN_SIG_DROP_PARTY:
+ {
+ /* user request to drop a party */
+ struct uni_msg *u;
+ struct uniapi_drop_party_request *req;
+
+ if (conn->state != CONN_ACTIVE)
+ goto bad_state;
+
+ party = cc_party_find(conn, (u_int)(uintptr_t)arg);
+ if (party == NULL) {
+ cc_user_sig(conn->user, USER_SIG_DROP_PARTY_ERR,
+ NULL, ATMERR_BAD_PARTY);
+ return;
+ }
+
+ switch (party->state) {
+
+ case PARTY_ACTIVE:
+ case PARTY_ADD_WAIT_ACK:
+ break;
+
+ default:
+ cc_user_sig(conn->user, USER_SIG_DROP_PARTY_ERR,
+ NULL, ATMERR_BAD_STATE);
+ return;
+
+ }
+ /*
+ * Construct message to UNI.
+ */
+ u = uni_msg_alloc(sizeof(*req));
+ if (u == NULL) {
+ cc_user_sig(conn->user, USER_SIG_DROP_PARTY_ERR,
+ NULL, ATMERR_NOMEM);
+ return;
+ }
+
+ req = uni_msg_wptr(u, struct uniapi_drop_party_request *);
+ memset(req, 0, sizeof(*req));
+ u->b_wptr += sizeof(struct uniapi_drop_party_request);
+
+ req->drop.hdr.act = UNI_MSGACT_DEFAULT;
+ req->drop.hdr.cref = conn->cref;
+ req->drop.epref = party->epref;
+ req->drop.cause = conn->cause[0];
+
+ if (party->state == PARTY_ACTIVE)
+ cc_party_set_state(party, PARTY_DROP_WAIT_OK);
+ else
+ cc_party_set_state(party, PARTY_ADD_DROP_WAIT_OK);
+ cc_send_uni(conn, UNIAPI_DROP_PARTY_request, u);
+ break;
+ }
+
+ case CONN_SIG_DROP_PARTY_ACK_IND:
+ {
+ struct uni_msg *msg = arg;
+ struct uniapi_drop_party_ack_indication *ind = uni_msg_rptr(msg,
+ struct uniapi_drop_party_ack_indication *);
+
+ cc_party_drop_ack_ind(conn, &ind->drop);
+ break;
+ }
+
+
+ case CONN_SIG_USER_ABORT:
+ /*
+ * Aborting a connection. This is callable in all states.
+ * The connection is already disconnected from the user.
+ * The cause is in cause[].
+ */
+ switch (conn->state) {
+
+ case CONN_NULL: /* C0 */
+ case CONN_OUT_PREPARING: /* C1 */
+ cc_conn_destroy(conn);
+ break;
+
+ case CONN_OUT_WAIT_CONF: /* C4 */
+ case CONN_ACTIVE: /* C5 */
+ do_release_request(conn, conn->cause);
+ cc_conn_set_state(conn, CONN_AB_WAIT_REQ_OK);
+ break;
+
+ case CONN_IN_WAITING: /* C21 */
+ /* that should not happen */
+ goto bad_state;
+ break;
+
+ case CONN_IN_ARRIVED: /* C11 */
+ /*
+ * This is called only for the first connection
+ * of the user - the others are re-dispatched.
+ */
+ do_release_response(conn, 0, conn->cause);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ break;
+
+ case CONN_IN_WAIT_COMPL: /* C13 */
+ do_release_request(conn, conn->cause);
+ cc_conn_set_state(conn, CONN_AB_WAIT_REQ_OK);
+ break;
+
+ case CONN_OUT_WAIT_DESTROY: /* C20 */
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ break;
+
+ case CONN_IN_WAIT_ACCEPT_OK: /* C12 */
+ case CONN_AB_WAIT_REQ_OK: /* C33 */
+ case CONN_AB_WAIT_RESP_OK: /* C34 */
+ case CONN_AB_FLUSH_IND: /* C35 */
+ /* just ignore */
+ break;
+
+ /*
+ * The following states may not happen, because
+ * we're waiting for a response from the UNI stack.
+ * As soon as the response comes the ABORT is undefered
+ * and will hit us (but in another state).
+ */
+ case CONN_OUT_WAIT_CREATE: /* C2 */
+ case CONN_OUT_WAIT_OK: /* C3 */
+ case CONN_IN_PREPARING: /* C10 */
+ case CONN_REJ_WAIT_OK: /* C14 */
+ case CONN_REL_IN_WAIT_OK: /* C15 */
+ case CONN_REL_WAIT_OK: /* C20 */
+ goto bad_state;
+ }
+ break;
+
+
+ case CONN_SIG_CREATED:
+ {
+ /*
+ * CALL_CREATED message from UNI. This can happen for either
+ * incoming or outgoing connections.
+ */
+ struct uni_msg *msg = arg;
+ struct uniapi_call_created *cr = uni_msg_rptr(msg,
+ struct uniapi_call_created *);
+
+ switch (conn->state) {
+
+ case CONN_OUT_WAIT_CREATE:
+ conn->cref = cr->cref;
+ cc_conn_set_state(conn, CONN_OUT_WAIT_OK);
+ break;
+
+ case CONN_NULL:
+ conn->cref = cr->cref;
+ cc_conn_set_state(conn, CONN_IN_PREPARING);
+ break;
+
+ default:
+ goto bad_state;
+ }
+ break;
+ }
+
+ case CONN_SIG_DESTROYED:
+ /*
+ * CALL_DESTROYED message from UNI.
+ */
+ switch (conn->state) {
+
+ case CONN_OUT_WAIT_DESTROY:
+ cc_conn_rem_port(conn);
+ cc_conn_set_state(conn, CONN_OUT_PREPARING);
+ if (conn->user != NULL)
+ cc_user_sig(conn->user,
+ USER_SIG_CONNECT_OUTGOING_ERR,
+ NULL, ATM_MKUNIERR(conn->reason));
+ break;
+
+ case CONN_AB_FLUSH_IND:
+ cc_conn_destroy(conn);
+ break;
+
+ case CONN_IN_PREPARING:
+ cc_conn_destroy(conn);
+ break;
+
+ default:
+ goto bad_state;
+ }
+ break;
+
+
+ case CONN_SIG_SETUP_CONFIRM:
+ /* Setup confirm from the UNI. */
+ {
+ struct uni_msg *msg = arg;
+ struct uniapi_setup_confirm *conf = uni_msg_rptr(msg,
+ struct uniapi_setup_confirm *);
+
+ switch (conn->state) {
+
+ case CONN_OUT_WAIT_CONF:
+ /*
+ * Shuffle attributes and inform the user.
+ * Negotiable attributes are condititionally shuffled,
+ * because not returning it means accepting it
+ * (in case of blli the first instance of it).
+ * All others are shuffled unconditionally.
+ * Here we should also open the VCI in the driver. (XXX)
+ */
+#define SHUFFLE(ATTR) conn->ATTR = conf->connect.ATTR
+#define COND_SHUFFLE(ATTR) if (IE_ISPRESENT(conf->connect.ATTR)) SHUFFLE(ATTR)
+
+ COND_SHUFFLE(aal);
+ (void)memset(conn->blli + 1, 0,
+ sizeof(conn->blli) - sizeof(conn->blli[0]));
+ if (IE_ISPRESENT(conf->connect.blli))
+ conn->blli[0] = conf->connect.blli;
+ conn->blli_selector = 1;
+ COND_SHUFFLE(epref);
+ SHUFFLE(conned);
+ SHUFFLE(connedsub);
+ SHUFFLE(eetd);
+ COND_SHUFFLE(traffic);
+ COND_SHUFFLE(exqos);
+ COND_SHUFFLE(abrsetup);
+ COND_SHUFFLE(abradd);
+ COND_SHUFFLE(connid);
+#undef SHUFFLE
+#undef COND_SHUFFLE
+ if (IE_ISGOOD(conn->epref))
+ cc_party_setup_conf(conn);
+
+ cc_conn_set_state(conn, CONN_ACTIVE);
+ cc_user_sig(conn->user, USER_SIG_SETUP_CONFIRM,
+ NULL, 0);
+ break;
+
+ case CONN_AB_FLUSH_IND:
+ case CONN_AB_WAIT_RESP_OK:
+ break;
+
+ default:
+ goto bad_state;
+ }
+ break;
+ }
+
+ case CONN_SIG_SETUP_IND:
+ {
+ /* SETUP indication */
+ struct uni_msg *msg = arg;
+ struct uniapi_setup_indication *ind = uni_msg_rptr(msg,
+ struct uniapi_setup_indication *);
+ u_int i;
+
+ if (conn->state != CONN_IN_PREPARING)
+ goto bad_state;
+
+ /*
+ * Shuffle information elements.
+ */
+ for (i = 0; i < UNI_NUM_IE_BLLI; i++)
+ conn->blli[i] = ind->setup.blli[i];
+ conn->bearer = ind->setup.bearer;
+ conn->traffic = ind->setup.traffic;
+ conn->qos = ind->setup.qos;
+ conn->exqos = ind->setup.exqos;
+ conn->called = ind->setup.called;
+ conn->calledsub = ind->setup.calledsub[0];
+ conn->aal = ind->setup.aal;
+ conn->epref = ind->setup.epref;
+ conn->eetd = ind->setup.eetd;
+ conn->abrsetup = ind->setup.abrsetup;
+ conn->abradd = ind->setup.abradd;
+ conn->calling = ind->setup.calling;
+ conn->callingsub = ind->setup.callingsub[0];
+ conn->connid = ind->setup.connid;
+ for (i = 0; i < UNI_NUM_IE_TNS; i++)
+ conn->tns[i] = ind->setup.tns[i];
+ conn->atraffic = ind->setup.atraffic;
+ conn->mintraffic = ind->setup.mintraffic;
+ conn->cscope = ind->setup.cscope;
+ conn->bhli = ind->setup.bhli;
+ conn->mdcr = ind->setup.mdcr;
+
+ cc_conn_dispatch(conn);
+ break;
+ }
+
+
+ case CONN_SIG_SETUP_COMPL:
+ {
+ struct uni_msg *msg = arg;
+ struct uniapi_setup_indication *ind __unused =
+ uni_msg_rptr(msg, struct uniapi_setup_indication *);
+
+ /* SETUP_COMPLETE.indication from UNI */
+ if (conn->state == CONN_AB_FLUSH_IND ||
+ conn->state == CONN_AB_WAIT_RESP_OK)
+ break;
+
+ if (conn->state != CONN_IN_WAIT_COMPL)
+ goto bad_state;
+
+ cc_conn_set_state(conn, CONN_ACTIVE);
+
+ LIST_FOREACH(party, &conn->parties, link) {
+ if (party->state == PARTY_WAIT_SETUP_COMPL)
+ cc_party_set_state(party, PARTY_ACTIVE);
+ else
+ cc_party_log(party, "bad state=%s for sig=%s",
+ ptab[party->state],
+ cc_conn_sigtab[CONN_SIG_SETUP_COMPL]);
+ }
+
+ cc_user_sig(conn->user, USER_SIG_SETUP_COMPL, NULL, 0);
+ break;
+ }
+
+
+ case CONN_SIG_PROC_IND:
+ {
+ /*
+ * ALERTING.indication and PROCEEDING.indication are entirly
+ * ignored by the specification. We need to at least save the
+ * connid information element.
+ */
+ struct uni_msg *msg = arg;
+ struct uniapi_proceeding_indication *ind = uni_msg_rptr(msg,
+ struct uniapi_proceeding_indication *);
+
+ switch (conn->state) {
+
+ case CONN_OUT_WAIT_CONF:
+ if (IE_ISGOOD(ind->call_proc.connid))
+ conn->connid = ind->call_proc.connid;
+ break;
+
+ case CONN_AB_FLUSH_IND:
+ case CONN_AB_WAIT_RESP_OK:
+ break;
+
+ default:
+ goto bad_state;
+ }
+ break;
+ }
+
+ case CONN_SIG_ALERTING_IND:
+ {
+ struct uni_msg *msg = arg;
+ struct uniapi_alerting_indication *ind = uni_msg_rptr(msg,
+ struct uniapi_alerting_indication *);
+
+ switch (conn->state) {
+
+ case CONN_OUT_WAIT_CONF:
+ if (IE_ISGOOD(ind->alerting.connid))
+ conn->connid = ind->alerting.connid;
+ break;
+
+ case CONN_AB_FLUSH_IND:
+ case CONN_AB_WAIT_RESP_OK:
+ break;
+
+ default:
+ goto bad_state;
+ }
+ break;
+ }
+
+ case CONN_SIG_REL_CONF:
+ {
+ /* RELEASE.confirm from UNI */
+ struct uni_msg *msg = arg;
+ struct uniapi_release_confirm *conf = uni_msg_rptr(msg,
+ struct uniapi_release_confirm *);
+
+ switch (conn->state) {
+
+ case CONN_OUT_WAIT_CONF:
+ case CONN_ACTIVE:
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ memcpy(conn->user->cause, conf->release.cause,
+ sizeof(conn->user->cause));
+ /*
+ * If any party is in P6, ok the user
+ */
+ LIST_FOREACH(party, &conn->parties, link) {
+ if (party->state == PARTY_DROP_WAIT_ACK) {
+ cc_party_set_state(party,
+ PARTY_WAIT_DESTROY);
+ cc_user_sig(conn->user,
+ USER_SIG_DROP_PARTY_OK,
+ NULL, party->epref.epref);
+ }
+ }
+ cc_user_sig(conn->user, USER_SIG_RELEASE_CONFIRM,
+ NULL, 0);
+ cc_disconnect_from_user(conn);
+ break;
+
+ case CONN_AB_FLUSH_IND:
+ case CONN_AB_WAIT_RESP_OK:
+ break;
+
+ case CONN_IN_WAITING:
+ cc_disconnect_from_user(conn);
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ break;
+
+ case CONN_IN_ARRIVED:
+ conn->user->aborted = 1;
+ memcpy(conn->user->cause, conf->release.cause,
+ sizeof(conn->user->cause));
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ cc_disconnect_from_user(conn);
+ break;
+
+ case CONN_IN_WAIT_COMPL:
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ memcpy(conn->user->cause, conf->release.cause,
+ sizeof(conn->user->cause));
+ cc_user_sig(conn->user, USER_SIG_RELEASE_CONFIRM,
+ NULL, 0);
+ cc_disconnect_from_user(conn);
+ break;
+
+ default:
+ goto bad_state;
+ }
+ break;
+ }
+
+ case CONN_SIG_REL_IND:
+ {
+ /* RELEASE.ind from UNI */
+ struct uni_msg *msg = arg;
+ struct uniapi_release_indication *conf = uni_msg_rptr(msg,
+ struct uniapi_release_indication *);
+
+ switch (conn->state) {
+
+ case CONN_OUT_WAIT_CONF:
+ case CONN_ACTIVE:
+ do_release_response(conn, 0, NULL);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ memcpy(conn->user->cause, conf->release.cause,
+ sizeof(conn->user->cause));
+ /*
+ * If any party is in P6, ok the user
+ */
+ LIST_FOREACH(party, &conn->parties, link) {
+ if (party->state == PARTY_DROP_WAIT_ACK) {
+ cc_party_set_state(party,
+ PARTY_WAIT_DESTROY);
+ cc_user_sig(conn->user,
+ USER_SIG_DROP_PARTY_OK,
+ NULL, party->epref.epref);
+ }
+ }
+ cc_user_sig(conn->user, USER_SIG_RELEASE_CONFIRM,
+ NULL, 0);
+ cc_disconnect_from_user(conn);
+ break;
+
+ case CONN_AB_FLUSH_IND:
+ case CONN_AB_WAIT_RESP_OK:
+ break;
+
+ case CONN_IN_WAITING:
+ cc_disconnect_from_user(conn);
+ do_release_response(conn, 0, NULL);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ break;
+
+ case CONN_IN_ARRIVED:
+ conn->user->aborted = 1;
+ cc_disconnect_from_user(conn);
+ do_release_response(conn, 0, NULL);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ break;
+
+ case CONN_IN_WAIT_COMPL:
+ do_release_response(conn, 0, NULL);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ memcpy(conn->user->cause, conf->release.cause,
+ sizeof(conn->user->cause));
+ cc_user_sig(conn->user, USER_SIG_RELEASE_CONFIRM,
+ NULL, 0);
+ cc_disconnect_from_user(conn);
+ break;
+ default:
+ goto bad_state;
+ break;
+ }
+ break;
+ }
+
+ case CONN_SIG_PARTY_ALERTING_IND:
+ /* party alerting from UNI */
+ if (conn->state == CONN_AB_FLUSH_IND)
+ break;
+ if (conn->state != CONN_ACTIVE)
+ goto bad_state;
+ /* ignore */
+ break;
+
+ case CONN_SIG_PARTY_ADD_ACK_IND:
+ {
+ /* ADD PARTY ACKNOWLEDGE from UNI */
+ struct uni_msg *msg = arg;
+ struct uniapi_add_party_ack_indication *ind = uni_msg_rptr(msg,
+ struct uniapi_add_party_ack_indication *);
+
+ if (conn->state == CONN_AB_FLUSH_IND)
+ break;
+ if (conn->state != CONN_ACTIVE)
+ goto bad_state;
+
+ cc_party_add_ack_ind(conn, &ind->ack.epref);
+ break;
+ }
+
+
+ case CONN_SIG_PARTY_ADD_REJ_IND:
+ {
+ /* ADD PARTY REJECT indication */
+ struct uni_msg *msg = arg;
+ struct uniapi_add_party_rej_indication *ind = uni_msg_rptr(msg,
+ struct uniapi_add_party_rej_indication *);
+
+ if (conn->state == CONN_AB_FLUSH_IND)
+ break;
+ if (conn->state != CONN_ACTIVE)
+ goto bad_state;
+
+ memset(&conn->user->cause[1], 0, sizeof(conn->user->cause[1]));
+ conn->user->cause[0] = ind->rej.cause;
+
+ cc_party_add_rej_ind(conn, &ind->rej.epref);
+ break;
+ }
+
+
+ case CONN_SIG_DROP_PARTY_IND:
+ {
+ /* DROP_PARTY.indication from UNI */
+ struct uni_msg *msg = arg;
+ struct uniapi_drop_party_indication *ind = uni_msg_rptr(msg,
+ struct uniapi_drop_party_indication *);
+ struct uniapi_drop_party_ack_request *req;
+ struct uni_msg *u;
+
+ if (conn->state == CONN_AB_FLUSH_IND)
+ break;
+ if (conn->state != CONN_ACTIVE)
+ goto bad_state;
+
+ party = cc_party_find(conn, ind->drop.epref.epref);
+ if (party == NULL) {
+ cc_party_log(party, "no party for %s",
+ cc_conn_sigtab[sig]);
+ break;
+ }
+
+ u = uni_msg_alloc(sizeof(*req));
+ if (u == NULL)
+ return;
+
+ memset(&conn->user->cause[1], 0, sizeof(conn->user->cause[1]));
+ conn->user->cause[0] = ind->drop.cause;
+
+ switch (party->state) {
+
+ default:
+ cc_party_log(party, "bad state %s for DROP.ind",
+ ptab[party->state]);
+ /* FALLTHRU */
+
+ case PARTY_ACTIVE: /* P1 -> P9 */
+ cc_party_set_state(party, PARTY_WAIT_DROP_ACK_OK);
+ break;
+
+ case PARTY_ADD_WAIT_ACK: /* P4 -> P12 */
+ cc_party_set_state(party, PARTY_ADD_DROPACK_WAIT_OK);
+ break;
+ }
+
+ /*
+ * Construct message to UNI.
+ */
+ req = uni_msg_wptr(u, struct uniapi_drop_party_ack_request *);
+ memset(req, 0, sizeof(*req));
+ u->b_wptr += sizeof(*req);
+
+ IE_SETPRESENT(req->ack.epref);
+ req->ack.hdr.act = UNI_MSGACT_DEFAULT;
+ req->ack.hdr.cref = conn->cref;
+
+ req->ack.epref.flag = 0;
+ req->ack.epref.epref = ind->drop.epref.epref;
+
+ cc_send_uni(conn, UNIAPI_DROP_PARTY_ACK_request, u);
+ break;
+ }
+
+ case CONN_SIG_OK:
+ {
+ /* OK response from UNI */
+ struct ccuser *user = conn->user;
+
+ switch (conn->state) {
+
+ case CONN_OUT_WAIT_OK: /* C3 */
+ cc_conn_set_state(conn, CONN_OUT_WAIT_CONF);
+ if (conn->user != NULL)
+ cc_user_sig(conn->user,
+ USER_SIG_CONNECT_OUTGOING_OK, NULL, 0);
+ break;
+
+ case CONN_AB_WAIT_RESP_OK: /* C33 */
+ case CONN_AB_WAIT_REQ_OK: /* C34 */
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ break;
+
+ case CONN_REL_WAIT_OK: /* C20 */
+ case CONN_REL_IN_WAIT_OK: /* C15 */
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ if (conn->user != NULL) {
+ /* connection has not been aborted */
+ memset(&conn->user->cause, 0,
+ sizeof(conn->user->cause));
+ cc_user_sig(conn->user,
+ USER_SIG_RELEASE_CONFIRM, NULL, 0);
+ cc_disconnect_from_user(conn);
+ }
+ break;
+
+ case CONN_IN_WAIT_ACCEPT_OK: /* C12 */
+ if (user == NULL) {
+ /* has been aborted */
+ do_release_request(conn, NULL);
+ cc_conn_set_state(conn, CONN_AB_WAIT_REQ_OK);
+ break;
+ }
+ cc_conn_set_state(conn, CONN_IN_WAIT_COMPL);
+ cc_disconnect_from_user(conn);
+ cc_user_sig(user, USER_SIG_ACCEPT_OK, NULL, 0);
+ if (conn->acceptor == NULL) {
+ do_release_request(conn, NULL);
+ cc_conn_set_state(conn, CONN_AB_WAIT_REQ_OK);
+ break;
+ }
+ cc_connect_to_user(conn, conn->acceptor);
+ cc_conn_reset_acceptor(conn);
+ cc_user_sig(conn->user, USER_SIG_ACCEPTING, NULL, 0);
+ break;
+
+ case CONN_REJ_WAIT_OK: /* C14 */
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ if (user != NULL) {
+ cc_disconnect_from_user(conn);
+ cc_user_sig(user, USER_SIG_REJECT_OK, NULL, 0);
+ }
+ break;
+
+ default:
+ /* maybe it's for a party */
+ LIST_FOREACH(party, &conn->parties, link) {
+ switch (party->state) {
+
+ case PARTY_ADD_WAIT_OK: /* P3 */
+ if (user != NULL)
+ cc_user_sig(user,
+ USER_SIG_ADD_PARTY_OK,
+ NULL, 0);
+ cc_party_set_state(party,
+ PARTY_ADD_WAIT_ACK);
+ goto ex_party_ok;
+
+ case PARTY_DROP_WAIT_OK: /* P5 */
+ cc_party_set_state(party,
+ PARTY_DROP_WAIT_ACK);
+ goto ex_party_ok;
+
+ case PARTY_WAIT_DROP_ACK_OK: /* P9 */
+ case PARTY_ADD_DROPACK_WAIT_OK:/* P12 */
+ {
+ struct ccparty *p1;
+
+ cc_party_set_state(party,
+ PARTY_WAIT_DESTROY);
+ /* signal to user only if there are any other parties */
+ LIST_FOREACH(p1, &conn->parties, link)
+ if (p1 != party)
+ break;
+ if (p1 != NULL && user != NULL)
+ cc_user_sig(user,
+ USER_SIG_DROP_PARTY_IND,
+ NULL,
+ party->epref.epref);
+
+ goto ex_party_ok;
+ }
+
+ case PARTY_ADD_DROP_WAIT_OK: /* P11 */
+ cc_party_set_state(party,
+ PARTY_DROP_WAIT_ACK);
+ goto ex_party_ok;
+
+ default:
+ break;
+ }
+ }
+ goto bad_state;
+ ex_party_ok:
+ break;
+ }
+ break;
+ }
+
+ case CONN_SIG_ERROR:
+ {
+ /* error response from UNI */
+ u_int reason = (iarg >> 16) & 0xffff;
+ u_int state = iarg & 0xffff;
+ struct ccuser *user = conn->user;
+
+ switch (conn->state) {
+
+ case CONN_OUT_WAIT_CREATE: /* C2 */
+ cc_conn_rem_port(conn);
+ cc_conn_set_state(conn, CONN_OUT_PREPARING);
+ if (conn->user != NULL)
+ cc_user_sig(conn->user,
+ USER_SIG_CONNECT_OUTGOING_ERR,
+ NULL, ATM_MKUNIERR(reason));
+ break;
+
+ case CONN_OUT_WAIT_OK: /* C3 */
+ cc_conn_set_state(conn, CONN_OUT_WAIT_DESTROY);
+ conn->reason = reason;
+ break;
+
+ case CONN_AB_WAIT_REQ_OK: /* C33 */
+ if (state == UNI_CALLSTATE_U12) {
+ do_release_response(conn, 0, conn->cause);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ break;
+ }
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ break;
+
+ case CONN_AB_WAIT_RESP_OK: /* C34 */
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ break;
+
+ case CONN_REL_WAIT_OK: /* C20 */
+ if (user == NULL) {
+ /* connection has been aborted. */
+ if (state == UNI_CALLSTATE_U10) {
+ /* do what we can */
+ do_release_request(conn, conn->cause);
+ cc_conn_set_state(conn,
+ CONN_AB_WAIT_REQ_OK);
+ } else if (state == UNI_CALLSTATE_U12) {
+ do_release_response(conn, 0, NULL);
+ cc_conn_set_state(conn,
+ CONN_AB_WAIT_RESP_OK);
+ } else {
+ cc_conn_set_state(conn,
+ CONN_AB_FLUSH_IND);
+ }
+ break;
+ }
+ if (state == UNI_CALLSTATE_U10) {
+ cc_conn_set_state(conn, CONN_ACTIVE);
+ cc_user_sig(conn->user, USER_SIG_RELEASE_ERR,
+ NULL, reason);
+ } else if (state == UNI_CALLSTATE_U12) {
+ do_release_response(conn, 0, NULL);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ memset(&conn->user->cause, 0,
+ sizeof(conn->user->cause));
+ cc_user_sig(conn->user,
+ USER_SIG_RELEASE_CONFIRM, NULL, 0);
+ cc_disconnect_from_user(conn);
+ } else {
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ memset(&conn->user->cause, 0,
+ sizeof(conn->user->cause));
+ cc_user_sig(conn->user,
+ USER_SIG_RELEASE_CONFIRM, NULL, 0);
+ cc_disconnect_from_user(conn);
+ }
+ break;
+
+ case CONN_IN_WAIT_ACCEPT_OK: /* C12 */
+ if (user == NULL) {
+ /* connection was aborted */
+ if (state == UNI_CALLSTATE_U6 ||
+ state == UNI_CALLSTATE_U7 ||
+ state == UNI_CALLSTATE_U9 ||
+ state == UNI_CALLSTATE_U12) {
+ do_release_response(conn, 0, NULL);
+ cc_conn_set_state(conn,
+ CONN_AB_WAIT_RESP_OK);
+ } else {
+ cc_conn_set_state(conn,
+ CONN_AB_FLUSH_IND);
+ }
+ break;
+ }
+ cc_conn_reset_acceptor(conn);
+ if (state == UNI_CALLSTATE_U6 ||
+ state == UNI_CALLSTATE_U9 ||
+ state == UNI_CALLSTATE_U7) {
+ cc_user_sig(user, USER_SIG_ACCEPT_ERR,
+ NULL, ATM_MKUNIERR(reason));
+ cc_conn_set_state(conn, CONN_IN_ARRIVED);
+ } else if (state == UNI_CALLSTATE_U12) {
+ do_release_response(conn, 0, NULL);
+ cc_disconnect_from_user(conn);
+ cc_user_sig(user, USER_SIG_ACCEPT_ERR,
+ user, ATMERR_PREVIOUSLY_ABORTED);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ } else {
+ cc_disconnect_from_user(conn);
+ cc_user_sig(user, USER_SIG_ACCEPT_ERR,
+ user, ATMERR_PREVIOUSLY_ABORTED);
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ }
+ break;
+
+ case CONN_REJ_WAIT_OK: /* C14 */
+ if (user == NULL) {
+ /* connection has been aborted. */
+ if (state == UNI_CALLSTATE_U6 ||
+ state == UNI_CALLSTATE_U7 ||
+ state == UNI_CALLSTATE_U9 ||
+ state == UNI_CALLSTATE_U12) {
+ /* do what we can */
+ do_release_response(conn, 0, NULL);
+ cc_conn_set_state(conn,
+ CONN_AB_WAIT_RESP_OK);
+ } else {
+ cc_conn_set_state(conn,
+ CONN_AB_FLUSH_IND);
+ }
+ break;
+ }
+ if (state == UNI_CALLSTATE_U6 ||
+ state == UNI_CALLSTATE_U9 ||
+ state == UNI_CALLSTATE_U7) {
+ cc_user_sig(user, USER_SIG_REJECT_ERR,
+ NULL, ATM_MKUNIERR(reason));
+ cc_conn_set_state(conn, CONN_IN_ARRIVED);
+ } else {
+ cc_disconnect_from_user(conn);
+ cc_user_sig(user, USER_SIG_REJECT_OK, NULL, 0);
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ }
+ break;
+
+ case CONN_REL_IN_WAIT_OK: /* C15 */
+ if (user == NULL) {
+ /* connection has been aborted. */
+ if (state == UNI_CALLSTATE_U8) {
+ /* do what we can */
+ do_release_request(conn, conn->cause);
+ cc_conn_set_state(conn,
+ CONN_AB_WAIT_REQ_OK);
+ } else if (state == UNI_CALLSTATE_U12) {
+ do_release_response(conn, 0, NULL);
+ cc_conn_set_state(conn,
+ CONN_AB_WAIT_RESP_OK);
+ } else {
+ cc_conn_set_state(conn,
+ CONN_AB_FLUSH_IND);
+ }
+ break;
+ }
+ if (state == UNI_CALLSTATE_U8) {
+ cc_conn_set_state(conn, CONN_IN_WAIT_COMPL);
+ cc_user_sig(conn->user, USER_SIG_RELEASE_ERR,
+ NULL, reason);
+ } else if (state == UNI_CALLSTATE_U12) {
+ do_release_response(conn, 0, NULL);
+ cc_conn_set_state(conn, CONN_AB_WAIT_RESP_OK);
+ memset(&conn->user->cause, 0,
+ sizeof(conn->user->cause));
+ cc_user_sig(conn->user,
+ USER_SIG_RELEASE_CONFIRM, NULL, 0);
+ cc_disconnect_from_user(conn);
+ } else {
+ cc_conn_set_state(conn, CONN_AB_FLUSH_IND);
+ memset(&conn->user->cause, 0,
+ sizeof(conn->user->cause));
+ cc_user_sig(conn->user,
+ USER_SIG_RELEASE_CONFIRM, NULL, 0);
+ cc_disconnect_from_user(conn);
+ }
+ break;
+
+ default:
+ /* maybe it's for a party */
+ LIST_FOREACH(party, &conn->parties, link) {
+ switch (party->state) {
+
+ case PARTY_ADD_WAIT_CREATE: /* P2 */
+ cc_party_destroy(party);
+ if (user != NULL)
+ cc_user_sig(user,
+ USER_SIG_ADD_PARTY_ERR,
+ NULL, ATM_MKUNIERR(reason));
+ goto ex_party_err;
+
+ case PARTY_ADD_WAIT_OK: /* P3 */
+ cc_party_set_state(party,
+ PARTY_WAIT_DESTROY);
+ if (user != NULL)
+ cc_user_sig(user,
+ USER_SIG_ADD_PARTY_ERR,
+ NULL, ATM_MKUNIERR(reason));
+ goto ex_party_err;
+
+ case PARTY_DROP_WAIT_OK: /* P5 */
+ cc_party_set_state(party,
+ PARTY_ACTIVE);
+ if (user != NULL)
+ cc_user_sig(user,
+ USER_SIG_DROP_PARTY_ERR,
+ NULL, ATM_MKUNIERR(reason));
+ goto ex_party_err;
+
+ case PARTY_WAIT_DROP_ACK_OK: /* P9 */
+ cc_party_set_state(party,
+ PARTY_ACTIVE);
+ goto ex_party_err;
+
+ case PARTY_ADD_DROP_WAIT_OK: /* P11 */
+ cc_party_set_state(party,
+ PARTY_ADD_WAIT_ACK);
+ if (user != NULL)
+ cc_user_sig(user,
+ USER_SIG_DROP_PARTY_ERR,
+ NULL, ATM_MKUNIERR(reason));
+ goto ex_party_err;
+
+ case PARTY_ADD_DROPACK_WAIT_OK:/* P12 */
+ cc_party_set_state(party,
+ PARTY_ADD_WAIT_ACK);
+ goto ex_party_err;
+
+ default:
+ break;
+ }
+ }
+ cc_conn_log(conn, "unexpected reason=%u ustate=%u "
+ "state=%s\n", reason, state, stab[conn->state]);
+ ex_party_err:
+ break;
+ }
+ break;
+ }
+
+ case CONN_SIG_PARTY_CREATED:
+ {
+ struct uni_msg *msg = arg;
+ struct uniapi_party_created *pcr = uni_msg_rptr(msg,
+ struct uniapi_party_created *);
+
+ party = cc_party_find(conn, pcr->epref.epref);
+ if (party == NULL) {
+ /* for incoming connections we see the party-created
+ * immediately after the call-create so that we
+ * must be in C10 */
+ switch (conn->state) {
+
+ case CONN_IN_PREPARING:
+ party = cc_party_create(conn,
+ pcr->epref.epref, 1);
+ if (party == NULL)
+ break;
+ cc_party_set_state(party,
+ PARTY_WAIT_SETUP_COMPL);
+ break;
+
+ case CONN_OUT_WAIT_OK:
+ party = cc_party_create(conn,
+ pcr->epref.epref, 0);
+ if (party == NULL)
+ break;
+ cc_party_set_state(party,
+ PARTY_WAIT_SETUP_CONF);
+ break;
+
+ default:
+ goto bad_state;
+ }
+ break;
+ }
+ /* this is for an ADD-PARTY */
+ if (conn->state != CONN_ACTIVE)
+ goto bad_state;
+ if (party->state != PARTY_ADD_WAIT_CREATE)
+ goto bad_party_state;
+ cc_party_set_state(party, PARTY_ADD_WAIT_OK);
+ break;
+ }
+
+ case CONN_SIG_PARTY_DESTROYED:
+ {
+ struct uni_msg *msg = arg;
+ struct uniapi_party_destroyed *pcr = uni_msg_rptr(msg,
+ struct uniapi_party_destroyed *);
+
+ party = cc_party_find(conn, pcr->epref.epref);
+ if (party == NULL) {
+ cc_conn_log(conn, "no party to destroy %u/%u",
+ pcr->epref.flag, pcr->epref.epref);
+ break;
+ }
+ cc_party_destroy(party);
+ break;
+ }
+
+ }
+
+ return;
+
+ bad_state:
+ cc_conn_log(conn, "bad state=%s for signal=%s",
+ stab[conn->state], cc_conn_sigtab[sig]);
+ return;
+
+ bad_party_state:
+ cc_conn_log(conn, "bad party state=%s for signal=%s",
+ ptab[party->state], cc_conn_sigtab[sig]);
+ return;
+}
diff --git a/sys/contrib/ngatm/netnatm/api/cc_data.c b/sys/contrib/ngatm/netnatm/api/cc_data.c
new file mode 100644
index 0000000..bf607de
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/cc_data.c
@@ -0,0 +1,226 @@
+/*
+* Copyright (c) 2004
+* Hartmut Brandt
+* All rights reserved.
+*
+* Author: Harti Brandt <harti@freebsd.org>
+*
+* Redistribution of this software and documentation and use in source and
+* binary forms, with or without modification, are permitted provided that
+* the following conditions are met:
+*
+* 1. Redistributions of source code or documentation must retain the above
+* copyright notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+*
+* THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHOR
+* AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+* THE AUTHOR OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* $Begemot: libunimsg/netnatm/api/cc_data.c,v 1.1 2004/07/08 08:21:50 brandt Exp $
+*
+* ATM API as defined per af-saa-0108
+*/
+#include <netnatm/unimsg.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/api/unisap.h>
+#include <netnatm/sig/unidef.h>
+#include <netnatm/api/atmapi.h>
+#include <netnatm/api/ccatm.h>
+#include <netnatm/api/ccpriv.h>
+
+/*
+ * Create a new call control instance
+ */
+struct ccdata *
+cc_create(const struct cc_funcs *vtab)
+{
+ struct ccdata *cc;
+
+ cc = CCMALLOC(sizeof(*cc));
+ if (cc == NULL)
+ return (NULL);
+
+ LIST_INIT(&cc->user_list);
+ TAILQ_INIT(&cc->port_list);
+ LIST_INIT(&cc->orphaned_conns);
+ TAILQ_INIT(&cc->sigs);
+ TAILQ_INIT(&cc->def_sigs);
+ TAILQ_INIT(&cc->free_sigs);
+ cc->funcs = vtab;
+ cc->cookie = 0;
+
+ return (cc);
+}
+
+/*
+ * Reset everything the hard way by just freeing the data
+ */
+void
+cc_reset(struct ccdata *cc)
+{
+
+ while (!LIST_EMPTY(&cc->user_list))
+ cc_user_destroy(LIST_FIRST(&cc->user_list));
+
+ while (!TAILQ_EMPTY(&cc->port_list))
+ cc_port_destroy(TAILQ_FIRST(&cc->port_list), 1);
+
+ while (!LIST_EMPTY(&cc->orphaned_conns))
+ cc_conn_destroy(LIST_FIRST(&cc->orphaned_conns));
+
+ CCASSERT(LIST_EMPTY(&cc->user_list),
+ ("user list not empty"));
+ CCASSERT(LIST_EMPTY(&cc->orphaned_conns),
+ ("still orphaned conns"));
+
+ cc_sig_flush_all(cc);
+
+ cc->cookie = 0;
+}
+
+/*
+ * Destroy a call control instance and free all data
+ */
+void
+cc_destroy(struct ccdata *cc)
+{
+
+ cc_reset(cc);
+ CCFREE(cc);
+}
+
+/*
+ * set/get logging flags
+ */
+void
+cc_set_log(struct ccdata *cc, u_int flags)
+{
+ cc->log = flags;
+}
+u_int
+cc_get_log(const struct ccdata *cc)
+{
+ return (cc->log);
+}
+
+/* get extended status */
+int
+cc_get_extended_status(const struct ccdata *cc, struct atm_exstatus *status,
+ struct atm_exstatus_ep **pep, struct atm_exstatus_port **pport,
+ struct atm_exstatus_conn **pconn, struct atm_exstatus_party **pparty)
+{
+ const struct ccuser *user;
+ const struct ccport *port;
+ const struct ccconn *conn;
+ const struct ccparty *party;
+ struct atm_exstatus_ep *eep;
+ struct atm_exstatus_port *eport;
+ struct atm_exstatus_conn *econn;
+ struct atm_exstatus_party *eparty;
+
+ /* count and allocate */
+ status->neps = 0;
+ LIST_FOREACH(user, &cc->user_list, node_link)
+ status->neps++;
+
+ status->nports = 0;
+ status->nconns = 0;
+ status->nparties = 0;
+ LIST_FOREACH(conn, &cc->orphaned_conns, port_link) {
+ status->nconns++;
+ LIST_FOREACH(party, &conn->parties, link)
+ status->nparties++;
+ }
+ TAILQ_FOREACH(port, &cc->port_list, node_link) {
+ status->nports++;
+ LIST_FOREACH(conn, &port->conn_list, port_link) {
+ status->nconns++;
+ LIST_FOREACH(party, &conn->parties, link)
+ status->nparties++;
+ }
+ }
+
+ *pep = CCMALLOC(sizeof(**pep) * status->neps);
+ *pport = CCMALLOC(sizeof(**pport) * status->nports);
+ *pconn = CCMALLOC(sizeof(**pconn) * status->nconns);
+ *pparty = CCMALLOC(sizeof(**pparty) * status->nparties);
+
+ if (*pep == NULL || *pport == NULL ||
+ *pconn == NULL || *pparty == NULL) {
+ CCFREE(*pep);
+ CCFREE(*pport);
+ CCFREE(*pconn);
+ CCFREE(*pparty);
+ return (ENOMEM);
+ }
+
+ eep = *pep;
+ eport = *pport;
+ econn = *pconn;
+ eparty = *pparty;
+
+ /* collect information */
+ LIST_FOREACH(user, &cc->user_list, node_link) {
+ strcpy(eep->name, user->name);
+ eep->state = user->state;
+ eep++;
+ }
+
+ LIST_FOREACH(conn, &cc->orphaned_conns, port_link) {
+ econn->id = econn - *pconn;
+ econn->port = 0;
+ if (conn->user != NULL)
+ strcpy(econn->ep, conn->user->name);
+ else
+ econn->ep[0] = '\0';
+ econn->state = conn->state;
+ econn->cref = conn->cref.cref;
+ if (conn->cref.flag)
+ econn->cref |= (1 << 23);
+ LIST_FOREACH(party, &conn->parties, link) {
+ eparty->connid = econn - *pconn;
+ eparty->epref = party->epref.epref;
+ eparty->state = party->state;
+ eparty++;
+ }
+ econn++;
+ }
+
+ TAILQ_FOREACH(port, &cc->port_list, node_link) {
+ eport->portno = port->param.port;
+ eport->state = port->admin;
+ LIST_FOREACH(conn, &port->conn_list, port_link) {
+ econn->id = econn - *pconn;
+ econn->port = port->param.port;
+ if (conn->user != NULL)
+ strcpy(econn->ep, conn->user->name);
+ else
+ econn->ep[0] = '\0';
+ econn->state = conn->state;
+ econn->cref = conn->cref.cref;
+ if (conn->cref.flag)
+ econn->cref |= (1 << 23);
+ LIST_FOREACH(party, &conn->parties, link) {
+ eparty->connid = econn - *pconn;
+ eparty->epref = party->epref.epref;
+ eparty->state = party->state;
+ eparty++;
+ }
+ econn++;
+ }
+ eport++;
+ }
+ return (0);
+}
diff --git a/sys/contrib/ngatm/netnatm/api/cc_dump.c b/sys/contrib/ngatm/netnatm/api/cc_dump.c
new file mode 100644
index 0000000..245f8b7
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/cc_dump.c
@@ -0,0 +1,334 @@
+/*
+ * Copyright (c) 2003-2004
+ * Hartmut Brandt
+ * All rights reserved.
+ *
+ * Author: Harti Brandt <harti@freebsd.org>
+ *
+ * Redistribution of this software and documentation and use in source and
+ * binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ *
+ * 1. Redistributions of source code or documentation must retain the above
+ * copyright notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHOR
+ * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHOR OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/api/cc_dump.c,v 1.3 2004/08/05 07:10:56 brandt Exp $
+ *
+ * ATM API as defined per af-saa-0108
+ */
+
+#include <netnatm/unimsg.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/api/unisap.h>
+#include <netnatm/sig/unidef.h>
+#include <netnatm/api/atmapi.h>
+#include <netnatm/api/ccatm.h>
+#include <netnatm/api/ccpriv.h>
+
+#ifdef _KERNEL
+#ifdef __FreeBSD__
+#include <machine/stdarg.h>
+#endif
+#else /* !_KERNEL */
+#include <stdarg.h>
+#endif
+
+/*
+ * local structure to reduce number of arguments to functions
+ */
+struct dump {
+ struct ccdata *cc; /* what to dump */
+ size_t maxsiz; /* size of user buffer */
+ cc_dump_f func; /* user function */
+ void *uarg; /* user supplied argument */
+ char *buf; /* user buffer */
+ size_t len; /* current string length */
+ int ret; /* return code */
+};
+
+static void cc_dumpf(struct dump *, const char *, ...) __printflike(2, 3);
+
+static void
+cc_dumpf(struct dump *d, const char *fmt, ...)
+{
+ va_list ap;
+ int n;
+
+ if (d->ret != 0)
+ return;
+ if (d->len >= d->maxsiz - 1) {
+ d->ret = d->func(d->cc, d->uarg, d->buf);
+ if (d->ret != 0)
+ return;
+ d->buf[0] = '\0';
+ d->len = 0;
+ }
+ va_start(ap, fmt);
+ n = vsnprintf(d->buf + d->len, d->maxsiz - d->len, fmt, ap);
+ va_end(ap);
+
+ if (n < 0) {
+ d->ret = CCGETERRNO();
+ return;
+ }
+ if ((size_t)n < d->maxsiz - d->len) {
+ d->len += n;
+ return;
+ }
+
+ /* undo the vsnprintf() and flush */
+ d->buf[d->len] = '\0';
+ d->ret = d->func(d->cc, d->uarg, d->buf);
+ if (d->ret != 0)
+ return;
+ d->buf[0] = '\0';
+ d->len = 0;
+
+ va_start(ap, fmt);
+ n = vsnprintf(d->buf, d->maxsiz, fmt, ap);
+ va_end(ap);
+
+ if (n < 0) {
+ d->ret = CCGETERRNO();
+ return;
+ }
+ if ((size_t)n >= d->maxsiz) {
+ /* ok, truncate */
+ d->len = d->maxsiz - 1;
+ return;
+ }
+ d->len = n;
+}
+
+/*
+ * Dump a SAP
+ */
+static void
+cc_dump_sap(struct dump *d, const struct uni_sap *sap)
+{
+ static const char *const tagtab[] = {
+ [UNISVE_ABSENT] = "absent",
+ [UNISVE_ANY] = "any",
+ [UNISVE_PRESENT] = "present"
+ };
+ static const char *const plantab[] = {
+ [UNI_ADDR_E164] = "E164",
+ [UNI_ADDR_ATME] = "ATME",
+ };
+ static const char *const hlitab[] = {
+ [UNI_BHLI_ISO] = "ISO",
+ [UNI_BHLI_VENDOR] = "VENDOR",
+ [UNI_BHLI_USER] = "USER"
+ };
+ u_int i;
+
+ cc_dumpf(d, " sap(%p):\n", sap);
+ cc_dumpf(d, " addr=%s", tagtab[sap->addr.tag]);
+ if (sap->addr.tag == UNISVE_PRESENT) {
+ cc_dumpf(d, " %s %u ", plantab[sap->addr.plan], sap->addr.len);
+ if (sap->addr.plan == UNI_ADDR_E164)
+ for (i = 0; i < sap->addr.len; i++)
+ cc_dumpf(d, "%c", sap->addr.addr[i]);
+ else
+ for (i = 0; i < sap->addr.len; i++)
+ cc_dumpf(d, "%02x", sap->addr.addr[i]);
+ }
+ cc_dumpf(d, "\n");
+
+ cc_dumpf(d, " selector=%s", tagtab[sap->selector.tag]);
+ if (sap->selector.tag == UNISVE_PRESENT)
+ cc_dumpf(d, " %02x", sap->selector.selector);
+ cc_dumpf(d, "\n");
+
+ cc_dumpf(d, " blli_id2=%s", tagtab[sap->blli_id2.tag]);
+ if (sap->blli_id2.tag == UNISVE_PRESENT)
+ cc_dumpf(d, " %02x %02x", sap->blli_id2.proto,
+ sap->blli_id2.user);
+ cc_dumpf(d, "\n");
+
+ cc_dumpf(d, " blli_id3=%s", tagtab[sap->blli_id3.tag]);
+ if (sap->blli_id3.tag == UNISVE_PRESENT)
+ cc_dumpf(d, " %02x,%02x, %02x(%d),%03x,%02x",
+ sap->blli_id3.proto, sap->blli_id3.user,
+ sap->blli_id3.ipi, sap->blli_id3.noipi,
+ sap->blli_id3.oui, sap->blli_id3.pid);
+ cc_dumpf(d, "\n");
+
+ cc_dumpf(d, " bhli=%s", tagtab[sap->bhli.tag]);
+ if (sap->bhli.tag == UNISVE_PRESENT) {
+ cc_dumpf(d, " %s ", hlitab[sap->bhli.type]);
+ for (i = 0; i < sap->bhli.len; i++)
+ cc_dumpf(d, "%02x", sap->bhli.info[i]);
+ }
+ cc_dumpf(d, "\n");
+}
+
+/*
+ * Dump a user.
+ */
+static void
+cc_dump_user(struct dump *d, const struct ccuser *user)
+{
+ struct ccconn *conn;
+
+ cc_dumpf(d, "user(%p): %s '%s' %s\n", user,
+ cc_user_state2str(user->state), user->name,
+ (user->config == USER_P2P) ? "p2p" :
+ (user->config == USER_ROOT) ? "root" :
+ (user->config == USER_LEAF) ? "leaf" : "?");
+ if (user->sap)
+ cc_dump_sap(d, user->sap);
+
+ cc_dumpf(d, " queue=%u/%u accepted=%p aborted=%u\n", user->queue_max,
+ user->queue_act, user->accepted, user->aborted);
+
+ cc_dumpf(d, " connq:");
+ TAILQ_FOREACH(conn, &user->connq, connq_link)
+ cc_dumpf(d, "%p", conn);
+ cc_dumpf(d, "\n");
+}
+
+/*
+ * Dump a party
+ */
+static void
+cc_dump_party(struct dump *d, const struct ccparty *party, const char *pfx)
+{
+
+ cc_dumpf(d, "%s party(%p): %u.%u %s\n", pfx, party,
+ party->epref.flag, party->epref.epref,
+ cc_party_state2str(party->state));
+}
+
+/*
+ * Dump a connection
+ */
+static void
+cc_dump_conn(struct dump *d, const struct ccconn *conn, const char *pfx)
+{
+ const struct ccparty *party;
+
+ cc_dumpf(d, "%sconn(%p): %s\n", pfx, conn,
+ cc_conn_state2str(conn->state));
+ cc_dumpf(d, "%s user=%p cref=%u.%u acceptor=%p\n", pfx,
+ conn->user, conn->cref.cref, conn->cref.flag,
+ conn->acceptor);
+
+ cc_dumpf(d, "%s blli_sel=%u\n", pfx, conn->blli_selector);
+
+ LIST_FOREACH(party, &conn->parties, link)
+ cc_dump_party(d, party, pfx);
+}
+
+/*
+ * Dump a port
+ */
+static void
+cc_dump_port(struct dump *d, const struct ccport *p)
+{
+ u_int i;
+ const struct ccaddr *a;
+ const struct ccconn *c;
+ const struct ccreq *r;
+
+ static const char *const ttab[] = {
+ [UNI_ADDR_UNKNOWN] = "unknown",
+ [UNI_ADDR_INTERNATIONAL] = "international",
+ [UNI_ADDR_NATIONAL] = "national",
+ [UNI_ADDR_NETWORK] = "network",
+ [UNI_ADDR_SUBSCR] = "subscr",
+ [UNI_ADDR_ABBR] = "abbr",
+ };
+ static const char *const ptab[] = {
+ [UNI_ADDR_UNKNOWN] = "unknown",
+ [UNI_ADDR_E164] = "e164",
+ [UNI_ADDR_ATME] = "atme",
+ [UNI_ADDR_DATA] = "data",
+ [UNI_ADDR_PRIVATE] = "private",
+ };
+
+ cc_dumpf(d, "port(%p) %u: %s\n", p, p->param.port,
+ (p->admin == CCPORT_STOPPED) ? "STOPPED" :
+ (p->admin == CCPORT_RUNNING) ? "RUNNING" : "????");
+ cc_dumpf(d, " pcr=%u bits=%u.%u ids=%u/%u/%u esi=%02x:%02x:"
+ "%02x:%02x:%02x:%02x naddrs=%u\n", p->param.pcr,
+ p->param.max_vpi_bits, p->param.max_vci_bits, p->param.max_svpc_vpi,
+ p->param.max_svcc_vpi, p->param.min_svcc_vci, p->param.esi[0],
+ p->param.esi[1], p->param.esi[2], p->param.esi[3], p->param.esi[4],
+ p->param.esi[5], p->param.num_addrs);
+
+ cc_dumpf(d, " cookies:");
+ TAILQ_FOREACH(r, &p->cookies, link)
+ cc_dumpf(d, " %u(%p,%u)", r->cookie, r->conn, r->req);
+ cc_dumpf(d, "\n");
+
+ TAILQ_FOREACH(a, &p->addr_list, port_link) {
+ cc_dumpf(d, " addr(%p): %s %s %u ", a,
+ (a->addr.type < sizeof(ttab) / sizeof(ttab[0]) &&
+ ttab[a->addr.type] != NULL) ? ttab[a->addr.type] : "?",
+ (a->addr.plan < sizeof(ptab) / sizeof(ptab[0]) &&
+ ptab[a->addr.plan] != NULL) ? ptab[a->addr.plan] : "?",
+ a->addr.len);
+ for (i = 0; i < a->addr.len; i++)
+ cc_dumpf(d, "%02x", a->addr.addr[i]);
+ cc_dumpf(d, "\n");
+ }
+ LIST_FOREACH(c, &p->conn_list, port_link)
+ cc_dump_conn(d, c, " ");
+}
+
+/*
+ * Produce a textual dump of the state
+ */
+int
+cc_dump(struct ccdata *cc, size_t maxsiz, cc_dump_f func, void *uarg)
+{
+ struct dump d;
+ struct ccuser *user;
+ struct ccconn *conn;
+ struct ccport *port;
+
+ d.ret = 0;
+ d.uarg = uarg;
+ d.maxsiz = maxsiz;
+ d.cc = cc;
+ d.func = func;
+ d.buf = CCMALLOC(maxsiz);
+ if (d.buf == NULL)
+ return (ENOMEM);
+ d.len = 0;
+
+ cc_dumpf(&d, "dump of node %p\n", cc);
+
+ TAILQ_FOREACH(port, &cc->port_list, node_link)
+ cc_dump_port(&d, port);
+
+ LIST_FOREACH(user, &cc->user_list, node_link)
+ cc_dump_user(&d, user);
+
+ cc_dumpf(&d, "orphaned conns:\n");
+ LIST_FOREACH(conn, &cc->orphaned_conns, port_link)
+ cc_dump_conn(&d, conn, "");
+
+ if (d.len > 0 && d.ret == 0)
+ d.ret = d.func(d.cc, d.uarg, d.buf);
+
+ CCFREE(d.buf);
+ return (d.ret);
+}
diff --git a/sys/contrib/ngatm/netnatm/api/cc_port.c b/sys/contrib/ngatm/netnatm/api/cc_port.c
new file mode 100644
index 0000000..f01a723
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/cc_port.c
@@ -0,0 +1,923 @@
+/*
+ * Copyright (c) 2003-2004
+ * Hartmut Brandt
+ * All rights reserved.
+ *
+ * Copyright (c) 2001-2002
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Author: Harti Brandt <harti@freebsd.org>
+ *
+ * Redistribution of this software and documentation and use in source and
+ * binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ *
+ * 1. Redistributions of source code or documentation must retain the above
+ * copyright notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHOR
+ * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHOR OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/api/cc_port.c,v 1.1 2004/07/08 08:21:53 brandt Exp $
+ *
+ * ATM API as defined per af-saa-0108
+ *
+ * Port-global stuff (ILMI and Co.)
+ */
+#include <netnatm/unimsg.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/api/unisap.h>
+#include <netnatm/sig/unidef.h>
+#include <netnatm/api/atmapi.h>
+#include <netnatm/api/ccatm.h>
+#include <netnatm/api/ccpriv.h>
+
+/*
+ * Find a port with a given number
+ */
+static struct ccport *
+find_port(struct ccdata *cc, u_int portno)
+{
+ struct ccport *port;
+
+ TAILQ_FOREACH(port, &cc->port_list, node_link)
+ if (port->param.port == portno)
+ return (port);
+ return (NULL);
+}
+
+/*
+ * Create a new port structure, initialize it and link it to the node.
+ * Returns 0 on success, an errno otherwise.
+ */
+struct ccport *
+cc_port_create(struct ccdata *cc, void *uarg, u_int portno)
+{
+ struct ccport *port, *p1;
+
+ if (portno == 0 || portno > 0xffffffff)
+ return (NULL);
+
+ TAILQ_FOREACH(port, &cc->port_list, node_link)
+ if (port->param.port == portno)
+ return (NULL);
+
+ port = CCZALLOC(sizeof(*port));
+ if (port == NULL)
+ return (NULL);
+
+ port->uarg = uarg;
+ port->cc = cc;
+ port->admin = CCPORT_STOPPED;
+ LIST_INIT(&port->conn_list);
+ TAILQ_INIT(&port->addr_list);
+ port->param.port = portno;
+ port->param.pcr = 350053;
+ port->param.max_vpi_bits = 0;
+ port->param.max_vci_bits = 8;
+ port->param.max_svpc_vpi = 0;
+ port->param.max_svcc_vpi = 0;
+ port->param.min_svcc_vci = 32;
+ port->param.num_addrs = 0;
+ TAILQ_INIT(&port->cookies);
+
+ TAILQ_FOREACH(p1, &cc->port_list, node_link)
+ if (p1->param.port > portno) {
+ TAILQ_INSERT_BEFORE(p1, port, node_link);
+ break;
+ }
+ if (p1 == NULL)
+ TAILQ_INSERT_TAIL(&cc->port_list, port, node_link);
+
+ return (port);
+}
+
+/*
+ * Destroy a port. This closes all connections and aborts all the users of
+ * these connections.
+ * This should be called only after work has returned so that no signals
+ * are pending.
+ */
+void
+cc_port_destroy(struct ccport *port, int shutdown)
+{
+ struct ccaddr *addr;
+ struct ccreq *r;
+
+ TAILQ_REMOVE(&port->cc->port_list, port, node_link);
+
+ while ((r = TAILQ_FIRST(&port->cookies)) != NULL) {
+ TAILQ_REMOVE(&port->cookies, r, link);
+ CCFREE(r);
+ }
+
+ /*
+ * Abort all connections.
+ */
+ while (!LIST_EMPTY(&port->conn_list))
+ cc_conn_abort(LIST_FIRST(&port->conn_list), shutdown);
+
+ /*
+ * Free addresses.
+ */
+ while ((addr = TAILQ_FIRST(&port->addr_list)) != NULL) {
+ TAILQ_REMOVE(&port->addr_list, addr, port_link);
+ CCFREE(addr);
+ }
+
+ CCFREE(port);
+}
+
+/*
+ * Management is given up on this node. Remove all addresses from the port.
+ */
+void
+cc_unmanage(struct ccdata *cc)
+{
+ struct ccport *port;
+ struct ccaddr *addr;
+
+ TAILQ_FOREACH(port, &cc->port_list, node_link) {
+ while ((addr = TAILQ_FIRST(&port->addr_list)) != NULL) {
+ TAILQ_REMOVE(&port->addr_list, addr, port_link);
+ CCFREE(addr);
+ }
+ }
+}
+
+/*
+ * Compare two addresses
+ */
+static __inline int
+addr_eq(const struct uni_addr *a1, const struct uni_addr *a2)
+{
+ return (a1->type == a2->type && a1->plan == a2->plan &&
+ a1->len == a2->len && memcmp(a1->addr, a2->addr, a1->len) == 0);
+}
+
+
+/*
+ * retrieve addresses
+ */
+int
+cc_get_addrs(struct ccdata *cc, u_int portno,
+ struct uni_addr **pa, u_int **ports, u_int *count)
+{
+ struct ccport *port = NULL;
+ struct ccaddr *addr;
+ struct uni_addr *buf, *ptr;
+ u_int *pports;
+
+ /*
+ * If a port number is specified and the port does not exist,
+ * return an error.
+ */
+ if (portno != 0)
+ if ((port = find_port(cc, portno)) == NULL)
+ return (ENOENT);
+
+ /*
+ * Count the addresses
+ */
+ *count = 0;
+ if (portno != 0) {
+ TAILQ_FOREACH(addr, &port->addr_list, port_link)
+ (*count)++;
+ } else {
+ TAILQ_FOREACH(port, &cc->port_list, node_link)
+ TAILQ_FOREACH(addr, &port->addr_list, port_link)
+ (*count)++;
+ }
+
+ buf = CCMALLOC(*count * sizeof(struct uni_addr));
+ if (buf == NULL)
+ return (ENOMEM);
+ ptr = buf;
+
+ *ports = CCMALLOC(*count * sizeof(u_int));
+ if (*ports == NULL) {
+ CCFREE(buf);
+ return (ENOMEM);
+ }
+ pports = *ports;
+
+ if (portno != 0) {
+ TAILQ_FOREACH(addr, &port->addr_list, port_link) {
+ *ptr++ = addr->addr;
+ *pports++ = portno;
+ }
+ } else {
+ TAILQ_FOREACH(port, &cc->port_list, node_link)
+ TAILQ_FOREACH(addr, &port->addr_list, port_link) {
+ *ptr++ = addr->addr;
+ *pports++ = port->param.port;
+ }
+ }
+
+ *pa = buf;
+ return (0);
+}
+
+/*
+ * return port number
+ */
+u_int
+cc_port_no(struct ccport *port)
+{
+ return (port->param.port);
+}
+
+/*
+ * Address unregisterd.
+ */
+int
+cc_addr_unregister(struct ccdata *cc, u_int portno, const struct uni_addr *arg)
+{
+ struct ccport *port;
+ struct ccaddr *a;
+
+ if ((port = find_port(cc, portno)) == NULL)
+ return (ENOENT);
+
+ /* Find the address */
+ TAILQ_FOREACH(a, &port->addr_list, port_link)
+ if (addr_eq(arg, &a->addr)) {
+ TAILQ_REMOVE(&port->addr_list, a, port_link);
+ CCFREE(a);
+ return (0);
+ }
+
+ return (ENOENT);
+}
+
+/*
+ * Address registerd.
+ */
+int
+cc_addr_register(struct ccdata *cc, u_int portno, const struct uni_addr *arg)
+{
+ struct ccport *port, *p1;
+ struct ccaddr *a;
+
+ if ((port = find_port(cc, portno)) == NULL)
+ return (ENOENT);
+
+ /* maybe we know it already? */
+ TAILQ_FOREACH(p1, &port->cc->port_list, node_link)
+ TAILQ_FOREACH(a, &p1->addr_list, port_link)
+ if (addr_eq(arg, &a->addr))
+ return (EISCONN);
+
+ a = CCZALLOC(sizeof(*a));
+ if (a == NULL)
+ return (ENOMEM);
+ a->addr = *arg;
+
+ TAILQ_INSERT_TAIL(&port->addr_list, a, port_link);
+
+ return (0);
+}
+
+/*
+ * Set/get port parameters.
+ */
+int
+cc_port_get_param(struct ccdata *cc, u_int portno,
+ struct atm_port_info *param)
+{
+ struct ccport *port;
+
+ if ((port = find_port(cc, portno)) == NULL)
+ return (ENOENT);
+
+ *param = port->param;
+ return (0);
+}
+
+/* XXX maybe allow only in stopped. */
+int
+cc_port_set_param(struct ccdata *cc, const struct atm_port_info *param)
+{
+ struct ccport *port;
+ struct ccaddr *addr;
+
+ if ((port = find_port(cc, param->port)) == NULL)
+ return (ENOENT);
+
+ port->param = *param;
+
+ port->param.num_addrs = 0;
+ TAILQ_FOREACH(addr, &port->addr_list, port_link)
+ port->param.num_addrs++;
+
+ return (0);
+}
+
+/*
+ * get port list
+ */
+int
+cc_port_getlist(struct ccdata *cc, u_int *cnt, u_int **ports)
+{
+ struct ccport *p;
+ u_int n;
+
+ n = 0;
+ TAILQ_FOREACH(p, &cc->port_list, node_link)
+ n++;
+
+ *ports = CCMALLOC(n * sizeof(u_int));
+ if (*ports == NULL)
+ return (ENOMEM);
+
+ n = 0;
+ TAILQ_FOREACH(p, &cc->port_list, node_link)
+ (*ports)[n++] = p->param.port;
+ *cnt = n;
+
+ return (0);
+}
+
+/*
+ * START and STOP signalling
+ */
+int
+cc_port_start(struct ccdata *cc, u_int portno)
+{
+ struct ccport *port;
+
+ if ((port = find_port(cc, portno)) == NULL)
+ return (ENOENT);
+ if (port->admin != CCPORT_STOPPED)
+ return (EISCONN);
+
+ cc->funcs->send_uni_glob(port, port->uarg,
+ UNIAPI_LINK_ESTABLISH_request, 0, NULL);
+ port->admin = CCPORT_RUNNING;
+
+ return (0);
+}
+
+int
+cc_port_stop(struct ccdata *cc, u_int portno)
+{
+ struct ccport *port;
+
+ if ((port = find_port(cc, portno)) == NULL)
+ return (ENOENT);
+ if (port->admin != CCPORT_RUNNING)
+ return (ENOTCONN);
+
+ port->admin = CCPORT_STOPPED;
+
+ /*
+ * Abort all connections.
+ */
+ while (!LIST_EMPTY(&port->conn_list))
+ cc_conn_destroy(LIST_FIRST(&port->conn_list));
+
+ return (0);
+}
+
+/*
+ * is port running?
+ */
+int
+cc_port_isrunning(struct ccdata *cc, u_int portno, int *state)
+{
+ struct ccport *port;
+
+ if ((port = find_port(cc, portno)) == NULL)
+ return (ENOENT);
+ if (port->admin == CCPORT_RUNNING)
+ *state = 1;
+ else
+ *state = 0;
+ return (0);
+}
+
+/*
+ * Clear address and prefix information from the named port.
+ */
+int
+cc_port_clear(struct ccdata *cc, u_int portno)
+{
+ struct ccaddr *addr;
+ struct ccport *port;
+
+ if ((port = find_port(cc, portno)) == NULL)
+ return (ENOENT);
+
+ while ((addr = TAILQ_FIRST(&port->addr_list)) != NULL) {
+ TAILQ_REMOVE(&port->addr_list, addr, port_link);
+ CCFREE(addr);
+ }
+ return (0);
+}
+
+/*
+ * retrieve info on local ports
+ */
+struct atm_port_list *
+cc_get_local_port_info(struct ccdata *cc, u_int portno, size_t *lenp)
+{
+ struct atm_port_list *list;
+ struct atm_port_info *pp;
+ struct uni_addr *aa;
+ struct ccaddr *addr;
+ struct ccport *port;
+ u_int nports, naddrs;
+
+ /*
+ * Count ports and addresses.
+ */
+ nports = 0;
+ naddrs = 0;
+ TAILQ_FOREACH(port, &cc->port_list, node_link) {
+ if (portno == 0 || port->param.port == portno) {
+ nports++;
+ TAILQ_FOREACH(addr, &port->addr_list, port_link)
+ naddrs++;
+ }
+ }
+
+ /*
+ * Size and allocate message
+ */
+ *lenp = sizeof(*list) + nports * sizeof(*pp) + naddrs * sizeof(*aa);
+
+ list = CCZALLOC(*lenp);
+ if (list == NULL)
+ return (NULL);
+
+ /*
+ * Fill the message.
+ */
+ list->num_ports = nports;
+ list->num_addrs = naddrs;
+
+ pp = (void *)((u_char *)list + sizeof(*list));
+ aa = (void *)((u_char *)list + sizeof(*list) + nports * sizeof(*pp));
+
+ TAILQ_FOREACH(port, &cc->port_list, node_link) {
+ if (portno == 0 || port->param.port == portno) {
+ *pp = port->param;
+ pp->num_addrs = 0;
+ TAILQ_FOREACH(addr, &port->addr_list, port_link) {
+ *aa++ = addr->addr;
+ pp->num_addrs++;
+ }
+ pp++;
+ }
+ }
+
+ return (list);
+}
+
+static struct ccreq *
+find_cookie(struct ccport *port, u_int cookie)
+{
+ struct ccreq *r;
+
+ TAILQ_FOREACH(r, &port->cookies, link)
+ if (r->cookie == cookie)
+ return (r);
+ return (NULL);
+}
+
+/*
+ * input a response from the UNI layer to CC
+ */
+int
+cc_uni_response(struct ccport *port, u_int cookie, u_int reason, u_int state)
+{
+ struct ccconn *conn;
+ struct ccreq *req;
+
+ if (cookie == 0)
+ return (EINVAL);
+
+ if (port->admin != CCPORT_RUNNING)
+ return (ENOTCONN);
+
+ if ((req = find_cookie(port, cookie)) == NULL) {
+ cc_port_log(port, "UNI response for unknown cookie %u", cookie);
+ return (EINVAL);
+ }
+ conn = req->conn;
+
+ TAILQ_REMOVE(&port->cookies, req, link);
+ CCFREE(req);
+
+ if (reason == UNIAPI_OK)
+ return (cc_conn_resp(conn, CONN_SIG_OK,
+ cookie, reason, state));
+ else
+ return (cc_conn_resp(conn, CONN_SIG_ERROR,
+ cookie, reason, state));
+}
+
+static struct ccconn *
+find_cref(const struct ccport *port, const struct uni_cref *cref)
+{
+ struct ccconn *conn;
+
+ LIST_FOREACH(conn, &port->conn_list, port_link)
+ if (conn->cref.cref == cref->cref &&
+ conn->cref.flag == cref->flag)
+ return (conn);
+ return (NULL);
+}
+
+/*
+ * Signal from UNI on this port
+ */
+int
+cc_uni_signal(struct ccport *port, u_int cookie, u_int sig, struct uni_msg *msg)
+{
+ int error = 0;
+ size_t len, ilen = 0;
+ struct uni_cref *cref;
+ struct ccconn *conn;
+
+ if (port->admin != CCPORT_RUNNING) {
+ error = ENOTCONN;
+ goto out;
+ }
+ len = (msg != NULL) ? uni_msg_len(msg) : 0;
+
+ switch ((enum uni_sig)sig) {
+
+ case UNIAPI_ERROR:
+ /* handled above */
+ cc_port_log(port, "bad UNIAPI_ERROR cookie=%u", cookie);
+ error = EINVAL;
+ break;
+
+ case UNIAPI_CALL_CREATED:
+ ilen = sizeof(struct uniapi_call_created);
+ if (len != ilen)
+ goto bad_len;
+
+ if (cookie != 0) {
+ /* outgoing call */
+ struct ccreq *req;
+
+ if ((req = find_cookie(port, cookie)) == NULL) {
+ cc_port_log(port, "bad cookie %u in CREATE",
+ cookie);
+ error = EINVAL;
+ goto out;
+ }
+ conn = req->conn;
+
+ } else {
+ if ((conn = cc_conn_create(port->cc)) == NULL) {
+ error = ENOMEM;
+ goto out;
+ }
+ cc_conn_ins_port(conn, port);
+ }
+
+ cc_conn_sig_msg_nodef(conn, CONN_SIG_CREATED, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_CALL_DESTROYED:
+ ilen = sizeof(struct uniapi_call_destroyed);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg, struct uniapi_call_destroyed *)->cref;
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig(conn, CONN_SIG_DESTROYED, NULL);
+ goto out;
+
+ case UNIAPI_LINK_ESTABLISH_confirm:
+ goto out;
+
+ case UNIAPI_LINK_RELEASE_confirm:
+ /* Ups. If we administratively up, restart the link */
+ if (port->admin == CCPORT_RUNNING)
+ port->cc->funcs->send_uni_glob(port, port->uarg,
+ UNIAPI_LINK_ESTABLISH_request, 0, NULL);
+ goto out;
+
+ case UNIAPI_PARTY_CREATED:
+ ilen = sizeof(struct uniapi_party_created);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg, struct uniapi_party_created *)->cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg_nodef(conn,
+ CONN_SIG_PARTY_CREATED, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_PARTY_DESTROYED:
+ ilen = sizeof(struct uniapi_party_destroyed);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg,
+ struct uniapi_party_destroyed *)->cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_PARTY_DESTROYED, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_DROP_PARTY_ACK_indication: /* UNI -> API */
+ ilen = sizeof(struct uniapi_drop_party_ack_indication);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg,
+ struct uniapi_drop_party_ack_indication *)->drop.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_DROP_PARTY_ACK_IND, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_RESET_indication: /* UNI -> API */
+ {
+ /*
+ * XXX - do the right thing
+ */
+ struct uniapi_reset_indication *ind = uni_msg_rptr(msg,
+ struct uniapi_reset_indication *);
+ struct uniapi_reset_response *resp;
+ struct uni_msg *u;
+
+ /*
+ * Construct message to UNI.
+ */
+ if ((u = uni_msg_alloc(sizeof(*resp))) == NULL)
+ return (ENOMEM);
+
+ resp = uni_msg_wptr(u, struct uniapi_reset_response *);
+ memset(resp, 0, sizeof(*resp));
+ u->b_wptr += sizeof(*resp);
+
+ resp->restart = ind->restart;
+ resp->connid = ind->connid;
+
+ port->cc->funcs->send_uni_glob(port, port->uarg,
+ UNIAPI_RESET_response, 0, u);
+
+ goto out;
+ }
+
+ case UNIAPI_RELEASE_indication: /* UNI -> API */
+ ilen = sizeof(struct uniapi_release_indication);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg, struct uniapi_release_indication *)
+ ->release.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_REL_IND, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_RELEASE_confirm: /* UNI -> API */
+ ilen = sizeof(struct uniapi_release_confirm);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg, struct uniapi_release_confirm *)
+ ->release.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_REL_CONF, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_SETUP_confirm: /* UNI -> API */
+ ilen = sizeof(struct uniapi_setup_confirm);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg, struct uniapi_setup_confirm *)
+ ->connect.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_SETUP_CONFIRM, msg);
+ msg = NULL;
+ goto out;
+
+
+ case UNIAPI_ALERTING_indication: /* UNI -> API */
+ ilen = sizeof(struct uniapi_alerting_indication);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg, struct uniapi_alerting_indication *)
+ ->alerting.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_ALERTING_IND, msg);
+ msg = NULL;
+ goto out;
+
+
+ case UNIAPI_PROCEEDING_indication: /* UNI -> API */
+ ilen = sizeof(struct uniapi_proceeding_indication);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg, struct uniapi_proceeding_indication *)
+ ->call_proc.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_PROC_IND, msg);
+ msg = NULL;
+ goto out;
+
+
+ case UNIAPI_SETUP_indication: /* UNI -> API */
+ ilen = sizeof(struct uniapi_setup_indication);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg, struct uniapi_setup_indication *)
+ ->setup.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_SETUP_IND, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_SETUP_COMPLETE_indication: /* UNI -> API */
+ ilen = sizeof(struct uniapi_setup_complete_indication);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg,
+ struct uniapi_setup_complete_indication *)
+ ->connect_ack.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_SETUP_COMPL, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_PARTY_ALERTING_indication: /* UNI -> API */
+ ilen = sizeof(struct uniapi_party_alerting_indication);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg,
+ struct uniapi_party_alerting_indication *)->alert.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_PARTY_ALERTING_IND, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_ADD_PARTY_ACK_indication: /* UNI -> API */
+ ilen = sizeof(struct uniapi_add_party_ack_indication);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg,
+ struct uniapi_add_party_ack_indication *)->ack.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_PARTY_ADD_ACK_IND, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_ADD_PARTY_REJ_indication: /* UNI -> API */
+ ilen = sizeof(struct uniapi_add_party_rej_indication);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg,
+ struct uniapi_add_party_rej_indication *)->rej.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_PARTY_ADD_REJ_IND, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_DROP_PARTY_indication: /* UNI -> API */
+ ilen = sizeof(struct uniapi_drop_party_indication);
+ if (len != ilen)
+ goto bad_len;
+
+ cref = &uni_msg_rptr(msg, struct uniapi_drop_party_indication *)
+ ->drop.hdr.cref;
+
+ if ((conn = find_cref(port, cref)) == NULL)
+ goto unk_call;
+
+ error = cc_conn_sig_msg(conn, CONN_SIG_DROP_PARTY_IND, msg);
+ msg = NULL;
+ goto out;
+
+ case UNIAPI_RESET_confirm: /* UNI -> API */
+ case UNIAPI_RESET_ERROR_indication: /* UNI -> API */
+ case UNIAPI_RESET_STATUS_indication: /* UNI -> API */
+ /* XXX */
+ goto out;
+
+ case UNIAPI_NOTIFY_indication: /* UNI -> API */
+ case UNIAPI_STATUS_indication: /* UNI -> API */
+ break;
+
+ case UNIAPI_ADD_PARTY_indication: /* UNI -> API */
+ /* not supported by the API */
+ break;
+
+ /*
+ * All these are illegal in this direction
+ */
+ case UNIAPI_LINK_ESTABLISH_request: /* API -> UNI */
+ case UNIAPI_LINK_RELEASE_request: /* API -> UNI */
+ case UNIAPI_RESET_request: /* API -> UNI */
+ case UNIAPI_RESET_response: /* API -> UNI */
+ case UNIAPI_RESET_ERROR_response: /* API -> UNI */
+ case UNIAPI_SETUP_request: /* API -> UNI */
+ case UNIAPI_SETUP_response: /* API -> UNI */
+ case UNIAPI_ALERTING_request: /* API -> UNI */
+ case UNIAPI_PROCEEDING_request: /* API -> UNI */
+ case UNIAPI_RELEASE_request: /* API -> UNI */
+ case UNIAPI_RELEASE_response: /* API -> UNI */
+ case UNIAPI_NOTIFY_request: /* API -> UNI */
+ case UNIAPI_STATUS_ENQUIRY_request: /* API -> UNI */
+ case UNIAPI_ADD_PARTY_request: /* API -> UNI */
+ case UNIAPI_PARTY_ALERTING_request: /* API -> UNI */
+ case UNIAPI_ADD_PARTY_ACK_request: /* API -> UNI */
+ case UNIAPI_ADD_PARTY_REJ_request: /* API -> UNI */
+ case UNIAPI_DROP_PARTY_request: /* API -> UNI */
+ case UNIAPI_DROP_PARTY_ACK_request: /* API -> UNI */
+ case UNIAPI_ABORT_CALL_request: /* API -> UNI */
+ case UNIAPI_SETUP_COMPLETE_request: /* API -> UNI */
+ case UNIAPI_MAXSIG:
+ break;
+ }
+ cc_port_log(port, "bad signal %u", sig);
+ error = EINVAL;
+ goto out;
+
+ bad_len:
+ cc_port_log(port, "signal %u bad length: %zu, need %zu", len, ilen);
+ error = EINVAL;
+ goto out;
+
+ unk_call:
+ cc_port_log(port, "unknown call %u/%u", cref->cref, cref->flag);
+ error = EINVAL;
+
+ out:
+ if (msg != NULL)
+ uni_msg_destroy(msg);
+ return (error);
+}
+
diff --git a/sys/contrib/ngatm/netnatm/api/cc_sig.c b/sys/contrib/ngatm/netnatm/api/cc_sig.c
new file mode 100644
index 0000000..ae6fcce
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/cc_sig.c
@@ -0,0 +1,350 @@
+/*
+* Copyright (c) 2004
+* Hartmut Brandt
+* All rights reserved.
+*
+* Author: Harti Brandt <harti@freebsd.org>
+*
+* Redistribution of this software and documentation and use in source and
+* binary forms, with or without modification, are permitted provided that
+* the following conditions are met:
+*
+* 1. Redistributions of source code or documentation must retain the above
+* copyright notice, this list of conditions and the following disclaimer.
+* 2. Redistributions in binary form must reproduce the above copyright
+* notice, this list of conditions and the following disclaimer in the
+* documentation and/or other materials provided with the distribution.
+*
+* THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHOR
+* AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+* INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+* THE AUTHOR OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+* LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*
+* $Begemot: libunimsg/netnatm/api/cc_sig.c,v 1.1 2004/07/08 08:21:54 brandt Exp $
+*
+* ATM API as defined per af-saa-0108
+*
+* Generic signal handling
+*/
+#include <netnatm/unimsg.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/api/unisap.h>
+#include <netnatm/sig/unidef.h>
+#include <netnatm/api/atmapi.h>
+#include <netnatm/api/ccatm.h>
+#include <netnatm/api/ccpriv.h>
+
+enum {
+ SIG_USER,
+ SIG_CONN,
+};
+
+struct ccsig {
+ u_char type; /* type of target */
+ u_char has_msg; /* arg1 is a message */
+ void *target; /* target instance */
+ u_int sig; /* signal */
+ void *arg1; /* argument */
+ u_int arg2; /* argument */
+ TAILQ_ENTRY(ccsig) link;
+};
+
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_sig_log(CC, FMT, ARGS...) do { \
+ if ((CC)->log & CCLOG_SIGS) \
+ (CC)->funcs->log("%s: " FMT, __FUNCTION__ , ## ARGS); \
+ } while (0)
+#else
+#define cc_sig_log(CC, FMT, ...) do { \
+ if ((CC)->log & CCLOG_SIGS) \
+ (CC)->funcs->log("%s: " FMT, __func__, __VA_ARGS__); \
+ } while (0)
+#endif
+
+
+const char *const cc_user_sigtab[] = {
+#define DEF(N) [USER_SIG_##N] = #N,
+USER_SIGS
+#undef DEF
+};
+
+const char *const cc_conn_sigtab[] = {
+#define DEF(N) [CONN_SIG_##N] = #N,
+CONN_SIGS
+#undef DEF
+};
+
+
+/*
+ * Allocate and populate a signal
+ */
+static /* __inline */ struct ccsig *
+sig_alloc(struct ccdata *cc, u_int type, void *target, u_int has_msg,
+ u_int sig, void *arg1, u_int arg2)
+{
+ struct ccsig *s;
+
+ if ((s = TAILQ_FIRST(&cc->free_sigs)) == NULL) {
+ s = CCZALLOC(sizeof(struct ccsig));
+ if (s == NULL) {
+ cc_log(cc, "signal %u/%u lost - ENOMEM", type, sig);
+ return (NULL);
+ }
+ } else
+ TAILQ_REMOVE(&cc->free_sigs, s, link);
+
+ s->type = type;
+ s->has_msg = has_msg;
+ s->target = target;
+ s->sig = sig;
+ s->arg1 = arg1;
+ s->arg2 = arg2;
+
+ return (s);
+}
+
+/*
+ * Queue a signal to this user
+ */
+int
+cc_user_sig(struct ccuser *user, enum user_sig sig, void *arg1, u_int arg2)
+{
+ struct ccsig *s;
+
+ s = sig_alloc(user->cc, SIG_USER, user, 0, sig, arg1, arg2);
+ if (s == NULL)
+ return (ENOMEM);
+ TAILQ_INSERT_TAIL(&user->cc->sigs, s, link);
+ cc_sig_log(user->cc, "queuing sig %s to user %p", cc_user_sigtab[sig],
+ user);
+ return (0);
+}
+
+/* Queue a signal with message to this user */
+int
+cc_user_sig_msg(struct ccuser *user, enum user_sig sig, struct uni_msg *msg)
+{
+ struct ccsig *s;
+
+ s = sig_alloc(user->cc, SIG_USER, user, msg != NULL, sig, msg, 0);
+ if (s == NULL)
+ return (ENOMEM);
+ TAILQ_INSERT_TAIL(&user->cc->sigs, s, link);
+ cc_sig_log(user->cc, "queuing sig %s to user %p", cc_user_sigtab[sig],
+ user);
+ return (0);
+}
+
+/*
+ * Signal to connection
+ */
+static int
+sig_conn(struct ccconn *conn, enum conn_sig sig, u_int has_msg, void *arg)
+{
+ struct ccsig *s;
+ const struct ccreq *r = NULL;
+
+ s = sig_alloc(conn->cc, SIG_CONN, conn, has_msg, sig, arg, 0);
+ if (s == NULL)
+ return (ENOMEM);
+
+ if (conn->port != NULL) {
+ /* argh */
+ TAILQ_FOREACH(r, &conn->port->cookies, link)
+ if (r->conn == conn)
+ break;
+ }
+ if (r == NULL) {
+ TAILQ_INSERT_TAIL(&conn->cc->sigs, s, link);
+ cc_sig_log(conn->cc, "queuing sig %s to conn %p",
+ cc_conn_sigtab[sig], conn);
+ } else {
+ TAILQ_INSERT_TAIL(&conn->cc->def_sigs, s, link);
+ cc_sig_log(conn->cc, "queuing defered sig %s to conn %p",
+ cc_conn_sigtab[sig], conn);
+ }
+ return (0);
+}
+
+/*
+ * Queue a signal to a connection.
+ */
+int
+cc_conn_sig(struct ccconn *conn, enum conn_sig sig, void *arg1)
+{
+
+ return (sig_conn(conn, sig, 0, arg1));
+}
+
+/*
+ * signal with message to connection
+ */
+int
+cc_conn_sig_msg(struct ccconn *conn, enum conn_sig sig, struct uni_msg *msg)
+{
+
+ return (sig_conn(conn, sig, (msg != NULL), msg));
+}
+int
+cc_conn_sig_msg_nodef(struct ccconn *conn, enum conn_sig sig,
+ struct uni_msg *msg)
+{
+ struct ccsig *s;
+
+ s = sig_alloc(conn->cc, SIG_CONN, conn, (msg != NULL), sig, msg, 0);
+ if (s == NULL)
+ return (ENOMEM);
+
+ TAILQ_INSERT_TAIL(&conn->cc->sigs, s, link);
+ cc_sig_log(conn->cc, "queuing sig %s to conn %p",
+ cc_conn_sigtab[sig], conn);
+
+ return (0);
+}
+
+/*
+ * Queue a response signal to a connection.
+ */
+int
+cc_conn_resp(struct ccconn *conn, enum conn_sig sig, u_int cookie __unused,
+ u_int reason, u_int state)
+{
+ struct ccsig *s, *s1, *s2;
+
+ s = sig_alloc(conn->cc, SIG_CONN, conn, 0, sig, NULL,
+ ((reason & 0xffff) << 16) | (state & 0xffff));
+ if (s == NULL)
+ return (ENOMEM);
+
+ TAILQ_INSERT_TAIL(&conn->cc->sigs, s, link);
+
+ cc_sig_log(conn->cc, "queuing response %s to conn %p",
+ cc_conn_sigtab[sig], conn);
+
+ s1 = TAILQ_FIRST(&conn->cc->def_sigs);
+ while (s1 != NULL) {
+ s2 = TAILQ_NEXT(s1, link);
+ if (s1->type == SIG_CONN && s1->target == conn) {
+ TAILQ_REMOVE(&conn->cc->def_sigs, s1, link);
+ TAILQ_INSERT_AFTER(&conn->cc->sigs, s, s1, link);
+ cc_sig_log(conn->cc, "undefering sig %s to conn %p",
+ cc_conn_sigtab[s1->sig], conn);
+ s = s1;
+ }
+ s1 = s2;
+ }
+
+ return (0);
+}
+
+/*
+ * Flush all signals to a given target from both queues
+ */
+static /* __inline */ void
+sig_flush(struct ccdata *cc, u_int type, void *target)
+{
+ struct ccsig *s, *s1;
+
+ s = TAILQ_FIRST(&cc->sigs);
+ while (s != NULL) {
+ s1 = TAILQ_NEXT(s, link);
+ if (s->type == type && s->target == target) {
+ if (s->has_msg)
+ uni_msg_destroy((struct uni_msg *)s->arg1);
+ TAILQ_REMOVE(&cc->sigs, s, link);
+ TAILQ_INSERT_HEAD(&cc->free_sigs, s, link);
+ }
+ s = s1;
+ }
+
+ s = TAILQ_FIRST(&cc->def_sigs);
+ while (s != NULL) {
+ s1 = TAILQ_NEXT(s, link);
+ if (s->type == type && s->target == target) {
+ if (s->has_msg)
+ uni_msg_destroy((struct uni_msg *)s->arg1);
+ TAILQ_REMOVE(&cc->def_sigs, s, link);
+ TAILQ_INSERT_HEAD(&cc->free_sigs, s, link);
+ }
+ s = s1;
+ }
+}
+
+/*
+ * Flush all signals to this user
+ */
+void
+cc_user_sig_flush(struct ccuser *user)
+{
+
+ cc_sig_log(user->cc, "flushing signals to user %p", user);
+ sig_flush(user->cc, SIG_USER, user);
+}
+
+/*
+ * Flush all signals to this connection
+ */
+void
+cc_conn_sig_flush(struct ccconn *conn)
+{
+
+ cc_sig_log(conn->cc, "flushing signals to conn %p", conn);
+ sig_flush(conn->cc, SIG_CONN, conn);
+}
+
+/*
+ * Do the work
+ */
+void
+cc_work(struct ccdata *cc)
+{
+ struct ccsig *s;
+
+ cc_sig_log(cc, "start %s", "work");
+ while ((s = TAILQ_FIRST(&cc->sigs)) != NULL) {
+ TAILQ_REMOVE(&cc->sigs, s, link);
+ if (s->type == SIG_USER)
+ cc_user_sig_handle(s->target, s->sig, s->arg1, s->arg2);
+ else {
+ cc_conn_sig_handle(s->target, s->sig, s->arg1, s->arg2);
+ if (s->has_msg)
+ uni_msg_destroy(s->arg1);
+ }
+ TAILQ_INSERT_HEAD(&cc->free_sigs, s, link);
+ }
+ cc_sig_log(cc, "end %s", "work");
+}
+
+/*
+ * flush all signals
+ */
+void
+cc_sig_flush_all(struct ccdata *cc)
+{
+ struct ccsig *s;
+
+ while ((s = TAILQ_FIRST(&cc->sigs)) != NULL) {
+ if (s->has_msg)
+ uni_msg_destroy((struct uni_msg *)s->arg1);
+ TAILQ_REMOVE(&cc->sigs, s, link);
+ CCFREE(s);
+ }
+ while ((s = TAILQ_FIRST(&cc->def_sigs)) != NULL) {
+ if (s->has_msg)
+ uni_msg_destroy((struct uni_msg *)s->arg1);
+ TAILQ_REMOVE(&cc->def_sigs, s, link);
+ CCFREE(s);
+ }
+ while ((s = TAILQ_FIRST(&cc->free_sigs)) != NULL) {
+ TAILQ_REMOVE(&cc->free_sigs, s, link);
+ CCFREE(s);
+ }
+}
diff --git a/sys/contrib/ngatm/netnatm/api/cc_user.c b/sys/contrib/ngatm/netnatm/api/cc_user.c
new file mode 100644
index 0000000..75ce91e
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/cc_user.c
@@ -0,0 +1,1922 @@
+/*
+ * Copyright (c) 2003-2004
+ * Hartmut Brandt
+ * All rights reserved.
+ *
+ * Copyright (c) 2001-2002
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Author: Harti Brandt <harti@freebsd.org>
+ *
+ * Redistribution of this software and documentation and use in source and
+ * binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ *
+ * 1. Redistributions of source code or documentation must retain the above
+ * copyright notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHOR
+ * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHOR OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/api/cc_user.c,v 1.3 2004/07/16 18:46:55 brandt Exp $
+ *
+ * ATM API as defined per af-saa-0108
+ *
+ * User side (upper half)
+ */
+
+#include <netnatm/unimsg.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/api/unisap.h>
+#include <netnatm/sig/unidef.h>
+#include <netnatm/api/atmapi.h>
+#include <netnatm/api/ccatm.h>
+#include <netnatm/api/ccpriv.h>
+
+/*
+* This file handles messages to a USER.
+*/
+static const char *stab[] = {
+#define DEF(N) [N] = #N,
+ USER_STATES
+#undef DEF
+};
+
+const char *
+cc_user_state2str(u_int s)
+{
+ if (s >= sizeof(stab) / sizeof(stab[0]) || stab[s] == NULL)
+ return ("?");
+ return (stab[s]);
+}
+
+static __inline void
+set_state(struct ccuser *user, enum user_state ns)
+{
+ if (user->state != ns) {
+ if (user->cc->log & CCLOG_USER_STATE)
+ cc_user_log(user, "%s -> %s",
+ stab[user->state], stab[ns]);
+ user->state = ns;
+ }
+}
+
+static __inline void
+cc_user_send(struct ccuser *user, u_int op, void *arg, size_t len)
+{
+ user->cc->funcs->send_user(user, user->uarg, op, arg, len);
+}
+
+static __inline void
+cc_user_ok(struct ccuser *user, u_int data, void *arg, size_t len)
+{
+ user->cc->funcs->respond_user(user, user->uarg,
+ ATMERR_OK, data, arg, len);
+}
+
+static __inline void
+cc_user_err(struct ccuser *user, int err)
+{
+ user->cc->funcs->respond_user(user, user->uarg,
+ err, ATMRESP_NONE, NULL, 0);
+}
+
+
+/**********************************************************************
+*
+* INSTANCE MANAGEMENT
+*/
+/*
+* New endpoint created
+*/
+struct ccuser *
+cc_user_create(struct ccdata *cc, void *uarg, const char *name)
+{
+ struct ccuser *user;
+
+ user = CCZALLOC(sizeof(*user));
+ if (user == NULL)
+ return (NULL);
+
+ user->cc = cc;
+ user->state = USER_NULL;
+ user->uarg = uarg;
+ strncpy(user->name, name, sizeof(user->name));
+ user->name[sizeof(user->name) - 1] = '\0';
+ TAILQ_INIT(&user->connq);
+ LIST_INSERT_HEAD(&cc->user_list, user, node_link);
+
+ if (user->cc->log & CCLOG_USER_INST)
+ cc_user_log(user, "created with name '%s'", name);
+
+ return (user);
+}
+
+/*
+ * Reset a user instance
+ */
+static void
+cc_user_reset(struct ccuser *user)
+{
+
+ CCASSERT(TAILQ_EMPTY(&user->connq), ("connq not empty"));
+
+ if (user->sap != NULL) {
+ CCFREE(user->sap);
+ user->sap = NULL;
+ }
+
+ if (user->accepted != NULL) {
+ user->accepted->acceptor = NULL;
+ user->accepted = NULL;
+ }
+ user->config = USER_P2P;
+ user->queue_act = 0;
+ user->queue_max = 0;
+ user->aborted = 0;
+
+ set_state(user, USER_NULL);
+
+ cc_user_sig_flush(user);
+}
+
+static void
+cc_user_abort(struct ccuser *user, const struct uni_ie_cause *cause)
+{
+ struct ccconn *conn;
+
+ /*
+ * Although the standard state that 'all connections
+ * associated with this endpoint are aborted' we only
+ * have to abort the head one, because in state A6
+ * (call present) the endpoint is only associated to the
+ * head connection - the others are 'somewhere else' and
+ * need to be redispatched.
+ *
+ * First bring user into a state that the connections
+ * are not dispatched back to it.
+ */
+ set_state(user, USER_NULL);
+ if (!user->aborted) {
+ if ((conn = TAILQ_FIRST(&user->connq)) != NULL) {
+ memset(conn->cause, 0, sizeof(conn->cause));
+ if (cause != NULL)
+ conn->cause[0] = *cause;
+ cc_conn_reset_acceptor(conn);
+ cc_disconnect_from_user(conn);
+ cc_conn_sig(conn, CONN_SIG_USER_ABORT, NULL);
+ }
+ }
+
+ while ((conn = TAILQ_FIRST(&user->connq)) != NULL) {
+ /* these should be in C21 */
+ cc_disconnect_from_user(conn);
+ cc_conn_dispatch(conn);
+ }
+
+ cc_user_reset(user);
+}
+
+/*
+ * Application has closed this endpoint. Clean up all user resources and
+ * abort all connections. This can be called in any state.
+ */
+void
+cc_user_destroy(struct ccuser *user)
+{
+
+ if (user->cc->log & CCLOG_USER_INST)
+ cc_user_log(user, "destroy '%s'", user->name);
+
+ cc_user_abort(user, NULL);
+
+ if (user->sap != NULL)
+ CCFREE(user->sap);
+
+ cc_user_sig_flush(user);
+
+ LIST_REMOVE(user, node_link);
+ CCFREE(user);
+}
+
+/**********************************************************************
+ *
+ * OUTGOING CALLS
+ */
+/*
+ * Return true when the calling address of the connection matches the address.
+ */
+static int
+addr_matches(const struct ccaddr *addr, const struct ccconn *conn)
+{
+
+ if (!IE_ISPRESENT(conn->calling))
+ return (0);
+
+ return (addr->addr.type == conn->calling.addr.type &&
+ addr->addr.plan == conn->calling.addr.plan &&
+ addr->addr.len == conn->calling.addr.len &&
+ memcmp(addr->addr.addr, conn->calling.addr.addr,
+ addr->addr.len) == 0);
+}
+
+/*
+ * Check if the user's SAP (given he is in the right state) and
+ * the given SAP overlap
+ */
+static int
+check_overlap(struct ccuser *user, struct uni_sap *sap)
+{
+ return ((user->state == USER_IN_PREPARING ||
+ user->state == USER_IN_WAITING) &&
+ unisve_overlap_sap(user->sap, sap));
+}
+
+/*
+ * Send arrival notification to user
+ */
+static void
+do_arrival(struct ccuser *user)
+{
+ struct ccconn *conn;
+
+ user->aborted = 0;
+ if ((conn = TAILQ_FIRST(&user->connq)) != NULL) {
+ set_state(user, USER_IN_ARRIVED);
+ cc_user_send(user, ATMOP_ARRIVAL_OF_INCOMING_CALL, NULL, 0);
+ cc_conn_sig(conn, CONN_SIG_ARRIVAL, NULL);
+ }
+}
+
+/**********************************************************************
+ *
+ * ATTRIBUTES
+ */
+/*
+ * Query an attribute. This is possible only in some states: preparation
+ * of an outgoing call, after an incoming call was offered to the application
+ * and in the three active states (P2P, P2PLeaf, P2PRoot).
+ */
+static struct ccconn *
+cc_query_check(struct ccuser *user)
+{
+
+ switch (user->state) {
+
+ case USER_OUT_PREPARING:
+ case USER_IN_ARRIVED:
+ case USER_ACTIVE:
+ return (TAILQ_FIRST(&user->connq));
+
+ case USER_NULL:
+ /* if we are waiting for the SETUP_confirm, we are in
+ * the NULL state still (we are the new endpoint), but
+ * have a connection in 'accepted' that is in the
+ * CONN_IN_WAIT_ACCEPT_OK state.
+ */
+ if (user->accepted != NULL &&
+ user->accepted->state == CONN_IN_WAIT_ACCEPT_OK)
+ return (user->accepted);
+ /* FALLTHRU */
+
+ default:
+ return (NULL);
+ }
+}
+
+/*
+ * Query attributes
+ */
+static void
+cc_attr_query(struct ccuser *user, struct ccconn *conn,
+ uint32_t *attr, u_int count)
+{
+ void *val, *ptr;
+ size_t total, len;
+ u_int i;
+ uint32_t *atab;
+
+ /* determine the length of the total attribute buffer */
+ total = sizeof(uint32_t) + count * sizeof(uint32_t);
+ for (i = 0; i < count; i++) {
+ len = 0;
+ switch ((enum atm_attribute)attr[i]) {
+
+ case ATM_ATTR_NONE:
+ break;
+
+ case ATM_ATTR_BLLI_SELECTOR:
+ len = sizeof(uint32_t);
+ break;
+
+ case ATM_ATTR_BLLI:
+ len = sizeof(struct uni_ie_blli);
+ break;
+
+ case ATM_ATTR_BEARER:
+ len = sizeof(struct uni_ie_bearer);
+ break;
+
+ case ATM_ATTR_TRAFFIC:
+ len = sizeof(struct uni_ie_traffic);
+ break;
+
+ case ATM_ATTR_QOS:
+ len = sizeof(struct uni_ie_qos);
+ break;
+
+ case ATM_ATTR_EXQOS:
+ len = sizeof(struct uni_ie_exqos);
+ break;
+
+ case ATM_ATTR_CALLED:
+ len = sizeof(struct uni_ie_called);
+ break;
+
+ case ATM_ATTR_CALLEDSUB:
+ len = sizeof(struct uni_ie_calledsub);
+ break;
+
+ case ATM_ATTR_CALLING:
+ len = sizeof(struct uni_ie_calling);
+ break;
+
+ case ATM_ATTR_CALLINGSUB:
+ len = sizeof(struct uni_ie_callingsub);
+ break;
+
+ case ATM_ATTR_AAL:
+ len = sizeof(struct uni_ie_aal);
+ break;
+
+ case ATM_ATTR_EPREF:
+ len = sizeof(struct uni_ie_epref);
+ break;
+
+ case ATM_ATTR_CONNED:
+ len = sizeof(struct uni_ie_conned);
+ break;
+
+ case ATM_ATTR_CONNEDSUB:
+ len = sizeof(struct uni_ie_connedsub);
+ break;
+
+ case ATM_ATTR_EETD:
+ len = sizeof(struct uni_ie_eetd);
+ break;
+
+ case ATM_ATTR_ABRSETUP:
+ len = sizeof(struct uni_ie_abrsetup);
+ break;
+
+ case ATM_ATTR_ABRADD:
+ len = sizeof(struct uni_ie_abradd);
+ break;
+
+ case ATM_ATTR_CONNID:
+ len = sizeof(struct uni_ie_connid);
+ break;
+
+ case ATM_ATTR_MDCR:
+ len = sizeof(struct uni_ie_mdcr);
+ break;
+ }
+ if (len == 0) {
+ cc_user_err(user, ATMERR_BAD_ATTR);
+ return;
+ }
+ total += len;
+ }
+
+ /* allocate buffer */
+ val = CCMALLOC(total);
+ if (val == NULL)
+ return;
+
+ atab = val;
+ atab[0] = count;
+
+ /* fill */
+ ptr = (u_char *)val + (sizeof(uint32_t) + count * sizeof(uint32_t));
+ for (i = 0; i < count; i++) {
+ len = 0;
+ atab[i + 1] = attr[i];
+ switch (attr[i]) {
+
+ case ATM_ATTR_NONE:
+ break;
+
+ case ATM_ATTR_BLLI_SELECTOR:
+ len = sizeof(uint32_t);
+ memcpy(ptr, &conn->blli_selector, len);
+ break;
+
+ case ATM_ATTR_BLLI:
+ /* in A6 the blli_selector may be 0 when
+ * there was no blli in the SETUP.
+ */
+ len = sizeof(struct uni_ie_blli);
+ if (conn->blli_selector == 0)
+ memset(ptr, 0, len);
+ else
+ memcpy(ptr, &conn->blli[conn->blli_selector -
+ 1], len);
+ break;
+
+ case ATM_ATTR_BEARER:
+ len = sizeof(struct uni_ie_bearer);
+ memcpy(ptr, &conn->bearer, len);
+ break;
+
+ case ATM_ATTR_TRAFFIC:
+ len = sizeof(struct uni_ie_traffic);
+ memcpy(ptr, &conn->traffic, len);
+ break;
+
+ case ATM_ATTR_QOS:
+ len = sizeof(struct uni_ie_qos);
+ memcpy(ptr, &conn->qos, len);
+ break;
+
+ case ATM_ATTR_EXQOS:
+ len = sizeof(struct uni_ie_exqos);
+ memcpy(ptr, &conn->exqos, len);
+ break;
+
+ case ATM_ATTR_CALLED:
+ len = sizeof(struct uni_ie_called);
+ memcpy(ptr, &conn->called, len);
+ break;
+
+ case ATM_ATTR_CALLEDSUB:
+ len = sizeof(struct uni_ie_calledsub);
+ memcpy(ptr, &conn->calledsub, len);
+ break;
+
+ case ATM_ATTR_CALLING:
+ len = sizeof(struct uni_ie_calling);
+ memcpy(ptr, &conn->calling, len);
+ break;
+
+ case ATM_ATTR_CALLINGSUB:
+ len = sizeof(struct uni_ie_callingsub);
+ memcpy(ptr, &conn->callingsub, len);
+ break;
+
+ case ATM_ATTR_AAL:
+ len = sizeof(struct uni_ie_aal);
+ memcpy(ptr, &conn->aal, len);
+ break;
+
+ case ATM_ATTR_EPREF:
+ len = sizeof(struct uni_ie_epref);
+ memcpy(ptr, &conn->epref, len);
+ break;
+
+ case ATM_ATTR_CONNED:
+ len = sizeof(struct uni_ie_conned);
+ memcpy(ptr, &conn->conned, len);
+ break;
+
+ case ATM_ATTR_CONNEDSUB:
+ len = sizeof(struct uni_ie_connedsub);
+ memcpy(ptr, &conn->connedsub, len);
+ break;
+
+ case ATM_ATTR_EETD:
+ len = sizeof(struct uni_ie_eetd);
+ memcpy(ptr, &conn->eetd, len);
+ break;
+
+ case ATM_ATTR_ABRSETUP:
+ len = sizeof(struct uni_ie_abrsetup);
+ memcpy(ptr, &conn->abrsetup, len);
+ break;
+
+ case ATM_ATTR_ABRADD:
+ len = sizeof(struct uni_ie_abradd);
+ memcpy(ptr, &conn->abradd, len);
+ break;
+
+ case ATM_ATTR_CONNID:
+ len = sizeof(struct uni_ie_connid);
+ memcpy(ptr, &conn->connid, len);
+ break;
+
+ case ATM_ATTR_MDCR:
+ len = sizeof(struct uni_ie_mdcr);
+ memcpy(ptr, &conn->mdcr, len);
+ break;
+ }
+ ptr = (u_char *)ptr + len;
+ }
+
+ cc_user_ok(user, ATMRESP_ATTRS, val, total);
+
+ CCFREE(val);
+}
+
+/*
+ * Check whether the state is ok and return the connection
+ */
+static struct ccconn *
+cc_set_check(struct ccuser *user)
+{
+ switch(user->state) {
+
+ case USER_OUT_PREPARING:
+ case USER_IN_ARRIVED:
+ return (TAILQ_FIRST(&user->connq));
+
+ default:
+ return (NULL);
+ }
+}
+
+/*
+ * Set connection attribute(s)
+ */
+static void
+cc_attr_set(struct ccuser *user, struct ccconn *conn, uint32_t *attr,
+ u_int count, u_char *val, size_t vallen)
+{
+ size_t total, len;
+ u_int i;
+ u_char *ptr;
+
+ /* determine the length of the total attribute buffer */
+ total = 0;
+ ptr = val;
+ for (i = 0; i < count; i++) {
+ len = 0;
+ switch ((enum atm_attribute)attr[i]) {
+
+ case ATM_ATTR_NONE:
+ break;
+
+ case ATM_ATTR_BLLI_SELECTOR:
+ {
+ uint32_t sel;
+
+ if (conn->state != CONN_OUT_PREPARING)
+ goto rdonly;
+ memcpy(&sel, ptr, sizeof(sel));
+ if (sel == 0 || sel > UNI_NUM_IE_BLLI)
+ goto bad_val;
+ len = sizeof(uint32_t);
+ break;
+ }
+
+ case ATM_ATTR_BLLI:
+ len = sizeof(struct uni_ie_blli);
+ break;
+
+ case ATM_ATTR_BEARER:
+ if (conn->state != CONN_OUT_PREPARING)
+ goto rdonly;
+ len = sizeof(struct uni_ie_bearer);
+ break;
+
+ case ATM_ATTR_TRAFFIC:
+ len = sizeof(struct uni_ie_traffic);
+ break;
+
+ case ATM_ATTR_QOS:
+ if (conn->state != CONN_OUT_PREPARING)
+ goto rdonly;
+ len = sizeof(struct uni_ie_qos);
+ break;
+
+ case ATM_ATTR_EXQOS:
+ len = sizeof(struct uni_ie_exqos);
+ break;
+
+ case ATM_ATTR_CALLED:
+ goto rdonly;
+
+ case ATM_ATTR_CALLEDSUB:
+ if (conn->state != CONN_OUT_PREPARING)
+ goto rdonly;
+ len = sizeof(struct uni_ie_calledsub);
+ break;
+
+ case ATM_ATTR_CALLING:
+ if (conn->state != CONN_OUT_PREPARING)
+ goto rdonly;
+ len = sizeof(struct uni_ie_calling);
+ break;
+
+ case ATM_ATTR_CALLINGSUB:
+ if (conn->state != CONN_OUT_PREPARING)
+ goto rdonly;
+ len = sizeof(struct uni_ie_callingsub);
+ break;
+
+ case ATM_ATTR_AAL:
+ len = sizeof(struct uni_ie_aal);
+ break;
+
+ case ATM_ATTR_EPREF:
+ goto rdonly;
+
+ case ATM_ATTR_CONNED:
+ goto rdonly;
+
+ case ATM_ATTR_CONNEDSUB:
+ goto rdonly;
+
+ case ATM_ATTR_EETD:
+ len = sizeof(struct uni_ie_eetd);
+ break;
+
+ case ATM_ATTR_ABRSETUP:
+ len = sizeof(struct uni_ie_abrsetup);
+ break;
+
+ case ATM_ATTR_ABRADD:
+ len = sizeof(struct uni_ie_abradd);
+ break;
+
+ case ATM_ATTR_CONNID:
+ len = sizeof(struct uni_ie_connid);
+ break;
+
+ case ATM_ATTR_MDCR:
+ if (conn->state != CONN_OUT_PREPARING)
+ goto rdonly;
+ len = sizeof(struct uni_ie_mdcr);
+ break;
+ }
+ if (len == 0) {
+ cc_user_err(user, ATMERR_BAD_ATTR);
+ return;
+ }
+ total += len;
+ ptr += len;
+ }
+
+ /* check the length */
+ if (vallen != total) {
+ cc_user_err(user, ATMERR_BAD_ARGS);
+ return;
+ }
+
+ ptr = val;
+ for (i = 0; i < count; i++) {
+ len = 0;
+ switch ((enum atm_attribute)attr[i]) {
+
+ case ATM_ATTR_NONE:
+ break;
+
+ case ATM_ATTR_BLLI_SELECTOR:
+ {
+ uint32_t sel;
+
+ memcpy(&sel, ptr, sizeof(sel));
+ conn->blli_selector = sel;
+ len = sizeof(uint32_t);
+ break;
+ }
+
+ case ATM_ATTR_BLLI:
+ len = sizeof(struct uni_ie_blli);
+ memcpy(&conn->blli[conn->blli_selector - 1], ptr, len);
+ conn->dirty_attr |= CCDIRTY_BLLI;
+ break;
+
+ case ATM_ATTR_BEARER:
+ len = sizeof(struct uni_ie_bearer);
+ memcpy(&conn->bearer, ptr, len);
+ break;
+
+ case ATM_ATTR_TRAFFIC:
+ len = sizeof(struct uni_ie_traffic);
+ memcpy(&conn->traffic, ptr, len);
+ conn->dirty_attr |= CCDIRTY_TRAFFIC;
+ break;
+
+ case ATM_ATTR_QOS:
+ len = sizeof(struct uni_ie_qos);
+ memcpy(&conn->qos, ptr, len);
+ break;
+
+ case ATM_ATTR_EXQOS:
+ len = sizeof(struct uni_ie_exqos);
+ memcpy(&conn->exqos, ptr, len);
+ conn->dirty_attr |= CCDIRTY_EXQOS;
+ break;
+
+ case ATM_ATTR_CALLED:
+ len = sizeof(struct uni_ie_called);
+ break;
+
+ case ATM_ATTR_CALLEDSUB:
+ len = sizeof(struct uni_ie_calledsub);
+ memcpy(&conn->calledsub, ptr, len);
+ break;
+
+ case ATM_ATTR_CALLING:
+ len = sizeof(struct uni_ie_calling);
+ memcpy(&conn->calling, ptr, len);
+ break;
+
+ case ATM_ATTR_CALLINGSUB:
+ len = sizeof(struct uni_ie_callingsub);
+ memcpy(&conn->callingsub, ptr, len);
+ break;
+
+ case ATM_ATTR_AAL:
+ len = sizeof(struct uni_ie_aal);
+ memcpy(&conn->aal, ptr, len);
+ conn->dirty_attr |= CCDIRTY_AAL;
+ break;
+
+ case ATM_ATTR_EPREF:
+ len = sizeof(struct uni_ie_epref);
+ break;
+
+ case ATM_ATTR_CONNED:
+ len = sizeof(struct uni_ie_conned);
+ break;
+
+ case ATM_ATTR_CONNEDSUB:
+ len = sizeof(struct uni_ie_connedsub);
+ break;
+
+ case ATM_ATTR_EETD:
+ len = sizeof(struct uni_ie_eetd);
+ memcpy(&conn->eetd, ptr, len);
+ conn->dirty_attr |= CCDIRTY_EETD;
+ break;
+
+ case ATM_ATTR_ABRSETUP:
+ len = sizeof(struct uni_ie_abrsetup);
+ memcpy(&conn->abrsetup, ptr, len);
+ conn->dirty_attr |= CCDIRTY_ABRSETUP;
+ break;
+
+ case ATM_ATTR_ABRADD:
+ len = sizeof(struct uni_ie_abradd);
+ memcpy(&conn->abradd, ptr, len);
+ conn->dirty_attr |= CCDIRTY_ABRADD;
+ break;
+
+ case ATM_ATTR_CONNID:
+ len = sizeof(struct uni_ie_connid);
+ memcpy(&conn->connid, ptr, len);
+ conn->dirty_attr |= CCDIRTY_CONNID;
+ break;
+
+ case ATM_ATTR_MDCR:
+ len = sizeof(struct uni_ie_mdcr);
+ memcpy(&conn->mdcr, ptr, len);
+ break;
+ }
+ ptr += len;
+ }
+
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+ return;
+
+ bad_val:
+ cc_user_err(user, ATMERR_BAD_VALUE);
+ return;
+
+ rdonly:
+ cc_user_err(user, ATMERR_RDONLY);
+ return;
+}
+
+#ifdef CCATM_DEBUG
+static const char *op_names[] = {
+#define S(OP) [ATMOP_##OP] = #OP
+ S(RESP),
+ S(ABORT_CONNECTION),
+ S(ACCEPT_INCOMING_CALL),
+ S(ADD_PARTY),
+ S(ADD_PARTY_REJECT),
+ S(ADD_PARTY_SUCCESS),
+ S(ARRIVAL_OF_INCOMING_CALL),
+ S(CALL_RELEASE),
+ S(CONNECT_OUTGOING_CALL),
+ S(DROP_PARTY),
+ S(GET_LOCAL_PORT_INFO),
+ S(P2MP_CALL_ACTIVE),
+ S(P2P_CALL_ACTIVE),
+ S(PREPARE_INCOMING_CALL),
+ S(PREPARE_OUTGOING_CALL),
+ S(QUERY_CONNECTION_ATTRIBUTES),
+ S(REJECT_INCOMING_CALL),
+ S(SET_CONNECTION_ATTRIBUTES),
+ S(WAIT_ON_INCOMING_CALL),
+ S(SET_CONNECTION_ATTRIBUTES_X),
+ S(QUERY_CONNECTION_ATTRIBUTES_X),
+ S(QUERY_STATE),
+#undef S
+};
+#endif
+
+/*
+ * Signal from user - map this to our internal signals and queue
+ * the mapped signal.
+ */
+int
+cc_user_signal(struct ccuser *user, enum atmop sig, struct uni_msg *msg)
+{
+ size_t len = uni_msg_len(msg);
+ int err = EINVAL;
+
+ if (user->cc->log & CCLOG_USER_SIG)
+ cc_user_log(user, "signal %s to user", op_names[sig]);
+
+ if ((u_int)sig > ATMOP_QUERY_STATE)
+ goto bad_signal;
+
+ switch (sig) {
+
+ case ATMOP_ABORT_CONNECTION:
+ if (len != sizeof(struct atm_abort_connection))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_ABORT_CONNECTION, msg);
+ break;
+
+ case ATMOP_ACCEPT_INCOMING_CALL:
+ if (len != sizeof(struct atm_accept_incoming_call))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_ACCEPT_INCOMING, msg);
+ break;
+
+ case ATMOP_ADD_PARTY:
+ if (len != sizeof(struct atm_add_party))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_ADD_PARTY, msg);
+ break;
+
+ case ATMOP_CALL_RELEASE:
+ if (len != sizeof(struct atm_call_release))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_CALL_RELEASE, msg);
+ break;
+
+ case ATMOP_CONNECT_OUTGOING_CALL:
+ if (len != sizeof(struct atm_connect_outgoing_call))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_CONNECT_OUTGOING, msg);
+ break;
+
+ case ATMOP_DROP_PARTY:
+ if (len != sizeof(struct atm_drop_party))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_DROP_PARTY, msg);
+ break;
+
+ case ATMOP_GET_LOCAL_PORT_INFO:
+ if (len != sizeof(struct atm_get_local_port_info))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_GET_LOCAL_PORT_INFO, msg);
+ break;
+
+ case ATMOP_PREPARE_INCOMING_CALL:
+ if (len != sizeof(struct atm_prepare_incoming_call))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_PREPARE_INCOMING, msg);
+ break;
+
+ case ATMOP_PREPARE_OUTGOING_CALL:
+ if (len != 0)
+ goto bad_len;
+ uni_msg_destroy(msg);
+ err = cc_user_sig(user, USER_SIG_PREPARE_OUTGOING, NULL, 0);
+ break;
+
+ case ATMOP_QUERY_CONNECTION_ATTRIBUTES:
+ if (len != sizeof(struct atm_query_connection_attributes))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_QUERY_ATTR, msg);
+ break;
+
+ case ATMOP_REJECT_INCOMING_CALL:
+ if (len != sizeof(struct atm_reject_incoming_call))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_REJECT_INCOMING, msg);
+ break;
+
+ case ATMOP_SET_CONNECTION_ATTRIBUTES:
+ if (len < sizeof(struct atm_set_connection_attributes))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_SET_ATTR, msg);
+ break;
+
+ case ATMOP_WAIT_ON_INCOMING_CALL:
+ if (len != 0)
+ goto bad_len;
+ uni_msg_destroy(msg);
+ err = cc_user_sig(user, USER_SIG_WAIT_ON_INCOMING, NULL, 0);
+ break;
+
+ case ATMOP_QUERY_CONNECTION_ATTRIBUTES_X:
+ if (len < sizeof(struct atm_set_connection_attributes_x) ||
+ len != offsetof(struct atm_set_connection_attributes_x,
+ attr) + uni_msg_rptr(msg,
+ struct atm_set_connection_attributes_x *)->count *
+ sizeof(uint32_t))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_QUERY_ATTR_X, msg);
+ break;
+
+ case ATMOP_SET_CONNECTION_ATTRIBUTES_X:
+ if (len < sizeof(struct atm_set_connection_attributes_x))
+ goto bad_len;
+ err = cc_user_sig_msg(user, USER_SIG_SET_ATTR_X, msg);
+ break;
+
+ case ATMOP_QUERY_STATE:
+ if (len != 0)
+ goto bad_len;
+ uni_msg_destroy(msg);
+ err = cc_user_sig(user, USER_SIG_QUERY_STATE, NULL, 0);
+ break;
+
+ case ATMOP_RESP:
+ case ATMOP_ADD_PARTY_REJECT:
+ case ATMOP_ADD_PARTY_SUCCESS:
+ case ATMOP_ARRIVAL_OF_INCOMING_CALL:
+ case ATMOP_P2MP_CALL_ACTIVE:
+ case ATMOP_P2P_CALL_ACTIVE:
+ bad_signal:
+ /* bad signal */
+ if (user->cc->log & CCLOG_USER_SIG)
+ cc_user_log(user, "bad signal %u", sig);
+ cc_user_err(user, ATMERR_BAD_OP);
+ uni_msg_destroy(msg);
+ break;
+ }
+ return (err);
+
+ bad_len:
+ /* bad argument length */
+ if (user->cc->log & CCLOG_USER_SIG)
+ cc_user_log(user, "signal %s had bad len=%zu",
+ op_names[sig], len);
+ cc_user_err(user, ATMERR_BAD_ARGS);
+ uni_msg_destroy(msg);
+ return (EINVAL);
+}
+
+/*
+ * Send active signal to user
+ */
+static void
+cc_user_active(struct ccuser *user)
+{
+ struct ccconn *conn = TAILQ_FIRST(&user->connq);
+
+ set_state(user, USER_ACTIVE);
+ if (conn->bearer.cfg == UNI_BEARER_P2P) {
+ struct atm_p2p_call_active *act;
+
+ user->config = USER_P2P;
+ act = CCZALLOC(sizeof(*act));
+ if (act == NULL)
+ return;
+ act->connid = conn->connid;
+ cc_user_send(user, ATMOP_P2P_CALL_ACTIVE, act, sizeof(*act));
+ CCFREE(act);
+ } else {
+ struct atm_p2mp_call_active *act;
+
+ user->config = USER_ROOT;
+ act = CCZALLOC(sizeof(*act));
+ if (act == NULL)
+ return;
+ act->connid = conn->connid;
+ cc_user_send(user, ATMOP_P2MP_CALL_ACTIVE, act, sizeof(*act));
+ CCFREE(act);
+ }
+}
+
+/*
+* Handle a signal to this user
+*/
+void
+cc_user_sig_handle(struct ccuser *user, enum user_sig sig,
+ void *arg, u_int arg2)
+{
+
+ if (user->cc->log & CCLOG_USER_SIG)
+ cc_user_log(user, "signal %s to user state %s",
+ cc_user_sigtab[sig], stab[user->state]);
+
+ switch (sig) {
+
+
+ case USER_SIG_PREPARE_OUTGOING:
+ {
+ /*
+ * Here we create a connection for the call we soon will make.
+ * We put this call on the list of orphaned connections,
+ * because we don't know yet, which port will get the
+ * connection. It is assigned, when the user issues the call
+ * to connect.
+ */
+ struct ccconn *conn;
+
+ if (user->state != USER_NULL) {
+ cc_user_err(user, ATMERR_BAD_STATE);
+ goto bad_state;
+ }
+ conn = cc_conn_create(user->cc);
+ if (conn == NULL) {
+ cc_user_err(user, ATMERR_NOMEM);
+ return;
+ }
+ set_state(user, USER_OUT_PREPARING);
+ cc_conn_set_state(conn, CONN_OUT_PREPARING);
+ conn->blli_selector = 1;
+ cc_connect_to_user(conn, user);
+
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+ return;
+ }
+
+
+ case USER_SIG_CONNECT_OUTGOING:
+ {
+ /*
+ * Request to connect that call
+ *
+ * Here we assign the connection to a port.
+ */
+ struct uni_msg *msg = arg;
+ struct atm_connect_outgoing_call *req = uni_msg_rptr(msg,
+ struct atm_connect_outgoing_call *);
+ struct ccdata *priv = user->cc;
+ struct ccport *port;
+ struct ccaddr *addr;
+ struct ccconn *conn = TAILQ_FIRST(&user->connq);
+
+ if (user->state != USER_OUT_PREPARING) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_STATE);
+ goto bad_state;
+ }
+ if (!IE_ISPRESENT(req->called)) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_ARGS);
+ return;
+ }
+ CCASSERT(conn->port == NULL, ("connection still on port"));
+
+ if (TAILQ_EMPTY(&priv->port_list)) {
+ /*
+ * We have no ports - reject
+ */
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_PORT);
+ return;
+ }
+
+ /*
+ * Find the correct port
+ * Routing of outgoing calls goes to the lowest numbered port
+ * with a matching address or, if no address match is found to
+ * the lowest numbered port.
+ */
+ TAILQ_FOREACH(port, &priv->port_list, node_link)
+ TAILQ_FOREACH(addr, &port->addr_list, port_link)
+ if (addr_matches(addr, conn))
+ break;
+
+ if (port == NULL)
+ port = TAILQ_FIRST(&priv->port_list);
+
+ cc_conn_ins_port(conn, port);
+ conn->called = req->called;
+ uni_msg_destroy(msg);
+
+ /*
+ * Now move the state
+ */
+ set_state(user, USER_OUT_WAIT_OK);
+ cc_conn_sig(conn, CONN_SIG_CONNECT_OUTGOING, NULL);
+
+ return;
+ }
+
+
+ case USER_SIG_CONNECT_OUTGOING_ERR:
+ switch (user->state) {
+
+ case USER_OUT_WAIT_OK:
+ set_state(user, USER_OUT_PREPARING);
+ cc_user_err(user, arg2);
+ break;
+
+ case USER_REL_WAIT_CONN:
+ {
+ struct ccconn *conn;
+
+ conn = TAILQ_FIRST(&user->connq);
+ if (conn != NULL) {
+ cc_disconnect_from_user(conn);
+ cc_conn_destroy(conn);
+ }
+
+ cc_user_reset(user);
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+ break;
+ }
+
+ default:
+ goto bad_state;
+ }
+ return;
+
+
+ case USER_SIG_CONNECT_OUTGOING_OK:
+ switch (user->state) {
+
+ case USER_OUT_WAIT_OK:
+ set_state(user, USER_OUT_WAIT_CONF);
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+ break;
+
+ case USER_REL_WAIT_CONN:
+ set_state(user, USER_REL_WAIT_SCONF);
+ break;
+
+ default:
+ goto bad_state;
+ }
+ return;
+
+
+ case USER_SIG_SETUP_CONFIRM:
+ /*
+ * SETUP.confirm from UNI stack.
+ */
+ switch (user->state) {
+
+ case USER_OUT_WAIT_CONF:
+ cc_user_active(user);
+ break;
+
+ case USER_REL_WAIT_SCONF:
+ /* now try to release */
+ set_state(user, USER_REL_WAIT_CONF);
+ cc_conn_sig(TAILQ_FIRST(&user->connq),
+ CONN_SIG_RELEASE, NULL);
+ break;
+
+ default:
+ goto bad_state;
+ }
+ return;
+
+
+ case USER_SIG_PREPARE_INCOMING:
+ {
+ struct uni_msg *msg = arg;
+ struct ccuser *ptr;
+ struct atm_prepare_incoming_call *prep = uni_msg_rptr(msg,
+ struct atm_prepare_incoming_call *);
+
+ if (user->state != USER_NULL) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_STATE);
+ goto bad_state;
+ }
+
+ /*
+ * Check the SAP
+ */
+ if (unisve_check_sap(&prep->sap) != UNISVE_OK) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_SAP);
+ return;
+ }
+
+ /*
+ * Loop through all incoming calls and check whether there
+ * is an overlap in SAP space.
+ */
+ LIST_FOREACH(ptr, &user->cc->user_list, node_link) {
+ if (check_overlap(ptr, &prep->sap)) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_OVERLAP);
+ return;
+ }
+ }
+
+ /*
+ * Save info and set state
+ */
+ user->sap = CCZALLOC(sizeof(struct uni_sap));
+ if (user->sap == NULL) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_NOMEM);
+ return;
+ }
+ *user->sap = prep->sap;
+ user->queue_max = prep->queue_size;
+ user->queue_act = 0;
+ uni_msg_destroy(msg);
+
+ set_state(user, USER_IN_PREPARING);
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+
+ return;
+ }
+
+
+ case USER_SIG_WAIT_ON_INCOMING:
+ if (user->state != USER_IN_PREPARING) {
+ cc_user_err(user, ATMERR_BAD_STATE);
+ goto bad_state;
+ }
+
+ set_state(user, USER_IN_WAITING);
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+ return;
+
+
+ case USER_SIG_SETUP_IND:
+ /*
+ * New connection queued up in the queue. If this is the
+ * first one, inform the application of the arrival.
+ */
+ switch (user->state) {
+
+ case USER_IN_WAITING:
+ do_arrival(user);
+ break;
+
+ case USER_IN_ARRIVED:
+ case USER_IN_WAIT_REJ:
+ case USER_IN_WAIT_ACC:
+ break;
+
+ default:
+ goto bad_state;
+ }
+ return;
+
+
+ case USER_SIG_REJECT_INCOMING:
+ {
+ /*
+ * User rejects call. This is done on the OLD user
+ * (i.e. the one sending the arrival).
+ */
+ struct uni_msg *msg = arg;
+ struct atm_reject_incoming_call *rej = uni_msg_rptr(msg,
+ struct atm_reject_incoming_call *);
+ struct ccconn *conn = TAILQ_FIRST(&user->connq);
+
+ if (user->state != USER_IN_ARRIVED) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_STATE);
+ goto bad_state;
+ }
+ if (user->aborted) {
+ /* connection has disappeared. Send an ok
+ * to the user and lock whether there is another
+ * connection at this endpoint */
+ uni_msg_destroy(msg);
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+
+ set_state(user, USER_IN_WAITING);
+ do_arrival(user);
+ return;
+ }
+ conn->cause[0] = rej->cause;
+ memset(&conn->cause[1], 0, sizeof(conn->cause[1]));
+ uni_msg_destroy(msg);
+
+ set_state(user, USER_IN_WAIT_REJ);
+ cc_conn_sig(conn, CONN_SIG_REJECT, NULL);
+
+ return;
+ }
+
+
+ case USER_SIG_REJECT_OK:
+ if (user->state != USER_IN_WAIT_REJ)
+ goto bad_state;
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+
+ set_state(user, USER_IN_WAITING);
+ do_arrival(user);
+ return;
+
+
+ case USER_SIG_REJECT_ERR:
+ if (user->state != USER_IN_WAIT_REJ)
+ goto bad_state;
+ cc_user_err(user, arg2);
+
+ if (arg == NULL)
+ set_state(user, USER_IN_ARRIVED);
+ else {
+ set_state(user, USER_IN_WAITING);
+ do_arrival(user);
+ }
+ return;
+
+
+ case USER_SIG_ACCEPT_INCOMING:
+ {
+ /*
+ * User accepts call. This is done on the OLD user (i.e. the one
+ * sending the arrival), the message contains a pointer to the
+ * new endpoint.
+ */
+ struct uni_msg *msg = arg;
+ struct atm_accept_incoming_call *acc =
+ uni_msg_rptr(msg, struct atm_accept_incoming_call *);
+ struct ccuser *newep;
+
+ if (user->state != USER_IN_ARRIVED) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_STATE);
+ return;
+ }
+ if (user->aborted) {
+ /* connection has disappeared. Send an error
+ * to the user and lock whether there is another
+ * connection at this endpoint */
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_PREVIOUSLY_ABORTED);
+
+ set_state(user, USER_IN_WAITING);
+ do_arrival(user);
+ return;
+ }
+ acc->newep[sizeof(acc->newep) - 1] = '\0';
+
+ LIST_FOREACH(newep, &user->cc->user_list, node_link)
+ if (strcmp(acc->newep, newep->name) == 0)
+ break;
+ uni_msg_destroy(msg);
+
+ if (newep == NULL) {
+ cc_user_err(user, ATMERR_BAD_ENDPOINT);
+ return;
+ }
+
+ if (newep->state != USER_NULL || newep->accepted != NULL) {
+ cc_user_err(user, ATMERR_BAD_STATE);
+ return;
+ }
+
+ set_state(user, USER_IN_WAIT_ACC);
+ cc_conn_sig(TAILQ_FIRST(&user->connq), CONN_SIG_ACCEPT, newep);
+
+ return;
+ }
+
+
+ case USER_SIG_ACCEPT_OK:
+ if (user->state != USER_IN_WAIT_ACC)
+ goto bad_state;
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+
+ set_state(user, USER_IN_WAITING);
+ do_arrival(user);
+ return;
+
+
+ case USER_SIG_ACCEPT_ERR:
+ if (user->state != USER_IN_WAIT_ACC)
+ goto bad_state;
+ cc_user_err(user, arg2);
+
+ if (arg == NULL) {
+ /* arg used as flag! */
+ set_state(user, USER_IN_ARRIVED);
+ } else {
+ set_state(user, USER_IN_WAITING);
+ do_arrival(user);
+ }
+ return;
+
+
+ case USER_SIG_ACCEPTING:
+ if (user->state != USER_NULL)
+ goto bad_state;
+ set_state(user, USER_IN_ACCEPTING);
+ return;
+
+
+ case USER_SIG_SETUP_COMPL:
+ {
+ struct ccconn *conn = TAILQ_FIRST(&user->connq);
+
+ if (user->state != USER_IN_ACCEPTING)
+ goto bad_state;
+
+ user->state = USER_ACTIVE;
+ if (conn->bearer.cfg == UNI_BEARER_P2P) {
+ struct atm_p2p_call_active *act;
+
+ user->config = USER_P2P;
+ act = CCZALLOC(sizeof(*act));
+ if (act == NULL)
+ return;
+ act->connid = conn->connid;
+ cc_user_send(user, ATMOP_P2P_CALL_ACTIVE,
+ act, sizeof(*act));
+ CCFREE(act);
+ } else {
+ struct atm_p2mp_call_active *act;
+
+ user->config = USER_LEAF;
+ act = CCZALLOC(sizeof(*act));
+ if (act == NULL)
+ return;
+ act->connid = conn->connid;
+ cc_user_send(user, ATMOP_P2MP_CALL_ACTIVE,
+ act, sizeof(*act));
+ CCFREE(act);
+ }
+ return;
+ }
+
+
+ case USER_SIG_CALL_RELEASE:
+ {
+ struct uni_msg *msg = arg;
+ struct atm_call_release *api = uni_msg_rptr(msg,
+ struct atm_call_release *);
+ struct ccconn *conn;
+
+ conn = TAILQ_FIRST(&user->connq);
+ switch (user->state) {
+
+ case USER_OUT_WAIT_OK: /* U2/A3 */
+ /* wait for CONN_OK first */
+ conn->cause[0] = api->cause[0];
+ conn->cause[1] = api->cause[1];
+ set_state(user, USER_REL_WAIT_CONN);
+ break;
+
+ case USER_OUT_WAIT_CONF: /* U3/A3 */
+ /* wait for SETUP.confirm first */
+ conn->cause[0] = api->cause[0];
+ conn->cause[1] = api->cause[1];
+ set_state(user, USER_REL_WAIT_SCONF);
+ break;
+
+ case USER_IN_ACCEPTING: /* U11/A7 */
+ conn->cause[0] = api->cause[0];
+ conn->cause[1] = api->cause[1];
+ set_state(user, USER_REL_WAIT_SCOMP);
+ cc_conn_sig(conn, CONN_SIG_RELEASE, NULL);
+ break;
+
+ case USER_ACTIVE: /* U4/A8,A9,A10 */
+ conn->cause[0] = api->cause[0];
+ conn->cause[1] = api->cause[1];
+ set_state(user, USER_REL_WAIT);
+ cc_conn_sig(conn, CONN_SIG_RELEASE, NULL);
+ break;
+
+ default:
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_STATE);
+ goto bad_state;
+ }
+ uni_msg_destroy(msg);
+ return;
+ }
+
+
+ case USER_SIG_RELEASE_CONFIRM:
+ {
+ struct atm_call_release *ind;
+
+ switch (user->state) {
+
+ case USER_OUT_WAIT_CONF: /* U3/A3 */
+ case USER_ACTIVE: /* U4/A8,A9,A10 */
+ cc_user_reset(user);
+ break;
+
+ case USER_REL_WAIT: /* U5 /A8,A9,A10 */
+ case USER_REL_WAIT_SCOMP: /* U12/A7 */
+ case USER_REL_WAIT_SCONF: /* U13/A3 */
+ case USER_REL_WAIT_CONF: /* U14/A3 */
+ cc_user_reset(user);
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+ return;
+
+ case USER_IN_ACCEPTING: /* U11/A7 */
+ cc_user_reset(user);
+ break;
+
+ default:
+ goto bad_state;
+ }
+
+ ind = CCZALLOC(sizeof(*ind));
+ if (ind == NULL)
+ return;
+ memcpy(ind->cause, user->cause, sizeof(ind->cause));
+ cc_user_send(user, ATMOP_CALL_RELEASE, ind, sizeof(*ind));
+ CCFREE(ind);
+ return;
+ }
+
+
+ case USER_SIG_RELEASE_ERR:
+ switch (user->state) {
+
+ case USER_REL_WAIT: /* U5/A8,A9,A10 */
+ set_state(user, USER_ACTIVE);
+ cc_user_err(user, ATM_MKUNIERR(arg2));
+ break;
+
+ case USER_REL_WAIT_CONF: /* U14/A3 */
+ cc_user_err(user, ATM_MKUNIERR(arg2));
+ cc_user_active(user);
+ break;
+
+ case USER_REL_WAIT_SCOMP: /* U12/A7 */
+ set_state(user, USER_IN_ACCEPTING);
+ cc_user_err(user, ATM_MKUNIERR(arg2));
+ break;
+
+ default:
+ goto bad_state;
+ }
+ return;
+
+
+ case USER_SIG_ADD_PARTY:
+ {
+ struct uni_msg *msg = arg;
+ struct atm_add_party *add = uni_msg_rptr(msg,
+ struct atm_add_party *);
+ struct ccconn *conn;
+
+ if (user->state != USER_ACTIVE || user->config != USER_ROOT) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_STATE);
+ return;
+ }
+
+ if (add->leaf_ident == 0 || add->leaf_ident >= 32786) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_LEAF_IDENT);
+ return;
+ }
+
+ conn = TAILQ_FIRST(&user->connq);
+ conn->called = add->called;
+
+ cc_conn_sig(conn, CONN_SIG_ADD_PARTY,
+ (void *)(uintptr_t)add->leaf_ident);
+
+ uni_msg_destroy(msg);
+ return;
+ }
+
+
+ case USER_SIG_ADD_PARTY_ERR:
+ if (user->state != USER_ACTIVE)
+ goto bad_state;
+ cc_user_err(user, arg2);
+ return;
+
+
+ case USER_SIG_ADD_PARTY_OK:
+ if (user->state != USER_ACTIVE)
+ goto bad_state;
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+ return;
+
+
+ case USER_SIG_ADD_PARTY_ACK:
+ {
+ u_int leaf_ident = arg2;
+ struct atm_add_party_success *succ;
+
+ if (user->state != USER_ACTIVE)
+ goto bad_state;
+
+ succ = CCZALLOC(sizeof(*succ));
+ if (succ == NULL)
+ return;
+
+ succ->leaf_ident = leaf_ident;
+ cc_user_send(user, ATMOP_ADD_PARTY_SUCCESS,
+ succ, sizeof(*succ));
+
+ CCFREE(succ);
+ return;
+ }
+
+
+ case USER_SIG_ADD_PARTY_REJ:
+ {
+ u_int leaf_ident = arg2;
+ struct atm_add_party_reject *reject;
+
+ if (user->state != USER_ACTIVE)
+ goto bad_state;
+
+ reject = CCZALLOC(sizeof(*reject));
+ if (reject == NULL)
+ return;
+
+ reject->leaf_ident = leaf_ident;
+ reject->cause = user->cause[0];
+ cc_user_send(user, ATMOP_ADD_PARTY_REJECT,
+ reject, sizeof(*reject));
+
+ CCFREE(reject);
+ return;
+ }
+
+
+ case USER_SIG_DROP_PARTY:
+ {
+ struct uni_msg *msg = arg;
+ struct atm_drop_party *drop = uni_msg_rptr(msg,
+ struct atm_drop_party *);
+ struct ccconn *conn;
+
+ if (user->state != USER_ACTIVE || user->config != USER_ROOT) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_STATE);
+ return;
+ }
+
+ if (drop->leaf_ident >= 32786) {
+ uni_msg_destroy(msg);
+ cc_user_err(user, ATMERR_BAD_LEAF_IDENT);
+ return;
+ }
+
+ conn = TAILQ_FIRST(&user->connq);
+ conn->cause[0] = drop->cause;
+ memset(&conn->cause[1], 0, sizeof(conn->cause[1]));
+
+ cc_conn_sig(conn, CONN_SIG_DROP_PARTY,
+ (void *)(uintptr_t)drop->leaf_ident);
+
+ uni_msg_destroy(msg);
+ return;
+ }
+
+
+ case USER_SIG_DROP_PARTY_ERR:
+ if (user->state != USER_ACTIVE)
+ goto bad_state;
+ cc_user_err(user, arg2);
+ return;
+
+
+ case USER_SIG_DROP_PARTY_OK:
+ if (user->state != USER_ACTIVE)
+ goto bad_state;
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+ return;
+
+
+ case USER_SIG_DROP_PARTY_IND:
+ {
+ u_int leaf_ident = arg2;
+ struct atm_drop_party *drop;
+
+ if (user->state != USER_ACTIVE)
+ goto bad_state;
+
+ drop = CCZALLOC(sizeof(*drop));
+ if (drop == NULL)
+ return;
+
+ drop->leaf_ident = leaf_ident;
+ drop->cause = user->cause[0];
+ cc_user_send(user, ATMOP_DROP_PARTY, drop, sizeof(*drop));
+
+ CCFREE(drop);
+ return;
+ }
+
+
+ case USER_SIG_QUERY_ATTR:
+ {
+ struct uni_msg *msg = arg;
+ struct atm_query_connection_attributes *req;
+ struct ccconn *conn;
+
+ if (user->aborted) {
+ cc_user_err(user, ATMERR_PREVIOUSLY_ABORTED);
+ uni_msg_destroy(msg);
+ return;
+ }
+ conn = cc_query_check(user);
+ if (conn == NULL) {
+ cc_user_err(user, ATMERR_BAD_STATE);
+ uni_msg_destroy(msg);
+ return;
+ }
+ req = uni_msg_rptr(msg,
+ struct atm_query_connection_attributes *);
+ cc_attr_query(user, conn, &req->attr, 1);
+ uni_msg_destroy(msg);
+ return;
+ }
+
+ case USER_SIG_QUERY_ATTR_X:
+ {
+ struct uni_msg *msg = arg;
+ struct atm_query_connection_attributes_x *req;
+ struct ccconn *conn;
+
+ conn = cc_query_check(user);
+ if (conn == NULL) {
+ cc_user_err(user, ATMERR_BAD_STATE);
+ uni_msg_destroy(msg);
+ return;
+ }
+ req = uni_msg_rptr(msg,
+ struct atm_query_connection_attributes_x *);
+ cc_attr_query(user, conn, req->attr, req->count);
+ uni_msg_destroy(msg);
+ return;
+ }
+
+ case USER_SIG_SET_ATTR:
+ {
+ struct uni_msg *msg = arg;
+ struct atm_set_connection_attributes *req;
+ struct ccconn *conn;
+
+ if (user->aborted) {
+ cc_user_err(user, ATMERR_PREVIOUSLY_ABORTED);
+ uni_msg_destroy(msg);
+ return;
+ }
+ conn = cc_set_check(user);
+ if (conn == NULL) {
+ cc_user_err(user, ATMERR_BAD_STATE);
+ uni_msg_destroy(msg);
+ return;
+ }
+ req = uni_msg_rptr(msg, struct atm_set_connection_attributes *);
+ cc_attr_set(user, conn, &req->attr, 1, (u_char *)(req + 1),
+ uni_msg_len(msg) - sizeof(*req));
+ uni_msg_destroy(msg);
+ return;
+ }
+
+ case USER_SIG_SET_ATTR_X:
+ {
+ struct uni_msg *msg = arg;
+ struct atm_set_connection_attributes_x *req;
+ struct ccconn *conn;
+
+ conn = cc_set_check(user);
+ if (conn == NULL) {
+ cc_user_err(user, ATMERR_BAD_STATE);
+ uni_msg_destroy(msg);
+ return;
+ }
+ req = uni_msg_rptr(msg,
+ struct atm_set_connection_attributes_x *);
+ cc_attr_set(user, conn, req->attr, req->count,
+ (u_char *)req->attr + req->count * sizeof(req->attr[0]),
+ uni_msg_len(msg) -
+ offsetof(struct atm_set_connection_attributes_x, attr) -
+ req->count * sizeof(req->attr[0]));
+ uni_msg_destroy(msg);
+ return;
+ }
+
+ case USER_SIG_QUERY_STATE:
+ {
+ struct atm_epstate state;
+
+ strcpy(state.name, user->name);
+ switch (user->state) {
+
+ case USER_NULL:
+ if (user->accepted != NULL)
+ state.state = ATM_A7;
+ else
+ state.state = ATM_A1;
+ break;
+
+ case USER_OUT_PREPARING:
+ state.state = ATM_A2;
+ break;
+
+ case USER_OUT_WAIT_OK:
+ case USER_OUT_WAIT_CONF:
+ case USER_REL_WAIT_SCONF:
+ case USER_REL_WAIT_CONF:
+ case USER_REL_WAIT_CONN:
+ state.state = ATM_A3;
+ break;
+
+ case USER_ACTIVE:
+ case USER_REL_WAIT:
+ switch (user->config) {
+
+ case USER_P2P:
+ state.state = ATM_A8;
+ break;
+
+ case USER_ROOT:
+ state.state = ATM_A9;
+ break;
+
+ case USER_LEAF:
+ state.state = ATM_A10;
+ break;
+ }
+ break;
+
+ case USER_IN_PREPARING:
+ state.state = ATM_A4;
+ break;
+
+ case USER_IN_WAITING:
+ state.state = ATM_A5;
+ break;
+
+ case USER_IN_ARRIVED:
+ case USER_IN_WAIT_REJ:
+ case USER_IN_WAIT_ACC:
+ state.state = ATM_A6;
+ break;
+
+ case USER_IN_ACCEPTING:
+ case USER_REL_WAIT_SCOMP:
+ state.state = ATM_A7;
+ break;
+ }
+ cc_user_ok(user, ATMRESP_STATE, &state, sizeof(state));
+ return;
+ }
+
+ case USER_SIG_GET_LOCAL_PORT_INFO:
+ {
+ struct uni_msg *msg = arg;
+ struct atm_port_list *list;
+ size_t list_len;
+
+ list = cc_get_local_port_info(user->cc,
+ uni_msg_rptr(msg, struct atm_get_local_port_info *)->port,
+ &list_len);
+ uni_msg_destroy(msg);
+ if (list == NULL) {
+ cc_user_err(user, ATMERR_NOMEM);
+ return;
+ }
+ cc_user_ok(user, ATMRESP_PORTS, list, list_len);
+ CCFREE(list);
+ return;
+ }
+
+ case USER_SIG_ABORT_CONNECTION:
+ {
+ struct uni_msg *msg = arg;
+ struct atm_abort_connection *abo = uni_msg_rptr(msg,
+ struct atm_abort_connection *);
+
+ cc_user_abort(user, &abo->cause);
+ uni_msg_destroy(msg);
+ cc_user_ok(user, ATMRESP_NONE, NULL, 0);
+ return;
+ }
+
+ }
+ if (user->cc->log & CCLOG_USER_SIG)
+ cc_user_log(user, "bad signal=%u in state=%u",
+ sig, user->state);
+ return;
+
+ bad_state:
+ if (user->cc->log & CCLOG_USER_SIG)
+ cc_user_log(user, "bad state=%u for signal=%u",
+ user->state, sig);
+ return;
+}
diff --git a/sys/contrib/ngatm/netnatm/api/ccatm.h b/sys/contrib/ngatm/netnatm/api/ccatm.h
new file mode 100644
index 0000000..1b4a179
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/ccatm.h
@@ -0,0 +1,154 @@
+/*
+ * Copyright (c) 2003-2004
+ * Hartmut Brandt
+ * All rights reserved.
+ *
+ * Author: Harti Brandt <harti@freebsd.org>
+ *
+ * Redistribution of this software and documentation and use in source and
+ * binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ *
+ * 1. Redistributions of source code or documentation must retain the above
+ * copyright notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHOR
+ * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHOR OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/api/ccatm.h,v 1.1 2004/07/08 08:21:58 brandt Exp $
+ *
+ * ATM API as defined per af-saa-0108
+ *
+ * Interface to the supporting code.
+ */
+
+#ifndef _API_CCATM_H_
+#define _API_CCATM_H_
+
+struct ccuser;
+struct ccconn;
+struct ccport;
+struct ccdata;
+
+struct cc_funcs {
+ /* send signal to API user */
+ void (*send_user)(struct ccuser *, void *, u_int, void *, size_t);
+
+ /* respond API user */
+ void (*respond_user)(struct ccuser *, void *, int, u_int,
+ void *, size_t);
+
+ /* send signal to uni for connection */
+ void (*send_uni)(struct ccconn *, void *, u_int, u_int,
+ struct uni_msg *);
+
+ /* send global signal to uni */
+ void (*send_uni_glob)(struct ccport *, void *, u_int, u_int,
+ struct uni_msg *);
+
+ /* log a message */
+ void (*log)(const char *, ...);
+};
+
+enum {
+ CCLOG_USER_STATE = 0x00000001,
+ CCLOG_USER_INST = 0x00000002,
+ CCLOG_USER_SIG = 0x00000004,
+ CCLOG_CONN_STATE = 0x00000010,
+ CCLOG_CONN_INST = 0x00000020,
+ CCLOG_CONN_SIG = 0x00000040,
+ CCLOG_PARTY_STATE = 0x00000100,
+ CCLOG_PARTY_INST = 0x00000200,
+ CCLOG_PARTY_SIG = 0x00000400,
+ CCLOG_SIGS = 0x00001000,
+};
+
+/* instance handling */
+struct ccdata *cc_create(const struct cc_funcs *);
+void cc_destroy(struct ccdata *);
+void cc_reset(struct ccdata *);
+
+/* input a response from the UNI layer to CC */
+int cc_uni_response(struct ccport *, u_int cookie, u_int reason, u_int state);
+
+/* Signal from UNI on this port */
+int cc_uni_signal(struct ccport *, u_int cookie, u_int sig, struct uni_msg *);
+
+/* retrieve addresses */
+int cc_get_addrs(struct ccdata *, u_int, struct uni_addr **, u_int **, u_int *);
+
+/* dump state */
+typedef int (*cc_dump_f)(struct ccdata *, void *, const char *);
+int cc_dump(struct ccdata *, size_t, cc_dump_f, void *);
+
+/* start/stop port */
+int cc_port_stop(struct ccdata *, u_int);
+int cc_port_start(struct ccdata *, u_int);
+
+/* is port running? */
+int cc_port_isrunning(struct ccdata *, u_int, int *);
+
+/* return port number */
+u_int cc_port_no(struct ccport *);
+
+/* Clear address and prefix information from the named port. */
+int cc_port_clear(struct ccdata *, u_int);
+
+/* Address registered. */
+int cc_addr_register(struct ccdata *, u_int, const struct uni_addr *);
+
+/* Address unregistered. */
+int cc_addr_unregister(struct ccdata *, u_int, const struct uni_addr *);
+
+/* get port info */
+int cc_port_get_param(struct ccdata *, u_int, struct atm_port_info *);
+
+/* set port info */
+int cc_port_set_param(struct ccdata *, const struct atm_port_info *);
+
+/* get port list */
+int cc_port_getlist(struct ccdata *, u_int *, u_int **);
+
+/* create a port */
+struct ccport *cc_port_create(struct ccdata *, void *, u_int);
+
+/* destroy a port */
+void cc_port_destroy(struct ccport *, int);
+
+/* New endpoint created */
+struct ccuser *cc_user_create(struct ccdata *, void *, const char *);
+
+/* destroy user endpoint */
+void cc_user_destroy(struct ccuser *);
+
+/* signal from user */
+int cc_user_signal(struct ccuser *, u_int, struct uni_msg *);
+
+/* Management is given up on this node. */
+void cc_unmanage(struct ccdata *);
+
+/* handle all queued signals */
+void cc_work(struct ccdata *);
+
+/* set/get logging flags */
+void cc_set_log(struct ccdata *, u_int);
+u_int cc_get_log(const struct ccdata *);
+
+/* get extended status */
+int cc_get_extended_status(const struct ccdata *, struct atm_exstatus *,
+ struct atm_exstatus_ep **, struct atm_exstatus_port **,
+ struct atm_exstatus_conn **, struct atm_exstatus_party **);
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/api/ccpriv.h b/sys/contrib/ngatm/netnatm/api/ccpriv.h
new file mode 100644
index 0000000..c0f3075
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/ccpriv.h
@@ -0,0 +1,562 @@
+/*
+ * Copyright (c) 2003-2004
+ * Hartmut Brandt
+ * All rights reserved.
+ *
+ * Author: Harti Brandt <harti@freebsd.org>
+ *
+ * Redistribution of this software and documentation and use in source and
+ * binary forms, with or without modification, are permitted provided that
+ * the following conditions are met:
+ *
+ * 1. Redistributions of source code or documentation must retain the above
+ * copyright notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE AND DOCUMENTATION IS PROVIDED BY THE AUTHOR
+ * AND ITS CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
+ * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
+ * THE AUTHOR OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA,
+ * OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
+ * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
+ * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ * EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/api/ccpriv.h,v 1.2 2005/05/23 11:49:17 brandt_h Exp $
+ *
+ * ATM API as defined per af-saa-0108
+ *
+ * Private declarations.
+ */
+#ifdef _KERNEL
+#ifdef __FreeBSD__
+#include <netgraph/atm/ccatm/ng_ccatm_cust.h>
+#endif
+#else /* !_KERNEL */
+#include "cccust.h"
+#endif
+
+struct ccuser;
+struct ccconn;
+struct ccaddr;
+struct ccport;
+struct ccdata;
+struct ccsig;
+struct ccparty;
+
+LIST_HEAD(ccuser_list, ccuser);
+LIST_HEAD(ccconn_list, ccconn);
+TAILQ_HEAD(ccaddr_list, ccaddr);
+TAILQ_HEAD(ccport_list, ccport);
+TAILQ_HEAD(ccsig_list, ccsig);
+LIST_HEAD(ccparty_list, ccparty);
+
+/*
+ * Private node data.
+ */
+struct ccdata {
+ struct ccuser_list user_list; /* instance list */
+ struct ccport_list port_list; /* list of ports */
+ struct ccconn_list orphaned_conns; /* list of connections */
+ struct ccsig_list sigs; /* current signals */
+ struct ccsig_list def_sigs; /* deferred signals */
+ struct ccsig_list free_sigs; /* free signals */
+
+ const struct cc_funcs *funcs;
+ uint32_t cookie; /* cookie generator */
+ u_int log; /* logging flags */
+};
+
+/* retrieve info on local ports */
+struct atm_port_list *cc_get_local_port_info(struct ccdata *,
+ u_int, size_t *);
+
+/* log */
+#ifdef CCATM_DEBUG
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_log(CC, FMT, ARGS...) do { \
+ (CC)->funcs->log("%s (data=%p): " FMT, __FUNCTION__, \
+ (CC) , ## ARGS); \
+ } while (0)
+#else
+#define cc_log(CC, FMT, ...) do { \
+ (CC)->funcs->log("%s (data=%p): " FMT, __func__, \
+ (CC), __VA_ARGS__); \
+ } while (0)
+#endif
+#else
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_log(CC, FMT, ARGS...) do { } while (0)
+#else
+#define cc_log(CC, FMT, ...) do { } while (0)
+#endif
+#endif
+
+/*
+ * structure to remember cookies for outstanding requests
+ * we also remember the request itself but don't use it.
+ */
+struct ccreq {
+ TAILQ_ENTRY(ccreq) link;
+ uint32_t cookie;
+ uint32_t req;
+ struct ccconn *conn;
+};
+TAILQ_HEAD(ccreq_list, ccreq);
+
+/*
+ * Port data. Each port has one UNI stack below.
+ * The port number is in param.port. The number is assigned when the
+ * hook to the uni is connected. This hook has the name 'uni<port>'.
+ */
+struct ccport {
+ void *uarg; /* hook to UNI protocol */
+ struct ccdata *cc; /* back pointer to node */
+ enum {
+ CCPORT_STOPPED, /* halted */
+ CCPORT_RUNNING, /* ok */
+ } admin; /* admin status */
+ struct ccconn_list conn_list; /* list of connections */
+ struct ccaddr_list addr_list; /* list of network addresses */
+ struct atm_port_info param; /* parameters */
+
+ /* list of outstanding requests */
+ struct ccreq_list cookies;
+
+ TAILQ_ENTRY(ccport) node_link;
+};
+
+#ifdef CCATM_DEBUG
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_port_log(P, FMT, ARGS...) do { \
+ (P)->cc->funcs->log("%s (port=%p/%u): " FMT, __FUNCTION__, \
+ (P), (P)->param.port , ## ARGS); \
+ } while (0)
+#else
+#define cc_port_log(P, FMT, ...) do { \
+ (P)->cc->funcs->log("%s (port=%p/%u): " FMT, __func__, \
+ (P), (P)->param.port, __VA_ARGS__); \
+ } while (0)
+#endif
+#else
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_port_log(P, FMT, ARGS...) do { } while (0)
+#else
+#define cc_port_log(P, FMT, ...) do { } while (0)
+#endif
+#endif
+
+#define CONN_STATES \
+ DEF(CONN_NULL) /* C0 */ \
+ DEF(CONN_OUT_PREPARING) /* C1 */ \
+ DEF(CONN_OUT_WAIT_CREATE) /* C2 */ \
+ DEF(CONN_OUT_WAIT_OK) /* C3 */ \
+ DEF(CONN_OUT_WAIT_CONF) /* C4 */ \
+ \
+ DEF(CONN_ACTIVE) /* C5 */ \
+ \
+ DEF(CONN_IN_PREPARING) /* C10 */ \
+ DEF(CONN_IN_WAITING) /* C21 */ \
+ DEF(CONN_IN_ARRIVED) /* C11 */ \
+ DEF(CONN_IN_WAIT_ACCEPT_OK) /* C12 */ \
+ DEF(CONN_IN_WAIT_COMPL) /* C13 */ \
+ \
+ DEF(CONN_REJ_WAIT_OK) /* C14 */ \
+ DEF(CONN_REL_IN_WAIT_OK) /* C15 */ \
+ DEF(CONN_REL_WAIT_OK) /* C20 */ \
+ \
+ DEF(CONN_AB_WAIT_REQ_OK) /* C33 */ \
+ DEF(CONN_AB_WAIT_RESP_OK) /* C34 */ \
+ DEF(CONN_AB_FLUSH_IND) /* C35 */ \
+ DEF(CONN_OUT_WAIT_DESTROY) /* C37 */
+
+enum conn_state {
+#define DEF(N) N,
+ CONN_STATES
+#undef DEF
+};
+
+#define CONN_SIGS \
+ DEF(CONNECT_OUTGOING) /* U */ \
+ DEF(ARRIVAL) /* U */ \
+ DEF(RELEASE) /* U */ \
+ DEF(REJECT) /* U */ \
+ DEF(ACCEPT) /* U newuser */ \
+ DEF(ADD_PARTY) /* U ident */ \
+ DEF(DROP_PARTY) /* U ident */ \
+ DEF(USER_ABORT) /* U */ \
+ \
+ DEF(CREATED) /* P msg */ \
+ DEF(DESTROYED) /* P */ \
+ DEF(SETUP_CONFIRM) /* P msg */ \
+ DEF(SETUP_IND) /* P msg */ \
+ DEF(SETUP_COMPL) /* P msg */ \
+ DEF(PROC_IND) /* P msg */ \
+ DEF(ALERTING_IND) /* P msg */ \
+ DEF(REL_CONF) /* P msg */ \
+ DEF(REL_IND) /* P msg */ \
+ DEF(PARTY_CREATED) /* P msg */ \
+ DEF(PARTY_DESTROYED) /* P msg */ \
+ DEF(PARTY_ALERTING_IND) /* P msg */ \
+ DEF(PARTY_ADD_ACK_IND) /* P msg */ \
+ DEF(PARTY_ADD_REJ_IND) /* P msg */ \
+ DEF(DROP_PARTY_IND) /* P msg */ \
+ DEF(DROP_PARTY_ACK_IND) /* P msg */ \
+ \
+ DEF(OK) /* P msg */ \
+ DEF(ERROR) /* P msg */
+
+enum conn_sig {
+#define DEF(NAME) CONN_SIG_##NAME,
+CONN_SIGS
+#undef DEF
+};
+extern const char *const cc_conn_sigtab[];
+
+/*
+ * This describes a connection and must be in sync with the UNI
+ * stack.
+ */
+struct ccconn {
+ enum conn_state state; /* API state of the connection */
+ struct ccdata *cc; /* owner node */
+ struct ccport *port; /* the port we belong to */
+ struct ccuser *user; /* user instance we belong to */
+ TAILQ_ENTRY(ccconn) connq_link; /* queue of the owner */
+ LIST_ENTRY(ccconn) port_link; /* link in list of port */
+ struct uni_cref cref;
+ uint8_t reason;
+ struct ccuser *acceptor;
+
+ /* attributes */
+ uint32_t blli_selector;
+ struct uni_ie_blli blli[UNI_NUM_IE_BLLI];
+
+ struct uni_ie_bearer bearer;
+ struct uni_ie_traffic traffic;
+ struct uni_ie_qos qos;
+ struct uni_ie_exqos exqos;
+ struct uni_ie_called called;
+ struct uni_ie_calledsub calledsub;
+ struct uni_ie_aal aal;
+ struct uni_ie_epref epref;
+ struct uni_ie_conned conned;
+ struct uni_ie_connedsub connedsub;
+ struct uni_ie_eetd eetd;
+ struct uni_ie_abrsetup abrsetup;
+ struct uni_ie_abradd abradd;
+ struct uni_ie_mdcr mdcr;
+
+ struct uni_ie_calling calling;
+ struct uni_ie_callingsub callingsub;
+ struct uni_ie_connid connid;
+ struct uni_ie_tns tns[UNI_NUM_IE_TNS];
+ struct uni_ie_atraffic atraffic;
+ struct uni_ie_mintraffic mintraffic;
+ struct uni_ie_cscope cscope;
+ struct uni_ie_bhli bhli;
+
+ /* bit mask of written attributes in A6 */
+ u_int dirty_attr;
+
+ struct uni_ie_cause cause[2];
+
+ struct ccparty_list parties;
+};
+
+/* dirty attribute mask values */
+enum {
+ CCDIRTY_AAL = 0x0001,
+ CCDIRTY_BLLI = 0x0002,
+ CCDIRTY_CONNID = 0x0004,
+ CCDIRTY_NOTIFY = 0x0008, /* XXX */
+ CCDIRTY_EETD = 0x0010,
+ CCDIRTY_GIT = 0x0020, /* XXX */
+ CCDIRTY_UU = 0x0040, /* XXX */
+ CCDIRTY_TRAFFIC = 0x0080,
+ CCDIRTY_EXQOS = 0x0100,
+ CCDIRTY_ABRSETUP = 0x0200,
+ CCDIRTY_ABRADD = 0x0400,
+};
+
+/* set conn to new state */
+void cc_conn_set_state(struct ccconn *, enum conn_state);
+
+/* return string for state */
+const char *cc_conn_state2str(u_int);
+
+/* connect connection to user */
+void cc_connect_to_user(struct ccconn *, struct ccuser *);
+
+/* disconnect from the user */
+void cc_disconnect_from_user(struct ccconn *);
+
+/* abort the connection */
+void cc_conn_abort(struct ccconn *, int);
+
+/* destroy a connection */
+void cc_conn_destroy(struct ccconn *);
+
+/* create a connection */
+struct ccconn *cc_conn_create(struct ccdata *);
+
+/* assign to port */
+void cc_conn_ins_port(struct ccconn *, struct ccport *);
+
+/* remove from port */
+void cc_conn_rem_port(struct ccconn *);
+
+/* dispatch a connection to a user or reject it */
+void cc_conn_dispatch(struct ccconn *);
+
+/* disconnect from acceptor */
+void cc_conn_reset_acceptor(struct ccconn *);
+
+/* log on a connection */
+#ifdef CCATM_DEBUG
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_conn_log(C, FMT, ARGS...) do { \
+ (C)->cc->funcs->log("%s (conn=%p): " FMT, __FUNCTION__, \
+ (C) , ## ARGS); \
+ } while (0)
+#else
+#define cc_conn_log(C, FMT, ...) do { \
+ (C)->cc->funcs->log("%s (conn=%p): " FMT, __func__, \
+ (C), __VA_ARGS__); \
+ } while (0)
+#endif
+#else
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_conn_log(C, FMT, ARGS...) do { } while (0)
+#else
+#define cc_conn_log(C, FMT, ...) do { } while (0)
+#endif
+#endif
+
+/* handle signal to connection */
+void cc_conn_sig_handle(struct ccconn *, enum conn_sig, void *arg, u_int iarg);
+
+/*
+ * Mp connection parties
+ */
+#define PARTY_STATES \
+ DEF(NULL) /* 0 created */ \
+ DEF(ACTIVE) /* 1 active */ \
+ DEF(ADD_WAIT_CREATE) /* 2 wait for PARTY_CREATE */ \
+ DEF(ADD_WAIT_OK) /* 3 wait for OK for ADD.request */ \
+ DEF(ADD_WAIT_ACK) /* 4 wait for ADD.ack/rej */ \
+ DEF(DROP_WAIT_OK) /* 5 wait for OK for DROP.request */ \
+ DEF(DROP_WAIT_ACK) /* 6 wait for DROP.ack */ \
+ DEF(WAIT_DESTROY) /* 7 wait for destroy */ \
+ DEF(WAIT_SETUP_COMPL) /* 8 wait for setup.complete */ \
+ DEF(WAIT_DROP_ACK_OK) /* 9 wait for OK for DROP_ACK.request */\
+ DEF(WAIT_SETUP_CONF) /* 10 wait for setup.confirm */ \
+ DEF(ADD_DROP_WAIT_OK) /* 11 wait for ok to DROP.request */ \
+ DEF(ADD_DROPACK_WAIT_OK)/* 12 wait for ok to DROP_ACK.req */
+
+enum party_state {
+#define DEF(N) PARTY_##N,
+PARTY_STATES
+#undef DEF
+};
+
+struct ccparty {
+ struct ccconn *conn; /* owner */
+ LIST_ENTRY(ccparty) link;
+ enum party_state state;
+ struct uni_ie_called called;
+ struct uni_ie_epref epref;
+};
+
+/* set party to new state */
+void cc_party_set_state(struct ccparty *, enum party_state);
+
+/* return string for state */
+const char *cc_party_state2str(u_int);
+
+/* create new party */
+struct ccparty *cc_party_create(struct ccconn *, u_int ident, u_int flag);
+
+/* log on a party */
+#ifdef CCATM_DEBUG
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_party_log(P, FMT, ARGS...) do { \
+ (P)->conn->cc->funcs->log("%s (conn=%p, party=%p): " FMT, \
+ __FUNCTION__, (P)->conn, (P) , ## ARGS); \
+ } while (0)
+#else
+#define cc_party_log(P, FMT, ...) do { \
+ (P)->conn->cc->funcs->log("%s (conn=%p, party=%p): " FMT, \
+ __func__, (P)->conn, (P), __VA_ARGS__); \
+ } while (0)
+#endif
+#else
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_party_log(P, FMT, ARGS...) do { } while (0)
+#else
+#define cc_party_log(P, FMT, ...) do { } while (0)
+#endif
+#endif
+
+/*
+ * This is kind of a user socket, i.e. the entity managed towards the
+ * upper layer.
+ */
+#define USER_STATES \
+ DEF(USER_NULL) /* U0 none */ \
+ DEF(USER_OUT_PREPARING) /* U1 process set/query requests */ \
+ DEF(USER_OUT_WAIT_OK) /* U2 wait for OK to setup */ \
+ DEF(USER_OUT_WAIT_CONF) /* U3 wait for SETUP.confirm */ \
+ DEF(USER_ACTIVE) /* U4 A8-9-10/U10 */ \
+ DEF(USER_REL_WAIT) /* U5 wait for release to compl */ \
+ DEF(USER_IN_PREPARING) /* U6 set SAP */ \
+ DEF(USER_IN_WAITING) /* U7 wait and dispatch */ \
+ DEF(USER_IN_ARRIVED) /* U8 waiting for rej/acc */ \
+ DEF(USER_IN_WAIT_REJ) /* U9 wait for rejecting */ \
+ DEF(USER_IN_WAIT_ACC) /* U10 wait for accepting */ \
+ DEF(USER_IN_ACCEPTING) /* U11 wait for SETUP_complete */ \
+ DEF(USER_REL_WAIT_SCOMP)/* U12 wait for SETUP_complete */ \
+ DEF(USER_REL_WAIT_SCONF)/* U13 wait for SETUP.confirm */ \
+ DEF(USER_REL_WAIT_CONF) /* U14 wait for confirm */ \
+ DEF(USER_REL_WAIT_CONN) /* U15 wait for CONN_OK */
+
+enum user_state {
+#define DEF(N) N,
+USER_STATES
+#undef DEF
+};
+
+#define USER_SIGS \
+ DEF(PREPARE_OUTGOING) /* U */ \
+ DEF(CONNECT_OUTGOING) /* U msg */ \
+ DEF(PREPARE_INCOMING) /* U msg */ \
+ DEF(WAIT_ON_INCOMING) /* U msg */ \
+ DEF(REJECT_INCOMING) /* U msg */ \
+ DEF(ACCEPT_INCOMING) /* U msg */ \
+ DEF(CALL_RELEASE) /* U msg */ \
+ DEF(ADD_PARTY) /* U msg */ \
+ DEF(DROP_PARTY) /* U msg */ \
+ DEF(QUERY_ATTR) /* U msg */ \
+ DEF(QUERY_ATTR_X) /* U msg */ \
+ DEF(SET_ATTR) /* U msg */ \
+ DEF(SET_ATTR_X) /* U msg */ \
+ DEF(QUERY_STATE) /* U */ \
+ DEF(GET_LOCAL_PORT_INFO) /* U msg */ \
+ DEF(ABORT_CONNECTION) /* U msg */ \
+ \
+ DEF(CONNECT_OUTGOING_OK) /* */ \
+ DEF(CONNECT_OUTGOING_ERR) /* reason */ \
+ DEF(SETUP_CONFIRM) /* */ \
+ DEF(SETUP_IND) /* */ \
+ DEF(REJECT_OK) /* */ \
+ DEF(REJECT_ERR) /* reason */ \
+ DEF(ACCEPT_OK) /* */ \
+ DEF(ACCEPT_ERR) /* reason */ \
+ DEF(ACCEPTING) /* */ \
+ DEF(SETUP_COMPL) /* */ \
+ DEF(RELEASE_CONFIRM) /* */ \
+ DEF(RELEASE_ERR) /* reason */ \
+ DEF(ADD_PARTY_ERR) /* reason */ \
+ DEF(ADD_PARTY_OK) /* */ \
+ DEF(ADD_PARTY_ACK) /* leaf-ident */ \
+ DEF(ADD_PARTY_REJ) /* leaf-ident */ \
+ DEF(DROP_PARTY_ERR) /* reason */ \
+ DEF(DROP_PARTY_OK) /* */ \
+ DEF(DROP_PARTY_IND) /* leaf-ident */ \
+
+
+enum user_sig {
+#define DEF(NAME) USER_SIG_##NAME,
+USER_SIGS
+#undef DEF
+};
+extern const char *const cc_user_sigtab[];
+
+struct ccuser {
+ LIST_ENTRY(ccuser) node_link; /* link in list of node */
+ enum user_state state; /* type of this instance */
+ struct ccdata *cc; /* the node */
+ void *uarg; /* the hook (if any) */
+ char name[ATM_EPNAMSIZ];
+ enum {
+ USER_P2P,
+ USER_ROOT,
+ USER_LEAF
+ } config; /* configuration */
+
+ struct uni_sap *sap; /* listening SAP */
+ u_int queue_max; /* maximum queue size */
+ u_int queue_act; /* actual queue size */
+ TAILQ_HEAD(,ccconn) connq; /* pending connections */
+ struct ccconn *accepted;
+ struct uni_ie_cause cause[2]; /* cause from connection */
+ u_int aborted;
+};
+
+/* set user to new state */
+void cc_user_set_state(struct ccuser *, enum user_state);
+
+/* return string for state */
+const char *cc_user_state2str(u_int);
+
+/* log on a user */
+#ifdef CCATM_DEBUG
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_user_log(U, FMT, ARGS...) do { \
+ (U)->cc->funcs->log("%s (user=%p): " FMT, __FUNCTION__, \
+ (U) , ## ARGS); \
+ } while (0)
+#else
+#define cc_user_log(U, FMT, ...) do { \
+ (U)->cc->funcs->log("%s (user=%p): " FMT, __func__, \
+ (U), __VA_ARGS__); \
+ } while (0)
+#endif
+#else
+#if defined(__GNUC__) && __GNUC__ < 3
+#define cc_user_log(U, FMT, ARGS...) do { } while (0)
+#else
+#define cc_user_log(U, FMT, ...) do { } while (0)
+#endif
+#endif
+
+/* Handle a signal to this user */
+void cc_user_sig_handle(struct ccuser *, enum user_sig, void *, u_int);
+
+/*
+ * Addresses
+ */
+struct ccaddr {
+ TAILQ_ENTRY(ccaddr) port_link;
+ struct uni_addr addr;
+};
+
+/* signal to connection */
+int cc_conn_sig(struct ccconn *, enum conn_sig, void *arg);
+
+/* signal with message to connection */
+int cc_conn_sig_msg(struct ccconn *, enum conn_sig, struct uni_msg *);
+int cc_conn_sig_msg_nodef(struct ccconn *, enum conn_sig, struct uni_msg *);
+
+/* response signal to connection */
+int cc_conn_resp(struct ccconn *, enum conn_sig, u_int, u_int, u_int);
+
+/* flush all signals to a given connection */
+void cc_conn_sig_flush(struct ccconn *);
+
+/* Queue a signal to this user */
+int cc_user_sig(struct ccuser *, enum user_sig, void *, u_int);
+
+/* Queue a signal with message to this user */
+int cc_user_sig_msg(struct ccuser *, enum user_sig, struct uni_msg *);
+
+/* Flush all signals to a given user */
+void cc_user_sig_flush(struct ccuser *);
+
+/* flush all signals */
+void cc_sig_flush_all(struct ccdata *);
diff --git a/sys/contrib/ngatm/netnatm/api/unisap.c b/sys/contrib/ngatm/netnatm/api/unisap.c
new file mode 100644
index 0000000..d96f39e
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/unisap.c
@@ -0,0 +1,415 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ * Copyright (c) 2004
+ * Hartmut Brandt
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/api/unisap.c,v 1.4 2004/07/08 08:22:01 brandt Exp $
+ */
+
+#include <sys/types.h>
+#ifdef _KERNEL
+#include <sys/ctype.h>
+#include <sys/libkern.h>
+#else
+#include <ctype.h>
+#include <string.h>
+#endif
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/api/unisap.h>
+
+int
+unisve_check_addr(const struct unisve_addr *sve)
+{
+ if (sve->tag == UNISVE_ABSENT)
+ return (UNISVE_OK);
+ if (sve->tag == UNISVE_ANY)
+ return (UNISVE_OK);
+ if (sve->tag != UNISVE_PRESENT)
+ return (UNISVE_ERROR_BAD_TAG);
+
+ if (sve->type == UNI_ADDR_INTERNATIONAL) {
+ if (sve->plan != UNI_ADDR_E164)
+ return (UNISVE_ERROR_TYPE_PLAN_CONFLICT);
+ if (sve->len == 0 || sve->len > 15)
+ return (UNISVE_ERROR_ADDR_LEN);
+
+ } else if (sve->type == UNI_ADDR_UNKNOWN) {
+ if (sve->plan != UNI_ADDR_ATME)
+ return (UNISVE_ERROR_TYPE_PLAN_CONFLICT);
+ if (sve->len != 19)
+ return (UNISVE_ERROR_ADDR_LEN);
+ } else
+ return (UNISVE_ERROR_BAD_ADDR_TYPE);
+
+ return (UNISVE_OK);
+}
+
+int
+unisve_check_selector(const struct unisve_selector *sve)
+{
+ if (sve->tag != UNISVE_PRESENT &&
+ sve->tag != UNISVE_ABSENT &&
+ sve->tag != UNISVE_ANY)
+ return (UNISVE_ERROR_BAD_TAG);
+ return (UNISVE_OK);
+}
+
+/*
+ * We don't want to check the protocol values here.
+ */
+int
+unisve_check_blli_id2(const struct unisve_blli_id2 *sve)
+{
+ if (sve->tag != UNISVE_PRESENT &&
+ sve->tag != UNISVE_ABSENT &&
+ sve->tag != UNISVE_ANY)
+ return (UNISVE_ERROR_BAD_TAG);
+ return (UNISVE_OK);
+}
+
+/*
+ * We don't want to check the protocol values here.
+ */
+int
+unisve_check_blli_id3(const struct unisve_blli_id3 *sve)
+{
+ if (sve->tag != UNISVE_PRESENT &&
+ sve->tag != UNISVE_ABSENT &&
+ sve->tag != UNISVE_ANY)
+ return (UNISVE_ERROR_BAD_TAG);
+ return (UNISVE_OK);
+}
+
+int
+unisve_check_bhli(const struct unisve_bhli *sve)
+{
+ if (sve->tag == UNISVE_ABSENT)
+ return (UNISVE_OK);
+ if (sve->tag == UNISVE_ANY)
+ return (UNISVE_OK);
+
+ if (sve->tag != UNISVE_PRESENT)
+ return (UNISVE_ERROR_BAD_TAG);
+
+ if (sve->type != UNI_BHLI_ISO &&
+ sve->type != UNI_BHLI_USER &&
+ sve->type != UNI_BHLI_VENDOR)
+ return (UNISVE_ERROR_BAD_BHLI_TYPE);
+
+ if (sve->len > sizeof(sve->info))
+ return (UNISVE_ERROR_BAD_BHLI_LEN);
+
+ return (UNISVE_OK);
+}
+
+int
+unisve_check_sap(const struct uni_sap *sap)
+{
+ int err;
+
+ if ((err = unisve_check_addr(&sap->addr)) != 0 ||
+ (err = unisve_check_selector(&sap->selector)) != 0 ||
+ (err = unisve_check_blli_id2(&sap->blli_id2)) != 0 ||
+ (err = unisve_check_blli_id3(&sap->blli_id3)) != 0 ||
+ (err = unisve_check_bhli(&sap->bhli)) != 0)
+ return (err);
+
+ if (sap->addr.plan == UNI_ADDR_E164) {
+ if (sap->selector.tag == UNISVE_PRESENT)
+ return (UNISVE_ERROR_ADDR_SEL_CONFLICT);
+ } else if (sap->addr.plan == UNI_ADDR_ATME) {
+ if (sap->selector.tag == UNISVE_ABSENT)
+ return (UNISVE_ERROR_ADDR_SEL_CONFLICT);
+ }
+ return (0);
+}
+
+#define COMMON_OVERLAP(A1,A2) \
+ if ((A1->tag == UNISVE_ABSENT && A2->tag == UNISVE_ABSENT) || \
+ A1->tag == UNISVE_ANY || A2->tag == UNISVE_ANY) \
+ return (1); \
+ if ((A1->tag == UNISVE_ABSENT && A2->tag == UNISVE_PRESENT) || \
+ (A2->tag == UNISVE_ABSENT && A1->tag == UNISVE_PRESENT)) \
+ return (0);
+
+int
+unisve_overlap_addr(const struct unisve_addr *s1, const struct unisve_addr *s2)
+{
+ COMMON_OVERLAP(s1, s2);
+
+ return (s1->type == s2->type && s1->plan == s2->plan &&
+ s1->len == s2->len && memcmp(s1->addr, s2->addr, s1->len) == 0);
+}
+
+int
+unisve_overlap_selector(const struct unisve_selector *s1,
+ const struct unisve_selector *s2)
+{
+ COMMON_OVERLAP(s1, s2);
+
+ return (s1->selector == s2->selector);
+}
+
+int
+unisve_overlap_blli_id2(const struct unisve_blli_id2 *s1,
+ const struct unisve_blli_id2 *s2)
+{
+ COMMON_OVERLAP(s1, s2);
+
+ return (s1->proto == s2->proto &&
+ (s1->proto != UNI_BLLI_L2_USER || s1->user == s2->user));
+}
+
+int
+unisve_overlap_blli_id3(const struct unisve_blli_id3 *s1,
+ const struct unisve_blli_id3 *s2)
+{
+ COMMON_OVERLAP(s1, s2);
+
+ if (s1->proto != s2->proto)
+ return (0);
+ if (s1->proto == UNI_BLLI_L3_USER)
+ return (s1->user == s2->user);
+ if (s1->proto == UNI_BLLI_L3_TR9577) {
+ if (s1->noipi && s2->noipi)
+ return (1);
+ if (!s1->noipi && !s2->noipi) {
+ if (s1->ipi == s2->ipi) {
+ if (s1->ipi != UNI_BLLI_L3_SNAP)
+ return (1);
+ if (s1->oui == s2->oui && s1->pid == s2->pid)
+ return (1);
+ }
+ }
+ return (0);
+ }
+ return (1);
+}
+
+int
+unisve_overlap_bhli(const struct unisve_bhli *s1, const struct unisve_bhli *s2)
+{
+ COMMON_OVERLAP(s1, s2);
+
+ return (s1->type == s2->type && s1->len == s2->len &&
+ memcmp(s1->info, s2->info, s1->len) == 0);
+}
+
+int
+unisve_overlap_sap(const struct uni_sap *s1, const struct uni_sap *s2)
+{
+ int any1, any2;
+
+ /*
+ * Two catch-all's SAP's are not allowed. A catch-all does never
+ * overlap with a non-catch all SAP.
+ */
+ any1 = unisve_is_catchall(s1);
+ any2 = unisve_is_catchall(s2);
+
+ if (any1 && any2)
+ return (1);
+ if(any1 || any2)
+ return (0);
+
+ return (unisve_overlap_addr(&s1->addr, &s2->addr) &&
+ unisve_overlap_selector(&s1->selector, &s2->selector) &&
+ unisve_overlap_blli_id2(&s1->blli_id2, &s2->blli_id2) &&
+ unisve_overlap_blli_id3(&s1->blli_id3, &s2->blli_id3) &&
+ unisve_overlap_bhli(&s1->bhli, &s2->bhli));
+}
+
+int
+unisve_is_catchall(const struct uni_sap *sap)
+{
+ return (sap->addr.tag == UNISVE_ANY &&
+ sap->selector.tag == UNISVE_ANY &&
+ sap->blli_id2.tag == UNISVE_ANY &&
+ sap->blli_id3.tag == UNISVE_ANY &&
+ sap->bhli.tag == UNISVE_ANY);
+}
+
+int
+unisve_match(const struct uni_sap *sap, const struct uni_ie_called *called,
+ const struct uni_ie_blli *blli, const struct uni_ie_bhli *bhli)
+{
+ switch (sap->addr.tag) {
+ case UNISVE_ABSENT:
+ if (IE_ISGOOD(*called))
+ return (0);
+ break;
+
+ case UNISVE_ANY:
+ break;
+
+ case UNISVE_PRESENT:
+ if (!IE_ISGOOD(*called))
+ return (0);
+ if (called->addr.type != sap->addr.type ||
+ called->addr.plan != sap->addr.plan)
+ return (0);
+ if (called->addr.plan == UNI_ADDR_E164) {
+ if (called->addr.len != sap->addr.len ||
+ memcmp(called->addr.addr, sap->addr.addr,
+ called->addr.len) != 0)
+ return (0);
+ } else if (called->addr.plan == UNI_ADDR_ATME) {
+ if (called->addr.len != 20 ||
+ memcmp(called->addr.addr, sap->addr.addr, 19) != 0)
+ return (0);
+ }
+ break;
+
+ default:
+ return (0);
+ }
+
+ switch (sap->selector.tag) {
+
+ case UNISVE_ABSENT:
+ if (IE_ISGOOD(*called) && called->addr.plan == UNI_ADDR_ATME)
+ return (0);
+ break;
+
+ case UNISVE_ANY:
+ break;
+
+ case UNISVE_PRESENT:
+ if (!IE_ISGOOD(*called))
+ return (0);
+ if (called->addr.plan != UNI_ADDR_ATME)
+ return (0);
+ if (called->addr.addr[19] != sap->selector.selector)
+ return (0);
+ break;
+
+ default:
+ return (0);
+ }
+
+ switch (sap->blli_id2.tag) {
+
+ case UNISVE_ABSENT:
+ if (IE_ISGOOD(*blli) && (blli->h.present & UNI_BLLI_L2_P))
+ return (0);
+ break;
+
+ case UNISVE_ANY:
+ break;
+
+ case UNISVE_PRESENT:
+ if (!IE_ISGOOD(*blli) || (blli->h.present & UNI_BLLI_L2_P) == 0)
+ return (0);
+ if (blli->l2 != sap->blli_id2.proto)
+ return (0);
+ if (blli->l2 == UNI_BLLI_L2_USER) {
+ if ((blli->h.present & UNI_BLLI_L2_USER_P) == 0)
+ return (0);
+ if (blli->l2_user != sap->blli_id2.user)
+ return (0);
+ }
+ break;
+
+ default:
+ return (0);
+ }
+
+ switch (sap->blli_id3.tag) {
+
+ case UNISVE_ABSENT:
+ if (IE_ISGOOD(*blli) && (blli->h.present & UNI_BLLI_L3_P))
+ return (0);
+ break;
+
+ case UNISVE_ANY:
+ break;
+
+ case UNISVE_PRESENT:
+ if (!IE_ISGOOD(*blli) || (blli->h.present & UNI_BLLI_L3_P) == 0)
+ return (0);
+ if (blli->l3 != sap->blli_id3.proto)
+ return (0);
+ if (blli->l3 == UNI_BLLI_L3_USER) {
+ if ((blli->h.present & UNI_BLLI_L3_USER_P) == 0)
+ return (0);
+ if (blli->l3_user != sap->blli_id3.user)
+ return (0);
+ break;
+ }
+ if (blli->l3 == UNI_BLLI_L3_TR9577) {
+ if (sap->blli_id3.noipi) {
+ if (blli->h.present & UNI_BLLI_L3_IPI_P)
+ return (0);
+ } else {
+ if (!(blli->h.present & UNI_BLLI_L3_IPI_P))
+ return (0);
+ if (blli->l3_ipi != sap->blli_id3.ipi)
+ return (0);
+ if (blli->l3_ipi == UNI_BLLI_L3_SNAP) {
+ if (!(blli->h.present &
+ UNI_BLLI_L3_SNAP_P))
+ return (0);
+ if (blli->oui != sap->blli_id3.oui ||
+ blli->pid != sap->blli_id3.pid)
+ return (0);
+ }
+ }
+ }
+ break;
+
+ default:
+ return (0);
+ }
+
+ switch (sap->bhli.tag) {
+
+ case UNISVE_ABSENT:
+ if (IE_ISGOOD(*bhli))
+ return (0);
+ break;
+
+ case UNISVE_ANY:
+ break;
+
+ case UNISVE_PRESENT:
+ if (!IE_ISGOOD(*bhli))
+ return (0);
+ if (sap->bhli.type != bhli->type)
+ return (0);
+ if (sap->bhli.len != bhli->len)
+ return (0);
+ if (memcmp(sap->bhli.info, bhli->info, bhli->len) != 0)
+ return (0);
+ break;
+
+ default:
+ return (0);
+ }
+ /* Uff */
+ return (1);
+}
diff --git a/sys/contrib/ngatm/netnatm/api/unisap.h b/sys/contrib/ngatm/netnatm/api/unisap.h
new file mode 100644
index 0000000..ffbfc9f
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/api/unisap.h
@@ -0,0 +1,130 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/api/unisap.h,v 1.6 2005/05/23 11:49:17 brandt_h Exp $
+ */
+#ifndef _NETNATM_API_UNISAP_H_
+#define _NETNATM_API_UNISAP_H_
+
+#include <netnatm/msg/uni_config.h>
+
+enum unisve_tag {
+ UNISVE_ABSENT, /* Element is absent */
+ UNISVE_PRESENT, /* Element is present with specific value */
+ UNISVE_ANY /* Any values is acceptable */
+};
+
+struct unisve_addr {
+ enum unisve_tag tag;
+ enum uni_addr_type type; /* type of address */
+ enum uni_addr_plan plan; /* addressing plan */
+ uint32_t len; /* length of address */
+ u_char addr[UNI_ADDR_MAXLEN];
+};
+
+struct unisve_selector {
+ enum unisve_tag tag;
+ uint8_t selector;
+};
+
+struct unisve_blli_id2 {
+ enum unisve_tag tag;
+ u_int proto:5; /* the protocol */
+ u_int user:7; /* user specific protocol */
+};
+
+struct unisve_blli_id3 {
+ enum unisve_tag tag;
+ u_int proto:5; /* L3 protocol */
+ u_int user:7; /* user specific protocol */
+ u_int ipi:8; /* ISO/IEC TR 9557 IPI */
+ u_int oui:24; /* IEEE 802.1 OUI */
+ u_int pid:16; /* IEEE 802.1 PID */
+ uint32_t noipi; /* ISO/IEC TR 9557 per frame */
+};
+
+struct unisve_bhli {
+ enum unisve_tag tag;
+ enum uni_bhli type; /* type of info */
+ uint32_t len; /* length of info */
+ uint8_t info[8]; /* info itself */
+};
+
+struct uni_sap {
+ struct unisve_addr addr;
+ struct unisve_selector selector;
+ struct unisve_blli_id2 blli_id2;
+ struct unisve_blli_id3 blli_id3;
+ struct unisve_bhli bhli;
+};
+
+int unisve_check_addr(const struct unisve_addr *);
+int unisve_check_selector(const struct unisve_selector *);
+int unisve_check_blli_id2(const struct unisve_blli_id2 *);
+int unisve_check_blli_id3(const struct unisve_blli_id3 *);
+int unisve_check_bhli(const struct unisve_bhli *);
+
+int unisve_check_sap(const struct uni_sap *);
+
+int unisve_overlap_addr(const struct unisve_addr *, const struct unisve_addr *);
+int unisve_overlap_selector(const struct unisve_selector *,
+ const struct unisve_selector *);
+int unisve_overlap_blli_id2(const struct unisve_blli_id2 *,
+ const struct unisve_blli_id2 *);
+int unisve_overlap_blli_id3(const struct unisve_blli_id3 *,
+ const struct unisve_blli_id3 *);
+int unisve_overlap_bhli(const struct unisve_bhli *,
+ const struct unisve_bhli *);
+int unisve_overlap_sap(const struct uni_sap *, const struct uni_sap *);
+
+int unisve_is_catchall(const struct uni_sap *);
+int unisve_match(const struct uni_sap *, const struct uni_ie_called *,
+ const struct uni_ie_blli *, const struct uni_ie_bhli *);
+
+enum {
+ UNISVE_OK = 0,
+ UNISVE_ERROR_BAD_TAG,
+ UNISVE_ERROR_TYPE_PLAN_CONFLICT,
+ UNISVE_ERROR_ADDR_SEL_CONFLICT,
+ UNISVE_ERROR_ADDR_LEN,
+ UNISVE_ERROR_BAD_ADDR_TYPE,
+ UNISVE_ERROR_BAD_BHLI_TYPE,
+ UNISVE_ERROR_BAD_BHLI_LEN,
+};
+
+#define UNISVE_ERRSTR \
+ "no error", \
+ "bad SVE tag", \
+ "bad address type/plan combination", \
+ "bad address plan/selector tag combination", \
+ "bad address length in SVE", \
+ "unknown address type in SVE", \
+ "bad BHLI type in SVE", \
+ "BHLI info too long in SVE",
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/genfiles b/sys/contrib/ngatm/netnatm/genfiles
new file mode 100644
index 0000000..70fb5e8
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/genfiles
@@ -0,0 +1,15 @@
+#!/bin/sh
+# Copyright (c) 2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Author: Harti Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/genfiles,v 1.4 2004/07/08 08:21:45 brandt Exp $
+#
+awk -f ${SRC}msg/parseie.awk -f ${SRC}msg/geniec.awk ${SRC}msg/ie.def >${DST}msg/uni_ietab.h
+awk -f ${SRC}msg/parseie.awk -f ${SRC}msg/genieh.awk ${SRC}msg/ie.def >${DST}msg/uni_ie.h
+awk -f ${SRC}msg/parsemsg.awk -f ${SRC}msg/genmsgc.awk ${SRC}msg/msg.def >${DST}msg/uni_msg.c
+awk -f ${SRC}msg/parsemsg.awk -f ${SRC}msg/genmsgh.awk ${SRC}msg/msg.def >${DST}msg/uni_msg.h
+awk -f ${SRC}msg/parsemsg.awk -f ${SRC}sig/genmsgcpyh.awk ${SRC}msg/msg.def >${DST}sig/unimsgcpy.h
+awk -f ${SRC}msg/parsemsg.awk -f ${SRC}sig/genmsgcpyc.awk ${SRC}msg/msg.def >${DST}sig/sig_unimsgcpy.c
diff --git a/sys/contrib/ngatm/netnatm/misc/straddr.c b/sys/contrib/ngatm/netnatm/misc/straddr.c
new file mode 100644
index 0000000..7d21b8f
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/misc/straddr.c
@@ -0,0 +1,235 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/misc/straddr.c,v 1.4 2004/07/08 08:22:02 brandt Exp $
+ */
+
+#include <sys/types.h>
+#ifdef _KERNEL
+#include <sys/ctype.h>
+#include <sys/libkern.h>
+#else
+#include <ctype.h>
+#include <string.h>
+#endif
+#include <netnatm/addr.h>
+
+/*
+ * Convert an NSAP address from the ASCII format to the binary.
+ * ASCII format means each byte formatted as a 2-byte hex number
+ * with dots freely interspersed between the bytes.
+ * If the conversion is succesful, the function returns 0, -1
+ * on conversion errors.
+ */
+int
+uni_str2nsap(u_char *out, const char *in)
+{
+ int i;
+ int c;
+
+ for(i = 0; i < 20; i++) {
+ while((c = *in++) == '.')
+ ;
+ if(!isascii(c) || !isxdigit(c))
+ return -1;
+ out[i] = isdigit(c) ? (c - '0')
+ : islower(c) ? (c - 'a' + 10)
+ : (c - 'A' + 10);
+ out[i] <<= 4;
+ c = *in++;
+ if(!isascii(c) || !isxdigit(c))
+ return -1;
+ out[i] |= isdigit(c) ? (c - '0')
+ : islower(c) ? (c - 'a' + 10)
+ : (c - 'A' + 10);
+ }
+ return *in != '\0';
+}
+
+/*
+ * Parse an emebedded E.164 NSAP address.
+ * If check is 0, the contents of the last 11 bytes are ignored
+ * If check is 1, the contents of all of these but the selector byte
+ * are checked to be zero. If check is 2 all 11 bytes must be 0.
+ */
+int
+uni_nsap2e164(char *e164, const u_char *nsap, int check)
+{
+ char *p = e164;
+ u_int d;
+ int i;
+
+ if(nsap[0] != 0x45)
+ return -1;
+ if((nsap[8] & 0xf) != 0xf)
+ return -1;
+ for(i = 1; i <= 7; i++) {
+ d = (nsap[i] >> 4) & 0xf;
+ if(d == 0x00 && p == e164)
+ continue;
+ if(d >= 0xa)
+ return -1;
+ *p++ = d + '0';
+
+ d = nsap[i] & 0xf;
+ if(d == 0x00 && p == e164)
+ continue;
+ if(d >= 0xa)
+ return -1;
+ *p++ = d + '0';
+ }
+ d = (nsap[i] >> 4) & 0xf;
+ if(d != 0x00 || p == e164) {
+ if(d >= 0xa)
+ return -1;
+ *p++ = d + '0';
+ }
+ if(p == e164)
+ return -1;
+ *p++ = 0;
+
+ if(check == 0)
+ return 0;
+ while(i < ((check == 1) ? 19 : 20)) {
+ if(nsap[i] != 0x00)
+ return -1;
+ i++;
+ }
+
+ return 0;
+}
+
+/*
+ * Convert a binary representation to ASCII. The standard formats are
+ * recognized and dotted. Non-standard formats get no dots altogether.
+ */
+void
+uni_prefix2str(char *out, const u_char *in, u_int len, int dotit)
+{
+ static char hex[16] = "0123456789abcdef";
+ static int fmt[3][6] = {
+ { 1, 2, 10, 6, 1, 0 },
+ { 1, 2, 10, 6, 1, 0 },
+ { 1, 8, 4, 6, 1, 0 },
+ };
+ int f, b;
+ u_int i;
+
+ if (len > 20)
+ len = 20;
+
+ if(dotit) {
+ switch(*in) {
+
+ case 0x39: /* DCC */
+ i = 0;
+ fmt:
+ for(f = 0; fmt[i][f]; f++) {
+ if (len == 0)
+ goto done;
+ if(f != 0)
+ *out++ = '.';
+ for(b = 0; b < fmt[i][f]; b++) {
+ if (len-- == 0)
+ goto done;
+ *out++ = hex[(*in >> 4) & 0xf];
+ *out++ = hex[*in & 0xf];
+ in++;
+ }
+ }
+ done:
+ *out = '\0';
+ return;
+
+ case 0x47: /* ICD */
+ i = 1;
+ goto fmt;
+
+ case 0x45: /* E.164 */
+ i = 2;
+ goto fmt;
+ }
+ }
+
+ /* undotted */
+ for(i = 0; i < len; i++) {
+ *out++ = hex[(*in >> 4) & 0xf];
+ *out++ = hex[*in & 0xf];
+ in++;
+ }
+ *out = '\0';
+}
+
+void
+uni_nsap2str(char *out, const u_char *in, int dotit)
+{
+ uni_prefix2str(out, in, 20, dotit);
+}
+
+/*
+ * Make an embedded E.164 NSAP address from a NSAP address.
+ * The E.164 address is a string of digits, at least one digit and
+ * not more than 15 digits long. The NSAP address will start with
+ * byte 0x45 and then a 8 byte field, which contains the right
+ * justified E.164 address in BCD coding, filled with a 0xf to the
+ * right. The rest of the address is zero.
+ * The function returns 0 if everything is ok, -1 in case of a wrong
+ * E.164 address.
+ */
+int
+uni_e1642nsap(u_char *nsap, const char *e164)
+{
+ size_t len;
+ int fill;
+ u_int i;
+
+ if((len = strlen(e164)) > 15 || len == 0)
+ return -1;
+ for(i = 0; i < len; i++)
+ if(!isdigit(e164[i]))
+ return -1;
+
+ *nsap++ = 0x45;
+ fill = (15 - len) / 2;
+ while(fill--)
+ *nsap++ = 0x00;
+ if((len & 1) == 0) {
+ *nsap++ = *e164++ - '0';
+ len--;
+ }
+ while(len > 1) {
+ len -= 2;
+ *nsap = (*e164++ - '0') << 4;
+ *nsap++ |= *e164 - '0';
+ }
+ *nsap++ = ((*e164++ - '0') << 4) | 0xf;
+ for(fill = 0; fill < 11; fill++)
+ *nsap++ = 0;
+
+ return 0;
+}
diff --git a/sys/contrib/ngatm/netnatm/misc/unimsg_common.c b/sys/contrib/ngatm/netnatm/misc/unimsg_common.c
new file mode 100644
index 0000000..033213a
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/misc/unimsg_common.c
@@ -0,0 +1,54 @@
+/*
+ * Copyright (c) 2003-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/misc/unimsg_common.c,v 1.3 2004/07/08 08:22:03 brandt Exp $
+ */
+
+#include <netnatm/unimsg.h>
+
+/*
+ * Make sure there is enough space in front of the data for
+ * len bytes, and update the read pointer.
+ */
+int
+uni_msg_prepend(struct uni_msg *msg, size_t len)
+{
+ size_t need;
+
+ if (uni_msg_leading(msg) >= len) {
+ msg->b_rptr -= len;
+ return (0);
+ }
+ need = len - uni_msg_leading(msg);
+ if (uni_msg_ensure(msg, need))
+ return (-1);
+ memcpy(msg->b_rptr + need, msg->b_rptr, uni_msg_len(msg));
+ msg->b_rptr += need - len;
+ msg->b_wptr += need;
+ return (0);
+}
diff --git a/sys/contrib/ngatm/netnatm/msg/geniec.awk b/sys/contrib/ngatm/netnatm/msg/geniec.awk
new file mode 100644
index 0000000..d062082
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/geniec.awk
@@ -0,0 +1,110 @@
+#
+# Copyright (c) 2001-2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Hartmut Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/msg/geniec.awk,v 1.4 2003/10/10 14:50:05 hbb Exp $
+#
+# Generate table for IE parsing.
+#
+# This function is called before the first line
+#
+function begin() {
+ for(i = 0; i < 256; i++) {
+ for(j = 0; j < 4; j++) {
+ decl[i,j] = ""
+ }
+ }
+}
+
+#
+# This function is called after the last line.
+#
+function end() {
+ print ""
+ print "const struct iedecl *uni_ietable[256][4] = {"
+ for(i = 0; i < 256; i++) {
+ printf "\t{"
+ for(j = 0; j < 4; j++) {
+ if(decl[i,j] == "") {
+ printf " NULL,"
+ } else {
+ printf " &%s,", decl[i,j]
+ }
+ }
+ printf " }, /* 0x%02x */\n", i
+ }
+ print "};"
+}
+
+#
+# This function is called just when the first information element was found
+#
+function first_element() {
+ print "/* This file was created automatically"
+ print " * Source file: " id
+ print " */"
+ print ""
+}
+
+#
+# This is called, when the information element is defaulted (there is
+# only the name and the coding scheme
+#
+function element_default() {
+ print ""
+ print "static const struct iedecl decl_" coding "_" ie " = {"
+ print "\tUNIFL_DEFAULT,"
+ print "\t0,"
+ print "\t(uni_print_f)NULL,"
+ print "\t(uni_check_f)NULL,"
+ print "\t(uni_encode_f)NULL,"
+ print "\t(uni_decode_f)NULL"
+ print "};"
+ decl[number,ncoding] = "decl_" coding "_" ie
+}
+
+#
+# This is found for a real, non-default IE
+#
+function element() {
+ print ""
+ print "static void uni_ie_print_" coding "_" ie "(struct uni_ie_" ie " *, struct unicx *);"
+ print "static int uni_ie_check_" coding "_" ie "(struct uni_ie_" ie " *, struct unicx *);"
+ print "static int uni_ie_encode_" coding "_" ie "(struct uni_msg *, struct uni_ie_" ie " *, struct unicx *);"
+ print "static int uni_ie_decode_" coding "_" ie "(struct uni_ie_" ie " *, struct uni_msg *, u_int, struct unicx *);"
+ print ""
+ print "static struct iedecl decl_" coding "_" ie " = {"
+ if(access) print "\tUNIFL_ACCESS,"
+ else print "\t0,"
+ print "\t" len ","
+ print "\t(uni_print_f)uni_ie_print_" coding "_" ie ","
+ print "\t(uni_check_f)uni_ie_check_" coding "_" ie ","
+ print "\t(uni_encode_f)uni_ie_encode_" coding "_" ie ","
+ print "\t(uni_decode_f)uni_ie_decode_" coding "_" ie ""
+ print "};"
+ decl[number,ncoding] = "decl_" coding "_" ie
+}
diff --git a/sys/contrib/ngatm/netnatm/msg/genieh.awk b/sys/contrib/ngatm/netnatm/msg/genieh.awk
new file mode 100644
index 0000000..7120d7b
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/genieh.awk
@@ -0,0 +1,61 @@
+#
+# Copyright (c) 2001-2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Hartmut Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/msg/genieh.awk,v 1.4 2004/07/08 08:22:03 brandt Exp $
+#
+# Generate IE header file
+#
+function begin() {
+}
+
+function first_element() {
+ print "/* This file was created automatically"
+ print " * Source file: " id
+ print " */"
+ print ""
+ print "#ifndef _NETNATM_MSG_UNI_IE_H_"
+ print "#define _NETNATM_MSG_UNI_IE_H_"
+ print ""
+ print "union uni_ieall {"
+ print " struct uni_iehdr h;"
+}
+
+function end() {
+ print "};"
+ print ""
+ print "#endif"
+}
+
+function element_default() {
+}
+
+function element() {
+ if(ie in u) return
+ u[ie] = 1
+ print " struct uni_ie_" ie " " ie ";"
+}
diff --git a/sys/contrib/ngatm/netnatm/msg/genmsgc.awk b/sys/contrib/ngatm/netnatm/msg/genmsgc.awk
new file mode 100644
index 0000000..ffd69ac
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/genmsgc.awk
@@ -0,0 +1,274 @@
+#
+# Copyright (c) 2001-2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Hartmut Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/msg/genmsgc.awk,v 1.6 2004/07/08 08:22:04 brandt Exp $
+#
+# Generate message functions.
+#
+function begin() {
+}
+
+function first_entry() {
+ print "/* This file was created automatically"
+ print " * Source file: " id
+ print " */"
+ print ""
+ print "#include <sys/types.h>"
+ print "#include <sys/param.h>"
+ print ""
+ print "#ifdef _KERNEL"
+ print "#include <sys/libkern.h>"
+ print "#else"
+ print "#include <string.h>"
+ print "#endif"
+ print "#include <netnatm/unimsg.h>"
+ print "#include <netnatm/msg/unistruct.h>"
+ print "#include <netnatm/msg/unimsglib.h>"
+ print "#include <netnatm/msg/priv.h>"
+ print "#include <netnatm/msg/privmsg.c>"
+}
+
+function end() {
+ print ""
+ print "const struct msgdecl *uni_msgtable[256] = {"
+ for(i = 0; i < 256; i++) {
+ if(decl[i] == "") {
+ printf "\t&decl_unknown,"
+ } else {
+ printf "\t&%s,", decl[i]
+ }
+ printf "\t/* 0x%02x */\n", i
+ }
+ print "};"
+}
+
+function start_message() {
+}
+
+function end_message() {
+ gen_print()
+ gen_check()
+ gen_encode()
+ gen_decode()
+ gen_reg()
+}
+
+function gen_print() {
+ print ""
+ print "static void"
+ print "print_" msg "(struct uni_" msg " *msg, struct unicx *cx)"
+ print "{"
+ if(msgrep) {
+ print "\tu_int i;"
+ print ""
+ }
+ for(i = 0; i < cnt; i++) {
+ ie = iename[i]
+ uie = toupper(iename[i])
+ if(ierep[i]) {
+ print "\tif(msg->" ie "_repeat.h.present & UNI_IE_PRESENT)"
+ print "\t\tuni_print_ie_internal(UNI_IE_REPEAT, (union uni_ieall *)&msg->" ie "_repeat, cx);"
+ }
+ if(ienum[i] == "-") {
+ print "\tif(msg->" ie ".h.present & UNI_IE_PRESENT)"
+ print "\t\tuni_print_ie_internal(UNI_IE_" uie ", (union uni_ieall *)&msg->" ie ", cx);"
+ } else {
+ print "\tfor(i = 0; i < " ienum[i] "; i++)"
+ print "\t\tif(msg->" ie "[i].h.present & UNI_IE_PRESENT)"
+ print "\t\t\tuni_print_ie_internal(UNI_IE_" uie ", (union uni_ieall *)&msg->" ie "[i], cx);"
+ }
+ }
+ print "}"
+}
+
+function gen_check() {
+ print ""
+ print "static int"
+ print "check_" msg "(struct uni_" msg " *m, struct unicx *cx)"
+ print "{"
+ print "\tint ret = 0;"
+ if(msgrep) {
+ print "\tu_int i;"
+ }
+ print ""
+ for(i = 0; i < cnt; i++) {
+ ie = iename[i]
+ if(ierep[i]) {
+ if(iecond[i] == "1") {
+ print "\tret |= uni_check_ie(UNI_IE_REPEAT, (union uni_ieall *)&m->" ie "_repeat, cx);"
+ } else {
+ print "\tif(!(" iecond[i] "))"
+ print "\t\tret |= IE_ISPRESENT(m->" ie "_repeat);"
+ print "\telse"
+ print "\t\tret |= uni_check_ie(UNI_IE_REPEAT, (union uni_ieall *)&m->" ie "_repeat, cx);"
+ }
+ }
+ if(ienum[i] == "-") {
+ if(iecond[i] == "1") {
+ print "\tret |= uni_check_ie(UNI_IE_" toupper(ie) ", (union uni_ieall *)&m->" ie ", cx);"
+ } else {
+ print "\tif(!(" iecond[i] "))"
+ print "\t\tret |= IE_ISPRESENT(m->" ie ");"
+ print "\telse"
+ print "\t\tret |= uni_check_ie(UNI_IE_" toupper(ie) ", (union uni_ieall *)&m->" ie ", cx);"
+ }
+ } else {
+ print "\tfor(i = 0; i < " ienum[i]" ; i++) {"
+ if(iecond[i] == "1") {
+ print "\t\tret |= uni_check_ie(UNI_IE_" toupper(ie) ", (union uni_ieall *)&m->" ie "[i], cx);"
+ } else {
+ print "\t\tif(!(" iecond[i] "))"
+ print "\t\t\tret |= IE_ISPRESENT(m->" ie "[i]);"
+ print "\t\telse"
+ print "\t\t\tret |= uni_check_ie(UNI_IE_" toupper(ie) ", (union uni_ieall *)&m->" ie "[i], cx);"
+ }
+ print "\t}"
+ }
+ }
+ print ""
+ print "\treturn ret;"
+ print "}"
+}
+
+function gen_encode() {
+ print ""
+ print "static int"
+ print "encode_" msg "(struct uni_msg *msg, struct uni_" msg " *p, struct unicx *cx)"
+ print "{"
+ print "\tu_int mlen;"
+ if(msgrep) {
+ print "\tu_int i;"
+ }
+ print ""
+ print "\tif(uni_encode_msg_hdr(msg, &p->hdr, UNI_" toupper(msg) ", cx, &mlen))"
+ print "\t\treturn (-2);"
+ print ""
+ for(i = 0; i < cnt; i++) {
+ ie = iename[i]
+ if(ierep[i]) {
+ print "\tif((p->" ie "_repeat.h.present & UNI_IE_PRESENT) &&"
+ print "\t uni_encode_ie(UNI_IE_" toupper(ie) ", msg, (union uni_ieall *)&p->" ie "_repeat, cx))"
+ print "\t\treturn (0x10000000 + UNI_IE_" toupper(ie) ");"
+ }
+ if(ienum[i] == "-") {
+ print "\tif((p->" ie ".h.present & UNI_IE_PRESENT) &&"
+ print "\t uni_encode_ie(UNI_IE_" toupper(ie) ", msg, (union uni_ieall *)&p->" ie ", cx))"
+ print "\t\treturn (UNI_IE_" toupper(ie) ");"
+ } else {
+ print "\tfor(i = 0; i < " ienum[i] "; i++)"
+ print "\t\tif((p->" ie "[i].h.present & UNI_IE_PRESENT) &&"
+ print "\t\t uni_encode_ie(UNI_IE_" toupper(ie) ", msg, (union uni_ieall *)&p->" ie "[i], cx))"
+ print "\t\treturn ((i << 16) + UNI_IE_" toupper(ie) ");"
+ }
+ }
+ print ""
+ print "\tmsg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;"
+ print "\tmsg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;"
+ print ""
+ print "\treturn (0);"
+ print "}"
+}
+
+function gen_decode() {
+ print ""
+ print "static int"
+ print "decode_" msg "(struct uni_" msg " *out, struct uni_msg *msg,"
+ print " enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,"
+ print " struct unicx *cx)"
+ print "{"
+ if (msgrep) {
+ print " u_int i;"
+ print ""
+ }
+ print " switch (ie) {"
+
+ rep=0
+ for (i = 0; i < cnt; i++) {
+ ie = iename[i]
+ print ""
+ print " case UNI_IE_" toupper(ie) ":"
+ if (iecond[i] != "1") {
+ print " if (!(" iecond[i] "))"
+ print " return (DEC_ILL);"
+ }
+ if (ierep[i]) {
+ rep=1
+ print " if (IE_ISPRESENT(cx->repeat))"
+ print " out->" ie "_repeat = cx->repeat;"
+ }
+ if (ienum[i] == "-") {
+ print " out->" ie ".h = *hdr;"
+ print " if (hdr->present & UNI_IE_ERROR)"
+ print " return (DEC_ERR);"
+ print " if(uni_decode_ie_body(UNI_IE_"toupper(ie)", (union uni_ieall *)&out->"ie", msg, ielen, cx))"
+ print " return (DEC_ERR);"
+
+ } else {
+ print " for(i = 0; i < " ienum[i] "; i++)"
+ print " if (!IE_ISPRESENT(out->" ie "[i])) {"
+ print " out->" ie "[i].h = *hdr;"
+ print " if (hdr->present & UNI_IE_ERROR)"
+ print " return (DEC_ERR);"
+ print " if(uni_decode_ie_body(UNI_IE_"toupper(ie)", (union uni_ieall *)&out->"ie"[i], msg, ielen, cx))"
+ print " return (DEC_ERR);"
+ print " break;"
+ print " }"
+ }
+ print " break;"
+ }
+ if(rep) {
+ print ""
+ print " case UNI_IE_REPEAT:"
+ print " cx->repeat.h = *hdr;"
+ print " if (hdr->present & UNI_IE_ERROR)"
+ print " return (DEC_ERR);"
+ print " if (uni_decode_ie_body(UNI_IE_REPEAT, (union uni_ieall *)&cx->repeat, msg, ielen, cx))"
+ print " return (DEC_ERR);"
+ print " break;"
+ }
+
+ print ""
+ print " default:"
+ print " return (DEC_ILL);"
+ print " }"
+ print " return (DEC_OK);"
+ print "}"
+}
+
+function gen_reg() {
+ print ""
+ print "static const struct msgdecl decl_" msg " = {"
+ print "\t0,"
+ print "\t\"" msg "\","
+ print "\t(uni_msg_print_f)print_" msg ","
+ print "\t(uni_msg_check_f)check_" msg ","
+ print "\t(uni_msg_encode_f)encode_" msg ","
+ print "\t(uni_msg_decode_f)decode_" msg
+ print "};"
+ decl[code] = "decl_" msg
+}
diff --git a/sys/contrib/ngatm/netnatm/msg/genmsgh.awk b/sys/contrib/ngatm/netnatm/msg/genmsgh.awk
new file mode 100644
index 0000000..8705b31
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/genmsgh.awk
@@ -0,0 +1,80 @@
+#
+# Copyright (c) 2001-2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Hartmut Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/msg/genmsgh.awk,v 1.4 2004/07/08 08:22:04 brandt Exp $
+#
+# Generate message header
+#
+function begin() {
+}
+
+function first_entry() {
+ print "/* This file was created automatically"
+ print " * Source file: " id
+ print " */"
+ print ""
+ print "#ifndef _NETNATM_MSG_UNI_MSG_H_"
+ print "#define _NETNATM_MSG_UNI_MSG_H_"
+}
+
+function end() {
+ print ""
+ print "union uni_msgall {"
+ print "\tstruct uni_msghdr\thdr;"
+ for(i = 0; i < mcnt; i++) {
+ m = messages[i]
+ if(msgcond[i] == "") {
+ print "\tstruct uni_" m "\t" m ";"
+ } else {
+ print "\tstruct uni_" m "\t" m ";\t/* " msgcond[i] " */"
+ }
+ }
+ print "};"
+ print ""
+ print "#endif"
+}
+
+function start_message() {
+}
+
+function end_message() {
+ print ""
+ print "struct uni_" msg " {"
+ print "\tstruct uni_msghdr\thdr;"
+ for(i = 0; i < cnt; i++) {
+ if(ierep[i]) {
+ print "\tstruct uni_ie_repeat\t" iename[i] "_repeat;"
+ }
+ if(ienum[i] != "-") {
+ print "\tstruct uni_ie_" iename[i] "\t" iename[i] "[" ienum[i] "];"
+ } else {
+ print "\tstruct uni_ie_" iename[i] "\t" iename[i] ";"
+ }
+ }
+ print "};"
+}
diff --git a/sys/contrib/ngatm/netnatm/msg/ie.def b/sys/contrib/ngatm/netnatm/msg/ie.def
new file mode 100644
index 0000000..fbeabe8
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/ie.def
@@ -0,0 +1,84 @@
+#
+# Copyright (c) 2001-2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Hartmut Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/msg/ie.def,v 1.4 2003/09/29 10:47:18 hbb Exp $
+#
+# Define information elements --- no content definition
+#
+#########################################################################
+element cause 0x08 itu 34
+element cause 0x08 net 34
+element callstate 0x14 itu 5
+element facility 0x1c itu UNI_FACILITY_MAXAPDU+1+4 q2932
+element notify 0x27 itu UNI_NOTIFY_MAXLEN+4
+element eetd 0x42 itu 11
+element eetd 0x42 net 13
+element conned 0x4c itu 25 file=addr
+element connedsub 0x4d itu 25 access file=addr
+element epref 0x54 itu 7
+element epstate 0x55 itu 5
+element aal 0x58 itu 21 access
+element traffic 0x59 itu 30
+element traffic 0x59 net
+element connid 0x5a itu 9
+element qos 0x5c itu 6
+element qos 0x5c net 6
+element bhli 0x5d itu 13 access
+element bearer 0x5e itu 7
+element blli 0x5f itu 17 access
+element lshift 0x60 itu 5 0 file=shift
+element nlshift 0x61 itu 5 0 file=shift
+element scompl 0x62 itu 5 !pnni
+element repeat 0x63 itu 5
+element calling 0x6c itu 26 file=addr
+element callingsub 0x6d itu 25 access file=addr
+element called 0x70 itu 25 file=addr
+element calledsub 0x71 itu 25 access file=addr
+element tns 0x78 itu 9
+element tns 0x78 net
+element restart 0x79 itu 5
+element uu 0x7e itu UNI_UU_MAXLEN+4 access !pnni
+element git 0x7f net 33
+element mintraffic 0x81 itu 20 file=traffic
+element mintraffic 0x81 net
+element atraffic 0x82 itu 30 file=traffic
+element atraffic 0x82 net
+element abrsetup 0x84 net 36 file=abr
+element report 0x89 itu 5
+element called_soft 0xe0 net 11 file=soft pnni
+element crankback 0xe1 net 72 pnni
+element dtl 0xe2 net UNI_DTL_LOGNP_SIZE*UNI_DTL_MAXNUM+6 pnni
+element calling_soft 0xe3 net 10 file=soft pnni
+element abradd 0xe4 net 14 file=abr
+element lij_callid 0xe8 net 9 file=lij !pnni
+element lij_param 0xe9 net 5 file=lij !pnni
+element lij_seqno 0xea net 8 file=lij !pnni
+element cscope 0xeb net 6
+element exqos 0xec net 25
+element mdcr 0xf0 net 13 file=traffic
+element unrec 0xfe itu 128
diff --git a/sys/contrib/ngatm/netnatm/msg/msg.def b/sys/contrib/ngatm/netnatm/msg/msg.def
new file mode 100644
index 0000000..41453ec
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/msg.def
@@ -0,0 +1,582 @@
+#
+# Copyright (c) 2001-2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Hartmut Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/msg/msg.def,v 1.4 2003/09/29 10:47:18 hbb Exp $
+#
+# Define message contents
+#
+#########################################################################
+#
+# ALERTING message
+#
+# References:
+# Q.2931 8, 17*
+# ...A4 4, 11*
+# Q.2957 3
+# Q.2971 6
+# UNI4.0 5
+# PNNI1.0 177...178, 184*
+#
+# Notes:
+# N-ISDN compatiblity not implemented.
+#
+start alerting 0x01
+ connid - !pnni
+ epref
+ notify
+ git UNI_NUM_IE_GIT
+ uu - !pnni
+ report - !pnni
+ unrec
+end
+
+#########################################################################
+#
+# CALL PROCEEDING message
+#
+# References:
+# Q.2931 9, 18*
+# Q.2971 6
+# UNI4.0 5
+# PNNI1.0 178
+#
+# Notes:
+# N-ISDN compatiblity not implemented.
+#
+start call_proc 0x02
+ connid
+ epref
+ notify - !pnni
+ unrec
+end
+
+#########################################################################
+#
+# CONNECT message
+#
+# References:
+# Q.2931 p. 10, 19*
+# ...A4 6, 12*
+# Q.2932.1 p. 17
+# Q.2951 p. 30
+# Q.2957 p. 4
+# Q.2962 p. 3
+# Q.2971 p. 7
+# UNI4.0 p. 5-6, 61, 68, 77
+# PNNI1.0 pp. 178...179, 184...185*
+#
+# Notes:
+# N-ISDN compatiblity not implemented.
+#
+start connect 0x07
+ aal
+ blli
+ connid - !pnni
+ epref
+ notify
+ conned
+ connedsub
+ eetd
+ git UNI_NUM_IE_GIT
+ uu - !pnni
+ traffic
+ exqos
+ facility - q2932
+ abrsetup
+ abradd
+ called_soft - pnni
+ report - !pnni
+ unrec
+end
+
+#########################################################################
+#
+# CONNECT ACKNOWLEDGE message
+#
+# References:
+# Q.2931 11
+#
+start connect_ack 0x0f !pnni
+ notify
+ unrec
+end
+
+#########################################################################
+#
+# RELEASE message
+#
+# References:
+# Q.2931 p. 11, 22*
+# Q.2932.1 p. 18
+# Q.2957 p. 4
+# Q.2962 p. 3
+# UNI4.0 p. 6
+# PNNI1.0 pp. 179...180, 185...186*
+#
+# Notes:
+# N-ISDN compatiblity not implemented.
+#
+start release 0x4d
+ cause 2
+ notify
+ git UNI_NUM_IE_GIT
+ uu - !pnni
+ facility - q2932
+ crankback - pnni
+ unrec
+end
+
+#########################################################################
+#
+# RELEASE COMPLETE message
+#
+# References:
+# Q.2931 p. 12
+# UNI4.0 p. 6
+# PNNI1.0 p. 180
+#
+start release_compl 0x5a
+ cause 2
+ git UNI_NUM_IE_GIT !pnni
+ uu - !pnni
+ crankback - pnni
+ unrec
+end
+
+#########################################################################
+#
+# SETUP message
+#
+# References:
+# Q.2931 13-14, 23-24*
+# ...A4 7-9, 13-16*
+# Q.2957 5
+# Q.2962 3
+# Q.2971 7
+# UNI4.0 6-7, 43, 57*, 60-61, 68-69, 78
+# PNNI1.0 180...182, 186*
+# af-cs-0147.000
+#
+# Notes:
+#
+start setup 0x05
+ aal
+ traffic
+ bearer
+ bhli
+ blli UNI_NUM_IE_BLLI/R
+ called
+ calledsub UNI_NUM_IE_CALLEDSUB
+ calling
+ callingsub UNI_NUM_IE_CALLINGSUB
+ connid
+ qos
+ eetd
+ notify
+ scompl - !pnni
+ tns UNI_NUM_IE_TNS
+ epref
+ atraffic
+ mintraffic
+ uu - !pnni
+ git UNI_NUM_IE_GIT
+ lij_callid - !pnni
+ lij_param - !pnni
+ lij_seqno - !pnni
+ exqos
+ abrsetup
+ abradd
+ cscope
+ calling_soft - pnni
+ called_soft - pnni
+ dtl UNI_NUM_IE_DTL/R pnni
+ report - !pnni
+ mdcr
+ unrec
+end
+
+#########################################################################
+#
+# STATUS message
+#
+# References:
+# Q.2931 p. 14
+# Q.2971 p. 8
+# PNNI1.0 p. 182
+#
+start status 0x7d
+ callstate
+ cause
+ epref
+ epstate
+ unrec
+end
+
+#########################################################################
+#
+# STATUS ENQUIRY message
+#
+# References:
+# Q.2931 p. 15
+# Q.2971 p. 8
+# PNNI1.0 pp. 182...183
+#
+start status_enq 0x75
+ epref
+ unrec
+end
+
+#########################################################################
+#
+# NOTIFY message
+#
+# References:
+# Q.2931 p. 15
+# Q.2971 p. 8
+# PNNI1.0 p. 183
+#
+start notify 0x6e
+ notify
+ epref
+ unrec
+end
+
+#########################################################################
+#
+# RESTART message
+#
+# References:
+# Q.2931 p. 26
+# UNI4.0 p. 7
+# PNNI1.0 pp. 186...187
+#
+start restart 0x46
+ connid
+ restart
+ unrec
+end
+
+#########################################################################
+#
+# RESTART ACKNOWLEDGE message
+#
+# References:
+# Q.2931 p. 26
+# UNI4.0 p. 7
+# PNNI1.0 p. 187
+#
+start restart_ack 0x4e
+ connid
+ restart
+ unrec
+end
+
+#########################################################################
+#
+# ADD PARTY message
+#
+# References:
+# Q.2971 10, 47
+# UNI4.0 39, 43-44
+# PNNI1.0 188...189
+#
+# Notes:
+#
+start add_party 0x80
+ aal
+ bhli
+ blli
+ called
+ calledsub UNI_NUM_IE_CALLEDSUB
+ calling
+ callingsub UNI_NUM_IE_CALLINGSUB
+ scompl - !pnni
+ tns UNI_NUM_IE_TNS
+ epref
+ notify
+ eetd
+ uu - !pnni
+ git UNI_NUM_IE_GIT
+ lij_seqno - !pnni
+ calling_soft - pnni
+ called_soft - pnni
+ dtl UNI_NUM_IE_DTL/R pnni
+ unrec
+end
+
+#########################################################################
+#
+# ADD PARTY ACKNOWLEDGE message
+#
+# References:
+# Q.2971 10, 42, 47
+# UNI4.0 39
+# PNNI1.0 189
+#
+# Notes:
+#
+start add_party_ack 0x81
+ epref
+ aal
+ blli
+ notify
+ eetd
+ conned
+ connedsub
+ uu - !pnni
+ git UNI_NUM_IE_GIT
+ called_soft - pnni
+ unrec
+end
+
+#########################################################################
+#
+# PARTY ALERTING message
+#
+# References:
+# Q.2971 12, 49
+# UNI4.0 39
+# PNNI1.0 189...190
+#
+# Notes:
+#
+start party_alerting 0x85
+ epref
+ notify
+ uu - !pnni
+ git UNI_NUM_IE_GIT
+ unrec
+end
+
+#########################################################################
+#
+# ADD PARTY REJECT message
+#
+# References:
+# Q.2971 12, 48
+# UNI4.0 40
+# PNNI1.0 190
+#
+# Notes:
+#
+start add_party_rej 0x82
+ cause
+ epref
+ uu - !pnni
+ git UNI_NUM_IE_GIT
+ crankback - pnni
+ unrec
+end
+
+#########################################################################
+#
+# DROP PARTY message
+#
+# References:
+# Q.2971 13, 48
+# UNI4.0 40
+# PNNI1.0 191
+#
+# Notes:
+#
+start drop_party 0x83
+ cause
+ epref
+ notify
+ uu - !pnni
+ git UNI_NUM_IE_GIT
+ unrec
+end
+
+#########################################################################
+#
+# DROP PARTY ACKNOWLEDGE message
+#
+# References:
+# Q.2971 13, 49
+# UNI4.0 40
+# PNNI1.0 191
+#
+# Notes:
+#
+start drop_party_ack 0x84
+ epref
+ cause
+ uu - !pnni
+ git UNI_NUM_IE_GIT
+ unrec
+end
+
+#########################################################################
+#
+# LEAF SETUP REQUEST message
+#
+# References:
+# UNI4.0 45...46
+#
+# Notes:
+#
+start leaf_setup_req 0x91 !pnni
+ tns UNI_NUM_IE_TNS
+ calling
+ callingsub UNI_NUM_IE_CALLINGSUB
+ called
+ calledsub UNI_NUM_IE_CALLEDSUB
+ lij_callid
+ lij_seqno
+ unrec
+end
+
+#########################################################################
+#
+# LEAF SETUP FAIL message
+#
+# References:
+# UNI4.0 45...46
+#
+# Notes:
+#
+start leaf_setup_fail 0x90 !pnni
+ cause
+ called
+ calledsub
+ lij_seqno
+ tns UNI_NUM_IE_TNS
+ unrec
+end
+
+#########################################################################
+#
+# CO-BI SETUP message
+#
+# References:
+# Q.2932.1 16
+#
+# Notes:
+#
+start cobisetup 0x15 !pnni&&q2932
+ facility
+ called
+ calledsub
+ calling
+ notify
+ unrec
+end
+
+#########################################################################
+#
+# FACILITY message
+#
+# References:
+# Q.2932.1 14...15
+#
+# Notes:
+#
+start facility 0x62 !pnni&&q2932
+ facility
+ called
+ calledsub
+ calling
+ notify
+ unrec
+end
+
+#########################################################################
+#
+# MODIFY REQUEST message
+#
+# References:
+# Q.2963.1 p. 6
+# Q.2963.4 p. 4
+# UNI4.0-MFY p. 3
+#
+start modify_req 0x88 !pnni
+ traffic
+ atraffic
+ mintraffic
+ notify
+ git UNI_NUM_IE_GIT
+ unrec
+end
+
+#########################################################################
+#
+# MODIFY ACKNOWLEDGE message
+#
+# References:
+# Q.2963.1 p.6
+# Q.2963.3 p.5
+# UNI4.0-MFY p.3
+#
+start modify_ack 0x89 !pnni
+ report
+ traffic
+ notify
+ git UNI_NUM_IE_GIT
+ unrec
+end
+
+#########################################################################
+#
+# MODIFY REJECT message
+#
+# References:
+# Q.2963 p.6
+# UNI4.0-MFY p.3
+#
+start modify_rej 0x8a !pnni
+ cause
+ notify
+ git UNI_NUM_IE_GIT
+ unrec
+end
+
+#########################################################################
+#
+# CONNECTION AVAILABLE message
+#
+# References:
+# Q.2931A4 9...10
+# Q.2963 p.6
+# UNI4.0-MFY p.3
+#
+start conn_avail 0x8b !pnni
+ notify
+ git UNI_NUM_IE_GIT
+ report
+ unrec
+end
+
+#########################################################################
+#
+# UNKNOWN message
+#
+start unknown 0x100
+ epref
+ unrec
+end
diff --git a/sys/contrib/ngatm/netnatm/msg/parseie.awk b/sys/contrib/ngatm/netnatm/msg/parseie.awk
new file mode 100644
index 0000000..14bd0f8
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/parseie.awk
@@ -0,0 +1,150 @@
+#
+# Copyright (c) 2001-2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Hartmut Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/msg/parseie.awk,v 1.3 2003/09/19 11:58:15 hbb Exp $
+#
+# Parse the IE definition file
+#
+match($0, "Begemot:")!=0 {
+ gsub("^[^$]*", "")
+ gsub("[^$]*$", "")
+ id = $0
+ next
+}
+
+/^#/ {
+ next
+}
+NF == 0 {
+ next
+}
+
+BEGIN {
+ iecnt = 0
+ id = " * ???"
+ begin()
+}
+
+END {
+ end()
+}
+
+#
+# Syntax is:
+# element <name> <code> <coding> [<maxlen> [<options>*]]
+#
+$1=="element" {
+ if(iecnt == 0) first_element()
+ if(NF < 4) {
+ error("Bad number of args: " $0)
+ }
+ ie = $2
+ file = $2
+ number = parse_hex($3)
+ coding = $4
+ if(coding == "itu") {
+ ncoding = 0
+ } else if(coding == "net") {
+ ncoding = 3
+ } else {
+ error("bad coding " coding)
+ }
+ if(NF == 4) {
+ element_default()
+ file=""
+ } else {
+ len = $5
+ parse_options()
+ element()
+ }
+ ies[iecnt] = ie
+ codings[iecnt] = coding
+ files[iecnt] = file
+ iecnt++
+ next
+}
+
+{
+ error("Bad line: " $0)
+}
+
+function parse_options() {
+ access = 0
+ cond = ""
+ for(i = 6; i <= NF; i++) {
+ if($i == "access") {
+ access = 1
+ } else if($i == "-") {
+ } else if(index($i, "file=") == 1) {
+ file=substr($i, 6)
+ } else {
+ if(cond != "") {
+ error("Too many conditions: "$0)
+ }
+ cond = $i
+ }
+ }
+}
+
+function parse_hex(str, n)
+{
+ n = 0
+ if(substr(str,1,2) != "0x") {
+ error("bad hex number" str)
+ }
+ for(i = 3; i <= length(str); i++) {
+ c = substr(str,i,1)
+ if(match(c,"[0-9]") != 0) {
+ n = 16 * n + c
+ } else if(match(c,"[a-f]")) {
+ if(c == "a") n = 16 * n + 10
+ if(c == "b") n = 16 * n + 11
+ if(c == "c") n = 16 * n + 12
+ if(c == "d") n = 16 * n + 13
+ if(c == "e") n = 16 * n + 14
+ if(c == "f") n = 16 * n + 15
+ } else if(match(c,"[A-F]")) {
+ if(c == "A") n = 16 * n + 10
+ if(c == "B") n = 16 * n + 11
+ if(c == "C") n = 16 * n + 12
+ if(c == "D") n = 16 * n + 13
+ if(c == "E") n = 16 * n + 14
+ if(c == "F") n = 16 * n + 15
+ } else {
+ error("bad hex digit '" c "'")
+ }
+ }
+ return n
+}
+
+# function error(str)
+# {
+# print "error:" str >"/dev/stderr"
+# exit 1
+# }
+
diff --git a/sys/contrib/ngatm/netnatm/msg/parsemsg.awk b/sys/contrib/ngatm/netnatm/msg/parsemsg.awk
new file mode 100644
index 0000000..ff13874
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/parsemsg.awk
@@ -0,0 +1,138 @@
+#
+# Copyright (c) 2001-2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Hartmut Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/msg/parsemsg.awk,v 1.3 2003/09/19 11:58:15 hbb Exp $
+#
+# Parse the message definition file
+#
+match($0, "Begemot:")!=0 {
+ gsub("^[^$]*", "")
+ gsub("[^$]*$", "")
+ id = $0
+ next
+}
+
+/^#/ {
+ next
+}
+NF == 0 {
+ next
+}
+BEGIN {
+ state=0
+ id = " * ???"
+ mcnt=0
+ begin()
+}
+END {
+ end()
+}
+
+state==0 && $1=="start" {
+ if(NF < 3) error("bad number of fields in message start "$0)
+ state = 1
+ msg = $2
+ code = parse_hex($3)
+ messages[mcnt] = msg
+ msgcond[mcnt] = $4
+ msgrep = 0
+ msgrepie = 0
+ cnt = 0
+ if(mcnt == 0) first_entry()
+ start_message()
+ next
+}
+
+state==1 && $1=="end" {
+ state=0
+ mcnt++
+ end_message()
+ next
+}
+state==1 {
+ iename[cnt]=$1
+ if($2 == "") $2="-"
+ if(match($2, "[A-Za-z][A-Za-z0-9_]*/R") == 1) {
+ ienum[cnt]=substr($2, 1, length($2)-2)
+ ierep[cnt]=1
+ msgrepie=1
+ } else {
+ ierep[cnt]=0
+ ienum[cnt]=$2
+ }
+ if(ienum[cnt] != "-") msgrep = 1
+ if($3 == "" || $3 == "-") {
+ $3 = "1"
+ } else {
+ gsub("[a-zA-Z][a-zA-Z0-9]*", "cx->&", $3)
+ }
+ iecond[cnt] = $3
+ cnt++
+ next
+}
+
+{
+ error("bad line: "$0)
+}
+
+function parse_hex(str, n)
+{
+ n = 0
+ if(substr(str,1,2) != "0x") {
+ error("bad hex number" str)
+ }
+ for(i = 3; i <= length(str); i++) {
+ c = substr(str,i,1)
+ if(match(c,"[0-9]") != 0) {
+ n = 16 * n + c
+ } else if(match(c,"[a-f]")) {
+ if(c == "a") n = 16 * n + 10
+ if(c == "b") n = 16 * n + 11
+ if(c == "c") n = 16 * n + 12
+ if(c == "d") n = 16 * n + 13
+ if(c == "e") n = 16 * n + 14
+ if(c == "f") n = 16 * n + 15
+ } else if(match(c,"[A-F]")) {
+ if(c == "A") n = 16 * n + 10
+ if(c == "B") n = 16 * n + 11
+ if(c == "C") n = 16 * n + 12
+ if(c == "D") n = 16 * n + 13
+ if(c == "E") n = 16 * n + 14
+ if(c == "F") n = 16 * n + 15
+ } else {
+ error("bad hex digit '" c "'")
+ }
+ }
+ return n
+}
+
+function error(str)
+{
+ print "error:" str >"/dev/stderr"
+ exit 1
+}
diff --git a/sys/contrib/ngatm/netnatm/msg/priv.h b/sys/contrib/ngatm/netnatm/msg/priv.h
new file mode 100644
index 0000000..aa13fc4
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/priv.h
@@ -0,0 +1,119 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/msg/priv.h,v 1.4 2003/10/10 14:50:05 hbb Exp $
+ *
+ * Private definitions for the IE code file.
+ */
+#ifndef unimsg_priv_h
+#define unimsg_priv_h
+
+#ifdef _KERNEL
+#include <sys/systm.h>
+#include <machine/stdarg.h>
+#define PANIC(X) panic X
+#else
+#include <stdio.h>
+#include <stdarg.h>
+#include <stdlib.h>
+#define PANIC(X) abort()
+#endif
+
+/*
+ * Define a structure for the declaration of information elements.
+ * For each coding scheme a quadrupel of check, print, encode and
+ * decode functions must be defined. A structure of the same format
+ * is used for messages.
+ */
+typedef void (*uni_print_f)(const union uni_ieall *, struct unicx *);
+typedef int (*uni_check_f)(union uni_ieall *, struct unicx *);
+typedef int (*uni_encode_f)(struct uni_msg *, union uni_ieall *,
+ struct unicx *);
+typedef int (*uni_decode_f)(union uni_ieall *, struct uni_msg *, u_int,
+ struct unicx *);
+
+typedef void (*uni_msg_print_f)(const union uni_msgall *, struct unicx *);
+typedef int (*uni_msg_check_f)(struct uni_all *, struct unicx *);
+typedef int (*uni_msg_encode_f)(struct uni_msg *, union uni_msgall *,
+ struct unicx *);
+typedef int (*uni_msg_decode_f)(union uni_msgall *, struct uni_msg *,
+ enum uni_ietype, struct uni_iehdr *, u_int, struct unicx *);
+
+struct iedecl {
+ u_int flags; /* information element flags */
+ u_int maxlen; /* maximum size */
+ uni_print_f print;
+ uni_check_f check;
+ uni_encode_f encode;
+ uni_decode_f decode;
+};
+
+struct msgdecl {
+ u_int flags;
+ const char *name;
+ uni_msg_print_f print;
+ uni_msg_check_f check;
+ uni_msg_encode_f encode;
+ uni_msg_decode_f decode;
+};
+
+enum {
+ UNIFL_DEFAULT = 0x0001,
+ UNIFL_ACCESS = 0x0002,
+};
+
+extern const struct iedecl *uni_ietable[256][4];
+extern const struct msgdecl *uni_msgtable[256];
+
+/*
+ * Need to check range here because declaring a variable as a enum does not
+ * guarantee that the values will be legal.
+ */
+#define GET_IEDECL(IE, CODING) \
+({ \
+ const struct iedecl *_decl = NULL; \
+ \
+ if((CODING) <= 3 && (IE) <= 255) \
+ if((_decl = uni_ietable[IE][CODING]) != NULL) \
+ if((_decl->flags & UNIFL_DEFAULT) != 0) \
+ if((_decl = uni_ietable[IE][0]) == NULL) \
+ PANIC(("IE %02x,%02x -- no default", CODING,IE));\
+ _decl; \
+})
+
+
+enum {
+ DEC_OK,
+ DEC_ILL,
+ DEC_ERR,
+};
+
+void uni_print_ie_internal(enum uni_ietype, const union uni_ieall *,
+ struct unicx *);
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/msg/privmsg.c b/sys/contrib/ngatm/netnatm/msg/privmsg.c
new file mode 100644
index 0000000..3540efd
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/privmsg.c
@@ -0,0 +1,275 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/msg/privmsg.c,v 1.8 2003/10/10 14:50:05 hbb Exp $
+ *
+ * Private definitions for the MSG code file.
+ *
+ * This file is included at the begin of the automatically generated
+ * uni_msg.c.
+ */
+
+/*
+ * Decode a UNI message header.
+ * Return values:
+ * 0 - ok
+ * -1 - ignore message (proto, length, CR error)
+ */
+int
+uni_decode_head(struct uni_msg *msg, struct uni_all *out,
+ struct unicx *cx __unused)
+{
+ u_int mlen;
+
+ cx->errcnt = 0;
+ (void)memset(out, 0, sizeof(struct uni_all));
+
+ if(uni_msg_len(msg) < 9)
+ return -1; /* Q.2931 5.6.2 */
+ if(cx->pnni) {
+ if(*msg->b_rptr++ != PNNI_PROTO)
+ return -1; /* Q.2931 5.6.1 */
+ } else {
+ if(*msg->b_rptr++ != UNI_PROTO)
+ return -1; /* Q.2931 5.6.1 */
+ }
+ if(*msg->b_rptr++ != 3)
+ return -1; /* Q.2931 5.6.3.1 */
+
+ out->u.hdr.cref.flag = (*msg->b_rptr & 0x80) ? 1 : 0;
+ out->u.hdr.cref.cref = (*msg->b_rptr++ & 0x7f) << 16;
+ out->u.hdr.cref.cref |= *msg->b_rptr++ << 8;
+ out->u.hdr.cref.cref |= *msg->b_rptr++;
+
+ out->mtype = *msg->b_rptr++;
+
+ /*
+ * Be not too piggy about this byte
+ */
+ switch(*msg->b_rptr & 0x13) {
+
+ case 0x00: case 0x01: case 0x02: case 0x03:
+ out->u.hdr.act = UNI_MSGACT_DEFAULT;
+ break;
+
+ case 0x10: case 0x11: case 0x12:
+ out->u.hdr.act = *msg->b_rptr & 0x3;
+ break;
+
+ case 0x13: /* Q.2931 5.7.1 */
+ out->u.hdr.act = UNI_MSGACT_REPORT;
+ break;
+ }
+ if(cx->pnni && (*msg->b_rptr & 0x08))
+ out->u.hdr.pass = 1;
+ else
+ out->u.hdr.pass = 0;
+
+ msg->b_rptr++;
+
+ mlen = *msg->b_rptr++ << 8;
+ mlen |= *msg->b_rptr++;
+
+ /*
+ * If the message is longer than the indicated length
+ * shorten it. If it is shorter, probably one of the IE
+ * decoders will break, but we should proceed. 5.5.6.5
+ */
+#if 0
+ if(uni_msg_len(msg) > mlen)
+ msg->b_wptr = msg->b_rptr + mlen;
+#endif
+
+ return 0;
+}
+
+static int
+uni_decode_body_internal(enum uni_msgtype mtype, struct uni_msg *msg,
+ union uni_msgall *out, struct unicx *cx)
+{
+ enum uni_ietype ietype;
+ struct uni_iehdr hdr;
+ u_int ielen;
+ const struct iedecl *iedecl;
+ int err = 0, ret;
+ u_char *end;
+
+ cx->ielast = (enum uni_ietype)0;
+ cx->repeat.h.present = 0;
+
+ while (uni_msg_len(msg) != 0) {
+ if (uni_decode_ie_hdr(&ietype, &hdr, msg, cx, &ielen)) {
+ /*
+ * Short header. Set the ielen to an impossible size.
+ * Then we should bump out in the error handling below.
+ * We should have at least an IE type here.
+ */
+ ielen = 0xffffffff;
+ }
+#ifdef DTRACE
+ printf("IE %x\n", ietype);
+#endif
+
+ if ((iedecl = GET_IEDECL(ietype, hdr.coding)) == NULL ||
+ ietype == UNI_IE_UNREC) {
+ /*
+ * entirly unknown IE. Check the length and skip it.
+ * Q.2931 5.6.8.1
+ */
+ if (ielen > uni_msg_len(msg))
+ msg->b_rptr = msg->b_wptr;
+ else
+ msg->b_rptr += ielen;
+ UNI_SAVE_IERR(cx, ietype, hdr.act, UNI_IERR_UNK);
+ err = -1;
+ continue;
+ }
+#ifdef DTRACE
+ printf("IE %x known\n", ietype);
+#endif
+ if (ielen > iedecl->maxlen - 4 || ielen > uni_msg_len(msg)) {
+ /*
+ * Information element too long -> content error.
+ * Let the decoding routine set the error flag and
+ * return DEC_ERR.
+ * Q.2931 5.6.8.2
+ */
+#if 0
+ /*
+ * It is not clear how to best handle this error.
+ */
+ if (ielen > iedecl->maxlen - 4)
+ ielen = iedecl->maxlen - 4;
+#endif
+
+ if (ielen > uni_msg_len(msg))
+ ielen = uni_msg_len(msg);
+
+ hdr.present |= UNI_IE_ERROR;
+
+#ifdef DTRACE
+ printf("IE %x length too large\n", ietype);
+#endif
+ }
+
+#ifdef DTRACE
+ else
+ printf("IE %x length ok\n", ietype);
+#endif
+ end = msg->b_rptr + ielen;
+ ret = uni_msgtable[mtype]->decode(out, msg, ietype,
+ &hdr, ielen, cx);
+ msg->b_rptr = end;
+
+#ifdef DTRACE
+ printf("IE %x ret %d\n", ietype, ret);
+#endif
+
+ switch (ret) {
+
+ case DEC_OK: /* ok */
+ break;
+
+ case DEC_ILL: /* illegal IE */
+ /*
+ * Unexpected but recognized.
+ * Q.2931 5.6.8.3
+ */
+ UNI_SAVE_IERR(cx, ietype, hdr.act, UNI_IERR_UNK);
+ err = -1;
+ break;
+
+ case DEC_ERR: /* bad IE */
+ if (iedecl->flags & UNIFL_ACCESS)
+ /* this may be wrong: 5.6.8.2 */
+ UNI_SAVE_IERR(cx, ietype, hdr.act, UNI_IERR_ACC);
+ else
+ UNI_SAVE_IERR(cx, ietype, hdr.act, UNI_IERR_BAD);
+ err = -1;
+ break;
+
+ default:
+ PANIC(("bad decode return"));
+ }
+ cx->ielast = ietype;
+ if (ietype != UNI_IE_REPEAT)
+ cx->repeat.h.present = 0;
+ }
+ return err;
+}
+
+/*
+ * Decode the body of a message. The header is assumed to be decoded
+ * already and out->hdr is filled in. Only information elements remain.
+ */
+int
+uni_decode_body(struct uni_msg *msg, struct uni_all *out, struct unicx *cx)
+{
+ cx->errcnt = 0;
+ if (out->mtype >= 256)
+ return (-1);
+ if (uni_msgtable[out->mtype] == NULL)
+ return (-1);
+ return (uni_decode_body_internal(out->mtype, msg, &out->u, cx));
+}
+
+
+/*
+ * Decode a uni message
+ */
+int
+uni_decode(struct uni_msg *msg, struct uni_all *out, struct unicx *cx)
+{
+ cx->errcnt = 0;
+ if (uni_decode_head(msg, out, cx))
+ return (-1);
+ if (uni_decode_body(msg, out, cx))
+ return (-2);
+ return (0);
+}
+
+int
+uni_encode(struct uni_msg *msg, struct uni_all *in, struct unicx *cx)
+{
+ if (in->mtype >= 256)
+ return (-1);
+ if (uni_msgtable[in->mtype] == NULL)
+ return (-3);
+
+ return ((uni_msgtable[in->mtype]->encode)(msg, &in->u, cx));
+}
+
+/*
+ * Doesn't belong here
+ */
+void
+uni_initcx(struct unicx *cx)
+{
+ memset(cx, 0, sizeof(struct unicx));
+ cx->tabsiz = 4;
+}
diff --git a/sys/contrib/ngatm/netnatm/msg/traffic.c b/sys/contrib/ngatm/netnatm/msg/traffic.c
new file mode 100644
index 0000000..acaffdb
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/traffic.c
@@ -0,0 +1,406 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/msg/traffic.c,v 1.4 2004/07/08 08:22:05 brandt Exp $
+ *
+ * Traffic classification
+ */
+
+#include <netnatm/unimsg.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#ifdef _KERNEL
+#include <sys/systm.h>
+#else
+#include <stdio.h>
+#endif
+
+/*
+ * Try to set the parameters for the CPCS from the parameters of the
+ * connection.
+ */
+enum {
+ T_CBR23 = 100, T_nrtVBR2_6_UBR12, T_rtVBR236, T_rtVBR2_6
+};
+
+static const u_int fmask = UNI_TRAFFIC_FPCR0_P | UNI_TRAFFIC_FPCR1_P |
+ UNI_TRAFFIC_FSCR0_P | UNI_TRAFFIC_FSCR1_P | UNI_TRAFFIC_FMBS0_P |
+ UNI_TRAFFIC_FMBS1_P | UNI_TRAFFIC_FABR1_P;
+static const u_int bmask = UNI_TRAFFIC_BPCR0_P | UNI_TRAFFIC_BPCR1_P |
+ UNI_TRAFFIC_BSCR0_P | UNI_TRAFFIC_BSCR1_P | UNI_TRAFFIC_BMBS0_P |
+ UNI_TRAFFIC_BMBS1_P | UNI_TRAFFIC_BABR1_P;
+
+static const u_int fcbr3 = UNI_TRAFFIC_FPCR0_P | UNI_TRAFFIC_FPCR1_P;
+static const u_int bcbr3 = UNI_TRAFFIC_BPCR0_P | UNI_TRAFFIC_BPCR1_P;
+static const u_int fvbr16 = UNI_TRAFFIC_FPCR1_P | UNI_TRAFFIC_FSCR1_P |
+ UNI_TRAFFIC_FMBS1_P;
+static const u_int bvbr16 = UNI_TRAFFIC_BPCR1_P | UNI_TRAFFIC_BSCR1_P |
+ UNI_TRAFFIC_BMBS1_P;
+static const u_int fvbr23 = UNI_TRAFFIC_FPCR1_P | UNI_TRAFFIC_FSCR0_P |
+ UNI_TRAFFIC_FMBS0_P;
+static const u_int bvbr23 = UNI_TRAFFIC_BPCR1_P | UNI_TRAFFIC_BSCR0_P |
+ UNI_TRAFFIC_BMBS0_P;
+static const u_int fvbr4 = UNI_TRAFFIC_FPCR0_P | UNI_TRAFFIC_FPCR1_P;
+static const u_int bvbr4 = UNI_TRAFFIC_BPCR0_P | UNI_TRAFFIC_BPCR1_P;
+
+int
+uni_classify_traffic(const struct uni_ie_bearer *bearer,
+ const struct uni_ie_traffic *traffic,
+ enum uni_traffic_class *fclass, enum uni_traffic_class *bclass,
+ char *ebuf, size_t ebufsiz)
+{
+ u_int tclass;
+ u_int ft, bt, be, ftag, btag;
+
+ /* classify */
+ switch (bearer->bclass) {
+
+ case UNI_BEARER_A:
+ if (!(bearer->h.present & UNI_BEARER_ATC_P)) {
+ tclass = T_CBR23;
+ break;
+ }
+ switch (bearer->atc) {
+
+ case UNI_BEARER_ATC_CBR1:
+ tclass = UNI_TRAFFIC_CBR1;
+ break;
+
+ default:
+ snprintf(ebuf, ebufsiz, "bad ATC=%#02x for BCOB-A",
+ bearer->atc);
+ return (-1);
+ }
+ break;
+
+ case UNI_BEARER_C:
+ if (!(bearer->h.present & UNI_BEARER_ATC_P)) {
+ tclass = T_nrtVBR2_6_UBR12;
+ break;
+ }
+ switch (bearer->atc) {
+
+ case UNI_BEARER_ATC_VBR1:
+ tclass = UNI_TRAFFIC_rtVBR1;
+ break;
+
+ case UNI_BEARER_ATC_VBR:
+ tclass = T_rtVBR236;
+ break;
+
+ case UNI_BEARER_ATC_NVBR1:
+ tclass = UNI_TRAFFIC_nrtVBR1;
+ break;
+
+ case UNI_BEARER_ATC_ABR:
+ tclass = UNI_TRAFFIC_ABR;
+ break;
+
+ default:
+ snprintf(ebuf, ebufsiz, "bad ATC=%#02x for BCOB-C",
+ bearer->atc);
+ return (-1);
+ }
+ break;
+
+ case UNI_BEARER_X:
+ if (!(bearer->h.present & UNI_BEARER_ATC_P)) {
+ tclass = T_nrtVBR2_6_UBR12;
+ break;
+ }
+ switch (bearer->atc) {
+
+ case UNI_BEARER_ATC_CBR1:
+ tclass = UNI_TRAFFIC_CBR1;
+ break;
+
+ case UNI_BEARER_ATC_CBR:
+ case UNI_BEARER_ATCX_4:
+ case UNI_BEARER_ATCX_6:
+ tclass = T_CBR23;
+ break;
+
+ case UNI_BEARER_ATC_VBR1:
+ tclass = UNI_TRAFFIC_rtVBR1;
+ break;
+
+ case UNI_BEARER_ATCX_1:
+ case UNI_BEARER_ATC_VBR:
+ tclass = T_rtVBR2_6;
+ break;
+
+ case UNI_BEARER_ATC_NVBR1:
+ tclass = UNI_TRAFFIC_nrtVBR1;
+ break;
+
+ case UNI_BEARER_ATCX_0:
+ case UNI_BEARER_ATCX_2:
+ case UNI_BEARER_ATCX_8:
+ case UNI_BEARER_ATC_NVBR:
+ tclass = T_nrtVBR2_6_UBR12;
+ break;
+
+ case UNI_BEARER_ATC_ABR:
+ tclass = UNI_TRAFFIC_ABR;
+ break;
+
+ default:
+ snprintf(ebuf, ebufsiz, "bad ATC=%#02x for BCOB-X",
+ bearer->atc);
+ return (-1);
+ }
+ break;
+
+ case UNI_BEARER_TVP:
+ snprintf(ebuf, ebufsiz, "unsupported bearer class tVP");
+ return (-1);
+
+ default:
+ snprintf(ebuf, ebufsiz, "bad bearer class %#02x",
+ bearer->bclass);
+ return (-1);
+ }
+
+ /*
+ * Now traffic IE
+ */
+ ft = traffic->h.present & fmask;
+ bt = traffic->h.present & bmask;
+ be = traffic->h.present & UNI_TRAFFIC_BEST_P;
+ ftag = (traffic->h.present & UNI_TRAFFIC_MOPT_P) && traffic->t.ftag;
+ btag = (traffic->h.present & UNI_TRAFFIC_MOPT_P) && traffic->t.btag;
+
+#define NOBE(C) \
+ if (be) { \
+ snprintf(ebuf, ebufsiz, "illegal BE for " C); \
+ return (-1); \
+ }
+
+#define NOFT(C) \
+ if (ftag) { \
+ snprintf(ebuf, ebufsiz, "illegal forward tag in " C); \
+ return (-1); \
+ }
+
+#define NOBT(C) \
+ if (btag) { \
+ snprintf(ebuf, ebufsiz, "illegal backward tag in " C); \
+ return (-1); \
+ }
+
+#define FBAD(C) do { \
+ snprintf(ebuf, ebufsiz, "bad forward CRs for " C); \
+ return (-1); \
+ } while (0)
+
+#define BBAD(C) do { \
+ snprintf(ebuf, ebufsiz, "bad backward CRs for " C); \
+ return (-1); \
+ } while (0)
+
+ switch (tclass) {
+
+ case UNI_TRAFFIC_CBR1:
+ NOBE("CBR.1");
+ if (ft != UNI_TRAFFIC_FPCR1_P)
+ FBAD("CBR.1");
+ NOFT("CBR.1");
+ if (bt != UNI_TRAFFIC_BPCR1_P)
+ BBAD("CBR.1");
+ NOBT("CBR.1");
+ *fclass = *bclass = UNI_TRAFFIC_CBR1;
+ break;
+
+ case T_CBR23:
+ NOBE("CBR.2/3");
+ if (ft == UNI_TRAFFIC_FPCR0_P) {
+ *fclass = UNI_TRAFFIC_CBR2;
+ NOFT("CBR.2");
+ } else if (ft == fcbr3) {
+ *fclass = UNI_TRAFFIC_CBR3;
+ if (!ftag) {
+ snprintf(ebuf, ebufsiz, "need forward tagging for CBR.3");
+ return (-1);
+ }
+ } else
+ FBAD("CBR.2/3");
+ if (bt == UNI_TRAFFIC_BPCR0_P) {
+ *bclass = UNI_TRAFFIC_CBR2;
+ NOBT("CBR.2");
+ } else if (bt == bcbr3) {
+ *bclass = UNI_TRAFFIC_CBR3;
+ if (!btag) {
+ snprintf(ebuf, ebufsiz, "need backward tagging for CBR.3");
+ return (-1);
+ }
+ } else
+ BBAD("CBR.2/3");
+ break;
+
+ case UNI_TRAFFIC_rtVBR1:
+ NOBE("rtVBR.1");
+ if (ft != fvbr16)
+ FBAD("rtVBR.1");
+ NOFT("rtVBR.1");
+ if (bt != bvbr16)
+ BBAD("rtVBR.1");
+ NOBT("rtVBR.1");
+ *fclass = *bclass = UNI_TRAFFIC_rtVBR1;
+ break;
+
+ case T_rtVBR236:
+ NOBE("rtVBR.2/3/6");
+ if (ft == fvbr23) {
+ if (ftag)
+ *fclass = UNI_TRAFFIC_rtVBR3;
+ else
+ *fclass = UNI_TRAFFIC_rtVBR2;
+ } else if (ft == fvbr16) {
+ *fclass = UNI_TRAFFIC_rtVBR6;
+ NOFT("rtVBR.6");
+ } else
+ FBAD("rtVBR.2/3/6");
+ if (bt == bvbr23) {
+ if (btag)
+ *bclass = UNI_TRAFFIC_rtVBR3;
+ else
+ *bclass = UNI_TRAFFIC_rtVBR2;
+ } else if (bt == bvbr16) {
+ *bclass = UNI_TRAFFIC_rtVBR6;
+ NOBT("rtVBR.6");
+ } else
+ BBAD("rtVBR.2/3/6");
+ break;
+
+ case T_rtVBR2_6:
+ NOBE("rtVBR.2-6");
+ if (ft == fvbr23) {
+ if (ftag)
+ *fclass = UNI_TRAFFIC_rtVBR3;
+ else
+ *fclass = UNI_TRAFFIC_rtVBR2;
+ } else if (ft == fvbr4) {
+ *fclass = UNI_TRAFFIC_rtVBR4;
+ } else if (ft == UNI_TRAFFIC_FPCR1_P) {
+ *fclass = UNI_TRAFFIC_rtVBR5;
+ NOFT("rtVBR.5");
+ } else if (ft == fvbr16) {
+ *fclass = UNI_TRAFFIC_rtVBR6;
+ NOFT("rtVBR.6");
+ } else
+ FBAD("rtVBR.2-6");
+ if (bt == bvbr23) {
+ if (btag)
+ *bclass = UNI_TRAFFIC_rtVBR3;
+ else
+ *bclass = UNI_TRAFFIC_rtVBR2;
+ } else if (bt == bvbr4) {
+ *bclass = UNI_TRAFFIC_rtVBR4;
+ } else if (bt == UNI_TRAFFIC_BPCR1_P) {
+ *bclass = UNI_TRAFFIC_rtVBR5;
+ NOBT("rtVBR.5");
+ } else if (bt == bvbr16) {
+ *bclass = UNI_TRAFFIC_rtVBR6;
+ NOBT("rtVBR.6");
+ } else
+ BBAD("rtVBR.2-6");
+ break;
+
+ case UNI_TRAFFIC_nrtVBR1:
+ NOBE("nrtVBR.1");
+ if (ft != fvbr16)
+ FBAD("nrtVBR.1");
+ NOFT("nrtVBR.1");
+ if (bt != bvbr16)
+ BBAD("nrtVBR.1");
+ NOBT("nrtVBR.1");
+ *fclass = *bclass = UNI_TRAFFIC_nrtVBR1;
+ break;
+
+ case T_nrtVBR2_6_UBR12:
+ if (be) {
+ if (ft != UNI_TRAFFIC_FPCR1_P)
+ FBAD("UBR.1/2");
+ if (bt != UNI_TRAFFIC_BPCR1_P)
+ BBAD("UBR.1/2");
+ if (ftag)
+ *fclass = UNI_TRAFFIC_UBR2;
+ else
+ *fclass = UNI_TRAFFIC_UBR1;
+ if (btag)
+ *bclass = UNI_TRAFFIC_UBR2;
+ else
+ *bclass = UNI_TRAFFIC_UBR1;
+ break;
+ }
+ if (ft == fvbr23) {
+ if (ftag)
+ *fclass = UNI_TRAFFIC_nrtVBR3;
+ else
+ *fclass = UNI_TRAFFIC_nrtVBR2;
+ } else if (ft == fvbr4) {
+ *fclass = UNI_TRAFFIC_nrtVBR4;
+ } else if (ft == UNI_TRAFFIC_FPCR1_P) {
+ *fclass = UNI_TRAFFIC_nrtVBR5;
+ NOFT("nrtVBR.5");
+ } else if (ft == fvbr16) {
+ *fclass = UNI_TRAFFIC_nrtVBR6;
+ NOFT("nrtVBR.6");
+ } else
+ FBAD("nrtVBR.2-6");
+ if (bt == bvbr23) {
+ if (btag)
+ *bclass = UNI_TRAFFIC_nrtVBR3;
+ else
+ *bclass = UNI_TRAFFIC_nrtVBR2;
+ } else if (bt == bvbr4) {
+ *bclass = UNI_TRAFFIC_nrtVBR4;
+ } else if (bt == UNI_TRAFFIC_BPCR1_P) {
+ *bclass = UNI_TRAFFIC_nrtVBR5;
+ NOBT("nrtVBR.5");
+ } else if (bt == bvbr16) {
+ *bclass = UNI_TRAFFIC_nrtVBR6;
+ NOBT("nrtVBR.6");
+ } else
+ BBAD("nrtVBR.2-6");
+ break;
+
+ case UNI_TRAFFIC_ABR:
+ NOBE("ABR");
+ if (ft != UNI_TRAFFIC_FPCR1_P)
+ FBAD("ABR");
+ if (bt != UNI_TRAFFIC_BPCR1_P)
+ BBAD("ABR");
+ NOFT("ABR");
+ NOBT("ABR");
+ *fclass = *bclass = UNI_TRAFFIC_ABR;
+ break;
+ }
+
+ return (0);
+}
diff --git a/sys/contrib/ngatm/netnatm/msg/uni_config.h b/sys/contrib/ngatm/netnatm/msg/uni_config.h
new file mode 100644
index 0000000..e53f59b
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/uni_config.h
@@ -0,0 +1,70 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/msg/uni_config.h,v 1.3 2003/09/19 11:58:15 hbb Exp $
+ */
+#ifndef _uni_uni_config_h_
+#define _uni_uni_config_h_
+
+enum {
+ /* maximum number of reported error IEs */
+ UNI_MAX_ERRIE = 50,
+
+ /* maximum number of Generic Identifier Transport IE's per message */
+ UNI_NUM_IE_GIT = 3,
+
+ /* maximum number of BLLI's in SETUP */
+ UNI_NUM_IE_BLLI = 3,
+
+ /* maximum number of CALLEDSUB's */
+ UNI_NUM_IE_CALLEDSUB = 2,
+
+ /* maximum number of CALLINGSUB's */
+ UNI_NUM_IE_CALLINGSUB = 2,
+
+ /* maximum number of TNS's */
+ UNI_NUM_IE_TNS = 4,
+
+ /* maximum length of TNS name */
+ UNI_TNS_MAXLEN = 4,
+
+ /* maximum info size in user-to-user signalling IE */
+ UNI_UU_MAXLEN = 128,
+
+ /* maximum length of address */
+ UNI_ADDR_MAXLEN = 20,
+
+ /* maximum length of subaddress */
+ UNI_SUBADDR_MAXLEN = 20,
+
+ /* maximum number of DTLs */
+ UNI_NUM_IE_DTL = 10,
+ /* maximum number of identifiers in DTL */
+ UNI_DTL_MAXNUM = 20,
+};
+#endif
diff --git a/sys/contrib/ngatm/netnatm/msg/uni_hdr.h b/sys/contrib/ngatm/netnatm/msg/uni_hdr.h
new file mode 100644
index 0000000..c9a30f1
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/uni_hdr.h
@@ -0,0 +1,220 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/msg/uni_hdr.h,v 1.6 2004/07/08 08:22:05 brandt Exp $
+ */
+#ifndef _NETNATM_MSG_UNI_HDR_H_
+#define _NETNATM_MSG_UNI_HDR_H_
+
+#include <sys/types.h>
+#ifdef _KERNEL
+#include <sys/stdint.h>
+#else
+#include <stdint.h>
+#endif
+
+#include <netnatm/msg/uni_config.h>
+
+enum {
+ UNI_PROTO = 0x09, /* protocol discriminator */
+ PNNI_PROTO = 0xf0, /* PNNI protocol discriminator */
+};
+
+/*
+ * Message types
+ */
+enum uni_msgtype {
+ UNI_UNKNOWN = 0x100,/* unknown message */
+
+ UNI_ALERTING = 0x01, /* alerting */
+ UNI_CALL_PROC = 0x02, /* call proceeding */
+ UNI_SETUP = 0x05, /* setup */
+ UNI_CONNECT = 0x07, /* connect */
+ UNI_CONNECT_ACK = 0x0f, /* connect ack */
+
+ UNI_RESTART = 0x46, /* restart */
+ UNI_RELEASE = 0x4d, /* release */
+ UNI_RESTART_ACK = 0x4e, /* restart acknowledgement */
+ UNI_RELEASE_COMPL = 0x5a, /* release complete */
+
+ UNI_NOTIFY = 0x6e, /* notify user */
+ UNI_STATUS_ENQ = 0x75, /* status enquiry */
+ UNI_STATUS = 0x7d, /* status */
+
+ UNI_ADD_PARTY = 0x80, /* add party */
+ UNI_ADD_PARTY_ACK = 0x81, /* add party acknowledgement */
+ UNI_ADD_PARTY_REJ = 0x82, /* add party reject */
+ UNI_DROP_PARTY = 0x83, /* drop party */
+ UNI_DROP_PARTY_ACK = 0x84, /* drop party acknowledgement */
+ UNI_PARTY_ALERTING = 0x85, /* party alerting */
+
+ UNI_LEAF_SETUP_FAIL = 0x90, /* leaf setup failed */
+ UNI_LEAF_SETUP_REQ = 0x91, /* leaf setup request */
+
+ UNI_COBISETUP = 0x15, /* Q.2932 COBI-setup */
+ UNI_FACILITY = 0x62, /* Q.2932 facility */
+
+ UNI_MODIFY_REQ = 0x88, /* Q.2963 Modify request */
+ UNI_MODIFY_ACK = 0x89, /* Q.2963 Modify acknowledgement */
+ UNI_MODIFY_REJ = 0x8a, /* Q.2963 Modify reject */
+ UNI_CONN_AVAIL = 0x8b, /* Q.2963 Connection available */
+};
+
+/*
+ * Information element types
+ */
+enum uni_ietype {
+ UNI_IE_CAUSE = 0x08, /* cause */
+ UNI_IE_CALLSTATE = 0x14, /* call state */
+ UNI_IE_FACILITY = 0x1C, /* Q.2932 facility IE */
+ UNI_IE_NOTIFY = 0x27, /* UNI4.0 notify */
+ UNI_IE_EETD = 0x42, /* UNI4.0 end-to-end transit delay */
+ UNI_IE_CONNED = 0x4c, /* UNI4.0/Q.2951 connected address */
+ UNI_IE_CONNEDSUB = 0x4d, /* UNI4.0/Q.2951 connected subaddress */
+ UNI_IE_EPREF = 0x54, /* endpoint reference */
+ UNI_IE_EPSTATE = 0x55, /* enpoint state */
+ UNI_IE_AAL = 0x58, /* ATM adaptation layer parameters */
+ UNI_IE_TRAFFIC = 0x59, /* ATM traffic descriptor */
+ UNI_IE_CONNID = 0x5a, /* connection identifier */
+ UNI_IE_QOS = 0x5c, /* quality of service parameter */
+ UNI_IE_BHLI = 0x5d, /* broadband higher layer information */
+ UNI_IE_BEARER = 0x5e, /* broadband bearer capability */
+ UNI_IE_BLLI = 0x5f, /* broadband lower layer information */
+ UNI_IE_LSHIFT = 0x60, /* broadband locking shift */
+ UNI_IE_NLSHIFT = 0x61, /* broadband non-locking shift */
+ UNI_IE_SCOMPL = 0x62, /* broadband sending complete */
+ UNI_IE_REPEAT = 0x63, /* broadband repeat indicator */
+ UNI_IE_CALLING = 0x6c, /* calling party number */
+ UNI_IE_CALLINGSUB = 0x6d, /* calling party subaddress */
+ UNI_IE_CALLED = 0x70, /* called party number */
+ UNI_IE_CALLEDSUB = 0x71, /* called party subaddress */
+ UNI_IE_TNS = 0x78, /* transit network selection */
+ UNI_IE_RESTART = 0x79, /* restart indicator */
+ UNI_IE_UU = 0x7e, /* UNI4.0/Q.2957 user-to-user info */
+ UNI_IE_GIT = 0x7f, /* UNI4.0 generic identifier transport*/
+ UNI_IE_MINTRAFFIC = 0x81, /* Q.2962 minimum traffic desc */
+ UNI_IE_ATRAFFIC = 0x82, /* Q.2962 alternate traffic desc */
+ UNI_IE_ABRSETUP = 0x84, /* UNI4.0 ABR setup parameters */
+ UNI_IE_REPORT = 0x89, /* Q.2963 broadband report type */
+ UNI_IE_CALLED_SOFT = 0xe0, /* PNNI Calling party soft PVPC */
+ UNI_IE_CRANKBACK = 0xe1, /* PNNI Crankback */
+ UNI_IE_DTL = 0xe2, /* PNNI designated transit list */
+ UNI_IE_CALLING_SOFT = 0xe3, /* PNNI Called party soft PVPC */
+ UNI_IE_ABRADD = 0xe4, /* UNI4.0 ABR additional parameters */
+ UNI_IE_LIJ_CALLID = 0xe8, /* UNI4.0 LIF call identifier */
+ UNI_IE_LIJ_PARAM = 0xe9, /* UNI4.0 LIF parameters */
+ UNI_IE_LIJ_SEQNO = 0xea, /* UNI4.0 LIF sequence number */
+ UNI_IE_CSCOPE = 0xeb, /* UNI4.0 connection scope selection */
+ UNI_IE_EXQOS = 0xec, /* UNI4.0 extended QoS parameters */
+ UNI_IE_MDCR = 0xf0, /* UNI4.0+ Minimum desired call rate */
+ UNI_IE_UNREC = 0xfe,
+};
+
+enum uni_coding {
+ UNI_CODING_ITU = 0x0,
+ UNI_CODING_NET = 0x3,
+};
+
+enum uni_msgact {
+ UNI_MSGACT_CLEAR = 0x0,
+ UNI_MSGACT_IGNORE = 0x1,
+ UNI_MSGACT_REPORT = 0x2,
+
+ UNI_MSGACT_DEFAULT = 0x4
+};
+
+enum uni_ieact {
+ UNI_IEACT_CLEAR = 0x00, /* clear call */
+ UNI_IEACT_IGNORE = 0x01, /* ignore IE and proceed */
+ UNI_IEACT_REPORT = 0x02, /* ignore IE, report and proceed */
+ UNI_IEACT_MSG_IGNORE = 0x05, /* ignore message */
+ UNI_IEACT_MSG_REPORT = 0x06, /* ignore message and report */
+
+ UNI_IEACT_DEFAULT = 0x08
+};
+
+struct uni_cref {
+ u_int flag;
+ u_int cref;
+};
+
+/*
+ * Message header.
+ */
+struct uni_msghdr {
+ struct uni_cref cref;
+ enum uni_msgact act; /* action indicator */
+ u_int pass:1; /* PNNI pass along request */
+};
+
+enum {
+ CREF_GLOBAL = 0,
+ CREF_DUMMY = 0x7fffff,
+};
+
+/*
+ * General information element header.
+ */
+struct uni_iehdr {
+ enum uni_coding coding; /* coding standard */
+ enum uni_ieact act; /* action indicator */
+ u_int pass : 1; /* PNNI pass along request */
+ u_int present; /* which optional elements are present */
+#define UNI_IE_EMPTY 0x80000000
+#define UNI_IE_PRESENT 0x40000000
+#define UNI_IE_ERROR 0x20000000
+#define UNI_IE_XXX 0x10000000
+#define UNI_IE_MASK 0xf0000000
+};
+
+#define IE_ISPRESENT(IE) \
+ (((IE).h.present & (UNI_IE_PRESENT|UNI_IE_EMPTY)) == UNI_IE_PRESENT)
+#define IE_SETPRESENT(IE) \
+ ((IE).h.present = ((IE).h.present & ~UNI_IE_MASK) | \
+ UNI_IE_PRESENT)
+
+#define IE_ADDPRESENT(IE) \
+ ((IE).h.present = ((IE).h.present & ~UNI_IE_EMPTY) | \
+ UNI_IE_PRESENT)
+
+#define IE_ISEMPTY(IE) \
+ (((IE).h.present & UNI_IE_MASK) == (UNI_IE_PRESENT | UNI_IE_EMPTY))
+#define IE_SETEMPTY(IE) \
+ ((IE).h.present = ((IE).h.present & ~UNI_IE_MASK) | \
+ UNI_IE_EMPTY | UNI_IE_PRESENT)
+
+#define IE_ISERROR(IE) \
+ (((IE).h.present & UNI_IE_MASK) == (UNI_IE_PRESENT | UNI_IE_ERROR))
+#define IE_SETERROR(IE) \
+ ((IE).h.present = ((IE).h.present & ~UNI_IE_MASK) | \
+ UNI_IE_ERROR | UNI_IE_PRESENT)
+
+#define IE_ISGOOD(IE) \
+ (((IE).h.present & UNI_IE_MASK) == (UNI_IE_PRESENT))
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/msg/uni_ie.c b/sys/contrib/ngatm/netnatm/msg/uni_ie.c
new file mode 100644
index 0000000..c58377c
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/uni_ie.c
@@ -0,0 +1,7164 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/msg/uni_ie.c,v 1.16 2005/05/23 12:06:30 brandt_h Exp $
+ *
+ * Private definitions for the IE code file.
+ *
+ * This file includes the table generated automatically.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+
+#ifdef _KERNEL
+#include <sys/libkern.h>
+#else
+#include <string.h>
+#endif
+#include <netnatm/unimsg.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/msg/uniprint.h>
+#include <netnatm/msg/priv.h>
+
+/*
+ * Define internal functions.
+ */
+#define DEF_IE_PRINT(Coding, IE) \
+ void uni_ie_print_##Coding##_##IE(struct uni_ie_##IE *ie, struct unicx *cx)
+
+#define DEF_IE_CHECK(Coding, IE) \
+ int uni_ie_check_##Coding##_##IE(struct uni_ie_##IE *ie, struct unicx *cx)
+
+#define DEF_IE_ENCODE(Coding, IE) \
+ int uni_ie_encode_##Coding##_##IE(struct uni_msg *msg, struct uni_ie_##IE *ie, struct unicx *cx)
+
+#define DEF_IE_DECODE(Coding, IE) \
+ int uni_ie_decode_##Coding##_##IE(struct uni_ie_##IE *ie, struct uni_msg *msg, u_int ielen, struct unicx *cx)
+
+/*
+ * This structure is used to define value->string mappings. MKT() is used
+ * to generate a table entry. EOT() to end the table.
+ */
+#define MKT(V,N) { #N, V }
+#define EOT() { NULL, 0 }
+
+/* library internal functions */
+static void uni_entry(const char *, struct unicx *);
+static int uni_print_iehdr(const char *, struct uni_iehdr *h, struct unicx *);
+static void uni_print_ieend(struct unicx *);
+static void uni_putc(int, struct unicx *);
+
+
+/*
+ * Encoding
+ */
+#define APP_BYTE(M, B) do { \
+ *(M)->b_wptr++ = (B); \
+ } while (0)
+#define APP_16BIT(M, B) do { \
+ u_int _v = (B); \
+ *(M)->b_wptr++ = _v >> 8; \
+ *(M)->b_wptr++ = _v; \
+ } while (0)
+#define APP_24BIT(M, B) do { \
+ u_int _v = (B); \
+ *(M)->b_wptr++ = _v >> 16; \
+ *(M)->b_wptr++ = _v >> 8; \
+ *(M)->b_wptr++ = _v; \
+ } while (0)
+#define APP_32BIT(M, B) do { \
+ u_int _v = (B); \
+ *(M)->b_wptr++ = _v >> 24; \
+ *(M)->b_wptr++ = _v >> 16; \
+ *(M)->b_wptr++ = _v >> 8; \
+ *(M)->b_wptr++ = _v; \
+ } while (0)
+#define APP_BUF(M, B, L) do { \
+ (void)memcpy((M)->b_wptr, (B), (L)); \
+ (M)->b_wptr += (L); \
+ } while (0)
+
+#define APP_SUB_BYTE(M, T, B) do { APP_BYTE(M, T); APP_BYTE(M, B); } while (0)
+#define APP_SUB_16BIT(M, T, B) do { APP_BYTE(M, T); APP_16BIT(M, B); } while (0)
+#define APP_SUB_24BIT(M, T, B) do { APP_BYTE(M, T); APP_24BIT(M, B); } while (0)
+#define APP_SUB_32BIT(M, T, B) do { APP_BYTE(M, T); APP_32BIT(M, B); } while (0)
+
+#define APP_OPT(M, F, P, T) do { \
+ if ((F) & (P)) \
+ APP_BYTE((M), (T)); \
+ } while (0)
+#define APP_OPT_BYTE(M, F, P, T, B) do { \
+ if ((F) & (P)) \
+ APP_SUB_BYTE((M), (T), (B)); \
+ } while (0)
+#define APP_OPT_16BIT(M, F, P, T, B) do { \
+ if ((F) & (P)) \
+ APP_SUB_16BIT((M), (T), (B)); \
+ } while (0)
+#define APP_OPT_24BIT(M, F, P, T, B) do { \
+ if ((F) & (P)) \
+ APP_SUB_24BIT((M), (T), (B)); \
+ } while (0)
+
+#define START_IE(TYPE,CODE,LEN) \
+ u_int ielen; \
+ \
+ if (uni_check_ie(CODE, (union uni_ieall *)ie, cx)) \
+ return (-1); \
+ if (uni_encode_ie_hdr(msg, CODE, &ie->h, (LEN), cx)) \
+ return (0); \
+ \
+ ielen = msg->b_wptr - msg->b_rptr - 2;
+
+#define START_IE2(TYPE,CODE,LEN,REALCODE) \
+ u_int ielen; \
+ \
+ if (uni_check_ie(CODE, (union uni_ieall *)ie, cx)) \
+ return (-1); \
+ if (uni_encode_ie_hdr(msg, REALCODE, &ie->h, (LEN), cx)) \
+ return (0); \
+ \
+ ielen = msg->b_wptr - msg->b_rptr - 2;
+
+#define SET_IE_LEN(M) do { \
+ (M)->b_buf[ielen + 0] = \
+ (((M)->b_wptr - (M)->b_rptr) - ielen - 2) >> 8; \
+ (M)->b_buf[ielen + 1] = \
+ (((M)->b_wptr - (M)->b_rptr) - ielen - 2) >> 0; \
+ } while (0)
+
+
+/***********************************************************************/
+/*
+ * Decoding
+ */
+#define IE_START(ERR) \
+ if (IE_ISPRESENT(*ie)) \
+ return (0); \
+ if (ielen == 0) { \
+ IE_SETEMPTY(*ie); \
+ return (0); \
+ }
+
+#define IE_END(IE) \
+ IE_SETPRESENT(*ie); \
+ if (uni_check_ie(UNI_IE_##IE, (union uni_ieall *)ie, cx) == 0) \
+ return (0); \
+ rej: \
+ ie->h.present = UNI_IE_ERROR | UNI_IE_PRESENT; \
+ return (1);
+
+#define DEC_GETF3(ID, F, P) \
+ case UNI_##ID##_ID: \
+ if (ielen < 3) \
+ goto rej; \
+ ielen -= 3; \
+ if (!(P & UNI_##ID##_P)) { \
+ P |= UNI_##ID##_P; \
+ ie->F = *msg->b_rptr++ << 16; \
+ ie->F |= *msg->b_rptr++ << 8; \
+ ie->F |= *msg->b_rptr++; \
+ } else \
+ msg->b_rptr += 3; \
+ break;
+
+#define DEC_GETF1(ID, F, P) \
+ case UNI_##ID##_ID: \
+ if (ielen < 1) \
+ goto rej; \
+ ielen--; \
+ if (!(P & UNI_##ID##_P)) { \
+ P |= UNI_##ID##_P; \
+ ie->F = *msg->b_rptr++; \
+ } else \
+ msg->b_rptr++; \
+ break;
+
+
+#define PRINT_NPREFIX (sizeof(((struct unicx *)0)->prefix) / \
+ sizeof(((struct unicx *)0)->prefix[0]))
+
+/*
+ * This is rather here than in privmsg.c because we need the APP macros.
+ */
+int
+uni_encode_msg_hdr(struct uni_msg *msg, struct uni_msghdr *h,
+ enum uni_msgtype type, struct unicx *cx, int *mlen)
+{
+ u_char byte;
+
+ uni_msg_ensure(msg, 9);
+
+ APP_BYTE(msg, cx->pnni ? PNNI_PROTO : UNI_PROTO);
+ APP_BYTE(msg, 3);
+ if(h->cref.cref >= 1<<23)
+ return -1;
+ APP_24BIT(msg, h->cref.cref | (h->cref.flag ? 0x800000 : 0));
+ APP_BYTE(msg, type);
+
+ byte = 0x80;
+ if(h->act != UNI_MSGACT_DEFAULT)
+ byte |= 0x10 | (h->act & 3);
+ if(cx->pnni && h->pass)
+ byte |= 0x08;
+ APP_BYTE(msg, byte);
+
+ *mlen = msg->b_wptr - msg->b_rptr;
+ APP_16BIT(msg, 0);
+
+ return 0;
+}
+
+/*
+ * Initialize printing. This must be called by all printing routines
+ * that are exported to the user.
+ */
+void
+uni_print_init(char *buf, size_t bufsiz, struct unicx *cx)
+{
+ if (cx->dont_init)
+ return;
+
+ cx->indent = 0;
+ cx->nprefix = 0;
+ cx->doindent = 0;
+ if (cx->tabsiz == 0)
+ cx->tabsiz = 4;
+ cx->buf = buf;
+ cx->bufsiz = bufsiz;
+}
+
+/*
+ * Append a character to the buffer if there is still space
+ */
+static void
+uni_putc(int c, struct unicx *cx)
+{
+ if(cx->bufsiz > 1) {
+ *cx->buf++ = c;
+ cx->bufsiz--;
+ *cx->buf = '\0';
+ }
+}
+
+void
+uni_printf(struct unicx *cx, const char *fmt, ...)
+{
+ u_int n;
+ va_list ap;
+
+ if(cx->bufsiz > 1) {
+ va_start(ap, fmt);
+ n = vsnprintf(cx->buf, cx->bufsiz, fmt, ap);
+ va_end(ap);
+ if(n > 0) {
+ if(n < cx->bufsiz) {
+ cx->bufsiz -= n;
+ cx->buf += n;
+ } else {
+ cx->buf += cx->bufsiz - 1;
+ cx->bufsiz = 1;
+ }
+ }
+ *cx->buf = '\0';
+ }
+}
+
+/*
+ * Print mode:
+ * 0 - print all into one line, fully prefixed
+ * 1 - print on multiple lines, full prefixed, but equal level
+ * entries on one line
+ * 2 - like 2, but only partial prefixed
+ * 3 - like 1, but each entry onto a new line
+ * 4 - like 2 + 3
+ */
+
+/*
+ * If we are in multiline mode, end the current line and set the
+ * flag, that we need indentation. But prevent double new lines.
+ */
+void
+uni_print_eol(struct unicx *cx)
+{
+ if (cx->multiline) {
+ if (!cx->doindent) {
+ uni_putc('\n', cx);
+ cx->doindent = 1;
+ }
+ }
+}
+
+/*
+ * New entry. Do the prefixing, indentation and spacing.
+ */
+static void
+doprefix(struct unicx *cx, const char *s)
+{
+ u_int i;
+
+ if(cx->multiline == 0) {
+ uni_putc(' ', cx);
+ for(i = 0; i < cx->nprefix; i++)
+ if(cx->prefix[i])
+ uni_printf(cx, "%s.", cx->prefix[i]);
+ } else if(cx->multiline == 1) {
+ if(cx->doindent) {
+ uni_printf(cx, "%*s", cx->indent * cx->tabsiz, "");
+ cx->doindent = 0;
+ } else
+ uni_putc(' ', cx);
+ for(i = 0; i < cx->nprefix; i++)
+ if(cx->prefix[i])
+ uni_printf(cx, "%s.", cx->prefix[i]);
+ } else if(cx->multiline == 2) {
+ if(cx->doindent) {
+ uni_printf(cx, "%*s", cx->indent * cx->tabsiz, "");
+ cx->doindent = 0;
+ } else
+ uni_putc(' ', cx);
+ } else if(cx->multiline == 3) {
+ if(cx->doindent)
+ cx->doindent = 0;
+ else
+ uni_putc('\n', cx);
+ uni_printf(cx, "%*s", cx->indent * cx->tabsiz, "");
+ for(i = 0; i < cx->nprefix; i++)
+ if(cx->prefix[i])
+ uni_printf(cx, "%s.", cx->prefix[i]);
+ } else if(cx->multiline == 4) {
+ if(cx->doindent)
+ cx->doindent = 0;
+ else
+ uni_putc('\n', cx);
+ uni_printf(cx, "%*s", cx->indent * cx->tabsiz, "");
+ }
+ uni_printf(cx, "%s", s);
+}
+static void
+uni_entry(const char *s, struct unicx *cx)
+{
+ doprefix(cx, s);
+ uni_putc('=', cx);
+}
+void
+uni_print_flag(const char *s, struct unicx *cx)
+{
+ doprefix(cx, s);
+}
+
+
+/*
+ * Start a deeper level of indendation. If multiline is in effect,
+ * we end the current line.
+ */
+void
+uni_print_push_prefix(const char *prefix, struct unicx *cx)
+{
+ if (cx->nprefix < PRINT_NPREFIX)
+ cx->prefix[cx->nprefix++] = prefix;
+}
+void
+uni_print_pop_prefix(struct unicx *cx)
+{
+ if (cx->nprefix > 0)
+ cx->nprefix--;
+}
+
+void
+uni_print_tbl(const char *entry, u_int val, const struct uni_print_tbl *tbl,
+ struct unicx *cx)
+{
+ if (entry)
+ uni_entry(entry, cx);
+ while (tbl->name) {
+ if (tbl->val == val) {
+ uni_printf(cx, "%s", tbl->name);
+ return;
+ }
+ tbl++;
+ }
+ uni_printf(cx, "ERROR(0x%x)", val);
+}
+
+void
+uni_print_entry(struct unicx *cx, const char *e, const char *fmt, ...)
+{
+ u_int n;
+ va_list ap;
+
+ uni_entry(e, cx);
+
+ if (cx->bufsiz > 1) {
+ va_start(ap, fmt);
+ n = vsnprintf(cx->buf, cx->bufsiz, fmt, ap);
+ va_end(ap);
+ if (n > 0) {
+ if (n < cx->bufsiz) {
+ cx->bufsiz -= n;
+ cx->buf += n;
+ } else {
+ cx->buf += cx->bufsiz - 1;
+ cx->bufsiz = 1;
+ }
+ }
+ *cx->buf = '\0';
+ }
+}
+
+/**********************************************************************/
+/*
+ * Printing information elements.
+ */
+static int
+uni_print_iehdr(const char *name, struct uni_iehdr *h, struct unicx *cx)
+{
+ static const struct uni_print_tbl act_tab[] = {
+ MKT(UNI_IEACT_CLEAR, clear),
+ MKT(UNI_IEACT_IGNORE, ignore),
+ MKT(UNI_IEACT_REPORT, report),
+ MKT(UNI_IEACT_MSG_IGNORE, ignore-msg),
+ MKT(UNI_IEACT_MSG_REPORT, report-msg),
+ MKT(UNI_IEACT_DEFAULT, default),
+ EOT()
+ };
+ static const struct uni_print_tbl cod_tab[] = {
+ MKT(UNI_CODING_ITU, itut),
+ MKT(UNI_CODING_NET, atmf),
+ EOT()
+ };
+
+ uni_print_entry(cx, name, "(");
+ uni_print_tbl(NULL, h->act, act_tab, cx);
+ uni_putc(',', cx);
+ uni_print_tbl(NULL, h->coding, cod_tab, cx);
+ if(cx->pnni && h->pass)
+ uni_printf(cx, ",pass");
+ if(IE_ISEMPTY(*(struct uni_ie_aal *)h)) {
+ uni_printf(cx, ",empty)");
+ uni_print_eol(cx);
+ return 1;
+ }
+ if(IE_ISERROR(*(struct uni_ie_aal *)h)) {
+ uni_printf(cx, ",error)");
+ uni_print_eol(cx);
+ return 1;
+ }
+
+ uni_putc(')', cx);
+
+ uni_print_push_prefix(name, cx);
+ uni_print_eol(cx);
+ cx->indent++;
+
+ return 0;
+}
+
+static void
+uni_print_ieend(struct unicx *cx)
+{
+ uni_print_pop_prefix(cx);
+ uni_print_eol(cx);
+ cx->indent--;
+}
+
+void
+uni_print_ie_internal(enum uni_ietype code, const union uni_ieall *ie,
+ struct unicx *cx)
+{
+ const struct iedecl *iedecl;
+
+ if((iedecl = GET_IEDECL(code, ie->h.coding)) != NULL)
+ (*iedecl->print)(ie, cx);
+}
+
+void
+uni_print_ie(char *buf, size_t size, enum uni_ietype code,
+ const union uni_ieall *ie, struct unicx *cx)
+{
+ uni_print_init(buf, size, cx);
+ uni_print_ie_internal(code, ie, cx);
+}
+
+int
+uni_check_ie(enum uni_ietype code, union uni_ieall *ie, struct unicx *cx)
+{
+ const struct iedecl *iedecl = GET_IEDECL(code, ie->h.coding);
+
+ if (iedecl != NULL)
+ return (iedecl->check(ie, cx));
+ else
+ return (-1);
+}
+
+/*
+ * Decode a information element header.
+ * Returns -1 if the message is too short.
+ * Strip the header from the message.
+ * The header is stripped, even if it is too short.
+ */
+int
+uni_decode_ie_hdr(enum uni_ietype *ietype, struct uni_iehdr *hdr,
+ struct uni_msg *msg, struct unicx *cx, u_int *ielen)
+{
+ u_int len;
+
+ *ietype = (enum uni_ietype)0;
+ *ielen = 0;
+ hdr->present = 0;
+ hdr->coding = UNI_CODING_ITU;
+ hdr->act = UNI_IEACT_DEFAULT;
+
+ if ((len = uni_msg_len(msg)) == 0)
+ return (-1);
+
+ *ietype = *msg->b_rptr++;
+
+ if (--len == 0)
+ return (-1);
+
+ hdr->coding = (*msg->b_rptr >> 5) & 3;
+ hdr->present = 0;
+
+ switch (*msg->b_rptr & 0x17) {
+
+ case 0x10: case 0x11: case 0x12:
+ case 0x15: case 0x16:
+ hdr->act = *msg->b_rptr & 0x7;
+ break;
+
+ case 0x00: case 0x01: case 0x02: case 0x03:
+ case 0x04: case 0x05: case 0x06: case 0x07:
+ hdr->act = UNI_IEACT_DEFAULT;
+ break;
+
+ default:
+ /* Q.2931 5.7.2 last sentence */
+ hdr->act = UNI_IEACT_REPORT;
+ break;
+ }
+ if (cx->pnni && (*msg->b_rptr & 0x08))
+ hdr->pass = 1;
+ else
+ hdr->pass = 0;
+ msg->b_rptr++;
+
+ if (--len == 0) {
+ hdr->present = UNI_IE_ERROR | UNI_IE_PRESENT;
+ return (-1);
+ }
+
+ if (len < 2) {
+ msg->b_rptr += len;
+ hdr->present = UNI_IE_ERROR | UNI_IE_PRESENT;
+ return (-1);
+ }
+
+ *ielen = *msg->b_rptr++ << 8;
+ *ielen |= *msg->b_rptr++;
+
+ return (0);
+}
+
+/*
+ * Decode the body of an information element.
+ */
+int
+uni_decode_ie_body(enum uni_ietype ietype, union uni_ieall *ie,
+ struct uni_msg *msg, u_int ielen, struct unicx *cx)
+{
+ const struct iedecl *iedecl;
+ u_char *end;
+ int ret;
+
+ if (ielen > uni_msg_len(msg)) {
+ /*
+ * Information element too long -> content error.
+ * Q.2931 5.6.8.2
+ */
+ msg->b_rptr = msg->b_wptr;
+ ie->h.present = UNI_IE_ERROR | UNI_IE_PRESENT;
+ return (-1);
+ }
+
+ if ((iedecl = GET_IEDECL(ietype, ie->h.coding)) == NULL) {
+ /*
+ * entirly unknown IE.
+ * Q.2931 5.6.8.1
+ */
+ msg->b_rptr += ielen;
+ ie->h.present = UNI_IE_ERROR | UNI_IE_PRESENT;
+ return (-1);
+ }
+
+ if (ielen > iedecl->maxlen) {
+ /*
+ * Information element too long -> content error.
+ * Q.2931 5.6.8.2
+ */
+ msg->b_rptr += iedecl->maxlen;
+ ie->h.present = UNI_IE_ERROR | UNI_IE_PRESENT;
+ return (-1);
+ }
+
+ end = msg->b_rptr + ielen;
+ ret = (*iedecl->decode)(ie, msg, ielen, cx);
+ msg->b_rptr = end;
+
+ return (ret);
+}
+
+int
+uni_encode_ie(enum uni_ietype code, struct uni_msg *msg, union uni_ieall *ie,
+ struct unicx *cx)
+{
+ const struct iedecl *iedecl = GET_IEDECL(code, ie->h.coding);
+
+ if (iedecl == NULL)
+ return (-1);
+ return (iedecl->encode(msg, ie, cx));
+}
+
+int
+uni_encode_ie_hdr(struct uni_msg *msg, enum uni_ietype type,
+ struct uni_iehdr *h, u_int len, struct unicx *cx)
+{
+ u_char byte;
+
+ uni_msg_ensure(msg, 4 + len);
+ *msg->b_wptr++ = type;
+
+ byte = 0x80 | (h->coding << 5);
+ if(h->act != UNI_IEACT_DEFAULT)
+ byte |= 0x10 | (h->act & 7);
+ if(cx->pnni)
+ byte |= h->pass << 3;
+ *msg->b_wptr++ = byte;
+
+ if(h->present & UNI_IE_EMPTY) {
+ *msg->b_wptr++ = 0;
+ *msg->b_wptr++ = 4;
+ return -1;
+ }
+ *msg->b_wptr++ = 0;
+ *msg->b_wptr++ = 0;
+
+ return 0;
+}
+
+/*
+ * Printing messages.
+ */
+static void
+uni_print_cref_internal(const struct uni_cref *cref, struct unicx *cx)
+{
+ uni_print_entry(cx, "cref", "%d.", cref->flag);
+ if (cref->cref == CREF_GLOBAL)
+ uni_printf(cx, "GLOBAL");
+ else if (cref->cref == CREF_DUMMY)
+ uni_printf(cx, "DUMMY");
+ else
+ uni_printf(cx, "%d", cref->cref);
+}
+void
+uni_print_cref(char *str, size_t len, const struct uni_cref *cref,
+ struct unicx *cx)
+{
+ uni_print_init(str, len, cx);
+ uni_print_cref_internal(cref, cx);
+}
+
+static void
+uni_print_msghdr_internal(const struct uni_msghdr *hdr, struct unicx *cx)
+{
+ static const struct uni_print_tbl tab[] = {
+ MKT(UNI_MSGACT_CLEAR, clear),
+ MKT(UNI_MSGACT_IGNORE, ignore),
+ MKT(UNI_MSGACT_REPORT, report),
+ MKT(UNI_MSGACT_DEFAULT, default),
+ EOT()
+ };
+
+ uni_print_cref_internal(&hdr->cref, cx);
+ uni_print_tbl("act", hdr->act, tab, cx);
+ if (cx->pnni)
+ uni_print_entry(cx, "pass", "%s", hdr->pass ? "yes" : "no");
+}
+
+void
+uni_print_msghdr(char *str, size_t len, const struct uni_msghdr *hdr,
+ struct unicx *cx)
+{
+ uni_print_init(str, len, cx);
+ uni_print_msghdr_internal(hdr, cx);
+}
+
+
+static void
+uni_print_internal(const struct uni_all *msg, struct unicx *cx)
+{
+ uni_entry("mtype", cx);
+ if(msg->mtype >= 256 || uni_msgtable[msg->mtype] == NULL) {
+ uni_printf(cx, "0x%02x(ERROR)", msg->mtype);
+ } else {
+ uni_printf(cx, "%s", uni_msgtable[msg->mtype]->name);
+ uni_print_msghdr_internal(&msg->u.hdr, cx);
+ cx->indent++;
+ uni_print_eol(cx);
+ (*uni_msgtable[msg->mtype]->print)(&msg->u, cx);
+ cx->indent--;
+ }
+
+ if(cx->multiline == 0)
+ uni_printf(cx, "\n");
+}
+
+void
+uni_print(char *buf, size_t size, const struct uni_all *all, struct unicx *cx)
+{
+ uni_print_init(buf, size, cx);
+ uni_print_internal(all, cx);
+}
+
+static void
+uni_print_msg_internal(u_int mtype, const union uni_msgall *msg,
+ struct unicx *cx)
+{
+
+ uni_entry("mtype", cx);
+ if (mtype >= 256 || uni_msgtable[mtype] == NULL) {
+ uni_printf(cx, "0x%02x(ERROR)", mtype);
+ } else {
+ uni_printf(cx, "%s", uni_msgtable[mtype]->name);
+ uni_print_msghdr_internal(&msg->hdr, cx);
+ cx->indent++;
+ uni_print_eol(cx);
+ (*uni_msgtable[mtype]->print)(msg, cx);
+ cx->indent--;
+ }
+
+ if(cx->multiline == 0)
+ uni_printf(cx, "\n");
+}
+
+void
+uni_print_msg(char *buf, size_t size, u_int mtype, const union uni_msgall *all,
+ struct unicx *cx)
+{
+ uni_print_init(buf, size, cx);
+ uni_print_msg_internal(mtype, all, cx);
+}
+
+void
+uni_print_cx(char *buf, size_t size, struct unicx *cx)
+{
+ static const char *acttab[] = {
+ "clr", /* 0x00 */
+ "ign", /* 0x01 */
+ "rep", /* 0x02 */
+ "x03", /* 0x03 */
+ "x04", /* 0x04 */
+ "mig", /* 0x05 */
+ "mrp", /* 0x06 */
+ "x07", /* 0x07 */
+ "def", /* 0x08 */
+ };
+
+ static const char *errtab[] = {
+ [UNI_IERR_UNK] = "unk", /* unknown IE */
+ [UNI_IERR_LEN] = "len", /* length error */
+ [UNI_IERR_BAD] = "bad", /* content error */
+ [UNI_IERR_ACC] = "acc", /* access element discarded */
+ [UNI_IERR_MIS] = "mis", /* missing IE */
+ };
+
+ u_int i;
+
+ uni_print_init(buf, size, cx);
+
+ uni_printf(cx, "q2932 %d\n", cx->q2932);
+ uni_printf(cx, "pnni %d\n", cx->pnni);
+ uni_printf(cx, "git_hard %d\n", cx->git_hard);
+ uni_printf(cx, "bearer_hard %d\n", cx->bearer_hard);
+ uni_printf(cx, "cause_hard %d\n", cx->cause_hard);
+
+ uni_printf(cx, "multiline %d\n", cx->multiline);
+ uni_printf(cx, "tabsiz %d\n", cx->tabsiz);
+
+ uni_printf(cx, "errcnt %d (", cx->errcnt);
+ for(i = 0; i < cx->errcnt; i++) {
+ uni_printf(cx, "%02x[%s,%s%s]", cx->err[i].ie,
+ errtab[cx->err[i].err], acttab[cx->err[i].act],
+ cx->err[i].man ? ",M" : "");
+ if(i != cx->errcnt - 1)
+ uni_putc(' ', cx);
+ }
+ uni_printf(cx, ")\n");
+}
+
+#include <netnatm/msg/uni_ietab.h>
+
+/*********************************************************************
+ *
+ * Cause
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 69 (just a pointer to Q.2610)
+ * Q.2610 (this is a small diff to Q.850)
+ * Q.850 !!
+ * UNI4.0 pp. 15
+ * PNNI1.0 p. 198
+ *
+ * ITU-T and NET coding for different values.
+ */
+static const struct causetab {
+ const char *str;
+ enum uni_diag diag;
+} itu_causes[128] = {
+
+#define D(NAME,VAL,DIAG,STD,STR) [UNI_CAUSE_##NAME] = { STR, UNI_DIAG_##DIAG },
+#define N(NAME,VAL,DIAG,STD,STR)
+
+UNI_DECLARE_CAUSE_VALUES
+
+#undef D
+#undef N
+
+}, net_causes[128] = {
+
+#define D(NAME,VAL,DIAG,STD,STR)
+#define N(NAME,VAL,DIAG,STD,STR) [UNI_CAUSE_##NAME] = { STR, UNI_DIAG_##DIAG },
+
+UNI_DECLARE_CAUSE_VALUES
+
+#undef D
+#undef N
+
+};
+
+enum uni_diag
+uni_diag(enum uni_cause cause, enum uni_coding code)
+{
+ if (cause >= 128)
+ return (UNI_DIAG_NONE);
+
+ if (code == UNI_CODING_NET)
+ if (net_causes[cause].str != NULL)
+ return (net_causes[cause].diag);
+ if (itu_causes[cause].str != NULL)
+ return (itu_causes[cause].diag);
+ return (UNI_DIAG_NONE);
+}
+
+/**********************************************************************/
+
+static void
+print_cause(struct unicx *cx, struct uni_ie_cause *ie,
+ const struct causetab *tab1, const struct causetab *tab2)
+{
+ static const struct uni_print_tbl loc_tbl[] = {
+ MKT(UNI_CAUSE_LOC_USER, user),
+ MKT(UNI_CAUSE_LOC_PRIVLOC, priv-net:loc-user),
+ MKT(UNI_CAUSE_LOC_PUBLOC, pub-net:loc-user),
+ MKT(UNI_CAUSE_LOC_TRANSIT, transit-net),
+ MKT(UNI_CAUSE_LOC_PUBREM, pub-net:rem-user),
+ MKT(UNI_CAUSE_LOC_PRIVREM, priv-net:rem-user),
+ MKT(UNI_CAUSE_LOC_INTERNAT, int-net),
+ MKT(UNI_CAUSE_LOC_BEYOND, beyond),
+ EOT()
+ };
+ static const struct uni_print_tbl pu_tbl[] = {
+ MKT(UNI_CAUSE_PU_PROVIDER, provider),
+ MKT(UNI_CAUSE_PU_USER, user),
+ EOT()
+ };
+ static const struct uni_print_tbl na_tbl[] = {
+ MKT(UNI_CAUSE_NA_NORMAL, normal),
+ MKT(UNI_CAUSE_NA_ABNORMAL, abnormal),
+ EOT()
+ };
+ static const struct uni_print_tbl cond_tbl[] = {
+ MKT(UNI_CAUSE_COND_UNKNOWN, unknown),
+ MKT(UNI_CAUSE_COND_PERM, permanent),
+ MKT(UNI_CAUSE_COND_TRANS, transient),
+ EOT()
+ };
+ static const struct uni_print_tbl rej_tbl[] = {
+ MKT(UNI_CAUSE_REASON_USER, user),
+ MKT(UNI_CAUSE_REASON_IEMISS, ie-missing),
+ MKT(UNI_CAUSE_REASON_IESUFF, ie-not-suff),
+ EOT()
+ };
+ char buf[100], *s;
+ u_int i;
+
+ if (uni_print_iehdr("cause", &ie->h, cx))
+ return;
+
+ if (ie->cause < 128 && tab1[ie->cause].str)
+ strcpy(buf, tab1[ie->cause].str);
+ else if (ie->cause < 128 && tab2 != NULL && tab2[ie->cause].str != NULL)
+ strcpy(buf, tab2[ie->cause].str);
+ else {
+ sprintf(buf, "UNKNOWN-%u", ie->cause);
+ }
+
+ for (s = buf; *s != '\0'; s++)
+ if (*s == ' ')
+ *s = '_';
+ uni_print_entry(cx, "cause", "%s", buf);
+
+ uni_print_tbl("loc", ie->loc, loc_tbl, cx);
+
+ if (ie->h.present & UNI_CAUSE_COND_P) {
+ uni_print_tbl("pu", ie->u.cond.pu, pu_tbl, cx);
+ uni_print_tbl("na", ie->u.cond.na, na_tbl, cx);
+ uni_print_tbl("condition", ie->u.cond.cond, cond_tbl, cx);
+ }
+ if (ie->h.present & UNI_CAUSE_REJ_P) {
+ uni_print_tbl("reject", ie->u.rej.reason, rej_tbl, cx);
+ }
+ if (ie->h.present & UNI_CAUSE_REJ_USER_P) {
+ uni_print_entry(cx, "user", "%u", ie->u.rej.user);
+ }
+ if (ie->h.present & UNI_CAUSE_REJ_IE_P) {
+ uni_print_entry(cx, "ie", "%u", ie->u.rej.ie);
+ }
+ if (ie->h.present & UNI_CAUSE_IE_P) {
+ uni_print_entry(cx, "ie", "(");
+ for (i = 0; i < ie->u.ie.len; i++) {
+ if (i)
+ uni_putc(',', cx);
+ uni_printf(cx, "0x%02x", ie->u.ie.ie[i]);
+ }
+ uni_putc(')', cx);
+ }
+ if (ie->h.present & UNI_CAUSE_TRAFFIC_P) {
+ uni_print_entry(cx, "traffic", "(");
+ for (i = 0; i < ie->u.traffic.len; i++) {
+ if (i)
+ uni_putc(',', cx);
+ uni_printf(cx, "0x%02x", ie->u.traffic.traffic[i]);
+ }
+ uni_putc(')', cx);
+ }
+ if (ie->h.present & UNI_CAUSE_VPCI_P) {
+ uni_print_entry(cx, "vpci", "(%u,%u)", ie->u.vpci.vpci, ie->u.vpci.vci);
+ }
+ if (ie->h.present & UNI_CAUSE_MTYPE_P) {
+ uni_print_entry(cx, "mtype", "%u", ie->u.mtype);
+ }
+ if (ie->h.present & UNI_CAUSE_TIMER_P) {
+ for (i = 0, s = buf; i < 3; i++) {
+ if (ie->u.timer[i] < ' ') {
+ *s++ = '^';
+ *s++ = ie->u.timer[i] + '@';
+ } else if (ie->u.timer[i] <= '~')
+ *s++ = ie->u.timer[i];
+ else {
+ *s++ = '\\';
+ *s++ = ie->u.timer[i] / 0100 + '0';
+ *s++ = (ie->u.timer[i] % 0100) / 010 + '0';
+ *s++ = ie->u.timer[i] % 010 + '0';
+ }
+ }
+ *s++ = '\0';
+ uni_print_entry(cx, "timer", "\"%s\"", buf);
+ }
+ if (ie->h.present & UNI_CAUSE_TNS_P) {
+ uni_print_eol(cx);
+ uni_print_ie_internal(UNI_IE_TNS, (union uni_ieall *)&ie->u.tns, cx);
+ }
+ if (ie->h.present & UNI_CAUSE_NUMBER_P) {
+ uni_print_eol(cx);
+ uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&ie->u.number, cx);
+ }
+ if (ie->h.present & UNI_CAUSE_ATTR_P) {
+ uni_print_entry(cx, "attr", "(");
+ for (i = 0; i < ie->u.attr.nattr; i++) {
+ uni_printf(cx, "(%u", ie->u.attr.attr[i][0]);
+ if (!(ie->u.attr.attr[i][0] & 0x80)) {
+ uni_printf(cx, ",%u", ie->u.attr.attr[i][1]);
+ if (!(ie->u.attr.attr[i][1] & 0x80))
+ uni_printf(cx, ",%u",
+ ie->u.attr.attr[i][2]);
+ }
+ uni_putc(')', cx);
+ }
+ }
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_PRINT(itu, cause)
+{
+ print_cause(cx, ie, itu_causes, NULL);
+}
+DEF_IE_PRINT(net, cause)
+{
+ print_cause(cx, ie, net_causes, itu_causes);
+}
+
+const char *
+uni_ie_cause2str(enum uni_coding coding, u_int cause)
+{
+ if (cause < 128) {
+ if (coding == UNI_CODING_ITU)
+ return (itu_causes[cause].str);
+ if (coding == UNI_CODING_NET) {
+ if (net_causes[cause].str != NULL)
+ return (net_causes[cause].str);
+ return (itu_causes[cause].str);
+ }
+ }
+ return (NULL);
+}
+
+/**********************************************************************/
+
+static int
+check_cause(struct uni_ie_cause *ie, struct unicx *cx,
+ const struct causetab *tab1, const struct causetab *tab2)
+{
+ static const u_int mask =
+ UNI_CAUSE_COND_P | UNI_CAUSE_REJ_P | UNI_CAUSE_REJ_USER_P |
+ UNI_CAUSE_REJ_IE_P | UNI_CAUSE_IE_P | UNI_CAUSE_TRAFFIC_P |
+ UNI_CAUSE_VPCI_P | UNI_CAUSE_MTYPE_P | UNI_CAUSE_TIMER_P |
+ UNI_CAUSE_TNS_P | UNI_CAUSE_NUMBER_P | UNI_CAUSE_ATTR_P |
+ UNI_CAUSE_PARAM_P;
+
+ const struct causetab *ptr;
+
+ if (ie->cause >= 128)
+ return (-1);
+
+ switch (ie->loc) {
+ default:
+ return (-1);
+
+ case UNI_CAUSE_LOC_USER:
+ case UNI_CAUSE_LOC_PRIVLOC:
+ case UNI_CAUSE_LOC_PUBLOC:
+ case UNI_CAUSE_LOC_TRANSIT:
+ case UNI_CAUSE_LOC_PUBREM:
+ case UNI_CAUSE_LOC_PRIVREM:
+ case UNI_CAUSE_LOC_INTERNAT:
+ case UNI_CAUSE_LOC_BEYOND:
+ break;
+ }
+
+ if (tab1[ie->cause].str != NULL)
+ ptr = &tab1[ie->cause];
+ else if (tab2 != NULL && tab2[ie->cause].str != NULL)
+ ptr = &tab2[ie->cause];
+ else
+ return (cx->cause_hard ? -1 : 0);
+
+ switch (ptr->diag) {
+
+ case UNI_DIAG_NONE:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_COND:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_COND_P:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_REJ:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_REJ_P:
+ case UNI_CAUSE_REJ_P | UNI_CAUSE_REJ_USER_P:
+ case UNI_CAUSE_REJ_P | UNI_CAUSE_REJ_IE_P:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_CRATE:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_TRAFFIC_P:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_IE:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_IE_P:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_CHANID:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_VPCI_P:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_MTYPE:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_MTYPE_P:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_TIMER:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_TIMER_P:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_TNS:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_TNS_P:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_NUMBER:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_NUMBER_P:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_ATTR:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_ATTR_P:
+ break;
+ }
+ break;
+
+ case UNI_DIAG_PARAM:
+ switch (ie->h.present & mask) {
+ default:
+ if (cx->cause_hard)
+ return (-1);
+ break;
+
+ case 0:
+ case UNI_CAUSE_PARAM_P:
+ break;
+ }
+ break;
+ }
+
+ if (ie->h.present & UNI_CAUSE_COND_P) {
+ switch (ie->u.cond.pu) {
+ default:
+ return (-1);
+
+ case UNI_CAUSE_PU_PROVIDER:
+ case UNI_CAUSE_PU_USER:
+ break;
+ }
+ switch (ie->u.cond.na) {
+ default:
+ return (-1);
+
+ case UNI_CAUSE_NA_NORMAL:
+ case UNI_CAUSE_NA_ABNORMAL:
+ break;
+ }
+ switch (ie->u.cond.cond) {
+ default:
+ return (-1);
+
+ case UNI_CAUSE_COND_UNKNOWN:
+ case UNI_CAUSE_COND_PERM:
+ case UNI_CAUSE_COND_TRANS:
+ break;
+ }
+ }
+ if (ie->h.present & UNI_CAUSE_REJ_P) {
+ switch (ie->u.rej.reason) {
+ default:
+ return (-1);
+
+ case UNI_CAUSE_REASON_USER:
+ switch (ie->h.present & mask) {
+ default:
+ return (-1);
+
+ case UNI_CAUSE_REJ_P:
+ case UNI_CAUSE_REJ_P | UNI_CAUSE_REJ_USER_P:
+ break;
+ }
+ break;
+
+ case UNI_CAUSE_REASON_IEMISS:
+ case UNI_CAUSE_REASON_IESUFF:
+ switch (ie->h.present & mask) {
+ default:
+ return (-1);
+
+ case UNI_CAUSE_REJ_P:
+ case UNI_CAUSE_REJ_P | UNI_CAUSE_REJ_IE_P:
+ break;
+ }
+ break;
+ }
+ }
+ if (ie->h.present & UNI_CAUSE_IE_P) {
+ if (ie->u.ie.len == 0 || ie->u.ie.len > UNI_CAUSE_IE_N)
+ return (-1);
+ }
+ if (ie->h.present & UNI_CAUSE_TRAFFIC_P) {
+ if (ie->u.traffic.len == 0 ||
+ ie->u.traffic.len > UNI_CAUSE_TRAFFIC_N)
+ return (-1);
+ }
+
+ if (ie->h.present & UNI_CAUSE_TNS_P) {
+ if (uni_check_ie(UNI_IE_TNS, (union uni_ieall *)&ie->u.tns, cx))
+ return (-1);
+ }
+ if (ie->h.present & UNI_CAUSE_NUMBER_P) {
+ if(uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&ie->u.number, cx))
+ return (-1);
+ }
+ if (ie->h.present & UNI_CAUSE_ATTR_P) {
+ if(ie->u.attr.nattr > UNI_CAUSE_ATTR_N || ie->u.attr.nattr == 0)
+ return (-1);
+ }
+ if (ie->h.present & UNI_CAUSE_PARAM_P) {
+ cx = cx;
+ }
+
+ return (0);
+}
+
+DEF_IE_CHECK(itu, cause)
+{
+ return (check_cause(ie, cx, itu_causes, NULL));
+}
+DEF_IE_CHECK(net, cause)
+{
+ return (check_cause(ie, cx, net_causes, itu_causes));
+}
+/**********************************************************************/
+
+static int
+encode_cause(struct uni_msg *msg, struct uni_ie_cause *ie, struct unicx *cx)
+{
+ u_int i;
+
+ START_IE(cause, UNI_IE_CAUSE, 30);
+
+ if (IE_ISERROR(*ie)) {
+ APP_BYTE(msg, 0x00 | ie->loc);
+ } else {
+ APP_BYTE(msg, 0x80 | ie->loc);
+ }
+ APP_BYTE(msg, 0x80 | ie->cause);
+
+ if (ie->h.present & UNI_CAUSE_COND_P)
+ APP_BYTE(msg, 0x80 | (ie->u.cond.pu << 3) |
+ (ie->u.cond.na << 2) | ie->u.cond.cond);
+
+ else if (ie->h.present & UNI_CAUSE_REJ_P) {
+ APP_BYTE(msg, 0x80 | (ie->u.rej.reason << 2) | ie->u.rej.cond);
+ if (ie->h.present & UNI_CAUSE_REJ_USER_P)
+ APP_BYTE(msg, ie->u.rej.user);
+ else if (ie->h.present & UNI_CAUSE_REJ_IE_P)
+ APP_BYTE(msg, ie->u.rej.ie);
+
+ } else if(ie->h.present & UNI_CAUSE_IE_P)
+ APP_BUF(msg, ie->u.ie.ie, ie->u.ie.len);
+
+ else if (ie->h.present & UNI_CAUSE_TRAFFIC_P)
+ APP_BUF(msg, ie->u.traffic.traffic, ie->u.traffic.len);
+
+ else if (ie->h.present & UNI_CAUSE_VPCI_P) {
+ APP_BYTE(msg, (ie->u.vpci.vpci >> 8));
+ APP_BYTE(msg, (ie->u.vpci.vpci >> 0));
+ APP_BYTE(msg, (ie->u.vpci.vci >> 8));
+ APP_BYTE(msg, (ie->u.vpci.vci >> 0));
+
+ } else if (ie->h.present & UNI_CAUSE_MTYPE_P)
+ APP_BYTE(msg, ie->u.mtype);
+
+ else if (ie->h.present & UNI_CAUSE_TIMER_P) {
+ APP_BYTE(msg, ie->u.timer[0]);
+ APP_BYTE(msg, ie->u.timer[1]);
+ APP_BYTE(msg, ie->u.timer[2]);
+
+ } else if (ie->h.present & UNI_CAUSE_TNS_P)
+ uni_encode_ie(UNI_IE_TNS, msg,
+ (union uni_ieall *)&ie->u.tns, cx);
+
+ else if (ie->h.present & UNI_CAUSE_NUMBER_P)
+ uni_encode_ie(UNI_IE_CALLED, msg,
+ (union uni_ieall *)&ie->u.number, cx);
+
+ else if (ie->h.present & UNI_CAUSE_ATTR_P) {
+ for (i = 0; i < ie->u.attr.nattr; i++) {
+ APP_BYTE(msg, ie->u.attr.attr[i][0]);
+ if (!ie->u.attr.attr[i][0]) {
+ APP_BYTE(msg, ie->u.attr.attr[i][1]);
+ if (!ie->u.attr.attr[i][1])
+ APP_BYTE(msg, ie->u.attr.attr[i][2]);
+ }
+ }
+ } else if (ie->h.present & UNI_CAUSE_PARAM_P)
+ APP_BYTE(msg, ie->u.param);
+
+ SET_IE_LEN(msg);
+
+ return (0);
+}
+
+DEF_IE_ENCODE(itu, cause)
+{
+ return encode_cause(msg, ie, cx);
+}
+DEF_IE_ENCODE(net, cause)
+{
+ return encode_cause(msg, ie, cx);
+}
+
+/**********************************************************************/
+
+static int
+decode_cause(struct uni_ie_cause *ie, struct uni_msg *msg, u_int ielen,
+ struct unicx *cx, const struct causetab *tab1, const struct causetab *tab2)
+{
+ u_char c;
+ const struct causetab *ptr;
+ enum uni_ietype ietype;
+ u_int xielen;
+
+ IE_START(;);
+
+ if(ielen < 2 || ielen > 30)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ ielen--;
+ if(!(c & 0x80))
+ goto rej;
+ ie->loc = c & 0xf;
+
+ c = *msg->b_rptr++;
+ ielen--;
+ if(!(c & 0x80))
+ goto rej;
+ ie->cause = c & 0x7f;
+
+ if(tab1[ie->cause].str != NULL)
+ ptr = &tab1[ie->cause];
+ else if(tab2 != NULL && tab2[ie->cause].str != NULL)
+ ptr = &tab2[ie->cause];
+ else {
+ ptr = NULL;
+ ielen = 0; /* ignore diags */
+ }
+
+ if(ielen) {
+ switch(ptr->diag) {
+
+ case UNI_DIAG_NONE:
+ break;
+
+ case UNI_DIAG_COND:
+ if(ielen < 1)
+ goto rej;
+ c = *msg->b_rptr++;
+ ielen--;
+
+ ie->h.present |= UNI_CAUSE_COND_P;
+ ie->u.cond.pu = (c >> 3) & 1;
+ ie->u.cond.na = (c >> 2) & 1;
+ ie->u.cond.cond = c & 3;
+
+ if(!(c & 0x80))
+ goto rej;
+ break;
+
+ case UNI_DIAG_REJ:
+ if(ielen < 1)
+ goto rej;
+ c = *msg->b_rptr++;
+ ielen--;
+
+ ie->h.present |= UNI_CAUSE_REJ_P;
+ ie->u.rej.reason = (c >> 2) & 0x1f;
+ ie->u.rej.cond = c & 3;
+
+ if(!(c & 0x80))
+ goto rej;
+
+ if(ielen > 0) {
+ c = *msg->b_rptr++;
+ ielen--;
+
+ switch(ie->u.rej.reason) {
+
+ case UNI_CAUSE_REASON_USER:
+ ie->h.present |= UNI_CAUSE_REJ_USER_P;
+ ie->u.rej.user = c;
+ break;
+
+ case UNI_CAUSE_REASON_IEMISS:
+ case UNI_CAUSE_REASON_IESUFF:
+ ie->h.present |= UNI_CAUSE_REJ_IE_P;
+ ie->u.rej.ie = c;
+ break;
+ }
+ }
+ break;
+
+ case UNI_DIAG_CRATE:
+ ie->h.present |= UNI_CAUSE_TRAFFIC_P;
+ while(ielen && ie->u.traffic.len < UNI_CAUSE_TRAFFIC_N) {
+ ie->u.traffic.traffic[ie->u.traffic.len++] =
+ *msg->b_rptr++;
+ ielen--;
+ }
+ break;
+
+ case UNI_DIAG_IE:
+ ie->h.present |= UNI_CAUSE_IE_P;
+ while(ielen && ie->u.ie.len < UNI_CAUSE_IE_N) {
+ ie->u.ie.ie[ie->u.ie.len++] = *msg->b_rptr++;
+ ielen--;
+ }
+ break;
+
+ case UNI_DIAG_CHANID:
+ if(ielen < 4)
+ break;
+ ie->h.present |= UNI_CAUSE_VPCI_P;
+ ie->u.vpci.vpci = *msg->b_rptr++ << 8;
+ ie->u.vpci.vpci |= *msg->b_rptr++;
+ ie->u.vpci.vci = *msg->b_rptr++ << 8;
+ ie->u.vpci.vci |= *msg->b_rptr++;
+ ielen -= 4;
+ break;
+
+ case UNI_DIAG_MTYPE:
+ ie->h.present |= UNI_CAUSE_MTYPE_P;
+ ie->u.mtype = *msg->b_rptr++;
+ ielen--;
+ break;
+
+ case UNI_DIAG_TIMER:
+ if(ielen < 3)
+ break;
+ ie->h.present |= UNI_CAUSE_TIMER_P;
+ ie->u.timer[0] = *msg->b_rptr++;
+ ie->u.timer[1] = *msg->b_rptr++;
+ ie->u.timer[2] = *msg->b_rptr++;
+ ielen -= 3;
+ break;
+
+ case UNI_DIAG_TNS:
+ if(ielen < 4)
+ break;
+ if(uni_decode_ie_hdr(&ietype, &ie->u.tns.h, msg, cx, &xielen))
+ break;
+ if(ietype != UNI_IE_TNS)
+ break;
+ if(uni_decode_ie_body(ietype,
+ (union uni_ieall *)&ie->u.tns, msg, xielen, cx))
+ break;
+ ie->h.present |= UNI_CAUSE_TNS_P;
+ break;
+
+ case UNI_DIAG_NUMBER:
+ if(ielen < 4)
+ break;
+ if(uni_decode_ie_hdr(&ietype, &ie->u.number.h, msg, cx, &xielen))
+ break;
+ if(ietype != UNI_IE_CALLED)
+ break;
+ if(uni_decode_ie_body(ietype,
+ (union uni_ieall *)&ie->u.number, msg, xielen, cx))
+ break;
+ ie->h.present |= UNI_CAUSE_NUMBER_P;
+ break;
+
+ case UNI_DIAG_ATTR:
+ ie->h.present |= UNI_CAUSE_ATTR_P;
+ while(ielen > 0 && ie->u.attr.nattr < UNI_CAUSE_ATTR_N) {
+ c = *msg->b_rptr++;
+ ie->u.attr.attr[ie->u.attr.nattr][0] = c;
+ ielen--;
+ if(ielen > 0 && !(c & 0x80)) {
+ c = *msg->b_rptr++;
+ ie->u.attr.attr[ie->u.attr.nattr][1] = c;
+ ielen--;
+ if(ielen > 0 && !(c & 0x80)) {
+ c = *msg->b_rptr++;
+ ie->u.attr.attr[ie->u.attr.nattr][2] = c;
+ ielen--;
+ }
+ }
+ }
+ break;
+
+ case UNI_DIAG_PARAM:
+ ie->h.present |= UNI_CAUSE_PARAM_P;
+ ie->u.param = *msg->b_rptr++;
+ ielen--;
+ break;
+ }
+ }
+
+ IE_END(CAUSE);
+}
+
+DEF_IE_DECODE(itu, cause)
+{
+ return decode_cause(ie, msg, ielen, cx, itu_causes, NULL);
+}
+DEF_IE_DECODE(net, cause)
+{
+ return decode_cause(ie, msg, ielen, cx, net_causes, itu_causes);
+}
+
+/*********************************************************************
+ *
+ * Callstate
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 59...60
+ * UNI4.0 pp. 14
+ *
+ * Only ITU-T coding allowed.
+ */
+DEF_IE_PRINT(itu, callstate)
+{
+ static const struct uni_print_tbl tbl[] = {
+ MKT(UNI_CALLSTATE_U0, U0/N0/REST0),
+ MKT(UNI_CALLSTATE_U1, U1/N1),
+ MKT(UNI_CALLSTATE_U3, U3/N3),
+ MKT(UNI_CALLSTATE_U4, U4/N4),
+ MKT(UNI_CALLSTATE_U6, U6/N6),
+ MKT(UNI_CALLSTATE_U7, U7/N7),
+ MKT(UNI_CALLSTATE_U8, U8/N8),
+ MKT(UNI_CALLSTATE_U9, U9/N9),
+ MKT(UNI_CALLSTATE_U10, U10/N10),
+ MKT(UNI_CALLSTATE_U11, U11/N11),
+ MKT(UNI_CALLSTATE_U12, U12/N12),
+ MKT(UNI_CALLSTATE_REST1,REST1),
+ MKT(UNI_CALLSTATE_REST2,REST2),
+ MKT(UNI_CALLSTATE_U13, U13/N13),
+ MKT(UNI_CALLSTATE_U14, U14/N14),
+ EOT()
+ };
+
+ if(uni_print_iehdr("callstate", &ie->h, cx))
+ return;
+ uni_print_tbl("state", ie->state, tbl, cx);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, callstate)
+{
+ cx = cx;
+
+ switch(ie->state) {
+ default:
+ return -1;
+
+ case UNI_CALLSTATE_U0:
+ case UNI_CALLSTATE_U1:
+ case UNI_CALLSTATE_U3:
+ case UNI_CALLSTATE_U4:
+ case UNI_CALLSTATE_U6:
+ case UNI_CALLSTATE_U7:
+ case UNI_CALLSTATE_U8:
+ case UNI_CALLSTATE_U9:
+ case UNI_CALLSTATE_U10:
+ case UNI_CALLSTATE_U11:
+ case UNI_CALLSTATE_U12:
+ case UNI_CALLSTATE_REST1:
+ case UNI_CALLSTATE_REST2:
+ case UNI_CALLSTATE_U13:
+ case UNI_CALLSTATE_U14:
+ break;
+ }
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, callstate)
+{
+ START_IE(callstate, UNI_IE_CALLSTATE, 1);
+
+ APP_BYTE(msg, ie->state);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, callstate)
+{
+ IE_START(;);
+
+ if(ielen != 1)
+ goto rej;
+
+ ie->state = *msg->b_rptr++ & 0x3f;
+ ielen--;
+
+ IE_END(CALLSTATE);
+}
+
+/*********************************************************************
+ *
+ * Facility Information.
+ *
+ * References for this IE are:
+ *
+ * Q.2932.1
+ *
+ * The standard allows only ROSE as protocol. We allow everything up to the
+ * maximum size.
+ *
+ * Only ITU-T coding allowed.
+ */
+DEF_IE_PRINT(itu, facility)
+{
+ u_int i;
+
+ if(uni_print_iehdr("facility", &ie->h, cx))
+ return;
+
+ if(ie->proto == UNI_FACILITY_ROSE)
+ uni_print_entry(cx, "proto", "rose");
+ else
+ uni_print_entry(cx, "proto", "0x%02x", ie->proto);
+
+ uni_print_entry(cx, "len", "%u", ie->len);
+ uni_print_entry(cx, "info", "(");
+ for(i = 0; i < ie->len; i++)
+ uni_printf(cx, "%s0x%02x", i == 0 ? "" : " ", ie->apdu[i]);
+ uni_printf(cx, ")");
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, facility)
+{
+ cx = cx;
+
+ if(ie->len > UNI_FACILITY_MAXAPDU)
+ return -1;
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, facility)
+{
+ START_IE(facility, UNI_IE_FACILITY, 1 + ie->len);
+
+ APP_BYTE(msg, ie->proto | 0x80);
+ APP_BUF(msg, ie->apdu, ie->len);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, facility)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen > UNI_FACILITY_MAXAPDU + 1 || ielen < 1)
+ goto rej;
+
+ ie->proto = (c = *msg->b_rptr++) & 0x1f;
+ ielen--;
+ if((c & 0xe0) != 0x80)
+ goto rej;
+
+ ie->len = ielen;
+ ielen = 0;
+ (void)memcpy(ie->apdu, msg->b_rptr, ie->len);
+ msg->b_rptr += ie->len;
+
+ IE_END(FACILITY);
+}
+
+/*********************************************************************
+ *
+ * Notification Indicator
+ *
+ * References for this IE are:
+ *
+ * Q.2931 p. 76
+ * UNI4.0 p. 17
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, notify)
+{
+ u_int i;
+
+ if(uni_print_iehdr("notify", &ie->h, cx))
+ return;
+ uni_print_entry(cx, "len", "%u", ie->len);
+ uni_print_entry(cx, "info", "(");
+ for(i = 0; i < ie->len; i++)
+ uni_printf(cx, "%s0x%02x", i == 0 ? "" : " ", ie->notify[i]);
+ uni_printf(cx, ")");
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, notify)
+{
+ cx = cx;
+
+ if(ie->len > UNI_NOTIFY_MAXLEN)
+ return -1;
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, notify)
+{
+ START_IE(notify, UNI_IE_NOTIFY, ie->len);
+
+ APP_BUF(msg, ie->notify, ie->len);
+ if (IE_ISERROR(*ie)) {
+ /* make it too long */
+ u_int i = ie->len;
+
+ while (i < UNI_NOTIFY_MAXLEN + 1) {
+ APP_BYTE(msg, 0x00);
+ i++;
+ }
+ }
+
+ SET_IE_LEN(msg);
+ return (0);
+}
+
+DEF_IE_DECODE(itu, notify)
+{
+ IE_START(;);
+
+ if (ielen > UNI_NOTIFY_MAXLEN || ielen < 1)
+ goto rej;
+
+ ie->len = ielen;
+ ielen = 0;
+ (void)memcpy(ie->notify, msg->b_rptr, ie->len);
+ msg->b_rptr += ie->len;
+
+ IE_END(NOTIFY);
+}
+
+/*********************************************************************
+ *
+ * End-to-end transit delay.
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 70...71
+ * UNI4.0 pp. 69...70
+ * PNNI1.0 pp. 198...200
+ *
+ * Not clear, whether the new indicator should be used with NET coding or
+ * not.
+ *
+ * Only ITU-T coding allowed.
+ */
+
+static void
+print_eetd(struct uni_ie_eetd *ie, struct unicx *cx)
+{
+ if (uni_print_iehdr("eetd", &ie->h, cx))
+ return;
+
+ if (ie->h.present & UNI_EETD_CUM_P)
+ uni_print_entry(cx, "cum", "%u", ie->cumulative);
+ if (ie->h.present & UNI_EETD_MAX_P) {
+ if (ie->maximum == UNI_EETD_ANYMAX)
+ uni_print_entry(cx, "max", "any");
+ else
+ uni_print_entry(cx, "max", "%u", ie->maximum);
+ }
+ if (ie->h.present & UNI_EETD_PCTD_P)
+ uni_print_entry(cx, "pnni_cum", "%u", ie->pctd);
+ if (ie->h.present & UNI_EETD_PMTD_P)
+ uni_print_entry(cx, "pnni_max", "%u", ie->pmtd);
+ if (ie->h.present & UNI_EETD_NET_P)
+ uni_print_flag("netgen", cx);
+
+ uni_print_ieend(cx);
+}
+DEF_IE_PRINT(itu, eetd)
+{
+ print_eetd(ie, cx);
+}
+DEF_IE_PRINT(net, eetd)
+{
+ print_eetd(ie, cx);
+}
+
+DEF_IE_CHECK(itu, eetd)
+{
+
+ cx = cx;
+
+ if (!(ie->h.present & UNI_EETD_CUM_P))
+ return (-1);
+ if (ie->h.present & (UNI_EETD_PMTD_P | UNI_EETD_PCTD_P))
+ return (-1);
+ return (0);
+}
+
+DEF_IE_CHECK(net, eetd)
+{
+
+ if (!cx->pnni) {
+ if (!(ie->h.present & UNI_EETD_CUM_P))
+ return (-1);
+ if (ie->h.present & (UNI_EETD_PMTD_P | UNI_EETD_PCTD_P))
+ return (-1);
+ } else {
+ if (ie->h.present & UNI_EETD_MAX_P)
+ return (-1);
+ if ((ie->h.present & UNI_EETD_CUM_P) &&
+ (ie->h.present & UNI_EETD_PCTD_P))
+ return (-1);
+ }
+ return (0);
+}
+
+DEF_IE_ENCODE(itu, eetd)
+{
+ START_IE(eetd, UNI_IE_EETD, 9);
+
+ if (ie->h.present & UNI_EETD_CUM_P) {
+ APP_BYTE(msg, UNI_EETD_CTD_ID);
+ APP_16BIT(msg, ie->cumulative);
+ }
+ if (ie->h.present & UNI_EETD_MAX_P) {
+ APP_BYTE(msg, UNI_EETD_MTD_ID);
+ APP_16BIT(msg, ie->maximum);
+ }
+ if (ie->h.present & UNI_EETD_PMTD_P) {
+ APP_BYTE(msg, UNI_EETD_PMTD_ID);
+ APP_24BIT(msg, ie->pmtd);
+ }
+ if (ie->h.present & UNI_EETD_PCTD_P) {
+ APP_BYTE(msg, UNI_EETD_PCTD_ID);
+ APP_24BIT(msg, ie->pctd);
+ }
+ if (ie->h.present & UNI_EETD_NET_P) {
+ APP_BYTE(msg, UNI_EETD_NET_ID);
+ }
+
+ SET_IE_LEN(msg);
+ return (0);
+}
+
+DEF_IE_ENCODE(net, eetd)
+{
+ return (uni_ie_encode_itu_eetd(msg, ie, cx));
+}
+
+DEF_IE_DECODE(itu, eetd)
+{
+ IE_START(;);
+
+ while (ielen > 0) {
+ switch (ielen--, *msg->b_rptr++) {
+
+ case UNI_EETD_CTD_ID:
+ if (ielen < 2)
+ goto rej;
+ ie->h.present |= UNI_EETD_CUM_P;
+ ie->cumulative = *msg->b_rptr++ << 8;
+ ie->cumulative |= *msg->b_rptr++;
+ ielen -= 2;
+ break;
+
+ case UNI_EETD_MTD_ID:
+ if (ielen < 2)
+ goto rej;
+ ie->h.present |= UNI_EETD_MAX_P;
+ ie->maximum = *msg->b_rptr++ << 8;
+ ie->maximum |= *msg->b_rptr++;
+ ielen -= 2;
+ break;
+
+ case UNI_EETD_PCTD_ID:
+ if (ielen < 3)
+ goto rej;
+ ie->h.present |= UNI_EETD_PCTD_P;
+ ie->pctd = *msg->b_rptr++ << 16;
+ ie->pctd |= *msg->b_rptr++ << 8;
+ ie->pctd |= *msg->b_rptr++;
+ ielen -= 3;
+ break;
+
+ case UNI_EETD_PMTD_ID:
+ if (ielen < 3)
+ goto rej;
+ ie->h.present |= UNI_EETD_PMTD_P;
+ ie->pmtd = *msg->b_rptr++ << 16;
+ ie->pmtd |= *msg->b_rptr++ << 8;
+ ie->pmtd |= *msg->b_rptr++;
+ ielen -= 3;
+ break;
+
+ case UNI_EETD_NET_ID:
+ ie->h.present |= UNI_EETD_NET_P;
+ break;
+
+ default:
+ goto rej;
+ }
+ }
+
+ IE_END(EETD);
+}
+DEF_IE_DECODE(net, eetd)
+{
+ return (uni_ie_decode_itu_eetd(ie, msg, ielen, cx));
+}
+
+/*********************************************************************
+ *
+ * Called address
+ * Called subaddress
+ * Calling address
+ * Calling subaddress
+ * Connected address
+ * Connected subaddress
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 60...68
+ * ...A4 pp. 27...36
+ * UNI4.0 pp. 14...15
+ * Q.2951 pp. 28...40
+ *
+ * It is assumed, that the coding of the addr arrays is ok.
+ *
+ * Only ITU-T coding allowed.
+ */
+
+static const struct uni_print_tbl screen_tbl[] = {
+ MKT(UNI_ADDR_SCREEN_NOT, no),
+ MKT(UNI_ADDR_SCREEN_PASSED, passed),
+ MKT(UNI_ADDR_SCREEN_FAILED, failed),
+ MKT(UNI_ADDR_SCREEN_NET, network),
+ EOT()
+};
+static const struct uni_print_tbl pres_tbl[] = {
+ MKT(UNI_ADDR_PRES, allowed),
+ MKT(UNI_ADDR_RESTRICT, restricted),
+ MKT(UNI_ADDR_NONUMBER, no-number),
+ EOT()
+};
+
+
+static void
+print_addr(struct unicx *cx, struct uni_addr *addr)
+{
+ static const struct uni_print_tbl plan_tbl[] = {
+ MKT(UNI_ADDR_UNKNOWN, unknown),
+ MKT(UNI_ADDR_E164, E164),
+ MKT(UNI_ADDR_ATME, ATME),
+ MKT(UNI_ADDR_DATA, data),
+ MKT(UNI_ADDR_PRIVATE, private),
+ EOT()
+ };
+ static const struct uni_print_tbl type_tbl[] = {
+ MKT(UNI_ADDR_UNKNOWN, unknown),
+ MKT(UNI_ADDR_INTERNATIONAL, international),
+ MKT(UNI_ADDR_NATIONAL, national),
+ MKT(UNI_ADDR_NETWORK, network),
+ MKT(UNI_ADDR_SUBSCR, subscriber),
+ MKT(UNI_ADDR_ABBR, abbreviated),
+ EOT()
+ };
+ u_int i;
+
+ uni_print_entry(cx, "addr", "(");
+ uni_print_tbl(NULL, addr->type, type_tbl, cx);
+ uni_putc(',', cx);
+ uni_print_tbl(NULL, addr->plan, plan_tbl, cx);
+ uni_putc(',', cx);
+ if(addr->plan == UNI_ADDR_E164) {
+ uni_putc('"', cx);
+ for(i = 0; i < addr->len; i++) {
+ if(addr->addr[i] < ' ')
+ uni_printf(cx, "^%c", addr->addr[i] + '@');
+ else if(addr->addr[i] <= '~')
+ uni_putc(addr->addr[i], cx);
+ else
+ uni_printf(cx, "\\%03o", addr->addr[i]);
+ }
+ uni_putc('"', cx);
+
+ } else if(addr->plan == UNI_ADDR_ATME) {
+ for(i = 0; i < addr->len; i++)
+ uni_printf(cx, "%02x", addr->addr[i]);
+ }
+ uni_putc(')', cx);
+}
+
+static void
+print_addrsub(struct unicx *cx, struct uni_subaddr *addr)
+{
+ static const struct uni_print_tbl type_tbl[] = {
+ MKT(UNI_SUBADDR_NSAP, NSAP),
+ MKT(UNI_SUBADDR_ATME, ATME),
+ MKT(UNI_SUBADDR_USER, USER),
+ EOT()
+ };
+ u_int i;
+
+ uni_print_entry(cx, "addr", "(");
+ uni_print_tbl(NULL, addr->type, type_tbl, cx);
+ uni_putc(',', cx);
+
+ for(i = 0; i < addr->len; i++)
+ uni_printf(cx, "%02x", addr->addr[i]);
+
+ uni_putc(')', cx);
+}
+
+static int
+check_addr(struct uni_addr *addr)
+{
+ u_int i;
+
+ switch(addr->plan) {
+ default:
+ return -1;
+
+ case UNI_ADDR_E164:
+ if(addr->type != UNI_ADDR_INTERNATIONAL)
+ return -1;
+ if(addr->len > 15 || addr->len == 0)
+ return -1;
+ for(i = 0; i < addr->len; i++)
+ if(addr->addr[i] == 0 || (addr->addr[i] & 0x80))
+ return -1;
+ break;
+
+ case UNI_ADDR_ATME:
+ if(addr->type != UNI_ADDR_UNKNOWN)
+ return -1;
+ if(addr->len != 20)
+ return -1;
+ break;
+ }
+
+ return 0;
+}
+
+static int
+check_subaddr(struct uni_subaddr *addr)
+{
+ switch(addr->type) {
+ default:
+ return -1;
+
+ case UNI_SUBADDR_NSAP:
+ if(addr->len != 20)
+ return -1;
+ break;
+
+ case UNI_SUBADDR_ATME:
+ if(addr->len > 20)
+ return -1;
+ break;
+ }
+ return 0;
+}
+
+static int
+check_screen(enum uni_addr_screen screen, enum uni_addr_pres pres)
+{
+ switch(pres) {
+ default:
+ return -1;
+
+ case UNI_ADDR_PRES:
+ case UNI_ADDR_RESTRICT:
+ case UNI_ADDR_NONUMBER:
+ break;
+ }
+ switch(screen) {
+ default:
+ return -1;
+
+ case UNI_ADDR_SCREEN_NOT:
+ case UNI_ADDR_SCREEN_PASSED:
+ case UNI_ADDR_SCREEN_FAILED:
+ case UNI_ADDR_SCREEN_NET:
+ break;
+ }
+
+ return 0;
+}
+
+static void
+encode_addr(struct uni_msg *msg, struct uni_addr *addr, u_int flag,
+ enum uni_addr_screen screen, enum uni_addr_pres pres, int err)
+{
+ u_char ext = err ? 0x00 : 0x80;
+
+ if (flag) {
+ APP_BYTE(msg, (addr->type << 4) | addr->plan);
+ APP_BYTE(msg, ext | (pres << 5) | (screen));
+ } else {
+ APP_BYTE(msg, ext | (addr->type << 4) | addr->plan);
+ }
+ APP_BUF(msg, addr->addr, addr->len);
+}
+
+static void
+encode_subaddr(struct uni_msg *msg, struct uni_subaddr *addr)
+{
+ APP_BYTE(msg, 0x80|(addr->type<<4));
+ APP_BUF(msg, addr->addr, addr->len);
+}
+
+static int
+decode_addr(struct uni_addr *addr, u_int ielen, struct uni_msg *msg, u_int plan)
+{
+ addr->plan = plan & 0xf;
+ addr->type = (plan >> 4) & 0x7;
+
+ switch(addr->plan) {
+
+ case UNI_ADDR_E164:
+ if(ielen > 15 || ielen == 0)
+ return -1;
+ addr->addr[ielen] = 0;
+ break;
+
+ case UNI_ADDR_ATME:
+ if(ielen != 20)
+ return -1;
+ break;
+
+ default:
+ return -1;
+ }
+ (void)memcpy(addr->addr, msg->b_rptr, ielen);
+ addr->len = ielen;
+ msg->b_rptr += ielen;
+
+ return 0;
+}
+
+static int
+decode_subaddr(struct uni_subaddr *addr, u_int ielen, struct uni_msg *msg,
+ u_int type)
+{
+ switch(addr->type = (type >> 4) & 0x7) {
+
+ case UNI_SUBADDR_NSAP:
+ if(ielen == 0 || ielen > 20)
+ return -1;
+ break;
+
+ case UNI_SUBADDR_ATME:
+ if(ielen != 20)
+ return -1;
+ break;
+
+ default:
+ return -1;
+ }
+ if(!(type & 0x80))
+ return -1;
+ if((type & 0x7) != 0)
+ return -1;
+
+ addr->len = ielen;
+ (void)memcpy(addr->addr, msg->b_rptr, ielen);
+ msg->b_rptr += ielen;
+
+ return 0;
+}
+
+/**********************************************************************/
+
+DEF_IE_PRINT(itu, called)
+{
+ if (uni_print_iehdr("called", &ie->h, cx))
+ return;
+ print_addr(cx, &ie->addr);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, called)
+{
+ cx = cx;
+
+ if (check_addr(&ie->addr))
+ return (-1);
+ return (0);
+}
+
+DEF_IE_ENCODE(itu, called)
+{
+ START_IE(called, UNI_IE_CALLED, 21);
+ encode_addr(msg, &ie->addr, 0, 0, 0, IE_ISERROR(*ie));
+ SET_IE_LEN(msg);
+ return (0);
+}
+
+DEF_IE_DECODE(itu, called)
+{
+ u_char c;
+ IE_START(;);
+
+ if (ielen > 21 || ielen < 1)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ ielen--;
+
+ if (!(c & 0x80))
+ goto rej;
+
+ if (decode_addr(&ie->addr, ielen, msg, c))
+ goto rej;
+
+ IE_END(CALLED);
+}
+
+/**********************************************************************/
+
+DEF_IE_PRINT(itu, calledsub)
+{
+ if(uni_print_iehdr("calledsub", &ie->h, cx))
+ return;
+ print_addrsub(cx, &ie->addr);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, calledsub)
+{
+ cx = cx;
+
+ if(check_subaddr(&ie->addr))
+ return -1;
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, calledsub)
+{
+ START_IE(calledsub, UNI_IE_CALLEDSUB, 21);
+ encode_subaddr(msg, &ie->addr);
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, calledsub)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen > 21)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ ielen--;
+
+ if(decode_subaddr(&ie->addr, ielen, msg, c))
+ goto rej;
+
+ IE_END(CALLEDSUB);
+}
+
+/**********************************************************************/
+
+DEF_IE_PRINT(itu, calling)
+{
+ if(uni_print_iehdr("calling", &ie->h, cx))
+ return;
+ print_addr(cx, &ie->addr);
+
+ if(ie->h.present & UNI_CALLING_SCREEN_P) {
+ uni_print_tbl("screening", ie->screen, screen_tbl, cx);
+ uni_print_tbl("presentation", ie->pres, pres_tbl, cx);
+ }
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, calling)
+{
+ cx = cx;
+
+ if(check_addr(&ie->addr))
+ return -1;
+
+ if(ie->h.present & UNI_CALLING_SCREEN_P)
+ if(check_screen(ie->screen, ie->pres))
+ return -1;
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, calling)
+{
+ START_IE(calling, UNI_IE_CALLING, 22);
+ encode_addr(msg, &ie->addr, ie->h.present & UNI_CALLING_SCREEN_P, ie->screen, ie->pres, IE_ISERROR(*ie));
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, calling)
+{
+ u_char c, plan;
+
+ IE_START(;);
+
+ if(ielen > 22 || ielen < 1)
+ goto rej;
+
+ plan = *msg->b_rptr++;
+ ielen--;
+
+ if(!(plan & 0x80)) {
+ if(ielen == 0)
+ goto rej;
+ ielen--;
+ c = *msg->b_rptr++;
+
+ ie->h.present |= UNI_CALLING_SCREEN_P;
+ ie->pres = (c >> 5) & 0x3;
+ ie->screen = c & 0x3;
+
+ if(!(c & 0x80))
+ goto rej;
+ }
+
+ if(decode_addr(&ie->addr, ielen, msg, plan))
+ goto rej;
+
+ IE_END(CALLING);
+}
+
+/**********************************************************************/
+
+DEF_IE_PRINT(itu, callingsub)
+{
+ if(uni_print_iehdr("callingsub", &ie->h, cx))
+ return;
+ print_addrsub(cx, &ie->addr);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, callingsub)
+{
+ cx = cx;
+
+ if(check_subaddr(&ie->addr))
+ return -1;
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, callingsub)
+{
+ START_IE(callingsub, UNI_IE_CALLINGSUB, 21);
+ encode_subaddr(msg, &ie->addr);
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, callingsub)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen > 21)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ ielen--;
+
+ if(decode_subaddr(&ie->addr, ielen, msg, c))
+ goto rej;
+
+ IE_END(CALLINGSUB);
+}
+
+/**********************************************************************/
+
+DEF_IE_PRINT(itu, conned)
+{
+ if(uni_print_iehdr("conned", &ie->h, cx))
+ return;
+ print_addr(cx, &ie->addr);
+
+ if(ie->h.present & UNI_CONNED_SCREEN_P) {
+ uni_print_tbl("screening", ie->screen, screen_tbl, cx);
+ uni_print_tbl("presentation", ie->pres, pres_tbl, cx);
+ }
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, conned)
+{
+ cx = cx;
+
+ if(check_addr(&ie->addr))
+ return -1;
+
+ if(ie->h.present & UNI_CONNED_SCREEN_P)
+ if(check_screen(ie->screen, ie->pres))
+ return -1;
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, conned)
+{
+ START_IE(conned, UNI_IE_CONNED, 22);
+ encode_addr(msg, &ie->addr, ie->h.present & UNI_CONNED_SCREEN_P, ie->screen, ie->pres, IE_ISERROR(*ie));
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, conned)
+{
+ u_char c, plan;
+
+ IE_START(;);
+
+ if(ielen > 22 || ielen < 1)
+ goto rej;
+
+ plan = *msg->b_rptr++;
+ ielen--;
+
+ if(!(plan & 0x80)) {
+ if(ielen == 0)
+ goto rej;
+ ielen--;
+ c = *msg->b_rptr++;
+
+ ie->h.present |= UNI_CONNED_SCREEN_P;
+ ie->pres = (c >> 5) & 0x3;
+ ie->screen = c & 0x3;
+
+ if(!(c & 0x80))
+ goto rej;
+ }
+
+ if(decode_addr(&ie->addr, ielen, msg, plan))
+ goto rej;
+
+ IE_END(CONNED);
+}
+
+/**********************************************************************/
+
+DEF_IE_PRINT(itu, connedsub)
+{
+ if(uni_print_iehdr("connedsub", &ie->h, cx))
+ return;
+ print_addrsub(cx, &ie->addr);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, connedsub)
+{
+ cx = cx;
+
+ if(check_subaddr(&ie->addr))
+ return -1;
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, connedsub)
+{
+ START_IE(connedsub, UNI_IE_CONNEDSUB, 21);
+ encode_subaddr(msg, &ie->addr);
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, connedsub)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen > 21)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ ielen--;
+
+ if(decode_subaddr(&ie->addr, ielen, msg, c))
+ goto rej;
+
+ IE_END(CONNEDSUB);
+}
+
+/*********************************************************************
+ *
+ * Endpoint reference.
+ *
+ * References for this IE are:
+ *
+ * Q.2971 p. 14
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, epref)
+{
+ if(uni_print_iehdr("epref", &ie->h, cx))
+ return;
+ uni_print_entry(cx, "epref", "(%u,%u)", ie->flag, ie->epref);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, epref)
+{
+ cx = cx;
+
+ if(ie->epref >= (2<<15))
+ return -1;
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, epref)
+{
+ START_IE(epref, UNI_IE_EPREF, 3);
+
+ if (IE_ISERROR(*ie))
+ APP_BYTE(msg, 0xff);
+ else
+ APP_BYTE(msg, 0);
+ APP_BYTE(msg, (ie->flag << 7) | ((ie->epref >> 8) & 0x7f));
+ APP_BYTE(msg, (ie->epref & 0xff));
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, epref)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen != 3)
+ goto rej;
+ if(*msg->b_rptr++ != 0)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ ie->flag = (c & 0x80) ? 1 : 0;
+ ie->epref = (c & 0x7f) << 8;
+ ie->epref |= *msg->b_rptr++;
+
+ IE_END(EPREF);
+}
+
+/*********************************************************************
+ *
+ * Endpoint state.
+ *
+ * References for this IE are:
+ *
+ * Q.2971 pp. 14...15
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, epstate)
+{
+ static const struct uni_print_tbl tbl[] = {
+ MKT(UNI_EPSTATE_NULL, null),
+ MKT(UNI_EPSTATE_ADD_INIT, add-initiated),
+ MKT(UNI_EPSTATE_ALERT_DLVD, alerting-delivered),
+ MKT(UNI_EPSTATE_ADD_RCVD, add-received),
+ MKT(UNI_EPSTATE_ALERT_RCVD, alerting-received),
+ MKT(UNI_EPSTATE_ACTIVE, active),
+ MKT(UNI_EPSTATE_DROP_INIT, drop-initiated),
+ MKT(UNI_EPSTATE_DROP_RCVD, drop-received),
+ EOT()
+ };
+
+ if(uni_print_iehdr("epstate", &ie->h, cx))
+ return;
+ uni_print_tbl("state", ie->state, tbl, cx);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, epstate)
+{
+ cx = cx;
+
+ switch(ie->state) {
+ default:
+ return -1;
+
+ case UNI_EPSTATE_NULL:
+ case UNI_EPSTATE_ADD_INIT:
+ case UNI_EPSTATE_ALERT_DLVD:
+ case UNI_EPSTATE_ADD_RCVD:
+ case UNI_EPSTATE_ALERT_RCVD:
+ case UNI_EPSTATE_DROP_INIT:
+ case UNI_EPSTATE_DROP_RCVD:
+ case UNI_EPSTATE_ACTIVE:
+ break;
+ }
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, epstate)
+{
+ START_IE(epstate, UNI_IE_EPSTATE, 1);
+
+ APP_BYTE(msg, ie->state);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, epstate)
+{
+ IE_START(;);
+
+ if(ielen != 1)
+ goto rej;
+
+ ie->state = *msg->b_rptr++ & 0x3f;
+
+ IE_END(EPSTATE);
+}
+
+/*********************************************************************
+ *
+ * ATM adaptation layer parameters
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 43...49
+ * Q.2931 Amd 2
+ * UNI4.0 p. 9
+ *
+ * UNI4.0 states, that AAL2 is not supported. However we keep it. No
+ * parameters are associated with AAL2.
+ *
+ * Amd2 not checked. XXX
+ *
+ * Only ITU-T coding allowed.
+ */
+DEF_IE_PRINT(itu, aal)
+{
+ static const struct uni_print_tbl aal_tbl[] = {
+ MKT(UNI_AAL_0, VOICE),
+ MKT(UNI_AAL_1, 1),
+ MKT(UNI_AAL_2, 2),
+ MKT(UNI_AAL_4, 3/4),
+ MKT(UNI_AAL_5, 5),
+ MKT(UNI_AAL_USER, USER),
+ EOT()
+ };
+ static const struct uni_print_tbl subtype_tbl[] = {
+ MKT(UNI_AAL1_SUB_NULL, null),
+ MKT(UNI_AAL1_SUB_VOICE, voice),
+ MKT(UNI_AAL1_SUB_CIRCUIT, circuit),
+ MKT(UNI_AAL1_SUB_HQAUDIO, hqaudio),
+ MKT(UNI_AAL1_SUB_VIDEO, video),
+ EOT()
+ };
+ static const struct uni_print_tbl cbr_rate_tbl[] = {
+ MKT(UNI_AAL1_CBR_64, 64),
+ MKT(UNI_AAL1_CBR_1544, 1544(DS1)),
+ MKT(UNI_AAL1_CBR_6312, 6312(DS2)),
+ MKT(UNI_AAL1_CBR_32064, 32064),
+ MKT(UNI_AAL1_CBR_44736, 44736(DS3)),
+ MKT(UNI_AAL1_CBR_97728, 97728),
+ MKT(UNI_AAL1_CBR_2048, 2048(E1)),
+ MKT(UNI_AAL1_CBR_8448, 8448(E2)),
+ MKT(UNI_AAL1_CBR_34368, 34368(E3)),
+ MKT(UNI_AAL1_CBR_139264, 139264),
+ MKT(UNI_AAL1_CBR_N64, Nx64),
+ MKT(UNI_AAL1_CBR_N8, Nx8),
+ EOT()
+ };
+ static const struct uni_print_tbl screc_tbl[] = {
+ MKT(UNI_AAL1_SCREC_NULL, null),
+ MKT(UNI_AAL1_SCREC_SRTS, srts),
+ MKT(UNI_AAL1_SCREC_ACLK, aclk),
+ EOT()
+ };
+ static const struct uni_print_tbl ecm_tbl[] = {
+ MKT(UNI_AAL1_ECM_NULL, null),
+ MKT(UNI_AAL1_ECM_LOSS, loss),
+ MKT(UNI_AAL1_ECM_DELAY, delay),
+ EOT()
+ };
+ static const struct uni_print_tbl sscs_tbl[] = {
+ MKT(UNI_AAL_SSCS_NULL, null),
+ MKT(UNI_AAL_SSCS_SSCOPA, sscopa),
+ MKT(UNI_AAL_SSCS_SSCOPU, sscopu),
+ MKT(UNI_AAL_SSCS_FRAME, frame),
+ EOT()
+ };
+
+ if(uni_print_iehdr("aal", &ie->h, cx))
+ return;
+ uni_print_tbl("type", ie->type, aal_tbl, cx);
+
+ switch(ie->type) {
+
+ case UNI_AAL_0:
+ uni_print_push_prefix("0", cx);
+ cx->indent++;
+ break;
+
+ case UNI_AAL_2:
+ uni_print_push_prefix("2", cx);
+ cx->indent++;
+ break;
+
+ case UNI_AAL_1:
+ uni_print_push_prefix("1", cx);
+ cx->indent++;
+ uni_print_tbl("subtype", ie->u.aal1.subtype, subtype_tbl, cx);
+ uni_print_tbl("cbr_rate", ie->u.aal1.cbr_rate, cbr_rate_tbl, cx);
+ if(ie->h.present & UNI_AAL1_MULT_P)
+ uni_print_entry(cx, "mult", "%u", ie->u.aal1.mult);
+ if(ie->h.present & UNI_AAL1_SCREC_P)
+ uni_print_tbl("screc", ie->u.aal1.screc, screc_tbl, cx);
+ if(ie->h.present & UNI_AAL1_ECM_P)
+ uni_print_tbl("ecm", ie->u.aal1.ecm, ecm_tbl, cx);
+ if(ie->h.present & UNI_AAL1_BSIZE_P)
+ uni_print_entry(cx, "bsize", "%u", ie->u.aal1.bsize);
+ if(ie->h.present & UNI_AAL1_PART_P)
+ uni_print_entry(cx, "part", "%u", ie->u.aal1.part);
+ break;
+
+ case UNI_AAL_4:
+ uni_print_push_prefix("4", cx);
+ cx->indent++;
+ if(ie->h.present & UNI_AAL4_CPCS_P)
+ uni_print_entry(cx, "cpcs", "(%u,%u)", ie->u.aal4.fwd_cpcs,
+ ie->u.aal4.bwd_cpcs);
+ if(ie->h.present & UNI_AAL4_MID_P)
+ uni_print_entry(cx, "mid", "(%u,%u)", ie->u.aal4.mid_low,
+ ie->u.aal4.mid_high);
+ if(ie->h.present & UNI_AAL4_SSCS_P)
+ uni_print_tbl("sscs", ie->u.aal4.sscs, sscs_tbl, cx);
+ break;
+
+ case UNI_AAL_5:
+ uni_print_push_prefix("5", cx);
+ cx->indent++;
+ if(ie->h.present & UNI_AAL5_CPCS_P)
+ uni_print_entry(cx, "cpcs", "(%u,%u)", ie->u.aal5.fwd_cpcs,
+ ie->u.aal5.bwd_cpcs);
+ if(ie->h.present & UNI_AAL5_SSCS_P)
+ uni_print_tbl("sscs", ie->u.aal5.sscs, sscs_tbl, cx);
+ break;
+
+ case UNI_AAL_USER:
+ uni_print_push_prefix("user", cx);
+ cx->indent++;
+ if(ie->u.aalu.len > 4) {
+ uni_print_entry(cx, "info", "ERROR(len=%u)", ie->u.aalu.len);
+ } else {
+ u_int i;
+
+ uni_print_entry(cx, "info", "(");
+ for(i = 0; i < ie->u.aalu.len; i++)
+ uni_printf(cx, "%s%u", !i?"":",", ie->u.aalu.user[i]);
+ uni_printf(cx, ")");
+ }
+ break;
+ }
+ cx->indent--;
+ uni_print_pop_prefix(cx);
+ uni_print_eol(cx);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, aal)
+{
+ cx = cx;
+
+ if(ie->type == UNI_AAL_0) {
+ ;
+ } else if(ie->type == UNI_AAL_1) {
+ switch(ie->u.aal1.subtype) {
+
+ default:
+ return -1;
+
+ case UNI_AAL1_SUB_NULL:
+ case UNI_AAL1_SUB_VOICE:
+ case UNI_AAL1_SUB_CIRCUIT:
+ case UNI_AAL1_SUB_HQAUDIO:
+ case UNI_AAL1_SUB_VIDEO:
+ break;
+ }
+ switch(ie->u.aal1.cbr_rate) {
+
+ default:
+ return -1;
+
+ case UNI_AAL1_CBR_64:
+ case UNI_AAL1_CBR_1544:
+ case UNI_AAL1_CBR_6312:
+ case UNI_AAL1_CBR_32064:
+ case UNI_AAL1_CBR_44736:
+ case UNI_AAL1_CBR_97728:
+ case UNI_AAL1_CBR_2048:
+ case UNI_AAL1_CBR_8448:
+ case UNI_AAL1_CBR_34368:
+ case UNI_AAL1_CBR_139264:
+ if((ie->h.present & UNI_AAL1_MULT_P))
+ return -1;
+ break;
+
+ case UNI_AAL1_CBR_N64:
+ if(!(ie->h.present & UNI_AAL1_MULT_P))
+ return -1;
+ if(ie->u.aal1.mult < 2)
+ return -1;
+ break;
+
+ case UNI_AAL1_CBR_N8:
+ if(!(ie->h.present & UNI_AAL1_MULT_P))
+ return -1;
+ if(ie->u.aal1.mult == 0 || ie->u.aal1.mult > 7)
+ return -1;
+ break;
+ }
+ if(ie->h.present & UNI_AAL1_SCREC_P) {
+ switch(ie->u.aal1.screc) {
+
+ default:
+ return -1;
+
+ case UNI_AAL1_SCREC_NULL:
+ case UNI_AAL1_SCREC_SRTS:
+ case UNI_AAL1_SCREC_ACLK:
+ break;
+ }
+ }
+ if(ie->h.present & UNI_AAL1_ECM_P) {
+ switch(ie->u.aal1.ecm) {
+
+ default:
+ return -1;
+
+ case UNI_AAL1_ECM_NULL:
+ case UNI_AAL1_ECM_LOSS:
+ case UNI_AAL1_ECM_DELAY:
+ break;
+ }
+ }
+ if(ie->h.present & UNI_AAL1_BSIZE_P) {
+ if(ie->u.aal1.bsize == 0)
+ return -1;
+ }
+ if(ie->h.present & UNI_AAL1_PART_P) {
+ if(ie->u.aal1.part == 0 || ie->u.aal1.part > 47)
+ return -1;
+ }
+
+ } else if(ie->type == UNI_AAL_2) {
+ ;
+
+ } else if(ie->type == UNI_AAL_4) {
+ if(ie->h.present & UNI_AAL4_MID_P) {
+ if(ie->u.aal4.mid_low >= 1024)
+ return -1;
+ if(ie->u.aal4.mid_high >= 1024)
+ return -1;
+ if(ie->u.aal4.mid_low > ie->u.aal4.mid_high)
+ return -1;
+ }
+ if(ie->h.present & UNI_AAL4_SSCS_P) {
+ switch(ie->u.aal4.sscs) {
+
+ default:
+ return -1;
+
+ case UNI_AAL_SSCS_NULL:
+ case UNI_AAL_SSCS_SSCOPA:
+ case UNI_AAL_SSCS_SSCOPU:
+ case UNI_AAL_SSCS_FRAME:
+ break;
+ }
+ }
+
+ } else if(ie->type == UNI_AAL_5) {
+ if(ie->h.present & UNI_AAL5_SSCS_P) {
+ switch(ie->u.aal5.sscs) {
+
+ default:
+ return -1;
+
+ case UNI_AAL_SSCS_NULL:
+ case UNI_AAL_SSCS_SSCOPA:
+ case UNI_AAL_SSCS_SSCOPU:
+ case UNI_AAL_SSCS_FRAME:
+ break;
+ }
+ }
+
+ } else if(ie->type == UNI_AAL_USER) {
+ if(ie->u.aalu.len > 4)
+ return -1;
+
+ } else
+ return -1;
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, aal)
+{
+ START_IE(aal, UNI_IE_AAL, 16);
+
+ APP_BYTE(msg, ie->type);
+ switch(ie->type) {
+
+ case UNI_AAL_0:
+ break;
+
+ case UNI_AAL_1:
+ APP_SUB_BYTE(msg,
+ UNI_AAL_SUB_ID, ie->u.aal1.subtype);
+ APP_SUB_BYTE(msg,
+ UNI_AAL_CBR_ID, ie->u.aal1.cbr_rate);
+ APP_OPT_16BIT(msg, ie->h.present, UNI_AAL1_MULT_P,
+ UNI_AAL_MULT_ID, ie->u.aal1.mult);
+ APP_OPT_BYTE(msg, ie->h.present, UNI_AAL1_SCREC_P,
+ UNI_AAL_SCREC_ID, ie->u.aal1.screc);
+ APP_OPT_BYTE(msg, ie->h.present, UNI_AAL1_ECM_P,
+ UNI_AAL_ECM_ID, ie->u.aal1.ecm);
+ APP_OPT_16BIT(msg, ie->h.present, UNI_AAL1_BSIZE_P,
+ UNI_AAL_BSIZE_ID, ie->u.aal1.bsize);
+ APP_OPT_BYTE(msg, ie->h.present, UNI_AAL1_PART_P,
+ UNI_AAL_PART_ID, ie->u.aal1.part);
+ break;
+
+ case UNI_AAL_2:
+ break;
+
+ case UNI_AAL_4:
+ if(ie->h.present & UNI_AAL4_CPCS_P) {
+ APP_SUB_16BIT(msg,
+ UNI_AAL_FWDCPCS_ID, ie->u.aal4.fwd_cpcs);
+ APP_SUB_16BIT(msg,
+ UNI_AAL_BWDCPCS_ID, ie->u.aal4.bwd_cpcs);
+ }
+ if(ie->h.present & UNI_AAL4_MID_P) {
+ APP_BYTE(msg, UNI_AAL_MID_ID);
+ APP_16BIT(msg, ie->u.aal4.mid_low);
+ APP_16BIT(msg, ie->u.aal4.mid_high);
+ }
+ APP_OPT_BYTE(msg, ie->h.present, UNI_AAL4_SSCS_P,
+ UNI_AAL_SSCS_ID, ie->u.aal4.sscs);
+ break;
+
+ case UNI_AAL_5:
+ if(ie->h.present & UNI_AAL5_CPCS_P) {
+ APP_SUB_16BIT(msg,
+ UNI_AAL_FWDCPCS_ID, ie->u.aal5.fwd_cpcs);
+ APP_SUB_16BIT(msg,
+ UNI_AAL_BWDCPCS_ID, ie->u.aal5.bwd_cpcs);
+ }
+ APP_OPT_BYTE(msg, ie->h.present, UNI_AAL5_SSCS_P,
+ UNI_AAL_SSCS_ID, ie->u.aal5.sscs);
+ break;
+
+ case UNI_AAL_USER:
+ APP_BUF(msg, ie->u.aalu.user, ie->u.aalu.len);
+ break;
+
+ default:
+ return -1;
+ }
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+/*
+ * XXX What should we do with multiple subtype occurences? Ignore
+ * or reject. Currently we reject.
+ */
+static int
+decode_aal_1(struct uni_ie_aal *ie, struct uni_msg *msg, u_int ielen)
+{
+ int subtype_p, cbr_p;
+
+ subtype_p = cbr_p = 0;
+
+ while(ielen-- > 0) {
+ switch(*msg->b_rptr++) {
+
+ case UNI_AAL_SUB_ID:
+ if(ielen == 0 || subtype_p)
+ return -1;
+ ielen--;
+ subtype_p = 1;
+ ie->u.aal1.subtype = *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_CBR_ID:
+ if(ielen == 0 || cbr_p)
+ return -1;
+ ielen--;
+ cbr_p = 1;
+ ie->u.aal1.cbr_rate = *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_MULT_ID:
+ if(ielen < 2 || (ie->h.present & UNI_AAL1_MULT_P))
+ return -1;
+ ielen -= 2;
+ ie->h.present |= UNI_AAL1_MULT_P;
+ ie->u.aal1.mult = *msg->b_rptr++ << 8;
+ ie->u.aal1.mult |= *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_SCREC_ID:
+ if(ielen == 0 || (ie->h.present & UNI_AAL1_SCREC_P))
+ return -1;
+ ielen--;
+ ie->h.present |= UNI_AAL1_SCREC_P;
+ ie->u.aal1.screc = *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_ECM_ID:
+ if(ielen == 0 || (ie->h.present & UNI_AAL1_ECM_P))
+ return -1;
+ ielen--;
+ ie->h.present |= UNI_AAL1_ECM_P;
+ ie->u.aal1.ecm = *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_BSIZE_ID:
+ if(ielen < 2 || (ie->h.present & UNI_AAL1_BSIZE_P))
+ return -1;
+ ielen -= 2;
+ ie->h.present |= UNI_AAL1_BSIZE_P;
+ ie->u.aal1.bsize = *msg->b_rptr++ << 8;
+ ie->u.aal1.bsize |= *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_PART_ID:
+ if(ielen == 0 || (ie->h.present & UNI_AAL1_PART_P))
+ return -1;
+ ielen--;
+ ie->h.present |= UNI_AAL1_PART_P;
+ ie->u.aal1.part = *msg->b_rptr++;
+ break;
+
+ default:
+ return -1;
+ }
+ }
+ if(!subtype_p || !cbr_p)
+ return -1;
+
+ return 0;
+}
+
+static int
+decode_aal_4(struct uni_ie_aal *ie, struct uni_msg *msg, u_int ielen)
+{
+ int fcpcs_p, bcpcs_p;
+
+ fcpcs_p = bcpcs_p = 0;
+
+ while(ielen-- > 0) {
+ switch(*msg->b_rptr++) {
+
+ case UNI_AAL_FWDCPCS_ID:
+ if(ielen < 2 || fcpcs_p)
+ return -1;
+ ielen -= 2;
+ fcpcs_p = 1;
+ ie->u.aal4.fwd_cpcs = *msg->b_rptr++ << 8;
+ ie->u.aal4.fwd_cpcs |= *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_BWDCPCS_ID:
+ if(ielen < 2 || bcpcs_p)
+ return -1;
+ ielen -= 2;
+ bcpcs_p = 1;
+ ie->u.aal4.bwd_cpcs = *msg->b_rptr++ << 8;
+ ie->u.aal4.bwd_cpcs |= *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_MID_ID:
+ if(ielen < 4 || (ie->h.present & UNI_AAL4_MID_P))
+ return -1;
+ ielen -= 4;
+ ie->h.present |= UNI_AAL4_MID_P;
+ ie->u.aal4.mid_low = *msg->b_rptr++ << 8;
+ ie->u.aal4.mid_low |= *msg->b_rptr++;
+ ie->u.aal4.mid_high = *msg->b_rptr++ << 8;
+ ie->u.aal4.mid_high |= *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_SSCS_ID:
+ if(ielen == 0 || (ie->h.present & UNI_AAL4_SSCS_P))
+ return -1;
+ ielen--;
+ ie->h.present |= UNI_AAL4_SSCS_P;
+ ie->u.aal4.sscs = *msg->b_rptr++;
+ break;
+
+ default:
+ return -1;
+ }
+ }
+
+ if(fcpcs_p ^ bcpcs_p)
+ return -1;
+ if(fcpcs_p)
+ ie->h.present |= UNI_AAL4_CPCS_P;
+
+ return 0;
+}
+
+static int
+decode_aal_5(struct uni_ie_aal *ie, struct uni_msg *msg, u_int ielen)
+{
+ int fcpcs_p, bcpcs_p;
+
+ fcpcs_p = bcpcs_p = 0;
+
+ while(ielen-- > 0) {
+ switch(*msg->b_rptr++) {
+
+ case UNI_AAL_FWDCPCS_ID:
+ if(ielen < 2 || fcpcs_p)
+ return -1;
+ ielen -= 2;
+ fcpcs_p = 1;
+ ie->u.aal5.fwd_cpcs = *msg->b_rptr++ << 8;
+ ie->u.aal5.fwd_cpcs |= *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_BWDCPCS_ID:
+ if(ielen < 2 || bcpcs_p)
+ return -1;
+ ielen -= 2;
+ bcpcs_p = 1;
+ ie->u.aal5.bwd_cpcs = *msg->b_rptr++ << 8;
+ ie->u.aal5.bwd_cpcs |= *msg->b_rptr++;
+ break;
+
+ case UNI_AAL_SSCS_ID:
+ if(ielen == 0 || (ie->h.present & UNI_AAL5_SSCS_P))
+ return -1;
+ ielen--;
+ ie->h.present |= UNI_AAL5_SSCS_P;
+ ie->u.aal5.sscs = *msg->b_rptr++;
+ break;
+
+ default:
+ return -1;
+ }
+ }
+
+ if(fcpcs_p ^ bcpcs_p)
+ return -1;
+ if(fcpcs_p)
+ ie->h.present |= UNI_AAL5_CPCS_P;
+
+ return 0;
+}
+
+static int
+decode_aal_user(struct uni_ie_aal *ie, struct uni_msg *msg, u_int ielen)
+{
+ if(ielen > 4)
+ return -1;
+
+ ie->u.aalu.len = 0;
+ while(ielen--)
+ ie->u.aalu.user[ie->u.aalu.len++] = *msg->b_rptr++;
+
+ return 0;
+}
+
+DEF_IE_DECODE(itu, aal)
+{
+ u_char c;
+
+ IE_START(DISC_ACC_ERR(AAL));
+
+ if(ielen < 1 || ielen > 21)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ ielen--;
+
+ switch(c) {
+
+ case UNI_AAL_0:
+ ie->type = c;
+ break;
+
+ case UNI_AAL_1:
+ ie->type = c;
+ if(decode_aal_1(ie, msg, ielen))
+ goto rej;
+ break;
+
+ case UNI_AAL_2:
+ ie->type = c;
+ break;
+
+ case UNI_AAL_4:
+ ie->type = c;
+ if(decode_aal_4(ie, msg, ielen))
+ goto rej;
+ break;
+
+ case UNI_AAL_5:
+ ie->type = c;
+ if(decode_aal_5(ie, msg, ielen))
+ goto rej;
+ break;
+
+ case UNI_AAL_USER:
+ ie->type = c;
+ if(decode_aal_user(ie, msg, ielen))
+ goto rej;
+ break;
+
+ default:
+ goto rej;
+ }
+
+ IE_END(AAL);
+}
+
+/*********************************************************************
+ *
+ * Traffic descriptor.
+ * Alternate traffic descriptor.
+ * Minimum traffic descriptor.
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 49...51
+ * Q.2961
+ * Q.2962
+ * UNI4.0 pp. 9...10, 106...109
+ *
+ * The Q.s specify the coding. UNI4.0 adds frame discard and best-effort.
+ * Appendix in UNI4.0 lists the allowed combinations.
+ *
+ * PCR0 PCR1 SCR/MBS0 SCR/MBS1 BE TAG FDISC ABR
+ * 1 CBR.1 - Y - - - N Y/N -
+ * 2 CBR.2 - Y - - - N Y/N - (*)
+ * 3 CBR.3 Y Y - - - Y Y/N - (*)
+ * 4 rt-VBR.1 - Y - Y - N Y/N -
+ * 5 rt-VBR.2 - Y Y - - N Y/N -
+ * 6 rt-VBR.3 - Y Y - - Y Y/N -
+ * 7 rt-VBR.4 Y Y - - - Y/N Y/N - (*)
+ * 8 rt-VBR.5 - Y - - - N Y/N - (*)
+ * 9 rt-VBR.6 - Y - Y - N Y/N - (*)
+ * 10 nrt-VBR.1 - Y - Y - N Y/N -
+ * 11 nrt-VBR.2 - Y Y - - N Y/N -
+ * 12 nrt-VBR.3 - Y Y - - Y Y/N -
+ * 13 nrt-VBR.4 Y Y - - - Y/N Y/N - (*)
+ * 14 nrt-VBR.5 - Y - - - N Y/N - (*)
+ * 15 nrt-VBR.6 - Y - Y - N Y/N - (*)
+ * 16 ABR - Y - - - N Y/N O (*)
+ * 17 UBR.1 - Y - - Y N Y/N -
+ * 18 UBR.2 - Y - - Y Y Y/N -
+ *
+ * Allow ITU-T and NET coding, because its not clear, whether the
+ * new fields in UNI4.0 should be used with NET coding or not.
+ * Does not allow for experimental codings yet.
+ */
+
+static void
+print_ie_traffic_common(struct unicx *cx, u_int present, struct uni_xtraffic *ie)
+{
+ uni_print_entry(cx, "fwd", "(");
+ if(present & UNI_TRAFFIC_FPCR0_P)
+ uni_printf(cx, "%u", ie->fpcr0);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_FPCR1_P)
+ uni_printf(cx, "%u", ie->fpcr1);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_FSCR0_P)
+ uni_printf(cx, "%u", ie->fscr0);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_FSCR1_P)
+ uni_printf(cx, "%u", ie->fscr1);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_FMBS0_P)
+ uni_printf(cx, "%u", ie->fmbs0);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_FMBS1_P)
+ uni_printf(cx, "%u", ie->fmbs1);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_FABR1_P)
+ uni_printf(cx, "%u", ie->fabr1);
+ uni_printf(cx, ")");
+
+ uni_print_entry(cx, "bwd", "(");
+ if(present & UNI_TRAFFIC_BPCR0_P)
+ uni_printf(cx, "%u", ie->bpcr0);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_BPCR1_P)
+ uni_printf(cx, "%u", ie->bpcr1);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_BSCR0_P)
+ uni_printf(cx, "%u", ie->bscr0);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_BSCR1_P)
+ uni_printf(cx, "%u", ie->bscr1);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_BMBS0_P)
+ uni_printf(cx, "%u", ie->bmbs0);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_BMBS1_P)
+ uni_printf(cx, "%u", ie->bmbs1);
+ uni_putc(',', cx);
+ if(present & UNI_TRAFFIC_BABR1_P)
+ uni_printf(cx, "%u", ie->babr1);
+ uni_printf(cx, ")");
+
+ if(present & UNI_TRAFFIC_BEST_P)
+ uni_print_flag("best_effort", cx);
+ if(present & UNI_TRAFFIC_MOPT_P) {
+ uni_print_entry(cx, "tag", "(");
+ if(ie->ftag)
+ uni_printf(cx, "fwd");
+ uni_putc(',', cx);
+ if(ie->btag)
+ uni_printf(cx, "bwd");
+ uni_putc(')', cx);
+
+ uni_print_entry(cx, "disc", "(");
+ if(ie->fdisc)
+ uni_printf(cx, "fwd");
+ uni_putc(',', cx);
+ if(ie->bdisc)
+ uni_printf(cx, "bwd");
+ uni_putc(')', cx);
+ }
+}
+
+struct tallow {
+ u_int mask;
+ int mopt_flag;
+ u_char mopt_mask, mopt_val;
+};
+
+static int
+check_traffic(u_int mask, u_int mopt, struct tallow *a)
+{
+ if(mask != a->mask)
+ return 0;
+
+ if(a->mopt_flag == 0) {
+ /* not allowed */
+ if(mopt == 0xffff)
+ return 1;
+ return 0;
+ }
+
+ if(a->mopt_flag < 0) {
+ /* optional */
+ if(mopt == 0xffff)
+ return 1;
+ if((mopt & a->mopt_mask) == a->mopt_val)
+ return 1;
+ return 0;
+ }
+
+ /* required */
+ if(mopt == 0xffff)
+ return 0;
+ if((mopt & a->mopt_mask) == a->mopt_val)
+ return 1;
+ return 0;
+}
+
+static int
+check_ie_traffic_common(struct uni_xtraffic *ie, u_int present,
+ struct unicx *cx __unused)
+{
+ static u_int fmask =
+ UNI_TRAFFIC_FPCR0_P | UNI_TRAFFIC_FPCR1_P |
+ UNI_TRAFFIC_FSCR0_P | UNI_TRAFFIC_FSCR1_P |
+ UNI_TRAFFIC_FMBS0_P | UNI_TRAFFIC_FMBS1_P |
+ UNI_TRAFFIC_FABR1_P;
+ static u_int bmask =
+ UNI_TRAFFIC_BPCR0_P | UNI_TRAFFIC_BPCR1_P |
+ UNI_TRAFFIC_BSCR0_P | UNI_TRAFFIC_BSCR1_P |
+ UNI_TRAFFIC_BMBS0_P | UNI_TRAFFIC_BMBS1_P |
+ UNI_TRAFFIC_BABR1_P;
+#define DTAB(U,X) \
+ { U##X##PCR1_P, \
+ -1, U##X##TAG, 0 }, /* 1, 2, 8, 14 */ \
+ { U##X##PCR0_P | U##X##PCR1_P, \
+ +1, U##X##TAG, U##X##TAG }, /* 3 */ \
+ { U##X##PCR1_P | U##X##SCR1_P | U##X##MBS1_P, \
+ -1, U##X##TAG, 0 }, /* 4, 9, 10, 15 */ \
+ { U##X##PCR1_P | U##X##SCR0_P | U##X##MBS0_P, \
+ -1, 0, 0 }, /* 5, 6, 11, 12 */ \
+ { U##X##PCR0_P | U##X##PCR1_P, \
+ -1, 0, 0 }, /* 7, 13 */ \
+ { U##X##PCR1_P | U##X##ABR1_P, \
+ -1, U##X##TAG, 0 }, /* 16a */
+#define DTABSIZE 6
+
+ static struct tallow allow[2][DTABSIZE] = {
+ { DTAB(UNI_TRAFFIC_, F) },
+ { DTAB(UNI_TRAFFIC_, B) },
+ };
+#undef DTAB
+
+ u_int f, b, p, m;
+ int i;
+
+ f = present & fmask;
+ b = present & bmask;
+ p = present & (fmask | bmask);
+ m = (present & UNI_TRAFFIC_MOPT_P)
+ ? ( (ie->ftag ? UNI_TRAFFIC_FTAG : 0)
+ | (ie->btag ? UNI_TRAFFIC_BTAG : 0)
+ | (ie->fdisc ? UNI_TRAFFIC_FDISC : 0)
+ | (ie->bdisc ? UNI_TRAFFIC_BDISC : 0))
+ : 0xffff;
+
+
+ if(present & UNI_TRAFFIC_BEST_P) {
+ /*
+ * Lines 17 and 18
+ */
+ if(p != (UNI_TRAFFIC_FPCR1_P | UNI_TRAFFIC_BPCR1_P))
+ return -1;
+ return 0;
+ }
+
+ /*
+ * Check forward and backward independent. There must be a higher
+ * level checking in the CAC
+ */
+ for(i = 0; i < DTABSIZE; i++)
+ if(check_traffic(f, m, &allow[0][i]))
+ break;
+ if(i == DTABSIZE)
+ return -1;
+
+ for(i = 0; i < DTABSIZE; i++)
+ if(check_traffic(b, m, &allow[1][i]))
+ break;
+ if(i == DTABSIZE)
+ return -1;
+
+ return 0;
+}
+
+static int
+encode_traffic_common(struct uni_msg *msg, struct uni_xtraffic *ie,
+ u_int present, struct unicx *cx __unused)
+{
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_FPCR0_P,
+ UNI_TRAFFIC_FPCR0_ID, ie->fpcr0);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_BPCR0_P,
+ UNI_TRAFFIC_BPCR0_ID, ie->bpcr0);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_FPCR1_P,
+ UNI_TRAFFIC_FPCR1_ID, ie->fpcr1);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_BPCR1_P,
+ UNI_TRAFFIC_BPCR1_ID, ie->bpcr1);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_FSCR0_P,
+ UNI_TRAFFIC_FSCR0_ID, ie->fscr0);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_BSCR0_P,
+ UNI_TRAFFIC_BSCR0_ID, ie->bscr0);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_FSCR1_P,
+ UNI_TRAFFIC_FSCR1_ID, ie->fscr1);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_BSCR1_P,
+ UNI_TRAFFIC_BSCR1_ID, ie->bscr1);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_FMBS0_P,
+ UNI_TRAFFIC_FMBS0_ID, ie->fmbs0);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_BMBS0_P,
+ UNI_TRAFFIC_BMBS0_ID, ie->bmbs0);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_FMBS1_P,
+ UNI_TRAFFIC_FMBS1_ID, ie->fmbs1);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_BMBS1_P,
+ UNI_TRAFFIC_BMBS1_ID, ie->bmbs1);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_FABR1_P,
+ UNI_TRAFFIC_FABR1_ID, ie->fabr1);
+ APP_OPT_24BIT(msg, present, UNI_TRAFFIC_BABR1_P,
+ UNI_TRAFFIC_BABR1_ID, ie->babr1);
+
+ APP_OPT(msg, present, UNI_TRAFFIC_BEST_P,
+ UNI_TRAFFIC_BEST_ID);
+ APP_OPT_BYTE(msg, present, UNI_TRAFFIC_MOPT_P,
+ UNI_TRAFFIC_MOPT_ID,
+ (ie->ftag ? UNI_TRAFFIC_FTAG : 0) |
+ (ie->btag ? UNI_TRAFFIC_BTAG : 0) |
+ (ie->fdisc ? UNI_TRAFFIC_FDISC : 0) |
+ (ie->fdisc ? UNI_TRAFFIC_BDISC : 0));
+
+ return 0;
+}
+
+static int
+decode_traffic_common(struct uni_xtraffic *ie, struct uni_msg *msg,
+ u_int ielen, u_int *present)
+{
+ u_char c;
+
+ while(ielen--) {
+ switch(c = *msg->b_rptr++) {
+
+ default:
+ rej:
+ return -1;
+
+ DEC_GETF3(TRAFFIC_FPCR0, fpcr0, *present);
+ DEC_GETF3(TRAFFIC_BPCR0, bpcr0, *present);
+ DEC_GETF3(TRAFFIC_FPCR1, fpcr1, *present);
+ DEC_GETF3(TRAFFIC_BPCR1, bpcr1, *present);
+ DEC_GETF3(TRAFFIC_FSCR0, fscr0, *present);
+ DEC_GETF3(TRAFFIC_BSCR0, bscr0, *present);
+ DEC_GETF3(TRAFFIC_FSCR1, fscr1, *present);
+ DEC_GETF3(TRAFFIC_BSCR1, bscr1, *present);
+ DEC_GETF3(TRAFFIC_FMBS0, fmbs0, *present);
+ DEC_GETF3(TRAFFIC_BMBS0, bmbs0, *present);
+ DEC_GETF3(TRAFFIC_BMBS1, bmbs1, *present);
+ DEC_GETF3(TRAFFIC_FABR1, fabr1, *present);
+ DEC_GETF3(TRAFFIC_BABR1, babr1, *present);
+
+ case UNI_TRAFFIC_BEST_ID:
+ *present |= UNI_TRAFFIC_BEST_P;
+ break;
+
+ case UNI_TRAFFIC_MOPT_ID:
+ if(ielen == 0)
+ return -1;
+ ielen--;
+ if(!(*present & UNI_TRAFFIC_MOPT_P)) {
+ *present |= UNI_TRAFFIC_MOPT_P;
+ ie->ftag = (*msg->b_rptr&UNI_TRAFFIC_FTAG)?1:0;
+ ie->btag = (*msg->b_rptr&UNI_TRAFFIC_BTAG)?1:0;
+ ie->fdisc = (*msg->b_rptr&UNI_TRAFFIC_FDISC)?1:0;
+ ie->bdisc = (*msg->b_rptr&UNI_TRAFFIC_BDISC)?1:0;
+ }
+ msg->b_rptr++;
+ break;
+ }
+ }
+ return 0;
+}
+
+
+/*****************************************************************/
+
+DEF_IE_PRINT(itu, traffic)
+{
+ if(uni_print_iehdr("traffic", &ie->h, cx))
+ return;
+ print_ie_traffic_common(cx, ie->h.present, &ie->t);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, traffic)
+{
+ return check_ie_traffic_common(&ie->t, ie->h.present, cx);
+}
+
+DEF_IE_ENCODE(itu, traffic)
+{
+ START_IE(traffic, UNI_IE_TRAFFIC, 26);
+ encode_traffic_common(msg, &ie->t, ie->h.present, cx);
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, traffic)
+{
+ IE_START(;);
+
+ if(ielen > 30)
+ goto rej;
+
+ if(decode_traffic_common(&ie->t, msg, ielen, &ie->h.present))
+ goto rej;
+
+ IE_END(TRAFFIC);
+}
+
+/*****************************************************************/
+
+DEF_IE_PRINT(itu, atraffic)
+{
+ if(uni_print_iehdr("atraffic", &ie->h, cx))
+ return;
+ print_ie_traffic_common(cx, ie->h.present, &ie->t);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, atraffic)
+{
+ return check_ie_traffic_common(&ie->t, ie->h.present, cx);
+}
+
+DEF_IE_ENCODE(itu, atraffic)
+{
+ START_IE(traffic, UNI_IE_ATRAFFIC, 26);
+ encode_traffic_common(msg, &ie->t, ie->h.present, cx);
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, atraffic)
+{
+ IE_START(;);
+
+ if(ielen > 30)
+ goto rej;
+
+ if(decode_traffic_common(&ie->t, msg, ielen, &ie->h.present))
+ goto rej;
+
+ IE_END(ATRAFFIC);
+}
+
+/*****************************************************************/
+
+DEF_IE_PRINT(itu, mintraffic)
+{
+ if(uni_print_iehdr("mintraffic", &ie->h, cx))
+ return;
+
+ uni_print_entry(cx, "pcr0", "(");
+ if(ie->h.present & UNI_MINTRAFFIC_FPCR0_P)
+ uni_printf(cx, "%u", ie->fpcr0);
+ uni_putc(',', cx);
+ if(ie->h.present & UNI_MINTRAFFIC_BPCR0_P)
+ uni_printf(cx, "%u", ie->bpcr0);
+ uni_putc(')', cx);
+
+ uni_print_entry(cx, "pcr1", "(");
+ if(ie->h.present & UNI_MINTRAFFIC_FPCR1_P)
+ uni_printf(cx, "%u", ie->fpcr1);
+ uni_putc(',', cx);
+ if(ie->h.present & UNI_MINTRAFFIC_BPCR1_P)
+ uni_printf(cx, "%u", ie->bpcr1);
+ uni_putc(')', cx);
+
+ uni_print_entry(cx, "abr1", "(");
+ if(ie->h.present & UNI_MINTRAFFIC_FABR1_P)
+ uni_printf(cx, "%u", ie->fabr1);
+ uni_putc(',', cx);
+ if(ie->h.present & UNI_MINTRAFFIC_BABR1_P)
+ uni_printf(cx, "%u", ie->babr1);
+ uni_printf(cx, ")");
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, mintraffic)
+{
+ u_int abr;
+ u_int xbr;
+ cx = cx;
+
+ abr = ie->h.present & (UNI_MINTRAFFIC_FABR1_P|UNI_MINTRAFFIC_BABR1_P);
+ xbr = ie->h.present & (UNI_MINTRAFFIC_FPCR0_P|UNI_MINTRAFFIC_BPCR0_P|
+ UNI_MINTRAFFIC_FPCR1_P|UNI_MINTRAFFIC_BPCR1_P);
+
+ if(abr && xbr)
+ return -1;
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, mintraffic)
+{
+ START_IE(mintraffic, UNI_IE_MINTRAFFIC, 16);
+
+ APP_OPT_24BIT(msg, ie->h.present, UNI_MINTRAFFIC_FPCR0_P,
+ UNI_TRAFFIC_FPCR0_ID, ie->fpcr0);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_MINTRAFFIC_BPCR0_P,
+ UNI_TRAFFIC_BPCR0_ID, ie->bpcr0);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_MINTRAFFIC_FPCR1_P,
+ UNI_TRAFFIC_FPCR1_ID, ie->fpcr1);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_MINTRAFFIC_BPCR1_P,
+ UNI_TRAFFIC_BPCR1_ID, ie->bpcr1);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_MINTRAFFIC_FABR1_P,
+ UNI_TRAFFIC_FABR1_ID, ie->fabr1);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_MINTRAFFIC_BABR1_P,
+ UNI_TRAFFIC_BABR1_ID, ie->babr1);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, mintraffic)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen > 20)
+ goto rej;
+
+ while(ielen--) {
+ switch(c = *msg->b_rptr++) {
+
+ default:
+ goto rej;
+
+ DEC_GETF3(MINTRAFFIC_FPCR0, fpcr0, ie->h.present);
+ DEC_GETF3(MINTRAFFIC_BPCR0, bpcr0, ie->h.present);
+ DEC_GETF3(MINTRAFFIC_FPCR1, fpcr1, ie->h.present);
+ DEC_GETF3(MINTRAFFIC_BPCR1, bpcr1, ie->h.present);
+ DEC_GETF3(MINTRAFFIC_FABR1, fabr1, ie->h.present);
+ DEC_GETF3(MINTRAFFIC_BABR1, babr1, ie->h.present);
+ }
+ }
+
+ IE_END(MINTRAFFIC);
+}
+
+/*****************************************************************/
+
+DEF_IE_PRINT(net, mdcr)
+{
+ static const struct uni_print_tbl origin_tbl[] = {
+ MKT(UNI_MDCR_ORIGIN_USER, user),
+ MKT(UNI_MDCR_ORIGIN_NET, net),
+ EOT()
+ };
+
+ if(uni_print_iehdr("mdcr", &ie->h, cx))
+ return;
+
+ uni_print_tbl("origin", ie->origin, origin_tbl, cx);
+ uni_print_entry(cx, "mdcr", "(");
+ uni_printf(cx, "%u", ie->fmdcr);
+ uni_putc(',', cx);
+ uni_printf(cx, "%u", ie->bmdcr);
+ uni_putc(')', cx);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, mdcr)
+{
+ cx = cx;
+
+ if ((ie->origin != UNI_MDCR_ORIGIN_USER &&
+ ie->origin != UNI_MDCR_ORIGIN_NET) ||
+ ie->fmdcr >= (1 << 24) || ie->bmdcr >= (1 << 24))
+ return (-1);
+
+ return (0);
+}
+
+DEF_IE_ENCODE(net, mdcr)
+{
+ START_IE(mdcr, UNI_IE_MDCR, 9);
+
+ APP_BYTE(msg, ie->origin);
+ APP_SUB_24BIT(msg, UNI_TRAFFIC_FMDCR_ID, ie->fmdcr);
+ APP_SUB_24BIT(msg, UNI_TRAFFIC_BMDCR_ID, ie->bmdcr);
+
+ SET_IE_LEN(msg);
+ return (0);
+}
+
+DEF_IE_DECODE(net, mdcr)
+{
+ u_char c;
+#define UNI_TRAFFIC_FMDCR_P 0x01
+#define UNI_TRAFFIC_BMDCR_P 0x02
+ u_int p = 0;
+
+ IE_START(;);
+
+ if(ielen != 9)
+ goto rej;
+
+ ie->origin = *msg->b_rptr++;
+ ielen--;
+
+ while(ielen--) {
+ switch(c = *msg->b_rptr++) {
+
+ default:
+ goto rej;
+
+ DEC_GETF3(TRAFFIC_FMDCR, fmdcr, p);
+ DEC_GETF3(TRAFFIC_BMDCR, bmdcr, p);
+ }
+ }
+ if (p != (UNI_TRAFFIC_FMDCR_P | UNI_TRAFFIC_BMDCR_P))
+ goto rej;
+
+ IE_END(MDCR);
+}
+
+/*********************************************************************
+ *
+ * Connection identifier
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 69...70
+ * UNI4.0 pp. 15...16
+ * PNNI1.0 p. 198
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, connid)
+{
+ static const struct uni_print_tbl tbl[] = {
+ MKT(UNI_CONNID_VCI, exclusive),
+ MKT(UNI_CONNID_ANYVCI, any),
+ MKT(UNI_CONNID_NOVCI, no),
+ EOT()
+ };
+ static const struct uni_print_tbl assoc_tbl[] = {
+ MKT(UNI_CONNID_ASSOC, associated),
+ MKT(UNI_CONNID_NONASSOC,non-associated),
+ EOT()
+ };
+
+ if(uni_print_iehdr("connid", &ie->h, cx))
+ return;
+
+ uni_print_tbl("mode", ie->assoc, assoc_tbl, cx);
+ uni_print_entry(cx, "connid", "(%u,", ie->vpci);
+ if(ie->type == UNI_CONNID_VCI)
+ uni_printf(cx, "%u", ie->vci);
+ else
+ uni_print_tbl(NULL, ie->type, tbl, cx);
+ uni_printf(cx, ")");
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, connid)
+{
+ cx = cx;
+ switch(ie->type) {
+ default:
+ return -1;
+ case UNI_CONNID_VCI:
+ case UNI_CONNID_ANYVCI:
+ case UNI_CONNID_NOVCI:
+ break;
+ }
+
+#if 0
+ /*
+ * This field must be checked by the application to fulfil
+ * Q.2931Amd4 27) 5.2.3 last sentence
+ */
+ switch(ie->assoc) {
+
+ case UNI_CONNID_ASSOC:
+ if(!cx->cx.pnni)
+ return -1;
+ break;
+
+ case UNI_CONNID_NONASSOC:
+ break;
+
+ default:
+ return -1;
+ }
+#endif
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, connid)
+{
+ START_IE(connid, UNI_IE_CONNID, 5);
+
+ APP_BYTE(msg, 0x80 | (ie->assoc << 3) | ie->type);
+ APP_BYTE(msg, ie->vpci >> 8);
+ APP_BYTE(msg, ie->vpci >> 0);
+ APP_BYTE(msg, ie->vci >> 8);
+ APP_BYTE(msg, ie->vci >> 0);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, connid)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen != 5)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ if((c & 0x80) == 0)
+ goto rej;
+ ie->assoc = (c >> 3) & 3;
+ ie->type = c & 7;
+ ie->vpci = *msg->b_rptr++ << 8;
+ ie->vpci |= *msg->b_rptr++;
+ ie->vci = *msg->b_rptr++ << 8;
+ ie->vci |= *msg->b_rptr++;
+
+ IE_END(CONNID);
+}
+
+/*********************************************************************
+ *
+ * Quality of Service
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 72
+ * UNI4.0 pp. 16...17
+ */
+
+static void
+print_qos(struct unicx *cx, struct uni_ie_qos *ie)
+{
+ static const struct uni_print_tbl class_tbl[] = {
+ MKT(UNI_QOS_CLASS0, Class0),
+ MKT(UNI_QOS_CLASS1, Class1),
+ MKT(UNI_QOS_CLASS2, Class2),
+ MKT(UNI_QOS_CLASS3, Class3),
+ MKT(UNI_QOS_CLASS4, Class4),
+ EOT()
+ };
+
+ if(uni_print_iehdr("qos", &ie->h, cx))
+ return;
+
+ uni_print_tbl("fwd", ie->fwd, class_tbl, cx);
+ uni_print_tbl("bwd", ie->bwd, class_tbl, cx);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_PRINT(itu, qos)
+{
+ print_qos(cx, ie);
+}
+DEF_IE_PRINT(net, qos)
+{
+ print_qos(cx, ie);
+}
+
+DEF_IE_CHECK(itu, qos)
+{
+ cx = cx;
+
+ switch(ie->fwd) {
+ default:
+ return -1;
+
+ case UNI_QOS_CLASS0:
+ break;
+ }
+ switch(ie->bwd) {
+ default:
+ return -1;
+
+ case UNI_QOS_CLASS0:
+ break;
+ }
+ return 0;
+}
+
+DEF_IE_CHECK(net, qos)
+{
+ cx = cx;
+
+ switch(ie->fwd) {
+ default:
+ return -1;
+
+ case UNI_QOS_CLASS1:
+ case UNI_QOS_CLASS2:
+ case UNI_QOS_CLASS3:
+ case UNI_QOS_CLASS4:
+ break;
+ }
+ switch(ie->bwd) {
+ default:
+ return -1;
+
+ case UNI_QOS_CLASS1:
+ case UNI_QOS_CLASS2:
+ case UNI_QOS_CLASS3:
+ case UNI_QOS_CLASS4:
+ break;
+ }
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, qos)
+{
+ START_IE(qos, UNI_IE_QOS, 2);
+
+ APP_BYTE(msg, ie->fwd);
+ APP_BYTE(msg, ie->bwd);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+DEF_IE_ENCODE(net, qos)
+{
+ START_IE(qos, UNI_IE_QOS, 2);
+
+ APP_BYTE(msg, ie->fwd);
+ APP_BYTE(msg, ie->bwd);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, qos)
+{
+ IE_START(;);
+
+ if(ielen != 2)
+ goto rej;
+
+ ie->fwd = *msg->b_rptr++;
+ ie->bwd = *msg->b_rptr++;
+
+ IE_END(QOS);
+}
+
+DEF_IE_DECODE(net, qos)
+{
+ IE_START(;);
+
+ if(ielen != 2)
+ goto rej;
+
+ ie->fwd = *msg->b_rptr++;
+ ie->bwd = *msg->b_rptr++;
+
+ IE_END(QOS);
+}
+
+/*********************************************************************
+ *
+ * Broadband Lower Layer Information
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 53...54
+ * UNI4.0 p. 12
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, bhli)
+{
+ static const struct uni_print_tbl type_tbl[] = {
+ MKT(UNI_BHLI_ISO, iso),
+ MKT(UNI_BHLI_USER, user),
+ MKT(UNI_BHLI_VENDOR, vendor),
+ EOT()
+ };
+ u_int i;
+
+ if(uni_print_iehdr("bhli", &ie->h, cx))
+ return;
+
+ uni_print_tbl("type", ie->type, type_tbl, cx);
+ uni_print_entry(cx, "len", "%d", ie->len);
+ uni_print_entry(cx, "info", "(");
+ for(i = 0; i < ie->len; i++)
+ uni_printf(cx, ",0x%02x", ie->info[i]);
+ uni_printf(cx, ")");
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, bhli)
+{
+ cx = cx;
+
+ switch(ie->type) {
+ default:
+ return -1;
+
+ case UNI_BHLI_ISO:
+ case UNI_BHLI_USER:
+ case UNI_BHLI_VENDOR:
+ break;
+ }
+ if(ie->len > 8)
+ return -1;
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, bhli)
+{
+ START_IE(bhli, UNI_IE_BHLI, 9);
+
+ APP_BYTE(msg, 0x80 | ie->type);
+ APP_BUF(msg, ie->info, ie->len);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, bhli)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen > 9)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ ielen--;
+
+ if(!(c & 0x80))
+ goto rej;
+ ie->type = c & 0x7f;
+ ie->len = ielen;
+ (void)memcpy(ie->info, msg->b_rptr, ielen);
+ msg->b_rptr += ielen;
+
+ IE_END(BHLI);
+}
+
+/*********************************************************************
+ *
+ * Broadband bearer capabilities
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 51...52
+ * Q.2931 Amd 1
+ * UNI4.0 pp. 10...12, 106...109
+ *
+ * UNI4.0 changed the meaning of byte 5a. Instead of 3 bit traffic type and
+ * 2 bit timing requirements there are now 7 bits ATM transfer capabilities.
+ * However the old format is still supported: it should be recognized on
+ * input, but never be generated on output. Mapping is left to the user of
+ * UNI.
+ *
+ * Amd 1 not checked XXX.
+ *
+ * The Appendix in UNI4.0 lists all the supported combinations of various
+ * traffic IE's. The check function implements part of it.
+ *
+ * A C X VP
+ * 1 CBR.1 7 . 7 7
+ * 2 CBR.2 - . 4,5,6 5 (*)
+ * 3 CBR.3 - . 4,5,6 5 (*)
+ * 4 rt-VBR.1 . 19 19 19
+ * 5 rt-VBR.2 . 9 1,9 9
+ * 6 rt-VBR.3 . 9 1,9 9
+ * 7 rt-VBR.4 . . 1,9 . (*)
+ * 8 rt-VBR.5 . . 1,9 . (*)
+ * 9 rt-VBR.6 . 9 1,9 9 (*)
+ * 10 nrt-VBR.1 . 11 11 11
+ * 11 nrt-VBR.2 . - -,0,2,8,10 -,10
+ * 12 nrt-VBR.3 . - -,0,2,8,10 -,10
+ * 13 nrt-VBR.4 . - -,0,2,8,10 . (*)
+ * 14 nrt-VBR.5 . - -,0,2,8,10 . (*)
+ * 15 nrt-VBR.6 . - -,0,2,8,10 -,10(*)
+ * 16 ABR . 12 12 12
+ * 17 UBR.1 . - -,0,2,8,10 -,10
+ * 18 UBR.2 . - -,0,2,8,10 -,10
+ *
+ * (*) compatibility
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, bearer)
+{
+ static const struct uni_print_tbl bclass_tbl[] = {
+ MKT(UNI_BEARER_A, bcob-A),
+ MKT(UNI_BEARER_C, bcob-C),
+ MKT(UNI_BEARER_X, bcob-X),
+ MKT(UNI_BEARER_TVP, transparent-VP),
+ EOT()
+ };
+ static const struct uni_print_tbl atc_tbl[] = {
+ MKT(UNI_BEARER_ATC_CBR, cbr),
+ MKT(UNI_BEARER_ATC_CBR1, cbr1),
+ MKT(UNI_BEARER_ATC_VBR, vbr),
+ MKT(UNI_BEARER_ATC_VBR1, vbr1),
+ MKT(UNI_BEARER_ATC_NVBR, nvbr),
+ MKT(UNI_BEARER_ATC_NVBR1, nvbr1),
+ MKT(UNI_BEARER_ATC_ABR, abr),
+
+ MKT(UNI_BEARER_ATCX_0, x0),
+ MKT(UNI_BEARER_ATCX_1, x1),
+ MKT(UNI_BEARER_ATCX_2, x2),
+ MKT(UNI_BEARER_ATCX_4, x4),
+ MKT(UNI_BEARER_ATCX_6, x6),
+ MKT(UNI_BEARER_ATCX_8, x8),
+ EOT()
+ };
+ static const struct uni_print_tbl cfg_tbl[] = {
+ MKT(UNI_BEARER_P2P, p2p),
+ MKT(UNI_BEARER_MP, mp),
+ EOT()
+ };
+ static const struct uni_print_tbl clip_tbl[] = {
+ MKT(UNI_BEARER_NOCLIP, no),
+ MKT(UNI_BEARER_CLIP, yes),
+ EOT()
+ };
+
+ if(uni_print_iehdr("bearer", &ie->h, cx))
+ return;
+
+ uni_print_tbl("class", ie->bclass, bclass_tbl, cx);
+
+ if(ie->h.present & UNI_BEARER_ATC_P) {
+ uni_print_tbl("atc", ie->atc, atc_tbl, cx);
+ }
+ uni_print_tbl("clip", ie->clip, clip_tbl, cx);
+ uni_print_tbl("cfg", ie->cfg, cfg_tbl, cx);
+
+ uni_print_ieend(cx);
+}
+
+#define QTYPE(C,A) ((UNI_BEARER_##C << 8) | UNI_BEARER_ATC_##A)
+#define QTYPEX(C,A) ((UNI_BEARER_##C << 8) | UNI_BEARER_ATCX_##A)
+#define QTYPE0(C) ((UNI_BEARER_##C << 8) | (1 << 16))
+DEF_IE_CHECK(itu, bearer)
+{
+ cx = cx;
+
+ switch((ie->bclass << 8) |
+ ((ie->h.present & UNI_BEARER_ATC_P) == 0
+ ? (1 << 16)
+ : ie->atc)) {
+
+ default:
+ return -1;
+
+ case QTYPE (A, CBR1): /* 1 */
+ case QTYPE (X, CBR1): /* 1 */
+ case QTYPE (TVP, CBR1): /* 1 */
+
+ case QTYPE0(A): /* 2,3 */
+ case QTYPEX(X, 4): /* 2,3 */
+ case QTYPE (X, CBR): /* 2,3 */
+ case QTYPEX(X, 6): /* 2,3 */
+ case QTYPE (TVP, CBR): /* 2,3 */
+
+ case QTYPE (C, VBR1): /* 4 */
+ case QTYPE (X, VBR1): /* 4 */
+ case QTYPE (TVP, VBR1): /* 4 */
+
+ case QTYPE (C, VBR): /* 5,6,9 */
+ case QTYPEX(X, 1): /* 5,6,7,8,9 */
+ case QTYPE (X, VBR): /* 5,6,7,8,9 */
+ case QTYPE (TVP, VBR): /* 5,6,9 */
+
+ case QTYPE (C, NVBR1): /* 10 */
+ case QTYPE (X, NVBR1): /* 10 */
+ case QTYPE (TVP, NVBR1): /* 10 */
+
+ case QTYPE0(C): /* 11,12,13,14,15,17,18 */
+ case QTYPE0(X): /* 11,12,13,14,15,17,18 */
+ case QTYPEX(X, 0): /* 11,12,13,14,15,17,18 */
+ case QTYPEX(X, 2): /* 11,12,13,14,15,17,18 */
+ case QTYPEX(X, 8): /* 11,12,13,14,15,17,18 */
+ case QTYPE (X, NVBR): /* 11,12,13,14,15,17,18 */
+ case QTYPE0(TVP): /* 11,12,15,17,18 */
+ case QTYPE (TVP, NVBR): /* 11,12,15,17,18 */
+
+ case QTYPE (C, ABR): /* 16 */
+ case QTYPE (X, ABR): /* 16 */
+ case QTYPE (TVP, ABR): /* 16 */
+ break;
+ }
+
+ switch(ie->clip) {
+ default:
+ return -1;
+
+ case UNI_BEARER_NOCLIP:
+ case UNI_BEARER_CLIP:
+ break;
+ }
+ switch(ie->cfg) {
+ default:
+ return -1;
+
+ case UNI_BEARER_P2P:
+ case UNI_BEARER_MP:
+ break;
+ }
+
+ return 0;
+}
+#undef QTYPE
+#undef QTYPEX
+#undef QTYPE0
+
+DEF_IE_ENCODE(itu, bearer)
+{
+ START_IE(bearer, UNI_IE_BEARER, 3);
+
+ APP_BYTE(msg, ie->bclass |
+ ((ie->h.present & UNI_BEARER_ATC_P) ? 0:0x80));
+ APP_OPT(msg, ie->h.present, UNI_BEARER_ATC_P,
+ 0x80 | ie->atc);
+ APP_BYTE(msg, 0x80 | (ie->clip << 5) | ie->cfg);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, bearer)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen != 2 && ielen != 3)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ ielen--;
+ ie->bclass = c & 0x1f;
+ if(!(c & 0x80)) {
+ c = *msg->b_rptr++;
+ ielen--;
+ ie->h.present |= UNI_BEARER_ATC_P;
+
+ switch(c & 0x7f) {
+ /*
+ * Real legal values
+ */
+ case UNI_BEARER_ATC_CBR:
+ case UNI_BEARER_ATC_CBR1:
+ case UNI_BEARER_ATC_VBR:
+ case UNI_BEARER_ATC_VBR1:
+ case UNI_BEARER_ATC_NVBR:
+ case UNI_BEARER_ATC_NVBR1:
+ case UNI_BEARER_ATC_ABR:
+ break;
+
+ /*
+ * Compat values
+ */
+ case UNI_BEARER_ATCX_0:
+ case UNI_BEARER_ATCX_1:
+ case UNI_BEARER_ATCX_2:
+ case UNI_BEARER_ATCX_4:
+ case UNI_BEARER_ATCX_6:
+ case UNI_BEARER_ATCX_8:
+ break;
+
+ default:
+ goto rej;
+ }
+
+ if(!(c & 0x80))
+ goto rej;
+
+ ie->atc = c & 0x7f;
+ }
+ if(ielen == 0)
+ goto rej;
+ c = *msg->b_rptr++;
+ ielen--;
+ if(!(c & 0x80))
+ goto rej;
+ ie->clip = (c >> 5) & 0x3;
+ ie->cfg = c & 0x3;
+
+ IE_END(BEARER);
+}
+
+/*********************************************************************
+ *
+ * Broadband Lower Layer Information
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 54...59
+ * UNI4.0 pp. 12...14
+ *
+ * UNI4.0 states, that layer 1 info is not supported.
+ * We allow a layer 1 protocol identifier.
+ *
+ * UNI4.0 states, that the layer information subelements are NOT position
+ * dependent. We allow them in any order on input, but generate always the
+ * definit order on output.
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, blli)
+{
+ static const struct uni_print_tbl l2_tbl[] = {
+ MKT(UNI_BLLI_L2_BASIC, basic),
+ MKT(UNI_BLLI_L2_Q921, Q921),
+ MKT(UNI_BLLI_L2_X25LL, X25-LL),
+ MKT(UNI_BLLI_L2_X25ML, X25-ML),
+ MKT(UNI_BLLI_L2_LABP, LAPB),
+ MKT(UNI_BLLI_L2_HDLC_ARM, HDLC-ARM),
+ MKT(UNI_BLLI_L2_HDLC_NRM, HDLC-NRM),
+ MKT(UNI_BLLI_L2_HDLC_ABM, HDLC-ABM),
+ MKT(UNI_BLLI_L2_LAN, LAN),
+ MKT(UNI_BLLI_L2_X75, X75),
+ MKT(UNI_BLLI_L2_Q922, Q922),
+ MKT(UNI_BLLI_L2_USER, user),
+ MKT(UNI_BLLI_L2_ISO7776, ISO7776),
+ EOT()
+ };
+ static const struct uni_print_tbl l2mode_tbl[] = {
+ MKT(UNI_BLLI_L2NORM, normal),
+ MKT(UNI_BLLI_L2EXT, extended),
+ EOT()
+ };
+ static const struct uni_print_tbl l3_tbl[] = {
+ MKT(UNI_BLLI_L3_X25, X25),
+ MKT(UNI_BLLI_L3_ISO8208, ISO8208),
+ MKT(UNI_BLLI_L3_X223, X223),
+ MKT(UNI_BLLI_L3_CLMP, CLMP),
+ MKT(UNI_BLLI_L3_T70, T70),
+ MKT(UNI_BLLI_L3_TR9577, TR9577),
+ MKT(UNI_BLLI_L3_USER, user),
+ MKT(UNI_BLLI_L3_H310, H310),
+ MKT(UNI_BLLI_L3_H321, H321),
+ EOT()
+ };
+ static const struct uni_print_tbl l3mode_tbl[] = {
+ MKT(UNI_BLLI_L3NSEQ, normal-seq),
+ MKT(UNI_BLLI_L3ESEQ, extended-seq),
+ EOT()
+ };
+ static const struct uni_print_tbl l3psiz_tbl[] = {
+ MKT(UNI_BLLI_L3_16, 16),
+ MKT(UNI_BLLI_L3_32, 32),
+ MKT(UNI_BLLI_L3_64, 64),
+ MKT(UNI_BLLI_L3_128, 128),
+ MKT(UNI_BLLI_L3_256, 256),
+ MKT(UNI_BLLI_L3_512, 512),
+ MKT(UNI_BLLI_L3_1024, 1024),
+ MKT(UNI_BLLI_L3_2048, 2048),
+ MKT(UNI_BLLI_L3_4096, 4096),
+ EOT()
+ };
+ static const struct uni_print_tbl l3ttype_tbl[] = {
+ MKT(UNI_BLLI_L3_TTYPE_RECV, receive_only),
+ MKT(UNI_BLLI_L3_TTYPE_SEND, send_only),
+ MKT(UNI_BLLI_L3_TTYPE_BOTH, both),
+ EOT()
+ };
+ static const struct uni_print_tbl l3mux_tbl[] = {
+ MKT(UNI_BLLI_L3_MUX_NOMUX, NOMUX),
+ MKT(UNI_BLLI_L3_MUX_TS, TS),
+ MKT(UNI_BLLI_L3_MUX_TSFEC, TSFEC),
+ MKT(UNI_BLLI_L3_MUX_PS, PS),
+ MKT(UNI_BLLI_L3_MUX_PSFEC, PSFEC),
+ MKT(UNI_BLLI_L3_MUX_H221, H221),
+ EOT()
+ };
+ static const struct uni_print_tbl l3tcap_tbl[] = {
+ MKT(UNI_BLLI_L3_TCAP_NOIND, noind),
+ MKT(UNI_BLLI_L3_TCAP_AAL1, aal1),
+ MKT(UNI_BLLI_L3_TCAP_AAL5, aal5),
+ MKT(UNI_BLLI_L3_TCAP_AAL15, aal1&5),
+ EOT()
+ };
+
+ if(uni_print_iehdr("blli", &ie->h, cx))
+ return;
+
+ if(ie->h.present & UNI_BLLI_L1_P) {
+ uni_print_entry(cx, "l1", "%u", ie->l1);
+ uni_print_eol(cx);
+ }
+ if(ie->h.present & UNI_BLLI_L2_P) {
+ uni_print_tbl("l2", ie->l2, l2_tbl, cx);
+ uni_print_push_prefix("l2", cx);
+ cx->indent++;
+ if(ie->h.present & UNI_BLLI_L2_USER_P)
+ uni_print_entry(cx, "proto", "%u", ie->l2_user);
+ if(ie->h.present & UNI_BLLI_L2_Q933_P) {
+ uni_print_entry(cx, "q933", "%u", ie->l2_q933);
+ uni_print_tbl("mode", ie->l2_mode, l2mode_tbl, cx);
+ }
+ if(ie->h.present & UNI_BLLI_L2_WSIZ_P)
+ uni_print_entry(cx, "wsize", "%u", ie->l2_wsiz);
+ uni_print_pop_prefix(cx);
+ cx->indent--;
+ uni_print_eol(cx);
+
+ }
+ if(ie->h.present & UNI_BLLI_L3_P) {
+ uni_print_tbl("l3", ie->l3, l3_tbl, cx);
+ uni_print_push_prefix("l3", cx);
+ cx->indent++;
+ if(ie->h.present & UNI_BLLI_L3_USER_P)
+ uni_print_entry(cx, "proto", "%u", ie->l3_user);
+ if(ie->h.present & UNI_BLLI_L3_MODE_P)
+ uni_print_tbl("mode", ie->l3_mode, l3mode_tbl, cx);
+ if(ie->h.present & UNI_BLLI_L3_PSIZ_P)
+ uni_print_tbl("packet-size", ie->l3_psiz, l3psiz_tbl, cx);
+ if(ie->h.present & UNI_BLLI_L3_WSIZ_P)
+ uni_print_entry(cx, "window-size", "%u", ie->l3_wsiz);
+ if(ie->h.present & UNI_BLLI_L3_TTYPE_P) {
+ uni_print_tbl("ttype", ie->l3_ttype, l3ttype_tbl, cx);
+ uni_print_tbl("tcap", ie->l3_tcap, l3tcap_tbl, cx);
+ }
+ if(ie->h.present & UNI_BLLI_L3_MUX_P) {
+ uni_print_tbl("fmux", ie->l3_fmux, l3mux_tbl, cx);
+ uni_print_tbl("bmux", ie->l3_bmux, l3mux_tbl, cx);
+ }
+ if(ie->h.present & UNI_BLLI_L3_IPI_P)
+ uni_print_entry(cx, "ipi", "0x%02x", ie->l3_ipi);
+ if(ie->h.present & UNI_BLLI_L3_SNAP_P)
+ uni_print_entry(cx, "snap", "%06x.%04x", ie->oui, ie->pid);
+ uni_print_pop_prefix(cx);
+ cx->indent--;
+ uni_print_eol(cx);
+ }
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, blli)
+{
+ cx = cx;
+/*
+ if(ie->h.present & UNI_BLLI_L1_P)
+ ;
+*/
+
+ if(ie->h.present & UNI_BLLI_L2_P) {
+ static u_int mask =
+ UNI_BLLI_L2_Q933_P | UNI_BLLI_L2_WSIZ_P |
+ UNI_BLLI_L2_USER_P;
+
+ switch(ie->l2) {
+ default:
+ return -1;
+
+ case UNI_BLLI_L2_BASIC:
+ case UNI_BLLI_L2_Q921:
+ case UNI_BLLI_L2_LABP:
+ case UNI_BLLI_L2_LAN:
+ case UNI_BLLI_L2_X75:
+ if(ie->h.present & mask)
+ return -1;
+ break;
+
+ case UNI_BLLI_L2_X25LL:
+ case UNI_BLLI_L2_X25ML:
+ case UNI_BLLI_L2_HDLC_ARM:
+ case UNI_BLLI_L2_HDLC_NRM:
+ case UNI_BLLI_L2_HDLC_ABM:
+ case UNI_BLLI_L2_Q922:
+ case UNI_BLLI_L2_ISO7776:
+ switch(ie->h.present & mask) {
+ default:
+ return -1;
+
+ case 0:
+ case UNI_BLLI_L2_Q933_P:
+ case UNI_BLLI_L2_Q933_P | UNI_BLLI_L2_WSIZ_P:
+ break;
+ }
+ break;
+
+ case UNI_BLLI_L2_USER:
+ switch(ie->h.present & mask) {
+ default:
+ return -1;
+
+ case 0: /* XXX ? */
+ case UNI_BLLI_L2_USER_P:
+ break;
+ }
+ break;
+ }
+ if(ie->h.present & UNI_BLLI_L2_Q933_P) {
+ if(ie->l2_q933 != 0)
+ return -1;
+
+ switch(ie->l2_mode) {
+ default:
+ return -1;
+
+ case UNI_BLLI_L2NORM:
+ case UNI_BLLI_L2EXT:
+ break;
+ }
+ }
+ if(ie->h.present & UNI_BLLI_L2_WSIZ_P) {
+ if(ie->l2_wsiz == 0 || ie->l2_wsiz > 127)
+ return -1;
+ }
+ if(ie->h.present & UNI_BLLI_L2_USER_P) {
+ if(ie->l2_user > 127)
+ return -1;
+ }
+ }
+ if(ie->h.present & UNI_BLLI_L3_P) {
+ static u_int mask =
+ UNI_BLLI_L3_MODE_P | UNI_BLLI_L3_PSIZ_P |
+ UNI_BLLI_L3_WSIZ_P | UNI_BLLI_L3_USER_P |
+ UNI_BLLI_L3_IPI_P | UNI_BLLI_L3_SNAP_P |
+ UNI_BLLI_L3_TTYPE_P | UNI_BLLI_L3_MUX_P;
+
+ switch(ie->l3) {
+ default:
+ return -1;
+
+ case UNI_BLLI_L3_X25:
+ case UNI_BLLI_L3_ISO8208:
+ case UNI_BLLI_L3_X223:
+ switch(ie->h.present & mask) {
+ default:
+ return -1;
+
+ case 0:
+ case UNI_BLLI_L3_MODE_P:
+ case UNI_BLLI_L3_MODE_P |
+ UNI_BLLI_L3_PSIZ_P:
+ case UNI_BLLI_L3_MODE_P |
+ UNI_BLLI_L3_PSIZ_P |
+ UNI_BLLI_L3_WSIZ_P:
+ break;
+ }
+ break;
+
+ case UNI_BLLI_L3_CLMP:
+ case UNI_BLLI_L3_T70:
+ if(ie->h.present & mask)
+ return -1;
+ break;
+
+ case UNI_BLLI_L3_TR9577:
+ switch(ie->h.present & mask) {
+ default:
+ return -1;
+
+ case 0:
+ case UNI_BLLI_L3_IPI_P:
+ case UNI_BLLI_L3_IPI_P | UNI_BLLI_L3_SNAP_P:
+ break;
+ }
+ break;
+
+ case UNI_BLLI_L3_H310:
+ switch(ie->h.present & mask) {
+ default:
+ return -1;
+
+ case 0:
+ case UNI_BLLI_L3_TTYPE_P:
+ case UNI_BLLI_L3_TTYPE_P|UNI_BLLI_L3_MUX_P:
+ break;
+ }
+ break;
+
+ case UNI_BLLI_L3_USER:
+ switch(ie->h.present & mask) {
+ default:
+ return -1;
+
+ case 0: /* XXX ? */
+ case UNI_BLLI_L3_USER_P:
+ break;
+ }
+ break;
+ }
+ if(ie->h.present & UNI_BLLI_L3_MODE_P) {
+ switch(ie->l3_mode) {
+ default:
+ return -1;
+
+ case UNI_BLLI_L3NSEQ:
+ case UNI_BLLI_L3ESEQ:
+ break;
+ }
+ }
+ if(ie->h.present & UNI_BLLI_L3_PSIZ_P) {
+ switch(ie->l3_psiz) {
+ default:
+ return -1;
+
+ case UNI_BLLI_L3_16:
+ case UNI_BLLI_L3_32:
+ case UNI_BLLI_L3_64:
+ case UNI_BLLI_L3_128:
+ case UNI_BLLI_L3_256:
+ case UNI_BLLI_L3_512:
+ case UNI_BLLI_L3_1024:
+ case UNI_BLLI_L3_2048:
+ case UNI_BLLI_L3_4096:
+ break;
+ }
+ }
+ if(ie->h.present & UNI_BLLI_L3_WSIZ_P) {
+ if(ie->l3_wsiz == 0 || ie->l3_wsiz > 127)
+ return -1;
+ }
+ if(ie->h.present & UNI_BLLI_L3_IPI_P) {
+ if(ie->l3_ipi == UNI_BLLI_L3_SNAP) {
+ if(!(ie->h.present & UNI_BLLI_L3_SNAP_P))
+ return -1;
+ } else {
+ if(ie->h.present & UNI_BLLI_L3_SNAP_P)
+ return -1;
+ }
+ }
+ if(ie->h.present & UNI_BLLI_L3_USER_P) {
+ if(ie->l3_user > 127)
+ return -1;
+ }
+ if(ie->h.present & UNI_BLLI_L3_SNAP_P) {
+ if(ie->oui >= (1<<24))
+ return -1;
+ if(ie->pid >= (1<<16))
+ return -1;
+ }
+ if(ie->h.present & UNI_BLLI_L3_TTYPE_P) {
+ switch(ie->l3_ttype) {
+ default:
+ return -1;
+
+ case UNI_BLLI_L3_TTYPE_RECV:
+ case UNI_BLLI_L3_TTYPE_SEND:
+ case UNI_BLLI_L3_TTYPE_BOTH:
+ break;
+ }
+ switch(ie->l3_tcap) {
+ default:
+ return -1;
+
+ case UNI_BLLI_L3_TCAP_NOIND:
+ case UNI_BLLI_L3_TCAP_AAL1:
+ case UNI_BLLI_L3_TCAP_AAL5:
+ case UNI_BLLI_L3_TCAP_AAL15:
+ break;
+ }
+ }
+ if(ie->h.present & UNI_BLLI_L3_MUX_P) {
+ switch(ie->l3_fmux) {
+ default:
+ return -1;
+
+ case UNI_BLLI_L3_MUX_NOMUX:
+ case UNI_BLLI_L3_MUX_TS:
+ case UNI_BLLI_L3_MUX_TSFEC:
+ case UNI_BLLI_L3_MUX_PS:
+ case UNI_BLLI_L3_MUX_PSFEC:
+ case UNI_BLLI_L3_MUX_H221:
+ break;
+ }
+ switch(ie->l3_bmux) {
+ default:
+ return -1;
+
+ case UNI_BLLI_L3_MUX_NOMUX:
+ case UNI_BLLI_L3_MUX_TS:
+ case UNI_BLLI_L3_MUX_TSFEC:
+ case UNI_BLLI_L3_MUX_PS:
+ case UNI_BLLI_L3_MUX_PSFEC:
+ case UNI_BLLI_L3_MUX_H221:
+ break;
+ }
+ }
+ }
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, blli)
+{
+ START_IE(blli, UNI_IE_BLLI, 13);
+
+ if (IE_ISERROR(*ie)) {
+ APP_BYTE(msg, 0xff);
+ APP_BYTE(msg, 0xff);
+ goto out;
+ }
+
+ if(ie->h.present & UNI_BLLI_L1_P)
+ APP_BYTE(msg, (UNI_BLLI_L1_ID<<5)|ie->l1|0x80);
+
+ if(ie->h.present & UNI_BLLI_L2_P) {
+ if(ie->h.present & UNI_BLLI_L2_Q933_P) {
+ APP_BYTE(msg, (UNI_BLLI_L2_ID<<5)|ie->l2);
+ if(ie->h.present & UNI_BLLI_L2_WSIZ_P) {
+ APP_BYTE(msg, (ie->l2_mode<<5)|ie->l2_q933);
+ APP_BYTE(msg, ie->l2_wsiz | 0x80);
+ } else {
+ APP_BYTE(msg, (ie->l2_mode<<5)|ie->l2_q933|0x80);
+ }
+ } else if(ie->h.present & UNI_BLLI_L2_USER_P) {
+ APP_BYTE(msg, (UNI_BLLI_L2_ID<<5)|ie->l2);
+ APP_BYTE(msg, ie->l2_user | 0x80);
+ } else {
+ APP_BYTE(msg, (UNI_BLLI_L2_ID << 5) | ie->l2 | 0x80);
+ }
+ }
+
+ if(ie->h.present & UNI_BLLI_L3_P) {
+ if(ie->h.present & UNI_BLLI_L3_MODE_P) {
+ if(ie->h.present & UNI_BLLI_L3_PSIZ_P) {
+ if(ie->h.present & UNI_BLLI_L3_WSIZ_P) {
+ APP_BYTE(msg,(UNI_BLLI_L3_ID<<5)|ie->l3);
+ APP_BYTE(msg,(ie->l3_mode<<5));
+ APP_BYTE(msg,ie->l3_psiz);
+ APP_BYTE(msg,ie->l3_wsiz|0x80);
+ } else {
+ APP_BYTE(msg,(UNI_BLLI_L3_ID<<5)|ie->l3);
+ APP_BYTE(msg,(ie->l3_mode<<5));
+ APP_BYTE(msg,(ie->l3_psiz|0x80));
+ }
+ } else {
+ APP_BYTE(msg, (UNI_BLLI_L3_ID<<5)|ie->l3);
+ APP_BYTE(msg, (ie->l3_mode<<5)|0x80);
+ }
+ } else if(ie->h.present & UNI_BLLI_L3_USER_P) {
+ APP_BYTE(msg, (UNI_BLLI_L3_ID<<5)|ie->l3);
+ APP_BYTE(msg,(ie->l3_user|0x80));
+ } else if(ie->h.present & UNI_BLLI_L3_IPI_P) {
+ APP_BYTE(msg, (UNI_BLLI_L3_ID<<5)|ie->l3);
+ APP_BYTE(msg,((ie->l3_ipi>>1) & 0x7f));
+ APP_BYTE(msg,(((ie->l3_ipi&1)<<6)|0x80));
+ if(ie->h.present & UNI_BLLI_L3_SNAP_P) {
+ APP_BYTE(msg, 0x80);
+ APP_BYTE(msg, (ie->oui >> 16));
+ APP_BYTE(msg, (ie->oui >> 8));
+ APP_BYTE(msg, (ie->oui >> 0));
+ APP_BYTE(msg, (ie->pid >> 8));
+ APP_BYTE(msg, (ie->pid >> 0));
+ }
+ } else if(ie->h.present & UNI_BLLI_L3_TTYPE_P) {
+ if(ie->h.present & UNI_BLLI_L3_MUX_P) {
+ APP_BYTE(msg, ie->l3_ttype | (ie->l3_tcap << 4));
+ APP_BYTE(msg, 0x80 | (ie->l3_fmux << 3) | ie->l3_bmux);
+ } else {
+ APP_BYTE(msg, 0x80 | ie->l3_ttype | (ie->l3_tcap << 4));
+ }
+ } else {
+ APP_BYTE(msg, (UNI_BLLI_L3_ID<<5)|ie->l3|0x80);
+ }
+ }
+
+ out:
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, blli)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen > 17)
+ goto rej;
+
+ while(ielen--) {
+ switch(((c = *msg->b_rptr++) >> 5) & 0x3) {
+ default:
+ goto rej;
+
+ case UNI_BLLI_L1_ID:
+ ie->h.present |= UNI_BLLI_L1_P;
+ ie->l1 = c & 0x1f;
+ if(!(c & 0x80))
+ goto rej;
+ break;
+
+ case UNI_BLLI_L2_ID:
+ ie->h.present |= UNI_BLLI_L2_P;
+ ie->l2 = c & 0x1f;
+ if(!(c & 0x80)) {
+ if(ielen == 0)
+ goto rej;
+ ielen--;
+ c = *msg->b_rptr++;
+ if(ie->l2 == UNI_BLLI_L2_USER) {
+ ie->h.present |= UNI_BLLI_L2_USER_P;
+ ie->l2_user = c & 0x7f;
+ if(!(c & 0x80))
+ goto rej;
+ } else {
+ ie->h.present |= UNI_BLLI_L2_Q933_P;
+ ie->l2_q933 = c & 0x3;
+ ie->l2_mode = (c >> 5) & 0x3;
+ if(!(c & 0x80)) {
+ if(ielen == 0)
+ goto rej;
+ ielen--;
+ c = *msg->b_rptr++;
+ ie->h.present |= UNI_BLLI_L2_WSIZ_P;
+ ie->l2_wsiz = c & 0x7f;
+ if(!(c & 0x80))
+ goto rej;
+ }
+ }
+ }
+ break;
+
+ case UNI_BLLI_L3_ID:
+ ie->h.present |= UNI_BLLI_L3_P;
+ ie->l3 = c & 0x1f;
+ if(!(c & 0x80)) {
+ switch(ie->l3) {
+ default:
+ case UNI_BLLI_L3_CLMP:
+ case UNI_BLLI_L3_T70:
+ goto rej;
+
+ case UNI_BLLI_L3_X25:
+ case UNI_BLLI_L3_ISO8208:
+ case UNI_BLLI_L3_X223:
+ if(ielen == 0)
+ goto rej;
+ ielen--;
+ c = *msg->b_rptr++;
+ ie->l3_mode = (c >> 5) & 0x3;
+ ie->h.present |= UNI_BLLI_L3_MODE_P;
+
+ if(c & 0x80)
+ break;
+
+ if(ielen == 0)
+ goto rej;
+ ielen--;
+ c = *msg->b_rptr++;
+ ie->l3_psiz = c & 0xf;
+ ie->h.present |= UNI_BLLI_L3_PSIZ_P;
+
+ if(c & 0x80)
+ break;
+
+ if(ielen == 0)
+ goto rej;
+ ielen--;
+ c = *msg->b_rptr++;
+ ie->l3_wsiz = c & 0x7f;
+ ie->h.present |= UNI_BLLI_L3_WSIZ_P;
+
+ if(!(c & 0x80))
+ goto rej;
+ break;
+
+ case UNI_BLLI_L3_TR9577:
+ if(ielen < 2)
+ goto rej;
+ ielen -= 2;
+ c = *msg->b_rptr++;
+ ie->l3_ipi = (c << 1) & 0xfe;
+ if(c & 0x80)
+ goto rej;
+ c = *msg->b_rptr++;
+ ie->l3_ipi |= c & 1;
+ if(!(c & 0x80))
+ goto rej;
+ ie->h.present |= UNI_BLLI_L3_IPI_P;
+
+ if(ie->l3_ipi != UNI_BLLI_L3_SNAP)
+ break;
+ if(ielen < 6)
+ goto rej;
+ ielen -= 6;
+ if(*msg->b_rptr++ != 0x80)
+ goto rej;
+ ie->h.present |= UNI_BLLI_L3_SNAP_P;
+ ie->oui = *msg->b_rptr++ << 16;
+ ie->oui |= *msg->b_rptr++ << 8;
+ ie->oui |= *msg->b_rptr++;
+ ie->pid = *msg->b_rptr++ << 8;
+ ie->pid |= *msg->b_rptr++;
+ break;
+
+ case UNI_BLLI_L3_H310:
+ if(ielen == 0)
+ goto rej;
+ ielen--;
+ c = *msg->b_rptr++;
+ ie->l3_ttype = c & 0xf;
+ ie->l3_tcap = (c >> 4) & 0x7;
+ ie->h.present |= UNI_BLLI_L3_TTYPE_P;
+ if(c & 0x80)
+ break;
+ if(ielen == 0)
+ goto rej;
+ ielen--;
+ c = *msg->b_rptr++;
+ ie->l3_fmux = (c >> 3) & 7;
+ ie->l3_bmux = c & 7;
+ ie->h.present |= UNI_BLLI_L3_MUX_P;
+ if(!(c & 0x80))
+ goto rej;
+ break;
+
+ case UNI_BLLI_L3_USER:
+ if(ielen == 0)
+ goto rej;
+ ielen--;
+ c = *msg->b_rptr++;
+ ie->l3_user = c & 0x7f;
+ ie->h.present |= UNI_BLLI_L3_USER_P;
+ if(!(c & 0x80))
+ goto rej;
+ break;
+ }
+ }
+ break;
+ }
+ }
+
+ IE_END(BLLI);
+}
+
+/*********************************************************************
+ *
+ * Broadband locking shift
+ * Broadband non-locking shift.
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 41...42
+ * UNI4.0 pp. 9
+ *
+ * Procedure not supported in UNI4.0, but IE's must be recognized.
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, lshift)
+{
+ if(uni_print_iehdr("locking_shift", &ie->h, cx))
+ return;
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, lshift)
+{
+ cx = cx; ie = ie;
+ return -1;
+}
+
+DEF_IE_ENCODE(itu, lshift)
+{
+ START_IE(lshift, UNI_IE_LSHIFT, 1);
+ APP_BYTE(msg, 0x80 | ie->set);
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, lshift)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen != 1)
+ goto rej;
+
+ c = *msg->b_rptr++;
+
+ if(!(c & 0x80))
+ goto rej;
+ ie->set = c & 7;
+
+ IE_END(LSHIFT);
+}
+
+/***********************************************************************/
+
+DEF_IE_PRINT(itu, nlshift)
+{
+ if(uni_print_iehdr("nonlocking_shift", &ie->h, cx))
+ return;
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, nlshift)
+{
+ cx = cx; ie = ie;
+ return -1;
+}
+
+DEF_IE_ENCODE(itu, nlshift)
+{
+ START_IE(nlshift, UNI_IE_NLSHIFT, 1);
+ APP_BYTE(msg, 0x80 | ie->set);
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, nlshift)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen != 1)
+ goto rej;
+
+ c = *msg->b_rptr++;
+
+ if(!(c & 0x80))
+ goto rej;
+ ie->set = c & 7;
+
+ IE_END(NLSHIFT);
+}
+
+/*********************************************************************
+ *
+ * Broadband Sending Complete Indicator
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 74-75
+ *
+ * Only ITU-T coding allowed.
+ */
+DEF_IE_PRINT(itu, scompl)
+{
+ if(uni_print_iehdr("sending_complete", &ie->h, cx))
+ return;
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, scompl)
+{
+ ie = ie; cx = cx;
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, scompl)
+{
+ START_IE(scompl, UNI_IE_SCOMPL, 1);
+
+ APP_BYTE(msg, 0x80 | 0x21);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, scompl)
+{
+ IE_START(;);
+
+ if(ielen != 1)
+ goto rej;
+
+ if(*msg->b_rptr++ != (0x80 | 0x21))
+ goto rej;
+
+ IE_END(SCOMPL);
+}
+
+/*********************************************************************
+ *
+ * Broadband Repeat Indicator
+ *
+ * References for this IE are:
+ *
+ * Q.2931 p. 73
+ * PNNI1.0 p. 196
+ *
+ * Q.2931 has table 4-19. Only codepoints 0x2 and 0xa (for PNNI) supported.
+ *
+ * Only ITU-T coding allowed.
+ */
+DEF_IE_PRINT(itu, repeat)
+{
+ static const struct uni_print_tbl tbl[] = {
+ MKT(UNI_REPEAT_PRIDESC, desc),
+ MKT(UNI_REPEAT_STACK, stack),
+ EOT()
+ };
+
+ if(uni_print_iehdr("repeat", &ie->h, cx))
+ return;
+ uni_print_tbl("type", ie->type, tbl, cx);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, repeat)
+{
+ switch(ie->type) {
+
+ case UNI_REPEAT_PRIDESC:
+ break;
+
+ case UNI_REPEAT_STACK:
+ if(!cx->pnni)
+ return -1;
+ break;
+
+ default:
+ return -1;
+ }
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, repeat)
+{
+ START_IE(repeat, UNI_IE_REPEAT, 1);
+
+ APP_BYTE(msg, 0x80 | ie->type);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, repeat)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen != 1)
+ goto rej;
+
+ c = *msg->b_rptr++;
+ if(!(c & 0x80))
+ goto rej;
+ ie->type = c & 0xf;
+
+ IE_END(REPEAT);
+}
+
+/*********************************************************************
+ *
+ * Transit Network Selection
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 75...76
+ * UNI4.0 pp. 17
+ *
+ * According to UNI4.0 this is always National Network Id/Carried Id.
+ *
+ * ITU-T/Net coding allowed.
+ */
+
+DEF_IE_PRINT(itu, tns)
+{
+ u_int i;
+
+ if(uni_print_iehdr("tns", &ie->h, cx))
+ return;
+ uni_print_entry(cx, "net", "%u,\"", ie->len);
+ uni_putc('"', cx);
+ for(i = 0; i < ie->len; i++) {
+ if(ie->net[i] < ' ')
+ uni_printf(cx, "^%c", ie->net[i] + '@');
+ else if(ie->net[i] < '~')
+ uni_putc(ie->net[i], cx);
+ else
+ uni_printf(cx, "\\%03o", ie->net[i]);
+ }
+ uni_putc('"', cx);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, tns)
+{
+ u_int i;
+
+ cx = cx;
+
+ if(ie->len == 0 || ie->len > UNI_TNS_MAXLEN)
+ return -1;
+ for(i = 0; i < ie->len; i++)
+ if(ie->net[i] < ' ' || ie->net[i] > '~')
+ return -1;
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, tns)
+{
+ START_IE(tns, UNI_IE_TNS, ie->len + 1);
+
+ APP_BYTE(msg, 0x80 | (0x2 << 4) | 0x1);
+ APP_BUF(msg, ie->net, ie->len);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, tns)
+{
+ IE_START(;);
+
+ if(ielen < 2 || ielen > 5)
+ goto rej;
+
+ if(*msg->b_rptr++ != (0x80 | (0x2 << 4) | 0x1))
+ goto rej;
+ ielen--;
+
+ ie->len = 0;
+ while(ielen--)
+ ie->net[ie->len++] = *msg->b_rptr++;
+
+ IE_END(TNS);
+}
+
+/*********************************************************************
+ *
+ * Restart indicator
+ *
+ * References for this IE are:
+ *
+ * Q.2931 pp. 73...74
+ * UNI4.0 p. 17
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, restart)
+{
+ static const struct uni_print_tbl tbl[] = {
+ MKT(UNI_RESTART_CHANNEL, channel),
+ MKT(UNI_RESTART_PATH, path),
+ MKT(UNI_RESTART_ALL, all),
+ EOT()
+ };
+
+ if(uni_print_iehdr("restart", &ie->h, cx))
+ return;
+ uni_print_tbl("class", ie->rclass, tbl, cx);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, restart)
+{
+ cx = cx;
+
+ switch(ie->rclass) {
+ default:
+ return -1;
+
+ case UNI_RESTART_CHANNEL:
+ case UNI_RESTART_PATH:
+ case UNI_RESTART_ALL:
+ break;
+ }
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, restart)
+{
+ START_IE(restart, UNI_IE_RESTART, 1);
+
+ APP_BYTE(msg, 0x80 | ie->rclass);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, restart)
+{
+ u_char c;
+
+ IE_START(;);
+
+ if(ielen != 1)
+ goto rej;
+
+ ie->rclass = (c = *msg->b_rptr++) & 0x7;
+
+ if(!(c & 0x80))
+ goto rej;
+
+ IE_END(RESTART);
+}
+
+/*********************************************************************
+ *
+ * User-to-user info.
+ *
+ * References for this IE are:
+ *
+ * Q.2957
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, uu)
+{
+ u_int i;
+
+ if(uni_print_iehdr("uu", &ie->h, cx))
+ return;
+ uni_print_entry(cx, "len", "%u", ie->len);
+ uni_print_entry(cx, "info", "(");
+ for(i = 0; i < ie->len; i++)
+ uni_printf(cx, "%s0x%02x", i == 0 ? "" : " ", ie->uu[i]);
+ uni_printf(cx, ")");
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, uu)
+{
+ cx = cx;
+
+ if(ie->len > UNI_UU_MAXLEN)
+ return -1;
+
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, uu)
+{
+ START_IE(uu, UNI_IE_UU, ie->len);
+
+ APP_BUF(msg, ie->uu, ie->len);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, uu)
+{
+ IE_START(;);
+
+ if(ielen > UNI_UU_MAXLEN || ielen < 1)
+ goto rej;
+
+ ie->len = ielen;
+ ielen = 0;
+ (void)memcpy(ie->uu, msg->b_rptr, ie->len);
+ msg->b_rptr += ie->len;
+
+ IE_END(UU);
+}
+
+/*********************************************************************
+ *
+ * Generic Identifier Transport
+ *
+ * References for this IE are:
+ *
+ * UNI4.0 pp. 26...28
+ *
+ * UNI4.0 prescribes a fixed format for this IE. We have a flag in the
+ * context structur, which tells us whether the check of this IE should be
+ * hard or soft. Probably it should be hard for end systems and soft for
+ * network nodes.
+ *
+ * Only Net Coding allowed. (XXX)
+ */
+
+DEF_IE_PRINT(net, git)
+{
+ static const struct uni_print_tbl std_tbl[] = {
+ MKT(UNI_GIT_STD_DSMCC, dsmcc),
+ MKT(UNI_GIT_STD_H245, H.245),
+ EOT()
+ };
+ static const struct uni_print_tbl type_tbl[] = {
+ MKT(UNI_GIT_TYPE_SESS, sess),
+ MKT(UNI_GIT_TYPE_RES, res),
+ EOT()
+ };
+ u_int i, j;
+ char buf[20];
+
+ if(uni_print_iehdr("git", &ie->h, cx))
+ return;
+
+ uni_print_tbl("std", ie->std, std_tbl, cx);
+
+ uni_print_eol(cx);
+ uni_print_push_prefix("id", cx);
+ cx->indent++;
+ for(i = 0; i < ie->numsub; i++) {
+ sprintf(buf, "%u", i);
+ uni_print_entry(cx, buf, "(");
+ uni_print_tbl(NULL, ie->sub[i].type, type_tbl, cx);
+ for(j = 0; j < ie->sub[i].len; j++)
+ uni_printf(cx, ",0x%02x", ie->sub[i].val[j]);
+ uni_printf(cx, ")");
+ uni_print_eol(cx);
+ }
+ cx->indent--;
+ uni_print_pop_prefix(cx);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, git)
+{
+ u_int i;
+
+ if(cx->git_hard) {
+ switch(ie->std) {
+ case UNI_GIT_STD_DSMCC:
+ case UNI_GIT_STD_H245:
+ break;
+ default:
+ return -1;
+ }
+ if(ie->numsub != 2)
+ return -1;
+ if(ie->sub[0].type != UNI_GIT_TYPE_SESS)
+ return -1;
+ if(ie->sub[0].len > UNI_GIT_MAXSESS)
+ return -1;
+ if(ie->sub[1].type != UNI_GIT_TYPE_RES)
+ return -1;
+ if(ie->sub[1].len > UNI_GIT_MAXRES)
+ return -1;
+ } else {
+ if(ie->numsub > UNI_GIT_MAXSUB)
+ return -1;
+ for(i = 0; i < ie->numsub; i++)
+ if(ie->sub[i].len > UNI_GIT_MAXVAL)
+ return -1;
+ }
+ return 0;
+}
+
+DEF_IE_ENCODE(net, git)
+{
+ u_int i;
+
+ START_IE(git, UNI_IE_GIT, 1 + ie->numsub * (1 + UNI_GIT_MAXVAL));
+
+ APP_BYTE(msg, ie->std);
+ for(i = 0; i < ie->numsub; i++) {
+ APP_BYTE(msg, ie->sub[i].type);
+ APP_BYTE(msg, ie->sub[i].len);
+ APP_BUF(msg, ie->sub[i].val, ie->sub[i].len);
+ }
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(net, git)
+{
+ IE_START(;);
+
+ if(ielen > 1 + UNI_GIT_MAXSUB * (1 + UNI_GIT_MAXVAL) || ielen < 1)
+ goto rej;
+
+ ie->std = *msg->b_rptr++;
+ ielen--;
+
+ ie->numsub = 0;
+ while(ielen > 0) {
+ if(ie->numsub >= UNI_GIT_MAXSUB)
+ goto rej;
+
+ ie->sub[ie->numsub].type = *msg->b_rptr++;
+ ielen--;
+
+ if(ielen == 0)
+ goto rej;
+ ie->sub[ie->numsub].len = *msg->b_rptr++;
+ ielen--;
+
+ if(ie->sub[ie->numsub].len > UNI_GIT_MAXVAL)
+ goto rej;
+ if(ie->sub[ie->numsub].len > (u_int)ielen)
+ goto rej;
+
+ (void)memcpy(ie->sub[ie->numsub].val, msg->b_rptr, ie->sub[ie->numsub].len);
+ ielen -= ie->sub[ie->numsub].len;
+ msg->b_rptr += ie->sub[ie->numsub].len;
+
+ ie->numsub++;
+ }
+
+ IE_END(GIT);
+}
+
+/*********************************************************************
+ *
+ * Additional ABR Parameters
+ * ABR Setup parameters
+ *
+ * References for this IE are:
+ *
+ * UNI4.0 pp. 78...82
+ * PNNI1.0 p. 195
+ *
+ * Notes:
+ * Only NET coding.
+ */
+
+static void
+print_abr_rec(struct unicx *cx, struct uni_abr_rec *rec)
+{
+ if(rec->present & UNI_ABR_REC_NRM_P)
+ uni_print_entry(cx, "nrm", "%d", rec->nrm);
+ if(rec->present & UNI_ABR_REC_TRM_P)
+ uni_print_entry(cx, "trm", "%d", rec->trm);
+ if(rec->present & UNI_ABR_REC_CDF_P)
+ uni_print_entry(cx, "cdf", "%d", rec->cdf);
+ if(rec->present & UNI_ABR_REC_ADTF_P)
+ uni_print_entry(cx, "adtf", "%d", rec->adtf);
+}
+
+DEF_IE_PRINT(net, abradd)
+{
+ if(uni_print_iehdr("abradd", &ie->h, cx))
+ return;
+
+ uni_print_push_prefix("fwd", cx);
+ print_abr_rec(cx, &ie->fwd);
+ uni_print_pop_prefix(cx);
+
+ uni_print_push_prefix("bwd", cx);
+ print_abr_rec(cx, &ie->bwd);
+ uni_print_pop_prefix(cx);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, abradd)
+{
+ cx = cx;
+ ie = ie;
+
+ return 0;
+}
+
+static u_int
+encode_abr_rec(struct uni_abr_rec *rec)
+{
+ u_int ret = rec->present & 0xf000;
+
+ if(ret & UNI_ABR_REC_NRM_P)
+ ret |= (rec->nrm & 0x7) << 25;
+ if(ret & UNI_ABR_REC_TRM_P)
+ ret |= (rec->trm & 0x7) << 22;
+ if(ret & UNI_ABR_REC_CDF_P)
+ ret |= (rec->cdf & 0x7) << 19;
+ if(ret & UNI_ABR_REC_ADTF_P)
+ ret |= (rec->adtf & 0x3ff) << 9;
+
+ return ret;
+}
+
+DEF_IE_ENCODE(net, abradd)
+{
+ START_IE(abradd, UNI_IE_ABRADD, 10);
+
+ APP_SUB_32BIT(msg, UNI_ABRADD_FADD_ID, encode_abr_rec(&ie->fwd));
+ APP_SUB_32BIT(msg, UNI_ABRADD_BADD_ID, encode_abr_rec(&ie->bwd));
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+static int
+decode_abr_rec(struct uni_msg *msg, struct uni_abr_rec *rec)
+{
+ u_int val;
+
+ val = *msg->b_rptr++ << 24;
+ val |= *msg->b_rptr++ << 16;
+ val |= *msg->b_rptr++ << 8;
+ val |= *msg->b_rptr++ << 0;
+
+ rec->present = val & 0xf000;
+
+ rec->nrm = (val & UNI_ABR_REC_NRM_P) ? ((val >> 25) & 0x7) : 0;
+ rec->trm = (val & UNI_ABR_REC_TRM_P) ? ((val >> 22) & 0x7) : 0;
+ rec->cdf = (val & UNI_ABR_REC_CDF_P) ? ((val >> 19) & 0x7) : 0;
+ rec->adtf = (val & UNI_ABR_REC_ADTF_P)? ((val >> 9) & 0x3ff) : 0;
+
+ return 0;
+}
+
+DEF_IE_DECODE(net, abradd)
+{
+ IE_START(;);
+
+ if(ielen != 10)
+ goto rej;
+
+
+ while(ielen--) {
+ switch(*msg->b_rptr++) {
+
+ default:
+ goto rej;
+
+ case UNI_ABRADD_FADD_ID:
+ if(decode_abr_rec(msg, &ie->fwd))
+ goto rej;
+ ielen -= 4;
+ break;
+
+ case UNI_ABRADD_BADD_ID:
+ if(decode_abr_rec(msg, &ie->bwd))
+ goto rej;
+ ielen -= 4;
+ break;
+ }
+ }
+ IE_END(ABRADD);
+}
+
+/*********************************************************************/
+
+DEF_IE_PRINT(net, abrsetup)
+{
+ if(uni_print_iehdr("abrsetup", &ie->h, cx))
+ return;
+
+ uni_print_entry(cx, "rm_frt", "%d", ie->rmfrt);
+
+ uni_print_push_prefix("fwd", cx);
+ if(ie->h.present & UNI_ABRSETUP_FICR_P)
+ uni_print_entry(cx, "icr", "%d", ie->ficr);
+ if(ie->h.present & UNI_ABRSETUP_FTBE_P)
+ uni_print_entry(cx, "tbe", "%d", ie->ftbe);
+ if(ie->h.present & UNI_ABRSETUP_FRIF_P)
+ uni_print_entry(cx, "rif", "%d", ie->frif);
+ if(ie->h.present & UNI_ABRSETUP_FRDF_P)
+ uni_print_entry(cx, "rdf", "%d", ie->frdf);
+ uni_print_pop_prefix(cx);
+
+ uni_print_push_prefix("bwd", cx);
+ if(ie->h.present & UNI_ABRSETUP_BICR_P)
+ uni_print_entry(cx, "icr", "%d", ie->bicr);
+ if(ie->h.present & UNI_ABRSETUP_BTBE_P)
+ uni_print_entry(cx, "tbe", "%d", ie->btbe);
+ if(ie->h.present & UNI_ABRSETUP_BRIF_P)
+ uni_print_entry(cx, "rif", "%d", ie->brif);
+ if(ie->h.present & UNI_ABRSETUP_BRDF_P)
+ uni_print_entry(cx, "rdf", "%d", ie->brdf);
+ uni_print_pop_prefix(cx);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, abrsetup)
+{
+ if(cx->pnni) {
+ if(!(ie->h.present & UNI_ABRSETUP_FICR_P))
+ return -1;
+ if(!(ie->h.present & UNI_ABRSETUP_BICR_P))
+ return -1;
+ if(!(ie->h.present & UNI_ABRSETUP_FTBE_P))
+ return -1;
+ if(!(ie->h.present & UNI_ABRSETUP_BTBE_P))
+ return -1;
+ if(!(ie->h.present & UNI_ABRSETUP_FRIF_P))
+ return -1;
+ if(!(ie->h.present & UNI_ABRSETUP_BRIF_P))
+ return -1;
+ if(!(ie->h.present & UNI_ABRSETUP_FRDF_P))
+ return -1;
+ if(!(ie->h.present & UNI_ABRSETUP_BRDF_P))
+ return -1;
+ if(!(ie->h.present & UNI_ABRSETUP_RMFRT_P))
+ return -1;
+ }
+
+ if(!(ie->h.present & UNI_ABRSETUP_RMFRT_P))
+ return -1;
+
+ if(ie->h.present & UNI_ABRSETUP_FICR_P)
+ if(ie->ficr >= 1 << 24)
+ return -1;
+ if(ie->h.present & UNI_ABRSETUP_BICR_P)
+ if(ie->bicr >= 1 << 24)
+ return -1;
+
+ if(ie->h.present & UNI_ABRSETUP_FTBE_P)
+ if(ie->ftbe >= 1 << 24 || ie->ftbe == 0)
+ return -1;
+ if(ie->h.present & UNI_ABRSETUP_BTBE_P)
+ if(ie->btbe >= 1 << 24 || ie->btbe == 0)
+ return -1;
+
+ if(ie->rmfrt >= 1 << 24)
+ return -1;
+
+ if(ie->h.present & UNI_ABRSETUP_FRIF_P)
+ if(ie->frif > 15)
+ return -1;
+ if(ie->h.present & UNI_ABRSETUP_FRDF_P)
+ if(ie->frdf > 15)
+ return -1;
+ if(ie->h.present & UNI_ABRSETUP_BRIF_P)
+ if(ie->brif > 15)
+ return -1;
+ if(ie->h.present & UNI_ABRSETUP_BRDF_P)
+ if(ie->brdf > 15)
+ return -1;
+ return 0;
+}
+
+DEF_IE_ENCODE(net, abrsetup)
+{
+ START_IE(abrsetup, UNI_IE_ABRSETUP, 32);
+
+ APP_OPT_24BIT(msg, ie->h.present, UNI_ABRSETUP_FICR_P,
+ UNI_ABRSETUP_FICR_ID, ie->ficr);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_ABRSETUP_BICR_P,
+ UNI_ABRSETUP_BICR_ID, ie->bicr);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_ABRSETUP_FTBE_P,
+ UNI_ABRSETUP_FTBE_ID, ie->ftbe);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_ABRSETUP_BTBE_P,
+ UNI_ABRSETUP_BTBE_ID, ie->btbe);
+ APP_SUB_24BIT(msg, UNI_ABRSETUP_RMFRT_ID, ie->rmfrt);
+ APP_OPT_BYTE(msg, ie->h.present, UNI_ABRSETUP_FRIF_P,
+ UNI_ABRSETUP_FRIF_ID, ie->frif);
+ APP_OPT_BYTE(msg, ie->h.present, UNI_ABRSETUP_BRIF_P,
+ UNI_ABRSETUP_BRIF_ID, ie->brif);
+ APP_OPT_BYTE(msg, ie->h.present, UNI_ABRSETUP_FRDF_P,
+ UNI_ABRSETUP_FRDF_ID, ie->frdf);
+ APP_OPT_BYTE(msg, ie->h.present, UNI_ABRSETUP_BRDF_P,
+ UNI_ABRSETUP_BRDF_ID, ie->brdf);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(net, abrsetup)
+{
+ IE_START(;);
+
+ if(ielen < 4 || ielen > 32)
+ goto rej;
+
+
+ while(ielen--) {
+ switch(*msg->b_rptr++) {
+
+ default:
+ goto rej;
+
+
+ DEC_GETF3(ABRSETUP_FICR, ficr, ie->h.present);
+ DEC_GETF3(ABRSETUP_BICR, bicr, ie->h.present);
+ DEC_GETF3(ABRSETUP_FTBE, ftbe, ie->h.present);
+ DEC_GETF3(ABRSETUP_BTBE, btbe, ie->h.present);
+ DEC_GETF1(ABRSETUP_FRIF, frif, ie->h.present);
+ DEC_GETF1(ABRSETUP_BRIF, brif, ie->h.present);
+ DEC_GETF1(ABRSETUP_FRDF, frdf, ie->h.present);
+ DEC_GETF1(ABRSETUP_BRDF, brdf, ie->h.present);
+ DEC_GETF3(ABRSETUP_RMFRT, frif, ie->h.present);
+ }
+ }
+ IE_END(ABRSETUP);
+}
+
+/*********************************************************************
+ *
+ * Broadband report type
+ *
+ * References for this IE are:
+ *
+ * Q.2963.1 pp. 7...8
+ *
+ * Only ITU-T coding allowed.
+ */
+
+DEF_IE_PRINT(itu, report)
+{
+ static const struct uni_print_tbl tbl[] = {
+ MKT(UNI_REPORT_MODCONF, modconf),
+ MKT(UNI_REPORT_CLOCK, clock),
+ MKT(UNI_REPORT_EEAVAIL, eeavail),
+ MKT(UNI_REPORT_EEREQ, eereq),
+ MKT(UNI_REPORT_EECOMPL, eecompl),
+ EOT()
+ };
+
+ if(uni_print_iehdr("report", &ie->h, cx))
+ return;
+ uni_print_tbl("type", ie->report, tbl, cx);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, report)
+{
+ cx = cx;
+
+ switch(ie->report) {
+
+ default:
+ return -1;
+
+ case UNI_REPORT_MODCONF:
+ case UNI_REPORT_CLOCK:
+ case UNI_REPORT_EEAVAIL:
+ case UNI_REPORT_EEREQ:
+ case UNI_REPORT_EECOMPL:
+ break;
+ }
+ return 0;
+}
+
+DEF_IE_ENCODE(itu, report)
+{
+ START_IE(report, UNI_IE_REPORT, 1);
+
+ APP_BYTE(msg, ie->report);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(itu, report)
+{
+ IE_START(;);
+ if(ielen != 1)
+ goto rej;
+
+ ie->report = *msg->b_rptr++;
+
+ IE_END(REPORT);
+}
+
+/*********************************************************************
+ *
+ * Soft PVPC/PVCC
+ *
+ * References for this IE are:
+ *
+ * PNNI1.0 pp. 201...203
+ *
+ * Only NET coding allowed.
+ */
+DEF_IE_PRINT(net, calling_soft)
+{
+ if(uni_print_iehdr("calling_soft", &ie->h, cx))
+ return;
+
+ uni_print_entry(cx, "vpi", "%d", ie->vpi);
+ if(ie->h.present & UNI_CALLING_SOFT_VCI_P)
+ uni_print_entry(cx, "vci", "%d", ie->vci);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_PRINT(net, called_soft)
+{
+ static const struct uni_print_tbl tab[] = {
+ MKT(UNI_SOFT_SEL_ANY, any),
+ MKT(UNI_SOFT_SEL_REQ, required),
+ MKT(UNI_SOFT_SEL_ASS, assigned),
+ EOT()
+ };
+
+ if(uni_print_iehdr("called_soft", &ie->h, cx))
+ return;
+
+ uni_print_tbl("selection", ie->sel, tab, cx);
+ if(ie->h.present & UNI_CALLED_SOFT_VPI_P)
+ uni_print_entry(cx, "vpi", "%d", ie->vpi);
+ if(ie->h.present & UNI_CALLED_SOFT_VCI_P)
+ uni_print_entry(cx, "vci", "%d", ie->vci);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, calling_soft)
+{
+ cx = cx;
+
+ if(ie->vpi >= 1 << 12)
+ return -1;
+ return 0;
+}
+
+DEF_IE_CHECK(net, called_soft)
+{
+ cx = cx;
+
+ switch(ie->sel) {
+
+ case UNI_SOFT_SEL_ANY:
+ case UNI_SOFT_SEL_REQ:
+ case UNI_SOFT_SEL_ASS:
+ break;
+
+ default:
+ return -1;
+ }
+ if(ie->h.present & UNI_CALLED_SOFT_VPI_P) {
+ if(ie->vpi >= 1 << 12)
+ return -1;
+ } else {
+ if(ie->sel != UNI_SOFT_SEL_ANY)
+ return -1;
+ }
+
+ if(ie->h.present & UNI_CALLED_SOFT_VCI_P)
+ if(!(ie->h.present & UNI_CALLED_SOFT_VPI_P))
+ return -1;
+
+
+ return 0;
+}
+
+DEF_IE_ENCODE(net, calling_soft)
+{
+ START_IE(calling_soft, UNI_IE_CALLING_SOFT, 6);
+
+ APP_BYTE(msg, 0x81);
+ APP_16BIT(msg, ie->vpi);
+
+ if(ie->h.present & UNI_CALLING_SOFT_VCI_P) {
+ APP_BYTE(msg, 0x82);
+ APP_16BIT(msg, ie->vci);
+ }
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_ENCODE(net, called_soft)
+{
+ START_IE(called_soft, UNI_IE_CALLED_SOFT, 7);
+
+ APP_BYTE(msg, ie->sel);
+
+ if(ie->h.present & UNI_CALLED_SOFT_VPI_P) {
+ APP_BYTE(msg, 0x81);
+ APP_16BIT(msg, ie->vpi);
+ }
+
+ if(ie->h.present & UNI_CALLED_SOFT_VCI_P) {
+ APP_BYTE(msg, 0x82);
+ APP_16BIT(msg, ie->vci);
+ }
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(net, calling_soft)
+{
+ int vci_seen, vpi_seen;
+
+ IE_START(;);
+ if(ielen < 3)
+ goto rej;
+
+ vci_seen = 0;
+ vpi_seen = 0;
+
+ while(ielen) {
+ switch(*msg->b_rptr++) {
+
+ case 0x81:
+ if(!vpi_seen) {
+ ie->vpi = *msg->b_rptr++ << 8;
+ ie->vpi |= *msg->b_rptr++;
+ } else {
+ msg->b_rptr += 2;
+ }
+ ielen -= 3;
+ break;
+
+ case 0x82:
+ if(!vci_seen) {
+ ie->vci = *msg->b_rptr++ << 8;
+ ie->vci |= *msg->b_rptr++;
+ } else {
+ msg->b_rptr += 2;
+ }
+ ie->h.present |= UNI_CALLING_SOFT_VCI_P;
+ ielen -= 3;
+ break;
+
+ default:
+ goto rej;
+ }
+ }
+
+ if(!vpi_seen)
+ goto rej;
+
+ IE_END(CALLING_SOFT);
+}
+
+DEF_IE_DECODE(net, called_soft)
+{
+ int vci_seen, vpi_seen;
+
+ IE_START(;);
+ if(ielen < 3)
+ goto rej;
+
+ vci_seen = 0;
+ vpi_seen = 0;
+
+ while(ielen) {
+ switch(*msg->b_rptr++) {
+
+ case 0x81:
+ if(!vpi_seen) {
+ ie->vpi = *msg->b_rptr++ << 8;
+ ie->vpi |= *msg->b_rptr++;
+ vpi_seen = 1;
+ } else {
+ msg->b_rptr += 2;
+ }
+ ielen -= 3;
+ ie->h.present |= UNI_CALLED_SOFT_VCI_P;
+ break;
+
+ case 0x82:
+ if(!vci_seen) {
+ ie->vci = *msg->b_rptr++ << 8;
+ ie->vci |= *msg->b_rptr++;
+ vci_seen = 1;
+ } else {
+ msg->b_rptr += 2;
+ }
+ ie->h.present |= UNI_CALLED_SOFT_VCI_P;
+ ielen -= 3;
+ break;
+
+ default:
+ goto rej;
+ }
+ }
+
+ IE_END(CALLED_SOFT);
+}
+
+/*********************************************************************
+ *
+ * Crankback
+ *
+ * References for this IE are:
+ *
+ * PNNI1.0 pp. 203...206
+ *
+ * Only NET coding allowed.
+ */
+
+DEF_IE_PRINT(net, crankback)
+{
+ u_int j;
+
+ if(uni_print_iehdr("crankback", &ie->h, cx))
+ return;
+
+ uni_print_entry(cx, "level", "%d", ie->level);
+
+ switch(ie->type) {
+
+ case UNI_CRANKBACK_IF:
+ uni_print_entry(cx, "type", "interface");
+ break;
+
+ case UNI_CRANKBACK_NODE:
+ uni_print_entry(cx, "type", "node");
+ uni_print_entry(cx, "node", "{%d/", ie->id.node.level);
+ for(j = 0; j < 21; j++)
+ uni_printf(cx, "%02x", ie->id.node.id[j]);
+ uni_printf(cx, "}");
+ uni_print_eol(cx);
+ break;
+
+ case UNI_CRANKBACK_LINK:
+ uni_print_entry(cx, "type", "link");
+ uni_print_push_prefix("link", cx);
+ cx->indent++;
+
+ uni_print_entry(cx, "prec", "{%d/", ie->id.link.plevel);
+ for(j = 0; j < 21; j++)
+ uni_printf(cx, "%02x", ie->id.link.pid[j]);
+ uni_printf(cx, "}");
+ uni_print_eol(cx);
+
+ uni_print_entry(cx, "port", "0x%04x", ie->id.link.port);
+ uni_print_eol(cx);
+
+ uni_print_entry(cx, "succ", "{%d/", ie->id.link.slevel);
+ for(j = 0; j < 21; j++)
+ uni_printf(cx, "%02x", ie->id.link.sid[j]);
+ uni_printf(cx, "}");
+ uni_print_eol(cx);
+
+ cx->indent--;
+ uni_print_pop_prefix(cx);
+ break;
+
+ default:
+ uni_print_entry(cx, "type", "0x%02x", ie->type);
+ break;
+ }
+
+ uni_print_entry(cx, "cause", "0x%02x", ie->cause);
+
+ if(ie->h.present & UNI_CRANKBACK_TOP_P) {
+ uni_print_push_prefix("topol", cx);
+ uni_print_entry(cx, "dir", "%d", ie->diag.top.dir);
+ uni_print_entry(cx, "port", "0x%04x", ie->diag.top.port);
+ uni_print_entry(cx, "avcr", "%u", ie->diag.top.avcr);
+ if(ie->h.present & UNI_CRANKBACK_TOPX_P) {
+ uni_print_entry(cx, "crm", "%u", ie->diag.top.crm);
+ uni_print_entry(cx, "vf", "%u", ie->diag.top.vf);
+ }
+ uni_print_pop_prefix(cx);
+ uni_print_eol(cx);
+ }
+ if(ie->h.present & UNI_CRANKBACK_QOS_P) {
+ uni_print_push_prefix("qos", cx);
+ uni_print_entry(cx, "ctd", "%savail", ie->diag.qos.ctd ? "" : "un");
+ uni_print_entry(cx, "cdv", "%savail", ie->diag.qos.cdv ? "" : "un");
+ uni_print_entry(cx, "clr", "%savail", ie->diag.qos.clr ? "" : "un");
+ uni_print_entry(cx, "other", "%savail", ie->diag.qos.other ? "" : "un");
+ uni_print_pop_prefix(cx);
+ uni_print_eol(cx);
+ }
+
+ uni_print_eol(cx);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, crankback)
+{
+ cx = cx;
+
+ if(ie->level > 104)
+ return -1;
+ switch(ie->type) {
+ case UNI_CRANKBACK_IF:
+ break;
+ case UNI_CRANKBACK_NODE:
+ if(ie->id.node.level > 104)
+ return -1;
+ break;
+
+ case UNI_CRANKBACK_LINK:
+ if(ie->id.link.plevel > 104)
+ return -1;
+ if(ie->id.link.slevel > 104)
+ return -1;
+ break;
+
+ default:
+ return -1;
+ }
+
+ if(ie->h.present & UNI_CRANKBACK_TOP_P) {
+ if(ie->h.present & UNI_CRANKBACK_QOS_P)
+ return -1;
+
+ if(ie->cause != UNI_CAUSE_CRATE_NAVL)
+ return -1;
+ switch(ie->diag.top.dir) {
+
+ case 0x00:
+ case 0x01:
+ break;
+
+ default:
+ return -1;
+ }
+ }
+ if(ie->h.present & UNI_CRANKBACK_QOS_P) {
+ if(ie->cause != UNI_CAUSE_QOS_NAVL)
+ return -1;
+ }
+ return 0;
+}
+
+DEF_IE_ENCODE(net, crankback)
+{
+ START_IE(crankback, UNI_IE_CRANKBACK, 72);
+
+ APP_BYTE(msg, ie->level);
+ APP_BYTE(msg, ie->type);
+
+ switch(ie->type) {
+
+ case UNI_CRANKBACK_IF:
+ break;
+
+ case UNI_CRANKBACK_NODE:
+ APP_BYTE(msg, ie->id.node.level);
+ APP_BUF(msg, ie->id.node.id, 21);
+ break;
+
+ case UNI_CRANKBACK_LINK:
+ APP_BYTE(msg, ie->id.link.plevel);
+ APP_BUF(msg, ie->id.link.pid, 21);
+ APP_32BIT(msg, ie->id.link.port);
+ APP_BYTE(msg, ie->id.link.slevel);
+ APP_BUF(msg, ie->id.link.sid, 21);
+ break;
+ }
+
+ APP_BYTE(msg, ie->cause);
+
+ if(ie->h.present & UNI_CRANKBACK_TOP_P) {
+ APP_BYTE(msg, ie->diag.top.dir);
+ APP_32BIT(msg, ie->diag.top.port);
+ APP_32BIT(msg, ie->diag.top.avcr);
+ if(ie->h.present & UNI_CRANKBACK_TOPX_P) {
+ APP_32BIT(msg, ie->diag.top.crm);
+ APP_32BIT(msg, ie->diag.top.vf);
+ }
+ }
+
+ if(ie->h.present & UNI_CRANKBACK_QOS_P) {
+ APP_BYTE(msg, (ie->diag.qos.ctd << 3)
+ |(ie->diag.qos.cdv << 2)
+ |(ie->diag.qos.clr << 1)
+ |(ie->diag.qos.other));
+ }
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+
+DEF_IE_DECODE(net, crankback)
+{
+ IE_START(;);
+
+ if(ielen < 3)
+ goto rej;
+
+ ie->level = *msg->b_rptr++;
+ ielen--;
+
+ ie->type = *msg->b_rptr++;
+ ielen--;
+
+ switch(ie->type) {
+
+ default:
+ goto rej;
+
+ case UNI_CRANKBACK_IF:
+ break;
+
+ case UNI_CRANKBACK_NODE:
+ if(ielen < 22)
+ goto rej;
+ ie->id.node.level = *msg->b_rptr++;
+ (void)memcpy(ie->id.node.id, msg->b_rptr, 21);
+ msg->b_rptr += 21;
+ ielen -= 22;
+ break;
+
+ case UNI_CRANKBACK_LINK:
+ if(ielen < 48)
+ goto rej;
+ ie->id.link.plevel = *msg->b_rptr++;
+ (void)memcpy(ie->id.link.pid, msg->b_rptr, 21);
+ msg->b_rptr += 21;
+ ielen -= 22;
+
+ ie->id.link.port = *msg->b_rptr++ << 24;
+ ie->id.link.port |= *msg->b_rptr++ << 16;
+ ie->id.link.port |= *msg->b_rptr++ << 8;
+ ie->id.link.port |= *msg->b_rptr++ << 0;
+ ielen -= 4;
+
+ ie->id.link.slevel = *msg->b_rptr++;
+ (void)memcpy(ie->id.link.sid, msg->b_rptr, 21);
+ msg->b_rptr += 21;
+ ielen -= 22;
+
+ break;
+ }
+
+ if(ielen < 1)
+ goto rej;
+ ie->cause = *msg->b_rptr++;
+ ielen--;
+
+ if(ie->cause == UNI_CAUSE_CRATE_NAVL) {
+ if(ielen > 0) {
+ if(ielen != 9 && ielen != 17)
+ goto rej;
+ ie->diag.top.dir = *msg->b_rptr++;
+ ie->diag.top.port = *msg->b_rptr++ << 24;
+ ie->diag.top.port |= *msg->b_rptr++ << 16;
+ ie->diag.top.port |= *msg->b_rptr++ << 8;
+ ie->diag.top.port |= *msg->b_rptr++ << 0;
+ ie->diag.top.avcr = *msg->b_rptr++ << 24;
+ ie->diag.top.avcr |= *msg->b_rptr++ << 16;
+ ie->diag.top.avcr |= *msg->b_rptr++ << 8;
+ ie->diag.top.avcr |= *msg->b_rptr++ << 0;
+ ielen -= 9;
+ ie->h.present |= UNI_CRANKBACK_TOP_P;
+ if(ielen > 0) {
+ ie->diag.top.crm = *msg->b_rptr++ << 24;
+ ie->diag.top.crm |= *msg->b_rptr++ << 16;
+ ie->diag.top.crm |= *msg->b_rptr++ << 8;
+ ie->diag.top.crm |= *msg->b_rptr++ << 0;
+ ie->diag.top.vf = *msg->b_rptr++ << 24;
+ ie->diag.top.vf |= *msg->b_rptr++ << 16;
+ ie->diag.top.vf |= *msg->b_rptr++ << 8;
+ ie->diag.top.vf |= *msg->b_rptr++ << 0;
+ ie->h.present |= UNI_CRANKBACK_TOPX_P;
+ ielen -= 8;
+ }
+ }
+ } else if(ie->cause == UNI_CAUSE_QOS_NAVL) {
+ if(ielen > 0) {
+ if(ielen != 1)
+ goto rej;
+ ie->diag.qos.ctd = *msg->b_rptr >> 3;
+ ie->diag.qos.cdv = *msg->b_rptr >> 2;
+ ie->diag.qos.clr = *msg->b_rptr >> 1;
+ ie->diag.qos.other = *msg->b_rptr >> 0;
+ ie->h.present |= UNI_CRANKBACK_QOS_P;
+ ielen -= 1;
+ }
+ } else {
+ if(ielen > 0)
+ goto rej;
+ }
+
+ IE_END(CRANKBACK);
+}
+
+/*********************************************************************
+ *
+ * Designated transit list
+ *
+ * References for this IE are:
+ *
+ * PNNI1.0 pp. 206...208
+ *
+ * Only NET coding allowed.
+ */
+DEF_IE_PRINT(net, dtl)
+{
+ u_int i, j;
+ char buf[10];
+
+ if(uni_print_iehdr("dtl", &ie->h, cx))
+ return;
+
+ uni_print_entry(cx, "ptr", "%d(%d)", ie->ptr, ie->ptr / UNI_DTL_LOGNP_SIZE);
+ uni_print_push_prefix("dtl", cx);
+ cx->indent++;
+ uni_printf(cx, "{");
+ for(i = 0; i < ie->num; i++) {
+ sprintf(buf, "%d", i);
+ uni_print_entry(cx, buf, "{%d/", ie->dtl[i].node_level);
+ for(j = 0; j < 21; j++)
+ uni_printf(cx, "%02x", ie->dtl[i].node_id[j]);
+ uni_printf(cx, ",%04x}", ie->dtl[i].port_id);
+ uni_print_eol(cx);
+ }
+ cx->indent--;
+ uni_print_pop_prefix(cx);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, dtl)
+{
+ u_int i;
+
+ cx = cx;
+
+ if(ie->ptr % UNI_DTL_LOGNP_SIZE != 0)
+ return -1;
+ if(ie->ptr / UNI_DTL_LOGNP_SIZE > UNI_DTL_MAXNUM)
+ return -1;
+ if(ie->num > UNI_DTL_MAXNUM)
+ return -1;
+ for(i = 0; i < ie->num; i++)
+ if(ie->dtl[i].node_level > 104)
+ return -1;
+ return 0;
+}
+
+DEF_IE_ENCODE(net, dtl)
+{
+ u_int i;
+
+ START_IE(dtl, UNI_IE_DTL, 2 + UNI_DTL_LOGNP_SIZE * ie->num);
+
+ APP_16BIT(msg, ie->ptr);
+
+ for(i = 0; i < ie->num; i++) {
+ APP_BYTE(msg, UNI_DTL_LOGNP);
+ APP_BYTE(msg, ie->dtl[i].node_level);
+ APP_BUF(msg, ie->dtl[i].node_id, 21);
+ APP_32BIT(msg, ie->dtl[i].port_id);
+ }
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+
+DEF_IE_DECODE(net, dtl)
+{
+ IE_START(;);
+
+ if(ielen < 2)
+ goto rej;
+
+ ie->ptr = *msg->b_rptr++ << 8;
+ ie->ptr |= *msg->b_rptr++;
+ ielen -= 2;
+
+ if(ielen % UNI_DTL_LOGNP_SIZE != 0)
+ goto rej;
+ if(ielen / UNI_DTL_LOGNP_SIZE > UNI_DTL_MAXNUM)
+ goto rej;
+
+ ie->num = 0;
+ while(ielen) {
+ if(*msg->b_rptr++ != UNI_DTL_LOGNP)
+ goto rej;
+ ielen--;
+
+ ie->dtl[ie->num].node_level = *msg->b_rptr++;
+ ielen--;
+
+ (void)memcpy(ie->dtl[ie->num].node_id, msg->b_rptr, 21);
+ msg->b_rptr += 21;
+ ielen -= 21;
+
+ ie->dtl[ie->num].port_id = *msg->b_rptr++ << 24;
+ ie->dtl[ie->num].port_id |= *msg->b_rptr++ << 16;
+ ie->dtl[ie->num].port_id |= *msg->b_rptr++ << 8;
+ ie->dtl[ie->num].port_id |= *msg->b_rptr++ << 0;
+ ielen -= 4;
+
+ ie->num++;
+ }
+
+ IE_END(DTL);
+}
+
+/*********************************************************************
+ *
+ * Leaf initiated join call identifier.
+ * Leaf initiated join parameters.
+ * Leaf initiated join sequence number.
+ *
+ * References for this IE are:
+ *
+ * UNI4.0 pp. 46...48
+ *
+ * Only NET coding allowed.
+ */
+
+/**********************************************************************/
+
+DEF_IE_PRINT(net, lij_callid)
+{
+ static const struct uni_print_tbl type_tbl[] = {
+ MKT(UNI_LIJ_IDTYPE_ROOT, root),
+ EOT()
+ };
+
+ if(uni_print_iehdr("lij_callid", &ie->h, cx))
+ return;
+
+ uni_print_tbl("type", ie->type, type_tbl, cx);
+ uni_print_entry(cx, "id", "0x%x", ie->callid);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, lij_callid)
+{
+ cx = cx;
+
+ switch(ie->type) {
+
+ case UNI_LIJ_IDTYPE_ROOT:
+ break;
+
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+DEF_IE_ENCODE(net, lij_callid)
+{
+ START_IE(lij_callid, UNI_IE_LIJ_CALLID, 5);
+
+ APP_BYTE(msg, 0x80 | ie->type);
+ APP_32BIT(msg, ie->callid);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(net, lij_callid)
+{
+ IE_START(;);
+
+ if(ielen != 5)
+ goto rej;
+
+ ie->type = *msg->b_rptr++ & 0xf;
+ ie->callid = *msg->b_rptr++ << 24;
+ ie->callid |= *msg->b_rptr++ << 16;
+ ie->callid |= *msg->b_rptr++ << 8;
+ ie->callid |= *msg->b_rptr++ << 0;
+
+ IE_END(LIJ_CALLID);
+}
+
+/**********************************************************************/
+
+DEF_IE_PRINT(net, lij_param)
+{
+ static const struct uni_print_tbl lscreen_tbl[] = {
+ MKT(UNI_LIJ_SCREEN_NETJOIN, netjoin),
+ EOT()
+ };
+
+ if(uni_print_iehdr("lij_param", &ie->h, cx))
+ return;
+ uni_print_tbl("screen", ie->screen, lscreen_tbl, cx);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, lij_param)
+{
+ cx = cx;
+
+ switch(ie->screen) {
+
+ case UNI_LIJ_SCREEN_NETJOIN:
+ break;
+
+ default:
+ return -1;
+ }
+
+ return 0;
+}
+
+DEF_IE_ENCODE(net, lij_param)
+{
+ START_IE(lij_param, UNI_IE_LIJ_PARAM, 1);
+
+ APP_BYTE(msg, 0x80 | ie->screen);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(net, lij_param)
+{
+ IE_START(;);
+
+ if(ielen != 1)
+ goto rej;
+
+ ie->screen = *msg->b_rptr++ & 0xf;
+
+ IE_END(LIJ_PARAM);
+}
+
+/**********************************************************************/
+
+DEF_IE_PRINT(net, lij_seqno)
+{
+ if(uni_print_iehdr("lij_seqno", &ie->h, cx))
+ return;
+ uni_print_entry(cx, "seqno", "0x%x", ie->seqno);
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, lij_seqno)
+{
+ cx = cx; ie = ie;
+
+ return 0;
+}
+
+DEF_IE_ENCODE(net, lij_seqno)
+{
+ START_IE(lij_seqno, UNI_IE_LIJ_SEQNO, 4);
+
+ APP_32BIT(msg, ie->seqno);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(net, lij_seqno)
+{
+ IE_START(;);
+
+ if(ielen != 4)
+ goto rej;
+
+ ie->seqno = *msg->b_rptr++ << 24;
+ ie->seqno |= *msg->b_rptr++ << 16;
+ ie->seqno |= *msg->b_rptr++ << 8;
+ ie->seqno |= *msg->b_rptr++ << 0;
+
+ IE_END(LIJ_SEQNO);
+}
+
+/*********************************************************************
+ *
+ * Connection scope
+ *
+ * References for this IE are:
+ *
+ * UNI4.0 pp. 57...58
+ *
+ * Only NET coding allowed.
+ */
+DEF_IE_PRINT(net, cscope)
+{
+ static const struct uni_print_tbl type_tbl[] = {
+ MKT(UNI_CSCOPE_ORG, org),
+ EOT()
+ };
+ static const struct uni_print_tbl scope_tbl[] = {
+ MKT(UNI_CSCOPE_ORG_LOC, local_network),
+ MKT(UNI_CSCOPE_ORG_LOC_P1, local_network_plus_one),
+ MKT(UNI_CSCOPE_ORG_LOC_P2, local_network_plus_two),
+ MKT(UNI_CSCOPE_ORG_SITE_M1, site_minus_one),
+ MKT(UNI_CSCOPE_ORG_SITE, intra_site),
+ MKT(UNI_CSCOPE_ORG_SITE_P1, site_plus_one),
+ MKT(UNI_CSCOPE_ORG_ORG_M1, organisation_minus_one),
+ MKT(UNI_CSCOPE_ORG_ORG, intra_organisation),
+ MKT(UNI_CSCOPE_ORG_ORG_P1, organisation_plus_one),
+ MKT(UNI_CSCOPE_ORG_COMM_M1, community_minus_one),
+ MKT(UNI_CSCOPE_ORG_COMM, intra_community),
+ MKT(UNI_CSCOPE_ORG_COMM_P1, community_plus_one),
+ MKT(UNI_CSCOPE_ORG_REG, regional),
+ MKT(UNI_CSCOPE_ORG_INTER, inter_regional),
+ MKT(UNI_CSCOPE_ORG_GLOBAL, global),
+ EOT()
+ };
+
+ if(uni_print_iehdr("cscope", &ie->h, cx))
+ return;
+
+ uni_print_tbl("type", ie->type, type_tbl, cx);
+ if(ie->type == UNI_CSCOPE_ORG)
+ uni_print_tbl("scope", (u_int)ie->scope, scope_tbl, cx);
+ else
+ uni_print_entry(cx, "scope", "0x%02x", ie->scope);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, cscope)
+{
+ cx = cx;
+
+ switch(ie->type) {
+
+ default:
+ return -1;
+
+ case UNI_CSCOPE_ORG:
+ switch(ie->scope) {
+
+ default:
+ return -1;
+
+ case UNI_CSCOPE_ORG_LOC:
+ case UNI_CSCOPE_ORG_LOC_P1:
+ case UNI_CSCOPE_ORG_LOC_P2:
+ case UNI_CSCOPE_ORG_SITE_M1:
+ case UNI_CSCOPE_ORG_SITE:
+ case UNI_CSCOPE_ORG_SITE_P1:
+ case UNI_CSCOPE_ORG_ORG_M1:
+ case UNI_CSCOPE_ORG_ORG:
+ case UNI_CSCOPE_ORG_ORG_P1:
+ case UNI_CSCOPE_ORG_COMM_M1:
+ case UNI_CSCOPE_ORG_COMM:
+ case UNI_CSCOPE_ORG_COMM_P1:
+ case UNI_CSCOPE_ORG_REG:
+ case UNI_CSCOPE_ORG_INTER:
+ case UNI_CSCOPE_ORG_GLOBAL:
+ break;
+ }
+ break;
+ }
+ return 0;
+}
+
+DEF_IE_ENCODE(net, cscope)
+{
+ START_IE(cscope, UNI_IE_CSCOPE, 2);
+
+ APP_BYTE(msg, ie->type | 0x80);
+ APP_BYTE(msg, ie->scope);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(net, cscope)
+{
+ IE_START(;);
+ if(ielen != 2)
+ goto rej;
+
+ if((*msg->b_rptr & 0xf0) != 0x80)
+ goto rej;
+
+ ie->type = *msg->b_rptr++ & 0xf;
+ ie->scope = *msg->b_rptr++;
+
+ IE_END(CSCOPE);
+}
+
+/*********************************************************************
+ *
+ * Extended Quality of Service
+ *
+ * References for this IE are:
+ *
+ * UNI4.0 pp. 70...72
+ *
+ * Notes:
+ * Only NET coding.
+ */
+DEF_IE_PRINT(net, exqos)
+{
+ static const struct uni_print_tbl tab[] = {
+ MKT(UNI_EXQOS_USER, user),
+ MKT(UNI_EXQOS_NET, net),
+ EOT()
+ };
+
+ if(uni_print_iehdr("exqos", &ie->h, cx))
+ return;
+
+ uni_print_tbl("origin", ie->origin, tab, cx);
+
+ uni_print_entry(cx, "acceptable", "(");
+ if(ie->h.present & UNI_EXQOS_FACC_P) {
+ if(ie->facc == UNI_EXQOS_ANY_CDV)
+ uni_printf(cx, "ANY");
+ else
+ uni_printf(cx, "%d", ie->facc);
+ }
+ uni_putc(',', cx);
+ if(ie->h.present & UNI_EXQOS_BACC_P) {
+ if(ie->bacc == UNI_EXQOS_ANY_CDV)
+ uni_printf(cx, "ANY");
+ else
+ uni_printf(cx, "%d", ie->bacc);
+ }
+ uni_putc(')', cx);
+
+ uni_print_entry(cx, "cumulative", "(");
+ if(ie->h.present & UNI_EXQOS_FCUM_P)
+ uni_printf(cx, "%d", ie->fcum);
+ uni_putc(',', cx);
+ if(ie->h.present & UNI_EXQOS_BCUM_P)
+ uni_printf(cx, "%d", ie->bcum);
+ uni_putc(')', cx);
+
+ uni_print_entry(cx, "clrid", "(");
+ if(ie->h.present & UNI_EXQOS_FCLR_P) {
+ if(ie->fclr == UNI_EXQOS_ANY_CLR)
+ uni_printf(cx, "ANY");
+ else
+ uni_printf(cx, "%d", ie->fclr);
+ }
+ uni_putc(',', cx);
+ if(ie->h.present & UNI_EXQOS_BCLR_P) {
+ if(ie->bclr == UNI_EXQOS_ANY_CLR)
+ uni_printf(cx, "ANY");
+ else
+ uni_printf(cx, "%d", ie->bclr);
+ }
+ uni_putc(')', cx);
+
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(net, exqos)
+{
+ cx = cx;
+
+ switch(ie->origin) {
+ case UNI_EXQOS_USER:
+ case UNI_EXQOS_NET:
+ break;
+
+ default:
+ return -1;
+ }
+ if(ie->h.present & UNI_EXQOS_FACC_P)
+ if(!(ie->h.present & UNI_EXQOS_FCUM_P))
+ return -1;
+ if(ie->h.present & UNI_EXQOS_BACC_P)
+ if(!(ie->h.present & UNI_EXQOS_BCUM_P))
+ return -1;
+
+ if(ie->h.present & UNI_EXQOS_FACC_P)
+ if(ie->facc >= 1 << 24)
+ return -1;
+ if(ie->h.present & UNI_EXQOS_BACC_P)
+ if(ie->bacc >= 1 << 24)
+ return -1;
+ if(ie->h.present & UNI_EXQOS_FCUM_P)
+ if(ie->fcum >= 1 << 24)
+ return -1;
+ if(ie->h.present & UNI_EXQOS_BCUM_P)
+ if(ie->bcum >= 1 << 24)
+ return -1;
+
+ if(ie->h.present & UNI_EXQOS_FCLR_P)
+ if(ie->fclr==0 || (ie->fclr>15 && ie->fclr!=UNI_EXQOS_ANY_CLR))
+ return -1;
+ if(ie->h.present & UNI_EXQOS_BCLR_P)
+ if(ie->bclr==0 || (ie->bclr>15 && ie->bclr!=UNI_EXQOS_ANY_CLR))
+ return -1;
+ return 0;
+}
+
+DEF_IE_ENCODE(net, exqos)
+{
+ START_IE(exqos, UNI_IE_EXQOS, 21);
+
+ APP_BYTE(msg, ie->origin);
+
+ APP_OPT_24BIT(msg, ie->h.present, UNI_EXQOS_FACC_P,
+ UNI_EXQOS_FACC_ID, ie->facc);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_EXQOS_BACC_P,
+ UNI_EXQOS_BACC_ID, ie->bacc);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_EXQOS_FCUM_P,
+ UNI_EXQOS_FCUM_ID, ie->fcum);
+ APP_OPT_24BIT(msg, ie->h.present, UNI_EXQOS_BCUM_P,
+ UNI_EXQOS_BCUM_ID, ie->bcum);
+
+ APP_OPT_BYTE(msg, ie->h.present, UNI_EXQOS_FCLR_P,
+ UNI_EXQOS_FCLR_ID, ie->fclr);
+ APP_OPT_BYTE(msg, ie->h.present, UNI_EXQOS_BCLR_P,
+ UNI_EXQOS_BCLR_ID, ie->bclr);
+
+ SET_IE_LEN(msg);
+ return 0;
+}
+
+DEF_IE_DECODE(net, exqos)
+{
+ IE_START(;);
+
+ if(ielen < 1 || ielen > 21)
+ goto rej;
+
+ ie->origin = *msg->b_rptr++;
+ ielen--;
+
+ while(ielen--) {
+ switch(*msg->b_rptr++) {
+
+ default:
+ goto rej;
+
+ DEC_GETF3(EXQOS_FACC, facc, ie->h.present);
+ DEC_GETF3(EXQOS_BACC, bacc, ie->h.present);
+ DEC_GETF3(EXQOS_FCUM, fcum, ie->h.present);
+ DEC_GETF3(EXQOS_BCUM, bcum, ie->h.present);
+
+ DEC_GETF1(EXQOS_FCLR, fclr, ie->h.present);
+ DEC_GETF1(EXQOS_BCLR, bclr, ie->h.present);
+
+ }
+ }
+ IE_END(EXQOS);
+}
+
+/**************************************************************
+ *
+ * Free form IE (for testing mainly)
+ */
+DEF_IE_PRINT(itu, unrec)
+{
+ u_int i;
+
+ if (uni_print_iehdr("unrec", &ie->h, cx))
+ return;
+ uni_print_entry(cx, "len", "%u", ie->len);
+ uni_print_entry(cx, "data", "(");
+ for (i = 0; i < ie->len; i++)
+ uni_printf(cx, "%s0x%02x", i == 0 ? "" : " ", ie->data[i]);
+ uni_printf(cx, ")");
+ uni_print_ieend(cx);
+}
+
+DEF_IE_CHECK(itu, unrec)
+{
+ cx = cx;
+
+ if (ie->len > sizeof(ie->data))
+ return (-1);
+
+ return (0);
+}
+
+DEF_IE_ENCODE(itu, unrec)
+{
+ START_IE2(unrec, UNI_IE_UNREC, ie->len, ie->id);
+
+ APP_BUF(msg, ie->data, ie->len);
+
+ SET_IE_LEN(msg);
+ return (0);
+}
+
+DEF_IE_DECODE(itu, unrec)
+{
+ IE_START(;);
+
+ if (ielen > sizeof(ie->data) / sizeof(ie->data[0]) || ielen < 1)
+ goto rej;
+
+ ie->len = ielen;
+ ielen = 0;
+ (void)memcpy(ie->data, msg->b_rptr, ie->len);
+ msg->b_rptr += ie->len;
+
+ IE_END(UNREC);
+}
diff --git a/sys/contrib/ngatm/netnatm/msg/uni_ie.h b/sys/contrib/ngatm/netnatm/msg/uni_ie.h
new file mode 100644
index 0000000..f24c560
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/uni_ie.h
@@ -0,0 +1,57 @@
+/* This file was created automatically
+ * Source file: $Begemot: libunimsg/atm/msg/ie.def,v 1.3 2003/09/19 11:58:15 hbb Exp $
+ * $FreeBSD$
+ */
+
+#ifndef _NETNATM_MSG_UNI_IE_H_
+#define _NETNATM_MSG_UNI_IE_H_
+
+union uni_ieall {
+ struct uni_iehdr h;
+ struct uni_ie_cause cause;
+ struct uni_ie_callstate callstate;
+ struct uni_ie_facility facility;
+ struct uni_ie_notify notify;
+ struct uni_ie_eetd eetd;
+ struct uni_ie_conned conned;
+ struct uni_ie_connedsub connedsub;
+ struct uni_ie_epref epref;
+ struct uni_ie_epstate epstate;
+ struct uni_ie_aal aal;
+ struct uni_ie_traffic traffic;
+ struct uni_ie_connid connid;
+ struct uni_ie_qos qos;
+ struct uni_ie_bhli bhli;
+ struct uni_ie_bearer bearer;
+ struct uni_ie_blli blli;
+ struct uni_ie_lshift lshift;
+ struct uni_ie_nlshift nlshift;
+ struct uni_ie_scompl scompl;
+ struct uni_ie_repeat repeat;
+ struct uni_ie_calling calling;
+ struct uni_ie_callingsub callingsub;
+ struct uni_ie_called called;
+ struct uni_ie_calledsub calledsub;
+ struct uni_ie_tns tns;
+ struct uni_ie_restart restart;
+ struct uni_ie_uu uu;
+ struct uni_ie_git git;
+ struct uni_ie_mintraffic mintraffic;
+ struct uni_ie_atraffic atraffic;
+ struct uni_ie_abrsetup abrsetup;
+ struct uni_ie_report report;
+ struct uni_ie_called_soft called_soft;
+ struct uni_ie_crankback crankback;
+ struct uni_ie_dtl dtl;
+ struct uni_ie_calling_soft calling_soft;
+ struct uni_ie_abradd abradd;
+ struct uni_ie_lij_callid lij_callid;
+ struct uni_ie_lij_param lij_param;
+ struct uni_ie_lij_seqno lij_seqno;
+ struct uni_ie_cscope cscope;
+ struct uni_ie_exqos exqos;
+ struct uni_ie_mdcr mdcr;
+ struct uni_ie_unrec unrec;
+};
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/msg/uni_ietab.h b/sys/contrib/ngatm/netnatm/msg/uni_ietab.h
new file mode 100644
index 0000000..62cba33
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/uni_ietab.h
@@ -0,0 +1,958 @@
+/* This file was created automatically
+ * Source file: $Begemot: libunimsg/atm/msg/ie.def,v 1.3 2003/09/19 11:58:15 hbb Exp $
+ * $FreeBSD$
+ */
+
+
+static void uni_ie_print_itu_cause(struct uni_ie_cause *, struct unicx *);
+static int uni_ie_check_itu_cause(struct uni_ie_cause *, struct unicx *);
+static int uni_ie_encode_itu_cause(struct uni_msg *, struct uni_ie_cause *, struct unicx *);
+static int uni_ie_decode_itu_cause(struct uni_ie_cause *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_cause = {
+ 0,
+ 34,
+ (uni_print_f)uni_ie_print_itu_cause,
+ (uni_check_f)uni_ie_check_itu_cause,
+ (uni_encode_f)uni_ie_encode_itu_cause,
+ (uni_decode_f)uni_ie_decode_itu_cause
+};
+
+static void uni_ie_print_net_cause(struct uni_ie_cause *, struct unicx *);
+static int uni_ie_check_net_cause(struct uni_ie_cause *, struct unicx *);
+static int uni_ie_encode_net_cause(struct uni_msg *, struct uni_ie_cause *, struct unicx *);
+static int uni_ie_decode_net_cause(struct uni_ie_cause *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_cause = {
+ 0,
+ 34,
+ (uni_print_f)uni_ie_print_net_cause,
+ (uni_check_f)uni_ie_check_net_cause,
+ (uni_encode_f)uni_ie_encode_net_cause,
+ (uni_decode_f)uni_ie_decode_net_cause
+};
+
+static void uni_ie_print_itu_callstate(struct uni_ie_callstate *, struct unicx *);
+static int uni_ie_check_itu_callstate(struct uni_ie_callstate *, struct unicx *);
+static int uni_ie_encode_itu_callstate(struct uni_msg *, struct uni_ie_callstate *, struct unicx *);
+static int uni_ie_decode_itu_callstate(struct uni_ie_callstate *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_callstate = {
+ 0,
+ 5,
+ (uni_print_f)uni_ie_print_itu_callstate,
+ (uni_check_f)uni_ie_check_itu_callstate,
+ (uni_encode_f)uni_ie_encode_itu_callstate,
+ (uni_decode_f)uni_ie_decode_itu_callstate
+};
+
+static void uni_ie_print_itu_facility(struct uni_ie_facility *, struct unicx *);
+static int uni_ie_check_itu_facility(struct uni_ie_facility *, struct unicx *);
+static int uni_ie_encode_itu_facility(struct uni_msg *, struct uni_ie_facility *, struct unicx *);
+static int uni_ie_decode_itu_facility(struct uni_ie_facility *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_facility = {
+ 0,
+ UNI_FACILITY_MAXAPDU+1+4,
+ (uni_print_f)uni_ie_print_itu_facility,
+ (uni_check_f)uni_ie_check_itu_facility,
+ (uni_encode_f)uni_ie_encode_itu_facility,
+ (uni_decode_f)uni_ie_decode_itu_facility
+};
+
+static void uni_ie_print_itu_notify(struct uni_ie_notify *, struct unicx *);
+static int uni_ie_check_itu_notify(struct uni_ie_notify *, struct unicx *);
+static int uni_ie_encode_itu_notify(struct uni_msg *, struct uni_ie_notify *, struct unicx *);
+static int uni_ie_decode_itu_notify(struct uni_ie_notify *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_notify = {
+ 0,
+ UNI_NOTIFY_MAXLEN+4,
+ (uni_print_f)uni_ie_print_itu_notify,
+ (uni_check_f)uni_ie_check_itu_notify,
+ (uni_encode_f)uni_ie_encode_itu_notify,
+ (uni_decode_f)uni_ie_decode_itu_notify
+};
+
+static void uni_ie_print_itu_eetd(struct uni_ie_eetd *, struct unicx *);
+static int uni_ie_check_itu_eetd(struct uni_ie_eetd *, struct unicx *);
+static int uni_ie_encode_itu_eetd(struct uni_msg *, struct uni_ie_eetd *, struct unicx *);
+static int uni_ie_decode_itu_eetd(struct uni_ie_eetd *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_eetd = {
+ 0,
+ 11,
+ (uni_print_f)uni_ie_print_itu_eetd,
+ (uni_check_f)uni_ie_check_itu_eetd,
+ (uni_encode_f)uni_ie_encode_itu_eetd,
+ (uni_decode_f)uni_ie_decode_itu_eetd
+};
+
+static void uni_ie_print_net_eetd(struct uni_ie_eetd *, struct unicx *);
+static int uni_ie_check_net_eetd(struct uni_ie_eetd *, struct unicx *);
+static int uni_ie_encode_net_eetd(struct uni_msg *, struct uni_ie_eetd *, struct unicx *);
+static int uni_ie_decode_net_eetd(struct uni_ie_eetd *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_eetd = {
+ 0,
+ 13,
+ (uni_print_f)uni_ie_print_net_eetd,
+ (uni_check_f)uni_ie_check_net_eetd,
+ (uni_encode_f)uni_ie_encode_net_eetd,
+ (uni_decode_f)uni_ie_decode_net_eetd
+};
+
+static void uni_ie_print_itu_conned(struct uni_ie_conned *, struct unicx *);
+static int uni_ie_check_itu_conned(struct uni_ie_conned *, struct unicx *);
+static int uni_ie_encode_itu_conned(struct uni_msg *, struct uni_ie_conned *, struct unicx *);
+static int uni_ie_decode_itu_conned(struct uni_ie_conned *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_conned = {
+ 0,
+ 25,
+ (uni_print_f)uni_ie_print_itu_conned,
+ (uni_check_f)uni_ie_check_itu_conned,
+ (uni_encode_f)uni_ie_encode_itu_conned,
+ (uni_decode_f)uni_ie_decode_itu_conned
+};
+
+static void uni_ie_print_itu_connedsub(struct uni_ie_connedsub *, struct unicx *);
+static int uni_ie_check_itu_connedsub(struct uni_ie_connedsub *, struct unicx *);
+static int uni_ie_encode_itu_connedsub(struct uni_msg *, struct uni_ie_connedsub *, struct unicx *);
+static int uni_ie_decode_itu_connedsub(struct uni_ie_connedsub *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_connedsub = {
+ UNIFL_ACCESS,
+ 25,
+ (uni_print_f)uni_ie_print_itu_connedsub,
+ (uni_check_f)uni_ie_check_itu_connedsub,
+ (uni_encode_f)uni_ie_encode_itu_connedsub,
+ (uni_decode_f)uni_ie_decode_itu_connedsub
+};
+
+static void uni_ie_print_itu_epref(struct uni_ie_epref *, struct unicx *);
+static int uni_ie_check_itu_epref(struct uni_ie_epref *, struct unicx *);
+static int uni_ie_encode_itu_epref(struct uni_msg *, struct uni_ie_epref *, struct unicx *);
+static int uni_ie_decode_itu_epref(struct uni_ie_epref *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_epref = {
+ 0,
+ 7,
+ (uni_print_f)uni_ie_print_itu_epref,
+ (uni_check_f)uni_ie_check_itu_epref,
+ (uni_encode_f)uni_ie_encode_itu_epref,
+ (uni_decode_f)uni_ie_decode_itu_epref
+};
+
+static void uni_ie_print_itu_epstate(struct uni_ie_epstate *, struct unicx *);
+static int uni_ie_check_itu_epstate(struct uni_ie_epstate *, struct unicx *);
+static int uni_ie_encode_itu_epstate(struct uni_msg *, struct uni_ie_epstate *, struct unicx *);
+static int uni_ie_decode_itu_epstate(struct uni_ie_epstate *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_epstate = {
+ 0,
+ 5,
+ (uni_print_f)uni_ie_print_itu_epstate,
+ (uni_check_f)uni_ie_check_itu_epstate,
+ (uni_encode_f)uni_ie_encode_itu_epstate,
+ (uni_decode_f)uni_ie_decode_itu_epstate
+};
+
+static void uni_ie_print_itu_aal(struct uni_ie_aal *, struct unicx *);
+static int uni_ie_check_itu_aal(struct uni_ie_aal *, struct unicx *);
+static int uni_ie_encode_itu_aal(struct uni_msg *, struct uni_ie_aal *, struct unicx *);
+static int uni_ie_decode_itu_aal(struct uni_ie_aal *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_aal = {
+ UNIFL_ACCESS,
+ 21,
+ (uni_print_f)uni_ie_print_itu_aal,
+ (uni_check_f)uni_ie_check_itu_aal,
+ (uni_encode_f)uni_ie_encode_itu_aal,
+ (uni_decode_f)uni_ie_decode_itu_aal
+};
+
+static void uni_ie_print_itu_traffic(struct uni_ie_traffic *, struct unicx *);
+static int uni_ie_check_itu_traffic(struct uni_ie_traffic *, struct unicx *);
+static int uni_ie_encode_itu_traffic(struct uni_msg *, struct uni_ie_traffic *, struct unicx *);
+static int uni_ie_decode_itu_traffic(struct uni_ie_traffic *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_traffic = {
+ 0,
+ 30,
+ (uni_print_f)uni_ie_print_itu_traffic,
+ (uni_check_f)uni_ie_check_itu_traffic,
+ (uni_encode_f)uni_ie_encode_itu_traffic,
+ (uni_decode_f)uni_ie_decode_itu_traffic
+};
+
+static const struct iedecl decl_net_traffic = {
+ UNIFL_DEFAULT,
+ 0,
+ (uni_print_f)NULL,
+ (uni_check_f)NULL,
+ (uni_encode_f)NULL,
+ (uni_decode_f)NULL
+};
+
+static void uni_ie_print_itu_connid(struct uni_ie_connid *, struct unicx *);
+static int uni_ie_check_itu_connid(struct uni_ie_connid *, struct unicx *);
+static int uni_ie_encode_itu_connid(struct uni_msg *, struct uni_ie_connid *, struct unicx *);
+static int uni_ie_decode_itu_connid(struct uni_ie_connid *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_connid = {
+ 0,
+ 9,
+ (uni_print_f)uni_ie_print_itu_connid,
+ (uni_check_f)uni_ie_check_itu_connid,
+ (uni_encode_f)uni_ie_encode_itu_connid,
+ (uni_decode_f)uni_ie_decode_itu_connid
+};
+
+static void uni_ie_print_itu_qos(struct uni_ie_qos *, struct unicx *);
+static int uni_ie_check_itu_qos(struct uni_ie_qos *, struct unicx *);
+static int uni_ie_encode_itu_qos(struct uni_msg *, struct uni_ie_qos *, struct unicx *);
+static int uni_ie_decode_itu_qos(struct uni_ie_qos *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_qos = {
+ 0,
+ 6,
+ (uni_print_f)uni_ie_print_itu_qos,
+ (uni_check_f)uni_ie_check_itu_qos,
+ (uni_encode_f)uni_ie_encode_itu_qos,
+ (uni_decode_f)uni_ie_decode_itu_qos
+};
+
+static void uni_ie_print_net_qos(struct uni_ie_qos *, struct unicx *);
+static int uni_ie_check_net_qos(struct uni_ie_qos *, struct unicx *);
+static int uni_ie_encode_net_qos(struct uni_msg *, struct uni_ie_qos *, struct unicx *);
+static int uni_ie_decode_net_qos(struct uni_ie_qos *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_qos = {
+ 0,
+ 6,
+ (uni_print_f)uni_ie_print_net_qos,
+ (uni_check_f)uni_ie_check_net_qos,
+ (uni_encode_f)uni_ie_encode_net_qos,
+ (uni_decode_f)uni_ie_decode_net_qos
+};
+
+static void uni_ie_print_itu_bhli(struct uni_ie_bhli *, struct unicx *);
+static int uni_ie_check_itu_bhli(struct uni_ie_bhli *, struct unicx *);
+static int uni_ie_encode_itu_bhli(struct uni_msg *, struct uni_ie_bhli *, struct unicx *);
+static int uni_ie_decode_itu_bhli(struct uni_ie_bhli *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_bhli = {
+ UNIFL_ACCESS,
+ 13,
+ (uni_print_f)uni_ie_print_itu_bhli,
+ (uni_check_f)uni_ie_check_itu_bhli,
+ (uni_encode_f)uni_ie_encode_itu_bhli,
+ (uni_decode_f)uni_ie_decode_itu_bhli
+};
+
+static void uni_ie_print_itu_bearer(struct uni_ie_bearer *, struct unicx *);
+static int uni_ie_check_itu_bearer(struct uni_ie_bearer *, struct unicx *);
+static int uni_ie_encode_itu_bearer(struct uni_msg *, struct uni_ie_bearer *, struct unicx *);
+static int uni_ie_decode_itu_bearer(struct uni_ie_bearer *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_bearer = {
+ 0,
+ 7,
+ (uni_print_f)uni_ie_print_itu_bearer,
+ (uni_check_f)uni_ie_check_itu_bearer,
+ (uni_encode_f)uni_ie_encode_itu_bearer,
+ (uni_decode_f)uni_ie_decode_itu_bearer
+};
+
+static void uni_ie_print_itu_blli(struct uni_ie_blli *, struct unicx *);
+static int uni_ie_check_itu_blli(struct uni_ie_blli *, struct unicx *);
+static int uni_ie_encode_itu_blli(struct uni_msg *, struct uni_ie_blli *, struct unicx *);
+static int uni_ie_decode_itu_blli(struct uni_ie_blli *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_blli = {
+ UNIFL_ACCESS,
+ 17,
+ (uni_print_f)uni_ie_print_itu_blli,
+ (uni_check_f)uni_ie_check_itu_blli,
+ (uni_encode_f)uni_ie_encode_itu_blli,
+ (uni_decode_f)uni_ie_decode_itu_blli
+};
+
+static void uni_ie_print_itu_lshift(struct uni_ie_lshift *, struct unicx *);
+static int uni_ie_check_itu_lshift(struct uni_ie_lshift *, struct unicx *);
+static int uni_ie_encode_itu_lshift(struct uni_msg *, struct uni_ie_lshift *, struct unicx *);
+static int uni_ie_decode_itu_lshift(struct uni_ie_lshift *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_lshift = {
+ 0,
+ 5,
+ (uni_print_f)uni_ie_print_itu_lshift,
+ (uni_check_f)uni_ie_check_itu_lshift,
+ (uni_encode_f)uni_ie_encode_itu_lshift,
+ (uni_decode_f)uni_ie_decode_itu_lshift
+};
+
+static void uni_ie_print_itu_nlshift(struct uni_ie_nlshift *, struct unicx *);
+static int uni_ie_check_itu_nlshift(struct uni_ie_nlshift *, struct unicx *);
+static int uni_ie_encode_itu_nlshift(struct uni_msg *, struct uni_ie_nlshift *, struct unicx *);
+static int uni_ie_decode_itu_nlshift(struct uni_ie_nlshift *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_nlshift = {
+ 0,
+ 5,
+ (uni_print_f)uni_ie_print_itu_nlshift,
+ (uni_check_f)uni_ie_check_itu_nlshift,
+ (uni_encode_f)uni_ie_encode_itu_nlshift,
+ (uni_decode_f)uni_ie_decode_itu_nlshift
+};
+
+static void uni_ie_print_itu_scompl(struct uni_ie_scompl *, struct unicx *);
+static int uni_ie_check_itu_scompl(struct uni_ie_scompl *, struct unicx *);
+static int uni_ie_encode_itu_scompl(struct uni_msg *, struct uni_ie_scompl *, struct unicx *);
+static int uni_ie_decode_itu_scompl(struct uni_ie_scompl *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_scompl = {
+ 0,
+ 5,
+ (uni_print_f)uni_ie_print_itu_scompl,
+ (uni_check_f)uni_ie_check_itu_scompl,
+ (uni_encode_f)uni_ie_encode_itu_scompl,
+ (uni_decode_f)uni_ie_decode_itu_scompl
+};
+
+static void uni_ie_print_itu_repeat(struct uni_ie_repeat *, struct unicx *);
+static int uni_ie_check_itu_repeat(struct uni_ie_repeat *, struct unicx *);
+static int uni_ie_encode_itu_repeat(struct uni_msg *, struct uni_ie_repeat *, struct unicx *);
+static int uni_ie_decode_itu_repeat(struct uni_ie_repeat *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_repeat = {
+ 0,
+ 5,
+ (uni_print_f)uni_ie_print_itu_repeat,
+ (uni_check_f)uni_ie_check_itu_repeat,
+ (uni_encode_f)uni_ie_encode_itu_repeat,
+ (uni_decode_f)uni_ie_decode_itu_repeat
+};
+
+static void uni_ie_print_itu_calling(struct uni_ie_calling *, struct unicx *);
+static int uni_ie_check_itu_calling(struct uni_ie_calling *, struct unicx *);
+static int uni_ie_encode_itu_calling(struct uni_msg *, struct uni_ie_calling *, struct unicx *);
+static int uni_ie_decode_itu_calling(struct uni_ie_calling *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_calling = {
+ 0,
+ 26,
+ (uni_print_f)uni_ie_print_itu_calling,
+ (uni_check_f)uni_ie_check_itu_calling,
+ (uni_encode_f)uni_ie_encode_itu_calling,
+ (uni_decode_f)uni_ie_decode_itu_calling
+};
+
+static void uni_ie_print_itu_callingsub(struct uni_ie_callingsub *, struct unicx *);
+static int uni_ie_check_itu_callingsub(struct uni_ie_callingsub *, struct unicx *);
+static int uni_ie_encode_itu_callingsub(struct uni_msg *, struct uni_ie_callingsub *, struct unicx *);
+static int uni_ie_decode_itu_callingsub(struct uni_ie_callingsub *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_callingsub = {
+ UNIFL_ACCESS,
+ 25,
+ (uni_print_f)uni_ie_print_itu_callingsub,
+ (uni_check_f)uni_ie_check_itu_callingsub,
+ (uni_encode_f)uni_ie_encode_itu_callingsub,
+ (uni_decode_f)uni_ie_decode_itu_callingsub
+};
+
+static void uni_ie_print_itu_called(struct uni_ie_called *, struct unicx *);
+static int uni_ie_check_itu_called(struct uni_ie_called *, struct unicx *);
+static int uni_ie_encode_itu_called(struct uni_msg *, struct uni_ie_called *, struct unicx *);
+static int uni_ie_decode_itu_called(struct uni_ie_called *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_called = {
+ 0,
+ 25,
+ (uni_print_f)uni_ie_print_itu_called,
+ (uni_check_f)uni_ie_check_itu_called,
+ (uni_encode_f)uni_ie_encode_itu_called,
+ (uni_decode_f)uni_ie_decode_itu_called
+};
+
+static void uni_ie_print_itu_calledsub(struct uni_ie_calledsub *, struct unicx *);
+static int uni_ie_check_itu_calledsub(struct uni_ie_calledsub *, struct unicx *);
+static int uni_ie_encode_itu_calledsub(struct uni_msg *, struct uni_ie_calledsub *, struct unicx *);
+static int uni_ie_decode_itu_calledsub(struct uni_ie_calledsub *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_calledsub = {
+ UNIFL_ACCESS,
+ 25,
+ (uni_print_f)uni_ie_print_itu_calledsub,
+ (uni_check_f)uni_ie_check_itu_calledsub,
+ (uni_encode_f)uni_ie_encode_itu_calledsub,
+ (uni_decode_f)uni_ie_decode_itu_calledsub
+};
+
+static void uni_ie_print_itu_tns(struct uni_ie_tns *, struct unicx *);
+static int uni_ie_check_itu_tns(struct uni_ie_tns *, struct unicx *);
+static int uni_ie_encode_itu_tns(struct uni_msg *, struct uni_ie_tns *, struct unicx *);
+static int uni_ie_decode_itu_tns(struct uni_ie_tns *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_tns = {
+ 0,
+ 9,
+ (uni_print_f)uni_ie_print_itu_tns,
+ (uni_check_f)uni_ie_check_itu_tns,
+ (uni_encode_f)uni_ie_encode_itu_tns,
+ (uni_decode_f)uni_ie_decode_itu_tns
+};
+
+static const struct iedecl decl_net_tns = {
+ UNIFL_DEFAULT,
+ 0,
+ (uni_print_f)NULL,
+ (uni_check_f)NULL,
+ (uni_encode_f)NULL,
+ (uni_decode_f)NULL
+};
+
+static void uni_ie_print_itu_restart(struct uni_ie_restart *, struct unicx *);
+static int uni_ie_check_itu_restart(struct uni_ie_restart *, struct unicx *);
+static int uni_ie_encode_itu_restart(struct uni_msg *, struct uni_ie_restart *, struct unicx *);
+static int uni_ie_decode_itu_restart(struct uni_ie_restart *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_restart = {
+ 0,
+ 5,
+ (uni_print_f)uni_ie_print_itu_restart,
+ (uni_check_f)uni_ie_check_itu_restart,
+ (uni_encode_f)uni_ie_encode_itu_restart,
+ (uni_decode_f)uni_ie_decode_itu_restart
+};
+
+static void uni_ie_print_itu_uu(struct uni_ie_uu *, struct unicx *);
+static int uni_ie_check_itu_uu(struct uni_ie_uu *, struct unicx *);
+static int uni_ie_encode_itu_uu(struct uni_msg *, struct uni_ie_uu *, struct unicx *);
+static int uni_ie_decode_itu_uu(struct uni_ie_uu *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_uu = {
+ UNIFL_ACCESS,
+ UNI_UU_MAXLEN+4,
+ (uni_print_f)uni_ie_print_itu_uu,
+ (uni_check_f)uni_ie_check_itu_uu,
+ (uni_encode_f)uni_ie_encode_itu_uu,
+ (uni_decode_f)uni_ie_decode_itu_uu
+};
+
+static void uni_ie_print_net_git(struct uni_ie_git *, struct unicx *);
+static int uni_ie_check_net_git(struct uni_ie_git *, struct unicx *);
+static int uni_ie_encode_net_git(struct uni_msg *, struct uni_ie_git *, struct unicx *);
+static int uni_ie_decode_net_git(struct uni_ie_git *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_git = {
+ 0,
+ 33,
+ (uni_print_f)uni_ie_print_net_git,
+ (uni_check_f)uni_ie_check_net_git,
+ (uni_encode_f)uni_ie_encode_net_git,
+ (uni_decode_f)uni_ie_decode_net_git
+};
+
+static void uni_ie_print_itu_mintraffic(struct uni_ie_mintraffic *, struct unicx *);
+static int uni_ie_check_itu_mintraffic(struct uni_ie_mintraffic *, struct unicx *);
+static int uni_ie_encode_itu_mintraffic(struct uni_msg *, struct uni_ie_mintraffic *, struct unicx *);
+static int uni_ie_decode_itu_mintraffic(struct uni_ie_mintraffic *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_mintraffic = {
+ 0,
+ 20,
+ (uni_print_f)uni_ie_print_itu_mintraffic,
+ (uni_check_f)uni_ie_check_itu_mintraffic,
+ (uni_encode_f)uni_ie_encode_itu_mintraffic,
+ (uni_decode_f)uni_ie_decode_itu_mintraffic
+};
+
+static const struct iedecl decl_net_mintraffic = {
+ UNIFL_DEFAULT,
+ 0,
+ (uni_print_f)NULL,
+ (uni_check_f)NULL,
+ (uni_encode_f)NULL,
+ (uni_decode_f)NULL
+};
+
+static void uni_ie_print_itu_atraffic(struct uni_ie_atraffic *, struct unicx *);
+static int uni_ie_check_itu_atraffic(struct uni_ie_atraffic *, struct unicx *);
+static int uni_ie_encode_itu_atraffic(struct uni_msg *, struct uni_ie_atraffic *, struct unicx *);
+static int uni_ie_decode_itu_atraffic(struct uni_ie_atraffic *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_atraffic = {
+ 0,
+ 30,
+ (uni_print_f)uni_ie_print_itu_atraffic,
+ (uni_check_f)uni_ie_check_itu_atraffic,
+ (uni_encode_f)uni_ie_encode_itu_atraffic,
+ (uni_decode_f)uni_ie_decode_itu_atraffic
+};
+
+static const struct iedecl decl_net_atraffic = {
+ UNIFL_DEFAULT,
+ 0,
+ (uni_print_f)NULL,
+ (uni_check_f)NULL,
+ (uni_encode_f)NULL,
+ (uni_decode_f)NULL
+};
+
+static void uni_ie_print_net_abrsetup(struct uni_ie_abrsetup *, struct unicx *);
+static int uni_ie_check_net_abrsetup(struct uni_ie_abrsetup *, struct unicx *);
+static int uni_ie_encode_net_abrsetup(struct uni_msg *, struct uni_ie_abrsetup *, struct unicx *);
+static int uni_ie_decode_net_abrsetup(struct uni_ie_abrsetup *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_abrsetup = {
+ 0,
+ 36,
+ (uni_print_f)uni_ie_print_net_abrsetup,
+ (uni_check_f)uni_ie_check_net_abrsetup,
+ (uni_encode_f)uni_ie_encode_net_abrsetup,
+ (uni_decode_f)uni_ie_decode_net_abrsetup
+};
+
+static void uni_ie_print_itu_report(struct uni_ie_report *, struct unicx *);
+static int uni_ie_check_itu_report(struct uni_ie_report *, struct unicx *);
+static int uni_ie_encode_itu_report(struct uni_msg *, struct uni_ie_report *, struct unicx *);
+static int uni_ie_decode_itu_report(struct uni_ie_report *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_report = {
+ 0,
+ 5,
+ (uni_print_f)uni_ie_print_itu_report,
+ (uni_check_f)uni_ie_check_itu_report,
+ (uni_encode_f)uni_ie_encode_itu_report,
+ (uni_decode_f)uni_ie_decode_itu_report
+};
+
+static void uni_ie_print_net_called_soft(struct uni_ie_called_soft *, struct unicx *);
+static int uni_ie_check_net_called_soft(struct uni_ie_called_soft *, struct unicx *);
+static int uni_ie_encode_net_called_soft(struct uni_msg *, struct uni_ie_called_soft *, struct unicx *);
+static int uni_ie_decode_net_called_soft(struct uni_ie_called_soft *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_called_soft = {
+ 0,
+ 11,
+ (uni_print_f)uni_ie_print_net_called_soft,
+ (uni_check_f)uni_ie_check_net_called_soft,
+ (uni_encode_f)uni_ie_encode_net_called_soft,
+ (uni_decode_f)uni_ie_decode_net_called_soft
+};
+
+static void uni_ie_print_net_crankback(struct uni_ie_crankback *, struct unicx *);
+static int uni_ie_check_net_crankback(struct uni_ie_crankback *, struct unicx *);
+static int uni_ie_encode_net_crankback(struct uni_msg *, struct uni_ie_crankback *, struct unicx *);
+static int uni_ie_decode_net_crankback(struct uni_ie_crankback *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_crankback = {
+ 0,
+ 72,
+ (uni_print_f)uni_ie_print_net_crankback,
+ (uni_check_f)uni_ie_check_net_crankback,
+ (uni_encode_f)uni_ie_encode_net_crankback,
+ (uni_decode_f)uni_ie_decode_net_crankback
+};
+
+static void uni_ie_print_net_dtl(struct uni_ie_dtl *, struct unicx *);
+static int uni_ie_check_net_dtl(struct uni_ie_dtl *, struct unicx *);
+static int uni_ie_encode_net_dtl(struct uni_msg *, struct uni_ie_dtl *, struct unicx *);
+static int uni_ie_decode_net_dtl(struct uni_ie_dtl *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_dtl = {
+ 0,
+ UNI_DTL_LOGNP_SIZE*UNI_DTL_MAXNUM+6,
+ (uni_print_f)uni_ie_print_net_dtl,
+ (uni_check_f)uni_ie_check_net_dtl,
+ (uni_encode_f)uni_ie_encode_net_dtl,
+ (uni_decode_f)uni_ie_decode_net_dtl
+};
+
+static void uni_ie_print_net_calling_soft(struct uni_ie_calling_soft *, struct unicx *);
+static int uni_ie_check_net_calling_soft(struct uni_ie_calling_soft *, struct unicx *);
+static int uni_ie_encode_net_calling_soft(struct uni_msg *, struct uni_ie_calling_soft *, struct unicx *);
+static int uni_ie_decode_net_calling_soft(struct uni_ie_calling_soft *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_calling_soft = {
+ 0,
+ 10,
+ (uni_print_f)uni_ie_print_net_calling_soft,
+ (uni_check_f)uni_ie_check_net_calling_soft,
+ (uni_encode_f)uni_ie_encode_net_calling_soft,
+ (uni_decode_f)uni_ie_decode_net_calling_soft
+};
+
+static void uni_ie_print_net_abradd(struct uni_ie_abradd *, struct unicx *);
+static int uni_ie_check_net_abradd(struct uni_ie_abradd *, struct unicx *);
+static int uni_ie_encode_net_abradd(struct uni_msg *, struct uni_ie_abradd *, struct unicx *);
+static int uni_ie_decode_net_abradd(struct uni_ie_abradd *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_abradd = {
+ 0,
+ 14,
+ (uni_print_f)uni_ie_print_net_abradd,
+ (uni_check_f)uni_ie_check_net_abradd,
+ (uni_encode_f)uni_ie_encode_net_abradd,
+ (uni_decode_f)uni_ie_decode_net_abradd
+};
+
+static void uni_ie_print_net_lij_callid(struct uni_ie_lij_callid *, struct unicx *);
+static int uni_ie_check_net_lij_callid(struct uni_ie_lij_callid *, struct unicx *);
+static int uni_ie_encode_net_lij_callid(struct uni_msg *, struct uni_ie_lij_callid *, struct unicx *);
+static int uni_ie_decode_net_lij_callid(struct uni_ie_lij_callid *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_lij_callid = {
+ 0,
+ 9,
+ (uni_print_f)uni_ie_print_net_lij_callid,
+ (uni_check_f)uni_ie_check_net_lij_callid,
+ (uni_encode_f)uni_ie_encode_net_lij_callid,
+ (uni_decode_f)uni_ie_decode_net_lij_callid
+};
+
+static void uni_ie_print_net_lij_param(struct uni_ie_lij_param *, struct unicx *);
+static int uni_ie_check_net_lij_param(struct uni_ie_lij_param *, struct unicx *);
+static int uni_ie_encode_net_lij_param(struct uni_msg *, struct uni_ie_lij_param *, struct unicx *);
+static int uni_ie_decode_net_lij_param(struct uni_ie_lij_param *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_lij_param = {
+ 0,
+ 5,
+ (uni_print_f)uni_ie_print_net_lij_param,
+ (uni_check_f)uni_ie_check_net_lij_param,
+ (uni_encode_f)uni_ie_encode_net_lij_param,
+ (uni_decode_f)uni_ie_decode_net_lij_param
+};
+
+static void uni_ie_print_net_lij_seqno(struct uni_ie_lij_seqno *, struct unicx *);
+static int uni_ie_check_net_lij_seqno(struct uni_ie_lij_seqno *, struct unicx *);
+static int uni_ie_encode_net_lij_seqno(struct uni_msg *, struct uni_ie_lij_seqno *, struct unicx *);
+static int uni_ie_decode_net_lij_seqno(struct uni_ie_lij_seqno *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_lij_seqno = {
+ 0,
+ 8,
+ (uni_print_f)uni_ie_print_net_lij_seqno,
+ (uni_check_f)uni_ie_check_net_lij_seqno,
+ (uni_encode_f)uni_ie_encode_net_lij_seqno,
+ (uni_decode_f)uni_ie_decode_net_lij_seqno
+};
+
+static void uni_ie_print_net_cscope(struct uni_ie_cscope *, struct unicx *);
+static int uni_ie_check_net_cscope(struct uni_ie_cscope *, struct unicx *);
+static int uni_ie_encode_net_cscope(struct uni_msg *, struct uni_ie_cscope *, struct unicx *);
+static int uni_ie_decode_net_cscope(struct uni_ie_cscope *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_cscope = {
+ 0,
+ 6,
+ (uni_print_f)uni_ie_print_net_cscope,
+ (uni_check_f)uni_ie_check_net_cscope,
+ (uni_encode_f)uni_ie_encode_net_cscope,
+ (uni_decode_f)uni_ie_decode_net_cscope
+};
+
+static void uni_ie_print_net_exqos(struct uni_ie_exqos *, struct unicx *);
+static int uni_ie_check_net_exqos(struct uni_ie_exqos *, struct unicx *);
+static int uni_ie_encode_net_exqos(struct uni_msg *, struct uni_ie_exqos *, struct unicx *);
+static int uni_ie_decode_net_exqos(struct uni_ie_exqos *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_exqos = {
+ 0,
+ 25,
+ (uni_print_f)uni_ie_print_net_exqos,
+ (uni_check_f)uni_ie_check_net_exqos,
+ (uni_encode_f)uni_ie_encode_net_exqos,
+ (uni_decode_f)uni_ie_decode_net_exqos
+};
+
+static void uni_ie_print_net_mdcr(struct uni_ie_mdcr *, struct unicx *);
+static int uni_ie_check_net_mdcr(struct uni_ie_mdcr *, struct unicx *);
+static int uni_ie_encode_net_mdcr(struct uni_msg *, struct uni_ie_mdcr *, struct unicx *);
+static int uni_ie_decode_net_mdcr(struct uni_ie_mdcr *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_net_mdcr = {
+ 0,
+ 13,
+ (uni_print_f)uni_ie_print_net_mdcr,
+ (uni_check_f)uni_ie_check_net_mdcr,
+ (uni_encode_f)uni_ie_encode_net_mdcr,
+ (uni_decode_f)uni_ie_decode_net_mdcr
+};
+
+static void uni_ie_print_itu_unrec(struct uni_ie_unrec *, struct unicx *);
+static int uni_ie_check_itu_unrec(struct uni_ie_unrec *, struct unicx *);
+static int uni_ie_encode_itu_unrec(struct uni_msg *, struct uni_ie_unrec *, struct unicx *);
+static int uni_ie_decode_itu_unrec(struct uni_ie_unrec *, struct uni_msg *, u_int, struct unicx *);
+
+static struct iedecl decl_itu_unrec = {
+ 0,
+ 128,
+ (uni_print_f)uni_ie_print_itu_unrec,
+ (uni_check_f)uni_ie_check_itu_unrec,
+ (uni_encode_f)uni_ie_encode_itu_unrec,
+ (uni_decode_f)uni_ie_decode_itu_unrec
+};
+
+const struct iedecl *uni_ietable[256][4] = {
+ { NULL, NULL, NULL, NULL, }, /* 0x00 */
+ { NULL, NULL, NULL, NULL, }, /* 0x01 */
+ { NULL, NULL, NULL, NULL, }, /* 0x02 */
+ { NULL, NULL, NULL, NULL, }, /* 0x03 */
+ { NULL, NULL, NULL, NULL, }, /* 0x04 */
+ { NULL, NULL, NULL, NULL, }, /* 0x05 */
+ { NULL, NULL, NULL, NULL, }, /* 0x06 */
+ { NULL, NULL, NULL, NULL, }, /* 0x07 */
+ { &decl_itu_cause, NULL, NULL, &decl_net_cause, }, /* 0x08 */
+ { NULL, NULL, NULL, NULL, }, /* 0x09 */
+ { NULL, NULL, NULL, NULL, }, /* 0x0a */
+ { NULL, NULL, NULL, NULL, }, /* 0x0b */
+ { NULL, NULL, NULL, NULL, }, /* 0x0c */
+ { NULL, NULL, NULL, NULL, }, /* 0x0d */
+ { NULL, NULL, NULL, NULL, }, /* 0x0e */
+ { NULL, NULL, NULL, NULL, }, /* 0x0f */
+ { NULL, NULL, NULL, NULL, }, /* 0x10 */
+ { NULL, NULL, NULL, NULL, }, /* 0x11 */
+ { NULL, NULL, NULL, NULL, }, /* 0x12 */
+ { NULL, NULL, NULL, NULL, }, /* 0x13 */
+ { &decl_itu_callstate, NULL, NULL, NULL, }, /* 0x14 */
+ { NULL, NULL, NULL, NULL, }, /* 0x15 */
+ { NULL, NULL, NULL, NULL, }, /* 0x16 */
+ { NULL, NULL, NULL, NULL, }, /* 0x17 */
+ { NULL, NULL, NULL, NULL, }, /* 0x18 */
+ { NULL, NULL, NULL, NULL, }, /* 0x19 */
+ { NULL, NULL, NULL, NULL, }, /* 0x1a */
+ { NULL, NULL, NULL, NULL, }, /* 0x1b */
+ { &decl_itu_facility, NULL, NULL, NULL, }, /* 0x1c */
+ { NULL, NULL, NULL, NULL, }, /* 0x1d */
+ { NULL, NULL, NULL, NULL, }, /* 0x1e */
+ { NULL, NULL, NULL, NULL, }, /* 0x1f */
+ { NULL, NULL, NULL, NULL, }, /* 0x20 */
+ { NULL, NULL, NULL, NULL, }, /* 0x21 */
+ { NULL, NULL, NULL, NULL, }, /* 0x22 */
+ { NULL, NULL, NULL, NULL, }, /* 0x23 */
+ { NULL, NULL, NULL, NULL, }, /* 0x24 */
+ { NULL, NULL, NULL, NULL, }, /* 0x25 */
+ { NULL, NULL, NULL, NULL, }, /* 0x26 */
+ { &decl_itu_notify, NULL, NULL, NULL, }, /* 0x27 */
+ { NULL, NULL, NULL, NULL, }, /* 0x28 */
+ { NULL, NULL, NULL, NULL, }, /* 0x29 */
+ { NULL, NULL, NULL, NULL, }, /* 0x2a */
+ { NULL, NULL, NULL, NULL, }, /* 0x2b */
+ { NULL, NULL, NULL, NULL, }, /* 0x2c */
+ { NULL, NULL, NULL, NULL, }, /* 0x2d */
+ { NULL, NULL, NULL, NULL, }, /* 0x2e */
+ { NULL, NULL, NULL, NULL, }, /* 0x2f */
+ { NULL, NULL, NULL, NULL, }, /* 0x30 */
+ { NULL, NULL, NULL, NULL, }, /* 0x31 */
+ { NULL, NULL, NULL, NULL, }, /* 0x32 */
+ { NULL, NULL, NULL, NULL, }, /* 0x33 */
+ { NULL, NULL, NULL, NULL, }, /* 0x34 */
+ { NULL, NULL, NULL, NULL, }, /* 0x35 */
+ { NULL, NULL, NULL, NULL, }, /* 0x36 */
+ { NULL, NULL, NULL, NULL, }, /* 0x37 */
+ { NULL, NULL, NULL, NULL, }, /* 0x38 */
+ { NULL, NULL, NULL, NULL, }, /* 0x39 */
+ { NULL, NULL, NULL, NULL, }, /* 0x3a */
+ { NULL, NULL, NULL, NULL, }, /* 0x3b */
+ { NULL, NULL, NULL, NULL, }, /* 0x3c */
+ { NULL, NULL, NULL, NULL, }, /* 0x3d */
+ { NULL, NULL, NULL, NULL, }, /* 0x3e */
+ { NULL, NULL, NULL, NULL, }, /* 0x3f */
+ { NULL, NULL, NULL, NULL, }, /* 0x40 */
+ { NULL, NULL, NULL, NULL, }, /* 0x41 */
+ { &decl_itu_eetd, NULL, NULL, &decl_net_eetd, }, /* 0x42 */
+ { NULL, NULL, NULL, NULL, }, /* 0x43 */
+ { NULL, NULL, NULL, NULL, }, /* 0x44 */
+ { NULL, NULL, NULL, NULL, }, /* 0x45 */
+ { NULL, NULL, NULL, NULL, }, /* 0x46 */
+ { NULL, NULL, NULL, NULL, }, /* 0x47 */
+ { NULL, NULL, NULL, NULL, }, /* 0x48 */
+ { NULL, NULL, NULL, NULL, }, /* 0x49 */
+ { NULL, NULL, NULL, NULL, }, /* 0x4a */
+ { NULL, NULL, NULL, NULL, }, /* 0x4b */
+ { &decl_itu_conned, NULL, NULL, NULL, }, /* 0x4c */
+ { &decl_itu_connedsub, NULL, NULL, NULL, }, /* 0x4d */
+ { NULL, NULL, NULL, NULL, }, /* 0x4e */
+ { NULL, NULL, NULL, NULL, }, /* 0x4f */
+ { NULL, NULL, NULL, NULL, }, /* 0x50 */
+ { NULL, NULL, NULL, NULL, }, /* 0x51 */
+ { NULL, NULL, NULL, NULL, }, /* 0x52 */
+ { NULL, NULL, NULL, NULL, }, /* 0x53 */
+ { &decl_itu_epref, NULL, NULL, NULL, }, /* 0x54 */
+ { &decl_itu_epstate, NULL, NULL, NULL, }, /* 0x55 */
+ { NULL, NULL, NULL, NULL, }, /* 0x56 */
+ { NULL, NULL, NULL, NULL, }, /* 0x57 */
+ { &decl_itu_aal, NULL, NULL, NULL, }, /* 0x58 */
+ { &decl_itu_traffic, NULL, NULL, &decl_net_traffic, }, /* 0x59 */
+ { &decl_itu_connid, NULL, NULL, NULL, }, /* 0x5a */
+ { NULL, NULL, NULL, NULL, }, /* 0x5b */
+ { &decl_itu_qos, NULL, NULL, &decl_net_qos, }, /* 0x5c */
+ { &decl_itu_bhli, NULL, NULL, NULL, }, /* 0x5d */
+ { &decl_itu_bearer, NULL, NULL, NULL, }, /* 0x5e */
+ { &decl_itu_blli, NULL, NULL, NULL, }, /* 0x5f */
+ { &decl_itu_lshift, NULL, NULL, NULL, }, /* 0x60 */
+ { &decl_itu_nlshift, NULL, NULL, NULL, }, /* 0x61 */
+ { &decl_itu_scompl, NULL, NULL, NULL, }, /* 0x62 */
+ { &decl_itu_repeat, NULL, NULL, NULL, }, /* 0x63 */
+ { NULL, NULL, NULL, NULL, }, /* 0x64 */
+ { NULL, NULL, NULL, NULL, }, /* 0x65 */
+ { NULL, NULL, NULL, NULL, }, /* 0x66 */
+ { NULL, NULL, NULL, NULL, }, /* 0x67 */
+ { NULL, NULL, NULL, NULL, }, /* 0x68 */
+ { NULL, NULL, NULL, NULL, }, /* 0x69 */
+ { NULL, NULL, NULL, NULL, }, /* 0x6a */
+ { NULL, NULL, NULL, NULL, }, /* 0x6b */
+ { &decl_itu_calling, NULL, NULL, NULL, }, /* 0x6c */
+ { &decl_itu_callingsub, NULL, NULL, NULL, }, /* 0x6d */
+ { NULL, NULL, NULL, NULL, }, /* 0x6e */
+ { NULL, NULL, NULL, NULL, }, /* 0x6f */
+ { &decl_itu_called, NULL, NULL, NULL, }, /* 0x70 */
+ { &decl_itu_calledsub, NULL, NULL, NULL, }, /* 0x71 */
+ { NULL, NULL, NULL, NULL, }, /* 0x72 */
+ { NULL, NULL, NULL, NULL, }, /* 0x73 */
+ { NULL, NULL, NULL, NULL, }, /* 0x74 */
+ { NULL, NULL, NULL, NULL, }, /* 0x75 */
+ { NULL, NULL, NULL, NULL, }, /* 0x76 */
+ { NULL, NULL, NULL, NULL, }, /* 0x77 */
+ { &decl_itu_tns, NULL, NULL, &decl_net_tns, }, /* 0x78 */
+ { &decl_itu_restart, NULL, NULL, NULL, }, /* 0x79 */
+ { NULL, NULL, NULL, NULL, }, /* 0x7a */
+ { NULL, NULL, NULL, NULL, }, /* 0x7b */
+ { NULL, NULL, NULL, NULL, }, /* 0x7c */
+ { NULL, NULL, NULL, NULL, }, /* 0x7d */
+ { &decl_itu_uu, NULL, NULL, NULL, }, /* 0x7e */
+ { NULL, NULL, NULL, &decl_net_git, }, /* 0x7f */
+ { NULL, NULL, NULL, NULL, }, /* 0x80 */
+ { &decl_itu_mintraffic, NULL, NULL, &decl_net_mintraffic, }, /* 0x81 */
+ { &decl_itu_atraffic, NULL, NULL, &decl_net_atraffic, }, /* 0x82 */
+ { NULL, NULL, NULL, NULL, }, /* 0x83 */
+ { NULL, NULL, NULL, &decl_net_abrsetup, }, /* 0x84 */
+ { NULL, NULL, NULL, NULL, }, /* 0x85 */
+ { NULL, NULL, NULL, NULL, }, /* 0x86 */
+ { NULL, NULL, NULL, NULL, }, /* 0x87 */
+ { NULL, NULL, NULL, NULL, }, /* 0x88 */
+ { &decl_itu_report, NULL, NULL, NULL, }, /* 0x89 */
+ { NULL, NULL, NULL, NULL, }, /* 0x8a */
+ { NULL, NULL, NULL, NULL, }, /* 0x8b */
+ { NULL, NULL, NULL, NULL, }, /* 0x8c */
+ { NULL, NULL, NULL, NULL, }, /* 0x8d */
+ { NULL, NULL, NULL, NULL, }, /* 0x8e */
+ { NULL, NULL, NULL, NULL, }, /* 0x8f */
+ { NULL, NULL, NULL, NULL, }, /* 0x90 */
+ { NULL, NULL, NULL, NULL, }, /* 0x91 */
+ { NULL, NULL, NULL, NULL, }, /* 0x92 */
+ { NULL, NULL, NULL, NULL, }, /* 0x93 */
+ { NULL, NULL, NULL, NULL, }, /* 0x94 */
+ { NULL, NULL, NULL, NULL, }, /* 0x95 */
+ { NULL, NULL, NULL, NULL, }, /* 0x96 */
+ { NULL, NULL, NULL, NULL, }, /* 0x97 */
+ { NULL, NULL, NULL, NULL, }, /* 0x98 */
+ { NULL, NULL, NULL, NULL, }, /* 0x99 */
+ { NULL, NULL, NULL, NULL, }, /* 0x9a */
+ { NULL, NULL, NULL, NULL, }, /* 0x9b */
+ { NULL, NULL, NULL, NULL, }, /* 0x9c */
+ { NULL, NULL, NULL, NULL, }, /* 0x9d */
+ { NULL, NULL, NULL, NULL, }, /* 0x9e */
+ { NULL, NULL, NULL, NULL, }, /* 0x9f */
+ { NULL, NULL, NULL, NULL, }, /* 0xa0 */
+ { NULL, NULL, NULL, NULL, }, /* 0xa1 */
+ { NULL, NULL, NULL, NULL, }, /* 0xa2 */
+ { NULL, NULL, NULL, NULL, }, /* 0xa3 */
+ { NULL, NULL, NULL, NULL, }, /* 0xa4 */
+ { NULL, NULL, NULL, NULL, }, /* 0xa5 */
+ { NULL, NULL, NULL, NULL, }, /* 0xa6 */
+ { NULL, NULL, NULL, NULL, }, /* 0xa7 */
+ { NULL, NULL, NULL, NULL, }, /* 0xa8 */
+ { NULL, NULL, NULL, NULL, }, /* 0xa9 */
+ { NULL, NULL, NULL, NULL, }, /* 0xaa */
+ { NULL, NULL, NULL, NULL, }, /* 0xab */
+ { NULL, NULL, NULL, NULL, }, /* 0xac */
+ { NULL, NULL, NULL, NULL, }, /* 0xad */
+ { NULL, NULL, NULL, NULL, }, /* 0xae */
+ { NULL, NULL, NULL, NULL, }, /* 0xaf */
+ { NULL, NULL, NULL, NULL, }, /* 0xb0 */
+ { NULL, NULL, NULL, NULL, }, /* 0xb1 */
+ { NULL, NULL, NULL, NULL, }, /* 0xb2 */
+ { NULL, NULL, NULL, NULL, }, /* 0xb3 */
+ { NULL, NULL, NULL, NULL, }, /* 0xb4 */
+ { NULL, NULL, NULL, NULL, }, /* 0xb5 */
+ { NULL, NULL, NULL, NULL, }, /* 0xb6 */
+ { NULL, NULL, NULL, NULL, }, /* 0xb7 */
+ { NULL, NULL, NULL, NULL, }, /* 0xb8 */
+ { NULL, NULL, NULL, NULL, }, /* 0xb9 */
+ { NULL, NULL, NULL, NULL, }, /* 0xba */
+ { NULL, NULL, NULL, NULL, }, /* 0xbb */
+ { NULL, NULL, NULL, NULL, }, /* 0xbc */
+ { NULL, NULL, NULL, NULL, }, /* 0xbd */
+ { NULL, NULL, NULL, NULL, }, /* 0xbe */
+ { NULL, NULL, NULL, NULL, }, /* 0xbf */
+ { NULL, NULL, NULL, NULL, }, /* 0xc0 */
+ { NULL, NULL, NULL, NULL, }, /* 0xc1 */
+ { NULL, NULL, NULL, NULL, }, /* 0xc2 */
+ { NULL, NULL, NULL, NULL, }, /* 0xc3 */
+ { NULL, NULL, NULL, NULL, }, /* 0xc4 */
+ { NULL, NULL, NULL, NULL, }, /* 0xc5 */
+ { NULL, NULL, NULL, NULL, }, /* 0xc6 */
+ { NULL, NULL, NULL, NULL, }, /* 0xc7 */
+ { NULL, NULL, NULL, NULL, }, /* 0xc8 */
+ { NULL, NULL, NULL, NULL, }, /* 0xc9 */
+ { NULL, NULL, NULL, NULL, }, /* 0xca */
+ { NULL, NULL, NULL, NULL, }, /* 0xcb */
+ { NULL, NULL, NULL, NULL, }, /* 0xcc */
+ { NULL, NULL, NULL, NULL, }, /* 0xcd */
+ { NULL, NULL, NULL, NULL, }, /* 0xce */
+ { NULL, NULL, NULL, NULL, }, /* 0xcf */
+ { NULL, NULL, NULL, NULL, }, /* 0xd0 */
+ { NULL, NULL, NULL, NULL, }, /* 0xd1 */
+ { NULL, NULL, NULL, NULL, }, /* 0xd2 */
+ { NULL, NULL, NULL, NULL, }, /* 0xd3 */
+ { NULL, NULL, NULL, NULL, }, /* 0xd4 */
+ { NULL, NULL, NULL, NULL, }, /* 0xd5 */
+ { NULL, NULL, NULL, NULL, }, /* 0xd6 */
+ { NULL, NULL, NULL, NULL, }, /* 0xd7 */
+ { NULL, NULL, NULL, NULL, }, /* 0xd8 */
+ { NULL, NULL, NULL, NULL, }, /* 0xd9 */
+ { NULL, NULL, NULL, NULL, }, /* 0xda */
+ { NULL, NULL, NULL, NULL, }, /* 0xdb */
+ { NULL, NULL, NULL, NULL, }, /* 0xdc */
+ { NULL, NULL, NULL, NULL, }, /* 0xdd */
+ { NULL, NULL, NULL, NULL, }, /* 0xde */
+ { NULL, NULL, NULL, NULL, }, /* 0xdf */
+ { NULL, NULL, NULL, &decl_net_called_soft, }, /* 0xe0 */
+ { NULL, NULL, NULL, &decl_net_crankback, }, /* 0xe1 */
+ { NULL, NULL, NULL, &decl_net_dtl, }, /* 0xe2 */
+ { NULL, NULL, NULL, &decl_net_calling_soft, }, /* 0xe3 */
+ { NULL, NULL, NULL, &decl_net_abradd, }, /* 0xe4 */
+ { NULL, NULL, NULL, NULL, }, /* 0xe5 */
+ { NULL, NULL, NULL, NULL, }, /* 0xe6 */
+ { NULL, NULL, NULL, NULL, }, /* 0xe7 */
+ { NULL, NULL, NULL, &decl_net_lij_callid, }, /* 0xe8 */
+ { NULL, NULL, NULL, &decl_net_lij_param, }, /* 0xe9 */
+ { NULL, NULL, NULL, &decl_net_lij_seqno, }, /* 0xea */
+ { NULL, NULL, NULL, &decl_net_cscope, }, /* 0xeb */
+ { NULL, NULL, NULL, &decl_net_exqos, }, /* 0xec */
+ { NULL, NULL, NULL, NULL, }, /* 0xed */
+ { NULL, NULL, NULL, NULL, }, /* 0xee */
+ { NULL, NULL, NULL, NULL, }, /* 0xef */
+ { NULL, NULL, NULL, &decl_net_mdcr, }, /* 0xf0 */
+ { NULL, NULL, NULL, NULL, }, /* 0xf1 */
+ { NULL, NULL, NULL, NULL, }, /* 0xf2 */
+ { NULL, NULL, NULL, NULL, }, /* 0xf3 */
+ { NULL, NULL, NULL, NULL, }, /* 0xf4 */
+ { NULL, NULL, NULL, NULL, }, /* 0xf5 */
+ { NULL, NULL, NULL, NULL, }, /* 0xf6 */
+ { NULL, NULL, NULL, NULL, }, /* 0xf7 */
+ { NULL, NULL, NULL, NULL, }, /* 0xf8 */
+ { NULL, NULL, NULL, NULL, }, /* 0xf9 */
+ { NULL, NULL, NULL, NULL, }, /* 0xfa */
+ { NULL, NULL, NULL, NULL, }, /* 0xfb */
+ { NULL, NULL, NULL, NULL, }, /* 0xfc */
+ { NULL, NULL, NULL, NULL, }, /* 0xfd */
+ { &decl_itu_unrec, NULL, NULL, NULL, }, /* 0xfe */
+ { NULL, NULL, NULL, NULL, }, /* 0xff */
+};
diff --git a/sys/contrib/ngatm/netnatm/msg/uni_msg.c b/sys/contrib/ngatm/netnatm/msg/uni_msg.c
new file mode 100644
index 0000000..f999185
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/uni_msg.c
@@ -0,0 +1,4901 @@
+/* This file was created automatically
+ * Source file: $Begemot: libunimsg/atm/msg/msg.def,v 1.3 2003/09/19 11:58:15 hbb Exp $
+ * $FreeBSD$
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+
+#ifdef _KERNEL
+#include <sys/libkern.h>
+#else
+#include <string.h>
+#endif
+#include <netnatm/unimsg.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/msg/priv.h>
+#include <netnatm/msg/privmsg.c>
+
+static void
+print_alerting(struct uni_alerting *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->connid.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ if(msg->report.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_REPORT, (union uni_ieall *)&msg->report, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_alerting(struct uni_alerting *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->connid);
+ else
+ ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->report);
+ else
+ ret |= uni_check_ie(UNI_IE_REPORT, (union uni_ieall *)&m->report, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_alerting(struct uni_msg *msg, struct uni_alerting *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_ALERTING, cx, &mlen))
+ return (-2);
+
+ if((p->connid.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
+ return (UNI_IE_CONNID);
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ if((p->report.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_REPORT, msg, (union uni_ieall *)&p->report, cx))
+ return (UNI_IE_REPORT);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_alerting(struct uni_alerting *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_CONNID:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->connid.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_REPORT:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->report.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_REPORT, (union uni_ieall *)&out->report, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_alerting = {
+ 0,
+ "alerting",
+ (uni_msg_print_f)print_alerting,
+ (uni_msg_check_f)check_alerting,
+ (uni_msg_encode_f)encode_alerting,
+ (uni_msg_decode_f)decode_alerting
+};
+
+static void
+print_call_proc(struct uni_call_proc *msg, struct unicx *cx)
+{
+ if(msg->connid.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_call_proc(struct uni_call_proc *m, struct unicx *cx)
+{
+ int ret = 0;
+
+ ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->notify);
+ else
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_call_proc(struct uni_msg *msg, struct uni_call_proc *p, struct unicx *cx)
+{
+ u_int mlen;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_CALL_PROC, cx, &mlen))
+ return (-2);
+
+ if((p->connid.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
+ return (UNI_IE_CONNID);
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_call_proc(struct uni_call_proc *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ switch (ie) {
+
+ case UNI_IE_CONNID:
+ out->connid.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_call_proc = {
+ 0,
+ "call_proc",
+ (uni_msg_print_f)print_call_proc,
+ (uni_msg_check_f)check_call_proc,
+ (uni_msg_encode_f)encode_call_proc,
+ (uni_msg_decode_f)decode_call_proc
+};
+
+static void
+print_connect(struct uni_connect *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->aal.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_AAL, (union uni_ieall *)&msg->aal, cx);
+ if(msg->blli.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_BLLI, (union uni_ieall *)&msg->blli, cx);
+ if(msg->connid.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->conned.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CONNED, (union uni_ieall *)&msg->conned, cx);
+ if(msg->connedsub.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CONNEDSUB, (union uni_ieall *)&msg->connedsub, cx);
+ if(msg->eetd.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EETD, (union uni_ieall *)&msg->eetd, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ if(msg->traffic.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_TRAFFIC, (union uni_ieall *)&msg->traffic, cx);
+ if(msg->exqos.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EXQOS, (union uni_ieall *)&msg->exqos, cx);
+ if(msg->facility.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_FACILITY, (union uni_ieall *)&msg->facility, cx);
+ if(msg->abrsetup.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_ABRSETUP, (union uni_ieall *)&msg->abrsetup, cx);
+ if(msg->abradd.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_ABRADD, (union uni_ieall *)&msg->abradd, cx);
+ if(msg->called_soft.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLED_SOFT, (union uni_ieall *)&msg->called_soft, cx);
+ if(msg->report.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_REPORT, (union uni_ieall *)&msg->report, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_connect(struct uni_connect *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_AAL, (union uni_ieall *)&m->aal, cx);
+ ret |= uni_check_ie(UNI_IE_BLLI, (union uni_ieall *)&m->blli, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->connid);
+ else
+ ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ ret |= uni_check_ie(UNI_IE_CONNED, (union uni_ieall *)&m->conned, cx);
+ ret |= uni_check_ie(UNI_IE_CONNEDSUB, (union uni_ieall *)&m->connedsub, cx);
+ ret |= uni_check_ie(UNI_IE_EETD, (union uni_ieall *)&m->eetd, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ ret |= uni_check_ie(UNI_IE_TRAFFIC, (union uni_ieall *)&m->traffic, cx);
+ ret |= uni_check_ie(UNI_IE_EXQOS, (union uni_ieall *)&m->exqos, cx);
+ if(!(cx->q2932))
+ ret |= IE_ISPRESENT(m->facility);
+ else
+ ret |= uni_check_ie(UNI_IE_FACILITY, (union uni_ieall *)&m->facility, cx);
+ ret |= uni_check_ie(UNI_IE_ABRSETUP, (union uni_ieall *)&m->abrsetup, cx);
+ ret |= uni_check_ie(UNI_IE_ABRADD, (union uni_ieall *)&m->abradd, cx);
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->called_soft);
+ else
+ ret |= uni_check_ie(UNI_IE_CALLED_SOFT, (union uni_ieall *)&m->called_soft, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->report);
+ else
+ ret |= uni_check_ie(UNI_IE_REPORT, (union uni_ieall *)&m->report, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_connect(struct uni_msg *msg, struct uni_connect *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_CONNECT, cx, &mlen))
+ return (-2);
+
+ if((p->aal.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_AAL, msg, (union uni_ieall *)&p->aal, cx))
+ return (UNI_IE_AAL);
+ if((p->blli.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_BLLI, msg, (union uni_ieall *)&p->blli, cx))
+ return (UNI_IE_BLLI);
+ if((p->connid.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
+ return (UNI_IE_CONNID);
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->conned.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CONNED, msg, (union uni_ieall *)&p->conned, cx))
+ return (UNI_IE_CONNED);
+ if((p->connedsub.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CONNEDSUB, msg, (union uni_ieall *)&p->connedsub, cx))
+ return (UNI_IE_CONNEDSUB);
+ if((p->eetd.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EETD, msg, (union uni_ieall *)&p->eetd, cx))
+ return (UNI_IE_EETD);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ if((p->traffic.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_TRAFFIC, msg, (union uni_ieall *)&p->traffic, cx))
+ return (UNI_IE_TRAFFIC);
+ if((p->exqos.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EXQOS, msg, (union uni_ieall *)&p->exqos, cx))
+ return (UNI_IE_EXQOS);
+ if((p->facility.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_FACILITY, msg, (union uni_ieall *)&p->facility, cx))
+ return (UNI_IE_FACILITY);
+ if((p->abrsetup.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_ABRSETUP, msg, (union uni_ieall *)&p->abrsetup, cx))
+ return (UNI_IE_ABRSETUP);
+ if((p->abradd.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_ABRADD, msg, (union uni_ieall *)&p->abradd, cx))
+ return (UNI_IE_ABRADD);
+ if((p->called_soft.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLED_SOFT, msg, (union uni_ieall *)&p->called_soft, cx))
+ return (UNI_IE_CALLED_SOFT);
+ if((p->report.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_REPORT, msg, (union uni_ieall *)&p->report, cx))
+ return (UNI_IE_REPORT);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_connect(struct uni_connect *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_AAL:
+ out->aal.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_AAL, (union uni_ieall *)&out->aal, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_BLLI:
+ out->blli.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_BLLI, (union uni_ieall *)&out->blli, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CONNID:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->connid.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CONNED:
+ out->conned.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CONNED, (union uni_ieall *)&out->conned, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CONNEDSUB:
+ out->connedsub.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CONNEDSUB, (union uni_ieall *)&out->connedsub, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EETD:
+ out->eetd.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EETD, (union uni_ieall *)&out->eetd, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_TRAFFIC:
+ out->traffic.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_TRAFFIC, (union uni_ieall *)&out->traffic, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EXQOS:
+ out->exqos.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EXQOS, (union uni_ieall *)&out->exqos, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_FACILITY:
+ if (!(cx->q2932))
+ return (DEC_ILL);
+ out->facility.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_FACILITY, (union uni_ieall *)&out->facility, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_ABRSETUP:
+ out->abrsetup.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_ABRSETUP, (union uni_ieall *)&out->abrsetup, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_ABRADD:
+ out->abradd.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_ABRADD, (union uni_ieall *)&out->abradd, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLED_SOFT:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ out->called_soft.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLED_SOFT, (union uni_ieall *)&out->called_soft, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_REPORT:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->report.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_REPORT, (union uni_ieall *)&out->report, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_connect = {
+ 0,
+ "connect",
+ (uni_msg_print_f)print_connect,
+ (uni_msg_check_f)check_connect,
+ (uni_msg_encode_f)encode_connect,
+ (uni_msg_decode_f)decode_connect
+};
+
+static void
+print_connect_ack(struct uni_connect_ack *msg, struct unicx *cx)
+{
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_connect_ack(struct uni_connect_ack *m, struct unicx *cx)
+{
+ int ret = 0;
+
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_connect_ack(struct uni_msg *msg, struct uni_connect_ack *p, struct unicx *cx)
+{
+ u_int mlen;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_CONNECT_ACK, cx, &mlen))
+ return (-2);
+
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_connect_ack(struct uni_connect_ack *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ switch (ie) {
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_connect_ack = {
+ 0,
+ "connect_ack",
+ (uni_msg_print_f)print_connect_ack,
+ (uni_msg_check_f)check_connect_ack,
+ (uni_msg_encode_f)encode_connect_ack,
+ (uni_msg_decode_f)decode_connect_ack
+};
+
+static void
+print_release(struct uni_release *msg, struct unicx *cx)
+{
+ u_int i;
+
+ for(i = 0; i < 2; i++)
+ if(msg->cause[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause[i], cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ if(msg->facility.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_FACILITY, (union uni_ieall *)&msg->facility, cx);
+ if(msg->crankback.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CRANKBACK, (union uni_ieall *)&msg->crankback, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_release(struct uni_release *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ for(i = 0; i < 2 ; i++) {
+ ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ if(!(cx->q2932))
+ ret |= IE_ISPRESENT(m->facility);
+ else
+ ret |= uni_check_ie(UNI_IE_FACILITY, (union uni_ieall *)&m->facility, cx);
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->crankback);
+ else
+ ret |= uni_check_ie(UNI_IE_CRANKBACK, (union uni_ieall *)&m->crankback, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_release(struct uni_msg *msg, struct uni_release *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_RELEASE, cx, &mlen))
+ return (-2);
+
+ for(i = 0; i < 2; i++)
+ if((p->cause[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause[i], cx))
+ return ((i << 16) + UNI_IE_CAUSE);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ if((p->facility.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_FACILITY, msg, (union uni_ieall *)&p->facility, cx))
+ return (UNI_IE_FACILITY);
+ if((p->crankback.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CRANKBACK, msg, (union uni_ieall *)&p->crankback, cx))
+ return (UNI_IE_CRANKBACK);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_release(struct uni_release *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_CAUSE:
+ for(i = 0; i < 2; i++)
+ if (!IE_ISPRESENT(out->cause[i])) {
+ out->cause[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_FACILITY:
+ if (!(cx->q2932))
+ return (DEC_ILL);
+ out->facility.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_FACILITY, (union uni_ieall *)&out->facility, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CRANKBACK:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ out->crankback.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CRANKBACK, (union uni_ieall *)&out->crankback, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_release = {
+ 0,
+ "release",
+ (uni_msg_print_f)print_release,
+ (uni_msg_check_f)check_release,
+ (uni_msg_encode_f)encode_release,
+ (uni_msg_decode_f)decode_release
+};
+
+static void
+print_release_compl(struct uni_release_compl *msg, struct unicx *cx)
+{
+ u_int i;
+
+ for(i = 0; i < 2; i++)
+ if(msg->cause[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause[i], cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ if(msg->crankback.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CRANKBACK, (union uni_ieall *)&msg->crankback, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_release_compl(struct uni_release_compl *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ for(i = 0; i < 2 ; i++) {
+ ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause[i], cx);
+ }
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->git[i]);
+ else
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->crankback);
+ else
+ ret |= uni_check_ie(UNI_IE_CRANKBACK, (union uni_ieall *)&m->crankback, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_release_compl(struct uni_msg *msg, struct uni_release_compl *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_RELEASE_COMPL, cx, &mlen))
+ return (-2);
+
+ for(i = 0; i < 2; i++)
+ if((p->cause[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause[i], cx))
+ return ((i << 16) + UNI_IE_CAUSE);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ if((p->crankback.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CRANKBACK, msg, (union uni_ieall *)&p->crankback, cx))
+ return (UNI_IE_CRANKBACK);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_release_compl(struct uni_release_compl *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_CAUSE:
+ for(i = 0; i < 2; i++)
+ if (!IE_ISPRESENT(out->cause[i])) {
+ out->cause[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_GIT:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CRANKBACK:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ out->crankback.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CRANKBACK, (union uni_ieall *)&out->crankback, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_release_compl = {
+ 0,
+ "release_compl",
+ (uni_msg_print_f)print_release_compl,
+ (uni_msg_check_f)check_release_compl,
+ (uni_msg_encode_f)encode_release_compl,
+ (uni_msg_decode_f)decode_release_compl
+};
+
+static void
+print_setup(struct uni_setup *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->aal.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_AAL, (union uni_ieall *)&msg->aal, cx);
+ if(msg->traffic.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_TRAFFIC, (union uni_ieall *)&msg->traffic, cx);
+ if(msg->bearer.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_BEARER, (union uni_ieall *)&msg->bearer, cx);
+ if(msg->bhli.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_BHLI, (union uni_ieall *)&msg->bhli, cx);
+ if(msg->blli_repeat.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_REPEAT, (union uni_ieall *)&msg->blli_repeat, cx);
+ for(i = 0; i < UNI_NUM_IE_BLLI; i++)
+ if(msg->blli[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_BLLI, (union uni_ieall *)&msg->blli[i], cx);
+ if(msg->called.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
+ if(msg->calledsub[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub[i], cx);
+ if(msg->calling.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLING, (union uni_ieall *)&msg->calling, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
+ if(msg->callingsub[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLINGSUB, (union uni_ieall *)&msg->callingsub[i], cx);
+ if(msg->connid.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
+ if(msg->qos.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_QOS, (union uni_ieall *)&msg->qos, cx);
+ if(msg->eetd.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EETD, (union uni_ieall *)&msg->eetd, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->scompl.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_SCOMPL, (union uni_ieall *)&msg->scompl, cx);
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if(msg->tns[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_TNS, (union uni_ieall *)&msg->tns[i], cx);
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->atraffic.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_ATRAFFIC, (union uni_ieall *)&msg->atraffic, cx);
+ if(msg->mintraffic.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_MINTRAFFIC, (union uni_ieall *)&msg->mintraffic, cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->lij_callid.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_LIJ_CALLID, (union uni_ieall *)&msg->lij_callid, cx);
+ if(msg->lij_param.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_LIJ_PARAM, (union uni_ieall *)&msg->lij_param, cx);
+ if(msg->lij_seqno.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&msg->lij_seqno, cx);
+ if(msg->exqos.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EXQOS, (union uni_ieall *)&msg->exqos, cx);
+ if(msg->abrsetup.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_ABRSETUP, (union uni_ieall *)&msg->abrsetup, cx);
+ if(msg->abradd.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_ABRADD, (union uni_ieall *)&msg->abradd, cx);
+ if(msg->cscope.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CSCOPE, (union uni_ieall *)&msg->cscope, cx);
+ if(msg->calling_soft.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLING_SOFT, (union uni_ieall *)&msg->calling_soft, cx);
+ if(msg->called_soft.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLED_SOFT, (union uni_ieall *)&msg->called_soft, cx);
+ if(msg->dtl_repeat.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_REPEAT, (union uni_ieall *)&msg->dtl_repeat, cx);
+ for(i = 0; i < UNI_NUM_IE_DTL; i++)
+ if(msg->dtl[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_DTL, (union uni_ieall *)&msg->dtl[i], cx);
+ if(msg->report.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_REPORT, (union uni_ieall *)&msg->report, cx);
+ if(msg->mdcr.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_MDCR, (union uni_ieall *)&msg->mdcr, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_setup(struct uni_setup *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_AAL, (union uni_ieall *)&m->aal, cx);
+ ret |= uni_check_ie(UNI_IE_TRAFFIC, (union uni_ieall *)&m->traffic, cx);
+ ret |= uni_check_ie(UNI_IE_BEARER, (union uni_ieall *)&m->bearer, cx);
+ ret |= uni_check_ie(UNI_IE_BHLI, (union uni_ieall *)&m->bhli, cx);
+ ret |= uni_check_ie(UNI_IE_REPEAT, (union uni_ieall *)&m->blli_repeat, cx);
+ for(i = 0; i < UNI_NUM_IE_BLLI ; i++) {
+ ret |= uni_check_ie(UNI_IE_BLLI, (union uni_ieall *)&m->blli[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB ; i++) {
+ ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_CALLING, (union uni_ieall *)&m->calling, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB ; i++) {
+ ret |= uni_check_ie(UNI_IE_CALLINGSUB, (union uni_ieall *)&m->callingsub[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
+ ret |= uni_check_ie(UNI_IE_QOS, (union uni_ieall *)&m->qos, cx);
+ ret |= uni_check_ie(UNI_IE_EETD, (union uni_ieall *)&m->eetd, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->scompl);
+ else
+ ret |= uni_check_ie(UNI_IE_SCOMPL, (union uni_ieall *)&m->scompl, cx);
+ for(i = 0; i < UNI_NUM_IE_TNS ; i++) {
+ ret |= uni_check_ie(UNI_IE_TNS, (union uni_ieall *)&m->tns[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_ATRAFFIC, (union uni_ieall *)&m->atraffic, cx);
+ ret |= uni_check_ie(UNI_IE_MINTRAFFIC, (union uni_ieall *)&m->mintraffic, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->lij_callid);
+ else
+ ret |= uni_check_ie(UNI_IE_LIJ_CALLID, (union uni_ieall *)&m->lij_callid, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->lij_param);
+ else
+ ret |= uni_check_ie(UNI_IE_LIJ_PARAM, (union uni_ieall *)&m->lij_param, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->lij_seqno);
+ else
+ ret |= uni_check_ie(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&m->lij_seqno, cx);
+ ret |= uni_check_ie(UNI_IE_EXQOS, (union uni_ieall *)&m->exqos, cx);
+ ret |= uni_check_ie(UNI_IE_ABRSETUP, (union uni_ieall *)&m->abrsetup, cx);
+ ret |= uni_check_ie(UNI_IE_ABRADD, (union uni_ieall *)&m->abradd, cx);
+ ret |= uni_check_ie(UNI_IE_CSCOPE, (union uni_ieall *)&m->cscope, cx);
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->calling_soft);
+ else
+ ret |= uni_check_ie(UNI_IE_CALLING_SOFT, (union uni_ieall *)&m->calling_soft, cx);
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->called_soft);
+ else
+ ret |= uni_check_ie(UNI_IE_CALLED_SOFT, (union uni_ieall *)&m->called_soft, cx);
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->dtl_repeat);
+ else
+ ret |= uni_check_ie(UNI_IE_REPEAT, (union uni_ieall *)&m->dtl_repeat, cx);
+ for(i = 0; i < UNI_NUM_IE_DTL ; i++) {
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->dtl[i]);
+ else
+ ret |= uni_check_ie(UNI_IE_DTL, (union uni_ieall *)&m->dtl[i], cx);
+ }
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->report);
+ else
+ ret |= uni_check_ie(UNI_IE_REPORT, (union uni_ieall *)&m->report, cx);
+ ret |= uni_check_ie(UNI_IE_MDCR, (union uni_ieall *)&m->mdcr, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_setup(struct uni_msg *msg, struct uni_setup *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_SETUP, cx, &mlen))
+ return (-2);
+
+ if((p->aal.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_AAL, msg, (union uni_ieall *)&p->aal, cx))
+ return (UNI_IE_AAL);
+ if((p->traffic.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_TRAFFIC, msg, (union uni_ieall *)&p->traffic, cx))
+ return (UNI_IE_TRAFFIC);
+ if((p->bearer.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_BEARER, msg, (union uni_ieall *)&p->bearer, cx))
+ return (UNI_IE_BEARER);
+ if((p->bhli.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_BHLI, msg, (union uni_ieall *)&p->bhli, cx))
+ return (UNI_IE_BHLI);
+ if((p->blli_repeat.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_BLLI, msg, (union uni_ieall *)&p->blli_repeat, cx))
+ return (0x10000000 + UNI_IE_BLLI);
+ for(i = 0; i < UNI_NUM_IE_BLLI; i++)
+ if((p->blli[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_BLLI, msg, (union uni_ieall *)&p->blli[i], cx))
+ return ((i << 16) + UNI_IE_BLLI);
+ if((p->called.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
+ return (UNI_IE_CALLED);
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
+ if((p->calledsub[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub[i], cx))
+ return ((i << 16) + UNI_IE_CALLEDSUB);
+ if((p->calling.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLING, msg, (union uni_ieall *)&p->calling, cx))
+ return (UNI_IE_CALLING);
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
+ if((p->callingsub[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLINGSUB, msg, (union uni_ieall *)&p->callingsub[i], cx))
+ return ((i << 16) + UNI_IE_CALLINGSUB);
+ if((p->connid.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
+ return (UNI_IE_CONNID);
+ if((p->qos.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_QOS, msg, (union uni_ieall *)&p->qos, cx))
+ return (UNI_IE_QOS);
+ if((p->eetd.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EETD, msg, (union uni_ieall *)&p->eetd, cx))
+ return (UNI_IE_EETD);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->scompl.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_SCOMPL, msg, (union uni_ieall *)&p->scompl, cx))
+ return (UNI_IE_SCOMPL);
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if((p->tns[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_TNS, msg, (union uni_ieall *)&p->tns[i], cx))
+ return ((i << 16) + UNI_IE_TNS);
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->atraffic.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_ATRAFFIC, msg, (union uni_ieall *)&p->atraffic, cx))
+ return (UNI_IE_ATRAFFIC);
+ if((p->mintraffic.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_MINTRAFFIC, msg, (union uni_ieall *)&p->mintraffic, cx))
+ return (UNI_IE_MINTRAFFIC);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->lij_callid.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_LIJ_CALLID, msg, (union uni_ieall *)&p->lij_callid, cx))
+ return (UNI_IE_LIJ_CALLID);
+ if((p->lij_param.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_LIJ_PARAM, msg, (union uni_ieall *)&p->lij_param, cx))
+ return (UNI_IE_LIJ_PARAM);
+ if((p->lij_seqno.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_LIJ_SEQNO, msg, (union uni_ieall *)&p->lij_seqno, cx))
+ return (UNI_IE_LIJ_SEQNO);
+ if((p->exqos.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EXQOS, msg, (union uni_ieall *)&p->exqos, cx))
+ return (UNI_IE_EXQOS);
+ if((p->abrsetup.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_ABRSETUP, msg, (union uni_ieall *)&p->abrsetup, cx))
+ return (UNI_IE_ABRSETUP);
+ if((p->abradd.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_ABRADD, msg, (union uni_ieall *)&p->abradd, cx))
+ return (UNI_IE_ABRADD);
+ if((p->cscope.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CSCOPE, msg, (union uni_ieall *)&p->cscope, cx))
+ return (UNI_IE_CSCOPE);
+ if((p->calling_soft.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLING_SOFT, msg, (union uni_ieall *)&p->calling_soft, cx))
+ return (UNI_IE_CALLING_SOFT);
+ if((p->called_soft.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLED_SOFT, msg, (union uni_ieall *)&p->called_soft, cx))
+ return (UNI_IE_CALLED_SOFT);
+ if((p->dtl_repeat.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_DTL, msg, (union uni_ieall *)&p->dtl_repeat, cx))
+ return (0x10000000 + UNI_IE_DTL);
+ for(i = 0; i < UNI_NUM_IE_DTL; i++)
+ if((p->dtl[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_DTL, msg, (union uni_ieall *)&p->dtl[i], cx))
+ return ((i << 16) + UNI_IE_DTL);
+ if((p->report.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_REPORT, msg, (union uni_ieall *)&p->report, cx))
+ return (UNI_IE_REPORT);
+ if((p->mdcr.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_MDCR, msg, (union uni_ieall *)&p->mdcr, cx))
+ return (UNI_IE_MDCR);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_setup(struct uni_setup *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_AAL:
+ out->aal.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_AAL, (union uni_ieall *)&out->aal, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_TRAFFIC:
+ out->traffic.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_TRAFFIC, (union uni_ieall *)&out->traffic, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_BEARER:
+ out->bearer.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_BEARER, (union uni_ieall *)&out->bearer, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_BHLI:
+ out->bhli.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_BHLI, (union uni_ieall *)&out->bhli, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_BLLI:
+ if (IE_ISPRESENT(cx->repeat))
+ out->blli_repeat = cx->repeat;
+ for(i = 0; i < UNI_NUM_IE_BLLI; i++)
+ if (!IE_ISPRESENT(out->blli[i])) {
+ out->blli[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_BLLI, (union uni_ieall *)&out->blli[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_CALLED:
+ out->called.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLEDSUB:
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
+ if (!IE_ISPRESENT(out->calledsub[i])) {
+ out->calledsub[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_CALLING:
+ out->calling.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLING, (union uni_ieall *)&out->calling, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLINGSUB:
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
+ if (!IE_ISPRESENT(out->callingsub[i])) {
+ out->callingsub[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLINGSUB, (union uni_ieall *)&out->callingsub[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_CONNID:
+ out->connid.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_QOS:
+ out->qos.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_QOS, (union uni_ieall *)&out->qos, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EETD:
+ out->eetd.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EETD, (union uni_ieall *)&out->eetd, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_SCOMPL:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->scompl.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_SCOMPL, (union uni_ieall *)&out->scompl, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_TNS:
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if (!IE_ISPRESENT(out->tns[i])) {
+ out->tns[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_TNS, (union uni_ieall *)&out->tns[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_ATRAFFIC:
+ out->atraffic.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_ATRAFFIC, (union uni_ieall *)&out->atraffic, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_MINTRAFFIC:
+ out->mintraffic.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_MINTRAFFIC, (union uni_ieall *)&out->mintraffic, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_LIJ_CALLID:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->lij_callid.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_LIJ_CALLID, (union uni_ieall *)&out->lij_callid, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_LIJ_PARAM:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->lij_param.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_LIJ_PARAM, (union uni_ieall *)&out->lij_param, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_LIJ_SEQNO:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->lij_seqno.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&out->lij_seqno, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EXQOS:
+ out->exqos.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EXQOS, (union uni_ieall *)&out->exqos, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_ABRSETUP:
+ out->abrsetup.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_ABRSETUP, (union uni_ieall *)&out->abrsetup, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_ABRADD:
+ out->abradd.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_ABRADD, (union uni_ieall *)&out->abradd, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CSCOPE:
+ out->cscope.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CSCOPE, (union uni_ieall *)&out->cscope, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLING_SOFT:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ out->calling_soft.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLING_SOFT, (union uni_ieall *)&out->calling_soft, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLED_SOFT:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ out->called_soft.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLED_SOFT, (union uni_ieall *)&out->called_soft, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_DTL:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ if (IE_ISPRESENT(cx->repeat))
+ out->dtl_repeat = cx->repeat;
+ for(i = 0; i < UNI_NUM_IE_DTL; i++)
+ if (!IE_ISPRESENT(out->dtl[i])) {
+ out->dtl[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_DTL, (union uni_ieall *)&out->dtl[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_REPORT:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->report.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_REPORT, (union uni_ieall *)&out->report, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_MDCR:
+ out->mdcr.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_MDCR, (union uni_ieall *)&out->mdcr, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_REPEAT:
+ cx->repeat.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if (uni_decode_ie_body(UNI_IE_REPEAT, (union uni_ieall *)&cx->repeat, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_setup = {
+ 0,
+ "setup",
+ (uni_msg_print_f)print_setup,
+ (uni_msg_check_f)check_setup,
+ (uni_msg_encode_f)encode_setup,
+ (uni_msg_decode_f)decode_setup
+};
+
+static void
+print_status(struct uni_status *msg, struct unicx *cx)
+{
+ if(msg->callstate.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLSTATE, (union uni_ieall *)&msg->callstate, cx);
+ if(msg->cause.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->epstate.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPSTATE, (union uni_ieall *)&msg->epstate, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_status(struct uni_status *m, struct unicx *cx)
+{
+ int ret = 0;
+
+ ret |= uni_check_ie(UNI_IE_CALLSTATE, (union uni_ieall *)&m->callstate, cx);
+ ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_EPSTATE, (union uni_ieall *)&m->epstate, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_status(struct uni_msg *msg, struct uni_status *p, struct unicx *cx)
+{
+ u_int mlen;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_STATUS, cx, &mlen))
+ return (-2);
+
+ if((p->callstate.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLSTATE, msg, (union uni_ieall *)&p->callstate, cx))
+ return (UNI_IE_CALLSTATE);
+ if((p->cause.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
+ return (UNI_IE_CAUSE);
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->epstate.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPSTATE, msg, (union uni_ieall *)&p->epstate, cx))
+ return (UNI_IE_EPSTATE);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_status(struct uni_status *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ switch (ie) {
+
+ case UNI_IE_CALLSTATE:
+ out->callstate.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLSTATE, (union uni_ieall *)&out->callstate, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CAUSE:
+ out->cause.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EPSTATE:
+ out->epstate.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPSTATE, (union uni_ieall *)&out->epstate, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_status = {
+ 0,
+ "status",
+ (uni_msg_print_f)print_status,
+ (uni_msg_check_f)check_status,
+ (uni_msg_encode_f)encode_status,
+ (uni_msg_decode_f)decode_status
+};
+
+static void
+print_status_enq(struct uni_status_enq *msg, struct unicx *cx)
+{
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_status_enq(struct uni_status_enq *m, struct unicx *cx)
+{
+ int ret = 0;
+
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_status_enq(struct uni_msg *msg, struct uni_status_enq *p, struct unicx *cx)
+{
+ u_int mlen;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_STATUS_ENQ, cx, &mlen))
+ return (-2);
+
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_status_enq(struct uni_status_enq *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ switch (ie) {
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_status_enq = {
+ 0,
+ "status_enq",
+ (uni_msg_print_f)print_status_enq,
+ (uni_msg_check_f)check_status_enq,
+ (uni_msg_encode_f)encode_status_enq,
+ (uni_msg_decode_f)decode_status_enq
+};
+
+static void
+print_notify(struct uni_notify *msg, struct unicx *cx)
+{
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_notify(struct uni_notify *m, struct unicx *cx)
+{
+ int ret = 0;
+
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_notify(struct uni_msg *msg, struct uni_notify *p, struct unicx *cx)
+{
+ u_int mlen;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_NOTIFY, cx, &mlen))
+ return (-2);
+
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_notify(struct uni_notify *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ switch (ie) {
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_notify = {
+ 0,
+ "notify",
+ (uni_msg_print_f)print_notify,
+ (uni_msg_check_f)check_notify,
+ (uni_msg_encode_f)encode_notify,
+ (uni_msg_decode_f)decode_notify
+};
+
+static void
+print_restart(struct uni_restart *msg, struct unicx *cx)
+{
+ if(msg->connid.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
+ if(msg->restart.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_RESTART, (union uni_ieall *)&msg->restart, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_restart(struct uni_restart *m, struct unicx *cx)
+{
+ int ret = 0;
+
+ ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
+ ret |= uni_check_ie(UNI_IE_RESTART, (union uni_ieall *)&m->restart, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_restart(struct uni_msg *msg, struct uni_restart *p, struct unicx *cx)
+{
+ u_int mlen;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_RESTART, cx, &mlen))
+ return (-2);
+
+ if((p->connid.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
+ return (UNI_IE_CONNID);
+ if((p->restart.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_RESTART, msg, (union uni_ieall *)&p->restart, cx))
+ return (UNI_IE_RESTART);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_restart(struct uni_restart *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ switch (ie) {
+
+ case UNI_IE_CONNID:
+ out->connid.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_RESTART:
+ out->restart.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_RESTART, (union uni_ieall *)&out->restart, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_restart = {
+ 0,
+ "restart",
+ (uni_msg_print_f)print_restart,
+ (uni_msg_check_f)check_restart,
+ (uni_msg_encode_f)encode_restart,
+ (uni_msg_decode_f)decode_restart
+};
+
+static void
+print_restart_ack(struct uni_restart_ack *msg, struct unicx *cx)
+{
+ if(msg->connid.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CONNID, (union uni_ieall *)&msg->connid, cx);
+ if(msg->restart.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_RESTART, (union uni_ieall *)&msg->restart, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_restart_ack(struct uni_restart_ack *m, struct unicx *cx)
+{
+ int ret = 0;
+
+ ret |= uni_check_ie(UNI_IE_CONNID, (union uni_ieall *)&m->connid, cx);
+ ret |= uni_check_ie(UNI_IE_RESTART, (union uni_ieall *)&m->restart, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_restart_ack(struct uni_msg *msg, struct uni_restart_ack *p, struct unicx *cx)
+{
+ u_int mlen;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_RESTART_ACK, cx, &mlen))
+ return (-2);
+
+ if((p->connid.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CONNID, msg, (union uni_ieall *)&p->connid, cx))
+ return (UNI_IE_CONNID);
+ if((p->restart.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_RESTART, msg, (union uni_ieall *)&p->restart, cx))
+ return (UNI_IE_RESTART);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_restart_ack(struct uni_restart_ack *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ switch (ie) {
+
+ case UNI_IE_CONNID:
+ out->connid.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CONNID, (union uni_ieall *)&out->connid, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_RESTART:
+ out->restart.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_RESTART, (union uni_ieall *)&out->restart, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_restart_ack = {
+ 0,
+ "restart_ack",
+ (uni_msg_print_f)print_restart_ack,
+ (uni_msg_check_f)check_restart_ack,
+ (uni_msg_encode_f)encode_restart_ack,
+ (uni_msg_decode_f)decode_restart_ack
+};
+
+static void
+print_add_party(struct uni_add_party *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->aal.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_AAL, (union uni_ieall *)&msg->aal, cx);
+ if(msg->bhli.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_BHLI, (union uni_ieall *)&msg->bhli, cx);
+ if(msg->blli.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_BLLI, (union uni_ieall *)&msg->blli, cx);
+ if(msg->called.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
+ if(msg->calledsub[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub[i], cx);
+ if(msg->calling.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLING, (union uni_ieall *)&msg->calling, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
+ if(msg->callingsub[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLINGSUB, (union uni_ieall *)&msg->callingsub[i], cx);
+ if(msg->scompl.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_SCOMPL, (union uni_ieall *)&msg->scompl, cx);
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if(msg->tns[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_TNS, (union uni_ieall *)&msg->tns[i], cx);
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->eetd.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EETD, (union uni_ieall *)&msg->eetd, cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->lij_seqno.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&msg->lij_seqno, cx);
+ if(msg->calling_soft.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLING_SOFT, (union uni_ieall *)&msg->calling_soft, cx);
+ if(msg->called_soft.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLED_SOFT, (union uni_ieall *)&msg->called_soft, cx);
+ if(msg->dtl_repeat.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_REPEAT, (union uni_ieall *)&msg->dtl_repeat, cx);
+ for(i = 0; i < UNI_NUM_IE_DTL; i++)
+ if(msg->dtl[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_DTL, (union uni_ieall *)&msg->dtl[i], cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_add_party(struct uni_add_party *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_AAL, (union uni_ieall *)&m->aal, cx);
+ ret |= uni_check_ie(UNI_IE_BHLI, (union uni_ieall *)&m->bhli, cx);
+ ret |= uni_check_ie(UNI_IE_BLLI, (union uni_ieall *)&m->blli, cx);
+ ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB ; i++) {
+ ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_CALLING, (union uni_ieall *)&m->calling, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB ; i++) {
+ ret |= uni_check_ie(UNI_IE_CALLINGSUB, (union uni_ieall *)&m->callingsub[i], cx);
+ }
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->scompl);
+ else
+ ret |= uni_check_ie(UNI_IE_SCOMPL, (union uni_ieall *)&m->scompl, cx);
+ for(i = 0; i < UNI_NUM_IE_TNS ; i++) {
+ ret |= uni_check_ie(UNI_IE_TNS, (union uni_ieall *)&m->tns[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ ret |= uni_check_ie(UNI_IE_EETD, (union uni_ieall *)&m->eetd, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->lij_seqno);
+ else
+ ret |= uni_check_ie(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&m->lij_seqno, cx);
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->calling_soft);
+ else
+ ret |= uni_check_ie(UNI_IE_CALLING_SOFT, (union uni_ieall *)&m->calling_soft, cx);
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->called_soft);
+ else
+ ret |= uni_check_ie(UNI_IE_CALLED_SOFT, (union uni_ieall *)&m->called_soft, cx);
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->dtl_repeat);
+ else
+ ret |= uni_check_ie(UNI_IE_REPEAT, (union uni_ieall *)&m->dtl_repeat, cx);
+ for(i = 0; i < UNI_NUM_IE_DTL ; i++) {
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->dtl[i]);
+ else
+ ret |= uni_check_ie(UNI_IE_DTL, (union uni_ieall *)&m->dtl[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_add_party(struct uni_msg *msg, struct uni_add_party *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_ADD_PARTY, cx, &mlen))
+ return (-2);
+
+ if((p->aal.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_AAL, msg, (union uni_ieall *)&p->aal, cx))
+ return (UNI_IE_AAL);
+ if((p->bhli.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_BHLI, msg, (union uni_ieall *)&p->bhli, cx))
+ return (UNI_IE_BHLI);
+ if((p->blli.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_BLLI, msg, (union uni_ieall *)&p->blli, cx))
+ return (UNI_IE_BLLI);
+ if((p->called.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
+ return (UNI_IE_CALLED);
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
+ if((p->calledsub[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub[i], cx))
+ return ((i << 16) + UNI_IE_CALLEDSUB);
+ if((p->calling.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLING, msg, (union uni_ieall *)&p->calling, cx))
+ return (UNI_IE_CALLING);
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
+ if((p->callingsub[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLINGSUB, msg, (union uni_ieall *)&p->callingsub[i], cx))
+ return ((i << 16) + UNI_IE_CALLINGSUB);
+ if((p->scompl.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_SCOMPL, msg, (union uni_ieall *)&p->scompl, cx))
+ return (UNI_IE_SCOMPL);
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if((p->tns[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_TNS, msg, (union uni_ieall *)&p->tns[i], cx))
+ return ((i << 16) + UNI_IE_TNS);
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->eetd.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EETD, msg, (union uni_ieall *)&p->eetd, cx))
+ return (UNI_IE_EETD);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->lij_seqno.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_LIJ_SEQNO, msg, (union uni_ieall *)&p->lij_seqno, cx))
+ return (UNI_IE_LIJ_SEQNO);
+ if((p->calling_soft.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLING_SOFT, msg, (union uni_ieall *)&p->calling_soft, cx))
+ return (UNI_IE_CALLING_SOFT);
+ if((p->called_soft.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLED_SOFT, msg, (union uni_ieall *)&p->called_soft, cx))
+ return (UNI_IE_CALLED_SOFT);
+ if((p->dtl_repeat.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_DTL, msg, (union uni_ieall *)&p->dtl_repeat, cx))
+ return (0x10000000 + UNI_IE_DTL);
+ for(i = 0; i < UNI_NUM_IE_DTL; i++)
+ if((p->dtl[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_DTL, msg, (union uni_ieall *)&p->dtl[i], cx))
+ return ((i << 16) + UNI_IE_DTL);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_add_party(struct uni_add_party *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_AAL:
+ out->aal.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_AAL, (union uni_ieall *)&out->aal, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_BHLI:
+ out->bhli.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_BHLI, (union uni_ieall *)&out->bhli, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_BLLI:
+ out->blli.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_BLLI, (union uni_ieall *)&out->blli, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLED:
+ out->called.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLEDSUB:
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
+ if (!IE_ISPRESENT(out->calledsub[i])) {
+ out->calledsub[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_CALLING:
+ out->calling.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLING, (union uni_ieall *)&out->calling, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLINGSUB:
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
+ if (!IE_ISPRESENT(out->callingsub[i])) {
+ out->callingsub[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLINGSUB, (union uni_ieall *)&out->callingsub[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_SCOMPL:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->scompl.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_SCOMPL, (union uni_ieall *)&out->scompl, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_TNS:
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if (!IE_ISPRESENT(out->tns[i])) {
+ out->tns[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_TNS, (union uni_ieall *)&out->tns[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EETD:
+ out->eetd.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EETD, (union uni_ieall *)&out->eetd, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_LIJ_SEQNO:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->lij_seqno.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&out->lij_seqno, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLING_SOFT:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ out->calling_soft.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLING_SOFT, (union uni_ieall *)&out->calling_soft, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLED_SOFT:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ out->called_soft.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLED_SOFT, (union uni_ieall *)&out->called_soft, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_DTL:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ if (IE_ISPRESENT(cx->repeat))
+ out->dtl_repeat = cx->repeat;
+ for(i = 0; i < UNI_NUM_IE_DTL; i++)
+ if (!IE_ISPRESENT(out->dtl[i])) {
+ out->dtl[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_DTL, (union uni_ieall *)&out->dtl[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_REPEAT:
+ cx->repeat.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if (uni_decode_ie_body(UNI_IE_REPEAT, (union uni_ieall *)&cx->repeat, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_add_party = {
+ 0,
+ "add_party",
+ (uni_msg_print_f)print_add_party,
+ (uni_msg_check_f)check_add_party,
+ (uni_msg_encode_f)encode_add_party,
+ (uni_msg_decode_f)decode_add_party
+};
+
+static void
+print_add_party_ack(struct uni_add_party_ack *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->aal.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_AAL, (union uni_ieall *)&msg->aal, cx);
+ if(msg->blli.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_BLLI, (union uni_ieall *)&msg->blli, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->eetd.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EETD, (union uni_ieall *)&msg->eetd, cx);
+ if(msg->conned.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CONNED, (union uni_ieall *)&msg->conned, cx);
+ if(msg->connedsub.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CONNEDSUB, (union uni_ieall *)&msg->connedsub, cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->called_soft.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLED_SOFT, (union uni_ieall *)&msg->called_soft, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_add_party_ack(struct uni_add_party_ack *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_AAL, (union uni_ieall *)&m->aal, cx);
+ ret |= uni_check_ie(UNI_IE_BLLI, (union uni_ieall *)&m->blli, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ ret |= uni_check_ie(UNI_IE_EETD, (union uni_ieall *)&m->eetd, cx);
+ ret |= uni_check_ie(UNI_IE_CONNED, (union uni_ieall *)&m->conned, cx);
+ ret |= uni_check_ie(UNI_IE_CONNEDSUB, (union uni_ieall *)&m->connedsub, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->called_soft);
+ else
+ ret |= uni_check_ie(UNI_IE_CALLED_SOFT, (union uni_ieall *)&m->called_soft, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_add_party_ack(struct uni_msg *msg, struct uni_add_party_ack *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_ADD_PARTY_ACK, cx, &mlen))
+ return (-2);
+
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->aal.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_AAL, msg, (union uni_ieall *)&p->aal, cx))
+ return (UNI_IE_AAL);
+ if((p->blli.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_BLLI, msg, (union uni_ieall *)&p->blli, cx))
+ return (UNI_IE_BLLI);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->eetd.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EETD, msg, (union uni_ieall *)&p->eetd, cx))
+ return (UNI_IE_EETD);
+ if((p->conned.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CONNED, msg, (union uni_ieall *)&p->conned, cx))
+ return (UNI_IE_CONNED);
+ if((p->connedsub.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CONNEDSUB, msg, (union uni_ieall *)&p->connedsub, cx))
+ return (UNI_IE_CONNEDSUB);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->called_soft.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLED_SOFT, msg, (union uni_ieall *)&p->called_soft, cx))
+ return (UNI_IE_CALLED_SOFT);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_add_party_ack(struct uni_add_party_ack *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_AAL:
+ out->aal.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_AAL, (union uni_ieall *)&out->aal, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_BLLI:
+ out->blli.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_BLLI, (union uni_ieall *)&out->blli, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EETD:
+ out->eetd.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EETD, (union uni_ieall *)&out->eetd, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CONNED:
+ out->conned.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CONNED, (union uni_ieall *)&out->conned, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CONNEDSUB:
+ out->connedsub.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CONNEDSUB, (union uni_ieall *)&out->connedsub, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_CALLED_SOFT:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ out->called_soft.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLED_SOFT, (union uni_ieall *)&out->called_soft, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_add_party_ack = {
+ 0,
+ "add_party_ack",
+ (uni_msg_print_f)print_add_party_ack,
+ (uni_msg_check_f)check_add_party_ack,
+ (uni_msg_encode_f)encode_add_party_ack,
+ (uni_msg_decode_f)decode_add_party_ack
+};
+
+static void
+print_party_alerting(struct uni_party_alerting *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_party_alerting(struct uni_party_alerting *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_party_alerting(struct uni_msg *msg, struct uni_party_alerting *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_PARTY_ALERTING, cx, &mlen))
+ return (-2);
+
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_party_alerting(struct uni_party_alerting *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_party_alerting = {
+ 0,
+ "party_alerting",
+ (uni_msg_print_f)print_party_alerting,
+ (uni_msg_check_f)check_party_alerting,
+ (uni_msg_encode_f)encode_party_alerting,
+ (uni_msg_decode_f)decode_party_alerting
+};
+
+static void
+print_add_party_rej(struct uni_add_party_rej *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->cause.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->crankback.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CRANKBACK, (union uni_ieall *)&msg->crankback, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_add_party_rej(struct uni_add_party_rej *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ if(!(cx->pnni))
+ ret |= IE_ISPRESENT(m->crankback);
+ else
+ ret |= uni_check_ie(UNI_IE_CRANKBACK, (union uni_ieall *)&m->crankback, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_add_party_rej(struct uni_msg *msg, struct uni_add_party_rej *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_ADD_PARTY_REJ, cx, &mlen))
+ return (-2);
+
+ if((p->cause.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
+ return (UNI_IE_CAUSE);
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->crankback.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CRANKBACK, msg, (union uni_ieall *)&p->crankback, cx))
+ return (UNI_IE_CRANKBACK);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_add_party_rej(struct uni_add_party_rej *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_CAUSE:
+ out->cause.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_CRANKBACK:
+ if (!(cx->pnni))
+ return (DEC_ILL);
+ out->crankback.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CRANKBACK, (union uni_ieall *)&out->crankback, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_add_party_rej = {
+ 0,
+ "add_party_rej",
+ (uni_msg_print_f)print_add_party_rej,
+ (uni_msg_check_f)check_add_party_rej,
+ (uni_msg_encode_f)encode_add_party_rej,
+ (uni_msg_decode_f)decode_add_party_rej
+};
+
+static void
+print_drop_party(struct uni_drop_party *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->cause.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_drop_party(struct uni_drop_party *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_drop_party(struct uni_msg *msg, struct uni_drop_party *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_DROP_PARTY, cx, &mlen))
+ return (-2);
+
+ if((p->cause.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
+ return (UNI_IE_CAUSE);
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_drop_party(struct uni_drop_party *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_CAUSE:
+ out->cause.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_drop_party = {
+ 0,
+ "drop_party",
+ (uni_msg_print_f)print_drop_party,
+ (uni_msg_check_f)check_drop_party,
+ (uni_msg_encode_f)encode_drop_party,
+ (uni_msg_decode_f)decode_drop_party
+};
+
+static void
+print_drop_party_ack(struct uni_drop_party_ack *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->cause.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
+ if(msg->uu.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UU, (union uni_ieall *)&msg->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_drop_party_ack(struct uni_drop_party_ack *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
+ if(!(!cx->pnni))
+ ret |= IE_ISPRESENT(m->uu);
+ else
+ ret |= uni_check_ie(UNI_IE_UU, (union uni_ieall *)&m->uu, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_drop_party_ack(struct uni_msg *msg, struct uni_drop_party_ack *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_DROP_PARTY_ACK, cx, &mlen))
+ return (-2);
+
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->cause.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
+ return (UNI_IE_CAUSE);
+ if((p->uu.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UU, msg, (union uni_ieall *)&p->uu, cx))
+ return (UNI_IE_UU);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_drop_party_ack(struct uni_drop_party_ack *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CAUSE:
+ out->cause.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UU:
+ if (!(!cx->pnni))
+ return (DEC_ILL);
+ out->uu.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UU, (union uni_ieall *)&out->uu, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_drop_party_ack = {
+ 0,
+ "drop_party_ack",
+ (uni_msg_print_f)print_drop_party_ack,
+ (uni_msg_check_f)check_drop_party_ack,
+ (uni_msg_encode_f)encode_drop_party_ack,
+ (uni_msg_decode_f)decode_drop_party_ack
+};
+
+static void
+print_leaf_setup_req(struct uni_leaf_setup_req *msg, struct unicx *cx)
+{
+ u_int i;
+
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if(msg->tns[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_TNS, (union uni_ieall *)&msg->tns[i], cx);
+ if(msg->calling.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLING, (union uni_ieall *)&msg->calling, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
+ if(msg->callingsub[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLINGSUB, (union uni_ieall *)&msg->callingsub[i], cx);
+ if(msg->called.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
+ if(msg->calledsub[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub[i], cx);
+ if(msg->lij_callid.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_LIJ_CALLID, (union uni_ieall *)&msg->lij_callid, cx);
+ if(msg->lij_seqno.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&msg->lij_seqno, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_leaf_setup_req(struct uni_leaf_setup_req *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ for(i = 0; i < UNI_NUM_IE_TNS ; i++) {
+ ret |= uni_check_ie(UNI_IE_TNS, (union uni_ieall *)&m->tns[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_CALLING, (union uni_ieall *)&m->calling, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB ; i++) {
+ ret |= uni_check_ie(UNI_IE_CALLINGSUB, (union uni_ieall *)&m->callingsub[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB ; i++) {
+ ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_LIJ_CALLID, (union uni_ieall *)&m->lij_callid, cx);
+ ret |= uni_check_ie(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&m->lij_seqno, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_leaf_setup_req(struct uni_msg *msg, struct uni_leaf_setup_req *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_LEAF_SETUP_REQ, cx, &mlen))
+ return (-2);
+
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if((p->tns[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_TNS, msg, (union uni_ieall *)&p->tns[i], cx))
+ return ((i << 16) + UNI_IE_TNS);
+ if((p->calling.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLING, msg, (union uni_ieall *)&p->calling, cx))
+ return (UNI_IE_CALLING);
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
+ if((p->callingsub[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLINGSUB, msg, (union uni_ieall *)&p->callingsub[i], cx))
+ return ((i << 16) + UNI_IE_CALLINGSUB);
+ if((p->called.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
+ return (UNI_IE_CALLED);
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
+ if((p->calledsub[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub[i], cx))
+ return ((i << 16) + UNI_IE_CALLEDSUB);
+ if((p->lij_callid.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_LIJ_CALLID, msg, (union uni_ieall *)&p->lij_callid, cx))
+ return (UNI_IE_LIJ_CALLID);
+ if((p->lij_seqno.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_LIJ_SEQNO, msg, (union uni_ieall *)&p->lij_seqno, cx))
+ return (UNI_IE_LIJ_SEQNO);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_leaf_setup_req(struct uni_leaf_setup_req *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_TNS:
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if (!IE_ISPRESENT(out->tns[i])) {
+ out->tns[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_TNS, (union uni_ieall *)&out->tns[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_CALLING:
+ out->calling.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLING, (union uni_ieall *)&out->calling, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLINGSUB:
+ for(i = 0; i < UNI_NUM_IE_CALLINGSUB; i++)
+ if (!IE_ISPRESENT(out->callingsub[i])) {
+ out->callingsub[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLINGSUB, (union uni_ieall *)&out->callingsub[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_CALLED:
+ out->called.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLEDSUB:
+ for(i = 0; i < UNI_NUM_IE_CALLEDSUB; i++)
+ if (!IE_ISPRESENT(out->calledsub[i])) {
+ out->calledsub[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_LIJ_CALLID:
+ out->lij_callid.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_LIJ_CALLID, (union uni_ieall *)&out->lij_callid, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_LIJ_SEQNO:
+ out->lij_seqno.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&out->lij_seqno, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_leaf_setup_req = {
+ 0,
+ "leaf_setup_req",
+ (uni_msg_print_f)print_leaf_setup_req,
+ (uni_msg_check_f)check_leaf_setup_req,
+ (uni_msg_encode_f)encode_leaf_setup_req,
+ (uni_msg_decode_f)decode_leaf_setup_req
+};
+
+static void
+print_leaf_setup_fail(struct uni_leaf_setup_fail *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->cause.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
+ if(msg->called.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
+ if(msg->calledsub.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub, cx);
+ if(msg->lij_seqno.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&msg->lij_seqno, cx);
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if(msg->tns[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_TNS, (union uni_ieall *)&msg->tns[i], cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_leaf_setup_fail(struct uni_leaf_setup_fail *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
+ ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
+ ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub, cx);
+ ret |= uni_check_ie(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&m->lij_seqno, cx);
+ for(i = 0; i < UNI_NUM_IE_TNS ; i++) {
+ ret |= uni_check_ie(UNI_IE_TNS, (union uni_ieall *)&m->tns[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_leaf_setup_fail(struct uni_msg *msg, struct uni_leaf_setup_fail *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_LEAF_SETUP_FAIL, cx, &mlen))
+ return (-2);
+
+ if((p->cause.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
+ return (UNI_IE_CAUSE);
+ if((p->called.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
+ return (UNI_IE_CALLED);
+ if((p->calledsub.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub, cx))
+ return (UNI_IE_CALLEDSUB);
+ if((p->lij_seqno.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_LIJ_SEQNO, msg, (union uni_ieall *)&p->lij_seqno, cx))
+ return (UNI_IE_LIJ_SEQNO);
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if((p->tns[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_TNS, msg, (union uni_ieall *)&p->tns[i], cx))
+ return ((i << 16) + UNI_IE_TNS);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_leaf_setup_fail(struct uni_leaf_setup_fail *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_CAUSE:
+ out->cause.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLED:
+ out->called.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLEDSUB:
+ out->calledsub.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_LIJ_SEQNO:
+ out->lij_seqno.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_LIJ_SEQNO, (union uni_ieall *)&out->lij_seqno, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_TNS:
+ for(i = 0; i < UNI_NUM_IE_TNS; i++)
+ if (!IE_ISPRESENT(out->tns[i])) {
+ out->tns[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_TNS, (union uni_ieall *)&out->tns[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_leaf_setup_fail = {
+ 0,
+ "leaf_setup_fail",
+ (uni_msg_print_f)print_leaf_setup_fail,
+ (uni_msg_check_f)check_leaf_setup_fail,
+ (uni_msg_encode_f)encode_leaf_setup_fail,
+ (uni_msg_decode_f)decode_leaf_setup_fail
+};
+
+static void
+print_cobisetup(struct uni_cobisetup *msg, struct unicx *cx)
+{
+ if(msg->facility.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_FACILITY, (union uni_ieall *)&msg->facility, cx);
+ if(msg->called.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
+ if(msg->calledsub.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub, cx);
+ if(msg->calling.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLING, (union uni_ieall *)&msg->calling, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_cobisetup(struct uni_cobisetup *m, struct unicx *cx)
+{
+ int ret = 0;
+
+ ret |= uni_check_ie(UNI_IE_FACILITY, (union uni_ieall *)&m->facility, cx);
+ ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
+ ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub, cx);
+ ret |= uni_check_ie(UNI_IE_CALLING, (union uni_ieall *)&m->calling, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_cobisetup(struct uni_msg *msg, struct uni_cobisetup *p, struct unicx *cx)
+{
+ u_int mlen;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_COBISETUP, cx, &mlen))
+ return (-2);
+
+ if((p->facility.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_FACILITY, msg, (union uni_ieall *)&p->facility, cx))
+ return (UNI_IE_FACILITY);
+ if((p->called.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
+ return (UNI_IE_CALLED);
+ if((p->calledsub.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub, cx))
+ return (UNI_IE_CALLEDSUB);
+ if((p->calling.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLING, msg, (union uni_ieall *)&p->calling, cx))
+ return (UNI_IE_CALLING);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_cobisetup(struct uni_cobisetup *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ switch (ie) {
+
+ case UNI_IE_FACILITY:
+ out->facility.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_FACILITY, (union uni_ieall *)&out->facility, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLED:
+ out->called.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLEDSUB:
+ out->calledsub.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLING:
+ out->calling.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLING, (union uni_ieall *)&out->calling, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_cobisetup = {
+ 0,
+ "cobisetup",
+ (uni_msg_print_f)print_cobisetup,
+ (uni_msg_check_f)check_cobisetup,
+ (uni_msg_encode_f)encode_cobisetup,
+ (uni_msg_decode_f)decode_cobisetup
+};
+
+static void
+print_facility(struct uni_facility *msg, struct unicx *cx)
+{
+ if(msg->facility.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_FACILITY, (union uni_ieall *)&msg->facility, cx);
+ if(msg->called.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLED, (union uni_ieall *)&msg->called, cx);
+ if(msg->calledsub.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLEDSUB, (union uni_ieall *)&msg->calledsub, cx);
+ if(msg->calling.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CALLING, (union uni_ieall *)&msg->calling, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_facility(struct uni_facility *m, struct unicx *cx)
+{
+ int ret = 0;
+
+ ret |= uni_check_ie(UNI_IE_FACILITY, (union uni_ieall *)&m->facility, cx);
+ ret |= uni_check_ie(UNI_IE_CALLED, (union uni_ieall *)&m->called, cx);
+ ret |= uni_check_ie(UNI_IE_CALLEDSUB, (union uni_ieall *)&m->calledsub, cx);
+ ret |= uni_check_ie(UNI_IE_CALLING, (union uni_ieall *)&m->calling, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_facility(struct uni_msg *msg, struct uni_facility *p, struct unicx *cx)
+{
+ u_int mlen;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_FACILITY, cx, &mlen))
+ return (-2);
+
+ if((p->facility.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_FACILITY, msg, (union uni_ieall *)&p->facility, cx))
+ return (UNI_IE_FACILITY);
+ if((p->called.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLED, msg, (union uni_ieall *)&p->called, cx))
+ return (UNI_IE_CALLED);
+ if((p->calledsub.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLEDSUB, msg, (union uni_ieall *)&p->calledsub, cx))
+ return (UNI_IE_CALLEDSUB);
+ if((p->calling.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CALLING, msg, (union uni_ieall *)&p->calling, cx))
+ return (UNI_IE_CALLING);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_facility(struct uni_facility *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ switch (ie) {
+
+ case UNI_IE_FACILITY:
+ out->facility.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_FACILITY, (union uni_ieall *)&out->facility, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLED:
+ out->called.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLED, (union uni_ieall *)&out->called, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLEDSUB:
+ out->calledsub.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLEDSUB, (union uni_ieall *)&out->calledsub, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_CALLING:
+ out->calling.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CALLING, (union uni_ieall *)&out->calling, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_facility = {
+ 0,
+ "facility",
+ (uni_msg_print_f)print_facility,
+ (uni_msg_check_f)check_facility,
+ (uni_msg_encode_f)encode_facility,
+ (uni_msg_decode_f)decode_facility
+};
+
+static void
+print_modify_req(struct uni_modify_req *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->traffic.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_TRAFFIC, (union uni_ieall *)&msg->traffic, cx);
+ if(msg->atraffic.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_ATRAFFIC, (union uni_ieall *)&msg->atraffic, cx);
+ if(msg->mintraffic.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_MINTRAFFIC, (union uni_ieall *)&msg->mintraffic, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_modify_req(struct uni_modify_req *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_TRAFFIC, (union uni_ieall *)&m->traffic, cx);
+ ret |= uni_check_ie(UNI_IE_ATRAFFIC, (union uni_ieall *)&m->atraffic, cx);
+ ret |= uni_check_ie(UNI_IE_MINTRAFFIC, (union uni_ieall *)&m->mintraffic, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_modify_req(struct uni_msg *msg, struct uni_modify_req *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_MODIFY_REQ, cx, &mlen))
+ return (-2);
+
+ if((p->traffic.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_TRAFFIC, msg, (union uni_ieall *)&p->traffic, cx))
+ return (UNI_IE_TRAFFIC);
+ if((p->atraffic.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_ATRAFFIC, msg, (union uni_ieall *)&p->atraffic, cx))
+ return (UNI_IE_ATRAFFIC);
+ if((p->mintraffic.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_MINTRAFFIC, msg, (union uni_ieall *)&p->mintraffic, cx))
+ return (UNI_IE_MINTRAFFIC);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_modify_req(struct uni_modify_req *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_TRAFFIC:
+ out->traffic.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_TRAFFIC, (union uni_ieall *)&out->traffic, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_ATRAFFIC:
+ out->atraffic.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_ATRAFFIC, (union uni_ieall *)&out->atraffic, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_MINTRAFFIC:
+ out->mintraffic.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_MINTRAFFIC, (union uni_ieall *)&out->mintraffic, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_modify_req = {
+ 0,
+ "modify_req",
+ (uni_msg_print_f)print_modify_req,
+ (uni_msg_check_f)check_modify_req,
+ (uni_msg_encode_f)encode_modify_req,
+ (uni_msg_decode_f)decode_modify_req
+};
+
+static void
+print_modify_ack(struct uni_modify_ack *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->report.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_REPORT, (union uni_ieall *)&msg->report, cx);
+ if(msg->traffic.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_TRAFFIC, (union uni_ieall *)&msg->traffic, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_modify_ack(struct uni_modify_ack *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_REPORT, (union uni_ieall *)&m->report, cx);
+ ret |= uni_check_ie(UNI_IE_TRAFFIC, (union uni_ieall *)&m->traffic, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_modify_ack(struct uni_msg *msg, struct uni_modify_ack *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_MODIFY_ACK, cx, &mlen))
+ return (-2);
+
+ if((p->report.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_REPORT, msg, (union uni_ieall *)&p->report, cx))
+ return (UNI_IE_REPORT);
+ if((p->traffic.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_TRAFFIC, msg, (union uni_ieall *)&p->traffic, cx))
+ return (UNI_IE_TRAFFIC);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_modify_ack(struct uni_modify_ack *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_REPORT:
+ out->report.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_REPORT, (union uni_ieall *)&out->report, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_TRAFFIC:
+ out->traffic.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_TRAFFIC, (union uni_ieall *)&out->traffic, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_modify_ack = {
+ 0,
+ "modify_ack",
+ (uni_msg_print_f)print_modify_ack,
+ (uni_msg_check_f)check_modify_ack,
+ (uni_msg_encode_f)encode_modify_ack,
+ (uni_msg_decode_f)decode_modify_ack
+};
+
+static void
+print_modify_rej(struct uni_modify_rej *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->cause.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_CAUSE, (union uni_ieall *)&msg->cause, cx);
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_modify_rej(struct uni_modify_rej *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_CAUSE, (union uni_ieall *)&m->cause, cx);
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_modify_rej(struct uni_msg *msg, struct uni_modify_rej *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_MODIFY_REJ, cx, &mlen))
+ return (-2);
+
+ if((p->cause.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_CAUSE, msg, (union uni_ieall *)&p->cause, cx))
+ return (UNI_IE_CAUSE);
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_modify_rej(struct uni_modify_rej *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_CAUSE:
+ out->cause.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_CAUSE, (union uni_ieall *)&out->cause, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_modify_rej = {
+ 0,
+ "modify_rej",
+ (uni_msg_print_f)print_modify_rej,
+ (uni_msg_check_f)check_modify_rej,
+ (uni_msg_encode_f)encode_modify_rej,
+ (uni_msg_decode_f)decode_modify_rej
+};
+
+static void
+print_conn_avail(struct uni_conn_avail *msg, struct unicx *cx)
+{
+ u_int i;
+
+ if(msg->notify.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_NOTIFY, (union uni_ieall *)&msg->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if(msg->git[i].h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_GIT, (union uni_ieall *)&msg->git[i], cx);
+ if(msg->report.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_REPORT, (union uni_ieall *)&msg->report, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_conn_avail(struct uni_conn_avail *m, struct unicx *cx)
+{
+ int ret = 0;
+ u_int i;
+
+ ret |= uni_check_ie(UNI_IE_NOTIFY, (union uni_ieall *)&m->notify, cx);
+ for(i = 0; i < UNI_NUM_IE_GIT ; i++) {
+ ret |= uni_check_ie(UNI_IE_GIT, (union uni_ieall *)&m->git[i], cx);
+ }
+ ret |= uni_check_ie(UNI_IE_REPORT, (union uni_ieall *)&m->report, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_conn_avail(struct uni_msg *msg, struct uni_conn_avail *p, struct unicx *cx)
+{
+ u_int mlen;
+ u_int i;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_CONN_AVAIL, cx, &mlen))
+ return (-2);
+
+ if((p->notify.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_NOTIFY, msg, (union uni_ieall *)&p->notify, cx))
+ return (UNI_IE_NOTIFY);
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if((p->git[i].h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_GIT, msg, (union uni_ieall *)&p->git[i], cx))
+ return ((i << 16) + UNI_IE_GIT);
+ if((p->report.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_REPORT, msg, (union uni_ieall *)&p->report, cx))
+ return (UNI_IE_REPORT);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_conn_avail(struct uni_conn_avail *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ u_int i;
+
+ switch (ie) {
+
+ case UNI_IE_NOTIFY:
+ out->notify.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_NOTIFY, (union uni_ieall *)&out->notify, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_GIT:
+ for(i = 0; i < UNI_NUM_IE_GIT; i++)
+ if (!IE_ISPRESENT(out->git[i])) {
+ out->git[i].h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_GIT, (union uni_ieall *)&out->git[i], msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+ }
+ break;
+
+ case UNI_IE_REPORT:
+ out->report.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_REPORT, (union uni_ieall *)&out->report, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_conn_avail = {
+ 0,
+ "conn_avail",
+ (uni_msg_print_f)print_conn_avail,
+ (uni_msg_check_f)check_conn_avail,
+ (uni_msg_encode_f)encode_conn_avail,
+ (uni_msg_decode_f)decode_conn_avail
+};
+
+static void
+print_unknown(struct uni_unknown *msg, struct unicx *cx)
+{
+ if(msg->epref.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_EPREF, (union uni_ieall *)&msg->epref, cx);
+ if(msg->unrec.h.present & UNI_IE_PRESENT)
+ uni_print_ie_internal(UNI_IE_UNREC, (union uni_ieall *)&msg->unrec, cx);
+}
+
+static int
+check_unknown(struct uni_unknown *m, struct unicx *cx)
+{
+ int ret = 0;
+
+ ret |= uni_check_ie(UNI_IE_EPREF, (union uni_ieall *)&m->epref, cx);
+ ret |= uni_check_ie(UNI_IE_UNREC, (union uni_ieall *)&m->unrec, cx);
+
+ return ret;
+}
+
+static int
+encode_unknown(struct uni_msg *msg, struct uni_unknown *p, struct unicx *cx)
+{
+ u_int mlen;
+
+ if(uni_encode_msg_hdr(msg, &p->hdr, UNI_UNKNOWN, cx, &mlen))
+ return (-2);
+
+ if((p->epref.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_EPREF, msg, (union uni_ieall *)&p->epref, cx))
+ return (UNI_IE_EPREF);
+ if((p->unrec.h.present & UNI_IE_PRESENT) &&
+ uni_encode_ie(UNI_IE_UNREC, msg, (union uni_ieall *)&p->unrec, cx))
+ return (UNI_IE_UNREC);
+
+ msg->b_buf[mlen+0] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 8;
+ msg->b_buf[mlen+1] = ((msg->b_wptr-msg->b_rptr)-mlen-2) >> 0;
+
+ return (0);
+}
+
+static int
+decode_unknown(struct uni_unknown *out, struct uni_msg *msg,
+ enum uni_ietype ie, struct uni_iehdr *hdr, u_int ielen,
+ struct unicx *cx)
+{
+ switch (ie) {
+
+ case UNI_IE_EPREF:
+ out->epref.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_EPREF, (union uni_ieall *)&out->epref, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ case UNI_IE_UNREC:
+ out->unrec.h = *hdr;
+ if (hdr->present & UNI_IE_ERROR)
+ return (DEC_ERR);
+ if(uni_decode_ie_body(UNI_IE_UNREC, (union uni_ieall *)&out->unrec, msg, ielen, cx))
+ return (DEC_ERR);
+ break;
+
+ default:
+ return (DEC_ILL);
+ }
+ return (DEC_OK);
+}
+
+static const struct msgdecl decl_unknown = {
+ 0,
+ "unknown",
+ (uni_msg_print_f)print_unknown,
+ (uni_msg_check_f)check_unknown,
+ (uni_msg_encode_f)encode_unknown,
+ (uni_msg_decode_f)decode_unknown
+};
+
+const struct msgdecl *uni_msgtable[256] = {
+ &decl_unknown, /* 0x00 */
+ &decl_alerting, /* 0x01 */
+ &decl_call_proc, /* 0x02 */
+ &decl_unknown, /* 0x03 */
+ &decl_unknown, /* 0x04 */
+ &decl_setup, /* 0x05 */
+ &decl_unknown, /* 0x06 */
+ &decl_connect, /* 0x07 */
+ &decl_unknown, /* 0x08 */
+ &decl_unknown, /* 0x09 */
+ &decl_unknown, /* 0x0a */
+ &decl_unknown, /* 0x0b */
+ &decl_unknown, /* 0x0c */
+ &decl_unknown, /* 0x0d */
+ &decl_unknown, /* 0x0e */
+ &decl_connect_ack, /* 0x0f */
+ &decl_unknown, /* 0x10 */
+ &decl_unknown, /* 0x11 */
+ &decl_unknown, /* 0x12 */
+ &decl_unknown, /* 0x13 */
+ &decl_unknown, /* 0x14 */
+ &decl_cobisetup, /* 0x15 */
+ &decl_unknown, /* 0x16 */
+ &decl_unknown, /* 0x17 */
+ &decl_unknown, /* 0x18 */
+ &decl_unknown, /* 0x19 */
+ &decl_unknown, /* 0x1a */
+ &decl_unknown, /* 0x1b */
+ &decl_unknown, /* 0x1c */
+ &decl_unknown, /* 0x1d */
+ &decl_unknown, /* 0x1e */
+ &decl_unknown, /* 0x1f */
+ &decl_unknown, /* 0x20 */
+ &decl_unknown, /* 0x21 */
+ &decl_unknown, /* 0x22 */
+ &decl_unknown, /* 0x23 */
+ &decl_unknown, /* 0x24 */
+ &decl_unknown, /* 0x25 */
+ &decl_unknown, /* 0x26 */
+ &decl_unknown, /* 0x27 */
+ &decl_unknown, /* 0x28 */
+ &decl_unknown, /* 0x29 */
+ &decl_unknown, /* 0x2a */
+ &decl_unknown, /* 0x2b */
+ &decl_unknown, /* 0x2c */
+ &decl_unknown, /* 0x2d */
+ &decl_unknown, /* 0x2e */
+ &decl_unknown, /* 0x2f */
+ &decl_unknown, /* 0x30 */
+ &decl_unknown, /* 0x31 */
+ &decl_unknown, /* 0x32 */
+ &decl_unknown, /* 0x33 */
+ &decl_unknown, /* 0x34 */
+ &decl_unknown, /* 0x35 */
+ &decl_unknown, /* 0x36 */
+ &decl_unknown, /* 0x37 */
+ &decl_unknown, /* 0x38 */
+ &decl_unknown, /* 0x39 */
+ &decl_unknown, /* 0x3a */
+ &decl_unknown, /* 0x3b */
+ &decl_unknown, /* 0x3c */
+ &decl_unknown, /* 0x3d */
+ &decl_unknown, /* 0x3e */
+ &decl_unknown, /* 0x3f */
+ &decl_unknown, /* 0x40 */
+ &decl_unknown, /* 0x41 */
+ &decl_unknown, /* 0x42 */
+ &decl_unknown, /* 0x43 */
+ &decl_unknown, /* 0x44 */
+ &decl_unknown, /* 0x45 */
+ &decl_restart, /* 0x46 */
+ &decl_unknown, /* 0x47 */
+ &decl_unknown, /* 0x48 */
+ &decl_unknown, /* 0x49 */
+ &decl_unknown, /* 0x4a */
+ &decl_unknown, /* 0x4b */
+ &decl_unknown, /* 0x4c */
+ &decl_release, /* 0x4d */
+ &decl_restart_ack, /* 0x4e */
+ &decl_unknown, /* 0x4f */
+ &decl_unknown, /* 0x50 */
+ &decl_unknown, /* 0x51 */
+ &decl_unknown, /* 0x52 */
+ &decl_unknown, /* 0x53 */
+ &decl_unknown, /* 0x54 */
+ &decl_unknown, /* 0x55 */
+ &decl_unknown, /* 0x56 */
+ &decl_unknown, /* 0x57 */
+ &decl_unknown, /* 0x58 */
+ &decl_unknown, /* 0x59 */
+ &decl_release_compl, /* 0x5a */
+ &decl_unknown, /* 0x5b */
+ &decl_unknown, /* 0x5c */
+ &decl_unknown, /* 0x5d */
+ &decl_unknown, /* 0x5e */
+ &decl_unknown, /* 0x5f */
+ &decl_unknown, /* 0x60 */
+ &decl_unknown, /* 0x61 */
+ &decl_facility, /* 0x62 */
+ &decl_unknown, /* 0x63 */
+ &decl_unknown, /* 0x64 */
+ &decl_unknown, /* 0x65 */
+ &decl_unknown, /* 0x66 */
+ &decl_unknown, /* 0x67 */
+ &decl_unknown, /* 0x68 */
+ &decl_unknown, /* 0x69 */
+ &decl_unknown, /* 0x6a */
+ &decl_unknown, /* 0x6b */
+ &decl_unknown, /* 0x6c */
+ &decl_unknown, /* 0x6d */
+ &decl_notify, /* 0x6e */
+ &decl_unknown, /* 0x6f */
+ &decl_unknown, /* 0x70 */
+ &decl_unknown, /* 0x71 */
+ &decl_unknown, /* 0x72 */
+ &decl_unknown, /* 0x73 */
+ &decl_unknown, /* 0x74 */
+ &decl_status_enq, /* 0x75 */
+ &decl_unknown, /* 0x76 */
+ &decl_unknown, /* 0x77 */
+ &decl_unknown, /* 0x78 */
+ &decl_unknown, /* 0x79 */
+ &decl_unknown, /* 0x7a */
+ &decl_unknown, /* 0x7b */
+ &decl_unknown, /* 0x7c */
+ &decl_status, /* 0x7d */
+ &decl_unknown, /* 0x7e */
+ &decl_unknown, /* 0x7f */
+ &decl_add_party, /* 0x80 */
+ &decl_add_party_ack, /* 0x81 */
+ &decl_add_party_rej, /* 0x82 */
+ &decl_drop_party, /* 0x83 */
+ &decl_drop_party_ack, /* 0x84 */
+ &decl_party_alerting, /* 0x85 */
+ &decl_unknown, /* 0x86 */
+ &decl_unknown, /* 0x87 */
+ &decl_modify_req, /* 0x88 */
+ &decl_modify_ack, /* 0x89 */
+ &decl_modify_rej, /* 0x8a */
+ &decl_conn_avail, /* 0x8b */
+ &decl_unknown, /* 0x8c */
+ &decl_unknown, /* 0x8d */
+ &decl_unknown, /* 0x8e */
+ &decl_unknown, /* 0x8f */
+ &decl_leaf_setup_fail, /* 0x90 */
+ &decl_leaf_setup_req, /* 0x91 */
+ &decl_unknown, /* 0x92 */
+ &decl_unknown, /* 0x93 */
+ &decl_unknown, /* 0x94 */
+ &decl_unknown, /* 0x95 */
+ &decl_unknown, /* 0x96 */
+ &decl_unknown, /* 0x97 */
+ &decl_unknown, /* 0x98 */
+ &decl_unknown, /* 0x99 */
+ &decl_unknown, /* 0x9a */
+ &decl_unknown, /* 0x9b */
+ &decl_unknown, /* 0x9c */
+ &decl_unknown, /* 0x9d */
+ &decl_unknown, /* 0x9e */
+ &decl_unknown, /* 0x9f */
+ &decl_unknown, /* 0xa0 */
+ &decl_unknown, /* 0xa1 */
+ &decl_unknown, /* 0xa2 */
+ &decl_unknown, /* 0xa3 */
+ &decl_unknown, /* 0xa4 */
+ &decl_unknown, /* 0xa5 */
+ &decl_unknown, /* 0xa6 */
+ &decl_unknown, /* 0xa7 */
+ &decl_unknown, /* 0xa8 */
+ &decl_unknown, /* 0xa9 */
+ &decl_unknown, /* 0xaa */
+ &decl_unknown, /* 0xab */
+ &decl_unknown, /* 0xac */
+ &decl_unknown, /* 0xad */
+ &decl_unknown, /* 0xae */
+ &decl_unknown, /* 0xaf */
+ &decl_unknown, /* 0xb0 */
+ &decl_unknown, /* 0xb1 */
+ &decl_unknown, /* 0xb2 */
+ &decl_unknown, /* 0xb3 */
+ &decl_unknown, /* 0xb4 */
+ &decl_unknown, /* 0xb5 */
+ &decl_unknown, /* 0xb6 */
+ &decl_unknown, /* 0xb7 */
+ &decl_unknown, /* 0xb8 */
+ &decl_unknown, /* 0xb9 */
+ &decl_unknown, /* 0xba */
+ &decl_unknown, /* 0xbb */
+ &decl_unknown, /* 0xbc */
+ &decl_unknown, /* 0xbd */
+ &decl_unknown, /* 0xbe */
+ &decl_unknown, /* 0xbf */
+ &decl_unknown, /* 0xc0 */
+ &decl_unknown, /* 0xc1 */
+ &decl_unknown, /* 0xc2 */
+ &decl_unknown, /* 0xc3 */
+ &decl_unknown, /* 0xc4 */
+ &decl_unknown, /* 0xc5 */
+ &decl_unknown, /* 0xc6 */
+ &decl_unknown, /* 0xc7 */
+ &decl_unknown, /* 0xc8 */
+ &decl_unknown, /* 0xc9 */
+ &decl_unknown, /* 0xca */
+ &decl_unknown, /* 0xcb */
+ &decl_unknown, /* 0xcc */
+ &decl_unknown, /* 0xcd */
+ &decl_unknown, /* 0xce */
+ &decl_unknown, /* 0xcf */
+ &decl_unknown, /* 0xd0 */
+ &decl_unknown, /* 0xd1 */
+ &decl_unknown, /* 0xd2 */
+ &decl_unknown, /* 0xd3 */
+ &decl_unknown, /* 0xd4 */
+ &decl_unknown, /* 0xd5 */
+ &decl_unknown, /* 0xd6 */
+ &decl_unknown, /* 0xd7 */
+ &decl_unknown, /* 0xd8 */
+ &decl_unknown, /* 0xd9 */
+ &decl_unknown, /* 0xda */
+ &decl_unknown, /* 0xdb */
+ &decl_unknown, /* 0xdc */
+ &decl_unknown, /* 0xdd */
+ &decl_unknown, /* 0xde */
+ &decl_unknown, /* 0xdf */
+ &decl_unknown, /* 0xe0 */
+ &decl_unknown, /* 0xe1 */
+ &decl_unknown, /* 0xe2 */
+ &decl_unknown, /* 0xe3 */
+ &decl_unknown, /* 0xe4 */
+ &decl_unknown, /* 0xe5 */
+ &decl_unknown, /* 0xe6 */
+ &decl_unknown, /* 0xe7 */
+ &decl_unknown, /* 0xe8 */
+ &decl_unknown, /* 0xe9 */
+ &decl_unknown, /* 0xea */
+ &decl_unknown, /* 0xeb */
+ &decl_unknown, /* 0xec */
+ &decl_unknown, /* 0xed */
+ &decl_unknown, /* 0xee */
+ &decl_unknown, /* 0xef */
+ &decl_unknown, /* 0xf0 */
+ &decl_unknown, /* 0xf1 */
+ &decl_unknown, /* 0xf2 */
+ &decl_unknown, /* 0xf3 */
+ &decl_unknown, /* 0xf4 */
+ &decl_unknown, /* 0xf5 */
+ &decl_unknown, /* 0xf6 */
+ &decl_unknown, /* 0xf7 */
+ &decl_unknown, /* 0xf8 */
+ &decl_unknown, /* 0xf9 */
+ &decl_unknown, /* 0xfa */
+ &decl_unknown, /* 0xfb */
+ &decl_unknown, /* 0xfc */
+ &decl_unknown, /* 0xfd */
+ &decl_unknown, /* 0xfe */
+ &decl_unknown, /* 0xff */
+};
diff --git a/sys/contrib/ngatm/netnatm/msg/uni_msg.h b/sys/contrib/ngatm/netnatm/msg/uni_msg.h
new file mode 100644
index 0000000..ddb095b
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/uni_msg.h
@@ -0,0 +1,342 @@
+/* This file was created automatically
+ * Source file: $Begemot: libunimsg/atm/msg/msg.def,v 1.3 2003/09/19 11:58:15 hbb Exp $
+ * $FreeBSD$
+ */
+
+#ifndef _NETNATM_MSG_UNI_MSG_H_
+#define _NETNATM_MSG_UNI_MSG_H_
+
+struct uni_alerting {
+ struct uni_msghdr hdr;
+ struct uni_ie_connid connid;
+ struct uni_ie_epref epref;
+ struct uni_ie_notify notify;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_uu uu;
+ struct uni_ie_report report;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_call_proc {
+ struct uni_msghdr hdr;
+ struct uni_ie_connid connid;
+ struct uni_ie_epref epref;
+ struct uni_ie_notify notify;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_connect {
+ struct uni_msghdr hdr;
+ struct uni_ie_aal aal;
+ struct uni_ie_blli blli;
+ struct uni_ie_connid connid;
+ struct uni_ie_epref epref;
+ struct uni_ie_notify notify;
+ struct uni_ie_conned conned;
+ struct uni_ie_connedsub connedsub;
+ struct uni_ie_eetd eetd;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_uu uu;
+ struct uni_ie_traffic traffic;
+ struct uni_ie_exqos exqos;
+ struct uni_ie_facility facility;
+ struct uni_ie_abrsetup abrsetup;
+ struct uni_ie_abradd abradd;
+ struct uni_ie_called_soft called_soft;
+ struct uni_ie_report report;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_connect_ack {
+ struct uni_msghdr hdr;
+ struct uni_ie_notify notify;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_release {
+ struct uni_msghdr hdr;
+ struct uni_ie_cause cause[2];
+ struct uni_ie_notify notify;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_uu uu;
+ struct uni_ie_facility facility;
+ struct uni_ie_crankback crankback;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_release_compl {
+ struct uni_msghdr hdr;
+ struct uni_ie_cause cause[2];
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_uu uu;
+ struct uni_ie_crankback crankback;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_setup {
+ struct uni_msghdr hdr;
+ struct uni_ie_aal aal;
+ struct uni_ie_traffic traffic;
+ struct uni_ie_bearer bearer;
+ struct uni_ie_bhli bhli;
+ struct uni_ie_repeat blli_repeat;
+ struct uni_ie_blli blli[UNI_NUM_IE_BLLI];
+ struct uni_ie_called called;
+ struct uni_ie_calledsub calledsub[UNI_NUM_IE_CALLEDSUB];
+ struct uni_ie_calling calling;
+ struct uni_ie_callingsub callingsub[UNI_NUM_IE_CALLINGSUB];
+ struct uni_ie_connid connid;
+ struct uni_ie_qos qos;
+ struct uni_ie_eetd eetd;
+ struct uni_ie_notify notify;
+ struct uni_ie_scompl scompl;
+ struct uni_ie_tns tns[UNI_NUM_IE_TNS];
+ struct uni_ie_epref epref;
+ struct uni_ie_atraffic atraffic;
+ struct uni_ie_mintraffic mintraffic;
+ struct uni_ie_uu uu;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_lij_callid lij_callid;
+ struct uni_ie_lij_param lij_param;
+ struct uni_ie_lij_seqno lij_seqno;
+ struct uni_ie_exqos exqos;
+ struct uni_ie_abrsetup abrsetup;
+ struct uni_ie_abradd abradd;
+ struct uni_ie_cscope cscope;
+ struct uni_ie_calling_soft calling_soft;
+ struct uni_ie_called_soft called_soft;
+ struct uni_ie_repeat dtl_repeat;
+ struct uni_ie_dtl dtl[UNI_NUM_IE_DTL];
+ struct uni_ie_report report;
+ struct uni_ie_mdcr mdcr;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_status {
+ struct uni_msghdr hdr;
+ struct uni_ie_callstate callstate;
+ struct uni_ie_cause cause;
+ struct uni_ie_epref epref;
+ struct uni_ie_epstate epstate;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_status_enq {
+ struct uni_msghdr hdr;
+ struct uni_ie_epref epref;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_notify {
+ struct uni_msghdr hdr;
+ struct uni_ie_notify notify;
+ struct uni_ie_epref epref;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_restart {
+ struct uni_msghdr hdr;
+ struct uni_ie_connid connid;
+ struct uni_ie_restart restart;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_restart_ack {
+ struct uni_msghdr hdr;
+ struct uni_ie_connid connid;
+ struct uni_ie_restart restart;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_add_party {
+ struct uni_msghdr hdr;
+ struct uni_ie_aal aal;
+ struct uni_ie_bhli bhli;
+ struct uni_ie_blli blli;
+ struct uni_ie_called called;
+ struct uni_ie_calledsub calledsub[UNI_NUM_IE_CALLEDSUB];
+ struct uni_ie_calling calling;
+ struct uni_ie_callingsub callingsub[UNI_NUM_IE_CALLINGSUB];
+ struct uni_ie_scompl scompl;
+ struct uni_ie_tns tns[UNI_NUM_IE_TNS];
+ struct uni_ie_epref epref;
+ struct uni_ie_notify notify;
+ struct uni_ie_eetd eetd;
+ struct uni_ie_uu uu;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_lij_seqno lij_seqno;
+ struct uni_ie_calling_soft calling_soft;
+ struct uni_ie_called_soft called_soft;
+ struct uni_ie_repeat dtl_repeat;
+ struct uni_ie_dtl dtl[UNI_NUM_IE_DTL];
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_add_party_ack {
+ struct uni_msghdr hdr;
+ struct uni_ie_epref epref;
+ struct uni_ie_aal aal;
+ struct uni_ie_blli blli;
+ struct uni_ie_notify notify;
+ struct uni_ie_eetd eetd;
+ struct uni_ie_conned conned;
+ struct uni_ie_connedsub connedsub;
+ struct uni_ie_uu uu;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_called_soft called_soft;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_party_alerting {
+ struct uni_msghdr hdr;
+ struct uni_ie_epref epref;
+ struct uni_ie_notify notify;
+ struct uni_ie_uu uu;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_add_party_rej {
+ struct uni_msghdr hdr;
+ struct uni_ie_cause cause;
+ struct uni_ie_epref epref;
+ struct uni_ie_uu uu;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_crankback crankback;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_drop_party {
+ struct uni_msghdr hdr;
+ struct uni_ie_cause cause;
+ struct uni_ie_epref epref;
+ struct uni_ie_notify notify;
+ struct uni_ie_uu uu;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_drop_party_ack {
+ struct uni_msghdr hdr;
+ struct uni_ie_epref epref;
+ struct uni_ie_cause cause;
+ struct uni_ie_uu uu;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_leaf_setup_req {
+ struct uni_msghdr hdr;
+ struct uni_ie_tns tns[UNI_NUM_IE_TNS];
+ struct uni_ie_calling calling;
+ struct uni_ie_callingsub callingsub[UNI_NUM_IE_CALLINGSUB];
+ struct uni_ie_called called;
+ struct uni_ie_calledsub calledsub[UNI_NUM_IE_CALLEDSUB];
+ struct uni_ie_lij_callid lij_callid;
+ struct uni_ie_lij_seqno lij_seqno;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_leaf_setup_fail {
+ struct uni_msghdr hdr;
+ struct uni_ie_cause cause;
+ struct uni_ie_called called;
+ struct uni_ie_calledsub calledsub;
+ struct uni_ie_lij_seqno lij_seqno;
+ struct uni_ie_tns tns[UNI_NUM_IE_TNS];
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_cobisetup {
+ struct uni_msghdr hdr;
+ struct uni_ie_facility facility;
+ struct uni_ie_called called;
+ struct uni_ie_calledsub calledsub;
+ struct uni_ie_calling calling;
+ struct uni_ie_notify notify;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_facility {
+ struct uni_msghdr hdr;
+ struct uni_ie_facility facility;
+ struct uni_ie_called called;
+ struct uni_ie_calledsub calledsub;
+ struct uni_ie_calling calling;
+ struct uni_ie_notify notify;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_modify_req {
+ struct uni_msghdr hdr;
+ struct uni_ie_traffic traffic;
+ struct uni_ie_atraffic atraffic;
+ struct uni_ie_mintraffic mintraffic;
+ struct uni_ie_notify notify;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_modify_ack {
+ struct uni_msghdr hdr;
+ struct uni_ie_report report;
+ struct uni_ie_traffic traffic;
+ struct uni_ie_notify notify;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_modify_rej {
+ struct uni_msghdr hdr;
+ struct uni_ie_cause cause;
+ struct uni_ie_notify notify;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_conn_avail {
+ struct uni_msghdr hdr;
+ struct uni_ie_notify notify;
+ struct uni_ie_git git[UNI_NUM_IE_GIT];
+ struct uni_ie_report report;
+ struct uni_ie_unrec unrec;
+};
+
+struct uni_unknown {
+ struct uni_msghdr hdr;
+ struct uni_ie_epref epref;
+ struct uni_ie_unrec unrec;
+};
+
+union uni_msgall {
+ struct uni_msghdr hdr;
+ struct uni_alerting alerting;
+ struct uni_call_proc call_proc;
+ struct uni_connect connect;
+ struct uni_connect_ack connect_ack; /* !pnni */
+ struct uni_release release;
+ struct uni_release_compl release_compl;
+ struct uni_setup setup;
+ struct uni_status status;
+ struct uni_status_enq status_enq;
+ struct uni_notify notify;
+ struct uni_restart restart;
+ struct uni_restart_ack restart_ack;
+ struct uni_add_party add_party;
+ struct uni_add_party_ack add_party_ack;
+ struct uni_party_alerting party_alerting;
+ struct uni_add_party_rej add_party_rej;
+ struct uni_drop_party drop_party;
+ struct uni_drop_party_ack drop_party_ack;
+ struct uni_leaf_setup_req leaf_setup_req; /* !pnni */
+ struct uni_leaf_setup_fail leaf_setup_fail; /* !pnni */
+ struct uni_cobisetup cobisetup; /* !pnni&&q2932 */
+ struct uni_facility facility; /* !pnni&&q2932 */
+ struct uni_modify_req modify_req; /* !pnni */
+ struct uni_modify_ack modify_ack; /* !pnni */
+ struct uni_modify_rej modify_rej; /* !pnni */
+ struct uni_conn_avail conn_avail; /* !pnni */
+ struct uni_unknown unknown;
+};
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/msg/unimsglib.h b/sys/contrib/ngatm/netnatm/msg/unimsglib.h
new file mode 100644
index 0000000..f8489db
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/unimsglib.h
@@ -0,0 +1,168 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/msg/unimsglib.h,v 1.6 2004/07/08 08:22:07 brandt Exp $
+ */
+#ifndef _NETNATM_MSG_UNIMSGLIB_H_
+#define _NETNATM_MSG_UNIMSGLIB_H_
+
+#include <netnatm/msg/uni_config.h>
+
+struct uni_msg;
+
+enum uni_ierr_type {
+ UNI_IERR_UNK, /* unknown IE */
+ UNI_IERR_LEN, /* length error */
+ UNI_IERR_BAD, /* content error */
+ UNI_IERR_ACC, /* access element content error */
+ UNI_IERR_MIS, /* mandatory IE missing (not used here) */
+};
+
+struct uni_ierr {
+ enum uni_ierr_type err; /* what error */
+ enum uni_ieact act; /* the action indicator */
+ u_int ie:8; /* the ie type */
+ u_int man:1; /* mandatory flag */
+ u_int epref:1;/* Q.2971 9.5.3.2.1 low-pri epref */
+};
+
+/*
+ * Context buffer. Needed to reduce number of arguments to routines.
+ */
+struct unicx {
+ /*
+ * globals for error handling
+ */
+ u_int errcnt; /* number of bad IEs */
+ struct uni_ierr err[UNI_MAX_ERRIE]; /* the errors */
+
+ int q2932; /* Enable GFP */
+ int pnni; /* Enable PNNI */
+
+ int git_hard; /* do hard check on GIT IE */
+ int bearer_hard; /* do hard check on BEARER IE */
+ int cause_hard; /* do hard check on cause */
+
+ int multiline; /* printing mode */
+ u_int tabsiz; /* tabulation size */
+
+ /*
+ * Internal context of library -- don't touch
+ */
+ struct uni_ie_repeat repeat; /* repeat IE during decoding */
+ enum uni_ietype ielast; /* last IE seen for repeat handling */
+
+ const char *prefix[20];
+ u_int nprefix;
+ int doindent;
+ char *buf;
+ size_t bufsiz;
+ u_int indent; /* indentation */
+ int dont_init;
+};
+
+/*
+ * Functions for all messages
+ */
+void uni_print_cref(char *, size_t, const struct uni_cref *, struct unicx *);
+void uni_print_msghdr(char *, size_t, const struct uni_msghdr *, struct unicx *);
+void uni_print(char *, size_t, const struct uni_all *, struct unicx *);
+void uni_print_msg(char *, size_t, u_int _mtype, const union uni_msgall *,
+ struct unicx *);
+int uni_encode(struct uni_msg *, struct uni_all *, struct unicx *);
+int uni_decode(struct uni_msg *, struct uni_all *, struct unicx *);
+
+int uni_decode_head(struct uni_msg *, struct uni_all *, struct unicx *);
+int uni_decode_body(struct uni_msg *, struct uni_all *, struct unicx *);
+
+int uni_encode_msg_hdr(struct uni_msg *, struct uni_msghdr *, enum uni_msgtype,
+ struct unicx *, int *);
+
+
+/*
+ * Functions for all information elements
+ */
+void uni_print_ie(char *, size_t, enum uni_ietype, const union uni_ieall *,
+ struct unicx *);
+int uni_check_ie(enum uni_ietype, union uni_ieall *, struct unicx *);
+int uni_encode_ie(enum uni_ietype, struct uni_msg *, union uni_ieall *,
+ struct unicx *);
+int uni_decode_ie_hdr(enum uni_ietype *, struct uni_iehdr *, struct uni_msg *,
+ struct unicx *, u_int *);
+int uni_encode_ie_hdr(struct uni_msg *, enum uni_ietype, struct uni_iehdr *,
+ u_int, struct unicx *);
+int uni_decode_ie_body(enum uni_ietype, union uni_ieall *, struct uni_msg *,
+ u_int, struct unicx *);
+
+
+/*
+ * Context handling
+ */
+void uni_initcx(struct unicx *);
+void uni_print_cx(char *, size_t, struct unicx *);
+
+#define UNI_SAVE_IERR(CX, IETYPE, ACT, ERRCODE) \
+ (((CX)->errcnt < UNI_MAX_ERRIE) ? \
+ ((CX)->err[(CX)->errcnt].ie = (IETYPE), \
+ (CX)->err[(CX)->errcnt].act = (ACT), \
+ (CX)->err[(CX)->errcnt].err = (ERRCODE), \
+ (CX)->err[(CX)->errcnt].man = 0, \
+ (CX)->errcnt++, \
+ 1) : 0)
+
+/*
+ * Traffic classification
+ */
+enum uni_traffic_class {
+ UNI_TRAFFIC_CBR1,
+ UNI_TRAFFIC_CBR2,
+ UNI_TRAFFIC_CBR3,
+ UNI_TRAFFIC_rtVBR1,
+ UNI_TRAFFIC_rtVBR2,
+ UNI_TRAFFIC_rtVBR3,
+ UNI_TRAFFIC_rtVBR4,
+ UNI_TRAFFIC_rtVBR5,
+ UNI_TRAFFIC_rtVBR6,
+ UNI_TRAFFIC_nrtVBR1,
+ UNI_TRAFFIC_nrtVBR2,
+ UNI_TRAFFIC_nrtVBR3,
+ UNI_TRAFFIC_nrtVBR4,
+ UNI_TRAFFIC_nrtVBR5,
+ UNI_TRAFFIC_nrtVBR6,
+ UNI_TRAFFIC_ABR,
+ UNI_TRAFFIC_UBR1,
+ UNI_TRAFFIC_UBR2,
+};
+
+/* classify traffic */
+int uni_classify_traffic(const struct uni_ie_bearer *,
+ const struct uni_ie_traffic *,
+ enum uni_traffic_class *, enum uni_traffic_class *,
+ char *, size_t);
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/msg/uniprint.h b/sys/contrib/ngatm/netnatm/msg/uniprint.h
new file mode 100644
index 0000000..239fa2d
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/uniprint.h
@@ -0,0 +1,72 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/msg/uniprint.h,v 1.4 2004/07/08 08:22:08 brandt Exp $
+ *
+ * Print utility functions. These are only needed if you want to hook to
+ * the format of the uni printing routines.
+ */
+#ifndef _NETNATM_MSG_UNIPRINT_H_
+#define _NETNATM_MSG_UNIPRINT_H_
+
+#include <netnatm/msg/uni_config.h>
+
+/*
+ * This structure is used to define value->string mappings.
+ * It must be terminated by a { NULL, 0 } entry.
+ */
+struct uni_print_tbl {
+ const char *name;
+ u_int val;
+};
+void uni_print_tbl(const char *_entry, u_int _val,
+ const struct uni_print_tbl *_tbl, struct unicx *_cx);
+
+/* initialize printing. This must be called at the start from each external
+ * callable printing function. */
+void uni_print_init(char *_buf, size_t _bufsiz, struct unicx *_cx);
+
+/* End the current (semantical) line. This takes care of indendation and
+ * actually print the newline in the appropriate modes. */
+void uni_print_eol(struct unicx *_cx);
+
+/* Push or pop a prefix. This takes care of indendation. */
+void uni_print_push_prefix(const char *_prefix, struct unicx *_cx);
+void uni_print_pop_prefix(struct unicx *_cx);
+
+/* Print a flag taking care of the right prefixing */
+void uni_print_flag(const char *_flag, struct unicx *_cx);
+
+/* Print an entry taking care of the right prefixing */
+void uni_print_entry(struct unicx *_cx, const char *_entry,
+ const char *_fmt, ...) __printflike(3, 4);
+
+/* Generic printf */
+void uni_printf(struct unicx *_cx, const char *_fmt, ...) __printflike(2, 3);
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/msg/unistruct.h b/sys/contrib/ngatm/netnatm/msg/unistruct.h
new file mode 100644
index 0000000..ceb1f5b
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/msg/unistruct.h
@@ -0,0 +1,1371 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/msg/unistruct.h,v 1.7 2004/07/16 18:42:22 brandt Exp $
+ *
+ * This file defines all structures that are used by
+ * API users.
+ */
+#ifndef _NETNATM_MSG_UNISTRUCT_H_
+#define _NETNATM_MSG_UNISTRUCT_H_
+
+#include <netnatm/msg/uni_config.h>
+
+/*
+ * define IE and MSG header
+ */
+#include <netnatm/msg/uni_hdr.h>
+
+/*
+ * define all IE's
+ */
+/*************************************************************************
+ *
+ * Free FORM IE
+ */
+struct uni_ie_unrec {
+ struct uni_iehdr h;
+ uint8_t id; /* ID of this IE */
+ u_int len; /* data length */
+ u_char data[128]; /* arbitrary maximum length */
+};
+
+/*************************************************************************
+ *
+ * ATM adaptation layer parameters information element
+ */
+enum {
+ UNI_AAL_SUB_ID = 0x85,
+ UNI_AAL_CBR_ID = 0x86,
+ UNI_AAL_MULT_ID = 0x87,
+ UNI_AAL_SCREC_ID = 0x88,
+ UNI_AAL_ECM_ID = 0x89,
+ UNI_AAL_BSIZE_ID = 0x8a,
+ UNI_AAL_PART_ID = 0x8b,
+ UNI_AAL_FWDCPCS_ID = 0x8c,
+ UNI_AAL_BWDCPCS_ID = 0x81,
+ UNI_AAL_MID_ID = 0x82,
+ UNI_AAL_SSCS_ID = 0x84,
+};
+
+enum uni_aal {
+ UNI_AAL_0 = 0x00, /* voice */
+ UNI_AAL_1 = 0x01,
+ UNI_AAL_2 = 0x02,
+ UNI_AAL_4 = 0x03, /* same as AAL 3 */
+ UNI_AAL_5 = 0x05,
+ UNI_AAL_USER = 0x10,
+};
+enum uni_aal1_subtype {
+ UNI_AAL1_SUB_NULL = 0x00,
+ UNI_AAL1_SUB_VOICE = 0x01,
+ UNI_AAL1_SUB_CIRCUIT = 0x02,
+ UNI_AAL1_SUB_HQAUDIO = 0x04,
+ UNI_AAL1_SUB_VIDEO = 0x05,
+};
+enum uni_aal1_cbr {
+ UNI_AAL1_CBR_64 = 0x01,
+ UNI_AAL1_CBR_1544 = 0x04,
+ UNI_AAL1_CBR_6312 = 0x05,
+ UNI_AAL1_CBR_32064 = 0x06,
+ UNI_AAL1_CBR_44736 = 0x07,
+ UNI_AAL1_CBR_97728 = 0x08,
+ UNI_AAL1_CBR_2048 = 0x10,
+ UNI_AAL1_CBR_8448 = 0x11,
+ UNI_AAL1_CBR_34368 = 0x12,
+ UNI_AAL1_CBR_139264 = 0x13,
+ UNI_AAL1_CBR_N64 = 0x40,
+ UNI_AAL1_CBR_N8 = 0x41,
+};
+enum uni_aal1_screc {
+ UNI_AAL1_SCREC_NULL = 0x00, /* synchr. circuit transport */
+ UNI_AAL1_SCREC_SRTS = 0x01, /* synchr. residual timestamp */
+ UNI_AAL1_SCREC_ACLK = 0x02, /* adaptive clock */
+};
+enum uni_aal1_ecm {
+ UNI_AAL1_ECM_NULL = 0x00, /* no error correction */
+ UNI_AAL1_ECM_LOSS = 0x01, /* for loss sensitive signals */
+ UNI_AAL1_ECM_DELAY = 0x02, /* for delay sensitive signals */
+};
+enum uni_aal_sscs {
+ UNI_AAL_SSCS_NULL = 0x00, /* Null */
+ UNI_AAL_SSCS_SSCOPA = 0x01, /* assured SSCOP */
+ UNI_AAL_SSCS_SSCOPU = 0x02, /* unassured SSCOP */
+ UNI_AAL_SSCS_FRAME = 0x04, /* frame relay */
+};
+
+struct uni_ie_aal {
+ struct uni_iehdr h;
+ enum uni_aal type; /* aal type */
+
+ union {
+#define UNI_AAL1_MULT_P 0x01
+#define UNI_AAL1_SCREC_P 0x02
+#define UNI_AAL1_ECM_P 0x04
+#define UNI_AAL1_BSIZE_P 0x08
+#define UNI_AAL1_PART_P 0x10
+ struct {
+ enum uni_aal1_subtype subtype; /* AAL1 subtype */
+ enum uni_aal1_cbr cbr_rate; /* AAL1 CBR rate */
+ u_int mult; /* AAL1 CBR mutliplier */
+ enum uni_aal1_screc screc; /* AAL1 source clock recovery */
+ enum uni_aal1_ecm ecm; /* AAL1 error correction */
+ u_int bsize; /* AAL1 SDT blocksize */
+ u_int part; /* AAL1 partial cell fill */
+ } aal1;
+
+#define UNI_AAL4_CPCS_P 0x01
+#define UNI_AAL4_MID_P 0x02
+#define UNI_AAL4_SSCS_P 0x04
+ struct {
+ u_int fwd_cpcs; /* max fwd cpcs blocksize */
+ u_int bwd_cpcs; /* max bkw cpcs blocksize */
+ u_int mid_low; /* MID low range */
+ u_int mid_high; /* MID high range */
+ enum uni_aal_sscs sscs; /* sscs type */
+ } aal4;
+
+#define UNI_AAL5_CPCS_P 0x01
+#define UNI_AAL5_SSCS_P 0x02
+ struct {
+ u_int fwd_cpcs; /* max fwd cpcs blocksize */
+ u_int bwd_cpcs; /* max bkw cpcs blocksize */
+ enum uni_aal_sscs sscs; /* sscs type */
+ } aal5;
+
+ struct {
+ u_int len; /* number of bytes */
+ u_char user[4]; /* user data */
+ } aalu;
+ } u;
+};
+
+/*************************************************************************
+ *
+ * Called party number information element
+ * Called party subaddress information element
+ * Calling party number information element
+ * Calling party subaddress information element
+ * Q.2951/UNI4.0 Connected number information element
+ * Q.2951/UNI4.0 Connected subaddress information element
+ */
+enum uni_addr_type {
+ UNI_ADDR_UNKNOWN = 0x0,
+ UNI_ADDR_INTERNATIONAL = 0x1,
+ UNI_ADDR_NATIONAL = 0x2, /* not sup */
+ UNI_ADDR_NETWORK = 0x3, /* not sup */
+ UNI_ADDR_SUBSCR = 0x4, /* not sup */
+ UNI_ADDR_ABBR = 0x6, /* not sup */
+};
+enum uni_addr_plan {
+ /* UNI_ADDR_UNKNOWN = 0x0, */ /* not sup */
+ UNI_ADDR_E164 = 0x1,
+ UNI_ADDR_ATME = 0x2,
+ UNI_ADDR_DATA = 0x3, /* not sup */
+ UNI_ADDR_PRIVATE = 0x9, /* not sup */
+};
+enum uni_subaddr_type {
+ UNI_SUBADDR_NSAP = 0x0,
+ UNI_SUBADDR_ATME = 0x1,
+ UNI_SUBADDR_USER = 0x2, /* not sup */
+};
+enum uni_addr_pres {
+ UNI_ADDR_PRES = 0x0,
+ UNI_ADDR_RESTRICT = 0x1,
+ UNI_ADDR_NONUMBER = 0x2,
+};
+enum uni_addr_screen {
+ UNI_ADDR_SCREEN_NOT = 0x0,
+ UNI_ADDR_SCREEN_PASSED = 0x1,
+ UNI_ADDR_SCREEN_FAILED = 0x2,
+ UNI_ADDR_SCREEN_NET = 0x3,
+};
+
+/* don't use bitfields to get a defined structure layout */
+struct uni_addr {
+ uint8_t type;
+ uint8_t plan;
+ uint8_t len;
+ u_char addr[UNI_ADDR_MAXLEN];
+};
+struct uni_subaddr {
+ enum uni_subaddr_type type;
+ u_int len;
+ u_char addr[UNI_SUBADDR_MAXLEN];
+};
+
+struct uni_ie_called {
+ struct uni_iehdr h;
+ struct uni_addr addr;
+};
+
+struct uni_ie_calledsub {
+ struct uni_iehdr h;
+ struct uni_subaddr addr;
+};
+
+struct uni_ie_calling {
+ struct uni_iehdr h;
+#define UNI_CALLING_SCREEN_P 0x0001
+
+ struct uni_addr addr;
+ enum uni_addr_pres pres;
+ enum uni_addr_screen screen;
+};
+
+struct uni_ie_callingsub {
+ struct uni_iehdr h;
+ struct uni_subaddr addr;
+};
+
+struct uni_ie_conned {
+ struct uni_iehdr h;
+#define UNI_CONNED_SCREEN_P 0x0001
+
+ struct uni_addr addr;
+ enum uni_addr_pres pres;
+ enum uni_addr_screen screen;
+};
+
+struct uni_ie_connedsub {
+ struct uni_iehdr h;
+ struct uni_subaddr addr;
+};
+
+/*************************************************************************
+ *
+ * Broadband bearer capability descriptor
+ * On reception of an old bearer descriptor, it is automatically
+ * converted to a new, legal one.
+ */
+enum uni_bearer_class {
+ UNI_BEARER_A = 0x01,
+ UNI_BEARER_C = 0x03,
+ UNI_BEARER_X = 0x10,
+ UNI_BEARER_TVP = 0x30,
+};
+
+enum uni_bearer_atc {
+ UNI_BEARER_ATC_CBR = 0x05,
+ UNI_BEARER_ATC_CBR1 = 0x07,
+ UNI_BEARER_ATC_VBR = 0x09,
+ UNI_BEARER_ATC_VBR1 = 0x13,
+ UNI_BEARER_ATC_NVBR = 0x0a,
+ UNI_BEARER_ATC_NVBR1 = 0x0b,
+ UNI_BEARER_ATC_ABR = 0x0c,
+
+ UNI_BEARER_ATCX_0 = 0x00,
+ UNI_BEARER_ATCX_1 = 0x01,
+ UNI_BEARER_ATCX_2 = 0x02,
+ UNI_BEARER_ATCX_4 = 0x04,
+ UNI_BEARER_ATCX_6 = 0x06,
+ UNI_BEARER_ATCX_8 = 0x08,
+};
+
+enum uni_bearer_clip {
+ UNI_BEARER_NOCLIP = 0x0,
+ UNI_BEARER_CLIP = 0x1,
+};
+
+enum uni_bearer_cfg {
+ UNI_BEARER_P2P = 0x0,
+ UNI_BEARER_MP = 0x1,
+};
+
+struct uni_ie_bearer {
+ struct uni_iehdr h;
+#define UNI_BEARER_ATC_P 0x02
+
+ enum uni_bearer_class bclass; /* bearer class */
+ enum uni_bearer_atc atc; /* ATM transfer capability */
+ enum uni_bearer_clip clip; /* suspectibility to clipping */
+ enum uni_bearer_cfg cfg; /* u-plane configuration */
+};
+
+/*************************************************************************
+ *
+ * Broadband higher layer information element
+ */
+enum uni_bhli {
+ UNI_BHLI_ISO = 0x00, /* IDO defined */
+ UNI_BHLI_USER = 0x01, /* user specific */
+ UNI_BHLI_VENDOR = 0x03, /* vendor specific */
+};
+
+struct uni_ie_bhli {
+ struct uni_iehdr h;
+ enum uni_bhli type;
+ u_char info[8];
+ u_int len;
+};
+
+/*************************************************************************
+ *
+ * Boradband lower layer information element
+ */
+enum {
+ UNI_BLLI_L1_ID = 0x1,
+ UNI_BLLI_L2_ID = 0x2,
+ UNI_BLLI_L3_ID = 0x3,
+};
+
+enum uni_blli_l2 {
+ UNI_BLLI_L2_BASIC = 0x01,
+ UNI_BLLI_L2_Q921 = 0x02,
+ UNI_BLLI_L2_X25LL = 0x06,
+ UNI_BLLI_L2_X25ML = 0x07,
+ UNI_BLLI_L2_LABP = 0x08,
+ UNI_BLLI_L2_HDLC_ARM = 0x09,
+ UNI_BLLI_L2_HDLC_NRM = 0x0a,
+ UNI_BLLI_L2_HDLC_ABM = 0x0b,
+ UNI_BLLI_L2_LAN = 0x0c,
+ UNI_BLLI_L2_X75 = 0x0d,
+ UNI_BLLI_L2_Q922 = 0x0e,
+ UNI_BLLI_L2_USER = 0x10,
+ UNI_BLLI_L2_ISO7776 = 0x11,
+};
+
+enum uni_blli_l2_mode {
+ UNI_BLLI_L2NORM = 0x1,
+ UNI_BLLI_L2EXT = 0x2,
+};
+
+enum uni_blli_l3 {
+ UNI_BLLI_L3_X25 = 0x06,
+ UNI_BLLI_L3_ISO8208 = 0x07,
+ UNI_BLLI_L3_X223 = 0x08,
+ UNI_BLLI_L3_CLMP = 0x09,
+ UNI_BLLI_L3_T70 = 0x0a,
+ UNI_BLLI_L3_TR9577 = 0x0b,
+ UNI_BLLI_L3_H310 = 0x0c,
+ UNI_BLLI_L3_H321 = 0x0d,
+ UNI_BLLI_L3_USER = 0x10,
+};
+
+enum uni_blli_l3_mode {
+ UNI_BLLI_L3NSEQ = 0x1, /* normal sequence numbering */
+ UNI_BLLI_L3ESEQ = 0x2, /* extended sequence numbering */
+};
+
+enum uni_blli_l3_psiz {
+ UNI_BLLI_L3_16 = 0x4, /* 16 byte packets */
+ UNI_BLLI_L3_32 = 0x5, /* 32 byte packets */
+ UNI_BLLI_L3_64 = 0x6, /* 64 byte packets */
+ UNI_BLLI_L3_128 = 0x7, /* 128 byte packets */
+ UNI_BLLI_L3_256 = 0x8, /* 256 byte packets */
+ UNI_BLLI_L3_512 = 0x9, /* 512 byte packets */
+ UNI_BLLI_L3_1024 = 0xa, /* 1024 byte packets */
+ UNI_BLLI_L3_2048 = 0xb, /* 2048 byte packets */
+ UNI_BLLI_L3_4096 = 0xc, /* 4096 byte packets */
+};
+
+enum uni_blli_l3_ttype {
+ UNI_BLLI_L3_TTYPE_RECV = 0x1, /* receive only */
+ UNI_BLLI_L3_TTYPE_SEND = 0x2, /* send only */
+ UNI_BLLI_L3_TTYPE_BOTH = 0x3, /* both */
+};
+
+enum uni_blli_l3_mux {
+ UNI_BLLI_L3_MUX_NOMUX = 0, /* no multiplexing */
+ UNI_BLLI_L3_MUX_TS = 1, /* transport stream */
+ UNI_BLLI_L3_MUX_TSFEC = 2, /* transport stream with FEC */
+ UNI_BLLI_L3_MUX_PS = 3, /* program stream */
+ UNI_BLLI_L3_MUX_PSFEC = 4, /* program stream with FEC */
+ UNI_BLLI_L3_MUX_H221 = 5, /* H.221 */
+};
+
+enum uni_blli_l3_tcap {
+ UNI_BLLI_L3_TCAP_NOIND = 0, /* no indication */
+ UNI_BLLI_L3_TCAP_AAL1 = 1, /* only AAL1 */
+ UNI_BLLI_L3_TCAP_AAL5 = 2, /* only AAL5 */
+ UNI_BLLI_L3_TCAP_AAL15 = 3, /* AAL1 and AAL5 */
+};
+
+/* Value for l3_ipi: */
+enum {
+ UNI_BLLI_L3_SNAP = 0x80, /* IEEE 802.1 SNAP */
+};
+
+struct uni_ie_blli {
+ struct uni_iehdr h;
+#define UNI_BLLI_L1_P 0x0001
+#define UNI_BLLI_L2_P 0x0002
+#define UNI_BLLI_L2_Q933_P 0x0004
+#define UNI_BLLI_L2_WSIZ_P 0x0008
+#define UNI_BLLI_L2_USER_P 0x0010
+#define UNI_BLLI_L3_P 0x0020
+#define UNI_BLLI_L3_MODE_P 0x0040
+#define UNI_BLLI_L3_PSIZ_P 0x0080
+#define UNI_BLLI_L3_WSIZ_P 0x0100
+#define UNI_BLLI_L3_USER_P 0x0200
+#define UNI_BLLI_L3_IPI_P 0x0400
+#define UNI_BLLI_L3_SNAP_P 0x0800
+#define UNI_BLLI_L3_TTYPE_P 0x1000
+#define UNI_BLLI_L3_MUX_P 0x2000
+
+ u_int l1:5; /* layer 1 info */
+
+ enum uni_blli_l2 l2; /* layer 2 info */
+ u_int l2_q933:2; /* layer 2 Q.933 use */
+ enum uni_blli_l2_mode l2_mode; /* layer 2 HDLC mode */
+ u_char l2_user; /* layer 2 user info */
+ u_char l2_wsiz; /* layer 2 window size */
+
+ enum uni_blli_l3 l3; /* layer 3 info */
+ enum uni_blli_l3_mode l3_mode; /* layer 3 mode */
+ enum uni_blli_l3_psiz l3_psiz; /* layer 3 default packet size */
+ u_char l3_wsiz; /* layer 3 window size */
+ u_char l3_user; /* layer 3 user info */
+ u_char l3_ipi; /* IPI byte */
+ u_int oui; /* OUI bytes */
+ u_int pid; /* PID bytes */
+ enum uni_blli_l3_ttype l3_ttype; /* terminal bytes */
+ enum uni_blli_l3_tcap l3_tcap; /* terminal capability */
+ enum uni_blli_l3_mux l3_fmux; /* forward muxing */
+ enum uni_blli_l3_mux l3_bmux; /* forward muxing */
+};
+
+/*************************************************************************
+ *
+ * Transit network selection IE
+ */
+struct uni_ie_tns {
+ struct uni_iehdr h;
+ u_char net[UNI_TNS_MAXLEN];
+ u_int len;
+};
+
+/*************************************************************************
+ *
+ * Call state information element
+ */
+enum uni_callstate {
+ UNI_CALLSTATE_U0 = 0x00,
+ UNI_CALLSTATE_N0 = 0x00,
+ UNI_CALLSTATE_NN0 = 0x00,
+
+ UNI_CALLSTATE_U1 = 0x01,
+ UNI_CALLSTATE_N1 = 0x01,
+ UNI_CALLSTATE_NN1 = 0x01,
+
+ UNI_CALLSTATE_U3 = 0x03,
+ UNI_CALLSTATE_N3 = 0x03,
+ UNI_CALLSTATE_NN3 = 0x03,
+
+ UNI_CALLSTATE_U4 = 0x04,
+ UNI_CALLSTATE_N4 = 0x04,
+ UNI_CALLSTATE_NN4 = 0x04,
+
+ UNI_CALLSTATE_U6 = 0x06,
+ UNI_CALLSTATE_N6 = 0x06,
+ UNI_CALLSTATE_NN6 = 0x06,
+
+ UNI_CALLSTATE_U7 = 0x07,
+ UNI_CALLSTATE_N7 = 0x07,
+ UNI_CALLSTATE_NN7 = 0x07,
+
+ UNI_CALLSTATE_U8 = 0x08,
+ UNI_CALLSTATE_N8 = 0x08,
+
+ UNI_CALLSTATE_U9 = 0x09,
+ UNI_CALLSTATE_N9 = 0x09,
+ UNI_CALLSTATE_NN9 = 0x09,
+
+ UNI_CALLSTATE_U10 = 0x0a,
+ UNI_CALLSTATE_N10 = 0x0a,
+ UNI_CALLSTATE_NN10 = 0x0a,
+
+ UNI_CALLSTATE_U11 = 0x0b,
+ UNI_CALLSTATE_N11 = 0x0b,
+ UNI_CALLSTATE_NN11 = 0x0b,
+
+ UNI_CALLSTATE_U12 = 0x0c,
+ UNI_CALLSTATE_N12 = 0x0c,
+ UNI_CALLSTATE_NN12 = 0x0c,
+
+ UNI_CALLSTATE_REST0 = 0x00,
+ UNI_CALLSTATE_REST1 = 0x3d,
+ UNI_CALLSTATE_REST2 = 0x3e,
+
+ UNI_CALLSTATE_U13 = 0x0d,
+ UNI_CALLSTATE_N13 = 0x0d,
+
+ UNI_CALLSTATE_U14 = 0x0e,
+ UNI_CALLSTATE_N14 = 0x0e,
+};
+
+struct uni_ie_callstate {
+ struct uni_iehdr h;
+ enum uni_callstate state;
+};
+
+/*************************************************************************
+ *
+ * Cause information element
+ */
+enum uni_cause_loc {
+ UNI_CAUSE_LOC_USER = 0x0,
+ UNI_CAUSE_LOC_PRIVLOC = 0x1,
+ UNI_CAUSE_LOC_PUBLOC = 0x2,
+ UNI_CAUSE_LOC_TRANSIT = 0x3,
+ UNI_CAUSE_LOC_PUBREM = 0x4,
+ UNI_CAUSE_LOC_PRIVREM = 0x5,
+ UNI_CAUSE_LOC_INTERNAT = 0x6,
+ UNI_CAUSE_LOC_BEYOND = 0x7,
+};
+
+#define UNI_DECLARE_CAUSE_VALUES \
+D(UNALL_NUM, 0x01 /* 1*/, COND, Q.850, "Unallocated (unassigned) number") \
+D(NOROUTE_NET, 0x02 /* 2*/, TNS, Q.850, "No route to specified transit network") \
+D(NOROUTE, 0x03 /* 3*/, COND, Q.850, "No route to destination") \
+D(SPTONE, 0x04 /* 4*/, NONE, Q.850, "Send special information tone") \
+D(BADTRUNK, 0x05 /* 5*/, NONE, Q.850, "Misdialled trunk prefix") \
+D(BADCHAN, 0x06 /* 6*/, NONE, Q.850, "Channel unacceptable") \
+D(CALLAWARDED, 0x07 /* 7*/, NONE, Q.850, "Call awarded and being delivered in an established channel") \
+D(PREEMPT, 0x08 /* 8*/, NONE, Q.850, "Preemption") \
+D(PREEMPT_RES, 0x09 /* 9*/, NONE, Q.850, "Preemption - circuit reserved for reuse") \
+D(CLEARING, 0x10 /* 16*/, COND, Q.850, "Normal call clearing") \
+D(BUSY, 0x11 /* 17*/, CCBS, Q.850, "User busy") \
+D(NO_RESPONSE, 0x12 /* 18*/, NONE, Q.850, "No user responding") \
+D(NO_RESP_ALERT,0x13 /* 19*/, NONE, Q.850, "No answer from user (user alerted)") \
+D(ABSENT, 0x14 /* 20*/, NONE, Q.850, "Subscriber absent") \
+D(REJECTED, 0x15 /* 21*/, REJ, Q.850, "Call rejected") \
+D(NUMCHG, 0x16 /* 22*/, NUMBER, Q.850, "Number changed") \
+D(REDIR, 0x17 /* 23*/, NONE, Q.850, "Redirection to new destination") \
+N(CLIR_REJECTED,0x17 /* 23*/, NONE, UNI4.0, "User rejects call with calling line identification restriction (CLIR)") \
+D(EXCHG_ERR, 0x19 /* 25*/, NONE, Q.850, "Exchange routing error") \
+D(NOSEL_CLEAR, 0x1a /* 26*/, NONE, Q.850, "Non-selected user clearing") \
+D(DST_OOO, 0x1b /* 27*/, NONE, Q.850, "Destination out of order") \
+D(INV_ADDR, 0x1c /* 28*/, NONE, Q.850, "Invalid number format (address incomplete)") \
+D(FAC_REJ, 0x1d /* 29*/, FAC, Q.850, "Facility rejected") \
+D(STATUS, 0x1e /* 30*/, NONE, Q.850, "Response to STATUS ENQUIRY") \
+D(UNSPEC, 0x1f /* 31*/, NONE, Q.850, "Normal, unspecified") \
+D(TMY_PARTY, 0x20 /* 32*/, NONE, Q.2971, "Too many pending add party requests") \
+D(NOCHAN, 0x22 /* 34*/, CCBS, Q.850, "No circuit/channel available") \
+N(SOFT_NAVL, 0x22 /* 34*/, NONE, PNNI1.0,"Requested called party soft PVPC or PVCC not available")\
+D(VPCI_NAVL, 0x23 /* 35*/, NONE, Q.2610, "Requested VPCI/VCI not available") \
+D(VPCI_FAIL, 0x24 /* 36*/, NONE, Q.2610, "VPCI/VPI assignment failure") \
+D(CRATE_NAVL, 0x25 /* 37*/, CRATE, Q.2610, "User cell rate not available") \
+D(NET_OOO, 0x26 /* 38*/, NONE, Q.850, "Network out of order") \
+D(FRAME_OOS, 0x27 /* 39*/, NONE, Q.850, "Permanent frame mode connection out of service") \
+D(FRAME_OP, 0x28 /* 40*/, NONE, Q.850, "Permanent frame mode connection operational") \
+D(TEMP, 0x29 /* 41*/, NONE, Q.850, "Temporary failure") \
+D(CONG, 0x2a /* 42*/, NONE, Q.850, "Switching equipment congestion") \
+D(ACC_DISC, 0x2b /* 43*/, IE, Q.850, "Access information discarded") \
+D(REQNOCHAN, 0x2c /* 44*/, NONE, Q.850, "Requested circuit/channel not available") \
+D(NOVPCI, 0x2d /* 45*/, NONE, Q.2610, "No VPCI/VCI available") \
+D(PREC_BLOCK, 0x2e /* 46*/, NONE, Q.850, "Precedence call blocked") \
+D(RESRC_NAVL, 0x2f /* 47*/, NONE, Q.850, "Resource unavailable, unspecified") \
+D(QOS_NAVL, 0x31 /* 49*/, COND, Q.850, "Quality of service not available") \
+D(FAC_NOTSUB, 0x32 /* 50*/, FAC, Q.850, "Requested facility not subscribed") \
+D(OUT_CUG, 0x35 /* 53*/, NONE, Q.850, "Outgoing calls barred within CUG") \
+N(PGL_CHG, 0x35 /* 53*/, NONE, PNNI1.0,"Call cleared due to change in PGL") \
+D(IN_CUG, 0x37 /* 55*/, NONE, Q.850, "Incoming call barred within CUG") \
+D(BEARER_NAUTH, 0x39 /* 57*/, ATTR, Q.850, "Bearer capability not authorized") \
+D(BEARER_NAVL, 0x3a /* 58*/, ATTR, Q.850, "Bearer capability not presently available") \
+D(INCONS, 0x3e /* 62*/, NONE, Q.850, "Inconsistency in designated outgoing access information and subscriber class") \
+D(OPT_NAVL, 0x3f /* 63*/, NONE, Q.850, "Service or option not available, unspecified") \
+D(BEARER_NIMPL, 0x41 /* 65*/, ATTR, Q.850, "Bearer capability not implemented") \
+D(CHANNEL_NIMPL,0x42 /* 66*/, CHANNEL, Q.850, "Channel type not implemented") \
+D(FAC_NIMPL, 0x45 /* 69*/, FAC, Q.850, "Requested facility not implemented") \
+D(RESTR_DIG, 0x46 /* 70*/, NONE, Q.850, "Only restricted digital information bearer capability is available") \
+D(TRAFFIC_UNSUP,0x49 /* 73*/, NONE, Q.2971, "Unsupported combination of traffic parameters") \
+N(AAL_UNSUP, 0x4c /* 78*/, NONE, UNI3.1, "AAL parameters cannot be supported") \
+D(CREF_INV, 0x51 /* 81*/, NONE, Q.850, "Invalid call reference value") \
+D(CHANNEL_NEX, 0x52 /* 82*/, CHANID, Q.850, "Identified channel does not exist") \
+D(SUSPENDED, 0x53 /* 83*/, NONE, Q.850, "A suspended call exists, but this call identity does not") \
+D(CID_INUSE, 0x54 /* 84*/, NONE, Q.850, "Call identity in use") \
+D(NOTSUSP, 0x55 /* 85*/, NONE, Q.850, "No call suspended") \
+D(CLEARED, 0x56 /* 86*/, CAUSE, Q.850, "Call having requested call identity has been cleared") \
+D(NOT_MEMBER, 0x57 /* 87*/, NONE, Q.850, "User not member of CUG") \
+D(INCOMP, 0x58 /* 88*/, PARAM, Q.850, "Incompatible destination") \
+D(ENDP_INV, 0x59 /* 89*/, IE, UNI3.1, "Invalid endpoint reference") \
+D(NEX_CUG, 0x5a /* 90*/, NONE, Q.850, "Non-existend CUG") \
+D(TRANSIT_INV, 0x5b /* 91*/, NONE, Q.850, "Invalid transit network selection") \
+D(AALNOTSUPP, 0x5d /* 93*/, NONE, Q.2610, "AAL parameters cannot be supported") \
+D(INVMSG, 0x5f /* 95*/, NONE, Q.850, "Invalid message, unspecified") \
+D(MANDAT, 0x60 /* 96*/, IE, Q.850, "Mandatory information element is missing") \
+D(MTYPE_NIMPL, 0x61 /* 97*/, MTYPE, Q.850, "Message type non-existent or not implemented") \
+D(MSG_NOTCOMP, 0x62 /* 98*/, MTYPE, Q.850, "Message not compatible with call state or message type non-existent or not implemented") \
+D(IE_NIMPL, 0x63 /* 99*/, IE, Q.850, "Information element/parameter non-existent or not implemented") \
+D(IE_INV, 0x64 /*100*/, IE, Q.850, "Invalid information element contents") \
+D(MSG_INCOMP, 0x65 /*101*/, MTYPE, Q.850, "Message not compatible with call state") \
+D(RECOVER, 0x66 /*102*/, TIMER, Q.850, "Recovery on timer expiry") \
+D(PARAM_NEX, 0x67 /*103*/, PARAM, Q.850, "Parameter non-existent or not implemented, passed on") \
+N(BAD_LENGTH, 0x68 /*104*/, NONE, UNI3.1, "Incorrect message length") \
+D(PARAM_UNREC, 0x6e /*110*/, PARAM, Q.850, "Message with unrecognized parameter, discarded") \
+D(PROTO, 0x6f /*111*/, NONE, Q.850, "Protocol error, unspecified") \
+D(INTERWORKING, 0x7f /*127*/, NONE, Q.850, "Interworking, unspecified")
+
+#define D(NAME,VAL,DIAG,STD,STR) UNI_CAUSE_##NAME = VAL,
+#define N(NAME,VAL,DIAG,STD,STR) UNI_CAUSE_##NAME = VAL,
+
+enum uni_cause {
+UNI_DECLARE_CAUSE_VALUES
+};
+
+#undef D
+#undef N
+
+enum uni_cause_class {
+ UNI_CAUSE_CLASS_NORM = 0x0,
+ UNI_CAUSE_CLASS_NORM1 = 0x1,
+ UNI_CAUSE_CLASS_RES = 0x2,
+ UNI_CAUSE_CLASS_NAVL = 0x3,
+ UNI_CAUSE_CLASS_NIMPL = 0x4,
+ UNI_CAUSE_CLASS_INV = 0x5,
+ UNI_CAUSE_CLASS_PROTO = 0x6,
+ UNI_CAUSE_CLASS_INTER = 0x7,
+};
+enum uni_cause_pu {
+ UNI_CAUSE_PU_PROVIDER = 0,
+ UNI_CAUSE_PU_USER = 1,
+};
+enum uni_cause_na {
+ UNI_CAUSE_NA_NORMAL = 0,
+ UNI_CAUSE_NA_ABNORMAL = 1,
+};
+enum uni_cause_cond {
+ UNI_CAUSE_COND_UNKNOWN = 0,
+ UNI_CAUSE_COND_PERM = 1,
+ UNI_CAUSE_COND_TRANS = 2,
+};
+enum uni_cause_reason {
+ UNI_CAUSE_REASON_USER = 0x00,
+ UNI_CAUSE_REASON_IEMISS = 0x01,
+ UNI_CAUSE_REASON_IESUFF = 0x02,
+};
+
+enum uni_diag {
+ UNI_DIAG_NONE, /* no diagnostics */
+
+ UNI_DIAG_COND, /* Condition */
+ UNI_DIAG_TNS, /* Transit Network Selector */
+ UNI_DIAG_REJ, /* Call Rejected */
+ UNI_DIAG_NUMBER, /* New Destination */
+ UNI_DIAG_CRATE, /* Traffic descriptor subfield */
+ UNI_DIAG_ATTR, /* Attribute idendity */
+ UNI_DIAG_PARAM, /* Parameter, same as one IE */
+ UNI_DIAG_TIMER, /* timer in ASCII */
+ UNI_DIAG_MTYPE, /* Message type */
+ UNI_DIAG_IE, /* Information element */
+ UNI_DIAG_CHANID, /* VPCI/VCI */
+
+ UNI_DIAG_CAUSE = UNI_DIAG_NONE, /* Not specified */
+ UNI_DIAG_CHANNEL = UNI_DIAG_NONE, /* For N-ISDN */
+ UNI_DIAG_CCBS = UNI_DIAG_NONE, /* Not used in Q.931 */
+ UNI_DIAG_FAC = UNI_DIAG_NONE, /* Not specified */
+};
+
+enum {
+ UNI_CAUSE_TRAFFIC_N = 34-6,
+ UNI_CAUSE_IE_N = 34-6,
+ UNI_CAUSE_ATTR_N = (34-6)/3,
+};
+
+struct uni_ie_cause {
+ struct uni_iehdr h;
+#define UNI_CAUSE_COND_P 0x0001
+#define UNI_CAUSE_REJ_P 0x0002
+#define UNI_CAUSE_REJ_USER_P 0x0004
+#define UNI_CAUSE_REJ_IE_P 0x0008
+#define UNI_CAUSE_IE_P 0x0010
+#define UNI_CAUSE_TRAFFIC_P 0x0020
+#define UNI_CAUSE_VPCI_P 0x0040
+#define UNI_CAUSE_MTYPE_P 0x0080
+#define UNI_CAUSE_TIMER_P 0x0100
+#define UNI_CAUSE_TNS_P 0x0200
+#define UNI_CAUSE_NUMBER_P 0x0400
+#define UNI_CAUSE_ATTR_P 0x0800
+#define UNI_CAUSE_PARAM_P 0x1000
+
+ enum uni_cause_loc loc;
+ enum uni_cause cause;
+
+ union {
+ struct {
+ enum uni_cause_pu pu;
+ enum uni_cause_na na;
+ enum uni_cause_cond cond;
+ } cond;
+ struct {
+ enum uni_cause_reason reason;
+ enum uni_cause_cond cond;
+ u_int user;
+ uint8_t ie;
+ } rej;
+ struct {
+ uint8_t ie[UNI_CAUSE_IE_N];
+ u_int len;
+ } ie;
+ struct {
+ uint8_t traffic[UNI_CAUSE_TRAFFIC_N];
+ u_int len;
+ } traffic;
+ struct {
+ uint16_t vpci;
+ uint16_t vci;
+ } vpci;
+ uint8_t mtype;
+ u_char timer[3];
+ struct uni_ie_tns tns;
+ struct uni_ie_called number; /* TNS does not fit */
+ uint8_t param;
+ struct {
+ u_int nattr;
+ u_char attr[UNI_CAUSE_ATTR_N][3];
+ } attr;
+ } u;
+};
+enum uni_diag uni_diag(enum uni_cause, enum uni_coding);
+
+/* return a string for the cause (NULL if the coding/cause are illegal) */
+const char *uni_ie_cause2str(enum uni_coding, u_int);
+
+/*************************************************************************
+ *
+ * Connection identifier information element
+ */
+enum uni_connid_type {
+ UNI_CONNID_VCI = 0,
+ UNI_CONNID_ANYVCI = 1,
+ UNI_CONNID_NOVCI = 4,
+};
+enum uni_connid_assoc {
+ UNI_CONNID_ASSOC = 0,
+ UNI_CONNID_NONASSOC = 1,
+};
+struct uni_ie_connid {
+ struct uni_iehdr h;
+ enum uni_connid_assoc assoc;
+ enum uni_connid_type type;
+ u_int vpci : 16;
+ u_int vci : 16;
+};
+
+/*************************************************************************
+ *
+ * End point reference IE
+ */
+struct uni_ie_epref {
+ struct uni_iehdr h;
+ u_int flag : 1;
+ u_int epref : 15;
+};
+
+/*************************************************************************
+ *
+ * End point state IE
+ */
+enum uni_epstate {
+ UNI_EPSTATE_NULL = 0x00,
+ UNI_EPSTATE_ADD_INIT = 0x01,
+ UNI_EPSTATE_ALERT_DLVD = 0x04,
+ UNI_EPSTATE_ADD_RCVD = 0x06,
+ UNI_EPSTATE_ALERT_RCVD = 0x07,
+ UNI_EPSTATE_ACTIVE = 0x0a,
+ UNI_EPSTATE_DROP_INIT = 0x0b,
+ UNI_EPSTATE_DROP_RCVD = 0x0c,
+};
+
+struct uni_ie_epstate {
+ struct uni_iehdr h;
+ enum uni_epstate state;
+};
+
+/*************************************************************************
+ *
+ * Q.2932 Facility IE
+ */
+enum {
+ UNI_FACILITY_ROSE = 0x11,
+
+ UNI_FACILITY_MAXAPDU = 128,
+};
+
+struct uni_ie_facility {
+ struct uni_iehdr h;
+
+ u_char proto;
+ u_char apdu[UNI_FACILITY_MAXAPDU];
+ u_int len;
+};
+
+/*************************************************************************
+ *
+ * Notification indicator
+ */
+enum {
+ UNI_NOTIFY_MAXLEN = 128, /* maximum info length */
+};
+struct uni_ie_notify {
+ struct uni_iehdr h;
+ u_int len;
+ u_char notify[UNI_NOTIFY_MAXLEN];
+};
+
+/*************************************************************************
+ *
+ * QoS information element
+ */
+enum uni_qos {
+ UNI_QOS_CLASS0 = 0x00,
+ UNI_QOS_CLASS1 = 0x01,
+ UNI_QOS_CLASS2 = 0x02,
+ UNI_QOS_CLASS3 = 0x03,
+ UNI_QOS_CLASS4 = 0x04,
+};
+
+struct uni_ie_qos {
+ struct uni_iehdr h;
+ enum uni_qos fwd;
+ enum uni_qos bwd;
+};
+
+/*************************************************************************
+ *
+ * Broadband repeat indicator information element
+ */
+enum uni_repeat_type {
+ UNI_REPEAT_PRIDESC = 0x02,
+ UNI_REPEAT_STACK = 0x0a, /* PNNI */
+};
+
+struct uni_ie_repeat {
+ struct uni_iehdr h;
+ enum uni_repeat_type type;
+};
+
+/*************************************************************************
+ *
+ * Restart indicator information element
+ */
+enum uni_restart_type {
+ UNI_RESTART_CHANNEL = 0x0,
+ UNI_RESTART_PATH = 0x1,
+ UNI_RESTART_ALL = 0x2,
+};
+
+struct uni_ie_restart {
+ struct uni_iehdr h;
+ enum uni_restart_type rclass;
+};
+
+/*************************************************************************
+ *
+ * Broadband sending complete indicator information element
+ */
+struct uni_ie_scompl {
+ struct uni_iehdr h;
+};
+
+/*************************************************************************
+ *
+ * ATM traffic descriptor information element
+ */
+enum {
+ UNI_TRAFFIC_FMDCR_ID = 0x00,
+ UNI_TRAFFIC_BMDCR_ID = 0x02,
+ UNI_TRAFFIC_FPCR0_ID = 0x82,
+ UNI_TRAFFIC_BPCR0_ID = 0x83,
+ UNI_TRAFFIC_FPCR1_ID = 0x84,
+ UNI_TRAFFIC_BPCR1_ID = 0x85,
+ UNI_TRAFFIC_FSCR0_ID = 0x88,
+ UNI_TRAFFIC_BSCR0_ID = 0x89,
+ UNI_TRAFFIC_FSCR1_ID = 0x90,
+ UNI_TRAFFIC_BSCR1_ID = 0x91,
+ UNI_TRAFFIC_FABR1_ID = 0x92,
+ UNI_TRAFFIC_BABR1_ID = 0x93,
+ UNI_TRAFFIC_FMBS0_ID = 0xa0,
+ UNI_TRAFFIC_BMBS0_ID = 0xa1,
+ UNI_TRAFFIC_FMBS1_ID = 0xb0,
+ UNI_TRAFFIC_BMBS1_ID = 0xb1,
+ UNI_TRAFFIC_BEST_ID = 0xbe,
+ UNI_TRAFFIC_MOPT_ID = 0xbf,
+
+ UNI_TRAFFIC_FTAG = 0x01,
+ UNI_TRAFFIC_BTAG = 0x02,
+ UNI_TRAFFIC_FDISC = 0x80,
+ UNI_TRAFFIC_BDISC = 0x40,
+
+ UNI_MINTRAFFIC_FPCR0_ID = 0x82,
+ UNI_MINTRAFFIC_BPCR0_ID = 0x83,
+ UNI_MINTRAFFIC_FPCR1_ID = 0x84,
+ UNI_MINTRAFFIC_BPCR1_ID = 0x85,
+ UNI_MINTRAFFIC_FABR1_ID = 0x92,
+ UNI_MINTRAFFIC_BABR1_ID = 0x93,
+
+ UNI_MDCR_ORIGIN_USER = 0x00,
+ UNI_MDCR_ORIGIN_NET = 0x01,
+};
+
+#define UNI_TRAFFIC_FPCR0_P 0x0001
+#define UNI_TRAFFIC_BPCR0_P 0x0002
+#define UNI_TRAFFIC_FPCR1_P 0x0004
+#define UNI_TRAFFIC_BPCR1_P 0x0008
+#define UNI_TRAFFIC_FSCR0_P 0x0010
+#define UNI_TRAFFIC_BSCR0_P 0x0020
+#define UNI_TRAFFIC_FSCR1_P 0x0040
+#define UNI_TRAFFIC_BSCR1_P 0x0080
+#define UNI_TRAFFIC_FMBS0_P 0x0100
+#define UNI_TRAFFIC_BMBS0_P 0x0200
+#define UNI_TRAFFIC_FMBS1_P 0x0400
+#define UNI_TRAFFIC_BMBS1_P 0x0800
+#define UNI_TRAFFIC_BEST_P 0x1000
+#define UNI_TRAFFIC_MOPT_P 0x2000
+#define UNI_TRAFFIC_FABR1_P 0x4000
+#define UNI_TRAFFIC_BABR1_P 0x8000
+struct uni_xtraffic {
+ u_int fpcr0, bpcr0;
+ u_int fpcr1, bpcr1;
+ u_int fscr0, bscr0;
+ u_int fscr1, bscr1;
+ u_int fmbs0, bmbs0;
+ u_int fmbs1, bmbs1;
+ u_int fabr1, babr1;
+ u_int ftag, btag;
+ u_int fdisc, bdisc;
+};
+
+struct uni_ie_traffic {
+ struct uni_iehdr h;
+ struct uni_xtraffic t;
+};
+struct uni_ie_atraffic {
+ struct uni_iehdr h;
+ struct uni_xtraffic t;
+};
+
+/*
+ * Q.2961 minimum traffic descriptor
+ */
+struct uni_ie_mintraffic {
+ struct uni_iehdr h;
+#define UNI_MINTRAFFIC_FPCR0_P 0x0001
+#define UNI_MINTRAFFIC_BPCR0_P 0x0002
+#define UNI_MINTRAFFIC_FPCR1_P 0x0004
+#define UNI_MINTRAFFIC_BPCR1_P 0x0008
+#define UNI_MINTRAFFIC_FABR1_P 0x0010
+#define UNI_MINTRAFFIC_BABR1_P 0x0020
+
+ u_int fpcr0, bpcr0;
+ u_int fpcr1, bpcr1;
+ u_int fabr1, babr1;
+};
+
+/*
+ * UNI4.0+ (af-cs-0147.000) Minimum Desired Cell Rate
+ */
+struct uni_ie_mdcr {
+ struct uni_iehdr h;
+ u_int origin;
+ u_int fmdcr, bmdcr;
+};
+
+/*************************************************************************
+ *
+ * User-user information information element
+ */
+struct uni_ie_uu {
+ struct uni_iehdr h;
+ u_int len;
+ u_char uu[UNI_UU_MAXLEN];
+};
+
+/*************************************************************************
+ *
+ * Generic identifier transport
+ */
+enum uni_git_std {
+ UNI_GIT_STD_DSMCC = 0x01, /* DSM-CC */
+ UNI_GIT_STD_H245 = 0x02, /* H.245 */
+};
+enum uni_git_type {
+ UNI_GIT_TYPE_SESS = 0x01, /* session id */
+ UNI_GIT_TYPE_RES = 0x02, /* resource id */
+};
+
+enum {
+ UNI_GIT_MAXSESS = 20, /* max session value length */
+ UNI_GIT_MAXRES = 4, /* max resource value length */
+
+ UNI_GIT_MAXVAL = 20, /* the maximum of the above */
+ UNI_GIT_MAXSUB = 2, /* maximum number of og. 6 */
+};
+
+struct uni_ie_git {
+ struct uni_iehdr h;
+
+ enum uni_git_std std; /* identifier related standard/application */
+ u_int numsub;
+ struct {
+ enum uni_git_type type;
+ u_int len;
+ u_char val[UNI_GIT_MAXVAL];
+ } sub[UNI_GIT_MAXSUB];
+};
+
+/*************************************************************************
+ *
+ * End-to-end transit delay
+ */
+enum {
+ UNI_EETD_CTD_ID = 0x01, /* cumulative transit delay */
+ UNI_EETD_MTD_ID = 0x03, /* maximum transit delay */
+ UNI_EETD_NET_ID = 0x0a, /* network generated */
+ UNI_EETD_PMTD_ID = 0x0b, /* PNNI acceptable forward maximum ctd */
+ UNI_EETD_PCTD_ID = 0x11, /* PNNI cumulative forward maximum ctd */
+
+ UNI_EETD_ANYMAX = 0xffff,
+ UNI_EETD_MAXVAL = 0xffff, /* maximum value */
+};
+
+struct uni_ie_eetd {
+ struct uni_iehdr h;
+#define UNI_EETD_CUM_P 0x0001
+#define UNI_EETD_MAX_P 0x0002
+#define UNI_EETD_NET_P 0x0004 /* UNI4.0 9.1.2.1 */
+#define UNI_EETD_PMTD_P 0x0008 /* PNNI1.0 6.4.5.24 */
+#define UNI_EETD_PCTD_P 0x0010 /* PNNI1.0 6.4.5.24 */
+
+ u_int cumulative;
+ u_int maximum;
+ u_int pmtd;
+ u_int pctd;
+};
+
+/*************************************************************************
+ *
+ * Leaf-initiated-join call identifier
+ */
+enum uni_lij_idtype {
+ UNI_LIJ_IDTYPE_ROOT = 0x0, /* root created */
+};
+
+struct uni_ie_lij_callid {
+ struct uni_iehdr h;
+
+ enum uni_lij_idtype type;
+ u_int callid;
+};
+
+/*
+ * LIJ parameters
+ */
+enum uni_lij_screen {
+ UNI_LIJ_SCREEN_NETJOIN = 0x0, /* without root notification */
+};
+
+struct uni_ie_lij_param {
+ struct uni_iehdr h;
+
+ enum uni_lij_screen screen;
+};
+
+/*
+ * LIJ sequence number
+ */
+struct uni_ie_lij_seqno {
+ struct uni_iehdr h;
+
+ u_int seqno;
+};
+
+/*************************************************************************
+ *
+ * Locking/Non-locking shift not supported
+ */
+struct uni_ie_lshift {
+ struct uni_iehdr h;
+ u_int set:3;
+};
+
+struct uni_ie_nlshift {
+ struct uni_iehdr h;
+ u_int set:3;
+};
+
+/*************************************************************************
+ *
+ * Externded QoS information element
+ */
+enum {
+ UNI_EXQOS_FACC_ID = 0x94,
+ UNI_EXQOS_BACC_ID = 0x95,
+ UNI_EXQOS_FCUM_ID = 0x96,
+ UNI_EXQOS_BCUM_ID = 0x97,
+ UNI_EXQOS_FCLR_ID = 0xa2,
+ UNI_EXQOS_BCLR_ID = 0xa3,
+};
+
+enum uni_exqos_origin {
+ UNI_EXQOS_USER = 0,
+ UNI_EXQOS_NET = 1,
+};
+
+enum {
+ UNI_EXQOS_ANY_CDV = 0xffffff,
+ UNI_EXQOS_ANY_CLR = 0xff,
+};
+
+struct uni_ie_exqos {
+ struct uni_iehdr h;
+#define UNI_EXQOS_FACC_P 0x0001
+#define UNI_EXQOS_BACC_P 0x0002
+#define UNI_EXQOS_FCUM_P 0x0004
+#define UNI_EXQOS_BCUM_P 0x0008
+#define UNI_EXQOS_FCLR_P 0x0010
+#define UNI_EXQOS_BCLR_P 0x0020
+
+ enum uni_exqos_origin origin;
+ u_int facc;
+ u_int bacc;
+ u_int fcum;
+ u_int bcum;
+ u_int fclr;
+ u_int bclr;
+};
+
+/*************************************************************************
+ *
+ * Additional ABR parameters
+ * ABR setup parameters
+ */
+enum {
+ UNI_ABRADD_FADD_ID = 0xc2,
+ UNI_ABRADD_BADD_ID = 0xc3,
+ UNI_ABRSETUP_FICR_ID = 0xc2,
+ UNI_ABRSETUP_BICR_ID = 0xc3,
+ UNI_ABRSETUP_FTBE_ID = 0xc4,
+ UNI_ABRSETUP_BTBE_ID = 0xc5,
+ UNI_ABRSETUP_RMFRT_ID = 0xc6,
+ UNI_ABRSETUP_FRIF_ID = 0xc8,
+ UNI_ABRSETUP_BRIF_ID = 0xc9,
+ UNI_ABRSETUP_FRDF_ID = 0xca,
+ UNI_ABRSETUP_BRDF_ID = 0xcb,
+};
+
+struct uni_abr_rec {
+ u_int present;
+#define UNI_ABR_REC_NRM_P 0x80000000
+#define UNI_ABR_REC_TRM_P 0x40000000
+#define UNI_ABR_REC_CDF_P 0x20000000
+#define UNI_ABR_REC_ADTF_P 0x10000000
+ u_int nrm:3;
+ u_int trm:3;
+ u_int cdf:3;
+ u_int adtf:10;
+};
+
+struct uni_ie_abradd {
+ struct uni_iehdr h;
+ struct uni_abr_rec fwd, bwd;
+};
+
+struct uni_ie_abrsetup {
+ struct uni_iehdr h;
+#define UNI_ABRSETUP_FICR_P 0x0001
+#define UNI_ABRSETUP_BICR_P 0x0002
+#define UNI_ABRSETUP_FTBE_P 0x0004
+#define UNI_ABRSETUP_BTBE_P 0x0008
+#define UNI_ABRSETUP_FRIF_P 0x0010
+#define UNI_ABRSETUP_BRIF_P 0x0020
+#define UNI_ABRSETUP_FRDF_P 0x0040
+#define UNI_ABRSETUP_BRDF_P 0x0080
+#define UNI_ABRSETUP_RMFRT_P 0x0100
+
+ u_int ficr, bicr;
+ u_int ftbe, btbe;
+ u_int rmfrt;
+ u_int frif, brif;
+ u_int frdf, brdf;
+};
+
+/*************************************************************************
+ *
+ * Connection scope information element
+ */
+enum uni_cscope {
+ UNI_CSCOPE_ORG = 0x01,
+};
+
+enum {
+ UNI_CSCOPE_ORG_LOC = 0x01,
+ UNI_CSCOPE_ORG_LOC_P1 = 0x02,
+ UNI_CSCOPE_ORG_LOC_P2 = 0x03,
+ UNI_CSCOPE_ORG_SITE_M1 = 0x04,
+ UNI_CSCOPE_ORG_SITE = 0x05,
+ UNI_CSCOPE_ORG_SITE_P1 = 0x06,
+ UNI_CSCOPE_ORG_ORG_M1 = 0x07,
+ UNI_CSCOPE_ORG_ORG = 0x08,
+ UNI_CSCOPE_ORG_ORG_P1 = 0x09,
+ UNI_CSCOPE_ORG_COMM_M1 = 0x0a,
+ UNI_CSCOPE_ORG_COMM = 0x0b,
+ UNI_CSCOPE_ORG_COMM_P1 = 0x0c,
+ UNI_CSCOPE_ORG_REG = 0x0d,
+ UNI_CSCOPE_ORG_INTER = 0x0e,
+ UNI_CSCOPE_ORG_GLOBAL = 0x0f,
+};
+
+struct uni_ie_cscope {
+ struct uni_iehdr h;
+ enum uni_cscope type;
+ u_int scope:8;
+};
+
+/*************************************************************************
+ *
+ * Connection scope information element
+ */
+enum uni_report {
+ UNI_REPORT_MODCONF = 0x01,
+ UNI_REPORT_CLOCK = 0x02,
+ UNI_REPORT_EEAVAIL = 0x04,
+ UNI_REPORT_EEREQ = 0x05,
+ UNI_REPORT_EECOMPL = 0x06,
+};
+
+struct uni_ie_report {
+ struct uni_iehdr h;
+ enum uni_report report;
+};
+
+/*************************************************************************
+ *
+ * PNNI Designated transit list information element
+ */
+enum {
+ UNI_DTL_LOGNP = 0x01,
+ UNI_DTL_LOGNP_SIZE = 27,
+};
+
+struct uni_ie_dtl {
+ struct uni_iehdr h;
+ u_int ptr:16;
+ u_int num;
+ struct {
+ u_char node_level;
+ u_char node_id[21];
+ u_int port_id;
+ } dtl[UNI_DTL_MAXNUM];
+};
+
+/*************************************************************************
+ *
+ * PNNI Crankback information element
+ */
+enum uni_crankback {
+ UNI_CRANKBACK_IF = 0x02,
+ UNI_CRANKBACK_NODE = 0x03,
+ UNI_CRANKBACK_LINK = 0x04,
+};
+
+enum {
+ UNI_CAUSE_NXNODE_UNREACH = 128,
+ UNI_CAUSE_DTL_NOT_MY_ID = 160,
+};
+
+struct uni_ie_crankback {
+ struct uni_iehdr h;
+#define UNI_CRANKBACK_TOP_P 0x0001
+#define UNI_CRANKBACK_TOPX_P 0x0002
+#define UNI_CRANKBACK_QOS_P 0x0004
+ u_int level:8;
+ enum uni_crankback type;
+ union {
+ struct {
+ u_char level;
+ u_char id[21];
+ } node;
+ struct {
+ u_char plevel;
+ u_char pid[21];
+ u_int port;
+ u_char slevel;
+ u_char sid[21];
+ } link;
+ } id;
+ u_int cause:8;
+ union {
+ struct {
+ u_int dir:8;
+ u_int port;
+ u_int avcr;
+ u_int crm;
+ u_int vf;
+ } top;
+ struct {
+ u_int ctd:1;
+ u_int cdv:1;
+ u_int clr:1;
+ u_int other:1;
+ } qos;
+ } diag;
+};
+
+/*************************************************************************
+ *
+ * PNNI Call_ing/called party soft PVPC/PVCC information element
+ */
+enum uni_soft_sel {
+ UNI_SOFT_SEL_ANY = 0x00,
+ UNI_SOFT_SEL_REQ = 0x02,
+ UNI_SOFT_SEL_ASS = 0x04,
+};
+
+struct uni_ie_calling_soft {
+ struct uni_iehdr h;
+#define UNI_CALLING_SOFT_VCI_P 0x0001
+ u_int vpi:12;
+ u_int vci:16;
+};
+struct uni_ie_called_soft {
+ struct uni_iehdr h;
+#define UNI_CALLED_SOFT_VPI_P 0x0001
+#define UNI_CALLED_SOFT_VCI_P 0x0002
+ enum uni_soft_sel sel;
+ u_int vpi:12;
+ u_int vci:16;
+};
+
+/*************************************************************************/
+
+#include <netnatm/msg/uni_ie.h>
+#include <netnatm/msg/uni_msg.h>
+
+struct uni_all {
+ enum uni_msgtype mtype;
+ union uni_msgall u;
+};
+
+struct uni_ie {
+ enum uni_ietype ietype;
+ union uni_ieall u;
+};
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/saal/saal_sscfu.c b/sys/contrib/ngatm/netnatm/saal/saal_sscfu.c
new file mode 100644
index 0000000..80140ba
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/saal/saal_sscfu.c
@@ -0,0 +1,577 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/saal/saal_sscfu.c,v 1.4 2004/07/08 08:22:10 brandt Exp $
+ *
+ * SSCF on the UNI
+ */
+
+#include <netnatm/saal/sscfu.h>
+#include <netnatm/saal/sscfupriv.h>
+
+#define MKSTR(S) #S
+
+static const char *const sscf_sigs[] = {
+ MKSTR(SAAL_ESTABLISH_request),
+ MKSTR(SAAL_ESTABLISH_indication),
+ MKSTR(SAAL_ESTABLISH_confirm),
+ MKSTR(SAAL_RELEASE_request),
+ MKSTR(SAAL_RELEASE_confirm),
+ MKSTR(SAAL_RELEASE_indication),
+ MKSTR(SAAL_DATA_request),
+ MKSTR(SAAL_DATA_indication),
+ MKSTR(SAAL_UDATA_request),
+ MKSTR(SAAL_UDATA_indication),
+};
+
+static const char *const sscf_states[] = {
+ MKSTR(SSCF_RELEASED),
+ MKSTR(SSCF_AWAITING_ESTABLISH),
+ MKSTR(SSCF_AWAITING_RELEASE),
+ MKSTR(SSCF_ESTABLISHED),
+ MKSTR(SSCF_RESYNC),
+};
+
+#define AA_SIG(S,G,M) \
+ ((S)->funcs->send_upper((S), (S)->aarg, (G), (M)))
+
+#define SSCOP_AASIG(S,G,M,P) \
+ ((S)->funcs->send_lower((S), (S)->aarg, (G), (M), (P)))
+
+MEMINIT();
+
+static void sscfu_unqueue(struct sscfu *sscf);
+
+/************************************************************/
+/*
+ * INSTANCE AND CLASS MANAGEMENT
+ */
+
+/*
+ * Initialize SSCF.
+ */
+struct sscfu *
+sscfu_create(void *a, const struct sscfu_funcs *funcs)
+{
+ struct sscfu *sscf;
+
+ MEMZALLOC(sscf, struct sscfu *, sizeof(struct sscfu));
+ if (sscf == NULL)
+ return (NULL);
+
+ sscf->funcs = funcs;
+ sscf->aarg = a;
+ sscf->state = SSCFU_RELEASED;
+ sscf->inhand = 0;
+ SIGQ_INIT(&sscf->sigs);
+ sscf->debug = 0;
+
+ return (sscf);
+}
+
+/*
+ * Reset the instance. Call only if you know, what you're doing.
+ */
+void
+sscfu_reset(struct sscfu *sscf)
+{
+ sscf->state = SSCFU_RELEASED;
+ sscf->inhand = 0;
+ SIGQ_CLEAR(&sscf->sigs);
+}
+
+/*
+ * Destroy SSCF
+ */
+void
+sscfu_destroy(struct sscfu *sscf)
+{
+ SIGQ_CLEAR(&sscf->sigs);
+ MEMFREE(sscf);
+}
+
+enum sscfu_state
+sscfu_getstate(const struct sscfu *sscf)
+{
+ return (sscf->state);
+}
+
+u_int
+sscfu_getdefparam(struct sscop_param *p)
+{
+ memset(p, 0, sizeof(*p));
+
+ p->timer_cc = 1000;
+ p->timer_poll = 750;
+ p->timer_keep_alive = 2000;
+ p->timer_no_response = 7000;
+ p->timer_idle = 15000;
+ p->maxk = 4096;
+ p->maxj = 4096;
+ p->maxcc = 4;
+ p->maxpd = 25;
+
+ return (SSCOP_SET_TCC | SSCOP_SET_TPOLL | SSCOP_SET_TKA |
+ SSCOP_SET_TNR | SSCOP_SET_TIDLE | SSCOP_SET_MAXK |
+ SSCOP_SET_MAXJ | SSCOP_SET_MAXCC | SSCOP_SET_MAXPD);
+}
+
+const char *
+sscfu_signame(enum saal_sig sig)
+{
+ static char str[40];
+
+ if (sig >= sizeof(sscf_sigs)/sizeof(sscf_sigs[0])) {
+ sprintf(str, "BAD SAAL_SIGNAL %u", sig);
+ return (str);
+ } else {
+ return (sscf_sigs[sig]);
+ }
+}
+
+const char *
+sscfu_statename(enum sscfu_state s)
+{
+ static char str[40];
+
+ if (s >= sizeof(sscf_states)/sizeof(sscf_states[0])) {
+ sprintf(str, "BAD SSCFU state %u", s);
+ return (str);
+ } else {
+ return (sscf_states[s]);
+ }
+}
+
+/************************************************************/
+/*
+ * EXTERNAL INPUT SIGNAL MAPPING
+ */
+static __inline void
+set_state(struct sscfu *sscf, enum sscfu_state state)
+{
+ VERBOSE(sscf, SSCFU_DBG_STATE, (sscf, sscf->aarg,
+ "change state from %s to %s",
+ sscf_states[sscf->state], sscf_states[state]));
+ sscf->state = state;
+}
+
+/*
+ * signal from SSCOP to SSCF
+ * Message must be freed by the user specified handler, if
+ * it is passed.
+ */
+void
+sscfu_input(struct sscfu *sscf, enum sscop_aasig sig,
+ struct SSCFU_MBUF_T *m, u_int arg __unused)
+{
+ sscf->inhand = 1;
+
+ VERBOSE(sscf, SSCFU_DBG_LSIG, (sscf, sscf->aarg,
+ "SSCF got signal %d. in state %s", sig, sscf_states[sscf->state]));
+
+ switch (sig) {
+
+ case SSCOP_RELEASE_indication:
+ /* arg is: UU, SRC */
+ switch (sscf->state) {
+
+ case SSCFU_RELEASED:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+
+ case SSCFU_AWAITING_ESTABLISH:
+ set_state(sscf, SSCFU_RELEASED);
+ AA_SIG(sscf, SAAL_RELEASE_indication, m);
+ break;
+
+ case SSCFU_AWAITING_RELEASE:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+
+ case SSCFU_ESTABLISHED:
+ set_state(sscf, SSCFU_RELEASED);
+ AA_SIG(sscf, SAAL_RELEASE_indication, m);
+ break;
+
+ case SSCFU_RESYNC:
+ set_state(sscf, SSCFU_RELEASED);
+ AA_SIG(sscf, SAAL_RELEASE_indication, m);
+ break;
+ }
+ break;
+
+ case SSCOP_ESTABLISH_indication:
+ /* arg is: UU */
+ switch (sscf->state) {
+
+ case SSCFU_RELEASED:
+ set_state(sscf, SSCFU_ESTABLISHED);
+ SSCOP_AASIG(sscf, SSCOP_ESTABLISH_response, NULL, 1);
+ AA_SIG(sscf, SAAL_ESTABLISH_indication, m);
+ break;
+
+ case SSCFU_AWAITING_ESTABLISH:
+ case SSCFU_AWAITING_RELEASE:
+ case SSCFU_ESTABLISHED:
+ case SSCFU_RESYNC:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+ }
+ break;
+
+ case SSCOP_ESTABLISH_confirm:
+ /* arg is: UU */
+ switch (sscf->state) {
+
+ case SSCFU_RELEASED:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+
+ case SSCFU_AWAITING_ESTABLISH:
+ set_state(sscf, SSCFU_ESTABLISHED);
+ AA_SIG(sscf, SAAL_ESTABLISH_confirm, m);
+ break;
+
+ case SSCFU_AWAITING_RELEASE:
+ case SSCFU_ESTABLISHED:
+ case SSCFU_RESYNC:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+ }
+ break;
+
+ case SSCOP_RELEASE_confirm:
+ /* arg is: */
+ switch (sscf->state) {
+
+ case SSCFU_RELEASED:
+ case SSCFU_AWAITING_ESTABLISH:
+ goto badsig;
+
+ case SSCFU_AWAITING_RELEASE:
+ set_state(sscf, SSCFU_RELEASED);
+ AA_SIG(sscf, SAAL_RELEASE_confirm, NULL);
+ break;
+
+ case SSCFU_ESTABLISHED:
+ case SSCFU_RESYNC:
+ goto badsig;
+ }
+ break;
+
+ case SSCOP_DATA_indication:
+ /* arg is: MU */
+ sscf->funcs->window(sscf, sscf->aarg, 1);
+ switch (sscf->state) {
+
+ case SSCFU_RELEASED:
+ case SSCFU_AWAITING_ESTABLISH:
+ case SSCFU_AWAITING_RELEASE:
+ MBUF_FREE(m);
+ goto badsig;
+
+ case SSCFU_ESTABLISHED:
+ AA_SIG(sscf, SAAL_DATA_indication, m);
+ break;
+
+ case SSCFU_RESYNC:
+ MBUF_FREE(m);
+ goto badsig;
+ }
+ break;
+
+ case SSCOP_RECOVER_indication:
+ /* arg is: */
+ switch (sscf->state) {
+
+ case SSCFU_RELEASED:
+ case SSCFU_AWAITING_ESTABLISH:
+ case SSCFU_AWAITING_RELEASE:
+ goto badsig;
+
+ case SSCFU_ESTABLISHED:
+ SSCOP_AASIG(sscf, SSCOP_RECOVER_response, NULL, 0);
+ AA_SIG(sscf, SAAL_ESTABLISH_indication, NULL);
+ break;
+
+ case SSCFU_RESYNC:
+ goto badsig;
+ }
+ break;
+
+ case SSCOP_RESYNC_indication:
+ /* arg is: UU */
+ switch (sscf->state) {
+
+ case SSCFU_RELEASED:
+ case SSCFU_AWAITING_ESTABLISH:
+ case SSCFU_AWAITING_RELEASE:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+
+ case SSCFU_ESTABLISHED:
+ SSCOP_AASIG(sscf, SSCOP_RESYNC_response, NULL, 0);
+ AA_SIG(sscf, SAAL_ESTABLISH_indication, m);
+ break;
+
+ case SSCFU_RESYNC:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+ }
+ break;
+
+ case SSCOP_RESYNC_confirm:
+ /* arg is: */
+ switch (sscf->state) {
+
+ case SSCFU_RELEASED:
+ case SSCFU_AWAITING_ESTABLISH:
+ case SSCFU_AWAITING_RELEASE:
+ case SSCFU_ESTABLISHED:
+
+ case SSCFU_RESYNC:
+ set_state(sscf, SSCFU_ESTABLISHED);
+ AA_SIG(sscf, SAAL_ESTABLISH_confirm, NULL);
+ break;
+ }
+ break;
+
+ case SSCOP_UDATA_indication:
+ /* arg is: MD */
+ AA_SIG(sscf, SAAL_UDATA_indication, m);
+ break;
+
+
+ case SSCOP_RETRIEVE_indication:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+
+ case SSCOP_RETRIEVE_COMPL_indication:
+ goto badsig;
+
+ case SSCOP_ESTABLISH_request:
+ case SSCOP_RELEASE_request:
+ case SSCOP_ESTABLISH_response:
+ case SSCOP_DATA_request:
+ case SSCOP_RECOVER_response:
+ case SSCOP_RESYNC_request:
+ case SSCOP_RESYNC_response:
+ case SSCOP_UDATA_request:
+ case SSCOP_RETRIEVE_request:
+ ASSERT(0);
+ break;
+ }
+
+ sscfu_unqueue(sscf);
+ return;
+
+ badsig:
+ VERBOSE(sscf, SSCFU_DBG_ERR, (sscf, sscf->aarg,
+ "bad signal %d. in state %s", sig, sscf_states[sscf->state]));
+ sscfu_unqueue(sscf);
+}
+
+
+/*
+ * Handle signals from the user
+ */
+static void
+sscfu_dosig(struct sscfu *sscf, enum saal_sig sig, struct SSCFU_MBUF_T *m)
+{
+ VERBOSE(sscf, SSCFU_DBG_EXEC, (sscf, sscf->aarg,
+ "executing signal %s(%s)",
+ sscf_sigs[sig], sscf_states[sscf->state]));
+
+ switch (sig) {
+
+ case SAAL_ESTABLISH_request:
+ /* arg is opt UU */
+ switch (sscf->state) {
+
+ case SSCFU_RELEASED:
+ set_state(sscf, SSCFU_AWAITING_ESTABLISH);
+ SSCOP_AASIG(sscf, SSCOP_ESTABLISH_request, m, 1);
+ break;
+
+ case SSCFU_AWAITING_ESTABLISH:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+
+ case SSCFU_AWAITING_RELEASE:
+ set_state(sscf, SSCFU_AWAITING_ESTABLISH);
+ SSCOP_AASIG(sscf, SSCOP_ESTABLISH_request, m, 1);
+ break;
+
+ case SSCFU_ESTABLISHED:
+ set_state(sscf, SSCFU_RESYNC);
+ SSCOP_AASIG(sscf, SSCOP_RESYNC_request, m, 0);
+ break;
+
+ case SSCFU_RESYNC:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+ }
+ break;
+
+ case SAAL_RELEASE_request:
+ /* arg is opt UU */
+ switch(sscf->state) {
+
+ case SSCFU_RELEASED:
+ if (m)
+ MBUF_FREE(m);
+ AA_SIG(sscf, SAAL_RELEASE_confirm, NULL);
+ break;
+
+ case SSCFU_AWAITING_ESTABLISH:
+ set_state(sscf, SSCFU_AWAITING_RELEASE);
+ SSCOP_AASIG(sscf, SSCOP_RELEASE_request, m, 0);
+ break;
+
+ case SSCFU_AWAITING_RELEASE:
+ if (m)
+ MBUF_FREE(m);
+ goto badsig;
+
+ case SSCFU_ESTABLISHED:
+ set_state(sscf, SSCFU_AWAITING_RELEASE);
+ SSCOP_AASIG(sscf, SSCOP_RELEASE_request, m, 0);
+ break;
+
+ case SSCFU_RESYNC:
+ set_state(sscf, SSCFU_AWAITING_RELEASE);
+ SSCOP_AASIG(sscf, SSCOP_RELEASE_request, m, 0);
+ break;
+ }
+ break;
+
+ case SAAL_DATA_request:
+ /* arg is DATA */
+ switch (sscf->state) {
+
+ case SSCFU_RELEASED:
+ case SSCFU_AWAITING_ESTABLISH:
+ case SSCFU_AWAITING_RELEASE:
+ MBUF_FREE(m);
+ goto badsig;
+
+ case SSCFU_ESTABLISHED:
+ SSCOP_AASIG(sscf, SSCOP_DATA_request, m, 0);
+ break;
+
+ case SSCFU_RESYNC:
+ MBUF_FREE(m);
+ goto badsig;
+ }
+ break;
+
+ case SAAL_UDATA_request:
+ /* arg is UDATA */
+ SSCOP_AASIG(sscf, SSCOP_UDATA_request, m, 0);
+ break;
+
+ case SAAL_ESTABLISH_indication:
+ case SAAL_ESTABLISH_confirm:
+ case SAAL_RELEASE_confirm:
+ case SAAL_RELEASE_indication:
+ case SAAL_DATA_indication:
+ case SAAL_UDATA_indication:
+ ASSERT(0);
+ break;
+ }
+ return;
+
+ badsig:
+ VERBOSE(sscf, SSCFU_DBG_ERR, (sscf, sscf->aarg,
+ "bad signal %s in state %s", sscf_sigs[sig],
+ sscf_states[sscf->state]));
+}
+
+/*
+ * Handle user signal.
+ */
+int
+sscfu_saalsig(struct sscfu *sscf, enum saal_sig sig, struct SSCFU_MBUF_T *m)
+{
+ struct sscfu_sig *s;
+
+ if (sscf->inhand) {
+ VERBOSE(sscf, SSCFU_DBG_EXEC, (sscf, sscf->aarg,
+ "queuing user signal %s(%s)",
+ sscf_sigs[sig], sscf_states[sscf->state]));
+ SIG_ALLOC(s);
+ if (s == NULL)
+ return (ENOMEM);
+ s->sig = sig;
+ s->m = m;
+ SIGQ_APPEND(&sscf->sigs, s);
+ return (0);
+ }
+
+ sscf->inhand = 1;
+ sscfu_dosig(sscf, sig, m);
+ sscfu_unqueue(sscf);
+ return (0);
+}
+
+/*
+ * Unqueue all qeueued signals. Must be called with inhand==1.
+ */
+static void
+sscfu_unqueue(struct sscfu *sscf)
+{
+ struct sscfu_sig *s;
+
+ while ((s = SIGQ_GET(&sscf->sigs)) != NULL) {
+ sscfu_dosig(sscf, s->sig, s->m);
+ SIG_FREE(s);
+ }
+ sscf->inhand = 0;
+}
+
+void
+sscfu_setdebug(struct sscfu *sscf, u_int n)
+{
+ sscf->debug = n;
+}
+
+u_int
+sscfu_getdebug(const struct sscfu *sscf)
+{
+ return (sscf->debug);
+}
diff --git a/sys/contrib/ngatm/netnatm/saal/saal_sscop.c b/sys/contrib/ngatm/netnatm/saal/saal_sscop.c
new file mode 100644
index 0000000..75ce17d
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/saal/saal_sscop.c
@@ -0,0 +1,4947 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/saal/saal_sscop.c,v 1.11 2004/07/08 08:22:13 brandt Exp $
+ *
+ * Core SSCOP code (ITU-T Q.2110)
+ */
+
+#include <netnatm/saal/sscop.h>
+#include <netnatm/saal/sscoppriv.h>
+
+#ifndef FAILURE
+#define FAILURE(S)
+#endif
+
+#define MKSTR(S) #S
+
+static const char *const sscop_sigs[] = {
+ MKSTR(SSCOP_ESTABLISH_request),
+ MKSTR(SSCOP_ESTABLISH_indication),
+ MKSTR(SSCOP_ESTABLISH_response),
+ MKSTR(SSCOP_ESTABLISH_confirm),
+ MKSTR(SSCOP_RELEASE_request),
+ MKSTR(SSCOP_RELEASE_indication),
+ MKSTR(SSCOP_RELEASE_confirm),
+ MKSTR(SSCOP_DATA_request),
+ MKSTR(SSCOP_DATA_indication),
+ MKSTR(SSCOP_UDATA_request),
+ MKSTR(SSCOP_UDATA_indication),
+ MKSTR(SSCOP_RECOVER_indication),
+ MKSTR(SSCOP_RECOVER_response),
+ MKSTR(SSCOP_RESYNC_request),
+ MKSTR(SSCOP_RESYNC_indication),
+ MKSTR(SSCOP_RESYNC_response),
+ MKSTR(SSCOP_RESYNC_confirm),
+ MKSTR(SSCOP_RETRIEVE_request),
+ MKSTR(SSCOP_RETRIEVE_indication),
+ MKSTR(SSCOP_RETRIEVE_COMPL_indication),
+};
+
+static const char *const sscop_msigs[] = {
+ MKSTR(SSCOP_MDATA_request),
+ MKSTR(SSCOP_MDATA_indication),
+ MKSTR(SSCOP_MERROR_indication),
+};
+
+static const char *const states[] = {
+ MKSTR(SSCOP_IDLE),
+ MKSTR(SSCOP_OUT_PEND),
+ MKSTR(SSCOP_IN_PEND),
+ MKSTR(SSCOP_OUT_DIS_PEND),
+ MKSTR(SSCOP_OUT_RESYNC_PEND),
+ MKSTR(SSCOP_IN_RESYNC_PEND),
+ MKSTR(SSCOP_OUT_REC_PEND),
+ MKSTR(SSCOP_REC_PEND),
+ MKSTR(SSCOP_IN_REC_PEND),
+ MKSTR(SSCOP_READY),
+};
+
+#ifdef SSCOP_DEBUG
+static const char *const events[] = {
+ MKSTR(SIG_BGN),
+ MKSTR(SIG_BGAK),
+ MKSTR(SIG_END),
+ MKSTR(SIG_ENDAK),
+ MKSTR(SIG_RS),
+ MKSTR(SIG_RSAK),
+ MKSTR(SIG_BGREJ),
+ MKSTR(SIG_SD),
+ MKSTR(SIG_ER),
+ MKSTR(SIG_POLL),
+ MKSTR(SIG_STAT),
+ MKSTR(SIG_USTAT),
+ MKSTR(SIG_UD),
+ MKSTR(SIG_MD),
+ MKSTR(SIG_ERAK),
+
+ MKSTR(SIG_T_CC),
+ MKSTR(SIG_T_POLL),
+ MKSTR(SIG_T_KA),
+ MKSTR(SIG_T_NR),
+ MKSTR(SIG_T_IDLE),
+
+ MKSTR(SIG_PDU_Q),
+ MKSTR(SIG_USER_DATA),
+ MKSTR(SIG_ESTAB_REQ),
+ MKSTR(SIG_ESTAB_RESP),
+ MKSTR(SIG_RELEASE_REQ),
+ MKSTR(SIG_RECOVER),
+ MKSTR(SIG_SYNC_REQ),
+ MKSTR(SIG_SYNC_RESP),
+ MKSTR(SIG_UDATA),
+ MKSTR(SIG_MDATA),
+ MKSTR(SIG_UPDU_Q),
+ MKSTR(SIG_MPDU_Q),
+ MKSTR(SIG_RETRIEVE),
+};
+
+static const char *const pdus[] = {
+ "illegale PDU type 0", /* no PDU type 0 */
+ MKSTR(PDU_BGN),
+ MKSTR(PDU_BGAK),
+ MKSTR(PDU_END),
+ MKSTR(PDU_ENDAK),
+ MKSTR(PDU_RS),
+ MKSTR(PDU_RSAK),
+ MKSTR(PDU_BGREJ),
+ MKSTR(PDU_SD),
+ MKSTR(PDU_ER),
+ MKSTR(PDU_POLL),
+ MKSTR(PDU_STAT),
+ MKSTR(PDU_USTAT),
+ MKSTR(PDU_UD),
+ MKSTR(PDU_MD),
+ MKSTR(PDU_ERAK),
+};
+#endif
+
+MEMINIT();
+
+static void sscop_signal(struct sscop *, u_int, struct sscop_msg *);
+static void sscop_save_signal(struct sscop *, u_int, struct sscop_msg *);
+static void handle_sigs(struct sscop *);
+static void sscop_set_state(struct sscop *, u_int);
+
+/************************************************************/
+
+
+/************************************************************/
+/*
+ * Queue macros
+ */
+#define SSCOP_MSG_FREE(MSG) \
+ do { \
+ if(MSG) { \
+ MBUF_FREE((MSG)->m); \
+ MSG_FREE((MSG)); \
+ } \
+ } while(0)
+
+
+#define QFIND(Q,RN) \
+ ({ \
+ struct sscop_msg *_msg = NULL, *_m; \
+ MSGQ_FOREACH(_m, (Q)) { \
+ if(_m->seqno == (RN)) { \
+ _msg = _m; \
+ break; \
+ } \
+ } \
+ _msg; \
+ })
+
+#define QINSERT(Q,M) \
+ do { \
+ struct sscop_msg *_msg = NULL, *_m; \
+ MSGQ_FOREACH(_m, (Q)) { \
+ if (_m->seqno > (M)->seqno) { \
+ _msg = _m; \
+ break; \
+ } \
+ } \
+ if (_msg != NULL) \
+ MSGQ_INSERT_BEFORE(_msg, (M)); \
+ else \
+ MSGQ_APPEND((Q), (M)); \
+ } while (0)
+
+
+/*
+ * Send an error indication to the management plane.
+ */
+#define MAAL_ERROR(S,E,C) \
+ do { \
+ VERBOSE(S, SSCOP_DBG_USIG, ((S), (S)->aarg, \
+ "MAA-Signal %s in state %s", \
+ sscop_msigs[SSCOP_MERROR_indication], states[(S)->state])); \
+ (S)->funcs->send_manage((S), (S)->aarg, \
+ SSCOP_MERROR_indication, NULL, (E), (C)); \
+ } while(0)
+
+#define MAAL_DATA(S,M) \
+ do { \
+ VERBOSE(S, SSCOP_DBG_USIG, ((S), (S)->aarg, \
+ "MAA-Signal %s in state %s", \
+ sscop_msigs[SSCOP_MDATA_indication], states[(S)->state])); \
+ (S)->funcs->send_manage((S), (S)->aarg, \
+ SSCOP_MDATA_indication, (M), 0, 0); \
+ } while(0)
+
+#define AAL_DATA(S,D,M,N) \
+ do { \
+ VERBOSE(S, SSCOP_DBG_USIG, ((S), (S)->aarg, \
+ "AA-Signal %s in state %s", \
+ sscop_sigs[D], states[(S)->state])); \
+ (S)->funcs->send_upper((S), (S)->aarg, (D), (M), (N)); \
+ } while(0)
+
+#define AAL_SIG(S,D) \
+ do { \
+ VERBOSE(S, SSCOP_DBG_USIG, ((S), (S)->aarg, \
+ "AA-Signal %s in state %s", \
+ sscop_sigs[D], states[(S)->state])); \
+ (S)->funcs->send_upper((S), (S)->aarg, (D), NULL, 0); \
+ } while(0)
+
+#ifdef SSCOP_DEBUG
+#define AAL_SEND(S,M) do { \
+ if (ISVERBOSE(S, SSCOP_DBG_PDU)) \
+ sscop_dump_pdu(S, "tx", (M)); \
+ (S)->funcs->send_lower((S), (S)->aarg, (M)); \
+ } while(0)
+#else
+#define AAL_SEND(S,M) (S)->funcs->send_lower((S), (S)->aarg, (M))
+#endif
+
+
+/*
+ * Free a save user-to-user data buffer and set the pointer to zero
+ * to signal, that it is free.
+ */
+#define FREE_UU(F) \
+ do { \
+ if(sscop->F) { \
+ MBUF_FREE(sscop->F); \
+ sscop->F = NULL; \
+ } \
+ } while(0)
+
+#define SET_UU(F,U) \
+ do { \
+ FREE_UU(F); \
+ sscop->F = U->m; \
+ U->m = NULL; \
+ SSCOP_MSG_FREE(U); \
+ } while(0)
+
+#define AAL_UU_SIGNAL(S, SIG, M, PL, SN) \
+ do { \
+ if(MBUF_LEN((M)->m) > 0) { \
+ MBUF_UNPAD((M)->m,(PL)); \
+ AAL_DATA((S), (SIG), (M)->m, (SN)); \
+ (M)->m = NULL; \
+ } else { \
+ AAL_DATA((S), (SIG), NULL, (SN)); \
+ } \
+ SSCOP_MSG_FREE((M)); \
+ } while(0)
+
+
+
+TIMER_FUNC(cc, CC)
+TIMER_FUNC(nr, NR)
+TIMER_FUNC(ka, KA)
+TIMER_FUNC(poll, POLL)
+TIMER_FUNC(idle, IDLE)
+
+/************************************************************/
+/*
+ * INSTANCE AND TYPE HANDLING.
+ */
+#ifdef SSCOP_DEBUG
+static void
+sscop_dump_pdu(struct sscop *sscop, const char *dir,
+ const struct SSCOP_MBUF_T *m)
+{
+ u_int32_t v1, v2, v3, v4;
+ u_int size = MBUF_LEN(m);
+ u_int n, i;
+
+ if (size < 8)
+ return;
+
+ v1 = MBUF_TRAIL32(m, -1);
+ v2 = MBUF_TRAIL32(m, -2);
+
+ switch ((v1 >> 24) & 0xf) {
+
+ case 0:
+ return;
+
+ case PDU_BGN:
+ sscop->funcs->verbose(sscop, sscop->aarg,
+ "%s BGN n(mr)=%u n(sq)=%u pl=%u",
+ dir, v1 & 0xffffff, v2 & 0xff, (v1 >> 30) & 0x3);
+ return;
+
+ case PDU_BGAK:
+ sscop->funcs->verbose(sscop, sscop->aarg,
+ "%s BGAK n(mr)=%u pl=%u",
+ dir, v1 & 0xffffff, (v1 >> 30) & 0x3);
+ return;
+
+ case PDU_END:
+ sscop->funcs->verbose(sscop, sscop->aarg,
+ "%s END r=%u s=%u pl=%u",
+ dir, (v1 >> 29) & 1, (v1 >> 28) & 1, (v1 >> 30) & 0x3);
+ return;
+
+ case PDU_ENDAK:
+ sscop->funcs->verbose(sscop, sscop->aarg, "%s ENDAK", dir);
+ return;
+
+ case PDU_RS:
+ sscop->funcs->verbose(sscop, sscop->aarg,
+ "%s RS n(mr)=%u n(sq)=%u pl=%u",
+ dir, v1 & 0xffffff, v2 & 0xff, (v1 >> 30) & 0x3);
+ return;
+
+ case PDU_RSAK:
+ sscop->funcs->verbose(sscop, sscop->aarg, "%s RSAK n(mr)=%u",
+ dir, v1 & 0xffffff);
+ return;
+
+ case PDU_BGREJ:
+ sscop->funcs->verbose(sscop, sscop->aarg, "%s BGREJ pl=%u",
+ dir, (v1 >> 30) & 0x3);
+ return;
+
+ case PDU_SD:
+ sscop->funcs->verbose(sscop, sscop->aarg, "%s SD n(s)=%u pl=%u",
+ dir, v1 & 0xffffff, (v1 >> 30) & 0x3);
+ return;
+
+ case PDU_ER:
+ sscop->funcs->verbose(sscop, sscop->aarg, "%s ER n(mr)=%u n(sq)=%u",
+ dir, v1 & 0xffffff, v2 & 0xff);
+ return;
+
+ case PDU_POLL:
+ sscop->funcs->verbose(sscop, sscop->aarg, "%s POLL n(s)=%u n(ps)=%u",
+ dir, v1 & 0xffffff, v2 & 0xffffff);
+ return;
+
+ case PDU_STAT:
+ if (size < 12)
+ return;
+ v3 = MBUF_TRAIL32(m, -3);
+ sscop->funcs->verbose(sscop, sscop->aarg,
+ "%s STAT n(r)=%u n(mr)=%u n(ps)=%u",
+ dir, v1 & 0xffffff, v2 & 0xffffff, v3 & 0xffffff);
+ n = (size - 12) / 4;
+ for (i = 0; i < (size - 12) / 4; i++, n--) {
+ v4 = MBUF_TRAIL32(m, -4 - (int)i);
+ sscop->funcs->verbose(sscop, sscop->aarg,
+ " LE(%u)=%u", n, v4 & 0xffffff);
+ }
+ return;
+
+ case PDU_USTAT:
+ if (size < 16)
+ return;
+ sscop->funcs->verbose(sscop, sscop->aarg,
+ "%s STAT n(r)=%u n(mr)=%u LE1=%u LE2=%u",
+ dir, v1 & 0xffffff, v2 & 0xffffff,
+ MBUF_TRAIL32(m, -4) & 0xffffff,
+ MBUF_TRAIL32(m, -3) & 0xffffff);
+ return;
+
+ case PDU_UD:
+ sscop->funcs->verbose(sscop, sscop->aarg,
+ "%s UD pl=%u", dir, (v1 >> 30) & 0x3);
+ return;
+
+ case PDU_MD:
+ sscop->funcs->verbose(sscop, sscop->aarg,
+ "%s MD pl=%u", dir, (v1 >> 30) & 0x3);
+ return;
+
+ case PDU_ERAK:
+ sscop->funcs->verbose(sscop, sscop->aarg,
+ "%s ERAK n(mr)=%u", dir, v1 & 0xffffff);
+ return;
+ }
+}
+#endif
+
+
+/*
+ * Initialize state of variables
+ */
+static void
+sscop_init(struct sscop *sscop)
+{
+ sscop->state = SSCOP_IDLE;
+
+ sscop->vt_sq = 0;
+ sscop->vr_sq = 0;
+ sscop->clear_buffers = 1;
+
+ sscop->ll_busy = 0;
+
+ sscop->rxq = 0;
+}
+
+static void
+sscop_clear(struct sscop *sscop)
+{
+ TIMER_STOP(sscop, cc);
+ TIMER_STOP(sscop, ka);
+ TIMER_STOP(sscop, nr);
+ TIMER_STOP(sscop, idle);
+ TIMER_STOP(sscop, poll);
+
+ FREE_UU(uu_bgn);
+ FREE_UU(uu_bgak);
+ FREE_UU(uu_bgrej);
+ FREE_UU(uu_end);
+ FREE_UU(uu_rs);
+
+ MSGQ_CLEAR(&sscop->xq);
+ MSGQ_CLEAR(&sscop->uxq);
+ MSGQ_CLEAR(&sscop->mxq);
+ MSGQ_CLEAR(&sscop->xbuf);
+ MSGQ_CLEAR(&sscop->rbuf);
+
+ SIGQ_CLEAR(&sscop->sigs);
+ SIGQ_CLEAR(&sscop->saved_sigs);
+}
+
+
+/*
+ * Allocate instance memory, initialize the state of all variables.
+ */
+struct sscop *
+sscop_create(void *a, const struct sscop_funcs *funcs)
+{
+ struct sscop *sscop;
+
+ MEMZALLOC(sscop, struct sscop *, sizeof(struct sscop));
+ if (sscop == NULL)
+ return (NULL);
+
+ if (a == NULL)
+ sscop->aarg = sscop;
+ else
+ sscop->aarg = a;
+ sscop->funcs = funcs;
+
+ sscop->maxk = MAXK;
+ sscop->maxj = MAXJ;
+ sscop->maxcc = MAXCC;
+ sscop->maxpd = MAXPD;
+ sscop->maxstat = MAXSTAT;
+ sscop->timercc = TIMERCC;
+ sscop->timerka = TIMERKA;
+ sscop->timernr = TIMERNR;
+ sscop->timerpoll = TIMERPOLL;
+ sscop->timeridle = TIMERIDLE;
+ sscop->robustness = 0;
+ sscop->poll_after_rex = 0;
+ sscop->mr = MAXMR;
+
+ TIMER_INIT(sscop, cc);
+ TIMER_INIT(sscop, nr);
+ TIMER_INIT(sscop, ka);
+ TIMER_INIT(sscop, poll);
+ TIMER_INIT(sscop, idle);
+
+ MSGQ_INIT(&sscop->xq);
+ MSGQ_INIT(&sscop->uxq);
+ MSGQ_INIT(&sscop->mxq);
+ MSGQ_INIT(&sscop->rbuf);
+ MSGQ_INIT(&sscop->xbuf);
+
+ SIGQ_INIT(&sscop->sigs);
+ SIGQ_INIT(&sscop->saved_sigs);
+
+ sscop_init(sscop);
+
+ return (sscop);
+}
+
+/*
+ * Free all resources in a sscop instance
+ */
+void
+sscop_destroy(struct sscop *sscop)
+{
+ sscop_reset(sscop);
+
+ MEMFREE(sscop);
+}
+
+/*
+ * Reset the SSCOP instance.
+ */
+void
+sscop_reset(struct sscop *sscop)
+{
+ sscop_clear(sscop);
+ sscop_init(sscop);
+}
+
+void
+sscop_getparam(const struct sscop *sscop, struct sscop_param *p)
+{
+ p->timer_cc = sscop->timercc;
+ p->timer_poll = sscop->timerpoll;
+ p->timer_keep_alive = sscop->timerka;
+ p->timer_no_response = sscop->timernr;
+ p->timer_idle = sscop->timeridle;
+ p->maxk = sscop->maxk;
+ p->maxj = sscop->maxj;
+ p->maxcc = sscop->maxcc;
+ p->maxpd = sscop->maxpd;
+ p->maxstat = sscop->maxstat;
+ p->mr = sscop->mr;
+ p->flags = 0;
+ if(sscop->robustness)
+ p->flags |= SSCOP_ROBUST;
+ if(sscop->poll_after_rex)
+ p->flags |= SSCOP_POLLREX;
+}
+
+int
+sscop_setparam(struct sscop *sscop, struct sscop_param *p, u_int *pmask)
+{
+ u_int mask = *pmask;
+
+ /* can change only in idle state */
+ if (sscop->state != SSCOP_IDLE)
+ return (EISCONN);
+
+ *pmask = 0;
+
+ /*
+ * first check all parameters
+ */
+ if ((mask & SSCOP_SET_TCC) && p->timer_cc == 0)
+ *pmask |= SSCOP_SET_TCC;
+ if ((mask & SSCOP_SET_TPOLL) && p->timer_poll == 0)
+ *pmask |= SSCOP_SET_TPOLL;
+ if ((mask & SSCOP_SET_TKA) && p->timer_keep_alive == 0)
+ *pmask |= SSCOP_SET_TKA;
+ if ((mask & SSCOP_SET_TNR) && p->timer_no_response == 0)
+ *pmask |= SSCOP_SET_TNR;
+ if ((mask & SSCOP_SET_TIDLE) && p->timer_idle == 0)
+ *pmask |= SSCOP_SET_TIDLE;
+ if ((mask & SSCOP_SET_MAXK) && p->maxk > MAXMAXK)
+ *pmask |= SSCOP_SET_MAXK;
+ if ((mask & SSCOP_SET_MAXJ) && p->maxj > MAXMAXJ)
+ *pmask |= SSCOP_SET_MAXJ;
+ if ((mask & SSCOP_SET_MAXCC) && p->maxcc > 255)
+ *pmask |= SSCOP_SET_MAXCC;
+ if ((mask & SSCOP_SET_MAXPD) && p->maxpd >= (1 << 24))
+ *pmask |= SSCOP_SET_MAXPD;
+ if ((mask & SSCOP_SET_MAXSTAT) &&
+ ((p->maxstat & 1) == 0 || p->maxstat == 1 || p->maxstat == 2 ||
+ p->maxstat * 4 > MAXMAXK - 8))
+ *pmask |= SSCOP_SET_MAXSTAT;
+ if ((mask & SSCOP_SET_MR) && p->mr >= (1 << 24) - 1)
+ *pmask |= SSCOP_SET_MR;
+
+ if (*pmask)
+ return (EINVAL);
+
+
+ /*
+ * now set it
+ */
+ if (mask & SSCOP_SET_TCC)
+ sscop->timercc = p->timer_cc;
+
+ if (mask & SSCOP_SET_TPOLL)
+ sscop->timerpoll = p->timer_poll;
+
+ if (mask & SSCOP_SET_TKA)
+ sscop->timerka = p->timer_keep_alive;
+
+ if (mask & SSCOP_SET_TNR)
+ sscop->timernr = p->timer_no_response;
+
+ if (mask & SSCOP_SET_TIDLE)
+ sscop->timeridle = p->timer_idle;
+
+ if (mask & SSCOP_SET_MAXK)
+ sscop->maxk = p->maxk;
+ if (mask & SSCOP_SET_MAXJ)
+ sscop->maxj = p->maxj;
+
+ if (mask & SSCOP_SET_MAXCC)
+ sscop->maxcc = p->maxcc;
+ if (mask & SSCOP_SET_MAXPD)
+ sscop->maxpd = p->maxpd;
+ if (mask & SSCOP_SET_MAXSTAT)
+ sscop->maxstat = p->maxstat;
+
+ if (mask & SSCOP_SET_MR)
+ sscop->mr = p->mr;
+
+ if (mask & SSCOP_SET_ROBUST)
+ sscop->robustness = ((p->flags & SSCOP_ROBUST) != 0);
+
+ if (mask & SSCOP_SET_POLLREX)
+ sscop->poll_after_rex = ((p->flags & SSCOP_POLLREX) != 0);
+
+ return (0);
+}
+
+enum sscop_state
+sscop_getstate(const struct sscop *sscop)
+{
+ return (sscop->state);
+}
+
+
+/************************************************************/
+/*
+ * EXTERNAL INPUT SIGNAL MAPPING
+ */
+
+/*
+ * Map AA signal to SSCOP internal signal
+ */
+int
+sscop_aasig(struct sscop *sscop, enum sscop_aasig sig,
+ struct SSCOP_MBUF_T *m, u_int arg)
+{
+ struct sscop_msg *msg;
+
+ if (sig >= sizeof(sscop_sigs)/sizeof(sscop_sigs[0])) {
+ VERBOSE(sscop, SSCOP_DBG_INSIG, (sscop, sscop->aarg,
+ "AA-Signal %u - bad signal", sig));
+ MBUF_FREE(m);
+ return (EINVAL);
+ }
+ VERBOSE(sscop, SSCOP_DBG_INSIG, (sscop, sscop->aarg,
+ "AA-Signal %s in state %s with%s message",
+ sscop_sigs[sig], states[sscop->state], m ? "" : "out"));
+
+ MSG_ALLOC(msg);
+ if (msg == NULL) {
+ FAILURE("sscop: cannot allocate aasig");
+ MBUF_FREE(m);
+ return (ENOMEM);
+ }
+
+ switch(sig) {
+
+ case SSCOP_ESTABLISH_request:
+ msg->m = m;
+ msg->rexmit = arg;
+ sscop_signal(sscop, SIG_ESTAB_REQ, msg);
+ break;
+
+ case SSCOP_ESTABLISH_response:
+ msg->m = m;
+ msg->rexmit = arg;
+ sscop_signal(sscop, SIG_ESTAB_RESP, msg);
+ break;
+
+ case SSCOP_RELEASE_request:
+ msg->m = m;
+ sscop_signal(sscop, SIG_RELEASE_REQ, msg);
+ break;
+
+ case SSCOP_DATA_request:
+ msg->m = m;
+ sscop_signal(sscop, SIG_USER_DATA, msg);
+ break;
+
+ case SSCOP_UDATA_request:
+ msg->m = m;
+ sscop_signal(sscop, SIG_UDATA, msg);
+ break;
+
+ case SSCOP_RECOVER_response:
+ MBUF_FREE(m);
+ MSG_FREE(msg);
+ sscop_signal(sscop, SIG_RECOVER, NULL);
+ break;
+
+ case SSCOP_RESYNC_request:
+ msg->m = m;
+ sscop_signal(sscop, SIG_SYNC_REQ, msg);
+ break;
+
+ case SSCOP_RESYNC_response:
+ MBUF_FREE(m);
+ MSG_FREE(msg);
+ sscop_signal(sscop, SIG_SYNC_RESP, NULL);
+ break;
+
+ case SSCOP_RETRIEVE_request:
+ MBUF_FREE(m);
+ msg->rexmit = arg;
+ sscop_signal(sscop, SIG_RETRIEVE, msg);
+ break;
+
+ case SSCOP_ESTABLISH_indication:
+ case SSCOP_ESTABLISH_confirm:
+ case SSCOP_RELEASE_indication:
+ case SSCOP_RELEASE_confirm:
+ case SSCOP_DATA_indication:
+ case SSCOP_UDATA_indication:
+ case SSCOP_RECOVER_indication:
+ case SSCOP_RESYNC_indication:
+ case SSCOP_RESYNC_confirm:
+ case SSCOP_RETRIEVE_indication:
+ case SSCOP_RETRIEVE_COMPL_indication:
+ MBUF_FREE(m);
+ MSG_FREE(msg);
+ return EINVAL;
+ }
+
+ return 0;
+}
+
+/*
+ * Signal from layer management.
+ */
+int
+sscop_maasig(struct sscop *sscop, enum sscop_maasig sig, struct SSCOP_MBUF_T *m)
+{
+ struct sscop_msg *msg;
+
+ if (sig >= sizeof(sscop_msigs)/sizeof(sscop_msigs[0])) {
+ VERBOSE(sscop, SSCOP_DBG_INSIG, (sscop, sscop->aarg,
+ "MAA-Signal %u - bad signal", sig));
+ MBUF_FREE(m);
+ return (EINVAL);
+ }
+ VERBOSE(sscop, SSCOP_DBG_INSIG, (sscop, sscop->aarg,
+ "MAA-Signal %s in state %s with%s message",
+ sscop_msigs[sig], states[sscop->state], m ? "" : "out"));
+
+ MSG_ALLOC(msg);
+ if (msg == NULL) {
+ FAILURE("sscop: cannot allocate maasig");
+ MBUF_FREE(m);
+ return (ENOMEM);
+ }
+
+ switch (sig) {
+
+ case SSCOP_MDATA_request:
+ msg->m = m;
+ sscop_signal(sscop, SIG_MDATA, msg);
+ break;
+
+ case SSCOP_MDATA_indication:
+ case SSCOP_MERROR_indication:
+ MBUF_FREE(m);
+ MSG_FREE(msg);
+ return (EINVAL);
+ }
+ return (0);
+}
+
+/*
+ * Map PDU to SSCOP signal.
+ */
+void
+sscop_input(struct sscop *sscop, struct SSCOP_MBUF_T *m)
+{
+ struct sscop_msg *msg;
+ union pdu pdu;
+ u_int size;
+
+ MSG_ALLOC(msg);
+ if(msg == NULL) {
+ FAILURE("sscop: cannot allocate in pdu msg");
+ MBUF_FREE(m);
+ return;
+ }
+
+ msg->m = m;
+ msg->rexmit = 0;
+
+ size = MBUF_LEN(m);
+
+ if(size % 4 != 0 || size < 4)
+ goto err;
+
+ pdu.sscop_null = MBUF_TRAIL32(m, -1);
+
+ VERBOSE(sscop, SSCOP_DBG_PDU, (sscop, sscop->aarg,
+ "got %s, size=%u", pdus[pdu.sscop_type], size));
+
+#ifdef SSCOP_DEBUG
+#define ENSURE(C,F) if(!(C)) { VERBOSE(sscop, SSCOP_DBG_PDU, F); goto err; }
+#else
+#define ENSURE(C,F) if(!(C)) goto err
+#endif
+
+#ifdef SSCOP_DEBUG
+ if (ISVERBOSE(sscop, SSCOP_DBG_PDU))
+ sscop_dump_pdu(sscop, "rx", m);
+#endif
+
+ switch(pdu.sscop_type) {
+
+ default:
+ ENSURE(0, (sscop, sscop->aarg,
+ "Bad PDU type %u", pdu.sscop_type));
+ break;
+
+ case PDU_BGN:
+ ENSURE(size >= 8U, (sscop, sscop->aarg,
+ "PDU_BGN size=%u", size));
+ ENSURE(size >= 8U + pdu.sscop_pl, (sscop, sscop->aarg,
+ "PDU_BGN size=%u pl=%u", size, pdu.sscop_pl));
+ ENSURE(size <= 8U + sscop->maxj, (sscop, sscop->aarg,
+ "PDU_BGN size=%u", size));
+ sscop_signal(sscop, SIG_BGN, msg);
+ break;
+
+ case PDU_BGAK:
+ ENSURE(size >= 8U, (sscop, sscop->aarg,
+ "PDU_BGAK size=%u", size));
+ ENSURE(size >= 8U + pdu.sscop_pl, (sscop, sscop->aarg,
+ "PDU_BGAK size=%u pl=%u", size, pdu.sscop_pl));
+ ENSURE(size <= 8U + sscop->maxj, (sscop, sscop->aarg,
+ "PDU_BGAK size=%u", size));
+ sscop_signal(sscop, SIG_BGAK, msg);
+ break;
+
+ case PDU_END:
+ ENSURE(size >= 8U, (sscop, sscop->aarg,
+ "PDU_END size=%u", size));
+ ENSURE(size >= 8U + pdu.sscop_pl, (sscop, sscop->aarg,
+ "PDU_END size=%u pl=%u", size, pdu.sscop_pl));
+ ENSURE(size <= 8U + sscop->maxj, (sscop, sscop->aarg,
+ "PDU_END size=%u", size));
+ sscop_signal(sscop, SIG_END, msg);
+ break;
+
+ case PDU_ENDAK:
+ ENSURE(size == 8U, (sscop, sscop->aarg,
+ "PDU_ENDAK size=%u", size));
+ sscop_signal(sscop, SIG_ENDAK, msg);
+ break;
+
+ case PDU_BGREJ:
+ ENSURE(size >= 8U, (sscop, sscop->aarg,
+ "PDU_BGREJ size=%u", size));
+ ENSURE(size >= 8U + pdu.sscop_pl, (sscop, sscop->aarg,
+ "PDU_BGREJ size=%u pl=%u", size, pdu.sscop_pl));
+ ENSURE(size <= 8U + sscop->maxj, (sscop, sscop->aarg,
+ "PDU_BGREJ size=%u", size));
+ sscop_signal(sscop, SIG_BGREJ, msg);
+ break;
+
+ case PDU_SD:
+ ENSURE(size >= 4U + pdu.sscop_pl, (sscop, sscop->aarg,
+ "PDU_SD size=%u pl=%u", size, pdu.sscop_pl));
+ ENSURE(size <= 4U + sscop->maxk, (sscop, sscop->aarg,
+ "PDU_SD size=%u", size));
+ sscop_signal(sscop, SIG_SD, msg);
+ break;
+
+ case PDU_UD:
+ ENSURE(size >= 4U + pdu.sscop_pl, (sscop, sscop->aarg,
+ "PDU_UD size=%u pl=%u", size, pdu.sscop_pl));
+ ENSURE(size <= 4U + sscop->maxk, (sscop, sscop->aarg,
+ "PDU_UD size=%u", size));
+ sscop_signal(sscop, SIG_UD, msg);
+ break;
+
+ case PDU_MD:
+ ENSURE(size >= 4U + pdu.sscop_pl, (sscop, sscop->aarg,
+ "PDU_MD size=%u pl=%u", size, pdu.sscop_pl));
+ ENSURE(size <= 4U + sscop->maxk, (sscop, sscop->aarg,
+ "PDU_MD size=%u", size));
+ sscop_signal(sscop, SIG_MD, msg);
+ break;
+
+ case PDU_POLL:
+ ENSURE(size == 8U, (sscop, sscop->aarg,
+ "PDU_POLL size=%u", size));
+ sscop_signal(sscop, SIG_POLL, msg);
+ break;
+
+ case PDU_STAT:
+ ENSURE(size >= 12U, (sscop, sscop->aarg,
+ "PDU_STAT size=%u", size));
+ ENSURE(size <= 12U + 4 * sscop->maxstat, (sscop, sscop->aarg,
+ "PDU_STAT size=%u", size));
+ sscop_signal(sscop, SIG_STAT, msg);
+ break;
+
+ case PDU_RS:
+ ENSURE(size >= 8U, (sscop, sscop->aarg,
+ "PDU_RS size=%u", size));
+ ENSURE(size >= 8U + pdu.sscop_pl, (sscop, sscop->aarg,
+ "PDU_RS size=%u pl=%u", size, pdu.sscop_pl));
+ ENSURE(size <= 8U + sscop->maxj, (sscop, sscop->aarg,
+ "PDU_RS size=%u", size));
+ sscop_signal(sscop, SIG_RS, msg);
+ break;
+
+ case PDU_RSAK:
+ ENSURE(size == 8U, (sscop, sscop->aarg,
+ "PDU_RSAK size=%u", size));
+ sscop_signal(sscop, SIG_RSAK, msg);
+ break;
+
+ case PDU_ER:
+ ENSURE(size == 8U, (sscop, sscop->aarg,
+ "PDU_ER size=%u", size));
+ sscop_signal(sscop, SIG_ER, msg);
+ break;
+
+ case PDU_ERAK:
+ ENSURE(size == 8U, (sscop, sscop->aarg,
+ "PDU_ERAK size=%u", size));
+ sscop_signal(sscop, SIG_ERAK, msg);
+ break;
+
+ case PDU_USTAT:
+ ENSURE(size == 16U, (sscop, sscop->aarg,
+ "PDU_ERAK size=%u", size));
+ sscop_signal(sscop, SIG_USTAT, msg);
+ break;
+ }
+#undef ENSURE
+ return;
+
+ err:
+ MAAL_ERROR(sscop, 'U', 0);
+ SSCOP_MSG_FREE(msg);
+}
+
+/************************************************************/
+/*
+ * UTILITIES
+ */
+
+/*
+ * Move the receiver window by N packets
+ */
+u_int
+sscop_window(struct sscop *sscop, u_int n)
+{
+ sscop->vr_mr += n;
+ return (SEQNO_DIFF(sscop->vr_mr, sscop->vr_r));
+}
+
+/*
+ * Lower layer busy handling
+ */
+u_int
+sscop_setbusy(struct sscop *sscop, int busy)
+{
+ u_int old = sscop->ll_busy;
+
+ if (busy > 0)
+ sscop->ll_busy = 1;
+ else if (busy == 0) {
+ sscop->ll_busy = 0;
+ if(old)
+ handle_sigs(sscop);
+ }
+
+ return (old);
+}
+
+const char *
+sscop_signame(enum sscop_aasig sig)
+{
+ static char str[40];
+
+ if (sig >= sizeof(sscop_sigs)/sizeof(sscop_sigs[0])) {
+ sprintf(str, "BAD SSCOP_AASIG %u", sig);
+ return (str);
+ } else {
+ return (sscop_sigs[sig]);
+ }
+}
+
+const char *
+sscop_msigname(enum sscop_maasig sig)
+{
+ static char str[40];
+
+ if (sig >= sizeof(sscop_msigs)/sizeof(sscop_msigs[0])) {
+ sprintf(str, "BAD SSCOP_MAASIG %u", sig);
+ return (str);
+ } else {
+ return (sscop_msigs[sig]);
+ }
+}
+
+const char *
+sscop_statename(enum sscop_state s)
+{
+ static char str[40];
+
+ if (s >= sizeof(states)/sizeof(states[0])) {
+ sprintf(str, "BAD SSCOP_STATE %u", s);
+ return (str);
+ } else {
+ return (states[s]);
+ }
+}
+
+
+/************************************************************/
+/*
+ * MACROS
+ */
+
+/*
+ * p 75: release buffers
+ */
+static void
+m_release_buffers(struct sscop *sscop)
+{
+ MSGQ_CLEAR(&sscop->xq);
+ MSGQ_CLEAR(&sscop->xbuf);
+ sscop->rxq = 0;
+ MSGQ_CLEAR(&sscop->rbuf);
+}
+
+/*
+ * P 75: Prepare retrival
+ */
+static void
+m_prepare_retrieval(struct sscop *sscop)
+{
+ struct sscop_msg *msg;
+
+ if (sscop->clear_buffers) {
+ MSGQ_CLEAR(&sscop->xq);
+ MSGQ_CLEAR(&sscop->xbuf);
+ }
+ MSGQ_FOREACH(msg, &sscop->xbuf)
+ msg->rexmit = 0;
+ sscop->rxq = 0;
+
+ MSGQ_CLEAR(&sscop->rbuf);
+}
+
+/*
+ * P 75: Prepare retrival
+ */
+static void
+m_prepare_recovery(struct sscop *sscop)
+{
+ struct sscop_msg *msg;
+
+ if(sscop->clear_buffers) {
+ MSGQ_CLEAR(&sscop->xq);
+ MSGQ_CLEAR(&sscop->xbuf);
+ }
+ MSGQ_FOREACH(msg, &sscop->xbuf)
+ msg->rexmit = 0;
+ sscop->rxq = 0;
+}
+
+
+/*
+ * P 75: Clear transmitter
+ */
+static void
+m_clear_transmitter(struct sscop *sscop)
+{
+ if(!sscop->clear_buffers) {
+ MSGQ_CLEAR(&sscop->xq);
+ MSGQ_CLEAR(&sscop->xbuf);
+ }
+}
+
+
+/*
+ * p 75: Deliver data
+ * Freeing the message is the responibility of the handler function.
+ */
+static void
+m_deliver_data(struct sscop *sscop)
+{
+ struct sscop_msg *msg;
+ u_int sn;
+
+ if ((msg = MSGQ_GET(&sscop->rbuf)) == NULL)
+ return;
+
+ if (sscop->clear_buffers) {
+ MSGQ_CLEAR(&sscop->rbuf);
+ return;
+ }
+
+ sn = msg->seqno + 1;
+ AAL_DATA(sscop, SSCOP_DATA_indication, msg->m, msg->seqno);
+ MSG_FREE(msg);
+
+ while ((msg = MSGQ_GET(&sscop->rbuf)) != NULL) {
+ ASSERT(msg->seqno == sn);
+ if (++sn == SSCOP_MAXSEQNO)
+ sn = 0;
+ AAL_DATA(sscop, SSCOP_DATA_indication, msg->m, msg->seqno);
+ MSG_FREE(msg);
+ }
+}
+
+/*
+ * P 75: Initialize state variables
+ */
+static void
+m_initialize_state(struct sscop *sscop)
+{
+ sscop->vt_s = 0;
+ sscop->vt_ps = 0;
+ sscop->vt_a = 0;
+
+ sscop->vt_pa = 1;
+ sscop->vt_pd = 0;
+ sscop->credit = 1;
+
+ sscop->vr_r = 0;
+ sscop->vr_h = 0;
+}
+
+/*
+ * p 76: Data retrieval
+ */
+static void
+m_data_retrieval(struct sscop *sscop, u_int rn)
+{
+ struct sscop_msg *s;
+
+ if (rn != SSCOP_RETRIEVE_UNKNOWN) {
+ if(rn >= SSCOP_RETRIEVE_TOTAL)
+ rn = sscop->vt_a;
+ else
+ rn++;
+ while(rn >= sscop->vt_a && rn < sscop->vt_s) {
+ if(rn == SSCOP_MAXSEQNO) rn = 0;
+ if((s = QFIND(&sscop->xbuf, rn)) != NULL) {
+ MSGQ_REMOVE(&sscop->xbuf, s);
+ AAL_DATA(sscop, SSCOP_RETRIEVE_indication,
+ s->m, 0);
+ MSG_FREE(s);
+ }
+ rn++;
+ }
+ }
+
+ while((s = MSGQ_GET(&sscop->xq)) != NULL) {
+ AAL_DATA(sscop, SSCOP_RETRIEVE_indication, s->m, 0);
+ MSG_FREE(s);
+ }
+ AAL_SIG(sscop, SSCOP_RETRIEVE_COMPL_indication);
+}
+
+/*
+ * P 76: Detect retransmission. PDU type must already be stripped.
+ */
+static int
+m_detect_retransmission(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union bgn bgn;
+
+ bgn.sscop_null = MBUF_TRAIL32(msg->m, -1);
+
+ if (sscop->vr_sq == bgn.sscop_bgns)
+ return (1);
+
+ sscop->vr_sq = bgn.sscop_bgns;
+ return (0);
+}
+
+/*
+ * P 76: Set POLL timer
+ */
+static void
+m_set_poll_timer(struct sscop *sscop)
+{
+ if(MSGQ_EMPTY(&sscop->xq) && sscop->vt_s == sscop->vt_a)
+ TIMER_RESTART(sscop, ka);
+ else
+ TIMER_RESTART(sscop, poll);
+}
+
+/*
+ * P 77: Reset data transfer timers
+ */
+static void
+m_reset_data_xfer_timers(struct sscop *sscop)
+{
+ TIMER_STOP(sscop, ka);
+ TIMER_STOP(sscop, nr);
+ TIMER_STOP(sscop, idle);
+ TIMER_STOP(sscop, poll);
+}
+
+/*
+ * P 77: Set data transfer timers
+ */
+static void
+m_set_data_xfer_timers(struct sscop *sscop)
+{
+ TIMER_RESTART(sscop, poll);
+ TIMER_RESTART(sscop, nr);
+}
+
+/*
+ * P 77: Initialize VR(MR)
+ */
+static void
+m_initialize_mr(struct sscop *sscop)
+{
+ sscop->vr_mr = sscop->mr;
+}
+
+/************************************************************/
+/*
+ * CONDITIONS
+ */
+static int
+c_ready_pduq(struct sscop *sscop)
+{
+ if (!sscop->ll_busy &&
+ (sscop->rxq != 0 ||
+ sscop->vt_s < sscop->vt_ms ||
+ TIMER_ISACT(sscop, idle)))
+ return (1);
+ return (0);
+}
+
+/************************************************************/
+/*
+ * SEND PDUS
+ */
+
+/*
+ * Send BG PDU.
+ */
+static void
+send_bgn(struct sscop *sscop, struct SSCOP_MBUF_T *uu)
+{
+ union pdu pdu;
+ union bgn bgn;
+ struct SSCOP_MBUF_T *m;
+
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_BGN;
+ pdu.sscop_ns = sscop->vr_mr;
+
+ bgn.sscop_null = 0;
+ bgn.sscop_bgns = sscop->vt_sq;
+
+ if(uu) {
+ if ((m = MBUF_DUP(uu)) == NULL) {
+ FAILURE("sscop: cannot allocate BGN");
+ return;
+ }
+ pdu.sscop_pl += MBUF_PAD4(m);
+ } else {
+ if ((m = MBUF_ALLOC(8)) == NULL) {
+ FAILURE("sscop: cannot allocate BGN");
+ return;
+ }
+ }
+
+ MBUF_APPEND32(m, bgn.sscop_null);
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send BGREJ PDU.
+ */
+static void
+send_bgrej(struct sscop *sscop, struct SSCOP_MBUF_T *uu)
+{
+ union pdu pdu;
+ union bgn bgn;
+ struct SSCOP_MBUF_T *m;
+
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_BGREJ;
+ bgn.sscop_null = 0;
+
+ if(uu) {
+ if((m = MBUF_DUP(uu)) == NULL) {
+ FAILURE("sscop: cannot allocate BGREJ");
+ return;
+ }
+ pdu.sscop_pl += MBUF_PAD4(m);
+ } else {
+ if((m = MBUF_ALLOC(8)) == NULL) {
+ FAILURE("sscop: cannot allocate BGREJ");
+ return;
+ }
+ }
+
+ MBUF_APPEND32(m, bgn.sscop_null);
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send BGAK PDU.
+ */
+static void
+send_bgak(struct sscop *sscop, struct SSCOP_MBUF_T *uu)
+{
+ union pdu pdu;
+ union bgn bgn;
+ struct SSCOP_MBUF_T *m;
+
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_BGAK;
+ pdu.sscop_ns = sscop->vr_mr;
+ bgn.sscop_null = 0;
+
+ if(uu) {
+ if((m = MBUF_DUP(uu)) == NULL) {
+ FAILURE("sscop: cannot allocate BGAK");
+ return;
+ }
+ pdu.sscop_pl += MBUF_PAD4(m);
+ } else {
+ if((m = MBUF_ALLOC(8)) == NULL) {
+ FAILURE("sscop: cannot allocate BGAK");
+ return;
+ }
+ }
+
+ MBUF_APPEND32(m, bgn.sscop_null);
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send SD PDU. The function makes a duplicate of the message.
+ */
+static void
+send_sd(struct sscop *sscop, struct SSCOP_MBUF_T *m, u_int seqno)
+{
+ union pdu pdu;
+
+ if((m = MBUF_DUP(m)) == NULL) {
+ FAILURE("sscop: cannot allocate SD");
+ return;
+ }
+
+ pdu.sscop_null = 0;
+ pdu.sscop_pl = 0;
+ pdu.sscop_type = PDU_SD;
+ pdu.sscop_ns = seqno;
+
+ pdu.sscop_pl += MBUF_PAD4(m);
+
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send a UD PDU. The caller must free the sscop msg part.
+ */
+static void
+send_ud(struct sscop *sscop, struct SSCOP_MBUF_T *m)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_UD;
+
+ pdu.sscop_pl += MBUF_PAD4(m);
+
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send a MD PDU. The caller must free the sscop msg part.
+ */
+static void
+send_md(struct sscop *sscop, struct SSCOP_MBUF_T *m)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_MD;
+
+ pdu.sscop_pl += MBUF_PAD4(m);
+
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send END PDU.
+ */
+static void
+send_end(struct sscop *sscop, int src, struct SSCOP_MBUF_T *uu)
+{
+ union pdu pdu;
+ struct SSCOP_MBUF_T *m;
+
+ sscop->last_end_src = src;
+
+ pdu.sscop_null = 0;
+ pdu.sscop_s = src;
+ pdu.sscop_type = PDU_END;
+
+ if(uu) {
+ if((m = MBUF_DUP(uu)) == NULL) {
+ FAILURE("sscop: cannot allocate END");
+ return;
+ }
+ pdu.sscop_pl += MBUF_PAD4(m);
+ } else {
+ if((m = MBUF_ALLOC(8)) == NULL) {
+ FAILURE("sscop: cannot allocate END");
+ return;
+ }
+ }
+
+ MBUF_APPEND32(m, 0);
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send USTAT PDU. List must be terminated by -1.
+ */
+static void
+send_ustat(struct sscop *sscop, ...)
+{
+ va_list ap;
+ int f;
+ u_int n;
+ union pdu pdu;
+ union seqno seqno;
+ struct SSCOP_MBUF_T *m;
+
+ va_start(ap, sscop);
+ n = 0;
+ while((f = va_arg(ap, int)) >= 0)
+ n++;
+ va_end(ap);
+
+ if((m = MBUF_ALLOC(n * 4 + 8)) == NULL) {
+ FAILURE("sscop: cannot allocate USTAT");
+ return;
+ }
+
+ va_start(ap, sscop);
+ while((f = va_arg(ap, int)) >= 0) {
+ seqno.sscop_null = 0;
+ seqno.sscop_n = f;
+ MBUF_APPEND32(m, seqno.sscop_null);
+ }
+ va_end(ap);
+
+ seqno.sscop_null = 0;
+ seqno.sscop_n = sscop->vr_mr;
+ MBUF_APPEND32(m, seqno.sscop_null);
+
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_USTAT;
+ pdu.sscop_ns = sscop->vr_r;
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send ER PDU.
+ */
+static void
+send_er(struct sscop *sscop)
+{
+ union pdu pdu;
+ union bgn bgn;
+ struct SSCOP_MBUF_T *m;
+
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_ER;
+ pdu.sscop_ns = sscop->vr_mr;
+
+ bgn.sscop_null = 0;
+ bgn.sscop_bgns = sscop->vt_sq;
+
+ if((m = MBUF_ALLOC(8)) == NULL) {
+ FAILURE("sscop: cannot allocate ER");
+ return;
+ }
+ MBUF_APPEND32(m, bgn.sscop_null);
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send POLL PDU.
+ */
+static void
+send_poll(struct sscop *sscop)
+{
+ union pdu pdu;
+ union seqno seqno;
+ struct SSCOP_MBUF_T *m;
+
+ seqno.sscop_null = 0;
+ seqno.sscop_n = sscop->vt_ps;
+
+ pdu.sscop_null = 0;
+ pdu.sscop_ns = sscop->vt_s;
+ pdu.sscop_type = PDU_POLL;
+
+ if((m = MBUF_ALLOC(8)) == NULL) {
+ FAILURE("sscop: cannot allocate POLL");
+ return;
+ }
+ MBUF_APPEND32(m, seqno.sscop_null);
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send STAT PDU. List is already in buffer.
+ */
+static void
+send_stat(struct sscop *sscop, u_int nps, struct SSCOP_MBUF_T *m)
+{
+ union pdu pdu;
+ union seqno seqno;
+
+ seqno.sscop_null = 0;
+ seqno.sscop_n = nps;
+ MBUF_APPEND32(m, seqno.sscop_null);
+
+ seqno.sscop_null = 0;
+ seqno.sscop_n = sscop->vr_mr;
+ MBUF_APPEND32(m, seqno.sscop_null);
+
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_STAT;
+ pdu.sscop_ns = sscop->vr_r;
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send ENDAK PDU.
+ */
+static void
+send_endak(struct sscop *sscop)
+{
+ union pdu pdu;
+ union seqno seqno;
+ struct SSCOP_MBUF_T *m;
+
+ seqno.sscop_null = 0;
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_ENDAK;
+
+ if((m = MBUF_ALLOC(8)) == NULL) {
+ FAILURE("sscop: cannot allocate ENDAK");
+ return;
+ }
+ MBUF_APPEND32(m, seqno.sscop_null);
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send ERAK PDU.
+ */
+static void
+send_erak(struct sscop *sscop)
+{
+ union pdu pdu;
+ union seqno seqno;
+ struct SSCOP_MBUF_T *m;
+
+ seqno.sscop_null = 0;
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_ERAK;
+ pdu.sscop_ns = sscop->vr_mr;
+
+ if((m = MBUF_ALLOC(8)) == NULL) {
+ FAILURE("sscop: cannot allocate ERAK");
+ return;
+ }
+ MBUF_APPEND32(m, seqno.sscop_null);
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send RS PDU
+ */
+static void
+send_rs(struct sscop *sscop, int resend, struct SSCOP_MBUF_T *uu)
+{
+ union pdu pdu;
+ union bgn bgn;
+ struct SSCOP_MBUF_T *m;
+
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_RS;
+ pdu.sscop_ns = resend ? sscop->rs_mr : sscop->vr_mr;
+
+ bgn.sscop_null = 0;
+ bgn.sscop_bgns = resend ? sscop->rs_sq : sscop->vt_sq;
+
+ sscop->rs_mr = pdu.sscop_ns;
+ sscop->rs_sq = bgn.sscop_bgns;
+
+ if(uu) {
+ if((m = MBUF_DUP(uu)) == NULL) {
+ FAILURE("sscop: cannot allocate RS");
+ return;
+ }
+ pdu.sscop_pl += MBUF_PAD4(m);
+ } else {
+ if((m = MBUF_ALLOC(8)) == NULL) {
+ FAILURE("sscop: cannot allocate RS");
+ return;
+ }
+ }
+
+ MBUF_APPEND32(m, bgn.sscop_null);
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/*
+ * Send RSAK pdu
+ */
+static void
+send_rsak(struct sscop *sscop)
+{
+ union pdu pdu;
+ union seqno seqno;
+ struct SSCOP_MBUF_T *m;
+
+ seqno.sscop_null = 0;
+ pdu.sscop_null = 0;
+ pdu.sscop_type = PDU_RSAK;
+ pdu.sscop_ns = sscop->vr_mr;
+
+ if((m = MBUF_ALLOC(8)) == NULL) {
+ FAILURE("sscop: cannot allocate RSAK");
+ return;
+ }
+
+ MBUF_APPEND32(m, seqno.sscop_null);
+ MBUF_APPEND32(m, pdu.sscop_null);
+
+ AAL_SEND(sscop, m);
+}
+
+/************************************************************/
+/*
+ * P 31; IDLE && AA-ESTABLISH-request
+ * arg is UU data (opt).
+ */
+static void
+sscop_idle_establish_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ u_int br = uu->rexmit;
+
+ SET_UU(uu_bgn, uu);
+
+ m_clear_transmitter(sscop);
+
+ sscop->clear_buffers = br;
+
+ sscop->vt_cc = 1;
+ sscop->vt_sq++;
+
+ m_initialize_mr(sscop);
+
+ send_bgn(sscop, sscop->uu_bgn);
+
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_PEND);
+}
+
+/*
+ * P 31: IDLE && BGN PDU
+ * arg is the received PDU (freed).
+ */
+static void
+sscop_idle_bgn(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+ union bgn bgn;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(sscop->robustness) {
+ bgn.sscop_null = MBUF_STRIP32(msg->m);
+ sscop->vr_sq = bgn.sscop_bgns;
+ } else {
+ if(m_detect_retransmission(sscop, msg)) {
+ send_bgrej(sscop, sscop->uu_bgrej);
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+ }
+
+ sscop->vt_ms = pdu.sscop_ns;
+ sscop_set_state(sscop, SSCOP_IN_PEND);
+
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_indication, msg, pdu.sscop_pl, 0);
+}
+
+/*
+ * p 31: IDLE && ENDAK PDU
+ * p 34: OUT_PEND && ENDAK PDU
+ * p 34: OUT_PEND && SD PDU
+ * p 34: OUT_PEND && ERAK PDU
+ * p 34: OUT_PEND && END PDU
+ * p 34: OUT_PEND && STAT PDU
+ * p 34: OUT_PEND && USTAT PDU
+ * p 34: OUT_PEND && POLL PDU
+ * p 36: OUT_PEND && RS PDU
+ * p 36: OUT_PEND && RSAK PDU
+ * p 40: OUTGOING_DISCONNECT_PENDING && SD PDU
+ * p 40: OUTGOING_DISCONNECT_PENDING && BGAK PDU
+ * p 40: OUTGOING_DISCONNECT_PENDING && POLL PDU
+ * p 40: OUTGOING_DISCONNECT_PENDING && STAT PDU
+ * p 40: OUTGOING_DISCONNECT_PENDING && USTAT PDU
+ * p 41: OUTGOING_DISCONNECT_PENDING && ERAK PDU
+ * p 42: OUTGOING_DISCONNECT_PENDING && ER PDU
+ * p 42: OUTGOING_DISCONNECT_PENDING && RS PDU
+ * p 42: OUTGOING_DISCONNECT_PENDING && RSAK PDU
+ * p 43: OUTGOING_RESYNC && ER PDU
+ * p 43: OUTGOING_RESYNC && POLL PDU
+ * p 44: OUTGOING_RESYNC && STAT PDU
+ * p 44: OUTGOING_RESYNC && USTAT PDU
+ * p 45: OUTGOING_RESYNC && BGAK PDU
+ * p 45: OUTGOING_RESYNC && SD PDU
+ * p 45: OUTGOING_RESYNC && ERAK PDU
+ * P 60: READY && BGAK PDU
+ * P 60: READY && ERAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_ignore_pdu(struct sscop *sscop __unused, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 31: IDLE && END PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_end(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ send_endak(sscop);
+}
+
+/*
+ * p 31: IDLE && ER PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_er(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'L', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+}
+
+/*
+ * p 31: IDLE && BGREJ PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_bgrej(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'D', 0);
+ FREE_UU(uu_end);
+}
+
+/*
+ * p 32: IDLE && POLL PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_poll(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'G', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+}
+
+/*
+ * p 32: IDLE && SD PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_sd(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'A', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+}
+
+/*
+ * p 32: IDLE && BGAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_bgak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'C', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+}
+
+/*
+ * p 32: IDLE && ERAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_erak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'M', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+}
+
+/*
+ * p 32: IDLE && STAT PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_stat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'H', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+}
+
+/*
+ * p 32: IDLE && USTAT PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_ustat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'I', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+}
+
+/*
+ * p 33: IDLE & RS PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_rs(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'J', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+}
+
+/*
+ * p 33: IDLE & RSAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_idle_rsak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'K', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+}
+
+/*
+ * p 33: IDLE && PDU_Q
+ * p XX: OUTPEND && PDU_Q
+ * p 39: IN_PEND && PDU_Q
+ * p 45: OUT_RESYNC_PEND && PDU_Q
+ * p 48: IN_RESYNC_PEND && PDU_Q
+ * no arg
+ */
+static void
+sscop_flush_pduq(struct sscop *sscop __unused, struct sscop_msg *unused __unused)
+{
+#if 0
+ MSGQ_CLEAR(&sscop->xq);
+#endif
+}
+
+/*
+ * p 34: OUT_PEND && BGAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outpend_bgak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_ms = pdu.sscop_ns;
+
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_confirm, msg, pdu.sscop_pl, 0);
+
+ m_initialize_state(sscop);
+ m_set_data_xfer_timers(sscop);
+
+ sscop_set_state(sscop, SSCOP_READY);
+}
+
+/*
+ * P 34: OUT_PEND && BGREJ PDU
+ */
+static void
+sscop_outpend_bgrej(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+
+ AAL_UU_SIGNAL(sscop, SSCOP_RELEASE_indication, msg, pdu.sscop_pl, 0);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * P 35: OUT_PEND && TIMER_CC expiry
+ * no arg
+ */
+static void
+sscop_outpend_tcc(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ if(sscop->vt_cc >= sscop->maxcc) {
+ MAAL_ERROR(sscop, 'O', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+ } else {
+ sscop->vt_cc++;
+ send_bgn(sscop, sscop->uu_bgn);
+ TIMER_RESTART(sscop, cc);
+ }
+}
+
+/*
+ * P 35: OUT_PEND && RELEASE_REQ
+ * arg is UU
+ */
+static void
+sscop_outpend_release_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_end, uu);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_cc = 1;
+ send_end(sscop, 0, sscop->uu_end);
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_DIS_PEND);
+}
+
+/*
+ * P 36: OUT_PEND && BGN PDU
+ * arg is the received PDU (freed).
+ */
+static void
+sscop_outpend_bgn(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+
+ sscop->vt_ms = pdu.sscop_ns;
+
+ m_initialize_mr(sscop);
+
+ send_bgak(sscop, sscop->uu_bgak);
+
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_confirm, msg, pdu.sscop_pl, 0);
+
+ m_initialize_state(sscop);
+
+ m_set_data_xfer_timers(sscop);
+
+ sscop_set_state(sscop, SSCOP_READY);
+}
+
+/*
+ * p 37: IN_PEND && AA-ESTABLISH.response
+ * arg is UU
+ */
+static void
+sscop_inpend_establish_resp(struct sscop *sscop, struct sscop_msg *uu)
+{
+ u_int br = uu->rexmit;
+
+ SET_UU(uu_bgak, uu);
+
+ m_clear_transmitter(sscop);
+ sscop->clear_buffers = br;
+ m_initialize_mr(sscop);
+ send_bgak(sscop, sscop->uu_bgak);
+ m_initialize_state(sscop);
+ m_set_data_xfer_timers(sscop);
+
+ sscop_set_state(sscop, SSCOP_READY);
+}
+
+/*
+ * p 37: IN_PEND && AA-RELEASE.request
+ * arg is uu.
+ */
+static void
+sscop_inpend_release_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_bgrej, uu);
+
+ send_bgrej(sscop, sscop->uu_bgrej);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 37: IN_PEND && BGN PDU
+ * arg is pdu. (freed)
+ */
+static void
+sscop_inpend_bgn(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ sscop->vt_ms = pdu.sscop_ns;
+
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 0);
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_indication, msg, pdu.sscop_pl, 0);
+}
+
+/*
+ * p 37: IN_PEND && ER PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_er(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'L', 0);
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 37: IN_PEND && ENDAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_endak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'F', 0);
+
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 38: IN_PEND && BGAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_bgak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'C', 0);
+
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 38: IN_PEND && BGREJ PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_bgrej(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'D', 0);
+
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+
+ SSCOP_MSG_FREE(msg);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 38: IN_PEND && SD PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_sd(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'A', 0);
+
+ SSCOP_MSG_FREE(msg);
+
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 38: IN_PEND && USTAT PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_ustat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'I', 0);
+
+ SSCOP_MSG_FREE(msg);
+
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 38: IN_PEND && STAT PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_stat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'H', 0);
+
+ SSCOP_MSG_FREE(msg);
+
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 38: IN_PEND && POLL PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_poll(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'G', 0);
+
+ SSCOP_MSG_FREE(msg);
+
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 39: IN_PEND && ERAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_erak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'M', 0);
+}
+
+/*
+ * p 39: IN_PEND & RS PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_rs(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'J', 0);
+}
+
+/*
+ * p 39: IN_PEND & RSAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inpend_rsak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'K', 0);
+}
+
+/*
+ * p 39: IN_PEND && END PDU
+ * arg is pdu (freed).
+ * no uui
+ */
+static void
+sscop_inpend_end(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ send_endak(sscop);
+
+ AAL_UU_SIGNAL(sscop, SSCOP_RELEASE_indication,
+ msg, pdu.sscop_pl, (u_int)pdu.sscop_s);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 40: OUT_DIS_PEND && SSCOP_ESTABLISH_request
+ * no arg.
+ * no uui.
+ */
+static void
+sscop_outdis_establish_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_bgn, uu);
+
+ TIMER_STOP(sscop, cc);
+ m_clear_transmitter(sscop);
+ sscop->clear_buffers = 1;
+ sscop->vt_cc = 1;
+ sscop->vt_sq++;
+ m_initialize_mr(sscop);
+ send_bgn(sscop, sscop->uu_bgn);
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_PEND);
+}
+
+/*
+ * p 41: OUT_DIS_PEND && END PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outdis_end(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+ send_endak(sscop);
+
+ AAL_UU_SIGNAL(sscop, SSCOP_RELEASE_confirm, msg, pdu.sscop_pl, 0);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 41: OUT_DIS_PEND && ENDAK PDU
+ * p 41: OUT_DIS_PEND && BGREJ PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_outdis_endak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+
+ AAL_UU_SIGNAL(sscop, SSCOP_RELEASE_confirm, msg, pdu.sscop_pl, 0);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 41: OUT_DIS_PEND && TIMER CC expiry
+ * no arg
+ */
+static void
+sscop_outdis_cc(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ if(sscop->vt_cc >= sscop->maxcc) {
+ MAAL_ERROR(sscop, 'O', 0);
+ AAL_SIG(sscop, SSCOP_RELEASE_confirm);
+ sscop_set_state(sscop, SSCOP_IDLE);
+ } else {
+ sscop->vt_cc++;
+ send_end(sscop, sscop->last_end_src, sscop->uu_end);
+ TIMER_RESTART(sscop, cc);
+ }
+}
+
+/*
+ * p 42: OUT_DIS_PEND && BGN PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outdis_bgn(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ FREE_UU(uu_bgak);
+ send_bgak(sscop, NULL);
+ send_end(sscop, sscop->last_end_src, sscop->uu_end);
+ SSCOP_MSG_FREE(msg);
+
+ } else {
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_SIG(sscop, SSCOP_RELEASE_confirm);
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_indication,
+ msg, pdu.sscop_pl, 0);
+ sscop_set_state(sscop, SSCOP_IN_PEND);
+ }
+}
+
+/*
+ * p 43: OUT_RESYNC_PEND && BGN PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outsync_bgn(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ send_bgak(sscop, sscop->uu_bgak);
+ send_rs(sscop, 1, sscop->uu_rs);
+ SSCOP_MSG_FREE(msg);
+ } else {
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 0);
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_indication,
+ msg, pdu.sscop_pl, 0);
+ sscop_set_state(sscop, SSCOP_IN_PEND);
+ }
+}
+
+/*
+ * p 43: OUT_RESYNC_PEND && ENDAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outsync_endak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ TIMER_STOP(sscop, cc);
+ MAAL_ERROR(sscop, 'F', 0);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 43: OUT_RESYNC_PEND && BGREJ PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outsync_bgrej(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ TIMER_STOP(sscop, cc);
+ MAAL_ERROR(sscop, 'D', 0);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 43: OUT_RESYNC_PEND && END PDU
+ * arg is pdu (freed).
+ * no UU-data
+ */
+static void
+sscop_outsync_end(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+ send_endak(sscop);
+ AAL_UU_SIGNAL(sscop, SSCOP_RELEASE_indication, msg, pdu.sscop_pl,
+ (u_int)pdu.sscop_s);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 44: OUT_RESYNC && TIMER CC expiry
+ */
+static void
+sscop_outsync_cc(struct sscop *sscop, struct sscop_msg *msg __unused)
+{
+ if(sscop->vt_cc == sscop->maxcc) {
+ MAAL_ERROR(sscop, 'O', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+ } else {
+ sscop->vt_cc++;
+ send_rs(sscop, 1, sscop->uu_rs);
+ TIMER_RESTART(sscop, cc);
+ }
+}
+
+/*
+ * p 44: OUT_RESYNC && AA-RELEASE.request
+ * arg is UU
+ */
+static void
+sscop_outsync_release_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_end, uu);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_cc = 1;
+ send_end(sscop, 0, sscop->uu_end);
+ TIMER_RESTART(sscop, cc);
+ sscop_set_state(sscop, SSCOP_OUT_DIS_PEND);
+}
+
+/*
+ * p 45: OUT_RESYNC && RS PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outsync_rs(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_ms = pdu.sscop_ns;
+ m_initialize_mr(sscop);
+ send_rsak(sscop);
+ AAL_UU_SIGNAL(sscop, SSCOP_RESYNC_confirm, msg, pdu.sscop_pl, 0);
+ m_initialize_state(sscop);
+ m_set_data_xfer_timers(sscop);
+ sscop_set_state(sscop, SSCOP_READY);
+}
+
+/*
+ * p 45: OUT_RESYNC && RSAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outsync_rsak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ SSCOP_MSG_FREE(msg);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_SIG(sscop, SSCOP_RESYNC_confirm);
+ m_initialize_state(sscop);
+ m_set_data_xfer_timers(sscop);
+ sscop_set_state(sscop, SSCOP_READY);
+}
+
+/*
+ * p 46: IN_RESYNC_PEND && AA-RESYNC.response
+ */
+static void
+sscop_insync_sync_resp(struct sscop *sscop, struct sscop_msg *noarg __unused)
+{
+ m_initialize_mr(sscop);
+ send_rsak(sscop);
+ m_clear_transmitter(sscop);
+ m_initialize_state(sscop);
+ m_set_data_xfer_timers(sscop);
+ sscop_set_state(sscop, SSCOP_READY);
+}
+
+/*
+ * p 46: IN_RESYNC_PEND && AA-RELEASE.request
+ * arg is uu
+ */
+static void
+sscop_insync_release_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_end, uu);
+
+ sscop->vt_cc = 1;
+ send_end(sscop, 0, sscop->uu_end);
+ TIMER_RESTART(sscop, cc);
+ sscop_set_state(sscop, SSCOP_OUT_DIS_PEND);
+}
+
+/*
+ * p 46: IN_RESYNC_PEND && ENDAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_endak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'F', 0);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 46: IN_RESYNC_PEND && BGREJ PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_bgrej(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'D', 0);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 46: IN_RESYNC_PEND && END PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_end(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ send_endak(sscop);
+ AAL_UU_SIGNAL(sscop, SSCOP_RELEASE_indication,
+ msg, pdu.sscop_pl, (u_int)pdu.sscop_s);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 47: IN_RESYNC_PEND && ER PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_er(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'L', 0);
+}
+
+/*
+ * p 47: IN_RESYNC_PEND && BGN PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_bgn(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ MAAL_ERROR(sscop, 'B', 0);
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 0);
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_indication, msg, pdu.sscop_pl, 0);
+
+ sscop_set_state(sscop, SSCOP_IN_PEND);
+}
+
+/*
+ * p 47: IN_RESYNC_PEND && SD PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_sd(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'A', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 47: IN_RESYNC_PEND && POLL PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_poll(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'G', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 47: IN_RESYNC_PEND && STAT PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_stat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'H', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 47: IN_RESYNC_PEND && USTAT PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_ustat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'I', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 48: IN_RESYNC_PEND && BGAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_bgak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'C', 0);
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 48: IN_RESYNC_PEND && ERAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_erak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'M', 0);
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 48: IN_RESYNC_PEND && RS PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_rs(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'J', 0);
+}
+
+/*
+ * p 48: IN_RESYNC_PEND && RSAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_insync_rsak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'K', 0);
+ SSCOP_MSG_FREE(msg);
+}
+
+
+/*
+ * p 49: OUT_REC_PEND && AA-DATA.request
+ * arg is message (queued).
+ */
+static void
+sscop_outrec_userdata(struct sscop *sscop, struct sscop_msg *msg)
+{
+ if(!sscop->clear_buffers) {
+ MSGQ_APPEND(&sscop->xq, msg);
+ sscop_signal(sscop, SIG_PDU_Q, msg);
+ } else {
+ SSCOP_MSG_FREE(msg);
+ }
+}
+
+/*
+ * p 49: OUT_REC_PEND && BGAK PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_outrec_bgak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'C', 0);
+
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 49: OUT_REC_PEND && ERAK PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_outrec_erak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_ms = pdu.sscop_ns;
+ m_deliver_data(sscop);
+
+ AAL_SIG(sscop, SSCOP_RECOVER_indication);
+
+ sscop_set_state(sscop, SSCOP_REC_PEND);
+
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 49: OUT_REC_PEND && END PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_outrec_end(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+ send_endak(sscop);
+ AAL_UU_SIGNAL(sscop, SSCOP_RELEASE_indication,
+ msg, pdu.sscop_pl, (u_int)pdu.sscop_s);
+
+ MSGQ_CLEAR(&sscop->rbuf);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 49: OUT_REC_PEND && ENDAK PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_outrec_endak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'F', 0);
+ TIMER_STOP(sscop, cc);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ MSGQ_CLEAR(&sscop->rbuf);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 49: OUT_REC_PEND && BGREJ PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_outrec_bgrej(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'D', 0);
+ TIMER_STOP(sscop, cc);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ MSGQ_CLEAR(&sscop->rbuf);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 50: OUT_REC_PEND && TIMER CC expiry
+ * no arg.
+ */
+static void
+sscop_outrec_cc(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ if(sscop->vt_cc >= sscop->maxcc) {
+ MAAL_ERROR(sscop, 'O', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ MSGQ_CLEAR(&sscop->rbuf);
+ sscop_set_state(sscop, SSCOP_IDLE);
+ } else {
+ sscop->vt_cc++;
+ send_er(sscop);
+ TIMER_RESTART(sscop, cc);
+ }
+}
+
+/*
+ * p 50: OUT_REC_PEND && SSCOP_RELEASE_request
+ * arg is UU
+ */
+static void
+sscop_outrec_release_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_end, uu);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_cc = 1;
+ send_end(sscop, 0, sscop->uu_end);
+ MSGQ_CLEAR(&sscop->rbuf);
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_DIS_PEND);
+}
+
+/*
+ * p 51: OUT_REC_PEND && AA-RESYNC.request
+ * arg is uu
+ */
+static void
+sscop_outrec_sync_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_rs, uu);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_cc = 1;
+ sscop->vt_sq++;
+ m_initialize_mr(sscop);
+ send_rs(sscop, 0, sscop->uu_rs);
+ m_clear_transmitter(sscop);
+ MSGQ_CLEAR(&sscop->rbuf);
+ TIMER_RESTART(sscop, cc);
+}
+
+/*
+ * p 51: OUT_REC_PEND && BGN PDU
+ * arg is pdu (freed).
+ * no uui
+ */
+static void
+sscop_outrec_bgn(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ MAAL_ERROR(sscop, 'B', 0);
+ SSCOP_MSG_FREE(msg);
+ } else {
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 0);
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_indication,
+ msg, pdu.sscop_pl, 0);
+ MSGQ_CLEAR(&sscop->rbuf);
+
+ sscop_set_state(sscop, SSCOP_IN_PEND);
+ }
+}
+
+/*
+ * p 51: OUT_REC_PEND && ER PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outrec_er(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ MAAL_ERROR(sscop, 'L', 0);
+ } else {
+ TIMER_STOP(sscop, cc);
+ sscop->vt_ms = pdu.sscop_ns;
+ m_initialize_mr(sscop);
+ send_erak(sscop);
+ m_deliver_data(sscop);
+
+ AAL_SIG(sscop, SSCOP_RECOVER_indication);
+
+ sscop_set_state(sscop, SSCOP_REC_PEND);
+ }
+
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 52: OUT_REC_PEND && SD PDU queued
+ * no arg.
+ */
+static void
+sscop_outrec_pduq(struct sscop *sscop, struct sscop_msg *msg)
+{
+ sscop_save_signal(sscop, SIG_PDU_Q, msg);
+}
+
+/*
+ * p 52: OUT_REC_PEND && RSAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outrec_rsak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'K', 0);
+}
+
+/*
+ * p 52: OUT_REC_PEND && RS PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_outrec_rs(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'J', 0);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ TIMER_STOP(sscop, cc);
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_UU_SIGNAL(sscop, SSCOP_RESYNC_indication, msg, pdu.sscop_pl, 0);
+ MSGQ_CLEAR(&sscop->rbuf);
+ sscop_set_state(sscop, SSCOP_IN_RESYNC_PEND);
+}
+
+/*
+ * p 53: REC_PEND && BGAK PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_rec_bgak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'C', 0);
+
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 53: REC_PEND && END PDU
+ * arg is pdu (freed)
+ * no uui
+ */
+static void
+sscop_rec_end(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ send_endak(sscop);
+ AAL_UU_SIGNAL(sscop, SSCOP_RELEASE_indication,
+ msg, pdu.sscop_pl, (u_int)pdu.sscop_s);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 53: REC_PEND && ENDAK PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_rec_endak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'F', 0);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 53: REC_PEND && BGREJ PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_rec_bgrej(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'D', 0);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 54: REC_PEND && RELEASE
+ * arg is UU
+ */
+static void
+sscop_rec_release_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_end, uu);
+
+ sscop->vt_cc = 1;
+ send_end(sscop, 0, sscop->uu_end);
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_DIS_PEND);
+}
+
+/*
+ * p 54: REC_PEND && RSAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_rec_rsak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'K', 0);
+ SSCOP_MSG_FREE(msg);
+}
+
+
+/*
+ * p 54: REC_PEND && RS PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_rec_rs(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'J', 0);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_UU_SIGNAL(sscop, SSCOP_RESYNC_indication, msg, pdu.sscop_pl, 0);
+
+ sscop_set_state(sscop, SSCOP_IN_RESYNC_PEND);
+}
+
+/*
+ * p 54: REC_PEND && RECOVER response
+ * no arg
+ */
+static void
+sscop_rec_recover(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ if(!sscop->clear_buffers) {
+ MSGQ_CLEAR(&sscop->xbuf);
+ }
+ m_initialize_state(sscop);
+ m_set_data_xfer_timers(sscop);
+
+ sscop_set_state(sscop, SSCOP_READY);
+}
+
+/*
+ * p 54: REC_PEND && RESYNC request
+ * arg is uu
+ */
+static void
+sscop_rec_sync_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_rs, uu);
+
+ m_clear_transmitter(sscop);
+ sscop->vt_cc = 1;
+ sscop->vt_sq++;
+ m_initialize_mr(sscop);
+ send_rs(sscop, 0, sscop->uu_rs);
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_RESYNC_PEND);
+}
+
+/*
+ * p 55: REC_PEND && SD PDU queued
+ * no arg
+ */
+static void
+sscop_rec_pduq(struct sscop *sscop, struct sscop_msg *msg)
+{
+ sscop_save_signal(sscop, SIG_PDU_Q, msg);
+}
+
+/*
+ * p 55: REC_PEND && ER PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_rec_er(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ send_erak(sscop);
+ } else {
+ MAAL_ERROR(sscop, 'L', 0);
+ }
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 55: REC_PEND && BGN PDU
+ * arg is pdu (freed)
+ * no uui
+ */
+static void
+sscop_rec_bgn(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ MAAL_ERROR(sscop, 'B', 0);
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 0);
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_indication, msg, pdu.sscop_pl, 0);
+
+ sscop_set_state(sscop, SSCOP_IN_PEND);
+}
+
+/*
+ * p 55: REC_PEND && STAT PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_rec_stat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'H', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 55: REC_PEND && USTAT PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_rec_ustat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'I', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ sscop_set_state(sscop, SSCOP_IDLE);
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 56: IN_REC_PEND && AA-RECOVER.response
+ * no arg
+ */
+static void
+sscop_inrec_recover(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ if(!sscop->clear_buffers) {
+ MSGQ_CLEAR(&sscop->xbuf);
+ }
+ m_initialize_mr(sscop);
+ send_erak(sscop);
+ m_initialize_state(sscop);
+ m_set_data_xfer_timers(sscop);
+
+ sscop_set_state(sscop, SSCOP_READY);
+}
+
+/*
+ * p 56: IN_REC_PEND && SD PDU queued
+ * no arg
+ */
+static void
+sscop_inrec_pduq(struct sscop *sscop, struct sscop_msg *msg)
+{
+ sscop_save_signal(sscop, SIG_PDU_Q, msg);
+}
+
+/*
+ * p 56: IN_REC_PEND && AA-RELEASE.request
+ * arg is UU
+ */
+static void
+sscop_inrec_release_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_end, uu);
+
+ sscop->vt_cc = 1;
+ send_end(sscop, 0, sscop->uu_end);
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_DIS_PEND);
+}
+
+/*
+ * p 56: IN_REC_PEND && END PDU
+ * arg is pdu (freed).
+ * no uui
+ */
+static void
+sscop_inrec_end(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ send_endak(sscop);
+ AAL_UU_SIGNAL(sscop, SSCOP_RELEASE_indication,
+ msg, pdu.sscop_pl, (u_int)pdu.sscop_s);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 56: IN_REC_PEND && RESYNC_REQ
+ */
+static void
+sscop_inrec_sync_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_rs, uu);
+
+ m_clear_transmitter(sscop);
+ sscop->vt_cc = 1;
+ sscop->vt_sq++;
+ m_initialize_mr(sscop);
+ send_rs(sscop, 0, sscop->uu_rs);
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_RESYNC_PEND);
+}
+
+
+/*
+ * p 57: IN_REC_PEND && ENDAK PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_inrec_endak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'F', 0);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ SSCOP_MSG_FREE(msg);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 57: IN_REC_PEND && BGREJ PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_inrec_bgrej(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'D', 0);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ SSCOP_MSG_FREE(msg);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 57: IN_REC_PEND && USTAT PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_inrec_ustat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'I', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ SSCOP_MSG_FREE(msg);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 57: IN_REC_PEND && STAT PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_inrec_stat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'H', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ SSCOP_MSG_FREE(msg);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 57: IN_REC_PEND && POLL PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_inrec_poll(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'G', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ SSCOP_MSG_FREE(msg);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 57: IN_REC_PEND && SD PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_inrec_sd(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'A', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ SSCOP_MSG_FREE(msg);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 58: IN_REC_PEND && RSAK PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inrec_rsak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'K', 0);
+}
+
+/*
+ * p 58: IN_REC_PEND && RS PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_inrec_rs(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ SSCOP_MSG_FREE(msg);
+ MAAL_ERROR(sscop, 'J', 0);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_UU_SIGNAL(sscop, SSCOP_RESYNC_indication, msg, pdu.sscop_pl, 0);
+
+ sscop_set_state(sscop, SSCOP_IN_RESYNC_PEND);
+}
+
+/*
+ * p 59: IN_REC_PEND && ER PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_inrec_er(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(!m_detect_retransmission(sscop, msg)) {
+ MAAL_ERROR(sscop, 'L', 0);
+ }
+
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 59: IN_REC_PEND && BGN PDU
+ * arg is pdu (freed).
+ * no uui
+ */
+static void
+sscop_inrec_bgn(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ MAAL_ERROR(sscop, 'B', 0);
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 0);
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_indication, msg, pdu.sscop_pl, 0);
+
+ sscop_set_state(sscop, SSCOP_IN_PEND);
+}
+
+/*
+ * p 59: IN_REC_PEND && BGAK PDU
+ * arg is pdu (freed)
+ * no uui
+ */
+static void
+sscop_inrec_bgak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'C', 0);
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 59: IN_REC_PEND && ERAK PDU
+ * arg is pdu (freed)
+ * no uui
+ */
+static void
+sscop_inrec_erak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MAAL_ERROR(sscop, 'M', 0);
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 60: READY && RESYNC request
+ * arg is UU
+ */
+static void
+sscop_ready_sync_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_rs, uu);
+
+ m_reset_data_xfer_timers(sscop);
+ sscop->vt_cc = 1;
+ sscop->vt_sq++;
+ m_initialize_mr(sscop);
+ send_rs(sscop, 0, sscop->uu_rs);
+ m_release_buffers(sscop);
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_RESYNC_PEND);
+}
+
+
+/*
+ * p 60: READY && AA-RELEASE.request
+ * arg is uu.
+ */
+static void
+sscop_ready_release_req(struct sscop *sscop, struct sscop_msg *uu)
+{
+ SET_UU(uu_end, uu);
+
+ m_reset_data_xfer_timers(sscop);
+ sscop->vt_cc = 1;
+ send_end(sscop, 0, sscop->uu_end);
+ m_prepare_retrieval(sscop);
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_DIS_PEND);
+}
+
+/*
+ * p 61: READY && ER PDU
+ * arg is pdu (freed).
+ */
+static void
+sscop_ready_er(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ TIMER_RESTART(sscop, nr);
+ send_erak(sscop);
+ } else {
+ m_reset_data_xfer_timers(sscop);
+ sscop->vt_ms = pdu.sscop_ns;
+ m_prepare_recovery(sscop);
+ m_deliver_data(sscop);
+
+ AAL_SIG(sscop, SSCOP_RECOVER_indication);
+
+ sscop_set_state(sscop, SSCOP_IN_REC_PEND);
+ }
+
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 61: READY && BGN PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_ready_bgn(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ TIMER_RESTART(sscop, nr);
+ send_bgak(sscop, sscop->uu_bgak);
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ m_reset_data_xfer_timers(sscop);
+ sscop->vt_ms = pdu.sscop_ns;
+
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 0);
+ AAL_UU_SIGNAL(sscop, SSCOP_ESTABLISH_indication, msg, pdu.sscop_pl, 0);
+
+ m_prepare_retrieval(sscop);
+
+ sscop_set_state(sscop, SSCOP_IN_PEND);
+}
+
+/*
+ * p 62: READY && ENDAK PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_ready_endak(struct sscop *sscop, struct sscop_msg *msg)
+{
+ m_reset_data_xfer_timers(sscop);
+ MAAL_ERROR(sscop, 'F', 0);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ m_prepare_retrieval(sscop);
+ SSCOP_MSG_FREE(msg);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 62: READY && BGREJ PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_ready_bgrej(struct sscop *sscop, struct sscop_msg *msg)
+{
+ m_reset_data_xfer_timers(sscop);
+ MAAL_ERROR(sscop, 'D', 0);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ m_prepare_retrieval(sscop);
+ SSCOP_MSG_FREE(msg);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 62: READY && RS PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_ready_rs(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ if(m_detect_retransmission(sscop, msg)) {
+ SSCOP_MSG_FREE(msg);
+ TIMER_RESTART(sscop, nr);
+ send_rsak(sscop);
+ return;
+ }
+ (void)MBUF_STRIP32(msg->m);
+
+ m_reset_data_xfer_timers(sscop);
+ sscop->vt_ms = pdu.sscop_ns;
+ AAL_UU_SIGNAL(sscop, SSCOP_RESYNC_indication, msg, pdu.sscop_pl, 0);
+ m_prepare_retrieval(sscop);
+
+ sscop_set_state(sscop, SSCOP_IN_RESYNC_PEND);
+}
+
+/*
+ * p 62: READY && END PDU
+ * arg is pdu (freed)
+ */
+static void
+sscop_ready_end(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ (void)MBUF_STRIP32(msg->m);
+
+ m_reset_data_xfer_timers(sscop);
+ send_endak(sscop);
+ AAL_UU_SIGNAL(sscop, SSCOP_RELEASE_indication,
+ msg, pdu.sscop_pl, (u_int)pdu.sscop_s);
+ m_prepare_retrieval(sscop);
+
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 63: READY && POLL expiry
+ */
+static void
+sscop_ready_tpoll(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ sscop->vt_ps++;
+ send_poll(sscop);
+ sscop->vt_pd = 0;
+ m_set_poll_timer(sscop);
+}
+
+/*
+ * p 63: READY && KEEP_ALIVE expiry
+ */
+static void
+sscop_ready_tka(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ sscop->vt_ps++;
+ send_poll(sscop);
+ sscop->vt_pd = 0;
+ m_set_poll_timer(sscop);
+}
+
+/*
+ * p 63: READY && IDLE expiry
+ */
+static void
+sscop_ready_tidle(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ TIMER_RESTART(sscop, nr);
+ sscop->vt_ps++;
+ send_poll(sscop);
+ sscop->vt_pd = 0;
+ m_set_poll_timer(sscop);
+}
+
+/*
+ * p 63: READY && NO_RESPONSE expiry
+ * no arg
+ */
+static void
+sscop_ready_nr(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ m_reset_data_xfer_timers(sscop);
+ MAAL_ERROR(sscop, 'P', 0);
+ FREE_UU(uu_end);
+ send_end(sscop, 1, NULL);
+ AAL_DATA(sscop, SSCOP_RELEASE_indication, NULL, 1);
+ m_prepare_retrieval(sscop);
+ sscop_set_state(sscop, SSCOP_IDLE);
+}
+
+/*
+ * p 63: READY && AA-DATA.request
+ * arg is message (queued).
+ */
+static void
+sscop_ready_userdata(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MSGQ_APPEND(&sscop->xq, msg);
+
+ sscop_signal(sscop, SIG_PDU_Q, msg);
+}
+
+/*
+ * p 64: READY && SD PDU queued up
+ * arg is unused.
+ */
+static void
+sscop_ready_pduq(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ struct sscop_msg *msg;
+
+ if(sscop->rxq != 0) {
+ TAILQ_FOREACH(msg, &sscop->xbuf, link)
+ if(msg->rexmit)
+ break;
+ ASSERT(msg != NULL);
+ msg->rexmit = 0;
+ sscop->rxq--;
+ send_sd(sscop, msg->m, msg->seqno);
+ msg->poll_seqno = sscop->vt_ps;
+ if(sscop->poll_after_rex && sscop->rxq == 0)
+ goto poll; /* -> A */
+ else
+ goto maybe_poll; /* -> B */
+
+ }
+ if(MSGQ_EMPTY(&sscop->xq))
+ return;
+
+ if(sscop->vt_s >= sscop->vt_ms) {
+ /* Send windows closed */
+ TIMER_STOP(sscop, idle);
+ TIMER_RESTART(sscop, nr);
+ goto poll; /* -> A */
+
+ } else {
+ msg = MSGQ_GET(&sscop->xq);
+ msg->seqno = sscop->vt_s;
+ send_sd(sscop, msg->m, msg->seqno);
+ msg->poll_seqno = sscop->vt_ps;
+ sscop->vt_s++;
+ MSGQ_APPEND(&sscop->xbuf, msg);
+ goto maybe_poll; /* -> B */
+ }
+
+ /*
+ * p 65: Poll handling
+ */
+ maybe_poll: /* label B */
+ sscop->vt_pd++;
+ if(TIMER_ISACT(sscop, poll)) {
+ if(sscop->vt_pd < sscop->maxpd)
+ return;
+ } else {
+ if(TIMER_ISACT(sscop, idle)) {
+ TIMER_STOP(sscop, idle);
+ TIMER_RESTART(sscop, nr);
+ } else {
+ TIMER_STOP(sscop, ka);
+ }
+ if(sscop->vt_pd < sscop->maxpd) {
+ TIMER_RESTART(sscop, poll);
+ return;
+ }
+ }
+ poll: /* label A */
+ sscop->vt_ps++;
+ send_poll(sscop);
+ sscop->vt_pd = 0;
+ TIMER_RESTART(sscop, poll);
+}
+
+/*
+ * p 67: common recovery start
+ */
+static void
+sscop_recover(struct sscop *sscop)
+{
+ sscop->vt_cc = 1;
+ sscop->vt_sq++;
+
+ m_initialize_mr(sscop);
+ send_er(sscop);
+ m_prepare_recovery(sscop);
+
+ TIMER_RESTART(sscop, cc);
+
+ sscop_set_state(sscop, SSCOP_OUT_REC_PEND);
+}
+
+/*
+ * p 66: READY && SD PDU
+ * arg is received message.
+ */
+static void
+sscop_ready_sd(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+ u_int sn;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ msg->seqno = pdu.sscop_ns;
+
+ /* Fix padding */
+ MBUF_UNPAD(msg->m, pdu.sscop_pl);
+
+ if(msg->seqno >= sscop->vr_mr) {
+ /* message outside window */
+ if(sscop->vr_h < sscop->vr_mr) {
+ send_ustat(sscop, sscop->vr_h, sscop->vr_mr, -1);
+ sscop->vr_h = sscop->vr_mr;
+ }
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+
+ if(msg->seqno == sscop->vr_r) {
+ if(msg->seqno == sscop->vr_h) {
+ sscop->vr_r = msg->seqno + 1;
+ sscop->vr_h = msg->seqno + 1;
+
+ AAL_DATA(sscop, SSCOP_DATA_indication,
+ msg->m, msg->seqno);
+ msg->m = NULL;
+ SSCOP_MSG_FREE(msg);
+
+ return;
+ }
+ for(;;) {
+ AAL_DATA(sscop, SSCOP_DATA_indication,
+ msg->m, msg->seqno);
+ msg->m = NULL;
+ SSCOP_MSG_FREE(msg);
+
+ sscop->vr_r++;
+ if((msg = MSGQ_PEEK(&sscop->rbuf)) == NULL)
+ break;
+ sn = msg->seqno;
+ ASSERT(sn >= sscop->vr_r);
+ if(sn != sscop->vr_r)
+ break;
+ msg = MSGQ_GET(&sscop->rbuf);
+ }
+ return;
+ }
+
+ /* Messages were lost */
+
+ /* XXX Flow control */
+ if(msg->seqno == sscop->vr_h) {
+ QINSERT(&sscop->rbuf, msg);
+ sscop->vr_h++;
+ return;
+ }
+ if(sscop->vr_h < msg->seqno) {
+ QINSERT(&sscop->rbuf, msg);
+ send_ustat(sscop, sscop->vr_h, msg->seqno, -1);
+ sscop->vr_h = msg->seqno + 1;
+ return;
+ }
+
+ if(QFIND(&sscop->rbuf, msg->seqno) == NULL) {
+ QINSERT(&sscop->rbuf, msg);
+ return;
+ }
+
+ /* error: start recovery */
+ SSCOP_MSG_FREE(msg);
+ m_reset_data_xfer_timers(sscop);
+ MAAL_ERROR(sscop, 'Q', 0);
+ sscop_recover(sscop);
+}
+
+/*
+ * p 67: READY && POLL PDU
+ */
+static void
+sscop_ready_poll(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+ union seqno seqno;
+ u_int sn, nps;
+ struct SSCOP_MBUF_T *m;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ seqno.sscop_null = MBUF_STRIP32(msg->m);
+
+ if((u_int)pdu.sscop_ns < sscop->vr_h) {
+ SSCOP_MSG_FREE(msg);
+ m_reset_data_xfer_timers(sscop);
+ MAAL_ERROR(sscop, 'Q', 0);
+ sscop_recover(sscop);
+ return;
+ }
+ nps = seqno.sscop_n;
+
+ if((u_int)pdu.sscop_ns > sscop->vr_mr)
+ sscop->vr_h = sscop->vr_mr;
+ else
+ sscop->vr_h = pdu.sscop_ns;
+
+ SSCOP_MSG_FREE(msg);
+
+ /* build stat pdu */
+ if((m = MBUF_ALLOC(sscop->maxstat * 4 + 12)) == NULL) {
+ FAILURE("sscop: cannot allocate STAT");
+ return;
+ }
+ sn = sscop->vr_r;
+
+ while(sn != sscop->vr_h) {
+ /* loop through burst we already have */
+ for(;;) {
+ if(sn >= sscop->vr_h) {
+ seqno.sscop_null = 0;
+ seqno.sscop_n = sn;
+ MBUF_APPEND32(m, seqno.sscop_null);
+ goto out;
+ }
+ if(QFIND(&sscop->rbuf, sn) == NULL)
+ break;
+ sn++;
+ }
+
+ /* start of a hole */
+ seqno.sscop_null = 0;
+ seqno.sscop_n = sn;
+ MBUF_APPEND32(m, seqno.sscop_null);
+ if(MBUF_LEN(m)/4 >= sscop->maxstat) {
+ send_stat(sscop, nps, m);
+ if((m = MBUF_ALLOC(sscop->maxstat * 4 + 12)) == NULL) {
+ FAILURE("sscop: cannot allocate STAT");
+ return;
+ }
+ seqno.sscop_null = 0;
+ seqno.sscop_n = sn;
+ MBUF_APPEND32(m, seqno.sscop_null);
+ }
+ do {
+ sn++;
+ } while(sn < sscop->vr_h && !QFIND(&sscop->rbuf, sn));
+ seqno.sscop_null = 0;
+ seqno.sscop_n = sn;
+ MBUF_APPEND32(m, seqno.sscop_null);
+ }
+ out:
+ send_stat(sscop, nps, m);
+}
+
+/*
+ * p 69: READY && USTAT PDU
+ * arg is msg (freed)
+ */
+static void
+sscop_ready_ustat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+ union seqno nmr, sq1, sq2;
+ u_int cnt;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ nmr.sscop_null = MBUF_STRIP32(msg->m);
+ sq2.sscop_null = MBUF_STRIP32(msg->m);
+ sq1.sscop_null = MBUF_STRIP32(msg->m);
+
+ SSCOP_MSG_FREE(msg);
+
+ cnt = sq1.sscop_n - sq2.sscop_n;
+
+ if((u_int)pdu.sscop_ns < sscop->vt_a || (u_int)pdu.sscop_ns >= sscop->vt_s) {
+ VERBERR(sscop, SSCOP_DBG_ERR, (sscop, sscop->aarg,
+ "USTAT: N(R) outside VT(A)...VT(S)-1: N(R)=%u VT(A)=%u "
+ "VT(S)=%u", (u_int)pdu.sscop_ns, sscop->vt_a, sscop->vt_s));
+ goto err_f;
+ }
+
+ /* Acknowledge all messages between VT(A) and N(R)-1. N(R) is the new
+ * next in sequence-SD-number of the receiver and means, it has all
+ * messages below N(R). Remove all message below N(R) from the
+ * transmission buffer. It may already be removed because of an
+ * earlier selective ACK in a STAT message.
+ */
+ while((msg = MSGQ_PEEK(&sscop->xbuf)) != NULL && msg->seqno < (u_int)pdu.sscop_ns) {
+ ASSERT(msg->seqno >= sscop->vt_a);
+ MSGQ_REMOVE(&sscop->xbuf, msg);
+ SSCOP_MSG_FREE(msg);
+ }
+
+ /* Update the in-sequence acknowledge and the send window */
+ sscop->vt_a = pdu.sscop_ns;
+ sscop->vt_ms = nmr.sscop_n;
+
+ /* check, that the range of requested re-transmissions is between
+ * the in-sequence-ack and the highest up-to-now transmitted SD
+ */
+ if(sq1.sscop_n >= sq2.sscop_n
+ || (u_int)sq1.sscop_n < sscop->vt_a
+ || (u_int)sq2.sscop_n >= sscop->vt_s) {
+ VERBERR(sscop, SSCOP_DBG_ERR, (sscop, sscop->aarg,
+ "USTAT: seq1 or seq2 outside VT(A)...VT(S)-1 or seq1>=seq2:"
+ " seq1=%u seq2=%u VT(A)=%u VT(S)=%u",
+ sq1.sscop_n, sq2.sscop_n, sscop->vt_a, sscop->vt_s));
+ goto err_f;
+ }
+
+ /*
+ * Retransmit all messages from seq1 to seq2-1
+ */
+ do {
+ /*
+ * The message may not be in the transmit buffer if it was
+ * already acked by a STAT. This means, the receiver is
+ * confused.
+ */
+ if((msg = QFIND(&sscop->xbuf, sq1.sscop_n)) == NULL) {
+ VERBERR(sscop, SSCOP_DBG_ERR, (sscop, sscop->aarg,
+ "USTAT: message %u not found in xmit buffer",
+ sq1.sscop_n));
+ goto err_f;
+ }
+
+ /*
+ * If it is not yet in the re-transmission queue, put it there
+ */
+ if(!msg->rexmit) {
+ msg->rexmit = 1;
+ sscop->rxq++;
+ sscop_signal(sscop, SIG_PDU_Q, msg);
+ }
+ sq1.sscop_n++;
+ } while(sq1.sscop_n != sq2.sscop_n);
+
+ /*
+ * report the re-transmission to the management
+ */
+ MAAL_ERROR(sscop, 'V', cnt);
+ return;
+
+ err_f:
+ m_reset_data_xfer_timers(sscop);
+ MAAL_ERROR(sscop, 'T', 0);
+ sscop_recover(sscop);
+}
+
+/*
+ * p 70: READY && STAT PDU
+ * arg is msg (freed).
+ */
+static void
+sscop_ready_stat(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+ union seqno nps, nmr;
+ u_int len, seq1, seq2, cnt;
+ struct sscop_msg *m;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+ nmr.sscop_null = MBUF_STRIP32(msg->m);
+ nps.sscop_null = MBUF_STRIP32(msg->m);
+
+ len = MBUF_LEN(msg->m) / 4;
+
+ if((u_int)nps.sscop_n < sscop->vt_pa
+ || (u_int)nps.sscop_n > sscop->vt_ps) {
+ SSCOP_MSG_FREE(msg);
+ m_reset_data_xfer_timers(sscop);
+ MAAL_ERROR(sscop, 'R', 0);
+ sscop_recover(sscop);
+ return;
+ }
+
+ if((u_int)pdu.sscop_ns < sscop->vt_a
+ || (u_int)pdu.sscop_ns > sscop->vt_s) {
+ /*
+ * The in-sequence acknowledge, i.e. the receivers's next
+ * expected in-sequence msg is outside the window between
+ * the transmitters in-sequence ack and highest seqno -
+ * the receiver seems to be confused.
+ */
+ VERBERR(sscop, SSCOP_DBG_ERR, (sscop, sscop->aarg,
+ "STAT: N(R) outside VT(A)...VT(S)-1: N(R)=%u VT(A)=%u "
+ "VT(S)=%u", (u_int)pdu.sscop_ns, sscop->vt_a, sscop->vt_s));
+ err_H:
+ SSCOP_MSG_FREE(msg);
+ m_reset_data_xfer_timers(sscop);
+ MAAL_ERROR(sscop, 'S', 0);
+ sscop_recover(sscop);
+ return;
+ }
+
+ /* Acknowledge all messages between VT(A) and N(R)-1. N(R) is the new
+ * next in sequence-SD-number of the receiver and means, it has all
+ * messages below N(R). Remove all message below N(R) from the
+ * transmission buffer. It may already be removed because of an
+ * earlier selective ACK in a STAT message.
+ */
+ while((m = MSGQ_PEEK(&sscop->xbuf)) != NULL
+ && m->seqno < (u_int)pdu.sscop_ns) {
+ ASSERT(m->seqno >= sscop->vt_a);
+ MSGQ_REMOVE(&sscop->xbuf, m);
+ SSCOP_MSG_FREE(m);
+ }
+
+ /*
+ * Update in-sequence ack, poll-ack and send window.
+ */
+ sscop->vt_a = pdu.sscop_ns;
+ sscop->vt_pa = nps.sscop_n;
+ sscop->vt_ms = nmr.sscop_n;
+
+ cnt = 0;
+ if(len > 1) {
+ seq1 = MBUF_GET32(msg->m);
+ len--;
+ if(seq1 >= sscop->vt_s) {
+ VERBERR(sscop, SSCOP_DBG_ERR, (sscop, sscop->aarg,
+ "STAT: seq1 >= VT(S): seq1=%u VT(S)=%u",
+ seq1, sscop->vt_s));
+ goto err_H;
+ }
+
+ for(;;) {
+ seq2 = MBUF_GET32(msg->m);
+ len--;
+ if(seq1 >= seq2 || seq2 > sscop->vt_s) {
+ VERBERR(sscop, SSCOP_DBG_ERR, (sscop,
+ sscop->aarg, "STAT: seq1 >= seq2 or "
+ "seq2 > VT(S): seq1=%u seq2=%u VT(S)=%u",
+ seq1, seq2, sscop->vt_s));
+ goto err_H;
+ }
+
+ do {
+ /*
+ * The receiver requests the re-transmission
+ * of some message, but has acknowledged it
+ * already in an earlier STAT (it isn't in the
+ * transmitt buffer anymore).
+ */
+ if((m = QFIND(&sscop->xbuf, seq1)) == NULL) {
+ VERBERR(sscop, SSCOP_DBG_ERR,
+ (sscop, sscop->aarg, "STAT: message"
+ " %u not found in xmit buffer",
+ seq1));
+ goto err_H;
+ }
+ if(m->poll_seqno < (u_int)nps.sscop_n
+ && (u_int)nps.sscop_n <= sscop->vt_ps)
+ if(!m->rexmit) {
+ m->rexmit = 1;
+ sscop->rxq++;
+ cnt++;
+ sscop_signal(sscop, SIG_PDU_Q, msg);
+ }
+ } while(++seq1 < seq2);
+
+ if(len == 0)
+ break;
+
+ seq2 = MBUF_GET32(msg->m);
+ len--;
+
+ if(seq1 >= seq2 || seq2 > sscop->vt_s) {
+ VERBERR(sscop, SSCOP_DBG_ERR, (sscop,
+ sscop->aarg, "STAT: seq1 >= seq2 or "
+ "seq2 > VT(S): seq1=%u seq2=%u VT(S)=%u",
+ seq1, seq2, sscop->vt_s));
+ goto err_H;
+ }
+
+ /* OK now the sucessful transmitted messages. Note, that
+ * some messages may already be out of the buffer because
+ * of earlier STATS */
+ do {
+ if(sscop->clear_buffers) {
+ if((m = QFIND(&sscop->xbuf, seq1)) != NULL) {
+ MSGQ_REMOVE(&sscop->xbuf, m);
+ SSCOP_MSG_FREE(m);
+ }
+ }
+ } while(++seq1 != seq2);
+
+ if(len == 0)
+ break;
+ }
+ MAAL_ERROR(sscop, 'V', cnt);
+ }
+ SSCOP_MSG_FREE(msg);
+
+ /* label L: */
+ if(sscop->vt_s >= sscop->vt_ms) {
+ /*
+ * The receiver has closed the window: report to management
+ */
+ if(sscop->credit) {
+ sscop->credit = 0;
+ MAAL_ERROR(sscop, 'W', 0);
+ }
+ } else if(!sscop->credit) {
+ /*
+ * The window was forcefully closed above, but
+ * now re-opened. Report to management.
+ */
+ sscop->credit = 1;
+ MAAL_ERROR(sscop, 'X', 0);
+ }
+
+ if(TIMER_ISACT(sscop, poll)) {
+ TIMER_RESTART(sscop, nr);
+ } else if(!TIMER_ISACT(sscop, idle)) {
+ TIMER_STOP(sscop, ka);
+ TIMER_STOP(sscop, nr);
+ TIMER_RESTART(sscop, idle);
+ }
+}
+
+/*
+ * P. 73: any state & UDATA_REQUEST
+ * arg is pdu (queued)
+ */
+static void
+sscop_udata_req(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MSGQ_APPEND(&sscop->uxq, msg);
+ sscop_signal(sscop, SIG_UPDU_Q, msg);
+}
+
+/*
+ * P. 73: any state & MDATA_REQUEST
+ * arg is pdu (queued)
+ */
+static void
+sscop_mdata_req(struct sscop *sscop, struct sscop_msg *msg)
+{
+ MSGQ_APPEND(&sscop->mxq, msg);
+ sscop_signal(sscop, SIG_MPDU_Q, msg);
+}
+
+/*
+ * P. 74: any state & UDATA queued
+ * no arg.
+ */
+static void
+sscop_upduq(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ struct sscop_msg *msg;
+
+ if(sscop->ll_busy)
+ return;
+ while((msg = MSGQ_GET(&sscop->uxq)) != NULL) {
+ send_ud(sscop, msg->m);
+ msg->m = NULL;
+ SSCOP_MSG_FREE(msg);
+ }
+}
+
+/*
+ * P. 74: any state & MDATA queued
+ * no arg.
+ */
+static void
+sscop_mpduq(struct sscop *sscop, struct sscop_msg *unused __unused)
+{
+ struct sscop_msg *msg;
+
+ if(sscop->ll_busy)
+ return;
+ while((msg = MSGQ_GET(&sscop->mxq)) != NULL) {
+ send_md(sscop, msg->m);
+ msg->m = NULL;
+ SSCOP_MSG_FREE(msg);
+ }
+}
+
+/*
+ * p 73: MD PDU
+ * arg is PDU
+ */
+static void
+sscop_md(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ MBUF_UNPAD(msg->m, pdu.sscop_pl);
+
+ MAAL_DATA(sscop, msg->m);
+ msg->m = NULL;
+ SSCOP_MSG_FREE(msg);
+}
+
+/*
+ * p 73: UD PDU
+ * arg is PDU
+ */
+static void
+sscop_ud(struct sscop *sscop, struct sscop_msg *msg)
+{
+ union pdu pdu;
+
+ pdu.sscop_null = MBUF_STRIP32(msg->m);
+
+ MBUF_UNPAD(msg->m, pdu.sscop_pl);
+
+ AAL_DATA(sscop, SSCOP_UDATA_indication, msg->m, 0);
+ msg->m = NULL;
+ SSCOP_MSG_FREE(msg);
+}
+
+
+/*
+ * p 33: IDLE & RETRIEVE
+ * p 39: IN_PEND & RETRIEVE
+ * p 42: OUT_DIS_PEND & RETRIEVE
+ * p 48: IN_RESYNC_PEND & RETRIEVE
+ * p 53: REC_PEND & RETRIEVE
+ * p 58: IN_REC_PEND & RETRIEVE
+ */
+static void
+sscop_retrieve(struct sscop *sscop, struct sscop_msg *msg)
+{
+ m_data_retrieval(sscop, msg->rexmit);
+ SSCOP_MSG_FREE(msg);
+}
+
+/************************************************************/
+/*
+ * GENERAL EVENT HANDLING
+ */
+
+/*
+ * State/event matrix.
+ *
+ * Entries marked with Z are not specified in Q.2110, but are added for
+ * the sake of stability.
+ */
+static struct {
+ void (*func)(struct sscop *, struct sscop_msg *);
+ int (*cond)(struct sscop *);
+} state_matrix[SSCOP_NSTATES][SIG_NUM] = {
+ /* SSCOP_IDLE */ {
+ /* SIG_BGN */ { sscop_idle_bgn, NULL },
+ /* SIG_BGAK */ { sscop_idle_bgak, NULL },
+ /* SIG_END */ { sscop_idle_end, NULL },
+ /* SIG_ENDAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_RS */ { sscop_idle_rs, NULL },
+ /* SIG_RSAK */ { sscop_idle_rsak, NULL },
+ /* SIG_BGREJ */ { sscop_idle_bgrej, NULL },
+ /* SIG_SD */ { sscop_idle_sd, NULL },
+ /* SIG_ER */ { sscop_idle_er, NULL },
+ /* SIG_POLL */ { sscop_idle_poll, NULL },
+ /* SIG_STAT */ { sscop_idle_stat, NULL },
+ /* SIG_USTAT */ { sscop_idle_ustat, NULL },
+ /* SIG_UD */ { sscop_ud, NULL },
+ /* SIG_MD */ { sscop_md, NULL },
+ /* SIG_ERAK */ { sscop_idle_erak, NULL },
+ /* SIG_T_CC */ { NULL, NULL },
+ /* SIG_T_POLL */ { NULL, NULL },
+ /* SIG_T_KA */ { NULL, NULL },
+ /* SIG_T_NR */ { NULL, NULL },
+ /* SIG_T_IDLE */ { NULL, NULL },
+ /* SIG_PDU_Q */ { sscop_flush_pduq, NULL },
+ /* SIG_USER_DATA */ { NULL, NULL },
+ /* SIG_ESTAB_REQ */ { sscop_idle_establish_req, NULL },
+ /* SIG_ESTAB_RESP */ { NULL, NULL },
+ /* SIG_RELEASE_REQ */ { NULL, NULL },
+ /* SIG_RECOVER */ { NULL, NULL },
+ /* SIG_SYNC_REQ */ { NULL, NULL },
+ /* SIG_SYNC_RESP */ { NULL, NULL },
+ /* SIG_UDATA */ { sscop_udata_req, NULL },
+ /* SIG_MDATA */ { sscop_mdata_req, NULL },
+ /* SIG_UPDU_Q */ { sscop_upduq, NULL },
+ /* SIG_MPDU_Q */ { sscop_mpduq, NULL },
+ /* SIG_RETRIEVE */ { sscop_retrieve, NULL },
+ },
+ /* SSCOP_OUT_PEND */ {
+ /* SIG_BGN */ { sscop_outpend_bgn, NULL },
+ /* SIG_BGAK */ { sscop_outpend_bgak, NULL },
+ /* SIG_END */ { sscop_ignore_pdu, NULL },
+ /* SIG_ENDAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_RS */ { sscop_ignore_pdu, NULL },
+ /* SIG_RSAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_BGREJ */ { sscop_outpend_bgrej, NULL },
+ /* SIG_SD */ { sscop_ignore_pdu, NULL },
+ /* SIG_ER */ { sscop_ignore_pdu, NULL },
+ /* SIG_POLL */ { sscop_ignore_pdu, NULL },
+ /* SIG_STAT */ { sscop_ignore_pdu, NULL },
+ /* SIG_USTAT */ { sscop_ignore_pdu, NULL },
+ /* SIG_UD */ { sscop_ud, NULL },
+ /* SIG_MD */ { sscop_md, NULL },
+ /* SIG_ERAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_T_CC */ { sscop_outpend_tcc, NULL },
+ /* SIG_T_POLL */ { NULL, NULL },
+ /* SIG_T_KA */ { NULL, NULL },
+ /* SIG_T_NR */ { NULL, NULL },
+ /* SIG_T_IDLE */ { NULL, NULL },
+ /* SIG_PDU_Q */ { sscop_flush_pduq, NULL },
+ /* SIG_USER_DATA */ { NULL, NULL },
+ /* SIG_ESTAB_REQ */ { NULL, NULL },
+ /* SIG_ESTAB_RESP */ { NULL, NULL },
+ /* SIG_RELEASE_REQ */ { sscop_outpend_release_req, NULL },
+ /* SIG_RECOVER */ { NULL, NULL },
+ /* SIG_SYNC_REQ */ { NULL, NULL },
+ /* SIG_SYNC_RESP */ { NULL, NULL },
+ /* SIG_UDATA */ { sscop_udata_req, NULL },
+ /* SIG_MDATA */ { sscop_mdata_req, NULL },
+ /* SIG_UPDU_Q */ { sscop_upduq, NULL },
+ /* SIG_MPDU_Q */ { sscop_mpduq, NULL },
+ /* SIG_RETRIEVE */ { NULL, NULL },
+ },
+ /* SSCOP_IN_PEND */ {
+ /* SIG_BGN */ { sscop_inpend_bgn, NULL },
+ /* SIG_BGAK */ { sscop_inpend_bgak, NULL },
+ /* SIG_END */ { sscop_inpend_end, NULL },
+ /* SIG_ENDAK */ { sscop_inpend_endak, NULL },
+ /* SIG_RS */ { sscop_inpend_rs, NULL },
+ /* SIG_RSAK */ { sscop_inpend_rsak, NULL },
+ /* SIG_BGREJ */ { sscop_inpend_bgrej, NULL },
+ /* SIG_SD */ { sscop_inpend_sd, NULL },
+ /* SIG_ER */ { sscop_inpend_er, NULL },
+ /* SIG_POLL */ { sscop_inpend_poll, NULL },
+ /* SIG_STAT */ { sscop_inpend_stat, NULL },
+ /* SIG_USTAT */ { sscop_inpend_ustat, NULL },
+ /* SIG_UD */ { sscop_ud, NULL },
+ /* SIG_MD */ { sscop_md, NULL },
+ /* SIG_ERAK */ { sscop_inpend_erak, NULL },
+ /* SIG_T_CC */ { NULL, NULL },
+ /* SIG_T_POLL */ { NULL, NULL },
+ /* SIG_T_KA */ { NULL, NULL },
+ /* SIG_T_NR */ { NULL, NULL },
+ /* SIG_T_IDLE */ { NULL, NULL },
+ /* SIG_PDU_Q */ { sscop_flush_pduq, NULL },
+ /* SIG_USER_DATA */ { NULL, NULL },
+ /* SIG_ESTAB_REQ */ { NULL, NULL },
+ /* SIG_ESTAB_RESP */ { sscop_inpend_establish_resp, NULL },
+ /* SIG_RELEASE_REQ */ { sscop_inpend_release_req, NULL },
+ /* SIG_RECOVER */ { NULL, NULL },
+ /* SIG_SYNC_REQ */ { NULL, NULL },
+ /* SIG_SYNC_RESP */ { NULL, NULL },
+ /* SIG_UDATA */ { sscop_udata_req, NULL },
+ /* SIG_MDATA */ { sscop_mdata_req, NULL },
+ /* SIG_UPDU_Q */ { sscop_upduq, NULL },
+ /* SIG_MPDU_Q */ { sscop_mpduq, NULL },
+ /* SIG_RETRIEVE */ { sscop_retrieve, NULL },
+ },
+ /* SSCOP_OUT_DIS_PEND */ {
+ /* SIG_BGN */ { sscop_outdis_bgn, NULL },
+ /* SIG_BGAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_END */ { sscop_outdis_end, NULL },
+ /* SIG_ENDAK */ { sscop_outdis_endak, NULL },
+ /* SIG_RS */ { sscop_ignore_pdu, NULL },
+ /* SIG_RSAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_BGREJ */ { sscop_outdis_endak, NULL },
+ /* SIG_SD */ { sscop_ignore_pdu, NULL },
+ /* SIG_ER */ { sscop_ignore_pdu, NULL },
+ /* SIG_POLL */ { sscop_ignore_pdu, NULL },
+ /* SIG_STAT */ { sscop_ignore_pdu, NULL },
+ /* SIG_USTAT */ { sscop_ignore_pdu, NULL },
+ /* SIG_UD */ { sscop_ud, NULL },
+ /* SIG_MD */ { sscop_md, NULL },
+ /* SIG_ERAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_T_CC */ { sscop_outdis_cc, NULL },
+ /* SIG_T_POLL */ { NULL, NULL },
+ /* SIG_T_KA */ { NULL, NULL },
+ /* SIG_T_NR */ { NULL, NULL },
+ /* SIG_T_IDLE */ { NULL, NULL },
+ /* SIG_PDU_Q */ { sscop_flush_pduq, NULL },
+ /* SIG_USER_DATA */ { NULL, NULL },
+ /* SIG_ESTAB_REQ */ { sscop_outdis_establish_req, NULL },
+ /* SIG_ESTAB_RESP */ { NULL, NULL },
+ /* SIG_RELEASE_REQ */ { NULL, NULL },
+ /* SIG_RECOVER */ { NULL, NULL },
+ /* SIG_SYNC_REQ */ { NULL, NULL },
+ /* SIG_SYNC_RESP */ { NULL, NULL },
+ /* SIG_UDATA */ { sscop_udata_req, NULL },
+ /* SIG_MDATA */ { sscop_mdata_req, NULL },
+ /* SIG_UPDU_Q */ { sscop_upduq, NULL },
+ /* SIG_MPDU_Q */ { sscop_mpduq, NULL },
+ /* SIG_RETRIEVE */ { sscop_retrieve, NULL },
+ },
+ /* SSCOP_OUT_RESYNC_PEND */ {
+ /* SIG_BGN */ { sscop_outsync_bgn, NULL },
+ /* SIG_BGAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_END */ { sscop_outsync_end, NULL },
+ /* SIG_ENDAK */ { sscop_outsync_endak, NULL },
+ /* SIG_RS */ { sscop_outsync_rs, NULL },
+ /* SIG_RSAK */ { sscop_outsync_rsak, NULL },
+ /* SIG_BGREJ */ { sscop_outsync_bgrej, NULL },
+ /* SIG_SD */ { sscop_ignore_pdu, NULL },
+ /* SIG_ER */ { sscop_ignore_pdu, NULL },
+ /* SIG_POLL */ { sscop_ignore_pdu, NULL },
+ /* SIG_STAT */ { sscop_ignore_pdu, NULL },
+ /* SIG_USTAT */ { sscop_ignore_pdu, NULL },
+ /* SIG_UD */ { sscop_ud, NULL },
+ /* SIG_MD */ { sscop_md, NULL },
+ /* SIG_ERAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_T_CC */ { sscop_outsync_cc, NULL },
+ /* SIG_T_POLL */ { NULL, NULL },
+ /* SIG_T_KA */ { NULL, NULL },
+ /* SIG_T_NR */ { NULL, NULL },
+ /* SIG_T_IDLE */ { NULL, NULL },
+ /* SIG_PDU_Q */ { sscop_flush_pduq, NULL },
+ /* SIG_USER_DATA */ { NULL, NULL },
+ /* SIG_ESTAB_REQ */ { NULL, NULL },
+ /* SIG_ESTAB_RESP */ { NULL, NULL },
+ /* SIG_RELEASE_REQ */ { sscop_outsync_release_req, NULL },
+ /* SIG_RECOVER */ { NULL, NULL },
+ /* SIG_SYNC_REQ */ { NULL, NULL },
+ /* SIG_SYNC_RESP */ { NULL, NULL },
+ /* SIG_UDATA */ { sscop_udata_req, NULL },
+ /* SIG_MDATA */ { sscop_mdata_req, NULL },
+ /* SIG_UPDU_Q */ { sscop_upduq, NULL },
+ /* SIG_MPDU_Q */ { sscop_mpduq, NULL },
+ /* SIG_RETRIEVE */ { NULL, NULL },
+ },
+ /* SSCOP_IN_RESYNC_PEND */ {
+ /* SIG_BGN */ { sscop_insync_bgn, NULL },
+ /* SIG_BGAK */ { sscop_insync_bgak, NULL },
+ /* SIG_END */ { sscop_insync_end, NULL },
+ /* SIG_ENDAK */ { sscop_insync_endak, NULL },
+ /* SIG_RS */ { sscop_insync_rs, NULL },
+ /* SIG_RSAK */ { sscop_insync_rsak, NULL },
+ /* SIG_BGREJ */ { sscop_insync_bgrej, NULL },
+ /* SIG_SD */ { sscop_insync_sd, NULL },
+ /* SIG_ER */ { sscop_insync_er, NULL },
+ /* SIG_POLL */ { sscop_insync_poll, NULL },
+ /* SIG_STAT */ { sscop_insync_stat, NULL },
+ /* SIG_USTAT */ { sscop_insync_ustat, NULL },
+ /* SIG_UD */ { sscop_ud, NULL },
+ /* SIG_MD */ { sscop_md, NULL },
+ /* SIG_ERAK */ { sscop_insync_erak, NULL },
+ /* SIG_T_CC */ { NULL, NULL },
+ /* SIG_T_POLL */ { NULL, NULL },
+ /* SIG_T_KA */ { NULL, NULL },
+ /* SIG_T_NR */ { NULL, NULL },
+ /* SIG_T_IDLE */ { NULL, NULL },
+ /* SIG_PDU_Q */ { sscop_flush_pduq, NULL },
+ /* SIG_USER_DATA */ { NULL, NULL },
+ /* SIG_ESTAB_REQ */ { NULL, NULL },
+ /* SIG_ESTAB_RESP */ { NULL, NULL },
+ /* SIG_RELEASE_REQ */ { sscop_insync_release_req, NULL },
+ /* SIG_RECOVER */ { NULL, NULL },
+ /* SIG_SYNC_REQ */ { NULL, NULL },
+ /* SIG_SYNC_RESP */ { sscop_insync_sync_resp, NULL },
+ /* SIG_UDATA */ { sscop_udata_req, NULL },
+ /* SIG_MDATA */ { sscop_mdata_req, NULL },
+ /* SIG_UPDU_Q */ { sscop_upduq, NULL },
+ /* SIG_MPDU_Q */ { sscop_mpduq, NULL },
+ /* SIG_RETRIEVE */ { sscop_retrieve, NULL },
+ },
+ /* SSCOP_OUT_REC_PEND */ {
+ /* SIG_BGN */ { sscop_outrec_bgn, NULL },
+ /* SIG_BGAK */ { sscop_outrec_bgak, NULL },
+ /* SIG_END */ { sscop_outrec_end, NULL },
+ /* SIG_ENDAK */ { sscop_outrec_endak, NULL },
+ /* SIG_RS */ { sscop_outrec_rs, NULL },
+ /* SIG_RSAK */ { sscop_outrec_rsak, NULL },
+ /* SIG_BGREJ */ { sscop_outrec_bgrej, NULL },
+ /* SIG_SD */ { sscop_ignore_pdu, NULL },
+ /* SIG_ER */ { sscop_outrec_er, NULL },
+ /* SIG_POLL */ { sscop_ignore_pdu, NULL },
+ /* SIG_STAT */ { sscop_ignore_pdu, NULL },
+ /* SIG_USTAT */ { sscop_ignore_pdu, NULL },
+ /* SIG_UD */ { sscop_ud, NULL },
+ /* SIG_MD */ { sscop_md, NULL },
+ /* SIG_ERAK */ { sscop_outrec_erak, NULL },
+ /* SIG_T_CC */ { sscop_outrec_cc, NULL },
+ /* SIG_T_POLL */ { NULL, NULL },
+ /* SIG_T_KA */ { NULL, NULL },
+ /* SIG_T_NR */ { NULL, NULL },
+ /* SIG_T_IDLE */ { NULL, NULL },
+ /* SIG_PDU_Q */ { sscop_outrec_pduq, NULL },
+ /* SIG_USER_DATA */ { sscop_outrec_userdata, NULL },
+ /* SIG_ESTAB_REQ */ { NULL, NULL },
+ /* SIG_ESTAB_RESP */ { NULL, NULL },
+ /* SIG_RELEASE_REQ */ { sscop_outrec_release_req, NULL },
+ /* SIG_RECOVER */ { NULL, NULL },
+ /* SIG_SYNC_REQ */ { sscop_outrec_sync_req, NULL },
+ /* SIG_SYNC_RESP */ { NULL, NULL },
+ /* SIG_UDATA */ { sscop_udata_req, NULL },
+ /* SIG_MDATA */ { sscop_mdata_req, NULL },
+ /* SIG_UPDU_Q */ { sscop_upduq, NULL },
+ /* SIG_MPDU_Q */ { sscop_mpduq, NULL },
+ /* SIG_RETRIEVE */ { NULL, NULL },
+ },
+ /* SSCOP_REC_PEND */ {
+ /* SIG_BGN */ { sscop_rec_bgn, NULL },
+ /* SIG_BGAK */ { sscop_rec_bgak, NULL },
+ /* SIG_END */ { sscop_rec_end, NULL },
+ /* SIG_ENDAK */ { sscop_rec_endak, NULL },
+ /* SIG_RS */ { sscop_rec_rs, NULL },
+ /* SIG_RSAK */ { sscop_rec_rsak, NULL },
+ /* SIG_BGREJ */ { sscop_rec_bgrej, NULL },
+ /* SIG_SD */ { sscop_ignore_pdu, NULL },
+ /* SIG_ER */ { sscop_rec_er, NULL },
+ /* SIG_POLL */ { sscop_ignore_pdu, NULL },
+ /* SIG_STAT */ { sscop_rec_stat, NULL },
+ /* SIG_USTAT */ { sscop_rec_ustat, NULL },
+ /* SIG_UD */ { sscop_ud, NULL },
+ /* SIG_MD */ { sscop_md, NULL },
+ /* SIG_ERAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_T_CC */ { NULL, NULL },
+ /* SIG_T_POLL */ { NULL, NULL },
+ /* SIG_T_KA */ { NULL, NULL },
+ /* SIG_T_NR */ { NULL, NULL },
+ /* SIG_T_IDLE */ { NULL, NULL },
+ /* SIG_PDU_Q */ { sscop_rec_pduq, NULL },
+ /* SIG_USER_DATA */ { NULL, NULL },
+ /* SIG_ESTAB_REQ */ { NULL, NULL },
+ /* SIG_ESTAB_RESP */ { NULL, NULL },
+ /* SIG_RELEASE_REQ */ { sscop_rec_release_req, NULL },
+ /* SIG_RECOVER */ { sscop_rec_recover, NULL },
+ /* SIG_SYNC_REQ */ { sscop_rec_sync_req, NULL },
+ /* SIG_SYNC_RESP */ { NULL, NULL },
+ /* SIG_UDATA */ { sscop_udata_req, NULL },
+ /* SIG_MDATA */ { sscop_mdata_req, NULL },
+ /* SIG_UPDU_Q */ { sscop_upduq, NULL },
+ /* SIG_MPDU_Q */ { sscop_mpduq, NULL },
+ /* SIG_RETRIEVE */ { sscop_retrieve, NULL },
+ },
+ /* SSCOP_IN_REC_PEND */ {
+ /* SIG_BGN */ { sscop_inrec_bgn, NULL },
+ /* SIG_BGAK */ { sscop_inrec_bgak, NULL },
+ /* SIG_END */ { sscop_inrec_end, NULL },
+ /* SIG_ENDAK */ { sscop_inrec_endak, NULL },
+ /* SIG_RS */ { sscop_inrec_rs, NULL },
+ /* SIG_RSAK */ { sscop_inrec_rsak, NULL },
+ /* SIG_BGREJ */ { sscop_inrec_bgrej, NULL },
+ /* SIG_SD */ { sscop_inrec_sd, NULL },
+ /* SIG_ER */ { sscop_inrec_er, NULL },
+ /* SIG_POLL */ { sscop_inrec_poll, NULL },
+ /* SIG_STAT */ { sscop_inrec_stat, NULL },
+ /* SIG_USTAT */ { sscop_inrec_ustat, NULL },
+ /* SIG_UD */ { sscop_ud, NULL },
+ /* SIG_MD */ { sscop_md, NULL },
+ /* SIG_ERAK */ { sscop_inrec_erak, NULL },
+ /* SIG_T_CC */ { NULL, NULL },
+ /* SIG_T_POLL */ { NULL, NULL },
+ /* SIG_T_KA */ { NULL, NULL },
+ /* SIG_T_NR */ { NULL, NULL },
+ /* SIG_T_IDLE */ { NULL, NULL },
+ /* SIG_PDU_Q */ { sscop_inrec_pduq, NULL },
+ /* SIG_USER_DATA */ { NULL, NULL },
+ /* SIG_ESTAB_REQ */ { NULL, NULL },
+ /* SIG_ESTAB_RESP */ { NULL, NULL },
+ /* SIG_RELEASE_REQ */ { sscop_inrec_release_req, NULL },
+ /* SIG_RECOVER */ { sscop_inrec_recover, NULL },
+ /* SIG_SYNC_REQ */ { sscop_inrec_sync_req, NULL },
+ /* SIG_SYNC_RESP */ { NULL, NULL },
+ /* SIG_UDATA */ { sscop_udata_req, NULL },
+ /* SIG_MDATA */ { sscop_mdata_req, NULL },
+ /* SIG_UPDU_Q */ { sscop_upduq, NULL },
+ /* SIG_MPDU_Q */ { sscop_mpduq, NULL },
+ /* SIG_RETRIEVE */ { sscop_retrieve, NULL },
+ },
+ /* SSCOP_READY */ {
+ /* SIG_BGN */ { sscop_ready_bgn, NULL },
+ /* SIG_BGAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_END */ { sscop_ready_end, NULL },
+ /* SIG_ENDAK */ { sscop_ready_endak, NULL },
+ /* SIG_RS */ { sscop_ready_rs, NULL },
+ /* SIG_RSAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_BGREJ */ { sscop_ready_bgrej, NULL },
+ /* SIG_SD */ { sscop_ready_sd, NULL },
+ /* SIG_ER */ { sscop_ready_er, NULL },
+ /* SIG_POLL */ { sscop_ready_poll, NULL },
+ /* SIG_STAT */ { sscop_ready_stat, NULL },
+ /* SIG_USTAT */ { sscop_ready_ustat, NULL },
+ /* SIG_UD */ { sscop_ud, NULL },
+ /* SIG_MD */ { sscop_md, NULL },
+ /* SIG_ERAK */ { sscop_ignore_pdu, NULL },
+ /* SIG_T_CC */ { NULL, NULL },
+ /* SIG_T_POLL */ { sscop_ready_tpoll, NULL },
+ /* SIG_T_KA */ { sscop_ready_tka, NULL },
+ /* SIG_T_NR */ { sscop_ready_nr, NULL },
+ /* SIG_T_IDLE */ { sscop_ready_tidle, NULL },
+ /* SIG_PDU_Q */ { sscop_ready_pduq, c_ready_pduq },
+ /* SIG_USER_DATA */ { sscop_ready_userdata, NULL },
+ /* SIG_ESTAB_REQ */ { NULL, NULL },
+ /* SIG_ESTAB_RESP */ { NULL, NULL },
+ /* SIG_RELEASE_REQ */ { sscop_ready_release_req, NULL },
+ /* SIG_RECOVER */ { NULL, NULL },
+ /* SIG_SYNC_REQ */ { sscop_ready_sync_req, NULL },
+ /* SIG_SYNC_RESP */ { NULL, NULL },
+ /* SIG_UDATA */ { sscop_udata_req, NULL },
+ /* SIG_MDATA */ { sscop_mdata_req, NULL },
+ /* SIG_UPDU_Q */ { sscop_upduq, NULL },
+ /* SIG_MPDU_Q */ { sscop_mpduq, NULL },
+ /* SIG_RETRIEVE */ { NULL, NULL },
+ }
+};
+
+/*
+ * Try to execute a signal. It is executed if
+ * - it is illegal (in this case it is effectively ignored)
+ * - it has no condition
+ * - its condition is true
+ * If it has a condition and that is false, the function does nothing and
+ * returns 0.
+ * If the signal gets executed, the signal function is responsible to release
+ * the message (if any).
+ */
+static int
+sig_exec(struct sscop *sscop, u_int sig, struct sscop_msg *msg)
+{
+ void (*func)(struct sscop *, struct sscop_msg *);
+ int (*cond)(struct sscop *);
+
+ func = state_matrix[sscop->state][sig].func;
+ cond = state_matrix[sscop->state][sig].cond;
+
+ if(func == NULL) {
+ VERBOSE(sscop, SSCOP_DBG_BUG, (sscop, sscop->aarg,
+ "no handler for %s in state %s - ignored",
+ events[sig], states[sscop->state]));
+ SSCOP_MSG_FREE(msg);
+ return 1;
+ }
+ if(cond == NULL || (*cond)(sscop)) {
+ VERBOSE(sscop, SSCOP_DBG_EXEC, (sscop, sscop->aarg,
+ "executing %s in %s", events[sig],
+ states[sscop->state]));
+ (*func)(sscop, msg);
+ return 1;
+ }
+ VERBOSE(sscop, SSCOP_DBG_EXEC, (sscop, sscop->aarg,
+ "delaying %s in %s", events[sig],
+ states[sscop->state]));
+
+ return 0;
+}
+
+/*
+ * Deliver a signal to the given sscop
+ * If it is delivered from inside a signal handler - queue it. If not,
+ * execute it. After execution loop through the queue and execute all
+ * pending signals. Signals, that cannot be executed because of entry
+ * conditions are skipped.
+ */
+static void
+sscop_signal(struct sscop *sscop, u_int sig, struct sscop_msg *msg)
+{
+ struct sscop_sig *s;
+
+ VERBOSE(sscop, SSCOP_DBG_INSIG, (sscop, sscop->aarg,
+ "got signal %s in state %s%s", events[sig],
+ states[sscop->state], sscop->in_sig ? " -- queuing" : ""));
+
+ SIG_ALLOC(s);
+ if(s == NULL) {
+ FAILURE("sscop: cannot allocate signal");
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ s->sig = sig;
+ s->msg = msg;
+ SIGQ_APPEND(&sscop->sigs, s);
+
+ if(!sscop->in_sig)
+ handle_sigs(sscop);
+}
+
+/*
+ * Loop through the signal queue until we can't execute any signals.
+ */
+static void
+handle_sigs(struct sscop *sscop)
+{
+ struct sscop_sig *s;
+ sscop_sigq_head_t dsigs, q;
+ int exec;
+
+ sscop->in_sig++;
+
+ /*
+ * Copy the current signal queue to the local one and empty
+ * the signal queue. Then loop through the signals. After one
+ * pass we have a list of delayed signals because of entry
+ * conditions and a new list of signals. Merge them. Repeat until
+ * the signal queue is either empty or contains only delayed signals.
+ */
+ SIGQ_INIT(&q);
+ SIGQ_INIT(&dsigs);
+ do {
+ exec = 0;
+
+ /*
+ * Copy signal list and make sscop list empty
+ */
+ SIGQ_MOVE(&sscop->sigs, &q);
+
+ /*
+ * Loop through the list
+ */
+ while((s = SIGQ_GET(&q)) != NULL) {
+ if(sig_exec(sscop, s->sig, s->msg)) {
+ exec = 1;
+ SIG_FREE(s);
+ } else {
+ SIGQ_APPEND(&dsigs, s);
+ }
+ }
+
+ /*
+ * Merge lists by inserting delayed signals in front of
+ * the signal list. preserving the order.
+ */
+ SIGQ_PREPEND(&dsigs, &sscop->sigs);
+ } while(exec);
+ sscop->in_sig--;
+}
+
+/*
+ * Save a signal that should be executed only if state changes.
+ */
+static void
+sscop_save_signal(struct sscop *sscop, u_int sig, struct sscop_msg *msg)
+{
+ struct sscop_sig *s;
+
+ SIG_ALLOC(s);
+ if(s == NULL) {
+ FAILURE("sscop: cannot allocate signal");
+ SSCOP_MSG_FREE(msg);
+ return;
+ }
+ s->sig = sig;
+ s->msg = msg;
+ SIGQ_APPEND(&sscop->saved_sigs, s);
+}
+
+/*
+ * Set a new state. If signals are waiting for a state change - append them to
+ * the signal queue, so they get executed.
+ */
+static void
+sscop_set_state(struct sscop *sscop, u_int nstate)
+{
+ VERBOSE(sscop, SSCOP_DBG_STATE, (sscop, sscop->aarg,
+ "changing state from %s to %s",
+ states[sscop->state], states[nstate]));
+
+ sscop->state = nstate;
+ SIGQ_MOVE(&sscop->saved_sigs, &sscop->sigs);
+}
+
+void
+sscop_setdebug(struct sscop *sscop, u_int n)
+{
+ sscop->debug = n;
+}
+
+u_int
+sscop_getdebug(const struct sscop *sscop)
+{
+ return (sscop->debug);
+}
diff --git a/sys/contrib/ngatm/netnatm/saal/sscfu.h b/sys/contrib/ngatm/netnatm/saal/sscfu.h
new file mode 100644
index 0000000..3aaa9270d
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/saal/sscfu.h
@@ -0,0 +1,103 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/saal/sscfu.h,v 1.4 2004/07/08 08:22:15 brandt Exp $
+ *
+ * Public include file for UNI SSCF
+ */
+#ifndef _NETNATM_SAAL_SSCFU_H_
+#define _NETNATM_SAAL_SSCFU_H_
+
+#include <sys/types.h>
+#include <netnatm/saal/sscopdef.h>
+#include <netnatm/saal/sscfudef.h>
+
+/*
+ * Define how a buffer looks like.
+ */
+#ifdef _KERNEL
+#ifdef __FreeBSD__
+#define SSCFU_MBUF_T mbuf
+#endif
+#else
+#define SSCFU_MBUF_T uni_msg
+#endif
+
+struct SSCFU_MBUF_T;
+struct sscfu;
+
+/* functions to be supplied by the SSCOP user */
+struct sscfu_funcs {
+ /* upper (SAAL) interface output */
+ void (*send_upper)(struct sscfu *, void *, enum saal_sig,
+ struct SSCFU_MBUF_T *);
+
+ /* lower (SSCOP) interface output */
+ void (*send_lower)(struct sscfu *, void *, enum sscop_aasig,
+ struct SSCFU_MBUF_T *, u_int);
+
+ /* function to move the SSCOP window */
+ void (*window)(struct sscfu *, void *, u_int);
+
+ /* debugging function */
+ void (*verbose)(struct sscfu *, void *, const char *, ...)
+ __printflike(3, 4);
+};
+
+/* Function defined by the SSCF-UNI code */
+
+/* allocate and initialize a new SSCF instance */
+struct sscfu *sscfu_create(void *, const struct sscfu_funcs *);
+
+/* destroy an SSCF instance and free all resources */
+void sscfu_destroy(struct sscfu *);
+
+/* reset the SSCF to the released state */
+void sscfu_reset(struct sscfu *);
+
+/* lower input interface (SSCOP signals) */
+void sscfu_input(struct sscfu *, enum sscop_aasig, struct SSCFU_MBUF_T *, u_int);
+
+/* upper input interface (SAAL) */
+int sscfu_saalsig(struct sscfu *, enum saal_sig, struct SSCFU_MBUF_T *);
+
+/* retrieve the current state */
+enum sscfu_state sscfu_getstate(const struct sscfu *);
+
+/* char'ify signals and states */
+const char *sscfu_signame(enum saal_sig);
+const char *sscfu_statename(enum sscfu_state);
+
+/* retrieve the default set of parameters for SSCOP */
+u_int sscfu_getdefparam(struct sscop_param *);
+
+/* get/set debugging flags */
+void sscfu_setdebug(struct sscfu *, u_int);
+u_int sscfu_getdebug(const struct sscfu *);
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/saal/sscfudef.h b/sys/contrib/ngatm/netnatm/saal/sscfudef.h
new file mode 100644
index 0000000..08882f2
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/saal/sscfudef.h
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/saal/sscfudef.h,v 1.4 2004/07/08 08:22:16 brandt Exp $
+ *
+ * Definitions of UNI SSCF constants.
+ */
+#ifndef _NETNATM_SAAL_SSCFUDEF_H_
+#define _NETNATM_SAAL_SSCFUDEF_H_
+
+/*
+ * Signals at the upper boundary of the SSCF.
+ */
+enum saal_sig {
+ SAAL_ESTABLISH_request, /* U -> SAAL: (UU) */
+ SAAL_ESTABLISH_indication, /* SAAL -> U: (UU) */
+ SAAL_ESTABLISH_confirm, /* SAAL -> U: (UU) */
+ SAAL_RELEASE_request, /* U -> SAAL: (UU) */
+ SAAL_RELEASE_confirm, /* SAAL -> U: */
+ SAAL_RELEASE_indication, /* SAAL -> U: (UU) */
+ SAAL_DATA_request, /* U -> SAAL: (DATA) */
+ SAAL_DATA_indication, /* SAAL -> U: (DATA) */
+ SAAL_UDATA_request, /* U -> SAAL: (UDATA) */
+ SAAL_UDATA_indication, /* SAAL -> U: (UDATA) */
+};
+
+/*
+ * States of the SSCF
+ */
+enum sscfu_state {
+ SSCFU_RELEASED, /* 1/1 */
+ SSCFU_AWAITING_ESTABLISH, /* 2/2 */
+ SSCFU_AWAITING_RELEASE, /* 4/10 */
+ SSCFU_ESTABLISHED, /* 3/4 */
+ SSCFU_RESYNC, /* 2/5 */
+};
+
+/*
+ * Debugging flags
+ */
+enum {
+ SSCFU_DBG_LSIG = 0x01,
+ SSCFU_DBG_ERR = 0x02,
+ SSCFU_DBG_STATE = 0x04,
+ SSCFU_DBG_EXEC = 0x08,
+};
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/saal/sscfupriv.h b/sys/contrib/ngatm/netnatm/saal/sscfupriv.h
new file mode 100644
index 0000000..b4a1299
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/saal/sscfupriv.h
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/saal/sscfupriv.h,v 1.3 2003/09/19 12:02:03 hbb Exp $
+ *
+ * Private SSCF-UNI definitions.
+ */
+#ifdef _KERNEL
+#ifdef __FreeBSD__
+#include <netgraph/atm/sscfu/ng_sscfu_cust.h>
+#endif
+#else
+#include "sscfucust.h"
+#endif
+
+/*
+ * Structure for signal queueing.
+ */
+struct sscfu_sig {
+ sscfu_sigq_link_t link; /* link to next signal */
+ enum saal_sig sig; /* the signal */
+ struct SSCFU_MBUF_T *m; /* associated message */
+};
+
+struct sscfu {
+ enum sscfu_state state; /* SSCF state */
+ const struct sscfu_funcs *funcs; /* func vector */
+ void *aarg; /* user arg */
+ int inhand; /* need to queue signals */
+ sscfu_sigq_head_t sigs; /* signal queue */
+ u_int debug; /* debugging flags */
+};
+
+/*
+ * Debugging
+ */
+#ifdef SSCFU_DEBUG
+#define VERBOSE(S,M,F) if ((S)->debug & (M)) (S)->funcs->verbose F
+#else
+#define VERBOSE(S,M,F)
+#endif
diff --git a/sys/contrib/ngatm/netnatm/saal/sscop.h b/sys/contrib/ngatm/netnatm/saal/sscop.h
new file mode 100644
index 0000000..8574a15
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/saal/sscop.h
@@ -0,0 +1,126 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/saal/sscop.h,v 1.4 2004/07/08 08:22:16 brandt Exp $
+ *
+ * External interface to sscop.
+ */
+#ifndef _NETNATM_SAAL_SSCOP_H_
+#define _NETNATM_SAAL_SSCOP_H_
+
+#include <netnatm/saal/sscopdef.h>
+
+/*
+ * Define how a buffer looks like.
+ */
+#ifdef _KERNEL
+#ifdef __FreeBSD__
+#define SSCOP_MBUF_T mbuf
+#endif
+#else
+#define SSCOP_MBUF_T uni_msg
+#endif
+
+struct SSCOP_MBUF_T;
+struct sscop;
+
+/*
+ * Vector for user functions
+ */
+struct sscop_funcs {
+ /* management signal from SSCOP */
+ void (*send_manage)(struct sscop *, void *, enum sscop_maasig,
+ struct SSCOP_MBUF_T *, u_int, u_int);
+
+ /* AAL signal from SSCOP */
+ void (*send_upper)(struct sscop *, void *, enum sscop_aasig,
+ struct SSCOP_MBUF_T *, u_int);
+
+ /* send a PDU to the wire */
+ void (*send_lower)(struct sscop *, void *,
+ struct SSCOP_MBUF_T *);
+
+ /* print a message */
+ void (*verbose)(struct sscop *, void *, const char *, ...)
+ __printflike(3,4);
+
+#ifndef _KERNEL
+ /* start a timer */
+ void *(*start_timer)(struct sscop *, void *, u_int,
+ void (*)(void *));
+
+ /* stop a timer */
+ void (*stop_timer)(struct sscop *, void *, void *);
+#endif
+};
+
+/* Function defined by the SSCOP code */
+
+/* create a new SSCOP instance and initialize to default values */
+struct sscop *sscop_create(void *, const struct sscop_funcs *);
+
+/* destroy an SSCOP instance */
+void sscop_destroy(struct sscop *);
+
+/* get the current parameters of an SSCOP */
+void sscop_getparam(const struct sscop *, struct sscop_param *);
+
+/* set new parameters in an SSCOP */
+int sscop_setparam(struct sscop *, struct sscop_param *, u_int *);
+
+/* deliver an signal to the SSCOP */
+int sscop_aasig(struct sscop *, enum sscop_aasig, struct SSCOP_MBUF_T *, u_int);
+
+/* deliver an management signal to the SSCOP */
+int sscop_maasig(struct sscop *, enum sscop_maasig, struct SSCOP_MBUF_T *);
+
+/* SSCOP input function */
+void sscop_input(struct sscop *, struct SSCOP_MBUF_T *);
+
+/* Move the window by a given number of messages. Return the new window */
+u_int sscop_window(struct sscop *, u_int);
+
+/* declare the lower layer busy or not busy */
+u_int sscop_setbusy(struct sscop *, int);
+
+/* retrieve the state */
+enum sscop_state sscop_getstate(const struct sscop *);
+
+/* map signals to strings */
+const char *sscop_msigname(enum sscop_maasig);
+const char *sscop_signame(enum sscop_aasig);
+const char *sscop_statename(enum sscop_state);
+
+/* set/get debugging state */
+void sscop_setdebug(struct sscop *, u_int);
+u_int sscop_getdebug(const struct sscop *);
+
+/* reset the instance */
+void sscop_reset(struct sscop *);
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/saal/sscopdef.h b/sys/contrib/ngatm/netnatm/saal/sscopdef.h
new file mode 100644
index 0000000..ec67164
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/saal/sscopdef.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/saal/sscopdef.h,v 1.4 2004/07/08 08:22:17 brandt Exp $
+ *
+ * Definitions of SSCOP constants and parameter blocks. This is seen by
+ * the outside world.
+ */
+#ifndef _NETNATM_SAAL_SSCOPDEF_H_
+#define _NETNATM_SAAL_SSCOPDEF_H_
+
+#include <sys/types.h>
+#ifdef _KERNEL
+#include <sys/stdint.h>
+#else
+#include <stdint.h>
+#endif
+
+/*
+ * AA-interface signals
+ */
+enum sscop_aasig {
+ SSCOP_ESTABLISH_request, /* <- UU, BR */
+ SSCOP_ESTABLISH_indication, /* -> UU */
+ SSCOP_ESTABLISH_response, /* <- UU, BR */
+ SSCOP_ESTABLISH_confirm, /* -> UU */
+
+ SSCOP_RELEASE_request, /* <- UU */
+ SSCOP_RELEASE_indication, /* -> UU, SRC */
+ SSCOP_RELEASE_confirm, /* -> */
+
+ SSCOP_DATA_request, /* <- MU */
+ SSCOP_DATA_indication, /* -> MU, SN */
+
+ SSCOP_UDATA_request, /* <- MU */
+ SSCOP_UDATA_indication, /* -> MU */
+
+ SSCOP_RECOVER_indication, /* -> */
+ SSCOP_RECOVER_response, /* <- */
+
+ SSCOP_RESYNC_request, /* <- UU */
+ SSCOP_RESYNC_indication, /* -> UU */
+ SSCOP_RESYNC_response, /* <- */
+ SSCOP_RESYNC_confirm, /* -> */
+
+ SSCOP_RETRIEVE_request, /* <- RN */
+ SSCOP_RETRIEVE_indication, /* -> MU */
+ SSCOP_RETRIEVE_COMPL_indication,/* -> */
+};
+
+enum sscop_maasig {
+ SSCOP_MDATA_request, /* <- MU */
+ SSCOP_MDATA_indication, /* -> MU */
+ SSCOP_MERROR_indication, /* -> CODE, CNT */
+};
+
+/*
+ * Values for retrieval. Numbers in SSCOP are 24bit, so
+ * we can use the large values
+ */
+enum {
+ SSCOP_MAXSEQNO = 0xffffff,
+
+ SSCOP_RETRIEVE_UNKNOWN = SSCOP_MAXSEQNO + 1,
+ SSCOP_RETRIEVE_TOTAL = SSCOP_MAXSEQNO + 2,
+};
+
+/*
+ * SSCOP states
+ */
+enum sscop_state {
+ SSCOP_IDLE, /* initial state */
+ SSCOP_OUT_PEND, /* outgoing connection pending */
+ SSCOP_IN_PEND, /* incoming connection pending */
+ SSCOP_OUT_DIS_PEND, /* outgoing disconnect pending */
+ SSCOP_OUT_RESYNC_PEND, /* outgoing resynchronisation pending */
+ SSCOP_IN_RESYNC_PEND, /* incoming resynchronisation pending */
+ SSCOP_OUT_REC_PEND, /* outgoing recovery pending */
+ SSCOP_REC_PEND, /* recovery response pending */
+ SSCOP_IN_REC_PEND, /* incoming recovery pending */
+ SSCOP_READY, /* data transfer ready */
+};
+#define SSCOP_NSTATES 10
+
+struct sscop_param {
+ uint32_t timer_cc; /* timer_cc in msec */
+ uint32_t timer_poll; /* timer_poll im msec */
+ uint32_t timer_keep_alive;/* timer_keep_alive in msec */
+ uint32_t timer_no_response;/*timer_no_response in msec */
+ uint32_t timer_idle; /* timer_idle in msec */
+ uint32_t maxk; /* maximum user data in bytes */
+ uint32_t maxj; /* maximum u-u info in bytes */
+ uint32_t maxcc; /* max. retransmissions for control packets */
+ uint32_t maxpd; /* max. vt(pd) before sending poll */
+ uint32_t maxstat; /* max. number of elements in stat list */
+ uint32_t mr; /* initial window */
+ uint32_t flags; /* flags */
+};
+enum {
+ SSCOP_ROBUST = 0x0001, /* atmf/97-0216 robustness */
+ SSCOP_POLLREX = 0x0002, /* send POLL after retransmit */
+};
+
+enum {
+ SSCOP_SET_TCC = 0x0001,
+ SSCOP_SET_TPOLL = 0x0002,
+ SSCOP_SET_TKA = 0x0004,
+ SSCOP_SET_TNR = 0x0008,
+ SSCOP_SET_TIDLE = 0x0010,
+ SSCOP_SET_MAXK = 0x0020,
+ SSCOP_SET_MAXJ = 0x0040,
+ SSCOP_SET_MAXCC = 0x0080,
+ SSCOP_SET_MAXPD = 0x0100,
+ SSCOP_SET_MAXSTAT = 0x0200,
+ SSCOP_SET_MR = 0x0400,
+ SSCOP_SET_ROBUST = 0x0800,
+ SSCOP_SET_POLLREX = 0x1000,
+
+ SSCOP_SET_ALLMASK = 0x1fff,
+};
+
+enum {
+ SSCOP_DBG_USIG = 0x0001,
+ SSCOP_DBG_TIMER = 0x0002,
+ SSCOP_DBG_BUG = 0x0004,
+ SSCOP_DBG_INSIG = 0x0008,
+ SSCOP_DBG_STATE = 0x0010,
+ SSCOP_DBG_PDU = 0x0020,
+ SSCOP_DBG_ERR = 0x0040,
+ SSCOP_DBG_EXEC = 0x0080,
+ SSCOP_DBG_FLOW = 0x0100,
+};
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/saal/sscoppriv.h b/sys/contrib/ngatm/netnatm/saal/sscoppriv.h
new file mode 100644
index 0000000..e2b0555
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/saal/sscoppriv.h
@@ -0,0 +1,318 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/saal/sscoppriv.h,v 1.4 2004/07/08 08:22:17 brandt Exp $
+ *
+ * Private SSCOP definitions.
+ *
+ */
+#ifdef _KERNEL
+#ifdef __FreeBSD__
+#include <netgraph/atm/sscop/ng_sscop_cust.h>
+#endif
+#else /* !_KERNEL */
+#include "sscopcust.h"
+#endif
+
+/* Argh. BSDi */
+#ifndef _BYTE_ORDER
+#ifndef BYTE_ORDER
+#error "_BYTE_ORDER not defined"
+#endif
+#define _BYTE_ORDER BYTE_ORDER
+#define _LITTLE_ENDIAN LITTLE_ENDIAN
+#define _BIG_ENDIAN BIG_ENDIAN
+#endif
+
+/*
+ * PDU trailer
+ */
+union pdu {
+ u_int sscop_null;
+ struct {
+#if _BYTE_ORDER == _BIG_ENDIAN
+ u_int pl : 2; /* pad length */
+ u_int : 1; /* reserved field */
+ u_int s : 1; /* source */
+ u_int type : 4; /* PDU type */
+ u_int ns : 24; /* sequence number */
+#else
+ u_int ns : 24; /* sequence number */
+ u_int type : 4; /* PDU type */
+ u_int s : 1; /* source */
+ u_int : 1; /* reserved field */
+ u_int pl : 2; /* pad length */
+#endif
+ } ss;
+};
+#define sscop_pl ss.pl
+#define sscop_s ss.s
+#define sscop_type ss.type
+#define sscop_ns ss.ns
+
+/*
+ * seqno list entry format
+ */
+union seqno {
+ u_int sscop_null;
+ struct {
+#if _BYTE_ORDER == _BIG_ENDIAN
+ u_int : 8; /* pad */
+ u_int n : 24; /* seqno */
+#else
+ u_int n : 24; /* seqno */
+ u_int : 8; /* pad */
+#endif
+ } ss;
+};
+#define sscop_n ss.n
+
+/*
+ * Begin pdu
+ */
+union bgn {
+ u_int sscop_null;
+ struct {
+#if _BYTE_ORDER == _BIG_ENDIAN
+ u_int : 24; /* reserved */
+ u_int bgns : 8; /* VT_MR */
+#else
+ u_int bgns : 8; /* VT_MR */
+ u_int : 24; /* reserved */
+#endif
+ } ss;
+};
+#define sscop_bgns ss.bgns
+
+/*
+ * pdu types
+ */
+enum pdu_type {
+ PDU_BGN = 0x1, /* request initialization */
+ PDU_BGAK = 0x2, /* request acknowledgement */
+ PDU_END = 0x3, /* disconnect command */
+ PDU_ENDAK = 0x4, /* disconnect acknowledgement */
+ PDU_RS = 0x5, /* resynchronisation command */
+ PDU_RSAK = 0x6, /* resynchronisation acknowledgement */
+ PDU_BGREJ = 0x7, /* connection reject */
+ PDU_SD = 0x8, /* sequenced connection-mode data */
+ PDU_ER = 0x9, /* recovery command */
+ PDU_POLL = 0xa, /* xmit state info with req. for recv state */
+ PDU_STAT = 0xb, /* solicited receiver state info */
+ PDU_USTAT = 0xc, /* unsolicited receiver state info */
+ PDU_UD = 0xd, /* unumbered user data */
+ PDU_MD = 0xe, /* unumbered management data */
+ PDU_ERAK = 0xf, /* recovery acknowledgement */
+};
+
+
+/*
+ * These are all signals, that are used by SSCOP. Don't change the order or
+ * number without also changing the associated tables.
+ */
+enum sscop_sigtype {
+ /* received PDU's */
+ SIG_BGN, /* request initialization */
+ SIG_BGAK, /* request acknowledgement */
+ SIG_END, /* disconnect command */
+ SIG_ENDAK, /* disconnect acknowledgement */
+ SIG_RS, /* resynchronisation command */
+ SIG_RSAK, /* resynchronisation acknowledgement */
+ SIG_BGREJ, /* connection reject */
+ SIG_SD, /* sequenced connection-mode data */
+ SIG_ER, /* recovery command */
+ SIG_POLL, /* xmitter state info with req for recv state */
+ SIG_STAT, /* solicited receiver state info */
+ SIG_USTAT, /* unsolicited receiver state info */
+ SIG_UD, /* unumbered user data */
+ SIG_MD, /* unumbered management data */
+ SIG_ERAK, /* recovery acknoledgement */
+
+ /* timer expiry */
+ SIG_T_CC, /* CC timer */
+ SIG_T_POLL, /* POLL timer */
+ SIG_T_KA, /* KEEP ALIVE timer */
+ SIG_T_NR, /* NO RESPONSE timer */
+ SIG_T_IDLE, /* IDLE timer */
+
+ /* user originated signals */
+ SIG_PDU_Q, /* PDU enqueued pseudosignal */
+ SIG_USER_DATA, /* user data request */
+ SIG_ESTAB_REQ, /* establish connection request */
+ SIG_ESTAB_RESP, /* establish connection response */
+ SIG_RELEASE_REQ, /* release connection request */
+ SIG_RECOVER, /* automatic recover response */
+ SIG_SYNC_REQ, /* resynchronisation request */
+ SIG_SYNC_RESP, /* resynchronisation response */
+ SIG_UDATA, /* UDATA request */
+ SIG_MDATA, /* MDATA request */
+ SIG_UPDU_Q, /* UDATA PDU enqueued pseudosignal */
+ SIG_MPDU_Q, /* MDATA PDU enqueued pseudosignal */
+ SIG_RETRIEVE, /* RETRIEVE */
+
+ /* number of signals */
+ SIG_NUM
+};
+
+/*
+ * This is a message as contained in a sscop message queue. It holds a pointer
+ * to the real message.
+ */
+struct sscop_msg {
+ sscop_msgq_link_t link;
+ u_int seqno; /* seq no */
+ u_int poll_seqno; /* poll seqno (for messages in xmit buffer) */
+ u_int rexmit; /* in retransmission queue? */
+ struct SSCOP_MBUF_T *m; /* the message */
+};
+
+/*
+ * This structure is used to hold signals in the signal queue
+ */
+struct sscop_sig {
+ sscop_sigq_link_t link; /* next signal */
+ enum sscop_sigtype sig; /* THE signal */
+ struct sscop_msg *msg; /* signal argument (message) */
+};
+
+/*
+ * This structure holds the entire sscop state
+ */
+struct sscop {
+ enum sscop_state state; /* current state */
+ const struct sscop_funcs *funcs;
+
+ /* send state */
+ u_int vt_s; /* seqno for next pdu first time transmitted */
+ u_int vt_ps; /* current poll seqno */
+ u_int vt_a; /* next expected in-sequence sd pdu */
+ u_int vt_pa; /* poll seqno of next stat pdu */
+ u_int vt_ms; /* maximum allowed send sd seqno */
+ u_int vt_pd; /* poll data state */
+ u_int vt_cc; /* connection control state */
+ u_int vt_sq; /* transmitter connection sequence */
+
+ /* receive state */
+ u_int vr_r; /* receive state */
+ u_int vr_h; /* highes expected state */
+ u_int vr_mr; /* maximum acceptable */
+ u_int vr_sq; /* receiver connection state */
+
+ /* timers */
+ sscop_timer_t t_cc; /* timer_CC */
+ sscop_timer_t t_nr; /* timer_NO_RESPONSE */
+ sscop_timer_t t_ka; /* timer KEEP_ALIVE */
+ sscop_timer_t t_poll; /* timer_POLL */
+ sscop_timer_t t_idle; /* idle timer */
+
+ /* maximum values */
+ u_int maxj; /* maximum uu-info */
+ u_int maxk; /* maximum info */
+ u_int maxcc; /* maximum number of bgn, end, er and rs */
+ u_int maxpd; /* maximum value of vt_pd */
+ u_int maxstat; /* maximum length of list */
+ u_int timercc; /* connection control timer */
+ u_int timerka; /* keep alive timer */
+ u_int timernr; /* no response timer */
+ u_int timerpoll; /* polling */
+ u_int timeridle; /* idle timer */
+ u_int robustness; /* atmf/97-0216 robustness enhancement */
+ u_int poll_after_rex; /* optional POLL after re-transmission */
+ u_int mr; /* initial window */
+
+ /*
+ * buffers and queues.
+ * All expect the xq hold SD PDUs.
+ */
+ sscop_msgq_head_t xq; /* xmit queue (input from user before xmit) */
+ sscop_msgq_head_t uxq; /* UD xmit queue */
+ sscop_msgq_head_t mxq; /* MD xmit queue */
+ sscop_msgq_head_t xbuf; /* transmission buffer (SD PDUs transmitted) */
+ int rxq; /* number of PDUs in retransmission queue */
+ sscop_msgq_head_t rbuf; /* receive buffer (SD PDUs) */
+ int last_end_src; /* source field from last xmitted end pdu */
+ int clear_buffers; /* flag */
+ int credit; /* send window not closed */
+ u_int ll_busy; /* lower layer busy */
+ u_int rs_mr; /* N(MR) in last RS PDU */
+ u_int rs_sq; /* N(SQ) in last RS PDU */
+ struct SSCOP_MBUF_T *uu_bgn; /* last UU data */
+ struct SSCOP_MBUF_T *uu_bgak; /* ... */
+ struct SSCOP_MBUF_T *uu_bgrej; /* ... */
+ struct SSCOP_MBUF_T *uu_end; /* ... */
+ struct SSCOP_MBUF_T *uu_rs; /* ... */
+
+ /* signal queues */
+ sscop_sigq_head_t sigs; /* saved signals */
+ sscop_sigq_head_t saved_sigs; /* saved signals */
+ int in_sig; /* in signal handler */
+
+ /* debugging */
+ u_int debug;
+
+ /* AA interface */
+ void *aarg;
+};
+
+
+/*
+ * Default values for SSCOP
+ */
+enum {
+ MAXK = 4096,
+ MAXMAXK = 65528,
+ MAXJ = 4096,
+ MAXMAXJ = 65524,
+ MAXCC = 4,
+ MAXSTAT = 67,
+ MAXPD = 25,
+ MAXMR = 128, /* ??? */
+ TIMERCC = 1000,
+ TIMERKA = 2000,
+ TIMERNR = 7000,
+ TIMERPOLL = 750,
+ TIMERIDLE = 15000,
+};
+
+/*
+ * Sequence number arithmetic
+ */
+#define SEQNO_DIFF(A,B) (((A) < (B)) ? ((A) + (1<<24) - (B)) : ((A) - (B)))
+
+/*
+ * Debugging
+ */
+#ifdef SSCOP_DEBUG
+#define VERBOSE(S,M,F) if ((S)->debug & (M)) (S)->funcs->verbose F
+#define VERBERR(S,M,F) if ((S)->debug & (M)) (S)->funcs->verbose F
+#define ISVERBOSE(S,M) ((S)->debug & (M))
+#else
+#define VERBOSE(S,M,F)
+#define VERBERR(S,M,F)
+#define ISVERBOSE(S,M) (0)
+#endif
diff --git a/sys/contrib/ngatm/netnatm/sig/genmsgcpyc.awk b/sys/contrib/ngatm/netnatm/sig/genmsgcpyc.awk
new file mode 100644
index 0000000..be61925
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/genmsgcpyc.awk
@@ -0,0 +1,80 @@
+#
+# Copyright (c) 2001-2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Hartmut Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/sig/genmsgcpyc.awk,v 1.4 2004/07/08 08:22:18 brandt Exp $
+#
+# Generate copy functions for messages
+#
+function begin() {
+}
+
+function first_entry() {
+ print "/* This file was created automatically"
+ print " * Source file: " id
+ print " * $FreeBSD$"
+ print " */"
+ print ""
+ print "#include <netnatm/msg/unistruct.h>"
+ print "#include <netnatm/sig/unimsgcpy.h>"
+}
+
+function end() {
+}
+
+function start_message() {
+}
+
+function end_message() {
+ print ""
+ print "void"
+ print "copy_msg_" msg "(struct uni_" msg " *src, struct uni_" msg " *dst)"
+ print "{"
+ for(i = 0; i < cnt; i++) {
+ if(ienum[i] != "-") {
+ print "\tu_int s, d;"
+ print ""
+ break
+ }
+ }
+ for(i = 0; i < cnt; i++) {
+ ie = iename[i]
+ if(ierep[i]) {
+ print "\tif(IE_ISGOOD(src->" ie "_repeat))"
+ print "\t\tdst->" ie "_repeat = src->" ie "_repeat;"
+ }
+ if(ienum[i] != "-") {
+ print "\tfor(s = d = 0; s < "ienum[i]"; s++)"
+ print "\t\tif(IE_ISGOOD(src->"ie"[s]))"
+ print "\t\t\tdst->"ie"[d++] = src->"ie"[s];"
+ } else {
+ print "\tif(IE_ISGOOD(src->"ie"))"
+ print "\t\tdst->"ie" = src->"ie";"
+ }
+ }
+ print "}"
+}
diff --git a/sys/contrib/ngatm/netnatm/sig/genmsgcpyh.awk b/sys/contrib/ngatm/netnatm/sig/genmsgcpyh.awk
new file mode 100644
index 0000000..f9b44f2
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/genmsgcpyh.awk
@@ -0,0 +1,55 @@
+#
+# Copyright (c) 2001-2003
+# Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+# All rights reserved.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+# ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+# IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+# ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+# FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+# DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+# OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+# HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+# LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+# OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+# SUCH DAMAGE.
+#
+# Author: Hartmut Brandt <harti@freebsd.org>
+#
+# $Begemot: libunimsg/netnatm/sig/genmsgcpyh.awk,v 1.4 2004/07/08 08:22:19 brandt Exp $
+#
+# Generate copy functions for messages
+#
+function begin() {
+}
+
+function first_entry() {
+ print "/* This file was created automatically"
+ print " * Source file: " id
+ print " * $FreeBSD$"
+ print " */"
+ print ""
+}
+
+function end() {
+}
+
+function start_message() {
+}
+
+function end_message() {
+ print ""
+ print "void"
+ print "copy_msg_" msg "(struct uni_" msg " *src, struct uni_" msg " *dst);"
+ print ""
+}
diff --git a/sys/contrib/ngatm/netnatm/sig/sig_call.c b/sys/contrib/ngatm/netnatm/sig/sig_call.c
new file mode 100644
index 0000000..96edd77
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/sig_call.c
@@ -0,0 +1,4310 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/sig/sig_call.c,v 1.65 2004/08/05 07:11:00 brandt Exp $
+ *
+ * Call instance handling
+ *
+ * Note:
+ * In all functions that handle messages from the user or from
+ * the SAAL, commit memory allocation always at the begin of the
+ * function. If allocation fails, ignore saal messages and
+ * respond with an error to user messages.
+ */
+
+#include <netnatm/unimsg.h>
+#include <netnatm/saal/sscfudef.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/sig/uni.h>
+
+#include <netnatm/sig/unipriv.h>
+#include <netnatm/sig/unimkmsg.h>
+#include <netnatm/sig/unimsgcpy.h>
+
+static enum call_state state_compat(struct call *, enum uni_callstate);
+static void respond_drop_party_ack(struct call *, struct uni_ie_epref *, u_int);
+
+
+#define DEF_PRIV_SIG(NAME, FROM) [SIG##NAME] = "SIG"#NAME,
+static const char *const call_sigs[] = {
+ DEF_CALL_SIGS
+};
+#undef DEF_PRIV_SIG
+
+TIMER_FUNC_CALL(t308, t308_func)
+TIMER_FUNC_CALL(t303, t303_func)
+TIMER_FUNC_CALL(t301, t301_func)
+TIMER_FUNC_CALL(t310, t310_func)
+TIMER_FUNC_CALL(t313, t313_func)
+TIMER_FUNC_CALL(t322, t322_func)
+
+const struct callstates callstates[] = {
+ [CALLST_NULL] = { "NU0", UNI_CALLSTATE_U0 },
+ [CALLST_U1] = { "U1", UNI_CALLSTATE_U1 },
+ [CALLST_U3] = { "U3", UNI_CALLSTATE_U3 },
+ [CALLST_U4] = { "U4", UNI_CALLSTATE_U4 },
+ [CALLST_U6] = { "U6", UNI_CALLSTATE_U6 },
+ [CALLST_U7] = { "U7", UNI_CALLSTATE_U7 },
+ [CALLST_U8] = { "U8", UNI_CALLSTATE_U8 },
+ [CALLST_U9] = { "U9", UNI_CALLSTATE_U9 },
+ [CALLST_U10] = { "U10", UNI_CALLSTATE_U10 },
+ [CALLST_U11] = { "U11", UNI_CALLSTATE_U11 },
+ [CALLST_U12] = { "U12", UNI_CALLSTATE_U12 },
+ [CALLST_N1] = { "N1", UNI_CALLSTATE_N1 },
+ [CALLST_N3] = { "N3", UNI_CALLSTATE_N3 },
+ [CALLST_N4] = { "N4", UNI_CALLSTATE_N4 },
+ [CALLST_N6] = { "N6", UNI_CALLSTATE_N6 },
+ [CALLST_N7] = { "N7", UNI_CALLSTATE_N7 },
+ [CALLST_N8] = { "N8", UNI_CALLSTATE_N8 },
+ [CALLST_N9] = { "N9", UNI_CALLSTATE_N9 },
+ [CALLST_N10] = { "N10", UNI_CALLSTATE_N10 },
+ [CALLST_N11] = { "N11", UNI_CALLSTATE_N11 },
+ [CALLST_N12] = { "N12", UNI_CALLSTATE_N12 },
+};
+
+static void unx_send_add_party_rej(struct call *c, struct uni_all *u);
+
+static __inline void
+set_call_state(struct call *c, enum call_state state)
+{
+ ASSERT(state == CALLST_NULL ||
+ (c->uni->proto == UNIPROTO_UNI40U &&
+ (state >= CALLST_U1 && state <= CALLST_U12)) ||
+ (c->uni->proto == UNIPROTO_UNI40N &&
+ (state >= CALLST_N1 && state <= CALLST_N12)),
+ ("setting wrong callstate for proto %u: %u", c->uni->proto, state));
+
+ if (c->cstate != state) {
+ VERBOSE(c->uni, UNI_FAC_CALL, 1, "call %d/%d %s -> %s",
+ c->cref, c->mine, callstates[c->cstate].name,
+ callstates[state].name);
+ c->cstate = state;
+ }
+}
+
+static enum uni_callstate
+map_callstate(enum call_state state)
+{
+ return (callstates[state].ext);
+}
+
+/*
+ * Find the call. Assume, that the cref is one of a message just received.
+ * That is, if the call reference flag is 0 it is his call, if it is 1 it
+ * is my call.
+ */
+struct call *
+uni_find_call(struct uni *uni, struct uni_cref *cref)
+{
+ struct call *c;
+
+ TAILQ_FOREACH(c, &uni->calls, link)
+ if (c->cref == cref->cref && (!c->mine == !cref->flag))
+ return (c);
+ return (NULL);
+}
+struct call *
+uni_find_callx(struct uni *uni, u_int cref, u_int mine)
+{
+ struct call *c;
+
+ TAILQ_FOREACH(c, &uni->calls, link)
+ if (c->cref == cref && !c->mine == !mine)
+ return (c);
+ return (NULL);
+}
+
+/*
+ * Create a new call instance. The type must be set by the caller.
+ */
+struct call *
+uni_create_call(struct uni *uni, u_int cref, u_int mine, uint32_t cookie)
+{
+ struct call *c;
+ struct uniapi_call_created *ind;
+ struct uni_msg *api;
+
+ if ((c = CALL_ALLOC()) == NULL)
+ return (NULL);
+
+ if ((ind = ALLOC_API(struct uniapi_call_created, api)) == NULL) {
+ CALL_FREE(c);
+ return (NULL);
+ }
+ ind->cref.cref = cref;
+ ind->cref.flag = mine;
+
+ c->uni = uni;
+ c->type = CALL_NULL;
+ c->cref = cref;
+ c->mine = mine;
+ c->cstate = CALLST_NULL;
+ TAILQ_INIT(&c->parties);
+
+ TIMER_INIT_CALL(c, t301);
+ TIMER_INIT_CALL(c, t303);
+ TIMER_INIT_CALL(c, t308);
+ TIMER_INIT_CALL(c, t310);
+ TIMER_INIT_CALL(c, t313);
+ TIMER_INIT_CALL(c, t322);
+
+ TAILQ_INSERT_HEAD(&uni->calls, c, link);
+
+ uni->funcs->uni_output(uni, uni->arg, UNIAPI_CALL_CREATED, cookie, api);
+
+ VERBOSE(c->uni, UNI_FAC_CALL, 1, "created call %u/%s",
+ c->cref, c->mine ? "mine" : "his");
+
+ return (c);
+}
+
+struct call *
+uni_create_new_call(struct uni *uni, uint32_t cookie)
+{
+ struct call *c;
+ uint32_t old = uni->cref_alloc++;
+
+ again:
+ if (uni->cref_alloc == (1 << 23))
+ uni->cref_alloc = 1;
+ if (uni->cref_alloc == old)
+ return (NULL); /* all crefs exhausted!!! */
+ TAILQ_FOREACH(c, &uni->calls, link)
+ if (c->mine && c->cref == uni->cref_alloc) {
+ uni->cref_alloc++;
+ goto again;
+ }
+ return (uni_create_call(uni, uni->cref_alloc, 1, cookie));
+}
+
+/*
+ * Assume timers are all stopped. Memory is not actually freed unless
+ * the reference count drops to 0.
+ * This function is assumed to remove the call from the parent UNI's
+ * call queue.
+ */
+void
+uni_destroy_call(struct call *c, int really)
+{
+ struct uniapi_call_destroyed *ind;
+ struct uni_msg *api;
+ struct party *p;
+
+ VERBOSE(c->uni, UNI_FAC_CALL, 1, "destroying call %u/%s",
+ c->cref, c->mine ? "mine" : "his");
+
+ TIMER_DESTROY_CALL(c, t301);
+ TIMER_DESTROY_CALL(c, t303);
+ TIMER_DESTROY_CALL(c, t308);
+ TIMER_DESTROY_CALL(c, t310);
+ TIMER_DESTROY_CALL(c, t313);
+ TIMER_DESTROY_CALL(c, t322);
+ TAILQ_REMOVE(&c->uni->calls, c, link);
+
+ uni_delsig(c->uni, SIG_CALL, c, NULL);
+
+ while ((p = TAILQ_FIRST(&c->parties)) != NULL) {
+ TAILQ_REMOVE(&c->parties, p, link);
+ uni_destroy_party(p, really);
+ }
+
+ if (!really) {
+ ind = ALLOC_API(struct uniapi_call_destroyed, api);
+ if (ind != NULL) {
+ ind->cref.cref = c->cref;
+ ind->cref.flag = c->mine;
+
+ uni_enq_coord(c->uni, SIGO_CALL_DESTROYED, 0, api);
+ }
+
+ uni_enq_call(c, SIGC_CALL_DELETE, 0, NULL, NULL);
+ return;
+ }
+
+ CALL_FREE(c);
+}
+
+static void
+allocate_epref(struct call *c, struct uni_ie_epref *epref)
+{
+ struct party *p;
+ uint32_t old = c->epref_alloc++;
+
+ again:
+ if (c->epref_alloc == (1 << 15))
+ c->epref_alloc = 0;
+ if (c->epref_alloc == old)
+ return; /* all crefs exhausted!!! */
+ TAILQ_FOREACH(p, &c->parties, link)
+ if (p->epref == c->epref_alloc) {
+ c->epref_alloc++;
+ goto again;
+ }
+ IE_SETPRESENT(*epref);
+ epref->flag = 0;
+ epref->epref = c->epref_alloc;
+
+ epref->h.coding = UNI_CODING_ITU;
+ epref->h.act = UNI_IEACT_DEFAULT;
+}
+
+static void
+reset_all_timers(struct call *c)
+{
+ TIMER_STOP_CALL(c, t301);
+ TIMER_STOP_CALL(c, t303);
+ TIMER_STOP_CALL(c, t308);
+ TIMER_STOP_CALL(c, t310);
+ TIMER_STOP_CALL(c, t313);
+ TIMER_STOP_CALL(c, t322);
+}
+
+/*
+ * Initiate call clearing because of a problem. This is label D in
+ * the SDLs and is called from many places.
+ * The call must have constructed the cause IE in struct call.
+ *
+ * Q.2971:Call-Control-U 27/39
+ * Q.2971:Call-Control-N 28/39
+ *
+ * Memory problems are handled differently here: we simply ignore them
+ * by not sending messages or user indications. Because of T308 we
+ * may be lucky to send the message in a second run.
+ *
+ * It is assumed, that the cause for the release is constructed by
+ * the calling function in uni->cause.
+ */
+static void
+clear_callD(struct call *c)
+{
+ struct uni_msg *api;
+ struct uniapi_release_indication *ind;
+ struct party *p;
+ struct uni_all *rel;
+
+ /*
+ * Send indication to API
+ */
+ if ((ind = ALLOC_API(struct uniapi_release_indication, api)) != NULL) {
+ ind->release.hdr.cref.cref = c->cref;
+ ind->release.hdr.cref.flag = c->mine;
+ ind->release.hdr.act = UNI_MSGACT_DEFAULT;
+ ind->release.cause[0] = c->uni->cause;
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_RELEASE_indication, 0, api);
+ }
+
+ reset_all_timers(c);
+
+ if (c->type == CALL_LEAF || c->type == CALL_ROOT) {
+ TAILQ_FOREACH(p, &c->parties, link) {
+ uni_enq_party(p, SIGP_RELEASE_request, 0, NULL, NULL);
+ }
+ }
+
+ memset(&c->msg_release, 0, sizeof(c->msg_release));
+ c->msg_release.cause[0] = c->uni->cause;
+
+ if ((rel = UNI_ALLOC()) != NULL) {
+ rel->u.release = c->msg_release;
+ MK_MSG_ORIG(rel, UNI_RELEASE, c->cref, !c->mine);
+ (void)uni_send_output(rel, c->uni);
+ UNI_FREE(rel);
+ }
+
+ TIMER_START_CALL(c, t308, c->uni->timer308);
+ c->cnt308 = 0;
+
+ if (c->uni->proto == UNIPROTO_UNI40N)
+ set_call_state(c, CALLST_N12);
+ else
+ set_call_state(c, CALLST_U11);
+}
+
+
+/**********************************************************************/
+/*
+ * SETUP message in state NULL
+ *
+ * Q.2971:Call-Control-U 4/39
+ * Q.2971:Call-Control-N 4/39
+ */
+static void
+un0_setup(struct call *c, struct uni_msg *m, struct uni_all *u,
+ enum call_state new_state)
+{
+ struct uni_all *resp;
+ struct party *p;
+ struct uniapi_setup_indication *ind;
+ struct uni_msg *api;
+ enum verify v;
+
+ if ((ind = ALLOC_API(struct uniapi_setup_indication, api)) == NULL) {
+ clear:
+ uni_destroy_call(c, 0);
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ /*
+ * Analyze message
+ */
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ MANDATE_IE(c->uni, u->u.setup.bearer, UNI_IE_BEARER);
+ MANDATE_IE(c->uni, u->u.setup.traffic, UNI_IE_TRAFFIC);
+ MANDATE_IE(c->uni, u->u.setup.called, UNI_IE_CALLED);
+
+ /*
+ * UNI4.0: 9.1.1.2 Notes 2/3
+ */
+ if (!IE_ISPRESENT(u->u.setup.qos))
+ MANDATE_IE(c->uni, u->u.setup.exqos, UNI_IE_EXQOS);
+ if (!IE_ISPRESENT(u->u.setup.exqos))
+ MANDATE_IE(c->uni, u->u.setup.qos, UNI_IE_QOS);
+
+ /*
+ * Q.2971
+ */
+ if (IE_ISGOOD(u->u.setup.bearer) &&
+ u->u.setup.bearer.cfg == UNI_BEARER_MP) {
+ if (IE_ISGOOD(u->u.setup.epref) &&
+ u->u.setup.epref.flag == 1) {
+ IE_SETERROR(u->u.setup.epref);
+ UNI_SAVE_IERR(&c->uni->cx, UNI_IE_EPREF,
+ u->u.setup.epref.h.act, UNI_IERR_BAD);
+ }
+ uni_mandate_epref(c->uni, &u->u.setup.epref);
+ }
+
+ v = uni_verify(c->uni, u->u.hdr.act);
+ switch (v) {
+
+ case VFY_RAI:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ UNI_CALLSTATE_U0, NULL, 0);
+ /* FALLTHRU */
+ case VFY_I:
+ uni_msg_destroy(api);
+ goto clear;
+
+ case VFY_RAIM:
+ case VFY_CLR:
+ if ((resp = UNI_ALLOC()) != NULL) {
+ MK_MSG_RESP(resp, UNI_RELEASE_COMPL, &u->u.hdr.cref);
+ uni_vfy_collect_ies(c->uni);
+ resp->u.release_compl.cause[0] = c->uni->cause;
+ uni_send_output(resp, c->uni);
+ UNI_FREE(resp);
+ }
+ uni_msg_destroy(api);
+ goto clear;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(new_state), NULL, 0);
+ /* FALLTHRU */
+ case VFY_OK:
+ break;
+ }
+
+ if (u->u.setup.bearer.cfg == UNI_BEARER_P2P) {
+ c->type = CALL_P2P;
+
+ } else {
+ c->type = CALL_LEAF;
+ if ((p = uni_create_party(c, &u->u.setup.epref)) == NULL) {
+ uni_msg_destroy(api);
+ goto clear;
+ }
+ uni_enq_party(p, SIGP_SETUP, 0, NULL, NULL);
+ }
+
+ ind->setup.hdr = u->u.hdr;
+ copy_msg_setup(&u->u.setup, &ind->setup);
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_SETUP_indication, 0, api);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ set_call_state(c, new_state);
+}
+
+/*
+ * Setup.request from user
+ *
+ * Q.2971:Call-Control-U 4/39 (U0)
+ * Q.2971:Call-Control-N 4/39 (N0)
+ */
+static void
+un0_setup_request(struct call *c, struct uni_msg *m, uint32_t cookie,
+ enum call_state new_state)
+{
+ struct uniapi_setup_request *arg =
+ uni_msg_rptr(m, struct uniapi_setup_request *);
+ struct uni_setup *setup = &arg->setup;
+ struct uni_all *out;
+ struct party *p;
+
+ if (!IE_ISGOOD(setup->bearer)) {
+ uni_msg_destroy(m);
+ uniapi_call_error(c, UNIAPI_ERROR_MISSING_IE, cookie);
+ uni_destroy_call(c, 0);
+ return;
+ }
+ if ((out = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(m);
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ uni_destroy_call(c, 0);
+ return;
+ }
+
+ c->msg_setup = *setup;
+
+ if (IE_ISGOOD(setup->connid))
+ c->connid = setup->connid;
+
+ if (setup->bearer.cfg == UNI_BEARER_P2P) {
+ c->type = CALL_P2P;
+ } else {
+ c->type = CALL_ROOT;
+
+ /*
+ * If the user didn't specify a endpoint reference,
+ * use 0. Use IE_IGNORE accoring to Appendix II Q.2971
+ */
+ if (!IE_ISPRESENT(c->msg_setup.epref)) {
+ MK_IE_EPREF(c->msg_setup.epref, 0, 0);
+ if (c->uni->proto == UNIPROTO_UNI40N)
+ c->msg_setup.epref.h.act = UNI_IEACT_IGNORE;
+
+ } else if (!IE_ISGOOD(c->msg_setup.epref)) {
+ uni_msg_destroy(m);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ uni_destroy_call(c, 0);
+ return;
+ }
+ if ((p = uni_create_partyx(c, 0, 1, cookie)) == NULL) {
+ uni_msg_destroy(m);
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ uni_destroy_call(c, 0);
+ return;
+ }
+ uni_enq_party(p, SIGP_SETUP_request, cookie, NULL, NULL);
+ }
+
+ uni_msg_destroy(m);
+
+ out->u.setup = c->msg_setup;
+ MK_MSG_ORIG(out, UNI_SETUP, c->cref, !c->mine);
+ (void)uni_send_output(out, c->uni);
+ UNI_FREE(out);
+
+ TIMER_START_CALL(c, t303, c->uni->timer303);
+ c->cnt303 = 0;
+
+ set_call_state(c, new_state);
+
+ uniapi_call_error(c, UNIAPI_OK, cookie);
+}
+
+/*
+ * CALL PROCEEDING message
+ *
+ * Q.2971:Call-Control-U 6/39 (in U1)
+ * Q.2971:Call-Control-N 11/39 (in N6)
+ */
+static void
+u1n6_call_proc(struct call *c, struct uni_msg *m, struct uni_all *u,
+ enum call_state new_state)
+{
+ struct uni_call_proc *cp = &u->u.call_proc;
+ struct uniapi_proceeding_indication *ind;
+ struct uni_msg *api;
+
+ ind = ALLOC_API(struct uniapi_proceeding_indication, api);
+ if (ind == NULL) {
+ ignore:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+ /*
+ * Analyze message
+ */
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ if (!IE_ISPRESENT(c->connid) && !IE_ISGOOD(cp->connid))
+ uni_mandate_ie(c->uni, UNI_IE_CONNID);
+
+ /*
+ * Q.2971: L3MU_01_03 requests us to ignore the message if
+ * the EPREF is missing.
+ */
+ if (c->msg_setup.bearer.cfg == UNI_BEARER_MP &&
+ IE_ISPRESENT(c->msg_setup.epref)) {
+ if (!IE_ISPRESENT(cp->epref))
+ uni_mandate_ie(c->uni, UNI_IE_EPREF); \
+
+ else if (IE_ISGOOD(cp->epref) &&
+ (cp->epref.flag != 1 ||
+ cp->epref.epref != c->msg_setup.epref.epref)) {
+ IE_SETERROR(cp->epref);
+ UNI_SAVE_IERR(&c->uni->cx, UNI_IE_EPREF,
+ cp->epref.h.act, UNI_IERR_BAD);
+ }
+ }
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ /* FALLTHRU */
+ case VFY_I:
+ uni_msg_destroy(api);
+ goto ignore;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ report:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), NULL, 0);
+ uni_msg_destroy(api);
+ goto ignore;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ if (c->type == CALL_ROOT && !IE_ISGOOD(cp->epref))
+ goto report;
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(new_state), NULL, 0);
+ /* FALLTHRU */
+ case VFY_OK:
+ break;
+ }
+
+ TIMER_STOP_CALL(c, t303);
+
+ if (IE_ISGOOD(cp->connid))
+ c->connid = cp->connid;
+
+ ind->call_proc.hdr = u->u.hdr;
+ copy_msg_call_proc(cp, &ind->call_proc);
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_PROCEEDING_indication, 0, api);
+
+ TIMER_START_CALL(c, t310, c->uni->timer310);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ set_call_state(c, new_state);
+}
+
+/*
+ * T303 tick.
+ *
+ * Q.2971:Call-Control-U 6/39
+ * Q.2971:Call-Control-N 11/39
+ */
+static void
+u1n6_t303(struct call *c)
+{
+ struct uni_all *msg;
+ struct uniapi_release_confirm *conf;
+ struct uni_msg *api;
+
+ VERBOSE(c->uni, UNI_FAC_TIMEOUT, 1, "call %u/%s T303 tick %d",
+ c->cref, c->mine ? "mine" : "his", c->cnt303 + 1);
+
+ if (++c->cnt303 < c->uni->init303) {
+ if ((msg = UNI_ALLOC()) != NULL) {
+ msg->u.setup = c->msg_setup;
+ MK_MSG_ORIG(msg, UNI_SETUP, c->cref, !c->mine);
+ (void)uni_send_output(msg, c->uni);
+ UNI_FREE(msg);
+ }
+ TIMER_START_CALL(c, t303, c->uni->timer303);
+ return;
+ }
+
+ /*
+ * Send indication to API
+ */
+ if ((conf = ALLOC_API(struct uniapi_release_confirm, api)) != NULL) {
+ conf->release.hdr.cref.cref = c->cref;
+ conf->release.hdr.cref.flag = c->mine;
+ conf->release.hdr.act = UNI_MSGACT_DEFAULT;
+ MK_IE_CAUSE(conf->release.cause[0], UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_NO_RESPONSE);
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_RELEASE_confirm, 0, api);
+ }
+
+ /*
+ * send to party (there may be only one)
+ */
+ if (c->type == CALL_ROOT && !TAILQ_EMPTY(&c->parties)) {
+ uni_enq_party(TAILQ_FIRST(&c->parties),
+ SIGP_RELEASE_confirm, 0, NULL, NULL);
+ }
+ uni_destroy_call(c, 0);
+}
+
+/*
+ * T310 (Call Proceeding) timer tick.
+ *
+ * Q.2971:Call-Control-U 7/39
+ * Q.2971:Call-Control-N 17/39
+ */
+static void
+u3n9_t310(struct call *c)
+{
+ VERBOSE(c->uni, UNI_FAC_TIMEOUT, 1, "call %u/%s T310 tick",
+ c->cref, c->mine ? "mine" : "his");
+
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER, UNI_CAUSE_NO_RESPONSE);
+ clear_callD(c);
+}
+
+/*
+ * T301 (Alerting) timer tick.
+ *
+ * Q.2971:Call-Control-U Missing
+ * Q.2971:Call-Control-N 14/39
+ */
+static void
+u4n7_t301(struct call *c)
+{
+ VERBOSE(c->uni, UNI_FAC_TIMEOUT, 1, "call %u/%s T301 tick",
+ c->cref, c->mine ? "mine" : "his");
+
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER, UNI_CAUSE_NO_RESP_ALERT);
+ clear_callD(c);
+}
+
+/*
+ * ALERTING received
+ *
+ * Q.2971:Call-Control-U 37/39 (U1)
+ * Q.2971:Call-Control-U 7/39 (U3)
+ * Q.2971:Call-Control-N 9/39 (N6)
+ * Q.2971:Call-Control-N 17/39 (N9)
+ *
+ * There are two errors in the user side SDL Annex A:
+ *
+ * - the resetted timers are swapped (T310 and T303)
+ *
+ * - for U1 we should go to C12, not C3 to start T301.
+ */
+static void
+unx_alerting(struct call *c, struct uni_msg *m, struct uni_all *u,
+ enum call_state new_state)
+{
+ struct uni_alerting *al = &u->u.alerting;
+ struct uniapi_alerting_indication *ind;
+ struct uni_msg *api;
+
+ ind = ALLOC_API(struct uniapi_alerting_indication, api);
+ if (ind == NULL) {
+ ignore:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ /*
+ * Analyze message
+ */
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ if (!IE_ISPRESENT(c->connid) && !IE_ISGOOD(al->connid))
+ uni_mandate_ie(c->uni, UNI_IE_CONNID);
+
+ /*
+ * Q.2971: L3MU_01_04 requests us to ignore the message if the
+ * EPREF is missing.
+ */
+ if (c->msg_setup.bearer.cfg == UNI_BEARER_MP &&
+ IE_ISPRESENT(c->msg_setup.epref)) {
+ if (!IE_ISPRESENT(al->epref))
+ uni_mandate_ie(c->uni, UNI_IE_EPREF); \
+
+ else if (IE_ISGOOD(al->epref) &&
+ (al->epref.flag != 1 ||
+ al->epref.epref != c->msg_setup.epref.epref)) {
+ IE_SETERROR(al->epref);
+ UNI_SAVE_IERR(&c->uni->cx, UNI_IE_EPREF,
+ al->epref.h.act, UNI_IERR_BAD);
+ }
+ }
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ case VFY_I:
+ uni_msg_destroy(api);
+ goto ignore;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ report:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), NULL, 0);
+ uni_msg_destroy(api);
+ goto ignore;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ if (c->type == CALL_ROOT && !IE_ISGOOD(al->epref))
+ goto report;
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), NULL, 0);
+ case VFY_OK:
+ break;
+ }
+
+ if (c->cstate == CALLST_U1 || c->cstate == CALLST_N6)
+ TIMER_STOP_CALL(c, t303);
+ else if (c->cstate == CALLST_U3 || c->cstate == CALLST_N9)
+ TIMER_STOP_CALL(c, t310);
+
+ if (IE_ISGOOD(al->connid))
+ c->connid = al->connid;
+
+ ind->alerting.hdr = u->u.hdr;
+ copy_msg_alerting(al, &ind->alerting);
+
+ if (c->type == CALL_LEAF || c->type == CALL_ROOT) {
+ uni_enq_party(TAILQ_FIRST(&c->parties), SIGP_ALERTING,
+ 0, NULL, NULL);
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_ALERTING_indication, 0, api);
+ } else {
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_ALERTING_indication, 0, api);
+ TIMER_START_CALL(c, t301, c->uni->timer301);
+ }
+ UNI_FREE(u);
+ uni_msg_destroy(m);
+
+ set_call_state(c, new_state);
+}
+
+/*
+ * Proceeding.request from API
+ *
+ * Q.2971:Call-Control-U 12/39 (U6)
+ * Q.2971:Call-Control-N 6/39 (N1)
+ */
+static void
+u6n1_proceeding_request(struct call *c, struct uni_msg *m, uint32_t cookie,
+ enum call_state new_state)
+{
+ struct uni_all *msg;
+ struct uniapi_proceeding_request *arg =
+ uni_msg_rptr(m, struct uniapi_proceeding_request *);
+
+ if ((msg = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(m);
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ return;
+ }
+
+ if (IE_ISGOOD(arg->call_proc.connid))
+ c->connid = arg->call_proc.connid;
+
+ msg->u.call_proc = arg->call_proc;
+ MK_MSG_ORIG(msg, UNI_CALL_PROC, c->cref, !c->mine);
+ (void)uni_send_output(msg, c->uni);
+ UNI_FREE(msg);
+
+ set_call_state(c, new_state);
+
+ uni_msg_destroy(m);
+
+ uniapi_call_error(c, UNIAPI_OK, cookie);
+}
+
+/*
+ * Alerting.request from API
+ *
+ * Q.2971:Call-Control-U 13/39 (U6)
+ * Q.2971:Call-Control-U 17/39 (U9)
+ * Q.2971:Call-Control-N 38/39 (N1)
+ * Q.2971:Call-Control-N 7/39 (N3)
+ */
+static void
+unx_alerting_request(struct call *c, struct uni_msg *m, uint32_t cookie,
+ enum call_state new_state)
+{
+ struct uni_all *msg;
+ struct uniapi_alerting_request *arg =
+ uni_msg_rptr(m, struct uniapi_alerting_request *);
+
+ if ((msg = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(m);
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ return;
+ }
+
+ if (c->type == CALL_ROOT || c->type == CALL_LEAF) {
+ uni_enq_party(TAILQ_FIRST(&c->parties),
+ SIGP_ALERTING_request, cookie, NULL, NULL);
+ }
+
+ /*
+ * It's not really clear, what happens, if we send another
+ * connid in CALL_PROC and ALERTING
+ */
+ if (!IE_ISGOOD(c->connid) && IE_ISGOOD(arg->alerting.connid))
+ c->connid = arg->alerting.connid;
+
+ msg->u.alerting = arg->alerting;
+ MK_MSG_ORIG(msg, UNI_ALERTING, c->cref, !c->mine);
+ (void)uni_send_output(msg, c->uni);
+ UNI_FREE(msg);
+
+ set_call_state(c, new_state);
+
+ uni_msg_destroy(m);
+
+ uniapi_call_error(c, UNIAPI_OK, cookie);
+}
+
+
+/*
+ * Setup.response from API
+ *
+ * Q.2971:Call-Control-U 13/39 (U6)
+ * Q.2971:Call-Control-U 14/39 (U7)
+ * Q.2971:Call-Control-U 17/39 (U9)
+ * Q.2971:Call-Control-N 39/39 (N1)
+ * Q.2971:Call-Control-N 7/39 (N3)
+ * Q.2971:Call-Control-N 8/39 (N4)
+ */
+static void
+unx_setup_response(struct call *c, struct uni_msg *m, uint32_t cookie,
+ enum call_state new_state)
+{
+ struct uni_all *msg;
+ struct uniapi_setup_response *arg =
+ uni_msg_rptr(m, struct uniapi_setup_response *);
+ struct party *p;
+
+ if ((msg = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(m);
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ return;
+ }
+
+ if (!IE_ISGOOD(c->connid) && IE_ISGOOD(arg->connect.connid))
+ c->connid = arg->connect.connid;
+
+ if (IE_ISGOOD(arg->connect.epref)) {
+ p = uni_find_partyx(c, arg->connect.epref.epref,
+ !arg->connect.epref.flag);
+ if (p == NULL) {
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_PARTY, cookie);
+ UNI_FREE(msg);
+ uni_msg_destroy(m);
+ return;
+ }
+ /* we need to remember that we have sent the CONNECT from this
+ * party because the CONNECT ACK must move only this party
+ * into P7 */
+ p->flags |= PARTY_CONNECT;
+
+ } else if (c->type == CALL_LEAF) {
+ /* XXX don't mandate if only one party */
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_PARTY, cookie);
+ UNI_FREE(msg);
+ uni_msg_destroy(m);
+ return;
+ }
+
+ /* inform the parties on the network side */
+ if (c->uni->proto == UNIPROTO_UNI40N && c->type == CALL_LEAF)
+ TAILQ_FOREACH(p, &c->parties, link)
+ uni_enq_party(p, SIGP_SETUP_response, 0, NULL, NULL);
+
+ msg->u.connect = arg->connect;
+ MK_MSG_ORIG(msg, UNI_CONNECT, c->cref, !c->mine);
+ (void)uni_send_output(msg, c->uni);
+ UNI_FREE(msg);
+
+ if (c->uni->proto == UNIPROTO_UNI40U)
+ TIMER_START_CALL(c, t313, c->uni->timer313);
+
+ set_call_state(c, new_state);
+
+ uni_msg_destroy(m);
+
+ uniapi_call_error(c, UNIAPI_OK, cookie);
+}
+
+/*
+ * Setup_complete.request
+ *
+ * Q.2971:Call-Control-N 15/39 (N8)
+ */
+static void
+n8_setup_compl_request(struct call *c, struct uni_msg *m, uint32_t cookie,
+ enum call_state new_state)
+{
+ struct uni_all *msg;
+ struct uniapi_setup_complete_request *arg =
+ uni_msg_rptr(m, struct uniapi_setup_complete_request *);
+ struct party *p;
+
+ if ((msg = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(m);
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ return;
+ }
+
+ /* inform the parties on the network side */
+ if (c->uni->proto == UNIPROTO_UNI40N &&
+ (c->type == CALL_LEAF || c->type == CALL_ROOT)) {
+ TAILQ_FOREACH(p, &c->parties, link)
+ uni_enq_party(p, SIGP_SETUP_COMPL_request,
+ 0, NULL, NULL);
+ }
+
+ msg->u.connect_ack = arg->connect_ack;
+ MK_MSG_ORIG(msg, UNI_CONNECT_ACK, c->cref, !c->mine);
+ (void)uni_send_output(msg, c->uni);
+ UNI_FREE(msg);
+
+ set_call_state(c, new_state);
+
+ uni_msg_destroy(m);
+
+ uniapi_call_error(c, UNIAPI_OK, cookie);
+}
+
+/*
+ * CONNECT message
+ *
+ * Q.2971:Call-Control-U 7-8/39 (U3)
+ * Q.2971:Call-Control-U 11/39 (U4)
+ * Q.2971:Call-Control-U 37/39 (U1)
+ * Q.2971:Call-Control-N 9-10/39 (N6)
+ * Q.2971:Call-Control-N 14/39 (N7)
+ * Q.2971:Call-Control-N 17/39 (N9)
+ */
+static void
+unx_connect(struct call *c, struct uni_msg *m, struct uni_all *u,
+ enum call_state new_state)
+{
+ struct uni_connect *co = &u->u.connect;
+ struct uniapi_setup_confirm *conf;
+ struct uni_msg *api;
+ struct uni_all *ack;
+ struct party *p;
+
+ conf = ALLOC_API(struct uniapi_setup_confirm, api);
+ if (conf == NULL) {
+ ignore:
+ UNI_FREE(u);
+ uni_msg_destroy(m);
+ return;
+ }
+ if ((ack = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(api);
+ goto ignore;
+ }
+
+ /*
+ * Analyze message
+ */
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ if (!IE_ISPRESENT(c->connid) && !IE_ISGOOD(co->connid))
+ uni_mandate_ie(c->uni, UNI_IE_CONNID);
+
+ /*
+ * Q.2971: L3MU_01_05 requires the epref to be present.
+ */
+ p = NULL;
+ if (c->msg_setup.bearer.cfg == UNI_BEARER_MP) {
+ if (IE_ISPRESENT(c->msg_setup.epref)) {
+ if (!IE_ISPRESENT(co->epref))
+ uni_mandate_ie(c->uni, UNI_IE_EPREF); \
+
+ if (IE_ISGOOD(co->epref) &&
+ co->epref.flag != 1) {
+ IE_SETERROR(co->epref);
+ UNI_SAVE_IERR(&c->uni->cx, UNI_IE_EPREF,
+ co->epref.h.act, UNI_IERR_BAD);
+ }
+ }
+
+ if (IE_ISGOOD(co->epref)) {
+ p = uni_find_party(c, &co->epref);
+ if (p == NULL) {
+ respond_drop_party_ack(c, &co->epref,
+ UNI_CAUSE_ENDP_INV);
+ uni_msg_destroy(api);
+ UNI_FREE(ack);
+ goto ignore;
+ }
+ }
+ }
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ /* FALLTHRU */
+ case VFY_I:
+ uni_msg_destroy(api);
+ UNI_FREE(ack);
+ goto ignore;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ report:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), NULL, 0);
+ uni_msg_destroy(api);
+ UNI_FREE(ack);
+ goto ignore;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ if (c->type == CALL_ROOT && !IE_ISGOOD(co->epref))
+ goto report;
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(new_state), NULL, 0);
+ /* FALLTHRU */
+ case VFY_OK:
+ break;
+ }
+
+ if (IE_ISGOOD(co->connid))
+ c->connid = co->connid;
+
+ if (c->cstate == CALLST_U1 || c->cstate == CALLST_N6)
+ TIMER_STOP_CALL(c, t303);
+ else if (c->cstate == CALLST_U3 || c->cstate == CALLST_N9)
+ TIMER_STOP_CALL(c, t310);
+ else if (c->cstate == CALLST_U4 || c->cstate == CALLST_N7) {
+ if(c->type == CALL_P2P)
+ TIMER_STOP_CALL(c, t301);
+ }
+
+ /*
+ * This is sent to the party only on the user side and only
+ * to the one party in the epref (L3MU_05_03).
+ */
+ if (c->uni->proto == UNIPROTO_UNI40U &&
+ (c->type == CALL_LEAF || c->type == CALL_ROOT))
+ uni_enq_party(p, SIGP_CONNECT, 0, NULL, NULL);
+
+ conf->connect.hdr = u->u.hdr;
+ copy_msg_connect(co, &conf->connect);
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_SETUP_confirm, 0, api);
+
+ if (c->uni->proto == UNIPROTO_UNI40U) {
+ /* this is left to the application on the network side */
+ MK_MSG_ORIG(ack, UNI_CONNECT_ACK, c->cref, !c->mine);
+ (void)uni_send_output(ack, c->uni);
+ UNI_FREE(ack);
+ }
+
+ UNI_FREE(u);
+ uni_msg_destroy(m);
+
+ set_call_state(c, new_state);
+}
+
+/*
+ * T313 (Connect) timer tick.
+ *
+ * Q.2971:Call-Control-U 15/39
+ */
+static void
+u8_t313(struct call *c)
+{
+ VERBOSE(c->uni, UNI_FAC_TIMEOUT, 1, "call %u/%s T313 tick",
+ c->cref, c->mine ? "mine" : "his");
+
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER, UNI_CAUSE_RECOVER);
+ ADD_CAUSE_TIMER(c->uni->cause, "313");
+ clear_callD(c);
+}
+
+/*
+ * CONNECT ACKNOWLEDGE message in U8
+ *
+ * Q.2971:Call-Control-U 15-16/39
+ */
+static void
+u8_connect_ack(struct call *c, struct uni_msg *m, struct uni_all *u,
+ enum call_state new_state)
+{
+ struct uniapi_setup_complete_indication *ind;
+ struct uni_msg *api;
+
+ ind = ALLOC_API(struct uniapi_setup_complete_indication, api);
+ if (ind == NULL) {
+ ignore:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ /*
+ * Analyze message
+ */
+ (void)uni_decode_body(m, u, &c->uni->cx);
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ /* FALLTHRU */
+ case VFY_I:
+ uni_msg_destroy(api);
+ goto ignore;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), NULL, 0);
+ uni_msg_destroy(api);
+ goto ignore;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(new_state), NULL, 0);
+ /* FALLTHRU */
+ case VFY_OK:
+ break;
+ }
+
+ TIMER_STOP_CALL(c, t313);
+
+ if (c->type == CALL_LEAF) {
+ struct party *p;
+
+ TAILQ_FOREACH(p, &c->parties, link) {
+ if (p->flags & PARTY_CONNECT) {
+ uni_enq_party(p, SIGP_CONNECT_ACK,
+ 0, NULL, NULL);
+ break;
+ }
+ }
+ }
+
+ ind->connect_ack.hdr = u->u.hdr;
+ copy_msg_connect_ack(&u->u.connect_ack, &ind->connect_ack);
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_SETUP_COMPLETE_indication, 0, api);
+
+ UNI_FREE(u);
+ uni_msg_destroy(m);
+
+ set_call_state(c, new_state);
+}
+
+/*
+ * CONNECT ACKNOWLEDGE message in N10
+ *
+ * Q.2971:Call-Control-N 18/39
+ */
+static void
+n10_connect_ack(struct call *c, struct uni_msg *m, struct uni_all *u)
+{
+ /*
+ * Analyze message
+ */
+ (void)uni_decode_body(m, u, &c->uni->cx);
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ /* FALLTHRU */
+ case VFY_I:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), NULL, 0);
+ /* FALLTHRU */
+ case VFY_OK:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+}
+
+/*
+ * Release.response in U6 or U12.
+ *
+ * Q.2971:Call-Control-U 12/39 (U6)
+ * Q.2971:Call-Control-U 30/39 (U12)
+ * Q.2971:Call-Control-N 6/39 (N1)
+ * Q.2971:Call-Control-N 29/39 (N11)
+ */
+static void
+unx_release_response(struct call *c, struct uni_msg *m, uint32_t cookie)
+{
+ struct party *p;
+ struct uni_all *msg;
+ struct uniapi_release_response *arg =
+ uni_msg_rptr(m, struct uniapi_release_response *);
+
+ if ((msg = UNI_ALLOC()) == NULL) {
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ uni_msg_destroy(m);
+ return;
+ }
+
+ if (c->cstate == CALLST_U6 || c->cstate == CALLST_N1) {
+ if (c->type == CALL_ROOT || c->type == CALL_LEAF) {
+ TAILQ_FOREACH(p, &c->parties, link)
+ uni_enq_party(p, SIGP_RELEASE_response,
+ cookie, NULL, NULL);
+ }
+ }
+ msg->u.release_compl = arg->release_compl;
+ MK_MSG_ORIG(msg, UNI_RELEASE_COMPL, c->cref, !c->mine);
+ (void)uni_send_output(msg, c->uni);
+ UNI_FREE(msg);
+
+ uni_msg_destroy(m);
+
+ uniapi_call_error(c, UNIAPI_OK, cookie);
+
+ uni_destroy_call(c, 0);
+}
+
+/*
+ * Got a RELEASE COMPLETE in any state expect U0
+ *
+ * Q.2971:Call-Control-U 25/39
+ * Q.2971:Call-Control-N 26/39
+ *
+ * This is also called from the restart processes.
+ */
+void
+uni_release_compl(struct call *c, struct uni_all *u)
+{
+ struct uni_msg *api;
+ struct uniapi_release_confirm *conf;
+ struct party *p;
+ u_int i, j;
+
+ if ((conf = ALLOC_API(struct uniapi_release_confirm, api)) == NULL)
+ return;
+
+ reset_all_timers(c);
+ if (c->type == CALL_ROOT || c->type == CALL_LEAF) {
+ TAILQ_FOREACH(p, &c->parties, link)
+ uni_enq_party(p, SIGP_RELEASE_COMPL, 0, NULL, NULL);
+ /* YYY optional call reoffering 10.3.3/10.3.4 */
+ }
+ conf->release.hdr = u->u.hdr;
+
+ for (i = j = 0; i < 2; i++)
+ if (IE_ISGOOD(u->u.release_compl.cause[i]))
+ conf->release.cause[j++] = u->u.release_compl.cause[i];
+ for (i = j = 0; i < UNI_NUM_IE_GIT; i++)
+ if (IE_ISGOOD(u->u.release_compl.git[i]))
+ conf->release.git[j++] = u->u.release_compl.git[i];
+ if (IE_ISGOOD(u->u.release_compl.uu))
+ conf->release.uu = u->u.release_compl.uu;
+ if (IE_ISGOOD(u->u.release_compl.crankback))
+ conf->release.crankback = u->u.release_compl.crankback;
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_RELEASE_confirm, 0, api);
+
+ uni_destroy_call(c, 0);
+}
+static void
+unx_release_compl(struct call *c, struct uni_msg *m, struct uni_all *u)
+{
+
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ (void)uni_verify(c->uni, u->u.hdr.act); /* no point :-) */
+
+ uni_release_compl(c, u);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * Got a RELEASE COMPLETE in any state expect U0 and U11
+ *
+ * Q.2971:Call-Control-U 25/39
+ * Q.2971:Call-Control-N 26/39
+ */
+static void
+unx_release(struct call *c, struct uni_msg *m, struct uni_all *u,
+ enum call_state new_state)
+{
+ struct uniapi_release_indication *ind;
+ struct uni_msg *api;
+
+ if ((ind = ALLOC_API(struct uniapi_release_indication, api)) == NULL) {
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ (void)uni_verify(c->uni, u->u.hdr.act); /* no point :-) */
+
+ reset_all_timers(c);
+ if (c->type == CALL_ROOT || c->type == CALL_LEAF) {
+ struct party *p;
+
+ TAILQ_FOREACH(p, &c->parties, link)
+ uni_enq_party(p, SIGP_RELEASE, 0, NULL, NULL);
+ /* YYY optional call reoffering 10.3.3/10.3.4 */
+ }
+ if (c->cstate != new_state) {
+ /*
+ * According to Q.2971 we should send a 2nd
+ * Release.indication.
+ * According to Q.2931 the recipte of a RELEASE in U12/N11
+ * is illegal.
+ * According to us make it legal, but don't send a 2nd
+ * indication.
+ */
+ ind->release.hdr = u->u.hdr;
+ copy_msg_release(&u->u.release, &ind->release);
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_RELEASE_indication, 0, api);
+ } else
+ uni_msg_destroy(api);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ set_call_state(c, new_state);
+}
+
+/*
+ * Got RELEASE in U11 or N12
+ *
+ * Q.2971:Call-Control-U 28/39
+ * Q.2971:Call-Control-N 30/39
+ */
+static void
+u11n12_release(struct call *c, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_release_confirm *conf;
+ struct uni_msg *api;
+
+ if ((conf = ALLOC_API(struct uniapi_release_confirm, api)) == NULL) {
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ (void)uni_verify(c->uni, u->u.hdr.act); /* no point :-) */
+
+ TIMER_STOP_CALL(c, t308);
+
+ conf->release.hdr = u->u.hdr;
+ copy_msg_release(&u->u.release, &conf->release);
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_RELEASE_confirm, 0, api);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ uni_destroy_call(c, 0);
+}
+
+/*
+ * NOTIFY message
+ *
+ * Q.2971:Call-Control-U 18/39
+ * Q.2971:Call-Control-N 19/39
+ */
+static void
+unx_notify(struct call *c, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_notify_indication *ind;
+ struct uni_msg *api;
+ struct party *p = NULL;
+
+ if ((ind = ALLOC_API(struct uniapi_notify_indication, api)) == NULL) {
+ ignore:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ /*
+ * Analyze message
+ */
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ MANDATE_IE(c->uni, u->u.notify.notify, UNI_IE_NOTIFY);
+
+ if (IE_ISGOOD(u->u.notify.epref)) {
+ if ((p = uni_find_party(c, &u->u.notify.epref)) == NULL) {
+ respond_drop_party_ack(c, &u->u.notify.epref,
+ UNI_CAUSE_ENDP_INV);
+ uni_msg_destroy(api);
+ goto ignore;
+ }
+ }
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_msg_destroy(api);
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ goto ignore;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), &u->u.notify.epref,
+ p ? p->state : 0);
+ /* FALLTHRU */
+ case VFY_I:
+ uni_msg_destroy(api);
+ goto ignore;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), &u->u.notify.epref,
+ p ? p->state : 0);
+ case VFY_OK:
+ /* FALLTHRU */
+ break;
+ }
+
+ ind->notify.hdr = u->u.hdr;
+ copy_msg_notify(&u->u.notify, &ind->notify);
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_NOTIFY_indication, 0, api);
+
+ UNI_FREE(u);
+ uni_msg_destroy(m);
+}
+
+/*
+ * Notify.request from user
+ *
+ * Q.2971:Call-Control-U 18/39
+ * Q.2971:Call-Control-N 19/39
+ */
+static void
+unx_notify_request(struct call *c, struct uni_msg *m, uint32_t cookie)
+{
+ struct uni_all *msg;
+ struct uniapi_notify_request *arg =
+ uni_msg_rptr(m, struct uniapi_notify_request *);
+
+ if ((msg = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(m);
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ return;
+ }
+
+ msg->u.notify = arg->notify;
+ MK_MSG_ORIG(msg, UNI_NOTIFY, c->cref, !c->mine);
+ (void)uni_send_output(msg, c->uni);
+ UNI_FREE(msg);
+
+ uni_msg_destroy(m);
+
+ uniapi_call_error(c, UNIAPI_OK, cookie);
+}
+
+/**********************************************************************/
+
+/*
+ * Release.request from API in any state except U11, U12, N11, N12
+ *
+ * Q.2971:Call-Control-U 27/39
+ * Q.2971:Call-Control-N 28/39
+ */
+static void
+unx_release_request(struct call *c, struct uni_msg *m, uint32_t cookie,
+ enum call_state new_state)
+{
+ struct uni_all *msg;
+ struct uniapi_release_request *arg =
+ uni_msg_rptr(m, struct uniapi_release_request *);
+ struct party *p;
+
+ if ((msg = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(m);
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ return;
+ }
+
+ reset_all_timers(c);
+
+ if (c->type == CALL_LEAF || c->type == CALL_ROOT) {
+ TAILQ_FOREACH(p, &c->parties, link) {
+ uni_enq_party(p, SIGP_RELEASE_request, cookie,
+ NULL, NULL);
+ }
+ }
+
+ c->msg_release = arg->release;
+ if (!IE_ISPRESENT(c->msg_release.cause[0]) &&
+ !IE_ISPRESENT(c->msg_release.cause[1]))
+ MK_IE_CAUSE(c->msg_release.cause[0], UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_UNSPEC);
+
+ msg->u.release = c->msg_release;
+ MK_MSG_ORIG(msg, UNI_RELEASE, c->cref, !c->mine);
+ (void)uni_send_output(msg, c->uni);
+ UNI_FREE(msg);
+
+ TIMER_START_CALL(c, t308, c->uni->timer308);
+ c->cnt308 = 0;
+
+ set_call_state(c, new_state);
+
+ uni_msg_destroy(m);
+
+ uniapi_call_error(c, UNIAPI_OK, cookie);
+}
+
+/*
+ * Message with unknown EPREF - send a drop party according to 9.5.3.2.3a)
+ */
+static void
+respond_drop_party_ack(struct call *c, struct uni_ie_epref *epref,
+ u_int cause)
+{
+ struct uni_all *msg;
+
+ if ((msg = UNI_ALLOC()) == NULL)
+ return;
+
+ MK_MSG_ORIG(msg, UNI_DROP_PARTY_ACK, c->cref, !c->mine);
+ MK_IE_EPREF(msg->u.drop_party_ack.epref, epref->epref, !epref->flag);
+ MK_IE_CAUSE(msg->u.drop_party_ack.cause, UNI_CAUSE_LOC_USER, cause);
+ (void)uni_send_output(msg, c->uni);
+ UNI_FREE(msg);
+}
+
+/*
+ * T308 (RELEASE) timer
+ *
+ * Q.2971:Call-Control-U 28/39
+ * Q.2971:Call-Control-N 30/39
+ */
+static void
+u11n12_t308(struct call *c)
+{
+ struct uni_all *msg;
+ struct uni_msg *api;
+ struct uniapi_release_confirm *conf;
+
+ VERBOSE(c->uni, UNI_FAC_TIMEOUT, 1, "call %u/%s T308 tick %d",
+ c->cref, c->mine ? "mine" : "his", c->cnt308 + 1);
+
+ if (++c->cnt308 < c->uni->init308) {
+ if ((msg = UNI_ALLOC()) != NULL) {
+ msg->u.release = c->msg_release;
+ MK_MSG_ORIG(msg, UNI_RELEASE, c->cref, !c->mine);
+ if (!IE_ISPRESENT(msg->u.release.cause[1])) {
+ MK_IE_CAUSE(msg->u.release.cause[1],
+ UNI_CAUSE_LOC_USER, UNI_CAUSE_RECOVER);
+ ADD_CAUSE_TIMER(msg->u.release.cause[1], "308");
+ }
+ (void)uni_send_output(msg, c->uni);
+ UNI_FREE(msg);
+ }
+ TIMER_START_CALL(c, t308, c->uni->timer308);
+ return;
+ }
+
+ /*
+ * Send indication to API
+ */
+ if ((conf = ALLOC_API(struct uniapi_release_confirm, api)) != NULL) {
+ conf->release.hdr.cref.cref = c->cref;
+ conf->release.hdr.cref.flag = c->mine;
+ conf->release.hdr.act = UNI_MSGACT_DEFAULT;
+ MK_IE_CAUSE(conf->release.cause[0], UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_RECOVER);
+ ADD_CAUSE_TIMER(conf->release.cause[0], "308");
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_RELEASE_confirm, 0, api);
+ }
+
+ uni_destroy_call(c, 0);
+}
+/**********************************************************************/
+
+/*
+ * STATUS in U11/U12
+ *
+ * Q.2971:Call-Control-U 29/39 (U11)
+ * Q.2971:Call-Control-U 30/39 (U12)
+ * Q.2971:Call-Control-N 29/39 (N11)
+ * Q.2971:Call-Control-N 31/39 (N12)
+ */
+static void
+un11un12_status(struct call *c, struct uni_msg *m, struct uni_all *u)
+{
+ enum call_state ns;
+ struct uniapi_release_confirm *conf;
+ struct uni_msg *api;
+ struct party *p;
+ struct uniapi_status_indication *stat;
+
+ /*
+ * Analyze message
+ */
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ MANDATE_IE(c->uni, u->u.status.callstate, UNI_IE_CALLSTATE);
+ MANDATE_IE(c->uni, u->u.status.cause, UNI_IE_CAUSE);
+
+ ns = c->cstate;
+ if (IE_ISGOOD(u->u.status.callstate) &&
+ u->u.status.callstate.state == UNI_CALLSTATE_U0)
+ ns = CALLST_NULL;
+
+ p = NULL;
+ if (IE_ISGOOD(u->u.status.epref))
+ p = uni_find_party(c, &u->u.status.epref);
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(ns), &u->u.status.epref,
+ p ? p->state : UNI_EPSTATE_NULL);
+ case VFY_I:
+ case VFY_OK:
+ break;
+ }
+
+ if (ns == c->cstate) {
+ /*
+ * Inform API
+ */
+ stat = ALLOC_API(struct uniapi_status_indication, api);
+ if (stat != NULL) {
+ stat->cref = u->u.hdr.cref;
+ stat->my_state = map_callstate(c->cstate);
+ stat->his_state = u->u.status.callstate;
+ stat->his_cause = u->u.status.cause;
+ stat->epref = u->u.status.epref;
+ stat->epstate = u->u.status.epstate;
+ stat->my_cause = 0;
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_STATUS_indication, 0, api);
+ }
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ return;
+ }
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ /*
+ * Send indication to API
+ */
+ if ((conf = ALLOC_API(struct uniapi_release_confirm, api)) != NULL) {
+ conf->release.hdr.cref.cref = c->cref;
+ conf->release.hdr.cref.flag = c->mine;
+ conf->release.hdr.act = UNI_MSGACT_DEFAULT;
+ MK_IE_CAUSE(conf->release.cause[0], UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_MSG_INCOMP);
+ ADD_CAUSE_MTYPE(conf->release.cause[0], UNI_STATUS);
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_RELEASE_confirm, 0, api);
+ }
+
+ uni_destroy_call(c, 0);
+}
+
+static int
+status_enq_filter(struct sig *sig, void *arg)
+{
+ return (sig->type == SIG_CALL &&
+ (struct call *)arg == sig->call &&
+ sig->sig == SIGC_SEND_STATUS_ENQ);
+}
+
+/*
+ * STATUS in any state except U0/U11/U12 N0/N11/N12
+ *
+ * Q.2971:Call-Control-U 32/39
+ * Q.2971:Call-Control-N 33/39
+ */
+static void
+unx_status(struct call *c, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_status_indication *stat;
+ struct uniapi_release_confirm *conf;
+ enum call_state ns;
+ struct uni_msg *api;
+ struct party *p;
+
+ /*
+ * Analyze message
+ */
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ MANDATE_IE(c->uni, u->u.status.callstate, UNI_IE_CALLSTATE);
+ MANDATE_IE(c->uni, u->u.status.cause, UNI_IE_CAUSE);
+
+ ns = c->cstate;
+ if (IE_ISGOOD(u->u.status.callstate))
+ ns = state_compat(c, u->u.status.callstate.state);
+
+ p = NULL;
+ if (IE_ISGOOD(u->u.status.epref)) {
+ p = uni_find_party(c, &u->u.status.epref);
+ MANDATE_IE(c->uni, u->u.status.epstate, UNI_IE_EPSTATE);
+ }
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(ns), &u->u.notify.epref,
+ p ? p->state : UNI_EPSTATE_NULL);
+ /* FALLTHRU */
+ case VFY_I:
+ case VFY_OK:
+ break;
+ }
+
+ if (u->u.status.callstate.state == UNI_CALLSTATE_U0) {
+ /* release_complete */
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ if (c->type == CALL_LEAF || c->type == CALL_ROOT) {
+ TAILQ_FOREACH(p, &c->parties, link)
+ uni_enq_party(p, SIGP_RELEASE_COMPL,
+ 0, NULL, NULL);
+ }
+ /*
+ * Send indication to API
+ */
+ conf = ALLOC_API(struct uniapi_release_confirm, api);
+ if (conf != NULL) {
+ conf->release.hdr.cref.cref = c->cref;
+ conf->release.hdr.cref.flag = c->mine;
+ conf->release.hdr.act = UNI_MSGACT_DEFAULT;
+ MK_IE_CAUSE(conf->release.cause[0], UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_MSG_INCOMP);
+ ADD_CAUSE_MTYPE(conf->release.cause[0], UNI_STATUS);
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_RELEASE_confirm, 0, api);
+ }
+ uni_destroy_call(c, 0);
+ return;
+ }
+
+ if (IE_ISGOOD(u->u.status.cause) &&
+ u->u.status.cause.cause == UNI_CAUSE_STATUS) {
+ c->se_active = 0;
+ TIMER_STOP_CALL(c, t322);
+ uni_undel(c->uni, status_enq_filter, c);
+ }
+
+ /*
+ * Inform API
+ */
+ if ((stat = ALLOC_API(struct uniapi_status_indication, api)) != NULL) {
+ stat->cref = u->u.hdr.cref;
+ stat->my_state = map_callstate(c->cstate);
+ stat->his_state = u->u.status.callstate;
+ stat->his_cause = u->u.status.cause;
+ stat->epref = u->u.status.epref;
+ stat->epstate = u->u.status.epstate;
+ }
+
+ if (ns == c->cstate) {
+ /* compatible or recovered */
+ if (p != NULL)
+ uni_enq_party(p, SIGP_STATUS, 0, m, u);
+ else {
+ if (IE_ISGOOD(u->u.status.epref) &&
+ (!IE_ISGOOD(u->u.status.epstate) ||
+ u->u.status.epstate.state != UNI_EPSTATE_NULL))
+ respond_drop_party_ack(c, &u->u.status.epref,
+ UNI_CAUSE_MSG_INCOMP);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ }
+ if (stat != NULL) {
+ stat->my_cause = 0;
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_STATUS_indication, 0, api);
+ }
+
+ return;
+ }
+
+ /* incompatible */
+ if (stat != NULL) {
+ stat->my_cause = UNI_CAUSE_MSG_INCOMP;
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_STATUS_indication, 0, api);
+ }
+
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER, UNI_CAUSE_MSG_INCOMP);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ clear_callD(c);
+}
+
+/*
+ * Enquiry peer status
+ *
+ * Q.2971:Call-Control-U 31/39
+ * Q.2971:Call-Control-N 32/39
+ */
+static void
+unx_status_enquiry_request(struct call *c, struct uni_msg *msg, uint32_t cookie)
+{
+ struct uniapi_status_enquiry_request *arg =
+ uni_msg_rptr(msg, struct uniapi_status_enquiry_request *);
+ struct party *p;
+ struct uni_all *stat;
+
+ if (c->se_active) {
+ /* This case is not handled in the SDLs */
+ uniapi_call_error(c, UNIAPI_ERROR_BUSY, cookie);
+ uni_msg_destroy(msg);
+ return;
+ }
+ if ((c->type == CALL_ROOT || c->type == CALL_LEAF) &&
+ IE_ISGOOD(arg->epref)) {
+ if ((p = uni_find_partyx(c, arg->epref.epref, !arg->epref.flag))
+ == NULL) {
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_PARTY, cookie);
+ uni_msg_destroy(msg);
+ return;
+ }
+ uni_msg_destroy(msg);
+ uni_enq_party(p, SIGP_STATUS_ENQUIRY_request, cookie,
+ NULL, NULL);
+ return;
+ }
+ if ((stat = UNI_ALLOC()) == NULL) {
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ uni_msg_destroy(msg);
+ return;
+ }
+ memset(&c->stat_epref, 0, sizeof(c->stat_epref));
+ MK_MSG_ORIG(stat, UNI_STATUS_ENQ, c->cref, !c->mine);
+ (void)uni_send_output(stat, c->uni);
+ UNI_FREE(stat);
+
+ TIMER_START_CALL(c, t322, c->uni->timer322);
+ c->cnt322 = 0;
+ c->se_active = 1;
+
+ uniapi_call_error(c, UNIAPI_OK, cookie);
+}
+
+/*
+ * T322 tick
+ *
+ * Q.2971:Call-Control-U 34/39
+ * Q.2971:Call-Control-N 35/39
+ */
+static void
+unx_t322(struct call *c)
+{
+ struct uni_all *stat;
+
+ VERBOSE(c->uni, UNI_FAC_TIMEOUT, 1, "call %u/%s T322 tick %d",
+ c->cref, c->mine ? "mine" : "his", c->cnt322 + 1);
+
+ if (++c->cnt322 < c->uni->init322) {
+ if ((stat = UNI_ALLOC()) != NULL) {
+ MK_MSG_ORIG(stat, UNI_STATUS_ENQ, c->cref, !c->mine);
+ stat->u.status_enq.epref = c->stat_epref;
+ (void)uni_send_output(stat, c->uni);
+ UNI_FREE(stat);
+ }
+ TIMER_START_CALL(c, t322, c->uni->timer322);
+ return;
+ }
+ c->se_active = 0;
+
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER, UNI_CAUSE_RECOVER);
+ ADD_CAUSE_TIMER(c->uni->cause, "322");
+
+ clear_callD(c);
+}
+
+/*
+ * STATUS ENQUIRY message
+ *
+ * Q.2971:Call-Control-U 31/39
+ * Q.2971:Call-Control-N 32/39
+ */
+static void
+unx_status_enq(struct call *c, struct uni_msg *m, struct uni_all *u)
+{
+ struct party *p = NULL;
+ u_int epref, flag;
+
+ /*
+ * Analyze message
+ */
+ (void)uni_decode_body(m, u, &c->uni->cx);
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ case VFY_RAP:
+ case VFY_RAPU:
+ case VFY_I:
+ case VFY_OK:
+ break;
+ }
+
+ uni_msg_destroy(m);
+
+ if ((c->type == CALL_ROOT || c->type == CALL_LEAF) &&
+ IE_ISGOOD(u->u.status_enq.epref)) {
+ p = uni_find_party(c, &u->u.status_enq.epref);
+
+ epref = u->u.status_enq.epref.epref;
+ flag = u->u.status_enq.epref.flag;
+ memset(u, 0, sizeof(*u));
+ MK_IE_EPREF(u->u.status.epref, epref, !flag);
+
+ if (p != NULL)
+ MK_IE_EPSTATE(u->u.status.epstate, p->state);
+ else
+ MK_IE_EPSTATE(u->u.status.epstate, UNI_EPSTATE_NULL);
+ } else
+ memset(u, 0, sizeof(*u));
+
+
+ MK_MSG_ORIG(u, UNI_STATUS, c->cref, !c->mine);
+ MK_IE_CALLSTATE(u->u.status.callstate, map_callstate(c->cstate));
+ MK_IE_CAUSE(u->u.status.cause, UNI_CAUSE_LOC_USER, UNI_CAUSE_STATUS);
+ (void)uni_send_output(u, c->uni);
+ UNI_FREE(u);
+}
+
+/**********************************************************************/
+
+/*
+ * Link-release.indication from SAAL in state U10 or N10.
+ *
+ * Q.2971:Call-Control-U 19/39
+ * Q.2971:Call-Control-N 20/39
+ */
+static void
+un10_link_release_indication(struct call *c)
+{
+ struct party *p;
+
+ if (c->type == CALL_LEAF || c->type == CALL_ROOT)
+ TAILQ_FOREACH(p, &c->parties, link) {
+ if (p->state != UNI_EPSTATE_ACTIVE)
+ uni_enq_party(p, SIGP_RELEASE_COMPL,
+ 0, NULL, NULL);
+ }
+
+ uni_enq_coord(c->uni, SIGO_LINK_ESTABLISH_request, 0, NULL);
+}
+
+/*
+ * Link-release.indication from SAAL in all state except U10 and N10.
+ *
+ * Q.2971:Call-Control-U 36/39
+ * Q.2971:Call-Control-N 37/39
+ */
+static void
+unx_link_release_indication(struct call *c)
+{
+ struct uniapi_release_confirm *conf;
+ struct uni_msg *api;
+ struct party *p;
+
+ if (c->type == CALL_LEAF || c->type == CALL_ROOT)
+ TAILQ_FOREACH(p, &c->parties, link)
+ uni_enq_party(p, SIGP_RELEASE_COMPL, 0, NULL, NULL);
+
+ if ((conf = ALLOC_API(struct uniapi_release_confirm, api)) != NULL) {
+ conf->release.hdr.cref.cref = c->cref;
+ conf->release.hdr.cref.flag = c->mine;
+ conf->release.hdr.act = UNI_MSGACT_DEFAULT;
+ MK_IE_CAUSE(conf->release.cause[0], UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_DST_OOO);
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_RELEASE_confirm, 0, api);
+ }
+
+ uni_destroy_call(c, 0);
+}
+
+/*
+ * Failed to establish SAAL link. Can happen only in U10 or N10.
+ *
+ * Q.2971:Call-Control-U 19/39
+ * Q.2971:Call-Control-N 20/39
+ */
+static void
+un10_link_establish_error_indication(struct call *c)
+{
+ struct party *p;
+ struct uni_msg *api;
+ struct uniapi_release_confirm *conf;
+
+ if (c->type == CALL_LEAF || c->type == CALL_ROOT)
+ TAILQ_FOREACH(p, &c->parties, link)
+ uni_enq_party(p, SIGP_RELEASE_COMPL, 0, NULL, NULL);
+
+ if ((conf = ALLOC_API(struct uniapi_release_confirm, api)) != NULL) {
+ conf->release.hdr.cref.cref = c->cref;
+ conf->release.hdr.cref.flag = c->mine;
+ conf->release.hdr.act = UNI_MSGACT_DEFAULT;
+ MK_IE_CAUSE(conf->release.cause[0], UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_DST_OOO);
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_RELEASE_confirm, 0, api);
+ }
+
+ uni_destroy_call(c, 0);
+}
+
+/*
+ * Issue a STATUS ENQUIRY of we are not busy
+ *
+ * Q.2971: Call-Control-U: 34/39
+ * Q.2971: Call-Control-N: 34/39
+ */
+static void
+call_se(struct call *c)
+{
+ struct uni_all *stat;
+
+ c->cnt322 = 0;
+ if (c->se_active)
+ return;
+
+ memset(&c->stat_epref, 0, sizeof(c->stat_epref));
+ if ((stat = UNI_ALLOC()) != NULL) {
+ MK_MSG_ORIG(stat, UNI_STATUS_ENQ, c->cref, !c->mine);
+ (void)uni_send_output(stat, c->uni);
+ UNI_FREE(stat);
+ }
+
+ TIMER_START_CALL(c, t322, c->uni->timer322);
+ c->se_active = 1;
+}
+
+/*
+ * Link-establish.indication in U10
+ *
+ * Q.2971:Call-Control-U 19-20/39
+ * Q.2971:Call-Control-N 20-22/39
+ */
+static void
+un10_link_establish_indication(struct call *c)
+{
+ int act = 0;
+ struct party *p;
+
+ if (c->type == CALL_ROOT || c->type == CALL_LEAF) {
+ TAILQ_FOREACH(p, &c->parties, link)
+ if (p->state == UNI_EPSTATE_ACTIVE) {
+ act = 1;
+ uni_enq_party(p, SIGP_STATUS_ENQUIRY_request,
+ 0, NULL, NULL);
+ }
+ if (act)
+ return;
+ }
+ call_se(c);
+}
+
+/*
+ * Link-establish.indication in NOT U10/U11/U12 N10/N11/N12
+ *
+ * Q.2971:Call-Control-U 36/39
+ * Q.2971:Call-Control-N 37/39
+ */
+static void
+unx_link_establish_indication(struct call *c)
+{
+ call_se(c);
+}
+
+/*
+ * Link-establish.confirm in U10 or N10
+ *
+ * Q.2971:Call-Control-U 19/39
+ * Q.2971:Call-Control-N 20/39
+ */
+static void
+un10_link_establish_confirm(struct call *c)
+{
+ struct party *p;
+
+ if (c->type == CALL_ROOT || c->type == CALL_LEAF) {
+ TAILQ_FOREACH(p, &c->parties, link)
+ uni_enq_party(p, SIGP_STATUS_ENQUIRY_request,
+ 0, NULL, NULL);
+ return;
+ }
+
+ call_se(c);
+}
+
+/*
+ * STATUS ENQ from party
+ *
+ * Q.2971:Call-Control-U 21/39
+ * Q.2971:Call-Control-U 25/39
+ */
+static void
+unx_send_party_status_enq(struct call *c, struct uni_all *u)
+{
+ if (c->se_active) {
+ uni_delenq_sig(c->uni, SIG_CALL, c, NULL,
+ SIGC_SEND_STATUS_ENQ, 0, NULL, u);
+ return;
+ }
+
+ c->stat_epref = u->u.status_enq.epref;
+ (void)uni_send_output(u, c->uni);
+ UNI_FREE(u);
+
+ TIMER_START_CALL(c, t322, c->uni->timer322);
+ c->se_active = 1;
+}
+
+/**********************************************************************/
+
+static void
+make_drop_cause(struct call *c, struct uni_ie_cause *cause)
+{
+
+ if (!IE_ISGOOD(*cause)) {
+ /* 9.5.7.1 paragraph 2 */
+ if (IE_ISPRESENT(*cause))
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_IE_INV);
+ else
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_MANDAT);
+ c->uni->cause.u.ie.len = 1;
+ c->uni->cause.u.ie.ie[0] = UNI_IE_CAUSE;
+ c->uni->cause.h.present |= UNI_CAUSE_IE_P;
+
+ } else if (!IE_ISGOOD(c->uni->cause))
+ c->uni->cause = *cause;
+}
+
+/*
+ * Drop-party.indication from Party-Control in any state.
+ *
+ * Q.2971:Call-Control-U 23/39
+ */
+static void
+ux_drop_party_indication(struct call *c, struct uni_msg *api)
+{
+ struct uniapi_drop_party_indication *drop =
+ uni_msg_rptr(api, struct uniapi_drop_party_indication *);
+
+ if (uni_party_act_count(c, 2) == 0) {
+ if (c->cstate != CALLST_U11) {
+ make_drop_cause(c, &drop->drop.cause);
+ clear_callD(c);
+ }
+ uni_msg_destroy(api);
+ return;
+ }
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_DROP_PARTY_indication, 0, api);
+}
+
+/*
+ * Drop-party.indication from Party-Control in any state.
+ *
+ * Q.2971:Call-Control-N 23/39
+ */
+static void
+nx_drop_party_indication(struct call *c, struct uni_msg *api)
+{
+ struct uniapi_drop_party_indication *drop =
+ uni_msg_rptr(api, struct uniapi_drop_party_indication *);
+
+ if (uni_party_act_count(c, 0) == 0) {
+ if (uni_party_act_count(c, 1) == 0) {
+ if (c->cstate != CALLST_U11) {
+ make_drop_cause(c, &drop->drop.cause);
+ clear_callD(c);
+ }
+ uni_msg_destroy(api);
+ } else {
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_DROP_PARTY_indication, 0, api);
+ set_call_state(c, CALLST_N7);
+ }
+ } else {
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_DROP_PARTY_indication, 0, api);
+ }
+}
+
+/*
+ * Drop-party-ack.indication from Party-Control in any state.
+ *
+ * Q.2971:Call-Control-U 23/39
+ */
+static void
+ux_drop_party_ack_indication(struct call *c, struct uni_msg *api)
+{
+ struct uniapi_drop_party_ack_indication *drop =
+ uni_msg_rptr(api, struct uniapi_drop_party_ack_indication *);
+
+ if (uni_party_act_count(c, 2) == 0) {
+ if (c->cstate != CALLST_U11) {
+ make_drop_cause(c, &drop->drop.cause);
+ clear_callD(c);
+ }
+ uni_msg_destroy(api);
+ return;
+ }
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_DROP_PARTY_ACK_indication, 0, api);
+}
+
+/*
+ * Drop-party-ack.indication from Party-Control in any state.
+ *
+ * Q.2971:Call-Control-N 23/39
+ */
+static void
+nx_drop_party_ack_indication(struct call *c, struct uni_msg *api)
+{
+ struct uniapi_drop_party_ack_indication *drop =
+ uni_msg_rptr(api, struct uniapi_drop_party_ack_indication *);
+
+ if (uni_party_act_count(c, 0) == 0) {
+ if (uni_party_act_count(c, 1) == 0) {
+ if (c->cstate != CALLST_U11) {
+ make_drop_cause(c, &drop->drop.cause);
+ clear_callD(c);
+ }
+ uni_msg_destroy(api);
+ } else {
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_DROP_PARTY_ACK_indication, 0, api);
+ set_call_state(c, CALLST_N7);
+ }
+ } else {
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_DROP_PARTY_ACK_indication, 0, api);
+ }
+}
+
+/*
+ * Add-party-rej.indication from Party-Control in any state.
+ *
+ * Q.2971:Call-Control-U 23/39
+ */
+static void
+ux_add_party_rej_indication(struct call *c, struct uni_msg *api)
+{
+ struct uniapi_add_party_rej_indication *rej =
+ uni_msg_rptr(api, struct uniapi_add_party_rej_indication *);
+
+ if (uni_party_act_count(c, 2) == 0) {
+ if (c->cstate != CALLST_U11) {
+ make_drop_cause(c, &rej->rej.cause);
+ clear_callD(c);
+ }
+ uni_msg_destroy(api);
+ return;
+ }
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_ADD_PARTY_REJ_indication, 0, api);
+}
+
+/*
+ * Add-party-rej.indication from Party-Control in any state.
+ *
+ * Q.2971:Call-Control-N 23/39
+ */
+static void
+nx_add_party_rej_indication(struct call *c, struct uni_msg *api)
+{
+ struct uniapi_add_party_rej_indication *rej =
+ uni_msg_rptr(api, struct uniapi_add_party_rej_indication *);
+
+ if (uni_party_act_count(c, 0) == 0) {
+ if (uni_party_act_count(c, 1) == 0) {
+ if (c->cstate != CALLST_U11) {
+ make_drop_cause(c, &rej->rej.cause);
+ clear_callD(c);
+ }
+ uni_msg_destroy(api);
+ } else {
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_ADD_PARTY_REJ_indication, 0, api);
+ set_call_state(c, CALLST_N7);
+ }
+ } else {
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_ADD_PARTY_REJ_indication, 0, api);
+ }
+}
+
+/*
+ * Add-party.request from API in U4 or U10
+ *
+ * Q.2971:Call-Control-U 9-10/39 (U4)
+ * Q.2971:Call-Control-U 21/39 (U10)
+ * Q.2971:Call-Control-N 12/39 (N7)
+ * Q.2971:Call-Control-N 22/39 (N10)
+ */
+static void
+unx_add_party_request(struct call *c, struct uni_msg *msg, uint32_t cookie)
+{
+ struct uniapi_add_party_request *add =
+ uni_msg_rptr(msg, struct uniapi_add_party_request *);
+ struct party *p;
+
+ if (IE_ISGOOD(add->add.epref)) {
+ if (add->add.epref.flag != 0) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ return;
+ }
+ p = uni_find_partyx(c, add->add.epref.epref, 1);
+ if (p != NULL) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_EPREF_INUSE, cookie);
+ return;
+ }
+ } else if (!IE_ISPRESENT(add->add.epref)) {
+ allocate_epref(c, &add->add.epref);
+ if (!IE_ISPRESENT(add->add.epref)) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_EPREF_INUSE, cookie);
+ return;
+ }
+ } else {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ return;
+ }
+
+ if ((p = uni_create_partyx(c, add->add.epref.epref, 1, cookie)) == NULL) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_NOMEM, cookie);
+ return;
+ }
+ uni_enq_party(p, SIGP_ADD_PARTY_request, cookie, msg, NULL);
+}
+
+/*
+ * Add-party-ack.request from API in U10/N10
+ *
+ * Q.2971:Call-Control-U 21/39
+ * Q.2971:Call-Control-N 22/39
+ */
+static void
+un10_add_party_ack_request(struct call *c, struct uni_msg *msg, uint32_t cookie)
+{
+ struct uniapi_add_party_ack_request *ack =
+ uni_msg_rptr(msg, struct uniapi_add_party_ack_request *);
+ struct party *p;
+
+ if (!IE_ISGOOD(ack->ack.epref)) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ return;
+ }
+ if (ack->ack.epref.flag != 1) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ return;
+ }
+ if ((p = uni_find_partyx(c, ack->ack.epref.epref, 0)) == NULL) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_PARTY, cookie);
+ return;
+ }
+
+ uni_enq_party(p, SIGP_ADD_PARTY_ACK_request, cookie, msg, NULL);
+}
+
+/*
+ * Party-alerting.request from API in U7/U8/U10
+ *
+ * Q.2971:Call-Control-U 14/39 U7
+ * Q.2971:Call-Control-U 15/39 U8
+ * Q.2971:Call-Control-U 21/39 U10
+ * Q.2971:Call-Control-N 8/39 N4
+ * Q.2971:Call-Control-N 22/39 N10
+ */
+static void
+unx_party_alerting_request(struct call *c, struct uni_msg *msg, uint32_t cookie)
+{
+ struct uniapi_party_alerting_request *alert =
+ uni_msg_rptr(msg, struct uniapi_party_alerting_request *);
+ struct party *p;
+
+ if (!IE_ISGOOD(alert->alert.epref)) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ return;
+ }
+ if (alert->alert.epref.flag != 1) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ return;
+ }
+ if ((p = uni_find_partyx(c, alert->alert.epref.epref, 0)) == NULL) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_PARTY, cookie);
+ return;
+ }
+
+ uni_enq_party(p, SIGP_PARTY_ALERTING_request, cookie, msg, NULL);
+}
+
+/*
+ * Add-party-rej.request from API in U7/U8/U10/N4/N10
+ *
+ * Q.2971:Call-Control-U 14/39 U7
+ * Q.2971:Call-Control-U 15/39 U8
+ * Q.2971:Call-Control-U 21/39 U10
+ * Q.2971:Call-Control-N 8/39 N4
+ * Q.2971:Call-Control-N 22/39 N10
+ */
+static void
+unx_add_party_rej_request(struct call *c, struct uni_msg *msg, uint32_t cookie)
+{
+ struct uniapi_add_party_rej_request *rej =
+ uni_msg_rptr(msg, struct uniapi_add_party_rej_request *);
+ struct party *p;
+
+ if (!IE_ISGOOD(rej->rej.epref)) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ return;
+ }
+ if (rej->rej.epref.flag != 1) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ return;
+ }
+ if ((p = uni_find_partyx(c, rej->rej.epref.epref, 0)) == NULL) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_PARTY, cookie);
+ return;
+ }
+
+ uni_enq_party(p, SIGP_ADD_PARTY_REJ_request, cookie, msg, NULL);
+}
+
+/*
+ * Drop-party.request from API in U1-U10
+ *
+ * Q.2971:Call-Control-U 21/39 U10
+ * Q.2971:Call-Control-U 26/39 U1-U9
+ * Q.2971:Call-Control-N 22/39 N10
+ * Q.2971:Call-Control-N 27/39 N1-N9
+ */
+static void
+unx_drop_party_request(struct call *c, struct uni_msg *msg, uint32_t cookie)
+{
+ struct uniapi_drop_party_request *drop =
+ uni_msg_rptr(msg, struct uniapi_drop_party_request *);
+ struct party *p;
+
+ if (!IE_ISGOOD(drop->drop.epref)) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ return;
+ }
+ if ((p = uni_find_partyx(c, drop->drop.epref.epref, !drop->drop.epref.flag)) == NULL) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_PARTY, cookie);
+ return;
+ }
+
+ uni_enq_party(p, SIGP_DROP_PARTY_request, cookie, msg, NULL);
+}
+
+/*
+ * Drop-party-ack.request from API in U1-U10
+ *
+ * Q.2971:Call-Control-U 21/39 U10
+ * Q.2971:Call-Control-U 26/39 U1-U9
+ * Q.2971:Call-Control-N 22/39 N10
+ * Q.2971:Call-Control-N 27/39 N1-N9
+ */
+static void
+unx_drop_party_ack_request(struct call *c, struct uni_msg *msg,
+ uint32_t cookie)
+{
+ struct uniapi_drop_party_ack_request *ack =
+ uni_msg_rptr(msg, struct uniapi_drop_party_ack_request *);
+ struct party *p;
+
+ if (!IE_ISGOOD(ack->ack.epref)) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_IE, cookie);
+ return;
+ }
+ if ((p = uni_find_partyx(c, ack->ack.epref.epref, !ack->ack.epref.flag)) == NULL) {
+ uni_msg_destroy(msg);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_PARTY, cookie);
+ return;
+ }
+
+ uni_enq_party(p, SIGP_DROP_PARTY_ACK_request, cookie, msg, NULL);
+}
+
+/*
+ * ADD PARTY in U7/U8/U10
+ *
+ * Q.2971:Call-Control-U 14/39 U7
+ * Q.2971:Call-Control-U 15/39 U8
+ * Q.2971:Call-Control-U 21/39 U10
+ * Q.2971:Call-Control-N 8/39 N4
+ * Q.2971:Call-Control-N 21/39 N10
+ *
+ * Body already decoded
+ * XXX check EPREF flag
+ */
+static void
+unx_add_party(struct call *c, struct uni_msg *m, struct uni_all *u,
+ int legal)
+{
+ struct uni_all *resp;
+ struct uni_ierr *e1;
+ struct party *p = NULL;
+ enum verify vfy;
+
+ uni_mandate_epref(c->uni, &u->u.add_party.epref);
+ MANDATE_IE(c->uni, u->u.add_party.called, UNI_IE_CALLED);
+
+ /*
+ * Do part of the verify handish: according to 9.5.7.2 we must send
+ * an ADD_PARTY_REJ if mandatory IEs are bad or missing instead of
+ * clearing the call. But we must send a STATUS, if it is the EPREF!
+ */
+ if (IE_ISGOOD(u->u.add_party.epref)) {
+ c->uni->cause.u.ie.len = 0;
+ FOREACH_ERR(e1, c->uni) {
+ if (e1->err == UNI_IERR_MIS) {
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_MANDAT);
+ goto rej;
+ }
+ }
+ FOREACH_ERR(e1, c->uni) {
+ if (e1->man && e1->ie != UNI_IE_EPREF &&
+ e1->act == UNI_IEACT_DEFAULT) {
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_IE_INV);
+ rej:
+ uni_vfy_collect_ies(c->uni);
+ if ((resp = UNI_ALLOC()) != NULL) {
+ MK_MSG_RESP(resp, UNI_ADD_PARTY_REJ,
+ &u->u.hdr.cref);
+ MK_IE_EPREF(resp->u.add_party_rej.epref,
+ u->u.add_party.epref.epref,
+ !u->u.add_party.epref.flag);
+ resp->u.add_party_rej.cause =
+ c->uni->cause;
+
+ unx_send_add_party_rej(c, resp);
+ }
+ goto ignore;
+ }
+ }
+ p = uni_find_partyx(c, u->u.add_party.epref.epref,
+ u->u.add_party.epref.flag);
+ }
+
+ vfy = uni_verify(c->uni, u->u.hdr.act);
+
+ switch (vfy) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ goto ignore;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), &u->u.add_party.epref,
+ p ? p->state : UNI_EPSTATE_NULL);
+ /* FALLTHRU */
+ case VFY_I:
+ goto ignore;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), &u->u.add_party.epref,
+ UNI_EPSTATE_ADD_RCVD);
+ case VFY_OK:
+ /* FALLTHRU */
+ break;
+ }
+ if (!legal) {
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.add_party.epref, -1);
+ return;
+ }
+
+ if (IE_ISGOOD(u->u.add_party.epref) && p == NULL &&
+ u->u.add_party.epref.flag) {
+ IE_SETERROR(u->u.add_party.epref);
+ UNI_SAVE_IERR(&c->uni->cx, UNI_IE_EPREF,
+ u->u.add_party.epref.h.act, UNI_IERR_BAD);
+ }
+
+ if (!IE_ISGOOD(u->u.add_party.epref)) {
+ /* 9.5.3.2.2 */
+ if (vfy == VFY_OK) {
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_IE_INV);
+
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), NULL, 0);
+ }
+ goto ignore;
+ }
+
+
+ if (p == NULL && (p = uni_create_party(c, &u->u.add_party.epref))
+ == NULL)
+ goto ignore;
+
+ uni_enq_party(p, SIGP_ADD_PARTY, 0, m, u);
+ return;
+
+ ignore:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * ADD PARTY ACKNOWLEDGE
+ *
+ * Q.2971:Call-Control-U 21/39 U10
+ * Q.2971:Call-Control-N 15/39 N8
+ * Q.2971:Call-Control-N 22/39 N10
+ */
+static void
+un10n8_add_party_ack(struct call *c, struct uni_msg *m, struct uni_all *u,
+ int legal)
+{
+ struct party *p = NULL;
+
+ if (IE_ISGOOD(u->u.add_party_ack.epref)) {
+ if (u->u.add_party_ack.epref.flag == 0) {
+ IE_SETERROR(u->u.add_party_ack.epref);
+ UNI_SAVE_IERR(&c->uni->cx, UNI_IE_EPREF,
+ u->u.add_party_ack.epref.h.act, UNI_IERR_BAD);
+ } else {
+ p = uni_find_partyx(c, u->u.add_party_ack.epref.epref, 1);
+ if (p == NULL) {
+ respond_drop_party_ack(c,
+ &u->u.add_party_ack.epref,
+ UNI_CAUSE_ENDP_INV);
+ goto ignore;
+ }
+ }
+ }
+ uni_mandate_epref(c->uni, &u->u.add_party_ack.epref);
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ goto ignore;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ report:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), &u->u.add_party_ack.epref,
+ p ? p->state : UNI_EPSTATE_NULL);
+ case VFY_I:
+ goto ignore;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), &u->u.add_party_ack.epref,
+ p ? UNI_EPSTATE_ACTIVE : UNI_EPSTATE_NULL);
+ if (!IE_ISGOOD(u->u.party_alerting.epref))
+ /* See below */
+ goto ignore;
+ break;
+ case VFY_OK:
+ if (!IE_ISGOOD(u->u.party_alerting.epref))
+ /* this happens when the EPREF has bad format.
+ * The rules require us the message to be ignored
+ * (9.5.3.2.2e) and to report status.
+ */
+ goto report;
+ break;
+ }
+ if (legal) {
+ /* p is != NULL here */
+ uni_enq_party(p, SIGP_ADD_PARTY_ACK, 0, m, u);
+ return;
+ }
+ if (p == NULL)
+ /* Q.2971 9.5.3.2.3a) */
+ respond_drop_party_ack(c, &u->u.add_party_ack.epref,
+ UNI_CAUSE_ENDP_INV);
+ else
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.add_party_ack.epref, p->state);
+
+ ignore:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * Make the EPREF action default
+ */
+static void
+default_act_epref(struct uni *uni, struct uni_ie_epref *epref)
+{
+ struct uni_ierr *e;
+
+ FOREACH_ERR(e, uni)
+ if (e->ie == UNI_IE_EPREF) {
+ e->act = UNI_IEACT_DEFAULT;
+ break;
+ }
+ epref->h.act = UNI_IEACT_DEFAULT;
+}
+
+/*
+ * PARTY ALERTING message
+ *
+ * Q.2971:Call-Control-U 9/39 U4
+ * Q.2971:Call-Control-U 21/39 U10
+ * Q.2971:Call-Control-N 12/39 N7
+ * Q.2971:Call-Control-N 15/39 N8
+ * Q.2971:Call-Control-N 22/39 N10
+ */
+static void
+unx_party_alerting(struct call *c, struct uni_msg *m, struct uni_all *u,
+ int legal)
+{
+ struct party *p = NULL;
+
+ if (IE_ISGOOD(u->u.party_alerting.epref)) {
+ if (u->u.party_alerting.epref.flag == 0) {
+ IE_SETERROR(u->u.party_alerting.epref);
+ UNI_SAVE_IERR(&c->uni->cx, UNI_IE_EPREF,
+ u->u.party_alerting.epref.h.act, UNI_IERR_BAD);
+ } else {
+ p = uni_find_partyx(c, u->u.party_alerting.epref.epref, 1);
+ if (p == NULL) {
+ respond_drop_party_ack(c,
+ &u->u.party_alerting.epref,
+ UNI_CAUSE_ENDP_INV);
+ goto ignore;
+ }
+ }
+ }
+ uni_mandate_epref(c->uni, &u->u.party_alerting.epref);
+
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ goto ignore;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ report:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), &u->u.party_alerting.epref,
+ p ? p->state : UNI_EPSTATE_NULL);
+ case VFY_I:
+ goto ignore;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate), &u->u.party_alerting.epref,
+ p ? UNI_EPSTATE_ALERT_RCVD : UNI_EPSTATE_NULL);
+ if (!IE_ISGOOD(u->u.party_alerting.epref))
+ /* See below */
+ goto ignore;
+ break;
+
+ case VFY_OK:
+ if (!IE_ISGOOD(u->u.party_alerting.epref))
+ /* The rules require us the message to be ignored
+ * (9.5.3.2.2e) and to report status.
+ */
+ goto report;
+ break;
+ }
+ if (legal) {
+ /* p is != NULL here */
+ uni_enq_party(p, SIGP_PARTY_ALERTING, 0, m, u);
+ return;
+ }
+ if (p == NULL)
+ /* Q.2971 9.5.3.2.3a) */
+ respond_drop_party_ack(c, &u->u.party_alerting.epref,
+ UNI_CAUSE_ENDP_INV);
+ else
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.party_alerting.epref, p->state);
+
+ ignore:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * Handle a bad/missing cause in a DROP_PARTY_ACK or ADD_PARTY_REJ
+ *
+ * If the IE is missing or bad and the action is defaulted handle as
+ * cause #1 according to 9.5.7.1/2.
+ * Otherwise keep the IE.
+ */
+static void
+handle_bad_drop_cause(struct call *c, struct uni_ie_cause *cause, int mkcause)
+{
+
+ if (IE_ISGOOD(*cause))
+ return;
+
+ if (!IE_ISPRESENT(*cause)) {
+ /* 9.5.7.1 */
+ /* cannot make cause here because we need the 96 error */
+ uni_vfy_remove_cause(c->uni);
+ return;
+ }
+ if (cause->h.act != UNI_IEACT_DEFAULT)
+ return;
+
+ /* 9.5.7.2 */
+ uni_vfy_remove_cause(c->uni);
+ if (mkcause)
+ MK_IE_CAUSE(*cause, UNI_CAUSE_LOC_USER, UNI_CAUSE_UNSPEC);
+}
+
+/*
+ * ADD PARTY REJ from party control
+ * Q.2971:Call-Control-U 21/39
+ * Q.2971:Call-Control-U 24/39
+ */
+static void
+unx_send_add_party_rej(struct call *c, struct uni_all *u)
+{
+
+ if (uni_party_act_count(c, 2) == 0) {
+ if (c->cstate != CALLST_U11 && c->cstate != CALLST_N12) {
+ c->uni->cause = u->u.add_party_rej.cause;
+ clear_callD(c);
+ }
+ } else
+ (void)uni_send_output(u, c->uni);
+ UNI_FREE(u);
+}
+
+/*
+ * ADD_PARTY_REJECT in U4/U10
+ *
+ * Q.2971:Call-Control-U 9/39 U4
+ * Q.2971:Call-Control-U 21/39 U10
+ * Q.2971:Call-Control-N 12/39 N7
+ * Q.2971:Call-Control-N 15/39 N8
+ * Q.2971:Call-Control-N 22/39 N10
+ */
+static void
+unx_add_party_rej(struct call *c, struct uni_msg *m, struct uni_all *u,
+ int legal)
+{
+ struct uni_add_party_rej *ar = &u->u.add_party_rej;
+ struct party *p;
+
+ if (IE_ISGOOD(ar->epref)) {
+ p = uni_find_partyx(c, ar->epref.epref, ar->epref.flag);
+ if (p == NULL)
+ goto ignore;
+
+ if (legal) {
+ handle_bad_drop_cause(c, &ar->cause, 0);
+ uni_vfy_remove_unknown(c->uni);
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ goto clear;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ uni_respond_status_verify(c->uni,
+ &u->u.hdr.cref, map_callstate(c->cstate),
+ &ar->epref, p->state);
+ case VFY_I:
+ goto ignore;
+
+ case VFY_RAPU:
+ uni_vfy_collect_ies(c->uni);
+ break;
+
+ case VFY_RAP:
+ uni_respond_status_verify(c->uni,
+ &u->u.hdr.cref, map_callstate(c->cstate),
+ &ar->epref, p->state);
+ case VFY_OK:
+ break;
+ }
+ uni_enq_party(p, SIGP_ADD_PARTY_REJ, 0, m, u);
+ return;
+ }
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &ar->epref, -1);
+ return;
+ }
+
+ /* Q.2971: 9.5.3.2.1 last paragraph
+ * 9.5.3.2.2 second to last paragraph
+ * Make the action indicator default.
+ */
+ default_act_epref(c->uni, &ar->epref);
+ if (!IE_ISPRESENT(ar->epref))
+ uni_mandate_ie(c->uni, UNI_IE_EPREF);
+ (void)uni_verify(c->uni, u->u.hdr.act);
+
+ clear:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+
+ ignore:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * DROP_PARTY
+ *
+ * Q.2971:Call-Control-U 26/39 Ux
+ * Q.2971:Call-Control-U 21/39 U10
+ * Q.2971:Call-Control-N 27/39 Nx
+ * Q.2971:Call-Control-N 22/39 N10
+ */
+static void
+unx_drop_party(struct call *c, struct uni_msg *m, struct uni_all *u, int legal)
+{
+ struct uni_drop_party *dp = &u->u.drop_party;
+ struct party *p;
+ struct uni_ierr *e;
+
+ if (IE_ISGOOD(dp->epref)) {
+ p = uni_find_partyx(c, dp->epref.epref, dp->epref.flag);
+ if (p == NULL) {
+ respond_drop_party_ack(c, &dp->epref,
+ UNI_CAUSE_ENDP_INV);
+ goto ignore;
+ }
+ handle_bad_drop_cause(c, &dp->cause, 0);
+ uni_vfy_remove_unknown(c->uni);
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ goto clear;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate),
+ &u->u.drop_party.epref, p->state);
+ case VFY_I:
+ goto ignore;
+
+ case VFY_RAPU:
+ uni_vfy_collect_ies(c->uni);
+ break;
+
+ case VFY_RAP:
+ uni_respond_status_verify(c->uni, &u->u.hdr.cref,
+ map_callstate(c->cstate),
+ &dp->epref, UNI_EPSTATE_DROP_RCVD);
+ case VFY_OK:
+ break;
+ }
+ if (legal) {
+ uni_enq_party(p, SIGP_DROP_PARTY, 0, m, u);
+ return;
+ }
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP, &dp->epref, -1);
+ goto ignore;
+ }
+
+ /* Q.2971: 9.5.3.2.1 last paragraph
+ * 9.5.3.2.2 second to last paragraph
+ * Make the action indicator default.
+ */
+ FOREACH_ERR(e, c->uni)
+ if (e->ie == UNI_IE_EPREF) {
+ e->act = UNI_IEACT_DEFAULT;
+ break;
+ }
+ dp->epref.h.act = UNI_IEACT_DEFAULT;
+
+ if (!IE_ISPRESENT(dp->epref))
+ uni_mandate_ie(c->uni, UNI_IE_EPREF);
+ (void)uni_verify(c->uni, u->u.hdr.act);
+
+ clear:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+
+ ignore:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * DROP_PARTY_ACK
+ *
+ * Q.2971:Call-Control-U 26/39 Ux
+ * Q.2971:Call-Control-U 21/39 U10
+ * Q.2971:Call-Control-N 27/39 Nx
+ * Q.2971:Call-Control-N 22/39 N10
+ */
+static void
+unx_drop_party_ack(struct call *c, struct uni_msg *m, struct uni_all *u,
+ int legal)
+{
+ struct party *p;
+ struct uni_drop_party_ack *ack = &u->u.drop_party_ack;
+
+ if (IE_ISGOOD(u->u.drop_party_ack.epref)) {
+ p = uni_find_partyx(c, ack->epref.epref, ack->epref.flag);
+ if (p != NULL) {
+ handle_bad_drop_cause(c, &ack->cause, 1);
+ uni_vfy_remove_unknown(c->uni);
+ switch (uni_verify(c->uni, u->u.hdr.act)) {
+
+ case VFY_CLR:
+ goto clear;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ uni_respond_status_verify(c->uni,
+ &u->u.hdr.cref, map_callstate(c->cstate),
+ &ack->epref, p->state);
+ case VFY_I:
+ goto ignore;
+
+ case VFY_RAP:
+ uni_respond_status_verify(c->uni,
+ &u->u.hdr.cref, map_callstate(c->cstate),
+ &ack->epref, UNI_EPSTATE_NULL);
+ case VFY_RAPU:
+ case VFY_OK:
+ break;
+ }
+ if (legal) {
+ uni_enq_party(p, SIGP_DROP_PARTY_ACK, 0, m, u);
+ return;
+ }
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &ack->epref, -1);
+ }
+ goto ignore;
+ }
+
+ /* Q.2971: 9.5.3.2.1 last paragraph
+ * 9.5.3.2.2 second to last paragraph
+ */
+ (void)uni_verify(c->uni, u->u.hdr.act);
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER, UNI_CAUSE_IE_INV);
+
+ clear:
+ uni_vfy_collect_ies(c->uni);
+ clear_callD(c);
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+
+ ignore:
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/**********************************************************************/
+
+/*
+ * Bad or unrecognized message.
+ *
+ * Q.2971:Call-Control-U 35/39
+ */
+void
+uni_bad_message(struct call *c, struct uni_all *u, u_int cause,
+ struct uni_ie_epref *epref, int ps)
+{
+ struct uni_all *resp;
+ struct party *p;
+
+ if ((u->u.hdr.act == UNI_MSGACT_CLEAR &&
+ (c->cstate == CALLST_U11 ||
+ c->cstate == CALLST_U12 ||
+ c->cstate == CALLST_N11 ||
+ c->cstate == CALLST_N12)) ||
+ u->u.hdr.act == UNI_MSGACT_IGNORE)
+ return;
+
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER, cause);
+ ADD_CAUSE_MTYPE(c->uni->cause, u->mtype);
+
+ if (u->u.hdr.act == UNI_MSGACT_CLEAR) {
+ clear_callD(c);
+ return;
+ }
+
+ /*
+ * Send STATUS
+ */
+ if ((resp = UNI_ALLOC()) != NULL) {
+ MK_MSG_RESP(resp, UNI_STATUS, &u->u.hdr.cref);
+ MK_IE_CALLSTATE(resp->u.status.callstate,
+ map_callstate(c->cstate));
+ resp->u.status.cause = c->uni->cause;
+
+ if (epref != NULL && IE_ISGOOD(*epref)) {
+ MK_IE_EPREF(resp->u.status.epref, epref->epref, !epref->flag);
+ if (ps == -1) {
+ p = uni_find_party(c, epref);
+ if (p == NULL)
+ ps = UNI_EPSTATE_NULL;
+ else
+ ps = p->state;
+ }
+ MK_IE_EPSTATE(resp->u.status.epstate, ps);
+ }
+ (void)uni_send_output(resp, c->uni);
+
+ UNI_FREE(resp);
+ }
+}
+
+/**********************************************************************/
+
+/*
+ * Unknown message in any state.
+ *
+ * Q.2971:Call-Control 35/39
+ * Q.2971:Call-Control 36/39
+ */
+static void
+unx_unknown(struct call *c, struct uni_msg *m, struct uni_all *u)
+{
+ /*
+ * Unrecognized message. Cannot call verify here, because
+ * it doesn't know about unrecognized messages.
+ */
+ if (u->u.hdr.act == UNI_MSGACT_CLEAR) {
+ MK_IE_CAUSE(c->uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_MTYPE_NIMPL);
+ ADD_CAUSE_MTYPE(c->uni->cause, u->mtype);
+ clear_callD(c);
+ } else if(u->u.hdr.act == UNI_MSGACT_IGNORE) {
+ ;
+ } else {
+ (void)uni_decode_body(m, u, &c->uni->cx);
+ uni_bad_message(c, u, UNI_CAUSE_MTYPE_NIMPL,
+ &u->u.unknown.epref, -1);
+ }
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+/**********************************************************************/
+
+void
+uni_sig_call(struct call *c, enum call_sig sig, uint32_t cookie,
+ struct uni_msg *msg, struct uni_all *u)
+{
+ if (sig >= SIGC_END) {
+ VERBOSE(c->uni, UNI_FAC_ERR, 1,
+ "Signal %d outside of range to Call-Control", sig);
+ if (msg)
+ uni_msg_destroy(msg);
+ if (u)
+ UNI_FREE(u);
+ return;
+ }
+
+ VERBOSE(c->uni, UNI_FAC_CALL, 1, "Signal %s in state %s of call %u/%s"
+ "; cookie %u", call_sigs[sig], callstates[c->cstate].name, c->cref,
+ c->mine ? "mine" : "his", cookie);
+
+ switch (sig) {
+
+ case SIGC_LINK_RELEASE_indication:
+ if (c->cstate == CALLST_U10 || c->cstate == CALLST_N10)
+ /* Q.2971:Call-Control-U 36/39 */
+ /* Q.2971:Call-Control-N 20/39 */
+ un10_link_release_indication(c);
+ else
+ /* Q.2971:Call-Control-U 36/39 */
+ /* Q.2971:Call-Control-N 37/39 */
+ unx_link_release_indication(c);
+ break;
+
+ case SIGC_LINK_ESTABLISH_ERROR_indication:
+ if (c->cstate != CALLST_U10 && c->cstate != CALLST_N10) {
+ VERBOSE(c->uni, UNI_FAC_ERR, 1,
+ "link-establish-error.indication in cs=%s",
+ callstates[c->cstate].name);
+ break;
+ }
+ /* Q.2971:Call-Control-U 19/39 */
+ /* Q.2971:Call-Control-N 20/39 */
+ un10_link_establish_error_indication(c);
+ break;
+
+ case SIGC_LINK_ESTABLISH_indication:
+ switch (c->cstate) {
+
+ case CALLST_U1: case CALLST_N1:
+ case CALLST_U3: case CALLST_N3:
+ case CALLST_U4: case CALLST_N4:
+ case CALLST_U6: case CALLST_N6:
+ case CALLST_U7: case CALLST_N7:
+ case CALLST_U8: case CALLST_N8:
+ case CALLST_U9: case CALLST_N9:
+ /* Q.2971:Call-Control-U 36/39 */
+ /* Q.2971:Call-Control-N 37/39 */
+ unx_link_establish_indication(c);
+ break;
+
+ case CALLST_U10: case CALLST_N10:
+ /* Q.2971:Call-Control-U 19/39 */
+ /* Q.2971:Call-Control-N 20/39 */
+ un10_link_establish_indication(c);
+ break;
+
+ case CALLST_U11: case CALLST_N11:
+ case CALLST_U12: case CALLST_N12:
+ /* Q.2971:Call-Control-U 36/39 */
+ /* Q.2971:Call-Control-N 37/39 */
+ break;
+
+ default:
+ VERBOSE(c->uni, UNI_FAC_ERR, 1,
+ "link-establish.indication in cs=%s",
+ callstates[c->cstate].name);
+ }
+ break;
+
+ case SIGC_LINK_ESTABLISH_confirm:
+ if (c->cstate != CALLST_U10 && c->cstate != CALLST_N10) {
+ VERBOSE(c->uni, UNI_FAC_ERR, 1,
+ "link-establish.confirm in cs=%s",
+ callstates[c->cstate].name);
+ break;
+ }
+ /* Q.2971:Call-Control-U 19/39 */
+ /* Q.2971:Call-Control-N 20/39 */
+ un10_link_establish_confirm(c);
+ break;
+
+ case SIGC_UNKNOWN:
+ /* Q.2971:Call-Control 35/39 */
+ /* Q.2971:Call-Control 36/39 */
+ unx_unknown(c, msg, u);
+ break;
+
+ case SIGC_SETUP:
+ if (c->cstate != CALLST_NULL) {
+ (void)uni_decode_body(msg, u, &c->uni->cx);
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.setup.epref, -1);
+ goto drop;
+ }
+ if (c->uni->proto == UNIPROTO_UNI40N)
+ /* Q.2971:Call-Control-N 4/39 */
+ un0_setup(c, msg, u, CALLST_N1);
+ else
+ /* Q.2971:Call-Control-U 4/39 */
+ un0_setup(c, msg, u, CALLST_U6);
+ break;
+
+ case SIGC_CALL_PROC:
+ if (c->cstate == CALLST_U1) {
+ /* Q.2971:Call-Control-U 6/39 */
+ u1n6_call_proc(c, msg, u, CALLST_U3);
+ break;
+ }
+ if (c->cstate == CALLST_N6) {
+ /* Q.2971:Call-Control-N 11/39 */
+ u1n6_call_proc(c, msg, u, CALLST_N9);
+ break;
+ }
+ (void)uni_decode_body(msg, u, &c->uni->cx);
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.call_proc.epref, -1);
+ goto drop;
+
+ case SIGC_ALERTING:
+ if (c->cstate == CALLST_U1 || c->cstate == CALLST_U3) {
+ /* Q.2971:Call-Control-U 37/39 (U1) */
+ /* Q.2971:Call-Control-U 7/39 (U3) */
+ unx_alerting(c, msg, u, CALLST_U4);
+ break;
+ }
+ if (c->cstate == CALLST_N6) {
+ /* Q.2971:Call-Control-N 9/39 (N6) */
+ /* Q.2971:Call-Control-N 17/39 (N9) */
+ unx_alerting(c, msg, u, CALLST_N7);
+ break;
+ }
+ (void)uni_decode_body(msg, u, &c->uni->cx);
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.alerting.epref, -1);
+ goto drop;
+
+ case SIGC_CONNECT:
+ if (c->cstate == CALLST_U1 || c->cstate == CALLST_U3 ||
+ c->cstate == CALLST_U4) {
+ /* Q.2971:Call-Control-U 7-8/39 (U3) */
+ /* Q.2971:Call-Control-U 11/39 (U4) */
+ /* Q.2971:Call-Control-U 37/39 (U1) */
+ unx_connect(c, msg, u, CALLST_U10);
+ break;
+ }
+ if (c->cstate == CALLST_N6 || c->cstate == CALLST_N7 ||
+ c->cstate == CALLST_N9) {
+ /* Q.2971:Call-Control-N 9-10/39 (N6) */
+ /* Q.2971:Call-Control-N 14/39 (N7) */
+ /* Q.2971:Call-Control-N 17/39 (N9) */
+ unx_connect(c, msg, u, CALLST_N8);
+ break;
+ }
+ (void)uni_decode_body(msg, u, &c->uni->cx);
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.connect.epref, -1);
+ goto drop;
+
+ case SIGC_CONNECT_ACK:
+ if (c->cstate == CALLST_U8) {
+ /* Q.2971:Call-Control-U 15-16/39 */
+ u8_connect_ack(c, msg, u, CALLST_U10);
+ break;
+ }
+ if (c->cstate == CALLST_N10) {
+ /* Q.2971:Call-Control-N 18/39 */
+ n10_connect_ack(c, msg, u);
+ break;
+ }
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP, NULL, 0);
+ goto drop;
+
+ case SIGC_RELEASE:
+ switch (c->cstate) {
+
+ default:
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP, NULL, 0);
+ goto drop;
+
+ case CALLST_U11:
+ case CALLST_N12:
+ /* Q.2971:Call-Control-U 28/39 */
+ /* Q.2971:Call-Control-N 30/39 */
+ u11n12_release(c, msg, u);
+ break;
+
+ case CALLST_U1:
+ case CALLST_U3:
+ case CALLST_U4:
+ case CALLST_U6:
+ case CALLST_U7:
+ case CALLST_U8:
+ case CALLST_U9:
+ case CALLST_U10:
+ case CALLST_U12:
+ /* Q.2971:Call-Control-U 25/39 */
+ unx_release(c, msg, u, CALLST_U12);
+ break;
+
+ case CALLST_N1:
+ case CALLST_N3:
+ case CALLST_N4:
+ case CALLST_N6:
+ case CALLST_N7:
+ case CALLST_N8:
+ case CALLST_N9:
+ case CALLST_N10:
+ case CALLST_N11:
+ /* Q.2971:Call-Control-N 26/39 */
+ unx_release(c, msg, u, CALLST_N11);
+ break;
+ }
+ break;
+
+ case SIGC_RELEASE_COMPL:
+ /* Q.2971:Call-Control-U 25/39 */
+ /* Q.2971:Call-Control-N 26/39 */
+ unx_release_compl(c, msg, u);
+ break;
+
+ case SIGC_NOTIFY:
+ /* Q.2971:Call-Control-U 18/39 */
+ /* Q.2971:Call-Control-N 19/39 */
+ unx_notify(c, msg, u);
+ break;
+
+ case SIGC_STATUS:
+ if (c->cstate == CALLST_U11 || c->cstate == CALLST_U12 ||
+ c->cstate == CALLST_N11 || c->cstate == CALLST_N12) {
+ /* Q.2971:Call-Control-U 29/39 (U11) */
+ /* Q.2971:Call-Control-U 30/39 (U12) */
+ /* Q.2971:Call-Control-N 29/39 (N11) */
+ /* Q.2971:Call-Control-N 31/39 (N12) */
+ un11un12_status(c, msg, u);
+ break;
+ }
+ /* Q.2971:Call-Control-U 32/39 */
+ /* Q.2971:Call-Control-N 33/39 */
+ unx_status(c, msg, u);
+ break;
+
+ case SIGC_STATUS_ENQ:
+ /* Q.2971:Call-Control-U 31/39 */
+ /* Q.2971:Call-Control-N 32/39 */
+ unx_status_enq(c, msg, u);
+ break;
+
+ case SIGC_ADD_PARTY:
+ (void)uni_decode_body(msg, u, &c->uni->cx);
+
+ if (c->type != CALL_LEAF && c->type != CALL_ROOT) {
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.add_party.epref, UNI_EPSTATE_NULL);
+ goto drop;
+ }
+ switch (c->cstate) {
+ case CALLST_U7:
+ case CALLST_U8:
+ case CALLST_U10:
+ case CALLST_N4:
+ case CALLST_N10:
+ /* Q.2971:Call-Control-U 14/39 U7 */
+ /* Q.2971:Call-Control-U 15/39 U8 */
+ /* Q.2971:Call-Control-U 21/39 U10 */
+ /* Q.2971:Call-Control-N 8/39 N4 */
+ /* Q.2971:Call-Control-N 21/39 N10 */
+ unx_add_party(c, msg, u, 1);
+ break;
+
+ default:
+ unx_add_party(c, msg, u, 0);
+ goto drop;
+ }
+ break;
+
+ case SIGC_PARTY_ALERTING:
+ (void)uni_decode_body(msg, u, &c->uni->cx);
+
+ if (c->type != CALL_ROOT) {
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.party_alerting.epref, -1);
+ goto drop;
+ }
+ switch (c->cstate) {
+
+ default:
+ /* Q.2971 9.5.3.2.3a) */
+ unx_party_alerting(c, msg, u, 0);
+ break;
+
+ case CALLST_U4:
+ case CALLST_U10:
+ /* Q.2971:Call-Control-U 9/39 U4 */
+ /* Q.2971:Call-Control-U 21/39 U10 */
+ /* Q.2971:Call-Control-N 12/39 N7 */
+ /* Q.2971:Call-Control-N 15/39 N8 */
+ /* Q.2971:Call-Control-N 22/39 N10 */
+ unx_party_alerting(c, msg, u, 1);
+ break;
+ }
+ break;
+
+ case SIGC_ADD_PARTY_ACK:
+ (void)uni_decode_body(msg, u, &c->uni->cx);
+
+ if (c->type != CALL_ROOT) {
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.add_party_rej.epref, -1);
+ goto drop;
+ }
+ switch (c->cstate) {
+
+ case CALLST_U10:
+ /* Q.2971:Call-Control-U 21/39 U10 */
+ /* Q.2971:Call-Control-N 15/39 N8 */
+ /* Q.2971:Call-Control-N 22/39 N10 */
+ un10n8_add_party_ack(c, msg, u, 1);
+ break;
+
+ default:
+ /* Q.2971 9.5.3.2.3a) */
+ un10n8_add_party_ack(c, msg, u, 0);
+ break;
+ }
+ break;
+
+ case SIGC_ADD_PARTY_REJ:
+ (void)uni_decode_body(msg, u, &c->uni->cx);
+
+ if (c->type != CALL_ROOT) {
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.add_party_rej.epref, -1);
+ goto drop;
+ }
+ switch (c->cstate) {
+
+ case CALLST_U4:
+ case CALLST_U10:
+ case CALLST_N7:
+ case CALLST_N8:
+ case CALLST_N10:
+ /* Q.2971:Call-Control-U 9/39 U4 */
+ /* Q.2971:Call-Control-U 21/39 U10 */
+ /* Q.2971:Call-Control-N 12/39 N7 */
+ /* Q.2971:Call-Control-N 15/39 N8 */
+ /* Q.2971:Call-Control-N 22/39 N10 */
+ unx_add_party_rej(c, msg, u, 1);
+ break;
+
+ default:
+ /* Q.2971: 9.5.3.2.3b */
+ unx_add_party_rej(c, msg, u, 0);
+ break;
+ }
+ break;
+
+ case SIGC_DROP_PARTY:
+ (void)uni_decode_body(msg, u, &c->uni->cx);
+
+ if (c->type != CALL_ROOT && c->type != CALL_LEAF) {
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.drop_party.epref, -1);
+ goto drop;
+ }
+ switch (c->cstate) {
+ case CALLST_U11:
+ case CALLST_U12:
+ case CALLST_N11:
+ case CALLST_N12:
+ /* Q.2971:Call-Control-U 28/39 U11 */
+ /* Q.2971:Call-Control-U 30/39 U12 */
+ /* Q.2971:Call-Control-N 29/39 N11 */
+ /* Q.2971:Call-Control-N 30/39 N12 */
+ goto drop;
+
+ case CALLST_NULL:
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.drop_party.epref, UNI_EPSTATE_NULL);
+ goto drop;
+
+ case CALLST_U3:
+ case CALLST_N3:
+ /* L3MU_17_38 */
+ unx_drop_party(c, msg, u, 0);
+ break;
+
+ case CALLST_U8:
+ if (c->uni->sb_tb) {
+ /* L3MU_06_0[3-6] */
+ unx_drop_party(c, msg, u, 0);
+ break;
+ }
+ /* FALLTHRU */
+
+ default:
+ /* Q.2971:Call-Control-U 26/39 Ux */
+ /* Q.2971:Call-Control-U 21/39 U10 */
+ /* Q.2971:Call-Control-N 27/39 Nx */
+ /* Q.2971:Call-Control-N 21/39 N10 */
+ unx_drop_party(c, msg, u, 1);
+ break;
+ }
+ break;
+
+ case SIGC_DROP_PARTY_ACK:
+ (void)uni_decode_body(msg, u, &c->uni->cx);
+
+ if (c->type != CALL_ROOT && c->type != CALL_LEAF) {
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.drop_party_ack.epref, -1);
+ goto drop;
+ }
+ switch (c->cstate) {
+
+ case CALLST_U11:
+ case CALLST_U12:
+ /* Q.2971:Call-Control-U 28/39 U11 */
+ /* Q.2971:Call-Control-U 30/39 U12 */
+ /* Q.2971:Call-Control-N 29/39 N11 */
+ /* Q.2971:Call-Control-N 30/39 N12 */
+ goto drop;
+
+ case CALLST_NULL:
+ uni_bad_message(c, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.drop_party.epref, UNI_EPSTATE_NULL);
+ goto drop;
+
+ case CALLST_U4:
+ case CALLST_N4:
+ case CALLST_U7:
+ case CALLST_N7:
+ case CALLST_U8:
+ case CALLST_N8:
+ case CALLST_U10:
+ case CALLST_N10:
+ /* Q.2971:Call-Control-U 26/39 Ux */
+ /* Q.2971:Call-Control-U 21/39 U10 */
+ /* Q.2971:Call-Control-N 27/39 Nx */
+ /* Q.2971:Call-Control-N 22/39 N10 */
+ unx_drop_party_ack(c, msg, u, 1);
+ break;
+
+ default:
+ /* Q.2971 10.5 4th paragraph */
+ unx_drop_party_ack(c, msg, u, 0);
+ break;
+ }
+ break;
+
+ case SIGC_COBISETUP: /* XXX */
+ unx_unknown(c, msg, u);
+ break;
+
+ /*
+ * User signals
+ */
+ case SIGC_SETUP_request:
+ if (c->cstate == CALLST_NULL) {
+ /* Q.2971:Call-Control-U 4/39 (U0) */
+ /* Q.2971:Call-Control-N 4/39 (N0) */
+ if (c->uni->proto == UNIPROTO_UNI40N)
+ un0_setup_request(c, msg, cookie, CALLST_N6);
+ else
+ un0_setup_request(c, msg, cookie, CALLST_U1);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "setup.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_SETUP_response:
+ if (c->cstate == CALLST_U6 || c->cstate == CALLST_U9 ||
+ c->cstate == CALLST_U7) {
+ /* Q.2971:Call-Control-U 13/39 (U6) */
+ /* Q.2971:Call-Control-U 14/39 (U7) */
+ /* Q.2971:Call-Control-U 17/39 (U9) */
+ unx_setup_response(c, msg, cookie, CALLST_U8);
+ break;
+ }
+ if (c->cstate == CALLST_N1 || c->cstate == CALLST_N3 ||
+ c->cstate == CALLST_N4) {
+ /* Q.2971:Call-Control-N 39/39 (N1) */
+ /* Q.2971:Call-Control-N 7/39 (N3) */
+ /* Q.2971:Call-Control-N 8/39 (N4) */
+ unx_setup_response(c, msg, cookie, CALLST_N10);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "setup.response in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_SETUP_COMPLETE_request:
+ if (c->cstate == CALLST_N8) {
+ /* Q.2971:Call-Control-N 15/39 (N8) */
+ n8_setup_compl_request(c, msg, cookie, CALLST_N10);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "setup_compl.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_PROCEEDING_request:
+ if (c->cstate == CALLST_U6) {
+ /* Q.2971:Call-Control-U 12/39 (U6) */
+ u6n1_proceeding_request(c, msg, cookie, CALLST_U9);
+ break;
+ }
+ if (c->cstate == CALLST_N1) {
+ /* Q.2971:Call-Control-N 6/39 (N1) */
+ u6n1_proceeding_request(c, msg, cookie, CALLST_N3);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "proceeding.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_ALERTING_request:
+ if (c->cstate == CALLST_U6 || c->cstate == CALLST_U9) {
+ /* Q.2971:Call-Control-U 13/39 (U6) */
+ /* Q.2971:Call-Control-U 17/39 (U9) */
+ unx_alerting_request(c, msg, cookie, CALLST_U7);
+ break;
+ }
+ if (c->cstate == CALLST_N1 || c->cstate == CALLST_N3) {
+ /* Q.2971:Call-Control-N 38/39 (N1) */
+ /* Q.2971:Call-Control-N 7/39 (N3) */
+ unx_alerting_request(c, msg, cookie, CALLST_N4);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "alerting.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_RELEASE_request:
+ switch (c->cstate) {
+
+ case CALLST_U1:
+ case CALLST_U3:
+ case CALLST_U4:
+ case CALLST_U6:
+ case CALLST_U7:
+ case CALLST_U8:
+ case CALLST_U9:
+ case CALLST_U10:
+ /* Q.2971:Call-Control-U 27/39 */
+ unx_release_request(c, msg, cookie, CALLST_U11);
+ break;
+
+ case CALLST_N1:
+ case CALLST_N3:
+ case CALLST_N4:
+ case CALLST_N6:
+ case CALLST_N7:
+ case CALLST_N8:
+ case CALLST_N9:
+ case CALLST_N10:
+ /* Q.2971:Call-Control-N 28/39 */
+ unx_release_request(c, msg, cookie, CALLST_N12);
+ break;
+
+ case CALLST_U11:
+ case CALLST_U12:
+ case CALLST_N11:
+ case CALLST_N12:
+ case CALLST_NULL:
+ VERBOSE(c->uni, UNI_FAC_ERR, 1,
+ "release.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE,
+ cookie);
+ uni_msg_destroy(msg);
+ break;
+ }
+ break;
+
+ case SIGC_RELEASE_response:
+ if (c->cstate == CALLST_U6 || c->cstate == CALLST_U12 ||
+ c->cstate == CALLST_N1 || c->cstate == CALLST_N11) {
+ /* Q.2971:Call-Control-U 12/39 (U6) */
+ /* Q.2971:Call-Control-U 30/39 (U12) */
+ /* Q.2971:Call-Control-N 6/39 (N1) */
+ /* Q.2971:Call-Control-N 29/39 (N11) */
+ unx_release_response(c, msg, cookie);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "release.response in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_NOTIFY_request:
+ /* Q.2971:Call-Control-U 18/39 */
+ /* Q.2971:Call-Control-N 19/39 */
+ unx_notify_request(c, msg, cookie);
+ break;
+
+ case SIGC_STATUS_ENQUIRY_request:
+ /* Q.2971:Call-Control-U 31/39 */
+ /* Q.2971:Call-Control-N 32/39 */
+ unx_status_enquiry_request(c, msg, cookie);
+ break;
+
+ case SIGC_ADD_PARTY_request:
+ if (c->cstate == CALLST_U4 || c->cstate == CALLST_U10 ||
+ c->cstate == CALLST_N7 || c->cstate == CALLST_N10) {
+ /* Q.2971:Call-Control-U 9-10/39 (U4) */
+ /* Q.2971:Call-Control-U 21/39 (U10) */
+ /* Q.2971:Call-Control-N 12/39 (N7) */
+ /* Q.2971:Call-Control-N 22/39 (N10) */
+ unx_add_party_request(c, msg, cookie);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "add-party.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_PARTY_ALERTING_request:
+ if (c->cstate == CALLST_U7 || c->cstate == CALLST_U8 ||
+ c->cstate == CALLST_U10 ||
+ c->cstate == CALLST_N4 || c->cstate == CALLST_N10) {
+ /* Q.2971:Call-Control-U 14/39 U7 */
+ /* Q.2971:Call-Control-U 15/39 U8 */
+ /* Q.2971:Call-Control-U 21/39 U10 */
+ /* Q.2971:Call-Control-N 8/39 N4 */
+ /* Q.2971:Call-Control-N 22/39 N10 */
+ unx_party_alerting_request(c, msg, cookie);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1,
+ "party-alerting.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_ADD_PARTY_ACK_request:
+ if (c->cstate == CALLST_U10 || c->cstate == CALLST_N10) {
+ /* Q.2971:Call-Control-U 21/39 (U10) */
+ /* Q.2971:Call-Control-N 22/39 (N10)*/
+ un10_add_party_ack_request(c, msg, cookie);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1,
+ "add-party-ack.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_ADD_PARTY_REJ_request:
+ if (c->cstate == CALLST_U7 || c->cstate == CALLST_U8 ||
+ c->cstate == CALLST_U10 ||
+ c->cstate == CALLST_N4 || c->cstate == CALLST_N10) {
+ /* Q.2971:Call-Control-U 14/39 U7 */
+ /* Q.2971:Call-Control-U 15/39 U8 */
+ /* Q.2971:Call-Control-U 21/39 U10 */
+ /* Q.2971:Call-Control-N 8/39 N4 */
+ /* Q.2971:Call-Control-N 22/39 N10 */
+ unx_add_party_rej_request(c, msg, cookie);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1,
+ "add-party-rej.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_DROP_PARTY_request:
+ if (c->cstate != CALLST_U11 && c->cstate != CALLST_U12 &&
+ c->cstate != CALLST_N11 && c->cstate != CALLST_N12 &&
+ c->cstate != CALLST_NULL) {
+ /* Q.2971:Call-Control-U 21/39 U10 */
+ /* Q.2971:Call-Control-U 26/39 U1-U9 */
+ /* Q.2971:Call-Control-N 22/39 N10 */
+ /* Q.2971:Call-Control-N 27/39 N1-N9 */
+ unx_drop_party_request(c, msg, cookie);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "drop-party.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_DROP_PARTY_ACK_request:
+ if (c->cstate != CALLST_U11 && c->cstate != CALLST_U12 &&
+ c->cstate != CALLST_N11 && c->cstate != CALLST_N12 &&
+ c->cstate != CALLST_NULL) {
+ /* Q.2971:Call-Control-U 21/39 U10 */
+ /* Q.2971:Call-Control-U 26/39 U1-U9 */
+ /* Q.2971:Call-Control-N 22/39 N10 */
+ /* Q.2971:Call-Control-N 27/39 N1-N9 */
+ unx_drop_party_ack_request(c, msg, cookie);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1,
+ "drop-party-ack.request in cs=%s",
+ callstates[c->cstate].name);
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CALLSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGC_ABORT_CALL_request:
+ {
+ struct uni *uni = c->uni;
+
+ uni_destroy_call(c, 0);
+ uniapi_uni_error(uni, UNIAPI_OK, cookie, UNI_CALLSTATE_U0);
+ break;
+ }
+
+ /*
+ * Timers
+ */
+ case SIGC_T301:
+ if (c->cstate == CALLST_U4 || c->cstate == CALLST_N7) {
+ /* Q.2971:Call-Control-U Missing */
+ /* Q.2971:Call-Control-N 14/39 */
+ u4n7_t301(c);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "T301 in cs=%s",
+ callstates[c->cstate].name);
+ break;
+
+ case SIGC_T303:
+ if (c->cstate == CALLST_U1 || c->cstate == CALLST_N6) {
+ /* Q.2971:Call-Control-U 6/39 */
+ /* Q.2971:Call-Control-N 11/39 */
+ u1n6_t303(c);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "T303 in cs=%s",
+ callstates[c->cstate].name);
+ break;
+
+ case SIGC_T308:
+ if (c->cstate == CALLST_U11 || c->cstate == CALLST_N12) {
+ /* Q.2971:Call-Control-U 28/39 */
+ /* Q.2971:Call-Control-N 30/39 */
+ u11n12_t308(c);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "T308 in cs=%s",
+ callstates[c->cstate].name);
+ break;
+
+ case SIGC_T310:
+ if (c->cstate == CALLST_U3 || c->cstate == CALLST_N9) {
+ /* Q.2971:Call-Control-U 7/39 */
+ /* Q.2971:Call-Control-N 17/39 */
+ u3n9_t310(c);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "T310 in cs=%s",
+ callstates[c->cstate].name);
+ break;
+
+ case SIGC_T313:
+ if (c->cstate == CALLST_U8) {
+ /* Q.2971:Call-Control-U 15/39 */
+ u8_t313(c);
+ break;
+ }
+ VERBOSE(c->uni, UNI_FAC_ERR, 1, "T313 in cs=%s",
+ callstates[c->cstate].name);
+ break;
+
+ case SIGC_T322:
+ /* Q.2971:Call-Control-U 34/39 */
+ /* Q.2971:Call-Control-N 35/39 */
+ unx_t322(c);
+ break;
+
+ case SIGC_CALL_DELETE:
+ CALL_FREE(c);
+ break;
+
+ /*
+ * Party-Control
+ */
+ case SIGC_DROP_PARTY_indication:
+ if (c->uni->proto == UNIPROTO_UNI40U)
+ /* Q.2971:Call-Control-U 23/39 */
+ ux_drop_party_indication(c, msg);
+ else
+ /* Q.2971:Call-Control-N 23/39 */
+ nx_drop_party_indication(c, msg);
+ break;
+
+ case SIGC_DROP_PARTY_ACK_indication:
+ if (c->uni->proto == UNIPROTO_UNI40U)
+ /* Q.2971:Call-Control-U 23/39 */
+ ux_drop_party_ack_indication(c, msg);
+ else
+ /* Q.2971:Call-Control-N 23/39 */
+ nx_drop_party_ack_indication(c, msg);
+ break;
+
+ case SIGC_ADD_PARTY_REJ_indication:
+ if (c->uni->proto == UNIPROTO_UNI40U)
+ /* Q.2971:Call-Control-U 23/39 */
+ ux_add_party_rej_indication(c, msg);
+ else
+ /* Q.2971:Call-Control-N 23/39 */
+ nx_add_party_rej_indication(c, msg);
+ break;
+
+
+ case SIGC_SEND_DROP_PARTY:
+ /* Q.2971:Call-Control-U 21/39 */
+ /* Q.2971:Call-Control-U 25/39 */
+ if (uni_party_act_count(c, 2) != 0)
+ (void)uni_send_output(u, c->uni);
+ else if(c->cstate != CALLST_U11) {
+ c->uni->cause = u->u.drop_party.cause;
+ clear_callD(c);
+ }
+ UNI_FREE(u);
+ break;
+
+ case SIGC_SEND_DROP_PARTY_ACK:
+ /* Q.2971:Call-Control-U 21/39 */
+ /* Q.2971:Call-Control-U 25/39 */
+ if (uni_party_act_count(c, 2) != 0)
+ (void)uni_send_output(u, c->uni);
+ else if (c->cstate != CALLST_U11) {
+ c->uni->cause = u->u.drop_party_ack.cause;
+ clear_callD(c);
+ }
+ UNI_FREE(u);
+ break;
+
+ case SIGC_SEND_ADD_PARTY_REJ:
+ /* Q.2971:Call-Control-U 21/39 */
+ /* Q.2971:Call-Control-U 24/39 */
+ unx_send_add_party_rej(c, u);
+ break;
+
+ case SIGC_SEND_STATUS_ENQ:
+ /* Q.2971:Call-Control-U 21/39 */
+ /* Q.2971:Call-Control-U 25/39 */
+ unx_send_party_status_enq(c, u);
+ break;
+
+ case SIGC_PARTY_DESTROYED:
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_PARTY_DESTROYED, cookie, msg);
+ break;
+
+ case SIGC_END:
+ break;
+ }
+
+ return;
+
+ drop:
+ /*
+ * This is for SAAL message signals that should be dropped.
+ */
+ uni_msg_destroy(msg);
+ UNI_FREE(u);
+}
+
+/**********************************************************************/
+
+/*
+ * Timeout functions
+ */
+static void
+t308_func(struct call *c)
+{
+ uni_enq_call(c, SIGC_T308, 0, NULL, NULL);
+}
+static void
+t303_func(struct call *c)
+{
+ uni_enq_call(c, SIGC_T303, 0, NULL, NULL);
+}
+static void
+t301_func(struct call *c)
+{
+ uni_enq_call(c, SIGC_T301, 0, NULL, NULL);
+}
+static void
+t310_func(struct call *c)
+{
+ uni_enq_call(c, SIGC_T310, 0, NULL, NULL);
+}
+static void
+t313_func(struct call *c)
+{
+ uni_enq_call(c, SIGC_T313, 0, NULL, NULL);
+}
+
+static void
+t322_func(struct call *c)
+{
+ uni_enq_call(c, SIGC_T322, 0, NULL, NULL);
+}
+
+/**********************************************************************/
+
+/*
+ * Check whether the peer state is compatible with our state.
+ * Return the new callstate we should go to (either U0 or the current
+ * state).
+ * None of the state is U0 here. My state is not U11 or U12.
+ *
+ * Well, this turns out to be not so easy: the status enquiry could have
+ * been sent before we changed into the current state - the status will
+ * report a previous state without anything been lost.
+ *
+ * Incoming states are incompatible with outgoing states. Everything is ok.
+ */
+static enum call_state
+state_compat(struct call *c, enum uni_callstate peer)
+{
+ if ((c->cstate == CALLST_U1 ||
+ c->cstate == CALLST_U3 ||
+ c->cstate == CALLST_U4) &&
+ (peer == UNI_CALLSTATE_N6 ||
+ peer == UNI_CALLSTATE_N7 ||
+ peer == UNI_CALLSTATE_N8 ||
+ peer == UNI_CALLSTATE_N9))
+ return (CALLST_NULL);
+
+ if ((c->cstate == CALLST_N6 ||
+ c->cstate == CALLST_N7 ||
+ c->cstate == CALLST_N8 ||
+ c->cstate == CALLST_N9) &&
+ (peer == UNI_CALLSTATE_U1 ||
+ peer == UNI_CALLSTATE_U3 ||
+ peer == UNI_CALLSTATE_U4))
+ return (CALLST_NULL);
+
+ if ((peer == UNI_CALLSTATE_N1 ||
+ peer == UNI_CALLSTATE_N3 ||
+ peer == UNI_CALLSTATE_N4) &&
+ (c->cstate == CALLST_U6 ||
+ c->cstate == CALLST_U7 ||
+ c->cstate == CALLST_U8 ||
+ c->cstate == CALLST_N9))
+ return (CALLST_NULL);
+
+ if ((peer == UNI_CALLSTATE_U6 ||
+ peer == UNI_CALLSTATE_U7 ||
+ peer == UNI_CALLSTATE_U8 ||
+ peer == UNI_CALLSTATE_U9) &&
+ (c->cstate == CALLST_N1 ||
+ c->cstate == CALLST_N3 ||
+ c->cstate == CALLST_N4))
+ return (CALLST_NULL);
+
+ return (c->cstate);
+}
diff --git a/sys/contrib/ngatm/netnatm/sig/sig_coord.c b/sys/contrib/ngatm/netnatm/sig/sig_coord.c
new file mode 100644
index 0000000..6a68830
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/sig_coord.c
@@ -0,0 +1,1171 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/sig/sig_coord.c,v 1.12 2004/08/05 07:11:01 brandt Exp $
+ *
+ * Coordinator
+ */
+
+#include <netnatm/unimsg.h>
+#include <netnatm/saal/sscfudef.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/sig/uni.h>
+
+#include <netnatm/sig/unipriv.h>
+#include <netnatm/sig/unimkmsg.h>
+
+#define STR(S) [S] = #S
+static const char *const cunames[] = {
+ STR(CU_STAT0),
+ STR(CU_STAT1),
+ STR(CU_STAT2),
+ STR(CU_STAT3),
+};
+
+#define DEF_PRIV_SIG(NAME, FROM) [SIG##NAME] = "SIG"#NAME,
+static const char *const coord_sigs[] = {
+ DEF_COORD_SIGS
+};
+#undef DEF_PRIV_SIG
+
+static void sig_all_calls(struct uni *, u_int sig);
+static void set_custat(struct uni *, enum cu_stat);
+
+static void input_dummy(struct uni *uni, struct uni_msg *m, struct uni_all *u);
+static void input_global(struct uni *uni, struct uni_msg *m, struct uni_all *u);
+static void input_unknown(struct uni *uni, struct uni_msg *m, struct uni_all *u);
+static void input_cobi(struct call *c, struct uni_msg *m, struct uni_all *u);
+static void input_call(struct call *c, struct uni_msg *m, struct uni_all *u);
+
+TIMER_FUNC_UNI(t309, t309_func)
+
+/*
+ * All those 'bogus signal' printouts are not specified in the SDLs.
+ */
+
+
+/*
+ * SAAL-ESTABLISH.indication
+ *
+ * This means either a resynchronisation or error-recovery or
+ * an incoming SSCOP connection.
+ */
+static void
+coord_saal_establish_indication(struct uni *uni)
+{
+ switch (uni->custat) {
+
+ case CU_STAT0: /* Q.2931:Coord-U 4/10 */
+ case CU_STAT3: /* Q.2931:Coord-U 5/10 */
+ sig_all_calls(uni, SIGC_LINK_ESTABLISH_indication);
+ set_custat(uni, CU_STAT3);
+ break;
+
+ case CU_STAT1:
+ case CU_STAT2:
+ VERBOSE0(uni, UNI_FAC_COORD,
+ "signal saal_establish.indication in CU%u", uni->custat);
+ break;
+
+ default:
+ ASSERT(0, ("CU_STAT*"));
+ }
+}
+
+/*
+ * SAAL-ESTABLISH.confirm
+ */
+static void
+coord_saal_establish_confirm(struct uni *uni)
+{
+ switch (uni->custat) {
+
+ case CU_STAT0:
+ case CU_STAT2:
+ VERBOSE0(uni, UNI_FAC_COORD,
+ "signal saal_establish.confirm in CU%u", uni->custat);
+ break;
+
+ case CU_STAT1:
+ /*
+ * Q.2931:Co-ord-U 4/10
+ */
+ TIMER_STOP_UNI(uni, t309);
+ sig_all_calls(uni, SIGC_LINK_ESTABLISH_confirm);
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_LINK_ESTABLISH_confirm, 0, NULL);
+ set_custat(uni, CU_STAT3);
+ break;
+
+ case CU_STAT3:
+ /*
+ * Q.2931:Coord-U 5/10
+ */
+ sig_all_calls(uni, SIGC_LINK_ESTABLISH_confirm);
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_LINK_ESTABLISH_confirm, 0, NULL);
+ break;
+
+ default:
+ ASSERT(0, ("CU_STAT*"));
+ }
+}
+
+/*
+ * SAAL-RELEASE.confirm
+ */
+static void
+coord_saal_release_confirm(struct uni *uni)
+{
+ switch (uni->custat) {
+
+ case CU_STAT0:
+ case CU_STAT1:
+ case CU_STAT3:
+ VERBOSE0(uni, UNI_FAC_COORD,
+ "signal saal_release.confirm in CU%u", uni->custat);
+ break;
+
+ case CU_STAT2:
+ /*
+ * Q.2931:Coord-U 5/10
+ */
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_LINK_RELEASE_confirm, 0, NULL);
+ set_custat(uni, CU_STAT0);
+ break;
+
+ default:
+ ASSERT(0, ("CU_STAT*"));
+ }
+}
+
+/*
+ * SAAL failure.
+ */
+static void
+coord_saal_release_indication(struct uni *uni)
+{
+ switch (uni->custat) {
+
+ case CU_STAT0:
+ case CU_STAT2:
+ VERBOSE0(uni, UNI_FAC_COORD,
+ "signal saal_release.indication in CU%u", uni->custat);
+ break;
+
+ case CU_STAT1:
+ case CU_STAT3:
+ /*
+ * Q.2931:Coord-U 4/10
+ * Q.2931:Coord-U 5/10
+ */
+ sig_all_calls(uni, SIGC_LINK_RELEASE_indication);
+ set_custat(uni, CU_STAT0);
+ break;
+
+ default:
+ ASSERT(0, ("CU_STAT*"));
+ }
+}
+
+/*
+ * Link-establish.request from USER. This can also come from
+ * a call instance. In this case 'cookie' is zero.
+ */
+static void
+coord_link_establish_request(struct uni *uni, uint32_t cookie)
+{
+ switch (uni->custat) {
+
+ case CU_STAT0:
+ /*
+ * Q.2931:Coord-U 4/10
+ */
+ uni->funcs->saal_output(uni, uni->arg,
+ SAAL_ESTABLISH_request, NULL);
+ if (!TIMER_ISACT(uni, t309))
+ TIMER_START_UNI(uni, t309, uni->timer309);
+ set_custat(uni, CU_STAT1);
+ if (cookie)
+ uniapi_uni_error(uni, UNIAPI_OK, cookie, 0);
+ break;
+
+ case CU_STAT1:
+ /*
+ * Q.2931:Coord-U 4/10
+ * This is probably missing from the delay field.
+ */
+ uni_delenq_coord(uni, SIGO_LINK_ESTABLISH_request,
+ cookie, NULL);
+ break;
+
+ case CU_STAT2:
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALLSTATE, cookie, 0);
+ if (cookie == 0)
+ VERBOSE0(uni, UNI_FAC_COORD,
+ "signal link-establish.request in CU%u",
+ uni->custat);
+ break;
+
+ case CU_STAT3:
+ /*
+ * Q.2931:Coord-U 5/10
+ */
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_LINK_ESTABLISH_confirm, 0, NULL);
+ uniapi_uni_error(uni, UNIAPI_OK, cookie, 0);
+ break;
+
+ default:
+ ASSERT(0, ("CU_STAT*"));
+ }
+}
+
+/*
+ * Link-release.request from user
+ */
+static void
+coord_link_release_request(struct uni *uni, u_int cookie)
+{
+ switch (uni->custat) {
+
+ case CU_STAT0:
+ case CU_STAT1:
+ case CU_STAT2:
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALLSTATE, cookie, 0);
+ break;
+
+ case CU_STAT3:
+ /*
+ * Q.2931:Coord-U 5/10
+ */
+ uni->funcs->saal_output(uni, uni->arg,
+ SAAL_RELEASE_request, NULL);
+ set_custat(uni, CU_STAT2);
+ uniapi_uni_error(uni, UNIAPI_OK, cookie, 0);
+ break;
+
+ default:
+ ASSERT(0, ("CU_STAT*"));
+ }
+}
+
+/*
+ * T309 timeout signal
+ */
+static void
+coord_t309(struct uni *uni)
+{
+ switch (uni->custat) {
+
+ case CU_STAT0:
+ case CU_STAT1:
+ /*
+ * Q.2931:Coord-U 4/10
+ */
+ sig_all_calls(uni, SIGC_LINK_ESTABLISH_ERROR_indication);
+ set_custat(uni, CU_STAT0);
+ /* this is not in the SDLs, but how will the call control
+ * know, that starting the LINK has failed otherwise? */
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_LINK_RELEASE_confirm, 0, NULL);
+ break;
+
+ case CU_STAT2:
+ case CU_STAT3:
+ VERBOSE0(uni, UNI_FAC_COORD,
+ "signal T309 in CU%u", uni->custat);
+ break;
+
+ default:
+ ASSERT(0, ("CU_STAT*"));
+ }
+}
+
+/*
+ * Message from SAAL
+ */
+static void
+coord_saal_data_indication(struct uni *uni, struct uni_msg *m)
+{
+ struct uni_all *u;
+ struct call *c;
+
+ memset(&uni->cause, 0, sizeof(uni->cause));
+ if ((u = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(m);
+ return;
+ }
+ if (uni_decode_head(m, u, &uni->cx)) {
+ VERBOSE(uni, UNI_FAC_COORD, 2, "bogus message - ignored");
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+ if (u->u.hdr.cref.cref == CREF_DUMMY) {
+ if (uni->cx.q2932) {
+ input_dummy(uni, m, u);
+ } else {
+ VERBOSE(uni, UNI_FAC_COORD, 2, "dummy cref - ignored");
+ UNI_FREE(u);
+ uni_msg_destroy(m);
+ }
+ return;
+ }
+
+ if (u->u.hdr.cref.cref == CREF_GLOBAL)
+ input_global(uni, m, u);
+ else if ((c = uni_find_call(uni, &u->u.hdr.cref)) == NULL)
+ input_unknown(uni, m, u);
+ else if (c->type == CALL_COBI)
+ input_cobi(c, m, u);
+ else
+ input_call(c, m, u);
+}
+
+/*
+ * Message with global call reference
+ *
+ * Q.2931:Coord-U (X) 7/10
+ */
+static void
+input_global(struct uni *uni, struct uni_msg *m, struct uni_all *u)
+{
+ VERBOSE(uni, UNI_FAC_COORD, 2, "GLOB MTYPE = %x", u->mtype);
+
+ switch (u->mtype) {
+
+ default:
+ /*
+ * Q.2931:Coord-U 7/10
+ * Q.2931: 5.6.3.2e
+ * Amd4: 29e
+ */
+ uni_respond_status(uni, &u->u.hdr.cref,
+ u->u.hdr.cref.flag ? uni->glob_start : uni->glob_respond,
+ UNI_CAUSE_CREF_INV);
+ break;
+
+ case UNI_RESTART:
+ if (u->u.hdr.cref.flag) {
+ /*
+ * Q.2931:Coord-U 7/10 (5.6.3.2h)
+ */
+ uni_respond_status(uni, &u->u.hdr.cref,
+ uni->glob_start, UNI_CAUSE_CREF_INV);
+ break;
+ }
+ uni_enq_resp(uni, SIGR_RESTART, 0, m, u);
+ return;
+
+ case UNI_RESTART_ACK:
+ if (!u->u.hdr.cref.flag) {
+ /*
+ * Q.2931:Coord-U 7/10 (5.6.3.2h)
+ * Note, that the SDL diagram contains an error.
+ * The error with the 'YES' label should go to the
+ * box below 'OTHER'.
+ */
+ uni_respond_status(uni, &u->u.hdr.cref,
+ uni->glob_respond, UNI_CAUSE_CREF_INV);
+ break;
+ }
+ uni_enq_start(uni, SIGS_RESTART_ACK, 0, m, u);
+ return;
+
+ case UNI_STATUS:
+ if (u->u.hdr.cref.flag)
+ uni_enq_start(uni, SIGS_STATUS, 0, m, u);
+ else
+ uni_enq_resp(uni, SIGR_STATUS, 0, m, u);
+ return;
+ }
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * Q.2931:Coord-U 8/10
+ *
+ * Message for an unknown call reference
+ */
+static void
+input_unknown(struct uni *uni, struct uni_msg *m, struct uni_all *u)
+{
+ struct uni_all *resp;
+ struct call *c;
+ u_int cause = UNI_CAUSE_CREF_INV;
+
+ VERBOSE(uni, UNI_FAC_COORD, 2, "UNKNOWN MTYPE = %x", u->mtype);
+
+ switch (u->mtype) {
+
+ default:
+ /*
+ * This message type is entirly unknown
+ *
+ * 5.6.4 and 5.7.1 are only when the call is not in the
+ * NULL state. This means, 5.6.3.2a takes over.
+ */
+ break;
+
+ case UNI_SETUP:
+ if (u->u.hdr.cref.flag)
+ /*
+ * 5.6.3.2c
+ */
+ goto drop;
+ if ((c = uni_create_call(uni, u->u.hdr.cref.cref, 0, 0)) != NULL) {
+ uni_enq_call(c, SIGC_SETUP, 0, m, u);
+ return;
+ }
+ goto drop;
+
+ case UNI_RELEASE_COMPL:
+ /*
+ * 5.6.3.2c
+ */
+ goto drop;
+
+ case UNI_STATUS:
+ /*
+ * 5.6.12
+ *
+ * The SDLs don't use the verify procedure and don't
+ * handle the case of an invalid callstate - we
+ * ignore the message, if the callstate is not good.
+ */
+ (void)uni_decode_body(m, u, &uni->cx);
+ if (!IE_ISGOOD(u->u.status.callstate))
+ goto drop;
+ if (u->u.status.callstate.state == UNI_CALLSTATE_U0)
+ goto drop;
+ cause = UNI_CAUSE_MSG_INCOMP;
+ break;
+
+ case UNI_STATUS_ENQ:
+ if ((resp = UNI_ALLOC()) == NULL)
+ goto drop;
+
+ (void)uni_decode_body(m, u, &uni->cx);
+ MK_MSG_RESP(resp, UNI_STATUS, &u->u.hdr.cref);
+ MK_IE_CALLSTATE(resp->u.status.callstate, UNI_CALLSTATE_U0);
+ MK_IE_CAUSE(resp->u.status.cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_STATUS);
+
+ if (IE_ISGOOD(u->u.status_enq.epref)) {
+ /* reflect epref as required by L3MU_PO */
+ resp->u.status.epref = u->u.status_enq.epref;
+ MK_IE_EPREF(resp->u.status.epref,
+ u->u.status_enq.epref.epref,
+ !u->u.status_enq.epref.flag);
+ MK_IE_EPSTATE(resp->u.status.epstate, UNI_EPSTATE_NULL);
+ }
+
+ (void)uni_send_output(resp, uni);
+
+ UNI_FREE(resp);
+ goto drop;
+
+ case UNI_COBISETUP:
+ if (u->u.hdr.cref.flag)
+ /*
+ * 5.6.3.2c (probably)
+ */
+ goto drop;
+ if ((c = uni_create_call(uni, u->u.hdr.cref.cref, 0, 0)) != NULL) {
+ uni_enq_call(c, SIGC_COBISETUP, 0, m, u);
+ return;
+ }
+ goto drop;
+ }
+
+ /*
+ * 5.6.3.2a)
+ *
+ * Respond with a RELEASE COMPLETE
+ */
+ if ((resp = UNI_ALLOC()) == NULL)
+ goto drop;
+
+ MK_MSG_RESP(resp, UNI_RELEASE_COMPL, &u->u.hdr.cref);
+ MK_IE_CAUSE(resp->u.release_compl.cause[0], UNI_CAUSE_LOC_USER, cause);
+ if (uni_diag(cause, UNI_CODING_ITU) == UNI_DIAG_MTYPE)
+ ADD_CAUSE_MTYPE(resp->u.release_compl.cause[0], u->mtype);
+
+ (void)uni_send_output(resp, uni);
+
+ UNI_FREE(resp);
+
+ drop:
+ UNI_FREE(u);
+ uni_msg_destroy(m);
+}
+
+static void
+input_cobi(struct call *c __unused, struct uni_msg *m, struct uni_all *u)
+{
+ /* XXX */
+ UNI_FREE(u);
+ uni_msg_destroy(m);
+}
+
+static void
+input_dummy(struct uni *uni __unused, struct uni_msg *m, struct uni_all *u)
+{
+ /* XXX */
+ UNI_FREE(u);
+ uni_msg_destroy(m);
+}
+
+static void
+input_call(struct call *c, struct uni_msg *m, struct uni_all *u)
+{
+ VERBOSE(c->uni, UNI_FAC_COORD, 2, "CALL MTYPE = %x %d/%s",
+ u->mtype, c->cref, c->mine ? "mine":"his");
+
+ switch (u->mtype) {
+
+ case UNI_SETUP:
+ /*
+ * Ignored
+ */
+ break;
+
+ case UNI_CALL_PROC:
+ uni_enq_call(c, SIGC_CALL_PROC, 0, m, u);
+ return;
+
+ case UNI_ALERTING:
+ uni_enq_call(c, SIGC_ALERTING, 0, m, u);
+ return;
+
+ case UNI_RELEASE:
+ uni_enq_call(c, SIGC_RELEASE, 0, m, u);
+ return;
+
+ case UNI_RELEASE_COMPL:
+ uni_enq_call(c, SIGC_RELEASE_COMPL, 0, m, u);
+ return;
+
+ case UNI_CONNECT:
+ uni_enq_call(c, SIGC_CONNECT, 0, m, u);
+ return;
+
+ case UNI_CONNECT_ACK:
+ uni_enq_call(c, SIGC_CONNECT_ACK, 0, m, u);
+ return;
+
+ case UNI_NOTIFY:
+ uni_enq_call(c, SIGC_NOTIFY, 0, m, u);
+ return;
+
+ case UNI_STATUS:
+ uni_enq_call(c, SIGC_STATUS, 0, m, u);
+ return;
+
+ case UNI_STATUS_ENQ:
+ uni_enq_call(c, SIGC_STATUS_ENQ, 0, m, u);
+ return;
+
+ case UNI_ADD_PARTY:
+ uni_enq_call(c, SIGC_ADD_PARTY, 0, m, u);
+ return;
+
+ case UNI_PARTY_ALERTING:
+ uni_enq_call(c, SIGC_PARTY_ALERTING, 0, m, u);
+ return;
+
+ case UNI_ADD_PARTY_ACK:
+ uni_enq_call(c, SIGC_ADD_PARTY_ACK, 0, m, u);
+ return;
+
+ case UNI_ADD_PARTY_REJ:
+ uni_enq_call(c, SIGC_ADD_PARTY_REJ, 0, m, u);
+ return;
+
+ case UNI_DROP_PARTY:
+ uni_enq_call(c, SIGC_DROP_PARTY, 0, m, u);
+ return;
+
+ case UNI_DROP_PARTY_ACK:
+ uni_enq_call(c, SIGC_DROP_PARTY_ACK, 0, m, u);
+ return;
+
+ default:
+ uni_enq_call(c, SIGC_UNKNOWN, 0, m, u);
+ return;
+ }
+ UNI_FREE(u);
+ uni_msg_destroy(m);
+}
+
+
+/*
+ * This macro tries to implement the delaying behaviour for
+ * message from the API when we are in the Awaiting-Establish state.
+ * In this state, the message is delayed. If we drop back to CU 0,
+ * everything gets unqueued and errors are returned for all that stuff.
+ * If we progess to CUSTAT2 we process the requests.
+ */
+#define COMMON_DELAY(SIG, COOKIE) \
+ if (uni->custat == CU_STAT0 || uni->custat == CU_STAT2) {\
+ uniapi_uni_error(uni, UNIAPI_ERROR_BADCU, \
+ COOKIE, 0); \
+ break; \
+ } \
+ if (uni->custat == CU_STAT1) { \
+ uni_delenq_coord(uni, SIG, COOKIE, msg); \
+ break; \
+ }
+
+/*
+ * Signal handler of the coordinator
+ */
+void
+uni_sig_coord(struct uni *uni, enum coord_sig sig, uint32_t cookie,
+ struct uni_msg *msg)
+{
+ struct call *c;
+
+ if (sig >= SIGO_END) {
+ VERBOSE(uni, UNI_FAC_ERR, 1, "Signal %d outside of range to "
+ "Coord", sig);
+ if (msg)
+ uni_msg_destroy(msg);
+ return;
+ }
+
+ VERBOSE(uni, UNI_FAC_COORD, 1, "Signal %s in state %s",
+ coord_sigs[sig], cunames[uni->custat]);
+
+ switch (sig) {
+
+ case SIGO_END:
+ break;
+
+ case SIGO_DATA: /* delayed output */
+ if (uni->custat == CU_STAT0 || uni->custat == CU_STAT1)
+ break; /* drop */
+ if (uni->custat == CU_STAT1)
+ uni_delenq_coord(uni, SIGO_DATA, cookie, msg);/* ??? */
+ else
+ uni->funcs->saal_output(uni, uni->arg,
+ SAAL_DATA_request, msg);
+ msg = NULL;
+ break;
+
+ /*
+ * SAAL signals
+ */
+ case SIGO_SAAL_ESTABLISH_indication:
+ coord_saal_establish_indication(uni);
+ break;
+
+ case SIGO_SAAL_ESTABLISH_confirm:
+ coord_saal_establish_confirm(uni);
+ break;
+
+ case SIGO_SAAL_RELEASE_confirm:
+ coord_saal_release_confirm(uni);
+ break;
+
+ case SIGO_SAAL_RELEASE_indication:
+ coord_saal_release_indication(uni);
+ break;
+
+ case SIGO_SAAL_DATA_indication:
+ coord_saal_data_indication(uni, msg);
+ msg = NULL;
+ break;
+
+ case SIGO_SAAL_UDATA_indication:
+ VERBOSE0(uni, UNI_FAC_ERR, "SAAL_UDATA_indication");
+ break;
+
+ /*
+ * Signals from USER
+ */
+ case SIGO_LINK_ESTABLISH_request:
+ coord_link_establish_request(uni, cookie);
+ break;
+
+ case SIGO_LINK_RELEASE_request:
+ coord_link_release_request(uni, cookie);
+ break;
+
+ case SIGO_RESET_request:
+ uni_enq_start(uni, SIGS_RESET_request, cookie, msg, NULL);
+ msg = NULL;
+ if (uni->custat == CU_STAT0) {
+ uni->funcs->saal_output(uni, uni->arg,
+ SAAL_ESTABLISH_request, NULL);
+ if (!TIMER_ISACT(uni, t309))
+ TIMER_START_UNI(uni, t309, uni->timer309);
+ set_custat(uni, CU_STAT1);
+ }
+ break;
+
+ case SIGO_RESET_ERROR_response:
+ COMMON_DELAY(SIGO_RESET_ERROR_response, cookie);
+ uni_enq_resp(uni, SIGR_RESET_ERROR_response, cookie, msg, NULL);
+ msg = NULL;
+ break;
+
+ case SIGO_RESET_response:
+ COMMON_DELAY(SIGO_RESET_response, cookie);
+ uni_enq_resp(uni, SIGR_RESET_response, cookie, msg, NULL);
+ msg = NULL;
+ break;
+
+ case SIGO_SETUP_request:
+ if ((c = uni_create_new_call(uni, cookie)) != NULL) {
+ uni_enq_call(c, SIGC_SETUP_request, cookie, msg, NULL);
+ msg = NULL;
+ if (uni->custat == CU_STAT0) {
+ uni->funcs->saal_output(uni, uni->arg,
+ SAAL_ESTABLISH_request, NULL);
+ if (!TIMER_ISACT(uni, t309))
+ TIMER_START_UNI(uni, t309, uni->timer309);
+ set_custat(uni, CU_STAT1);
+ }
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_NOMEM, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+
+ case SIGO_PROCEEDING_request:
+ {
+ struct uniapi_proceeding_request *arg =
+ uni_msg_rptr(msg, struct uniapi_proceeding_request *);
+
+ COMMON_DELAY(SIGO_PROCEEDING_request, cookie);
+ if ((c = uni_find_call(uni, &arg->call_proc.hdr.cref)) != NULL) {
+ uni_enq_call(c, SIGC_PROCEEDING_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_ALERTING_request:
+ {
+ struct uniapi_alerting_request *arg =
+ uni_msg_rptr(msg, struct uniapi_alerting_request *);
+
+ COMMON_DELAY(SIGO_ALERTING_request, cookie);
+ if ((c = uni_find_call(uni, &arg->alerting.hdr.cref)) != NULL) {
+ uni_enq_call(c, SIGC_ALERTING_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_SETUP_response:
+ {
+ struct uniapi_setup_response *arg =
+ uni_msg_rptr(msg, struct uniapi_setup_response *);
+
+ COMMON_DELAY(SIGO_SETUP_response, cookie);
+ if ((c = uni_find_call(uni, &arg->connect.hdr.cref)) != NULL) {
+ uni_enq_call(c, SIGC_SETUP_response, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_SETUP_COMPLETE_request:
+ {
+ struct uniapi_setup_complete_request *arg =
+ uni_msg_rptr(msg, struct uniapi_setup_complete_request *);
+
+ COMMON_DELAY(SIGO_SETUP_COMPLETE_request, cookie);
+ if ((c = uni_find_call(uni, &arg->connect_ack.hdr.cref)) != NULL) {
+ uni_enq_call(c, SIGC_SETUP_COMPLETE_request,
+ cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_RELEASE_request:
+ {
+ struct uniapi_release_request *arg =
+ uni_msg_rptr(msg, struct uniapi_release_request *);
+
+ COMMON_DELAY(SIGO_RELEASE_request, cookie);
+ if ((c = uni_find_call(uni, &arg->release.hdr.cref)) != NULL) {
+ uni_enq_call(c, SIGC_RELEASE_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_RELEASE_response:
+ {
+ struct uniapi_release_response *arg =
+ uni_msg_rptr(msg, struct uniapi_release_response *);
+
+ COMMON_DELAY(SIGO_RELEASE_response, cookie);
+ if ((c = uni_find_call(uni, &arg->release_compl.hdr.cref)) != NULL) {
+ uni_enq_call(c, SIGC_RELEASE_response, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_NOTIFY_request:
+ {
+ struct uniapi_notify_request *arg =
+ uni_msg_rptr(msg, struct uniapi_notify_request *);
+
+ COMMON_DELAY(SIGO_NOTIFY_request, cookie);
+ if ((c = uni_find_call(uni, &arg->notify.hdr.cref)) != NULL) {
+ uni_enq_call(c, SIGC_NOTIFY_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_STATUS_ENQUIRY_request:
+ {
+ struct uniapi_status_enquiry_request *arg =
+ uni_msg_rptr(msg, struct uniapi_status_enquiry_request *);
+
+ COMMON_DELAY(SIGO_STATUS_ENQUIRY_request, cookie);
+ if ((c = uni_find_call(uni, &arg->cref)) != NULL) {
+ uni_enq_call(c, SIGC_STATUS_ENQUIRY_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_ADD_PARTY_request:
+ {
+ struct uniapi_add_party_request *arg =
+ uni_msg_rptr(msg, struct uniapi_add_party_request *);
+
+ COMMON_DELAY(SIGO_ADD_PARTY_request, cookie);
+ if ((c = uni_find_call(uni, &arg->add.hdr.cref)) != NULL) {
+ if (c->type != CALL_ROOT) {
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CTYPE,
+ cookie);
+ break;
+ }
+ uni_enq_call(c, SIGC_ADD_PARTY_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_PARTY_ALERTING_request:
+ {
+ struct uniapi_party_alerting_request *arg =
+ uni_msg_rptr(msg, struct uniapi_party_alerting_request *);
+
+ COMMON_DELAY(SIGO_PARTY_ALERTING_request, cookie);
+ if ((c = uni_find_call(uni, &arg->alert.hdr.cref)) != NULL) {
+ if (c->type != CALL_LEAF) {
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CTYPE,
+ cookie);
+ break;
+ }
+ uni_enq_call(c, SIGC_PARTY_ALERTING_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_ADD_PARTY_ACK_request:
+ {
+ struct uniapi_add_party_ack_request *arg =
+ uni_msg_rptr(msg, struct uniapi_add_party_ack_request *);
+
+ COMMON_DELAY(SIGO_ADD_PARTY_ACK_request, cookie);
+ if ((c = uni_find_call(uni, &arg->ack.hdr.cref)) != NULL) {
+ if (c->type != CALL_LEAF) {
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CTYPE,
+ cookie);
+ break;
+ }
+ uni_enq_call(c, SIGC_ADD_PARTY_ACK_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_ADD_PARTY_REJ_request:
+ {
+ struct uniapi_add_party_rej_request *arg =
+ uni_msg_rptr(msg, struct uniapi_add_party_rej_request *);
+
+ COMMON_DELAY(SIGO_ADD_PARTY_REJ_request, cookie);
+ if ((c = uni_find_call(uni, &arg->rej.hdr.cref)) != NULL) {
+ if (c->type != CALL_LEAF) {
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CTYPE,
+ cookie);
+ break;
+ }
+ uni_enq_call(c, SIGC_ADD_PARTY_REJ_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_DROP_PARTY_request:
+ {
+ struct uniapi_drop_party_request *arg =
+ uni_msg_rptr(msg, struct uniapi_drop_party_request *);
+
+ COMMON_DELAY(SIGO_DROP_PARTY_request, cookie);
+ if ((c = uni_find_call(uni, &arg->drop.hdr.cref)) != NULL) {
+ if (c->type != CALL_ROOT && c->type != CALL_LEAF) {
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CTYPE,
+ cookie);
+ break;
+ }
+ uni_enq_call(c, SIGC_DROP_PARTY_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_DROP_PARTY_ACK_request:
+ {
+ struct uniapi_drop_party_ack_request *arg =
+ uni_msg_rptr(msg, struct uniapi_drop_party_ack_request *);
+
+ COMMON_DELAY(SIGO_DROP_PARTY_ACK_request, cookie);
+ if ((c = uni_find_call(uni, &arg->ack.hdr.cref)) != NULL) {
+ if (c->type != CALL_ROOT && c->type != CALL_LEAF) {
+ uniapi_call_error(c, UNIAPI_ERROR_BAD_CTYPE,
+ cookie);
+ break;
+ }
+ uni_enq_call(c, SIGC_DROP_PARTY_ACK_request, cookie, msg, NULL);
+ msg = NULL;
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ case SIGO_ABORT_CALL_request:
+ {
+ struct uniapi_abort_call_request *arg =
+ uni_msg_rptr(msg, struct uniapi_abort_call_request *);
+
+ if ((c = uni_find_call(uni, &arg->cref)) != NULL) {
+ uni_enq_call(c, SIGC_ABORT_CALL_request, cookie, NULL, NULL);
+ } else {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALL, cookie,
+ UNI_CALLSTATE_U0);
+ }
+ break;
+ }
+
+ /*
+ * Call-Control
+ */
+ case SIGO_CALL_DESTROYED:
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_CALL_DESTROYED, 0, msg);
+ msg = NULL;
+ break;
+
+ /*
+ * ResetRespond
+ */
+ case SIGO_RESET_indication:
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_RESET_indication, 0, msg);
+ msg = NULL;
+ break;
+
+ /*
+ * Timeouts
+ */
+ case SIGO_T309:
+ coord_t309(uni);
+ break;
+
+ }
+ if (msg != NULL)
+ uni_msg_destroy(msg);
+}
+
+/*
+ * Send a signal to all call instances
+ */
+static void
+sig_all_calls(struct uni *uni, u_int sig)
+{
+ struct call *call;
+
+ TAILQ_FOREACH(call, &uni->calls, link)
+ uni_enq_call(call, sig, 0, NULL, NULL);
+}
+
+/*
+ * Set a new coordinator state - this moves all delayed coordinator
+ * signals from the delayed queue to the signal queue.
+ */
+static int
+cufilt(struct sig *s, void *arg __unused)
+{
+ return (s->type == SIG_COORD);
+}
+
+static void
+set_custat(struct uni *uni, enum cu_stat nstate)
+{
+ if (uni->custat != nstate) {
+ uni->custat = nstate;
+ uni_undel(uni, cufilt, NULL);
+ }
+}
+
+/*
+ * T309 timeout function
+ */
+static void
+t309_func(struct uni *uni)
+{
+ uni_enq_coord(uni, SIGO_T309, 0, NULL);
+}
+
+/*
+ * Respond with a status message
+ */
+void
+uni_respond_status(struct uni *uni, struct uni_cref *cref,
+ enum uni_callstate cs, enum uni_cause c1)
+{
+ struct uni_all *resp;
+
+ if ((resp = UNI_ALLOC()) == NULL)
+ return;
+
+ MK_MSG_RESP(resp, UNI_STATUS, cref);
+ MK_IE_CALLSTATE(resp->u.status.callstate, cs);
+ MK_IE_CAUSE(resp->u.status.cause, UNI_CAUSE_LOC_USER, c1);
+
+ (void)uni_send_output(resp, uni);
+
+ UNI_FREE(resp);
+}
+
+/*
+ * Respond with a status message
+ */
+void
+uni_respond_status_mtype(struct uni *uni, struct uni_cref *cref,
+ enum uni_callstate cs, enum uni_cause c1, u_int mtype)
+{
+ struct uni_all *resp;
+
+ if((resp = UNI_ALLOC()) == NULL)
+ return;
+
+ MK_MSG_RESP(resp, UNI_STATUS, cref);
+ MK_IE_CALLSTATE(resp->u.status.callstate, cs);
+ MK_IE_CAUSE(resp->u.status.cause, UNI_CAUSE_LOC_USER, c1);
+ ADD_CAUSE_MTYPE(resp->u.status.cause, mtype);
+
+ (void)uni_send_output(resp, uni);
+
+ UNI_FREE(resp);
+}
+
+/*
+ * Send a message. If we are in CUSTAT1, delay the message if we
+ * are in CUSTAT3 send it, else drop it.
+ */
+int
+uni_send_output(struct uni_all *u, struct uni *uni)
+{
+ struct uni_msg *m;
+ int err;
+
+ if (uni->custat == CU_STAT0 || uni->custat == CU_STAT2)
+ return (0);
+
+ m = uni_msg_alloc(1024);
+ if ((err = uni_encode(m, u, &uni->cx)) != 0) {
+ VERBOSE0(uni, UNI_FAC_ERR, "uni_encode failed: %08x", err);
+ uni_msg_destroy(m);
+ return (-1);
+ }
+ if (uni->custat == CU_STAT1)
+ uni_delenq_coord(uni, SIGO_DATA, 0, m);
+ else
+ uni->funcs->saal_output(uni, uni->arg, SAAL_DATA_request, m);
+ return (0);
+}
diff --git a/sys/contrib/ngatm/netnatm/sig/sig_party.c b/sys/contrib/ngatm/netnatm/sig/sig_party.c
new file mode 100644
index 0000000..f9d5cd0
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/sig_party.c
@@ -0,0 +1,1353 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/sig/sig_party.c,v 1.18 2004/08/05 07:11:01 brandt Exp $
+ *
+ * Party instance handling
+ */
+
+#include <netnatm/unimsg.h>
+#include <netnatm/saal/sscfudef.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/sig/uni.h>
+
+#include <netnatm/sig/unipriv.h>
+#include <netnatm/sig/unimkmsg.h>
+#include <netnatm/sig/unimsgcpy.h>
+
+static void drop_partyE(struct party *p);
+static int epstate_compat(struct party *, enum uni_epstate);
+
+#define DEF_PRIV_SIG(NAME, FROM) [SIG##NAME] = "SIG"#NAME,
+static const char *const party_sigs[] = {
+ DEF_PARTY_SIGS
+};
+#undef DEF_PRIV_SIG
+
+TIMER_FUNC_PARTY(t397, t397_func)
+TIMER_FUNC_PARTY(t398, t398_func)
+TIMER_FUNC_PARTY(t399, t399_func)
+
+static __inline void
+set_party_state(struct party *p, enum uni_epstate state)
+{
+ if (p->state != state) {
+ VERBOSE(p->call->uni, UNI_FAC_CALL, 1,
+ "party %u/%u %u/%u PU%u -> PU%u",
+ p->call->cref, p->call->mine,
+ p->epref, p->flags & PARTY_MINE, p->state, state);
+ p->state = state;
+ }
+}
+
+/*
+ * Create a party with a given endpoint reference.
+ * No check is done, that a party with this epref does not alreay exist.
+ */
+struct party *
+uni_create_partyx(struct call *c, u_int epref, u_int mine, uint32_t cookie)
+{
+ struct party *p;
+ struct uni_msg *api;
+ struct uniapi_party_created *ind;
+
+ mine = (mine ? PARTY_MINE : 0);
+
+ if ((p = PARTY_ALLOC()) == NULL)
+ return (NULL);
+
+ if ((ind = ALLOC_API(struct uniapi_party_created, api)) == NULL) {
+ PARTY_FREE(p);
+ return (NULL);
+ }
+
+ ind->cref.cref = c->cref;
+ ind->cref.flag = c->mine;
+ MK_IE_EPREF(ind->epref, epref, mine);
+ ind->epref.h.act = UNI_IEACT_DEFAULT;
+
+ p->call = c;
+ p->epref = epref;
+ p->flags = mine;
+ p->state = UNI_EPSTATE_NULL;;
+
+ TIMER_INIT_PARTY(p, t397);
+ TIMER_INIT_PARTY(p, t398);
+ TIMER_INIT_PARTY(p, t399);
+
+ TAILQ_INSERT_HEAD(&c->parties, p, link);
+
+ c->uni->funcs->uni_output(c->uni, c->uni->arg,
+ UNIAPI_PARTY_CREATED, cookie, api);
+
+ VERBOSE(c->uni, UNI_FAC_CALL, 1, "created party %u/%s %u/%s",
+ p->call->cref, p->call->mine ? "mine" : "his",
+ p->epref, (p->flags & PARTY_MINE) ? "mine" : "his");
+
+ return (p);
+
+}
+
+struct party *
+uni_create_party(struct call *c, struct uni_ie_epref *epref)
+{
+ return (uni_create_partyx(c, epref->epref, epref->flag, 0));
+}
+
+struct party *
+uni_find_party(struct call *c, struct uni_ie_epref *epref)
+{
+ struct party *p;
+
+ TAILQ_FOREACH(p, &c->parties, link)
+ if (p->epref == epref->epref &&
+ (!(p->flags & PARTY_MINE) == !epref->flag))
+ return (p);
+ return (NULL);
+}
+struct party *
+uni_find_partyx(struct call *c, u_int epref, u_int mine)
+{
+ struct party *p;
+
+ TAILQ_FOREACH(p, &c->parties, link)
+ if (p->epref == epref && (!(p->flags & PARTY_MINE) == !mine))
+ return (p);
+ return (NULL);
+}
+
+/*
+ * Destroy a party.
+ * This function is assumed to remove the party from the parent's call
+ * party list.
+ */
+void
+uni_destroy_party(struct party *p, int really)
+{
+ struct uni_msg *api;
+ struct uniapi_party_destroyed *ind;
+
+ TIMER_DESTROY_PARTY(p, t397);
+ TIMER_DESTROY_PARTY(p, t398);
+ TIMER_DESTROY_PARTY(p, t399);
+
+ TAILQ_REMOVE(&p->call->parties, p, link);
+
+ uni_delsig(p->call->uni, SIG_PARTY, p->call, p);
+
+ if (!really) {
+ ind = ALLOC_API(struct uniapi_party_destroyed, api);
+ if (ind != NULL) {
+ ind->cref.cref = p->call->cref;
+ ind->cref.flag = p->call->mine;
+ ind->epref.epref = p->epref;
+ ind->epref.flag = p->flags & PARTY_MINE;
+ ind->epref.h.act = UNI_IEACT_DEFAULT;
+ IE_SETPRESENT(ind->epref);
+
+ uni_enq_call(p->call, SIGC_PARTY_DESTROYED, 0, api, NULL);
+ }
+
+ uni_enq_party(p, SIGP_PARTY_DELETE, 0, NULL, NULL);
+ return;
+ }
+ PARTY_FREE(p);
+}
+
+/*
+ * Count number of parties in active states.
+ * If the argument is 0 only ACTIVE parties are counter
+ * If the argument is 1 only parties in establishing states are counted
+ * If the argument is 2 both are counted.
+ */
+u_int
+uni_party_act_count(struct call *c, int kind)
+{
+ struct party *p;
+ u_int cnt;
+
+ cnt = 0;
+ TAILQ_FOREACH(p, &c->parties, link) {
+ switch (p->state) {
+
+ case UNI_EPSTATE_ACTIVE:
+ if (kind == 0 || kind == 2)
+ cnt++;
+ break;
+
+ case UNI_EPSTATE_ALERT_RCVD:
+ case UNI_EPSTATE_ADD_INIT:
+ case UNI_EPSTATE_ALERT_DLVD:
+ case UNI_EPSTATE_ADD_RCVD:
+ if (kind == 1 || kind == 2)
+ cnt++;
+ break;
+
+ default:
+ break;
+ }
+ }
+ return (cnt);
+}
+
+static void
+stop_all_party_timers(struct party *p)
+{
+ TIMER_STOP_PARTY(p, t397);
+ TIMER_STOP_PARTY(p, t398);
+ TIMER_STOP_PARTY(p, t399);
+}
+/************************************************************/
+
+/*
+ * Add-party.request
+ *
+ * Q.2971:Party-control-U 3 (PU0)
+ * Q.2971:Party-control-N 3 (PN0)
+ */
+static void
+pun0_add_party_request(struct party *p, struct uni_msg *api, uint32_t cookie)
+{
+ struct uni_all *add;
+ struct uniapi_add_party_request *req =
+ uni_msg_rptr(api, struct uniapi_add_party_request *);
+
+ if ((add = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(api);
+ uniapi_party_error(p, UNIAPI_ERROR_NOMEM, cookie);
+ return;
+ }
+
+ add->u.add_party = req->add;
+ MK_MSG_ORIG(add, UNI_ADD_PARTY, p->call->cref, !p->call->mine);
+ uni_send_output(add, p->call->uni);
+ UNI_FREE(add);
+
+ TIMER_START_PARTY(p, t399, p->call->uni->timer399);
+
+ set_party_state(p, UNI_EPSTATE_ADD_INIT);
+
+ uni_msg_destroy(api);
+ uniapi_party_error(p, UNIAPI_OK, cookie);
+}
+
+/*
+ * Add-party-ack.request
+ *
+ * Q.2971:Party-Control-U 6 PU2
+ * Q.2971:Party-Control-U 7 PU3
+ * Q.2971:Party-Control-N 6 PN2
+ * Q.2971:Party-Control-N 7 PN3
+ */
+static void
+punx_add_party_ack_request(struct party *p, struct uni_msg *m, uint32_t cookie)
+{
+ struct uni_all *ack;
+ struct uniapi_add_party_ack_request *req =
+ uni_msg_rptr(m, struct uniapi_add_party_ack_request *);
+
+ if ((ack = UNI_ALLOC()) == NULL) {
+ uniapi_party_error(p, UNIAPI_ERROR_NOMEM, cookie);
+ uni_msg_destroy(m);
+ return;
+ }
+ ack->u.add_party_ack = req->ack;
+ MK_MSG_ORIG(ack, UNI_ADD_PARTY_ACK, p->call->cref, !p->call->mine);
+ uni_send_output(ack, p->call->uni);
+ UNI_FREE(ack);
+
+ set_party_state(p, UNI_EPSTATE_ACTIVE);
+
+ uni_msg_destroy(m);
+ uniapi_party_error(p, UNIAPI_OK, cookie);
+}
+
+/*
+ * Add-party-rej.request
+ *
+ * Q.2971:Party-Control-U 6 PU2
+ * Q.2971:Party-Control-N 6 PN2
+ */
+static void
+pun2_add_party_rej_request(struct party *p, struct uni_msg *m, uint32_t cookie)
+{
+ struct uni_all *rej;
+ struct uniapi_add_party_rej_request *req =
+ uni_msg_rptr(m, struct uniapi_add_party_rej_request *);
+
+ if ((rej = UNI_ALLOC()) == NULL) {
+ uniapi_party_error(p, UNIAPI_ERROR_NOMEM, cookie);
+ uni_msg_destroy(m);
+ return;
+ }
+
+ stop_all_party_timers(p);
+
+ rej->u.add_party_rej = req->rej;
+ MK_MSG_ORIG(rej, UNI_ADD_PARTY_REJ, p->call->cref, !p->call->mine);
+ uni_enq_call(p->call, SIGC_SEND_ADD_PARTY_REJ, cookie, NULL, rej);
+
+ uni_msg_destroy(m);
+ p->state = UNI_EPSTATE_NULL;
+ uniapi_party_error(p, UNIAPI_OK, cookie);
+
+ uni_destroy_party(p, 0);
+}
+
+/*
+ * ADD PARTY in PU0, PN0
+ *
+ * Q.2971:Party-Control-U 3/14 PU0
+ */
+static void
+pun0_add_party(struct party *p, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_add_party_indication *ind;
+ struct uni_msg *api;
+
+ ind = ALLOC_API(struct uniapi_add_party_indication, api);
+ if (ind != NULL) {
+ ind->add.hdr = u->u.hdr;
+ copy_msg_add_party(&u->u.add_party, &ind->add);
+ p->call->uni->funcs->uni_output(p->call->uni, p->call->uni->arg,
+ UNIAPI_ADD_PARTY_indication, 0, api);
+ }
+ set_party_state(p, UNI_EPSTATE_ADD_RCVD);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * PARTY-ALERTING.request
+ *
+ * Q.2971:Party-Control-U 6 (PU2)
+ * Q.2971:Party-Control-N 6 (PN2)
+ */
+static void
+pun2_party_alerting_request(struct party *p, struct uni_msg *api,
+ uint32_t cookie)
+{
+ struct uni_all *alert;
+ struct uniapi_party_alerting_request *req =
+ uni_msg_rptr(api, struct uniapi_party_alerting_request *);
+
+ if ((alert = UNI_ALLOC()) == NULL) {
+ uniapi_party_error(p, UNIAPI_ERROR_NOMEM, cookie);
+ uni_msg_destroy(api);
+ return;
+ }
+ alert->u.party_alerting = req->alert;
+ MK_MSG_ORIG(alert, UNI_PARTY_ALERTING,
+ p->call->cref, !p->call->mine);
+ uni_send_output(alert, p->call->uni);
+ UNI_FREE(alert);
+
+ set_party_state(p, UNI_EPSTATE_ALERT_DLVD);
+
+ uni_msg_destroy(api);
+ uniapi_party_error(p, UNIAPI_OK, cookie);
+}
+
+/*
+ * PARTY-ALERTING in state PU1/PN1
+ *
+ * Q.2971:Party-Control-U 14
+ * Q.2971:Party-Control-N 5
+ */
+static void
+pun1_party_alerting(struct party *p, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_party_alerting_indication *ind;
+ struct uni_msg *api;
+
+ ind = ALLOC_API(struct uniapi_party_alerting_indication, api);
+ if (ind == NULL) {
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+ TIMER_STOP_PARTY(p, t399);
+
+ ind->alert.hdr = u->u.hdr;
+ copy_msg_party_alerting(&u->u.party_alerting, &ind->alert);
+
+ p->call->uni->funcs->uni_output(p->call->uni, p->call->uni->arg,
+ UNIAPI_PARTY_ALERTING_indication, 0, api);
+
+ TIMER_START_PARTY(p, t397, p->call->uni->timer397);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ set_party_state(p, UNI_EPSTATE_ALERT_RCVD);
+}
+
+/*
+ * ADD-PARTY-ACK
+ *
+ * Q.2971:Party-Control-U 4 (PU1)
+ * Q.2971:Party-Control-U 7 (PU4)
+ * Q.2971:Party-Control-N 4 (PN1)
+ * Q.2971:Party-Control-N 7 (PN4)
+ */
+static void
+pun1pun4_add_party_ack(struct party *p, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_add_party_ack_indication *ind;
+ struct uni_msg *api;
+
+ ind = ALLOC_API(struct uniapi_add_party_ack_indication, api);
+ if (ind == NULL) {
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ if (p->state == UNI_EPSTATE_ADD_INIT)
+ TIMER_STOP_PARTY(p, t399);
+ else
+ TIMER_STOP_PARTY(p, t397);
+
+ ind->ack.hdr = u->u.hdr;
+ copy_msg_add_party_ack(&u->u.add_party_ack, &ind->ack);
+
+ p->call->uni->funcs->uni_output(p->call->uni, p->call->uni->arg,
+ UNIAPI_ADD_PARTY_ACK_indication, 0, api);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ set_party_state(p, UNI_EPSTATE_ACTIVE);
+}
+
+/*
+ * ADD-PARTY-REJECT
+ *
+ * Q.2971:Party-Control-U 4 (PU1)
+ * Q.2971:Party-Control-N 4 (PN1)
+ */
+static void
+pun1_add_party_rej(struct party *p, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_add_party_rej_indication *ind;
+ struct uni_msg *api;
+
+ ind = ALLOC_API(struct uniapi_add_party_rej_indication, api);
+ if (ind == NULL) {
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ TIMER_STOP_PARTY(p, t399);
+
+ ind->rej.hdr = u->u.hdr;
+ copy_msg_add_party_rej(&u->u.add_party_rej, &ind->rej);
+ uni_enq_call(p->call, SIGC_ADD_PARTY_REJ_indication, 0, api, NULL);
+
+ uni_destroy_party(p, 0);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * ADD-PARTY-REJECT
+ *
+ * Q.2971:Party-Control-U 10 (PU5)
+ * Q.2971:Party-Control-N 10 (PN5)
+ */
+static void
+pun5_add_party_rej(struct party *p, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_drop_party_ack_indication *ind;
+ struct uni_msg *api;
+
+ ind = ALLOC_API(struct uniapi_drop_party_ack_indication, api);
+ if (ind == NULL) {
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ ind->drop.hdr = u->u.hdr;
+ COPY_FROM_ADD_REJ(u, &ind->drop);
+ if (IE_ISGOOD(u->u.add_party_rej.crankback))
+ ind->crankback = u->u.add_party_rej.crankback;
+ uni_enq_call(p->call, SIGC_DROP_PARTY_ACK_indication, 0, api, NULL);
+
+ TIMER_STOP_PARTY(p, t398);
+
+ uni_destroy_party(p, 0);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * DROP-PARTY-ACKNOWLEDGE
+ *
+ * Q.2971:Party-Control-U 8
+ * Q.2971:Party-Control-N 8
+ *
+ * Message already verified in Call-Control!
+ */
+static void
+punx_drop_party_ack(struct party *p, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_drop_party_ack_indication *ind;
+ struct uni_msg *api;
+
+ stop_all_party_timers(p);
+
+ ind = ALLOC_API(struct uniapi_drop_party_ack_indication, api);
+ if (ind != NULL) {
+ ind->drop.hdr = u->u.hdr;
+ COPY_FROM_DROP_ACK(u, &ind->drop);
+ uni_enq_call(p->call, SIGC_DROP_PARTY_ACK_indication,
+ 0, api, NULL);
+ }
+
+ uni_destroy_party(p, 0);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * DROP PARTY message in any state except PU5/PN5
+ *
+ * Q.2971:Party-Control-U 9
+ * Q.2971:Party-Control-N 9
+ */
+static void
+punx_drop_party(struct party *p, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_drop_party_indication *ind;
+ struct uni_msg *api;
+
+ ind = ALLOC_API(struct uniapi_drop_party_indication, api);
+ if (ind == NULL) {
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ ind->drop.hdr = u->u.hdr;
+ copy_msg_drop_party(&u->u.drop_party, &ind->drop);
+
+ /* need the cause even if it is bad */
+ if (IE_ISERROR(u->u.drop_party.cause))
+ ind->drop.cause = u->u.drop_party.cause;
+
+ ind->my_cause = p->call->uni->cause;
+
+ uni_enq_call(p->call, SIGC_DROP_PARTY_indication, 0, api, NULL);
+
+ TIMER_STOP_PARTY(p, t397);
+ TIMER_STOP_PARTY(p, t399);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ set_party_state(p, UNI_EPSTATE_DROP_RCVD);
+}
+
+/*
+ * DROP PARTY message in state PU5/PN5
+ *
+ * Q.2971:Party-Control-U 10
+ * Q.2971:Party-Control-N 10
+ */
+static void
+pun5_drop_party(struct party *p, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_drop_party_ack_indication *ind;
+ struct uni_msg *api;
+
+ ind = ALLOC_API(struct uniapi_drop_party_ack_indication, api);
+ if (ind == NULL) {
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ return;
+ }
+
+ ind->drop.hdr = u->u.hdr;
+ copy_msg_drop_party(&u->u.drop_party, &ind->drop);
+
+ /* need the cause even if it is bad */
+ if (IE_ISERROR(u->u.drop_party.cause))
+ ind->drop.cause = u->u.drop_party.cause;
+
+ uni_enq_call(p->call, SIGC_DROP_PARTY_ACK_indication, 0, api, NULL);
+
+ TIMER_STOP_PARTY(p, t398);
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+
+ set_party_state(p, UNI_EPSTATE_DROP_RCVD);
+
+ uni_destroy_party(p, 0);
+}
+
+/************************************************************/
+
+/*
+ * T399
+ *
+ * Q.2971:Party-Control-U 4 (PU1)
+ * Q.2971:Party-Control-N 4 (PN1)
+ */
+static void
+pun1_t399(struct party *p)
+{
+ if (p->call->uni->proto == UNIPROTO_UNI40N) {
+ MK_IE_CAUSE(p->call->uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_NO_RESPONSE);
+ } else {
+ MK_IE_CAUSE(p->call->uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_RECOVER);
+ ADD_CAUSE_TIMER(p->call->uni->cause, "399");
+ }
+
+ drop_partyE(p);
+}
+
+/*
+ * T398
+ *
+ * Q.2971:Party-Control-U 10 (PU5)
+ * Q.2971:Party-Control-N 10 (PN5)
+ */
+static void
+pun5_t398(struct party *p)
+{
+ struct uniapi_drop_party_ack_indication *ind;
+ struct uni_all *drop;
+ struct uni_msg *api;
+
+ MK_IE_CAUSE(p->call->uni->cause,
+ UNI_CAUSE_LOC_USER, UNI_CAUSE_RECOVER);
+ ADD_CAUSE_TIMER(p->call->uni->cause, "398");
+ /*
+ * Send indication to API
+ */
+ ind = ALLOC_API(struct uniapi_drop_party_ack_indication, api);
+ if (ind != NULL) {
+ ind->drop.hdr.cref.cref = p->call->cref;
+ ind->drop.hdr.cref.flag = p->call->mine;
+ ind->drop.hdr.act = UNI_MSGACT_DEFAULT;
+ MK_IE_EPREF(ind->drop.epref, p->epref, p->flags & PARTY_MINE);
+ ind->drop.cause = p->call->uni->cause;
+ uni_enq_call(p->call, SIGC_DROP_PARTY_ACK_indication,
+ 0, api, NULL);
+ }
+
+ /*
+ * Send DROP PARTY ACK
+ */
+ if ((drop = UNI_ALLOC()) != NULL) {
+ MK_MSG_ORIG(drop, UNI_DROP_PARTY_ACK,
+ p->call->cref, !p->call->mine);
+ MK_IE_EPREF(drop->u.drop_party_ack.epref,
+ p->epref, !(p->flags & PARTY_MINE));
+ drop->u.drop_party_ack.cause = p->call->uni->cause;
+ uni_enq_call(p->call, SIGC_SEND_DROP_PARTY_ACK, 0, NULL, drop);
+ }
+
+ uni_destroy_party(p, 0);
+}
+
+/*
+ * T397
+ *
+ * Q.2971:Party-Control-U 7 (PU4)
+ * Q.2971:Party-Control-N 7 (PN4)
+ */
+static void
+pun4_t397(struct party *p)
+{
+ MK_IE_CAUSE(p->call->uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_RECOVER);
+ ADD_CAUSE_TIMER(p->call->uni->cause, "397");
+
+ drop_partyE(p);
+}
+
+/************************************************************/
+
+/*
+ * Drop a party because of an error condition.
+ * This is label E on page Party-Control-U 8/14.
+ *
+ * It is assumed, that the caller has constructed the cause in
+ * p->call->uni->cause.
+ */
+static void
+drop_partyE(struct party *p)
+{
+ struct uni_msg *api;
+ struct uniapi_drop_party_indication *ind;
+ struct uni_all *drop;
+
+ /*
+ * Send indication to API
+ */
+ if ((ind = ALLOC_API(struct uniapi_drop_party_indication, api)) != NULL) {
+ ind->drop.hdr.cref.cref = p->call->cref;
+ ind->drop.hdr.cref.flag = p->call->mine;
+ ind->drop.hdr.act = UNI_MSGACT_DEFAULT;
+ MK_IE_EPREF(ind->drop.epref, p->epref, p->flags & PARTY_MINE);
+ ind->drop.cause = p->call->uni->cause;
+ uni_enq_call(p->call, SIGC_DROP_PARTY_indication, 0, api, NULL);
+ }
+ TIMER_STOP_PARTY(p, t399);
+ TIMER_STOP_PARTY(p, t397);
+ TIMER_START_PARTY(p, t398, p->call->uni->timer398);
+
+ if ((drop = UNI_ALLOC()) != NULL) {
+ drop->u.drop_party.cause = p->call->uni->cause;
+ MK_MSG_ORIG(drop, UNI_DROP_PARTY, p->call->cref, !p->call->mine);
+ MK_IE_EPREF(drop->u.drop_party.epref, p->epref,
+ !(p->flags & PARTY_MINE));
+ uni_enq_call(p->call, SIGC_SEND_DROP_PARTY, 0, NULL, drop);
+ }
+
+ set_party_state(p, UNI_EPSTATE_DROP_INIT);
+}
+
+/*
+ * Drop party request in Px1, Px3, Px4 or Px7
+ *
+ * Q.2971:Party-Control-U 8
+ * Q.2971:Party-Control-N 8
+ */
+static void
+punx_drop_party_request(struct party *p, struct uni_msg *api, uint32_t cookie)
+{
+ struct uniapi_drop_party_request *req =
+ uni_msg_rptr(api, struct uniapi_drop_party_request *);
+ struct uni_all *drop;
+
+ if ((drop = UNI_ALLOC()) == NULL) {
+ uniapi_party_error(p, UNIAPI_ERROR_NOMEM, cookie);
+ uni_msg_destroy(api);
+ return;
+ }
+
+ TIMER_STOP_PARTY(p, t399);
+ TIMER_STOP_PARTY(p, t397);
+ TIMER_START_PARTY(p, t398, p->call->uni->timer398);
+
+ drop->u.drop_party = req->drop;
+ MK_MSG_ORIG(drop, UNI_DROP_PARTY, p->call->cref, !p->call->mine);
+ uni_enq_call(p->call, SIGC_SEND_DROP_PARTY, cookie, NULL, drop);
+
+ set_party_state(p, UNI_EPSTATE_DROP_INIT);
+
+ uni_msg_destroy(api);
+ uniapi_party_error(p, UNIAPI_OK, cookie);
+}
+
+/*
+ * Drop-party-ack.request in Px6
+ *
+ * Q.2971:Party-Control-U 9
+ * Q.2971:Party-Control-N 9
+ */
+static void
+pun6_drop_party_ack_request(struct party *p, struct uni_msg *api, uint32_t cookie)
+{
+ struct uniapi_drop_party_ack_request *req =
+ uni_msg_rptr(api, struct uniapi_drop_party_ack_request *);
+ struct uni_all *ack;
+
+ if ((ack = UNI_ALLOC()) == NULL) {
+ uni_msg_destroy(api);
+ uniapi_party_error(p, UNIAPI_ERROR_NOMEM, cookie);
+ return;
+ }
+ ack->u.drop_party_ack = req->ack;
+ MK_MSG_ORIG(ack, UNI_DROP_PARTY_ACK, p->call->cref, !p->call->mine);
+ uni_enq_call(p->call, SIGC_SEND_DROP_PARTY_ACK, cookie, NULL, ack);
+
+ stop_all_party_timers(p);
+
+ uni_msg_destroy(api);
+ uniapi_party_error(p, UNIAPI_OK, cookie);
+
+ uni_destroy_party(p, 0);
+}
+/************************************************************/
+/*
+ * Party status enquiry request from API or call-control
+ *
+ * Q.2971:Party-Control-U 12
+ * Q.2971:Party-Control-N 12
+ */
+static void
+punx_status_enquiry_request(struct party *p, uint32_t cookie)
+{
+ struct uni_all *enq;
+
+ if((enq = UNI_ALLOC()) == NULL) {
+ uniapi_party_error(p, UNIAPI_ERROR_NOMEM, cookie);
+ return;
+ }
+ MK_IE_EPREF(enq->u.status_enq.epref, p->epref,
+ !(p->flags & PARTY_MINE));
+ MK_MSG_ORIG(enq, UNI_STATUS_ENQ, p->call->cref, !p->call->mine);
+ uni_enq_call(p->call, SIGC_SEND_STATUS_ENQ, cookie, NULL, enq);
+
+ uniapi_party_error(p, UNIAPI_OK, cookie);
+}
+
+/*
+ * STATUS in any state except PU5/PN5
+ *
+ * Q.2971:Party-Control-U 12
+ * Q.2971:Party-Control-N 12
+ */
+static void
+punx_status(struct party *p, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_drop_party_ack_indication *ind;
+ struct uni_msg *api;
+
+ if (u->u.status.epstate.state == UNI_EPSTATE_NULL) {
+ /* should not happend */
+ ind = ALLOC_API(struct uniapi_drop_party_ack_indication, api);
+ if (ind != NULL) {
+ ind->drop.hdr = u->u.hdr;
+ ind->drop.cause = u->u.status.cause;
+ ind->drop.epref = u->u.status.epref;
+ uni_enq_call(p->call, SIGC_DROP_PARTY_ACK_indication,
+ 0, api, NULL);
+ }
+ stop_all_party_timers(p);
+
+ uni_destroy_party(p, 0);
+ } else {
+ if (epstate_compat(p, u->u.status.epstate.state)) {
+ if(u->u.status.cause.cause == UNI_CAUSE_MANDAT ||
+ u->u.status.cause.cause == UNI_CAUSE_MTYPE_NIMPL ||
+ u->u.status.cause.cause == UNI_CAUSE_IE_NIMPL ||
+ u->u.status.cause.cause == UNI_CAUSE_IE_INV) {
+ MK_IE_CAUSE(p->call->uni->cause,
+ UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_UNSPEC);
+ drop_partyE(p);
+ }
+ } else {
+ MK_IE_CAUSE(p->call->uni->cause,
+ UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_MSG_INCOMP);
+ drop_partyE(p);
+ }
+ }
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/*
+ * STATUS in PU5/PN5
+ *
+ * Q.2971:Party-Control-U 10
+ * Q.2971:Party-Control-N 10
+ */
+static void
+pun5_status(struct party *p, struct uni_msg *m, struct uni_all *u)
+{
+ struct uniapi_drop_party_ack_indication *ind;
+ struct uni_msg *api;
+
+ if (u->u.status.epstate.state == UNI_EPSTATE_NULL) {
+ ind = ALLOC_API(struct uniapi_drop_party_ack_indication, api);
+ if (ind != NULL) {
+ ind->drop.hdr = u->u.hdr;
+ ind->drop.cause = u->u.status.cause;
+ ind->drop.epref = u->u.status.epref;
+ uni_enq_call(p->call, SIGC_DROP_PARTY_ACK_indication,
+ 0, api, NULL);
+ }
+ TIMER_STOP_PARTY(p, t398);
+
+ uni_destroy_party(p, 0);
+ }
+
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+}
+
+/************************************************************/
+
+void
+uni_sig_party(struct party *p, enum party_sig sig, uint32_t cookie,
+ struct uni_msg *msg, struct uni_all *u)
+{
+ if (sig >= SIGP_END) {
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "Signal %d outside of range to Party-Control", sig);
+ if (msg)
+ uni_msg_destroy(msg);
+ if (u)
+ UNI_FREE(u);
+ return;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_CALL, 1,
+ "Signal %s in state %u of party %u/%s (call %u/%s in state %s)"
+ "; cookie %u", party_sigs[sig], p->state, p->epref,
+ (p->flags & PARTY_MINE) ? "mine" : "his", p->call->cref,
+ p->call->mine ? "mine" : "his", callstates[p->call->cstate].name,
+ cookie);
+
+ switch (sig) {
+
+ case SIGP_PARTY_DELETE:
+ PARTY_FREE(p);
+ break;
+
+ /*
+ * Messages
+ */
+ case SIGP_SETUP:
+ if (p->state == UNI_EPSTATE_NULL) {
+ /* Q.2971:Call-Control-U 3/13 */
+ /* Q.2971:Call-Control-N 3/13 */
+ set_party_state(p, UNI_EPSTATE_ADD_RCVD);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "SETUP in ps=%u", p->state);
+ break;
+
+ case SIGP_ALERTING:
+ if (p->state == UNI_EPSTATE_ADD_INIT) {
+ /* Q.2971:Call-Control-U 14 */
+ /* Q.2971:Call-Control-N 5 */
+ TIMER_START_PARTY(p, t397, p->call->uni->timer397);
+ set_party_state(p, UNI_EPSTATE_ALERT_RCVD);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "ALERTING in ps=%u", p->state);
+ break;
+
+ case SIGP_CONNECT:
+ if (p->state == UNI_EPSTATE_ADD_INIT) {
+ /* Q.2971:Call-Control-U 4/13 */
+ TIMER_STOP_PARTY(p, t399);
+ set_party_state(p, UNI_EPSTATE_ACTIVE);
+ break;
+ }
+ if (p->state == UNI_EPSTATE_ALERT_RCVD) {
+ /* Q.2971:Call-Control-U 7/13 */
+ TIMER_STOP_PARTY(p, t397);
+ set_party_state(p, UNI_EPSTATE_ACTIVE);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "CONNECT in ps=%u", p->state);
+ break;
+
+ case SIGP_CONNECT_ACK:
+ if (p->state == UNI_EPSTATE_ADD_RCVD ||
+ p->state == UNI_EPSTATE_ALERT_DLVD) {
+ /* Q.2971:Call-Control-U 6/13 */
+ /* Q.2971:Call-Control-U 7/13 */
+ p->flags &= ~PARTY_CONNECT;
+ set_party_state(p, UNI_EPSTATE_ACTIVE);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "CONNECT in ps=%u", p->state);
+ break;
+
+ case SIGP_RELEASE:
+ if (p->state == UNI_EPSTATE_DROP_INIT) {
+ /* Q.2971:Party-Control-U 10/14 */
+ /* Q.2971:Party-Control-N 10/14 */
+ TIMER_STOP_PARTY(p, t398);
+ uni_destroy_party(p, 0);
+ break;
+ }
+ /* Q.2971:Party-Control-U 11/14 */
+ /* Q.2971:Party-Control-N 11/14 */
+ TIMER_STOP_PARTY(p, t397);
+ TIMER_STOP_PARTY(p, t399);
+ uni_destroy_party(p, 0);
+ break;
+
+ case SIGP_RELEASE_COMPL:
+ /* Q.2971:Party-Control-U 11/14 */
+ /* Q.2971:Party-Control-N 11/14 */
+ stop_all_party_timers(p);
+ uni_destroy_party(p, 0);
+ break;
+
+ case SIGP_RELEASE_confirm:
+ /* not in the SDLs */
+ stop_all_party_timers(p);
+ uni_destroy_party(p, 0);
+ break;
+
+ case SIGP_RELEASE_request:
+ if (p->state == UNI_EPSTATE_DROP_INIT) {
+ /* Q.2971:Party-Control-U 10 */
+ /* Q.2971:Party-Control-N 10 */
+ uni_destroy_party(p, 0);
+ break;
+ }
+ /* Q.2971:Party-Control-U 11 */
+ /* Q.2971:Party-Control-N 11 */
+ TIMER_STOP_PARTY(p, t397);
+ TIMER_STOP_PARTY(p, t399);
+ uni_destroy_party(p, 0);
+ break;
+
+ case SIGP_RELEASE_response:
+ /* Q.2971:Party-Control-U 11 */
+ /* Q.2971:Party-Control-N 11 */
+ stop_all_party_timers(p);
+ uni_destroy_party(p, 0);
+ break;
+
+ case SIGP_ADD_PARTY:
+ if (p->state == UNI_EPSTATE_NULL) {
+ /* Q.2971:Party-Control-U 3 PU0 */
+ /* Q.2971:Party-Control-N 3 PN0 */
+ pun0_add_party(p, msg, u);
+ break;
+ }
+ if (p->state == UNI_EPSTATE_ADD_RCVD) {
+ /* Q.2971:Party-Control-U 6 PU2 */
+ /* Q.2971:Party-Control-N 6 PN2 */
+ uni_msg_destroy(msg);
+ UNI_FREE(u);
+ break;
+ }
+ uni_bad_message(p->call, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.add_party.epref, p->state);
+ uni_msg_destroy(msg);
+ UNI_FREE(u);
+ break;
+
+ case SIGP_PARTY_ALERTING:
+ if (p->state == UNI_EPSTATE_ADD_INIT) {
+ /* Q.2971:Party-Control-U 14 */
+ /* Q.2971:Party-Control-N 5 */
+ pun1_party_alerting(p, msg, u);
+ break;
+ }
+ uni_bad_message(p->call, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.party_alerting.epref, p->state);
+ uni_msg_destroy(msg);
+ UNI_FREE(u);
+ break;
+
+ case SIGP_ADD_PARTY_ACK:
+ if (p->state == UNI_EPSTATE_ADD_INIT ||
+ p->state == UNI_EPSTATE_ALERT_RCVD) {
+ /* Q.2971:Party-Control-U 4 (PU1) */
+ /* Q.2971:Party-Control-U 7 (PU4) */
+ /* Q.2971:Party-Control-N 4 (PN1) */
+ /* Q.2971:Party-Control-N 7 (PN4) */
+ pun1pun4_add_party_ack(p, msg, u);
+ break;
+ }
+ uni_bad_message(p->call, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.add_party_ack.epref, p->state);
+ uni_msg_destroy(msg);
+ UNI_FREE(u);
+ break;
+
+ case SIGP_ADD_PARTY_REJ:
+ if (p->state == UNI_EPSTATE_ADD_INIT) {
+ /* Q.2971:Party-Control-U 4 (PU1) */
+ /* Q.2971:Party-Control-N 4 (PN1) */
+ pun1_add_party_rej(p, msg, u);
+ break;
+ }
+ if (p->state == UNI_EPSTATE_DROP_INIT) {
+ /* Q.2971:Party-Control-U 10 (PU5) */
+ /* Q.2971:Party-Control-N 10 (PN5) */
+ pun5_add_party_rej(p, msg, u);
+ break;
+ }
+ uni_bad_message(p->call, u, UNI_CAUSE_MSG_INCOMP,
+ &u->u.add_party_rej.epref, p->state);
+ uni_msg_destroy(msg);
+ UNI_FREE(u);
+ break;
+
+ case SIGP_DROP_PARTY_ACK:
+ /* Q.2971:Party-Control-U 8 */
+ /* Q.2971:Party-Control-N 8 */
+ punx_drop_party_ack(p, msg, u);
+ break;
+
+ case SIGP_DROP_PARTY:
+ if (p->state == UNI_EPSTATE_DROP_INIT)
+ /* Q.2971:Party-Control-U 10 */
+ /* Q.2971:Party-Control-N 10 */
+ pun5_drop_party(p, msg, u);
+ else
+ /* Q.2971:Party-Control-U 9 */
+ /* Q.2971:Party-Control-N 9 */
+ punx_drop_party(p, msg, u);
+ break;
+
+ case SIGP_STATUS:
+ if (p->state == UNI_EPSTATE_DROP_INIT)
+ /* Q.2971:Party-Control-U 10 */
+ /* Q.2971:Party-Control-N 10 */
+ pun5_status(p, msg, u);
+ else
+ /* Q.2971:Party-Control-U 12 */
+ /* Q.2971:Party-Control-N 12 */
+ punx_status(p, msg, u);
+ break;
+
+ /*
+ * User
+ */
+ case SIGP_SETUP_request:
+ if (p->state == UNI_EPSTATE_NULL) {
+ /* Q.2971:Party-Control-U 3 */
+ /* Q.2971:Party-Control-N 3 */
+ set_party_state(p, UNI_EPSTATE_ADD_INIT);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "SETUP.request in ps=%u", p->state);
+ uniapi_party_error(p, UNIAPI_ERROR_BAD_EPSTATE, cookie);
+ break;
+
+ case SIGP_SETUP_response:
+ if (p->state == UNI_EPSTATE_ADD_RCVD ||
+ p->state == UNI_EPSTATE_ALERT_DLVD) {
+ /* Q.2971:Party-Control-N 6 (PN2) */
+ /* Q.2971:Party-Control-N 7 (PN3) */
+ set_party_state(p, UNI_EPSTATE_ACTIVE);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "SETUP.response in ps=%u", p->state);
+ uniapi_party_error(p, UNIAPI_ERROR_BAD_EPSTATE, cookie);
+ break;
+
+ case SIGP_SETUP_COMPL_request:
+ if (p->state == UNI_EPSTATE_ADD_INIT) {
+ /* Q.2971:Party-Control-N 4 */
+ TIMER_STOP_PARTY(p, t399);
+ set_party_state(p, UNI_EPSTATE_ACTIVE);
+ break;
+ }
+ if (p->state == UNI_EPSTATE_ALERT_RCVD) {
+ /* Q.2971:Party-Control-N 7 */
+ TIMER_STOP_PARTY(p, t397);
+ set_party_state(p, UNI_EPSTATE_ACTIVE);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "SETUP_COMPL.request in ps=%u", p->state);
+ uniapi_party_error(p, UNIAPI_ERROR_BAD_EPSTATE, cookie);
+ break;
+
+ case SIGP_ADD_PARTY_request:
+ if (p->state == UNI_EPSTATE_NULL) {
+ /* Q.2971:Party-control-U 3 (PU0) */
+ /* Q.2971:Party-control-N 3 (PN0) */
+ pun0_add_party_request(p, msg, cookie);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "Add-party.request in ps=%u", p->state);
+ uniapi_party_error(p, UNIAPI_ERROR_BAD_EPSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGP_ALERTING_request:
+ /* Q.2971:Party-Control-U 6 (PU2) */
+ /* Q.2971:Party-Control-N 6 (PN2) */
+ set_party_state(p, UNI_EPSTATE_ALERT_DLVD);
+ break;
+
+ case SIGP_PARTY_ALERTING_request:
+ if (p->state == UNI_EPSTATE_ADD_RCVD) {
+ /* Q.2971:Party-Control-U 6 (PU2) */
+ /* Q.2971:Party-Control-N 6 (PN2) */
+ pun2_party_alerting_request(p, msg, cookie);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "Party-alerting.request in ps=%u", p->state);
+ uniapi_party_error(p, UNIAPI_ERROR_BAD_EPSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGP_ADD_PARTY_ACK_request:
+ if (p->state == UNI_EPSTATE_ADD_RCVD ||
+ p->state == UNI_EPSTATE_ALERT_DLVD) {
+ /* Q.2971:Party-Control-U 6 PU2 */
+ /* Q.2971:Party-Control-U 7 PU3 */
+ /* Q.2971:Party-Control-N 6 PN2 */
+ /* Q.2971:Party-Control-N 7 PN3 */
+ punx_add_party_ack_request(p, msg, cookie);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "Add-party-ack.request in ps=%u", p->state);
+ uniapi_party_error(p, UNIAPI_ERROR_BAD_EPSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGP_ADD_PARTY_REJ_request:
+ if (p->state == UNI_EPSTATE_ADD_RCVD) {
+ /* Q.2971:Party-Control-U 6 PU2 */
+ /* Q.2971:Party-Control-N 6 PN2 */
+ pun2_add_party_rej_request(p, msg, cookie);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "Add-party-rej.request in ps=%u", p->state);
+ uniapi_party_error(p, UNIAPI_ERROR_BAD_EPSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGP_DROP_PARTY_request:
+ if (p->state == UNI_EPSTATE_ADD_INIT ||
+ p->state == UNI_EPSTATE_ALERT_DLVD ||
+ p->state == UNI_EPSTATE_ALERT_RCVD ||
+ p->state == UNI_EPSTATE_ACTIVE) {
+ /* Q.2971:Party-Control-U 8 */
+ /* Q.2971:Party-Control-N 8 */
+ punx_drop_party_request(p, msg, cookie);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "Drop-party.request in ps=%u", p->state);
+ uniapi_party_error(p, UNIAPI_ERROR_BAD_EPSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGP_DROP_PARTY_ACK_request:
+ if (p->state == UNI_EPSTATE_DROP_RCVD) {
+ /* Q.2971:Party-Control-U 9 */
+ /* Q.2971:Party-Control-N 9 */
+ pun6_drop_party_ack_request(p, msg, cookie);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "Drop-party-ack.request in ps=%u", p->state);
+ uniapi_party_error(p, UNIAPI_ERROR_BAD_EPSTATE, cookie);
+ uni_msg_destroy(msg);
+ break;
+
+ case SIGP_STATUS_ENQUIRY_request:
+ /* Q.2971:Party-Control-U 12 */
+ /* Q.2971:Party-Control-N 12 */
+ punx_status_enquiry_request(p, cookie);
+ break;
+
+ /*
+ * Timers
+ */
+ case SIGP_T397:
+ if (p->state == UNI_EPSTATE_ALERT_RCVD) {
+ /* Q.2971:Party-Control-U 7 (PU4) */
+ /* Q.2971:Party-Control-N 7 (PN4) */
+ pun4_t397(p);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "T397 in ps=%u", p->state);
+ break;
+
+ case SIGP_T398:
+ if (p->state == UNI_EPSTATE_DROP_INIT) {
+ /* Q.2971:Party-Control-U 10 (PU5) */
+ /* Q.2971:Party-Control-N 10 (PN5) */
+ pun5_t398(p);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "T398 in ps=%u", p->state);
+ break;
+
+ case SIGP_T399:
+ if (p->state == UNI_EPSTATE_ADD_INIT) {
+ /* Q.2971:Party-Control-U 4 (PU1) */
+ /* Q.2971:Party-Control-N 4 (PN1) */
+ pun1_t399(p);
+ break;
+ }
+ VERBOSE(p->call->uni, UNI_FAC_ERR, 1,
+ "T399 in ps=%u", p->state);
+ break;
+
+ case SIGP_END:
+ break;
+ }
+}
+
+static void
+t397_func(struct party *p)
+{
+ uni_enq_party(p, SIGP_T397, 0, NULL, NULL);
+}
+static void
+t398_func(struct party *p)
+{
+ uni_enq_party(p, SIGP_T398, 0, NULL, NULL);
+}
+static void
+t399_func(struct party *p)
+{
+ uni_enq_party(p, SIGP_T399, 0, NULL, NULL);
+}
+
+static int
+epstate_compat(struct party *p, enum uni_epstate state)
+{
+ if (p->state == UNI_EPSTATE_ADD_INIT ||
+ p->state == UNI_EPSTATE_ALERT_RCVD)
+ if (state == UNI_EPSTATE_ADD_INIT ||
+ state == UNI_EPSTATE_ALERT_RCVD)
+ return (0);
+ if (p->state == UNI_EPSTATE_ADD_RCVD ||
+ p->state == UNI_EPSTATE_ALERT_DLVD)
+ if (state == UNI_EPSTATE_ADD_RCVD ||
+ state == UNI_EPSTATE_ALERT_DLVD)
+ return (0);
+ return (1);
+}
diff --git a/sys/contrib/ngatm/netnatm/sig/sig_print.c b/sys/contrib/ngatm/netnatm/sig/sig_print.c
new file mode 100644
index 0000000..af99612
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/sig_print.c
@@ -0,0 +1,622 @@
+/*
+ * Copyright (c) 2002-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ * Kendy Kutzner <kutzner@fokus.fraunhofer.de>
+ *
+ * $Begemot: libunimsg/netnatm/sig/sig_print.c,v 1.6 2004/08/05 07:11:02 brandt Exp $
+ */
+
+#include <sys/types.h>
+#ifdef _KERNEL
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/libkern.h>
+#include <machine/stdarg.h>
+#else
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <stdarg.h>
+#endif
+
+#include <netnatm/saal/sscfu.h>
+#include <netnatm/msg/uni_hdr.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/msg/uniprint.h>
+#include <netnatm/sig/uni.h>
+#include <netnatm/sig/unisig.h>
+#include <netnatm/sig/unidef.h>
+
+const char *
+uni_strerr(u_int err)
+{
+ static const char *const errstr[] = {
+#define DEF(NAME, VAL, STR) [UNIAPI_##NAME] = STR,
+UNIAPI_DEF_ERRORS(DEF)
+#undef DEF
+ };
+ static char buf[100];
+
+ if (err >= sizeof(errstr)/sizeof(errstr[0]) || errstr[err] == NULL) {
+ sprintf(buf, "Unknown error %u", err);
+ return (buf);
+ }
+ return (errstr[err]);
+}
+
+#define D(M) [M] = #M
+static const char *const msgs[] = {
+ D(UNIAPI_ERROR),
+ D(UNIAPI_CALL_CREATED),
+ D(UNIAPI_CALL_DESTROYED),
+ D(UNIAPI_PARTY_CREATED),
+ D(UNIAPI_PARTY_DESTROYED),
+ D(UNIAPI_LINK_ESTABLISH_request),
+ D(UNIAPI_LINK_ESTABLISH_confirm),
+ D(UNIAPI_LINK_RELEASE_request),
+ D(UNIAPI_LINK_RELEASE_confirm),
+ D(UNIAPI_RESET_request),
+ D(UNIAPI_RESET_confirm),
+ D(UNIAPI_RESET_indication),
+ D(UNIAPI_RESET_ERROR_indication),
+ D(UNIAPI_RESET_response),
+ D(UNIAPI_RESET_ERROR_response),
+ D(UNIAPI_RESET_STATUS_indication),
+ D(UNIAPI_SETUP_request),
+ D(UNIAPI_SETUP_indication),
+ D(UNIAPI_SETUP_response),
+ D(UNIAPI_SETUP_confirm),
+ D(UNIAPI_SETUP_COMPLETE_indication),
+ D(UNIAPI_SETUP_COMPLETE_request),
+ D(UNIAPI_ALERTING_request),
+ D(UNIAPI_ALERTING_indication),
+ D(UNIAPI_PROCEEDING_request),
+ D(UNIAPI_PROCEEDING_indication),
+ D(UNIAPI_RELEASE_request),
+ D(UNIAPI_RELEASE_indication),
+ D(UNIAPI_RELEASE_response),
+ D(UNIAPI_RELEASE_confirm),
+ D(UNIAPI_NOTIFY_request),
+ D(UNIAPI_NOTIFY_indication),
+ D(UNIAPI_STATUS_indication),
+ D(UNIAPI_STATUS_ENQUIRY_request),
+ D(UNIAPI_ADD_PARTY_request),
+ D(UNIAPI_ADD_PARTY_indication),
+ D(UNIAPI_PARTY_ALERTING_request),
+ D(UNIAPI_PARTY_ALERTING_indication),
+ D(UNIAPI_ADD_PARTY_ACK_request),
+ D(UNIAPI_ADD_PARTY_ACK_indication),
+ D(UNIAPI_ADD_PARTY_REJ_request),
+ D(UNIAPI_ADD_PARTY_REJ_indication),
+ D(UNIAPI_DROP_PARTY_request),
+ D(UNIAPI_DROP_PARTY_indication),
+ D(UNIAPI_DROP_PARTY_ACK_request),
+ D(UNIAPI_DROP_PARTY_ACK_indication),
+ D(UNIAPI_ABORT_CALL_request),
+};
+#undef D
+
+void
+uni_print_api(char *buf, size_t bufsiz, u_int type, u_int cookie,
+ const void *msg, struct unicx *cx)
+{
+ int old_dont_init = cx->dont_init;
+
+ uni_print_init(buf, bufsiz, cx);
+ cx->dont_init = 1;
+
+ if (type >= sizeof(msgs) / sizeof(msgs[0]) || msgs[type] == NULL) {
+ uni_print_flag("UNIAPI_UNKNOWN", cx);
+ uni_print_entry(cx, "sig", "%u", type);
+ uni_print_entry(cx, "cookie", "%u", cookie);
+ goto out;
+ }
+
+ uni_print_flag(msgs[type], cx);
+ uni_print_entry(cx, "cookie", "%u", cookie);
+ cx->indent++;
+
+ switch (type) {
+
+ case UNIAPI_ERROR:
+ {
+ const struct uniapi_error *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_entry(cx, "reason", "%s", uni_strerr(api->reason));
+ uni_print_entry(cx, "state", "U%u", api->state);
+ break;
+ }
+
+ case UNIAPI_CALL_CREATED:
+ {
+ const struct uniapi_call_created *api = msg;
+
+ uni_print_cref(NULL, 0, &api->cref, cx);
+ break;
+ }
+
+ case UNIAPI_CALL_DESTROYED:
+ {
+ const struct uniapi_call_destroyed *api = msg;
+
+ uni_print_cref(NULL, 0, &api->cref, cx);
+ break;
+ }
+
+ case UNIAPI_PARTY_CREATED:
+ {
+ const struct uniapi_party_created *api = msg;
+
+ uni_print_cref(NULL, 0, &api->cref, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_EPREF,
+ (const union uni_ieall *)&api->epref, cx);
+ break;
+ }
+
+ case UNIAPI_PARTY_DESTROYED:
+ {
+ const struct uniapi_party_destroyed *api = msg;
+
+ uni_print_cref(NULL, 0, &api->cref, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_EPREF,
+ (const union uni_ieall *)&api->epref, cx);
+ break;
+ }
+
+ case UNIAPI_LINK_ESTABLISH_request:
+ case UNIAPI_LINK_ESTABLISH_confirm:
+ case UNIAPI_LINK_RELEASE_request:
+ case UNIAPI_LINK_RELEASE_confirm:
+ break;
+
+ case UNIAPI_RESET_request:
+ {
+ const struct uniapi_reset_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_RESTART,
+ (const union uni_ieall *)&api->restart, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_CONNID,
+ (const union uni_ieall *)&api->restart, cx);
+ break;
+ }
+
+ case UNIAPI_RESET_confirm:
+ {
+ const struct uniapi_reset_confirm *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_RESTART,
+ (const union uni_ieall *)&api->restart, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_CONNID,
+ (const union uni_ieall *)&api->restart, cx);
+ break;
+ }
+
+ case UNIAPI_RESET_indication:
+ {
+ const struct uniapi_reset_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_RESTART,
+ (const union uni_ieall *)&api->restart, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_CONNID,
+ (const union uni_ieall *)&api->restart, cx);
+ break;
+ }
+
+ case UNIAPI_RESET_ERROR_indication:
+ {
+ const struct uniapi_reset_error_indication *api = msg;
+ static const struct uni_print_tbl reason[] = {
+#define DEF(NAME, VALUE, STR) { STR, VALUE },
+ UNIAPI_DEF_RESET_ERRORS(DEF)
+#undef DEF
+ { NULL, 0 }
+ };
+ static const struct uni_print_tbl source[] = {
+ { "start", 0 },
+ { "respond", 1 },
+ { NULL, 0 }
+ };
+
+ uni_print_eol(cx);
+ uni_print_tbl("source", api->source, source, cx);
+ uni_print_tbl("reason", api->reason, reason, cx);
+ break;
+ }
+
+ case UNIAPI_RESET_response:
+ {
+ const struct uniapi_reset_response *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_RESTART,
+ (const union uni_ieall *)&api->restart, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_CONNID,
+ (const union uni_ieall *)&api->restart, cx);
+ break;
+ }
+
+ case UNIAPI_RESET_ERROR_response:
+ {
+ const struct uniapi_reset_error_response *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_CAUSE,
+ (const union uni_ieall *)&api->cause, cx);
+ break;
+ }
+
+ case UNIAPI_RESET_STATUS_indication:
+ {
+ const struct uniapi_reset_status_indication *api = msg;
+
+ uni_print_cref(NULL, 0, &api->cref, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_CALLSTATE,
+ (const union uni_ieall *)&api->callstate, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_CAUSE,
+ (const union uni_ieall *)&api->cause, cx);
+ break;
+ }
+
+ case UNIAPI_SETUP_request:
+ {
+ const struct uniapi_setup_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_SETUP,
+ (const union uni_msgall *)&api->setup, cx);
+ break;
+ }
+
+ case UNIAPI_SETUP_indication:
+ {
+ const struct uniapi_setup_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_SETUP,
+ (const union uni_msgall *)&api->setup, cx);
+ break;
+ }
+
+ case UNIAPI_SETUP_response:
+ {
+ const struct uniapi_setup_response *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_CONNECT,
+ (const union uni_msgall *)&api->connect, cx);
+ break;
+ }
+
+ case UNIAPI_SETUP_confirm:
+ {
+ const struct uniapi_setup_confirm *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_CONNECT,
+ (const union uni_msgall *)&api->connect, cx);
+ break;
+ }
+
+ case UNIAPI_SETUP_COMPLETE_indication:
+ {
+ const struct uniapi_setup_complete_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_CONNECT_ACK,
+ (const union uni_msgall *)&api->connect_ack, cx);
+ break;
+ }
+
+ case UNIAPI_SETUP_COMPLETE_request:
+ {
+ const struct uniapi_setup_complete_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_CONNECT_ACK,
+ (const union uni_msgall *)&api->connect_ack, cx);
+ break;
+ }
+
+ case UNIAPI_ALERTING_request:
+ {
+ const struct uniapi_alerting_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_ALERTING,
+ (const union uni_msgall *)&api->alerting, cx);
+ break;
+ }
+
+ case UNIAPI_ALERTING_indication:
+ {
+ const struct uniapi_alerting_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_ALERTING,
+ (const union uni_msgall *)&api->alerting, cx);
+ break;
+ }
+
+ case UNIAPI_PROCEEDING_request:
+ {
+ const struct uniapi_proceeding_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_CALL_PROC,
+ (const union uni_msgall *)&api->call_proc, cx);
+ break;
+ }
+
+ case UNIAPI_PROCEEDING_indication:
+ {
+ const struct uniapi_proceeding_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_CALL_PROC,
+ (const union uni_msgall *)&api->call_proc, cx);
+ break;
+ }
+
+ case UNIAPI_RELEASE_request:
+ {
+ const struct uniapi_release_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_RELEASE,
+ (const union uni_msgall *)&api->release, cx);
+ break;
+ }
+
+ case UNIAPI_RELEASE_indication:
+ {
+ const struct uniapi_release_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_RELEASE,
+ (const union uni_msgall *)&api->release, cx);
+ break;
+ }
+
+ case UNIAPI_RELEASE_response:
+ {
+ const struct uniapi_release_response *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_RELEASE_COMPL,
+ (const union uni_msgall *)&api->release_compl, cx);
+ break;
+ }
+ case UNIAPI_RELEASE_confirm:
+ {
+ const struct uniapi_release_confirm *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_RELEASE,
+ (const union uni_msgall *)&api->release, cx);
+ break;
+ }
+
+ case UNIAPI_NOTIFY_request:
+ {
+ const struct uniapi_notify_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_NOTIFY,
+ (const union uni_msgall *)&api->notify, cx);
+ break;
+ }
+
+ case UNIAPI_NOTIFY_indication:
+ {
+ const struct uniapi_notify_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_NOTIFY,
+ (const union uni_msgall *)&api->notify, cx);
+ break;
+ }
+
+ case UNIAPI_STATUS_indication:
+ {
+ const struct uniapi_status_indication *api = msg;
+
+ uni_print_cref(NULL, 0, &api->cref, cx);
+ uni_print_eol(cx);
+ uni_print_entry(cx, "my_state", "U%u", api->my_state);
+ uni_print_entry(cx, "my_cause", "%s",
+ uni_ie_cause2str(UNI_CODING_ITU, api->my_cause));
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_CALLSTATE,
+ (const union uni_ieall *)&api->his_state, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_CAUSE,
+ (const union uni_ieall *)&api->his_cause, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_EPREF,
+ (const union uni_ieall *)&api->epref, cx);
+ break;
+ }
+
+ case UNIAPI_STATUS_ENQUIRY_request:
+ {
+ const struct uniapi_status_enquiry_request *api = msg;
+
+ uni_print_cref(NULL, 0, &api->cref, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_EPREF,
+ (const union uni_ieall *)&api->epref, cx);
+ break;
+ }
+
+ case UNIAPI_ADD_PARTY_request:
+ {
+ const struct uniapi_add_party_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_ADD_PARTY,
+ (const union uni_msgall *)&api->add, cx);
+ break;
+ }
+
+ case UNIAPI_ADD_PARTY_indication:
+ {
+ const struct uniapi_add_party_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_ADD_PARTY,
+ (const union uni_msgall *)&api->add, cx);
+ break;
+ }
+
+ case UNIAPI_PARTY_ALERTING_request:
+ {
+ const struct uniapi_party_alerting_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_PARTY_ALERTING,
+ (const union uni_msgall *)&api->alert, cx);
+ break;
+ }
+
+ case UNIAPI_PARTY_ALERTING_indication:
+ {
+ const struct uniapi_party_alerting_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_PARTY_ALERTING,
+ (const union uni_msgall *)&api->alert, cx);
+ break;
+ }
+
+ case UNIAPI_ADD_PARTY_ACK_request:
+ {
+ const struct uniapi_add_party_ack_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_ADD_PARTY_ACK,
+ (const union uni_msgall *)&api->ack, cx);
+ break;
+ }
+
+ case UNIAPI_ADD_PARTY_ACK_indication:
+ {
+ const struct uniapi_add_party_ack_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_ADD_PARTY_ACK,
+ (const union uni_msgall *)&api->ack, cx);
+ break;
+ }
+
+ case UNIAPI_ADD_PARTY_REJ_request:
+ {
+ const struct uniapi_add_party_rej_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_ADD_PARTY_REJ,
+ (const union uni_msgall *)&api->rej, cx);
+ break;
+ }
+
+ case UNIAPI_ADD_PARTY_REJ_indication:
+ {
+ const struct uniapi_add_party_rej_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_ADD_PARTY_REJ,
+ (const union uni_msgall *)&api->rej, cx);
+ break;
+ }
+
+ case UNIAPI_DROP_PARTY_request:
+ {
+ const struct uniapi_drop_party_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_DROP_PARTY,
+ (const union uni_msgall *)&api->drop, cx);
+ break;
+ }
+
+ case UNIAPI_DROP_PARTY_indication:
+ {
+ const struct uniapi_drop_party_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_DROP_PARTY,
+ (const union uni_msgall *)&api->drop, cx);
+ break;
+ }
+
+ case UNIAPI_DROP_PARTY_ACK_request:
+ {
+ const struct uniapi_drop_party_ack_request *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_DROP_PARTY_ACK,
+ (const union uni_msgall *)&api->ack, cx);
+ break;
+ }
+
+ case UNIAPI_DROP_PARTY_ACK_indication:
+ {
+ const struct uniapi_drop_party_ack_indication *api = msg;
+
+ uni_print_eol(cx);
+ uni_print_msg(NULL, 0, UNI_DROP_PARTY,
+ (const union uni_msgall *)&api->drop, cx);
+ uni_print_eol(cx);
+ uni_print_ie(NULL, 0, UNI_IE_CRANKBACK,
+ (const union uni_ieall *)&api->crankback, cx);
+ break;
+ }
+
+ case UNIAPI_ABORT_CALL_request:
+ {
+ const struct uniapi_abort_call_request *api = msg;
+
+ uni_print_cref(NULL, 0, &api->cref, cx);
+ break;
+ }
+ }
+
+ out:
+ cx->dont_init = old_dont_init;
+}
diff --git a/sys/contrib/ngatm/netnatm/sig/sig_reset.c b/sys/contrib/ngatm/netnatm/sig/sig_reset.c
new file mode 100644
index 0000000..29a57bd
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/sig_reset.c
@@ -0,0 +1,827 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/sig/sig_reset.c,v 1.11 2004/08/05 07:11:03 brandt Exp $
+ *
+ * Reset-start and reset-respond
+ */
+
+#include <netnatm/unimsg.h>
+#include <netnatm/saal/sscfudef.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/sig/uni.h>
+
+#include <netnatm/sig/unipriv.h>
+#include <netnatm/sig/unimkmsg.h>
+
+static void response_restart(struct uni *, struct uni_msg *, struct uni_all *);
+static void response_status(struct uni *, struct uni_msg *, struct uni_all *);
+
+static void response_t317(struct uni *);
+
+static void response_error(struct uni *, struct uniapi_reset_error_response *,
+ uint32_t cookie);
+static void response_response(struct uni *, struct uniapi_reset_response *,
+ uint32_t);
+
+static void start_request(struct uni *, struct uniapi_reset_request *,
+ uint32_t);
+
+static void start_t316(struct uni *);
+
+static void start_restart_ack(struct uni *, struct uni_msg *, struct uni_all *);
+static void start_status(struct uni *, struct uni_msg *, struct uni_all *);
+
+static int restart_forward(struct uni *, const struct uni_all *);
+
+#define DEF_PRIV_SIG(NAME, FROM) [SIG##NAME] = "SIG"#NAME,
+static const char *const start_sigs[] = {
+ DEF_START_SIGS
+};
+#undef DEF_PRIV_SIG
+
+#define DEF_PRIV_SIG(NAME, FROM) [SIG##NAME] = "SIG"#NAME,
+static const char *const respond_sigs[] = {
+ DEF_RESPOND_SIGS
+};
+#undef DEF_PRIV_SIG
+
+TIMER_FUNC_UNI(t317, t317_func)
+TIMER_FUNC_UNI(t316, t316_func)
+
+/*
+ * Reset-Start process.
+ */
+void
+uni_sig_start(struct uni *uni, u_int sig, uint32_t cookie,
+ struct uni_msg *m, struct uni_all *u)
+{
+ if (sig >= SIGS_END) {
+ VERBOSE(uni, UNI_FAC_ERR, 1, "Signal %d outside of range to "
+ "Reset-Start", sig);
+ if (m)
+ uni_msg_destroy(m);
+ if (u)
+ UNI_FREE(u);
+ return;
+ }
+
+ VERBOSE(uni, UNI_FAC_RESTART, 1,
+ "Signal %s in state %u of Reset-Start; cookie %u",
+ start_sigs[sig], uni->glob_start, cookie);
+
+ switch (sig) {
+
+ /*
+ * User requests
+ */
+ case SIGS_RESET_request:
+ start_request(uni,
+ uni_msg_rptr(m, struct uniapi_reset_request *), cookie);
+ uni_msg_destroy(m);
+ break;
+
+ /*
+ * Timers
+ */
+ case SIGS_T316:
+ start_t316(uni);
+ break;
+
+ /*
+ * SAAL
+ */
+ case SIGS_RESTART_ACK:
+ start_restart_ack(uni, m, u);
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ break;
+
+ case SIGS_STATUS:
+ start_status(uni, m, u);
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ break;
+
+ case SIGS_END:
+ break;
+ }
+}
+
+/*
+ * Reset-request from USER.
+ *
+ * Q.2931:Reset-Start 1/2
+ */
+static void
+start_request(struct uni *uni, struct uniapi_reset_request *req, uint32_t cookie)
+{
+ struct uni_all *resp;
+ int err;
+
+ if (uni->glob_start != UNI_CALLSTATE_REST0) {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALLSTATE, cookie, 0);
+ return;
+ }
+
+ if ((resp = UNI_ALLOC()) == NULL) {
+ uniapi_uni_error(uni, UNIAPI_ERROR_NOMEM, cookie, 0);
+ return;
+ }
+
+ MK_MSG_ORIG(resp, UNI_RESTART, 0, 0);
+ resp->u.restart.restart = req->restart;
+ resp->u.restart.connid = req->connid;
+
+ if (restart_forward(uni, resp))
+ return;
+
+ uni->connid_start = req->connid;
+ uni->restart_start = req->restart;
+
+ if ((err = uni_send_output(resp, uni)) != 0)
+ uniapi_uni_error(uni, UNIAPI_ERROR_ENCODING, cookie, 0);
+ UNI_FREE(resp);
+ if (err)
+ return;
+
+ uni->cnt316 = 0;
+ TIMER_START_UNI(uni, t316, uni->timer316);
+ uni->glob_start = UNI_CALLSTATE_REST1;
+
+ VERBOSE(uni, UNI_FAC_RESTART, 1, "Reset-Start state := 1");
+
+
+ uniapi_uni_error(uni, UNIAPI_OK, cookie, 0);
+}
+
+/*
+ * T316 timeout function
+ */
+static void
+t316_func(struct uni *uni)
+{
+ uni_enq_start(uni, SIGS_T316, 0, NULL, NULL);
+}
+
+/*
+ * Q.2931:Reset-Start 1/2
+ */
+static void
+start_t316(struct uni *uni)
+{
+ if (uni->glob_start != UNI_CALLSTATE_REST1) {
+ VERBOSE0(uni, UNI_FAC_ERR, "T316 in state %d",
+ uni->glob_start);
+ return;
+ }
+
+ if (++uni->cnt316 == uni->init316) {
+ struct uni_msg *app;
+ struct uniapi_reset_error_indication *resp;
+
+ VERBOSE(uni, UNI_FAC_RESTART, 1, "Reset-Start error");
+
+ resp = ALLOC_API(struct uniapi_reset_error_indication, app);
+ if (resp != NULL) {
+ resp->source = 0;
+ resp->reason = UNIAPI_RESET_ERROR_NO_RESPONSE,
+
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_RESET_ERROR_indication, 0, app);
+ }
+
+ uni->glob_start = UNI_CALLSTATE_REST0;
+ VERBOSE(uni, UNI_FAC_RESTART, 1, "Reset-Start state := 0");
+ } else {
+ struct uni_all *resp;
+
+ if ((resp = UNI_ALLOC()) == NULL)
+ return;
+
+ MK_MSG_ORIG(resp, UNI_RESTART, 0, 0);
+ resp->u.restart.restart = uni->restart_start;
+ resp->u.restart.connid = uni->connid_start;
+
+ (void)uni_send_output(resp, uni);
+
+ UNI_FREE(resp);
+
+ TIMER_START_UNI(uni, t316, uni->timer316);
+ }
+}
+
+/*
+ * Got RESTART_ACK.
+ */
+static void
+start_restart_ack(struct uni *uni, struct uni_msg *m, struct uni_all *u)
+{
+ enum uni_callstate new_state;
+ struct uniapi_reset_confirm *conf;
+ struct uni_msg *app;
+
+ if (uni->glob_start == UNI_CALLSTATE_REST0) {
+ uni_respond_status_mtype(uni, &u->u.hdr.cref, uni->glob_start,
+ UNI_CAUSE_MSG_INCOMP, UNI_RESTART_ACK);
+ return;
+ }
+
+ if (uni->glob_start != UNI_CALLSTATE_REST1) {
+ ASSERT(0, ("bad global call state in Reset-Start"));
+ return;
+ }
+
+ /*
+ * If body decoding fails, this is because IEs are wrong.
+ */
+ (void)uni_decode_body(m, u, &uni->cx);
+ MANDATE_IE(uni, u->u.restart_ack.restart, UNI_IE_RESTART);
+
+ if (IE_ISGOOD(u->u.restart_ack.restart)) {
+ /*
+ * Q.2931: 5.5.2.2
+ */
+ if (u->u.restart_ack.restart.rclass == UNI_RESTART_ALL &&
+ IE_ISGOOD(u->u.restart_ack.connid)) {
+ UNI_SAVE_IERR(&uni->cx, UNI_IE_CONNID,
+ u->u.restart_ack.connid.h.act,
+ UNI_IERR_UNK);
+ } else if ((u->u.restart_ack.restart.rclass == UNI_RESTART_PATH ||
+ u->u.restart_ack.restart.rclass == UNI_RESTART_CHANNEL)) {
+ MANDATE_IE(uni, u->u.restart_ack.connid, UNI_IE_CONNID);
+ }
+ }
+ /*
+ * Compare the information elements now, because
+ * we may need the new callstate for the status message
+ * below.
+ */
+ new_state = UNI_CALLSTATE_REST1;
+
+ if (IE_ISGOOD(u->u.restart_ack.restart) &&
+ IE_ISGOOD(uni->restart_start) &&
+ u->u.restart_ack.restart.rclass == uni->restart_start.rclass &&
+ !IE_ISGOOD(u->u.restart_ack.connid) == !IE_ISGOOD(uni->connid_start) &&
+ (!IE_ISGOOD(uni->connid_start) ||
+ (u->u.restart_ack.connid.vpci == uni->connid_start.vpci &&
+ u->u.restart_ack.connid.vci == uni->connid_start.vci)))
+ new_state = UNI_CALLSTATE_REST0;
+
+ switch (uni_verify(uni, u->u.hdr.act)) {
+ case VFY_RAIM:
+ case VFY_RAI:
+ uni_respond_status_verify(uni, &u->u.hdr.cref,
+ UNI_CALLSTATE_REST1, NULL, 0);
+ case VFY_I:
+ return;
+
+ case VFY_CLR:
+ uni->glob_start = UNI_CALLSTATE_REST0;
+ VERBOSE(uni, UNI_FAC_RESTART, 1,
+ "Reset-Start state := 0");
+ return;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(uni, &u->u.hdr.cref,
+ new_state, NULL, 0);
+ case VFY_OK:
+ break;
+ }
+
+ if (new_state == UNI_CALLSTATE_REST1)
+ /*
+ * Q.2931: 5.5.1.2/2
+ */
+ return;
+
+ /*
+ * Build restart.confirm signal for application
+ */
+ if (!IE_ISGOOD(u->u.restart_ack.connid))
+ u->u.restart.connid.h.present = 0;
+
+
+ if ((conf = ALLOC_API(struct uniapi_reset_confirm, app)) == NULL)
+ return;
+ conf->restart = u->u.restart.restart;
+ conf->connid = u->u.restart.connid;
+
+ TIMER_STOP_UNI(uni, t316);
+
+ uni->funcs->uni_output(uni, uni->arg, UNIAPI_RESET_confirm, 0, app);
+
+ uni->glob_start = UNI_CALLSTATE_REST0;
+ VERBOSE(uni, UNI_FAC_RESTART, 1, "Reset-Start state := 0");
+}
+
+/*
+ * Reset-Start got a STATUS message.
+ *
+ * Q.2931: Reset-Start 2/2
+ *
+ * In Q.2931 only CALLSTATE_REST1 is allowed, this seems silly and to contradict
+ * 5.6.12. So allow it in any state.
+ *
+ * The following states are considered compatible:
+ *
+ * Sender Receiver(we)
+ * ------ --------
+ * Rest0 Rest0 this is the normal state OK!
+ * Rest2 Rest0 this may be the result of no answer from the API
+ * on the remote end and the us finally timing out. ERROR!
+ * Rest2 Rest1 this is normal. OK!
+ * Rest0 Rest1 RESTART_ACK was probably lost. OK!
+ *
+ * All others are wrong.
+ */
+static void
+start_status(struct uni *uni, struct uni_msg *m, struct uni_all *u)
+{
+ (void)uni_decode_body(m, u, &uni->cx);
+ MANDATE_IE(uni, u->u.status.callstate, UNI_IE_CALLSTATE);
+ MANDATE_IE(uni, u->u.status.cause, UNI_IE_CAUSE);
+ switch (uni_verify(uni, u->u.hdr.act)) {
+ case VFY_CLR:
+ uni->glob_start = UNI_CALLSTATE_REST0;
+ VERBOSE(uni, UNI_FAC_RESTART, 1, "Reset-Start state := 0");
+ return;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(uni, &u->u.hdr.cref, uni->glob_start,
+ NULL, 0);
+ case VFY_I:
+ case VFY_OK:
+ break;
+ }
+ if (!IE_ISGOOD(u->u.status.callstate)) {
+ /*
+ * As a result of the strange handling above, we must
+ * process a STATUS with an invalid or missing callstate!
+ */
+ return;
+ }
+ if ((u->u.status.callstate.state == UNI_CALLSTATE_REST0 &&
+ uni->glob_start == UNI_CALLSTATE_REST0) ||
+ (u->u.status.callstate.state == UNI_CALLSTATE_REST0 &&
+ uni->glob_start == UNI_CALLSTATE_REST1) ||
+ (u->u.status.callstate.state == UNI_CALLSTATE_REST2 &&
+ uni->glob_start == UNI_CALLSTATE_REST1)) {
+ /*
+ * Implementation dependend procedure:
+ * Inform the API
+ */
+ struct uniapi_reset_status_indication *resp;
+ struct uni_msg *app;
+
+ resp = ALLOC_API(struct uniapi_reset_status_indication, app);
+ if (resp == NULL)
+ return;
+ resp->cref = u->u.hdr.cref;
+ resp->callstate = u->u.status.callstate;
+ if (IE_ISGOOD(u->u.status.cause))
+ resp->cause = u->u.status.cause;
+
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_RESET_STATUS_indication, 0, app);
+
+ } else {
+ struct uniapi_reset_error_indication *resp;
+ struct uni_msg *app;
+
+ resp = ALLOC_API(struct uniapi_reset_error_indication, app);
+ if (resp != NULL) {
+ resp->source = 0;
+ resp->reason = UNIAPI_RESET_ERROR_PEER_INCOMP_STATE,
+
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_RESET_ERROR_indication, 0, app);
+ }
+ }
+}
+
+/************************************************************/
+/*
+ * Reset-Respond process.
+ */
+void
+uni_sig_respond(struct uni *uni, u_int sig, uint32_t cookie,
+ struct uni_msg *m, struct uni_all *u)
+{
+ if (sig >= SIGR_END) {
+ VERBOSE(uni, UNI_FAC_ERR, 1, "Signal %d outside of range to "
+ "Reset-Respond", sig);
+ if (m)
+ uni_msg_destroy(m);
+ if (u)
+ UNI_FREE(u);
+ return;
+ }
+
+ VERBOSE(uni, UNI_FAC_RESTART, 1,
+ "Signal %s in state %u of Reset-Respond; cookie %u",
+ respond_sigs[sig], uni->glob_respond, cookie);
+
+ switch (sig) {
+
+ /*
+ * SAAL
+ */
+ case SIGR_RESTART:
+ response_restart(uni, m, u);
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ break;
+
+ case SIGR_STATUS:
+ response_status(uni, m, u);
+ uni_msg_destroy(m);
+ UNI_FREE(u);
+ break;
+
+ /*
+ * User
+ */
+ case SIGR_RESET_ERROR_response:
+ response_error(uni,
+ uni_msg_rptr(m, struct uniapi_reset_error_response *),
+ cookie);
+ uni_msg_destroy(m);
+ break;
+
+ case SIGR_RESET_response:
+ response_response(uni,
+ uni_msg_rptr(m, struct uniapi_reset_response *), cookie);
+ uni_msg_destroy(m);
+ break;
+
+ /*
+ * Timers
+ */
+ case SIGR_T317:
+ response_t317(uni);
+ return;
+
+ case SIGR_END:
+ break;
+ }
+}
+
+/*
+ * Send a RELEASE_COMPLETE to all affected calls as per
+ * F.2.3(3)
+ */
+static int
+restart_forward(struct uni *uni, const struct uni_all *u)
+{
+ struct call *c;
+ struct uni_all *resp;
+
+ if ((resp = UNI_ALLOC()) == NULL)
+ return (-1);
+
+ TAILQ_FOREACH(c, &uni->calls, link) {
+ if (u->u.restart.restart.rclass == UNI_RESTART_ALL ||
+ (IE_ISPRESENT(c->connid) &&
+ u->u.restart.connid.vpci == c->connid.vpci &&
+ (u->u.restart.restart.rclass == UNI_RESTART_PATH ||
+ u->u.restart.connid.vci == c->connid.vci))) {
+ MK_MSG_ORIG(resp, UNI_RELEASE_COMPL, c->cref, c->mine);
+ uni_release_compl(c, resp);
+ }
+ }
+
+ UNI_FREE(resp);
+ return (0);
+}
+
+/*
+ * Respond process got a restart message.
+ * Doesn't free the messages.
+ */
+static void
+response_restart(struct uni *uni, struct uni_msg *m, struct uni_all *u)
+{
+ struct uni_msg *app;
+ struct uniapi_reset_indication *ind;
+
+ if (uni->glob_respond == UNI_CALLSTATE_REST0) {
+ /*
+ * If body decoding fails, this is because IEs are wrong.
+ */
+ (void)uni_decode_body(m, u, &uni->cx);
+ MANDATE_IE(uni, u->u.restart.restart, UNI_IE_RESTART);
+ if (IE_ISGOOD(u->u.restart.restart)) {
+ /*
+ * Q.2931: 5.5.2.2
+ */
+ if (u->u.restart.restart.rclass == UNI_RESTART_ALL &&
+ IE_ISGOOD(u->u.restart.connid)) {
+ UNI_SAVE_IERR(&uni->cx, UNI_IE_CONNID,
+ u->u.restart.connid.h.act,
+ UNI_IERR_UNK);
+ } else if ((u->u.restart.restart.rclass == UNI_RESTART_PATH ||
+ u->u.restart.restart.rclass == UNI_RESTART_CHANNEL)) {
+ MANDATE_IE(uni, u->u.restart.connid, UNI_IE_CONNID);
+ }
+ }
+ switch (uni_verify(uni, u->u.hdr.act)) {
+ case VFY_RAIM:
+ case VFY_RAI:
+ uni_respond_status_verify(uni, &u->u.hdr.cref,
+ UNI_CALLSTATE_REST0, NULL, 0);
+ case VFY_CLR:
+ case VFY_I:
+ return;
+
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(uni, &u->u.hdr.cref,
+ UNI_CALLSTATE_REST2, NULL, 0);
+ case VFY_OK:
+ break;
+ }
+ if (!IE_ISGOOD(u->u.restart.connid))
+ u->u.restart.connid.h.present = 0;
+
+ /*
+ * Send a RELEASE_COMPLETE to all affected calls as per
+ * F.2.3(3)
+ */
+ if (restart_forward(uni, u))
+ return;
+
+ /*
+ * Build restart signal for application
+ */
+ if ((ind = ALLOC_API(struct uniapi_reset_indication, app)) == NULL)
+ return;
+
+ ind->restart = u->u.restart.restart;
+ ind->connid = u->u.restart.connid;
+
+ uni_enq_coord(uni, SIGO_RESET_indication, 0, app);
+
+ TIMER_START_UNI(uni, t317, uni->timer317);
+ uni->glob_respond = UNI_CALLSTATE_REST2;
+
+ VERBOSE(uni, UNI_FAC_RESTART, 1, "Reset-Respond state := 2");
+
+
+ } else if (uni->glob_respond == UNI_CALLSTATE_REST2) {
+ /*
+ * No need to decode the message. It is unexpected in this
+ * state so return a status.
+ */
+ uni_respond_status_mtype(uni, &u->u.hdr.cref, uni->glob_respond,
+ UNI_CAUSE_MSG_INCOMP, UNI_RESTART);
+
+
+ } else
+ ASSERT(0, ("bad global call state in responder"));
+}
+
+static void
+response_t317(struct uni *uni)
+{
+ struct uniapi_reset_error_indication *resp;
+ struct uni_msg *app;
+
+ if (uni->glob_respond != UNI_CALLSTATE_REST2) {
+ VERBOSE0(uni, UNI_FAC_ERR, "T317 in state %d",
+ uni->glob_respond);
+ return;
+ }
+
+ VERBOSE(uni, UNI_FAC_RESTART, 1, "Reset-Respond error");
+
+ if ((resp = ALLOC_API(struct uniapi_reset_error_indication, app)) != NULL) {
+ resp->source = 1;
+ resp->reason = UNIAPI_RESET_ERROR_NO_CONFIRM;
+
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_RESET_ERROR_indication, 0, app);
+ }
+
+ uni->glob_respond = UNI_CALLSTATE_REST0;
+ VERBOSE(uni, UNI_FAC_RESTART, 1, "Reset-Respond state := 0");
+}
+
+/*
+ * Error response from USER
+ */
+static void
+response_error(struct uni *uni, struct uniapi_reset_error_response *c,
+ uint32_t cookie)
+{
+ struct uni_all *resp;
+
+ if (uni->glob_respond != UNI_CALLSTATE_REST2) {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALLSTATE, cookie, 0);
+ return;
+ }
+
+ if ((resp = UNI_ALLOC()) == NULL) {
+ uniapi_uni_error(uni, UNIAPI_ERROR_NOMEM, cookie, 0);
+ return;
+ }
+
+ MK_MSG_ORIG(resp, UNI_STATUS, 0, 1);
+ MK_IE_CALLSTATE(resp->u.status.callstate, UNI_CALLSTATE_REST2);
+
+ if (IE_ISGOOD(c->cause))
+ resp->u.status.cause = c->cause;
+ else {
+ MK_IE_CAUSE(resp->u.status.cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_CHANNEL_NEX);
+ if (IE_ISGOOD(uni->connid_respond))
+ ADD_CAUSE_CHANNID(resp->u.status.cause,
+ uni->connid_respond.vpci,
+ uni->connid_respond.vci);
+ }
+
+ if (uni_send_output(resp, uni) != 0) {
+ uniapi_uni_error(uni, UNIAPI_ERROR_ENCODING, cookie, 0);
+ UNI_FREE(resp);
+ return;
+ }
+
+ uniapi_uni_error(uni, UNIAPI_OK, cookie, 0);
+}
+
+/*
+ * Reset-response from user.
+ */
+static void
+response_response(struct uni *uni, struct uniapi_reset_response *arg,
+ uint32_t cookie)
+{
+ struct uni_all *resp;
+
+ if (uni->glob_respond != UNI_CALLSTATE_REST2) {
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_CALLSTATE, cookie, 0);
+ return;
+ }
+
+ if (!IE_ISGOOD(arg->restart)) {
+ uniapi_uni_error(uni, UNIAPI_ERROR_MISSING_IE, cookie, 0);
+ return;
+ }
+
+ if ((resp = UNI_ALLOC()) == NULL) {
+ uniapi_uni_error(uni, UNIAPI_ERROR_NOMEM, cookie, 0);
+ return;
+ }
+
+ TIMER_STOP_UNI(uni, t317);
+
+ MK_MSG_ORIG(resp, UNI_RESTART_ACK, 0, 1);
+ resp->u.restart.restart = arg->restart;
+ if (IE_ISGOOD(arg->connid))
+ resp->u.restart.connid = arg->connid;
+
+ if (uni_send_output(resp, uni) != 0) {
+ uniapi_uni_error(uni, UNIAPI_ERROR_ENCODING, cookie, 0);
+ UNI_FREE(resp);
+ return;
+ }
+
+ UNI_FREE(resp);
+
+ uni->glob_respond = UNI_CALLSTATE_REST0;
+ VERBOSE(uni, UNI_FAC_RESTART, 1, "Reset-Respond state := 0");
+
+ uniapi_uni_error(uni, UNIAPI_OK, cookie, 0);
+}
+
+/*
+ * Reset-Response got a STATUS message.
+ *
+ * Q.2931: Reset-Response 2/2
+ *
+ * In Q.2931 only CALLSTATE_REST2 is allowed, this seems silly and to contradict
+ * 5.6.12. So allow it in any state.
+ *
+ * The following states are considered compatible:
+ *
+ * Sender Receiver
+ * ------ --------
+ * Rest0 Rest0 this is the normal state OK!
+ * Rest0 Rest2 this may be the result of no answer from the API
+ * and the Sender finally timing out. ERROR!
+ * Rest1 Rest2 this is normal. OK!
+ * Rest1 Rest0 RESTART_ACK was probably lost. OK!
+ *
+ * All others are wrong.
+ */
+static void
+response_status(struct uni *uni, struct uni_msg *m, struct uni_all *u)
+{
+ (void)uni_decode_body(m, u, &uni->cx);
+ MANDATE_IE(uni, u->u.status.callstate, UNI_IE_CALLSTATE);
+ MANDATE_IE(uni, u->u.status.cause, UNI_IE_CAUSE);
+ switch (uni_verify(uni, u->u.hdr.act)) {
+ case VFY_CLR:
+ if (uni->proto == UNIPROTO_UNI40U) {
+ uni->glob_respond = UNI_CALLSTATE_REST0;
+ VERBOSE(uni, UNI_FAC_RESTART, 1,
+ "Reset-Respond state := 0");
+ return;
+ }
+ break;
+
+ case VFY_RAIM:
+ case VFY_RAI:
+ case VFY_RAP:
+ case VFY_RAPU:
+ uni_respond_status_verify(uni, &u->u.hdr.cref,
+ uni->glob_respond, NULL, 0);
+ case VFY_I:
+ case VFY_OK:
+ break;
+ }
+ if (!IE_ISGOOD(u->u.status.callstate)) {
+ /*
+ * As a result of the strange handling above, we must
+ * process a STATUS with an invalid or missing callstate!
+ */
+ return;
+ }
+ if ((u->u.status.callstate.state == UNI_CALLSTATE_REST0 &&
+ uni->glob_respond == UNI_CALLSTATE_REST0) ||
+ (u->u.status.callstate.state == UNI_CALLSTATE_REST1 &&
+ uni->glob_respond == UNI_CALLSTATE_REST0) ||
+ (u->u.status.callstate.state == UNI_CALLSTATE_REST1 &&
+ uni->glob_respond == UNI_CALLSTATE_REST2)) {
+ /*
+ * Implementation dependend procedure:
+ * Inform the API
+ */
+ struct uniapi_reset_status_indication *resp;
+ struct uni_msg *app;
+
+ resp = ALLOC_API(struct uniapi_reset_status_indication, app);
+ if (resp == NULL)
+ return;
+
+ resp->cref = u->u.hdr.cref;
+ resp->callstate = u->u.status.callstate;
+ if (IE_ISGOOD(u->u.status.cause))
+ resp->cause = u->u.status.cause;
+
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_RESET_STATUS_indication, 0, app);
+
+ } else {
+ struct uniapi_reset_error_indication *resp;
+ struct uni_msg *app;
+
+ resp = ALLOC_API(struct uniapi_reset_error_indication, app);
+ if (resp != NULL) {
+ resp->source = 1;
+ resp->reason = UNIAPI_RESET_ERROR_PEER_INCOMP_STATE,
+
+ uni->funcs->uni_output(uni, uni->arg,
+ UNIAPI_RESET_ERROR_indication, 0, app);
+ }
+ }
+}
+
+/*
+ * T317 timeout function
+ */
+static void
+t317_func(struct uni *uni)
+{
+ uni_enq_resp(uni, SIGR_T317, 0, NULL, NULL);
+}
diff --git a/sys/contrib/ngatm/netnatm/sig/sig_uni.c b/sys/contrib/ngatm/netnatm/sig/sig_uni.c
new file mode 100644
index 0000000..ea2f70b
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/sig_uni.c
@@ -0,0 +1,749 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/sig/sig_uni.c,v 1.11 2004/08/05 07:11:03 brandt Exp $
+ *
+ * Instance handling
+ */
+
+#include <netnatm/unimsg.h>
+#include <netnatm/saal/sscopdef.h>
+#include <netnatm/saal/sscfudef.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/sig/uni.h>
+#include <netnatm/sig/unisig.h>
+
+#include <netnatm/sig/unipriv.h>
+
+#ifdef UNICORE
+UNICORE
+#endif
+
+#define STR(S) [S] = #S
+static const char *custat_names[] = {
+ STR(CU_STAT0),
+ STR(CU_STAT1),
+ STR(CU_STAT2),
+ STR(CU_STAT3),
+};
+static const char *globstat_names[] = {
+ STR(UNI_CALLSTATE_REST0),
+ STR(UNI_CALLSTATE_REST1),
+ STR(UNI_CALLSTATE_REST2),
+};
+
+static const char *sig_names[] = {
+ STR(UNIAPI_ERROR),
+ STR(UNIAPI_CALL_CREATED),
+ STR(UNIAPI_CALL_DESTROYED),
+ STR(UNIAPI_PARTY_CREATED),
+ STR(UNIAPI_PARTY_DESTROYED),
+ STR(UNIAPI_LINK_ESTABLISH_request),
+ STR(UNIAPI_LINK_ESTABLISH_confirm),
+ STR(UNIAPI_LINK_RELEASE_request),
+ STR(UNIAPI_LINK_RELEASE_confirm),
+ STR(UNIAPI_RESET_request),
+ STR(UNIAPI_RESET_confirm),
+ STR(UNIAPI_RESET_indication),
+ STR(UNIAPI_RESET_ERROR_indication),
+ STR(UNIAPI_RESET_response),
+ STR(UNIAPI_RESET_ERROR_response),
+ STR(UNIAPI_RESET_STATUS_indication),
+ STR(UNIAPI_SETUP_request),
+ STR(UNIAPI_SETUP_indication),
+ STR(UNIAPI_SETUP_response),
+ STR(UNIAPI_SETUP_confirm),
+ STR(UNIAPI_SETUP_COMPLETE_indication),
+ STR(UNIAPI_SETUP_COMPLETE_request),
+ STR(UNIAPI_ALERTING_request),
+ STR(UNIAPI_ALERTING_indication),
+ STR(UNIAPI_PROCEEDING_request),
+ STR(UNIAPI_PROCEEDING_indication),
+ STR(UNIAPI_RELEASE_request),
+ STR(UNIAPI_RELEASE_indication),
+ STR(UNIAPI_RELEASE_response),
+ STR(UNIAPI_RELEASE_confirm),
+ STR(UNIAPI_NOTIFY_request),
+ STR(UNIAPI_NOTIFY_indication),
+ STR(UNIAPI_STATUS_indication),
+ STR(UNIAPI_STATUS_ENQUIRY_request),
+ STR(UNIAPI_ADD_PARTY_request),
+ STR(UNIAPI_ADD_PARTY_indication),
+ STR(UNIAPI_PARTY_ALERTING_request),
+ STR(UNIAPI_PARTY_ALERTING_indication),
+ STR(UNIAPI_ADD_PARTY_ACK_request),
+ STR(UNIAPI_ADD_PARTY_ACK_indication),
+ STR(UNIAPI_ADD_PARTY_REJ_request),
+ STR(UNIAPI_ADD_PARTY_REJ_indication),
+ STR(UNIAPI_DROP_PARTY_request),
+ STR(UNIAPI_DROP_PARTY_indication),
+ STR(UNIAPI_DROP_PARTY_ACK_request),
+ STR(UNIAPI_DROP_PARTY_ACK_indication),
+ STR(UNIAPI_ABORT_CALL_request),
+};
+
+static const char *verb_names[] = {
+# define UNI_DEBUG_DEFINE(D) [UNI_FAC_##D] #D,
+ UNI_DEBUG_FACILITIES
+# undef UNI_DEBUG_DEFINE
+};
+
+const char *
+uni_facname(enum uni_verb fac)
+{
+ static char buf[40];
+
+ if (fac >= UNI_MAXFACILITY) {
+ sprintf(buf, "FAC%u", fac);
+ return (buf);
+ }
+ return (verb_names[fac]);
+}
+
+const char *
+uni_signame(enum uni_sig sig)
+{
+ static char buf[40];
+
+ if (sig >= UNIAPI_MAXSIG) {
+ sprintf(buf, "UNIAPI_SIG%u", sig);
+ return (buf);
+ }
+ return (sig_names[sig]);
+}
+
+struct unicx *
+uni_context(struct uni *uni)
+{
+ return (&uni->cx);
+}
+
+static void
+uni_init(struct uni *uni)
+{
+ uni->working = 0;
+ uni->cref_alloc = 12;
+ uni->custat = CU_STAT0;
+ uni->glob_start = UNI_CALLSTATE_REST0;
+ uni->glob_respond = UNI_CALLSTATE_REST0;
+}
+
+static void
+uni_stop(struct uni *uni)
+{
+ struct call *c;
+
+ while ((c = TAILQ_FIRST(&uni->calls)) != NULL) {
+ TAILQ_REMOVE(&uni->calls, c, link);
+ uni_destroy_call(c, 1);
+ }
+
+ SIGQ_CLEAR(&uni->workq);
+ SIGQ_CLEAR(&uni->delq);
+}
+
+/*
+ * INSTANCE HANDLING
+ */
+struct uni *
+uni_create(void *arg, const struct uni_funcs *funcs)
+{
+ struct uni *uni;
+
+ if ((uni = INS_ALLOC()) == NULL)
+ return (NULL);
+
+ uni_init(uni);
+
+ uni->funcs = funcs;
+ uni->arg = arg;
+ uni->proto = UNIPROTO_UNI40U;
+ uni->sb_tb = 0;
+ TAILQ_INIT(&uni->workq);
+ TAILQ_INIT(&uni->delq);
+ TIMER_INIT_UNI(uni, t309);
+ uni->timer309 = UNI_T309_DEFAULT;
+ TAILQ_INIT(&uni->calls);
+ uni_initcx(&uni->cx);
+ TIMER_INIT_UNI(uni, t317);
+ TIMER_INIT_UNI(uni, t316);
+
+ uni->timer301 = UNI_T301_DEFAULT;
+ uni->init303 = UNI_T303_CNT_DEFAULT;
+ uni->timer303 = UNI_T303_DEFAULT;
+ uni->init308 = UNI_T308_CNT_DEFAULT;
+ uni->timer308 = UNI_T308_DEFAULT;
+ uni->timer310 = UNI_T310U_DEFAULT;
+ uni->timer313 = UNI_T313_DEFAULT;
+ uni->init316 = UNI_T316_CNT_DEFAULT;
+ uni->timer316 = UNI_T316_DEFAULT;
+ uni->timer317 = UNI_T317_DEFAULT;
+ uni->timer322 = UNI_T322_DEFAULT;
+ uni->init322 = UNI_T322_CNT_DEFAULT;
+ uni->timer397 = UNI_T397_DEFAULT;
+ uni->timer398 = UNI_T398_DEFAULT;
+ uni->timer399 = UNI_T399U_DEFAULT;
+
+ return (uni);
+}
+
+void
+uni_destroy(struct uni *uni)
+{
+ uni_stop(uni);
+
+ TIMER_DESTROY_UNI(uni, t309);
+ TIMER_DESTROY_UNI(uni, t316);
+ TIMER_DESTROY_UNI(uni, t317);
+
+ INS_FREE(uni);
+}
+
+void
+uni_reset(struct uni *uni)
+{
+ uni_stop(uni);
+ uni_init(uni);
+}
+
+
+/*
+ * DISPATCH SSCOP SIGNAL
+ */
+void
+uni_saal_input(struct uni *uni, enum saal_sig sig, struct uni_msg *m)
+{
+ switch (sig) {
+
+ case SAAL_ESTABLISH_indication:
+ if (m != NULL)
+ uni_msg_destroy(m);
+ uni_enq_coord(uni, SIGO_SAAL_ESTABLISH_indication, 0, NULL);
+ break;
+
+ case SAAL_ESTABLISH_confirm:
+ if (m != NULL)
+ uni_msg_destroy(m);
+ uni_enq_coord(uni, SIGO_SAAL_ESTABLISH_confirm, 0, NULL);
+ break;
+
+ case SAAL_RELEASE_confirm:
+ if (m != NULL)
+ uni_msg_destroy(m);
+ uni_enq_coord(uni, SIGO_SAAL_RELEASE_confirm, 0, NULL);
+ break;
+
+ case SAAL_RELEASE_indication:
+ if (m != NULL)
+ uni_msg_destroy(m);
+ uni_enq_coord(uni, SIGO_SAAL_RELEASE_indication, 0, NULL);
+ break;
+
+ case SAAL_DATA_indication:
+ uni_enq_coord(uni, SIGO_SAAL_DATA_indication, 0, m);
+ break;
+
+ case SAAL_UDATA_indication:
+ uni_enq_coord(uni, SIGO_SAAL_UDATA_indication, 0, m);
+ break;
+
+ default:
+ VERBOSE(uni, UNI_FAC_ERR, 1, "bogus saal signal %u", sig);
+ if (m != NULL)
+ uni_msg_destroy(m);
+ break;
+ }
+}
+
+static struct {
+ const char *name;
+ enum uni_sig sig;
+ size_t arglen;
+ u_int coord_sig;
+ u_int proto;
+#define UNIU 0x01
+#define UNIN 0x02
+#define PNNI 0x04
+} maptab[] = {
+ { "LINK-ESTABLISH.request", UNIAPI_LINK_ESTABLISH_request,
+ 0,
+ SIGO_LINK_ESTABLISH_request, UNIU | UNIN },
+ { "LINK-RELEASE.request", UNIAPI_LINK_RELEASE_request,
+ 0,
+ SIGO_LINK_RELEASE_request, UNIU | UNIN },
+
+ { "RESET.request", UNIAPI_RESET_request,
+ sizeof(struct uniapi_reset_request),
+ SIGO_RESET_request, UNIU | UNIN },
+ { "RESET-ERROR.response", UNIAPI_RESET_ERROR_response,
+ sizeof(struct uniapi_reset_error_response),
+ SIGO_RESET_ERROR_response, UNIU | UNIN },
+ { "RESET.response", UNIAPI_RESET_response,
+ sizeof(struct uniapi_reset_response),
+ SIGO_RESET_response, UNIU | UNIN },
+
+ { "SETUP.request", UNIAPI_SETUP_request,
+ sizeof(struct uniapi_setup_request),
+ SIGO_SETUP_request, UNIU | UNIN },
+ { "SETUP.response", UNIAPI_SETUP_response,
+ sizeof(struct uniapi_setup_response),
+ SIGO_SETUP_response, UNIU | UNIN },
+ { "SETUP-COMPLETE.request", UNIAPI_SETUP_COMPLETE_request,
+ sizeof(struct uniapi_setup_complete_request),
+ SIGO_SETUP_COMPLETE_request, UNIN },
+ { "PROCEEDING.request", UNIAPI_PROCEEDING_request,
+ sizeof(struct uniapi_proceeding_request),
+ SIGO_PROCEEDING_request, UNIU | UNIN },
+ { "ALERTING.request", UNIAPI_ALERTING_request,
+ sizeof(struct uniapi_alerting_request),
+ SIGO_ALERTING_request, UNIU | UNIN },
+ { "RELEASE.request", UNIAPI_RELEASE_request,
+ sizeof(struct uniapi_release_request),
+ SIGO_RELEASE_request, UNIU | UNIN },
+ { "RELEASE.response", UNIAPI_RELEASE_response,
+ sizeof(struct uniapi_release_response),
+ SIGO_RELEASE_response, UNIU | UNIN },
+ { "NOTIFY.request", UNIAPI_NOTIFY_request,
+ sizeof(struct uniapi_notify_request),
+ SIGO_NOTIFY_request, UNIU | UNIN },
+ { "STATUS-ENQUIRY.request", UNIAPI_STATUS_ENQUIRY_request,
+ sizeof(struct uniapi_status_enquiry_request),
+ SIGO_STATUS_ENQUIRY_request, UNIU | UNIN },
+
+ { "ADD-PARTY.request", UNIAPI_ADD_PARTY_request,
+ sizeof(struct uniapi_add_party_request),
+ SIGO_ADD_PARTY_request, UNIU | UNIN },
+ { "ADD-PARTY-ACK.request", UNIAPI_ADD_PARTY_ACK_request,
+ sizeof(struct uniapi_add_party_ack_request),
+ SIGO_ADD_PARTY_ACK_request, UNIU | UNIN },
+ { "ADD-PARTY-REJ.request", UNIAPI_ADD_PARTY_REJ_request,
+ sizeof(struct uniapi_add_party_rej_request),
+ SIGO_ADD_PARTY_REJ_request, UNIU | UNIN },
+ { "PARTY-ALERTING.request", UNIAPI_PARTY_ALERTING_request,
+ sizeof(struct uniapi_party_alerting_request),
+ SIGO_PARTY_ALERTING_request, UNIU | UNIN },
+ { "DROP-PARTY.request", UNIAPI_DROP_PARTY_request,
+ sizeof(struct uniapi_drop_party_request),
+ SIGO_DROP_PARTY_request, UNIU | UNIN },
+ { "DROP-PARTY-ACK.request", UNIAPI_DROP_PARTY_ACK_request,
+ sizeof(struct uniapi_drop_party_ack_request),
+ SIGO_DROP_PARTY_ACK_request, UNIU | UNIN },
+
+ { "ABORT-CALL.request", UNIAPI_ABORT_CALL_request,
+ sizeof(struct uniapi_abort_call_request),
+ SIGO_ABORT_CALL_request, UNIU | UNIN },
+
+ { NULL, 0, 0, 0, 0 }
+};
+
+void
+uni_uni_input(struct uni *uni, enum uni_sig sig, uint32_t cookie,
+ struct uni_msg *m)
+{
+ u_int i;
+
+ for (i = 0; maptab[i].name != NULL; i++) {
+ if (maptab[i].sig == sig) {
+ if (uni->proto == UNIPROTO_UNI40U) {
+ if (!(maptab[i].proto & UNIU))
+ uniapi_uni_error(uni,
+ UNIAPI_ERROR_BAD_SIGNAL, cookie, 0);
+ } else if(uni->proto == UNIPROTO_UNI40N) {
+ if (!(maptab[i].proto & UNIN))
+ uniapi_uni_error(uni,
+ UNIAPI_ERROR_BAD_SIGNAL, cookie, 0);
+ } else if(uni->proto == UNIPROTO_PNNI10) {
+ if (!(maptab[i].proto & PNNI))
+ uniapi_uni_error(uni,
+ UNIAPI_ERROR_BAD_SIGNAL, cookie, 0);
+ } else {
+ uniapi_uni_error(uni,
+ UNIAPI_ERROR_BAD_SIGNAL, cookie, 0);
+ }
+ if (uni_msg_len(m) != maptab[i].arglen) {
+ VERBOSE(uni, UNI_FAC_ERR, 1, "bogus data in %s"
+ " (expecting %zu, got %zu)", maptab[i].name,
+ maptab[i].arglen, uni_msg_len(m));
+ uni_msg_destroy(m);
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_ARG,
+ cookie, 0);
+ return;
+ }
+ if (maptab[i].arglen == 0) {
+ uni_msg_destroy(m);
+ m = NULL;
+ }
+ VERBOSE(uni, UNI_FAC_API, 1, "got signal %s - "
+ "delivering to Coord", maptab[i].name);
+ uni_enq_coord(uni, maptab[i].coord_sig, cookie, m);
+ return;
+ }
+ }
+ VERBOSE(uni, UNI_FAC_ERR, 1, "bogus uni signal %u", sig);
+ uni_msg_destroy(m);
+ uniapi_uni_error(uni, UNIAPI_ERROR_BAD_SIGNAL, cookie, 0);
+}
+#undef UNIU
+#undef UNIN
+#undef PNNI
+
+/**************************************************************/
+
+void
+uni_work(struct uni *uni)
+{
+ struct sig *s;
+
+ if (uni->working)
+ return;
+ uni->working = 1;
+
+ while ((s = TAILQ_FIRST(&uni->workq)) != NULL) {
+ TAILQ_REMOVE(&uni->workq, s, link);
+ switch (s->type) {
+
+ case SIG_COORD:
+ uni_sig_coord(uni, s->sig, s->cookie, s->msg);
+ break;
+
+ case SIG_RESET_START:
+ uni_sig_start(uni, s->sig, s->cookie, s->msg, s->u);
+ break;
+
+ case SIG_RESET_RESP:
+ uni_sig_respond(uni, s->sig, s->cookie, s->msg, s->u);
+ break;
+
+ case SIG_CALL:
+ uni_sig_call(s->call, s->sig, s->cookie, s->msg, s->u);
+ break;
+
+ case SIG_PARTY:
+ uni_sig_party(s->party, s->sig, s->cookie, s->msg, s->u);
+ break;
+
+ default:
+ ASSERT(0, ("bad signal type"));
+ }
+ SIG_FREE(s);
+ }
+
+ uni->working = 0;
+}
+
+/*
+ * Enqueue a signal in the working queue
+ */
+void
+uni_enq_sig(struct uni *uni, u_int type, struct call *call,
+ struct party *party, uint32_t sig, uint32_t cookie,
+ struct uni_msg *msg, struct uni_all *u)
+{
+ struct sig *s;
+
+ if ((s = SIG_ALLOC()) != NULL) {
+ s->type = type;
+ s->sig = sig;
+ s->cookie = cookie;
+ s->msg = msg;
+ s->call = call;
+ s->party = party;
+ s->u = u;
+ TAILQ_INSERT_TAIL(&uni->workq, s, link);
+ }
+}
+
+/*
+ * Enqueue a signal in the delayed queue
+ */
+void
+uni_delenq_sig(struct uni *uni, u_int type, struct call *call,
+ struct party *party, uint32_t sig, uint32_t cookie,
+ struct uni_msg *msg, struct uni_all *u)
+{
+ struct sig *s;
+
+ if ((s = SIG_ALLOC()) != NULL) {
+ s->type = type;
+ s->sig = sig;
+ s->cookie = cookie;
+ s->msg = msg;
+ s->call = call;
+ s->party = party;
+ s->u = u;
+ TAILQ_INSERT_TAIL(&uni->delq, s, link);
+ }
+}
+
+/**************************************************************/
+
+void
+uniapi_uni_error(struct uni *uni, uint32_t reason, uint32_t cookie,
+ uint32_t state)
+{
+ struct uni_msg *resp;
+ struct uniapi_error *err;
+
+ if (cookie == 0)
+ return;
+
+ resp = uni_msg_alloc(sizeof(struct uniapi_error));
+ err = uni_msg_wptr(resp, struct uniapi_error *);
+ resp->b_wptr += sizeof(struct uniapi_error);
+
+ err->reason = reason;
+ err->state = state;
+
+ uni->funcs->uni_output(uni, uni->arg, UNIAPI_ERROR, cookie, resp);
+}
+
+void
+uniapi_call_error(struct call *c, uint32_t reason, uint32_t cookie)
+{
+ uniapi_uni_error(c->uni, reason, cookie, callstates[c->cstate].ext);
+}
+void
+uniapi_party_error(struct party *p, uint32_t reason, uint32_t cookie)
+{
+ uniapi_uni_error(p->call->uni, reason, cookie,
+ callstates[p->call->cstate].ext);
+}
+
+/**************************************************************/
+void
+uni_status(struct uni *uni, void *arg)
+{
+ uni->funcs->status(uni, uni->arg, arg,
+ "working: %s\n", uni->working ? "yes" : "no");
+ uni->funcs->status(uni, uni->arg, arg,
+ "work queue: %sempty\n", TAILQ_EMPTY(&uni->workq)? "" : "not ");
+ uni->funcs->status(uni, uni->arg, arg,
+ "delayed work queue: %sempty\n",
+ TAILQ_EMPTY(&uni->delq)? "" : "not ");
+ uni->funcs->status(uni, uni->arg, arg,
+ "coordinator: %s\n", custat_names[uni->custat]);
+ uni->funcs->status(uni, uni->arg, arg,
+ "reset-start: %s\n", globstat_names[uni->glob_start]);
+ uni->funcs->status(uni, uni->arg, arg,
+ "reset-respond: %s\n", globstat_names[uni->glob_respond]);
+}
+
+void
+uni_undel(struct uni *uni, int (*filter)(struct sig *, void *), void *arg)
+{
+ struct sigqueue newq;
+ struct sig *s, *s1;
+
+ if (TAILQ_EMPTY(&uni->delq))
+ return;
+
+ TAILQ_INIT(&newq);
+
+ s = TAILQ_FIRST(&uni->delq);
+ while (s != NULL) {
+ s1 = TAILQ_NEXT(s, link);
+ if ((*filter)(s, arg)) {
+ TAILQ_REMOVE(&uni->delq, s, link);
+ TAILQ_INSERT_TAIL(&uni->workq, s, link);
+ }
+ s = s1;
+ }
+}
+
+void
+uni_delsig(struct uni *uni, u_int type, struct call *c, struct party *p)
+{
+ struct sig *s, *s1;
+
+ s = TAILQ_FIRST(&uni->workq);
+ while (s != NULL) {
+ s1 = TAILQ_NEXT(s, link);
+ if ((type == SIG_CALL && s->type == SIG_CALL &&
+ s->call == c) ||
+ (type == SIG_PARTY && s->type == SIG_PARTY &&
+ s->call == c && s->party == p)) {
+ TAILQ_REMOVE(&uni->workq, s, link);
+ if (s->msg)
+ uni_msg_destroy(s->msg);
+ if (s->u)
+ UNI_FREE(s->u);
+ SIG_FREE(s);
+ }
+ s = s1;
+ }
+
+ s = TAILQ_FIRST(&uni->delq);
+ while (s != NULL) {
+ s1 = TAILQ_NEXT(s, link);
+ if ((type == SIG_CALL && s->type == SIG_CALL &&
+ s->call == c) ||
+ (type == SIG_PARTY && s->type == SIG_PARTY &&
+ s->call == c && s->party == p)) {
+ TAILQ_REMOVE(&uni->delq, s, link);
+ if (s->msg)
+ uni_msg_destroy(s->msg);
+ if (s->u)
+ UNI_FREE(s->u);
+ SIG_FREE(s); \
+ }
+ s = s1;
+ }
+}
+
+/**************************************************************/
+
+void
+uni_get_config(const struct uni *uni, struct uni_config *config)
+{
+ config->proto = uni->proto;
+
+ config->popt = 0;
+ if (uni->cx.q2932)
+ config->popt |= UNIPROTO_GFP;
+
+ config->option = 0;
+ if (uni->cx.git_hard)
+ config->option |= UNIOPT_GIT_HARD;
+ if (uni->cx.bearer_hard)
+ config->option |= UNIOPT_BEARER_HARD;
+ if (uni->cx.cause_hard)
+ config->option |= UNIOPT_CAUSE_HARD;
+ if (uni->sb_tb)
+ config->popt |= UNIPROTO_SB_TB;
+
+ config->timer301 = uni->timer301;
+ config->timer303 = uni->timer303;
+ config->init303 = uni->init303;
+ config->timer308 = uni->timer308;
+ config->init308 = uni->init308;
+ config->timer309 = uni->timer309;
+ config->timer310 = uni->timer310;
+ config->timer313 = uni->timer313;
+ config->timer316 = uni->timer316;
+ config->init316 = uni->init316;
+ config->timer317 = uni->timer317;
+ config->timer322 = uni->timer322;
+ config->init322 = uni->init322;
+ config->timer397 = uni->timer397;
+ config->timer398 = uni->timer398;
+ config->timer399 = uni->timer399;
+}
+
+void
+uni_set_config(struct uni *uni, const struct uni_config *config,
+ uint32_t *mask, uint32_t *popt_mask, uint32_t *opt_mask)
+{
+ int idle;
+
+ idle = TAILQ_EMPTY(&uni->calls) &&
+ TAILQ_EMPTY(&uni->workq) &&
+ TAILQ_EMPTY(&uni->delq);
+
+ if ((*mask & UNICFG_PROTO) && idle) {
+ switch (config->proto) {
+
+ case UNIPROTO_UNI40U:
+ case UNIPROTO_UNI40N:
+ /* case UNIPROTO_PNNI10: XXX */
+ uni->proto = config->proto;
+ *mask &= ~UNICFG_PROTO;
+ break;
+ }
+ }
+ if (*popt_mask & UNIPROTO_GFP) {
+ if (config->popt & UNIPROTO_GFP) {
+ uni->cx.q2932 = 1;
+ *popt_mask &= ~UNIPROTO_GFP;
+ } else {
+ if (!uni->cx.q2932 || idle) {
+ uni->cx.q2932 = 0;
+ *popt_mask &= ~UNIPROTO_GFP;
+ }
+ }
+ }
+ if (*popt_mask & UNIPROTO_SB_TB) {
+ uni->sb_tb = ((config->popt & UNIPROTO_SB_TB) != 0);
+ *popt_mask &= ~UNIPROTO_SB_TB;
+ }
+ if (*opt_mask & UNIOPT_GIT_HARD) {
+ uni->cx.git_hard = ((config->option & UNIOPT_GIT_HARD) != 0);
+ *opt_mask &= ~UNIOPT_GIT_HARD;
+ }
+ if (*opt_mask & UNIOPT_BEARER_HARD) {
+ uni->cx.bearer_hard = ((config->option & UNIOPT_BEARER_HARD) != 0);
+ *opt_mask &= ~UNIOPT_BEARER_HARD;
+ }
+ if (*opt_mask & UNIOPT_CAUSE_HARD) {
+ uni->cx.cause_hard = ((config->option & UNIOPT_CAUSE_HARD) != 0);
+ *opt_mask &= ~UNIOPT_CAUSE_HARD;
+ }
+
+#define SET_TIMER(NAME,name) \
+ if (*mask & UNICFG_##NAME) { \
+ uni->name = config->name; \
+ *mask &= ~UNICFG_##NAME; \
+ }
+
+ SET_TIMER(TIMER301, timer301);
+ SET_TIMER(TIMER303, timer303);
+ SET_TIMER(INIT303, init303);
+ SET_TIMER(TIMER308, timer308);
+ SET_TIMER(INIT308, init308);
+ SET_TIMER(TIMER309, timer309);
+ SET_TIMER(TIMER310, timer310);
+ SET_TIMER(TIMER313, timer313);
+ SET_TIMER(TIMER316, timer316);
+ SET_TIMER(INIT316, init316);
+ SET_TIMER(TIMER317, timer317);
+ SET_TIMER(TIMER322, timer322);
+ SET_TIMER(INIT322, init322);
+ SET_TIMER(TIMER397, timer397);
+ SET_TIMER(TIMER398, timer398);
+ SET_TIMER(TIMER399, timer399);
+
+#undef SET_TIMER
+}
+
+void
+uni_set_debug(struct uni *uni, enum uni_verb fac, u_int level)
+{
+ uni->debug[fac] = level;
+}
+
+u_int
+uni_get_debug(const struct uni *uni, enum uni_verb fac)
+{
+ return (uni->debug[fac]);
+}
+
+u_int
+uni_getcustate(const struct uni *uni)
+{
+ return (uni->custat);
+}
diff --git a/sys/contrib/ngatm/netnatm/sig/sig_unimsgcpy.c b/sys/contrib/ngatm/netnatm/sig/sig_unimsgcpy.c
new file mode 100644
index 0000000..1653ba7
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/sig_unimsgcpy.c
@@ -0,0 +1,594 @@
+/* This file was created automatically
+ * Source file: $Begemot: libunimsg/atm/msg/msg.def,v 1.3 2003/09/19 11:58:15 hbb Exp $
+ * $FreeBSD$
+ */
+
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/sig/unimsgcpy.h>
+
+void
+copy_msg_alerting(struct uni_alerting *src, struct uni_alerting *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->connid))
+ dst->connid = src->connid;
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ if(IE_ISGOOD(src->report))
+ dst->report = src->report;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_call_proc(struct uni_call_proc *src, struct uni_call_proc *dst)
+{
+ if(IE_ISGOOD(src->connid))
+ dst->connid = src->connid;
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_connect(struct uni_connect *src, struct uni_connect *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->aal))
+ dst->aal = src->aal;
+ if(IE_ISGOOD(src->blli))
+ dst->blli = src->blli;
+ if(IE_ISGOOD(src->connid))
+ dst->connid = src->connid;
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->conned))
+ dst->conned = src->conned;
+ if(IE_ISGOOD(src->connedsub))
+ dst->connedsub = src->connedsub;
+ if(IE_ISGOOD(src->eetd))
+ dst->eetd = src->eetd;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ if(IE_ISGOOD(src->traffic))
+ dst->traffic = src->traffic;
+ if(IE_ISGOOD(src->exqos))
+ dst->exqos = src->exqos;
+ if(IE_ISGOOD(src->facility))
+ dst->facility = src->facility;
+ if(IE_ISGOOD(src->abrsetup))
+ dst->abrsetup = src->abrsetup;
+ if(IE_ISGOOD(src->abradd))
+ dst->abradd = src->abradd;
+ if(IE_ISGOOD(src->called_soft))
+ dst->called_soft = src->called_soft;
+ if(IE_ISGOOD(src->report))
+ dst->report = src->report;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_connect_ack(struct uni_connect_ack *src, struct uni_connect_ack *dst)
+{
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_release(struct uni_release *src, struct uni_release *dst)
+{
+ u_int s, d;
+
+ for(s = d = 0; s < 2; s++)
+ if(IE_ISGOOD(src->cause[s]))
+ dst->cause[d++] = src->cause[s];
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ if(IE_ISGOOD(src->facility))
+ dst->facility = src->facility;
+ if(IE_ISGOOD(src->crankback))
+ dst->crankback = src->crankback;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_release_compl(struct uni_release_compl *src, struct uni_release_compl *dst)
+{
+ u_int s, d;
+
+ for(s = d = 0; s < 2; s++)
+ if(IE_ISGOOD(src->cause[s]))
+ dst->cause[d++] = src->cause[s];
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ if(IE_ISGOOD(src->crankback))
+ dst->crankback = src->crankback;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_setup(struct uni_setup *src, struct uni_setup *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->aal))
+ dst->aal = src->aal;
+ if(IE_ISGOOD(src->traffic))
+ dst->traffic = src->traffic;
+ if(IE_ISGOOD(src->bearer))
+ dst->bearer = src->bearer;
+ if(IE_ISGOOD(src->bhli))
+ dst->bhli = src->bhli;
+ if(IE_ISGOOD(src->blli_repeat))
+ dst->blli_repeat = src->blli_repeat;
+ for(s = d = 0; s < UNI_NUM_IE_BLLI; s++)
+ if(IE_ISGOOD(src->blli[s]))
+ dst->blli[d++] = src->blli[s];
+ if(IE_ISGOOD(src->called))
+ dst->called = src->called;
+ for(s = d = 0; s < UNI_NUM_IE_CALLEDSUB; s++)
+ if(IE_ISGOOD(src->calledsub[s]))
+ dst->calledsub[d++] = src->calledsub[s];
+ if(IE_ISGOOD(src->calling))
+ dst->calling = src->calling;
+ for(s = d = 0; s < UNI_NUM_IE_CALLINGSUB; s++)
+ if(IE_ISGOOD(src->callingsub[s]))
+ dst->callingsub[d++] = src->callingsub[s];
+ if(IE_ISGOOD(src->connid))
+ dst->connid = src->connid;
+ if(IE_ISGOOD(src->qos))
+ dst->qos = src->qos;
+ if(IE_ISGOOD(src->eetd))
+ dst->eetd = src->eetd;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->scompl))
+ dst->scompl = src->scompl;
+ for(s = d = 0; s < UNI_NUM_IE_TNS; s++)
+ if(IE_ISGOOD(src->tns[s]))
+ dst->tns[d++] = src->tns[s];
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->atraffic))
+ dst->atraffic = src->atraffic;
+ if(IE_ISGOOD(src->mintraffic))
+ dst->mintraffic = src->mintraffic;
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->lij_callid))
+ dst->lij_callid = src->lij_callid;
+ if(IE_ISGOOD(src->lij_param))
+ dst->lij_param = src->lij_param;
+ if(IE_ISGOOD(src->lij_seqno))
+ dst->lij_seqno = src->lij_seqno;
+ if(IE_ISGOOD(src->exqos))
+ dst->exqos = src->exqos;
+ if(IE_ISGOOD(src->abrsetup))
+ dst->abrsetup = src->abrsetup;
+ if(IE_ISGOOD(src->abradd))
+ dst->abradd = src->abradd;
+ if(IE_ISGOOD(src->cscope))
+ dst->cscope = src->cscope;
+ if(IE_ISGOOD(src->calling_soft))
+ dst->calling_soft = src->calling_soft;
+ if(IE_ISGOOD(src->called_soft))
+ dst->called_soft = src->called_soft;
+ if(IE_ISGOOD(src->dtl_repeat))
+ dst->dtl_repeat = src->dtl_repeat;
+ for(s = d = 0; s < UNI_NUM_IE_DTL; s++)
+ if(IE_ISGOOD(src->dtl[s]))
+ dst->dtl[d++] = src->dtl[s];
+ if(IE_ISGOOD(src->report))
+ dst->report = src->report;
+ if(IE_ISGOOD(src->mdcr))
+ dst->mdcr = src->mdcr;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_status(struct uni_status *src, struct uni_status *dst)
+{
+ if(IE_ISGOOD(src->callstate))
+ dst->callstate = src->callstate;
+ if(IE_ISGOOD(src->cause))
+ dst->cause = src->cause;
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->epstate))
+ dst->epstate = src->epstate;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_status_enq(struct uni_status_enq *src, struct uni_status_enq *dst)
+{
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_notify(struct uni_notify *src, struct uni_notify *dst)
+{
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_restart(struct uni_restart *src, struct uni_restart *dst)
+{
+ if(IE_ISGOOD(src->connid))
+ dst->connid = src->connid;
+ if(IE_ISGOOD(src->restart))
+ dst->restart = src->restart;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_restart_ack(struct uni_restart_ack *src, struct uni_restart_ack *dst)
+{
+ if(IE_ISGOOD(src->connid))
+ dst->connid = src->connid;
+ if(IE_ISGOOD(src->restart))
+ dst->restart = src->restart;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_add_party(struct uni_add_party *src, struct uni_add_party *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->aal))
+ dst->aal = src->aal;
+ if(IE_ISGOOD(src->bhli))
+ dst->bhli = src->bhli;
+ if(IE_ISGOOD(src->blli))
+ dst->blli = src->blli;
+ if(IE_ISGOOD(src->called))
+ dst->called = src->called;
+ for(s = d = 0; s < UNI_NUM_IE_CALLEDSUB; s++)
+ if(IE_ISGOOD(src->calledsub[s]))
+ dst->calledsub[d++] = src->calledsub[s];
+ if(IE_ISGOOD(src->calling))
+ dst->calling = src->calling;
+ for(s = d = 0; s < UNI_NUM_IE_CALLINGSUB; s++)
+ if(IE_ISGOOD(src->callingsub[s]))
+ dst->callingsub[d++] = src->callingsub[s];
+ if(IE_ISGOOD(src->scompl))
+ dst->scompl = src->scompl;
+ for(s = d = 0; s < UNI_NUM_IE_TNS; s++)
+ if(IE_ISGOOD(src->tns[s]))
+ dst->tns[d++] = src->tns[s];
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->eetd))
+ dst->eetd = src->eetd;
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->lij_seqno))
+ dst->lij_seqno = src->lij_seqno;
+ if(IE_ISGOOD(src->calling_soft))
+ dst->calling_soft = src->calling_soft;
+ if(IE_ISGOOD(src->called_soft))
+ dst->called_soft = src->called_soft;
+ if(IE_ISGOOD(src->dtl_repeat))
+ dst->dtl_repeat = src->dtl_repeat;
+ for(s = d = 0; s < UNI_NUM_IE_DTL; s++)
+ if(IE_ISGOOD(src->dtl[s]))
+ dst->dtl[d++] = src->dtl[s];
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_add_party_ack(struct uni_add_party_ack *src, struct uni_add_party_ack *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->aal))
+ dst->aal = src->aal;
+ if(IE_ISGOOD(src->blli))
+ dst->blli = src->blli;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->eetd))
+ dst->eetd = src->eetd;
+ if(IE_ISGOOD(src->conned))
+ dst->conned = src->conned;
+ if(IE_ISGOOD(src->connedsub))
+ dst->connedsub = src->connedsub;
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->called_soft))
+ dst->called_soft = src->called_soft;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_party_alerting(struct uni_party_alerting *src, struct uni_party_alerting *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_add_party_rej(struct uni_add_party_rej *src, struct uni_add_party_rej *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->cause))
+ dst->cause = src->cause;
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->crankback))
+ dst->crankback = src->crankback;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_drop_party(struct uni_drop_party *src, struct uni_drop_party *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->cause))
+ dst->cause = src->cause;
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_drop_party_ack(struct uni_drop_party_ack *src, struct uni_drop_party_ack *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->cause))
+ dst->cause = src->cause;
+ if(IE_ISGOOD(src->uu))
+ dst->uu = src->uu;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_leaf_setup_req(struct uni_leaf_setup_req *src, struct uni_leaf_setup_req *dst)
+{
+ u_int s, d;
+
+ for(s = d = 0; s < UNI_NUM_IE_TNS; s++)
+ if(IE_ISGOOD(src->tns[s]))
+ dst->tns[d++] = src->tns[s];
+ if(IE_ISGOOD(src->calling))
+ dst->calling = src->calling;
+ for(s = d = 0; s < UNI_NUM_IE_CALLINGSUB; s++)
+ if(IE_ISGOOD(src->callingsub[s]))
+ dst->callingsub[d++] = src->callingsub[s];
+ if(IE_ISGOOD(src->called))
+ dst->called = src->called;
+ for(s = d = 0; s < UNI_NUM_IE_CALLEDSUB; s++)
+ if(IE_ISGOOD(src->calledsub[s]))
+ dst->calledsub[d++] = src->calledsub[s];
+ if(IE_ISGOOD(src->lij_callid))
+ dst->lij_callid = src->lij_callid;
+ if(IE_ISGOOD(src->lij_seqno))
+ dst->lij_seqno = src->lij_seqno;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_leaf_setup_fail(struct uni_leaf_setup_fail *src, struct uni_leaf_setup_fail *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->cause))
+ dst->cause = src->cause;
+ if(IE_ISGOOD(src->called))
+ dst->called = src->called;
+ if(IE_ISGOOD(src->calledsub))
+ dst->calledsub = src->calledsub;
+ if(IE_ISGOOD(src->lij_seqno))
+ dst->lij_seqno = src->lij_seqno;
+ for(s = d = 0; s < UNI_NUM_IE_TNS; s++)
+ if(IE_ISGOOD(src->tns[s]))
+ dst->tns[d++] = src->tns[s];
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_cobisetup(struct uni_cobisetup *src, struct uni_cobisetup *dst)
+{
+ if(IE_ISGOOD(src->facility))
+ dst->facility = src->facility;
+ if(IE_ISGOOD(src->called))
+ dst->called = src->called;
+ if(IE_ISGOOD(src->calledsub))
+ dst->calledsub = src->calledsub;
+ if(IE_ISGOOD(src->calling))
+ dst->calling = src->calling;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_facility(struct uni_facility *src, struct uni_facility *dst)
+{
+ if(IE_ISGOOD(src->facility))
+ dst->facility = src->facility;
+ if(IE_ISGOOD(src->called))
+ dst->called = src->called;
+ if(IE_ISGOOD(src->calledsub))
+ dst->calledsub = src->calledsub;
+ if(IE_ISGOOD(src->calling))
+ dst->calling = src->calling;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_modify_req(struct uni_modify_req *src, struct uni_modify_req *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->traffic))
+ dst->traffic = src->traffic;
+ if(IE_ISGOOD(src->atraffic))
+ dst->atraffic = src->atraffic;
+ if(IE_ISGOOD(src->mintraffic))
+ dst->mintraffic = src->mintraffic;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_modify_ack(struct uni_modify_ack *src, struct uni_modify_ack *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->report))
+ dst->report = src->report;
+ if(IE_ISGOOD(src->traffic))
+ dst->traffic = src->traffic;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_modify_rej(struct uni_modify_rej *src, struct uni_modify_rej *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->cause))
+ dst->cause = src->cause;
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_conn_avail(struct uni_conn_avail *src, struct uni_conn_avail *dst)
+{
+ u_int s, d;
+
+ if(IE_ISGOOD(src->notify))
+ dst->notify = src->notify;
+ for(s = d = 0; s < UNI_NUM_IE_GIT; s++)
+ if(IE_ISGOOD(src->git[s]))
+ dst->git[d++] = src->git[s];
+ if(IE_ISGOOD(src->report))
+ dst->report = src->report;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
+
+void
+copy_msg_unknown(struct uni_unknown *src, struct uni_unknown *dst)
+{
+ if(IE_ISGOOD(src->epref))
+ dst->epref = src->epref;
+ if(IE_ISGOOD(src->unrec))
+ dst->unrec = src->unrec;
+}
diff --git a/sys/contrib/ngatm/netnatm/sig/sig_verify.c b/sys/contrib/ngatm/netnatm/sig/sig_verify.c
new file mode 100644
index 0000000..ae78ed8
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/sig_verify.c
@@ -0,0 +1,442 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/sig/sig_verify.c,v 1.19 2004/07/08 08:22:23 brandt Exp $
+ *
+ * Message verification with explicit action indicators.
+ */
+
+#include <netnatm/unimsg.h>
+#include <netnatm/saal/sscfudef.h>
+#include <netnatm/msg/unistruct.h>
+#include <netnatm/msg/unimsglib.h>
+#include <netnatm/sig/uni.h>
+
+#include <netnatm/sig/unipriv.h>
+#include <netnatm/sig/unimkmsg.h>
+
+void
+uni_mandate_ie(struct uni *uni, enum uni_ietype ie)
+{
+ struct uni_ierr *e;
+
+ FOREACH_ERR(e, uni)
+ if (e->ie == ie) {
+ e->man = 1;
+ return;
+ }
+ if (UNI_SAVE_IERR(&uni->cx, ie, UNI_IEACT_DEFAULT, UNI_IERR_MIS))
+ uni->cx.err[uni->cx.errcnt - 1].man = 1;
+}
+
+/*
+ * This special handling is required for ADD PARTY, PARTY ALERTING and
+ * ADD PARTY ACKNOWLEDGE by Q.2971 9.5.3.2.1.
+ * It means, that the EPREF should be handled as mandatory only if
+ * no other IEs have explicit action indicators.
+ */
+void
+uni_mandate_epref(struct uni *uni, struct uni_ie_epref *epref)
+{
+ struct uni_ierr *e;
+ int maxact;
+
+ if (!IE_ISPRESENT(*epref)) {
+ /*
+ * 9.5.3.2.1 -- missing endpoint reference
+ */
+
+ /*
+ * a) if any unrecognized or IE with error has a CLEAR
+ * action indicator, this takes precedence.
+ * b) if any unrecognized or IE with error has a
+ * discard message and report action indicator, this takes
+ * precedence.
+ * c) if any unrecognized or IE with error has a
+ * discard message action indicator, this takes
+ * precedence.
+ *
+ * In any of these cases we must remove the EPREF IE
+ * if it has CLEAR, otherwise the CLEAR would take over.
+ */
+ maxact = -1;
+ FOREACH_ERR(e, uni) {
+ if (e->ie == UNI_IE_EPREF)
+ continue;
+ if (e->act == UNI_IEACT_CLEAR)
+ maxact = UNI_IEACT_CLEAR;
+ else if (e->act == UNI_IEACT_MSG_REPORT) {
+ if (maxact == -1 && maxact != UNI_IEACT_CLEAR)
+ maxact = UNI_IEACT_MSG_REPORT;
+ } else if (e->act == UNI_IEACT_MSG_IGNORE) {
+ if (maxact == -1)
+ maxact = UNI_IEACT_MSG_IGNORE;
+ }
+ }
+
+ if (maxact != -1) {
+ /* ok, second pass to remove UNI_IE_EPREF */
+ FOREACH_ERR(e, uni)
+ if (e->ie == UNI_IE_EPREF) {
+ memmove(e, e + 1,
+ (uni->cx.errcnt - (e - uni->cx.err)
+ - 1) * sizeof(uni->cx.err[0]));
+ uni->cx.errcnt--;
+ break;
+ }
+ return;
+
+ }
+
+ /*
+ * d) if nothing of the above, the IE is mandatory
+ */
+ uni_mandate_ie(uni, UNI_IE_EPREF);
+ return;
+
+ }
+ if (IE_ISGOOD(*epref))
+ return;
+
+ /*
+ * It has an error obviously
+ * 9.5.3.2.2
+ *
+ * It turns out, that Q.2931 handling just does the right thing
+ * if we don't mandate the IE.
+ */
+ return;
+}
+
+/*
+ * Look, what to do with this message. We assume, that the message itself is
+ * recognized.
+ *
+ * This is rather complicated. We must use the information provided in the
+ * fields of the context, because IEs with length errors may not be set
+ * altogether.
+ */
+enum verify
+uni_verify(struct uni *uni, enum uni_msgact msgact)
+{
+ struct uni_ierr *e1;
+
+ if (uni->debug[UNI_FAC_VERIFY] >= 2) {
+ FOREACH_ERR(e1, uni) {
+ VERBOSE(uni, UNI_FAC_VERIFY, 2, "ie=%02x err=%u man=%d"
+ " act=%u", e1->ie, e1->err, e1->man, e1->act);
+ }
+ }
+
+ /*
+ * Look for missing mandatory IEs. The action indicator is ignored
+ * according to 5.6.7.1. If IEs are missing the action is to
+ * ignore the message and report status for all messages except
+ * RELEASE, RELEASE_COMPLETE and SETUP. Because we must differentiate
+ * this RAI from other RAIs in this case, use another return code.
+ * Note, that mandatory IEs with errors are not handled here.
+ */
+ FOREACH_ERR(e1, uni) {
+ if (e1->err == UNI_IERR_MIS) {
+ MK_IE_CAUSE(uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_MANDAT);
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "RAIM");
+ return (VFY_RAIM);
+ }
+ }
+
+ /*
+ * When any IE with error specifies a CLR action indicator, this
+ * takes precedence obviously. There are two cases here:
+ * unrecognized IEs and IEs with error. So we look through the
+ * error array twice and send only one STATUS. Unrecognized will
+ * take precedence.
+ *
+ * 5.7.2a)
+ */
+ FOREACH_ERR(e1, uni) {
+ if (e1->act == UNI_IEACT_CLEAR && e1->err == UNI_IERR_UNK) {
+ MK_IE_CAUSE(uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_IE_NIMPL);
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "CLR1");
+ return (VFY_CLR);
+ }
+ }
+
+ FOREACH_ERR(e1, uni) {
+ if (e1->act == UNI_IEACT_CLEAR &&
+ (e1->err == UNI_IERR_LEN || e1->err == UNI_IERR_BAD ||
+ e1->err == UNI_IERR_ACC)) {
+ MK_IE_CAUSE(uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_IE_INV);
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "CLR2");
+ return (VFY_CLR);
+ }
+ }
+
+ /*
+ * Now check, whether anybody wants to explicitly ignore the message
+ * and report status.
+ *
+ * 5.7.2a)
+ */
+ FOREACH_ERR(e1, uni) {
+ if (e1->act == UNI_IEACT_MSG_REPORT && e1->err == UNI_IERR_UNK) {
+ MK_IE_CAUSE(uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_IE_NIMPL);
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "RAI");
+ return (VFY_RAI);
+ }
+ }
+
+ FOREACH_ERR(e1, uni) {
+ if (e1->act == UNI_IEACT_MSG_REPORT &&
+ (e1->err == UNI_IERR_LEN || e1->err == UNI_IERR_BAD ||
+ e1->err == UNI_IERR_ACC)) {
+ MK_IE_CAUSE(uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_IE_INV);
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "RAI");
+ return (VFY_RAI);
+ }
+ }
+
+ /*
+ * Now look whether some IE wants to explicitely ignore the message
+ * without any report.
+ */
+ FOREACH_ERR(e1, uni) {
+ if (e1->act == UNI_IEACT_MSG_IGNORE) {
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "I1");
+ return (VFY_I);
+ }
+ }
+
+ /*
+ * At this point we have left only
+ * mandatory and non-mandatory IEs with error that want the IE to be
+ * ignored or ignored with report or defaulted.
+ * Because a mandatory IE with errors lead to
+ * the message beeing ignored, we make this of higher
+ * precedence, than the rest.
+ */
+ FOREACH_ERR(e1, uni) {
+ if (e1->man) {
+ MK_IE_CAUSE(uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_MANDAT);
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "RAI");
+ return (VFY_RAI);
+ }
+ }
+
+ /*
+ * Now look for ignoring the IE and reporting. This takes precedence
+ * over simply ignoring it. We also collect defaulted (non-mandatory)
+ * IEs.
+ *
+ * 5.7.2d) and 5.6.8.1
+ */
+ FOREACH_ERR(e1, uni) {
+ if ((e1->act == UNI_IEACT_DEFAULT ||
+ e1->act == UNI_IEACT_REPORT)
+ && e1->err != UNI_IERR_UNK) {
+ MK_IE_CAUSE(uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_IE_INV);
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "RAP");
+ return (VFY_RAP);
+ }
+ }
+
+ FOREACH_ERR(e1, uni) {
+ if ((e1->act == UNI_IEACT_DEFAULT ||
+ e1->act == UNI_IEACT_REPORT)
+ && e1->err == UNI_IERR_UNK) {
+ MK_IE_CAUSE(uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_IE_NIMPL);
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "RAPU");
+ return (VFY_RAPU);
+ }
+ }
+
+ /*
+ * This leaves us with IEs, that want to be ignored. Among these may
+ * be mandatory IEs. If we have an mandatory IEs here in the error
+ * array, then the message wil not contain enough information and
+ * must be handled according to 5.8 as either in 5.6.7.1 (this
+ * means, that mandatory IEs cannot really be ignored) or 5.7.1.
+ */
+ FOREACH_ERR(e1, uni) {
+ if (e1->man) {
+ MK_IE_CAUSE(uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_MANDAT);
+ if (msgact == UNI_MSGACT_CLEAR) {
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "CLR3");
+ return (VFY_CLR);
+ }
+ if (msgact == UNI_MSGACT_IGNORE) {
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "I2");
+ return (VFY_I);
+ }
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "RAI");
+ return (VFY_RAI);
+ }
+ }
+
+ /*
+ * Now only non-mandatory IEs are left, that want to be explicitely
+ * ignored.
+ */
+ if (uni->cx.errcnt != 0)
+ MK_IE_CAUSE(uni->cause, UNI_CAUSE_LOC_USER,
+ UNI_CAUSE_IE_INV);
+
+ VERBOSE(uni, UNI_FAC_VERIFY, 1, "OK");
+ return (VFY_OK);
+}
+
+/*
+ * Collect the IE identifiers for some of the known cause codes.
+ */
+void
+uni_vfy_collect_ies(struct uni *uni)
+{
+ struct uni_ierr *e;
+
+#define STUFF_IE(IE) \
+ uni->cause.u.ie.ie[uni->cause.u.ie.len++] = (IE); \
+ if (uni->cause.u.ie.len == UNI_CAUSE_IE_N) \
+ break;
+
+ uni->cause.u.ie.len = 0;
+ if (uni->cause.cause == UNI_CAUSE_MANDAT) {
+ FOREACH_ERR(e, uni) {
+ if (e->err == UNI_IERR_MIS || e->man != 0) {
+ STUFF_IE(e->ie);
+ }
+ }
+
+ } else if (uni->cause.cause == UNI_CAUSE_IE_NIMPL) {
+ FOREACH_ERR(e, uni) {
+ if (e->err == UNI_IERR_UNK) {
+ STUFF_IE(e->ie);
+ }
+ }
+
+ } else if (uni->cause.cause == UNI_CAUSE_IE_INV) {
+ FOREACH_ERR(e, uni) {
+ if (e->err == UNI_IERR_LEN ||
+ e->err == UNI_IERR_BAD ||
+ e->err == UNI_IERR_ACC) {
+ STUFF_IE(e->ie);
+ }
+ }
+ } else
+ return;
+
+ if (uni->cause.u.ie.len != 0)
+ uni->cause.h.present |= UNI_CAUSE_IE_P;
+}
+
+
+void
+uni_respond_status_verify(struct uni *uni, struct uni_cref *cref,
+ enum uni_callstate cs, struct uni_ie_epref *epref,
+ enum uni_epstate ps)
+{
+ struct uni_all *resp;
+
+ if ((resp = UNI_ALLOC()) == NULL)
+ return;
+
+ uni_vfy_collect_ies(uni);
+
+ MK_MSG_RESP(resp, UNI_STATUS, cref);
+ MK_IE_CALLSTATE(resp->u.status.callstate, cs);
+ resp->u.status.cause = uni->cause;
+ if (epref && IE_ISGOOD(*epref)) {
+ MK_IE_EPREF(resp->u.status.epref, epref->epref, !epref->flag);
+ MK_IE_EPSTATE(resp->u.status.epstate, ps);
+ }
+
+ uni_send_output(resp, uni);
+
+ UNI_FREE(resp);
+}
+
+/*
+ * Handling of Q.2971 9.5.8.1:
+ */
+void
+uni_vfy_remove_unknown(struct uni *uni)
+{
+ struct uni_ierr *e1, *e0;
+ int flag = 0;
+
+ FOREACH_ERR(e1, uni) {
+ if (e1->err == UNI_IERR_UNK) {
+ if (e1->act == UNI_IEACT_CLEAR ||
+ e1->act == UNI_IEACT_MSG_IGNORE ||
+ e1->act == UNI_IEACT_MSG_REPORT)
+ return;
+ if (e1->act == UNI_IEACT_REPORT ||
+ e1->act == UNI_IEACT_DEFAULT)
+ flag = 1;
+ }
+ }
+ if (flag)
+ return;
+ e0 = e1 = uni->cx.err;
+ while (e1 < uni->cx.err + uni->cx.errcnt) {
+ if (e1->err != UNI_IERR_UNK) {
+ if (e0 != e1)
+ *e0 = *e1;
+ e0++;
+ }
+ e1++;
+ }
+ uni->cx.errcnt = e0 - uni->cx.err;
+}
+
+/*
+ * Handling for ADD_PARTY_REJ and DROP_PARTY_ACK with bad cause
+ */
+void
+uni_vfy_remove_cause(struct uni *uni)
+{
+ struct uni_ierr *e1, *e0;
+
+ e0 = e1 = uni->cx.err;
+ while (e1 < uni->cx.err + uni->cx.errcnt) {
+ if (e1->ie != UNI_IE_CAUSE) {
+ if (e0 != e1)
+ *e0 = *e1;
+ e0++;
+ }
+ e1++;
+ }
+ uni->cx.errcnt = e0 - uni->cx.err;
+}
diff --git a/sys/contrib/ngatm/netnatm/sig/uni.h b/sys/contrib/ngatm/netnatm/sig/uni.h
new file mode 100644
index 0000000..5af6c44
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/uni.h
@@ -0,0 +1,106 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/sig/uni.h,v 1.5 2004/07/08 08:22:24 brandt Exp $
+ *
+ * Public UNI interface
+ */
+#ifndef _NETNATM_SIG_UNI_H_
+#define _NETNATM_SIG_UNI_H_
+
+#include <netnatm/sig/unidef.h>
+
+struct uni;
+
+/* functions to be supplied by the user */
+struct uni_funcs {
+ /* output to the upper layer */
+ void (*uni_output)(struct uni *, void *, enum uni_sig,
+ uint32_t, struct uni_msg *);
+
+ /* output to the SAAL */
+ void (*saal_output)(struct uni *, void *, enum saal_sig,
+ struct uni_msg *);
+
+ /* verbosity */
+ void (*verbose)(struct uni *, void *, enum uni_verb,
+ const char *, ...) __printflike(4, 5);
+
+ /* function to 'print' status */
+ void (*status)(struct uni *, void *, void *,
+ const char *, ...) __printflike(4, 5);
+
+#ifndef _KERNEL
+ /* start a timer */
+ void *(*start_timer)(struct uni *, void *, u_int,
+ void (*)(void *), void *);
+
+ /* stop a timer */
+ void (*stop_timer)(struct uni *, void *, void *);
+#endif
+};
+
+/* create a UNI instance */
+struct uni *uni_create(void *, const struct uni_funcs *);
+
+/* destroy a UNI instance, free all resources */
+void uni_destroy(struct uni *);
+
+/* generate a status report */
+void uni_status(struct uni *, void *);
+
+/* get current instance configuration */
+void uni_get_config(const struct uni *, struct uni_config *);
+
+/* set new instance configuration */
+void uni_set_config(struct uni *, const struct uni_config *,
+ uint32_t *, uint32_t *, uint32_t *);
+
+/* input from the SAAL to the instance */
+void uni_saal_input(struct uni *, enum saal_sig, struct uni_msg *);
+
+/* input from the upper layer to the instance */
+void uni_uni_input(struct uni *, enum uni_sig, uint32_t, struct uni_msg *);
+
+/* do work on pending signals */
+void uni_work(struct uni *);
+
+/* set debuging level */
+void uni_set_debug(struct uni *, enum uni_verb, u_int level);
+u_int uni_get_debug(const struct uni *, enum uni_verb);
+
+/* reset a UNI instance */
+void uni_reset(struct uni *);
+
+/* states */
+u_int uni_getcustate(const struct uni *);
+
+/* return a reference to the coding/decoding context */
+struct unicx *uni_context(struct uni *);
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/sig/unidef.h b/sys/contrib/ngatm/netnatm/sig/unidef.h
new file mode 100644
index 0000000..7278db8
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/unidef.h
@@ -0,0 +1,480 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/sig/unidef.h,v 1.9 2004/07/08 08:22:24 brandt Exp $
+ *
+ * UNI public definitions.
+ */
+#ifndef _ATM_SIG_UNIDEF_H_
+#define _ATM_SIG_UNIDEF_H_
+
+#ifdef _KERNEL
+#include <sys/stdint.h>
+#else
+#include <stdint.h>
+#endif
+
+/*
+ * Debug facilities
+ */
+#define UNI_DEBUG_FACILITIES \
+ UNI_DEBUG_DEFINE(TIMEOUT) \
+ UNI_DEBUG_DEFINE(RESTART) \
+ UNI_DEBUG_DEFINE(SAAL) \
+ UNI_DEBUG_DEFINE(PARSE) \
+ UNI_DEBUG_DEFINE(CALL) \
+ UNI_DEBUG_DEFINE(WARN) \
+ UNI_DEBUG_DEFINE(COORD) \
+ UNI_DEBUG_DEFINE(API) \
+ UNI_DEBUG_DEFINE(MSG) \
+ UNI_DEBUG_DEFINE(ERR) \
+ UNI_DEBUG_DEFINE(VERIFY) \
+
+enum uni_verb {
+#define UNI_DEBUG_DEFINE(D) UNI_FAC_##D,
+ UNI_DEBUG_FACILITIES
+#undef UNI_DEBUG_DEFINE
+
+ UNI_MAXFACILITY,
+};
+
+/*
+ * Default timer values and repeat counts
+ */
+#define UNI_T301_DEFAULT 180000
+#define UNI_T303_DEFAULT 4000
+#define UNI_T303_CNT_DEFAULT 2
+#define UNI_T308_DEFAULT 30000
+#define UNI_T308_CNT_DEFAULT 2
+#define UNI_T309_DEFAULT 10000
+#define UNI_T310U_DEFAULT 30000
+#define UNI_T310N_DEFAULT 10000
+#define UNI_T313_DEFAULT 4000
+#define UNI_T316_DEFAULT 120000
+#define UNI_T316_CNT_DEFAULT 2
+#define UNI_T317_DEFAULT 90000
+#define UNI_T322_DEFAULT 4000
+#define UNI_T322_CNT_DEFAULT 2
+#define UNI_T397_DEFAULT UNI_T301_DEFAULT
+#define UNI_T398_DEFAULT 4000
+#define UNI_T399U_DEFAULT (UNI_T303_DEFAULT + UNI_T310U_DEFAULT)
+#define UNI_T399N_DEFAULT (UNI_T303_DEFAULT + UNI_T310N_DEFAULT)
+
+/*
+ * Protocol support
+ */
+enum uni_proto {
+ UNIPROTO_UNI40U, /* UNI4.0 user side */
+ UNIPROTO_UNI40N, /* UNI4.0 network side */
+ UNIPROTO_PNNI10, /* PNNI1.0 */
+};
+enum uni_popt {
+ UNIPROTO_GFP = 0x0001, /* enable GFP */
+ UNIPROTO_SB_TB = 0x0002, /* Coincident Sb-Tb/Tb */
+
+ UNIPROTO_ALLMASK = 0x0003,
+};
+
+/*
+ * Other options
+ */
+enum uni_option {
+ UNIOPT_GIT_HARD = 0x0001, /* harder check of GIT IE */
+ UNIOPT_BEARER_HARD = 0x0002, /* harder check of BEARER IE */
+ UNIOPT_CAUSE_HARD = 0x0004, /* harder check of CAUSE IE */
+
+ UNIOPT_ALLMASK = 0x0007,
+};
+
+/*
+ * UNI configuration
+ */
+struct uni_config {
+ uint32_t proto; /* which protocol */
+ uint32_t popt; /* protocol option */
+ uint32_t option; /* other options */
+ uint32_t timer301; /* T301 */
+ uint32_t timer303; /* T303 */
+ uint32_t init303; /* T303 retransmission count */
+ uint32_t timer308; /* T308 */
+ uint32_t init308; /* T308 retransmission count */
+ uint32_t timer309; /* T309 */
+ uint32_t timer310; /* T310 */
+ uint32_t timer313; /* T313 */
+ uint32_t timer316; /* T316 */
+ uint32_t init316; /* T316 retransmission count */
+ uint32_t timer317; /* T317 */
+ uint32_t timer322; /* T322 */
+ uint32_t init322; /* T322 retransmission count */
+ uint32_t timer397; /* T397 */
+ uint32_t timer398; /* T398 */
+ uint32_t timer399; /* T399 */
+};
+enum uni_config_mask {
+ UNICFG_PROTO = 0x00000001,
+ UNICFG_TIMER301 = 0x00000002,
+ UNICFG_TIMER303 = 0x00000004,
+ UNICFG_INIT303 = 0x00000008,
+ UNICFG_TIMER308 = 0x00000010,
+ UNICFG_INIT308 = 0x00000020,
+ UNICFG_TIMER309 = 0x00000040,
+ UNICFG_TIMER310 = 0x00000080,
+ UNICFG_TIMER313 = 0x00000100,
+ UNICFG_TIMER316 = 0x00000200,
+ UNICFG_INIT316 = 0x00000400,
+ UNICFG_TIMER317 = 0x00000800,
+ UNICFG_TIMER322 = 0x00001000,
+ UNICFG_INIT322 = 0x00002000,
+ UNICFG_TIMER397 = 0x00004000,
+ UNICFG_TIMER398 = 0x00008000,
+ UNICFG_TIMER399 = 0x00010000,
+
+ UNICFG_ALLMASK = 0x0001ffff,
+};
+
+/*
+ * API signals
+ */
+enum uni_sig {
+ UNIAPI_ERROR = 0, /* UNI -> API */
+
+ UNIAPI_CALL_CREATED = 1, /* UNI -> API */
+ UNIAPI_CALL_DESTROYED = 2, /* UNI -> API */
+ UNIAPI_PARTY_CREATED = 3, /* UNI -> API */
+ UNIAPI_PARTY_DESTROYED = 4, /* UNI -> API */
+
+ UNIAPI_LINK_ESTABLISH_request = 5, /* API -> UNI */
+ UNIAPI_LINK_ESTABLISH_confirm = 6, /* UNI -> API */
+ UNIAPI_LINK_RELEASE_request = 7, /* API -> UNI */
+ UNIAPI_LINK_RELEASE_confirm = 8, /* UNI -> API */
+
+ UNIAPI_RESET_request = 9, /* API -> UNI */
+ UNIAPI_RESET_confirm = 10, /* UNI -> API */
+ UNIAPI_RESET_indication = 11, /* UNI -> API */
+ UNIAPI_RESET_ERROR_indication = 12, /* UNI -> API */
+ UNIAPI_RESET_response = 13, /* API -> UNI */
+ UNIAPI_RESET_ERROR_response = 14, /* API -> UNI */
+ UNIAPI_RESET_STATUS_indication = 15, /* UNI -> API */
+
+ UNIAPI_SETUP_request = 16, /* API -> UNI */
+ UNIAPI_SETUP_indication = 17, /* UNI -> API */
+ UNIAPI_SETUP_response = 18, /* API -> UNI */
+ UNIAPI_SETUP_confirm = 19, /* UNI -> API */
+ UNIAPI_SETUP_COMPLETE_indication= 20, /* U-UNI -> API */
+ UNIAPI_SETUP_COMPLETE_request = 46, /* API -> N-UNI */
+ UNIAPI_ALERTING_request = 21, /* API -> UNI */
+ UNIAPI_ALERTING_indication = 22, /* UNI -> API */
+ UNIAPI_PROCEEDING_request = 23, /* API -> UNI */
+ UNIAPI_PROCEEDING_indication = 24, /* UNI -> API */
+ UNIAPI_RELEASE_request = 25, /* API -> UNI */
+ UNIAPI_RELEASE_indication = 26, /* UNI -> API */
+ UNIAPI_RELEASE_response = 27, /* API -> UNI */
+ UNIAPI_RELEASE_confirm = 28, /* UNI -> API */
+ UNIAPI_NOTIFY_request = 29, /* API -> UNI */
+ UNIAPI_NOTIFY_indication = 30, /* UNI -> API */
+ UNIAPI_STATUS_indication = 31, /* UNI -> API */
+ UNIAPI_STATUS_ENQUIRY_request = 32, /* API -> UNI */
+
+ UNIAPI_ADD_PARTY_request = 33, /* API -> UNI */
+ UNIAPI_ADD_PARTY_indication = 34, /* UNI -> API */
+ UNIAPI_PARTY_ALERTING_request = 35, /* API -> UNI */
+ UNIAPI_PARTY_ALERTING_indication= 36, /* UNI -> API */
+ UNIAPI_ADD_PARTY_ACK_request = 37, /* API -> UNI */
+ UNIAPI_ADD_PARTY_ACK_indication = 38, /* UNI -> API */
+ UNIAPI_ADD_PARTY_REJ_request = 39, /* API -> UNI */
+ UNIAPI_ADD_PARTY_REJ_indication = 40, /* UNI -> API */
+ UNIAPI_DROP_PARTY_request = 41, /* API -> UNI */
+ UNIAPI_DROP_PARTY_indication = 42, /* UNI -> API */
+ UNIAPI_DROP_PARTY_ACK_request = 43, /* API -> UNI */
+ UNIAPI_DROP_PARTY_ACK_indication= 44, /* UNI -> API */
+
+ UNIAPI_ABORT_CALL_request = 45, /* API -> UNI */
+
+ UNIAPI_MAXSIG = 47
+};
+
+struct uniapi_error {
+ uint32_t reason;
+ uint32_t state;
+};
+/* keep this in sync with atmapi.h:enum atmerr */
+
+#define UNIAPI_DEF_ERRORS(MACRO) \
+ MACRO(OK, 0, "no error") \
+ MACRO(ERROR_BAD_SIGNAL, 1, "unknown signal") \
+ MACRO(ERROR_BADCU, 2, "signal in bad co-ordinator state") \
+ MACRO(ERROR_BAD_CALLSTATE, 3, "signal in bad call state") \
+ MACRO(ERROR_BAD_EPSTATE, 4, "signal in bad endpoint state") \
+ MACRO(ERROR_BAD_ARG, 5, "bad argument") \
+ MACRO(ERROR_BAD_CALL, 6, "unknown call reference") \
+ MACRO(ERROR_BAD_PARTY, 7, "unknown party") \
+ MACRO(ERROR_BAD_CTYPE, 8, "bad type of call for signal") \
+ MACRO(ERROR_BAD_IE, 9, "bad information element") \
+ MACRO(ERROR_EPREF_INUSE, 10, "endpoint reference already in use") \
+ MACRO(ERROR_MISSING_IE, 11, "missing information element") \
+ MACRO(ERROR_ENCODING, 12, "error during message encoding") \
+ MACRO(ERROR_NOMEM, 13, "out of memory") \
+ MACRO(ERROR_BUSY, 14, "status enquiry busy")
+
+enum {
+#define DEF(NAME, VAL, STR) UNIAPI_##NAME = VAL,
+UNIAPI_DEF_ERRORS(DEF)
+#undef DEF
+};
+
+struct uniapi_call_created {
+ struct uni_cref cref;
+};
+struct uniapi_call_destroyed {
+ struct uni_cref cref;
+};
+struct uniapi_party_created {
+ struct uni_cref cref;
+ struct uni_ie_epref epref;
+};
+struct uniapi_party_destroyed {
+ struct uni_cref cref;
+ struct uni_ie_epref epref;
+};
+struct uniapi_abort_call_request {
+ struct uni_cref cref;
+};
+
+struct uniapi_reset_request {
+ struct uni_ie_restart restart;
+ struct uni_ie_connid connid;
+};
+
+struct uniapi_reset_confirm {
+ struct uni_ie_restart restart;
+ struct uni_ie_connid connid;
+};
+
+struct uniapi_reset_indication {
+ struct uni_ie_restart restart;
+ struct uni_ie_connid connid;
+
+};
+struct uniapi_reset_error_indication {
+ uint32_t source; /* 0 - start, 1 - response */
+ uint32_t reason;
+};
+
+#define UNIAPI_DEF_RESET_ERRORS(MACRO) \
+ MACRO(UNIAPI_RESET_ERROR_NO_CONFIRM, 0, \
+ "no confirmation") \
+ MACRO(UNIAPI_RESET_ERROR_NO_RESPONSE, 1, \
+ "no response") \
+ MACRO(UNIAPI_RESET_ERROR_PEER_INCOMP_STATE, 2, \
+ "incompatible state")
+enum {
+#define DEF(NAME, VALUE, STR) NAME = VALUE,
+UNIAPI_DEF_RESET_ERRORS(DEF)
+#undef DEF
+};
+
+struct uniapi_reset_response {
+ struct uni_ie_restart restart;
+ struct uni_ie_connid connid;
+};
+
+struct uniapi_reset_error_response {
+ struct uni_ie_cause cause;
+};
+
+struct uniapi_reset_status_indication {
+ struct uni_cref cref; /* STATUS message CREF */
+ struct uni_ie_callstate callstate;
+ struct uni_ie_cause cause;
+};
+
+struct uniapi_setup_request {
+ struct uni_setup setup;
+};
+struct uniapi_setup_indication {
+ struct uni_setup setup;
+};
+struct uniapi_setup_response {
+ struct uni_connect connect;
+};
+struct uniapi_setup_confirm {
+ struct uni_connect connect;
+};
+struct uniapi_setup_complete_indication {
+ struct uni_connect_ack connect_ack;
+};
+struct uniapi_setup_complete_request {
+ struct uni_connect_ack connect_ack;
+};
+
+struct uniapi_alerting_request {
+ struct uni_alerting alerting;
+};
+
+struct uniapi_alerting_indication {
+ struct uni_alerting alerting;
+};
+
+struct uniapi_proceeding_request {
+ struct uni_call_proc call_proc;
+};
+
+struct uniapi_proceeding_indication {
+ struct uni_call_proc call_proc;
+};
+
+
+struct uniapi_release_request {
+ struct uni_release release;
+};
+struct uniapi_release_indication {
+ struct uni_release release;
+};
+struct uniapi_release_response {
+ struct uni_release_compl release_compl;
+};
+/*
+ * A release confirm can come from a RELEASE COMPLETE or a RELEASE.
+ * Because the IEs in a RELEASE COMPLETE are a subset of a RELEASE,
+ * use the RELEASE here.
+ */
+struct uniapi_release_confirm {
+ struct uni_release release;
+};
+
+struct uniapi_notify_request {
+ struct uni_notify notify;
+};
+struct uniapi_notify_indication {
+ struct uni_notify notify;
+};
+
+struct uniapi_status_indication {
+ struct uni_cref cref;
+ enum uni_callstate my_state;
+ enum uni_cause my_cause;
+ struct uni_ie_callstate his_state;
+ struct uni_ie_cause his_cause;
+ struct uni_ie_epref epref;
+ struct uni_ie_epstate epstate;
+};
+struct uniapi_status_enquiry_request {
+ struct uni_cref cref;
+ struct uni_ie_epref epref;
+};
+
+struct uniapi_add_party_request {
+ struct uni_add_party add;
+};
+struct uniapi_add_party_indication {
+ struct uni_add_party add;
+};
+
+struct uniapi_party_alerting_request {
+ struct uni_party_alerting alert;
+};
+struct uniapi_party_alerting_indication {
+ struct uni_party_alerting alert;
+};
+
+struct uniapi_add_party_ack_request {
+ struct uni_add_party_ack ack;
+};
+struct uniapi_add_party_ack_indication {
+ struct uni_add_party_ack ack;
+};
+struct uniapi_add_party_rej_request {
+ struct uni_add_party_rej rej;
+};
+struct uniapi_add_party_rej_indication {
+ struct uni_add_party_rej rej;
+};
+
+struct uniapi_drop_party_request {
+ struct uni_drop_party drop;
+};
+struct uniapi_drop_party_indication {
+ struct uni_drop_party drop;
+ struct uni_ie_cause my_cause;
+};
+
+struct uniapi_drop_party_ack_request {
+ struct uni_drop_party_ack ack;
+};
+struct uniapi_drop_party_ack_indication {
+ struct uni_drop_party drop;
+ struct uni_ie_crankback crankback;
+};
+
+union uniapi_all {
+ struct uniapi_error error;
+ struct uniapi_call_created call_created;
+ struct uniapi_call_destroyed call_destroyed;
+ struct uniapi_party_created party_created;
+ struct uniapi_party_destroyed party_destroyed;
+ struct uniapi_abort_call_request abort_call_request;
+ struct uniapi_reset_request reset_request;
+ struct uniapi_reset_confirm reset_confirm;
+ struct uniapi_reset_indication reset_indication;
+ struct uniapi_reset_error_indication reset_error_indication;
+ struct uniapi_reset_response reset_response;
+ struct uniapi_reset_error_response reset_error_response;
+ struct uniapi_reset_status_indication reset_status_indication;
+ struct uniapi_setup_request setup_request;
+ struct uniapi_setup_indication setup_indication;
+ struct uniapi_setup_response setup_response;
+ struct uniapi_setup_confirm setup_confirm;
+ struct uniapi_setup_complete_indication setup_complete_indication;
+ struct uniapi_setup_complete_request setup_complete_request;
+ struct uniapi_alerting_request alerting_request;
+ struct uniapi_alerting_indication alerting_indication;
+ struct uniapi_proceeding_request proceeding_request;
+ struct uniapi_proceeding_indication proceeding_indication;
+ struct uniapi_release_request release_request;
+ struct uniapi_release_indication release_indication;
+ struct uniapi_release_response release_response;
+ struct uniapi_release_confirm release_confirm;
+ struct uniapi_notify_request notify_request;
+ struct uniapi_notify_indication notify_indication;
+ struct uniapi_status_indication status_indication;
+ struct uniapi_status_enquiry_request status_enquiry_request;
+ struct uniapi_add_party_request add_party_request;
+ struct uniapi_add_party_indication add_party_indication;
+ struct uniapi_party_alerting_request party_alerting_request;
+ struct uniapi_party_alerting_indication party_alerting_indication;
+ struct uniapi_add_party_ack_request add_party_ack_request;
+ struct uniapi_add_party_ack_indication add_party_ack_indication;
+ struct uniapi_add_party_rej_request add_party_rej_request;
+ struct uniapi_add_party_rej_indication add_party_rej_indication;
+ struct uniapi_drop_party_request drop_party_request;
+ struct uniapi_drop_party_indication drop_party_indication;
+ struct uniapi_drop_party_ack_request drop_party_ack_request;
+ struct uniapi_drop_party_ack_indication drop_party_ack_indication;
+};
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/sig/unimkmsg.h b/sys/contrib/ngatm/netnatm/sig/unimkmsg.h
new file mode 100644
index 0000000..80264e1
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/unimkmsg.h
@@ -0,0 +1,159 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/sig/unimkmsg.h,v 1.4 2003/09/19 12:03:34 hbb Exp $
+ *
+ * Macros to make messages.
+ */
+
+#define MK_MSG_ORIG(MSG,TYPE,CREF,FLAG) \
+ do { \
+ (MSG)->mtype = (TYPE); \
+ (MSG)->u.hdr.cref.cref = (CREF); \
+ (MSG)->u.hdr.cref.flag = (FLAG); \
+ (MSG)->u.hdr.act = UNI_MSGACT_DEFAULT; \
+ } while(0)
+
+#define MK_MSG_RESP(MSG,TYPE,CREF) \
+ do { \
+ (MSG)->mtype = (TYPE); \
+ (MSG)->u.hdr.cref.cref = (CREF)->cref; \
+ (MSG)->u.hdr.cref.flag = !(CREF)->flag; \
+ (MSG)->u.hdr.act = UNI_MSGACT_DEFAULT; \
+ } while(0)
+
+#define MK_IE_CALLSTATE(IE,CS) \
+ do { \
+ (IE).h.present = 0; \
+ IE_SETPRESENT(IE); \
+ (IE).h.coding = UNI_CODING_ITU; \
+ (IE).h.act = UNI_IEACT_DEFAULT; \
+ (IE).state = CS; \
+ } while(0)
+
+#define MK_IE_EPREF(IE,EPREF,FLAG) \
+ do { \
+ (IE).h.present = 0; \
+ IE_SETPRESENT(IE); \
+ (IE).h.coding = UNI_CODING_ITU; \
+ (IE).h.act = UNI_IEACT_DEFAULT; \
+ (IE).epref = EPREF; \
+ (IE).flag = FLAG; \
+ } while(0)
+
+#define MK_IE_EPSTATE(IE,STATE) \
+ do { \
+ (IE).h.present = 0; \
+ IE_SETPRESENT(IE); \
+ (IE).h.coding = UNI_CODING_ITU; \
+ (IE).h.act = UNI_IEACT_DEFAULT; \
+ (IE).state = STATE; \
+ } while(0)
+
+#define MK_IE_CAUSE(IE,LOC,CAUSE) \
+ do { \
+ (IE).h.present = 0; \
+ IE_SETPRESENT(IE); \
+ (IE).h.coding = UNI_CODING_ITU; \
+ (IE).h.act = UNI_IEACT_DEFAULT; \
+ (IE).loc = LOC; \
+ (IE).cause = CAUSE; \
+ } while(0)
+
+#define ADD_CAUSE_MTYPE(IE,MTYPE) \
+ do { \
+ (IE).h.present |= UNI_CAUSE_MTYPE_P; \
+ (IE).u.mtype = MTYPE; \
+ } while(0)
+
+#define ADD_CAUSE_CHANNID(IE,VPI,VCI) \
+ do { \
+ (IE).h.present |= UNI_CAUSE_VPCI_P; \
+ (IE).u.vpci.vpci = VPI; \
+ (IE).u.vpci.vci = VCI; \
+ } while(0)
+
+#define ADD_CAUSE_TIMER(IE,TIMER) \
+ do { \
+ (IE).h.present |= UNI_CAUSE_TIMER_P; \
+ (IE).u.timer[0] = (TIMER)[0]; \
+ (IE).u.timer[1] = (TIMER)[1]; \
+ (IE).u.timer[2] = (TIMER)[2]; \
+ } while(0)
+
+/************************************************************/
+
+#define COPY_FROM_RELEASE_COMPL(U,DEST) \
+ do { \
+ u_int _i, _j; \
+ \
+ for(_i = _j = 0; _i < 2; _i++) \
+ if(IE_ISGOOD((U)->u.release_compl.cause[_i])) \
+ (DEST)->cause[_j++] = \
+ (U)->u.release_compl.cause[_i]; \
+ for(_i = _j = 0; _i < UNI_NUM_IE_GIT; _i++) \
+ if(IE_ISGOOD((U)->u.release_compl.git[_i])) \
+ (DEST)->git[_j++] = \
+ (U)->u.release_compl.git[_i]; \
+ if(IE_ISGOOD((U)->u.release_compl.uu)) \
+ (DEST)->uu = (U)->u.release_compl.uu; \
+ if(IE_ISGOOD((U)->u.release_compl.crankback)) \
+ (DEST)->crankback = (U)->u.release_compl.crankback; \
+ } while(0)
+
+#define COPY_FROM_DROP_ACK(U,DEST) \
+ do { \
+ u_int _i, _j; \
+ \
+ if(IE_ISGOOD((U)->u.drop_party_ack.epref)) \
+ (DEST)->epref = (U)->u.drop_party_ack.epref; \
+ if(IE_ISGOOD((U)->u.drop_party_ack.cause)) \
+ (DEST)->cause = (U)->u.drop_party_ack.cause; \
+ if(IE_ISGOOD((U)->u.drop_party_ack.uu)) \
+ (DEST)->uu = (U)->u.drop_party_ack.uu; \
+ for(_i = _j = 0; _i < UNI_NUM_IE_GIT; _i++) \
+ if(IE_ISGOOD((U)->u.drop_party_ack.git[_i])) \
+ (DEST)->git[_j++] = \
+ (U)->u.drop_party_ack.git[_i]; \
+ } while(0)
+
+#define COPY_FROM_ADD_REJ(U,DEST) \
+ do { \
+ u_int _i, _j; \
+ \
+ if(IE_ISGOOD((U)->u.add_party_rej.epref)) \
+ (DEST)->epref = (U)->u.add_party_rej.epref; \
+ if(IE_ISGOOD((U)->u.add_party_rej.cause)) \
+ (DEST)->cause = (U)->u.add_party_rej.cause; \
+ if(IE_ISGOOD((U)->u.add_party_rej.uu)) \
+ (DEST)->uu = (U)->u.add_party_rej.uu; \
+ for(_i = _j = 0; _i < UNI_NUM_IE_GIT; _i++) \
+ if(IE_ISGOOD((U)->u.add_party_rej.git[_i])) \
+ (DEST)->git[_j++] = \
+ (U)->u.add_party_rej.git[_i]; \
+ } while(0)
diff --git a/sys/contrib/ngatm/netnatm/sig/unimsgcpy.h b/sys/contrib/ngatm/netnatm/sig/unimsgcpy.h
new file mode 100644
index 0000000..70e4e2e
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/unimsgcpy.h
@@ -0,0 +1,113 @@
+/* This file was created automatically
+ * Source file: $Begemot: libunimsg/atm/msg/msg.def,v 1.3 2003/09/19 11:58:15 hbb Exp $
+ * $FreeBSD$
+ */
+
+
+void
+copy_msg_alerting(struct uni_alerting *src, struct uni_alerting *dst);
+
+
+void
+copy_msg_call_proc(struct uni_call_proc *src, struct uni_call_proc *dst);
+
+
+void
+copy_msg_connect(struct uni_connect *src, struct uni_connect *dst);
+
+
+void
+copy_msg_connect_ack(struct uni_connect_ack *src, struct uni_connect_ack *dst);
+
+
+void
+copy_msg_release(struct uni_release *src, struct uni_release *dst);
+
+
+void
+copy_msg_release_compl(struct uni_release_compl *src, struct uni_release_compl *dst);
+
+
+void
+copy_msg_setup(struct uni_setup *src, struct uni_setup *dst);
+
+
+void
+copy_msg_status(struct uni_status *src, struct uni_status *dst);
+
+
+void
+copy_msg_status_enq(struct uni_status_enq *src, struct uni_status_enq *dst);
+
+
+void
+copy_msg_notify(struct uni_notify *src, struct uni_notify *dst);
+
+
+void
+copy_msg_restart(struct uni_restart *src, struct uni_restart *dst);
+
+
+void
+copy_msg_restart_ack(struct uni_restart_ack *src, struct uni_restart_ack *dst);
+
+
+void
+copy_msg_add_party(struct uni_add_party *src, struct uni_add_party *dst);
+
+
+void
+copy_msg_add_party_ack(struct uni_add_party_ack *src, struct uni_add_party_ack *dst);
+
+
+void
+copy_msg_party_alerting(struct uni_party_alerting *src, struct uni_party_alerting *dst);
+
+
+void
+copy_msg_add_party_rej(struct uni_add_party_rej *src, struct uni_add_party_rej *dst);
+
+
+void
+copy_msg_drop_party(struct uni_drop_party *src, struct uni_drop_party *dst);
+
+
+void
+copy_msg_drop_party_ack(struct uni_drop_party_ack *src, struct uni_drop_party_ack *dst);
+
+
+void
+copy_msg_leaf_setup_req(struct uni_leaf_setup_req *src, struct uni_leaf_setup_req *dst);
+
+
+void
+copy_msg_leaf_setup_fail(struct uni_leaf_setup_fail *src, struct uni_leaf_setup_fail *dst);
+
+
+void
+copy_msg_cobisetup(struct uni_cobisetup *src, struct uni_cobisetup *dst);
+
+
+void
+copy_msg_facility(struct uni_facility *src, struct uni_facility *dst);
+
+
+void
+copy_msg_modify_req(struct uni_modify_req *src, struct uni_modify_req *dst);
+
+
+void
+copy_msg_modify_ack(struct uni_modify_ack *src, struct uni_modify_ack *dst);
+
+
+void
+copy_msg_modify_rej(struct uni_modify_rej *src, struct uni_modify_rej *dst);
+
+
+void
+copy_msg_conn_avail(struct uni_conn_avail *src, struct uni_conn_avail *dst);
+
+
+void
+copy_msg_unknown(struct uni_unknown *src, struct uni_unknown *dst);
+
diff --git a/sys/contrib/ngatm/netnatm/sig/unipriv.h b/sys/contrib/ngatm/netnatm/sig/unipriv.h
new file mode 100644
index 0000000..35dc408
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/unipriv.h
@@ -0,0 +1,563 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/sig/unipriv.h,v 1.17 2004/07/08 08:22:25 brandt Exp $
+ *
+ * Private UNI stuff.
+ */
+#ifndef unipriv_h
+#define unipriv_h
+
+#ifdef _KERNEL
+#ifdef __FreeBSD__
+#include <netgraph/atm/uni/ng_uni_cust.h>
+#endif
+#else
+#include "unicust.h"
+#endif
+
+struct call;
+struct party;
+
+enum cu_stat {
+ CU_STAT0, /* AAL connection released */
+ CU_STAT1, /* awaiting establish */
+ CU_STAT2, /* awaiting release */
+ CU_STAT3, /* AAL connection established */
+};
+
+/*
+ * Internal Signals
+ */
+#define DEF_COORD_SIGS \
+ DEF_PRIV_SIG(O_SAAL_ESTABLISH_indication, SAAL) \
+ DEF_PRIV_SIG(O_SAAL_ESTABLISH_confirm, SAAL) \
+ DEF_PRIV_SIG(O_SAAL_RELEASE_indication, SAAL) \
+ DEF_PRIV_SIG(O_SAAL_RELEASE_confirm, SAAL) \
+ DEF_PRIV_SIG(O_SAAL_DATA_indication, SAAL) \
+ DEF_PRIV_SIG(O_SAAL_UDATA_indication, SAAL) \
+ DEF_PRIV_SIG(O_T309, Coord) \
+ DEF_PRIV_SIG(O_DATA, Coord) \
+ DEF_PRIV_SIG(O_LINK_ESTABLISH_request, API) \
+ DEF_PRIV_SIG(O_LINK_RELEASE_request, API) \
+ DEF_PRIV_SIG(O_RESET_request, API) \
+ DEF_PRIV_SIG(O_RESET_response, API) \
+ DEF_PRIV_SIG(O_RESET_ERROR_response, API) \
+ DEF_PRIV_SIG(O_SETUP_request, API) \
+ DEF_PRIV_SIG(O_SETUP_response, API) \
+ DEF_PRIV_SIG(O_SETUP_COMPLETE_request, API) \
+ DEF_PRIV_SIG(O_PROCEEDING_request, API) \
+ DEF_PRIV_SIG(O_ALERTING_request, API) \
+ DEF_PRIV_SIG(O_RELEASE_request, API) \
+ DEF_PRIV_SIG(O_RELEASE_response, API) \
+ DEF_PRIV_SIG(O_NOTIFY_request, API) \
+ DEF_PRIV_SIG(O_STATUS_ENQUIRY_request, API) \
+ DEF_PRIV_SIG(O_ADD_PARTY_request, API) \
+ DEF_PRIV_SIG(O_PARTY_ALERTING_request, API) \
+ DEF_PRIV_SIG(O_ADD_PARTY_ACK_request, API) \
+ DEF_PRIV_SIG(O_ADD_PARTY_REJ_request, API) \
+ DEF_PRIV_SIG(O_DROP_PARTY_request, API) \
+ DEF_PRIV_SIG(O_DROP_PARTY_ACK_request, API) \
+ DEF_PRIV_SIG(O_ABORT_CALL_request, API) \
+ DEF_PRIV_SIG(O_CALL_DESTROYED, CallControl) \
+ DEF_PRIV_SIG(O_RESET_indication, ResetRespond) \
+ DEF_PRIV_SIG(O_END, Coord)
+
+#define DEF_RESPOND_SIGS \
+ DEF_PRIV_SIG(R_RESTART, Coord) \
+ DEF_PRIV_SIG(R_STATUS, Coord) \
+ DEF_PRIV_SIG(R_RESET_response, Coord) \
+ DEF_PRIV_SIG(R_RESET_ERROR_response, Coord) \
+ DEF_PRIV_SIG(R_T317, ResetRespond) \
+ DEF_PRIV_SIG(R_END, ResetRespond)
+
+#define DEF_START_SIGS \
+ DEF_PRIV_SIG(S_RESTART_ACK, Coord) \
+ DEF_PRIV_SIG(S_STATUS, Coord) \
+ DEF_PRIV_SIG(S_RESET_request, Coord) \
+ DEF_PRIV_SIG(S_T316, ResetStart) \
+ DEF_PRIV_SIG(S_END, ResetStart)
+
+#define DEF_CALL_SIGS \
+ DEF_PRIV_SIG(C_LINK_ESTABLISH_confirm, Coord) \
+ DEF_PRIV_SIG(C_LINK_ESTABLISH_indication, Coord) \
+ DEF_PRIV_SIG(C_LINK_ESTABLISH_ERROR_indication,Coord) \
+ DEF_PRIV_SIG(C_LINK_RELEASE_indication, Coord) \
+ DEF_PRIV_SIG(C_SETUP_request, Coord) \
+ DEF_PRIV_SIG(C_SETUP_response, Coord) \
+ DEF_PRIV_SIG(C_SETUP_COMPLETE_request, Coord) \
+ DEF_PRIV_SIG(C_PROCEEDING_request, Coord) \
+ DEF_PRIV_SIG(C_ALERTING_request, Coord) \
+ DEF_PRIV_SIG(C_RELEASE_request, Coord) \
+ DEF_PRIV_SIG(C_RELEASE_response, Coord) \
+ DEF_PRIV_SIG(C_NOTIFY_request, Coord) \
+ DEF_PRIV_SIG(C_STATUS_ENQUIRY_request, Coord) \
+ DEF_PRIV_SIG(C_ADD_PARTY_request, Coord) \
+ DEF_PRIV_SIG(C_PARTY_ALERTING_request, Coord) \
+ DEF_PRIV_SIG(C_ADD_PARTY_ACK_request, Coord) \
+ DEF_PRIV_SIG(C_ADD_PARTY_REJ_request, Coord) \
+ DEF_PRIV_SIG(C_DROP_PARTY_request, Coord) \
+ DEF_PRIV_SIG(C_DROP_PARTY_ACK_request, Coord) \
+ DEF_PRIV_SIG(C_ABORT_CALL_request, Coord) \
+ DEF_PRIV_SIG(C_UNKNOWN, Coord) \
+ DEF_PRIV_SIG(C_SETUP, Coord) \
+ DEF_PRIV_SIG(C_CALL_PROC, Coord) \
+ DEF_PRIV_SIG(C_ALERTING, Coord) \
+ DEF_PRIV_SIG(C_CONNECT, Coord) \
+ DEF_PRIV_SIG(C_CONNECT_ACK, Coord) \
+ DEF_PRIV_SIG(C_RELEASE, Coord) \
+ DEF_PRIV_SIG(C_RELEASE_COMPL, Coord) \
+ DEF_PRIV_SIG(C_COBISETUP, Coord) \
+ DEF_PRIV_SIG(C_NOTIFY, Coord) \
+ DEF_PRIV_SIG(C_STATUS, Coord) \
+ DEF_PRIV_SIG(C_STATUS_ENQ, Coord) \
+ DEF_PRIV_SIG(C_ADD_PARTY, Coord) \
+ DEF_PRIV_SIG(C_PARTY_ALERTING, Coord) \
+ DEF_PRIV_SIG(C_ADD_PARTY_ACK, Coord) \
+ DEF_PRIV_SIG(C_ADD_PARTY_REJ, Coord) \
+ DEF_PRIV_SIG(C_DROP_PARTY, Coord) \
+ DEF_PRIV_SIG(C_DROP_PARTY_ACK, Coord) \
+ DEF_PRIV_SIG(C_CALL_DELETE, CallControl) \
+ DEF_PRIV_SIG(C_T301, CallControl) \
+ DEF_PRIV_SIG(C_T303, CallControl) \
+ DEF_PRIV_SIG(C_T308, CallControl) \
+ DEF_PRIV_SIG(C_T310, CallControl) \
+ DEF_PRIV_SIG(C_T313, CallControl) \
+ DEF_PRIV_SIG(C_T322, CallControl) \
+ DEF_PRIV_SIG(C_DROP_PARTY_indication, PartyControl) \
+ DEF_PRIV_SIG(C_SEND_DROP_PARTY, PartyControl) \
+ DEF_PRIV_SIG(C_DROP_PARTY_ACK_indication, PartyControl) \
+ DEF_PRIV_SIG(C_SEND_DROP_PARTY_ACK, PartyControl) \
+ DEF_PRIV_SIG(C_ADD_PARTY_REJ_indication, PartyControl) \
+ DEF_PRIV_SIG(C_SEND_ADD_PARTY_REJ, PartyControl) \
+ DEF_PRIV_SIG(C_SEND_STATUS_ENQ, PartyControl) \
+ DEF_PRIV_SIG(C_PARTY_DESTROYED, PartyControl) \
+ DEF_PRIV_SIG(C_END, CallControl)
+
+#define DEF_PARTY_SIGS \
+ DEF_PRIV_SIG(P_SETUP, CallControl) \
+ DEF_PRIV_SIG(P_ALERTING, CallControl) \
+ DEF_PRIV_SIG(P_CONNECT, CallControl) \
+ DEF_PRIV_SIG(P_CONNECT_ACK, CallControl) \
+ DEF_PRIV_SIG(P_RELEASE, CallControl) \
+ DEF_PRIV_SIG(P_RELEASE_COMPL, CallControl) \
+ DEF_PRIV_SIG(P_STATUS, CallControl) \
+ DEF_PRIV_SIG(P_ADD_PARTY, CallControl) \
+ DEF_PRIV_SIG(P_PARTY_ALERTING, CallControl) \
+ DEF_PRIV_SIG(P_ADD_PARTY_ACK, CallControl) \
+ DEF_PRIV_SIG(P_ADD_PARTY_REJ, CallControl) \
+ DEF_PRIV_SIG(P_DROP_PARTY, CallControl) \
+ DEF_PRIV_SIG(P_DROP_PARTY_ACK, CallControl) \
+ DEF_PRIV_SIG(P_SETUP_request, CallControl) \
+ DEF_PRIV_SIG(P_SETUP_response, CallControl) \
+ DEF_PRIV_SIG(P_SETUP_COMPL_request, CallControl) \
+ DEF_PRIV_SIG(P_ALERTING_request, CallControl) \
+ DEF_PRIV_SIG(P_RELEASE_request, CallControl) \
+ DEF_PRIV_SIG(P_RELEASE_response, CallControl) \
+ DEF_PRIV_SIG(P_RELEASE_confirm, CallControl) \
+ DEF_PRIV_SIG(P_STATUS_ENQUIRY_request, CallControl) \
+ DEF_PRIV_SIG(P_ADD_PARTY_request, CallControl) \
+ DEF_PRIV_SIG(P_PARTY_ALERTING_request, CallControl) \
+ DEF_PRIV_SIG(P_ADD_PARTY_ACK_request, CallControl) \
+ DEF_PRIV_SIG(P_ADD_PARTY_REJ_request, CallControl) \
+ DEF_PRIV_SIG(P_DROP_PARTY_request, CallControl) \
+ DEF_PRIV_SIG(P_DROP_PARTY_ACK_request, CallControl) \
+ DEF_PRIV_SIG(P_PARTY_DELETE, PartyControl) \
+ DEF_PRIV_SIG(P_T397, PartyControl) \
+ DEF_PRIV_SIG(P_T398, PartyControl) \
+ DEF_PRIV_SIG(P_T399, PartyControl) \
+ DEF_PRIV_SIG(P_END, PartyControl)
+
+
+#define DEF_PRIV_SIG(NAME, FROM) SIG##NAME,
+enum coord_sig {
+ DEF_COORD_SIGS
+};
+enum respond_sig {
+ DEF_RESPOND_SIGS
+};
+enum start_sig {
+ DEF_START_SIGS
+};
+enum call_sig {
+ DEF_CALL_SIGS
+};
+enum party_sig {
+ DEF_PARTY_SIGS
+};
+#undef DEF_PRIV_SIG
+
+/*************************************************************
+ *
+ * SIGNALS and SIGNAL QUEUES
+ */
+enum {
+ SIG_COORD,
+ SIG_RESET_START,
+ SIG_RESET_RESP,
+ SIG_CALL,
+ SIG_PARTY,
+};
+
+struct sig {
+ TAILQ_ENTRY(sig) link;
+ u_int type; /* one of the above */
+ struct call *call; /* call to send to */
+ struct party *party; /* party to send to */
+ uint32_t sig; /* the signal */
+ uint32_t cookie; /* user cookie */
+ struct uni_msg *msg; /* attached message */
+ struct uni_all *u; /* dito */
+};
+TAILQ_HEAD(sigqueue, sig);
+
+#define SIGQ_CLEAR(Q) \
+ do { \
+ struct sig *s; \
+ while(!TAILQ_EMPTY(Q)) { \
+ s = TAILQ_FIRST(Q); \
+ TAILQ_REMOVE(Q, s, link); \
+ if(s->msg) uni_msg_destroy(s->msg); \
+ if(s->u) UNI_FREE(s->u); \
+ SIG_FREE(s); \
+ } \
+ } while(0)
+
+void uni_sig_party(struct party *, enum party_sig, uint32_t cookie,
+ struct uni_msg *, struct uni_all *);
+void uni_sig_call(struct call *, enum call_sig, uint32_t cookie,
+ struct uni_msg *, struct uni_all *);
+void uni_sig_coord(struct uni *, enum coord_sig, uint32_t cookie,
+ struct uni_msg *);
+void uni_sig_start(struct uni *, enum start_sig, uint32_t cookie,
+ struct uni_msg *, struct uni_all *);
+void uni_sig_respond(struct uni *, enum respond_sig, uint32_t cookie,
+ struct uni_msg *, struct uni_all *);
+
+/*************************************************************
+ *
+ * CALL INSTANCES
+ */
+struct party {
+ struct call *call;
+ TAILQ_ENTRY(party) link;
+ u_int epref; /* endpoint reference */
+ u_int flags; /* flags */
+ enum uni_epstate state; /* party state */
+
+ struct uni_timer t397; /* T397 */
+ struct uni_timer t398; /* T398 */
+ struct uni_timer t399; /* T399 */
+};
+#define PARTY_MINE 0x0001 /* must be 1 */
+#define PARTY_CONNECT 0x0002 /* connect request from this party */
+
+TAILQ_HEAD(partyqueue, party);
+
+void uni_destroy_party(struct party *, int);
+struct party *uni_find_party(struct call *, struct uni_ie_epref *);
+struct party *uni_find_partyx(struct call *, u_int epref, u_int mine);
+struct party *uni_create_party(struct call *, struct uni_ie_epref *);
+struct party *uni_create_partyx(struct call *, u_int epref, u_int mine,
+ uint32_t cookie);
+u_int uni_party_act_count(struct call *, int);
+
+enum call_type {
+ CALL_NULL, /* not known yet */
+ CALL_P2P, /* normal point-to-point call */
+ CALL_COBI, /* Q.2932.1 COBI call */
+ CALL_ROOT, /* point-to-multipoint root */
+ CALL_LEAF, /* point-to-multipoint leaf */
+};
+
+enum call_state {
+ CALLST_NULL,
+ CALLST_U1, CALLST_U3, CALLST_U4, CALLST_U6, CALLST_U7, CALLST_U8,
+ CALLST_U9, CALLST_U10, CALLST_U11, CALLST_U12,
+ CALLST_N1, CALLST_N3, CALLST_N4, CALLST_N6, CALLST_N7, CALLST_N8,
+ CALLST_N9, CALLST_N10, CALLST_N11, CALLST_N12
+};
+
+struct call {
+ TAILQ_ENTRY(call) link; /* link between calls */
+ struct uni *uni; /* backpointer to owning UNI */
+ u_int cref; /* call reference value or lij seqno */
+ u_int mine; /* if TRUE this is my call */
+ enum call_type type; /* what call is it */
+ enum call_state cstate; /* the state of the call */
+ struct uni_ie_connid connid; /* the connection ID */
+ struct uni_setup msg_setup; /* retransmission */
+ struct uni_release msg_release; /* retransmission */
+ struct uni_ie_epref stat_epref; /* retransmission */
+ struct partyqueue parties;
+ u_int se_active; /* status enquiry active */
+ u_int epref_alloc;
+
+ struct uni_timer t308; /* T303 */
+ u_int cnt308;
+
+ struct uni_timer t303; /* T303 */
+ u_int cnt303;
+
+ struct uni_timer t301; /* T301 */
+ struct uni_timer t310; /* T310 */
+ struct uni_timer t313; /* T313 */
+
+ struct uni_timer t322; /* T322 */
+ u_int cnt322;
+};
+
+TAILQ_HEAD(callqueue, call);
+
+struct call *uni_find_call(struct uni *, struct uni_cref *);
+struct call *uni_find_callx(struct uni *, u_int cref, u_int mine);
+struct call *uni_create_call(struct uni *, u_int cref, u_int mine,
+ uint32_t cookie);
+struct call *uni_create_new_call(struct uni *, uint32_t cookie);
+void uni_destroy_call(struct call *, int);
+
+void uni_bad_message(struct call *, struct uni_all *, u_int,
+ struct uni_ie_epref *, int);
+
+extern const struct callstates {
+ const char *name;
+ enum uni_callstate ext;
+} callstates[];
+
+/*************************************************************
+ *
+ * UNI INSTANCE
+ */
+struct uni {
+ void *arg; /* user arg */
+ const struct uni_funcs *funcs;
+
+ enum uni_proto proto; /* protocol */
+ struct unicx cx; /* decoding/coding context */
+ int sb_tb : 1; /* Sb-Tb/Tb point */
+
+ struct sigqueue workq; /* work queue */
+ struct sigqueue delq; /* delayed signal queue */
+ int working;
+
+ uint32_t cref_alloc;
+
+ enum cu_stat custat; /* coordinator state */
+ struct uni_timer t309;
+ u_int timer309;
+
+ enum uni_callstate glob_start;
+ enum uni_callstate glob_respond;
+ struct uni_timer t316;
+ struct uni_timer t317;
+ struct uni_ie_connid connid_start;
+ struct uni_ie_connid connid_respond;
+ u_int cnt316;
+ struct uni_ie_restart restart_start;
+
+ struct callqueue calls;
+
+ struct uni_ie_cause cause; /* working area for verify */
+
+ /* tuneable parameters */
+ u_int timer301;
+ u_int init303;
+ u_int timer303;
+ u_int init308;
+ u_int timer308;
+ u_int timer310;
+ u_int timer313;
+ u_int init316;
+ u_int timer316;
+ u_int timer317;
+ u_int timer322;
+ u_int init322;
+ u_int timer397;
+ u_int timer398;
+ u_int timer399;
+
+ u_int debug[UNI_MAXFACILITY];
+};
+
+void uniapi_uni_error(struct uni *uni, uint32_t reason, uint32_t cookie,
+ uint32_t state);
+void uniapi_call_error(struct call *c, uint32_t reason, uint32_t cookie);
+void uniapi_party_error(struct party *p, uint32_t reason, uint32_t cookie);
+
+/*************************************************************
+ *
+ * INLINE FUNCTIONS
+ */
+
+/* Enqueue a signal in the working queue */
+void uni_enq_sig(struct uni *, u_int, struct call *, struct party *,
+ uint32_t, uint32_t, struct uni_msg *, struct uni_all *);
+
+/* Enqueue a signal in the delayed queue */
+void uni_delenq_sig(struct uni *, u_int, struct call *, struct party *,
+ uint32_t, uint32_t, struct uni_msg *, struct uni_all *);
+
+/* Enqueue a signal to the coordinator */
+#define uni_enq_coord(UNI, SIG, COOKIE, MSG) do { \
+ uni_enq_sig((UNI), SIG_COORD, NULL, NULL, \
+ (SIG), (COOKIE), (MSG), NULL); \
+ } while (0)
+
+/* Enqueue a delayed signal to the coordinator */
+#define uni_delenq_coord(UNI, SIG, COOKIE, MSG) do { \
+ uni_delenq_sig((UNI), SIG_COORD, NULL, NULL, \
+ (SIG), (COOKIE), (MSG), NULL); \
+ } while (0)
+
+/* Enqueue a signal to a call */
+#define uni_enq_call(CALL, SIG, COOKIE, MSG, U) do { \
+ uni_enq_sig((CALL)->uni, SIG_CALL, (CALL), NULL, \
+ (SIG), (COOKIE), (MSG), (U)); \
+ } while (0)
+
+/* Enqueue a signal to a party */
+#define uni_enq_party(PARTY, SIG, COOKIE, MSG, U) do { \
+ uni_enq_sig((PARTY)->call->uni, SIG_PARTY, (PARTY)->call, \
+ (PARTY), (SIG), (COOKIE), (MSG), (U)); \
+ } while (0)
+
+/* Enqueue a signal to RESET-START */
+#define uni_enq_start(UNI, SIG, COOKIE, MSG, U) do { \
+ uni_enq_sig((UNI), SIG_RESET_START, NULL, NULL, \
+ (SIG), (COOKIE), (MSG), (U)); \
+ } while (0)
+
+/* Enqueue a signal to RESET-RESPOND */
+#define uni_enq_resp(UNI, SIG, COOKIE, MSG, U) do { \
+ uni_enq_sig((UNI), SIG_RESET_RESP, NULL, NULL, \
+ (SIG), (COOKIE), (MSG), (U)); \
+ } while (0)
+
+int uni_send_output(struct uni_all *u, struct uni *uni);
+void uni_undel(struct uni *, int (*)(struct sig *, void *), void *);
+void uni_delsig(struct uni *, u_int, struct call *, struct party *);
+
+void uni_release_compl(struct call *, struct uni_all *);
+
+/*************************************************************/
+/*
+ * Message verification.
+ */
+#define MANDATE_IE(UNI,MSG,IE) \
+ do { \
+ if (!IE_ISGOOD(MSG)) \
+ uni_mandate_ie(UNI, IE); \
+ } while(0)
+
+enum verify {
+ VFY_OK, /* ok */
+ VFY_RAP, /* report and proceed */
+ VFY_RAPU, /* report and proceed becuase of unknown IEs */
+ VFY_I, /* ignore */
+ VFY_CLR, /* clear call */
+ VFY_RAI, /* report and ignore */
+ VFY_RAIM, /* report and ignore because if mandat. IE miss */
+};
+
+void uni_mandate_ie(struct uni *, enum uni_ietype);
+void uni_mandate_epref(struct uni *, struct uni_ie_epref *);
+enum verify uni_verify(struct uni *, enum uni_msgact);
+void uni_respond_status_verify(struct uni *, struct uni_cref *,
+ enum uni_callstate, struct uni_ie_epref *, enum uni_epstate);
+void uni_vfy_remove_unknown(struct uni *);
+void uni_vfy_remove_cause(struct uni *);
+void uni_vfy_collect_ies(struct uni *);
+
+
+void uni_respond_status(struct uni *uni, struct uni_cref *cref,
+ enum uni_callstate cs, enum uni_cause c1);
+void uni_respond_status_mtype(struct uni *uni, struct uni_cref *cref,
+ enum uni_callstate cs, enum uni_cause c1, u_int mtype);
+
+#define FOREACH_ERR(E, UNI) \
+ for ((E) = (UNI)->cx.err; (E) < (UNI)->cx.err + (UNI)->cx.errcnt; (E)++)
+
+#define ALLOC_API(TYPE,API) \
+ ({ \
+ TYPE *_tmp = NULL; \
+ \
+ if(((API) = uni_msg_alloc(sizeof(TYPE))) != NULL) { \
+ _tmp = uni_msg_wptr((API), TYPE *); \
+ (API)->b_wptr += sizeof(TYPE); \
+ memset(_tmp, 0, sizeof(TYPE)); \
+ } \
+ _tmp; \
+ })
+
+#if defined(__GNUC__) && __GNUC__ < 3
+
+#define VERBOSE(UNI, FAC, LEVEL, ARGS...) do { \
+ if ((UNI)->debug[(FAC)] >= (LEVEL)) { \
+ (UNI)->funcs->verbose((UNI), (UNI)->arg, (FAC) ,\
+ ## ARGS); \
+ } \
+ } while(0)
+
+#define VERBOSE0(UNI, FAC, ARGS...) do { \
+ (UNI)->funcs->verbose((UNI), (UNI)->arg, (FAC) , \
+ ## ARGS); \
+ } while(0)
+
+#else
+
+#define VERBOSE(UNI, FAC, LEVEL, ...) do { \
+ if ((UNI)->debug[(FAC)] >= (LEVEL)) { \
+ (UNI)->funcs->verbose((UNI), (UNI)->arg, (FAC), \
+ __VA_ARGS__); \
+ } \
+ } while(0)
+
+#define VERBOSE0(UNI, FAC, ...) do { \
+ (UNI)->funcs->verbose((UNI), (UNI)->arg, (FAC), \
+ __VA_ARGS__); \
+ } while(0)
+
+#endif
+
+#define TIMER_INIT_UNI(U,T) _TIMER_INIT(U,T)
+#define TIMER_INIT_CALL(C,T) _TIMER_INIT(C,T)
+#define TIMER_INIT_PARTY(P,T) _TIMER_INIT(P,T)
+
+#define TIMER_DESTROY_UNI(U,T) _TIMER_DESTROY(U, (U)->T)
+#define TIMER_DESTROY_CALL(C,T) _TIMER_DESTROY((C)->uni, (C)->T)
+#define TIMER_DESTROY_PARTY(P,T) _TIMER_DESTROY((P)->call->uni, (P)->T)
+
+#define TIMER_STOP_UNI(U,T) _TIMER_STOP(U, (U)->T)
+#define TIMER_STOP_CALL(C,T) _TIMER_STOP((C)->uni, (C)->T)
+#define TIMER_STOP_PARTY(P,T) _TIMER_STOP((P)->call->uni, (P)->T)
+
+#define TIMER_START_UNI(U,T,N) _TIMER_START(U, U, (U)->T, N, _##T##_func)
+#define TIMER_START_CALL(C,T,N) _TIMER_START(C->uni, C, (C)->T, N, _##T##_func)
+#define TIMER_START_PARTY(P,T,N) _TIMER_START(P->call->uni, P, (P)->T, N, _##T##_func)
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/sig/unisig.h b/sys/contrib/ngatm/netnatm/sig/unisig.h
new file mode 100644
index 0000000..22ff671
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/sig/unisig.h
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2001-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * $Begemot: libunimsg/netnatm/sig/unisig.h,v 1.4 2004/07/08 08:22:26 brandt Exp $
+ *
+ * Utility functions for signalling stuff
+ */
+#ifndef _NETNATM_SIG_UNISIG_H_
+#define _NETNATM_SIG_UNISIG_H_
+
+#include <netnatm/sig/unidef.h>
+
+/* names */
+const char *uni_signame(enum uni_sig);
+const char *uni_facname(enum uni_verb);
+
+/* return a string for the error code */
+const char *uni_strerr(u_int _err);
+
+/* format an API message */
+void uni_print_api(char *_buf, size_t _bufsiz, u_int _type, u_int _cookie,
+ const void *_msg, struct unicx *_cx);
+
+#endif
diff --git a/sys/contrib/ngatm/netnatm/unimsg.h b/sys/contrib/ngatm/netnatm/unimsg.h
new file mode 100644
index 0000000..efc91c5
--- /dev/null
+++ b/sys/contrib/ngatm/netnatm/unimsg.h
@@ -0,0 +1,92 @@
+/*
+ * Copyright (c) 1996-2003
+ * Fraunhofer Institute for Open Communication Systems (FhG Fokus).
+ * All rights reserved.
+ *
+ * Author: Hartmut Brandt <harti@freebsd.org>
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $Begemot: libunimsg/netnatm/unimsg.h,v 1.4 2004/07/08 08:21:46 brandt Exp $
+ *
+ * This defines the structure of messages as handled by this library.
+ */
+#ifndef _NETNATM_UNIMSG_H_
+#define _NETNATM_UNIMSG_H_
+
+#include <sys/types.h>
+#ifdef _KERNEL
+#ifdef __FreeBSD__
+#include <sys/systm.h>
+#endif
+#include <sys/stdint.h>
+#else
+#include <string.h>
+#include <stdint.h>
+#endif
+
+struct uni_msg {
+ u_char *b_wptr; /* tail pointer */
+ u_char *b_rptr; /* head pointer */
+ u_char *b_buf; /* data buffer */
+ u_char *b_lim; /* end of data buffer */
+};
+
+/* return the current length of the message */
+#define uni_msg_len(M) ((size_t)((M)->b_wptr - (M)->b_rptr))
+
+/* return the number of space behind the message */
+#define uni_msg_space(M) ((size_t)((M)->b_lim - (M)->b_wptr))
+
+/* return the amount of leading free space */
+#define uni_msg_leading(M) ((size_t)((M)->b_rptr - (M)->b_buf))
+
+/* return the maximum size of the message (length plus free space) */
+#define uni_msg_size(M) ((size_t)((M)->b_lim - (M)->b_buf));
+
+/* ensure that there is space for another S bytes. If reallocation fails
+ * free message and return -1 */
+#define uni_msg_ensure(M, S) \
+ ((uni_msg_space(M) >= (S)) ? 0 : uni_msg_extend(M, S))
+
+int uni_msg_append(struct uni_msg *, void *, size_t);
+int uni_msg_extend(struct uni_msg *, size_t);
+
+#define uni_msg_rptr(MSG, TYPE) ((TYPE)(void *)(MSG)->b_rptr)
+#define uni_msg_wptr(MSG, TYPE) ((TYPE)(void *)(MSG)->b_wptr)
+
+int uni_msg_prepend(struct uni_msg *, size_t);
+
+#ifndef _KERNEL
+
+struct uni_msg *uni_msg_alloc(size_t);
+struct uni_msg *uni_msg_build(void *, ...);
+void uni_msg_destroy(struct uni_msg *);
+u_int uni_msg_strip32(struct uni_msg *);
+u_int uni_msg_get32(struct uni_msg *);
+int uni_msg_append32(struct uni_msg *, u_int);
+int uni_msg_append8(struct uni_msg *, u_int);
+u_int uni_msg_trail32(const struct uni_msg *, int);
+struct uni_msg *uni_msg_dup(const struct uni_msg *);
+
+#endif /* _KERNEL */
+#endif
diff --git a/sys/contrib/opensolaris/common/acl/acl_common.c b/sys/contrib/opensolaris/common/acl/acl_common.c
new file mode 100644
index 0000000..2f32e7a
--- /dev/null
+++ b/sys/contrib/opensolaris/common/acl/acl_common.c
@@ -0,0 +1,217 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/acl.h>
+#include <sys/stat.h>
+#if defined(_KERNEL)
+#include <sys/systm.h>
+#include <sys/debug.h>
+#else
+#include <errno.h>
+#include <stdlib.h>
+#include <strings.h>
+#include <assert.h>
+#define ASSERT assert
+#endif
+
+
+ace_t trivial_acl[] = {
+ {-1, 0, ACE_OWNER, ACE_ACCESS_DENIED_ACE_TYPE},
+ {-1, ACE_WRITE_ACL|ACE_WRITE_OWNER|ACE_WRITE_ATTRIBUTES|
+ ACE_WRITE_NAMED_ATTRS, ACE_OWNER, ACE_ACCESS_ALLOWED_ACE_TYPE},
+ {-1, 0, ACE_GROUP|ACE_IDENTIFIER_GROUP, ACE_ACCESS_DENIED_ACE_TYPE},
+ {-1, 0, ACE_GROUP|ACE_IDENTIFIER_GROUP, ACE_ACCESS_ALLOWED_ACE_TYPE},
+ {-1, ACE_WRITE_ACL|ACE_WRITE_OWNER| ACE_WRITE_ATTRIBUTES|
+ ACE_WRITE_NAMED_ATTRS, ACE_EVERYONE, ACE_ACCESS_DENIED_ACE_TYPE},
+ {-1, ACE_READ_ACL|ACE_READ_ATTRIBUTES|ACE_READ_NAMED_ATTRS|
+ ACE_SYNCHRONIZE, ACE_EVERYONE, ACE_ACCESS_ALLOWED_ACE_TYPE}
+};
+
+
+void
+adjust_ace_pair(ace_t *pair, mode_t mode)
+{
+ if (mode & S_IROTH)
+ pair[1].a_access_mask |= ACE_READ_DATA;
+ else
+ pair[0].a_access_mask |= ACE_READ_DATA;
+ if (mode & S_IWOTH)
+ pair[1].a_access_mask |=
+ ACE_WRITE_DATA|ACE_APPEND_DATA;
+ else
+ pair[0].a_access_mask |=
+ ACE_WRITE_DATA|ACE_APPEND_DATA;
+ if (mode & S_IXOTH)
+ pair[1].a_access_mask |= ACE_EXECUTE;
+ else
+ pair[0].a_access_mask |= ACE_EXECUTE;
+}
+
+/*
+ * ace_trivial:
+ * determine whether an ace_t acl is trivial
+ *
+ * Trivialness implys that the acl is composed of only
+ * owner, group, everyone entries. ACL can't
+ * have read_acl denied, and write_owner/write_acl/write_attributes
+ * can only be owner@ entry.
+ */
+int
+ace_trivial(ace_t *acep, int aclcnt)
+{
+ int i;
+ int owner_seen = 0;
+ int group_seen = 0;
+ int everyone_seen = 0;
+
+ for (i = 0; i != aclcnt; i++) {
+ switch (acep[i].a_flags & 0xf040) {
+ case ACE_OWNER:
+ if (group_seen || everyone_seen)
+ return (1);
+ owner_seen++;
+ break;
+ case ACE_GROUP|ACE_IDENTIFIER_GROUP:
+ if (everyone_seen || owner_seen == 0)
+ return (1);
+ group_seen++;
+ break;
+
+ case ACE_EVERYONE:
+ if (owner_seen == 0 || group_seen == 0)
+ return (1);
+ everyone_seen++;
+ break;
+ default:
+ return (1);
+
+ }
+
+ if (acep[i].a_flags & (ACE_FILE_INHERIT_ACE|
+ ACE_DIRECTORY_INHERIT_ACE|ACE_NO_PROPAGATE_INHERIT_ACE|
+ ACE_INHERIT_ONLY_ACE))
+ return (1);
+
+ /*
+ * Special check for some special bits
+ *
+ * Don't allow anybody to deny reading basic
+ * attributes or a files ACL.
+ */
+ if ((acep[i].a_access_mask &
+ (ACE_READ_ACL|ACE_READ_ATTRIBUTES)) &&
+ (acep[i].a_type == ACE_ACCESS_DENIED_ACE_TYPE))
+ return (1);
+
+ /*
+ * Allow on owner@ to allow
+ * write_acl/write_owner/write_attributes
+ */
+ if (acep[i].a_type == ACE_ACCESS_ALLOWED_ACE_TYPE &&
+ (!(acep[i].a_flags & ACE_OWNER) && (acep[i].a_access_mask &
+ (ACE_WRITE_OWNER|ACE_WRITE_ACL|ACE_WRITE_ATTRIBUTES))))
+ return (1);
+ }
+
+ if ((owner_seen == 0) || (group_seen == 0) || (everyone_seen == 0))
+ return (1);
+
+ return (0);
+}
+
+
+/*
+ * Generic shellsort, from K&R (1st ed, p 58.), somewhat modified.
+ * v = Ptr to array/vector of objs
+ * n = # objs in the array
+ * s = size of each obj (must be multiples of a word size)
+ * f = ptr to function to compare two objs
+ * returns (-1 = less than, 0 = equal, 1 = greater than
+ */
+void
+ksort(caddr_t v, int n, int s, int (*f)())
+{
+ int g, i, j, ii;
+ unsigned int *p1, *p2;
+ unsigned int tmp;
+
+ /* No work to do */
+ if (v == NULL || n <= 1)
+ return;
+
+ /* Sanity check on arguments */
+ ASSERT(((uintptr_t)v & 0x3) == 0 && (s & 0x3) == 0);
+ ASSERT(s > 0);
+ for (g = n / 2; g > 0; g /= 2) {
+ for (i = g; i < n; i++) {
+ for (j = i - g; j >= 0 &&
+ (*f)(v + j * s, v + (j + g) * s) == 1;
+ j -= g) {
+ p1 = (void *)(v + j * s);
+ p2 = (void *)(v + (j + g) * s);
+ for (ii = 0; ii < s / 4; ii++) {
+ tmp = *p1;
+ *p1++ = *p2;
+ *p2++ = tmp;
+ }
+ }
+ }
+ }
+}
+
+/*
+ * Compare two acls, all fields. Returns:
+ * -1 (less than)
+ * 0 (equal)
+ * +1 (greater than)
+ */
+int
+cmp2acls(void *a, void *b)
+{
+ aclent_t *x = (aclent_t *)a;
+ aclent_t *y = (aclent_t *)b;
+
+ /* Compare types */
+ if (x->a_type < y->a_type)
+ return (-1);
+ if (x->a_type > y->a_type)
+ return (1);
+ /* Equal types; compare id's */
+ if (x->a_id < y->a_id)
+ return (-1);
+ if (x->a_id > y->a_id)
+ return (1);
+ /* Equal ids; compare perms */
+ if (x->a_perm < y->a_perm)
+ return (-1);
+ if (x->a_perm > y->a_perm)
+ return (1);
+ /* Totally equal */
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/common/acl/acl_common.h b/sys/contrib/opensolaris/common/acl/acl_common.h
new file mode 100644
index 0000000..2227ad7
--- /dev/null
+++ b/sys/contrib/opensolaris/common/acl/acl_common.h
@@ -0,0 +1,56 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _ACL_ACL_UTILS_H
+#define _ACL_ACL_UTILS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+
+#include <sys/types.h>
+#include <sys/acl.h>
+#include <sys/stat.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern ace_t trivial_acl[6];
+
+extern int acltrivial(const char *);
+extern void adjust_ace_pair(ace_t *pair, mode_t mode);
+extern int ace_trivial(ace_t *acep, int aclcnt);
+void ksort(caddr_t v, int n, int s, int (*f)());
+int cmp2acls(void *a, void *b);
+
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ACL_ACL_UTILS_H */
diff --git a/sys/contrib/opensolaris/common/atomic/amd64/atomic.S b/sys/contrib/opensolaris/common/atomic/amd64/atomic.S
new file mode 100644
index 0000000..2e62aa4
--- /dev/null
+++ b/sys/contrib/opensolaris/common/atomic/amd64/atomic.S
@@ -0,0 +1,68 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+ .ident "%Z%%M% %I% %E% SMI"
+
+ .file "%M%"
+
+#define _ASM
+#include <sys/asm_linkage.h>
+
+ ENTRY(atomic_add_64_nv)
+ movq (%rdi), %rax
+1:
+ movq %rsi, %rcx
+ addq %rax, %rcx
+ lock
+ cmpxchgq %rcx, (%rdi)
+ jne 1b
+ movq %rcx, %rax
+ ret
+ SET_SIZE(atomic_add_64_nv)
+
+ ENTRY(atomic_or_8_nv)
+ movb (%rdi), %al // %al = old value
+1:
+ movb %sil, %cl
+ orb %al, %cl // %cl = new value
+ lock
+ cmpxchgb %cl, (%rdi) // try to stick it in
+ jne 1b
+ movzbl %cl, %eax // return new value
+ ret
+ SET_SIZE(atomic_or_8_nv)
+
+ ENTRY(atomic_cas_64)
+ movq %rsi, %rax
+ lock
+ cmpxchgq %rdx, (%rdi)
+ ret
+ SET_SIZE(atomic_cas_64)
+
+ ENTRY(membar_producer)
+ sfence
+ ret
+ SET_SIZE(membar_producer)
diff --git a/sys/contrib/opensolaris/common/atomic/i386/atomic.S b/sys/contrib/opensolaris/common/atomic/i386/atomic.S
new file mode 100644
index 0000000..bc7f22a
--- /dev/null
+++ b/sys/contrib/opensolaris/common/atomic/i386/atomic.S
@@ -0,0 +1,98 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+ .ident "%Z%%M% %I% %E% SMI"
+
+ .file "%M%"
+
+#define _ASM
+#include <sys/asm_linkage.h>
+
+ ENTRY(atomic_add_64)
+ ALTENTRY(atomic_add_64_nv)
+ pushl %edi
+ pushl %ebx
+ movl 12(%esp), %edi // %edi = target address
+ movl (%edi), %eax
+ movl 4(%edi), %edx // %edx:%eax = old value
+1:
+ movl 16(%esp), %ebx
+ movl 20(%esp), %ecx // %ecx:%ebx = delta
+ addl %eax, %ebx
+ adcl %edx, %ecx // %ecx:%ebx = new value
+ lock
+ cmpxchg8b (%edi) // try to stick it in
+ jne 1b
+ movl %ebx, %eax
+ movl %ecx, %edx // return new value
+ popl %ebx
+ popl %edi
+ ret
+ SET_SIZE(atomic_add_64_nv)
+ SET_SIZE(atomic_add_64)
+
+ ENTRY(atomic_or_8_nv)
+ movl 4(%esp), %edx // %edx = target address
+ movb (%edx), %al // %al = old value
+1:
+ movl 8(%esp), %ecx // %ecx = delta
+ orb %al, %cl // %cl = new value
+ lock
+ cmpxchgb %cl, (%edx) // try to stick it in
+ jne 1b
+ movzbl %cl, %eax // return new value
+ ret
+ SET_SIZE(atomic_or_8_nv)
+
+ ENTRY(atomic_cas_ptr)
+ movl 4(%esp), %edx
+ movl 8(%esp), %eax
+ movl 12(%esp), %ecx
+ lock
+ cmpxchgl %ecx, (%edx)
+ ret
+ SET_SIZE(atomic_cas_ptr)
+
+ ENTRY(atomic_cas_64)
+ pushl %ebx
+ pushl %esi
+ movl 12(%esp), %esi
+ movl 16(%esp), %eax
+ movl 20(%esp), %edx
+ movl 24(%esp), %ebx
+ movl 28(%esp), %ecx
+ lock
+ cmpxchg8b (%esi)
+ popl %esi
+ popl %ebx
+ ret
+ SET_SIZE(atomic_cas_64)
+
+ ENTRY(membar_producer)
+ lock
+ xorl $0, (%esp)
+ ret
+ SET_SIZE(membar_producer)
diff --git a/sys/contrib/opensolaris/common/atomic/ia64/atomic.S b/sys/contrib/opensolaris/common/atomic/ia64/atomic.S
new file mode 100644
index 0000000..409d759
--- /dev/null
+++ b/sys/contrib/opensolaris/common/atomic/ia64/atomic.S
@@ -0,0 +1,82 @@
+/*-
+ * Copyright (c) 2007 Marcel Moolenaar
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * $FreeBSD$
+ */
+
+#include <machine/asm.h>
+
+ .text
+
+/*
+ * uint64_t atomic_cas_64(volatile uint64_t *p, uint64_t cmp, uint64_t v)
+ */
+ENTRY(atomic_cas_64, 3)
+ mov ar.ccv = r33
+ ;;
+ cmpxchg8.acq r8 = [r32], r34, ar.ccv
+ ;;
+ br.ret.sptk rp
+END(atomic_cas_64)
+
+/*
+ * uint64_t atomic_add_64_nv(volatile uint64_t *p, uint64_t v)
+ */
+ENTRY(atomic_add_64_nv, 2)
+1:
+ ld8 r16 = [r32]
+ ;;
+ mov ar.ccv = r16
+ add r8 = r16, r33
+ ;;
+ cmpxchg8.acq r17 = [r32], r8, ar.ccv
+ ;;
+ cmp.eq p6, p7 = r16, r17
+(p6) br.ret.sptk rp
+(p7) br.cond.spnt 1b
+END(atomic_add_64_nv)
+
+/*
+ * uint8_t atomic_or_8_nv(volatile uint8_t *p, uint8_t v)
+ */
+ENTRY(atomic_or_8_nv, 2)
+1:
+ ld8 r16 = [r32]
+ ;;
+ mov ar.ccv = r16
+ or r8 = r16, r33
+ ;;
+ cmpxchg1.acq r17 = [r32], r8, ar.ccv
+ ;;
+ cmp.eq p6, p7 = r16, r17
+(p6) br.ret.sptk rp
+(p7) br.cond.spnt 1b
+END(atomic_or_8_nv)
+
+ENTRY(membar_producer, 0)
+ mf.a
+ ;;
+ br.ret.sptk rp
+END(membar_producer)
diff --git a/sys/contrib/opensolaris/common/avl/avl.c b/sys/contrib/opensolaris/common/avl/avl.c
new file mode 100644
index 0000000..bbdbe08
--- /dev/null
+++ b/sys/contrib/opensolaris/common/avl/avl.c
@@ -0,0 +1,968 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+
+/*
+ * AVL - generic AVL tree implementation for kernel use
+ *
+ * A complete description of AVL trees can be found in many CS textbooks.
+ *
+ * Here is a very brief overview. An AVL tree is a binary search tree that is
+ * almost perfectly balanced. By "almost" perfectly balanced, we mean that at
+ * any given node, the left and right subtrees are allowed to differ in height
+ * by at most 1 level.
+ *
+ * This relaxation from a perfectly balanced binary tree allows doing
+ * insertion and deletion relatively efficiently. Searching the tree is
+ * still a fast operation, roughly O(log(N)).
+ *
+ * The key to insertion and deletion is a set of tree maniuplations called
+ * rotations, which bring unbalanced subtrees back into the semi-balanced state.
+ *
+ * This implementation of AVL trees has the following peculiarities:
+ *
+ * - The AVL specific data structures are physically embedded as fields
+ * in the "using" data structures. To maintain generality the code
+ * must constantly translate between "avl_node_t *" and containing
+ * data structure "void *"s by adding/subracting the avl_offset.
+ *
+ * - Since the AVL data is always embedded in other structures, there is
+ * no locking or memory allocation in the AVL routines. This must be
+ * provided for by the enclosing data structure's semantics. Typically,
+ * avl_insert()/_add()/_remove()/avl_insert_here() require some kind of
+ * exclusive write lock. Other operations require a read lock.
+ *
+ * - The implementation uses iteration instead of explicit recursion,
+ * since it is intended to run on limited size kernel stacks. Since
+ * there is no recursion stack present to move "up" in the tree,
+ * there is an explicit "parent" link in the avl_node_t.
+ *
+ * - The left/right children pointers of a node are in an array.
+ * In the code, variables (instead of constants) are used to represent
+ * left and right indices. The implementation is written as if it only
+ * dealt with left handed manipulations. By changing the value assigned
+ * to "left", the code also works for right handed trees. The
+ * following variables/terms are frequently used:
+ *
+ * int left; // 0 when dealing with left children,
+ * // 1 for dealing with right children
+ *
+ * int left_heavy; // -1 when left subtree is taller at some node,
+ * // +1 when right subtree is taller
+ *
+ * int right; // will be the opposite of left (0 or 1)
+ * int right_heavy;// will be the opposite of left_heavy (-1 or 1)
+ *
+ * int direction; // 0 for "<" (ie. left child); 1 for ">" (right)
+ *
+ * Though it is a little more confusing to read the code, the approach
+ * allows using half as much code (and hence cache footprint) for tree
+ * manipulations and eliminates many conditional branches.
+ *
+ * - The avl_index_t is an opaque "cookie" used to find nodes at or
+ * adjacent to where a new value would be inserted in the tree. The value
+ * is a modified "avl_node_t *". The bottom bit (normally 0 for a
+ * pointer) is set to indicate if that the new node has a value greater
+ * than the value of the indicated "avl_node_t *".
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/debug.h>
+#include <sys/avl.h>
+
+/*
+ * Small arrays to translate between balance (or diff) values and child indeces.
+ *
+ * Code that deals with binary tree data structures will randomly use
+ * left and right children when examining a tree. C "if()" statements
+ * which evaluate randomly suffer from very poor hardware branch prediction.
+ * In this code we avoid some of the branch mispredictions by using the
+ * following translation arrays. They replace random branches with an
+ * additional memory reference. Since the translation arrays are both very
+ * small the data should remain efficiently in cache.
+ */
+static const int avl_child2balance[2] = {-1, 1};
+static const int avl_balance2child[] = {0, 0, 1};
+
+
+/*
+ * Walk from one node to the previous valued node (ie. an infix walk
+ * towards the left). At any given node we do one of 2 things:
+ *
+ * - If there is a left child, go to it, then to it's rightmost descendant.
+ *
+ * - otherwise we return thru parent nodes until we've come from a right child.
+ *
+ * Return Value:
+ * NULL - if at the end of the nodes
+ * otherwise next node
+ */
+void *
+avl_walk(avl_tree_t *tree, void *oldnode, int left)
+{
+ size_t off = tree->avl_offset;
+ avl_node_t *node = AVL_DATA2NODE(oldnode, off);
+ int right = 1 - left;
+ int was_child;
+
+
+ /*
+ * nowhere to walk to if tree is empty
+ */
+ if (node == NULL)
+ return (NULL);
+
+ /*
+ * Visit the previous valued node. There are two possibilities:
+ *
+ * If this node has a left child, go down one left, then all
+ * the way right.
+ */
+ if (node->avl_child[left] != NULL) {
+ for (node = node->avl_child[left];
+ node->avl_child[right] != NULL;
+ node = node->avl_child[right])
+ ;
+ /*
+ * Otherwise, return thru left children as far as we can.
+ */
+ } else {
+ for (;;) {
+ was_child = AVL_XCHILD(node);
+ node = AVL_XPARENT(node);
+ if (node == NULL)
+ return (NULL);
+ if (was_child == right)
+ break;
+ }
+ }
+
+ return (AVL_NODE2DATA(node, off));
+}
+
+/*
+ * Return the lowest valued node in a tree or NULL.
+ * (leftmost child from root of tree)
+ */
+void *
+avl_first(avl_tree_t *tree)
+{
+ avl_node_t *node;
+ avl_node_t *prev = NULL;
+ size_t off = tree->avl_offset;
+
+ for (node = tree->avl_root; node != NULL; node = node->avl_child[0])
+ prev = node;
+
+ if (prev != NULL)
+ return (AVL_NODE2DATA(prev, off));
+ return (NULL);
+}
+
+/*
+ * Return the highest valued node in a tree or NULL.
+ * (rightmost child from root of tree)
+ */
+void *
+avl_last(avl_tree_t *tree)
+{
+ avl_node_t *node;
+ avl_node_t *prev = NULL;
+ size_t off = tree->avl_offset;
+
+ for (node = tree->avl_root; node != NULL; node = node->avl_child[1])
+ prev = node;
+
+ if (prev != NULL)
+ return (AVL_NODE2DATA(prev, off));
+ return (NULL);
+}
+
+/*
+ * Access the node immediately before or after an insertion point.
+ *
+ * "avl_index_t" is a (avl_node_t *) with the bottom bit indicating a child
+ *
+ * Return value:
+ * NULL: no node in the given direction
+ * "void *" of the found tree node
+ */
+void *
+avl_nearest(avl_tree_t *tree, avl_index_t where, int direction)
+{
+ int child = AVL_INDEX2CHILD(where);
+ avl_node_t *node = AVL_INDEX2NODE(where);
+ void *data;
+ size_t off = tree->avl_offset;
+
+ if (node == NULL) {
+ ASSERT(tree->avl_root == NULL);
+ return (NULL);
+ }
+ data = AVL_NODE2DATA(node, off);
+ if (child != direction)
+ return (data);
+
+ return (avl_walk(tree, data, direction));
+}
+
+
+/*
+ * Search for the node which contains "value". The algorithm is a
+ * simple binary tree search.
+ *
+ * return value:
+ * NULL: the value is not in the AVL tree
+ * *where (if not NULL) is set to indicate the insertion point
+ * "void *" of the found tree node
+ */
+void *
+avl_find(avl_tree_t *tree, void *value, avl_index_t *where)
+{
+ avl_node_t *node;
+ avl_node_t *prev = NULL;
+ int child = 0;
+ int diff;
+ size_t off = tree->avl_offset;
+
+ for (node = tree->avl_root; node != NULL;
+ node = node->avl_child[child]) {
+
+ prev = node;
+
+ diff = tree->avl_compar(value, AVL_NODE2DATA(node, off));
+ ASSERT(-1 <= diff && diff <= 1);
+ if (diff == 0) {
+#ifdef DEBUG
+ if (where != NULL)
+ *where = 0;
+#endif
+ return (AVL_NODE2DATA(node, off));
+ }
+ child = avl_balance2child[1 + diff];
+
+ }
+
+ if (where != NULL)
+ *where = AVL_MKINDEX(prev, child);
+
+ return (NULL);
+}
+
+
+/*
+ * Perform a rotation to restore balance at the subtree given by depth.
+ *
+ * This routine is used by both insertion and deletion. The return value
+ * indicates:
+ * 0 : subtree did not change height
+ * !0 : subtree was reduced in height
+ *
+ * The code is written as if handling left rotations, right rotations are
+ * symmetric and handled by swapping values of variables right/left[_heavy]
+ *
+ * On input balance is the "new" balance at "node". This value is either
+ * -2 or +2.
+ */
+static int
+avl_rotation(avl_tree_t *tree, avl_node_t *node, int balance)
+{
+ int left = !(balance < 0); /* when balance = -2, left will be 0 */
+ int right = 1 - left;
+ int left_heavy = balance >> 1;
+ int right_heavy = -left_heavy;
+ avl_node_t *parent = AVL_XPARENT(node);
+ avl_node_t *child = node->avl_child[left];
+ avl_node_t *cright;
+ avl_node_t *gchild;
+ avl_node_t *gright;
+ avl_node_t *gleft;
+ int which_child = AVL_XCHILD(node);
+ int child_bal = AVL_XBALANCE(child);
+
+ /* BEGIN CSTYLED */
+ /*
+ * case 1 : node is overly left heavy, the left child is balanced or
+ * also left heavy. This requires the following rotation.
+ *
+ * (node bal:-2)
+ * / \
+ * / \
+ * (child bal:0 or -1)
+ * / \
+ * / \
+ * cright
+ *
+ * becomes:
+ *
+ * (child bal:1 or 0)
+ * / \
+ * / \
+ * (node bal:-1 or 0)
+ * / \
+ * / \
+ * cright
+ *
+ * we detect this situation by noting that child's balance is not
+ * right_heavy.
+ */
+ /* END CSTYLED */
+ if (child_bal != right_heavy) {
+
+ /*
+ * compute new balance of nodes
+ *
+ * If child used to be left heavy (now balanced) we reduced
+ * the height of this sub-tree -- used in "return...;" below
+ */
+ child_bal += right_heavy; /* adjust towards right */
+
+ /*
+ * move "cright" to be node's left child
+ */
+ cright = child->avl_child[right];
+ node->avl_child[left] = cright;
+ if (cright != NULL) {
+ AVL_SETPARENT(cright, node);
+ AVL_SETCHILD(cright, left);
+ }
+
+ /*
+ * move node to be child's right child
+ */
+ child->avl_child[right] = node;
+ AVL_SETBALANCE(node, -child_bal);
+ AVL_SETCHILD(node, right);
+ AVL_SETPARENT(node, child);
+
+ /*
+ * update the pointer into this subtree
+ */
+ AVL_SETBALANCE(child, child_bal);
+ AVL_SETCHILD(child, which_child);
+ AVL_SETPARENT(child, parent);
+ if (parent != NULL)
+ parent->avl_child[which_child] = child;
+ else
+ tree->avl_root = child;
+
+ return (child_bal == 0);
+ }
+
+ /* BEGIN CSTYLED */
+ /*
+ * case 2 : When node is left heavy, but child is right heavy we use
+ * a different rotation.
+ *
+ * (node b:-2)
+ * / \
+ * / \
+ * / \
+ * (child b:+1)
+ * / \
+ * / \
+ * (gchild b: != 0)
+ * / \
+ * / \
+ * gleft gright
+ *
+ * becomes:
+ *
+ * (gchild b:0)
+ * / \
+ * / \
+ * / \
+ * (child b:?) (node b:?)
+ * / \ / \
+ * / \ / \
+ * gleft gright
+ *
+ * computing the new balances is more complicated. As an example:
+ * if gchild was right_heavy, then child is now left heavy
+ * else it is balanced
+ */
+ /* END CSTYLED */
+ gchild = child->avl_child[right];
+ gleft = gchild->avl_child[left];
+ gright = gchild->avl_child[right];
+
+ /*
+ * move gright to left child of node and
+ *
+ * move gleft to right child of node
+ */
+ node->avl_child[left] = gright;
+ if (gright != NULL) {
+ AVL_SETPARENT(gright, node);
+ AVL_SETCHILD(gright, left);
+ }
+
+ child->avl_child[right] = gleft;
+ if (gleft != NULL) {
+ AVL_SETPARENT(gleft, child);
+ AVL_SETCHILD(gleft, right);
+ }
+
+ /*
+ * move child to left child of gchild and
+ *
+ * move node to right child of gchild and
+ *
+ * fixup parent of all this to point to gchild
+ */
+ balance = AVL_XBALANCE(gchild);
+ gchild->avl_child[left] = child;
+ AVL_SETBALANCE(child, (balance == right_heavy ? left_heavy : 0));
+ AVL_SETPARENT(child, gchild);
+ AVL_SETCHILD(child, left);
+
+ gchild->avl_child[right] = node;
+ AVL_SETBALANCE(node, (balance == left_heavy ? right_heavy : 0));
+ AVL_SETPARENT(node, gchild);
+ AVL_SETCHILD(node, right);
+
+ AVL_SETBALANCE(gchild, 0);
+ AVL_SETPARENT(gchild, parent);
+ AVL_SETCHILD(gchild, which_child);
+ if (parent != NULL)
+ parent->avl_child[which_child] = gchild;
+ else
+ tree->avl_root = gchild;
+
+ return (1); /* the new tree is always shorter */
+}
+
+
+/*
+ * Insert a new node into an AVL tree at the specified (from avl_find()) place.
+ *
+ * Newly inserted nodes are always leaf nodes in the tree, since avl_find()
+ * searches out to the leaf positions. The avl_index_t indicates the node
+ * which will be the parent of the new node.
+ *
+ * After the node is inserted, a single rotation further up the tree may
+ * be necessary to maintain an acceptable AVL balance.
+ */
+void
+avl_insert(avl_tree_t *tree, void *new_data, avl_index_t where)
+{
+ avl_node_t *node;
+ avl_node_t *parent = AVL_INDEX2NODE(where);
+ int old_balance;
+ int new_balance;
+ int which_child = AVL_INDEX2CHILD(where);
+ size_t off = tree->avl_offset;
+
+ ASSERT(tree);
+#ifdef _LP64
+ ASSERT(((uintptr_t)new_data & 0x7) == 0);
+#endif
+
+ node = AVL_DATA2NODE(new_data, off);
+
+ /*
+ * First, add the node to the tree at the indicated position.
+ */
+ ++tree->avl_numnodes;
+
+ node->avl_child[0] = NULL;
+ node->avl_child[1] = NULL;
+
+ AVL_SETCHILD(node, which_child);
+ AVL_SETBALANCE(node, 0);
+ AVL_SETPARENT(node, parent);
+ if (parent != NULL) {
+ ASSERT(parent->avl_child[which_child] == NULL);
+ parent->avl_child[which_child] = node;
+ } else {
+ ASSERT(tree->avl_root == NULL);
+ tree->avl_root = node;
+ }
+ /*
+ * Now, back up the tree modifying the balance of all nodes above the
+ * insertion point. If we get to a highly unbalanced ancestor, we
+ * need to do a rotation. If we back out of the tree we are done.
+ * If we brought any subtree into perfect balance (0), we are also done.
+ */
+ for (;;) {
+ node = parent;
+ if (node == NULL)
+ return;
+
+ /*
+ * Compute the new balance
+ */
+ old_balance = AVL_XBALANCE(node);
+ new_balance = old_balance + avl_child2balance[which_child];
+
+ /*
+ * If we introduced equal balance, then we are done immediately
+ */
+ if (new_balance == 0) {
+ AVL_SETBALANCE(node, 0);
+ return;
+ }
+
+ /*
+ * If both old and new are not zero we went
+ * from -1 to -2 balance, do a rotation.
+ */
+ if (old_balance != 0)
+ break;
+
+ AVL_SETBALANCE(node, new_balance);
+ parent = AVL_XPARENT(node);
+ which_child = AVL_XCHILD(node);
+ }
+
+ /*
+ * perform a rotation to fix the tree and return
+ */
+ (void) avl_rotation(tree, node, new_balance);
+}
+
+/*
+ * Insert "new_data" in "tree" in the given "direction" either after or
+ * before (AVL_AFTER, AVL_BEFORE) the data "here".
+ *
+ * Insertions can only be done at empty leaf points in the tree, therefore
+ * if the given child of the node is already present we move to either
+ * the AVL_PREV or AVL_NEXT and reverse the insertion direction. Since
+ * every other node in the tree is a leaf, this always works.
+ *
+ * To help developers using this interface, we assert that the new node
+ * is correctly ordered at every step of the way in DEBUG kernels.
+ */
+void
+avl_insert_here(
+ avl_tree_t *tree,
+ void *new_data,
+ void *here,
+ int direction)
+{
+ avl_node_t *node;
+ int child = direction; /* rely on AVL_BEFORE == 0, AVL_AFTER == 1 */
+#ifdef DEBUG
+ int diff;
+#endif
+
+ ASSERT(tree != NULL);
+ ASSERT(new_data != NULL);
+ ASSERT(here != NULL);
+ ASSERT(direction == AVL_BEFORE || direction == AVL_AFTER);
+
+ /*
+ * If corresponding child of node is not NULL, go to the neighboring
+ * node and reverse the insertion direction.
+ */
+ node = AVL_DATA2NODE(here, tree->avl_offset);
+
+#ifdef DEBUG
+ diff = tree->avl_compar(new_data, here);
+ ASSERT(-1 <= diff && diff <= 1);
+ ASSERT(diff != 0);
+ ASSERT(diff > 0 ? child == 1 : child == 0);
+#endif
+
+ if (node->avl_child[child] != NULL) {
+ node = node->avl_child[child];
+ child = 1 - child;
+ while (node->avl_child[child] != NULL) {
+#ifdef DEBUG
+ diff = tree->avl_compar(new_data,
+ AVL_NODE2DATA(node, tree->avl_offset));
+ ASSERT(-1 <= diff && diff <= 1);
+ ASSERT(diff != 0);
+ ASSERT(diff > 0 ? child == 1 : child == 0);
+#endif
+ node = node->avl_child[child];
+ }
+#ifdef DEBUG
+ diff = tree->avl_compar(new_data,
+ AVL_NODE2DATA(node, tree->avl_offset));
+ ASSERT(-1 <= diff && diff <= 1);
+ ASSERT(diff != 0);
+ ASSERT(diff > 0 ? child == 1 : child == 0);
+#endif
+ }
+ ASSERT(node->avl_child[child] == NULL);
+
+ avl_insert(tree, new_data, AVL_MKINDEX(node, child));
+}
+
+/*
+ * Add a new node to an AVL tree.
+ */
+void
+avl_add(avl_tree_t *tree, void *new_node)
+{
+ avl_index_t where;
+
+ /*
+ * This is unfortunate. We want to call panic() here, even for
+ * non-DEBUG kernels. In userland, however, we can't depend on anything
+ * in libc or else the rtld build process gets confused. So, all we can
+ * do in userland is resort to a normal ASSERT().
+ */
+ if (avl_find(tree, new_node, &where) != NULL)
+#ifdef _KERNEL
+ panic("avl_find() succeeded inside avl_add()");
+#else
+ ASSERT(0);
+#endif
+ avl_insert(tree, new_node, where);
+}
+
+/*
+ * Delete a node from the AVL tree. Deletion is similar to insertion, but
+ * with 2 complications.
+ *
+ * First, we may be deleting an interior node. Consider the following subtree:
+ *
+ * d c c
+ * / \ / \ / \
+ * b e b e b e
+ * / \ / \ /
+ * a c a a
+ *
+ * When we are deleting node (d), we find and bring up an adjacent valued leaf
+ * node, say (c), to take the interior node's place. In the code this is
+ * handled by temporarily swapping (d) and (c) in the tree and then using
+ * common code to delete (d) from the leaf position.
+ *
+ * Secondly, an interior deletion from a deep tree may require more than one
+ * rotation to fix the balance. This is handled by moving up the tree through
+ * parents and applying rotations as needed. The return value from
+ * avl_rotation() is used to detect when a subtree did not change overall
+ * height due to a rotation.
+ */
+void
+avl_remove(avl_tree_t *tree, void *data)
+{
+ avl_node_t *delete;
+ avl_node_t *parent;
+ avl_node_t *node;
+ avl_node_t tmp;
+ int old_balance;
+ int new_balance;
+ int left;
+ int right;
+ int which_child;
+ size_t off = tree->avl_offset;
+
+ ASSERT(tree);
+
+ delete = AVL_DATA2NODE(data, off);
+
+ /*
+ * Deletion is easiest with a node that has at most 1 child.
+ * We swap a node with 2 children with a sequentially valued
+ * neighbor node. That node will have at most 1 child. Note this
+ * has no effect on the ordering of the remaining nodes.
+ *
+ * As an optimization, we choose the greater neighbor if the tree
+ * is right heavy, otherwise the left neighbor. This reduces the
+ * number of rotations needed.
+ */
+ if (delete->avl_child[0] != NULL && delete->avl_child[1] != NULL) {
+
+ /*
+ * choose node to swap from whichever side is taller
+ */
+ old_balance = AVL_XBALANCE(delete);
+ left = avl_balance2child[old_balance + 1];
+ right = 1 - left;
+
+ /*
+ * get to the previous value'd node
+ * (down 1 left, as far as possible right)
+ */
+ for (node = delete->avl_child[left];
+ node->avl_child[right] != NULL;
+ node = node->avl_child[right])
+ ;
+
+ /*
+ * create a temp placeholder for 'node'
+ * move 'node' to delete's spot in the tree
+ */
+ tmp = *node;
+
+ *node = *delete;
+ if (node->avl_child[left] == node)
+ node->avl_child[left] = &tmp;
+
+ parent = AVL_XPARENT(node);
+ if (parent != NULL)
+ parent->avl_child[AVL_XCHILD(node)] = node;
+ else
+ tree->avl_root = node;
+ AVL_SETPARENT(node->avl_child[left], node);
+ AVL_SETPARENT(node->avl_child[right], node);
+
+ /*
+ * Put tmp where node used to be (just temporary).
+ * It always has a parent and at most 1 child.
+ */
+ delete = &tmp;
+ parent = AVL_XPARENT(delete);
+ parent->avl_child[AVL_XCHILD(delete)] = delete;
+ which_child = (delete->avl_child[1] != 0);
+ if (delete->avl_child[which_child] != NULL)
+ AVL_SETPARENT(delete->avl_child[which_child], delete);
+ }
+
+
+ /*
+ * Here we know "delete" is at least partially a leaf node. It can
+ * be easily removed from the tree.
+ */
+ ASSERT(tree->avl_numnodes > 0);
+ --tree->avl_numnodes;
+ parent = AVL_XPARENT(delete);
+ which_child = AVL_XCHILD(delete);
+ if (delete->avl_child[0] != NULL)
+ node = delete->avl_child[0];
+ else
+ node = delete->avl_child[1];
+
+ /*
+ * Connect parent directly to node (leaving out delete).
+ */
+ if (node != NULL) {
+ AVL_SETPARENT(node, parent);
+ AVL_SETCHILD(node, which_child);
+ }
+ if (parent == NULL) {
+ tree->avl_root = node;
+ return;
+ }
+ parent->avl_child[which_child] = node;
+
+
+ /*
+ * Since the subtree is now shorter, begin adjusting parent balances
+ * and performing any needed rotations.
+ */
+ do {
+
+ /*
+ * Move up the tree and adjust the balance
+ *
+ * Capture the parent and which_child values for the next
+ * iteration before any rotations occur.
+ */
+ node = parent;
+ old_balance = AVL_XBALANCE(node);
+ new_balance = old_balance - avl_child2balance[which_child];
+ parent = AVL_XPARENT(node);
+ which_child = AVL_XCHILD(node);
+
+ /*
+ * If a node was in perfect balance but isn't anymore then
+ * we can stop, since the height didn't change above this point
+ * due to a deletion.
+ */
+ if (old_balance == 0) {
+ AVL_SETBALANCE(node, new_balance);
+ break;
+ }
+
+ /*
+ * If the new balance is zero, we don't need to rotate
+ * else
+ * need a rotation to fix the balance.
+ * If the rotation doesn't change the height
+ * of the sub-tree we have finished adjusting.
+ */
+ if (new_balance == 0)
+ AVL_SETBALANCE(node, new_balance);
+ else if (!avl_rotation(tree, node, new_balance))
+ break;
+ } while (parent != NULL);
+}
+
+/*
+ * initialize a new AVL tree
+ */
+void
+avl_create(avl_tree_t *tree, int (*compar) (const void *, const void *),
+ size_t size, size_t offset)
+{
+ ASSERT(tree);
+ ASSERT(compar);
+ ASSERT(size > 0);
+ ASSERT(size >= offset + sizeof (avl_node_t));
+#ifdef _LP64
+ ASSERT((offset & 0x7) == 0);
+#endif
+
+ tree->avl_compar = compar;
+ tree->avl_root = NULL;
+ tree->avl_numnodes = 0;
+ tree->avl_size = size;
+ tree->avl_offset = offset;
+}
+
+/*
+ * Delete a tree.
+ */
+/* ARGSUSED */
+void
+avl_destroy(avl_tree_t *tree)
+{
+ ASSERT(tree);
+ ASSERT(tree->avl_numnodes == 0);
+ ASSERT(tree->avl_root == NULL);
+}
+
+
+/*
+ * Return the number of nodes in an AVL tree.
+ */
+ulong_t
+avl_numnodes(avl_tree_t *tree)
+{
+ ASSERT(tree);
+ return (tree->avl_numnodes);
+}
+
+
+#define CHILDBIT (1L)
+
+/*
+ * Post-order tree walk used to visit all tree nodes and destroy the tree
+ * in post order. This is used for destroying a tree w/o paying any cost
+ * for rebalancing it.
+ *
+ * example:
+ *
+ * void *cookie = NULL;
+ * my_data_t *node;
+ *
+ * while ((node = avl_destroy_nodes(tree, &cookie)) != NULL)
+ * free(node);
+ * avl_destroy(tree);
+ *
+ * The cookie is really an avl_node_t to the current node's parent and
+ * an indication of which child you looked at last.
+ *
+ * On input, a cookie value of CHILDBIT indicates the tree is done.
+ */
+void *
+avl_destroy_nodes(avl_tree_t *tree, void **cookie)
+{
+ avl_node_t *node;
+ avl_node_t *parent;
+ int child;
+ void *first;
+ size_t off = tree->avl_offset;
+
+ /*
+ * Initial calls go to the first node or it's right descendant.
+ */
+ if (*cookie == NULL) {
+ first = avl_first(tree);
+
+ /*
+ * deal with an empty tree
+ */
+ if (first == NULL) {
+ *cookie = (void *)CHILDBIT;
+ return (NULL);
+ }
+
+ node = AVL_DATA2NODE(first, off);
+ parent = AVL_XPARENT(node);
+ goto check_right_side;
+ }
+
+ /*
+ * If there is no parent to return to we are done.
+ */
+ parent = (avl_node_t *)((uintptr_t)(*cookie) & ~CHILDBIT);
+ if (parent == NULL) {
+ if (tree->avl_root != NULL) {
+ ASSERT(tree->avl_numnodes == 1);
+ tree->avl_root = NULL;
+ tree->avl_numnodes = 0;
+ }
+ return (NULL);
+ }
+
+ /*
+ * Remove the child pointer we just visited from the parent and tree.
+ */
+ child = (uintptr_t)(*cookie) & CHILDBIT;
+ parent->avl_child[child] = NULL;
+ ASSERT(tree->avl_numnodes > 1);
+ --tree->avl_numnodes;
+
+ /*
+ * If we just did a right child or there isn't one, go up to parent.
+ */
+ if (child == 1 || parent->avl_child[1] == NULL) {
+ node = parent;
+ parent = AVL_XPARENT(parent);
+ goto done;
+ }
+
+ /*
+ * Do parent's right child, then leftmost descendent.
+ */
+ node = parent->avl_child[1];
+ while (node->avl_child[0] != NULL) {
+ parent = node;
+ node = node->avl_child[0];
+ }
+
+ /*
+ * If here, we moved to a left child. It may have one
+ * child on the right (when balance == +1).
+ */
+check_right_side:
+ if (node->avl_child[1] != NULL) {
+ ASSERT(AVL_XBALANCE(node) == 1);
+ parent = node;
+ node = node->avl_child[1];
+ ASSERT(node->avl_child[0] == NULL &&
+ node->avl_child[1] == NULL);
+ } else {
+ ASSERT(AVL_XBALANCE(node) <= 0);
+ }
+
+done:
+ if (parent == NULL) {
+ *cookie = (void *)CHILDBIT;
+ ASSERT(node == tree->avl_root);
+ } else {
+ *cookie = (void *)((uintptr_t)parent | AVL_XCHILD(node));
+ }
+
+ return (AVL_NODE2DATA(node, off));
+}
diff --git a/sys/contrib/opensolaris/common/nvpair/nvpair.c b/sys/contrib/opensolaris/common/nvpair/nvpair.c
new file mode 100644
index 0000000..a1e6190
--- /dev/null
+++ b/sys/contrib/opensolaris/common/nvpair/nvpair.c
@@ -0,0 +1,2953 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/debug.h>
+#include <sys/nvpair.h>
+#include <sys/nvpair_impl.h>
+#include <rpc/types.h>
+#include <rpc/xdr.h>
+
+#if defined(_KERNEL) && !defined(_BOOT)
+#include <sys/varargs.h>
+#else
+#include <stdarg.h>
+#include <strings.h>
+#endif
+
+#ifndef offsetof
+#define offsetof(s, m) ((size_t)(&(((s *)0)->m)))
+#endif
+
+
+/*
+ * nvpair.c - Provides kernel & userland interfaces for manipulating
+ * name-value pairs.
+ *
+ * Overview Diagram
+ *
+ * +--------------+
+ * | nvlist_t |
+ * |--------------|
+ * | nvl_version |
+ * | nvl_nvflag |
+ * | nvl_priv -+-+
+ * | nvl_flag | |
+ * | nvl_pad | |
+ * +--------------+ |
+ * V
+ * +--------------+ last i_nvp in list
+ * | nvpriv_t | +--------------------->
+ * |--------------| |
+ * +--+- nvp_list | | +------------+
+ * | | nvp_last -+--+ + nv_alloc_t |
+ * | | nvp_curr | |------------|
+ * | | nvp_nva -+----> | nva_ops |
+ * | | nvp_stat | | nva_arg |
+ * | +--------------+ +------------+
+ * |
+ * +-------+
+ * V
+ * +---------------------+ +-------------------+
+ * | i_nvp_t | +-->| i_nvp_t | +-->
+ * |---------------------| | |-------------------| |
+ * | nvi_next -+--+ | nvi_next -+--+
+ * | nvi_prev (NULL) | <----+ nvi_prev |
+ * | . . . . . . . . . . | | . . . . . . . . . |
+ * | nvp (nvpair_t) | | nvp (nvpair_t) |
+ * | - nvp_size | | - nvp_size |
+ * | - nvp_name_sz | | - nvp_name_sz |
+ * | - nvp_value_elem | | - nvp_value_elem |
+ * | - nvp_type | | - nvp_type |
+ * | - data ... | | - data ... |
+ * +---------------------+ +-------------------+
+ *
+ *
+ *
+ * +---------------------+ +---------------------+
+ * | i_nvp_t | +--> +-->| i_nvp_t (last) |
+ * |---------------------| | | |---------------------|
+ * | nvi_next -+--+ ... --+ | nvi_next (NULL) |
+ * <-+- nvi_prev |<-- ... <----+ nvi_prev |
+ * | . . . . . . . . . | | . . . . . . . . . |
+ * | nvp (nvpair_t) | | nvp (nvpair_t) |
+ * | - nvp_size | | - nvp_size |
+ * | - nvp_name_sz | | - nvp_name_sz |
+ * | - nvp_value_elem | | - nvp_value_elem |
+ * | - DATA_TYPE_NVLIST | | - nvp_type |
+ * | - data (embedded) | | - data ... |
+ * | nvlist name | +---------------------+
+ * | +--------------+ |
+ * | | nvlist_t | |
+ * | |--------------| |
+ * | | nvl_version | |
+ * | | nvl_nvflag | |
+ * | | nvl_priv --+---+---->
+ * | | nvl_flag | |
+ * | | nvl_pad | |
+ * | +--------------+ |
+ * +---------------------+
+ *
+ *
+ * N.B. nvpair_t may be aligned on 4 byte boundary, so +4 will
+ * allow value to be aligned on 8 byte boundary
+ *
+ * name_len is the length of the name string including the null terminator
+ * so it must be >= 1
+ */
+#define NVP_SIZE_CALC(name_len, data_len) \
+ (NV_ALIGN((sizeof (nvpair_t)) + name_len) + NV_ALIGN(data_len))
+
+static int i_get_value_size(data_type_t type, const void *data, uint_t nelem);
+static int nvlist_add_common(nvlist_t *nvl, const char *name, data_type_t type,
+ uint_t nelem, const void *data);
+
+#define NV_STAT_EMBEDDED 0x1
+#define EMBEDDED_NVL(nvp) ((nvlist_t *)(void *)NVP_VALUE(nvp))
+#define EMBEDDED_NVL_ARRAY(nvp) ((nvlist_t **)(void *)NVP_VALUE(nvp))
+
+#define NVP_VALOFF(nvp) (NV_ALIGN(sizeof (nvpair_t) + (nvp)->nvp_name_sz))
+#define NVPAIR2I_NVP(nvp) \
+ ((i_nvp_t *)((size_t)(nvp) - offsetof(i_nvp_t, nvi_nvp)))
+
+
+int
+nv_alloc_init(nv_alloc_t *nva, const nv_alloc_ops_t *nvo, /* args */ ...)
+{
+ va_list valist;
+ int err = 0;
+
+ nva->nva_ops = nvo;
+ nva->nva_arg = NULL;
+
+ va_start(valist, nvo);
+ if (nva->nva_ops->nv_ao_init != NULL)
+ err = nva->nva_ops->nv_ao_init(nva, valist);
+ va_end(valist);
+
+ return (err);
+}
+
+void
+nv_alloc_reset(nv_alloc_t *nva)
+{
+ if (nva->nva_ops->nv_ao_reset != NULL)
+ nva->nva_ops->nv_ao_reset(nva);
+}
+
+void
+nv_alloc_fini(nv_alloc_t *nva)
+{
+ if (nva->nva_ops->nv_ao_fini != NULL)
+ nva->nva_ops->nv_ao_fini(nva);
+}
+
+nv_alloc_t *
+nvlist_lookup_nv_alloc(nvlist_t *nvl)
+{
+ nvpriv_t *priv;
+
+ if (nvl == NULL ||
+ (priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv) == NULL)
+ return (NULL);
+
+ return (priv->nvp_nva);
+}
+
+static void *
+nv_mem_zalloc(nvpriv_t *nvp, size_t size)
+{
+ nv_alloc_t *nva = nvp->nvp_nva;
+ void *buf;
+
+ if ((buf = nva->nva_ops->nv_ao_alloc(nva, size)) != NULL)
+ bzero(buf, size);
+
+ return (buf);
+}
+
+static void
+nv_mem_free(nvpriv_t *nvp, void *buf, size_t size)
+{
+ nv_alloc_t *nva = nvp->nvp_nva;
+
+ nva->nva_ops->nv_ao_free(nva, buf, size);
+}
+
+static void
+nv_priv_init(nvpriv_t *priv, nv_alloc_t *nva, uint32_t stat)
+{
+ bzero(priv, sizeof (priv));
+
+ priv->nvp_nva = nva;
+ priv->nvp_stat = stat;
+}
+
+static nvpriv_t *
+nv_priv_alloc(nv_alloc_t *nva)
+{
+ nvpriv_t *priv;
+
+ /*
+ * nv_mem_alloc() cannot called here because it needs the priv
+ * argument.
+ */
+ if ((priv = nva->nva_ops->nv_ao_alloc(nva, sizeof (nvpriv_t))) == NULL)
+ return (NULL);
+
+ nv_priv_init(priv, nva, 0);
+
+ return (priv);
+}
+
+/*
+ * Embedded lists need their own nvpriv_t's. We create a new
+ * nvpriv_t using the parameters and allocator from the parent
+ * list's nvpriv_t.
+ */
+static nvpriv_t *
+nv_priv_alloc_embedded(nvpriv_t *priv)
+{
+ nvpriv_t *emb_priv;
+
+ if ((emb_priv = nv_mem_zalloc(priv, sizeof (nvpriv_t))) == NULL)
+ return (NULL);
+
+ nv_priv_init(emb_priv, priv->nvp_nva, NV_STAT_EMBEDDED);
+
+ return (emb_priv);
+}
+
+static void
+nvlist_init(nvlist_t *nvl, uint32_t nvflag, nvpriv_t *priv)
+{
+ nvl->nvl_version = NV_VERSION;
+ nvl->nvl_nvflag = nvflag & (NV_UNIQUE_NAME|NV_UNIQUE_NAME_TYPE);
+ nvl->nvl_priv = (uint64_t)(uintptr_t)priv;
+ nvl->nvl_flag = 0;
+ nvl->nvl_pad = 0;
+}
+
+/*
+ * nvlist_alloc - Allocate nvlist.
+ */
+/*ARGSUSED1*/
+int
+nvlist_alloc(nvlist_t **nvlp, uint_t nvflag, int kmflag)
+{
+#if defined(_KERNEL) && !defined(_BOOT)
+ return (nvlist_xalloc(nvlp, nvflag,
+ (kmflag == KM_SLEEP ? nv_alloc_sleep : nv_alloc_nosleep)));
+#else
+ return (nvlist_xalloc(nvlp, nvflag, nv_alloc_nosleep));
+#endif
+}
+
+int
+nvlist_xalloc(nvlist_t **nvlp, uint_t nvflag, nv_alloc_t *nva)
+{
+ nvpriv_t *priv;
+
+ if (nvlp == NULL || nva == NULL)
+ return (EINVAL);
+
+ if ((priv = nv_priv_alloc(nva)) == NULL)
+ return (ENOMEM);
+
+ if ((*nvlp = nv_mem_zalloc(priv,
+ NV_ALIGN(sizeof (nvlist_t)))) == NULL) {
+ nv_mem_free(priv, priv, sizeof (nvpriv_t));
+ return (ENOMEM);
+ }
+
+ nvlist_init(*nvlp, nvflag, priv);
+
+ return (0);
+}
+
+/*
+ * nvp_buf_alloc - Allocate i_nvp_t for storing a new nv pair.
+ */
+static nvpair_t *
+nvp_buf_alloc(nvlist_t *nvl, size_t len)
+{
+ nvpriv_t *priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv;
+ i_nvp_t *buf;
+ nvpair_t *nvp;
+ size_t nvsize;
+
+ /*
+ * Allocate the buffer
+ */
+ nvsize = len + offsetof(i_nvp_t, nvi_nvp);
+
+ if ((buf = nv_mem_zalloc(priv, nvsize)) == NULL)
+ return (NULL);
+
+ nvp = &buf->nvi_nvp;
+ nvp->nvp_size = len;
+
+ return (nvp);
+}
+
+/*
+ * nvp_buf_free - de-Allocate an i_nvp_t.
+ */
+static void
+nvp_buf_free(nvlist_t *nvl, nvpair_t *nvp)
+{
+ nvpriv_t *priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv;
+ size_t nvsize = nvp->nvp_size + offsetof(i_nvp_t, nvi_nvp);
+
+ nv_mem_free(priv, NVPAIR2I_NVP(nvp), nvsize);
+}
+
+/*
+ * nvp_buf_link - link a new nv pair into the nvlist.
+ */
+static void
+nvp_buf_link(nvlist_t *nvl, nvpair_t *nvp)
+{
+ nvpriv_t *priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv;
+ i_nvp_t *curr = NVPAIR2I_NVP(nvp);
+
+ /* Put element at end of nvlist */
+ if (priv->nvp_list == NULL) {
+ priv->nvp_list = priv->nvp_last = curr;
+ } else {
+ curr->nvi_prev = priv->nvp_last;
+ priv->nvp_last->nvi_next = curr;
+ priv->nvp_last = curr;
+ }
+}
+
+/*
+ * nvp_buf_unlink - unlink an removed nvpair out of the nvlist.
+ */
+static void
+nvp_buf_unlink(nvlist_t *nvl, nvpair_t *nvp)
+{
+ nvpriv_t *priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv;
+ i_nvp_t *curr = NVPAIR2I_NVP(nvp);
+
+ /*
+ * protect nvlist_next_nvpair() against walking on freed memory.
+ */
+ if (priv->nvp_curr == curr)
+ priv->nvp_curr = curr->nvi_next;
+
+ if (curr == priv->nvp_list)
+ priv->nvp_list = curr->nvi_next;
+ else
+ curr->nvi_prev->nvi_next = curr->nvi_next;
+
+ if (curr == priv->nvp_last)
+ priv->nvp_last = curr->nvi_prev;
+ else
+ curr->nvi_next->nvi_prev = curr->nvi_prev;
+}
+
+/*
+ * take a nvpair type and number of elements and make sure the are valid
+ */
+static int
+i_validate_type_nelem(data_type_t type, uint_t nelem)
+{
+ switch (type) {
+ case DATA_TYPE_BOOLEAN:
+ if (nelem != 0)
+ return (EINVAL);
+ break;
+ case DATA_TYPE_BOOLEAN_VALUE:
+ case DATA_TYPE_BYTE:
+ case DATA_TYPE_INT8:
+ case DATA_TYPE_UINT8:
+ case DATA_TYPE_INT16:
+ case DATA_TYPE_UINT16:
+ case DATA_TYPE_INT32:
+ case DATA_TYPE_UINT32:
+ case DATA_TYPE_INT64:
+ case DATA_TYPE_UINT64:
+ case DATA_TYPE_STRING:
+ case DATA_TYPE_HRTIME:
+ case DATA_TYPE_NVLIST:
+ if (nelem != 1)
+ return (EINVAL);
+ break;
+ case DATA_TYPE_BOOLEAN_ARRAY:
+ case DATA_TYPE_BYTE_ARRAY:
+ case DATA_TYPE_INT8_ARRAY:
+ case DATA_TYPE_UINT8_ARRAY:
+ case DATA_TYPE_INT16_ARRAY:
+ case DATA_TYPE_UINT16_ARRAY:
+ case DATA_TYPE_INT32_ARRAY:
+ case DATA_TYPE_UINT32_ARRAY:
+ case DATA_TYPE_INT64_ARRAY:
+ case DATA_TYPE_UINT64_ARRAY:
+ case DATA_TYPE_STRING_ARRAY:
+ case DATA_TYPE_NVLIST_ARRAY:
+ /* we allow arrays with 0 elements */
+ break;
+ default:
+ return (EINVAL);
+ }
+ return (0);
+}
+
+/*
+ * Verify nvp_name_sz and check the name string length.
+ */
+static int
+i_validate_nvpair_name(nvpair_t *nvp)
+{
+ if ((nvp->nvp_name_sz <= 0) ||
+ (nvp->nvp_size < NVP_SIZE_CALC(nvp->nvp_name_sz, 0)))
+ return (EFAULT);
+
+ /* verify the name string, make sure its terminated */
+ if (NVP_NAME(nvp)[nvp->nvp_name_sz - 1] != '\0')
+ return (EFAULT);
+
+ return (strlen(NVP_NAME(nvp)) == nvp->nvp_name_sz - 1 ? 0 : EFAULT);
+}
+
+static int
+i_validate_nvpair_value(data_type_t type, uint_t nelem, const void *data)
+{
+ switch (type) {
+ case DATA_TYPE_BOOLEAN_VALUE:
+ if (*(boolean_t *)data != B_TRUE &&
+ *(boolean_t *)data != B_FALSE)
+ return (EINVAL);
+ break;
+ case DATA_TYPE_BOOLEAN_ARRAY: {
+ int i;
+
+ for (i = 0; i < nelem; i++)
+ if (((boolean_t *)data)[i] != B_TRUE &&
+ ((boolean_t *)data)[i] != B_FALSE)
+ return (EINVAL);
+ break;
+ }
+ default:
+ break;
+ }
+
+ return (0);
+}
+
+/*
+ * This function takes a pointer to what should be a nvpair and it's size
+ * and then verifies that all the nvpair fields make sense and can be
+ * trusted. This function is used when decoding packed nvpairs.
+ */
+static int
+i_validate_nvpair(nvpair_t *nvp)
+{
+ data_type_t type = NVP_TYPE(nvp);
+ int size1, size2;
+
+ /* verify nvp_name_sz, check the name string length */
+ if (i_validate_nvpair_name(nvp) != 0)
+ return (EFAULT);
+
+ if (i_validate_nvpair_value(type, NVP_NELEM(nvp), NVP_VALUE(nvp)) != 0)
+ return (EFAULT);
+
+ /*
+ * verify nvp_type, nvp_value_elem, and also possibly
+ * verify string values and get the value size.
+ */
+ size2 = i_get_value_size(type, NVP_VALUE(nvp), NVP_NELEM(nvp));
+ size1 = nvp->nvp_size - NVP_VALOFF(nvp);
+ if (size2 < 0 || size1 != NV_ALIGN(size2))
+ return (EFAULT);
+
+ return (0);
+}
+
+static int
+nvlist_copy_pairs(nvlist_t *snvl, nvlist_t *dnvl)
+{
+ nvpriv_t *priv;
+ i_nvp_t *curr;
+
+ if ((priv = (nvpriv_t *)(uintptr_t)snvl->nvl_priv) == NULL)
+ return (EINVAL);
+
+ for (curr = priv->nvp_list; curr != NULL; curr = curr->nvi_next) {
+ nvpair_t *nvp = &curr->nvi_nvp;
+ int err;
+
+ if ((err = nvlist_add_common(dnvl, NVP_NAME(nvp), NVP_TYPE(nvp),
+ NVP_NELEM(nvp), NVP_VALUE(nvp))) != 0)
+ return (err);
+ }
+
+ return (0);
+}
+
+/*
+ * Frees all memory allocated for an nvpair (like embedded lists) with
+ * the exception of the nvpair buffer itself.
+ */
+static void
+nvpair_free(nvpair_t *nvp)
+{
+ switch (NVP_TYPE(nvp)) {
+ case DATA_TYPE_NVLIST:
+ nvlist_free(EMBEDDED_NVL(nvp));
+ break;
+ case DATA_TYPE_NVLIST_ARRAY: {
+ nvlist_t **nvlp = EMBEDDED_NVL_ARRAY(nvp);
+ int i;
+
+ for (i = 0; i < NVP_NELEM(nvp); i++)
+ if (nvlp[i] != NULL)
+ nvlist_free(nvlp[i]);
+ break;
+ }
+ default:
+ break;
+ }
+}
+
+/*
+ * nvlist_free - free an unpacked nvlist
+ */
+void
+nvlist_free(nvlist_t *nvl)
+{
+ nvpriv_t *priv;
+ i_nvp_t *curr;
+
+ if (nvl == NULL ||
+ (priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv) == NULL)
+ return;
+
+ /*
+ * Unpacked nvlist are linked through i_nvp_t
+ */
+ curr = priv->nvp_list;
+ while (curr != NULL) {
+ nvpair_t *nvp = &curr->nvi_nvp;
+ curr = curr->nvi_next;
+
+ nvpair_free(nvp);
+ nvp_buf_free(nvl, nvp);
+ }
+
+ if (!(priv->nvp_stat & NV_STAT_EMBEDDED))
+ nv_mem_free(priv, nvl, NV_ALIGN(sizeof (nvlist_t)));
+ else
+ nvl->nvl_priv = 0;
+
+ nv_mem_free(priv, priv, sizeof (nvpriv_t));
+}
+
+static int
+nvlist_contains_nvp(nvlist_t *nvl, nvpair_t *nvp)
+{
+ nvpriv_t *priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv;
+ i_nvp_t *curr;
+
+ if (nvp == NULL)
+ return (0);
+
+ for (curr = priv->nvp_list; curr != NULL; curr = curr->nvi_next)
+ if (&curr->nvi_nvp == nvp)
+ return (1);
+
+ return (0);
+}
+
+/*
+ * Make a copy of nvlist
+ */
+/*ARGSUSED1*/
+int
+nvlist_dup(nvlist_t *nvl, nvlist_t **nvlp, int kmflag)
+{
+#if defined(_KERNEL) && !defined(_BOOT)
+ return (nvlist_xdup(nvl, nvlp,
+ (kmflag == KM_SLEEP ? nv_alloc_sleep : nv_alloc_nosleep)));
+#else
+ return (nvlist_xdup(nvl, nvlp, nv_alloc_nosleep));
+#endif
+}
+
+int
+nvlist_xdup(nvlist_t *nvl, nvlist_t **nvlp, nv_alloc_t *nva)
+{
+ int err;
+ nvlist_t *ret;
+
+ if (nvl == NULL || nvlp == NULL)
+ return (EINVAL);
+
+ if ((err = nvlist_xalloc(&ret, nvl->nvl_nvflag, nva)) != 0)
+ return (err);
+
+ if ((err = nvlist_copy_pairs(nvl, ret)) != 0)
+ nvlist_free(ret);
+ else
+ *nvlp = ret;
+
+ return (err);
+}
+
+/*
+ * Remove all with matching name
+ */
+int
+nvlist_remove_all(nvlist_t *nvl, const char *name)
+{
+ nvpriv_t *priv;
+ i_nvp_t *curr;
+ int error = ENOENT;
+
+ if (nvl == NULL || name == NULL ||
+ (priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv) == NULL)
+ return (EINVAL);
+
+ curr = priv->nvp_list;
+ while (curr != NULL) {
+ nvpair_t *nvp = &curr->nvi_nvp;
+
+ curr = curr->nvi_next;
+ if (strcmp(name, NVP_NAME(nvp)) != 0)
+ continue;
+
+ nvp_buf_unlink(nvl, nvp);
+ nvpair_free(nvp);
+ nvp_buf_free(nvl, nvp);
+
+ error = 0;
+ }
+
+ return (error);
+}
+
+/*
+ * Remove first one with matching name and type
+ */
+int
+nvlist_remove(nvlist_t *nvl, const char *name, data_type_t type)
+{
+ nvpriv_t *priv;
+ i_nvp_t *curr;
+
+ if (nvl == NULL || name == NULL ||
+ (priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv) == NULL)
+ return (EINVAL);
+
+ curr = priv->nvp_list;
+ while (curr != NULL) {
+ nvpair_t *nvp = &curr->nvi_nvp;
+
+ if (strcmp(name, NVP_NAME(nvp)) == 0 && NVP_TYPE(nvp) == type) {
+ nvp_buf_unlink(nvl, nvp);
+ nvpair_free(nvp);
+ nvp_buf_free(nvl, nvp);
+
+ return (0);
+ }
+ curr = curr->nvi_next;
+ }
+
+ return (ENOENT);
+}
+
+/*
+ * This function calculates the size of an nvpair value.
+ *
+ * The data argument controls the behavior in case of the data types
+ * DATA_TYPE_STRING and
+ * DATA_TYPE_STRING_ARRAY
+ * Is data == NULL then the size of the string(s) is excluded.
+ */
+static int
+i_get_value_size(data_type_t type, const void *data, uint_t nelem)
+{
+ uint64_t value_sz;
+
+ if (i_validate_type_nelem(type, nelem) != 0)
+ return (-1);
+
+ /* Calculate required size for holding value */
+ switch (type) {
+ case DATA_TYPE_BOOLEAN:
+ value_sz = 0;
+ break;
+ case DATA_TYPE_BOOLEAN_VALUE:
+ value_sz = sizeof (boolean_t);
+ break;
+ case DATA_TYPE_BYTE:
+ value_sz = sizeof (uchar_t);
+ break;
+ case DATA_TYPE_INT8:
+ value_sz = sizeof (int8_t);
+ break;
+ case DATA_TYPE_UINT8:
+ value_sz = sizeof (uint8_t);
+ break;
+ case DATA_TYPE_INT16:
+ value_sz = sizeof (int16_t);
+ break;
+ case DATA_TYPE_UINT16:
+ value_sz = sizeof (uint16_t);
+ break;
+ case DATA_TYPE_INT32:
+ value_sz = sizeof (int32_t);
+ break;
+ case DATA_TYPE_UINT32:
+ value_sz = sizeof (uint32_t);
+ break;
+ case DATA_TYPE_INT64:
+ value_sz = sizeof (int64_t);
+ break;
+ case DATA_TYPE_UINT64:
+ value_sz = sizeof (uint64_t);
+ break;
+ case DATA_TYPE_STRING:
+ if (data == NULL)
+ value_sz = 0;
+ else
+ value_sz = strlen(data) + 1;
+ break;
+ case DATA_TYPE_BOOLEAN_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (boolean_t);
+ break;
+ case DATA_TYPE_BYTE_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (uchar_t);
+ break;
+ case DATA_TYPE_INT8_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (int8_t);
+ break;
+ case DATA_TYPE_UINT8_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (uint8_t);
+ break;
+ case DATA_TYPE_INT16_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (int16_t);
+ break;
+ case DATA_TYPE_UINT16_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (uint16_t);
+ break;
+ case DATA_TYPE_INT32_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (int32_t);
+ break;
+ case DATA_TYPE_UINT32_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (uint32_t);
+ break;
+ case DATA_TYPE_INT64_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (int64_t);
+ break;
+ case DATA_TYPE_UINT64_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (uint64_t);
+ break;
+ case DATA_TYPE_STRING_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (uint64_t);
+
+ if (data != NULL) {
+ char *const *strs = data;
+ uint_t i;
+
+ /* no alignment requirement for strings */
+ for (i = 0; i < nelem; i++) {
+ if (strs[i] == NULL)
+ return (-1);
+ value_sz += strlen(strs[i]) + 1;
+ }
+ }
+ break;
+ case DATA_TYPE_HRTIME:
+ value_sz = sizeof (hrtime_t);
+ break;
+ case DATA_TYPE_NVLIST:
+ value_sz = NV_ALIGN(sizeof (nvlist_t));
+ break;
+ case DATA_TYPE_NVLIST_ARRAY:
+ value_sz = (uint64_t)nelem * sizeof (uint64_t) +
+ (uint64_t)nelem * NV_ALIGN(sizeof (nvlist_t));
+ break;
+ default:
+ return (-1);
+ }
+
+ return (value_sz > INT32_MAX ? -1 : (int)value_sz);
+}
+
+static int
+nvlist_copy_embedded(nvlist_t *nvl, nvlist_t *onvl, nvlist_t *emb_nvl)
+{
+ nvpriv_t *priv;
+ int err;
+
+ if ((priv = nv_priv_alloc_embedded((nvpriv_t *)(uintptr_t)
+ nvl->nvl_priv)) == NULL)
+ return (ENOMEM);
+
+ nvlist_init(emb_nvl, onvl->nvl_nvflag, priv);
+
+ if ((err = nvlist_copy_pairs(onvl, emb_nvl)) != 0) {
+ nvlist_free(emb_nvl);
+ emb_nvl->nvl_priv = 0;
+ }
+
+ return (err);
+}
+
+/*
+ * nvlist_add_common - Add new <name,value> pair to nvlist
+ */
+static int
+nvlist_add_common(nvlist_t *nvl, const char *name,
+ data_type_t type, uint_t nelem, const void *data)
+{
+ nvpair_t *nvp;
+ uint_t i;
+
+ int nvp_sz, name_sz, value_sz;
+ int err = 0;
+
+ if (name == NULL || nvl == NULL || nvl->nvl_priv == 0)
+ return (EINVAL);
+
+ if (nelem != 0 && data == NULL)
+ return (EINVAL);
+
+ /*
+ * Verify type and nelem and get the value size.
+ * In case of data types DATA_TYPE_STRING and DATA_TYPE_STRING_ARRAY
+ * is the size of the string(s) included.
+ */
+ if ((value_sz = i_get_value_size(type, data, nelem)) < 0)
+ return (EINVAL);
+
+ if (i_validate_nvpair_value(type, nelem, data) != 0)
+ return (EINVAL);
+
+ /*
+ * If we're adding an nvlist or nvlist array, ensure that we are not
+ * adding the input nvlist to itself, which would cause recursion,
+ * and ensure that no NULL nvlist pointers are present.
+ */
+ switch (type) {
+ case DATA_TYPE_NVLIST:
+ if (data == nvl || data == NULL)
+ return (EINVAL);
+ break;
+ case DATA_TYPE_NVLIST_ARRAY: {
+ nvlist_t **onvlp = (nvlist_t **)data;
+ for (i = 0; i < nelem; i++) {
+ if (onvlp[i] == nvl || onvlp[i] == NULL)
+ return (EINVAL);
+ }
+ break;
+ }
+ default:
+ break;
+ }
+
+ /* calculate sizes of the nvpair elements and the nvpair itself */
+ name_sz = strlen(name) + 1;
+
+ nvp_sz = NVP_SIZE_CALC(name_sz, value_sz);
+
+ if ((nvp = nvp_buf_alloc(nvl, nvp_sz)) == NULL)
+ return (ENOMEM);
+
+ ASSERT(nvp->nvp_size == nvp_sz);
+ nvp->nvp_name_sz = name_sz;
+ nvp->nvp_value_elem = nelem;
+ nvp->nvp_type = type;
+ bcopy(name, NVP_NAME(nvp), name_sz);
+
+ switch (type) {
+ case DATA_TYPE_BOOLEAN:
+ break;
+ case DATA_TYPE_STRING_ARRAY: {
+ char *const *strs = data;
+ char *buf = NVP_VALUE(nvp);
+ char **cstrs = (void *)buf;
+
+ /* skip pre-allocated space for pointer array */
+ buf += nelem * sizeof (uint64_t);
+ for (i = 0; i < nelem; i++) {
+ int slen = strlen(strs[i]) + 1;
+ bcopy(strs[i], buf, slen);
+ cstrs[i] = buf;
+ buf += slen;
+ }
+ break;
+ }
+ case DATA_TYPE_NVLIST: {
+ nvlist_t *nnvl = EMBEDDED_NVL(nvp);
+ nvlist_t *onvl = (nvlist_t *)data;
+
+ if ((err = nvlist_copy_embedded(nvl, onvl, nnvl)) != 0) {
+ nvp_buf_free(nvl, nvp);
+ return (err);
+ }
+ break;
+ }
+ case DATA_TYPE_NVLIST_ARRAY: {
+ nvlist_t **onvlp = (nvlist_t **)data;
+ nvlist_t **nvlp = EMBEDDED_NVL_ARRAY(nvp);
+ nvlist_t *embedded = (nvlist_t *)
+ ((uintptr_t)nvlp + nelem * sizeof (uint64_t));
+
+ for (i = 0; i < nelem; i++) {
+ if ((err = nvlist_copy_embedded(nvl,
+ onvlp[i], embedded)) != 0) {
+ /*
+ * Free any successfully created lists
+ */
+ nvpair_free(nvp);
+ nvp_buf_free(nvl, nvp);
+ return (err);
+ }
+
+ nvlp[i] = embedded++;
+ }
+ break;
+ }
+ default:
+ bcopy(data, NVP_VALUE(nvp), value_sz);
+ }
+
+ /* if unique name, remove before add */
+ if (nvl->nvl_nvflag & NV_UNIQUE_NAME)
+ (void) nvlist_remove_all(nvl, name);
+ else if (nvl->nvl_nvflag & NV_UNIQUE_NAME_TYPE)
+ (void) nvlist_remove(nvl, name, type);
+
+ nvp_buf_link(nvl, nvp);
+
+ return (0);
+}
+
+int
+nvlist_add_boolean(nvlist_t *nvl, const char *name)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_BOOLEAN, 0, NULL));
+}
+
+int
+nvlist_add_boolean_value(nvlist_t *nvl, const char *name, boolean_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_BOOLEAN_VALUE, 1, &val));
+}
+
+int
+nvlist_add_byte(nvlist_t *nvl, const char *name, uchar_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_BYTE, 1, &val));
+}
+
+int
+nvlist_add_int8(nvlist_t *nvl, const char *name, int8_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_INT8, 1, &val));
+}
+
+int
+nvlist_add_uint8(nvlist_t *nvl, const char *name, uint8_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_UINT8, 1, &val));
+}
+
+int
+nvlist_add_int16(nvlist_t *nvl, const char *name, int16_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_INT16, 1, &val));
+}
+
+int
+nvlist_add_uint16(nvlist_t *nvl, const char *name, uint16_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_UINT16, 1, &val));
+}
+
+int
+nvlist_add_int32(nvlist_t *nvl, const char *name, int32_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_INT32, 1, &val));
+}
+
+int
+nvlist_add_uint32(nvlist_t *nvl, const char *name, uint32_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_UINT32, 1, &val));
+}
+
+int
+nvlist_add_int64(nvlist_t *nvl, const char *name, int64_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_INT64, 1, &val));
+}
+
+int
+nvlist_add_uint64(nvlist_t *nvl, const char *name, uint64_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_UINT64, 1, &val));
+}
+
+int
+nvlist_add_string(nvlist_t *nvl, const char *name, const char *val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_STRING, 1, (void *)val));
+}
+
+int
+nvlist_add_boolean_array(nvlist_t *nvl, const char *name,
+ boolean_t *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_BOOLEAN_ARRAY, n, a));
+}
+
+int
+nvlist_add_byte_array(nvlist_t *nvl, const char *name, uchar_t *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_BYTE_ARRAY, n, a));
+}
+
+int
+nvlist_add_int8_array(nvlist_t *nvl, const char *name, int8_t *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_INT8_ARRAY, n, a));
+}
+
+int
+nvlist_add_uint8_array(nvlist_t *nvl, const char *name, uint8_t *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_UINT8_ARRAY, n, a));
+}
+
+int
+nvlist_add_int16_array(nvlist_t *nvl, const char *name, int16_t *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_INT16_ARRAY, n, a));
+}
+
+int
+nvlist_add_uint16_array(nvlist_t *nvl, const char *name, uint16_t *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_UINT16_ARRAY, n, a));
+}
+
+int
+nvlist_add_int32_array(nvlist_t *nvl, const char *name, int32_t *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_INT32_ARRAY, n, a));
+}
+
+int
+nvlist_add_uint32_array(nvlist_t *nvl, const char *name, uint32_t *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_UINT32_ARRAY, n, a));
+}
+
+int
+nvlist_add_int64_array(nvlist_t *nvl, const char *name, int64_t *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_INT64_ARRAY, n, a));
+}
+
+int
+nvlist_add_uint64_array(nvlist_t *nvl, const char *name, uint64_t *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_UINT64_ARRAY, n, a));
+}
+
+int
+nvlist_add_string_array(nvlist_t *nvl, const char *name,
+ char *const *a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_STRING_ARRAY, n, a));
+}
+
+int
+nvlist_add_hrtime(nvlist_t *nvl, const char *name, hrtime_t val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_HRTIME, 1, &val));
+}
+
+int
+nvlist_add_nvlist(nvlist_t *nvl, const char *name, nvlist_t *val)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_NVLIST, 1, val));
+}
+
+int
+nvlist_add_nvlist_array(nvlist_t *nvl, const char *name, nvlist_t **a, uint_t n)
+{
+ return (nvlist_add_common(nvl, name, DATA_TYPE_NVLIST_ARRAY, n, a));
+}
+
+/* reading name-value pairs */
+nvpair_t *
+nvlist_next_nvpair(nvlist_t *nvl, nvpair_t *nvp)
+{
+ nvpriv_t *priv;
+ i_nvp_t *curr;
+
+ if (nvl == NULL ||
+ (priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv) == NULL)
+ return (NULL);
+
+ curr = NVPAIR2I_NVP(nvp);
+
+ /*
+ * Ensure that nvp is an valid pointer.
+ */
+ if (nvp == NULL)
+ curr = priv->nvp_list;
+ else if (priv->nvp_curr == curr)
+ curr = curr->nvi_next;
+ else if (nvlist_contains_nvp(nvl, nvp) == 0)
+ curr = NULL;
+
+ priv->nvp_curr = curr;
+
+ return (curr != NULL ? &curr->nvi_nvp : NULL);
+}
+
+char *
+nvpair_name(nvpair_t *nvp)
+{
+ return (NVP_NAME(nvp));
+}
+
+data_type_t
+nvpair_type(nvpair_t *nvp)
+{
+ return (NVP_TYPE(nvp));
+}
+
+static int
+nvpair_value_common(nvpair_t *nvp, data_type_t type, uint_t *nelem, void *data)
+{
+ if (nvp == NULL || nvpair_type(nvp) != type)
+ return (EINVAL);
+
+ /*
+ * For non-array types, we copy the data.
+ * For array types (including string), we set a pointer.
+ */
+ switch (type) {
+ case DATA_TYPE_BOOLEAN:
+ if (nelem != NULL)
+ *nelem = 0;
+ break;
+
+ case DATA_TYPE_BOOLEAN_VALUE:
+ case DATA_TYPE_BYTE:
+ case DATA_TYPE_INT8:
+ case DATA_TYPE_UINT8:
+ case DATA_TYPE_INT16:
+ case DATA_TYPE_UINT16:
+ case DATA_TYPE_INT32:
+ case DATA_TYPE_UINT32:
+ case DATA_TYPE_INT64:
+ case DATA_TYPE_UINT64:
+ case DATA_TYPE_HRTIME:
+ if (data == NULL)
+ return (EINVAL);
+ bcopy(NVP_VALUE(nvp), data,
+ (size_t)i_get_value_size(type, NULL, 1));
+ if (nelem != NULL)
+ *nelem = 1;
+ break;
+
+ case DATA_TYPE_NVLIST:
+ case DATA_TYPE_STRING:
+ if (data == NULL)
+ return (EINVAL);
+ *(void **)data = (void *)NVP_VALUE(nvp);
+ if (nelem != NULL)
+ *nelem = 1;
+ break;
+
+ case DATA_TYPE_BOOLEAN_ARRAY:
+ case DATA_TYPE_BYTE_ARRAY:
+ case DATA_TYPE_INT8_ARRAY:
+ case DATA_TYPE_UINT8_ARRAY:
+ case DATA_TYPE_INT16_ARRAY:
+ case DATA_TYPE_UINT16_ARRAY:
+ case DATA_TYPE_INT32_ARRAY:
+ case DATA_TYPE_UINT32_ARRAY:
+ case DATA_TYPE_INT64_ARRAY:
+ case DATA_TYPE_UINT64_ARRAY:
+ case DATA_TYPE_STRING_ARRAY:
+ case DATA_TYPE_NVLIST_ARRAY:
+ if (nelem == NULL || data == NULL)
+ return (EINVAL);
+ if ((*nelem = NVP_NELEM(nvp)) != 0)
+ *(void **)data = (void *)NVP_VALUE(nvp);
+ else
+ *(void **)data = NULL;
+ break;
+
+ default:
+ return (ENOTSUP);
+ }
+
+ return (0);
+}
+
+static int
+nvlist_lookup_common(nvlist_t *nvl, const char *name, data_type_t type,
+ uint_t *nelem, void *data)
+{
+ nvpriv_t *priv;
+ nvpair_t *nvp;
+ i_nvp_t *curr;
+
+ if (name == NULL || nvl == NULL ||
+ (priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv) == NULL)
+ return (EINVAL);
+
+ if (!(nvl->nvl_nvflag & (NV_UNIQUE_NAME | NV_UNIQUE_NAME_TYPE)))
+ return (ENOTSUP);
+
+ for (curr = priv->nvp_list; curr != NULL; curr = curr->nvi_next) {
+ nvp = &curr->nvi_nvp;
+
+ if (strcmp(name, NVP_NAME(nvp)) == 0 && NVP_TYPE(nvp) == type)
+ return (nvpair_value_common(nvp, type, nelem, data));
+ }
+
+ return (ENOENT);
+}
+
+int
+nvlist_lookup_boolean(nvlist_t *nvl, const char *name)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_BOOLEAN, NULL, NULL));
+}
+
+int
+nvlist_lookup_boolean_value(nvlist_t *nvl, const char *name, boolean_t *val)
+{
+ return (nvlist_lookup_common(nvl, name,
+ DATA_TYPE_BOOLEAN_VALUE, NULL, val));
+}
+
+int
+nvlist_lookup_byte(nvlist_t *nvl, const char *name, uchar_t *val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_BYTE, NULL, val));
+}
+
+int
+nvlist_lookup_int8(nvlist_t *nvl, const char *name, int8_t *val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT8, NULL, val));
+}
+
+int
+nvlist_lookup_uint8(nvlist_t *nvl, const char *name, uint8_t *val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT8, NULL, val));
+}
+
+int
+nvlist_lookup_int16(nvlist_t *nvl, const char *name, int16_t *val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT16, NULL, val));
+}
+
+int
+nvlist_lookup_uint16(nvlist_t *nvl, const char *name, uint16_t *val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT16, NULL, val));
+}
+
+int
+nvlist_lookup_int32(nvlist_t *nvl, const char *name, int32_t *val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT32, NULL, val));
+}
+
+int
+nvlist_lookup_uint32(nvlist_t *nvl, const char *name, uint32_t *val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT32, NULL, val));
+}
+
+int
+nvlist_lookup_int64(nvlist_t *nvl, const char *name, int64_t *val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT64, NULL, val));
+}
+
+int
+nvlist_lookup_uint64(nvlist_t *nvl, const char *name, uint64_t *val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT64, NULL, val));
+}
+
+int
+nvlist_lookup_string(nvlist_t *nvl, const char *name, char **val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_STRING, NULL, val));
+}
+
+int
+nvlist_lookup_nvlist(nvlist_t *nvl, const char *name, nvlist_t **val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_NVLIST, NULL, val));
+}
+
+int
+nvlist_lookup_boolean_array(nvlist_t *nvl, const char *name,
+ boolean_t **a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name,
+ DATA_TYPE_BOOLEAN_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_byte_array(nvlist_t *nvl, const char *name,
+ uchar_t **a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_BYTE_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_int8_array(nvlist_t *nvl, const char *name, int8_t **a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT8_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_uint8_array(nvlist_t *nvl, const char *name,
+ uint8_t **a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT8_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_int16_array(nvlist_t *nvl, const char *name,
+ int16_t **a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT16_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_uint16_array(nvlist_t *nvl, const char *name,
+ uint16_t **a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT16_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_int32_array(nvlist_t *nvl, const char *name,
+ int32_t **a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT32_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_uint32_array(nvlist_t *nvl, const char *name,
+ uint32_t **a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT32_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_int64_array(nvlist_t *nvl, const char *name,
+ int64_t **a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_INT64_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_uint64_array(nvlist_t *nvl, const char *name,
+ uint64_t **a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_UINT64_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_string_array(nvlist_t *nvl, const char *name,
+ char ***a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_STRING_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_nvlist_array(nvlist_t *nvl, const char *name,
+ nvlist_t ***a, uint_t *n)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_NVLIST_ARRAY, n, a));
+}
+
+int
+nvlist_lookup_hrtime(nvlist_t *nvl, const char *name, hrtime_t *val)
+{
+ return (nvlist_lookup_common(nvl, name, DATA_TYPE_HRTIME, NULL, val));
+}
+
+int
+nvlist_lookup_pairs(nvlist_t *nvl, int flag, ...)
+{
+ va_list ap;
+ char *name;
+ int noentok = (flag & NV_FLAG_NOENTOK ? 1 : 0);
+ int ret = 0;
+
+ va_start(ap, flag);
+ while (ret == 0 && (name = va_arg(ap, char *)) != NULL) {
+ data_type_t type;
+ void *val;
+ uint_t *nelem;
+
+ switch (type = va_arg(ap, data_type_t)) {
+ case DATA_TYPE_BOOLEAN:
+ ret = nvlist_lookup_common(nvl, name, type, NULL, NULL);
+ break;
+
+ case DATA_TYPE_BOOLEAN_VALUE:
+ case DATA_TYPE_BYTE:
+ case DATA_TYPE_INT8:
+ case DATA_TYPE_UINT8:
+ case DATA_TYPE_INT16:
+ case DATA_TYPE_UINT16:
+ case DATA_TYPE_INT32:
+ case DATA_TYPE_UINT32:
+ case DATA_TYPE_INT64:
+ case DATA_TYPE_UINT64:
+ case DATA_TYPE_HRTIME:
+ case DATA_TYPE_STRING:
+ case DATA_TYPE_NVLIST:
+ val = va_arg(ap, void *);
+ ret = nvlist_lookup_common(nvl, name, type, NULL, val);
+ break;
+
+ case DATA_TYPE_BYTE_ARRAY:
+ case DATA_TYPE_BOOLEAN_ARRAY:
+ case DATA_TYPE_INT8_ARRAY:
+ case DATA_TYPE_UINT8_ARRAY:
+ case DATA_TYPE_INT16_ARRAY:
+ case DATA_TYPE_UINT16_ARRAY:
+ case DATA_TYPE_INT32_ARRAY:
+ case DATA_TYPE_UINT32_ARRAY:
+ case DATA_TYPE_INT64_ARRAY:
+ case DATA_TYPE_UINT64_ARRAY:
+ case DATA_TYPE_STRING_ARRAY:
+ case DATA_TYPE_NVLIST_ARRAY:
+ val = va_arg(ap, void *);
+ nelem = va_arg(ap, uint_t *);
+ ret = nvlist_lookup_common(nvl, name, type, nelem, val);
+ break;
+
+ default:
+ ret = EINVAL;
+ }
+
+ if (ret == ENOENT && noentok)
+ ret = 0;
+ }
+ va_end(ap);
+
+ return (ret);
+}
+
+int
+nvpair_value_boolean_value(nvpair_t *nvp, boolean_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_BOOLEAN_VALUE, NULL, val));
+}
+
+int
+nvpair_value_byte(nvpair_t *nvp, uchar_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_BYTE, NULL, val));
+}
+
+int
+nvpair_value_int8(nvpair_t *nvp, int8_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_INT8, NULL, val));
+}
+
+int
+nvpair_value_uint8(nvpair_t *nvp, uint8_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_UINT8, NULL, val));
+}
+
+int
+nvpair_value_int16(nvpair_t *nvp, int16_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_INT16, NULL, val));
+}
+
+int
+nvpair_value_uint16(nvpair_t *nvp, uint16_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_UINT16, NULL, val));
+}
+
+int
+nvpair_value_int32(nvpair_t *nvp, int32_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_INT32, NULL, val));
+}
+
+int
+nvpair_value_uint32(nvpair_t *nvp, uint32_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_UINT32, NULL, val));
+}
+
+int
+nvpair_value_int64(nvpair_t *nvp, int64_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_INT64, NULL, val));
+}
+
+int
+nvpair_value_uint64(nvpair_t *nvp, uint64_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_UINT64, NULL, val));
+}
+
+int
+nvpair_value_string(nvpair_t *nvp, char **val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_STRING, NULL, val));
+}
+
+int
+nvpair_value_nvlist(nvpair_t *nvp, nvlist_t **val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_NVLIST, NULL, val));
+}
+
+int
+nvpair_value_boolean_array(nvpair_t *nvp, boolean_t **val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_BOOLEAN_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_byte_array(nvpair_t *nvp, uchar_t **val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_BYTE_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_int8_array(nvpair_t *nvp, int8_t **val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_INT8_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_uint8_array(nvpair_t *nvp, uint8_t **val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_UINT8_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_int16_array(nvpair_t *nvp, int16_t **val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_INT16_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_uint16_array(nvpair_t *nvp, uint16_t **val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_UINT16_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_int32_array(nvpair_t *nvp, int32_t **val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_INT32_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_uint32_array(nvpair_t *nvp, uint32_t **val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_UINT32_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_int64_array(nvpair_t *nvp, int64_t **val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_INT64_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_uint64_array(nvpair_t *nvp, uint64_t **val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_UINT64_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_string_array(nvpair_t *nvp, char ***val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_STRING_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_nvlist_array(nvpair_t *nvp, nvlist_t ***val, uint_t *nelem)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_NVLIST_ARRAY, nelem, val));
+}
+
+int
+nvpair_value_hrtime(nvpair_t *nvp, hrtime_t *val)
+{
+ return (nvpair_value_common(nvp, DATA_TYPE_HRTIME, NULL, val));
+}
+
+/*
+ * Add specified pair to the list.
+ */
+int
+nvlist_add_nvpair(nvlist_t *nvl, nvpair_t *nvp)
+{
+ if (nvl == NULL || nvp == NULL)
+ return (EINVAL);
+
+ return (nvlist_add_common(nvl, NVP_NAME(nvp), NVP_TYPE(nvp),
+ NVP_NELEM(nvp), NVP_VALUE(nvp)));
+}
+
+/*
+ * Merge the supplied nvlists and put the result in dst.
+ * The merged list will contain all names specified in both lists,
+ * the values are taken from nvl in the case of duplicates.
+ * Return 0 on success.
+ */
+/*ARGSUSED*/
+int
+nvlist_merge(nvlist_t *dst, nvlist_t *nvl, int flag)
+{
+ if (nvl == NULL || dst == NULL)
+ return (EINVAL);
+
+ if (dst != nvl)
+ return (nvlist_copy_pairs(nvl, dst));
+
+ return (0);
+}
+
+/*
+ * Encoding related routines
+ */
+#define NVS_OP_ENCODE 0
+#define NVS_OP_DECODE 1
+#define NVS_OP_GETSIZE 2
+
+typedef struct nvs_ops nvs_ops_t;
+
+typedef struct {
+ int nvs_op;
+ const nvs_ops_t *nvs_ops;
+ void *nvs_private;
+ nvpriv_t *nvs_priv;
+} nvstream_t;
+
+/*
+ * nvs operations are:
+ * - nvs_nvlist
+ * encoding / decoding of a nvlist header (nvlist_t)
+ * calculates the size used for header and end detection
+ *
+ * - nvs_nvpair
+ * responsible for the first part of encoding / decoding of an nvpair
+ * calculates the decoded size of an nvpair
+ *
+ * - nvs_nvp_op
+ * second part of encoding / decoding of an nvpair
+ *
+ * - nvs_nvp_size
+ * calculates the encoding size of an nvpair
+ *
+ * - nvs_nvl_fini
+ * encodes the end detection mark (zeros).
+ */
+struct nvs_ops {
+ int (*nvs_nvlist)(nvstream_t *, nvlist_t *, size_t *);
+ int (*nvs_nvpair)(nvstream_t *, nvpair_t *, size_t *);
+ int (*nvs_nvp_op)(nvstream_t *, nvpair_t *);
+ int (*nvs_nvp_size)(nvstream_t *, nvpair_t *, size_t *);
+ int (*nvs_nvl_fini)(nvstream_t *);
+};
+
+typedef struct {
+ char nvh_encoding; /* nvs encoding method */
+ char nvh_endian; /* nvs endian */
+ char nvh_reserved1; /* reserved for future use */
+ char nvh_reserved2; /* reserved for future use */
+} nvs_header_t;
+
+static int
+nvs_encode_pairs(nvstream_t *nvs, nvlist_t *nvl)
+{
+ nvpriv_t *priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv;
+ i_nvp_t *curr;
+
+ /*
+ * Walk nvpair in list and encode each nvpair
+ */
+ for (curr = priv->nvp_list; curr != NULL; curr = curr->nvi_next)
+ if (nvs->nvs_ops->nvs_nvpair(nvs, &curr->nvi_nvp, NULL) != 0)
+ return (EFAULT);
+
+ return (nvs->nvs_ops->nvs_nvl_fini(nvs));
+}
+
+static int
+nvs_decode_pairs(nvstream_t *nvs, nvlist_t *nvl)
+{
+ nvpair_t *nvp;
+ size_t nvsize;
+ int err;
+
+ /*
+ * Get decoded size of next pair in stream, alloc
+ * memory for nvpair_t, then decode the nvpair
+ */
+ while ((err = nvs->nvs_ops->nvs_nvpair(nvs, NULL, &nvsize)) == 0) {
+ if (nvsize == 0) /* end of list */
+ break;
+
+ /* make sure len makes sense */
+ if (nvsize < NVP_SIZE_CALC(1, 0))
+ return (EFAULT);
+
+ if ((nvp = nvp_buf_alloc(nvl, nvsize)) == NULL)
+ return (ENOMEM);
+
+ if ((err = nvs->nvs_ops->nvs_nvp_op(nvs, nvp)) != 0) {
+ nvp_buf_free(nvl, nvp);
+ return (err);
+ }
+
+ if (i_validate_nvpair(nvp) != 0) {
+ nvpair_free(nvp);
+ nvp_buf_free(nvl, nvp);
+ return (EFAULT);
+ }
+
+ nvp_buf_link(nvl, nvp);
+ }
+ return (err);
+}
+
+static int
+nvs_getsize_pairs(nvstream_t *nvs, nvlist_t *nvl, size_t *buflen)
+{
+ nvpriv_t *priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv;
+ i_nvp_t *curr;
+ uint64_t nvsize = *buflen;
+ size_t size;
+
+ /*
+ * Get encoded size of nvpairs in nvlist
+ */
+ for (curr = priv->nvp_list; curr != NULL; curr = curr->nvi_next) {
+ if (nvs->nvs_ops->nvs_nvp_size(nvs, &curr->nvi_nvp, &size) != 0)
+ return (EINVAL);
+
+ if ((nvsize += size) > INT32_MAX)
+ return (EINVAL);
+ }
+
+ *buflen = nvsize;
+ return (0);
+}
+
+static int
+nvs_operation(nvstream_t *nvs, nvlist_t *nvl, size_t *buflen)
+{
+ int err;
+
+ if (nvl->nvl_priv == 0)
+ return (EFAULT);
+
+ /*
+ * Perform the operation, starting with header, then each nvpair
+ */
+ if ((err = nvs->nvs_ops->nvs_nvlist(nvs, nvl, buflen)) != 0)
+ return (err);
+
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ err = nvs_encode_pairs(nvs, nvl);
+ break;
+
+ case NVS_OP_DECODE:
+ err = nvs_decode_pairs(nvs, nvl);
+ break;
+
+ case NVS_OP_GETSIZE:
+ err = nvs_getsize_pairs(nvs, nvl, buflen);
+ break;
+
+ default:
+ err = EINVAL;
+ }
+
+ return (err);
+}
+
+static int
+nvs_embedded(nvstream_t *nvs, nvlist_t *embedded)
+{
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ return (nvs_operation(nvs, embedded, NULL));
+
+ case NVS_OP_DECODE: {
+ nvpriv_t *priv;
+ int err;
+
+ if (embedded->nvl_version != NV_VERSION)
+ return (ENOTSUP);
+
+ if ((priv = nv_priv_alloc_embedded(nvs->nvs_priv)) == NULL)
+ return (ENOMEM);
+
+ nvlist_init(embedded, embedded->nvl_nvflag, priv);
+
+ if ((err = nvs_operation(nvs, embedded, NULL)) != 0)
+ nvlist_free(embedded);
+ return (err);
+ }
+ default:
+ break;
+ }
+
+ return (EINVAL);
+}
+
+static int
+nvs_embedded_nvl_array(nvstream_t *nvs, nvpair_t *nvp, size_t *size)
+{
+ size_t nelem = NVP_NELEM(nvp);
+ nvlist_t **nvlp = EMBEDDED_NVL_ARRAY(nvp);
+ int i;
+
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ for (i = 0; i < nelem; i++)
+ if (nvs_embedded(nvs, nvlp[i]) != 0)
+ return (EFAULT);
+ break;
+
+ case NVS_OP_DECODE: {
+ size_t len = nelem * sizeof (uint64_t);
+ nvlist_t *embedded = (nvlist_t *)((uintptr_t)nvlp + len);
+
+ bzero(nvlp, len); /* don't trust packed data */
+ for (i = 0; i < nelem; i++) {
+ if (nvs_embedded(nvs, embedded) != 0) {
+ nvpair_free(nvp);
+ return (EFAULT);
+ }
+
+ nvlp[i] = embedded++;
+ }
+ break;
+ }
+ case NVS_OP_GETSIZE: {
+ uint64_t nvsize = 0;
+
+ for (i = 0; i < nelem; i++) {
+ size_t nvp_sz = 0;
+
+ if (nvs_operation(nvs, nvlp[i], &nvp_sz) != 0)
+ return (EINVAL);
+
+ if ((nvsize += nvp_sz) > INT32_MAX)
+ return (EINVAL);
+ }
+
+ *size = nvsize;
+ break;
+ }
+ default:
+ return (EINVAL);
+ }
+
+ return (0);
+}
+
+static int nvs_native(nvstream_t *, nvlist_t *, char *, size_t *);
+static int nvs_xdr(nvstream_t *, nvlist_t *, char *, size_t *);
+
+/*
+ * Common routine for nvlist operations:
+ * encode, decode, getsize (encoded size).
+ */
+static int
+nvlist_common(nvlist_t *nvl, char *buf, size_t *buflen, int encoding,
+ int nvs_op)
+{
+ int err = 0;
+ nvstream_t nvs;
+ int nvl_endian;
+#ifdef _LITTLE_ENDIAN
+ int host_endian = 1;
+#else
+ int host_endian = 0;
+#endif /* _LITTLE_ENDIAN */
+ nvs_header_t *nvh = (void *)buf;
+
+ if (buflen == NULL || nvl == NULL ||
+ (nvs.nvs_priv = (nvpriv_t *)(uintptr_t)nvl->nvl_priv) == NULL)
+ return (EINVAL);
+
+ nvs.nvs_op = nvs_op;
+
+ /*
+ * For NVS_OP_ENCODE and NVS_OP_DECODE make sure an nvlist and
+ * a buffer is allocated. The first 4 bytes in the buffer are
+ * used for encoding method and host endian.
+ */
+ switch (nvs_op) {
+ case NVS_OP_ENCODE:
+ if (buf == NULL || *buflen < sizeof (nvs_header_t))
+ return (EINVAL);
+
+ nvh->nvh_encoding = encoding;
+ nvh->nvh_endian = nvl_endian = host_endian;
+ nvh->nvh_reserved1 = 0;
+ nvh->nvh_reserved2 = 0;
+ break;
+
+ case NVS_OP_DECODE:
+ if (buf == NULL || *buflen < sizeof (nvs_header_t))
+ return (EINVAL);
+
+ /* get method of encoding from first byte */
+ encoding = nvh->nvh_encoding;
+ nvl_endian = nvh->nvh_endian;
+ break;
+
+ case NVS_OP_GETSIZE:
+ nvl_endian = host_endian;
+
+ /*
+ * add the size for encoding
+ */
+ *buflen = sizeof (nvs_header_t);
+ break;
+
+ default:
+ return (ENOTSUP);
+ }
+
+ /*
+ * Create an nvstream with proper encoding method
+ */
+ switch (encoding) {
+ case NV_ENCODE_NATIVE:
+ /*
+ * check endianness, in case we are unpacking
+ * from a file
+ */
+ if (nvl_endian != host_endian)
+ return (ENOTSUP);
+ err = nvs_native(&nvs, nvl, buf, buflen);
+ break;
+ case NV_ENCODE_XDR:
+ err = nvs_xdr(&nvs, nvl, buf, buflen);
+ break;
+ default:
+ err = ENOTSUP;
+ break;
+ }
+
+ return (err);
+}
+
+int
+nvlist_size(nvlist_t *nvl, size_t *size, int encoding)
+{
+ return (nvlist_common(nvl, NULL, size, encoding, NVS_OP_GETSIZE));
+}
+
+/*
+ * Pack nvlist into contiguous memory
+ */
+/*ARGSUSED1*/
+int
+nvlist_pack(nvlist_t *nvl, char **bufp, size_t *buflen, int encoding,
+ int kmflag)
+{
+#if defined(_KERNEL) && !defined(_BOOT)
+ return (nvlist_xpack(nvl, bufp, buflen, encoding,
+ (kmflag == KM_SLEEP ? nv_alloc_sleep : nv_alloc_nosleep)));
+#else
+ return (nvlist_xpack(nvl, bufp, buflen, encoding, nv_alloc_nosleep));
+#endif
+}
+
+int
+nvlist_xpack(nvlist_t *nvl, char **bufp, size_t *buflen, int encoding,
+ nv_alloc_t *nva)
+{
+ nvpriv_t nvpriv;
+ size_t alloc_size;
+ char *buf;
+ int err;
+
+ if (nva == NULL || nvl == NULL || bufp == NULL || buflen == NULL)
+ return (EINVAL);
+
+ if (*bufp != NULL)
+ return (nvlist_common(nvl, *bufp, buflen, encoding,
+ NVS_OP_ENCODE));
+
+ /*
+ * Here is a difficult situation:
+ * 1. The nvlist has fixed allocator properties.
+ * All other nvlist routines (like nvlist_add_*, ...) use
+ * these properties.
+ * 2. When using nvlist_pack() the user can specify his own
+ * allocator properties (e.g. by using KM_NOSLEEP).
+ *
+ * We use the user specified properties (2). A clearer solution
+ * will be to remove the kmflag from nvlist_pack(), but we will
+ * not change the interface.
+ */
+ nv_priv_init(&nvpriv, nva, 0);
+
+ if (err = nvlist_size(nvl, &alloc_size, encoding))
+ return (err);
+
+ if ((buf = nv_mem_zalloc(&nvpriv, alloc_size)) == NULL)
+ return (ENOMEM);
+
+ if ((err = nvlist_common(nvl, buf, &alloc_size, encoding,
+ NVS_OP_ENCODE)) != 0) {
+ nv_mem_free(&nvpriv, buf, alloc_size);
+ } else {
+ *buflen = alloc_size;
+ *bufp = buf;
+ }
+
+ return (err);
+}
+
+/*
+ * Unpack buf into an nvlist_t
+ */
+/*ARGSUSED1*/
+int
+nvlist_unpack(char *buf, size_t buflen, nvlist_t **nvlp, int kmflag)
+{
+#if defined(_KERNEL) && !defined(_BOOT)
+ return (nvlist_xunpack(buf, buflen, nvlp,
+ (kmflag == KM_SLEEP ? nv_alloc_sleep : nv_alloc_nosleep)));
+#else
+ return (nvlist_xunpack(buf, buflen, nvlp, nv_alloc_nosleep));
+#endif
+}
+
+int
+nvlist_xunpack(char *buf, size_t buflen, nvlist_t **nvlp, nv_alloc_t *nva)
+{
+ nvlist_t *nvl;
+ int err;
+
+ if (nvlp == NULL)
+ return (EINVAL);
+
+ if ((err = nvlist_xalloc(&nvl, 0, nva)) != 0)
+ return (err);
+
+ if ((err = nvlist_common(nvl, buf, &buflen, 0, NVS_OP_DECODE)) != 0)
+ nvlist_free(nvl);
+ else
+ *nvlp = nvl;
+
+ return (err);
+}
+
+/*
+ * Native encoding functions
+ */
+typedef struct {
+ /*
+ * This structure is used when decoding a packed nvpair in
+ * the native format. n_base points to a buffer containing the
+ * packed nvpair. n_end is a pointer to the end of the buffer.
+ * (n_end actually points to the first byte past the end of the
+ * buffer.) n_curr is a pointer that lies between n_base and n_end.
+ * It points to the current data that we are decoding.
+ * The amount of data left in the buffer is equal to n_end - n_curr.
+ * n_flag is used to recognize a packed embedded list.
+ */
+ caddr_t n_base;
+ caddr_t n_end;
+ caddr_t n_curr;
+ uint_t n_flag;
+} nvs_native_t;
+
+static int
+nvs_native_create(nvstream_t *nvs, nvs_native_t *native, char *buf,
+ size_t buflen)
+{
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ case NVS_OP_DECODE:
+ nvs->nvs_private = native;
+ native->n_curr = native->n_base = buf;
+ native->n_end = buf + buflen;
+ native->n_flag = 0;
+ return (0);
+
+ case NVS_OP_GETSIZE:
+ nvs->nvs_private = native;
+ native->n_curr = native->n_base = native->n_end = NULL;
+ native->n_flag = 0;
+ return (0);
+ default:
+ return (EINVAL);
+ }
+}
+
+/*ARGSUSED*/
+static void
+nvs_native_destroy(nvstream_t *nvs)
+{
+}
+
+static int
+native_cp(nvstream_t *nvs, void *buf, size_t size)
+{
+ nvs_native_t *native = (nvs_native_t *)nvs->nvs_private;
+
+ if (native->n_curr + size > native->n_end)
+ return (EFAULT);
+
+ /*
+ * The bcopy() below eliminates alignment requirement
+ * on the buffer (stream) and is preferred over direct access.
+ */
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ bcopy(buf, native->n_curr, size);
+ break;
+ case NVS_OP_DECODE:
+ bcopy(native->n_curr, buf, size);
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ native->n_curr += size;
+ return (0);
+}
+
+/*
+ * operate on nvlist_t header
+ */
+static int
+nvs_native_nvlist(nvstream_t *nvs, nvlist_t *nvl, size_t *size)
+{
+ nvs_native_t *native = nvs->nvs_private;
+
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ case NVS_OP_DECODE:
+ if (native->n_flag)
+ return (0); /* packed embedded list */
+
+ native->n_flag = 1;
+
+ /* copy version and nvflag of the nvlist_t */
+ if (native_cp(nvs, &nvl->nvl_version, sizeof (int32_t)) != 0 ||
+ native_cp(nvs, &nvl->nvl_nvflag, sizeof (int32_t)) != 0)
+ return (EFAULT);
+
+ return (0);
+
+ case NVS_OP_GETSIZE:
+ /*
+ * if calculate for packed embedded list
+ * 4 for end of the embedded list
+ * else
+ * 2 * sizeof (int32_t) for nvl_version and nvl_nvflag
+ * and 4 for end of the entire list
+ */
+ if (native->n_flag) {
+ *size += 4;
+ } else {
+ native->n_flag = 1;
+ *size += 2 * sizeof (int32_t) + 4;
+ }
+
+ return (0);
+
+ default:
+ return (EINVAL);
+ }
+}
+
+static int
+nvs_native_nvl_fini(nvstream_t *nvs)
+{
+ if (nvs->nvs_op == NVS_OP_ENCODE) {
+ nvs_native_t *native = (nvs_native_t *)nvs->nvs_private;
+ /*
+ * Add 4 zero bytes at end of nvlist. They are used
+ * for end detection by the decode routine.
+ */
+ if (native->n_curr + sizeof (int) > native->n_end)
+ return (EFAULT);
+
+ bzero(native->n_curr, sizeof (int));
+ native->n_curr += sizeof (int);
+ }
+
+ return (0);
+}
+
+static int
+nvpair_native_embedded(nvstream_t *nvs, nvpair_t *nvp)
+{
+ if (nvs->nvs_op == NVS_OP_ENCODE) {
+ nvs_native_t *native = (nvs_native_t *)nvs->nvs_private;
+ nvlist_t *packed = (void *)
+ (native->n_curr - nvp->nvp_size + NVP_VALOFF(nvp));
+ /*
+ * Null out the pointer that is meaningless in the packed
+ * structure. The address may not be aligned, so we have
+ * to use bzero.
+ */
+ bzero(&packed->nvl_priv, sizeof (packed->nvl_priv));
+ }
+
+ return (nvs_embedded(nvs, EMBEDDED_NVL(nvp)));
+}
+
+static int
+nvpair_native_embedded_array(nvstream_t *nvs, nvpair_t *nvp)
+{
+ if (nvs->nvs_op == NVS_OP_ENCODE) {
+ nvs_native_t *native = (nvs_native_t *)nvs->nvs_private;
+ char *value = native->n_curr - nvp->nvp_size + NVP_VALOFF(nvp);
+ size_t len = NVP_NELEM(nvp) * sizeof (uint64_t);
+ nvlist_t *packed = (nvlist_t *)((uintptr_t)value + len);
+ int i;
+ /*
+ * Null out pointers that are meaningless in the packed
+ * structure. The addresses may not be aligned, so we have
+ * to use bzero.
+ */
+ bzero(value, len);
+
+ for (i = 0; i < NVP_NELEM(nvp); i++, packed++)
+ /*
+ * Null out the pointer that is meaningless in the
+ * packed structure. The address may not be aligned,
+ * so we have to use bzero.
+ */
+ bzero(&packed->nvl_priv, sizeof (packed->nvl_priv));
+ }
+
+ return (nvs_embedded_nvl_array(nvs, nvp, NULL));
+}
+
+static void
+nvpair_native_string_array(nvstream_t *nvs, nvpair_t *nvp)
+{
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE: {
+ nvs_native_t *native = (nvs_native_t *)nvs->nvs_private;
+ uint64_t *strp = (void *)
+ (native->n_curr - nvp->nvp_size + NVP_VALOFF(nvp));
+ /*
+ * Null out pointers that are meaningless in the packed
+ * structure. The addresses may not be aligned, so we have
+ * to use bzero.
+ */
+ bzero(strp, NVP_NELEM(nvp) * sizeof (uint64_t));
+ break;
+ }
+ case NVS_OP_DECODE: {
+ char **strp = (void *)NVP_VALUE(nvp);
+ char *buf = ((char *)strp + NVP_NELEM(nvp) * sizeof (uint64_t));
+ int i;
+
+ for (i = 0; i < NVP_NELEM(nvp); i++) {
+ strp[i] = buf;
+ buf += strlen(buf) + 1;
+ }
+ break;
+ }
+ }
+}
+
+static int
+nvs_native_nvp_op(nvstream_t *nvs, nvpair_t *nvp)
+{
+ data_type_t type;
+ int value_sz;
+ int ret = 0;
+
+ /*
+ * We do the initial bcopy of the data before we look at
+ * the nvpair type, because when we're decoding, we won't
+ * have the correct values for the pair until we do the bcopy.
+ */
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ case NVS_OP_DECODE:
+ if (native_cp(nvs, nvp, nvp->nvp_size) != 0)
+ return (EFAULT);
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ /* verify nvp_name_sz, check the name string length */
+ if (i_validate_nvpair_name(nvp) != 0)
+ return (EFAULT);
+
+ type = NVP_TYPE(nvp);
+
+ /*
+ * Verify type and nelem and get the value size.
+ * In case of data types DATA_TYPE_STRING and DATA_TYPE_STRING_ARRAY
+ * is the size of the string(s) excluded.
+ */
+ if ((value_sz = i_get_value_size(type, NULL, NVP_NELEM(nvp))) < 0)
+ return (EFAULT);
+
+ if (NVP_SIZE_CALC(nvp->nvp_name_sz, value_sz) > nvp->nvp_size)
+ return (EFAULT);
+
+ switch (type) {
+ case DATA_TYPE_NVLIST:
+ ret = nvpair_native_embedded(nvs, nvp);
+ break;
+ case DATA_TYPE_NVLIST_ARRAY:
+ ret = nvpair_native_embedded_array(nvs, nvp);
+ break;
+ case DATA_TYPE_STRING_ARRAY:
+ nvpair_native_string_array(nvs, nvp);
+ break;
+ default:
+ break;
+ }
+
+ return (ret);
+}
+
+static int
+nvs_native_nvp_size(nvstream_t *nvs, nvpair_t *nvp, size_t *size)
+{
+ uint64_t nvp_sz = nvp->nvp_size;
+
+ switch (NVP_TYPE(nvp)) {
+ case DATA_TYPE_NVLIST: {
+ size_t nvsize = 0;
+
+ if (nvs_operation(nvs, EMBEDDED_NVL(nvp), &nvsize) != 0)
+ return (EINVAL);
+
+ nvp_sz += nvsize;
+ break;
+ }
+ case DATA_TYPE_NVLIST_ARRAY: {
+ size_t nvsize;
+
+ if (nvs_embedded_nvl_array(nvs, nvp, &nvsize) != 0)
+ return (EINVAL);
+
+ nvp_sz += nvsize;
+ break;
+ }
+ default:
+ break;
+ }
+
+ if (nvp_sz > INT32_MAX)
+ return (EINVAL);
+
+ *size = nvp_sz;
+
+ return (0);
+}
+
+static int
+nvs_native_nvpair(nvstream_t *nvs, nvpair_t *nvp, size_t *size)
+{
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ return (nvs_native_nvp_op(nvs, nvp));
+
+ case NVS_OP_DECODE: {
+ nvs_native_t *native = (nvs_native_t *)nvs->nvs_private;
+ int32_t decode_len;
+
+ /* try to read the size value from the stream */
+ if (native->n_curr + sizeof (int32_t) > native->n_end)
+ return (EFAULT);
+ bcopy(native->n_curr, &decode_len, sizeof (int32_t));
+
+ /* sanity check the size value */
+ if (decode_len < 0 ||
+ decode_len > native->n_end - native->n_curr)
+ return (EFAULT);
+
+ *size = decode_len;
+
+ /*
+ * If at the end of the stream then move the cursor
+ * forward, otherwise nvpair_native_op() will read
+ * the entire nvpair at the same cursor position.
+ */
+ if (*size == 0)
+ native->n_curr += sizeof (int32_t);
+ break;
+ }
+
+ default:
+ return (EINVAL);
+ }
+
+ return (0);
+}
+
+static const nvs_ops_t nvs_native_ops = {
+ nvs_native_nvlist,
+ nvs_native_nvpair,
+ nvs_native_nvp_op,
+ nvs_native_nvp_size,
+ nvs_native_nvl_fini
+};
+
+static int
+nvs_native(nvstream_t *nvs, nvlist_t *nvl, char *buf, size_t *buflen)
+{
+ nvs_native_t native;
+ int err;
+
+ nvs->nvs_ops = &nvs_native_ops;
+
+ if ((err = nvs_native_create(nvs, &native, buf + sizeof (nvs_header_t),
+ *buflen - sizeof (nvs_header_t))) != 0)
+ return (err);
+
+ err = nvs_operation(nvs, nvl, buflen);
+
+ nvs_native_destroy(nvs);
+
+ return (err);
+}
+
+/*
+ * XDR encoding functions
+ *
+ * An xdr packed nvlist is encoded as:
+ *
+ * - encoding methode and host endian (4 bytes)
+ * - nvl_version (4 bytes)
+ * - nvl_nvflag (4 bytes)
+ *
+ * - encoded nvpairs, the format of one xdr encoded nvpair is:
+ * - encoded size of the nvpair (4 bytes)
+ * - decoded size of the nvpair (4 bytes)
+ * - name string, (4 + sizeof(NV_ALIGN4(string))
+ * a string is coded as size (4 bytes) and data
+ * - data type (4 bytes)
+ * - number of elements in the nvpair (4 bytes)
+ * - data
+ *
+ * - 2 zero's for end of the entire list (8 bytes)
+ */
+static int
+nvs_xdr_create(nvstream_t *nvs, XDR *xdr, char *buf, size_t buflen)
+{
+ /* xdr data must be 4 byte aligned */
+ if ((ulong_t)buf % 4 != 0)
+ return (EFAULT);
+
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ xdrmem_create(xdr, buf, (uint_t)buflen, XDR_ENCODE);
+ nvs->nvs_private = xdr;
+ return (0);
+ case NVS_OP_DECODE:
+ xdrmem_create(xdr, buf, (uint_t)buflen, XDR_DECODE);
+ nvs->nvs_private = xdr;
+ return (0);
+ case NVS_OP_GETSIZE:
+ nvs->nvs_private = NULL;
+ return (0);
+ default:
+ return (EINVAL);
+ }
+}
+
+static void
+nvs_xdr_destroy(nvstream_t *nvs)
+{
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ case NVS_OP_DECODE:
+ xdr_destroy((XDR *)nvs->nvs_private);
+ break;
+ default:
+ break;
+ }
+}
+
+static int
+nvs_xdr_nvlist(nvstream_t *nvs, nvlist_t *nvl, size_t *size)
+{
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE:
+ case NVS_OP_DECODE: {
+ XDR *xdr = nvs->nvs_private;
+
+ if (!xdr_int(xdr, &nvl->nvl_version) ||
+ !xdr_u_int(xdr, &nvl->nvl_nvflag))
+ return (EFAULT);
+ break;
+ }
+ case NVS_OP_GETSIZE: {
+ /*
+ * 2 * 4 for nvl_version + nvl_nvflag
+ * and 8 for end of the entire list
+ */
+ *size += 2 * 4 + 8;
+ break;
+ }
+ default:
+ return (EINVAL);
+ }
+ return (0);
+}
+
+static int
+nvs_xdr_nvl_fini(nvstream_t *nvs)
+{
+ if (nvs->nvs_op == NVS_OP_ENCODE) {
+ XDR *xdr = nvs->nvs_private;
+ int zero = 0;
+
+ if (!xdr_int(xdr, &zero) || !xdr_int(xdr, &zero))
+ return (EFAULT);
+ }
+
+ return (0);
+}
+
+/*
+ * The format of xdr encoded nvpair is:
+ * encode_size, decode_size, name string, data type, nelem, data
+ */
+static int
+nvs_xdr_nvp_op(nvstream_t *nvs, nvpair_t *nvp)
+{
+ data_type_t type;
+ char *buf;
+ char *buf_end = (char *)nvp + nvp->nvp_size;
+ int value_sz;
+ uint_t nelem, buflen;
+ bool_t ret = FALSE;
+ XDR *xdr = nvs->nvs_private;
+
+ ASSERT(xdr != NULL && nvp != NULL);
+
+ /* name string */
+ if ((buf = NVP_NAME(nvp)) >= buf_end)
+ return (EFAULT);
+ buflen = buf_end - buf;
+
+ if (!xdr_string(xdr, &buf, buflen - 1))
+ return (EFAULT);
+ nvp->nvp_name_sz = strlen(buf) + 1;
+
+ /* type and nelem */
+ if (!xdr_int(xdr, (int *)&nvp->nvp_type) ||
+ !xdr_int(xdr, &nvp->nvp_value_elem))
+ return (EFAULT);
+
+ type = NVP_TYPE(nvp);
+ nelem = nvp->nvp_value_elem;
+
+ /*
+ * Verify type and nelem and get the value size.
+ * In case of data types DATA_TYPE_STRING and DATA_TYPE_STRING_ARRAY
+ * is the size of the string(s) excluded.
+ */
+ if ((value_sz = i_get_value_size(type, NULL, nelem)) < 0)
+ return (EFAULT);
+
+ /* if there is no data to extract then return */
+ if (nelem == 0)
+ return (0);
+
+ /* value */
+ if ((buf = NVP_VALUE(nvp)) >= buf_end)
+ return (EFAULT);
+ buflen = buf_end - buf;
+
+ if (buflen < value_sz)
+ return (EFAULT);
+
+ switch (type) {
+ case DATA_TYPE_NVLIST:
+ if (nvs_embedded(nvs, (void *)buf) == 0)
+ return (0);
+ break;
+
+ case DATA_TYPE_NVLIST_ARRAY:
+ if (nvs_embedded_nvl_array(nvs, nvp, NULL) == 0)
+ return (0);
+ break;
+
+ case DATA_TYPE_BOOLEAN:
+ ret = TRUE;
+ break;
+
+ case DATA_TYPE_BYTE:
+ case DATA_TYPE_INT8:
+ case DATA_TYPE_UINT8:
+ ret = xdr_char(xdr, buf);
+ break;
+
+ case DATA_TYPE_INT16:
+ ret = xdr_short(xdr, (void *)buf);
+ break;
+
+ case DATA_TYPE_UINT16:
+ ret = xdr_u_short(xdr, (void *)buf);
+ break;
+
+ case DATA_TYPE_BOOLEAN_VALUE:
+ case DATA_TYPE_INT32:
+ ret = xdr_int(xdr, (void *)buf);
+ break;
+
+ case DATA_TYPE_UINT32:
+ ret = xdr_u_int(xdr, (void *)buf);
+ break;
+
+ case DATA_TYPE_INT64:
+ ret = xdr_longlong_t(xdr, (void *)buf);
+ break;
+
+ case DATA_TYPE_UINT64:
+ ret = xdr_u_longlong_t(xdr, (void *)buf);
+ break;
+
+ case DATA_TYPE_HRTIME:
+ /*
+ * NOTE: must expose the definition of hrtime_t here
+ */
+ ret = xdr_longlong_t(xdr, (void *)buf);
+ break;
+
+ case DATA_TYPE_STRING:
+ ret = xdr_string(xdr, &buf, buflen - 1);
+ break;
+
+ case DATA_TYPE_BYTE_ARRAY:
+ ret = xdr_opaque(xdr, buf, nelem);
+ break;
+
+ case DATA_TYPE_INT8_ARRAY:
+ case DATA_TYPE_UINT8_ARRAY:
+ ret = xdr_array(xdr, &buf, &nelem, buflen, sizeof (int8_t),
+ (xdrproc_t)xdr_char);
+ break;
+
+ case DATA_TYPE_INT16_ARRAY:
+ ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (int16_t),
+ sizeof (int16_t), (xdrproc_t)xdr_short);
+ break;
+
+ case DATA_TYPE_UINT16_ARRAY:
+ ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (uint16_t),
+ sizeof (uint16_t), (xdrproc_t)xdr_u_short);
+ break;
+
+ case DATA_TYPE_BOOLEAN_ARRAY:
+ case DATA_TYPE_INT32_ARRAY:
+ ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (int32_t),
+ sizeof (int32_t), (xdrproc_t)xdr_int);
+ break;
+
+ case DATA_TYPE_UINT32_ARRAY:
+ ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (uint32_t),
+ sizeof (uint32_t), (xdrproc_t)xdr_u_int);
+ break;
+
+ case DATA_TYPE_INT64_ARRAY:
+ ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (int64_t),
+ sizeof (int64_t), (xdrproc_t)xdr_longlong_t);
+ break;
+
+ case DATA_TYPE_UINT64_ARRAY:
+ ret = xdr_array(xdr, &buf, &nelem, buflen / sizeof (uint64_t),
+ sizeof (uint64_t), (xdrproc_t)xdr_u_longlong_t);
+ break;
+
+ case DATA_TYPE_STRING_ARRAY: {
+ size_t len = nelem * sizeof (uint64_t);
+ char **strp = (void *)buf;
+ int i;
+
+ if (nvs->nvs_op == NVS_OP_DECODE)
+ bzero(buf, len); /* don't trust packed data */
+
+ for (i = 0; i < nelem; i++) {
+ if (buflen <= len)
+ return (EFAULT);
+
+ buf += len;
+ buflen -= len;
+
+ if (xdr_string(xdr, &buf, buflen - 1) != TRUE)
+ return (EFAULT);
+
+ if (nvs->nvs_op == NVS_OP_DECODE)
+ strp[i] = buf;
+ len = strlen(buf) + 1;
+ }
+ ret = TRUE;
+ break;
+ }
+ default:
+ break;
+ }
+
+ return (ret == TRUE ? 0 : EFAULT);
+}
+
+static int
+nvs_xdr_nvp_size(nvstream_t *nvs, nvpair_t *nvp, size_t *size)
+{
+ data_type_t type = NVP_TYPE(nvp);
+ /*
+ * encode_size + decode_size + name string size + data type + nelem
+ * where name string size = 4 + NV_ALIGN4(strlen(NVP_NAME(nvp)))
+ */
+ uint64_t nvp_sz = 4 + 4 + 4 + NV_ALIGN4(strlen(NVP_NAME(nvp))) + 4 + 4;
+
+ switch (type) {
+ case DATA_TYPE_BOOLEAN:
+ break;
+
+ case DATA_TYPE_BOOLEAN_VALUE:
+ case DATA_TYPE_BYTE:
+ case DATA_TYPE_INT8:
+ case DATA_TYPE_UINT8:
+ case DATA_TYPE_INT16:
+ case DATA_TYPE_UINT16:
+ case DATA_TYPE_INT32:
+ case DATA_TYPE_UINT32:
+ nvp_sz += 4; /* 4 is the minimum xdr unit */
+ break;
+
+ case DATA_TYPE_INT64:
+ case DATA_TYPE_UINT64:
+ case DATA_TYPE_HRTIME:
+ nvp_sz += 8;
+ break;
+
+ case DATA_TYPE_STRING:
+ nvp_sz += 4 + NV_ALIGN4(strlen((char *)NVP_VALUE(nvp)));
+ break;
+
+ case DATA_TYPE_BYTE_ARRAY:
+ nvp_sz += NV_ALIGN4(NVP_NELEM(nvp));
+ break;
+
+ case DATA_TYPE_BOOLEAN_ARRAY:
+ case DATA_TYPE_INT8_ARRAY:
+ case DATA_TYPE_UINT8_ARRAY:
+ case DATA_TYPE_INT16_ARRAY:
+ case DATA_TYPE_UINT16_ARRAY:
+ case DATA_TYPE_INT32_ARRAY:
+ case DATA_TYPE_UINT32_ARRAY:
+ nvp_sz += 4 + 4 * (uint64_t)NVP_NELEM(nvp);
+ break;
+
+ case DATA_TYPE_INT64_ARRAY:
+ case DATA_TYPE_UINT64_ARRAY:
+ nvp_sz += 4 + 8 * (uint64_t)NVP_NELEM(nvp);
+ break;
+
+ case DATA_TYPE_STRING_ARRAY: {
+ int i;
+ char **strs = (void *)NVP_VALUE(nvp);
+
+ for (i = 0; i < NVP_NELEM(nvp); i++)
+ nvp_sz += 4 + NV_ALIGN4(strlen(strs[i]));
+
+ break;
+ }
+
+ case DATA_TYPE_NVLIST:
+ case DATA_TYPE_NVLIST_ARRAY: {
+ size_t nvsize = 0;
+ int old_nvs_op = nvs->nvs_op;
+ int err;
+
+ nvs->nvs_op = NVS_OP_GETSIZE;
+ if (type == DATA_TYPE_NVLIST)
+ err = nvs_operation(nvs, EMBEDDED_NVL(nvp), &nvsize);
+ else
+ err = nvs_embedded_nvl_array(nvs, nvp, &nvsize);
+ nvs->nvs_op = old_nvs_op;
+
+ if (err != 0)
+ return (EINVAL);
+
+ nvp_sz += nvsize;
+ break;
+ }
+
+ default:
+ return (EINVAL);
+ }
+
+ if (nvp_sz > INT32_MAX)
+ return (EINVAL);
+
+ *size = nvp_sz;
+
+ return (0);
+}
+
+
+/*
+ * The NVS_XDR_MAX_LEN macro takes a packed xdr buffer of size x and estimates
+ * the largest nvpair that could be encoded in the buffer.
+ *
+ * See comments above nvpair_xdr_op() for the format of xdr encoding.
+ * The size of a xdr packed nvpair without any data is 5 words.
+ *
+ * Using the size of the data directly as an estimate would be ok
+ * in all cases except one. If the data type is of DATA_TYPE_STRING_ARRAY
+ * then the actual nvpair has space for an array of pointers to index
+ * the strings. These pointers are not encoded into the packed xdr buffer.
+ *
+ * If the data is of type DATA_TYPE_STRING_ARRAY and all the strings are
+ * of length 0, then each string is endcoded in xdr format as a single word.
+ * Therefore when expanded to an nvpair there will be 2.25 word used for
+ * each string. (a int64_t allocated for pointer usage, and a single char
+ * for the null termination.)
+ *
+ * This is the calculation performed by the NVS_XDR_MAX_LEN macro.
+ */
+#define NVS_XDR_HDR_LEN ((size_t)(5 * 4))
+#define NVS_XDR_DATA_LEN(y) (((size_t)(y) <= NVS_XDR_HDR_LEN) ? \
+ 0 : ((size_t)(y) - NVS_XDR_HDR_LEN))
+#define NVS_XDR_MAX_LEN(x) (NVP_SIZE_CALC(1, 0) + \
+ (NVS_XDR_DATA_LEN(x) * 2) + \
+ NV_ALIGN4((NVS_XDR_DATA_LEN(x) / 4)))
+
+static int
+nvs_xdr_nvpair(nvstream_t *nvs, nvpair_t *nvp, size_t *size)
+{
+ XDR *xdr = nvs->nvs_private;
+ int32_t encode_len, decode_len;
+
+ switch (nvs->nvs_op) {
+ case NVS_OP_ENCODE: {
+ size_t nvsize;
+
+ if (nvs_xdr_nvp_size(nvs, nvp, &nvsize) != 0)
+ return (EFAULT);
+
+ decode_len = nvp->nvp_size;
+ encode_len = nvsize;
+ if (!xdr_int(xdr, &encode_len) || !xdr_int(xdr, &decode_len))
+ return (EFAULT);
+
+ return (nvs_xdr_nvp_op(nvs, nvp));
+ }
+ case NVS_OP_DECODE: {
+ struct xdr_bytesrec bytesrec;
+
+ /* get the encode and decode size */
+ if (!xdr_int(xdr, &encode_len) || !xdr_int(xdr, &decode_len))
+ return (EFAULT);
+ *size = decode_len;
+
+ /* are we at the end of the stream? */
+ if (*size == 0)
+ return (0);
+
+ /* sanity check the size parameter */
+ if (!xdr_control(xdr, XDR_GET_BYTES_AVAIL, &bytesrec))
+ return (EFAULT);
+
+ if (*size > NVS_XDR_MAX_LEN(bytesrec.xc_num_avail))
+ return (EFAULT);
+ break;
+ }
+
+ default:
+ return (EINVAL);
+ }
+ return (0);
+}
+
+static const struct nvs_ops nvs_xdr_ops = {
+ nvs_xdr_nvlist,
+ nvs_xdr_nvpair,
+ nvs_xdr_nvp_op,
+ nvs_xdr_nvp_size,
+ nvs_xdr_nvl_fini
+};
+
+static int
+nvs_xdr(nvstream_t *nvs, nvlist_t *nvl, char *buf, size_t *buflen)
+{
+ XDR xdr;
+ int err;
+
+ nvs->nvs_ops = &nvs_xdr_ops;
+
+ if ((err = nvs_xdr_create(nvs, &xdr, buf + sizeof (nvs_header_t),
+ *buflen - sizeof (nvs_header_t))) != 0)
+ return (err);
+
+ err = nvs_operation(nvs, nvl, buflen);
+
+ nvs_xdr_destroy(nvs);
+
+ return (err);
+}
diff --git a/sys/contrib/opensolaris/common/nvpair/nvpair_alloc_fixed.c b/sys/contrib/opensolaris/common/nvpair/nvpair_alloc_fixed.c
new file mode 100644
index 0000000..620171e
--- /dev/null
+++ b/sys/contrib/opensolaris/common/nvpair/nvpair_alloc_fixed.c
@@ -0,0 +1,118 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/nvpair.h>
+#include <sys/sysmacros.h>
+#if defined(_KERNEL) && !defined(_BOOT)
+#include <sys/varargs.h>
+#else
+#include <stdarg.h>
+#include <strings.h>
+#endif
+
+/*
+ * This allocator is very simple.
+ * - it uses a pre-allocated buffer for memory allocations.
+ * - it does _not_ free memory in the pre-allocated buffer.
+ *
+ * The reason for the selected implemention is simplicity.
+ * This allocator is designed for the usage in interrupt context when
+ * the caller may not wait for free memory.
+ */
+
+/* pre-allocated buffer for memory allocations */
+typedef struct nvbuf {
+ uintptr_t nvb_buf; /* address of pre-allocated buffer */
+ uintptr_t nvb_lim; /* limit address in the buffer */
+ uintptr_t nvb_cur; /* current address in the buffer */
+} nvbuf_t;
+
+/*
+ * Initialize the pre-allocated buffer allocator. The caller needs to supply
+ *
+ * buf address of pre-allocated buffer
+ * bufsz size of pre-allocated buffer
+ *
+ * nv_fixed_init() calculates the remaining members of nvbuf_t.
+ */
+static int
+nv_fixed_init(nv_alloc_t *nva, va_list valist)
+{
+ uintptr_t base = va_arg(valist, uintptr_t);
+ uintptr_t lim = base + va_arg(valist, size_t);
+ nvbuf_t *nvb = (nvbuf_t *)P2ROUNDUP(base, sizeof (uintptr_t));
+
+ if (base == 0 || (uintptr_t)&nvb[1] > lim)
+ return (EINVAL);
+
+ nvb->nvb_buf = (uintptr_t)&nvb[0];
+ nvb->nvb_cur = (uintptr_t)&nvb[1];
+ nvb->nvb_lim = lim;
+ nva->nva_arg = nvb;
+
+ return (0);
+}
+
+static void *
+nv_fixed_alloc(nv_alloc_t *nva, size_t size)
+{
+ nvbuf_t *nvb = nva->nva_arg;
+ uintptr_t new = nvb->nvb_cur;
+
+ if (size == 0 || new + size > nvb->nvb_lim)
+ return (NULL);
+
+ nvb->nvb_cur = P2ROUNDUP(new + size, sizeof (uintptr_t));
+
+ return ((void *)new);
+}
+
+/*ARGSUSED*/
+static void
+nv_fixed_free(nv_alloc_t *nva, void *buf, size_t size)
+{
+ /* don't free memory in the pre-allocated buffer */
+}
+
+static void
+nv_fixed_reset(nv_alloc_t *nva)
+{
+ nvbuf_t *nvb = nva->nva_arg;
+
+ nvb->nvb_cur = (uintptr_t)&nvb[1];
+}
+
+const nv_alloc_ops_t nv_fixed_ops_def = {
+ nv_fixed_init, /* nv_ao_init() */
+ NULL, /* nv_ao_fini() */
+ nv_fixed_alloc, /* nv_ao_alloc() */
+ nv_fixed_free, /* nv_ao_free() */
+ nv_fixed_reset /* nv_ao_reset() */
+};
+
+const nv_alloc_ops_t *nv_fixed_ops = &nv_fixed_ops_def;
diff --git a/sys/contrib/opensolaris/common/zfs/zfs_namecheck.c b/sys/contrib/opensolaris/common/zfs/zfs_namecheck.c
new file mode 100644
index 0000000..2004d86
--- /dev/null
+++ b/sys/contrib/opensolaris/common/zfs/zfs_namecheck.c
@@ -0,0 +1,287 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Common name validation routines for ZFS. These routines are shared by the
+ * userland code as well as the ioctl() layer to ensure that we don't
+ * inadvertently expose a hole through direct ioctl()s that never gets tested.
+ * In userland, however, we want significantly more information about _why_ the
+ * name is invalid. In the kernel, we only care whether it's valid or not.
+ * Each routine therefore takes a 'namecheck_err_t' which describes exactly why
+ * the name failed to validate.
+ *
+ * Each function returns 0 on success, -1 on error.
+ */
+
+#if defined(_KERNEL)
+#include <sys/systm.h>
+#else
+#include <string.h>
+#endif
+
+#include <sys/param.h>
+#include "zfs_namecheck.h"
+
+static int
+valid_char(char c)
+{
+ return ((c >= 'a' && c <= 'z') ||
+ (c >= 'A' && c <= 'Z') ||
+ (c >= '0' && c <= '9') ||
+ c == '-' || c == '_' || c == '.' || c == ':');
+}
+
+/*
+ * Snapshot names must be made up of alphanumeric characters plus the following
+ * characters:
+ *
+ * [-_.:]
+ */
+int
+snapshot_namecheck(const char *path, namecheck_err_t *why, char *what)
+{
+ const char *loc;
+
+ if (strlen(path) >= MAXNAMELEN) {
+ if (why)
+ *why = NAME_ERR_TOOLONG;
+ return (-1);
+ }
+
+ if (path[0] == '\0') {
+ if (why)
+ *why = NAME_ERR_EMPTY_COMPONENT;
+ return (-1);
+ }
+
+ for (loc = path; *loc; loc++) {
+ if (!valid_char(*loc)) {
+ if (why) {
+ *why = NAME_ERR_INVALCHAR;
+ *what = *loc;
+ }
+ return (-1);
+ }
+ }
+ return (0);
+}
+
+/*
+ * Dataset names must be of the following form:
+ *
+ * [component][/]*[component][@component]
+ *
+ * Where each component is made up of alphanumeric characters plus the following
+ * characters:
+ *
+ * [-_.:]
+ */
+int
+dataset_namecheck(const char *path, namecheck_err_t *why, char *what)
+{
+ const char *loc, *end;
+ int found_snapshot;
+
+ /*
+ * Make sure the name is not too long.
+ *
+ * ZFS_MAXNAMELEN is the maximum dataset length used in the userland
+ * which is the same as MAXNAMELEN used in the kernel.
+ * If ZFS_MAXNAMELEN value is changed, make sure to cleanup all
+ * places using MAXNAMELEN.
+ */
+ if (strlen(path) >= MAXNAMELEN) {
+ if (why)
+ *why = NAME_ERR_TOOLONG;
+ return (-1);
+ }
+
+ /* Explicitly check for a leading slash. */
+ if (path[0] == '/') {
+ if (why)
+ *why = NAME_ERR_LEADING_SLASH;
+ return (-1);
+ }
+
+ if (path[0] == '\0') {
+ if (why)
+ *why = NAME_ERR_EMPTY_COMPONENT;
+ return (-1);
+ }
+
+ loc = path;
+ found_snapshot = 0;
+ for (;;) {
+ /* Find the end of this component */
+ end = loc;
+ while (*end != '/' && *end != '@' && *end != '\0')
+ end++;
+
+ if (*end == '\0' && end[-1] == '/') {
+ /* trailing slashes are not allowed */
+ if (why)
+ *why = NAME_ERR_TRAILING_SLASH;
+ return (-1);
+ }
+
+ /* Zero-length components are not allowed */
+ if (loc == end) {
+ if (why) {
+ /*
+ * Make sure this is really a zero-length
+ * component and not a '@@'.
+ */
+ if (*end == '@' && found_snapshot) {
+ *why = NAME_ERR_MULTIPLE_AT;
+ } else {
+ *why = NAME_ERR_EMPTY_COMPONENT;
+ }
+ }
+
+ return (-1);
+ }
+
+ /* Validate the contents of this component */
+ while (loc != end) {
+ if (!valid_char(*loc)) {
+ if (why) {
+ *why = NAME_ERR_INVALCHAR;
+ *what = *loc;
+ }
+ return (-1);
+ }
+ loc++;
+ }
+
+ /* If we've reached the end of the string, we're OK */
+ if (*end == '\0')
+ return (0);
+
+ if (*end == '@') {
+ /*
+ * If we've found an @ symbol, indicate that we're in
+ * the snapshot component, and report a second '@'
+ * character as an error.
+ */
+ if (found_snapshot) {
+ if (why)
+ *why = NAME_ERR_MULTIPLE_AT;
+ return (-1);
+ }
+
+ found_snapshot = 1;
+ }
+
+ /*
+ * If there is a '/' in a snapshot name
+ * then report an error
+ */
+ if (*end == '/' && found_snapshot) {
+ if (why)
+ *why = NAME_ERR_TRAILING_SLASH;
+ return (-1);
+ }
+
+ /* Update to the next component */
+ loc = end + 1;
+ }
+}
+
+/*
+ * For pool names, we have the same set of valid characters as described in
+ * dataset names, with the additional restriction that the pool name must begin
+ * with a letter. The pool names 'raidz' and 'mirror' are also reserved names
+ * that cannot be used.
+ */
+int
+pool_namecheck(const char *pool, namecheck_err_t *why, char *what)
+{
+ const char *c;
+
+ /*
+ * Make sure the name is not too long.
+ *
+ * ZPOOL_MAXNAMELEN is the maximum pool length used in the userland
+ * which is the same as MAXNAMELEN used in the kernel.
+ * If ZPOOL_MAXNAMELEN value is changed, make sure to cleanup all
+ * places using MAXNAMELEN.
+ */
+ if (strlen(pool) >= MAXNAMELEN) {
+ if (why)
+ *why = NAME_ERR_TOOLONG;
+ return (-1);
+ }
+
+ c = pool;
+ while (*c != '\0') {
+ if (!valid_char(*c)) {
+ if (why) {
+ *why = NAME_ERR_INVALCHAR;
+ *what = *c;
+ }
+ return (-1);
+ }
+ c++;
+ }
+
+ if (!(*pool >= 'a' && *pool <= 'z') &&
+ !(*pool >= 'A' && *pool <= 'Z')) {
+ if (why)
+ *why = NAME_ERR_NOLETTER;
+ return (-1);
+ }
+
+ if (strcmp(pool, "mirror") == 0 || strcmp(pool, "raidz") == 0) {
+ if (why)
+ *why = NAME_ERR_RESERVED;
+ return (-1);
+ }
+
+ if (pool[0] == 'c' && (pool[1] >= '0' && pool[1] <= '9')) {
+ if (why)
+ *why = NAME_ERR_DISKLIKE;
+ return (-1);
+ }
+
+ return (0);
+}
+
+/*
+ * Check if the dataset name is private for internal usage.
+ * '$' is reserved for internal dataset names. e.g. "$MOS"
+ *
+ * Return 1 if the given name is used internally.
+ * Return 0 if it is not.
+ */
+int
+dataset_name_hidden(const char *name)
+{
+ if (strchr(name, '$') != NULL)
+ return (1);
+
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/common/zfs/zfs_namecheck.h b/sys/contrib/opensolaris/common/zfs/zfs_namecheck.h
new file mode 100644
index 0000000..7e0cda9
--- /dev/null
+++ b/sys/contrib/opensolaris/common/zfs/zfs_namecheck.h
@@ -0,0 +1,56 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _ZFS_NAMECHECK_H
+#define _ZFS_NAMECHECK_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ NAME_ERR_LEADING_SLASH, /* name begins with leading slash */
+ NAME_ERR_EMPTY_COMPONENT, /* name contains an empty component */
+ NAME_ERR_TRAILING_SLASH, /* name ends with a slash */
+ NAME_ERR_INVALCHAR, /* invalid character found */
+ NAME_ERR_MULTIPLE_AT, /* multiple '@' characters found */
+ NAME_ERR_NOLETTER, /* pool doesn't begin with a letter */
+ NAME_ERR_RESERVED, /* entire name is reserved */
+ NAME_ERR_DISKLIKE, /* reserved disk name (c[0-9].*) */
+ NAME_ERR_TOOLONG, /* name is too long */
+} namecheck_err_t;
+
+int pool_namecheck(const char *, namecheck_err_t *, char *);
+int dataset_namecheck(const char *, namecheck_err_t *, char *);
+int dataset_name_hidden(const char *);
+int snapshot_namecheck(const char *, namecheck_err_t *, char *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZFS_NAMECHECK_H */
diff --git a/sys/contrib/opensolaris/common/zfs/zfs_prop.c b/sys/contrib/opensolaris/common/zfs/zfs_prop.c
new file mode 100644
index 0000000..7125619
--- /dev/null
+++ b/sys/contrib/opensolaris/common/zfs/zfs_prop.c
@@ -0,0 +1,657 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Master property table.
+ *
+ * This table keeps track of all the properties supported by ZFS, and their
+ * various attributes. Not all of these are needed by the kernel, and several
+ * are only used by a single libzfs client. But having them here centralizes
+ * all property information in one location.
+ *
+ * name The human-readable string representing this property
+ * proptype Basic type (string, boolean, number)
+ * default Default value for the property. Sadly, C only allows
+ * you to initialize the first member of a union, so we
+ * have two default members for each property.
+ * attr Attributes (readonly, inheritable) for the property
+ * types Valid dataset types to which this applies
+ * values String describing acceptable values for the property
+ * colname The column header for 'zfs list'
+ * colfmt The column formatting for 'zfs list'
+ *
+ * This table must match the order of property types in libzfs.h.
+ */
+
+#include <sys/zio.h>
+#include <sys/spa.h>
+#include <sys/zfs_acl.h>
+#include <sys/zfs_ioctl.h>
+
+#include "zfs_prop.h"
+
+#if defined(_KERNEL)
+#include <sys/systm.h>
+#else
+#include <stdlib.h>
+#include <string.h>
+#include <ctype.h>
+#endif
+
+typedef enum {
+ prop_default,
+ prop_readonly,
+ prop_inherit
+} prop_attr_t;
+
+typedef struct {
+ const char *pd_name;
+ zfs_proptype_t pd_proptype;
+ uint64_t pd_numdefault;
+ const char *pd_strdefault;
+ prop_attr_t pd_attr;
+ int pd_types;
+ const char *pd_values;
+ const char *pd_colname;
+ boolean_t pd_rightalign;
+ boolean_t pd_visible;
+} prop_desc_t;
+
+static prop_desc_t zfs_prop_table[] = {
+ { "type", prop_type_string, 0, NULL, prop_readonly,
+ ZFS_TYPE_ANY, "filesystem | volume | snapshot", "TYPE", B_TRUE,
+ B_TRUE },
+ { "creation", prop_type_number, 0, NULL, prop_readonly,
+ ZFS_TYPE_ANY, "<date>", "CREATION", B_FALSE, B_TRUE },
+ { "used", prop_type_number, 0, NULL, prop_readonly,
+ ZFS_TYPE_ANY, "<size>", "USED", B_TRUE, B_TRUE },
+ { "available", prop_type_number, 0, NULL, prop_readonly,
+ ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<size>", "AVAIL", B_TRUE,
+ B_TRUE },
+ { "referenced", prop_type_number, 0, NULL, prop_readonly,
+ ZFS_TYPE_ANY,
+ "<size>", "REFER", B_TRUE, B_TRUE },
+ { "compressratio", prop_type_number, 0, NULL, prop_readonly,
+ ZFS_TYPE_ANY, "<1.00x or higher if compressed>", "RATIO", B_TRUE,
+ B_TRUE },
+ { "mounted", prop_type_boolean, 0, NULL, prop_readonly,
+ ZFS_TYPE_FILESYSTEM, "yes | no | -", "MOUNTED", B_TRUE, B_TRUE },
+ { "origin", prop_type_string, 0, NULL, prop_readonly,
+ ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME, "<snapshot>", "ORIGIN",
+ B_FALSE, B_TRUE },
+ { "quota", prop_type_number, 0, NULL, prop_default,
+ ZFS_TYPE_FILESYSTEM, "<size> | none", "QUOTA", B_TRUE, B_TRUE },
+ { "reservation", prop_type_number, 0, NULL, prop_default,
+ ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
+ "<size> | none", "RESERV", B_TRUE, B_TRUE },
+ { "volsize", prop_type_number, 0, NULL, prop_default,
+ ZFS_TYPE_VOLUME, "<size>", "VOLSIZE", B_TRUE, B_TRUE },
+ { "volblocksize", prop_type_number, 8192, NULL, prop_readonly,
+ ZFS_TYPE_VOLUME, "512 to 128k, power of 2", "VOLBLOCK", B_TRUE,
+ B_TRUE },
+ { "recordsize", prop_type_number, SPA_MAXBLOCKSIZE, NULL,
+ prop_inherit,
+ ZFS_TYPE_FILESYSTEM,
+ "512 to 128k, power of 2", "RECSIZE", B_TRUE, B_TRUE },
+ { "mountpoint", prop_type_string, 0, "/", prop_inherit,
+ ZFS_TYPE_FILESYSTEM,
+ "<path> | legacy | none", "MOUNTPOINT", B_FALSE, B_TRUE },
+ { "sharenfs", prop_type_string, 0, "off", prop_inherit,
+ ZFS_TYPE_FILESYSTEM,
+ "on | off | exports(5) options", "SHARENFS", B_FALSE, B_TRUE },
+ { "checksum", prop_type_index, ZIO_CHECKSUM_DEFAULT, "on",
+ prop_inherit, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
+ "on | off | fletcher2 | fletcher4 | sha256", "CHECKSUM", B_TRUE,
+ B_TRUE },
+ { "compression", prop_type_index, ZIO_COMPRESS_DEFAULT, "off",
+ prop_inherit, ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
+ "on | off | lzjb | gzip | gzip-[1-9]", "COMPRESS", B_TRUE, B_TRUE },
+ { "atime", prop_type_boolean, 1, NULL, prop_inherit,
+ ZFS_TYPE_FILESYSTEM,
+ "on | off", "ATIME", B_TRUE, B_TRUE },
+ { "devices", prop_type_boolean, 1, NULL, prop_inherit,
+ ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT,
+ "on | off", "DEVICES", B_TRUE, B_TRUE },
+ { "exec", prop_type_boolean, 1, NULL, prop_inherit,
+ ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT,
+ "on | off", "EXEC", B_TRUE, B_TRUE },
+ { "setuid", prop_type_boolean, 1, NULL, prop_inherit,
+ ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT, "on | off", "SETUID",
+ B_TRUE, B_TRUE },
+ { "readonly", prop_type_boolean, 0, NULL, prop_inherit,
+ ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
+ "on | off", "RDONLY", B_TRUE, B_TRUE },
+ { "jailed", prop_type_boolean, 0, NULL, prop_inherit,
+ ZFS_TYPE_FILESYSTEM,
+ "on | off", "JAILED", B_TRUE, B_TRUE },
+ { "snapdir", prop_type_index, ZFS_SNAPDIR_HIDDEN, "hidden",
+ prop_inherit,
+ ZFS_TYPE_FILESYSTEM,
+ "hidden | visible", "SNAPDIR", B_TRUE, B_TRUE },
+ { "aclmode", prop_type_index, ZFS_ACL_GROUPMASK, "groupmask",
+ prop_inherit, ZFS_TYPE_FILESYSTEM,
+ "discard | groupmask | passthrough", "ACLMODE", B_TRUE, B_TRUE },
+ { "aclinherit", prop_type_index, ZFS_ACL_SECURE, "secure",
+ prop_inherit, ZFS_TYPE_FILESYSTEM,
+ "discard | noallow | secure | passthrough", "ACLINHERIT", B_TRUE,
+ B_TRUE },
+ { "createtxg", prop_type_number, 0, NULL, prop_readonly,
+ ZFS_TYPE_ANY, NULL, NULL, B_FALSE, B_FALSE },
+ { "name", prop_type_string, 0, NULL, prop_readonly,
+ ZFS_TYPE_ANY, NULL, "NAME", B_FALSE, B_FALSE },
+ { "canmount", prop_type_boolean, 1, NULL, prop_default,
+ ZFS_TYPE_FILESYSTEM,
+ "on | off", "CANMOUNT", B_TRUE, B_TRUE },
+ { "shareiscsi", prop_type_string, 0, "off", prop_inherit,
+ ZFS_TYPE_ANY,
+ "on | off | type=<type>", "SHAREISCSI", B_FALSE, B_TRUE },
+ { "iscsioptions", prop_type_string, 0, NULL, prop_inherit,
+ ZFS_TYPE_VOLUME, NULL, "ISCSIOPTIONS", B_FALSE, B_FALSE },
+ { "xattr", prop_type_boolean, 1, NULL, prop_inherit,
+ ZFS_TYPE_FILESYSTEM | ZFS_TYPE_SNAPSHOT,
+ "on | off", "XATTR", B_TRUE, B_TRUE },
+ { "numclones", prop_type_number, 0, NULL, prop_readonly,
+ ZFS_TYPE_SNAPSHOT, NULL, NULL, B_FALSE, B_FALSE },
+ { "copies", prop_type_index, 1, "1", prop_inherit,
+ ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME,
+ "1 | 2 | 3", "COPIES", B_TRUE, B_TRUE },
+ { "bootfs", prop_type_string, 0, NULL, prop_default,
+ ZFS_TYPE_POOL, "<filesystem>", "BOOTFS", B_FALSE, B_TRUE },
+};
+
+#define ZFS_PROP_COUNT ((sizeof (zfs_prop_table))/(sizeof (prop_desc_t)))
+
+/*
+ * Returns TRUE if the property applies to the given dataset types.
+ */
+int
+zfs_prop_valid_for_type(zfs_prop_t prop, int types)
+{
+ return ((zfs_prop_table[prop].pd_types & types) != 0);
+}
+
+/*
+ * Determine if the specified property is visible or not.
+ */
+boolean_t
+zfs_prop_is_visible(zfs_prop_t prop)
+{
+ if (prop < 0)
+ return (B_FALSE);
+
+ return (zfs_prop_table[prop].pd_visible);
+}
+
+/*
+ * Iterate over all properties, calling back into the specified function
+ * for each property. We will continue to iterate until we either
+ * reach the end or the callback function something other than
+ * ZFS_PROP_CONT.
+ */
+zfs_prop_t
+zfs_prop_iter_common(zfs_prop_f func, void *cb, zfs_type_t type,
+ boolean_t show_all)
+{
+ int i;
+
+ for (i = 0; i < ZFS_PROP_COUNT; i++) {
+ if (zfs_prop_valid_for_type(i, type) &&
+ (zfs_prop_is_visible(i) || show_all)) {
+ if (func(i, cb) != ZFS_PROP_CONT)
+ return (i);
+ }
+ }
+ return (ZFS_PROP_CONT);
+}
+
+zfs_prop_t
+zfs_prop_iter(zfs_prop_f func, void *cb, boolean_t show_all)
+{
+ return (zfs_prop_iter_common(func, cb, ZFS_TYPE_ANY, show_all));
+}
+
+zpool_prop_t
+zpool_prop_iter(zpool_prop_f func, void *cb, boolean_t show_all)
+{
+ return (zfs_prop_iter_common(func, cb, ZFS_TYPE_POOL, show_all));
+}
+
+zfs_proptype_t
+zfs_prop_get_type(zfs_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_proptype);
+}
+
+static boolean_t
+propname_match(const char *p, zfs_prop_t prop, size_t len)
+{
+ const char *propname = zfs_prop_table[prop].pd_name;
+#ifndef _KERNEL
+ const char *colname = zfs_prop_table[prop].pd_colname;
+ int c;
+#endif
+
+#ifndef _KERNEL
+ if (colname == NULL)
+ return (B_FALSE);
+#endif
+
+ if (len == strlen(propname) &&
+ strncmp(p, propname, len) == 0)
+ return (B_TRUE);
+
+#ifndef _KERNEL
+ if (len != strlen(colname))
+ return (B_FALSE);
+
+ for (c = 0; c < len; c++)
+ if (p[c] != tolower(colname[c]))
+ break;
+
+ return (colname[c] == '\0');
+#else
+ return (B_FALSE);
+#endif
+}
+
+zfs_prop_t
+zfs_name_to_prop_cb(zfs_prop_t prop, void *cb_data)
+{
+ const char *propname = cb_data;
+
+ if (propname_match(propname, prop, strlen(propname)))
+ return (prop);
+
+ return (ZFS_PROP_CONT);
+}
+
+/*
+ * Given a property name and its type, returns the corresponding property ID.
+ */
+zfs_prop_t
+zfs_name_to_prop_common(const char *propname, zfs_type_t type)
+{
+ zfs_prop_t prop;
+
+ prop = zfs_prop_iter_common(zfs_name_to_prop_cb, (void *)propname,
+ type, B_TRUE);
+ return (prop == ZFS_PROP_CONT ? ZFS_PROP_INVAL : prop);
+}
+
+/*
+ * Given a zfs dataset property name, returns the corresponding property ID.
+ */
+zfs_prop_t
+zfs_name_to_prop(const char *propname)
+{
+ return (zfs_name_to_prop_common(propname, ZFS_TYPE_ANY));
+}
+
+/*
+ * Given a pool property name, returns the corresponding property ID.
+ */
+zpool_prop_t
+zpool_name_to_prop(const char *propname)
+{
+ return (zfs_name_to_prop_common(propname, ZFS_TYPE_POOL));
+}
+
+/*
+ * For user property names, we allow all lowercase alphanumeric characters, plus
+ * a few useful punctuation characters.
+ */
+static int
+valid_char(char c)
+{
+ return ((c >= 'a' && c <= 'z') ||
+ (c >= '0' && c <= '9') ||
+ c == '-' || c == '_' || c == '.' || c == ':');
+}
+
+/*
+ * Returns true if this is a valid user-defined property (one with a ':').
+ */
+boolean_t
+zfs_prop_user(const char *name)
+{
+ int i;
+ char c;
+ boolean_t foundsep = B_FALSE;
+
+ for (i = 0; i < strlen(name); i++) {
+ c = name[i];
+ if (!valid_char(c))
+ return (B_FALSE);
+ if (c == ':')
+ foundsep = B_TRUE;
+ }
+
+ if (!foundsep)
+ return (B_FALSE);
+
+ return (B_TRUE);
+}
+
+/*
+ * Return the default value for the given property.
+ */
+const char *
+zfs_prop_default_string(zfs_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_strdefault);
+}
+
+uint64_t
+zfs_prop_default_numeric(zfs_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_numdefault);
+}
+
+/*
+ * Returns TRUE if the property is readonly.
+ */
+int
+zfs_prop_readonly(zfs_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_attr == prop_readonly);
+}
+
+/*
+ * Given a dataset property ID, returns the corresponding name.
+ * Assuming the zfs dataset propety ID is valid.
+ */
+const char *
+zfs_prop_to_name(zfs_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_name);
+}
+
+/*
+ * Given a pool property ID, returns the corresponding name.
+ * Assuming the pool propety ID is valid.
+ */
+const char *
+zpool_prop_to_name(zpool_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_name);
+}
+
+/*
+ * Returns TRUE if the property is inheritable.
+ */
+int
+zfs_prop_inheritable(zfs_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_attr == prop_inherit);
+}
+
+typedef struct zfs_index {
+ const char *name;
+ uint64_t index;
+} zfs_index_t;
+
+static zfs_index_t checksum_table[] = {
+ { "on", ZIO_CHECKSUM_ON },
+ { "off", ZIO_CHECKSUM_OFF },
+ { "fletcher2", ZIO_CHECKSUM_FLETCHER_2 },
+ { "fletcher4", ZIO_CHECKSUM_FLETCHER_4 },
+ { "sha256", ZIO_CHECKSUM_SHA256 },
+ { NULL }
+};
+
+static zfs_index_t compress_table[] = {
+ { "on", ZIO_COMPRESS_ON },
+ { "off", ZIO_COMPRESS_OFF },
+ { "lzjb", ZIO_COMPRESS_LZJB },
+ { "gzip", ZIO_COMPRESS_GZIP_6 }, /* the default gzip level */
+ { "gzip-1", ZIO_COMPRESS_GZIP_1 },
+ { "gzip-2", ZIO_COMPRESS_GZIP_2 },
+ { "gzip-3", ZIO_COMPRESS_GZIP_3 },
+ { "gzip-4", ZIO_COMPRESS_GZIP_4 },
+ { "gzip-5", ZIO_COMPRESS_GZIP_5 },
+ { "gzip-6", ZIO_COMPRESS_GZIP_6 },
+ { "gzip-7", ZIO_COMPRESS_GZIP_7 },
+ { "gzip-8", ZIO_COMPRESS_GZIP_8 },
+ { "gzip-9", ZIO_COMPRESS_GZIP_9 },
+ { NULL }
+};
+
+static zfs_index_t snapdir_table[] = {
+ { "hidden", ZFS_SNAPDIR_HIDDEN },
+ { "visible", ZFS_SNAPDIR_VISIBLE },
+ { NULL }
+};
+
+static zfs_index_t acl_mode_table[] = {
+ { "discard", ZFS_ACL_DISCARD },
+ { "groupmask", ZFS_ACL_GROUPMASK },
+ { "passthrough", ZFS_ACL_PASSTHROUGH },
+ { NULL }
+};
+
+static zfs_index_t acl_inherit_table[] = {
+ { "discard", ZFS_ACL_DISCARD },
+ { "noallow", ZFS_ACL_NOALLOW },
+ { "secure", ZFS_ACL_SECURE },
+ { "passthrough", ZFS_ACL_PASSTHROUGH },
+ { NULL }
+};
+
+static zfs_index_t copies_table[] = {
+ { "1", 1 },
+ { "2", 2 },
+ { "3", 3 },
+ { NULL }
+};
+
+static zfs_index_t *
+zfs_prop_index_table(zfs_prop_t prop)
+{
+ switch (prop) {
+ case ZFS_PROP_CHECKSUM:
+ return (checksum_table);
+ case ZFS_PROP_COMPRESSION:
+ return (compress_table);
+ case ZFS_PROP_SNAPDIR:
+ return (snapdir_table);
+ case ZFS_PROP_ACLMODE:
+ return (acl_mode_table);
+ case ZFS_PROP_ACLINHERIT:
+ return (acl_inherit_table);
+ case ZFS_PROP_COPIES:
+ return (copies_table);
+ default:
+ return (NULL);
+ }
+}
+
+
+/*
+ * Tables of index types, plus functions to convert between the user view
+ * (strings) and internal representation (uint64_t).
+ */
+int
+zfs_prop_string_to_index(zfs_prop_t prop, const char *string, uint64_t *index)
+{
+ zfs_index_t *table;
+ int i;
+
+ if ((table = zfs_prop_index_table(prop)) == NULL)
+ return (-1);
+
+ for (i = 0; table[i].name != NULL; i++) {
+ if (strcmp(string, table[i].name) == 0) {
+ *index = table[i].index;
+ return (0);
+ }
+ }
+
+ return (-1);
+}
+
+int
+zfs_prop_index_to_string(zfs_prop_t prop, uint64_t index, const char **string)
+{
+ zfs_index_t *table;
+ int i;
+
+ if ((table = zfs_prop_index_table(prop)) == NULL)
+ return (-1);
+
+ for (i = 0; table[i].name != NULL; i++) {
+ if (table[i].index == index) {
+ *string = table[i].name;
+ return (0);
+ }
+ }
+
+ return (-1);
+}
+
+#ifndef _KERNEL
+
+/*
+ * Returns a string describing the set of acceptable values for the given
+ * zfs property, or NULL if it cannot be set.
+ */
+const char *
+zfs_prop_values(zfs_prop_t prop)
+{
+ if (zfs_prop_table[prop].pd_types == ZFS_TYPE_POOL)
+ return (NULL);
+
+ return (zfs_prop_table[prop].pd_values);
+}
+
+/*
+ * Returns a string describing the set of acceptable values for the given
+ * zpool property, or NULL if it cannot be set.
+ */
+const char *
+zpool_prop_values(zfs_prop_t prop)
+{
+ if (zfs_prop_table[prop].pd_types != ZFS_TYPE_POOL)
+ return (NULL);
+
+ return (zfs_prop_table[prop].pd_values);
+}
+
+/*
+ * Returns TRUE if this property is a string type. Note that index types
+ * (compression, checksum) are treated as strings in userland, even though they
+ * are stored numerically on disk.
+ */
+int
+zfs_prop_is_string(zfs_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_proptype == prop_type_string ||
+ zfs_prop_table[prop].pd_proptype == prop_type_index);
+}
+
+/*
+ * Returns the column header for the given property. Used only in
+ * 'zfs list -o', but centralized here with the other property information.
+ */
+const char *
+zfs_prop_column_name(zfs_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_colname);
+}
+
+/*
+ * Returns whether the given property should be displayed right-justified for
+ * 'zfs list'.
+ */
+boolean_t
+zfs_prop_align_right(zfs_prop_t prop)
+{
+ return (zfs_prop_table[prop].pd_rightalign);
+}
+
+/*
+ * Determines the minimum width for the column, and indicates whether it's fixed
+ * or not. Only string columns are non-fixed.
+ */
+size_t
+zfs_prop_width(zfs_prop_t prop, boolean_t *fixed)
+{
+ prop_desc_t *pd = &zfs_prop_table[prop];
+ zfs_index_t *idx;
+ size_t ret;
+ int i;
+
+ *fixed = B_TRUE;
+
+ /*
+ * Start with the width of the column name.
+ */
+ ret = strlen(pd->pd_colname);
+
+ /*
+ * For fixed-width values, make sure the width is large enough to hold
+ * any possible value.
+ */
+ switch (pd->pd_proptype) {
+ case prop_type_number:
+ /*
+ * The maximum length of a human-readable number is 5 characters
+ * ("20.4M", for example).
+ */
+ if (ret < 5)
+ ret = 5;
+ /*
+ * 'creation' is handled specially because it's a number
+ * internally, but displayed as a date string.
+ */
+ if (prop == ZFS_PROP_CREATION)
+ *fixed = B_FALSE;
+ break;
+ case prop_type_boolean:
+ /*
+ * The maximum length of a boolean value is 3 characters, for
+ * "off".
+ */
+ if (ret < 3)
+ ret = 3;
+ break;
+ case prop_type_index:
+ idx = zfs_prop_index_table(prop);
+ for (i = 0; idx[i].name != NULL; i++) {
+ if (strlen(idx[i].name) > ret)
+ ret = strlen(idx[i].name);
+ }
+ break;
+
+ case prop_type_string:
+ *fixed = B_FALSE;
+ break;
+ }
+
+ return (ret);
+}
+
+#endif
diff --git a/sys/contrib/opensolaris/common/zfs/zfs_prop.h b/sys/contrib/opensolaris/common/zfs/zfs_prop.h
new file mode 100644
index 0000000..133e740
--- /dev/null
+++ b/sys/contrib/opensolaris/common/zfs/zfs_prop.h
@@ -0,0 +1,56 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _ZFS_PROP_H
+#define _ZFS_PROP_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/fs/zfs.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * For index types (e.g. compression and checksum), we want the numeric value
+ * in the kernel, but the string value in userland.
+ */
+typedef enum {
+ prop_type_number, /* numeric value */
+ prop_type_string, /* string value */
+ prop_type_boolean, /* boolean value */
+ prop_type_index /* numeric value indexed by string */
+} zfs_proptype_t;
+
+zfs_proptype_t zfs_prop_get_type(zfs_prop_t);
+size_t zfs_prop_width(zfs_prop_t, boolean_t *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZFS_PROP_H */
diff --git a/sys/contrib/opensolaris/uts/common/Makefile.files b/sys/contrib/opensolaris/uts/common/Makefile.files
new file mode 100644
index 0000000..1800e79
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/Makefile.files
@@ -0,0 +1,101 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License (the "License").
+# You may not use this file except in compliance with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+
+#
+# Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+# This Makefile defines all file modules for the directory uts/common
+# and its children. These are the source files which may be considered
+# common to all SunOS systems.
+
+ZFS_COMMON_OBJS += \
+ arc.o \
+ bplist.o \
+ dbuf.o \
+ dmu.o \
+ dmu_send.o \
+ dmu_object.o \
+ dmu_objset.o \
+ dmu_traverse.o \
+ dmu_tx.o \
+ dnode.o \
+ dnode_sync.o \
+ dsl_dir.o \
+ dsl_dataset.o \
+ dsl_pool.o \
+ dsl_synctask.o \
+ dmu_zfetch.o \
+ dsl_prop.o \
+ fletcher.o \
+ gzip.o \
+ lzjb.o \
+ metaslab.o \
+ refcount.o \
+ sha256.o \
+ spa.o \
+ spa_config.o \
+ spa_errlog.o \
+ spa_history.o \
+ spa_misc.o \
+ space_map.o \
+ txg.o \
+ uberblock.o \
+ unique.o \
+ vdev.o \
+ vdev_cache.o \
+ vdev_label.o \
+ vdev_mirror.o \
+ vdev_missing.o \
+ vdev_queue.o \
+ vdev_raidz.o \
+ vdev_root.o \
+ zap.o \
+ zap_leaf.o \
+ zap_micro.o \
+ zfs_byteswap.o \
+ zfs_fm.o \
+ zfs_znode.o \
+ zil.o \
+ zio.o \
+ zio_checksum.o \
+ zio_compress.o \
+ zio_inject.o
+
+ZFS_SHARED_OBJS += \
+ zfs_namecheck.o \
+ zfs_prop.o
+
+ZFS_OBJS += \
+ $(ZFS_COMMON_OBJS) \
+ $(ZFS_SHARED_OBJS) \
+ zfs_acl.o \
+ zfs_ctldir.o \
+ zfs_dir.o \
+ zfs_ioctl.o \
+ zfs_log.o \
+ zfs_replay.o \
+ zfs_rlock.o \
+ zfs_vfsops.o \
+ zfs_vnops.o \
+ zvol.o
diff --git a/sys/contrib/opensolaris/uts/common/fs/gfs.c b/sys/contrib/opensolaris/uts/common/fs/gfs.c
new file mode 100644
index 0000000..528b4b2
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/gfs.c
@@ -0,0 +1,884 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/* Portions Copyright 2007 Shivakumar GN */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/cmn_err.h>
+#include <sys/debug.h>
+#include <sys/dirent.h>
+#include <sys/kmem.h>
+#include <sys/mman.h>
+#include <sys/mutex.h>
+#include <sys/sysmacros.h>
+#include <sys/systm.h>
+#include <sys/uio.h>
+#include <sys/vfs.h>
+#include <sys/vnode.h>
+#include <sys/cred.h>
+#include <sys/kdb.h>
+
+#include <sys/gfs.h>
+
+/*
+ * Generic pseudo-filesystem routines.
+ *
+ * There are significant similarities between the implementation of certain file
+ * system entry points across different filesystems. While one could attempt to
+ * "choke up on the bat" and incorporate common functionality into a VOP
+ * preamble or postamble, such an approach is limited in the benefit it can
+ * provide. In this file we instead define a toolkit of routines which can be
+ * called from a filesystem (with in-kernel pseudo-filesystems being the focus
+ * of the exercise) in a more component-like fashion.
+ *
+ * There are three basic classes of routines:
+ *
+ * 1) Lowlevel support routines
+ *
+ * These routines are designed to play a support role for existing
+ * pseudo-filesystems (such as procfs). They simplify common tasks,
+ * without enforcing the filesystem to hand over management to GFS. The
+ * routines covered are:
+ *
+ * gfs_readdir_init()
+ * gfs_readdir_emit()
+ * gfs_readdir_emitn()
+ * gfs_readdir_pred()
+ * gfs_readdir_fini()
+ * gfs_lookup_dot()
+ *
+ * 2) Complete GFS management
+ *
+ * These routines take a more active role in management of the
+ * pseudo-filesystem. They handle the relationship between vnode private
+ * data and VFS data, as well as the relationship between vnodes in the
+ * directory hierarchy.
+ *
+ * In order to use these interfaces, the first member of every private
+ * v_data must be a gfs_file_t or a gfs_dir_t. This hands over all control
+ * to GFS.
+ *
+ * gfs_file_create()
+ * gfs_dir_create()
+ * gfs_root_create()
+ *
+ * gfs_file_inactive()
+ * gfs_dir_inactive()
+ * gfs_dir_lookup()
+ * gfs_dir_readdir()
+ *
+ * gfs_vop_inactive()
+ * gfs_vop_lookup()
+ * gfs_vop_readdir()
+ * gfs_vop_map()
+ *
+ * 3) Single File pseudo-filesystems
+ *
+ * This routine creates a rooted file to be overlayed ontop of another
+ * file in the physical filespace.
+ *
+ * Note that the parent is NULL (actually the vfs), but there is nothing
+ * technically keeping such a file from utilizing the "Complete GFS
+ * management" set of routines.
+ *
+ * gfs_root_create_file()
+ */
+
+/*
+ * Low level directory routines
+ *
+ * These routines provide some simple abstractions for reading directories.
+ * They are designed to be used by existing pseudo filesystems (namely procfs)
+ * that already have a complicated management infrastructure.
+ */
+
+/*
+ * gfs_readdir_init: initiate a generic readdir
+ * st - a pointer to an uninitialized gfs_readdir_state_t structure
+ * name_max - the directory's maximum file name length
+ * ureclen - the exported file-space record length (1 for non-legacy FSs)
+ * uiop - the uiop passed to readdir
+ * parent - the parent directory's inode
+ * self - this directory's inode
+ *
+ * Returns 0 or a non-zero errno.
+ *
+ * Typical VOP_READDIR usage of gfs_readdir_*:
+ *
+ * if ((error = gfs_readdir_init(...)) != 0)
+ * return (error);
+ * eof = 0;
+ * while ((error = gfs_readdir_pred(..., &voffset)) != 0) {
+ * if (!consumer_entry_at(voffset))
+ * voffset = consumer_next_entry(voffset);
+ * if (consumer_eof(voffset)) {
+ * eof = 1
+ * break;
+ * }
+ * if ((error = gfs_readdir_emit(..., voffset,
+ * consumer_ino(voffset), consumer_name(voffset))) != 0)
+ * break;
+ * }
+ * return (gfs_readdir_fini(..., error, eofp, eof));
+ *
+ * As you can see, a zero result from gfs_readdir_pred() or
+ * gfs_readdir_emit() indicates that processing should continue,
+ * whereas a non-zero result indicates that the loop should terminate.
+ * Most consumers need do nothing more than let gfs_readdir_fini()
+ * determine what the cause of failure was and return the appropriate
+ * value.
+ */
+int
+gfs_readdir_init(gfs_readdir_state_t *st, int name_max, int ureclen,
+ uio_t *uiop, ino64_t parent, ino64_t self)
+{
+ if (uiop->uio_loffset < 0 || uiop->uio_resid <= 0 ||
+ (uiop->uio_loffset % ureclen) != 0)
+ return (EINVAL);
+
+ st->grd_ureclen = ureclen;
+ st->grd_oresid = uiop->uio_resid;
+ st->grd_namlen = name_max;
+ st->grd_dirent = kmem_zalloc(DIRENT64_RECLEN(st->grd_namlen), KM_SLEEP);
+ st->grd_parent = parent;
+ st->grd_self = self;
+
+ return (0);
+}
+
+/*
+ * gfs_readdir_emit_int: internal routine to emit directory entry
+ *
+ * st - the current readdir state, which must have d_ino and d_name
+ * set
+ * uiop - caller-supplied uio pointer
+ * next - the offset of the next entry
+ */
+static int
+gfs_readdir_emit_int(gfs_readdir_state_t *st, uio_t *uiop, offset_t next,
+ int *ncookies, u_long **cookies)
+{
+ int reclen, namlen;
+
+ namlen = strlen(st->grd_dirent->d_name);
+ reclen = DIRENT64_RECLEN(namlen);
+
+ if (reclen > uiop->uio_resid) {
+ /*
+ * Error if no entries were returned yet
+ */
+ if (uiop->uio_resid == st->grd_oresid)
+ return (EINVAL);
+ return (-1);
+ }
+
+ /* XXX: This can change in the future. */
+ st->grd_dirent->d_type = DT_DIR;
+ st->grd_dirent->d_reclen = (ushort_t)reclen;
+ st->grd_dirent->d_namlen = namlen;
+
+ if (uiomove((caddr_t)st->grd_dirent, reclen, UIO_READ, uiop))
+ return (EFAULT);
+
+ uiop->uio_loffset = next;
+ if (*cookies != NULL) {
+ **cookies = next;
+ (*cookies)++;
+ (*ncookies)--;
+ KASSERT(*ncookies >= 0, ("ncookies=%d", *ncookies));
+ }
+
+ return (0);
+}
+
+/*
+ * gfs_readdir_emit: emit a directory entry
+ * voff - the virtual offset (obtained from gfs_readdir_pred)
+ * ino - the entry's inode
+ * name - the entry's name
+ *
+ * Returns a 0 on success, a non-zero errno on failure, or -1 if the
+ * readdir loop should terminate. A non-zero result (either errno or
+ * -1) from this function is typically passed directly to
+ * gfs_readdir_fini().
+ */
+int
+gfs_readdir_emit(gfs_readdir_state_t *st, uio_t *uiop, offset_t voff,
+ ino64_t ino, const char *name, int *ncookies, u_long **cookies)
+{
+ offset_t off = (voff + 2) * st->grd_ureclen;
+
+ st->grd_dirent->d_ino = ino;
+ (void) strncpy(st->grd_dirent->d_name, name, st->grd_namlen);
+
+ /*
+ * Inter-entry offsets are invalid, so we assume a record size of
+ * grd_ureclen and explicitly set the offset appropriately.
+ */
+ return (gfs_readdir_emit_int(st, uiop, off + st->grd_ureclen, ncookies,
+ cookies));
+}
+
+/*
+ * gfs_readdir_pred: readdir loop predicate
+ * voffp - a pointer in which the next virtual offset should be stored
+ *
+ * Returns a 0 on success, a non-zero errno on failure, or -1 if the
+ * readdir loop should terminate. A non-zero result (either errno or
+ * -1) from this function is typically passed directly to
+ * gfs_readdir_fini().
+ */
+int
+gfs_readdir_pred(gfs_readdir_state_t *st, uio_t *uiop, offset_t *voffp,
+ int *ncookies, u_long **cookies)
+{
+ offset_t off, voff;
+ int error;
+
+top:
+ if (uiop->uio_resid <= 0)
+ return (-1);
+
+ off = uiop->uio_loffset / st->grd_ureclen;
+ voff = off - 2;
+ if (off == 0) {
+ if ((error = gfs_readdir_emit(st, uiop, voff, st->grd_self,
+ ".", ncookies, cookies)) == 0)
+ goto top;
+ } else if (off == 1) {
+ if ((error = gfs_readdir_emit(st, uiop, voff, st->grd_parent,
+ "..", ncookies, cookies)) == 0)
+ goto top;
+ } else {
+ *voffp = voff;
+ return (0);
+ }
+
+ return (error);
+}
+
+/*
+ * gfs_readdir_fini: generic readdir cleanup
+ * error - if positive, an error to return
+ * eofp - the eofp passed to readdir
+ * eof - the eof value
+ *
+ * Returns a 0 on success, a non-zero errno on failure. This result
+ * should be returned from readdir.
+ */
+int
+gfs_readdir_fini(gfs_readdir_state_t *st, int error, int *eofp, int eof)
+{
+ kmem_free(st->grd_dirent, DIRENT64_RECLEN(st->grd_namlen));
+ if (error > 0)
+ return (error);
+ if (eofp)
+ *eofp = eof;
+ return (0);
+}
+
+/*
+ * gfs_lookup_dot
+ *
+ * Performs a basic check for "." and ".." directory entries.
+ */
+int
+gfs_lookup_dot(vnode_t **vpp, vnode_t *dvp, vnode_t *pvp, const char *nm)
+{
+ if (*nm == '\0' || strcmp(nm, ".") == 0) {
+ VN_HOLD(dvp);
+ *vpp = dvp;
+ return (0);
+ } else if (strcmp(nm, "..") == 0) {
+ if (pvp == NULL) {
+ ASSERT(dvp->v_flag & VROOT);
+ VN_HOLD(dvp);
+ *vpp = dvp;
+ } else {
+ VN_HOLD(pvp);
+ *vpp = pvp;
+ }
+ vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, curthread);
+ return (0);
+ }
+
+ return (-1);
+}
+
+/*
+ * gfs_file_create(): create a new GFS file
+ *
+ * size - size of private data structure (v_data)
+ * pvp - parent vnode (GFS directory)
+ * ops - vnode operations vector
+ *
+ * In order to use this interface, the parent vnode must have been created by
+ * gfs_dir_create(), and the private data stored in v_data must have a
+ * 'gfs_file_t' as its first field.
+ *
+ * Given these constraints, this routine will automatically:
+ *
+ * - Allocate v_data for the vnode
+ * - Initialize necessary fields in the vnode
+ * - Hold the parent
+ */
+vnode_t *
+gfs_file_create(size_t size, vnode_t *pvp, vfs_t *vfsp, vnodeops_t *ops)
+{
+ gfs_file_t *fp;
+ vnode_t *vp;
+ int error;
+
+ /*
+ * Allocate vnode and internal data structure
+ */
+ fp = kmem_zalloc(size, KM_SLEEP);
+ error = getnewvnode("zfs", vfsp, ops, &vp);
+ ASSERT(error == 0);
+ vp->v_data = (caddr_t)fp;
+
+ /*
+ * Set up various pointers
+ */
+ fp->gfs_vnode = vp;
+ fp->gfs_parent = pvp;
+ fp->gfs_size = size;
+ fp->gfs_type = GFS_FILE;
+
+ error = insmntque(vp, vfsp);
+ KASSERT(error == 0, ("insmntque() failed: error %d", error));
+
+ /*
+ * Initialize vnode and hold parent.
+ */
+ if (pvp)
+ VN_HOLD(pvp);
+
+ return (vp);
+}
+
+/*
+ * gfs_dir_create: creates a new directory in the parent
+ *
+ * size - size of private data structure (v_data)
+ * pvp - parent vnode (GFS directory)
+ * ops - vnode operations vector
+ * entries - NULL-terminated list of static entries (if any)
+ * maxlen - maximum length of a directory entry
+ * readdir_cb - readdir callback (see gfs_dir_readdir)
+ * inode_cb - inode callback (see gfs_dir_readdir)
+ * lookup_cb - lookup callback (see gfs_dir_lookup)
+ *
+ * In order to use this function, the first member of the private vnode
+ * structure (v_data) must be a gfs_dir_t. For each directory, there are
+ * static entries, defined when the structure is initialized, and dynamic
+ * entries, retrieved through callbacks.
+ *
+ * If a directory has static entries, then it must supply a inode callback,
+ * which will compute the inode number based on the parent and the index.
+ * For a directory with dynamic entries, the caller must supply a readdir
+ * callback and a lookup callback. If a static lookup fails, we fall back to
+ * the supplied lookup callback, if any.
+ *
+ * This function also performs the same initialization as gfs_file_create().
+ */
+vnode_t *
+gfs_dir_create(size_t struct_size, vnode_t *pvp, vfs_t *vfsp, vnodeops_t *ops,
+ gfs_dirent_t *entries, gfs_inode_cb inode_cb, int maxlen,
+ gfs_readdir_cb readdir_cb, gfs_lookup_cb lookup_cb)
+{
+ vnode_t *vp;
+ gfs_dir_t *dp;
+ gfs_dirent_t *de;
+
+ vp = gfs_file_create(struct_size, pvp, vfsp, ops);
+ vp->v_type = VDIR;
+
+ dp = vp->v_data;
+ dp->gfsd_file.gfs_type = GFS_DIR;
+ dp->gfsd_maxlen = maxlen;
+
+ if (entries != NULL) {
+ for (de = entries; de->gfse_name != NULL; de++)
+ dp->gfsd_nstatic++;
+
+ dp->gfsd_static = kmem_alloc(
+ dp->gfsd_nstatic * sizeof (gfs_dirent_t), KM_SLEEP);
+ bcopy(entries, dp->gfsd_static,
+ dp->gfsd_nstatic * sizeof (gfs_dirent_t));
+ }
+
+ dp->gfsd_readdir = readdir_cb;
+ dp->gfsd_lookup = lookup_cb;
+ dp->gfsd_inode = inode_cb;
+
+ mutex_init(&dp->gfsd_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ return (vp);
+}
+
+/*
+ * gfs_root_create(): create a root vnode for a GFS filesystem
+ *
+ * Similar to gfs_dir_create(), this creates a root vnode for a filesystem. The
+ * only difference is that it takes a vfs_t instead of a vnode_t as its parent.
+ */
+vnode_t *
+gfs_root_create(size_t size, vfs_t *vfsp, vnodeops_t *ops, ino64_t ino,
+ gfs_dirent_t *entries, gfs_inode_cb inode_cb, int maxlen,
+ gfs_readdir_cb readdir_cb, gfs_lookup_cb lookup_cb)
+{
+ vnode_t *vp;
+
+ VFS_HOLD(vfsp);
+ vp = gfs_dir_create(size, NULL, vfsp, ops, entries, inode_cb,
+ maxlen, readdir_cb, lookup_cb);
+ /* Manually set the inode */
+ ((gfs_file_t *)vp->v_data)->gfs_ino = ino;
+ vp->v_flag |= VROOT;
+
+ return (vp);
+}
+
+/*
+ * gfs_file_inactive()
+ *
+ * Called from the VOP_INACTIVE() routine. If necessary, this routine will
+ * remove the given vnode from the parent directory and clean up any references
+ * in the VFS layer.
+ *
+ * If the vnode was not removed (due to a race with vget), then NULL is
+ * returned. Otherwise, a pointer to the private data is returned.
+ */
+void *
+gfs_file_inactive(vnode_t *vp)
+{
+ int i;
+ gfs_dirent_t *ge = NULL;
+ gfs_file_t *fp = vp->v_data;
+ gfs_dir_t *dp = NULL;
+ void *data;
+
+ if (fp->gfs_parent == NULL)
+ goto found;
+
+ dp = fp->gfs_parent->v_data;
+
+ /*
+ * First, see if this vnode is cached in the parent.
+ */
+ gfs_dir_lock(dp);
+
+ /*
+ * Find it in the set of static entries.
+ */
+ for (i = 0; i < dp->gfsd_nstatic; i++) {
+ ge = &dp->gfsd_static[i];
+
+ if (ge->gfse_vnode == vp)
+ goto found;
+ }
+
+ /*
+ * If 'ge' is NULL, then it is a dynamic entry.
+ */
+ ge = NULL;
+
+found:
+ VI_LOCK(vp);
+ ASSERT(vp->v_count < 2);
+ /*
+ * Really remove this vnode
+ */
+ data = vp->v_data;
+ if (ge != NULL) {
+ /*
+ * If this was a statically cached entry, simply set the
+ * cached vnode to NULL.
+ */
+ ge->gfse_vnode = NULL;
+ }
+ if (vp->v_count == 1) {
+ vp->v_usecount--;
+ vdropl(vp);
+ } else {
+ VI_UNLOCK(vp);
+ }
+
+ /*
+ * Free vnode and release parent
+ */
+ if (fp->gfs_parent) {
+ gfs_dir_unlock(dp);
+ VI_LOCK(fp->gfs_parent);
+ fp->gfs_parent->v_usecount--;
+ VI_UNLOCK(fp->gfs_parent);
+ } else {
+ ASSERT(vp->v_vfsp != NULL);
+ VFS_RELE(vp->v_vfsp);
+ }
+
+ return (data);
+}
+
+/*
+ * gfs_dir_inactive()
+ *
+ * Same as above, but for directories.
+ */
+void *
+gfs_dir_inactive(vnode_t *vp)
+{
+ gfs_dir_t *dp;
+
+ ASSERT(vp->v_type == VDIR);
+
+ if ((dp = gfs_file_inactive(vp)) != NULL) {
+ mutex_destroy(&dp->gfsd_lock);
+ if (dp->gfsd_nstatic)
+ kmem_free(dp->gfsd_static,
+ dp->gfsd_nstatic * sizeof (gfs_dirent_t));
+ }
+
+ return (dp);
+}
+
+/*
+ * gfs_dir_lookup()
+ *
+ * Looks up the given name in the directory and returns the corresponding vnode,
+ * if found.
+ *
+ * First, we search statically defined entries, if any. If a match is found,
+ * and GFS_CACHE_VNODE is set and the vnode exists, we simply return the
+ * existing vnode. Otherwise, we call the static entry's callback routine,
+ * caching the result if necessary.
+ *
+ * If no static entry is found, we invoke the lookup callback, if any. The
+ * arguments to this callback are:
+ *
+ * int gfs_lookup_cb(vnode_t *pvp, const char *nm, vnode_t **vpp);
+ *
+ * pvp - parent vnode
+ * nm - name of entry
+ * vpp - pointer to resulting vnode
+ *
+ * Returns 0 on success, non-zero on error.
+ */
+int
+gfs_dir_lookup(vnode_t *dvp, const char *nm, vnode_t **vpp)
+{
+ int i;
+ gfs_dirent_t *ge;
+ vnode_t *vp;
+ gfs_dir_t *dp = dvp->v_data;
+ int ret = 0;
+
+ ASSERT(dvp->v_type == VDIR);
+
+ if (gfs_lookup_dot(vpp, dvp, dp->gfsd_file.gfs_parent, nm) == 0)
+ return (0);
+
+ gfs_dir_lock(dp);
+
+ /*
+ * Search static entries.
+ */
+ for (i = 0; i < dp->gfsd_nstatic; i++) {
+ ge = &dp->gfsd_static[i];
+
+ if (strcmp(ge->gfse_name, nm) == 0) {
+ if (ge->gfse_vnode) {
+ ASSERT(ge->gfse_flags & GFS_CACHE_VNODE);
+ vp = ge->gfse_vnode;
+ VN_HOLD(vp);
+ goto out;
+ }
+
+ /*
+ * We drop the directory lock, as the constructor will
+ * need to do KM_SLEEP allocations. If we return from
+ * the constructor only to find that a parallel
+ * operation has completed, and GFS_CACHE_VNODE is set
+ * for this entry, we discard the result in favor of the
+ * cached vnode.
+ */
+ gfs_dir_unlock(dp);
+ vp = ge->gfse_ctor(dvp);
+ gfs_dir_lock(dp);
+
+ ((gfs_file_t *)vp->v_data)->gfs_index = i;
+
+ /* Set the inode according to the callback. */
+ ((gfs_file_t *)vp->v_data)->gfs_ino =
+ dp->gfsd_inode(dvp, i);
+
+ if (ge->gfse_flags & GFS_CACHE_VNODE) {
+ if (ge->gfse_vnode == NULL) {
+ ge->gfse_vnode = vp;
+ } else {
+ /*
+ * A parallel constructor beat us to it;
+ * return existing vnode. We have to be
+ * careful because we can't release the
+ * current vnode while holding the
+ * directory lock; its inactive routine
+ * will try to lock this directory.
+ */
+ vnode_t *oldvp = vp;
+ vp = ge->gfse_vnode;
+ VN_HOLD(vp);
+
+ gfs_dir_unlock(dp);
+ VN_RELE(oldvp);
+ gfs_dir_lock(dp);
+ }
+ }
+
+ goto out;
+ }
+ }
+
+ /*
+ * See if there is a dynamic constructor.
+ */
+ if (dp->gfsd_lookup) {
+ ino64_t ino;
+ gfs_file_t *fp;
+
+ /*
+ * Once again, drop the directory lock, as the lookup routine
+ * will need to allocate memory, or otherwise deadlock on this
+ * directory.
+ */
+ gfs_dir_unlock(dp);
+ ret = dp->gfsd_lookup(dvp, nm, &vp, &ino);
+ gfs_dir_lock(dp);
+ if (ret != 0)
+ goto out;
+
+ fp = (gfs_file_t *)vp->v_data;
+ fp->gfs_index = -1;
+ fp->gfs_ino = ino;
+ } else {
+ /*
+ * No static entry found, and there is no lookup callback, so
+ * return ENOENT.
+ */
+ ret = ENOENT;
+ }
+
+out:
+ gfs_dir_unlock(dp);
+
+ if (ret == 0)
+ *vpp = vp;
+ else
+ *vpp = NULL;
+
+ return (ret);
+}
+
+/*
+ * gfs_dir_readdir: does a readdir() on the given directory
+ *
+ * dvp - directory vnode
+ * uiop - uio structure
+ * eofp - eof pointer
+ * data - arbitrary data passed to readdir callback
+ *
+ * This routine does all the readdir() dirty work. Even so, the caller must
+ * supply two callbacks in order to get full compatibility.
+ *
+ * If the directory contains static entries, an inode callback must be
+ * specified. This avoids having to create every vnode and call VOP_GETATTR()
+ * when reading the directory. This function has the following arguments:
+ *
+ * ino_t gfs_inode_cb(vnode_t *vp, int index);
+ *
+ * vp - vnode for the directory
+ * index - index in original gfs_dirent_t array
+ *
+ * Returns the inode number for the given entry.
+ *
+ * For directories with dynamic entries, a readdir callback must be provided.
+ * This is significantly more complex, thanks to the particulars of
+ * VOP_READDIR().
+ *
+ * int gfs_readdir_cb(vnode_t *vp, struct dirent64 *dp, int *eofp,
+ * offset_t *off, offset_t *nextoff, void *data)
+ *
+ * vp - directory vnode
+ * dp - directory entry, sized according to maxlen given to
+ * gfs_dir_create(). callback must fill in d_name and
+ * d_ino.
+ * eofp - callback must set to 1 when EOF has been reached
+ * off - on entry, the last offset read from the directory. Callback
+ * must set to the offset of the current entry, typically left
+ * untouched.
+ * nextoff - callback must set to offset of next entry. Typically
+ * (off + 1)
+ * data - caller-supplied data
+ *
+ * Return 0 on success, or error on failure.
+ */
+int
+gfs_dir_readdir(vnode_t *dvp, uio_t *uiop, int *eofp, int *ncookies,
+ u_long **cookies, void *data)
+{
+ gfs_readdir_state_t gstate;
+ int error, eof = 0;
+ ino64_t ino, pino;
+ offset_t off, next;
+ gfs_dir_t *dp = dvp->v_data;
+
+ ino = dp->gfsd_file.gfs_ino;
+
+ if (dp->gfsd_file.gfs_parent == NULL)
+ pino = ino; /* root of filesystem */
+ else
+ pino = ((gfs_file_t *)
+ (dp->gfsd_file.gfs_parent->v_data))->gfs_ino;
+
+ if ((error = gfs_readdir_init(&gstate, dp->gfsd_maxlen, 1, uiop,
+ pino, ino)) != 0)
+ return (error);
+
+ while ((error = gfs_readdir_pred(&gstate, uiop, &off, ncookies,
+ cookies)) == 0 && !eof) {
+
+ if (off >= 0 && off < dp->gfsd_nstatic) {
+ ino = dp->gfsd_inode(dvp, off);
+
+ if ((error = gfs_readdir_emit(&gstate, uiop,
+ off, ino, dp->gfsd_static[off].gfse_name, ncookies,
+ cookies)) != 0)
+ break;
+
+ } else if (dp->gfsd_readdir) {
+ off -= dp->gfsd_nstatic;
+
+ if ((error = dp->gfsd_readdir(dvp,
+ gstate.grd_dirent, &eof, &off, &next,
+ data)) != 0 || eof)
+ break;
+
+ off += dp->gfsd_nstatic + 2;
+ next += dp->gfsd_nstatic + 2;
+
+ if ((error = gfs_readdir_emit_int(&gstate, uiop,
+ next, ncookies, cookies)) != 0)
+ break;
+ } else {
+ /*
+ * Offset is beyond the end of the static entries, and
+ * we have no dynamic entries. Set EOF.
+ */
+ eof = 1;
+ }
+ }
+
+ return (gfs_readdir_fini(&gstate, error, eofp, eof));
+}
+
+/*
+ * gfs_vop_readdir: VOP_READDIR() entry point
+ *
+ * For use directly in vnode ops table. Given a GFS directory, calls
+ * gfs_dir_readdir() as necessary.
+ */
+/* ARGSUSED */
+int
+gfs_vop_readdir(ap)
+ struct vop_readdir_args /* {
+ struct vnode *a_vp;
+ struct uio *a_uio;
+ struct ucred *a_cred;
+ int *a_eofflag;
+ int *ncookies;
+ u_long **a_cookies;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+ uio_t *uiop = ap->a_uio;
+ int *eofp = ap->a_eofflag;
+ int ncookies = 0;
+ u_long *cookies = NULL;
+ int error;
+
+ if (ap->a_ncookies) {
+ /*
+ * Minimum entry size is dirent size and 1 byte for a file name.
+ */
+ ncookies = uiop->uio_resid / (sizeof(struct dirent) - sizeof(((struct dirent *)NULL)->d_name) + 1);
+ cookies = malloc(ncookies * sizeof(u_long), M_TEMP, M_WAITOK);
+ *ap->a_cookies = cookies;
+ *ap->a_ncookies = ncookies;
+ }
+
+ error = gfs_dir_readdir(vp, uiop, eofp, &ncookies, &cookies, NULL);
+
+ if (error == 0) {
+ /* Subtract unused cookies */
+ if (ap->a_ncookies)
+ *ap->a_ncookies -= ncookies;
+ } else if (ap->a_ncookies) {
+ free(*ap->a_cookies, M_TEMP);
+ *ap->a_cookies = NULL;
+ *ap->a_ncookies = 0;
+ }
+
+ return (error);
+}
+
+/*
+ * gfs_vop_inactive: VOP_INACTIVE() entry point
+ *
+ * Given a vnode that is a GFS file or directory, call gfs_file_inactive() or
+ * gfs_dir_inactive() as necessary, and kmem_free()s associated private data.
+ */
+/* ARGSUSED */
+int
+gfs_vop_inactive(ap)
+ struct vop_inactive_args /* {
+ struct vnode *a_vp;
+ struct thread *a_td;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+ gfs_file_t *fp = vp->v_data;
+ void *data;
+
+ if (fp->gfs_type == GFS_DIR)
+ data = gfs_dir_inactive(vp);
+ else
+ data = gfs_file_inactive(vp);
+
+ if (data != NULL)
+ kmem_free(data, fp->gfs_size);
+ vp->v_data = NULL;
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/arc.c b/sys/contrib/opensolaris/uts/common/fs/zfs/arc.c
new file mode 100644
index 0000000..89cbc1f
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/arc.c
@@ -0,0 +1,2858 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * DVA-based Adjustable Replacement Cache
+ *
+ * While much of the theory of operation used here is
+ * based on the self-tuning, low overhead replacement cache
+ * presented by Megiddo and Modha at FAST 2003, there are some
+ * significant differences:
+ *
+ * 1. The Megiddo and Modha model assumes any page is evictable.
+ * Pages in its cache cannot be "locked" into memory. This makes
+ * the eviction algorithm simple: evict the last page in the list.
+ * This also make the performance characteristics easy to reason
+ * about. Our cache is not so simple. At any given moment, some
+ * subset of the blocks in the cache are un-evictable because we
+ * have handed out a reference to them. Blocks are only evictable
+ * when there are no external references active. This makes
+ * eviction far more problematic: we choose to evict the evictable
+ * blocks that are the "lowest" in the list.
+ *
+ * There are times when it is not possible to evict the requested
+ * space. In these circumstances we are unable to adjust the cache
+ * size. To prevent the cache growing unbounded at these times we
+ * implement a "cache throttle" that slowes the flow of new data
+ * into the cache until we can make space avaiable.
+ *
+ * 2. The Megiddo and Modha model assumes a fixed cache size.
+ * Pages are evicted when the cache is full and there is a cache
+ * miss. Our model has a variable sized cache. It grows with
+ * high use, but also tries to react to memory preasure from the
+ * operating system: decreasing its size when system memory is
+ * tight.
+ *
+ * 3. The Megiddo and Modha model assumes a fixed page size. All
+ * elements of the cache are therefor exactly the same size. So
+ * when adjusting the cache size following a cache miss, its simply
+ * a matter of choosing a single page to evict. In our model, we
+ * have variable sized cache blocks (rangeing from 512 bytes to
+ * 128K bytes). We therefor choose a set of blocks to evict to make
+ * space for a cache miss that approximates as closely as possible
+ * the space used by the new block.
+ *
+ * See also: "ARC: A Self-Tuning, Low Overhead Replacement Cache"
+ * by N. Megiddo & D. Modha, FAST 2003
+ */
+
+/*
+ * The locking model:
+ *
+ * A new reference to a cache buffer can be obtained in two
+ * ways: 1) via a hash table lookup using the DVA as a key,
+ * or 2) via one of the ARC lists. The arc_read() inerface
+ * uses method 1, while the internal arc algorithms for
+ * adjusting the cache use method 2. We therefor provide two
+ * types of locks: 1) the hash table lock array, and 2) the
+ * arc list locks.
+ *
+ * Buffers do not have their own mutexs, rather they rely on the
+ * hash table mutexs for the bulk of their protection (i.e. most
+ * fields in the arc_buf_hdr_t are protected by these mutexs).
+ *
+ * buf_hash_find() returns the appropriate mutex (held) when it
+ * locates the requested buffer in the hash table. It returns
+ * NULL for the mutex if the buffer was not in the table.
+ *
+ * buf_hash_remove() expects the appropriate hash mutex to be
+ * already held before it is invoked.
+ *
+ * Each arc state also has a mutex which is used to protect the
+ * buffer list associated with the state. When attempting to
+ * obtain a hash table lock while holding an arc list lock you
+ * must use: mutex_tryenter() to avoid deadlock. Also note that
+ * the active state mutex must be held before the ghost state mutex.
+ *
+ * Arc buffers may have an associated eviction callback function.
+ * This function will be invoked prior to removing the buffer (e.g.
+ * in arc_do_user_evicts()). Note however that the data associated
+ * with the buffer may be evicted prior to the callback. The callback
+ * must be made with *no locks held* (to prevent deadlock). Additionally,
+ * the users of callbacks must ensure that their private data is
+ * protected from simultaneous callbacks from arc_buf_evict()
+ * and arc_do_user_evicts().
+ *
+ * Note that the majority of the performance stats are manipulated
+ * with atomic operations.
+ */
+
+#include <sys/spa.h>
+#include <sys/zio.h>
+#include <sys/zio_checksum.h>
+#include <sys/zfs_context.h>
+#include <sys/arc.h>
+#include <sys/refcount.h>
+#ifdef _KERNEL
+#include <sys/dnlc.h>
+#endif
+#include <sys/callb.h>
+#include <sys/kstat.h>
+#include <sys/sdt.h>
+
+static kmutex_t arc_reclaim_thr_lock;
+static kcondvar_t arc_reclaim_thr_cv; /* used to signal reclaim thr */
+static uint8_t arc_thread_exit;
+
+#define ARC_REDUCE_DNLC_PERCENT 3
+uint_t arc_reduce_dnlc_percent = ARC_REDUCE_DNLC_PERCENT;
+
+typedef enum arc_reclaim_strategy {
+ ARC_RECLAIM_AGGR, /* Aggressive reclaim strategy */
+ ARC_RECLAIM_CONS /* Conservative reclaim strategy */
+} arc_reclaim_strategy_t;
+
+/* number of seconds before growing cache again */
+static int arc_grow_retry = 60;
+
+/*
+ * minimum lifespan of a prefetch block in clock ticks
+ * (initialized in arc_init())
+ */
+static int arc_min_prefetch_lifespan;
+
+static int arc_dead;
+
+/*
+ * These tunables are for performance analysis.
+ */
+u_long zfs_arc_max;
+u_long zfs_arc_min;
+TUNABLE_ULONG("vfs.zfs.arc_max", &zfs_arc_max);
+TUNABLE_ULONG("vfs.zfs.arc_min", &zfs_arc_min);
+SYSCTL_DECL(_vfs_zfs);
+SYSCTL_ULONG(_vfs_zfs, OID_AUTO, arc_max, CTLFLAG_RD, &zfs_arc_max, 0,
+ "Maximum ARC size");
+SYSCTL_ULONG(_vfs_zfs, OID_AUTO, arc_min, CTLFLAG_RD, &zfs_arc_min, 0,
+ "Minimum ARC size");
+
+/*
+ * Note that buffers can be on one of 5 states:
+ * ARC_anon - anonymous (discussed below)
+ * ARC_mru - recently used, currently cached
+ * ARC_mru_ghost - recentely used, no longer in cache
+ * ARC_mfu - frequently used, currently cached
+ * ARC_mfu_ghost - frequently used, no longer in cache
+ * When there are no active references to the buffer, they
+ * are linked onto one of the lists in arc. These are the
+ * only buffers that can be evicted or deleted.
+ *
+ * Anonymous buffers are buffers that are not associated with
+ * a DVA. These are buffers that hold dirty block copies
+ * before they are written to stable storage. By definition,
+ * they are "ref'd" and are considered part of arc_mru
+ * that cannot be freed. Generally, they will aquire a DVA
+ * as they are written and migrate onto the arc_mru list.
+ */
+
+typedef struct arc_state {
+ list_t arcs_list; /* linked list of evictable buffer in state */
+ uint64_t arcs_lsize; /* total size of buffers in the linked list */
+ uint64_t arcs_size; /* total size of all buffers in this state */
+ kmutex_t arcs_mtx;
+} arc_state_t;
+
+/* The 5 states: */
+static arc_state_t ARC_anon;
+static arc_state_t ARC_mru;
+static arc_state_t ARC_mru_ghost;
+static arc_state_t ARC_mfu;
+static arc_state_t ARC_mfu_ghost;
+
+typedef struct arc_stats {
+ kstat_named_t arcstat_hits;
+ kstat_named_t arcstat_misses;
+ kstat_named_t arcstat_demand_data_hits;
+ kstat_named_t arcstat_demand_data_misses;
+ kstat_named_t arcstat_demand_metadata_hits;
+ kstat_named_t arcstat_demand_metadata_misses;
+ kstat_named_t arcstat_prefetch_data_hits;
+ kstat_named_t arcstat_prefetch_data_misses;
+ kstat_named_t arcstat_prefetch_metadata_hits;
+ kstat_named_t arcstat_prefetch_metadata_misses;
+ kstat_named_t arcstat_mru_hits;
+ kstat_named_t arcstat_mru_ghost_hits;
+ kstat_named_t arcstat_mfu_hits;
+ kstat_named_t arcstat_mfu_ghost_hits;
+ kstat_named_t arcstat_deleted;
+ kstat_named_t arcstat_recycle_miss;
+ kstat_named_t arcstat_mutex_miss;
+ kstat_named_t arcstat_evict_skip;
+ kstat_named_t arcstat_hash_elements;
+ kstat_named_t arcstat_hash_elements_max;
+ kstat_named_t arcstat_hash_collisions;
+ kstat_named_t arcstat_hash_chains;
+ kstat_named_t arcstat_hash_chain_max;
+ kstat_named_t arcstat_p;
+ kstat_named_t arcstat_c;
+ kstat_named_t arcstat_c_min;
+ kstat_named_t arcstat_c_max;
+ kstat_named_t arcstat_size;
+} arc_stats_t;
+
+static arc_stats_t arc_stats = {
+ { "hits", KSTAT_DATA_UINT64 },
+ { "misses", KSTAT_DATA_UINT64 },
+ { "demand_data_hits", KSTAT_DATA_UINT64 },
+ { "demand_data_misses", KSTAT_DATA_UINT64 },
+ { "demand_metadata_hits", KSTAT_DATA_UINT64 },
+ { "demand_metadata_misses", KSTAT_DATA_UINT64 },
+ { "prefetch_data_hits", KSTAT_DATA_UINT64 },
+ { "prefetch_data_misses", KSTAT_DATA_UINT64 },
+ { "prefetch_metadata_hits", KSTAT_DATA_UINT64 },
+ { "prefetch_metadata_misses", KSTAT_DATA_UINT64 },
+ { "mru_hits", KSTAT_DATA_UINT64 },
+ { "mru_ghost_hits", KSTAT_DATA_UINT64 },
+ { "mfu_hits", KSTAT_DATA_UINT64 },
+ { "mfu_ghost_hits", KSTAT_DATA_UINT64 },
+ { "deleted", KSTAT_DATA_UINT64 },
+ { "recycle_miss", KSTAT_DATA_UINT64 },
+ { "mutex_miss", KSTAT_DATA_UINT64 },
+ { "evict_skip", KSTAT_DATA_UINT64 },
+ { "hash_elements", KSTAT_DATA_UINT64 },
+ { "hash_elements_max", KSTAT_DATA_UINT64 },
+ { "hash_collisions", KSTAT_DATA_UINT64 },
+ { "hash_chains", KSTAT_DATA_UINT64 },
+ { "hash_chain_max", KSTAT_DATA_UINT64 },
+ { "p", KSTAT_DATA_UINT64 },
+ { "c", KSTAT_DATA_UINT64 },
+ { "c_min", KSTAT_DATA_UINT64 },
+ { "c_max", KSTAT_DATA_UINT64 },
+ { "size", KSTAT_DATA_UINT64 }
+};
+
+#define ARCSTAT(stat) (arc_stats.stat.value.ui64)
+
+#define ARCSTAT_INCR(stat, val) \
+ atomic_add_64(&arc_stats.stat.value.ui64, (val));
+
+#define ARCSTAT_BUMP(stat) ARCSTAT_INCR(stat, 1)
+#define ARCSTAT_BUMPDOWN(stat) ARCSTAT_INCR(stat, -1)
+
+#define ARCSTAT_MAX(stat, val) { \
+ uint64_t m; \
+ while ((val) > (m = arc_stats.stat.value.ui64) && \
+ (m != atomic_cas_64(&arc_stats.stat.value.ui64, m, (val)))) \
+ continue; \
+}
+
+#define ARCSTAT_MAXSTAT(stat) \
+ ARCSTAT_MAX(stat##_max, arc_stats.stat.value.ui64)
+
+/*
+ * We define a macro to allow ARC hits/misses to be easily broken down by
+ * two separate conditions, giving a total of four different subtypes for
+ * each of hits and misses (so eight statistics total).
+ */
+#define ARCSTAT_CONDSTAT(cond1, stat1, notstat1, cond2, stat2, notstat2, stat) \
+ if (cond1) { \
+ if (cond2) { \
+ ARCSTAT_BUMP(arcstat_##stat1##_##stat2##_##stat); \
+ } else { \
+ ARCSTAT_BUMP(arcstat_##stat1##_##notstat2##_##stat); \
+ } \
+ } else { \
+ if (cond2) { \
+ ARCSTAT_BUMP(arcstat_##notstat1##_##stat2##_##stat); \
+ } else { \
+ ARCSTAT_BUMP(arcstat_##notstat1##_##notstat2##_##stat);\
+ } \
+ }
+
+kstat_t *arc_ksp;
+static arc_state_t *arc_anon;
+static arc_state_t *arc_mru;
+static arc_state_t *arc_mru_ghost;
+static arc_state_t *arc_mfu;
+static arc_state_t *arc_mfu_ghost;
+
+/*
+ * There are several ARC variables that are critical to export as kstats --
+ * but we don't want to have to grovel around in the kstat whenever we wish to
+ * manipulate them. For these variables, we therefore define them to be in
+ * terms of the statistic variable. This assures that we are not introducing
+ * the possibility of inconsistency by having shadow copies of the variables,
+ * while still allowing the code to be readable.
+ */
+#define arc_size ARCSTAT(arcstat_size) /* actual total arc size */
+#define arc_p ARCSTAT(arcstat_p) /* target size of MRU */
+#define arc_c ARCSTAT(arcstat_c) /* target size of cache */
+#define arc_c_min ARCSTAT(arcstat_c_min) /* min target cache size */
+#define arc_c_max ARCSTAT(arcstat_c_max) /* max target cache size */
+
+static int arc_no_grow; /* Don't try to grow cache size */
+static uint64_t arc_tempreserve;
+
+typedef struct arc_callback arc_callback_t;
+
+struct arc_callback {
+ void *acb_private;
+ arc_done_func_t *acb_done;
+ arc_byteswap_func_t *acb_byteswap;
+ arc_buf_t *acb_buf;
+ zio_t *acb_zio_dummy;
+ arc_callback_t *acb_next;
+};
+
+typedef struct arc_write_callback arc_write_callback_t;
+
+struct arc_write_callback {
+ void *awcb_private;
+ arc_done_func_t *awcb_ready;
+ arc_done_func_t *awcb_done;
+ arc_buf_t *awcb_buf;
+};
+
+struct arc_buf_hdr {
+ /* protected by hash lock */
+ dva_t b_dva;
+ uint64_t b_birth;
+ uint64_t b_cksum0;
+
+ kmutex_t b_freeze_lock;
+ zio_cksum_t *b_freeze_cksum;
+
+ arc_buf_hdr_t *b_hash_next;
+ arc_buf_t *b_buf;
+ uint32_t b_flags;
+ uint32_t b_datacnt;
+
+ arc_callback_t *b_acb;
+ kcondvar_t b_cv;
+
+ /* immutable */
+ arc_buf_contents_t b_type;
+ uint64_t b_size;
+ spa_t *b_spa;
+
+ /* protected by arc state mutex */
+ arc_state_t *b_state;
+ list_node_t b_arc_node;
+
+ /* updated atomically */
+ clock_t b_arc_access;
+
+ /* self protecting */
+ refcount_t b_refcnt;
+};
+
+static arc_buf_t *arc_eviction_list;
+static kmutex_t arc_eviction_mtx;
+static arc_buf_hdr_t arc_eviction_hdr;
+static void arc_get_data_buf(arc_buf_t *buf);
+static void arc_access(arc_buf_hdr_t *buf, kmutex_t *hash_lock);
+
+#define GHOST_STATE(state) \
+ ((state) == arc_mru_ghost || (state) == arc_mfu_ghost)
+
+/*
+ * Private ARC flags. These flags are private ARC only flags that will show up
+ * in b_flags in the arc_hdr_buf_t. Some flags are publicly declared, and can
+ * be passed in as arc_flags in things like arc_read. However, these flags
+ * should never be passed and should only be set by ARC code. When adding new
+ * public flags, make sure not to smash the private ones.
+ */
+
+#define ARC_IN_HASH_TABLE (1 << 9) /* this buffer is hashed */
+#define ARC_IO_IN_PROGRESS (1 << 10) /* I/O in progress for buf */
+#define ARC_IO_ERROR (1 << 11) /* I/O failed for buf */
+#define ARC_FREED_IN_READ (1 << 12) /* buf freed while in read */
+#define ARC_BUF_AVAILABLE (1 << 13) /* block not in active use */
+#define ARC_INDIRECT (1 << 14) /* this is an indirect block */
+
+#define HDR_IN_HASH_TABLE(hdr) ((hdr)->b_flags & ARC_IN_HASH_TABLE)
+#define HDR_IO_IN_PROGRESS(hdr) ((hdr)->b_flags & ARC_IO_IN_PROGRESS)
+#define HDR_IO_ERROR(hdr) ((hdr)->b_flags & ARC_IO_ERROR)
+#define HDR_FREED_IN_READ(hdr) ((hdr)->b_flags & ARC_FREED_IN_READ)
+#define HDR_BUF_AVAILABLE(hdr) ((hdr)->b_flags & ARC_BUF_AVAILABLE)
+
+/*
+ * Hash table routines
+ */
+
+#define HT_LOCK_PAD 128
+
+struct ht_lock {
+ kmutex_t ht_lock;
+#ifdef _KERNEL
+ unsigned char pad[(HT_LOCK_PAD - sizeof (kmutex_t))];
+#endif
+};
+
+#define BUF_LOCKS 256
+typedef struct buf_hash_table {
+ uint64_t ht_mask;
+ arc_buf_hdr_t **ht_table;
+ struct ht_lock ht_locks[BUF_LOCKS];
+} buf_hash_table_t;
+
+static buf_hash_table_t buf_hash_table;
+
+#define BUF_HASH_INDEX(spa, dva, birth) \
+ (buf_hash(spa, dva, birth) & buf_hash_table.ht_mask)
+#define BUF_HASH_LOCK_NTRY(idx) (buf_hash_table.ht_locks[idx & (BUF_LOCKS-1)])
+#define BUF_HASH_LOCK(idx) (&(BUF_HASH_LOCK_NTRY(idx).ht_lock))
+#define HDR_LOCK(buf) \
+ (BUF_HASH_LOCK(BUF_HASH_INDEX(buf->b_spa, &buf->b_dva, buf->b_birth)))
+
+uint64_t zfs_crc64_table[256];
+
+static uint64_t
+buf_hash(spa_t *spa, dva_t *dva, uint64_t birth)
+{
+ uintptr_t spav = (uintptr_t)spa;
+ uint8_t *vdva = (uint8_t *)dva;
+ uint64_t crc = -1ULL;
+ int i;
+
+ ASSERT(zfs_crc64_table[128] == ZFS_CRC64_POLY);
+
+ for (i = 0; i < sizeof (dva_t); i++)
+ crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ vdva[i]) & 0xFF];
+
+ crc ^= (spav>>8) ^ birth;
+
+ return (crc);
+}
+
+#define BUF_EMPTY(buf) \
+ ((buf)->b_dva.dva_word[0] == 0 && \
+ (buf)->b_dva.dva_word[1] == 0 && \
+ (buf)->b_birth == 0)
+
+#define BUF_EQUAL(spa, dva, birth, buf) \
+ ((buf)->b_dva.dva_word[0] == (dva)->dva_word[0]) && \
+ ((buf)->b_dva.dva_word[1] == (dva)->dva_word[1]) && \
+ ((buf)->b_birth == birth) && ((buf)->b_spa == spa)
+
+static arc_buf_hdr_t *
+buf_hash_find(spa_t *spa, dva_t *dva, uint64_t birth, kmutex_t **lockp)
+{
+ uint64_t idx = BUF_HASH_INDEX(spa, dva, birth);
+ kmutex_t *hash_lock = BUF_HASH_LOCK(idx);
+ arc_buf_hdr_t *buf;
+
+ mutex_enter(hash_lock);
+ for (buf = buf_hash_table.ht_table[idx]; buf != NULL;
+ buf = buf->b_hash_next) {
+ if (BUF_EQUAL(spa, dva, birth, buf)) {
+ *lockp = hash_lock;
+ return (buf);
+ }
+ }
+ mutex_exit(hash_lock);
+ *lockp = NULL;
+ return (NULL);
+}
+
+/*
+ * Insert an entry into the hash table. If there is already an element
+ * equal to elem in the hash table, then the already existing element
+ * will be returned and the new element will not be inserted.
+ * Otherwise returns NULL.
+ */
+static arc_buf_hdr_t *
+buf_hash_insert(arc_buf_hdr_t *buf, kmutex_t **lockp)
+{
+ uint64_t idx = BUF_HASH_INDEX(buf->b_spa, &buf->b_dva, buf->b_birth);
+ kmutex_t *hash_lock = BUF_HASH_LOCK(idx);
+ arc_buf_hdr_t *fbuf;
+ uint32_t i;
+
+ ASSERT(!HDR_IN_HASH_TABLE(buf));
+ *lockp = hash_lock;
+ mutex_enter(hash_lock);
+ for (fbuf = buf_hash_table.ht_table[idx], i = 0; fbuf != NULL;
+ fbuf = fbuf->b_hash_next, i++) {
+ if (BUF_EQUAL(buf->b_spa, &buf->b_dva, buf->b_birth, fbuf))
+ return (fbuf);
+ }
+
+ buf->b_hash_next = buf_hash_table.ht_table[idx];
+ buf_hash_table.ht_table[idx] = buf;
+ buf->b_flags |= ARC_IN_HASH_TABLE;
+
+ /* collect some hash table performance data */
+ if (i > 0) {
+ ARCSTAT_BUMP(arcstat_hash_collisions);
+ if (i == 1)
+ ARCSTAT_BUMP(arcstat_hash_chains);
+
+ ARCSTAT_MAX(arcstat_hash_chain_max, i);
+ }
+
+ ARCSTAT_BUMP(arcstat_hash_elements);
+ ARCSTAT_MAXSTAT(arcstat_hash_elements);
+
+ return (NULL);
+}
+
+static void
+buf_hash_remove(arc_buf_hdr_t *buf)
+{
+ arc_buf_hdr_t *fbuf, **bufp;
+ uint64_t idx = BUF_HASH_INDEX(buf->b_spa, &buf->b_dva, buf->b_birth);
+
+ ASSERT(MUTEX_HELD(BUF_HASH_LOCK(idx)));
+ ASSERT(HDR_IN_HASH_TABLE(buf));
+
+ bufp = &buf_hash_table.ht_table[idx];
+ while ((fbuf = *bufp) != buf) {
+ ASSERT(fbuf != NULL);
+ bufp = &fbuf->b_hash_next;
+ }
+ *bufp = buf->b_hash_next;
+ buf->b_hash_next = NULL;
+ buf->b_flags &= ~ARC_IN_HASH_TABLE;
+
+ /* collect some hash table performance data */
+ ARCSTAT_BUMPDOWN(arcstat_hash_elements);
+
+ if (buf_hash_table.ht_table[idx] &&
+ buf_hash_table.ht_table[idx]->b_hash_next == NULL)
+ ARCSTAT_BUMPDOWN(arcstat_hash_chains);
+}
+
+/*
+ * Global data structures and functions for the buf kmem cache.
+ */
+static kmem_cache_t *hdr_cache;
+static kmem_cache_t *buf_cache;
+
+static void
+buf_fini(void)
+{
+ int i;
+
+ kmem_free(buf_hash_table.ht_table,
+ (buf_hash_table.ht_mask + 1) * sizeof (void *));
+ for (i = 0; i < BUF_LOCKS; i++)
+ mutex_destroy(&buf_hash_table.ht_locks[i].ht_lock);
+ kmem_cache_destroy(hdr_cache);
+ kmem_cache_destroy(buf_cache);
+}
+
+/*
+ * Constructor callback - called when the cache is empty
+ * and a new buf is requested.
+ */
+/* ARGSUSED */
+static int
+hdr_cons(void *vbuf, void *unused, int kmflag)
+{
+ arc_buf_hdr_t *buf = vbuf;
+
+ bzero(buf, sizeof (arc_buf_hdr_t));
+ refcount_create(&buf->b_refcnt);
+ cv_init(&buf->b_cv, NULL, CV_DEFAULT, NULL);
+ return (0);
+}
+
+/*
+ * Destructor callback - called when a cached buf is
+ * no longer required.
+ */
+/* ARGSUSED */
+static void
+hdr_dest(void *vbuf, void *unused)
+{
+ arc_buf_hdr_t *buf = vbuf;
+
+ refcount_destroy(&buf->b_refcnt);
+ cv_destroy(&buf->b_cv);
+}
+
+/*
+ * Reclaim callback -- invoked when memory is low.
+ */
+/* ARGSUSED */
+static void
+hdr_recl(void *unused)
+{
+ dprintf("hdr_recl called\n");
+ /*
+ * umem calls the reclaim func when we destroy the buf cache,
+ * which is after we do arc_fini().
+ */
+ if (!arc_dead)
+ cv_signal(&arc_reclaim_thr_cv);
+}
+
+static void
+buf_init(void)
+{
+ uint64_t *ct;
+ uint64_t hsize = 1ULL << 12;
+ int i, j;
+
+ /*
+ * The hash table is big enough to fill all of physical memory
+ * with an average 64K block size. The table will take up
+ * totalmem*sizeof(void*)/64K (eg. 128KB/GB with 8-byte pointers).
+ */
+ while (hsize * 65536 < (uint64_t)physmem * PAGESIZE)
+ hsize <<= 1;
+retry:
+ buf_hash_table.ht_mask = hsize - 1;
+ buf_hash_table.ht_table =
+ kmem_zalloc(hsize * sizeof (void*), KM_NOSLEEP);
+ if (buf_hash_table.ht_table == NULL) {
+ ASSERT(hsize > (1ULL << 8));
+ hsize >>= 1;
+ goto retry;
+ }
+
+ hdr_cache = kmem_cache_create("arc_buf_hdr_t", sizeof (arc_buf_hdr_t),
+ 0, hdr_cons, hdr_dest, hdr_recl, NULL, NULL, 0);
+ buf_cache = kmem_cache_create("arc_buf_t", sizeof (arc_buf_t),
+ 0, NULL, NULL, NULL, NULL, NULL, 0);
+
+ for (i = 0; i < 256; i++)
+ for (ct = zfs_crc64_table + i, *ct = i, j = 8; j > 0; j--)
+ *ct = (*ct >> 1) ^ (-(*ct & 1) & ZFS_CRC64_POLY);
+
+ for (i = 0; i < BUF_LOCKS; i++) {
+ mutex_init(&buf_hash_table.ht_locks[i].ht_lock,
+ NULL, MUTEX_DEFAULT, NULL);
+ }
+}
+
+#define ARC_MINTIME (hz>>4) /* 62 ms */
+
+static void
+arc_cksum_verify(arc_buf_t *buf)
+{
+ zio_cksum_t zc;
+
+ if (!(zfs_flags & ZFS_DEBUG_MODIFY))
+ return;
+
+ mutex_enter(&buf->b_hdr->b_freeze_lock);
+ if (buf->b_hdr->b_freeze_cksum == NULL ||
+ (buf->b_hdr->b_flags & ARC_IO_ERROR)) {
+ mutex_exit(&buf->b_hdr->b_freeze_lock);
+ return;
+ }
+ fletcher_2_native(buf->b_data, buf->b_hdr->b_size, &zc);
+ if (!ZIO_CHECKSUM_EQUAL(*buf->b_hdr->b_freeze_cksum, zc))
+ panic("buffer modified while frozen!");
+ mutex_exit(&buf->b_hdr->b_freeze_lock);
+}
+
+static void
+arc_cksum_compute(arc_buf_t *buf)
+{
+ if (!(zfs_flags & ZFS_DEBUG_MODIFY))
+ return;
+
+ mutex_enter(&buf->b_hdr->b_freeze_lock);
+ if (buf->b_hdr->b_freeze_cksum != NULL) {
+ mutex_exit(&buf->b_hdr->b_freeze_lock);
+ return;
+ }
+ buf->b_hdr->b_freeze_cksum = kmem_alloc(sizeof (zio_cksum_t), KM_SLEEP);
+ fletcher_2_native(buf->b_data, buf->b_hdr->b_size,
+ buf->b_hdr->b_freeze_cksum);
+ mutex_exit(&buf->b_hdr->b_freeze_lock);
+}
+
+void
+arc_buf_thaw(arc_buf_t *buf)
+{
+ if (!(zfs_flags & ZFS_DEBUG_MODIFY))
+ return;
+
+ if (buf->b_hdr->b_state != arc_anon)
+ panic("modifying non-anon buffer!");
+ if (buf->b_hdr->b_flags & ARC_IO_IN_PROGRESS)
+ panic("modifying buffer while i/o in progress!");
+ arc_cksum_verify(buf);
+ mutex_enter(&buf->b_hdr->b_freeze_lock);
+ if (buf->b_hdr->b_freeze_cksum != NULL) {
+ kmem_free(buf->b_hdr->b_freeze_cksum, sizeof (zio_cksum_t));
+ buf->b_hdr->b_freeze_cksum = NULL;
+ }
+ mutex_exit(&buf->b_hdr->b_freeze_lock);
+}
+
+void
+arc_buf_freeze(arc_buf_t *buf)
+{
+ if (!(zfs_flags & ZFS_DEBUG_MODIFY))
+ return;
+
+ ASSERT(buf->b_hdr->b_freeze_cksum != NULL ||
+ buf->b_hdr->b_state == arc_anon);
+ arc_cksum_compute(buf);
+}
+
+static void
+add_reference(arc_buf_hdr_t *ab, kmutex_t *hash_lock, void *tag)
+{
+ ASSERT(MUTEX_HELD(hash_lock));
+
+ if ((refcount_add(&ab->b_refcnt, tag) == 1) &&
+ (ab->b_state != arc_anon)) {
+ uint64_t delta = ab->b_size * ab->b_datacnt;
+
+ ASSERT(!MUTEX_HELD(&ab->b_state->arcs_mtx));
+ mutex_enter(&ab->b_state->arcs_mtx);
+ ASSERT(list_link_active(&ab->b_arc_node));
+ list_remove(&ab->b_state->arcs_list, ab);
+ if (GHOST_STATE(ab->b_state)) {
+ ASSERT3U(ab->b_datacnt, ==, 0);
+ ASSERT3P(ab->b_buf, ==, NULL);
+ delta = ab->b_size;
+ }
+ ASSERT(delta > 0);
+ ASSERT3U(ab->b_state->arcs_lsize, >=, delta);
+ atomic_add_64(&ab->b_state->arcs_lsize, -delta);
+ mutex_exit(&ab->b_state->arcs_mtx);
+ /* remove the prefetch flag is we get a reference */
+ if (ab->b_flags & ARC_PREFETCH)
+ ab->b_flags &= ~ARC_PREFETCH;
+ }
+}
+
+static int
+remove_reference(arc_buf_hdr_t *ab, kmutex_t *hash_lock, void *tag)
+{
+ int cnt;
+ arc_state_t *state = ab->b_state;
+
+ ASSERT(state == arc_anon || MUTEX_HELD(hash_lock));
+ ASSERT(!GHOST_STATE(state));
+
+ if (((cnt = refcount_remove(&ab->b_refcnt, tag)) == 0) &&
+ (state != arc_anon)) {
+ ASSERT(!MUTEX_HELD(&state->arcs_mtx));
+ mutex_enter(&state->arcs_mtx);
+ ASSERT(!list_link_active(&ab->b_arc_node));
+ list_insert_head(&state->arcs_list, ab);
+ ASSERT(ab->b_datacnt > 0);
+ atomic_add_64(&state->arcs_lsize, ab->b_size * ab->b_datacnt);
+ ASSERT3U(state->arcs_size, >=, state->arcs_lsize);
+ mutex_exit(&state->arcs_mtx);
+ }
+ return (cnt);
+}
+
+/*
+ * Move the supplied buffer to the indicated state. The mutex
+ * for the buffer must be held by the caller.
+ */
+static void
+arc_change_state(arc_state_t *new_state, arc_buf_hdr_t *ab, kmutex_t *hash_lock)
+{
+ arc_state_t *old_state = ab->b_state;
+ int64_t refcnt = refcount_count(&ab->b_refcnt);
+ uint64_t from_delta, to_delta;
+
+ ASSERT(MUTEX_HELD(hash_lock));
+ ASSERT(new_state != old_state);
+ ASSERT(refcnt == 0 || ab->b_datacnt > 0);
+ ASSERT(ab->b_datacnt == 0 || !GHOST_STATE(new_state));
+
+ from_delta = to_delta = ab->b_datacnt * ab->b_size;
+
+ /*
+ * If this buffer is evictable, transfer it from the
+ * old state list to the new state list.
+ */
+ if (refcnt == 0) {
+ if (old_state != arc_anon) {
+ int use_mutex = !MUTEX_HELD(&old_state->arcs_mtx);
+
+ if (use_mutex)
+ mutex_enter(&old_state->arcs_mtx);
+
+ ASSERT(list_link_active(&ab->b_arc_node));
+ list_remove(&old_state->arcs_list, ab);
+
+ /*
+ * If prefetching out of the ghost cache,
+ * we will have a non-null datacnt.
+ */
+ if (GHOST_STATE(old_state) && ab->b_datacnt == 0) {
+ /* ghost elements have a ghost size */
+ ASSERT(ab->b_buf == NULL);
+ from_delta = ab->b_size;
+ }
+ ASSERT3U(old_state->arcs_lsize, >=, from_delta);
+ atomic_add_64(&old_state->arcs_lsize, -from_delta);
+
+ if (use_mutex)
+ mutex_exit(&old_state->arcs_mtx);
+ }
+ if (new_state != arc_anon) {
+ int use_mutex = !MUTEX_HELD(&new_state->arcs_mtx);
+
+ if (use_mutex)
+ mutex_enter(&new_state->arcs_mtx);
+
+ list_insert_head(&new_state->arcs_list, ab);
+
+ /* ghost elements have a ghost size */
+ if (GHOST_STATE(new_state)) {
+ ASSERT(ab->b_datacnt == 0);
+ ASSERT(ab->b_buf == NULL);
+ to_delta = ab->b_size;
+ }
+ atomic_add_64(&new_state->arcs_lsize, to_delta);
+ ASSERT3U(new_state->arcs_size + to_delta, >=,
+ new_state->arcs_lsize);
+
+ if (use_mutex)
+ mutex_exit(&new_state->arcs_mtx);
+ }
+ }
+
+ ASSERT(!BUF_EMPTY(ab));
+ if (new_state == arc_anon && old_state != arc_anon) {
+ buf_hash_remove(ab);
+ }
+
+ /* adjust state sizes */
+ if (to_delta)
+ atomic_add_64(&new_state->arcs_size, to_delta);
+ if (from_delta) {
+ ASSERT3U(old_state->arcs_size, >=, from_delta);
+ atomic_add_64(&old_state->arcs_size, -from_delta);
+ }
+ ab->b_state = new_state;
+}
+
+arc_buf_t *
+arc_buf_alloc(spa_t *spa, int size, void *tag, arc_buf_contents_t type)
+{
+ arc_buf_hdr_t *hdr;
+ arc_buf_t *buf;
+
+ ASSERT3U(size, >, 0);
+ hdr = kmem_cache_alloc(hdr_cache, KM_SLEEP);
+ ASSERT(BUF_EMPTY(hdr));
+ hdr->b_size = size;
+ hdr->b_type = type;
+ hdr->b_spa = spa;
+ hdr->b_state = arc_anon;
+ hdr->b_arc_access = 0;
+ mutex_init(&hdr->b_freeze_lock, NULL, MUTEX_DEFAULT, NULL);
+ buf = kmem_cache_alloc(buf_cache, KM_SLEEP);
+ buf->b_hdr = hdr;
+ buf->b_data = NULL;
+ buf->b_efunc = NULL;
+ buf->b_private = NULL;
+ buf->b_next = NULL;
+ hdr->b_buf = buf;
+ arc_get_data_buf(buf);
+ hdr->b_datacnt = 1;
+ hdr->b_flags = 0;
+ ASSERT(refcount_is_zero(&hdr->b_refcnt));
+ (void) refcount_add(&hdr->b_refcnt, tag);
+
+ return (buf);
+}
+
+static arc_buf_t *
+arc_buf_clone(arc_buf_t *from)
+{
+ arc_buf_t *buf;
+ arc_buf_hdr_t *hdr = from->b_hdr;
+ uint64_t size = hdr->b_size;
+
+ buf = kmem_cache_alloc(buf_cache, KM_SLEEP);
+ buf->b_hdr = hdr;
+ buf->b_data = NULL;
+ buf->b_efunc = NULL;
+ buf->b_private = NULL;
+ buf->b_next = hdr->b_buf;
+ hdr->b_buf = buf;
+ arc_get_data_buf(buf);
+ bcopy(from->b_data, buf->b_data, size);
+ hdr->b_datacnt += 1;
+ return (buf);
+}
+
+void
+arc_buf_add_ref(arc_buf_t *buf, void* tag)
+{
+ arc_buf_hdr_t *hdr;
+ kmutex_t *hash_lock;
+
+ /*
+ * Check to see if this buffer is currently being evicted via
+ * arc_do_user_evicts().
+ */
+ mutex_enter(&arc_eviction_mtx);
+ hdr = buf->b_hdr;
+ if (hdr == NULL) {
+ mutex_exit(&arc_eviction_mtx);
+ return;
+ }
+ hash_lock = HDR_LOCK(hdr);
+ mutex_exit(&arc_eviction_mtx);
+
+ mutex_enter(hash_lock);
+ if (buf->b_data == NULL) {
+ /*
+ * This buffer is evicted.
+ */
+ mutex_exit(hash_lock);
+ return;
+ }
+
+ ASSERT(buf->b_hdr == hdr);
+ ASSERT(hdr->b_state == arc_mru || hdr->b_state == arc_mfu);
+ add_reference(hdr, hash_lock, tag);
+ arc_access(hdr, hash_lock);
+ mutex_exit(hash_lock);
+ ARCSTAT_BUMP(arcstat_hits);
+ ARCSTAT_CONDSTAT(!(hdr->b_flags & ARC_PREFETCH),
+ demand, prefetch, hdr->b_type != ARC_BUFC_METADATA,
+ data, metadata, hits);
+}
+
+static void
+arc_buf_destroy(arc_buf_t *buf, boolean_t recycle, boolean_t all)
+{
+ arc_buf_t **bufp;
+
+ /* free up data associated with the buf */
+ if (buf->b_data) {
+ arc_state_t *state = buf->b_hdr->b_state;
+ uint64_t size = buf->b_hdr->b_size;
+ arc_buf_contents_t type = buf->b_hdr->b_type;
+
+ arc_cksum_verify(buf);
+ if (!recycle) {
+ if (type == ARC_BUFC_METADATA) {
+ zio_buf_free(buf->b_data, size);
+ } else {
+ ASSERT(type == ARC_BUFC_DATA);
+ zio_data_buf_free(buf->b_data, size);
+ }
+ atomic_add_64(&arc_size, -size);
+ }
+ if (list_link_active(&buf->b_hdr->b_arc_node)) {
+ ASSERT(refcount_is_zero(&buf->b_hdr->b_refcnt));
+ ASSERT(state != arc_anon);
+ ASSERT3U(state->arcs_lsize, >=, size);
+ atomic_add_64(&state->arcs_lsize, -size);
+ }
+ ASSERT3U(state->arcs_size, >=, size);
+ atomic_add_64(&state->arcs_size, -size);
+ buf->b_data = NULL;
+ ASSERT(buf->b_hdr->b_datacnt > 0);
+ buf->b_hdr->b_datacnt -= 1;
+ }
+
+ /* only remove the buf if requested */
+ if (!all)
+ return;
+
+ /* remove the buf from the hdr list */
+ for (bufp = &buf->b_hdr->b_buf; *bufp != buf; bufp = &(*bufp)->b_next)
+ continue;
+ *bufp = buf->b_next;
+
+ ASSERT(buf->b_efunc == NULL);
+
+ /* clean up the buf */
+ buf->b_hdr = NULL;
+ kmem_cache_free(buf_cache, buf);
+}
+
+static void
+arc_hdr_destroy(arc_buf_hdr_t *hdr)
+{
+ ASSERT(refcount_is_zero(&hdr->b_refcnt));
+ ASSERT3P(hdr->b_state, ==, arc_anon);
+ ASSERT(!HDR_IO_IN_PROGRESS(hdr));
+
+ if (!BUF_EMPTY(hdr)) {
+ ASSERT(!HDR_IN_HASH_TABLE(hdr));
+ bzero(&hdr->b_dva, sizeof (dva_t));
+ hdr->b_birth = 0;
+ hdr->b_cksum0 = 0;
+ }
+ while (hdr->b_buf) {
+ arc_buf_t *buf = hdr->b_buf;
+
+ if (buf->b_efunc) {
+ mutex_enter(&arc_eviction_mtx);
+ ASSERT(buf->b_hdr != NULL);
+ arc_buf_destroy(hdr->b_buf, FALSE, FALSE);
+ hdr->b_buf = buf->b_next;
+ buf->b_hdr = &arc_eviction_hdr;
+ buf->b_next = arc_eviction_list;
+ arc_eviction_list = buf;
+ mutex_exit(&arc_eviction_mtx);
+ } else {
+ arc_buf_destroy(hdr->b_buf, FALSE, TRUE);
+ }
+ }
+ if (hdr->b_freeze_cksum != NULL) {
+ kmem_free(hdr->b_freeze_cksum, sizeof (zio_cksum_t));
+ hdr->b_freeze_cksum = NULL;
+ }
+ mutex_destroy(&hdr->b_freeze_lock);
+
+ ASSERT(!list_link_active(&hdr->b_arc_node));
+ ASSERT3P(hdr->b_hash_next, ==, NULL);
+ ASSERT3P(hdr->b_acb, ==, NULL);
+ kmem_cache_free(hdr_cache, hdr);
+}
+
+void
+arc_buf_free(arc_buf_t *buf, void *tag)
+{
+ arc_buf_hdr_t *hdr = buf->b_hdr;
+ int hashed = hdr->b_state != arc_anon;
+
+ ASSERT(buf->b_efunc == NULL);
+ ASSERT(buf->b_data != NULL);
+
+ if (hashed) {
+ kmutex_t *hash_lock = HDR_LOCK(hdr);
+
+ mutex_enter(hash_lock);
+ (void) remove_reference(hdr, hash_lock, tag);
+ if (hdr->b_datacnt > 1)
+ arc_buf_destroy(buf, FALSE, TRUE);
+ else
+ hdr->b_flags |= ARC_BUF_AVAILABLE;
+ mutex_exit(hash_lock);
+ } else if (HDR_IO_IN_PROGRESS(hdr)) {
+ int destroy_hdr;
+ /*
+ * We are in the middle of an async write. Don't destroy
+ * this buffer unless the write completes before we finish
+ * decrementing the reference count.
+ */
+ mutex_enter(&arc_eviction_mtx);
+ (void) remove_reference(hdr, NULL, tag);
+ ASSERT(refcount_is_zero(&hdr->b_refcnt));
+ destroy_hdr = !HDR_IO_IN_PROGRESS(hdr);
+ mutex_exit(&arc_eviction_mtx);
+ if (destroy_hdr)
+ arc_hdr_destroy(hdr);
+ } else {
+ if (remove_reference(hdr, NULL, tag) > 0) {
+ ASSERT(HDR_IO_ERROR(hdr));
+ arc_buf_destroy(buf, FALSE, TRUE);
+ } else {
+ arc_hdr_destroy(hdr);
+ }
+ }
+}
+
+int
+arc_buf_remove_ref(arc_buf_t *buf, void* tag)
+{
+ arc_buf_hdr_t *hdr = buf->b_hdr;
+ kmutex_t *hash_lock = HDR_LOCK(hdr);
+ int no_callback = (buf->b_efunc == NULL);
+
+ if (hdr->b_state == arc_anon) {
+ arc_buf_free(buf, tag);
+ return (no_callback);
+ }
+
+ mutex_enter(hash_lock);
+ ASSERT(hdr->b_state != arc_anon);
+ ASSERT(buf->b_data != NULL);
+
+ (void) remove_reference(hdr, hash_lock, tag);
+ if (hdr->b_datacnt > 1) {
+ if (no_callback)
+ arc_buf_destroy(buf, FALSE, TRUE);
+ } else if (no_callback) {
+ ASSERT(hdr->b_buf == buf && buf->b_next == NULL);
+ hdr->b_flags |= ARC_BUF_AVAILABLE;
+ }
+ ASSERT(no_callback || hdr->b_datacnt > 1 ||
+ refcount_is_zero(&hdr->b_refcnt));
+ mutex_exit(hash_lock);
+ return (no_callback);
+}
+
+int
+arc_buf_size(arc_buf_t *buf)
+{
+ return (buf->b_hdr->b_size);
+}
+
+/*
+ * Evict buffers from list until we've removed the specified number of
+ * bytes. Move the removed buffers to the appropriate evict state.
+ * If the recycle flag is set, then attempt to "recycle" a buffer:
+ * - look for a buffer to evict that is `bytes' long.
+ * - return the data block from this buffer rather than freeing it.
+ * This flag is used by callers that are trying to make space for a
+ * new buffer in a full arc cache.
+ */
+static void *
+arc_evict(arc_state_t *state, int64_t bytes, boolean_t recycle,
+ arc_buf_contents_t type)
+{
+ arc_state_t *evicted_state;
+ uint64_t bytes_evicted = 0, skipped = 0, missed = 0;
+ arc_buf_hdr_t *ab, *ab_prev = NULL;
+ kmutex_t *hash_lock;
+ boolean_t have_lock;
+ void *stolen = NULL;
+
+ ASSERT(state == arc_mru || state == arc_mfu);
+
+ evicted_state = (state == arc_mru) ? arc_mru_ghost : arc_mfu_ghost;
+
+ mutex_enter(&state->arcs_mtx);
+ mutex_enter(&evicted_state->arcs_mtx);
+
+ for (ab = list_tail(&state->arcs_list); ab; ab = ab_prev) {
+ ab_prev = list_prev(&state->arcs_list, ab);
+ /* prefetch buffers have a minimum lifespan */
+ if (HDR_IO_IN_PROGRESS(ab) ||
+ (ab->b_flags & (ARC_PREFETCH|ARC_INDIRECT) &&
+ lbolt - ab->b_arc_access < arc_min_prefetch_lifespan)) {
+ skipped++;
+ continue;
+ }
+ /* "lookahead" for better eviction candidate */
+ if (recycle && ab->b_size != bytes &&
+ ab_prev && ab_prev->b_size == bytes)
+ continue;
+ hash_lock = HDR_LOCK(ab);
+ have_lock = MUTEX_HELD(hash_lock);
+ if (have_lock || mutex_tryenter(hash_lock)) {
+ ASSERT3U(refcount_count(&ab->b_refcnt), ==, 0);
+ ASSERT(ab->b_datacnt > 0);
+ while (ab->b_buf) {
+ arc_buf_t *buf = ab->b_buf;
+ if (buf->b_data) {
+ bytes_evicted += ab->b_size;
+ if (recycle && ab->b_type == type &&
+ ab->b_size == bytes) {
+ stolen = buf->b_data;
+ recycle = FALSE;
+ }
+ }
+ if (buf->b_efunc) {
+ mutex_enter(&arc_eviction_mtx);
+ arc_buf_destroy(buf,
+ buf->b_data == stolen, FALSE);
+ ab->b_buf = buf->b_next;
+ buf->b_hdr = &arc_eviction_hdr;
+ buf->b_next = arc_eviction_list;
+ arc_eviction_list = buf;
+ mutex_exit(&arc_eviction_mtx);
+ } else {
+ arc_buf_destroy(buf,
+ buf->b_data == stolen, TRUE);
+ }
+ }
+ ASSERT(ab->b_datacnt == 0);
+ arc_change_state(evicted_state, ab, hash_lock);
+ ASSERT(HDR_IN_HASH_TABLE(ab));
+ ab->b_flags = ARC_IN_HASH_TABLE;
+ DTRACE_PROBE1(arc__evict, arc_buf_hdr_t *, ab);
+ if (!have_lock)
+ mutex_exit(hash_lock);
+ if (bytes >= 0 && bytes_evicted >= bytes)
+ break;
+ } else {
+ missed += 1;
+ }
+ }
+
+ mutex_exit(&evicted_state->arcs_mtx);
+ mutex_exit(&state->arcs_mtx);
+
+ if (bytes_evicted < bytes)
+ dprintf("only evicted %lld bytes from %x",
+ (longlong_t)bytes_evicted, state);
+
+ if (skipped)
+ ARCSTAT_INCR(arcstat_evict_skip, skipped);
+
+ if (missed)
+ ARCSTAT_INCR(arcstat_mutex_miss, missed);
+
+ return (stolen);
+}
+
+/*
+ * Remove buffers from list until we've removed the specified number of
+ * bytes. Destroy the buffers that are removed.
+ */
+static void
+arc_evict_ghost(arc_state_t *state, int64_t bytes)
+{
+ arc_buf_hdr_t *ab, *ab_prev;
+ kmutex_t *hash_lock;
+ uint64_t bytes_deleted = 0;
+ uint64_t bufs_skipped = 0;
+
+ ASSERT(GHOST_STATE(state));
+top:
+ mutex_enter(&state->arcs_mtx);
+ for (ab = list_tail(&state->arcs_list); ab; ab = ab_prev) {
+ ab_prev = list_prev(&state->arcs_list, ab);
+ hash_lock = HDR_LOCK(ab);
+ if (mutex_tryenter(hash_lock)) {
+ ASSERT(!HDR_IO_IN_PROGRESS(ab));
+ ASSERT(ab->b_buf == NULL);
+ arc_change_state(arc_anon, ab, hash_lock);
+ mutex_exit(hash_lock);
+ ARCSTAT_BUMP(arcstat_deleted);
+ bytes_deleted += ab->b_size;
+ arc_hdr_destroy(ab);
+ DTRACE_PROBE1(arc__delete, arc_buf_hdr_t *, ab);
+ if (bytes >= 0 && bytes_deleted >= bytes)
+ break;
+ } else {
+ if (bytes < 0) {
+ mutex_exit(&state->arcs_mtx);
+ mutex_enter(hash_lock);
+ mutex_exit(hash_lock);
+ goto top;
+ }
+ bufs_skipped += 1;
+ }
+ }
+ mutex_exit(&state->arcs_mtx);
+
+ if (bufs_skipped) {
+ ARCSTAT_INCR(arcstat_mutex_miss, bufs_skipped);
+ ASSERT(bytes >= 0);
+ }
+
+ if (bytes_deleted < bytes)
+ dprintf("only deleted %lld bytes from %p",
+ (longlong_t)bytes_deleted, state);
+}
+
+static void
+arc_adjust(void)
+{
+ int64_t top_sz, mru_over, arc_over, todelete;
+
+ top_sz = arc_anon->arcs_size + arc_mru->arcs_size;
+
+ if (top_sz > arc_p && arc_mru->arcs_lsize > 0) {
+ int64_t toevict = MIN(arc_mru->arcs_lsize, top_sz - arc_p);
+ (void) arc_evict(arc_mru, toevict, FALSE, ARC_BUFC_UNDEF);
+ top_sz = arc_anon->arcs_size + arc_mru->arcs_size;
+ }
+
+ mru_over = top_sz + arc_mru_ghost->arcs_size - arc_c;
+
+ if (mru_over > 0) {
+ if (arc_mru_ghost->arcs_lsize > 0) {
+ todelete = MIN(arc_mru_ghost->arcs_lsize, mru_over);
+ arc_evict_ghost(arc_mru_ghost, todelete);
+ }
+ }
+
+ if ((arc_over = arc_size - arc_c) > 0) {
+ int64_t tbl_over;
+
+ if (arc_mfu->arcs_lsize > 0) {
+ int64_t toevict = MIN(arc_mfu->arcs_lsize, arc_over);
+ (void) arc_evict(arc_mfu, toevict, FALSE,
+ ARC_BUFC_UNDEF);
+ }
+
+ tbl_over = arc_size + arc_mru_ghost->arcs_lsize +
+ arc_mfu_ghost->arcs_lsize - arc_c*2;
+
+ if (tbl_over > 0 && arc_mfu_ghost->arcs_lsize > 0) {
+ todelete = MIN(arc_mfu_ghost->arcs_lsize, tbl_over);
+ arc_evict_ghost(arc_mfu_ghost, todelete);
+ }
+ }
+}
+
+static void
+arc_do_user_evicts(void)
+{
+ mutex_enter(&arc_eviction_mtx);
+ while (arc_eviction_list != NULL) {
+ arc_buf_t *buf = arc_eviction_list;
+ arc_eviction_list = buf->b_next;
+ buf->b_hdr = NULL;
+ mutex_exit(&arc_eviction_mtx);
+
+ if (buf->b_efunc != NULL)
+ VERIFY(buf->b_efunc(buf) == 0);
+
+ buf->b_efunc = NULL;
+ buf->b_private = NULL;
+ kmem_cache_free(buf_cache, buf);
+ mutex_enter(&arc_eviction_mtx);
+ }
+ mutex_exit(&arc_eviction_mtx);
+}
+
+/*
+ * Flush all *evictable* data from the cache.
+ * NOTE: this will not touch "active" (i.e. referenced) data.
+ */
+void
+arc_flush(void)
+{
+ while (list_head(&arc_mru->arcs_list))
+ (void) arc_evict(arc_mru, -1, FALSE, ARC_BUFC_UNDEF);
+ while (list_head(&arc_mfu->arcs_list))
+ (void) arc_evict(arc_mfu, -1, FALSE, ARC_BUFC_UNDEF);
+
+ arc_evict_ghost(arc_mru_ghost, -1);
+ arc_evict_ghost(arc_mfu_ghost, -1);
+
+ mutex_enter(&arc_reclaim_thr_lock);
+ arc_do_user_evicts();
+ mutex_exit(&arc_reclaim_thr_lock);
+ ASSERT(arc_eviction_list == NULL);
+}
+
+int arc_shrink_shift = 5; /* log2(fraction of arc to reclaim) */
+
+void
+arc_shrink(void)
+{
+ if (arc_c > arc_c_min) {
+ uint64_t to_free;
+
+#ifdef _KERNEL
+ to_free = arc_c >> arc_shrink_shift;
+#else
+ to_free = arc_c >> arc_shrink_shift;
+#endif
+ if (arc_c > arc_c_min + to_free)
+ atomic_add_64(&arc_c, -to_free);
+ else
+ arc_c = arc_c_min;
+
+ atomic_add_64(&arc_p, -(arc_p >> arc_shrink_shift));
+ if (arc_c > arc_size)
+ arc_c = MAX(arc_size, arc_c_min);
+ if (arc_p > arc_c)
+ arc_p = (arc_c >> 1);
+ ASSERT(arc_c >= arc_c_min);
+ ASSERT((int64_t)arc_p >= 0);
+ }
+
+ if (arc_size > arc_c)
+ arc_adjust();
+}
+
+static int zfs_needfree = 0;
+
+static int
+arc_reclaim_needed(void)
+{
+#if 0
+ uint64_t extra;
+#endif
+
+#ifdef _KERNEL
+
+ if (zfs_needfree)
+ return (1);
+
+#if 0
+ /*
+ * check to make sure that swapfs has enough space so that anon
+ * reservations can still succeeed. anon_resvmem() checks that the
+ * availrmem is greater than swapfs_minfree, and the number of reserved
+ * swap pages. We also add a bit of extra here just to prevent
+ * circumstances from getting really dire.
+ */
+ if (availrmem < swapfs_minfree + swapfs_reserve + extra)
+ return (1);
+
+ /*
+ * If zio data pages are being allocated out of a separate heap segment,
+ * then check that the size of available vmem for this area remains
+ * above 1/4th free. This needs to be done when the size of the
+ * non-default segment is smaller than physical memory, so we could
+ * conceivably run out of VA in that segment before running out of
+ * physical memory.
+ */
+ if (zio_arena != NULL) {
+ size_t arc_ziosize =
+ btop(vmem_size(zio_arena, VMEM_FREE | VMEM_ALLOC));
+
+ if ((physmem > arc_ziosize) &&
+ (btop(vmem_size(zio_arena, VMEM_FREE)) < arc_ziosize >> 2))
+ return (1);
+ }
+
+#if defined(__i386)
+ /*
+ * If we're on an i386 platform, it's possible that we'll exhaust the
+ * kernel heap space before we ever run out of available physical
+ * memory. Most checks of the size of the heap_area compare against
+ * tune.t_minarmem, which is the minimum available real memory that we
+ * can have in the system. However, this is generally fixed at 25 pages
+ * which is so low that it's useless. In this comparison, we seek to
+ * calculate the total heap-size, and reclaim if more than 3/4ths of the
+ * heap is allocated. (Or, in the caclulation, if less than 1/4th is
+ * free)
+ */
+ if (btop(vmem_size(heap_arena, VMEM_FREE)) <
+ (btop(vmem_size(heap_arena, VMEM_FREE | VMEM_ALLOC)) >> 2))
+ return (1);
+#endif
+#else
+ if (kmem_used() > kmem_size() / 2)
+ return (1);
+#endif
+
+#else
+ if (spa_get_random(100) == 0)
+ return (1);
+#endif
+ return (0);
+}
+
+static void
+arc_kmem_reap_now(arc_reclaim_strategy_t strat)
+{
+#ifdef ZIO_USE_UMA
+ size_t i;
+ kmem_cache_t *prev_cache = NULL;
+ kmem_cache_t *prev_data_cache = NULL;
+ extern kmem_cache_t *zio_buf_cache[];
+ extern kmem_cache_t *zio_data_buf_cache[];
+#endif
+
+#ifdef _KERNEL
+ /*
+ * First purge some DNLC entries, in case the DNLC is using
+ * up too much memory.
+ */
+ dnlc_reduce_cache((void *)(uintptr_t)arc_reduce_dnlc_percent);
+
+#if defined(__i386)
+ /*
+ * Reclaim unused memory from all kmem caches.
+ */
+ kmem_reap();
+#endif
+#endif
+
+ /*
+ * An agressive reclamation will shrink the cache size as well as
+ * reap free buffers from the arc kmem caches.
+ */
+ if (strat == ARC_RECLAIM_AGGR)
+ arc_shrink();
+
+#ifdef ZIO_USE_UMA
+ for (i = 0; i < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT; i++) {
+ if (zio_buf_cache[i] != prev_cache) {
+ prev_cache = zio_buf_cache[i];
+ kmem_cache_reap_now(zio_buf_cache[i]);
+ }
+ if (zio_data_buf_cache[i] != prev_data_cache) {
+ prev_data_cache = zio_data_buf_cache[i];
+ kmem_cache_reap_now(zio_data_buf_cache[i]);
+ }
+ }
+#endif
+ kmem_cache_reap_now(buf_cache);
+ kmem_cache_reap_now(hdr_cache);
+}
+
+static void
+arc_reclaim_thread(void *dummy __unused)
+{
+ clock_t growtime = 0;
+ arc_reclaim_strategy_t last_reclaim = ARC_RECLAIM_CONS;
+ callb_cpr_t cpr;
+
+ CALLB_CPR_INIT(&cpr, &arc_reclaim_thr_lock, callb_generic_cpr, FTAG);
+
+ mutex_enter(&arc_reclaim_thr_lock);
+ while (arc_thread_exit == 0) {
+ if (arc_reclaim_needed()) {
+
+ if (arc_no_grow) {
+ if (last_reclaim == ARC_RECLAIM_CONS) {
+ last_reclaim = ARC_RECLAIM_AGGR;
+ } else {
+ last_reclaim = ARC_RECLAIM_CONS;
+ }
+ } else {
+ arc_no_grow = TRUE;
+ last_reclaim = ARC_RECLAIM_AGGR;
+ membar_producer();
+ }
+
+ /* reset the growth delay for every reclaim */
+ growtime = lbolt + (arc_grow_retry * hz);
+ ASSERT(growtime > 0);
+
+ if (zfs_needfree && last_reclaim == ARC_RECLAIM_CONS) {
+ /*
+ * If zfs_needfree is TRUE our vm_lowmem hook
+ * was called and in that case we must free some
+ * memory, so switch to aggressive mode.
+ */
+ arc_no_grow = TRUE;
+ last_reclaim = ARC_RECLAIM_AGGR;
+ }
+ arc_kmem_reap_now(last_reclaim);
+ } else if ((growtime > 0) && ((growtime - lbolt) <= 0)) {
+ arc_no_grow = FALSE;
+ }
+
+ if (zfs_needfree ||
+ (2 * arc_c < arc_size +
+ arc_mru_ghost->arcs_size + arc_mfu_ghost->arcs_size))
+ arc_adjust();
+
+ if (arc_eviction_list != NULL)
+ arc_do_user_evicts();
+
+ if (arc_reclaim_needed()) {
+ zfs_needfree = 0;
+#ifdef _KERNEL
+ wakeup(&zfs_needfree);
+#endif
+ }
+
+ /* block until needed, or one second, whichever is shorter */
+ CALLB_CPR_SAFE_BEGIN(&cpr);
+ (void) cv_timedwait(&arc_reclaim_thr_cv,
+ &arc_reclaim_thr_lock, hz);
+ CALLB_CPR_SAFE_END(&cpr, &arc_reclaim_thr_lock);
+ }
+
+ arc_thread_exit = 0;
+ cv_broadcast(&arc_reclaim_thr_cv);
+ CALLB_CPR_EXIT(&cpr); /* drops arc_reclaim_thr_lock */
+ thread_exit();
+}
+
+/*
+ * Adapt arc info given the number of bytes we are trying to add and
+ * the state that we are comming from. This function is only called
+ * when we are adding new content to the cache.
+ */
+static void
+arc_adapt(int bytes, arc_state_t *state)
+{
+ int mult;
+
+ ASSERT(bytes > 0);
+ /*
+ * Adapt the target size of the MRU list:
+ * - if we just hit in the MRU ghost list, then increase
+ * the target size of the MRU list.
+ * - if we just hit in the MFU ghost list, then increase
+ * the target size of the MFU list by decreasing the
+ * target size of the MRU list.
+ */
+ if (state == arc_mru_ghost) {
+ mult = ((arc_mru_ghost->arcs_size >= arc_mfu_ghost->arcs_size) ?
+ 1 : (arc_mfu_ghost->arcs_size/arc_mru_ghost->arcs_size));
+
+ arc_p = MIN(arc_c, arc_p + bytes * mult);
+ } else if (state == arc_mfu_ghost) {
+ mult = ((arc_mfu_ghost->arcs_size >= arc_mru_ghost->arcs_size) ?
+ 1 : (arc_mru_ghost->arcs_size/arc_mfu_ghost->arcs_size));
+
+ arc_p = MAX(0, (int64_t)arc_p - bytes * mult);
+ }
+ ASSERT((int64_t)arc_p >= 0);
+
+ if (arc_reclaim_needed()) {
+ cv_signal(&arc_reclaim_thr_cv);
+ return;
+ }
+
+ if (arc_no_grow)
+ return;
+
+ if (arc_c >= arc_c_max)
+ return;
+
+ /*
+ * If we're within (2 * maxblocksize) bytes of the target
+ * cache size, increment the target cache size
+ */
+ if (arc_size > arc_c - (2ULL << SPA_MAXBLOCKSHIFT)) {
+ atomic_add_64(&arc_c, (int64_t)bytes);
+ if (arc_c > arc_c_max)
+ arc_c = arc_c_max;
+ else if (state == arc_anon)
+ atomic_add_64(&arc_p, (int64_t)bytes);
+ if (arc_p > arc_c)
+ arc_p = arc_c;
+ }
+ ASSERT((int64_t)arc_p >= 0);
+}
+
+/*
+ * Check if the cache has reached its limits and eviction is required
+ * prior to insert.
+ */
+static int
+arc_evict_needed()
+{
+ if (arc_reclaim_needed())
+ return (1);
+
+ return (arc_size > arc_c);
+}
+
+/*
+ * The buffer, supplied as the first argument, needs a data block.
+ * So, if we are at cache max, determine which cache should be victimized.
+ * We have the following cases:
+ *
+ * 1. Insert for MRU, p > sizeof(arc_anon + arc_mru) ->
+ * In this situation if we're out of space, but the resident size of the MFU is
+ * under the limit, victimize the MFU cache to satisfy this insertion request.
+ *
+ * 2. Insert for MRU, p <= sizeof(arc_anon + arc_mru) ->
+ * Here, we've used up all of the available space for the MRU, so we need to
+ * evict from our own cache instead. Evict from the set of resident MRU
+ * entries.
+ *
+ * 3. Insert for MFU (c - p) > sizeof(arc_mfu) ->
+ * c minus p represents the MFU space in the cache, since p is the size of the
+ * cache that is dedicated to the MRU. In this situation there's still space on
+ * the MFU side, so the MRU side needs to be victimized.
+ *
+ * 4. Insert for MFU (c - p) < sizeof(arc_mfu) ->
+ * MFU's resident set is consuming more space than it has been allotted. In
+ * this situation, we must victimize our own cache, the MFU, for this insertion.
+ */
+static void
+arc_get_data_buf(arc_buf_t *buf)
+{
+ arc_state_t *state = buf->b_hdr->b_state;
+ uint64_t size = buf->b_hdr->b_size;
+ arc_buf_contents_t type = buf->b_hdr->b_type;
+
+ arc_adapt(size, state);
+
+ /*
+ * We have not yet reached cache maximum size,
+ * just allocate a new buffer.
+ */
+ if (!arc_evict_needed()) {
+ if (type == ARC_BUFC_METADATA) {
+ buf->b_data = zio_buf_alloc(size);
+ } else {
+ ASSERT(type == ARC_BUFC_DATA);
+ buf->b_data = zio_data_buf_alloc(size);
+ }
+ atomic_add_64(&arc_size, size);
+ goto out;
+ }
+
+ /*
+ * If we are prefetching from the mfu ghost list, this buffer
+ * will end up on the mru list; so steal space from there.
+ */
+ if (state == arc_mfu_ghost)
+ state = buf->b_hdr->b_flags & ARC_PREFETCH ? arc_mru : arc_mfu;
+ else if (state == arc_mru_ghost)
+ state = arc_mru;
+
+ if (state == arc_mru || state == arc_anon) {
+ uint64_t mru_used = arc_anon->arcs_size + arc_mru->arcs_size;
+ state = (arc_p > mru_used) ? arc_mfu : arc_mru;
+ } else {
+ /* MFU cases */
+ uint64_t mfu_space = arc_c - arc_p;
+ state = (mfu_space > arc_mfu->arcs_size) ? arc_mru : arc_mfu;
+ }
+ if ((buf->b_data = arc_evict(state, size, TRUE, type)) == NULL) {
+ if (type == ARC_BUFC_METADATA) {
+ buf->b_data = zio_buf_alloc(size);
+ } else {
+ ASSERT(type == ARC_BUFC_DATA);
+ buf->b_data = zio_data_buf_alloc(size);
+ }
+ atomic_add_64(&arc_size, size);
+ ARCSTAT_BUMP(arcstat_recycle_miss);
+ }
+ ASSERT(buf->b_data != NULL);
+out:
+ /*
+ * Update the state size. Note that ghost states have a
+ * "ghost size" and so don't need to be updated.
+ */
+ if (!GHOST_STATE(buf->b_hdr->b_state)) {
+ arc_buf_hdr_t *hdr = buf->b_hdr;
+
+ atomic_add_64(&hdr->b_state->arcs_size, size);
+ if (list_link_active(&hdr->b_arc_node)) {
+ ASSERT(refcount_is_zero(&hdr->b_refcnt));
+ atomic_add_64(&hdr->b_state->arcs_lsize, size);
+ }
+ /*
+ * If we are growing the cache, and we are adding anonymous
+ * data, and we have outgrown arc_p, update arc_p
+ */
+ if (arc_size < arc_c && hdr->b_state == arc_anon &&
+ arc_anon->arcs_size + arc_mru->arcs_size > arc_p)
+ arc_p = MIN(arc_c, arc_p + size);
+ }
+}
+
+/*
+ * This routine is called whenever a buffer is accessed.
+ * NOTE: the hash lock is dropped in this function.
+ */
+static void
+arc_access(arc_buf_hdr_t *buf, kmutex_t *hash_lock)
+{
+ ASSERT(MUTEX_HELD(hash_lock));
+
+ if (buf->b_state == arc_anon) {
+ /*
+ * This buffer is not in the cache, and does not
+ * appear in our "ghost" list. Add the new buffer
+ * to the MRU state.
+ */
+
+ ASSERT(buf->b_arc_access == 0);
+ buf->b_arc_access = lbolt;
+ DTRACE_PROBE1(new_state__mru, arc_buf_hdr_t *, buf);
+ arc_change_state(arc_mru, buf, hash_lock);
+
+ } else if (buf->b_state == arc_mru) {
+ /*
+ * If this buffer is here because of a prefetch, then either:
+ * - clear the flag if this is a "referencing" read
+ * (any subsequent access will bump this into the MFU state).
+ * or
+ * - move the buffer to the head of the list if this is
+ * another prefetch (to make it less likely to be evicted).
+ */
+ if ((buf->b_flags & ARC_PREFETCH) != 0) {
+ if (refcount_count(&buf->b_refcnt) == 0) {
+ ASSERT(list_link_active(&buf->b_arc_node));
+ mutex_enter(&arc_mru->arcs_mtx);
+ list_remove(&arc_mru->arcs_list, buf);
+ list_insert_head(&arc_mru->arcs_list, buf);
+ mutex_exit(&arc_mru->arcs_mtx);
+ } else {
+ buf->b_flags &= ~ARC_PREFETCH;
+ ARCSTAT_BUMP(arcstat_mru_hits);
+ }
+ buf->b_arc_access = lbolt;
+ return;
+ }
+
+ /*
+ * This buffer has been "accessed" only once so far,
+ * but it is still in the cache. Move it to the MFU
+ * state.
+ */
+ if (lbolt > buf->b_arc_access + ARC_MINTIME) {
+ /*
+ * More than 125ms have passed since we
+ * instantiated this buffer. Move it to the
+ * most frequently used state.
+ */
+ buf->b_arc_access = lbolt;
+ DTRACE_PROBE1(new_state__mfu, arc_buf_hdr_t *, buf);
+ arc_change_state(arc_mfu, buf, hash_lock);
+ }
+ ARCSTAT_BUMP(arcstat_mru_hits);
+ } else if (buf->b_state == arc_mru_ghost) {
+ arc_state_t *new_state;
+ /*
+ * This buffer has been "accessed" recently, but
+ * was evicted from the cache. Move it to the
+ * MFU state.
+ */
+
+ if (buf->b_flags & ARC_PREFETCH) {
+ new_state = arc_mru;
+ if (refcount_count(&buf->b_refcnt) > 0)
+ buf->b_flags &= ~ARC_PREFETCH;
+ DTRACE_PROBE1(new_state__mru, arc_buf_hdr_t *, buf);
+ } else {
+ new_state = arc_mfu;
+ DTRACE_PROBE1(new_state__mfu, arc_buf_hdr_t *, buf);
+ }
+
+ buf->b_arc_access = lbolt;
+ arc_change_state(new_state, buf, hash_lock);
+
+ ARCSTAT_BUMP(arcstat_mru_ghost_hits);
+ } else if (buf->b_state == arc_mfu) {
+ /*
+ * This buffer has been accessed more than once and is
+ * still in the cache. Keep it in the MFU state.
+ *
+ * NOTE: an add_reference() that occurred when we did
+ * the arc_read() will have kicked this off the list.
+ * If it was a prefetch, we will explicitly move it to
+ * the head of the list now.
+ */
+ if ((buf->b_flags & ARC_PREFETCH) != 0) {
+ ASSERT(refcount_count(&buf->b_refcnt) == 0);
+ ASSERT(list_link_active(&buf->b_arc_node));
+ mutex_enter(&arc_mfu->arcs_mtx);
+ list_remove(&arc_mfu->arcs_list, buf);
+ list_insert_head(&arc_mfu->arcs_list, buf);
+ mutex_exit(&arc_mfu->arcs_mtx);
+ }
+ ARCSTAT_BUMP(arcstat_mfu_hits);
+ buf->b_arc_access = lbolt;
+ } else if (buf->b_state == arc_mfu_ghost) {
+ arc_state_t *new_state = arc_mfu;
+ /*
+ * This buffer has been accessed more than once but has
+ * been evicted from the cache. Move it back to the
+ * MFU state.
+ */
+
+ if (buf->b_flags & ARC_PREFETCH) {
+ /*
+ * This is a prefetch access...
+ * move this block back to the MRU state.
+ */
+ ASSERT3U(refcount_count(&buf->b_refcnt), ==, 0);
+ new_state = arc_mru;
+ }
+
+ buf->b_arc_access = lbolt;
+ DTRACE_PROBE1(new_state__mfu, arc_buf_hdr_t *, buf);
+ arc_change_state(new_state, buf, hash_lock);
+
+ ARCSTAT_BUMP(arcstat_mfu_ghost_hits);
+ } else {
+ ASSERT(!"invalid arc state");
+ }
+}
+
+/* a generic arc_done_func_t which you can use */
+/* ARGSUSED */
+void
+arc_bcopy_func(zio_t *zio, arc_buf_t *buf, void *arg)
+{
+ bcopy(buf->b_data, arg, buf->b_hdr->b_size);
+ VERIFY(arc_buf_remove_ref(buf, arg) == 1);
+}
+
+/* a generic arc_done_func_t which you can use */
+void
+arc_getbuf_func(zio_t *zio, arc_buf_t *buf, void *arg)
+{
+ arc_buf_t **bufp = arg;
+ if (zio && zio->io_error) {
+ VERIFY(arc_buf_remove_ref(buf, arg) == 1);
+ *bufp = NULL;
+ } else {
+ *bufp = buf;
+ }
+}
+
+static void
+arc_read_done(zio_t *zio)
+{
+ arc_buf_hdr_t *hdr, *found;
+ arc_buf_t *buf;
+ arc_buf_t *abuf; /* buffer we're assigning to callback */
+ kmutex_t *hash_lock;
+ arc_callback_t *callback_list, *acb;
+ int freeable = FALSE;
+
+ buf = zio->io_private;
+ hdr = buf->b_hdr;
+
+ /*
+ * The hdr was inserted into hash-table and removed from lists
+ * prior to starting I/O. We should find this header, since
+ * it's in the hash table, and it should be legit since it's
+ * not possible to evict it during the I/O. The only possible
+ * reason for it not to be found is if we were freed during the
+ * read.
+ */
+ found = buf_hash_find(zio->io_spa, &hdr->b_dva, hdr->b_birth,
+ &hash_lock);
+
+ ASSERT((found == NULL && HDR_FREED_IN_READ(hdr) && hash_lock == NULL) ||
+ (found == hdr && DVA_EQUAL(&hdr->b_dva, BP_IDENTITY(zio->io_bp))));
+
+ /* byteswap if necessary */
+ callback_list = hdr->b_acb;
+ ASSERT(callback_list != NULL);
+ if (BP_SHOULD_BYTESWAP(zio->io_bp) && callback_list->acb_byteswap)
+ callback_list->acb_byteswap(buf->b_data, hdr->b_size);
+
+ arc_cksum_compute(buf);
+
+ /* create copies of the data buffer for the callers */
+ abuf = buf;
+ for (acb = callback_list; acb; acb = acb->acb_next) {
+ if (acb->acb_done) {
+ if (abuf == NULL)
+ abuf = arc_buf_clone(buf);
+ acb->acb_buf = abuf;
+ abuf = NULL;
+ }
+ }
+ hdr->b_acb = NULL;
+ hdr->b_flags &= ~ARC_IO_IN_PROGRESS;
+ ASSERT(!HDR_BUF_AVAILABLE(hdr));
+ if (abuf == buf)
+ hdr->b_flags |= ARC_BUF_AVAILABLE;
+
+ ASSERT(refcount_is_zero(&hdr->b_refcnt) || callback_list != NULL);
+
+ if (zio->io_error != 0) {
+ hdr->b_flags |= ARC_IO_ERROR;
+ if (hdr->b_state != arc_anon)
+ arc_change_state(arc_anon, hdr, hash_lock);
+ if (HDR_IN_HASH_TABLE(hdr))
+ buf_hash_remove(hdr);
+ freeable = refcount_is_zero(&hdr->b_refcnt);
+ /* convert checksum errors into IO errors */
+ if (zio->io_error == ECKSUM)
+ zio->io_error = EIO;
+ }
+
+ /*
+ * Broadcast before we drop the hash_lock to avoid the possibility
+ * that the hdr (and hence the cv) might be freed before we get to
+ * the cv_broadcast().
+ */
+ cv_broadcast(&hdr->b_cv);
+
+ if (hash_lock) {
+ /*
+ * Only call arc_access on anonymous buffers. This is because
+ * if we've issued an I/O for an evicted buffer, we've already
+ * called arc_access (to prevent any simultaneous readers from
+ * getting confused).
+ */
+ if (zio->io_error == 0 && hdr->b_state == arc_anon)
+ arc_access(hdr, hash_lock);
+ mutex_exit(hash_lock);
+ } else {
+ /*
+ * This block was freed while we waited for the read to
+ * complete. It has been removed from the hash table and
+ * moved to the anonymous state (so that it won't show up
+ * in the cache).
+ */
+ ASSERT3P(hdr->b_state, ==, arc_anon);
+ freeable = refcount_is_zero(&hdr->b_refcnt);
+ }
+
+ /* execute each callback and free its structure */
+ while ((acb = callback_list) != NULL) {
+ if (acb->acb_done)
+ acb->acb_done(zio, acb->acb_buf, acb->acb_private);
+
+ if (acb->acb_zio_dummy != NULL) {
+ acb->acb_zio_dummy->io_error = zio->io_error;
+ zio_nowait(acb->acb_zio_dummy);
+ }
+
+ callback_list = acb->acb_next;
+ kmem_free(acb, sizeof (arc_callback_t));
+ }
+
+ if (freeable)
+ arc_hdr_destroy(hdr);
+}
+
+/*
+ * "Read" the block block at the specified DVA (in bp) via the
+ * cache. If the block is found in the cache, invoke the provided
+ * callback immediately and return. Note that the `zio' parameter
+ * in the callback will be NULL in this case, since no IO was
+ * required. If the block is not in the cache pass the read request
+ * on to the spa with a substitute callback function, so that the
+ * requested block will be added to the cache.
+ *
+ * If a read request arrives for a block that has a read in-progress,
+ * either wait for the in-progress read to complete (and return the
+ * results); or, if this is a read with a "done" func, add a record
+ * to the read to invoke the "done" func when the read completes,
+ * and return; or just return.
+ *
+ * arc_read_done() will invoke all the requested "done" functions
+ * for readers of this block.
+ */
+int
+arc_read(zio_t *pio, spa_t *spa, blkptr_t *bp, arc_byteswap_func_t *swap,
+ arc_done_func_t *done, void *private, int priority, int flags,
+ uint32_t *arc_flags, zbookmark_t *zb)
+{
+ arc_buf_hdr_t *hdr;
+ arc_buf_t *buf;
+ kmutex_t *hash_lock;
+ zio_t *rzio;
+
+top:
+ hdr = buf_hash_find(spa, BP_IDENTITY(bp), bp->blk_birth, &hash_lock);
+ if (hdr && hdr->b_datacnt > 0) {
+
+ *arc_flags |= ARC_CACHED;
+
+ if (HDR_IO_IN_PROGRESS(hdr)) {
+
+ if (*arc_flags & ARC_WAIT) {
+ cv_wait(&hdr->b_cv, hash_lock);
+ mutex_exit(hash_lock);
+ goto top;
+ }
+ ASSERT(*arc_flags & ARC_NOWAIT);
+
+ if (done) {
+ arc_callback_t *acb = NULL;
+
+ acb = kmem_zalloc(sizeof (arc_callback_t),
+ KM_SLEEP);
+ acb->acb_done = done;
+ acb->acb_private = private;
+ acb->acb_byteswap = swap;
+ if (pio != NULL)
+ acb->acb_zio_dummy = zio_null(pio,
+ spa, NULL, NULL, flags);
+
+ ASSERT(acb->acb_done != NULL);
+ acb->acb_next = hdr->b_acb;
+ hdr->b_acb = acb;
+ add_reference(hdr, hash_lock, private);
+ mutex_exit(hash_lock);
+ return (0);
+ }
+ mutex_exit(hash_lock);
+ return (0);
+ }
+
+ ASSERT(hdr->b_state == arc_mru || hdr->b_state == arc_mfu);
+
+ if (done) {
+ add_reference(hdr, hash_lock, private);
+ /*
+ * If this block is already in use, create a new
+ * copy of the data so that we will be guaranteed
+ * that arc_release() will always succeed.
+ */
+ buf = hdr->b_buf;
+ ASSERT(buf);
+ ASSERT(buf->b_data);
+ if (HDR_BUF_AVAILABLE(hdr)) {
+ ASSERT(buf->b_efunc == NULL);
+ hdr->b_flags &= ~ARC_BUF_AVAILABLE;
+ } else {
+ buf = arc_buf_clone(buf);
+ }
+ } else if (*arc_flags & ARC_PREFETCH &&
+ refcount_count(&hdr->b_refcnt) == 0) {
+ hdr->b_flags |= ARC_PREFETCH;
+ }
+ DTRACE_PROBE1(arc__hit, arc_buf_hdr_t *, hdr);
+ arc_access(hdr, hash_lock);
+ mutex_exit(hash_lock);
+ ARCSTAT_BUMP(arcstat_hits);
+ ARCSTAT_CONDSTAT(!(hdr->b_flags & ARC_PREFETCH),
+ demand, prefetch, hdr->b_type != ARC_BUFC_METADATA,
+ data, metadata, hits);
+
+ if (done)
+ done(NULL, buf, private);
+ } else {
+ uint64_t size = BP_GET_LSIZE(bp);
+ arc_callback_t *acb;
+
+ if (hdr == NULL) {
+ /* this block is not in the cache */
+ arc_buf_hdr_t *exists;
+ arc_buf_contents_t type = BP_GET_BUFC_TYPE(bp);
+ buf = arc_buf_alloc(spa, size, private, type);
+ hdr = buf->b_hdr;
+ hdr->b_dva = *BP_IDENTITY(bp);
+ hdr->b_birth = bp->blk_birth;
+ hdr->b_cksum0 = bp->blk_cksum.zc_word[0];
+ exists = buf_hash_insert(hdr, &hash_lock);
+ if (exists) {
+ /* somebody beat us to the hash insert */
+ mutex_exit(hash_lock);
+ bzero(&hdr->b_dva, sizeof (dva_t));
+ hdr->b_birth = 0;
+ hdr->b_cksum0 = 0;
+ (void) arc_buf_remove_ref(buf, private);
+ goto top; /* restart the IO request */
+ }
+ /* if this is a prefetch, we don't have a reference */
+ if (*arc_flags & ARC_PREFETCH) {
+ (void) remove_reference(hdr, hash_lock,
+ private);
+ hdr->b_flags |= ARC_PREFETCH;
+ }
+ if (BP_GET_LEVEL(bp) > 0)
+ hdr->b_flags |= ARC_INDIRECT;
+ } else {
+ /* this block is in the ghost cache */
+ ASSERT(GHOST_STATE(hdr->b_state));
+ ASSERT(!HDR_IO_IN_PROGRESS(hdr));
+ ASSERT3U(refcount_count(&hdr->b_refcnt), ==, 0);
+ ASSERT(hdr->b_buf == NULL);
+
+ /* if this is a prefetch, we don't have a reference */
+ if (*arc_flags & ARC_PREFETCH)
+ hdr->b_flags |= ARC_PREFETCH;
+ else
+ add_reference(hdr, hash_lock, private);
+ buf = kmem_cache_alloc(buf_cache, KM_SLEEP);
+ buf->b_hdr = hdr;
+ buf->b_data = NULL;
+ buf->b_efunc = NULL;
+ buf->b_private = NULL;
+ buf->b_next = NULL;
+ hdr->b_buf = buf;
+ arc_get_data_buf(buf);
+ ASSERT(hdr->b_datacnt == 0);
+ hdr->b_datacnt = 1;
+
+ }
+
+ acb = kmem_zalloc(sizeof (arc_callback_t), KM_SLEEP);
+ acb->acb_done = done;
+ acb->acb_private = private;
+ acb->acb_byteswap = swap;
+
+ ASSERT(hdr->b_acb == NULL);
+ hdr->b_acb = acb;
+ hdr->b_flags |= ARC_IO_IN_PROGRESS;
+
+ /*
+ * If the buffer has been evicted, migrate it to a present state
+ * before issuing the I/O. Once we drop the hash-table lock,
+ * the header will be marked as I/O in progress and have an
+ * attached buffer. At this point, anybody who finds this
+ * buffer ought to notice that it's legit but has a pending I/O.
+ */
+
+ if (GHOST_STATE(hdr->b_state))
+ arc_access(hdr, hash_lock);
+ mutex_exit(hash_lock);
+
+ ASSERT3U(hdr->b_size, ==, size);
+ DTRACE_PROBE3(arc__miss, blkptr_t *, bp, uint64_t, size,
+ zbookmark_t *, zb);
+ ARCSTAT_BUMP(arcstat_misses);
+ ARCSTAT_CONDSTAT(!(hdr->b_flags & ARC_PREFETCH),
+ demand, prefetch, hdr->b_type != ARC_BUFC_METADATA,
+ data, metadata, misses);
+
+ rzio = zio_read(pio, spa, bp, buf->b_data, size,
+ arc_read_done, buf, priority, flags, zb);
+
+ if (*arc_flags & ARC_WAIT)
+ return (zio_wait(rzio));
+
+ ASSERT(*arc_flags & ARC_NOWAIT);
+ zio_nowait(rzio);
+ }
+ return (0);
+}
+
+/*
+ * arc_read() variant to support pool traversal. If the block is already
+ * in the ARC, make a copy of it; otherwise, the caller will do the I/O.
+ * The idea is that we don't want pool traversal filling up memory, but
+ * if the ARC already has the data anyway, we shouldn't pay for the I/O.
+ */
+int
+arc_tryread(spa_t *spa, blkptr_t *bp, void *data)
+{
+ arc_buf_hdr_t *hdr;
+ kmutex_t *hash_mtx;
+ int rc = 0;
+
+ hdr = buf_hash_find(spa, BP_IDENTITY(bp), bp->blk_birth, &hash_mtx);
+
+ if (hdr && hdr->b_datacnt > 0 && !HDR_IO_IN_PROGRESS(hdr)) {
+ arc_buf_t *buf = hdr->b_buf;
+
+ ASSERT(buf);
+ while (buf->b_data == NULL) {
+ buf = buf->b_next;
+ ASSERT(buf);
+ }
+ bcopy(buf->b_data, data, hdr->b_size);
+ } else {
+ rc = ENOENT;
+ }
+
+ if (hash_mtx)
+ mutex_exit(hash_mtx);
+
+ return (rc);
+}
+
+void
+arc_set_callback(arc_buf_t *buf, arc_evict_func_t *func, void *private)
+{
+ ASSERT(buf->b_hdr != NULL);
+ ASSERT(buf->b_hdr->b_state != arc_anon);
+ ASSERT(!refcount_is_zero(&buf->b_hdr->b_refcnt) || func == NULL);
+ buf->b_efunc = func;
+ buf->b_private = private;
+}
+
+/*
+ * This is used by the DMU to let the ARC know that a buffer is
+ * being evicted, so the ARC should clean up. If this arc buf
+ * is not yet in the evicted state, it will be put there.
+ */
+int
+arc_buf_evict(arc_buf_t *buf)
+{
+ arc_buf_hdr_t *hdr;
+ kmutex_t *hash_lock;
+ arc_buf_t **bufp;
+
+ mutex_enter(&arc_eviction_mtx);
+ hdr = buf->b_hdr;
+ if (hdr == NULL) {
+ /*
+ * We are in arc_do_user_evicts().
+ */
+ ASSERT(buf->b_data == NULL);
+ mutex_exit(&arc_eviction_mtx);
+ return (0);
+ }
+ hash_lock = HDR_LOCK(hdr);
+ mutex_exit(&arc_eviction_mtx);
+
+ mutex_enter(hash_lock);
+
+ if (buf->b_data == NULL) {
+ /*
+ * We are on the eviction list.
+ */
+ mutex_exit(hash_lock);
+ mutex_enter(&arc_eviction_mtx);
+ if (buf->b_hdr == NULL) {
+ /*
+ * We are already in arc_do_user_evicts().
+ */
+ mutex_exit(&arc_eviction_mtx);
+ return (0);
+ } else {
+ arc_buf_t copy = *buf; /* structure assignment */
+ /*
+ * Process this buffer now
+ * but let arc_do_user_evicts() do the reaping.
+ */
+ buf->b_efunc = NULL;
+ mutex_exit(&arc_eviction_mtx);
+ VERIFY(copy.b_efunc(&copy) == 0);
+ return (1);
+ }
+ }
+
+ ASSERT(buf->b_hdr == hdr);
+ ASSERT3U(refcount_count(&hdr->b_refcnt), <, hdr->b_datacnt);
+ ASSERT(hdr->b_state == arc_mru || hdr->b_state == arc_mfu);
+
+ /*
+ * Pull this buffer off of the hdr
+ */
+ bufp = &hdr->b_buf;
+ while (*bufp != buf)
+ bufp = &(*bufp)->b_next;
+ *bufp = buf->b_next;
+
+ ASSERT(buf->b_data != NULL);
+ arc_buf_destroy(buf, FALSE, FALSE);
+
+ if (hdr->b_datacnt == 0) {
+ arc_state_t *old_state = hdr->b_state;
+ arc_state_t *evicted_state;
+
+ ASSERT(refcount_is_zero(&hdr->b_refcnt));
+
+ evicted_state =
+ (old_state == arc_mru) ? arc_mru_ghost : arc_mfu_ghost;
+
+ mutex_enter(&old_state->arcs_mtx);
+ mutex_enter(&evicted_state->arcs_mtx);
+
+ arc_change_state(evicted_state, hdr, hash_lock);
+ ASSERT(HDR_IN_HASH_TABLE(hdr));
+ hdr->b_flags = ARC_IN_HASH_TABLE;
+
+ mutex_exit(&evicted_state->arcs_mtx);
+ mutex_exit(&old_state->arcs_mtx);
+ }
+ mutex_exit(hash_lock);
+
+ VERIFY(buf->b_efunc(buf) == 0);
+ buf->b_efunc = NULL;
+ buf->b_private = NULL;
+ buf->b_hdr = NULL;
+ kmem_cache_free(buf_cache, buf);
+ return (1);
+}
+
+/*
+ * Release this buffer from the cache. This must be done
+ * after a read and prior to modifying the buffer contents.
+ * If the buffer has more than one reference, we must make
+ * make a new hdr for the buffer.
+ */
+void
+arc_release(arc_buf_t *buf, void *tag)
+{
+ arc_buf_hdr_t *hdr = buf->b_hdr;
+ kmutex_t *hash_lock = HDR_LOCK(hdr);
+
+ /* this buffer is not on any list */
+ ASSERT(refcount_count(&hdr->b_refcnt) > 0);
+
+ if (hdr->b_state == arc_anon) {
+ /* this buffer is already released */
+ ASSERT3U(refcount_count(&hdr->b_refcnt), ==, 1);
+ ASSERT(BUF_EMPTY(hdr));
+ ASSERT(buf->b_efunc == NULL);
+ arc_buf_thaw(buf);
+ return;
+ }
+
+ mutex_enter(hash_lock);
+
+ /*
+ * Do we have more than one buf?
+ */
+ if (hdr->b_buf != buf || buf->b_next != NULL) {
+ arc_buf_hdr_t *nhdr;
+ arc_buf_t **bufp;
+ uint64_t blksz = hdr->b_size;
+ spa_t *spa = hdr->b_spa;
+ arc_buf_contents_t type = hdr->b_type;
+
+ ASSERT(hdr->b_datacnt > 1);
+ /*
+ * Pull the data off of this buf and attach it to
+ * a new anonymous buf.
+ */
+ (void) remove_reference(hdr, hash_lock, tag);
+ bufp = &hdr->b_buf;
+ while (*bufp != buf)
+ bufp = &(*bufp)->b_next;
+ *bufp = (*bufp)->b_next;
+ buf->b_next = NULL;
+
+ ASSERT3U(hdr->b_state->arcs_size, >=, hdr->b_size);
+ atomic_add_64(&hdr->b_state->arcs_size, -hdr->b_size);
+ if (refcount_is_zero(&hdr->b_refcnt)) {
+ ASSERT3U(hdr->b_state->arcs_lsize, >=, hdr->b_size);
+ atomic_add_64(&hdr->b_state->arcs_lsize, -hdr->b_size);
+ }
+ hdr->b_datacnt -= 1;
+ arc_cksum_verify(buf);
+
+ mutex_exit(hash_lock);
+
+ nhdr = kmem_cache_alloc(hdr_cache, KM_SLEEP);
+ nhdr->b_size = blksz;
+ nhdr->b_spa = spa;
+ nhdr->b_type = type;
+ nhdr->b_buf = buf;
+ nhdr->b_state = arc_anon;
+ nhdr->b_arc_access = 0;
+ nhdr->b_flags = 0;
+ nhdr->b_datacnt = 1;
+ nhdr->b_freeze_cksum = NULL;
+ mutex_init(&nhdr->b_freeze_lock, NULL, MUTEX_DEFAULT, NULL);
+ (void) refcount_add(&nhdr->b_refcnt, tag);
+ buf->b_hdr = nhdr;
+ atomic_add_64(&arc_anon->arcs_size, blksz);
+
+ hdr = nhdr;
+ } else {
+ ASSERT(refcount_count(&hdr->b_refcnt) == 1);
+ ASSERT(!list_link_active(&hdr->b_arc_node));
+ ASSERT(!HDR_IO_IN_PROGRESS(hdr));
+ arc_change_state(arc_anon, hdr, hash_lock);
+ hdr->b_arc_access = 0;
+ mutex_exit(hash_lock);
+ bzero(&hdr->b_dva, sizeof (dva_t));
+ hdr->b_birth = 0;
+ hdr->b_cksum0 = 0;
+ arc_buf_thaw(buf);
+ }
+ buf->b_efunc = NULL;
+ buf->b_private = NULL;
+}
+
+int
+arc_released(arc_buf_t *buf)
+{
+ return (buf->b_data != NULL && buf->b_hdr->b_state == arc_anon);
+}
+
+int
+arc_has_callback(arc_buf_t *buf)
+{
+ return (buf->b_efunc != NULL);
+}
+
+#ifdef ZFS_DEBUG
+int
+arc_referenced(arc_buf_t *buf)
+{
+ return (refcount_count(&buf->b_hdr->b_refcnt));
+}
+#endif
+
+static void
+arc_write_ready(zio_t *zio)
+{
+ arc_write_callback_t *callback = zio->io_private;
+ arc_buf_t *buf = callback->awcb_buf;
+
+ if (callback->awcb_ready) {
+ ASSERT(!refcount_is_zero(&buf->b_hdr->b_refcnt));
+ callback->awcb_ready(zio, buf, callback->awcb_private);
+ }
+ arc_cksum_compute(buf);
+}
+
+static void
+arc_write_done(zio_t *zio)
+{
+ arc_write_callback_t *callback = zio->io_private;
+ arc_buf_t *buf = callback->awcb_buf;
+ arc_buf_hdr_t *hdr = buf->b_hdr;
+
+ hdr->b_acb = NULL;
+
+ /* this buffer is on no lists and is not in the hash table */
+ ASSERT3P(hdr->b_state, ==, arc_anon);
+
+ hdr->b_dva = *BP_IDENTITY(zio->io_bp);
+ hdr->b_birth = zio->io_bp->blk_birth;
+ hdr->b_cksum0 = zio->io_bp->blk_cksum.zc_word[0];
+ /*
+ * If the block to be written was all-zero, we may have
+ * compressed it away. In this case no write was performed
+ * so there will be no dva/birth-date/checksum. The buffer
+ * must therefor remain anonymous (and uncached).
+ */
+ if (!BUF_EMPTY(hdr)) {
+ arc_buf_hdr_t *exists;
+ kmutex_t *hash_lock;
+
+ arc_cksum_verify(buf);
+
+ exists = buf_hash_insert(hdr, &hash_lock);
+ if (exists) {
+ /*
+ * This can only happen if we overwrite for
+ * sync-to-convergence, because we remove
+ * buffers from the hash table when we arc_free().
+ */
+ ASSERT(DVA_EQUAL(BP_IDENTITY(&zio->io_bp_orig),
+ BP_IDENTITY(zio->io_bp)));
+ ASSERT3U(zio->io_bp_orig.blk_birth, ==,
+ zio->io_bp->blk_birth);
+
+ ASSERT(refcount_is_zero(&exists->b_refcnt));
+ arc_change_state(arc_anon, exists, hash_lock);
+ mutex_exit(hash_lock);
+ arc_hdr_destroy(exists);
+ exists = buf_hash_insert(hdr, &hash_lock);
+ ASSERT3P(exists, ==, NULL);
+ }
+ hdr->b_flags &= ~ARC_IO_IN_PROGRESS;
+ arc_access(hdr, hash_lock);
+ mutex_exit(hash_lock);
+ } else if (callback->awcb_done == NULL) {
+ int destroy_hdr;
+ /*
+ * This is an anonymous buffer with no user callback,
+ * destroy it if there are no active references.
+ */
+ mutex_enter(&arc_eviction_mtx);
+ destroy_hdr = refcount_is_zero(&hdr->b_refcnt);
+ hdr->b_flags &= ~ARC_IO_IN_PROGRESS;
+ mutex_exit(&arc_eviction_mtx);
+ if (destroy_hdr)
+ arc_hdr_destroy(hdr);
+ } else {
+ hdr->b_flags &= ~ARC_IO_IN_PROGRESS;
+ }
+
+ if (callback->awcb_done) {
+ ASSERT(!refcount_is_zero(&hdr->b_refcnt));
+ callback->awcb_done(zio, buf, callback->awcb_private);
+ }
+
+ kmem_free(callback, sizeof (arc_write_callback_t));
+}
+
+zio_t *
+arc_write(zio_t *pio, spa_t *spa, int checksum, int compress, int ncopies,
+ uint64_t txg, blkptr_t *bp, arc_buf_t *buf,
+ arc_done_func_t *ready, arc_done_func_t *done, void *private, int priority,
+ int flags, zbookmark_t *zb)
+{
+ arc_buf_hdr_t *hdr = buf->b_hdr;
+ arc_write_callback_t *callback;
+ zio_t *zio;
+
+ /* this is a private buffer - no locking required */
+ ASSERT3P(hdr->b_state, ==, arc_anon);
+ ASSERT(BUF_EMPTY(hdr));
+ ASSERT(!HDR_IO_ERROR(hdr));
+ ASSERT((hdr->b_flags & ARC_IO_IN_PROGRESS) == 0);
+ ASSERT(hdr->b_acb == 0);
+ callback = kmem_zalloc(sizeof (arc_write_callback_t), KM_SLEEP);
+ callback->awcb_ready = ready;
+ callback->awcb_done = done;
+ callback->awcb_private = private;
+ callback->awcb_buf = buf;
+ hdr->b_flags |= ARC_IO_IN_PROGRESS;
+ zio = zio_write(pio, spa, checksum, compress, ncopies, txg, bp,
+ buf->b_data, hdr->b_size, arc_write_ready, arc_write_done, callback,
+ priority, flags, zb);
+
+ return (zio);
+}
+
+int
+arc_free(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
+ zio_done_func_t *done, void *private, uint32_t arc_flags)
+{
+ arc_buf_hdr_t *ab;
+ kmutex_t *hash_lock;
+ zio_t *zio;
+
+ /*
+ * If this buffer is in the cache, release it, so it
+ * can be re-used.
+ */
+ ab = buf_hash_find(spa, BP_IDENTITY(bp), bp->blk_birth, &hash_lock);
+ if (ab != NULL) {
+ /*
+ * The checksum of blocks to free is not always
+ * preserved (eg. on the deadlist). However, if it is
+ * nonzero, it should match what we have in the cache.
+ */
+ ASSERT(bp->blk_cksum.zc_word[0] == 0 ||
+ ab->b_cksum0 == bp->blk_cksum.zc_word[0]);
+ if (ab->b_state != arc_anon)
+ arc_change_state(arc_anon, ab, hash_lock);
+ if (HDR_IO_IN_PROGRESS(ab)) {
+ /*
+ * This should only happen when we prefetch.
+ */
+ ASSERT(ab->b_flags & ARC_PREFETCH);
+ ASSERT3U(ab->b_datacnt, ==, 1);
+ ab->b_flags |= ARC_FREED_IN_READ;
+ if (HDR_IN_HASH_TABLE(ab))
+ buf_hash_remove(ab);
+ ab->b_arc_access = 0;
+ bzero(&ab->b_dva, sizeof (dva_t));
+ ab->b_birth = 0;
+ ab->b_cksum0 = 0;
+ ab->b_buf->b_efunc = NULL;
+ ab->b_buf->b_private = NULL;
+ mutex_exit(hash_lock);
+ } else if (refcount_is_zero(&ab->b_refcnt)) {
+ mutex_exit(hash_lock);
+ arc_hdr_destroy(ab);
+ ARCSTAT_BUMP(arcstat_deleted);
+ } else {
+ /*
+ * We still have an active reference on this
+ * buffer. This can happen, e.g., from
+ * dbuf_unoverride().
+ */
+ ASSERT(!HDR_IN_HASH_TABLE(ab));
+ ab->b_arc_access = 0;
+ bzero(&ab->b_dva, sizeof (dva_t));
+ ab->b_birth = 0;
+ ab->b_cksum0 = 0;
+ ab->b_buf->b_efunc = NULL;
+ ab->b_buf->b_private = NULL;
+ mutex_exit(hash_lock);
+ }
+ }
+
+ zio = zio_free(pio, spa, txg, bp, done, private);
+
+ if (arc_flags & ARC_WAIT)
+ return (zio_wait(zio));
+
+ ASSERT(arc_flags & ARC_NOWAIT);
+ zio_nowait(zio);
+
+ return (0);
+}
+
+void
+arc_tempreserve_clear(uint64_t tempreserve)
+{
+ atomic_add_64(&arc_tempreserve, -tempreserve);
+ ASSERT((int64_t)arc_tempreserve >= 0);
+}
+
+int
+arc_tempreserve_space(uint64_t tempreserve)
+{
+#ifdef ZFS_DEBUG
+ /*
+ * Once in a while, fail for no reason. Everything should cope.
+ */
+ if (spa_get_random(10000) == 0) {
+ dprintf("forcing random failure\n");
+ return (ERESTART);
+ }
+#endif
+ if (tempreserve > arc_c/4 && !arc_no_grow)
+ arc_c = MIN(arc_c_max, tempreserve * 4);
+ if (tempreserve > arc_c)
+ return (ENOMEM);
+
+ /*
+ * Throttle writes when the amount of dirty data in the cache
+ * gets too large. We try to keep the cache less than half full
+ * of dirty blocks so that our sync times don't grow too large.
+ * Note: if two requests come in concurrently, we might let them
+ * both succeed, when one of them should fail. Not a huge deal.
+ *
+ * XXX The limit should be adjusted dynamically to keep the time
+ * to sync a dataset fixed (around 1-5 seconds?).
+ */
+
+ if (tempreserve + arc_tempreserve + arc_anon->arcs_size > arc_c / 2 &&
+ arc_tempreserve + arc_anon->arcs_size > arc_c / 4) {
+ dprintf("failing, arc_tempreserve=%lluK anon=%lluK "
+ "tempreserve=%lluK arc_c=%lluK\n",
+ arc_tempreserve>>10, arc_anon->arcs_lsize>>10,
+ tempreserve>>10, arc_c>>10);
+ return (ERESTART);
+ }
+ atomic_add_64(&arc_tempreserve, tempreserve);
+ return (0);
+}
+
+static kmutex_t arc_lowmem_lock;
+#ifdef _KERNEL
+static eventhandler_tag arc_event_lowmem = NULL;
+
+static void
+arc_lowmem(void *arg __unused, int howto __unused)
+{
+
+ /* Serialize access via arc_lowmem_lock. */
+ mutex_enter(&arc_lowmem_lock);
+ zfs_needfree = 1;
+ cv_signal(&arc_reclaim_thr_cv);
+ while (zfs_needfree)
+ tsleep(&zfs_needfree, 0, "zfs:lowmem", hz / 5);
+ mutex_exit(&arc_lowmem_lock);
+}
+#endif
+
+void
+arc_init(void)
+{
+ mutex_init(&arc_reclaim_thr_lock, NULL, MUTEX_DEFAULT, NULL);
+ cv_init(&arc_reclaim_thr_cv, NULL, CV_DEFAULT, NULL);
+ mutex_init(&arc_lowmem_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ /* Convert seconds to clock ticks */
+ arc_min_prefetch_lifespan = 1 * hz;
+
+ /* Start out with 1/8 of all memory */
+ arc_c = kmem_size() / 8;
+#if 0
+#ifdef _KERNEL
+ /*
+ * On architectures where the physical memory can be larger
+ * than the addressable space (intel in 32-bit mode), we may
+ * need to limit the cache to 1/8 of VM size.
+ */
+ arc_c = MIN(arc_c, vmem_size(heap_arena, VMEM_ALLOC | VMEM_FREE) / 8);
+#endif
+#endif
+ /* set min cache to 1/32 of all memory, or 16MB, whichever is more */
+ arc_c_min = MAX(arc_c / 4, 64<<18);
+ /* set max to 1/2 of all memory, or all but 1GB, whichever is more */
+ if (arc_c * 8 >= 1<<30)
+ arc_c_max = (arc_c * 8) - (1<<30);
+ else
+ arc_c_max = arc_c_min;
+ arc_c_max = MAX(arc_c * 4, arc_c_max);
+#ifdef _KERNEL
+ /*
+ * Allow the tunables to override our calculations if they are
+ * reasonable (ie. over 16MB)
+ */
+ if (zfs_arc_max >= 64<<18 && zfs_arc_max < kmem_size())
+ arc_c_max = zfs_arc_max;
+ if (zfs_arc_min >= 64<<18 && zfs_arc_min <= arc_c_max)
+ arc_c_min = zfs_arc_min;
+#endif
+ arc_c = arc_c_max;
+ arc_p = (arc_c >> 1);
+
+ /* if kmem_flags are set, lets try to use less memory */
+ if (kmem_debugging())
+ arc_c = arc_c / 2;
+ if (arc_c < arc_c_min)
+ arc_c = arc_c_min;
+
+ zfs_arc_min = arc_c_min;
+ zfs_arc_max = arc_c_max;
+
+ arc_anon = &ARC_anon;
+ arc_mru = &ARC_mru;
+ arc_mru_ghost = &ARC_mru_ghost;
+ arc_mfu = &ARC_mfu;
+ arc_mfu_ghost = &ARC_mfu_ghost;
+ arc_size = 0;
+
+ mutex_init(&arc_anon->arcs_mtx, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&arc_mru->arcs_mtx, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&arc_mru_ghost->arcs_mtx, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&arc_mfu->arcs_mtx, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&arc_mfu_ghost->arcs_mtx, NULL, MUTEX_DEFAULT, NULL);
+
+ list_create(&arc_mru->arcs_list, sizeof (arc_buf_hdr_t),
+ offsetof(arc_buf_hdr_t, b_arc_node));
+ list_create(&arc_mru_ghost->arcs_list, sizeof (arc_buf_hdr_t),
+ offsetof(arc_buf_hdr_t, b_arc_node));
+ list_create(&arc_mfu->arcs_list, sizeof (arc_buf_hdr_t),
+ offsetof(arc_buf_hdr_t, b_arc_node));
+ list_create(&arc_mfu_ghost->arcs_list, sizeof (arc_buf_hdr_t),
+ offsetof(arc_buf_hdr_t, b_arc_node));
+
+ buf_init();
+
+ arc_thread_exit = 0;
+ arc_eviction_list = NULL;
+ mutex_init(&arc_eviction_mtx, NULL, MUTEX_DEFAULT, NULL);
+ bzero(&arc_eviction_hdr, sizeof (arc_buf_hdr_t));
+
+ arc_ksp = kstat_create("zfs", 0, "arcstats", "misc", KSTAT_TYPE_NAMED,
+ sizeof (arc_stats) / sizeof (kstat_named_t), KSTAT_FLAG_VIRTUAL);
+
+ if (arc_ksp != NULL) {
+ arc_ksp->ks_data = &arc_stats;
+ kstat_install(arc_ksp);
+ }
+
+ (void) thread_create(NULL, 0, arc_reclaim_thread, NULL, 0, &p0,
+ TS_RUN, minclsyspri);
+
+#ifdef _KERNEL
+ arc_event_lowmem = EVENTHANDLER_REGISTER(vm_lowmem, arc_lowmem, NULL,
+ EVENTHANDLER_PRI_FIRST);
+#endif
+
+ arc_dead = FALSE;
+
+#ifdef _KERNEL
+ /* Warn about ZFS memory requirements. */
+ if (((uint64_t)physmem * PAGESIZE) < (256 + 128 + 64) * (1 << 20)) {
+ printf("ZFS WARNING: Recommended minimum RAM size is 512MB; "
+ "expect unstable behavior.\n");
+ } else if (kmem_size() < 256 * (1 << 20)) {
+ printf("ZFS WARNING: Recommended minimum kmem_size is 256MB; "
+ "expect unstable behavior.\n");
+ printf(" Consider tuning vm.kmem_size or "
+ "vm.kmem_size_min\n");
+ printf(" in /boot/loader.conf.\n");
+ }
+#endif
+}
+
+void
+arc_fini(void)
+{
+ mutex_enter(&arc_reclaim_thr_lock);
+ arc_thread_exit = 1;
+ cv_signal(&arc_reclaim_thr_cv);
+ while (arc_thread_exit != 0)
+ cv_wait(&arc_reclaim_thr_cv, &arc_reclaim_thr_lock);
+ mutex_exit(&arc_reclaim_thr_lock);
+
+ arc_flush();
+
+ arc_dead = TRUE;
+
+ if (arc_ksp != NULL) {
+ kstat_delete(arc_ksp);
+ arc_ksp = NULL;
+ }
+
+ mutex_destroy(&arc_eviction_mtx);
+ mutex_destroy(&arc_reclaim_thr_lock);
+ cv_destroy(&arc_reclaim_thr_cv);
+
+ list_destroy(&arc_mru->arcs_list);
+ list_destroy(&arc_mru_ghost->arcs_list);
+ list_destroy(&arc_mfu->arcs_list);
+ list_destroy(&arc_mfu_ghost->arcs_list);
+
+ mutex_destroy(&arc_anon->arcs_mtx);
+ mutex_destroy(&arc_mru->arcs_mtx);
+ mutex_destroy(&arc_mru_ghost->arcs_mtx);
+ mutex_destroy(&arc_mfu->arcs_mtx);
+ mutex_destroy(&arc_mfu_ghost->arcs_mtx);
+
+ buf_fini();
+
+ mutex_destroy(&arc_lowmem_lock);
+#ifdef _KERNEL
+ if (arc_event_lowmem != NULL)
+ EVENTHANDLER_DEREGISTER(vm_lowmem, arc_event_lowmem);
+#endif
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/bplist.c b/sys/contrib/opensolaris/uts/common/fs/zfs/bplist.c
new file mode 100644
index 0000000..4442b1f
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/bplist.c
@@ -0,0 +1,312 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/bplist.h>
+#include <sys/zfs_context.h>
+
+static int
+bplist_hold(bplist_t *bpl)
+{
+ ASSERT(MUTEX_HELD(&bpl->bpl_lock));
+ if (bpl->bpl_dbuf == NULL) {
+ int err = dmu_bonus_hold(bpl->bpl_mos,
+ bpl->bpl_object, bpl, &bpl->bpl_dbuf);
+ if (err)
+ return (err);
+ bpl->bpl_phys = bpl->bpl_dbuf->db_data;
+ }
+ return (0);
+}
+
+uint64_t
+bplist_create(objset_t *mos, int blocksize, dmu_tx_t *tx)
+{
+ int size;
+
+ size = spa_version(dmu_objset_spa(mos)) < ZFS_VERSION_BPLIST_ACCOUNT ?
+ BPLIST_SIZE_V0 : sizeof (bplist_phys_t);
+
+ return (dmu_object_alloc(mos, DMU_OT_BPLIST, blocksize,
+ DMU_OT_BPLIST_HDR, size, tx));
+}
+
+void
+bplist_destroy(objset_t *mos, uint64_t object, dmu_tx_t *tx)
+{
+ VERIFY(dmu_object_free(mos, object, tx) == 0);
+}
+
+int
+bplist_open(bplist_t *bpl, objset_t *mos, uint64_t object)
+{
+ dmu_object_info_t doi;
+ int err;
+
+ err = dmu_object_info(mos, object, &doi);
+ if (err)
+ return (err);
+
+ mutex_enter(&bpl->bpl_lock);
+
+ ASSERT(bpl->bpl_dbuf == NULL);
+ ASSERT(bpl->bpl_phys == NULL);
+ ASSERT(bpl->bpl_cached_dbuf == NULL);
+ ASSERT(bpl->bpl_queue == NULL);
+ ASSERT(object != 0);
+ ASSERT3U(doi.doi_type, ==, DMU_OT_BPLIST);
+ ASSERT3U(doi.doi_bonus_type, ==, DMU_OT_BPLIST_HDR);
+
+ bpl->bpl_mos = mos;
+ bpl->bpl_object = object;
+ bpl->bpl_blockshift = highbit(doi.doi_data_block_size - 1);
+ bpl->bpl_bpshift = bpl->bpl_blockshift - SPA_BLKPTRSHIFT;
+ bpl->bpl_havecomp = (doi.doi_bonus_size == sizeof (bplist_phys_t));
+
+ mutex_exit(&bpl->bpl_lock);
+ return (0);
+}
+
+void
+bplist_close(bplist_t *bpl)
+{
+ mutex_enter(&bpl->bpl_lock);
+
+ ASSERT(bpl->bpl_queue == NULL);
+
+ if (bpl->bpl_cached_dbuf) {
+ dmu_buf_rele(bpl->bpl_cached_dbuf, bpl);
+ bpl->bpl_cached_dbuf = NULL;
+ }
+ if (bpl->bpl_dbuf) {
+ dmu_buf_rele(bpl->bpl_dbuf, bpl);
+ bpl->bpl_dbuf = NULL;
+ bpl->bpl_phys = NULL;
+ }
+
+ mutex_exit(&bpl->bpl_lock);
+}
+
+boolean_t
+bplist_empty(bplist_t *bpl)
+{
+ boolean_t rv;
+
+ if (bpl->bpl_object == 0)
+ return (B_TRUE);
+
+ mutex_enter(&bpl->bpl_lock);
+ VERIFY(0 == bplist_hold(bpl)); /* XXX */
+ rv = (bpl->bpl_phys->bpl_entries == 0);
+ mutex_exit(&bpl->bpl_lock);
+
+ return (rv);
+}
+
+static int
+bplist_cache(bplist_t *bpl, uint64_t blkid)
+{
+ int err = 0;
+
+ if (bpl->bpl_cached_dbuf == NULL ||
+ bpl->bpl_cached_dbuf->db_offset != (blkid << bpl->bpl_blockshift)) {
+ if (bpl->bpl_cached_dbuf != NULL)
+ dmu_buf_rele(bpl->bpl_cached_dbuf, bpl);
+ err = dmu_buf_hold(bpl->bpl_mos,
+ bpl->bpl_object, blkid << bpl->bpl_blockshift,
+ bpl, &bpl->bpl_cached_dbuf);
+ ASSERT(err || bpl->bpl_cached_dbuf->db_size ==
+ 1ULL << bpl->bpl_blockshift);
+ }
+ return (err);
+}
+
+int
+bplist_iterate(bplist_t *bpl, uint64_t *itorp, blkptr_t *bp)
+{
+ uint64_t blk, off;
+ blkptr_t *bparray;
+ int err;
+
+ mutex_enter(&bpl->bpl_lock);
+
+ err = bplist_hold(bpl);
+ if (err) {
+ mutex_exit(&bpl->bpl_lock);
+ return (err);
+ }
+
+ if (*itorp >= bpl->bpl_phys->bpl_entries) {
+ mutex_exit(&bpl->bpl_lock);
+ return (ENOENT);
+ }
+
+ blk = *itorp >> bpl->bpl_bpshift;
+ off = P2PHASE(*itorp, 1ULL << bpl->bpl_bpshift);
+
+ err = bplist_cache(bpl, blk);
+ if (err) {
+ mutex_exit(&bpl->bpl_lock);
+ return (err);
+ }
+
+ bparray = bpl->bpl_cached_dbuf->db_data;
+ *bp = bparray[off];
+ (*itorp)++;
+ mutex_exit(&bpl->bpl_lock);
+ return (0);
+}
+
+int
+bplist_enqueue(bplist_t *bpl, blkptr_t *bp, dmu_tx_t *tx)
+{
+ uint64_t blk, off;
+ blkptr_t *bparray;
+ int err;
+
+ ASSERT(!BP_IS_HOLE(bp));
+ mutex_enter(&bpl->bpl_lock);
+ err = bplist_hold(bpl);
+ if (err)
+ return (err);
+
+ blk = bpl->bpl_phys->bpl_entries >> bpl->bpl_bpshift;
+ off = P2PHASE(bpl->bpl_phys->bpl_entries, 1ULL << bpl->bpl_bpshift);
+
+ err = bplist_cache(bpl, blk);
+ if (err) {
+ mutex_exit(&bpl->bpl_lock);
+ return (err);
+ }
+
+ dmu_buf_will_dirty(bpl->bpl_cached_dbuf, tx);
+ bparray = bpl->bpl_cached_dbuf->db_data;
+ bparray[off] = *bp;
+
+ /* We never need the fill count. */
+ bparray[off].blk_fill = 0;
+
+ /* The bplist will compress better if we can leave off the checksum */
+ bzero(&bparray[off].blk_cksum, sizeof (bparray[off].blk_cksum));
+
+ dmu_buf_will_dirty(bpl->bpl_dbuf, tx);
+ bpl->bpl_phys->bpl_entries++;
+ bpl->bpl_phys->bpl_bytes +=
+ bp_get_dasize(dmu_objset_spa(bpl->bpl_mos), bp);
+ if (bpl->bpl_havecomp) {
+ bpl->bpl_phys->bpl_comp += BP_GET_PSIZE(bp);
+ bpl->bpl_phys->bpl_uncomp += BP_GET_UCSIZE(bp);
+ }
+ mutex_exit(&bpl->bpl_lock);
+
+ return (0);
+}
+
+/*
+ * Deferred entry; will be written later by bplist_sync().
+ */
+void
+bplist_enqueue_deferred(bplist_t *bpl, blkptr_t *bp)
+{
+ bplist_q_t *bpq = kmem_alloc(sizeof (*bpq), KM_SLEEP);
+
+ ASSERT(!BP_IS_HOLE(bp));
+ mutex_enter(&bpl->bpl_lock);
+ bpq->bpq_blk = *bp;
+ bpq->bpq_next = bpl->bpl_queue;
+ bpl->bpl_queue = bpq;
+ mutex_exit(&bpl->bpl_lock);
+}
+
+void
+bplist_sync(bplist_t *bpl, dmu_tx_t *tx)
+{
+ bplist_q_t *bpq;
+
+ mutex_enter(&bpl->bpl_lock);
+ while ((bpq = bpl->bpl_queue) != NULL) {
+ bpl->bpl_queue = bpq->bpq_next;
+ mutex_exit(&bpl->bpl_lock);
+ VERIFY(0 == bplist_enqueue(bpl, &bpq->bpq_blk, tx));
+ kmem_free(bpq, sizeof (*bpq));
+ mutex_enter(&bpl->bpl_lock);
+ }
+ mutex_exit(&bpl->bpl_lock);
+}
+
+void
+bplist_vacate(bplist_t *bpl, dmu_tx_t *tx)
+{
+ mutex_enter(&bpl->bpl_lock);
+ ASSERT3P(bpl->bpl_queue, ==, NULL);
+ VERIFY(0 == bplist_hold(bpl));
+ dmu_buf_will_dirty(bpl->bpl_dbuf, tx);
+ VERIFY(0 == dmu_free_range(bpl->bpl_mos,
+ bpl->bpl_object, 0, -1ULL, tx));
+ bpl->bpl_phys->bpl_entries = 0;
+ bpl->bpl_phys->bpl_bytes = 0;
+ if (bpl->bpl_havecomp) {
+ bpl->bpl_phys->bpl_comp = 0;
+ bpl->bpl_phys->bpl_uncomp = 0;
+ }
+ mutex_exit(&bpl->bpl_lock);
+}
+
+int
+bplist_space(bplist_t *bpl, uint64_t *usedp, uint64_t *compp, uint64_t *uncompp)
+{
+ uint64_t itor = 0, comp = 0, uncomp = 0;
+ int err;
+ blkptr_t bp;
+
+ mutex_enter(&bpl->bpl_lock);
+
+ err = bplist_hold(bpl);
+ if (err) {
+ mutex_exit(&bpl->bpl_lock);
+ return (err);
+ }
+
+ *usedp = bpl->bpl_phys->bpl_bytes;
+ if (bpl->bpl_havecomp) {
+ *compp = bpl->bpl_phys->bpl_comp;
+ *uncompp = bpl->bpl_phys->bpl_uncomp;
+ }
+ mutex_exit(&bpl->bpl_lock);
+
+ if (!bpl->bpl_havecomp) {
+ while ((err = bplist_iterate(bpl, &itor, &bp)) == 0) {
+ comp += BP_GET_PSIZE(&bp);
+ uncomp += BP_GET_UCSIZE(&bp);
+ }
+ if (err == ENOENT)
+ err = 0;
+ *compp = comp;
+ *uncompp = uncomp;
+ }
+
+ return (err);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dbuf.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
new file mode 100644
index 0000000..94c6308
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dbuf.c
@@ -0,0 +1,2247 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/dmu.h>
+#include <sys/dmu_impl.h>
+#include <sys/dbuf.h>
+#include <sys/dmu_objset.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dmu_tx.h>
+#include <sys/spa.h>
+#include <sys/zio.h>
+#include <sys/dmu_zfetch.h>
+
+static void dbuf_destroy(dmu_buf_impl_t *db);
+static int dbuf_undirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
+static void dbuf_write(dbuf_dirty_record_t *dr, arc_buf_t *data, int checksum,
+ int compress, dmu_tx_t *tx);
+static arc_done_func_t dbuf_write_ready;
+static arc_done_func_t dbuf_write_done;
+
+int zfs_mdcomp_disable = 0;
+SYSCTL_DECL(_vfs_zfs);
+TUNABLE_INT("vfs.zfs.mdcomp_disable", &zfs_mdcomp_disable);
+SYSCTL_INT(_vfs_zfs, OID_AUTO, mdcomp_disable, CTLFLAG_RDTUN,
+ &zfs_mdcomp_disable, 0, "Disable metadata compression");
+
+/*
+ * Global data structures and functions for the dbuf cache.
+ */
+static kmem_cache_t *dbuf_cache;
+
+/* ARGSUSED */
+static int
+dbuf_cons(void *vdb, void *unused, int kmflag)
+{
+ dmu_buf_impl_t *db = vdb;
+ bzero(db, sizeof (dmu_buf_impl_t));
+
+ mutex_init(&db->db_mtx, NULL, MUTEX_DEFAULT, NULL);
+ cv_init(&db->db_changed, NULL, CV_DEFAULT, NULL);
+ refcount_create(&db->db_holds);
+ return (0);
+}
+
+/* ARGSUSED */
+static void
+dbuf_dest(void *vdb, void *unused)
+{
+ dmu_buf_impl_t *db = vdb;
+ mutex_destroy(&db->db_mtx);
+ cv_destroy(&db->db_changed);
+ refcount_destroy(&db->db_holds);
+}
+
+/*
+ * dbuf hash table routines
+ */
+static dbuf_hash_table_t dbuf_hash_table;
+
+static uint64_t dbuf_hash_count;
+
+static uint64_t
+dbuf_hash(void *os, uint64_t obj, uint8_t lvl, uint64_t blkid)
+{
+ uintptr_t osv = (uintptr_t)os;
+ uint64_t crc = -1ULL;
+
+ ASSERT(zfs_crc64_table[128] == ZFS_CRC64_POLY);
+ crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ (lvl)) & 0xFF];
+ crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ (osv >> 6)) & 0xFF];
+ crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ (obj >> 0)) & 0xFF];
+ crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ (obj >> 8)) & 0xFF];
+ crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ (blkid >> 0)) & 0xFF];
+ crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ (blkid >> 8)) & 0xFF];
+
+ crc ^= (osv>>14) ^ (obj>>16) ^ (blkid>>16);
+
+ return (crc);
+}
+
+#define DBUF_HASH(os, obj, level, blkid) dbuf_hash(os, obj, level, blkid);
+
+#define DBUF_EQUAL(dbuf, os, obj, level, blkid) \
+ ((dbuf)->db.db_object == (obj) && \
+ (dbuf)->db_objset == (os) && \
+ (dbuf)->db_level == (level) && \
+ (dbuf)->db_blkid == (blkid))
+
+dmu_buf_impl_t *
+dbuf_find(dnode_t *dn, uint8_t level, uint64_t blkid)
+{
+ dbuf_hash_table_t *h = &dbuf_hash_table;
+ objset_impl_t *os = dn->dn_objset;
+ uint64_t obj = dn->dn_object;
+ uint64_t hv = DBUF_HASH(os, obj, level, blkid);
+ uint64_t idx = hv & h->hash_table_mask;
+ dmu_buf_impl_t *db;
+
+ mutex_enter(DBUF_HASH_MUTEX(h, idx));
+ for (db = h->hash_table[idx]; db != NULL; db = db->db_hash_next) {
+ if (DBUF_EQUAL(db, os, obj, level, blkid)) {
+ mutex_enter(&db->db_mtx);
+ if (db->db_state != DB_EVICTING) {
+ mutex_exit(DBUF_HASH_MUTEX(h, idx));
+ return (db);
+ }
+ mutex_exit(&db->db_mtx);
+ }
+ }
+ mutex_exit(DBUF_HASH_MUTEX(h, idx));
+ return (NULL);
+}
+
+/*
+ * Insert an entry into the hash table. If there is already an element
+ * equal to elem in the hash table, then the already existing element
+ * will be returned and the new element will not be inserted.
+ * Otherwise returns NULL.
+ */
+static dmu_buf_impl_t *
+dbuf_hash_insert(dmu_buf_impl_t *db)
+{
+ dbuf_hash_table_t *h = &dbuf_hash_table;
+ objset_impl_t *os = db->db_objset;
+ uint64_t obj = db->db.db_object;
+ int level = db->db_level;
+ uint64_t blkid = db->db_blkid;
+ uint64_t hv = DBUF_HASH(os, obj, level, blkid);
+ uint64_t idx = hv & h->hash_table_mask;
+ dmu_buf_impl_t *dbf;
+
+ mutex_enter(DBUF_HASH_MUTEX(h, idx));
+ for (dbf = h->hash_table[idx]; dbf != NULL; dbf = dbf->db_hash_next) {
+ if (DBUF_EQUAL(dbf, os, obj, level, blkid)) {
+ mutex_enter(&dbf->db_mtx);
+ if (dbf->db_state != DB_EVICTING) {
+ mutex_exit(DBUF_HASH_MUTEX(h, idx));
+ return (dbf);
+ }
+ mutex_exit(&dbf->db_mtx);
+ }
+ }
+
+ mutex_enter(&db->db_mtx);
+ db->db_hash_next = h->hash_table[idx];
+ h->hash_table[idx] = db;
+ mutex_exit(DBUF_HASH_MUTEX(h, idx));
+ atomic_add_64(&dbuf_hash_count, 1);
+
+ return (NULL);
+}
+
+/*
+ * Remove an entry from the hash table. This operation will
+ * fail if there are any existing holds on the db.
+ */
+static void
+dbuf_hash_remove(dmu_buf_impl_t *db)
+{
+ dbuf_hash_table_t *h = &dbuf_hash_table;
+ uint64_t hv = DBUF_HASH(db->db_objset, db->db.db_object,
+ db->db_level, db->db_blkid);
+ uint64_t idx = hv & h->hash_table_mask;
+ dmu_buf_impl_t *dbf, **dbp;
+
+ /*
+ * We musn't hold db_mtx to maintin lock ordering:
+ * DBUF_HASH_MUTEX > db_mtx.
+ */
+ ASSERT(refcount_is_zero(&db->db_holds));
+ ASSERT(db->db_state == DB_EVICTING);
+ ASSERT(!MUTEX_HELD(&db->db_mtx));
+
+ mutex_enter(DBUF_HASH_MUTEX(h, idx));
+ dbp = &h->hash_table[idx];
+ while ((dbf = *dbp) != db) {
+ dbp = &dbf->db_hash_next;
+ ASSERT(dbf != NULL);
+ }
+ *dbp = db->db_hash_next;
+ db->db_hash_next = NULL;
+ mutex_exit(DBUF_HASH_MUTEX(h, idx));
+ atomic_add_64(&dbuf_hash_count, -1);
+}
+
+static arc_evict_func_t dbuf_do_evict;
+
+static void
+dbuf_evict_user(dmu_buf_impl_t *db)
+{
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+
+ if (db->db_level != 0 || db->db_evict_func == NULL)
+ return;
+
+ if (db->db_user_data_ptr_ptr)
+ *db->db_user_data_ptr_ptr = db->db.db_data;
+ db->db_evict_func(&db->db, db->db_user_ptr);
+ db->db_user_ptr = NULL;
+ db->db_user_data_ptr_ptr = NULL;
+ db->db_evict_func = NULL;
+}
+
+void
+dbuf_evict(dmu_buf_impl_t *db)
+{
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+ ASSERT(db->db_buf == NULL);
+ ASSERT(db->db_data_pending == NULL);
+
+ dbuf_clear(db);
+ dbuf_destroy(db);
+}
+
+void
+dbuf_init(void)
+{
+ uint64_t hsize = 1ULL << 16;
+ dbuf_hash_table_t *h = &dbuf_hash_table;
+ int i;
+
+ /*
+ * The hash table is big enough to fill all of physical memory
+ * with an average 4K block size. The table will take up
+ * totalmem*sizeof(void*)/4K (i.e. 2MB/GB with 8-byte pointers).
+ */
+ while (hsize * 4096 < (uint64_t)physmem * PAGESIZE)
+ hsize <<= 1;
+
+retry:
+ h->hash_table_mask = hsize - 1;
+ h->hash_table = kmem_zalloc(hsize * sizeof (void *), KM_NOSLEEP);
+ if (h->hash_table == NULL) {
+ /* XXX - we should really return an error instead of assert */
+ ASSERT(hsize > (1ULL << 10));
+ hsize >>= 1;
+ goto retry;
+ }
+
+ dbuf_cache = kmem_cache_create("dmu_buf_impl_t",
+ sizeof (dmu_buf_impl_t),
+ 0, dbuf_cons, dbuf_dest, NULL, NULL, NULL, 0);
+
+ for (i = 0; i < DBUF_MUTEXES; i++)
+ mutex_init(&h->hash_mutexes[i], NULL, MUTEX_DEFAULT, NULL);
+}
+
+void
+dbuf_fini(void)
+{
+ dbuf_hash_table_t *h = &dbuf_hash_table;
+ int i;
+
+ for (i = 0; i < DBUF_MUTEXES; i++)
+ mutex_destroy(&h->hash_mutexes[i]);
+ kmem_free(h->hash_table, (h->hash_table_mask + 1) * sizeof (void *));
+ kmem_cache_destroy(dbuf_cache);
+}
+
+/*
+ * Other stuff.
+ */
+
+#ifdef ZFS_DEBUG
+static void
+dbuf_verify(dmu_buf_impl_t *db)
+{
+ dnode_t *dn = db->db_dnode;
+
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+
+ if (!(zfs_flags & ZFS_DEBUG_DBUF_VERIFY))
+ return;
+
+ ASSERT(db->db_objset != NULL);
+ if (dn == NULL) {
+ ASSERT(db->db_parent == NULL);
+ ASSERT(db->db_blkptr == NULL);
+ } else {
+ ASSERT3U(db->db.db_object, ==, dn->dn_object);
+ ASSERT3P(db->db_objset, ==, dn->dn_objset);
+ ASSERT3U(db->db_level, <, dn->dn_nlevels);
+ ASSERT(db->db_blkid == DB_BONUS_BLKID ||
+ list_head(&dn->dn_dbufs));
+ }
+ if (db->db_blkid == DB_BONUS_BLKID) {
+ ASSERT(dn != NULL);
+ ASSERT3U(db->db.db_size, ==, dn->dn_bonuslen);
+ ASSERT3U(db->db.db_offset, ==, DB_BONUS_BLKID);
+ } else {
+ ASSERT3U(db->db.db_offset, ==, db->db_blkid * db->db.db_size);
+ }
+
+ if (db->db_level == 0) {
+ /* we can be momentarily larger in dnode_set_blksz() */
+ if (db->db_blkid != DB_BONUS_BLKID && dn) {
+ ASSERT3U(db->db.db_size, >=, dn->dn_datablksz);
+ }
+ if (db->db.db_object == DMU_META_DNODE_OBJECT) {
+ dbuf_dirty_record_t *dr = db->db_data_pending;
+ /*
+ * it should only be modified in syncing
+ * context, so make sure we only have
+ * one copy of the data.
+ */
+ ASSERT(dr == NULL || dr->dt.dl.dr_data == db->db_buf);
+ }
+ }
+
+ /* verify db->db_blkptr */
+ if (db->db_blkptr) {
+ if (db->db_parent == dn->dn_dbuf) {
+ /* db is pointed to by the dnode */
+ /* ASSERT3U(db->db_blkid, <, dn->dn_nblkptr); */
+ if (db->db.db_object == DMU_META_DNODE_OBJECT)
+ ASSERT(db->db_parent == NULL);
+ else
+ ASSERT(db->db_parent != NULL);
+ ASSERT3P(db->db_blkptr, ==,
+ &dn->dn_phys->dn_blkptr[db->db_blkid]);
+ } else {
+ /* db is pointed to by an indirect block */
+ int epb = db->db_parent->db.db_size >> SPA_BLKPTRSHIFT;
+ ASSERT3U(db->db_parent->db_level, ==, db->db_level+1);
+ ASSERT3U(db->db_parent->db.db_object, ==,
+ db->db.db_object);
+ /*
+ * dnode_grow_indblksz() can make this fail if we don't
+ * have the struct_rwlock. XXX indblksz no longer
+ * grows. safe to do this now?
+ */
+ if (RW_WRITE_HELD(&db->db_dnode->dn_struct_rwlock)) {
+ ASSERT3P(db->db_blkptr, ==,
+ ((blkptr_t *)db->db_parent->db.db_data +
+ db->db_blkid % epb));
+ }
+ }
+ }
+ if ((db->db_blkptr == NULL || BP_IS_HOLE(db->db_blkptr)) &&
+ db->db.db_data && db->db_blkid != DB_BONUS_BLKID &&
+ db->db_state != DB_FILL && !dn->dn_free_txg) {
+ /*
+ * If the blkptr isn't set but they have nonzero data,
+ * it had better be dirty, otherwise we'll lose that
+ * data when we evict this buffer.
+ */
+ if (db->db_dirtycnt == 0) {
+ uint64_t *buf = db->db.db_data;
+ int i;
+
+ for (i = 0; i < db->db.db_size >> 3; i++) {
+ ASSERT(buf[i] == 0);
+ }
+ }
+ }
+}
+#endif
+
+static void
+dbuf_update_data(dmu_buf_impl_t *db)
+{
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+ if (db->db_level == 0 && db->db_user_data_ptr_ptr) {
+ ASSERT(!refcount_is_zero(&db->db_holds));
+ *db->db_user_data_ptr_ptr = db->db.db_data;
+ }
+}
+
+static void
+dbuf_set_data(dmu_buf_impl_t *db, arc_buf_t *buf)
+{
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+ ASSERT(db->db_buf == NULL || !arc_has_callback(db->db_buf));
+ db->db_buf = buf;
+ if (buf != NULL) {
+ ASSERT(buf->b_data != NULL);
+ db->db.db_data = buf->b_data;
+ if (!arc_released(buf))
+ arc_set_callback(buf, dbuf_do_evict, db);
+ dbuf_update_data(db);
+ } else {
+ dbuf_evict_user(db);
+ db->db.db_data = NULL;
+ db->db_state = DB_UNCACHED;
+ }
+}
+
+uint64_t
+dbuf_whichblock(dnode_t *dn, uint64_t offset)
+{
+ if (dn->dn_datablkshift) {
+ return (offset >> dn->dn_datablkshift);
+ } else {
+ ASSERT3U(offset, <, dn->dn_datablksz);
+ return (0);
+ }
+}
+
+static void
+dbuf_read_done(zio_t *zio, arc_buf_t *buf, void *vdb)
+{
+ dmu_buf_impl_t *db = vdb;
+
+ mutex_enter(&db->db_mtx);
+ ASSERT3U(db->db_state, ==, DB_READ);
+ /*
+ * All reads are synchronous, so we must have a hold on the dbuf
+ */
+ ASSERT(refcount_count(&db->db_holds) > 0);
+ ASSERT(db->db_buf == NULL);
+ ASSERT(db->db.db_data == NULL);
+ if (db->db_level == 0 && db->db_freed_in_flight) {
+ /* we were freed in flight; disregard any error */
+ arc_release(buf, db);
+ bzero(buf->b_data, db->db.db_size);
+ arc_buf_freeze(buf);
+ db->db_freed_in_flight = FALSE;
+ dbuf_set_data(db, buf);
+ db->db_state = DB_CACHED;
+ } else if (zio == NULL || zio->io_error == 0) {
+ dbuf_set_data(db, buf);
+ db->db_state = DB_CACHED;
+ } else {
+ ASSERT(db->db_blkid != DB_BONUS_BLKID);
+ ASSERT3P(db->db_buf, ==, NULL);
+ VERIFY(arc_buf_remove_ref(buf, db) == 1);
+ db->db_state = DB_UNCACHED;
+ }
+ cv_broadcast(&db->db_changed);
+ mutex_exit(&db->db_mtx);
+ dbuf_rele(db, NULL);
+}
+
+static void
+dbuf_read_impl(dmu_buf_impl_t *db, zio_t *zio, uint32_t *flags)
+{
+ blkptr_t *bp;
+ zbookmark_t zb;
+ uint32_t aflags = ARC_NOWAIT;
+
+ ASSERT(!refcount_is_zero(&db->db_holds));
+ /* We need the struct_rwlock to prevent db_blkptr from changing. */
+ ASSERT(RW_LOCK_HELD(&db->db_dnode->dn_struct_rwlock));
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+ ASSERT(db->db_state == DB_UNCACHED);
+ ASSERT(db->db_buf == NULL);
+
+ if (db->db_blkid == DB_BONUS_BLKID) {
+ ASSERT3U(db->db_dnode->dn_bonuslen, ==, db->db.db_size);
+ db->db.db_data = zio_buf_alloc(DN_MAX_BONUSLEN);
+ if (db->db.db_size < DN_MAX_BONUSLEN)
+ bzero(db->db.db_data, DN_MAX_BONUSLEN);
+ bcopy(DN_BONUS(db->db_dnode->dn_phys), db->db.db_data,
+ db->db.db_size);
+ dbuf_update_data(db);
+ db->db_state = DB_CACHED;
+ mutex_exit(&db->db_mtx);
+ return;
+ }
+
+ if (db->db_level == 0 && dnode_block_freed(db->db_dnode, db->db_blkid))
+ bp = NULL;
+ else
+ bp = db->db_blkptr;
+
+ if (bp == NULL)
+ dprintf_dbuf(db, "blkptr: %s\n", "NULL");
+ else
+ dprintf_dbuf_bp(db, bp, "%s", "blkptr:");
+
+ if (bp == NULL || BP_IS_HOLE(bp)) {
+ arc_buf_contents_t type = DBUF_GET_BUFC_TYPE(db);
+
+ ASSERT(bp == NULL || BP_IS_HOLE(bp));
+ dbuf_set_data(db, arc_buf_alloc(db->db_dnode->dn_objset->os_spa,
+ db->db.db_size, db, type));
+ bzero(db->db.db_data, db->db.db_size);
+ db->db_state = DB_CACHED;
+ *flags |= DB_RF_CACHED;
+ mutex_exit(&db->db_mtx);
+ return;
+ }
+
+ db->db_state = DB_READ;
+ mutex_exit(&db->db_mtx);
+
+ zb.zb_objset = db->db_objset->os_dsl_dataset ?
+ db->db_objset->os_dsl_dataset->ds_object : 0;
+ zb.zb_object = db->db.db_object;
+ zb.zb_level = db->db_level;
+ zb.zb_blkid = db->db_blkid;
+
+ dbuf_add_ref(db, NULL);
+ /* ZIO_FLAG_CANFAIL callers have to check the parent zio's error */
+ ASSERT3U(db->db_dnode->dn_type, <, DMU_OT_NUMTYPES);
+ (void) arc_read(zio, db->db_dnode->dn_objset->os_spa, bp,
+ db->db_level > 0 ? byteswap_uint64_array :
+ dmu_ot[db->db_dnode->dn_type].ot_byteswap,
+ dbuf_read_done, db, ZIO_PRIORITY_SYNC_READ,
+ (*flags & DB_RF_CANFAIL) ? ZIO_FLAG_CANFAIL : ZIO_FLAG_MUSTSUCCEED,
+ &aflags, &zb);
+ if (aflags & ARC_CACHED)
+ *flags |= DB_RF_CACHED;
+}
+
+int
+dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags)
+{
+ int err = 0;
+ int havepzio = (zio != NULL);
+ int prefetch;
+
+ /*
+ * We don't have to hold the mutex to check db_state because it
+ * can't be freed while we have a hold on the buffer.
+ */
+ ASSERT(!refcount_is_zero(&db->db_holds));
+
+ if ((flags & DB_RF_HAVESTRUCT) == 0)
+ rw_enter(&db->db_dnode->dn_struct_rwlock, RW_READER);
+
+ prefetch = db->db_level == 0 && db->db_blkid != DB_BONUS_BLKID &&
+ (flags & DB_RF_NOPREFETCH) == 0 && db->db_dnode != NULL;
+
+ mutex_enter(&db->db_mtx);
+ if (db->db_state == DB_CACHED) {
+ mutex_exit(&db->db_mtx);
+ if (prefetch)
+ dmu_zfetch(&db->db_dnode->dn_zfetch, db->db.db_offset,
+ db->db.db_size, TRUE);
+ if ((flags & DB_RF_HAVESTRUCT) == 0)
+ rw_exit(&db->db_dnode->dn_struct_rwlock);
+ } else if (db->db_state == DB_UNCACHED) {
+ if (zio == NULL) {
+ zio = zio_root(db->db_dnode->dn_objset->os_spa,
+ NULL, NULL, ZIO_FLAG_CANFAIL);
+ }
+ dbuf_read_impl(db, zio, &flags);
+
+ /* dbuf_read_impl has dropped db_mtx for us */
+
+ if (prefetch)
+ dmu_zfetch(&db->db_dnode->dn_zfetch, db->db.db_offset,
+ db->db.db_size, flags & DB_RF_CACHED);
+
+ if ((flags & DB_RF_HAVESTRUCT) == 0)
+ rw_exit(&db->db_dnode->dn_struct_rwlock);
+
+ if (!havepzio)
+ err = zio_wait(zio);
+ } else {
+ mutex_exit(&db->db_mtx);
+ if (prefetch)
+ dmu_zfetch(&db->db_dnode->dn_zfetch, db->db.db_offset,
+ db->db.db_size, TRUE);
+ if ((flags & DB_RF_HAVESTRUCT) == 0)
+ rw_exit(&db->db_dnode->dn_struct_rwlock);
+
+ mutex_enter(&db->db_mtx);
+ if ((flags & DB_RF_NEVERWAIT) == 0) {
+ while (db->db_state == DB_READ ||
+ db->db_state == DB_FILL) {
+ ASSERT(db->db_state == DB_READ ||
+ (flags & DB_RF_HAVESTRUCT) == 0);
+ cv_wait(&db->db_changed, &db->db_mtx);
+ }
+ if (db->db_state == DB_UNCACHED)
+ err = EIO;
+ }
+ mutex_exit(&db->db_mtx);
+ }
+
+ ASSERT(err || havepzio || db->db_state == DB_CACHED);
+ return (err);
+}
+
+static void
+dbuf_noread(dmu_buf_impl_t *db)
+{
+ ASSERT(!refcount_is_zero(&db->db_holds));
+ ASSERT(db->db_blkid != DB_BONUS_BLKID);
+ mutex_enter(&db->db_mtx);
+ while (db->db_state == DB_READ || db->db_state == DB_FILL)
+ cv_wait(&db->db_changed, &db->db_mtx);
+ if (db->db_state == DB_UNCACHED) {
+ arc_buf_contents_t type = DBUF_GET_BUFC_TYPE(db);
+
+ ASSERT(db->db_buf == NULL);
+ ASSERT(db->db.db_data == NULL);
+ dbuf_set_data(db, arc_buf_alloc(db->db_dnode->dn_objset->os_spa,
+ db->db.db_size, db, type));
+ db->db_state = DB_FILL;
+ } else {
+ ASSERT3U(db->db_state, ==, DB_CACHED);
+ }
+ mutex_exit(&db->db_mtx);
+}
+
+/*
+ * This is our just-in-time copy function. It makes a copy of
+ * buffers, that have been modified in a previous transaction
+ * group, before we modify them in the current active group.
+ *
+ * This function is used in two places: when we are dirtying a
+ * buffer for the first time in a txg, and when we are freeing
+ * a range in a dnode that includes this buffer.
+ *
+ * Note that when we are called from dbuf_free_range() we do
+ * not put a hold on the buffer, we just traverse the active
+ * dbuf list for the dnode.
+ */
+static void
+dbuf_fix_old_data(dmu_buf_impl_t *db, uint64_t txg)
+{
+ dbuf_dirty_record_t *dr = db->db_last_dirty;
+
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+ ASSERT(db->db.db_data != NULL);
+ ASSERT(db->db_level == 0);
+ ASSERT(db->db.db_object != DMU_META_DNODE_OBJECT);
+
+ if (dr == NULL ||
+ (dr->dt.dl.dr_data !=
+ ((db->db_blkid == DB_BONUS_BLKID) ? db->db.db_data : db->db_buf)))
+ return;
+
+ /*
+ * If the last dirty record for this dbuf has not yet synced
+ * and its referencing the dbuf data, either:
+ * reset the reference to point to a new copy,
+ * or (if there a no active holders)
+ * just null out the current db_data pointer.
+ */
+ ASSERT(dr->dr_txg >= txg - 2);
+ if (db->db_blkid == DB_BONUS_BLKID) {
+ /* Note that the data bufs here are zio_bufs */
+ dr->dt.dl.dr_data = zio_buf_alloc(DN_MAX_BONUSLEN);
+ bcopy(db->db.db_data, dr->dt.dl.dr_data, DN_MAX_BONUSLEN);
+ } else if (refcount_count(&db->db_holds) > db->db_dirtycnt) {
+ int size = db->db.db_size;
+ arc_buf_contents_t type = DBUF_GET_BUFC_TYPE(db);
+ dr->dt.dl.dr_data = arc_buf_alloc(
+ db->db_dnode->dn_objset->os_spa, size, db, type);
+ bcopy(db->db.db_data, dr->dt.dl.dr_data->b_data, size);
+ } else {
+ dbuf_set_data(db, NULL);
+ }
+}
+
+void
+dbuf_unoverride(dbuf_dirty_record_t *dr)
+{
+ dmu_buf_impl_t *db = dr->dr_dbuf;
+ uint64_t txg = dr->dr_txg;
+
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+ ASSERT(dr->dt.dl.dr_override_state != DR_IN_DMU_SYNC);
+ ASSERT(db->db_level == 0);
+
+ if (db->db_blkid == DB_BONUS_BLKID ||
+ dr->dt.dl.dr_override_state == DR_NOT_OVERRIDDEN)
+ return;
+
+ /* free this block */
+ if (!BP_IS_HOLE(&dr->dt.dl.dr_overridden_by)) {
+ /* XXX can get silent EIO here */
+ (void) arc_free(NULL, db->db_dnode->dn_objset->os_spa,
+ txg, &dr->dt.dl.dr_overridden_by, NULL, NULL, ARC_WAIT);
+ }
+ dr->dt.dl.dr_override_state = DR_NOT_OVERRIDDEN;
+ /*
+ * Release the already-written buffer, so we leave it in
+ * a consistent dirty state. Note that all callers are
+ * modifying the buffer, so they will immediately do
+ * another (redundant) arc_release(). Therefore, leave
+ * the buf thawed to save the effort of freezing &
+ * immediately re-thawing it.
+ */
+ arc_release(dr->dt.dl.dr_data, db);
+}
+
+void
+dbuf_free_range(dnode_t *dn, uint64_t blkid, uint64_t nblks, dmu_tx_t *tx)
+{
+ dmu_buf_impl_t *db, *db_next;
+ uint64_t txg = tx->tx_txg;
+
+ dprintf_dnode(dn, "blkid=%llu nblks=%llu\n", blkid, nblks);
+ mutex_enter(&dn->dn_dbufs_mtx);
+ for (db = list_head(&dn->dn_dbufs); db; db = db_next) {
+ db_next = list_next(&dn->dn_dbufs, db);
+ ASSERT(db->db_blkid != DB_BONUS_BLKID);
+ if (db->db_level != 0)
+ continue;
+ dprintf_dbuf(db, "found buf %s\n", "");
+ if (db->db_blkid < blkid ||
+ db->db_blkid >= blkid+nblks)
+ continue;
+
+ /* found a level 0 buffer in the range */
+ if (dbuf_undirty(db, tx))
+ continue;
+
+ mutex_enter(&db->db_mtx);
+ if (db->db_state == DB_UNCACHED ||
+ db->db_state == DB_EVICTING) {
+ ASSERT(db->db.db_data == NULL);
+ mutex_exit(&db->db_mtx);
+ continue;
+ }
+ if (db->db_state == DB_READ || db->db_state == DB_FILL) {
+ /* will be handled in dbuf_read_done or dbuf_rele */
+ db->db_freed_in_flight = TRUE;
+ mutex_exit(&db->db_mtx);
+ continue;
+ }
+ if (refcount_count(&db->db_holds) == 0) {
+ ASSERT(db->db_buf);
+ dbuf_clear(db);
+ continue;
+ }
+ /* The dbuf is referenced */
+
+ if (db->db_last_dirty != NULL) {
+ dbuf_dirty_record_t *dr = db->db_last_dirty;
+
+ if (dr->dr_txg == txg) {
+ /*
+ * This buffer is "in-use", re-adjust the file
+ * size to reflect that this buffer may
+ * contain new data when we sync.
+ */
+ if (db->db_blkid > dn->dn_maxblkid)
+ dn->dn_maxblkid = db->db_blkid;
+ dbuf_unoverride(dr);
+ } else {
+ /*
+ * This dbuf is not dirty in the open context.
+ * Either uncache it (if its not referenced in
+ * the open context) or reset its contents to
+ * empty.
+ */
+ dbuf_fix_old_data(db, txg);
+ }
+ }
+ /* clear the contents if its cached */
+ if (db->db_state == DB_CACHED) {
+ ASSERT(db->db.db_data != NULL);
+ arc_release(db->db_buf, db);
+ bzero(db->db.db_data, db->db.db_size);
+ arc_buf_freeze(db->db_buf);
+ }
+
+ mutex_exit(&db->db_mtx);
+ }
+ mutex_exit(&dn->dn_dbufs_mtx);
+}
+
+static int
+dbuf_new_block(dmu_buf_impl_t *db)
+{
+ dsl_dataset_t *ds = db->db_objset->os_dsl_dataset;
+ uint64_t birth_txg = 0;
+
+ /* Don't count meta-objects */
+ if (ds == NULL)
+ return (FALSE);
+
+ /*
+ * We don't need any locking to protect db_blkptr:
+ * If it's syncing, then db_last_dirty will be set
+ * so we'll ignore db_blkptr.
+ */
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+ /* If we have been dirtied since the last snapshot, its not new */
+ if (db->db_last_dirty)
+ birth_txg = db->db_last_dirty->dr_txg;
+ else if (db->db_blkptr)
+ birth_txg = db->db_blkptr->blk_birth;
+
+ if (birth_txg)
+ return (!dsl_dataset_block_freeable(ds, birth_txg));
+ else
+ return (TRUE);
+}
+
+void
+dbuf_new_size(dmu_buf_impl_t *db, int size, dmu_tx_t *tx)
+{
+ arc_buf_t *buf, *obuf;
+ int osize = db->db.db_size;
+ arc_buf_contents_t type = DBUF_GET_BUFC_TYPE(db);
+
+ ASSERT(db->db_blkid != DB_BONUS_BLKID);
+
+ /* XXX does *this* func really need the lock? */
+ ASSERT(RW_WRITE_HELD(&db->db_dnode->dn_struct_rwlock));
+
+ /*
+ * This call to dbuf_will_dirty() with the dn_struct_rwlock held
+ * is OK, because there can be no other references to the db
+ * when we are changing its size, so no concurrent DB_FILL can
+ * be happening.
+ */
+ /*
+ * XXX we should be doing a dbuf_read, checking the return
+ * value and returning that up to our callers
+ */
+ dbuf_will_dirty(db, tx);
+
+ /* create the data buffer for the new block */
+ buf = arc_buf_alloc(db->db_dnode->dn_objset->os_spa, size, db, type);
+
+ /* copy old block data to the new block */
+ obuf = db->db_buf;
+ bcopy(obuf->b_data, buf->b_data, MIN(osize, size));
+ /* zero the remainder */
+ if (size > osize)
+ bzero((uint8_t *)buf->b_data + osize, size - osize);
+
+ mutex_enter(&db->db_mtx);
+ dbuf_set_data(db, buf);
+ VERIFY(arc_buf_remove_ref(obuf, db) == 1);
+ db->db.db_size = size;
+
+ if (db->db_level == 0) {
+ ASSERT3U(db->db_last_dirty->dr_txg, ==, tx->tx_txg);
+ db->db_last_dirty->dt.dl.dr_data = buf;
+ }
+ mutex_exit(&db->db_mtx);
+
+ dnode_willuse_space(db->db_dnode, size-osize, tx);
+}
+
+dbuf_dirty_record_t *
+dbuf_dirty(dmu_buf_impl_t *db, dmu_tx_t *tx)
+{
+ dnode_t *dn = db->db_dnode;
+ objset_impl_t *os = dn->dn_objset;
+ dbuf_dirty_record_t **drp, *dr;
+ int drop_struct_lock = FALSE;
+ int txgoff = tx->tx_txg & TXG_MASK;
+
+ ASSERT(tx->tx_txg != 0);
+ ASSERT(!refcount_is_zero(&db->db_holds));
+ DMU_TX_DIRTY_BUF(tx, db);
+
+ /*
+ * Shouldn't dirty a regular buffer in syncing context. Private
+ * objects may be dirtied in syncing context, but only if they
+ * were already pre-dirtied in open context.
+ * XXX We may want to prohibit dirtying in syncing context even
+ * if they did pre-dirty.
+ */
+ ASSERT(!dmu_tx_is_syncing(tx) ||
+ BP_IS_HOLE(dn->dn_objset->os_rootbp) ||
+ dn->dn_object == DMU_META_DNODE_OBJECT ||
+ dn->dn_objset->os_dsl_dataset == NULL ||
+ dsl_dir_is_private(dn->dn_objset->os_dsl_dataset->ds_dir));
+
+ /*
+ * We make this assert for private objects as well, but after we
+ * check if we're already dirty. They are allowed to re-dirty
+ * in syncing context.
+ */
+ ASSERT(dn->dn_object == DMU_META_DNODE_OBJECT ||
+ dn->dn_dirtyctx == DN_UNDIRTIED || dn->dn_dirtyctx ==
+ (dmu_tx_is_syncing(tx) ? DN_DIRTY_SYNC : DN_DIRTY_OPEN));
+
+ mutex_enter(&db->db_mtx);
+ /*
+ * XXX make this true for indirects too? The problem is that
+ * transactions created with dmu_tx_create_assigned() from
+ * syncing context don't bother holding ahead.
+ */
+ ASSERT(db->db_level != 0 ||
+ db->db_state == DB_CACHED || db->db_state == DB_FILL);
+
+ mutex_enter(&dn->dn_mtx);
+ /*
+ * Don't set dirtyctx to SYNC if we're just modifying this as we
+ * initialize the objset.
+ */
+ if (dn->dn_dirtyctx == DN_UNDIRTIED &&
+ !BP_IS_HOLE(dn->dn_objset->os_rootbp)) {
+ dn->dn_dirtyctx =
+ (dmu_tx_is_syncing(tx) ? DN_DIRTY_SYNC : DN_DIRTY_OPEN);
+ ASSERT(dn->dn_dirtyctx_firstset == NULL);
+ dn->dn_dirtyctx_firstset = kmem_alloc(1, KM_SLEEP);
+ }
+ mutex_exit(&dn->dn_mtx);
+
+ /*
+ * If this buffer is already dirty, we're done.
+ */
+ drp = &db->db_last_dirty;
+ ASSERT(*drp == NULL || (*drp)->dr_txg <= tx->tx_txg ||
+ db->db.db_object == DMU_META_DNODE_OBJECT);
+ while (*drp && (*drp)->dr_txg > tx->tx_txg)
+ drp = &(*drp)->dr_next;
+ if (*drp && (*drp)->dr_txg == tx->tx_txg) {
+ if (db->db_level == 0 && db->db_blkid != DB_BONUS_BLKID) {
+ /*
+ * If this buffer has already been written out,
+ * we now need to reset its state.
+ */
+ dbuf_unoverride(*drp);
+ if (db->db.db_object != DMU_META_DNODE_OBJECT)
+ arc_buf_thaw(db->db_buf);
+ }
+ mutex_exit(&db->db_mtx);
+ return (*drp);
+ }
+
+ /*
+ * Only valid if not already dirty.
+ */
+ ASSERT(dn->dn_dirtyctx == DN_UNDIRTIED || dn->dn_dirtyctx ==
+ (dmu_tx_is_syncing(tx) ? DN_DIRTY_SYNC : DN_DIRTY_OPEN));
+
+ ASSERT3U(dn->dn_nlevels, >, db->db_level);
+ ASSERT((dn->dn_phys->dn_nlevels == 0 && db->db_level == 0) ||
+ dn->dn_phys->dn_nlevels > db->db_level ||
+ dn->dn_next_nlevels[txgoff] > db->db_level ||
+ dn->dn_next_nlevels[(tx->tx_txg-1) & TXG_MASK] > db->db_level ||
+ dn->dn_next_nlevels[(tx->tx_txg-2) & TXG_MASK] > db->db_level);
+
+ /*
+ * We should only be dirtying in syncing context if it's the
+ * mos, a spa os, or we're initializing the os. However, we are
+ * allowed to dirty in syncing context provided we already
+ * dirtied it in open context. Hence we must make this
+ * assertion only if we're not already dirty.
+ */
+ ASSERT(!dmu_tx_is_syncing(tx) ||
+ os->os_dsl_dataset == NULL ||
+ !dsl_dir_is_private(os->os_dsl_dataset->ds_dir) ||
+ !BP_IS_HOLE(os->os_rootbp));
+ ASSERT(db->db.db_size != 0);
+
+ dprintf_dbuf(db, "size=%llx\n", (u_longlong_t)db->db.db_size);
+
+ /*
+ * If this buffer is dirty in an old transaction group we need
+ * to make a copy of it so that the changes we make in this
+ * transaction group won't leak out when we sync the older txg.
+ */
+ dr = kmem_zalloc(sizeof (dbuf_dirty_record_t), KM_SLEEP);
+ if (db->db_level == 0) {
+ void *data_old = db->db_buf;
+
+ if (db->db_blkid == DB_BONUS_BLKID) {
+ dbuf_fix_old_data(db, tx->tx_txg);
+ data_old = db->db.db_data;
+ } else if (db->db.db_object != DMU_META_DNODE_OBJECT) {
+ /*
+ * Release the data buffer from the cache so that we
+ * can modify it without impacting possible other users
+ * of this cached data block. Note that indirect
+ * blocks and private objects are not released until the
+ * syncing state (since they are only modified then).
+ */
+ arc_release(db->db_buf, db);
+ dbuf_fix_old_data(db, tx->tx_txg);
+ data_old = db->db_buf;
+ }
+ ASSERT(data_old != NULL);
+ dr->dt.dl.dr_data = data_old;
+ } else {
+ mutex_init(&dr->dt.di.dr_mtx, NULL, MUTEX_DEFAULT, NULL);
+ list_create(&dr->dt.di.dr_children,
+ sizeof (dbuf_dirty_record_t),
+ offsetof(dbuf_dirty_record_t, dr_dirty_node));
+ }
+ dr->dr_dbuf = db;
+ dr->dr_txg = tx->tx_txg;
+ dr->dr_next = *drp;
+ *drp = dr;
+
+ /*
+ * We could have been freed_in_flight between the dbuf_noread
+ * and dbuf_dirty. We win, as though the dbuf_noread() had
+ * happened after the free.
+ */
+ if (db->db_level == 0 && db->db_blkid != DB_BONUS_BLKID) {
+ mutex_enter(&dn->dn_mtx);
+ dnode_clear_range(dn, db->db_blkid, 1, tx);
+ mutex_exit(&dn->dn_mtx);
+ db->db_freed_in_flight = FALSE;
+ }
+
+ if (db->db_blkid != DB_BONUS_BLKID) {
+ /*
+ * Update the accounting.
+ */
+ if (!dbuf_new_block(db) && db->db_blkptr) {
+ /*
+ * This is only a guess -- if the dbuf is dirty
+ * in a previous txg, we don't know how much
+ * space it will use on disk yet. We should
+ * really have the struct_rwlock to access
+ * db_blkptr, but since this is just a guess,
+ * it's OK if we get an odd answer.
+ */
+ dnode_willuse_space(dn,
+ -bp_get_dasize(os->os_spa, db->db_blkptr), tx);
+ }
+ dnode_willuse_space(dn, db->db.db_size, tx);
+ }
+
+ /*
+ * This buffer is now part of this txg
+ */
+ dbuf_add_ref(db, (void *)(uintptr_t)tx->tx_txg);
+ db->db_dirtycnt += 1;
+ ASSERT3U(db->db_dirtycnt, <=, 3);
+
+ mutex_exit(&db->db_mtx);
+
+ if (db->db_blkid == DB_BONUS_BLKID) {
+ mutex_enter(&dn->dn_mtx);
+ ASSERT(!list_link_active(&dr->dr_dirty_node));
+ list_insert_tail(&dn->dn_dirty_records[txgoff], dr);
+ mutex_exit(&dn->dn_mtx);
+ dnode_setdirty(dn, tx);
+ return (dr);
+ }
+
+ if (db->db_level == 0) {
+ dnode_new_blkid(dn, db->db_blkid, tx);
+ ASSERT(dn->dn_maxblkid >= db->db_blkid);
+ }
+
+ if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ drop_struct_lock = TRUE;
+ }
+
+ if (db->db_level+1 < dn->dn_nlevels) {
+ dmu_buf_impl_t *parent = db->db_parent;
+ dbuf_dirty_record_t *di;
+ int parent_held = FALSE;
+
+ if (db->db_parent == NULL || db->db_parent == dn->dn_dbuf) {
+ int epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
+
+ parent = dbuf_hold_level(dn, db->db_level+1,
+ db->db_blkid >> epbs, FTAG);
+ parent_held = TRUE;
+ }
+ if (drop_struct_lock)
+ rw_exit(&dn->dn_struct_rwlock);
+ ASSERT3U(db->db_level+1, ==, parent->db_level);
+ di = dbuf_dirty(parent, tx);
+ if (parent_held)
+ dbuf_rele(parent, FTAG);
+
+ mutex_enter(&db->db_mtx);
+ /* possible race with dbuf_undirty() */
+ if (db->db_last_dirty == dr ||
+ dn->dn_object == DMU_META_DNODE_OBJECT) {
+ mutex_enter(&di->dt.di.dr_mtx);
+ ASSERT3U(di->dr_txg, ==, tx->tx_txg);
+ ASSERT(!list_link_active(&dr->dr_dirty_node));
+ list_insert_tail(&di->dt.di.dr_children, dr);
+ mutex_exit(&di->dt.di.dr_mtx);
+ dr->dr_parent = di;
+ }
+ mutex_exit(&db->db_mtx);
+ } else {
+ ASSERT(db->db_level+1 == dn->dn_nlevels);
+ ASSERT(db->db_blkid < dn->dn_nblkptr);
+ ASSERT(db->db_parent == NULL ||
+ db->db_parent == db->db_dnode->dn_dbuf);
+ mutex_enter(&dn->dn_mtx);
+ ASSERT(!list_link_active(&dr->dr_dirty_node));
+ list_insert_tail(&dn->dn_dirty_records[txgoff], dr);
+ mutex_exit(&dn->dn_mtx);
+ if (drop_struct_lock)
+ rw_exit(&dn->dn_struct_rwlock);
+ }
+
+ dnode_setdirty(dn, tx);
+ return (dr);
+}
+
+static int
+dbuf_undirty(dmu_buf_impl_t *db, dmu_tx_t *tx)
+{
+ dnode_t *dn = db->db_dnode;
+ uint64_t txg = tx->tx_txg;
+ dbuf_dirty_record_t *dr;
+
+ ASSERT(txg != 0);
+ ASSERT(db->db_blkid != DB_BONUS_BLKID);
+
+ mutex_enter(&db->db_mtx);
+
+ /*
+ * If this buffer is not dirty, we're done.
+ */
+ for (dr = db->db_last_dirty; dr; dr = dr->dr_next)
+ if (dr->dr_txg <= txg)
+ break;
+ if (dr == NULL || dr->dr_txg < txg) {
+ mutex_exit(&db->db_mtx);
+ return (0);
+ }
+ ASSERT(dr->dr_txg == txg);
+
+ /*
+ * If this buffer is currently held, we cannot undirty
+ * it, since one of the current holders may be in the
+ * middle of an update. Note that users of dbuf_undirty()
+ * should not place a hold on the dbuf before the call.
+ */
+ if (refcount_count(&db->db_holds) > db->db_dirtycnt) {
+ mutex_exit(&db->db_mtx);
+ /* Make sure we don't toss this buffer at sync phase */
+ mutex_enter(&dn->dn_mtx);
+ dnode_clear_range(dn, db->db_blkid, 1, tx);
+ mutex_exit(&dn->dn_mtx);
+ return (0);
+ }
+
+ dprintf_dbuf(db, "size=%llx\n", (u_longlong_t)db->db.db_size);
+
+ ASSERT(db->db.db_size != 0);
+
+ /* XXX would be nice to fix up dn_towrite_space[] */
+
+ db->db_last_dirty = dr->dr_next;
+
+ if (dr->dr_parent) {
+ mutex_enter(&dr->dr_parent->dt.di.dr_mtx);
+ list_remove(&dr->dr_parent->dt.di.dr_children, dr);
+ mutex_exit(&dr->dr_parent->dt.di.dr_mtx);
+ } else if (db->db_level+1 == dn->dn_nlevels) {
+ ASSERT3P(db->db_parent, ==, dn->dn_dbuf);
+ mutex_enter(&dn->dn_mtx);
+ list_remove(&dn->dn_dirty_records[txg & TXG_MASK], dr);
+ mutex_exit(&dn->dn_mtx);
+ }
+
+ if (db->db_level == 0) {
+ dbuf_unoverride(dr);
+
+ ASSERT(db->db_buf != NULL);
+ ASSERT(dr->dt.dl.dr_data != NULL);
+ if (dr->dt.dl.dr_data != db->db_buf)
+ VERIFY(arc_buf_remove_ref(dr->dt.dl.dr_data, db) == 1);
+ } else {
+ ASSERT(db->db_buf != NULL);
+ ASSERT(list_head(&dr->dt.di.dr_children) == NULL);
+ list_destroy(&dr->dt.di.dr_children);
+ mutex_destroy(&dr->dt.di.dr_mtx);
+ }
+ kmem_free(dr, sizeof (dbuf_dirty_record_t));
+
+ ASSERT(db->db_dirtycnt > 0);
+ db->db_dirtycnt -= 1;
+
+ if (refcount_remove(&db->db_holds, (void *)(uintptr_t)txg) == 0) {
+ arc_buf_t *buf = db->db_buf;
+
+ ASSERT(arc_released(buf));
+ dbuf_set_data(db, NULL);
+ VERIFY(arc_buf_remove_ref(buf, db) == 1);
+ dbuf_evict(db);
+ return (1);
+ }
+
+ mutex_exit(&db->db_mtx);
+ return (0);
+}
+
+#pragma weak dmu_buf_will_dirty = dbuf_will_dirty
+void
+dbuf_will_dirty(dmu_buf_impl_t *db, dmu_tx_t *tx)
+{
+ int rf = DB_RF_MUST_SUCCEED;
+
+ ASSERT(tx->tx_txg != 0);
+ ASSERT(!refcount_is_zero(&db->db_holds));
+
+ if (RW_WRITE_HELD(&db->db_dnode->dn_struct_rwlock))
+ rf |= DB_RF_HAVESTRUCT;
+ (void) dbuf_read(db, NULL, rf);
+ (void) dbuf_dirty(db, tx);
+}
+
+void
+dmu_buf_will_fill(dmu_buf_t *db_fake, dmu_tx_t *tx)
+{
+ dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
+
+ ASSERT(db->db_blkid != DB_BONUS_BLKID);
+ ASSERT(tx->tx_txg != 0);
+ ASSERT(db->db_level == 0);
+ ASSERT(!refcount_is_zero(&db->db_holds));
+
+ ASSERT(db->db.db_object != DMU_META_DNODE_OBJECT ||
+ dmu_tx_private_ok(tx));
+
+ dbuf_noread(db);
+ (void) dbuf_dirty(db, tx);
+}
+
+#pragma weak dmu_buf_fill_done = dbuf_fill_done
+/* ARGSUSED */
+void
+dbuf_fill_done(dmu_buf_impl_t *db, dmu_tx_t *tx)
+{
+ mutex_enter(&db->db_mtx);
+ DBUF_VERIFY(db);
+
+ if (db->db_state == DB_FILL) {
+ if (db->db_level == 0 && db->db_freed_in_flight) {
+ ASSERT(db->db_blkid != DB_BONUS_BLKID);
+ /* we were freed while filling */
+ /* XXX dbuf_undirty? */
+ bzero(db->db.db_data, db->db.db_size);
+ db->db_freed_in_flight = FALSE;
+ }
+ db->db_state = DB_CACHED;
+ cv_broadcast(&db->db_changed);
+ }
+ mutex_exit(&db->db_mtx);
+}
+
+/*
+ * "Clear" the contents of this dbuf. This will mark the dbuf
+ * EVICTING and clear *most* of its references. Unfortunetely,
+ * when we are not holding the dn_dbufs_mtx, we can't clear the
+ * entry in the dn_dbufs list. We have to wait until dbuf_destroy()
+ * in this case. For callers from the DMU we will usually see:
+ * dbuf_clear()->arc_buf_evict()->dbuf_do_evict()->dbuf_destroy()
+ * For the arc callback, we will usually see:
+ * dbuf_do_evict()->dbuf_clear();dbuf_destroy()
+ * Sometimes, though, we will get a mix of these two:
+ * DMU: dbuf_clear()->arc_buf_evict()
+ * ARC: dbuf_do_evict()->dbuf_destroy()
+ */
+void
+dbuf_clear(dmu_buf_impl_t *db)
+{
+ dnode_t *dn = db->db_dnode;
+ dmu_buf_impl_t *parent = db->db_parent;
+ dmu_buf_impl_t *dndb = dn->dn_dbuf;
+ int dbuf_gone = FALSE;
+
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+ ASSERT(refcount_is_zero(&db->db_holds));
+
+ dbuf_evict_user(db);
+
+ if (db->db_state == DB_CACHED) {
+ ASSERT(db->db.db_data != NULL);
+ if (db->db_blkid == DB_BONUS_BLKID)
+ zio_buf_free(db->db.db_data, DN_MAX_BONUSLEN);
+ db->db.db_data = NULL;
+ db->db_state = DB_UNCACHED;
+ }
+
+ ASSERT3U(db->db_state, ==, DB_UNCACHED);
+ ASSERT(db->db_data_pending == NULL);
+
+ db->db_state = DB_EVICTING;
+ db->db_blkptr = NULL;
+
+ if (db->db_blkid != DB_BONUS_BLKID && MUTEX_HELD(&dn->dn_dbufs_mtx)) {
+ list_remove(&dn->dn_dbufs, db);
+ dnode_rele(dn, db);
+ }
+
+ if (db->db_buf)
+ dbuf_gone = arc_buf_evict(db->db_buf);
+
+ if (!dbuf_gone)
+ mutex_exit(&db->db_mtx);
+
+ /*
+ * If this dbuf is referened from an indirect dbuf,
+ * decrement the ref count on the indirect dbuf.
+ */
+ if (parent && parent != dndb)
+ dbuf_rele(parent, db);
+}
+
+static int
+dbuf_findbp(dnode_t *dn, int level, uint64_t blkid, int fail_sparse,
+ dmu_buf_impl_t **parentp, blkptr_t **bpp)
+{
+ int nlevels, epbs;
+
+ *parentp = NULL;
+ *bpp = NULL;
+
+ ASSERT(blkid != DB_BONUS_BLKID);
+
+ if (dn->dn_phys->dn_nlevels == 0)
+ nlevels = 1;
+ else
+ nlevels = dn->dn_phys->dn_nlevels;
+
+ epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
+
+ ASSERT3U(level * epbs, <, 64);
+ ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
+ if (level >= nlevels ||
+ (blkid > (dn->dn_phys->dn_maxblkid >> (level * epbs)))) {
+ /* the buffer has no parent yet */
+ return (ENOENT);
+ } else if (level < nlevels-1) {
+ /* this block is referenced from an indirect block */
+ int err = dbuf_hold_impl(dn, level+1,
+ blkid >> epbs, fail_sparse, NULL, parentp);
+ if (err)
+ return (err);
+ err = dbuf_read(*parentp, NULL,
+ (DB_RF_HAVESTRUCT | DB_RF_NOPREFETCH | DB_RF_CANFAIL));
+ if (err) {
+ dbuf_rele(*parentp, NULL);
+ *parentp = NULL;
+ return (err);
+ }
+ *bpp = ((blkptr_t *)(*parentp)->db.db_data) +
+ (blkid & ((1ULL << epbs) - 1));
+ return (0);
+ } else {
+ /* the block is referenced from the dnode */
+ ASSERT3U(level, ==, nlevels-1);
+ ASSERT(dn->dn_phys->dn_nblkptr == 0 ||
+ blkid < dn->dn_phys->dn_nblkptr);
+ if (dn->dn_dbuf) {
+ dbuf_add_ref(dn->dn_dbuf, NULL);
+ *parentp = dn->dn_dbuf;
+ }
+ *bpp = &dn->dn_phys->dn_blkptr[blkid];
+ return (0);
+ }
+}
+
+static dmu_buf_impl_t *
+dbuf_create(dnode_t *dn, uint8_t level, uint64_t blkid,
+ dmu_buf_impl_t *parent, blkptr_t *blkptr)
+{
+ objset_impl_t *os = dn->dn_objset;
+ dmu_buf_impl_t *db, *odb;
+
+ ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
+ ASSERT(dn->dn_type != DMU_OT_NONE);
+
+ db = kmem_cache_alloc(dbuf_cache, KM_SLEEP);
+
+ db->db_objset = os;
+ db->db.db_object = dn->dn_object;
+ db->db_level = level;
+ db->db_blkid = blkid;
+ db->db_last_dirty = NULL;
+ db->db_dirtycnt = 0;
+ db->db_dnode = dn;
+ db->db_parent = parent;
+ db->db_blkptr = blkptr;
+
+ db->db_user_ptr = NULL;
+ db->db_user_data_ptr_ptr = NULL;
+ db->db_evict_func = NULL;
+ db->db_immediate_evict = 0;
+ db->db_freed_in_flight = 0;
+
+ if (blkid == DB_BONUS_BLKID) {
+ ASSERT3P(parent, ==, dn->dn_dbuf);
+ db->db.db_size = dn->dn_bonuslen;
+ db->db.db_offset = DB_BONUS_BLKID;
+ db->db_state = DB_UNCACHED;
+ /* the bonus dbuf is not placed in the hash table */
+ return (db);
+ } else {
+ int blocksize =
+ db->db_level ? 1<<dn->dn_indblkshift : dn->dn_datablksz;
+ db->db.db_size = blocksize;
+ db->db.db_offset = db->db_blkid * blocksize;
+ }
+
+ /*
+ * Hold the dn_dbufs_mtx while we get the new dbuf
+ * in the hash table *and* added to the dbufs list.
+ * This prevents a possible deadlock with someone
+ * trying to look up this dbuf before its added to the
+ * dn_dbufs list.
+ */
+ mutex_enter(&dn->dn_dbufs_mtx);
+ db->db_state = DB_EVICTING;
+ if ((odb = dbuf_hash_insert(db)) != NULL) {
+ /* someone else inserted it first */
+ kmem_cache_free(dbuf_cache, db);
+ mutex_exit(&dn->dn_dbufs_mtx);
+ return (odb);
+ }
+ list_insert_head(&dn->dn_dbufs, db);
+ db->db_state = DB_UNCACHED;
+ mutex_exit(&dn->dn_dbufs_mtx);
+
+ if (parent && parent != dn->dn_dbuf)
+ dbuf_add_ref(parent, db);
+
+ ASSERT(dn->dn_object == DMU_META_DNODE_OBJECT ||
+ refcount_count(&dn->dn_holds) > 0);
+ (void) refcount_add(&dn->dn_holds, db);
+
+ dprintf_dbuf(db, "db=%p\n", db);
+
+ return (db);
+}
+
+static int
+dbuf_do_evict(void *private)
+{
+ arc_buf_t *buf = private;
+ dmu_buf_impl_t *db = buf->b_private;
+
+ if (!MUTEX_HELD(&db->db_mtx))
+ mutex_enter(&db->db_mtx);
+
+ ASSERT(refcount_is_zero(&db->db_holds));
+
+ if (db->db_state != DB_EVICTING) {
+ ASSERT(db->db_state == DB_CACHED);
+ DBUF_VERIFY(db);
+ db->db_buf = NULL;
+ dbuf_evict(db);
+ } else {
+ mutex_exit(&db->db_mtx);
+ dbuf_destroy(db);
+ }
+ return (0);
+}
+
+static void
+dbuf_destroy(dmu_buf_impl_t *db)
+{
+ ASSERT(refcount_is_zero(&db->db_holds));
+
+ if (db->db_blkid != DB_BONUS_BLKID) {
+ dnode_t *dn = db->db_dnode;
+
+ /*
+ * If this dbuf is still on the dn_dbufs list,
+ * remove it from that list.
+ */
+ if (list_link_active(&db->db_link)) {
+ mutex_enter(&dn->dn_dbufs_mtx);
+ list_remove(&dn->dn_dbufs, db);
+ mutex_exit(&dn->dn_dbufs_mtx);
+
+ dnode_rele(dn, db);
+ }
+ dbuf_hash_remove(db);
+ }
+ db->db_parent = NULL;
+ db->db_dnode = NULL;
+ db->db_buf = NULL;
+
+ ASSERT(db->db.db_data == NULL);
+ ASSERT(db->db_hash_next == NULL);
+ ASSERT(db->db_blkptr == NULL);
+ ASSERT(db->db_data_pending == NULL);
+
+ kmem_cache_free(dbuf_cache, db);
+}
+
+void
+dbuf_prefetch(dnode_t *dn, uint64_t blkid)
+{
+ dmu_buf_impl_t *db = NULL;
+ blkptr_t *bp = NULL;
+
+ ASSERT(blkid != DB_BONUS_BLKID);
+ ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
+
+ if (dnode_block_freed(dn, blkid))
+ return;
+
+ /* dbuf_find() returns with db_mtx held */
+ if (db = dbuf_find(dn, 0, blkid)) {
+ if (refcount_count(&db->db_holds) > 0) {
+ /*
+ * This dbuf is active. We assume that it is
+ * already CACHED, or else about to be either
+ * read or filled.
+ */
+ mutex_exit(&db->db_mtx);
+ return;
+ }
+ mutex_exit(&db->db_mtx);
+ db = NULL;
+ }
+
+ if (dbuf_findbp(dn, 0, blkid, TRUE, &db, &bp) == 0) {
+ if (bp && !BP_IS_HOLE(bp)) {
+ uint32_t aflags = ARC_NOWAIT | ARC_PREFETCH;
+ zbookmark_t zb;
+ zb.zb_objset = dn->dn_objset->os_dsl_dataset ?
+ dn->dn_objset->os_dsl_dataset->ds_object : 0;
+ zb.zb_object = dn->dn_object;
+ zb.zb_level = 0;
+ zb.zb_blkid = blkid;
+
+ (void) arc_read(NULL, dn->dn_objset->os_spa, bp,
+ dmu_ot[dn->dn_type].ot_byteswap,
+ NULL, NULL, ZIO_PRIORITY_ASYNC_READ,
+ ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE,
+ &aflags, &zb);
+ }
+ if (db)
+ dbuf_rele(db, NULL);
+ }
+}
+
+/*
+ * Returns with db_holds incremented, and db_mtx not held.
+ * Note: dn_struct_rwlock must be held.
+ */
+int
+dbuf_hold_impl(dnode_t *dn, uint8_t level, uint64_t blkid, int fail_sparse,
+ void *tag, dmu_buf_impl_t **dbp)
+{
+ dmu_buf_impl_t *db, *parent = NULL;
+
+ ASSERT(blkid != DB_BONUS_BLKID);
+ ASSERT(RW_LOCK_HELD(&dn->dn_struct_rwlock));
+ ASSERT3U(dn->dn_nlevels, >, level);
+
+ *dbp = NULL;
+top:
+ /* dbuf_find() returns with db_mtx held */
+ db = dbuf_find(dn, level, blkid);
+
+ if (db == NULL) {
+ blkptr_t *bp = NULL;
+ int err;
+
+ ASSERT3P(parent, ==, NULL);
+ err = dbuf_findbp(dn, level, blkid, fail_sparse, &parent, &bp);
+ if (fail_sparse) {
+ if (err == 0 && bp && BP_IS_HOLE(bp))
+ err = ENOENT;
+ if (err) {
+ if (parent)
+ dbuf_rele(parent, NULL);
+ return (err);
+ }
+ }
+ if (err && err != ENOENT)
+ return (err);
+ db = dbuf_create(dn, level, blkid, parent, bp);
+ }
+
+ if (db->db_buf && refcount_is_zero(&db->db_holds)) {
+ arc_buf_add_ref(db->db_buf, db);
+ if (db->db_buf->b_data == NULL) {
+ dbuf_clear(db);
+ if (parent) {
+ dbuf_rele(parent, NULL);
+ parent = NULL;
+ }
+ goto top;
+ }
+ ASSERT3P(db->db.db_data, ==, db->db_buf->b_data);
+ }
+
+ ASSERT(db->db_buf == NULL || arc_referenced(db->db_buf));
+
+ /*
+ * If this buffer is currently syncing out, and we are are
+ * still referencing it from db_data, we need to make a copy
+ * of it in case we decide we want to dirty it again in this txg.
+ */
+ if (db->db_level == 0 && db->db_blkid != DB_BONUS_BLKID &&
+ dn->dn_object != DMU_META_DNODE_OBJECT &&
+ db->db_state == DB_CACHED && db->db_data_pending) {
+ dbuf_dirty_record_t *dr = db->db_data_pending;
+
+ if (dr->dt.dl.dr_data == db->db_buf) {
+ arc_buf_contents_t type = DBUF_GET_BUFC_TYPE(db);
+
+ dbuf_set_data(db,
+ arc_buf_alloc(db->db_dnode->dn_objset->os_spa,
+ db->db.db_size, db, type));
+ bcopy(dr->dt.dl.dr_data->b_data, db->db.db_data,
+ db->db.db_size);
+ }
+ }
+
+ (void) refcount_add(&db->db_holds, tag);
+ dbuf_update_data(db);
+ DBUF_VERIFY(db);
+ mutex_exit(&db->db_mtx);
+
+ /* NOTE: we can't rele the parent until after we drop the db_mtx */
+ if (parent)
+ dbuf_rele(parent, NULL);
+
+ ASSERT3P(db->db_dnode, ==, dn);
+ ASSERT3U(db->db_blkid, ==, blkid);
+ ASSERT3U(db->db_level, ==, level);
+ *dbp = db;
+
+ return (0);
+}
+
+dmu_buf_impl_t *
+dbuf_hold(dnode_t *dn, uint64_t blkid, void *tag)
+{
+ dmu_buf_impl_t *db;
+ int err = dbuf_hold_impl(dn, 0, blkid, FALSE, tag, &db);
+ return (err ? NULL : db);
+}
+
+dmu_buf_impl_t *
+dbuf_hold_level(dnode_t *dn, int level, uint64_t blkid, void *tag)
+{
+ dmu_buf_impl_t *db;
+ int err = dbuf_hold_impl(dn, level, blkid, FALSE, tag, &db);
+ return (err ? NULL : db);
+}
+
+dmu_buf_impl_t *
+dbuf_create_bonus(dnode_t *dn)
+{
+ dmu_buf_impl_t *db = dn->dn_bonus;
+
+ ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
+
+ ASSERT(dn->dn_bonus == NULL);
+ db = dbuf_create(dn, 0, DB_BONUS_BLKID, dn->dn_dbuf, NULL);
+ return (db);
+}
+
+#pragma weak dmu_buf_add_ref = dbuf_add_ref
+void
+dbuf_add_ref(dmu_buf_impl_t *db, void *tag)
+{
+ int64_t holds = refcount_add(&db->db_holds, tag);
+ ASSERT(holds > 1);
+}
+
+#pragma weak dmu_buf_rele = dbuf_rele
+void
+dbuf_rele(dmu_buf_impl_t *db, void *tag)
+{
+ int64_t holds;
+
+ mutex_enter(&db->db_mtx);
+ DBUF_VERIFY(db);
+
+ holds = refcount_remove(&db->db_holds, tag);
+ ASSERT(holds >= 0);
+
+ /*
+ * We can't freeze indirects if there is a possibility that they
+ * may be modified in the current syncing context.
+ */
+ if (db->db_buf && holds == (db->db_level == 0 ? db->db_dirtycnt : 0))
+ arc_buf_freeze(db->db_buf);
+
+ if (holds == db->db_dirtycnt &&
+ db->db_level == 0 && db->db_immediate_evict)
+ dbuf_evict_user(db);
+
+ if (holds == 0) {
+ if (db->db_blkid == DB_BONUS_BLKID) {
+ mutex_exit(&db->db_mtx);
+ dnode_rele(db->db_dnode, db);
+ } else if (db->db_buf == NULL) {
+ /*
+ * This is a special case: we never associated this
+ * dbuf with any data allocated from the ARC.
+ */
+ ASSERT3U(db->db_state, ==, DB_UNCACHED);
+ dbuf_evict(db);
+ } else if (arc_released(db->db_buf)) {
+ arc_buf_t *buf = db->db_buf;
+ /*
+ * This dbuf has anonymous data associated with it.
+ */
+ dbuf_set_data(db, NULL);
+ VERIFY(arc_buf_remove_ref(buf, db) == 1);
+ dbuf_evict(db);
+ } else {
+ VERIFY(arc_buf_remove_ref(db->db_buf, db) == 0);
+ mutex_exit(&db->db_mtx);
+ }
+ } else {
+ mutex_exit(&db->db_mtx);
+ }
+}
+
+#pragma weak dmu_buf_refcount = dbuf_refcount
+uint64_t
+dbuf_refcount(dmu_buf_impl_t *db)
+{
+ return (refcount_count(&db->db_holds));
+}
+
+void *
+dmu_buf_set_user(dmu_buf_t *db_fake, void *user_ptr, void *user_data_ptr_ptr,
+ dmu_buf_evict_func_t *evict_func)
+{
+ return (dmu_buf_update_user(db_fake, NULL, user_ptr,
+ user_data_ptr_ptr, evict_func));
+}
+
+void *
+dmu_buf_set_user_ie(dmu_buf_t *db_fake, void *user_ptr, void *user_data_ptr_ptr,
+ dmu_buf_evict_func_t *evict_func)
+{
+ dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
+
+ db->db_immediate_evict = TRUE;
+ return (dmu_buf_update_user(db_fake, NULL, user_ptr,
+ user_data_ptr_ptr, evict_func));
+}
+
+void *
+dmu_buf_update_user(dmu_buf_t *db_fake, void *old_user_ptr, void *user_ptr,
+ void *user_data_ptr_ptr, dmu_buf_evict_func_t *evict_func)
+{
+ dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
+ ASSERT(db->db_level == 0);
+
+ ASSERT((user_ptr == NULL) == (evict_func == NULL));
+
+ mutex_enter(&db->db_mtx);
+
+ if (db->db_user_ptr == old_user_ptr) {
+ db->db_user_ptr = user_ptr;
+ db->db_user_data_ptr_ptr = user_data_ptr_ptr;
+ db->db_evict_func = evict_func;
+
+ dbuf_update_data(db);
+ } else {
+ old_user_ptr = db->db_user_ptr;
+ }
+
+ mutex_exit(&db->db_mtx);
+ return (old_user_ptr);
+}
+
+void *
+dmu_buf_get_user(dmu_buf_t *db_fake)
+{
+ dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
+ ASSERT(!refcount_is_zero(&db->db_holds));
+
+ return (db->db_user_ptr);
+}
+
+static void
+dbuf_check_blkptr(dnode_t *dn, dmu_buf_impl_t *db)
+{
+ /* ASSERT(dmu_tx_is_syncing(tx) */
+ ASSERT(MUTEX_HELD(&db->db_mtx));
+
+ if (db->db_blkptr != NULL)
+ return;
+
+ if (db->db_level == dn->dn_phys->dn_nlevels-1) {
+ /*
+ * This buffer was allocated at a time when there was
+ * no available blkptrs from the dnode, or it was
+ * inappropriate to hook it in (i.e., nlevels mis-match).
+ */
+ ASSERT(db->db_blkid < dn->dn_phys->dn_nblkptr);
+ ASSERT(db->db_parent == NULL);
+ db->db_parent = dn->dn_dbuf;
+ db->db_blkptr = &dn->dn_phys->dn_blkptr[db->db_blkid];
+ DBUF_VERIFY(db);
+ } else {
+ dmu_buf_impl_t *parent = db->db_parent;
+ int epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
+
+ ASSERT(dn->dn_phys->dn_nlevels > 1);
+ if (parent == NULL) {
+ mutex_exit(&db->db_mtx);
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ (void) dbuf_hold_impl(dn, db->db_level+1,
+ db->db_blkid >> epbs, FALSE, db, &parent);
+ rw_exit(&dn->dn_struct_rwlock);
+ mutex_enter(&db->db_mtx);
+ db->db_parent = parent;
+ }
+ db->db_blkptr = (blkptr_t *)parent->db.db_data +
+ (db->db_blkid & ((1ULL << epbs) - 1));
+ DBUF_VERIFY(db);
+ }
+}
+
+static void
+dbuf_sync_indirect(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
+{
+ dmu_buf_impl_t *db = dr->dr_dbuf;
+ dnode_t *dn = db->db_dnode;
+ zio_t *zio;
+
+ ASSERT(dmu_tx_is_syncing(tx));
+
+ dprintf_dbuf_bp(db, db->db_blkptr, "blkptr=%p", db->db_blkptr);
+
+ mutex_enter(&db->db_mtx);
+
+ ASSERT(db->db_level > 0);
+ DBUF_VERIFY(db);
+
+ if (db->db_buf == NULL) {
+ mutex_exit(&db->db_mtx);
+ (void) dbuf_read(db, NULL, DB_RF_MUST_SUCCEED);
+ mutex_enter(&db->db_mtx);
+ }
+ ASSERT3U(db->db_state, ==, DB_CACHED);
+ ASSERT3U(db->db.db_size, ==, 1<<dn->dn_phys->dn_indblkshift);
+ ASSERT(db->db_buf != NULL);
+
+ dbuf_check_blkptr(dn, db);
+
+ db->db_data_pending = dr;
+
+ arc_release(db->db_buf, db);
+ mutex_exit(&db->db_mtx);
+
+ /*
+ * XXX -- we should design a compression algorithm
+ * that specializes in arrays of bps.
+ */
+ dbuf_write(dr, db->db_buf, ZIO_CHECKSUM_FLETCHER_4,
+ zfs_mdcomp_disable ? ZIO_COMPRESS_EMPTY : ZIO_COMPRESS_LZJB, tx);
+
+ zio = dr->dr_zio;
+ mutex_enter(&dr->dt.di.dr_mtx);
+ dbuf_sync_list(&dr->dt.di.dr_children, tx);
+ ASSERT(list_head(&dr->dt.di.dr_children) == NULL);
+ mutex_exit(&dr->dt.di.dr_mtx);
+ zio_nowait(zio);
+}
+
+static void
+dbuf_sync_leaf(dbuf_dirty_record_t *dr, dmu_tx_t *tx)
+{
+ arc_buf_t **datap = &dr->dt.dl.dr_data;
+ dmu_buf_impl_t *db = dr->dr_dbuf;
+ dnode_t *dn = db->db_dnode;
+ objset_impl_t *os = dn->dn_objset;
+ uint64_t txg = tx->tx_txg;
+ int checksum, compress;
+ int blksz;
+
+ ASSERT(dmu_tx_is_syncing(tx));
+
+ dprintf_dbuf_bp(db, db->db_blkptr, "blkptr=%p", db->db_blkptr);
+
+ mutex_enter(&db->db_mtx);
+ /*
+ * To be synced, we must be dirtied. But we
+ * might have been freed after the dirty.
+ */
+ if (db->db_state == DB_UNCACHED) {
+ /* This buffer has been freed since it was dirtied */
+ ASSERT(db->db.db_data == NULL);
+ } else if (db->db_state == DB_FILL) {
+ /* This buffer was freed and is now being re-filled */
+ ASSERT(db->db.db_data != dr->dt.dl.dr_data);
+ } else {
+ ASSERT3U(db->db_state, ==, DB_CACHED);
+ }
+ DBUF_VERIFY(db);
+
+ /*
+ * If this is a bonus buffer, simply copy the bonus data into the
+ * dnode. It will be written out when the dnode is synced (and it
+ * will be synced, since it must have been dirty for dbuf_sync to
+ * be called).
+ */
+ if (db->db_blkid == DB_BONUS_BLKID) {
+ dbuf_dirty_record_t **drp;
+ /*
+ * Use dn_phys->dn_bonuslen since db.db_size is the length
+ * of the bonus buffer in the open transaction rather than
+ * the syncing transaction.
+ */
+ ASSERT(*datap != NULL);
+ ASSERT3U(db->db_level, ==, 0);
+ ASSERT3U(dn->dn_phys->dn_bonuslen, <=, DN_MAX_BONUSLEN);
+ bcopy(*datap, DN_BONUS(dn->dn_phys), dn->dn_phys->dn_bonuslen);
+ if (*datap != db->db.db_data)
+ zio_buf_free(*datap, DN_MAX_BONUSLEN);
+ db->db_data_pending = NULL;
+ drp = &db->db_last_dirty;
+ while (*drp != dr)
+ drp = &(*drp)->dr_next;
+ ASSERT((*drp)->dr_next == NULL);
+ *drp = NULL;
+ if (dr->dr_dbuf->db_level != 0) {
+ list_destroy(&dr->dt.di.dr_children);
+ mutex_destroy(&dr->dt.di.dr_mtx);
+ }
+ kmem_free(dr, sizeof (dbuf_dirty_record_t));
+ ASSERT(db->db_dirtycnt > 0);
+ db->db_dirtycnt -= 1;
+ mutex_exit(&db->db_mtx);
+ dbuf_rele(db, (void *)(uintptr_t)txg);
+ return;
+ }
+
+ /*
+ * If this buffer is in the middle of an immdiate write,
+ * wait for the synchronous IO to complete.
+ */
+ while (dr->dt.dl.dr_override_state == DR_IN_DMU_SYNC) {
+ ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT);
+ cv_wait(&db->db_changed, &db->db_mtx);
+ ASSERT(dr->dt.dl.dr_override_state != DR_NOT_OVERRIDDEN);
+ }
+
+ dbuf_check_blkptr(dn, db);
+
+ /*
+ * If this dbuf has already been written out via an immediate write,
+ * just complete the write by copying over the new block pointer and
+ * updating the accounting via the write-completion functions.
+ */
+ if (dr->dt.dl.dr_override_state == DR_OVERRIDDEN) {
+ zio_t zio_fake;
+
+ zio_fake.io_private = &db;
+ zio_fake.io_error = 0;
+ zio_fake.io_bp = db->db_blkptr;
+ zio_fake.io_bp_orig = *db->db_blkptr;
+ zio_fake.io_txg = txg;
+
+ *db->db_blkptr = dr->dt.dl.dr_overridden_by;
+ dr->dt.dl.dr_override_state = DR_NOT_OVERRIDDEN;
+ db->db_data_pending = dr;
+ dr->dr_zio = &zio_fake;
+ mutex_exit(&db->db_mtx);
+
+ if (BP_IS_OLDER(&zio_fake.io_bp_orig, txg))
+ dsl_dataset_block_kill(os->os_dsl_dataset,
+ &zio_fake.io_bp_orig, dn->dn_zio, tx);
+
+ dbuf_write_ready(&zio_fake, db->db_buf, db);
+ dbuf_write_done(&zio_fake, db->db_buf, db);
+
+ return;
+ }
+
+ blksz = arc_buf_size(*datap);
+
+ if (dn->dn_object != DMU_META_DNODE_OBJECT) {
+ /*
+ * If this buffer is currently "in use" (i.e., there are
+ * active holds and db_data still references it), then make
+ * a copy before we start the write so that any modifications
+ * from the open txg will not leak into this write.
+ *
+ * NOTE: this copy does not need to be made for objects only
+ * modified in the syncing context (e.g. DNONE_DNODE blocks).
+ */
+ if (refcount_count(&db->db_holds) > 1 && *datap == db->db_buf) {
+ arc_buf_contents_t type = DBUF_GET_BUFC_TYPE(db);
+ *datap = arc_buf_alloc(os->os_spa, blksz, db, type);
+ bcopy(db->db.db_data, (*datap)->b_data, blksz);
+ }
+ } else {
+ /*
+ * Private object buffers are released here rather
+ * than in dbuf_dirty() since they are only modified
+ * in the syncing context and we don't want the
+ * overhead of making multiple copies of the data.
+ */
+ arc_release(db->db_buf, db);
+ }
+
+ ASSERT(*datap != NULL);
+ db->db_data_pending = dr;
+
+ mutex_exit(&db->db_mtx);
+
+ /*
+ * Allow dnode settings to override objset settings,
+ * except for metadata checksums.
+ */
+ if (dmu_ot[dn->dn_type].ot_metadata) {
+ checksum = os->os_md_checksum;
+ compress = zio_compress_select(dn->dn_compress,
+ os->os_md_compress);
+ } else {
+ checksum = zio_checksum_select(dn->dn_checksum,
+ os->os_checksum);
+ compress = zio_compress_select(dn->dn_compress,
+ os->os_compress);
+ }
+
+ dbuf_write(dr, *datap, checksum, compress, tx);
+
+ ASSERT(!list_link_active(&dr->dr_dirty_node));
+ if (dn->dn_object == DMU_META_DNODE_OBJECT)
+ list_insert_tail(&dn->dn_dirty_records[txg&TXG_MASK], dr);
+ else
+ zio_nowait(dr->dr_zio);
+}
+
+void
+dbuf_sync_list(list_t *list, dmu_tx_t *tx)
+{
+ dbuf_dirty_record_t *dr;
+
+ while (dr = list_head(list)) {
+ if (dr->dr_zio != NULL) {
+ /*
+ * If we find an already initialized zio then we
+ * are processing the meta-dnode, and we have finished.
+ * The dbufs for all dnodes are put back on the list
+ * during processing, so that we can zio_wait()
+ * these IOs after initiating all child IOs.
+ */
+ ASSERT3U(dr->dr_dbuf->db.db_object, ==,
+ DMU_META_DNODE_OBJECT);
+ break;
+ }
+ list_remove(list, dr);
+ if (dr->dr_dbuf->db_level > 0)
+ dbuf_sync_indirect(dr, tx);
+ else
+ dbuf_sync_leaf(dr, tx);
+ }
+}
+
+static void
+dbuf_write(dbuf_dirty_record_t *dr, arc_buf_t *data, int checksum,
+ int compress, dmu_tx_t *tx)
+{
+ dmu_buf_impl_t *db = dr->dr_dbuf;
+ dnode_t *dn = db->db_dnode;
+ objset_impl_t *os = dn->dn_objset;
+ dmu_buf_impl_t *parent = db->db_parent;
+ uint64_t txg = tx->tx_txg;
+ zbookmark_t zb;
+ zio_t *zio;
+ int zio_flags;
+
+ if (parent != dn->dn_dbuf) {
+ ASSERT(parent && parent->db_data_pending);
+ ASSERT(db->db_level == parent->db_level-1);
+ ASSERT(arc_released(parent->db_buf));
+ zio = parent->db_data_pending->dr_zio;
+ } else {
+ ASSERT(db->db_level == dn->dn_phys->dn_nlevels-1);
+ ASSERT3P(db->db_blkptr, ==,
+ &dn->dn_phys->dn_blkptr[db->db_blkid]);
+ zio = dn->dn_zio;
+ }
+
+ ASSERT(db->db_level == 0 || data == db->db_buf);
+ ASSERT3U(db->db_blkptr->blk_birth, <=, txg);
+ ASSERT(zio);
+
+ zb.zb_objset = os->os_dsl_dataset ? os->os_dsl_dataset->ds_object : 0;
+ zb.zb_object = db->db.db_object;
+ zb.zb_level = db->db_level;
+ zb.zb_blkid = db->db_blkid;
+
+ zio_flags = ZIO_FLAG_MUSTSUCCEED;
+ if (dmu_ot[dn->dn_type].ot_metadata || zb.zb_level != 0)
+ zio_flags |= ZIO_FLAG_METADATA;
+ if (BP_IS_OLDER(db->db_blkptr, txg))
+ dsl_dataset_block_kill(
+ os->os_dsl_dataset, db->db_blkptr, zio, tx);
+
+ dr->dr_zio = arc_write(zio, os->os_spa, checksum, compress,
+ dmu_get_replication_level(os, &zb, dn->dn_type), txg,
+ db->db_blkptr, data, dbuf_write_ready, dbuf_write_done, db,
+ ZIO_PRIORITY_ASYNC_WRITE, zio_flags, &zb);
+}
+
+/* ARGSUSED */
+static void
+dbuf_write_ready(zio_t *zio, arc_buf_t *buf, void *vdb)
+{
+ dmu_buf_impl_t *db = vdb;
+ dnode_t *dn = db->db_dnode;
+ objset_impl_t *os = dn->dn_objset;
+ blkptr_t *bp_orig = &zio->io_bp_orig;
+ uint64_t fill = 0;
+ int old_size, new_size, i;
+
+ dprintf_dbuf_bp(db, bp_orig, "bp_orig: %s", "");
+
+ old_size = bp_get_dasize(os->os_spa, bp_orig);
+ new_size = bp_get_dasize(os->os_spa, zio->io_bp);
+
+ dnode_diduse_space(dn, new_size-old_size);
+
+ if (BP_IS_HOLE(zio->io_bp)) {
+ dsl_dataset_t *ds = os->os_dsl_dataset;
+ dmu_tx_t *tx = os->os_synctx;
+
+ if (bp_orig->blk_birth == tx->tx_txg)
+ dsl_dataset_block_kill(ds, bp_orig, NULL, tx);
+ ASSERT3U(db->db_blkptr->blk_fill, ==, 0);
+ return;
+ }
+
+ mutex_enter(&db->db_mtx);
+
+ if (db->db_level == 0) {
+ mutex_enter(&dn->dn_mtx);
+ if (db->db_blkid > dn->dn_phys->dn_maxblkid)
+ dn->dn_phys->dn_maxblkid = db->db_blkid;
+ mutex_exit(&dn->dn_mtx);
+
+ if (dn->dn_type == DMU_OT_DNODE) {
+ dnode_phys_t *dnp = db->db.db_data;
+ for (i = db->db.db_size >> DNODE_SHIFT; i > 0;
+ i--, dnp++) {
+ if (dnp->dn_type != DMU_OT_NONE)
+ fill++;
+ }
+ } else {
+ fill = 1;
+ }
+ } else {
+ blkptr_t *bp = db->db.db_data;
+ ASSERT3U(db->db.db_size, ==, 1<<dn->dn_phys->dn_indblkshift);
+ for (i = db->db.db_size >> SPA_BLKPTRSHIFT; i > 0; i--, bp++) {
+ if (BP_IS_HOLE(bp))
+ continue;
+ ASSERT3U(BP_GET_LSIZE(bp), ==,
+ db->db_level == 1 ? dn->dn_datablksz :
+ (1<<dn->dn_phys->dn_indblkshift));
+ fill += bp->blk_fill;
+ }
+ }
+
+ db->db_blkptr->blk_fill = fill;
+ BP_SET_TYPE(db->db_blkptr, dn->dn_type);
+ BP_SET_LEVEL(db->db_blkptr, db->db_level);
+
+ mutex_exit(&db->db_mtx);
+
+ /* We must do this after we've set the bp's type and level */
+ if (!DVA_EQUAL(BP_IDENTITY(zio->io_bp), BP_IDENTITY(bp_orig))) {
+ dsl_dataset_t *ds = os->os_dsl_dataset;
+ dmu_tx_t *tx = os->os_synctx;
+
+ if (bp_orig->blk_birth == tx->tx_txg)
+ dsl_dataset_block_kill(ds, bp_orig, NULL, tx);
+ dsl_dataset_block_born(ds, zio->io_bp, tx);
+ }
+}
+
+/* ARGSUSED */
+static void
+dbuf_write_done(zio_t *zio, arc_buf_t *buf, void *vdb)
+{
+ dmu_buf_impl_t *db = vdb;
+ uint64_t txg = zio->io_txg;
+ dbuf_dirty_record_t **drp, *dr;
+
+ ASSERT3U(zio->io_error, ==, 0);
+
+ mutex_enter(&db->db_mtx);
+
+ drp = &db->db_last_dirty;
+ while (*drp != db->db_data_pending)
+ drp = &(*drp)->dr_next;
+ ASSERT(!list_link_active(&(*drp)->dr_dirty_node));
+ ASSERT((*drp)->dr_txg == txg);
+ ASSERT((*drp)->dr_next == NULL);
+ dr = *drp;
+ *drp = NULL;
+
+ if (db->db_level == 0) {
+ ASSERT(db->db_blkid != DB_BONUS_BLKID);
+ ASSERT(dr->dt.dl.dr_override_state == DR_NOT_OVERRIDDEN);
+
+ if (dr->dt.dl.dr_data != db->db_buf)
+ VERIFY(arc_buf_remove_ref(dr->dt.dl.dr_data, db) == 1);
+ else if (!BP_IS_HOLE(db->db_blkptr))
+ arc_set_callback(db->db_buf, dbuf_do_evict, db);
+ else
+ ASSERT(arc_released(db->db_buf));
+ } else {
+ dnode_t *dn = db->db_dnode;
+
+ ASSERT(list_head(&dr->dt.di.dr_children) == NULL);
+ ASSERT3U(db->db.db_size, ==, 1<<dn->dn_phys->dn_indblkshift);
+ if (!BP_IS_HOLE(db->db_blkptr)) {
+ int epbs =
+ dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
+ ASSERT3U(BP_GET_LSIZE(db->db_blkptr), ==,
+ db->db.db_size);
+ ASSERT3U(dn->dn_phys->dn_maxblkid
+ >> (db->db_level * epbs), >=, db->db_blkid);
+ arc_set_callback(db->db_buf, dbuf_do_evict, db);
+ }
+ list_destroy(&dr->dt.di.dr_children);
+ mutex_destroy(&dr->dt.di.dr_mtx);
+ }
+ kmem_free(dr, sizeof (dbuf_dirty_record_t));
+
+ cv_broadcast(&db->db_changed);
+ ASSERT(db->db_dirtycnt > 0);
+ db->db_dirtycnt -= 1;
+ db->db_data_pending = NULL;
+ mutex_exit(&db->db_mtx);
+
+ dprintf_dbuf_bp(db, zio->io_bp, "bp: %s", "");
+
+ dbuf_rele(db, (void *)(uintptr_t)txg);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dmu.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu.c
new file mode 100644
index 0000000..d3be6b4
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu.c
@@ -0,0 +1,1029 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/dmu_impl.h>
+#include <sys/dmu_tx.h>
+#include <sys/dbuf.h>
+#include <sys/dnode.h>
+#include <sys/zfs_context.h>
+#include <sys/dmu_objset.h>
+#include <sys/dmu_traverse.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_pool.h>
+#include <sys/dsl_synctask.h>
+#include <sys/dsl_prop.h>
+#include <sys/dmu_zfetch.h>
+#include <sys/zfs_ioctl.h>
+#include <sys/zap.h>
+#include <sys/zio_checksum.h>
+
+const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES] = {
+ { byteswap_uint8_array, TRUE, "unallocated" },
+ { zap_byteswap, TRUE, "object directory" },
+ { byteswap_uint64_array, TRUE, "object array" },
+ { byteswap_uint8_array, TRUE, "packed nvlist" },
+ { byteswap_uint64_array, TRUE, "packed nvlist size" },
+ { byteswap_uint64_array, TRUE, "bplist" },
+ { byteswap_uint64_array, TRUE, "bplist header" },
+ { byteswap_uint64_array, TRUE, "SPA space map header" },
+ { byteswap_uint64_array, TRUE, "SPA space map" },
+ { byteswap_uint64_array, TRUE, "ZIL intent log" },
+ { dnode_buf_byteswap, TRUE, "DMU dnode" },
+ { dmu_objset_byteswap, TRUE, "DMU objset" },
+ { byteswap_uint64_array, TRUE, "DSL directory" },
+ { zap_byteswap, TRUE, "DSL directory child map"},
+ { zap_byteswap, TRUE, "DSL dataset snap map" },
+ { zap_byteswap, TRUE, "DSL props" },
+ { byteswap_uint64_array, TRUE, "DSL dataset" },
+ { zfs_znode_byteswap, TRUE, "ZFS znode" },
+ { zfs_acl_byteswap, TRUE, "ZFS ACL" },
+ { byteswap_uint8_array, FALSE, "ZFS plain file" },
+ { zap_byteswap, TRUE, "ZFS directory" },
+ { zap_byteswap, TRUE, "ZFS master node" },
+ { zap_byteswap, TRUE, "ZFS delete queue" },
+ { byteswap_uint8_array, FALSE, "zvol object" },
+ { zap_byteswap, TRUE, "zvol prop" },
+ { byteswap_uint8_array, FALSE, "other uint8[]" },
+ { byteswap_uint64_array, FALSE, "other uint64[]" },
+ { zap_byteswap, TRUE, "other ZAP" },
+ { zap_byteswap, TRUE, "persistent error log" },
+ { byteswap_uint8_array, TRUE, "SPA history" },
+ { byteswap_uint64_array, TRUE, "SPA history offsets" },
+ { zap_byteswap, TRUE, "Pool properties" },
+};
+
+int
+dmu_buf_hold(objset_t *os, uint64_t object, uint64_t offset,
+ void *tag, dmu_buf_t **dbp)
+{
+ dnode_t *dn;
+ uint64_t blkid;
+ dmu_buf_impl_t *db;
+ int err;
+
+ err = dnode_hold(os->os, object, FTAG, &dn);
+ if (err)
+ return (err);
+ blkid = dbuf_whichblock(dn, offset);
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ db = dbuf_hold(dn, blkid, tag);
+ rw_exit(&dn->dn_struct_rwlock);
+ if (db == NULL) {
+ err = EIO;
+ } else {
+ err = dbuf_read(db, NULL, DB_RF_CANFAIL);
+ if (err) {
+ dbuf_rele(db, tag);
+ db = NULL;
+ }
+ }
+
+ dnode_rele(dn, FTAG);
+ *dbp = &db->db;
+ return (err);
+}
+
+int
+dmu_bonus_max(void)
+{
+ return (DN_MAX_BONUSLEN);
+}
+
+/*
+ * returns ENOENT, EIO, or 0.
+ */
+int
+dmu_bonus_hold(objset_t *os, uint64_t object, void *tag, dmu_buf_t **dbp)
+{
+ dnode_t *dn;
+ int err, count;
+ dmu_buf_impl_t *db;
+
+ err = dnode_hold(os->os, object, FTAG, &dn);
+ if (err)
+ return (err);
+
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ if (dn->dn_bonus == NULL) {
+ rw_exit(&dn->dn_struct_rwlock);
+ rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
+ if (dn->dn_bonus == NULL)
+ dn->dn_bonus = dbuf_create_bonus(dn);
+ }
+ db = dn->dn_bonus;
+ rw_exit(&dn->dn_struct_rwlock);
+ mutex_enter(&db->db_mtx);
+ count = refcount_add(&db->db_holds, tag);
+ mutex_exit(&db->db_mtx);
+ if (count == 1)
+ dnode_add_ref(dn, db);
+ dnode_rele(dn, FTAG);
+
+ VERIFY(0 == dbuf_read(db, NULL, DB_RF_MUST_SUCCEED));
+
+ *dbp = &db->db;
+ return (0);
+}
+
+/*
+ * Note: longer-term, we should modify all of the dmu_buf_*() interfaces
+ * to take a held dnode rather than <os, object> -- the lookup is wasteful,
+ * and can induce severe lock contention when writing to several files
+ * whose dnodes are in the same block.
+ */
+static int
+dmu_buf_hold_array_by_dnode(dnode_t *dn, uint64_t offset,
+ uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
+{
+ dmu_buf_t **dbp;
+ uint64_t blkid, nblks, i;
+ uint32_t flags;
+ int err;
+ zio_t *zio;
+
+ ASSERT(length <= DMU_MAX_ACCESS);
+
+ flags = DB_RF_CANFAIL | DB_RF_NEVERWAIT;
+ if (length > zfetch_array_rd_sz)
+ flags |= DB_RF_NOPREFETCH;
+
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ if (dn->dn_datablkshift) {
+ int blkshift = dn->dn_datablkshift;
+ nblks = (P2ROUNDUP(offset+length, 1ULL<<blkshift) -
+ P2ALIGN(offset, 1ULL<<blkshift)) >> blkshift;
+ } else {
+ if (offset + length > dn->dn_datablksz) {
+ zfs_panic_recover("zfs: accessing past end of object "
+ "%llx/%llx (size=%u access=%llu+%llu)",
+ (longlong_t)dn->dn_objset->
+ os_dsl_dataset->ds_object,
+ (longlong_t)dn->dn_object, dn->dn_datablksz,
+ (longlong_t)offset, (longlong_t)length);
+ return (EIO);
+ }
+ nblks = 1;
+ }
+ dbp = kmem_zalloc(sizeof (dmu_buf_t *) * nblks, KM_SLEEP);
+
+ zio = zio_root(dn->dn_objset->os_spa, NULL, NULL, TRUE);
+ blkid = dbuf_whichblock(dn, offset);
+ for (i = 0; i < nblks; i++) {
+ dmu_buf_impl_t *db = dbuf_hold(dn, blkid+i, tag);
+ if (db == NULL) {
+ rw_exit(&dn->dn_struct_rwlock);
+ dmu_buf_rele_array(dbp, nblks, tag);
+ zio_nowait(zio);
+ return (EIO);
+ }
+ /* initiate async i/o */
+ if (read) {
+ rw_exit(&dn->dn_struct_rwlock);
+ (void) dbuf_read(db, zio, flags);
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ }
+ dbp[i] = &db->db;
+ }
+ rw_exit(&dn->dn_struct_rwlock);
+
+ /* wait for async i/o */
+ err = zio_wait(zio);
+ if (err) {
+ dmu_buf_rele_array(dbp, nblks, tag);
+ return (err);
+ }
+
+ /* wait for other io to complete */
+ if (read) {
+ for (i = 0; i < nblks; i++) {
+ dmu_buf_impl_t *db = (dmu_buf_impl_t *)dbp[i];
+ mutex_enter(&db->db_mtx);
+ while (db->db_state == DB_READ ||
+ db->db_state == DB_FILL)
+ cv_wait(&db->db_changed, &db->db_mtx);
+ if (db->db_state == DB_UNCACHED)
+ err = EIO;
+ mutex_exit(&db->db_mtx);
+ if (err) {
+ dmu_buf_rele_array(dbp, nblks, tag);
+ return (err);
+ }
+ }
+ }
+
+ *numbufsp = nblks;
+ *dbpp = dbp;
+ return (0);
+}
+
+static int
+dmu_buf_hold_array(objset_t *os, uint64_t object, uint64_t offset,
+ uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
+{
+ dnode_t *dn;
+ int err;
+
+ err = dnode_hold(os->os, object, FTAG, &dn);
+ if (err)
+ return (err);
+
+ err = dmu_buf_hold_array_by_dnode(dn, offset, length, read, tag,
+ numbufsp, dbpp);
+
+ dnode_rele(dn, FTAG);
+
+ return (err);
+}
+
+int
+dmu_buf_hold_array_by_bonus(dmu_buf_t *db, uint64_t offset,
+ uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp)
+{
+ dnode_t *dn = ((dmu_buf_impl_t *)db)->db_dnode;
+ int err;
+
+ err = dmu_buf_hold_array_by_dnode(dn, offset, length, read, tag,
+ numbufsp, dbpp);
+
+ return (err);
+}
+
+void
+dmu_buf_rele_array(dmu_buf_t **dbp_fake, int numbufs, void *tag)
+{
+ int i;
+ dmu_buf_impl_t **dbp = (dmu_buf_impl_t **)dbp_fake;
+
+ if (numbufs == 0)
+ return;
+
+ for (i = 0; i < numbufs; i++) {
+ if (dbp[i])
+ dbuf_rele(dbp[i], tag);
+ }
+
+ kmem_free(dbp, sizeof (dmu_buf_t *) * numbufs);
+}
+
+void
+dmu_prefetch(objset_t *os, uint64_t object, uint64_t offset, uint64_t len)
+{
+ dnode_t *dn;
+ uint64_t blkid;
+ int nblks, i, err;
+
+ if (zfs_prefetch_disable)
+ return;
+
+ if (len == 0) { /* they're interested in the bonus buffer */
+ dn = os->os->os_meta_dnode;
+
+ if (object == 0 || object >= DN_MAX_OBJECT)
+ return;
+
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ blkid = dbuf_whichblock(dn, object * sizeof (dnode_phys_t));
+ dbuf_prefetch(dn, blkid);
+ rw_exit(&dn->dn_struct_rwlock);
+ return;
+ }
+
+ /*
+ * XXX - Note, if the dnode for the requested object is not
+ * already cached, we will do a *synchronous* read in the
+ * dnode_hold() call. The same is true for any indirects.
+ */
+ err = dnode_hold(os->os, object, FTAG, &dn);
+ if (err != 0)
+ return;
+
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ if (dn->dn_datablkshift) {
+ int blkshift = dn->dn_datablkshift;
+ nblks = (P2ROUNDUP(offset+len, 1<<blkshift) -
+ P2ALIGN(offset, 1<<blkshift)) >> blkshift;
+ } else {
+ nblks = (offset < dn->dn_datablksz);
+ }
+
+ if (nblks != 0) {
+ blkid = dbuf_whichblock(dn, offset);
+ for (i = 0; i < nblks; i++)
+ dbuf_prefetch(dn, blkid+i);
+ }
+
+ rw_exit(&dn->dn_struct_rwlock);
+
+ dnode_rele(dn, FTAG);
+}
+
+int
+dmu_free_range(objset_t *os, uint64_t object, uint64_t offset,
+ uint64_t size, dmu_tx_t *tx)
+{
+ dnode_t *dn;
+ int err = dnode_hold(os->os, object, FTAG, &dn);
+ if (err)
+ return (err);
+ ASSERT(offset < UINT64_MAX);
+ ASSERT(size == -1ULL || size <= UINT64_MAX - offset);
+ dnode_free_range(dn, offset, size, tx);
+ dnode_rele(dn, FTAG);
+ return (0);
+}
+
+int
+dmu_read(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
+ void *buf)
+{
+ dnode_t *dn;
+ dmu_buf_t **dbp;
+ int numbufs, i, err;
+
+ err = dnode_hold(os->os, object, FTAG, &dn);
+ if (err)
+ return (err);
+
+ /*
+ * Deal with odd block sizes, where there can't be data past the first
+ * block. If we ever do the tail block optimization, we will need to
+ * handle that here as well.
+ */
+ if (dn->dn_datablkshift == 0) {
+ int newsz = offset > dn->dn_datablksz ? 0 :
+ MIN(size, dn->dn_datablksz - offset);
+ bzero((char *)buf + newsz, size - newsz);
+ size = newsz;
+ }
+
+ while (size > 0) {
+ uint64_t mylen = MIN(size, DMU_MAX_ACCESS / 2);
+ int err;
+
+ /*
+ * NB: we could do this block-at-a-time, but it's nice
+ * to be reading in parallel.
+ */
+ err = dmu_buf_hold_array_by_dnode(dn, offset, mylen,
+ TRUE, FTAG, &numbufs, &dbp);
+ if (err)
+ return (err);
+
+ for (i = 0; i < numbufs; i++) {
+ int tocpy;
+ int bufoff;
+ dmu_buf_t *db = dbp[i];
+
+ ASSERT(size > 0);
+
+ bufoff = offset - db->db_offset;
+ tocpy = (int)MIN(db->db_size - bufoff, size);
+
+ bcopy((char *)db->db_data + bufoff, buf, tocpy);
+
+ offset += tocpy;
+ size -= tocpy;
+ buf = (char *)buf + tocpy;
+ }
+ dmu_buf_rele_array(dbp, numbufs, FTAG);
+ }
+ dnode_rele(dn, FTAG);
+ return (0);
+}
+
+void
+dmu_write(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
+ const void *buf, dmu_tx_t *tx)
+{
+ dmu_buf_t **dbp;
+ int numbufs, i;
+
+ if (size == 0)
+ return;
+
+ VERIFY(0 == dmu_buf_hold_array(os, object, offset, size,
+ FALSE, FTAG, &numbufs, &dbp));
+
+ for (i = 0; i < numbufs; i++) {
+ int tocpy;
+ int bufoff;
+ dmu_buf_t *db = dbp[i];
+
+ ASSERT(size > 0);
+
+ bufoff = offset - db->db_offset;
+ tocpy = (int)MIN(db->db_size - bufoff, size);
+
+ ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
+
+ if (tocpy == db->db_size)
+ dmu_buf_will_fill(db, tx);
+ else
+ dmu_buf_will_dirty(db, tx);
+
+ bcopy(buf, (char *)db->db_data + bufoff, tocpy);
+
+ if (tocpy == db->db_size)
+ dmu_buf_fill_done(db, tx);
+
+ offset += tocpy;
+ size -= tocpy;
+ buf = (char *)buf + tocpy;
+ }
+ dmu_buf_rele_array(dbp, numbufs, FTAG);
+}
+
+#ifdef _KERNEL
+int
+dmu_read_uio(objset_t *os, uint64_t object, uio_t *uio, uint64_t size)
+{
+ dmu_buf_t **dbp;
+ int numbufs, i, err;
+
+ /*
+ * NB: we could do this block-at-a-time, but it's nice
+ * to be reading in parallel.
+ */
+ err = dmu_buf_hold_array(os, object, uio->uio_loffset, size, TRUE, FTAG,
+ &numbufs, &dbp);
+ if (err)
+ return (err);
+
+ for (i = 0; i < numbufs; i++) {
+ int tocpy;
+ int bufoff;
+ dmu_buf_t *db = dbp[i];
+
+ ASSERT(size > 0);
+
+ bufoff = uio->uio_loffset - db->db_offset;
+ tocpy = (int)MIN(db->db_size - bufoff, size);
+
+ err = uiomove((char *)db->db_data + bufoff, tocpy,
+ UIO_READ, uio);
+ if (err)
+ break;
+
+ size -= tocpy;
+ }
+ dmu_buf_rele_array(dbp, numbufs, FTAG);
+
+ return (err);
+}
+
+int
+dmu_write_uio(objset_t *os, uint64_t object, uio_t *uio, uint64_t size,
+ dmu_tx_t *tx)
+{
+ dmu_buf_t **dbp;
+ int numbufs, i;
+ int err = 0;
+
+ if (size == 0)
+ return (0);
+
+ err = dmu_buf_hold_array(os, object, uio->uio_loffset, size,
+ FALSE, FTAG, &numbufs, &dbp);
+ if (err)
+ return (err);
+
+ for (i = 0; i < numbufs; i++) {
+ int tocpy;
+ int bufoff;
+ dmu_buf_t *db = dbp[i];
+
+ ASSERT(size > 0);
+
+ bufoff = uio->uio_loffset - db->db_offset;
+ tocpy = (int)MIN(db->db_size - bufoff, size);
+
+ ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
+
+ if (tocpy == db->db_size)
+ dmu_buf_will_fill(db, tx);
+ else
+ dmu_buf_will_dirty(db, tx);
+
+ /*
+ * XXX uiomove could block forever (eg. nfs-backed
+ * pages). There needs to be a uiolockdown() function
+ * to lock the pages in memory, so that uiomove won't
+ * block.
+ */
+ err = uiomove((char *)db->db_data + bufoff, tocpy,
+ UIO_WRITE, uio);
+
+ if (tocpy == db->db_size)
+ dmu_buf_fill_done(db, tx);
+
+ if (err)
+ break;
+
+ size -= tocpy;
+ }
+ dmu_buf_rele_array(dbp, numbufs, FTAG);
+ return (err);
+}
+
+#ifndef __FreeBSD__
+int
+dmu_write_pages(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
+ page_t *pp, dmu_tx_t *tx)
+{
+ dmu_buf_t **dbp;
+ int numbufs, i;
+ int err;
+
+ if (size == 0)
+ return (0);
+
+ err = dmu_buf_hold_array(os, object, offset, size,
+ FALSE, FTAG, &numbufs, &dbp);
+ if (err)
+ return (err);
+
+ for (i = 0; i < numbufs; i++) {
+ int tocpy, copied, thiscpy;
+ int bufoff;
+ dmu_buf_t *db = dbp[i];
+ caddr_t va;
+
+ ASSERT(size > 0);
+ ASSERT3U(db->db_size, >=, PAGESIZE);
+
+ bufoff = offset - db->db_offset;
+ tocpy = (int)MIN(db->db_size - bufoff, size);
+
+ ASSERT(i == 0 || i == numbufs-1 || tocpy == db->db_size);
+
+ if (tocpy == db->db_size)
+ dmu_buf_will_fill(db, tx);
+ else
+ dmu_buf_will_dirty(db, tx);
+
+ for (copied = 0; copied < tocpy; copied += PAGESIZE) {
+ ASSERT3U(pp->p_offset, ==, db->db_offset + bufoff);
+ thiscpy = MIN(PAGESIZE, tocpy - copied);
+ va = ppmapin(pp, PROT_READ, (caddr_t)-1);
+ bcopy(va, (char *)db->db_data + bufoff, thiscpy);
+ ppmapout(va);
+ pp = pp->p_next;
+ bufoff += PAGESIZE;
+ }
+
+ if (tocpy == db->db_size)
+ dmu_buf_fill_done(db, tx);
+
+ if (err)
+ break;
+
+ offset += tocpy;
+ size -= tocpy;
+ }
+ dmu_buf_rele_array(dbp, numbufs, FTAG);
+ return (err);
+}
+#endif /* !__FreeBSD__ */
+#endif /* _KERNEL */
+
+typedef struct {
+ dbuf_dirty_record_t *dr;
+ dmu_sync_cb_t *done;
+ void *arg;
+} dmu_sync_arg_t;
+
+/* ARGSUSED */
+static void
+dmu_sync_done(zio_t *zio, arc_buf_t *buf, void *varg)
+{
+ dmu_sync_arg_t *in = varg;
+ dbuf_dirty_record_t *dr = in->dr;
+ dmu_buf_impl_t *db = dr->dr_dbuf;
+ dmu_sync_cb_t *done = in->done;
+
+ if (!BP_IS_HOLE(zio->io_bp)) {
+ zio->io_bp->blk_fill = 1;
+ BP_SET_TYPE(zio->io_bp, db->db_dnode->dn_type);
+ BP_SET_LEVEL(zio->io_bp, 0);
+ }
+
+ mutex_enter(&db->db_mtx);
+ ASSERT(dr->dt.dl.dr_override_state == DR_IN_DMU_SYNC);
+ dr->dt.dl.dr_overridden_by = *zio->io_bp; /* structure assignment */
+ dr->dt.dl.dr_override_state = DR_OVERRIDDEN;
+ cv_broadcast(&db->db_changed);
+ mutex_exit(&db->db_mtx);
+
+ if (done)
+ done(&(db->db), in->arg);
+
+ kmem_free(in, sizeof (dmu_sync_arg_t));
+}
+
+/*
+ * Intent log support: sync the block associated with db to disk.
+ * N.B. and XXX: the caller is responsible for making sure that the
+ * data isn't changing while dmu_sync() is writing it.
+ *
+ * Return values:
+ *
+ * EEXIST: this txg has already been synced, so there's nothing to to.
+ * The caller should not log the write.
+ *
+ * ENOENT: the block was dbuf_free_range()'d, so there's nothing to do.
+ * The caller should not log the write.
+ *
+ * EALREADY: this block is already in the process of being synced.
+ * The caller should track its progress (somehow).
+ *
+ * EINPROGRESS: the IO has been initiated.
+ * The caller should log this blkptr in the callback.
+ *
+ * 0: completed. Sets *bp to the blkptr just written.
+ * The caller should log this blkptr immediately.
+ */
+int
+dmu_sync(zio_t *pio, dmu_buf_t *db_fake,
+ blkptr_t *bp, uint64_t txg, dmu_sync_cb_t *done, void *arg)
+{
+ dmu_buf_impl_t *db = (dmu_buf_impl_t *)db_fake;
+ objset_impl_t *os = db->db_objset;
+ dsl_pool_t *dp = os->os_dsl_dataset->ds_dir->dd_pool;
+ tx_state_t *tx = &dp->dp_tx;
+ dbuf_dirty_record_t *dr;
+ dmu_sync_arg_t *in;
+ zbookmark_t zb;
+ zio_t *zio;
+ int zio_flags;
+ int err;
+
+ ASSERT(BP_IS_HOLE(bp));
+ ASSERT(txg != 0);
+
+
+ dprintf("dmu_sync txg=%llu, s,o,q %llu %llu %llu\n",
+ txg, tx->tx_synced_txg, tx->tx_open_txg, tx->tx_quiesced_txg);
+
+ /*
+ * XXX - would be nice if we could do this without suspending...
+ */
+ txg_suspend(dp);
+
+ /*
+ * If this txg already synced, there's nothing to do.
+ */
+ if (txg <= tx->tx_synced_txg) {
+ txg_resume(dp);
+ /*
+ * If we're running ziltest, we need the blkptr regardless.
+ */
+ if (txg > spa_freeze_txg(dp->dp_spa)) {
+ /* if db_blkptr == NULL, this was an empty write */
+ if (db->db_blkptr)
+ *bp = *db->db_blkptr; /* structure assignment */
+ return (0);
+ }
+ return (EEXIST);
+ }
+
+ mutex_enter(&db->db_mtx);
+
+ if (txg == tx->tx_syncing_txg) {
+ while (db->db_data_pending) {
+ /*
+ * IO is in-progress. Wait for it to finish.
+ * XXX - would be nice to be able to somehow "attach"
+ * this zio to the parent zio passed in.
+ */
+ cv_wait(&db->db_changed, &db->db_mtx);
+ if (!db->db_data_pending &&
+ db->db_blkptr && BP_IS_HOLE(db->db_blkptr)) {
+ /*
+ * IO was compressed away
+ */
+ *bp = *db->db_blkptr; /* structure assignment */
+ mutex_exit(&db->db_mtx);
+ txg_resume(dp);
+ return (0);
+ }
+ ASSERT(db->db_data_pending ||
+ (db->db_blkptr && db->db_blkptr->blk_birth == txg));
+ }
+
+ if (db->db_blkptr && db->db_blkptr->blk_birth == txg) {
+ /*
+ * IO is already completed.
+ */
+ *bp = *db->db_blkptr; /* structure assignment */
+ mutex_exit(&db->db_mtx);
+ txg_resume(dp);
+ return (0);
+ }
+ }
+
+ dr = db->db_last_dirty;
+ while (dr && dr->dr_txg > txg)
+ dr = dr->dr_next;
+ if (dr == NULL || dr->dr_txg < txg) {
+ /*
+ * This dbuf isn't dirty, must have been free_range'd.
+ * There's no need to log writes to freed blocks, so we're done.
+ */
+ mutex_exit(&db->db_mtx);
+ txg_resume(dp);
+ return (ENOENT);
+ }
+
+ ASSERT(dr->dr_txg == txg);
+ if (dr->dt.dl.dr_override_state == DR_IN_DMU_SYNC) {
+ /*
+ * We have already issued a sync write for this buffer.
+ */
+ mutex_exit(&db->db_mtx);
+ txg_resume(dp);
+ return (EALREADY);
+ } else if (dr->dt.dl.dr_override_state == DR_OVERRIDDEN) {
+ /*
+ * This buffer has already been synced. It could not
+ * have been dirtied since, or we would have cleared the state.
+ */
+ *bp = dr->dt.dl.dr_overridden_by; /* structure assignment */
+ mutex_exit(&db->db_mtx);
+ txg_resume(dp);
+ return (0);
+ }
+
+ dr->dt.dl.dr_override_state = DR_IN_DMU_SYNC;
+ in = kmem_alloc(sizeof (dmu_sync_arg_t), KM_SLEEP);
+ in->dr = dr;
+ in->done = done;
+ in->arg = arg;
+ mutex_exit(&db->db_mtx);
+ txg_resume(dp);
+
+ zb.zb_objset = os->os_dsl_dataset->ds_object;
+ zb.zb_object = db->db.db_object;
+ zb.zb_level = db->db_level;
+ zb.zb_blkid = db->db_blkid;
+ zio_flags = ZIO_FLAG_MUSTSUCCEED;
+ if (dmu_ot[db->db_dnode->dn_type].ot_metadata || zb.zb_level != 0)
+ zio_flags |= ZIO_FLAG_METADATA;
+ zio = arc_write(pio, os->os_spa,
+ zio_checksum_select(db->db_dnode->dn_checksum, os->os_checksum),
+ zio_compress_select(db->db_dnode->dn_compress, os->os_compress),
+ dmu_get_replication_level(os, &zb, db->db_dnode->dn_type),
+ txg, bp, dr->dt.dl.dr_data, NULL, dmu_sync_done, in,
+ ZIO_PRIORITY_SYNC_WRITE, zio_flags, &zb);
+
+ if (pio) {
+ zio_nowait(zio);
+ err = EINPROGRESS;
+ } else {
+ err = zio_wait(zio);
+ ASSERT(err == 0);
+ }
+ return (err);
+}
+
+int
+dmu_object_set_blocksize(objset_t *os, uint64_t object, uint64_t size, int ibs,
+ dmu_tx_t *tx)
+{
+ dnode_t *dn;
+ int err;
+
+ err = dnode_hold(os->os, object, FTAG, &dn);
+ if (err)
+ return (err);
+ err = dnode_set_blksz(dn, size, ibs, tx);
+ dnode_rele(dn, FTAG);
+ return (err);
+}
+
+void
+dmu_object_set_checksum(objset_t *os, uint64_t object, uint8_t checksum,
+ dmu_tx_t *tx)
+{
+ dnode_t *dn;
+
+ /* XXX assumes dnode_hold will not get an i/o error */
+ (void) dnode_hold(os->os, object, FTAG, &dn);
+ ASSERT(checksum < ZIO_CHECKSUM_FUNCTIONS);
+ dn->dn_checksum = checksum;
+ dnode_setdirty(dn, tx);
+ dnode_rele(dn, FTAG);
+}
+
+void
+dmu_object_set_compress(objset_t *os, uint64_t object, uint8_t compress,
+ dmu_tx_t *tx)
+{
+ dnode_t *dn;
+
+ /* XXX assumes dnode_hold will not get an i/o error */
+ (void) dnode_hold(os->os, object, FTAG, &dn);
+ ASSERT(compress < ZIO_COMPRESS_FUNCTIONS);
+ dn->dn_compress = compress;
+ dnode_setdirty(dn, tx);
+ dnode_rele(dn, FTAG);
+}
+
+int
+dmu_get_replication_level(objset_impl_t *os,
+ zbookmark_t *zb, dmu_object_type_t ot)
+{
+ int ncopies = os->os_copies;
+
+ /* If it's the mos, it should have max copies set. */
+ ASSERT(zb->zb_objset != 0 ||
+ ncopies == spa_max_replication(os->os_spa));
+
+ if (dmu_ot[ot].ot_metadata || zb->zb_level != 0)
+ ncopies++;
+ return (MIN(ncopies, spa_max_replication(os->os_spa)));
+}
+
+int
+dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole, uint64_t *off)
+{
+ dnode_t *dn;
+ int i, err;
+
+ err = dnode_hold(os->os, object, FTAG, &dn);
+ if (err)
+ return (err);
+ /*
+ * Sync any current changes before
+ * we go trundling through the block pointers.
+ */
+ for (i = 0; i < TXG_SIZE; i++) {
+ if (list_link_active(&dn->dn_dirty_link[i]))
+ break;
+ }
+ if (i != TXG_SIZE) {
+ dnode_rele(dn, FTAG);
+ txg_wait_synced(dmu_objset_pool(os), 0);
+ err = dnode_hold(os->os, object, FTAG, &dn);
+ if (err)
+ return (err);
+ }
+
+ err = dnode_next_offset(dn, hole, off, 1, 1, 0);
+ dnode_rele(dn, FTAG);
+
+ return (err);
+}
+
+void
+dmu_object_info_from_dnode(dnode_t *dn, dmu_object_info_t *doi)
+{
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ mutex_enter(&dn->dn_mtx);
+
+ doi->doi_data_block_size = dn->dn_datablksz;
+ doi->doi_metadata_block_size = dn->dn_indblkshift ?
+ 1ULL << dn->dn_indblkshift : 0;
+ doi->doi_indirection = dn->dn_nlevels;
+ doi->doi_checksum = dn->dn_checksum;
+ doi->doi_compress = dn->dn_compress;
+ doi->doi_physical_blks = (DN_USED_BYTES(dn->dn_phys) +
+ SPA_MINBLOCKSIZE/2) >> SPA_MINBLOCKSHIFT;
+ doi->doi_max_block_offset = dn->dn_phys->dn_maxblkid;
+ doi->doi_type = dn->dn_type;
+ doi->doi_bonus_size = dn->dn_bonuslen;
+ doi->doi_bonus_type = dn->dn_bonustype;
+
+ mutex_exit(&dn->dn_mtx);
+ rw_exit(&dn->dn_struct_rwlock);
+}
+
+/*
+ * Get information on a DMU object.
+ * If doi is NULL, just indicates whether the object exists.
+ */
+int
+dmu_object_info(objset_t *os, uint64_t object, dmu_object_info_t *doi)
+{
+ dnode_t *dn;
+ int err = dnode_hold(os->os, object, FTAG, &dn);
+
+ if (err)
+ return (err);
+
+ if (doi != NULL)
+ dmu_object_info_from_dnode(dn, doi);
+
+ dnode_rele(dn, FTAG);
+ return (0);
+}
+
+/*
+ * As above, but faster; can be used when you have a held dbuf in hand.
+ */
+void
+dmu_object_info_from_db(dmu_buf_t *db, dmu_object_info_t *doi)
+{
+ dmu_object_info_from_dnode(((dmu_buf_impl_t *)db)->db_dnode, doi);
+}
+
+/*
+ * Faster still when you only care about the size.
+ * This is specifically optimized for zfs_getattr().
+ */
+void
+dmu_object_size_from_db(dmu_buf_t *db, uint32_t *blksize, u_longlong_t *nblk512)
+{
+ dnode_t *dn = ((dmu_buf_impl_t *)db)->db_dnode;
+
+ *blksize = dn->dn_datablksz;
+ /* add 1 for dnode space */
+ *nblk512 = ((DN_USED_BYTES(dn->dn_phys) + SPA_MINBLOCKSIZE/2) >>
+ SPA_MINBLOCKSHIFT) + 1;
+}
+
+void
+byteswap_uint64_array(void *vbuf, size_t size)
+{
+ uint64_t *buf = vbuf;
+ size_t count = size >> 3;
+ int i;
+
+ ASSERT((size & 7) == 0);
+
+ for (i = 0; i < count; i++)
+ buf[i] = BSWAP_64(buf[i]);
+}
+
+void
+byteswap_uint32_array(void *vbuf, size_t size)
+{
+ uint32_t *buf = vbuf;
+ size_t count = size >> 2;
+ int i;
+
+ ASSERT((size & 3) == 0);
+
+ for (i = 0; i < count; i++)
+ buf[i] = BSWAP_32(buf[i]);
+}
+
+void
+byteswap_uint16_array(void *vbuf, size_t size)
+{
+ uint16_t *buf = vbuf;
+ size_t count = size >> 1;
+ int i;
+
+ ASSERT((size & 1) == 0);
+
+ for (i = 0; i < count; i++)
+ buf[i] = BSWAP_16(buf[i]);
+}
+
+/* ARGSUSED */
+void
+byteswap_uint8_array(void *vbuf, size_t size)
+{
+}
+
+void
+dmu_init(void)
+{
+ dbuf_init();
+ dnode_init();
+ arc_init();
+}
+
+void
+dmu_fini(void)
+{
+ arc_fini();
+ dnode_fini();
+ dbuf_fini();
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c
new file mode 100644
index 0000000..93168cc
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_object.c
@@ -0,0 +1,160 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/dmu_objset.h>
+#include <sys/dmu_tx.h>
+#include <sys/dnode.h>
+
+uint64_t
+dmu_object_alloc(objset_t *os, dmu_object_type_t ot, int blocksize,
+ dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx)
+{
+ objset_impl_t *osi = os->os;
+ uint64_t object;
+ uint64_t L2_dnode_count = DNODES_PER_BLOCK <<
+ (osi->os_meta_dnode->dn_indblkshift - SPA_BLKPTRSHIFT);
+ dnode_t *dn = NULL;
+ int restarted = B_FALSE;
+
+ mutex_enter(&osi->os_obj_lock);
+ for (;;) {
+ object = osi->os_obj_next;
+ /*
+ * Each time we polish off an L2 bp worth of dnodes
+ * (2^13 objects), move to another L2 bp that's still
+ * reasonably sparse (at most 1/4 full). Look from the
+ * beginning once, but after that keep looking from here.
+ * If we can't find one, just keep going from here.
+ */
+ if (P2PHASE(object, L2_dnode_count) == 0) {
+ uint64_t offset = restarted ? object << DNODE_SHIFT : 0;
+ int error = dnode_next_offset(osi->os_meta_dnode,
+ B_TRUE, &offset, 2, DNODES_PER_BLOCK >> 2, 0);
+ restarted = B_TRUE;
+ if (error == 0)
+ object = offset >> DNODE_SHIFT;
+ }
+ osi->os_obj_next = ++object;
+
+ /*
+ * XXX We should check for an i/o error here and return
+ * up to our caller. Actually we should pre-read it in
+ * dmu_tx_assign(), but there is currently no mechanism
+ * to do so.
+ */
+ (void) dnode_hold_impl(os->os, object, DNODE_MUST_BE_FREE,
+ FTAG, &dn);
+ if (dn)
+ break;
+
+ if (dmu_object_next(os, &object, B_TRUE, 0) == 0)
+ osi->os_obj_next = object - 1;
+ }
+
+ dnode_allocate(dn, ot, blocksize, 0, bonustype, bonuslen, tx);
+ dnode_rele(dn, FTAG);
+
+ mutex_exit(&osi->os_obj_lock);
+
+ dmu_tx_add_new_object(tx, os, object);
+ return (object);
+}
+
+int
+dmu_object_claim(objset_t *os, uint64_t object, dmu_object_type_t ot,
+ int blocksize, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx)
+{
+ dnode_t *dn;
+ int err;
+
+ if (object == DMU_META_DNODE_OBJECT && !dmu_tx_private_ok(tx))
+ return (EBADF);
+
+ err = dnode_hold_impl(os->os, object, DNODE_MUST_BE_FREE, FTAG, &dn);
+ if (err)
+ return (err);
+ dnode_allocate(dn, ot, blocksize, 0, bonustype, bonuslen, tx);
+ dnode_rele(dn, FTAG);
+
+ dmu_tx_add_new_object(tx, os, object);
+ return (0);
+}
+
+int
+dmu_object_reclaim(objset_t *os, uint64_t object, dmu_object_type_t ot,
+ int blocksize, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx)
+{
+ dnode_t *dn;
+ int err;
+
+ if (object == DMU_META_DNODE_OBJECT && !dmu_tx_private_ok(tx))
+ return (EBADF);
+
+ err = dnode_hold_impl(os->os, object, DNODE_MUST_BE_ALLOCATED,
+ FTAG, &dn);
+ if (err)
+ return (err);
+ dnode_reallocate(dn, ot, blocksize, bonustype, bonuslen, tx);
+ dnode_rele(dn, FTAG);
+
+ return (0);
+}
+
+int
+dmu_object_free(objset_t *os, uint64_t object, dmu_tx_t *tx)
+{
+ dnode_t *dn;
+ int err;
+
+ ASSERT(object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx));
+
+ err = dnode_hold_impl(os->os, object, DNODE_MUST_BE_ALLOCATED,
+ FTAG, &dn);
+ if (err)
+ return (err);
+
+ ASSERT(dn->dn_type != DMU_OT_NONE);
+ dnode_free(dn, tx);
+ dnode_rele(dn, FTAG);
+
+ return (0);
+}
+
+int
+dmu_object_next(objset_t *os, uint64_t *objectp, boolean_t hole, uint64_t txg)
+{
+ uint64_t offset = (*objectp + 1) << DNODE_SHIFT;
+ int error;
+
+ error = dnode_next_offset(os->os->os_meta_dnode,
+ hole, &offset, 0, DNODES_PER_BLOCK, txg);
+
+ *objectp = offset >> DNODE_SHIFT;
+
+ return (error);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c
new file mode 100644
index 0000000..378fe8c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_objset.c
@@ -0,0 +1,1037 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/dmu_objset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_prop.h>
+#include <sys/dsl_pool.h>
+#include <sys/dsl_synctask.h>
+#include <sys/dnode.h>
+#include <sys/dbuf.h>
+#include <sys/zvol.h>
+#include <sys/dmu_tx.h>
+#include <sys/zio_checksum.h>
+#include <sys/zap.h>
+#include <sys/zil.h>
+#include <sys/dmu_impl.h>
+
+
+spa_t *
+dmu_objset_spa(objset_t *os)
+{
+ return (os->os->os_spa);
+}
+
+zilog_t *
+dmu_objset_zil(objset_t *os)
+{
+ return (os->os->os_zil);
+}
+
+dsl_pool_t *
+dmu_objset_pool(objset_t *os)
+{
+ dsl_dataset_t *ds;
+
+ if ((ds = os->os->os_dsl_dataset) != NULL && ds->ds_dir)
+ return (ds->ds_dir->dd_pool);
+ else
+ return (spa_get_dsl(os->os->os_spa));
+}
+
+dsl_dataset_t *
+dmu_objset_ds(objset_t *os)
+{
+ return (os->os->os_dsl_dataset);
+}
+
+dmu_objset_type_t
+dmu_objset_type(objset_t *os)
+{
+ return (os->os->os_phys->os_type);
+}
+
+void
+dmu_objset_name(objset_t *os, char *buf)
+{
+ dsl_dataset_name(os->os->os_dsl_dataset, buf);
+}
+
+uint64_t
+dmu_objset_id(objset_t *os)
+{
+ dsl_dataset_t *ds = os->os->os_dsl_dataset;
+
+ return (ds ? ds->ds_object : 0);
+}
+
+static void
+checksum_changed_cb(void *arg, uint64_t newval)
+{
+ objset_impl_t *osi = arg;
+
+ /*
+ * Inheritance should have been done by now.
+ */
+ ASSERT(newval != ZIO_CHECKSUM_INHERIT);
+
+ osi->os_checksum = zio_checksum_select(newval, ZIO_CHECKSUM_ON_VALUE);
+}
+
+static void
+compression_changed_cb(void *arg, uint64_t newval)
+{
+ objset_impl_t *osi = arg;
+
+ /*
+ * Inheritance and range checking should have been done by now.
+ */
+ ASSERT(newval != ZIO_COMPRESS_INHERIT);
+
+ osi->os_compress = zio_compress_select(newval, ZIO_COMPRESS_ON_VALUE);
+}
+
+static void
+copies_changed_cb(void *arg, uint64_t newval)
+{
+ objset_impl_t *osi = arg;
+
+ /*
+ * Inheritance and range checking should have been done by now.
+ */
+ ASSERT(newval > 0);
+ ASSERT(newval <= spa_max_replication(osi->os_spa));
+
+ osi->os_copies = newval;
+}
+
+void
+dmu_objset_byteswap(void *buf, size_t size)
+{
+ objset_phys_t *osp = buf;
+
+ ASSERT(size == sizeof (objset_phys_t));
+ dnode_byteswap(&osp->os_meta_dnode);
+ byteswap_uint64_array(&osp->os_zil_header, sizeof (zil_header_t));
+ osp->os_type = BSWAP_64(osp->os_type);
+}
+
+int
+dmu_objset_open_impl(spa_t *spa, dsl_dataset_t *ds, blkptr_t *bp,
+ objset_impl_t **osip)
+{
+ objset_impl_t *winner, *osi;
+ int i, err, checksum;
+
+ osi = kmem_zalloc(sizeof (objset_impl_t), KM_SLEEP);
+ osi->os.os = osi;
+ osi->os_dsl_dataset = ds;
+ osi->os_spa = spa;
+ osi->os_rootbp = bp;
+ if (!BP_IS_HOLE(osi->os_rootbp)) {
+ uint32_t aflags = ARC_WAIT;
+ zbookmark_t zb;
+ zb.zb_objset = ds ? ds->ds_object : 0;
+ zb.zb_object = 0;
+ zb.zb_level = -1;
+ zb.zb_blkid = 0;
+
+ dprintf_bp(osi->os_rootbp, "reading %s", "");
+ err = arc_read(NULL, spa, osi->os_rootbp,
+ dmu_ot[DMU_OT_OBJSET].ot_byteswap,
+ arc_getbuf_func, &osi->os_phys_buf,
+ ZIO_PRIORITY_SYNC_READ, ZIO_FLAG_CANFAIL, &aflags, &zb);
+ if (err) {
+ kmem_free(osi, sizeof (objset_impl_t));
+ return (err);
+ }
+ osi->os_phys = osi->os_phys_buf->b_data;
+ arc_release(osi->os_phys_buf, &osi->os_phys_buf);
+ } else {
+ osi->os_phys_buf = arc_buf_alloc(spa, sizeof (objset_phys_t),
+ &osi->os_phys_buf, ARC_BUFC_METADATA);
+ osi->os_phys = osi->os_phys_buf->b_data;
+ bzero(osi->os_phys, sizeof (objset_phys_t));
+ }
+
+ /*
+ * Note: the changed_cb will be called once before the register
+ * func returns, thus changing the checksum/compression from the
+ * default (fletcher2/off). Snapshots don't need to know, and
+ * registering would complicate clone promotion.
+ */
+ if (ds && ds->ds_phys->ds_num_children == 0) {
+ err = dsl_prop_register(ds, "checksum",
+ checksum_changed_cb, osi);
+ if (err == 0)
+ err = dsl_prop_register(ds, "compression",
+ compression_changed_cb, osi);
+ if (err == 0)
+ err = dsl_prop_register(ds, "copies",
+ copies_changed_cb, osi);
+ if (err) {
+ VERIFY(arc_buf_remove_ref(osi->os_phys_buf,
+ &osi->os_phys_buf) == 1);
+ kmem_free(osi, sizeof (objset_impl_t));
+ return (err);
+ }
+ } else if (ds == NULL) {
+ /* It's the meta-objset. */
+ osi->os_checksum = ZIO_CHECKSUM_FLETCHER_4;
+ osi->os_compress = ZIO_COMPRESS_LZJB;
+ osi->os_copies = spa_max_replication(spa);
+ }
+
+ osi->os_zil = zil_alloc(&osi->os, &osi->os_phys->os_zil_header);
+
+ /*
+ * Metadata always gets compressed and checksummed.
+ * If the data checksum is multi-bit correctable, and it's not
+ * a ZBT-style checksum, then it's suitable for metadata as well.
+ * Otherwise, the metadata checksum defaults to fletcher4.
+ */
+ checksum = osi->os_checksum;
+
+ if (zio_checksum_table[checksum].ci_correctable &&
+ !zio_checksum_table[checksum].ci_zbt)
+ osi->os_md_checksum = checksum;
+ else
+ osi->os_md_checksum = ZIO_CHECKSUM_FLETCHER_4;
+ osi->os_md_compress = ZIO_COMPRESS_LZJB;
+
+ for (i = 0; i < TXG_SIZE; i++) {
+ list_create(&osi->os_dirty_dnodes[i], sizeof (dnode_t),
+ offsetof(dnode_t, dn_dirty_link[i]));
+ list_create(&osi->os_free_dnodes[i], sizeof (dnode_t),
+ offsetof(dnode_t, dn_dirty_link[i]));
+ }
+ list_create(&osi->os_dnodes, sizeof (dnode_t),
+ offsetof(dnode_t, dn_link));
+ list_create(&osi->os_downgraded_dbufs, sizeof (dmu_buf_impl_t),
+ offsetof(dmu_buf_impl_t, db_link));
+
+ mutex_init(&osi->os_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&osi->os_obj_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ osi->os_meta_dnode = dnode_special_open(osi,
+ &osi->os_phys->os_meta_dnode, DMU_META_DNODE_OBJECT);
+
+ if (ds != NULL) {
+ winner = dsl_dataset_set_user_ptr(ds, osi, dmu_objset_evict);
+ if (winner) {
+ dmu_objset_evict(ds, osi);
+ osi = winner;
+ }
+ }
+
+ *osip = osi;
+ return (0);
+}
+
+/* called from zpl */
+int
+dmu_objset_open(const char *name, dmu_objset_type_t type, int mode,
+ objset_t **osp)
+{
+ dsl_dataset_t *ds;
+ int err;
+ objset_t *os;
+ objset_impl_t *osi;
+
+ os = kmem_alloc(sizeof (objset_t), KM_SLEEP);
+ err = dsl_dataset_open(name, mode, os, &ds);
+ if (err) {
+ kmem_free(os, sizeof (objset_t));
+ return (err);
+ }
+
+ osi = dsl_dataset_get_user_ptr(ds);
+ if (osi == NULL) {
+ err = dmu_objset_open_impl(dsl_dataset_get_spa(ds),
+ ds, &ds->ds_phys->ds_bp, &osi);
+ if (err) {
+ dsl_dataset_close(ds, mode, os);
+ kmem_free(os, sizeof (objset_t));
+ return (err);
+ }
+ }
+
+ os->os = osi;
+ os->os_mode = mode;
+
+ if (type != DMU_OST_ANY && type != os->os->os_phys->os_type) {
+ dmu_objset_close(os);
+ return (EINVAL);
+ }
+ *osp = os;
+ return (0);
+}
+
+void
+dmu_objset_close(objset_t *os)
+{
+ dsl_dataset_close(os->os->os_dsl_dataset, os->os_mode, os);
+ kmem_free(os, sizeof (objset_t));
+}
+
+int
+dmu_objset_evict_dbufs(objset_t *os, int try)
+{
+ objset_impl_t *osi = os->os;
+ dnode_t *dn;
+
+ mutex_enter(&osi->os_lock);
+
+ /* process the mdn last, since the other dnodes have holds on it */
+ list_remove(&osi->os_dnodes, osi->os_meta_dnode);
+ list_insert_tail(&osi->os_dnodes, osi->os_meta_dnode);
+
+ /*
+ * Find the first dnode with holds. We have to do this dance
+ * because dnode_add_ref() only works if you already have a
+ * hold. If there are no holds then it has no dbufs so OK to
+ * skip.
+ */
+ for (dn = list_head(&osi->os_dnodes);
+ dn && refcount_is_zero(&dn->dn_holds);
+ dn = list_next(&osi->os_dnodes, dn))
+ continue;
+ if (dn)
+ dnode_add_ref(dn, FTAG);
+
+ while (dn) {
+ dnode_t *next_dn = dn;
+
+ do {
+ next_dn = list_next(&osi->os_dnodes, next_dn);
+ } while (next_dn && refcount_is_zero(&next_dn->dn_holds));
+ if (next_dn)
+ dnode_add_ref(next_dn, FTAG);
+
+ mutex_exit(&osi->os_lock);
+ if (dnode_evict_dbufs(dn, try)) {
+ dnode_rele(dn, FTAG);
+ if (next_dn)
+ dnode_rele(next_dn, FTAG);
+ return (1);
+ }
+ dnode_rele(dn, FTAG);
+ mutex_enter(&osi->os_lock);
+ dn = next_dn;
+ }
+ mutex_exit(&osi->os_lock);
+ return (0);
+}
+
+void
+dmu_objset_evict(dsl_dataset_t *ds, void *arg)
+{
+ objset_impl_t *osi = arg;
+ objset_t os;
+ int i;
+
+ for (i = 0; i < TXG_SIZE; i++) {
+ ASSERT(list_head(&osi->os_dirty_dnodes[i]) == NULL);
+ ASSERT(list_head(&osi->os_free_dnodes[i]) == NULL);
+ }
+
+ if (ds && ds->ds_phys->ds_num_children == 0) {
+ VERIFY(0 == dsl_prop_unregister(ds, "checksum",
+ checksum_changed_cb, osi));
+ VERIFY(0 == dsl_prop_unregister(ds, "compression",
+ compression_changed_cb, osi));
+ VERIFY(0 == dsl_prop_unregister(ds, "copies",
+ copies_changed_cb, osi));
+ }
+
+ /*
+ * We should need only a single pass over the dnode list, since
+ * nothing can be added to the list at this point.
+ */
+ os.os = osi;
+ (void) dmu_objset_evict_dbufs(&os, 0);
+
+ ASSERT3P(list_head(&osi->os_dnodes), ==, osi->os_meta_dnode);
+ ASSERT3P(list_tail(&osi->os_dnodes), ==, osi->os_meta_dnode);
+ ASSERT3P(list_head(&osi->os_meta_dnode->dn_dbufs), ==, NULL);
+
+ dnode_special_close(osi->os_meta_dnode);
+ zil_free(osi->os_zil);
+
+ VERIFY(arc_buf_remove_ref(osi->os_phys_buf, &osi->os_phys_buf) == 1);
+ mutex_destroy(&osi->os_lock);
+ mutex_destroy(&osi->os_obj_lock);
+ kmem_free(osi, sizeof (objset_impl_t));
+}
+
+/* called from dsl for meta-objset */
+objset_impl_t *
+dmu_objset_create_impl(spa_t *spa, dsl_dataset_t *ds, blkptr_t *bp,
+ dmu_objset_type_t type, dmu_tx_t *tx)
+{
+ objset_impl_t *osi;
+ dnode_t *mdn;
+
+ ASSERT(dmu_tx_is_syncing(tx));
+ VERIFY(0 == dmu_objset_open_impl(spa, ds, bp, &osi));
+ mdn = osi->os_meta_dnode;
+
+ dnode_allocate(mdn, DMU_OT_DNODE, 1 << DNODE_BLOCK_SHIFT,
+ DN_MAX_INDBLKSHIFT, DMU_OT_NONE, 0, tx);
+
+ /*
+ * We don't want to have to increase the meta-dnode's nlevels
+ * later, because then we could do it in quescing context while
+ * we are also accessing it in open context.
+ *
+ * This precaution is not necessary for the MOS (ds == NULL),
+ * because the MOS is only updated in syncing context.
+ * This is most fortunate: the MOS is the only objset that
+ * needs to be synced multiple times as spa_sync() iterates
+ * to convergence, so minimizing its dn_nlevels matters.
+ */
+ if (ds != NULL) {
+ int levels = 1;
+
+ /*
+ * Determine the number of levels necessary for the meta-dnode
+ * to contain DN_MAX_OBJECT dnodes.
+ */
+ while ((uint64_t)mdn->dn_nblkptr << (mdn->dn_datablkshift +
+ (levels - 1) * (mdn->dn_indblkshift - SPA_BLKPTRSHIFT)) <
+ DN_MAX_OBJECT * sizeof (dnode_phys_t))
+ levels++;
+
+ mdn->dn_next_nlevels[tx->tx_txg & TXG_MASK] =
+ mdn->dn_nlevels = levels;
+ }
+
+ ASSERT(type != DMU_OST_NONE);
+ ASSERT(type != DMU_OST_ANY);
+ ASSERT(type < DMU_OST_NUMTYPES);
+ osi->os_phys->os_type = type;
+
+ dsl_dataset_dirty(ds, tx);
+
+ return (osi);
+}
+
+struct oscarg {
+ void (*userfunc)(objset_t *os, void *arg, dmu_tx_t *tx);
+ void *userarg;
+ dsl_dataset_t *clone_parent;
+ const char *lastname;
+ dmu_objset_type_t type;
+};
+
+/* ARGSUSED */
+static int
+dmu_objset_create_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ struct oscarg *oa = arg2;
+ objset_t *mos = dd->dd_pool->dp_meta_objset;
+ int err;
+ uint64_t ddobj;
+
+ err = zap_lookup(mos, dd->dd_phys->dd_child_dir_zapobj,
+ oa->lastname, sizeof (uint64_t), 1, &ddobj);
+ if (err != ENOENT)
+ return (err ? err : EEXIST);
+
+ if (oa->clone_parent != NULL) {
+ /*
+ * You can't clone across pools.
+ */
+ if (oa->clone_parent->ds_dir->dd_pool != dd->dd_pool)
+ return (EXDEV);
+
+ /*
+ * You can only clone snapshots, not the head datasets.
+ */
+ if (oa->clone_parent->ds_phys->ds_num_children == 0)
+ return (EINVAL);
+ }
+ return (0);
+}
+
+static void
+dmu_objset_create_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ struct oscarg *oa = arg2;
+ dsl_dataset_t *ds;
+ blkptr_t *bp;
+ uint64_t dsobj;
+
+ ASSERT(dmu_tx_is_syncing(tx));
+
+ dsobj = dsl_dataset_create_sync(dd, oa->lastname,
+ oa->clone_parent, tx);
+
+ VERIFY(0 == dsl_dataset_open_obj(dd->dd_pool, dsobj, NULL,
+ DS_MODE_STANDARD | DS_MODE_READONLY, FTAG, &ds));
+ bp = dsl_dataset_get_blkptr(ds);
+ if (BP_IS_HOLE(bp)) {
+ objset_impl_t *osi;
+
+ /* This is an empty dmu_objset; not a clone. */
+ osi = dmu_objset_create_impl(dsl_dataset_get_spa(ds),
+ ds, bp, oa->type, tx);
+
+ if (oa->userfunc)
+ oa->userfunc(&osi->os, oa->userarg, tx);
+ }
+ dsl_dataset_close(ds, DS_MODE_STANDARD | DS_MODE_READONLY, FTAG);
+}
+
+int
+dmu_objset_create(const char *name, dmu_objset_type_t type,
+ objset_t *clone_parent,
+ void (*func)(objset_t *os, void *arg, dmu_tx_t *tx), void *arg)
+{
+ dsl_dir_t *pdd;
+ const char *tail;
+ int err = 0;
+ struct oscarg oa = { 0 };
+
+ ASSERT(strchr(name, '@') == NULL);
+ err = dsl_dir_open(name, FTAG, &pdd, &tail);
+ if (err)
+ return (err);
+ if (tail == NULL) {
+ dsl_dir_close(pdd, FTAG);
+ return (EEXIST);
+ }
+
+ dprintf("name=%s\n", name);
+
+ oa.userfunc = func;
+ oa.userarg = arg;
+ oa.lastname = tail;
+ oa.type = type;
+ if (clone_parent != NULL) {
+ /*
+ * You can't clone to a different type.
+ */
+ if (clone_parent->os->os_phys->os_type != type) {
+ dsl_dir_close(pdd, FTAG);
+ return (EINVAL);
+ }
+ oa.clone_parent = clone_parent->os->os_dsl_dataset;
+ }
+ err = dsl_sync_task_do(pdd->dd_pool, dmu_objset_create_check,
+ dmu_objset_create_sync, pdd, &oa, 5);
+ dsl_dir_close(pdd, FTAG);
+ return (err);
+}
+
+int
+dmu_objset_destroy(const char *name)
+{
+ objset_t *os;
+ int error;
+
+ /*
+ * If it looks like we'll be able to destroy it, and there's
+ * an unplayed replay log sitting around, destroy the log.
+ * It would be nicer to do this in dsl_dataset_destroy_sync(),
+ * but the replay log objset is modified in open context.
+ */
+ error = dmu_objset_open(name, DMU_OST_ANY, DS_MODE_EXCLUSIVE, &os);
+ if (error == 0) {
+ zil_destroy(dmu_objset_zil(os), B_FALSE);
+ dmu_objset_close(os);
+ }
+
+ return (dsl_dataset_destroy(name));
+}
+
+int
+dmu_objset_rollback(const char *name)
+{
+ int err;
+ objset_t *os;
+
+ err = dmu_objset_open(name, DMU_OST_ANY,
+ DS_MODE_EXCLUSIVE | DS_MODE_INCONSISTENT, &os);
+ if (err == 0) {
+ err = zil_suspend(dmu_objset_zil(os));
+ if (err == 0)
+ zil_resume(dmu_objset_zil(os));
+ if (err == 0) {
+ /* XXX uncache everything? */
+ err = dsl_dataset_rollback(os->os->os_dsl_dataset);
+ }
+ dmu_objset_close(os);
+ }
+ return (err);
+}
+
+struct snaparg {
+ dsl_sync_task_group_t *dstg;
+ char *snapname;
+ char failed[MAXPATHLEN];
+};
+
+static int
+dmu_objset_snapshot_one(char *name, void *arg)
+{
+ struct snaparg *sn = arg;
+ objset_t *os;
+ dmu_objset_stats_t stat;
+ int err;
+
+ (void) strcpy(sn->failed, name);
+
+ err = dmu_objset_open(name, DMU_OST_ANY, DS_MODE_STANDARD, &os);
+ if (err != 0)
+ return (err);
+
+ /*
+ * If the objset is in an inconsistent state, return busy.
+ */
+ dmu_objset_fast_stat(os, &stat);
+ if (stat.dds_inconsistent) {
+ dmu_objset_close(os);
+ return (EBUSY);
+ }
+
+ /*
+ * NB: we need to wait for all in-flight changes to get to disk,
+ * so that we snapshot those changes. zil_suspend does this as
+ * a side effect.
+ */
+ err = zil_suspend(dmu_objset_zil(os));
+ if (err == 0) {
+ dsl_sync_task_create(sn->dstg, dsl_dataset_snapshot_check,
+ dsl_dataset_snapshot_sync, os, sn->snapname, 3);
+ } else {
+ dmu_objset_close(os);
+ }
+
+ return (err);
+}
+
+int
+dmu_objset_snapshot(char *fsname, char *snapname, boolean_t recursive)
+{
+ dsl_sync_task_t *dst;
+ struct snaparg sn = { 0 };
+ char *cp;
+ spa_t *spa;
+ int err;
+
+ (void) strcpy(sn.failed, fsname);
+
+ cp = strchr(fsname, '/');
+ if (cp) {
+ *cp = '\0';
+ err = spa_open(fsname, &spa, FTAG);
+ *cp = '/';
+ } else {
+ err = spa_open(fsname, &spa, FTAG);
+ }
+ if (err)
+ return (err);
+
+ sn.dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
+ sn.snapname = snapname;
+
+ if (recursive) {
+ err = dmu_objset_find(fsname,
+ dmu_objset_snapshot_one, &sn, DS_FIND_CHILDREN);
+ } else {
+ err = dmu_objset_snapshot_one(fsname, &sn);
+ }
+
+ if (err)
+ goto out;
+
+ err = dsl_sync_task_group_wait(sn.dstg);
+
+ for (dst = list_head(&sn.dstg->dstg_tasks); dst;
+ dst = list_next(&sn.dstg->dstg_tasks, dst)) {
+ objset_t *os = dst->dst_arg1;
+ if (dst->dst_err)
+ dmu_objset_name(os, sn.failed);
+ zil_resume(dmu_objset_zil(os));
+ dmu_objset_close(os);
+ }
+out:
+ if (err)
+ (void) strcpy(fsname, sn.failed);
+ dsl_sync_task_group_destroy(sn.dstg);
+ spa_close(spa, FTAG);
+ return (err);
+}
+
+static void
+dmu_objset_sync_dnodes(list_t *list, dmu_tx_t *tx)
+{
+ dnode_t *dn;
+
+ while (dn = list_head(list)) {
+ ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT);
+ ASSERT(dn->dn_dbuf->db_data_pending);
+ /*
+ * Initialize dn_zio outside dnode_sync()
+ * to accomodate meta-dnode
+ */
+ dn->dn_zio = dn->dn_dbuf->db_data_pending->dr_zio;
+ ASSERT(dn->dn_zio);
+
+ ASSERT3U(dn->dn_nlevels, <=, DN_MAX_LEVELS);
+ list_remove(list, dn);
+ dnode_sync(dn, tx);
+ }
+}
+
+/* ARGSUSED */
+static void
+ready(zio_t *zio, arc_buf_t *abuf, void *arg)
+{
+ objset_impl_t *os = arg;
+ blkptr_t *bp = os->os_rootbp;
+ dnode_phys_t *dnp = &os->os_phys->os_meta_dnode;
+ int i;
+
+ /*
+ * Update rootbp fill count.
+ */
+ bp->blk_fill = 1; /* count the meta-dnode */
+ for (i = 0; i < dnp->dn_nblkptr; i++)
+ bp->blk_fill += dnp->dn_blkptr[i].blk_fill;
+}
+
+/* ARGSUSED */
+static void
+killer(zio_t *zio, arc_buf_t *abuf, void *arg)
+{
+ objset_impl_t *os = arg;
+
+ ASSERT3U(zio->io_error, ==, 0);
+
+ BP_SET_TYPE(zio->io_bp, DMU_OT_OBJSET);
+ BP_SET_LEVEL(zio->io_bp, 0);
+
+ if (!DVA_EQUAL(BP_IDENTITY(zio->io_bp),
+ BP_IDENTITY(&zio->io_bp_orig))) {
+ if (zio->io_bp_orig.blk_birth == os->os_synctx->tx_txg)
+ dsl_dataset_block_kill(os->os_dsl_dataset,
+ &zio->io_bp_orig, NULL, os->os_synctx);
+ dsl_dataset_block_born(os->os_dsl_dataset, zio->io_bp,
+ os->os_synctx);
+ }
+ arc_release(os->os_phys_buf, &os->os_phys_buf);
+}
+
+/* called from dsl */
+void
+dmu_objset_sync(objset_impl_t *os, zio_t *pio, dmu_tx_t *tx)
+{
+ int txgoff;
+ zbookmark_t zb;
+ zio_t *zio;
+ list_t *list;
+ dbuf_dirty_record_t *dr;
+ int zio_flags;
+
+ dprintf_ds(os->os_dsl_dataset, "txg=%llu\n", tx->tx_txg);
+
+ ASSERT(dmu_tx_is_syncing(tx));
+ /* XXX the write_done callback should really give us the tx... */
+ os->os_synctx = tx;
+
+ if (os->os_dsl_dataset == NULL) {
+ /*
+ * This is the MOS. If we have upgraded,
+ * spa_max_replication() could change, so reset
+ * os_copies here.
+ */
+ os->os_copies = spa_max_replication(os->os_spa);
+ }
+
+ /*
+ * Create the root block IO
+ */
+ zb.zb_objset = os->os_dsl_dataset ? os->os_dsl_dataset->ds_object : 0;
+ zb.zb_object = 0;
+ zb.zb_level = -1;
+ zb.zb_blkid = 0;
+ zio_flags = ZIO_FLAG_MUSTSUCCEED;
+ if (dmu_ot[DMU_OT_OBJSET].ot_metadata || zb.zb_level != 0)
+ zio_flags |= ZIO_FLAG_METADATA;
+ if (BP_IS_OLDER(os->os_rootbp, tx->tx_txg))
+ dsl_dataset_block_kill(os->os_dsl_dataset,
+ os->os_rootbp, pio, tx);
+ zio = arc_write(pio, os->os_spa, os->os_md_checksum,
+ os->os_md_compress,
+ dmu_get_replication_level(os, &zb, DMU_OT_OBJSET),
+ tx->tx_txg, os->os_rootbp, os->os_phys_buf, ready, killer, os,
+ ZIO_PRIORITY_ASYNC_WRITE, zio_flags, &zb);
+
+ /*
+ * Sync meta-dnode - the parent IO for the sync is the root block
+ */
+ os->os_meta_dnode->dn_zio = zio;
+ dnode_sync(os->os_meta_dnode, tx);
+
+ txgoff = tx->tx_txg & TXG_MASK;
+
+ dmu_objset_sync_dnodes(&os->os_free_dnodes[txgoff], tx);
+ dmu_objset_sync_dnodes(&os->os_dirty_dnodes[txgoff], tx);
+
+ list = &os->os_meta_dnode->dn_dirty_records[txgoff];
+ while (dr = list_head(list)) {
+ ASSERT(dr->dr_dbuf->db_level == 0);
+ list_remove(list, dr);
+ if (dr->dr_zio)
+ zio_nowait(dr->dr_zio);
+ }
+ /*
+ * Free intent log blocks up to this tx.
+ */
+ zil_sync(os->os_zil, tx);
+ zio_nowait(zio);
+}
+
+void
+dmu_objset_space(objset_t *os, uint64_t *refdbytesp, uint64_t *availbytesp,
+ uint64_t *usedobjsp, uint64_t *availobjsp)
+{
+ dsl_dataset_space(os->os->os_dsl_dataset, refdbytesp, availbytesp,
+ usedobjsp, availobjsp);
+}
+
+uint64_t
+dmu_objset_fsid_guid(objset_t *os)
+{
+ return (dsl_dataset_fsid_guid(os->os->os_dsl_dataset));
+}
+
+void
+dmu_objset_fast_stat(objset_t *os, dmu_objset_stats_t *stat)
+{
+ stat->dds_type = os->os->os_phys->os_type;
+ if (os->os->os_dsl_dataset)
+ dsl_dataset_fast_stat(os->os->os_dsl_dataset, stat);
+}
+
+void
+dmu_objset_stats(objset_t *os, nvlist_t *nv)
+{
+ ASSERT(os->os->os_dsl_dataset ||
+ os->os->os_phys->os_type == DMU_OST_META);
+
+ if (os->os->os_dsl_dataset != NULL)
+ dsl_dataset_stats(os->os->os_dsl_dataset, nv);
+
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_TYPE,
+ os->os->os_phys->os_type);
+}
+
+int
+dmu_objset_is_snapshot(objset_t *os)
+{
+ if (os->os->os_dsl_dataset != NULL)
+ return (dsl_dataset_is_snapshot(os->os->os_dsl_dataset));
+ else
+ return (B_FALSE);
+}
+
+int
+dmu_snapshot_list_next(objset_t *os, int namelen, char *name,
+ uint64_t *idp, uint64_t *offp)
+{
+ dsl_dataset_t *ds = os->os->os_dsl_dataset;
+ zap_cursor_t cursor;
+ zap_attribute_t attr;
+
+ if (ds->ds_phys->ds_snapnames_zapobj == 0)
+ return (ENOENT);
+
+ zap_cursor_init_serialized(&cursor,
+ ds->ds_dir->dd_pool->dp_meta_objset,
+ ds->ds_phys->ds_snapnames_zapobj, *offp);
+
+ if (zap_cursor_retrieve(&cursor, &attr) != 0) {
+ zap_cursor_fini(&cursor);
+ return (ENOENT);
+ }
+
+ if (strlen(attr.za_name) + 1 > namelen) {
+ zap_cursor_fini(&cursor);
+ return (ENAMETOOLONG);
+ }
+
+ (void) strcpy(name, attr.za_name);
+ if (idp)
+ *idp = attr.za_first_integer;
+ zap_cursor_advance(&cursor);
+ *offp = zap_cursor_serialize(&cursor);
+ zap_cursor_fini(&cursor);
+
+ return (0);
+}
+
+int
+dmu_dir_list_next(objset_t *os, int namelen, char *name,
+ uint64_t *idp, uint64_t *offp)
+{
+ dsl_dir_t *dd = os->os->os_dsl_dataset->ds_dir;
+ zap_cursor_t cursor;
+ zap_attribute_t attr;
+
+ /* there is no next dir on a snapshot! */
+ if (os->os->os_dsl_dataset->ds_object !=
+ dd->dd_phys->dd_head_dataset_obj)
+ return (ENOENT);
+
+ zap_cursor_init_serialized(&cursor,
+ dd->dd_pool->dp_meta_objset,
+ dd->dd_phys->dd_child_dir_zapobj, *offp);
+
+ if (zap_cursor_retrieve(&cursor, &attr) != 0) {
+ zap_cursor_fini(&cursor);
+ return (ENOENT);
+ }
+
+ if (strlen(attr.za_name) + 1 > namelen) {
+ zap_cursor_fini(&cursor);
+ return (ENAMETOOLONG);
+ }
+
+ (void) strcpy(name, attr.za_name);
+ if (idp)
+ *idp = attr.za_first_integer;
+ zap_cursor_advance(&cursor);
+ *offp = zap_cursor_serialize(&cursor);
+ zap_cursor_fini(&cursor);
+
+ return (0);
+}
+
+/*
+ * Find all objsets under name, and for each, call 'func(child_name, arg)'.
+ */
+int
+dmu_objset_find(char *name, int func(char *, void *), void *arg, int flags)
+{
+ dsl_dir_t *dd;
+ objset_t *os;
+ uint64_t snapobj;
+ zap_cursor_t zc;
+ zap_attribute_t *attr;
+ char *child;
+ int do_self, err;
+
+ err = dsl_dir_open(name, FTAG, &dd, NULL);
+ if (err)
+ return (err);
+
+ /* NB: the $MOS dir doesn't have a head dataset */
+ do_self = (dd->dd_phys->dd_head_dataset_obj != 0);
+ attr = kmem_alloc(sizeof (zap_attribute_t), KM_SLEEP);
+
+ /*
+ * Iterate over all children.
+ */
+ if (flags & DS_FIND_CHILDREN) {
+ for (zap_cursor_init(&zc, dd->dd_pool->dp_meta_objset,
+ dd->dd_phys->dd_child_dir_zapobj);
+ zap_cursor_retrieve(&zc, attr) == 0;
+ (void) zap_cursor_advance(&zc)) {
+ ASSERT(attr->za_integer_length == sizeof (uint64_t));
+ ASSERT(attr->za_num_integers == 1);
+
+ /*
+ * No separating '/' because parent's name ends in /.
+ */
+ child = kmem_alloc(MAXPATHLEN, KM_SLEEP);
+ /* XXX could probably just use name here */
+ dsl_dir_name(dd, child);
+ (void) strcat(child, "/");
+ (void) strcat(child, attr->za_name);
+ err = dmu_objset_find(child, func, arg, flags);
+ kmem_free(child, MAXPATHLEN);
+ if (err)
+ break;
+ }
+ zap_cursor_fini(&zc);
+
+ if (err) {
+ dsl_dir_close(dd, FTAG);
+ kmem_free(attr, sizeof (zap_attribute_t));
+ return (err);
+ }
+ }
+
+ /*
+ * Iterate over all snapshots.
+ */
+ if ((flags & DS_FIND_SNAPSHOTS) &&
+ dmu_objset_open(name, DMU_OST_ANY,
+ DS_MODE_STANDARD | DS_MODE_READONLY, &os) == 0) {
+
+ snapobj = os->os->os_dsl_dataset->ds_phys->ds_snapnames_zapobj;
+ dmu_objset_close(os);
+
+ for (zap_cursor_init(&zc, dd->dd_pool->dp_meta_objset, snapobj);
+ zap_cursor_retrieve(&zc, attr) == 0;
+ (void) zap_cursor_advance(&zc)) {
+ ASSERT(attr->za_integer_length == sizeof (uint64_t));
+ ASSERT(attr->za_num_integers == 1);
+
+ child = kmem_alloc(MAXPATHLEN, KM_SLEEP);
+ /* XXX could probably just use name here */
+ dsl_dir_name(dd, child);
+ (void) strcat(child, "@");
+ (void) strcat(child, attr->za_name);
+ err = func(child, arg);
+ kmem_free(child, MAXPATHLEN);
+ if (err)
+ break;
+ }
+ zap_cursor_fini(&zc);
+ }
+
+ dsl_dir_close(dd, FTAG);
+ kmem_free(attr, sizeof (zap_attribute_t));
+
+ if (err)
+ return (err);
+
+ /*
+ * Apply to self if appropriate.
+ */
+ if (do_self)
+ err = func(name, arg);
+ return (err);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c
new file mode 100644
index 0000000..3e55dc3
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_send.c
@@ -0,0 +1,1009 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/dmu_impl.h>
+#include <sys/dmu_tx.h>
+#include <sys/dbuf.h>
+#include <sys/dnode.h>
+#include <sys/zfs_context.h>
+#include <sys/dmu_objset.h>
+#include <sys/dmu_traverse.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_pool.h>
+#include <sys/dsl_synctask.h>
+#include <sys/zfs_ioctl.h>
+#include <sys/zap.h>
+#include <sys/zio_checksum.h>
+
+struct backuparg {
+ dmu_replay_record_t *drr;
+ kthread_t *td;
+ struct file *fp;
+ objset_t *os;
+ zio_cksum_t zc;
+ int err;
+};
+
+static int
+dump_bytes(struct backuparg *ba, void *buf, int len)
+{
+ struct uio auio;
+ struct iovec aiov;
+
+ ASSERT3U(len % 8, ==, 0);
+
+ fletcher_4_incremental_native(buf, len, &ba->zc);
+
+ aiov.iov_base = buf;
+ aiov.iov_len = len;
+ auio.uio_iov = &aiov;
+ auio.uio_iovcnt = 1;
+ auio.uio_resid = len;
+ auio.uio_segflg = UIO_SYSSPACE;
+ auio.uio_rw = UIO_WRITE;
+ auio.uio_offset = (off_t)-1;
+ auio.uio_td = ba->td;
+#ifdef _KERNEL
+ if (ba->fp->f_type == DTYPE_VNODE)
+ bwillwrite();
+ ba->err = fo_write(ba->fp, &auio, ba->td->td_ucred, 0, ba->td);
+#else
+ fprintf(stderr, "%s: returning EOPNOTSUPP\n", __func__);
+ ba->err = EOPNOTSUPP;
+#endif
+
+ return (ba->err);
+}
+
+static int
+dump_free(struct backuparg *ba, uint64_t object, uint64_t offset,
+ uint64_t length)
+{
+ /* write a FREE record */
+ bzero(ba->drr, sizeof (dmu_replay_record_t));
+ ba->drr->drr_type = DRR_FREE;
+ ba->drr->drr_u.drr_free.drr_object = object;
+ ba->drr->drr_u.drr_free.drr_offset = offset;
+ ba->drr->drr_u.drr_free.drr_length = length;
+
+ if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)))
+ return (EINTR);
+ return (0);
+}
+
+static int
+dump_data(struct backuparg *ba, dmu_object_type_t type,
+ uint64_t object, uint64_t offset, int blksz, void *data)
+{
+ /* write a DATA record */
+ bzero(ba->drr, sizeof (dmu_replay_record_t));
+ ba->drr->drr_type = DRR_WRITE;
+ ba->drr->drr_u.drr_write.drr_object = object;
+ ba->drr->drr_u.drr_write.drr_type = type;
+ ba->drr->drr_u.drr_write.drr_offset = offset;
+ ba->drr->drr_u.drr_write.drr_length = blksz;
+
+ if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)))
+ return (EINTR);
+ if (dump_bytes(ba, data, blksz))
+ return (EINTR);
+ return (0);
+}
+
+static int
+dump_freeobjects(struct backuparg *ba, uint64_t firstobj, uint64_t numobjs)
+{
+ /* write a FREEOBJECTS record */
+ bzero(ba->drr, sizeof (dmu_replay_record_t));
+ ba->drr->drr_type = DRR_FREEOBJECTS;
+ ba->drr->drr_u.drr_freeobjects.drr_firstobj = firstobj;
+ ba->drr->drr_u.drr_freeobjects.drr_numobjs = numobjs;
+
+ if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)))
+ return (EINTR);
+ return (0);
+}
+
+static int
+dump_dnode(struct backuparg *ba, uint64_t object, dnode_phys_t *dnp)
+{
+ if (dnp == NULL || dnp->dn_type == DMU_OT_NONE)
+ return (dump_freeobjects(ba, object, 1));
+
+ /* write an OBJECT record */
+ bzero(ba->drr, sizeof (dmu_replay_record_t));
+ ba->drr->drr_type = DRR_OBJECT;
+ ba->drr->drr_u.drr_object.drr_object = object;
+ ba->drr->drr_u.drr_object.drr_type = dnp->dn_type;
+ ba->drr->drr_u.drr_object.drr_bonustype = dnp->dn_bonustype;
+ ba->drr->drr_u.drr_object.drr_blksz =
+ dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT;
+ ba->drr->drr_u.drr_object.drr_bonuslen = dnp->dn_bonuslen;
+ ba->drr->drr_u.drr_object.drr_checksum = dnp->dn_checksum;
+ ba->drr->drr_u.drr_object.drr_compress = dnp->dn_compress;
+
+ if (dump_bytes(ba, ba->drr, sizeof (dmu_replay_record_t)))
+ return (EINTR);
+
+ if (dump_bytes(ba, DN_BONUS(dnp), P2ROUNDUP(dnp->dn_bonuslen, 8)))
+ return (EINTR);
+
+ /* free anything past the end of the file */
+ if (dump_free(ba, object, (dnp->dn_maxblkid + 1) *
+ (dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT), -1ULL))
+ return (EINTR);
+ if (ba->err)
+ return (EINTR);
+ return (0);
+}
+
+#define BP_SPAN(dnp, level) \
+ (((uint64_t)dnp->dn_datablkszsec) << (SPA_MINBLOCKSHIFT + \
+ (level) * (dnp->dn_indblkshift - SPA_BLKPTRSHIFT)))
+
+static int
+backup_cb(traverse_blk_cache_t *bc, spa_t *spa, void *arg)
+{
+ struct backuparg *ba = arg;
+ uint64_t object = bc->bc_bookmark.zb_object;
+ int level = bc->bc_bookmark.zb_level;
+ uint64_t blkid = bc->bc_bookmark.zb_blkid;
+ blkptr_t *bp = bc->bc_blkptr.blk_birth ? &bc->bc_blkptr : NULL;
+ dmu_object_type_t type = bp ? BP_GET_TYPE(bp) : DMU_OT_NONE;
+ void *data = bc->bc_data;
+ int err = 0;
+
+ if (SIGPENDING(curthread))
+ return (EINTR);
+
+ ASSERT(data || bp == NULL);
+
+ if (bp == NULL && object == 0) {
+ uint64_t span = BP_SPAN(bc->bc_dnode, level);
+ uint64_t dnobj = (blkid * span) >> DNODE_SHIFT;
+ err = dump_freeobjects(ba, dnobj, span >> DNODE_SHIFT);
+ } else if (bp == NULL) {
+ uint64_t span = BP_SPAN(bc->bc_dnode, level);
+ err = dump_free(ba, object, blkid * span, span);
+ } else if (data && level == 0 && type == DMU_OT_DNODE) {
+ dnode_phys_t *blk = data;
+ int i;
+ int blksz = BP_GET_LSIZE(bp);
+
+ for (i = 0; i < blksz >> DNODE_SHIFT; i++) {
+ uint64_t dnobj =
+ (blkid << (DNODE_BLOCK_SHIFT - DNODE_SHIFT)) + i;
+ err = dump_dnode(ba, dnobj, blk+i);
+ if (err)
+ break;
+ }
+ } else if (level == 0 &&
+ type != DMU_OT_DNODE && type != DMU_OT_OBJSET) {
+ int blksz = BP_GET_LSIZE(bp);
+ if (data == NULL) {
+ uint32_t aflags = ARC_WAIT;
+ arc_buf_t *abuf;
+ zbookmark_t zb;
+
+ zb.zb_objset = ba->os->os->os_dsl_dataset->ds_object;
+ zb.zb_object = object;
+ zb.zb_level = level;
+ zb.zb_blkid = blkid;
+ (void) arc_read(NULL, spa, bp,
+ dmu_ot[type].ot_byteswap, arc_getbuf_func, &abuf,
+ ZIO_PRIORITY_ASYNC_READ, ZIO_FLAG_MUSTSUCCEED,
+ &aflags, &zb);
+
+ if (abuf) {
+ err = dump_data(ba, type, object, blkid * blksz,
+ blksz, abuf->b_data);
+ (void) arc_buf_remove_ref(abuf, &abuf);
+ }
+ } else {
+ err = dump_data(ba, type, object, blkid * blksz,
+ blksz, data);
+ }
+ }
+
+ ASSERT(err == 0 || err == EINTR);
+ return (err);
+}
+
+int
+dmu_sendbackup(objset_t *tosnap, objset_t *fromsnap, struct file *fp)
+{
+ dsl_dataset_t *ds = tosnap->os->os_dsl_dataset;
+ dsl_dataset_t *fromds = fromsnap ? fromsnap->os->os_dsl_dataset : NULL;
+ dmu_replay_record_t *drr;
+ struct backuparg ba;
+ int err;
+
+ /* tosnap must be a snapshot */
+ if (ds->ds_phys->ds_next_snap_obj == 0)
+ return (EINVAL);
+
+ /* fromsnap must be an earlier snapshot from the same fs as tosnap */
+ if (fromds && (ds->ds_dir != fromds->ds_dir ||
+ fromds->ds_phys->ds_creation_txg >=
+ ds->ds_phys->ds_creation_txg))
+ return (EXDEV);
+
+ drr = kmem_zalloc(sizeof (dmu_replay_record_t), KM_SLEEP);
+ drr->drr_type = DRR_BEGIN;
+ drr->drr_u.drr_begin.drr_magic = DMU_BACKUP_MAGIC;
+ drr->drr_u.drr_begin.drr_version = DMU_BACKUP_VERSION;
+ drr->drr_u.drr_begin.drr_creation_time =
+ ds->ds_phys->ds_creation_time;
+ drr->drr_u.drr_begin.drr_type = tosnap->os->os_phys->os_type;
+ drr->drr_u.drr_begin.drr_toguid = ds->ds_phys->ds_guid;
+ if (fromds)
+ drr->drr_u.drr_begin.drr_fromguid = fromds->ds_phys->ds_guid;
+ dsl_dataset_name(ds, drr->drr_u.drr_begin.drr_toname);
+
+ ba.drr = drr;
+ ba.td = curthread;
+ ba.fp = fp;
+ ba.os = tosnap;
+ ZIO_SET_CHECKSUM(&ba.zc, 0, 0, 0, 0);
+
+ if (dump_bytes(&ba, drr, sizeof (dmu_replay_record_t))) {
+ kmem_free(drr, sizeof (dmu_replay_record_t));
+ return (ba.err);
+ }
+
+ err = traverse_dsl_dataset(ds,
+ fromds ? fromds->ds_phys->ds_creation_txg : 0,
+ ADVANCE_PRE | ADVANCE_HOLES | ADVANCE_DATA | ADVANCE_NOLOCK,
+ backup_cb, &ba);
+
+ if (err) {
+ if (err == EINTR && ba.err)
+ err = ba.err;
+ kmem_free(drr, sizeof (dmu_replay_record_t));
+ return (err);
+ }
+
+ bzero(drr, sizeof (dmu_replay_record_t));
+ drr->drr_type = DRR_END;
+ drr->drr_u.drr_end.drr_checksum = ba.zc;
+
+ if (dump_bytes(&ba, drr, sizeof (dmu_replay_record_t))) {
+ kmem_free(drr, sizeof (dmu_replay_record_t));
+ return (ba.err);
+ }
+
+ kmem_free(drr, sizeof (dmu_replay_record_t));
+
+ return (0);
+}
+
+struct restorearg {
+ int err;
+ int byteswap;
+ kthread_t *td;
+ struct file *fp;
+ char *buf;
+ uint64_t voff;
+ int buflen; /* number of valid bytes in buf */
+ int bufoff; /* next offset to read */
+ int bufsize; /* amount of memory allocated for buf */
+ zio_cksum_t zc;
+};
+
+/* ARGSUSED */
+static int
+replay_incremental_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *ds = arg1;
+ struct drr_begin *drrb = arg2;
+ const char *snapname;
+ int err;
+ uint64_t val;
+
+ /* must already be a snapshot of this fs */
+ if (ds->ds_phys->ds_prev_snap_obj == 0)
+ return (ENODEV);
+
+ /* most recent snapshot must match fromguid */
+ if (ds->ds_prev->ds_phys->ds_guid != drrb->drr_fromguid)
+ return (ENODEV);
+ /* must not have any changes since most recent snapshot */
+ if (ds->ds_phys->ds_bp.blk_birth >
+ ds->ds_prev->ds_phys->ds_creation_txg)
+ return (ETXTBSY);
+
+ /* new snapshot name must not exist */
+ snapname = strrchr(drrb->drr_toname, '@');
+ if (snapname == NULL)
+ return (EEXIST);
+
+ snapname++;
+ err = zap_lookup(ds->ds_dir->dd_pool->dp_meta_objset,
+ ds->ds_phys->ds_snapnames_zapobj, snapname, 8, 1, &val);
+ if (err == 0)
+ return (EEXIST);
+ if (err != ENOENT)
+ return (err);
+
+ return (0);
+}
+
+/* ARGSUSED */
+static void
+replay_incremental_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *ds = arg1;
+ dmu_buf_will_dirty(ds->ds_dbuf, tx);
+ ds->ds_phys->ds_flags |= DS_FLAG_INCONSISTENT;
+}
+
+/* ARGSUSED */
+static int
+replay_full_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ struct drr_begin *drrb = arg2;
+ objset_t *mos = dd->dd_pool->dp_meta_objset;
+ char *cp;
+ uint64_t val;
+ int err;
+
+ cp = strchr(drrb->drr_toname, '@');
+ *cp = '\0';
+ err = zap_lookup(mos, dd->dd_phys->dd_child_dir_zapobj,
+ strrchr(drrb->drr_toname, '/') + 1,
+ sizeof (uint64_t), 1, &val);
+ *cp = '@';
+
+ if (err != ENOENT)
+ return (err ? err : EEXIST);
+
+ return (0);
+}
+
+static void
+replay_full_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ struct drr_begin *drrb = arg2;
+ char *cp;
+ dsl_dataset_t *ds;
+ uint64_t dsobj;
+
+ cp = strchr(drrb->drr_toname, '@');
+ *cp = '\0';
+ dsobj = dsl_dataset_create_sync(dd, strrchr(drrb->drr_toname, '/') + 1,
+ NULL, tx);
+ *cp = '@';
+
+ VERIFY(0 == dsl_dataset_open_obj(dd->dd_pool, dsobj, NULL,
+ DS_MODE_EXCLUSIVE, FTAG, &ds));
+
+ (void) dmu_objset_create_impl(dsl_dataset_get_spa(ds),
+ ds, &ds->ds_phys->ds_bp, drrb->drr_type, tx);
+
+ dmu_buf_will_dirty(ds->ds_dbuf, tx);
+ ds->ds_phys->ds_flags |= DS_FLAG_INCONSISTENT;
+
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+}
+
+static int
+replay_end_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ objset_t *os = arg1;
+ struct drr_begin *drrb = arg2;
+ char *snapname;
+
+ /* XXX verify that drr_toname is in dd */
+
+ snapname = strchr(drrb->drr_toname, '@');
+ if (snapname == NULL)
+ return (EINVAL);
+ snapname++;
+
+ return (dsl_dataset_snapshot_check(os, snapname, tx));
+}
+
+static void
+replay_end_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ objset_t *os = arg1;
+ struct drr_begin *drrb = arg2;
+ char *snapname;
+ dsl_dataset_t *ds, *hds;
+
+ snapname = strchr(drrb->drr_toname, '@') + 1;
+
+ dsl_dataset_snapshot_sync(os, snapname, tx);
+
+ /* set snapshot's creation time and guid */
+ hds = os->os->os_dsl_dataset;
+ VERIFY(0 == dsl_dataset_open_obj(hds->ds_dir->dd_pool,
+ hds->ds_phys->ds_prev_snap_obj, NULL,
+ DS_MODE_PRIMARY | DS_MODE_READONLY | DS_MODE_INCONSISTENT,
+ FTAG, &ds));
+
+ dmu_buf_will_dirty(ds->ds_dbuf, tx);
+ ds->ds_phys->ds_creation_time = drrb->drr_creation_time;
+ ds->ds_phys->ds_guid = drrb->drr_toguid;
+ ds->ds_phys->ds_flags &= ~DS_FLAG_INCONSISTENT;
+
+ dsl_dataset_close(ds, DS_MODE_PRIMARY, FTAG);
+
+ dmu_buf_will_dirty(hds->ds_dbuf, tx);
+ hds->ds_phys->ds_flags &= ~DS_FLAG_INCONSISTENT;
+}
+
+static int
+restore_bytes(struct restorearg *ra, void *buf, int len, off_t off, int *resid)
+{
+ struct uio auio;
+ struct iovec aiov;
+ int error;
+
+ aiov.iov_base = buf;
+ aiov.iov_len = len;
+ auio.uio_iov = &aiov;
+ auio.uio_iovcnt = 1;
+ auio.uio_resid = len;
+ auio.uio_segflg = UIO_SYSSPACE;
+ auio.uio_rw = UIO_READ;
+ auio.uio_offset = off;
+ auio.uio_td = ra->td;
+#ifdef _KERNEL
+ error = fo_read(ra->fp, &auio, ra->td->td_ucred, FOF_OFFSET, ra->td);
+#else
+ fprintf(stderr, "%s: returning EOPNOTSUPP\n", __func__);
+ error = EOPNOTSUPP;
+#endif
+ *resid = auio.uio_resid;
+ return (error);
+}
+
+static void *
+restore_read(struct restorearg *ra, int len)
+{
+ void *rv;
+
+ /* some things will require 8-byte alignment, so everything must */
+ ASSERT3U(len % 8, ==, 0);
+
+ while (ra->buflen - ra->bufoff < len) {
+ int resid;
+ int leftover = ra->buflen - ra->bufoff;
+
+ (void) memmove(ra->buf, ra->buf + ra->bufoff, leftover);
+
+ ra->err = restore_bytes(ra, (caddr_t)ra->buf + leftover,
+ ra->bufsize - leftover, ra->voff, &resid);
+
+ ra->voff += ra->bufsize - leftover - resid;
+ ra->buflen = ra->bufsize - resid;
+ ra->bufoff = 0;
+ if (resid == ra->bufsize - leftover)
+ ra->err = EINVAL;
+ if (ra->err)
+ return (NULL);
+ /* Could compute checksum here? */
+ }
+
+ ASSERT3U(ra->bufoff % 8, ==, 0);
+ ASSERT3U(ra->buflen - ra->bufoff, >=, len);
+ rv = ra->buf + ra->bufoff;
+ ra->bufoff += len;
+ if (ra->byteswap)
+ fletcher_4_incremental_byteswap(rv, len, &ra->zc);
+ else
+ fletcher_4_incremental_native(rv, len, &ra->zc);
+ return (rv);
+}
+
+static void
+backup_byteswap(dmu_replay_record_t *drr)
+{
+#define DO64(X) (drr->drr_u.X = BSWAP_64(drr->drr_u.X))
+#define DO32(X) (drr->drr_u.X = BSWAP_32(drr->drr_u.X))
+ drr->drr_type = BSWAP_32(drr->drr_type);
+ switch (drr->drr_type) {
+ case DRR_BEGIN:
+ DO64(drr_begin.drr_magic);
+ DO64(drr_begin.drr_version);
+ DO64(drr_begin.drr_creation_time);
+ DO32(drr_begin.drr_type);
+ DO64(drr_begin.drr_toguid);
+ DO64(drr_begin.drr_fromguid);
+ break;
+ case DRR_OBJECT:
+ DO64(drr_object.drr_object);
+ /* DO64(drr_object.drr_allocation_txg); */
+ DO32(drr_object.drr_type);
+ DO32(drr_object.drr_bonustype);
+ DO32(drr_object.drr_blksz);
+ DO32(drr_object.drr_bonuslen);
+ break;
+ case DRR_FREEOBJECTS:
+ DO64(drr_freeobjects.drr_firstobj);
+ DO64(drr_freeobjects.drr_numobjs);
+ break;
+ case DRR_WRITE:
+ DO64(drr_write.drr_object);
+ DO32(drr_write.drr_type);
+ DO64(drr_write.drr_offset);
+ DO64(drr_write.drr_length);
+ break;
+ case DRR_FREE:
+ DO64(drr_free.drr_object);
+ DO64(drr_free.drr_offset);
+ DO64(drr_free.drr_length);
+ break;
+ case DRR_END:
+ DO64(drr_end.drr_checksum.zc_word[0]);
+ DO64(drr_end.drr_checksum.zc_word[1]);
+ DO64(drr_end.drr_checksum.zc_word[2]);
+ DO64(drr_end.drr_checksum.zc_word[3]);
+ break;
+ }
+#undef DO64
+#undef DO32
+}
+
+static int
+restore_object(struct restorearg *ra, objset_t *os, struct drr_object *drro)
+{
+ int err;
+ dmu_tx_t *tx;
+
+ err = dmu_object_info(os, drro->drr_object, NULL);
+
+ if (err != 0 && err != ENOENT)
+ return (EINVAL);
+
+ if (drro->drr_type == DMU_OT_NONE ||
+ drro->drr_type >= DMU_OT_NUMTYPES ||
+ drro->drr_bonustype >= DMU_OT_NUMTYPES ||
+ drro->drr_checksum >= ZIO_CHECKSUM_FUNCTIONS ||
+ drro->drr_compress >= ZIO_COMPRESS_FUNCTIONS ||
+ P2PHASE(drro->drr_blksz, SPA_MINBLOCKSIZE) ||
+ drro->drr_blksz < SPA_MINBLOCKSIZE ||
+ drro->drr_blksz > SPA_MAXBLOCKSIZE ||
+ drro->drr_bonuslen > DN_MAX_BONUSLEN) {
+ return (EINVAL);
+ }
+
+ tx = dmu_tx_create(os);
+
+ if (err == ENOENT) {
+ /* currently free, want to be allocated */
+ dmu_tx_hold_bonus(tx, DMU_NEW_OBJECT);
+ dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0, 1);
+ err = dmu_tx_assign(tx, TXG_WAIT);
+ if (err) {
+ dmu_tx_abort(tx);
+ return (err);
+ }
+ err = dmu_object_claim(os, drro->drr_object,
+ drro->drr_type, drro->drr_blksz,
+ drro->drr_bonustype, drro->drr_bonuslen, tx);
+ } else {
+ /* currently allocated, want to be allocated */
+ dmu_tx_hold_bonus(tx, drro->drr_object);
+ /*
+ * We may change blocksize, so need to
+ * hold_write
+ */
+ dmu_tx_hold_write(tx, drro->drr_object, 0, 1);
+ err = dmu_tx_assign(tx, TXG_WAIT);
+ if (err) {
+ dmu_tx_abort(tx);
+ return (err);
+ }
+
+ err = dmu_object_reclaim(os, drro->drr_object,
+ drro->drr_type, drro->drr_blksz,
+ drro->drr_bonustype, drro->drr_bonuslen, tx);
+ }
+ if (err) {
+ dmu_tx_commit(tx);
+ return (EINVAL);
+ }
+
+ dmu_object_set_checksum(os, drro->drr_object, drro->drr_checksum, tx);
+ dmu_object_set_compress(os, drro->drr_object, drro->drr_compress, tx);
+
+ if (drro->drr_bonuslen) {
+ dmu_buf_t *db;
+ void *data;
+ VERIFY(0 == dmu_bonus_hold(os, drro->drr_object, FTAG, &db));
+ dmu_buf_will_dirty(db, tx);
+
+ ASSERT3U(db->db_size, ==, drro->drr_bonuslen);
+ data = restore_read(ra, P2ROUNDUP(db->db_size, 8));
+ if (data == NULL) {
+ dmu_tx_commit(tx);
+ return (ra->err);
+ }
+ bcopy(data, db->db_data, db->db_size);
+ if (ra->byteswap) {
+ dmu_ot[drro->drr_bonustype].ot_byteswap(db->db_data,
+ drro->drr_bonuslen);
+ }
+ dmu_buf_rele(db, FTAG);
+ }
+ dmu_tx_commit(tx);
+ return (0);
+}
+
+/* ARGSUSED */
+static int
+restore_freeobjects(struct restorearg *ra, objset_t *os,
+ struct drr_freeobjects *drrfo)
+{
+ uint64_t obj;
+
+ if (drrfo->drr_firstobj + drrfo->drr_numobjs < drrfo->drr_firstobj)
+ return (EINVAL);
+
+ for (obj = drrfo->drr_firstobj;
+ obj < drrfo->drr_firstobj + drrfo->drr_numobjs;
+ (void) dmu_object_next(os, &obj, FALSE, 0)) {
+ dmu_tx_t *tx;
+ int err;
+
+ if (dmu_object_info(os, obj, NULL) != 0)
+ continue;
+
+ tx = dmu_tx_create(os);
+ dmu_tx_hold_bonus(tx, obj);
+ err = dmu_tx_assign(tx, TXG_WAIT);
+ if (err) {
+ dmu_tx_abort(tx);
+ return (err);
+ }
+ err = dmu_object_free(os, obj, tx);
+ dmu_tx_commit(tx);
+ if (err && err != ENOENT)
+ return (EINVAL);
+ }
+ return (0);
+}
+
+static int
+restore_write(struct restorearg *ra, objset_t *os,
+ struct drr_write *drrw)
+{
+ dmu_tx_t *tx;
+ void *data;
+ int err;
+
+ if (drrw->drr_offset + drrw->drr_length < drrw->drr_offset ||
+ drrw->drr_type >= DMU_OT_NUMTYPES)
+ return (EINVAL);
+
+ data = restore_read(ra, drrw->drr_length);
+ if (data == NULL)
+ return (ra->err);
+
+ if (dmu_object_info(os, drrw->drr_object, NULL) != 0)
+ return (EINVAL);
+
+ tx = dmu_tx_create(os);
+
+ dmu_tx_hold_write(tx, drrw->drr_object,
+ drrw->drr_offset, drrw->drr_length);
+ err = dmu_tx_assign(tx, TXG_WAIT);
+ if (err) {
+ dmu_tx_abort(tx);
+ return (err);
+ }
+ if (ra->byteswap)
+ dmu_ot[drrw->drr_type].ot_byteswap(data, drrw->drr_length);
+ dmu_write(os, drrw->drr_object,
+ drrw->drr_offset, drrw->drr_length, data, tx);
+ dmu_tx_commit(tx);
+ return (0);
+}
+
+/* ARGSUSED */
+static int
+restore_free(struct restorearg *ra, objset_t *os,
+ struct drr_free *drrf)
+{
+ dmu_tx_t *tx;
+ int err;
+
+ if (drrf->drr_length != -1ULL &&
+ drrf->drr_offset + drrf->drr_length < drrf->drr_offset)
+ return (EINVAL);
+
+ if (dmu_object_info(os, drrf->drr_object, NULL) != 0)
+ return (EINVAL);
+
+ tx = dmu_tx_create(os);
+
+ dmu_tx_hold_free(tx, drrf->drr_object,
+ drrf->drr_offset, drrf->drr_length);
+ err = dmu_tx_assign(tx, TXG_WAIT);
+ if (err) {
+ dmu_tx_abort(tx);
+ return (err);
+ }
+ err = dmu_free_range(os, drrf->drr_object,
+ drrf->drr_offset, drrf->drr_length, tx);
+ dmu_tx_commit(tx);
+ return (err);
+}
+
+int
+dmu_recvbackup(char *tosnap, struct drr_begin *drrb, uint64_t *sizep,
+ boolean_t force, struct file *fp, uint64_t voffset)
+{
+ kthread_t *td = curthread;
+ struct restorearg ra;
+ dmu_replay_record_t *drr;
+ char *cp;
+ objset_t *os = NULL;
+ zio_cksum_t pzc;
+
+ bzero(&ra, sizeof (ra));
+ ra.td = td;
+ ra.fp = fp;
+ ra.voff = voffset;
+ ra.bufsize = 1<<20;
+ ra.buf = kmem_alloc(ra.bufsize, KM_SLEEP);
+
+ if (drrb->drr_magic == DMU_BACKUP_MAGIC) {
+ ra.byteswap = FALSE;
+ } else if (drrb->drr_magic == BSWAP_64(DMU_BACKUP_MAGIC)) {
+ ra.byteswap = TRUE;
+ } else {
+ ra.err = EINVAL;
+ goto out;
+ }
+
+ /*
+ * NB: this assumes that struct drr_begin will be the largest in
+ * dmu_replay_record_t's drr_u, and thus we don't need to pad it
+ * with zeros to make it the same length as we wrote out.
+ */
+ ((dmu_replay_record_t *)ra.buf)->drr_type = DRR_BEGIN;
+ ((dmu_replay_record_t *)ra.buf)->drr_pad = 0;
+ ((dmu_replay_record_t *)ra.buf)->drr_u.drr_begin = *drrb;
+ if (ra.byteswap) {
+ fletcher_4_incremental_byteswap(ra.buf,
+ sizeof (dmu_replay_record_t), &ra.zc);
+ } else {
+ fletcher_4_incremental_native(ra.buf,
+ sizeof (dmu_replay_record_t), &ra.zc);
+ }
+ (void) strcpy(drrb->drr_toname, tosnap); /* for the sync funcs */
+
+ if (ra.byteswap) {
+ drrb->drr_magic = BSWAP_64(drrb->drr_magic);
+ drrb->drr_version = BSWAP_64(drrb->drr_version);
+ drrb->drr_creation_time = BSWAP_64(drrb->drr_creation_time);
+ drrb->drr_type = BSWAP_32(drrb->drr_type);
+ drrb->drr_toguid = BSWAP_64(drrb->drr_toguid);
+ drrb->drr_fromguid = BSWAP_64(drrb->drr_fromguid);
+ }
+
+ ASSERT3U(drrb->drr_magic, ==, DMU_BACKUP_MAGIC);
+
+ if (drrb->drr_version != DMU_BACKUP_VERSION ||
+ drrb->drr_type >= DMU_OST_NUMTYPES ||
+ strchr(drrb->drr_toname, '@') == NULL) {
+ ra.err = EINVAL;
+ goto out;
+ }
+
+ /*
+ * Process the begin in syncing context.
+ */
+ if (drrb->drr_fromguid) {
+ /* incremental backup */
+ dsl_dataset_t *ds = NULL;
+
+ cp = strchr(tosnap, '@');
+ *cp = '\0';
+ ra.err = dsl_dataset_open(tosnap, DS_MODE_EXCLUSIVE, FTAG, &ds);
+ *cp = '@';
+ if (ra.err)
+ goto out;
+
+ /*
+ * Only do the rollback if the most recent snapshot
+ * matches the incremental source
+ */
+ if (force) {
+ if (ds->ds_prev == NULL ||
+ ds->ds_prev->ds_phys->ds_guid !=
+ drrb->drr_fromguid) {
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+ kmem_free(ra.buf, ra.bufsize);
+ return (ENODEV);
+ }
+ (void) dsl_dataset_rollback(ds);
+ }
+ ra.err = dsl_sync_task_do(ds->ds_dir->dd_pool,
+ replay_incremental_check, replay_incremental_sync,
+ ds, drrb, 1);
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+ } else {
+ /* full backup */
+ dsl_dir_t *dd = NULL;
+ const char *tail;
+
+ /* can't restore full backup into topmost fs, for now */
+ if (strrchr(drrb->drr_toname, '/') == NULL) {
+ ra.err = EINVAL;
+ goto out;
+ }
+
+ cp = strchr(tosnap, '@');
+ *cp = '\0';
+ ra.err = dsl_dir_open(tosnap, FTAG, &dd, &tail);
+ *cp = '@';
+ if (ra.err)
+ goto out;
+ if (tail == NULL) {
+ ra.err = EEXIST;
+ goto out;
+ }
+
+ ra.err = dsl_sync_task_do(dd->dd_pool, replay_full_check,
+ replay_full_sync, dd, drrb, 5);
+ dsl_dir_close(dd, FTAG);
+ }
+ if (ra.err)
+ goto out;
+
+ /*
+ * Open the objset we are modifying.
+ */
+
+ cp = strchr(tosnap, '@');
+ *cp = '\0';
+ ra.err = dmu_objset_open(tosnap, DMU_OST_ANY,
+ DS_MODE_PRIMARY | DS_MODE_INCONSISTENT, &os);
+ *cp = '@';
+ ASSERT3U(ra.err, ==, 0);
+
+ /*
+ * Read records and process them.
+ */
+ pzc = ra.zc;
+ while (ra.err == 0 &&
+ NULL != (drr = restore_read(&ra, sizeof (*drr)))) {
+ if (SIGPENDING(td)) {
+ ra.err = EINTR;
+ goto out;
+ }
+
+ if (ra.byteswap)
+ backup_byteswap(drr);
+
+ switch (drr->drr_type) {
+ case DRR_OBJECT:
+ {
+ /*
+ * We need to make a copy of the record header,
+ * because restore_{object,write} may need to
+ * restore_read(), which will invalidate drr.
+ */
+ struct drr_object drro = drr->drr_u.drr_object;
+ ra.err = restore_object(&ra, os, &drro);
+ break;
+ }
+ case DRR_FREEOBJECTS:
+ {
+ struct drr_freeobjects drrfo =
+ drr->drr_u.drr_freeobjects;
+ ra.err = restore_freeobjects(&ra, os, &drrfo);
+ break;
+ }
+ case DRR_WRITE:
+ {
+ struct drr_write drrw = drr->drr_u.drr_write;
+ ra.err = restore_write(&ra, os, &drrw);
+ break;
+ }
+ case DRR_FREE:
+ {
+ struct drr_free drrf = drr->drr_u.drr_free;
+ ra.err = restore_free(&ra, os, &drrf);
+ break;
+ }
+ case DRR_END:
+ {
+ struct drr_end drre = drr->drr_u.drr_end;
+ /*
+ * We compare against the *previous* checksum
+ * value, because the stored checksum is of
+ * everything before the DRR_END record.
+ */
+ if (drre.drr_checksum.zc_word[0] != 0 &&
+ !ZIO_CHECKSUM_EQUAL(drre.drr_checksum, pzc)) {
+ ra.err = ECKSUM;
+ goto out;
+ }
+
+ ra.err = dsl_sync_task_do(dmu_objset_ds(os)->
+ ds_dir->dd_pool, replay_end_check, replay_end_sync,
+ os, drrb, 3);
+ goto out;
+ }
+ default:
+ ra.err = EINVAL;
+ goto out;
+ }
+ pzc = ra.zc;
+ }
+
+out:
+ if (os)
+ dmu_objset_close(os);
+
+ /*
+ * Make sure we don't rollback/destroy unless we actually
+ * processed the begin properly. 'os' will only be set if this
+ * is the case.
+ */
+ if (ra.err && os && tosnap && strchr(tosnap, '@')) {
+ /*
+ * rollback or destroy what we created, so we don't
+ * leave it in the restoring state.
+ */
+ dsl_dataset_t *ds;
+ int err;
+
+ cp = strchr(tosnap, '@');
+ *cp = '\0';
+ err = dsl_dataset_open(tosnap,
+ DS_MODE_EXCLUSIVE | DS_MODE_INCONSISTENT,
+ FTAG, &ds);
+ if (err == 0) {
+ txg_wait_synced(ds->ds_dir->dd_pool, 0);
+ if (drrb->drr_fromguid) {
+ /* incremental: rollback to most recent snap */
+ (void) dsl_dataset_rollback(ds);
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+ } else {
+ /* full: destroy whole fs */
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+ (void) dsl_dataset_destroy(tosnap);
+ }
+ }
+ *cp = '@';
+ }
+
+ kmem_free(ra.buf, ra.bufsize);
+ if (sizep)
+ *sizep = ra.voff;
+ return (ra.err);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
new file mode 100644
index 0000000..3d2bc3e
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_traverse.c
@@ -0,0 +1,888 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/dmu_objset.h>
+#include <sys/dmu_traverse.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_pool.h>
+#include <sys/dnode.h>
+#include <sys/spa.h>
+#include <sys/zio.h>
+#include <sys/dmu_impl.h>
+
+#define BP_SPAN_SHIFT(level, width) ((level) * (width))
+
+#define BP_EQUAL(b1, b2) \
+ (DVA_EQUAL(BP_IDENTITY(b1), BP_IDENTITY(b2)) && \
+ (b1)->blk_birth == (b2)->blk_birth)
+
+/*
+ * Compare two bookmarks.
+ *
+ * For ADVANCE_PRE, the visitation order is:
+ *
+ * objset 0, 1, 2, ..., ZB_MAXOBJSET.
+ * object 0, 1, 2, ..., ZB_MAXOBJECT.
+ * blkoff 0, 1, 2, ...
+ * level ZB_MAXLEVEL, ..., 2, 1, 0.
+ *
+ * where blkoff = blkid << BP_SPAN_SHIFT(level, width), and thus a valid
+ * ordering vector is:
+ *
+ * < objset, object, blkoff, -level >
+ *
+ * For ADVANCE_POST, the starting offsets aren't sequential but ending
+ * offsets [blkoff = (blkid + 1) << BP_SPAN_SHIFT(level, width)] are.
+ * The visitation order is:
+ *
+ * objset 1, 2, ..., ZB_MAXOBJSET, 0.
+ * object 1, 2, ..., ZB_MAXOBJECT, 0.
+ * blkoff 1, 2, ...
+ * level 0, 1, 2, ..., ZB_MAXLEVEL.
+ *
+ * and thus a valid ordering vector is:
+ *
+ * < objset - 1, object - 1, blkoff, level >
+ *
+ * Both orderings can be expressed as:
+ *
+ * < objset + bias, object + bias, blkoff, level ^ bias >
+ *
+ * where 'bias' is either 0 or -1 (for ADVANCE_PRE or ADVANCE_POST)
+ * and 'blkoff' is (blkid - bias) << BP_SPAN_SHIFT(level, wshift).
+ *
+ * Special case: an objset's osphys is represented as level -1 of object 0.
+ * It is always either the very first or very last block we visit in an objset.
+ * Therefore, if either bookmark's level is -1, level alone determines order.
+ */
+static int
+compare_bookmark(zbookmark_t *szb, zbookmark_t *ezb, dnode_phys_t *dnp,
+ int advance)
+{
+ int bias = (advance & ADVANCE_PRE) ? 0 : -1;
+ uint64_t sblkoff, eblkoff;
+ int slevel, elevel, wshift;
+
+ if (szb->zb_objset + bias < ezb->zb_objset + bias)
+ return (-1);
+
+ if (szb->zb_objset + bias > ezb->zb_objset + bias)
+ return (1);
+
+ slevel = szb->zb_level;
+ elevel = ezb->zb_level;
+
+ if ((slevel | elevel) < 0)
+ return ((slevel ^ bias) - (elevel ^ bias));
+
+ if (szb->zb_object + bias < ezb->zb_object + bias)
+ return (-1);
+
+ if (szb->zb_object + bias > ezb->zb_object + bias)
+ return (1);
+
+ if (dnp == NULL)
+ return (0);
+
+ wshift = dnp->dn_indblkshift - SPA_BLKPTRSHIFT;
+
+ sblkoff = (szb->zb_blkid - bias) << BP_SPAN_SHIFT(slevel, wshift);
+ eblkoff = (ezb->zb_blkid - bias) << BP_SPAN_SHIFT(elevel, wshift);
+
+ if (sblkoff < eblkoff)
+ return (-1);
+
+ if (sblkoff > eblkoff)
+ return (1);
+
+ return ((elevel ^ bias) - (slevel ^ bias));
+}
+
+#define SET_BOOKMARK(zb, objset, object, level, blkid) \
+{ \
+ (zb)->zb_objset = objset; \
+ (zb)->zb_object = object; \
+ (zb)->zb_level = level; \
+ (zb)->zb_blkid = blkid; \
+}
+
+#define SET_BOOKMARK_LB(zb, level, blkid) \
+{ \
+ (zb)->zb_level = level; \
+ (zb)->zb_blkid = blkid; \
+}
+
+static int
+advance_objset(zseg_t *zseg, uint64_t objset, int advance)
+{
+ zbookmark_t *zb = &zseg->seg_start;
+
+ if (advance & ADVANCE_PRE) {
+ if (objset >= ZB_MAXOBJSET)
+ return (ERANGE);
+ SET_BOOKMARK(zb, objset, 0, -1, 0);
+ } else {
+ if (objset >= ZB_MAXOBJSET)
+ objset = 0;
+ SET_BOOKMARK(zb, objset, 1, 0, 0);
+ }
+
+ if (compare_bookmark(zb, &zseg->seg_end, NULL, advance) > 0)
+ return (ERANGE);
+
+ return (EAGAIN);
+}
+
+static int
+advance_object(zseg_t *zseg, uint64_t object, int advance)
+{
+ zbookmark_t *zb = &zseg->seg_start;
+
+ if (advance & ADVANCE_PRE) {
+ if (object >= ZB_MAXOBJECT) {
+ SET_BOOKMARK(zb, zb->zb_objset + 1, 0, -1, 0);
+ } else {
+ SET_BOOKMARK(zb, zb->zb_objset, object, ZB_MAXLEVEL, 0);
+ }
+ } else {
+ if (zb->zb_object == 0) {
+ SET_BOOKMARK(zb, zb->zb_objset, 0, -1, 0);
+ } else {
+ if (object >= ZB_MAXOBJECT)
+ object = 0;
+ SET_BOOKMARK(zb, zb->zb_objset, object, 0, 0);
+ }
+ }
+
+ if (compare_bookmark(zb, &zseg->seg_end, NULL, advance) > 0)
+ return (ERANGE);
+
+ return (EAGAIN);
+}
+
+static int
+advance_from_osphys(zseg_t *zseg, int advance)
+{
+ zbookmark_t *zb = &zseg->seg_start;
+
+ ASSERT(zb->zb_object == 0);
+ ASSERT(zb->zb_level == -1);
+ ASSERT(zb->zb_blkid == 0);
+
+ if (advance & ADVANCE_PRE) {
+ SET_BOOKMARK_LB(zb, ZB_MAXLEVEL, 0);
+ } else {
+ if (zb->zb_objset == 0)
+ return (ERANGE);
+ SET_BOOKMARK(zb, zb->zb_objset + 1, 1, 0, 0);
+ }
+
+ if (compare_bookmark(zb, &zseg->seg_end, NULL, advance) > 0)
+ return (ERANGE);
+
+ return (EAGAIN);
+}
+
+static int
+advance_block(zseg_t *zseg, dnode_phys_t *dnp, int rc, int advance)
+{
+ zbookmark_t *zb = &zseg->seg_start;
+ int wshift = dnp->dn_indblkshift - SPA_BLKPTRSHIFT;
+ int maxlevel = dnp->dn_nlevels - 1;
+ int level = zb->zb_level;
+ uint64_t blkid = zb->zb_blkid;
+
+ if (advance & ADVANCE_PRE) {
+ if (level > 0 && rc == 0) {
+ level--;
+ blkid <<= wshift;
+ } else {
+ blkid++;
+
+ if ((blkid << BP_SPAN_SHIFT(level, wshift)) >
+ dnp->dn_maxblkid)
+ return (ERANGE);
+
+ while (level < maxlevel) {
+ if (P2PHASE(blkid, 1ULL << wshift))
+ break;
+ blkid >>= wshift;
+ level++;
+ }
+ }
+ } else {
+ if (level >= maxlevel || P2PHASE(blkid + 1, 1ULL << wshift)) {
+ blkid = (blkid + 1) << BP_SPAN_SHIFT(level, wshift);
+ level = 0;
+ } else {
+ blkid >>= wshift;
+ level++;
+ }
+
+ while ((blkid << BP_SPAN_SHIFT(level, wshift)) >
+ dnp->dn_maxblkid) {
+ if (level == maxlevel)
+ return (ERANGE);
+ blkid >>= wshift;
+ level++;
+ }
+ }
+ SET_BOOKMARK_LB(zb, level, blkid);
+
+ if (compare_bookmark(zb, &zseg->seg_end, dnp, advance) > 0)
+ return (ERANGE);
+
+ return (EAGAIN);
+}
+
+static int
+traverse_callback(traverse_handle_t *th, zseg_t *zseg, traverse_blk_cache_t *bc)
+{
+ /*
+ * Before we issue the callback, prune against maxtxg.
+ *
+ * We prune against mintxg before we get here because it's a big win.
+ * If a given block was born in txg 37, then we know that the entire
+ * subtree below that block must have been born in txg 37 or earlier.
+ * We can therefore lop off huge branches of the tree as we go.
+ *
+ * There's no corresponding optimization for maxtxg because knowing
+ * that bp->blk_birth >= maxtxg doesn't imply anything about the bp's
+ * children. In fact, the copy-on-write design of ZFS ensures that
+ * top-level blocks will pretty much always be new.
+ *
+ * Therefore, in the name of simplicity we don't prune against
+ * maxtxg until the last possible moment -- that being right now.
+ */
+ if (bc->bc_errno == 0 && bc->bc_blkptr.blk_birth >= zseg->seg_maxtxg)
+ return (0);
+
+ /*
+ * Debugging: verify that the order we visit things agrees with the
+ * order defined by compare_bookmark(). We don't check this for
+ * log blocks because there's no defined ordering for them; they're
+ * always visited (or not) as part of visiting the objset_phys_t.
+ */
+ if (bc->bc_errno == 0 && bc != &th->th_zil_cache) {
+ zbookmark_t *zb = &bc->bc_bookmark;
+ zbookmark_t *szb = &zseg->seg_start;
+ zbookmark_t *ezb = &zseg->seg_end;
+ zbookmark_t *lzb = &th->th_lastcb;
+ dnode_phys_t *dnp = bc->bc_dnode;
+
+ ASSERT(compare_bookmark(zb, ezb, dnp, th->th_advance) <= 0);
+ ASSERT(compare_bookmark(zb, szb, dnp, th->th_advance) == 0);
+ ASSERT(compare_bookmark(lzb, zb, dnp, th->th_advance) < 0 ||
+ lzb->zb_level == ZB_NO_LEVEL);
+ *lzb = *zb;
+ }
+
+ th->th_callbacks++;
+ return (th->th_func(bc, th->th_spa, th->th_arg));
+}
+
+static int
+traverse_read(traverse_handle_t *th, traverse_blk_cache_t *bc, blkptr_t *bp,
+ dnode_phys_t *dnp)
+{
+ zbookmark_t *zb = &bc->bc_bookmark;
+ int error;
+
+ th->th_hits++;
+
+ bc->bc_dnode = dnp;
+ bc->bc_errno = 0;
+
+ if (BP_EQUAL(&bc->bc_blkptr, bp))
+ return (0);
+
+ bc->bc_blkptr = *bp;
+
+ if (bc->bc_data == NULL)
+ return (0);
+
+ if (BP_IS_HOLE(bp)) {
+ ASSERT(th->th_advance & ADVANCE_HOLES);
+ return (0);
+ }
+
+ if (compare_bookmark(zb, &th->th_noread, dnp, 0) == 0) {
+ error = EIO;
+ } else if (arc_tryread(th->th_spa, bp, bc->bc_data) == 0) {
+ error = 0;
+ th->th_arc_hits++;
+ } else {
+ error = zio_wait(zio_read(NULL, th->th_spa, bp, bc->bc_data,
+ BP_GET_LSIZE(bp), NULL, NULL, ZIO_PRIORITY_SYNC_READ,
+ th->th_zio_flags | ZIO_FLAG_DONT_CACHE, zb));
+
+ if (BP_SHOULD_BYTESWAP(bp) && error == 0)
+ (zb->zb_level > 0 ? byteswap_uint64_array :
+ dmu_ot[BP_GET_TYPE(bp)].ot_byteswap)(bc->bc_data,
+ BP_GET_LSIZE(bp));
+ th->th_reads++;
+ }
+
+ if (error) {
+ bc->bc_errno = error;
+ error = traverse_callback(th, NULL, bc);
+ ASSERT(error == EAGAIN || error == EINTR || error == ERESTART);
+ bc->bc_blkptr.blk_birth = -1ULL;
+ }
+
+ dprintf("cache %02x error %d <%llu, %llu, %d, %llx>\n",
+ bc - &th->th_cache[0][0], error,
+ zb->zb_objset, zb->zb_object, zb->zb_level, zb->zb_blkid);
+
+ return (error);
+}
+
+static int
+find_block(traverse_handle_t *th, zseg_t *zseg, dnode_phys_t *dnp, int depth)
+{
+ zbookmark_t *zb = &zseg->seg_start;
+ traverse_blk_cache_t *bc;
+ blkptr_t *bp = dnp->dn_blkptr;
+ int i, first, level;
+ int nbp = dnp->dn_nblkptr;
+ int minlevel = zb->zb_level;
+ int maxlevel = dnp->dn_nlevels - 1;
+ int wshift = dnp->dn_indblkshift - SPA_BLKPTRSHIFT;
+ int bp_shift = BP_SPAN_SHIFT(maxlevel - minlevel, wshift);
+ uint64_t blkid = zb->zb_blkid >> bp_shift;
+ int do_holes = (th->th_advance & ADVANCE_HOLES) && depth == ZB_DN_CACHE;
+ int rc;
+
+ if (minlevel > maxlevel || blkid >= nbp)
+ return (ERANGE);
+
+ for (level = maxlevel; level >= minlevel; level--) {
+ first = P2PHASE(blkid, 1ULL << wshift);
+
+ for (i = first; i < nbp; i++)
+ if (bp[i].blk_birth > zseg->seg_mintxg ||
+ BP_IS_HOLE(&bp[i]) && do_holes)
+ break;
+
+ if (i != first) {
+ i--;
+ SET_BOOKMARK_LB(zb, level, blkid + (i - first));
+ return (ENOTBLK);
+ }
+
+ bc = &th->th_cache[depth][level];
+
+ SET_BOOKMARK(&bc->bc_bookmark, zb->zb_objset, zb->zb_object,
+ level, blkid);
+
+ if (rc = traverse_read(th, bc, bp + i, dnp)) {
+ if (rc != EAGAIN) {
+ SET_BOOKMARK_LB(zb, level, blkid);
+ }
+ return (rc);
+ }
+
+ if (BP_IS_HOLE(&bp[i])) {
+ SET_BOOKMARK_LB(zb, level, blkid);
+ th->th_lastcb.zb_level = ZB_NO_LEVEL;
+ return (0);
+ }
+
+ nbp = 1 << wshift;
+ bp = bc->bc_data;
+ bp_shift -= wshift;
+ blkid = zb->zb_blkid >> bp_shift;
+ }
+
+ return (0);
+}
+
+static int
+get_dnode(traverse_handle_t *th, uint64_t objset, dnode_phys_t *mdn,
+ uint64_t *objectp, dnode_phys_t **dnpp, uint64_t txg, int type, int depth)
+{
+ zseg_t zseg;
+ zbookmark_t *zb = &zseg.seg_start;
+ uint64_t object = *objectp;
+ int i, rc;
+
+ SET_BOOKMARK(zb, objset, 0, 0, object / DNODES_PER_BLOCK);
+ SET_BOOKMARK(&zseg.seg_end, objset, 0, 0, ZB_MAXBLKID);
+
+ zseg.seg_mintxg = txg;
+ zseg.seg_maxtxg = -1ULL;
+
+ for (;;) {
+ rc = find_block(th, &zseg, mdn, depth);
+
+ if (rc == EAGAIN || rc == EINTR || rc == ERANGE)
+ break;
+
+ if (rc == 0 && zb->zb_level == 0) {
+ dnode_phys_t *dnp = th->th_cache[depth][0].bc_data;
+ for (i = 0; i < DNODES_PER_BLOCK; i++) {
+ object = (zb->zb_blkid * DNODES_PER_BLOCK) + i;
+ if (object >= *objectp &&
+ dnp[i].dn_type != DMU_OT_NONE &&
+ (type == -1 || dnp[i].dn_type == type)) {
+ *objectp = object;
+ *dnpp = &dnp[i];
+ return (0);
+ }
+ }
+ }
+
+ rc = advance_block(&zseg, mdn, rc, ADVANCE_PRE);
+
+ if (rc == ERANGE)
+ break;
+ }
+
+ if (rc == ERANGE)
+ *objectp = ZB_MAXOBJECT;
+
+ return (rc);
+}
+
+/* ARGSUSED */
+static void
+traverse_zil_block(zilog_t *zilog, blkptr_t *bp, void *arg, uint64_t claim_txg)
+{
+ traverse_handle_t *th = arg;
+ traverse_blk_cache_t *bc = &th->th_zil_cache;
+ zbookmark_t *zb = &bc->bc_bookmark;
+ zseg_t *zseg = list_head(&th->th_seglist);
+
+ if (bp->blk_birth <= zseg->seg_mintxg)
+ return;
+
+ if (claim_txg != 0 || bp->blk_birth < spa_first_txg(th->th_spa)) {
+ zb->zb_object = 0;
+ zb->zb_blkid = bp->blk_cksum.zc_word[ZIL_ZC_SEQ];
+ bc->bc_blkptr = *bp;
+ (void) traverse_callback(th, zseg, bc);
+ }
+}
+
+/* ARGSUSED */
+static void
+traverse_zil_record(zilog_t *zilog, lr_t *lrc, void *arg, uint64_t claim_txg)
+{
+ traverse_handle_t *th = arg;
+ traverse_blk_cache_t *bc = &th->th_zil_cache;
+ zbookmark_t *zb = &bc->bc_bookmark;
+ zseg_t *zseg = list_head(&th->th_seglist);
+
+ if (lrc->lrc_txtype == TX_WRITE) {
+ lr_write_t *lr = (lr_write_t *)lrc;
+ blkptr_t *bp = &lr->lr_blkptr;
+
+ if (bp->blk_birth <= zseg->seg_mintxg)
+ return;
+
+ if (claim_txg != 0 && bp->blk_birth >= claim_txg) {
+ zb->zb_object = lr->lr_foid;
+ zb->zb_blkid = lr->lr_offset / BP_GET_LSIZE(bp);
+ bc->bc_blkptr = *bp;
+ (void) traverse_callback(th, zseg, bc);
+ }
+ }
+}
+
+static void
+traverse_zil(traverse_handle_t *th, traverse_blk_cache_t *bc)
+{
+ spa_t *spa = th->th_spa;
+ dsl_pool_t *dp = spa_get_dsl(spa);
+ objset_phys_t *osphys = bc->bc_data;
+ zil_header_t *zh = &osphys->os_zil_header;
+ uint64_t claim_txg = zh->zh_claim_txg;
+ zilog_t *zilog;
+
+ ASSERT(bc == &th->th_cache[ZB_MDN_CACHE][ZB_MAXLEVEL - 1]);
+ ASSERT(bc->bc_bookmark.zb_level == -1);
+
+ /*
+ * We only want to visit blocks that have been claimed but not yet
+ * replayed (or, in read-only mode, blocks that *would* be claimed).
+ */
+ if (claim_txg == 0 && (spa_mode & FWRITE))
+ return;
+
+ th->th_zil_cache.bc_bookmark = bc->bc_bookmark;
+
+ zilog = zil_alloc(dp->dp_meta_objset, zh);
+
+ (void) zil_parse(zilog, traverse_zil_block, traverse_zil_record, th,
+ claim_txg);
+
+ zil_free(zilog);
+}
+
+static int
+traverse_segment(traverse_handle_t *th, zseg_t *zseg, blkptr_t *mosbp)
+{
+ zbookmark_t *zb = &zseg->seg_start;
+ traverse_blk_cache_t *bc;
+ dnode_phys_t *dn, *dn_tmp;
+ int worklimit = 100;
+ int rc;
+
+ dprintf("<%llu, %llu, %d, %llx>\n",
+ zb->zb_objset, zb->zb_object, zb->zb_level, zb->zb_blkid);
+
+ bc = &th->th_cache[ZB_MOS_CACHE][ZB_MAXLEVEL - 1];
+ dn = &((objset_phys_t *)bc->bc_data)->os_meta_dnode;
+
+ SET_BOOKMARK(&bc->bc_bookmark, 0, 0, -1, 0);
+
+ rc = traverse_read(th, bc, mosbp, dn);
+
+ if (rc) /* If we get ERESTART, we've got nowhere left to go */
+ return (rc == ERESTART ? EINTR : rc);
+
+ ASSERT(dn->dn_nlevels < ZB_MAXLEVEL);
+
+ if (zb->zb_objset != 0) {
+ uint64_t objset = zb->zb_objset;
+ dsl_dataset_phys_t *dsp;
+
+ rc = get_dnode(th, 0, dn, &objset, &dn_tmp, 0,
+ DMU_OT_DSL_DATASET, ZB_MOS_CACHE);
+
+ if (objset != zb->zb_objset)
+ rc = advance_objset(zseg, objset, th->th_advance);
+
+ if (rc != 0)
+ return (rc);
+
+ dsp = DN_BONUS(dn_tmp);
+
+ bc = &th->th_cache[ZB_MDN_CACHE][ZB_MAXLEVEL - 1];
+ dn = &((objset_phys_t *)bc->bc_data)->os_meta_dnode;
+
+ SET_BOOKMARK(&bc->bc_bookmark, objset, 0, -1, 0);
+
+ /*
+ * If we're traversing an open snapshot, we know that it
+ * can't be deleted (because it's open) and it can't change
+ * (because it's a snapshot). Therefore, once we've gotten
+ * from the uberblock down to the snapshot's objset_phys_t,
+ * we no longer need to synchronize with spa_sync(); we're
+ * traversing a completely static block tree from here on.
+ */
+ if (th->th_advance & ADVANCE_NOLOCK) {
+ ASSERT(th->th_locked);
+ rw_exit(spa_traverse_rwlock(th->th_spa));
+ th->th_locked = 0;
+ }
+
+ rc = traverse_read(th, bc, &dsp->ds_bp, dn);
+
+ if (rc != 0) {
+ if (rc == ERESTART)
+ rc = advance_objset(zseg, zb->zb_objset + 1,
+ th->th_advance);
+ return (rc);
+ }
+
+ if (th->th_advance & ADVANCE_PRUNE)
+ zseg->seg_mintxg =
+ MAX(zseg->seg_mintxg, dsp->ds_prev_snap_txg);
+ }
+
+ if (zb->zb_level == -1) {
+ ASSERT(zb->zb_object == 0);
+ ASSERT(zb->zb_blkid == 0);
+ ASSERT(BP_GET_TYPE(&bc->bc_blkptr) == DMU_OT_OBJSET);
+
+ if (bc->bc_blkptr.blk_birth > zseg->seg_mintxg) {
+ rc = traverse_callback(th, zseg, bc);
+ if (rc) {
+ ASSERT(rc == EINTR);
+ return (rc);
+ }
+ if ((th->th_advance & ADVANCE_ZIL) &&
+ zb->zb_objset != 0)
+ traverse_zil(th, bc);
+ }
+
+ return (advance_from_osphys(zseg, th->th_advance));
+ }
+
+ if (zb->zb_object != 0) {
+ uint64_t object = zb->zb_object;
+
+ rc = get_dnode(th, zb->zb_objset, dn, &object, &dn_tmp,
+ zseg->seg_mintxg, -1, ZB_MDN_CACHE);
+
+ if (object != zb->zb_object)
+ rc = advance_object(zseg, object, th->th_advance);
+
+ if (rc != 0)
+ return (rc);
+
+ dn = dn_tmp;
+ }
+
+ if (zb->zb_level == ZB_MAXLEVEL)
+ zb->zb_level = dn->dn_nlevels - 1;
+
+ for (;;) {
+ rc = find_block(th, zseg, dn, ZB_DN_CACHE);
+
+ if (rc == EAGAIN || rc == EINTR || rc == ERANGE)
+ break;
+
+ if (rc == 0) {
+ bc = &th->th_cache[ZB_DN_CACHE][zb->zb_level];
+ ASSERT(bc->bc_dnode == dn);
+ ASSERT(bc->bc_blkptr.blk_birth <= mosbp->blk_birth);
+ rc = traverse_callback(th, zseg, bc);
+ if (rc) {
+ ASSERT(rc == EINTR);
+ return (rc);
+ }
+ if (BP_IS_HOLE(&bc->bc_blkptr)) {
+ ASSERT(th->th_advance & ADVANCE_HOLES);
+ rc = ENOTBLK;
+ }
+ }
+
+ rc = advance_block(zseg, dn, rc, th->th_advance);
+
+ if (rc == ERANGE)
+ break;
+
+ /*
+ * Give spa_sync() a chance to run.
+ */
+ if (th->th_locked && spa_traverse_wanted(th->th_spa)) {
+ th->th_syncs++;
+ return (EAGAIN);
+ }
+
+ if (--worklimit == 0)
+ return (EAGAIN);
+ }
+
+ if (rc == ERANGE)
+ rc = advance_object(zseg, zb->zb_object + 1, th->th_advance);
+
+ return (rc);
+}
+
+/*
+ * It is the caller's responsibility to ensure that the dsl_dataset_t
+ * doesn't go away during traversal.
+ */
+int
+traverse_dsl_dataset(dsl_dataset_t *ds, uint64_t txg_start, int advance,
+ blkptr_cb_t func, void *arg)
+{
+ spa_t *spa = ds->ds_dir->dd_pool->dp_spa;
+ traverse_handle_t *th;
+ int err;
+
+ th = traverse_init(spa, func, arg, advance, ZIO_FLAG_MUSTSUCCEED);
+
+ traverse_add_objset(th, txg_start, -1ULL, ds->ds_object);
+
+ while ((err = traverse_more(th)) == EAGAIN)
+ continue;
+
+ traverse_fini(th);
+ return (err);
+}
+
+int
+traverse_more(traverse_handle_t *th)
+{
+ zseg_t *zseg = list_head(&th->th_seglist);
+ uint64_t save_txg; /* XXX won't be necessary with real itinerary */
+ krwlock_t *rw = spa_traverse_rwlock(th->th_spa);
+ blkptr_t *mosbp = spa_get_rootblkptr(th->th_spa);
+ int rc;
+
+ if (zseg == NULL)
+ return (0);
+
+ th->th_restarts++;
+
+ save_txg = zseg->seg_mintxg;
+
+ rw_enter(rw, RW_READER);
+ th->th_locked = 1;
+
+ rc = traverse_segment(th, zseg, mosbp);
+ ASSERT(rc == ERANGE || rc == EAGAIN || rc == EINTR);
+
+ if (th->th_locked)
+ rw_exit(rw);
+ th->th_locked = 0;
+
+ zseg->seg_mintxg = save_txg;
+
+ if (rc == ERANGE) {
+ list_remove(&th->th_seglist, zseg);
+ kmem_free(zseg, sizeof (*zseg));
+ return (EAGAIN);
+ }
+
+ return (rc);
+}
+
+/*
+ * Note: (mintxg, maxtxg) is an open interval; mintxg and maxtxg themselves
+ * are not included. The blocks covered by this segment will all have
+ * mintxg < birth < maxtxg.
+ */
+static void
+traverse_add_segment(traverse_handle_t *th, uint64_t mintxg, uint64_t maxtxg,
+ uint64_t sobjset, uint64_t sobject, int slevel, uint64_t sblkid,
+ uint64_t eobjset, uint64_t eobject, int elevel, uint64_t eblkid)
+{
+ zseg_t *zseg;
+
+ zseg = kmem_alloc(sizeof (zseg_t), KM_SLEEP);
+
+ zseg->seg_mintxg = mintxg;
+ zseg->seg_maxtxg = maxtxg;
+
+ zseg->seg_start.zb_objset = sobjset;
+ zseg->seg_start.zb_object = sobject;
+ zseg->seg_start.zb_level = slevel;
+ zseg->seg_start.zb_blkid = sblkid;
+
+ zseg->seg_end.zb_objset = eobjset;
+ zseg->seg_end.zb_object = eobject;
+ zseg->seg_end.zb_level = elevel;
+ zseg->seg_end.zb_blkid = eblkid;
+
+ list_insert_tail(&th->th_seglist, zseg);
+}
+
+void
+traverse_add_dnode(traverse_handle_t *th, uint64_t mintxg, uint64_t maxtxg,
+ uint64_t objset, uint64_t object)
+{
+ if (th->th_advance & ADVANCE_PRE)
+ traverse_add_segment(th, mintxg, maxtxg,
+ objset, object, ZB_MAXLEVEL, 0,
+ objset, object, 0, ZB_MAXBLKID);
+ else
+ traverse_add_segment(th, mintxg, maxtxg,
+ objset, object, 0, 0,
+ objset, object, 0, ZB_MAXBLKID);
+}
+
+void
+traverse_add_objset(traverse_handle_t *th, uint64_t mintxg, uint64_t maxtxg,
+ uint64_t objset)
+{
+ if (th->th_advance & ADVANCE_PRE)
+ traverse_add_segment(th, mintxg, maxtxg,
+ objset, 0, -1, 0,
+ objset, ZB_MAXOBJECT, 0, ZB_MAXBLKID);
+ else
+ traverse_add_segment(th, mintxg, maxtxg,
+ objset, 1, 0, 0,
+ objset, 0, -1, 0);
+}
+
+void
+traverse_add_pool(traverse_handle_t *th, uint64_t mintxg, uint64_t maxtxg)
+{
+ if (th->th_advance & ADVANCE_PRE)
+ traverse_add_segment(th, mintxg, maxtxg,
+ 0, 0, -1, 0,
+ ZB_MAXOBJSET, ZB_MAXOBJECT, 0, ZB_MAXBLKID);
+ else
+ traverse_add_segment(th, mintxg, maxtxg,
+ 1, 1, 0, 0,
+ 0, 0, -1, 0);
+}
+
+traverse_handle_t *
+traverse_init(spa_t *spa, blkptr_cb_t func, void *arg, int advance,
+ int zio_flags)
+{
+ traverse_handle_t *th;
+ int d, l;
+
+ th = kmem_zalloc(sizeof (*th), KM_SLEEP);
+
+ th->th_spa = spa;
+ th->th_func = func;
+ th->th_arg = arg;
+ th->th_advance = advance;
+ th->th_lastcb.zb_level = ZB_NO_LEVEL;
+ th->th_noread.zb_level = ZB_NO_LEVEL;
+ th->th_zio_flags = zio_flags;
+
+ list_create(&th->th_seglist, sizeof (zseg_t),
+ offsetof(zseg_t, seg_node));
+
+ for (d = 0; d < ZB_DEPTH; d++) {
+ for (l = 0; l < ZB_MAXLEVEL; l++) {
+ if ((advance & ADVANCE_DATA) ||
+ l != 0 || d != ZB_DN_CACHE)
+ th->th_cache[d][l].bc_data =
+ zio_buf_alloc(SPA_MAXBLOCKSIZE);
+ }
+ }
+
+ return (th);
+}
+
+void
+traverse_fini(traverse_handle_t *th)
+{
+ int d, l;
+ zseg_t *zseg;
+
+ for (d = 0; d < ZB_DEPTH; d++)
+ for (l = 0; l < ZB_MAXLEVEL; l++)
+ if (th->th_cache[d][l].bc_data != NULL)
+ zio_buf_free(th->th_cache[d][l].bc_data,
+ SPA_MAXBLOCKSIZE);
+
+ while ((zseg = list_head(&th->th_seglist)) != NULL) {
+ list_remove(&th->th_seglist, zseg);
+ kmem_free(zseg, sizeof (*zseg));
+ }
+
+ list_destroy(&th->th_seglist);
+
+ dprintf("%llu hit, %llu ARC, %llu IO, %llu cb, %llu sync, %llu again\n",
+ th->th_hits, th->th_arc_hits, th->th_reads, th->th_callbacks,
+ th->th_syncs, th->th_restarts);
+
+ kmem_free(th, sizeof (*th));
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c
new file mode 100644
index 0000000..13fd8d4
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_tx.c
@@ -0,0 +1,992 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/dmu_impl.h>
+#include <sys/dbuf.h>
+#include <sys/dmu_tx.h>
+#include <sys/dmu_objset.h>
+#include <sys/dsl_dataset.h> /* for dsl_dataset_block_freeable() */
+#include <sys/dsl_dir.h> /* for dsl_dir_tempreserve_*() */
+#include <sys/dsl_pool.h>
+#include <sys/zap_impl.h> /* for fzap_default_block_shift */
+#include <sys/spa.h>
+#include <sys/zfs_context.h>
+
+typedef void (*dmu_tx_hold_func_t)(dmu_tx_t *tx, struct dnode *dn,
+ uint64_t arg1, uint64_t arg2);
+
+
+dmu_tx_t *
+dmu_tx_create_dd(dsl_dir_t *dd)
+{
+ dmu_tx_t *tx = kmem_zalloc(sizeof (dmu_tx_t), KM_SLEEP);
+ tx->tx_dir = dd;
+ if (dd)
+ tx->tx_pool = dd->dd_pool;
+ list_create(&tx->tx_holds, sizeof (dmu_tx_hold_t),
+ offsetof(dmu_tx_hold_t, txh_node));
+#ifdef ZFS_DEBUG
+ refcount_create(&tx->tx_space_written);
+ refcount_create(&tx->tx_space_freed);
+#endif
+ return (tx);
+}
+
+dmu_tx_t *
+dmu_tx_create(objset_t *os)
+{
+ dmu_tx_t *tx = dmu_tx_create_dd(os->os->os_dsl_dataset->ds_dir);
+ tx->tx_objset = os;
+ tx->tx_lastsnap_txg = dsl_dataset_prev_snap_txg(os->os->os_dsl_dataset);
+ return (tx);
+}
+
+dmu_tx_t *
+dmu_tx_create_assigned(struct dsl_pool *dp, uint64_t txg)
+{
+ dmu_tx_t *tx = dmu_tx_create_dd(NULL);
+
+ ASSERT3U(txg, <=, dp->dp_tx.tx_open_txg);
+ tx->tx_pool = dp;
+ tx->tx_txg = txg;
+ tx->tx_anyobj = TRUE;
+
+ return (tx);
+}
+
+int
+dmu_tx_is_syncing(dmu_tx_t *tx)
+{
+ return (tx->tx_anyobj);
+}
+
+int
+dmu_tx_private_ok(dmu_tx_t *tx)
+{
+ return (tx->tx_anyobj);
+}
+
+static dmu_tx_hold_t *
+dmu_tx_hold_object_impl(dmu_tx_t *tx, objset_t *os, uint64_t object,
+ enum dmu_tx_hold_type type, uint64_t arg1, uint64_t arg2)
+{
+ dmu_tx_hold_t *txh;
+ dnode_t *dn = NULL;
+ int err;
+
+ if (object != DMU_NEW_OBJECT) {
+ err = dnode_hold(os->os, object, tx, &dn);
+ if (err) {
+ tx->tx_err = err;
+ return (NULL);
+ }
+
+ if (err == 0 && tx->tx_txg != 0) {
+ mutex_enter(&dn->dn_mtx);
+ /*
+ * dn->dn_assigned_txg == tx->tx_txg doesn't pose a
+ * problem, but there's no way for it to happen (for
+ * now, at least).
+ */
+ ASSERT(dn->dn_assigned_txg == 0);
+ dn->dn_assigned_txg = tx->tx_txg;
+ (void) refcount_add(&dn->dn_tx_holds, tx);
+ mutex_exit(&dn->dn_mtx);
+ }
+ }
+
+ txh = kmem_zalloc(sizeof (dmu_tx_hold_t), KM_SLEEP);
+ txh->txh_tx = tx;
+ txh->txh_dnode = dn;
+#ifdef ZFS_DEBUG
+ txh->txh_type = type;
+ txh->txh_arg1 = arg1;
+ txh->txh_arg2 = arg2;
+#endif
+ list_insert_tail(&tx->tx_holds, txh);
+
+ return (txh);
+}
+
+void
+dmu_tx_add_new_object(dmu_tx_t *tx, objset_t *os, uint64_t object)
+{
+ /*
+ * If we're syncing, they can manipulate any object anyhow, and
+ * the hold on the dnode_t can cause problems.
+ */
+ if (!dmu_tx_is_syncing(tx)) {
+ (void) dmu_tx_hold_object_impl(tx, os,
+ object, THT_NEWOBJECT, 0, 0);
+ }
+}
+
+static int
+dmu_tx_check_ioerr(zio_t *zio, dnode_t *dn, int level, uint64_t blkid)
+{
+ int err;
+ dmu_buf_impl_t *db;
+
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ db = dbuf_hold_level(dn, level, blkid, FTAG);
+ rw_exit(&dn->dn_struct_rwlock);
+ if (db == NULL)
+ return (EIO);
+ err = dbuf_read(db, zio, DB_RF_CANFAIL);
+ dbuf_rele(db, FTAG);
+ return (err);
+}
+
+/* ARGSUSED */
+static void
+dmu_tx_count_write(dmu_tx_hold_t *txh, uint64_t off, uint64_t len)
+{
+ dnode_t *dn = txh->txh_dnode;
+ uint64_t start, end, i;
+ int min_bs, max_bs, min_ibs, max_ibs, epbs, bits;
+ int err = 0;
+
+ if (len == 0)
+ return;
+
+ min_bs = SPA_MINBLOCKSHIFT;
+ max_bs = SPA_MAXBLOCKSHIFT;
+ min_ibs = DN_MIN_INDBLKSHIFT;
+ max_ibs = DN_MAX_INDBLKSHIFT;
+
+
+ /*
+ * For i/o error checking, read the first and last level-0
+ * blocks (if they are not aligned), and all the level-1 blocks.
+ */
+
+ if (dn) {
+ if (dn->dn_maxblkid == 0) {
+ err = dmu_tx_check_ioerr(NULL, dn, 0, 0);
+ if (err)
+ goto out;
+ } else {
+ zio_t *zio = zio_root(dn->dn_objset->os_spa,
+ NULL, NULL, ZIO_FLAG_CANFAIL);
+
+ /* first level-0 block */
+ start = off >> dn->dn_datablkshift;
+ if (P2PHASE(off, dn->dn_datablksz) ||
+ len < dn->dn_datablksz) {
+ err = dmu_tx_check_ioerr(zio, dn, 0, start);
+ if (err)
+ goto out;
+ }
+
+ /* last level-0 block */
+ end = (off+len-1) >> dn->dn_datablkshift;
+ if (end != start &&
+ P2PHASE(off+len, dn->dn_datablksz)) {
+ err = dmu_tx_check_ioerr(zio, dn, 0, end);
+ if (err)
+ goto out;
+ }
+
+ /* level-1 blocks */
+ if (dn->dn_nlevels > 1) {
+ start >>= dn->dn_indblkshift - SPA_BLKPTRSHIFT;
+ end >>= dn->dn_indblkshift - SPA_BLKPTRSHIFT;
+ for (i = start+1; i < end; i++) {
+ err = dmu_tx_check_ioerr(zio, dn, 1, i);
+ if (err)
+ goto out;
+ }
+ }
+
+ err = zio_wait(zio);
+ if (err)
+ goto out;
+ }
+ }
+
+ /*
+ * If there's more than one block, the blocksize can't change,
+ * so we can make a more precise estimate. Alternatively,
+ * if the dnode's ibs is larger than max_ibs, always use that.
+ * This ensures that if we reduce DN_MAX_INDBLKSHIFT,
+ * the code will still work correctly on existing pools.
+ */
+ if (dn && (dn->dn_maxblkid != 0 || dn->dn_indblkshift > max_ibs)) {
+ min_ibs = max_ibs = dn->dn_indblkshift;
+ if (dn->dn_datablkshift != 0)
+ min_bs = max_bs = dn->dn_datablkshift;
+ }
+
+ /*
+ * 'end' is the last thing we will access, not one past.
+ * This way we won't overflow when accessing the last byte.
+ */
+ start = P2ALIGN(off, 1ULL << max_bs);
+ end = P2ROUNDUP(off + len, 1ULL << max_bs) - 1;
+ txh->txh_space_towrite += end - start + 1;
+
+ start >>= min_bs;
+ end >>= min_bs;
+
+ epbs = min_ibs - SPA_BLKPTRSHIFT;
+
+ /*
+ * The object contains at most 2^(64 - min_bs) blocks,
+ * and each indirect level maps 2^epbs.
+ */
+ for (bits = 64 - min_bs; bits >= 0; bits -= epbs) {
+ start >>= epbs;
+ end >>= epbs;
+ /*
+ * If we increase the number of levels of indirection,
+ * we'll need new blkid=0 indirect blocks. If start == 0,
+ * we're already accounting for that blocks; and if end == 0,
+ * we can't increase the number of levels beyond that.
+ */
+ if (start != 0 && end != 0)
+ txh->txh_space_towrite += 1ULL << max_ibs;
+ txh->txh_space_towrite += (end - start + 1) << max_ibs;
+ }
+
+ ASSERT(txh->txh_space_towrite < 2 * DMU_MAX_ACCESS);
+
+out:
+ if (err)
+ txh->txh_tx->tx_err = err;
+}
+
+static void
+dmu_tx_count_dnode(dmu_tx_hold_t *txh)
+{
+ dnode_t *dn = txh->txh_dnode;
+ dnode_t *mdn = txh->txh_tx->tx_objset->os->os_meta_dnode;
+ uint64_t space = mdn->dn_datablksz +
+ ((mdn->dn_nlevels-1) << mdn->dn_indblkshift);
+
+ if (dn && dn->dn_dbuf->db_blkptr &&
+ dsl_dataset_block_freeable(dn->dn_objset->os_dsl_dataset,
+ dn->dn_dbuf->db_blkptr->blk_birth)) {
+ txh->txh_space_tooverwrite += space;
+ } else {
+ txh->txh_space_towrite += space;
+ }
+}
+
+void
+dmu_tx_hold_write(dmu_tx_t *tx, uint64_t object, uint64_t off, int len)
+{
+ dmu_tx_hold_t *txh;
+
+ ASSERT(tx->tx_txg == 0);
+ ASSERT(len < DMU_MAX_ACCESS);
+ ASSERT(len == 0 || UINT64_MAX - off >= len - 1);
+
+ txh = dmu_tx_hold_object_impl(tx, tx->tx_objset,
+ object, THT_WRITE, off, len);
+ if (txh == NULL)
+ return;
+
+ dmu_tx_count_write(txh, off, len);
+ dmu_tx_count_dnode(txh);
+}
+
+static void
+dmu_tx_count_free(dmu_tx_hold_t *txh, uint64_t off, uint64_t len)
+{
+ uint64_t blkid, nblks;
+ uint64_t space = 0;
+ dnode_t *dn = txh->txh_dnode;
+ dsl_dataset_t *ds = dn->dn_objset->os_dsl_dataset;
+ spa_t *spa = txh->txh_tx->tx_pool->dp_spa;
+ int dirty;
+
+ /*
+ * We don't need to use any locking to check for dirtyness
+ * because it's OK if we get stale data -- the dnode may become
+ * dirty immediately after our check anyway. This is just a
+ * means to avoid the expensive count when we aren't sure we
+ * need it. We need to be able to deal with a dirty dnode.
+ */
+ dirty = list_link_active(&dn->dn_dirty_link[0]) |
+ list_link_active(&dn->dn_dirty_link[1]) |
+ list_link_active(&dn->dn_dirty_link[2]) |
+ list_link_active(&dn->dn_dirty_link[3]);
+ if (dirty || dn->dn_assigned_txg || dn->dn_phys->dn_nlevels == 0)
+ return;
+
+ /*
+ * the struct_rwlock protects us against dn_phys->dn_nlevels
+ * changing, in case (against all odds) we manage to dirty &
+ * sync out the changes after we check for being dirty.
+ * also, dbuf_hold_impl() wants us to have the struct_rwlock.
+ *
+ * It's fine to use dn_datablkshift rather than the dn_phys
+ * equivalent because if it is changing, maxblkid==0 and we will
+ * bail.
+ */
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ if (dn->dn_phys->dn_maxblkid == 0) {
+ if (off == 0 && len >= dn->dn_datablksz) {
+ blkid = 0;
+ nblks = 1;
+ } else {
+ rw_exit(&dn->dn_struct_rwlock);
+ return;
+ }
+ } else {
+ blkid = off >> dn->dn_datablkshift;
+ nblks = (off + len) >> dn->dn_datablkshift;
+
+ if (blkid >= dn->dn_phys->dn_maxblkid) {
+ rw_exit(&dn->dn_struct_rwlock);
+ return;
+ }
+ if (blkid + nblks > dn->dn_phys->dn_maxblkid)
+ nblks = dn->dn_phys->dn_maxblkid - blkid;
+
+ /* don't bother after 128,000 blocks */
+ nblks = MIN(nblks, 128*1024);
+ }
+
+ if (dn->dn_phys->dn_nlevels == 1) {
+ int i;
+ for (i = 0; i < nblks; i++) {
+ blkptr_t *bp = dn->dn_phys->dn_blkptr;
+ ASSERT3U(blkid + i, <, dn->dn_phys->dn_nblkptr);
+ bp += blkid + i;
+ if (dsl_dataset_block_freeable(ds, bp->blk_birth)) {
+ dprintf_bp(bp, "can free old%s", "");
+ space += bp_get_dasize(spa, bp);
+ }
+ }
+ nblks = 0;
+ }
+
+ while (nblks) {
+ dmu_buf_impl_t *dbuf;
+ int err, epbs, blkoff, tochk;
+
+ epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
+ blkoff = P2PHASE(blkid, 1<<epbs);
+ tochk = MIN((1<<epbs) - blkoff, nblks);
+
+ err = dbuf_hold_impl(dn, 1, blkid >> epbs, TRUE, FTAG, &dbuf);
+ if (err == 0) {
+ int i;
+ blkptr_t *bp;
+
+ err = dbuf_read(dbuf, NULL,
+ DB_RF_HAVESTRUCT | DB_RF_CANFAIL);
+ if (err != 0) {
+ txh->txh_tx->tx_err = err;
+ dbuf_rele(dbuf, FTAG);
+ break;
+ }
+
+ bp = dbuf->db.db_data;
+ bp += blkoff;
+
+ for (i = 0; i < tochk; i++) {
+ if (dsl_dataset_block_freeable(ds,
+ bp[i].blk_birth)) {
+ dprintf_bp(&bp[i],
+ "can free old%s", "");
+ space += bp_get_dasize(spa, &bp[i]);
+ }
+ }
+ dbuf_rele(dbuf, FTAG);
+ }
+ if (err && err != ENOENT) {
+ txh->txh_tx->tx_err = err;
+ break;
+ }
+
+ blkid += tochk;
+ nblks -= tochk;
+ }
+ rw_exit(&dn->dn_struct_rwlock);
+
+ txh->txh_space_tofree += space;
+}
+
+void
+dmu_tx_hold_free(dmu_tx_t *tx, uint64_t object, uint64_t off, uint64_t len)
+{
+ dmu_tx_hold_t *txh;
+ dnode_t *dn;
+ uint64_t start, end, i;
+ int err, shift;
+ zio_t *zio;
+
+ ASSERT(tx->tx_txg == 0);
+
+ txh = dmu_tx_hold_object_impl(tx, tx->tx_objset,
+ object, THT_FREE, off, len);
+ if (txh == NULL)
+ return;
+ dn = txh->txh_dnode;
+
+ /* first block */
+ if (off != 0)
+ dmu_tx_count_write(txh, off, 1);
+ /* last block */
+ if (len != DMU_OBJECT_END)
+ dmu_tx_count_write(txh, off+len, 1);
+
+ if (off >= (dn->dn_maxblkid+1) * dn->dn_datablksz)
+ return;
+ if (len == DMU_OBJECT_END)
+ len = (dn->dn_maxblkid+1) * dn->dn_datablksz - off;
+
+ /*
+ * For i/o error checking, read the first and last level-0
+ * blocks, and all the level-1 blocks. The above count_write's
+ * will take care of the level-0 blocks.
+ */
+ if (dn->dn_nlevels > 1) {
+ shift = dn->dn_datablkshift + dn->dn_indblkshift -
+ SPA_BLKPTRSHIFT;
+ start = off >> shift;
+ end = dn->dn_datablkshift ? ((off+len) >> shift) : 0;
+
+ zio = zio_root(tx->tx_pool->dp_spa,
+ NULL, NULL, ZIO_FLAG_CANFAIL);
+ for (i = start; i <= end; i++) {
+ uint64_t ibyte = i << shift;
+ err = dnode_next_offset(dn, FALSE, &ibyte, 2, 1, 0);
+ i = ibyte >> shift;
+ if (err == ESRCH)
+ break;
+ if (err) {
+ tx->tx_err = err;
+ return;
+ }
+
+ err = dmu_tx_check_ioerr(zio, dn, 1, i);
+ if (err) {
+ tx->tx_err = err;
+ return;
+ }
+ }
+ err = zio_wait(zio);
+ if (err) {
+ tx->tx_err = err;
+ return;
+ }
+ }
+
+ dmu_tx_count_dnode(txh);
+ dmu_tx_count_free(txh, off, len);
+}
+
+void
+dmu_tx_hold_zap(dmu_tx_t *tx, uint64_t object, int add, char *name)
+{
+ dmu_tx_hold_t *txh;
+ dnode_t *dn;
+ uint64_t nblocks;
+ int epbs, err;
+
+ ASSERT(tx->tx_txg == 0);
+
+ txh = dmu_tx_hold_object_impl(tx, tx->tx_objset,
+ object, THT_ZAP, add, (uintptr_t)name);
+ if (txh == NULL)
+ return;
+ dn = txh->txh_dnode;
+
+ dmu_tx_count_dnode(txh);
+
+ if (dn == NULL) {
+ /*
+ * We will be able to fit a new object's entries into one leaf
+ * block. So there will be at most 2 blocks total,
+ * including the header block.
+ */
+ dmu_tx_count_write(txh, 0, 2 << fzap_default_block_shift);
+ return;
+ }
+
+ ASSERT3P(dmu_ot[dn->dn_type].ot_byteswap, ==, zap_byteswap);
+
+ if (dn->dn_maxblkid == 0 && !add) {
+ /*
+ * If there is only one block (i.e. this is a micro-zap)
+ * and we are not adding anything, the accounting is simple.
+ */
+ err = dmu_tx_check_ioerr(NULL, dn, 0, 0);
+ if (err) {
+ tx->tx_err = err;
+ return;
+ }
+
+ /*
+ * Use max block size here, since we don't know how much
+ * the size will change between now and the dbuf dirty call.
+ */
+ if (dsl_dataset_block_freeable(dn->dn_objset->os_dsl_dataset,
+ dn->dn_phys->dn_blkptr[0].blk_birth))
+ txh->txh_space_tooverwrite += SPA_MAXBLOCKSIZE;
+ else
+ txh->txh_space_towrite += SPA_MAXBLOCKSIZE;
+ return;
+ }
+
+ if (dn->dn_maxblkid > 0 && name) {
+ /*
+ * access the name in this fat-zap so that we'll check
+ * for i/o errors to the leaf blocks, etc.
+ */
+ err = zap_lookup(&dn->dn_objset->os, dn->dn_object, name,
+ 8, 0, NULL);
+ if (err == EIO) {
+ tx->tx_err = err;
+ return;
+ }
+ }
+
+ /*
+ * 3 blocks overwritten: target leaf, ptrtbl block, header block
+ * 3 new blocks written if adding: new split leaf, 2 grown ptrtbl blocks
+ */
+ dmu_tx_count_write(txh, dn->dn_maxblkid * dn->dn_datablksz,
+ (3 + add ? 3 : 0) << dn->dn_datablkshift);
+
+ /*
+ * If the modified blocks are scattered to the four winds,
+ * we'll have to modify an indirect twig for each.
+ */
+ epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
+ for (nblocks = dn->dn_maxblkid >> epbs; nblocks != 0; nblocks >>= epbs)
+ txh->txh_space_towrite += 3 << dn->dn_indblkshift;
+}
+
+void
+dmu_tx_hold_bonus(dmu_tx_t *tx, uint64_t object)
+{
+ dmu_tx_hold_t *txh;
+
+ ASSERT(tx->tx_txg == 0);
+
+ txh = dmu_tx_hold_object_impl(tx, tx->tx_objset,
+ object, THT_BONUS, 0, 0);
+ if (txh)
+ dmu_tx_count_dnode(txh);
+}
+
+void
+dmu_tx_hold_space(dmu_tx_t *tx, uint64_t space)
+{
+ dmu_tx_hold_t *txh;
+ ASSERT(tx->tx_txg == 0);
+
+ txh = dmu_tx_hold_object_impl(tx, tx->tx_objset,
+ DMU_NEW_OBJECT, THT_SPACE, space, 0);
+
+ txh->txh_space_towrite += space;
+}
+
+int
+dmu_tx_holds(dmu_tx_t *tx, uint64_t object)
+{
+ dmu_tx_hold_t *txh;
+ int holds = 0;
+
+ /*
+ * By asserting that the tx is assigned, we're counting the
+ * number of dn_tx_holds, which is the same as the number of
+ * dn_holds. Otherwise, we'd be counting dn_holds, but
+ * dn_tx_holds could be 0.
+ */
+ ASSERT(tx->tx_txg != 0);
+
+ /* if (tx->tx_anyobj == TRUE) */
+ /* return (0); */
+
+ for (txh = list_head(&tx->tx_holds); txh;
+ txh = list_next(&tx->tx_holds, txh)) {
+ if (txh->txh_dnode && txh->txh_dnode->dn_object == object)
+ holds++;
+ }
+
+ return (holds);
+}
+
+#ifdef ZFS_DEBUG
+void
+dmu_tx_dirty_buf(dmu_tx_t *tx, dmu_buf_impl_t *db)
+{
+ dmu_tx_hold_t *txh;
+ int match_object = FALSE, match_offset = FALSE;
+ dnode_t *dn = db->db_dnode;
+
+ ASSERT(tx->tx_txg != 0);
+ ASSERT(tx->tx_objset == NULL || dn->dn_objset == tx->tx_objset->os);
+ ASSERT3U(dn->dn_object, ==, db->db.db_object);
+
+ if (tx->tx_anyobj)
+ return;
+
+ /* XXX No checking on the meta dnode for now */
+ if (db->db.db_object == DMU_META_DNODE_OBJECT)
+ return;
+
+ for (txh = list_head(&tx->tx_holds); txh;
+ txh = list_next(&tx->tx_holds, txh)) {
+ ASSERT(dn == NULL || dn->dn_assigned_txg == tx->tx_txg);
+ if (txh->txh_dnode == dn && txh->txh_type != THT_NEWOBJECT)
+ match_object = TRUE;
+ if (txh->txh_dnode == NULL || txh->txh_dnode == dn) {
+ int datablkshift = dn->dn_datablkshift ?
+ dn->dn_datablkshift : SPA_MAXBLOCKSHIFT;
+ int epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
+ int shift = datablkshift + epbs * db->db_level;
+ uint64_t beginblk = shift >= 64 ? 0 :
+ (txh->txh_arg1 >> shift);
+ uint64_t endblk = shift >= 64 ? 0 :
+ ((txh->txh_arg1 + txh->txh_arg2 - 1) >> shift);
+ uint64_t blkid = db->db_blkid;
+
+ /* XXX txh_arg2 better not be zero... */
+
+ dprintf("found txh type %x beginblk=%llx endblk=%llx\n",
+ txh->txh_type, beginblk, endblk);
+
+ switch (txh->txh_type) {
+ case THT_WRITE:
+ if (blkid >= beginblk && blkid <= endblk)
+ match_offset = TRUE;
+ /*
+ * We will let this hold work for the bonus
+ * buffer so that we don't need to hold it
+ * when creating a new object.
+ */
+ if (blkid == DB_BONUS_BLKID)
+ match_offset = TRUE;
+ /*
+ * They might have to increase nlevels,
+ * thus dirtying the new TLIBs. Or the
+ * might have to change the block size,
+ * thus dirying the new lvl=0 blk=0.
+ */
+ if (blkid == 0)
+ match_offset = TRUE;
+ break;
+ case THT_FREE:
+ if (blkid == beginblk &&
+ (txh->txh_arg1 != 0 ||
+ dn->dn_maxblkid == 0))
+ match_offset = TRUE;
+ if (blkid == endblk &&
+ txh->txh_arg2 != DMU_OBJECT_END)
+ match_offset = TRUE;
+ break;
+ case THT_BONUS:
+ if (blkid == DB_BONUS_BLKID)
+ match_offset = TRUE;
+ break;
+ case THT_ZAP:
+ match_offset = TRUE;
+ break;
+ case THT_NEWOBJECT:
+ match_object = TRUE;
+ break;
+ default:
+ ASSERT(!"bad txh_type");
+ }
+ }
+ if (match_object && match_offset)
+ return;
+ }
+ panic("dirtying dbuf obj=%llx lvl=%u blkid=%llx but not tx_held\n",
+ (u_longlong_t)db->db.db_object, db->db_level,
+ (u_longlong_t)db->db_blkid);
+}
+#endif
+
+static int
+dmu_tx_try_assign(dmu_tx_t *tx, uint64_t txg_how)
+{
+ dmu_tx_hold_t *txh;
+ uint64_t lsize, asize, fsize, towrite, tofree, tooverwrite;
+
+ ASSERT3U(tx->tx_txg, ==, 0);
+ if (tx->tx_err)
+ return (tx->tx_err);
+
+ tx->tx_txg = txg_hold_open(tx->tx_pool, &tx->tx_txgh);
+ tx->tx_needassign_txh = NULL;
+
+ /*
+ * NB: No error returns are allowed after txg_hold_open, but
+ * before processing the dnode holds, due to the
+ * dmu_tx_unassign() logic.
+ */
+
+ towrite = tofree = tooverwrite = 0;
+ for (txh = list_head(&tx->tx_holds); txh;
+ txh = list_next(&tx->tx_holds, txh)) {
+ dnode_t *dn = txh->txh_dnode;
+ if (dn != NULL) {
+ mutex_enter(&dn->dn_mtx);
+ if (dn->dn_assigned_txg == tx->tx_txg - 1) {
+ mutex_exit(&dn->dn_mtx);
+ tx->tx_needassign_txh = txh;
+ return (ERESTART);
+ }
+ if (dn->dn_assigned_txg == 0)
+ dn->dn_assigned_txg = tx->tx_txg;
+ ASSERT3U(dn->dn_assigned_txg, ==, tx->tx_txg);
+ (void) refcount_add(&dn->dn_tx_holds, tx);
+ mutex_exit(&dn->dn_mtx);
+ }
+ towrite += txh->txh_space_towrite;
+ tofree += txh->txh_space_tofree;
+ tooverwrite += txh->txh_space_tooverwrite;
+ }
+
+ /*
+ * NB: This check must be after we've held the dnodes, so that
+ * the dmu_tx_unassign() logic will work properly
+ */
+ if (txg_how >= TXG_INITIAL && txg_how != tx->tx_txg)
+ return (ERESTART);
+
+ /*
+ * If a snapshot has been taken since we made our estimates,
+ * assume that we won't be able to free or overwrite anything.
+ */
+ if (tx->tx_objset &&
+ dsl_dataset_prev_snap_txg(tx->tx_objset->os->os_dsl_dataset) >
+ tx->tx_lastsnap_txg) {
+ towrite += tooverwrite;
+ tooverwrite = tofree = 0;
+ }
+
+ /*
+ * Convert logical size to worst-case allocated size.
+ */
+ fsize = spa_get_asize(tx->tx_pool->dp_spa, tooverwrite) + tofree;
+ lsize = towrite + tooverwrite;
+ asize = spa_get_asize(tx->tx_pool->dp_spa, lsize);
+
+#ifdef ZFS_DEBUG
+ tx->tx_space_towrite = asize;
+ tx->tx_space_tofree = tofree;
+ tx->tx_space_tooverwrite = tooverwrite;
+#endif
+
+ if (tx->tx_dir && asize != 0) {
+ int err = dsl_dir_tempreserve_space(tx->tx_dir,
+ lsize, asize, fsize, &tx->tx_tempreserve_cookie, tx);
+ if (err)
+ return (err);
+ }
+
+ return (0);
+}
+
+static void
+dmu_tx_unassign(dmu_tx_t *tx)
+{
+ dmu_tx_hold_t *txh;
+
+ if (tx->tx_txg == 0)
+ return;
+
+ txg_rele_to_quiesce(&tx->tx_txgh);
+
+ for (txh = list_head(&tx->tx_holds); txh != tx->tx_needassign_txh;
+ txh = list_next(&tx->tx_holds, txh)) {
+ dnode_t *dn = txh->txh_dnode;
+
+ if (dn == NULL)
+ continue;
+ mutex_enter(&dn->dn_mtx);
+ ASSERT3U(dn->dn_assigned_txg, ==, tx->tx_txg);
+
+ if (refcount_remove(&dn->dn_tx_holds, tx) == 0) {
+ dn->dn_assigned_txg = 0;
+ cv_broadcast(&dn->dn_notxholds);
+ }
+ mutex_exit(&dn->dn_mtx);
+ }
+
+ txg_rele_to_sync(&tx->tx_txgh);
+
+ tx->tx_lasttried_txg = tx->tx_txg;
+ tx->tx_txg = 0;
+}
+
+/*
+ * Assign tx to a transaction group. txg_how can be one of:
+ *
+ * (1) TXG_WAIT. If the current open txg is full, waits until there's
+ * a new one. This should be used when you're not holding locks.
+ * If will only fail if we're truly out of space (or over quota).
+ *
+ * (2) TXG_NOWAIT. If we can't assign into the current open txg without
+ * blocking, returns immediately with ERESTART. This should be used
+ * whenever you're holding locks. On an ERESTART error, the caller
+ * should drop locks, do a dmu_tx_wait(tx), and try again.
+ *
+ * (3) A specific txg. Use this if you need to ensure that multiple
+ * transactions all sync in the same txg. Like TXG_NOWAIT, it
+ * returns ERESTART if it can't assign you into the requested txg.
+ */
+int
+dmu_tx_assign(dmu_tx_t *tx, uint64_t txg_how)
+{
+ int err;
+
+ ASSERT(tx->tx_txg == 0);
+ ASSERT(txg_how != 0);
+ ASSERT(!dsl_pool_sync_context(tx->tx_pool));
+
+ while ((err = dmu_tx_try_assign(tx, txg_how)) != 0) {
+ dmu_tx_unassign(tx);
+
+ if (err != ERESTART || txg_how != TXG_WAIT)
+ return (err);
+
+ dmu_tx_wait(tx);
+ }
+
+ txg_rele_to_quiesce(&tx->tx_txgh);
+
+ return (0);
+}
+
+void
+dmu_tx_wait(dmu_tx_t *tx)
+{
+ ASSERT(tx->tx_txg == 0);
+ ASSERT(tx->tx_lasttried_txg != 0);
+
+ if (tx->tx_needassign_txh) {
+ dnode_t *dn = tx->tx_needassign_txh->txh_dnode;
+
+ mutex_enter(&dn->dn_mtx);
+ while (dn->dn_assigned_txg == tx->tx_lasttried_txg - 1)
+ cv_wait(&dn->dn_notxholds, &dn->dn_mtx);
+ mutex_exit(&dn->dn_mtx);
+ tx->tx_needassign_txh = NULL;
+ } else {
+ txg_wait_open(tx->tx_pool, tx->tx_lasttried_txg + 1);
+ }
+}
+
+void
+dmu_tx_willuse_space(dmu_tx_t *tx, int64_t delta)
+{
+#ifdef ZFS_DEBUG
+ if (tx->tx_dir == NULL || delta == 0)
+ return;
+
+ if (delta > 0) {
+ ASSERT3U(refcount_count(&tx->tx_space_written) + delta, <=,
+ tx->tx_space_towrite);
+ (void) refcount_add_many(&tx->tx_space_written, delta, NULL);
+ } else {
+ (void) refcount_add_many(&tx->tx_space_freed, -delta, NULL);
+ }
+#endif
+}
+
+void
+dmu_tx_commit(dmu_tx_t *tx)
+{
+ dmu_tx_hold_t *txh;
+
+ ASSERT(tx->tx_txg != 0);
+
+ while (txh = list_head(&tx->tx_holds)) {
+ dnode_t *dn = txh->txh_dnode;
+
+ list_remove(&tx->tx_holds, txh);
+ kmem_free(txh, sizeof (dmu_tx_hold_t));
+ if (dn == NULL)
+ continue;
+ mutex_enter(&dn->dn_mtx);
+ ASSERT3U(dn->dn_assigned_txg, ==, tx->tx_txg);
+
+ if (refcount_remove(&dn->dn_tx_holds, tx) == 0) {
+ dn->dn_assigned_txg = 0;
+ cv_broadcast(&dn->dn_notxholds);
+ }
+ mutex_exit(&dn->dn_mtx);
+ dnode_rele(dn, tx);
+ }
+
+ if (tx->tx_tempreserve_cookie)
+ dsl_dir_tempreserve_clear(tx->tx_tempreserve_cookie, tx);
+
+ if (tx->tx_anyobj == FALSE)
+ txg_rele_to_sync(&tx->tx_txgh);
+#ifdef ZFS_DEBUG
+ dprintf("towrite=%llu written=%llu tofree=%llu freed=%llu\n",
+ tx->tx_space_towrite, refcount_count(&tx->tx_space_written),
+ tx->tx_space_tofree, refcount_count(&tx->tx_space_freed));
+ refcount_destroy_many(&tx->tx_space_written,
+ refcount_count(&tx->tx_space_written));
+ refcount_destroy_many(&tx->tx_space_freed,
+ refcount_count(&tx->tx_space_freed));
+#endif
+ kmem_free(tx, sizeof (dmu_tx_t));
+}
+
+void
+dmu_tx_abort(dmu_tx_t *tx)
+{
+ dmu_tx_hold_t *txh;
+
+ ASSERT(tx->tx_txg == 0);
+
+ while (txh = list_head(&tx->tx_holds)) {
+ dnode_t *dn = txh->txh_dnode;
+
+ list_remove(&tx->tx_holds, txh);
+ kmem_free(txh, sizeof (dmu_tx_hold_t));
+ if (dn != NULL)
+ dnode_rele(dn, tx);
+ }
+#ifdef ZFS_DEBUG
+ refcount_destroy_many(&tx->tx_space_written,
+ refcount_count(&tx->tx_space_written));
+ refcount_destroy_many(&tx->tx_space_freed,
+ refcount_count(&tx->tx_space_freed));
+#endif
+ kmem_free(tx, sizeof (dmu_tx_t));
+}
+
+uint64_t
+dmu_tx_get_txg(dmu_tx_t *tx)
+{
+ ASSERT(tx->tx_txg != 0);
+ return (tx->tx_txg);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_zfetch.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_zfetch.c
new file mode 100644
index 0000000..78d625c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dmu_zfetch.c
@@ -0,0 +1,655 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/dnode.h>
+#include <sys/dmu_objset.h>
+#include <sys/dmu_zfetch.h>
+#include <sys/dmu.h>
+#include <sys/dbuf.h>
+
+/*
+ * I'm against tune-ables, but these should probably exist as tweakable globals
+ * until we can get this working the way we want it to.
+ */
+
+int zfs_prefetch_disable = 0;
+SYSCTL_DECL(_vfs_zfs);
+TUNABLE_INT("vfs.zfs.prefetch_disable", &zfs_prefetch_disable);
+SYSCTL_INT(_vfs_zfs, OID_AUTO, prefetch_disable, CTLFLAG_RDTUN,
+ &zfs_prefetch_disable, 0, "Disable prefetch");
+
+/* max # of streams per zfetch */
+uint32_t zfetch_max_streams = 8;
+/* min time before stream reclaim */
+uint32_t zfetch_min_sec_reap = 2;
+/* max number of blocks to fetch at a time */
+uint32_t zfetch_block_cap = 256;
+/* number of bytes in a array_read at which we stop prefetching (1Mb) */
+uint64_t zfetch_array_rd_sz = 1024 * 1024;
+
+/* forward decls for static routines */
+static int dmu_zfetch_colinear(zfetch_t *, zstream_t *);
+static void dmu_zfetch_dofetch(zfetch_t *, zstream_t *);
+static uint64_t dmu_zfetch_fetch(dnode_t *, uint64_t, uint64_t);
+static uint64_t dmu_zfetch_fetchsz(dnode_t *, uint64_t, uint64_t);
+static int dmu_zfetch_find(zfetch_t *, zstream_t *, int);
+static int dmu_zfetch_stream_insert(zfetch_t *, zstream_t *);
+static zstream_t *dmu_zfetch_stream_reclaim(zfetch_t *);
+static void dmu_zfetch_stream_remove(zfetch_t *, zstream_t *);
+static int dmu_zfetch_streams_equal(zstream_t *, zstream_t *);
+
+/*
+ * Given a zfetch structure and a zstream structure, determine whether the
+ * blocks to be read are part of a co-linear pair of existing prefetch
+ * streams. If a set is found, coalesce the streams, removing one, and
+ * configure the prefetch so it looks for a strided access pattern.
+ *
+ * In other words: if we find two sequential access streams that are
+ * the same length and distance N appart, and this read is N from the
+ * last stream, then we are probably in a strided access pattern. So
+ * combine the two sequential streams into a single strided stream.
+ *
+ * If no co-linear streams are found, return NULL.
+ */
+static int
+dmu_zfetch_colinear(zfetch_t *zf, zstream_t *zh)
+{
+ zstream_t *z_walk;
+ zstream_t *z_comp;
+
+ if (! rw_tryenter(&zf->zf_rwlock, RW_WRITER))
+ return (0);
+
+ if (zh == NULL) {
+ rw_exit(&zf->zf_rwlock);
+ return (0);
+ }
+
+ for (z_walk = list_head(&zf->zf_stream); z_walk;
+ z_walk = list_next(&zf->zf_stream, z_walk)) {
+ for (z_comp = list_next(&zf->zf_stream, z_walk); z_comp;
+ z_comp = list_next(&zf->zf_stream, z_comp)) {
+ int64_t diff;
+
+ if (z_walk->zst_len != z_walk->zst_stride ||
+ z_comp->zst_len != z_comp->zst_stride) {
+ continue;
+ }
+
+ diff = z_comp->zst_offset - z_walk->zst_offset;
+ if (z_comp->zst_offset + diff == zh->zst_offset) {
+ z_walk->zst_offset = zh->zst_offset;
+ z_walk->zst_direction = diff < 0 ? -1 : 1;
+ z_walk->zst_stride =
+ diff * z_walk->zst_direction;
+ z_walk->zst_ph_offset =
+ zh->zst_offset + z_walk->zst_stride;
+ dmu_zfetch_stream_remove(zf, z_comp);
+ mutex_destroy(&z_comp->zst_lock);
+ kmem_free(z_comp, sizeof (zstream_t));
+
+ dmu_zfetch_dofetch(zf, z_walk);
+
+ rw_exit(&zf->zf_rwlock);
+ return (1);
+ }
+
+ diff = z_walk->zst_offset - z_comp->zst_offset;
+ if (z_walk->zst_offset + diff == zh->zst_offset) {
+ z_walk->zst_offset = zh->zst_offset;
+ z_walk->zst_direction = diff < 0 ? -1 : 1;
+ z_walk->zst_stride =
+ diff * z_walk->zst_direction;
+ z_walk->zst_ph_offset =
+ zh->zst_offset + z_walk->zst_stride;
+ dmu_zfetch_stream_remove(zf, z_comp);
+ mutex_destroy(&z_comp->zst_lock);
+ kmem_free(z_comp, sizeof (zstream_t));
+
+ dmu_zfetch_dofetch(zf, z_walk);
+
+ rw_exit(&zf->zf_rwlock);
+ return (1);
+ }
+ }
+ }
+
+ rw_exit(&zf->zf_rwlock);
+ return (0);
+}
+
+/*
+ * Given a zstream_t, determine the bounds of the prefetch. Then call the
+ * routine that actually prefetches the individual blocks.
+ */
+static void
+dmu_zfetch_dofetch(zfetch_t *zf, zstream_t *zs)
+{
+ uint64_t prefetch_tail;
+ uint64_t prefetch_limit;
+ uint64_t prefetch_ofst;
+ uint64_t prefetch_len;
+ uint64_t blocks_fetched;
+
+ zs->zst_stride = MAX((int64_t)zs->zst_stride, zs->zst_len);
+ zs->zst_cap = MIN(zfetch_block_cap, 2 * zs->zst_cap);
+
+ prefetch_tail = MAX((int64_t)zs->zst_ph_offset,
+ (int64_t)(zs->zst_offset + zs->zst_stride));
+ /*
+ * XXX: use a faster division method?
+ */
+ prefetch_limit = zs->zst_offset + zs->zst_len +
+ (zs->zst_cap * zs->zst_stride) / zs->zst_len;
+
+ while (prefetch_tail < prefetch_limit) {
+ prefetch_ofst = zs->zst_offset + zs->zst_direction *
+ (prefetch_tail - zs->zst_offset);
+
+ prefetch_len = zs->zst_len;
+
+ /*
+ * Don't prefetch beyond the end of the file, if working
+ * backwards.
+ */
+ if ((zs->zst_direction == ZFETCH_BACKWARD) &&
+ (prefetch_ofst > prefetch_tail)) {
+ prefetch_len += prefetch_ofst;
+ prefetch_ofst = 0;
+ }
+
+ /* don't prefetch more than we're supposed to */
+ if (prefetch_len > zs->zst_len)
+ break;
+
+ blocks_fetched = dmu_zfetch_fetch(zf->zf_dnode,
+ prefetch_ofst, zs->zst_len);
+
+ prefetch_tail += zs->zst_stride;
+ /* stop if we've run out of stuff to prefetch */
+ if (blocks_fetched < zs->zst_len)
+ break;
+ }
+ zs->zst_ph_offset = prefetch_tail;
+ zs->zst_last = lbolt;
+}
+
+/*
+ * This takes a pointer to a zfetch structure and a dnode. It performs the
+ * necessary setup for the zfetch structure, grokking data from the
+ * associated dnode.
+ */
+void
+dmu_zfetch_init(zfetch_t *zf, dnode_t *dno)
+{
+ if (zf == NULL) {
+ return;
+ }
+
+ zf->zf_dnode = dno;
+ zf->zf_stream_cnt = 0;
+ zf->zf_alloc_fail = 0;
+
+ list_create(&zf->zf_stream, sizeof (zstream_t),
+ offsetof(zstream_t, zst_node));
+
+ rw_init(&zf->zf_rwlock, NULL, RW_DEFAULT, NULL);
+}
+
+/*
+ * This function computes the actual size, in blocks, that can be prefetched,
+ * and fetches it.
+ */
+static uint64_t
+dmu_zfetch_fetch(dnode_t *dn, uint64_t blkid, uint64_t nblks)
+{
+ uint64_t fetchsz;
+ uint64_t i;
+
+ fetchsz = dmu_zfetch_fetchsz(dn, blkid, nblks);
+
+ for (i = 0; i < fetchsz; i++) {
+ dbuf_prefetch(dn, blkid + i);
+ }
+
+ return (fetchsz);
+}
+
+/*
+ * this function returns the number of blocks that would be prefetched, based
+ * upon the supplied dnode, blockid, and nblks. This is used so that we can
+ * update streams in place, and then prefetch with their old value after the
+ * fact. This way, we can delay the prefetch, but subsequent accesses to the
+ * stream won't result in the same data being prefetched multiple times.
+ */
+static uint64_t
+dmu_zfetch_fetchsz(dnode_t *dn, uint64_t blkid, uint64_t nblks)
+{
+ uint64_t fetchsz;
+
+ if (blkid > dn->dn_maxblkid) {
+ return (0);
+ }
+
+ /* compute fetch size */
+ if (blkid + nblks + 1 > dn->dn_maxblkid) {
+ fetchsz = (dn->dn_maxblkid - blkid) + 1;
+ ASSERT(blkid + fetchsz - 1 <= dn->dn_maxblkid);
+ } else {
+ fetchsz = nblks;
+ }
+
+
+ return (fetchsz);
+}
+
+/*
+ * given a zfetch and a zsearch structure, see if there is an associated zstream
+ * for this block read. If so, it starts a prefetch for the stream it
+ * located and returns true, otherwise it returns false
+ */
+static int
+dmu_zfetch_find(zfetch_t *zf, zstream_t *zh, int prefetched)
+{
+ zstream_t *zs;
+ int64_t diff;
+ int reset = !prefetched;
+ int rc = 0;
+
+ if (zh == NULL)
+ return (0);
+
+ /*
+ * XXX: This locking strategy is a bit coarse; however, it's impact has
+ * yet to be tested. If this turns out to be an issue, it can be
+ * modified in a number of different ways.
+ */
+
+ rw_enter(&zf->zf_rwlock, RW_READER);
+top:
+
+ for (zs = list_head(&zf->zf_stream); zs;
+ zs = list_next(&zf->zf_stream, zs)) {
+
+ /*
+ * XXX - should this be an assert?
+ */
+ if (zs->zst_len == 0) {
+ /* bogus stream */
+ continue;
+ }
+
+ /*
+ * We hit this case when we are in a strided prefetch stream:
+ * we will read "len" blocks before "striding".
+ */
+ if (zh->zst_offset >= zs->zst_offset &&
+ zh->zst_offset < zs->zst_offset + zs->zst_len) {
+ /* already fetched */
+ rc = 1;
+ goto out;
+ }
+
+ /*
+ * This is the forward sequential read case: we increment
+ * len by one each time we hit here, so we will enter this
+ * case on every read.
+ */
+ if (zh->zst_offset == zs->zst_offset + zs->zst_len) {
+
+ reset = !prefetched && zs->zst_len > 1;
+
+ mutex_enter(&zs->zst_lock);
+
+ if (zh->zst_offset != zs->zst_offset + zs->zst_len) {
+ mutex_exit(&zs->zst_lock);
+ goto top;
+ }
+ zs->zst_len += zh->zst_len;
+ diff = zs->zst_len - zfetch_block_cap;
+ if (diff > 0) {
+ zs->zst_offset += diff;
+ zs->zst_len = zs->zst_len > diff ?
+ zs->zst_len - diff : 0;
+ }
+ zs->zst_direction = ZFETCH_FORWARD;
+
+ break;
+
+ /*
+ * Same as above, but reading backwards through the file.
+ */
+ } else if (zh->zst_offset == zs->zst_offset - zh->zst_len) {
+ /* backwards sequential access */
+
+ reset = !prefetched && zs->zst_len > 1;
+
+ mutex_enter(&zs->zst_lock);
+
+ if (zh->zst_offset != zs->zst_offset - zh->zst_len) {
+ mutex_exit(&zs->zst_lock);
+ goto top;
+ }
+
+ zs->zst_offset = zs->zst_offset > zh->zst_len ?
+ zs->zst_offset - zh->zst_len : 0;
+ zs->zst_ph_offset = zs->zst_ph_offset > zh->zst_len ?
+ zs->zst_ph_offset - zh->zst_len : 0;
+ zs->zst_len += zh->zst_len;
+
+ diff = zs->zst_len - zfetch_block_cap;
+ if (diff > 0) {
+ zs->zst_ph_offset = zs->zst_ph_offset > diff ?
+ zs->zst_ph_offset - diff : 0;
+ zs->zst_len = zs->zst_len > diff ?
+ zs->zst_len - diff : zs->zst_len;
+ }
+ zs->zst_direction = ZFETCH_BACKWARD;
+
+ break;
+
+ } else if ((zh->zst_offset - zs->zst_offset - zs->zst_stride <
+ zs->zst_len) && (zs->zst_len != zs->zst_stride)) {
+ /* strided forward access */
+
+ mutex_enter(&zs->zst_lock);
+
+ if ((zh->zst_offset - zs->zst_offset - zs->zst_stride >=
+ zs->zst_len) || (zs->zst_len == zs->zst_stride)) {
+ mutex_exit(&zs->zst_lock);
+ goto top;
+ }
+
+ zs->zst_offset += zs->zst_stride;
+ zs->zst_direction = ZFETCH_FORWARD;
+
+ break;
+
+ } else if ((zh->zst_offset - zs->zst_offset + zs->zst_stride <
+ zs->zst_len) && (zs->zst_len != zs->zst_stride)) {
+ /* strided reverse access */
+
+ mutex_enter(&zs->zst_lock);
+
+ if ((zh->zst_offset - zs->zst_offset + zs->zst_stride >=
+ zs->zst_len) || (zs->zst_len == zs->zst_stride)) {
+ mutex_exit(&zs->zst_lock);
+ goto top;
+ }
+
+ zs->zst_offset = zs->zst_offset > zs->zst_stride ?
+ zs->zst_offset - zs->zst_stride : 0;
+ zs->zst_ph_offset = (zs->zst_ph_offset >
+ (2 * zs->zst_stride)) ?
+ (zs->zst_ph_offset - (2 * zs->zst_stride)) : 0;
+ zs->zst_direction = ZFETCH_BACKWARD;
+
+ break;
+ }
+ }
+
+ if (zs) {
+ if (reset) {
+ zstream_t *remove = zs;
+
+ rc = 0;
+ mutex_exit(&zs->zst_lock);
+ rw_exit(&zf->zf_rwlock);
+ rw_enter(&zf->zf_rwlock, RW_WRITER);
+ /*
+ * Relocate the stream, in case someone removes
+ * it while we were acquiring the WRITER lock.
+ */
+ for (zs = list_head(&zf->zf_stream); zs;
+ zs = list_next(&zf->zf_stream, zs)) {
+ if (zs == remove) {
+ dmu_zfetch_stream_remove(zf, zs);
+ mutex_destroy(&zs->zst_lock);
+ kmem_free(zs, sizeof (zstream_t));
+ break;
+ }
+ }
+ } else {
+ rc = 1;
+ dmu_zfetch_dofetch(zf, zs);
+ mutex_exit(&zs->zst_lock);
+ }
+ }
+out:
+ rw_exit(&zf->zf_rwlock);
+ return (rc);
+}
+
+/*
+ * Clean-up state associated with a zfetch structure. This frees allocated
+ * structure members, empties the zf_stream tree, and generally makes things
+ * nice. This doesn't free the zfetch_t itself, that's left to the caller.
+ */
+void
+dmu_zfetch_rele(zfetch_t *zf)
+{
+ zstream_t *zs;
+ zstream_t *zs_next;
+
+ ASSERT(!RW_LOCK_HELD(&zf->zf_rwlock));
+
+ for (zs = list_head(&zf->zf_stream); zs; zs = zs_next) {
+ zs_next = list_next(&zf->zf_stream, zs);
+
+ list_remove(&zf->zf_stream, zs);
+ mutex_destroy(&zs->zst_lock);
+ kmem_free(zs, sizeof (zstream_t));
+ }
+ list_destroy(&zf->zf_stream);
+ rw_destroy(&zf->zf_rwlock);
+
+ zf->zf_dnode = NULL;
+}
+
+/*
+ * Given a zfetch and zstream structure, insert the zstream structure into the
+ * AVL tree contained within the zfetch structure. Peform the appropriate
+ * book-keeping. It is possible that another thread has inserted a stream which
+ * matches one that we are about to insert, so we must be sure to check for this
+ * case. If one is found, return failure, and let the caller cleanup the
+ * duplicates.
+ */
+static int
+dmu_zfetch_stream_insert(zfetch_t *zf, zstream_t *zs)
+{
+ zstream_t *zs_walk;
+ zstream_t *zs_next;
+
+ ASSERT(RW_WRITE_HELD(&zf->zf_rwlock));
+
+ for (zs_walk = list_head(&zf->zf_stream); zs_walk; zs_walk = zs_next) {
+ zs_next = list_next(&zf->zf_stream, zs_walk);
+
+ if (dmu_zfetch_streams_equal(zs_walk, zs)) {
+ return (0);
+ }
+ }
+
+ list_insert_head(&zf->zf_stream, zs);
+ zf->zf_stream_cnt++;
+
+ return (1);
+}
+
+
+/*
+ * Walk the list of zstreams in the given zfetch, find an old one (by time), and
+ * reclaim it for use by the caller.
+ */
+static zstream_t *
+dmu_zfetch_stream_reclaim(zfetch_t *zf)
+{
+ zstream_t *zs;
+
+ if (! rw_tryenter(&zf->zf_rwlock, RW_WRITER))
+ return (0);
+
+ for (zs = list_head(&zf->zf_stream); zs;
+ zs = list_next(&zf->zf_stream, zs)) {
+
+ if (((lbolt - zs->zst_last) / hz) > zfetch_min_sec_reap)
+ break;
+ }
+
+ if (zs) {
+ dmu_zfetch_stream_remove(zf, zs);
+ mutex_destroy(&zs->zst_lock);
+ bzero(zs, sizeof (zstream_t));
+ } else {
+ zf->zf_alloc_fail++;
+ }
+ rw_exit(&zf->zf_rwlock);
+
+ return (zs);
+}
+
+/*
+ * Given a zfetch and zstream structure, remove the zstream structure from its
+ * container in the zfetch structure. Perform the appropriate book-keeping.
+ */
+static void
+dmu_zfetch_stream_remove(zfetch_t *zf, zstream_t *zs)
+{
+ ASSERT(RW_WRITE_HELD(&zf->zf_rwlock));
+
+ list_remove(&zf->zf_stream, zs);
+ zf->zf_stream_cnt--;
+}
+
+static int
+dmu_zfetch_streams_equal(zstream_t *zs1, zstream_t *zs2)
+{
+ if (zs1->zst_offset != zs2->zst_offset)
+ return (0);
+
+ if (zs1->zst_len != zs2->zst_len)
+ return (0);
+
+ if (zs1->zst_stride != zs2->zst_stride)
+ return (0);
+
+ if (zs1->zst_ph_offset != zs2->zst_ph_offset)
+ return (0);
+
+ if (zs1->zst_cap != zs2->zst_cap)
+ return (0);
+
+ if (zs1->zst_direction != zs2->zst_direction)
+ return (0);
+
+ return (1);
+}
+
+/*
+ * This is the prefetch entry point. It calls all of the other dmu_zfetch
+ * routines to create, delete, find, or operate upon prefetch streams.
+ */
+void
+dmu_zfetch(zfetch_t *zf, uint64_t offset, uint64_t size, int prefetched)
+{
+ zstream_t zst;
+ zstream_t *newstream;
+ int fetched;
+ int inserted;
+ unsigned int blkshft;
+ uint64_t blksz;
+
+ if (zfs_prefetch_disable)
+ return;
+
+ /* files that aren't ln2 blocksz are only one block -- nothing to do */
+ if (!zf->zf_dnode->dn_datablkshift)
+ return;
+
+ /* convert offset and size, into blockid and nblocks */
+ blkshft = zf->zf_dnode->dn_datablkshift;
+ blksz = (1 << blkshft);
+
+ bzero(&zst, sizeof (zstream_t));
+ zst.zst_offset = offset >> blkshft;
+ zst.zst_len = (P2ROUNDUP(offset + size, blksz) -
+ P2ALIGN(offset, blksz)) >> blkshft;
+
+ fetched = dmu_zfetch_find(zf, &zst, prefetched);
+ if (!fetched) {
+ fetched = dmu_zfetch_colinear(zf, &zst);
+ }
+
+ if (!fetched) {
+ newstream = dmu_zfetch_stream_reclaim(zf);
+
+ /*
+ * we still couldn't find a stream, drop the lock, and allocate
+ * one if possible. Otherwise, give up and go home.
+ */
+ if (newstream == NULL) {
+ uint64_t maxblocks;
+ uint32_t max_streams;
+ uint32_t cur_streams;
+
+ cur_streams = zf->zf_stream_cnt;
+ maxblocks = zf->zf_dnode->dn_maxblkid;
+
+ max_streams = MIN(zfetch_max_streams,
+ (maxblocks / zfetch_block_cap));
+ if (max_streams == 0) {
+ max_streams++;
+ }
+
+ if (cur_streams >= max_streams) {
+ return;
+ }
+
+ newstream = kmem_zalloc(sizeof (zstream_t), KM_SLEEP);
+ }
+
+ newstream->zst_offset = zst.zst_offset;
+ newstream->zst_len = zst.zst_len;
+ newstream->zst_stride = zst.zst_len;
+ newstream->zst_ph_offset = zst.zst_len + zst.zst_offset;
+ newstream->zst_cap = zst.zst_len;
+ newstream->zst_direction = ZFETCH_FORWARD;
+ newstream->zst_last = lbolt;
+
+ mutex_init(&newstream->zst_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ rw_enter(&zf->zf_rwlock, RW_WRITER);
+ inserted = dmu_zfetch_stream_insert(zf, newstream);
+ rw_exit(&zf->zf_rwlock);
+
+ if (!inserted) {
+ mutex_destroy(&newstream->zst_lock);
+ kmem_free(newstream, sizeof (zstream_t));
+ }
+ }
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dnode.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dnode.c
new file mode 100644
index 0000000..ca50285
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dnode.c
@@ -0,0 +1,1369 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/dbuf.h>
+#include <sys/dnode.h>
+#include <sys/dmu.h>
+#include <sys/dmu_impl.h>
+#include <sys/dmu_tx.h>
+#include <sys/dmu_objset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_dataset.h>
+#include <sys/spa.h>
+#include <sys/zio.h>
+#include <sys/dmu_zfetch.h>
+
+static int free_range_compar(const void *node1, const void *node2);
+
+static kmem_cache_t *dnode_cache;
+
+static dnode_phys_t dnode_phys_zero;
+
+int zfs_default_bs = SPA_MINBLOCKSHIFT;
+int zfs_default_ibs = DN_MAX_INDBLKSHIFT;
+
+/* ARGSUSED */
+static int
+dnode_cons(void *arg, void *unused, int kmflag)
+{
+ int i;
+ dnode_t *dn = arg;
+ bzero(dn, sizeof (dnode_t));
+
+ cv_init(&dn->dn_notxholds, NULL, CV_DEFAULT, NULL);
+ rw_init(&dn->dn_struct_rwlock, NULL, RW_DEFAULT, NULL);
+ mutex_init(&dn->dn_mtx, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&dn->dn_dbufs_mtx, NULL, MUTEX_DEFAULT, NULL);
+ refcount_create(&dn->dn_holds);
+ refcount_create(&dn->dn_tx_holds);
+
+ for (i = 0; i < TXG_SIZE; i++) {
+ avl_create(&dn->dn_ranges[i], free_range_compar,
+ sizeof (free_range_t),
+ offsetof(struct free_range, fr_node));
+ list_create(&dn->dn_dirty_records[i],
+ sizeof (dbuf_dirty_record_t),
+ offsetof(dbuf_dirty_record_t, dr_dirty_node));
+ }
+
+ list_create(&dn->dn_dbufs, sizeof (dmu_buf_impl_t),
+ offsetof(dmu_buf_impl_t, db_link));
+
+ return (0);
+}
+
+/* ARGSUSED */
+static void
+dnode_dest(void *arg, void *unused)
+{
+ int i;
+ dnode_t *dn = arg;
+
+ cv_destroy(&dn->dn_notxholds);
+ rw_destroy(&dn->dn_struct_rwlock);
+ mutex_destroy(&dn->dn_mtx);
+ mutex_destroy(&dn->dn_dbufs_mtx);
+ refcount_destroy(&dn->dn_holds);
+ refcount_destroy(&dn->dn_tx_holds);
+
+ for (i = 0; i < TXG_SIZE; i++) {
+ avl_destroy(&dn->dn_ranges[i]);
+ list_destroy(&dn->dn_dirty_records[i]);
+ }
+
+ list_destroy(&dn->dn_dbufs);
+}
+
+void
+dnode_init(void)
+{
+ dnode_cache = kmem_cache_create("dnode_t",
+ sizeof (dnode_t),
+ 0, dnode_cons, dnode_dest, NULL, NULL, NULL, 0);
+}
+
+void
+dnode_fini(void)
+{
+ kmem_cache_destroy(dnode_cache);
+}
+
+
+#ifdef ZFS_DEBUG
+void
+dnode_verify(dnode_t *dn)
+{
+ int drop_struct_lock = FALSE;
+
+ ASSERT(dn->dn_phys);
+ ASSERT(dn->dn_objset);
+
+ ASSERT(dn->dn_phys->dn_type < DMU_OT_NUMTYPES);
+
+ if (!(zfs_flags & ZFS_DEBUG_DNODE_VERIFY))
+ return;
+
+ if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ drop_struct_lock = TRUE;
+ }
+ if (dn->dn_phys->dn_type != DMU_OT_NONE || dn->dn_allocated_txg != 0) {
+ int i;
+ ASSERT3U(dn->dn_indblkshift, >=, 0);
+ ASSERT3U(dn->dn_indblkshift, <=, SPA_MAXBLOCKSHIFT);
+ if (dn->dn_datablkshift) {
+ ASSERT3U(dn->dn_datablkshift, >=, SPA_MINBLOCKSHIFT);
+ ASSERT3U(dn->dn_datablkshift, <=, SPA_MAXBLOCKSHIFT);
+ ASSERT3U(1<<dn->dn_datablkshift, ==, dn->dn_datablksz);
+ }
+ ASSERT3U(dn->dn_nlevels, <=, 30);
+ ASSERT3U(dn->dn_type, <=, DMU_OT_NUMTYPES);
+ ASSERT3U(dn->dn_nblkptr, >=, 1);
+ ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
+ ASSERT3U(dn->dn_bonuslen, <=, DN_MAX_BONUSLEN);
+ ASSERT3U(dn->dn_datablksz, ==,
+ dn->dn_datablkszsec << SPA_MINBLOCKSHIFT);
+ ASSERT3U(ISP2(dn->dn_datablksz), ==, dn->dn_datablkshift != 0);
+ ASSERT3U((dn->dn_nblkptr - 1) * sizeof (blkptr_t) +
+ dn->dn_bonuslen, <=, DN_MAX_BONUSLEN);
+ for (i = 0; i < TXG_SIZE; i++) {
+ ASSERT3U(dn->dn_next_nlevels[i], <=, dn->dn_nlevels);
+ }
+ }
+ if (dn->dn_phys->dn_type != DMU_OT_NONE)
+ ASSERT3U(dn->dn_phys->dn_nlevels, <=, dn->dn_nlevels);
+ ASSERT(dn->dn_object == DMU_META_DNODE_OBJECT || dn->dn_dbuf != NULL);
+ if (dn->dn_dbuf != NULL) {
+ ASSERT3P(dn->dn_phys, ==,
+ (dnode_phys_t *)dn->dn_dbuf->db.db_data +
+ (dn->dn_object % (dn->dn_dbuf->db.db_size >> DNODE_SHIFT)));
+ }
+ if (drop_struct_lock)
+ rw_exit(&dn->dn_struct_rwlock);
+}
+#endif
+
+void
+dnode_byteswap(dnode_phys_t *dnp)
+{
+ uint64_t *buf64 = (void*)&dnp->dn_blkptr;
+ int i;
+
+ if (dnp->dn_type == DMU_OT_NONE) {
+ bzero(dnp, sizeof (dnode_phys_t));
+ return;
+ }
+
+ dnp->dn_datablkszsec = BSWAP_16(dnp->dn_datablkszsec);
+ dnp->dn_bonuslen = BSWAP_16(dnp->dn_bonuslen);
+ dnp->dn_maxblkid = BSWAP_64(dnp->dn_maxblkid);
+ dnp->dn_used = BSWAP_64(dnp->dn_used);
+
+ /*
+ * dn_nblkptr is only one byte, so it's OK to read it in either
+ * byte order. We can't read dn_bouslen.
+ */
+ ASSERT(dnp->dn_indblkshift <= SPA_MAXBLOCKSHIFT);
+ ASSERT(dnp->dn_nblkptr <= DN_MAX_NBLKPTR);
+ for (i = 0; i < dnp->dn_nblkptr * sizeof (blkptr_t)/8; i++)
+ buf64[i] = BSWAP_64(buf64[i]);
+
+ /*
+ * OK to check dn_bonuslen for zero, because it won't matter if
+ * we have the wrong byte order. This is necessary because the
+ * dnode dnode is smaller than a regular dnode.
+ */
+ if (dnp->dn_bonuslen != 0) {
+ /*
+ * Note that the bonus length calculated here may be
+ * longer than the actual bonus buffer. This is because
+ * we always put the bonus buffer after the last block
+ * pointer (instead of packing it against the end of the
+ * dnode buffer).
+ */
+ int off = (dnp->dn_nblkptr-1) * sizeof (blkptr_t);
+ size_t len = DN_MAX_BONUSLEN - off;
+ ASSERT3U(dnp->dn_bonustype, <, DMU_OT_NUMTYPES);
+ dmu_ot[dnp->dn_bonustype].ot_byteswap(dnp->dn_bonus + off, len);
+ }
+}
+
+void
+dnode_buf_byteswap(void *vbuf, size_t size)
+{
+ dnode_phys_t *buf = vbuf;
+ int i;
+
+ ASSERT3U(sizeof (dnode_phys_t), ==, (1<<DNODE_SHIFT));
+ ASSERT((size & (sizeof (dnode_phys_t)-1)) == 0);
+
+ size >>= DNODE_SHIFT;
+ for (i = 0; i < size; i++) {
+ dnode_byteswap(buf);
+ buf++;
+ }
+}
+
+static int
+free_range_compar(const void *node1, const void *node2)
+{
+ const free_range_t *rp1 = node1;
+ const free_range_t *rp2 = node2;
+
+ if (rp1->fr_blkid < rp2->fr_blkid)
+ return (-1);
+ else if (rp1->fr_blkid > rp2->fr_blkid)
+ return (1);
+ else return (0);
+}
+
+static void
+dnode_setdblksz(dnode_t *dn, int size)
+{
+ ASSERT3U(P2PHASE(size, SPA_MINBLOCKSIZE), ==, 0);
+ ASSERT3U(size, <=, SPA_MAXBLOCKSIZE);
+ ASSERT3U(size, >=, SPA_MINBLOCKSIZE);
+ ASSERT3U(size >> SPA_MINBLOCKSHIFT, <,
+ 1<<(sizeof (dn->dn_phys->dn_datablkszsec) * 8));
+ dn->dn_datablksz = size;
+ dn->dn_datablkszsec = size >> SPA_MINBLOCKSHIFT;
+ dn->dn_datablkshift = ISP2(size) ? highbit(size - 1) : 0;
+}
+
+static dnode_t *
+dnode_create(objset_impl_t *os, dnode_phys_t *dnp, dmu_buf_impl_t *db,
+ uint64_t object)
+{
+ dnode_t *dn = kmem_cache_alloc(dnode_cache, KM_SLEEP);
+
+ dn->dn_objset = os;
+ dn->dn_object = object;
+ dn->dn_dbuf = db;
+ dn->dn_phys = dnp;
+
+ if (dnp->dn_datablkszsec)
+ dnode_setdblksz(dn, dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT);
+ dn->dn_indblkshift = dnp->dn_indblkshift;
+ dn->dn_nlevels = dnp->dn_nlevels;
+ dn->dn_type = dnp->dn_type;
+ dn->dn_nblkptr = dnp->dn_nblkptr;
+ dn->dn_checksum = dnp->dn_checksum;
+ dn->dn_compress = dnp->dn_compress;
+ dn->dn_bonustype = dnp->dn_bonustype;
+ dn->dn_bonuslen = dnp->dn_bonuslen;
+ dn->dn_maxblkid = dnp->dn_maxblkid;
+
+ dmu_zfetch_init(&dn->dn_zfetch, dn);
+
+ ASSERT(dn->dn_phys->dn_type < DMU_OT_NUMTYPES);
+ mutex_enter(&os->os_lock);
+ list_insert_head(&os->os_dnodes, dn);
+ mutex_exit(&os->os_lock);
+
+ return (dn);
+}
+
+static void
+dnode_destroy(dnode_t *dn)
+{
+ objset_impl_t *os = dn->dn_objset;
+
+#ifdef ZFS_DEBUG
+ int i;
+
+ for (i = 0; i < TXG_SIZE; i++) {
+ ASSERT(!list_link_active(&dn->dn_dirty_link[i]));
+ ASSERT(NULL == list_head(&dn->dn_dirty_records[i]));
+ ASSERT(0 == avl_numnodes(&dn->dn_ranges[i]));
+ }
+ ASSERT(NULL == list_head(&dn->dn_dbufs));
+#endif
+
+ mutex_enter(&os->os_lock);
+ list_remove(&os->os_dnodes, dn);
+ mutex_exit(&os->os_lock);
+
+ if (dn->dn_dirtyctx_firstset) {
+ kmem_free(dn->dn_dirtyctx_firstset, 1);
+ dn->dn_dirtyctx_firstset = NULL;
+ }
+ dmu_zfetch_rele(&dn->dn_zfetch);
+ if (dn->dn_bonus) {
+ mutex_enter(&dn->dn_bonus->db_mtx);
+ dbuf_evict(dn->dn_bonus);
+ dn->dn_bonus = NULL;
+ }
+ kmem_cache_free(dnode_cache, dn);
+}
+
+void
+dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs,
+ dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx)
+{
+ int i;
+
+ if (blocksize == 0)
+ blocksize = 1 << zfs_default_bs;
+ else if (blocksize > SPA_MAXBLOCKSIZE)
+ blocksize = SPA_MAXBLOCKSIZE;
+ else
+ blocksize = P2ROUNDUP(blocksize, SPA_MINBLOCKSIZE);
+
+ if (ibs == 0)
+ ibs = zfs_default_ibs;
+
+ ibs = MIN(MAX(ibs, DN_MIN_INDBLKSHIFT), DN_MAX_INDBLKSHIFT);
+
+ dprintf("os=%p obj=%llu txg=%llu blocksize=%d ibs=%d\n", dn->dn_objset,
+ dn->dn_object, tx->tx_txg, blocksize, ibs);
+
+ ASSERT(dn->dn_type == DMU_OT_NONE);
+ ASSERT(bcmp(dn->dn_phys, &dnode_phys_zero, sizeof (dnode_phys_t)) == 0);
+ ASSERT(dn->dn_phys->dn_type == DMU_OT_NONE);
+ ASSERT(ot != DMU_OT_NONE);
+ ASSERT3U(ot, <, DMU_OT_NUMTYPES);
+ ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
+ (bonustype != DMU_OT_NONE && bonuslen != 0));
+ ASSERT3U(bonustype, <, DMU_OT_NUMTYPES);
+ ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN);
+ ASSERT(dn->dn_type == DMU_OT_NONE);
+ ASSERT3U(dn->dn_maxblkid, ==, 0);
+ ASSERT3U(dn->dn_allocated_txg, ==, 0);
+ ASSERT3U(dn->dn_assigned_txg, ==, 0);
+ ASSERT(refcount_is_zero(&dn->dn_tx_holds));
+ ASSERT3U(refcount_count(&dn->dn_holds), <=, 1);
+ ASSERT3P(list_head(&dn->dn_dbufs), ==, NULL);
+
+ for (i = 0; i < TXG_SIZE; i++) {
+ ASSERT3U(dn->dn_next_nlevels[i], ==, 0);
+ ASSERT3U(dn->dn_next_indblkshift[i], ==, 0);
+ ASSERT3U(dn->dn_next_blksz[i], ==, 0);
+ ASSERT(!list_link_active(&dn->dn_dirty_link[i]));
+ ASSERT3P(list_head(&dn->dn_dirty_records[i]), ==, NULL);
+ ASSERT3U(avl_numnodes(&dn->dn_ranges[i]), ==, 0);
+ }
+
+ dn->dn_type = ot;
+ dnode_setdblksz(dn, blocksize);
+ dn->dn_indblkshift = ibs;
+ dn->dn_nlevels = 1;
+ dn->dn_nblkptr = 1 + ((DN_MAX_BONUSLEN - bonuslen) >> SPA_BLKPTRSHIFT);
+ dn->dn_bonustype = bonustype;
+ dn->dn_bonuslen = bonuslen;
+ dn->dn_checksum = ZIO_CHECKSUM_INHERIT;
+ dn->dn_compress = ZIO_COMPRESS_INHERIT;
+ dn->dn_dirtyctx = 0;
+
+ dn->dn_free_txg = 0;
+ if (dn->dn_dirtyctx_firstset) {
+ kmem_free(dn->dn_dirtyctx_firstset, 1);
+ dn->dn_dirtyctx_firstset = NULL;
+ }
+
+ dn->dn_allocated_txg = tx->tx_txg;
+
+ dnode_setdirty(dn, tx);
+ dn->dn_next_indblkshift[tx->tx_txg & TXG_MASK] = ibs;
+ dn->dn_next_blksz[tx->tx_txg & TXG_MASK] = dn->dn_datablksz;
+}
+
+void
+dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize,
+ dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx)
+{
+ int i;
+ dmu_buf_impl_t *db = NULL;
+
+ ASSERT3U(blocksize, >=, SPA_MINBLOCKSIZE);
+ ASSERT3U(blocksize, <=, SPA_MAXBLOCKSIZE);
+ ASSERT3U(blocksize % SPA_MINBLOCKSIZE, ==, 0);
+ ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT || dmu_tx_private_ok(tx));
+ ASSERT(tx->tx_txg != 0);
+ ASSERT((bonustype == DMU_OT_NONE && bonuslen == 0) ||
+ (bonustype != DMU_OT_NONE && bonuslen != 0));
+ ASSERT3U(bonustype, <, DMU_OT_NUMTYPES);
+ ASSERT3U(bonuslen, <=, DN_MAX_BONUSLEN);
+
+ for (i = 0; i < TXG_SIZE; i++)
+ ASSERT(!list_link_active(&dn->dn_dirty_link[i]));
+
+ /* clean up any unreferenced dbufs */
+ (void) dnode_evict_dbufs(dn, 0);
+ ASSERT3P(list_head(&dn->dn_dbufs), ==, NULL);
+
+ /*
+ * XXX I should really have a generation number to tell if we
+ * need to do this...
+ */
+ if (blocksize != dn->dn_datablksz ||
+ dn->dn_bonustype != bonustype || dn->dn_bonuslen != bonuslen) {
+ /* free all old data */
+ dnode_free_range(dn, 0, -1ULL, tx);
+ }
+
+ /* change blocksize */
+ rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
+ if (blocksize != dn->dn_datablksz &&
+ (!BP_IS_HOLE(&dn->dn_phys->dn_blkptr[0]) ||
+ list_head(&dn->dn_dbufs) != NULL)) {
+ db = dbuf_hold(dn, 0, FTAG);
+ dbuf_new_size(db, blocksize, tx);
+ }
+ dnode_setdblksz(dn, blocksize);
+ dnode_setdirty(dn, tx);
+ dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = blocksize;
+ rw_exit(&dn->dn_struct_rwlock);
+ if (db) {
+ dbuf_rele(db, FTAG);
+ db = NULL;
+ }
+
+ /* change type */
+ dn->dn_type = ot;
+
+ if (dn->dn_bonuslen != bonuslen) {
+ /* change bonus size */
+ if (bonuslen == 0)
+ bonuslen = 1; /* XXX */
+ rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
+ if (dn->dn_bonus == NULL)
+ dn->dn_bonus = dbuf_create_bonus(dn);
+ db = dn->dn_bonus;
+ rw_exit(&dn->dn_struct_rwlock);
+ if (refcount_add(&db->db_holds, FTAG) == 1)
+ dnode_add_ref(dn, db);
+ VERIFY(0 == dbuf_read(db, NULL, DB_RF_MUST_SUCCEED));
+ mutex_enter(&db->db_mtx);
+ ASSERT3U(db->db.db_size, ==, dn->dn_bonuslen);
+ ASSERT(db->db.db_data != NULL);
+ db->db.db_size = bonuslen;
+ mutex_exit(&db->db_mtx);
+ (void) dbuf_dirty(db, tx);
+ }
+
+ /* change bonus size and type */
+ mutex_enter(&dn->dn_mtx);
+ dn->dn_bonustype = bonustype;
+ dn->dn_bonuslen = bonuslen;
+ dn->dn_nblkptr = 1 + ((DN_MAX_BONUSLEN - bonuslen) >> SPA_BLKPTRSHIFT);
+ dn->dn_checksum = ZIO_CHECKSUM_INHERIT;
+ dn->dn_compress = ZIO_COMPRESS_INHERIT;
+ ASSERT3U(dn->dn_nblkptr, <=, DN_MAX_NBLKPTR);
+
+ /*
+ * NB: we have to do the dbuf_rele after we've changed the
+ * dn_bonuslen, for the sake of dbuf_verify().
+ */
+ if (db)
+ dbuf_rele(db, FTAG);
+
+ dn->dn_allocated_txg = tx->tx_txg;
+ mutex_exit(&dn->dn_mtx);
+}
+
+void
+dnode_special_close(dnode_t *dn)
+{
+ /*
+ * Wait for final references to the dnode to clear. This can
+ * only happen if the arc is asyncronously evicting state that
+ * has a hold on this dnode while we are trying to evict this
+ * dnode.
+ */
+ while (refcount_count(&dn->dn_holds) > 0)
+ delay(1);
+ dnode_destroy(dn);
+}
+
+dnode_t *
+dnode_special_open(objset_impl_t *os, dnode_phys_t *dnp, uint64_t object)
+{
+ dnode_t *dn = dnode_create(os, dnp, NULL, object);
+ DNODE_VERIFY(dn);
+ return (dn);
+}
+
+static void
+dnode_buf_pageout(dmu_buf_t *db, void *arg)
+{
+ dnode_t **children_dnodes = arg;
+ int i;
+ int epb = db->db_size >> DNODE_SHIFT;
+
+ for (i = 0; i < epb; i++) {
+ dnode_t *dn = children_dnodes[i];
+ int n;
+
+ if (dn == NULL)
+ continue;
+#ifdef ZFS_DEBUG
+ /*
+ * If there are holds on this dnode, then there should
+ * be holds on the dnode's containing dbuf as well; thus
+ * it wouldn't be eligable for eviction and this function
+ * would not have been called.
+ */
+ ASSERT(refcount_is_zero(&dn->dn_holds));
+ ASSERT(list_head(&dn->dn_dbufs) == NULL);
+ ASSERT(refcount_is_zero(&dn->dn_tx_holds));
+
+ for (n = 0; n < TXG_SIZE; n++)
+ ASSERT(!list_link_active(&dn->dn_dirty_link[n]));
+#endif
+ children_dnodes[i] = NULL;
+ dnode_destroy(dn);
+ }
+ kmem_free(children_dnodes, epb * sizeof (dnode_t *));
+}
+
+/*
+ * errors:
+ * EINVAL - invalid object number.
+ * EIO - i/o error.
+ * succeeds even for free dnodes.
+ */
+int
+dnode_hold_impl(objset_impl_t *os, uint64_t object, int flag,
+ void *tag, dnode_t **dnp)
+{
+ int epb, idx, err;
+ int drop_struct_lock = FALSE;
+ int type;
+ uint64_t blk;
+ dnode_t *mdn, *dn;
+ dmu_buf_impl_t *db;
+ dnode_t **children_dnodes;
+
+ if (object == 0 || object >= DN_MAX_OBJECT)
+ return (EINVAL);
+
+ mdn = os->os_meta_dnode;
+
+ DNODE_VERIFY(mdn);
+
+ if (!RW_WRITE_HELD(&mdn->dn_struct_rwlock)) {
+ rw_enter(&mdn->dn_struct_rwlock, RW_READER);
+ drop_struct_lock = TRUE;
+ }
+
+ blk = dbuf_whichblock(mdn, object * sizeof (dnode_phys_t));
+
+ db = dbuf_hold(mdn, blk, FTAG);
+ if (drop_struct_lock)
+ rw_exit(&mdn->dn_struct_rwlock);
+ if (db == NULL)
+ return (EIO);
+ err = dbuf_read(db, NULL, DB_RF_CANFAIL);
+ if (err) {
+ dbuf_rele(db, FTAG);
+ return (err);
+ }
+
+ ASSERT3U(db->db.db_size, >=, 1<<DNODE_SHIFT);
+ epb = db->db.db_size >> DNODE_SHIFT;
+
+ idx = object & (epb-1);
+
+ children_dnodes = dmu_buf_get_user(&db->db);
+ if (children_dnodes == NULL) {
+ dnode_t **winner;
+ children_dnodes = kmem_zalloc(epb * sizeof (dnode_t *),
+ KM_SLEEP);
+ if (winner = dmu_buf_set_user(&db->db, children_dnodes, NULL,
+ dnode_buf_pageout)) {
+ kmem_free(children_dnodes, epb * sizeof (dnode_t *));
+ children_dnodes = winner;
+ }
+ }
+
+ if ((dn = children_dnodes[idx]) == NULL) {
+ dnode_t *winner;
+ dn = dnode_create(os, (dnode_phys_t *)db->db.db_data+idx,
+ db, object);
+ winner = atomic_cas_ptr(&children_dnodes[idx], NULL, dn);
+ if (winner != NULL) {
+ dnode_destroy(dn);
+ dn = winner;
+ }
+ }
+
+ mutex_enter(&dn->dn_mtx);
+ type = dn->dn_type;
+ if (dn->dn_free_txg ||
+ ((flag & DNODE_MUST_BE_ALLOCATED) && type == DMU_OT_NONE) ||
+ ((flag & DNODE_MUST_BE_FREE) && type != DMU_OT_NONE)) {
+ mutex_exit(&dn->dn_mtx);
+ dbuf_rele(db, FTAG);
+ return (type == DMU_OT_NONE ? ENOENT : EEXIST);
+ }
+ mutex_exit(&dn->dn_mtx);
+
+ if (refcount_add(&dn->dn_holds, tag) == 1)
+ dbuf_add_ref(db, dn);
+
+ DNODE_VERIFY(dn);
+ ASSERT3P(dn->dn_dbuf, ==, db);
+ ASSERT3U(dn->dn_object, ==, object);
+ dbuf_rele(db, FTAG);
+
+ *dnp = dn;
+ return (0);
+}
+
+/*
+ * Return held dnode if the object is allocated, NULL if not.
+ */
+int
+dnode_hold(objset_impl_t *os, uint64_t object, void *tag, dnode_t **dnp)
+{
+ return (dnode_hold_impl(os, object, DNODE_MUST_BE_ALLOCATED, tag, dnp));
+}
+
+void
+dnode_add_ref(dnode_t *dn, void *tag)
+{
+ ASSERT(refcount_count(&dn->dn_holds) > 0);
+ (void) refcount_add(&dn->dn_holds, tag);
+}
+
+void
+dnode_rele(dnode_t *dn, void *tag)
+{
+ uint64_t refs;
+
+ refs = refcount_remove(&dn->dn_holds, tag);
+ /* NOTE: the DNODE_DNODE does not have a dn_dbuf */
+ if (refs == 0 && dn->dn_dbuf)
+ dbuf_rele(dn->dn_dbuf, dn);
+}
+
+void
+dnode_setdirty(dnode_t *dn, dmu_tx_t *tx)
+{
+ objset_impl_t *os = dn->dn_objset;
+ uint64_t txg = tx->tx_txg;
+
+ if (dn->dn_object == DMU_META_DNODE_OBJECT)
+ return;
+
+ DNODE_VERIFY(dn);
+
+#ifdef ZFS_DEBUG
+ mutex_enter(&dn->dn_mtx);
+ ASSERT(dn->dn_phys->dn_type || dn->dn_allocated_txg);
+ /* ASSERT(dn->dn_free_txg == 0 || dn->dn_free_txg >= txg); */
+ mutex_exit(&dn->dn_mtx);
+#endif
+
+ mutex_enter(&os->os_lock);
+
+ /*
+ * If we are already marked dirty, we're done.
+ */
+ if (list_link_active(&dn->dn_dirty_link[txg & TXG_MASK])) {
+ mutex_exit(&os->os_lock);
+ return;
+ }
+
+ ASSERT(!refcount_is_zero(&dn->dn_holds) || list_head(&dn->dn_dbufs));
+ ASSERT(dn->dn_datablksz != 0);
+ ASSERT3U(dn->dn_next_blksz[txg&TXG_MASK], ==, 0);
+
+ dprintf_ds(os->os_dsl_dataset, "obj=%llu txg=%llu\n",
+ dn->dn_object, txg);
+
+ if (dn->dn_free_txg > 0 && dn->dn_free_txg <= txg) {
+ list_insert_tail(&os->os_free_dnodes[txg&TXG_MASK], dn);
+ } else {
+ list_insert_tail(&os->os_dirty_dnodes[txg&TXG_MASK], dn);
+ }
+
+ mutex_exit(&os->os_lock);
+
+ /*
+ * The dnode maintains a hold on its containing dbuf as
+ * long as there are holds on it. Each instantiated child
+ * dbuf maintaines a hold on the dnode. When the last child
+ * drops its hold, the dnode will drop its hold on the
+ * containing dbuf. We add a "dirty hold" here so that the
+ * dnode will hang around after we finish processing its
+ * children.
+ */
+ dnode_add_ref(dn, (void *)(uintptr_t)tx->tx_txg);
+
+ (void) dbuf_dirty(dn->dn_dbuf, tx);
+
+ dsl_dataset_dirty(os->os_dsl_dataset, tx);
+}
+
+void
+dnode_free(dnode_t *dn, dmu_tx_t *tx)
+{
+ int txgoff = tx->tx_txg & TXG_MASK;
+
+ dprintf("dn=%p txg=%llu\n", dn, tx->tx_txg);
+
+ /* we should be the only holder... hopefully */
+ /* ASSERT3U(refcount_count(&dn->dn_holds), ==, 1); */
+
+ mutex_enter(&dn->dn_mtx);
+ if (dn->dn_type == DMU_OT_NONE || dn->dn_free_txg) {
+ mutex_exit(&dn->dn_mtx);
+ return;
+ }
+ dn->dn_free_txg = tx->tx_txg;
+ mutex_exit(&dn->dn_mtx);
+
+ /*
+ * If the dnode is already dirty, it needs to be moved from
+ * the dirty list to the free list.
+ */
+ mutex_enter(&dn->dn_objset->os_lock);
+ if (list_link_active(&dn->dn_dirty_link[txgoff])) {
+ list_remove(&dn->dn_objset->os_dirty_dnodes[txgoff], dn);
+ list_insert_tail(&dn->dn_objset->os_free_dnodes[txgoff], dn);
+ mutex_exit(&dn->dn_objset->os_lock);
+ } else {
+ mutex_exit(&dn->dn_objset->os_lock);
+ dnode_setdirty(dn, tx);
+ }
+}
+
+/*
+ * Try to change the block size for the indicated dnode. This can only
+ * succeed if there are no blocks allocated or dirty beyond first block
+ */
+int
+dnode_set_blksz(dnode_t *dn, uint64_t size, int ibs, dmu_tx_t *tx)
+{
+ dmu_buf_impl_t *db, *db_next;
+ int have_db0 = FALSE;
+
+ if (size == 0)
+ size = SPA_MINBLOCKSIZE;
+ if (size > SPA_MAXBLOCKSIZE)
+ size = SPA_MAXBLOCKSIZE;
+ else
+ size = P2ROUNDUP(size, SPA_MINBLOCKSIZE);
+
+ if (ibs == dn->dn_indblkshift)
+ ibs = 0;
+
+ if (size >> SPA_MINBLOCKSHIFT == dn->dn_datablkszsec && ibs == 0)
+ return (0);
+
+ rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
+
+ /* Check for any allocated blocks beyond the first */
+ if (dn->dn_phys->dn_maxblkid != 0)
+ goto fail;
+
+ mutex_enter(&dn->dn_dbufs_mtx);
+ for (db = list_head(&dn->dn_dbufs); db; db = db_next) {
+ db_next = list_next(&dn->dn_dbufs, db);
+
+ if (db->db_blkid == 0) {
+ have_db0 = TRUE;
+ } else if (db->db_blkid != DB_BONUS_BLKID) {
+ mutex_exit(&dn->dn_dbufs_mtx);
+ goto fail;
+ }
+ }
+ mutex_exit(&dn->dn_dbufs_mtx);
+
+ if (ibs && dn->dn_nlevels != 1)
+ goto fail;
+
+ db = NULL;
+ if (!BP_IS_HOLE(&dn->dn_phys->dn_blkptr[0]) || have_db0) {
+ /* obtain the old block */
+ db = dbuf_hold(dn, 0, FTAG);
+ dbuf_new_size(db, size, tx);
+ }
+
+ dnode_setdblksz(dn, size);
+ dnode_setdirty(dn, tx);
+ dn->dn_next_blksz[tx->tx_txg&TXG_MASK] = size;
+ if (ibs) {
+ dn->dn_indblkshift = ibs;
+ dn->dn_next_indblkshift[tx->tx_txg&TXG_MASK] = ibs;
+ }
+
+ if (db)
+ dbuf_rele(db, FTAG);
+
+ rw_exit(&dn->dn_struct_rwlock);
+ return (0);
+
+fail:
+ rw_exit(&dn->dn_struct_rwlock);
+ return (ENOTSUP);
+}
+
+void
+dnode_new_blkid(dnode_t *dn, uint64_t blkid, dmu_tx_t *tx)
+{
+ uint64_t txgoff = tx->tx_txg & TXG_MASK;
+ int drop_struct_lock = FALSE;
+ int epbs, new_nlevels;
+ uint64_t sz;
+
+ ASSERT(blkid != DB_BONUS_BLKID);
+
+ if (!RW_WRITE_HELD(&dn->dn_struct_rwlock)) {
+ rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
+ drop_struct_lock = TRUE;
+ }
+
+ if (blkid <= dn->dn_maxblkid)
+ goto out;
+
+ dn->dn_maxblkid = blkid;
+
+ /*
+ * Compute the number of levels necessary to support the new maxblkid.
+ */
+ new_nlevels = 1;
+ epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
+ for (sz = dn->dn_nblkptr;
+ sz <= blkid && sz >= dn->dn_nblkptr; sz <<= epbs)
+ new_nlevels++;
+
+ if (new_nlevels > dn->dn_nlevels) {
+ int old_nlevels = dn->dn_nlevels;
+ dmu_buf_impl_t *db;
+ list_t *list;
+ dbuf_dirty_record_t *new, *dr, *dr_next;
+
+ dn->dn_nlevels = new_nlevels;
+
+ ASSERT3U(new_nlevels, >, dn->dn_next_nlevels[txgoff]);
+ dn->dn_next_nlevels[txgoff] = new_nlevels;
+
+ /* dirty the left indirects */
+ db = dbuf_hold_level(dn, old_nlevels, 0, FTAG);
+ new = dbuf_dirty(db, tx);
+ dbuf_rele(db, FTAG);
+
+ /* transfer the dirty records to the new indirect */
+ mutex_enter(&dn->dn_mtx);
+ mutex_enter(&new->dt.di.dr_mtx);
+ list = &dn->dn_dirty_records[txgoff];
+ for (dr = list_head(list); dr; dr = dr_next) {
+ dr_next = list_next(&dn->dn_dirty_records[txgoff], dr);
+ if (dr->dr_dbuf->db_level != new_nlevels-1 &&
+ dr->dr_dbuf->db_blkid != DB_BONUS_BLKID) {
+ ASSERT(dr->dr_dbuf->db_level == old_nlevels-1);
+ list_remove(&dn->dn_dirty_records[txgoff], dr);
+ list_insert_tail(&new->dt.di.dr_children, dr);
+ dr->dr_parent = new;
+ }
+ }
+ mutex_exit(&new->dt.di.dr_mtx);
+ mutex_exit(&dn->dn_mtx);
+ }
+
+out:
+ if (drop_struct_lock)
+ rw_exit(&dn->dn_struct_rwlock);
+}
+
+void
+dnode_clear_range(dnode_t *dn, uint64_t blkid, uint64_t nblks, dmu_tx_t *tx)
+{
+ avl_tree_t *tree = &dn->dn_ranges[tx->tx_txg&TXG_MASK];
+ avl_index_t where;
+ free_range_t *rp;
+ free_range_t rp_tofind;
+ uint64_t endblk = blkid + nblks;
+
+ ASSERT(MUTEX_HELD(&dn->dn_mtx));
+ ASSERT(nblks <= UINT64_MAX - blkid); /* no overflow */
+
+ dprintf_dnode(dn, "blkid=%llu nblks=%llu txg=%llu\n",
+ blkid, nblks, tx->tx_txg);
+ rp_tofind.fr_blkid = blkid;
+ rp = avl_find(tree, &rp_tofind, &where);
+ if (rp == NULL)
+ rp = avl_nearest(tree, where, AVL_BEFORE);
+ if (rp == NULL)
+ rp = avl_nearest(tree, where, AVL_AFTER);
+
+ while (rp && (rp->fr_blkid <= blkid + nblks)) {
+ uint64_t fr_endblk = rp->fr_blkid + rp->fr_nblks;
+ free_range_t *nrp = AVL_NEXT(tree, rp);
+
+ if (blkid <= rp->fr_blkid && endblk >= fr_endblk) {
+ /* clear this entire range */
+ avl_remove(tree, rp);
+ kmem_free(rp, sizeof (free_range_t));
+ } else if (blkid <= rp->fr_blkid &&
+ endblk > rp->fr_blkid && endblk < fr_endblk) {
+ /* clear the beginning of this range */
+ rp->fr_blkid = endblk;
+ rp->fr_nblks = fr_endblk - endblk;
+ } else if (blkid > rp->fr_blkid && blkid < fr_endblk &&
+ endblk >= fr_endblk) {
+ /* clear the end of this range */
+ rp->fr_nblks = blkid - rp->fr_blkid;
+ } else if (blkid > rp->fr_blkid && endblk < fr_endblk) {
+ /* clear a chunk out of this range */
+ free_range_t *new_rp =
+ kmem_alloc(sizeof (free_range_t), KM_SLEEP);
+
+ new_rp->fr_blkid = endblk;
+ new_rp->fr_nblks = fr_endblk - endblk;
+ avl_insert_here(tree, new_rp, rp, AVL_AFTER);
+ rp->fr_nblks = blkid - rp->fr_blkid;
+ }
+ /* there may be no overlap */
+ rp = nrp;
+ }
+}
+
+void
+dnode_free_range(dnode_t *dn, uint64_t off, uint64_t len, dmu_tx_t *tx)
+{
+ dmu_buf_impl_t *db;
+ uint64_t blkoff, blkid, nblks;
+ int blksz, head;
+ int trunc = FALSE;
+
+ rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
+ blksz = dn->dn_datablksz;
+
+ /* If the range is past the end of the file, this is a no-op */
+ if (off >= blksz * (dn->dn_maxblkid+1))
+ goto out;
+ if (len == -1ULL) {
+ len = UINT64_MAX - off;
+ trunc = TRUE;
+ }
+
+ /*
+ * First, block align the region to free:
+ */
+ if (ISP2(blksz)) {
+ head = P2NPHASE(off, blksz);
+ blkoff = P2PHASE(off, blksz);
+ } else {
+ ASSERT(dn->dn_maxblkid == 0);
+ if (off == 0 && len >= blksz) {
+ /* Freeing the whole block; don't do any head. */
+ head = 0;
+ } else {
+ /* Freeing part of the block. */
+ head = blksz - off;
+ ASSERT3U(head, >, 0);
+ }
+ blkoff = off;
+ }
+ /* zero out any partial block data at the start of the range */
+ if (head) {
+ ASSERT3U(blkoff + head, ==, blksz);
+ if (len < head)
+ head = len;
+ if (dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, off), TRUE,
+ FTAG, &db) == 0) {
+ caddr_t data;
+
+ /* don't dirty if it isn't on disk and isn't dirty */
+ if (db->db_last_dirty ||
+ (db->db_blkptr && !BP_IS_HOLE(db->db_blkptr))) {
+ rw_exit(&dn->dn_struct_rwlock);
+ dbuf_will_dirty(db, tx);
+ rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
+ data = db->db.db_data;
+ bzero(data + blkoff, head);
+ }
+ dbuf_rele(db, FTAG);
+ }
+ off += head;
+ len -= head;
+ }
+
+ /* If the range was less than one block, we're done */
+ if (len == 0 || off >= blksz * (dn->dn_maxblkid+1))
+ goto out;
+
+ if (!ISP2(blksz)) {
+ /*
+ * They are freeing the whole block of a
+ * non-power-of-two blocksize file. Skip all the messy
+ * math.
+ */
+ ASSERT3U(off, ==, 0);
+ ASSERT3U(len, >=, blksz);
+ blkid = 0;
+ nblks = 1;
+ } else {
+ int tail;
+ int epbs = dn->dn_indblkshift - SPA_BLKPTRSHIFT;
+ int blkshift = dn->dn_datablkshift;
+
+ /* If the remaining range is past end of file, we're done */
+ if (off > dn->dn_maxblkid << blkshift)
+ goto out;
+
+ if (off + len == UINT64_MAX)
+ tail = 0;
+ else
+ tail = P2PHASE(len, blksz);
+
+ ASSERT3U(P2PHASE(off, blksz), ==, 0);
+ /* zero out any partial block data at the end of the range */
+ if (tail) {
+ if (len < tail)
+ tail = len;
+ if (dbuf_hold_impl(dn, 0, dbuf_whichblock(dn, off+len),
+ TRUE, FTAG, &db) == 0) {
+ /* don't dirty if not on disk and not dirty */
+ if (db->db_last_dirty ||
+ (db->db_blkptr &&
+ !BP_IS_HOLE(db->db_blkptr))) {
+ rw_exit(&dn->dn_struct_rwlock);
+ dbuf_will_dirty(db, tx);
+ rw_enter(&dn->dn_struct_rwlock,
+ RW_WRITER);
+ bzero(db->db.db_data, tail);
+ }
+ dbuf_rele(db, FTAG);
+ }
+ len -= tail;
+ }
+ /* If the range did not include a full block, we are done */
+ if (len == 0)
+ goto out;
+
+ /* dirty the left indirects */
+ if (dn->dn_nlevels > 1 && off != 0) {
+ db = dbuf_hold_level(dn, 1,
+ (off - head) >> (blkshift + epbs), FTAG);
+ dbuf_will_dirty(db, tx);
+ dbuf_rele(db, FTAG);
+ }
+
+ /* dirty the right indirects */
+ if (dn->dn_nlevels > 1 && !trunc) {
+ db = dbuf_hold_level(dn, 1,
+ (off + len + tail - 1) >> (blkshift + epbs), FTAG);
+ dbuf_will_dirty(db, tx);
+ dbuf_rele(db, FTAG);
+ }
+
+ /*
+ * Finally, add this range to the dnode range list, we
+ * will finish up this free operation in the syncing phase.
+ */
+ ASSERT(IS_P2ALIGNED(off, 1<<blkshift));
+ ASSERT(off + len == UINT64_MAX ||
+ IS_P2ALIGNED(len, 1<<blkshift));
+ blkid = off >> blkshift;
+ nblks = len >> blkshift;
+
+ if (trunc)
+ dn->dn_maxblkid = (blkid ? blkid - 1 : 0);
+ }
+
+ mutex_enter(&dn->dn_mtx);
+ dnode_clear_range(dn, blkid, nblks, tx);
+ {
+ free_range_t *rp, *found;
+ avl_index_t where;
+ avl_tree_t *tree = &dn->dn_ranges[tx->tx_txg&TXG_MASK];
+
+ /* Add new range to dn_ranges */
+ rp = kmem_alloc(sizeof (free_range_t), KM_SLEEP);
+ rp->fr_blkid = blkid;
+ rp->fr_nblks = nblks;
+ found = avl_find(tree, rp, &where);
+ ASSERT(found == NULL);
+ avl_insert(tree, rp, where);
+ dprintf_dnode(dn, "blkid=%llu nblks=%llu txg=%llu\n",
+ blkid, nblks, tx->tx_txg);
+ }
+ mutex_exit(&dn->dn_mtx);
+
+ dbuf_free_range(dn, blkid, nblks, tx);
+ dnode_setdirty(dn, tx);
+out:
+ rw_exit(&dn->dn_struct_rwlock);
+}
+
+/* return TRUE if this blkid was freed in a recent txg, or FALSE if it wasn't */
+uint64_t
+dnode_block_freed(dnode_t *dn, uint64_t blkid)
+{
+ free_range_t range_tofind;
+ void *dp = spa_get_dsl(dn->dn_objset->os_spa);
+ int i;
+
+ if (blkid == DB_BONUS_BLKID)
+ return (FALSE);
+
+ /*
+ * If we're in the process of opening the pool, dp will not be
+ * set yet, but there shouldn't be anything dirty.
+ */
+ if (dp == NULL)
+ return (FALSE);
+
+ if (dn->dn_free_txg)
+ return (TRUE);
+
+ /*
+ * If dn_datablkshift is not set, then there's only a single
+ * block, in which case there will never be a free range so it
+ * won't matter.
+ */
+ range_tofind.fr_blkid = blkid;
+ mutex_enter(&dn->dn_mtx);
+ for (i = 0; i < TXG_SIZE; i++) {
+ free_range_t *range_found;
+ avl_index_t idx;
+
+ range_found = avl_find(&dn->dn_ranges[i], &range_tofind, &idx);
+ if (range_found) {
+ ASSERT(range_found->fr_nblks > 0);
+ break;
+ }
+ range_found = avl_nearest(&dn->dn_ranges[i], idx, AVL_BEFORE);
+ if (range_found &&
+ range_found->fr_blkid + range_found->fr_nblks > blkid)
+ break;
+ }
+ mutex_exit(&dn->dn_mtx);
+ return (i < TXG_SIZE);
+}
+
+/* call from syncing context when we actually write/free space for this dnode */
+void
+dnode_diduse_space(dnode_t *dn, int64_t delta)
+{
+ uint64_t space;
+ dprintf_dnode(dn, "dn=%p dnp=%p used=%llu delta=%lld\n",
+ dn, dn->dn_phys,
+ (u_longlong_t)dn->dn_phys->dn_used,
+ (longlong_t)delta);
+
+ mutex_enter(&dn->dn_mtx);
+ space = DN_USED_BYTES(dn->dn_phys);
+ if (delta > 0) {
+ ASSERT3U(space + delta, >=, space); /* no overflow */
+ } else {
+ ASSERT3U(space, >=, -delta); /* no underflow */
+ }
+ space += delta;
+ if (spa_version(dn->dn_objset->os_spa) < ZFS_VERSION_DNODE_BYTES) {
+ ASSERT((dn->dn_phys->dn_flags & DNODE_FLAG_USED_BYTES) == 0);
+ ASSERT3U(P2PHASE(space, 1<<DEV_BSHIFT), ==, 0);
+ dn->dn_phys->dn_used = space >> DEV_BSHIFT;
+ } else {
+ dn->dn_phys->dn_used = space;
+ dn->dn_phys->dn_flags |= DNODE_FLAG_USED_BYTES;
+ }
+ mutex_exit(&dn->dn_mtx);
+}
+
+/*
+ * Call when we think we're going to write/free space in open context.
+ * Be conservative (ie. OK to write less than this or free more than
+ * this, but don't write more or free less).
+ */
+void
+dnode_willuse_space(dnode_t *dn, int64_t space, dmu_tx_t *tx)
+{
+ objset_impl_t *os = dn->dn_objset;
+ dsl_dataset_t *ds = os->os_dsl_dataset;
+
+ if (space > 0)
+ space = spa_get_asize(os->os_spa, space);
+
+ if (ds)
+ dsl_dir_willuse_space(ds->ds_dir, space, tx);
+
+ dmu_tx_willuse_space(tx, space);
+}
+
+static int
+dnode_next_offset_level(dnode_t *dn, boolean_t hole, uint64_t *offset,
+ int lvl, uint64_t blkfill, uint64_t txg)
+{
+ dmu_buf_impl_t *db = NULL;
+ void *data = NULL;
+ uint64_t epbs = dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
+ uint64_t epb = 1ULL << epbs;
+ uint64_t minfill, maxfill;
+ int i, error, span;
+
+ dprintf("probing object %llu offset %llx level %d of %u\n",
+ dn->dn_object, *offset, lvl, dn->dn_phys->dn_nlevels);
+
+ if (lvl == dn->dn_phys->dn_nlevels) {
+ error = 0;
+ epb = dn->dn_phys->dn_nblkptr;
+ data = dn->dn_phys->dn_blkptr;
+ } else {
+ uint64_t blkid = dbuf_whichblock(dn, *offset) >> (epbs * lvl);
+ error = dbuf_hold_impl(dn, lvl, blkid, TRUE, FTAG, &db);
+ if (error) {
+ if (error == ENOENT)
+ return (hole ? 0 : ESRCH);
+ return (error);
+ }
+ error = dbuf_read(db, NULL, DB_RF_CANFAIL | DB_RF_HAVESTRUCT);
+ if (error) {
+ dbuf_rele(db, FTAG);
+ return (error);
+ }
+ data = db->db.db_data;
+ }
+
+ if (db && txg &&
+ (db->db_blkptr == NULL || db->db_blkptr->blk_birth <= txg)) {
+ error = ESRCH;
+ } else if (lvl == 0) {
+ dnode_phys_t *dnp = data;
+ span = DNODE_SHIFT;
+ ASSERT(dn->dn_type == DMU_OT_DNODE);
+
+ for (i = (*offset >> span) & (blkfill - 1); i < blkfill; i++) {
+ boolean_t newcontents = B_TRUE;
+ if (txg) {
+ int j;
+ newcontents = B_FALSE;
+ for (j = 0; j < dnp[i].dn_nblkptr; j++) {
+ if (dnp[i].dn_blkptr[j].blk_birth > txg)
+ newcontents = B_TRUE;
+ }
+ }
+ if (!dnp[i].dn_type == hole && newcontents)
+ break;
+ *offset += 1ULL << span;
+ }
+ if (i == blkfill)
+ error = ESRCH;
+ } else {
+ blkptr_t *bp = data;
+ span = (lvl - 1) * epbs + dn->dn_datablkshift;
+ minfill = 0;
+ maxfill = blkfill << ((lvl - 1) * epbs);
+
+ if (hole)
+ maxfill--;
+ else
+ minfill++;
+
+ for (i = (*offset >> span) & ((1ULL << epbs) - 1);
+ i < epb; i++) {
+ if (bp[i].blk_fill >= minfill &&
+ bp[i].blk_fill <= maxfill &&
+ bp[i].blk_birth > txg)
+ break;
+ *offset += 1ULL << span;
+ }
+ if (i >= epb)
+ error = ESRCH;
+ }
+
+ if (db)
+ dbuf_rele(db, FTAG);
+
+ return (error);
+}
+
+/*
+ * Find the next hole, data, or sparse region at or after *offset.
+ * The value 'blkfill' tells us how many items we expect to find
+ * in an L0 data block; this value is 1 for normal objects,
+ * DNODES_PER_BLOCK for the meta dnode, and some fraction of
+ * DNODES_PER_BLOCK when searching for sparse regions thereof.
+ *
+ * Examples:
+ *
+ * dnode_next_offset(dn, hole, offset, 1, 1, 0);
+ * Finds the next hole/data in a file.
+ * Used in dmu_offset_next().
+ *
+ * dnode_next_offset(mdn, hole, offset, 0, DNODES_PER_BLOCK, txg);
+ * Finds the next free/allocated dnode an objset's meta-dnode.
+ * Only finds objects that have new contents since txg (ie.
+ * bonus buffer changes and content removal are ignored).
+ * Used in dmu_object_next().
+ *
+ * dnode_next_offset(mdn, TRUE, offset, 2, DNODES_PER_BLOCK >> 2, 0);
+ * Finds the next L2 meta-dnode bp that's at most 1/4 full.
+ * Used in dmu_object_alloc().
+ */
+int
+dnode_next_offset(dnode_t *dn, boolean_t hole, uint64_t *offset,
+ int minlvl, uint64_t blkfill, uint64_t txg)
+{
+ int lvl, maxlvl;
+ int error = 0;
+ uint64_t initial_offset = *offset;
+
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+
+ if (dn->dn_phys->dn_nlevels == 0) {
+ rw_exit(&dn->dn_struct_rwlock);
+ return (ESRCH);
+ }
+
+ if (dn->dn_datablkshift == 0) {
+ if (*offset < dn->dn_datablksz) {
+ if (hole)
+ *offset = dn->dn_datablksz;
+ } else {
+ error = ESRCH;
+ }
+ rw_exit(&dn->dn_struct_rwlock);
+ return (error);
+ }
+
+ maxlvl = dn->dn_phys->dn_nlevels;
+
+ for (lvl = minlvl; lvl <= maxlvl; lvl++) {
+ error = dnode_next_offset_level(dn,
+ hole, offset, lvl, blkfill, txg);
+ if (error != ESRCH)
+ break;
+ }
+
+ while (--lvl >= minlvl && error == 0) {
+ error = dnode_next_offset_level(dn,
+ hole, offset, lvl, blkfill, txg);
+ }
+
+ rw_exit(&dn->dn_struct_rwlock);
+
+ if (error == 0 && initial_offset > *offset)
+ error = ESRCH;
+
+ return (error);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c
new file mode 100644
index 0000000..9e8c7ad
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dnode_sync.c
@@ -0,0 +1,623 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/dbuf.h>
+#include <sys/dnode.h>
+#include <sys/dmu.h>
+#include <sys/dmu_tx.h>
+#include <sys/dmu_objset.h>
+#include <sys/dsl_dataset.h>
+#include <sys/spa.h>
+
+static void
+dnode_increase_indirection(dnode_t *dn, dmu_tx_t *tx)
+{
+ dmu_buf_impl_t *db;
+ int txgoff = tx->tx_txg & TXG_MASK;
+ int nblkptr = dn->dn_phys->dn_nblkptr;
+ int old_toplvl = dn->dn_phys->dn_nlevels - 1;
+ int new_level = dn->dn_next_nlevels[txgoff];
+ int i;
+
+ rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
+
+ /* this dnode can't be paged out because it's dirty */
+ ASSERT(dn->dn_phys->dn_type != DMU_OT_NONE);
+ ASSERT(RW_WRITE_HELD(&dn->dn_struct_rwlock));
+ ASSERT(new_level > 1 && dn->dn_phys->dn_nlevels > 0);
+
+ db = dbuf_hold_level(dn, dn->dn_phys->dn_nlevels, 0, FTAG);
+ ASSERT(db != NULL);
+
+ dn->dn_phys->dn_nlevels = new_level;
+ dprintf("os=%p obj=%llu, increase to %d\n",
+ dn->dn_objset, dn->dn_object,
+ dn->dn_phys->dn_nlevels);
+
+ /* check for existing blkptrs in the dnode */
+ for (i = 0; i < nblkptr; i++)
+ if (!BP_IS_HOLE(&dn->dn_phys->dn_blkptr[i]))
+ break;
+ if (i != nblkptr) {
+ /* transfer dnode's block pointers to new indirect block */
+ (void) dbuf_read(db, NULL, DB_RF_MUST_SUCCEED|DB_RF_HAVESTRUCT);
+ ASSERT(db->db.db_data);
+ ASSERT(arc_released(db->db_buf));
+ ASSERT3U(sizeof (blkptr_t) * nblkptr, <=, db->db.db_size);
+ bcopy(dn->dn_phys->dn_blkptr, db->db.db_data,
+ sizeof (blkptr_t) * nblkptr);
+ arc_buf_freeze(db->db_buf);
+ }
+
+ /* set dbuf's parent pointers to new indirect buf */
+ for (i = 0; i < nblkptr; i++) {
+ dmu_buf_impl_t *child = dbuf_find(dn, old_toplvl, i);
+
+ if (child == NULL)
+ continue;
+ ASSERT3P(child->db_dnode, ==, dn);
+ if (child->db_parent && child->db_parent != dn->dn_dbuf) {
+ ASSERT(child->db_parent->db_level == db->db_level);
+ ASSERT(child->db_blkptr !=
+ &dn->dn_phys->dn_blkptr[child->db_blkid]);
+ mutex_exit(&child->db_mtx);
+ continue;
+ }
+ ASSERT(child->db_parent == NULL ||
+ child->db_parent == dn->dn_dbuf);
+
+ child->db_parent = db;
+ dbuf_add_ref(db, child);
+ if (db->db.db_data)
+ child->db_blkptr = (blkptr_t *)db->db.db_data + i;
+ else
+ child->db_blkptr = NULL;
+ dprintf_dbuf_bp(child, child->db_blkptr,
+ "changed db_blkptr to new indirect %s", "");
+
+ mutex_exit(&child->db_mtx);
+ }
+
+ bzero(dn->dn_phys->dn_blkptr, sizeof (blkptr_t) * nblkptr);
+
+ dbuf_rele(db, FTAG);
+
+ rw_exit(&dn->dn_struct_rwlock);
+}
+
+static void
+free_blocks(dnode_t *dn, blkptr_t *bp, int num, dmu_tx_t *tx)
+{
+ objset_impl_t *os = dn->dn_objset;
+ uint64_t bytesfreed = 0;
+ int i;
+
+ dprintf("os=%p obj=%llx num=%d\n", os, dn->dn_object, num);
+
+ for (i = 0; i < num; i++, bp++) {
+ if (BP_IS_HOLE(bp))
+ continue;
+
+ bytesfreed += bp_get_dasize(os->os_spa, bp);
+ ASSERT3U(bytesfreed, <=, DN_USED_BYTES(dn->dn_phys));
+ dsl_dataset_block_kill(os->os_dsl_dataset, bp, dn->dn_zio, tx);
+ bzero(bp, sizeof (blkptr_t));
+ }
+ dnode_diduse_space(dn, -bytesfreed);
+}
+
+#ifdef ZFS_DEBUG
+static void
+free_verify(dmu_buf_impl_t *db, uint64_t start, uint64_t end, dmu_tx_t *tx)
+{
+ int off, num;
+ int i, err, epbs;
+ uint64_t txg = tx->tx_txg;
+
+ epbs = db->db_dnode->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
+ off = start - (db->db_blkid * 1<<epbs);
+ num = end - start + 1;
+
+ ASSERT3U(off, >=, 0);
+ ASSERT3U(num, >=, 0);
+ ASSERT3U(db->db_level, >, 0);
+ ASSERT3U(db->db.db_size, ==, 1<<db->db_dnode->dn_phys->dn_indblkshift);
+ ASSERT3U(off+num, <=, db->db.db_size >> SPA_BLKPTRSHIFT);
+ ASSERT(db->db_blkptr != NULL);
+
+ for (i = off; i < off+num; i++) {
+ uint64_t *buf;
+ dmu_buf_impl_t *child;
+ dbuf_dirty_record_t *dr;
+ int j;
+
+ ASSERT(db->db_level == 1);
+
+ rw_enter(&db->db_dnode->dn_struct_rwlock, RW_READER);
+ err = dbuf_hold_impl(db->db_dnode, db->db_level-1,
+ (db->db_blkid << epbs) + i, TRUE, FTAG, &child);
+ rw_exit(&db->db_dnode->dn_struct_rwlock);
+ if (err == ENOENT)
+ continue;
+ ASSERT(err == 0);
+ ASSERT(child->db_level == 0);
+ dr = child->db_last_dirty;
+ while (dr && dr->dr_txg > txg)
+ dr = dr->dr_next;
+ ASSERT(dr == NULL || dr->dr_txg == txg);
+
+ /* data_old better be zeroed */
+ if (dr) {
+ buf = dr->dt.dl.dr_data->b_data;
+ for (j = 0; j < child->db.db_size >> 3; j++) {
+ if (buf[j] != 0) {
+ panic("freed data not zero: "
+ "child=%p i=%d off=%d num=%d\n",
+ child, i, off, num);
+ }
+ }
+ }
+
+ /*
+ * db_data better be zeroed unless it's dirty in a
+ * future txg.
+ */
+ mutex_enter(&child->db_mtx);
+ buf = child->db.db_data;
+ if (buf != NULL && child->db_state != DB_FILL &&
+ child->db_last_dirty == NULL) {
+ for (j = 0; j < child->db.db_size >> 3; j++) {
+ if (buf[j] != 0) {
+ panic("freed data not zero: "
+ "child=%p i=%d off=%d num=%d\n",
+ child, i, off, num);
+ }
+ }
+ }
+ mutex_exit(&child->db_mtx);
+
+ dbuf_rele(child, FTAG);
+ }
+}
+#endif
+
+static int
+free_children(dmu_buf_impl_t *db, uint64_t blkid, uint64_t nblks, int trunc,
+ dmu_tx_t *tx)
+{
+ dnode_t *dn = db->db_dnode;
+ blkptr_t *bp;
+ dmu_buf_impl_t *subdb;
+ uint64_t start, end, dbstart, dbend, i;
+ int epbs, shift, err;
+ int all = TRUE;
+
+ (void) dbuf_read(db, NULL, DB_RF_MUST_SUCCEED);
+ arc_release(db->db_buf, db);
+ bp = (blkptr_t *)db->db.db_data;
+
+ epbs = db->db_dnode->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT;
+ shift = (db->db_level - 1) * epbs;
+ dbstart = db->db_blkid << epbs;
+ start = blkid >> shift;
+ if (dbstart < start) {
+ bp += start - dbstart;
+ all = FALSE;
+ } else {
+ start = dbstart;
+ }
+ dbend = ((db->db_blkid + 1) << epbs) - 1;
+ end = (blkid + nblks - 1) >> shift;
+ if (dbend <= end)
+ end = dbend;
+ else if (all)
+ all = trunc;
+ ASSERT3U(start, <=, end);
+
+ if (db->db_level == 1) {
+ FREE_VERIFY(db, start, end, tx);
+ free_blocks(dn, bp, end-start+1, tx);
+ arc_buf_freeze(db->db_buf);
+ ASSERT(all || db->db_last_dirty);
+ return (all);
+ }
+
+ for (i = start; i <= end; i++, bp++) {
+ if (BP_IS_HOLE(bp))
+ continue;
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ err = dbuf_hold_impl(dn, db->db_level-1, i, TRUE, FTAG, &subdb);
+ ASSERT3U(err, ==, 0);
+ rw_exit(&dn->dn_struct_rwlock);
+
+ if (free_children(subdb, blkid, nblks, trunc, tx)) {
+ ASSERT3P(subdb->db_blkptr, ==, bp);
+ free_blocks(dn, bp, 1, tx);
+ } else {
+ all = FALSE;
+ }
+ dbuf_rele(subdb, FTAG);
+ }
+ arc_buf_freeze(db->db_buf);
+#ifdef ZFS_DEBUG
+ bp -= (end-start)+1;
+ for (i = start; i <= end; i++, bp++) {
+ if (i == start && blkid != 0)
+ continue;
+ else if (i == end && !trunc)
+ continue;
+ ASSERT3U(bp->blk_birth, ==, 0);
+ }
+#endif
+ ASSERT(all || db->db_last_dirty);
+ return (all);
+}
+
+/*
+ * free_range: Traverse the indicated range of the provided file
+ * and "free" all the blocks contained there.
+ */
+static void
+dnode_sync_free_range(dnode_t *dn, uint64_t blkid, uint64_t nblks, dmu_tx_t *tx)
+{
+ blkptr_t *bp = dn->dn_phys->dn_blkptr;
+ dmu_buf_impl_t *db;
+ int trunc, start, end, shift, i, err;
+ int dnlevel = dn->dn_phys->dn_nlevels;
+
+ if (blkid > dn->dn_phys->dn_maxblkid)
+ return;
+
+ ASSERT(dn->dn_phys->dn_maxblkid < UINT64_MAX);
+ trunc = blkid + nblks > dn->dn_phys->dn_maxblkid;
+ if (trunc)
+ nblks = dn->dn_phys->dn_maxblkid - blkid + 1;
+
+ /* There are no indirect blocks in the object */
+ if (dnlevel == 1) {
+ if (blkid >= dn->dn_phys->dn_nblkptr) {
+ /* this range was never made persistent */
+ return;
+ }
+ ASSERT3U(blkid + nblks, <=, dn->dn_phys->dn_nblkptr);
+ free_blocks(dn, bp + blkid, nblks, tx);
+ if (trunc) {
+ uint64_t off = (dn->dn_phys->dn_maxblkid + 1) *
+ (dn->dn_phys->dn_datablkszsec << SPA_MINBLOCKSHIFT);
+ dn->dn_phys->dn_maxblkid = (blkid ? blkid - 1 : 0);
+ ASSERT(off < dn->dn_phys->dn_maxblkid ||
+ dn->dn_phys->dn_maxblkid == 0 ||
+ dnode_next_offset(dn, FALSE, &off,
+ 1, 1, 0) != 0);
+ }
+ return;
+ }
+
+ shift = (dnlevel - 1) * (dn->dn_phys->dn_indblkshift - SPA_BLKPTRSHIFT);
+ start = blkid >> shift;
+ ASSERT(start < dn->dn_phys->dn_nblkptr);
+ end = (blkid + nblks - 1) >> shift;
+ bp += start;
+ for (i = start; i <= end; i++, bp++) {
+ if (BP_IS_HOLE(bp))
+ continue;
+ rw_enter(&dn->dn_struct_rwlock, RW_READER);
+ err = dbuf_hold_impl(dn, dnlevel-1, i, TRUE, FTAG, &db);
+ ASSERT3U(err, ==, 0);
+ rw_exit(&dn->dn_struct_rwlock);
+
+ if (free_children(db, blkid, nblks, trunc, tx)) {
+ ASSERT3P(db->db_blkptr, ==, bp);
+ free_blocks(dn, bp, 1, tx);
+ }
+ dbuf_rele(db, FTAG);
+ }
+ if (trunc) {
+ uint64_t off = (dn->dn_phys->dn_maxblkid + 1) *
+ (dn->dn_phys->dn_datablkszsec << SPA_MINBLOCKSHIFT);
+ dn->dn_phys->dn_maxblkid = (blkid ? blkid - 1 : 0);
+ ASSERT(off < dn->dn_phys->dn_maxblkid ||
+ dn->dn_phys->dn_maxblkid == 0 ||
+ dnode_next_offset(dn, FALSE, &off, 1, 1, 0) != 0);
+ }
+}
+
+/*
+ * Try to kick all the dnodes dbufs out of the cache...
+ */
+int
+dnode_evict_dbufs(dnode_t *dn, int try)
+{
+ int progress;
+ int pass = 0;
+
+ do {
+ dmu_buf_impl_t *db, marker;
+ int evicting = FALSE;
+
+ progress = FALSE;
+ mutex_enter(&dn->dn_dbufs_mtx);
+ list_insert_tail(&dn->dn_dbufs, &marker);
+ db = list_head(&dn->dn_dbufs);
+ for (; db != &marker; db = list_head(&dn->dn_dbufs)) {
+ list_remove(&dn->dn_dbufs, db);
+ list_insert_tail(&dn->dn_dbufs, db);
+
+ mutex_enter(&db->db_mtx);
+ if (db->db_state == DB_EVICTING) {
+ progress = TRUE;
+ evicting = TRUE;
+ mutex_exit(&db->db_mtx);
+ } else if (refcount_is_zero(&db->db_holds)) {
+ progress = TRUE;
+ ASSERT(!arc_released(db->db_buf));
+ dbuf_clear(db); /* exits db_mtx for us */
+ } else {
+ mutex_exit(&db->db_mtx);
+ }
+
+ }
+ list_remove(&dn->dn_dbufs, &marker);
+ /*
+ * NB: we need to drop dn_dbufs_mtx between passes so
+ * that any DB_EVICTING dbufs can make progress.
+ * Ideally, we would have some cv we could wait on, but
+ * since we don't, just wait a bit to give the other
+ * thread a chance to run.
+ */
+ mutex_exit(&dn->dn_dbufs_mtx);
+ if (evicting)
+ delay(1);
+ pass++;
+ ASSERT(pass < 100); /* sanity check */
+ } while (progress);
+
+ /*
+ * This function works fine even if it can't evict everything.
+ * If were only asked to try to evict everything then
+ * return an error if we can't. Otherwise panic as the caller
+ * expects total eviction.
+ */
+ if (list_head(&dn->dn_dbufs) != NULL) {
+ if (try) {
+ return (1);
+ } else {
+ panic("dangling dbufs (dn=%p, dbuf=%p)\n",
+ dn, list_head(&dn->dn_dbufs));
+ }
+ }
+
+ rw_enter(&dn->dn_struct_rwlock, RW_WRITER);
+ if (dn->dn_bonus && refcount_is_zero(&dn->dn_bonus->db_holds)) {
+ mutex_enter(&dn->dn_bonus->db_mtx);
+ dbuf_evict(dn->dn_bonus);
+ dn->dn_bonus = NULL;
+ }
+ rw_exit(&dn->dn_struct_rwlock);
+ return (0);
+}
+
+static void
+dnode_undirty_dbufs(list_t *list)
+{
+ dbuf_dirty_record_t *dr;
+
+ while (dr = list_head(list)) {
+ dmu_buf_impl_t *db = dr->dr_dbuf;
+ uint64_t txg = dr->dr_txg;
+
+ mutex_enter(&db->db_mtx);
+ /* XXX - use dbuf_undirty()? */
+ list_remove(list, dr);
+ ASSERT(db->db_last_dirty == dr);
+ db->db_last_dirty = NULL;
+ db->db_dirtycnt -= 1;
+ if (db->db_level == 0) {
+ ASSERT(db->db_blkid == DB_BONUS_BLKID ||
+ dr->dt.dl.dr_data == db->db_buf);
+ dbuf_unoverride(dr);
+ mutex_exit(&db->db_mtx);
+ } else {
+ mutex_exit(&db->db_mtx);
+ dnode_undirty_dbufs(&dr->dt.di.dr_children);
+ list_destroy(&dr->dt.di.dr_children);
+ mutex_destroy(&dr->dt.di.dr_mtx);
+ }
+ kmem_free(dr, sizeof (dbuf_dirty_record_t));
+ dbuf_rele(db, (void *)(uintptr_t)txg);
+ }
+}
+
+static void
+dnode_sync_free(dnode_t *dn, dmu_tx_t *tx)
+{
+ int txgoff = tx->tx_txg & TXG_MASK;
+
+ ASSERT(dmu_tx_is_syncing(tx));
+
+ dnode_undirty_dbufs(&dn->dn_dirty_records[txgoff]);
+ (void) dnode_evict_dbufs(dn, 0);
+ ASSERT3P(list_head(&dn->dn_dbufs), ==, NULL);
+
+ /*
+ * XXX - It would be nice to assert this, but we may still
+ * have residual holds from async evictions from the arc...
+ *
+ * zfs_obj_to_path() also depends on this being
+ * commented out.
+ *
+ * ASSERT3U(refcount_count(&dn->dn_holds), ==, 1);
+ */
+
+ /* Undirty next bits */
+ dn->dn_next_nlevels[txgoff] = 0;
+ dn->dn_next_indblkshift[txgoff] = 0;
+ dn->dn_next_blksz[txgoff] = 0;
+
+ /* free up all the blocks in the file. */
+ dnode_sync_free_range(dn, 0, dn->dn_phys->dn_maxblkid+1, tx);
+ ASSERT3U(DN_USED_BYTES(dn->dn_phys), ==, 0);
+
+ /* ASSERT(blkptrs are zero); */
+ ASSERT(dn->dn_phys->dn_type != DMU_OT_NONE);
+ ASSERT(dn->dn_type != DMU_OT_NONE);
+
+ ASSERT(dn->dn_free_txg > 0);
+ if (dn->dn_allocated_txg != dn->dn_free_txg)
+ dbuf_will_dirty(dn->dn_dbuf, tx);
+ bzero(dn->dn_phys, sizeof (dnode_phys_t));
+
+ mutex_enter(&dn->dn_mtx);
+ dn->dn_type = DMU_OT_NONE;
+ dn->dn_maxblkid = 0;
+ dn->dn_allocated_txg = 0;
+ mutex_exit(&dn->dn_mtx);
+
+ ASSERT(dn->dn_object != DMU_META_DNODE_OBJECT);
+
+ dnode_rele(dn, (void *)(uintptr_t)tx->tx_txg);
+ /*
+ * Now that we've released our hold, the dnode may
+ * be evicted, so we musn't access it.
+ */
+}
+
+/*
+ * Write out the dnode's dirty buffers.
+ *
+ * NOTE: The dnode is kept in memory by being dirty. Once the
+ * dirty bit is cleared, it may be evicted. Beware of this!
+ */
+void
+dnode_sync(dnode_t *dn, dmu_tx_t *tx)
+{
+ free_range_t *rp;
+ dnode_phys_t *dnp = dn->dn_phys;
+ int txgoff = tx->tx_txg & TXG_MASK;
+ list_t *list = &dn->dn_dirty_records[txgoff];
+
+ ASSERT(dmu_tx_is_syncing(tx));
+ ASSERT(dnp->dn_type != DMU_OT_NONE || dn->dn_allocated_txg);
+ DNODE_VERIFY(dn);
+
+ ASSERT(dn->dn_dbuf == NULL || arc_released(dn->dn_dbuf->db_buf));
+
+ mutex_enter(&dn->dn_mtx);
+ if (dn->dn_allocated_txg == tx->tx_txg) {
+ /* The dnode is newly allocated or reallocated */
+ if (dnp->dn_type == DMU_OT_NONE) {
+ /* this is a first alloc, not a realloc */
+ /* XXX shouldn't the phys already be zeroed? */
+ bzero(dnp, DNODE_CORE_SIZE);
+ dnp->dn_nlevels = 1;
+ }
+
+ if (dn->dn_nblkptr > dnp->dn_nblkptr) {
+ /* zero the new blkptrs we are gaining */
+ bzero(dnp->dn_blkptr + dnp->dn_nblkptr,
+ sizeof (blkptr_t) *
+ (dn->dn_nblkptr - dnp->dn_nblkptr));
+ }
+ dnp->dn_type = dn->dn_type;
+ dnp->dn_bonustype = dn->dn_bonustype;
+ dnp->dn_bonuslen = dn->dn_bonuslen;
+ dnp->dn_nblkptr = dn->dn_nblkptr;
+ }
+
+ ASSERT(dnp->dn_nlevels > 1 ||
+ BP_IS_HOLE(&dnp->dn_blkptr[0]) ||
+ BP_GET_LSIZE(&dnp->dn_blkptr[0]) ==
+ dnp->dn_datablkszsec << SPA_MINBLOCKSHIFT);
+
+ if (dn->dn_next_blksz[txgoff]) {
+ ASSERT(P2PHASE(dn->dn_next_blksz[txgoff],
+ SPA_MINBLOCKSIZE) == 0);
+ ASSERT(BP_IS_HOLE(&dnp->dn_blkptr[0]) ||
+ list_head(list) != NULL ||
+ dn->dn_next_blksz[txgoff] >> SPA_MINBLOCKSHIFT ==
+ dnp->dn_datablkszsec);
+ dnp->dn_datablkszsec =
+ dn->dn_next_blksz[txgoff] >> SPA_MINBLOCKSHIFT;
+ dn->dn_next_blksz[txgoff] = 0;
+ }
+
+ if (dn->dn_next_indblkshift[txgoff]) {
+ ASSERT(dnp->dn_nlevels == 1);
+ dnp->dn_indblkshift = dn->dn_next_indblkshift[txgoff];
+ dn->dn_next_indblkshift[txgoff] = 0;
+ }
+
+ /*
+ * Just take the live (open-context) values for checksum and compress.
+ * Strictly speaking it's a future leak, but nothing bad happens if we
+ * start using the new checksum or compress algorithm a little early.
+ */
+ dnp->dn_checksum = dn->dn_checksum;
+ dnp->dn_compress = dn->dn_compress;
+
+ mutex_exit(&dn->dn_mtx);
+
+ /* process all the "freed" ranges in the file */
+ if (dn->dn_free_txg == 0 || dn->dn_free_txg > tx->tx_txg) {
+ for (rp = avl_last(&dn->dn_ranges[txgoff]); rp != NULL;
+ rp = AVL_PREV(&dn->dn_ranges[txgoff], rp))
+ dnode_sync_free_range(dn,
+ rp->fr_blkid, rp->fr_nblks, tx);
+ }
+ mutex_enter(&dn->dn_mtx);
+ for (rp = avl_first(&dn->dn_ranges[txgoff]); rp; ) {
+ free_range_t *last = rp;
+ rp = AVL_NEXT(&dn->dn_ranges[txgoff], rp);
+ avl_remove(&dn->dn_ranges[txgoff], last);
+ kmem_free(last, sizeof (free_range_t));
+ }
+ mutex_exit(&dn->dn_mtx);
+
+ if (dn->dn_free_txg > 0 && dn->dn_free_txg <= tx->tx_txg) {
+ dnode_sync_free(dn, tx);
+ return;
+ }
+
+ if (dn->dn_next_nlevels[txgoff]) {
+ dnode_increase_indirection(dn, tx);
+ dn->dn_next_nlevels[txgoff] = 0;
+ }
+
+ dbuf_sync_list(list, tx);
+
+ if (dn->dn_object != DMU_META_DNODE_OBJECT) {
+ ASSERT3P(list_head(list), ==, NULL);
+ dnode_rele(dn, (void *)(uintptr_t)tx->tx_txg);
+ }
+
+ /*
+ * Although we have dropped our reference to the dnode, it
+ * can't be evicted until its written, and we haven't yet
+ * initiated the IO for the dnode's dbuf.
+ */
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
new file mode 100644
index 0000000..7d4689f
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_dataset.c
@@ -0,0 +1,2035 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu_objset.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_prop.h>
+#include <sys/dsl_synctask.h>
+#include <sys/dmu_traverse.h>
+#include <sys/dmu_tx.h>
+#include <sys/arc.h>
+#include <sys/zio.h>
+#include <sys/zap.h>
+#include <sys/unique.h>
+#include <sys/zfs_context.h>
+#include <sys/zfs_ioctl.h>
+
+static dsl_checkfunc_t dsl_dataset_destroy_begin_check;
+static dsl_syncfunc_t dsl_dataset_destroy_begin_sync;
+static dsl_checkfunc_t dsl_dataset_rollback_check;
+static dsl_syncfunc_t dsl_dataset_rollback_sync;
+static dsl_checkfunc_t dsl_dataset_destroy_check;
+static dsl_syncfunc_t dsl_dataset_destroy_sync;
+
+#define DS_REF_MAX (1ULL << 62)
+
+#define DSL_DEADLIST_BLOCKSIZE SPA_MAXBLOCKSIZE
+
+/*
+ * We use weighted reference counts to express the various forms of exclusion
+ * between different open modes. A STANDARD open is 1 point, an EXCLUSIVE open
+ * is DS_REF_MAX, and a PRIMARY open is little more than half of an EXCLUSIVE.
+ * This makes the exclusion logic simple: the total refcnt for all opens cannot
+ * exceed DS_REF_MAX. For example, EXCLUSIVE opens are exclusive because their
+ * weight (DS_REF_MAX) consumes the entire refcnt space. PRIMARY opens consume
+ * just over half of the refcnt space, so there can't be more than one, but it
+ * can peacefully coexist with any number of STANDARD opens.
+ */
+static uint64_t ds_refcnt_weight[DS_MODE_LEVELS] = {
+ 0, /* DS_MODE_NONE - invalid */
+ 1, /* DS_MODE_STANDARD - unlimited number */
+ (DS_REF_MAX >> 1) + 1, /* DS_MODE_PRIMARY - only one of these */
+ DS_REF_MAX /* DS_MODE_EXCLUSIVE - no other opens */
+};
+
+
+void
+dsl_dataset_block_born(dsl_dataset_t *ds, blkptr_t *bp, dmu_tx_t *tx)
+{
+ int used = bp_get_dasize(tx->tx_pool->dp_spa, bp);
+ int compressed = BP_GET_PSIZE(bp);
+ int uncompressed = BP_GET_UCSIZE(bp);
+
+ dprintf_bp(bp, "born, ds=%p\n", ds);
+
+ ASSERT(dmu_tx_is_syncing(tx));
+ /* It could have been compressed away to nothing */
+ if (BP_IS_HOLE(bp))
+ return;
+ ASSERT(BP_GET_TYPE(bp) != DMU_OT_NONE);
+ ASSERT3U(BP_GET_TYPE(bp), <, DMU_OT_NUMTYPES);
+ if (ds == NULL) {
+ /*
+ * Account for the meta-objset space in its placeholder
+ * dsl_dir.
+ */
+ ASSERT3U(compressed, ==, uncompressed); /* it's all metadata */
+ dsl_dir_diduse_space(tx->tx_pool->dp_mos_dir,
+ used, compressed, uncompressed, tx);
+ dsl_dir_dirty(tx->tx_pool->dp_mos_dir, tx);
+ return;
+ }
+ dmu_buf_will_dirty(ds->ds_dbuf, tx);
+ mutex_enter(&ds->ds_lock);
+ ds->ds_phys->ds_used_bytes += used;
+ ds->ds_phys->ds_compressed_bytes += compressed;
+ ds->ds_phys->ds_uncompressed_bytes += uncompressed;
+ ds->ds_phys->ds_unique_bytes += used;
+ mutex_exit(&ds->ds_lock);
+ dsl_dir_diduse_space(ds->ds_dir,
+ used, compressed, uncompressed, tx);
+}
+
+void
+dsl_dataset_block_kill(dsl_dataset_t *ds, blkptr_t *bp, zio_t *pio,
+ dmu_tx_t *tx)
+{
+ int used = bp_get_dasize(tx->tx_pool->dp_spa, bp);
+ int compressed = BP_GET_PSIZE(bp);
+ int uncompressed = BP_GET_UCSIZE(bp);
+
+ ASSERT(dmu_tx_is_syncing(tx));
+ /* No block pointer => nothing to free */
+ if (BP_IS_HOLE(bp))
+ return;
+
+ ASSERT(used > 0);
+ if (ds == NULL) {
+ int err;
+ /*
+ * Account for the meta-objset space in its placeholder
+ * dataset.
+ */
+ err = arc_free(pio, tx->tx_pool->dp_spa,
+ tx->tx_txg, bp, NULL, NULL, pio ? ARC_NOWAIT: ARC_WAIT);
+ ASSERT(err == 0);
+
+ dsl_dir_diduse_space(tx->tx_pool->dp_mos_dir,
+ -used, -compressed, -uncompressed, tx);
+ dsl_dir_dirty(tx->tx_pool->dp_mos_dir, tx);
+ return;
+ }
+ ASSERT3P(tx->tx_pool, ==, ds->ds_dir->dd_pool);
+
+ dmu_buf_will_dirty(ds->ds_dbuf, tx);
+
+ if (bp->blk_birth > ds->ds_phys->ds_prev_snap_txg) {
+ int err;
+
+ dprintf_bp(bp, "freeing: %s", "");
+ err = arc_free(pio, tx->tx_pool->dp_spa,
+ tx->tx_txg, bp, NULL, NULL, pio ? ARC_NOWAIT: ARC_WAIT);
+ ASSERT(err == 0);
+
+ mutex_enter(&ds->ds_lock);
+ /* XXX unique_bytes is not accurate for head datasets */
+ /* ASSERT3U(ds->ds_phys->ds_unique_bytes, >=, used); */
+ ds->ds_phys->ds_unique_bytes -= used;
+ mutex_exit(&ds->ds_lock);
+ dsl_dir_diduse_space(ds->ds_dir,
+ -used, -compressed, -uncompressed, tx);
+ } else {
+ dprintf_bp(bp, "putting on dead list: %s", "");
+ VERIFY(0 == bplist_enqueue(&ds->ds_deadlist, bp, tx));
+ /* if (bp->blk_birth > prev prev snap txg) prev unique += bs */
+ if (ds->ds_phys->ds_prev_snap_obj != 0) {
+ ASSERT3U(ds->ds_prev->ds_object, ==,
+ ds->ds_phys->ds_prev_snap_obj);
+ ASSERT(ds->ds_prev->ds_phys->ds_num_children > 0);
+ if (ds->ds_prev->ds_phys->ds_next_snap_obj ==
+ ds->ds_object && bp->blk_birth >
+ ds->ds_prev->ds_phys->ds_prev_snap_txg) {
+ dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx);
+ mutex_enter(&ds->ds_prev->ds_lock);
+ ds->ds_prev->ds_phys->ds_unique_bytes +=
+ used;
+ mutex_exit(&ds->ds_prev->ds_lock);
+ }
+ }
+ }
+ mutex_enter(&ds->ds_lock);
+ ASSERT3U(ds->ds_phys->ds_used_bytes, >=, used);
+ ds->ds_phys->ds_used_bytes -= used;
+ ASSERT3U(ds->ds_phys->ds_compressed_bytes, >=, compressed);
+ ds->ds_phys->ds_compressed_bytes -= compressed;
+ ASSERT3U(ds->ds_phys->ds_uncompressed_bytes, >=, uncompressed);
+ ds->ds_phys->ds_uncompressed_bytes -= uncompressed;
+ mutex_exit(&ds->ds_lock);
+}
+
+uint64_t
+dsl_dataset_prev_snap_txg(dsl_dataset_t *ds)
+{
+ uint64_t trysnap = 0;
+
+ if (ds == NULL)
+ return (0);
+ /*
+ * The snapshot creation could fail, but that would cause an
+ * incorrect FALSE return, which would only result in an
+ * overestimation of the amount of space that an operation would
+ * consume, which is OK.
+ *
+ * There's also a small window where we could miss a pending
+ * snapshot, because we could set the sync task in the quiescing
+ * phase. So this should only be used as a guess.
+ */
+ if (ds->ds_trysnap_txg >
+ spa_last_synced_txg(ds->ds_dir->dd_pool->dp_spa))
+ trysnap = ds->ds_trysnap_txg;
+ return (MAX(ds->ds_phys->ds_prev_snap_txg, trysnap));
+}
+
+int
+dsl_dataset_block_freeable(dsl_dataset_t *ds, uint64_t blk_birth)
+{
+ return (blk_birth > dsl_dataset_prev_snap_txg(ds));
+}
+
+/* ARGSUSED */
+static void
+dsl_dataset_evict(dmu_buf_t *db, void *dsv)
+{
+ dsl_dataset_t *ds = dsv;
+ dsl_pool_t *dp = ds->ds_dir->dd_pool;
+
+ /* open_refcount == DS_REF_MAX when deleting */
+ ASSERT(ds->ds_open_refcount == 0 ||
+ ds->ds_open_refcount == DS_REF_MAX);
+
+ dprintf_ds(ds, "evicting %s\n", "");
+
+ unique_remove(ds->ds_phys->ds_fsid_guid);
+
+ if (ds->ds_user_ptr != NULL)
+ ds->ds_user_evict_func(ds, ds->ds_user_ptr);
+
+ if (ds->ds_prev) {
+ dsl_dataset_close(ds->ds_prev, DS_MODE_NONE, ds);
+ ds->ds_prev = NULL;
+ }
+
+ bplist_close(&ds->ds_deadlist);
+ dsl_dir_close(ds->ds_dir, ds);
+
+ if (list_link_active(&ds->ds_synced_link))
+ list_remove(&dp->dp_synced_objsets, ds);
+
+ mutex_destroy(&ds->ds_lock);
+ mutex_destroy(&ds->ds_deadlist.bpl_lock);
+
+ kmem_free(ds, sizeof (dsl_dataset_t));
+}
+
+static int
+dsl_dataset_get_snapname(dsl_dataset_t *ds)
+{
+ dsl_dataset_phys_t *headphys;
+ int err;
+ dmu_buf_t *headdbuf;
+ dsl_pool_t *dp = ds->ds_dir->dd_pool;
+ objset_t *mos = dp->dp_meta_objset;
+
+ if (ds->ds_snapname[0])
+ return (0);
+ if (ds->ds_phys->ds_next_snap_obj == 0)
+ return (0);
+
+ err = dmu_bonus_hold(mos, ds->ds_dir->dd_phys->dd_head_dataset_obj,
+ FTAG, &headdbuf);
+ if (err)
+ return (err);
+ headphys = headdbuf->db_data;
+ err = zap_value_search(dp->dp_meta_objset,
+ headphys->ds_snapnames_zapobj, ds->ds_object, ds->ds_snapname);
+ dmu_buf_rele(headdbuf, FTAG);
+ return (err);
+}
+
+int
+dsl_dataset_open_obj(dsl_pool_t *dp, uint64_t dsobj, const char *snapname,
+ int mode, void *tag, dsl_dataset_t **dsp)
+{
+ uint64_t weight = ds_refcnt_weight[DS_MODE_LEVEL(mode)];
+ objset_t *mos = dp->dp_meta_objset;
+ dmu_buf_t *dbuf;
+ dsl_dataset_t *ds;
+ int err;
+
+ ASSERT(RW_LOCK_HELD(&dp->dp_config_rwlock) ||
+ dsl_pool_sync_context(dp));
+
+ err = dmu_bonus_hold(mos, dsobj, tag, &dbuf);
+ if (err)
+ return (err);
+ ds = dmu_buf_get_user(dbuf);
+ if (ds == NULL) {
+ dsl_dataset_t *winner;
+
+ ds = kmem_zalloc(sizeof (dsl_dataset_t), KM_SLEEP);
+ ds->ds_dbuf = dbuf;
+ ds->ds_object = dsobj;
+ ds->ds_phys = dbuf->db_data;
+
+ mutex_init(&ds->ds_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&ds->ds_deadlist.bpl_lock, NULL, MUTEX_DEFAULT,
+ NULL);
+
+ err = bplist_open(&ds->ds_deadlist,
+ mos, ds->ds_phys->ds_deadlist_obj);
+ if (err == 0) {
+ err = dsl_dir_open_obj(dp,
+ ds->ds_phys->ds_dir_obj, NULL, ds, &ds->ds_dir);
+ }
+ if (err) {
+ /*
+ * we don't really need to close the blist if we
+ * just opened it.
+ */
+ mutex_destroy(&ds->ds_lock);
+ mutex_destroy(&ds->ds_deadlist.bpl_lock);
+ kmem_free(ds, sizeof (dsl_dataset_t));
+ dmu_buf_rele(dbuf, tag);
+ return (err);
+ }
+
+ if (ds->ds_dir->dd_phys->dd_head_dataset_obj == dsobj) {
+ ds->ds_snapname[0] = '\0';
+ if (ds->ds_phys->ds_prev_snap_obj) {
+ err = dsl_dataset_open_obj(dp,
+ ds->ds_phys->ds_prev_snap_obj, NULL,
+ DS_MODE_NONE, ds, &ds->ds_prev);
+ }
+ } else {
+ if (snapname) {
+#ifdef ZFS_DEBUG
+ dsl_dataset_phys_t *headphys;
+ dmu_buf_t *headdbuf;
+ err = dmu_bonus_hold(mos,
+ ds->ds_dir->dd_phys->dd_head_dataset_obj,
+ FTAG, &headdbuf);
+ if (err == 0) {
+ headphys = headdbuf->db_data;
+ uint64_t foundobj;
+ err = zap_lookup(dp->dp_meta_objset,
+ headphys->ds_snapnames_zapobj,
+ snapname, sizeof (foundobj), 1,
+ &foundobj);
+ ASSERT3U(foundobj, ==, dsobj);
+ dmu_buf_rele(headdbuf, FTAG);
+ }
+#endif
+ (void) strcat(ds->ds_snapname, snapname);
+ } else if (zfs_flags & ZFS_DEBUG_SNAPNAMES) {
+ err = dsl_dataset_get_snapname(ds);
+ }
+ }
+
+ if (err == 0) {
+ winner = dmu_buf_set_user_ie(dbuf, ds, &ds->ds_phys,
+ dsl_dataset_evict);
+ }
+ if (err || winner) {
+ bplist_close(&ds->ds_deadlist);
+ if (ds->ds_prev) {
+ dsl_dataset_close(ds->ds_prev,
+ DS_MODE_NONE, ds);
+ }
+ dsl_dir_close(ds->ds_dir, ds);
+ mutex_destroy(&ds->ds_lock);
+ mutex_destroy(&ds->ds_deadlist.bpl_lock);
+ kmem_free(ds, sizeof (dsl_dataset_t));
+ if (err) {
+ dmu_buf_rele(dbuf, tag);
+ return (err);
+ }
+ ds = winner;
+ } else {
+ uint64_t new =
+ unique_insert(ds->ds_phys->ds_fsid_guid);
+ if (new != ds->ds_phys->ds_fsid_guid) {
+ /* XXX it won't necessarily be synced... */
+ ds->ds_phys->ds_fsid_guid = new;
+ }
+ }
+ }
+ ASSERT3P(ds->ds_dbuf, ==, dbuf);
+ ASSERT3P(ds->ds_phys, ==, dbuf->db_data);
+
+ mutex_enter(&ds->ds_lock);
+ if ((DS_MODE_LEVEL(mode) == DS_MODE_PRIMARY &&
+ (ds->ds_phys->ds_flags & DS_FLAG_INCONSISTENT) &&
+ !DS_MODE_IS_INCONSISTENT(mode)) ||
+ (ds->ds_open_refcount + weight > DS_REF_MAX)) {
+ mutex_exit(&ds->ds_lock);
+ dsl_dataset_close(ds, DS_MODE_NONE, tag);
+ return (EBUSY);
+ }
+ ds->ds_open_refcount += weight;
+ mutex_exit(&ds->ds_lock);
+
+ *dsp = ds;
+ return (0);
+}
+
+int
+dsl_dataset_open_spa(spa_t *spa, const char *name, int mode,
+ void *tag, dsl_dataset_t **dsp)
+{
+ dsl_dir_t *dd;
+ dsl_pool_t *dp;
+ const char *tail;
+ uint64_t obj;
+ dsl_dataset_t *ds = NULL;
+ int err = 0;
+
+ err = dsl_dir_open_spa(spa, name, FTAG, &dd, &tail);
+ if (err)
+ return (err);
+
+ dp = dd->dd_pool;
+ obj = dd->dd_phys->dd_head_dataset_obj;
+ rw_enter(&dp->dp_config_rwlock, RW_READER);
+ if (obj == 0) {
+ /* A dataset with no associated objset */
+ err = ENOENT;
+ goto out;
+ }
+
+ if (tail != NULL) {
+ objset_t *mos = dp->dp_meta_objset;
+
+ err = dsl_dataset_open_obj(dp, obj, NULL,
+ DS_MODE_NONE, tag, &ds);
+ if (err)
+ goto out;
+ obj = ds->ds_phys->ds_snapnames_zapobj;
+ dsl_dataset_close(ds, DS_MODE_NONE, tag);
+ ds = NULL;
+
+ if (tail[0] != '@') {
+ err = ENOENT;
+ goto out;
+ }
+ tail++;
+
+ /* Look for a snapshot */
+ if (!DS_MODE_IS_READONLY(mode)) {
+ err = EROFS;
+ goto out;
+ }
+ dprintf("looking for snapshot '%s'\n", tail);
+ err = zap_lookup(mos, obj, tail, 8, 1, &obj);
+ if (err)
+ goto out;
+ }
+ err = dsl_dataset_open_obj(dp, obj, tail, mode, tag, &ds);
+
+out:
+ rw_exit(&dp->dp_config_rwlock);
+ dsl_dir_close(dd, FTAG);
+
+ ASSERT3U((err == 0), ==, (ds != NULL));
+ /* ASSERT(ds == NULL || strcmp(name, ds->ds_name) == 0); */
+
+ *dsp = ds;
+ return (err);
+}
+
+int
+dsl_dataset_open(const char *name, int mode, void *tag, dsl_dataset_t **dsp)
+{
+ return (dsl_dataset_open_spa(NULL, name, mode, tag, dsp));
+}
+
+void
+dsl_dataset_name(dsl_dataset_t *ds, char *name)
+{
+ if (ds == NULL) {
+ (void) strcpy(name, "mos");
+ } else {
+ dsl_dir_name(ds->ds_dir, name);
+ VERIFY(0 == dsl_dataset_get_snapname(ds));
+ if (ds->ds_snapname[0]) {
+ (void) strcat(name, "@");
+ if (!MUTEX_HELD(&ds->ds_lock)) {
+ /*
+ * We use a "recursive" mutex so that we
+ * can call dprintf_ds() with ds_lock held.
+ */
+ mutex_enter(&ds->ds_lock);
+ (void) strcat(name, ds->ds_snapname);
+ mutex_exit(&ds->ds_lock);
+ } else {
+ (void) strcat(name, ds->ds_snapname);
+ }
+ }
+ }
+}
+
+static int
+dsl_dataset_namelen(dsl_dataset_t *ds)
+{
+ int result;
+
+ if (ds == NULL) {
+ result = 3; /* "mos" */
+ } else {
+ result = dsl_dir_namelen(ds->ds_dir);
+ VERIFY(0 == dsl_dataset_get_snapname(ds));
+ if (ds->ds_snapname[0]) {
+ ++result; /* adding one for the @-sign */
+ if (!MUTEX_HELD(&ds->ds_lock)) {
+ /* see dsl_datset_name */
+ mutex_enter(&ds->ds_lock);
+ result += strlen(ds->ds_snapname);
+ mutex_exit(&ds->ds_lock);
+ } else {
+ result += strlen(ds->ds_snapname);
+ }
+ }
+ }
+
+ return (result);
+}
+
+void
+dsl_dataset_close(dsl_dataset_t *ds, int mode, void *tag)
+{
+ uint64_t weight = ds_refcnt_weight[DS_MODE_LEVEL(mode)];
+ mutex_enter(&ds->ds_lock);
+ ASSERT3U(ds->ds_open_refcount, >=, weight);
+ ds->ds_open_refcount -= weight;
+ dprintf_ds(ds, "closing mode %u refcount now 0x%llx\n",
+ mode, ds->ds_open_refcount);
+ mutex_exit(&ds->ds_lock);
+
+ dmu_buf_rele(ds->ds_dbuf, tag);
+}
+
+void
+dsl_dataset_create_root(dsl_pool_t *dp, uint64_t *ddobjp, dmu_tx_t *tx)
+{
+ objset_t *mos = dp->dp_meta_objset;
+ dmu_buf_t *dbuf;
+ dsl_dataset_phys_t *dsphys;
+ dsl_dataset_t *ds;
+ uint64_t dsobj;
+ dsl_dir_t *dd;
+
+ dsl_dir_create_root(mos, ddobjp, tx);
+ VERIFY(0 == dsl_dir_open_obj(dp, *ddobjp, NULL, FTAG, &dd));
+
+ dsobj = dmu_object_alloc(mos, DMU_OT_DSL_DATASET, 0,
+ DMU_OT_DSL_DATASET, sizeof (dsl_dataset_phys_t), tx);
+ VERIFY(0 == dmu_bonus_hold(mos, dsobj, FTAG, &dbuf));
+ dmu_buf_will_dirty(dbuf, tx);
+ dsphys = dbuf->db_data;
+ dsphys->ds_dir_obj = dd->dd_object;
+ dsphys->ds_fsid_guid = unique_create();
+ unique_remove(dsphys->ds_fsid_guid); /* it isn't open yet */
+ (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid,
+ sizeof (dsphys->ds_guid));
+ dsphys->ds_snapnames_zapobj =
+ zap_create(mos, DMU_OT_DSL_DS_SNAP_MAP, DMU_OT_NONE, 0, tx);
+ dsphys->ds_creation_time = gethrestime_sec();
+ dsphys->ds_creation_txg = tx->tx_txg;
+ dsphys->ds_deadlist_obj =
+ bplist_create(mos, DSL_DEADLIST_BLOCKSIZE, tx);
+ dmu_buf_rele(dbuf, FTAG);
+
+ dmu_buf_will_dirty(dd->dd_dbuf, tx);
+ dd->dd_phys->dd_head_dataset_obj = dsobj;
+ dsl_dir_close(dd, FTAG);
+
+ VERIFY(0 ==
+ dsl_dataset_open_obj(dp, dsobj, NULL, DS_MODE_NONE, FTAG, &ds));
+ (void) dmu_objset_create_impl(dp->dp_spa, ds,
+ &ds->ds_phys->ds_bp, DMU_OST_ZFS, tx);
+ dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
+}
+
+uint64_t
+dsl_dataset_create_sync(dsl_dir_t *pdd,
+ const char *lastname, dsl_dataset_t *clone_parent, dmu_tx_t *tx)
+{
+ dsl_pool_t *dp = pdd->dd_pool;
+ dmu_buf_t *dbuf;
+ dsl_dataset_phys_t *dsphys;
+ uint64_t dsobj, ddobj;
+ objset_t *mos = dp->dp_meta_objset;
+ dsl_dir_t *dd;
+
+ ASSERT(clone_parent == NULL || clone_parent->ds_dir->dd_pool == dp);
+ ASSERT(clone_parent == NULL ||
+ clone_parent->ds_phys->ds_num_children > 0);
+ ASSERT(lastname[0] != '@');
+ ASSERT(dmu_tx_is_syncing(tx));
+
+ ddobj = dsl_dir_create_sync(pdd, lastname, tx);
+ VERIFY(0 == dsl_dir_open_obj(dp, ddobj, lastname, FTAG, &dd));
+
+ dsobj = dmu_object_alloc(mos, DMU_OT_DSL_DATASET, 0,
+ DMU_OT_DSL_DATASET, sizeof (dsl_dataset_phys_t), tx);
+ VERIFY(0 == dmu_bonus_hold(mos, dsobj, FTAG, &dbuf));
+ dmu_buf_will_dirty(dbuf, tx);
+ dsphys = dbuf->db_data;
+ dsphys->ds_dir_obj = dd->dd_object;
+ dsphys->ds_fsid_guid = unique_create();
+ unique_remove(dsphys->ds_fsid_guid); /* it isn't open yet */
+ (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid,
+ sizeof (dsphys->ds_guid));
+ dsphys->ds_snapnames_zapobj =
+ zap_create(mos, DMU_OT_DSL_DS_SNAP_MAP, DMU_OT_NONE, 0, tx);
+ dsphys->ds_creation_time = gethrestime_sec();
+ dsphys->ds_creation_txg = tx->tx_txg;
+ dsphys->ds_deadlist_obj =
+ bplist_create(mos, DSL_DEADLIST_BLOCKSIZE, tx);
+ if (clone_parent) {
+ dsphys->ds_prev_snap_obj = clone_parent->ds_object;
+ dsphys->ds_prev_snap_txg =
+ clone_parent->ds_phys->ds_creation_txg;
+ dsphys->ds_used_bytes =
+ clone_parent->ds_phys->ds_used_bytes;
+ dsphys->ds_compressed_bytes =
+ clone_parent->ds_phys->ds_compressed_bytes;
+ dsphys->ds_uncompressed_bytes =
+ clone_parent->ds_phys->ds_uncompressed_bytes;
+ dsphys->ds_bp = clone_parent->ds_phys->ds_bp;
+
+ dmu_buf_will_dirty(clone_parent->ds_dbuf, tx);
+ clone_parent->ds_phys->ds_num_children++;
+
+ dmu_buf_will_dirty(dd->dd_dbuf, tx);
+ dd->dd_phys->dd_clone_parent_obj = clone_parent->ds_object;
+ }
+ dmu_buf_rele(dbuf, FTAG);
+
+ dmu_buf_will_dirty(dd->dd_dbuf, tx);
+ dd->dd_phys->dd_head_dataset_obj = dsobj;
+ dsl_dir_close(dd, FTAG);
+
+ return (dsobj);
+}
+
+struct destroyarg {
+ dsl_sync_task_group_t *dstg;
+ char *snapname;
+ char *failed;
+};
+
+static int
+dsl_snapshot_destroy_one(char *name, void *arg)
+{
+ struct destroyarg *da = arg;
+ dsl_dataset_t *ds;
+ char *cp;
+ int err;
+
+ (void) strcat(name, "@");
+ (void) strcat(name, da->snapname);
+ err = dsl_dataset_open(name,
+ DS_MODE_EXCLUSIVE | DS_MODE_READONLY | DS_MODE_INCONSISTENT,
+ da->dstg, &ds);
+ cp = strchr(name, '@');
+ *cp = '\0';
+ if (err == ENOENT)
+ return (0);
+ if (err) {
+ (void) strcpy(da->failed, name);
+ return (err);
+ }
+
+ dsl_sync_task_create(da->dstg, dsl_dataset_destroy_check,
+ dsl_dataset_destroy_sync, ds, da->dstg, 0);
+ return (0);
+}
+
+/*
+ * Destroy 'snapname' in all descendants of 'fsname'.
+ */
+#pragma weak dmu_snapshots_destroy = dsl_snapshots_destroy
+int
+dsl_snapshots_destroy(char *fsname, char *snapname)
+{
+ int err;
+ struct destroyarg da;
+ dsl_sync_task_t *dst;
+ spa_t *spa;
+ char *cp;
+
+ cp = strchr(fsname, '/');
+ if (cp) {
+ *cp = '\0';
+ err = spa_open(fsname, &spa, FTAG);
+ *cp = '/';
+ } else {
+ err = spa_open(fsname, &spa, FTAG);
+ }
+ if (err)
+ return (err);
+ da.dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
+ da.snapname = snapname;
+ da.failed = fsname;
+
+ err = dmu_objset_find(fsname,
+ dsl_snapshot_destroy_one, &da, DS_FIND_CHILDREN);
+
+ if (err == 0)
+ err = dsl_sync_task_group_wait(da.dstg);
+
+ for (dst = list_head(&da.dstg->dstg_tasks); dst;
+ dst = list_next(&da.dstg->dstg_tasks, dst)) {
+ dsl_dataset_t *ds = dst->dst_arg1;
+ if (dst->dst_err) {
+ dsl_dataset_name(ds, fsname);
+ cp = strchr(fsname, '@');
+ *cp = '\0';
+ }
+ /*
+ * If it was successful, destroy_sync would have
+ * closed the ds
+ */
+ if (err)
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, da.dstg);
+ }
+
+ dsl_sync_task_group_destroy(da.dstg);
+ spa_close(spa, FTAG);
+ return (err);
+}
+
+int
+dsl_dataset_destroy(const char *name)
+{
+ int err;
+ dsl_sync_task_group_t *dstg;
+ objset_t *os;
+ dsl_dataset_t *ds;
+ dsl_dir_t *dd;
+ uint64_t obj;
+
+ if (strchr(name, '@')) {
+ /* Destroying a snapshot is simpler */
+ err = dsl_dataset_open(name,
+ DS_MODE_EXCLUSIVE | DS_MODE_READONLY | DS_MODE_INCONSISTENT,
+ FTAG, &ds);
+ if (err)
+ return (err);
+ err = dsl_sync_task_do(ds->ds_dir->dd_pool,
+ dsl_dataset_destroy_check, dsl_dataset_destroy_sync,
+ ds, FTAG, 0);
+ if (err)
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+ return (err);
+ }
+
+ err = dmu_objset_open(name, DMU_OST_ANY,
+ DS_MODE_EXCLUSIVE | DS_MODE_INCONSISTENT, &os);
+ if (err)
+ return (err);
+ ds = os->os->os_dsl_dataset;
+ dd = ds->ds_dir;
+
+ /*
+ * Check for errors and mark this ds as inconsistent, in
+ * case we crash while freeing the objects.
+ */
+ err = dsl_sync_task_do(dd->dd_pool, dsl_dataset_destroy_begin_check,
+ dsl_dataset_destroy_begin_sync, ds, NULL, 0);
+ if (err) {
+ dmu_objset_close(os);
+ return (err);
+ }
+
+ /*
+ * remove the objects in open context, so that we won't
+ * have too much to do in syncing context.
+ */
+ for (obj = 0; err == 0; err = dmu_object_next(os, &obj, FALSE,
+ ds->ds_phys->ds_prev_snap_txg)) {
+ dmu_tx_t *tx = dmu_tx_create(os);
+ dmu_tx_hold_free(tx, obj, 0, DMU_OBJECT_END);
+ dmu_tx_hold_bonus(tx, obj);
+ err = dmu_tx_assign(tx, TXG_WAIT);
+ if (err) {
+ /*
+ * Perhaps there is not enough disk
+ * space. Just deal with it from
+ * dsl_dataset_destroy_sync().
+ */
+ dmu_tx_abort(tx);
+ continue;
+ }
+ VERIFY(0 == dmu_object_free(os, obj, tx));
+ dmu_tx_commit(tx);
+ }
+ /* Make sure it's not dirty before we finish destroying it. */
+ txg_wait_synced(dd->dd_pool, 0);
+
+ dmu_objset_close(os);
+ if (err != ESRCH)
+ return (err);
+
+ err = dsl_dataset_open(name,
+ DS_MODE_EXCLUSIVE | DS_MODE_READONLY | DS_MODE_INCONSISTENT,
+ FTAG, &ds);
+ if (err)
+ return (err);
+
+ err = dsl_dir_open(name, FTAG, &dd, NULL);
+ if (err) {
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+ return (err);
+ }
+
+ /*
+ * Blow away the dsl_dir + head dataset.
+ */
+ dstg = dsl_sync_task_group_create(ds->ds_dir->dd_pool);
+ dsl_sync_task_create(dstg, dsl_dataset_destroy_check,
+ dsl_dataset_destroy_sync, ds, FTAG, 0);
+ dsl_sync_task_create(dstg, dsl_dir_destroy_check,
+ dsl_dir_destroy_sync, dd, FTAG, 0);
+ err = dsl_sync_task_group_wait(dstg);
+ dsl_sync_task_group_destroy(dstg);
+ /* if it is successful, *destroy_sync will close the ds+dd */
+ if (err) {
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+ dsl_dir_close(dd, FTAG);
+ }
+ return (err);
+}
+
+int
+dsl_dataset_rollback(dsl_dataset_t *ds)
+{
+ ASSERT3U(ds->ds_open_refcount, ==, DS_REF_MAX);
+ return (dsl_sync_task_do(ds->ds_dir->dd_pool,
+ dsl_dataset_rollback_check, dsl_dataset_rollback_sync,
+ ds, NULL, 0));
+}
+
+void *
+dsl_dataset_set_user_ptr(dsl_dataset_t *ds,
+ void *p, dsl_dataset_evict_func_t func)
+{
+ void *old;
+
+ mutex_enter(&ds->ds_lock);
+ old = ds->ds_user_ptr;
+ if (old == NULL) {
+ ds->ds_user_ptr = p;
+ ds->ds_user_evict_func = func;
+ }
+ mutex_exit(&ds->ds_lock);
+ return (old);
+}
+
+void *
+dsl_dataset_get_user_ptr(dsl_dataset_t *ds)
+{
+ return (ds->ds_user_ptr);
+}
+
+
+blkptr_t *
+dsl_dataset_get_blkptr(dsl_dataset_t *ds)
+{
+ return (&ds->ds_phys->ds_bp);
+}
+
+void
+dsl_dataset_set_blkptr(dsl_dataset_t *ds, blkptr_t *bp, dmu_tx_t *tx)
+{
+ ASSERT(dmu_tx_is_syncing(tx));
+ /* If it's the meta-objset, set dp_meta_rootbp */
+ if (ds == NULL) {
+ tx->tx_pool->dp_meta_rootbp = *bp;
+ } else {
+ dmu_buf_will_dirty(ds->ds_dbuf, tx);
+ ds->ds_phys->ds_bp = *bp;
+ }
+}
+
+spa_t *
+dsl_dataset_get_spa(dsl_dataset_t *ds)
+{
+ return (ds->ds_dir->dd_pool->dp_spa);
+}
+
+void
+dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx)
+{
+ dsl_pool_t *dp;
+
+ if (ds == NULL) /* this is the meta-objset */
+ return;
+
+ ASSERT(ds->ds_user_ptr != NULL);
+
+ if (ds->ds_phys->ds_next_snap_obj != 0)
+ panic("dirtying snapshot!");
+
+ dp = ds->ds_dir->dd_pool;
+
+ if (txg_list_add(&dp->dp_dirty_datasets, ds, tx->tx_txg) == 0) {
+ /* up the hold count until we can be written out */
+ dmu_buf_add_ref(ds->ds_dbuf, ds);
+ }
+}
+
+struct killarg {
+ uint64_t *usedp;
+ uint64_t *compressedp;
+ uint64_t *uncompressedp;
+ zio_t *zio;
+ dmu_tx_t *tx;
+};
+
+static int
+kill_blkptr(traverse_blk_cache_t *bc, spa_t *spa, void *arg)
+{
+ struct killarg *ka = arg;
+ blkptr_t *bp = &bc->bc_blkptr;
+
+ ASSERT3U(bc->bc_errno, ==, 0);
+
+ /*
+ * Since this callback is not called concurrently, no lock is
+ * needed on the accounting values.
+ */
+ *ka->usedp += bp_get_dasize(spa, bp);
+ *ka->compressedp += BP_GET_PSIZE(bp);
+ *ka->uncompressedp += BP_GET_UCSIZE(bp);
+ /* XXX check for EIO? */
+ (void) arc_free(ka->zio, spa, ka->tx->tx_txg, bp, NULL, NULL,
+ ARC_NOWAIT);
+ return (0);
+}
+
+/* ARGSUSED */
+static int
+dsl_dataset_rollback_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *ds = arg1;
+
+ /*
+ * There must be a previous snapshot. I suppose we could roll
+ * it back to being empty (and re-initialize the upper (ZPL)
+ * layer). But for now there's no way to do this via the user
+ * interface.
+ */
+ if (ds->ds_phys->ds_prev_snap_txg == 0)
+ return (EINVAL);
+
+ /*
+ * This must not be a snapshot.
+ */
+ if (ds->ds_phys->ds_next_snap_obj != 0)
+ return (EINVAL);
+
+ /*
+ * If we made changes this txg, traverse_dsl_dataset won't find
+ * them. Try again.
+ */
+ if (ds->ds_phys->ds_bp.blk_birth >= tx->tx_txg)
+ return (EAGAIN);
+
+ return (0);
+}
+
+/* ARGSUSED */
+static void
+dsl_dataset_rollback_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *ds = arg1;
+ objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
+
+ dmu_buf_will_dirty(ds->ds_dbuf, tx);
+
+ /* Zero out the deadlist. */
+ bplist_close(&ds->ds_deadlist);
+ bplist_destroy(mos, ds->ds_phys->ds_deadlist_obj, tx);
+ ds->ds_phys->ds_deadlist_obj =
+ bplist_create(mos, DSL_DEADLIST_BLOCKSIZE, tx);
+ VERIFY(0 == bplist_open(&ds->ds_deadlist, mos,
+ ds->ds_phys->ds_deadlist_obj));
+
+ {
+ /* Free blkptrs that we gave birth to */
+ zio_t *zio;
+ uint64_t used = 0, compressed = 0, uncompressed = 0;
+ struct killarg ka;
+
+ zio = zio_root(tx->tx_pool->dp_spa, NULL, NULL,
+ ZIO_FLAG_MUSTSUCCEED);
+ ka.usedp = &used;
+ ka.compressedp = &compressed;
+ ka.uncompressedp = &uncompressed;
+ ka.zio = zio;
+ ka.tx = tx;
+ (void) traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg,
+ ADVANCE_POST, kill_blkptr, &ka);
+ (void) zio_wait(zio);
+
+ dsl_dir_diduse_space(ds->ds_dir,
+ -used, -compressed, -uncompressed, tx);
+ }
+
+ /* Change our contents to that of the prev snapshot */
+ ASSERT3U(ds->ds_prev->ds_object, ==, ds->ds_phys->ds_prev_snap_obj);
+ ds->ds_phys->ds_bp = ds->ds_prev->ds_phys->ds_bp;
+ ds->ds_phys->ds_used_bytes = ds->ds_prev->ds_phys->ds_used_bytes;
+ ds->ds_phys->ds_compressed_bytes =
+ ds->ds_prev->ds_phys->ds_compressed_bytes;
+ ds->ds_phys->ds_uncompressed_bytes =
+ ds->ds_prev->ds_phys->ds_uncompressed_bytes;
+ ds->ds_phys->ds_flags = ds->ds_prev->ds_phys->ds_flags;
+ ds->ds_phys->ds_unique_bytes = 0;
+
+ if (ds->ds_prev->ds_phys->ds_next_snap_obj == ds->ds_object) {
+ dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx);
+ ds->ds_prev->ds_phys->ds_unique_bytes = 0;
+ }
+}
+
+/* ARGSUSED */
+static int
+dsl_dataset_destroy_begin_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *ds = arg1;
+
+ /*
+ * Can't delete a head dataset if there are snapshots of it.
+ * (Except if the only snapshots are from the branch we cloned
+ * from.)
+ */
+ if (ds->ds_prev != NULL &&
+ ds->ds_prev->ds_phys->ds_next_snap_obj == ds->ds_object)
+ return (EINVAL);
+
+ return (0);
+}
+
+/* ARGSUSED */
+static void
+dsl_dataset_destroy_begin_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *ds = arg1;
+
+ /* Mark it as inconsistent on-disk, in case we crash */
+ dmu_buf_will_dirty(ds->ds_dbuf, tx);
+ ds->ds_phys->ds_flags |= DS_FLAG_INCONSISTENT;
+}
+
+/* ARGSUSED */
+static int
+dsl_dataset_destroy_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *ds = arg1;
+
+ /* Can't delete a branch point. */
+ if (ds->ds_phys->ds_num_children > 1)
+ return (EEXIST);
+
+ /*
+ * Can't delete a head dataset if there are snapshots of it.
+ * (Except if the only snapshots are from the branch we cloned
+ * from.)
+ */
+ if (ds->ds_prev != NULL &&
+ ds->ds_prev->ds_phys->ds_next_snap_obj == ds->ds_object)
+ return (EINVAL);
+
+ /*
+ * If we made changes this txg, traverse_dsl_dataset won't find
+ * them. Try again.
+ */
+ if (ds->ds_phys->ds_bp.blk_birth >= tx->tx_txg)
+ return (EAGAIN);
+
+ /* XXX we should do some i/o error checking... */
+ return (0);
+}
+
+static void
+dsl_dataset_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx)
+{
+ dsl_dataset_t *ds = arg1;
+ uint64_t used = 0, compressed = 0, uncompressed = 0;
+ zio_t *zio;
+ int err;
+ int after_branch_point = FALSE;
+ dsl_pool_t *dp = ds->ds_dir->dd_pool;
+ objset_t *mos = dp->dp_meta_objset;
+ dsl_dataset_t *ds_prev = NULL;
+ uint64_t obj;
+
+ ASSERT3U(ds->ds_open_refcount, ==, DS_REF_MAX);
+ ASSERT3U(ds->ds_phys->ds_num_children, <=, 1);
+ ASSERT(ds->ds_prev == NULL ||
+ ds->ds_prev->ds_phys->ds_next_snap_obj != ds->ds_object);
+ ASSERT3U(ds->ds_phys->ds_bp.blk_birth, <=, tx->tx_txg);
+
+ ASSERT(RW_WRITE_HELD(&dp->dp_config_rwlock));
+
+ obj = ds->ds_object;
+
+ if (ds->ds_phys->ds_prev_snap_obj != 0) {
+ if (ds->ds_prev) {
+ ds_prev = ds->ds_prev;
+ } else {
+ VERIFY(0 == dsl_dataset_open_obj(dp,
+ ds->ds_phys->ds_prev_snap_obj, NULL,
+ DS_MODE_NONE, FTAG, &ds_prev));
+ }
+ after_branch_point =
+ (ds_prev->ds_phys->ds_next_snap_obj != obj);
+
+ dmu_buf_will_dirty(ds_prev->ds_dbuf, tx);
+ if (after_branch_point &&
+ ds->ds_phys->ds_next_snap_obj == 0) {
+ /* This clone is toast. */
+ ASSERT(ds_prev->ds_phys->ds_num_children > 1);
+ ds_prev->ds_phys->ds_num_children--;
+ } else if (!after_branch_point) {
+ ds_prev->ds_phys->ds_next_snap_obj =
+ ds->ds_phys->ds_next_snap_obj;
+ }
+ }
+
+ zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
+
+ if (ds->ds_phys->ds_next_snap_obj != 0) {
+ blkptr_t bp;
+ dsl_dataset_t *ds_next;
+ uint64_t itor = 0;
+
+ spa_scrub_restart(dp->dp_spa, tx->tx_txg);
+
+ VERIFY(0 == dsl_dataset_open_obj(dp,
+ ds->ds_phys->ds_next_snap_obj, NULL,
+ DS_MODE_NONE, FTAG, &ds_next));
+ ASSERT3U(ds_next->ds_phys->ds_prev_snap_obj, ==, obj);
+
+ dmu_buf_will_dirty(ds_next->ds_dbuf, tx);
+ ds_next->ds_phys->ds_prev_snap_obj =
+ ds->ds_phys->ds_prev_snap_obj;
+ ds_next->ds_phys->ds_prev_snap_txg =
+ ds->ds_phys->ds_prev_snap_txg;
+ ASSERT3U(ds->ds_phys->ds_prev_snap_txg, ==,
+ ds_prev ? ds_prev->ds_phys->ds_creation_txg : 0);
+
+ /*
+ * Transfer to our deadlist (which will become next's
+ * new deadlist) any entries from next's current
+ * deadlist which were born before prev, and free the
+ * other entries.
+ *
+ * XXX we're doing this long task with the config lock held
+ */
+ while (bplist_iterate(&ds_next->ds_deadlist, &itor,
+ &bp) == 0) {
+ if (bp.blk_birth <= ds->ds_phys->ds_prev_snap_txg) {
+ VERIFY(0 == bplist_enqueue(&ds->ds_deadlist,
+ &bp, tx));
+ if (ds_prev && !after_branch_point &&
+ bp.blk_birth >
+ ds_prev->ds_phys->ds_prev_snap_txg) {
+ ds_prev->ds_phys->ds_unique_bytes +=
+ bp_get_dasize(dp->dp_spa, &bp);
+ }
+ } else {
+ used += bp_get_dasize(dp->dp_spa, &bp);
+ compressed += BP_GET_PSIZE(&bp);
+ uncompressed += BP_GET_UCSIZE(&bp);
+ /* XXX check return value? */
+ (void) arc_free(zio, dp->dp_spa, tx->tx_txg,
+ &bp, NULL, NULL, ARC_NOWAIT);
+ }
+ }
+
+ /* free next's deadlist */
+ bplist_close(&ds_next->ds_deadlist);
+ bplist_destroy(mos, ds_next->ds_phys->ds_deadlist_obj, tx);
+
+ /* set next's deadlist to our deadlist */
+ ds_next->ds_phys->ds_deadlist_obj =
+ ds->ds_phys->ds_deadlist_obj;
+ VERIFY(0 == bplist_open(&ds_next->ds_deadlist, mos,
+ ds_next->ds_phys->ds_deadlist_obj));
+ ds->ds_phys->ds_deadlist_obj = 0;
+
+ if (ds_next->ds_phys->ds_next_snap_obj != 0) {
+ /*
+ * Update next's unique to include blocks which
+ * were previously shared by only this snapshot
+ * and it. Those blocks will be born after the
+ * prev snap and before this snap, and will have
+ * died after the next snap and before the one
+ * after that (ie. be on the snap after next's
+ * deadlist).
+ *
+ * XXX we're doing this long task with the
+ * config lock held
+ */
+ dsl_dataset_t *ds_after_next;
+
+ VERIFY(0 == dsl_dataset_open_obj(dp,
+ ds_next->ds_phys->ds_next_snap_obj, NULL,
+ DS_MODE_NONE, FTAG, &ds_after_next));
+ itor = 0;
+ while (bplist_iterate(&ds_after_next->ds_deadlist,
+ &itor, &bp) == 0) {
+ if (bp.blk_birth >
+ ds->ds_phys->ds_prev_snap_txg &&
+ bp.blk_birth <=
+ ds->ds_phys->ds_creation_txg) {
+ ds_next->ds_phys->ds_unique_bytes +=
+ bp_get_dasize(dp->dp_spa, &bp);
+ }
+ }
+
+ dsl_dataset_close(ds_after_next, DS_MODE_NONE, FTAG);
+ ASSERT3P(ds_next->ds_prev, ==, NULL);
+ } else {
+ /*
+ * It would be nice to update the head dataset's
+ * unique. To do so we would have to traverse
+ * it for blocks born after ds_prev, which is
+ * pretty expensive just to maintain something
+ * for debugging purposes.
+ */
+ ASSERT3P(ds_next->ds_prev, ==, ds);
+ dsl_dataset_close(ds_next->ds_prev, DS_MODE_NONE,
+ ds_next);
+ if (ds_prev) {
+ VERIFY(0 == dsl_dataset_open_obj(dp,
+ ds->ds_phys->ds_prev_snap_obj, NULL,
+ DS_MODE_NONE, ds_next, &ds_next->ds_prev));
+ } else {
+ ds_next->ds_prev = NULL;
+ }
+ }
+ dsl_dataset_close(ds_next, DS_MODE_NONE, FTAG);
+
+ /*
+ * NB: unique_bytes is not accurate for head objsets
+ * because we don't update it when we delete the most
+ * recent snapshot -- see above comment.
+ */
+ ASSERT3U(used, ==, ds->ds_phys->ds_unique_bytes);
+ } else {
+ /*
+ * There's no next snapshot, so this is a head dataset.
+ * Destroy the deadlist. Unless it's a clone, the
+ * deadlist should be empty. (If it's a clone, it's
+ * safe to ignore the deadlist contents.)
+ */
+ struct killarg ka;
+
+ ASSERT(after_branch_point || bplist_empty(&ds->ds_deadlist));
+ bplist_close(&ds->ds_deadlist);
+ bplist_destroy(mos, ds->ds_phys->ds_deadlist_obj, tx);
+ ds->ds_phys->ds_deadlist_obj = 0;
+
+ /*
+ * Free everything that we point to (that's born after
+ * the previous snapshot, if we are a clone)
+ *
+ * XXX we're doing this long task with the config lock held
+ */
+ ka.usedp = &used;
+ ka.compressedp = &compressed;
+ ka.uncompressedp = &uncompressed;
+ ka.zio = zio;
+ ka.tx = tx;
+ err = traverse_dsl_dataset(ds, ds->ds_phys->ds_prev_snap_txg,
+ ADVANCE_POST, kill_blkptr, &ka);
+ ASSERT3U(err, ==, 0);
+ }
+
+ err = zio_wait(zio);
+ ASSERT3U(err, ==, 0);
+
+ dsl_dir_diduse_space(ds->ds_dir, -used, -compressed, -uncompressed, tx);
+
+ if (ds->ds_phys->ds_snapnames_zapobj) {
+ err = zap_destroy(mos, ds->ds_phys->ds_snapnames_zapobj, tx);
+ ASSERT(err == 0);
+ }
+
+ if (ds->ds_dir->dd_phys->dd_head_dataset_obj == ds->ds_object) {
+ /* Erase the link in the dataset */
+ dmu_buf_will_dirty(ds->ds_dir->dd_dbuf, tx);
+ ds->ds_dir->dd_phys->dd_head_dataset_obj = 0;
+ /*
+ * dsl_dir_sync_destroy() called us, they'll destroy
+ * the dataset.
+ */
+ } else {
+ /* remove from snapshot namespace */
+ dsl_dataset_t *ds_head;
+ VERIFY(0 == dsl_dataset_open_obj(dp,
+ ds->ds_dir->dd_phys->dd_head_dataset_obj, NULL,
+ DS_MODE_NONE, FTAG, &ds_head));
+ VERIFY(0 == dsl_dataset_get_snapname(ds));
+#ifdef ZFS_DEBUG
+ {
+ uint64_t val;
+ err = zap_lookup(mos,
+ ds_head->ds_phys->ds_snapnames_zapobj,
+ ds->ds_snapname, 8, 1, &val);
+ ASSERT3U(err, ==, 0);
+ ASSERT3U(val, ==, obj);
+ }
+#endif
+ err = zap_remove(mos, ds_head->ds_phys->ds_snapnames_zapobj,
+ ds->ds_snapname, tx);
+ ASSERT(err == 0);
+ dsl_dataset_close(ds_head, DS_MODE_NONE, FTAG);
+ }
+
+ if (ds_prev && ds->ds_prev != ds_prev)
+ dsl_dataset_close(ds_prev, DS_MODE_NONE, FTAG);
+
+ spa_clear_bootfs(dp->dp_spa, ds->ds_object, tx);
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, tag);
+ VERIFY(0 == dmu_object_free(mos, obj, tx));
+
+}
+
+/* ARGSUSED */
+int
+dsl_dataset_snapshot_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ objset_t *os = arg1;
+ dsl_dataset_t *ds = os->os->os_dsl_dataset;
+ const char *snapname = arg2;
+ objset_t *mos = ds->ds_dir->dd_pool->dp_meta_objset;
+ int err;
+ uint64_t value;
+
+ /*
+ * We don't allow multiple snapshots of the same txg. If there
+ * is already one, try again.
+ */
+ if (ds->ds_phys->ds_prev_snap_txg >= tx->tx_txg)
+ return (EAGAIN);
+
+ /*
+ * Check for conflicting name snapshot name.
+ */
+ err = zap_lookup(mos, ds->ds_phys->ds_snapnames_zapobj,
+ snapname, 8, 1, &value);
+ if (err == 0)
+ return (EEXIST);
+ if (err != ENOENT)
+ return (err);
+
+ /*
+ * Check that the dataset's name is not too long. Name consists
+ * of the dataset's length + 1 for the @-sign + snapshot name's length
+ */
+ if (dsl_dataset_namelen(ds) + 1 + strlen(snapname) >= MAXNAMELEN)
+ return (ENAMETOOLONG);
+
+ ds->ds_trysnap_txg = tx->tx_txg;
+ return (0);
+}
+
+void
+dsl_dataset_snapshot_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ objset_t *os = arg1;
+ dsl_dataset_t *ds = os->os->os_dsl_dataset;
+ const char *snapname = arg2;
+ dsl_pool_t *dp = ds->ds_dir->dd_pool;
+ dmu_buf_t *dbuf;
+ dsl_dataset_phys_t *dsphys;
+ uint64_t dsobj;
+ objset_t *mos = dp->dp_meta_objset;
+ int err;
+
+ spa_scrub_restart(dp->dp_spa, tx->tx_txg);
+ ASSERT(RW_WRITE_HELD(&dp->dp_config_rwlock));
+
+ dsobj = dmu_object_alloc(mos, DMU_OT_DSL_DATASET, 0,
+ DMU_OT_DSL_DATASET, sizeof (dsl_dataset_phys_t), tx);
+ VERIFY(0 == dmu_bonus_hold(mos, dsobj, FTAG, &dbuf));
+ dmu_buf_will_dirty(dbuf, tx);
+ dsphys = dbuf->db_data;
+ dsphys->ds_dir_obj = ds->ds_dir->dd_object;
+ dsphys->ds_fsid_guid = unique_create();
+ unique_remove(dsphys->ds_fsid_guid); /* it isn't open yet */
+ (void) random_get_pseudo_bytes((void*)&dsphys->ds_guid,
+ sizeof (dsphys->ds_guid));
+ dsphys->ds_prev_snap_obj = ds->ds_phys->ds_prev_snap_obj;
+ dsphys->ds_prev_snap_txg = ds->ds_phys->ds_prev_snap_txg;
+ dsphys->ds_next_snap_obj = ds->ds_object;
+ dsphys->ds_num_children = 1;
+ dsphys->ds_creation_time = gethrestime_sec();
+ dsphys->ds_creation_txg = tx->tx_txg;
+ dsphys->ds_deadlist_obj = ds->ds_phys->ds_deadlist_obj;
+ dsphys->ds_used_bytes = ds->ds_phys->ds_used_bytes;
+ dsphys->ds_compressed_bytes = ds->ds_phys->ds_compressed_bytes;
+ dsphys->ds_uncompressed_bytes = ds->ds_phys->ds_uncompressed_bytes;
+ dsphys->ds_flags = ds->ds_phys->ds_flags;
+ dsphys->ds_bp = ds->ds_phys->ds_bp;
+ dmu_buf_rele(dbuf, FTAG);
+
+ ASSERT3U(ds->ds_prev != 0, ==, ds->ds_phys->ds_prev_snap_obj != 0);
+ if (ds->ds_prev) {
+ ASSERT(ds->ds_prev->ds_phys->ds_next_snap_obj ==
+ ds->ds_object ||
+ ds->ds_prev->ds_phys->ds_num_children > 1);
+ if (ds->ds_prev->ds_phys->ds_next_snap_obj == ds->ds_object) {
+ dmu_buf_will_dirty(ds->ds_prev->ds_dbuf, tx);
+ ASSERT3U(ds->ds_phys->ds_prev_snap_txg, ==,
+ ds->ds_prev->ds_phys->ds_creation_txg);
+ ds->ds_prev->ds_phys->ds_next_snap_obj = dsobj;
+ }
+ }
+
+ bplist_close(&ds->ds_deadlist);
+ dmu_buf_will_dirty(ds->ds_dbuf, tx);
+ ASSERT3U(ds->ds_phys->ds_prev_snap_txg, <, dsphys->ds_creation_txg);
+ ds->ds_phys->ds_prev_snap_obj = dsobj;
+ ds->ds_phys->ds_prev_snap_txg = dsphys->ds_creation_txg;
+ ds->ds_phys->ds_unique_bytes = 0;
+ ds->ds_phys->ds_deadlist_obj =
+ bplist_create(mos, DSL_DEADLIST_BLOCKSIZE, tx);
+ VERIFY(0 == bplist_open(&ds->ds_deadlist, mos,
+ ds->ds_phys->ds_deadlist_obj));
+
+ dprintf("snap '%s' -> obj %llu\n", snapname, dsobj);
+ err = zap_add(mos, ds->ds_phys->ds_snapnames_zapobj,
+ snapname, 8, 1, &dsobj, tx);
+ ASSERT(err == 0);
+
+ if (ds->ds_prev)
+ dsl_dataset_close(ds->ds_prev, DS_MODE_NONE, ds);
+ VERIFY(0 == dsl_dataset_open_obj(dp,
+ ds->ds_phys->ds_prev_snap_obj, snapname,
+ DS_MODE_NONE, ds, &ds->ds_prev));
+}
+
+void
+dsl_dataset_sync(dsl_dataset_t *ds, zio_t *zio, dmu_tx_t *tx)
+{
+ ASSERT(dmu_tx_is_syncing(tx));
+ ASSERT(ds->ds_user_ptr != NULL);
+ ASSERT(ds->ds_phys->ds_next_snap_obj == 0);
+
+ dsl_dir_dirty(ds->ds_dir, tx);
+ dmu_objset_sync(ds->ds_user_ptr, zio, tx);
+ /* Unneeded? bplist_close(&ds->ds_deadlist); */
+}
+
+void
+dsl_dataset_stats(dsl_dataset_t *ds, nvlist_t *nv)
+{
+ dsl_dir_stats(ds->ds_dir, nv);
+
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_CREATION,
+ ds->ds_phys->ds_creation_time);
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_CREATETXG,
+ ds->ds_phys->ds_creation_txg);
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_REFERENCED,
+ ds->ds_phys->ds_used_bytes);
+
+ if (ds->ds_phys->ds_next_snap_obj) {
+ /*
+ * This is a snapshot; override the dd's space used with
+ * our unique space and compression ratio.
+ */
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_USED,
+ ds->ds_phys->ds_unique_bytes);
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_COMPRESSRATIO,
+ ds->ds_phys->ds_compressed_bytes == 0 ? 100 :
+ (ds->ds_phys->ds_uncompressed_bytes * 100 /
+ ds->ds_phys->ds_compressed_bytes));
+ }
+}
+
+void
+dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat)
+{
+ stat->dds_creation_txg = ds->ds_phys->ds_creation_txg;
+ stat->dds_inconsistent = ds->ds_phys->ds_flags & DS_FLAG_INCONSISTENT;
+ if (ds->ds_phys->ds_next_snap_obj) {
+ stat->dds_is_snapshot = B_TRUE;
+ stat->dds_num_clones = ds->ds_phys->ds_num_children - 1;
+ }
+
+ /* clone origin is really a dsl_dir thing... */
+ if (ds->ds_dir->dd_phys->dd_clone_parent_obj) {
+ dsl_dataset_t *ods;
+
+ rw_enter(&ds->ds_dir->dd_pool->dp_config_rwlock, RW_READER);
+ VERIFY(0 == dsl_dataset_open_obj(ds->ds_dir->dd_pool,
+ ds->ds_dir->dd_phys->dd_clone_parent_obj,
+ NULL, DS_MODE_NONE, FTAG, &ods));
+ dsl_dataset_name(ods, stat->dds_clone_of);
+ dsl_dataset_close(ods, DS_MODE_NONE, FTAG);
+ rw_exit(&ds->ds_dir->dd_pool->dp_config_rwlock);
+ }
+}
+
+uint64_t
+dsl_dataset_fsid_guid(dsl_dataset_t *ds)
+{
+ return (ds->ds_phys->ds_fsid_guid);
+}
+
+void
+dsl_dataset_space(dsl_dataset_t *ds,
+ uint64_t *refdbytesp, uint64_t *availbytesp,
+ uint64_t *usedobjsp, uint64_t *availobjsp)
+{
+ *refdbytesp = ds->ds_phys->ds_used_bytes;
+ *availbytesp = dsl_dir_space_available(ds->ds_dir, NULL, 0, TRUE);
+ *usedobjsp = ds->ds_phys->ds_bp.blk_fill;
+ *availobjsp = DN_MAX_OBJECT - *usedobjsp;
+}
+
+/* ARGSUSED */
+static int
+dsl_dataset_snapshot_rename_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *ds = arg1;
+ char *newsnapname = arg2;
+ dsl_dir_t *dd = ds->ds_dir;
+ objset_t *mos = dd->dd_pool->dp_meta_objset;
+ dsl_dataset_t *hds;
+ uint64_t val;
+ int err;
+
+ err = dsl_dataset_open_obj(dd->dd_pool,
+ dd->dd_phys->dd_head_dataset_obj, NULL, DS_MODE_NONE, FTAG, &hds);
+ if (err)
+ return (err);
+
+ /* new name better not be in use */
+ err = zap_lookup(mos, hds->ds_phys->ds_snapnames_zapobj,
+ newsnapname, 8, 1, &val);
+ dsl_dataset_close(hds, DS_MODE_NONE, FTAG);
+
+ if (err == 0)
+ err = EEXIST;
+ else if (err == ENOENT)
+ err = 0;
+
+ /* dataset name + 1 for the "@" + the new snapshot name must fit */
+ if (dsl_dir_namelen(ds->ds_dir) + 1 + strlen(newsnapname) >= MAXNAMELEN)
+ err = ENAMETOOLONG;
+
+ return (err);
+}
+
+static void
+dsl_dataset_snapshot_rename_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *ds = arg1;
+ char *newsnapname = arg2;
+ dsl_dir_t *dd = ds->ds_dir;
+ objset_t *mos = dd->dd_pool->dp_meta_objset;
+ dsl_dataset_t *hds;
+ int err;
+
+ ASSERT(ds->ds_phys->ds_next_snap_obj != 0);
+
+ VERIFY(0 == dsl_dataset_open_obj(dd->dd_pool,
+ dd->dd_phys->dd_head_dataset_obj, NULL, DS_MODE_NONE, FTAG, &hds));
+
+ VERIFY(0 == dsl_dataset_get_snapname(ds));
+ err = zap_remove(mos, hds->ds_phys->ds_snapnames_zapobj,
+ ds->ds_snapname, tx);
+ ASSERT3U(err, ==, 0);
+ mutex_enter(&ds->ds_lock);
+ (void) strcpy(ds->ds_snapname, newsnapname);
+ mutex_exit(&ds->ds_lock);
+ err = zap_add(mos, hds->ds_phys->ds_snapnames_zapobj,
+ ds->ds_snapname, 8, 1, &ds->ds_object, tx);
+ ASSERT3U(err, ==, 0);
+
+ dsl_dataset_close(hds, DS_MODE_NONE, FTAG);
+}
+
+struct renamearg {
+ dsl_sync_task_group_t *dstg;
+ char failed[MAXPATHLEN];
+ char *oldsnap;
+ char *newsnap;
+};
+
+static int
+dsl_snapshot_rename_one(char *name, void *arg)
+{
+ struct renamearg *ra = arg;
+ dsl_dataset_t *ds = NULL;
+ char *cp;
+ int err;
+
+ cp = name + strlen(name);
+ *cp = '@';
+ (void) strcpy(cp + 1, ra->oldsnap);
+ err = dsl_dataset_open(name, DS_MODE_READONLY | DS_MODE_STANDARD,
+ ra->dstg, &ds);
+ if (err == ENOENT) {
+ *cp = '\0';
+ return (0);
+ }
+ if (err) {
+ (void) strcpy(ra->failed, name);
+ *cp = '\0';
+ dsl_dataset_close(ds, DS_MODE_STANDARD, ra->dstg);
+ return (err);
+ }
+
+#ifdef _KERNEL
+ /* for all filesystems undergoing rename, we'll need to unmount it */
+ (void) zfs_unmount_snap(name, NULL);
+#endif
+
+ *cp = '\0';
+
+ dsl_sync_task_create(ra->dstg, dsl_dataset_snapshot_rename_check,
+ dsl_dataset_snapshot_rename_sync, ds, ra->newsnap, 0);
+
+ return (0);
+}
+
+static int
+dsl_recursive_rename(char *oldname, const char *newname)
+{
+ int err;
+ struct renamearg *ra;
+ dsl_sync_task_t *dst;
+ spa_t *spa;
+ char *cp, *fsname = spa_strdup(oldname);
+ int len = strlen(oldname);
+
+ /* truncate the snapshot name to get the fsname */
+ cp = strchr(fsname, '@');
+ *cp = '\0';
+
+ cp = strchr(fsname, '/');
+ if (cp) {
+ *cp = '\0';
+ err = spa_open(fsname, &spa, FTAG);
+ *cp = '/';
+ } else {
+ err = spa_open(fsname, &spa, FTAG);
+ }
+ if (err) {
+ kmem_free(fsname, len + 1);
+ return (err);
+ }
+ ra = kmem_alloc(sizeof (struct renamearg), KM_SLEEP);
+ ra->dstg = dsl_sync_task_group_create(spa_get_dsl(spa));
+
+ ra->oldsnap = strchr(oldname, '@') + 1;
+ ra->newsnap = strchr(newname, '@') + 1;
+ *ra->failed = '\0';
+
+ err = dmu_objset_find(fsname, dsl_snapshot_rename_one, ra,
+ DS_FIND_CHILDREN);
+ kmem_free(fsname, len + 1);
+
+ if (err == 0) {
+ err = dsl_sync_task_group_wait(ra->dstg);
+ }
+
+ for (dst = list_head(&ra->dstg->dstg_tasks); dst;
+ dst = list_next(&ra->dstg->dstg_tasks, dst)) {
+ dsl_dataset_t *ds = dst->dst_arg1;
+ if (dst->dst_err) {
+ dsl_dir_name(ds->ds_dir, ra->failed);
+ (void) strcat(ra->failed, "@");
+ (void) strcat(ra->failed, ra->newsnap);
+ }
+ dsl_dataset_close(ds, DS_MODE_STANDARD, ra->dstg);
+ }
+
+ (void) strcpy(oldname, ra->failed);
+
+ dsl_sync_task_group_destroy(ra->dstg);
+ kmem_free(ra, sizeof (struct renamearg));
+ spa_close(spa, FTAG);
+ return (err);
+}
+
+#pragma weak dmu_objset_rename = dsl_dataset_rename
+int
+dsl_dataset_rename(char *oldname, const char *newname,
+ boolean_t recursive)
+{
+ dsl_dir_t *dd;
+ dsl_dataset_t *ds;
+ const char *tail;
+ int err;
+
+ err = dsl_dir_open(oldname, FTAG, &dd, &tail);
+ if (err)
+ return (err);
+ if (tail == NULL) {
+ err = dsl_dir_rename(dd, newname);
+ dsl_dir_close(dd, FTAG);
+ return (err);
+ }
+ if (tail[0] != '@') {
+ /* the name ended in a nonexistant component */
+ dsl_dir_close(dd, FTAG);
+ return (ENOENT);
+ }
+
+ dsl_dir_close(dd, FTAG);
+
+ /* new name must be snapshot in same filesystem */
+ tail = strchr(newname, '@');
+ if (tail == NULL)
+ return (EINVAL);
+ tail++;
+ if (strncmp(oldname, newname, tail - newname) != 0)
+ return (EXDEV);
+
+ if (recursive) {
+ err = dsl_recursive_rename(oldname, newname);
+ } else {
+ err = dsl_dataset_open(oldname,
+ DS_MODE_READONLY | DS_MODE_STANDARD, FTAG, &ds);
+ if (err)
+ return (err);
+
+ err = dsl_sync_task_do(ds->ds_dir->dd_pool,
+ dsl_dataset_snapshot_rename_check,
+ dsl_dataset_snapshot_rename_sync, ds, (char *)tail, 1);
+
+ dsl_dataset_close(ds, DS_MODE_STANDARD, FTAG);
+ }
+
+ return (err);
+}
+
+struct promotearg {
+ uint64_t used, comp, uncomp, unique;
+ uint64_t newnext_obj, snapnames_obj;
+};
+
+static int
+dsl_dataset_promote_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *hds = arg1;
+ struct promotearg *pa = arg2;
+ dsl_dir_t *dd = hds->ds_dir;
+ dsl_pool_t *dp = hds->ds_dir->dd_pool;
+ dsl_dir_t *pdd = NULL;
+ dsl_dataset_t *ds = NULL;
+ dsl_dataset_t *pivot_ds = NULL;
+ dsl_dataset_t *newnext_ds = NULL;
+ int err;
+ char *name = NULL;
+ uint64_t itor = 0;
+ blkptr_t bp;
+
+ bzero(pa, sizeof (*pa));
+
+ /* Check that it is a clone */
+ if (dd->dd_phys->dd_clone_parent_obj == 0)
+ return (EINVAL);
+
+ /* Since this is so expensive, don't do the preliminary check */
+ if (!dmu_tx_is_syncing(tx))
+ return (0);
+
+ if (err = dsl_dataset_open_obj(dp,
+ dd->dd_phys->dd_clone_parent_obj,
+ NULL, DS_MODE_EXCLUSIVE, FTAG, &pivot_ds))
+ goto out;
+ pdd = pivot_ds->ds_dir;
+
+ {
+ dsl_dataset_t *phds;
+ if (err = dsl_dataset_open_obj(dd->dd_pool,
+ pdd->dd_phys->dd_head_dataset_obj,
+ NULL, DS_MODE_NONE, FTAG, &phds))
+ goto out;
+ pa->snapnames_obj = phds->ds_phys->ds_snapnames_zapobj;
+ dsl_dataset_close(phds, DS_MODE_NONE, FTAG);
+ }
+
+ if (hds->ds_phys->ds_flags & DS_FLAG_NOPROMOTE) {
+ err = EXDEV;
+ goto out;
+ }
+
+ /* find pivot point's new next ds */
+ VERIFY(0 == dsl_dataset_open_obj(dd->dd_pool, hds->ds_object,
+ NULL, DS_MODE_NONE, FTAG, &newnext_ds));
+ while (newnext_ds->ds_phys->ds_prev_snap_obj != pivot_ds->ds_object) {
+ dsl_dataset_t *prev;
+
+ if (err = dsl_dataset_open_obj(dd->dd_pool,
+ newnext_ds->ds_phys->ds_prev_snap_obj,
+ NULL, DS_MODE_NONE, FTAG, &prev))
+ goto out;
+ dsl_dataset_close(newnext_ds, DS_MODE_NONE, FTAG);
+ newnext_ds = prev;
+ }
+ pa->newnext_obj = newnext_ds->ds_object;
+
+ /* compute pivot point's new unique space */
+ while ((err = bplist_iterate(&newnext_ds->ds_deadlist,
+ &itor, &bp)) == 0) {
+ if (bp.blk_birth > pivot_ds->ds_phys->ds_prev_snap_txg)
+ pa->unique += bp_get_dasize(dd->dd_pool->dp_spa, &bp);
+ }
+ if (err != ENOENT)
+ goto out;
+
+ /* Walk the snapshots that we are moving */
+ name = kmem_alloc(MAXPATHLEN, KM_SLEEP);
+ ds = pivot_ds;
+ /* CONSTCOND */
+ while (TRUE) {
+ uint64_t val, dlused, dlcomp, dluncomp;
+ dsl_dataset_t *prev;
+
+ /* Check that the snapshot name does not conflict */
+ dsl_dataset_name(ds, name);
+ err = zap_lookup(dd->dd_pool->dp_meta_objset,
+ hds->ds_phys->ds_snapnames_zapobj, ds->ds_snapname,
+ 8, 1, &val);
+ if (err != ENOENT) {
+ if (err == 0)
+ err = EEXIST;
+ goto out;
+ }
+
+ /*
+ * compute space to transfer. Each snapshot gave birth to:
+ * (my used) - (prev's used) + (deadlist's used)
+ */
+ pa->used += ds->ds_phys->ds_used_bytes;
+ pa->comp += ds->ds_phys->ds_compressed_bytes;
+ pa->uncomp += ds->ds_phys->ds_uncompressed_bytes;
+
+ /* If we reach the first snapshot, we're done. */
+ if (ds->ds_phys->ds_prev_snap_obj == 0)
+ break;
+
+ if (err = bplist_space(&ds->ds_deadlist,
+ &dlused, &dlcomp, &dluncomp))
+ goto out;
+ if (err = dsl_dataset_open_obj(dd->dd_pool,
+ ds->ds_phys->ds_prev_snap_obj, NULL, DS_MODE_EXCLUSIVE,
+ FTAG, &prev))
+ goto out;
+ pa->used += dlused - prev->ds_phys->ds_used_bytes;
+ pa->comp += dlcomp - prev->ds_phys->ds_compressed_bytes;
+ pa->uncomp += dluncomp - prev->ds_phys->ds_uncompressed_bytes;
+
+ /*
+ * We could be a clone of a clone. If we reach our
+ * parent's branch point, we're done.
+ */
+ if (prev->ds_phys->ds_next_snap_obj != ds->ds_object) {
+ dsl_dataset_close(prev, DS_MODE_EXCLUSIVE, FTAG);
+ break;
+ }
+ if (ds != pivot_ds)
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+ ds = prev;
+ }
+
+ /* Check that there is enough space here */
+ err = dsl_dir_transfer_possible(pdd, dd, pa->used);
+
+out:
+ if (ds && ds != pivot_ds)
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+ if (pivot_ds)
+ dsl_dataset_close(pivot_ds, DS_MODE_EXCLUSIVE, FTAG);
+ if (newnext_ds)
+ dsl_dataset_close(newnext_ds, DS_MODE_NONE, FTAG);
+ if (name)
+ kmem_free(name, MAXPATHLEN);
+ return (err);
+}
+
+static void
+dsl_dataset_promote_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dataset_t *hds = arg1;
+ struct promotearg *pa = arg2;
+ dsl_dir_t *dd = hds->ds_dir;
+ dsl_pool_t *dp = hds->ds_dir->dd_pool;
+ dsl_dir_t *pdd = NULL;
+ dsl_dataset_t *ds, *pivot_ds;
+ char *name;
+
+ ASSERT(dd->dd_phys->dd_clone_parent_obj != 0);
+ ASSERT(0 == (hds->ds_phys->ds_flags & DS_FLAG_NOPROMOTE));
+
+ VERIFY(0 == dsl_dataset_open_obj(dp,
+ dd->dd_phys->dd_clone_parent_obj,
+ NULL, DS_MODE_EXCLUSIVE, FTAG, &pivot_ds));
+ /*
+ * We need to explicitly open pdd, since pivot_ds's pdd will be
+ * changing.
+ */
+ VERIFY(0 == dsl_dir_open_obj(dp, pivot_ds->ds_dir->dd_object,
+ NULL, FTAG, &pdd));
+
+ /* move snapshots to this dir */
+ name = kmem_alloc(MAXPATHLEN, KM_SLEEP);
+ ds = pivot_ds;
+ /* CONSTCOND */
+ while (TRUE) {
+ dsl_dataset_t *prev;
+
+ /* move snap name entry */
+ dsl_dataset_name(ds, name);
+ VERIFY(0 == zap_remove(dp->dp_meta_objset,
+ pa->snapnames_obj, ds->ds_snapname, tx));
+ VERIFY(0 == zap_add(dp->dp_meta_objset,
+ hds->ds_phys->ds_snapnames_zapobj, ds->ds_snapname,
+ 8, 1, &ds->ds_object, tx));
+
+ /* change containing dsl_dir */
+ dmu_buf_will_dirty(ds->ds_dbuf, tx);
+ ASSERT3U(ds->ds_phys->ds_dir_obj, ==, pdd->dd_object);
+ ds->ds_phys->ds_dir_obj = dd->dd_object;
+ ASSERT3P(ds->ds_dir, ==, pdd);
+ dsl_dir_close(ds->ds_dir, ds);
+ VERIFY(0 == dsl_dir_open_obj(dp, dd->dd_object,
+ NULL, ds, &ds->ds_dir));
+
+ ASSERT3U(dsl_prop_numcb(ds), ==, 0);
+
+ if (ds->ds_phys->ds_prev_snap_obj == 0)
+ break;
+
+ VERIFY(0 == dsl_dataset_open_obj(dp,
+ ds->ds_phys->ds_prev_snap_obj, NULL, DS_MODE_EXCLUSIVE,
+ FTAG, &prev));
+
+ if (prev->ds_phys->ds_next_snap_obj != ds->ds_object) {
+ dsl_dataset_close(prev, DS_MODE_EXCLUSIVE, FTAG);
+ break;
+ }
+ if (ds != pivot_ds)
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+ ds = prev;
+ }
+ if (ds != pivot_ds)
+ dsl_dataset_close(ds, DS_MODE_EXCLUSIVE, FTAG);
+
+ /* change pivot point's next snap */
+ dmu_buf_will_dirty(pivot_ds->ds_dbuf, tx);
+ pivot_ds->ds_phys->ds_next_snap_obj = pa->newnext_obj;
+
+ /* change clone_parent-age */
+ dmu_buf_will_dirty(dd->dd_dbuf, tx);
+ ASSERT3U(dd->dd_phys->dd_clone_parent_obj, ==, pivot_ds->ds_object);
+ dd->dd_phys->dd_clone_parent_obj = pdd->dd_phys->dd_clone_parent_obj;
+ dmu_buf_will_dirty(pdd->dd_dbuf, tx);
+ pdd->dd_phys->dd_clone_parent_obj = pivot_ds->ds_object;
+
+ /* change space accounting */
+ dsl_dir_diduse_space(pdd, -pa->used, -pa->comp, -pa->uncomp, tx);
+ dsl_dir_diduse_space(dd, pa->used, pa->comp, pa->uncomp, tx);
+ pivot_ds->ds_phys->ds_unique_bytes = pa->unique;
+
+ dsl_dir_close(pdd, FTAG);
+ dsl_dataset_close(pivot_ds, DS_MODE_EXCLUSIVE, FTAG);
+ kmem_free(name, MAXPATHLEN);
+}
+
+int
+dsl_dataset_promote(const char *name)
+{
+ dsl_dataset_t *ds;
+ int err;
+ dmu_object_info_t doi;
+ struct promotearg pa;
+
+ err = dsl_dataset_open(name, DS_MODE_NONE, FTAG, &ds);
+ if (err)
+ return (err);
+
+ err = dmu_object_info(ds->ds_dir->dd_pool->dp_meta_objset,
+ ds->ds_phys->ds_snapnames_zapobj, &doi);
+ if (err) {
+ dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
+ return (err);
+ }
+
+ /*
+ * Add in 128x the snapnames zapobj size, since we will be moving
+ * a bunch of snapnames to the promoted ds, and dirtying their
+ * bonus buffers.
+ */
+ err = dsl_sync_task_do(ds->ds_dir->dd_pool,
+ dsl_dataset_promote_check,
+ dsl_dataset_promote_sync, ds, &pa, 2 + 2 * doi.doi_physical_blks);
+ dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
+ return (err);
+}
+
+/*
+ * Given a pool name and a dataset object number in that pool,
+ * return the name of that dataset.
+ */
+int
+dsl_dsobj_to_dsname(char *pname, uint64_t obj, char *buf)
+{
+ spa_t *spa;
+ dsl_pool_t *dp;
+ dsl_dataset_t *ds = NULL;
+ int error;
+
+ if ((error = spa_open(pname, &spa, FTAG)) != 0)
+ return (error);
+ dp = spa_get_dsl(spa);
+ rw_enter(&dp->dp_config_rwlock, RW_READER);
+ if ((error = dsl_dataset_open_obj(dp, obj,
+ NULL, DS_MODE_NONE, FTAG, &ds)) != 0) {
+ rw_exit(&dp->dp_config_rwlock);
+ spa_close(spa, FTAG);
+ return (error);
+ }
+ dsl_dataset_name(ds, buf);
+ dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
+ rw_exit(&dp->dp_config_rwlock);
+ spa_close(spa, FTAG);
+
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c
new file mode 100644
index 0000000..5e563b6
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_dir.c
@@ -0,0 +1,1215 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/dmu_tx.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_prop.h>
+#include <sys/dsl_synctask.h>
+#include <sys/spa.h>
+#include <sys/zap.h>
+#include <sys/zio.h>
+#include <sys/arc.h>
+#include "zfs_namecheck.h"
+
+static uint64_t dsl_dir_estimated_space(dsl_dir_t *dd);
+static void dsl_dir_set_reservation_sync(void *arg1, void *arg2, dmu_tx_t *tx);
+
+
+/* ARGSUSED */
+static void
+dsl_dir_evict(dmu_buf_t *db, void *arg)
+{
+ dsl_dir_t *dd = arg;
+ dsl_pool_t *dp = dd->dd_pool;
+ int t;
+
+ for (t = 0; t < TXG_SIZE; t++) {
+ ASSERT(!txg_list_member(&dp->dp_dirty_dirs, dd, t));
+ ASSERT(dd->dd_tempreserved[t] == 0);
+ ASSERT(dd->dd_space_towrite[t] == 0);
+ }
+
+ ASSERT3U(dd->dd_used_bytes, ==, dd->dd_phys->dd_used_bytes);
+
+ if (dd->dd_parent)
+ dsl_dir_close(dd->dd_parent, dd);
+
+ spa_close(dd->dd_pool->dp_spa, dd);
+
+ /*
+ * The props callback list should be empty since they hold the
+ * dir open.
+ */
+ list_destroy(&dd->dd_prop_cbs);
+ mutex_destroy(&dd->dd_lock);
+ kmem_free(dd, sizeof (dsl_dir_t));
+}
+
+int
+dsl_dir_open_obj(dsl_pool_t *dp, uint64_t ddobj,
+ const char *tail, void *tag, dsl_dir_t **ddp)
+{
+ dmu_buf_t *dbuf;
+ dsl_dir_t *dd;
+ int err;
+
+ ASSERT(RW_LOCK_HELD(&dp->dp_config_rwlock) ||
+ dsl_pool_sync_context(dp));
+
+ err = dmu_bonus_hold(dp->dp_meta_objset, ddobj, tag, &dbuf);
+ if (err)
+ return (err);
+ dd = dmu_buf_get_user(dbuf);
+#ifdef ZFS_DEBUG
+ {
+ dmu_object_info_t doi;
+ dmu_object_info_from_db(dbuf, &doi);
+ ASSERT3U(doi.doi_type, ==, DMU_OT_DSL_DIR);
+ }
+#endif
+ /* XXX assert bonus buffer size is correct */
+ if (dd == NULL) {
+ dsl_dir_t *winner;
+ int err;
+
+ dd = kmem_zalloc(sizeof (dsl_dir_t), KM_SLEEP);
+ dd->dd_object = ddobj;
+ dd->dd_dbuf = dbuf;
+ dd->dd_pool = dp;
+ dd->dd_phys = dbuf->db_data;
+ dd->dd_used_bytes = dd->dd_phys->dd_used_bytes;
+ mutex_init(&dd->dd_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ list_create(&dd->dd_prop_cbs, sizeof (dsl_prop_cb_record_t),
+ offsetof(dsl_prop_cb_record_t, cbr_node));
+
+ if (dd->dd_phys->dd_parent_obj) {
+ err = dsl_dir_open_obj(dp, dd->dd_phys->dd_parent_obj,
+ NULL, dd, &dd->dd_parent);
+ if (err) {
+ mutex_destroy(&dd->dd_lock);
+ kmem_free(dd, sizeof (dsl_dir_t));
+ dmu_buf_rele(dbuf, tag);
+ return (err);
+ }
+ if (tail) {
+#ifdef ZFS_DEBUG
+ uint64_t foundobj;
+
+ err = zap_lookup(dp->dp_meta_objset,
+ dd->dd_parent->dd_phys->
+ dd_child_dir_zapobj,
+ tail, sizeof (foundobj), 1, &foundobj);
+ ASSERT(err || foundobj == ddobj);
+#endif
+ (void) strcpy(dd->dd_myname, tail);
+ } else {
+ err = zap_value_search(dp->dp_meta_objset,
+ dd->dd_parent->dd_phys->
+ dd_child_dir_zapobj,
+ ddobj, dd->dd_myname);
+ }
+ if (err) {
+ dsl_dir_close(dd->dd_parent, dd);
+ mutex_destroy(&dd->dd_lock);
+ kmem_free(dd, sizeof (dsl_dir_t));
+ dmu_buf_rele(dbuf, tag);
+ return (err);
+ }
+ } else {
+ (void) strcpy(dd->dd_myname, spa_name(dp->dp_spa));
+ }
+
+ winner = dmu_buf_set_user_ie(dbuf, dd, &dd->dd_phys,
+ dsl_dir_evict);
+ if (winner) {
+ if (dd->dd_parent)
+ dsl_dir_close(dd->dd_parent, dd);
+ mutex_destroy(&dd->dd_lock);
+ kmem_free(dd, sizeof (dsl_dir_t));
+ dd = winner;
+ } else {
+ spa_open_ref(dp->dp_spa, dd);
+ }
+ }
+
+ /*
+ * The dsl_dir_t has both open-to-close and instantiate-to-evict
+ * holds on the spa. We need the open-to-close holds because
+ * otherwise the spa_refcnt wouldn't change when we open a
+ * dir which the spa also has open, so we could incorrectly
+ * think it was OK to unload/export/destroy the pool. We need
+ * the instantiate-to-evict hold because the dsl_dir_t has a
+ * pointer to the dd_pool, which has a pointer to the spa_t.
+ */
+ spa_open_ref(dp->dp_spa, tag);
+ ASSERT3P(dd->dd_pool, ==, dp);
+ ASSERT3U(dd->dd_object, ==, ddobj);
+ ASSERT3P(dd->dd_dbuf, ==, dbuf);
+ *ddp = dd;
+ return (0);
+}
+
+void
+dsl_dir_close(dsl_dir_t *dd, void *tag)
+{
+ dprintf_dd(dd, "%s\n", "");
+ spa_close(dd->dd_pool->dp_spa, tag);
+ dmu_buf_rele(dd->dd_dbuf, tag);
+}
+
+/* buf must be long enough (MAXNAMELEN + strlen(MOS_DIR_NAME) + 1 should do) */
+void
+dsl_dir_name(dsl_dir_t *dd, char *buf)
+{
+ if (dd->dd_parent) {
+ dsl_dir_name(dd->dd_parent, buf);
+ (void) strcat(buf, "/");
+ } else {
+ buf[0] = '\0';
+ }
+ if (!MUTEX_HELD(&dd->dd_lock)) {
+ /*
+ * recursive mutex so that we can use
+ * dprintf_dd() with dd_lock held
+ */
+ mutex_enter(&dd->dd_lock);
+ (void) strcat(buf, dd->dd_myname);
+ mutex_exit(&dd->dd_lock);
+ } else {
+ (void) strcat(buf, dd->dd_myname);
+ }
+}
+
+/* Calculate name legnth, avoiding all the strcat calls of dsl_dir_name */
+int
+dsl_dir_namelen(dsl_dir_t *dd)
+{
+ int result = 0;
+
+ if (dd->dd_parent) {
+ /* parent's name + 1 for the "/" */
+ result = dsl_dir_namelen(dd->dd_parent) + 1;
+ }
+
+ if (!MUTEX_HELD(&dd->dd_lock)) {
+ /* see dsl_dir_name */
+ mutex_enter(&dd->dd_lock);
+ result += strlen(dd->dd_myname);
+ mutex_exit(&dd->dd_lock);
+ } else {
+ result += strlen(dd->dd_myname);
+ }
+
+ return (result);
+}
+
+int
+dsl_dir_is_private(dsl_dir_t *dd)
+{
+ int rv = FALSE;
+
+ if (dd->dd_parent && dsl_dir_is_private(dd->dd_parent))
+ rv = TRUE;
+ if (dataset_name_hidden(dd->dd_myname))
+ rv = TRUE;
+ return (rv);
+}
+
+
+static int
+getcomponent(const char *path, char *component, const char **nextp)
+{
+ char *p;
+ if (path == NULL)
+ return (ENOENT);
+ /* This would be a good place to reserve some namespace... */
+ p = strpbrk(path, "/@");
+ if (p && (p[1] == '/' || p[1] == '@')) {
+ /* two separators in a row */
+ return (EINVAL);
+ }
+ if (p == NULL || p == path) {
+ /*
+ * if the first thing is an @ or /, it had better be an
+ * @ and it had better not have any more ats or slashes,
+ * and it had better have something after the @.
+ */
+ if (p != NULL &&
+ (p[0] != '@' || strpbrk(path+1, "/@") || p[1] == '\0'))
+ return (EINVAL);
+ if (strlen(path) >= MAXNAMELEN)
+ return (ENAMETOOLONG);
+ (void) strcpy(component, path);
+ p = NULL;
+ } else if (p[0] == '/') {
+ if (p-path >= MAXNAMELEN)
+ return (ENAMETOOLONG);
+ (void) strncpy(component, path, p - path);
+ component[p-path] = '\0';
+ p++;
+ } else if (p[0] == '@') {
+ /*
+ * if the next separator is an @, there better not be
+ * any more slashes.
+ */
+ if (strchr(path, '/'))
+ return (EINVAL);
+ if (p-path >= MAXNAMELEN)
+ return (ENAMETOOLONG);
+ (void) strncpy(component, path, p - path);
+ component[p-path] = '\0';
+ } else {
+ ASSERT(!"invalid p");
+ }
+ *nextp = p;
+ return (0);
+}
+
+/*
+ * same as dsl_open_dir, ignore the first component of name and use the
+ * spa instead
+ */
+int
+dsl_dir_open_spa(spa_t *spa, const char *name, void *tag,
+ dsl_dir_t **ddp, const char **tailp)
+{
+ char buf[MAXNAMELEN];
+ const char *next, *nextnext = NULL;
+ int err;
+ dsl_dir_t *dd;
+ dsl_pool_t *dp;
+ uint64_t ddobj;
+ int openedspa = FALSE;
+
+ dprintf("%s\n", name);
+
+ err = getcomponent(name, buf, &next);
+ if (err)
+ return (err);
+ if (spa == NULL) {
+ err = spa_open(buf, &spa, FTAG);
+ if (err) {
+ dprintf("spa_open(%s) failed\n", buf);
+ return (err);
+ }
+ openedspa = TRUE;
+
+ /* XXX this assertion belongs in spa_open */
+ ASSERT(!dsl_pool_sync_context(spa_get_dsl(spa)));
+ }
+
+ dp = spa_get_dsl(spa);
+
+ rw_enter(&dp->dp_config_rwlock, RW_READER);
+ err = dsl_dir_open_obj(dp, dp->dp_root_dir_obj, NULL, tag, &dd);
+ if (err) {
+ rw_exit(&dp->dp_config_rwlock);
+ if (openedspa)
+ spa_close(spa, FTAG);
+ return (err);
+ }
+
+ while (next != NULL) {
+ dsl_dir_t *child_ds;
+ err = getcomponent(next, buf, &nextnext);
+ if (err)
+ break;
+ ASSERT(next[0] != '\0');
+ if (next[0] == '@')
+ break;
+ dprintf("looking up %s in obj%lld\n",
+ buf, dd->dd_phys->dd_child_dir_zapobj);
+
+ err = zap_lookup(dp->dp_meta_objset,
+ dd->dd_phys->dd_child_dir_zapobj,
+ buf, sizeof (ddobj), 1, &ddobj);
+ if (err) {
+ if (err == ENOENT)
+ err = 0;
+ break;
+ }
+
+ err = dsl_dir_open_obj(dp, ddobj, buf, tag, &child_ds);
+ if (err)
+ break;
+ dsl_dir_close(dd, tag);
+ dd = child_ds;
+ next = nextnext;
+ }
+ rw_exit(&dp->dp_config_rwlock);
+
+ if (err) {
+ dsl_dir_close(dd, tag);
+ if (openedspa)
+ spa_close(spa, FTAG);
+ return (err);
+ }
+
+ /*
+ * It's an error if there's more than one component left, or
+ * tailp==NULL and there's any component left.
+ */
+ if (next != NULL &&
+ (tailp == NULL || (nextnext && nextnext[0] != '\0'))) {
+ /* bad path name */
+ dsl_dir_close(dd, tag);
+ dprintf("next=%p (%s) tail=%p\n", next, next?next:"", tailp);
+ err = ENOENT;
+ }
+ if (tailp)
+ *tailp = next;
+ if (openedspa)
+ spa_close(spa, FTAG);
+ *ddp = dd;
+ return (err);
+}
+
+/*
+ * Return the dsl_dir_t, and possibly the last component which couldn't
+ * be found in *tail. Return NULL if the path is bogus, or if
+ * tail==NULL and we couldn't parse the whole name. (*tail)[0] == '@'
+ * means that the last component is a snapshot.
+ */
+int
+dsl_dir_open(const char *name, void *tag, dsl_dir_t **ddp, const char **tailp)
+{
+ return (dsl_dir_open_spa(NULL, name, tag, ddp, tailp));
+}
+
+uint64_t
+dsl_dir_create_sync(dsl_dir_t *pds, const char *name, dmu_tx_t *tx)
+{
+ objset_t *mos = pds->dd_pool->dp_meta_objset;
+ uint64_t ddobj;
+ dsl_dir_phys_t *dsphys;
+ dmu_buf_t *dbuf;
+
+ ddobj = dmu_object_alloc(mos, DMU_OT_DSL_DIR, 0,
+ DMU_OT_DSL_DIR, sizeof (dsl_dir_phys_t), tx);
+ VERIFY(0 == zap_add(mos, pds->dd_phys->dd_child_dir_zapobj,
+ name, sizeof (uint64_t), 1, &ddobj, tx));
+ VERIFY(0 == dmu_bonus_hold(mos, ddobj, FTAG, &dbuf));
+ dmu_buf_will_dirty(dbuf, tx);
+ dsphys = dbuf->db_data;
+
+ dsphys->dd_creation_time = gethrestime_sec();
+ dsphys->dd_parent_obj = pds->dd_object;
+ dsphys->dd_props_zapobj = zap_create(mos,
+ DMU_OT_DSL_PROPS, DMU_OT_NONE, 0, tx);
+ dsphys->dd_child_dir_zapobj = zap_create(mos,
+ DMU_OT_DSL_DIR_CHILD_MAP, DMU_OT_NONE, 0, tx);
+ dmu_buf_rele(dbuf, FTAG);
+
+ return (ddobj);
+}
+
+/* ARGSUSED */
+int
+dsl_dir_destroy_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ dsl_pool_t *dp = dd->dd_pool;
+ objset_t *mos = dp->dp_meta_objset;
+ int err;
+ uint64_t count;
+
+ /*
+ * There should be exactly two holds, both from
+ * dsl_dataset_destroy: one on the dd directory, and one on its
+ * head ds. Otherwise, someone is trying to lookup something
+ * inside this dir while we want to destroy it. The
+ * config_rwlock ensures that nobody else opens it after we
+ * check.
+ */
+ if (dmu_buf_refcount(dd->dd_dbuf) > 2)
+ return (EBUSY);
+
+ err = zap_count(mos, dd->dd_phys->dd_child_dir_zapobj, &count);
+ if (err)
+ return (err);
+ if (count != 0)
+ return (EEXIST);
+
+ return (0);
+}
+
+void
+dsl_dir_destroy_sync(void *arg1, void *tag, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ objset_t *mos = dd->dd_pool->dp_meta_objset;
+ uint64_t val, obj;
+
+ ASSERT(RW_WRITE_HELD(&dd->dd_pool->dp_config_rwlock));
+ ASSERT(dd->dd_phys->dd_head_dataset_obj == 0);
+
+ /* Remove our reservation. */
+ val = 0;
+ dsl_dir_set_reservation_sync(dd, &val, tx);
+ ASSERT3U(dd->dd_used_bytes, ==, 0);
+ ASSERT3U(dd->dd_phys->dd_reserved, ==, 0);
+
+ VERIFY(0 == zap_destroy(mos, dd->dd_phys->dd_child_dir_zapobj, tx));
+ VERIFY(0 == zap_destroy(mos, dd->dd_phys->dd_props_zapobj, tx));
+ VERIFY(0 == zap_remove(mos,
+ dd->dd_parent->dd_phys->dd_child_dir_zapobj, dd->dd_myname, tx));
+
+ obj = dd->dd_object;
+ dsl_dir_close(dd, tag);
+ VERIFY(0 == dmu_object_free(mos, obj, tx));
+}
+
+void
+dsl_dir_create_root(objset_t *mos, uint64_t *ddobjp, dmu_tx_t *tx)
+{
+ dsl_dir_phys_t *dsp;
+ dmu_buf_t *dbuf;
+ int error;
+
+ *ddobjp = dmu_object_alloc(mos, DMU_OT_DSL_DIR, 0,
+ DMU_OT_DSL_DIR, sizeof (dsl_dir_phys_t), tx);
+
+ error = zap_add(mos, DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_ROOT_DATASET,
+ sizeof (uint64_t), 1, ddobjp, tx);
+ ASSERT3U(error, ==, 0);
+
+ VERIFY(0 == dmu_bonus_hold(mos, *ddobjp, FTAG, &dbuf));
+ dmu_buf_will_dirty(dbuf, tx);
+ dsp = dbuf->db_data;
+
+ dsp->dd_creation_time = gethrestime_sec();
+ dsp->dd_props_zapobj = zap_create(mos,
+ DMU_OT_DSL_PROPS, DMU_OT_NONE, 0, tx);
+ dsp->dd_child_dir_zapobj = zap_create(mos,
+ DMU_OT_DSL_DIR_CHILD_MAP, DMU_OT_NONE, 0, tx);
+
+ dmu_buf_rele(dbuf, FTAG);
+}
+
+void
+dsl_dir_stats(dsl_dir_t *dd, nvlist_t *nv)
+{
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_AVAILABLE,
+ dsl_dir_space_available(dd, NULL, 0, TRUE));
+
+ mutex_enter(&dd->dd_lock);
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_USED, dd->dd_used_bytes);
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_QUOTA,
+ dd->dd_phys->dd_quota);
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_RESERVATION,
+ dd->dd_phys->dd_reserved);
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_COMPRESSRATIO,
+ dd->dd_phys->dd_compressed_bytes == 0 ? 100 :
+ (dd->dd_phys->dd_uncompressed_bytes * 100 /
+ dd->dd_phys->dd_compressed_bytes));
+ mutex_exit(&dd->dd_lock);
+
+ if (dd->dd_phys->dd_clone_parent_obj) {
+ dsl_dataset_t *ds;
+ char buf[MAXNAMELEN];
+
+ rw_enter(&dd->dd_pool->dp_config_rwlock, RW_READER);
+ VERIFY(0 == dsl_dataset_open_obj(dd->dd_pool,
+ dd->dd_phys->dd_clone_parent_obj,
+ NULL, DS_MODE_NONE, FTAG, &ds));
+ dsl_dataset_name(ds, buf);
+ dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
+ rw_exit(&dd->dd_pool->dp_config_rwlock);
+
+ dsl_prop_nvlist_add_string(nv, ZFS_PROP_ORIGIN, buf);
+ }
+}
+
+void
+dsl_dir_dirty(dsl_dir_t *dd, dmu_tx_t *tx)
+{
+ dsl_pool_t *dp = dd->dd_pool;
+
+ ASSERT(dd->dd_phys);
+
+ if (txg_list_add(&dp->dp_dirty_dirs, dd, tx->tx_txg) == 0) {
+ /* up the hold count until we can be written out */
+ dmu_buf_add_ref(dd->dd_dbuf, dd);
+ }
+}
+
+static int64_t
+parent_delta(dsl_dir_t *dd, uint64_t used, int64_t delta)
+{
+ uint64_t old_accounted = MAX(used, dd->dd_phys->dd_reserved);
+ uint64_t new_accounted = MAX(used + delta, dd->dd_phys->dd_reserved);
+ return (new_accounted - old_accounted);
+}
+
+void
+dsl_dir_sync(dsl_dir_t *dd, dmu_tx_t *tx)
+{
+ ASSERT(dmu_tx_is_syncing(tx));
+
+ dmu_buf_will_dirty(dd->dd_dbuf, tx);
+
+ mutex_enter(&dd->dd_lock);
+ ASSERT3U(dd->dd_tempreserved[tx->tx_txg&TXG_MASK], ==, 0);
+ dprintf_dd(dd, "txg=%llu towrite=%lluK\n", tx->tx_txg,
+ dd->dd_space_towrite[tx->tx_txg&TXG_MASK] / 1024);
+ dd->dd_space_towrite[tx->tx_txg&TXG_MASK] = 0;
+ dd->dd_phys->dd_used_bytes = dd->dd_used_bytes;
+ mutex_exit(&dd->dd_lock);
+
+ /* release the hold from dsl_dir_dirty */
+ dmu_buf_rele(dd->dd_dbuf, dd);
+}
+
+static uint64_t
+dsl_dir_estimated_space(dsl_dir_t *dd)
+{
+ int64_t space;
+ int i;
+
+ ASSERT(MUTEX_HELD(&dd->dd_lock));
+
+ space = dd->dd_phys->dd_used_bytes;
+ ASSERT(space >= 0);
+ for (i = 0; i < TXG_SIZE; i++) {
+ space += dd->dd_space_towrite[i&TXG_MASK];
+ ASSERT3U(dd->dd_space_towrite[i&TXG_MASK], >=, 0);
+ }
+ return (space);
+}
+
+/*
+ * How much space would dd have available if ancestor had delta applied
+ * to it? If ondiskonly is set, we're only interested in what's
+ * on-disk, not estimated pending changes.
+ */
+uint64_t
+dsl_dir_space_available(dsl_dir_t *dd,
+ dsl_dir_t *ancestor, int64_t delta, int ondiskonly)
+{
+ uint64_t parentspace, myspace, quota, used;
+
+ /*
+ * If there are no restrictions otherwise, assume we have
+ * unlimited space available.
+ */
+ quota = UINT64_MAX;
+ parentspace = UINT64_MAX;
+
+ if (dd->dd_parent != NULL) {
+ parentspace = dsl_dir_space_available(dd->dd_parent,
+ ancestor, delta, ondiskonly);
+ }
+
+ mutex_enter(&dd->dd_lock);
+ if (dd->dd_phys->dd_quota != 0)
+ quota = dd->dd_phys->dd_quota;
+ if (ondiskonly) {
+ used = dd->dd_used_bytes;
+ } else {
+ used = dsl_dir_estimated_space(dd);
+ }
+ if (dd == ancestor)
+ used += delta;
+
+ if (dd->dd_parent == NULL) {
+ uint64_t poolsize = dsl_pool_adjustedsize(dd->dd_pool, FALSE);
+ quota = MIN(quota, poolsize);
+ }
+
+ if (dd->dd_phys->dd_reserved > used && parentspace != UINT64_MAX) {
+ /*
+ * We have some space reserved, in addition to what our
+ * parent gave us.
+ */
+ parentspace += dd->dd_phys->dd_reserved - used;
+ }
+
+ if (used > quota) {
+ /* over quota */
+ myspace = 0;
+
+ /*
+ * While it's OK to be a little over quota, if
+ * we think we are using more space than there
+ * is in the pool (which is already 1.6% more than
+ * dsl_pool_adjustedsize()), something is very
+ * wrong.
+ */
+ ASSERT3U(used, <=, spa_get_space(dd->dd_pool->dp_spa));
+ } else {
+ /*
+ * the lesser of the space provided by our parent and
+ * the space left in our quota
+ */
+ myspace = MIN(parentspace, quota - used);
+ }
+
+ mutex_exit(&dd->dd_lock);
+
+ return (myspace);
+}
+
+struct tempreserve {
+ list_node_t tr_node;
+ dsl_dir_t *tr_ds;
+ uint64_t tr_size;
+};
+
+/*
+ * Reserve space in this dsl_dir, to be used in this tx's txg.
+ * After the space has been dirtied (and thus
+ * dsl_dir_willuse_space() has been called), the reservation should
+ * be canceled, using dsl_dir_tempreserve_clear().
+ */
+static int
+dsl_dir_tempreserve_impl(dsl_dir_t *dd,
+ uint64_t asize, boolean_t netfree, list_t *tr_list, dmu_tx_t *tx)
+{
+ uint64_t txg = tx->tx_txg;
+ uint64_t est_used, quota, parent_rsrv;
+ int edquot = EDQUOT;
+ int txgidx = txg & TXG_MASK;
+ int i;
+ struct tempreserve *tr;
+
+ ASSERT3U(txg, !=, 0);
+ ASSERT3S(asize, >=, 0);
+
+ mutex_enter(&dd->dd_lock);
+ /*
+ * Check against the dsl_dir's quota. We don't add in the delta
+ * when checking for over-quota because they get one free hit.
+ */
+ est_used = dsl_dir_estimated_space(dd);
+ for (i = 0; i < TXG_SIZE; i++)
+ est_used += dd->dd_tempreserved[i];
+
+ quota = UINT64_MAX;
+
+ if (dd->dd_phys->dd_quota)
+ quota = dd->dd_phys->dd_quota;
+
+ /*
+ * If this transaction will result in a net free of space, we want
+ * to let it through, but we have to be careful: the space that it
+ * frees won't become available until *after* this txg syncs.
+ * Therefore, to ensure that it's possible to remove files from
+ * a full pool without inducing transient overcommits, we throttle
+ * netfree transactions against a quota that is slightly larger,
+ * but still within the pool's allocation slop. In cases where
+ * we're very close to full, this will allow a steady trickle of
+ * removes to get through.
+ */
+ if (dd->dd_parent == NULL) {
+ uint64_t poolsize = dsl_pool_adjustedsize(dd->dd_pool, netfree);
+ if (poolsize < quota) {
+ quota = poolsize;
+ edquot = ENOSPC;
+ }
+ } else if (netfree) {
+ quota = UINT64_MAX;
+ }
+
+ /*
+ * If they are requesting more space, and our current estimate
+ * is over quota. They get to try again unless the actual
+ * on-disk is over quota and there are no pending changes (which
+ * may free up space for us).
+ */
+ if (asize > 0 && est_used > quota) {
+ if (dd->dd_space_towrite[txg & TXG_MASK] != 0 ||
+ dd->dd_space_towrite[(txg-1) & TXG_MASK] != 0 ||
+ dd->dd_space_towrite[(txg-2) & TXG_MASK] != 0 ||
+ dd->dd_used_bytes < quota)
+ edquot = ERESTART;
+ dprintf_dd(dd, "failing: used=%lluK est_used = %lluK "
+ "quota=%lluK tr=%lluK err=%d\n",
+ dd->dd_used_bytes>>10, est_used>>10,
+ quota>>10, asize>>10, edquot);
+ mutex_exit(&dd->dd_lock);
+ return (edquot);
+ }
+
+ /* We need to up our estimated delta before dropping dd_lock */
+ dd->dd_tempreserved[txgidx] += asize;
+
+ parent_rsrv = parent_delta(dd, est_used, asize);
+ mutex_exit(&dd->dd_lock);
+
+ tr = kmem_alloc(sizeof (struct tempreserve), KM_SLEEP);
+ tr->tr_ds = dd;
+ tr->tr_size = asize;
+ list_insert_tail(tr_list, tr);
+
+ /* see if it's OK with our parent */
+ if (dd->dd_parent && parent_rsrv) {
+ return (dsl_dir_tempreserve_impl(dd->dd_parent,
+ parent_rsrv, netfree, tr_list, tx));
+ } else {
+ return (0);
+ }
+}
+
+/*
+ * Reserve space in this dsl_dir, to be used in this tx's txg.
+ * After the space has been dirtied (and thus
+ * dsl_dir_willuse_space() has been called), the reservation should
+ * be canceled, using dsl_dir_tempreserve_clear().
+ */
+int
+dsl_dir_tempreserve_space(dsl_dir_t *dd, uint64_t lsize,
+ uint64_t asize, uint64_t fsize, void **tr_cookiep, dmu_tx_t *tx)
+{
+ int err = 0;
+ list_t *tr_list;
+
+ tr_list = kmem_alloc(sizeof (list_t), KM_SLEEP);
+ list_create(tr_list, sizeof (struct tempreserve),
+ offsetof(struct tempreserve, tr_node));
+ ASSERT3S(asize, >=, 0);
+ ASSERT3S(fsize, >=, 0);
+
+ err = dsl_dir_tempreserve_impl(dd, asize, fsize >= asize,
+ tr_list, tx);
+
+ if (err == 0) {
+ struct tempreserve *tr;
+
+ err = arc_tempreserve_space(lsize);
+ if (err == 0) {
+ tr = kmem_alloc(sizeof (struct tempreserve), KM_SLEEP);
+ tr->tr_ds = NULL;
+ tr->tr_size = lsize;
+ list_insert_tail(tr_list, tr);
+ }
+ }
+
+ if (err)
+ dsl_dir_tempreserve_clear(tr_list, tx);
+ else
+ *tr_cookiep = tr_list;
+ return (err);
+}
+
+/*
+ * Clear a temporary reservation that we previously made with
+ * dsl_dir_tempreserve_space().
+ */
+void
+dsl_dir_tempreserve_clear(void *tr_cookie, dmu_tx_t *tx)
+{
+ int txgidx = tx->tx_txg & TXG_MASK;
+ list_t *tr_list = tr_cookie;
+ struct tempreserve *tr;
+
+ ASSERT3U(tx->tx_txg, !=, 0);
+
+ while (tr = list_head(tr_list)) {
+ if (tr->tr_ds == NULL) {
+ arc_tempreserve_clear(tr->tr_size);
+ } else {
+ mutex_enter(&tr->tr_ds->dd_lock);
+ ASSERT3U(tr->tr_ds->dd_tempreserved[txgidx], >=,
+ tr->tr_size);
+ tr->tr_ds->dd_tempreserved[txgidx] -= tr->tr_size;
+ mutex_exit(&tr->tr_ds->dd_lock);
+ }
+ list_remove(tr_list, tr);
+ kmem_free(tr, sizeof (struct tempreserve));
+ }
+
+ kmem_free(tr_list, sizeof (list_t));
+}
+
+/*
+ * Call in open context when we think we're going to write/free space,
+ * eg. when dirtying data. Be conservative (ie. OK to write less than
+ * this or free more than this, but don't write more or free less).
+ */
+void
+dsl_dir_willuse_space(dsl_dir_t *dd, int64_t space, dmu_tx_t *tx)
+{
+ int64_t parent_space;
+ uint64_t est_used;
+
+ mutex_enter(&dd->dd_lock);
+ if (space > 0)
+ dd->dd_space_towrite[tx->tx_txg & TXG_MASK] += space;
+
+ est_used = dsl_dir_estimated_space(dd);
+ parent_space = parent_delta(dd, est_used, space);
+ mutex_exit(&dd->dd_lock);
+
+ /* Make sure that we clean up dd_space_to* */
+ dsl_dir_dirty(dd, tx);
+
+ /* XXX this is potentially expensive and unnecessary... */
+ if (parent_space && dd->dd_parent)
+ dsl_dir_willuse_space(dd->dd_parent, parent_space, tx);
+}
+
+/* call from syncing context when we actually write/free space for this dd */
+void
+dsl_dir_diduse_space(dsl_dir_t *dd,
+ int64_t used, int64_t compressed, int64_t uncompressed, dmu_tx_t *tx)
+{
+ int64_t accounted_delta;
+
+ ASSERT(dmu_tx_is_syncing(tx));
+
+ dsl_dir_dirty(dd, tx);
+
+ mutex_enter(&dd->dd_lock);
+ accounted_delta = parent_delta(dd, dd->dd_used_bytes, used);
+ ASSERT(used >= 0 || dd->dd_used_bytes >= -used);
+ ASSERT(compressed >= 0 ||
+ dd->dd_phys->dd_compressed_bytes >= -compressed);
+ ASSERT(uncompressed >= 0 ||
+ dd->dd_phys->dd_uncompressed_bytes >= -uncompressed);
+ dd->dd_used_bytes += used;
+ dd->dd_phys->dd_uncompressed_bytes += uncompressed;
+ dd->dd_phys->dd_compressed_bytes += compressed;
+ mutex_exit(&dd->dd_lock);
+
+ if (dd->dd_parent != NULL) {
+ dsl_dir_diduse_space(dd->dd_parent,
+ accounted_delta, compressed, uncompressed, tx);
+ }
+}
+
+/* ARGSUSED */
+static int
+dsl_dir_set_quota_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ uint64_t *quotap = arg2;
+ uint64_t new_quota = *quotap;
+ int err = 0;
+ uint64_t towrite;
+
+ if (new_quota == 0)
+ return (0);
+
+ mutex_enter(&dd->dd_lock);
+ /*
+ * If we are doing the preliminary check in open context, and
+ * there are pending changes, then don't fail it, since the
+ * pending changes could under-estimat the amount of space to be
+ * freed up.
+ */
+ towrite = dd->dd_space_towrite[0] + dd->dd_space_towrite[1] +
+ dd->dd_space_towrite[2] + dd->dd_space_towrite[3];
+ if ((dmu_tx_is_syncing(tx) || towrite == 0) &&
+ (new_quota < dd->dd_phys->dd_reserved ||
+ new_quota < dsl_dir_estimated_space(dd))) {
+ err = ENOSPC;
+ }
+ mutex_exit(&dd->dd_lock);
+ return (err);
+}
+
+static void
+dsl_dir_set_quota_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ uint64_t *quotap = arg2;
+ uint64_t new_quota = *quotap;
+
+ dmu_buf_will_dirty(dd->dd_dbuf, tx);
+
+ mutex_enter(&dd->dd_lock);
+ dd->dd_phys->dd_quota = new_quota;
+ mutex_exit(&dd->dd_lock);
+}
+
+int
+dsl_dir_set_quota(const char *ddname, uint64_t quota)
+{
+ dsl_dir_t *dd;
+ int err;
+
+ err = dsl_dir_open(ddname, FTAG, &dd, NULL);
+ if (err)
+ return (err);
+ /*
+ * If someone removes a file, then tries to set the quota, we
+ * want to make sure the file freeing takes effect.
+ */
+ txg_wait_open(dd->dd_pool, 0);
+
+ err = dsl_sync_task_do(dd->dd_pool, dsl_dir_set_quota_check,
+ dsl_dir_set_quota_sync, dd, &quota, 0);
+ dsl_dir_close(dd, FTAG);
+ return (err);
+}
+
+/* ARGSUSED */
+static int
+dsl_dir_set_reservation_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ uint64_t *reservationp = arg2;
+ uint64_t new_reservation = *reservationp;
+ uint64_t used, avail;
+ int64_t delta;
+
+ if (new_reservation > INT64_MAX)
+ return (EOVERFLOW);
+
+ /*
+ * If we are doing the preliminary check in open context, the
+ * space estimates may be inaccurate.
+ */
+ if (!dmu_tx_is_syncing(tx))
+ return (0);
+
+ mutex_enter(&dd->dd_lock);
+ used = dd->dd_used_bytes;
+ delta = MAX(used, new_reservation) -
+ MAX(used, dd->dd_phys->dd_reserved);
+ mutex_exit(&dd->dd_lock);
+
+ if (dd->dd_parent) {
+ avail = dsl_dir_space_available(dd->dd_parent,
+ NULL, 0, FALSE);
+ } else {
+ avail = dsl_pool_adjustedsize(dd->dd_pool, B_FALSE) - used;
+ }
+
+ if (delta > 0 && delta > avail)
+ return (ENOSPC);
+ if (delta > 0 && dd->dd_phys->dd_quota > 0 &&
+ new_reservation > dd->dd_phys->dd_quota)
+ return (ENOSPC);
+ return (0);
+}
+
+static void
+dsl_dir_set_reservation_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ uint64_t *reservationp = arg2;
+ uint64_t new_reservation = *reservationp;
+ uint64_t used;
+ int64_t delta;
+
+ mutex_enter(&dd->dd_lock);
+ used = dd->dd_used_bytes;
+ delta = MAX(used, new_reservation) -
+ MAX(used, dd->dd_phys->dd_reserved);
+ mutex_exit(&dd->dd_lock);
+
+ dmu_buf_will_dirty(dd->dd_dbuf, tx);
+ dd->dd_phys->dd_reserved = new_reservation;
+
+ if (dd->dd_parent != NULL) {
+ /* Roll up this additional usage into our ancestors */
+ dsl_dir_diduse_space(dd->dd_parent, delta, 0, 0, tx);
+ }
+}
+
+int
+dsl_dir_set_reservation(const char *ddname, uint64_t reservation)
+{
+ dsl_dir_t *dd;
+ int err;
+
+ err = dsl_dir_open(ddname, FTAG, &dd, NULL);
+ if (err)
+ return (err);
+ err = dsl_sync_task_do(dd->dd_pool, dsl_dir_set_reservation_check,
+ dsl_dir_set_reservation_sync, dd, &reservation, 0);
+ dsl_dir_close(dd, FTAG);
+ return (err);
+}
+
+static dsl_dir_t *
+closest_common_ancestor(dsl_dir_t *ds1, dsl_dir_t *ds2)
+{
+ for (; ds1; ds1 = ds1->dd_parent) {
+ dsl_dir_t *dd;
+ for (dd = ds2; dd; dd = dd->dd_parent) {
+ if (ds1 == dd)
+ return (dd);
+ }
+ }
+ return (NULL);
+}
+
+/*
+ * If delta is applied to dd, how much of that delta would be applied to
+ * ancestor? Syncing context only.
+ */
+static int64_t
+would_change(dsl_dir_t *dd, int64_t delta, dsl_dir_t *ancestor)
+{
+ if (dd == ancestor)
+ return (delta);
+
+ mutex_enter(&dd->dd_lock);
+ delta = parent_delta(dd, dd->dd_used_bytes, delta);
+ mutex_exit(&dd->dd_lock);
+ return (would_change(dd->dd_parent, delta, ancestor));
+}
+
+struct renamearg {
+ dsl_dir_t *newparent;
+ const char *mynewname;
+};
+
+/* ARGSUSED */
+static int
+dsl_dir_rename_check(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ struct renamearg *ra = arg2;
+ dsl_pool_t *dp = dd->dd_pool;
+ objset_t *mos = dp->dp_meta_objset;
+ int err;
+ uint64_t val;
+
+ /* There should be 2 references: the open and the dirty */
+ if (dmu_buf_refcount(dd->dd_dbuf) > 2)
+ return (EBUSY);
+
+ /* check for existing name */
+ err = zap_lookup(mos, ra->newparent->dd_phys->dd_child_dir_zapobj,
+ ra->mynewname, 8, 1, &val);
+ if (err == 0)
+ return (EEXIST);
+ if (err != ENOENT)
+ return (err);
+
+ if (ra->newparent != dd->dd_parent) {
+ /* is there enough space? */
+ uint64_t myspace =
+ MAX(dd->dd_used_bytes, dd->dd_phys->dd_reserved);
+
+ /* no rename into our descendant */
+ if (closest_common_ancestor(dd, ra->newparent) == dd)
+ return (EINVAL);
+
+ if (err = dsl_dir_transfer_possible(dd->dd_parent,
+ ra->newparent, myspace))
+ return (err);
+ }
+
+ return (0);
+}
+
+static void
+dsl_dir_rename_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ struct renamearg *ra = arg2;
+ dsl_pool_t *dp = dd->dd_pool;
+ objset_t *mos = dp->dp_meta_objset;
+ int err;
+
+ ASSERT(dmu_buf_refcount(dd->dd_dbuf) <= 2);
+
+ if (ra->newparent != dd->dd_parent) {
+ uint64_t myspace =
+ MAX(dd->dd_used_bytes, dd->dd_phys->dd_reserved);
+
+ dsl_dir_diduse_space(dd->dd_parent, -myspace,
+ -dd->dd_phys->dd_compressed_bytes,
+ -dd->dd_phys->dd_uncompressed_bytes, tx);
+ dsl_dir_diduse_space(ra->newparent, myspace,
+ dd->dd_phys->dd_compressed_bytes,
+ dd->dd_phys->dd_uncompressed_bytes, tx);
+ }
+
+ dmu_buf_will_dirty(dd->dd_dbuf, tx);
+
+ /* remove from old parent zapobj */
+ err = zap_remove(mos, dd->dd_parent->dd_phys->dd_child_dir_zapobj,
+ dd->dd_myname, tx);
+ ASSERT3U(err, ==, 0);
+
+ (void) strcpy(dd->dd_myname, ra->mynewname);
+ dsl_dir_close(dd->dd_parent, dd);
+ dd->dd_phys->dd_parent_obj = ra->newparent->dd_object;
+ VERIFY(0 == dsl_dir_open_obj(dd->dd_pool,
+ ra->newparent->dd_object, NULL, dd, &dd->dd_parent));
+
+ /* add to new parent zapobj */
+ err = zap_add(mos, ra->newparent->dd_phys->dd_child_dir_zapobj,
+ dd->dd_myname, 8, 1, &dd->dd_object, tx);
+ ASSERT3U(err, ==, 0);
+}
+
+int
+dsl_dir_rename(dsl_dir_t *dd, const char *newname)
+{
+ struct renamearg ra;
+ int err;
+
+ /* new parent should exist */
+ err = dsl_dir_open(newname, FTAG, &ra.newparent, &ra.mynewname);
+ if (err)
+ return (err);
+
+ /* can't rename to different pool */
+ if (dd->dd_pool != ra.newparent->dd_pool) {
+ err = ENXIO;
+ goto out;
+ }
+
+ /* new name should not already exist */
+ if (ra.mynewname == NULL) {
+ err = EEXIST;
+ goto out;
+ }
+
+
+ err = dsl_sync_task_do(dd->dd_pool,
+ dsl_dir_rename_check, dsl_dir_rename_sync, dd, &ra, 3);
+
+out:
+ dsl_dir_close(ra.newparent, FTAG);
+ return (err);
+}
+
+int
+dsl_dir_transfer_possible(dsl_dir_t *sdd, dsl_dir_t *tdd, uint64_t space)
+{
+ dsl_dir_t *ancestor;
+ int64_t adelta;
+ uint64_t avail;
+
+ ancestor = closest_common_ancestor(sdd, tdd);
+ adelta = would_change(sdd, -space, ancestor);
+ avail = dsl_dir_space_available(tdd, ancestor, adelta, FALSE);
+ if (avail < space)
+ return (ENOSPC);
+
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c
new file mode 100644
index 0000000..00abf7e
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_pool.c
@@ -0,0 +1,256 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dsl_pool.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_synctask.h>
+#include <sys/dmu_tx.h>
+#include <sys/dmu_objset.h>
+#include <sys/arc.h>
+#include <sys/zap.h>
+#include <sys/zio.h>
+#include <sys/zfs_context.h>
+#include <sys/fs/zfs.h>
+
+static int
+dsl_pool_open_mos_dir(dsl_pool_t *dp, dsl_dir_t **ddp)
+{
+ uint64_t obj;
+ int err;
+
+ err = zap_lookup(dp->dp_meta_objset,
+ dp->dp_root_dir->dd_phys->dd_child_dir_zapobj,
+ MOS_DIR_NAME, sizeof (obj), 1, &obj);
+ if (err)
+ return (err);
+
+ return (dsl_dir_open_obj(dp, obj, MOS_DIR_NAME, dp, ddp));
+}
+
+static dsl_pool_t *
+dsl_pool_open_impl(spa_t *spa, uint64_t txg)
+{
+ dsl_pool_t *dp;
+ blkptr_t *bp = spa_get_rootblkptr(spa);
+
+ dp = kmem_zalloc(sizeof (dsl_pool_t), KM_SLEEP);
+ dp->dp_spa = spa;
+ dp->dp_meta_rootbp = *bp;
+ rw_init(&dp->dp_config_rwlock, NULL, RW_DEFAULT, NULL);
+ txg_init(dp, txg);
+
+ txg_list_create(&dp->dp_dirty_datasets,
+ offsetof(dsl_dataset_t, ds_dirty_link));
+ txg_list_create(&dp->dp_dirty_dirs,
+ offsetof(dsl_dir_t, dd_dirty_link));
+ txg_list_create(&dp->dp_sync_tasks,
+ offsetof(dsl_sync_task_group_t, dstg_node));
+ list_create(&dp->dp_synced_objsets, sizeof (dsl_dataset_t),
+ offsetof(dsl_dataset_t, ds_synced_link));
+
+ return (dp);
+}
+
+int
+dsl_pool_open(spa_t *spa, uint64_t txg, dsl_pool_t **dpp)
+{
+ int err;
+ dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
+ objset_impl_t *osi;
+
+ rw_enter(&dp->dp_config_rwlock, RW_READER);
+ err = dmu_objset_open_impl(spa, NULL, &dp->dp_meta_rootbp, &osi);
+ if (err)
+ goto out;
+ dp->dp_meta_objset = &osi->os;
+
+ err = zap_lookup(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_POOL_ROOT_DATASET, sizeof (uint64_t), 1,
+ &dp->dp_root_dir_obj);
+ if (err)
+ goto out;
+
+ err = dsl_dir_open_obj(dp, dp->dp_root_dir_obj,
+ NULL, dp, &dp->dp_root_dir);
+ if (err)
+ goto out;
+
+ err = dsl_pool_open_mos_dir(dp, &dp->dp_mos_dir);
+ if (err)
+ goto out;
+
+out:
+ rw_exit(&dp->dp_config_rwlock);
+ if (err)
+ dsl_pool_close(dp);
+ else
+ *dpp = dp;
+
+ return (err);
+}
+
+void
+dsl_pool_close(dsl_pool_t *dp)
+{
+ /* drop our reference from dsl_pool_open() */
+ if (dp->dp_mos_dir)
+ dsl_dir_close(dp->dp_mos_dir, dp);
+ if (dp->dp_root_dir)
+ dsl_dir_close(dp->dp_root_dir, dp);
+
+ /* undo the dmu_objset_open_impl(mos) from dsl_pool_open() */
+ if (dp->dp_meta_objset)
+ dmu_objset_evict(NULL, dp->dp_meta_objset->os);
+
+ txg_list_destroy(&dp->dp_dirty_datasets);
+ txg_list_destroy(&dp->dp_dirty_dirs);
+ txg_list_destroy(&dp->dp_sync_tasks);
+ list_destroy(&dp->dp_synced_objsets);
+
+ arc_flush();
+ txg_fini(dp);
+ rw_destroy(&dp->dp_config_rwlock);
+ kmem_free(dp, sizeof (dsl_pool_t));
+}
+
+dsl_pool_t *
+dsl_pool_create(spa_t *spa, uint64_t txg)
+{
+ int err;
+ dsl_pool_t *dp = dsl_pool_open_impl(spa, txg);
+ dmu_tx_t *tx = dmu_tx_create_assigned(dp, txg);
+ dp->dp_meta_objset = &dmu_objset_create_impl(spa,
+ NULL, &dp->dp_meta_rootbp, DMU_OST_META, tx)->os;
+
+ /* create the pool directory */
+ err = zap_create_claim(dp->dp_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_OT_OBJECT_DIRECTORY, DMU_OT_NONE, 0, tx);
+ ASSERT3U(err, ==, 0);
+
+ /* create and open the root dir */
+ dsl_dataset_create_root(dp, &dp->dp_root_dir_obj, tx);
+ VERIFY(0 == dsl_dir_open_obj(dp, dp->dp_root_dir_obj,
+ NULL, dp, &dp->dp_root_dir));
+
+ /* create and open the meta-objset dir */
+ (void) dsl_dir_create_sync(dp->dp_root_dir, MOS_DIR_NAME, tx);
+ VERIFY(0 == dsl_pool_open_mos_dir(dp, &dp->dp_mos_dir));
+
+ dmu_tx_commit(tx);
+
+ return (dp);
+}
+
+void
+dsl_pool_sync(dsl_pool_t *dp, uint64_t txg)
+{
+ zio_t *zio;
+ dmu_tx_t *tx;
+ dsl_dir_t *dd;
+ dsl_dataset_t *ds;
+ dsl_sync_task_group_t *dstg;
+ objset_impl_t *mosi = dp->dp_meta_objset->os;
+ int err;
+
+ tx = dmu_tx_create_assigned(dp, txg);
+
+ zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
+ while (ds = txg_list_remove(&dp->dp_dirty_datasets, txg)) {
+ if (!list_link_active(&ds->ds_synced_link))
+ list_insert_tail(&dp->dp_synced_objsets, ds);
+ else
+ dmu_buf_rele(ds->ds_dbuf, ds);
+ dsl_dataset_sync(ds, zio, tx);
+ }
+ err = zio_wait(zio);
+ ASSERT(err == 0);
+
+ while (dstg = txg_list_remove(&dp->dp_sync_tasks, txg))
+ dsl_sync_task_group_sync(dstg, tx);
+ while (dd = txg_list_remove(&dp->dp_dirty_dirs, txg))
+ dsl_dir_sync(dd, tx);
+
+ if (list_head(&mosi->os_dirty_dnodes[txg & TXG_MASK]) != NULL ||
+ list_head(&mosi->os_free_dnodes[txg & TXG_MASK]) != NULL) {
+ zio = zio_root(dp->dp_spa, NULL, NULL, ZIO_FLAG_MUSTSUCCEED);
+ dmu_objset_sync(mosi, zio, tx);
+ err = zio_wait(zio);
+ ASSERT(err == 0);
+ dprintf_bp(&dp->dp_meta_rootbp, "meta objset rootbp is %s", "");
+ spa_set_rootblkptr(dp->dp_spa, &dp->dp_meta_rootbp);
+ }
+
+ dmu_tx_commit(tx);
+}
+
+void
+dsl_pool_zil_clean(dsl_pool_t *dp)
+{
+ dsl_dataset_t *ds;
+
+ while (ds = list_head(&dp->dp_synced_objsets)) {
+ list_remove(&dp->dp_synced_objsets, ds);
+ ASSERT(ds->ds_user_ptr != NULL);
+ zil_clean(((objset_impl_t *)ds->ds_user_ptr)->os_zil);
+ dmu_buf_rele(ds->ds_dbuf, ds);
+ }
+}
+
+/*
+ * TRUE if the current thread is the tx_sync_thread or if we
+ * are being called from SPA context during pool initialization.
+ */
+int
+dsl_pool_sync_context(dsl_pool_t *dp)
+{
+ return (curthread == dp->dp_tx.tx_sync_thread ||
+ spa_get_dsl(dp->dp_spa) == NULL);
+}
+
+uint64_t
+dsl_pool_adjustedsize(dsl_pool_t *dp, boolean_t netfree)
+{
+ uint64_t space, resv;
+
+ /*
+ * Reserve about 1.6% (1/64), or at least 32MB, for allocation
+ * efficiency.
+ * XXX The intent log is not accounted for, so it must fit
+ * within this slop.
+ *
+ * If we're trying to assess whether it's OK to do a free,
+ * cut the reservation in half to allow forward progress
+ * (e.g. make it possible to rm(1) files from a full pool).
+ */
+ space = spa_get_dspace(dp->dp_spa);
+ resv = MAX(space >> 6, SPA_MINDEVSIZE >> 1);
+ if (netfree)
+ resv >>= 1;
+
+ return (space - resv);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_prop.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_prop.c
new file mode 100644
index 0000000..2fff66d
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_prop.c
@@ -0,0 +1,501 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/dmu_objset.h>
+#include <sys/dmu_tx.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_prop.h>
+#include <sys/dsl_synctask.h>
+#include <sys/spa.h>
+#include <sys/zio_checksum.h> /* for the default checksum value */
+#include <sys/zap.h>
+#include <sys/fs/zfs.h>
+
+#include "zfs_prop.h"
+
+static int
+dodefault(const char *propname, int intsz, int numint, void *buf)
+{
+ zfs_prop_t prop;
+
+ if ((prop = zfs_name_to_prop(propname)) == ZFS_PROP_INVAL ||
+ zfs_prop_readonly(prop))
+ return (ENOENT);
+
+ if (zfs_prop_get_type(prop) == prop_type_string) {
+ if (intsz != 1)
+ return (EOVERFLOW);
+ (void) strncpy(buf, zfs_prop_default_string(prop), numint);
+ } else {
+ if (intsz != 8 || numint < 1)
+ return (EOVERFLOW);
+
+ *(uint64_t *)buf = zfs_prop_default_numeric(prop);
+ }
+
+ return (0);
+}
+
+static int
+dsl_prop_get_impl(dsl_dir_t *dd, const char *propname,
+ int intsz, int numint, void *buf, char *setpoint)
+{
+ int err = ENOENT;
+ zfs_prop_t prop;
+
+ if (setpoint)
+ setpoint[0] = '\0';
+
+ prop = zfs_name_to_prop(propname);
+
+ /*
+ * Note: dd may be NULL, therefore we shouldn't dereference it
+ * ouside this loop.
+ */
+ for (; dd != NULL; dd = dd->dd_parent) {
+ objset_t *mos = dd->dd_pool->dp_meta_objset;
+ ASSERT(RW_LOCK_HELD(&dd->dd_pool->dp_config_rwlock));
+ err = zap_lookup(mos, dd->dd_phys->dd_props_zapobj,
+ propname, intsz, numint, buf);
+ if (err != ENOENT) {
+ if (setpoint)
+ dsl_dir_name(dd, setpoint);
+ break;
+ }
+
+ /*
+ * Break out of this loop for non-inheritable properties.
+ */
+ if (prop != ZFS_PROP_INVAL &&
+ !zfs_prop_inheritable(prop))
+ break;
+ }
+ if (err == ENOENT)
+ err = dodefault(propname, intsz, numint, buf);
+
+ return (err);
+}
+
+/*
+ * Register interest in the named property. We'll call the callback
+ * once to notify it of the current property value, and again each time
+ * the property changes, until this callback is unregistered.
+ *
+ * Return 0 on success, errno if the prop is not an integer value.
+ */
+int
+dsl_prop_register(dsl_dataset_t *ds, const char *propname,
+ dsl_prop_changed_cb_t *callback, void *cbarg)
+{
+ dsl_dir_t *dd = ds->ds_dir;
+ uint64_t value;
+ dsl_prop_cb_record_t *cbr;
+ int err;
+ int need_rwlock;
+
+ need_rwlock = !RW_WRITE_HELD(&dd->dd_pool->dp_config_rwlock);
+ if (need_rwlock)
+ rw_enter(&dd->dd_pool->dp_config_rwlock, RW_READER);
+
+ err = dsl_prop_get_impl(dd, propname, 8, 1, &value, NULL);
+ if (err != 0) {
+ rw_exit(&dd->dd_pool->dp_config_rwlock);
+ return (err);
+ }
+
+ cbr = kmem_alloc(sizeof (dsl_prop_cb_record_t), KM_SLEEP);
+ cbr->cbr_ds = ds;
+ cbr->cbr_propname = kmem_alloc(strlen(propname)+1, KM_SLEEP);
+ (void) strcpy((char *)cbr->cbr_propname, propname);
+ cbr->cbr_func = callback;
+ cbr->cbr_arg = cbarg;
+ mutex_enter(&dd->dd_lock);
+ list_insert_head(&dd->dd_prop_cbs, cbr);
+ mutex_exit(&dd->dd_lock);
+
+ cbr->cbr_func(cbr->cbr_arg, value);
+
+ VERIFY(0 == dsl_dir_open_obj(dd->dd_pool, dd->dd_object,
+ NULL, cbr, &dd));
+ if (need_rwlock)
+ rw_exit(&dd->dd_pool->dp_config_rwlock);
+ /* Leave dataset open until this callback is unregistered */
+ return (0);
+}
+
+int
+dsl_prop_get_ds(dsl_dir_t *dd, const char *propname,
+ int intsz, int numints, void *buf, char *setpoint)
+{
+ int err;
+
+ rw_enter(&dd->dd_pool->dp_config_rwlock, RW_READER);
+ err = dsl_prop_get_impl(dd, propname, intsz, numints, buf, setpoint);
+ rw_exit(&dd->dd_pool->dp_config_rwlock);
+
+ return (err);
+}
+
+int
+dsl_prop_get(const char *ddname, const char *propname,
+ int intsz, int numints, void *buf, char *setpoint)
+{
+ dsl_dir_t *dd;
+ const char *tail;
+ int err;
+
+ err = dsl_dir_open(ddname, FTAG, &dd, &tail);
+ if (err)
+ return (err);
+ if (tail && tail[0] != '@') {
+ dsl_dir_close(dd, FTAG);
+ return (ENOENT);
+ }
+
+ err = dsl_prop_get_ds(dd, propname, intsz, numints, buf, setpoint);
+
+ dsl_dir_close(dd, FTAG);
+ return (err);
+}
+
+/*
+ * Get the current property value. It may have changed by the time this
+ * function returns, so it is NOT safe to follow up with
+ * dsl_prop_register() and assume that the value has not changed in
+ * between.
+ *
+ * Return 0 on success, ENOENT if ddname is invalid.
+ */
+int
+dsl_prop_get_integer(const char *ddname, const char *propname,
+ uint64_t *valuep, char *setpoint)
+{
+ return (dsl_prop_get(ddname, propname, 8, 1, valuep, setpoint));
+}
+
+/*
+ * Unregister this callback. Return 0 on success, ENOENT if ddname is
+ * invalid, ENOMSG if no matching callback registered.
+ */
+int
+dsl_prop_unregister(dsl_dataset_t *ds, const char *propname,
+ dsl_prop_changed_cb_t *callback, void *cbarg)
+{
+ dsl_dir_t *dd = ds->ds_dir;
+ dsl_prop_cb_record_t *cbr;
+
+ mutex_enter(&dd->dd_lock);
+ for (cbr = list_head(&dd->dd_prop_cbs);
+ cbr; cbr = list_next(&dd->dd_prop_cbs, cbr)) {
+ if (cbr->cbr_ds == ds &&
+ cbr->cbr_func == callback &&
+ cbr->cbr_arg == cbarg &&
+ strcmp(cbr->cbr_propname, propname) == 0)
+ break;
+ }
+
+ if (cbr == NULL) {
+ mutex_exit(&dd->dd_lock);
+ return (ENOMSG);
+ }
+
+ list_remove(&dd->dd_prop_cbs, cbr);
+ mutex_exit(&dd->dd_lock);
+ kmem_free((void*)cbr->cbr_propname, strlen(cbr->cbr_propname)+1);
+ kmem_free(cbr, sizeof (dsl_prop_cb_record_t));
+
+ /* Clean up from dsl_prop_register */
+ dsl_dir_close(dd, cbr);
+ return (0);
+}
+
+/*
+ * Return the number of callbacks that are registered for this dataset.
+ */
+int
+dsl_prop_numcb(dsl_dataset_t *ds)
+{
+ dsl_dir_t *dd = ds->ds_dir;
+ dsl_prop_cb_record_t *cbr;
+ int num = 0;
+
+ mutex_enter(&dd->dd_lock);
+ for (cbr = list_head(&dd->dd_prop_cbs);
+ cbr; cbr = list_next(&dd->dd_prop_cbs, cbr)) {
+ if (cbr->cbr_ds == ds)
+ num++;
+ }
+ mutex_exit(&dd->dd_lock);
+
+ return (num);
+}
+
+static void
+dsl_prop_changed_notify(dsl_pool_t *dp, uint64_t ddobj,
+ const char *propname, uint64_t value, int first)
+{
+ dsl_dir_t *dd;
+ dsl_prop_cb_record_t *cbr;
+ objset_t *mos = dp->dp_meta_objset;
+ zap_cursor_t zc;
+ zap_attribute_t za;
+ int err;
+
+ ASSERT(RW_WRITE_HELD(&dp->dp_config_rwlock));
+ err = dsl_dir_open_obj(dp, ddobj, NULL, FTAG, &dd);
+ if (err)
+ return;
+
+ if (!first) {
+ /*
+ * If the prop is set here, then this change is not
+ * being inherited here or below; stop the recursion.
+ */
+ err = zap_lookup(mos, dd->dd_phys->dd_props_zapobj, propname,
+ 8, 1, &value);
+ if (err == 0) {
+ dsl_dir_close(dd, FTAG);
+ return;
+ }
+ ASSERT3U(err, ==, ENOENT);
+ }
+
+ mutex_enter(&dd->dd_lock);
+ for (cbr = list_head(&dd->dd_prop_cbs);
+ cbr; cbr = list_next(&dd->dd_prop_cbs, cbr)) {
+ if (strcmp(cbr->cbr_propname, propname) == 0) {
+ cbr->cbr_func(cbr->cbr_arg, value);
+ }
+ }
+ mutex_exit(&dd->dd_lock);
+
+ for (zap_cursor_init(&zc, mos,
+ dd->dd_phys->dd_child_dir_zapobj);
+ zap_cursor_retrieve(&zc, &za) == 0;
+ zap_cursor_advance(&zc)) {
+ /* XXX recursion could blow stack; esp. za! */
+ dsl_prop_changed_notify(dp, za.za_first_integer,
+ propname, value, FALSE);
+ }
+ zap_cursor_fini(&zc);
+ dsl_dir_close(dd, FTAG);
+}
+
+struct prop_set_arg {
+ const char *name;
+ int intsz;
+ int numints;
+ const void *buf;
+};
+
+
+static void
+dsl_prop_set_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ dsl_dir_t *dd = arg1;
+ struct prop_set_arg *psa = arg2;
+ objset_t *mos = dd->dd_pool->dp_meta_objset;
+ uint64_t zapobj = dd->dd_phys->dd_props_zapobj;
+ uint64_t intval;
+ int isint;
+
+ isint = (dodefault(psa->name, 8, 1, &intval) == 0);
+
+ if (psa->numints == 0) {
+ int err = zap_remove(mos, zapobj, psa->name, tx);
+ ASSERT(err == 0 || err == ENOENT);
+ if (isint) {
+ VERIFY(0 == dsl_prop_get_impl(dd->dd_parent,
+ psa->name, 8, 1, &intval, NULL));
+ }
+ } else {
+ VERIFY(0 == zap_update(mos, zapobj, psa->name,
+ psa->intsz, psa->numints, psa->buf, tx));
+ if (isint)
+ intval = *(uint64_t *)psa->buf;
+ }
+
+ if (isint) {
+ dsl_prop_changed_notify(dd->dd_pool,
+ dd->dd_object, psa->name, intval, TRUE);
+ }
+}
+
+int
+dsl_prop_set_dd(dsl_dir_t *dd, const char *propname,
+ int intsz, int numints, const void *buf)
+{
+ struct prop_set_arg psa;
+
+ psa.name = propname;
+ psa.intsz = intsz;
+ psa.numints = numints;
+ psa.buf = buf;
+
+ return (dsl_sync_task_do(dd->dd_pool,
+ NULL, dsl_prop_set_sync, dd, &psa, 2));
+}
+
+int
+dsl_prop_set(const char *ddname, const char *propname,
+ int intsz, int numints, const void *buf)
+{
+ dsl_dir_t *dd;
+ int err;
+
+ /*
+ * We must do these checks before we get to the syncfunc, since
+ * it can't fail.
+ */
+ if (strlen(propname) >= ZAP_MAXNAMELEN)
+ return (ENAMETOOLONG);
+ if (intsz * numints >= ZAP_MAXVALUELEN)
+ return (E2BIG);
+
+ err = dsl_dir_open(ddname, FTAG, &dd, NULL);
+ if (err)
+ return (err);
+ err = dsl_prop_set_dd(dd, propname, intsz, numints, buf);
+ dsl_dir_close(dd, FTAG);
+ return (err);
+}
+
+/*
+ * Iterate over all properties for this dataset and return them in an nvlist.
+ */
+int
+dsl_prop_get_all(objset_t *os, nvlist_t **nvp)
+{
+ dsl_dataset_t *ds = os->os->os_dsl_dataset;
+ dsl_dir_t *dd = ds->ds_dir;
+ int err = 0;
+ dsl_pool_t *dp;
+ objset_t *mos;
+
+ if (dsl_dataset_is_snapshot(ds)) {
+ VERIFY(nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+ return (0);
+ }
+
+ VERIFY(nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+
+ dp = dd->dd_pool;
+ mos = dp->dp_meta_objset;
+
+ rw_enter(&dp->dp_config_rwlock, RW_READER);
+ for (; dd != NULL; dd = dd->dd_parent) {
+ char setpoint[MAXNAMELEN];
+ zap_cursor_t zc;
+ zap_attribute_t za;
+
+ dsl_dir_name(dd, setpoint);
+
+ for (zap_cursor_init(&zc, mos, dd->dd_phys->dd_props_zapobj);
+ (err = zap_cursor_retrieve(&zc, &za)) == 0;
+ zap_cursor_advance(&zc)) {
+ nvlist_t *propval;
+ zfs_prop_t prop;
+ /*
+ * Skip non-inheritable properties.
+ */
+ if ((prop = zfs_name_to_prop(za.za_name)) !=
+ ZFS_PROP_INVAL && !zfs_prop_inheritable(prop) &&
+ dd != ds->ds_dir)
+ continue;
+
+ if (nvlist_lookup_nvlist(*nvp, za.za_name,
+ &propval) == 0)
+ continue;
+
+ VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME,
+ KM_SLEEP) == 0);
+ if (za.za_integer_length == 1) {
+ /*
+ * String property
+ */
+ char *tmp = kmem_alloc(za.za_num_integers,
+ KM_SLEEP);
+ err = zap_lookup(mos,
+ dd->dd_phys->dd_props_zapobj,
+ za.za_name, 1, za.za_num_integers,
+ tmp);
+ if (err != 0) {
+ kmem_free(tmp, za.za_num_integers);
+ break;
+ }
+ VERIFY(nvlist_add_string(propval,
+ ZFS_PROP_VALUE, tmp) == 0);
+ kmem_free(tmp, za.za_num_integers);
+ } else {
+ /*
+ * Integer property
+ */
+ ASSERT(za.za_integer_length == 8);
+ (void) nvlist_add_uint64(propval,
+ ZFS_PROP_VALUE, za.za_first_integer);
+ }
+
+ VERIFY(nvlist_add_string(propval,
+ ZFS_PROP_SOURCE, setpoint) == 0);
+ VERIFY(nvlist_add_nvlist(*nvp, za.za_name,
+ propval) == 0);
+ nvlist_free(propval);
+ }
+ zap_cursor_fini(&zc);
+
+ if (err != ENOENT)
+ break;
+ err = 0;
+ }
+ rw_exit(&dp->dp_config_rwlock);
+
+ return (err);
+}
+
+void
+dsl_prop_nvlist_add_uint64(nvlist_t *nv, zfs_prop_t prop, uint64_t value)
+{
+ nvlist_t *propval;
+
+ VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+ VERIFY(nvlist_add_uint64(propval, ZFS_PROP_VALUE, value) == 0);
+ VERIFY(nvlist_add_nvlist(nv, zfs_prop_to_name(prop), propval) == 0);
+ nvlist_free(propval);
+}
+
+void
+dsl_prop_nvlist_add_string(nvlist_t *nv, zfs_prop_t prop, const char *value)
+{
+ nvlist_t *propval;
+
+ VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+ VERIFY(nvlist_add_string(propval, ZFS_PROP_VALUE, value) == 0);
+ VERIFY(nvlist_add_nvlist(nv, zfs_prop_to_name(prop), propval) == 0);
+ nvlist_free(propval);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_synctask.c b/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_synctask.c
new file mode 100644
index 0000000..17deb56
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/dsl_synctask.c
@@ -0,0 +1,196 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/dmu_tx.h>
+#include <sys/dsl_pool.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_synctask.h>
+
+#define DST_AVG_BLKSHIFT 14
+
+/* ARGSUSED */
+static int
+dsl_null_checkfunc(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ return (0);
+}
+
+dsl_sync_task_group_t *
+dsl_sync_task_group_create(dsl_pool_t *dp)
+{
+ dsl_sync_task_group_t *dstg;
+
+ dstg = kmem_zalloc(sizeof (dsl_sync_task_group_t), KM_SLEEP);
+ list_create(&dstg->dstg_tasks, sizeof (dsl_sync_task_t),
+ offsetof(dsl_sync_task_t, dst_node));
+ dstg->dstg_pool = dp;
+
+ return (dstg);
+}
+
+void
+dsl_sync_task_create(dsl_sync_task_group_t *dstg,
+ dsl_checkfunc_t *checkfunc, dsl_syncfunc_t *syncfunc,
+ void *arg1, void *arg2, int blocks_modified)
+{
+ dsl_sync_task_t *dst;
+
+ if (checkfunc == NULL)
+ checkfunc = dsl_null_checkfunc;
+ dst = kmem_zalloc(sizeof (dsl_sync_task_t), KM_SLEEP);
+ dst->dst_checkfunc = checkfunc;
+ dst->dst_syncfunc = syncfunc;
+ dst->dst_arg1 = arg1;
+ dst->dst_arg2 = arg2;
+ list_insert_tail(&dstg->dstg_tasks, dst);
+
+ dstg->dstg_space += blocks_modified << DST_AVG_BLKSHIFT;
+}
+
+int
+dsl_sync_task_group_wait(dsl_sync_task_group_t *dstg)
+{
+ dmu_tx_t *tx;
+ uint64_t txg;
+ dsl_sync_task_t *dst;
+
+top:
+ tx = dmu_tx_create_dd(dstg->dstg_pool->dp_mos_dir);
+ VERIFY(0 == dmu_tx_assign(tx, TXG_WAIT));
+
+ txg = dmu_tx_get_txg(tx);
+
+ /* Do a preliminary error check. */
+ dstg->dstg_err = 0;
+ rw_enter(&dstg->dstg_pool->dp_config_rwlock, RW_READER);
+ for (dst = list_head(&dstg->dstg_tasks); dst;
+ dst = list_next(&dstg->dstg_tasks, dst)) {
+#ifdef ZFS_DEBUG
+ /*
+ * Only check half the time, otherwise, the sync-context
+ * check will almost never fail.
+ */
+ if (spa_get_random(2) == 0)
+ continue;
+#endif
+ dst->dst_err =
+ dst->dst_checkfunc(dst->dst_arg1, dst->dst_arg2, tx);
+ if (dst->dst_err)
+ dstg->dstg_err = dst->dst_err;
+ }
+ rw_exit(&dstg->dstg_pool->dp_config_rwlock);
+
+ if (dstg->dstg_err) {
+ dmu_tx_commit(tx);
+ return (dstg->dstg_err);
+ }
+
+ VERIFY(0 == txg_list_add(&dstg->dstg_pool->dp_sync_tasks, dstg, txg));
+
+ dmu_tx_commit(tx);
+
+ txg_wait_synced(dstg->dstg_pool, txg);
+
+ if (dstg->dstg_err == EAGAIN)
+ goto top;
+
+ return (dstg->dstg_err);
+}
+
+void
+dsl_sync_task_group_destroy(dsl_sync_task_group_t *dstg)
+{
+ dsl_sync_task_t *dst;
+
+ while (dst = list_head(&dstg->dstg_tasks)) {
+ list_remove(&dstg->dstg_tasks, dst);
+ kmem_free(dst, sizeof (dsl_sync_task_t));
+ }
+ kmem_free(dstg, sizeof (dsl_sync_task_group_t));
+}
+
+void
+dsl_sync_task_group_sync(dsl_sync_task_group_t *dstg, dmu_tx_t *tx)
+{
+ dsl_sync_task_t *dst;
+ void *tr_cookie;
+
+ ASSERT3U(dstg->dstg_err, ==, 0);
+
+ /*
+ * Check for sufficient space.
+ */
+ dstg->dstg_err = dsl_dir_tempreserve_space(dstg->dstg_pool->dp_mos_dir,
+ dstg->dstg_space, dstg->dstg_space * 3, 0, &tr_cookie, tx);
+ /* don't bother trying again */
+ if (dstg->dstg_err == ERESTART)
+ dstg->dstg_err = EAGAIN;
+ if (dstg->dstg_err)
+ return;
+
+ /*
+ * Check for errors by calling checkfuncs.
+ */
+ rw_enter(&dstg->dstg_pool->dp_config_rwlock, RW_WRITER);
+ for (dst = list_head(&dstg->dstg_tasks); dst;
+ dst = list_next(&dstg->dstg_tasks, dst)) {
+ dst->dst_err =
+ dst->dst_checkfunc(dst->dst_arg1, dst->dst_arg2, tx);
+ if (dst->dst_err)
+ dstg->dstg_err = dst->dst_err;
+ }
+
+ if (dstg->dstg_err == 0) {
+ /*
+ * Execute sync tasks.
+ */
+ for (dst = list_head(&dstg->dstg_tasks); dst;
+ dst = list_next(&dstg->dstg_tasks, dst)) {
+ dst->dst_syncfunc(dst->dst_arg1, dst->dst_arg2, tx);
+ }
+ }
+ rw_exit(&dstg->dstg_pool->dp_config_rwlock);
+
+ dsl_dir_tempreserve_clear(tr_cookie, tx);
+}
+
+int
+dsl_sync_task_do(dsl_pool_t *dp,
+ dsl_checkfunc_t *checkfunc, dsl_syncfunc_t *syncfunc,
+ void *arg1, void *arg2, int blocks_modified)
+{
+ dsl_sync_task_group_t *dstg;
+ int err;
+
+ dstg = dsl_sync_task_group_create(dp);
+ dsl_sync_task_create(dstg, checkfunc, syncfunc,
+ arg1, arg2, blocks_modified);
+ err = dsl_sync_task_group_wait(dstg);
+ dsl_sync_task_group_destroy(dstg);
+ return (err);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/fletcher.c b/sys/contrib/opensolaris/uts/common/fs/zfs/fletcher.c
new file mode 100644
index 0000000..edda3c9
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/fletcher.c
@@ -0,0 +1,145 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/sysmacros.h>
+#include <sys/byteorder.h>
+#include <sys/spa.h>
+
+void
+fletcher_2_native(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ const uint64_t *ip = buf;
+ const uint64_t *ipend = ip + (size / sizeof (uint64_t));
+ uint64_t a0, b0, a1, b1;
+
+ for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
+ a0 += ip[0];
+ a1 += ip[1];
+ b0 += a0;
+ b1 += a1;
+ }
+
+ ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
+}
+
+void
+fletcher_2_byteswap(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ const uint64_t *ip = buf;
+ const uint64_t *ipend = ip + (size / sizeof (uint64_t));
+ uint64_t a0, b0, a1, b1;
+
+ for (a0 = b0 = a1 = b1 = 0; ip < ipend; ip += 2) {
+ a0 += BSWAP_64(ip[0]);
+ a1 += BSWAP_64(ip[1]);
+ b0 += a0;
+ b1 += a1;
+ }
+
+ ZIO_SET_CHECKSUM(zcp, a0, a1, b0, b1);
+}
+
+void
+fletcher_4_native(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ const uint32_t *ip = buf;
+ const uint32_t *ipend = ip + (size / sizeof (uint32_t));
+ uint64_t a, b, c, d;
+
+ for (a = b = c = d = 0; ip < ipend; ip++) {
+ a += ip[0];
+ b += a;
+ c += b;
+ d += c;
+ }
+
+ ZIO_SET_CHECKSUM(zcp, a, b, c, d);
+}
+
+void
+fletcher_4_byteswap(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ const uint32_t *ip = buf;
+ const uint32_t *ipend = ip + (size / sizeof (uint32_t));
+ uint64_t a, b, c, d;
+
+ for (a = b = c = d = 0; ip < ipend; ip++) {
+ a += BSWAP_32(ip[0]);
+ b += a;
+ c += b;
+ d += c;
+ }
+
+ ZIO_SET_CHECKSUM(zcp, a, b, c, d);
+}
+
+void
+fletcher_4_incremental_native(const void *buf, uint64_t size,
+ zio_cksum_t *zcp)
+{
+ const uint32_t *ip = buf;
+ const uint32_t *ipend = ip + (size / sizeof (uint32_t));
+ uint64_t a, b, c, d;
+
+ a = zcp->zc_word[0];
+ b = zcp->zc_word[1];
+ c = zcp->zc_word[2];
+ d = zcp->zc_word[3];
+
+ for (; ip < ipend; ip++) {
+ a += ip[0];
+ b += a;
+ c += b;
+ d += c;
+ }
+
+ ZIO_SET_CHECKSUM(zcp, a, b, c, d);
+}
+
+void
+fletcher_4_incremental_byteswap(const void *buf, uint64_t size,
+ zio_cksum_t *zcp)
+{
+ const uint32_t *ip = buf;
+ const uint32_t *ipend = ip + (size / sizeof (uint32_t));
+ uint64_t a, b, c, d;
+
+ a = zcp->zc_word[0];
+ b = zcp->zc_word[1];
+ c = zcp->zc_word[2];
+ d = zcp->zc_word[3];
+
+ for (; ip < ipend; ip++) {
+ a += BSWAP_32(ip[0]);
+ b += a;
+ c += b;
+ d += c;
+ }
+
+ ZIO_SET_CHECKSUM(zcp, a, b, c, d);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/gzip.c b/sys/contrib/opensolaris/uts/common/fs/zfs/gzip.c
new file mode 100644
index 0000000..b257d4a
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/gzip.c
@@ -0,0 +1,69 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/debug.h>
+#include <sys/types.h>
+#include <sys/zmod.h>
+
+#ifdef _KERNEL
+#include <sys/systm.h>
+#else
+#include <strings.h>
+#endif
+
+size_t
+gzip_compress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
+{
+ size_t dstlen = d_len;
+
+ ASSERT(d_len <= s_len);
+
+ if (z_compress_level(d_start, &dstlen, s_start, s_len, n) != Z_OK) {
+ if (d_len != s_len)
+ return (s_len);
+
+ bcopy(s_start, d_start, s_len);
+ return (s_len);
+ }
+
+ return (dstlen);
+}
+
+/*ARGSUSED*/
+int
+gzip_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
+{
+ size_t dstlen = d_len;
+
+ ASSERT(d_len >= s_len);
+
+ if (z_uncompress(d_start, &dstlen, s_start, s_len) != Z_OK)
+ return (-1);
+
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/lzjb.c b/sys/contrib/opensolaris/uts/common/fs/zfs/lzjb.c
new file mode 100644
index 0000000..a88b85c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/lzjb.c
@@ -0,0 +1,129 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * We keep our own copy of this algorithm for 2 main reasons:
+ * 1. If we didn't, anyone modifying common/os/compress.c would
+ * directly break our on disk format
+ * 2. Our version of lzjb does not have a number of checks that the
+ * common/os version needs and uses
+ * In particular, we are adding the "feature" that compress() can
+ * take a destination buffer size and return -1 if the data will not
+ * compress to d_len or less.
+ */
+
+#include <sys/zfs_context.h>
+#include <sys/types.h>
+
+#define MATCH_BITS 6
+#define MATCH_MIN 3
+#define MATCH_MAX ((1 << MATCH_BITS) + (MATCH_MIN - 1))
+#define OFFSET_MASK ((1 << (16 - MATCH_BITS)) - 1)
+#define LEMPEL_SIZE 256
+
+/*ARGSUSED*/
+size_t
+lzjb_compress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
+{
+ uchar_t *src = s_start;
+ uchar_t *dst = d_start;
+ uchar_t *cpy, *copymap;
+ int copymask = 1 << (NBBY - 1);
+ int mlen, offset;
+ uint16_t *hp;
+ uint16_t lempel[LEMPEL_SIZE]; /* uninitialized; see above */
+
+ while (src < (uchar_t *)s_start + s_len) {
+ if ((copymask <<= 1) == (1 << NBBY)) {
+ if (dst >= (uchar_t *)d_start + d_len - 1 - 2 * NBBY) {
+ if (d_len != s_len)
+ return (s_len);
+ mlen = s_len;
+ for (src = s_start, dst = d_start; mlen; mlen--)
+ *dst++ = *src++;
+ return (s_len);
+ }
+ copymask = 1;
+ copymap = dst;
+ *dst++ = 0;
+ }
+ if (src > (uchar_t *)s_start + s_len - MATCH_MAX) {
+ *dst++ = *src++;
+ continue;
+ }
+ hp = &lempel[((src[0] + 13) ^ (src[1] - 13) ^ src[2]) &
+ (LEMPEL_SIZE - 1)];
+ offset = (intptr_t)(src - *hp) & OFFSET_MASK;
+ *hp = (uint16_t)(uintptr_t)src;
+ cpy = src - offset;
+ if (cpy >= (uchar_t *)s_start && cpy != src &&
+ src[0] == cpy[0] && src[1] == cpy[1] && src[2] == cpy[2]) {
+ *copymap |= copymask;
+ for (mlen = MATCH_MIN; mlen < MATCH_MAX; mlen++)
+ if (src[mlen] != cpy[mlen])
+ break;
+ *dst++ = ((mlen - MATCH_MIN) << (NBBY - MATCH_BITS)) |
+ (offset >> NBBY);
+ *dst++ = (uchar_t)offset;
+ src += mlen;
+ } else {
+ *dst++ = *src++;
+ }
+ }
+ return (dst - (uchar_t *)d_start);
+}
+
+/*ARGSUSED*/
+int
+lzjb_decompress(void *s_start, void *d_start, size_t s_len, size_t d_len, int n)
+{
+ uchar_t *src = s_start;
+ uchar_t *dst = d_start;
+ uchar_t *d_end = (uchar_t *)d_start + d_len;
+ uchar_t *cpy, copymap;
+ int copymask = 1 << (NBBY - 1);
+
+ while (dst < d_end) {
+ if ((copymask <<= 1) == (1 << NBBY)) {
+ copymask = 1;
+ copymap = *src++;
+ }
+ if (copymap & copymask) {
+ int mlen = (src[0] >> (NBBY - MATCH_BITS)) + MATCH_MIN;
+ int offset = ((src[0] << NBBY) | src[1]) & OFFSET_MASK;
+ src += 2;
+ if ((cpy = dst - offset) < (uchar_t *)d_start)
+ return (-1);
+ while (--mlen >= 0 && dst < d_end)
+ *dst++ = *cpy++;
+ } else {
+ *dst++ = *src++;
+ }
+ }
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/metaslab.c b/sys/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
new file mode 100644
index 0000000..0dba134
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/metaslab.c
@@ -0,0 +1,1023 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa_impl.h>
+#include <sys/dmu.h>
+#include <sys/dmu_tx.h>
+#include <sys/space_map.h>
+#include <sys/metaslab_impl.h>
+#include <sys/vdev_impl.h>
+#include <sys/zio.h>
+
+uint64_t metaslab_aliquot = 512ULL << 10;
+
+/*
+ * ==========================================================================
+ * Metaslab classes
+ * ==========================================================================
+ */
+metaslab_class_t *
+metaslab_class_create(void)
+{
+ metaslab_class_t *mc;
+
+ mc = kmem_zalloc(sizeof (metaslab_class_t), KM_SLEEP);
+
+ mc->mc_rotor = NULL;
+
+ return (mc);
+}
+
+void
+metaslab_class_destroy(metaslab_class_t *mc)
+{
+ metaslab_group_t *mg;
+
+ while ((mg = mc->mc_rotor) != NULL) {
+ metaslab_class_remove(mc, mg);
+ metaslab_group_destroy(mg);
+ }
+
+ kmem_free(mc, sizeof (metaslab_class_t));
+}
+
+void
+metaslab_class_add(metaslab_class_t *mc, metaslab_group_t *mg)
+{
+ metaslab_group_t *mgprev, *mgnext;
+
+ ASSERT(mg->mg_class == NULL);
+
+ if ((mgprev = mc->mc_rotor) == NULL) {
+ mg->mg_prev = mg;
+ mg->mg_next = mg;
+ } else {
+ mgnext = mgprev->mg_next;
+ mg->mg_prev = mgprev;
+ mg->mg_next = mgnext;
+ mgprev->mg_next = mg;
+ mgnext->mg_prev = mg;
+ }
+ mc->mc_rotor = mg;
+ mg->mg_class = mc;
+}
+
+void
+metaslab_class_remove(metaslab_class_t *mc, metaslab_group_t *mg)
+{
+ metaslab_group_t *mgprev, *mgnext;
+
+ ASSERT(mg->mg_class == mc);
+
+ mgprev = mg->mg_prev;
+ mgnext = mg->mg_next;
+
+ if (mg == mgnext) {
+ mc->mc_rotor = NULL;
+ } else {
+ mc->mc_rotor = mgnext;
+ mgprev->mg_next = mgnext;
+ mgnext->mg_prev = mgprev;
+ }
+
+ mg->mg_prev = NULL;
+ mg->mg_next = NULL;
+ mg->mg_class = NULL;
+}
+
+/*
+ * ==========================================================================
+ * Metaslab groups
+ * ==========================================================================
+ */
+static int
+metaslab_compare(const void *x1, const void *x2)
+{
+ const metaslab_t *m1 = x1;
+ const metaslab_t *m2 = x2;
+
+ if (m1->ms_weight < m2->ms_weight)
+ return (1);
+ if (m1->ms_weight > m2->ms_weight)
+ return (-1);
+
+ /*
+ * If the weights are identical, use the offset to force uniqueness.
+ */
+ if (m1->ms_map.sm_start < m2->ms_map.sm_start)
+ return (-1);
+ if (m1->ms_map.sm_start > m2->ms_map.sm_start)
+ return (1);
+
+ ASSERT3P(m1, ==, m2);
+
+ return (0);
+}
+
+metaslab_group_t *
+metaslab_group_create(metaslab_class_t *mc, vdev_t *vd)
+{
+ metaslab_group_t *mg;
+
+ mg = kmem_zalloc(sizeof (metaslab_group_t), KM_SLEEP);
+ mutex_init(&mg->mg_lock, NULL, MUTEX_DEFAULT, NULL);
+ avl_create(&mg->mg_metaslab_tree, metaslab_compare,
+ sizeof (metaslab_t), offsetof(struct metaslab, ms_group_node));
+ mg->mg_aliquot = metaslab_aliquot * MAX(1, vd->vdev_children);
+ mg->mg_vd = vd;
+ metaslab_class_add(mc, mg);
+
+ return (mg);
+}
+
+void
+metaslab_group_destroy(metaslab_group_t *mg)
+{
+ avl_destroy(&mg->mg_metaslab_tree);
+ mutex_destroy(&mg->mg_lock);
+ kmem_free(mg, sizeof (metaslab_group_t));
+}
+
+static void
+metaslab_group_add(metaslab_group_t *mg, metaslab_t *msp)
+{
+ mutex_enter(&mg->mg_lock);
+ ASSERT(msp->ms_group == NULL);
+ msp->ms_group = mg;
+ msp->ms_weight = 0;
+ avl_add(&mg->mg_metaslab_tree, msp);
+ mutex_exit(&mg->mg_lock);
+}
+
+static void
+metaslab_group_remove(metaslab_group_t *mg, metaslab_t *msp)
+{
+ mutex_enter(&mg->mg_lock);
+ ASSERT(msp->ms_group == mg);
+ avl_remove(&mg->mg_metaslab_tree, msp);
+ msp->ms_group = NULL;
+ mutex_exit(&mg->mg_lock);
+}
+
+static void
+metaslab_group_sort(metaslab_group_t *mg, metaslab_t *msp, uint64_t weight)
+{
+ /*
+ * Although in principle the weight can be any value, in
+ * practice we do not use values in the range [1, 510].
+ */
+ ASSERT(weight >= SPA_MINBLOCKSIZE-1 || weight == 0);
+ ASSERT(MUTEX_HELD(&msp->ms_lock));
+
+ mutex_enter(&mg->mg_lock);
+ ASSERT(msp->ms_group == mg);
+ avl_remove(&mg->mg_metaslab_tree, msp);
+ msp->ms_weight = weight;
+ avl_add(&mg->mg_metaslab_tree, msp);
+ mutex_exit(&mg->mg_lock);
+}
+
+/*
+ * ==========================================================================
+ * The first-fit block allocator
+ * ==========================================================================
+ */
+static void
+metaslab_ff_load(space_map_t *sm)
+{
+ ASSERT(sm->sm_ppd == NULL);
+ sm->sm_ppd = kmem_zalloc(64 * sizeof (uint64_t), KM_SLEEP);
+}
+
+static void
+metaslab_ff_unload(space_map_t *sm)
+{
+ kmem_free(sm->sm_ppd, 64 * sizeof (uint64_t));
+ sm->sm_ppd = NULL;
+}
+
+static uint64_t
+metaslab_ff_alloc(space_map_t *sm, uint64_t size)
+{
+ avl_tree_t *t = &sm->sm_root;
+ uint64_t align = size & -size;
+ uint64_t *cursor = (uint64_t *)sm->sm_ppd + highbit(align) - 1;
+ space_seg_t *ss, ssearch;
+ avl_index_t where;
+
+ ssearch.ss_start = *cursor;
+ ssearch.ss_end = *cursor + size;
+
+ ss = avl_find(t, &ssearch, &where);
+ if (ss == NULL)
+ ss = avl_nearest(t, where, AVL_AFTER);
+
+ while (ss != NULL) {
+ uint64_t offset = P2ROUNDUP(ss->ss_start, align);
+
+ if (offset + size <= ss->ss_end) {
+ *cursor = offset + size;
+ return (offset);
+ }
+ ss = AVL_NEXT(t, ss);
+ }
+
+ /*
+ * If we know we've searched the whole map (*cursor == 0), give up.
+ * Otherwise, reset the cursor to the beginning and try again.
+ */
+ if (*cursor == 0)
+ return (-1ULL);
+
+ *cursor = 0;
+ return (metaslab_ff_alloc(sm, size));
+}
+
+/* ARGSUSED */
+static void
+metaslab_ff_claim(space_map_t *sm, uint64_t start, uint64_t size)
+{
+ /* No need to update cursor */
+}
+
+/* ARGSUSED */
+static void
+metaslab_ff_free(space_map_t *sm, uint64_t start, uint64_t size)
+{
+ /* No need to update cursor */
+}
+
+static space_map_ops_t metaslab_ff_ops = {
+ metaslab_ff_load,
+ metaslab_ff_unload,
+ metaslab_ff_alloc,
+ metaslab_ff_claim,
+ metaslab_ff_free
+};
+
+/*
+ * ==========================================================================
+ * Metaslabs
+ * ==========================================================================
+ */
+metaslab_t *
+metaslab_init(metaslab_group_t *mg, space_map_obj_t *smo,
+ uint64_t start, uint64_t size, uint64_t txg)
+{
+ vdev_t *vd = mg->mg_vd;
+ metaslab_t *msp;
+
+ msp = kmem_zalloc(sizeof (metaslab_t), KM_SLEEP);
+ mutex_init(&msp->ms_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ msp->ms_smo_syncing = *smo;
+
+ /*
+ * We create the main space map here, but we don't create the
+ * allocmaps and freemaps until metaslab_sync_done(). This serves
+ * two purposes: it allows metaslab_sync_done() to detect the
+ * addition of new space; and for debugging, it ensures that we'd
+ * data fault on any attempt to use this metaslab before it's ready.
+ */
+ space_map_create(&msp->ms_map, start, size,
+ vd->vdev_ashift, &msp->ms_lock);
+
+ metaslab_group_add(mg, msp);
+
+ /*
+ * If we're opening an existing pool (txg == 0) or creating
+ * a new one (txg == TXG_INITIAL), all space is available now.
+ * If we're adding space to an existing pool, the new space
+ * does not become available until after this txg has synced.
+ */
+ if (txg <= TXG_INITIAL)
+ metaslab_sync_done(msp, 0);
+
+ if (txg != 0) {
+ /*
+ * The vdev is dirty, but the metaslab isn't -- it just needs
+ * to have metaslab_sync_done() invoked from vdev_sync_done().
+ * [We could just dirty the metaslab, but that would cause us
+ * to allocate a space map object for it, which is wasteful
+ * and would mess up the locality logic in metaslab_weight().]
+ */
+ ASSERT(TXG_CLEAN(txg) == spa_last_synced_txg(vd->vdev_spa));
+ vdev_dirty(vd, 0, NULL, txg);
+ vdev_dirty(vd, VDD_METASLAB, msp, TXG_CLEAN(txg));
+ }
+
+ return (msp);
+}
+
+void
+metaslab_fini(metaslab_t *msp)
+{
+ metaslab_group_t *mg = msp->ms_group;
+ int t;
+
+ vdev_space_update(mg->mg_vd, -msp->ms_map.sm_size,
+ -msp->ms_smo.smo_alloc);
+
+ metaslab_group_remove(mg, msp);
+
+ mutex_enter(&msp->ms_lock);
+
+ space_map_unload(&msp->ms_map);
+ space_map_destroy(&msp->ms_map);
+
+ for (t = 0; t < TXG_SIZE; t++) {
+ space_map_destroy(&msp->ms_allocmap[t]);
+ space_map_destroy(&msp->ms_freemap[t]);
+ }
+
+ mutex_exit(&msp->ms_lock);
+ mutex_destroy(&msp->ms_lock);
+
+ kmem_free(msp, sizeof (metaslab_t));
+}
+
+#define METASLAB_WEIGHT_PRIMARY (1ULL << 63)
+#define METASLAB_WEIGHT_SECONDARY (1ULL << 62)
+#define METASLAB_ACTIVE_MASK \
+ (METASLAB_WEIGHT_PRIMARY | METASLAB_WEIGHT_SECONDARY)
+#define METASLAB_SMO_BONUS_MULTIPLIER 2
+
+static uint64_t
+metaslab_weight(metaslab_t *msp)
+{
+ metaslab_group_t *mg = msp->ms_group;
+ space_map_t *sm = &msp->ms_map;
+ space_map_obj_t *smo = &msp->ms_smo;
+ vdev_t *vd = mg->mg_vd;
+ uint64_t weight, space;
+
+ ASSERT(MUTEX_HELD(&msp->ms_lock));
+
+ /*
+ * The baseline weight is the metaslab's free space.
+ */
+ space = sm->sm_size - smo->smo_alloc;
+ weight = space;
+
+ /*
+ * Modern disks have uniform bit density and constant angular velocity.
+ * Therefore, the outer recording zones are faster (higher bandwidth)
+ * than the inner zones by the ratio of outer to inner track diameter,
+ * which is typically around 2:1. We account for this by assigning
+ * higher weight to lower metaslabs (multiplier ranging from 2x to 1x).
+ * In effect, this means that we'll select the metaslab with the most
+ * free bandwidth rather than simply the one with the most free space.
+ */
+ weight = 2 * weight -
+ ((sm->sm_start >> vd->vdev_ms_shift) * weight) / vd->vdev_ms_count;
+ ASSERT(weight >= space && weight <= 2 * space);
+
+ /*
+ * For locality, assign higher weight to metaslabs we've used before.
+ */
+ if (smo->smo_object != 0)
+ weight *= METASLAB_SMO_BONUS_MULTIPLIER;
+ ASSERT(weight >= space &&
+ weight <= 2 * METASLAB_SMO_BONUS_MULTIPLIER * space);
+
+ /*
+ * If this metaslab is one we're actively using, adjust its weight to
+ * make it preferable to any inactive metaslab so we'll polish it off.
+ */
+ weight |= (msp->ms_weight & METASLAB_ACTIVE_MASK);
+
+ return (weight);
+}
+
+static int
+metaslab_activate(metaslab_t *msp, uint64_t activation_weight)
+{
+ space_map_t *sm = &msp->ms_map;
+
+ ASSERT(MUTEX_HELD(&msp->ms_lock));
+
+ if ((msp->ms_weight & METASLAB_ACTIVE_MASK) == 0) {
+ int error = space_map_load(sm, &metaslab_ff_ops,
+ SM_FREE, &msp->ms_smo,
+ msp->ms_group->mg_vd->vdev_spa->spa_meta_objset);
+ if (error) {
+ metaslab_group_sort(msp->ms_group, msp, 0);
+ return (error);
+ }
+ metaslab_group_sort(msp->ms_group, msp,
+ msp->ms_weight | activation_weight);
+ }
+ ASSERT(sm->sm_loaded);
+ ASSERT(msp->ms_weight & METASLAB_ACTIVE_MASK);
+
+ return (0);
+}
+
+static void
+metaslab_passivate(metaslab_t *msp, uint64_t size)
+{
+ /*
+ * If size < SPA_MINBLOCKSIZE, then we will not allocate from
+ * this metaslab again. In that case, it had better be empty,
+ * or we would be leaving space on the table.
+ */
+ ASSERT(size >= SPA_MINBLOCKSIZE || msp->ms_map.sm_space == 0);
+ metaslab_group_sort(msp->ms_group, msp, MIN(msp->ms_weight, size));
+ ASSERT((msp->ms_weight & METASLAB_ACTIVE_MASK) == 0);
+}
+
+/*
+ * Write a metaslab to disk in the context of the specified transaction group.
+ */
+void
+metaslab_sync(metaslab_t *msp, uint64_t txg)
+{
+ vdev_t *vd = msp->ms_group->mg_vd;
+ spa_t *spa = vd->vdev_spa;
+ objset_t *mos = spa->spa_meta_objset;
+ space_map_t *allocmap = &msp->ms_allocmap[txg & TXG_MASK];
+ space_map_t *freemap = &msp->ms_freemap[txg & TXG_MASK];
+ space_map_t *freed_map = &msp->ms_freemap[TXG_CLEAN(txg) & TXG_MASK];
+ space_map_t *sm = &msp->ms_map;
+ space_map_obj_t *smo = &msp->ms_smo_syncing;
+ dmu_buf_t *db;
+ dmu_tx_t *tx;
+ int t;
+
+ tx = dmu_tx_create_assigned(spa_get_dsl(spa), txg);
+
+ /*
+ * The only state that can actually be changing concurrently with
+ * metaslab_sync() is the metaslab's ms_map. No other thread can
+ * be modifying this txg's allocmap, freemap, freed_map, or smo.
+ * Therefore, we only hold ms_lock to satify space_map ASSERTs.
+ * We drop it whenever we call into the DMU, because the DMU
+ * can call down to us (e.g. via zio_free()) at any time.
+ */
+ mutex_enter(&msp->ms_lock);
+
+ if (smo->smo_object == 0) {
+ ASSERT(smo->smo_objsize == 0);
+ ASSERT(smo->smo_alloc == 0);
+ mutex_exit(&msp->ms_lock);
+ smo->smo_object = dmu_object_alloc(mos,
+ DMU_OT_SPACE_MAP, 1 << SPACE_MAP_BLOCKSHIFT,
+ DMU_OT_SPACE_MAP_HEADER, sizeof (*smo), tx);
+ ASSERT(smo->smo_object != 0);
+ dmu_write(mos, vd->vdev_ms_array, sizeof (uint64_t) *
+ (sm->sm_start >> vd->vdev_ms_shift),
+ sizeof (uint64_t), &smo->smo_object, tx);
+ mutex_enter(&msp->ms_lock);
+ }
+
+ space_map_walk(freemap, space_map_add, freed_map);
+
+ if (sm->sm_loaded && spa_sync_pass(spa) == 1 && smo->smo_objsize >=
+ 2 * sizeof (uint64_t) * avl_numnodes(&sm->sm_root)) {
+ /*
+ * The in-core space map representation is twice as compact
+ * as the on-disk one, so it's time to condense the latter
+ * by generating a pure allocmap from first principles.
+ *
+ * This metaslab is 100% allocated,
+ * minus the content of the in-core map (sm),
+ * minus what's been freed this txg (freed_map),
+ * minus allocations from txgs in the future
+ * (because they haven't been committed yet).
+ */
+ space_map_vacate(allocmap, NULL, NULL);
+ space_map_vacate(freemap, NULL, NULL);
+
+ space_map_add(allocmap, allocmap->sm_start, allocmap->sm_size);
+
+ space_map_walk(sm, space_map_remove, allocmap);
+ space_map_walk(freed_map, space_map_remove, allocmap);
+
+ for (t = 1; t < TXG_CONCURRENT_STATES; t++)
+ space_map_walk(&msp->ms_allocmap[(txg + t) & TXG_MASK],
+ space_map_remove, allocmap);
+
+ mutex_exit(&msp->ms_lock);
+ space_map_truncate(smo, mos, tx);
+ mutex_enter(&msp->ms_lock);
+ }
+
+ space_map_sync(allocmap, SM_ALLOC, smo, mos, tx);
+ space_map_sync(freemap, SM_FREE, smo, mos, tx);
+
+ mutex_exit(&msp->ms_lock);
+
+ VERIFY(0 == dmu_bonus_hold(mos, smo->smo_object, FTAG, &db));
+ dmu_buf_will_dirty(db, tx);
+ ASSERT3U(db->db_size, ==, sizeof (*smo));
+ bcopy(smo, db->db_data, db->db_size);
+ dmu_buf_rele(db, FTAG);
+
+ dmu_tx_commit(tx);
+}
+
+/*
+ * Called after a transaction group has completely synced to mark
+ * all of the metaslab's free space as usable.
+ */
+void
+metaslab_sync_done(metaslab_t *msp, uint64_t txg)
+{
+ space_map_obj_t *smo = &msp->ms_smo;
+ space_map_obj_t *smosync = &msp->ms_smo_syncing;
+ space_map_t *sm = &msp->ms_map;
+ space_map_t *freed_map = &msp->ms_freemap[TXG_CLEAN(txg) & TXG_MASK];
+ metaslab_group_t *mg = msp->ms_group;
+ vdev_t *vd = mg->mg_vd;
+ int t;
+
+ mutex_enter(&msp->ms_lock);
+
+ /*
+ * If this metaslab is just becoming available, initialize its
+ * allocmaps and freemaps and add its capacity to the vdev.
+ */
+ if (freed_map->sm_size == 0) {
+ for (t = 0; t < TXG_SIZE; t++) {
+ space_map_create(&msp->ms_allocmap[t], sm->sm_start,
+ sm->sm_size, sm->sm_shift, sm->sm_lock);
+ space_map_create(&msp->ms_freemap[t], sm->sm_start,
+ sm->sm_size, sm->sm_shift, sm->sm_lock);
+ }
+ vdev_space_update(vd, sm->sm_size, 0);
+ }
+
+ vdev_space_update(vd, 0, smosync->smo_alloc - smo->smo_alloc);
+
+ ASSERT(msp->ms_allocmap[txg & TXG_MASK].sm_space == 0);
+ ASSERT(msp->ms_freemap[txg & TXG_MASK].sm_space == 0);
+
+ /*
+ * If there's a space_map_load() in progress, wait for it to complete
+ * so that we have a consistent view of the in-core space map.
+ * Then, add everything we freed in this txg to the map.
+ */
+ space_map_load_wait(sm);
+ space_map_vacate(freed_map, sm->sm_loaded ? space_map_free : NULL, sm);
+
+ *smo = *smosync;
+
+ /*
+ * If the map is loaded but no longer active, evict it as soon as all
+ * future allocations have synced. (If we unloaded it now and then
+ * loaded a moment later, the map wouldn't reflect those allocations.)
+ */
+ if (sm->sm_loaded && (msp->ms_weight & METASLAB_ACTIVE_MASK) == 0) {
+ int evictable = 1;
+
+ for (t = 1; t < TXG_CONCURRENT_STATES; t++)
+ if (msp->ms_allocmap[(txg + t) & TXG_MASK].sm_space)
+ evictable = 0;
+
+ if (evictable)
+ space_map_unload(sm);
+ }
+
+ metaslab_group_sort(mg, msp, metaslab_weight(msp));
+
+ mutex_exit(&msp->ms_lock);
+}
+
+static uint64_t
+metaslab_distance(metaslab_t *msp, dva_t *dva)
+{
+ uint64_t ms_shift = msp->ms_group->mg_vd->vdev_ms_shift;
+ uint64_t offset = DVA_GET_OFFSET(dva) >> ms_shift;
+ uint64_t start = msp->ms_map.sm_start >> ms_shift;
+
+ if (msp->ms_group->mg_vd->vdev_id != DVA_GET_VDEV(dva))
+ return (1ULL << 63);
+
+ if (offset < start)
+ return ((start - offset) << ms_shift);
+ if (offset > start)
+ return ((offset - start) << ms_shift);
+ return (0);
+}
+
+static uint64_t
+metaslab_group_alloc(metaslab_group_t *mg, uint64_t size, uint64_t txg,
+ uint64_t min_distance, dva_t *dva, int d)
+{
+ metaslab_t *msp = NULL;
+ uint64_t offset = -1ULL;
+ avl_tree_t *t = &mg->mg_metaslab_tree;
+ uint64_t activation_weight;
+ uint64_t target_distance;
+ int i;
+
+ activation_weight = METASLAB_WEIGHT_PRIMARY;
+ for (i = 0; i < d; i++)
+ if (DVA_GET_VDEV(&dva[i]) == mg->mg_vd->vdev_id)
+ activation_weight = METASLAB_WEIGHT_SECONDARY;
+
+ for (;;) {
+ mutex_enter(&mg->mg_lock);
+ for (msp = avl_first(t); msp; msp = AVL_NEXT(t, msp)) {
+ if (msp->ms_weight < size) {
+ mutex_exit(&mg->mg_lock);
+ return (-1ULL);
+ }
+
+ if (activation_weight == METASLAB_WEIGHT_PRIMARY)
+ break;
+
+ target_distance = min_distance +
+ (msp->ms_smo.smo_alloc ? 0 : min_distance >> 1);
+
+ for (i = 0; i < d; i++)
+ if (metaslab_distance(msp, &dva[i]) <
+ target_distance)
+ break;
+ if (i == d)
+ break;
+ }
+ mutex_exit(&mg->mg_lock);
+ if (msp == NULL)
+ return (-1ULL);
+
+ mutex_enter(&msp->ms_lock);
+
+ /*
+ * Ensure that the metaslab we have selected is still
+ * capable of handling our request. It's possible that
+ * another thread may have changed the weight while we
+ * were blocked on the metaslab lock.
+ */
+ if (msp->ms_weight < size) {
+ mutex_exit(&msp->ms_lock);
+ continue;
+ }
+
+ if ((msp->ms_weight & METASLAB_WEIGHT_SECONDARY) &&
+ activation_weight == METASLAB_WEIGHT_PRIMARY) {
+ metaslab_passivate(msp,
+ msp->ms_weight & ~METASLAB_ACTIVE_MASK);
+ mutex_exit(&msp->ms_lock);
+ continue;
+ }
+
+ if (metaslab_activate(msp, activation_weight) != 0) {
+ mutex_exit(&msp->ms_lock);
+ continue;
+ }
+
+ if ((offset = space_map_alloc(&msp->ms_map, size)) != -1ULL)
+ break;
+
+ metaslab_passivate(msp, size - 1);
+
+ mutex_exit(&msp->ms_lock);
+ }
+
+ if (msp->ms_allocmap[txg & TXG_MASK].sm_space == 0)
+ vdev_dirty(mg->mg_vd, VDD_METASLAB, msp, txg);
+
+ space_map_add(&msp->ms_allocmap[txg & TXG_MASK], offset, size);
+
+ mutex_exit(&msp->ms_lock);
+
+ return (offset);
+}
+
+/*
+ * Allocate a block for the specified i/o.
+ */
+static int
+metaslab_alloc_dva(spa_t *spa, uint64_t psize, dva_t *dva, int d,
+ dva_t *hintdva, uint64_t txg, boolean_t hintdva_avoid)
+{
+ metaslab_group_t *mg, *rotor;
+ metaslab_class_t *mc;
+ vdev_t *vd;
+ int dshift = 3;
+ int all_zero;
+ uint64_t offset = -1ULL;
+ uint64_t asize;
+ uint64_t distance;
+
+ ASSERT(!DVA_IS_VALID(&dva[d]));
+
+ mc = spa_metaslab_class_select(spa);
+
+ /*
+ * Start at the rotor and loop through all mgs until we find something.
+ * Note that there's no locking on mc_rotor or mc_allocated because
+ * nothing actually breaks if we miss a few updates -- we just won't
+ * allocate quite as evenly. It all balances out over time.
+ *
+ * If we are doing ditto or log blocks, try to spread them across
+ * consecutive vdevs. If we're forced to reuse a vdev before we've
+ * allocated all of our ditto blocks, then try and spread them out on
+ * that vdev as much as possible. If it turns out to not be possible,
+ * gradually lower our standards until anything becomes acceptable.
+ * Also, allocating on consecutive vdevs (as opposed to random vdevs)
+ * gives us hope of containing our fault domains to something we're
+ * able to reason about. Otherwise, any two top-level vdev failures
+ * will guarantee the loss of data. With consecutive allocation,
+ * only two adjacent top-level vdev failures will result in data loss.
+ *
+ * If we are doing gang blocks (hintdva is non-NULL), try to keep
+ * ourselves on the same vdev as our gang block header. That
+ * way, we can hope for locality in vdev_cache, plus it makes our
+ * fault domains something tractable.
+ */
+ if (hintdva) {
+ vd = vdev_lookup_top(spa, DVA_GET_VDEV(&hintdva[d]));
+ if (hintdva_avoid)
+ mg = vd->vdev_mg->mg_next;
+ else
+ mg = vd->vdev_mg;
+ } else if (d != 0) {
+ vd = vdev_lookup_top(spa, DVA_GET_VDEV(&dva[d - 1]));
+ mg = vd->vdev_mg->mg_next;
+ } else {
+ mg = mc->mc_rotor;
+ }
+ rotor = mg;
+
+top:
+ all_zero = B_TRUE;
+ do {
+ vd = mg->mg_vd;
+
+ distance = vd->vdev_asize >> dshift;
+ if (distance <= (1ULL << vd->vdev_ms_shift))
+ distance = 0;
+ else
+ all_zero = B_FALSE;
+
+ asize = vdev_psize_to_asize(vd, psize);
+ ASSERT(P2PHASE(asize, 1ULL << vd->vdev_ashift) == 0);
+
+ offset = metaslab_group_alloc(mg, asize, txg, distance, dva, d);
+ if (offset != -1ULL) {
+ /*
+ * If we've just selected this metaslab group,
+ * figure out whether the corresponding vdev is
+ * over- or under-used relative to the pool,
+ * and set an allocation bias to even it out.
+ */
+ if (mc->mc_allocated == 0) {
+ vdev_stat_t *vs = &vd->vdev_stat;
+ uint64_t alloc, space;
+ int64_t vu, su;
+
+ alloc = spa_get_alloc(spa);
+ space = spa_get_space(spa);
+
+ /*
+ * Determine percent used in units of 0..1024.
+ * (This is just to avoid floating point.)
+ */
+ vu = (vs->vs_alloc << 10) / (vs->vs_space + 1);
+ su = (alloc << 10) / (space + 1);
+
+ /*
+ * Bias by at most +/- 25% of the aliquot.
+ */
+ mg->mg_bias = ((su - vu) *
+ (int64_t)mg->mg_aliquot) / (1024 * 4);
+ }
+
+ if (atomic_add_64_nv(&mc->mc_allocated, asize) >=
+ mg->mg_aliquot + mg->mg_bias) {
+ mc->mc_rotor = mg->mg_next;
+ mc->mc_allocated = 0;
+ }
+
+ DVA_SET_VDEV(&dva[d], vd->vdev_id);
+ DVA_SET_OFFSET(&dva[d], offset);
+ DVA_SET_GANG(&dva[d], 0);
+ DVA_SET_ASIZE(&dva[d], asize);
+
+ return (0);
+ }
+ mc->mc_rotor = mg->mg_next;
+ mc->mc_allocated = 0;
+ } while ((mg = mg->mg_next) != rotor);
+
+ if (!all_zero) {
+ dshift++;
+ ASSERT(dshift < 64);
+ goto top;
+ }
+
+ bzero(&dva[d], sizeof (dva_t));
+
+ return (ENOSPC);
+}
+
+/*
+ * Free the block represented by DVA in the context of the specified
+ * transaction group.
+ */
+static void
+metaslab_free_dva(spa_t *spa, const dva_t *dva, uint64_t txg, boolean_t now)
+{
+ uint64_t vdev = DVA_GET_VDEV(dva);
+ uint64_t offset = DVA_GET_OFFSET(dva);
+ uint64_t size = DVA_GET_ASIZE(dva);
+ vdev_t *vd;
+ metaslab_t *msp;
+
+ ASSERT(DVA_IS_VALID(dva));
+
+ if (txg > spa_freeze_txg(spa))
+ return;
+
+ if ((vd = vdev_lookup_top(spa, vdev)) == NULL ||
+ (offset >> vd->vdev_ms_shift) >= vd->vdev_ms_count) {
+ cmn_err(CE_WARN, "metaslab_free_dva(): bad DVA %llu:%llu",
+ (u_longlong_t)vdev, (u_longlong_t)offset);
+ ASSERT(0);
+ return;
+ }
+
+ msp = vd->vdev_ms[offset >> vd->vdev_ms_shift];
+
+ if (DVA_GET_GANG(dva))
+ size = vdev_psize_to_asize(vd, SPA_GANGBLOCKSIZE);
+
+ mutex_enter(&msp->ms_lock);
+
+ if (now) {
+ space_map_remove(&msp->ms_allocmap[txg & TXG_MASK],
+ offset, size);
+ space_map_free(&msp->ms_map, offset, size);
+ } else {
+ if (msp->ms_freemap[txg & TXG_MASK].sm_space == 0)
+ vdev_dirty(vd, VDD_METASLAB, msp, txg);
+ space_map_add(&msp->ms_freemap[txg & TXG_MASK], offset, size);
+
+ /*
+ * verify that this region is actually allocated in
+ * either a ms_allocmap or the ms_map
+ */
+ if (msp->ms_map.sm_loaded) {
+ boolean_t allocd = B_FALSE;
+ int i;
+
+ if (!space_map_contains(&msp->ms_map, offset, size)) {
+ allocd = B_TRUE;
+ } else {
+ for (i = 0; i < TXG_CONCURRENT_STATES; i++) {
+ space_map_t *sm = &msp->ms_allocmap
+ [(txg - i) & TXG_MASK];
+ if (space_map_contains(sm,
+ offset, size)) {
+ allocd = B_TRUE;
+ break;
+ }
+ }
+ }
+
+ if (!allocd) {
+ zfs_panic_recover("freeing free segment "
+ "(vdev=%llu offset=%llx size=%llx)",
+ (longlong_t)vdev, (longlong_t)offset,
+ (longlong_t)size);
+ }
+ }
+
+
+ }
+
+ mutex_exit(&msp->ms_lock);
+}
+
+/*
+ * Intent log support: upon opening the pool after a crash, notify the SPA
+ * of blocks that the intent log has allocated for immediate write, but
+ * which are still considered free by the SPA because the last transaction
+ * group didn't commit yet.
+ */
+static int
+metaslab_claim_dva(spa_t *spa, const dva_t *dva, uint64_t txg)
+{
+ uint64_t vdev = DVA_GET_VDEV(dva);
+ uint64_t offset = DVA_GET_OFFSET(dva);
+ uint64_t size = DVA_GET_ASIZE(dva);
+ vdev_t *vd;
+ metaslab_t *msp;
+ int error;
+
+ ASSERT(DVA_IS_VALID(dva));
+
+ if ((vd = vdev_lookup_top(spa, vdev)) == NULL ||
+ (offset >> vd->vdev_ms_shift) >= vd->vdev_ms_count)
+ return (ENXIO);
+
+ msp = vd->vdev_ms[offset >> vd->vdev_ms_shift];
+
+ if (DVA_GET_GANG(dva))
+ size = vdev_psize_to_asize(vd, SPA_GANGBLOCKSIZE);
+
+ mutex_enter(&msp->ms_lock);
+
+ error = metaslab_activate(msp, METASLAB_WEIGHT_SECONDARY);
+ if (error) {
+ mutex_exit(&msp->ms_lock);
+ return (error);
+ }
+
+ if (msp->ms_allocmap[txg & TXG_MASK].sm_space == 0)
+ vdev_dirty(vd, VDD_METASLAB, msp, txg);
+
+ space_map_claim(&msp->ms_map, offset, size);
+ space_map_add(&msp->ms_allocmap[txg & TXG_MASK], offset, size);
+
+ mutex_exit(&msp->ms_lock);
+
+ return (0);
+}
+
+int
+metaslab_alloc(spa_t *spa, uint64_t psize, blkptr_t *bp, int ndvas,
+ uint64_t txg, blkptr_t *hintbp, boolean_t hintbp_avoid)
+{
+ dva_t *dva = bp->blk_dva;
+ dva_t *hintdva = hintbp->blk_dva;
+ int d;
+ int error = 0;
+
+ ASSERT(ndvas > 0 && ndvas <= spa_max_replication(spa));
+ ASSERT(BP_GET_NDVAS(bp) == 0);
+ ASSERT(hintbp == NULL || ndvas <= BP_GET_NDVAS(hintbp));
+
+ for (d = 0; d < ndvas; d++) {
+ error = metaslab_alloc_dva(spa, psize, dva, d, hintdva,
+ txg, hintbp_avoid);
+ if (error) {
+ for (d--; d >= 0; d--) {
+ metaslab_free_dva(spa, &dva[d], txg, B_TRUE);
+ bzero(&dva[d], sizeof (dva_t));
+ }
+ return (error);
+ }
+ }
+ ASSERT(error == 0);
+ ASSERT(BP_GET_NDVAS(bp) == ndvas);
+
+ return (0);
+}
+
+void
+metaslab_free(spa_t *spa, const blkptr_t *bp, uint64_t txg, boolean_t now)
+{
+ const dva_t *dva = bp->blk_dva;
+ int ndvas = BP_GET_NDVAS(bp);
+ int d;
+
+ ASSERT(!BP_IS_HOLE(bp));
+
+ for (d = 0; d < ndvas; d++)
+ metaslab_free_dva(spa, &dva[d], txg, now);
+}
+
+int
+metaslab_claim(spa_t *spa, const blkptr_t *bp, uint64_t txg)
+{
+ const dva_t *dva = bp->blk_dva;
+ int ndvas = BP_GET_NDVAS(bp);
+ int d, error;
+ int last_error = 0;
+
+ ASSERT(!BP_IS_HOLE(bp));
+
+ for (d = 0; d < ndvas; d++)
+ if ((error = metaslab_claim_dva(spa, &dva[d], txg)) != 0)
+ last_error = error;
+
+ return (last_error);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/refcount.c b/sys/contrib/opensolaris/uts/common/fs/zfs/refcount.c
new file mode 100644
index 0000000..411ed46
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/refcount.c
@@ -0,0 +1,194 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/refcount.h>
+
+#if defined(DEBUG) || !defined(_KERNEL)
+
+#ifdef _KERNEL
+int reference_tracking_enable = FALSE; /* runs out of memory too easily */
+#else
+int reference_tracking_enable = TRUE;
+#endif
+int reference_history = 4; /* tunable */
+
+static kmem_cache_t *reference_cache;
+static kmem_cache_t *reference_history_cache;
+
+void
+refcount_init(void)
+{
+ reference_cache = kmem_cache_create("reference_cache",
+ sizeof (reference_t), 0, NULL, NULL, NULL, NULL, NULL, 0);
+
+ reference_history_cache = kmem_cache_create("reference_history_cache",
+ sizeof (uint64_t), 0, NULL, NULL, NULL, NULL, NULL, 0);
+}
+
+void
+refcount_fini(void)
+{
+ kmem_cache_destroy(reference_cache);
+ kmem_cache_destroy(reference_history_cache);
+}
+
+void
+refcount_create(refcount_t *rc)
+{
+ list_create(&rc->rc_list, sizeof (reference_t),
+ offsetof(reference_t, ref_link));
+ list_create(&rc->rc_removed, sizeof (reference_t),
+ offsetof(reference_t, ref_link));
+ mutex_init(&rc->rc_mtx, NULL, MUTEX_DEFAULT, NULL);
+}
+
+void
+refcount_destroy_many(refcount_t *rc, uint64_t number)
+{
+ reference_t *ref;
+
+ ASSERT(rc->rc_count == number);
+ while (ref = list_head(&rc->rc_list)) {
+ list_remove(&rc->rc_list, ref);
+ kmem_cache_free(reference_cache, ref);
+ }
+ list_destroy(&rc->rc_list);
+
+ while (ref = list_head(&rc->rc_removed)) {
+ list_remove(&rc->rc_removed, ref);
+ kmem_cache_free(reference_history_cache, ref->ref_removed);
+ kmem_cache_free(reference_cache, ref);
+ }
+ list_destroy(&rc->rc_removed);
+ mutex_destroy(&rc->rc_mtx);
+}
+
+void
+refcount_destroy(refcount_t *rc)
+{
+ refcount_destroy_many(rc, 0);
+}
+
+int
+refcount_is_zero(refcount_t *rc)
+{
+ ASSERT(rc->rc_count >= 0);
+ return (rc->rc_count == 0);
+}
+
+int64_t
+refcount_count(refcount_t *rc)
+{
+ ASSERT(rc->rc_count >= 0);
+ return (rc->rc_count);
+}
+
+int64_t
+refcount_add_many(refcount_t *rc, uint64_t number, void *holder)
+{
+ reference_t *ref;
+ int64_t count;
+
+ if (reference_tracking_enable) {
+ ref = kmem_cache_alloc(reference_cache, KM_SLEEP);
+ ref->ref_holder = holder;
+ ref->ref_number = number;
+ }
+ mutex_enter(&rc->rc_mtx);
+ ASSERT(rc->rc_count >= 0);
+ if (reference_tracking_enable)
+ list_insert_head(&rc->rc_list, ref);
+ rc->rc_count += number;
+ count = rc->rc_count;
+ mutex_exit(&rc->rc_mtx);
+
+ return (count);
+}
+
+int64_t
+refcount_add(refcount_t *rc, void *holder)
+{
+ return (refcount_add_many(rc, 1, holder));
+}
+
+int64_t
+refcount_remove_many(refcount_t *rc, uint64_t number, void *holder)
+{
+ reference_t *ref;
+ int64_t count;
+
+ mutex_enter(&rc->rc_mtx);
+ ASSERT(rc->rc_count >= number);
+
+ if (!reference_tracking_enable) {
+ rc->rc_count -= number;
+ count = rc->rc_count;
+ mutex_exit(&rc->rc_mtx);
+ return (count);
+ }
+
+ for (ref = list_head(&rc->rc_list); ref;
+ ref = list_next(&rc->rc_list, ref)) {
+ if (ref->ref_holder == holder && ref->ref_number == number) {
+ list_remove(&rc->rc_list, ref);
+ if (reference_history > 0) {
+ ref->ref_removed =
+ kmem_cache_alloc(reference_history_cache,
+ KM_SLEEP);
+ list_insert_head(&rc->rc_removed, ref);
+ rc->rc_removed_count++;
+ if (rc->rc_removed_count >= reference_history) {
+ ref = list_tail(&rc->rc_removed);
+ list_remove(&rc->rc_removed, ref);
+ kmem_cache_free(reference_history_cache,
+ ref->ref_removed);
+ kmem_cache_free(reference_cache, ref);
+ rc->rc_removed_count--;
+ }
+ } else {
+ kmem_cache_free(reference_cache, ref);
+ }
+ rc->rc_count -= number;
+ count = rc->rc_count;
+ mutex_exit(&rc->rc_mtx);
+ return (count);
+ }
+ }
+ panic("No such hold %p on refcount %llx", holder,
+ (u_longlong_t)(uintptr_t)rc);
+ return (-1);
+}
+
+int64_t
+refcount_remove(refcount_t *rc, void *holder)
+{
+ return (refcount_remove_many(rc, 1, holder));
+}
+
+#endif
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sha256.c b/sys/contrib/opensolaris/uts/common/fs/zfs/sha256.c
new file mode 100644
index 0000000..ce5c261
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sha256.c
@@ -0,0 +1,131 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/zio.h>
+#include <sys/zio_checksum.h>
+
+/*
+ * SHA-256 checksum, as specified in FIPS 180-2, available at:
+ * http://csrc.nist.gov/cryptval
+ *
+ * This is a very compact implementation of SHA-256.
+ * It is designed to be simple and portable, not to be fast.
+ */
+
+/*
+ * The literal definitions according to FIPS180-2 would be:
+ *
+ * Ch(x, y, z) (((x) & (y)) ^ ((~(x)) & (z)))
+ * Maj(x, y, z) (((x) & (y)) | ((x) & (z)) | ((y) & (z)))
+ *
+ * We use logical equivalents which require one less op.
+ */
+#define Ch(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))
+#define Maj(x, y, z) (((x) & (y)) ^ ((z) & ((x) ^ (y))))
+#define Rot32(x, s) (((x) >> s) | ((x) << (32 - s)))
+#define SIGMA0(x) (Rot32(x, 2) ^ Rot32(x, 13) ^ Rot32(x, 22))
+#define SIGMA1(x) (Rot32(x, 6) ^ Rot32(x, 11) ^ Rot32(x, 25))
+#define sigma0(x) (Rot32(x, 7) ^ Rot32(x, 18) ^ ((x) >> 3))
+#define sigma1(x) (Rot32(x, 17) ^ Rot32(x, 19) ^ ((x) >> 10))
+
+static const uint32_t SHA256_K[64] = {
+ 0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5,
+ 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+ 0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3,
+ 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+ 0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc,
+ 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+ 0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7,
+ 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+ 0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13,
+ 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+ 0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3,
+ 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+ 0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5,
+ 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+ 0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208,
+ 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+};
+
+static void
+SHA256Transform(uint32_t *H, const uint8_t *cp)
+{
+ uint32_t a, b, c, d, e, f, g, h, t, T1, T2, W[64];
+
+ for (t = 0; t < 16; t++, cp += 4)
+ W[t] = (cp[0] << 24) | (cp[1] << 16) | (cp[2] << 8) | cp[3];
+
+ for (t = 16; t < 64; t++)
+ W[t] = sigma1(W[t - 2]) + W[t - 7] +
+ sigma0(W[t - 15]) + W[t - 16];
+
+ a = H[0]; b = H[1]; c = H[2]; d = H[3];
+ e = H[4]; f = H[5]; g = H[6]; h = H[7];
+
+ for (t = 0; t < 64; t++) {
+ T1 = h + SIGMA1(e) + Ch(e, f, g) + SHA256_K[t] + W[t];
+ T2 = SIGMA0(a) + Maj(a, b, c);
+ h = g; g = f; f = e; e = d + T1;
+ d = c; c = b; b = a; a = T1 + T2;
+ }
+
+ H[0] += a; H[1] += b; H[2] += c; H[3] += d;
+ H[4] += e; H[5] += f; H[6] += g; H[7] += h;
+}
+
+void
+zio_checksum_SHA256(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ uint32_t H[8] = { 0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,
+ 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19 };
+ uint8_t pad[128];
+ int padsize = size & 63;
+ int i;
+
+ for (i = 0; i < size - padsize; i += 64)
+ SHA256Transform(H, (uint8_t *)buf + i);
+
+ for (i = 0; i < padsize; i++)
+ pad[i] = ((uint8_t *)buf)[i];
+
+ for (pad[padsize++] = 0x80; (padsize & 63) != 56; padsize++)
+ pad[padsize] = 0;
+
+ for (i = 0; i < 8; i++)
+ pad[padsize++] = (size << 3) >> (56 - 8 * i);
+
+ for (i = 0; i < padsize; i += 64)
+ SHA256Transform(H, pad + i);
+
+ ZIO_SET_CHECKSUM(zcp,
+ (uint64_t)H[0] << 32 | H[1],
+ (uint64_t)H[2] << 32 | H[3],
+ (uint64_t)H[4] << 32 | H[5],
+ (uint64_t)H[6] << 32 | H[7]);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/spa.c b/sys/contrib/opensolaris/uts/common/fs/zfs/spa.c
new file mode 100644
index 0000000..6a7c525
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/spa.c
@@ -0,0 +1,3301 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * This file contains all the routines used when modifying on-disk SPA state.
+ * This includes opening, importing, destroying, exporting a pool, and syncing a
+ * pool.
+ */
+
+#include <sys/zfs_context.h>
+#include <sys/fm/fs/zfs.h>
+#include <sys/spa_impl.h>
+#include <sys/zio.h>
+#include <sys/zio_checksum.h>
+#include <sys/zio_compress.h>
+#include <sys/dmu.h>
+#include <sys/dmu_tx.h>
+#include <sys/zap.h>
+#include <sys/zil.h>
+#include <sys/vdev_impl.h>
+#include <sys/metaslab.h>
+#include <sys/uberblock_impl.h>
+#include <sys/txg.h>
+#include <sys/avl.h>
+#include <sys/dmu_traverse.h>
+#include <sys/dmu_objset.h>
+#include <sys/unique.h>
+#include <sys/dsl_pool.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_prop.h>
+#include <sys/dsl_synctask.h>
+#include <sys/fs/zfs.h>
+#include <sys/callb.h>
+#include <sys/sunddi.h>
+
+int zio_taskq_threads = 0;
+SYSCTL_DECL(_vfs_zfs);
+SYSCTL_NODE(_vfs_zfs, OID_AUTO, zio, CTLFLAG_RW, 0, "ZFS ZIO");
+TUNABLE_INT("vfs.zfs.zio.taskq_threads", &zio_taskq_threads);
+SYSCTL_INT(_vfs_zfs_zio, OID_AUTO, taskq_threads, CTLFLAG_RW,
+ &zio_taskq_threads, 0, "Number of ZIO threads per ZIO type");
+
+
+/*
+ * ==========================================================================
+ * SPA state manipulation (open/create/destroy/import/export)
+ * ==========================================================================
+ */
+
+static int
+spa_error_entry_compare(const void *a, const void *b)
+{
+ spa_error_entry_t *sa = (spa_error_entry_t *)a;
+ spa_error_entry_t *sb = (spa_error_entry_t *)b;
+ int ret;
+
+ ret = bcmp(&sa->se_bookmark, &sb->se_bookmark,
+ sizeof (zbookmark_t));
+
+ if (ret < 0)
+ return (-1);
+ else if (ret > 0)
+ return (1);
+ else
+ return (0);
+}
+
+/*
+ * Utility function which retrieves copies of the current logs and
+ * re-initializes them in the process.
+ */
+void
+spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub)
+{
+ ASSERT(MUTEX_HELD(&spa->spa_errlist_lock));
+
+ bcopy(&spa->spa_errlist_last, last, sizeof (avl_tree_t));
+ bcopy(&spa->spa_errlist_scrub, scrub, sizeof (avl_tree_t));
+
+ avl_create(&spa->spa_errlist_scrub,
+ spa_error_entry_compare, sizeof (spa_error_entry_t),
+ offsetof(spa_error_entry_t, se_avl));
+ avl_create(&spa->spa_errlist_last,
+ spa_error_entry_compare, sizeof (spa_error_entry_t),
+ offsetof(spa_error_entry_t, se_avl));
+}
+
+/*
+ * Activate an uninitialized pool.
+ */
+static void
+spa_activate(spa_t *spa)
+{
+ int t;
+ int nthreads = zio_taskq_threads;
+ char name[32];
+
+ ASSERT(spa->spa_state == POOL_STATE_UNINITIALIZED);
+
+ spa->spa_state = POOL_STATE_ACTIVE;
+
+ spa->spa_normal_class = metaslab_class_create();
+
+ if (nthreads == 0)
+ nthreads = max_ncpus;
+ for (t = 0; t < ZIO_TYPES; t++) {
+ snprintf(name, sizeof(name), "spa_zio_issue %d", t);
+ spa->spa_zio_issue_taskq[t] = taskq_create(name, nthreads,
+ maxclsyspri, 50, INT_MAX, TASKQ_PREPOPULATE);
+ snprintf(name, sizeof(name), "spa_zio_intr %d", t);
+ spa->spa_zio_intr_taskq[t] = taskq_create(name, nthreads,
+ maxclsyspri, 50, INT_MAX, TASKQ_PREPOPULATE);
+ }
+
+ rw_init(&spa->spa_traverse_lock, NULL, RW_DEFAULT, NULL);
+
+ mutex_init(&spa->spa_uberblock_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&spa->spa_errlog_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&spa->spa_errlist_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&spa->spa_config_lock.scl_lock, NULL, MUTEX_DEFAULT, NULL);
+ cv_init(&spa->spa_config_lock.scl_cv, NULL, CV_DEFAULT, NULL);
+ mutex_init(&spa->spa_sync_bplist.bpl_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&spa->spa_history_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&spa->spa_props_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ list_create(&spa->spa_dirty_list, sizeof (vdev_t),
+ offsetof(vdev_t, vdev_dirty_node));
+
+ txg_list_create(&spa->spa_vdev_txg_list,
+ offsetof(struct vdev, vdev_txg_node));
+
+ avl_create(&spa->spa_errlist_scrub,
+ spa_error_entry_compare, sizeof (spa_error_entry_t),
+ offsetof(spa_error_entry_t, se_avl));
+ avl_create(&spa->spa_errlist_last,
+ spa_error_entry_compare, sizeof (spa_error_entry_t),
+ offsetof(spa_error_entry_t, se_avl));
+}
+
+/*
+ * Opposite of spa_activate().
+ */
+static void
+spa_deactivate(spa_t *spa)
+{
+ int t;
+
+ ASSERT(spa->spa_sync_on == B_FALSE);
+ ASSERT(spa->spa_dsl_pool == NULL);
+ ASSERT(spa->spa_root_vdev == NULL);
+
+ ASSERT(spa->spa_state != POOL_STATE_UNINITIALIZED);
+
+ txg_list_destroy(&spa->spa_vdev_txg_list);
+
+ list_destroy(&spa->spa_dirty_list);
+
+ for (t = 0; t < ZIO_TYPES; t++) {
+ taskq_destroy(spa->spa_zio_issue_taskq[t]);
+ taskq_destroy(spa->spa_zio_intr_taskq[t]);
+ spa->spa_zio_issue_taskq[t] = NULL;
+ spa->spa_zio_intr_taskq[t] = NULL;
+ }
+
+ metaslab_class_destroy(spa->spa_normal_class);
+ spa->spa_normal_class = NULL;
+
+ /*
+ * If this was part of an import or the open otherwise failed, we may
+ * still have errors left in the queues. Empty them just in case.
+ */
+ spa_errlog_drain(spa);
+
+ avl_destroy(&spa->spa_errlist_scrub);
+ avl_destroy(&spa->spa_errlist_last);
+
+ rw_destroy(&spa->spa_traverse_lock);
+ mutex_destroy(&spa->spa_uberblock_lock);
+ mutex_destroy(&spa->spa_errlog_lock);
+ mutex_destroy(&spa->spa_errlist_lock);
+ mutex_destroy(&spa->spa_config_lock.scl_lock);
+ cv_destroy(&spa->spa_config_lock.scl_cv);
+ mutex_destroy(&spa->spa_sync_bplist.bpl_lock);
+ mutex_destroy(&spa->spa_history_lock);
+ mutex_destroy(&spa->spa_props_lock);
+
+ spa->spa_state = POOL_STATE_UNINITIALIZED;
+}
+
+/*
+ * Verify a pool configuration, and construct the vdev tree appropriately. This
+ * will create all the necessary vdevs in the appropriate layout, with each vdev
+ * in the CLOSED state. This will prep the pool before open/creation/import.
+ * All vdev validation is done by the vdev_alloc() routine.
+ */
+static int
+spa_config_parse(spa_t *spa, vdev_t **vdp, nvlist_t *nv, vdev_t *parent,
+ uint_t id, int atype)
+{
+ nvlist_t **child;
+ uint_t c, children;
+ int error;
+
+ if ((error = vdev_alloc(spa, vdp, nv, parent, id, atype)) != 0)
+ return (error);
+
+ if ((*vdp)->vdev_ops->vdev_op_leaf)
+ return (0);
+
+ if (nvlist_lookup_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
+ &child, &children) != 0) {
+ vdev_free(*vdp);
+ *vdp = NULL;
+ return (EINVAL);
+ }
+
+ for (c = 0; c < children; c++) {
+ vdev_t *vd;
+ if ((error = spa_config_parse(spa, &vd, child[c], *vdp, c,
+ atype)) != 0) {
+ vdev_free(*vdp);
+ *vdp = NULL;
+ return (error);
+ }
+ }
+
+ ASSERT(*vdp != NULL);
+
+ return (0);
+}
+
+/*
+ * Opposite of spa_load().
+ */
+static void
+spa_unload(spa_t *spa)
+{
+ int i;
+
+ /*
+ * Stop async tasks.
+ */
+ spa_async_suspend(spa);
+
+ /*
+ * Stop syncing.
+ */
+ if (spa->spa_sync_on) {
+ txg_sync_stop(spa->spa_dsl_pool);
+ spa->spa_sync_on = B_FALSE;
+ }
+
+ /*
+ * Wait for any outstanding prefetch I/O to complete.
+ */
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ spa_config_exit(spa, FTAG);
+
+ /*
+ * Close the dsl pool.
+ */
+ if (spa->spa_dsl_pool) {
+ dsl_pool_close(spa->spa_dsl_pool);
+ spa->spa_dsl_pool = NULL;
+ }
+
+ /*
+ * Close all vdevs.
+ */
+ if (spa->spa_root_vdev)
+ vdev_free(spa->spa_root_vdev);
+ ASSERT(spa->spa_root_vdev == NULL);
+
+ for (i = 0; i < spa->spa_nspares; i++)
+ vdev_free(spa->spa_spares[i]);
+ if (spa->spa_spares) {
+ kmem_free(spa->spa_spares, spa->spa_nspares * sizeof (void *));
+ spa->spa_spares = NULL;
+ }
+ if (spa->spa_sparelist) {
+ nvlist_free(spa->spa_sparelist);
+ spa->spa_sparelist = NULL;
+ }
+
+ spa->spa_async_suspended = 0;
+}
+
+/*
+ * Load (or re-load) the current list of vdevs describing the active spares for
+ * this pool. When this is called, we have some form of basic information in
+ * 'spa_sparelist'. We parse this into vdevs, try to open them, and then
+ * re-generate a more complete list including status information.
+ */
+static void
+spa_load_spares(spa_t *spa)
+{
+ nvlist_t **spares;
+ uint_t nspares;
+ int i;
+ vdev_t *vd, *tvd;
+
+ /*
+ * First, close and free any existing spare vdevs.
+ */
+ for (i = 0; i < spa->spa_nspares; i++) {
+ vd = spa->spa_spares[i];
+
+ /* Undo the call to spa_activate() below */
+ if ((tvd = spa_lookup_by_guid(spa, vd->vdev_guid)) != NULL &&
+ tvd->vdev_isspare)
+ spa_spare_remove(tvd);
+ vdev_close(vd);
+ vdev_free(vd);
+ }
+
+ if (spa->spa_spares)
+ kmem_free(spa->spa_spares, spa->spa_nspares * sizeof (void *));
+
+ if (spa->spa_sparelist == NULL)
+ nspares = 0;
+ else
+ VERIFY(nvlist_lookup_nvlist_array(spa->spa_sparelist,
+ ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
+
+ spa->spa_nspares = (int)nspares;
+ spa->spa_spares = NULL;
+
+ if (nspares == 0)
+ return;
+
+ /*
+ * Construct the array of vdevs, opening them to get status in the
+ * process. For each spare, there is potentially two different vdev_t
+ * structures associated with it: one in the list of spares (used only
+ * for basic validation purposes) and one in the active vdev
+ * configuration (if it's spared in). During this phase we open and
+ * validate each vdev on the spare list. If the vdev also exists in the
+ * active configuration, then we also mark this vdev as an active spare.
+ */
+ spa->spa_spares = kmem_alloc(nspares * sizeof (void *), KM_SLEEP);
+ for (i = 0; i < spa->spa_nspares; i++) {
+ VERIFY(spa_config_parse(spa, &vd, spares[i], NULL, 0,
+ VDEV_ALLOC_SPARE) == 0);
+ ASSERT(vd != NULL);
+
+ spa->spa_spares[i] = vd;
+
+ if ((tvd = spa_lookup_by_guid(spa, vd->vdev_guid)) != NULL) {
+ if (!tvd->vdev_isspare)
+ spa_spare_add(tvd);
+
+ /*
+ * We only mark the spare active if we were successfully
+ * able to load the vdev. Otherwise, importing a pool
+ * with a bad active spare would result in strange
+ * behavior, because multiple pool would think the spare
+ * is actively in use.
+ *
+ * There is a vulnerability here to an equally bizarre
+ * circumstance, where a dead active spare is later
+ * brought back to life (onlined or otherwise). Given
+ * the rarity of this scenario, and the extra complexity
+ * it adds, we ignore the possibility.
+ */
+ if (!vdev_is_dead(tvd))
+ spa_spare_activate(tvd);
+ }
+
+ if (vdev_open(vd) != 0)
+ continue;
+
+ vd->vdev_top = vd;
+ (void) vdev_validate_spare(vd);
+ }
+
+ /*
+ * Recompute the stashed list of spares, with status information
+ * this time.
+ */
+ VERIFY(nvlist_remove(spa->spa_sparelist, ZPOOL_CONFIG_SPARES,
+ DATA_TYPE_NVLIST_ARRAY) == 0);
+
+ spares = kmem_alloc(spa->spa_nspares * sizeof (void *), KM_SLEEP);
+ for (i = 0; i < spa->spa_nspares; i++)
+ spares[i] = vdev_config_generate(spa, spa->spa_spares[i],
+ B_TRUE, B_TRUE);
+ VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist, ZPOOL_CONFIG_SPARES,
+ spares, spa->spa_nspares) == 0);
+ for (i = 0; i < spa->spa_nspares; i++)
+ nvlist_free(spares[i]);
+ kmem_free(spares, spa->spa_nspares * sizeof (void *));
+}
+
+static int
+load_nvlist(spa_t *spa, uint64_t obj, nvlist_t **value)
+{
+ dmu_buf_t *db;
+ char *packed = NULL;
+ size_t nvsize = 0;
+ int error;
+ *value = NULL;
+
+ VERIFY(0 == dmu_bonus_hold(spa->spa_meta_objset, obj, FTAG, &db));
+ nvsize = *(uint64_t *)db->db_data;
+ dmu_buf_rele(db, FTAG);
+
+ packed = kmem_alloc(nvsize, KM_SLEEP);
+ error = dmu_read(spa->spa_meta_objset, obj, 0, nvsize, packed);
+ if (error == 0)
+ error = nvlist_unpack(packed, nvsize, value, 0);
+ kmem_free(packed, nvsize);
+
+ return (error);
+}
+
+/*
+ * Load an existing storage pool, using the pool's builtin spa_config as a
+ * source of configuration information.
+ */
+static int
+spa_load(spa_t *spa, nvlist_t *config, spa_load_state_t state, int mosconfig)
+{
+ int error = 0;
+ nvlist_t *nvroot = NULL;
+ vdev_t *rvd;
+ uberblock_t *ub = &spa->spa_uberblock;
+ uint64_t config_cache_txg = spa->spa_config_txg;
+ uint64_t pool_guid;
+ uint64_t version;
+ zio_t *zio;
+
+ spa->spa_load_state = state;
+
+ if (nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, &nvroot) ||
+ nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &pool_guid)) {
+ error = EINVAL;
+ goto out;
+ }
+
+ /*
+ * Versioning wasn't explicitly added to the label until later, so if
+ * it's not present treat it as the initial version.
+ */
+ if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_VERSION, &version) != 0)
+ version = ZFS_VERSION_INITIAL;
+
+ (void) nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_TXG,
+ &spa->spa_config_txg);
+
+ if ((state == SPA_LOAD_IMPORT || state == SPA_LOAD_TRYIMPORT) &&
+ spa_guid_exists(pool_guid, 0)) {
+ error = EEXIST;
+ goto out;
+ }
+
+ spa->spa_load_guid = pool_guid;
+
+ /*
+ * Parse the configuration into a vdev tree. We explicitly set the
+ * value that will be returned by spa_version() since parsing the
+ * configuration requires knowing the version number.
+ */
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ spa->spa_ubsync.ub_version = version;
+ error = spa_config_parse(spa, &rvd, nvroot, NULL, 0, VDEV_ALLOC_LOAD);
+ spa_config_exit(spa, FTAG);
+
+ if (error != 0)
+ goto out;
+
+ ASSERT(spa->spa_root_vdev == rvd);
+ ASSERT(spa_guid(spa) == pool_guid);
+
+ /*
+ * Try to open all vdevs, loading each label in the process.
+ */
+ error = vdev_open(rvd);
+ if (error != 0)
+ goto out;
+
+ /*
+ * Validate the labels for all leaf vdevs. We need to grab the config
+ * lock because all label I/O is done with the ZIO_FLAG_CONFIG_HELD
+ * flag.
+ */
+ spa_config_enter(spa, RW_READER, FTAG);
+ error = vdev_validate(rvd);
+ spa_config_exit(spa, FTAG);
+
+ if (error != 0)
+ goto out;
+
+ if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) {
+ error = ENXIO;
+ goto out;
+ }
+
+ /*
+ * Find the best uberblock.
+ */
+ bzero(ub, sizeof (uberblock_t));
+
+ zio = zio_root(spa, NULL, NULL,
+ ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE);
+ vdev_uberblock_load(zio, rvd, ub);
+ error = zio_wait(zio);
+
+ /*
+ * If we weren't able to find a single valid uberblock, return failure.
+ */
+ if (ub->ub_txg == 0) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = ENXIO;
+ goto out;
+ }
+
+ /*
+ * If the pool is newer than the code, we can't open it.
+ */
+ if (ub->ub_version > ZFS_VERSION) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_VERSION_NEWER);
+ error = ENOTSUP;
+ goto out;
+ }
+
+ /*
+ * If the vdev guid sum doesn't match the uberblock, we have an
+ * incomplete configuration.
+ */
+ if (rvd->vdev_guid_sum != ub->ub_guid_sum && mosconfig) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_BAD_GUID_SUM);
+ error = ENXIO;
+ goto out;
+ }
+
+ /*
+ * Initialize internal SPA structures.
+ */
+ spa->spa_state = POOL_STATE_ACTIVE;
+ spa->spa_ubsync = spa->spa_uberblock;
+ spa->spa_first_txg = spa_last_synced_txg(spa) + 1;
+ error = dsl_pool_open(spa, spa->spa_first_txg, &spa->spa_dsl_pool);
+ if (error) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ goto out;
+ }
+ spa->spa_meta_objset = spa->spa_dsl_pool->dp_meta_objset;
+
+ if (zap_lookup(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_CONFIG,
+ sizeof (uint64_t), 1, &spa->spa_config_object) != 0) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+
+ if (!mosconfig) {
+ nvlist_t *newconfig;
+ uint64_t hostid;
+
+ if (load_nvlist(spa, spa->spa_config_object, &newconfig) != 0) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+
+ /*
+ * hostid is set after the root file system is mounted, so
+ * ignore the check until it's done.
+ */
+ if (nvlist_lookup_uint64(newconfig, ZPOOL_CONFIG_HOSTID,
+ &hostid) == 0 && root_mounted()) {
+ char *hostname;
+ unsigned long myhostid = 0;
+
+ VERIFY(nvlist_lookup_string(newconfig,
+ ZPOOL_CONFIG_HOSTNAME, &hostname) == 0);
+
+ (void) ddi_strtoul(hw_serial, NULL, 10, &myhostid);
+ if ((unsigned long)hostid != myhostid) {
+ cmn_err(CE_WARN, "pool '%s' could not be "
+ "loaded as it was last accessed by "
+ "another system (host: %s hostid: 0x%lx). "
+ "See: http://www.sun.com/msg/ZFS-8000-EY",
+ spa->spa_name, hostname,
+ (unsigned long)hostid);
+ error = EBADF;
+ goto out;
+ }
+ }
+
+ spa_config_set(spa, newconfig);
+ spa_unload(spa);
+ spa_deactivate(spa);
+ spa_activate(spa);
+
+ return (spa_load(spa, newconfig, state, B_TRUE));
+ }
+
+ if (zap_lookup(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_SYNC_BPLIST,
+ sizeof (uint64_t), 1, &spa->spa_sync_bplist_obj) != 0) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+
+ /*
+ * Load the bit that tells us to use the new accounting function
+ * (raid-z deflation). If we have an older pool, this will not
+ * be present.
+ */
+ error = zap_lookup(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE,
+ sizeof (uint64_t), 1, &spa->spa_deflate);
+ if (error != 0 && error != ENOENT) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+
+ /*
+ * Load the persistent error log. If we have an older pool, this will
+ * not be present.
+ */
+ error = zap_lookup(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_ERRLOG_LAST,
+ sizeof (uint64_t), 1, &spa->spa_errlog_last);
+ if (error != 0 && error != ENOENT) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+
+ error = zap_lookup(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_ERRLOG_SCRUB,
+ sizeof (uint64_t), 1, &spa->spa_errlog_scrub);
+ if (error != 0 && error != ENOENT) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+
+ /*
+ * Load the history object. If we have an older pool, this
+ * will not be present.
+ */
+ error = zap_lookup(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_HISTORY,
+ sizeof (uint64_t), 1, &spa->spa_history);
+ if (error != 0 && error != ENOENT) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+
+ /*
+ * Load any hot spares for this pool.
+ */
+ error = zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_POOL_SPARES, sizeof (uint64_t), 1, &spa->spa_spares_object);
+ if (error != 0 && error != ENOENT) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+ if (error == 0) {
+ ASSERT(spa_version(spa) >= ZFS_VERSION_SPARES);
+ if (load_nvlist(spa, spa->spa_spares_object,
+ &spa->spa_sparelist) != 0) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ spa_load_spares(spa);
+ spa_config_exit(spa, FTAG);
+ }
+
+ error = zap_lookup(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_POOL_PROPS, sizeof (uint64_t), 1, &spa->spa_pool_props_object);
+
+ if (error && error != ENOENT) {
+ vdev_set_state(rvd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ error = EIO;
+ goto out;
+ }
+
+ if (error == 0) {
+ (void) zap_lookup(spa->spa_meta_objset,
+ spa->spa_pool_props_object,
+ zpool_prop_to_name(ZFS_PROP_BOOTFS),
+ sizeof (uint64_t), 1, &spa->spa_bootfs);
+ }
+
+ /*
+ * Load the vdev state for all toplevel vdevs.
+ */
+ vdev_load(rvd);
+
+ /*
+ * Propagate the leaf DTLs we just loaded all the way up the tree.
+ */
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ vdev_dtl_reassess(rvd, 0, 0, B_FALSE);
+ spa_config_exit(spa, FTAG);
+
+ /*
+ * Check the state of the root vdev. If it can't be opened, it
+ * indicates one or more toplevel vdevs are faulted.
+ */
+ if (rvd->vdev_state <= VDEV_STATE_CANT_OPEN) {
+ error = ENXIO;
+ goto out;
+ }
+
+ if ((spa_mode & FWRITE) && state != SPA_LOAD_TRYIMPORT) {
+ dmu_tx_t *tx;
+ int need_update = B_FALSE;
+ int c;
+
+ /*
+ * Claim log blocks that haven't been committed yet.
+ * This must all happen in a single txg.
+ */
+ tx = dmu_tx_create_assigned(spa_get_dsl(spa),
+ spa_first_txg(spa));
+ (void) dmu_objset_find(spa->spa_name,
+ zil_claim, tx, DS_FIND_CHILDREN);
+ dmu_tx_commit(tx);
+
+ spa->spa_sync_on = B_TRUE;
+ txg_sync_start(spa->spa_dsl_pool);
+
+ /*
+ * Wait for all claims to sync.
+ */
+ txg_wait_synced(spa->spa_dsl_pool, 0);
+
+ /*
+ * If the config cache is stale, or we have uninitialized
+ * metaslabs (see spa_vdev_add()), then update the config.
+ */
+ if (config_cache_txg != spa->spa_config_txg ||
+ state == SPA_LOAD_IMPORT)
+ need_update = B_TRUE;
+
+ for (c = 0; c < rvd->vdev_children; c++)
+ if (rvd->vdev_child[c]->vdev_ms_array == 0)
+ need_update = B_TRUE;
+
+ /*
+ * Update the config cache asychronously in case we're the
+ * root pool, in which case the config cache isn't writable yet.
+ */
+ if (need_update)
+ spa_async_request(spa, SPA_ASYNC_CONFIG_UPDATE);
+ }
+
+ error = 0;
+out:
+ if (error && error != EBADF)
+ zfs_ereport_post(FM_EREPORT_ZFS_POOL, spa, NULL, NULL, 0, 0);
+ spa->spa_load_state = SPA_LOAD_NONE;
+ spa->spa_ena = 0;
+
+ return (error);
+}
+
+/*
+ * Pool Open/Import
+ *
+ * The import case is identical to an open except that the configuration is sent
+ * down from userland, instead of grabbed from the configuration cache. For the
+ * case of an open, the pool configuration will exist in the
+ * POOL_STATE_UNITIALIZED state.
+ *
+ * The stats information (gen/count/ustats) is used to gather vdev statistics at
+ * the same time open the pool, without having to keep around the spa_t in some
+ * ambiguous state.
+ */
+static int
+spa_open_common(const char *pool, spa_t **spapp, void *tag, nvlist_t **config)
+{
+ spa_t *spa;
+ int error;
+ int loaded = B_FALSE;
+ int locked = B_FALSE;
+
+ *spapp = NULL;
+
+ /*
+ * As disgusting as this is, we need to support recursive calls to this
+ * function because dsl_dir_open() is called during spa_load(), and ends
+ * up calling spa_open() again. The real fix is to figure out how to
+ * avoid dsl_dir_open() calling this in the first place.
+ */
+ if (mutex_owner(&spa_namespace_lock) != curthread) {
+ mutex_enter(&spa_namespace_lock);
+ locked = B_TRUE;
+ }
+
+ if ((spa = spa_lookup(pool)) == NULL) {
+ if (locked)
+ mutex_exit(&spa_namespace_lock);
+ return (ENOENT);
+ }
+ if (spa->spa_state == POOL_STATE_UNINITIALIZED) {
+
+ spa_activate(spa);
+
+ error = spa_load(spa, spa->spa_config, SPA_LOAD_OPEN, B_FALSE);
+
+ if (error == EBADF) {
+ /*
+ * If vdev_validate() returns failure (indicated by
+ * EBADF), it indicates that one of the vdevs indicates
+ * that the pool has been exported or destroyed. If
+ * this is the case, the config cache is out of sync and
+ * we should remove the pool from the namespace.
+ */
+ zfs_post_ok(spa, NULL);
+ spa_unload(spa);
+ spa_deactivate(spa);
+ spa_remove(spa);
+ spa_config_sync();
+ if (locked)
+ mutex_exit(&spa_namespace_lock);
+ return (ENOENT);
+ }
+
+ if (error) {
+ /*
+ * We can't open the pool, but we still have useful
+ * information: the state of each vdev after the
+ * attempted vdev_open(). Return this to the user.
+ */
+ if (config != NULL && spa->spa_root_vdev != NULL) {
+ spa_config_enter(spa, RW_READER, FTAG);
+ *config = spa_config_generate(spa, NULL, -1ULL,
+ B_TRUE);
+ spa_config_exit(spa, FTAG);
+ }
+ spa_unload(spa);
+ spa_deactivate(spa);
+ spa->spa_last_open_failed = B_TRUE;
+ if (locked)
+ mutex_exit(&spa_namespace_lock);
+ *spapp = NULL;
+ return (error);
+ } else {
+ zfs_post_ok(spa, NULL);
+ spa->spa_last_open_failed = B_FALSE;
+ }
+
+ loaded = B_TRUE;
+ }
+
+ spa_open_ref(spa, tag);
+ if (locked)
+ mutex_exit(&spa_namespace_lock);
+
+ *spapp = spa;
+
+ if (config != NULL) {
+ spa_config_enter(spa, RW_READER, FTAG);
+ *config = spa_config_generate(spa, NULL, -1ULL, B_TRUE);
+ spa_config_exit(spa, FTAG);
+ }
+
+ /*
+ * If we just loaded the pool, resilver anything that's out of date.
+ */
+ if (loaded && (spa_mode & FWRITE))
+ VERIFY(spa_scrub(spa, POOL_SCRUB_RESILVER, B_TRUE) == 0);
+
+ return (0);
+}
+
+int
+spa_open(const char *name, spa_t **spapp, void *tag)
+{
+ return (spa_open_common(name, spapp, tag, NULL));
+}
+
+/*
+ * Lookup the given spa_t, incrementing the inject count in the process,
+ * preventing it from being exported or destroyed.
+ */
+spa_t *
+spa_inject_addref(char *name)
+{
+ spa_t *spa;
+
+ mutex_enter(&spa_namespace_lock);
+ if ((spa = spa_lookup(name)) == NULL) {
+ mutex_exit(&spa_namespace_lock);
+ return (NULL);
+ }
+ spa->spa_inject_ref++;
+ mutex_exit(&spa_namespace_lock);
+
+ return (spa);
+}
+
+void
+spa_inject_delref(spa_t *spa)
+{
+ mutex_enter(&spa_namespace_lock);
+ spa->spa_inject_ref--;
+ mutex_exit(&spa_namespace_lock);
+}
+
+static void
+spa_add_spares(spa_t *spa, nvlist_t *config)
+{
+ nvlist_t **spares;
+ uint_t i, nspares;
+ nvlist_t *nvroot;
+ uint64_t guid;
+ vdev_stat_t *vs;
+ uint_t vsc;
+ uint64_t pool;
+
+ if (spa->spa_nspares == 0)
+ return;
+
+ VERIFY(nvlist_lookup_nvlist(config,
+ ZPOOL_CONFIG_VDEV_TREE, &nvroot) == 0);
+ VERIFY(nvlist_lookup_nvlist_array(spa->spa_sparelist,
+ ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
+ if (nspares != 0) {
+ VERIFY(nvlist_add_nvlist_array(nvroot,
+ ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
+ VERIFY(nvlist_lookup_nvlist_array(nvroot,
+ ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
+
+ /*
+ * Go through and find any spares which have since been
+ * repurposed as an active spare. If this is the case, update
+ * their status appropriately.
+ */
+ for (i = 0; i < nspares; i++) {
+ VERIFY(nvlist_lookup_uint64(spares[i],
+ ZPOOL_CONFIG_GUID, &guid) == 0);
+ if (spa_spare_exists(guid, &pool) && pool != 0ULL) {
+ VERIFY(nvlist_lookup_uint64_array(
+ spares[i], ZPOOL_CONFIG_STATS,
+ (uint64_t **)&vs, &vsc) == 0);
+ vs->vs_state = VDEV_STATE_CANT_OPEN;
+ vs->vs_aux = VDEV_AUX_SPARED;
+ }
+ }
+ }
+}
+
+int
+spa_get_stats(const char *name, nvlist_t **config, char *altroot, size_t buflen)
+{
+ int error;
+ spa_t *spa;
+
+ *config = NULL;
+ error = spa_open_common(name, &spa, FTAG, config);
+
+ if (spa && *config != NULL) {
+ VERIFY(nvlist_add_uint64(*config, ZPOOL_CONFIG_ERRCOUNT,
+ spa_get_errlog_size(spa)) == 0);
+
+ spa_add_spares(spa, *config);
+ }
+
+ /*
+ * We want to get the alternate root even for faulted pools, so we cheat
+ * and call spa_lookup() directly.
+ */
+ if (altroot) {
+ if (spa == NULL) {
+ mutex_enter(&spa_namespace_lock);
+ spa = spa_lookup(name);
+ if (spa)
+ spa_altroot(spa, altroot, buflen);
+ else
+ altroot[0] = '\0';
+ spa = NULL;
+ mutex_exit(&spa_namespace_lock);
+ } else {
+ spa_altroot(spa, altroot, buflen);
+ }
+ }
+
+ if (spa != NULL)
+ spa_close(spa, FTAG);
+
+ return (error);
+}
+
+/*
+ * Validate that the 'spares' array is well formed. We must have an array of
+ * nvlists, each which describes a valid leaf vdev. If this is an import (mode
+ * is VDEV_ALLOC_SPARE), then we allow corrupted spares to be specified, as long
+ * as they are well-formed.
+ */
+static int
+spa_validate_spares(spa_t *spa, nvlist_t *nvroot, uint64_t crtxg, int mode)
+{
+ nvlist_t **spares;
+ uint_t i, nspares;
+ vdev_t *vd;
+ int error;
+
+ /*
+ * It's acceptable to have no spares specified.
+ */
+ if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
+ &spares, &nspares) != 0)
+ return (0);
+
+ if (nspares == 0)
+ return (EINVAL);
+
+ /*
+ * Make sure the pool is formatted with a version that supports hot
+ * spares.
+ */
+ if (spa_version(spa) < ZFS_VERSION_SPARES)
+ return (ENOTSUP);
+
+ /*
+ * Set the pending spare list so we correctly handle device in-use
+ * checking.
+ */
+ spa->spa_pending_spares = spares;
+ spa->spa_pending_nspares = nspares;
+
+ for (i = 0; i < nspares; i++) {
+ if ((error = spa_config_parse(spa, &vd, spares[i], NULL, 0,
+ mode)) != 0)
+ goto out;
+
+ if (!vd->vdev_ops->vdev_op_leaf) {
+ vdev_free(vd);
+ error = EINVAL;
+ goto out;
+ }
+
+ vd->vdev_top = vd;
+
+ if ((error = vdev_open(vd)) == 0 &&
+ (error = vdev_label_init(vd, crtxg,
+ VDEV_LABEL_SPARE)) == 0) {
+ VERIFY(nvlist_add_uint64(spares[i], ZPOOL_CONFIG_GUID,
+ vd->vdev_guid) == 0);
+ }
+
+ vdev_free(vd);
+
+ if (error && mode != VDEV_ALLOC_SPARE)
+ goto out;
+ else
+ error = 0;
+ }
+
+out:
+ spa->spa_pending_spares = NULL;
+ spa->spa_pending_nspares = 0;
+ return (error);
+}
+
+/*
+ * Pool Creation
+ */
+int
+spa_create(const char *pool, nvlist_t *nvroot, const char *altroot)
+{
+ spa_t *spa;
+ vdev_t *rvd;
+ dsl_pool_t *dp;
+ dmu_tx_t *tx;
+ int c, error = 0;
+ uint64_t txg = TXG_INITIAL;
+ nvlist_t **spares;
+ uint_t nspares;
+
+ /*
+ * If this pool already exists, return failure.
+ */
+ mutex_enter(&spa_namespace_lock);
+ if (spa_lookup(pool) != NULL) {
+ mutex_exit(&spa_namespace_lock);
+ return (EEXIST);
+ }
+
+ /*
+ * Allocate a new spa_t structure.
+ */
+ spa = spa_add(pool, altroot);
+ spa_activate(spa);
+
+ spa->spa_uberblock.ub_txg = txg - 1;
+ spa->spa_uberblock.ub_version = ZFS_VERSION;
+ spa->spa_ubsync = spa->spa_uberblock;
+
+ /*
+ * Create the root vdev.
+ */
+ spa_config_enter(spa, RW_WRITER, FTAG);
+
+ error = spa_config_parse(spa, &rvd, nvroot, NULL, 0, VDEV_ALLOC_ADD);
+
+ ASSERT(error != 0 || rvd != NULL);
+ ASSERT(error != 0 || spa->spa_root_vdev == rvd);
+
+ if (error == 0 && rvd->vdev_children == 0)
+ error = EINVAL;
+
+ if (error == 0 &&
+ (error = vdev_create(rvd, txg, B_FALSE)) == 0 &&
+ (error = spa_validate_spares(spa, nvroot, txg,
+ VDEV_ALLOC_ADD)) == 0) {
+ for (c = 0; c < rvd->vdev_children; c++)
+ vdev_init(rvd->vdev_child[c], txg);
+ vdev_config_dirty(rvd);
+ }
+
+ spa_config_exit(spa, FTAG);
+
+ if (error != 0) {
+ spa_unload(spa);
+ spa_deactivate(spa);
+ spa_remove(spa);
+ mutex_exit(&spa_namespace_lock);
+ return (error);
+ }
+
+ /*
+ * Get the list of spares, if specified.
+ */
+ if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
+ &spares, &nspares) == 0) {
+ VERIFY(nvlist_alloc(&spa->spa_sparelist, NV_UNIQUE_NAME,
+ KM_SLEEP) == 0);
+ VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist,
+ ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ spa_load_spares(spa);
+ spa_config_exit(spa, FTAG);
+ spa->spa_sync_spares = B_TRUE;
+ }
+
+ spa->spa_dsl_pool = dp = dsl_pool_create(spa, txg);
+ spa->spa_meta_objset = dp->dp_meta_objset;
+
+ tx = dmu_tx_create_assigned(dp, txg);
+
+ /*
+ * Create the pool config object.
+ */
+ spa->spa_config_object = dmu_object_alloc(spa->spa_meta_objset,
+ DMU_OT_PACKED_NVLIST, 1 << 14,
+ DMU_OT_PACKED_NVLIST_SIZE, sizeof (uint64_t), tx);
+
+ if (zap_add(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_CONFIG,
+ sizeof (uint64_t), 1, &spa->spa_config_object, tx) != 0) {
+ cmn_err(CE_PANIC, "failed to add pool config");
+ }
+
+ /* Newly created pools are always deflated. */
+ spa->spa_deflate = TRUE;
+ if (zap_add(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE,
+ sizeof (uint64_t), 1, &spa->spa_deflate, tx) != 0) {
+ cmn_err(CE_PANIC, "failed to add deflate");
+ }
+
+ /*
+ * Create the deferred-free bplist object. Turn off compression
+ * because sync-to-convergence takes longer if the blocksize
+ * keeps changing.
+ */
+ spa->spa_sync_bplist_obj = bplist_create(spa->spa_meta_objset,
+ 1 << 14, tx);
+ dmu_object_set_compress(spa->spa_meta_objset, spa->spa_sync_bplist_obj,
+ ZIO_COMPRESS_OFF, tx);
+
+ if (zap_add(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_SYNC_BPLIST,
+ sizeof (uint64_t), 1, &spa->spa_sync_bplist_obj, tx) != 0) {
+ cmn_err(CE_PANIC, "failed to add bplist");
+ }
+
+ /*
+ * Create the pool's history object.
+ */
+ spa_history_create_obj(spa, tx);
+
+ dmu_tx_commit(tx);
+
+ spa->spa_bootfs = zfs_prop_default_numeric(ZFS_PROP_BOOTFS);
+ spa->spa_sync_on = B_TRUE;
+ txg_sync_start(spa->spa_dsl_pool);
+
+ /*
+ * We explicitly wait for the first transaction to complete so that our
+ * bean counters are appropriately updated.
+ */
+ txg_wait_synced(spa->spa_dsl_pool, txg);
+
+ spa_config_sync();
+
+ mutex_exit(&spa_namespace_lock);
+
+ return (0);
+}
+
+/*
+ * Import the given pool into the system. We set up the necessary spa_t and
+ * then call spa_load() to do the dirty work.
+ */
+int
+spa_import(const char *pool, nvlist_t *config, const char *altroot)
+{
+ spa_t *spa;
+ int error;
+ nvlist_t *nvroot;
+ nvlist_t **spares;
+ uint_t nspares;
+
+ if (!(spa_mode & FWRITE))
+ return (EROFS);
+
+ /*
+ * If a pool with this name exists, return failure.
+ */
+ mutex_enter(&spa_namespace_lock);
+ if (spa_lookup(pool) != NULL) {
+ mutex_exit(&spa_namespace_lock);
+ return (EEXIST);
+ }
+
+ /*
+ * Create and initialize the spa structure.
+ */
+ spa = spa_add(pool, altroot);
+ spa_activate(spa);
+
+ /*
+ * Pass off the heavy lifting to spa_load().
+ * Pass TRUE for mosconfig because the user-supplied config
+ * is actually the one to trust when doing an import.
+ */
+ error = spa_load(spa, config, SPA_LOAD_IMPORT, B_TRUE);
+
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ /*
+ * Toss any existing sparelist, as it doesn't have any validity anymore,
+ * and conflicts with spa_has_spare().
+ */
+ if (spa->spa_sparelist) {
+ nvlist_free(spa->spa_sparelist);
+ spa->spa_sparelist = NULL;
+ spa_load_spares(spa);
+ }
+
+ VERIFY(nvlist_lookup_nvlist(config, ZPOOL_CONFIG_VDEV_TREE,
+ &nvroot) == 0);
+ if (error == 0)
+ error = spa_validate_spares(spa, nvroot, -1ULL,
+ VDEV_ALLOC_SPARE);
+ spa_config_exit(spa, FTAG);
+
+ if (error != 0) {
+ spa_unload(spa);
+ spa_deactivate(spa);
+ spa_remove(spa);
+ mutex_exit(&spa_namespace_lock);
+ return (error);
+ }
+
+ /*
+ * Override any spares as specified by the user, as these may have
+ * correct device names/devids, etc.
+ */
+ if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
+ &spares, &nspares) == 0) {
+ if (spa->spa_sparelist)
+ VERIFY(nvlist_remove(spa->spa_sparelist,
+ ZPOOL_CONFIG_SPARES, DATA_TYPE_NVLIST_ARRAY) == 0);
+ else
+ VERIFY(nvlist_alloc(&spa->spa_sparelist,
+ NV_UNIQUE_NAME, KM_SLEEP) == 0);
+ VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist,
+ ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ spa_load_spares(spa);
+ spa_config_exit(spa, FTAG);
+ spa->spa_sync_spares = B_TRUE;
+ }
+
+ /*
+ * Update the config cache to include the newly-imported pool.
+ */
+ spa_config_update(spa, SPA_CONFIG_UPDATE_POOL);
+
+ mutex_exit(&spa_namespace_lock);
+
+ /*
+ * Resilver anything that's out of date.
+ */
+ if (spa_mode & FWRITE)
+ VERIFY(spa_scrub(spa, POOL_SCRUB_RESILVER, B_TRUE) == 0);
+
+ return (0);
+}
+
+/*
+ * This (illegal) pool name is used when temporarily importing a spa_t in order
+ * to get the vdev stats associated with the imported devices.
+ */
+#define TRYIMPORT_NAME "$import"
+
+nvlist_t *
+spa_tryimport(nvlist_t *tryconfig)
+{
+ nvlist_t *config = NULL;
+ char *poolname;
+ spa_t *spa;
+ uint64_t state;
+
+ if (nvlist_lookup_string(tryconfig, ZPOOL_CONFIG_POOL_NAME, &poolname))
+ return (NULL);
+
+ if (nvlist_lookup_uint64(tryconfig, ZPOOL_CONFIG_POOL_STATE, &state))
+ return (NULL);
+
+ /*
+ * Create and initialize the spa structure.
+ */
+ mutex_enter(&spa_namespace_lock);
+ spa = spa_add(TRYIMPORT_NAME, NULL);
+ spa_activate(spa);
+
+ /*
+ * Pass off the heavy lifting to spa_load().
+ * Pass TRUE for mosconfig because the user-supplied config
+ * is actually the one to trust when doing an import.
+ */
+ (void) spa_load(spa, tryconfig, SPA_LOAD_TRYIMPORT, B_TRUE);
+
+ /*
+ * If 'tryconfig' was at least parsable, return the current config.
+ */
+ if (spa->spa_root_vdev != NULL) {
+ spa_config_enter(spa, RW_READER, FTAG);
+ config = spa_config_generate(spa, NULL, -1ULL, B_TRUE);
+ spa_config_exit(spa, FTAG);
+ VERIFY(nvlist_add_string(config, ZPOOL_CONFIG_POOL_NAME,
+ poolname) == 0);
+ VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_STATE,
+ state) == 0);
+ VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_TIMESTAMP,
+ spa->spa_uberblock.ub_timestamp) == 0);
+
+ /*
+ * Add the list of hot spares.
+ */
+ spa_add_spares(spa, config);
+ }
+
+ spa_unload(spa);
+ spa_deactivate(spa);
+ spa_remove(spa);
+ mutex_exit(&spa_namespace_lock);
+
+ return (config);
+}
+
+/*
+ * Pool export/destroy
+ *
+ * The act of destroying or exporting a pool is very simple. We make sure there
+ * is no more pending I/O and any references to the pool are gone. Then, we
+ * update the pool state and sync all the labels to disk, removing the
+ * configuration from the cache afterwards.
+ */
+static int
+spa_export_common(char *pool, int new_state, nvlist_t **oldconfig)
+{
+ spa_t *spa;
+
+ if (oldconfig)
+ *oldconfig = NULL;
+
+ if (!(spa_mode & FWRITE))
+ return (EROFS);
+
+ mutex_enter(&spa_namespace_lock);
+ if ((spa = spa_lookup(pool)) == NULL) {
+ mutex_exit(&spa_namespace_lock);
+ return (ENOENT);
+ }
+
+ /*
+ * Put a hold on the pool, drop the namespace lock, stop async tasks,
+ * reacquire the namespace lock, and see if we can export.
+ */
+ spa_open_ref(spa, FTAG);
+ mutex_exit(&spa_namespace_lock);
+ spa_async_suspend(spa);
+ mutex_enter(&spa_namespace_lock);
+ spa_close(spa, FTAG);
+
+ /*
+ * The pool will be in core if it's openable,
+ * in which case we can modify its state.
+ */
+ if (spa->spa_state != POOL_STATE_UNINITIALIZED && spa->spa_sync_on) {
+ /*
+ * Objsets may be open only because they're dirty, so we
+ * have to force it to sync before checking spa_refcnt.
+ */
+ spa_scrub_suspend(spa);
+ txg_wait_synced(spa->spa_dsl_pool, 0);
+
+ /*
+ * A pool cannot be exported or destroyed if there are active
+ * references. If we are resetting a pool, allow references by
+ * fault injection handlers.
+ */
+ if (!spa_refcount_zero(spa) ||
+ (spa->spa_inject_ref != 0 &&
+ new_state != POOL_STATE_UNINITIALIZED)) {
+ spa_scrub_resume(spa);
+ spa_async_resume(spa);
+ mutex_exit(&spa_namespace_lock);
+ return (EBUSY);
+ }
+
+ spa_scrub_resume(spa);
+ VERIFY(spa_scrub(spa, POOL_SCRUB_NONE, B_TRUE) == 0);
+
+ /*
+ * We want this to be reflected on every label,
+ * so mark them all dirty. spa_unload() will do the
+ * final sync that pushes these changes out.
+ */
+ if (new_state != POOL_STATE_UNINITIALIZED) {
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ spa->spa_state = new_state;
+ spa->spa_final_txg = spa_last_synced_txg(spa) + 1;
+ vdev_config_dirty(spa->spa_root_vdev);
+ spa_config_exit(spa, FTAG);
+ }
+ }
+
+ if (spa->spa_state != POOL_STATE_UNINITIALIZED) {
+ spa_unload(spa);
+ spa_deactivate(spa);
+ }
+
+ if (oldconfig && spa->spa_config)
+ VERIFY(nvlist_dup(spa->spa_config, oldconfig, 0) == 0);
+
+ if (new_state != POOL_STATE_UNINITIALIZED) {
+ spa_remove(spa);
+ spa_config_sync();
+ }
+ mutex_exit(&spa_namespace_lock);
+
+ return (0);
+}
+
+/*
+ * Destroy a storage pool.
+ */
+int
+spa_destroy(char *pool)
+{
+ return (spa_export_common(pool, POOL_STATE_DESTROYED, NULL));
+}
+
+/*
+ * Export a storage pool.
+ */
+int
+spa_export(char *pool, nvlist_t **oldconfig)
+{
+ return (spa_export_common(pool, POOL_STATE_EXPORTED, oldconfig));
+}
+
+/*
+ * Similar to spa_export(), this unloads the spa_t without actually removing it
+ * from the namespace in any way.
+ */
+int
+spa_reset(char *pool)
+{
+ return (spa_export_common(pool, POOL_STATE_UNINITIALIZED, NULL));
+}
+
+
+/*
+ * ==========================================================================
+ * Device manipulation
+ * ==========================================================================
+ */
+
+/*
+ * Add capacity to a storage pool.
+ */
+int
+spa_vdev_add(spa_t *spa, nvlist_t *nvroot)
+{
+ uint64_t txg;
+ int c, error;
+ vdev_t *rvd = spa->spa_root_vdev;
+ vdev_t *vd, *tvd;
+ nvlist_t **spares;
+ uint_t i, nspares;
+
+ txg = spa_vdev_enter(spa);
+
+ if ((error = spa_config_parse(spa, &vd, nvroot, NULL, 0,
+ VDEV_ALLOC_ADD)) != 0)
+ return (spa_vdev_exit(spa, NULL, txg, error));
+
+ spa->spa_pending_vdev = vd;
+
+ if (nvlist_lookup_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
+ &spares, &nspares) != 0)
+ nspares = 0;
+
+ if (vd->vdev_children == 0 && nspares == 0) {
+ spa->spa_pending_vdev = NULL;
+ return (spa_vdev_exit(spa, vd, txg, EINVAL));
+ }
+
+ if (vd->vdev_children != 0) {
+ if ((error = vdev_create(vd, txg, B_FALSE)) != 0) {
+ spa->spa_pending_vdev = NULL;
+ return (spa_vdev_exit(spa, vd, txg, error));
+ }
+ }
+
+ /*
+ * We must validate the spares after checking the children. Otherwise,
+ * vdev_inuse() will blindly overwrite the spare.
+ */
+ if ((error = spa_validate_spares(spa, nvroot, txg,
+ VDEV_ALLOC_ADD)) != 0) {
+ spa->spa_pending_vdev = NULL;
+ return (spa_vdev_exit(spa, vd, txg, error));
+ }
+
+ spa->spa_pending_vdev = NULL;
+
+ /*
+ * Transfer each new top-level vdev from vd to rvd.
+ */
+ for (c = 0; c < vd->vdev_children; c++) {
+ tvd = vd->vdev_child[c];
+ vdev_remove_child(vd, tvd);
+ tvd->vdev_id = rvd->vdev_children;
+ vdev_add_child(rvd, tvd);
+ vdev_config_dirty(tvd);
+ }
+
+ if (nspares != 0) {
+ if (spa->spa_sparelist != NULL) {
+ nvlist_t **oldspares;
+ uint_t oldnspares;
+ nvlist_t **newspares;
+
+ VERIFY(nvlist_lookup_nvlist_array(spa->spa_sparelist,
+ ZPOOL_CONFIG_SPARES, &oldspares, &oldnspares) == 0);
+
+ newspares = kmem_alloc(sizeof (void *) *
+ (nspares + oldnspares), KM_SLEEP);
+ for (i = 0; i < oldnspares; i++)
+ VERIFY(nvlist_dup(oldspares[i],
+ &newspares[i], KM_SLEEP) == 0);
+ for (i = 0; i < nspares; i++)
+ VERIFY(nvlist_dup(spares[i],
+ &newspares[i + oldnspares],
+ KM_SLEEP) == 0);
+
+ VERIFY(nvlist_remove(spa->spa_sparelist,
+ ZPOOL_CONFIG_SPARES, DATA_TYPE_NVLIST_ARRAY) == 0);
+
+ VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist,
+ ZPOOL_CONFIG_SPARES, newspares,
+ nspares + oldnspares) == 0);
+ for (i = 0; i < oldnspares + nspares; i++)
+ nvlist_free(newspares[i]);
+ kmem_free(newspares, (oldnspares + nspares) *
+ sizeof (void *));
+ } else {
+ VERIFY(nvlist_alloc(&spa->spa_sparelist,
+ NV_UNIQUE_NAME, KM_SLEEP) == 0);
+ VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist,
+ ZPOOL_CONFIG_SPARES, spares, nspares) == 0);
+ }
+
+ spa_load_spares(spa);
+ spa->spa_sync_spares = B_TRUE;
+ }
+
+ /*
+ * We have to be careful when adding new vdevs to an existing pool.
+ * If other threads start allocating from these vdevs before we
+ * sync the config cache, and we lose power, then upon reboot we may
+ * fail to open the pool because there are DVAs that the config cache
+ * can't translate. Therefore, we first add the vdevs without
+ * initializing metaslabs; sync the config cache (via spa_vdev_exit());
+ * and then let spa_config_update() initialize the new metaslabs.
+ *
+ * spa_load() checks for added-but-not-initialized vdevs, so that
+ * if we lose power at any point in this sequence, the remaining
+ * steps will be completed the next time we load the pool.
+ */
+ (void) spa_vdev_exit(spa, vd, txg, 0);
+
+ mutex_enter(&spa_namespace_lock);
+ spa_config_update(spa, SPA_CONFIG_UPDATE_POOL);
+ mutex_exit(&spa_namespace_lock);
+
+ return (0);
+}
+
+/*
+ * Attach a device to a mirror. The arguments are the path to any device
+ * in the mirror, and the nvroot for the new device. If the path specifies
+ * a device that is not mirrored, we automatically insert the mirror vdev.
+ *
+ * If 'replacing' is specified, the new device is intended to replace the
+ * existing device; in this case the two devices are made into their own
+ * mirror using the 'replacing' vdev, which is functionally idendical to
+ * the mirror vdev (it actually reuses all the same ops) but has a few
+ * extra rules: you can't attach to it after it's been created, and upon
+ * completion of resilvering, the first disk (the one being replaced)
+ * is automatically detached.
+ */
+int
+spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot, int replacing)
+{
+ uint64_t txg, open_txg;
+ int error;
+ vdev_t *rvd = spa->spa_root_vdev;
+ vdev_t *oldvd, *newvd, *newrootvd, *pvd, *tvd;
+ vdev_ops_t *pvops;
+
+ txg = spa_vdev_enter(spa);
+
+ oldvd = vdev_lookup_by_guid(rvd, guid);
+
+ if (oldvd == NULL)
+ return (spa_vdev_exit(spa, NULL, txg, ENODEV));
+
+ if (!oldvd->vdev_ops->vdev_op_leaf)
+ return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
+
+ pvd = oldvd->vdev_parent;
+
+ if ((error = spa_config_parse(spa, &newrootvd, nvroot, NULL, 0,
+ VDEV_ALLOC_ADD)) != 0 || newrootvd->vdev_children != 1)
+ return (spa_vdev_exit(spa, newrootvd, txg, EINVAL));
+
+ newvd = newrootvd->vdev_child[0];
+
+ if (!newvd->vdev_ops->vdev_op_leaf)
+ return (spa_vdev_exit(spa, newrootvd, txg, EINVAL));
+
+ if ((error = vdev_create(newrootvd, txg, replacing)) != 0)
+ return (spa_vdev_exit(spa, newrootvd, txg, error));
+
+ if (!replacing) {
+ /*
+ * For attach, the only allowable parent is a mirror or the root
+ * vdev.
+ */
+ if (pvd->vdev_ops != &vdev_mirror_ops &&
+ pvd->vdev_ops != &vdev_root_ops)
+ return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
+
+ pvops = &vdev_mirror_ops;
+ } else {
+ /*
+ * Active hot spares can only be replaced by inactive hot
+ * spares.
+ */
+ if (pvd->vdev_ops == &vdev_spare_ops &&
+ pvd->vdev_child[1] == oldvd &&
+ !spa_has_spare(spa, newvd->vdev_guid))
+ return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
+
+ /*
+ * If the source is a hot spare, and the parent isn't already a
+ * spare, then we want to create a new hot spare. Otherwise, we
+ * want to create a replacing vdev. The user is not allowed to
+ * attach to a spared vdev child unless the 'isspare' state is
+ * the same (spare replaces spare, non-spare replaces
+ * non-spare).
+ */
+ if (pvd->vdev_ops == &vdev_replacing_ops)
+ return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
+ else if (pvd->vdev_ops == &vdev_spare_ops &&
+ newvd->vdev_isspare != oldvd->vdev_isspare)
+ return (spa_vdev_exit(spa, newrootvd, txg, ENOTSUP));
+ else if (pvd->vdev_ops != &vdev_spare_ops &&
+ newvd->vdev_isspare)
+ pvops = &vdev_spare_ops;
+ else
+ pvops = &vdev_replacing_ops;
+ }
+
+ /*
+ * Compare the new device size with the replaceable/attachable
+ * device size.
+ */
+ if (newvd->vdev_psize < vdev_get_rsize(oldvd))
+ return (spa_vdev_exit(spa, newrootvd, txg, EOVERFLOW));
+
+ /*
+ * The new device cannot have a higher alignment requirement
+ * than the top-level vdev.
+ */
+ if (newvd->vdev_ashift > oldvd->vdev_top->vdev_ashift)
+ return (spa_vdev_exit(spa, newrootvd, txg, EDOM));
+
+ /*
+ * If this is an in-place replacement, update oldvd's path and devid
+ * to make it distinguishable from newvd, and unopenable from now on.
+ */
+ if (strcmp(oldvd->vdev_path, newvd->vdev_path) == 0) {
+ spa_strfree(oldvd->vdev_path);
+ oldvd->vdev_path = kmem_alloc(strlen(newvd->vdev_path) + 5,
+ KM_SLEEP);
+ (void) sprintf(oldvd->vdev_path, "%s/%s",
+ newvd->vdev_path, "old");
+ if (oldvd->vdev_devid != NULL) {
+ spa_strfree(oldvd->vdev_devid);
+ oldvd->vdev_devid = NULL;
+ }
+ }
+
+ /*
+ * If the parent is not a mirror, or if we're replacing, insert the new
+ * mirror/replacing/spare vdev above oldvd.
+ */
+ if (pvd->vdev_ops != pvops)
+ pvd = vdev_add_parent(oldvd, pvops);
+
+ ASSERT(pvd->vdev_top->vdev_parent == rvd);
+ ASSERT(pvd->vdev_ops == pvops);
+ ASSERT(oldvd->vdev_parent == pvd);
+
+ /*
+ * Extract the new device from its root and add it to pvd.
+ */
+ vdev_remove_child(newrootvd, newvd);
+ newvd->vdev_id = pvd->vdev_children;
+ vdev_add_child(pvd, newvd);
+
+ /*
+ * If newvd is smaller than oldvd, but larger than its rsize,
+ * the addition of newvd may have decreased our parent's asize.
+ */
+ pvd->vdev_asize = MIN(pvd->vdev_asize, newvd->vdev_asize);
+
+ tvd = newvd->vdev_top;
+ ASSERT(pvd->vdev_top == tvd);
+ ASSERT(tvd->vdev_parent == rvd);
+
+ vdev_config_dirty(tvd);
+
+ /*
+ * Set newvd's DTL to [TXG_INITIAL, open_txg]. It will propagate
+ * upward when spa_vdev_exit() calls vdev_dtl_reassess().
+ */
+ open_txg = txg + TXG_CONCURRENT_STATES - 1;
+
+ mutex_enter(&newvd->vdev_dtl_lock);
+ space_map_add(&newvd->vdev_dtl_map, TXG_INITIAL,
+ open_txg - TXG_INITIAL + 1);
+ mutex_exit(&newvd->vdev_dtl_lock);
+
+ if (newvd->vdev_isspare)
+ spa_spare_activate(newvd);
+
+ /*
+ * Mark newvd's DTL dirty in this txg.
+ */
+ vdev_dirty(tvd, VDD_DTL, newvd, txg);
+
+ (void) spa_vdev_exit(spa, newrootvd, open_txg, 0);
+
+ /*
+ * Kick off a resilver to update newvd.
+ */
+ VERIFY(spa_scrub(spa, POOL_SCRUB_RESILVER, B_TRUE) == 0);
+
+ return (0);
+}
+
+/*
+ * Detach a device from a mirror or replacing vdev.
+ * If 'replace_done' is specified, only detach if the parent
+ * is a replacing vdev.
+ */
+int
+spa_vdev_detach(spa_t *spa, uint64_t guid, int replace_done)
+{
+ uint64_t txg;
+ int c, t, error;
+ vdev_t *rvd = spa->spa_root_vdev;
+ vdev_t *vd, *pvd, *cvd, *tvd;
+ boolean_t unspare = B_FALSE;
+ uint64_t unspare_guid;
+
+ txg = spa_vdev_enter(spa);
+
+ vd = vdev_lookup_by_guid(rvd, guid);
+
+ if (vd == NULL)
+ return (spa_vdev_exit(spa, NULL, txg, ENODEV));
+
+ if (!vd->vdev_ops->vdev_op_leaf)
+ return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
+
+ pvd = vd->vdev_parent;
+
+ /*
+ * If replace_done is specified, only remove this device if it's
+ * the first child of a replacing vdev. For the 'spare' vdev, either
+ * disk can be removed.
+ */
+ if (replace_done) {
+ if (pvd->vdev_ops == &vdev_replacing_ops) {
+ if (vd->vdev_id != 0)
+ return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
+ } else if (pvd->vdev_ops != &vdev_spare_ops) {
+ return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
+ }
+ }
+
+ ASSERT(pvd->vdev_ops != &vdev_spare_ops ||
+ spa_version(spa) >= ZFS_VERSION_SPARES);
+
+ /*
+ * Only mirror, replacing, and spare vdevs support detach.
+ */
+ if (pvd->vdev_ops != &vdev_replacing_ops &&
+ pvd->vdev_ops != &vdev_mirror_ops &&
+ pvd->vdev_ops != &vdev_spare_ops)
+ return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
+
+ /*
+ * If there's only one replica, you can't detach it.
+ */
+ if (pvd->vdev_children <= 1)
+ return (spa_vdev_exit(spa, NULL, txg, EBUSY));
+
+ /*
+ * If all siblings have non-empty DTLs, this device may have the only
+ * valid copy of the data, which means we cannot safely detach it.
+ *
+ * XXX -- as in the vdev_offline() case, we really want a more
+ * precise DTL check.
+ */
+ for (c = 0; c < pvd->vdev_children; c++) {
+ uint64_t dirty;
+
+ cvd = pvd->vdev_child[c];
+ if (cvd == vd)
+ continue;
+ if (vdev_is_dead(cvd))
+ continue;
+ mutex_enter(&cvd->vdev_dtl_lock);
+ dirty = cvd->vdev_dtl_map.sm_space |
+ cvd->vdev_dtl_scrub.sm_space;
+ mutex_exit(&cvd->vdev_dtl_lock);
+ if (!dirty)
+ break;
+ }
+
+ /*
+ * If we are a replacing or spare vdev, then we can always detach the
+ * latter child, as that is how one cancels the operation.
+ */
+ if ((pvd->vdev_ops == &vdev_mirror_ops || vd->vdev_id != 1) &&
+ c == pvd->vdev_children)
+ return (spa_vdev_exit(spa, NULL, txg, EBUSY));
+
+ /*
+ * If we are detaching the original disk from a spare, then it implies
+ * that the spare should become a real disk, and be removed from the
+ * active spare list for the pool.
+ */
+ if (pvd->vdev_ops == &vdev_spare_ops &&
+ vd->vdev_id == 0)
+ unspare = B_TRUE;
+
+ /*
+ * Erase the disk labels so the disk can be used for other things.
+ * This must be done after all other error cases are handled,
+ * but before we disembowel vd (so we can still do I/O to it).
+ * But if we can't do it, don't treat the error as fatal --
+ * it may be that the unwritability of the disk is the reason
+ * it's being detached!
+ */
+ error = vdev_label_init(vd, 0, VDEV_LABEL_REMOVE);
+
+ /*
+ * Remove vd from its parent and compact the parent's children.
+ */
+ vdev_remove_child(pvd, vd);
+ vdev_compact_children(pvd);
+
+ /*
+ * Remember one of the remaining children so we can get tvd below.
+ */
+ cvd = pvd->vdev_child[0];
+
+ /*
+ * If we need to remove the remaining child from the list of hot spares,
+ * do it now, marking the vdev as no longer a spare in the process. We
+ * must do this before vdev_remove_parent(), because that can change the
+ * GUID if it creates a new toplevel GUID.
+ */
+ if (unspare) {
+ ASSERT(cvd->vdev_isspare);
+ spa_spare_remove(cvd);
+ unspare_guid = cvd->vdev_guid;
+ }
+
+ /*
+ * If the parent mirror/replacing vdev only has one child,
+ * the parent is no longer needed. Remove it from the tree.
+ */
+ if (pvd->vdev_children == 1)
+ vdev_remove_parent(cvd);
+
+ /*
+ * We don't set tvd until now because the parent we just removed
+ * may have been the previous top-level vdev.
+ */
+ tvd = cvd->vdev_top;
+ ASSERT(tvd->vdev_parent == rvd);
+
+ /*
+ * Reevaluate the parent vdev state.
+ */
+ vdev_propagate_state(cvd->vdev_parent);
+
+ /*
+ * If the device we just detached was smaller than the others, it may be
+ * possible to add metaslabs (i.e. grow the pool). vdev_metaslab_init()
+ * can't fail because the existing metaslabs are already in core, so
+ * there's nothing to read from disk.
+ */
+ VERIFY(vdev_metaslab_init(tvd, txg) == 0);
+
+ vdev_config_dirty(tvd);
+
+ /*
+ * Mark vd's DTL as dirty in this txg. vdev_dtl_sync() will see that
+ * vd->vdev_detached is set and free vd's DTL object in syncing context.
+ * But first make sure we're not on any *other* txg's DTL list, to
+ * prevent vd from being accessed after it's freed.
+ */
+ for (t = 0; t < TXG_SIZE; t++)
+ (void) txg_list_remove_this(&tvd->vdev_dtl_list, vd, t);
+ vd->vdev_detached = B_TRUE;
+ vdev_dirty(tvd, VDD_DTL, vd, txg);
+
+ error = spa_vdev_exit(spa, vd, txg, 0);
+
+ /*
+ * If this was the removal of the original device in a hot spare vdev,
+ * then we want to go through and remove the device from the hot spare
+ * list of every other pool.
+ */
+ if (unspare) {
+ spa = NULL;
+ mutex_enter(&spa_namespace_lock);
+ while ((spa = spa_next(spa)) != NULL) {
+ if (spa->spa_state != POOL_STATE_ACTIVE)
+ continue;
+
+ (void) spa_vdev_remove(spa, unspare_guid, B_TRUE);
+ }
+ mutex_exit(&spa_namespace_lock);
+ }
+
+ return (error);
+}
+
+/*
+ * Remove a device from the pool. Currently, this supports removing only hot
+ * spares.
+ */
+int
+spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare)
+{
+ vdev_t *vd;
+ nvlist_t **spares, *nv, **newspares;
+ uint_t i, j, nspares;
+ int ret = 0;
+
+ spa_config_enter(spa, RW_WRITER, FTAG);
+
+ vd = spa_lookup_by_guid(spa, guid);
+
+ nv = NULL;
+ if (spa->spa_spares != NULL &&
+ nvlist_lookup_nvlist_array(spa->spa_sparelist, ZPOOL_CONFIG_SPARES,
+ &spares, &nspares) == 0) {
+ for (i = 0; i < nspares; i++) {
+ uint64_t theguid;
+
+ VERIFY(nvlist_lookup_uint64(spares[i],
+ ZPOOL_CONFIG_GUID, &theguid) == 0);
+ if (theguid == guid) {
+ nv = spares[i];
+ break;
+ }
+ }
+ }
+
+ /*
+ * We only support removing a hot spare, and only if it's not currently
+ * in use in this pool.
+ */
+ if (nv == NULL && vd == NULL) {
+ ret = ENOENT;
+ goto out;
+ }
+
+ if (nv == NULL && vd != NULL) {
+ ret = ENOTSUP;
+ goto out;
+ }
+
+ if (!unspare && nv != NULL && vd != NULL) {
+ ret = EBUSY;
+ goto out;
+ }
+
+ if (nspares == 1) {
+ newspares = NULL;
+ } else {
+ newspares = kmem_alloc((nspares - 1) * sizeof (void *),
+ KM_SLEEP);
+ for (i = 0, j = 0; i < nspares; i++) {
+ if (spares[i] != nv)
+ VERIFY(nvlist_dup(spares[i],
+ &newspares[j++], KM_SLEEP) == 0);
+ }
+ }
+
+ VERIFY(nvlist_remove(spa->spa_sparelist, ZPOOL_CONFIG_SPARES,
+ DATA_TYPE_NVLIST_ARRAY) == 0);
+ VERIFY(nvlist_add_nvlist_array(spa->spa_sparelist, ZPOOL_CONFIG_SPARES,
+ newspares, nspares - 1) == 0);
+ for (i = 0; i < nspares - 1; i++)
+ nvlist_free(newspares[i]);
+ kmem_free(newspares, (nspares - 1) * sizeof (void *));
+ spa_load_spares(spa);
+ spa->spa_sync_spares = B_TRUE;
+
+out:
+ spa_config_exit(spa, FTAG);
+
+ return (ret);
+}
+
+/*
+ * Find any device that's done replacing, so we can detach it.
+ */
+static vdev_t *
+spa_vdev_replace_done_hunt(vdev_t *vd)
+{
+ vdev_t *newvd, *oldvd;
+ int c;
+
+ for (c = 0; c < vd->vdev_children; c++) {
+ oldvd = spa_vdev_replace_done_hunt(vd->vdev_child[c]);
+ if (oldvd != NULL)
+ return (oldvd);
+ }
+
+ if (vd->vdev_ops == &vdev_replacing_ops && vd->vdev_children == 2) {
+ oldvd = vd->vdev_child[0];
+ newvd = vd->vdev_child[1];
+
+ mutex_enter(&newvd->vdev_dtl_lock);
+ if (newvd->vdev_dtl_map.sm_space == 0 &&
+ newvd->vdev_dtl_scrub.sm_space == 0) {
+ mutex_exit(&newvd->vdev_dtl_lock);
+ return (oldvd);
+ }
+ mutex_exit(&newvd->vdev_dtl_lock);
+ }
+
+ return (NULL);
+}
+
+static void
+spa_vdev_replace_done(spa_t *spa)
+{
+ vdev_t *vd;
+ vdev_t *pvd;
+ uint64_t guid;
+ uint64_t pguid = 0;
+
+ spa_config_enter(spa, RW_READER, FTAG);
+
+ while ((vd = spa_vdev_replace_done_hunt(spa->spa_root_vdev)) != NULL) {
+ guid = vd->vdev_guid;
+ /*
+ * If we have just finished replacing a hot spared device, then
+ * we need to detach the parent's first child (the original hot
+ * spare) as well.
+ */
+ pvd = vd->vdev_parent;
+ if (pvd->vdev_parent->vdev_ops == &vdev_spare_ops &&
+ pvd->vdev_id == 0) {
+ ASSERT(pvd->vdev_ops == &vdev_replacing_ops);
+ ASSERT(pvd->vdev_parent->vdev_children == 2);
+ pguid = pvd->vdev_parent->vdev_child[1]->vdev_guid;
+ }
+ spa_config_exit(spa, FTAG);
+ if (spa_vdev_detach(spa, guid, B_TRUE) != 0)
+ return;
+ if (pguid != 0 && spa_vdev_detach(spa, pguid, B_TRUE) != 0)
+ return;
+ spa_config_enter(spa, RW_READER, FTAG);
+ }
+
+ spa_config_exit(spa, FTAG);
+}
+
+/*
+ * Update the stored path for this vdev. Dirty the vdev configuration, relying
+ * on spa_vdev_enter/exit() to synchronize the labels and cache.
+ */
+int
+spa_vdev_setpath(spa_t *spa, uint64_t guid, const char *newpath)
+{
+ vdev_t *rvd, *vd;
+ uint64_t txg;
+
+ rvd = spa->spa_root_vdev;
+
+ txg = spa_vdev_enter(spa);
+
+ if ((vd = vdev_lookup_by_guid(rvd, guid)) == NULL) {
+ /*
+ * Determine if this is a reference to a hot spare. In that
+ * case, update the path as stored in the spare list.
+ */
+ nvlist_t **spares;
+ uint_t i, nspares;
+ if (spa->spa_sparelist != NULL) {
+ VERIFY(nvlist_lookup_nvlist_array(spa->spa_sparelist,
+ ZPOOL_CONFIG_SPARES, &spares, &nspares) == 0);
+ for (i = 0; i < nspares; i++) {
+ uint64_t theguid;
+ VERIFY(nvlist_lookup_uint64(spares[i],
+ ZPOOL_CONFIG_GUID, &theguid) == 0);
+ if (theguid == guid)
+ break;
+ }
+
+ if (i == nspares)
+ return (spa_vdev_exit(spa, NULL, txg, ENOENT));
+
+ VERIFY(nvlist_add_string(spares[i],
+ ZPOOL_CONFIG_PATH, newpath) == 0);
+ spa_load_spares(spa);
+ spa->spa_sync_spares = B_TRUE;
+ return (spa_vdev_exit(spa, NULL, txg, 0));
+ } else {
+ return (spa_vdev_exit(spa, NULL, txg, ENOENT));
+ }
+ }
+
+ if (!vd->vdev_ops->vdev_op_leaf)
+ return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
+
+ spa_strfree(vd->vdev_path);
+ vd->vdev_path = spa_strdup(newpath);
+
+ vdev_config_dirty(vd->vdev_top);
+
+ return (spa_vdev_exit(spa, NULL, txg, 0));
+}
+
+/*
+ * ==========================================================================
+ * SPA Scrubbing
+ * ==========================================================================
+ */
+
+static void
+spa_scrub_io_done(zio_t *zio)
+{
+ spa_t *spa = zio->io_spa;
+
+ zio_data_buf_free(zio->io_data, zio->io_size);
+
+ mutex_enter(&spa->spa_scrub_lock);
+ if (zio->io_error && !(zio->io_flags & ZIO_FLAG_SPECULATIVE)) {
+ vdev_t *vd = zio->io_vd ? zio->io_vd : spa->spa_root_vdev;
+ spa->spa_scrub_errors++;
+ mutex_enter(&vd->vdev_stat_lock);
+ vd->vdev_stat.vs_scrub_errors++;
+ mutex_exit(&vd->vdev_stat_lock);
+ }
+
+ if (--spa->spa_scrub_inflight < spa->spa_scrub_maxinflight)
+ cv_broadcast(&spa->spa_scrub_io_cv);
+
+ ASSERT(spa->spa_scrub_inflight >= 0);
+
+ mutex_exit(&spa->spa_scrub_lock);
+}
+
+static void
+spa_scrub_io_start(spa_t *spa, blkptr_t *bp, int priority, int flags,
+ zbookmark_t *zb)
+{
+ size_t size = BP_GET_LSIZE(bp);
+ void *data;
+
+ mutex_enter(&spa->spa_scrub_lock);
+ /*
+ * Do not give too much work to vdev(s).
+ */
+ while (spa->spa_scrub_inflight >= spa->spa_scrub_maxinflight) {
+ cv_wait(&spa->spa_scrub_io_cv, &spa->spa_scrub_lock);
+ }
+ spa->spa_scrub_inflight++;
+ mutex_exit(&spa->spa_scrub_lock);
+
+ data = zio_data_buf_alloc(size);
+
+ if (zb->zb_level == -1 && BP_GET_TYPE(bp) != DMU_OT_OBJSET)
+ flags |= ZIO_FLAG_SPECULATIVE; /* intent log block */
+
+ flags |= ZIO_FLAG_SCRUB_THREAD | ZIO_FLAG_CANFAIL;
+
+ zio_nowait(zio_read(NULL, spa, bp, data, size,
+ spa_scrub_io_done, NULL, priority, flags, zb));
+}
+
+/* ARGSUSED */
+static int
+spa_scrub_cb(traverse_blk_cache_t *bc, spa_t *spa, void *a)
+{
+ blkptr_t *bp = &bc->bc_blkptr;
+ vdev_t *vd = spa->spa_root_vdev;
+ dva_t *dva = bp->blk_dva;
+ int needs_resilver = B_FALSE;
+ int d;
+
+ if (bc->bc_errno) {
+ /*
+ * We can't scrub this block, but we can continue to scrub
+ * the rest of the pool. Note the error and move along.
+ */
+ mutex_enter(&spa->spa_scrub_lock);
+ spa->spa_scrub_errors++;
+ mutex_exit(&spa->spa_scrub_lock);
+
+ mutex_enter(&vd->vdev_stat_lock);
+ vd->vdev_stat.vs_scrub_errors++;
+ mutex_exit(&vd->vdev_stat_lock);
+
+ return (ERESTART);
+ }
+
+ ASSERT(bp->blk_birth < spa->spa_scrub_maxtxg);
+
+ for (d = 0; d < BP_GET_NDVAS(bp); d++) {
+ vd = vdev_lookup_top(spa, DVA_GET_VDEV(&dva[d]));
+
+ ASSERT(vd != NULL);
+
+ /*
+ * Keep track of how much data we've examined so that
+ * zpool(1M) status can make useful progress reports.
+ */
+ mutex_enter(&vd->vdev_stat_lock);
+ vd->vdev_stat.vs_scrub_examined += DVA_GET_ASIZE(&dva[d]);
+ mutex_exit(&vd->vdev_stat_lock);
+
+ if (spa->spa_scrub_type == POOL_SCRUB_RESILVER) {
+ if (DVA_GET_GANG(&dva[d])) {
+ /*
+ * Gang members may be spread across multiple
+ * vdevs, so the best we can do is look at the
+ * pool-wide DTL.
+ * XXX -- it would be better to change our
+ * allocation policy to ensure that this can't
+ * happen.
+ */
+ vd = spa->spa_root_vdev;
+ }
+ if (vdev_dtl_contains(&vd->vdev_dtl_map,
+ bp->blk_birth, 1))
+ needs_resilver = B_TRUE;
+ }
+ }
+
+ if (spa->spa_scrub_type == POOL_SCRUB_EVERYTHING)
+ spa_scrub_io_start(spa, bp, ZIO_PRIORITY_SCRUB,
+ ZIO_FLAG_SCRUB, &bc->bc_bookmark);
+ else if (needs_resilver)
+ spa_scrub_io_start(spa, bp, ZIO_PRIORITY_RESILVER,
+ ZIO_FLAG_RESILVER, &bc->bc_bookmark);
+
+ return (0);
+}
+
+static void
+spa_scrub_thread(void *arg)
+{
+ spa_t *spa = arg;
+ callb_cpr_t cprinfo;
+ traverse_handle_t *th = spa->spa_scrub_th;
+ vdev_t *rvd = spa->spa_root_vdev;
+ pool_scrub_type_t scrub_type = spa->spa_scrub_type;
+ int error = 0;
+ boolean_t complete;
+
+ CALLB_CPR_INIT(&cprinfo, &spa->spa_scrub_lock, callb_generic_cpr, FTAG);
+
+ /*
+ * If we're restarting due to a snapshot create/delete,
+ * wait for that to complete.
+ */
+ txg_wait_synced(spa_get_dsl(spa), 0);
+
+ dprintf("start %s mintxg=%llu maxtxg=%llu\n",
+ scrub_type == POOL_SCRUB_RESILVER ? "resilver" : "scrub",
+ spa->spa_scrub_mintxg, spa->spa_scrub_maxtxg);
+
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ vdev_reopen(rvd); /* purge all vdev caches */
+ vdev_config_dirty(rvd); /* rewrite all disk labels */
+ vdev_scrub_stat_update(rvd, scrub_type, B_FALSE);
+ spa_config_exit(spa, FTAG);
+
+ mutex_enter(&spa->spa_scrub_lock);
+ spa->spa_scrub_errors = 0;
+ spa->spa_scrub_active = 1;
+ ASSERT(spa->spa_scrub_inflight == 0);
+
+ while (!spa->spa_scrub_stop) {
+ CALLB_CPR_SAFE_BEGIN(&cprinfo);
+ while (spa->spa_scrub_suspended) {
+ spa->spa_scrub_active = 0;
+ cv_broadcast(&spa->spa_scrub_cv);
+ cv_wait(&spa->spa_scrub_cv, &spa->spa_scrub_lock);
+ spa->spa_scrub_active = 1;
+ }
+ CALLB_CPR_SAFE_END(&cprinfo, &spa->spa_scrub_lock);
+
+ if (spa->spa_scrub_restart_txg != 0)
+ break;
+
+ mutex_exit(&spa->spa_scrub_lock);
+ error = traverse_more(th);
+ mutex_enter(&spa->spa_scrub_lock);
+ if (error != EAGAIN)
+ break;
+ }
+
+ while (spa->spa_scrub_inflight)
+ cv_wait(&spa->spa_scrub_io_cv, &spa->spa_scrub_lock);
+
+ spa->spa_scrub_active = 0;
+ cv_broadcast(&spa->spa_scrub_cv);
+
+ mutex_exit(&spa->spa_scrub_lock);
+
+ spa_config_enter(spa, RW_WRITER, FTAG);
+
+ mutex_enter(&spa->spa_scrub_lock);
+
+ /*
+ * Note: we check spa_scrub_restart_txg under both spa_scrub_lock
+ * AND the spa config lock to synchronize with any config changes
+ * that revise the DTLs under spa_vdev_enter() / spa_vdev_exit().
+ */
+ if (spa->spa_scrub_restart_txg != 0)
+ error = ERESTART;
+
+ if (spa->spa_scrub_stop)
+ error = EINTR;
+
+ /*
+ * Even if there were uncorrectable errors, we consider the scrub
+ * completed. The downside is that if there is a transient error during
+ * a resilver, we won't resilver the data properly to the target. But
+ * if the damage is permanent (more likely) we will resilver forever,
+ * which isn't really acceptable. Since there is enough information for
+ * the user to know what has failed and why, this seems like a more
+ * tractable approach.
+ */
+ complete = (error == 0);
+
+ dprintf("end %s to maxtxg=%llu %s, traverse=%d, %llu errors, stop=%u\n",
+ scrub_type == POOL_SCRUB_RESILVER ? "resilver" : "scrub",
+ spa->spa_scrub_maxtxg, complete ? "done" : "FAILED",
+ error, spa->spa_scrub_errors, spa->spa_scrub_stop);
+
+ mutex_exit(&spa->spa_scrub_lock);
+
+ /*
+ * If the scrub/resilver completed, update all DTLs to reflect this.
+ * Whether it succeeded or not, vacate all temporary scrub DTLs.
+ */
+ vdev_dtl_reassess(rvd, spa_last_synced_txg(spa) + 1,
+ complete ? spa->spa_scrub_maxtxg : 0, B_TRUE);
+ vdev_scrub_stat_update(rvd, POOL_SCRUB_NONE, complete);
+ spa_errlog_rotate(spa);
+
+ spa_config_exit(spa, FTAG);
+
+ mutex_enter(&spa->spa_scrub_lock);
+
+ /*
+ * We may have finished replacing a device.
+ * Let the async thread assess this and handle the detach.
+ */
+ spa_async_request(spa, SPA_ASYNC_REPLACE_DONE);
+
+ /*
+ * If we were told to restart, our final act is to start a new scrub.
+ */
+ if (error == ERESTART)
+ spa_async_request(spa, scrub_type == POOL_SCRUB_RESILVER ?
+ SPA_ASYNC_RESILVER : SPA_ASYNC_SCRUB);
+
+ spa->spa_scrub_type = POOL_SCRUB_NONE;
+ spa->spa_scrub_active = 0;
+ spa->spa_scrub_thread = NULL;
+ cv_broadcast(&spa->spa_scrub_cv);
+ CALLB_CPR_EXIT(&cprinfo); /* drops &spa->spa_scrub_lock */
+ thread_exit();
+}
+
+void
+spa_scrub_suspend(spa_t *spa)
+{
+ mutex_enter(&spa->spa_scrub_lock);
+ spa->spa_scrub_suspended++;
+ while (spa->spa_scrub_active) {
+ cv_broadcast(&spa->spa_scrub_cv);
+ cv_wait(&spa->spa_scrub_cv, &spa->spa_scrub_lock);
+ }
+ while (spa->spa_scrub_inflight)
+ cv_wait(&spa->spa_scrub_io_cv, &spa->spa_scrub_lock);
+ mutex_exit(&spa->spa_scrub_lock);
+}
+
+void
+spa_scrub_resume(spa_t *spa)
+{
+ mutex_enter(&spa->spa_scrub_lock);
+ ASSERT(spa->spa_scrub_suspended != 0);
+ if (--spa->spa_scrub_suspended == 0)
+ cv_broadcast(&spa->spa_scrub_cv);
+ mutex_exit(&spa->spa_scrub_lock);
+}
+
+void
+spa_scrub_restart(spa_t *spa, uint64_t txg)
+{
+ /*
+ * Something happened (e.g. snapshot create/delete) that means
+ * we must restart any in-progress scrubs. The itinerary will
+ * fix this properly.
+ */
+ mutex_enter(&spa->spa_scrub_lock);
+ spa->spa_scrub_restart_txg = txg;
+ mutex_exit(&spa->spa_scrub_lock);
+}
+
+int
+spa_scrub(spa_t *spa, pool_scrub_type_t type, boolean_t force)
+{
+ space_seg_t *ss;
+ uint64_t mintxg, maxtxg;
+ vdev_t *rvd = spa->spa_root_vdev;
+
+ if ((uint_t)type >= POOL_SCRUB_TYPES)
+ return (ENOTSUP);
+
+ mutex_enter(&spa->spa_scrub_lock);
+
+ /*
+ * If there's a scrub or resilver already in progress, stop it.
+ */
+ while (spa->spa_scrub_thread != NULL) {
+ /*
+ * Don't stop a resilver unless forced.
+ */
+ if (spa->spa_scrub_type == POOL_SCRUB_RESILVER && !force) {
+ mutex_exit(&spa->spa_scrub_lock);
+ return (EBUSY);
+ }
+ spa->spa_scrub_stop = 1;
+ cv_broadcast(&spa->spa_scrub_cv);
+ cv_wait(&spa->spa_scrub_cv, &spa->spa_scrub_lock);
+ }
+
+ /*
+ * Terminate the previous traverse.
+ */
+ if (spa->spa_scrub_th != NULL) {
+ traverse_fini(spa->spa_scrub_th);
+ spa->spa_scrub_th = NULL;
+ }
+
+ if (rvd == NULL) {
+ ASSERT(spa->spa_scrub_stop == 0);
+ ASSERT(spa->spa_scrub_type == type);
+ ASSERT(spa->spa_scrub_restart_txg == 0);
+ mutex_exit(&spa->spa_scrub_lock);
+ return (0);
+ }
+
+ mintxg = TXG_INITIAL - 1;
+ maxtxg = spa_last_synced_txg(spa) + 1;
+
+ mutex_enter(&rvd->vdev_dtl_lock);
+
+ if (rvd->vdev_dtl_map.sm_space == 0) {
+ /*
+ * The pool-wide DTL is empty.
+ * If this is a resilver, there's nothing to do except
+ * check whether any in-progress replacements have completed.
+ */
+ if (type == POOL_SCRUB_RESILVER) {
+ type = POOL_SCRUB_NONE;
+ spa_async_request(spa, SPA_ASYNC_REPLACE_DONE);
+ }
+ } else {
+ /*
+ * The pool-wide DTL is non-empty.
+ * If this is a normal scrub, upgrade to a resilver instead.
+ */
+ if (type == POOL_SCRUB_EVERYTHING)
+ type = POOL_SCRUB_RESILVER;
+ }
+
+ if (type == POOL_SCRUB_RESILVER) {
+ /*
+ * Determine the resilvering boundaries.
+ *
+ * Note: (mintxg, maxtxg) is an open interval,
+ * i.e. mintxg and maxtxg themselves are not included.
+ *
+ * Note: for maxtxg, we MIN with spa_last_synced_txg(spa) + 1
+ * so we don't claim to resilver a txg that's still changing.
+ */
+ ss = avl_first(&rvd->vdev_dtl_map.sm_root);
+ mintxg = ss->ss_start - 1;
+ ss = avl_last(&rvd->vdev_dtl_map.sm_root);
+ maxtxg = MIN(ss->ss_end, maxtxg);
+ }
+
+ mutex_exit(&rvd->vdev_dtl_lock);
+
+ spa->spa_scrub_stop = 0;
+ spa->spa_scrub_type = type;
+ spa->spa_scrub_restart_txg = 0;
+
+ if (type != POOL_SCRUB_NONE) {
+ spa->spa_scrub_mintxg = mintxg;
+ spa->spa_scrub_maxtxg = maxtxg;
+ spa->spa_scrub_th = traverse_init(spa, spa_scrub_cb, NULL,
+ ADVANCE_PRE | ADVANCE_PRUNE | ADVANCE_ZIL,
+ ZIO_FLAG_CANFAIL);
+ traverse_add_pool(spa->spa_scrub_th, mintxg, maxtxg);
+ spa->spa_scrub_thread = thread_create(NULL, 0,
+ spa_scrub_thread, spa, 0, &p0, TS_RUN, minclsyspri);
+ }
+
+ mutex_exit(&spa->spa_scrub_lock);
+
+ return (0);
+}
+
+/*
+ * ==========================================================================
+ * SPA async task processing
+ * ==========================================================================
+ */
+
+static void
+spa_async_reopen(spa_t *spa)
+{
+ vdev_t *rvd = spa->spa_root_vdev;
+ vdev_t *tvd;
+ int c;
+
+ spa_config_enter(spa, RW_WRITER, FTAG);
+
+ for (c = 0; c < rvd->vdev_children; c++) {
+ tvd = rvd->vdev_child[c];
+ if (tvd->vdev_reopen_wanted) {
+ tvd->vdev_reopen_wanted = 0;
+ vdev_reopen(tvd);
+ }
+ }
+
+ spa_config_exit(spa, FTAG);
+}
+
+static void
+spa_async_thread(void *arg)
+{
+ spa_t *spa = arg;
+ int tasks;
+
+ ASSERT(spa->spa_sync_on);
+
+ mutex_enter(&spa->spa_async_lock);
+ tasks = spa->spa_async_tasks;
+ spa->spa_async_tasks = 0;
+ mutex_exit(&spa->spa_async_lock);
+
+ /*
+ * See if the config needs to be updated.
+ */
+ if (tasks & SPA_ASYNC_CONFIG_UPDATE) {
+ mutex_enter(&spa_namespace_lock);
+ spa_config_update(spa, SPA_CONFIG_UPDATE_POOL);
+ mutex_exit(&spa_namespace_lock);
+ }
+
+ /*
+ * See if any devices need to be reopened.
+ */
+ if (tasks & SPA_ASYNC_REOPEN)
+ spa_async_reopen(spa);
+
+ /*
+ * If any devices are done replacing, detach them.
+ */
+ if (tasks & SPA_ASYNC_REPLACE_DONE)
+ spa_vdev_replace_done(spa);
+
+ /*
+ * Kick off a scrub.
+ */
+ if (tasks & SPA_ASYNC_SCRUB)
+ VERIFY(spa_scrub(spa, POOL_SCRUB_EVERYTHING, B_TRUE) == 0);
+
+ /*
+ * Kick off a resilver.
+ */
+ if (tasks & SPA_ASYNC_RESILVER)
+ VERIFY(spa_scrub(spa, POOL_SCRUB_RESILVER, B_TRUE) == 0);
+
+ /*
+ * Let the world know that we're done.
+ */
+ mutex_enter(&spa->spa_async_lock);
+ spa->spa_async_thread = NULL;
+ cv_broadcast(&spa->spa_async_cv);
+ mutex_exit(&spa->spa_async_lock);
+ thread_exit();
+}
+
+void
+spa_async_suspend(spa_t *spa)
+{
+ mutex_enter(&spa->spa_async_lock);
+ spa->spa_async_suspended++;
+ while (spa->spa_async_thread != NULL)
+ cv_wait(&spa->spa_async_cv, &spa->spa_async_lock);
+ mutex_exit(&spa->spa_async_lock);
+}
+
+void
+spa_async_resume(spa_t *spa)
+{
+ mutex_enter(&spa->spa_async_lock);
+ ASSERT(spa->spa_async_suspended != 0);
+ spa->spa_async_suspended--;
+ mutex_exit(&spa->spa_async_lock);
+}
+
+static void
+spa_async_dispatch(spa_t *spa)
+{
+ mutex_enter(&spa->spa_async_lock);
+ if (spa->spa_async_tasks && !spa->spa_async_suspended &&
+ spa->spa_async_thread == NULL &&
+ rootdir != NULL && !vn_is_readonly(rootdir))
+ spa->spa_async_thread = thread_create(NULL, 0,
+ spa_async_thread, spa, 0, &p0, TS_RUN, maxclsyspri);
+ mutex_exit(&spa->spa_async_lock);
+}
+
+void
+spa_async_request(spa_t *spa, int task)
+{
+ mutex_enter(&spa->spa_async_lock);
+ spa->spa_async_tasks |= task;
+ mutex_exit(&spa->spa_async_lock);
+}
+
+/*
+ * ==========================================================================
+ * SPA syncing routines
+ * ==========================================================================
+ */
+
+static void
+spa_sync_deferred_frees(spa_t *spa, uint64_t txg)
+{
+ bplist_t *bpl = &spa->spa_sync_bplist;
+ dmu_tx_t *tx;
+ blkptr_t blk;
+ uint64_t itor = 0;
+ zio_t *zio;
+ int error;
+ uint8_t c = 1;
+
+ zio = zio_root(spa, NULL, NULL, ZIO_FLAG_CONFIG_HELD);
+
+ while (bplist_iterate(bpl, &itor, &blk) == 0)
+ zio_nowait(zio_free(zio, spa, txg, &blk, NULL, NULL));
+
+ error = zio_wait(zio);
+ ASSERT3U(error, ==, 0);
+
+ tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
+ bplist_vacate(bpl, tx);
+
+ /*
+ * Pre-dirty the first block so we sync to convergence faster.
+ * (Usually only the first block is needed.)
+ */
+ dmu_write(spa->spa_meta_objset, spa->spa_sync_bplist_obj, 0, 1, &c, tx);
+ dmu_tx_commit(tx);
+}
+
+static void
+spa_sync_nvlist(spa_t *spa, uint64_t obj, nvlist_t *nv, dmu_tx_t *tx)
+{
+ char *packed = NULL;
+ size_t nvsize = 0;
+ dmu_buf_t *db;
+
+ VERIFY(nvlist_size(nv, &nvsize, NV_ENCODE_XDR) == 0);
+
+ packed = kmem_alloc(nvsize, KM_SLEEP);
+
+ VERIFY(nvlist_pack(nv, &packed, &nvsize, NV_ENCODE_XDR,
+ KM_SLEEP) == 0);
+
+ dmu_write(spa->spa_meta_objset, obj, 0, nvsize, packed, tx);
+
+ kmem_free(packed, nvsize);
+
+ VERIFY(0 == dmu_bonus_hold(spa->spa_meta_objset, obj, FTAG, &db));
+ dmu_buf_will_dirty(db, tx);
+ *(uint64_t *)db->db_data = nvsize;
+ dmu_buf_rele(db, FTAG);
+}
+
+static void
+spa_sync_spares(spa_t *spa, dmu_tx_t *tx)
+{
+ nvlist_t *nvroot;
+ nvlist_t **spares;
+ int i;
+
+ if (!spa->spa_sync_spares)
+ return;
+
+ /*
+ * Update the MOS nvlist describing the list of available spares.
+ * spa_validate_spares() will have already made sure this nvlist is
+ * valid and the vdevs are labelled appropriately.
+ */
+ if (spa->spa_spares_object == 0) {
+ spa->spa_spares_object = dmu_object_alloc(spa->spa_meta_objset,
+ DMU_OT_PACKED_NVLIST, 1 << 14,
+ DMU_OT_PACKED_NVLIST_SIZE, sizeof (uint64_t), tx);
+ VERIFY(zap_update(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_SPARES,
+ sizeof (uint64_t), 1, &spa->spa_spares_object, tx) == 0);
+ }
+
+ VERIFY(nvlist_alloc(&nvroot, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+ if (spa->spa_nspares == 0) {
+ VERIFY(nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
+ NULL, 0) == 0);
+ } else {
+ spares = kmem_alloc(spa->spa_nspares * sizeof (void *),
+ KM_SLEEP);
+ for (i = 0; i < spa->spa_nspares; i++)
+ spares[i] = vdev_config_generate(spa,
+ spa->spa_spares[i], B_FALSE, B_TRUE);
+ VERIFY(nvlist_add_nvlist_array(nvroot, ZPOOL_CONFIG_SPARES,
+ spares, spa->spa_nspares) == 0);
+ for (i = 0; i < spa->spa_nspares; i++)
+ nvlist_free(spares[i]);
+ kmem_free(spares, spa->spa_nspares * sizeof (void *));
+ }
+
+ spa_sync_nvlist(spa, spa->spa_spares_object, nvroot, tx);
+ nvlist_free(nvroot);
+
+ spa->spa_sync_spares = B_FALSE;
+}
+
+static void
+spa_sync_config_object(spa_t *spa, dmu_tx_t *tx)
+{
+ nvlist_t *config;
+
+ if (list_is_empty(&spa->spa_dirty_list))
+ return;
+
+ config = spa_config_generate(spa, NULL, dmu_tx_get_txg(tx), B_FALSE);
+
+ if (spa->spa_config_syncing)
+ nvlist_free(spa->spa_config_syncing);
+ spa->spa_config_syncing = config;
+
+ spa_sync_nvlist(spa, spa->spa_config_object, config, tx);
+}
+
+static void
+spa_sync_props(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ spa_t *spa = arg1;
+ nvlist_t *nvp = arg2;
+ nvpair_t *nvpair;
+ objset_t *mos = spa->spa_meta_objset;
+ uint64_t zapobj;
+
+ mutex_enter(&spa->spa_props_lock);
+ if (spa->spa_pool_props_object == 0) {
+ zapobj = zap_create(mos, DMU_OT_POOL_PROPS, DMU_OT_NONE, 0, tx);
+ VERIFY(zapobj > 0);
+
+ spa->spa_pool_props_object = zapobj;
+
+ VERIFY(zap_update(mos, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_POOL_PROPS, 8, 1,
+ &spa->spa_pool_props_object, tx) == 0);
+ }
+ mutex_exit(&spa->spa_props_lock);
+
+ nvpair = NULL;
+ while ((nvpair = nvlist_next_nvpair(nvp, nvpair))) {
+ switch (zpool_name_to_prop(nvpair_name(nvpair))) {
+ case ZFS_PROP_BOOTFS:
+ VERIFY(nvlist_lookup_uint64(nvp,
+ nvpair_name(nvpair), &spa->spa_bootfs) == 0);
+ VERIFY(zap_update(mos,
+ spa->spa_pool_props_object,
+ zpool_prop_to_name(ZFS_PROP_BOOTFS), 8, 1,
+ &spa->spa_bootfs, tx) == 0);
+ break;
+ }
+ }
+}
+
+/*
+ * Sync the specified transaction group. New blocks may be dirtied as
+ * part of the process, so we iterate until it converges.
+ */
+void
+spa_sync(spa_t *spa, uint64_t txg)
+{
+ dsl_pool_t *dp = spa->spa_dsl_pool;
+ objset_t *mos = spa->spa_meta_objset;
+ bplist_t *bpl = &spa->spa_sync_bplist;
+ vdev_t *rvd = spa->spa_root_vdev;
+ vdev_t *vd;
+ dmu_tx_t *tx;
+ int dirty_vdevs;
+
+ /*
+ * Lock out configuration changes.
+ */
+ spa_config_enter(spa, RW_READER, FTAG);
+
+ spa->spa_syncing_txg = txg;
+ spa->spa_sync_pass = 0;
+
+ VERIFY(0 == bplist_open(bpl, mos, spa->spa_sync_bplist_obj));
+
+ tx = dmu_tx_create_assigned(dp, txg);
+
+ /*
+ * If we are upgrading to ZFS_VERSION_RAIDZ_DEFLATE this txg,
+ * set spa_deflate if we have no raid-z vdevs.
+ */
+ if (spa->spa_ubsync.ub_version < ZFS_VERSION_RAIDZ_DEFLATE &&
+ spa->spa_uberblock.ub_version >= ZFS_VERSION_RAIDZ_DEFLATE) {
+ int i;
+
+ for (i = 0; i < rvd->vdev_children; i++) {
+ vd = rvd->vdev_child[i];
+ if (vd->vdev_deflate_ratio != SPA_MINBLOCKSIZE)
+ break;
+ }
+ if (i == rvd->vdev_children) {
+ spa->spa_deflate = TRUE;
+ VERIFY(0 == zap_add(spa->spa_meta_objset,
+ DMU_POOL_DIRECTORY_OBJECT, DMU_POOL_DEFLATE,
+ sizeof (uint64_t), 1, &spa->spa_deflate, tx));
+ }
+ }
+
+ /*
+ * If anything has changed in this txg, push the deferred frees
+ * from the previous txg. If not, leave them alone so that we
+ * don't generate work on an otherwise idle system.
+ */
+ if (!txg_list_empty(&dp->dp_dirty_datasets, txg) ||
+ !txg_list_empty(&dp->dp_dirty_dirs, txg) ||
+ !txg_list_empty(&dp->dp_sync_tasks, txg))
+ spa_sync_deferred_frees(spa, txg);
+
+ /*
+ * Iterate to convergence.
+ */
+ do {
+ spa->spa_sync_pass++;
+
+ spa_sync_config_object(spa, tx);
+ spa_sync_spares(spa, tx);
+ spa_errlog_sync(spa, txg);
+ dsl_pool_sync(dp, txg);
+
+ dirty_vdevs = 0;
+ while (vd = txg_list_remove(&spa->spa_vdev_txg_list, txg)) {
+ vdev_sync(vd, txg);
+ dirty_vdevs++;
+ }
+
+ bplist_sync(bpl, tx);
+ } while (dirty_vdevs);
+
+ bplist_close(bpl);
+
+ dprintf("txg %llu passes %d\n", txg, spa->spa_sync_pass);
+
+ /*
+ * Rewrite the vdev configuration (which includes the uberblock)
+ * to commit the transaction group.
+ *
+ * If there are any dirty vdevs, sync the uberblock to all vdevs.
+ * Otherwise, pick a random top-level vdev that's known to be
+ * visible in the config cache (see spa_vdev_add() for details).
+ * If the write fails, try the next vdev until we're tried them all.
+ */
+ if (!list_is_empty(&spa->spa_dirty_list)) {
+ VERIFY(vdev_config_sync(rvd, txg) == 0);
+ } else {
+ int children = rvd->vdev_children;
+ int c0 = spa_get_random(children);
+ int c;
+
+ for (c = 0; c < children; c++) {
+ vd = rvd->vdev_child[(c0 + c) % children];
+ if (vd->vdev_ms_array == 0)
+ continue;
+ if (vdev_config_sync(vd, txg) == 0)
+ break;
+ }
+ if (c == children)
+ VERIFY(vdev_config_sync(rvd, txg) == 0);
+ }
+
+ dmu_tx_commit(tx);
+
+ /*
+ * Clear the dirty config list.
+ */
+ while ((vd = list_head(&spa->spa_dirty_list)) != NULL)
+ vdev_config_clean(vd);
+
+ /*
+ * Now that the new config has synced transactionally,
+ * let it become visible to the config cache.
+ */
+ if (spa->spa_config_syncing != NULL) {
+ spa_config_set(spa, spa->spa_config_syncing);
+ spa->spa_config_txg = txg;
+ spa->spa_config_syncing = NULL;
+ }
+
+ /*
+ * Make a stable copy of the fully synced uberblock.
+ * We use this as the root for pool traversals.
+ */
+ spa->spa_traverse_wanted = 1; /* tells traverse_more() to stop */
+
+ spa_scrub_suspend(spa); /* stop scrubbing and finish I/Os */
+
+ rw_enter(&spa->spa_traverse_lock, RW_WRITER);
+ spa->spa_traverse_wanted = 0;
+ spa->spa_ubsync = spa->spa_uberblock;
+ rw_exit(&spa->spa_traverse_lock);
+
+ spa_scrub_resume(spa); /* resume scrub with new ubsync */
+
+ /*
+ * Clean up the ZIL records for the synced txg.
+ */
+ dsl_pool_zil_clean(dp);
+
+ /*
+ * Update usable space statistics.
+ */
+ while (vd = txg_list_remove(&spa->spa_vdev_txg_list, TXG_CLEAN(txg)))
+ vdev_sync_done(vd, txg);
+
+ /*
+ * It had better be the case that we didn't dirty anything
+ * since vdev_config_sync().
+ */
+ ASSERT(txg_list_empty(&dp->dp_dirty_datasets, txg));
+ ASSERT(txg_list_empty(&dp->dp_dirty_dirs, txg));
+ ASSERT(txg_list_empty(&spa->spa_vdev_txg_list, txg));
+ ASSERT(bpl->bpl_queue == NULL);
+
+ spa_config_exit(spa, FTAG);
+
+ /*
+ * If any async tasks have been requested, kick them off.
+ */
+ spa_async_dispatch(spa);
+}
+
+/*
+ * Sync all pools. We don't want to hold the namespace lock across these
+ * operations, so we take a reference on the spa_t and drop the lock during the
+ * sync.
+ */
+void
+spa_sync_allpools(void)
+{
+ spa_t *spa = NULL;
+ mutex_enter(&spa_namespace_lock);
+ while ((spa = spa_next(spa)) != NULL) {
+ if (spa_state(spa) != POOL_STATE_ACTIVE)
+ continue;
+ spa_open_ref(spa, FTAG);
+ mutex_exit(&spa_namespace_lock);
+ txg_wait_synced(spa_get_dsl(spa), 0);
+ mutex_enter(&spa_namespace_lock);
+ spa_close(spa, FTAG);
+ }
+ mutex_exit(&spa_namespace_lock);
+}
+
+/*
+ * ==========================================================================
+ * Miscellaneous routines
+ * ==========================================================================
+ */
+
+/*
+ * Remove all pools in the system.
+ */
+void
+spa_evict_all(void)
+{
+ spa_t *spa;
+
+ /*
+ * Remove all cached state. All pools should be closed now,
+ * so every spa in the AVL tree should be unreferenced.
+ */
+ mutex_enter(&spa_namespace_lock);
+ while ((spa = spa_next(NULL)) != NULL) {
+ /*
+ * Stop async tasks. The async thread may need to detach
+ * a device that's been replaced, which requires grabbing
+ * spa_namespace_lock, so we must drop it here.
+ */
+ spa_open_ref(spa, FTAG);
+ mutex_exit(&spa_namespace_lock);
+ spa_async_suspend(spa);
+ VERIFY(spa_scrub(spa, POOL_SCRUB_NONE, B_TRUE) == 0);
+ mutex_enter(&spa_namespace_lock);
+ spa_close(spa, FTAG);
+
+ if (spa->spa_state != POOL_STATE_UNINITIALIZED) {
+ spa_unload(spa);
+ spa_deactivate(spa);
+ }
+ spa_remove(spa);
+ }
+ mutex_exit(&spa_namespace_lock);
+}
+
+vdev_t *
+spa_lookup_by_guid(spa_t *spa, uint64_t guid)
+{
+ return (vdev_lookup_by_guid(spa->spa_root_vdev, guid));
+}
+
+void
+spa_upgrade(spa_t *spa)
+{
+ spa_config_enter(spa, RW_WRITER, FTAG);
+
+ /*
+ * This should only be called for a non-faulted pool, and since a
+ * future version would result in an unopenable pool, this shouldn't be
+ * possible.
+ */
+ ASSERT(spa->spa_uberblock.ub_version <= ZFS_VERSION);
+
+ spa->spa_uberblock.ub_version = ZFS_VERSION;
+ vdev_config_dirty(spa->spa_root_vdev);
+
+ spa_config_exit(spa, FTAG);
+
+ txg_wait_synced(spa_get_dsl(spa), 0);
+}
+
+boolean_t
+spa_has_spare(spa_t *spa, uint64_t guid)
+{
+ int i;
+ uint64_t spareguid;
+
+ for (i = 0; i < spa->spa_nspares; i++)
+ if (spa->spa_spares[i]->vdev_guid == guid)
+ return (B_TRUE);
+
+ for (i = 0; i < spa->spa_pending_nspares; i++) {
+ if (nvlist_lookup_uint64(spa->spa_pending_spares[i],
+ ZPOOL_CONFIG_GUID, &spareguid) == 0 &&
+ spareguid == guid)
+ return (B_TRUE);
+ }
+
+ return (B_FALSE);
+}
+
+int
+spa_set_props(spa_t *spa, nvlist_t *nvp)
+{
+ return (dsl_sync_task_do(spa_get_dsl(spa), NULL, spa_sync_props,
+ spa, nvp, 3));
+}
+
+int
+spa_get_props(spa_t *spa, nvlist_t **nvp)
+{
+ zap_cursor_t zc;
+ zap_attribute_t za;
+ objset_t *mos = spa->spa_meta_objset;
+ zfs_source_t src;
+ zfs_prop_t prop;
+ nvlist_t *propval;
+ uint64_t value;
+ int err;
+
+ VERIFY(nvlist_alloc(nvp, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+
+ mutex_enter(&spa->spa_props_lock);
+ /* If no props object, then just return empty nvlist */
+ if (spa->spa_pool_props_object == 0) {
+ mutex_exit(&spa->spa_props_lock);
+ return (0);
+ }
+
+ for (zap_cursor_init(&zc, mos, spa->spa_pool_props_object);
+ (err = zap_cursor_retrieve(&zc, &za)) == 0;
+ zap_cursor_advance(&zc)) {
+
+ if ((prop = zpool_name_to_prop(za.za_name)) == ZFS_PROP_INVAL)
+ continue;
+
+ VERIFY(nvlist_alloc(&propval, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+ switch (za.za_integer_length) {
+ case 8:
+ if (zfs_prop_default_numeric(prop) ==
+ za.za_first_integer)
+ src = ZFS_SRC_DEFAULT;
+ else
+ src = ZFS_SRC_LOCAL;
+ value = za.za_first_integer;
+
+ if (prop == ZFS_PROP_BOOTFS) {
+ dsl_pool_t *dp;
+ dsl_dataset_t *ds = NULL;
+ char strval[MAXPATHLEN];
+
+ dp = spa_get_dsl(spa);
+ rw_enter(&dp->dp_config_rwlock, RW_READER);
+ if ((err = dsl_dataset_open_obj(dp,
+ za.za_first_integer, NULL, DS_MODE_NONE,
+ FTAG, &ds)) != 0) {
+ rw_exit(&dp->dp_config_rwlock);
+ break;
+ }
+ dsl_dataset_name(ds, strval);
+ dsl_dataset_close(ds, DS_MODE_NONE, FTAG);
+ rw_exit(&dp->dp_config_rwlock);
+
+ VERIFY(nvlist_add_uint64(propval,
+ ZFS_PROP_SOURCE, src) == 0);
+ VERIFY(nvlist_add_string(propval,
+ ZFS_PROP_VALUE, strval) == 0);
+ } else {
+ VERIFY(nvlist_add_uint64(propval,
+ ZFS_PROP_SOURCE, src) == 0);
+ VERIFY(nvlist_add_uint64(propval,
+ ZFS_PROP_VALUE, value) == 0);
+ }
+ VERIFY(nvlist_add_nvlist(*nvp, za.za_name,
+ propval) == 0);
+ break;
+ }
+ nvlist_free(propval);
+ }
+ zap_cursor_fini(&zc);
+ mutex_exit(&spa->spa_props_lock);
+ if (err && err != ENOENT) {
+ nvlist_free(*nvp);
+ return (err);
+ }
+
+ return (0);
+}
+
+/*
+ * If the bootfs property value is dsobj, clear it.
+ */
+void
+spa_clear_bootfs(spa_t *spa, uint64_t dsobj, dmu_tx_t *tx)
+{
+ if (spa->spa_bootfs == dsobj && spa->spa_pool_props_object != 0) {
+ VERIFY(zap_remove(spa->spa_meta_objset,
+ spa->spa_pool_props_object,
+ zpool_prop_to_name(ZFS_PROP_BOOTFS), tx) == 0);
+ spa->spa_bootfs = 0;
+ }
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/spa_config.c b/sys/contrib/opensolaris/uts/common/fs/zfs/spa_config.c
new file mode 100644
index 0000000..9e8bcf3
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/spa_config.c
@@ -0,0 +1,375 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/spa_impl.h>
+#include <sys/nvpair.h>
+#include <sys/uio.h>
+#include <sys/fs/zfs.h>
+#include <sys/vdev_impl.h>
+#include <sys/zfs_ioctl.h>
+#include <sys/utsname.h>
+#include <sys/sunddi.h>
+#ifdef _KERNEL
+#include <sys/kobj.h>
+#endif
+
+/*
+ * Pool configuration repository.
+ *
+ * The configuration for all pools, in addition to being stored on disk, is
+ * stored in /etc/zfs/zpool.cache as a packed nvlist. The kernel maintains
+ * this list as pools are created, destroyed, or modified.
+ *
+ * We have a single nvlist which holds all the configuration information. When
+ * the module loads, we read this information from the cache and populate the
+ * SPA namespace. This namespace is maintained independently in spa.c.
+ * Whenever the namespace is modified, or the configuration of a pool is
+ * changed, we call spa_config_sync(), which walks through all the active pools
+ * and writes the configuration to disk.
+ */
+
+static uint64_t spa_config_generation = 1;
+
+/*
+ * This can be overridden in userland to preserve an alternate namespace for
+ * userland pools when doing testing.
+ */
+const char *spa_config_dir = ZPOOL_CACHE_DIR;
+
+/*
+ * Called when the module is first loaded, this routine loads the configuration
+ * file into the SPA namespace. It does not actually open or load the pools; it
+ * only populates the namespace.
+ */
+void
+spa_config_load(void)
+{
+ void *buf = NULL;
+ nvlist_t *nvlist, *child;
+ nvpair_t *nvpair;
+ spa_t *spa;
+ char pathname[128];
+ struct _buf *file;
+ uint64_t fsize;
+
+ /*
+ * Open the configuration file.
+ */
+ (void) snprintf(pathname, sizeof (pathname), "%s/%s",
+ spa_config_dir, ZPOOL_CACHE_FILE);
+
+ file = kobj_open_file(pathname);
+ if (file == (struct _buf *)-1) {
+ ZFS_LOG(1, "Cannot open %s.", pathname);
+ return;
+ }
+
+ if (kobj_get_filesize(file, &fsize) != 0) {
+ ZFS_LOG(1, "Cannot get size of %s.", pathname);
+ goto out;
+ }
+
+ buf = kmem_alloc(fsize, KM_SLEEP);
+
+ /*
+ * Read the nvlist from the file.
+ */
+ if (kobj_read_file(file, buf, fsize, 0) < 0) {
+ ZFS_LOG(1, "Cannot read %s.", pathname);
+ goto out;
+ }
+
+ /*
+ * Unpack the nvlist.
+ */
+ if (nvlist_unpack(buf, fsize, &nvlist, KM_SLEEP) != 0)
+ goto out;
+
+ ZFS_LOG(1, "File %s loaded.", pathname);
+
+ /*
+ * Iterate over all elements in the nvlist, creating a new spa_t for
+ * each one with the specified configuration.
+ */
+ mutex_enter(&spa_namespace_lock);
+ nvpair = NULL;
+ while ((nvpair = nvlist_next_nvpair(nvlist, nvpair)) != NULL) {
+
+ if (nvpair_type(nvpair) != DATA_TYPE_NVLIST)
+ continue;
+
+ VERIFY(nvpair_value_nvlist(nvpair, &child) == 0);
+
+ if (spa_lookup(nvpair_name(nvpair)) != NULL)
+ continue;
+ spa = spa_add(nvpair_name(nvpair), NULL);
+
+ /*
+ * We blindly duplicate the configuration here. If it's
+ * invalid, we will catch it when the pool is first opened.
+ */
+ VERIFY(nvlist_dup(child, &spa->spa_config, 0) == 0);
+ }
+ mutex_exit(&spa_namespace_lock);
+
+ nvlist_free(nvlist);
+
+out:
+ if (buf != NULL)
+ kmem_free(buf, fsize);
+
+ kobj_close_file(file);
+}
+
+/*
+ * Synchronize all pools to disk. This must be called with the namespace lock
+ * held.
+ */
+void
+spa_config_sync(void)
+{
+ spa_t *spa = NULL;
+ nvlist_t *config;
+ size_t buflen;
+ char *buf;
+ vnode_t *vp;
+ int oflags = FWRITE | FTRUNC | FCREAT | FOFFMAX;
+ char pathname[128];
+ char pathname2[128];
+
+ ASSERT(MUTEX_HELD(&spa_namespace_lock));
+
+ VERIFY(nvlist_alloc(&config, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+
+ /*
+ * Add all known pools to the configuration list, ignoring those with
+ * alternate root paths.
+ */
+ spa = NULL;
+ while ((spa = spa_next(spa)) != NULL) {
+ mutex_enter(&spa->spa_config_cache_lock);
+ if (spa->spa_config && spa->spa_name && spa->spa_root == NULL)
+ VERIFY(nvlist_add_nvlist(config, spa->spa_name,
+ spa->spa_config) == 0);
+ mutex_exit(&spa->spa_config_cache_lock);
+ }
+
+ /*
+ * Pack the configuration into a buffer.
+ */
+ VERIFY(nvlist_size(config, &buflen, NV_ENCODE_XDR) == 0);
+
+ buf = kmem_alloc(buflen, KM_SLEEP);
+
+ VERIFY(nvlist_pack(config, &buf, &buflen, NV_ENCODE_XDR,
+ KM_SLEEP) == 0);
+
+ /*
+ * Write the configuration to disk. We need to do the traditional
+ * 'write to temporary file, sync, move over original' to make sure we
+ * always have a consistent view of the data.
+ */
+ (void) snprintf(pathname, sizeof (pathname), "%s/%s", spa_config_dir,
+ ZPOOL_CACHE_TMP);
+
+ if (vn_open(pathname, UIO_SYSSPACE, oflags, 0644, &vp, CRCREAT, 0) != 0)
+ goto out;
+
+ if (vn_rdwr(UIO_WRITE, vp, buf, buflen, 0, UIO_SYSSPACE,
+ 0, RLIM64_INFINITY, kcred, NULL) == 0 &&
+ VOP_FSYNC(vp, FSYNC, kcred) == 0) {
+ (void) snprintf(pathname2, sizeof (pathname2), "%s/%s",
+ spa_config_dir, ZPOOL_CACHE_FILE);
+ (void) vn_rename(pathname, pathname2, UIO_SYSSPACE);
+ }
+
+ (void) VOP_CLOSE(vp, oflags, 1, 0, kcred);
+ VN_RELE(vp);
+
+out:
+ (void) vn_remove(pathname, UIO_SYSSPACE, RMFILE);
+ spa_config_generation++;
+
+ kmem_free(buf, buflen);
+ nvlist_free(config);
+}
+
+/*
+ * Sigh. Inside a local zone, we don't have access to /etc/zfs/zpool.cache,
+ * and we don't want to allow the local zone to see all the pools anyway.
+ * So we have to invent the ZFS_IOC_CONFIG ioctl to grab the configuration
+ * information for all pool visible within the zone.
+ */
+nvlist_t *
+spa_all_configs(uint64_t *generation)
+{
+ nvlist_t *pools;
+ spa_t *spa;
+
+ if (*generation == spa_config_generation)
+ return (NULL);
+
+ VERIFY(nvlist_alloc(&pools, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+
+ spa = NULL;
+ mutex_enter(&spa_namespace_lock);
+ while ((spa = spa_next(spa)) != NULL) {
+ if (INGLOBALZONE(curproc) ||
+ zone_dataset_visible(spa_name(spa), NULL)) {
+ mutex_enter(&spa->spa_config_cache_lock);
+ VERIFY(nvlist_add_nvlist(pools, spa_name(spa),
+ spa->spa_config) == 0);
+ mutex_exit(&spa->spa_config_cache_lock);
+ }
+ }
+ mutex_exit(&spa_namespace_lock);
+
+ *generation = spa_config_generation;
+
+ return (pools);
+}
+
+void
+spa_config_set(spa_t *spa, nvlist_t *config)
+{
+ mutex_enter(&spa->spa_config_cache_lock);
+ if (spa->spa_config != NULL)
+ nvlist_free(spa->spa_config);
+ spa->spa_config = config;
+ mutex_exit(&spa->spa_config_cache_lock);
+}
+
+/*
+ * Generate the pool's configuration based on the current in-core state.
+ * We infer whether to generate a complete config or just one top-level config
+ * based on whether vd is the root vdev.
+ */
+nvlist_t *
+spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg, int getstats)
+{
+ nvlist_t *config, *nvroot;
+ vdev_t *rvd = spa->spa_root_vdev;
+ unsigned long hostid = 0;
+
+ ASSERT(spa_config_held(spa, RW_READER));
+
+ if (vd == NULL)
+ vd = rvd;
+
+ /*
+ * If txg is -1, report the current value of spa->spa_config_txg.
+ */
+ if (txg == -1ULL)
+ txg = spa->spa_config_txg;
+
+ VERIFY(nvlist_alloc(&config, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+
+ VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_VERSION,
+ spa_version(spa)) == 0);
+ VERIFY(nvlist_add_string(config, ZPOOL_CONFIG_POOL_NAME,
+ spa_name(spa)) == 0);
+ VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_STATE,
+ spa_state(spa)) == 0);
+ VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_TXG,
+ txg) == 0);
+ VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_POOL_GUID,
+ spa_guid(spa)) == 0);
+ (void) ddi_strtoul(hw_serial, NULL, 10, &hostid);
+ VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_HOSTID,
+ hostid) == 0);
+ VERIFY(nvlist_add_string(config, ZPOOL_CONFIG_HOSTNAME,
+ utsname.nodename) == 0);
+
+ if (vd != rvd) {
+ VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_TOP_GUID,
+ vd->vdev_top->vdev_guid) == 0);
+ VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_GUID,
+ vd->vdev_guid) == 0);
+ if (vd->vdev_isspare)
+ VERIFY(nvlist_add_uint64(config, ZPOOL_CONFIG_IS_SPARE,
+ 1ULL) == 0);
+ vd = vd->vdev_top; /* label contains top config */
+ }
+
+ nvroot = vdev_config_generate(spa, vd, getstats, B_FALSE);
+ VERIFY(nvlist_add_nvlist(config, ZPOOL_CONFIG_VDEV_TREE, nvroot) == 0);
+ nvlist_free(nvroot);
+
+ return (config);
+}
+
+/*
+ * Update all disk labels, generate a fresh config based on the current
+ * in-core state, and sync the global config cache.
+ */
+void
+spa_config_update(spa_t *spa, int what)
+{
+ vdev_t *rvd = spa->spa_root_vdev;
+ uint64_t txg;
+ int c;
+
+ ASSERT(MUTEX_HELD(&spa_namespace_lock));
+
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ txg = spa_last_synced_txg(spa) + 1;
+ if (what == SPA_CONFIG_UPDATE_POOL) {
+ vdev_config_dirty(rvd);
+ } else {
+ /*
+ * If we have top-level vdevs that were added but have
+ * not yet been prepared for allocation, do that now.
+ * (It's safe now because the config cache is up to date,
+ * so it will be able to translate the new DVAs.)
+ * See comments in spa_vdev_add() for full details.
+ */
+ for (c = 0; c < rvd->vdev_children; c++) {
+ vdev_t *tvd = rvd->vdev_child[c];
+ if (tvd->vdev_ms_array == 0) {
+ vdev_init(tvd, txg);
+ vdev_config_dirty(tvd);
+ }
+ }
+ }
+ spa_config_exit(spa, FTAG);
+
+ /*
+ * Wait for the mosconfig to be regenerated and synced.
+ */
+ txg_wait_synced(spa->spa_dsl_pool, txg);
+
+ /*
+ * Update the global config cache to reflect the new mosconfig.
+ */
+ spa_config_sync();
+
+ if (what == SPA_CONFIG_UPDATE_POOL)
+ spa_config_update(spa, SPA_CONFIG_UPDATE_VDEVS);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c b/sys/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c
new file mode 100644
index 0000000..c52acaf
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/spa_errlog.c
@@ -0,0 +1,440 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Routines to manage the on-disk persistent error log.
+ *
+ * Each pool stores a log of all logical data errors seen during normal
+ * operation. This is actually the union of two distinct logs: the last log,
+ * and the current log. All errors seen are logged to the current log. When a
+ * scrub completes, the current log becomes the last log, the last log is thrown
+ * out, and the current log is reinitialized. This way, if an error is somehow
+ * corrected, a new scrub will show that that it no longer exists, and will be
+ * deleted from the log when the scrub completes.
+ *
+ * The log is stored using a ZAP object whose key is a string form of the
+ * zbookmark tuple (objset, object, level, blkid), and whose contents is an
+ * optional 'objset:object' human-readable string describing the data. When an
+ * error is first logged, this string will be empty, indicating that no name is
+ * known. This prevents us from having to issue a potentially large amount of
+ * I/O to discover the object name during an error path. Instead, we do the
+ * calculation when the data is requested, storing the result so future queries
+ * will be faster.
+ *
+ * This log is then shipped into an nvlist where the key is the dataset name and
+ * the value is the object name. Userland is then responsible for uniquifying
+ * this list and displaying it to the user.
+ */
+
+#include <sys/dmu_tx.h>
+#include <sys/spa.h>
+#include <sys/spa_impl.h>
+#include <sys/zap.h>
+#include <sys/zio.h>
+
+/*
+ * This is a stripped-down version of strtoull, suitable only for converting
+ * lowercase hexidecimal numbers that don't overflow.
+ */
+#ifdef _KERNEL
+static uint64_t
+_strtonum(char *str, char **nptr)
+{
+ uint64_t val = 0;
+ char c;
+ int digit;
+
+ while ((c = *str) != '\0') {
+ if (c >= '0' && c <= '9')
+ digit = c - '0';
+ else if (c >= 'a' && c <= 'f')
+ digit = 10 + c - 'a';
+ else
+ break;
+
+ val *= 16;
+ val += digit;
+
+ str++;
+ }
+
+ *nptr = str;
+
+ return (val);
+}
+#endif
+
+/*
+ * Convert a bookmark to a string.
+ */
+static void
+bookmark_to_name(zbookmark_t *zb, char *buf, size_t len)
+{
+ (void) snprintf(buf, len, "%llx:%llx:%llx:%llx",
+ (u_longlong_t)zb->zb_objset, (u_longlong_t)zb->zb_object,
+ (u_longlong_t)zb->zb_level, (u_longlong_t)zb->zb_blkid);
+}
+
+/*
+ * Convert a string to a bookmark
+ */
+#ifdef _KERNEL
+static void
+name_to_bookmark(char *buf, zbookmark_t *zb)
+{
+ zb->zb_objset = _strtonum(buf, &buf);
+ ASSERT(*buf == ':');
+ zb->zb_object = _strtonum(buf + 1, &buf);
+ ASSERT(*buf == ':');
+ zb->zb_level = (int)_strtonum(buf + 1, &buf);
+ ASSERT(*buf == ':');
+ zb->zb_blkid = _strtonum(buf + 1, &buf);
+ ASSERT(*buf == '\0');
+}
+#endif
+
+/*
+ * Log an uncorrectable error to the persistent error log. We add it to the
+ * spa's list of pending errors. The changes are actually synced out to disk
+ * during spa_errlog_sync().
+ */
+void
+spa_log_error(spa_t *spa, zio_t *zio)
+{
+ zbookmark_t *zb = &zio->io_logical->io_bookmark;
+ spa_error_entry_t search;
+ spa_error_entry_t *new;
+ avl_tree_t *tree;
+ avl_index_t where;
+
+ /*
+ * If we are trying to import a pool, ignore any errors, as we won't be
+ * writing to the pool any time soon.
+ */
+ if (spa->spa_load_state == SPA_LOAD_TRYIMPORT)
+ return;
+
+ mutex_enter(&spa->spa_errlist_lock);
+
+ /*
+ * If we have had a request to rotate the log, log it to the next list
+ * instead of the current one.
+ */
+ if (spa->spa_scrub_active || spa->spa_scrub_finished)
+ tree = &spa->spa_errlist_scrub;
+ else
+ tree = &spa->spa_errlist_last;
+
+ search.se_bookmark = *zb;
+ if (avl_find(tree, &search, &where) != NULL) {
+ mutex_exit(&spa->spa_errlist_lock);
+ return;
+ }
+
+ new = kmem_zalloc(sizeof (spa_error_entry_t), KM_SLEEP);
+ new->se_bookmark = *zb;
+ avl_insert(tree, new, where);
+
+ mutex_exit(&spa->spa_errlist_lock);
+}
+
+/*
+ * Return the number of errors currently in the error log. This is actually the
+ * sum of both the last log and the current log, since we don't know the union
+ * of these logs until we reach userland.
+ */
+uint64_t
+spa_get_errlog_size(spa_t *spa)
+{
+ uint64_t total = 0, count;
+
+ mutex_enter(&spa->spa_errlog_lock);
+ if (spa->spa_errlog_scrub != 0 &&
+ zap_count(spa->spa_meta_objset, spa->spa_errlog_scrub,
+ &count) == 0)
+ total += count;
+
+ if (spa->spa_errlog_last != 0 && !spa->spa_scrub_finished &&
+ zap_count(spa->spa_meta_objset, spa->spa_errlog_last,
+ &count) == 0)
+ total += count;
+ mutex_exit(&spa->spa_errlog_lock);
+
+ mutex_enter(&spa->spa_errlist_lock);
+ total += avl_numnodes(&spa->spa_errlist_last);
+ total += avl_numnodes(&spa->spa_errlist_scrub);
+ mutex_exit(&spa->spa_errlist_lock);
+
+ return (total);
+}
+
+#ifdef _KERNEL
+static int
+process_error_log(spa_t *spa, uint64_t obj, void *addr, size_t *count)
+{
+ zap_cursor_t zc;
+ zap_attribute_t za;
+ zbookmark_t zb;
+
+ if (obj == 0)
+ return (0);
+
+ for (zap_cursor_init(&zc, spa->spa_meta_objset, obj);
+ zap_cursor_retrieve(&zc, &za) == 0;
+ zap_cursor_advance(&zc)) {
+
+ if (*count == 0) {
+ zap_cursor_fini(&zc);
+ return (ENOMEM);
+ }
+
+ name_to_bookmark(za.za_name, &zb);
+
+ if (copyout(&zb, (char *)addr +
+ (*count - 1) * sizeof (zbookmark_t),
+ sizeof (zbookmark_t)) != 0)
+ return (EFAULT);
+
+ *count -= 1;
+ }
+
+ zap_cursor_fini(&zc);
+
+ return (0);
+}
+
+static int
+process_error_list(avl_tree_t *list, void *addr, size_t *count)
+{
+ spa_error_entry_t *se;
+
+ for (se = avl_first(list); se != NULL; se = AVL_NEXT(list, se)) {
+
+ if (*count == 0)
+ return (ENOMEM);
+
+ if (copyout(&se->se_bookmark, (char *)addr +
+ (*count - 1) * sizeof (zbookmark_t),
+ sizeof (zbookmark_t)) != 0)
+ return (EFAULT);
+
+ *count -= 1;
+ }
+
+ return (0);
+}
+#endif
+
+/*
+ * Copy all known errors to userland as an array of bookmarks. This is
+ * actually a union of the on-disk last log and current log, as well as any
+ * pending error requests.
+ *
+ * Because the act of reading the on-disk log could cause errors to be
+ * generated, we have two separate locks: one for the error log and one for the
+ * in-core error lists. We only need the error list lock to log and error, so
+ * we grab the error log lock while we read the on-disk logs, and only pick up
+ * the error list lock when we are finished.
+ */
+int
+spa_get_errlog(spa_t *spa, void *uaddr, size_t *count)
+{
+ int ret = 0;
+
+#ifdef _KERNEL
+ mutex_enter(&spa->spa_errlog_lock);
+
+ ret = process_error_log(spa, spa->spa_errlog_scrub, uaddr, count);
+
+ if (!ret && !spa->spa_scrub_finished)
+ ret = process_error_log(spa, spa->spa_errlog_last, uaddr,
+ count);
+
+ mutex_enter(&spa->spa_errlist_lock);
+ if (!ret)
+ ret = process_error_list(&spa->spa_errlist_scrub, uaddr,
+ count);
+ if (!ret)
+ ret = process_error_list(&spa->spa_errlist_last, uaddr,
+ count);
+ mutex_exit(&spa->spa_errlist_lock);
+
+ mutex_exit(&spa->spa_errlog_lock);
+#endif
+
+ return (ret);
+}
+
+/*
+ * Called when a scrub completes. This simply set a bit which tells which AVL
+ * tree to add new errors. spa_errlog_sync() is responsible for actually
+ * syncing the changes to the underlying objects.
+ */
+void
+spa_errlog_rotate(spa_t *spa)
+{
+ mutex_enter(&spa->spa_errlist_lock);
+
+ ASSERT(!spa->spa_scrub_finished);
+ spa->spa_scrub_finished = B_TRUE;
+
+ mutex_exit(&spa->spa_errlist_lock);
+}
+
+/*
+ * Discard any pending errors from the spa_t. Called when unloading a faulted
+ * pool, as the errors encountered during the open cannot be synced to disk.
+ */
+void
+spa_errlog_drain(spa_t *spa)
+{
+ spa_error_entry_t *se;
+ void *cookie;
+
+ mutex_enter(&spa->spa_errlist_lock);
+
+ cookie = NULL;
+ while ((se = avl_destroy_nodes(&spa->spa_errlist_last,
+ &cookie)) != NULL)
+ kmem_free(se, sizeof (spa_error_entry_t));
+ cookie = NULL;
+ while ((se = avl_destroy_nodes(&spa->spa_errlist_scrub,
+ &cookie)) != NULL)
+ kmem_free(se, sizeof (spa_error_entry_t));
+
+ mutex_exit(&spa->spa_errlist_lock);
+}
+
+/*
+ * Process a list of errors into the current on-disk log.
+ */
+static void
+sync_error_list(spa_t *spa, avl_tree_t *t, uint64_t *obj, dmu_tx_t *tx)
+{
+ spa_error_entry_t *se;
+ char buf[64];
+ void *cookie;
+
+ if (avl_numnodes(t) != 0) {
+ /* create log if necessary */
+ if (*obj == 0)
+ *obj = zap_create(spa->spa_meta_objset,
+ DMU_OT_ERROR_LOG, DMU_OT_NONE,
+ 0, tx);
+
+ /* add errors to the current log */
+ for (se = avl_first(t); se != NULL; se = AVL_NEXT(t, se)) {
+ char *name = se->se_name ? se->se_name : "";
+
+ bookmark_to_name(&se->se_bookmark, buf, sizeof (buf));
+
+ (void) zap_update(spa->spa_meta_objset,
+ *obj, buf, 1, strlen(name) + 1, name, tx);
+ }
+
+ /* purge the error list */
+ cookie = NULL;
+ while ((se = avl_destroy_nodes(t, &cookie)) != NULL)
+ kmem_free(se, sizeof (spa_error_entry_t));
+ }
+}
+
+/*
+ * Sync the error log out to disk. This is a little tricky because the act of
+ * writing the error log requires the spa_errlist_lock. So, we need to lock the
+ * error lists, take a copy of the lists, and then reinitialize them. Then, we
+ * drop the error list lock and take the error log lock, at which point we
+ * do the errlog processing. Then, if we encounter an I/O error during this
+ * process, we can successfully add the error to the list. Note that this will
+ * result in the perpetual recycling of errors, but it is an unlikely situation
+ * and not a performance critical operation.
+ */
+void
+spa_errlog_sync(spa_t *spa, uint64_t txg)
+{
+ dmu_tx_t *tx;
+ avl_tree_t scrub, last;
+ int scrub_finished;
+
+ mutex_enter(&spa->spa_errlist_lock);
+
+ /*
+ * Bail out early under normal circumstances.
+ */
+ if (avl_numnodes(&spa->spa_errlist_scrub) == 0 &&
+ avl_numnodes(&spa->spa_errlist_last) == 0 &&
+ !spa->spa_scrub_finished) {
+ mutex_exit(&spa->spa_errlist_lock);
+ return;
+ }
+
+ spa_get_errlists(spa, &last, &scrub);
+ scrub_finished = spa->spa_scrub_finished;
+ spa->spa_scrub_finished = B_FALSE;
+
+ mutex_exit(&spa->spa_errlist_lock);
+ mutex_enter(&spa->spa_errlog_lock);
+
+ tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
+
+ /*
+ * Sync out the current list of errors.
+ */
+ sync_error_list(spa, &last, &spa->spa_errlog_last, tx);
+
+ /*
+ * Rotate the log if necessary.
+ */
+ if (scrub_finished) {
+ if (spa->spa_errlog_last != 0)
+ VERIFY(dmu_object_free(spa->spa_meta_objset,
+ spa->spa_errlog_last, tx) == 0);
+ spa->spa_errlog_last = spa->spa_errlog_scrub;
+ spa->spa_errlog_scrub = 0;
+
+ sync_error_list(spa, &scrub, &spa->spa_errlog_last, tx);
+ }
+
+ /*
+ * Sync out any pending scrub errors.
+ */
+ sync_error_list(spa, &scrub, &spa->spa_errlog_scrub, tx);
+
+ /*
+ * Update the MOS to reflect the new values.
+ */
+ (void) zap_update(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_POOL_ERRLOG_LAST, sizeof (uint64_t), 1,
+ &spa->spa_errlog_last, tx);
+ (void) zap_update(spa->spa_meta_objset, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_POOL_ERRLOG_SCRUB, sizeof (uint64_t), 1,
+ &spa->spa_errlog_scrub, tx);
+
+ dmu_tx_commit(tx);
+
+ mutex_exit(&spa->spa_errlog_lock);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/spa_history.c b/sys/contrib/opensolaris/uts/common/fs/zfs/spa_history.c
new file mode 100644
index 0000000..6642801
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/spa_history.c
@@ -0,0 +1,354 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa_impl.h>
+#include <sys/zap.h>
+#include <sys/dsl_synctask.h>
+
+/*
+ * Routines to manage the on-disk history log.
+ *
+ * The history log is stored as a dmu object containing
+ * <packed record length, record nvlist> tuples.
+ *
+ * Where "record nvlist" is a nvlist containing uint64_ts and strings, and
+ * "packed record length" is the packed length of the "record nvlist" stored
+ * as a little endian uint64_t.
+ *
+ * The log is implemented as a ring buffer, though the original creation
+ * of the pool ('zpool create') is never overwritten.
+ *
+ * The history log is tracked as object 'spa_t::spa_history'. The bonus buffer
+ * of 'spa_history' stores the offsets for logging/retrieving history as
+ * 'spa_history_phys_t'. 'sh_pool_create_len' is the ending offset in bytes of
+ * where the 'zpool create' record is stored. This allows us to never
+ * overwrite the original creation of the pool. 'sh_phys_max_off' is the
+ * physical ending offset in bytes of the log. This tells you the length of
+ * the buffer. 'sh_eof' is the logical EOF (in bytes). Whenever a record
+ * is added, 'sh_eof' is incremented by the the size of the record.
+ * 'sh_eof' is never decremented. 'sh_bof' is the logical BOF (in bytes).
+ * This is where the consumer should start reading from after reading in
+ * the 'zpool create' portion of the log.
+ *
+ * 'sh_records_lost' keeps track of how many records have been overwritten
+ * and permanently lost.
+ */
+
+typedef enum history_log_type {
+ LOG_CMD_CREATE,
+ LOG_CMD_NO_CREATE
+} history_log_type_t;
+
+typedef struct history_arg {
+ const char *ha_history_str;
+ history_log_type_t ha_log_type;
+} history_arg_t;
+
+/* convert a logical offset to physical */
+static uint64_t
+spa_history_log_to_phys(uint64_t log_off, spa_history_phys_t *shpp)
+{
+ uint64_t phys_len;
+
+ phys_len = shpp->sh_phys_max_off - shpp->sh_pool_create_len;
+ return ((log_off - shpp->sh_pool_create_len) % phys_len
+ + shpp->sh_pool_create_len);
+}
+
+void
+spa_history_create_obj(spa_t *spa, dmu_tx_t *tx)
+{
+ dmu_buf_t *dbp;
+ spa_history_phys_t *shpp;
+ objset_t *mos = spa->spa_meta_objset;
+
+ ASSERT(spa->spa_history == 0);
+ spa->spa_history = dmu_object_alloc(mos, DMU_OT_SPA_HISTORY,
+ SPA_MAXBLOCKSIZE, DMU_OT_SPA_HISTORY_OFFSETS,
+ sizeof (spa_history_phys_t), tx);
+
+ VERIFY(zap_add(mos, DMU_POOL_DIRECTORY_OBJECT,
+ DMU_POOL_HISTORY, sizeof (uint64_t), 1,
+ &spa->spa_history, tx) == 0);
+
+ VERIFY(0 == dmu_bonus_hold(mos, spa->spa_history, FTAG, &dbp));
+ ASSERT(dbp->db_size >= sizeof (spa_history_phys_t));
+
+ shpp = dbp->db_data;
+ dmu_buf_will_dirty(dbp, tx);
+
+ /*
+ * Figure out maximum size of history log. We set it at
+ * 1% of pool size, with a max of 32MB and min of 128KB.
+ */
+ shpp->sh_phys_max_off = spa_get_dspace(spa) / 100;
+ shpp->sh_phys_max_off = MIN(shpp->sh_phys_max_off, 32<<20);
+ shpp->sh_phys_max_off = MAX(shpp->sh_phys_max_off, 128<<10);
+
+ dmu_buf_rele(dbp, FTAG);
+}
+
+/*
+ * Change 'sh_bof' to the beginning of the next record.
+ */
+static int
+spa_history_advance_bof(spa_t *spa, spa_history_phys_t *shpp)
+{
+ objset_t *mos = spa->spa_meta_objset;
+ uint64_t firstread, reclen, phys_bof;
+ char buf[sizeof (reclen)];
+ int err;
+
+ phys_bof = spa_history_log_to_phys(shpp->sh_bof, shpp);
+ firstread = MIN(sizeof (reclen), shpp->sh_phys_max_off - phys_bof);
+
+ if ((err = dmu_read(mos, spa->spa_history, phys_bof, firstread,
+ buf)) != 0)
+ return (err);
+ if (firstread != sizeof (reclen)) {
+ if ((err = dmu_read(mos, spa->spa_history,
+ shpp->sh_pool_create_len, sizeof (reclen) - firstread,
+ buf + firstread)) != 0)
+ return (err);
+ }
+
+ reclen = LE_64(*((uint64_t *)buf));
+ shpp->sh_bof += reclen + sizeof (reclen);
+ shpp->sh_records_lost++;
+ return (0);
+}
+
+static int
+spa_history_write(spa_t *spa, void *buf, uint64_t len, spa_history_phys_t *shpp,
+ dmu_tx_t *tx)
+{
+ uint64_t firstwrite, phys_eof;
+ objset_t *mos = spa->spa_meta_objset;
+ int err;
+
+ ASSERT(MUTEX_HELD(&spa->spa_history_lock));
+
+ /* see if we need to reset logical BOF */
+ while (shpp->sh_phys_max_off - shpp->sh_pool_create_len -
+ (shpp->sh_eof - shpp->sh_bof) <= len) {
+ if ((err = spa_history_advance_bof(spa, shpp)) != 0)
+ return (err);
+ }
+
+ phys_eof = spa_history_log_to_phys(shpp->sh_eof, shpp);
+ firstwrite = MIN(len, shpp->sh_phys_max_off - phys_eof);
+ shpp->sh_eof += len;
+ dmu_write(mos, spa->spa_history, phys_eof, firstwrite, buf, tx);
+
+ len -= firstwrite;
+ if (len > 0) {
+ /* write out the rest at the beginning of physical file */
+ dmu_write(mos, spa->spa_history, shpp->sh_pool_create_len,
+ len, (char *)buf + firstwrite, tx);
+ }
+
+ return (0);
+}
+
+/*
+ * Write out a history event.
+ */
+void
+spa_history_log_sync(void *arg1, void *arg2, dmu_tx_t *tx)
+{
+ spa_t *spa = arg1;
+ history_arg_t *hap = arg2;
+ const char *history_str = hap->ha_history_str;
+ objset_t *mos = spa->spa_meta_objset;
+ dmu_buf_t *dbp;
+ spa_history_phys_t *shpp;
+ size_t reclen;
+ uint64_t le_len;
+ nvlist_t *nvrecord;
+ char *record_packed = NULL;
+ int ret;
+
+ if (history_str == NULL)
+ return;
+
+ /*
+ * If we have an older pool that doesn't have a command
+ * history object, create it now.
+ */
+ mutex_enter(&spa->spa_history_lock);
+ if (!spa->spa_history)
+ spa_history_create_obj(spa, tx);
+ mutex_exit(&spa->spa_history_lock);
+
+ /*
+ * Get the offset of where we need to write via the bonus buffer.
+ * Update the offset when the write completes.
+ */
+ VERIFY(0 == dmu_bonus_hold(mos, spa->spa_history, FTAG, &dbp));
+ shpp = dbp->db_data;
+
+ dmu_buf_will_dirty(dbp, tx);
+
+#ifdef ZFS_DEBUG
+ {
+ dmu_object_info_t doi;
+ dmu_object_info_from_db(dbp, &doi);
+ ASSERT3U(doi.doi_bonus_type, ==, DMU_OT_SPA_HISTORY_OFFSETS);
+ }
+#endif
+
+ /* construct a nvlist of the current time and cmd string */
+ VERIFY(nvlist_alloc(&nvrecord, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+ VERIFY(nvlist_add_uint64(nvrecord, ZPOOL_HIST_TIME,
+ gethrestime_sec()) == 0);
+ VERIFY(nvlist_add_string(nvrecord, ZPOOL_HIST_CMD, history_str) == 0);
+ VERIFY(nvlist_pack(nvrecord, &record_packed, &reclen,
+ NV_ENCODE_XDR, KM_SLEEP) == 0);
+
+ mutex_enter(&spa->spa_history_lock);
+ if (hap->ha_log_type == LOG_CMD_CREATE)
+ VERIFY(shpp->sh_eof == shpp->sh_pool_create_len);
+
+ /* write out the packed length as little endian */
+ le_len = LE_64((uint64_t)reclen);
+ ret = spa_history_write(spa, &le_len, sizeof (le_len), shpp, tx);
+ if (!ret)
+ ret = spa_history_write(spa, record_packed, reclen, shpp, tx);
+
+ if (!ret && hap->ha_log_type == LOG_CMD_CREATE) {
+ shpp->sh_pool_create_len += sizeof (le_len) + reclen;
+ shpp->sh_bof = shpp->sh_pool_create_len;
+ }
+
+ mutex_exit(&spa->spa_history_lock);
+ nvlist_free(nvrecord);
+ kmem_free(record_packed, reclen);
+ dmu_buf_rele(dbp, FTAG);
+}
+
+/*
+ * Write out a history event.
+ */
+int
+spa_history_log(spa_t *spa, const char *history_str, uint64_t pool_create)
+{
+ history_arg_t ha;
+
+ ha.ha_history_str = history_str;
+ ha.ha_log_type = pool_create ? LOG_CMD_CREATE : LOG_CMD_NO_CREATE;
+ return (dsl_sync_task_do(spa_get_dsl(spa), NULL, spa_history_log_sync,
+ spa, &ha, 0));
+}
+
+/*
+ * Read out the command history.
+ */
+int
+spa_history_get(spa_t *spa, uint64_t *offp, uint64_t *len, char *buf)
+{
+ objset_t *mos = spa->spa_meta_objset;
+ dmu_buf_t *dbp;
+ uint64_t read_len, phys_read_off, phys_eof;
+ uint64_t leftover = 0;
+ spa_history_phys_t *shpp;
+ int err;
+
+ /*
+ * If the command history doesn't exist (older pool),
+ * that's ok, just return ENOENT.
+ */
+ if (!spa->spa_history)
+ return (ENOENT);
+
+ if ((err = dmu_bonus_hold(mos, spa->spa_history, FTAG, &dbp)) != 0)
+ return (err);
+ shpp = dbp->db_data;
+
+#ifdef ZFS_DEBUG
+ {
+ dmu_object_info_t doi;
+ dmu_object_info_from_db(dbp, &doi);
+ ASSERT3U(doi.doi_bonus_type, ==, DMU_OT_SPA_HISTORY_OFFSETS);
+ }
+#endif
+
+ mutex_enter(&spa->spa_history_lock);
+ phys_eof = spa_history_log_to_phys(shpp->sh_eof, shpp);
+
+ if (*offp < shpp->sh_pool_create_len) {
+ /* read in just the zpool create history */
+ phys_read_off = *offp;
+ read_len = MIN(*len, shpp->sh_pool_create_len -
+ phys_read_off);
+ } else {
+ /*
+ * Need to reset passed in offset to BOF if the passed in
+ * offset has since been overwritten.
+ */
+ *offp = MAX(*offp, shpp->sh_bof);
+ phys_read_off = spa_history_log_to_phys(*offp, shpp);
+
+ /*
+ * Read up to the minimum of what the user passed down or
+ * the EOF (physical or logical). If we hit physical EOF,
+ * use 'leftover' to read from the physical BOF.
+ */
+ if (phys_read_off <= phys_eof) {
+ read_len = MIN(*len, phys_eof - phys_read_off);
+ } else {
+ read_len = MIN(*len,
+ shpp->sh_phys_max_off - phys_read_off);
+ if (phys_read_off + *len > shpp->sh_phys_max_off) {
+ leftover = MIN(*len - read_len,
+ phys_eof - shpp->sh_pool_create_len);
+ }
+ }
+ }
+
+ /* offset for consumer to use next */
+ *offp += read_len + leftover;
+
+ /* tell the consumer how much you actually read */
+ *len = read_len + leftover;
+
+ if (read_len == 0) {
+ mutex_exit(&spa->spa_history_lock);
+ dmu_buf_rele(dbp, FTAG);
+ return (0);
+ }
+
+ err = dmu_read(mos, spa->spa_history, phys_read_off, read_len, buf);
+ if (leftover && err == 0) {
+ err = dmu_read(mos, spa->spa_history, shpp->sh_pool_create_len,
+ leftover, buf + read_len);
+ }
+ mutex_exit(&spa->spa_history_lock);
+
+ dmu_buf_rele(dbp, FTAG);
+ return (err);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c b/sys/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
new file mode 100644
index 0000000..5da1f96
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/spa_misc.c
@@ -0,0 +1,1130 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa_impl.h>
+#include <sys/zio.h>
+#include <sys/zio_checksum.h>
+#include <sys/zio_compress.h>
+#include <sys/dmu.h>
+#include <sys/dmu_tx.h>
+#include <sys/zap.h>
+#include <sys/zil.h>
+#include <sys/vdev_impl.h>
+#include <sys/metaslab.h>
+#include <sys/uberblock_impl.h>
+#include <sys/txg.h>
+#include <sys/avl.h>
+#include <sys/unique.h>
+#include <sys/dsl_pool.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_prop.h>
+#include <sys/fs/zfs.h>
+
+/*
+ * SPA locking
+ *
+ * There are four basic locks for managing spa_t structures:
+ *
+ * spa_namespace_lock (global mutex)
+ *
+ * This lock must be acquired to do any of the following:
+ *
+ * - Lookup a spa_t by name
+ * - Add or remove a spa_t from the namespace
+ * - Increase spa_refcount from non-zero
+ * - Check if spa_refcount is zero
+ * - Rename a spa_t
+ * - add/remove/attach/detach devices
+ * - Held for the duration of create/destroy/import/export
+ *
+ * It does not need to handle recursion. A create or destroy may
+ * reference objects (files or zvols) in other pools, but by
+ * definition they must have an existing reference, and will never need
+ * to lookup a spa_t by name.
+ *
+ * spa_refcount (per-spa refcount_t protected by mutex)
+ *
+ * This reference count keep track of any active users of the spa_t. The
+ * spa_t cannot be destroyed or freed while this is non-zero. Internally,
+ * the refcount is never really 'zero' - opening a pool implicitly keeps
+ * some references in the DMU. Internally we check against SPA_MINREF, but
+ * present the image of a zero/non-zero value to consumers.
+ *
+ * spa_config_lock (per-spa crazy rwlock)
+ *
+ * This SPA special is a recursive rwlock, capable of being acquired from
+ * asynchronous threads. It has protects the spa_t from config changes,
+ * and must be held in the following circumstances:
+ *
+ * - RW_READER to perform I/O to the spa
+ * - RW_WRITER to change the vdev config
+ *
+ * spa_config_cache_lock (per-spa mutex)
+ *
+ * This mutex prevents the spa_config nvlist from being updated. No
+ * other locks are required to obtain this lock, although implicitly you
+ * must have the namespace lock or non-zero refcount to have any kind
+ * of spa_t pointer at all.
+ *
+ * The locking order is fairly straightforward:
+ *
+ * spa_namespace_lock -> spa_refcount
+ *
+ * The namespace lock must be acquired to increase the refcount from 0
+ * or to check if it is zero.
+ *
+ * spa_refcount -> spa_config_lock
+ *
+ * There must be at least one valid reference on the spa_t to acquire
+ * the config lock.
+ *
+ * spa_namespace_lock -> spa_config_lock
+ *
+ * The namespace lock must always be taken before the config lock.
+ *
+ *
+ * The spa_namespace_lock and spa_config_cache_lock can be acquired directly and
+ * are globally visible.
+ *
+ * The namespace is manipulated using the following functions, all which require
+ * the spa_namespace_lock to be held.
+ *
+ * spa_lookup() Lookup a spa_t by name.
+ *
+ * spa_add() Create a new spa_t in the namespace.
+ *
+ * spa_remove() Remove a spa_t from the namespace. This also
+ * frees up any memory associated with the spa_t.
+ *
+ * spa_next() Returns the next spa_t in the system, or the
+ * first if NULL is passed.
+ *
+ * spa_evict_all() Shutdown and remove all spa_t structures in
+ * the system.
+ *
+ * spa_guid_exists() Determine whether a pool/device guid exists.
+ *
+ * The spa_refcount is manipulated using the following functions:
+ *
+ * spa_open_ref() Adds a reference to the given spa_t. Must be
+ * called with spa_namespace_lock held if the
+ * refcount is currently zero.
+ *
+ * spa_close() Remove a reference from the spa_t. This will
+ * not free the spa_t or remove it from the
+ * namespace. No locking is required.
+ *
+ * spa_refcount_zero() Returns true if the refcount is currently
+ * zero. Must be called with spa_namespace_lock
+ * held.
+ *
+ * The spa_config_lock is manipulated using the following functions:
+ *
+ * spa_config_enter() Acquire the config lock as RW_READER or
+ * RW_WRITER. At least one reference on the spa_t
+ * must exist.
+ *
+ * spa_config_exit() Release the config lock.
+ *
+ * spa_config_held() Returns true if the config lock is currently
+ * held in the given state.
+ *
+ * The vdev configuration is protected by spa_vdev_enter() / spa_vdev_exit().
+ *
+ * spa_vdev_enter() Acquire the namespace lock and the config lock
+ * for writing.
+ *
+ * spa_vdev_exit() Release the config lock, wait for all I/O
+ * to complete, sync the updated configs to the
+ * cache, and release the namespace lock.
+ *
+ * The spa_name() function also requires either the spa_namespace_lock
+ * or the spa_config_lock, as both are needed to do a rename. spa_rename() is
+ * also implemented within this file since is requires manipulation of the
+ * namespace.
+ */
+
+static avl_tree_t spa_namespace_avl;
+kmutex_t spa_namespace_lock;
+static kcondvar_t spa_namespace_cv;
+static int spa_active_count;
+int spa_max_replication_override = SPA_DVAS_PER_BP;
+
+static kmutex_t spa_spare_lock;
+static avl_tree_t spa_spare_avl;
+
+kmem_cache_t *spa_buffer_pool;
+int spa_mode;
+
+#ifdef ZFS_DEBUG
+int zfs_flags = ~0;
+#else
+int zfs_flags = 0;
+#endif
+
+/*
+ * zfs_recover can be set to nonzero to attempt to recover from
+ * otherwise-fatal errors, typically caused by on-disk corruption. When
+ * set, calls to zfs_panic_recover() will turn into warning messages.
+ */
+int zfs_recover = 0;
+SYSCTL_DECL(_vfs_zfs);
+TUNABLE_INT("vfs.zfs.recover", &zfs_recover);
+SYSCTL_INT(_vfs_zfs, OID_AUTO, recover, CTLFLAG_RDTUN, &zfs_recover, 0,
+ "Try to recover from otherwise-fatal errors.");
+
+#define SPA_MINREF 5 /* spa_refcnt for an open-but-idle pool */
+
+/*
+ * ==========================================================================
+ * SPA namespace functions
+ * ==========================================================================
+ */
+
+/*
+ * Lookup the named spa_t in the AVL tree. The spa_namespace_lock must be held.
+ * Returns NULL if no matching spa_t is found.
+ */
+spa_t *
+spa_lookup(const char *name)
+{
+ spa_t search, *spa;
+ avl_index_t where;
+
+ ASSERT(MUTEX_HELD(&spa_namespace_lock));
+
+ search.spa_name = (char *)name;
+ spa = avl_find(&spa_namespace_avl, &search, &where);
+
+ return (spa);
+}
+
+/*
+ * Create an uninitialized spa_t with the given name. Requires
+ * spa_namespace_lock. The caller must ensure that the spa_t doesn't already
+ * exist by calling spa_lookup() first.
+ */
+spa_t *
+spa_add(const char *name, const char *altroot)
+{
+ spa_t *spa;
+
+ ASSERT(MUTEX_HELD(&spa_namespace_lock));
+
+ spa = kmem_zalloc(sizeof (spa_t), KM_SLEEP);
+
+ spa->spa_name = spa_strdup(name);
+ spa->spa_state = POOL_STATE_UNINITIALIZED;
+ spa->spa_freeze_txg = UINT64_MAX;
+ spa->spa_final_txg = UINT64_MAX;
+
+ mutex_init(&spa->spa_config_cache_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&spa->spa_async_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&spa->spa_scrub_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ cv_init(&spa->spa_scrub_cv, NULL, CV_DEFAULT, NULL);
+ cv_init(&spa->spa_scrub_io_cv, NULL, CV_DEFAULT, NULL);
+ cv_init(&spa->spa_async_cv, NULL, CV_DEFAULT, NULL);
+
+ refcount_create(&spa->spa_refcount);
+ refcount_create(&spa->spa_config_lock.scl_count);
+
+ avl_add(&spa_namespace_avl, spa);
+
+ /*
+ * Set the alternate root, if there is one.
+ */
+ if (altroot) {
+ spa->spa_root = spa_strdup(altroot);
+ spa_active_count++;
+ }
+
+ return (spa);
+}
+
+/*
+ * Removes a spa_t from the namespace, freeing up any memory used. Requires
+ * spa_namespace_lock. This is called only after the spa_t has been closed and
+ * deactivated.
+ */
+void
+spa_remove(spa_t *spa)
+{
+ ASSERT(MUTEX_HELD(&spa_namespace_lock));
+ ASSERT(spa->spa_state == POOL_STATE_UNINITIALIZED);
+ ASSERT(spa->spa_scrub_thread == NULL);
+
+ avl_remove(&spa_namespace_avl, spa);
+ cv_broadcast(&spa_namespace_cv);
+
+ if (spa->spa_root) {
+ spa_strfree(spa->spa_root);
+ spa_active_count--;
+ }
+
+ if (spa->spa_name)
+ spa_strfree(spa->spa_name);
+
+ spa_config_set(spa, NULL);
+
+ refcount_destroy(&spa->spa_refcount);
+ refcount_destroy(&spa->spa_config_lock.scl_count);
+
+ cv_destroy(&spa->spa_async_cv);
+ cv_destroy(&spa->spa_scrub_io_cv);
+ cv_destroy(&spa->spa_scrub_cv);
+
+ mutex_destroy(&spa->spa_scrub_lock);
+ mutex_destroy(&spa->spa_async_lock);
+ mutex_destroy(&spa->spa_config_cache_lock);
+
+ kmem_free(spa, sizeof (spa_t));
+}
+
+/*
+ * Given a pool, return the next pool in the namespace, or NULL if there is
+ * none. If 'prev' is NULL, return the first pool.
+ */
+spa_t *
+spa_next(spa_t *prev)
+{
+ ASSERT(MUTEX_HELD(&spa_namespace_lock));
+
+ if (prev)
+ return (AVL_NEXT(&spa_namespace_avl, prev));
+ else
+ return (avl_first(&spa_namespace_avl));
+}
+
+/*
+ * ==========================================================================
+ * SPA refcount functions
+ * ==========================================================================
+ */
+
+/*
+ * Add a reference to the given spa_t. Must have at least one reference, or
+ * have the namespace lock held.
+ */
+void
+spa_open_ref(spa_t *spa, void *tag)
+{
+ ASSERT(refcount_count(&spa->spa_refcount) > SPA_MINREF ||
+ MUTEX_HELD(&spa_namespace_lock));
+
+ (void) refcount_add(&spa->spa_refcount, tag);
+}
+
+/*
+ * Remove a reference to the given spa_t. Must have at least one reference, or
+ * have the namespace lock held.
+ */
+void
+spa_close(spa_t *spa, void *tag)
+{
+ ASSERT(refcount_count(&spa->spa_refcount) > SPA_MINREF ||
+ MUTEX_HELD(&spa_namespace_lock));
+
+ (void) refcount_remove(&spa->spa_refcount, tag);
+}
+
+/*
+ * Check to see if the spa refcount is zero. Must be called with
+ * spa_namespace_lock held. We really compare against SPA_MINREF, which is the
+ * number of references acquired when opening a pool
+ */
+boolean_t
+spa_refcount_zero(spa_t *spa)
+{
+ ASSERT(MUTEX_HELD(&spa_namespace_lock));
+
+ return (refcount_count(&spa->spa_refcount) == SPA_MINREF);
+}
+
+/*
+ * ==========================================================================
+ * SPA spare tracking
+ * ==========================================================================
+ */
+
+/*
+ * Spares are tracked globally due to the following constraints:
+ *
+ * - A spare may be part of multiple pools.
+ * - A spare may be added to a pool even if it's actively in use within
+ * another pool.
+ * - A spare in use in any pool can only be the source of a replacement if
+ * the target is a spare in the same pool.
+ *
+ * We keep track of all spares on the system through the use of a reference
+ * counted AVL tree. When a vdev is added as a spare, or used as a replacement
+ * spare, then we bump the reference count in the AVL tree. In addition, we set
+ * the 'vdev_isspare' member to indicate that the device is a spare (active or
+ * inactive). When a spare is made active (used to replace a device in the
+ * pool), we also keep track of which pool its been made a part of.
+ *
+ * The 'spa_spare_lock' protects the AVL tree. These functions are normally
+ * called under the spa_namespace lock as part of vdev reconfiguration. The
+ * separate spare lock exists for the status query path, which does not need to
+ * be completely consistent with respect to other vdev configuration changes.
+ */
+
+typedef struct spa_spare {
+ uint64_t spare_guid;
+ uint64_t spare_pool;
+ avl_node_t spare_avl;
+ int spare_count;
+} spa_spare_t;
+
+static int
+spa_spare_compare(const void *a, const void *b)
+{
+ const spa_spare_t *sa = a;
+ const spa_spare_t *sb = b;
+
+ if (sa->spare_guid < sb->spare_guid)
+ return (-1);
+ else if (sa->spare_guid > sb->spare_guid)
+ return (1);
+ else
+ return (0);
+}
+
+void
+spa_spare_add(vdev_t *vd)
+{
+ avl_index_t where;
+ spa_spare_t search;
+ spa_spare_t *spare;
+
+ mutex_enter(&spa_spare_lock);
+ ASSERT(!vd->vdev_isspare);
+
+ search.spare_guid = vd->vdev_guid;
+ if ((spare = avl_find(&spa_spare_avl, &search, &where)) != NULL) {
+ spare->spare_count++;
+ } else {
+ spare = kmem_zalloc(sizeof (spa_spare_t), KM_SLEEP);
+ spare->spare_guid = vd->vdev_guid;
+ spare->spare_count = 1;
+ avl_insert(&spa_spare_avl, spare, where);
+ }
+ vd->vdev_isspare = B_TRUE;
+
+ mutex_exit(&spa_spare_lock);
+}
+
+void
+spa_spare_remove(vdev_t *vd)
+{
+ spa_spare_t search;
+ spa_spare_t *spare;
+ avl_index_t where;
+
+ mutex_enter(&spa_spare_lock);
+
+ search.spare_guid = vd->vdev_guid;
+ spare = avl_find(&spa_spare_avl, &search, &where);
+
+ ASSERT(vd->vdev_isspare);
+ ASSERT(spare != NULL);
+
+ if (--spare->spare_count == 0) {
+ avl_remove(&spa_spare_avl, spare);
+ kmem_free(spare, sizeof (spa_spare_t));
+ } else if (spare->spare_pool == spa_guid(vd->vdev_spa)) {
+ spare->spare_pool = 0ULL;
+ }
+
+ vd->vdev_isspare = B_FALSE;
+ mutex_exit(&spa_spare_lock);
+}
+
+boolean_t
+spa_spare_exists(uint64_t guid, uint64_t *pool)
+{
+ spa_spare_t search, *found;
+ avl_index_t where;
+
+ mutex_enter(&spa_spare_lock);
+
+ search.spare_guid = guid;
+ found = avl_find(&spa_spare_avl, &search, &where);
+
+ if (pool) {
+ if (found)
+ *pool = found->spare_pool;
+ else
+ *pool = 0ULL;
+ }
+
+ mutex_exit(&spa_spare_lock);
+
+ return (found != NULL);
+}
+
+void
+spa_spare_activate(vdev_t *vd)
+{
+ spa_spare_t search, *found;
+ avl_index_t where;
+
+ mutex_enter(&spa_spare_lock);
+ ASSERT(vd->vdev_isspare);
+
+ search.spare_guid = vd->vdev_guid;
+ found = avl_find(&spa_spare_avl, &search, &where);
+ ASSERT(found != NULL);
+ ASSERT(found->spare_pool == 0ULL);
+
+ found->spare_pool = spa_guid(vd->vdev_spa);
+ mutex_exit(&spa_spare_lock);
+}
+
+/*
+ * ==========================================================================
+ * SPA config locking
+ * ==========================================================================
+ */
+
+/*
+ * Acquire the config lock. The config lock is a special rwlock that allows for
+ * recursive enters. Because these enters come from the same thread as well as
+ * asynchronous threads working on behalf of the owner, we must unilaterally
+ * allow all reads access as long at least one reader is held (even if a write
+ * is requested). This has the side effect of write starvation, but write locks
+ * are extremely rare, and a solution to this problem would be significantly
+ * more complex (if even possible).
+ *
+ * We would like to assert that the namespace lock isn't held, but this is a
+ * valid use during create.
+ */
+void
+spa_config_enter(spa_t *spa, krw_t rw, void *tag)
+{
+ spa_config_lock_t *scl = &spa->spa_config_lock;
+
+ mutex_enter(&scl->scl_lock);
+
+ if (scl->scl_writer != curthread) {
+ if (rw == RW_READER) {
+ while (scl->scl_writer != NULL)
+ cv_wait(&scl->scl_cv, &scl->scl_lock);
+ } else {
+ while (scl->scl_writer != NULL ||
+ !refcount_is_zero(&scl->scl_count))
+ cv_wait(&scl->scl_cv, &scl->scl_lock);
+ scl->scl_writer = curthread;
+ }
+ }
+
+ (void) refcount_add(&scl->scl_count, tag);
+
+ mutex_exit(&scl->scl_lock);
+}
+
+/*
+ * Release the spa config lock, notifying any waiters in the process.
+ */
+void
+spa_config_exit(spa_t *spa, void *tag)
+{
+ spa_config_lock_t *scl = &spa->spa_config_lock;
+
+ mutex_enter(&scl->scl_lock);
+
+ ASSERT(!refcount_is_zero(&scl->scl_count));
+ if (refcount_remove(&scl->scl_count, tag) == 0) {
+ cv_broadcast(&scl->scl_cv);
+ scl->scl_writer = NULL; /* OK in either case */
+ }
+
+ mutex_exit(&scl->scl_lock);
+}
+
+/*
+ * Returns true if the config lock is held in the given manner.
+ */
+boolean_t
+spa_config_held(spa_t *spa, krw_t rw)
+{
+ spa_config_lock_t *scl = &spa->spa_config_lock;
+ boolean_t held;
+
+ mutex_enter(&scl->scl_lock);
+ if (rw == RW_WRITER)
+ held = (scl->scl_writer == curthread);
+ else
+ held = !refcount_is_zero(&scl->scl_count);
+ mutex_exit(&scl->scl_lock);
+
+ return (held);
+}
+
+/*
+ * ==========================================================================
+ * SPA vdev locking
+ * ==========================================================================
+ */
+
+/*
+ * Lock the given spa_t for the purpose of adding or removing a vdev.
+ * Grabs the global spa_namespace_lock plus the spa config lock for writing.
+ * It returns the next transaction group for the spa_t.
+ */
+uint64_t
+spa_vdev_enter(spa_t *spa)
+{
+ /*
+ * Suspend scrub activity while we mess with the config.
+ */
+ spa_scrub_suspend(spa);
+
+ mutex_enter(&spa_namespace_lock);
+
+ spa_config_enter(spa, RW_WRITER, spa);
+
+ return (spa_last_synced_txg(spa) + 1);
+}
+
+/*
+ * Unlock the spa_t after adding or removing a vdev. Besides undoing the
+ * locking of spa_vdev_enter(), we also want make sure the transactions have
+ * synced to disk, and then update the global configuration cache with the new
+ * information.
+ */
+int
+spa_vdev_exit(spa_t *spa, vdev_t *vd, uint64_t txg, int error)
+{
+ int config_changed = B_FALSE;
+
+ ASSERT(txg > spa_last_synced_txg(spa));
+
+ /*
+ * Reassess the DTLs.
+ */
+ vdev_dtl_reassess(spa->spa_root_vdev, 0, 0, B_FALSE);
+
+ /*
+ * If the config changed, notify the scrub thread that it must restart.
+ */
+ if (error == 0 && !list_is_empty(&spa->spa_dirty_list)) {
+ config_changed = B_TRUE;
+ spa_scrub_restart(spa, txg);
+ }
+
+ spa_config_exit(spa, spa);
+
+ /*
+ * Allow scrubbing to resume.
+ */
+ spa_scrub_resume(spa);
+
+ /*
+ * Note: this txg_wait_synced() is important because it ensures
+ * that there won't be more than one config change per txg.
+ * This allows us to use the txg as the generation number.
+ */
+ if (error == 0)
+ txg_wait_synced(spa->spa_dsl_pool, txg);
+
+ if (vd != NULL) {
+ ASSERT(!vd->vdev_detached || vd->vdev_dtl.smo_object == 0);
+ vdev_free(vd);
+ }
+
+ /*
+ * If the config changed, update the config cache.
+ */
+ if (config_changed)
+ spa_config_sync();
+
+ mutex_exit(&spa_namespace_lock);
+
+ return (error);
+}
+
+/*
+ * ==========================================================================
+ * Miscellaneous functions
+ * ==========================================================================
+ */
+
+/*
+ * Rename a spa_t.
+ */
+int
+spa_rename(const char *name, const char *newname)
+{
+ spa_t *spa;
+ int err;
+
+ /*
+ * Lookup the spa_t and grab the config lock for writing. We need to
+ * actually open the pool so that we can sync out the necessary labels.
+ * It's OK to call spa_open() with the namespace lock held because we
+ * allow recursive calls for other reasons.
+ */
+ mutex_enter(&spa_namespace_lock);
+ if ((err = spa_open(name, &spa, FTAG)) != 0) {
+ mutex_exit(&spa_namespace_lock);
+ return (err);
+ }
+
+ spa_config_enter(spa, RW_WRITER, FTAG);
+
+ avl_remove(&spa_namespace_avl, spa);
+ spa_strfree(spa->spa_name);
+ spa->spa_name = spa_strdup(newname);
+ avl_add(&spa_namespace_avl, spa);
+
+ /*
+ * Sync all labels to disk with the new names by marking the root vdev
+ * dirty and waiting for it to sync. It will pick up the new pool name
+ * during the sync.
+ */
+ vdev_config_dirty(spa->spa_root_vdev);
+
+ spa_config_exit(spa, FTAG);
+
+ txg_wait_synced(spa->spa_dsl_pool, 0);
+
+ /*
+ * Sync the updated config cache.
+ */
+ spa_config_sync();
+
+ spa_close(spa, FTAG);
+
+ mutex_exit(&spa_namespace_lock);
+
+ return (0);
+}
+
+
+/*
+ * Determine whether a pool with given pool_guid exists. If device_guid is
+ * non-zero, determine whether the pool exists *and* contains a device with the
+ * specified device_guid.
+ */
+boolean_t
+spa_guid_exists(uint64_t pool_guid, uint64_t device_guid)
+{
+ spa_t *spa;
+ avl_tree_t *t = &spa_namespace_avl;
+
+ ASSERT(MUTEX_HELD(&spa_namespace_lock));
+
+ for (spa = avl_first(t); spa != NULL; spa = AVL_NEXT(t, spa)) {
+ if (spa->spa_state == POOL_STATE_UNINITIALIZED)
+ continue;
+ if (spa->spa_root_vdev == NULL)
+ continue;
+ if (spa_guid(spa) == pool_guid) {
+ if (device_guid == 0)
+ break;
+
+ if (vdev_lookup_by_guid(spa->spa_root_vdev,
+ device_guid) != NULL)
+ break;
+
+ /*
+ * Check any devices we may in the process of adding.
+ */
+ if (spa->spa_pending_vdev) {
+ if (vdev_lookup_by_guid(spa->spa_pending_vdev,
+ device_guid) != NULL)
+ break;
+ }
+ }
+ }
+
+ return (spa != NULL);
+}
+
+char *
+spa_strdup(const char *s)
+{
+ size_t len;
+ char *new;
+
+ len = strlen(s);
+ new = kmem_alloc(len + 1, KM_SLEEP);
+ bcopy(s, new, len);
+ new[len] = '\0';
+
+ return (new);
+}
+
+void
+spa_strfree(char *s)
+{
+ kmem_free(s, strlen(s) + 1);
+}
+
+uint64_t
+spa_get_random(uint64_t range)
+{
+ uint64_t r;
+
+ ASSERT(range != 0);
+
+ (void) random_get_pseudo_bytes((void *)&r, sizeof (uint64_t));
+
+ return (r % range);
+}
+
+void
+sprintf_blkptr(char *buf, int len, const blkptr_t *bp)
+{
+ int d;
+
+ if (bp == NULL) {
+ (void) snprintf(buf, len, "<NULL>");
+ return;
+ }
+
+ if (BP_IS_HOLE(bp)) {
+ (void) snprintf(buf, len, "<hole>");
+ return;
+ }
+
+ (void) snprintf(buf, len, "[L%llu %s] %llxL/%llxP ",
+ (u_longlong_t)BP_GET_LEVEL(bp),
+ dmu_ot[BP_GET_TYPE(bp)].ot_name,
+ (u_longlong_t)BP_GET_LSIZE(bp),
+ (u_longlong_t)BP_GET_PSIZE(bp));
+
+ for (d = 0; d < BP_GET_NDVAS(bp); d++) {
+ const dva_t *dva = &bp->blk_dva[d];
+ (void) snprintf(buf + strlen(buf), len - strlen(buf),
+ "DVA[%d]=<%llu:%llx:%llx> ", d,
+ (u_longlong_t)DVA_GET_VDEV(dva),
+ (u_longlong_t)DVA_GET_OFFSET(dva),
+ (u_longlong_t)DVA_GET_ASIZE(dva));
+ }
+
+ (void) snprintf(buf + strlen(buf), len - strlen(buf),
+ "%s %s %s %s birth=%llu fill=%llu cksum=%llx:%llx:%llx:%llx",
+ zio_checksum_table[BP_GET_CHECKSUM(bp)].ci_name,
+ zio_compress_table[BP_GET_COMPRESS(bp)].ci_name,
+ BP_GET_BYTEORDER(bp) == 0 ? "BE" : "LE",
+ BP_IS_GANG(bp) ? "gang" : "contiguous",
+ (u_longlong_t)bp->blk_birth,
+ (u_longlong_t)bp->blk_fill,
+ (u_longlong_t)bp->blk_cksum.zc_word[0],
+ (u_longlong_t)bp->blk_cksum.zc_word[1],
+ (u_longlong_t)bp->blk_cksum.zc_word[2],
+ (u_longlong_t)bp->blk_cksum.zc_word[3]);
+}
+
+void
+spa_freeze(spa_t *spa)
+{
+ uint64_t freeze_txg = 0;
+
+ spa_config_enter(spa, RW_WRITER, FTAG);
+ if (spa->spa_freeze_txg == UINT64_MAX) {
+ freeze_txg = spa_last_synced_txg(spa) + TXG_SIZE;
+ spa->spa_freeze_txg = freeze_txg;
+ }
+ spa_config_exit(spa, FTAG);
+ if (freeze_txg != 0)
+ txg_wait_synced(spa_get_dsl(spa), freeze_txg);
+}
+
+void
+zfs_panic_recover(const char *fmt, ...)
+{
+ va_list adx;
+
+ va_start(adx, fmt);
+ vcmn_err(zfs_recover ? CE_WARN : CE_PANIC, fmt, adx);
+ va_end(adx);
+}
+
+/*
+ * ==========================================================================
+ * Accessor functions
+ * ==========================================================================
+ */
+
+krwlock_t *
+spa_traverse_rwlock(spa_t *spa)
+{
+ return (&spa->spa_traverse_lock);
+}
+
+int
+spa_traverse_wanted(spa_t *spa)
+{
+ return (spa->spa_traverse_wanted);
+}
+
+dsl_pool_t *
+spa_get_dsl(spa_t *spa)
+{
+ return (spa->spa_dsl_pool);
+}
+
+blkptr_t *
+spa_get_rootblkptr(spa_t *spa)
+{
+ return (&spa->spa_ubsync.ub_rootbp);
+}
+
+void
+spa_set_rootblkptr(spa_t *spa, const blkptr_t *bp)
+{
+ spa->spa_uberblock.ub_rootbp = *bp;
+}
+
+void
+spa_altroot(spa_t *spa, char *buf, size_t buflen)
+{
+ if (spa->spa_root == NULL)
+ buf[0] = '\0';
+ else
+ (void) strncpy(buf, spa->spa_root, buflen);
+}
+
+int
+spa_sync_pass(spa_t *spa)
+{
+ return (spa->spa_sync_pass);
+}
+
+char *
+spa_name(spa_t *spa)
+{
+ /*
+ * Accessing the name requires holding either the namespace lock or the
+ * config lock, both of which are required to do a rename.
+ */
+ ASSERT(MUTEX_HELD(&spa_namespace_lock) ||
+ spa_config_held(spa, RW_READER) || spa_config_held(spa, RW_WRITER));
+
+ return (spa->spa_name);
+}
+
+uint64_t
+spa_guid(spa_t *spa)
+{
+ /*
+ * If we fail to parse the config during spa_load(), we can go through
+ * the error path (which posts an ereport) and end up here with no root
+ * vdev. We stash the original pool guid in 'spa_load_guid' to handle
+ * this case.
+ */
+ if (spa->spa_root_vdev != NULL)
+ return (spa->spa_root_vdev->vdev_guid);
+ else
+ return (spa->spa_load_guid);
+}
+
+uint64_t
+spa_last_synced_txg(spa_t *spa)
+{
+ return (spa->spa_ubsync.ub_txg);
+}
+
+uint64_t
+spa_first_txg(spa_t *spa)
+{
+ return (spa->spa_first_txg);
+}
+
+int
+spa_state(spa_t *spa)
+{
+ return (spa->spa_state);
+}
+
+uint64_t
+spa_freeze_txg(spa_t *spa)
+{
+ return (spa->spa_freeze_txg);
+}
+
+/*
+ * In the future, this may select among different metaslab classes
+ * depending on the zdp. For now, there's no such distinction.
+ */
+metaslab_class_t *
+spa_metaslab_class_select(spa_t *spa)
+{
+ return (spa->spa_normal_class);
+}
+
+/*
+ * Return how much space is allocated in the pool (ie. sum of all asize)
+ */
+uint64_t
+spa_get_alloc(spa_t *spa)
+{
+ return (spa->spa_root_vdev->vdev_stat.vs_alloc);
+}
+
+/*
+ * Return how much (raid-z inflated) space there is in the pool.
+ */
+uint64_t
+spa_get_space(spa_t *spa)
+{
+ return (spa->spa_root_vdev->vdev_stat.vs_space);
+}
+
+/*
+ * Return the amount of raid-z-deflated space in the pool.
+ */
+uint64_t
+spa_get_dspace(spa_t *spa)
+{
+ if (spa->spa_deflate)
+ return (spa->spa_root_vdev->vdev_stat.vs_dspace);
+ else
+ return (spa->spa_root_vdev->vdev_stat.vs_space);
+}
+
+/* ARGSUSED */
+uint64_t
+spa_get_asize(spa_t *spa, uint64_t lsize)
+{
+ /*
+ * For now, the worst case is 512-byte RAID-Z blocks, in which
+ * case the space requirement is exactly 2x; so just assume that.
+ * Add to this the fact that we can have up to 3 DVAs per bp, and
+ * we have to multiply by a total of 6x.
+ */
+ return (lsize * 6);
+}
+
+uint64_t
+spa_version(spa_t *spa)
+{
+ return (spa->spa_ubsync.ub_version);
+}
+
+int
+spa_max_replication(spa_t *spa)
+{
+ /*
+ * As of ZFS_VERSION == ZFS_VERSION_DITTO_BLOCKS, we are able to
+ * handle BPs with more than one DVA allocated. Set our max
+ * replication level accordingly.
+ */
+ if (spa_version(spa) < ZFS_VERSION_DITTO_BLOCKS)
+ return (1);
+ return (MIN(SPA_DVAS_PER_BP, spa_max_replication_override));
+}
+
+uint64_t
+bp_get_dasize(spa_t *spa, const blkptr_t *bp)
+{
+ int sz = 0, i;
+
+ if (!spa->spa_deflate)
+ return (BP_GET_ASIZE(bp));
+
+ for (i = 0; i < SPA_DVAS_PER_BP; i++) {
+ vdev_t *vd =
+ vdev_lookup_top(spa, DVA_GET_VDEV(&bp->blk_dva[i]));
+ sz += (DVA_GET_ASIZE(&bp->blk_dva[i]) >> SPA_MINBLOCKSHIFT) *
+ vd->vdev_deflate_ratio;
+ }
+ return (sz);
+}
+
+/*
+ * ==========================================================================
+ * Initialization and Termination
+ * ==========================================================================
+ */
+
+static int
+spa_name_compare(const void *a1, const void *a2)
+{
+ const spa_t *s1 = a1;
+ const spa_t *s2 = a2;
+ int s;
+
+ s = strcmp(s1->spa_name, s2->spa_name);
+ if (s > 0)
+ return (1);
+ if (s < 0)
+ return (-1);
+ return (0);
+}
+
+int
+spa_busy(void)
+{
+ return (spa_active_count);
+}
+
+void
+spa_init(int mode)
+{
+ mutex_init(&spa_namespace_lock, NULL, MUTEX_DEFAULT, NULL);
+ cv_init(&spa_namespace_cv, NULL, CV_DEFAULT, NULL);
+
+ avl_create(&spa_namespace_avl, spa_name_compare, sizeof (spa_t),
+ offsetof(spa_t, spa_avl));
+
+ mutex_init(&spa_spare_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ avl_create(&spa_spare_avl, spa_spare_compare, sizeof (spa_spare_t),
+ offsetof(spa_spare_t, spare_avl));
+
+ spa_mode = mode;
+
+ refcount_init();
+ unique_init();
+ zio_init();
+ dmu_init();
+ zil_init();
+ spa_config_load();
+}
+
+void
+spa_fini(void)
+{
+ spa_evict_all();
+
+ zil_fini();
+ dmu_fini();
+ zio_fini();
+ refcount_fini();
+
+ avl_destroy(&spa_namespace_avl);
+ avl_destroy(&spa_spare_avl);
+
+ cv_destroy(&spa_namespace_cv);
+ mutex_destroy(&spa_namespace_lock);
+ mutex_destroy(&spa_spare_lock);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/space_map.c b/sys/contrib/opensolaris/uts/common/fs/zfs/space_map.c
new file mode 100644
index 0000000..23313a9
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/space_map.c
@@ -0,0 +1,501 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/dmu.h>
+#include <sys/zio.h>
+#include <sys/space_map.h>
+
+/*
+ * Space map routines.
+ * NOTE: caller is responsible for all locking.
+ */
+static int
+space_map_seg_compare(const void *x1, const void *x2)
+{
+ const space_seg_t *s1 = x1;
+ const space_seg_t *s2 = x2;
+
+ if (s1->ss_start < s2->ss_start) {
+ if (s1->ss_end > s2->ss_start)
+ return (0);
+ return (-1);
+ }
+ if (s1->ss_start > s2->ss_start) {
+ if (s1->ss_start < s2->ss_end)
+ return (0);
+ return (1);
+ }
+ return (0);
+}
+
+void
+space_map_create(space_map_t *sm, uint64_t start, uint64_t size, uint8_t shift,
+ kmutex_t *lp)
+{
+ bzero(sm, sizeof (*sm));
+
+ cv_init(&sm->sm_load_cv, NULL, CV_DEFAULT, NULL);
+ avl_create(&sm->sm_root, space_map_seg_compare,
+ sizeof (space_seg_t), offsetof(struct space_seg, ss_node));
+
+ sm->sm_start = start;
+ sm->sm_size = size;
+ sm->sm_shift = shift;
+ sm->sm_lock = lp;
+}
+
+void
+space_map_destroy(space_map_t *sm)
+{
+ ASSERT(!sm->sm_loaded && !sm->sm_loading);
+ VERIFY3U(sm->sm_space, ==, 0);
+ avl_destroy(&sm->sm_root);
+ cv_destroy(&sm->sm_load_cv);
+}
+
+void
+space_map_add(space_map_t *sm, uint64_t start, uint64_t size)
+{
+ avl_index_t where;
+ space_seg_t ssearch, *ss_before, *ss_after, *ss;
+ uint64_t end = start + size;
+ int merge_before, merge_after;
+
+ ASSERT(MUTEX_HELD(sm->sm_lock));
+ VERIFY(size != 0);
+ VERIFY3U(start, >=, sm->sm_start);
+ VERIFY3U(end, <=, sm->sm_start + sm->sm_size);
+ VERIFY(sm->sm_space + size <= sm->sm_size);
+ VERIFY(P2PHASE(start, 1ULL << sm->sm_shift) == 0);
+ VERIFY(P2PHASE(size, 1ULL << sm->sm_shift) == 0);
+
+ ssearch.ss_start = start;
+ ssearch.ss_end = end;
+ ss = avl_find(&sm->sm_root, &ssearch, &where);
+
+ if (ss != NULL && ss->ss_start <= start && ss->ss_end >= end) {
+ zfs_panic_recover("zfs: allocating allocated segment"
+ "(offset=%llu size=%llu)\n",
+ (longlong_t)start, (longlong_t)size);
+ return;
+ }
+
+ /* Make sure we don't overlap with either of our neighbors */
+ VERIFY(ss == NULL);
+
+ ss_before = avl_nearest(&sm->sm_root, where, AVL_BEFORE);
+ ss_after = avl_nearest(&sm->sm_root, where, AVL_AFTER);
+
+ merge_before = (ss_before != NULL && ss_before->ss_end == start);
+ merge_after = (ss_after != NULL && ss_after->ss_start == end);
+
+ if (merge_before && merge_after) {
+ avl_remove(&sm->sm_root, ss_before);
+ ss_after->ss_start = ss_before->ss_start;
+ kmem_free(ss_before, sizeof (*ss_before));
+ } else if (merge_before) {
+ ss_before->ss_end = end;
+ } else if (merge_after) {
+ ss_after->ss_start = start;
+ } else {
+ ss = kmem_alloc(sizeof (*ss), KM_SLEEP);
+ ss->ss_start = start;
+ ss->ss_end = end;
+ avl_insert(&sm->sm_root, ss, where);
+ }
+
+ sm->sm_space += size;
+}
+
+void
+space_map_remove(space_map_t *sm, uint64_t start, uint64_t size)
+{
+ avl_index_t where;
+ space_seg_t ssearch, *ss, *newseg;
+ uint64_t end = start + size;
+ int left_over, right_over;
+
+ ASSERT(MUTEX_HELD(sm->sm_lock));
+ VERIFY(size != 0);
+ VERIFY(P2PHASE(start, 1ULL << sm->sm_shift) == 0);
+ VERIFY(P2PHASE(size, 1ULL << sm->sm_shift) == 0);
+
+ ssearch.ss_start = start;
+ ssearch.ss_end = end;
+ ss = avl_find(&sm->sm_root, &ssearch, &where);
+
+ /* Make sure we completely overlap with someone */
+ if (ss == NULL) {
+ zfs_panic_recover("zfs: freeing free segment "
+ "(offset=%llu size=%llu)",
+ (longlong_t)start, (longlong_t)size);
+ return;
+ }
+ VERIFY3U(ss->ss_start, <=, start);
+ VERIFY3U(ss->ss_end, >=, end);
+ VERIFY(sm->sm_space - size <= sm->sm_size);
+
+ left_over = (ss->ss_start != start);
+ right_over = (ss->ss_end != end);
+
+ if (left_over && right_over) {
+ newseg = kmem_alloc(sizeof (*newseg), KM_SLEEP);
+ newseg->ss_start = end;
+ newseg->ss_end = ss->ss_end;
+ ss->ss_end = start;
+ avl_insert_here(&sm->sm_root, newseg, ss, AVL_AFTER);
+ } else if (left_over) {
+ ss->ss_end = start;
+ } else if (right_over) {
+ ss->ss_start = end;
+ } else {
+ avl_remove(&sm->sm_root, ss);
+ kmem_free(ss, sizeof (*ss));
+ }
+
+ sm->sm_space -= size;
+}
+
+int
+space_map_contains(space_map_t *sm, uint64_t start, uint64_t size)
+{
+ avl_index_t where;
+ space_seg_t ssearch, *ss;
+ uint64_t end = start + size;
+
+ ASSERT(MUTEX_HELD(sm->sm_lock));
+ VERIFY(size != 0);
+ VERIFY(P2PHASE(start, 1ULL << sm->sm_shift) == 0);
+ VERIFY(P2PHASE(size, 1ULL << sm->sm_shift) == 0);
+
+ ssearch.ss_start = start;
+ ssearch.ss_end = end;
+ ss = avl_find(&sm->sm_root, &ssearch, &where);
+
+ return (ss != NULL && ss->ss_start <= start && ss->ss_end >= end);
+}
+
+void
+space_map_vacate(space_map_t *sm, space_map_func_t *func, space_map_t *mdest)
+{
+ space_seg_t *ss;
+ void *cookie = NULL;
+
+ ASSERT(MUTEX_HELD(sm->sm_lock));
+
+ while ((ss = avl_destroy_nodes(&sm->sm_root, &cookie)) != NULL) {
+ if (func != NULL)
+ func(mdest, ss->ss_start, ss->ss_end - ss->ss_start);
+ kmem_free(ss, sizeof (*ss));
+ }
+ sm->sm_space = 0;
+}
+
+void
+space_map_walk(space_map_t *sm, space_map_func_t *func, space_map_t *mdest)
+{
+ space_seg_t *ss;
+
+ for (ss = avl_first(&sm->sm_root); ss; ss = AVL_NEXT(&sm->sm_root, ss))
+ func(mdest, ss->ss_start, ss->ss_end - ss->ss_start);
+}
+
+void
+space_map_excise(space_map_t *sm, uint64_t start, uint64_t size)
+{
+ avl_tree_t *t = &sm->sm_root;
+ avl_index_t where;
+ space_seg_t *ss, search;
+ uint64_t end = start + size;
+ uint64_t rm_start, rm_end;
+
+ ASSERT(MUTEX_HELD(sm->sm_lock));
+
+ search.ss_start = start;
+ search.ss_end = start;
+
+ for (;;) {
+ ss = avl_find(t, &search, &where);
+
+ if (ss == NULL)
+ ss = avl_nearest(t, where, AVL_AFTER);
+
+ if (ss == NULL || ss->ss_start >= end)
+ break;
+
+ rm_start = MAX(ss->ss_start, start);
+ rm_end = MIN(ss->ss_end, end);
+
+ space_map_remove(sm, rm_start, rm_end - rm_start);
+ }
+}
+
+/*
+ * Replace smd with the union of smd and sms.
+ */
+void
+space_map_union(space_map_t *smd, space_map_t *sms)
+{
+ avl_tree_t *t = &sms->sm_root;
+ space_seg_t *ss;
+
+ ASSERT(MUTEX_HELD(smd->sm_lock));
+
+ /*
+ * For each source segment, remove any intersections with the
+ * destination, then add the source segment to the destination.
+ */
+ for (ss = avl_first(t); ss != NULL; ss = AVL_NEXT(t, ss)) {
+ space_map_excise(smd, ss->ss_start, ss->ss_end - ss->ss_start);
+ space_map_add(smd, ss->ss_start, ss->ss_end - ss->ss_start);
+ }
+}
+
+/*
+ * Wait for any in-progress space_map_load() to complete.
+ */
+void
+space_map_load_wait(space_map_t *sm)
+{
+ ASSERT(MUTEX_HELD(sm->sm_lock));
+
+ while (sm->sm_loading)
+ cv_wait(&sm->sm_load_cv, sm->sm_lock);
+}
+
+/*
+ * Note: space_map_load() will drop sm_lock across dmu_read() calls.
+ * The caller must be OK with this.
+ */
+int
+space_map_load(space_map_t *sm, space_map_ops_t *ops, uint8_t maptype,
+ space_map_obj_t *smo, objset_t *os)
+{
+ uint64_t *entry, *entry_map, *entry_map_end;
+ uint64_t bufsize, size, offset, end, space;
+ uint64_t mapstart = sm->sm_start;
+
+ ASSERT(MUTEX_HELD(sm->sm_lock));
+
+ space_map_load_wait(sm);
+
+ if (sm->sm_loaded)
+ return (0);
+
+ sm->sm_loading = B_TRUE;
+ end = smo->smo_objsize;
+ space = smo->smo_alloc;
+
+ ASSERT(sm->sm_ops == NULL);
+ VERIFY3U(sm->sm_space, ==, 0);
+
+ if (maptype == SM_FREE) {
+ space_map_add(sm, sm->sm_start, sm->sm_size);
+ space = sm->sm_size - space;
+ }
+
+ bufsize = 1ULL << SPACE_MAP_BLOCKSHIFT;
+ entry_map = zio_buf_alloc(bufsize);
+
+ mutex_exit(sm->sm_lock);
+ if (end > bufsize)
+ dmu_prefetch(os, smo->smo_object, bufsize, end - bufsize);
+ mutex_enter(sm->sm_lock);
+
+ for (offset = 0; offset < end; offset += bufsize) {
+ size = MIN(end - offset, bufsize);
+ VERIFY(P2PHASE(size, sizeof (uint64_t)) == 0);
+ VERIFY(size != 0);
+
+ dprintf("object=%llu offset=%llx size=%llx\n",
+ smo->smo_object, offset, size);
+
+ mutex_exit(sm->sm_lock);
+ VERIFY3U(dmu_read(os, smo->smo_object, offset, size,
+ entry_map), ==, 0);
+ mutex_enter(sm->sm_lock);
+
+ entry_map_end = entry_map + (size / sizeof (uint64_t));
+ for (entry = entry_map; entry < entry_map_end; entry++) {
+ uint64_t e = *entry;
+
+ if (SM_DEBUG_DECODE(e)) /* Skip debug entries */
+ continue;
+
+ (SM_TYPE_DECODE(e) == maptype ?
+ space_map_add : space_map_remove)(sm,
+ (SM_OFFSET_DECODE(e) << sm->sm_shift) + mapstart,
+ SM_RUN_DECODE(e) << sm->sm_shift);
+ }
+ }
+ VERIFY3U(sm->sm_space, ==, space);
+
+ zio_buf_free(entry_map, bufsize);
+
+ sm->sm_loading = B_FALSE;
+ sm->sm_loaded = B_TRUE;
+ sm->sm_ops = ops;
+
+ cv_broadcast(&sm->sm_load_cv);
+
+ if (ops != NULL)
+ ops->smop_load(sm);
+
+ return (0);
+}
+
+void
+space_map_unload(space_map_t *sm)
+{
+ ASSERT(MUTEX_HELD(sm->sm_lock));
+
+ if (sm->sm_loaded && sm->sm_ops != NULL)
+ sm->sm_ops->smop_unload(sm);
+
+ sm->sm_loaded = B_FALSE;
+ sm->sm_ops = NULL;
+
+ space_map_vacate(sm, NULL, NULL);
+}
+
+uint64_t
+space_map_alloc(space_map_t *sm, uint64_t size)
+{
+ uint64_t start;
+
+ start = sm->sm_ops->smop_alloc(sm, size);
+ if (start != -1ULL)
+ space_map_remove(sm, start, size);
+ return (start);
+}
+
+void
+space_map_claim(space_map_t *sm, uint64_t start, uint64_t size)
+{
+ sm->sm_ops->smop_claim(sm, start, size);
+ space_map_remove(sm, start, size);
+}
+
+void
+space_map_free(space_map_t *sm, uint64_t start, uint64_t size)
+{
+ space_map_add(sm, start, size);
+ sm->sm_ops->smop_free(sm, start, size);
+}
+
+/*
+ * Note: space_map_sync() will drop sm_lock across dmu_write() calls.
+ */
+void
+space_map_sync(space_map_t *sm, uint8_t maptype,
+ space_map_obj_t *smo, objset_t *os, dmu_tx_t *tx)
+{
+ spa_t *spa = dmu_objset_spa(os);
+ void *cookie = NULL;
+ space_seg_t *ss;
+ uint64_t bufsize, start, size, run_len;
+ uint64_t *entry, *entry_map, *entry_map_end;
+
+ ASSERT(MUTEX_HELD(sm->sm_lock));
+
+ if (sm->sm_space == 0)
+ return;
+
+ dprintf("object %4llu, txg %llu, pass %d, %c, count %lu, space %llx\n",
+ smo->smo_object, dmu_tx_get_txg(tx), spa_sync_pass(spa),
+ maptype == SM_ALLOC ? 'A' : 'F', avl_numnodes(&sm->sm_root),
+ sm->sm_space);
+
+ if (maptype == SM_ALLOC)
+ smo->smo_alloc += sm->sm_space;
+ else
+ smo->smo_alloc -= sm->sm_space;
+
+ bufsize = (8 + avl_numnodes(&sm->sm_root)) * sizeof (uint64_t);
+ bufsize = MIN(bufsize, 1ULL << SPACE_MAP_BLOCKSHIFT);
+ entry_map = zio_buf_alloc(bufsize);
+ entry_map_end = entry_map + (bufsize / sizeof (uint64_t));
+ entry = entry_map;
+
+ *entry++ = SM_DEBUG_ENCODE(1) |
+ SM_DEBUG_ACTION_ENCODE(maptype) |
+ SM_DEBUG_SYNCPASS_ENCODE(spa_sync_pass(spa)) |
+ SM_DEBUG_TXG_ENCODE(dmu_tx_get_txg(tx));
+
+ while ((ss = avl_destroy_nodes(&sm->sm_root, &cookie)) != NULL) {
+ size = ss->ss_end - ss->ss_start;
+ start = (ss->ss_start - sm->sm_start) >> sm->sm_shift;
+
+ sm->sm_space -= size;
+ size >>= sm->sm_shift;
+
+ while (size) {
+ run_len = MIN(size, SM_RUN_MAX);
+
+ if (entry == entry_map_end) {
+ mutex_exit(sm->sm_lock);
+ dmu_write(os, smo->smo_object, smo->smo_objsize,
+ bufsize, entry_map, tx);
+ mutex_enter(sm->sm_lock);
+ smo->smo_objsize += bufsize;
+ entry = entry_map;
+ }
+
+ *entry++ = SM_OFFSET_ENCODE(start) |
+ SM_TYPE_ENCODE(maptype) |
+ SM_RUN_ENCODE(run_len);
+
+ start += run_len;
+ size -= run_len;
+ }
+ kmem_free(ss, sizeof (*ss));
+ }
+
+ if (entry != entry_map) {
+ size = (entry - entry_map) * sizeof (uint64_t);
+ mutex_exit(sm->sm_lock);
+ dmu_write(os, smo->smo_object, smo->smo_objsize,
+ size, entry_map, tx);
+ mutex_enter(sm->sm_lock);
+ smo->smo_objsize += size;
+ }
+
+ zio_buf_free(entry_map, bufsize);
+
+ VERIFY3U(sm->sm_space, ==, 0);
+}
+
+void
+space_map_truncate(space_map_obj_t *smo, objset_t *os, dmu_tx_t *tx)
+{
+ VERIFY(dmu_free_range(os, smo->smo_object, 0, -1ULL, tx) == 0);
+
+ smo->smo_objsize = 0;
+ smo->smo_alloc = 0;
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/arc.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/arc.h
new file mode 100644
index 0000000..f58ffc0
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/arc.h
@@ -0,0 +1,109 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ARC_H
+#define _SYS_ARC_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/zio.h>
+
+typedef struct arc_buf_hdr arc_buf_hdr_t;
+typedef struct arc_buf arc_buf_t;
+typedef void arc_done_func_t(zio_t *zio, arc_buf_t *buf, void *private);
+typedef void arc_byteswap_func_t(void *buf, size_t size);
+typedef int arc_evict_func_t(void *private);
+
+/* generic arc_done_func_t's which you can use */
+arc_done_func_t arc_bcopy_func;
+arc_done_func_t arc_getbuf_func;
+
+struct arc_buf {
+ arc_buf_hdr_t *b_hdr;
+ arc_buf_t *b_next;
+ void *b_data;
+ arc_evict_func_t *b_efunc;
+ void *b_private;
+};
+
+typedef enum arc_buf_contents {
+ ARC_BUFC_UNDEF, /* buffer contents undefined */
+ ARC_BUFC_DATA, /* buffer contains data */
+ ARC_BUFC_METADATA /* buffer contains metadata */
+} arc_buf_contents_t;
+/*
+ * These are the flags we pass into calls to the arc
+ */
+#define ARC_WAIT (1 << 1) /* perform I/O synchronously */
+#define ARC_NOWAIT (1 << 2) /* perform I/O asynchronously */
+#define ARC_PREFETCH (1 << 3) /* I/O is a prefetch */
+#define ARC_CACHED (1 << 4) /* I/O was already in cache */
+
+arc_buf_t *arc_buf_alloc(spa_t *spa, int size, void *tag,
+ arc_buf_contents_t type);
+void arc_buf_add_ref(arc_buf_t *buf, void *tag);
+int arc_buf_remove_ref(arc_buf_t *buf, void *tag);
+int arc_buf_size(arc_buf_t *buf);
+void arc_release(arc_buf_t *buf, void *tag);
+int arc_released(arc_buf_t *buf);
+int arc_has_callback(arc_buf_t *buf);
+void arc_buf_freeze(arc_buf_t *buf);
+void arc_buf_thaw(arc_buf_t *buf);
+#ifdef ZFS_DEBUG
+int arc_referenced(arc_buf_t *buf);
+#endif
+
+int arc_read(zio_t *pio, spa_t *spa, blkptr_t *bp, arc_byteswap_func_t *swap,
+ arc_done_func_t *done, void *private, int priority, int flags,
+ uint32_t *arc_flags, zbookmark_t *zb);
+zio_t *arc_write(zio_t *pio, spa_t *spa, int checksum, int compress,
+ int ncopies, uint64_t txg, blkptr_t *bp, arc_buf_t *buf,
+ arc_done_func_t *ready, arc_done_func_t *done, void *private, int priority,
+ int flags, zbookmark_t *zb);
+int arc_free(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
+ zio_done_func_t *done, void *private, uint32_t arc_flags);
+int arc_tryread(spa_t *spa, blkptr_t *bp, void *data);
+
+void arc_set_callback(arc_buf_t *buf, arc_evict_func_t *func, void *private);
+int arc_buf_evict(arc_buf_t *buf);
+
+void arc_flush(void);
+void arc_tempreserve_clear(uint64_t tempreserve);
+int arc_tempreserve_space(uint64_t tempreserve);
+
+void arc_init(void);
+void arc_fini(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ARC_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/bplist.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/bplist.h
new file mode 100644
index 0000000..b4c8376
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/bplist.h
@@ -0,0 +1,89 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_BPLIST_H
+#define _SYS_BPLIST_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/spa.h>
+#include <sys/txg.h>
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct bplist_phys {
+ /*
+ * This is the bonus buffer for the dead lists. The object's
+ * contents is an array of bpl_entries blkptr_t's, representing
+ * a total of bpl_bytes physical space.
+ */
+ uint64_t bpl_entries;
+ uint64_t bpl_bytes;
+ uint64_t bpl_comp;
+ uint64_t bpl_uncomp;
+} bplist_phys_t;
+
+#define BPLIST_SIZE_V0 (2 * sizeof (uint64_t))
+
+typedef struct bplist_q {
+ blkptr_t bpq_blk;
+ void *bpq_next;
+} bplist_q_t;
+
+typedef struct bplist {
+ kmutex_t bpl_lock;
+ objset_t *bpl_mos;
+ uint64_t bpl_object;
+ uint8_t bpl_blockshift;
+ uint8_t bpl_bpshift;
+ uint8_t bpl_havecomp;
+ bplist_q_t *bpl_queue;
+ bplist_phys_t *bpl_phys;
+ dmu_buf_t *bpl_dbuf;
+ dmu_buf_t *bpl_cached_dbuf;
+} bplist_t;
+
+extern uint64_t bplist_create(objset_t *mos, int blocksize, dmu_tx_t *tx);
+extern void bplist_destroy(objset_t *mos, uint64_t object, dmu_tx_t *tx);
+extern int bplist_open(bplist_t *bpl, objset_t *mos, uint64_t object);
+extern void bplist_close(bplist_t *bpl);
+extern boolean_t bplist_empty(bplist_t *bpl);
+extern int bplist_iterate(bplist_t *bpl, uint64_t *itorp, blkptr_t *bp);
+extern int bplist_enqueue(bplist_t *bpl, blkptr_t *bp, dmu_tx_t *tx);
+extern void bplist_enqueue_deferred(bplist_t *bpl, blkptr_t *bp);
+extern void bplist_sync(bplist_t *bpl, dmu_tx_t *tx);
+extern void bplist_vacate(bplist_t *bpl, dmu_tx_t *tx);
+extern int bplist_space(bplist_t *bpl,
+ uint64_t *usedp, uint64_t *compp, uint64_t *uncompp);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_BPLIST_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dbuf.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dbuf.h
new file mode 100644
index 0000000..d33657b
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dbuf.h
@@ -0,0 +1,334 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DBUF_H
+#define _SYS_DBUF_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/spa.h>
+#include <sys/txg.h>
+#include <sys/zio.h>
+#include <sys/arc.h>
+#include <sys/zfs_context.h>
+#include <sys/refcount.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define DB_BONUS_BLKID (-1ULL)
+#define IN_DMU_SYNC 2
+
+/*
+ * define flags for dbuf_read
+ */
+
+#define DB_RF_MUST_SUCCEED (1 << 0)
+#define DB_RF_CANFAIL (1 << 1)
+#define DB_RF_HAVESTRUCT (1 << 2)
+#define DB_RF_NOPREFETCH (1 << 3)
+#define DB_RF_NEVERWAIT (1 << 4)
+#define DB_RF_CACHED (1 << 5)
+
+/*
+ * The state transition diagram for dbufs looks like:
+ *
+ * +----> READ ----+
+ * | |
+ * | V
+ * (alloc)-->UNCACHED CACHED-->EVICTING-->(free)
+ * | ^
+ * | |
+ * +----> FILL ----+
+ */
+typedef enum dbuf_states {
+ DB_UNCACHED,
+ DB_FILL,
+ DB_READ,
+ DB_CACHED,
+ DB_EVICTING
+} dbuf_states_t;
+
+struct objset_impl;
+struct dnode;
+struct dmu_tx;
+
+/*
+ * level = 0 means the user data
+ * level = 1 means the single indirect block
+ * etc.
+ */
+
+#define LIST_LINK_INACTIVE(link) \
+ ((link)->list_next == NULL && (link)->list_prev == NULL)
+
+struct dmu_buf_impl;
+
+typedef enum override_states {
+ DR_NOT_OVERRIDDEN,
+ DR_IN_DMU_SYNC,
+ DR_OVERRIDDEN
+} override_states_t;
+
+typedef struct dbuf_dirty_record {
+ /* link on our parents dirty list */
+ list_node_t dr_dirty_node;
+
+ /* transaction group this data will sync in */
+ uint64_t dr_txg;
+
+ /* zio of outstanding write IO */
+ zio_t *dr_zio;
+
+ /* pointer back to our dbuf */
+ struct dmu_buf_impl *dr_dbuf;
+
+ /* pointer to next dirty record */
+ struct dbuf_dirty_record *dr_next;
+
+ /* pointer to parent dirty record */
+ struct dbuf_dirty_record *dr_parent;
+
+ union dirty_types {
+ struct dirty_indirect {
+
+ /* protect access to list */
+ kmutex_t dr_mtx;
+
+ /* Our list of dirty children */
+ list_t dr_children;
+ } di;
+ struct dirty_leaf {
+
+ /*
+ * dr_data is set when we dirty the buffer
+ * so that we can retain the pointer even if it
+ * gets COW'd in a subsequent transaction group.
+ */
+ arc_buf_t *dr_data;
+ blkptr_t dr_overridden_by;
+ override_states_t dr_override_state;
+ } dl;
+ } dt;
+} dbuf_dirty_record_t;
+
+typedef struct dmu_buf_impl {
+ /*
+ * The following members are immutable, with the exception of
+ * db.db_data, which is protected by db_mtx.
+ */
+
+ /* the publicly visible structure */
+ dmu_buf_t db;
+
+ /* the objset we belong to */
+ struct objset_impl *db_objset;
+
+ /*
+ * the dnode we belong to (NULL when evicted)
+ */
+ struct dnode *db_dnode;
+
+ /*
+ * our parent buffer; if the dnode points to us directly,
+ * db_parent == db_dnode->dn_dbuf
+ * only accessed by sync thread ???
+ * (NULL when evicted)
+ */
+ struct dmu_buf_impl *db_parent;
+
+ /*
+ * link for hash table of all dmu_buf_impl_t's
+ */
+ struct dmu_buf_impl *db_hash_next;
+
+ /* our block number */
+ uint64_t db_blkid;
+
+ /*
+ * Pointer to the blkptr_t which points to us. May be NULL if we
+ * don't have one yet. (NULL when evicted)
+ */
+ blkptr_t *db_blkptr;
+
+ /*
+ * Our indirection level. Data buffers have db_level==0.
+ * Indirect buffers which point to data buffers have
+ * db_level==1. etc. Buffers which contain dnodes have
+ * db_level==0, since the dnodes are stored in a file.
+ */
+ uint8_t db_level;
+
+ /* db_mtx protects the members below */
+ kmutex_t db_mtx;
+
+ /*
+ * Current state of the buffer
+ */
+ dbuf_states_t db_state;
+
+ /*
+ * Refcount accessed by dmu_buf_{hold,rele}.
+ * If nonzero, the buffer can't be destroyed.
+ * Protected by db_mtx.
+ */
+ refcount_t db_holds;
+
+ /* buffer holding our data */
+ arc_buf_t *db_buf;
+
+ kcondvar_t db_changed;
+ dbuf_dirty_record_t *db_data_pending;
+
+ /* pointer to most recent dirty record for this buffer */
+ dbuf_dirty_record_t *db_last_dirty;
+
+ /*
+ * Our link on the owner dnodes's dn_dbufs list.
+ * Protected by its dn_dbufs_mtx.
+ */
+ list_node_t db_link;
+
+ /* Data which is unique to data (leaf) blocks: */
+
+ /* stuff we store for the user (see dmu_buf_set_user) */
+ void *db_user_ptr;
+ void **db_user_data_ptr_ptr;
+ dmu_buf_evict_func_t *db_evict_func;
+
+ uint8_t db_immediate_evict;
+ uint8_t db_freed_in_flight;
+
+ uint8_t db_dirtycnt;
+} dmu_buf_impl_t;
+
+/* Note: the dbuf hash table is exposed only for the mdb module */
+#define DBUF_MUTEXES 256
+#define DBUF_HASH_MUTEX(h, idx) (&(h)->hash_mutexes[(idx) & (DBUF_MUTEXES-1)])
+typedef struct dbuf_hash_table {
+ uint64_t hash_table_mask;
+ dmu_buf_impl_t **hash_table;
+ kmutex_t hash_mutexes[DBUF_MUTEXES];
+} dbuf_hash_table_t;
+
+
+uint64_t dbuf_whichblock(struct dnode *di, uint64_t offset);
+
+dmu_buf_impl_t *dbuf_create_tlib(struct dnode *dn, char *data);
+dmu_buf_impl_t *dbuf_create_bonus(struct dnode *dn);
+
+dmu_buf_impl_t *dbuf_hold(struct dnode *dn, uint64_t blkid, void *tag);
+dmu_buf_impl_t *dbuf_hold_level(struct dnode *dn, int level, uint64_t blkid,
+ void *tag);
+int dbuf_hold_impl(struct dnode *dn, uint8_t level, uint64_t blkid, int create,
+ void *tag, dmu_buf_impl_t **dbp);
+
+void dbuf_prefetch(struct dnode *dn, uint64_t blkid);
+
+void dbuf_add_ref(dmu_buf_impl_t *db, void *tag);
+uint64_t dbuf_refcount(dmu_buf_impl_t *db);
+
+void dbuf_rele(dmu_buf_impl_t *db, void *tag);
+
+dmu_buf_impl_t *dbuf_find(struct dnode *dn, uint8_t level, uint64_t blkid);
+
+int dbuf_read(dmu_buf_impl_t *db, zio_t *zio, uint32_t flags);
+void dbuf_will_dirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
+void dmu_buf_will_fill(dmu_buf_t *db, dmu_tx_t *tx);
+void dbuf_fill_done(dmu_buf_impl_t *db, dmu_tx_t *tx);
+void dmu_buf_will_fill(dmu_buf_t *db, dmu_tx_t *tx);
+void dmu_buf_fill_done(dmu_buf_t *db, dmu_tx_t *tx);
+dbuf_dirty_record_t *dbuf_dirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
+
+void dbuf_clear(dmu_buf_impl_t *db);
+void dbuf_evict(dmu_buf_impl_t *db);
+
+void dbuf_setdirty(dmu_buf_impl_t *db, dmu_tx_t *tx);
+void dbuf_unoverride(dbuf_dirty_record_t *dr);
+void dbuf_sync_list(list_t *list, dmu_tx_t *tx);
+
+void dbuf_free_range(struct dnode *dn, uint64_t blkid, uint64_t nblks,
+ struct dmu_tx *);
+
+void dbuf_new_size(dmu_buf_impl_t *db, int size, dmu_tx_t *tx);
+
+void dbuf_init(void);
+void dbuf_fini(void);
+
+#define DBUF_GET_BUFC_TYPE(db) \
+ ((((db)->db_level > 0) || \
+ (dmu_ot[(db)->db_dnode->dn_type].ot_metadata)) ? \
+ ARC_BUFC_METADATA : ARC_BUFC_DATA);
+
+#ifdef ZFS_DEBUG
+
+/*
+ * There should be a ## between the string literal and fmt, to make it
+ * clear that we're joining two strings together, but gcc does not
+ * support that preprocessor token.
+ */
+#define dprintf_dbuf(dbuf, fmt, ...) do { \
+ if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
+ char __db_buf[32]; \
+ uint64_t __db_obj = (dbuf)->db.db_object; \
+ if (__db_obj == DMU_META_DNODE_OBJECT) \
+ (void) strcpy(__db_buf, "mdn"); \
+ else \
+ (void) snprintf(__db_buf, sizeof (__db_buf), "%lld", \
+ (u_longlong_t)__db_obj); \
+ dprintf_ds((dbuf)->db_objset->os_dsl_dataset, \
+ "obj=%s lvl=%u blkid=%lld " fmt, \
+ __db_buf, (dbuf)->db_level, \
+ (u_longlong_t)(dbuf)->db_blkid, __VA_ARGS__); \
+ } \
+_NOTE(CONSTCOND) } while (0)
+
+#define dprintf_dbuf_bp(db, bp, fmt, ...) do { \
+ if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
+ char *__blkbuf = kmem_alloc(BP_SPRINTF_LEN, KM_SLEEP); \
+ sprintf_blkptr(__blkbuf, BP_SPRINTF_LEN, bp); \
+ dprintf_dbuf(db, fmt " %s\n", __VA_ARGS__, __blkbuf); \
+ kmem_free(__blkbuf, BP_SPRINTF_LEN); \
+ } \
+_NOTE(CONSTCOND) } while (0)
+
+#define DBUF_VERIFY(db) dbuf_verify(db)
+
+#else
+
+#define dprintf_dbuf(db, fmt, ...)
+#define dprintf_dbuf_bp(db, bp, fmt, ...)
+#define DBUF_VERIFY(db)
+
+#endif
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DBUF_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h
new file mode 100644
index 0000000..8c2a1fd
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu.h
@@ -0,0 +1,587 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DMU_H
+#define _SYS_DMU_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * This file describes the interface that the DMU provides for its
+ * consumers.
+ *
+ * The DMU also interacts with the SPA. That interface is described in
+ * dmu_spa.h.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct uio;
+struct page;
+struct vnode;
+struct spa;
+struct zilog;
+struct zio;
+struct blkptr;
+struct zap_cursor;
+struct dsl_dataset;
+struct dsl_pool;
+struct dnode;
+struct drr_begin;
+struct drr_end;
+struct zbookmark;
+struct spa;
+struct nvlist;
+struct objset_impl;
+struct file;
+
+typedef struct objset objset_t;
+typedef struct dmu_tx dmu_tx_t;
+typedef struct dsl_dir dsl_dir_t;
+
+typedef enum dmu_object_type {
+ DMU_OT_NONE,
+ /* general: */
+ DMU_OT_OBJECT_DIRECTORY, /* ZAP */
+ DMU_OT_OBJECT_ARRAY, /* UINT64 */
+ DMU_OT_PACKED_NVLIST, /* UINT8 (XDR by nvlist_pack/unpack) */
+ DMU_OT_PACKED_NVLIST_SIZE, /* UINT64 */
+ DMU_OT_BPLIST, /* UINT64 */
+ DMU_OT_BPLIST_HDR, /* UINT64 */
+ /* spa: */
+ DMU_OT_SPACE_MAP_HEADER, /* UINT64 */
+ DMU_OT_SPACE_MAP, /* UINT64 */
+ /* zil: */
+ DMU_OT_INTENT_LOG, /* UINT64 */
+ /* dmu: */
+ DMU_OT_DNODE, /* DNODE */
+ DMU_OT_OBJSET, /* OBJSET */
+ /* dsl: */
+ DMU_OT_DSL_DIR, /* UINT64 */
+ DMU_OT_DSL_DIR_CHILD_MAP, /* ZAP */
+ DMU_OT_DSL_DS_SNAP_MAP, /* ZAP */
+ DMU_OT_DSL_PROPS, /* ZAP */
+ DMU_OT_DSL_DATASET, /* UINT64 */
+ /* zpl: */
+ DMU_OT_ZNODE, /* ZNODE */
+ DMU_OT_ACL, /* ACL */
+ DMU_OT_PLAIN_FILE_CONTENTS, /* UINT8 */
+ DMU_OT_DIRECTORY_CONTENTS, /* ZAP */
+ DMU_OT_MASTER_NODE, /* ZAP */
+ DMU_OT_UNLINKED_SET, /* ZAP */
+ /* zvol: */
+ DMU_OT_ZVOL, /* UINT8 */
+ DMU_OT_ZVOL_PROP, /* ZAP */
+ /* other; for testing only! */
+ DMU_OT_PLAIN_OTHER, /* UINT8 */
+ DMU_OT_UINT64_OTHER, /* UINT64 */
+ DMU_OT_ZAP_OTHER, /* ZAP */
+ /* new object types: */
+ DMU_OT_ERROR_LOG, /* ZAP */
+ DMU_OT_SPA_HISTORY, /* UINT8 */
+ DMU_OT_SPA_HISTORY_OFFSETS, /* spa_his_phys_t */
+ DMU_OT_POOL_PROPS, /* ZAP */
+
+ DMU_OT_NUMTYPES
+} dmu_object_type_t;
+
+typedef enum dmu_objset_type {
+ DMU_OST_NONE,
+ DMU_OST_META,
+ DMU_OST_ZFS,
+ DMU_OST_ZVOL,
+ DMU_OST_OTHER, /* For testing only! */
+ DMU_OST_ANY, /* Be careful! */
+ DMU_OST_NUMTYPES
+} dmu_objset_type_t;
+
+void byteswap_uint64_array(void *buf, size_t size);
+void byteswap_uint32_array(void *buf, size_t size);
+void byteswap_uint16_array(void *buf, size_t size);
+void byteswap_uint8_array(void *buf, size_t size);
+void zap_byteswap(void *buf, size_t size);
+void zfs_acl_byteswap(void *buf, size_t size);
+void zfs_znode_byteswap(void *buf, size_t size);
+
+#define DS_MODE_NONE 0 /* invalid, to aid debugging */
+#define DS_MODE_STANDARD 1 /* normal access, no special needs */
+#define DS_MODE_PRIMARY 2 /* the "main" access, e.g. a mount */
+#define DS_MODE_EXCLUSIVE 3 /* exclusive access, e.g. to destroy */
+#define DS_MODE_LEVELS 4
+#define DS_MODE_LEVEL(x) ((x) & (DS_MODE_LEVELS - 1))
+#define DS_MODE_READONLY 0x8
+#define DS_MODE_IS_READONLY(x) ((x) & DS_MODE_READONLY)
+#define DS_MODE_INCONSISTENT 0x10
+#define DS_MODE_IS_INCONSISTENT(x) ((x) & DS_MODE_INCONSISTENT)
+
+#define DS_FIND_SNAPSHOTS (1<<0)
+#define DS_FIND_CHILDREN (1<<1)
+
+/*
+ * The maximum number of bytes that can be accessed as part of one
+ * operation, including metadata.
+ */
+#define DMU_MAX_ACCESS (10<<20) /* 10MB */
+
+/*
+ * Public routines to create, destroy, open, and close objsets.
+ */
+int dmu_objset_open(const char *name, dmu_objset_type_t type, int mode,
+ objset_t **osp);
+void dmu_objset_close(objset_t *os);
+int dmu_objset_evict_dbufs(objset_t *os, int try);
+int dmu_objset_create(const char *name, dmu_objset_type_t type,
+ objset_t *clone_parent,
+ void (*func)(objset_t *os, void *arg, dmu_tx_t *tx), void *arg);
+int dmu_objset_destroy(const char *name);
+int dmu_snapshots_destroy(char *fsname, char *snapname);
+int dmu_objset_rollback(const char *name);
+int dmu_objset_snapshot(char *fsname, char *snapname, boolean_t recursive);
+int dmu_objset_rename(const char *name, const char *newname,
+ boolean_t recursive);
+int dmu_objset_find(char *name, int func(char *, void *), void *arg,
+ int flags);
+void dmu_objset_byteswap(void *buf, size_t size);
+
+typedef struct dmu_buf {
+ uint64_t db_object; /* object that this buffer is part of */
+ uint64_t db_offset; /* byte offset in this object */
+ uint64_t db_size; /* size of buffer in bytes */
+ void *db_data; /* data in buffer */
+} dmu_buf_t;
+
+typedef void dmu_buf_evict_func_t(struct dmu_buf *db, void *user_ptr);
+
+/*
+ * Callback function to perform byte swapping on a block.
+ */
+typedef void dmu_byteswap_func_t(void *buf, size_t size);
+
+/*
+ * The names of zap entries in the DIRECTORY_OBJECT of the MOS.
+ */
+#define DMU_POOL_DIRECTORY_OBJECT 1
+#define DMU_POOL_CONFIG "config"
+#define DMU_POOL_ROOT_DATASET "root_dataset"
+#define DMU_POOL_SYNC_BPLIST "sync_bplist"
+#define DMU_POOL_ERRLOG_SCRUB "errlog_scrub"
+#define DMU_POOL_ERRLOG_LAST "errlog_last"
+#define DMU_POOL_SPARES "spares"
+#define DMU_POOL_DEFLATE "deflate"
+#define DMU_POOL_HISTORY "history"
+#define DMU_POOL_PROPS "pool_props"
+
+/*
+ * Allocate an object from this objset. The range of object numbers
+ * available is (0, DN_MAX_OBJECT). Object 0 is the meta-dnode.
+ *
+ * The transaction must be assigned to a txg. The newly allocated
+ * object will be "held" in the transaction (ie. you can modify the
+ * newly allocated object in this transaction).
+ *
+ * dmu_object_alloc() chooses an object and returns it in *objectp.
+ *
+ * dmu_object_claim() allocates a specific object number. If that
+ * number is already allocated, it fails and returns EEXIST.
+ *
+ * Return 0 on success, or ENOSPC or EEXIST as specified above.
+ */
+uint64_t dmu_object_alloc(objset_t *os, dmu_object_type_t ot,
+ int blocksize, dmu_object_type_t bonus_type, int bonus_len, dmu_tx_t *tx);
+int dmu_object_claim(objset_t *os, uint64_t object, dmu_object_type_t ot,
+ int blocksize, dmu_object_type_t bonus_type, int bonus_len, dmu_tx_t *tx);
+int dmu_object_reclaim(objset_t *os, uint64_t object, dmu_object_type_t ot,
+ int blocksize, dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx);
+
+/*
+ * Free an object from this objset.
+ *
+ * The object's data will be freed as well (ie. you don't need to call
+ * dmu_free(object, 0, -1, tx)).
+ *
+ * The object need not be held in the transaction.
+ *
+ * If there are any holds on this object's buffers (via dmu_buf_hold()),
+ * or tx holds on the object (via dmu_tx_hold_object()), you can not
+ * free it; it fails and returns EBUSY.
+ *
+ * If the object is not allocated, it fails and returns ENOENT.
+ *
+ * Return 0 on success, or EBUSY or ENOENT as specified above.
+ */
+int dmu_object_free(objset_t *os, uint64_t object, dmu_tx_t *tx);
+
+/*
+ * Find the next allocated or free object.
+ *
+ * The objectp parameter is in-out. It will be updated to be the next
+ * object which is allocated. Ignore objects which have not been
+ * modified since txg.
+ *
+ * XXX Can only be called on a objset with no dirty data.
+ *
+ * Returns 0 on success, or ENOENT if there are no more objects.
+ */
+int dmu_object_next(objset_t *os, uint64_t *objectp,
+ boolean_t hole, uint64_t txg);
+
+/*
+ * Set the data blocksize for an object.
+ *
+ * The object cannot have any blocks allcated beyond the first. If
+ * the first block is allocated already, the new size must be greater
+ * than the current block size. If these conditions are not met,
+ * ENOTSUP will be returned.
+ *
+ * Returns 0 on success, or EBUSY if there are any holds on the object
+ * contents, or ENOTSUP as described above.
+ */
+int dmu_object_set_blocksize(objset_t *os, uint64_t object, uint64_t size,
+ int ibs, dmu_tx_t *tx);
+
+/*
+ * Set the checksum property on a dnode. The new checksum algorithm will
+ * apply to all newly written blocks; existing blocks will not be affected.
+ */
+void dmu_object_set_checksum(objset_t *os, uint64_t object, uint8_t checksum,
+ dmu_tx_t *tx);
+
+/*
+ * Set the compress property on a dnode. The new compression algorithm will
+ * apply to all newly written blocks; existing blocks will not be affected.
+ */
+void dmu_object_set_compress(objset_t *os, uint64_t object, uint8_t compress,
+ dmu_tx_t *tx);
+
+/*
+ * Decide how many copies of a given block we should make. Can be from
+ * 1 to SPA_DVAS_PER_BP.
+ */
+int dmu_get_replication_level(struct objset_impl *, struct zbookmark *zb,
+ dmu_object_type_t ot);
+/*
+ * The bonus data is accessed more or less like a regular buffer.
+ * You must dmu_bonus_hold() to get the buffer, which will give you a
+ * dmu_buf_t with db_offset==-1ULL, and db_size = the size of the bonus
+ * data. As with any normal buffer, you must call dmu_buf_read() to
+ * read db_data, dmu_buf_will_dirty() before modifying it, and the
+ * object must be held in an assigned transaction before calling
+ * dmu_buf_will_dirty. You may use dmu_buf_set_user() on the bonus
+ * buffer as well. You must release your hold with dmu_buf_rele().
+ */
+int dmu_bonus_hold(objset_t *os, uint64_t object, void *tag, dmu_buf_t **);
+int dmu_bonus_max(void);
+
+/*
+ * Obtain the DMU buffer from the specified object which contains the
+ * specified offset. dmu_buf_hold() puts a "hold" on the buffer, so
+ * that it will remain in memory. You must release the hold with
+ * dmu_buf_rele(). You musn't access the dmu_buf_t after releasing your
+ * hold. You must have a hold on any dmu_buf_t* you pass to the DMU.
+ *
+ * You must call dmu_buf_read, dmu_buf_will_dirty, or dmu_buf_will_fill
+ * on the returned buffer before reading or writing the buffer's
+ * db_data. The comments for those routines describe what particular
+ * operations are valid after calling them.
+ *
+ * The object number must be a valid, allocated object number.
+ */
+int dmu_buf_hold(objset_t *os, uint64_t object, uint64_t offset,
+ void *tag, dmu_buf_t **);
+void dmu_buf_add_ref(dmu_buf_t *db, void* tag);
+void dmu_buf_rele(dmu_buf_t *db, void *tag);
+uint64_t dmu_buf_refcount(dmu_buf_t *db);
+
+/*
+ * dmu_buf_hold_array holds the DMU buffers which contain all bytes in a
+ * range of an object. A pointer to an array of dmu_buf_t*'s is
+ * returned (in *dbpp).
+ *
+ * dmu_buf_rele_array releases the hold on an array of dmu_buf_t*'s, and
+ * frees the array. The hold on the array of buffers MUST be released
+ * with dmu_buf_rele_array. You can NOT release the hold on each buffer
+ * individually with dmu_buf_rele.
+ */
+int dmu_buf_hold_array_by_bonus(dmu_buf_t *db, uint64_t offset,
+ uint64_t length, int read, void *tag, int *numbufsp, dmu_buf_t ***dbpp);
+void dmu_buf_rele_array(dmu_buf_t **, int numbufs, void *tag);
+
+/*
+ * Returns NULL on success, or the existing user ptr if it's already
+ * been set.
+ *
+ * user_ptr is for use by the user and can be obtained via dmu_buf_get_user().
+ *
+ * user_data_ptr_ptr should be NULL, or a pointer to a pointer which
+ * will be set to db->db_data when you are allowed to access it. Note
+ * that db->db_data (the pointer) can change when you do dmu_buf_read(),
+ * dmu_buf_tryupgrade(), dmu_buf_will_dirty(), or dmu_buf_will_fill().
+ * *user_data_ptr_ptr will be set to the new value when it changes.
+ *
+ * If non-NULL, pageout func will be called when this buffer is being
+ * excised from the cache, so that you can clean up the data structure
+ * pointed to by user_ptr.
+ *
+ * dmu_evict_user() will call the pageout func for all buffers in a
+ * objset with a given pageout func.
+ */
+void *dmu_buf_set_user(dmu_buf_t *db, void *user_ptr, void *user_data_ptr_ptr,
+ dmu_buf_evict_func_t *pageout_func);
+/*
+ * set_user_ie is the same as set_user, but request immediate eviction
+ * when hold count goes to zero.
+ */
+void *dmu_buf_set_user_ie(dmu_buf_t *db, void *user_ptr,
+ void *user_data_ptr_ptr, dmu_buf_evict_func_t *pageout_func);
+void *dmu_buf_update_user(dmu_buf_t *db_fake, void *old_user_ptr,
+ void *user_ptr, void *user_data_ptr_ptr,
+ dmu_buf_evict_func_t *pageout_func);
+void dmu_evict_user(objset_t *os, dmu_buf_evict_func_t *func);
+
+/*
+ * Returns the user_ptr set with dmu_buf_set_user(), or NULL if not set.
+ */
+void *dmu_buf_get_user(dmu_buf_t *db);
+
+/*
+ * Indicate that you are going to modify the buffer's data (db_data).
+ *
+ * The transaction (tx) must be assigned to a txg (ie. you've called
+ * dmu_tx_assign()). The buffer's object must be held in the tx
+ * (ie. you've called dmu_tx_hold_object(tx, db->db_object)).
+ */
+void dmu_buf_will_dirty(dmu_buf_t *db, dmu_tx_t *tx);
+
+/*
+ * You must create a transaction, then hold the objects which you will
+ * (or might) modify as part of this transaction. Then you must assign
+ * the transaction to a transaction group. Once the transaction has
+ * been assigned, you can modify buffers which belong to held objects as
+ * part of this transaction. You can't modify buffers before the
+ * transaction has been assigned; you can't modify buffers which don't
+ * belong to objects which this transaction holds; you can't hold
+ * objects once the transaction has been assigned. You may hold an
+ * object which you are going to free (with dmu_object_free()), but you
+ * don't have to.
+ *
+ * You can abort the transaction before it has been assigned.
+ *
+ * Note that you may hold buffers (with dmu_buf_hold) at any time,
+ * regardless of transaction state.
+ */
+
+#define DMU_NEW_OBJECT (-1ULL)
+#define DMU_OBJECT_END (-1ULL)
+
+dmu_tx_t *dmu_tx_create(objset_t *os);
+void dmu_tx_hold_write(dmu_tx_t *tx, uint64_t object, uint64_t off, int len);
+void dmu_tx_hold_free(dmu_tx_t *tx, uint64_t object, uint64_t off,
+ uint64_t len);
+void dmu_tx_hold_zap(dmu_tx_t *tx, uint64_t object, int add, char *name);
+void dmu_tx_hold_bonus(dmu_tx_t *tx, uint64_t object);
+void dmu_tx_abort(dmu_tx_t *tx);
+int dmu_tx_assign(dmu_tx_t *tx, uint64_t txg_how);
+void dmu_tx_wait(dmu_tx_t *tx);
+void dmu_tx_commit(dmu_tx_t *tx);
+
+/*
+ * Free up the data blocks for a defined range of a file. If size is
+ * zero, the range from offset to end-of-file is freed.
+ */
+int dmu_free_range(objset_t *os, uint64_t object, uint64_t offset,
+ uint64_t size, dmu_tx_t *tx);
+
+/*
+ * Convenience functions.
+ *
+ * Canfail routines will return 0 on success, or an errno if there is a
+ * nonrecoverable I/O error.
+ */
+int dmu_read(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
+ void *buf);
+void dmu_write(objset_t *os, uint64_t object, uint64_t offset, uint64_t size,
+ const void *buf, dmu_tx_t *tx);
+int dmu_read_uio(objset_t *os, uint64_t object, struct uio *uio, uint64_t size);
+int dmu_write_uio(objset_t *os, uint64_t object, struct uio *uio, uint64_t size,
+ dmu_tx_t *tx);
+int dmu_write_pages(objset_t *os, uint64_t object, uint64_t offset,
+ uint64_t size, struct page *pp, dmu_tx_t *tx);
+
+extern int zfs_prefetch_disable;
+
+/*
+ * Asynchronously try to read in the data.
+ */
+void dmu_prefetch(objset_t *os, uint64_t object, uint64_t offset,
+ uint64_t len);
+
+typedef struct dmu_object_info {
+ /* All sizes are in bytes. */
+ uint32_t doi_data_block_size;
+ uint32_t doi_metadata_block_size;
+ uint64_t doi_bonus_size;
+ dmu_object_type_t doi_type;
+ dmu_object_type_t doi_bonus_type;
+ uint8_t doi_indirection; /* 2 = dnode->indirect->data */
+ uint8_t doi_checksum;
+ uint8_t doi_compress;
+ uint8_t doi_pad[5];
+ /* Values below are number of 512-byte blocks. */
+ uint64_t doi_physical_blks; /* data + metadata */
+ uint64_t doi_max_block_offset;
+} dmu_object_info_t;
+
+typedef struct dmu_object_type_info {
+ dmu_byteswap_func_t *ot_byteswap;
+ boolean_t ot_metadata;
+ char *ot_name;
+} dmu_object_type_info_t;
+
+extern const dmu_object_type_info_t dmu_ot[DMU_OT_NUMTYPES];
+
+/*
+ * Get information on a DMU object.
+ *
+ * Return 0 on success or ENOENT if object is not allocated.
+ *
+ * If doi is NULL, just indicates whether the object exists.
+ */
+int dmu_object_info(objset_t *os, uint64_t object, dmu_object_info_t *doi);
+void dmu_object_info_from_dnode(struct dnode *dn, dmu_object_info_t *doi);
+void dmu_object_info_from_db(dmu_buf_t *db, dmu_object_info_t *doi);
+void dmu_object_size_from_db(dmu_buf_t *db, uint32_t *blksize,
+ u_longlong_t *nblk512);
+
+typedef struct dmu_objset_stats {
+ uint64_t dds_num_clones; /* number of clones of this */
+ uint64_t dds_creation_txg;
+ dmu_objset_type_t dds_type;
+ uint8_t dds_is_snapshot;
+ uint8_t dds_inconsistent;
+ char dds_clone_of[MAXNAMELEN];
+} dmu_objset_stats_t;
+
+/*
+ * Get stats on a dataset.
+ */
+void dmu_objset_fast_stat(objset_t *os, dmu_objset_stats_t *stat);
+
+/*
+ * Add entries to the nvlist for all the objset's properties. See
+ * zfs_prop_table[] and zfs(1m) for details on the properties.
+ */
+void dmu_objset_stats(objset_t *os, struct nvlist *nv);
+
+/*
+ * Get the space usage statistics for statvfs().
+ *
+ * refdbytes is the amount of space "referenced" by this objset.
+ * availbytes is the amount of space available to this objset, taking
+ * into account quotas & reservations, assuming that no other objsets
+ * use the space first. These values correspond to the 'referenced' and
+ * 'available' properties, described in the zfs(1m) manpage.
+ *
+ * usedobjs and availobjs are the number of objects currently allocated,
+ * and available.
+ */
+void dmu_objset_space(objset_t *os, uint64_t *refdbytesp, uint64_t *availbytesp,
+ uint64_t *usedobjsp, uint64_t *availobjsp);
+
+/*
+ * The fsid_guid is a 56-bit ID that can change to avoid collisions.
+ * (Contrast with the ds_guid which is a 64-bit ID that will never
+ * change, so there is a small probability that it will collide.)
+ */
+uint64_t dmu_objset_fsid_guid(objset_t *os);
+
+int dmu_objset_is_snapshot(objset_t *os);
+
+extern struct spa *dmu_objset_spa(objset_t *os);
+extern struct zilog *dmu_objset_zil(objset_t *os);
+extern struct dsl_pool *dmu_objset_pool(objset_t *os);
+extern struct dsl_dataset *dmu_objset_ds(objset_t *os);
+extern void dmu_objset_name(objset_t *os, char *buf);
+extern dmu_objset_type_t dmu_objset_type(objset_t *os);
+extern uint64_t dmu_objset_id(objset_t *os);
+extern int dmu_snapshot_list_next(objset_t *os, int namelen, char *name,
+ uint64_t *id, uint64_t *offp);
+extern int dmu_dir_list_next(objset_t *os, int namelen, char *name,
+ uint64_t *idp, uint64_t *offp);
+
+/*
+ * Return the txg number for the given assigned transaction.
+ */
+uint64_t dmu_tx_get_txg(dmu_tx_t *tx);
+
+/*
+ * Synchronous write.
+ * If a parent zio is provided this function initiates a write on the
+ * provided buffer as a child of the parent zio.
+ * In the absense of a parent zio, the write is completed synchronously.
+ * At write completion, blk is filled with the bp of the written block.
+ * Note that while the data covered by this function will be on stable
+ * storage when the write completes this new data does not become a
+ * permanent part of the file until the associated transaction commits.
+ */
+typedef void dmu_sync_cb_t(dmu_buf_t *db, void *arg);
+int dmu_sync(struct zio *zio, dmu_buf_t *db,
+ struct blkptr *bp, uint64_t txg, dmu_sync_cb_t *done, void *arg);
+
+/*
+ * Find the next hole or data block in file starting at *off
+ * Return found offset in *off. Return ESRCH for end of file.
+ */
+int dmu_offset_next(objset_t *os, uint64_t object, boolean_t hole,
+ uint64_t *off);
+
+/*
+ * Initial setup and final teardown.
+ */
+extern void dmu_init(void);
+extern void dmu_fini(void);
+
+typedef void (*dmu_traverse_cb_t)(objset_t *os, void *arg, struct blkptr *bp,
+ uint64_t object, uint64_t offset, int len);
+void dmu_traverse_objset(objset_t *os, uint64_t txg_start,
+ dmu_traverse_cb_t cb, void *arg);
+
+int dmu_sendbackup(objset_t *tosnap, objset_t *fromsnap, struct file *fp);
+int dmu_recvbackup(char *tosnap, struct drr_begin *drrb, uint64_t *sizep,
+ boolean_t force, struct file *fp, uint64_t voffset);
+
+/* CRC64 table */
+#define ZFS_CRC64_POLY 0xC96C5795D7870F42ULL /* ECMA-182, reflected form */
+extern uint64_t zfs_crc64_table[256];
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DMU_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_impl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_impl.h
new file mode 100644
index 0000000..807011e
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_impl.h
@@ -0,0 +1,237 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DMU_IMPL_H
+#define _SYS_DMU_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/txg_impl.h>
+#include <sys/zio.h>
+#include <sys/dnode.h>
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * This is the locking strategy for the DMU. Numbers in parenthesis are
+ * cases that use that lock order, referenced below:
+ *
+ * ARC is self-contained
+ * bplist is self-contained
+ * refcount is self-contained
+ * txg is self-contained (hopefully!)
+ * zst_lock
+ * zf_rwlock
+ *
+ * XXX try to improve evicting path?
+ *
+ * dp_config_rwlock > os_obj_lock > dn_struct_rwlock >
+ * dn_dbufs_mtx > hash_mutexes > db_mtx > leafs
+ *
+ * dp_config_rwlock
+ * must be held before: everything
+ * protects dd namespace changes
+ * protects property changes globally
+ * held from:
+ * dsl_dir_open/r:
+ * dsl_dir_create_sync/w:
+ * dsl_dir_sync_destroy/w:
+ * dsl_dir_rename_sync/w:
+ * dsl_prop_changed_notify/r:
+ *
+ * os_obj_lock
+ * must be held before:
+ * everything except dp_config_rwlock
+ * protects os_obj_next
+ * held from:
+ * dmu_object_alloc: dn_dbufs_mtx, db_mtx, hash_mutexes, dn_struct_rwlock
+ *
+ * dn_struct_rwlock
+ * must be held before:
+ * everything except dp_config_rwlock and os_obj_lock
+ * protects structure of dnode (eg. nlevels)
+ * db_blkptr can change when syncing out change to nlevels
+ * dn_maxblkid
+ * dn_nlevels
+ * dn_*blksz*
+ * phys nlevels, maxblkid, physical blkptr_t's (?)
+ * held from:
+ * callers of dbuf_read_impl, dbuf_hold[_impl], dbuf_prefetch
+ * dmu_object_info_from_dnode: dn_dirty_mtx (dn_datablksz)
+ * dmu_tx_count_free:
+ * dbuf_read_impl: db_mtx, dmu_zfetch()
+ * dmu_zfetch: zf_rwlock/r, zst_lock, dbuf_prefetch()
+ * dbuf_new_size: db_mtx
+ * dbuf_dirty: db_mtx
+ * dbuf_findbp: (callers, phys? - the real need)
+ * dbuf_create: dn_dbufs_mtx, hash_mutexes, db_mtx (phys?)
+ * dbuf_prefetch: dn_dirty_mtx, hash_mutexes, db_mtx, dn_dbufs_mtx
+ * dbuf_hold_impl: hash_mutexes, db_mtx, dn_dbufs_mtx, dbuf_findbp()
+ * dnode_sync/w (increase_indirection): db_mtx (phys)
+ * dnode_set_blksz/w: dn_dbufs_mtx (dn_*blksz*)
+ * dnode_new_blkid/w: (dn_maxblkid)
+ * dnode_free_range/w: dn_dirty_mtx (dn_maxblkid)
+ * dnode_next_offset: (phys)
+ *
+ * dn_dbufs_mtx
+ * must be held before:
+ * db_mtx, hash_mutexes
+ * protects:
+ * dn_dbufs
+ * dn_evicted
+ * held from:
+ * dmu_evict_user: db_mtx (dn_dbufs)
+ * dbuf_free_range: db_mtx (dn_dbufs)
+ * dbuf_remove_ref: db_mtx, callees:
+ * dbuf_hash_remove: hash_mutexes, db_mtx
+ * dbuf_create: hash_mutexes, db_mtx (dn_dbufs)
+ * dnode_set_blksz: (dn_dbufs)
+ *
+ * hash_mutexes (global)
+ * must be held before:
+ * db_mtx
+ * protects dbuf_hash_table (global) and db_hash_next
+ * held from:
+ * dbuf_find: db_mtx
+ * dbuf_hash_insert: db_mtx
+ * dbuf_hash_remove: db_mtx
+ *
+ * db_mtx (meta-leaf)
+ * must be held before:
+ * dn_mtx, dn_dirty_mtx, dd_lock (leaf mutexes)
+ * protects:
+ * db_state
+ * db_holds
+ * db_buf
+ * db_changed
+ * db_data_pending
+ * db_dirtied
+ * db_link
+ * db_dirty_node (??)
+ * db_dirtycnt
+ * db_d.*
+ * db.*
+ * held from:
+ * dbuf_dirty: dn_mtx, dn_dirty_mtx
+ * dbuf_dirty->dsl_dir_willuse_space: dd_lock
+ * dbuf_dirty->dbuf_new_block->dsl_dataset_block_freeable: dd_lock
+ * dbuf_undirty: dn_dirty_mtx (db_d)
+ * dbuf_write_done: dn_dirty_mtx (db_state)
+ * dbuf_*
+ * dmu_buf_update_user: none (db_d)
+ * dmu_evict_user: none (db_d) (maybe can eliminate)
+ * dbuf_find: none (db_holds)
+ * dbuf_hash_insert: none (db_holds)
+ * dmu_buf_read_array_impl: none (db_state, db_changed)
+ * dmu_sync: none (db_dirty_node, db_d)
+ * dnode_reallocate: none (db)
+ *
+ * dn_mtx (leaf)
+ * protects:
+ * dn_dirty_dbufs
+ * dn_ranges
+ * phys accounting
+ * dn_allocated_txg
+ * dn_free_txg
+ * dn_assigned_txg
+ * dd_assigned_tx
+ * dn_notxholds
+ * dn_dirtyctx
+ * dn_dirtyctx_firstset
+ * (dn_phys copy fields?)
+ * (dn_phys contents?)
+ * held from:
+ * dnode_*
+ * dbuf_dirty: none
+ * dbuf_sync: none (phys accounting)
+ * dbuf_undirty: none (dn_ranges, dn_dirty_dbufs)
+ * dbuf_write_done: none (phys accounting)
+ * dmu_object_info_from_dnode: none (accounting)
+ * dmu_tx_commit: none
+ * dmu_tx_hold_object_impl: none
+ * dmu_tx_try_assign: dn_notxholds(cv)
+ * dmu_tx_unassign: none
+ *
+ * dd_lock (leaf)
+ * protects:
+ * dd_prop_cbs
+ * dd_sync_*
+ * dd_used_bytes
+ * dd_tempreserved
+ * dd_space_towrite
+ * dd_myname
+ * dd_phys accounting?
+ * held from:
+ * dsl_dir_*
+ * dsl_prop_changed_notify: none (dd_prop_cbs)
+ * dsl_prop_register: none (dd_prop_cbs)
+ * dsl_prop_unregister: none (dd_prop_cbs)
+ * dsl_dataset_block_freeable: none (dd_sync_*)
+ *
+ * os_lock (leaf)
+ * protects:
+ * os_dirty_dnodes
+ * os_free_dnodes
+ * os_dnodes
+ * os_downgraded_dbufs
+ * dn_dirtyblksz
+ * dn_dirty_link
+ * held from:
+ * dnode_create: none (os_dnodes)
+ * dnode_destroy: none (os_dnodes)
+ * dnode_setdirty: none (dn_dirtyblksz, os_*_dnodes)
+ * dnode_free: none (dn_dirtyblksz, os_*_dnodes)
+ *
+ * ds_lock (leaf)
+ * protects:
+ * ds_user_ptr
+ * ds_user_evice_func
+ * ds_open_refcount
+ * ds_snapname
+ * ds_phys accounting
+ * held from:
+ * dsl_dataset_*
+ *
+ * dr_mtx (leaf)
+ * protects:
+ * dr_children
+ * held from:
+ * dbuf_dirty
+ * dbuf_undirty
+ * dbuf_sync_indirect
+ * dnode_new_blkid
+ */
+
+struct objset;
+struct dmu_pool;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DMU_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_objset.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_objset.h
new file mode 100644
index 0000000..8293a3b
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_objset.h
@@ -0,0 +1,125 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DMU_OBJSET_H
+#define _SYS_DMU_OBJSET_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa.h>
+#include <sys/arc.h>
+#include <sys/txg.h>
+#include <sys/zfs_context.h>
+#include <sys/dnode.h>
+#include <sys/zio.h>
+#include <sys/zil.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct dsl_dataset;
+struct dmu_tx;
+struct objset_impl;
+
+typedef struct objset_phys {
+ dnode_phys_t os_meta_dnode;
+ zil_header_t os_zil_header;
+ uint64_t os_type;
+ char os_pad[1024 - sizeof (dnode_phys_t) - sizeof (zil_header_t) -
+ sizeof (uint64_t)];
+} objset_phys_t;
+
+struct objset {
+ struct objset_impl *os;
+ int os_mode;
+};
+
+typedef struct objset_impl {
+ /* Immutable: */
+ struct dsl_dataset *os_dsl_dataset;
+ spa_t *os_spa;
+ arc_buf_t *os_phys_buf;
+ objset_phys_t *os_phys;
+ dnode_t *os_meta_dnode;
+ zilog_t *os_zil;
+ objset_t os;
+ uint8_t os_checksum; /* can change, under dsl_dir's locks */
+ uint8_t os_compress; /* can change, under dsl_dir's locks */
+ uint8_t os_copies; /* can change, under dsl_dir's locks */
+ uint8_t os_md_checksum;
+ uint8_t os_md_compress;
+
+ /* no lock needed: */
+ struct dmu_tx *os_synctx; /* XXX sketchy */
+ blkptr_t *os_rootbp;
+
+ /* Protected by os_obj_lock */
+ kmutex_t os_obj_lock;
+ uint64_t os_obj_next;
+
+ /* Protected by os_lock */
+ kmutex_t os_lock;
+ list_t os_dirty_dnodes[TXG_SIZE];
+ list_t os_free_dnodes[TXG_SIZE];
+ list_t os_dnodes;
+ list_t os_downgraded_dbufs;
+} objset_impl_t;
+
+#define DMU_META_DNODE_OBJECT 0
+
+/* called from zpl */
+int dmu_objset_open(const char *name, dmu_objset_type_t type, int mode,
+ objset_t **osp);
+void dmu_objset_close(objset_t *os);
+int dmu_objset_create(const char *name, dmu_objset_type_t type,
+ objset_t *clone_parent,
+ void (*func)(objset_t *os, void *arg, dmu_tx_t *tx), void *arg);
+int dmu_objset_destroy(const char *name);
+int dmu_objset_rollback(const char *name);
+int dmu_objset_snapshot(char *fsname, char *snapname, boolean_t recursive);
+void dmu_objset_stats(objset_t *os, nvlist_t *nv);
+void dmu_objset_fast_stat(objset_t *os, dmu_objset_stats_t *stat);
+void dmu_objset_space(objset_t *os, uint64_t *refdbytesp, uint64_t *availbytesp,
+ uint64_t *usedobjsp, uint64_t *availobjsp);
+uint64_t dmu_objset_fsid_guid(objset_t *os);
+int dmu_objset_find(char *name, int func(char *, void *), void *arg,
+ int flags);
+void dmu_objset_byteswap(void *buf, size_t size);
+int dmu_objset_evict_dbufs(objset_t *os, int try);
+
+/* called from dsl */
+void dmu_objset_sync(objset_impl_t *os, zio_t *zio, dmu_tx_t *tx);
+objset_impl_t *dmu_objset_create_impl(spa_t *spa, struct dsl_dataset *ds,
+ blkptr_t *bp, dmu_objset_type_t type, dmu_tx_t *tx);
+int dmu_objset_open_impl(spa_t *spa, struct dsl_dataset *ds, blkptr_t *bp,
+ objset_impl_t **osip);
+void dmu_objset_evict(struct dsl_dataset *ds, void *arg);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DMU_OBJSET_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_traverse.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_traverse.h
new file mode 100644
index 0000000..ea9fa6c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_traverse.h
@@ -0,0 +1,120 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DMU_TRAVERSE_H
+#define _SYS_DMU_TRAVERSE_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/zio.h>
+#include <sys/dmu.h>
+#include <sys/dnode.h>
+#include <sys/arc.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ADVANCE_POST 0 /* post-order traversal */
+#define ADVANCE_PRE 0x01 /* pre-order traversal */
+#define ADVANCE_PRUNE 0x02 /* prune by prev snapshot birth time */
+#define ADVANCE_DATA 0x04 /* read user data blocks */
+#define ADVANCE_HOLES 0x08 /* visit holes */
+#define ADVANCE_ZIL 0x10 /* visit intent log blocks */
+#define ADVANCE_NOLOCK 0x20 /* Don't grab SPA sync lock */
+
+#define ZB_NO_LEVEL -2
+#define ZB_MAXLEVEL 32 /* Next power of 2 >= DN_MAX_LEVELS */
+#define ZB_MAXBLKID (1ULL << 62)
+#define ZB_MAXOBJSET (1ULL << 62)
+#define ZB_MAXOBJECT (1ULL << 62)
+
+#define ZB_MOS_CACHE 0
+#define ZB_MDN_CACHE 1
+#define ZB_DN_CACHE 2
+#define ZB_DEPTH 3
+
+typedef struct zseg {
+ uint64_t seg_mintxg;
+ uint64_t seg_maxtxg;
+ zbookmark_t seg_start;
+ zbookmark_t seg_end;
+ list_node_t seg_node;
+} zseg_t;
+
+typedef struct traverse_blk_cache {
+ zbookmark_t bc_bookmark;
+ blkptr_t bc_blkptr;
+ void *bc_data;
+ dnode_phys_t *bc_dnode;
+ int bc_errno;
+ int bc_pad1;
+ uint64_t bc_pad2;
+} traverse_blk_cache_t;
+
+typedef int (blkptr_cb_t)(traverse_blk_cache_t *bc, spa_t *spa, void *arg);
+
+struct traverse_handle {
+ spa_t *th_spa;
+ blkptr_cb_t *th_func;
+ void *th_arg;
+ uint16_t th_advance;
+ uint16_t th_locked;
+ int th_zio_flags;
+ list_t th_seglist;
+ traverse_blk_cache_t th_cache[ZB_DEPTH][ZB_MAXLEVEL];
+ traverse_blk_cache_t th_zil_cache;
+ uint64_t th_hits;
+ uint64_t th_arc_hits;
+ uint64_t th_reads;
+ uint64_t th_callbacks;
+ uint64_t th_syncs;
+ uint64_t th_restarts;
+ zbookmark_t th_noread;
+ zbookmark_t th_lastcb;
+};
+
+int traverse_dsl_dataset(struct dsl_dataset *ds, uint64_t txg_start,
+ int advance, blkptr_cb_t func, void *arg);
+
+traverse_handle_t *traverse_init(spa_t *spa, blkptr_cb_t *func, void *arg,
+ int advance, int zio_flags);
+void traverse_fini(traverse_handle_t *th);
+
+void traverse_add_dnode(traverse_handle_t *th,
+ uint64_t mintxg, uint64_t maxtxg, uint64_t objset, uint64_t object);
+void traverse_add_objset(traverse_handle_t *th,
+ uint64_t mintxg, uint64_t maxtxg, uint64_t objset);
+void traverse_add_pool(traverse_handle_t *th, uint64_t mintxg, uint64_t maxtxg);
+
+int traverse_more(traverse_handle_t *th);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DMU_TRAVERSE_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_tx.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_tx.h
new file mode 100644
index 0000000..89f4799
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_tx.h
@@ -0,0 +1,134 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DMU_TX_H
+#define _SYS_DMU_TX_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/txg.h>
+#include <sys/refcount.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct dmu_buf_impl;
+struct dmu_tx_hold;
+struct dnode_link;
+struct dsl_pool;
+struct dnode;
+struct dsl_dir;
+
+struct dmu_tx {
+ /*
+ * No synchronization is needed because a tx can only be handled
+ * by one thread.
+ */
+ list_t tx_holds; /* list of dmu_tx_hold_t */
+ objset_t *tx_objset;
+ struct dsl_dir *tx_dir;
+ struct dsl_pool *tx_pool;
+ uint64_t tx_txg;
+ uint64_t tx_lastsnap_txg;
+ uint64_t tx_lasttried_txg;
+ txg_handle_t tx_txgh;
+ void *tx_tempreserve_cookie;
+ struct dmu_tx_hold *tx_needassign_txh;
+ uint8_t tx_anyobj;
+ int tx_err;
+#ifdef ZFS_DEBUG
+ uint64_t tx_space_towrite;
+ uint64_t tx_space_tofree;
+ uint64_t tx_space_tooverwrite;
+ refcount_t tx_space_written;
+ refcount_t tx_space_freed;
+#endif
+};
+
+enum dmu_tx_hold_type {
+ THT_NEWOBJECT,
+ THT_WRITE,
+ THT_BONUS,
+ THT_FREE,
+ THT_ZAP,
+ THT_SPACE,
+ THT_NUMTYPES
+};
+
+typedef struct dmu_tx_hold {
+ dmu_tx_t *txh_tx;
+ list_node_t txh_node;
+ struct dnode *txh_dnode;
+ uint64_t txh_space_towrite;
+ uint64_t txh_space_tofree;
+ uint64_t txh_space_tooverwrite;
+#ifdef ZFS_DEBUG
+ enum dmu_tx_hold_type txh_type;
+ uint64_t txh_arg1;
+ uint64_t txh_arg2;
+#endif
+} dmu_tx_hold_t;
+
+
+/*
+ * These routines are defined in dmu.h, and are called by the user.
+ */
+dmu_tx_t *dmu_tx_create(objset_t *dd);
+int dmu_tx_assign(dmu_tx_t *tx, uint64_t txg_how);
+void dmu_tx_commit(dmu_tx_t *tx);
+void dmu_tx_abort(dmu_tx_t *tx);
+uint64_t dmu_tx_get_txg(dmu_tx_t *tx);
+void dmu_tx_wait(dmu_tx_t *tx);
+
+/*
+ * These routines are defined in dmu_spa.h, and are called by the SPA.
+ */
+extern dmu_tx_t *dmu_tx_create_assigned(struct dsl_pool *dp, uint64_t txg);
+
+/*
+ * These routines are only called by the DMU.
+ */
+dmu_tx_t *dmu_tx_create_dd(dsl_dir_t *dd);
+int dmu_tx_is_syncing(dmu_tx_t *tx);
+int dmu_tx_private_ok(dmu_tx_t *tx);
+void dmu_tx_add_new_object(dmu_tx_t *tx, objset_t *os, uint64_t object);
+void dmu_tx_willuse_space(dmu_tx_t *tx, int64_t delta);
+void dmu_tx_dirty_buf(dmu_tx_t *tx, struct dmu_buf_impl *db);
+int dmu_tx_holds(dmu_tx_t *tx, uint64_t object);
+void dmu_tx_hold_space(dmu_tx_t *tx, uint64_t space);
+
+#ifdef ZFS_DEBUG
+#define DMU_TX_DIRTY_BUF(tx, db) dmu_tx_dirty_buf(tx, db)
+#else
+#define DMU_TX_DIRTY_BUF(tx, db)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DMU_TX_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_zfetch.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_zfetch.h
new file mode 100644
index 0000000..c94bced
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dmu_zfetch.h
@@ -0,0 +1,75 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _DFETCH_H
+#define _DFETCH_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern uint64_t zfetch_array_rd_sz;
+
+struct dnode; /* so we can reference dnode */
+
+typedef enum zfetch_dirn {
+ ZFETCH_FORWARD = 1, /* prefetch increasing block numbers */
+ ZFETCH_BACKWARD = -1 /* prefetch decreasing block numbers */
+} zfetch_dirn_t;
+
+typedef struct zstream {
+ uint64_t zst_offset; /* offset of starting block in range */
+ uint64_t zst_len; /* length of range, in blocks */
+ zfetch_dirn_t zst_direction; /* direction of prefetch */
+ uint64_t zst_stride; /* length of stride, in blocks */
+ uint64_t zst_ph_offset; /* prefetch offset, in blocks */
+ uint64_t zst_cap; /* prefetch limit (cap), in blocks */
+ kmutex_t zst_lock; /* protects stream */
+ clock_t zst_last; /* lbolt of last prefetch */
+ avl_node_t zst_node; /* embed avl node here */
+} zstream_t;
+
+typedef struct zfetch {
+ krwlock_t zf_rwlock; /* protects zfetch structure */
+ list_t zf_stream; /* AVL tree of zstream_t's */
+ struct dnode *zf_dnode; /* dnode that owns this zfetch */
+ uint32_t zf_stream_cnt; /* # of active streams */
+ uint64_t zf_alloc_fail; /* # of failed attempts to alloc strm */
+} zfetch_t;
+
+void dmu_zfetch_init(zfetch_t *, struct dnode *);
+void dmu_zfetch_rele(zfetch_t *);
+void dmu_zfetch(zfetch_t *, uint64_t, uint64_t, int);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _DFETCH_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h
new file mode 100644
index 0000000..327e538
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dnode.h
@@ -0,0 +1,267 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DNODE_H
+#define _SYS_DNODE_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/avl.h>
+#include <sys/spa.h>
+#include <sys/txg.h>
+#include <sys/zio.h>
+#include <sys/refcount.h>
+#include <sys/dmu_zfetch.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Flags.
+ */
+#define DNODE_MUST_BE_ALLOCATED 1
+#define DNODE_MUST_BE_FREE 2
+
+/*
+ * Fixed constants.
+ */
+#define DNODE_SHIFT 9 /* 512 bytes */
+#define DN_MIN_INDBLKSHIFT 10 /* 1k */
+#define DN_MAX_INDBLKSHIFT 14 /* 16k */
+#define DNODE_BLOCK_SHIFT 14 /* 16k */
+#define DNODE_CORE_SIZE 64 /* 64 bytes for dnode sans blkptrs */
+#define DN_MAX_OBJECT_SHIFT 48 /* 256 trillion (zfs_fid_t limit) */
+#define DN_MAX_OFFSET_SHIFT 64 /* 2^64 bytes in a dnode */
+
+/*
+ * Derived constants.
+ */
+#define DNODE_SIZE (1 << DNODE_SHIFT)
+#define DN_MAX_NBLKPTR ((DNODE_SIZE - DNODE_CORE_SIZE) >> SPA_BLKPTRSHIFT)
+#define DN_MAX_BONUSLEN (DNODE_SIZE - DNODE_CORE_SIZE - (1 << SPA_BLKPTRSHIFT))
+#define DN_MAX_OBJECT (1ULL << DN_MAX_OBJECT_SHIFT)
+
+#define DNODES_PER_BLOCK_SHIFT (DNODE_BLOCK_SHIFT - DNODE_SHIFT)
+#define DNODES_PER_BLOCK (1ULL << DNODES_PER_BLOCK_SHIFT)
+#define DNODES_PER_LEVEL_SHIFT (DN_MAX_INDBLKSHIFT - SPA_BLKPTRSHIFT)
+
+/* The +2 here is a cheesy way to round up */
+#define DN_MAX_LEVELS (2 + ((DN_MAX_OFFSET_SHIFT - SPA_MINBLOCKSHIFT) / \
+ (DN_MIN_INDBLKSHIFT - SPA_BLKPTRSHIFT)))
+
+#define DN_BONUS(dnp) ((void*)((dnp)->dn_bonus + \
+ (((dnp)->dn_nblkptr - 1) * sizeof (blkptr_t))))
+
+#define DN_USED_BYTES(dnp) (((dnp)->dn_flags & DNODE_FLAG_USED_BYTES) ? \
+ (dnp)->dn_used : (dnp)->dn_used << SPA_MINBLOCKSHIFT)
+
+#define EPB(blkshift, typeshift) (1 << (blkshift - typeshift))
+
+struct dmu_buf_impl;
+struct objset_impl;
+struct zio;
+
+enum dnode_dirtycontext {
+ DN_UNDIRTIED,
+ DN_DIRTY_OPEN,
+ DN_DIRTY_SYNC
+};
+
+/* Is dn_used in bytes? if not, it's in multiples of SPA_MINBLOCKSIZE */
+#define DNODE_FLAG_USED_BYTES (1<<0)
+
+typedef struct dnode_phys {
+ uint8_t dn_type; /* dmu_object_type_t */
+ uint8_t dn_indblkshift; /* ln2(indirect block size) */
+ uint8_t dn_nlevels; /* 1=dn_blkptr->data blocks */
+ uint8_t dn_nblkptr; /* length of dn_blkptr */
+ uint8_t dn_bonustype; /* type of data in bonus buffer */
+ uint8_t dn_checksum; /* ZIO_CHECKSUM type */
+ uint8_t dn_compress; /* ZIO_COMPRESS type */
+ uint8_t dn_flags; /* DNODE_FLAG_* */
+ uint16_t dn_datablkszsec; /* data block size in 512b sectors */
+ uint16_t dn_bonuslen; /* length of dn_bonus */
+ uint8_t dn_pad2[4];
+
+ /* accounting is protected by dn_dirty_mtx */
+ uint64_t dn_maxblkid; /* largest allocated block ID */
+ uint64_t dn_used; /* bytes (or sectors) of disk space */
+
+ uint64_t dn_pad3[4];
+
+ blkptr_t dn_blkptr[1];
+ uint8_t dn_bonus[DN_MAX_BONUSLEN];
+} dnode_phys_t;
+
+typedef struct dnode {
+ /*
+ * dn_struct_rwlock protects the structure of the dnode,
+ * including the number of levels of indirection (dn_nlevels),
+ * dn_maxblkid, and dn_next_*
+ */
+ krwlock_t dn_struct_rwlock;
+
+ /*
+ * Our link on dataset's dd_dnodes list.
+ * Protected by dd_accounting_mtx.
+ */
+ list_node_t dn_link;
+
+ /* immutable: */
+ struct objset_impl *dn_objset;
+ uint64_t dn_object;
+ struct dmu_buf_impl *dn_dbuf;
+ dnode_phys_t *dn_phys; /* pointer into dn->dn_dbuf->db.db_data */
+
+ /*
+ * Copies of stuff in dn_phys. They're valid in the open
+ * context (eg. even before the dnode is first synced).
+ * Where necessary, these are protected by dn_struct_rwlock.
+ */
+ dmu_object_type_t dn_type; /* object type */
+ uint16_t dn_bonuslen; /* bonus length */
+ uint8_t dn_bonustype; /* bonus type */
+ uint8_t dn_nblkptr; /* number of blkptrs (immutable) */
+ uint8_t dn_checksum; /* ZIO_CHECKSUM type */
+ uint8_t dn_compress; /* ZIO_COMPRESS type */
+ uint8_t dn_nlevels;
+ uint8_t dn_indblkshift;
+ uint8_t dn_datablkshift; /* zero if blksz not power of 2! */
+ uint16_t dn_datablkszsec; /* in 512b sectors */
+ uint32_t dn_datablksz; /* in bytes */
+ uint64_t dn_maxblkid;
+ uint8_t dn_next_nlevels[TXG_SIZE];
+ uint8_t dn_next_indblkshift[TXG_SIZE];
+ uint32_t dn_next_blksz[TXG_SIZE]; /* next block size in bytes */
+
+ /* protected by os_lock: */
+ list_node_t dn_dirty_link[TXG_SIZE]; /* next on dataset's dirty */
+
+ /* protected by dn_mtx: */
+ kmutex_t dn_mtx;
+ list_t dn_dirty_records[TXG_SIZE];
+ avl_tree_t dn_ranges[TXG_SIZE];
+ uint64_t dn_allocated_txg;
+ uint64_t dn_free_txg;
+ uint64_t dn_assigned_txg;
+ kcondvar_t dn_notxholds;
+ enum dnode_dirtycontext dn_dirtyctx;
+ uint8_t *dn_dirtyctx_firstset; /* dbg: contents meaningless */
+
+ /* protected by own devices */
+ refcount_t dn_tx_holds;
+ refcount_t dn_holds;
+
+ kmutex_t dn_dbufs_mtx;
+ list_t dn_dbufs; /* linked list of descendent dbuf_t's */
+ struct dmu_buf_impl *dn_bonus; /* bonus buffer dbuf */
+
+ /* parent IO for current sync write */
+ zio_t *dn_zio;
+
+ /* holds prefetch structure */
+ struct zfetch dn_zfetch;
+} dnode_t;
+
+typedef struct free_range {
+ avl_node_t fr_node;
+ uint64_t fr_blkid;
+ uint64_t fr_nblks;
+} free_range_t;
+
+dnode_t *dnode_special_open(struct objset_impl *dd, dnode_phys_t *dnp,
+ uint64_t object);
+void dnode_special_close(dnode_t *dn);
+
+int dnode_hold(struct objset_impl *dd, uint64_t object,
+ void *ref, dnode_t **dnp);
+int dnode_hold_impl(struct objset_impl *dd, uint64_t object, int flag,
+ void *ref, dnode_t **dnp);
+void dnode_add_ref(dnode_t *dn, void *ref);
+void dnode_rele(dnode_t *dn, void *ref);
+void dnode_setdirty(dnode_t *dn, dmu_tx_t *tx);
+void dnode_sync(dnode_t *dn, dmu_tx_t *tx);
+void dnode_allocate(dnode_t *dn, dmu_object_type_t ot, int blocksize, int ibs,
+ dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx);
+void dnode_reallocate(dnode_t *dn, dmu_object_type_t ot, int blocksize,
+ dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx);
+void dnode_free(dnode_t *dn, dmu_tx_t *tx);
+void dnode_byteswap(dnode_phys_t *dnp);
+void dnode_buf_byteswap(void *buf, size_t size);
+void dnode_verify(dnode_t *dn);
+int dnode_set_blksz(dnode_t *dn, uint64_t size, int ibs, dmu_tx_t *tx);
+uint64_t dnode_current_max_length(dnode_t *dn);
+void dnode_free_range(dnode_t *dn, uint64_t off, uint64_t len, dmu_tx_t *tx);
+void dnode_clear_range(dnode_t *dn, uint64_t blkid,
+ uint64_t nblks, dmu_tx_t *tx);
+void dnode_diduse_space(dnode_t *dn, int64_t space);
+void dnode_willuse_space(dnode_t *dn, int64_t space, dmu_tx_t *tx);
+void dnode_new_blkid(dnode_t *dn, uint64_t blkid, dmu_tx_t *tx);
+uint64_t dnode_block_freed(dnode_t *dn, uint64_t blkid);
+void dnode_init(void);
+void dnode_fini(void);
+int dnode_next_offset(dnode_t *dn, boolean_t hole, uint64_t *off, int minlvl,
+ uint64_t blkfill, uint64_t txg);
+int dnode_evict_dbufs(dnode_t *dn, int try);
+
+#ifdef ZFS_DEBUG
+
+/*
+ * There should be a ## between the string literal and fmt, to make it
+ * clear that we're joining two strings together, but that piece of shit
+ * gcc doesn't support that preprocessor token.
+ */
+#define dprintf_dnode(dn, fmt, ...) do { \
+ if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
+ char __db_buf[32]; \
+ uint64_t __db_obj = (dn)->dn_object; \
+ if (__db_obj == DMU_META_DNODE_OBJECT) \
+ (void) strcpy(__db_buf, "mdn"); \
+ else \
+ (void) snprintf(__db_buf, sizeof (__db_buf), "%lld", \
+ (u_longlong_t)__db_obj);\
+ dprintf_ds((dn)->dn_objset->os_dsl_dataset, "obj=%s " fmt, \
+ __db_buf, __VA_ARGS__); \
+ } \
+_NOTE(CONSTCOND) } while (0)
+
+#define DNODE_VERIFY(dn) dnode_verify(dn)
+#define FREE_VERIFY(db, start, end, tx) free_verify(db, start, end, tx)
+
+#else
+
+#define dprintf_dnode(db, fmt, ...)
+#define DNODE_VERIFY(dn)
+#define FREE_VERIFY(db, start, end, tx)
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DNODE_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h
new file mode 100644
index 0000000..8cfc1dc
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dataset.h
@@ -0,0 +1,185 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DSL_DATASET_H
+#define _SYS_DSL_DATASET_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/spa.h>
+#include <sys/txg.h>
+#include <sys/zio.h>
+#include <sys/bplist.h>
+#include <sys/dsl_synctask.h>
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct dsl_dataset;
+struct dsl_dir;
+struct dsl_pool;
+
+typedef void dsl_dataset_evict_func_t(struct dsl_dataset *, void *);
+
+#define DS_FLAG_INCONSISTENT (1ULL<<0)
+/*
+ * NB: nopromote can not yet be set, but we want support for it in this
+ * on-disk version, so that we don't need to upgrade for it later. It
+ * will be needed when we implement 'zfs split' (where the split off
+ * clone should not be promoted).
+ */
+#define DS_FLAG_NOPROMOTE (1ULL<<1)
+
+typedef struct dsl_dataset_phys {
+ uint64_t ds_dir_obj;
+ uint64_t ds_prev_snap_obj;
+ uint64_t ds_prev_snap_txg;
+ uint64_t ds_next_snap_obj;
+ uint64_t ds_snapnames_zapobj; /* zap obj of snaps; ==0 for snaps */
+ uint64_t ds_num_children; /* clone/snap children; ==0 for head */
+ uint64_t ds_creation_time; /* seconds since 1970 */
+ uint64_t ds_creation_txg;
+ uint64_t ds_deadlist_obj;
+ uint64_t ds_used_bytes;
+ uint64_t ds_compressed_bytes;
+ uint64_t ds_uncompressed_bytes;
+ uint64_t ds_unique_bytes; /* only relevant to snapshots */
+ /*
+ * The ds_fsid_guid is a 56-bit ID that can change to avoid
+ * collisions. The ds_guid is a 64-bit ID that will never
+ * change, so there is a small probability that it will collide.
+ */
+ uint64_t ds_fsid_guid;
+ uint64_t ds_guid;
+ uint64_t ds_flags;
+ blkptr_t ds_bp;
+ uint64_t ds_pad[8]; /* pad out to 320 bytes for good measure */
+} dsl_dataset_phys_t;
+
+typedef struct dsl_dataset {
+ /* Immutable: */
+ struct dsl_dir *ds_dir;
+ dsl_dataset_phys_t *ds_phys;
+ dmu_buf_t *ds_dbuf;
+ uint64_t ds_object;
+
+ /* only used in syncing context: */
+ struct dsl_dataset *ds_prev; /* only valid for non-snapshots */
+
+ /* has internal locking: */
+ bplist_t ds_deadlist;
+
+ /* protected by lock on pool's dp_dirty_datasets list */
+ txg_node_t ds_dirty_link;
+ list_node_t ds_synced_link;
+
+ /*
+ * ds_phys->ds_<accounting> is also protected by ds_lock.
+ * Protected by ds_lock:
+ */
+ kmutex_t ds_lock;
+ void *ds_user_ptr;
+ dsl_dataset_evict_func_t *ds_user_evict_func;
+ uint64_t ds_open_refcount;
+
+ /* no locking; only for making guesses */
+ uint64_t ds_trysnap_txg;
+
+ /* Protected by ds_lock; keep at end of struct for better locality */
+ char ds_snapname[MAXNAMELEN];
+} dsl_dataset_t;
+
+#define dsl_dataset_is_snapshot(ds) \
+ ((ds)->ds_phys->ds_num_children != 0)
+
+int dsl_dataset_open_spa(spa_t *spa, const char *name, int mode,
+ void *tag, dsl_dataset_t **dsp);
+int dsl_dataset_open(const char *name, int mode, void *tag,
+ dsl_dataset_t **dsp);
+int dsl_dataset_open_obj(struct dsl_pool *dp, uint64_t dsobj,
+ const char *tail, int mode, void *tag, dsl_dataset_t **);
+void dsl_dataset_name(dsl_dataset_t *ds, char *name);
+void dsl_dataset_close(dsl_dataset_t *ds, int mode, void *tag);
+uint64_t dsl_dataset_create_sync(dsl_dir_t *pds,
+ const char *lastname, dsl_dataset_t *clone_parent, dmu_tx_t *tx);
+int dsl_dataset_destroy(const char *name);
+int dsl_snapshots_destroy(char *fsname, char *snapname);
+dsl_checkfunc_t dsl_dataset_snapshot_check;
+dsl_syncfunc_t dsl_dataset_snapshot_sync;
+int dsl_dataset_rollback(dsl_dataset_t *ds);
+int dsl_dataset_rename(char *name, const char *newname, boolean_t recursive);
+int dsl_dataset_promote(const char *name);
+
+void *dsl_dataset_set_user_ptr(dsl_dataset_t *ds,
+ void *p, dsl_dataset_evict_func_t func);
+void *dsl_dataset_get_user_ptr(dsl_dataset_t *ds);
+
+blkptr_t *dsl_dataset_get_blkptr(dsl_dataset_t *ds);
+void dsl_dataset_set_blkptr(dsl_dataset_t *ds, blkptr_t *bp, dmu_tx_t *tx);
+
+spa_t *dsl_dataset_get_spa(dsl_dataset_t *ds);
+
+void dsl_dataset_sync(dsl_dataset_t *os, zio_t *zio, dmu_tx_t *tx);
+
+void dsl_dataset_block_born(dsl_dataset_t *ds, blkptr_t *bp, dmu_tx_t *tx);
+void dsl_dataset_block_kill(dsl_dataset_t *ds, blkptr_t *bp, zio_t *pio,
+ dmu_tx_t *tx);
+int dsl_dataset_block_freeable(dsl_dataset_t *ds, uint64_t blk_birth);
+uint64_t dsl_dataset_prev_snap_txg(dsl_dataset_t *ds);
+
+void dsl_dataset_dirty(dsl_dataset_t *ds, dmu_tx_t *tx);
+void dsl_dataset_stats(dsl_dataset_t *os, nvlist_t *nv);
+void dsl_dataset_fast_stat(dsl_dataset_t *ds, dmu_objset_stats_t *stat);
+void dsl_dataset_space(dsl_dataset_t *ds,
+ uint64_t *refdbytesp, uint64_t *availbytesp,
+ uint64_t *usedobjsp, uint64_t *availobjsp);
+uint64_t dsl_dataset_fsid_guid(dsl_dataset_t *ds);
+
+void dsl_dataset_create_root(struct dsl_pool *dp, uint64_t *ddobjp,
+ dmu_tx_t *tx);
+
+int dsl_dsobj_to_dsname(char *pname, uint64_t obj, char *buf);
+
+#ifdef ZFS_DEBUG
+#define dprintf_ds(ds, fmt, ...) do { \
+ if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
+ char *__ds_name = kmem_alloc(MAXNAMELEN, KM_SLEEP); \
+ dsl_dataset_name(ds, __ds_name); \
+ dprintf("ds=%s " fmt, __ds_name, __VA_ARGS__); \
+ kmem_free(__ds_name, MAXNAMELEN); \
+ } \
+_NOTE(CONSTCOND) } while (0)
+#else
+#define dprintf_ds(dd, fmt, ...)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DSL_DATASET_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dir.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dir.h
new file mode 100644
index 0000000..e0595d3
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_dir.h
@@ -0,0 +1,143 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DSL_DIR_H
+#define _SYS_DSL_DIR_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/dsl_pool.h>
+#include <sys/dsl_synctask.h>
+#include <sys/refcount.h>
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct dsl_dataset;
+
+typedef struct dsl_dir_phys {
+ uint64_t dd_creation_time; /* not actually used */
+ uint64_t dd_head_dataset_obj;
+ uint64_t dd_parent_obj;
+ uint64_t dd_clone_parent_obj;
+ uint64_t dd_child_dir_zapobj;
+ /*
+ * how much space our children are accounting for; for leaf
+ * datasets, == physical space used by fs + snaps
+ */
+ uint64_t dd_used_bytes;
+ uint64_t dd_compressed_bytes;
+ uint64_t dd_uncompressed_bytes;
+ /* Administrative quota setting */
+ uint64_t dd_quota;
+ /* Administrative reservation setting */
+ uint64_t dd_reserved;
+ uint64_t dd_props_zapobj;
+ uint64_t dd_pad[21]; /* pad out to 256 bytes for good measure */
+} dsl_dir_phys_t;
+
+struct dsl_dir {
+ /* These are immutable; no lock needed: */
+ uint64_t dd_object;
+ dsl_dir_phys_t *dd_phys;
+ dmu_buf_t *dd_dbuf;
+ dsl_pool_t *dd_pool;
+
+ /* protected by lock on pool's dp_dirty_dirs list */
+ txg_node_t dd_dirty_link;
+
+ /* protected by dp_config_rwlock */
+ dsl_dir_t *dd_parent;
+
+ /* Protected by dd_lock */
+ kmutex_t dd_lock;
+ list_t dd_prop_cbs; /* list of dsl_prop_cb_record_t's */
+
+ /* Accounting */
+ /* reflects any changes to dd_phys->dd_used_bytes made this syncing */
+ int64_t dd_used_bytes;
+ /* gross estimate of space used by in-flight tx's */
+ uint64_t dd_tempreserved[TXG_SIZE];
+ /* amount of space we expect to write; == amount of dirty data */
+ int64_t dd_space_towrite[TXG_SIZE];
+
+ /* protected by dd_lock; keep at end of struct for better locality */
+ char dd_myname[MAXNAMELEN];
+};
+
+void dsl_dir_close(dsl_dir_t *dd, void *tag);
+int dsl_dir_open(const char *name, void *tag, dsl_dir_t **, const char **tail);
+int dsl_dir_open_spa(spa_t *spa, const char *name, void *tag, dsl_dir_t **,
+ const char **tailp);
+int dsl_dir_open_obj(dsl_pool_t *dp, uint64_t ddobj,
+ const char *tail, void *tag, dsl_dir_t **);
+void dsl_dir_name(dsl_dir_t *dd, char *buf);
+int dsl_dir_namelen(dsl_dir_t *dd);
+int dsl_dir_is_private(dsl_dir_t *dd);
+uint64_t dsl_dir_create_sync(dsl_dir_t *pds, const char *name, dmu_tx_t *tx);
+void dsl_dir_create_root(objset_t *mos, uint64_t *ddobjp, dmu_tx_t *tx);
+dsl_checkfunc_t dsl_dir_destroy_check;
+dsl_syncfunc_t dsl_dir_destroy_sync;
+void dsl_dir_stats(dsl_dir_t *dd, nvlist_t *nv);
+uint64_t dsl_dir_space_available(dsl_dir_t *dd,
+ dsl_dir_t *ancestor, int64_t delta, int ondiskonly);
+void dsl_dir_dirty(dsl_dir_t *dd, dmu_tx_t *tx);
+void dsl_dir_sync(dsl_dir_t *dd, dmu_tx_t *tx);
+int dsl_dir_tempreserve_space(dsl_dir_t *dd, uint64_t mem,
+ uint64_t asize, uint64_t fsize, void **tr_cookiep, dmu_tx_t *tx);
+void dsl_dir_tempreserve_clear(void *tr_cookie, dmu_tx_t *tx);
+void dsl_dir_willuse_space(dsl_dir_t *dd, int64_t space, dmu_tx_t *tx);
+void dsl_dir_diduse_space(dsl_dir_t *dd,
+ int64_t used, int64_t compressed, int64_t uncompressed, dmu_tx_t *tx);
+int dsl_dir_set_quota(const char *ddname, uint64_t quota);
+int dsl_dir_set_reservation(const char *ddname, uint64_t reservation);
+int dsl_dir_rename(dsl_dir_t *dd, const char *newname);
+int dsl_dir_transfer_possible(dsl_dir_t *sdd, dsl_dir_t *tdd, uint64_t space);
+
+/* internal reserved dir name */
+#define MOS_DIR_NAME "$MOS"
+
+#ifdef ZFS_DEBUG
+#define dprintf_dd(dd, fmt, ...) do { \
+ if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
+ char *__ds_name = kmem_alloc(MAXNAMELEN + strlen(MOS_DIR_NAME) + 1, \
+ KM_SLEEP); \
+ dsl_dir_name(dd, __ds_name); \
+ dprintf("dd=%s " fmt, __ds_name, __VA_ARGS__); \
+ kmem_free(__ds_name, MAXNAMELEN + strlen(MOS_DIR_NAME) + 1); \
+ } \
+_NOTE(CONSTCOND) } while (0)
+#else
+#define dprintf_dd(dd, fmt, ...)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DSL_DIR_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h
new file mode 100644
index 0000000..f7ec67a
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_pool.h
@@ -0,0 +1,82 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DSL_POOL_H
+#define _SYS_DSL_POOL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa.h>
+#include <sys/txg.h>
+#include <sys/txg_impl.h>
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct objset;
+struct dsl_dir;
+
+typedef struct dsl_pool {
+ /* Immutable */
+ spa_t *dp_spa;
+ struct objset *dp_meta_objset;
+ struct dsl_dir *dp_root_dir;
+ struct dsl_dir *dp_mos_dir;
+ uint64_t dp_root_dir_obj;
+
+ /* No lock needed - sync context only */
+ blkptr_t dp_meta_rootbp;
+ list_t dp_synced_objsets;
+
+ /* Has its own locking */
+ tx_state_t dp_tx;
+ txg_list_t dp_dirty_datasets;
+ txg_list_t dp_dirty_dirs;
+ txg_list_t dp_sync_tasks;
+
+ /*
+ * Protects administrative changes (properties, namespace)
+ * It is only held for write in syncing context. Therefore
+ * syncing context does not need to ever have it for read, since
+ * nobody else could possibly have it for write.
+ */
+ krwlock_t dp_config_rwlock;
+} dsl_pool_t;
+
+int dsl_pool_open(spa_t *spa, uint64_t txg, dsl_pool_t **dpp);
+void dsl_pool_close(dsl_pool_t *dp);
+dsl_pool_t *dsl_pool_create(spa_t *spa, uint64_t txg);
+void dsl_pool_sync(dsl_pool_t *dp, uint64_t txg);
+void dsl_pool_zil_clean(dsl_pool_t *dp);
+int dsl_pool_sync_context(dsl_pool_t *dp);
+uint64_t dsl_pool_adjustedsize(dsl_pool_t *dp, boolean_t netfree);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DSL_POOL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_prop.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_prop.h
new file mode 100644
index 0000000..d2debff
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_prop.h
@@ -0,0 +1,77 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DSL_PROP_H
+#define _SYS_DSL_PROP_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/dsl_pool.h>
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct dsl_dataset;
+
+/* The callback func may not call into the DMU or DSL! */
+typedef void (dsl_prop_changed_cb_t)(void *arg, uint64_t newval);
+
+typedef struct dsl_prop_cb_record {
+ list_node_t cbr_node; /* link on dd_prop_cbs */
+ struct dsl_dataset *cbr_ds;
+ const char *cbr_propname;
+ dsl_prop_changed_cb_t *cbr_func;
+ void *cbr_arg;
+} dsl_prop_cb_record_t;
+
+int dsl_prop_register(struct dsl_dataset *ds, const char *propname,
+ dsl_prop_changed_cb_t *callback, void *cbarg);
+int dsl_prop_unregister(struct dsl_dataset *ds, const char *propname,
+ dsl_prop_changed_cb_t *callback, void *cbarg);
+int dsl_prop_numcb(struct dsl_dataset *ds);
+
+int dsl_prop_get(const char *ddname, const char *propname,
+ int intsz, int numints, void *buf, char *setpoint);
+int dsl_prop_get_integer(const char *ddname, const char *propname,
+ uint64_t *valuep, char *setpoint);
+int dsl_prop_get_all(objset_t *os, nvlist_t **nvp);
+
+int dsl_prop_set(const char *ddname, const char *propname,
+ int intsz, int numints, const void *buf);
+int dsl_prop_set_dd(dsl_dir_t *dd, const char *propname,
+ int intsz, int numints, const void *buf);
+
+void dsl_prop_nvlist_add_uint64(nvlist_t *nv, zfs_prop_t prop, uint64_t value);
+void dsl_prop_nvlist_add_string(nvlist_t *nv,
+ zfs_prop_t prop, const char *value);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DSL_PROP_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_synctask.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_synctask.h
new file mode 100644
index 0000000..e695b18
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/dsl_synctask.h
@@ -0,0 +1,77 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DSL_SYNCTASK_H
+#define _SYS_DSL_SYNCTASK_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/txg.h>
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct dsl_pool;
+
+typedef int (dsl_checkfunc_t)(void *, void *, dmu_tx_t *);
+typedef void (dsl_syncfunc_t)(void *, void *, dmu_tx_t *);
+
+typedef struct dsl_sync_task {
+ list_node_t dst_node;
+ dsl_checkfunc_t *dst_checkfunc;
+ dsl_syncfunc_t *dst_syncfunc;
+ void *dst_arg1;
+ void *dst_arg2;
+ int dst_err;
+} dsl_sync_task_t;
+
+typedef struct dsl_sync_task_group {
+ txg_node_t dstg_node;
+ list_t dstg_tasks;
+ struct dsl_pool *dstg_pool;
+ uint64_t dstg_txg;
+ int dstg_err;
+ int dstg_space;
+} dsl_sync_task_group_t;
+
+dsl_sync_task_group_t *dsl_sync_task_group_create(struct dsl_pool *dp);
+void dsl_sync_task_create(dsl_sync_task_group_t *dstg,
+ dsl_checkfunc_t *, dsl_syncfunc_t *,
+ void *arg1, void *arg2, int blocks_modified);
+int dsl_sync_task_group_wait(dsl_sync_task_group_t *dstg);
+void dsl_sync_task_group_destroy(dsl_sync_task_group_t *dstg);
+void dsl_sync_task_group_sync(dsl_sync_task_group_t *dstg, dmu_tx_t *tx);
+
+int dsl_sync_task_do(struct dsl_pool *dp,
+ dsl_checkfunc_t *checkfunc, dsl_syncfunc_t *syncfunc,
+ void *arg1, void *arg2, int blocks_modified);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DSL_SYNCTASK_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab.h
new file mode 100644
index 0000000..095dd3c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab.h
@@ -0,0 +1,69 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_METASLAB_H
+#define _SYS_METASLAB_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa.h>
+#include <sys/space_map.h>
+#include <sys/txg.h>
+#include <sys/zio.h>
+#include <sys/avl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct metaslab_class metaslab_class_t;
+typedef struct metaslab_group metaslab_group_t;
+
+extern metaslab_t *metaslab_init(metaslab_group_t *mg, space_map_obj_t *smo,
+ uint64_t start, uint64_t size, uint64_t txg);
+extern void metaslab_fini(metaslab_t *msp);
+extern void metaslab_sync(metaslab_t *msp, uint64_t txg);
+extern void metaslab_sync_done(metaslab_t *msp, uint64_t txg);
+
+extern int metaslab_alloc(spa_t *spa, uint64_t psize, blkptr_t *bp,
+ int ncopies, uint64_t txg, blkptr_t *hintbp, boolean_t hintbp_avoid);
+extern void metaslab_free(spa_t *spa, const blkptr_t *bp, uint64_t txg,
+ boolean_t now);
+extern int metaslab_claim(spa_t *spa, const blkptr_t *bp, uint64_t txg);
+
+extern metaslab_class_t *metaslab_class_create(void);
+extern void metaslab_class_destroy(metaslab_class_t *mc);
+extern void metaslab_class_add(metaslab_class_t *mc, metaslab_group_t *mg);
+extern void metaslab_class_remove(metaslab_class_t *mc, metaslab_group_t *mg);
+
+extern metaslab_group_t *metaslab_group_create(metaslab_class_t *mc,
+ vdev_t *vd);
+extern void metaslab_group_destroy(metaslab_group_t *mg);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_METASLAB_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h
new file mode 100644
index 0000000..5980cbc
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/metaslab_impl.h
@@ -0,0 +1,81 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_METASLAB_IMPL_H
+#define _SYS_METASLAB_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/metaslab.h>
+#include <sys/space_map.h>
+#include <sys/vdev.h>
+#include <sys/txg.h>
+#include <sys/avl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct metaslab_class {
+ metaslab_group_t *mc_rotor;
+ uint64_t mc_allocated;
+};
+
+struct metaslab_group {
+ kmutex_t mg_lock;
+ avl_tree_t mg_metaslab_tree;
+ uint64_t mg_aliquot;
+ int64_t mg_bias;
+ metaslab_class_t *mg_class;
+ vdev_t *mg_vd;
+ metaslab_group_t *mg_prev;
+ metaslab_group_t *mg_next;
+};
+
+/*
+ * Each metaslab's free space is tracked in space map object in the MOS,
+ * which is only updated in syncing context. Each time we sync a txg,
+ * we append the allocs and frees from that txg to the space map object.
+ * When the txg is done syncing, metaslab_sync_done() updates ms_smo
+ * to ms_smo_syncing. Everything in ms_smo is always safe to allocate.
+ */
+struct metaslab {
+ kmutex_t ms_lock; /* metaslab lock */
+ space_map_obj_t ms_smo; /* synced space map object */
+ space_map_obj_t ms_smo_syncing; /* syncing space map object */
+ space_map_t ms_allocmap[TXG_SIZE]; /* allocated this txg */
+ space_map_t ms_freemap[TXG_SIZE]; /* freed this txg */
+ space_map_t ms_map; /* in-core free space map */
+ uint64_t ms_weight; /* weight vs. others in group */
+ metaslab_group_t *ms_group; /* metaslab group */
+ avl_node_t ms_group_node; /* node in metaslab group tree */
+ txg_node_t ms_txg_node; /* per-txg dirty metaslab links */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_METASLAB_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/refcount.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/refcount.h
new file mode 100644
index 0000000..4de1cae
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/refcount.h
@@ -0,0 +1,103 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_REFCOUNT_H
+#define _SYS_REFCOUNT_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/list.h>
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * If the reference is held only by the calling function and not any
+ * particular object, use FTAG (which is a string) for the holder_tag.
+ * Otherwise, use the object that holds the reference.
+ */
+#define FTAG ((char *)__func__)
+
+#if defined(DEBUG) || !defined(_KERNEL)
+typedef struct reference {
+ list_node_t ref_link;
+ void *ref_holder;
+ uint64_t ref_number;
+ uint8_t *ref_removed;
+} reference_t;
+
+typedef struct refcount {
+ kmutex_t rc_mtx;
+ list_t rc_list;
+ list_t rc_removed;
+ int64_t rc_count;
+ int64_t rc_removed_count;
+} refcount_t;
+
+/* Note: refcount_t should be initialized to zero before use. */
+
+void refcount_create(refcount_t *rc);
+void refcount_destroy(refcount_t *rc);
+void refcount_destroy_many(refcount_t *rc, uint64_t number);
+int refcount_is_zero(refcount_t *rc);
+int64_t refcount_count(refcount_t *rc);
+int64_t refcount_add(refcount_t *rc, void *holder_tag);
+int64_t refcount_remove(refcount_t *rc, void *holder_tag);
+int64_t refcount_add_many(refcount_t *rc, uint64_t number, void *holder_tag);
+int64_t refcount_remove_many(refcount_t *rc, uint64_t number, void *holder_tag);
+
+void refcount_init(void);
+void refcount_fini(void);
+
+#else /* DEBUG */
+
+typedef struct refcount {
+ uint64_t rc_count;
+} refcount_t;
+
+#define refcount_create(rc) ((rc)->rc_count = 0)
+#define refcount_destroy(rc) ((rc)->rc_count = 0)
+#define refcount_destroy_many(rc, number) ((rc)->rc_count = 0)
+#define refcount_is_zero(rc) ((rc)->rc_count == 0)
+#define refcount_count(rc) ((rc)->rc_count)
+#define refcount_add(rc, holder) atomic_add_64_nv(&(rc)->rc_count, 1)
+#define refcount_remove(rc, holder) atomic_add_64_nv(&(rc)->rc_count, -1)
+#define refcount_add_many(rc, number, holder) \
+ atomic_add_64_nv(&(rc)->rc_count, number)
+#define refcount_remove_many(rc, number, holder) \
+ atomic_add_64_nv(&(rc)->rc_count, -number)
+
+#define refcount_init()
+#define refcount_fini()
+
+#endif /* DEBUG */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_REFCOUNT_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
new file mode 100644
index 0000000..2bcf4c8
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/spa.h
@@ -0,0 +1,491 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SPA_H
+#define _SYS_SPA_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/avl.h>
+#include <sys/zfs_context.h>
+#include <sys/nvpair.h>
+#include <sys/sysmacros.h>
+#include <sys/types.h>
+#include <sys/fs/zfs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Forward references that lots of things need.
+ */
+typedef struct spa spa_t;
+typedef struct vdev vdev_t;
+typedef struct metaslab metaslab_t;
+typedef struct zilog zilog_t;
+typedef struct traverse_handle traverse_handle_t;
+struct dsl_pool;
+
+/*
+ * General-purpose 32-bit and 64-bit bitfield encodings.
+ */
+#define BF32_DECODE(x, low, len) P2PHASE((x) >> (low), 1U << (len))
+#define BF64_DECODE(x, low, len) P2PHASE((x) >> (low), 1ULL << (len))
+#define BF32_ENCODE(x, low, len) (P2PHASE((x), 1U << (len)) << (low))
+#define BF64_ENCODE(x, low, len) (P2PHASE((x), 1ULL << (len)) << (low))
+
+#define BF32_GET(x, low, len) BF32_DECODE(x, low, len)
+#define BF64_GET(x, low, len) BF64_DECODE(x, low, len)
+
+#define BF32_SET(x, low, len, val) \
+ ((x) ^= BF32_ENCODE((x >> low) ^ (val), low, len))
+#define BF64_SET(x, low, len, val) \
+ ((x) ^= BF64_ENCODE((x >> low) ^ (val), low, len))
+
+#define BF32_GET_SB(x, low, len, shift, bias) \
+ ((BF32_GET(x, low, len) + (bias)) << (shift))
+#define BF64_GET_SB(x, low, len, shift, bias) \
+ ((BF64_GET(x, low, len) + (bias)) << (shift))
+
+#define BF32_SET_SB(x, low, len, shift, bias, val) \
+ BF32_SET(x, low, len, ((val) >> (shift)) - (bias))
+#define BF64_SET_SB(x, low, len, shift, bias, val) \
+ BF64_SET(x, low, len, ((val) >> (shift)) - (bias))
+
+/*
+ * We currently support nine block sizes, from 512 bytes to 128K.
+ * We could go higher, but the benefits are near-zero and the cost
+ * of COWing a giant block to modify one byte would become excessive.
+ */
+#define SPA_MINBLOCKSHIFT 9
+#define SPA_MAXBLOCKSHIFT 17
+#define SPA_MINBLOCKSIZE (1ULL << SPA_MINBLOCKSHIFT)
+#define SPA_MAXBLOCKSIZE (1ULL << SPA_MAXBLOCKSHIFT)
+
+#define SPA_BLOCKSIZES (SPA_MAXBLOCKSHIFT - SPA_MINBLOCKSHIFT + 1)
+
+/*
+ * The DVA size encodings for LSIZE and PSIZE support blocks up to 32MB.
+ * The ASIZE encoding should be at least 64 times larger (6 more bits)
+ * to support up to 4-way RAID-Z mirror mode with worst-case gang block
+ * overhead, three DVAs per bp, plus one more bit in case we do anything
+ * else that expands the ASIZE.
+ */
+#define SPA_LSIZEBITS 16 /* LSIZE up to 32M (2^16 * 512) */
+#define SPA_PSIZEBITS 16 /* PSIZE up to 32M (2^16 * 512) */
+#define SPA_ASIZEBITS 24 /* ASIZE up to 64 times larger */
+
+/*
+ * All SPA data is represented by 128-bit data virtual addresses (DVAs).
+ * The members of the dva_t should be considered opaque outside the SPA.
+ */
+typedef struct dva {
+ uint64_t dva_word[2];
+} dva_t;
+
+/*
+ * Each block has a 256-bit checksum -- strong enough for cryptographic hashes.
+ */
+typedef struct zio_cksum {
+ uint64_t zc_word[4];
+} zio_cksum_t;
+
+/*
+ * Each block is described by its DVAs, time of birth, checksum, etc.
+ * The word-by-word, bit-by-bit layout of the blkptr is as follows:
+ *
+ * 64 56 48 40 32 24 16 8 0
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 0 | vdev1 | GRID | ASIZE |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 1 |G| offset1 |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 2 | vdev2 | GRID | ASIZE |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 3 |G| offset2 |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 4 | vdev3 | GRID | ASIZE |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 5 |G| offset3 |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 6 |E| lvl | type | cksum | comp | PSIZE | LSIZE |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 7 | padding |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 8 | padding |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * 9 | padding |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * a | birth txg |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * b | fill count |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * c | checksum[0] |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * d | checksum[1] |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * e | checksum[2] |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ * f | checksum[3] |
+ * +-------+-------+-------+-------+-------+-------+-------+-------+
+ *
+ * Legend:
+ *
+ * vdev virtual device ID
+ * offset offset into virtual device
+ * LSIZE logical size
+ * PSIZE physical size (after compression)
+ * ASIZE allocated size (including RAID-Z parity and gang block headers)
+ * GRID RAID-Z layout information (reserved for future use)
+ * cksum checksum function
+ * comp compression function
+ * G gang block indicator
+ * E endianness
+ * type DMU object type
+ * lvl level of indirection
+ * birth txg transaction group in which the block was born
+ * fill count number of non-zero blocks under this bp
+ * checksum[4] 256-bit checksum of the data this bp describes
+ */
+typedef struct blkptr {
+ dva_t blk_dva[3]; /* 128-bit Data Virtual Address */
+ uint64_t blk_prop; /* size, compression, type, etc */
+ uint64_t blk_pad[3]; /* Extra space for the future */
+ uint64_t blk_birth; /* transaction group at birth */
+ uint64_t blk_fill; /* fill count */
+ zio_cksum_t blk_cksum; /* 256-bit checksum */
+} blkptr_t;
+
+#define SPA_BLKPTRSHIFT 7 /* blkptr_t is 128 bytes */
+#define SPA_DVAS_PER_BP 3 /* Number of DVAs in a bp */
+
+/*
+ * Macros to get and set fields in a bp or DVA.
+ */
+#define DVA_GET_ASIZE(dva) \
+ BF64_GET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0)
+#define DVA_SET_ASIZE(dva, x) \
+ BF64_SET_SB((dva)->dva_word[0], 0, 24, SPA_MINBLOCKSHIFT, 0, x)
+
+#define DVA_GET_GRID(dva) BF64_GET((dva)->dva_word[0], 24, 8)
+#define DVA_SET_GRID(dva, x) BF64_SET((dva)->dva_word[0], 24, 8, x)
+
+#define DVA_GET_VDEV(dva) BF64_GET((dva)->dva_word[0], 32, 32)
+#define DVA_SET_VDEV(dva, x) BF64_SET((dva)->dva_word[0], 32, 32, x)
+
+#define DVA_GET_OFFSET(dva) \
+ BF64_GET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0)
+#define DVA_SET_OFFSET(dva, x) \
+ BF64_SET_SB((dva)->dva_word[1], 0, 63, SPA_MINBLOCKSHIFT, 0, x)
+
+#define DVA_GET_GANG(dva) BF64_GET((dva)->dva_word[1], 63, 1)
+#define DVA_SET_GANG(dva, x) BF64_SET((dva)->dva_word[1], 63, 1, x)
+
+#define BP_GET_LSIZE(bp) \
+ (BP_IS_HOLE(bp) ? 0 : \
+ BF64_GET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1))
+#define BP_SET_LSIZE(bp, x) \
+ BF64_SET_SB((bp)->blk_prop, 0, 16, SPA_MINBLOCKSHIFT, 1, x)
+
+#define BP_GET_PSIZE(bp) \
+ BF64_GET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1)
+#define BP_SET_PSIZE(bp, x) \
+ BF64_SET_SB((bp)->blk_prop, 16, 16, SPA_MINBLOCKSHIFT, 1, x)
+
+#define BP_GET_COMPRESS(bp) BF64_GET((bp)->blk_prop, 32, 8)
+#define BP_SET_COMPRESS(bp, x) BF64_SET((bp)->blk_prop, 32, 8, x)
+
+#define BP_GET_CHECKSUM(bp) BF64_GET((bp)->blk_prop, 40, 8)
+#define BP_SET_CHECKSUM(bp, x) BF64_SET((bp)->blk_prop, 40, 8, x)
+
+#define BP_GET_TYPE(bp) BF64_GET((bp)->blk_prop, 48, 8)
+#define BP_SET_TYPE(bp, x) BF64_SET((bp)->blk_prop, 48, 8, x)
+
+#define BP_GET_LEVEL(bp) BF64_GET((bp)->blk_prop, 56, 5)
+#define BP_SET_LEVEL(bp, x) BF64_SET((bp)->blk_prop, 56, 5, x)
+
+#define BP_GET_BYTEORDER(bp) (0 - BF64_GET((bp)->blk_prop, 63, 1))
+#define BP_SET_BYTEORDER(bp, x) BF64_SET((bp)->blk_prop, 63, 1, x)
+
+#define BP_GET_ASIZE(bp) \
+ (DVA_GET_ASIZE(&(bp)->blk_dva[0]) + DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
+ DVA_GET_ASIZE(&(bp)->blk_dva[2]))
+
+#define BP_GET_UCSIZE(bp) \
+ ((BP_GET_LEVEL(bp) > 0 || dmu_ot[BP_GET_TYPE(bp)].ot_metadata) ? \
+ BP_GET_PSIZE(bp) : BP_GET_LSIZE(bp));
+
+#define BP_GET_NDVAS(bp) \
+ (!!DVA_GET_ASIZE(&(bp)->blk_dva[0]) + \
+ !!DVA_GET_ASIZE(&(bp)->blk_dva[1]) + \
+ !!DVA_GET_ASIZE(&(bp)->blk_dva[2]))
+
+#define BP_COUNT_GANG(bp) \
+ (DVA_GET_GANG(&(bp)->blk_dva[0]) + \
+ DVA_GET_GANG(&(bp)->blk_dva[1]) + \
+ DVA_GET_GANG(&(bp)->blk_dva[2]))
+
+#define DVA_EQUAL(dva1, dva2) \
+ ((dva1)->dva_word[1] == (dva2)->dva_word[1] && \
+ (dva1)->dva_word[0] == (dva2)->dva_word[0])
+
+#define ZIO_CHECKSUM_EQUAL(zc1, zc2) \
+ (0 == (((zc1).zc_word[0] - (zc2).zc_word[0]) | \
+ ((zc1).zc_word[1] - (zc2).zc_word[1]) | \
+ ((zc1).zc_word[2] - (zc2).zc_word[2]) | \
+ ((zc1).zc_word[3] - (zc2).zc_word[3])))
+
+
+#define DVA_IS_VALID(dva) (DVA_GET_ASIZE(dva) != 0)
+
+#define ZIO_SET_CHECKSUM(zcp, w0, w1, w2, w3) \
+{ \
+ (zcp)->zc_word[0] = w0; \
+ (zcp)->zc_word[1] = w1; \
+ (zcp)->zc_word[2] = w2; \
+ (zcp)->zc_word[3] = w3; \
+}
+
+#define BP_IDENTITY(bp) (&(bp)->blk_dva[0])
+#define BP_IS_GANG(bp) DVA_GET_GANG(BP_IDENTITY(bp))
+#define BP_IS_HOLE(bp) ((bp)->blk_birth == 0)
+#define BP_IS_OLDER(bp, txg) (!BP_IS_HOLE(bp) && (bp)->blk_birth < (txg))
+
+#define BP_ZERO(bp) \
+{ \
+ (bp)->blk_dva[0].dva_word[0] = 0; \
+ (bp)->blk_dva[0].dva_word[1] = 0; \
+ (bp)->blk_dva[1].dva_word[0] = 0; \
+ (bp)->blk_dva[1].dva_word[1] = 0; \
+ (bp)->blk_dva[2].dva_word[0] = 0; \
+ (bp)->blk_dva[2].dva_word[1] = 0; \
+ (bp)->blk_prop = 0; \
+ (bp)->blk_pad[0] = 0; \
+ (bp)->blk_pad[1] = 0; \
+ (bp)->blk_pad[2] = 0; \
+ (bp)->blk_birth = 0; \
+ (bp)->blk_fill = 0; \
+ ZIO_SET_CHECKSUM(&(bp)->blk_cksum, 0, 0, 0, 0); \
+}
+
+/*
+ * Note: the byteorder is either 0 or -1, both of which are palindromes.
+ * This simplifies the endianness handling a bit.
+ */
+#ifdef _BIG_ENDIAN
+#define ZFS_HOST_BYTEORDER (0ULL)
+#else
+#define ZFS_HOST_BYTEORDER (-1ULL)
+#endif
+
+#define BP_SHOULD_BYTESWAP(bp) (BP_GET_BYTEORDER(bp) != ZFS_HOST_BYTEORDER)
+
+#define BP_SPRINTF_LEN 320
+
+#include <sys/dmu.h>
+
+#define BP_GET_BUFC_TYPE(bp) \
+ (((BP_GET_LEVEL(bp) > 0) || (dmu_ot[BP_GET_TYPE(bp)].ot_metadata)) ? \
+ ARC_BUFC_METADATA : ARC_BUFC_DATA);
+/*
+ * Routines found in spa.c
+ */
+
+/* state manipulation functions */
+extern int spa_open(const char *pool, spa_t **, void *tag);
+extern int spa_get_stats(const char *pool, nvlist_t **config,
+ char *altroot, size_t buflen);
+extern int spa_create(const char *pool, nvlist_t *config, const char *altroot);
+extern int spa_import(const char *pool, nvlist_t *config, const char *altroot);
+extern nvlist_t *spa_tryimport(nvlist_t *tryconfig);
+extern int spa_destroy(char *pool);
+extern int spa_export(char *pool, nvlist_t **oldconfig);
+extern int spa_reset(char *pool);
+extern void spa_async_request(spa_t *spa, int flag);
+extern void spa_async_suspend(spa_t *spa);
+extern void spa_async_resume(spa_t *spa);
+extern spa_t *spa_inject_addref(char *pool);
+extern void spa_inject_delref(spa_t *spa);
+
+#define SPA_ASYNC_REOPEN 0x01
+#define SPA_ASYNC_REPLACE_DONE 0x02
+#define SPA_ASYNC_SCRUB 0x04
+#define SPA_ASYNC_RESILVER 0x08
+#define SPA_ASYNC_CONFIG_UPDATE 0x10
+
+/* device manipulation */
+extern int spa_vdev_add(spa_t *spa, nvlist_t *nvroot);
+extern int spa_vdev_attach(spa_t *spa, uint64_t guid, nvlist_t *nvroot,
+ int replacing);
+extern int spa_vdev_detach(spa_t *spa, uint64_t guid, int replace_done);
+extern int spa_vdev_remove(spa_t *spa, uint64_t guid, boolean_t unspare);
+extern int spa_vdev_setpath(spa_t *spa, uint64_t guid, const char *newpath);
+
+/* spare state (which is global across all pools) */
+extern void spa_spare_add(vdev_t *vd);
+extern void spa_spare_remove(vdev_t *vd);
+extern boolean_t spa_spare_exists(uint64_t guid, uint64_t *pool);
+extern void spa_spare_activate(vdev_t *vd);
+
+/* scrubbing */
+extern int spa_scrub(spa_t *spa, pool_scrub_type_t type, boolean_t force);
+extern void spa_scrub_suspend(spa_t *spa);
+extern void spa_scrub_resume(spa_t *spa);
+extern void spa_scrub_restart(spa_t *spa, uint64_t txg);
+
+/* spa syncing */
+extern void spa_sync(spa_t *spa, uint64_t txg); /* only for DMU use */
+extern void spa_sync_allpools(void);
+
+/*
+ * SPA configuration functions in spa_config.c
+ */
+
+#define SPA_CONFIG_UPDATE_POOL 0
+#define SPA_CONFIG_UPDATE_VDEVS 1
+
+extern void spa_config_sync(void);
+extern void spa_config_load(void);
+extern nvlist_t *spa_all_configs(uint64_t *);
+extern void spa_config_set(spa_t *spa, nvlist_t *config);
+extern nvlist_t *spa_config_generate(spa_t *spa, vdev_t *vd, uint64_t txg,
+ int getstats);
+extern void spa_config_update(spa_t *spa, int what);
+
+/*
+ * Miscellaneous SPA routines in spa_misc.c
+ */
+
+/* Namespace manipulation */
+extern spa_t *spa_lookup(const char *name);
+extern spa_t *spa_add(const char *name, const char *altroot);
+extern void spa_remove(spa_t *spa);
+extern spa_t *spa_next(spa_t *prev);
+
+/* Refcount functions */
+extern void spa_open_ref(spa_t *spa, void *tag);
+extern void spa_close(spa_t *spa, void *tag);
+extern boolean_t spa_refcount_zero(spa_t *spa);
+
+/* Pool configuration lock */
+extern void spa_config_enter(spa_t *spa, krw_t rw, void *tag);
+extern void spa_config_exit(spa_t *spa, void *tag);
+extern boolean_t spa_config_held(spa_t *spa, krw_t rw);
+
+/* Pool vdev add/remove lock */
+extern uint64_t spa_vdev_enter(spa_t *spa);
+extern int spa_vdev_exit(spa_t *spa, vdev_t *vd, uint64_t txg, int error);
+
+/* Accessor functions */
+extern krwlock_t *spa_traverse_rwlock(spa_t *spa);
+extern int spa_traverse_wanted(spa_t *spa);
+extern struct dsl_pool *spa_get_dsl(spa_t *spa);
+extern blkptr_t *spa_get_rootblkptr(spa_t *spa);
+extern void spa_set_rootblkptr(spa_t *spa, const blkptr_t *bp);
+extern void spa_altroot(spa_t *, char *, size_t);
+extern int spa_sync_pass(spa_t *spa);
+extern char *spa_name(spa_t *spa);
+extern uint64_t spa_guid(spa_t *spa);
+extern uint64_t spa_last_synced_txg(spa_t *spa);
+extern uint64_t spa_first_txg(spa_t *spa);
+extern uint64_t spa_version(spa_t *spa);
+extern int spa_state(spa_t *spa);
+extern uint64_t spa_freeze_txg(spa_t *spa);
+struct metaslab_class;
+extern struct metaslab_class *spa_metaslab_class_select(spa_t *spa);
+extern uint64_t spa_get_alloc(spa_t *spa);
+extern uint64_t spa_get_space(spa_t *spa);
+extern uint64_t spa_get_dspace(spa_t *spa);
+extern uint64_t spa_get_asize(spa_t *spa, uint64_t lsize);
+extern uint64_t spa_version(spa_t *spa);
+extern int spa_max_replication(spa_t *spa);
+extern int spa_busy(void);
+
+/* Miscellaneous support routines */
+extern int spa_rename(const char *oldname, const char *newname);
+extern boolean_t spa_guid_exists(uint64_t pool_guid, uint64_t device_guid);
+extern char *spa_strdup(const char *);
+extern void spa_strfree(char *);
+extern uint64_t spa_get_random(uint64_t range);
+extern void sprintf_blkptr(char *buf, int len, const blkptr_t *bp);
+extern void spa_freeze(spa_t *spa);
+extern void spa_upgrade(spa_t *spa);
+extern void spa_evict_all(void);
+extern vdev_t *spa_lookup_by_guid(spa_t *spa, uint64_t guid);
+extern boolean_t spa_has_spare(spa_t *, uint64_t guid);
+extern uint64_t bp_get_dasize(spa_t *spa, const blkptr_t *bp);
+
+/* history logging */
+extern void spa_history_create_obj(spa_t *spa, dmu_tx_t *tx);
+extern int spa_history_get(spa_t *spa, uint64_t *offset, uint64_t *len_read,
+ char *his_buf);
+extern int spa_history_log(spa_t *spa, const char *his_buf,
+ uint64_t pool_create);
+
+/* error handling */
+struct zbookmark;
+struct zio;
+extern void spa_log_error(spa_t *spa, struct zio *zio);
+extern void zfs_ereport_post(const char *class, spa_t *spa, vdev_t *vd,
+ struct zio *zio, uint64_t stateoroffset, uint64_t length);
+extern void zfs_post_ok(spa_t *spa, vdev_t *vd);
+extern uint64_t spa_get_errlog_size(spa_t *spa);
+extern int spa_get_errlog(spa_t *spa, void *uaddr, size_t *count);
+extern void spa_errlog_rotate(spa_t *spa);
+extern void spa_errlog_drain(spa_t *spa);
+extern void spa_errlog_sync(spa_t *spa, uint64_t txg);
+extern void spa_get_errlists(spa_t *spa, avl_tree_t *last, avl_tree_t *scrub);
+
+/* Initialization and termination */
+extern void spa_init(int flags);
+extern void spa_fini(void);
+
+/* properties */
+extern int spa_set_props(spa_t *spa, nvlist_t *nvp);
+extern int spa_get_props(spa_t *spa, nvlist_t **nvp);
+extern void spa_clear_bootfs(spa_t *spa, uint64_t obj, dmu_tx_t *tx);
+extern boolean_t spa_has_bootfs(spa_t *spa);
+
+#ifdef ZFS_DEBUG
+#define dprintf_bp(bp, fmt, ...) do { \
+ if (zfs_flags & ZFS_DEBUG_DPRINTF) { \
+ char *__blkbuf = kmem_alloc(BP_SPRINTF_LEN, KM_SLEEP); \
+ sprintf_blkptr(__blkbuf, BP_SPRINTF_LEN, (bp)); \
+ dprintf(fmt " %s\n", __VA_ARGS__, __blkbuf); \
+ kmem_free(__blkbuf, BP_SPRINTF_LEN); \
+ } \
+_NOTE(CONSTCOND) } while (0)
+#else
+#define dprintf_bp(bp, fmt, ...)
+#endif
+
+extern int spa_mode; /* mode, e.g. FREAD | FWRITE */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SPA_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h
new file mode 100644
index 0000000..8c57123
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/spa_impl.h
@@ -0,0 +1,168 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SPA_IMPL_H
+#define _SYS_SPA_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa.h>
+#include <sys/vdev.h>
+#include <sys/metaslab.h>
+#include <sys/dmu.h>
+#include <sys/dsl_pool.h>
+#include <sys/uberblock_impl.h>
+#include <sys/zfs_context.h>
+#include <sys/avl.h>
+#include <sys/refcount.h>
+#include <sys/bplist.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct spa_config_lock {
+ kmutex_t scl_lock;
+ refcount_t scl_count;
+ kthread_t *scl_writer;
+ kcondvar_t scl_cv;
+} spa_config_lock_t;
+
+typedef struct spa_error_entry {
+ zbookmark_t se_bookmark;
+ char *se_name;
+ avl_node_t se_avl;
+} spa_error_entry_t;
+
+typedef struct spa_history_phys {
+ uint64_t sh_pool_create_len; /* ending offset of zpool create */
+ uint64_t sh_phys_max_off; /* physical EOF */
+ uint64_t sh_bof; /* logical BOF */
+ uint64_t sh_eof; /* logical EOF */
+ uint64_t sh_records_lost; /* num of records overwritten */
+} spa_history_phys_t;
+
+typedef struct spa_props {
+ nvlist_t *spa_props_nvp;
+ list_node_t spa_list_node;
+} spa_props_t;
+
+struct spa {
+ /*
+ * Fields protected by spa_namespace_lock.
+ */
+ char *spa_name; /* pool name */
+ avl_node_t spa_avl; /* node in spa_namespace_avl */
+ nvlist_t *spa_config; /* last synced config */
+ nvlist_t *spa_config_syncing; /* currently syncing config */
+ uint64_t spa_config_txg; /* txg of last config change */
+ kmutex_t spa_config_cache_lock; /* for spa_config RW_READER */
+ int spa_sync_pass; /* iterate-to-convergence */
+ int spa_state; /* pool state */
+ int spa_inject_ref; /* injection references */
+ uint8_t spa_traverse_wanted; /* traverse lock wanted */
+ uint8_t spa_sync_on; /* sync threads are running */
+ spa_load_state_t spa_load_state; /* current load operation */
+ taskq_t *spa_zio_issue_taskq[ZIO_TYPES];
+ taskq_t *spa_zio_intr_taskq[ZIO_TYPES];
+ dsl_pool_t *spa_dsl_pool;
+ metaslab_class_t *spa_normal_class; /* normal data class */
+ uint64_t spa_first_txg; /* first txg after spa_open() */
+ uint64_t spa_final_txg; /* txg of export/destroy */
+ uint64_t spa_freeze_txg; /* freeze pool at this txg */
+ objset_t *spa_meta_objset; /* copy of dp->dp_meta_objset */
+ txg_list_t spa_vdev_txg_list; /* per-txg dirty vdev list */
+ vdev_t *spa_root_vdev; /* top-level vdev container */
+ uint64_t spa_load_guid; /* initial guid for spa_load */
+ list_t spa_dirty_list; /* vdevs with dirty labels */
+ uint64_t spa_spares_object; /* MOS object for spare list */
+ nvlist_t *spa_sparelist; /* cached spare config */
+ vdev_t **spa_spares; /* available hot spares */
+ int spa_nspares; /* number of hot spares */
+ boolean_t spa_sync_spares; /* sync the spares list */
+ uint64_t spa_config_object; /* MOS object for pool config */
+ uint64_t spa_syncing_txg; /* txg currently syncing */
+ uint64_t spa_sync_bplist_obj; /* object for deferred frees */
+ bplist_t spa_sync_bplist; /* deferred-free bplist */
+ krwlock_t spa_traverse_lock; /* traverse vs. spa_sync() */
+ uberblock_t spa_ubsync; /* last synced uberblock */
+ uberblock_t spa_uberblock; /* current uberblock */
+ kmutex_t spa_scrub_lock; /* resilver/scrub lock */
+ kthread_t *spa_scrub_thread; /* scrub/resilver thread */
+ traverse_handle_t *spa_scrub_th; /* scrub traverse handle */
+ uint64_t spa_scrub_restart_txg; /* need to restart */
+ uint64_t spa_scrub_mintxg; /* min txg we'll scrub */
+ uint64_t spa_scrub_maxtxg; /* max txg we'll scrub */
+ uint64_t spa_scrub_inflight; /* in-flight scrub I/Os */
+ uint64_t spa_scrub_maxinflight; /* max in-flight scrub I/Os */
+ uint64_t spa_scrub_errors; /* scrub I/O error count */
+ int spa_scrub_suspended; /* tell scrubber to suspend */
+ kcondvar_t spa_scrub_cv; /* scrub thread state change */
+ kcondvar_t spa_scrub_io_cv; /* scrub I/O completion */
+ uint8_t spa_scrub_stop; /* tell scrubber to stop */
+ uint8_t spa_scrub_active; /* active or suspended? */
+ uint8_t spa_scrub_type; /* type of scrub we're doing */
+ uint8_t spa_scrub_finished; /* indicator to rotate logs */
+ kmutex_t spa_async_lock; /* protect async state */
+ kthread_t *spa_async_thread; /* thread doing async task */
+ int spa_async_suspended; /* async tasks suspended */
+ kcondvar_t spa_async_cv; /* wait for thread_exit() */
+ uint16_t spa_async_tasks; /* async task mask */
+ char *spa_root; /* alternate root directory */
+ kmutex_t spa_uberblock_lock; /* vdev_uberblock_load_done() */
+ uint64_t spa_ena; /* spa-wide ereport ENA */
+ boolean_t spa_last_open_failed; /* true if last open faled */
+ kmutex_t spa_errlog_lock; /* error log lock */
+ uint64_t spa_errlog_last; /* last error log object */
+ uint64_t spa_errlog_scrub; /* scrub error log object */
+ kmutex_t spa_errlist_lock; /* error list/ereport lock */
+ avl_tree_t spa_errlist_last; /* last error list */
+ avl_tree_t spa_errlist_scrub; /* scrub error list */
+ uint64_t spa_deflate; /* should we deflate? */
+ uint64_t spa_history; /* history object */
+ kmutex_t spa_history_lock; /* history lock */
+ vdev_t *spa_pending_vdev; /* pending vdev additions */
+ nvlist_t **spa_pending_spares; /* pending spare additions */
+ uint_t spa_pending_nspares; /* # pending spares */
+ kmutex_t spa_props_lock; /* property lock */
+ uint64_t spa_pool_props_object; /* object for properties */
+ uint64_t spa_bootfs; /* default boot filesystem */
+ /*
+ * spa_refcnt must be the last element because it changes size based on
+ * compilation options. In order for the MDB module to function
+ * correctly, the other fields must remain in the same location.
+ */
+ spa_config_lock_t spa_config_lock; /* configuration changes */
+ refcount_t spa_refcount; /* number of opens */
+};
+
+extern const char *spa_config_dir;
+extern kmutex_t spa_namespace_lock;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SPA_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/space_map.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/space_map.h
new file mode 100644
index 0000000..db9daef
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/space_map.h
@@ -0,0 +1,162 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SPACE_MAP_H
+#define _SYS_SPACE_MAP_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/avl.h>
+#include <sys/dmu.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct space_map_ops space_map_ops_t;
+
+typedef struct space_map {
+ avl_tree_t sm_root; /* AVL tree of map segments */
+ uint64_t sm_space; /* sum of all segments in the map */
+ uint64_t sm_start; /* start of map */
+ uint64_t sm_size; /* size of map */
+ uint8_t sm_shift; /* unit shift */
+ uint8_t sm_pad[3]; /* unused */
+ uint8_t sm_loaded; /* map loaded? */
+ uint8_t sm_loading; /* map loading? */
+ kcondvar_t sm_load_cv; /* map load completion */
+ space_map_ops_t *sm_ops; /* space map block picker ops vector */
+ void *sm_ppd; /* picker-private data */
+ kmutex_t *sm_lock; /* pointer to lock that protects map */
+} space_map_t;
+
+typedef struct space_seg {
+ avl_node_t ss_node; /* AVL node */
+ uint64_t ss_start; /* starting offset of this segment */
+ uint64_t ss_end; /* ending offset (non-inclusive) */
+} space_seg_t;
+
+typedef struct space_map_obj {
+ uint64_t smo_object; /* on-disk space map object */
+ uint64_t smo_objsize; /* size of the object */
+ uint64_t smo_alloc; /* space allocated from the map */
+} space_map_obj_t;
+
+struct space_map_ops {
+ void (*smop_load)(space_map_t *sm);
+ void (*smop_unload)(space_map_t *sm);
+ uint64_t (*smop_alloc)(space_map_t *sm, uint64_t size);
+ void (*smop_claim)(space_map_t *sm, uint64_t start, uint64_t size);
+ void (*smop_free)(space_map_t *sm, uint64_t start, uint64_t size);
+};
+
+/*
+ * debug entry
+ *
+ * 1 3 10 50
+ * ,---+--------+------------+---------------------------------.
+ * | 1 | action | syncpass | txg (lower bits) |
+ * `---+--------+------------+---------------------------------'
+ * 63 62 60 59 50 49 0
+ *
+ *
+ *
+ * non-debug entry
+ *
+ * 1 47 1 15
+ * ,-----------------------------------------------------------.
+ * | 0 | offset (sm_shift units) | type | run |
+ * `-----------------------------------------------------------'
+ * 63 62 17 16 15 0
+ */
+
+/* All this stuff takes and returns bytes */
+#define SM_RUN_DECODE(x) (BF64_DECODE(x, 0, 15) + 1)
+#define SM_RUN_ENCODE(x) BF64_ENCODE((x) - 1, 0, 15)
+#define SM_TYPE_DECODE(x) BF64_DECODE(x, 15, 1)
+#define SM_TYPE_ENCODE(x) BF64_ENCODE(x, 15, 1)
+#define SM_OFFSET_DECODE(x) BF64_DECODE(x, 16, 47)
+#define SM_OFFSET_ENCODE(x) BF64_ENCODE(x, 16, 47)
+#define SM_DEBUG_DECODE(x) BF64_DECODE(x, 63, 1)
+#define SM_DEBUG_ENCODE(x) BF64_ENCODE(x, 63, 1)
+
+#define SM_DEBUG_ACTION_DECODE(x) BF64_DECODE(x, 60, 3)
+#define SM_DEBUG_ACTION_ENCODE(x) BF64_ENCODE(x, 60, 3)
+
+#define SM_DEBUG_SYNCPASS_DECODE(x) BF64_DECODE(x, 50, 10)
+#define SM_DEBUG_SYNCPASS_ENCODE(x) BF64_ENCODE(x, 50, 10)
+
+#define SM_DEBUG_TXG_DECODE(x) BF64_DECODE(x, 0, 50)
+#define SM_DEBUG_TXG_ENCODE(x) BF64_ENCODE(x, 0, 50)
+
+#define SM_RUN_MAX SM_RUN_DECODE(~0ULL)
+
+#define SM_ALLOC 0x0
+#define SM_FREE 0x1
+
+/*
+ * The data for a given space map can be kept on blocks of any size.
+ * Larger blocks entail fewer i/o operations, but they also cause the
+ * DMU to keep more data in-core, and also to waste more i/o bandwidth
+ * when only a few blocks have changed since the last transaction group.
+ * This could use a lot more research, but for now, set the freelist
+ * block size to 4k (2^12).
+ */
+#define SPACE_MAP_BLOCKSHIFT 12
+
+typedef void space_map_func_t(space_map_t *sm, uint64_t start, uint64_t size);
+
+extern void space_map_create(space_map_t *sm, uint64_t start, uint64_t size,
+ uint8_t shift, kmutex_t *lp);
+extern void space_map_destroy(space_map_t *sm);
+extern void space_map_add(space_map_t *sm, uint64_t start, uint64_t size);
+extern void space_map_remove(space_map_t *sm, uint64_t start, uint64_t size);
+extern int space_map_contains(space_map_t *sm, uint64_t start, uint64_t size);
+extern void space_map_vacate(space_map_t *sm,
+ space_map_func_t *func, space_map_t *mdest);
+extern void space_map_walk(space_map_t *sm,
+ space_map_func_t *func, space_map_t *mdest);
+extern void space_map_excise(space_map_t *sm, uint64_t start, uint64_t size);
+extern void space_map_union(space_map_t *smd, space_map_t *sms);
+
+extern void space_map_load_wait(space_map_t *sm);
+extern int space_map_load(space_map_t *sm, space_map_ops_t *ops,
+ uint8_t maptype, space_map_obj_t *smo, objset_t *os);
+extern void space_map_unload(space_map_t *sm);
+
+extern uint64_t space_map_alloc(space_map_t *sm, uint64_t size);
+extern void space_map_claim(space_map_t *sm, uint64_t start, uint64_t size);
+extern void space_map_free(space_map_t *sm, uint64_t start, uint64_t size);
+
+extern void space_map_sync(space_map_t *sm, uint8_t maptype,
+ space_map_obj_t *smo, objset_t *os, dmu_tx_t *tx);
+extern void space_map_truncate(space_map_obj_t *smo,
+ objset_t *os, dmu_tx_t *tx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SPACE_MAP_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/txg.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/txg.h
new file mode 100644
index 0000000..dae129c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/txg.h
@@ -0,0 +1,120 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_TXG_H
+#define _SYS_TXG_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa.h>
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define TXG_CONCURRENT_STATES 3 /* open, quiescing, syncing */
+#define TXG_SIZE 4 /* next power of 2 */
+#define TXG_MASK (TXG_SIZE - 1) /* mask for size */
+#define TXG_INITIAL TXG_SIZE /* initial txg */
+#define TXG_IDX (txg & TXG_MASK)
+
+#define TXG_WAIT 1ULL
+#define TXG_NOWAIT 2ULL
+
+typedef struct tx_cpu tx_cpu_t;
+
+typedef struct txg_handle {
+ tx_cpu_t *th_cpu;
+ uint64_t th_txg;
+} txg_handle_t;
+
+typedef struct txg_node {
+ struct txg_node *tn_next[TXG_SIZE];
+ uint8_t tn_member[TXG_SIZE];
+} txg_node_t;
+
+typedef struct txg_list {
+ kmutex_t tl_lock;
+ size_t tl_offset;
+ txg_node_t *tl_head[TXG_SIZE];
+} txg_list_t;
+
+struct dsl_pool;
+
+extern void txg_init(struct dsl_pool *dp, uint64_t txg);
+extern void txg_fini(struct dsl_pool *dp);
+extern void txg_sync_start(struct dsl_pool *dp);
+extern void txg_sync_stop(struct dsl_pool *dp);
+extern uint64_t txg_hold_open(struct dsl_pool *dp, txg_handle_t *txghp);
+extern void txg_rele_to_quiesce(txg_handle_t *txghp);
+extern void txg_rele_to_sync(txg_handle_t *txghp);
+extern void txg_suspend(struct dsl_pool *dp);
+extern void txg_resume(struct dsl_pool *dp);
+
+/*
+ * Wait until the given transaction group has finished syncing.
+ * Try to make this happen as soon as possible (eg. kick off any
+ * necessary syncs immediately). If txg==0, wait for the currently open
+ * txg to finish syncing.
+ */
+extern void txg_wait_synced(struct dsl_pool *dp, uint64_t txg);
+
+/*
+ * Wait until the given transaction group, or one after it, is
+ * the open transaction group. Try to make this happen as soon
+ * as possible (eg. kick off any necessary syncs immediately).
+ * If txg == 0, wait for the next open txg.
+ */
+extern void txg_wait_open(struct dsl_pool *dp, uint64_t txg);
+
+/*
+ * Returns TRUE if we are "backed up" waiting for the syncing
+ * transaction to complete; otherwise returns FALSE.
+ */
+extern int txg_stalled(struct dsl_pool *dp);
+
+/*
+ * Per-txg object lists.
+ */
+
+#define TXG_CLEAN(txg) ((txg) - 1)
+
+extern void txg_list_create(txg_list_t *tl, size_t offset);
+extern void txg_list_destroy(txg_list_t *tl);
+extern int txg_list_empty(txg_list_t *tl, uint64_t txg);
+extern int txg_list_add(txg_list_t *tl, void *p, uint64_t txg);
+extern void *txg_list_remove(txg_list_t *tl, uint64_t txg);
+extern void *txg_list_remove_this(txg_list_t *tl, void *p, uint64_t txg);
+extern int txg_list_member(txg_list_t *tl, void *p, uint64_t txg);
+extern void *txg_list_head(txg_list_t *tl, uint64_t txg);
+extern void *txg_list_next(txg_list_t *tl, void *p, uint64_t txg);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_TXG_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/txg_impl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/txg_impl.h
new file mode 100644
index 0000000..45a138a
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/txg_impl.h
@@ -0,0 +1,77 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_TXG_IMPL_H
+#define _SYS_TXG_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa.h>
+#include <sys/txg.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct tx_cpu {
+ kmutex_t tc_lock;
+ kcondvar_t tc_cv[TXG_SIZE];
+ uint64_t tc_count[TXG_SIZE];
+ char tc_pad[16];
+};
+
+typedef struct tx_state {
+ tx_cpu_t *tx_cpu; /* protects right to enter txg */
+ kmutex_t tx_sync_lock; /* protects tx_state_t */
+ krwlock_t tx_suspend;
+ uint64_t tx_open_txg; /* currently open txg id */
+ uint64_t tx_quiesced_txg; /* quiesced txg waiting for sync */
+ uint64_t tx_syncing_txg; /* currently syncing txg id */
+ uint64_t tx_synced_txg; /* last synced txg id */
+
+ uint64_t tx_sync_txg_waiting; /* txg we're waiting to sync */
+ uint64_t tx_quiesce_txg_waiting; /* txg we're waiting to open */
+
+ kcondvar_t tx_sync_more_cv;
+ kcondvar_t tx_sync_done_cv;
+ kcondvar_t tx_quiesce_more_cv;
+ kcondvar_t tx_quiesce_done_cv;
+ kcondvar_t tx_timeout_exit_cv;
+ kcondvar_t tx_exit_cv; /* wait for all threads to exit */
+
+ uint8_t tx_threads; /* number of threads */
+ uint8_t tx_exiting; /* set when we're exiting */
+
+ kthread_t *tx_sync_thread;
+ kthread_t *tx_quiesce_thread;
+ kthread_t *tx_timelimit_thread;
+} tx_state_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_TXG_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/uberblock.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/uberblock.h
new file mode 100644
index 0000000..93d936a
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/uberblock.h
@@ -0,0 +1,50 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_UBERBLOCK_H
+#define _SYS_UBERBLOCK_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa.h>
+#include <sys/vdev.h>
+#include <sys/zio.h>
+#include <sys/zio_checksum.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct uberblock uberblock_t;
+
+extern int uberblock_verify(uberblock_t *ub);
+extern int uberblock_update(uberblock_t *ub, vdev_t *rvd, uint64_t txg);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_UBERBLOCK_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/uberblock_impl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/uberblock_impl.h
new file mode 100644
index 0000000..ab0f2dc
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/uberblock_impl.h
@@ -0,0 +1,63 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_UBERBLOCK_IMPL_H
+#define _SYS_UBERBLOCK_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/uberblock.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The uberblock version is incremented whenever an incompatible on-disk
+ * format change is made to the SPA, DMU, or ZAP.
+ *
+ * Note: the first two fields should never be moved. When a storage pool
+ * is opened, the uberblock must be read off the disk before the version
+ * can be checked. If the ub_version field is moved, we may not detect
+ * version mismatch. If the ub_magic field is moved, applications that
+ * expect the magic number in the first word won't work.
+ */
+#define UBERBLOCK_MAGIC 0x00bab10c /* oo-ba-bloc! */
+#define UBERBLOCK_SHIFT 10 /* up to 1K */
+
+struct uberblock {
+ uint64_t ub_magic; /* UBERBLOCK_MAGIC */
+ uint64_t ub_version; /* ZFS_VERSION */
+ uint64_t ub_txg; /* txg of last sync */
+ uint64_t ub_guid_sum; /* sum of all vdev guids */
+ uint64_t ub_timestamp; /* UTC time of last sync */
+ blkptr_t ub_rootbp; /* MOS objset_phys_t */
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_UBERBLOCK_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/unique.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/unique.h
new file mode 100644
index 0000000..c8c177e
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/unique.h
@@ -0,0 +1,56 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_UNIQUE_H
+#define _SYS_UNIQUE_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* The number of significant bits in each unique value. */
+#define UNIQUE_BITS 56
+
+void unique_init(void);
+
+/* Return a new unique value. */
+uint64_t unique_create(void);
+
+/* Return a unique value, which equals the one passed in if possible. */
+uint64_t unique_insert(uint64_t value);
+
+/* Indicate that this value no longer needs to be uniquified against. */
+void unique_remove(uint64_t value);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_UNIQUE_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h
new file mode 100644
index 0000000..3120811
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev.h
@@ -0,0 +1,132 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_VDEV_H
+#define _SYS_VDEV_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa.h>
+#include <sys/zio.h>
+#include <sys/dmu.h>
+#include <sys/space_map.h>
+#include <sys/fs/zfs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern boolean_t zfs_nocacheflush;
+
+/*
+ * Fault injection modes.
+ */
+#define VDEV_FAULT_NONE 0
+#define VDEV_FAULT_RANDOM 1
+#define VDEV_FAULT_COUNT 2
+
+extern int vdev_open(vdev_t *);
+extern int vdev_validate(vdev_t *);
+extern void vdev_close(vdev_t *);
+extern int vdev_create(vdev_t *, uint64_t txg, boolean_t isreplace);
+extern void vdev_init(vdev_t *, uint64_t txg);
+extern void vdev_reopen(vdev_t *);
+extern int vdev_validate_spare(vdev_t *);
+
+extern vdev_t *vdev_lookup_top(spa_t *spa, uint64_t vdev);
+extern vdev_t *vdev_lookup_by_guid(vdev_t *vd, uint64_t guid);
+extern void vdev_dtl_dirty(space_map_t *sm, uint64_t txg, uint64_t size);
+extern int vdev_dtl_contains(space_map_t *sm, uint64_t txg, uint64_t size);
+extern void vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg,
+ int scrub_done);
+
+extern const char *vdev_description(vdev_t *vd);
+
+extern int vdev_metaslab_init(vdev_t *vd, uint64_t txg);
+extern void vdev_metaslab_fini(vdev_t *vd);
+
+extern void vdev_get_stats(vdev_t *vd, vdev_stat_t *vs);
+extern void vdev_stat_update(zio_t *zio);
+extern void vdev_scrub_stat_update(vdev_t *vd, pool_scrub_type_t type,
+ boolean_t complete);
+extern int vdev_getspec(spa_t *spa, uint64_t vdev, char **vdev_spec);
+extern void vdev_propagate_state(vdev_t *vd);
+extern void vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state,
+ vdev_aux_t aux);
+
+extern void vdev_space_update(vdev_t *vd, int64_t space_delta,
+ int64_t alloc_delta);
+
+extern uint64_t vdev_psize_to_asize(vdev_t *vd, uint64_t psize);
+
+extern void vdev_io_start(zio_t *zio);
+extern void vdev_io_done(zio_t *zio);
+
+extern int vdev_online(spa_t *spa, uint64_t guid);
+extern int vdev_offline(spa_t *spa, uint64_t guid, int istmp);
+extern void vdev_clear(spa_t *spa, vdev_t *vd);
+
+extern int vdev_error_inject(vdev_t *vd, zio_t *zio);
+extern int vdev_is_dead(vdev_t *vd);
+
+extern void vdev_cache_init(vdev_t *vd);
+extern void vdev_cache_fini(vdev_t *vd);
+extern int vdev_cache_read(zio_t *zio);
+extern void vdev_cache_write(zio_t *zio);
+
+extern void vdev_queue_init(vdev_t *vd);
+extern void vdev_queue_fini(vdev_t *vd);
+extern zio_t *vdev_queue_io(zio_t *zio);
+extern void vdev_queue_io_done(zio_t *zio);
+
+extern void vdev_config_dirty(vdev_t *vd);
+extern void vdev_config_clean(vdev_t *vd);
+extern int vdev_config_sync(vdev_t *vd, uint64_t txg);
+
+extern nvlist_t *vdev_config_generate(spa_t *spa, vdev_t *vd,
+ boolean_t getstats, boolean_t isspare);
+
+/*
+ * Label routines
+ */
+struct uberblock;
+extern uint64_t vdev_label_offset(uint64_t psize, int l, uint64_t offset);
+extern nvlist_t *vdev_label_read_config(vdev_t *vd);
+extern void vdev_uberblock_load(zio_t *zio, vdev_t *vd, struct uberblock *ub);
+
+typedef enum {
+ VDEV_LABEL_CREATE, /* create/add a new device */
+ VDEV_LABEL_REPLACE, /* replace an existing device */
+ VDEV_LABEL_SPARE, /* add a new hot spare */
+ VDEV_LABEL_REMOVE /* remove an existing device */
+} vdev_labeltype_t;
+
+extern int vdev_label_init(vdev_t *vd, uint64_t txg, vdev_labeltype_t reason);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_VDEV_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_disk.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_disk.h
new file mode 100644
index 0000000..95536a7
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_disk.h
@@ -0,0 +1,52 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_VDEV_DISK_H
+#define _SYS_VDEV_DISK_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/vdev.h>
+#ifdef _KERNEL
+#include <sys/sunldi.h>
+#include <sys/sunddi.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct vdev_disk {
+ ddi_devid_t vd_devid;
+ char *vd_minor;
+ ldi_handle_t vd_lh;
+} vdev_disk_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_VDEV_DISK_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_file.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_file.h
new file mode 100644
index 0000000..cd49673
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_file.h
@@ -0,0 +1,46 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_VDEV_FILE_H
+#define _SYS_VDEV_FILE_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/vdev.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct vdev_file {
+ vnode_t *vf_vnode;
+} vdev_file_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_VDEV_FILE_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h
new file mode 100644
index 0000000..aba7567
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/vdev_impl.h
@@ -0,0 +1,298 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_VDEV_IMPL_H
+#define _SYS_VDEV_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/avl.h>
+#include <sys/dmu.h>
+#include <sys/metaslab.h>
+#include <sys/nvpair.h>
+#include <sys/space_map.h>
+#include <sys/vdev.h>
+#include <sys/dkio.h>
+#include <sys/uberblock_impl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Virtual device descriptors.
+ *
+ * All storage pool operations go through the virtual device framework,
+ * which provides data replication and I/O scheduling.
+ */
+
+/*
+ * Forward declarations that lots of things need.
+ */
+typedef struct vdev_queue vdev_queue_t;
+typedef struct vdev_cache vdev_cache_t;
+typedef struct vdev_cache_entry vdev_cache_entry_t;
+
+/*
+ * Virtual device operations
+ */
+typedef int vdev_open_func_t(vdev_t *vd, uint64_t *size, uint64_t *ashift);
+typedef void vdev_close_func_t(vdev_t *vd);
+typedef uint64_t vdev_asize_func_t(vdev_t *vd, uint64_t psize);
+typedef void vdev_io_start_func_t(zio_t *zio);
+typedef void vdev_io_done_func_t(zio_t *zio);
+typedef void vdev_state_change_func_t(vdev_t *vd, int, int);
+
+typedef struct vdev_ops {
+ vdev_open_func_t *vdev_op_open;
+ vdev_close_func_t *vdev_op_close;
+ vdev_asize_func_t *vdev_op_asize;
+ vdev_io_start_func_t *vdev_op_io_start;
+ vdev_io_done_func_t *vdev_op_io_done;
+ vdev_state_change_func_t *vdev_op_state_change;
+ char vdev_op_type[16];
+ boolean_t vdev_op_leaf;
+} vdev_ops_t;
+
+/*
+ * Virtual device properties
+ */
+struct vdev_cache_entry {
+ char *ve_data;
+ uint64_t ve_offset;
+ uint64_t ve_lastused;
+ avl_node_t ve_offset_node;
+ avl_node_t ve_lastused_node;
+ uint32_t ve_hits;
+ uint16_t ve_missed_update;
+ zio_t *ve_fill_io;
+};
+
+struct vdev_cache {
+ avl_tree_t vc_offset_tree;
+ avl_tree_t vc_lastused_tree;
+ kmutex_t vc_lock;
+};
+
+struct vdev_queue {
+ avl_tree_t vq_deadline_tree;
+ avl_tree_t vq_read_tree;
+ avl_tree_t vq_write_tree;
+ avl_tree_t vq_pending_tree;
+ kmutex_t vq_lock;
+};
+
+/*
+ * Virtual device descriptor
+ */
+struct vdev {
+ /*
+ * Common to all vdev types.
+ */
+ uint64_t vdev_id; /* child number in vdev parent */
+ uint64_t vdev_guid; /* unique ID for this vdev */
+ uint64_t vdev_guid_sum; /* self guid + all child guids */
+ uint64_t vdev_asize; /* allocatable device capacity */
+ uint64_t vdev_ashift; /* block alignment shift */
+ uint64_t vdev_state; /* see VDEV_STATE_* #defines */
+ uint64_t vdev_prevstate; /* used when reopening a vdev */
+ vdev_ops_t *vdev_ops; /* vdev operations */
+ spa_t *vdev_spa; /* spa for this vdev */
+ void *vdev_tsd; /* type-specific data */
+ vdev_t *vdev_top; /* top-level vdev */
+ vdev_t *vdev_parent; /* parent vdev */
+ vdev_t **vdev_child; /* array of children */
+ uint64_t vdev_children; /* number of children */
+ space_map_t vdev_dtl_map; /* dirty time log in-core state */
+ space_map_t vdev_dtl_scrub; /* DTL for scrub repair writes */
+ vdev_stat_t vdev_stat; /* virtual device statistics */
+
+ /*
+ * Top-level vdev state.
+ */
+ uint64_t vdev_ms_array; /* metaslab array object */
+ uint64_t vdev_ms_shift; /* metaslab size shift */
+ uint64_t vdev_ms_count; /* number of metaslabs */
+ metaslab_group_t *vdev_mg; /* metaslab group */
+ metaslab_t **vdev_ms; /* metaslab array */
+ txg_list_t vdev_ms_list; /* per-txg dirty metaslab lists */
+ txg_list_t vdev_dtl_list; /* per-txg dirty DTL lists */
+ txg_node_t vdev_txg_node; /* per-txg dirty vdev linkage */
+ uint8_t vdev_reopen_wanted; /* async reopen wanted? */
+ list_node_t vdev_dirty_node; /* config dirty list */
+ uint64_t vdev_deflate_ratio; /* deflation ratio (x512) */
+
+ /*
+ * Leaf vdev state.
+ */
+ uint64_t vdev_psize; /* physical device capacity */
+ space_map_obj_t vdev_dtl; /* dirty time log on-disk state */
+ txg_node_t vdev_dtl_node; /* per-txg dirty DTL linkage */
+ uint64_t vdev_wholedisk; /* true if this is a whole disk */
+ uint64_t vdev_offline; /* device taken offline? */
+ uint64_t vdev_nparity; /* number of parity devices for raidz */
+ char *vdev_path; /* vdev path (if any) */
+ char *vdev_devid; /* vdev devid (if any) */
+ uint64_t vdev_fault_arg; /* fault injection paramater */
+ int vdev_fault_mask; /* zio types to fault */
+ uint8_t vdev_fault_mode; /* fault injection mode */
+ uint8_t vdev_cache_active; /* vdev_cache and vdev_queue */
+ uint8_t vdev_tmpoffline; /* device taken offline temporarily? */
+ uint8_t vdev_detached; /* device detached? */
+ uint64_t vdev_isspare; /* was a hot spare */
+ vdev_queue_t vdev_queue; /* I/O deadline schedule queue */
+ vdev_cache_t vdev_cache; /* physical block cache */
+ uint64_t vdev_not_present; /* not present during import */
+ hrtime_t vdev_last_try; /* last reopen time */
+ boolean_t vdev_nowritecache; /* true if flushwritecache failed */
+
+ /*
+ * For DTrace to work in userland (libzpool) context, these fields must
+ * remain at the end of the structure. DTrace will use the kernel's
+ * CTF definition for 'struct vdev', and since the size of a kmutex_t is
+ * larger in userland, the offsets for the rest fields would be
+ * incorrect.
+ */
+ kmutex_t vdev_dtl_lock; /* vdev_dtl_{map,resilver} */
+ kmutex_t vdev_stat_lock; /* vdev_stat */
+};
+
+#define VDEV_SKIP_SIZE (8 << 10)
+#define VDEV_BOOT_HEADER_SIZE (8 << 10)
+#define VDEV_PHYS_SIZE (112 << 10)
+#define VDEV_UBERBLOCK_RING (128 << 10)
+
+#define VDEV_UBERBLOCK_SHIFT(vd) \
+ MAX((vd)->vdev_top->vdev_ashift, UBERBLOCK_SHIFT)
+#define VDEV_UBERBLOCK_COUNT(vd) \
+ (VDEV_UBERBLOCK_RING >> VDEV_UBERBLOCK_SHIFT(vd))
+#define VDEV_UBERBLOCK_OFFSET(vd, n) \
+ offsetof(vdev_label_t, vl_uberblock[(n) << VDEV_UBERBLOCK_SHIFT(vd)])
+#define VDEV_UBERBLOCK_SIZE(vd) (1ULL << VDEV_UBERBLOCK_SHIFT(vd))
+
+/* ZFS boot block */
+#define VDEV_BOOT_MAGIC 0x2f5b007b10cULL
+#define VDEV_BOOT_VERSION 1 /* version number */
+
+typedef struct vdev_boot_header {
+ uint64_t vb_magic; /* VDEV_BOOT_MAGIC */
+ uint64_t vb_version; /* VDEV_BOOT_VERSION */
+ uint64_t vb_offset; /* start offset (bytes) */
+ uint64_t vb_size; /* size (bytes) */
+ char vb_pad[VDEV_BOOT_HEADER_SIZE - 4 * sizeof (uint64_t)];
+} vdev_boot_header_t;
+
+typedef struct vdev_phys {
+ char vp_nvlist[VDEV_PHYS_SIZE - sizeof (zio_block_tail_t)];
+ zio_block_tail_t vp_zbt;
+} vdev_phys_t;
+
+typedef struct vdev_label {
+ char vl_pad[VDEV_SKIP_SIZE]; /* 8K */
+ vdev_boot_header_t vl_boot_header; /* 8K */
+ vdev_phys_t vl_vdev_phys; /* 112K */
+ char vl_uberblock[VDEV_UBERBLOCK_RING]; /* 128K */
+} vdev_label_t; /* 256K total */
+
+/*
+ * vdev_dirty() flags
+ */
+#define VDD_METASLAB 0x01
+#define VDD_DTL 0x02
+
+/*
+ * Size and offset of embedded boot loader region on each label.
+ * The total size of the first two labels plus the boot area is 4MB.
+ */
+#define VDEV_BOOT_OFFSET (2 * sizeof (vdev_label_t))
+#define VDEV_BOOT_SIZE (7ULL << 19) /* 3.5M */
+
+/*
+ * Size of label regions at the start and end of each leaf device.
+ */
+#define VDEV_LABEL_START_SIZE (2 * sizeof (vdev_label_t) + VDEV_BOOT_SIZE)
+#define VDEV_LABEL_END_SIZE (2 * sizeof (vdev_label_t))
+#define VDEV_LABELS 4
+
+#define VDEV_ALLOC_LOAD 0
+#define VDEV_ALLOC_ADD 1
+#define VDEV_ALLOC_SPARE 2
+
+/*
+ * Allocate or free a vdev
+ */
+extern int vdev_alloc(spa_t *spa, vdev_t **vdp, nvlist_t *config,
+ vdev_t *parent, uint_t id, int alloctype);
+extern void vdev_free(vdev_t *vd);
+
+/*
+ * Add or remove children and parents
+ */
+extern void vdev_add_child(vdev_t *pvd, vdev_t *cvd);
+extern void vdev_remove_child(vdev_t *pvd, vdev_t *cvd);
+extern void vdev_compact_children(vdev_t *pvd);
+extern vdev_t *vdev_add_parent(vdev_t *cvd, vdev_ops_t *ops);
+extern void vdev_remove_parent(vdev_t *cvd);
+
+/*
+ * vdev sync load and sync
+ */
+extern void vdev_load(vdev_t *vd);
+extern void vdev_sync(vdev_t *vd, uint64_t txg);
+extern void vdev_sync_done(vdev_t *vd, uint64_t txg);
+extern void vdev_dirty(vdev_t *vd, int flags, void *arg, uint64_t txg);
+
+/*
+ * Available vdev types.
+ */
+extern vdev_ops_t vdev_root_ops;
+extern vdev_ops_t vdev_mirror_ops;
+extern vdev_ops_t vdev_replacing_ops;
+extern vdev_ops_t vdev_raidz_ops;
+#ifdef _KERNEL
+extern vdev_ops_t vdev_geom_ops;
+#else
+extern vdev_ops_t vdev_disk_ops;
+extern vdev_ops_t vdev_file_ops;
+#endif
+extern vdev_ops_t vdev_missing_ops;
+extern vdev_ops_t vdev_spare_ops;
+
+/*
+ * Common size functions
+ */
+extern uint64_t vdev_default_asize(vdev_t *vd, uint64_t psize);
+extern uint64_t vdev_get_rsize(vdev_t *vd);
+
+/*
+ * zdb uses this tunable, so it must be declared here to make lint happy.
+ */
+extern int zfs_vdev_cache_size;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_VDEV_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap.h
new file mode 100644
index 0000000..f89d938
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap.h
@@ -0,0 +1,359 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZAP_H
+#define _SYS_ZAP_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * ZAP - ZFS Attribute Processor
+ *
+ * The ZAP is a module which sits on top of the DMU (Data Managemnt
+ * Unit) and implements a higher-level storage primitive using DMU
+ * objects. Its primary consumer is the ZPL (ZFS Posix Layer).
+ *
+ * A "zapobj" is a DMU object which the ZAP uses to stores attributes.
+ * Users should use only zap routines to access a zapobj - they should
+ * not access the DMU object directly using DMU routines.
+ *
+ * The attributes stored in a zapobj are name-value pairs. The name is
+ * a zero-terminated string of up to ZAP_MAXNAMELEN bytes (including
+ * terminating NULL). The value is an array of integers, which may be
+ * 1, 2, 4, or 8 bytes long. The total space used by the array (number
+ * of integers * integer length) can be up to ZAP_MAXVALUELEN bytes.
+ * Note that an 8-byte integer value can be used to store the location
+ * (object number) of another dmu object (which may be itself a zapobj).
+ * Note that you can use a zero-length attribute to store a single bit
+ * of information - the attribute is present or not.
+ *
+ * The ZAP routines are thread-safe. However, you must observe the
+ * DMU's restriction that a transaction may not be operated on
+ * concurrently.
+ *
+ * Any of the routines that return an int may return an I/O error (EIO
+ * or ECHECKSUM).
+ *
+ *
+ * Implementation / Performance Notes:
+ *
+ * The ZAP is intended to operate most efficiently on attributes with
+ * short (49 bytes or less) names and single 8-byte values, for which
+ * the microzap will be used. The ZAP should be efficient enough so
+ * that the user does not need to cache these attributes.
+ *
+ * The ZAP's locking scheme makes its routines thread-safe. Operations
+ * on different zapobjs will be processed concurrently. Operations on
+ * the same zapobj which only read data will be processed concurrently.
+ * Operations on the same zapobj which modify data will be processed
+ * concurrently when there are many attributes in the zapobj (because
+ * the ZAP uses per-block locking - more than 128 * (number of cpus)
+ * small attributes will suffice).
+ */
+
+/*
+ * We're using zero-terminated byte strings (ie. ASCII or UTF-8 C
+ * strings) for the names of attributes, rather than a byte string
+ * bounded by an explicit length. If some day we want to support names
+ * in character sets which have embedded zeros (eg. UTF-16, UTF-32),
+ * we'll have to add routines for using length-bounded strings.
+ */
+
+#include <sys/dmu.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZAP_MAXNAMELEN 256
+#define ZAP_MAXVALUELEN 1024
+
+/*
+ * Create a new zapobj with no attributes and return its object number.
+ */
+uint64_t zap_create(objset_t *ds, dmu_object_type_t ot,
+ dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx);
+
+/*
+ * Create a new zapobj with no attributes from the given (unallocated)
+ * object number.
+ */
+int zap_create_claim(objset_t *ds, uint64_t obj, dmu_object_type_t ot,
+ dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx);
+
+/*
+ * The zapobj passed in must be a valid ZAP object for all of the
+ * following routines.
+ */
+
+/*
+ * Destroy this zapobj and all its attributes.
+ *
+ * Frees the object number using dmu_object_free.
+ */
+int zap_destroy(objset_t *ds, uint64_t zapobj, dmu_tx_t *tx);
+
+/*
+ * Manipulate attributes.
+ *
+ * 'integer_size' is in bytes, and must be 1, 2, 4, or 8.
+ */
+
+/*
+ * Retrieve the contents of the attribute with the given name.
+ *
+ * If the requested attribute does not exist, the call will fail and
+ * return ENOENT.
+ *
+ * If 'integer_size' is smaller than the attribute's integer size, the
+ * call will fail and return EINVAL.
+ *
+ * If 'integer_size' is equal to or larger than the attribute's integer
+ * size, the call will succeed and return 0. * When converting to a
+ * larger integer size, the integers will be treated as unsigned (ie. no
+ * sign-extension will be performed).
+ *
+ * 'num_integers' is the length (in integers) of 'buf'.
+ *
+ * If the attribute is longer than the buffer, as many integers as will
+ * fit will be transferred to 'buf'. If the entire attribute was not
+ * transferred, the call will return EOVERFLOW.
+ */
+int zap_lookup(objset_t *ds, uint64_t zapobj, const char *name,
+ uint64_t integer_size, uint64_t num_integers, void *buf);
+
+/*
+ * Create an attribute with the given name and value.
+ *
+ * If an attribute with the given name already exists, the call will
+ * fail and return EEXIST.
+ */
+int zap_add(objset_t *ds, uint64_t zapobj, const char *name,
+ int integer_size, uint64_t num_integers,
+ const void *val, dmu_tx_t *tx);
+
+/*
+ * Set the attribute with the given name to the given value. If an
+ * attribute with the given name does not exist, it will be created. If
+ * an attribute with the given name already exists, the previous value
+ * will be overwritten. The integer_size may be different from the
+ * existing attribute's integer size, in which case the attribute's
+ * integer size will be updated to the new value.
+ */
+int zap_update(objset_t *ds, uint64_t zapobj, const char *name,
+ int integer_size, uint64_t num_integers, const void *val, dmu_tx_t *tx);
+
+/*
+ * Get the length (in integers) and the integer size of the specified
+ * attribute.
+ *
+ * If the requested attribute does not exist, the call will fail and
+ * return ENOENT.
+ */
+int zap_length(objset_t *ds, uint64_t zapobj, const char *name,
+ uint64_t *integer_size, uint64_t *num_integers);
+
+/*
+ * Remove the specified attribute.
+ *
+ * If the specified attribute does not exist, the call will fail and
+ * return ENOENT.
+ */
+int zap_remove(objset_t *ds, uint64_t zapobj, const char *name, dmu_tx_t *tx);
+
+/*
+ * Returns (in *count) the number of attributes in the specified zap
+ * object.
+ */
+int zap_count(objset_t *ds, uint64_t zapobj, uint64_t *count);
+
+
+/*
+ * Returns (in name) the name of the entry whose value
+ * (za_first_integer) is value, or ENOENT if not found. The string
+ * pointed to by name must be at least 256 bytes long.
+ */
+int zap_value_search(objset_t *os, uint64_t zapobj, uint64_t value, char *name);
+
+struct zap;
+struct zap_leaf;
+typedef struct zap_cursor {
+ /* This structure is opaque! */
+ objset_t *zc_objset;
+ struct zap *zc_zap;
+ struct zap_leaf *zc_leaf;
+ uint64_t zc_zapobj;
+ uint64_t zc_hash;
+ uint32_t zc_cd;
+} zap_cursor_t;
+
+typedef struct {
+ int za_integer_length;
+ uint64_t za_num_integers;
+ uint64_t za_first_integer; /* no sign extension for <8byte ints */
+ char za_name[MAXNAMELEN];
+} zap_attribute_t;
+
+/*
+ * The interface for listing all the attributes of a zapobj can be
+ * thought of as cursor moving down a list of the attributes one by
+ * one. The cookie returned by the zap_cursor_serialize routine is
+ * persistent across system calls (and across reboot, even).
+ */
+
+/*
+ * Initialize a zap cursor, pointing to the "first" attribute of the
+ * zapobj. You must _fini the cursor when you are done with it.
+ */
+void zap_cursor_init(zap_cursor_t *zc, objset_t *ds, uint64_t zapobj);
+void zap_cursor_fini(zap_cursor_t *zc);
+
+/*
+ * Get the attribute currently pointed to by the cursor. Returns
+ * ENOENT if at the end of the attributes.
+ */
+int zap_cursor_retrieve(zap_cursor_t *zc, zap_attribute_t *za);
+
+/*
+ * Advance the cursor to the next attribute.
+ */
+void zap_cursor_advance(zap_cursor_t *zc);
+
+/*
+ * Get a persistent cookie pointing to the current position of the zap
+ * cursor. The low 4 bits in the cookie are always zero, and thus can
+ * be used as to differentiate a serialized cookie from a different type
+ * of value. The cookie will be less than 2^32 as long as there are
+ * fewer than 2^22 (4.2 million) entries in the zap object.
+ */
+uint64_t zap_cursor_serialize(zap_cursor_t *zc);
+
+/*
+ * Initialize a zap cursor pointing to the position recorded by
+ * zap_cursor_serialize (in the "serialized" argument). You can also
+ * use a "serialized" argument of 0 to start at the beginning of the
+ * zapobj (ie. zap_cursor_init_serialized(..., 0) is equivalent to
+ * zap_cursor_init(...).)
+ */
+void zap_cursor_init_serialized(zap_cursor_t *zc, objset_t *ds,
+ uint64_t zapobj, uint64_t serialized);
+
+
+#define ZAP_HISTOGRAM_SIZE 10
+
+typedef struct zap_stats {
+ /*
+ * Size of the pointer table (in number of entries).
+ * This is always a power of 2, or zero if it's a microzap.
+ * In general, it should be considerably greater than zs_num_leafs.
+ */
+ uint64_t zs_ptrtbl_len;
+
+ uint64_t zs_blocksize; /* size of zap blocks */
+
+ /*
+ * The number of blocks used. Note that some blocks may be
+ * wasted because old ptrtbl's and large name/value blocks are
+ * not reused. (Although their space is reclaimed, we don't
+ * reuse those offsets in the object.)
+ */
+ uint64_t zs_num_blocks;
+
+ /*
+ * Pointer table values from zap_ptrtbl in the zap_phys_t
+ */
+ uint64_t zs_ptrtbl_nextblk; /* next (larger) copy start block */
+ uint64_t zs_ptrtbl_blks_copied; /* number source blocks copied */
+ uint64_t zs_ptrtbl_zt_blk; /* starting block number */
+ uint64_t zs_ptrtbl_zt_numblks; /* number of blocks */
+ uint64_t zs_ptrtbl_zt_shift; /* bits to index it */
+
+ /*
+ * Values of the other members of the zap_phys_t
+ */
+ uint64_t zs_block_type; /* ZBT_HEADER */
+ uint64_t zs_magic; /* ZAP_MAGIC */
+ uint64_t zs_num_leafs; /* The number of leaf blocks */
+ uint64_t zs_num_entries; /* The number of zap entries */
+ uint64_t zs_salt; /* salt to stir into hash function */
+
+ /*
+ * Histograms. For all histograms, the last index
+ * (ZAP_HISTOGRAM_SIZE-1) includes any values which are greater
+ * than what can be represented. For example
+ * zs_leafs_with_n5_entries[ZAP_HISTOGRAM_SIZE-1] is the number
+ * of leafs with more than 45 entries.
+ */
+
+ /*
+ * zs_leafs_with_n_pointers[n] is the number of leafs with
+ * 2^n pointers to it.
+ */
+ uint64_t zs_leafs_with_2n_pointers[ZAP_HISTOGRAM_SIZE];
+
+ /*
+ * zs_leafs_with_n_entries[n] is the number of leafs with
+ * [n*5, (n+1)*5) entries. In the current implementation, there
+ * can be at most 55 entries in any block, but there may be
+ * fewer if the name or value is large, or the block is not
+ * completely full.
+ */
+ uint64_t zs_blocks_with_n5_entries[ZAP_HISTOGRAM_SIZE];
+
+ /*
+ * zs_leafs_n_tenths_full[n] is the number of leafs whose
+ * fullness is in the range [n/10, (n+1)/10).
+ */
+ uint64_t zs_blocks_n_tenths_full[ZAP_HISTOGRAM_SIZE];
+
+ /*
+ * zs_entries_using_n_chunks[n] is the number of entries which
+ * consume n 24-byte chunks. (Note, large names/values only use
+ * one chunk, but contribute to zs_num_blocks_large.)
+ */
+ uint64_t zs_entries_using_n_chunks[ZAP_HISTOGRAM_SIZE];
+
+ /*
+ * zs_buckets_with_n_entries[n] is the number of buckets (each
+ * leaf has 64 buckets) with n entries.
+ * zs_buckets_with_n_entries[1] should be very close to
+ * zs_num_entries.
+ */
+ uint64_t zs_buckets_with_n_entries[ZAP_HISTOGRAM_SIZE];
+} zap_stats_t;
+
+/*
+ * Get statistics about a ZAP object. Note: you need to be aware of the
+ * internal implementation of the ZAP to correctly interpret some of the
+ * statistics. This interface shouldn't be relied on unless you really
+ * know what you're doing.
+ */
+int zap_get_stats(objset_t *ds, uint64_t zapobj, zap_stats_t *zs);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ZAP_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap_impl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap_impl.h
new file mode 100644
index 0000000..4e43f4a
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap_impl.h
@@ -0,0 +1,204 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZAP_IMPL_H
+#define _SYS_ZAP_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zap.h>
+#include <sys/zfs_context.h>
+#include <sys/avl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern int fzap_default_block_shift;
+
+#define ZAP_MAGIC 0x2F52AB2ABULL
+
+#define FZAP_BLOCK_SHIFT(zap) ((zap)->zap_f.zap_block_shift)
+
+#define ZAP_MAXCD (uint32_t)(-1)
+#define ZAP_HASHBITS 28
+#define MZAP_ENT_LEN 64
+#define MZAP_NAME_LEN (MZAP_ENT_LEN - 8 - 4 - 2)
+#define MZAP_MAX_BLKSHIFT SPA_MAXBLOCKSHIFT
+#define MZAP_MAX_BLKSZ (1 << MZAP_MAX_BLKSHIFT)
+
+typedef struct mzap_ent_phys {
+ uint64_t mze_value;
+ uint32_t mze_cd;
+ uint16_t mze_pad; /* in case we want to chain them someday */
+ char mze_name[MZAP_NAME_LEN];
+} mzap_ent_phys_t;
+
+typedef struct mzap_phys {
+ uint64_t mz_block_type; /* ZBT_MICRO */
+ uint64_t mz_salt;
+ uint64_t mz_pad[6];
+ mzap_ent_phys_t mz_chunk[1];
+ /* actually variable size depending on block size */
+} mzap_phys_t;
+
+typedef struct mzap_ent {
+ avl_node_t mze_node;
+ int mze_chunkid;
+ uint64_t mze_hash;
+ mzap_ent_phys_t mze_phys;
+} mzap_ent_t;
+
+
+/*
+ * The (fat) zap is stored in one object. It is an array of
+ * 1<<FZAP_BLOCK_SHIFT byte blocks. The layout looks like one of:
+ *
+ * ptrtbl fits in first block:
+ * [zap_phys_t zap_ptrtbl_shift < 6] [zap_leaf_t] ...
+ *
+ * ptrtbl too big for first block:
+ * [zap_phys_t zap_ptrtbl_shift >= 6] [zap_leaf_t] [ptrtbl] ...
+ *
+ */
+
+struct dmu_buf;
+struct zap_leaf;
+
+#define ZBT_LEAF ((1ULL << 63) + 0)
+#define ZBT_HEADER ((1ULL << 63) + 1)
+#define ZBT_MICRO ((1ULL << 63) + 3)
+/* any other values are ptrtbl blocks */
+
+/*
+ * the embedded pointer table takes up half a block:
+ * block size / entry size (2^3) / 2
+ */
+#define ZAP_EMBEDDED_PTRTBL_SHIFT(zap) (FZAP_BLOCK_SHIFT(zap) - 3 - 1)
+
+/*
+ * The embedded pointer table starts half-way through the block. Since
+ * the pointer table itself is half the block, it starts at (64-bit)
+ * word number (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)).
+ */
+#define ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) \
+ ((uint64_t *)(zap)->zap_f.zap_phys) \
+ [(idx) + (1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap))]
+
+/*
+ * TAKE NOTE:
+ * If zap_phys_t is modified, zap_byteswap() must be modified.
+ */
+typedef struct zap_phys {
+ uint64_t zap_block_type; /* ZBT_HEADER */
+ uint64_t zap_magic; /* ZAP_MAGIC */
+
+ struct zap_table_phys {
+ uint64_t zt_blk; /* starting block number */
+ uint64_t zt_numblks; /* number of blocks */
+ uint64_t zt_shift; /* bits to index it */
+ uint64_t zt_nextblk; /* next (larger) copy start block */
+ uint64_t zt_blks_copied; /* number source blocks copied */
+ } zap_ptrtbl;
+
+ uint64_t zap_freeblk; /* the next free block */
+ uint64_t zap_num_leafs; /* number of leafs */
+ uint64_t zap_num_entries; /* number of entries */
+ uint64_t zap_salt; /* salt to stir into hash function */
+ /*
+ * This structure is followed by padding, and then the embedded
+ * pointer table. The embedded pointer table takes up second
+ * half of the block. It is accessed using the
+ * ZAP_EMBEDDED_PTRTBL_ENT() macro.
+ */
+} zap_phys_t;
+
+typedef struct zap_table_phys zap_table_phys_t;
+
+typedef struct zap {
+ objset_t *zap_objset;
+ uint64_t zap_object;
+ struct dmu_buf *zap_dbuf;
+ krwlock_t zap_rwlock;
+ int zap_ismicro;
+ uint64_t zap_salt;
+ union {
+ struct {
+ zap_phys_t *zap_phys;
+
+ /*
+ * zap_num_entries_mtx protects
+ * zap_num_entries
+ */
+ kmutex_t zap_num_entries_mtx;
+ int zap_block_shift;
+ } zap_fat;
+ struct {
+ mzap_phys_t *zap_phys;
+ int16_t zap_num_entries;
+ int16_t zap_num_chunks;
+ int16_t zap_alloc_next;
+ avl_tree_t zap_avl;
+ } zap_micro;
+ } zap_u;
+} zap_t;
+
+#define zap_f zap_u.zap_fat
+#define zap_m zap_u.zap_micro
+
+uint64_t zap_hash(zap_t *zap, const char *name);
+int zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx,
+ krw_t lti, int fatreader, zap_t **zapp);
+void zap_unlockdir(zap_t *zap);
+void zap_evict(dmu_buf_t *db, void *vmzap);
+
+#define ZAP_HASH_IDX(hash, n) (((n) == 0) ? 0 : ((hash) >> (64 - (n))))
+
+void fzap_byteswap(void *buf, size_t size);
+int fzap_count(zap_t *zap, uint64_t *count);
+int fzap_lookup(zap_t *zap, const char *name,
+ uint64_t integer_size, uint64_t num_integers, void *buf);
+int fzap_add(zap_t *zap, const char *name,
+ uint64_t integer_size, uint64_t num_integers,
+ const void *val, dmu_tx_t *tx);
+int fzap_update(zap_t *zap, const char *name,
+ int integer_size, uint64_t num_integers, const void *val, dmu_tx_t *tx);
+int fzap_length(zap_t *zap, const char *name,
+ uint64_t *integer_size, uint64_t *num_integers);
+int fzap_remove(zap_t *zap, const char *name, dmu_tx_t *tx);
+int fzap_cursor_retrieve(zap_t *zap, zap_cursor_t *zc, zap_attribute_t *za);
+void fzap_get_stats(zap_t *zap, zap_stats_t *zs);
+void zap_put_leaf(struct zap_leaf *l);
+
+int fzap_add_cd(zap_t *zap, const char *name,
+ uint64_t integer_size, uint64_t num_integers,
+ const void *val, uint32_t cd, dmu_tx_t *tx);
+void fzap_upgrade(zap_t *zap, dmu_tx_t *tx);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ZAP_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap_leaf.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap_leaf.h
new file mode 100644
index 0000000..147fb72
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zap_leaf.h
@@ -0,0 +1,234 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZAP_LEAF_H
+#define _SYS_ZAP_LEAF_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct zap;
+
+#define ZAP_LEAF_MAGIC 0x2AB1EAF
+
+/* chunk size = 24 bytes */
+#define ZAP_LEAF_CHUNKSIZE 24
+
+/*
+ * The amount of space available for chunks is:
+ * block size (1<<l->l_bs) - hash entry size (2) * number of hash
+ * entries - header space (2*chunksize)
+ */
+#define ZAP_LEAF_NUMCHUNKS(l) \
+ (((1<<(l)->l_bs) - 2*ZAP_LEAF_HASH_NUMENTRIES(l)) / \
+ ZAP_LEAF_CHUNKSIZE - 2)
+
+/*
+ * The amount of space within the chunk available for the array is:
+ * chunk size - space for type (1) - space for next pointer (2)
+ */
+#define ZAP_LEAF_ARRAY_BYTES (ZAP_LEAF_CHUNKSIZE - 3)
+
+#define ZAP_LEAF_ARRAY_NCHUNKS(bytes) \
+ (((bytes)+ZAP_LEAF_ARRAY_BYTES-1)/ZAP_LEAF_ARRAY_BYTES)
+
+/*
+ * Low water mark: when there are only this many chunks free, start
+ * growing the ptrtbl. Ideally, this should be larger than a
+ * "reasonably-sized" entry. 20 chunks is more than enough for the
+ * largest directory entry (MAXNAMELEN (256) byte name, 8-byte value),
+ * while still being only around 3% for 16k blocks.
+ */
+#define ZAP_LEAF_LOW_WATER (20)
+
+/*
+ * The leaf hash table has block size / 2^5 (32) number of entries,
+ * which should be more than enough for the maximum number of entries,
+ * which is less than block size / CHUNKSIZE (24) / minimum number of
+ * chunks per entry (3).
+ */
+#define ZAP_LEAF_HASH_SHIFT(l) ((l)->l_bs - 5)
+#define ZAP_LEAF_HASH_NUMENTRIES(l) (1 << ZAP_LEAF_HASH_SHIFT(l))
+
+/*
+ * The chunks start immediately after the hash table. The end of the
+ * hash table is at l_hash + HASH_NUMENTRIES, which we simply cast to a
+ * chunk_t.
+ */
+#define ZAP_LEAF_CHUNK(l, idx) \
+ ((zap_leaf_chunk_t *) \
+ ((l)->l_phys->l_hash + ZAP_LEAF_HASH_NUMENTRIES(l)))[idx]
+#define ZAP_LEAF_ENTRY(l, idx) (&ZAP_LEAF_CHUNK(l, idx).l_entry)
+
+typedef enum zap_chunk_type {
+ ZAP_CHUNK_FREE = 253,
+ ZAP_CHUNK_ENTRY = 252,
+ ZAP_CHUNK_ARRAY = 251,
+ ZAP_CHUNK_TYPE_MAX = 250
+} zap_chunk_type_t;
+
+/*
+ * TAKE NOTE:
+ * If zap_leaf_phys_t is modified, zap_leaf_byteswap() must be modified.
+ */
+typedef struct zap_leaf_phys {
+ struct zap_leaf_header {
+ uint64_t lh_block_type; /* ZBT_LEAF */
+ uint64_t lh_pad1;
+ uint64_t lh_prefix; /* hash prefix of this leaf */
+ uint32_t lh_magic; /* ZAP_LEAF_MAGIC */
+ uint16_t lh_nfree; /* number free chunks */
+ uint16_t lh_nentries; /* number of entries */
+ uint16_t lh_prefix_len; /* num bits used to id this */
+
+/* above is accessable to zap, below is zap_leaf private */
+
+ uint16_t lh_freelist; /* chunk head of free list */
+ uint8_t lh_pad2[12];
+ } l_hdr; /* 2 24-byte chunks */
+
+ /*
+ * The header is followed by a hash table with
+ * ZAP_LEAF_HASH_NUMENTRIES(zap) entries. The hash table is
+ * followed by an array of ZAP_LEAF_NUMCHUNKS(zap)
+ * zap_leaf_chunk structures. These structures are accessed
+ * with the ZAP_LEAF_CHUNK() macro.
+ */
+
+ uint16_t l_hash[1];
+} zap_leaf_phys_t;
+
+typedef union zap_leaf_chunk {
+ struct zap_leaf_entry {
+ uint8_t le_type; /* always ZAP_CHUNK_ENTRY */
+ uint8_t le_int_size; /* size of ints */
+ uint16_t le_next; /* next entry in hash chain */
+ uint16_t le_name_chunk; /* first chunk of the name */
+ uint16_t le_name_length; /* bytes in name, incl null */
+ uint16_t le_value_chunk; /* first chunk of the value */
+ uint16_t le_value_length; /* value length in ints */
+ uint32_t le_cd; /* collision differentiator */
+ uint64_t le_hash; /* hash value of the name */
+ } l_entry;
+ struct zap_leaf_array {
+ uint8_t la_type; /* always ZAP_CHUNK_ARRAY */
+ uint8_t la_array[ZAP_LEAF_ARRAY_BYTES];
+ uint16_t la_next; /* next blk or CHAIN_END */
+ } l_array;
+ struct zap_leaf_free {
+ uint8_t lf_type; /* always ZAP_CHUNK_FREE */
+ uint8_t lf_pad[ZAP_LEAF_ARRAY_BYTES];
+ uint16_t lf_next; /* next in free list, or CHAIN_END */
+ } l_free;
+} zap_leaf_chunk_t;
+
+typedef struct zap_leaf {
+ krwlock_t l_rwlock; /* only used on head of chain */
+ uint64_t l_blkid; /* 1<<ZAP_BLOCK_SHIFT byte block off */
+ int l_bs; /* block size shift */
+ dmu_buf_t *l_dbuf;
+ zap_leaf_phys_t *l_phys;
+} zap_leaf_t;
+
+
+typedef struct zap_entry_handle {
+ /* below is set by zap_leaf.c and is public to zap.c */
+ uint64_t zeh_num_integers;
+ uint64_t zeh_hash;
+ uint32_t zeh_cd;
+ uint8_t zeh_integer_size;
+
+ /* below is private to zap_leaf.c */
+ uint16_t zeh_fakechunk;
+ uint16_t *zeh_chunkp;
+ zap_leaf_t *zeh_leaf;
+} zap_entry_handle_t;
+
+/*
+ * Return a handle to the named entry, or ENOENT if not found. The hash
+ * value must equal zap_hash(name).
+ */
+extern int zap_leaf_lookup(zap_leaf_t *l,
+ const char *name, uint64_t h, zap_entry_handle_t *zeh);
+
+/*
+ * Return a handle to the entry with this hash+cd, or the entry with the
+ * next closest hash+cd.
+ */
+extern int zap_leaf_lookup_closest(zap_leaf_t *l,
+ uint64_t hash, uint32_t cd, zap_entry_handle_t *zeh);
+
+/*
+ * Read the first num_integers in the attribute. Integer size
+ * conversion will be done without sign extension. Return EINVAL if
+ * integer_size is too small. Return EOVERFLOW if there are more than
+ * num_integers in the attribute.
+ */
+extern int zap_entry_read(const zap_entry_handle_t *zeh,
+ uint8_t integer_size, uint64_t num_integers, void *buf);
+
+extern int zap_entry_read_name(const zap_entry_handle_t *zeh,
+ uint16_t buflen, char *buf);
+
+/*
+ * Replace the value of an existing entry.
+ *
+ * zap_entry_update may fail if it runs out of space (ENOSPC).
+ */
+extern int zap_entry_update(zap_entry_handle_t *zeh,
+ uint8_t integer_size, uint64_t num_integers, const void *buf);
+
+/*
+ * Remove an entry.
+ */
+extern void zap_entry_remove(zap_entry_handle_t *zeh);
+
+/*
+ * Create an entry. An equal entry must not exist, and this entry must
+ * belong in this leaf (according to its hash value). Fills in the
+ * entry handle on success. Returns 0 on success or ENOSPC on failure.
+ */
+extern int zap_entry_create(zap_leaf_t *l,
+ const char *name, uint64_t h, uint32_t cd,
+ uint8_t integer_size, uint64_t num_integers, const void *buf,
+ zap_entry_handle_t *zeh);
+
+/*
+ * Other stuff.
+ */
+
+extern void zap_leaf_init(zap_leaf_t *l);
+extern void zap_leaf_byteswap(zap_leaf_phys_t *buf, int len);
+extern void zap_leaf_split(zap_leaf_t *l, zap_leaf_t *nl);
+extern void zap_leaf_stats(zap_t *zap, zap_leaf_t *l, zap_stats_t *zs);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ZAP_LEAF_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h
new file mode 100644
index 0000000..3250b76
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_acl.h
@@ -0,0 +1,115 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_FS_ZFS_ACL_H
+#define _SYS_FS_ZFS_ACL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef _KERNEL
+#include <sys/cred.h>
+#endif
+#include <sys/acl.h>
+#include <sys/dmu.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct znode_phys;
+
+#define ACCESS_UNDETERMINED -1
+
+#define ACE_SLOT_CNT 6
+
+typedef struct zfs_znode_acl {
+ uint64_t z_acl_extern_obj; /* ext acl pieces */
+ uint32_t z_acl_count; /* Number of ACEs */
+ uint16_t z_acl_version; /* acl version */
+ uint16_t z_acl_pad; /* pad */
+ ace_t z_ace_data[ACE_SLOT_CNT]; /* 6 standard ACEs */
+} zfs_znode_acl_t;
+
+#define ACL_DATA_ALLOCED 0x1
+
+/*
+ * Max ACL size is prepended deny for all entries + the
+ * canonical six tacked on * the end.
+ */
+#define MAX_ACL_SIZE (MAX_ACL_ENTRIES * 2 + 6)
+
+typedef struct zfs_acl {
+ int z_slots; /* number of allocated slots for ACEs */
+ int z_acl_count;
+ uint_t z_state;
+ ace_t *z_acl;
+} zfs_acl_t;
+
+#define ZFS_ACL_SIZE(aclcnt) (sizeof (ace_t) * (aclcnt))
+
+/*
+ * Property values for acl_mode and acl_inherit.
+ *
+ * acl_mode can take discard, noallow, groupmask and passthrough.
+ * whereas acl_inherit has secure instead of groupmask.
+ */
+
+#define ZFS_ACL_DISCARD 0
+#define ZFS_ACL_NOALLOW 1
+#define ZFS_ACL_GROUPMASK 2
+#define ZFS_ACL_PASSTHROUGH 3
+#define ZFS_ACL_SECURE 4
+
+struct znode;
+
+#ifdef _KERNEL
+void zfs_perm_init(struct znode *, struct znode *, int, vattr_t *,
+ dmu_tx_t *, cred_t *);
+#ifdef TODO
+int zfs_getacl(struct znode *, vsecattr_t *, cred_t *);
+#endif
+int zfs_mode_update(struct znode *, uint64_t, dmu_tx_t *);
+#ifdef TODO
+int zfs_setacl(struct znode *, vsecattr_t *, cred_t *);
+#endif
+void zfs_acl_rele(void *);
+void zfs_ace_byteswap(ace_t *, int);
+extern int zfs_zaccess(struct znode *, int, cred_t *);
+extern int zfs_zaccess_rwx(struct znode *, mode_t, cred_t *);
+extern int zfs_acl_access(struct znode *, int, cred_t *);
+int zfs_acl_chmod_setattr(struct znode *, uint64_t, dmu_tx_t *);
+int zfs_zaccess_delete(struct znode *, struct znode *, cred_t *);
+int zfs_zaccess_rename(struct znode *, struct znode *,
+ struct znode *, struct znode *, cred_t *cr);
+int zfs_zaccess_v4_perm(struct znode *, int, cred_t *);
+void zfs_acl_free(zfs_acl_t *);
+
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !ZFS_NO_ACL */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_context.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_context.h
new file mode 100644
index 0000000..4deeb3c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_context.h
@@ -0,0 +1,120 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZFS_CONTEXT_H
+#define _SYS_ZFS_CONTEXT_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/param.h>
+#include <sys/stdint.h>
+#include <sys/note.h>
+#include <sys/kernel.h>
+#include <sys/debug.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/sysmacros.h>
+#include <sys/bitmap.h>
+#include <sys/cmn_err.h>
+#include <sys/kmem.h>
+#include <sys/taskq.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/mutex.h>
+#include <sys/rwlock.h>
+#include <sys/random.h>
+#include <sys/byteorder.h>
+#include <sys/systm.h>
+#include <sys/list.h>
+#include <sys/uio.h>
+#include <sys/dirent.h>
+#include <sys/time.h>
+#include <sys/uio.h>
+#include <sys/fcntl.h>
+#include <sys/limits.h>
+#include <sys/string.h>
+#include <sys/bio.h>
+#include <sys/buf.h>
+#include <sys/cred.h>
+#include <sys/sdt.h>
+#include <sys/file.h>
+#include <sys/vfs.h>
+#include <sys/sysctl.h>
+#include <sys/sbuf.h>
+#include <sys/priv.h>
+#include <sys/kdb.h>
+#include <sys/ktr.h>
+#include <sys/stack.h>
+#include <sys/lockf.h>
+#include <sys/policy.h>
+#include <sys/zone.h>
+#include <sys/eventhandler.h>
+#include <sys/misc.h>
+#include <sys/zfs_debug.h>
+
+#include <machine/stdarg.h>
+
+#include <vm/vm.h>
+#include <vm/vm_page.h>
+#include <vm/vm_object.h>
+#include <vm/vm_pager.h>
+#include <vm/vm_kern.h>
+#include <vm/vm_map.h>
+/* There is clash. vm_map.h defines the two below and vdev_cache.c use them. */
+#ifdef min_offset
+#undef min_offset
+#endif
+#ifdef max_offset
+#undef max_offset
+#endif
+#include <vm/vm_extern.h>
+#include <vm/vnode_pager.h>
+
+#define CPU_SEQID (curcpu)
+
+#ifdef __cplusplus
+}
+#endif
+
+extern int zfs_debug_level;
+extern struct mtx zfs_debug_mtx;
+#define ZFS_LOG(lvl, ...) do { \
+ if (((lvl) & 0xff) <= zfs_debug_level) { \
+ mtx_lock(&zfs_debug_mtx); \
+ printf("%s:%u[%d]: ", __func__, __LINE__, (lvl)); \
+ printf(__VA_ARGS__); \
+ printf("\n"); \
+ if ((lvl) & 0x100) \
+ kdb_backtrace(); \
+ mtx_unlock(&zfs_debug_mtx); \
+ } \
+} while (0)
+
+#endif /* _SYS_ZFS_CONTEXT_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ctldir.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ctldir.h
new file mode 100644
index 0000000..a676533
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ctldir.h
@@ -0,0 +1,71 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _ZFS_CTLDIR_H
+#define _ZFS_CTLDIR_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/vnode.h>
+#include <sys/zfs_vfsops.h>
+#include <sys/zfs_znode.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZFS_CTLDIR_NAME ".zfs"
+
+#define zfs_has_ctldir(zdp) \
+ ((zdp)->z_id == (zdp)->z_zfsvfs->z_root && \
+ ((zdp)->z_zfsvfs->z_ctldir != NULL))
+#define zfs_show_ctldir(zdp) \
+ (zfs_has_ctldir(zdp) && \
+ ((zdp)->z_zfsvfs->z_show_ctldir))
+
+void zfsctl_create(zfsvfs_t *);
+void zfsctl_destroy(zfsvfs_t *);
+vnode_t *zfsctl_root(znode_t *);
+void zfsctl_init(void);
+void zfsctl_fini(void);
+
+int zfsctl_rename_snapshot(const char *from, const char *to);
+int zfsctl_destroy_snapshot(const char *snapname, int force);
+int zfsctl_umount_snapshots(vfs_t *, int, cred_t *);
+
+int zfsctl_root_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, pathname_t *pnp,
+ int flags, vnode_t *rdir, cred_t *cr);
+
+int zfsctl_lookup_objset(vfs_t *vfsp, uint64_t objsetid, zfsvfs_t **zfsvfsp);
+
+#define ZFSCTL_INO_ROOT 0x1
+#define ZFSCTL_INO_SNAPDIR 0x2
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZFS_CTLDIR_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_debug.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_debug.h
new file mode 100644
index 0000000..450ac1c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_debug.h
@@ -0,0 +1,75 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZFS_DEBUG_H
+#define _SYS_ZFS_DEBUG_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef TRUE
+#define TRUE 1
+#endif
+
+#ifndef FALSE
+#define FALSE 0
+#endif
+
+/*
+ * ZFS debugging
+ */
+
+#if defined(DEBUG) || !defined(_KERNEL)
+#define ZFS_DEBUG
+#endif
+
+extern int zfs_flags;
+
+#define ZFS_DEBUG_DPRINTF 0x0001
+#define ZFS_DEBUG_DBUF_VERIFY 0x0002
+#define ZFS_DEBUG_DNODE_VERIFY 0x0004
+#define ZFS_DEBUG_SNAPNAMES 0x0008
+#define ZFS_DEBUG_MODIFY 0x0010
+
+#ifdef ZFS_DEBUG
+extern void __dprintf(const char *file, const char *func,
+ int line, const char *fmt, ...);
+#define dprintf(...) \
+ if (zfs_flags & ZFS_DEBUG_DPRINTF) \
+ __dprintf(__FILE__, __func__, __LINE__, __VA_ARGS__)
+#else
+#define dprintf(...) ((void)0)
+#endif /* ZFS_DEBUG */
+
+extern void zfs_panic_recover(const char *fmt, ...);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ZFS_DEBUG_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_dir.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_dir.h
new file mode 100644
index 0000000..f60d614
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_dir.h
@@ -0,0 +1,71 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_FS_ZFS_DIR_H
+#define _SYS_FS_ZFS_DIR_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/dmu.h>
+#include <sys/zfs_znode.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* zfs_dirent_lock() flags */
+#define ZNEW 0x0001 /* entry should not exist */
+#define ZEXISTS 0x0002 /* entry should exist */
+#define ZSHARED 0x0004 /* shared access (zfs_dirlook()) */
+#define ZXATTR 0x0008 /* we want the xattr dir */
+#define ZRENAMING 0x0010 /* znode is being renamed */
+
+/* mknode flags */
+#define IS_ROOT_NODE 0x01 /* create a root node */
+#define IS_XATTR 0x02 /* create an extended attribute node */
+#define IS_REPLAY 0x04 /* we are replaying intent log */
+
+extern int zfs_dirent_lock(zfs_dirlock_t **, znode_t *, char *, znode_t **,
+ int);
+extern void zfs_dirent_unlock(zfs_dirlock_t *);
+extern int zfs_link_create(zfs_dirlock_t *, znode_t *, dmu_tx_t *, int);
+extern int zfs_link_destroy(zfs_dirlock_t *, znode_t *, dmu_tx_t *, int,
+ boolean_t *);
+extern int zfs_dirlook(znode_t *, char *, vnode_t **);
+extern void zfs_mknode(znode_t *, vattr_t *, uint64_t *,
+ dmu_tx_t *, cred_t *, uint_t, znode_t **, int);
+extern void zfs_rmnode(znode_t *);
+extern boolean_t zfs_dirempty(znode_t *);
+extern void zfs_unlinked_add(znode_t *, dmu_tx_t *);
+extern void zfs_unlinked_drain(zfsvfs_t *zfsvfs);
+extern int zfs_sticky_remove_access(znode_t *, znode_t *, cred_t *cr);
+extern int zfs_get_xattrdir(znode_t *, vnode_t **, cred_t *, int);
+extern int zfs_make_xattrdir(znode_t *, vattr_t *, vnode_t **, cred_t *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_FS_ZFS_DIR_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h
new file mode 100644
index 0000000..61a0a9e
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_ioctl.h
@@ -0,0 +1,163 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZFS_IOCTL_H
+#define _SYS_ZFS_IOCTL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/cred.h>
+#include <sys/dmu.h>
+#include <sys/zio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Property values for snapdir
+ */
+#define ZFS_SNAPDIR_HIDDEN 0
+#define ZFS_SNAPDIR_VISIBLE 1
+
+#define DMU_BACKUP_VERSION (1ULL)
+#define DMU_BACKUP_MAGIC 0x2F5bacbacULL
+
+/*
+ * zfs ioctl command structure
+ */
+typedef struct dmu_replay_record {
+ enum {
+ DRR_BEGIN, DRR_OBJECT, DRR_FREEOBJECTS,
+ DRR_WRITE, DRR_FREE, DRR_END,
+ } drr_type;
+ uint32_t drr_pad;
+ union {
+ struct drr_begin {
+ uint64_t drr_magic;
+ uint64_t drr_version;
+ uint64_t drr_creation_time;
+ dmu_objset_type_t drr_type;
+ uint32_t drr_pad;
+ uint64_t drr_toguid;
+ uint64_t drr_fromguid;
+ char drr_toname[MAXNAMELEN];
+ } drr_begin;
+ struct drr_end {
+ zio_cksum_t drr_checksum;
+ } drr_end;
+ struct drr_object {
+ uint64_t drr_object;
+ dmu_object_type_t drr_type;
+ dmu_object_type_t drr_bonustype;
+ uint32_t drr_blksz;
+ uint32_t drr_bonuslen;
+ uint8_t drr_checksum;
+ uint8_t drr_compress;
+ uint8_t drr_pad[6];
+ /* bonus content follows */
+ } drr_object;
+ struct drr_freeobjects {
+ uint64_t drr_firstobj;
+ uint64_t drr_numobjs;
+ } drr_freeobjects;
+ struct drr_write {
+ uint64_t drr_object;
+ dmu_object_type_t drr_type;
+ uint32_t drr_pad;
+ uint64_t drr_offset;
+ uint64_t drr_length;
+ /* content follows */
+ } drr_write;
+ struct drr_free {
+ uint64_t drr_object;
+ uint64_t drr_offset;
+ uint64_t drr_length;
+ } drr_free;
+ } drr_u;
+} dmu_replay_record_t;
+
+typedef struct zinject_record {
+ uint64_t zi_objset;
+ uint64_t zi_object;
+ uint64_t zi_start;
+ uint64_t zi_end;
+ uint64_t zi_guid;
+ uint32_t zi_level;
+ uint32_t zi_error;
+ uint64_t zi_type;
+ uint32_t zi_freq;
+} zinject_record_t;
+
+#define ZINJECT_NULL 0x1
+#define ZINJECT_FLUSH_ARC 0x2
+#define ZINJECT_UNLOAD_SPA 0x4
+
+typedef struct zfs_cmd {
+ char zc_name[MAXPATHLEN];
+ char zc_value[MAXPATHLEN * 2];
+ uint64_t zc_guid;
+ uint64_t zc_nvlist_src; /* really (char *) */
+ uint64_t zc_nvlist_src_size;
+ uint64_t zc_nvlist_dst; /* really (char *) */
+ uint64_t zc_nvlist_dst_size;
+ uint64_t zc_cookie;
+ uint64_t zc_cred;
+ uint64_t zc_dev;
+ uint64_t zc_objset_type;
+ uint64_t zc_history; /* really (char *) */
+ uint64_t zc_history_len;
+ uint64_t zc_history_offset;
+ uint64_t zc_obj;
+ uint64_t zc_jailid;
+ dmu_objset_stats_t zc_objset_stats;
+ struct drr_begin zc_begin_record;
+ zinject_record_t zc_inject_record;
+} zfs_cmd_t;
+
+#ifdef _KERNEL
+typedef struct zfs_create_data {
+ cred_t *zc_cred;
+ dev_t zc_dev;
+ nvlist_t *zc_props;
+} zfs_create_data_t;
+#endif
+
+#define ZVOL_MAX_MINOR (1 << 16)
+#define ZFS_MIN_MINOR (ZVOL_MAX_MINOR + 1)
+
+#ifdef _KERNEL
+
+extern int zfs_secpolicy_write(const char *dataset, cred_t *cr);
+extern int zfs_busy(void);
+extern int zfs_unmount_snap(char *, void *);
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ZFS_IOCTL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_rlock.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_rlock.h
new file mode 100644
index 0000000..f302b66
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_rlock.h
@@ -0,0 +1,89 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_FS_ZFS_RLOCK_H
+#define _SYS_FS_ZFS_RLOCK_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _KERNEL
+
+#include <sys/zfs_znode.h>
+
+typedef enum {
+ RL_READER,
+ RL_WRITER,
+ RL_APPEND
+} rl_type_t;
+
+typedef struct rl {
+ znode_t *r_zp; /* znode this lock applies to */
+ avl_node_t r_node; /* avl node link */
+ uint64_t r_off; /* file range offset */
+ uint64_t r_len; /* file range length */
+ uint_t r_cnt; /* range reference count in tree */
+ rl_type_t r_type; /* range type */
+ kcondvar_t r_wr_cv; /* cv for waiting writers */
+ kcondvar_t r_rd_cv; /* cv for waiting readers */
+ uint8_t r_proxy; /* acting for original range */
+ uint8_t r_write_wanted; /* writer wants to lock this range */
+ uint8_t r_read_wanted; /* reader wants to lock this range */
+} rl_t;
+
+/*
+ * Lock a range (offset, length) as either shared (READER)
+ * or exclusive (WRITER or APPEND). APPEND is a special type that
+ * is converted to WRITER that specified to lock from the start of the
+ * end of file. zfs_range_lock() returns the range lock structure.
+ */
+rl_t *zfs_range_lock(znode_t *zp, uint64_t off, uint64_t len, rl_type_t type);
+
+/*
+ * Unlock range and destroy range lock structure.
+ */
+void zfs_range_unlock(rl_t *rl);
+
+/*
+ * Reduce range locked as RW_WRITER from whole file to specified range.
+ * Asserts the whole file was previously locked.
+ */
+void zfs_range_reduce(rl_t *rl, uint64_t off, uint64_t len);
+
+/*
+ * AVL comparison function used to compare range locks
+ */
+int zfs_range_compare(const void *arg1, const void *arg2);
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_FS_ZFS_RLOCK_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h
new file mode 100644
index 0000000..aa82cc1
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_vfsops.h
@@ -0,0 +1,100 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_FS_ZFS_VFSOPS_H
+#define _SYS_FS_ZFS_VFSOPS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/list.h>
+#include <sys/vfs.h>
+#include <sys/zil.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct zfsvfs zfsvfs_t;
+
+struct zfsvfs {
+ vfs_t *z_vfs; /* generic fs struct */
+ zfsvfs_t *z_parent; /* parent fs */
+ objset_t *z_os; /* objset reference */
+ uint64_t z_root; /* id of root znode */
+ uint64_t z_unlinkedobj; /* id of unlinked zapobj */
+ uint64_t z_max_blksz; /* maximum block size for files */
+ uint64_t z_assign; /* TXG_NOWAIT or set by zil_replay() */
+ zilog_t *z_log; /* intent log pointer */
+ uint_t z_acl_mode; /* acl chmod/mode behavior */
+ uint_t z_acl_inherit; /* acl inheritance behavior */
+ boolean_t z_atime; /* enable atimes mount option */
+ boolean_t z_unmounted1; /* unmounted phase 1 */
+ boolean_t z_unmounted2; /* unmounted phase 2 */
+ uint32_t z_op_cnt; /* vnode/vfs operations ref count */
+ krwlock_t z_um_lock; /* rw lock for umount phase 2 */
+ list_t z_all_znodes; /* all vnodes in the fs */
+ kmutex_t z_znodes_lock; /* lock for z_all_znodes */
+ vnode_t *z_ctldir; /* .zfs directory pointer */
+ boolean_t z_show_ctldir; /* expose .zfs in the root dir */
+ boolean_t z_issnap; /* true if this is a snapshot */
+#define ZFS_OBJ_MTX_SZ 64
+ kmutex_t z_hold_mtx[ZFS_OBJ_MTX_SZ]; /* znode hold locks */
+};
+
+/*
+ * The total file ID size is limited to 12 bytes (including the length
+ * field) in the NFSv2 protocol. For historical reasons, this same limit
+ * is currently being imposed by the Solaris NFSv3 implementation...
+ * although the protocol actually permits a maximum of 64 bytes. It will
+ * not be possible to expand beyond 12 bytes without abandoning support
+ * of NFSv2 and making some changes to the Solaris NFSv3 implementation.
+ *
+ * For the time being, we will partition up the available space as follows:
+ * 2 bytes fid length (required)
+ * 6 bytes object number (48 bits)
+ * 4 bytes generation number (32 bits)
+ * We reserve only 48 bits for the object number, as this is the limit
+ * currently defined and imposed by the DMU.
+ */
+typedef struct zfid_short {
+ uint16_t zf_len;
+ uint8_t zf_object[6]; /* obj[i] = obj >> (8 * i) */
+ uint8_t zf_gen[4]; /* gen[i] = gen >> (8 * i) */
+} zfid_short_t;
+
+typedef struct zfid_long {
+ zfid_short_t z_fid;
+ uint8_t zf_setid[6]; /* obj[i] = obj >> (8 * i) */
+ uint8_t zf_setgen[2]; /* gen[i] = gen >> (8 * i) */
+} zfid_long_t;
+
+#define SHORT_FID_LEN (sizeof (zfid_short_t) - sizeof (uint16_t))
+#define LONG_FID_LEN (sizeof (zfid_long_t) - sizeof (uint16_t))
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_FS_ZFS_VFSOPS_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h
new file mode 100644
index 0000000..c9c317e
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zfs_znode.h
@@ -0,0 +1,298 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_FS_ZFS_ZNODE_H
+#define _SYS_FS_ZFS_ZNODE_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef _KERNEL
+#include <sys/list.h>
+#include <sys/dmu.h>
+#include <sys/zfs_vfsops.h>
+#endif
+#include <sys/zfs_acl.h>
+#include <sys/zil.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Define special zfs pflags
+ */
+#define ZFS_XATTR 0x1 /* is an extended attribute */
+#define ZFS_INHERIT_ACE 0x2 /* ace has inheritable ACEs */
+#define ZFS_ACL_TRIVIAL 0x4 /* files ACL is trivial */
+
+#define MASTER_NODE_OBJ 1
+
+/*
+ * special attributes for master node.
+ */
+
+#define ZFS_FSID "FSID"
+#define ZFS_UNLINKED_SET "DELETE_QUEUE"
+#define ZFS_ROOT_OBJ "ROOT"
+#define ZPL_VERSION_OBJ "VERSION"
+#define ZFS_PROP_BLOCKPERPAGE "BLOCKPERPAGE"
+#define ZFS_PROP_NOGROWBLOCKS "NOGROWBLOCKS"
+
+#define ZFS_FLAG_BLOCKPERPAGE 0x1
+#define ZFS_FLAG_NOGROWBLOCKS 0x2
+
+/*
+ * ZPL version - rev'd whenever an incompatible on-disk format change
+ * occurs. Independent of SPA/DMU/ZAP versioning.
+ */
+
+#define ZPL_VERSION 1ULL
+
+#define ZFS_MAX_BLOCKSIZE (SPA_MAXBLOCKSIZE)
+
+/* Path component length */
+/*
+ * The generic fs code uses MAXNAMELEN to represent
+ * what the largest component length is. Unfortunately,
+ * this length includes the terminating NULL. ZFS needs
+ * to tell the users via pathconf() and statvfs() what the
+ * true maximum length of a component is, excluding the NULL.
+ */
+#define ZFS_MAXNAMELEN (MAXNAMELEN - 1)
+
+/*
+ * The directory entry has the type (currently unused on Solaris) in the
+ * top 4 bits, and the object number in the low 48 bits. The "middle"
+ * 12 bits are unused.
+ */
+#define ZFS_DIRENT_TYPE(de) BF64_GET(de, 60, 4)
+#define ZFS_DIRENT_OBJ(de) BF64_GET(de, 0, 48)
+#define ZFS_DIRENT_MAKE(type, obj) (((uint64_t)type << 60) | obj)
+
+
+/*
+ * This is the persistent portion of the znode. It is stored
+ * in the "bonus buffer" of the file. Short symbolic links
+ * are also stored in the bonus buffer.
+ */
+typedef struct znode_phys {
+ uint64_t zp_atime[2]; /* 0 - last file access time */
+ uint64_t zp_mtime[2]; /* 16 - last file modification time */
+ uint64_t zp_ctime[2]; /* 32 - last file change time */
+ uint64_t zp_crtime[2]; /* 48 - creation time */
+ uint64_t zp_gen; /* 64 - generation (txg of creation) */
+ uint64_t zp_mode; /* 72 - file mode bits */
+ uint64_t zp_size; /* 80 - size of file */
+ uint64_t zp_parent; /* 88 - directory parent (`..') */
+ uint64_t zp_links; /* 96 - number of links to file */
+ uint64_t zp_xattr; /* 104 - DMU object for xattrs */
+ uint64_t zp_rdev; /* 112 - dev_t for VBLK & VCHR files */
+ uint64_t zp_flags; /* 120 - persistent flags */
+ uint64_t zp_uid; /* 128 - file owner */
+ uint64_t zp_gid; /* 136 - owning group */
+ uint64_t zp_pad[4]; /* 144 - future */
+ zfs_znode_acl_t zp_acl; /* 176 - 263 ACL */
+ /*
+ * Data may pad out any remaining bytes in the znode buffer, eg:
+ *
+ * |<---------------------- dnode_phys (512) ------------------------>|
+ * |<-- dnode (192) --->|<----------- "bonus" buffer (320) ---------->|
+ * |<---- znode (264) ---->|<---- data (56) ---->|
+ *
+ * At present, we only use this space to store symbolic links.
+ */
+} znode_phys_t;
+
+/*
+ * Directory entry locks control access to directory entries.
+ * They are used to protect creates, deletes, and renames.
+ * Each directory znode has a mutex and a list of locked names.
+ */
+#ifdef _KERNEL
+typedef struct zfs_dirlock {
+ char *dl_name; /* directory entry being locked */
+ uint32_t dl_sharecnt; /* 0 if exclusive, > 0 if shared */
+ uint16_t dl_namesize; /* set if dl_name was allocated */
+ kcondvar_t dl_cv; /* wait for entry to be unlocked */
+ struct znode *dl_dzp; /* directory znode */
+ struct zfs_dirlock *dl_next; /* next in z_dirlocks list */
+} zfs_dirlock_t;
+
+typedef struct znode {
+ struct zfsvfs *z_zfsvfs;
+ vnode_t *z_vnode;
+ uint64_t z_id; /* object ID for this znode */
+ kmutex_t z_lock; /* znode modification lock */
+ krwlock_t z_map_lock; /* page map lock */
+ krwlock_t z_parent_lock; /* parent lock for directories */
+ krwlock_t z_name_lock; /* "master" lock for dirent locks */
+ zfs_dirlock_t *z_dirlocks; /* directory entry lock list */
+ kmutex_t z_range_lock; /* protects changes to z_range_avl */
+ avl_tree_t z_range_avl; /* avl tree of file range locks */
+ uint8_t z_unlinked; /* file has been unlinked */
+ uint8_t z_atime_dirty; /* atime needs to be synced */
+ uint8_t z_dbuf_held; /* Is z_dbuf already held? */
+ uint8_t z_zn_prefetch; /* Prefetch znodes? */
+ uint_t z_blksz; /* block size in bytes */
+ uint_t z_seq; /* modification sequence number */
+ uint64_t z_mapcnt; /* number of pages mapped to file */
+ uint64_t z_last_itx; /* last ZIL itx on this znode */
+ uint32_t z_sync_cnt; /* synchronous open count */
+ kmutex_t z_acl_lock; /* acl data lock */
+ list_node_t z_link_node; /* all znodes in fs link */
+ struct lockf *z_lockf; /* Head of byte-level lock list. */
+ /*
+ * These are dmu managed fields.
+ */
+ znode_phys_t *z_phys; /* pointer to persistent znode */
+ dmu_buf_t *z_dbuf; /* buffer containing the z_phys */
+} znode_t;
+
+
+/*
+ * Range locking rules
+ * --------------------
+ * 1. When truncating a file (zfs_create, zfs_setattr, zfs_space) the whole
+ * file range needs to be locked as RL_WRITER. Only then can the pages be
+ * freed etc and zp_size reset. zp_size must be set within range lock.
+ * 2. For writes and punching holes (zfs_write & zfs_space) just the range
+ * being written or freed needs to be locked as RL_WRITER.
+ * Multiple writes at the end of the file must coordinate zp_size updates
+ * to ensure data isn't lost. A compare and swap loop is currently used
+ * to ensure the file size is at least the offset last written.
+ * 3. For reads (zfs_read, zfs_get_data & zfs_putapage) just the range being
+ * read needs to be locked as RL_READER. A check against zp_size can then
+ * be made for reading beyond end of file.
+ */
+
+/*
+ * Convert between znode pointers and vnode pointers
+ */
+#define ZTOV(ZP) ((ZP)->z_vnode)
+#define VTOZ(VP) ((znode_t *)(VP)->v_data)
+
+/*
+ * ZFS_ENTER() is called on entry to each ZFS vnode and vfs operation.
+ * ZFS_EXIT() must be called before exitting the vop.
+ */
+#define ZFS_ENTER(zfsvfs) \
+ { \
+ atomic_add_32(&(zfsvfs)->z_op_cnt, 1); \
+ if ((zfsvfs)->z_unmounted1) { \
+ ZFS_EXIT(zfsvfs); \
+ return (EIO); \
+ } \
+ }
+#define ZFS_EXIT(zfsvfs) atomic_add_32(&(zfsvfs)->z_op_cnt, -1)
+
+/*
+ * Macros for dealing with dmu_buf_hold
+ */
+#define ZFS_OBJ_HASH(obj_num) (obj_num & (ZFS_OBJ_MTX_SZ - 1))
+#define ZFS_OBJ_MUTEX(zp) \
+ (&zp->z_zfsvfs->z_hold_mtx[ZFS_OBJ_HASH(zp->z_id)])
+#define ZFS_OBJ_HOLD_ENTER(zfsvfs, obj_num) \
+ mutex_enter(&zfsvfs->z_hold_mtx[ZFS_OBJ_HASH(obj_num)]);
+
+#define ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num) \
+ mutex_exit(&zfsvfs->z_hold_mtx[ZFS_OBJ_HASH(obj_num)])
+
+/*
+ * Macros to encode/decode ZFS stored time values from/to struct timespec
+ */
+#define ZFS_TIME_ENCODE(tp, stmp) \
+{ \
+ stmp[0] = (uint64_t)(tp)->tv_sec; \
+ stmp[1] = (uint64_t)(tp)->tv_nsec; \
+}
+
+#define ZFS_TIME_DECODE(tp, stmp) \
+{ \
+ (tp)->tv_sec = (time_t)stmp[0]; \
+ (tp)->tv_nsec = (long)stmp[1]; \
+}
+
+/*
+ * Timestamp defines
+ */
+#define ACCESSED (AT_ATIME)
+#define STATE_CHANGED (AT_CTIME)
+#define CONTENT_MODIFIED (AT_MTIME | AT_CTIME)
+
+#define ZFS_ACCESSTIME_STAMP(zfsvfs, zp) \
+ if ((zfsvfs)->z_atime && !((zfsvfs)->z_vfs->vfs_flag & VFS_RDONLY)) \
+ zfs_time_stamper(zp, ACCESSED, NULL)
+
+extern int zfs_init_fs(zfsvfs_t *, znode_t **, cred_t *);
+extern void zfs_set_dataprop(objset_t *);
+extern void zfs_create_fs(objset_t *os, cred_t *cr, dmu_tx_t *tx);
+extern void zfs_time_stamper(znode_t *, uint_t, dmu_tx_t *);
+extern void zfs_time_stamper_locked(znode_t *, uint_t, dmu_tx_t *);
+extern void zfs_grow_blocksize(znode_t *, uint64_t, dmu_tx_t *);
+extern int zfs_freesp(znode_t *, uint64_t, uint64_t, int, boolean_t);
+extern void zfs_znode_init(void);
+extern void zfs_znode_fini(void);
+extern int zfs_zget(zfsvfs_t *, uint64_t, znode_t **);
+extern void zfs_zinactive(znode_t *);
+extern void zfs_znode_delete(znode_t *, dmu_tx_t *);
+extern void zfs_znode_free(znode_t *);
+extern void zfs_remove_op_tables();
+extern int zfs_create_op_tables();
+extern dev_t zfs_cmpldev(uint64_t);
+
+extern void zfs_log_create(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *dzp, znode_t *zp, char *name);
+extern void zfs_log_remove(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *dzp, char *name);
+extern void zfs_log_link(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *dzp, znode_t *zp, char *name);
+extern void zfs_log_symlink(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *dzp, znode_t *zp, char *name, char *link);
+extern void zfs_log_rename(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *sdzp, char *sname, znode_t *tdzp, char *dname, znode_t *szp);
+extern void zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *zp, offset_t off, ssize_t len, int ioflag);
+extern void zfs_log_truncate(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *zp, uint64_t off, uint64_t len);
+extern void zfs_log_setattr(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *zp, vattr_t *vap, uint_t mask_applied);
+#ifndef ZFS_NO_ACL
+extern void zfs_log_acl(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *zp, int aclcnt, ace_t *z_ace);
+#endif
+
+extern zil_get_data_t zfs_get_data;
+extern zil_replay_func_t *zfs_replay_vector[TX_MAX_TYPE];
+extern int zfsfstype;
+
+#endif /* _KERNEL */
+
+extern int zfs_obj_to_path(objset_t *osp, uint64_t obj, char *buf, int len);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_FS_ZFS_ZNODE_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h
new file mode 100644
index 0000000..947ba9f
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zil.h
@@ -0,0 +1,276 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZIL_H
+#define _SYS_ZIL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/spa.h>
+#include <sys/zio.h>
+#include <sys/dmu.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Intent log format:
+ *
+ * Each objset has its own intent log. The log header (zil_header_t)
+ * for objset N's intent log is kept in the Nth object of the SPA's
+ * intent_log objset. The log header points to a chain of log blocks,
+ * each of which contains log records (i.e., transactions) followed by
+ * a log block trailer (zil_trailer_t). The format of a log record
+ * depends on the record (or transaction) type, but all records begin
+ * with a common structure that defines the type, length, and txg.
+ */
+
+/*
+ * Intent log header - this on disk structure holds fields to manage
+ * the log. All fields are 64 bit to easily handle cross architectures.
+ */
+typedef struct zil_header {
+ uint64_t zh_claim_txg; /* txg in which log blocks were claimed */
+ uint64_t zh_replay_seq; /* highest replayed sequence number */
+ blkptr_t zh_log; /* log chain */
+ uint64_t zh_claim_seq; /* highest claimed sequence number */
+ uint64_t zh_pad[5];
+} zil_header_t;
+
+/*
+ * Log block trailer - structure at the end of the header and each log block
+ *
+ * The zit_bt contains a zbt_cksum which for the intent log is
+ * the sequence number of this log block. A seq of 0 is invalid.
+ * The zbt_cksum is checked by the SPA against the sequence
+ * number passed in the blk_cksum field of the blkptr_t
+ */
+typedef struct zil_trailer {
+ uint64_t zit_pad;
+ blkptr_t zit_next_blk; /* next block in chain */
+ uint64_t zit_nused; /* bytes in log block used */
+ zio_block_tail_t zit_bt; /* block trailer */
+} zil_trailer_t;
+
+#define ZIL_MIN_BLKSZ 4096ULL
+#define ZIL_MAX_BLKSZ SPA_MAXBLOCKSIZE
+#define ZIL_BLK_DATA_SZ(lwb) ((lwb)->lwb_sz - sizeof (zil_trailer_t))
+
+/*
+ * The words of a log block checksum.
+ */
+#define ZIL_ZC_GUID_0 0
+#define ZIL_ZC_GUID_1 1
+#define ZIL_ZC_OBJSET 2
+#define ZIL_ZC_SEQ 3
+
+/*
+ * Intent log transaction types and record structures
+ */
+#define TX_CREATE 1 /* Create file */
+#define TX_MKDIR 2 /* Make directory */
+#define TX_MKXATTR 3 /* Make XATTR directory */
+#define TX_SYMLINK 4 /* Create symbolic link to a file */
+#define TX_REMOVE 5 /* Remove file */
+#define TX_RMDIR 6 /* Remove directory */
+#define TX_LINK 7 /* Create hard link to a file */
+#define TX_RENAME 8 /* Rename a file */
+#define TX_WRITE 9 /* File write */
+#define TX_TRUNCATE 10 /* Truncate a file */
+#define TX_SETATTR 11 /* Set file attributes */
+#define TX_ACL 12 /* Set acl */
+#define TX_MAX_TYPE 13 /* Max transaction type */
+
+/*
+ * Format of log records.
+ * The fields are carefully defined to allow them to be aligned
+ * and sized the same on sparc & intel architectures.
+ * Each log record has a common structure at the beginning.
+ *
+ * Note, lrc_seq holds two different sequence numbers. Whilst in memory
+ * it contains the transaction sequence number. The log record on
+ * disk holds the sequence number of all log records which is used to
+ * ensure we don't replay the same record. The two sequence numbers are
+ * different because the transactions can now be pushed out of order.
+ */
+typedef struct { /* common log record header */
+ uint64_t lrc_txtype; /* intent log transaction type */
+ uint64_t lrc_reclen; /* transaction record length */
+ uint64_t lrc_txg; /* dmu transaction group number */
+ uint64_t lrc_seq; /* see comment above */
+} lr_t;
+
+typedef struct {
+ lr_t lr_common; /* common portion of log record */
+ uint64_t lr_doid; /* object id of directory */
+ uint64_t lr_foid; /* object id of created file object */
+ uint64_t lr_mode; /* mode of object */
+ uint64_t lr_uid; /* uid of object */
+ uint64_t lr_gid; /* gid of object */
+ uint64_t lr_gen; /* generation (txg of creation) */
+ uint64_t lr_crtime[2]; /* creation time */
+ uint64_t lr_rdev; /* rdev of object to create */
+ /* name of object to create follows this */
+ /* for symlinks, link content follows name */
+} lr_create_t;
+
+typedef struct {
+ lr_t lr_common; /* common portion of log record */
+ uint64_t lr_doid; /* obj id of directory */
+ /* name of object to remove follows this */
+} lr_remove_t;
+
+typedef struct {
+ lr_t lr_common; /* common portion of log record */
+ uint64_t lr_doid; /* obj id of directory */
+ uint64_t lr_link_obj; /* obj id of link */
+ /* name of object to link follows this */
+} lr_link_t;
+
+typedef struct {
+ lr_t lr_common; /* common portion of log record */
+ uint64_t lr_sdoid; /* obj id of source directory */
+ uint64_t lr_tdoid; /* obj id of target directory */
+ /* 2 strings: names of source and destination follow this */
+} lr_rename_t;
+
+typedef struct {
+ lr_t lr_common; /* common portion of log record */
+ uint64_t lr_foid; /* file object to write */
+ uint64_t lr_offset; /* offset to write to */
+ uint64_t lr_length; /* user data length to write */
+ uint64_t lr_blkoff; /* offset represented by lr_blkptr */
+ blkptr_t lr_blkptr; /* spa block pointer for replay */
+ /* write data will follow for small writes */
+} lr_write_t;
+
+typedef struct {
+ lr_t lr_common; /* common portion of log record */
+ uint64_t lr_foid; /* object id of file to truncate */
+ uint64_t lr_offset; /* offset to truncate from */
+ uint64_t lr_length; /* length to truncate */
+} lr_truncate_t;
+
+typedef struct {
+ lr_t lr_common; /* common portion of log record */
+ uint64_t lr_foid; /* file object to change attributes */
+ uint64_t lr_mask; /* mask of attributes to set */
+ uint64_t lr_mode; /* mode to set */
+ uint64_t lr_uid; /* uid to set */
+ uint64_t lr_gid; /* gid to set */
+ uint64_t lr_size; /* size to set */
+ uint64_t lr_atime[2]; /* access time */
+ uint64_t lr_mtime[2]; /* modification time */
+} lr_setattr_t;
+
+typedef struct {
+ lr_t lr_common; /* common portion of log record */
+ uint64_t lr_foid; /* obj id of file */
+ uint64_t lr_aclcnt; /* number of acl entries */
+ /* lr_aclcnt number of ace_t entries follow this */
+} lr_acl_t;
+
+/*
+ * ZIL structure definitions, interface function prototype and globals.
+ */
+
+/*
+ * ZFS intent log transaction structure
+ */
+typedef enum {
+ WR_INDIRECT, /* indirect - a large write (dmu_sync() data */
+ /* and put blkptr in log, rather than actual data) */
+ WR_COPIED, /* immediate - data is copied into lr_write_t */
+ WR_NEED_COPY, /* immediate - data needs to be copied if pushed */
+} itx_wr_state_t;
+
+typedef struct itx {
+ list_node_t itx_node; /* linkage on zl_itx_list */
+ void *itx_private; /* type-specific opaque data */
+ itx_wr_state_t itx_wr_state; /* write state */
+ uint8_t itx_sync; /* synchronous transaction */
+ lr_t itx_lr; /* common part of log record */
+ /* followed by type-specific part of lr_xx_t and its immediate data */
+} itx_t;
+
+
+/*
+ * zgd_t is passed through dmu_sync() to the callback routine zfs_get_done()
+ * to handle the cleanup of the dmu_sync() buffer write
+ */
+typedef struct {
+ zilog_t *zgd_zilog; /* zilog */
+ blkptr_t *zgd_bp; /* block pointer */
+ struct rl *zgd_rl; /* range lock */
+} zgd_t;
+
+
+typedef void zil_parse_blk_func_t(zilog_t *zilog, blkptr_t *bp, void *arg,
+ uint64_t txg);
+typedef void zil_parse_lr_func_t(zilog_t *zilog, lr_t *lr, void *arg,
+ uint64_t txg);
+typedef int zil_replay_func_t();
+typedef int zil_get_data_t(void *arg, lr_write_t *lr, char *dbuf, zio_t *zio);
+
+extern uint64_t zil_parse(zilog_t *zilog, zil_parse_blk_func_t *parse_blk_func,
+ zil_parse_lr_func_t *parse_lr_func, void *arg, uint64_t txg);
+
+extern void zil_init(void);
+extern void zil_fini(void);
+
+extern zilog_t *zil_alloc(objset_t *os, zil_header_t *zh_phys);
+extern void zil_free(zilog_t *zilog);
+
+extern zilog_t *zil_open(objset_t *os, zil_get_data_t *get_data);
+extern void zil_close(zilog_t *zilog);
+
+extern void zil_replay(objset_t *os, void *arg, uint64_t *txgp,
+ zil_replay_func_t *replay_func[TX_MAX_TYPE]);
+extern void zil_destroy(zilog_t *zilog, boolean_t keep_first);
+
+extern itx_t *zil_itx_create(int txtype, size_t lrsize);
+extern uint64_t zil_itx_assign(zilog_t *zilog, itx_t *itx, dmu_tx_t *tx);
+
+extern void zil_commit(zilog_t *zilog, uint64_t seq, uint64_t oid);
+
+extern int zil_claim(char *osname, void *txarg);
+extern void zil_sync(zilog_t *zilog, dmu_tx_t *tx);
+extern void zil_clean(zilog_t *zilog);
+extern int zil_is_committed(zilog_t *zilog);
+
+extern int zil_suspend(zilog_t *zilog);
+extern void zil_resume(zilog_t *zilog);
+
+extern void zil_add_vdev(zilog_t *zilog, uint64_t vdev);
+
+extern int zil_disable;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ZIL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zil_impl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zil_impl.h
new file mode 100644
index 0000000..3ecf4e4
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zil_impl.h
@@ -0,0 +1,111 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZIL_IMPL_H
+#define _SYS_ZIL_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zil.h>
+#include <sys/dmu_objset.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Log write buffer.
+ */
+typedef struct lwb {
+ zilog_t *lwb_zilog; /* back pointer to log struct */
+ blkptr_t lwb_blk; /* on disk address of this log blk */
+ int lwb_nused; /* # used bytes in buffer */
+ int lwb_sz; /* size of block and buffer */
+ char *lwb_buf; /* log write buffer */
+ zio_t *lwb_zio; /* zio for this buffer */
+ uint64_t lwb_max_txg; /* highest txg in this lwb */
+ txg_handle_t lwb_txgh; /* txg handle for txg_exit() */
+ list_node_t lwb_node; /* zilog->zl_lwb_list linkage */
+} lwb_t;
+
+/*
+ * Vdev flushing: We use a bit map of size ZIL_VDEV_BMAP bytes.
+ * Any vdev numbers beyond that use a linked list of zil_vdev_t structures.
+ */
+
+#define ZIL_VDEV_BMSZ 16 /* 16 * 8 = 128 vdevs */
+typedef struct zil_vdev {
+ uint64_t vdev; /* device written */
+ list_node_t vdev_seq_node; /* zilog->zl_vdev_list linkage */
+} zil_vdev_t;
+
+/*
+ * Stable storage intent log management structure. One per dataset.
+ */
+struct zilog {
+ kmutex_t zl_lock; /* protects most zilog_t fields */
+ struct dsl_pool *zl_dmu_pool; /* DSL pool */
+ spa_t *zl_spa; /* handle for read/write log */
+ const zil_header_t *zl_header; /* log header buffer */
+ objset_t *zl_os; /* object set we're logging */
+ zil_get_data_t *zl_get_data; /* callback to get object content */
+ zio_t *zl_root_zio; /* log writer root zio */
+ uint64_t zl_itx_seq; /* next itx sequence number */
+ uint64_t zl_commit_seq; /* committed upto this number */
+ uint64_t zl_lr_seq; /* log record sequence number */
+ uint64_t zl_destroy_txg; /* txg of last zil_destroy() */
+ uint64_t zl_replay_seq[TXG_SIZE]; /* seq of last replayed rec */
+ uint32_t zl_suspend; /* log suspend count */
+ kcondvar_t zl_cv_writer; /* log writer thread completion */
+ kcondvar_t zl_cv_suspend; /* log suspend completion */
+ uint8_t zl_suspending; /* log is currently suspending */
+ uint8_t zl_keep_first; /* keep first log block in destroy */
+ uint8_t zl_stop_replay; /* don't replay any further */
+ uint8_t zl_stop_sync; /* for debugging */
+ uint8_t zl_writer; /* boolean: write setup in progress */
+ uint8_t zl_log_error; /* boolean: log write error */
+ list_t zl_itx_list; /* in-memory itx list */
+ uint64_t zl_itx_list_sz; /* total size of records on list */
+ uint64_t zl_cur_used; /* current commit log size used */
+ uint64_t zl_prev_used; /* previous commit log size used */
+ list_t zl_lwb_list; /* in-flight log write list */
+ list_t zl_vdev_list; /* list of [vdev, seq] pairs */
+ uint8_t zl_vdev_bmap[ZIL_VDEV_BMSZ]; /* bitmap of vdevs */
+ taskq_t *zl_clean_taskq; /* runs lwb and itx clean tasks */
+ avl_tree_t zl_dva_tree; /* track DVAs during log parse */
+ clock_t zl_replay_time; /* lbolt of when replay started */
+ uint64_t zl_replay_blks; /* number of log blocks replayed */
+};
+
+typedef struct zil_dva_node {
+ dva_t zn_dva;
+ avl_node_t zn_node;
+} zil_dva_node_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ZIL_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
new file mode 100644
index 0000000..b026ae6
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio.h
@@ -0,0 +1,366 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _ZIO_H
+#define _ZIO_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/txg.h>
+#include <sys/avl.h>
+#include <sys/dkio.h>
+#include <sys/fs/zfs.h>
+#include <sys/zio_impl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZBT_MAGIC 0x210da7ab10c7a11ULL /* zio data bloc tail */
+
+typedef struct zio_block_tail {
+ uint64_t zbt_magic; /* for validation, endianness */
+ zio_cksum_t zbt_cksum; /* 256-bit checksum */
+} zio_block_tail_t;
+
+/*
+ * Gang block headers are self-checksumming and contain an array
+ * of block pointers.
+ */
+#define SPA_GANGBLOCKSIZE SPA_MINBLOCKSIZE
+#define SPA_GBH_NBLKPTRS ((SPA_GANGBLOCKSIZE - \
+ sizeof (zio_block_tail_t)) / sizeof (blkptr_t))
+#define SPA_GBH_FILLER ((SPA_GANGBLOCKSIZE - \
+ sizeof (zio_block_tail_t) - \
+ (SPA_GBH_NBLKPTRS * sizeof (blkptr_t))) /\
+ sizeof (uint64_t))
+
+#define ZIO_GET_IOSIZE(zio) \
+ (BP_IS_GANG((zio)->io_bp) ? \
+ SPA_GANGBLOCKSIZE : BP_GET_PSIZE((zio)->io_bp))
+
+typedef struct zio_gbh {
+ blkptr_t zg_blkptr[SPA_GBH_NBLKPTRS];
+ uint64_t zg_filler[SPA_GBH_FILLER];
+ zio_block_tail_t zg_tail;
+} zio_gbh_phys_t;
+
+enum zio_checksum {
+ ZIO_CHECKSUM_INHERIT = 0,
+ ZIO_CHECKSUM_ON,
+ ZIO_CHECKSUM_OFF,
+ ZIO_CHECKSUM_LABEL,
+ ZIO_CHECKSUM_GANG_HEADER,
+ ZIO_CHECKSUM_ZILOG,
+ ZIO_CHECKSUM_FLETCHER_2,
+ ZIO_CHECKSUM_FLETCHER_4,
+ ZIO_CHECKSUM_SHA256,
+ ZIO_CHECKSUM_FUNCTIONS
+};
+
+#define ZIO_CHECKSUM_ON_VALUE ZIO_CHECKSUM_FLETCHER_2
+#define ZIO_CHECKSUM_DEFAULT ZIO_CHECKSUM_ON
+
+enum zio_compress {
+ ZIO_COMPRESS_INHERIT = 0,
+ ZIO_COMPRESS_ON,
+ ZIO_COMPRESS_OFF,
+ ZIO_COMPRESS_LZJB,
+ ZIO_COMPRESS_EMPTY,
+ ZIO_COMPRESS_GZIP_1,
+ ZIO_COMPRESS_GZIP_2,
+ ZIO_COMPRESS_GZIP_3,
+ ZIO_COMPRESS_GZIP_4,
+ ZIO_COMPRESS_GZIP_5,
+ ZIO_COMPRESS_GZIP_6,
+ ZIO_COMPRESS_GZIP_7,
+ ZIO_COMPRESS_GZIP_8,
+ ZIO_COMPRESS_GZIP_9,
+ ZIO_COMPRESS_FUNCTIONS
+};
+
+#define ZIO_COMPRESS_ON_VALUE ZIO_COMPRESS_LZJB
+#define ZIO_COMPRESS_DEFAULT ZIO_COMPRESS_OFF
+
+#define ZIO_PRIORITY_NOW (zio_priority_table[0])
+#define ZIO_PRIORITY_SYNC_READ (zio_priority_table[1])
+#define ZIO_PRIORITY_SYNC_WRITE (zio_priority_table[2])
+#define ZIO_PRIORITY_ASYNC_READ (zio_priority_table[3])
+#define ZIO_PRIORITY_ASYNC_WRITE (zio_priority_table[4])
+#define ZIO_PRIORITY_FREE (zio_priority_table[5])
+#define ZIO_PRIORITY_CACHE_FILL (zio_priority_table[6])
+#define ZIO_PRIORITY_LOG_WRITE (zio_priority_table[7])
+#define ZIO_PRIORITY_RESILVER (zio_priority_table[8])
+#define ZIO_PRIORITY_SCRUB (zio_priority_table[9])
+#define ZIO_PRIORITY_TABLE_SIZE 10
+
+#define ZIO_FLAG_MUSTSUCCEED 0x00000
+#define ZIO_FLAG_CANFAIL 0x00001
+#define ZIO_FLAG_FAILFAST 0x00002
+#define ZIO_FLAG_CONFIG_HELD 0x00004
+#define ZIO_FLAG_CONFIG_GRABBED 0x00008
+
+#define ZIO_FLAG_DONT_CACHE 0x00010
+#define ZIO_FLAG_DONT_QUEUE 0x00020
+#define ZIO_FLAG_DONT_PROPAGATE 0x00040
+#define ZIO_FLAG_DONT_RETRY 0x00080
+
+#define ZIO_FLAG_PHYSICAL 0x00100
+#define ZIO_FLAG_IO_BYPASS 0x00200
+#define ZIO_FLAG_IO_REPAIR 0x00400
+#define ZIO_FLAG_SPECULATIVE 0x00800
+
+#define ZIO_FLAG_RESILVER 0x01000
+#define ZIO_FLAG_SCRUB 0x02000
+#define ZIO_FLAG_SCRUB_THREAD 0x04000
+#define ZIO_FLAG_SUBBLOCK 0x08000
+
+#define ZIO_FLAG_NOBOOKMARK 0x10000
+#define ZIO_FLAG_USER 0x20000
+
+#define ZIO_FLAG_METADATA 0x40000
+
+#define ZIO_FLAG_GANG_INHERIT \
+ (ZIO_FLAG_CANFAIL | \
+ ZIO_FLAG_FAILFAST | \
+ ZIO_FLAG_CONFIG_HELD | \
+ ZIO_FLAG_DONT_RETRY | \
+ ZIO_FLAG_IO_REPAIR | \
+ ZIO_FLAG_SPECULATIVE | \
+ ZIO_FLAG_RESILVER | \
+ ZIO_FLAG_SCRUB | \
+ ZIO_FLAG_SCRUB_THREAD)
+
+#define ZIO_FLAG_VDEV_INHERIT \
+ (ZIO_FLAG_GANG_INHERIT | \
+ ZIO_FLAG_DONT_CACHE | \
+ ZIO_FLAG_PHYSICAL)
+
+/*
+ * We'll take the EILSEQ (Illegal byte sequence) errno
+ * to indicate checksum errors.
+ */
+#define ECKSUM EILSEQ
+
+typedef struct zio zio_t;
+typedef void zio_done_func_t(zio_t *zio);
+
+extern uint8_t zio_priority_table[ZIO_PRIORITY_TABLE_SIZE];
+extern char *zio_type_name[ZIO_TYPES];
+
+/*
+ * A bookmark is a four-tuple <objset, object, level, blkid> that uniquely
+ * identifies any block in the pool. By convention, the meta-objset (MOS)
+ * is objset 0, the meta-dnode is object 0, the root block (osphys_t) is
+ * level -1 of the meta-dnode, and intent log blocks (which are chained
+ * off the root block) have blkid == sequence number. In summary:
+ *
+ * mos is objset 0
+ * meta-dnode is object 0
+ * root block is <objset, 0, -1, 0>
+ * intent log is <objset, 0, -1, ZIL sequence number>
+ *
+ * Note: this structure is called a bookmark because its first purpose was
+ * to remember where to resume a pool-wide traverse. The absolute ordering
+ * for block visitation during traversal is defined in compare_bookmark().
+ *
+ * Note: this structure is passed between userland and the kernel.
+ * Therefore it must not change size or alignment between 32/64 bit
+ * compilation options.
+ */
+typedef struct zbookmark {
+ uint64_t zb_objset;
+ uint64_t zb_object;
+ int64_t zb_level;
+ uint64_t zb_blkid;
+} zbookmark_t;
+
+struct zio {
+ /* Core information about this I/O */
+ zio_t *io_parent;
+ zio_t *io_root;
+ spa_t *io_spa;
+ zbookmark_t io_bookmark;
+ enum zio_checksum io_checksum;
+ enum zio_compress io_compress;
+ int io_ndvas;
+ uint64_t io_txg;
+ blkptr_t *io_bp;
+ blkptr_t io_bp_copy;
+ zio_t *io_child;
+ zio_t *io_sibling_prev;
+ zio_t *io_sibling_next;
+ zio_transform_t *io_transform_stack;
+ zio_t *io_logical;
+
+ /* Callback info */
+ zio_done_func_t *io_ready;
+ zio_done_func_t *io_done;
+ void *io_private;
+ blkptr_t io_bp_orig;
+
+ /* Data represented by this I/O */
+ void *io_data;
+ uint64_t io_size;
+
+ /* Stuff for the vdev stack */
+ vdev_t *io_vd;
+ void *io_vsd;
+ uint64_t io_offset;
+ uint64_t io_deadline;
+ uint64_t io_timestamp;
+ avl_node_t io_offset_node;
+ avl_node_t io_deadline_node;
+ avl_tree_t *io_vdev_tree;
+ zio_t *io_delegate_list;
+ zio_t *io_delegate_next;
+
+ /* Internal pipeline state */
+ int io_flags;
+ enum zio_type io_type;
+ enum zio_stage io_stage;
+ uint8_t io_stalled;
+ uint8_t io_priority;
+ struct dk_callback io_dk_callback;
+ int io_cmd;
+ int io_retries;
+ int io_error;
+ uint32_t io_numerrors;
+ uint32_t io_pipeline;
+ uint32_t io_async_stages;
+ uint64_t io_children_notready;
+ uint64_t io_children_notdone;
+ void *io_waiter;
+ kmutex_t io_lock;
+ kcondvar_t io_cv;
+
+ /* FMA state */
+ uint64_t io_ena;
+};
+
+extern zio_t *zio_null(zio_t *pio, spa_t *spa,
+ zio_done_func_t *done, void *private, int flags);
+
+extern zio_t *zio_root(spa_t *spa,
+ zio_done_func_t *done, void *private, int flags);
+
+extern zio_t *zio_read(zio_t *pio, spa_t *spa, blkptr_t *bp, void *data,
+ uint64_t size, zio_done_func_t *done, void *private,
+ int priority, int flags, zbookmark_t *zb);
+
+extern zio_t *zio_write(zio_t *pio, spa_t *spa, int checksum, int compress,
+ int ncopies, uint64_t txg, blkptr_t *bp, void *data, uint64_t size,
+ zio_done_func_t *ready, zio_done_func_t *done, void *private, int priority,
+ int flags, zbookmark_t *zb);
+
+extern zio_t *zio_rewrite(zio_t *pio, spa_t *spa, int checksum,
+ uint64_t txg, blkptr_t *bp, void *data, uint64_t size,
+ zio_done_func_t *done, void *private, int priority, int flags,
+ zbookmark_t *zb);
+
+extern zio_t *zio_free(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
+ zio_done_func_t *done, void *private);
+
+extern zio_t *zio_claim(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
+ zio_done_func_t *done, void *private);
+
+extern zio_t *zio_ioctl(zio_t *pio, spa_t *spa, vdev_t *vd, int cmd,
+ zio_done_func_t *done, void *private, int priority, int flags);
+
+extern zio_t *zio_read_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
+ uint64_t size, void *data, int checksum,
+ zio_done_func_t *done, void *private, int priority, int flags);
+
+extern zio_t *zio_write_phys(zio_t *pio, vdev_t *vd, uint64_t offset,
+ uint64_t size, void *data, int checksum,
+ zio_done_func_t *done, void *private, int priority, int flags);
+
+extern int zio_alloc_blk(spa_t *spa, uint64_t size, blkptr_t *new_bp,
+ blkptr_t *old_bp, uint64_t txg);
+extern void zio_free_blk(spa_t *spa, blkptr_t *bp, uint64_t txg);
+
+extern int zio_wait(zio_t *zio);
+extern void zio_nowait(zio_t *zio);
+
+extern void *zio_buf_alloc(size_t size);
+extern void zio_buf_free(void *buf, size_t size);
+extern void *zio_data_buf_alloc(size_t size);
+extern void zio_data_buf_free(void *buf, size_t size);
+
+/*
+ * Move an I/O to the next stage of the pipeline and execute that stage.
+ * There's no locking on io_stage because there's no legitimate way for
+ * multiple threads to be attempting to process the same I/O.
+ */
+extern void zio_next_stage(zio_t *zio);
+extern void zio_next_stage_async(zio_t *zio);
+extern void zio_wait_children_done(zio_t *zio);
+
+/*
+ * Delegate I/O to a child vdev.
+ */
+extern zio_t *zio_vdev_child_io(zio_t *zio, blkptr_t *bp, vdev_t *vd,
+ uint64_t offset, void *data, uint64_t size, int type, int priority,
+ int flags, zio_done_func_t *done, void *private);
+
+extern void zio_vdev_io_bypass(zio_t *zio);
+extern void zio_vdev_io_reissue(zio_t *zio);
+extern void zio_vdev_io_redone(zio_t *zio);
+
+extern void zio_checksum_verified(zio_t *zio);
+extern void zio_set_gang_verifier(zio_t *zio, zio_cksum_t *zcp);
+
+extern uint8_t zio_checksum_select(uint8_t child, uint8_t parent);
+extern uint8_t zio_compress_select(uint8_t child, uint8_t parent);
+
+boolean_t zio_should_retry(zio_t *zio);
+
+/*
+ * Initial setup and teardown.
+ */
+extern void zio_init(void);
+extern void zio_fini(void);
+
+/*
+ * Fault injection
+ */
+struct zinject_record;
+extern uint32_t zio_injection_enabled;
+extern int zio_inject_fault(char *name, int flags, int *id,
+ struct zinject_record *record);
+extern int zio_inject_list_next(int *id, char *name, size_t buflen,
+ struct zinject_record *record);
+extern int zio_clear_fault(int id);
+extern int zio_handle_fault_injection(zio_t *zio, int error);
+extern int zio_handle_device_injection(vdev_t *vd, int error);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZIO_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_checksum.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_checksum.h
new file mode 100644
index 0000000..bb7bd41
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_checksum.h
@@ -0,0 +1,75 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZIO_CHECKSUM_H
+#define _SYS_ZIO_CHECKSUM_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Signature for checksum functions.
+ */
+typedef void zio_checksum_t(const void *data, uint64_t size, zio_cksum_t *zcp);
+
+/*
+ * Information about each checksum function.
+ */
+typedef struct zio_checksum_info {
+ zio_checksum_t *ci_func[2]; /* checksum function for each byteorder */
+ int ci_correctable; /* number of correctable bits */
+ int ci_zbt; /* uses zio block tail? */
+ char *ci_name; /* descriptive name */
+} zio_checksum_info_t;
+
+extern zio_checksum_info_t zio_checksum_table[ZIO_CHECKSUM_FUNCTIONS];
+
+/*
+ * Checksum routines.
+ */
+extern zio_checksum_t fletcher_2_native;
+extern zio_checksum_t fletcher_4_native;
+extern zio_checksum_t fletcher_4_incremental_native;
+
+extern zio_checksum_t fletcher_2_byteswap;
+extern zio_checksum_t fletcher_4_byteswap;
+extern zio_checksum_t fletcher_4_incremental_byteswap;
+
+extern zio_checksum_t zio_checksum_SHA256;
+
+extern void zio_checksum(uint_t checksum, zio_cksum_t *zcp,
+ void *data, uint64_t size);
+extern int zio_checksum_error(zio_t *zio);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ZIO_CHECKSUM_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_compress.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_compress.h
new file mode 100644
index 0000000..66ee8d4
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_compress.h
@@ -0,0 +1,82 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZIO_COMPRESS_H
+#define _SYS_ZIO_COMPRESS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Common signature for all zio compress/decompress functions.
+ */
+typedef size_t zio_compress_func_t(void *src, void *dst,
+ size_t s_len, size_t d_len, int);
+typedef int zio_decompress_func_t(void *src, void *dst,
+ size_t s_len, size_t d_len, int);
+
+/*
+ * Information about each compression function.
+ */
+typedef struct zio_compress_info {
+ zio_compress_func_t *ci_compress; /* compression function */
+ zio_decompress_func_t *ci_decompress; /* decompression function */
+ int ci_level; /* level parameter */
+ char *ci_name; /* algorithm name */
+} zio_compress_info_t;
+
+extern zio_compress_info_t zio_compress_table[ZIO_COMPRESS_FUNCTIONS];
+
+/*
+ * Compression routines.
+ */
+extern size_t lzjb_compress(void *src, void *dst, size_t s_len, size_t d_len,
+ int level);
+extern int lzjb_decompress(void *src, void *dst, size_t s_len, size_t d_len,
+ int level);
+extern size_t gzip_compress(void *src, void *dst, size_t s_len, size_t d_len,
+ int level);
+extern int gzip_decompress(void *src, void *dst, size_t s_len, size_t d_len,
+ int level);
+
+/*
+ * Compress and decompress data if necessary.
+ */
+extern int zio_compress_data(int cpfunc, void *src, uint64_t srcsize,
+ void **destp, uint64_t *destsizep, uint64_t *destbufsizep);
+extern int zio_decompress_data(int cpfunc, void *src, uint64_t srcsize,
+ void *dest, uint64_t destsize);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ZIO_COMPRESS_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h
new file mode 100644
index 0000000..d2ddbc3
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zio_impl.h
@@ -0,0 +1,205 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _ZIO_IMPL_H
+#define _ZIO_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/zio.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * I/O Groups: pipeline stage definitions.
+ */
+
+typedef enum zio_stage {
+ ZIO_STAGE_OPEN = 0, /* RWFCI */
+ ZIO_STAGE_WAIT_CHILDREN_READY, /* RWFCI */
+
+ ZIO_STAGE_WRITE_COMPRESS, /* -W--- */
+ ZIO_STAGE_CHECKSUM_GENERATE, /* -W--- */
+
+ ZIO_STAGE_GANG_PIPELINE, /* -WFC- */
+
+ ZIO_STAGE_GET_GANG_HEADER, /* -WFC- */
+ ZIO_STAGE_REWRITE_GANG_MEMBERS, /* -W--- */
+ ZIO_STAGE_FREE_GANG_MEMBERS, /* --F-- */
+ ZIO_STAGE_CLAIM_GANG_MEMBERS, /* ---C- */
+
+ ZIO_STAGE_DVA_ALLOCATE, /* -W--- */
+ ZIO_STAGE_DVA_FREE, /* --F-- */
+ ZIO_STAGE_DVA_CLAIM, /* ---C- */
+
+ ZIO_STAGE_GANG_CHECKSUM_GENERATE, /* -W--- */
+
+ ZIO_STAGE_READY, /* RWFCI */
+
+ ZIO_STAGE_VDEV_IO_START, /* RW--I */
+ ZIO_STAGE_VDEV_IO_DONE, /* RW--I */
+ ZIO_STAGE_VDEV_IO_ASSESS, /* RW--I */
+
+ ZIO_STAGE_WAIT_CHILDREN_DONE, /* RWFCI */
+
+ ZIO_STAGE_CHECKSUM_VERIFY, /* R---- */
+ ZIO_STAGE_READ_GANG_MEMBERS, /* R---- */
+ ZIO_STAGE_READ_DECOMPRESS, /* R---- */
+
+ ZIO_STAGE_DONE /* RWFCI */
+} zio_stage_t;
+
+/*
+ * The stages for which there's some performance value in going async.
+ * When compression is enabled, ZIO_STAGE_WRITE_COMPRESS is ORed in as well.
+ */
+#define ZIO_ASYNC_PIPELINE_STAGES \
+ ((1U << ZIO_STAGE_CHECKSUM_GENERATE) | \
+ (1U << ZIO_STAGE_VDEV_IO_DONE) | \
+ (1U << ZIO_STAGE_CHECKSUM_VERIFY) | \
+ (1U << ZIO_STAGE_READ_DECOMPRESS))
+
+#define ZIO_VDEV_IO_PIPELINE \
+ ((1U << ZIO_STAGE_VDEV_IO_START) | \
+ (1U << ZIO_STAGE_VDEV_IO_DONE) | \
+ (1U << ZIO_STAGE_VDEV_IO_ASSESS))
+
+#define ZIO_READ_PHYS_PIPELINE \
+ ((1U << ZIO_STAGE_OPEN) | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_READY) | \
+ (1U << ZIO_STAGE_READY) | \
+ ZIO_VDEV_IO_PIPELINE | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_DONE) | \
+ (1U << ZIO_STAGE_CHECKSUM_VERIFY) | \
+ (1U << ZIO_STAGE_DONE))
+
+#define ZIO_READ_PIPELINE \
+ ZIO_READ_PHYS_PIPELINE
+
+#define ZIO_WRITE_PHYS_PIPELINE \
+ ((1U << ZIO_STAGE_OPEN) | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_READY) | \
+ (1U << ZIO_STAGE_CHECKSUM_GENERATE) | \
+ (1U << ZIO_STAGE_READY) | \
+ ZIO_VDEV_IO_PIPELINE | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_DONE) | \
+ (1U << ZIO_STAGE_DONE))
+
+#define ZIO_WRITE_COMMON_PIPELINE \
+ ZIO_WRITE_PHYS_PIPELINE
+
+#define ZIO_WRITE_PIPELINE \
+ ((1U << ZIO_STAGE_WRITE_COMPRESS) | \
+ ZIO_WRITE_COMMON_PIPELINE)
+
+#define ZIO_GANG_STAGES \
+ ((1U << ZIO_STAGE_GET_GANG_HEADER) | \
+ (1U << ZIO_STAGE_REWRITE_GANG_MEMBERS) | \
+ (1U << ZIO_STAGE_FREE_GANG_MEMBERS) | \
+ (1U << ZIO_STAGE_CLAIM_GANG_MEMBERS) | \
+ (1U << ZIO_STAGE_GANG_CHECKSUM_GENERATE) | \
+ (1U << ZIO_STAGE_READ_GANG_MEMBERS))
+
+#define ZIO_REWRITE_PIPELINE \
+ ((1U << ZIO_STAGE_GANG_PIPELINE) | \
+ (1U << ZIO_STAGE_GET_GANG_HEADER) | \
+ (1U << ZIO_STAGE_REWRITE_GANG_MEMBERS) | \
+ (1U << ZIO_STAGE_GANG_CHECKSUM_GENERATE) | \
+ ZIO_WRITE_COMMON_PIPELINE)
+
+#define ZIO_WRITE_ALLOCATE_PIPELINE \
+ ((1U << ZIO_STAGE_DVA_ALLOCATE) | \
+ ZIO_WRITE_COMMON_PIPELINE)
+
+#define ZIO_GANG_FREE_STAGES \
+ ((1U << ZIO_STAGE_GET_GANG_HEADER) | \
+ (1U << ZIO_STAGE_FREE_GANG_MEMBERS))
+
+#define ZIO_FREE_PIPELINE \
+ ((1U << ZIO_STAGE_OPEN) | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_READY) | \
+ (1U << ZIO_STAGE_GANG_PIPELINE) | \
+ (1U << ZIO_STAGE_GET_GANG_HEADER) | \
+ (1U << ZIO_STAGE_FREE_GANG_MEMBERS) | \
+ (1U << ZIO_STAGE_DVA_FREE) | \
+ (1U << ZIO_STAGE_READY) | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_DONE) | \
+ (1U << ZIO_STAGE_DONE))
+
+#define ZIO_CLAIM_PIPELINE \
+ ((1U << ZIO_STAGE_OPEN) | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_READY) | \
+ (1U << ZIO_STAGE_GANG_PIPELINE) | \
+ (1U << ZIO_STAGE_GET_GANG_HEADER) | \
+ (1U << ZIO_STAGE_CLAIM_GANG_MEMBERS) | \
+ (1U << ZIO_STAGE_DVA_CLAIM) | \
+ (1U << ZIO_STAGE_READY) | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_DONE) | \
+ (1U << ZIO_STAGE_DONE))
+
+#define ZIO_IOCTL_PIPELINE \
+ ((1U << ZIO_STAGE_OPEN) | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_READY) | \
+ (1U << ZIO_STAGE_READY) | \
+ ZIO_VDEV_IO_PIPELINE | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_DONE) | \
+ (1U << ZIO_STAGE_DONE))
+
+#define ZIO_WAIT_FOR_CHILDREN_PIPELINE \
+ ((1U << ZIO_STAGE_WAIT_CHILDREN_READY) | \
+ (1U << ZIO_STAGE_READY) | \
+ (1U << ZIO_STAGE_WAIT_CHILDREN_DONE) | \
+ (1U << ZIO_STAGE_DONE))
+
+#define ZIO_WAIT_FOR_CHILDREN_DONE_PIPELINE \
+ ((1U << ZIO_STAGE_WAIT_CHILDREN_DONE) | \
+ (1U << ZIO_STAGE_DONE))
+
+#define ZIO_VDEV_CHILD_PIPELINE \
+ (ZIO_WAIT_FOR_CHILDREN_DONE_PIPELINE | \
+ ZIO_VDEV_IO_PIPELINE)
+
+#define ZIO_ERROR_PIPELINE_MASK \
+ ZIO_WAIT_FOR_CHILDREN_PIPELINE
+
+typedef struct zio_transform zio_transform_t;
+struct zio_transform {
+ void *zt_data;
+ uint64_t zt_size;
+ uint64_t zt_bufsize;
+ zio_transform_t *zt_next;
+};
+
+extern void zio_inject_init(void);
+extern void zio_inject_fini(void);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZIO_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zvol.h b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zvol.h
new file mode 100644
index 0000000..df85824
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/sys/zvol.h
@@ -0,0 +1,68 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ZVOL_H
+#define _SYS_ZVOL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _KERNEL
+extern int zvol_check_volsize(uint64_t volsize, uint64_t blocksize);
+extern int zvol_check_volblocksize(uint64_t volblocksize);
+extern int zvol_get_stats(objset_t *os, nvlist_t *nv);
+extern void zvol_create_cb(objset_t *os, void *arg, dmu_tx_t *tx);
+extern int zvol_create_minor(const char *, dev_t);
+extern int zvol_remove_minor(const char *);
+extern int zvol_set_volsize(const char *, dev_t, uint64_t);
+extern int zvol_set_volblocksize(const char *, uint64_t);
+
+extern int zvol_open(dev_t *devp, int flag, int otyp, cred_t *cr);
+extern int zvol_close(dev_t dev, int flag, int otyp, cred_t *cr);
+#ifndef __FreeBSD__
+extern int zvol_strategy(buf_t *bp);
+extern int zvol_read(dev_t dev, uio_t *uiop, cred_t *cr);
+extern int zvol_write(dev_t dev, uio_t *uiop, cred_t *cr);
+extern int zvol_aread(dev_t dev, struct aio_req *aio, cred_t *cr);
+extern int zvol_awrite(dev_t dev, struct aio_req *aio, cred_t *cr);
+#endif
+extern int zvol_ioctl(dev_t dev, int cmd, intptr_t arg, int flag, cred_t *cr,
+ int *rvalp);
+extern int zvol_busy(void);
+extern void zvol_init(void);
+extern void zvol_fini(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ZVOL_H */
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/txg.c b/sys/contrib/opensolaris/uts/common/fs/zfs/txg.c
new file mode 100644
index 0000000..844beb6
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/txg.c
@@ -0,0 +1,611 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/txg_impl.h>
+#include <sys/dmu_impl.h>
+#include <sys/dsl_pool.h>
+#include <sys/callb.h>
+
+/*
+ * Pool-wide transaction groups.
+ */
+
+static void txg_sync_thread(void *arg);
+static void txg_quiesce_thread(void *arg);
+static void txg_timelimit_thread(void *arg);
+
+int txg_time = 5; /* max 5 seconds worth of delta per txg */
+
+/*
+ * Prepare the txg subsystem.
+ */
+void
+txg_init(dsl_pool_t *dp, uint64_t txg)
+{
+ tx_state_t *tx = &dp->dp_tx;
+ int c, i;
+ bzero(tx, sizeof (tx_state_t));
+
+ tx->tx_cpu = kmem_zalloc(max_ncpus * sizeof (tx_cpu_t), KM_SLEEP);
+ for (c = 0; c < max_ncpus; c++) {
+ mutex_init(&tx->tx_cpu[c].tc_lock, NULL, MUTEX_DEFAULT, NULL);
+ for (i = 0; i < TXG_SIZE; i++)
+ cv_init(&tx->tx_cpu[c].tc_cv[i], NULL, CV_DEFAULT, NULL);
+ }
+
+ rw_init(&tx->tx_suspend, NULL, RW_DEFAULT, NULL);
+ mutex_init(&tx->tx_sync_lock, NULL, MUTEX_DEFAULT, NULL);
+ cv_init(&tx->tx_sync_more_cv, NULL, CV_DEFAULT, NULL);
+ cv_init(&tx->tx_sync_done_cv, NULL, CV_DEFAULT, NULL);
+ cv_init(&tx->tx_quiesce_more_cv, NULL, CV_DEFAULT, NULL);
+ cv_init(&tx->tx_quiesce_done_cv, NULL, CV_DEFAULT, NULL);
+ cv_init(&tx->tx_timeout_exit_cv, NULL, CV_DEFAULT, NULL);
+ cv_init(&tx->tx_exit_cv, NULL, CV_DEFAULT, NULL);
+
+ tx->tx_open_txg = txg;
+}
+
+/*
+ * Close down the txg subsystem.
+ */
+void
+txg_fini(dsl_pool_t *dp)
+{
+ tx_state_t *tx = &dp->dp_tx;
+ int c, i;
+
+ ASSERT(tx->tx_threads == 0);
+
+ cv_destroy(&tx->tx_exit_cv);
+ cv_destroy(&tx->tx_timeout_exit_cv);
+ cv_destroy(&tx->tx_quiesce_done_cv);
+ cv_destroy(&tx->tx_quiesce_more_cv);
+ cv_destroy(&tx->tx_sync_done_cv);
+ cv_destroy(&tx->tx_sync_more_cv);
+ rw_destroy(&tx->tx_suspend);
+ mutex_destroy(&tx->tx_sync_lock);
+
+ for (c = 0; c < max_ncpus; c++) {
+ for (i = 0; i < TXG_SIZE; i++)
+ cv_destroy(&tx->tx_cpu[c].tc_cv[i]);
+ mutex_destroy(&tx->tx_cpu[c].tc_lock);
+ }
+
+ kmem_free(tx->tx_cpu, max_ncpus * sizeof (tx_cpu_t));
+
+ bzero(tx, sizeof (tx_state_t));
+}
+
+/*
+ * Start syncing transaction groups.
+ */
+void
+txg_sync_start(dsl_pool_t *dp)
+{
+ tx_state_t *tx = &dp->dp_tx;
+
+ mutex_enter(&tx->tx_sync_lock);
+
+ dprintf("pool %p\n", dp);
+
+ ASSERT(tx->tx_threads == 0);
+
+ tx->tx_threads = 3;
+
+ tx->tx_quiesce_thread = thread_create(NULL, 0, txg_quiesce_thread,
+ dp, 0, &p0, TS_RUN, minclsyspri);
+
+ tx->tx_sync_thread = thread_create(NULL, 0, txg_sync_thread,
+ dp, 0, &p0, TS_RUN, minclsyspri);
+
+ tx->tx_timelimit_thread = thread_create(NULL, 0, txg_timelimit_thread,
+ dp, 0, &p0, TS_RUN, minclsyspri);
+
+ mutex_exit(&tx->tx_sync_lock);
+}
+
+static void
+txg_thread_enter(tx_state_t *tx, callb_cpr_t *cpr)
+{
+ CALLB_CPR_INIT(cpr, &tx->tx_sync_lock, callb_generic_cpr, FTAG);
+ mutex_enter(&tx->tx_sync_lock);
+}
+
+static void
+txg_thread_exit(tx_state_t *tx, callb_cpr_t *cpr, kthread_t **tpp)
+{
+ ASSERT(*tpp != NULL);
+ *tpp = NULL;
+ tx->tx_threads--;
+ cv_broadcast(&tx->tx_exit_cv);
+ CALLB_CPR_EXIT(cpr); /* drops &tx->tx_sync_lock */
+ thread_exit();
+}
+
+static void
+txg_thread_wait(tx_state_t *tx, callb_cpr_t *cpr, kcondvar_t *cv, int secmax)
+{
+ CALLB_CPR_SAFE_BEGIN(cpr);
+
+ if (secmax)
+ (void) cv_timedwait(cv, &tx->tx_sync_lock, secmax * hz);
+ else
+ cv_wait(cv, &tx->tx_sync_lock);
+
+ CALLB_CPR_SAFE_END(cpr, &tx->tx_sync_lock);
+}
+
+/*
+ * Stop syncing transaction groups.
+ */
+void
+txg_sync_stop(dsl_pool_t *dp)
+{
+ tx_state_t *tx = &dp->dp_tx;
+
+ dprintf("pool %p\n", dp);
+ /*
+ * Finish off any work in progress.
+ */
+ ASSERT(tx->tx_threads == 3);
+ txg_wait_synced(dp, 0);
+
+ /*
+ * Wake all 3 sync threads (one per state) and wait for them to die.
+ */
+ mutex_enter(&tx->tx_sync_lock);
+
+ ASSERT(tx->tx_threads == 3);
+
+ tx->tx_exiting = 1;
+
+ cv_broadcast(&tx->tx_quiesce_more_cv);
+ cv_broadcast(&tx->tx_quiesce_done_cv);
+ cv_broadcast(&tx->tx_sync_more_cv);
+ cv_broadcast(&tx->tx_timeout_exit_cv);
+
+ while (tx->tx_threads != 0)
+ cv_wait(&tx->tx_exit_cv, &tx->tx_sync_lock);
+
+ tx->tx_exiting = 0;
+
+ mutex_exit(&tx->tx_sync_lock);
+}
+
+uint64_t
+txg_hold_open(dsl_pool_t *dp, txg_handle_t *th)
+{
+ tx_state_t *tx = &dp->dp_tx;
+ tx_cpu_t *tc = &tx->tx_cpu[CPU_SEQID];
+ uint64_t txg;
+
+ mutex_enter(&tc->tc_lock);
+
+ txg = tx->tx_open_txg;
+ tc->tc_count[txg & TXG_MASK]++;
+
+ th->th_cpu = tc;
+ th->th_txg = txg;
+
+ return (txg);
+}
+
+void
+txg_rele_to_quiesce(txg_handle_t *th)
+{
+ tx_cpu_t *tc = th->th_cpu;
+
+ mutex_exit(&tc->tc_lock);
+}
+
+void
+txg_rele_to_sync(txg_handle_t *th)
+{
+ tx_cpu_t *tc = th->th_cpu;
+ int g = th->th_txg & TXG_MASK;
+
+ mutex_enter(&tc->tc_lock);
+ ASSERT(tc->tc_count[g] != 0);
+ if (--tc->tc_count[g] == 0)
+ cv_broadcast(&tc->tc_cv[g]);
+ mutex_exit(&tc->tc_lock);
+
+ th->th_cpu = NULL; /* defensive */
+}
+
+static void
+txg_quiesce(dsl_pool_t *dp, uint64_t txg)
+{
+ tx_state_t *tx = &dp->dp_tx;
+ int g = txg & TXG_MASK;
+ int c;
+
+ /*
+ * Grab all tx_cpu locks so nobody else can get into this txg.
+ */
+ for (c = 0; c < max_ncpus; c++)
+ mutex_enter(&tx->tx_cpu[c].tc_lock);
+
+ ASSERT(txg == tx->tx_open_txg);
+ tx->tx_open_txg++;
+
+ /*
+ * Now that we've incremented tx_open_txg, we can let threads
+ * enter the next transaction group.
+ */
+ for (c = 0; c < max_ncpus; c++)
+ mutex_exit(&tx->tx_cpu[c].tc_lock);
+
+ /*
+ * Quiesce the transaction group by waiting for everyone to txg_exit().
+ */
+ for (c = 0; c < max_ncpus; c++) {
+ tx_cpu_t *tc = &tx->tx_cpu[c];
+ mutex_enter(&tc->tc_lock);
+ while (tc->tc_count[g] != 0)
+ cv_wait(&tc->tc_cv[g], &tc->tc_lock);
+ mutex_exit(&tc->tc_lock);
+ }
+}
+
+static void
+txg_sync_thread(void *arg)
+{
+ dsl_pool_t *dp = arg;
+ tx_state_t *tx = &dp->dp_tx;
+ callb_cpr_t cpr;
+
+ txg_thread_enter(tx, &cpr);
+
+ for (;;) {
+ uint64_t txg;
+
+ /*
+ * We sync when there's someone waiting on us, or the
+ * quiesce thread has handed off a txg to us.
+ */
+ while (!tx->tx_exiting &&
+ tx->tx_synced_txg >= tx->tx_sync_txg_waiting &&
+ tx->tx_quiesced_txg == 0) {
+ dprintf("waiting; tx_synced=%llu waiting=%llu dp=%p\n",
+ tx->tx_synced_txg, tx->tx_sync_txg_waiting, dp);
+ txg_thread_wait(tx, &cpr, &tx->tx_sync_more_cv, 0);
+ }
+
+ /*
+ * Wait until the quiesce thread hands off a txg to us,
+ * prompting it to do so if necessary.
+ */
+ while (!tx->tx_exiting && tx->tx_quiesced_txg == 0) {
+ if (tx->tx_quiesce_txg_waiting < tx->tx_open_txg+1)
+ tx->tx_quiesce_txg_waiting = tx->tx_open_txg+1;
+ cv_broadcast(&tx->tx_quiesce_more_cv);
+ txg_thread_wait(tx, &cpr, &tx->tx_quiesce_done_cv, 0);
+ }
+
+ if (tx->tx_exiting)
+ txg_thread_exit(tx, &cpr, &tx->tx_sync_thread);
+
+ rw_enter(&tx->tx_suspend, RW_WRITER);
+
+ /*
+ * Consume the quiesced txg which has been handed off to
+ * us. This may cause the quiescing thread to now be
+ * able to quiesce another txg, so we must signal it.
+ */
+ txg = tx->tx_quiesced_txg;
+ tx->tx_quiesced_txg = 0;
+ tx->tx_syncing_txg = txg;
+ cv_broadcast(&tx->tx_quiesce_more_cv);
+ rw_exit(&tx->tx_suspend);
+
+ dprintf("txg=%llu quiesce_txg=%llu sync_txg=%llu\n",
+ txg, tx->tx_quiesce_txg_waiting,
+ tx->tx_sync_txg_waiting);
+ mutex_exit(&tx->tx_sync_lock);
+ spa_sync(dp->dp_spa, txg);
+ mutex_enter(&tx->tx_sync_lock);
+ rw_enter(&tx->tx_suspend, RW_WRITER);
+ tx->tx_synced_txg = txg;
+ tx->tx_syncing_txg = 0;
+ rw_exit(&tx->tx_suspend);
+ cv_broadcast(&tx->tx_sync_done_cv);
+ }
+}
+
+static void
+txg_quiesce_thread(void *arg)
+{
+ dsl_pool_t *dp = arg;
+ tx_state_t *tx = &dp->dp_tx;
+ callb_cpr_t cpr;
+
+ txg_thread_enter(tx, &cpr);
+
+ for (;;) {
+ uint64_t txg;
+
+ /*
+ * We quiesce when there's someone waiting on us.
+ * However, we can only have one txg in "quiescing" or
+ * "quiesced, waiting to sync" state. So we wait until
+ * the "quiesced, waiting to sync" txg has been consumed
+ * by the sync thread.
+ */
+ while (!tx->tx_exiting &&
+ (tx->tx_open_txg >= tx->tx_quiesce_txg_waiting ||
+ tx->tx_quiesced_txg != 0))
+ txg_thread_wait(tx, &cpr, &tx->tx_quiesce_more_cv, 0);
+
+ if (tx->tx_exiting)
+ txg_thread_exit(tx, &cpr, &tx->tx_quiesce_thread);
+
+ txg = tx->tx_open_txg;
+ dprintf("txg=%llu quiesce_txg=%llu sync_txg=%llu\n",
+ txg, tx->tx_quiesce_txg_waiting,
+ tx->tx_sync_txg_waiting);
+ mutex_exit(&tx->tx_sync_lock);
+ txg_quiesce(dp, txg);
+ mutex_enter(&tx->tx_sync_lock);
+
+ /*
+ * Hand this txg off to the sync thread.
+ */
+ dprintf("quiesce done, handing off txg %llu\n", txg);
+ tx->tx_quiesced_txg = txg;
+ cv_broadcast(&tx->tx_sync_more_cv);
+ cv_broadcast(&tx->tx_quiesce_done_cv);
+ }
+}
+
+void
+txg_wait_synced(dsl_pool_t *dp, uint64_t txg)
+{
+ tx_state_t *tx = &dp->dp_tx;
+
+ mutex_enter(&tx->tx_sync_lock);
+ ASSERT(tx->tx_threads == 3);
+ if (txg == 0)
+ txg = tx->tx_open_txg;
+ if (tx->tx_sync_txg_waiting < txg)
+ tx->tx_sync_txg_waiting = txg;
+ dprintf("txg=%llu quiesce_txg=%llu sync_txg=%llu\n",
+ txg, tx->tx_quiesce_txg_waiting, tx->tx_sync_txg_waiting);
+ while (tx->tx_synced_txg < txg) {
+ dprintf("broadcasting sync more "
+ "tx_synced=%llu waiting=%llu dp=%p\n",
+ tx->tx_synced_txg, tx->tx_sync_txg_waiting, dp);
+ cv_broadcast(&tx->tx_sync_more_cv);
+ cv_wait(&tx->tx_sync_done_cv, &tx->tx_sync_lock);
+ }
+ mutex_exit(&tx->tx_sync_lock);
+}
+
+void
+txg_wait_open(dsl_pool_t *dp, uint64_t txg)
+{
+ tx_state_t *tx = &dp->dp_tx;
+
+ mutex_enter(&tx->tx_sync_lock);
+ ASSERT(tx->tx_threads == 3);
+ if (txg == 0)
+ txg = tx->tx_open_txg + 1;
+ if (tx->tx_quiesce_txg_waiting < txg)
+ tx->tx_quiesce_txg_waiting = txg;
+ dprintf("txg=%llu quiesce_txg=%llu sync_txg=%llu\n",
+ txg, tx->tx_quiesce_txg_waiting, tx->tx_sync_txg_waiting);
+ while (tx->tx_open_txg < txg) {
+ cv_broadcast(&tx->tx_quiesce_more_cv);
+ cv_wait(&tx->tx_quiesce_done_cv, &tx->tx_sync_lock);
+ }
+ mutex_exit(&tx->tx_sync_lock);
+}
+
+static void
+txg_timelimit_thread(void *arg)
+{
+ dsl_pool_t *dp = arg;
+ tx_state_t *tx = &dp->dp_tx;
+ callb_cpr_t cpr;
+
+ txg_thread_enter(tx, &cpr);
+
+ while (!tx->tx_exiting) {
+ uint64_t txg = tx->tx_open_txg + 1;
+
+ txg_thread_wait(tx, &cpr, &tx->tx_timeout_exit_cv, txg_time);
+
+ if (tx->tx_quiesce_txg_waiting < txg)
+ tx->tx_quiesce_txg_waiting = txg;
+
+ while (!tx->tx_exiting && tx->tx_open_txg < txg) {
+ dprintf("pushing out %llu\n", txg);
+ cv_broadcast(&tx->tx_quiesce_more_cv);
+ txg_thread_wait(tx, &cpr, &tx->tx_quiesce_done_cv, 0);
+ }
+ }
+ txg_thread_exit(tx, &cpr, &tx->tx_timelimit_thread);
+}
+
+int
+txg_stalled(dsl_pool_t *dp)
+{
+ tx_state_t *tx = &dp->dp_tx;
+ return (tx->tx_quiesce_txg_waiting > tx->tx_open_txg);
+}
+
+void
+txg_suspend(dsl_pool_t *dp)
+{
+ tx_state_t *tx = &dp->dp_tx;
+ /* XXX some code paths suspend when they are already suspended! */
+ rw_enter(&tx->tx_suspend, RW_READER);
+}
+
+void
+txg_resume(dsl_pool_t *dp)
+{
+ tx_state_t *tx = &dp->dp_tx;
+ rw_exit(&tx->tx_suspend);
+}
+
+/*
+ * Per-txg object lists.
+ */
+void
+txg_list_create(txg_list_t *tl, size_t offset)
+{
+ int t;
+
+ mutex_init(&tl->tl_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ tl->tl_offset = offset;
+
+ for (t = 0; t < TXG_SIZE; t++)
+ tl->tl_head[t] = NULL;
+}
+
+void
+txg_list_destroy(txg_list_t *tl)
+{
+ int t;
+
+ for (t = 0; t < TXG_SIZE; t++)
+ ASSERT(txg_list_empty(tl, t));
+
+ mutex_destroy(&tl->tl_lock);
+}
+
+int
+txg_list_empty(txg_list_t *tl, uint64_t txg)
+{
+ return (tl->tl_head[txg & TXG_MASK] == NULL);
+}
+
+/*
+ * Add an entry to the list.
+ * Returns 0 if it's a new entry, 1 if it's already there.
+ */
+int
+txg_list_add(txg_list_t *tl, void *p, uint64_t txg)
+{
+ int t = txg & TXG_MASK;
+ txg_node_t *tn = (txg_node_t *)((char *)p + tl->tl_offset);
+ int already_on_list;
+
+ mutex_enter(&tl->tl_lock);
+ already_on_list = tn->tn_member[t];
+ if (!already_on_list) {
+ tn->tn_member[t] = 1;
+ tn->tn_next[t] = tl->tl_head[t];
+ tl->tl_head[t] = tn;
+ }
+ mutex_exit(&tl->tl_lock);
+
+ return (already_on_list);
+}
+
+/*
+ * Remove the head of the list and return it.
+ */
+void *
+txg_list_remove(txg_list_t *tl, uint64_t txg)
+{
+ int t = txg & TXG_MASK;
+ txg_node_t *tn;
+ void *p = NULL;
+
+ mutex_enter(&tl->tl_lock);
+ if ((tn = tl->tl_head[t]) != NULL) {
+ p = (char *)tn - tl->tl_offset;
+ tl->tl_head[t] = tn->tn_next[t];
+ tn->tn_next[t] = NULL;
+ tn->tn_member[t] = 0;
+ }
+ mutex_exit(&tl->tl_lock);
+
+ return (p);
+}
+
+/*
+ * Remove a specific item from the list and return it.
+ */
+void *
+txg_list_remove_this(txg_list_t *tl, void *p, uint64_t txg)
+{
+ int t = txg & TXG_MASK;
+ txg_node_t *tn, **tp;
+
+ mutex_enter(&tl->tl_lock);
+
+ for (tp = &tl->tl_head[t]; (tn = *tp) != NULL; tp = &tn->tn_next[t]) {
+ if ((char *)tn - tl->tl_offset == p) {
+ *tp = tn->tn_next[t];
+ tn->tn_next[t] = NULL;
+ tn->tn_member[t] = 0;
+ mutex_exit(&tl->tl_lock);
+ return (p);
+ }
+ }
+
+ mutex_exit(&tl->tl_lock);
+
+ return (NULL);
+}
+
+int
+txg_list_member(txg_list_t *tl, void *p, uint64_t txg)
+{
+ int t = txg & TXG_MASK;
+ txg_node_t *tn = (txg_node_t *)((char *)p + tl->tl_offset);
+
+ return (tn->tn_member[t]);
+}
+
+/*
+ * Walk a txg list -- only safe if you know it's not changing.
+ */
+void *
+txg_list_head(txg_list_t *tl, uint64_t txg)
+{
+ int t = txg & TXG_MASK;
+ txg_node_t *tn = tl->tl_head[t];
+
+ return (tn == NULL ? NULL : (char *)tn - tl->tl_offset);
+}
+
+void *
+txg_list_next(txg_list_t *tl, void *p, uint64_t txg)
+{
+ int t = txg & TXG_MASK;
+ txg_node_t *tn = (txg_node_t *)((char *)p + tl->tl_offset);
+
+ tn = tn->tn_next[t];
+
+ return (tn == NULL ? NULL : (char *)tn - tl->tl_offset);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/uberblock.c b/sys/contrib/opensolaris/uts/common/fs/zfs/uberblock.c
new file mode 100644
index 0000000..34d7e0c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/uberblock.c
@@ -0,0 +1,63 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/uberblock_impl.h>
+#include <sys/vdev_impl.h>
+
+int
+uberblock_verify(uberblock_t *ub)
+{
+ if (ub->ub_magic == BSWAP_64((uint64_t)UBERBLOCK_MAGIC))
+ byteswap_uint64_array(ub, sizeof (uberblock_t));
+
+ if (ub->ub_magic != UBERBLOCK_MAGIC)
+ return (EINVAL);
+
+ return (0);
+}
+
+/*
+ * Update the uberblock and return a boolean value indicating whether
+ * anything changed in this transaction group.
+ */
+int
+uberblock_update(uberblock_t *ub, vdev_t *rvd, uint64_t txg)
+{
+ ASSERT(ub->ub_txg < txg);
+
+ /*
+ * We explicitly do not set ub_version here, so that older versions
+ * continue to be written with the previous uberblock version.
+ */
+ ub->ub_magic = UBERBLOCK_MAGIC;
+ ub->ub_txg = txg;
+ ub->ub_guid_sum = rvd->vdev_guid_sum;
+ ub->ub_timestamp = gethrestime_sec();
+
+ return (ub->ub_rootbp.blk_birth == txg);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/unique.c b/sys/contrib/opensolaris/uts/common/fs/zfs/unique.c
new file mode 100644
index 0000000..b52e729
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/unique.c
@@ -0,0 +1,107 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/avl.h>
+#include <sys/unique.h>
+
+static avl_tree_t unique_avl;
+static kmutex_t unique_mtx; /* Lock never initialized. */
+SX_SYSINIT(unique, &unique_mtx, "unique lock");
+
+typedef struct unique {
+ avl_node_t un_link;
+ uint64_t un_value;
+} unique_t;
+
+#define UNIQUE_MASK ((1ULL << UNIQUE_BITS) - 1)
+
+static int
+unique_compare(const void *a, const void *b)
+{
+ const unique_t *una = a;
+ const unique_t *unb = b;
+
+ if (una->un_value < unb->un_value)
+ return (-1);
+ if (una->un_value > unb->un_value)
+ return (+1);
+ return (0);
+}
+
+void
+unique_init(void)
+{
+ avl_create(&unique_avl, unique_compare,
+ sizeof (unique_t), offsetof(unique_t, un_link));
+}
+
+uint64_t
+unique_create(void)
+{
+ return (unique_insert(0));
+}
+
+uint64_t
+unique_insert(uint64_t value)
+{
+ avl_index_t idx;
+ unique_t *un = kmem_alloc(sizeof (unique_t), KM_SLEEP);
+
+ un->un_value = value;
+
+ mutex_enter(&unique_mtx);
+ while (un->un_value == 0 || un->un_value & ~UNIQUE_MASK ||
+ avl_find(&unique_avl, un, &idx)) {
+ mutex_exit(&unique_mtx);
+ (void) random_get_pseudo_bytes((void*)&un->un_value,
+ sizeof (un->un_value));
+ un->un_value &= UNIQUE_MASK;
+ mutex_enter(&unique_mtx);
+ }
+
+ avl_insert(&unique_avl, un, idx);
+ mutex_exit(&unique_mtx);
+
+ return (un->un_value);
+}
+
+void
+unique_remove(uint64_t value)
+{
+ unique_t un_tofind;
+ unique_t *un;
+
+ un_tofind.un_value = value;
+ mutex_enter(&unique_mtx);
+ un = avl_find(&unique_avl, &un_tofind, NULL);
+ if (un != NULL) {
+ avl_remove(&unique_avl, un);
+ kmem_free(un, sizeof (unique_t));
+ }
+ mutex_exit(&unique_mtx);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev.c
new file mode 100644
index 0000000..e607744
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev.c
@@ -0,0 +1,1904 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/fm/fs/zfs.h>
+#include <sys/spa.h>
+#include <sys/spa_impl.h>
+#include <sys/dmu.h>
+#include <sys/dmu_tx.h>
+#include <sys/vdev_impl.h>
+#include <sys/uberblock_impl.h>
+#include <sys/metaslab.h>
+#include <sys/metaslab_impl.h>
+#include <sys/space_map.h>
+#include <sys/zio.h>
+#include <sys/zap.h>
+#include <sys/fs/zfs.h>
+
+SYSCTL_DECL(_vfs_zfs);
+SYSCTL_NODE(_vfs_zfs, OID_AUTO, vdev, CTLFLAG_RW, 0, "ZFS VDEV");
+
+/*
+ * Virtual device management.
+ */
+
+static vdev_ops_t *vdev_ops_table[] = {
+ &vdev_root_ops,
+ &vdev_raidz_ops,
+ &vdev_mirror_ops,
+ &vdev_replacing_ops,
+ &vdev_spare_ops,
+#ifdef _KERNEL
+ &vdev_geom_ops,
+#else
+ &vdev_disk_ops,
+ &vdev_file_ops,
+#endif
+ &vdev_missing_ops,
+ NULL
+};
+
+/* maximum scrub/resilver I/O queue */
+int zfs_scrub_limit = 70;
+
+/*
+ * Given a vdev type, return the appropriate ops vector.
+ */
+static vdev_ops_t *
+vdev_getops(const char *type)
+{
+ vdev_ops_t *ops, **opspp;
+
+ for (opspp = vdev_ops_table; (ops = *opspp) != NULL; opspp++)
+ if (strcmp(ops->vdev_op_type, type) == 0)
+ break;
+
+ return (ops);
+}
+
+/*
+ * Default asize function: return the MAX of psize with the asize of
+ * all children. This is what's used by anything other than RAID-Z.
+ */
+uint64_t
+vdev_default_asize(vdev_t *vd, uint64_t psize)
+{
+ uint64_t asize = P2ROUNDUP(psize, 1ULL << vd->vdev_top->vdev_ashift);
+ uint64_t csize;
+ uint64_t c;
+
+ for (c = 0; c < vd->vdev_children; c++) {
+ csize = vdev_psize_to_asize(vd->vdev_child[c], psize);
+ asize = MAX(asize, csize);
+ }
+
+ return (asize);
+}
+
+/*
+ * Get the replaceable or attachable device size.
+ * If the parent is a mirror or raidz, the replaceable size is the minimum
+ * psize of all its children. For the rest, just return our own psize.
+ *
+ * e.g.
+ * psize rsize
+ * root - -
+ * mirror/raidz - -
+ * disk1 20g 20g
+ * disk2 40g 20g
+ * disk3 80g 80g
+ */
+uint64_t
+vdev_get_rsize(vdev_t *vd)
+{
+ vdev_t *pvd, *cvd;
+ uint64_t c, rsize;
+
+ pvd = vd->vdev_parent;
+
+ /*
+ * If our parent is NULL or the root, just return our own psize.
+ */
+ if (pvd == NULL || pvd->vdev_parent == NULL)
+ return (vd->vdev_psize);
+
+ rsize = 0;
+
+ for (c = 0; c < pvd->vdev_children; c++) {
+ cvd = pvd->vdev_child[c];
+ rsize = MIN(rsize - 1, cvd->vdev_psize - 1) + 1;
+ }
+
+ return (rsize);
+}
+
+vdev_t *
+vdev_lookup_top(spa_t *spa, uint64_t vdev)
+{
+ vdev_t *rvd = spa->spa_root_vdev;
+
+ if (vdev < rvd->vdev_children)
+ return (rvd->vdev_child[vdev]);
+
+ return (NULL);
+}
+
+vdev_t *
+vdev_lookup_by_guid(vdev_t *vd, uint64_t guid)
+{
+ int c;
+ vdev_t *mvd;
+
+ if (vd->vdev_guid == guid)
+ return (vd);
+
+ for (c = 0; c < vd->vdev_children; c++)
+ if ((mvd = vdev_lookup_by_guid(vd->vdev_child[c], guid)) !=
+ NULL)
+ return (mvd);
+
+ return (NULL);
+}
+
+void
+vdev_add_child(vdev_t *pvd, vdev_t *cvd)
+{
+ size_t oldsize, newsize;
+ uint64_t id = cvd->vdev_id;
+ vdev_t **newchild;
+
+ ASSERT(spa_config_held(cvd->vdev_spa, RW_WRITER));
+ ASSERT(cvd->vdev_parent == NULL);
+
+ cvd->vdev_parent = pvd;
+
+ if (pvd == NULL)
+ return;
+
+ ASSERT(id >= pvd->vdev_children || pvd->vdev_child[id] == NULL);
+
+ oldsize = pvd->vdev_children * sizeof (vdev_t *);
+ pvd->vdev_children = MAX(pvd->vdev_children, id + 1);
+ newsize = pvd->vdev_children * sizeof (vdev_t *);
+
+ newchild = kmem_zalloc(newsize, KM_SLEEP);
+ if (pvd->vdev_child != NULL) {
+ bcopy(pvd->vdev_child, newchild, oldsize);
+ kmem_free(pvd->vdev_child, oldsize);
+ }
+
+ pvd->vdev_child = newchild;
+ pvd->vdev_child[id] = cvd;
+
+ cvd->vdev_top = (pvd->vdev_top ? pvd->vdev_top: cvd);
+ ASSERT(cvd->vdev_top->vdev_parent->vdev_parent == NULL);
+
+ /*
+ * Walk up all ancestors to update guid sum.
+ */
+ for (; pvd != NULL; pvd = pvd->vdev_parent)
+ pvd->vdev_guid_sum += cvd->vdev_guid_sum;
+
+ if (cvd->vdev_ops->vdev_op_leaf)
+ cvd->vdev_spa->spa_scrub_maxinflight += zfs_scrub_limit;
+}
+
+void
+vdev_remove_child(vdev_t *pvd, vdev_t *cvd)
+{
+ int c;
+ uint_t id = cvd->vdev_id;
+
+ ASSERT(cvd->vdev_parent == pvd);
+
+ if (pvd == NULL)
+ return;
+
+ ASSERT(id < pvd->vdev_children);
+ ASSERT(pvd->vdev_child[id] == cvd);
+
+ pvd->vdev_child[id] = NULL;
+ cvd->vdev_parent = NULL;
+
+ for (c = 0; c < pvd->vdev_children; c++)
+ if (pvd->vdev_child[c])
+ break;
+
+ if (c == pvd->vdev_children) {
+ kmem_free(pvd->vdev_child, c * sizeof (vdev_t *));
+ pvd->vdev_child = NULL;
+ pvd->vdev_children = 0;
+ }
+
+ /*
+ * Walk up all ancestors to update guid sum.
+ */
+ for (; pvd != NULL; pvd = pvd->vdev_parent)
+ pvd->vdev_guid_sum -= cvd->vdev_guid_sum;
+
+ if (cvd->vdev_ops->vdev_op_leaf)
+ cvd->vdev_spa->spa_scrub_maxinflight -= zfs_scrub_limit;
+}
+
+/*
+ * Remove any holes in the child array.
+ */
+void
+vdev_compact_children(vdev_t *pvd)
+{
+ vdev_t **newchild, *cvd;
+ int oldc = pvd->vdev_children;
+ int newc, c;
+
+ ASSERT(spa_config_held(pvd->vdev_spa, RW_WRITER));
+
+ for (c = newc = 0; c < oldc; c++)
+ if (pvd->vdev_child[c])
+ newc++;
+
+ newchild = kmem_alloc(newc * sizeof (vdev_t *), KM_SLEEP);
+
+ for (c = newc = 0; c < oldc; c++) {
+ if ((cvd = pvd->vdev_child[c]) != NULL) {
+ newchild[newc] = cvd;
+ cvd->vdev_id = newc++;
+ }
+ }
+
+ kmem_free(pvd->vdev_child, oldc * sizeof (vdev_t *));
+ pvd->vdev_child = newchild;
+ pvd->vdev_children = newc;
+}
+
+/*
+ * Allocate and minimally initialize a vdev_t.
+ */
+static vdev_t *
+vdev_alloc_common(spa_t *spa, uint_t id, uint64_t guid, vdev_ops_t *ops)
+{
+ vdev_t *vd;
+
+ vd = kmem_zalloc(sizeof (vdev_t), KM_SLEEP);
+
+ if (spa->spa_root_vdev == NULL) {
+ ASSERT(ops == &vdev_root_ops);
+ spa->spa_root_vdev = vd;
+ }
+
+ if (guid == 0) {
+ if (spa->spa_root_vdev == vd) {
+ /*
+ * The root vdev's guid will also be the pool guid,
+ * which must be unique among all pools.
+ */
+ while (guid == 0 || spa_guid_exists(guid, 0))
+ guid = spa_get_random(-1ULL);
+ } else {
+ /*
+ * Any other vdev's guid must be unique within the pool.
+ */
+ while (guid == 0 ||
+ spa_guid_exists(spa_guid(spa), guid))
+ guid = spa_get_random(-1ULL);
+ }
+ ASSERT(!spa_guid_exists(spa_guid(spa), guid));
+ }
+
+ vd->vdev_spa = spa;
+ vd->vdev_id = id;
+ vd->vdev_guid = guid;
+ vd->vdev_guid_sum = guid;
+ vd->vdev_ops = ops;
+ vd->vdev_state = VDEV_STATE_CLOSED;
+
+ mutex_init(&vd->vdev_dtl_lock, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&vd->vdev_stat_lock, NULL, MUTEX_DEFAULT, NULL);
+ space_map_create(&vd->vdev_dtl_map, 0, -1ULL, 0, &vd->vdev_dtl_lock);
+ space_map_create(&vd->vdev_dtl_scrub, 0, -1ULL, 0, &vd->vdev_dtl_lock);
+ txg_list_create(&vd->vdev_ms_list,
+ offsetof(struct metaslab, ms_txg_node));
+ txg_list_create(&vd->vdev_dtl_list,
+ offsetof(struct vdev, vdev_dtl_node));
+ vd->vdev_stat.vs_timestamp = gethrtime();
+
+ return (vd);
+}
+
+/*
+ * Free a vdev_t that has been removed from service.
+ */
+static void
+vdev_free_common(vdev_t *vd)
+{
+ spa_t *spa = vd->vdev_spa;
+
+ if (vd->vdev_path)
+ spa_strfree(vd->vdev_path);
+ if (vd->vdev_devid)
+ spa_strfree(vd->vdev_devid);
+
+ if (vd->vdev_isspare)
+ spa_spare_remove(vd);
+
+ txg_list_destroy(&vd->vdev_ms_list);
+ txg_list_destroy(&vd->vdev_dtl_list);
+ mutex_enter(&vd->vdev_dtl_lock);
+ space_map_unload(&vd->vdev_dtl_map);
+ space_map_destroy(&vd->vdev_dtl_map);
+ space_map_vacate(&vd->vdev_dtl_scrub, NULL, NULL);
+ space_map_destroy(&vd->vdev_dtl_scrub);
+ mutex_exit(&vd->vdev_dtl_lock);
+ mutex_destroy(&vd->vdev_dtl_lock);
+ mutex_destroy(&vd->vdev_stat_lock);
+
+ if (vd == spa->spa_root_vdev)
+ spa->spa_root_vdev = NULL;
+
+ kmem_free(vd, sizeof (vdev_t));
+}
+
+/*
+ * Allocate a new vdev. The 'alloctype' is used to control whether we are
+ * creating a new vdev or loading an existing one - the behavior is slightly
+ * different for each case.
+ */
+int
+vdev_alloc(spa_t *spa, vdev_t **vdp, nvlist_t *nv, vdev_t *parent, uint_t id,
+ int alloctype)
+{
+ vdev_ops_t *ops;
+ char *type;
+ uint64_t guid = 0;
+ vdev_t *vd;
+
+ ASSERT(spa_config_held(spa, RW_WRITER));
+
+ if (nvlist_lookup_string(nv, ZPOOL_CONFIG_TYPE, &type) != 0)
+ return (EINVAL);
+
+ if ((ops = vdev_getops(type)) == NULL)
+ return (EINVAL);
+
+ /*
+ * If this is a load, get the vdev guid from the nvlist.
+ * Otherwise, vdev_alloc_common() will generate one for us.
+ */
+ if (alloctype == VDEV_ALLOC_LOAD) {
+ uint64_t label_id;
+
+ if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ID, &label_id) ||
+ label_id != id)
+ return (EINVAL);
+
+ if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) != 0)
+ return (EINVAL);
+ } else if (alloctype == VDEV_ALLOC_SPARE) {
+ if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_GUID, &guid) != 0)
+ return (EINVAL);
+ }
+
+ /*
+ * The first allocated vdev must be of type 'root'.
+ */
+ if (ops != &vdev_root_ops && spa->spa_root_vdev == NULL)
+ return (EINVAL);
+
+ vd = vdev_alloc_common(spa, id, guid, ops);
+
+ if (nvlist_lookup_string(nv, ZPOOL_CONFIG_PATH, &vd->vdev_path) == 0)
+ vd->vdev_path = spa_strdup(vd->vdev_path);
+ if (nvlist_lookup_string(nv, ZPOOL_CONFIG_DEVID, &vd->vdev_devid) == 0)
+ vd->vdev_devid = spa_strdup(vd->vdev_devid);
+
+ /*
+ * Set the nparity propery for RAID-Z vdevs.
+ */
+ if (ops == &vdev_raidz_ops) {
+ if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NPARITY,
+ &vd->vdev_nparity) == 0) {
+ /*
+ * Currently, we can only support 2 parity devices.
+ */
+ if (vd->vdev_nparity > 2)
+ return (EINVAL);
+ /*
+ * Older versions can only support 1 parity device.
+ */
+ if (vd->vdev_nparity == 2 &&
+ spa_version(spa) < ZFS_VERSION_RAID6)
+ return (ENOTSUP);
+
+ } else {
+ /*
+ * We require the parity to be specified for SPAs that
+ * support multiple parity levels.
+ */
+ if (spa_version(spa) >= ZFS_VERSION_RAID6)
+ return (EINVAL);
+
+ /*
+ * Otherwise, we default to 1 parity device for RAID-Z.
+ */
+ vd->vdev_nparity = 1;
+ }
+ } else {
+ vd->vdev_nparity = 0;
+ }
+
+ /*
+ * Set the whole_disk property. If it's not specified, leave the value
+ * as -1.
+ */
+ if (nvlist_lookup_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
+ &vd->vdev_wholedisk) != 0)
+ vd->vdev_wholedisk = -1ULL;
+
+ /*
+ * Look for the 'not present' flag. This will only be set if the device
+ * was not present at the time of import.
+ */
+ (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT,
+ &vd->vdev_not_present);
+
+ /*
+ * Get the alignment requirement.
+ */
+ (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ASHIFT, &vd->vdev_ashift);
+
+ /*
+ * If we're a top-level vdev, try to load the allocation parameters.
+ */
+ if (parent && !parent->vdev_parent && alloctype == VDEV_ALLOC_LOAD) {
+ (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_METASLAB_ARRAY,
+ &vd->vdev_ms_array);
+ (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_METASLAB_SHIFT,
+ &vd->vdev_ms_shift);
+ (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_ASIZE,
+ &vd->vdev_asize);
+ }
+
+ /*
+ * If we're a leaf vdev, try to load the DTL object and offline state.
+ */
+ if (vd->vdev_ops->vdev_op_leaf && alloctype == VDEV_ALLOC_LOAD) {
+ (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_DTL,
+ &vd->vdev_dtl.smo_object);
+ (void) nvlist_lookup_uint64(nv, ZPOOL_CONFIG_OFFLINE,
+ &vd->vdev_offline);
+ }
+
+ /*
+ * Add ourselves to the parent's list of children.
+ */
+ vdev_add_child(parent, vd);
+
+ *vdp = vd;
+
+ return (0);
+}
+
+void
+vdev_free(vdev_t *vd)
+{
+ int c;
+
+ /*
+ * vdev_free() implies closing the vdev first. This is simpler than
+ * trying to ensure complicated semantics for all callers.
+ */
+ vdev_close(vd);
+
+ ASSERT(!list_link_active(&vd->vdev_dirty_node));
+
+ /*
+ * Free all children.
+ */
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_free(vd->vdev_child[c]);
+
+ ASSERT(vd->vdev_child == NULL);
+ ASSERT(vd->vdev_guid_sum == vd->vdev_guid);
+
+ /*
+ * Discard allocation state.
+ */
+ if (vd == vd->vdev_top)
+ vdev_metaslab_fini(vd);
+
+ ASSERT3U(vd->vdev_stat.vs_space, ==, 0);
+ ASSERT3U(vd->vdev_stat.vs_dspace, ==, 0);
+ ASSERT3U(vd->vdev_stat.vs_alloc, ==, 0);
+
+ /*
+ * Remove this vdev from its parent's child list.
+ */
+ vdev_remove_child(vd->vdev_parent, vd);
+
+ ASSERT(vd->vdev_parent == NULL);
+
+ vdev_free_common(vd);
+}
+
+/*
+ * Transfer top-level vdev state from svd to tvd.
+ */
+static void
+vdev_top_transfer(vdev_t *svd, vdev_t *tvd)
+{
+ spa_t *spa = svd->vdev_spa;
+ metaslab_t *msp;
+ vdev_t *vd;
+ int t;
+
+ ASSERT(tvd == tvd->vdev_top);
+
+ tvd->vdev_ms_array = svd->vdev_ms_array;
+ tvd->vdev_ms_shift = svd->vdev_ms_shift;
+ tvd->vdev_ms_count = svd->vdev_ms_count;
+
+ svd->vdev_ms_array = 0;
+ svd->vdev_ms_shift = 0;
+ svd->vdev_ms_count = 0;
+
+ tvd->vdev_mg = svd->vdev_mg;
+ tvd->vdev_ms = svd->vdev_ms;
+
+ svd->vdev_mg = NULL;
+ svd->vdev_ms = NULL;
+
+ if (tvd->vdev_mg != NULL)
+ tvd->vdev_mg->mg_vd = tvd;
+
+ tvd->vdev_stat.vs_alloc = svd->vdev_stat.vs_alloc;
+ tvd->vdev_stat.vs_space = svd->vdev_stat.vs_space;
+ tvd->vdev_stat.vs_dspace = svd->vdev_stat.vs_dspace;
+
+ svd->vdev_stat.vs_alloc = 0;
+ svd->vdev_stat.vs_space = 0;
+ svd->vdev_stat.vs_dspace = 0;
+
+ for (t = 0; t < TXG_SIZE; t++) {
+ while ((msp = txg_list_remove(&svd->vdev_ms_list, t)) != NULL)
+ (void) txg_list_add(&tvd->vdev_ms_list, msp, t);
+ while ((vd = txg_list_remove(&svd->vdev_dtl_list, t)) != NULL)
+ (void) txg_list_add(&tvd->vdev_dtl_list, vd, t);
+ if (txg_list_remove_this(&spa->spa_vdev_txg_list, svd, t))
+ (void) txg_list_add(&spa->spa_vdev_txg_list, tvd, t);
+ }
+
+ if (list_link_active(&svd->vdev_dirty_node)) {
+ vdev_config_clean(svd);
+ vdev_config_dirty(tvd);
+ }
+
+ tvd->vdev_reopen_wanted = svd->vdev_reopen_wanted;
+ svd->vdev_reopen_wanted = 0;
+
+ tvd->vdev_deflate_ratio = svd->vdev_deflate_ratio;
+ svd->vdev_deflate_ratio = 0;
+}
+
+static void
+vdev_top_update(vdev_t *tvd, vdev_t *vd)
+{
+ int c;
+
+ if (vd == NULL)
+ return;
+
+ vd->vdev_top = tvd;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_top_update(tvd, vd->vdev_child[c]);
+}
+
+/*
+ * Add a mirror/replacing vdev above an existing vdev.
+ */
+vdev_t *
+vdev_add_parent(vdev_t *cvd, vdev_ops_t *ops)
+{
+ spa_t *spa = cvd->vdev_spa;
+ vdev_t *pvd = cvd->vdev_parent;
+ vdev_t *mvd;
+
+ ASSERT(spa_config_held(spa, RW_WRITER));
+
+ mvd = vdev_alloc_common(spa, cvd->vdev_id, 0, ops);
+
+ mvd->vdev_asize = cvd->vdev_asize;
+ mvd->vdev_ashift = cvd->vdev_ashift;
+ mvd->vdev_state = cvd->vdev_state;
+
+ vdev_remove_child(pvd, cvd);
+ vdev_add_child(pvd, mvd);
+ cvd->vdev_id = mvd->vdev_children;
+ vdev_add_child(mvd, cvd);
+ vdev_top_update(cvd->vdev_top, cvd->vdev_top);
+
+ if (mvd == mvd->vdev_top)
+ vdev_top_transfer(cvd, mvd);
+
+ return (mvd);
+}
+
+/*
+ * Remove a 1-way mirror/replacing vdev from the tree.
+ */
+void
+vdev_remove_parent(vdev_t *cvd)
+{
+ vdev_t *mvd = cvd->vdev_parent;
+ vdev_t *pvd = mvd->vdev_parent;
+
+ ASSERT(spa_config_held(cvd->vdev_spa, RW_WRITER));
+
+ ASSERT(mvd->vdev_children == 1);
+ ASSERT(mvd->vdev_ops == &vdev_mirror_ops ||
+ mvd->vdev_ops == &vdev_replacing_ops ||
+ mvd->vdev_ops == &vdev_spare_ops);
+ cvd->vdev_ashift = mvd->vdev_ashift;
+
+ vdev_remove_child(mvd, cvd);
+ vdev_remove_child(pvd, mvd);
+ cvd->vdev_id = mvd->vdev_id;
+ vdev_add_child(pvd, cvd);
+ /*
+ * If we created a new toplevel vdev, then we need to change the child's
+ * vdev GUID to match the old toplevel vdev. Otherwise, we could have
+ * detached an offline device, and when we go to import the pool we'll
+ * think we have two toplevel vdevs, instead of a different version of
+ * the same toplevel vdev.
+ */
+ if (cvd->vdev_top == cvd) {
+ pvd->vdev_guid_sum -= cvd->vdev_guid;
+ cvd->vdev_guid_sum -= cvd->vdev_guid;
+ cvd->vdev_guid = mvd->vdev_guid;
+ cvd->vdev_guid_sum += mvd->vdev_guid;
+ pvd->vdev_guid_sum += cvd->vdev_guid;
+ }
+ vdev_top_update(cvd->vdev_top, cvd->vdev_top);
+
+ if (cvd == cvd->vdev_top)
+ vdev_top_transfer(mvd, cvd);
+
+ ASSERT(mvd->vdev_children == 0);
+ vdev_free(mvd);
+}
+
+int
+vdev_metaslab_init(vdev_t *vd, uint64_t txg)
+{
+ spa_t *spa = vd->vdev_spa;
+ objset_t *mos = spa->spa_meta_objset;
+ metaslab_class_t *mc = spa_metaslab_class_select(spa);
+ uint64_t m;
+ uint64_t oldc = vd->vdev_ms_count;
+ uint64_t newc = vd->vdev_asize >> vd->vdev_ms_shift;
+ metaslab_t **mspp;
+ int error;
+
+ if (vd->vdev_ms_shift == 0) /* not being allocated from yet */
+ return (0);
+
+ dprintf("%s oldc %llu newc %llu\n", vdev_description(vd), oldc, newc);
+
+ ASSERT(oldc <= newc);
+
+ if (vd->vdev_mg == NULL)
+ vd->vdev_mg = metaslab_group_create(mc, vd);
+
+ mspp = kmem_zalloc(newc * sizeof (*mspp), KM_SLEEP);
+
+ if (oldc != 0) {
+ bcopy(vd->vdev_ms, mspp, oldc * sizeof (*mspp));
+ kmem_free(vd->vdev_ms, oldc * sizeof (*mspp));
+ }
+
+ vd->vdev_ms = mspp;
+ vd->vdev_ms_count = newc;
+
+ for (m = oldc; m < newc; m++) {
+ space_map_obj_t smo = { 0, 0, 0 };
+ if (txg == 0) {
+ uint64_t object = 0;
+ error = dmu_read(mos, vd->vdev_ms_array,
+ m * sizeof (uint64_t), sizeof (uint64_t), &object);
+ if (error)
+ return (error);
+ if (object != 0) {
+ dmu_buf_t *db;
+ error = dmu_bonus_hold(mos, object, FTAG, &db);
+ if (error)
+ return (error);
+ ASSERT3U(db->db_size, ==, sizeof (smo));
+ bcopy(db->db_data, &smo, db->db_size);
+ ASSERT3U(smo.smo_object, ==, object);
+ dmu_buf_rele(db, FTAG);
+ }
+ }
+ vd->vdev_ms[m] = metaslab_init(vd->vdev_mg, &smo,
+ m << vd->vdev_ms_shift, 1ULL << vd->vdev_ms_shift, txg);
+ }
+
+ return (0);
+}
+
+void
+vdev_metaslab_fini(vdev_t *vd)
+{
+ uint64_t m;
+ uint64_t count = vd->vdev_ms_count;
+
+ if (vd->vdev_ms != NULL) {
+ for (m = 0; m < count; m++)
+ if (vd->vdev_ms[m] != NULL)
+ metaslab_fini(vd->vdev_ms[m]);
+ kmem_free(vd->vdev_ms, count * sizeof (metaslab_t *));
+ vd->vdev_ms = NULL;
+ }
+}
+
+/*
+ * Prepare a virtual device for access.
+ */
+int
+vdev_open(vdev_t *vd)
+{
+ int error;
+ int c;
+ uint64_t osize = 0;
+ uint64_t asize, psize;
+ uint64_t ashift = 0;
+
+ ASSERT(vd->vdev_state == VDEV_STATE_CLOSED ||
+ vd->vdev_state == VDEV_STATE_CANT_OPEN ||
+ vd->vdev_state == VDEV_STATE_OFFLINE);
+
+ if (vd->vdev_fault_mode == VDEV_FAULT_COUNT)
+ vd->vdev_fault_arg >>= 1;
+ else
+ vd->vdev_fault_mode = VDEV_FAULT_NONE;
+
+ vd->vdev_stat.vs_aux = VDEV_AUX_NONE;
+
+ if (vd->vdev_ops->vdev_op_leaf) {
+ vdev_cache_init(vd);
+ vdev_queue_init(vd);
+ vd->vdev_cache_active = B_TRUE;
+ }
+
+ if (vd->vdev_offline) {
+ ASSERT(vd->vdev_children == 0);
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_OFFLINE, VDEV_AUX_NONE);
+ return (ENXIO);
+ }
+
+ error = vd->vdev_ops->vdev_op_open(vd, &osize, &ashift);
+
+ if (zio_injection_enabled && error == 0)
+ error = zio_handle_device_injection(vd, ENXIO);
+
+ dprintf("%s = %d, osize %llu, state = %d\n",
+ vdev_description(vd), error, osize, vd->vdev_state);
+
+ if (error) {
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ vd->vdev_stat.vs_aux);
+ return (error);
+ }
+
+ vd->vdev_state = VDEV_STATE_HEALTHY;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ if (vd->vdev_child[c]->vdev_state != VDEV_STATE_HEALTHY) {
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_DEGRADED,
+ VDEV_AUX_NONE);
+ break;
+ }
+
+ osize = P2ALIGN(osize, (uint64_t)sizeof (vdev_label_t));
+
+ if (vd->vdev_children == 0) {
+ if (osize < SPA_MINDEVSIZE) {
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_TOO_SMALL);
+ return (EOVERFLOW);
+ }
+ psize = osize;
+ asize = osize - (VDEV_LABEL_START_SIZE + VDEV_LABEL_END_SIZE);
+ } else {
+ if (vd->vdev_parent != NULL && osize < SPA_MINDEVSIZE -
+ (VDEV_LABEL_START_SIZE + VDEV_LABEL_END_SIZE)) {
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_TOO_SMALL);
+ return (EOVERFLOW);
+ }
+ psize = 0;
+ asize = osize;
+ }
+
+ vd->vdev_psize = psize;
+
+ if (vd->vdev_asize == 0) {
+ /*
+ * This is the first-ever open, so use the computed values.
+ * For testing purposes, a higher ashift can be requested.
+ */
+ vd->vdev_asize = asize;
+ vd->vdev_ashift = MAX(ashift, vd->vdev_ashift);
+ } else {
+ /*
+ * Make sure the alignment requirement hasn't increased.
+ */
+ if (ashift > vd->vdev_top->vdev_ashift) {
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_BAD_LABEL);
+ return (EINVAL);
+ }
+
+ /*
+ * Make sure the device hasn't shrunk.
+ */
+ if (asize < vd->vdev_asize) {
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_BAD_LABEL);
+ return (EINVAL);
+ }
+
+ /*
+ * If all children are healthy and the asize has increased,
+ * then we've experienced dynamic LUN growth.
+ */
+ if (vd->vdev_state == VDEV_STATE_HEALTHY &&
+ asize > vd->vdev_asize) {
+ vd->vdev_asize = asize;
+ }
+ }
+
+ /*
+ * If this is a top-level vdev, compute the raidz-deflation
+ * ratio. Note, we hard-code in 128k (1<<17) because it is the
+ * current "typical" blocksize. Even if SPA_MAXBLOCKSIZE
+ * changes, this algorithm must never change, or we will
+ * inconsistently account for existing bp's.
+ */
+ if (vd->vdev_top == vd) {
+ vd->vdev_deflate_ratio = (1<<17) /
+ (vdev_psize_to_asize(vd, 1<<17) >> SPA_MINBLOCKSHIFT);
+ }
+
+ /*
+ * This allows the ZFS DE to close cases appropriately. If a device
+ * goes away and later returns, we want to close the associated case.
+ * But it's not enough to simply post this only when a device goes from
+ * CANT_OPEN -> HEALTHY. If we reboot the system and the device is
+ * back, we also need to close the case (otherwise we will try to replay
+ * it). So we have to post this notifier every time. Since this only
+ * occurs during pool open or error recovery, this should not be an
+ * issue.
+ */
+ zfs_post_ok(vd->vdev_spa, vd);
+
+ return (0);
+}
+
+/*
+ * Called once the vdevs are all opened, this routine validates the label
+ * contents. This needs to be done before vdev_load() so that we don't
+ * inadvertently do repair I/Os to the wrong device, and so that vdev_reopen()
+ * won't succeed if the device has been changed underneath.
+ *
+ * This function will only return failure if one of the vdevs indicates that it
+ * has since been destroyed or exported. This is only possible if
+ * /etc/zfs/zpool.cache was readonly at the time. Otherwise, the vdev state
+ * will be updated but the function will return 0.
+ */
+int
+vdev_validate(vdev_t *vd)
+{
+ spa_t *spa = vd->vdev_spa;
+ int c;
+ nvlist_t *label;
+ uint64_t guid;
+ uint64_t state;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ if (vdev_validate(vd->vdev_child[c]) != 0)
+ return (EBADF);
+
+ /*
+ * If the device has already failed, or was marked offline, don't do
+ * any further validation. Otherwise, label I/O will fail and we will
+ * overwrite the previous state.
+ */
+ if (vd->vdev_ops->vdev_op_leaf && !vdev_is_dead(vd)) {
+
+ if ((label = vdev_label_read_config(vd)) == NULL) {
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_BAD_LABEL);
+ return (0);
+ }
+
+ if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_GUID,
+ &guid) != 0 || guid != spa_guid(spa)) {
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ nvlist_free(label);
+ return (0);
+ }
+
+ if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID,
+ &guid) != 0 || guid != vd->vdev_guid) {
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ nvlist_free(label);
+ return (0);
+ }
+
+ if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_STATE,
+ &state) != 0) {
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ nvlist_free(label);
+ return (0);
+ }
+
+ nvlist_free(label);
+
+ if (spa->spa_load_state == SPA_LOAD_OPEN &&
+ state != POOL_STATE_ACTIVE)
+ return (EBADF);
+ }
+
+ /*
+ * If we were able to open and validate a vdev that was previously
+ * marked permanently unavailable, clear that state now.
+ */
+ if (vd->vdev_not_present)
+ vd->vdev_not_present = 0;
+
+ return (0);
+}
+
+/*
+ * Close a virtual device.
+ */
+void
+vdev_close(vdev_t *vd)
+{
+ vd->vdev_ops->vdev_op_close(vd);
+
+ if (vd->vdev_cache_active) {
+ vdev_cache_fini(vd);
+ vdev_queue_fini(vd);
+ vd->vdev_cache_active = B_FALSE;
+ }
+
+ /*
+ * We record the previous state before we close it, so that if we are
+ * doing a reopen(), we don't generate FMA ereports if we notice that
+ * it's still faulted.
+ */
+ vd->vdev_prevstate = vd->vdev_state;
+
+ if (vd->vdev_offline)
+ vd->vdev_state = VDEV_STATE_OFFLINE;
+ else
+ vd->vdev_state = VDEV_STATE_CLOSED;
+ vd->vdev_stat.vs_aux = VDEV_AUX_NONE;
+}
+
+void
+vdev_reopen(vdev_t *vd)
+{
+ spa_t *spa = vd->vdev_spa;
+
+ ASSERT(spa_config_held(spa, RW_WRITER));
+
+ vdev_close(vd);
+ (void) vdev_open(vd);
+
+ /*
+ * Call vdev_validate() here to make sure we have the same device.
+ * Otherwise, a device with an invalid label could be successfully
+ * opened in response to vdev_reopen().
+ *
+ * The downside to this is that if the user is simply experimenting by
+ * overwriting an entire disk, we'll fault the device rather than
+ * demonstrate self-healing capabilities. On the other hand, with
+ * proper FMA integration, the series of errors we'd see from the device
+ * would result in a faulted device anyway. Given that this doesn't
+ * model any real-world corruption, it's better to catch this here and
+ * correctly identify that the device has either changed beneath us, or
+ * is corrupted beyond recognition.
+ */
+ (void) vdev_validate(vd);
+
+ /*
+ * Reassess root vdev's health.
+ */
+ vdev_propagate_state(spa->spa_root_vdev);
+}
+
+int
+vdev_create(vdev_t *vd, uint64_t txg, boolean_t isreplacing)
+{
+ int error;
+
+ /*
+ * Normally, partial opens (e.g. of a mirror) are allowed.
+ * For a create, however, we want to fail the request if
+ * there are any components we can't open.
+ */
+ error = vdev_open(vd);
+
+ if (error || vd->vdev_state != VDEV_STATE_HEALTHY) {
+ vdev_close(vd);
+ return (error ? error : ENXIO);
+ }
+
+ /*
+ * Recursively initialize all labels.
+ */
+ if ((error = vdev_label_init(vd, txg, isreplacing ?
+ VDEV_LABEL_REPLACE : VDEV_LABEL_CREATE)) != 0) {
+ vdev_close(vd);
+ return (error);
+ }
+
+ return (0);
+}
+
+/*
+ * The is the latter half of vdev_create(). It is distinct because it
+ * involves initiating transactions in order to do metaslab creation.
+ * For creation, we want to try to create all vdevs at once and then undo it
+ * if anything fails; this is much harder if we have pending transactions.
+ */
+void
+vdev_init(vdev_t *vd, uint64_t txg)
+{
+ /*
+ * Aim for roughly 200 metaslabs per vdev.
+ */
+ vd->vdev_ms_shift = highbit(vd->vdev_asize / 200);
+ vd->vdev_ms_shift = MAX(vd->vdev_ms_shift, SPA_MAXBLOCKSHIFT);
+
+ /*
+ * Initialize the vdev's metaslabs. This can't fail because
+ * there's nothing to read when creating all new metaslabs.
+ */
+ VERIFY(vdev_metaslab_init(vd, txg) == 0);
+}
+
+void
+vdev_dirty(vdev_t *vd, int flags, void *arg, uint64_t txg)
+{
+ ASSERT(vd == vd->vdev_top);
+ ASSERT(ISP2(flags));
+
+ if (flags & VDD_METASLAB)
+ (void) txg_list_add(&vd->vdev_ms_list, arg, txg);
+
+ if (flags & VDD_DTL)
+ (void) txg_list_add(&vd->vdev_dtl_list, arg, txg);
+
+ (void) txg_list_add(&vd->vdev_spa->spa_vdev_txg_list, vd, txg);
+}
+
+void
+vdev_dtl_dirty(space_map_t *sm, uint64_t txg, uint64_t size)
+{
+ mutex_enter(sm->sm_lock);
+ if (!space_map_contains(sm, txg, size))
+ space_map_add(sm, txg, size);
+ mutex_exit(sm->sm_lock);
+}
+
+int
+vdev_dtl_contains(space_map_t *sm, uint64_t txg, uint64_t size)
+{
+ int dirty;
+
+ /*
+ * Quick test without the lock -- covers the common case that
+ * there are no dirty time segments.
+ */
+ if (sm->sm_space == 0)
+ return (0);
+
+ mutex_enter(sm->sm_lock);
+ dirty = space_map_contains(sm, txg, size);
+ mutex_exit(sm->sm_lock);
+
+ return (dirty);
+}
+
+/*
+ * Reassess DTLs after a config change or scrub completion.
+ */
+void
+vdev_dtl_reassess(vdev_t *vd, uint64_t txg, uint64_t scrub_txg, int scrub_done)
+{
+ spa_t *spa = vd->vdev_spa;
+ int c;
+
+ ASSERT(spa_config_held(spa, RW_WRITER));
+
+ if (vd->vdev_children == 0) {
+ mutex_enter(&vd->vdev_dtl_lock);
+ /*
+ * We're successfully scrubbed everything up to scrub_txg.
+ * Therefore, excise all old DTLs up to that point, then
+ * fold in the DTLs for everything we couldn't scrub.
+ */
+ if (scrub_txg != 0) {
+ space_map_excise(&vd->vdev_dtl_map, 0, scrub_txg);
+ space_map_union(&vd->vdev_dtl_map, &vd->vdev_dtl_scrub);
+ }
+ if (scrub_done)
+ space_map_vacate(&vd->vdev_dtl_scrub, NULL, NULL);
+ mutex_exit(&vd->vdev_dtl_lock);
+ if (txg != 0)
+ vdev_dirty(vd->vdev_top, VDD_DTL, vd, txg);
+ return;
+ }
+
+ /*
+ * Make sure the DTLs are always correct under the scrub lock.
+ */
+ if (vd == spa->spa_root_vdev)
+ mutex_enter(&spa->spa_scrub_lock);
+
+ mutex_enter(&vd->vdev_dtl_lock);
+ space_map_vacate(&vd->vdev_dtl_map, NULL, NULL);
+ space_map_vacate(&vd->vdev_dtl_scrub, NULL, NULL);
+ mutex_exit(&vd->vdev_dtl_lock);
+
+ for (c = 0; c < vd->vdev_children; c++) {
+ vdev_t *cvd = vd->vdev_child[c];
+ vdev_dtl_reassess(cvd, txg, scrub_txg, scrub_done);
+ mutex_enter(&vd->vdev_dtl_lock);
+ space_map_union(&vd->vdev_dtl_map, &cvd->vdev_dtl_map);
+ space_map_union(&vd->vdev_dtl_scrub, &cvd->vdev_dtl_scrub);
+ mutex_exit(&vd->vdev_dtl_lock);
+ }
+
+ if (vd == spa->spa_root_vdev)
+ mutex_exit(&spa->spa_scrub_lock);
+}
+
+static int
+vdev_dtl_load(vdev_t *vd)
+{
+ spa_t *spa = vd->vdev_spa;
+ space_map_obj_t *smo = &vd->vdev_dtl;
+ objset_t *mos = spa->spa_meta_objset;
+ dmu_buf_t *db;
+ int error;
+
+ ASSERT(vd->vdev_children == 0);
+
+ if (smo->smo_object == 0)
+ return (0);
+
+ if ((error = dmu_bonus_hold(mos, smo->smo_object, FTAG, &db)) != 0)
+ return (error);
+
+ ASSERT3U(db->db_size, ==, sizeof (*smo));
+ bcopy(db->db_data, smo, db->db_size);
+ dmu_buf_rele(db, FTAG);
+
+ mutex_enter(&vd->vdev_dtl_lock);
+ error = space_map_load(&vd->vdev_dtl_map, NULL, SM_ALLOC, smo, mos);
+ mutex_exit(&vd->vdev_dtl_lock);
+
+ return (error);
+}
+
+void
+vdev_dtl_sync(vdev_t *vd, uint64_t txg)
+{
+ spa_t *spa = vd->vdev_spa;
+ space_map_obj_t *smo = &vd->vdev_dtl;
+ space_map_t *sm = &vd->vdev_dtl_map;
+ objset_t *mos = spa->spa_meta_objset;
+ space_map_t smsync;
+ kmutex_t smlock;
+ dmu_buf_t *db;
+ dmu_tx_t *tx;
+
+ dprintf("%s in txg %llu pass %d\n",
+ vdev_description(vd), (u_longlong_t)txg, spa_sync_pass(spa));
+
+ tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
+
+ if (vd->vdev_detached) {
+ if (smo->smo_object != 0) {
+ int err = dmu_object_free(mos, smo->smo_object, tx);
+ ASSERT3U(err, ==, 0);
+ smo->smo_object = 0;
+ }
+ dmu_tx_commit(tx);
+ dprintf("detach %s committed in txg %llu\n",
+ vdev_description(vd), txg);
+ return;
+ }
+
+ if (smo->smo_object == 0) {
+ ASSERT(smo->smo_objsize == 0);
+ ASSERT(smo->smo_alloc == 0);
+ smo->smo_object = dmu_object_alloc(mos,
+ DMU_OT_SPACE_MAP, 1 << SPACE_MAP_BLOCKSHIFT,
+ DMU_OT_SPACE_MAP_HEADER, sizeof (*smo), tx);
+ ASSERT(smo->smo_object != 0);
+ vdev_config_dirty(vd->vdev_top);
+ }
+
+ mutex_init(&smlock, NULL, MUTEX_DEFAULT, NULL);
+
+ space_map_create(&smsync, sm->sm_start, sm->sm_size, sm->sm_shift,
+ &smlock);
+
+ mutex_enter(&smlock);
+
+ mutex_enter(&vd->vdev_dtl_lock);
+ space_map_walk(sm, space_map_add, &smsync);
+ mutex_exit(&vd->vdev_dtl_lock);
+
+ space_map_truncate(smo, mos, tx);
+ space_map_sync(&smsync, SM_ALLOC, smo, mos, tx);
+
+ space_map_destroy(&smsync);
+
+ mutex_exit(&smlock);
+ mutex_destroy(&smlock);
+
+ VERIFY(0 == dmu_bonus_hold(mos, smo->smo_object, FTAG, &db));
+ dmu_buf_will_dirty(db, tx);
+ ASSERT3U(db->db_size, ==, sizeof (*smo));
+ bcopy(smo, db->db_data, db->db_size);
+ dmu_buf_rele(db, FTAG);
+
+ dmu_tx_commit(tx);
+}
+
+void
+vdev_load(vdev_t *vd)
+{
+ int c;
+
+ /*
+ * Recursively load all children.
+ */
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_load(vd->vdev_child[c]);
+
+ /*
+ * If this is a top-level vdev, initialize its metaslabs.
+ */
+ if (vd == vd->vdev_top &&
+ (vd->vdev_ashift == 0 || vd->vdev_asize == 0 ||
+ vdev_metaslab_init(vd, 0) != 0))
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+
+ /*
+ * If this is a leaf vdev, load its DTL.
+ */
+ if (vd->vdev_ops->vdev_op_leaf && vdev_dtl_load(vd) != 0)
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+}
+
+/*
+ * This special case of vdev_spare() is used for hot spares. It's sole purpose
+ * it to set the vdev state for the associated vdev. To do this, we make sure
+ * that we can open the underlying device, then try to read the label, and make
+ * sure that the label is sane and that it hasn't been repurposed to another
+ * pool.
+ */
+int
+vdev_validate_spare(vdev_t *vd)
+{
+ nvlist_t *label;
+ uint64_t guid, version;
+ uint64_t state;
+
+ if ((label = vdev_label_read_config(vd)) == NULL) {
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ return (-1);
+ }
+
+ if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_VERSION, &version) != 0 ||
+ version > ZFS_VERSION ||
+ nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID, &guid) != 0 ||
+ guid != vd->vdev_guid ||
+ nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_STATE, &state) != 0) {
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+ nvlist_free(label);
+ return (-1);
+ }
+
+ spa_spare_add(vd);
+
+ /*
+ * We don't actually check the pool state here. If it's in fact in
+ * use by another pool, we update this fact on the fly when requested.
+ */
+ nvlist_free(label);
+ return (0);
+}
+
+void
+vdev_sync_done(vdev_t *vd, uint64_t txg)
+{
+ metaslab_t *msp;
+
+ dprintf("%s txg %llu\n", vdev_description(vd), txg);
+
+ while (msp = txg_list_remove(&vd->vdev_ms_list, TXG_CLEAN(txg)))
+ metaslab_sync_done(msp, txg);
+}
+
+void
+vdev_sync(vdev_t *vd, uint64_t txg)
+{
+ spa_t *spa = vd->vdev_spa;
+ vdev_t *lvd;
+ metaslab_t *msp;
+ dmu_tx_t *tx;
+
+ dprintf("%s txg %llu pass %d\n",
+ vdev_description(vd), (u_longlong_t)txg, spa_sync_pass(spa));
+
+ if (vd->vdev_ms_array == 0 && vd->vdev_ms_shift != 0) {
+ ASSERT(vd == vd->vdev_top);
+ tx = dmu_tx_create_assigned(spa->spa_dsl_pool, txg);
+ vd->vdev_ms_array = dmu_object_alloc(spa->spa_meta_objset,
+ DMU_OT_OBJECT_ARRAY, 0, DMU_OT_NONE, 0, tx);
+ ASSERT(vd->vdev_ms_array != 0);
+ vdev_config_dirty(vd);
+ dmu_tx_commit(tx);
+ }
+
+ while ((msp = txg_list_remove(&vd->vdev_ms_list, txg)) != NULL) {
+ metaslab_sync(msp, txg);
+ (void) txg_list_add(&vd->vdev_ms_list, msp, TXG_CLEAN(txg));
+ }
+
+ while ((lvd = txg_list_remove(&vd->vdev_dtl_list, txg)) != NULL)
+ vdev_dtl_sync(lvd, txg);
+
+ (void) txg_list_add(&spa->spa_vdev_txg_list, vd, TXG_CLEAN(txg));
+}
+
+uint64_t
+vdev_psize_to_asize(vdev_t *vd, uint64_t psize)
+{
+ return (vd->vdev_ops->vdev_op_asize(vd, psize));
+}
+
+void
+vdev_io_start(zio_t *zio)
+{
+ zio->io_vd->vdev_ops->vdev_op_io_start(zio);
+}
+
+void
+vdev_io_done(zio_t *zio)
+{
+ zio->io_vd->vdev_ops->vdev_op_io_done(zio);
+}
+
+const char *
+vdev_description(vdev_t *vd)
+{
+ if (vd == NULL || vd->vdev_ops == NULL)
+ return ("<unknown>");
+
+ if (vd->vdev_path != NULL)
+ return (vd->vdev_path);
+
+ if (vd->vdev_parent == NULL)
+ return (spa_name(vd->vdev_spa));
+
+ return (vd->vdev_ops->vdev_op_type);
+}
+
+int
+vdev_online(spa_t *spa, uint64_t guid)
+{
+ vdev_t *rvd, *vd;
+ uint64_t txg;
+
+ txg = spa_vdev_enter(spa);
+
+ rvd = spa->spa_root_vdev;
+
+ if ((vd = vdev_lookup_by_guid(rvd, guid)) == NULL)
+ return (spa_vdev_exit(spa, NULL, txg, ENODEV));
+
+ if (!vd->vdev_ops->vdev_op_leaf)
+ return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
+
+ dprintf("ONLINE: %s\n", vdev_description(vd));
+
+ vd->vdev_offline = B_FALSE;
+ vd->vdev_tmpoffline = B_FALSE;
+ vdev_reopen(vd->vdev_top);
+
+ vdev_config_dirty(vd->vdev_top);
+
+ (void) spa_vdev_exit(spa, NULL, txg, 0);
+
+ VERIFY(spa_scrub(spa, POOL_SCRUB_RESILVER, B_TRUE) == 0);
+
+ return (0);
+}
+
+int
+vdev_offline(spa_t *spa, uint64_t guid, int istmp)
+{
+ vdev_t *rvd, *vd;
+ uint64_t txg;
+
+ txg = spa_vdev_enter(spa);
+
+ rvd = spa->spa_root_vdev;
+
+ if ((vd = vdev_lookup_by_guid(rvd, guid)) == NULL)
+ return (spa_vdev_exit(spa, NULL, txg, ENODEV));
+
+ if (!vd->vdev_ops->vdev_op_leaf)
+ return (spa_vdev_exit(spa, NULL, txg, ENOTSUP));
+
+ dprintf("OFFLINE: %s\n", vdev_description(vd));
+
+ /*
+ * If the device isn't already offline, try to offline it.
+ */
+ if (!vd->vdev_offline) {
+ /*
+ * If this device's top-level vdev has a non-empty DTL,
+ * don't allow the device to be offlined.
+ *
+ * XXX -- make this more precise by allowing the offline
+ * as long as the remaining devices don't have any DTL holes.
+ */
+ if (vd->vdev_top->vdev_dtl_map.sm_space != 0)
+ return (spa_vdev_exit(spa, NULL, txg, EBUSY));
+
+ /*
+ * Offline this device and reopen its top-level vdev.
+ * If this action results in the top-level vdev becoming
+ * unusable, undo it and fail the request.
+ */
+ vd->vdev_offline = B_TRUE;
+ vdev_reopen(vd->vdev_top);
+ if (vdev_is_dead(vd->vdev_top)) {
+ vd->vdev_offline = B_FALSE;
+ vdev_reopen(vd->vdev_top);
+ return (spa_vdev_exit(spa, NULL, txg, EBUSY));
+ }
+ }
+
+ vd->vdev_tmpoffline = istmp;
+
+ vdev_config_dirty(vd->vdev_top);
+
+ return (spa_vdev_exit(spa, NULL, txg, 0));
+}
+
+/*
+ * Clear the error counts associated with this vdev. Unlike vdev_online() and
+ * vdev_offline(), we assume the spa config is locked. We also clear all
+ * children. If 'vd' is NULL, then the user wants to clear all vdevs.
+ */
+void
+vdev_clear(spa_t *spa, vdev_t *vd)
+{
+ int c;
+
+ if (vd == NULL)
+ vd = spa->spa_root_vdev;
+
+ vd->vdev_stat.vs_read_errors = 0;
+ vd->vdev_stat.vs_write_errors = 0;
+ vd->vdev_stat.vs_checksum_errors = 0;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_clear(spa, vd->vdev_child[c]);
+}
+
+int
+vdev_is_dead(vdev_t *vd)
+{
+ return (vd->vdev_state <= VDEV_STATE_CANT_OPEN);
+}
+
+int
+vdev_error_inject(vdev_t *vd, zio_t *zio)
+{
+ int error = 0;
+
+ if (vd->vdev_fault_mode == VDEV_FAULT_NONE)
+ return (0);
+
+ if (((1ULL << zio->io_type) & vd->vdev_fault_mask) == 0)
+ return (0);
+
+ switch (vd->vdev_fault_mode) {
+ case VDEV_FAULT_RANDOM:
+ if (spa_get_random(vd->vdev_fault_arg) == 0)
+ error = EIO;
+ break;
+
+ case VDEV_FAULT_COUNT:
+ if ((int64_t)--vd->vdev_fault_arg <= 0)
+ vd->vdev_fault_mode = VDEV_FAULT_NONE;
+ error = EIO;
+ break;
+ }
+
+ if (error != 0) {
+ dprintf("returning %d for type %d on %s state %d offset %llx\n",
+ error, zio->io_type, vdev_description(vd),
+ vd->vdev_state, zio->io_offset);
+ }
+
+ return (error);
+}
+
+/*
+ * Get statistics for the given vdev.
+ */
+void
+vdev_get_stats(vdev_t *vd, vdev_stat_t *vs)
+{
+ vdev_t *rvd = vd->vdev_spa->spa_root_vdev;
+ int c, t;
+
+ mutex_enter(&vd->vdev_stat_lock);
+ bcopy(&vd->vdev_stat, vs, sizeof (*vs));
+ vs->vs_timestamp = gethrtime() - vs->vs_timestamp;
+ vs->vs_state = vd->vdev_state;
+ vs->vs_rsize = vdev_get_rsize(vd);
+ mutex_exit(&vd->vdev_stat_lock);
+
+ /*
+ * If we're getting stats on the root vdev, aggregate the I/O counts
+ * over all top-level vdevs (i.e. the direct children of the root).
+ */
+ if (vd == rvd) {
+ for (c = 0; c < rvd->vdev_children; c++) {
+ vdev_t *cvd = rvd->vdev_child[c];
+ vdev_stat_t *cvs = &cvd->vdev_stat;
+
+ mutex_enter(&vd->vdev_stat_lock);
+ for (t = 0; t < ZIO_TYPES; t++) {
+ vs->vs_ops[t] += cvs->vs_ops[t];
+ vs->vs_bytes[t] += cvs->vs_bytes[t];
+ }
+ vs->vs_read_errors += cvs->vs_read_errors;
+ vs->vs_write_errors += cvs->vs_write_errors;
+ vs->vs_checksum_errors += cvs->vs_checksum_errors;
+ vs->vs_scrub_examined += cvs->vs_scrub_examined;
+ vs->vs_scrub_errors += cvs->vs_scrub_errors;
+ mutex_exit(&vd->vdev_stat_lock);
+ }
+ }
+}
+
+void
+vdev_stat_update(zio_t *zio)
+{
+ vdev_t *vd = zio->io_vd;
+ vdev_t *pvd;
+ uint64_t txg = zio->io_txg;
+ vdev_stat_t *vs = &vd->vdev_stat;
+ zio_type_t type = zio->io_type;
+ int flags = zio->io_flags;
+
+ if (zio->io_error == 0) {
+ if (!(flags & ZIO_FLAG_IO_BYPASS)) {
+ mutex_enter(&vd->vdev_stat_lock);
+ vs->vs_ops[type]++;
+ vs->vs_bytes[type] += zio->io_size;
+ mutex_exit(&vd->vdev_stat_lock);
+ }
+ if ((flags & ZIO_FLAG_IO_REPAIR) &&
+ zio->io_delegate_list == NULL) {
+ mutex_enter(&vd->vdev_stat_lock);
+ if (flags & ZIO_FLAG_SCRUB_THREAD)
+ vs->vs_scrub_repaired += zio->io_size;
+ else
+ vs->vs_self_healed += zio->io_size;
+ mutex_exit(&vd->vdev_stat_lock);
+ }
+ return;
+ }
+
+ if (flags & ZIO_FLAG_SPECULATIVE)
+ return;
+
+ if (!vdev_is_dead(vd)) {
+ mutex_enter(&vd->vdev_stat_lock);
+ if (type == ZIO_TYPE_READ) {
+ if (zio->io_error == ECKSUM)
+ vs->vs_checksum_errors++;
+ else
+ vs->vs_read_errors++;
+ }
+ if (type == ZIO_TYPE_WRITE)
+ vs->vs_write_errors++;
+ mutex_exit(&vd->vdev_stat_lock);
+ }
+
+ if (type == ZIO_TYPE_WRITE) {
+ if (txg == 0 || vd->vdev_children != 0)
+ return;
+ if (flags & ZIO_FLAG_SCRUB_THREAD) {
+ ASSERT(flags & ZIO_FLAG_IO_REPAIR);
+ for (pvd = vd; pvd != NULL; pvd = pvd->vdev_parent)
+ vdev_dtl_dirty(&pvd->vdev_dtl_scrub, txg, 1);
+ }
+ if (!(flags & ZIO_FLAG_IO_REPAIR)) {
+ if (vdev_dtl_contains(&vd->vdev_dtl_map, txg, 1))
+ return;
+ vdev_dirty(vd->vdev_top, VDD_DTL, vd, txg);
+ for (pvd = vd; pvd != NULL; pvd = pvd->vdev_parent)
+ vdev_dtl_dirty(&pvd->vdev_dtl_map, txg, 1);
+ }
+ }
+}
+
+void
+vdev_scrub_stat_update(vdev_t *vd, pool_scrub_type_t type, boolean_t complete)
+{
+ int c;
+ vdev_stat_t *vs = &vd->vdev_stat;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_scrub_stat_update(vd->vdev_child[c], type, complete);
+
+ mutex_enter(&vd->vdev_stat_lock);
+
+ if (type == POOL_SCRUB_NONE) {
+ /*
+ * Update completion and end time. Leave everything else alone
+ * so we can report what happened during the previous scrub.
+ */
+ vs->vs_scrub_complete = complete;
+ vs->vs_scrub_end = gethrestime_sec();
+ } else {
+ vs->vs_scrub_type = type;
+ vs->vs_scrub_complete = 0;
+ vs->vs_scrub_examined = 0;
+ vs->vs_scrub_repaired = 0;
+ vs->vs_scrub_errors = 0;
+ vs->vs_scrub_start = gethrestime_sec();
+ vs->vs_scrub_end = 0;
+ }
+
+ mutex_exit(&vd->vdev_stat_lock);
+}
+
+/*
+ * Update the in-core space usage stats for this vdev and the root vdev.
+ */
+void
+vdev_space_update(vdev_t *vd, int64_t space_delta, int64_t alloc_delta)
+{
+ ASSERT(vd == vd->vdev_top);
+ int64_t dspace_delta = space_delta;
+
+ do {
+ if (vd->vdev_ms_count) {
+ /*
+ * If this is a top-level vdev, apply the
+ * inverse of its psize-to-asize (ie. RAID-Z)
+ * space-expansion factor. We must calculate
+ * this here and not at the root vdev because
+ * the root vdev's psize-to-asize is simply the
+ * max of its childrens', thus not accurate
+ * enough for us.
+ */
+ ASSERT((dspace_delta & (SPA_MINBLOCKSIZE-1)) == 0);
+ dspace_delta = (dspace_delta >> SPA_MINBLOCKSHIFT) *
+ vd->vdev_deflate_ratio;
+ }
+
+ mutex_enter(&vd->vdev_stat_lock);
+ vd->vdev_stat.vs_space += space_delta;
+ vd->vdev_stat.vs_alloc += alloc_delta;
+ vd->vdev_stat.vs_dspace += dspace_delta;
+ mutex_exit(&vd->vdev_stat_lock);
+ } while ((vd = vd->vdev_parent) != NULL);
+}
+
+/*
+ * Mark a top-level vdev's config as dirty, placing it on the dirty list
+ * so that it will be written out next time the vdev configuration is synced.
+ * If the root vdev is specified (vdev_top == NULL), dirty all top-level vdevs.
+ */
+void
+vdev_config_dirty(vdev_t *vd)
+{
+ spa_t *spa = vd->vdev_spa;
+ vdev_t *rvd = spa->spa_root_vdev;
+ int c;
+
+ /*
+ * The dirty list is protected by the config lock. The caller must
+ * either hold the config lock as writer, or must be the sync thread
+ * (which holds the lock as reader). There's only one sync thread,
+ * so this is sufficient to ensure mutual exclusion.
+ */
+ ASSERT(spa_config_held(spa, RW_WRITER) ||
+ dsl_pool_sync_context(spa_get_dsl(spa)));
+
+ if (vd == rvd) {
+ for (c = 0; c < rvd->vdev_children; c++)
+ vdev_config_dirty(rvd->vdev_child[c]);
+ } else {
+ ASSERT(vd == vd->vdev_top);
+
+ if (!list_link_active(&vd->vdev_dirty_node))
+ list_insert_head(&spa->spa_dirty_list, vd);
+ }
+}
+
+void
+vdev_config_clean(vdev_t *vd)
+{
+ spa_t *spa = vd->vdev_spa;
+
+ ASSERT(spa_config_held(spa, RW_WRITER) ||
+ dsl_pool_sync_context(spa_get_dsl(spa)));
+
+ ASSERT(list_link_active(&vd->vdev_dirty_node));
+ list_remove(&spa->spa_dirty_list, vd);
+}
+
+void
+vdev_propagate_state(vdev_t *vd)
+{
+ vdev_t *rvd = vd->vdev_spa->spa_root_vdev;
+ int degraded = 0, faulted = 0;
+ int corrupted = 0;
+ int c;
+ vdev_t *child;
+
+ for (c = 0; c < vd->vdev_children; c++) {
+ child = vd->vdev_child[c];
+ if (child->vdev_state <= VDEV_STATE_CANT_OPEN)
+ faulted++;
+ else if (child->vdev_state == VDEV_STATE_DEGRADED)
+ degraded++;
+
+ if (child->vdev_stat.vs_aux == VDEV_AUX_CORRUPT_DATA)
+ corrupted++;
+ }
+
+ vd->vdev_ops->vdev_op_state_change(vd, faulted, degraded);
+
+ /*
+ * Root special: if there is a toplevel vdev that cannot be
+ * opened due to corrupted metadata, then propagate the root
+ * vdev's aux state as 'corrupt' rather than 'insufficient
+ * replicas'.
+ */
+ if (corrupted && vd == rvd && rvd->vdev_state == VDEV_STATE_CANT_OPEN)
+ vdev_set_state(rvd, B_FALSE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_CORRUPT_DATA);
+}
+
+/*
+ * Set a vdev's state. If this is during an open, we don't update the parent
+ * state, because we're in the process of opening children depth-first.
+ * Otherwise, we propagate the change to the parent.
+ *
+ * If this routine places a device in a faulted state, an appropriate ereport is
+ * generated.
+ */
+void
+vdev_set_state(vdev_t *vd, boolean_t isopen, vdev_state_t state, vdev_aux_t aux)
+{
+ uint64_t save_state;
+
+ if (state == vd->vdev_state) {
+ vd->vdev_stat.vs_aux = aux;
+ return;
+ }
+
+ save_state = vd->vdev_state;
+
+ vd->vdev_state = state;
+ vd->vdev_stat.vs_aux = aux;
+
+ if (state == VDEV_STATE_CANT_OPEN) {
+ /*
+ * If we fail to open a vdev during an import, we mark it as
+ * "not available", which signifies that it was never there to
+ * begin with. Failure to open such a device is not considered
+ * an error.
+ */
+ if (vd->vdev_spa->spa_load_state == SPA_LOAD_IMPORT &&
+ vd->vdev_ops->vdev_op_leaf)
+ vd->vdev_not_present = 1;
+
+ /*
+ * Post the appropriate ereport. If the 'prevstate' field is
+ * set to something other than VDEV_STATE_UNKNOWN, it indicates
+ * that this is part of a vdev_reopen(). In this case, we don't
+ * want to post the ereport if the device was already in the
+ * CANT_OPEN state beforehand.
+ */
+ if (vd->vdev_prevstate != state && !vd->vdev_not_present &&
+ vd != vd->vdev_spa->spa_root_vdev) {
+ const char *class;
+
+ switch (aux) {
+ case VDEV_AUX_OPEN_FAILED:
+ class = FM_EREPORT_ZFS_DEVICE_OPEN_FAILED;
+ break;
+ case VDEV_AUX_CORRUPT_DATA:
+ class = FM_EREPORT_ZFS_DEVICE_CORRUPT_DATA;
+ break;
+ case VDEV_AUX_NO_REPLICAS:
+ class = FM_EREPORT_ZFS_DEVICE_NO_REPLICAS;
+ break;
+ case VDEV_AUX_BAD_GUID_SUM:
+ class = FM_EREPORT_ZFS_DEVICE_BAD_GUID_SUM;
+ break;
+ case VDEV_AUX_TOO_SMALL:
+ class = FM_EREPORT_ZFS_DEVICE_TOO_SMALL;
+ break;
+ case VDEV_AUX_BAD_LABEL:
+ class = FM_EREPORT_ZFS_DEVICE_BAD_LABEL;
+ break;
+ default:
+ class = FM_EREPORT_ZFS_DEVICE_UNKNOWN;
+ }
+
+ zfs_ereport_post(class, vd->vdev_spa,
+ vd, NULL, save_state, 0);
+ }
+ }
+
+ if (isopen)
+ return;
+
+ if (vd->vdev_parent != NULL)
+ vdev_propagate_state(vd->vdev_parent);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c
new file mode 100644
index 0000000..b4fb960
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_cache.c
@@ -0,0 +1,394 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/vdev_impl.h>
+#include <sys/zio.h>
+
+/*
+ * Virtual device read-ahead caching.
+ *
+ * This file implements a simple LRU read-ahead cache. When the DMU reads
+ * a given block, it will often want other, nearby blocks soon thereafter.
+ * We take advantage of this by reading a larger disk region and caching
+ * the result. In the best case, this can turn 256 back-to-back 512-byte
+ * reads into a single 128k read followed by 255 cache hits; this reduces
+ * latency dramatically. In the worst case, it can turn an isolated 512-byte
+ * read into a 128k read, which doesn't affect latency all that much but is
+ * terribly wasteful of bandwidth. A more intelligent version of the cache
+ * could keep track of access patterns and not do read-ahead unless it sees
+ * at least two temporally close I/Os to the same region. It could also
+ * take advantage of semantic information about the I/O. And it could use
+ * something faster than an AVL tree; that was chosen solely for convenience.
+ *
+ * There are five cache operations: allocate, fill, read, write, evict.
+ *
+ * (1) Allocate. This reserves a cache entry for the specified region.
+ * We separate the allocate and fill operations so that multiple threads
+ * don't generate I/O for the same cache miss.
+ *
+ * (2) Fill. When the I/O for a cache miss completes, the fill routine
+ * places the data in the previously allocated cache entry.
+ *
+ * (3) Read. Read data from the cache.
+ *
+ * (4) Write. Update cache contents after write completion.
+ *
+ * (5) Evict. When allocating a new entry, we evict the oldest (LRU) entry
+ * if the total cache size exceeds zfs_vdev_cache_size.
+ */
+
+/*
+ * These tunables are for performance analysis.
+ */
+/*
+ * All i/os smaller than zfs_vdev_cache_max will be turned into
+ * 1<<zfs_vdev_cache_bshift byte reads by the vdev_cache (aka software
+ * track buffer. At most zfs_vdev_cache_size bytes will be kept in each
+ * vdev's vdev_cache.
+ */
+int zfs_vdev_cache_max = 1<<14;
+int zfs_vdev_cache_size = 10ULL << 20;
+int zfs_vdev_cache_bshift = 16;
+
+SYSCTL_DECL(_vfs_zfs_vdev);
+SYSCTL_NODE(_vfs_zfs_vdev, OID_AUTO, cache, CTLFLAG_RW, 0, "ZFS VDEV Cache");
+TUNABLE_INT("vfs.zfs.vdev.cache.max", &zfs_vdev_cache_max);
+SYSCTL_INT(_vfs_zfs_vdev_cache, OID_AUTO, max, CTLFLAG_RDTUN,
+ &zfs_vdev_cache_max, 0, "Maximum I/O request size that increase read size");
+TUNABLE_INT("vfs.zfs.vdev.cache.size", &zfs_vdev_cache_size);
+SYSCTL_INT(_vfs_zfs_vdev_cache, OID_AUTO, size, CTLFLAG_RDTUN,
+ &zfs_vdev_cache_size, 0, "Size of VDEV cache");
+
+#define VCBS (1 << zfs_vdev_cache_bshift)
+
+static int
+vdev_cache_offset_compare(const void *a1, const void *a2)
+{
+ const vdev_cache_entry_t *ve1 = a1;
+ const vdev_cache_entry_t *ve2 = a2;
+
+ if (ve1->ve_offset < ve2->ve_offset)
+ return (-1);
+ if (ve1->ve_offset > ve2->ve_offset)
+ return (1);
+ return (0);
+}
+
+static int
+vdev_cache_lastused_compare(const void *a1, const void *a2)
+{
+ const vdev_cache_entry_t *ve1 = a1;
+ const vdev_cache_entry_t *ve2 = a2;
+
+ if (ve1->ve_lastused < ve2->ve_lastused)
+ return (-1);
+ if (ve1->ve_lastused > ve2->ve_lastused)
+ return (1);
+
+ /*
+ * Among equally old entries, sort by offset to ensure uniqueness.
+ */
+ return (vdev_cache_offset_compare(a1, a2));
+}
+
+/*
+ * Evict the specified entry from the cache.
+ */
+static void
+vdev_cache_evict(vdev_cache_t *vc, vdev_cache_entry_t *ve)
+{
+ ASSERT(MUTEX_HELD(&vc->vc_lock));
+ ASSERT(ve->ve_fill_io == NULL);
+ ASSERT(ve->ve_data != NULL);
+
+ dprintf("evicting %p, off %llx, LRU %llu, age %lu, hits %u, stale %u\n",
+ vc, ve->ve_offset, ve->ve_lastused, lbolt - ve->ve_lastused,
+ ve->ve_hits, ve->ve_missed_update);
+
+ avl_remove(&vc->vc_lastused_tree, ve);
+ avl_remove(&vc->vc_offset_tree, ve);
+ zio_buf_free(ve->ve_data, VCBS);
+ kmem_free(ve, sizeof (vdev_cache_entry_t));
+}
+
+/*
+ * Allocate an entry in the cache. At the point we don't have the data,
+ * we're just creating a placeholder so that multiple threads don't all
+ * go off and read the same blocks.
+ */
+static vdev_cache_entry_t *
+vdev_cache_allocate(zio_t *zio)
+{
+ vdev_cache_t *vc = &zio->io_vd->vdev_cache;
+ uint64_t offset = P2ALIGN(zio->io_offset, VCBS);
+ vdev_cache_entry_t *ve;
+
+ ASSERT(MUTEX_HELD(&vc->vc_lock));
+
+ if (zfs_vdev_cache_size == 0)
+ return (NULL);
+
+ /*
+ * If adding a new entry would exceed the cache size,
+ * evict the oldest entry (LRU).
+ */
+ if ((avl_numnodes(&vc->vc_lastused_tree) << zfs_vdev_cache_bshift) >
+ zfs_vdev_cache_size) {
+ ve = avl_first(&vc->vc_lastused_tree);
+ if (ve->ve_fill_io != NULL) {
+ dprintf("can't evict in %p, still filling\n", vc);
+ return (NULL);
+ }
+ ASSERT(ve->ve_hits != 0);
+ vdev_cache_evict(vc, ve);
+ }
+
+ ve = kmem_zalloc(sizeof (vdev_cache_entry_t), KM_SLEEP);
+ ve->ve_offset = offset;
+ ve->ve_lastused = lbolt;
+ ve->ve_data = zio_buf_alloc(VCBS);
+
+ avl_add(&vc->vc_offset_tree, ve);
+ avl_add(&vc->vc_lastused_tree, ve);
+
+ return (ve);
+}
+
+static void
+vdev_cache_hit(vdev_cache_t *vc, vdev_cache_entry_t *ve, zio_t *zio)
+{
+ uint64_t cache_phase = P2PHASE(zio->io_offset, VCBS);
+
+ ASSERT(MUTEX_HELD(&vc->vc_lock));
+ ASSERT(ve->ve_fill_io == NULL);
+
+ if (ve->ve_lastused != lbolt) {
+ avl_remove(&vc->vc_lastused_tree, ve);
+ ve->ve_lastused = lbolt;
+ avl_add(&vc->vc_lastused_tree, ve);
+ }
+
+ ve->ve_hits++;
+ bcopy(ve->ve_data + cache_phase, zio->io_data, zio->io_size);
+}
+
+/*
+ * Fill a previously allocated cache entry with data.
+ */
+static void
+vdev_cache_fill(zio_t *zio)
+{
+ vdev_t *vd = zio->io_vd;
+ vdev_cache_t *vc = &vd->vdev_cache;
+ vdev_cache_entry_t *ve = zio->io_private;
+ zio_t *dio;
+
+ ASSERT(zio->io_size == VCBS);
+
+ /*
+ * Add data to the cache.
+ */
+ mutex_enter(&vc->vc_lock);
+
+ ASSERT(ve->ve_fill_io == zio);
+ ASSERT(ve->ve_offset == zio->io_offset);
+ ASSERT(ve->ve_data == zio->io_data);
+
+ ve->ve_fill_io = NULL;
+
+ /*
+ * Even if this cache line was invalidated by a missed write update,
+ * any reads that were queued up before the missed update are still
+ * valid, so we can satisfy them from this line before we evict it.
+ */
+ for (dio = zio->io_delegate_list; dio; dio = dio->io_delegate_next)
+ vdev_cache_hit(vc, ve, dio);
+
+ if (zio->io_error || ve->ve_missed_update)
+ vdev_cache_evict(vc, ve);
+
+ mutex_exit(&vc->vc_lock);
+
+ while ((dio = zio->io_delegate_list) != NULL) {
+ zio->io_delegate_list = dio->io_delegate_next;
+ dio->io_delegate_next = NULL;
+ dio->io_error = zio->io_error;
+ zio_next_stage(dio);
+ }
+}
+
+/*
+ * Read data from the cache. Returns 0 on cache hit, errno on a miss.
+ */
+int
+vdev_cache_read(zio_t *zio)
+{
+ vdev_cache_t *vc = &zio->io_vd->vdev_cache;
+ vdev_cache_entry_t *ve, ve_search;
+ uint64_t cache_offset = P2ALIGN(zio->io_offset, VCBS);
+ uint64_t cache_phase = P2PHASE(zio->io_offset, VCBS);
+ zio_t *fio;
+
+ ASSERT(zio->io_type == ZIO_TYPE_READ);
+
+ if (zio->io_flags & ZIO_FLAG_DONT_CACHE)
+ return (EINVAL);
+
+ if (zio->io_size > zfs_vdev_cache_max)
+ return (EOVERFLOW);
+
+ /*
+ * If the I/O straddles two or more cache blocks, don't cache it.
+ */
+ if (P2CROSS(zio->io_offset, zio->io_offset + zio->io_size - 1, VCBS))
+ return (EXDEV);
+
+ ASSERT(cache_phase + zio->io_size <= VCBS);
+
+ mutex_enter(&vc->vc_lock);
+
+ ve_search.ve_offset = cache_offset;
+ ve = avl_find(&vc->vc_offset_tree, &ve_search, NULL);
+
+ if (ve != NULL) {
+ if (ve->ve_missed_update) {
+ mutex_exit(&vc->vc_lock);
+ return (ESTALE);
+ }
+
+ if ((fio = ve->ve_fill_io) != NULL) {
+ zio->io_delegate_next = fio->io_delegate_list;
+ fio->io_delegate_list = zio;
+ zio_vdev_io_bypass(zio);
+ mutex_exit(&vc->vc_lock);
+ return (0);
+ }
+
+ vdev_cache_hit(vc, ve, zio);
+ zio_vdev_io_bypass(zio);
+
+ mutex_exit(&vc->vc_lock);
+ zio_next_stage(zio);
+ return (0);
+ }
+
+ ve = vdev_cache_allocate(zio);
+
+ if (ve == NULL) {
+ mutex_exit(&vc->vc_lock);
+ return (ENOMEM);
+ }
+
+ fio = zio_vdev_child_io(zio, NULL, zio->io_vd, cache_offset,
+ ve->ve_data, VCBS, ZIO_TYPE_READ, ZIO_PRIORITY_CACHE_FILL,
+ ZIO_FLAG_DONT_CACHE | ZIO_FLAG_DONT_PROPAGATE |
+ ZIO_FLAG_DONT_RETRY | ZIO_FLAG_NOBOOKMARK,
+ vdev_cache_fill, ve);
+
+ ve->ve_fill_io = fio;
+ fio->io_delegate_list = zio;
+ zio_vdev_io_bypass(zio);
+
+ mutex_exit(&vc->vc_lock);
+ zio_nowait(fio);
+
+ return (0);
+}
+
+/*
+ * Update cache contents upon write completion.
+ */
+void
+vdev_cache_write(zio_t *zio)
+{
+ vdev_cache_t *vc = &zio->io_vd->vdev_cache;
+ vdev_cache_entry_t *ve, ve_search;
+ uint64_t io_start = zio->io_offset;
+ uint64_t io_end = io_start + zio->io_size;
+ uint64_t min_offset = P2ALIGN(io_start, VCBS);
+ uint64_t max_offset = P2ROUNDUP(io_end, VCBS);
+ avl_index_t where;
+
+ ASSERT(zio->io_type == ZIO_TYPE_WRITE);
+
+ mutex_enter(&vc->vc_lock);
+
+ ve_search.ve_offset = min_offset;
+ ve = avl_find(&vc->vc_offset_tree, &ve_search, &where);
+
+ if (ve == NULL)
+ ve = avl_nearest(&vc->vc_offset_tree, where, AVL_AFTER);
+
+ while (ve != NULL && ve->ve_offset < max_offset) {
+ uint64_t start = MAX(ve->ve_offset, io_start);
+ uint64_t end = MIN(ve->ve_offset + VCBS, io_end);
+
+ if (ve->ve_fill_io != NULL) {
+ ve->ve_missed_update = 1;
+ } else {
+ bcopy((char *)zio->io_data + start - io_start,
+ ve->ve_data + start - ve->ve_offset, end - start);
+ }
+ ve = AVL_NEXT(&vc->vc_offset_tree, ve);
+ }
+ mutex_exit(&vc->vc_lock);
+}
+
+void
+vdev_cache_init(vdev_t *vd)
+{
+ vdev_cache_t *vc = &vd->vdev_cache;
+
+ mutex_init(&vc->vc_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ avl_create(&vc->vc_offset_tree, vdev_cache_offset_compare,
+ sizeof (vdev_cache_entry_t),
+ offsetof(struct vdev_cache_entry, ve_offset_node));
+
+ avl_create(&vc->vc_lastused_tree, vdev_cache_lastused_compare,
+ sizeof (vdev_cache_entry_t),
+ offsetof(struct vdev_cache_entry, ve_lastused_node));
+}
+
+void
+vdev_cache_fini(vdev_t *vd)
+{
+ vdev_cache_t *vc = &vd->vdev_cache;
+ vdev_cache_entry_t *ve;
+
+ mutex_enter(&vc->vc_lock);
+ while ((ve = avl_first(&vc->vc_offset_tree)) != NULL)
+ vdev_cache_evict(vc, ve);
+ mutex_exit(&vc->vc_lock);
+
+ avl_destroy(&vc->vc_offset_tree);
+ avl_destroy(&vc->vc_lastused_tree);
+
+ mutex_destroy(&vc->vc_lock);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
new file mode 100644
index 0000000..b965b1c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_disk.c
@@ -0,0 +1,363 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/vdev_disk.h>
+#include <sys/vdev_impl.h>
+#include <sys/fs/zfs.h>
+#include <sys/zio.h>
+#include <sys/sunldi.h>
+
+/*
+ * Virtual device vector for disks.
+ */
+
+extern ldi_ident_t zfs_li;
+
+typedef struct vdev_disk_buf {
+ buf_t vdb_buf;
+ zio_t *vdb_io;
+} vdev_disk_buf_t;
+
+static int
+vdev_disk_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift)
+{
+ vdev_disk_t *dvd;
+ struct dk_minfo dkm;
+ int error;
+
+ /*
+ * We must have a pathname, and it must be absolute.
+ */
+ if (vd->vdev_path == NULL || vd->vdev_path[0] != '/') {
+ vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
+ return (EINVAL);
+ }
+
+ dvd = vd->vdev_tsd = kmem_zalloc(sizeof (vdev_disk_t), KM_SLEEP);
+
+ /*
+ * When opening a disk device, we want to preserve the user's original
+ * intent. We always want to open the device by the path the user gave
+ * us, even if it is one of multiple paths to the save device. But we
+ * also want to be able to survive disks being removed/recabled.
+ * Therefore the sequence of opening devices is:
+ *
+ * 1. Try opening the device by path. For legacy pools without the
+ * 'whole_disk' property, attempt to fix the path by appending 's0'.
+ *
+ * 2. If the devid of the device matches the stored value, return
+ * success.
+ *
+ * 3. Otherwise, the device may have moved. Try opening the device
+ * by the devid instead.
+ *
+ */
+ if (vd->vdev_devid != NULL) {
+ if (ddi_devid_str_decode(vd->vdev_devid, &dvd->vd_devid,
+ &dvd->vd_minor) != 0) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
+ return (EINVAL);
+ }
+ }
+
+ error = EINVAL; /* presume failure */
+
+ if (vd->vdev_path != NULL) {
+ ddi_devid_t devid;
+
+ if (vd->vdev_wholedisk == -1ULL) {
+ size_t len = strlen(vd->vdev_path) + 3;
+ char *buf = kmem_alloc(len, KM_SLEEP);
+ ldi_handle_t lh;
+
+ (void) snprintf(buf, len, "%ss0", vd->vdev_path);
+
+ if (ldi_open_by_name(buf, spa_mode, kcred,
+ &lh, zfs_li) == 0) {
+ spa_strfree(vd->vdev_path);
+ vd->vdev_path = buf;
+ vd->vdev_wholedisk = 1ULL;
+ (void) ldi_close(lh, spa_mode, kcred);
+ } else {
+ kmem_free(buf, len);
+ }
+ }
+
+ error = ldi_open_by_name(vd->vdev_path, spa_mode, kcred,
+ &dvd->vd_lh, zfs_li);
+
+ /*
+ * Compare the devid to the stored value.
+ */
+ if (error == 0 && vd->vdev_devid != NULL &&
+ ldi_get_devid(dvd->vd_lh, &devid) == 0) {
+ if (ddi_devid_compare(devid, dvd->vd_devid) != 0) {
+ error = EINVAL;
+ (void) ldi_close(dvd->vd_lh, spa_mode, kcred);
+ dvd->vd_lh = NULL;
+ }
+ ddi_devid_free(devid);
+ }
+
+ /*
+ * If we succeeded in opening the device, but 'vdev_wholedisk'
+ * is not yet set, then this must be a slice.
+ */
+ if (error == 0 && vd->vdev_wholedisk == -1ULL)
+ vd->vdev_wholedisk = 0;
+ }
+
+ /*
+ * If we were unable to open by path, or the devid check fails, open by
+ * devid instead.
+ */
+ if (error != 0 && vd->vdev_devid != NULL)
+ error = ldi_open_by_devid(dvd->vd_devid, dvd->vd_minor,
+ spa_mode, kcred, &dvd->vd_lh, zfs_li);
+
+ if (error) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
+ return (error);
+ }
+
+ /*
+ * Determine the actual size of the device.
+ */
+ if (ldi_get_size(dvd->vd_lh, psize) != 0) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
+ return (EINVAL);
+ }
+
+ /*
+ * If we own the whole disk, try to enable disk write caching.
+ * We ignore errors because it's OK if we can't do it.
+ */
+ if (vd->vdev_wholedisk == 1) {
+ int wce = 1;
+ (void) ldi_ioctl(dvd->vd_lh, DKIOCSETWCE, (intptr_t)&wce,
+ FKIOCTL, kcred, NULL);
+ }
+
+ /*
+ * Determine the device's minimum transfer size.
+ * If the ioctl isn't supported, assume DEV_BSIZE.
+ */
+ if (ldi_ioctl(dvd->vd_lh, DKIOCGMEDIAINFO, (intptr_t)&dkm,
+ FKIOCTL, kcred, NULL) != 0)
+ dkm.dki_lbsize = DEV_BSIZE;
+
+ *ashift = highbit(MAX(dkm.dki_lbsize, SPA_MINBLOCKSIZE)) - 1;
+
+ /*
+ * Clear the nowritecache bit, so that on a vdev_reopen() we will
+ * try again.
+ */
+ vd->vdev_nowritecache = B_FALSE;
+
+ return (0);
+}
+
+static void
+vdev_disk_close(vdev_t *vd)
+{
+ vdev_disk_t *dvd = vd->vdev_tsd;
+
+ if (dvd == NULL)
+ return;
+
+ dprintf("removing disk %s, devid %s\n",
+ vd->vdev_path ? vd->vdev_path : "<none>",
+ vd->vdev_devid ? vd->vdev_devid : "<none>");
+
+ if (dvd->vd_minor != NULL)
+ ddi_devid_str_free(dvd->vd_minor);
+
+ if (dvd->vd_devid != NULL)
+ ddi_devid_free(dvd->vd_devid);
+
+ if (dvd->vd_lh != NULL)
+ (void) ldi_close(dvd->vd_lh, spa_mode, kcred);
+
+ kmem_free(dvd, sizeof (vdev_disk_t));
+ vd->vdev_tsd = NULL;
+}
+
+static void
+vdev_disk_io_intr(buf_t *bp)
+{
+ vdev_disk_buf_t *vdb = (vdev_disk_buf_t *)bp;
+ zio_t *zio = vdb->vdb_io;
+
+ if ((zio->io_error = geterror(bp)) == 0 && bp->b_resid != 0)
+ zio->io_error = EIO;
+
+ kmem_free(vdb, sizeof (vdev_disk_buf_t));
+
+ zio_next_stage_async(zio);
+}
+
+static void
+vdev_disk_ioctl_done(void *zio_arg, int error)
+{
+ zio_t *zio = zio_arg;
+
+ zio->io_error = error;
+
+ zio_next_stage_async(zio);
+}
+
+static void
+vdev_disk_io_start(zio_t *zio)
+{
+ vdev_t *vd = zio->io_vd;
+ vdev_disk_t *dvd = vd->vdev_tsd;
+ vdev_disk_buf_t *vdb;
+ buf_t *bp;
+ int flags, error;
+
+ if (zio->io_type == ZIO_TYPE_IOCTL) {
+ zio_vdev_io_bypass(zio);
+
+ /* XXPOLICY */
+ if (vdev_is_dead(vd)) {
+ zio->io_error = ENXIO;
+ zio_next_stage_async(zio);
+ return;
+ }
+
+ switch (zio->io_cmd) {
+
+ case DKIOCFLUSHWRITECACHE:
+
+ if (zfs_nocacheflush)
+ break;
+
+ if (vd->vdev_nowritecache) {
+ zio->io_error = ENOTSUP;
+ break;
+ }
+
+ zio->io_dk_callback.dkc_callback = vdev_disk_ioctl_done;
+ zio->io_dk_callback.dkc_cookie = zio;
+
+ error = ldi_ioctl(dvd->vd_lh, zio->io_cmd,
+ (uintptr_t)&zio->io_dk_callback,
+ FKIOCTL, kcred, NULL);
+
+ if (error == 0) {
+ /*
+ * The ioctl will be done asychronously,
+ * and will call vdev_disk_ioctl_done()
+ * upon completion.
+ */
+ return;
+ } else if (error == ENOTSUP) {
+ /*
+ * If we get ENOTSUP, we know that no future
+ * attempts will ever succeed. In this case we
+ * set a persistent bit so that we don't bother
+ * with the ioctl in the future.
+ */
+ vd->vdev_nowritecache = B_TRUE;
+ }
+ zio->io_error = error;
+
+ break;
+
+ default:
+ zio->io_error = ENOTSUP;
+ }
+
+ zio_next_stage_async(zio);
+ return;
+ }
+
+ if (zio->io_type == ZIO_TYPE_READ && vdev_cache_read(zio) == 0)
+ return;
+
+ if ((zio = vdev_queue_io(zio)) == NULL)
+ return;
+
+ flags = (zio->io_type == ZIO_TYPE_READ ? B_READ : B_WRITE);
+ flags |= B_BUSY | B_NOCACHE;
+ if (zio->io_flags & ZIO_FLAG_FAILFAST)
+ flags |= B_FAILFAST;
+
+ vdb = kmem_alloc(sizeof (vdev_disk_buf_t), KM_SLEEP);
+
+ vdb->vdb_io = zio;
+ bp = &vdb->vdb_buf;
+
+ bioinit(bp);
+ bp->b_flags = flags;
+ bp->b_bcount = zio->io_size;
+ bp->b_un.b_addr = zio->io_data;
+ bp->b_lblkno = lbtodb(zio->io_offset);
+ bp->b_bufsize = zio->io_size;
+ bp->b_iodone = (int (*)())vdev_disk_io_intr;
+
+ /* XXPOLICY */
+ error = vdev_is_dead(vd) ? ENXIO : vdev_error_inject(vd, zio);
+ if (error) {
+ zio->io_error = error;
+ bioerror(bp, error);
+ bp->b_resid = bp->b_bcount;
+ bp->b_iodone(bp);
+ return;
+ }
+
+ error = ldi_strategy(dvd->vd_lh, bp);
+ /* ldi_strategy() will return non-zero only on programming errors */
+ ASSERT(error == 0);
+}
+
+static void
+vdev_disk_io_done(zio_t *zio)
+{
+ vdev_queue_io_done(zio);
+
+ if (zio->io_type == ZIO_TYPE_WRITE)
+ vdev_cache_write(zio);
+
+ if (zio_injection_enabled && zio->io_error == 0)
+ zio->io_error = zio_handle_device_injection(zio->io_vd, EIO);
+
+ zio_next_stage(zio);
+}
+
+vdev_ops_t vdev_disk_ops = {
+ vdev_disk_open,
+ vdev_disk_close,
+ vdev_default_asize,
+ vdev_disk_io_start,
+ vdev_disk_io_done,
+ NULL,
+ VDEV_TYPE_DISK, /* name of this vdev type */
+ B_TRUE /* leaf vdev */
+};
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c
new file mode 100644
index 0000000..b8e79f8
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_file.c
@@ -0,0 +1,225 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/vdev_file.h>
+#include <sys/vdev_impl.h>
+#include <sys/zio.h>
+#include <sys/fs/zfs.h>
+
+/*
+ * Virtual device vector for files.
+ */
+
+static int
+vdev_file_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift)
+{
+ vdev_file_t *vf;
+ vnode_t *vp;
+ vattr_t vattr;
+ int error;
+
+ /*
+ * We must have a pathname, and it must be absolute.
+ */
+ if (vd->vdev_path == NULL || vd->vdev_path[0] != '/') {
+ vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
+ return (EINVAL);
+ }
+
+ vf = vd->vdev_tsd = kmem_zalloc(sizeof (vdev_file_t), KM_SLEEP);
+
+ /*
+ * We always open the files from the root of the global zone, even if
+ * we're in a local zone. If the user has gotten to this point, the
+ * administrator has already decided that the pool should be available
+ * to local zone users, so the underlying devices should be as well.
+ */
+ ASSERT(vd->vdev_path != NULL && vd->vdev_path[0] == '/');
+ error = vn_openat(vd->vdev_path + 1, UIO_SYSSPACE, spa_mode | FOFFMAX,
+ 0, &vp, 0, 0, rootdir);
+
+ if (error) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
+ return (error);
+ }
+
+ vf->vf_vnode = vp;
+
+#ifdef _KERNEL
+ /*
+ * Make sure it's a regular file.
+ */
+ if (vp->v_type != VREG) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
+ return (ENODEV);
+ }
+#endif
+
+ /*
+ * Determine the physical size of the file.
+ */
+ vattr.va_mask = AT_SIZE;
+ error = VOP_GETATTR(vp, &vattr, 0, kcred);
+ if (error) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
+ return (error);
+ }
+
+ *psize = vattr.va_size;
+ *ashift = SPA_MINBLOCKSHIFT;
+
+ return (0);
+}
+
+static void
+vdev_file_close(vdev_t *vd)
+{
+ vdev_file_t *vf = vd->vdev_tsd;
+
+ if (vf == NULL)
+ return;
+
+ if (vf->vf_vnode != NULL) {
+ (void) VOP_PUTPAGE(vf->vf_vnode, 0, 0, B_INVAL, kcred);
+ (void) VOP_CLOSE(vf->vf_vnode, spa_mode, 1, 0, kcred);
+ VN_RELE(vf->vf_vnode);
+ }
+
+ kmem_free(vf, sizeof (vdev_file_t));
+ vd->vdev_tsd = NULL;
+}
+
+static void
+vdev_file_io_start(zio_t *zio)
+{
+ vdev_t *vd = zio->io_vd;
+ vdev_file_t *vf = vd->vdev_tsd;
+ ssize_t resid;
+ int error;
+
+ if (zio->io_type == ZIO_TYPE_IOCTL) {
+ zio_vdev_io_bypass(zio);
+
+ /* XXPOLICY */
+ if (vdev_is_dead(vd)) {
+ zio->io_error = ENXIO;
+ zio_next_stage_async(zio);
+ return;
+ }
+
+ switch (zio->io_cmd) {
+ case DKIOCFLUSHWRITECACHE:
+ zio->io_error = VOP_FSYNC(vf->vf_vnode, FSYNC | FDSYNC,
+ kcred);
+ dprintf("fsync(%s) = %d\n", vdev_description(vd),
+ zio->io_error);
+ break;
+ default:
+ zio->io_error = ENOTSUP;
+ }
+
+ zio_next_stage_async(zio);
+ return;
+ }
+
+ /*
+ * In the kernel, don't bother double-caching, but in userland,
+ * we want to test the vdev_cache code.
+ */
+#ifndef _KERNEL
+ if (zio->io_type == ZIO_TYPE_READ && vdev_cache_read(zio) == 0)
+ return;
+#endif
+
+ if ((zio = vdev_queue_io(zio)) == NULL)
+ return;
+
+ /* XXPOLICY */
+ error = vdev_is_dead(vd) ? ENXIO : vdev_error_inject(vd, zio);
+ if (error) {
+ zio->io_error = error;
+ zio_next_stage_async(zio);
+ return;
+ }
+
+ zio->io_error = vn_rdwr(zio->io_type == ZIO_TYPE_READ ?
+ UIO_READ : UIO_WRITE, vf->vf_vnode, zio->io_data,
+ zio->io_size, zio->io_offset, UIO_SYSSPACE,
+ 0, RLIM64_INFINITY, kcred, &resid);
+
+ if (resid != 0 && zio->io_error == 0)
+ zio->io_error = ENOSPC;
+
+ zio_next_stage_async(zio);
+}
+
+static void
+vdev_file_io_done(zio_t *zio)
+{
+ vdev_queue_io_done(zio);
+
+#ifndef _KERNEL
+ if (zio->io_type == ZIO_TYPE_WRITE)
+ vdev_cache_write(zio);
+#endif
+
+ if (zio_injection_enabled && zio->io_error == 0)
+ zio->io_error = zio_handle_device_injection(zio->io_vd, EIO);
+
+ zio_next_stage(zio);
+}
+
+vdev_ops_t vdev_file_ops = {
+ vdev_file_open,
+ vdev_file_close,
+ vdev_default_asize,
+ vdev_file_io_start,
+ vdev_file_io_done,
+ NULL,
+ VDEV_TYPE_FILE, /* name of this vdev type */
+ B_TRUE /* leaf vdev */
+};
+
+/*
+ * From userland we access disks just like files.
+ */
+#ifndef _KERNEL
+
+vdev_ops_t vdev_disk_ops = {
+ vdev_file_open,
+ vdev_file_close,
+ vdev_default_asize,
+ vdev_file_io_start,
+ vdev_file_io_done,
+ NULL,
+ VDEV_TYPE_DISK, /* name of this vdev type */
+ B_TRUE /* leaf vdev */
+};
+
+#endif
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
new file mode 100644
index 0000000..7c87963
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
@@ -0,0 +1,583 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (c) 2006 Pawel Jakub Dawidek <pjd@FreeBSD.org>
+ * All rights reserved.
+ */
+
+#include <sys/zfs_context.h>
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/bio.h>
+#include <sys/disk.h>
+#include <sys/spa.h>
+#include <sys/vdev_impl.h>
+#include <sys/fs/zfs.h>
+#include <sys/zio.h>
+#include <geom/geom.h>
+#include <geom/geom_int.h>
+
+/*
+ * Virtual device vector for GEOM.
+ */
+
+struct g_class zfs_vdev_class = {
+ .name = "ZFS::VDEV",
+ .version = G_VERSION,
+};
+
+DECLARE_GEOM_CLASS(zfs_vdev_class, zfs_vdev);
+
+typedef struct vdev_geom_ctx {
+ struct g_consumer *gc_consumer;
+ int gc_state;
+ struct bio_queue_head gc_queue;
+ struct mtx gc_queue_mtx;
+} vdev_geom_ctx_t;
+
+static void
+vdev_geom_release(vdev_t *vd)
+{
+ vdev_geom_ctx_t *ctx;
+
+ ctx = vd->vdev_tsd;
+ vd->vdev_tsd = NULL;
+
+ mtx_lock(&ctx->gc_queue_mtx);
+ ctx->gc_state = 1;
+ wakeup_one(&ctx->gc_queue);
+ while (ctx->gc_state != 2)
+ msleep(&ctx->gc_state, &ctx->gc_queue_mtx, 0, "vgeom:w", 0);
+ mtx_unlock(&ctx->gc_queue_mtx);
+ mtx_destroy(&ctx->gc_queue_mtx);
+ kmem_free(ctx, sizeof(*ctx));
+}
+
+static void
+vdev_geom_orphan(struct g_consumer *cp)
+{
+ struct g_geom *gp;
+ vdev_t *vd;
+ int error;
+
+ g_topology_assert();
+
+ vd = cp->private;
+ gp = cp->geom;
+ error = cp->provider->error;
+
+ ZFS_LOG(1, "Closing access to %s.", cp->provider->name);
+ if (cp->acr + cp->acw + cp->ace > 0)
+ g_access(cp, -cp->acr, -cp->acw, -cp->ace);
+ ZFS_LOG(1, "Destroyed consumer to %s.", cp->provider->name);
+ g_detach(cp);
+ g_destroy_consumer(cp);
+ /* Destroy geom if there are no consumers left. */
+ if (LIST_EMPTY(&gp->consumer)) {
+ ZFS_LOG(1, "Destroyed geom %s.", gp->name);
+ g_wither_geom(gp, error);
+ }
+ vdev_geom_release(vd);
+ /* Both methods below work, but in a bit different way. */
+#if 0
+ vd->vdev_reopen_wanted = 1;
+#else
+ vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
+ vdev_set_state(vd, B_TRUE, VDEV_STATE_CANT_OPEN, vd->vdev_stat.vs_aux);
+#endif
+}
+
+static struct g_consumer *
+vdev_geom_attach(struct g_provider *pp, int write)
+{
+ struct g_geom *gp;
+ struct g_consumer *cp;
+
+ g_topology_assert();
+
+ ZFS_LOG(1, "Attaching to %s.", pp->name);
+ /* Do we have geom already? No? Create one. */
+ LIST_FOREACH(gp, &zfs_vdev_class.geom, geom) {
+ if (gp->flags & G_GEOM_WITHER)
+ continue;
+ if (strcmp(gp->name, "zfs::vdev") != 0)
+ continue;
+ break;
+ }
+ if (gp == NULL) {
+ gp = g_new_geomf(&zfs_vdev_class, "zfs::vdev");
+ gp->orphan = vdev_geom_orphan;
+ cp = g_new_consumer(gp);
+ if (g_attach(cp, pp) != 0) {
+ g_wither_geom(gp, ENXIO);
+ return (NULL);
+ }
+ if (g_access(cp, 1, write, 1) != 0) {
+ g_wither_geom(gp, ENXIO);
+ return (NULL);
+ }
+ ZFS_LOG(1, "Created geom and consumer for %s.", pp->name);
+ } else {
+ /* Check if we are already connected to this provider. */
+ LIST_FOREACH(cp, &gp->consumer, consumer) {
+ if (cp->provider == pp) {
+ ZFS_LOG(1, "Found consumer for %s.", pp->name);
+ break;
+ }
+ }
+ if (cp == NULL) {
+ cp = g_new_consumer(gp);
+ if (g_attach(cp, pp) != 0) {
+ g_destroy_consumer(cp);
+ return (NULL);
+ }
+ if (g_access(cp, 1, write, 1) != 0) {
+ g_detach(cp);
+ g_destroy_consumer(cp);
+ return (NULL);
+ }
+ ZFS_LOG(1, "Created consumer for %s.", pp->name);
+ } else {
+ if (g_access(cp, 1, cp->acw > 0 ? 0 : write, 1) != 0)
+ return (NULL);
+ ZFS_LOG(1, "Used existing consumer for %s.", pp->name);
+ }
+ }
+ return (cp);
+}
+
+static void
+vdev_geom_detach(void *arg, int flag __unused)
+{
+ struct g_geom *gp;
+ struct g_consumer *cp;
+
+ g_topology_assert();
+ cp = arg;
+ gp = cp->geom;
+
+ ZFS_LOG(1, "Closing access to %s.", cp->provider->name);
+ g_access(cp, -1, 0, -1);
+ /* Destroy consumer on last close. */
+ if (cp->acr == 0 && cp->ace == 0) {
+ ZFS_LOG(1, "Destroyed consumer to %s.", cp->provider->name);
+ if (cp->acw > 0)
+ g_access(cp, 0, -cp->acw, 0);
+ g_detach(cp);
+ g_destroy_consumer(cp);
+ }
+ /* Destroy geom if there are no consumers left. */
+ if (LIST_EMPTY(&gp->consumer)) {
+ ZFS_LOG(1, "Destroyed geom %s.", gp->name);
+ g_wither_geom(gp, ENXIO);
+ }
+}
+
+static void
+vdev_geom_worker(void *arg)
+{
+ vdev_geom_ctx_t *ctx;
+ zio_t *zio;
+ struct bio *bp;
+
+ ctx = arg;
+ for (;;) {
+ mtx_lock(&ctx->gc_queue_mtx);
+ bp = bioq_takefirst(&ctx->gc_queue);
+ if (bp == NULL) {
+ if (ctx->gc_state == 1) {
+ ctx->gc_state = 2;
+ wakeup_one(&ctx->gc_state);
+ mtx_unlock(&ctx->gc_queue_mtx);
+ kthread_exit(0);
+ }
+ msleep(&ctx->gc_queue, &ctx->gc_queue_mtx,
+ PRIBIO | PDROP, "vgeom:io", 0);
+ continue;
+ }
+ mtx_unlock(&ctx->gc_queue_mtx);
+ zio = bp->bio_caller1;
+ zio->io_error = bp->bio_error;
+ if (bp->bio_cmd == BIO_FLUSH && bp->bio_error == ENOTSUP) {
+ vdev_t *vd;
+
+ /*
+ * If we get ENOTSUP, we know that no future
+ * attempts will ever succeed. In this case we
+ * set a persistent bit so that we don't bother
+ * with the ioctl in the future.
+ */
+ vd = zio->io_vd;
+ vd->vdev_nowritecache = B_TRUE;
+ }
+ g_destroy_bio(bp);
+ zio_next_stage_async(zio);
+ }
+}
+
+static char *
+vdev_geom_get_id(struct g_consumer *cp)
+{
+ char *id;
+ int len;
+
+ g_topology_assert_not();
+ len = DISK_IDENT_SIZE;
+ id = kmem_zalloc(len, KM_SLEEP);
+ if (g_io_getattr("GEOM::ident", cp, &len, id) != 0) {
+ kmem_free(id, DISK_IDENT_SIZE);
+ return (NULL);
+ }
+ return (id);
+}
+
+static void
+vdev_geom_free_id(char *id)
+{
+
+ if (id != NULL)
+ kmem_free(id, DISK_IDENT_SIZE);
+}
+
+struct vdev_geom_find {
+ const char *id;
+ int write;
+ struct g_consumer *cp;
+};
+
+static void
+vdev_geom_taste_orphan(struct g_consumer *cp)
+{
+
+ KASSERT(1 == 0, ("%s called while tasting %s.", __func__,
+ cp->provider->name));
+}
+
+static void
+vdev_geom_attach_by_id_event(void *arg, int flags __unused)
+{
+ struct vdev_geom_find *ap;
+ struct g_class *mp;
+ struct g_geom *gp, *zgp;
+ struct g_provider *pp;
+ struct g_consumer *zcp;
+ char *id;
+
+ g_topology_assert();
+
+ ap = arg;
+
+ zgp = g_new_geomf(&zfs_vdev_class, "zfs::vdev::taste");
+ /* This orphan function should be never called. */
+ zgp->orphan = vdev_geom_taste_orphan;
+ zcp = g_new_consumer(zgp);
+
+ LIST_FOREACH(mp, &g_classes, class) {
+ if (mp == &zfs_vdev_class)
+ continue;
+ LIST_FOREACH(gp, &mp->geom, geom) {
+ if (gp->flags & G_GEOM_WITHER)
+ continue;
+ LIST_FOREACH(pp, &gp->provider, provider) {
+ if (pp->flags & G_PF_WITHER)
+ continue;
+ g_attach(zcp, pp);
+ if (g_access(zcp, 1, 0, 0) != 0) {
+ g_detach(zcp);
+ continue;
+ }
+ g_topology_unlock();
+ id = vdev_geom_get_id(zcp);
+ g_topology_lock();
+ g_access(zcp, -1, 0, 0);
+ g_detach(zcp);
+ if (id == NULL || strcmp(id, ap->id) != 0) {
+ vdev_geom_free_id(id);
+ continue;
+ }
+ vdev_geom_free_id(id);
+ ap->cp = vdev_geom_attach(pp, ap->write);
+ if (ap->cp == NULL) {
+ printf("ZFS WARNING: Cannot open %s "
+ "for writting.\n", pp->name);
+ continue;
+ }
+ goto end;
+ }
+ }
+ }
+ ap->cp = NULL;
+end:
+ g_destroy_consumer(zcp);
+ g_destroy_geom(zgp);
+}
+
+static struct g_consumer *
+vdev_geom_attach_by_id(const char *id, int write)
+{
+ struct vdev_geom_find *ap;
+ struct g_consumer *cp;
+
+ ap = kmem_zalloc(sizeof(*ap), KM_SLEEP);
+ ap->id = id;
+ ap->write = write;
+ g_waitfor_event(vdev_geom_attach_by_id_event, ap, M_WAITOK, NULL);
+ cp = ap->cp;
+ kmem_free(ap, sizeof(*ap));
+ return (cp);
+}
+
+static int
+vdev_geom_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift)
+{
+ vdev_geom_ctx_t *ctx;
+ struct g_provider *pp;
+ struct g_consumer *cp;
+ char *id = NULL;
+ int owned;
+
+ /*
+ * We must have a pathname, and it must be absolute.
+ */
+ if (vd->vdev_path == NULL || vd->vdev_path[0] != '/') {
+ vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
+ return (EINVAL);
+ }
+
+ if ((owned = mtx_owned(&Giant)))
+ mtx_unlock(&Giant);
+ cp = NULL;
+ g_topology_lock();
+ pp = g_provider_by_name(vd->vdev_path + sizeof("/dev/") - 1);
+ if (pp != NULL) {
+ ZFS_LOG(1, "Found provider by name %s.", vd->vdev_path);
+ cp = vdev_geom_attach(pp, !!(spa_mode & FWRITE));
+ if (cp != NULL && vd->vdev_devid != NULL) {
+ g_topology_unlock();
+ id = vdev_geom_get_id(cp);
+ g_topology_lock();
+ if (id == NULL || strcmp(id, vd->vdev_devid) != 0) {
+ vdev_geom_detach(cp, 0);
+ cp = NULL;
+ ZFS_LOG(1, "ID mismatch for provider %s: "
+ "[%s]!=[%s].", vd->vdev_path,
+ vd->vdev_devid, id);
+ goto next;
+ }
+ ZFS_LOG(1, "ID match for provider %s.", vd->vdev_path);
+ }
+ }
+next:
+ g_topology_unlock();
+ vdev_geom_free_id(id);
+ if (cp == NULL && vd->vdev_devid != NULL) {
+ ZFS_LOG(1, "Searching by ID [%s].", vd->vdev_devid);
+ cp = vdev_geom_attach_by_id(vd->vdev_devid,
+ !!(spa_mode & FWRITE));
+ if (cp != NULL) {
+ size_t len = strlen(cp->provider->name) + 6; /* 6 == strlen("/dev/") + 1 */
+ char *buf = kmem_alloc(len, KM_SLEEP);
+
+ snprintf(buf, len, "/dev/%s", cp->provider->name);
+ spa_strfree(vd->vdev_path);
+ vd->vdev_path = buf;
+
+ ZFS_LOG(1, "Attach by ID [%s] succeeded, provider %s.",
+ vd->vdev_devid, vd->vdev_path);
+ }
+ }
+ if (owned)
+ mtx_lock(&Giant);
+ if (cp == NULL) {
+ ZFS_LOG(1, "Provider %s (id=[%s]) not found.", vd->vdev_path,
+ vd->vdev_devid);
+ vd->vdev_stat.vs_aux = VDEV_AUX_OPEN_FAILED;
+ return (EACCES);
+ }
+ pp = cp->provider;
+
+ /*
+ * Determine the actual size of the device.
+ */
+ *psize = pp->mediasize;
+
+ /*
+ * Determine the device's minimum transfer size.
+ */
+ *ashift = highbit(MAX(pp->sectorsize, SPA_MINBLOCKSIZE)) - 1;
+
+ /*
+ * Clear the nowritecache bit, so that on a vdev_reopen() we will
+ * try again.
+ */
+ vd->vdev_nowritecache = B_FALSE;
+
+ cp->private = vd;
+
+ ctx = kmem_zalloc(sizeof(*ctx), KM_SLEEP);
+ bioq_init(&ctx->gc_queue);
+ mtx_init(&ctx->gc_queue_mtx, "zfs:vdev:geom:queue", NULL, MTX_DEF);
+ ctx->gc_consumer = cp;
+ ctx->gc_state = 0;
+
+ vd->vdev_tsd = ctx;
+
+ kthread_create(vdev_geom_worker, ctx, NULL, 0, 0, "vdev:worker %s",
+ pp->name);
+
+ return (0);
+}
+
+static void
+vdev_geom_close(vdev_t *vd)
+{
+ vdev_geom_ctx_t *ctx;
+ struct g_consumer *cp;
+
+ if ((ctx = vd->vdev_tsd) == NULL)
+ return;
+ if ((cp = ctx->gc_consumer) == NULL)
+ return;
+ vdev_geom_release(vd);
+ g_post_event(vdev_geom_detach, cp, M_WAITOK, NULL);
+}
+
+static void
+vdev_geom_io_intr(struct bio *bp)
+{
+ vdev_geom_ctx_t *ctx;
+ zio_t *zio;
+
+ zio = bp->bio_caller1;
+ ctx = zio->io_vd->vdev_tsd;
+
+ mtx_lock(&ctx->gc_queue_mtx);
+ bioq_insert_tail(&ctx->gc_queue, bp);
+ wakeup_one(&ctx->gc_queue);
+ mtx_unlock(&ctx->gc_queue_mtx);
+}
+
+static void
+vdev_geom_io_start(zio_t *zio)
+{
+ vdev_t *vd;
+ vdev_geom_ctx_t *ctx;
+ struct g_consumer *cp;
+ struct bio *bp;
+ int error;
+
+ cp = NULL;
+
+ vd = zio->io_vd;
+ ctx = vd->vdev_tsd;
+ if (ctx != NULL)
+ cp = ctx->gc_consumer;
+
+ if (zio->io_type == ZIO_TYPE_IOCTL) {
+ zio_vdev_io_bypass(zio);
+
+ /* XXPOLICY */
+ if (vdev_is_dead(vd)) {
+ zio->io_error = ENXIO;
+ zio_next_stage_async(zio);
+ return;
+ }
+
+ switch (zio->io_cmd) {
+
+ case DKIOCFLUSHWRITECACHE:
+ if (vd->vdev_nowritecache) {
+ zio->io_error = ENOTSUP;
+ break;
+ }
+
+ goto sendreq;
+ default:
+ zio->io_error = ENOTSUP;
+ }
+
+ zio_next_stage_async(zio);
+ return;
+ }
+
+ if (zio->io_type == ZIO_TYPE_READ && vdev_cache_read(zio) == 0)
+ return;
+
+ if ((zio = vdev_queue_io(zio)) == NULL)
+ return;
+
+sendreq:
+
+ error = vdev_is_dead(vd) ? ENXIO : vdev_error_inject(vd, zio);
+ if (error == 0 && cp == NULL)
+ error = ENXIO;
+ if (error) {
+ zio->io_error = error;
+ zio_next_stage_async(zio);
+ return;
+ }
+
+ bp = g_alloc_bio();
+ bp->bio_caller1 = zio;
+ switch (zio->io_type) {
+ case ZIO_TYPE_READ:
+ case ZIO_TYPE_WRITE:
+ bp->bio_cmd = zio->io_type == ZIO_TYPE_READ ? BIO_READ : BIO_WRITE;
+ bp->bio_data = zio->io_data;
+ bp->bio_offset = zio->io_offset;
+ bp->bio_length = zio->io_size;
+ break;
+ case ZIO_TYPE_IOCTL:
+ bp->bio_cmd = BIO_FLUSH;
+ bp->bio_data = NULL;
+ bp->bio_offset = cp->provider->mediasize;
+ bp->bio_length = 0;
+ break;
+ }
+ bp->bio_done = vdev_geom_io_intr;
+
+ g_io_request(bp, cp);
+}
+
+static void
+vdev_geom_io_done(zio_t *zio)
+{
+ vdev_queue_io_done(zio);
+
+ if (zio->io_type == ZIO_TYPE_WRITE)
+ vdev_cache_write(zio);
+
+ if (zio_injection_enabled && zio->io_error == 0)
+ zio->io_error = zio_handle_device_injection(zio->io_vd, EIO);
+
+ zio_next_stage(zio);
+}
+
+vdev_ops_t vdev_geom_ops = {
+ vdev_geom_open,
+ vdev_geom_close,
+ vdev_default_asize,
+ vdev_geom_io_start,
+ vdev_geom_io_done,
+ NULL,
+ VDEV_TYPE_DISK, /* name of this vdev type */
+ B_TRUE /* leaf vdev */
+};
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_label.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_label.c
new file mode 100644
index 0000000..9d9f555
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_label.c
@@ -0,0 +1,1011 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Virtual Device Labels
+ * ---------------------
+ *
+ * The vdev label serves several distinct purposes:
+ *
+ * 1. Uniquely identify this device as part of a ZFS pool and confirm its
+ * identity within the pool.
+ *
+ * 2. Verify that all the devices given in a configuration are present
+ * within the pool.
+ *
+ * 3. Determine the uberblock for the pool.
+ *
+ * 4. In case of an import operation, determine the configuration of the
+ * toplevel vdev of which it is a part.
+ *
+ * 5. If an import operation cannot find all the devices in the pool,
+ * provide enough information to the administrator to determine which
+ * devices are missing.
+ *
+ * It is important to note that while the kernel is responsible for writing the
+ * label, it only consumes the information in the first three cases. The
+ * latter information is only consumed in userland when determining the
+ * configuration to import a pool.
+ *
+ *
+ * Label Organization
+ * ------------------
+ *
+ * Before describing the contents of the label, it's important to understand how
+ * the labels are written and updated with respect to the uberblock.
+ *
+ * When the pool configuration is altered, either because it was newly created
+ * or a device was added, we want to update all the labels such that we can deal
+ * with fatal failure at any point. To this end, each disk has two labels which
+ * are updated before and after the uberblock is synced. Assuming we have
+ * labels and an uberblock with the following transacation groups:
+ *
+ * L1 UB L2
+ * +------+ +------+ +------+
+ * | | | | | |
+ * | t10 | | t10 | | t10 |
+ * | | | | | |
+ * +------+ +------+ +------+
+ *
+ * In this stable state, the labels and the uberblock were all updated within
+ * the same transaction group (10). Each label is mirrored and checksummed, so
+ * that we can detect when we fail partway through writing the label.
+ *
+ * In order to identify which labels are valid, the labels are written in the
+ * following manner:
+ *
+ * 1. For each vdev, update 'L1' to the new label
+ * 2. Update the uberblock
+ * 3. For each vdev, update 'L2' to the new label
+ *
+ * Given arbitrary failure, we can determine the correct label to use based on
+ * the transaction group. If we fail after updating L1 but before updating the
+ * UB, we will notice that L1's transaction group is greater than the uberblock,
+ * so L2 must be valid. If we fail after writing the uberblock but before
+ * writing L2, we will notice that L2's transaction group is less than L1, and
+ * therefore L1 is valid.
+ *
+ * Another added complexity is that not every label is updated when the config
+ * is synced. If we add a single device, we do not want to have to re-write
+ * every label for every device in the pool. This means that both L1 and L2 may
+ * be older than the pool uberblock, because the necessary information is stored
+ * on another vdev.
+ *
+ *
+ * On-disk Format
+ * --------------
+ *
+ * The vdev label consists of two distinct parts, and is wrapped within the
+ * vdev_label_t structure. The label includes 8k of padding to permit legacy
+ * VTOC disk labels, but is otherwise ignored.
+ *
+ * The first half of the label is a packed nvlist which contains pool wide
+ * properties, per-vdev properties, and configuration information. It is
+ * described in more detail below.
+ *
+ * The latter half of the label consists of a redundant array of uberblocks.
+ * These uberblocks are updated whenever a transaction group is committed,
+ * or when the configuration is updated. When a pool is loaded, we scan each
+ * vdev for the 'best' uberblock.
+ *
+ *
+ * Configuration Information
+ * -------------------------
+ *
+ * The nvlist describing the pool and vdev contains the following elements:
+ *
+ * version ZFS on-disk version
+ * name Pool name
+ * state Pool state
+ * txg Transaction group in which this label was written
+ * pool_guid Unique identifier for this pool
+ * vdev_tree An nvlist describing vdev tree.
+ *
+ * Each leaf device label also contains the following:
+ *
+ * top_guid Unique ID for top-level vdev in which this is contained
+ * guid Unique ID for the leaf vdev
+ *
+ * The 'vs' configuration follows the format described in 'spa_config.c'.
+ */
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/spa_impl.h>
+#include <sys/dmu.h>
+#include <sys/zap.h>
+#include <sys/vdev.h>
+#include <sys/vdev_impl.h>
+#include <sys/uberblock_impl.h>
+#include <sys/metaslab.h>
+#include <sys/zio.h>
+#include <sys/fs/zfs.h>
+
+/*
+ * Basic routines to read and write from a vdev label.
+ * Used throughout the rest of this file.
+ */
+uint64_t
+vdev_label_offset(uint64_t psize, int l, uint64_t offset)
+{
+ ASSERT(offset < sizeof (vdev_label_t));
+
+ return (offset + l * sizeof (vdev_label_t) + (l < VDEV_LABELS / 2 ?
+ 0 : psize - VDEV_LABELS * sizeof (vdev_label_t)));
+}
+
+static void
+vdev_label_read(zio_t *zio, vdev_t *vd, int l, void *buf, uint64_t offset,
+ uint64_t size, zio_done_func_t *done, void *private)
+{
+ ASSERT(vd->vdev_children == 0);
+
+ zio_nowait(zio_read_phys(zio, vd,
+ vdev_label_offset(vd->vdev_psize, l, offset),
+ size, buf, ZIO_CHECKSUM_LABEL, done, private,
+ ZIO_PRIORITY_SYNC_READ,
+ ZIO_FLAG_CONFIG_HELD | ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE));
+}
+
+static void
+vdev_label_write(zio_t *zio, vdev_t *vd, int l, void *buf, uint64_t offset,
+ uint64_t size, zio_done_func_t *done, void *private)
+{
+ ASSERT(vd->vdev_children == 0);
+
+ zio_nowait(zio_write_phys(zio, vd,
+ vdev_label_offset(vd->vdev_psize, l, offset),
+ size, buf, ZIO_CHECKSUM_LABEL, done, private,
+ ZIO_PRIORITY_SYNC_WRITE, ZIO_FLAG_CONFIG_HELD | ZIO_FLAG_CANFAIL));
+}
+
+/*
+ * Generate the nvlist representing this vdev's config.
+ */
+nvlist_t *
+vdev_config_generate(spa_t *spa, vdev_t *vd, boolean_t getstats,
+ boolean_t isspare)
+{
+ nvlist_t *nv = NULL;
+
+ VERIFY(nvlist_alloc(&nv, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+
+ VERIFY(nvlist_add_string(nv, ZPOOL_CONFIG_TYPE,
+ vd->vdev_ops->vdev_op_type) == 0);
+ if (!isspare)
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_ID, vd->vdev_id)
+ == 0);
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_GUID, vd->vdev_guid) == 0);
+
+ if (vd->vdev_path != NULL)
+ VERIFY(nvlist_add_string(nv, ZPOOL_CONFIG_PATH,
+ vd->vdev_path) == 0);
+
+ if (vd->vdev_devid != NULL)
+ VERIFY(nvlist_add_string(nv, ZPOOL_CONFIG_DEVID,
+ vd->vdev_devid) == 0);
+
+ if (vd->vdev_nparity != 0) {
+ ASSERT(strcmp(vd->vdev_ops->vdev_op_type,
+ VDEV_TYPE_RAIDZ) == 0);
+
+ /*
+ * Make sure someone hasn't managed to sneak a fancy new vdev
+ * into a crufty old storage pool.
+ */
+ ASSERT(vd->vdev_nparity == 1 ||
+ (vd->vdev_nparity == 2 &&
+ spa_version(spa) >= ZFS_VERSION_RAID6));
+
+ /*
+ * Note that we'll add the nparity tag even on storage pools
+ * that only support a single parity device -- older software
+ * will just ignore it.
+ */
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_NPARITY,
+ vd->vdev_nparity) == 0);
+ }
+
+ if (vd->vdev_wholedisk != -1ULL)
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_WHOLE_DISK,
+ vd->vdev_wholedisk) == 0);
+
+ if (vd->vdev_not_present)
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_NOT_PRESENT, 1) == 0);
+
+ if (vd->vdev_isspare)
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_IS_SPARE, 1) == 0);
+
+ if (!isspare && vd == vd->vdev_top) {
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_METASLAB_ARRAY,
+ vd->vdev_ms_array) == 0);
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_METASLAB_SHIFT,
+ vd->vdev_ms_shift) == 0);
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_ASHIFT,
+ vd->vdev_ashift) == 0);
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_ASIZE,
+ vd->vdev_asize) == 0);
+ }
+
+ if (vd->vdev_dtl.smo_object != 0)
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_DTL,
+ vd->vdev_dtl.smo_object) == 0);
+
+ if (getstats) {
+ vdev_stat_t vs;
+ vdev_get_stats(vd, &vs);
+ VERIFY(nvlist_add_uint64_array(nv, ZPOOL_CONFIG_STATS,
+ (uint64_t *)&vs, sizeof (vs) / sizeof (uint64_t)) == 0);
+ }
+
+ if (!vd->vdev_ops->vdev_op_leaf) {
+ nvlist_t **child;
+ int c;
+
+ child = kmem_alloc(vd->vdev_children * sizeof (nvlist_t *),
+ KM_SLEEP);
+
+ for (c = 0; c < vd->vdev_children; c++)
+ child[c] = vdev_config_generate(spa, vd->vdev_child[c],
+ getstats, isspare);
+
+ VERIFY(nvlist_add_nvlist_array(nv, ZPOOL_CONFIG_CHILDREN,
+ child, vd->vdev_children) == 0);
+
+ for (c = 0; c < vd->vdev_children; c++)
+ nvlist_free(child[c]);
+
+ kmem_free(child, vd->vdev_children * sizeof (nvlist_t *));
+
+ } else {
+ if (vd->vdev_offline && !vd->vdev_tmpoffline)
+ VERIFY(nvlist_add_uint64(nv, ZPOOL_CONFIG_OFFLINE,
+ B_TRUE) == 0);
+ else
+ (void) nvlist_remove(nv, ZPOOL_CONFIG_OFFLINE,
+ DATA_TYPE_UINT64);
+ }
+
+ return (nv);
+}
+
+nvlist_t *
+vdev_label_read_config(vdev_t *vd)
+{
+ spa_t *spa = vd->vdev_spa;
+ nvlist_t *config = NULL;
+ vdev_phys_t *vp;
+ zio_t *zio;
+ int l;
+
+ ASSERT(spa_config_held(spa, RW_READER));
+
+ if (vdev_is_dead(vd))
+ return (NULL);
+
+ vp = zio_buf_alloc(sizeof (vdev_phys_t));
+
+ for (l = 0; l < VDEV_LABELS; l++) {
+
+ zio = zio_root(spa, NULL, NULL, ZIO_FLAG_CANFAIL |
+ ZIO_FLAG_SPECULATIVE | ZIO_FLAG_CONFIG_HELD);
+
+ vdev_label_read(zio, vd, l, vp,
+ offsetof(vdev_label_t, vl_vdev_phys),
+ sizeof (vdev_phys_t), NULL, NULL);
+
+ if (zio_wait(zio) == 0 &&
+ nvlist_unpack(vp->vp_nvlist, sizeof (vp->vp_nvlist),
+ &config, 0) == 0)
+ break;
+
+ if (config != NULL) {
+ nvlist_free(config);
+ config = NULL;
+ }
+ }
+
+ zio_buf_free(vp, sizeof (vdev_phys_t));
+
+ return (config);
+}
+
+/*
+ * Determine if a device is in use. The 'spare_guid' parameter will be filled
+ * in with the device guid if this spare is active elsewhere on the system.
+ */
+static boolean_t
+vdev_inuse(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason,
+ uint64_t *spare_guid)
+{
+ spa_t *spa = vd->vdev_spa;
+ uint64_t state, pool_guid, device_guid, txg, spare_pool;
+ uint64_t vdtxg = 0;
+ nvlist_t *label;
+
+ if (spare_guid)
+ *spare_guid = 0ULL;
+
+ /*
+ * Read the label, if any, and perform some basic sanity checks.
+ */
+ if ((label = vdev_label_read_config(vd)) == NULL)
+ return (B_FALSE);
+
+ (void) nvlist_lookup_uint64(label, ZPOOL_CONFIG_CREATE_TXG,
+ &vdtxg);
+
+ if (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_STATE,
+ &state) != 0 ||
+ nvlist_lookup_uint64(label, ZPOOL_CONFIG_GUID,
+ &device_guid) != 0) {
+ nvlist_free(label);
+ return (B_FALSE);
+ }
+
+ if (state != POOL_STATE_SPARE &&
+ (nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_GUID,
+ &pool_guid) != 0 ||
+ nvlist_lookup_uint64(label, ZPOOL_CONFIG_POOL_TXG,
+ &txg) != 0)) {
+ nvlist_free(label);
+ return (B_FALSE);
+ }
+
+ nvlist_free(label);
+
+ /*
+ * Check to see if this device indeed belongs to the pool it claims to
+ * be a part of. The only way this is allowed is if the device is a hot
+ * spare (which we check for later on).
+ */
+ if (state != POOL_STATE_SPARE &&
+ !spa_guid_exists(pool_guid, device_guid) &&
+ !spa_spare_exists(device_guid, NULL))
+ return (B_FALSE);
+
+ /*
+ * If the transaction group is zero, then this an initialized (but
+ * unused) label. This is only an error if the create transaction
+ * on-disk is the same as the one we're using now, in which case the
+ * user has attempted to add the same vdev multiple times in the same
+ * transaction.
+ */
+ if (state != POOL_STATE_SPARE && txg == 0 && vdtxg == crtxg)
+ return (B_TRUE);
+
+ /*
+ * Check to see if this is a spare device. We do an explicit check for
+ * spa_has_spare() here because it may be on our pending list of spares
+ * to add.
+ */
+ if (spa_spare_exists(device_guid, &spare_pool) ||
+ spa_has_spare(spa, device_guid)) {
+ if (spare_guid)
+ *spare_guid = device_guid;
+
+ switch (reason) {
+ case VDEV_LABEL_CREATE:
+ return (B_TRUE);
+
+ case VDEV_LABEL_REPLACE:
+ return (!spa_has_spare(spa, device_guid) ||
+ spare_pool != 0ULL);
+
+ case VDEV_LABEL_SPARE:
+ return (spa_has_spare(spa, device_guid));
+ }
+ }
+
+ /*
+ * If the device is marked ACTIVE, then this device is in use by another
+ * pool on the system.
+ */
+ return (state == POOL_STATE_ACTIVE);
+}
+
+/*
+ * Initialize a vdev label. We check to make sure each leaf device is not in
+ * use, and writable. We put down an initial label which we will later
+ * overwrite with a complete label. Note that it's important to do this
+ * sequentially, not in parallel, so that we catch cases of multiple use of the
+ * same leaf vdev in the vdev we're creating -- e.g. mirroring a disk with
+ * itself.
+ */
+int
+vdev_label_init(vdev_t *vd, uint64_t crtxg, vdev_labeltype_t reason)
+{
+ spa_t *spa = vd->vdev_spa;
+ nvlist_t *label;
+ vdev_phys_t *vp;
+ vdev_boot_header_t *vb;
+ uberblock_t *ub;
+ zio_t *zio;
+ int l, c, n;
+ char *buf;
+ size_t buflen;
+ int error;
+ uint64_t spare_guid;
+
+ ASSERT(spa_config_held(spa, RW_WRITER));
+
+ for (c = 0; c < vd->vdev_children; c++)
+ if ((error = vdev_label_init(vd->vdev_child[c],
+ crtxg, reason)) != 0)
+ return (error);
+
+ if (!vd->vdev_ops->vdev_op_leaf)
+ return (0);
+
+ /*
+ * Dead vdevs cannot be initialized.
+ */
+ if (vdev_is_dead(vd))
+ return (EIO);
+
+ /*
+ * Determine if the vdev is in use.
+ */
+ if (reason != VDEV_LABEL_REMOVE &&
+ vdev_inuse(vd, crtxg, reason, &spare_guid))
+ return (EBUSY);
+
+ ASSERT(reason != VDEV_LABEL_REMOVE ||
+ vdev_inuse(vd, crtxg, reason, NULL));
+
+ /*
+ * If this is a request to add or replace a spare that is in use
+ * elsewhere on the system, then we must update the guid (which was
+ * initialized to a random value) to reflect the actual GUID (which is
+ * shared between multiple pools).
+ */
+ if (reason != VDEV_LABEL_REMOVE && spare_guid != 0ULL) {
+ vdev_t *pvd = vd->vdev_parent;
+
+ for (; pvd != NULL; pvd = pvd->vdev_parent) {
+ pvd->vdev_guid_sum -= vd->vdev_guid;
+ pvd->vdev_guid_sum += spare_guid;
+ }
+
+ vd->vdev_guid = vd->vdev_guid_sum = spare_guid;
+
+ /*
+ * If this is a replacement, then we want to fallthrough to the
+ * rest of the code. If we're adding a spare, then it's already
+ * labelled appropriately and we can just return.
+ */
+ if (reason == VDEV_LABEL_SPARE)
+ return (0);
+ ASSERT(reason == VDEV_LABEL_REPLACE);
+ }
+
+ /*
+ * Initialize its label.
+ */
+ vp = zio_buf_alloc(sizeof (vdev_phys_t));
+ bzero(vp, sizeof (vdev_phys_t));
+
+ /*
+ * Generate a label describing the pool and our top-level vdev.
+ * We mark it as being from txg 0 to indicate that it's not
+ * really part of an active pool just yet. The labels will
+ * be written again with a meaningful txg by spa_sync().
+ */
+ if (reason == VDEV_LABEL_SPARE ||
+ (reason == VDEV_LABEL_REMOVE && vd->vdev_isspare)) {
+ /*
+ * For inactive hot spares, we generate a special label that
+ * identifies as a mutually shared hot spare. We write the
+ * label if we are adding a hot spare, or if we are removing an
+ * active hot spare (in which case we want to revert the
+ * labels).
+ */
+ VERIFY(nvlist_alloc(&label, NV_UNIQUE_NAME, KM_SLEEP) == 0);
+
+ VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_VERSION,
+ spa_version(spa)) == 0);
+ VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_POOL_STATE,
+ POOL_STATE_SPARE) == 0);
+ VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_GUID,
+ vd->vdev_guid) == 0);
+ } else {
+ label = spa_config_generate(spa, vd, 0ULL, B_FALSE);
+
+ /*
+ * Add our creation time. This allows us to detect multiple
+ * vdev uses as described above, and automatically expires if we
+ * fail.
+ */
+ VERIFY(nvlist_add_uint64(label, ZPOOL_CONFIG_CREATE_TXG,
+ crtxg) == 0);
+ }
+
+ buf = vp->vp_nvlist;
+ buflen = sizeof (vp->vp_nvlist);
+
+ error = nvlist_pack(label, &buf, &buflen, NV_ENCODE_XDR, KM_SLEEP);
+ if (error != 0) {
+ nvlist_free(label);
+ zio_buf_free(vp, sizeof (vdev_phys_t));
+ /* EFAULT means nvlist_pack ran out of room */
+ return (error == EFAULT ? ENAMETOOLONG : EINVAL);
+ }
+
+ /*
+ * Initialize boot block header.
+ */
+ vb = zio_buf_alloc(sizeof (vdev_boot_header_t));
+ bzero(vb, sizeof (vdev_boot_header_t));
+ vb->vb_magic = VDEV_BOOT_MAGIC;
+ vb->vb_version = VDEV_BOOT_VERSION;
+ vb->vb_offset = VDEV_BOOT_OFFSET;
+ vb->vb_size = VDEV_BOOT_SIZE;
+
+ /*
+ * Initialize uberblock template.
+ */
+ ub = zio_buf_alloc(VDEV_UBERBLOCK_SIZE(vd));
+ bzero(ub, VDEV_UBERBLOCK_SIZE(vd));
+ *ub = spa->spa_uberblock;
+ ub->ub_txg = 0;
+
+ /*
+ * Write everything in parallel.
+ */
+ zio = zio_root(spa, NULL, NULL,
+ ZIO_FLAG_CONFIG_HELD | ZIO_FLAG_CANFAIL);
+
+ for (l = 0; l < VDEV_LABELS; l++) {
+
+ vdev_label_write(zio, vd, l, vp,
+ offsetof(vdev_label_t, vl_vdev_phys),
+ sizeof (vdev_phys_t), NULL, NULL);
+
+ vdev_label_write(zio, vd, l, vb,
+ offsetof(vdev_label_t, vl_boot_header),
+ sizeof (vdev_boot_header_t), NULL, NULL);
+
+ for (n = 0; n < VDEV_UBERBLOCK_COUNT(vd); n++) {
+ vdev_label_write(zio, vd, l, ub,
+ VDEV_UBERBLOCK_OFFSET(vd, n),
+ VDEV_UBERBLOCK_SIZE(vd), NULL, NULL);
+ }
+ }
+
+ error = zio_wait(zio);
+
+ nvlist_free(label);
+ zio_buf_free(ub, VDEV_UBERBLOCK_SIZE(vd));
+ zio_buf_free(vb, sizeof (vdev_boot_header_t));
+ zio_buf_free(vp, sizeof (vdev_phys_t));
+
+ /*
+ * If this vdev hasn't been previously identified as a spare, then we
+ * mark it as such only if a) we are labelling it as a spare, or b) it
+ * exists as a spare elsewhere in the system.
+ */
+ if (error == 0 && !vd->vdev_isspare &&
+ (reason == VDEV_LABEL_SPARE ||
+ spa_spare_exists(vd->vdev_guid, NULL)))
+ spa_spare_add(vd);
+
+ return (error);
+}
+
+/*
+ * ==========================================================================
+ * uberblock load/sync
+ * ==========================================================================
+ */
+
+/*
+ * Consider the following situation: txg is safely synced to disk. We've
+ * written the first uberblock for txg + 1, and then we lose power. When we
+ * come back up, we fail to see the uberblock for txg + 1 because, say,
+ * it was on a mirrored device and the replica to which we wrote txg + 1
+ * is now offline. If we then make some changes and sync txg + 1, and then
+ * the missing replica comes back, then for a new seconds we'll have two
+ * conflicting uberblocks on disk with the same txg. The solution is simple:
+ * among uberblocks with equal txg, choose the one with the latest timestamp.
+ */
+static int
+vdev_uberblock_compare(uberblock_t *ub1, uberblock_t *ub2)
+{
+ if (ub1->ub_txg < ub2->ub_txg)
+ return (-1);
+ if (ub1->ub_txg > ub2->ub_txg)
+ return (1);
+
+ if (ub1->ub_timestamp < ub2->ub_timestamp)
+ return (-1);
+ if (ub1->ub_timestamp > ub2->ub_timestamp)
+ return (1);
+
+ return (0);
+}
+
+static void
+vdev_uberblock_load_done(zio_t *zio)
+{
+ uberblock_t *ub = zio->io_data;
+ uberblock_t *ubbest = zio->io_private;
+ spa_t *spa = zio->io_spa;
+
+ ASSERT3U(zio->io_size, ==, VDEV_UBERBLOCK_SIZE(zio->io_vd));
+
+ if (zio->io_error == 0 && uberblock_verify(ub) == 0) {
+ mutex_enter(&spa->spa_uberblock_lock);
+ if (vdev_uberblock_compare(ub, ubbest) > 0)
+ *ubbest = *ub;
+ mutex_exit(&spa->spa_uberblock_lock);
+ }
+
+ zio_buf_free(zio->io_data, zio->io_size);
+}
+
+void
+vdev_uberblock_load(zio_t *zio, vdev_t *vd, uberblock_t *ubbest)
+{
+ int l, c, n;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_uberblock_load(zio, vd->vdev_child[c], ubbest);
+
+ if (!vd->vdev_ops->vdev_op_leaf)
+ return;
+
+ if (vdev_is_dead(vd))
+ return;
+
+ for (l = 0; l < VDEV_LABELS; l++) {
+ for (n = 0; n < VDEV_UBERBLOCK_COUNT(vd); n++) {
+ vdev_label_read(zio, vd, l,
+ zio_buf_alloc(VDEV_UBERBLOCK_SIZE(vd)),
+ VDEV_UBERBLOCK_OFFSET(vd, n),
+ VDEV_UBERBLOCK_SIZE(vd),
+ vdev_uberblock_load_done, ubbest);
+ }
+ }
+}
+
+/*
+ * Write the uberblock to both labels of all leaves of the specified vdev.
+ * We only get credit for writes to known-visible vdevs; see spa_vdev_add().
+ */
+static void
+vdev_uberblock_sync_done(zio_t *zio)
+{
+ uint64_t *good_writes = zio->io_root->io_private;
+
+ if (zio->io_error == 0 && zio->io_vd->vdev_top->vdev_ms_array != 0)
+ atomic_add_64(good_writes, 1);
+}
+
+static void
+vdev_uberblock_sync(zio_t *zio, uberblock_t *ub, vdev_t *vd, uint64_t txg)
+{
+ int l, c, n;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_uberblock_sync(zio, ub, vd->vdev_child[c], txg);
+
+ if (!vd->vdev_ops->vdev_op_leaf)
+ return;
+
+ if (vdev_is_dead(vd))
+ return;
+
+ n = txg & (VDEV_UBERBLOCK_COUNT(vd) - 1);
+
+ ASSERT(ub->ub_txg == txg);
+
+ for (l = 0; l < VDEV_LABELS; l++)
+ vdev_label_write(zio, vd, l, ub,
+ VDEV_UBERBLOCK_OFFSET(vd, n),
+ VDEV_UBERBLOCK_SIZE(vd),
+ vdev_uberblock_sync_done, NULL);
+
+ dprintf("vdev %s in txg %llu\n", vdev_description(vd), txg);
+}
+
+static int
+vdev_uberblock_sync_tree(spa_t *spa, uberblock_t *ub, vdev_t *vd, uint64_t txg)
+{
+ uberblock_t *ubbuf;
+ size_t size = vd->vdev_top ? VDEV_UBERBLOCK_SIZE(vd) : SPA_MAXBLOCKSIZE;
+ uint64_t *good_writes;
+ zio_t *zio;
+ int error;
+
+ ubbuf = zio_buf_alloc(size);
+ bzero(ubbuf, size);
+ *ubbuf = *ub;
+
+ good_writes = kmem_zalloc(sizeof (uint64_t), KM_SLEEP);
+
+ zio = zio_root(spa, NULL, good_writes,
+ ZIO_FLAG_CONFIG_HELD | ZIO_FLAG_CANFAIL);
+
+ vdev_uberblock_sync(zio, ubbuf, vd, txg);
+
+ error = zio_wait(zio);
+
+ if (error && *good_writes != 0) {
+ dprintf("partial success: good_writes = %llu\n", *good_writes);
+ error = 0;
+ }
+
+ /*
+ * It's possible to have no good writes and no error if every vdev is in
+ * the CANT_OPEN state.
+ */
+ if (*good_writes == 0 && error == 0)
+ error = EIO;
+
+ kmem_free(good_writes, sizeof (uint64_t));
+ zio_buf_free(ubbuf, size);
+
+ return (error);
+}
+
+/*
+ * Sync out an individual vdev.
+ */
+static void
+vdev_sync_label_done(zio_t *zio)
+{
+ uint64_t *good_writes = zio->io_root->io_private;
+
+ if (zio->io_error == 0)
+ atomic_add_64(good_writes, 1);
+}
+
+static void
+vdev_sync_label(zio_t *zio, vdev_t *vd, int l, uint64_t txg)
+{
+ nvlist_t *label;
+ vdev_phys_t *vp;
+ char *buf;
+ size_t buflen;
+ int c;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_sync_label(zio, vd->vdev_child[c], l, txg);
+
+ if (!vd->vdev_ops->vdev_op_leaf)
+ return;
+
+ if (vdev_is_dead(vd))
+ return;
+
+ /*
+ * Generate a label describing the top-level config to which we belong.
+ */
+ label = spa_config_generate(vd->vdev_spa, vd, txg, B_FALSE);
+
+ vp = zio_buf_alloc(sizeof (vdev_phys_t));
+ bzero(vp, sizeof (vdev_phys_t));
+
+ buf = vp->vp_nvlist;
+ buflen = sizeof (vp->vp_nvlist);
+
+ if (nvlist_pack(label, &buf, &buflen, NV_ENCODE_XDR, KM_SLEEP) == 0)
+ vdev_label_write(zio, vd, l, vp,
+ offsetof(vdev_label_t, vl_vdev_phys), sizeof (vdev_phys_t),
+ vdev_sync_label_done, NULL);
+
+ zio_buf_free(vp, sizeof (vdev_phys_t));
+ nvlist_free(label);
+
+ dprintf("%s label %d txg %llu\n", vdev_description(vd), l, txg);
+}
+
+static int
+vdev_sync_labels(vdev_t *vd, int l, uint64_t txg)
+{
+ uint64_t *good_writes;
+ zio_t *zio;
+ int error;
+
+ ASSERT(vd == vd->vdev_top);
+
+ good_writes = kmem_zalloc(sizeof (uint64_t), KM_SLEEP);
+
+ zio = zio_root(vd->vdev_spa, NULL, good_writes,
+ ZIO_FLAG_CONFIG_HELD | ZIO_FLAG_CANFAIL);
+
+ /*
+ * Recursively kick off writes to all labels.
+ */
+ vdev_sync_label(zio, vd, l, txg);
+
+ error = zio_wait(zio);
+
+ if (error && *good_writes != 0) {
+ dprintf("partial success: good_writes = %llu\n", *good_writes);
+ error = 0;
+ }
+
+ if (*good_writes == 0 && error == 0)
+ error = ENODEV;
+
+ kmem_free(good_writes, sizeof (uint64_t));
+
+ return (error);
+}
+
+/*
+ * Sync the entire vdev configuration.
+ *
+ * The order of operations is carefully crafted to ensure that
+ * if the system panics or loses power at any time, the state on disk
+ * is still transactionally consistent. The in-line comments below
+ * describe the failure semantics at each stage.
+ *
+ * Moreover, it is designed to be idempotent: if spa_sync_labels() fails
+ * at any time, you can just call it again, and it will resume its work.
+ */
+int
+vdev_config_sync(vdev_t *uvd, uint64_t txg)
+{
+ spa_t *spa = uvd->vdev_spa;
+ uberblock_t *ub = &spa->spa_uberblock;
+ vdev_t *rvd = spa->spa_root_vdev;
+ vdev_t *vd;
+ zio_t *zio;
+ int l, error;
+
+ ASSERT(ub->ub_txg <= txg);
+
+ /*
+ * If this isn't a resync due to I/O errors, and nothing changed
+ * in this transaction group, and the vdev configuration hasn't changed,
+ * then there's nothing to do.
+ */
+ if (ub->ub_txg < txg && uberblock_update(ub, rvd, txg) == B_FALSE &&
+ list_is_empty(&spa->spa_dirty_list)) {
+ dprintf("nothing to sync in %s in txg %llu\n",
+ spa_name(spa), txg);
+ return (0);
+ }
+
+ if (txg > spa_freeze_txg(spa))
+ return (0);
+
+ ASSERT(txg <= spa->spa_final_txg);
+
+ dprintf("syncing %s txg %llu\n", spa_name(spa), txg);
+
+ /*
+ * Flush the write cache of every disk that's been written to
+ * in this transaction group. This ensures that all blocks
+ * written in this txg will be committed to stable storage
+ * before any uberblock that references them.
+ */
+ zio = zio_root(spa, NULL, NULL,
+ ZIO_FLAG_CONFIG_HELD | ZIO_FLAG_CANFAIL);
+ for (vd = txg_list_head(&spa->spa_vdev_txg_list, TXG_CLEAN(txg)); vd;
+ vd = txg_list_next(&spa->spa_vdev_txg_list, vd, TXG_CLEAN(txg))) {
+ zio_nowait(zio_ioctl(zio, spa, vd, DKIOCFLUSHWRITECACHE,
+ NULL, NULL, ZIO_PRIORITY_NOW,
+ ZIO_FLAG_CANFAIL | ZIO_FLAG_DONT_RETRY));
+ }
+ (void) zio_wait(zio);
+
+ /*
+ * Sync out the even labels (L0, L2) for every dirty vdev. If the
+ * system dies in the middle of this process, that's OK: all of the
+ * even labels that made it to disk will be newer than any uberblock,
+ * and will therefore be considered invalid. The odd labels (L1, L3),
+ * which have not yet been touched, will still be valid.
+ */
+ for (vd = list_head(&spa->spa_dirty_list); vd != NULL;
+ vd = list_next(&spa->spa_dirty_list, vd)) {
+ for (l = 0; l < VDEV_LABELS; l++) {
+ if (l & 1)
+ continue;
+ if ((error = vdev_sync_labels(vd, l, txg)) != 0)
+ return (error);
+ }
+ }
+
+ /*
+ * Flush the new labels to disk. This ensures that all even-label
+ * updates are committed to stable storage before the uberblock update.
+ */
+ zio = zio_root(spa, NULL, NULL,
+ ZIO_FLAG_CONFIG_HELD | ZIO_FLAG_CANFAIL);
+ for (vd = list_head(&spa->spa_dirty_list); vd != NULL;
+ vd = list_next(&spa->spa_dirty_list, vd)) {
+ zio_nowait(zio_ioctl(zio, spa, vd, DKIOCFLUSHWRITECACHE,
+ NULL, NULL, ZIO_PRIORITY_NOW,
+ ZIO_FLAG_CANFAIL | ZIO_FLAG_DONT_RETRY));
+ }
+ (void) zio_wait(zio);
+
+ /*
+ * Sync the uberblocks to all vdevs in the tree specified by uvd.
+ * If the system dies in the middle of this step, there are two cases
+ * to consider, and the on-disk state is consistent either way:
+ *
+ * (1) If none of the new uberblocks made it to disk, then the
+ * previous uberblock will be the newest, and the odd labels
+ * (which had not yet been touched) will be valid with respect
+ * to that uberblock.
+ *
+ * (2) If one or more new uberblocks made it to disk, then they
+ * will be the newest, and the even labels (which had all
+ * been successfully committed) will be valid with respect
+ * to the new uberblocks.
+ */
+ if ((error = vdev_uberblock_sync_tree(spa, ub, uvd, txg)) != 0)
+ return (error);
+
+ /*
+ * Flush the uberblocks to disk. This ensures that the odd labels
+ * are no longer needed (because the new uberblocks and the even
+ * labels are safely on disk), so it is safe to overwrite them.
+ */
+ (void) zio_wait(zio_ioctl(NULL, spa, uvd, DKIOCFLUSHWRITECACHE,
+ NULL, NULL, ZIO_PRIORITY_NOW,
+ ZIO_FLAG_CONFIG_HELD | ZIO_FLAG_CANFAIL | ZIO_FLAG_DONT_RETRY));
+
+ /*
+ * Sync out odd labels for every dirty vdev. If the system dies
+ * in the middle of this process, the even labels and the new
+ * uberblocks will suffice to open the pool. The next time
+ * the pool is opened, the first thing we'll do -- before any
+ * user data is modified -- is mark every vdev dirty so that
+ * all labels will be brought up to date.
+ */
+ for (vd = list_head(&spa->spa_dirty_list); vd != NULL;
+ vd = list_next(&spa->spa_dirty_list, vd)) {
+ for (l = 0; l < VDEV_LABELS; l++) {
+ if ((l & 1) == 0)
+ continue;
+ if ((error = vdev_sync_labels(vd, l, txg)) != 0)
+ return (error);
+ }
+ }
+
+ /*
+ * Flush the new labels to disk. This ensures that all odd-label
+ * updates are committed to stable storage before the next
+ * transaction group begins.
+ */
+ zio = zio_root(spa, NULL, NULL,
+ ZIO_FLAG_CONFIG_HELD | ZIO_FLAG_CANFAIL);
+ for (vd = list_head(&spa->spa_dirty_list); vd != NULL;
+ vd = list_next(&spa->spa_dirty_list, vd)) {
+ zio_nowait(zio_ioctl(zio, spa, vd, DKIOCFLUSHWRITECACHE,
+ NULL, NULL, ZIO_PRIORITY_NOW,
+ ZIO_FLAG_CANFAIL | ZIO_FLAG_DONT_RETRY));
+ }
+ (void) zio_wait(zio);
+
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c
new file mode 100644
index 0000000..73d1a83
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_mirror.c
@@ -0,0 +1,495 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/vdev_impl.h>
+#include <sys/zio.h>
+#include <sys/fs/zfs.h>
+
+/*
+ * Virtual device vector for mirroring.
+ */
+
+typedef struct mirror_child {
+ vdev_t *mc_vd;
+ uint64_t mc_offset;
+ int mc_error;
+ short mc_tried;
+ short mc_skipped;
+} mirror_child_t;
+
+typedef struct mirror_map {
+ int mm_children;
+ int mm_replacing;
+ int mm_preferred;
+ int mm_root;
+ mirror_child_t mm_child[1];
+} mirror_map_t;
+
+int vdev_mirror_shift = 21;
+
+static mirror_map_t *
+vdev_mirror_map_alloc(zio_t *zio)
+{
+ mirror_map_t *mm = NULL;
+ mirror_child_t *mc;
+ vdev_t *vd = zio->io_vd;
+ int c, d;
+
+ if (vd == NULL) {
+ dva_t *dva = zio->io_bp->blk_dva;
+ spa_t *spa = zio->io_spa;
+
+ c = BP_GET_NDVAS(zio->io_bp);
+
+ mm = kmem_zalloc(offsetof(mirror_map_t, mm_child[c]), KM_SLEEP);
+ mm->mm_children = c;
+ mm->mm_replacing = B_FALSE;
+ mm->mm_preferred = spa_get_random(c);
+ mm->mm_root = B_TRUE;
+
+ /*
+ * Check the other, lower-index DVAs to see if they're on
+ * the same vdev as the child we picked. If they are, use
+ * them since they are likely to have been allocated from
+ * the primary metaslab in use at the time, and hence are
+ * more likely to have locality with single-copy data.
+ */
+ for (c = mm->mm_preferred, d = c - 1; d >= 0; d--) {
+ if (DVA_GET_VDEV(&dva[d]) == DVA_GET_VDEV(&dva[c]))
+ mm->mm_preferred = d;
+ }
+
+ for (c = 0; c < mm->mm_children; c++) {
+ mc = &mm->mm_child[c];
+
+ mc->mc_vd = vdev_lookup_top(spa, DVA_GET_VDEV(&dva[c]));
+ mc->mc_offset = DVA_GET_OFFSET(&dva[c]);
+ }
+ } else {
+ c = vd->vdev_children;
+
+ mm = kmem_zalloc(offsetof(mirror_map_t, mm_child[c]), KM_SLEEP);
+ mm->mm_children = c;
+ mm->mm_replacing = (vd->vdev_ops == &vdev_replacing_ops ||
+ vd->vdev_ops == &vdev_spare_ops);
+ mm->mm_preferred = mm->mm_replacing ? 0 :
+ (zio->io_offset >> vdev_mirror_shift) % c;
+ mm->mm_root = B_FALSE;
+
+ for (c = 0; c < mm->mm_children; c++) {
+ mc = &mm->mm_child[c];
+ mc->mc_vd = vd->vdev_child[c];
+ mc->mc_offset = zio->io_offset;
+ }
+ }
+
+ zio->io_vsd = mm;
+ return (mm);
+}
+
+static void
+vdev_mirror_map_free(zio_t *zio)
+{
+ mirror_map_t *mm = zio->io_vsd;
+
+ kmem_free(mm, offsetof(mirror_map_t, mm_child[mm->mm_children]));
+ zio->io_vsd = NULL;
+}
+
+static int
+vdev_mirror_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift)
+{
+ vdev_t *cvd;
+ uint64_t c;
+ int numerrors = 0;
+ int ret, lasterror = 0;
+
+ if (vd->vdev_children == 0) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
+ return (EINVAL);
+ }
+
+ for (c = 0; c < vd->vdev_children; c++) {
+ cvd = vd->vdev_child[c];
+
+ if ((ret = vdev_open(cvd)) != 0) {
+ lasterror = ret;
+ numerrors++;
+ continue;
+ }
+
+ *asize = MIN(*asize - 1, cvd->vdev_asize - 1) + 1;
+ *ashift = MAX(*ashift, cvd->vdev_ashift);
+ }
+
+ if (numerrors == vd->vdev_children) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_NO_REPLICAS;
+ return (lasterror);
+ }
+
+ return (0);
+}
+
+static void
+vdev_mirror_close(vdev_t *vd)
+{
+ uint64_t c;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_close(vd->vdev_child[c]);
+}
+
+static void
+vdev_mirror_child_done(zio_t *zio)
+{
+ mirror_child_t *mc = zio->io_private;
+
+ mc->mc_error = zio->io_error;
+ mc->mc_tried = 1;
+ mc->mc_skipped = 0;
+}
+
+static void
+vdev_mirror_scrub_done(zio_t *zio)
+{
+ mirror_child_t *mc = zio->io_private;
+
+ if (zio->io_error == 0) {
+ zio_t *pio = zio->io_parent;
+ mutex_enter(&pio->io_lock);
+ ASSERT3U(zio->io_size, >=, pio->io_size);
+ bcopy(zio->io_data, pio->io_data, pio->io_size);
+ mutex_exit(&pio->io_lock);
+ }
+
+ zio_buf_free(zio->io_data, zio->io_size);
+
+ mc->mc_error = zio->io_error;
+ mc->mc_tried = 1;
+ mc->mc_skipped = 0;
+}
+
+static void
+vdev_mirror_repair_done(zio_t *zio)
+{
+ ASSERT(zio->io_private == zio->io_parent);
+ vdev_mirror_map_free(zio->io_private);
+}
+
+/*
+ * Try to find a child whose DTL doesn't contain the block we want to read.
+ * If we can't, try the read on any vdev we haven't already tried.
+ */
+static int
+vdev_mirror_child_select(zio_t *zio)
+{
+ mirror_map_t *mm = zio->io_vsd;
+ mirror_child_t *mc;
+ uint64_t txg = zio->io_txg;
+ int i, c;
+
+ ASSERT(zio->io_bp == NULL || zio->io_bp->blk_birth == txg);
+
+ /*
+ * Try to find a child whose DTL doesn't contain the block to read.
+ * If a child is known to be completely inaccessible (indicated by
+ * vdev_is_dead() returning B_TRUE), don't even try.
+ */
+ for (i = 0, c = mm->mm_preferred; i < mm->mm_children; i++, c++) {
+ if (c >= mm->mm_children)
+ c = 0;
+ mc = &mm->mm_child[c];
+ if (mc->mc_tried || mc->mc_skipped)
+ continue;
+ if (vdev_is_dead(mc->mc_vd)) {
+ mc->mc_error = ENXIO;
+ mc->mc_tried = 1; /* don't even try */
+ mc->mc_skipped = 1;
+ continue;
+ }
+ if (!vdev_dtl_contains(&mc->mc_vd->vdev_dtl_map, txg, 1))
+ return (c);
+ mc->mc_error = ESTALE;
+ mc->mc_skipped = 1;
+ }
+
+ /*
+ * Every device is either missing or has this txg in its DTL.
+ * Look for any child we haven't already tried before giving up.
+ */
+ for (c = 0; c < mm->mm_children; c++)
+ if (!mm->mm_child[c].mc_tried)
+ return (c);
+
+ /*
+ * Every child failed. There's no place left to look.
+ */
+ return (-1);
+}
+
+static void
+vdev_mirror_io_start(zio_t *zio)
+{
+ mirror_map_t *mm;
+ mirror_child_t *mc;
+ int c, children;
+
+ mm = vdev_mirror_map_alloc(zio);
+
+ if (zio->io_type == ZIO_TYPE_READ) {
+ if ((zio->io_flags & ZIO_FLAG_SCRUB) && !mm->mm_replacing) {
+ /*
+ * For scrubbing reads we need to allocate a read
+ * buffer for each child and issue reads to all
+ * children. If any child succeeds, it will copy its
+ * data into zio->io_data in vdev_mirror_scrub_done.
+ */
+ for (c = 0; c < mm->mm_children; c++) {
+ mc = &mm->mm_child[c];
+ zio_nowait(zio_vdev_child_io(zio, zio->io_bp,
+ mc->mc_vd, mc->mc_offset,
+ zio_buf_alloc(zio->io_size), zio->io_size,
+ zio->io_type, zio->io_priority,
+ ZIO_FLAG_CANFAIL,
+ vdev_mirror_scrub_done, mc));
+ }
+ zio_wait_children_done(zio);
+ return;
+ }
+ /*
+ * For normal reads just pick one child.
+ */
+ c = vdev_mirror_child_select(zio);
+ children = (c >= 0);
+ } else {
+ ASSERT(zio->io_type == ZIO_TYPE_WRITE);
+
+ /*
+ * If this is a resilvering I/O to a replacing vdev,
+ * only the last child should be written -- unless the
+ * first child happens to have a DTL entry here as well.
+ * All other writes go to all children.
+ */
+ if ((zio->io_flags & ZIO_FLAG_RESILVER) && mm->mm_replacing &&
+ !vdev_dtl_contains(&mm->mm_child[0].mc_vd->vdev_dtl_map,
+ zio->io_txg, 1)) {
+ c = mm->mm_children - 1;
+ children = 1;
+ } else {
+ c = 0;
+ children = mm->mm_children;
+ }
+ }
+
+ while (children--) {
+ mc = &mm->mm_child[c];
+ zio_nowait(zio_vdev_child_io(zio, zio->io_bp,
+ mc->mc_vd, mc->mc_offset,
+ zio->io_data, zio->io_size, zio->io_type, zio->io_priority,
+ ZIO_FLAG_CANFAIL, vdev_mirror_child_done, mc));
+ c++;
+ }
+
+ zio_wait_children_done(zio);
+}
+
+static void
+vdev_mirror_io_done(zio_t *zio)
+{
+ mirror_map_t *mm = zio->io_vsd;
+ mirror_child_t *mc;
+ int c;
+ int good_copies = 0;
+ int unexpected_errors = 0;
+
+ zio->io_error = 0;
+ zio->io_numerrors = 0;
+
+ for (c = 0; c < mm->mm_children; c++) {
+ mc = &mm->mm_child[c];
+
+ if (mc->mc_tried && mc->mc_error == 0) {
+ good_copies++;
+ continue;
+ }
+
+ /*
+ * We preserve any EIOs because those may be worth retrying;
+ * whereas ECKSUM and ENXIO are more likely to be persistent.
+ */
+ if (mc->mc_error) {
+ if (zio->io_error != EIO)
+ zio->io_error = mc->mc_error;
+ if (!mc->mc_skipped)
+ unexpected_errors++;
+ zio->io_numerrors++;
+ }
+ }
+
+ if (zio->io_type == ZIO_TYPE_WRITE) {
+ /*
+ * XXX -- for now, treat partial writes as success.
+ * XXX -- For a replacing vdev, we need to make sure the
+ * new child succeeds.
+ */
+ /* XXPOLICY */
+ if (good_copies != 0)
+ zio->io_error = 0;
+ vdev_mirror_map_free(zio);
+ zio_next_stage(zio);
+ return;
+ }
+
+ ASSERT(zio->io_type == ZIO_TYPE_READ);
+
+ /*
+ * If we don't have a good copy yet, keep trying other children.
+ */
+ /* XXPOLICY */
+ if (good_copies == 0 && (c = vdev_mirror_child_select(zio)) != -1) {
+ ASSERT(c >= 0 && c < mm->mm_children);
+ mc = &mm->mm_child[c];
+ dprintf("retrying i/o (err=%d) on child %s\n",
+ zio->io_error, vdev_description(mc->mc_vd));
+ zio->io_error = 0;
+ zio_vdev_io_redone(zio);
+ zio_nowait(zio_vdev_child_io(zio, zio->io_bp,
+ mc->mc_vd, mc->mc_offset, zio->io_data, zio->io_size,
+ ZIO_TYPE_READ, zio->io_priority, ZIO_FLAG_CANFAIL,
+ vdev_mirror_child_done, mc));
+ zio_wait_children_done(zio);
+ return;
+ }
+
+ /* XXPOLICY */
+ if (good_copies)
+ zio->io_error = 0;
+ else
+ ASSERT(zio->io_error != 0);
+
+ if (good_copies && (spa_mode & FWRITE) &&
+ (unexpected_errors ||
+ (zio->io_flags & ZIO_FLAG_RESILVER) ||
+ ((zio->io_flags & ZIO_FLAG_SCRUB) && mm->mm_replacing))) {
+ zio_t *rio;
+
+ /*
+ * Use the good data we have in hand to repair damaged children.
+ *
+ * We issue all repair I/Os as children of 'rio' to arrange
+ * that vdev_mirror_map_free(zio) will be invoked after all
+ * repairs complete, but before we advance to the next stage.
+ */
+ rio = zio_null(zio, zio->io_spa,
+ vdev_mirror_repair_done, zio, ZIO_FLAG_CANFAIL);
+
+ for (c = 0; c < mm->mm_children; c++) {
+ /*
+ * Don't rewrite known good children.
+ * Not only is it unnecessary, it could
+ * actually be harmful: if the system lost
+ * power while rewriting the only good copy,
+ * there would be no good copies left!
+ */
+ mc = &mm->mm_child[c];
+
+ if (mc->mc_error == 0) {
+ if (mc->mc_tried)
+ continue;
+ if (!(zio->io_flags & ZIO_FLAG_SCRUB) &&
+ !vdev_dtl_contains(&mc->mc_vd->vdev_dtl_map,
+ zio->io_txg, 1))
+ continue;
+ mc->mc_error = ESTALE;
+ }
+
+ dprintf("resilvered %s @ 0x%llx error %d\n",
+ vdev_description(mc->mc_vd), mc->mc_offset,
+ mc->mc_error);
+
+ zio_nowait(zio_vdev_child_io(rio, zio->io_bp, mc->mc_vd,
+ mc->mc_offset, zio->io_data, zio->io_size,
+ ZIO_TYPE_WRITE, zio->io_priority,
+ ZIO_FLAG_IO_REPAIR | ZIO_FLAG_CANFAIL |
+ ZIO_FLAG_DONT_PROPAGATE, NULL, NULL));
+ }
+
+ zio_nowait(rio);
+ zio_wait_children_done(zio);
+ return;
+ }
+
+ vdev_mirror_map_free(zio);
+ zio_next_stage(zio);
+}
+
+static void
+vdev_mirror_state_change(vdev_t *vd, int faulted, int degraded)
+{
+ if (faulted == vd->vdev_children)
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_NO_REPLICAS);
+ else if (degraded + faulted != 0)
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, VDEV_AUX_NONE);
+ else
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_HEALTHY, VDEV_AUX_NONE);
+}
+
+vdev_ops_t vdev_mirror_ops = {
+ vdev_mirror_open,
+ vdev_mirror_close,
+ vdev_default_asize,
+ vdev_mirror_io_start,
+ vdev_mirror_io_done,
+ vdev_mirror_state_change,
+ VDEV_TYPE_MIRROR, /* name of this vdev type */
+ B_FALSE /* not a leaf vdev */
+};
+
+vdev_ops_t vdev_replacing_ops = {
+ vdev_mirror_open,
+ vdev_mirror_close,
+ vdev_default_asize,
+ vdev_mirror_io_start,
+ vdev_mirror_io_done,
+ vdev_mirror_state_change,
+ VDEV_TYPE_REPLACING, /* name of this vdev type */
+ B_FALSE /* not a leaf vdev */
+};
+
+vdev_ops_t vdev_spare_ops = {
+ vdev_mirror_open,
+ vdev_mirror_close,
+ vdev_default_asize,
+ vdev_mirror_io_start,
+ vdev_mirror_io_done,
+ vdev_mirror_state_change,
+ VDEV_TYPE_SPARE, /* name of this vdev type */
+ B_FALSE /* not a leaf vdev */
+};
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c
new file mode 100644
index 0000000..b35f4a5
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_missing.c
@@ -0,0 +1,89 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * The 'missing' vdev is a special vdev type used only during import. It
+ * signifies a placeholder in the root vdev for some vdev that we know is
+ * missing. We pass it down to the kernel to allow the rest of the
+ * configuration to parsed and an attempt made to open all available devices.
+ * Because its GUID is always 0, we know that the guid sum will mismatch and we
+ * won't be able to open the pool anyway.
+ */
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/vdev_impl.h>
+#include <sys/fs/zfs.h>
+#include <sys/zio.h>
+
+/* ARGSUSED */
+static int
+vdev_missing_open(vdev_t *vd, uint64_t *psize, uint64_t *ashift)
+{
+ /*
+ * Really this should just fail. But then the root vdev will be in the
+ * faulted state with VDEV_AUX_NO_REPLICAS, when what we really want is
+ * VDEV_AUX_BAD_GUID_SUM. So we pretend to succeed, knowing that we
+ * will fail the GUID sum check before ever trying to open the pool.
+ */
+ *psize = SPA_MINDEVSIZE;
+ *ashift = SPA_MINBLOCKSHIFT;
+ return (0);
+}
+
+/* ARGSUSED */
+static void
+vdev_missing_close(vdev_t *vd)
+{
+}
+
+/* ARGSUSED */
+static void
+vdev_missing_io_start(zio_t *zio)
+{
+ zio->io_error = ENOTSUP;
+ zio_next_stage_async(zio);
+}
+
+/* ARGSUSED */
+static void
+vdev_missing_io_done(zio_t *zio)
+{
+ zio_next_stage(zio);
+}
+
+vdev_ops_t vdev_missing_ops = {
+ vdev_missing_open,
+ vdev_missing_close,
+ vdev_default_asize,
+ vdev_missing_io_start,
+ vdev_missing_io_done,
+ NULL,
+ VDEV_TYPE_MISSING, /* name of this vdev type */
+ B_TRUE /* leaf vdev */
+};
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
new file mode 100644
index 0000000..7e99c1f
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_queue.c
@@ -0,0 +1,323 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/vdev_impl.h>
+#include <sys/zio.h>
+#include <sys/avl.h>
+
+/*
+ * These tunables are for performance analysis.
+ */
+/*
+ * zfs_vdev_max_pending is the maximum number of i/os concurrently
+ * pending to each device. zfs_vdev_min_pending is the initial number
+ * of i/os pending to each device (before it starts ramping up to
+ * max_pending).
+ */
+int zfs_vdev_max_pending = 35;
+int zfs_vdev_min_pending = 4;
+
+/* deadline = pri + (lbolt >> time_shift) */
+int zfs_vdev_time_shift = 6;
+
+/* exponential I/O issue ramp-up rate */
+int zfs_vdev_ramp_rate = 2;
+
+/*
+ * i/os will be aggregated into a single large i/o up to
+ * zfs_vdev_aggregation_limit bytes long.
+ */
+int zfs_vdev_aggregation_limit = SPA_MAXBLOCKSIZE;
+
+/*
+ * Virtual device vector for disk I/O scheduling.
+ */
+int
+vdev_queue_deadline_compare(const void *x1, const void *x2)
+{
+ const zio_t *z1 = x1;
+ const zio_t *z2 = x2;
+
+ if (z1->io_deadline < z2->io_deadline)
+ return (-1);
+ if (z1->io_deadline > z2->io_deadline)
+ return (1);
+
+ if (z1->io_offset < z2->io_offset)
+ return (-1);
+ if (z1->io_offset > z2->io_offset)
+ return (1);
+
+ if (z1 < z2)
+ return (-1);
+ if (z1 > z2)
+ return (1);
+
+ return (0);
+}
+
+int
+vdev_queue_offset_compare(const void *x1, const void *x2)
+{
+ const zio_t *z1 = x1;
+ const zio_t *z2 = x2;
+
+ if (z1->io_offset < z2->io_offset)
+ return (-1);
+ if (z1->io_offset > z2->io_offset)
+ return (1);
+
+ if (z1 < z2)
+ return (-1);
+ if (z1 > z2)
+ return (1);
+
+ return (0);
+}
+
+void
+vdev_queue_init(vdev_t *vd)
+{
+ vdev_queue_t *vq = &vd->vdev_queue;
+
+ mutex_init(&vq->vq_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ avl_create(&vq->vq_deadline_tree, vdev_queue_deadline_compare,
+ sizeof (zio_t), offsetof(struct zio, io_deadline_node));
+
+ avl_create(&vq->vq_read_tree, vdev_queue_offset_compare,
+ sizeof (zio_t), offsetof(struct zio, io_offset_node));
+
+ avl_create(&vq->vq_write_tree, vdev_queue_offset_compare,
+ sizeof (zio_t), offsetof(struct zio, io_offset_node));
+
+ avl_create(&vq->vq_pending_tree, vdev_queue_offset_compare,
+ sizeof (zio_t), offsetof(struct zio, io_offset_node));
+}
+
+void
+vdev_queue_fini(vdev_t *vd)
+{
+ vdev_queue_t *vq = &vd->vdev_queue;
+
+ avl_destroy(&vq->vq_deadline_tree);
+ avl_destroy(&vq->vq_read_tree);
+ avl_destroy(&vq->vq_write_tree);
+ avl_destroy(&vq->vq_pending_tree);
+
+ mutex_destroy(&vq->vq_lock);
+}
+
+static void
+vdev_queue_io_add(vdev_queue_t *vq, zio_t *zio)
+{
+ avl_add(&vq->vq_deadline_tree, zio);
+ avl_add(zio->io_vdev_tree, zio);
+}
+
+static void
+vdev_queue_io_remove(vdev_queue_t *vq, zio_t *zio)
+{
+ avl_remove(&vq->vq_deadline_tree, zio);
+ avl_remove(zio->io_vdev_tree, zio);
+}
+
+static void
+vdev_queue_agg_io_done(zio_t *aio)
+{
+ zio_t *dio;
+ uint64_t offset = 0;
+
+ while ((dio = aio->io_delegate_list) != NULL) {
+ if (aio->io_type == ZIO_TYPE_READ)
+ bcopy((char *)aio->io_data + offset, dio->io_data,
+ dio->io_size);
+ offset += dio->io_size;
+ aio->io_delegate_list = dio->io_delegate_next;
+ dio->io_delegate_next = NULL;
+ dio->io_error = aio->io_error;
+ zio_next_stage(dio);
+ }
+ ASSERT3U(offset, ==, aio->io_size);
+
+ zio_buf_free(aio->io_data, aio->io_size);
+}
+
+#define IS_ADJACENT(io, nio) \
+ ((io)->io_offset + (io)->io_size == (nio)->io_offset)
+
+typedef void zio_issue_func_t(zio_t *);
+
+static zio_t *
+vdev_queue_io_to_issue(vdev_queue_t *vq, uint64_t pending_limit,
+ zio_issue_func_t **funcp)
+{
+ zio_t *fio, *lio, *aio, *dio;
+ avl_tree_t *tree;
+ uint64_t size;
+
+ ASSERT(MUTEX_HELD(&vq->vq_lock));
+
+ *funcp = NULL;
+
+ if (avl_numnodes(&vq->vq_pending_tree) >= pending_limit ||
+ avl_numnodes(&vq->vq_deadline_tree) == 0)
+ return (NULL);
+
+ fio = lio = avl_first(&vq->vq_deadline_tree);
+
+ tree = fio->io_vdev_tree;
+ size = fio->io_size;
+
+ while ((dio = AVL_PREV(tree, fio)) != NULL && IS_ADJACENT(dio, fio) &&
+ size + dio->io_size <= zfs_vdev_aggregation_limit) {
+ dio->io_delegate_next = fio;
+ fio = dio;
+ size += dio->io_size;
+ }
+
+ while ((dio = AVL_NEXT(tree, lio)) != NULL && IS_ADJACENT(lio, dio) &&
+ size + dio->io_size <= zfs_vdev_aggregation_limit) {
+ lio->io_delegate_next = dio;
+ lio = dio;
+ size += dio->io_size;
+ }
+
+ if (fio != lio) {
+ char *buf = zio_buf_alloc(size);
+ uint64_t offset = 0;
+ int nagg = 0;
+
+ ASSERT(size <= zfs_vdev_aggregation_limit);
+
+ aio = zio_vdev_child_io(fio, NULL, fio->io_vd,
+ fio->io_offset, buf, size, fio->io_type,
+ ZIO_PRIORITY_NOW, ZIO_FLAG_DONT_QUEUE |
+ ZIO_FLAG_DONT_CACHE | ZIO_FLAG_DONT_PROPAGATE |
+ ZIO_FLAG_NOBOOKMARK,
+ vdev_queue_agg_io_done, NULL);
+
+ aio->io_delegate_list = fio;
+
+ for (dio = fio; dio != NULL; dio = dio->io_delegate_next) {
+ ASSERT(dio->io_type == aio->io_type);
+ ASSERT(dio->io_vdev_tree == tree);
+ if (dio->io_type == ZIO_TYPE_WRITE)
+ bcopy(dio->io_data, buf + offset, dio->io_size);
+ offset += dio->io_size;
+ vdev_queue_io_remove(vq, dio);
+ zio_vdev_io_bypass(dio);
+ nagg++;
+ }
+
+ ASSERT(offset == size);
+
+ dprintf("%5s T=%llu off=%8llx agg=%3d "
+ "old=%5llx new=%5llx\n",
+ zio_type_name[fio->io_type],
+ fio->io_deadline, fio->io_offset, nagg, fio->io_size, size);
+
+ avl_add(&vq->vq_pending_tree, aio);
+
+ *funcp = zio_nowait;
+ return (aio);
+ }
+
+ ASSERT(fio->io_vdev_tree == tree);
+ vdev_queue_io_remove(vq, fio);
+
+ avl_add(&vq->vq_pending_tree, fio);
+
+ *funcp = zio_next_stage;
+
+ return (fio);
+}
+
+zio_t *
+vdev_queue_io(zio_t *zio)
+{
+ vdev_queue_t *vq = &zio->io_vd->vdev_queue;
+ zio_t *nio;
+ zio_issue_func_t *func;
+
+ ASSERT(zio->io_type == ZIO_TYPE_READ || zio->io_type == ZIO_TYPE_WRITE);
+
+ if (zio->io_flags & ZIO_FLAG_DONT_QUEUE)
+ return (zio);
+
+ zio->io_flags |= ZIO_FLAG_DONT_CACHE | ZIO_FLAG_DONT_QUEUE;
+
+ if (zio->io_type == ZIO_TYPE_READ)
+ zio->io_vdev_tree = &vq->vq_read_tree;
+ else
+ zio->io_vdev_tree = &vq->vq_write_tree;
+
+ mutex_enter(&vq->vq_lock);
+
+ zio->io_deadline = (zio->io_timestamp >> zfs_vdev_time_shift) +
+ zio->io_priority;
+
+ vdev_queue_io_add(vq, zio);
+
+ nio = vdev_queue_io_to_issue(vq, zfs_vdev_min_pending, &func);
+
+ mutex_exit(&vq->vq_lock);
+
+ if (nio == NULL || func != zio_nowait)
+ return (nio);
+
+ func(nio);
+ return (NULL);
+}
+
+void
+vdev_queue_io_done(zio_t *zio)
+{
+ vdev_queue_t *vq = &zio->io_vd->vdev_queue;
+ zio_t *nio;
+ zio_issue_func_t *func;
+ int i;
+
+ mutex_enter(&vq->vq_lock);
+
+ avl_remove(&vq->vq_pending_tree, zio);
+
+ for (i = 0; i < zfs_vdev_ramp_rate; i++) {
+ nio = vdev_queue_io_to_issue(vq, zfs_vdev_max_pending, &func);
+ if (nio == NULL)
+ break;
+ mutex_exit(&vq->vq_lock);
+ if (func == zio_next_stage)
+ zio_vdev_io_reissue(nio);
+ func(nio);
+ mutex_enter(&vq->vq_lock);
+ }
+
+ mutex_exit(&vq->vq_lock);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c
new file mode 100644
index 0000000..0c86630
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_raidz.c
@@ -0,0 +1,1237 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/vdev_impl.h>
+#include <sys/zio.h>
+#include <sys/zio_checksum.h>
+#include <sys/fs/zfs.h>
+#include <sys/fm/fs/zfs.h>
+
+/*
+ * Virtual device vector for RAID-Z.
+ *
+ * This vdev supports both single and double parity. For single parity, we
+ * use a simple XOR of all the data columns. For double parity, we use both
+ * the simple XOR as well as a technique described in "The mathematics of
+ * RAID-6" by H. Peter Anvin. This technique defines a Galois field, GF(2^8),
+ * over the integers expressable in a single byte. Briefly, the operations on
+ * the field are defined as follows:
+ *
+ * o addition (+) is represented by a bitwise XOR
+ * o subtraction (-) is therefore identical to addition: A + B = A - B
+ * o multiplication of A by 2 is defined by the following bitwise expression:
+ * (A * 2)_7 = A_6
+ * (A * 2)_6 = A_5
+ * (A * 2)_5 = A_4
+ * (A * 2)_4 = A_3 + A_7
+ * (A * 2)_3 = A_2 + A_7
+ * (A * 2)_2 = A_1 + A_7
+ * (A * 2)_1 = A_0
+ * (A * 2)_0 = A_7
+ *
+ * In C, multiplying by 2 is therefore ((a << 1) ^ ((a & 0x80) ? 0x1d : 0)).
+ *
+ * Observe that any number in the field (except for 0) can be expressed as a
+ * power of 2 -- a generator for the field. We store a table of the powers of
+ * 2 and logs base 2 for quick look ups, and exploit the fact that A * B can
+ * be rewritten as 2^(log_2(A) + log_2(B)) (where '+' is normal addition rather
+ * than field addition). The inverse of a field element A (A^-1) is A^254.
+ *
+ * The two parity columns, P and Q, over several data columns, D_0, ... D_n-1,
+ * can be expressed by field operations:
+ *
+ * P = D_0 + D_1 + ... + D_n-2 + D_n-1
+ * Q = 2^n-1 * D_0 + 2^n-2 * D_1 + ... + 2^1 * D_n-2 + 2^0 * D_n-1
+ * = ((...((D_0) * 2 + D_1) * 2 + ...) * 2 + D_n-2) * 2 + D_n-1
+ *
+ * See the reconstruction code below for how P and Q can used individually or
+ * in concert to recover missing data columns.
+ */
+
+typedef struct raidz_col {
+ uint64_t rc_devidx; /* child device index for I/O */
+ uint64_t rc_offset; /* device offset */
+ uint64_t rc_size; /* I/O size */
+ void *rc_data; /* I/O data */
+ int rc_error; /* I/O error for this device */
+ uint8_t rc_tried; /* Did we attempt this I/O column? */
+ uint8_t rc_skipped; /* Did we skip this I/O column? */
+} raidz_col_t;
+
+typedef struct raidz_map {
+ uint64_t rm_cols; /* Column count */
+ uint64_t rm_bigcols; /* Number of oversized columns */
+ uint64_t rm_asize; /* Actual total I/O size */
+ uint64_t rm_missingdata; /* Count of missing data devices */
+ uint64_t rm_missingparity; /* Count of missing parity devices */
+ uint64_t rm_firstdatacol; /* First data column/parity count */
+ raidz_col_t rm_col[1]; /* Flexible array of I/O columns */
+} raidz_map_t;
+
+#define VDEV_RAIDZ_P 0
+#define VDEV_RAIDZ_Q 1
+
+#define VDEV_RAIDZ_MAXPARITY 2
+
+#define VDEV_RAIDZ_MUL_2(a) (((a) << 1) ^ (((a) & 0x80) ? 0x1d : 0))
+
+/*
+ * These two tables represent powers and logs of 2 in the Galois field defined
+ * above. These values were computed by repeatedly multiplying by 2 as above.
+ */
+static const uint8_t vdev_raidz_pow2[256] = {
+ 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80,
+ 0x1d, 0x3a, 0x74, 0xe8, 0xcd, 0x87, 0x13, 0x26,
+ 0x4c, 0x98, 0x2d, 0x5a, 0xb4, 0x75, 0xea, 0xc9,
+ 0x8f, 0x03, 0x06, 0x0c, 0x18, 0x30, 0x60, 0xc0,
+ 0x9d, 0x27, 0x4e, 0x9c, 0x25, 0x4a, 0x94, 0x35,
+ 0x6a, 0xd4, 0xb5, 0x77, 0xee, 0xc1, 0x9f, 0x23,
+ 0x46, 0x8c, 0x05, 0x0a, 0x14, 0x28, 0x50, 0xa0,
+ 0x5d, 0xba, 0x69, 0xd2, 0xb9, 0x6f, 0xde, 0xa1,
+ 0x5f, 0xbe, 0x61, 0xc2, 0x99, 0x2f, 0x5e, 0xbc,
+ 0x65, 0xca, 0x89, 0x0f, 0x1e, 0x3c, 0x78, 0xf0,
+ 0xfd, 0xe7, 0xd3, 0xbb, 0x6b, 0xd6, 0xb1, 0x7f,
+ 0xfe, 0xe1, 0xdf, 0xa3, 0x5b, 0xb6, 0x71, 0xe2,
+ 0xd9, 0xaf, 0x43, 0x86, 0x11, 0x22, 0x44, 0x88,
+ 0x0d, 0x1a, 0x34, 0x68, 0xd0, 0xbd, 0x67, 0xce,
+ 0x81, 0x1f, 0x3e, 0x7c, 0xf8, 0xed, 0xc7, 0x93,
+ 0x3b, 0x76, 0xec, 0xc5, 0x97, 0x33, 0x66, 0xcc,
+ 0x85, 0x17, 0x2e, 0x5c, 0xb8, 0x6d, 0xda, 0xa9,
+ 0x4f, 0x9e, 0x21, 0x42, 0x84, 0x15, 0x2a, 0x54,
+ 0xa8, 0x4d, 0x9a, 0x29, 0x52, 0xa4, 0x55, 0xaa,
+ 0x49, 0x92, 0x39, 0x72, 0xe4, 0xd5, 0xb7, 0x73,
+ 0xe6, 0xd1, 0xbf, 0x63, 0xc6, 0x91, 0x3f, 0x7e,
+ 0xfc, 0xe5, 0xd7, 0xb3, 0x7b, 0xf6, 0xf1, 0xff,
+ 0xe3, 0xdb, 0xab, 0x4b, 0x96, 0x31, 0x62, 0xc4,
+ 0x95, 0x37, 0x6e, 0xdc, 0xa5, 0x57, 0xae, 0x41,
+ 0x82, 0x19, 0x32, 0x64, 0xc8, 0x8d, 0x07, 0x0e,
+ 0x1c, 0x38, 0x70, 0xe0, 0xdd, 0xa7, 0x53, 0xa6,
+ 0x51, 0xa2, 0x59, 0xb2, 0x79, 0xf2, 0xf9, 0xef,
+ 0xc3, 0x9b, 0x2b, 0x56, 0xac, 0x45, 0x8a, 0x09,
+ 0x12, 0x24, 0x48, 0x90, 0x3d, 0x7a, 0xf4, 0xf5,
+ 0xf7, 0xf3, 0xfb, 0xeb, 0xcb, 0x8b, 0x0b, 0x16,
+ 0x2c, 0x58, 0xb0, 0x7d, 0xfa, 0xe9, 0xcf, 0x83,
+ 0x1b, 0x36, 0x6c, 0xd8, 0xad, 0x47, 0x8e, 0x01
+};
+static const uint8_t vdev_raidz_log2[256] = {
+ 0x00, 0x00, 0x01, 0x19, 0x02, 0x32, 0x1a, 0xc6,
+ 0x03, 0xdf, 0x33, 0xee, 0x1b, 0x68, 0xc7, 0x4b,
+ 0x04, 0x64, 0xe0, 0x0e, 0x34, 0x8d, 0xef, 0x81,
+ 0x1c, 0xc1, 0x69, 0xf8, 0xc8, 0x08, 0x4c, 0x71,
+ 0x05, 0x8a, 0x65, 0x2f, 0xe1, 0x24, 0x0f, 0x21,
+ 0x35, 0x93, 0x8e, 0xda, 0xf0, 0x12, 0x82, 0x45,
+ 0x1d, 0xb5, 0xc2, 0x7d, 0x6a, 0x27, 0xf9, 0xb9,
+ 0xc9, 0x9a, 0x09, 0x78, 0x4d, 0xe4, 0x72, 0xa6,
+ 0x06, 0xbf, 0x8b, 0x62, 0x66, 0xdd, 0x30, 0xfd,
+ 0xe2, 0x98, 0x25, 0xb3, 0x10, 0x91, 0x22, 0x88,
+ 0x36, 0xd0, 0x94, 0xce, 0x8f, 0x96, 0xdb, 0xbd,
+ 0xf1, 0xd2, 0x13, 0x5c, 0x83, 0x38, 0x46, 0x40,
+ 0x1e, 0x42, 0xb6, 0xa3, 0xc3, 0x48, 0x7e, 0x6e,
+ 0x6b, 0x3a, 0x28, 0x54, 0xfa, 0x85, 0xba, 0x3d,
+ 0xca, 0x5e, 0x9b, 0x9f, 0x0a, 0x15, 0x79, 0x2b,
+ 0x4e, 0xd4, 0xe5, 0xac, 0x73, 0xf3, 0xa7, 0x57,
+ 0x07, 0x70, 0xc0, 0xf7, 0x8c, 0x80, 0x63, 0x0d,
+ 0x67, 0x4a, 0xde, 0xed, 0x31, 0xc5, 0xfe, 0x18,
+ 0xe3, 0xa5, 0x99, 0x77, 0x26, 0xb8, 0xb4, 0x7c,
+ 0x11, 0x44, 0x92, 0xd9, 0x23, 0x20, 0x89, 0x2e,
+ 0x37, 0x3f, 0xd1, 0x5b, 0x95, 0xbc, 0xcf, 0xcd,
+ 0x90, 0x87, 0x97, 0xb2, 0xdc, 0xfc, 0xbe, 0x61,
+ 0xf2, 0x56, 0xd3, 0xab, 0x14, 0x2a, 0x5d, 0x9e,
+ 0x84, 0x3c, 0x39, 0x53, 0x47, 0x6d, 0x41, 0xa2,
+ 0x1f, 0x2d, 0x43, 0xd8, 0xb7, 0x7b, 0xa4, 0x76,
+ 0xc4, 0x17, 0x49, 0xec, 0x7f, 0x0c, 0x6f, 0xf6,
+ 0x6c, 0xa1, 0x3b, 0x52, 0x29, 0x9d, 0x55, 0xaa,
+ 0xfb, 0x60, 0x86, 0xb1, 0xbb, 0xcc, 0x3e, 0x5a,
+ 0xcb, 0x59, 0x5f, 0xb0, 0x9c, 0xa9, 0xa0, 0x51,
+ 0x0b, 0xf5, 0x16, 0xeb, 0x7a, 0x75, 0x2c, 0xd7,
+ 0x4f, 0xae, 0xd5, 0xe9, 0xe6, 0xe7, 0xad, 0xe8,
+ 0x74, 0xd6, 0xf4, 0xea, 0xa8, 0x50, 0x58, 0xaf,
+};
+
+/*
+ * Multiply a given number by 2 raised to the given power.
+ */
+static uint8_t
+vdev_raidz_exp2(uint_t a, int exp)
+{
+ if (a == 0)
+ return (0);
+
+ ASSERT(exp >= 0);
+ ASSERT(vdev_raidz_log2[a] > 0 || a == 1);
+
+ exp += vdev_raidz_log2[a];
+ if (exp > 255)
+ exp -= 255;
+
+ return (vdev_raidz_pow2[exp]);
+}
+
+static raidz_map_t *
+vdev_raidz_map_alloc(zio_t *zio, uint64_t unit_shift, uint64_t dcols,
+ uint64_t nparity)
+{
+ raidz_map_t *rm;
+ uint64_t b = zio->io_offset >> unit_shift;
+ uint64_t s = zio->io_size >> unit_shift;
+ uint64_t f = b % dcols;
+ uint64_t o = (b / dcols) << unit_shift;
+ uint64_t q, r, c, bc, col, acols, coff, devidx;
+
+ q = s / (dcols - nparity);
+ r = s - q * (dcols - nparity);
+ bc = (r == 0 ? 0 : r + nparity);
+
+ acols = (q == 0 ? bc : dcols);
+
+ rm = kmem_alloc(offsetof(raidz_map_t, rm_col[acols]), KM_SLEEP);
+
+ rm->rm_cols = acols;
+ rm->rm_bigcols = bc;
+ rm->rm_asize = 0;
+ rm->rm_missingdata = 0;
+ rm->rm_missingparity = 0;
+ rm->rm_firstdatacol = nparity;
+
+ for (c = 0; c < acols; c++) {
+ col = f + c;
+ coff = o;
+ if (col >= dcols) {
+ col -= dcols;
+ coff += 1ULL << unit_shift;
+ }
+ rm->rm_col[c].rc_devidx = col;
+ rm->rm_col[c].rc_offset = coff;
+ rm->rm_col[c].rc_size = (q + (c < bc)) << unit_shift;
+ rm->rm_col[c].rc_data = NULL;
+ rm->rm_col[c].rc_error = 0;
+ rm->rm_col[c].rc_tried = 0;
+ rm->rm_col[c].rc_skipped = 0;
+ rm->rm_asize += rm->rm_col[c].rc_size;
+ }
+
+ rm->rm_asize = roundup(rm->rm_asize, (nparity + 1) << unit_shift);
+
+ for (c = 0; c < rm->rm_firstdatacol; c++)
+ rm->rm_col[c].rc_data = zio_buf_alloc(rm->rm_col[c].rc_size);
+
+ rm->rm_col[c].rc_data = zio->io_data;
+
+ for (c = c + 1; c < acols; c++)
+ rm->rm_col[c].rc_data = (char *)rm->rm_col[c - 1].rc_data +
+ rm->rm_col[c - 1].rc_size;
+
+ /*
+ * If all data stored spans all columns, there's a danger that parity
+ * will always be on the same device and, since parity isn't read
+ * during normal operation, that that device's I/O bandwidth won't be
+ * used effectively. We therefore switch the parity every 1MB.
+ *
+ * ... at least that was, ostensibly, the theory. As a practical
+ * matter unless we juggle the parity between all devices evenly, we
+ * won't see any benefit. Further, occasional writes that aren't a
+ * multiple of the LCM of the number of children and the minimum
+ * stripe width are sufficient to avoid pessimal behavior.
+ * Unfortunately, this decision created an implicit on-disk format
+ * requirement that we need to support for all eternity, but only
+ * for single-parity RAID-Z.
+ */
+ ASSERT(rm->rm_cols >= 2);
+ ASSERT(rm->rm_col[0].rc_size == rm->rm_col[1].rc_size);
+
+ if (rm->rm_firstdatacol == 1 && (zio->io_offset & (1ULL << 20))) {
+ devidx = rm->rm_col[0].rc_devidx;
+ o = rm->rm_col[0].rc_offset;
+ rm->rm_col[0].rc_devidx = rm->rm_col[1].rc_devidx;
+ rm->rm_col[0].rc_offset = rm->rm_col[1].rc_offset;
+ rm->rm_col[1].rc_devidx = devidx;
+ rm->rm_col[1].rc_offset = o;
+ }
+
+ zio->io_vsd = rm;
+ return (rm);
+}
+
+static void
+vdev_raidz_map_free(zio_t *zio)
+{
+ raidz_map_t *rm = zio->io_vsd;
+ int c;
+
+ for (c = 0; c < rm->rm_firstdatacol; c++)
+ zio_buf_free(rm->rm_col[c].rc_data, rm->rm_col[c].rc_size);
+
+ kmem_free(rm, offsetof(raidz_map_t, rm_col[rm->rm_cols]));
+ zio->io_vsd = NULL;
+}
+
+static void
+vdev_raidz_generate_parity_p(raidz_map_t *rm)
+{
+ uint64_t *p, *src, pcount, ccount, i;
+ int c;
+
+ pcount = rm->rm_col[VDEV_RAIDZ_P].rc_size / sizeof (src[0]);
+
+ for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) {
+ src = rm->rm_col[c].rc_data;
+ p = rm->rm_col[VDEV_RAIDZ_P].rc_data;
+ ccount = rm->rm_col[c].rc_size / sizeof (src[0]);
+
+ if (c == rm->rm_firstdatacol) {
+ ASSERT(ccount == pcount);
+ for (i = 0; i < ccount; i++, p++, src++) {
+ *p = *src;
+ }
+ } else {
+ ASSERT(ccount <= pcount);
+ for (i = 0; i < ccount; i++, p++, src++) {
+ *p ^= *src;
+ }
+ }
+ }
+}
+
+static void
+vdev_raidz_generate_parity_pq(raidz_map_t *rm)
+{
+ uint64_t *q, *p, *src, pcount, ccount, mask, i;
+ int c;
+
+ pcount = rm->rm_col[VDEV_RAIDZ_P].rc_size / sizeof (src[0]);
+ ASSERT(rm->rm_col[VDEV_RAIDZ_P].rc_size ==
+ rm->rm_col[VDEV_RAIDZ_Q].rc_size);
+
+ for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) {
+ src = rm->rm_col[c].rc_data;
+ p = rm->rm_col[VDEV_RAIDZ_P].rc_data;
+ q = rm->rm_col[VDEV_RAIDZ_Q].rc_data;
+ ccount = rm->rm_col[c].rc_size / sizeof (src[0]);
+
+ if (c == rm->rm_firstdatacol) {
+ ASSERT(ccount == pcount || ccount == 0);
+ for (i = 0; i < ccount; i++, p++, q++, src++) {
+ *q = *src;
+ *p = *src;
+ }
+ for (; i < pcount; i++, p++, q++, src++) {
+ *q = 0;
+ *p = 0;
+ }
+ } else {
+ ASSERT(ccount <= pcount);
+
+ /*
+ * Rather than multiplying each byte individually (as
+ * described above), we are able to handle 8 at once
+ * by generating a mask based on the high bit in each
+ * byte and using that to conditionally XOR in 0x1d.
+ */
+ for (i = 0; i < ccount; i++, p++, q++, src++) {
+ mask = *q & 0x8080808080808080ULL;
+ mask = (mask << 1) - (mask >> 7);
+ *q = ((*q << 1) & 0xfefefefefefefefeULL) ^
+ (mask & 0x1d1d1d1d1d1d1d1dULL);
+ *q ^= *src;
+ *p ^= *src;
+ }
+
+ /*
+ * Treat short columns as though they are full of 0s.
+ */
+ for (; i < pcount; i++, q++) {
+ mask = *q & 0x8080808080808080ULL;
+ mask = (mask << 1) - (mask >> 7);
+ *q = ((*q << 1) & 0xfefefefefefefefeULL) ^
+ (mask & 0x1d1d1d1d1d1d1d1dULL);
+ }
+ }
+ }
+}
+
+static void
+vdev_raidz_reconstruct_p(raidz_map_t *rm, int x)
+{
+ uint64_t *dst, *src, xcount, ccount, count, i;
+ int c;
+
+ xcount = rm->rm_col[x].rc_size / sizeof (src[0]);
+ ASSERT(xcount <= rm->rm_col[VDEV_RAIDZ_P].rc_size / sizeof (src[0]));
+ ASSERT(xcount > 0);
+
+ src = rm->rm_col[VDEV_RAIDZ_P].rc_data;
+ dst = rm->rm_col[x].rc_data;
+ for (i = 0; i < xcount; i++, dst++, src++) {
+ *dst = *src;
+ }
+
+ for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) {
+ src = rm->rm_col[c].rc_data;
+ dst = rm->rm_col[x].rc_data;
+
+ if (c == x)
+ continue;
+
+ ccount = rm->rm_col[c].rc_size / sizeof (src[0]);
+ count = MIN(ccount, xcount);
+
+ for (i = 0; i < count; i++, dst++, src++) {
+ *dst ^= *src;
+ }
+ }
+}
+
+static void
+vdev_raidz_reconstruct_q(raidz_map_t *rm, int x)
+{
+ uint64_t *dst, *src, xcount, ccount, count, mask, i;
+ uint8_t *b;
+ int c, j, exp;
+
+ xcount = rm->rm_col[x].rc_size / sizeof (src[0]);
+ ASSERT(xcount <= rm->rm_col[VDEV_RAIDZ_Q].rc_size / sizeof (src[0]));
+
+ for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) {
+ src = rm->rm_col[c].rc_data;
+ dst = rm->rm_col[x].rc_data;
+
+ if (c == x)
+ ccount = 0;
+ else
+ ccount = rm->rm_col[c].rc_size / sizeof (src[0]);
+
+ count = MIN(ccount, xcount);
+
+ if (c == rm->rm_firstdatacol) {
+ for (i = 0; i < count; i++, dst++, src++) {
+ *dst = *src;
+ }
+ for (; i < xcount; i++, dst++) {
+ *dst = 0;
+ }
+
+ } else {
+ /*
+ * For an explanation of this, see the comment in
+ * vdev_raidz_generate_parity_pq() above.
+ */
+ for (i = 0; i < count; i++, dst++, src++) {
+ mask = *dst & 0x8080808080808080ULL;
+ mask = (mask << 1) - (mask >> 7);
+ *dst = ((*dst << 1) & 0xfefefefefefefefeULL) ^
+ (mask & 0x1d1d1d1d1d1d1d1dULL);
+ *dst ^= *src;
+ }
+
+ for (; i < xcount; i++, dst++) {
+ mask = *dst & 0x8080808080808080ULL;
+ mask = (mask << 1) - (mask >> 7);
+ *dst = ((*dst << 1) & 0xfefefefefefefefeULL) ^
+ (mask & 0x1d1d1d1d1d1d1d1dULL);
+ }
+ }
+ }
+
+ src = rm->rm_col[VDEV_RAIDZ_Q].rc_data;
+ dst = rm->rm_col[x].rc_data;
+ exp = 255 - (rm->rm_cols - 1 - x);
+
+ for (i = 0; i < xcount; i++, dst++, src++) {
+ *dst ^= *src;
+ for (j = 0, b = (uint8_t *)dst; j < 8; j++, b++) {
+ *b = vdev_raidz_exp2(*b, exp);
+ }
+ }
+}
+
+static void
+vdev_raidz_reconstruct_pq(raidz_map_t *rm, int x, int y)
+{
+ uint8_t *p, *q, *pxy, *qxy, *xd, *yd, tmp, a, b, aexp, bexp;
+ void *pdata, *qdata;
+ uint64_t xsize, ysize, i;
+
+ ASSERT(x < y);
+ ASSERT(x >= rm->rm_firstdatacol);
+ ASSERT(y < rm->rm_cols);
+
+ ASSERT(rm->rm_col[x].rc_size >= rm->rm_col[y].rc_size);
+
+ /*
+ * Move the parity data aside -- we're going to compute parity as
+ * though columns x and y were full of zeros -- Pxy and Qxy. We want to
+ * reuse the parity generation mechanism without trashing the actual
+ * parity so we make those columns appear to be full of zeros by
+ * setting their lengths to zero.
+ */
+ pdata = rm->rm_col[VDEV_RAIDZ_P].rc_data;
+ qdata = rm->rm_col[VDEV_RAIDZ_Q].rc_data;
+ xsize = rm->rm_col[x].rc_size;
+ ysize = rm->rm_col[y].rc_size;
+
+ rm->rm_col[VDEV_RAIDZ_P].rc_data =
+ zio_buf_alloc(rm->rm_col[VDEV_RAIDZ_P].rc_size);
+ rm->rm_col[VDEV_RAIDZ_Q].rc_data =
+ zio_buf_alloc(rm->rm_col[VDEV_RAIDZ_Q].rc_size);
+ rm->rm_col[x].rc_size = 0;
+ rm->rm_col[y].rc_size = 0;
+
+ vdev_raidz_generate_parity_pq(rm);
+
+ rm->rm_col[x].rc_size = xsize;
+ rm->rm_col[y].rc_size = ysize;
+
+ p = pdata;
+ q = qdata;
+ pxy = rm->rm_col[VDEV_RAIDZ_P].rc_data;
+ qxy = rm->rm_col[VDEV_RAIDZ_Q].rc_data;
+ xd = rm->rm_col[x].rc_data;
+ yd = rm->rm_col[y].rc_data;
+
+ /*
+ * We now have:
+ * Pxy = P + D_x + D_y
+ * Qxy = Q + 2^(ndevs - 1 - x) * D_x + 2^(ndevs - 1 - y) * D_y
+ *
+ * We can then solve for D_x:
+ * D_x = A * (P + Pxy) + B * (Q + Qxy)
+ * where
+ * A = 2^(x - y) * (2^(x - y) + 1)^-1
+ * B = 2^(ndevs - 1 - x) * (2^(x - y) + 1)^-1
+ *
+ * With D_x in hand, we can easily solve for D_y:
+ * D_y = P + Pxy + D_x
+ */
+
+ a = vdev_raidz_pow2[255 + x - y];
+ b = vdev_raidz_pow2[255 - (rm->rm_cols - 1 - x)];
+ tmp = 255 - vdev_raidz_log2[a ^ 1];
+
+ aexp = vdev_raidz_log2[vdev_raidz_exp2(a, tmp)];
+ bexp = vdev_raidz_log2[vdev_raidz_exp2(b, tmp)];
+
+ for (i = 0; i < xsize; i++, p++, q++, pxy++, qxy++, xd++, yd++) {
+ *xd = vdev_raidz_exp2(*p ^ *pxy, aexp) ^
+ vdev_raidz_exp2(*q ^ *qxy, bexp);
+
+ if (i < ysize)
+ *yd = *p ^ *pxy ^ *xd;
+ }
+
+ zio_buf_free(rm->rm_col[VDEV_RAIDZ_P].rc_data,
+ rm->rm_col[VDEV_RAIDZ_P].rc_size);
+ zio_buf_free(rm->rm_col[VDEV_RAIDZ_Q].rc_data,
+ rm->rm_col[VDEV_RAIDZ_Q].rc_size);
+
+ /*
+ * Restore the saved parity data.
+ */
+ rm->rm_col[VDEV_RAIDZ_P].rc_data = pdata;
+ rm->rm_col[VDEV_RAIDZ_Q].rc_data = qdata;
+}
+
+
+static int
+vdev_raidz_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift)
+{
+ vdev_t *cvd;
+ uint64_t nparity = vd->vdev_nparity;
+ int c, error;
+ int lasterror = 0;
+ int numerrors = 0;
+
+ ASSERT(nparity > 0);
+
+ if (nparity > VDEV_RAIDZ_MAXPARITY ||
+ vd->vdev_children < nparity + 1) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
+ return (EINVAL);
+ }
+
+ for (c = 0; c < vd->vdev_children; c++) {
+ cvd = vd->vdev_child[c];
+
+ if ((error = vdev_open(cvd)) != 0) {
+ lasterror = error;
+ numerrors++;
+ continue;
+ }
+
+ *asize = MIN(*asize - 1, cvd->vdev_asize - 1) + 1;
+ *ashift = MAX(*ashift, cvd->vdev_ashift);
+ }
+
+ *asize *= vd->vdev_children;
+
+ if (numerrors > nparity) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_NO_REPLICAS;
+ return (lasterror);
+ }
+
+ return (0);
+}
+
+static void
+vdev_raidz_close(vdev_t *vd)
+{
+ int c;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_close(vd->vdev_child[c]);
+}
+
+static uint64_t
+vdev_raidz_asize(vdev_t *vd, uint64_t psize)
+{
+ uint64_t asize;
+ uint64_t ashift = vd->vdev_top->vdev_ashift;
+ uint64_t cols = vd->vdev_children;
+ uint64_t nparity = vd->vdev_nparity;
+
+ asize = ((psize - 1) >> ashift) + 1;
+ asize += nparity * ((asize + cols - nparity - 1) / (cols - nparity));
+ asize = roundup(asize, nparity + 1) << ashift;
+
+ return (asize);
+}
+
+static void
+vdev_raidz_child_done(zio_t *zio)
+{
+ raidz_col_t *rc = zio->io_private;
+
+ rc->rc_error = zio->io_error;
+ rc->rc_tried = 1;
+ rc->rc_skipped = 0;
+}
+
+static void
+vdev_raidz_repair_done(zio_t *zio)
+{
+ ASSERT(zio->io_private == zio->io_parent);
+ vdev_raidz_map_free(zio->io_private);
+}
+
+static void
+vdev_raidz_io_start(zio_t *zio)
+{
+ vdev_t *vd = zio->io_vd;
+ vdev_t *tvd = vd->vdev_top;
+ vdev_t *cvd;
+ blkptr_t *bp = zio->io_bp;
+ raidz_map_t *rm;
+ raidz_col_t *rc;
+ int c;
+
+ rm = vdev_raidz_map_alloc(zio, tvd->vdev_ashift, vd->vdev_children,
+ vd->vdev_nparity);
+
+ ASSERT3U(rm->rm_asize, ==, vdev_psize_to_asize(vd, zio->io_size));
+
+ if (zio->io_type == ZIO_TYPE_WRITE) {
+ /*
+ * Generate RAID parity in the first virtual columns.
+ */
+ if (rm->rm_firstdatacol == 1)
+ vdev_raidz_generate_parity_p(rm);
+ else
+ vdev_raidz_generate_parity_pq(rm);
+
+ for (c = 0; c < rm->rm_cols; c++) {
+ rc = &rm->rm_col[c];
+ cvd = vd->vdev_child[rc->rc_devidx];
+ zio_nowait(zio_vdev_child_io(zio, NULL, cvd,
+ rc->rc_offset, rc->rc_data, rc->rc_size,
+ zio->io_type, zio->io_priority, ZIO_FLAG_CANFAIL,
+ vdev_raidz_child_done, rc));
+ }
+ zio_wait_children_done(zio);
+ return;
+ }
+
+ ASSERT(zio->io_type == ZIO_TYPE_READ);
+
+ /*
+ * Iterate over the columns in reverse order so that we hit the parity
+ * last -- any errors along the way will force us to read the parity
+ * data.
+ */
+ for (c = rm->rm_cols - 1; c >= 0; c--) {
+ rc = &rm->rm_col[c];
+ cvd = vd->vdev_child[rc->rc_devidx];
+ if (vdev_is_dead(cvd)) {
+ if (c >= rm->rm_firstdatacol)
+ rm->rm_missingdata++;
+ else
+ rm->rm_missingparity++;
+ rc->rc_error = ENXIO;
+ rc->rc_tried = 1; /* don't even try */
+ rc->rc_skipped = 1;
+ continue;
+ }
+ if (vdev_dtl_contains(&cvd->vdev_dtl_map, bp->blk_birth, 1)) {
+ if (c >= rm->rm_firstdatacol)
+ rm->rm_missingdata++;
+ else
+ rm->rm_missingparity++;
+ rc->rc_error = ESTALE;
+ rc->rc_skipped = 1;
+ continue;
+ }
+ if (c >= rm->rm_firstdatacol || rm->rm_missingdata > 0 ||
+ (zio->io_flags & ZIO_FLAG_SCRUB)) {
+ zio_nowait(zio_vdev_child_io(zio, NULL, cvd,
+ rc->rc_offset, rc->rc_data, rc->rc_size,
+ zio->io_type, zio->io_priority, ZIO_FLAG_CANFAIL,
+ vdev_raidz_child_done, rc));
+ }
+ }
+
+ zio_wait_children_done(zio);
+}
+
+/*
+ * Report a checksum error for a child of a RAID-Z device.
+ */
+static void
+raidz_checksum_error(zio_t *zio, raidz_col_t *rc)
+{
+ vdev_t *vd = zio->io_vd->vdev_child[rc->rc_devidx];
+ dprintf_bp(zio->io_bp, "imputed checksum error on %s: ",
+ vdev_description(vd));
+
+ if (!(zio->io_flags & ZIO_FLAG_SPECULATIVE)) {
+ mutex_enter(&vd->vdev_stat_lock);
+ vd->vdev_stat.vs_checksum_errors++;
+ mutex_exit(&vd->vdev_stat_lock);
+ }
+
+ if (!(zio->io_flags & ZIO_FLAG_SPECULATIVE))
+ zfs_ereport_post(FM_EREPORT_ZFS_CHECKSUM,
+ zio->io_spa, vd, zio, rc->rc_offset, rc->rc_size);
+}
+
+/*
+ * Generate the parity from the data columns. If we tried and were able to
+ * read the parity without error, verify that the generated parity matches the
+ * data we read. If it doesn't, we fire off a checksum error. Return the
+ * number such failures.
+ */
+static int
+raidz_parity_verify(zio_t *zio, raidz_map_t *rm)
+{
+ void *orig[VDEV_RAIDZ_MAXPARITY];
+ int c, ret = 0;
+ raidz_col_t *rc;
+
+ for (c = 0; c < rm->rm_firstdatacol; c++) {
+ rc = &rm->rm_col[c];
+ if (!rc->rc_tried || rc->rc_error != 0)
+ continue;
+ orig[c] = zio_buf_alloc(rc->rc_size);
+ bcopy(rc->rc_data, orig[c], rc->rc_size);
+ }
+
+ if (rm->rm_firstdatacol == 1)
+ vdev_raidz_generate_parity_p(rm);
+ else
+ vdev_raidz_generate_parity_pq(rm);
+
+ for (c = 0; c < rm->rm_firstdatacol; c++) {
+ rc = &rm->rm_col[c];
+ if (!rc->rc_tried || rc->rc_error != 0)
+ continue;
+ if (bcmp(orig[c], rc->rc_data, rc->rc_size) != 0) {
+ raidz_checksum_error(zio, rc);
+ rc->rc_error = ECKSUM;
+ ret++;
+ }
+ zio_buf_free(orig[c], rc->rc_size);
+ }
+
+ return (ret);
+}
+
+static uint64_t raidz_corrected_p;
+static uint64_t raidz_corrected_q;
+static uint64_t raidz_corrected_pq;
+
+static void
+vdev_raidz_io_done(zio_t *zio)
+{
+ vdev_t *vd = zio->io_vd;
+ vdev_t *cvd;
+ raidz_map_t *rm = zio->io_vsd;
+ raidz_col_t *rc, *rc1;
+ int unexpected_errors = 0;
+ int parity_errors = 0;
+ int parity_untried = 0;
+ int data_errors = 0;
+ int n, c, c1;
+
+ ASSERT(zio->io_bp != NULL); /* XXX need to add code to enforce this */
+
+ zio->io_error = 0;
+ zio->io_numerrors = 0;
+
+ ASSERT(rm->rm_missingparity <= rm->rm_firstdatacol);
+ ASSERT(rm->rm_missingdata <= rm->rm_cols - rm->rm_firstdatacol);
+
+ for (c = 0; c < rm->rm_cols; c++) {
+ rc = &rm->rm_col[c];
+
+ /*
+ * We preserve any EIOs because those may be worth retrying;
+ * whereas ECKSUM and ENXIO are more likely to be persistent.
+ */
+ if (rc->rc_error) {
+ if (zio->io_error != EIO)
+ zio->io_error = rc->rc_error;
+
+ if (c < rm->rm_firstdatacol)
+ parity_errors++;
+ else
+ data_errors++;
+
+ if (!rc->rc_skipped)
+ unexpected_errors++;
+
+ zio->io_numerrors++;
+ } else if (c < rm->rm_firstdatacol && !rc->rc_tried) {
+ parity_untried++;
+ }
+ }
+
+ if (zio->io_type == ZIO_TYPE_WRITE) {
+ /*
+ * If this is not a failfast write, and we were able to
+ * write enough columns to reconstruct the data, good enough.
+ */
+ /* XXPOLICY */
+ if (zio->io_numerrors <= rm->rm_firstdatacol &&
+ !(zio->io_flags & ZIO_FLAG_FAILFAST))
+ zio->io_error = 0;
+
+ vdev_raidz_map_free(zio);
+ zio_next_stage(zio);
+ return;
+ }
+
+ ASSERT(zio->io_type == ZIO_TYPE_READ);
+ /*
+ * There are three potential phases for a read:
+ * 1. produce valid data from the columns read
+ * 2. read all disks and try again
+ * 3. perform combinatorial reconstruction
+ *
+ * Each phase is progressively both more expensive and less likely to
+ * occur. If we encounter more errors than we can repair or all phases
+ * fail, we have no choice but to return an error.
+ */
+
+ /*
+ * If the number of errors we saw was correctable -- less than or equal
+ * to the number of parity disks read -- attempt to produce data that
+ * has a valid checksum. Naturally, this case applies in the absence of
+ * any errors.
+ */
+ if (zio->io_numerrors <= rm->rm_firstdatacol - parity_untried) {
+ switch (data_errors) {
+ case 0:
+ if (zio_checksum_error(zio) == 0) {
+ zio->io_error = 0;
+
+ /*
+ * If we read parity information (unnecessarily
+ * as it happens since no reconstruction was
+ * needed) regenerate and verify the parity.
+ * We also regenerate parity when resilvering
+ * so we can write it out to the failed device
+ * later.
+ */
+ if (parity_errors + parity_untried <
+ rm->rm_firstdatacol ||
+ (zio->io_flags & ZIO_FLAG_RESILVER)) {
+ n = raidz_parity_verify(zio, rm);
+ unexpected_errors += n;
+ ASSERT(parity_errors + n <=
+ rm->rm_firstdatacol);
+ }
+ goto done;
+ }
+ break;
+
+ case 1:
+ /*
+ * We either attempt to read all the parity columns or
+ * none of them. If we didn't try to read parity, we
+ * wouldn't be here in the correctable case. There must
+ * also have been fewer parity errors than parity
+ * columns or, again, we wouldn't be in this code path.
+ */
+ ASSERT(parity_untried == 0);
+ ASSERT(parity_errors < rm->rm_firstdatacol);
+
+ /*
+ * Find the column that reported the error.
+ */
+ for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) {
+ rc = &rm->rm_col[c];
+ if (rc->rc_error != 0)
+ break;
+ }
+ ASSERT(c != rm->rm_cols);
+ ASSERT(!rc->rc_skipped || rc->rc_error == ENXIO ||
+ rc->rc_error == ESTALE);
+
+ if (rm->rm_col[VDEV_RAIDZ_P].rc_error == 0) {
+ vdev_raidz_reconstruct_p(rm, c);
+ } else {
+ ASSERT(rm->rm_firstdatacol > 1);
+ vdev_raidz_reconstruct_q(rm, c);
+ }
+
+ if (zio_checksum_error(zio) == 0) {
+ zio->io_error = 0;
+ if (rm->rm_col[VDEV_RAIDZ_P].rc_error == 0)
+ atomic_inc_64(&raidz_corrected_p);
+ else
+ atomic_inc_64(&raidz_corrected_q);
+
+ /*
+ * If there's more than one parity disk that
+ * was successfully read, confirm that the
+ * other parity disk produced the correct data.
+ * This routine is suboptimal in that it
+ * regenerates both the parity we wish to test
+ * as well as the parity we just used to
+ * perform the reconstruction, but this should
+ * be a relatively uncommon case, and can be
+ * optimized if it becomes a problem.
+ * We also regenerate parity when resilvering
+ * so we can write it out to the failed device
+ * later.
+ */
+ if (parity_errors < rm->rm_firstdatacol - 1 ||
+ (zio->io_flags & ZIO_FLAG_RESILVER)) {
+ n = raidz_parity_verify(zio, rm);
+ unexpected_errors += n;
+ ASSERT(parity_errors + n <=
+ rm->rm_firstdatacol);
+ }
+
+ goto done;
+ }
+ break;
+
+ case 2:
+ /*
+ * Two data column errors require double parity.
+ */
+ ASSERT(rm->rm_firstdatacol == 2);
+
+ /*
+ * Find the two columns that reported errors.
+ */
+ for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) {
+ rc = &rm->rm_col[c];
+ if (rc->rc_error != 0)
+ break;
+ }
+ ASSERT(c != rm->rm_cols);
+ ASSERT(!rc->rc_skipped || rc->rc_error == ENXIO ||
+ rc->rc_error == ESTALE);
+
+ for (c1 = c++; c < rm->rm_cols; c++) {
+ rc = &rm->rm_col[c];
+ if (rc->rc_error != 0)
+ break;
+ }
+ ASSERT(c != rm->rm_cols);
+ ASSERT(!rc->rc_skipped || rc->rc_error == ENXIO ||
+ rc->rc_error == ESTALE);
+
+ vdev_raidz_reconstruct_pq(rm, c1, c);
+
+ if (zio_checksum_error(zio) == 0) {
+ zio->io_error = 0;
+ atomic_inc_64(&raidz_corrected_pq);
+
+ goto done;
+ }
+ break;
+
+ default:
+ ASSERT(rm->rm_firstdatacol <= 2);
+ ASSERT(0);
+ }
+ }
+
+ /*
+ * This isn't a typical situation -- either we got a read error or
+ * a child silently returned bad data. Read every block so we can
+ * try again with as much data and parity as we can track down. If
+ * we've already been through once before, all children will be marked
+ * as tried so we'll proceed to combinatorial reconstruction.
+ */
+ unexpected_errors = 1;
+ rm->rm_missingdata = 0;
+ rm->rm_missingparity = 0;
+
+ for (c = 0; c < rm->rm_cols; c++) {
+ if (rm->rm_col[c].rc_tried)
+ continue;
+
+ zio->io_error = 0;
+ zio_vdev_io_redone(zio);
+ do {
+ rc = &rm->rm_col[c];
+ if (rc->rc_tried)
+ continue;
+ zio_nowait(zio_vdev_child_io(zio, NULL,
+ vd->vdev_child[rc->rc_devidx],
+ rc->rc_offset, rc->rc_data, rc->rc_size,
+ zio->io_type, zio->io_priority, ZIO_FLAG_CANFAIL,
+ vdev_raidz_child_done, rc));
+ } while (++c < rm->rm_cols);
+ dprintf("rereading\n");
+ zio_wait_children_done(zio);
+ return;
+ }
+
+ /*
+ * At this point we've attempted to reconstruct the data given the
+ * errors we detected, and we've attempted to read all columns. There
+ * must, therefore, be one or more additional problems -- silent errors
+ * resulting in invalid data rather than explicit I/O errors resulting
+ * in absent data. Before we attempt combinatorial reconstruction make
+ * sure we have a chance of coming up with the right answer.
+ */
+ if (zio->io_numerrors >= rm->rm_firstdatacol) {
+ ASSERT(zio->io_error != 0);
+ goto done;
+ }
+
+ if (rm->rm_col[VDEV_RAIDZ_P].rc_error == 0) {
+ /*
+ * Attempt to reconstruct the data from parity P.
+ */
+ for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) {
+ void *orig;
+ rc = &rm->rm_col[c];
+
+ orig = zio_buf_alloc(rc->rc_size);
+ bcopy(rc->rc_data, orig, rc->rc_size);
+ vdev_raidz_reconstruct_p(rm, c);
+
+ if (zio_checksum_error(zio) == 0) {
+ zio_buf_free(orig, rc->rc_size);
+ zio->io_error = 0;
+ atomic_inc_64(&raidz_corrected_p);
+
+ /*
+ * If this child didn't know that it returned
+ * bad data, inform it.
+ */
+ if (rc->rc_tried && rc->rc_error == 0)
+ raidz_checksum_error(zio, rc);
+ rc->rc_error = ECKSUM;
+ goto done;
+ }
+
+ bcopy(orig, rc->rc_data, rc->rc_size);
+ zio_buf_free(orig, rc->rc_size);
+ }
+ }
+
+ if (rm->rm_firstdatacol > 1 && rm->rm_col[VDEV_RAIDZ_Q].rc_error == 0) {
+ /*
+ * Attempt to reconstruct the data from parity Q.
+ */
+ for (c = rm->rm_firstdatacol; c < rm->rm_cols; c++) {
+ void *orig;
+ rc = &rm->rm_col[c];
+
+ orig = zio_buf_alloc(rc->rc_size);
+ bcopy(rc->rc_data, orig, rc->rc_size);
+ vdev_raidz_reconstruct_q(rm, c);
+
+ if (zio_checksum_error(zio) == 0) {
+ zio_buf_free(orig, rc->rc_size);
+ zio->io_error = 0;
+ atomic_inc_64(&raidz_corrected_q);
+
+ /*
+ * If this child didn't know that it returned
+ * bad data, inform it.
+ */
+ if (rc->rc_tried && rc->rc_error == 0)
+ raidz_checksum_error(zio, rc);
+ rc->rc_error = ECKSUM;
+ goto done;
+ }
+
+ bcopy(orig, rc->rc_data, rc->rc_size);
+ zio_buf_free(orig, rc->rc_size);
+ }
+ }
+
+ if (rm->rm_firstdatacol > 1 &&
+ rm->rm_col[VDEV_RAIDZ_P].rc_error == 0 &&
+ rm->rm_col[VDEV_RAIDZ_Q].rc_error == 0) {
+ /*
+ * Attempt to reconstruct the data from both P and Q.
+ */
+ for (c = rm->rm_firstdatacol; c < rm->rm_cols - 1; c++) {
+ void *orig, *orig1;
+ rc = &rm->rm_col[c];
+
+ orig = zio_buf_alloc(rc->rc_size);
+ bcopy(rc->rc_data, orig, rc->rc_size);
+
+ for (c1 = c + 1; c1 < rm->rm_cols; c1++) {
+ rc1 = &rm->rm_col[c1];
+
+ orig1 = zio_buf_alloc(rc1->rc_size);
+ bcopy(rc1->rc_data, orig1, rc1->rc_size);
+
+ vdev_raidz_reconstruct_pq(rm, c, c1);
+
+ if (zio_checksum_error(zio) == 0) {
+ zio_buf_free(orig, rc->rc_size);
+ zio_buf_free(orig1, rc1->rc_size);
+ zio->io_error = 0;
+ atomic_inc_64(&raidz_corrected_pq);
+
+ /*
+ * If these children didn't know they
+ * returned bad data, inform them.
+ */
+ if (rc->rc_tried && rc->rc_error == 0)
+ raidz_checksum_error(zio, rc);
+ if (rc1->rc_tried && rc1->rc_error == 0)
+ raidz_checksum_error(zio, rc1);
+
+ rc->rc_error = ECKSUM;
+ rc1->rc_error = ECKSUM;
+
+ goto done;
+ }
+
+ bcopy(orig1, rc1->rc_data, rc1->rc_size);
+ zio_buf_free(orig1, rc1->rc_size);
+ }
+
+ bcopy(orig, rc->rc_data, rc->rc_size);
+ zio_buf_free(orig, rc->rc_size);
+ }
+ }
+
+ /*
+ * All combinations failed to checksum. Generate checksum ereports for
+ * all children.
+ */
+ zio->io_error = ECKSUM;
+ if (!(zio->io_flags & ZIO_FLAG_SPECULATIVE)) {
+ for (c = 0; c < rm->rm_cols; c++) {
+ rc = &rm->rm_col[c];
+ zfs_ereport_post(FM_EREPORT_ZFS_CHECKSUM,
+ zio->io_spa, vd->vdev_child[rc->rc_devidx], zio,
+ rc->rc_offset, rc->rc_size);
+ }
+ }
+
+done:
+ zio_checksum_verified(zio);
+
+ if (zio->io_error == 0 && (spa_mode & FWRITE) &&
+ (unexpected_errors || (zio->io_flags & ZIO_FLAG_RESILVER))) {
+ zio_t *rio;
+
+ /*
+ * Use the good data we have in hand to repair damaged children.
+ *
+ * We issue all repair I/Os as children of 'rio' to arrange
+ * that vdev_raidz_map_free(zio) will be invoked after all
+ * repairs complete, but before we advance to the next stage.
+ */
+ rio = zio_null(zio, zio->io_spa,
+ vdev_raidz_repair_done, zio, ZIO_FLAG_CANFAIL);
+
+ for (c = 0; c < rm->rm_cols; c++) {
+ rc = &rm->rm_col[c];
+ cvd = vd->vdev_child[rc->rc_devidx];
+
+ if (rc->rc_error == 0)
+ continue;
+
+ dprintf("%s resilvered %s @ 0x%llx error %d\n",
+ vdev_description(vd),
+ vdev_description(cvd),
+ zio->io_offset, rc->rc_error);
+
+ zio_nowait(zio_vdev_child_io(rio, NULL, cvd,
+ rc->rc_offset, rc->rc_data, rc->rc_size,
+ ZIO_TYPE_WRITE, zio->io_priority,
+ ZIO_FLAG_IO_REPAIR | ZIO_FLAG_DONT_PROPAGATE |
+ ZIO_FLAG_CANFAIL, NULL, NULL));
+ }
+
+ zio_nowait(rio);
+ zio_wait_children_done(zio);
+ return;
+ }
+
+ vdev_raidz_map_free(zio);
+ zio_next_stage(zio);
+}
+
+static void
+vdev_raidz_state_change(vdev_t *vd, int faulted, int degraded)
+{
+ if (faulted > vd->vdev_nparity)
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_NO_REPLICAS);
+ else if (degraded + faulted != 0)
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, VDEV_AUX_NONE);
+ else
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_HEALTHY, VDEV_AUX_NONE);
+}
+
+vdev_ops_t vdev_raidz_ops = {
+ vdev_raidz_open,
+ vdev_raidz_close,
+ vdev_raidz_asize,
+ vdev_raidz_io_start,
+ vdev_raidz_io_done,
+ vdev_raidz_state_change,
+ VDEV_TYPE_RAIDZ, /* name of this vdev type */
+ B_FALSE /* not a leaf vdev */
+};
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_root.c b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_root.c
new file mode 100644
index 0000000..0e8752c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/vdev_root.c
@@ -0,0 +1,118 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/vdev_impl.h>
+#include <sys/zio.h>
+#include <sys/fs/zfs.h>
+
+/*
+ * Virtual device vector for the pool's root vdev.
+ */
+
+/*
+ * We should be able to tolerate one failure with absolutely no damage
+ * to our metadata. Two failures will take out space maps, a bunch of
+ * indirect block trees, meta dnodes, dnodes, etc. Probably not a happy
+ * place to live. When we get smarter, we can liberalize this policy.
+ * e.g. If we haven't lost two consecutive top-level vdevs, then we are
+ * probably fine. Adding bean counters during alloc/free can make this
+ * future guesswork more accurate.
+ */
+/*ARGSUSED*/
+static int
+too_many_errors(vdev_t *vd, int numerrors)
+{
+ return (numerrors > 0);
+}
+
+static int
+vdev_root_open(vdev_t *vd, uint64_t *asize, uint64_t *ashift)
+{
+ vdev_t *cvd;
+ int c, error;
+ int lasterror = 0;
+ int numerrors = 0;
+
+ if (vd->vdev_children == 0) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_BAD_LABEL;
+ return (EINVAL);
+ }
+
+ for (c = 0; c < vd->vdev_children; c++) {
+ cvd = vd->vdev_child[c];
+
+ if ((error = vdev_open(cvd)) != 0) {
+ lasterror = error;
+ numerrors++;
+ continue;
+ }
+ }
+
+ if (too_many_errors(vd, numerrors)) {
+ vd->vdev_stat.vs_aux = VDEV_AUX_NO_REPLICAS;
+ return (lasterror);
+ }
+
+ *asize = 0;
+ *ashift = 0;
+
+ return (0);
+}
+
+static void
+vdev_root_close(vdev_t *vd)
+{
+ int c;
+
+ for (c = 0; c < vd->vdev_children; c++)
+ vdev_close(vd->vdev_child[c]);
+}
+
+static void
+vdev_root_state_change(vdev_t *vd, int faulted, int degraded)
+{
+ if (too_many_errors(vd, faulted))
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_CANT_OPEN,
+ VDEV_AUX_NO_REPLICAS);
+ else if (degraded != 0)
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_DEGRADED, VDEV_AUX_NONE);
+ else
+ vdev_set_state(vd, B_FALSE, VDEV_STATE_HEALTHY, VDEV_AUX_NONE);
+}
+
+vdev_ops_t vdev_root_ops = {
+ vdev_root_open,
+ vdev_root_close,
+ vdev_default_asize,
+ NULL, /* io_start - not applicable to the root */
+ NULL, /* io_done - not applicable to the root */
+ vdev_root_state_change,
+ VDEV_TYPE_ROOT, /* name of this vdev type */
+ B_FALSE /* not a leaf vdev */
+};
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zap.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zap.c
new file mode 100644
index 0000000..4246ec0
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zap.c
@@ -0,0 +1,1071 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+
+/*
+ * This file contains the top half of the zfs directory structure
+ * implementation. The bottom half is in zap_leaf.c.
+ *
+ * The zdir is an extendable hash data structure. There is a table of
+ * pointers to buckets (zap_t->zd_data->zd_leafs). The buckets are
+ * each a constant size and hold a variable number of directory entries.
+ * The buckets (aka "leaf nodes") are implemented in zap_leaf.c.
+ *
+ * The pointer table holds a power of 2 number of pointers.
+ * (1<<zap_t->zd_data->zd_phys->zd_prefix_len). The bucket pointed to
+ * by the pointer at index i in the table holds entries whose hash value
+ * has a zd_prefix_len - bit prefix
+ */
+
+#include <sys/spa.h>
+#include <sys/dmu.h>
+#include <sys/zfs_context.h>
+#include <sys/zap.h>
+#include <sys/refcount.h>
+#include <sys/zap_impl.h>
+#include <sys/zap_leaf.h>
+#include <sys/zfs_znode.h>
+
+int fzap_default_block_shift = 14; /* 16k blocksize */
+
+static void zap_leaf_pageout(dmu_buf_t *db, void *vl);
+static uint64_t zap_allocate_blocks(zap_t *zap, int nblocks);
+
+
+void
+fzap_byteswap(void *vbuf, size_t size)
+{
+ uint64_t block_type;
+
+ block_type = *(uint64_t *)vbuf;
+
+ if (block_type == ZBT_LEAF || block_type == BSWAP_64(ZBT_LEAF))
+ zap_leaf_byteswap(vbuf, size);
+ else {
+ /* it's a ptrtbl block */
+ byteswap_uint64_array(vbuf, size);
+ }
+}
+
+void
+fzap_upgrade(zap_t *zap, dmu_tx_t *tx)
+{
+ dmu_buf_t *db;
+ zap_leaf_t *l;
+ int i;
+ zap_phys_t *zp;
+
+ ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
+ zap->zap_ismicro = FALSE;
+
+ (void) dmu_buf_update_user(zap->zap_dbuf, zap, zap,
+ &zap->zap_f.zap_phys, zap_evict);
+
+ mutex_init(&zap->zap_f.zap_num_entries_mtx, NULL, MUTEX_DEFAULT, 0);
+ zap->zap_f.zap_block_shift = highbit(zap->zap_dbuf->db_size) - 1;
+
+ zp = zap->zap_f.zap_phys;
+ /*
+ * explicitly zero it since it might be coming from an
+ * initialized microzap
+ */
+ bzero(zap->zap_dbuf->db_data, zap->zap_dbuf->db_size);
+ zp->zap_block_type = ZBT_HEADER;
+ zp->zap_magic = ZAP_MAGIC;
+
+ zp->zap_ptrtbl.zt_shift = ZAP_EMBEDDED_PTRTBL_SHIFT(zap);
+
+ zp->zap_freeblk = 2; /* block 1 will be the first leaf */
+ zp->zap_num_leafs = 1;
+ zp->zap_num_entries = 0;
+ zp->zap_salt = zap->zap_salt;
+
+ /* block 1 will be the first leaf */
+ for (i = 0; i < (1<<zp->zap_ptrtbl.zt_shift); i++)
+ ZAP_EMBEDDED_PTRTBL_ENT(zap, i) = 1;
+
+ /*
+ * set up block 1 - the first leaf
+ */
+ VERIFY(0 == dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ 1<<FZAP_BLOCK_SHIFT(zap), FTAG, &db));
+ dmu_buf_will_dirty(db, tx);
+
+ l = kmem_zalloc(sizeof (zap_leaf_t), KM_SLEEP);
+ l->l_dbuf = db;
+ l->l_phys = db->db_data;
+
+ zap_leaf_init(l);
+
+ kmem_free(l, sizeof (zap_leaf_t));
+ dmu_buf_rele(db, FTAG);
+}
+
+static int
+zap_tryupgradedir(zap_t *zap, dmu_tx_t *tx)
+{
+ if (RW_WRITE_HELD(&zap->zap_rwlock))
+ return (1);
+ if (rw_tryupgrade(&zap->zap_rwlock)) {
+ dmu_buf_will_dirty(zap->zap_dbuf, tx);
+ return (1);
+ }
+ return (0);
+}
+
+/*
+ * Generic routines for dealing with the pointer & cookie tables.
+ */
+
+static int
+zap_table_grow(zap_t *zap, zap_table_phys_t *tbl,
+ void (*transfer_func)(const uint64_t *src, uint64_t *dst, int n),
+ dmu_tx_t *tx)
+{
+ uint64_t b, newblk;
+ dmu_buf_t *db_old, *db_new;
+ int err;
+ int bs = FZAP_BLOCK_SHIFT(zap);
+ int hepb = 1<<(bs-4);
+ /* hepb = half the number of entries in a block */
+
+ ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
+ ASSERT(tbl->zt_blk != 0);
+ ASSERT(tbl->zt_numblks > 0);
+
+ if (tbl->zt_nextblk != 0) {
+ newblk = tbl->zt_nextblk;
+ } else {
+ newblk = zap_allocate_blocks(zap, tbl->zt_numblks * 2);
+ tbl->zt_nextblk = newblk;
+ ASSERT3U(tbl->zt_blks_copied, ==, 0);
+ dmu_prefetch(zap->zap_objset, zap->zap_object,
+ tbl->zt_blk << bs, tbl->zt_numblks << bs);
+ }
+
+ /*
+ * Copy the ptrtbl from the old to new location.
+ */
+
+ b = tbl->zt_blks_copied;
+ err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ (tbl->zt_blk + b) << bs, FTAG, &db_old);
+ if (err)
+ return (err);
+
+ /* first half of entries in old[b] go to new[2*b+0] */
+ VERIFY(0 == dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ (newblk + 2*b+0) << bs, FTAG, &db_new));
+ dmu_buf_will_dirty(db_new, tx);
+ transfer_func(db_old->db_data, db_new->db_data, hepb);
+ dmu_buf_rele(db_new, FTAG);
+
+ /* second half of entries in old[b] go to new[2*b+1] */
+ VERIFY(0 == dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ (newblk + 2*b+1) << bs, FTAG, &db_new));
+ dmu_buf_will_dirty(db_new, tx);
+ transfer_func((uint64_t *)db_old->db_data + hepb,
+ db_new->db_data, hepb);
+ dmu_buf_rele(db_new, FTAG);
+
+ dmu_buf_rele(db_old, FTAG);
+
+ tbl->zt_blks_copied++;
+
+ dprintf("copied block %llu of %llu\n",
+ tbl->zt_blks_copied, tbl->zt_numblks);
+
+ if (tbl->zt_blks_copied == tbl->zt_numblks) {
+ (void) dmu_free_range(zap->zap_objset, zap->zap_object,
+ tbl->zt_blk << bs, tbl->zt_numblks << bs, tx);
+
+ tbl->zt_blk = newblk;
+ tbl->zt_numblks *= 2;
+ tbl->zt_shift++;
+ tbl->zt_nextblk = 0;
+ tbl->zt_blks_copied = 0;
+
+ dprintf("finished; numblocks now %llu (%lluk entries)\n",
+ tbl->zt_numblks, 1<<(tbl->zt_shift-10));
+ }
+
+ return (0);
+}
+
+static int
+zap_table_store(zap_t *zap, zap_table_phys_t *tbl, uint64_t idx, uint64_t val,
+ dmu_tx_t *tx)
+{
+ int err;
+ uint64_t blk, off;
+ int bs = FZAP_BLOCK_SHIFT(zap);
+ dmu_buf_t *db;
+
+ ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
+ ASSERT(tbl->zt_blk != 0);
+
+ dprintf("storing %llx at index %llx\n", val, idx);
+
+ blk = idx >> (bs-3);
+ off = idx & ((1<<(bs-3))-1);
+
+ err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ (tbl->zt_blk + blk) << bs, FTAG, &db);
+ if (err)
+ return (err);
+ dmu_buf_will_dirty(db, tx);
+
+ if (tbl->zt_nextblk != 0) {
+ uint64_t idx2 = idx * 2;
+ uint64_t blk2 = idx2 >> (bs-3);
+ uint64_t off2 = idx2 & ((1<<(bs-3))-1);
+ dmu_buf_t *db2;
+
+ err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ (tbl->zt_nextblk + blk2) << bs, FTAG, &db2);
+ if (err) {
+ dmu_buf_rele(db, FTAG);
+ return (err);
+ }
+ dmu_buf_will_dirty(db2, tx);
+ ((uint64_t *)db2->db_data)[off2] = val;
+ ((uint64_t *)db2->db_data)[off2+1] = val;
+ dmu_buf_rele(db2, FTAG);
+ }
+
+ ((uint64_t *)db->db_data)[off] = val;
+ dmu_buf_rele(db, FTAG);
+
+ return (0);
+}
+
+static int
+zap_table_load(zap_t *zap, zap_table_phys_t *tbl, uint64_t idx, uint64_t *valp)
+{
+ uint64_t blk, off;
+ int err;
+ dmu_buf_t *db;
+ int bs = FZAP_BLOCK_SHIFT(zap);
+
+ ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
+
+ blk = idx >> (bs-3);
+ off = idx & ((1<<(bs-3))-1);
+
+ err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ (tbl->zt_blk + blk) << bs, FTAG, &db);
+ if (err)
+ return (err);
+ *valp = ((uint64_t *)db->db_data)[off];
+ dmu_buf_rele(db, FTAG);
+
+ if (tbl->zt_nextblk != 0) {
+ /*
+ * read the nextblk for the sake of i/o error checking,
+ * so that zap_table_load() will catch errors for
+ * zap_table_store.
+ */
+ blk = (idx*2) >> (bs-3);
+
+ err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ (tbl->zt_nextblk + blk) << bs, FTAG, &db);
+ dmu_buf_rele(db, FTAG);
+ }
+ return (err);
+}
+
+/*
+ * Routines for growing the ptrtbl.
+ */
+
+static void
+zap_ptrtbl_transfer(const uint64_t *src, uint64_t *dst, int n)
+{
+ int i;
+ for (i = 0; i < n; i++) {
+ uint64_t lb = src[i];
+ dst[2*i+0] = lb;
+ dst[2*i+1] = lb;
+ }
+}
+
+static int
+zap_grow_ptrtbl(zap_t *zap, dmu_tx_t *tx)
+{
+ /* In case things go horribly wrong. */
+ if (zap->zap_f.zap_phys->zap_ptrtbl.zt_shift >= ZAP_HASHBITS-2)
+ return (ENOSPC);
+
+ if (zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks == 0) {
+ /*
+ * We are outgrowing the "embedded" ptrtbl (the one
+ * stored in the header block). Give it its own entire
+ * block, which will double the size of the ptrtbl.
+ */
+ uint64_t newblk;
+ dmu_buf_t *db_new;
+ int err;
+
+ ASSERT3U(zap->zap_f.zap_phys->zap_ptrtbl.zt_shift, ==,
+ ZAP_EMBEDDED_PTRTBL_SHIFT(zap));
+ ASSERT3U(zap->zap_f.zap_phys->zap_ptrtbl.zt_blk, ==, 0);
+
+ newblk = zap_allocate_blocks(zap, 1);
+ err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ newblk << FZAP_BLOCK_SHIFT(zap), FTAG, &db_new);
+ if (err)
+ return (err);
+ dmu_buf_will_dirty(db_new, tx);
+ zap_ptrtbl_transfer(&ZAP_EMBEDDED_PTRTBL_ENT(zap, 0),
+ db_new->db_data, 1 << ZAP_EMBEDDED_PTRTBL_SHIFT(zap));
+ dmu_buf_rele(db_new, FTAG);
+
+ zap->zap_f.zap_phys->zap_ptrtbl.zt_blk = newblk;
+ zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks = 1;
+ zap->zap_f.zap_phys->zap_ptrtbl.zt_shift++;
+
+ ASSERT3U(1ULL << zap->zap_f.zap_phys->zap_ptrtbl.zt_shift, ==,
+ zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks <<
+ (FZAP_BLOCK_SHIFT(zap)-3));
+
+ return (0);
+ } else {
+ return (zap_table_grow(zap, &zap->zap_f.zap_phys->zap_ptrtbl,
+ zap_ptrtbl_transfer, tx));
+ }
+}
+
+static void
+zap_increment_num_entries(zap_t *zap, int delta, dmu_tx_t *tx)
+{
+ dmu_buf_will_dirty(zap->zap_dbuf, tx);
+ mutex_enter(&zap->zap_f.zap_num_entries_mtx);
+ ASSERT(delta > 0 || zap->zap_f.zap_phys->zap_num_entries >= -delta);
+ zap->zap_f.zap_phys->zap_num_entries += delta;
+ mutex_exit(&zap->zap_f.zap_num_entries_mtx);
+}
+
+static uint64_t
+zap_allocate_blocks(zap_t *zap, int nblocks)
+{
+ uint64_t newblk;
+ ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
+ newblk = zap->zap_f.zap_phys->zap_freeblk;
+ zap->zap_f.zap_phys->zap_freeblk += nblocks;
+ return (newblk);
+}
+
+static zap_leaf_t *
+zap_create_leaf(zap_t *zap, dmu_tx_t *tx)
+{
+ void *winner;
+ zap_leaf_t *l = kmem_alloc(sizeof (zap_leaf_t), KM_SLEEP);
+
+ ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
+
+ rw_init(&l->l_rwlock, NULL, RW_DEFAULT, 0);
+ rw_enter(&l->l_rwlock, RW_WRITER);
+ l->l_blkid = zap_allocate_blocks(zap, 1);
+ l->l_dbuf = NULL;
+ l->l_phys = NULL;
+
+ VERIFY(0 == dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ l->l_blkid << FZAP_BLOCK_SHIFT(zap), NULL, &l->l_dbuf));
+ winner = dmu_buf_set_user(l->l_dbuf, l, &l->l_phys, zap_leaf_pageout);
+ ASSERT(winner == NULL);
+ dmu_buf_will_dirty(l->l_dbuf, tx);
+
+ zap_leaf_init(l);
+
+ zap->zap_f.zap_phys->zap_num_leafs++;
+
+ return (l);
+}
+
+int
+fzap_count(zap_t *zap, uint64_t *count)
+{
+ ASSERT(!zap->zap_ismicro);
+ mutex_enter(&zap->zap_f.zap_num_entries_mtx); /* unnecessary */
+ *count = zap->zap_f.zap_phys->zap_num_entries;
+ mutex_exit(&zap->zap_f.zap_num_entries_mtx);
+ return (0);
+}
+
+/*
+ * Routines for obtaining zap_leaf_t's
+ */
+
+void
+zap_put_leaf(zap_leaf_t *l)
+{
+ rw_exit(&l->l_rwlock);
+ dmu_buf_rele(l->l_dbuf, NULL);
+}
+
+_NOTE(ARGSUSED(0))
+static void
+zap_leaf_pageout(dmu_buf_t *db, void *vl)
+{
+ zap_leaf_t *l = vl;
+
+ rw_destroy(&l->l_rwlock);
+ kmem_free(l, sizeof (zap_leaf_t));
+}
+
+static zap_leaf_t *
+zap_open_leaf(uint64_t blkid, dmu_buf_t *db)
+{
+ zap_leaf_t *l, *winner;
+
+ ASSERT(blkid != 0);
+
+ l = kmem_alloc(sizeof (zap_leaf_t), KM_SLEEP);
+ rw_init(&l->l_rwlock, NULL, RW_DEFAULT, 0);
+ rw_enter(&l->l_rwlock, RW_WRITER);
+ l->l_blkid = blkid;
+ l->l_bs = highbit(db->db_size)-1;
+ l->l_dbuf = db;
+ l->l_phys = NULL;
+
+ winner = dmu_buf_set_user(db, l, &l->l_phys, zap_leaf_pageout);
+
+ rw_exit(&l->l_rwlock);
+ if (winner != NULL) {
+ /* someone else set it first */
+ zap_leaf_pageout(NULL, l);
+ l = winner;
+ }
+
+ /*
+ * lhr_pad was previously used for the next leaf in the leaf
+ * chain. There should be no chained leafs (as we have removed
+ * support for them).
+ */
+ ASSERT3U(l->l_phys->l_hdr.lh_pad1, ==, 0);
+
+ /*
+ * There should be more hash entries than there can be
+ * chunks to put in the hash table
+ */
+ ASSERT3U(ZAP_LEAF_HASH_NUMENTRIES(l), >, ZAP_LEAF_NUMCHUNKS(l) / 3);
+
+ /* The chunks should begin at the end of the hash table */
+ ASSERT3P(&ZAP_LEAF_CHUNK(l, 0), ==,
+ &l->l_phys->l_hash[ZAP_LEAF_HASH_NUMENTRIES(l)]);
+
+ /* The chunks should end at the end of the block */
+ ASSERT3U((uintptr_t)&ZAP_LEAF_CHUNK(l, ZAP_LEAF_NUMCHUNKS(l)) -
+ (uintptr_t)l->l_phys, ==, l->l_dbuf->db_size);
+
+ return (l);
+}
+
+static int
+zap_get_leaf_byblk(zap_t *zap, uint64_t blkid, dmu_tx_t *tx, krw_t lt,
+ zap_leaf_t **lp)
+{
+ dmu_buf_t *db;
+ zap_leaf_t *l;
+ int bs = FZAP_BLOCK_SHIFT(zap);
+ int err;
+
+ ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
+
+ err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ blkid << bs, NULL, &db);
+ if (err)
+ return (err);
+
+ ASSERT3U(db->db_object, ==, zap->zap_object);
+ ASSERT3U(db->db_offset, ==, blkid << bs);
+ ASSERT3U(db->db_size, ==, 1 << bs);
+ ASSERT(blkid != 0);
+
+ l = dmu_buf_get_user(db);
+
+ if (l == NULL)
+ l = zap_open_leaf(blkid, db);
+
+ rw_enter(&l->l_rwlock, lt);
+ /*
+ * Must lock before dirtying, otherwise l->l_phys could change,
+ * causing ASSERT below to fail.
+ */
+ if (lt == RW_WRITER)
+ dmu_buf_will_dirty(db, tx);
+ ASSERT3U(l->l_blkid, ==, blkid);
+ ASSERT3P(l->l_dbuf, ==, db);
+ ASSERT3P(l->l_phys, ==, l->l_dbuf->db_data);
+ ASSERT3U(l->l_phys->l_hdr.lh_block_type, ==, ZBT_LEAF);
+ ASSERT3U(l->l_phys->l_hdr.lh_magic, ==, ZAP_LEAF_MAGIC);
+
+ *lp = l;
+ return (0);
+}
+
+static int
+zap_idx_to_blk(zap_t *zap, uint64_t idx, uint64_t *valp)
+{
+ ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
+
+ if (zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks == 0) {
+ ASSERT3U(idx, <,
+ (1ULL << zap->zap_f.zap_phys->zap_ptrtbl.zt_shift));
+ *valp = ZAP_EMBEDDED_PTRTBL_ENT(zap, idx);
+ return (0);
+ } else {
+ return (zap_table_load(zap, &zap->zap_f.zap_phys->zap_ptrtbl,
+ idx, valp));
+ }
+}
+
+static int
+zap_set_idx_to_blk(zap_t *zap, uint64_t idx, uint64_t blk, dmu_tx_t *tx)
+{
+ ASSERT(tx != NULL);
+ ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
+
+ if (zap->zap_f.zap_phys->zap_ptrtbl.zt_blk == 0) {
+ ZAP_EMBEDDED_PTRTBL_ENT(zap, idx) = blk;
+ return (0);
+ } else {
+ return (zap_table_store(zap, &zap->zap_f.zap_phys->zap_ptrtbl,
+ idx, blk, tx));
+ }
+}
+
+static int
+zap_deref_leaf(zap_t *zap, uint64_t h, dmu_tx_t *tx, krw_t lt, zap_leaf_t **lp)
+{
+ uint64_t idx, blk;
+ int err;
+
+ ASSERT(zap->zap_dbuf == NULL ||
+ zap->zap_f.zap_phys == zap->zap_dbuf->db_data);
+ ASSERT3U(zap->zap_f.zap_phys->zap_magic, ==, ZAP_MAGIC);
+ idx = ZAP_HASH_IDX(h, zap->zap_f.zap_phys->zap_ptrtbl.zt_shift);
+ err = zap_idx_to_blk(zap, idx, &blk);
+ if (err != 0)
+ return (err);
+ err = zap_get_leaf_byblk(zap, blk, tx, lt, lp);
+
+ ASSERT(err || ZAP_HASH_IDX(h, (*lp)->l_phys->l_hdr.lh_prefix_len) ==
+ (*lp)->l_phys->l_hdr.lh_prefix);
+ return (err);
+}
+
+static int
+zap_expand_leaf(zap_t *zap, zap_leaf_t *l, uint64_t hash, dmu_tx_t *tx,
+ zap_leaf_t **lp)
+{
+ zap_leaf_t *nl;
+ int prefix_diff, i, err;
+ uint64_t sibling;
+ int old_prefix_len = l->l_phys->l_hdr.lh_prefix_len;
+
+ ASSERT3U(old_prefix_len, <=, zap->zap_f.zap_phys->zap_ptrtbl.zt_shift);
+ ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
+
+ ASSERT3U(ZAP_HASH_IDX(hash, old_prefix_len), ==,
+ l->l_phys->l_hdr.lh_prefix);
+
+ if (zap_tryupgradedir(zap, tx) == 0 ||
+ old_prefix_len == zap->zap_f.zap_phys->zap_ptrtbl.zt_shift) {
+ /* We failed to upgrade, or need to grow the pointer table */
+ objset_t *os = zap->zap_objset;
+ uint64_t object = zap->zap_object;
+
+ zap_put_leaf(l);
+ zap_unlockdir(zap);
+ err = zap_lockdir(os, object, tx, RW_WRITER, FALSE, &zap);
+ if (err)
+ return (err);
+ ASSERT(!zap->zap_ismicro);
+
+ while (old_prefix_len ==
+ zap->zap_f.zap_phys->zap_ptrtbl.zt_shift) {
+ err = zap_grow_ptrtbl(zap, tx);
+ if (err)
+ return (err);
+ }
+
+ err = zap_deref_leaf(zap, hash, tx, RW_WRITER, &l);
+ if (err)
+ return (err);
+
+ if (l->l_phys->l_hdr.lh_prefix_len != old_prefix_len) {
+ /* it split while our locks were down */
+ *lp = l;
+ return (0);
+ }
+ }
+ ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
+ ASSERT3U(old_prefix_len, <, zap->zap_f.zap_phys->zap_ptrtbl.zt_shift);
+ ASSERT3U(ZAP_HASH_IDX(hash, old_prefix_len), ==,
+ l->l_phys->l_hdr.lh_prefix);
+
+ prefix_diff = zap->zap_f.zap_phys->zap_ptrtbl.zt_shift -
+ (old_prefix_len + 1);
+ sibling = (ZAP_HASH_IDX(hash, old_prefix_len + 1) | 1) << prefix_diff;
+
+ /* check for i/o errors before doing zap_leaf_split */
+ for (i = 0; i < (1ULL<<prefix_diff); i++) {
+ uint64_t blk;
+ err = zap_idx_to_blk(zap, sibling+i, &blk);
+ if (err)
+ return (err);
+ ASSERT3U(blk, ==, l->l_blkid);
+ }
+
+ nl = zap_create_leaf(zap, tx);
+ zap_leaf_split(l, nl);
+
+ /* set sibling pointers */
+ for (i = 0; i < (1ULL<<prefix_diff); i++) {
+ err = zap_set_idx_to_blk(zap, sibling+i, nl->l_blkid, tx);
+ ASSERT3U(err, ==, 0); /* we checked for i/o errors above */
+ }
+
+ if (hash & (1ULL << (64 - l->l_phys->l_hdr.lh_prefix_len))) {
+ /* we want the sibling */
+ zap_put_leaf(l);
+ *lp = nl;
+ } else {
+ zap_put_leaf(nl);
+ *lp = l;
+ }
+
+ return (0);
+}
+
+static void
+zap_put_leaf_maybe_grow_ptrtbl(zap_t *zap, zap_leaf_t *l, dmu_tx_t *tx)
+{
+ int shift = zap->zap_f.zap_phys->zap_ptrtbl.zt_shift;
+ int leaffull = (l->l_phys->l_hdr.lh_prefix_len == shift &&
+ l->l_phys->l_hdr.lh_nfree < ZAP_LEAF_LOW_WATER);
+
+ zap_put_leaf(l);
+
+ if (leaffull || zap->zap_f.zap_phys->zap_ptrtbl.zt_nextblk) {
+ int err;
+
+ /*
+ * We are in the middle of growing the pointer table, or
+ * this leaf will soon make us grow it.
+ */
+ if (zap_tryupgradedir(zap, tx) == 0) {
+ objset_t *os = zap->zap_objset;
+ uint64_t zapobj = zap->zap_object;
+
+ zap_unlockdir(zap);
+ err = zap_lockdir(os, zapobj, tx,
+ RW_WRITER, FALSE, &zap);
+ if (err)
+ return;
+ }
+
+ /* could have finished growing while our locks were down */
+ if (zap->zap_f.zap_phys->zap_ptrtbl.zt_shift == shift)
+ (void) zap_grow_ptrtbl(zap, tx);
+ }
+}
+
+
+static int
+fzap_checksize(const char *name, uint64_t integer_size, uint64_t num_integers)
+{
+ if (name && strlen(name) > ZAP_MAXNAMELEN)
+ return (E2BIG);
+
+ /* Only integer sizes supported by C */
+ switch (integer_size) {
+ case 1:
+ case 2:
+ case 4:
+ case 8:
+ break;
+ default:
+ return (EINVAL);
+ }
+
+ if (integer_size * num_integers > ZAP_MAXVALUELEN)
+ return (E2BIG);
+
+ return (0);
+}
+
+/*
+ * Routines for maniplulating attributes.
+ */
+int
+fzap_lookup(zap_t *zap, const char *name,
+ uint64_t integer_size, uint64_t num_integers, void *buf)
+{
+ zap_leaf_t *l;
+ int err;
+ uint64_t hash;
+ zap_entry_handle_t zeh;
+
+ err = fzap_checksize(name, integer_size, num_integers);
+ if (err != 0)
+ return (err);
+
+ hash = zap_hash(zap, name);
+ err = zap_deref_leaf(zap, hash, NULL, RW_READER, &l);
+ if (err != 0)
+ return (err);
+ err = zap_leaf_lookup(l, name, hash, &zeh);
+ if (err == 0)
+ err = zap_entry_read(&zeh, integer_size, num_integers, buf);
+
+ zap_put_leaf(l);
+ return (err);
+}
+
+int
+fzap_add_cd(zap_t *zap, const char *name,
+ uint64_t integer_size, uint64_t num_integers,
+ const void *val, uint32_t cd, dmu_tx_t *tx)
+{
+ zap_leaf_t *l;
+ uint64_t hash;
+ int err;
+ zap_entry_handle_t zeh;
+
+ ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
+ ASSERT(!zap->zap_ismicro);
+ ASSERT(fzap_checksize(name, integer_size, num_integers) == 0);
+
+ hash = zap_hash(zap, name);
+ err = zap_deref_leaf(zap, hash, tx, RW_WRITER, &l);
+ if (err != 0)
+ return (err);
+retry:
+ err = zap_leaf_lookup(l, name, hash, &zeh);
+ if (err == 0) {
+ err = EEXIST;
+ goto out;
+ }
+ if (err != ENOENT)
+ goto out;
+
+ err = zap_entry_create(l, name, hash, cd,
+ integer_size, num_integers, val, &zeh);
+
+ if (err == 0) {
+ zap_increment_num_entries(zap, 1, tx);
+ } else if (err == EAGAIN) {
+ err = zap_expand_leaf(zap, l, hash, tx, &l);
+ if (err == 0)
+ goto retry;
+ }
+
+out:
+ zap_put_leaf_maybe_grow_ptrtbl(zap, l, tx);
+ return (err);
+}
+
+int
+fzap_add(zap_t *zap, const char *name,
+ uint64_t integer_size, uint64_t num_integers,
+ const void *val, dmu_tx_t *tx)
+{
+ int err = fzap_checksize(name, integer_size, num_integers);
+ if (err != 0)
+ return (err);
+
+ return (fzap_add_cd(zap, name, integer_size, num_integers,
+ val, ZAP_MAXCD, tx));
+}
+
+int
+fzap_update(zap_t *zap, const char *name,
+ int integer_size, uint64_t num_integers, const void *val, dmu_tx_t *tx)
+{
+ zap_leaf_t *l;
+ uint64_t hash;
+ int err, create;
+ zap_entry_handle_t zeh;
+
+ ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
+ err = fzap_checksize(name, integer_size, num_integers);
+ if (err != 0)
+ return (err);
+
+ hash = zap_hash(zap, name);
+ err = zap_deref_leaf(zap, hash, tx, RW_WRITER, &l);
+ if (err != 0)
+ return (err);
+retry:
+ err = zap_leaf_lookup(l, name, hash, &zeh);
+ create = (err == ENOENT);
+ ASSERT(err == 0 || err == ENOENT);
+
+ /* XXX If this leaf is chained, split it if we can. */
+
+ if (create) {
+ err = zap_entry_create(l, name, hash, ZAP_MAXCD,
+ integer_size, num_integers, val, &zeh);
+ if (err == 0)
+ zap_increment_num_entries(zap, 1, tx);
+ } else {
+ err = zap_entry_update(&zeh, integer_size, num_integers, val);
+ }
+
+ if (err == EAGAIN) {
+ err = zap_expand_leaf(zap, l, hash, tx, &l);
+ if (err == 0)
+ goto retry;
+ }
+
+ zap_put_leaf_maybe_grow_ptrtbl(zap, l, tx);
+ return (err);
+}
+
+int
+fzap_length(zap_t *zap, const char *name,
+ uint64_t *integer_size, uint64_t *num_integers)
+{
+ zap_leaf_t *l;
+ int err;
+ uint64_t hash;
+ zap_entry_handle_t zeh;
+
+ hash = zap_hash(zap, name);
+ err = zap_deref_leaf(zap, hash, NULL, RW_READER, &l);
+ if (err != 0)
+ return (err);
+ err = zap_leaf_lookup(l, name, hash, &zeh);
+ if (err != 0)
+ goto out;
+
+ if (integer_size)
+ *integer_size = zeh.zeh_integer_size;
+ if (num_integers)
+ *num_integers = zeh.zeh_num_integers;
+out:
+ zap_put_leaf(l);
+ return (err);
+}
+
+int
+fzap_remove(zap_t *zap, const char *name, dmu_tx_t *tx)
+{
+ zap_leaf_t *l;
+ uint64_t hash;
+ int err;
+ zap_entry_handle_t zeh;
+
+ hash = zap_hash(zap, name);
+ err = zap_deref_leaf(zap, hash, tx, RW_WRITER, &l);
+ if (err != 0)
+ return (err);
+ err = zap_leaf_lookup(l, name, hash, &zeh);
+ if (err == 0) {
+ zap_entry_remove(&zeh);
+ zap_increment_num_entries(zap, -1, tx);
+ }
+ zap_put_leaf(l);
+ dprintf("fzap_remove: ds=%p obj=%llu name=%s err=%d\n",
+ zap->zap_objset, zap->zap_object, name, err);
+ return (err);
+}
+
+int
+zap_value_search(objset_t *os, uint64_t zapobj, uint64_t value, char *name)
+{
+ zap_cursor_t zc;
+ zap_attribute_t *za;
+ int err;
+
+ za = kmem_alloc(sizeof (zap_attribute_t), KM_SLEEP);
+ for (zap_cursor_init(&zc, os, zapobj);
+ (err = zap_cursor_retrieve(&zc, za)) == 0;
+ zap_cursor_advance(&zc)) {
+ if (ZFS_DIRENT_OBJ(za->za_first_integer) == value) {
+ (void) strcpy(name, za->za_name);
+ break;
+ }
+ }
+ zap_cursor_fini(&zc);
+ kmem_free(za, sizeof (zap_attribute_t));
+ return (err);
+}
+
+
+/*
+ * Routines for iterating over the attributes.
+ */
+
+int
+fzap_cursor_retrieve(zap_t *zap, zap_cursor_t *zc, zap_attribute_t *za)
+{
+ int err = ENOENT;
+ zap_entry_handle_t zeh;
+ zap_leaf_t *l;
+
+ /* retrieve the next entry at or after zc_hash/zc_cd */
+ /* if no entry, return ENOENT */
+
+ if (zc->zc_leaf &&
+ (ZAP_HASH_IDX(zc->zc_hash,
+ zc->zc_leaf->l_phys->l_hdr.lh_prefix_len) !=
+ zc->zc_leaf->l_phys->l_hdr.lh_prefix)) {
+ rw_enter(&zc->zc_leaf->l_rwlock, RW_READER);
+ zap_put_leaf(zc->zc_leaf);
+ zc->zc_leaf = NULL;
+ }
+
+again:
+ if (zc->zc_leaf == NULL) {
+ err = zap_deref_leaf(zap, zc->zc_hash, NULL, RW_READER,
+ &zc->zc_leaf);
+ if (err != 0)
+ return (err);
+ } else {
+ rw_enter(&zc->zc_leaf->l_rwlock, RW_READER);
+ }
+ l = zc->zc_leaf;
+
+ err = zap_leaf_lookup_closest(l, zc->zc_hash, zc->zc_cd, &zeh);
+
+ if (err == ENOENT) {
+ uint64_t nocare =
+ (1ULL << (64 - l->l_phys->l_hdr.lh_prefix_len)) - 1;
+ zc->zc_hash = (zc->zc_hash & ~nocare) + nocare + 1;
+ zc->zc_cd = 0;
+ if (l->l_phys->l_hdr.lh_prefix_len == 0 || zc->zc_hash == 0) {
+ zc->zc_hash = -1ULL;
+ } else {
+ zap_put_leaf(zc->zc_leaf);
+ zc->zc_leaf = NULL;
+ goto again;
+ }
+ }
+
+ if (err == 0) {
+ zc->zc_hash = zeh.zeh_hash;
+ zc->zc_cd = zeh.zeh_cd;
+ za->za_integer_length = zeh.zeh_integer_size;
+ za->za_num_integers = zeh.zeh_num_integers;
+ if (zeh.zeh_num_integers == 0) {
+ za->za_first_integer = 0;
+ } else {
+ err = zap_entry_read(&zeh, 8, 1, &za->za_first_integer);
+ ASSERT(err == 0 || err == EOVERFLOW);
+ }
+ err = zap_entry_read_name(&zeh,
+ sizeof (za->za_name), za->za_name);
+ ASSERT(err == 0);
+ }
+ rw_exit(&zc->zc_leaf->l_rwlock);
+ return (err);
+}
+
+
+static void
+zap_stats_ptrtbl(zap_t *zap, uint64_t *tbl, int len, zap_stats_t *zs)
+{
+ int i, err;
+ uint64_t lastblk = 0;
+
+ /*
+ * NB: if a leaf has more pointers than an entire ptrtbl block
+ * can hold, then it'll be accounted for more than once, since
+ * we won't have lastblk.
+ */
+ for (i = 0; i < len; i++) {
+ zap_leaf_t *l;
+
+ if (tbl[i] == lastblk)
+ continue;
+ lastblk = tbl[i];
+
+ err = zap_get_leaf_byblk(zap, tbl[i], NULL, RW_READER, &l);
+ if (err == 0) {
+ zap_leaf_stats(zap, l, zs);
+ zap_put_leaf(l);
+ }
+ }
+}
+
+void
+fzap_get_stats(zap_t *zap, zap_stats_t *zs)
+{
+ int bs = FZAP_BLOCK_SHIFT(zap);
+ zs->zs_blocksize = 1ULL << bs;
+
+ /*
+ * Set zap_phys_t fields
+ */
+ zs->zs_num_leafs = zap->zap_f.zap_phys->zap_num_leafs;
+ zs->zs_num_entries = zap->zap_f.zap_phys->zap_num_entries;
+ zs->zs_num_blocks = zap->zap_f.zap_phys->zap_freeblk;
+ zs->zs_block_type = zap->zap_f.zap_phys->zap_block_type;
+ zs->zs_magic = zap->zap_f.zap_phys->zap_magic;
+ zs->zs_salt = zap->zap_f.zap_phys->zap_salt;
+
+ /*
+ * Set zap_ptrtbl fields
+ */
+ zs->zs_ptrtbl_len = 1ULL << zap->zap_f.zap_phys->zap_ptrtbl.zt_shift;
+ zs->zs_ptrtbl_nextblk = zap->zap_f.zap_phys->zap_ptrtbl.zt_nextblk;
+ zs->zs_ptrtbl_blks_copied =
+ zap->zap_f.zap_phys->zap_ptrtbl.zt_blks_copied;
+ zs->zs_ptrtbl_zt_blk = zap->zap_f.zap_phys->zap_ptrtbl.zt_blk;
+ zs->zs_ptrtbl_zt_numblks = zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks;
+ zs->zs_ptrtbl_zt_shift = zap->zap_f.zap_phys->zap_ptrtbl.zt_shift;
+
+ if (zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks == 0) {
+ /* the ptrtbl is entirely in the header block. */
+ zap_stats_ptrtbl(zap, &ZAP_EMBEDDED_PTRTBL_ENT(zap, 0),
+ 1 << ZAP_EMBEDDED_PTRTBL_SHIFT(zap), zs);
+ } else {
+ int b;
+
+ dmu_prefetch(zap->zap_objset, zap->zap_object,
+ zap->zap_f.zap_phys->zap_ptrtbl.zt_blk << bs,
+ zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks << bs);
+
+ for (b = 0; b < zap->zap_f.zap_phys->zap_ptrtbl.zt_numblks;
+ b++) {
+ dmu_buf_t *db;
+ int err;
+
+ err = dmu_buf_hold(zap->zap_objset, zap->zap_object,
+ (zap->zap_f.zap_phys->zap_ptrtbl.zt_blk + b) << bs,
+ FTAG, &db);
+ if (err == 0) {
+ zap_stats_ptrtbl(zap, db->db_data,
+ 1<<(bs-3), zs);
+ dmu_buf_rele(db, FTAG);
+ }
+ }
+ }
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zap_leaf.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zap_leaf.c
new file mode 100644
index 0000000..5dff514
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zap_leaf.c
@@ -0,0 +1,741 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * The 512-byte leaf is broken into 32 16-byte chunks.
+ * chunk number n means l_chunk[n], even though the header precedes it.
+ * the names are stored null-terminated.
+ */
+
+#include <sys/zfs_context.h>
+#include <sys/zap.h>
+#include <sys/zap_impl.h>
+#include <sys/zap_leaf.h>
+#include <sys/spa.h>
+#include <sys/dmu.h>
+
+#define CHAIN_END 0xffff /* end of the chunk chain */
+
+/* half the (current) minimum block size */
+#define MAX_ARRAY_BYTES (8<<10)
+
+#define LEAF_HASH(l, h) \
+ ((ZAP_LEAF_HASH_NUMENTRIES(l)-1) & \
+ ((h) >> (64 - ZAP_LEAF_HASH_SHIFT(l)-(l)->l_phys->l_hdr.lh_prefix_len)))
+
+#define LEAF_HASH_ENTPTR(l, h) (&(l)->l_phys->l_hash[LEAF_HASH(l, h)])
+
+
+static void
+zap_memset(void *a, int c, size_t n)
+{
+ char *cp = a;
+ char *cpend = cp + n;
+
+ while (cp < cpend)
+ *cp++ = c;
+}
+
+static void
+stv(int len, void *addr, uint64_t value)
+{
+ switch (len) {
+ case 1:
+ *(uint8_t *)addr = value;
+ return;
+ case 2:
+ *(uint16_t *)addr = value;
+ return;
+ case 4:
+ *(uint32_t *)addr = value;
+ return;
+ case 8:
+ *(uint64_t *)addr = value;
+ return;
+ }
+ ASSERT(!"bad int len");
+}
+
+static uint64_t
+ldv(int len, const void *addr)
+{
+ switch (len) {
+ case 1:
+ return (*(uint8_t *)addr);
+ case 2:
+ return (*(uint16_t *)addr);
+ case 4:
+ return (*(uint32_t *)addr);
+ case 8:
+ return (*(uint64_t *)addr);
+ }
+ ASSERT(!"bad int len");
+ return (0xFEEDFACEDEADBEEFULL);
+}
+
+void
+zap_leaf_byteswap(zap_leaf_phys_t *buf, int size)
+{
+ int i;
+ zap_leaf_t l;
+ l.l_bs = highbit(size)-1;
+ l.l_phys = buf;
+
+ buf->l_hdr.lh_block_type = BSWAP_64(buf->l_hdr.lh_block_type);
+ buf->l_hdr.lh_prefix = BSWAP_64(buf->l_hdr.lh_prefix);
+ buf->l_hdr.lh_magic = BSWAP_32(buf->l_hdr.lh_magic);
+ buf->l_hdr.lh_nfree = BSWAP_16(buf->l_hdr.lh_nfree);
+ buf->l_hdr.lh_nentries = BSWAP_16(buf->l_hdr.lh_nentries);
+ buf->l_hdr.lh_prefix_len = BSWAP_16(buf->l_hdr.lh_prefix_len);
+ buf->l_hdr.lh_freelist = BSWAP_16(buf->l_hdr.lh_freelist);
+
+ for (i = 0; i < ZAP_LEAF_HASH_NUMENTRIES(&l); i++)
+ buf->l_hash[i] = BSWAP_16(buf->l_hash[i]);
+
+ for (i = 0; i < ZAP_LEAF_NUMCHUNKS(&l); i++) {
+ zap_leaf_chunk_t *lc = &ZAP_LEAF_CHUNK(&l, i);
+ struct zap_leaf_entry *le;
+
+ switch (lc->l_free.lf_type) {
+ case ZAP_CHUNK_ENTRY:
+ le = &lc->l_entry;
+
+ le->le_type = BSWAP_8(le->le_type);
+ le->le_int_size = BSWAP_8(le->le_int_size);
+ le->le_next = BSWAP_16(le->le_next);
+ le->le_name_chunk = BSWAP_16(le->le_name_chunk);
+ le->le_name_length = BSWAP_16(le->le_name_length);
+ le->le_value_chunk = BSWAP_16(le->le_value_chunk);
+ le->le_value_length = BSWAP_16(le->le_value_length);
+ le->le_cd = BSWAP_32(le->le_cd);
+ le->le_hash = BSWAP_64(le->le_hash);
+ break;
+ case ZAP_CHUNK_FREE:
+ lc->l_free.lf_type = BSWAP_8(lc->l_free.lf_type);
+ lc->l_free.lf_next = BSWAP_16(lc->l_free.lf_next);
+ break;
+ case ZAP_CHUNK_ARRAY:
+ lc->l_array.la_type = BSWAP_8(lc->l_array.la_type);
+ lc->l_array.la_next = BSWAP_16(lc->l_array.la_next);
+ /* la_array doesn't need swapping */
+ break;
+ default:
+ ASSERT(!"bad leaf type");
+ }
+ }
+}
+
+void
+zap_leaf_init(zap_leaf_t *l)
+{
+ int i;
+
+ l->l_bs = highbit(l->l_dbuf->db_size)-1;
+ zap_memset(&l->l_phys->l_hdr, 0, sizeof (struct zap_leaf_header));
+ zap_memset(l->l_phys->l_hash, CHAIN_END, 2*ZAP_LEAF_HASH_NUMENTRIES(l));
+ for (i = 0; i < ZAP_LEAF_NUMCHUNKS(l); i++) {
+ ZAP_LEAF_CHUNK(l, i).l_free.lf_type = ZAP_CHUNK_FREE;
+ ZAP_LEAF_CHUNK(l, i).l_free.lf_next = i+1;
+ }
+ ZAP_LEAF_CHUNK(l, ZAP_LEAF_NUMCHUNKS(l)-1).l_free.lf_next = CHAIN_END;
+ l->l_phys->l_hdr.lh_block_type = ZBT_LEAF;
+ l->l_phys->l_hdr.lh_magic = ZAP_LEAF_MAGIC;
+ l->l_phys->l_hdr.lh_nfree = ZAP_LEAF_NUMCHUNKS(l);
+}
+
+/*
+ * Routines which manipulate leaf chunks (l_chunk[]).
+ */
+
+static uint16_t
+zap_leaf_chunk_alloc(zap_leaf_t *l)
+{
+ int chunk;
+
+ ASSERT(l->l_phys->l_hdr.lh_nfree > 0);
+
+ chunk = l->l_phys->l_hdr.lh_freelist;
+ ASSERT3U(chunk, <, ZAP_LEAF_NUMCHUNKS(l));
+ ASSERT3U(ZAP_LEAF_CHUNK(l, chunk).l_free.lf_type, ==, ZAP_CHUNK_FREE);
+
+ l->l_phys->l_hdr.lh_freelist = ZAP_LEAF_CHUNK(l, chunk).l_free.lf_next;
+
+ l->l_phys->l_hdr.lh_nfree--;
+
+ return (chunk);
+}
+
+static void
+zap_leaf_chunk_free(zap_leaf_t *l, uint16_t chunk)
+{
+ struct zap_leaf_free *zlf = &ZAP_LEAF_CHUNK(l, chunk).l_free;
+ ASSERT3U(l->l_phys->l_hdr.lh_nfree, <, ZAP_LEAF_NUMCHUNKS(l));
+ ASSERT3U(chunk, <, ZAP_LEAF_NUMCHUNKS(l));
+ ASSERT(zlf->lf_type != ZAP_CHUNK_FREE);
+
+ zlf->lf_type = ZAP_CHUNK_FREE;
+ zlf->lf_next = l->l_phys->l_hdr.lh_freelist;
+ bzero(zlf->lf_pad, sizeof (zlf->lf_pad)); /* help it to compress */
+ l->l_phys->l_hdr.lh_freelist = chunk;
+
+ l->l_phys->l_hdr.lh_nfree++;
+}
+
+/*
+ * Routines which manipulate leaf arrays (zap_leaf_array type chunks).
+ */
+
+static uint16_t
+zap_leaf_array_create(zap_leaf_t *l, const char *buf,
+ int integer_size, int num_integers)
+{
+ uint16_t chunk_head;
+ uint16_t *chunkp = &chunk_head;
+ int byten = 0;
+ uint64_t value;
+ int shift = (integer_size-1)*8;
+ int len = num_integers;
+
+ ASSERT3U(num_integers * integer_size, <, MAX_ARRAY_BYTES);
+
+ while (len > 0) {
+ uint16_t chunk = zap_leaf_chunk_alloc(l);
+ struct zap_leaf_array *la = &ZAP_LEAF_CHUNK(l, chunk).l_array;
+ int i;
+
+ la->la_type = ZAP_CHUNK_ARRAY;
+ for (i = 0; i < ZAP_LEAF_ARRAY_BYTES; i++) {
+ if (byten == 0)
+ value = ldv(integer_size, buf);
+ la->la_array[i] = value >> shift;
+ value <<= 8;
+ if (++byten == integer_size) {
+ byten = 0;
+ buf += integer_size;
+ if (--len == 0)
+ break;
+ }
+ }
+
+ *chunkp = chunk;
+ chunkp = &la->la_next;
+ }
+ *chunkp = CHAIN_END;
+
+ return (chunk_head);
+}
+
+static void
+zap_leaf_array_free(zap_leaf_t *l, uint16_t *chunkp)
+{
+ uint16_t chunk = *chunkp;
+
+ *chunkp = CHAIN_END;
+
+ while (chunk != CHAIN_END) {
+ int nextchunk = ZAP_LEAF_CHUNK(l, chunk).l_array.la_next;
+ ASSERT3U(ZAP_LEAF_CHUNK(l, chunk).l_array.la_type, ==,
+ ZAP_CHUNK_ARRAY);
+ zap_leaf_chunk_free(l, chunk);
+ chunk = nextchunk;
+ }
+}
+
+/* array_len and buf_len are in integers, not bytes */
+static void
+zap_leaf_array_read(zap_leaf_t *l, uint16_t chunk,
+ int array_int_len, int array_len, int buf_int_len, uint64_t buf_len,
+ char *buf)
+{
+ int len = MIN(array_len, buf_len);
+ int byten = 0;
+ uint64_t value = 0;
+
+ ASSERT3U(array_int_len, <=, buf_int_len);
+
+ /* Fast path for one 8-byte integer */
+ if (array_int_len == 8 && buf_int_len == 8 && len == 1) {
+ struct zap_leaf_array *la = &ZAP_LEAF_CHUNK(l, chunk).l_array;
+ uint8_t *ip = la->la_array;
+ uint64_t *buf64 = (uint64_t *)buf;
+
+ *buf64 = (uint64_t)ip[0] << 56 | (uint64_t)ip[1] << 48 |
+ (uint64_t)ip[2] << 40 | (uint64_t)ip[3] << 32 |
+ (uint64_t)ip[4] << 24 | (uint64_t)ip[5] << 16 |
+ (uint64_t)ip[6] << 8 | (uint64_t)ip[7];
+ return;
+ }
+
+ /* Fast path for an array of 1-byte integers (eg. the entry name) */
+ if (array_int_len == 1 && buf_int_len == 1 &&
+ buf_len > array_len + ZAP_LEAF_ARRAY_BYTES) {
+ while (chunk != CHAIN_END) {
+ struct zap_leaf_array *la =
+ &ZAP_LEAF_CHUNK(l, chunk).l_array;
+ bcopy(la->la_array, buf, ZAP_LEAF_ARRAY_BYTES);
+ buf += ZAP_LEAF_ARRAY_BYTES;
+ chunk = la->la_next;
+ }
+ return;
+ }
+
+ while (len > 0) {
+ struct zap_leaf_array *la = &ZAP_LEAF_CHUNK(l, chunk).l_array;
+ int i;
+
+ ASSERT3U(chunk, <, ZAP_LEAF_NUMCHUNKS(l));
+ for (i = 0; i < ZAP_LEAF_ARRAY_BYTES && len > 0; i++) {
+ value = (value << 8) | la->la_array[i];
+ byten++;
+ if (byten == array_int_len) {
+ stv(buf_int_len, buf, value);
+ byten = 0;
+ len--;
+ if (len == 0)
+ return;
+ buf += buf_int_len;
+ }
+ }
+ chunk = la->la_next;
+ }
+}
+
+/*
+ * Only to be used on 8-bit arrays.
+ * array_len is actual len in bytes (not encoded le_value_length).
+ * buf is null-terminated.
+ */
+static int
+zap_leaf_array_equal(zap_leaf_t *l, int chunk,
+ int array_len, const char *buf)
+{
+ int bseen = 0;
+
+ while (bseen < array_len) {
+ struct zap_leaf_array *la = &ZAP_LEAF_CHUNK(l, chunk).l_array;
+ int toread = MIN(array_len - bseen, ZAP_LEAF_ARRAY_BYTES);
+ ASSERT3U(chunk, <, ZAP_LEAF_NUMCHUNKS(l));
+ if (bcmp(la->la_array, buf + bseen, toread))
+ break;
+ chunk = la->la_next;
+ bseen += toread;
+ }
+ return (bseen == array_len);
+}
+
+/*
+ * Routines which manipulate leaf entries.
+ */
+
+int
+zap_leaf_lookup(zap_leaf_t *l,
+ const char *name, uint64_t h, zap_entry_handle_t *zeh)
+{
+ uint16_t *chunkp;
+ struct zap_leaf_entry *le;
+
+ ASSERT3U(l->l_phys->l_hdr.lh_magic, ==, ZAP_LEAF_MAGIC);
+
+ for (chunkp = LEAF_HASH_ENTPTR(l, h);
+ *chunkp != CHAIN_END; chunkp = &le->le_next) {
+ uint16_t chunk = *chunkp;
+ le = ZAP_LEAF_ENTRY(l, chunk);
+
+ ASSERT3U(chunk, <, ZAP_LEAF_NUMCHUNKS(l));
+ ASSERT3U(le->le_type, ==, ZAP_CHUNK_ENTRY);
+
+ if (le->le_hash != h)
+ continue;
+
+ if (zap_leaf_array_equal(l, le->le_name_chunk,
+ le->le_name_length, name)) {
+ zeh->zeh_num_integers = le->le_value_length;
+ zeh->zeh_integer_size = le->le_int_size;
+ zeh->zeh_cd = le->le_cd;
+ zeh->zeh_hash = le->le_hash;
+ zeh->zeh_chunkp = chunkp;
+ zeh->zeh_leaf = l;
+ return (0);
+ }
+ }
+
+ return (ENOENT);
+}
+
+/* Return (h1,cd1 >= h2,cd2) */
+#define HCD_GTEQ(h1, cd1, h2, cd2) \
+ ((h1 > h2) ? TRUE : ((h1 == h2 && cd1 >= cd2) ? TRUE : FALSE))
+
+int
+zap_leaf_lookup_closest(zap_leaf_t *l,
+ uint64_t h, uint32_t cd, zap_entry_handle_t *zeh)
+{
+ uint16_t chunk;
+ uint64_t besth = -1ULL;
+ uint32_t bestcd = ZAP_MAXCD;
+ uint16_t bestlh = ZAP_LEAF_HASH_NUMENTRIES(l)-1;
+ uint16_t lh;
+ struct zap_leaf_entry *le;
+
+ ASSERT3U(l->l_phys->l_hdr.lh_magic, ==, ZAP_LEAF_MAGIC);
+
+ for (lh = LEAF_HASH(l, h); lh <= bestlh; lh++) {
+ for (chunk = l->l_phys->l_hash[lh];
+ chunk != CHAIN_END; chunk = le->le_next) {
+ le = ZAP_LEAF_ENTRY(l, chunk);
+
+ ASSERT3U(chunk, <, ZAP_LEAF_NUMCHUNKS(l));
+ ASSERT3U(le->le_type, ==, ZAP_CHUNK_ENTRY);
+
+ if (HCD_GTEQ(le->le_hash, le->le_cd, h, cd) &&
+ HCD_GTEQ(besth, bestcd, le->le_hash, le->le_cd)) {
+ ASSERT3U(bestlh, >=, lh);
+ bestlh = lh;
+ besth = le->le_hash;
+ bestcd = le->le_cd;
+
+ zeh->zeh_num_integers = le->le_value_length;
+ zeh->zeh_integer_size = le->le_int_size;
+ zeh->zeh_cd = le->le_cd;
+ zeh->zeh_hash = le->le_hash;
+ zeh->zeh_fakechunk = chunk;
+ zeh->zeh_chunkp = &zeh->zeh_fakechunk;
+ zeh->zeh_leaf = l;
+ }
+ }
+ }
+
+ return (bestcd == ZAP_MAXCD ? ENOENT : 0);
+}
+
+int
+zap_entry_read(const zap_entry_handle_t *zeh,
+ uint8_t integer_size, uint64_t num_integers, void *buf)
+{
+ struct zap_leaf_entry *le =
+ ZAP_LEAF_ENTRY(zeh->zeh_leaf, *zeh->zeh_chunkp);
+ ASSERT3U(le->le_type, ==, ZAP_CHUNK_ENTRY);
+
+ if (le->le_int_size > integer_size)
+ return (EINVAL);
+
+ zap_leaf_array_read(zeh->zeh_leaf, le->le_value_chunk, le->le_int_size,
+ le->le_value_length, integer_size, num_integers, buf);
+
+ if (zeh->zeh_num_integers > num_integers)
+ return (EOVERFLOW);
+ return (0);
+
+}
+
+int
+zap_entry_read_name(const zap_entry_handle_t *zeh, uint16_t buflen, char *buf)
+{
+ struct zap_leaf_entry *le =
+ ZAP_LEAF_ENTRY(zeh->zeh_leaf, *zeh->zeh_chunkp);
+ ASSERT3U(le->le_type, ==, ZAP_CHUNK_ENTRY);
+
+ zap_leaf_array_read(zeh->zeh_leaf, le->le_name_chunk, 1,
+ le->le_name_length, 1, buflen, buf);
+ if (le->le_name_length > buflen)
+ return (EOVERFLOW);
+ return (0);
+}
+
+int
+zap_entry_update(zap_entry_handle_t *zeh,
+ uint8_t integer_size, uint64_t num_integers, const void *buf)
+{
+ int delta_chunks;
+ zap_leaf_t *l = zeh->zeh_leaf;
+ struct zap_leaf_entry *le = ZAP_LEAF_ENTRY(l, *zeh->zeh_chunkp);
+
+ delta_chunks = ZAP_LEAF_ARRAY_NCHUNKS(num_integers * integer_size) -
+ ZAP_LEAF_ARRAY_NCHUNKS(le->le_value_length * le->le_int_size);
+
+ if ((int)l->l_phys->l_hdr.lh_nfree < delta_chunks)
+ return (EAGAIN);
+
+ /*
+ * We should search other chained leaves (via
+ * zap_entry_remove,create?) otherwise returning EAGAIN will
+ * just send us into an infinite loop if we have to chain
+ * another leaf block, rather than being able to split this
+ * block.
+ */
+
+ zap_leaf_array_free(l, &le->le_value_chunk);
+ le->le_value_chunk =
+ zap_leaf_array_create(l, buf, integer_size, num_integers);
+ le->le_value_length = num_integers;
+ le->le_int_size = integer_size;
+ return (0);
+}
+
+void
+zap_entry_remove(zap_entry_handle_t *zeh)
+{
+ uint16_t entry_chunk;
+ struct zap_leaf_entry *le;
+ zap_leaf_t *l = zeh->zeh_leaf;
+
+ ASSERT3P(zeh->zeh_chunkp, !=, &zeh->zeh_fakechunk);
+
+ entry_chunk = *zeh->zeh_chunkp;
+ le = ZAP_LEAF_ENTRY(l, entry_chunk);
+ ASSERT3U(le->le_type, ==, ZAP_CHUNK_ENTRY);
+
+ zap_leaf_array_free(l, &le->le_name_chunk);
+ zap_leaf_array_free(l, &le->le_value_chunk);
+
+ *zeh->zeh_chunkp = le->le_next;
+ zap_leaf_chunk_free(l, entry_chunk);
+
+ l->l_phys->l_hdr.lh_nentries--;
+}
+
+int
+zap_entry_create(zap_leaf_t *l, const char *name, uint64_t h, uint32_t cd,
+ uint8_t integer_size, uint64_t num_integers, const void *buf,
+ zap_entry_handle_t *zeh)
+{
+ uint16_t chunk;
+ uint16_t *chunkp;
+ struct zap_leaf_entry *le;
+ uint64_t namelen, valuelen;
+ int numchunks;
+
+ valuelen = integer_size * num_integers;
+ namelen = strlen(name) + 1;
+ ASSERT(namelen >= 2);
+
+ numchunks = 1 + ZAP_LEAF_ARRAY_NCHUNKS(namelen) +
+ ZAP_LEAF_ARRAY_NCHUNKS(valuelen);
+ if (numchunks > ZAP_LEAF_NUMCHUNKS(l))
+ return (E2BIG);
+
+ if (cd == ZAP_MAXCD) {
+ for (cd = 0; cd < ZAP_MAXCD; cd++) {
+ for (chunk = *LEAF_HASH_ENTPTR(l, h);
+ chunk != CHAIN_END; chunk = le->le_next) {
+ le = ZAP_LEAF_ENTRY(l, chunk);
+ if (le->le_hash == h &&
+ le->le_cd == cd) {
+ break;
+ }
+ }
+ /* If this cd is not in use, we are good. */
+ if (chunk == CHAIN_END)
+ break;
+ }
+ /* If we tried all the cd's, we lose. */
+ if (cd == ZAP_MAXCD)
+ return (ENOSPC);
+ }
+
+ if (l->l_phys->l_hdr.lh_nfree < numchunks)
+ return (EAGAIN);
+
+ /* make the entry */
+ chunk = zap_leaf_chunk_alloc(l);
+ le = ZAP_LEAF_ENTRY(l, chunk);
+ le->le_type = ZAP_CHUNK_ENTRY;
+ le->le_name_chunk = zap_leaf_array_create(l, name, 1, namelen);
+ le->le_name_length = namelen;
+ le->le_value_chunk =
+ zap_leaf_array_create(l, buf, integer_size, num_integers);
+ le->le_value_length = num_integers;
+ le->le_int_size = integer_size;
+ le->le_hash = h;
+ le->le_cd = cd;
+
+ /* link it into the hash chain */
+ chunkp = LEAF_HASH_ENTPTR(l, h);
+ le->le_next = *chunkp;
+ *chunkp = chunk;
+
+ l->l_phys->l_hdr.lh_nentries++;
+
+ zeh->zeh_leaf = l;
+ zeh->zeh_num_integers = num_integers;
+ zeh->zeh_integer_size = le->le_int_size;
+ zeh->zeh_cd = le->le_cd;
+ zeh->zeh_hash = le->le_hash;
+ zeh->zeh_chunkp = chunkp;
+
+ return (0);
+}
+
+/*
+ * Routines for transferring entries between leafs.
+ */
+
+static void
+zap_leaf_rehash_entry(zap_leaf_t *l, uint16_t entry)
+{
+ struct zap_leaf_entry *le = ZAP_LEAF_ENTRY(l, entry);
+ uint16_t *ptr = LEAF_HASH_ENTPTR(l, le->le_hash);
+ le->le_next = *ptr;
+ *ptr = entry;
+}
+
+static uint16_t
+zap_leaf_transfer_array(zap_leaf_t *l, uint16_t chunk, zap_leaf_t *nl)
+{
+ uint16_t new_chunk;
+ uint16_t *nchunkp = &new_chunk;
+
+ while (chunk != CHAIN_END) {
+ uint16_t nchunk = zap_leaf_chunk_alloc(nl);
+ struct zap_leaf_array *nla =
+ &ZAP_LEAF_CHUNK(nl, nchunk).l_array;
+ struct zap_leaf_array *la =
+ &ZAP_LEAF_CHUNK(l, chunk).l_array;
+ int nextchunk = la->la_next;
+
+ ASSERT3U(chunk, <, ZAP_LEAF_NUMCHUNKS(l));
+ ASSERT3U(nchunk, <, ZAP_LEAF_NUMCHUNKS(l));
+
+ *nla = *la; /* structure assignment */
+
+ zap_leaf_chunk_free(l, chunk);
+ chunk = nextchunk;
+ *nchunkp = nchunk;
+ nchunkp = &nla->la_next;
+ }
+ *nchunkp = CHAIN_END;
+ return (new_chunk);
+}
+
+static void
+zap_leaf_transfer_entry(zap_leaf_t *l, int entry, zap_leaf_t *nl)
+{
+ struct zap_leaf_entry *le, *nle;
+ uint16_t chunk;
+
+ le = ZAP_LEAF_ENTRY(l, entry);
+ ASSERT3U(le->le_type, ==, ZAP_CHUNK_ENTRY);
+
+ chunk = zap_leaf_chunk_alloc(nl);
+ nle = ZAP_LEAF_ENTRY(nl, chunk);
+ *nle = *le; /* structure assignment */
+
+ zap_leaf_rehash_entry(nl, chunk);
+
+ nle->le_name_chunk = zap_leaf_transfer_array(l, le->le_name_chunk, nl);
+ nle->le_value_chunk =
+ zap_leaf_transfer_array(l, le->le_value_chunk, nl);
+
+ zap_leaf_chunk_free(l, entry);
+
+ l->l_phys->l_hdr.lh_nentries--;
+ nl->l_phys->l_hdr.lh_nentries++;
+}
+
+/*
+ * Transfer the entries whose hash prefix ends in 1 to the new leaf.
+ */
+void
+zap_leaf_split(zap_leaf_t *l, zap_leaf_t *nl)
+{
+ int i;
+ int bit = 64 - 1 - l->l_phys->l_hdr.lh_prefix_len;
+
+ /* set new prefix and prefix_len */
+ l->l_phys->l_hdr.lh_prefix <<= 1;
+ l->l_phys->l_hdr.lh_prefix_len++;
+ nl->l_phys->l_hdr.lh_prefix = l->l_phys->l_hdr.lh_prefix | 1;
+ nl->l_phys->l_hdr.lh_prefix_len = l->l_phys->l_hdr.lh_prefix_len;
+
+ /* break existing hash chains */
+ zap_memset(l->l_phys->l_hash, CHAIN_END, 2*ZAP_LEAF_HASH_NUMENTRIES(l));
+
+ /*
+ * Transfer entries whose hash bit 'bit' is set to nl; rehash
+ * the remaining entries
+ *
+ * NB: We could find entries via the hashtable instead. That
+ * would be O(hashents+numents) rather than O(numblks+numents),
+ * but this accesses memory more sequentially, and when we're
+ * called, the block is usually pretty full.
+ */
+ for (i = 0; i < ZAP_LEAF_NUMCHUNKS(l); i++) {
+ struct zap_leaf_entry *le = ZAP_LEAF_ENTRY(l, i);
+ if (le->le_type != ZAP_CHUNK_ENTRY)
+ continue;
+
+ if (le->le_hash & (1ULL << bit))
+ zap_leaf_transfer_entry(l, i, nl);
+ else
+ zap_leaf_rehash_entry(l, i);
+ }
+}
+
+void
+zap_leaf_stats(zap_t *zap, zap_leaf_t *l, zap_stats_t *zs)
+{
+ int i, n;
+
+ n = zap->zap_f.zap_phys->zap_ptrtbl.zt_shift -
+ l->l_phys->l_hdr.lh_prefix_len;
+ n = MIN(n, ZAP_HISTOGRAM_SIZE-1);
+ zs->zs_leafs_with_2n_pointers[n]++;
+
+
+ n = l->l_phys->l_hdr.lh_nentries/5;
+ n = MIN(n, ZAP_HISTOGRAM_SIZE-1);
+ zs->zs_blocks_with_n5_entries[n]++;
+
+ n = ((1<<FZAP_BLOCK_SHIFT(zap)) -
+ l->l_phys->l_hdr.lh_nfree * (ZAP_LEAF_ARRAY_BYTES+1))*10 /
+ (1<<FZAP_BLOCK_SHIFT(zap));
+ n = MIN(n, ZAP_HISTOGRAM_SIZE-1);
+ zs->zs_blocks_n_tenths_full[n]++;
+
+ for (i = 0; i < ZAP_LEAF_HASH_NUMENTRIES(l); i++) {
+ int nentries = 0;
+ int chunk = l->l_phys->l_hash[i];
+
+ while (chunk != CHAIN_END) {
+ struct zap_leaf_entry *le =
+ ZAP_LEAF_ENTRY(l, chunk);
+
+ n = 1 + ZAP_LEAF_ARRAY_NCHUNKS(le->le_name_length) +
+ ZAP_LEAF_ARRAY_NCHUNKS(le->le_value_length *
+ le->le_int_size);
+ n = MIN(n, ZAP_HISTOGRAM_SIZE-1);
+ zs->zs_entries_using_n_chunks[n]++;
+
+ chunk = le->le_next;
+ nentries++;
+ }
+
+ n = nentries;
+ n = MIN(n, ZAP_HISTOGRAM_SIZE-1);
+ zs->zs_buckets_with_n_entries[n]++;
+ }
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c
new file mode 100644
index 0000000..9b7e23c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zap_micro.c
@@ -0,0 +1,855 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa.h>
+#include <sys/dmu.h>
+#include <sys/zfs_context.h>
+#include <sys/zap.h>
+#include <sys/refcount.h>
+#include <sys/zap_impl.h>
+#include <sys/zap_leaf.h>
+#include <sys/avl.h>
+
+
+static void mzap_upgrade(zap_t *zap, dmu_tx_t *tx);
+
+
+static void
+mzap_byteswap(mzap_phys_t *buf, size_t size)
+{
+ int i, max;
+ buf->mz_block_type = BSWAP_64(buf->mz_block_type);
+ buf->mz_salt = BSWAP_64(buf->mz_salt);
+ max = (size / MZAP_ENT_LEN) - 1;
+ for (i = 0; i < max; i++) {
+ buf->mz_chunk[i].mze_value =
+ BSWAP_64(buf->mz_chunk[i].mze_value);
+ buf->mz_chunk[i].mze_cd =
+ BSWAP_32(buf->mz_chunk[i].mze_cd);
+ }
+}
+
+void
+zap_byteswap(void *buf, size_t size)
+{
+ uint64_t block_type;
+
+ block_type = *(uint64_t *)buf;
+
+ if (block_type == ZBT_MICRO || block_type == BSWAP_64(ZBT_MICRO)) {
+ /* ASSERT(magic == ZAP_LEAF_MAGIC); */
+ mzap_byteswap(buf, size);
+ } else {
+ fzap_byteswap(buf, size);
+ }
+}
+
+static int
+mze_compare(const void *arg1, const void *arg2)
+{
+ const mzap_ent_t *mze1 = arg1;
+ const mzap_ent_t *mze2 = arg2;
+
+ if (mze1->mze_hash > mze2->mze_hash)
+ return (+1);
+ if (mze1->mze_hash < mze2->mze_hash)
+ return (-1);
+ if (mze1->mze_phys.mze_cd > mze2->mze_phys.mze_cd)
+ return (+1);
+ if (mze1->mze_phys.mze_cd < mze2->mze_phys.mze_cd)
+ return (-1);
+ return (0);
+}
+
+static void
+mze_insert(zap_t *zap, int chunkid, uint64_t hash, mzap_ent_phys_t *mzep)
+{
+ mzap_ent_t *mze;
+
+ ASSERT(zap->zap_ismicro);
+ ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
+ ASSERT(mzep->mze_cd < ZAP_MAXCD);
+ ASSERT3U(zap_hash(zap, mzep->mze_name), ==, hash);
+
+ mze = kmem_alloc(sizeof (mzap_ent_t), KM_SLEEP);
+ mze->mze_chunkid = chunkid;
+ mze->mze_hash = hash;
+ mze->mze_phys = *mzep;
+ avl_add(&zap->zap_m.zap_avl, mze);
+}
+
+static mzap_ent_t *
+mze_find(zap_t *zap, const char *name, uint64_t hash)
+{
+ mzap_ent_t mze_tofind;
+ mzap_ent_t *mze;
+ avl_index_t idx;
+ avl_tree_t *avl = &zap->zap_m.zap_avl;
+
+ ASSERT(zap->zap_ismicro);
+ ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
+ ASSERT3U(zap_hash(zap, name), ==, hash);
+
+ if (strlen(name) >= sizeof (mze_tofind.mze_phys.mze_name))
+ return (NULL);
+
+ mze_tofind.mze_hash = hash;
+ mze_tofind.mze_phys.mze_cd = 0;
+
+ mze = avl_find(avl, &mze_tofind, &idx);
+ if (mze == NULL)
+ mze = avl_nearest(avl, idx, AVL_AFTER);
+ for (; mze && mze->mze_hash == hash; mze = AVL_NEXT(avl, mze)) {
+ if (strcmp(name, mze->mze_phys.mze_name) == 0)
+ return (mze);
+ }
+ return (NULL);
+}
+
+static uint32_t
+mze_find_unused_cd(zap_t *zap, uint64_t hash)
+{
+ mzap_ent_t mze_tofind;
+ mzap_ent_t *mze;
+ avl_index_t idx;
+ avl_tree_t *avl = &zap->zap_m.zap_avl;
+ uint32_t cd;
+
+ ASSERT(zap->zap_ismicro);
+ ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
+
+ mze_tofind.mze_hash = hash;
+ mze_tofind.mze_phys.mze_cd = 0;
+
+ cd = 0;
+ for (mze = avl_find(avl, &mze_tofind, &idx);
+ mze && mze->mze_hash == hash; mze = AVL_NEXT(avl, mze)) {
+ if (mze->mze_phys.mze_cd != cd)
+ break;
+ cd++;
+ }
+
+ return (cd);
+}
+
+static void
+mze_remove(zap_t *zap, mzap_ent_t *mze)
+{
+ ASSERT(zap->zap_ismicro);
+ ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
+
+ avl_remove(&zap->zap_m.zap_avl, mze);
+ kmem_free(mze, sizeof (mzap_ent_t));
+}
+
+static void
+mze_destroy(zap_t *zap)
+{
+ mzap_ent_t *mze;
+ void *avlcookie = NULL;
+
+ while (mze = avl_destroy_nodes(&zap->zap_m.zap_avl, &avlcookie))
+ kmem_free(mze, sizeof (mzap_ent_t));
+ avl_destroy(&zap->zap_m.zap_avl);
+}
+
+static zap_t *
+mzap_open(objset_t *os, uint64_t obj, dmu_buf_t *db)
+{
+ zap_t *winner;
+ zap_t *zap;
+ int i;
+
+ ASSERT3U(MZAP_ENT_LEN, ==, sizeof (mzap_ent_phys_t));
+
+ zap = kmem_zalloc(sizeof (zap_t), KM_SLEEP);
+ rw_init(&zap->zap_rwlock, NULL, RW_DEFAULT, 0);
+ rw_enter(&zap->zap_rwlock, RW_WRITER);
+ zap->zap_objset = os;
+ zap->zap_object = obj;
+ zap->zap_dbuf = db;
+
+ if (((uint64_t *)db->db_data)[0] != ZBT_MICRO) {
+ mutex_init(&zap->zap_f.zap_num_entries_mtx, NULL,
+ MUTEX_DEFAULT, 0);
+ zap->zap_f.zap_block_shift = highbit(db->db_size) - 1;
+ } else {
+ zap->zap_ismicro = TRUE;
+ }
+
+ /*
+ * Make sure that zap_ismicro is set before we let others see
+ * it, because zap_lockdir() checks zap_ismicro without the lock
+ * held.
+ */
+ winner = dmu_buf_set_user(db, zap, &zap->zap_m.zap_phys, zap_evict);
+
+ if (winner != NULL) {
+ if (!zap->zap_ismicro)
+ mutex_destroy(&zap->zap_f.zap_num_entries_mtx);
+ kmem_free(zap, sizeof (zap_t));
+ return (winner);
+ }
+
+ if (zap->zap_ismicro) {
+ zap->zap_salt = zap->zap_m.zap_phys->mz_salt;
+ zap->zap_m.zap_num_chunks = db->db_size / MZAP_ENT_LEN - 1;
+ avl_create(&zap->zap_m.zap_avl, mze_compare,
+ sizeof (mzap_ent_t), offsetof(mzap_ent_t, mze_node));
+
+ for (i = 0; i < zap->zap_m.zap_num_chunks; i++) {
+ mzap_ent_phys_t *mze =
+ &zap->zap_m.zap_phys->mz_chunk[i];
+ if (mze->mze_name[0]) {
+ zap->zap_m.zap_num_entries++;
+ mze_insert(zap, i,
+ zap_hash(zap, mze->mze_name), mze);
+ }
+ }
+ } else {
+ zap->zap_salt = zap->zap_f.zap_phys->zap_salt;
+
+ ASSERT3U(sizeof (struct zap_leaf_header), ==,
+ 2*ZAP_LEAF_CHUNKSIZE);
+
+ /*
+ * The embedded pointer table should not overlap the
+ * other members.
+ */
+ ASSERT3P(&ZAP_EMBEDDED_PTRTBL_ENT(zap, 0), >,
+ &zap->zap_f.zap_phys->zap_salt);
+
+ /*
+ * The embedded pointer table should end at the end of
+ * the block
+ */
+ ASSERT3U((uintptr_t)&ZAP_EMBEDDED_PTRTBL_ENT(zap,
+ 1<<ZAP_EMBEDDED_PTRTBL_SHIFT(zap)) -
+ (uintptr_t)zap->zap_f.zap_phys, ==,
+ zap->zap_dbuf->db_size);
+ }
+ rw_exit(&zap->zap_rwlock);
+ return (zap);
+}
+
+int
+zap_lockdir(objset_t *os, uint64_t obj, dmu_tx_t *tx,
+ krw_t lti, int fatreader, zap_t **zapp)
+{
+ zap_t *zap;
+ dmu_buf_t *db;
+ krw_t lt;
+ int err;
+
+ *zapp = NULL;
+
+ err = dmu_buf_hold(os, obj, 0, NULL, &db);
+ if (err)
+ return (err);
+
+#ifdef ZFS_DEBUG
+ {
+ dmu_object_info_t doi;
+ dmu_object_info_from_db(db, &doi);
+ ASSERT(dmu_ot[doi.doi_type].ot_byteswap == zap_byteswap);
+ }
+#endif
+
+ zap = dmu_buf_get_user(db);
+ if (zap == NULL)
+ zap = mzap_open(os, obj, db);
+
+ /*
+ * We're checking zap_ismicro without the lock held, in order to
+ * tell what type of lock we want. Once we have some sort of
+ * lock, see if it really is the right type. In practice this
+ * can only be different if it was upgraded from micro to fat,
+ * and micro wanted WRITER but fat only needs READER.
+ */
+ lt = (!zap->zap_ismicro && fatreader) ? RW_READER : lti;
+ rw_enter(&zap->zap_rwlock, lt);
+ if (lt != ((!zap->zap_ismicro && fatreader) ? RW_READER : lti)) {
+ /* it was upgraded, now we only need reader */
+ ASSERT(lt == RW_WRITER);
+ ASSERT(RW_READER ==
+ (!zap->zap_ismicro && fatreader) ? RW_READER : lti);
+ rw_downgrade(&zap->zap_rwlock);
+ lt = RW_READER;
+ }
+
+ zap->zap_objset = os;
+
+ if (lt == RW_WRITER)
+ dmu_buf_will_dirty(db, tx);
+
+ ASSERT3P(zap->zap_dbuf, ==, db);
+
+ ASSERT(!zap->zap_ismicro ||
+ zap->zap_m.zap_num_entries <= zap->zap_m.zap_num_chunks);
+ if (zap->zap_ismicro && tx &&
+ zap->zap_m.zap_num_entries == zap->zap_m.zap_num_chunks) {
+ uint64_t newsz = db->db_size + SPA_MINBLOCKSIZE;
+ if (newsz > MZAP_MAX_BLKSZ) {
+ dprintf("upgrading obj %llu: num_entries=%u\n",
+ obj, zap->zap_m.zap_num_entries);
+ mzap_upgrade(zap, tx);
+ *zapp = zap;
+ return (0);
+ }
+ err = dmu_object_set_blocksize(os, obj, newsz, 0, tx);
+ ASSERT3U(err, ==, 0);
+ zap->zap_m.zap_num_chunks =
+ db->db_size / MZAP_ENT_LEN - 1;
+ }
+
+ *zapp = zap;
+ return (0);
+}
+
+void
+zap_unlockdir(zap_t *zap)
+{
+ rw_exit(&zap->zap_rwlock);
+ dmu_buf_rele(zap->zap_dbuf, NULL);
+}
+
+static void
+mzap_upgrade(zap_t *zap, dmu_tx_t *tx)
+{
+ mzap_phys_t *mzp;
+ int i, sz, nchunks, err;
+
+ ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
+
+ sz = zap->zap_dbuf->db_size;
+ mzp = kmem_alloc(sz, KM_SLEEP);
+ bcopy(zap->zap_dbuf->db_data, mzp, sz);
+ nchunks = zap->zap_m.zap_num_chunks;
+
+ err = dmu_object_set_blocksize(zap->zap_objset, zap->zap_object,
+ 1ULL << fzap_default_block_shift, 0, tx);
+ ASSERT(err == 0);
+
+ dprintf("upgrading obj=%llu with %u chunks\n",
+ zap->zap_object, nchunks);
+ mze_destroy(zap);
+
+ fzap_upgrade(zap, tx);
+
+ for (i = 0; i < nchunks; i++) {
+ int err;
+ mzap_ent_phys_t *mze = &mzp->mz_chunk[i];
+ if (mze->mze_name[0] == 0)
+ continue;
+ dprintf("adding %s=%llu\n",
+ mze->mze_name, mze->mze_value);
+ err = fzap_add_cd(zap,
+ mze->mze_name, 8, 1, &mze->mze_value,
+ mze->mze_cd, tx);
+ ASSERT3U(err, ==, 0);
+ }
+ kmem_free(mzp, sz);
+}
+
+uint64_t
+zap_hash(zap_t *zap, const char *name)
+{
+ const uint8_t *cp;
+ uint8_t c;
+ uint64_t crc = zap->zap_salt;
+
+ ASSERT(crc != 0);
+ ASSERT(zfs_crc64_table[128] == ZFS_CRC64_POLY);
+ for (cp = (const uint8_t *)name; (c = *cp) != '\0'; cp++)
+ crc = (crc >> 8) ^ zfs_crc64_table[(crc ^ c) & 0xFF];
+
+ /*
+ * Only use 28 bits, since we need 4 bits in the cookie for the
+ * collision differentiator. We MUST use the high bits, since
+ * those are the onces that we first pay attention to when
+ * chosing the bucket.
+ */
+ crc &= ~((1ULL << (64 - ZAP_HASHBITS)) - 1);
+
+ return (crc);
+}
+
+
+static void
+mzap_create_impl(objset_t *os, uint64_t obj, dmu_tx_t *tx)
+{
+ dmu_buf_t *db;
+ mzap_phys_t *zp;
+
+ VERIFY(0 == dmu_buf_hold(os, obj, 0, FTAG, &db));
+
+#ifdef ZFS_DEBUG
+ {
+ dmu_object_info_t doi;
+ dmu_object_info_from_db(db, &doi);
+ ASSERT(dmu_ot[doi.doi_type].ot_byteswap == zap_byteswap);
+ }
+#endif
+
+ dmu_buf_will_dirty(db, tx);
+ zp = db->db_data;
+ zp->mz_block_type = ZBT_MICRO;
+ zp->mz_salt = ((uintptr_t)db ^ (uintptr_t)tx ^ (obj << 1)) | 1ULL;
+ ASSERT(zp->mz_salt != 0);
+ dmu_buf_rele(db, FTAG);
+}
+
+int
+zap_create_claim(objset_t *os, uint64_t obj, dmu_object_type_t ot,
+ dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx)
+{
+ int err;
+
+ err = dmu_object_claim(os, obj, ot, 0, bonustype, bonuslen, tx);
+ if (err != 0)
+ return (err);
+ mzap_create_impl(os, obj, tx);
+ return (0);
+}
+
+uint64_t
+zap_create(objset_t *os, dmu_object_type_t ot,
+ dmu_object_type_t bonustype, int bonuslen, dmu_tx_t *tx)
+{
+ uint64_t obj = dmu_object_alloc(os, ot, 0, bonustype, bonuslen, tx);
+
+ mzap_create_impl(os, obj, tx);
+ return (obj);
+}
+
+int
+zap_destroy(objset_t *os, uint64_t zapobj, dmu_tx_t *tx)
+{
+ /*
+ * dmu_object_free will free the object number and free the
+ * data. Freeing the data will cause our pageout function to be
+ * called, which will destroy our data (zap_leaf_t's and zap_t).
+ */
+
+ return (dmu_object_free(os, zapobj, tx));
+}
+
+_NOTE(ARGSUSED(0))
+void
+zap_evict(dmu_buf_t *db, void *vzap)
+{
+ zap_t *zap = vzap;
+
+ rw_destroy(&zap->zap_rwlock);
+
+ if (zap->zap_ismicro)
+ mze_destroy(zap);
+ else
+ mutex_destroy(&zap->zap_f.zap_num_entries_mtx);
+
+ kmem_free(zap, sizeof (zap_t));
+}
+
+int
+zap_count(objset_t *os, uint64_t zapobj, uint64_t *count)
+{
+ zap_t *zap;
+ int err;
+
+ err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, &zap);
+ if (err)
+ return (err);
+ if (!zap->zap_ismicro) {
+ err = fzap_count(zap, count);
+ } else {
+ *count = zap->zap_m.zap_num_entries;
+ }
+ zap_unlockdir(zap);
+ return (err);
+}
+
+/*
+ * Routines for maniplulating attributes.
+ */
+
+int
+zap_lookup(objset_t *os, uint64_t zapobj, const char *name,
+ uint64_t integer_size, uint64_t num_integers, void *buf)
+{
+ zap_t *zap;
+ int err;
+ mzap_ent_t *mze;
+
+ err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, &zap);
+ if (err)
+ return (err);
+ if (!zap->zap_ismicro) {
+ err = fzap_lookup(zap, name,
+ integer_size, num_integers, buf);
+ } else {
+ mze = mze_find(zap, name, zap_hash(zap, name));
+ if (mze == NULL) {
+ err = ENOENT;
+ } else {
+ if (num_integers < 1)
+ err = EOVERFLOW;
+ else if (integer_size != 8)
+ err = EINVAL;
+ else
+ *(uint64_t *)buf = mze->mze_phys.mze_value;
+ }
+ }
+ zap_unlockdir(zap);
+ return (err);
+}
+
+int
+zap_length(objset_t *os, uint64_t zapobj, const char *name,
+ uint64_t *integer_size, uint64_t *num_integers)
+{
+ zap_t *zap;
+ int err;
+ mzap_ent_t *mze;
+
+ err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, &zap);
+ if (err)
+ return (err);
+ if (!zap->zap_ismicro) {
+ err = fzap_length(zap, name, integer_size, num_integers);
+ } else {
+ mze = mze_find(zap, name, zap_hash(zap, name));
+ if (mze == NULL) {
+ err = ENOENT;
+ } else {
+ if (integer_size)
+ *integer_size = 8;
+ if (num_integers)
+ *num_integers = 1;
+ }
+ }
+ zap_unlockdir(zap);
+ return (err);
+}
+
+static void
+mzap_addent(zap_t *zap, const char *name, uint64_t hash, uint64_t value)
+{
+ int i;
+ int start = zap->zap_m.zap_alloc_next;
+ uint32_t cd;
+
+ dprintf("obj=%llu %s=%llu\n", zap->zap_object, name, value);
+ ASSERT(RW_WRITE_HELD(&zap->zap_rwlock));
+
+#ifdef ZFS_DEBUG
+ for (i = 0; i < zap->zap_m.zap_num_chunks; i++) {
+ mzap_ent_phys_t *mze = &zap->zap_m.zap_phys->mz_chunk[i];
+ ASSERT(strcmp(name, mze->mze_name) != 0);
+ }
+#endif
+
+ cd = mze_find_unused_cd(zap, hash);
+ /* given the limited size of the microzap, this can't happen */
+ ASSERT(cd != ZAP_MAXCD);
+
+again:
+ for (i = start; i < zap->zap_m.zap_num_chunks; i++) {
+ mzap_ent_phys_t *mze = &zap->zap_m.zap_phys->mz_chunk[i];
+ if (mze->mze_name[0] == 0) {
+ mze->mze_value = value;
+ mze->mze_cd = cd;
+ (void) strcpy(mze->mze_name, name);
+ zap->zap_m.zap_num_entries++;
+ zap->zap_m.zap_alloc_next = i+1;
+ if (zap->zap_m.zap_alloc_next ==
+ zap->zap_m.zap_num_chunks)
+ zap->zap_m.zap_alloc_next = 0;
+ mze_insert(zap, i, hash, mze);
+ return;
+ }
+ }
+ if (start != 0) {
+ start = 0;
+ goto again;
+ }
+ ASSERT(!"out of entries!");
+}
+
+int
+zap_add(objset_t *os, uint64_t zapobj, const char *name,
+ int integer_size, uint64_t num_integers,
+ const void *val, dmu_tx_t *tx)
+{
+ zap_t *zap;
+ int err;
+ mzap_ent_t *mze;
+ const uint64_t *intval = val;
+ uint64_t hash;
+
+ err = zap_lockdir(os, zapobj, tx, RW_WRITER, TRUE, &zap);
+ if (err)
+ return (err);
+ if (!zap->zap_ismicro) {
+ err = fzap_add(zap, name, integer_size, num_integers, val, tx);
+ } else if (integer_size != 8 || num_integers != 1 ||
+ strlen(name) >= MZAP_NAME_LEN) {
+ dprintf("upgrading obj %llu: intsz=%u numint=%llu name=%s\n",
+ zapobj, integer_size, num_integers, name);
+ mzap_upgrade(zap, tx);
+ err = fzap_add(zap, name, integer_size, num_integers, val, tx);
+ } else {
+ hash = zap_hash(zap, name);
+ mze = mze_find(zap, name, hash);
+ if (mze != NULL) {
+ err = EEXIST;
+ } else {
+ mzap_addent(zap, name, hash, *intval);
+ }
+ }
+ zap_unlockdir(zap);
+ return (err);
+}
+
+int
+zap_update(objset_t *os, uint64_t zapobj, const char *name,
+ int integer_size, uint64_t num_integers, const void *val, dmu_tx_t *tx)
+{
+ zap_t *zap;
+ mzap_ent_t *mze;
+ const uint64_t *intval = val;
+ uint64_t hash;
+ int err;
+
+ err = zap_lockdir(os, zapobj, tx, RW_WRITER, TRUE, &zap);
+ if (err)
+ return (err);
+ ASSERT(RW_LOCK_HELD(&zap->zap_rwlock));
+ if (!zap->zap_ismicro) {
+ err = fzap_update(zap, name,
+ integer_size, num_integers, val, tx);
+ } else if (integer_size != 8 || num_integers != 1 ||
+ strlen(name) >= MZAP_NAME_LEN) {
+ dprintf("upgrading obj %llu: intsz=%u numint=%llu name=%s\n",
+ zapobj, integer_size, num_integers, name);
+ mzap_upgrade(zap, tx);
+ err = fzap_update(zap, name,
+ integer_size, num_integers, val, tx);
+ } else {
+ hash = zap_hash(zap, name);
+ mze = mze_find(zap, name, hash);
+ if (mze != NULL) {
+ mze->mze_phys.mze_value = *intval;
+ zap->zap_m.zap_phys->mz_chunk
+ [mze->mze_chunkid].mze_value = *intval;
+ } else {
+ mzap_addent(zap, name, hash, *intval);
+ }
+ }
+ zap_unlockdir(zap);
+ return (err);
+}
+
+int
+zap_remove(objset_t *os, uint64_t zapobj, const char *name, dmu_tx_t *tx)
+{
+ zap_t *zap;
+ int err;
+ mzap_ent_t *mze;
+
+ err = zap_lockdir(os, zapobj, tx, RW_WRITER, TRUE, &zap);
+ if (err)
+ return (err);
+ if (!zap->zap_ismicro) {
+ err = fzap_remove(zap, name, tx);
+ } else {
+ mze = mze_find(zap, name, zap_hash(zap, name));
+ if (mze == NULL) {
+ dprintf("fail: %s\n", name);
+ err = ENOENT;
+ } else {
+ dprintf("success: %s\n", name);
+ zap->zap_m.zap_num_entries--;
+ bzero(&zap->zap_m.zap_phys->mz_chunk[mze->mze_chunkid],
+ sizeof (mzap_ent_phys_t));
+ mze_remove(zap, mze);
+ }
+ }
+ zap_unlockdir(zap);
+ return (err);
+}
+
+
+/*
+ * Routines for iterating over the attributes.
+ */
+
+/*
+ * We want to keep the high 32 bits of the cursor zero if we can, so
+ * that 32-bit programs can access this. So use a small hash value so
+ * we can fit 4 bits of cd into the 32-bit cursor.
+ *
+ * [ 4 zero bits | 32-bit collision differentiator | 28-bit hash value ]
+ */
+void
+zap_cursor_init_serialized(zap_cursor_t *zc, objset_t *os, uint64_t zapobj,
+ uint64_t serialized)
+{
+ zc->zc_objset = os;
+ zc->zc_zap = NULL;
+ zc->zc_leaf = NULL;
+ zc->zc_zapobj = zapobj;
+ if (serialized == -1ULL) {
+ zc->zc_hash = -1ULL;
+ zc->zc_cd = 0;
+ } else {
+ zc->zc_hash = serialized << (64-ZAP_HASHBITS);
+ zc->zc_cd = serialized >> ZAP_HASHBITS;
+ if (zc->zc_cd >= ZAP_MAXCD) /* corrupt serialized */
+ zc->zc_cd = 0;
+ }
+}
+
+void
+zap_cursor_init(zap_cursor_t *zc, objset_t *os, uint64_t zapobj)
+{
+ zap_cursor_init_serialized(zc, os, zapobj, 0);
+}
+
+void
+zap_cursor_fini(zap_cursor_t *zc)
+{
+ if (zc->zc_zap) {
+ rw_enter(&zc->zc_zap->zap_rwlock, RW_READER);
+ zap_unlockdir(zc->zc_zap);
+ zc->zc_zap = NULL;
+ }
+ if (zc->zc_leaf) {
+ rw_enter(&zc->zc_leaf->l_rwlock, RW_READER);
+ zap_put_leaf(zc->zc_leaf);
+ zc->zc_leaf = NULL;
+ }
+ zc->zc_objset = NULL;
+}
+
+uint64_t
+zap_cursor_serialize(zap_cursor_t *zc)
+{
+ if (zc->zc_hash == -1ULL)
+ return (-1ULL);
+ ASSERT((zc->zc_hash & (ZAP_MAXCD-1)) == 0);
+ ASSERT(zc->zc_cd < ZAP_MAXCD);
+ return ((zc->zc_hash >> (64-ZAP_HASHBITS)) |
+ ((uint64_t)zc->zc_cd << ZAP_HASHBITS));
+}
+
+int
+zap_cursor_retrieve(zap_cursor_t *zc, zap_attribute_t *za)
+{
+ int err;
+ avl_index_t idx;
+ mzap_ent_t mze_tofind;
+ mzap_ent_t *mze;
+
+ if (zc->zc_hash == -1ULL)
+ return (ENOENT);
+
+ if (zc->zc_zap == NULL) {
+ err = zap_lockdir(zc->zc_objset, zc->zc_zapobj, NULL,
+ RW_READER, TRUE, &zc->zc_zap);
+ if (err)
+ return (err);
+ } else {
+ rw_enter(&zc->zc_zap->zap_rwlock, RW_READER);
+ }
+ if (!zc->zc_zap->zap_ismicro) {
+ err = fzap_cursor_retrieve(zc->zc_zap, zc, za);
+ } else {
+ err = ENOENT;
+
+ mze_tofind.mze_hash = zc->zc_hash;
+ mze_tofind.mze_phys.mze_cd = zc->zc_cd;
+
+ mze = avl_find(&zc->zc_zap->zap_m.zap_avl, &mze_tofind, &idx);
+ ASSERT(mze == NULL || 0 == bcmp(&mze->mze_phys,
+ &zc->zc_zap->zap_m.zap_phys->mz_chunk[mze->mze_chunkid],
+ sizeof (mze->mze_phys)));
+ if (mze == NULL) {
+ mze = avl_nearest(&zc->zc_zap->zap_m.zap_avl,
+ idx, AVL_AFTER);
+ }
+ if (mze) {
+ za->za_integer_length = 8;
+ za->za_num_integers = 1;
+ za->za_first_integer = mze->mze_phys.mze_value;
+ (void) strcpy(za->za_name, mze->mze_phys.mze_name);
+ zc->zc_hash = mze->mze_hash;
+ zc->zc_cd = mze->mze_phys.mze_cd;
+ err = 0;
+ } else {
+ zc->zc_hash = -1ULL;
+ }
+ }
+ rw_exit(&zc->zc_zap->zap_rwlock);
+ return (err);
+}
+
+void
+zap_cursor_advance(zap_cursor_t *zc)
+{
+ if (zc->zc_hash == -1ULL)
+ return;
+ zc->zc_cd++;
+ if (zc->zc_cd >= ZAP_MAXCD) {
+ zc->zc_cd = 0;
+ zc->zc_hash += 1ULL<<(64-ZAP_HASHBITS);
+ if (zc->zc_hash == 0) /* EOF */
+ zc->zc_hash = -1ULL;
+ }
+}
+
+int
+zap_get_stats(objset_t *os, uint64_t zapobj, zap_stats_t *zs)
+{
+ int err;
+ zap_t *zap;
+
+ err = zap_lockdir(os, zapobj, NULL, RW_READER, TRUE, &zap);
+ if (err)
+ return (err);
+
+ bzero(zs, sizeof (zap_stats_t));
+
+ if (zap->zap_ismicro) {
+ zs->zs_blocksize = zap->zap_dbuf->db_size;
+ zs->zs_num_entries = zap->zap_m.zap_num_entries;
+ zs->zs_num_blocks = 1;
+ } else {
+ fzap_get_stats(zap, zs);
+ }
+ zap_unlockdir(zap);
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs.conf b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs.conf
new file mode 100644
index 0000000..0988190
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs.conf
@@ -0,0 +1,28 @@
+#
+# CDDL HEADER START
+#
+# The contents of this file are subject to the terms of the
+# Common Development and Distribution License, Version 1.0 only
+# (the "License"). You may not use this file except in compliance
+# with the License.
+#
+# You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+# or http://www.opensolaris.org/os/licensing.
+# See the License for the specific language governing permissions
+# and limitations under the License.
+#
+# When distributing Covered Code, include this CDDL HEADER in each
+# file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+# If applicable, add the following below this CDDL HEADER, with the
+# fields enclosed by brackets "[]" replaced with your own identifying
+# information: Portions Copyright [yyyy] [name of copyright owner]
+#
+# CDDL HEADER END
+#
+#
+# Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+# Use is subject to license terms.
+#
+# ident "%Z%%M% %I% %E% SMI"
+#
+name="zfs" parent="pseudo";
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
new file mode 100644
index 0000000..dd94618
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_acl.c
@@ -0,0 +1,1608 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/systm.h>
+#include <sys/sysmacros.h>
+#include <sys/resource.h>
+#include <sys/vfs.h>
+#include <sys/vnode.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/kmem.h>
+#include <sys/cmn_err.h>
+#include <sys/errno.h>
+#include <sys/unistd.h>
+#include <sys/sdt.h>
+#include <sys/fs/zfs.h>
+#include <sys/policy.h>
+#include <sys/zfs_znode.h>
+#include <sys/zfs_acl.h>
+#include <sys/zfs_dir.h>
+#include <sys/zfs_vfsops.h>
+#include <sys/dmu.h>
+#include <sys/zap.h>
+#include <acl/acl_common.h>
+
+#define ALLOW ACE_ACCESS_ALLOWED_ACE_TYPE
+#define DENY ACE_ACCESS_DENIED_ACE_TYPE
+
+#define OWNING_GROUP (ACE_GROUP|ACE_IDENTIFIER_GROUP)
+#define EVERYONE_ALLOW_MASK (ACE_READ_ACL|ACE_READ_ATTRIBUTES | \
+ ACE_READ_NAMED_ATTRS|ACE_SYNCHRONIZE)
+#define EVERYONE_DENY_MASK (ACE_WRITE_ACL|ACE_WRITE_OWNER | \
+ ACE_WRITE_ATTRIBUTES|ACE_WRITE_NAMED_ATTRS)
+#define OWNER_ALLOW_MASK (ACE_WRITE_ACL | ACE_WRITE_OWNER | \
+ ACE_WRITE_ATTRIBUTES|ACE_WRITE_NAMED_ATTRS)
+#define WRITE_MASK (ACE_WRITE_DATA|ACE_APPEND_DATA|ACE_WRITE_NAMED_ATTRS| \
+ ACE_WRITE_ATTRIBUTES|ACE_WRITE_ACL|ACE_WRITE_OWNER)
+
+#define OGE_CLEAR (ACE_READ_DATA|ACE_LIST_DIRECTORY|ACE_WRITE_DATA| \
+ ACE_ADD_FILE|ACE_APPEND_DATA|ACE_ADD_SUBDIRECTORY|ACE_EXECUTE)
+
+#define OKAY_MASK_BITS (ACE_READ_DATA|ACE_LIST_DIRECTORY|ACE_WRITE_DATA| \
+ ACE_ADD_FILE|ACE_APPEND_DATA|ACE_ADD_SUBDIRECTORY|ACE_EXECUTE)
+
+#define ALL_INHERIT (ACE_FILE_INHERIT_ACE|ACE_DIRECTORY_INHERIT_ACE | \
+ ACE_NO_PROPAGATE_INHERIT_ACE|ACE_INHERIT_ONLY_ACE)
+
+#define SECURE_CLEAR (ACE_WRITE_ACL|ACE_WRITE_OWNER)
+
+#define OGE_PAD 6 /* traditional owner/group/everyone ACES */
+
+static int zfs_ace_can_use(znode_t *zp, ace_t *);
+
+static zfs_acl_t *
+zfs_acl_alloc(int slots)
+{
+ zfs_acl_t *aclp;
+
+ aclp = kmem_zalloc(sizeof (zfs_acl_t), KM_SLEEP);
+ if (slots != 0) {
+ aclp->z_acl = kmem_alloc(ZFS_ACL_SIZE(slots), KM_SLEEP);
+ aclp->z_acl_count = 0;
+ aclp->z_state = ACL_DATA_ALLOCED;
+ } else {
+ aclp->z_state = 0;
+ }
+ aclp->z_slots = slots;
+ return (aclp);
+}
+
+void
+zfs_acl_free(zfs_acl_t *aclp)
+{
+ if (aclp->z_state == ACL_DATA_ALLOCED) {
+ kmem_free(aclp->z_acl, ZFS_ACL_SIZE(aclp->z_slots));
+ }
+ kmem_free(aclp, sizeof (zfs_acl_t));
+}
+
+static uint32_t
+zfs_v4_to_unix(uint32_t access_mask)
+{
+ uint32_t new_mask = 0;
+
+ /*
+ * This is used for mapping v4 permissions into permissions
+ * that can be passed to secpolicy_vnode_access()
+ */
+ if (access_mask & (ACE_READ_DATA | ACE_LIST_DIRECTORY |
+ ACE_READ_ATTRIBUTES | ACE_READ_ACL))
+ new_mask |= S_IROTH;
+ if (access_mask & (ACE_WRITE_DATA | ACE_APPEND_DATA |
+ ACE_WRITE_ATTRIBUTES | ACE_ADD_FILE | ACE_WRITE_NAMED_ATTRS))
+ new_mask |= S_IWOTH;
+ if (access_mask & (ACE_EXECUTE | ACE_READ_NAMED_ATTRS))
+ new_mask |= S_IXOTH;
+
+ return (new_mask);
+}
+
+/*
+ * Convert unix access mask to v4 access mask
+ */
+static uint32_t
+zfs_unix_to_v4(uint32_t access_mask)
+{
+ uint32_t new_mask = 0;
+
+ if (access_mask & 01)
+ new_mask |= (ACE_EXECUTE);
+ if (access_mask & 02) {
+ new_mask |= (ACE_WRITE_DATA);
+ } if (access_mask & 04) {
+ new_mask |= ACE_READ_DATA;
+ }
+ return (new_mask);
+}
+
+static void
+zfs_set_ace(ace_t *zacep, uint32_t access_mask, int access_type,
+ uid_t uid, int entry_type)
+{
+ zacep->a_access_mask = access_mask;
+ zacep->a_type = access_type;
+ zacep->a_who = uid;
+ zacep->a_flags = entry_type;
+}
+
+static uint64_t
+zfs_mode_compute(znode_t *zp, zfs_acl_t *aclp)
+{
+ int i;
+ int entry_type;
+ mode_t mode = (zp->z_phys->zp_mode &
+ (S_IFMT | S_ISUID | S_ISGID | S_ISVTX));
+ mode_t seen = 0;
+ ace_t *acep;
+
+ for (i = 0, acep = aclp->z_acl;
+ i != aclp->z_acl_count; i++, acep++) {
+ entry_type = (acep->a_flags & ACE_TYPE_FLAGS);
+ if (entry_type == ACE_OWNER) {
+ if ((acep->a_access_mask & ACE_READ_DATA) &&
+ (!(seen & S_IRUSR))) {
+ seen |= S_IRUSR;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IRUSR;
+ }
+ }
+ if ((acep->a_access_mask & ACE_WRITE_DATA) &&
+ (!(seen & S_IWUSR))) {
+ seen |= S_IWUSR;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IWUSR;
+ }
+ }
+ if ((acep->a_access_mask & ACE_EXECUTE) &&
+ (!(seen & S_IXUSR))) {
+ seen |= S_IXUSR;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IXUSR;
+ }
+ }
+ } else if (entry_type == OWNING_GROUP) {
+ if ((acep->a_access_mask & ACE_READ_DATA) &&
+ (!(seen & S_IRGRP))) {
+ seen |= S_IRGRP;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IRGRP;
+ }
+ }
+ if ((acep->a_access_mask & ACE_WRITE_DATA) &&
+ (!(seen & S_IWGRP))) {
+ seen |= S_IWGRP;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IWGRP;
+ }
+ }
+ if ((acep->a_access_mask & ACE_EXECUTE) &&
+ (!(seen & S_IXGRP))) {
+ seen |= S_IXGRP;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IXGRP;
+ }
+ }
+ } else if (entry_type == ACE_EVERYONE) {
+ if ((acep->a_access_mask & ACE_READ_DATA)) {
+ if (!(seen & S_IRUSR)) {
+ seen |= S_IRUSR;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IRUSR;
+ }
+ }
+ if (!(seen & S_IRGRP)) {
+ seen |= S_IRGRP;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IRGRP;
+ }
+ }
+ if (!(seen & S_IROTH)) {
+ seen |= S_IROTH;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IROTH;
+ }
+ }
+ }
+ if ((acep->a_access_mask & ACE_WRITE_DATA)) {
+ if (!(seen & S_IWUSR)) {
+ seen |= S_IWUSR;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IWUSR;
+ }
+ }
+ if (!(seen & S_IWGRP)) {
+ seen |= S_IWGRP;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IWGRP;
+ }
+ }
+ if (!(seen & S_IWOTH)) {
+ seen |= S_IWOTH;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IWOTH;
+ }
+ }
+ }
+ if ((acep->a_access_mask & ACE_EXECUTE)) {
+ if (!(seen & S_IXUSR)) {
+ seen |= S_IXUSR;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IXUSR;
+ }
+ }
+ if (!(seen & S_IXGRP)) {
+ seen |= S_IXGRP;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IXGRP;
+ }
+ }
+ if (!(seen & S_IXOTH)) {
+ seen |= S_IXOTH;
+ if (acep->a_type == ALLOW) {
+ mode |= S_IXOTH;
+ }
+ }
+ }
+ }
+ }
+ return (mode);
+}
+
+static zfs_acl_t *
+zfs_acl_node_read_internal(znode_t *zp)
+{
+ zfs_acl_t *aclp;
+
+ aclp = zfs_acl_alloc(0);
+ aclp->z_acl_count = zp->z_phys->zp_acl.z_acl_count;
+ aclp->z_acl = &zp->z_phys->zp_acl.z_ace_data[0];
+
+ return (aclp);
+}
+
+/*
+ * Read an external acl object.
+ */
+static int
+zfs_acl_node_read(znode_t *zp, zfs_acl_t **aclpp)
+{
+ uint64_t extacl = zp->z_phys->zp_acl.z_acl_extern_obj;
+ zfs_acl_t *aclp;
+ int error;
+
+ ASSERT(MUTEX_HELD(&zp->z_acl_lock));
+
+ if (zp->z_phys->zp_acl.z_acl_extern_obj == 0) {
+ *aclpp = zfs_acl_node_read_internal(zp);
+ return (0);
+ }
+
+ aclp = zfs_acl_alloc(zp->z_phys->zp_acl.z_acl_count);
+
+ error = dmu_read(zp->z_zfsvfs->z_os, extacl, 0,
+ ZFS_ACL_SIZE(zp->z_phys->zp_acl.z_acl_count), aclp->z_acl);
+ if (error != 0) {
+ zfs_acl_free(aclp);
+ return (error);
+ }
+
+ aclp->z_acl_count = zp->z_phys->zp_acl.z_acl_count;
+
+ *aclpp = aclp;
+ return (0);
+}
+
+static boolean_t
+zfs_acl_valid(znode_t *zp, ace_t *uace, int aclcnt, int *inherit)
+{
+ ace_t *acep;
+ int i;
+
+ *inherit = 0;
+
+ if (aclcnt > MAX_ACL_ENTRIES || aclcnt <= 0) {
+ return (B_FALSE);
+ }
+
+ for (i = 0, acep = uace; i != aclcnt; i++, acep++) {
+
+ /*
+ * first check type of entry
+ */
+
+ switch (acep->a_flags & ACE_TYPE_FLAGS) {
+ case ACE_OWNER:
+ acep->a_who = -1;
+ break;
+ case (ACE_IDENTIFIER_GROUP | ACE_GROUP):
+ case ACE_IDENTIFIER_GROUP:
+ if (acep->a_flags & ACE_GROUP) {
+ acep->a_who = -1;
+ }
+ break;
+ case ACE_EVERYONE:
+ acep->a_who = -1;
+ break;
+ }
+
+ /*
+ * next check inheritance level flags
+ */
+
+ if (acep->a_type != ALLOW && acep->a_type != DENY)
+ return (B_FALSE);
+
+ /*
+ * Only directories should have inheritance flags.
+ */
+ if (ZTOV(zp)->v_type != VDIR && (acep->a_flags &
+ (ACE_FILE_INHERIT_ACE|ACE_DIRECTORY_INHERIT_ACE|
+ ACE_INHERIT_ONLY_ACE|ACE_NO_PROPAGATE_INHERIT_ACE))) {
+ return (B_FALSE);
+ }
+
+ if (acep->a_flags &
+ (ACE_FILE_INHERIT_ACE|ACE_DIRECTORY_INHERIT_ACE))
+ *inherit = 1;
+
+ if (acep->a_flags &
+ (ACE_INHERIT_ONLY_ACE|ACE_NO_PROPAGATE_INHERIT_ACE)) {
+ if ((acep->a_flags & (ACE_FILE_INHERIT_ACE|
+ ACE_DIRECTORY_INHERIT_ACE)) == 0) {
+ return (B_FALSE);
+ }
+ }
+ }
+
+ return (B_TRUE);
+}
+/*
+ * common code for setting acl's.
+ *
+ * This function is called from zfs_mode_update, zfs_perm_init, and zfs_setacl.
+ * zfs_setacl passes a non-NULL inherit pointer (ihp) to indicate that it's
+ * already checked the acl and knows whether to inherit.
+ */
+int
+zfs_aclset_common(znode_t *zp, zfs_acl_t *aclp, dmu_tx_t *tx, int *ihp)
+{
+ int inherit = 0;
+ int error;
+ znode_phys_t *zphys = zp->z_phys;
+ zfs_znode_acl_t *zacl = &zphys->zp_acl;
+ uint32_t acl_phys_size = ZFS_ACL_SIZE(aclp->z_acl_count);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ uint64_t aoid = zphys->zp_acl.z_acl_extern_obj;
+
+ ASSERT(MUTEX_HELD(&zp->z_lock));
+ ASSERT(MUTEX_HELD(&zp->z_acl_lock));
+
+ if (ihp)
+ inherit = *ihp; /* already determined by caller */
+ else if (!zfs_acl_valid(zp, aclp->z_acl,
+ aclp->z_acl_count, &inherit)) {
+ return (EINVAL);
+ }
+
+ dmu_buf_will_dirty(zp->z_dbuf, tx);
+
+ /*
+ * Will ACL fit internally?
+ */
+ if (aclp->z_acl_count > ACE_SLOT_CNT) {
+ if (aoid == 0) {
+ aoid = dmu_object_alloc(zfsvfs->z_os,
+ DMU_OT_ACL, acl_phys_size, DMU_OT_NONE, 0, tx);
+ } else {
+ (void) dmu_object_set_blocksize(zfsvfs->z_os, aoid,
+ acl_phys_size, 0, tx);
+ }
+ zphys->zp_acl.z_acl_extern_obj = aoid;
+ zphys->zp_acl.z_acl_count = aclp->z_acl_count;
+ dmu_write(zfsvfs->z_os, aoid, 0,
+ acl_phys_size, aclp->z_acl, tx);
+ } else {
+ /*
+ * Migrating back embedded?
+ */
+ if (zphys->zp_acl.z_acl_extern_obj) {
+ error = dmu_object_free(zfsvfs->z_os,
+ zp->z_phys->zp_acl.z_acl_extern_obj, tx);
+ if (error)
+ return (error);
+ zphys->zp_acl.z_acl_extern_obj = 0;
+ }
+ bcopy(aclp->z_acl, zacl->z_ace_data,
+ aclp->z_acl_count * sizeof (ace_t));
+ zacl->z_acl_count = aclp->z_acl_count;
+ }
+
+ zp->z_phys->zp_flags &= ~(ZFS_ACL_TRIVIAL|ZFS_INHERIT_ACE);
+ if (inherit) {
+ zp->z_phys->zp_flags |= ZFS_INHERIT_ACE;
+ } else if (ace_trivial(zacl->z_ace_data, zacl->z_acl_count) == 0) {
+ zp->z_phys->zp_flags |= ZFS_ACL_TRIVIAL;
+ }
+
+ zphys->zp_mode = zfs_mode_compute(zp, aclp);
+ zfs_time_stamper_locked(zp, STATE_CHANGED, tx);
+
+ return (0);
+}
+
+/*
+ * Create space for slots_needed ACEs to be append
+ * to aclp.
+ */
+static void
+zfs_acl_append(zfs_acl_t *aclp, int slots_needed)
+{
+ ace_t *newacep;
+ ace_t *oldaclp;
+ int slot_cnt;
+ int slots_left = aclp->z_slots - aclp->z_acl_count;
+
+ if (aclp->z_state == ACL_DATA_ALLOCED)
+ ASSERT(aclp->z_slots >= aclp->z_acl_count);
+ if (slots_left < slots_needed || aclp->z_state != ACL_DATA_ALLOCED) {
+ slot_cnt = aclp->z_slots + 1 + (slots_needed - slots_left);
+ newacep = kmem_alloc(ZFS_ACL_SIZE(slot_cnt), KM_SLEEP);
+ bcopy(aclp->z_acl, newacep,
+ ZFS_ACL_SIZE(aclp->z_acl_count));
+ oldaclp = aclp->z_acl;
+ if (aclp->z_state == ACL_DATA_ALLOCED)
+ kmem_free(oldaclp, ZFS_ACL_SIZE(aclp->z_slots));
+ aclp->z_acl = newacep;
+ aclp->z_slots = slot_cnt;
+ aclp->z_state = ACL_DATA_ALLOCED;
+ }
+}
+
+/*
+ * Remove "slot" ACE from aclp
+ */
+static void
+zfs_ace_remove(zfs_acl_t *aclp, int slot)
+{
+ if (aclp->z_acl_count > 1) {
+ (void) memmove(&aclp->z_acl[slot],
+ &aclp->z_acl[slot +1], sizeof (ace_t) *
+ (--aclp->z_acl_count - slot));
+ } else
+ aclp->z_acl_count--;
+}
+
+/*
+ * Update access mask for prepended ACE
+ *
+ * This applies the "groupmask" value for aclmode property.
+ */
+static void
+zfs_acl_prepend_fixup(ace_t *acep, ace_t *origacep, mode_t mode, uid_t owner)
+{
+
+ int rmask, wmask, xmask;
+ int user_ace;
+
+ user_ace = (!(acep->a_flags &
+ (ACE_OWNER|ACE_GROUP|ACE_IDENTIFIER_GROUP)));
+
+ if (user_ace && (acep->a_who == owner)) {
+ rmask = S_IRUSR;
+ wmask = S_IWUSR;
+ xmask = S_IXUSR;
+ } else {
+ rmask = S_IRGRP;
+ wmask = S_IWGRP;
+ xmask = S_IXGRP;
+ }
+
+ if (origacep->a_access_mask & ACE_READ_DATA) {
+ if (mode & rmask)
+ acep->a_access_mask &= ~ACE_READ_DATA;
+ else
+ acep->a_access_mask |= ACE_READ_DATA;
+ }
+
+ if (origacep->a_access_mask & ACE_WRITE_DATA) {
+ if (mode & wmask)
+ acep->a_access_mask &= ~ACE_WRITE_DATA;
+ else
+ acep->a_access_mask |= ACE_WRITE_DATA;
+ }
+
+ if (origacep->a_access_mask & ACE_APPEND_DATA) {
+ if (mode & wmask)
+ acep->a_access_mask &= ~ACE_APPEND_DATA;
+ else
+ acep->a_access_mask |= ACE_APPEND_DATA;
+ }
+
+ if (origacep->a_access_mask & ACE_EXECUTE) {
+ if (mode & xmask)
+ acep->a_access_mask &= ~ACE_EXECUTE;
+ else
+ acep->a_access_mask |= ACE_EXECUTE;
+ }
+}
+
+/*
+ * Apply mode to canonical six ACEs.
+ */
+static void
+zfs_acl_fixup_canonical_six(zfs_acl_t *aclp, mode_t mode)
+{
+ int cnt;
+ ace_t *acep;
+
+ cnt = aclp->z_acl_count -1;
+ acep = aclp->z_acl;
+
+ /*
+ * Fixup final ACEs to match the mode
+ */
+
+ ASSERT(cnt >= 5);
+ adjust_ace_pair(&acep[cnt - 1], mode); /* everyone@ */
+ adjust_ace_pair(&acep[cnt - 3], (mode & 0070) >> 3); /* group@ */
+ adjust_ace_pair(&acep[cnt - 5], (mode & 0700) >> 6); /* owner@ */
+}
+
+
+static int
+zfs_acl_ace_match(ace_t *acep, int allow_deny, int type, int mask)
+{
+ return (acep->a_access_mask == mask && acep->a_type == allow_deny &&
+ ((acep->a_flags & ACE_TYPE_FLAGS) == type));
+}
+
+/*
+ * Can prepended ACE be reused?
+ */
+static int
+zfs_reuse_deny(ace_t *acep, int i)
+{
+ int okay_masks;
+
+ if (i < 1)
+ return (B_FALSE);
+
+ if (acep[i-1].a_type != DENY)
+ return (B_FALSE);
+
+ if (acep[i-1].a_flags != (acep[i].a_flags & ACE_IDENTIFIER_GROUP))
+ return (B_FALSE);
+
+ okay_masks = (acep[i].a_access_mask & OKAY_MASK_BITS);
+
+ if (acep[i-1].a_access_mask & ~okay_masks)
+ return (B_FALSE);
+
+ return (B_TRUE);
+}
+
+/*
+ * Create space to prepend an ACE
+ */
+static void
+zfs_acl_prepend(zfs_acl_t *aclp, int i)
+{
+ ace_t *oldaclp = NULL;
+ ace_t *to, *from;
+ int slots_left = aclp->z_slots - aclp->z_acl_count;
+ int oldslots;
+ int need_free = 0;
+
+ if (aclp->z_state == ACL_DATA_ALLOCED)
+ ASSERT(aclp->z_slots >= aclp->z_acl_count);
+
+ if (slots_left == 0 || aclp->z_state != ACL_DATA_ALLOCED) {
+
+ to = kmem_alloc(ZFS_ACL_SIZE(aclp->z_acl_count +
+ OGE_PAD), KM_SLEEP);
+ if (aclp->z_state == ACL_DATA_ALLOCED)
+ need_free++;
+ from = aclp->z_acl;
+ oldaclp = aclp->z_acl;
+ (void) memmove(to, from,
+ sizeof (ace_t) * aclp->z_acl_count);
+ aclp->z_state = ACL_DATA_ALLOCED;
+ } else {
+ from = aclp->z_acl;
+ to = aclp->z_acl;
+ }
+
+
+ (void) memmove(&to[i + 1], &from[i],
+ sizeof (ace_t) * (aclp->z_acl_count - i));
+
+ if (oldaclp) {
+ aclp->z_acl = to;
+ oldslots = aclp->z_slots;
+ aclp->z_slots = aclp->z_acl_count + OGE_PAD;
+ if (need_free)
+ kmem_free(oldaclp, ZFS_ACL_SIZE(oldslots));
+ }
+
+}
+
+/*
+ * Prepend deny ACE
+ */
+static void
+zfs_acl_prepend_deny(znode_t *zp, zfs_acl_t *aclp, int i,
+ mode_t mode)
+{
+ ace_t *acep;
+
+ zfs_acl_prepend(aclp, i);
+
+ acep = aclp->z_acl;
+ zfs_set_ace(&acep[i], 0, DENY, acep[i + 1].a_who,
+ (acep[i + 1].a_flags & ACE_TYPE_FLAGS));
+ zfs_acl_prepend_fixup(&acep[i], &acep[i+1], mode, zp->z_phys->zp_uid);
+ aclp->z_acl_count++;
+}
+
+/*
+ * Split an inherited ACE into inherit_only ACE
+ * and original ACE with inheritance flags stripped off.
+ */
+static void
+zfs_acl_split_ace(zfs_acl_t *aclp, int i)
+{
+ ace_t *acep = aclp->z_acl;
+
+ zfs_acl_prepend(aclp, i);
+ acep = aclp->z_acl;
+ acep[i] = acep[i + 1];
+ acep[i].a_flags |= ACE_INHERIT_ONLY_ACE;
+ acep[i + 1].a_flags &= ~ALL_INHERIT;
+ aclp->z_acl_count++;
+}
+
+/*
+ * Are ACES started at index i, the canonical six ACES?
+ */
+static int
+zfs_have_canonical_six(zfs_acl_t *aclp, int i)
+{
+ ace_t *acep = aclp->z_acl;
+
+ if ((zfs_acl_ace_match(&acep[i],
+ DENY, ACE_OWNER, 0) &&
+ zfs_acl_ace_match(&acep[i + 1], ALLOW, ACE_OWNER,
+ OWNER_ALLOW_MASK) && zfs_acl_ace_match(&acep[i + 2],
+ DENY, OWNING_GROUP, 0) && zfs_acl_ace_match(&acep[i + 3],
+ ALLOW, OWNING_GROUP, 0) && zfs_acl_ace_match(&acep[i + 4],
+ DENY, ACE_EVERYONE, EVERYONE_DENY_MASK) &&
+ zfs_acl_ace_match(&acep[i + 5], ALLOW, ACE_EVERYONE,
+ EVERYONE_ALLOW_MASK))) {
+ return (1);
+ } else {
+ return (0);
+ }
+}
+
+/*
+ * Apply step 1g, to group entries
+ *
+ * Need to deal with corner case where group may have
+ * greater permissions than owner. If so then limit
+ * group permissions, based on what extra permissions
+ * group has.
+ */
+static void
+zfs_fixup_group_entries(ace_t *acep, mode_t mode)
+{
+ mode_t extramode = (mode >> 3) & 07;
+ mode_t ownermode = (mode >> 6);
+
+ if (acep[0].a_flags & ACE_IDENTIFIER_GROUP) {
+
+ extramode &= ~ownermode;
+
+ if (extramode) {
+ if (extramode & 04) {
+ acep[0].a_access_mask &= ~ACE_READ_DATA;
+ acep[1].a_access_mask &= ~ACE_READ_DATA;
+ }
+ if (extramode & 02) {
+ acep[0].a_access_mask &=
+ ~(ACE_WRITE_DATA|ACE_APPEND_DATA);
+ acep[1].a_access_mask &=
+ ~(ACE_WRITE_DATA|ACE_APPEND_DATA);
+ }
+ if (extramode & 01) {
+ acep[0].a_access_mask &= ~ACE_EXECUTE;
+ acep[1].a_access_mask &= ~ACE_EXECUTE;
+ }
+ }
+ }
+}
+
+/*
+ * Apply the chmod algorithm as described
+ * in PSARC/2002/240
+ */
+static int
+zfs_acl_chmod(znode_t *zp, uint64_t mode, zfs_acl_t *aclp,
+ dmu_tx_t *tx)
+{
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ ace_t *acep;
+ int i;
+ int error;
+ int entry_type;
+ int reuse_deny;
+ int need_canonical_six = 1;
+ int inherit = 0;
+ int iflags;
+
+ ASSERT(MUTEX_HELD(&zp->z_acl_lock));
+ ASSERT(MUTEX_HELD(&zp->z_lock));
+
+ i = 0;
+ while (i < aclp->z_acl_count) {
+ acep = aclp->z_acl;
+ entry_type = (acep[i].a_flags & ACE_TYPE_FLAGS);
+ iflags = (acep[i].a_flags & ALL_INHERIT);
+
+ if ((acep[i].a_type != ALLOW && acep[i].a_type != DENY) ||
+ (iflags & ACE_INHERIT_ONLY_ACE)) {
+ i++;
+ if (iflags)
+ inherit = 1;
+ continue;
+ }
+
+
+ if (zfsvfs->z_acl_mode == ZFS_ACL_DISCARD) {
+ zfs_ace_remove(aclp, i);
+ continue;
+ }
+
+ /*
+ * Need to split ace into two?
+ */
+ if ((iflags & (ACE_FILE_INHERIT_ACE|
+ ACE_DIRECTORY_INHERIT_ACE)) &&
+ (!(iflags & ACE_INHERIT_ONLY_ACE))) {
+ zfs_acl_split_ace(aclp, i);
+ i++;
+ inherit = 1;
+ continue;
+ }
+
+ if (entry_type == ACE_OWNER || entry_type == ACE_EVERYONE ||
+ (entry_type == OWNING_GROUP)) {
+ acep[i].a_access_mask &= ~OGE_CLEAR;
+ i++;
+ continue;
+
+ } else {
+ if (acep[i].a_type == ALLOW) {
+
+ /*
+ * Check preceding ACE if any, to see
+ * if we need to prepend a DENY ACE.
+ * This is only applicable when the acl_mode
+ * property == groupmask.
+ */
+ if (zfsvfs->z_acl_mode == ZFS_ACL_GROUPMASK) {
+
+ reuse_deny = zfs_reuse_deny(acep, i);
+
+ if (reuse_deny == B_FALSE) {
+ zfs_acl_prepend_deny(zp, aclp,
+ i, mode);
+ i++;
+ acep = aclp->z_acl;
+ } else {
+ zfs_acl_prepend_fixup(
+ &acep[i - 1],
+ &acep[i], mode,
+ zp->z_phys->zp_uid);
+ }
+ zfs_fixup_group_entries(&acep[i - 1],
+ mode);
+ }
+ }
+ i++;
+ }
+ }
+
+ /*
+ * Check out last six aces, if we have six.
+ */
+
+ if (aclp->z_acl_count >= 6) {
+ i = aclp->z_acl_count - 6;
+
+ if (zfs_have_canonical_six(aclp, i)) {
+ need_canonical_six = 0;
+ }
+ }
+
+ if (need_canonical_six) {
+
+ zfs_acl_append(aclp, 6);
+ i = aclp->z_acl_count;
+ acep = aclp->z_acl;
+ zfs_set_ace(&acep[i++], 0, DENY, -1, ACE_OWNER);
+ zfs_set_ace(&acep[i++], OWNER_ALLOW_MASK, ALLOW, -1, ACE_OWNER);
+ zfs_set_ace(&acep[i++], 0, DENY, -1, OWNING_GROUP);
+ zfs_set_ace(&acep[i++], 0, ALLOW, -1, OWNING_GROUP);
+ zfs_set_ace(&acep[i++], EVERYONE_DENY_MASK,
+ DENY, -1, ACE_EVERYONE);
+ zfs_set_ace(&acep[i++], EVERYONE_ALLOW_MASK,
+ ALLOW, -1, ACE_EVERYONE);
+ aclp->z_acl_count += 6;
+ }
+
+ zfs_acl_fixup_canonical_six(aclp, mode);
+
+ zp->z_phys->zp_mode = mode;
+ error = zfs_aclset_common(zp, aclp, tx, &inherit);
+ return (error);
+}
+
+
+int
+zfs_acl_chmod_setattr(znode_t *zp, uint64_t mode, dmu_tx_t *tx)
+{
+ zfs_acl_t *aclp = NULL;
+ int error;
+
+ ASSERT(MUTEX_HELD(&zp->z_lock));
+ mutex_enter(&zp->z_acl_lock);
+ error = zfs_acl_node_read(zp, &aclp);
+ if (error == 0)
+ error = zfs_acl_chmod(zp, mode, aclp, tx);
+ mutex_exit(&zp->z_acl_lock);
+ if (aclp)
+ zfs_acl_free(aclp);
+ return (error);
+}
+
+/*
+ * strip off write_owner and write_acl
+ */
+static void
+zfs_securemode_update(zfsvfs_t *zfsvfs, ace_t *acep)
+{
+ if ((zfsvfs->z_acl_inherit == ZFS_ACL_SECURE) &&
+ (acep->a_type == ALLOW))
+ acep->a_access_mask &= ~SECURE_CLEAR;
+}
+
+/*
+ * inherit inheritable ACEs from parent
+ */
+static zfs_acl_t *
+zfs_acl_inherit(znode_t *zp, zfs_acl_t *paclp)
+{
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ ace_t *pacep;
+ ace_t *acep;
+ int ace_cnt = 0;
+ int pace_cnt;
+ int i, j;
+ zfs_acl_t *aclp = NULL;
+
+ i = j = 0;
+ pace_cnt = paclp->z_acl_count;
+ pacep = paclp->z_acl;
+ if (zfsvfs->z_acl_inherit != ZFS_ACL_DISCARD) {
+ for (i = 0; i != pace_cnt; i++) {
+
+ if (zfsvfs->z_acl_inherit == ZFS_ACL_NOALLOW &&
+ pacep[i].a_type == ALLOW)
+ continue;
+
+ if (zfs_ace_can_use(zp, &pacep[i])) {
+ ace_cnt++;
+ if (!(pacep[i].a_flags &
+ ACE_NO_PROPAGATE_INHERIT_ACE))
+ ace_cnt++;
+ }
+ }
+ }
+
+ aclp = zfs_acl_alloc(ace_cnt + OGE_PAD);
+ if (ace_cnt && zfsvfs->z_acl_inherit != ZFS_ACL_DISCARD) {
+ acep = aclp->z_acl;
+ pacep = paclp->z_acl;
+ for (i = 0; i != pace_cnt; i++) {
+
+ if (zfsvfs->z_acl_inherit == ZFS_ACL_NOALLOW &&
+ pacep[i].a_type == ALLOW)
+ continue;
+
+ if (zfs_ace_can_use(zp, &pacep[i])) {
+
+ /*
+ * Now create entry for inherited ace
+ */
+
+ acep[j] = pacep[i];
+
+ /*
+ * When AUDIT/ALARM a_types are supported
+ * they should be inherited here.
+ */
+
+ if ((pacep[i].a_flags &
+ ACE_NO_PROPAGATE_INHERIT_ACE) ||
+ (ZTOV(zp)->v_type != VDIR)) {
+ acep[j].a_flags &= ~ALL_INHERIT;
+ zfs_securemode_update(zfsvfs, &acep[j]);
+ j++;
+ continue;
+ }
+
+ ASSERT(ZTOV(zp)->v_type == VDIR);
+
+ /*
+ * If we are inheriting an ACE targeted for
+ * only files, then make sure inherit_only
+ * is on for future propagation.
+ */
+ if ((pacep[i].a_flags & (ACE_FILE_INHERIT_ACE |
+ ACE_DIRECTORY_INHERIT_ACE)) !=
+ ACE_FILE_INHERIT_ACE) {
+ j++;
+ acep[j] = acep[j-1];
+ acep[j-1].a_flags |=
+ ACE_INHERIT_ONLY_ACE;
+ acep[j].a_flags &= ~ALL_INHERIT;
+ } else {
+ acep[j].a_flags |= ACE_INHERIT_ONLY_ACE;
+ }
+ zfs_securemode_update(zfsvfs, &acep[j]);
+ j++;
+ }
+ }
+ }
+ aclp->z_acl_count = j;
+ ASSERT(aclp->z_slots >= aclp->z_acl_count);
+
+ return (aclp);
+}
+
+/*
+ * Create file system object initial permissions
+ * including inheritable ACEs.
+ */
+void
+zfs_perm_init(znode_t *zp, znode_t *parent, int flag,
+ vattr_t *vap, dmu_tx_t *tx, cred_t *cr)
+{
+ uint64_t mode;
+ uid_t uid;
+ gid_t gid;
+ int error;
+ int pull_down;
+ zfs_acl_t *aclp, *paclp;
+
+ mode = MAKEIMODE(vap->va_type, vap->va_mode);
+
+ /*
+ * Determine uid and gid.
+ */
+ if ((flag & (IS_ROOT_NODE | IS_REPLAY)) ||
+ ((flag & IS_XATTR) && (vap->va_type == VDIR))) {
+ uid = vap->va_uid;
+ gid = vap->va_gid;
+ } else {
+ uid = crgetuid(cr);
+ if ((vap->va_mask & AT_GID) &&
+ ((vap->va_gid == parent->z_phys->zp_gid) ||
+ groupmember(vap->va_gid, cr) ||
+ secpolicy_vnode_create_gid(cr) == 0))
+ gid = vap->va_gid;
+ else
+#ifdef __FreeBSD__
+ gid = parent->z_phys->zp_gid;
+#else
+ gid = (parent->z_phys->zp_mode & S_ISGID) ?
+ parent->z_phys->zp_gid : crgetgid(cr);
+#endif
+ }
+
+ /*
+ * If we're creating a directory, and the parent directory has the
+ * set-GID bit set, set in on the new directory.
+ * Otherwise, if the user is neither privileged nor a member of the
+ * file's new group, clear the file's set-GID bit.
+ */
+
+ if ((parent->z_phys->zp_mode & S_ISGID) && (vap->va_type == VDIR))
+ mode |= S_ISGID;
+ else {
+ if ((mode & S_ISGID) &&
+ secpolicy_vnode_setids_setgids(cr, gid) != 0)
+ mode &= ~S_ISGID;
+ }
+
+ zp->z_phys->zp_uid = uid;
+ zp->z_phys->zp_gid = gid;
+ zp->z_phys->zp_mode = mode;
+
+ mutex_enter(&parent->z_lock);
+ pull_down = (parent->z_phys->zp_flags & ZFS_INHERIT_ACE);
+ if (pull_down) {
+ mutex_enter(&parent->z_acl_lock);
+ VERIFY(0 == zfs_acl_node_read(parent, &paclp));
+ mutex_exit(&parent->z_acl_lock);
+ aclp = zfs_acl_inherit(zp, paclp);
+ zfs_acl_free(paclp);
+ } else {
+ aclp = zfs_acl_alloc(6);
+ }
+ mutex_exit(&parent->z_lock);
+ mutex_enter(&zp->z_lock);
+ mutex_enter(&zp->z_acl_lock);
+ error = zfs_acl_chmod(zp, mode, aclp, tx);
+ mutex_exit(&zp->z_lock);
+ mutex_exit(&zp->z_acl_lock);
+ ASSERT3U(error, ==, 0);
+ zfs_acl_free(aclp);
+}
+
+/*
+ * Should ACE be inherited?
+ */
+static int
+zfs_ace_can_use(znode_t *zp, ace_t *acep)
+{
+ int vtype = ZTOV(zp)->v_type;
+
+ int iflags = (acep->a_flags & 0xf);
+
+ if ((vtype == VDIR) && (iflags & ACE_DIRECTORY_INHERIT_ACE))
+ return (1);
+ else if (iflags & ACE_FILE_INHERIT_ACE)
+ return (!((vtype == VDIR) &&
+ (iflags & ACE_NO_PROPAGATE_INHERIT_ACE)));
+ return (0);
+}
+
+#ifdef TODO
+/*
+ * Retrieve a files ACL
+ */
+int
+zfs_getacl(znode_t *zp, vsecattr_t *vsecp, cred_t *cr)
+{
+ zfs_acl_t *aclp;
+ ulong_t mask = vsecp->vsa_mask & (VSA_ACE | VSA_ACECNT);
+ int error;
+
+ if (error = zfs_zaccess(zp, ACE_READ_ACL, cr)) {
+ /*
+ * If owner of file then allow reading of the
+ * ACL.
+ */
+ if (crgetuid(cr) != zp->z_phys->zp_uid)
+ return (error);
+ }
+
+ if (mask == 0)
+ return (ENOSYS);
+
+ mutex_enter(&zp->z_acl_lock);
+
+ error = zfs_acl_node_read(zp, &aclp);
+ if (error != 0) {
+ mutex_exit(&zp->z_acl_lock);
+ return (error);
+ }
+
+
+ if (mask & VSA_ACECNT) {
+ vsecp->vsa_aclcnt = aclp->z_acl_count;
+ }
+
+ if (mask & VSA_ACE) {
+ vsecp->vsa_aclentp = kmem_alloc(aclp->z_acl_count *
+ sizeof (ace_t), KM_SLEEP);
+ bcopy(aclp->z_acl, vsecp->vsa_aclentp,
+ aclp->z_acl_count * sizeof (ace_t));
+ }
+
+ mutex_exit(&zp->z_acl_lock);
+
+ zfs_acl_free(aclp);
+
+ return (0);
+}
+#endif /* TODO */
+
+#ifdef TODO
+/*
+ * Set a files ACL
+ */
+int
+zfs_setacl(znode_t *zp, vsecattr_t *vsecp, cred_t *cr)
+{
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ ace_t *acep = vsecp->vsa_aclentp;
+ int aclcnt = vsecp->vsa_aclcnt;
+ ulong_t mask = vsecp->vsa_mask & (VSA_ACE | VSA_ACECNT);
+ dmu_tx_t *tx;
+ int error;
+ int inherit;
+ zfs_acl_t *aclp;
+
+ if (mask == 0)
+ return (EINVAL);
+
+ if (!zfs_acl_valid(zp, acep, aclcnt, &inherit))
+ return (EINVAL);
+top:
+ error = zfs_zaccess_v4_perm(zp, ACE_WRITE_ACL, cr);
+ if (error == EACCES || error == ACCESS_UNDETERMINED) {
+ if ((error = secpolicy_vnode_setdac(cr,
+ zp->z_phys->zp_uid)) != 0) {
+ return (error);
+ }
+ } else if (error) {
+ return (error == EROFS ? error : EPERM);
+ }
+
+ mutex_enter(&zp->z_lock);
+ mutex_enter(&zp->z_acl_lock);
+
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_bonus(tx, zp->z_id);
+
+ if (zp->z_phys->zp_acl.z_acl_extern_obj) {
+ dmu_tx_hold_write(tx, zp->z_phys->zp_acl.z_acl_extern_obj,
+ 0, ZFS_ACL_SIZE(aclcnt));
+ } else if (aclcnt > ACE_SLOT_CNT) {
+ dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0, ZFS_ACL_SIZE(aclcnt));
+ }
+
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ mutex_exit(&zp->z_acl_lock);
+ mutex_exit(&zp->z_lock);
+
+ if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT) {
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ goto top;
+ }
+ dmu_tx_abort(tx);
+ return (error);
+ }
+
+ aclp = zfs_acl_alloc(aclcnt);
+ bcopy(acep, aclp->z_acl, sizeof (ace_t) * aclcnt);
+ aclp->z_acl_count = aclcnt;
+ error = zfs_aclset_common(zp, aclp, tx, &inherit);
+ ASSERT(error == 0);
+
+ zfs_acl_free(aclp);
+ zfs_log_acl(zilog, tx, TX_ACL, zp, aclcnt, acep);
+ dmu_tx_commit(tx);
+done:
+ mutex_exit(&zp->z_acl_lock);
+ mutex_exit(&zp->z_lock);
+
+ return (error);
+}
+#endif /* TODO */
+
+static int
+zfs_ace_access(ace_t *zacep, int *working_mode)
+{
+ if (*working_mode == 0) {
+ return (0);
+ }
+
+ if (zacep->a_access_mask & *working_mode) {
+ if (zacep->a_type == ALLOW) {
+ *working_mode &=
+ ~(*working_mode & zacep->a_access_mask);
+ if (*working_mode == 0)
+ return (0);
+ } else if (zacep->a_type == DENY) {
+ return (EACCES);
+ }
+ }
+
+ /*
+ * haven't been specifcally denied at this point
+ * so return UNDETERMINED.
+ */
+
+ return (ACCESS_UNDETERMINED);
+}
+
+
+static int
+zfs_zaccess_common(znode_t *zp, int v4_mode, int *working_mode, cred_t *cr)
+{
+ zfs_acl_t *aclp;
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ ace_t *zacep;
+ gid_t gid;
+ int cnt;
+ int i;
+ int error;
+ int access_deny = ACCESS_UNDETERMINED;
+ uint_t entry_type;
+ uid_t uid = crgetuid(cr);
+
+ if (zfsvfs->z_assign >= TXG_INITIAL) { /* ZIL replay */
+ *working_mode = 0;
+ return (0);
+ }
+
+ *working_mode = v4_mode;
+
+ if ((v4_mode & WRITE_MASK) &&
+ (zp->z_zfsvfs->z_vfs->vfs_flag & VFS_RDONLY) &&
+ (!IS_DEVVP(ZTOV(zp)))) {
+ return (EROFS);
+ }
+
+ mutex_enter(&zp->z_acl_lock);
+
+ error = zfs_acl_node_read(zp, &aclp);
+ if (error != 0) {
+ mutex_exit(&zp->z_acl_lock);
+ return (error);
+ }
+
+
+ zacep = aclp->z_acl;
+ cnt = aclp->z_acl_count;
+
+ for (i = 0; i != cnt; i++) {
+
+ DTRACE_PROBE2(zfs__access__common,
+ ace_t *, &zacep[i], int, *working_mode);
+
+ if (zacep[i].a_flags & ACE_INHERIT_ONLY_ACE)
+ continue;
+
+ entry_type = (zacep[i].a_flags & ACE_TYPE_FLAGS);
+ switch (entry_type) {
+ case ACE_OWNER:
+ if (uid == zp->z_phys->zp_uid) {
+ access_deny = zfs_ace_access(&zacep[i],
+ working_mode);
+ }
+ break;
+ case (ACE_IDENTIFIER_GROUP | ACE_GROUP):
+ case ACE_IDENTIFIER_GROUP:
+ /*
+ * Owning group gid is in znode not ACL
+ */
+ if (entry_type == (ACE_IDENTIFIER_GROUP | ACE_GROUP))
+ gid = zp->z_phys->zp_gid;
+ else
+ gid = zacep[i].a_who;
+
+ if (groupmember(gid, cr)) {
+ access_deny = zfs_ace_access(&zacep[i],
+ working_mode);
+ }
+ break;
+ case ACE_EVERYONE:
+ access_deny = zfs_ace_access(&zacep[i], working_mode);
+ break;
+
+ /* USER Entry */
+ default:
+ if (entry_type == 0) {
+ if (uid == zacep[i].a_who) {
+ access_deny = zfs_ace_access(&zacep[i],
+ working_mode);
+ }
+ break;
+ }
+ zfs_acl_free(aclp);
+ mutex_exit(&zp->z_acl_lock);
+ return (EIO);
+ }
+
+ if (access_deny != ACCESS_UNDETERMINED)
+ break;
+ }
+
+ mutex_exit(&zp->z_acl_lock);
+ zfs_acl_free(aclp);
+
+ return (access_deny);
+}
+
+
+/*
+ * Determine whether Access should be granted/denied, invoking least
+ * priv subsytem when a deny is determined.
+ */
+int
+zfs_zaccess(znode_t *zp, int mode, cred_t *cr)
+{
+ int working_mode;
+ int error;
+ int is_attr;
+ znode_t *xzp;
+ znode_t *check_zp = zp;
+
+ is_attr = ((zp->z_phys->zp_flags & ZFS_XATTR) &&
+ (ZTOV(zp)->v_type == VDIR));
+
+ /*
+ * If attribute then validate against base file
+ */
+ if (is_attr) {
+ if ((error = zfs_zget(zp->z_zfsvfs,
+ zp->z_phys->zp_parent, &xzp)) != 0) {
+ return (error);
+ }
+ check_zp = xzp;
+ /*
+ * fixup mode to map to xattr perms
+ */
+
+ if (mode & (ACE_WRITE_DATA|ACE_APPEND_DATA)) {
+ mode &= ~(ACE_WRITE_DATA|ACE_APPEND_DATA);
+ mode |= ACE_WRITE_NAMED_ATTRS;
+ }
+
+ if (mode & (ACE_READ_DATA|ACE_EXECUTE)) {
+ mode &= ~(ACE_READ_DATA|ACE_EXECUTE);
+ mode |= ACE_READ_NAMED_ATTRS;
+ }
+ }
+
+ error = zfs_zaccess_common(check_zp, mode, &working_mode, cr);
+
+ if (error == EROFS) {
+ if (is_attr)
+ VN_RELE(ZTOV(xzp));
+ return (error);
+ }
+
+ if (error || working_mode) {
+ working_mode = (zfs_v4_to_unix(working_mode) << 6);
+ error = secpolicy_vnode_access(cr, ZTOV(check_zp),
+ check_zp->z_phys->zp_uid, working_mode);
+ }
+
+ if (is_attr)
+ VN_RELE(ZTOV(xzp));
+
+ return (error);
+}
+
+/*
+ * Special zaccess function to check for special nfsv4 perm.
+ * doesn't call secpolicy_vnode_access() for failure, since that
+ * would probably be the wrong policy function to call.
+ * instead its up to the caller to handle that situation.
+ */
+
+int
+zfs_zaccess_v4_perm(znode_t *zp, int mode, cred_t *cr)
+{
+ int working_mode = 0;
+ return (zfs_zaccess_common(zp, mode, &working_mode, cr));
+}
+
+/*
+ * Translate tradition unix VREAD/VWRITE/VEXEC mode into
+ * native ACL format and call zfs_zaccess()
+ */
+int
+zfs_zaccess_rwx(znode_t *zp, mode_t mode, cred_t *cr)
+{
+ int v4_mode = zfs_unix_to_v4(mode >> 6);
+
+ return (zfs_zaccess(zp, v4_mode, cr));
+}
+
+static int
+zfs_delete_final_check(znode_t *zp, znode_t *dzp, cred_t *cr)
+{
+ int error;
+
+ error = secpolicy_vnode_access(cr, ZTOV(zp),
+ dzp->z_phys->zp_uid, S_IWRITE|S_IEXEC);
+
+ if (error == 0)
+ error = zfs_sticky_remove_access(dzp, zp, cr);
+
+ return (error);
+}
+
+/*
+ * Determine whether Access should be granted/deny, without
+ * consulting least priv subsystem.
+ *
+ *
+ * The following chart is the recommended NFSv4 enforcement for
+ * ability to delete an object.
+ *
+ * -------------------------------------------------------
+ * | Parent Dir | Target Object Permissions |
+ * | permissions | |
+ * -------------------------------------------------------
+ * | | ACL Allows | ACL Denies| Delete |
+ * | | Delete | Delete | unspecified|
+ * -------------------------------------------------------
+ * | ACL Allows | Permit | Permit | Permit |
+ * | DELETE_CHILD | |
+ * -------------------------------------------------------
+ * | ACL Denies | Permit | Deny | Deny |
+ * | DELETE_CHILD | | | |
+ * -------------------------------------------------------
+ * | ACL specifies | | | |
+ * | only allow | Permit | Permit | Permit |
+ * | write and | | | |
+ * | execute | | | |
+ * -------------------------------------------------------
+ * | ACL denies | | | |
+ * | write and | Permit | Deny | Deny |
+ * | execute | | | |
+ * -------------------------------------------------------
+ * ^
+ * |
+ * No search privilege, can't even look up file?
+ *
+ */
+int
+zfs_zaccess_delete(znode_t *dzp, znode_t *zp, cred_t *cr)
+{
+ int dzp_working_mode = 0;
+ int zp_working_mode = 0;
+ int dzp_error, zp_error;
+
+ /*
+ * Arghh, this check is going to require a couple of questions
+ * to be asked. We want specific DELETE permissions to
+ * take precedence over WRITE/EXECUTE. We don't
+ * want an ACL such as this to mess us up.
+ * user:joe:write_data:deny,user:joe:delete:allow
+ *
+ * However, deny permissions may ultimately be overridden
+ * by secpolicy_vnode_access().
+ */
+
+ dzp_error = zfs_zaccess_common(dzp, ACE_DELETE_CHILD,
+ &dzp_working_mode, cr);
+ zp_error = zfs_zaccess_common(zp, ACE_DELETE, &zp_working_mode, cr);
+
+ if (dzp_error == EROFS || zp_error == EROFS)
+ return (dzp_error);
+
+ /*
+ * First check the first row.
+ * We only need to see if parent Allows delete_child
+ */
+ if ((dzp_working_mode & ACE_DELETE_CHILD) == 0)
+ return (0);
+
+ /*
+ * Second row
+ * we already have the necessary information in
+ * zp_working_mode, zp_error and dzp_error.
+ */
+
+ if ((zp_working_mode & ACE_DELETE) == 0)
+ return (0);
+
+ /*
+ * Now zp_error should either be EACCES which indicates
+ * a "deny" delete entry or ACCESS_UNDETERMINED if the "delete"
+ * entry exists on the target.
+ *
+ * dzp_error should be either EACCES which indicates a "deny"
+ * entry for delete_child or ACCESS_UNDETERMINED if no delete_child
+ * entry exists. If value is EACCES then we are done
+ * and zfs_delete_final_check() will make the final decision
+ * regarding to allow the delete.
+ */
+
+ ASSERT(zp_error != 0 && dzp_error != 0);
+ if (dzp_error == EACCES)
+ return (zfs_delete_final_check(zp, dzp, cr));
+
+ /*
+ * Third Row
+ * Only need to check for write/execute on parent
+ */
+
+ dzp_error = zfs_zaccess_common(dzp, ACE_WRITE_DATA|ACE_EXECUTE,
+ &dzp_working_mode, cr);
+
+ if (dzp_error == EROFS)
+ return (dzp_error);
+
+ if ((dzp_working_mode & (ACE_WRITE_DATA|ACE_EXECUTE)) == 0)
+ return (zfs_sticky_remove_access(dzp, zp, cr));
+
+ /*
+ * Fourth Row
+ */
+
+ if (((dzp_working_mode & (ACE_WRITE_DATA|ACE_EXECUTE)) != 0) &&
+ ((zp_working_mode & ACE_DELETE) == 0))
+ return (zfs_sticky_remove_access(dzp, zp, cr));
+
+ return (zfs_delete_final_check(zp, dzp, cr));
+}
+
+int
+zfs_zaccess_rename(znode_t *sdzp, znode_t *szp, znode_t *tdzp,
+ znode_t *tzp, cred_t *cr)
+{
+ int add_perm;
+ int error;
+
+ add_perm = (ZTOV(szp)->v_type == VDIR) ?
+ ACE_ADD_SUBDIRECTORY : ACE_ADD_FILE;
+
+ /*
+ * Rename permissions are combination of delete permission +
+ * add file/subdir permission.
+ */
+
+ /*
+ * first make sure we do the delete portion.
+ *
+ * If that succeeds then check for add_file/add_subdir permissions
+ */
+
+ if (error = zfs_zaccess_delete(sdzp, szp, cr))
+ return (error);
+
+ /*
+ * If we have a tzp, see if we can delete it?
+ */
+ if (tzp) {
+ if (error = zfs_zaccess_delete(tdzp, tzp, cr))
+ return (error);
+ }
+
+ /*
+ * Now check for add permissions
+ */
+ error = zfs_zaccess(tdzp, add_perm, cr);
+
+ return (error);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_byteswap.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_byteswap.c
new file mode 100644
index 0000000..c8450d4
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_byteswap.c
@@ -0,0 +1,99 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/vfs.h>
+#include <sys/fs/zfs.h>
+#include <sys/zfs_znode.h>
+#include <sys/zfs_acl.h>
+
+void
+zfs_ace_byteswap(ace_t *ace, int ace_cnt)
+{
+ int i;
+
+ for (i = 0; i != ace_cnt; i++, ace++) {
+ ace->a_who = BSWAP_32(ace->a_who);
+ ace->a_access_mask = BSWAP_32(ace->a_access_mask);
+ ace->a_flags = BSWAP_16(ace->a_flags);
+ ace->a_type = BSWAP_16(ace->a_type);
+ }
+}
+
+/* ARGSUSED */
+void
+zfs_acl_byteswap(void *buf, size_t size)
+{
+ int cnt;
+
+ /*
+ * Arggh, since we don't know how many ACEs are in
+ * the array, we have to swap the entire block
+ */
+
+ cnt = size / sizeof (ace_t);
+
+ zfs_ace_byteswap((ace_t *)buf, cnt);
+}
+
+void
+zfs_znode_byteswap(void *buf, size_t size)
+{
+ znode_phys_t *zp = buf;
+
+ ASSERT(size >= sizeof (znode_phys_t));
+
+ zp->zp_crtime[0] = BSWAP_64(zp->zp_crtime[0]);
+ zp->zp_crtime[1] = BSWAP_64(zp->zp_crtime[1]);
+ zp->zp_atime[0] = BSWAP_64(zp->zp_atime[0]);
+ zp->zp_atime[1] = BSWAP_64(zp->zp_atime[1]);
+ zp->zp_mtime[0] = BSWAP_64(zp->zp_mtime[0]);
+ zp->zp_mtime[1] = BSWAP_64(zp->zp_mtime[1]);
+ zp->zp_ctime[0] = BSWAP_64(zp->zp_ctime[0]);
+ zp->zp_ctime[1] = BSWAP_64(zp->zp_ctime[1]);
+ zp->zp_gen = BSWAP_64(zp->zp_gen);
+ zp->zp_mode = BSWAP_64(zp->zp_mode);
+ zp->zp_size = BSWAP_64(zp->zp_size);
+ zp->zp_parent = BSWAP_64(zp->zp_parent);
+ zp->zp_links = BSWAP_64(zp->zp_links);
+ zp->zp_xattr = BSWAP_64(zp->zp_xattr);
+ zp->zp_rdev = BSWAP_64(zp->zp_rdev);
+ zp->zp_flags = BSWAP_64(zp->zp_flags);
+ zp->zp_uid = BSWAP_64(zp->zp_uid);
+ zp->zp_gid = BSWAP_64(zp->zp_gid);
+ zp->zp_pad[0] = BSWAP_64(zp->zp_pad[0]);
+ zp->zp_pad[1] = BSWAP_64(zp->zp_pad[1]);
+ zp->zp_pad[2] = BSWAP_64(zp->zp_pad[2]);
+ zp->zp_pad[3] = BSWAP_64(zp->zp_pad[3]);
+
+ zp->zp_acl.z_acl_extern_obj = BSWAP_64(zp->zp_acl.z_acl_extern_obj);
+ zp->zp_acl.z_acl_count = BSWAP_32(zp->zp_acl.z_acl_count);
+ zp->zp_acl.z_acl_version = BSWAP_16(zp->zp_acl.z_acl_version);
+ zp->zp_acl.z_acl_pad = BSWAP_16(zp->zp_acl.z_acl_pad);
+ zfs_ace_byteswap(&zp->zp_acl.z_ace_data[0], ACE_SLOT_CNT);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
new file mode 100644
index 0000000..0624fc2
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ctldir.c
@@ -0,0 +1,1119 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * ZFS control directory (a.k.a. ".zfs")
+ *
+ * This directory provides a common location for all ZFS meta-objects.
+ * Currently, this is only the 'snapshot' directory, but this may expand in the
+ * future. The elements are built using the GFS primitives, as the hierarchy
+ * does not actually exist on disk.
+ *
+ * For 'snapshot', we don't want to have all snapshots always mounted, because
+ * this would take up a huge amount of space in /etc/mnttab. We have three
+ * types of objects:
+ *
+ * ctldir ------> snapshotdir -------> snapshot
+ * |
+ * |
+ * V
+ * mounted fs
+ *
+ * The 'snapshot' node contains just enough information to lookup '..' and act
+ * as a mountpoint for the snapshot. Whenever we lookup a specific snapshot, we
+ * perform an automount of the underlying filesystem and return the
+ * corresponding vnode.
+ *
+ * All mounts are handled automatically by the kernel, but unmounts are
+ * (currently) handled from user land. The main reason is that there is no
+ * reliable way to auto-unmount the filesystem when it's "no longer in use".
+ * When the user unmounts a filesystem, we call zfsctl_unmount(), which
+ * unmounts any snapshots within the snapshot directory.
+ */
+
+#include <sys/zfs_context.h>
+#include <sys/zfs_ctldir.h>
+#include <sys/zfs_ioctl.h>
+#include <sys/zfs_vfsops.h>
+#include <sys/namei.h>
+#include <sys/gfs.h>
+#include <sys/stat.h>
+#include <sys/dmu.h>
+#include <sys/mount.h>
+
+typedef struct {
+ char *se_name;
+ vnode_t *se_root;
+ avl_node_t se_node;
+} zfs_snapentry_t;
+
+static int
+snapentry_compare(const void *a, const void *b)
+{
+ const zfs_snapentry_t *sa = a;
+ const zfs_snapentry_t *sb = b;
+ int ret = strcmp(sa->se_name, sb->se_name);
+
+ if (ret < 0)
+ return (-1);
+ else if (ret > 0)
+ return (1);
+ else
+ return (0);
+}
+
+static struct vop_vector zfsctl_ops_root;
+static struct vop_vector zfsctl_ops_snapdir;
+static struct vop_vector zfsctl_ops_snapshot;
+
+static vnode_t *zfsctl_mknode_snapdir(vnode_t *);
+static vnode_t *zfsctl_snapshot_mknode(vnode_t *, uint64_t objset);
+
+typedef struct zfsctl_node {
+ gfs_dir_t zc_gfs_private;
+ uint64_t zc_id;
+ timestruc_t zc_cmtime; /* ctime and mtime, always the same */
+} zfsctl_node_t;
+
+typedef struct zfsctl_snapdir {
+ zfsctl_node_t sd_node;
+ kmutex_t sd_lock;
+ avl_tree_t sd_snaps;
+} zfsctl_snapdir_t;
+
+/*
+ * Root directory elements. We have only a single static entry, 'snapshot'.
+ */
+static gfs_dirent_t zfsctl_root_entries[] = {
+ { "snapshot", zfsctl_mknode_snapdir, GFS_CACHE_VNODE },
+ { NULL }
+};
+
+/* include . and .. in the calculation */
+#define NROOT_ENTRIES ((sizeof (zfsctl_root_entries) / \
+ sizeof (gfs_dirent_t)) + 1)
+
+
+/*
+ * Initialize the various GFS pieces we'll need to create and manipulate .zfs
+ * directories. This is called from the ZFS init routine, and initializes the
+ * vnode ops vectors that we'll be using.
+ */
+void
+zfsctl_init(void)
+{
+}
+
+void
+zfsctl_fini(void)
+{
+}
+
+/*
+ * Return the inode number associated with the 'snapshot' directory.
+ */
+/* ARGSUSED */
+static ino64_t
+zfsctl_root_inode_cb(vnode_t *vp, int index)
+{
+ ASSERT(index == 0);
+ return (ZFSCTL_INO_SNAPDIR);
+}
+
+/*
+ * Create the '.zfs' directory. This directory is cached as part of the VFS
+ * structure. This results in a hold on the vfs_t. The code in zfs_umount()
+ * therefore checks against a vfs_count of 2 instead of 1. This reference
+ * is removed when the ctldir is destroyed in the unmount.
+ */
+void
+zfsctl_create(zfsvfs_t *zfsvfs)
+{
+ vnode_t *vp, *rvp;
+ zfsctl_node_t *zcp;
+
+ ASSERT(zfsvfs->z_ctldir == NULL);
+
+ vp = gfs_root_create(sizeof (zfsctl_node_t), zfsvfs->z_vfs,
+ &zfsctl_ops_root, ZFSCTL_INO_ROOT, zfsctl_root_entries,
+ zfsctl_root_inode_cb, MAXNAMELEN, NULL, NULL);
+ zcp = vp->v_data;
+ zcp->zc_id = ZFSCTL_INO_ROOT;
+
+ VERIFY(VFS_ROOT(zfsvfs->z_vfs, LK_EXCLUSIVE, &rvp, curthread) == 0);
+ ZFS_TIME_DECODE(&zcp->zc_cmtime, VTOZ(rvp)->z_phys->zp_crtime);
+ VN_URELE(rvp);
+
+ /*
+ * We're only faking the fact that we have a root of a filesystem for
+ * the sake of the GFS interfaces. Undo the flag manipulation it did
+ * for us.
+ */
+ vp->v_vflag &= ~VV_ROOT;
+
+ zfsvfs->z_ctldir = vp;
+}
+
+/*
+ * Destroy the '.zfs' directory. Only called when the filesystem is unmounted.
+ * There might still be more references if we were force unmounted, but only
+ * new zfs_inactive() calls can occur and they don't reference .zfs
+ */
+void
+zfsctl_destroy(zfsvfs_t *zfsvfs)
+{
+ VN_RELE(zfsvfs->z_ctldir);
+ zfsvfs->z_ctldir = NULL;
+}
+
+/*
+ * Given a root znode, retrieve the associated .zfs directory.
+ * Add a hold to the vnode and return it.
+ */
+vnode_t *
+zfsctl_root(znode_t *zp)
+{
+ ASSERT(zfs_has_ctldir(zp));
+ VN_HOLD(zp->z_zfsvfs->z_ctldir);
+ return (zp->z_zfsvfs->z_ctldir);
+}
+
+/*
+ * Common open routine. Disallow any write access.
+ */
+/* ARGSUSED */
+static int
+zfsctl_common_open(struct vop_open_args *ap)
+{
+ int flags = ap->a_mode;
+
+ if (flags & FWRITE)
+ return (EACCES);
+
+ return (0);
+}
+
+/*
+ * Common close routine. Nothing to do here.
+ */
+/* ARGSUSED */
+static int
+zfsctl_common_close(struct vop_close_args *ap)
+{
+ return (0);
+}
+
+/*
+ * Common access routine. Disallow writes.
+ */
+/* ARGSUSED */
+static int
+zfsctl_common_access(ap)
+ struct vop_access_args /* {
+ struct vnode *a_vp;
+ int a_mode;
+ struct ucred *a_cred;
+ struct thread *a_td;
+ } */ *ap;
+{
+ int mode = ap->a_mode;
+
+ if (mode & VWRITE)
+ return (EACCES);
+
+ return (0);
+}
+
+/*
+ * Common getattr function. Fill in basic information.
+ */
+static void
+zfsctl_common_getattr(vnode_t *vp, vattr_t *vap)
+{
+ zfsctl_node_t *zcp = vp->v_data;
+ timestruc_t now;
+
+ vap->va_uid = 0;
+ vap->va_gid = 0;
+ vap->va_rdev = 0;
+ /*
+ * We are a purly virtual object, so we have no
+ * blocksize or allocated blocks.
+ */
+ vap->va_blksize = 0;
+ vap->va_nblocks = 0;
+ vap->va_seq = 0;
+ vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
+ vap->va_mode = S_IRUSR | S_IXUSR | S_IRGRP | S_IXGRP |
+ S_IROTH | S_IXOTH;
+ vap->va_type = VDIR;
+ /*
+ * We live in the now (for atime).
+ */
+ gethrestime(&now);
+ vap->va_atime = now;
+ vap->va_mtime = vap->va_ctime = vap->va_birthtime = zcp->zc_cmtime;
+ /* FreeBSD: Reset chflags(2) flags. */
+ vap->va_flags = 0;
+}
+
+static int
+zfsctl_common_fid(ap)
+ struct vop_fid_args /* {
+ struct vnode *a_vp;
+ struct fid *a_fid;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+ fid_t *fidp = (void *)ap->a_fid;
+ zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
+ zfsctl_node_t *zcp = vp->v_data;
+ uint64_t object = zcp->zc_id;
+ zfid_short_t *zfid;
+ int i;
+
+ ZFS_ENTER(zfsvfs);
+
+ fidp->fid_len = SHORT_FID_LEN;
+
+ zfid = (zfid_short_t *)fidp;
+
+ zfid->zf_len = SHORT_FID_LEN;
+
+ for (i = 0; i < sizeof (zfid->zf_object); i++)
+ zfid->zf_object[i] = (uint8_t)(object >> (8 * i));
+
+ /* .zfs znodes always have a generation number of 0 */
+ for (i = 0; i < sizeof (zfid->zf_gen); i++)
+ zfid->zf_gen[i] = 0;
+
+ ZFS_EXIT(zfsvfs);
+ return (0);
+}
+
+static int
+zfsctl_common_reclaim(ap)
+ struct vop_reclaim_args /* {
+ struct vnode *a_vp;
+ struct thread *a_td;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+
+ /*
+ * Destroy the vm object and flush associated pages.
+ */
+ vnode_destroy_vobject(vp);
+ VI_LOCK(vp);
+ vp->v_data = NULL;
+ VI_UNLOCK(vp);
+ return (0);
+}
+
+/*
+ * .zfs inode namespace
+ *
+ * We need to generate unique inode numbers for all files and directories
+ * within the .zfs pseudo-filesystem. We use the following scheme:
+ *
+ * ENTRY ZFSCTL_INODE
+ * .zfs 1
+ * .zfs/snapshot 2
+ * .zfs/snapshot/<snap> objectid(snap)
+ */
+
+#define ZFSCTL_INO_SNAP(id) (id)
+
+/*
+ * Get root directory attributes.
+ */
+/* ARGSUSED */
+static int
+zfsctl_root_getattr(ap)
+ struct vop_getattr_args /* {
+ struct vnode *a_vp;
+ struct vattr *a_vap;
+ struct ucred *a_cred;
+ struct thread *a_td;
+ } */ *ap;
+{
+ struct vnode *vp = ap->a_vp;
+ struct vattr *vap = ap->a_vap;
+ zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
+
+ ZFS_ENTER(zfsvfs);
+ vap->va_nodeid = ZFSCTL_INO_ROOT;
+ vap->va_nlink = vap->va_size = NROOT_ENTRIES;
+
+ zfsctl_common_getattr(vp, vap);
+ ZFS_EXIT(zfsvfs);
+
+ return (0);
+}
+
+/*
+ * Special case the handling of "..".
+ */
+/* ARGSUSED */
+int
+zfsctl_root_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, pathname_t *pnp,
+ int flags, vnode_t *rdir, cred_t *cr)
+{
+ zfsvfs_t *zfsvfs = dvp->v_vfsp->vfs_data;
+ int err;
+
+ ZFS_ENTER(zfsvfs);
+
+ if (strcmp(nm, "..") == 0) {
+ err = VFS_ROOT(dvp->v_vfsp, LK_EXCLUSIVE, vpp, curthread);
+ if (err == 0)
+ VOP_UNLOCK(*vpp, 0, curthread);
+ } else {
+ err = gfs_dir_lookup(dvp, nm, vpp);
+ }
+
+ ZFS_EXIT(zfsvfs);
+
+ return (err);
+}
+
+/*
+ * Special case the handling of "..".
+ */
+/* ARGSUSED */
+int
+zfsctl_root_lookup_vop(ap)
+ struct vop_lookup_args /* {
+ struct vnode *a_dvp;
+ struct vnode **a_vpp;
+ struct componentname *a_cnp;
+ } */ *ap;
+{
+ vnode_t *dvp = ap->a_dvp;
+ vnode_t **vpp = ap->a_vpp;
+ cred_t *cr = ap->a_cnp->cn_cred;
+ int flags = ap->a_cnp->cn_flags;
+ int nameiop = ap->a_cnp->cn_nameiop;
+ char nm[NAME_MAX + 1];
+ int err;
+
+ if ((flags & ISLASTCN) && (nameiop == RENAME || nameiop == CREATE))
+ return (EOPNOTSUPP);
+
+ ASSERT(ap->a_cnp->cn_namelen < sizeof(nm));
+ strlcpy(nm, ap->a_cnp->cn_nameptr, ap->a_cnp->cn_namelen + 1);
+
+ err = zfsctl_root_lookup(dvp, nm, vpp, NULL, 0, NULL, cr);
+ if (err == 0 && (nm[0] != '.' || nm[1] != '\0'))
+ vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, ap->a_cnp->cn_thread);
+
+ return (err);
+}
+
+static struct vop_vector zfsctl_ops_root = {
+ .vop_default = &default_vnodeops,
+ .vop_open = zfsctl_common_open,
+ .vop_close = zfsctl_common_close,
+ .vop_ioctl = VOP_EINVAL,
+ .vop_getattr = zfsctl_root_getattr,
+ .vop_access = zfsctl_common_access,
+ .vop_readdir = gfs_vop_readdir,
+ .vop_lookup = zfsctl_root_lookup_vop,
+ .vop_inactive = gfs_vop_inactive,
+ .vop_reclaim = zfsctl_common_reclaim,
+ .vop_fid = zfsctl_common_fid,
+};
+
+static int
+zfsctl_snapshot_zname(vnode_t *vp, const char *name, int len, char *zname)
+{
+ objset_t *os = ((zfsvfs_t *)((vp)->v_vfsp->vfs_data))->z_os;
+
+ dmu_objset_name(os, zname);
+ if (strlen(zname) + 1 + strlen(name) >= len)
+ return (ENAMETOOLONG);
+ (void) strcat(zname, "@");
+ (void) strcat(zname, name);
+ return (0);
+}
+
+static int
+zfsctl_unmount_snap(vnode_t *dvp, const char *name, int force, cred_t *cr)
+{
+ zfsctl_snapdir_t *sdp = dvp->v_data;
+ zfs_snapentry_t search, *sep;
+ struct vop_inactive_args ap;
+ avl_index_t where;
+ int err;
+
+ ASSERT(MUTEX_HELD(&sdp->sd_lock));
+
+ search.se_name = (char *)name;
+ if ((sep = avl_find(&sdp->sd_snaps, &search, &where)) == NULL)
+ return (ENOENT);
+
+ ASSERT(vn_ismntpt(sep->se_root));
+
+ /* this will be dropped by dounmount() */
+ if ((err = vn_vfswlock(sep->se_root)) != 0)
+ return (err);
+
+ err = dounmount(vn_mountedvfs(sep->se_root), force, curthread);
+ if (err)
+ return (err);
+ ASSERT(sep->se_root->v_count == 1);
+ ap.a_vp = sep->se_root;
+ gfs_vop_inactive(&ap);
+
+ avl_remove(&sdp->sd_snaps, sep);
+ kmem_free(sep->se_name, strlen(sep->se_name) + 1);
+ kmem_free(sep, sizeof (zfs_snapentry_t));
+
+ return (0);
+}
+
+#if 0
+static void
+zfsctl_rename_snap(zfsctl_snapdir_t *sdp, zfs_snapentry_t *sep, const char *nm)
+{
+ avl_index_t where;
+ vfs_t *vfsp;
+ refstr_t *pathref;
+ char newpath[MAXNAMELEN];
+ char *tail;
+
+ ASSERT(MUTEX_HELD(&sdp->sd_lock));
+ ASSERT(sep != NULL);
+
+ vfsp = vn_mountedvfs(sep->se_root);
+ ASSERT(vfsp != NULL);
+
+ vfs_lock_wait(vfsp);
+
+ /*
+ * Change the name in the AVL tree.
+ */
+ avl_remove(&sdp->sd_snaps, sep);
+ kmem_free(sep->se_name, strlen(sep->se_name) + 1);
+ sep->se_name = kmem_alloc(strlen(nm) + 1, KM_SLEEP);
+ (void) strcpy(sep->se_name, nm);
+ VERIFY(avl_find(&sdp->sd_snaps, sep, &where) == NULL);
+ avl_insert(&sdp->sd_snaps, sep, where);
+
+ /*
+ * Change the current mountpoint info:
+ * - update the tail of the mntpoint path
+ * - update the tail of the resource path
+ */
+ pathref = vfs_getmntpoint(vfsp);
+ (void) strncpy(newpath, refstr_value(pathref), sizeof (newpath));
+ VERIFY((tail = strrchr(newpath, '/')) != NULL);
+ *(tail+1) = '\0';
+ ASSERT3U(strlen(newpath) + strlen(nm), <, sizeof (newpath));
+ (void) strcat(newpath, nm);
+ refstr_rele(pathref);
+ vfs_setmntpoint(vfsp, newpath);
+
+ pathref = vfs_getresource(vfsp);
+ (void) strncpy(newpath, refstr_value(pathref), sizeof (newpath));
+ VERIFY((tail = strrchr(newpath, '@')) != NULL);
+ *(tail+1) = '\0';
+ ASSERT3U(strlen(newpath) + strlen(nm), <, sizeof (newpath));
+ (void) strcat(newpath, nm);
+ refstr_rele(pathref);
+ vfs_setresource(vfsp, newpath);
+
+ vfs_unlock(vfsp);
+}
+#endif
+
+#if 0
+static int
+zfsctl_snapdir_rename(vnode_t *sdvp, char *snm, vnode_t *tdvp, char *tnm,
+ cred_t *cr)
+{
+ zfsctl_snapdir_t *sdp = sdvp->v_data;
+ zfs_snapentry_t search, *sep;
+ avl_index_t where;
+ char from[MAXNAMELEN], to[MAXNAMELEN];
+ int err;
+
+ err = zfsctl_snapshot_zname(sdvp, snm, MAXNAMELEN, from);
+ if (err)
+ return (err);
+ err = zfs_secpolicy_write(from, cr);
+ if (err)
+ return (err);
+
+ /*
+ * Cannot move snapshots out of the snapdir.
+ */
+ if (sdvp != tdvp)
+ return (EINVAL);
+
+ if (strcmp(snm, tnm) == 0)
+ return (0);
+
+ err = zfsctl_snapshot_zname(tdvp, tnm, MAXNAMELEN, to);
+ if (err)
+ return (err);
+
+ mutex_enter(&sdp->sd_lock);
+
+ search.se_name = (char *)snm;
+ if ((sep = avl_find(&sdp->sd_snaps, &search, &where)) == NULL) {
+ mutex_exit(&sdp->sd_lock);
+ return (ENOENT);
+ }
+
+ err = dmu_objset_rename(from, to, B_FALSE);
+ if (err == 0)
+ zfsctl_rename_snap(sdp, sep, tnm);
+
+ mutex_exit(&sdp->sd_lock);
+
+ return (err);
+}
+#endif
+
+#if 0
+/* ARGSUSED */
+static int
+zfsctl_snapdir_remove(vnode_t *dvp, char *name, vnode_t *cwd, cred_t *cr)
+{
+ zfsctl_snapdir_t *sdp = dvp->v_data;
+ char snapname[MAXNAMELEN];
+ int err;
+
+ err = zfsctl_snapshot_zname(dvp, name, MAXNAMELEN, snapname);
+ if (err)
+ return (err);
+ err = zfs_secpolicy_write(snapname, cr);
+ if (err)
+ return (err);
+
+ mutex_enter(&sdp->sd_lock);
+
+ err = zfsctl_unmount_snap(dvp, name, 0, cr);
+ if (err) {
+ mutex_exit(&sdp->sd_lock);
+ return (err);
+ }
+
+ err = dmu_objset_destroy(snapname);
+
+ mutex_exit(&sdp->sd_lock);
+
+ return (err);
+}
+#endif
+
+/*
+ * Lookup entry point for the 'snapshot' directory. Try to open the
+ * snapshot if it exist, creating the pseudo filesystem vnode as necessary.
+ * Perform a mount of the associated dataset on top of the vnode.
+ */
+/* ARGSUSED */
+int
+zfsctl_snapdir_lookup(ap)
+ struct vop_lookup_args /* {
+ struct vnode *a_dvp;
+ struct vnode **a_vpp;
+ struct componentname *a_cnp;
+ } */ *ap;
+{
+ vnode_t *dvp = ap->a_dvp;
+ vnode_t **vpp = ap->a_vpp;
+ char nm[NAME_MAX + 1];
+ zfsctl_snapdir_t *sdp = dvp->v_data;
+ objset_t *snap;
+ char snapname[MAXNAMELEN];
+ char *mountpoint;
+ zfs_snapentry_t *sep, search;
+ size_t mountpoint_len;
+ avl_index_t where;
+ zfsvfs_t *zfsvfs = dvp->v_vfsp->vfs_data;
+ int err;
+
+ ASSERT(ap->a_cnp->cn_namelen < sizeof(nm));
+ strlcpy(nm, ap->a_cnp->cn_nameptr, ap->a_cnp->cn_namelen + 1);
+
+ ASSERT(dvp->v_type == VDIR);
+
+ if (gfs_lookup_dot(vpp, dvp, zfsvfs->z_ctldir, nm) == 0)
+ return (0);
+
+ *vpp = NULL;
+
+ /*
+ * If we get a recursive call, that means we got called
+ * from the domount() code while it was trying to look up the
+ * spec (which looks like a local path for zfs). We need to
+ * add some flag to domount() to tell it not to do this lookup.
+ */
+ if (MUTEX_HELD(&sdp->sd_lock))
+ return (ENOENT);
+
+ ZFS_ENTER(zfsvfs);
+
+ mutex_enter(&sdp->sd_lock);
+ search.se_name = (char *)nm;
+ if ((sep = avl_find(&sdp->sd_snaps, &search, &where)) != NULL) {
+ *vpp = sep->se_root;
+ VN_HOLD(*vpp);
+ if ((*vpp)->v_mountedhere == NULL) {
+ /*
+ * The snapshot was unmounted behind our backs,
+ * try to remount it.
+ */
+ goto domount;
+ }
+ vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, ap->a_cnp->cn_thread);
+ mutex_exit(&sdp->sd_lock);
+ ZFS_EXIT(zfsvfs);
+ return (0);
+ }
+
+ /*
+ * The requested snapshot is not currently mounted, look it up.
+ */
+ err = zfsctl_snapshot_zname(dvp, nm, MAXNAMELEN, snapname);
+ if (err) {
+ mutex_exit(&sdp->sd_lock);
+ ZFS_EXIT(zfsvfs);
+ return (err);
+ }
+ if (dmu_objset_open(snapname, DMU_OST_ZFS,
+ DS_MODE_STANDARD | DS_MODE_READONLY, &snap) != 0) {
+ mutex_exit(&sdp->sd_lock);
+ ZFS_EXIT(zfsvfs);
+ return (ENOENT);
+ }
+
+ sep = kmem_alloc(sizeof (zfs_snapentry_t), KM_SLEEP);
+ sep->se_name = kmem_alloc(strlen(nm) + 1, KM_SLEEP);
+ (void) strcpy(sep->se_name, nm);
+ *vpp = sep->se_root = zfsctl_snapshot_mknode(dvp, dmu_objset_id(snap));
+ VN_HOLD(*vpp);
+ avl_insert(&sdp->sd_snaps, sep, where);
+
+ dmu_objset_close(snap);
+domount:
+ mountpoint_len = strlen(dvp->v_vfsp->mnt_stat.f_mntonname) +
+ strlen("/.zfs/snapshot/") + strlen(nm) + 1;
+ mountpoint = kmem_alloc(mountpoint_len, KM_SLEEP);
+ (void) snprintf(mountpoint, mountpoint_len, "%s/.zfs/snapshot/%s",
+ dvp->v_vfsp->mnt_stat.f_mntonname, nm);
+ err = domount(curthread, *vpp, "zfs", mountpoint, snapname, 0);
+ kmem_free(mountpoint, mountpoint_len);
+ /* FreeBSD: This line was moved from below to avoid a lock recursion. */
+ if (err == 0)
+ vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, curthread);
+ mutex_exit(&sdp->sd_lock);
+
+ /*
+ * If we had an error, drop our hold on the vnode and
+ * zfsctl_snapshot_inactive() will clean up.
+ */
+ if (err) {
+ VN_RELE(*vpp);
+ *vpp = NULL;
+ }
+ return (err);
+}
+
+/* ARGSUSED */
+static int
+zfsctl_snapdir_readdir_cb(vnode_t *vp, struct dirent64 *dp, int *eofp,
+ offset_t *offp, offset_t *nextp, void *data)
+{
+ zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
+ char snapname[MAXNAMELEN];
+ uint64_t id, cookie;
+
+ ZFS_ENTER(zfsvfs);
+
+ cookie = *offp;
+ if (dmu_snapshot_list_next(zfsvfs->z_os, MAXNAMELEN, snapname, &id,
+ &cookie) == ENOENT) {
+ *eofp = 1;
+ ZFS_EXIT(zfsvfs);
+ return (0);
+ }
+
+ (void) strcpy(dp->d_name, snapname);
+ dp->d_ino = ZFSCTL_INO_SNAP(id);
+ *nextp = cookie;
+
+ ZFS_EXIT(zfsvfs);
+
+ return (0);
+}
+
+vnode_t *
+zfsctl_mknode_snapdir(vnode_t *pvp)
+{
+ vnode_t *vp;
+ zfsctl_snapdir_t *sdp;
+
+ vp = gfs_dir_create(sizeof (zfsctl_snapdir_t), pvp, pvp->v_vfsp,
+ &zfsctl_ops_snapdir, NULL, NULL, MAXNAMELEN,
+ zfsctl_snapdir_readdir_cb, NULL);
+ sdp = vp->v_data;
+ sdp->sd_node.zc_id = ZFSCTL_INO_SNAPDIR;
+ sdp->sd_node.zc_cmtime = ((zfsctl_node_t *)pvp->v_data)->zc_cmtime;
+ mutex_init(&sdp->sd_lock, NULL, MUTEX_DEFAULT, NULL);
+ avl_create(&sdp->sd_snaps, snapentry_compare,
+ sizeof (zfs_snapentry_t), offsetof(zfs_snapentry_t, se_node));
+ return (vp);
+}
+
+/* ARGSUSED */
+static int
+zfsctl_snapdir_getattr(ap)
+ struct vop_getattr_args /* {
+ struct vnode *a_vp;
+ struct vattr *a_vap;
+ struct ucred *a_cred;
+ struct thread *a_td;
+ } */ *ap;
+{
+ struct vnode *vp = ap->a_vp;
+ struct vattr *vap = ap->a_vap;
+ zfsvfs_t *zfsvfs = vp->v_vfsp->vfs_data;
+ zfsctl_snapdir_t *sdp = vp->v_data;
+
+ ZFS_ENTER(zfsvfs);
+ zfsctl_common_getattr(vp, vap);
+ vap->va_nodeid = gfs_file_inode(vp);
+ vap->va_nlink = vap->va_size = avl_numnodes(&sdp->sd_snaps) + 2;
+ ZFS_EXIT(zfsvfs);
+
+ return (0);
+}
+
+/* ARGSUSED */
+static int
+zfsctl_snapdir_inactive(ap)
+ struct vop_inactive_args /* {
+ struct vnode *a_vp;
+ struct thread *a_td;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+ zfsctl_snapdir_t *sdp = vp->v_data;
+ void *private;
+
+ private = gfs_dir_inactive(vp);
+ if (private != NULL) {
+ ASSERT(avl_numnodes(&sdp->sd_snaps) == 0);
+ mutex_destroy(&sdp->sd_lock);
+ avl_destroy(&sdp->sd_snaps);
+ kmem_free(private, sizeof (zfsctl_snapdir_t));
+ }
+ return (0);
+}
+
+static struct vop_vector zfsctl_ops_snapdir = {
+ .vop_default = &default_vnodeops,
+ .vop_open = zfsctl_common_open,
+ .vop_close = zfsctl_common_close,
+ .vop_ioctl = VOP_EINVAL,
+ .vop_getattr = zfsctl_snapdir_getattr,
+ .vop_access = zfsctl_common_access,
+ .vop_readdir = gfs_vop_readdir,
+ .vop_lookup = zfsctl_snapdir_lookup,
+ .vop_inactive = zfsctl_snapdir_inactive,
+ .vop_reclaim = zfsctl_common_reclaim,
+ .vop_fid = zfsctl_common_fid,
+};
+
+static vnode_t *
+zfsctl_snapshot_mknode(vnode_t *pvp, uint64_t objset)
+{
+ vnode_t *vp;
+ zfsctl_node_t *zcp;
+
+ vp = gfs_dir_create(sizeof (zfsctl_node_t), pvp, pvp->v_vfsp,
+ &zfsctl_ops_snapshot, NULL, NULL, MAXNAMELEN, NULL, NULL);
+ zcp = vp->v_data;
+ zcp->zc_id = objset;
+
+ return (vp);
+}
+
+static int
+zfsctl_snapshot_inactive(ap)
+ struct vop_inactive_args /* {
+ struct vnode *a_vp;
+ struct thread *a_td;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+ struct vop_inactive_args iap;
+ zfsctl_snapdir_t *sdp;
+ zfs_snapentry_t *sep, *next;
+ int locked;
+ vnode_t *dvp;
+
+ VERIFY(gfs_dir_lookup(vp, "..", &dvp) == 0);
+ sdp = dvp->v_data;
+ VOP_UNLOCK(dvp, 0, ap->a_td);
+
+ if (!(locked = MUTEX_HELD(&sdp->sd_lock)))
+ mutex_enter(&sdp->sd_lock);
+
+ if (vp->v_count > 1) {
+ if (!locked)
+ mutex_exit(&sdp->sd_lock);
+ return (0);
+ }
+ ASSERT(!vn_ismntpt(vp));
+
+ sep = avl_first(&sdp->sd_snaps);
+ while (sep != NULL) {
+ next = AVL_NEXT(&sdp->sd_snaps, sep);
+
+ if (sep->se_root == vp) {
+ avl_remove(&sdp->sd_snaps, sep);
+ kmem_free(sep->se_name, strlen(sep->se_name) + 1);
+ kmem_free(sep, sizeof (zfs_snapentry_t));
+ break;
+ }
+ sep = next;
+ }
+ ASSERT(sep != NULL);
+
+ if (!locked)
+ mutex_exit(&sdp->sd_lock);
+ VN_RELE(dvp);
+
+ /*
+ * Dispose of the vnode for the snapshot mount point.
+ * This is safe to do because once this entry has been removed
+ * from the AVL tree, it can't be found again, so cannot become
+ * "active". If we lookup the same name again we will end up
+ * creating a new vnode.
+ */
+ iap.a_vp = vp;
+ return (gfs_vop_inactive(&iap));
+}
+
+static int
+zfsctl_traverse_begin(vnode_t **vpp, int lktype, kthread_t *td)
+{
+
+ VN_HOLD(*vpp);
+ /* Snapshot should be already mounted, but just in case. */
+ if (vn_mountedvfs(*vpp) == NULL)
+ return (ENOENT);
+ return (traverse(vpp, lktype));
+}
+
+static void
+zfsctl_traverse_end(vnode_t *vp, int err)
+{
+
+ if (err == 0)
+ vput(vp);
+ else
+ VN_RELE(vp);
+}
+
+static int
+zfsctl_snapshot_getattr(ap)
+ struct vop_getattr_args /* {
+ struct vnode *a_vp;
+ struct vattr *a_vap;
+ struct ucred *a_cred;
+ struct thread *a_td;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+ int err;
+
+ err = zfsctl_traverse_begin(&vp, LK_SHARED | LK_RETRY, ap->a_td);
+ if (err == 0)
+ err = VOP_GETATTR(vp, ap->a_vap, ap->a_cred, ap->a_td);
+ zfsctl_traverse_end(vp, err);
+ return (err);
+}
+
+static int
+zfsctl_snapshot_fid(ap)
+ struct vop_fid_args /* {
+ struct vnode *a_vp;
+ struct fid *a_fid;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+ int err;
+
+ err = zfsctl_traverse_begin(&vp, LK_SHARED | LK_RETRY, curthread);
+ if (err == 0)
+ err = VOP_VPTOFH(vp, (void *)ap->a_fid);
+ zfsctl_traverse_end(vp, err);
+ return (err);
+}
+
+/*
+ * These VP's should never see the light of day. They should always
+ * be covered.
+ */
+static struct vop_vector zfsctl_ops_snapshot = {
+ .vop_default = &default_vnodeops,
+ .vop_inactive = zfsctl_snapshot_inactive,
+ .vop_reclaim = zfsctl_common_reclaim,
+ .vop_getattr = zfsctl_snapshot_getattr,
+ .vop_fid = zfsctl_snapshot_fid,
+};
+
+int
+zfsctl_lookup_objset(vfs_t *vfsp, uint64_t objsetid, zfsvfs_t **zfsvfsp)
+{
+ zfsvfs_t *zfsvfs = vfsp->vfs_data;
+ vnode_t *dvp, *vp;
+ zfsctl_snapdir_t *sdp;
+ zfsctl_node_t *zcp;
+ zfs_snapentry_t *sep;
+ int error;
+
+ ASSERT(zfsvfs->z_ctldir != NULL);
+ error = zfsctl_root_lookup(zfsvfs->z_ctldir, "snapshot", &dvp,
+ NULL, 0, NULL, kcred);
+ if (error != 0)
+ return (error);
+ sdp = dvp->v_data;
+
+ mutex_enter(&sdp->sd_lock);
+ sep = avl_first(&sdp->sd_snaps);
+ while (sep != NULL) {
+ vp = sep->se_root;
+ zcp = vp->v_data;
+ if (zcp->zc_id == objsetid)
+ break;
+
+ sep = AVL_NEXT(&sdp->sd_snaps, sep);
+ }
+
+ if (sep != NULL) {
+ VN_HOLD(vp);
+ error = traverse(&vp, LK_SHARED | LK_RETRY);
+ if (error == 0) {
+ if (vp == sep->se_root)
+ error = EINVAL;
+ else
+ *zfsvfsp = VTOZ(vp)->z_zfsvfs;
+ }
+ mutex_exit(&sdp->sd_lock);
+ if (error == 0)
+ VN_URELE(vp);
+ else
+ VN_RELE(vp);
+ } else {
+ error = EINVAL;
+ mutex_exit(&sdp->sd_lock);
+ }
+
+ VN_RELE(dvp);
+
+ return (error);
+}
+
+/*
+ * Unmount any snapshots for the given filesystem. This is called from
+ * zfs_umount() - if we have a ctldir, then go through and unmount all the
+ * snapshots.
+ */
+int
+zfsctl_umount_snapshots(vfs_t *vfsp, int fflags, cred_t *cr)
+{
+ struct vop_inactive_args ap;
+ zfsvfs_t *zfsvfs = vfsp->vfs_data;
+ vnode_t *dvp, *svp;
+ zfsctl_snapdir_t *sdp;
+ zfs_snapentry_t *sep, *next;
+ int error;
+
+ ASSERT(zfsvfs->z_ctldir != NULL);
+ error = zfsctl_root_lookup(zfsvfs->z_ctldir, "snapshot", &dvp,
+ NULL, 0, NULL, cr);
+ if (error != 0)
+ return (error);
+ sdp = dvp->v_data;
+
+ mutex_enter(&sdp->sd_lock);
+
+ sep = avl_first(&sdp->sd_snaps);
+ while (sep != NULL) {
+ svp = sep->se_root;
+ next = AVL_NEXT(&sdp->sd_snaps, sep);
+
+ /*
+ * If this snapshot is not mounted, then it must
+ * have just been unmounted by somebody else, and
+ * will be cleaned up by zfsctl_snapdir_inactive().
+ */
+ if (vn_ismntpt(svp)) {
+ if ((error = vn_vfswlock(svp)) != 0)
+ goto out;
+
+ /*
+ * Increase usecount, so dounmount() won't vrele() it
+ * to 0 and call zfsctl_snapdir_inactive().
+ */
+ VN_HOLD(svp);
+ vfsp = vn_mountedvfs(svp);
+ mtx_lock(&Giant);
+ error = dounmount(vfsp, fflags, curthread);
+ mtx_unlock(&Giant);
+ if (error != 0) {
+ VN_RELE(svp);
+ goto out;
+ }
+
+ avl_remove(&sdp->sd_snaps, sep);
+ kmem_free(sep->se_name, strlen(sep->se_name) + 1);
+ kmem_free(sep, sizeof (zfs_snapentry_t));
+
+ /*
+ * We can't use VN_RELE(), as that will try to
+ * invoke zfsctl_snapdir_inactive(), and that
+ * would lead to an attempt to re-grab the sd_lock.
+ */
+ ASSERT3U(svp->v_count, ==, 1);
+ ap.a_vp = svp;
+ gfs_vop_inactive(&ap);
+ }
+ sep = next;
+ }
+out:
+ mutex_exit(&sdp->sd_lock);
+ VN_RELE(dvp);
+
+ return (error);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
new file mode 100644
index 0000000..f233b8f
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_dir.c
@@ -0,0 +1,797 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/systm.h>
+#include <sys/sysmacros.h>
+#include <sys/resource.h>
+#include <sys/vfs.h>
+#include <sys/vnode.h>
+#include <sys/file.h>
+#include <sys/kmem.h>
+#include <sys/uio.h>
+#include <sys/cmn_err.h>
+#include <sys/errno.h>
+#include <sys/stat.h>
+#include <sys/unistd.h>
+#include <sys/random.h>
+#include <sys/policy.h>
+#include <sys/kcondvar.h>
+#include <sys/callb.h>
+#include <sys/smp.h>
+#include <sys/zfs_dir.h>
+#include <sys/zfs_acl.h>
+#include <sys/fs/zfs.h>
+#include <sys/zap.h>
+#include <sys/dmu.h>
+#include <sys/atomic.h>
+#include <sys/zfs_ctldir.h>
+#include <sys/dnlc.h>
+
+/*
+ * Lock a directory entry. A dirlock on <dzp, name> protects that name
+ * in dzp's directory zap object. As long as you hold a dirlock, you can
+ * assume two things: (1) dzp cannot be reaped, and (2) no other thread
+ * can change the zap entry for (i.e. link or unlink) this name.
+ *
+ * Input arguments:
+ * dzp - znode for directory
+ * name - name of entry to lock
+ * flag - ZNEW: if the entry already exists, fail with EEXIST.
+ * ZEXISTS: if the entry does not exist, fail with ENOENT.
+ * ZSHARED: allow concurrent access with other ZSHARED callers.
+ * ZXATTR: we want dzp's xattr directory
+ *
+ * Output arguments:
+ * zpp - pointer to the znode for the entry (NULL if there isn't one)
+ * dlpp - pointer to the dirlock for this entry (NULL on error)
+ *
+ * Return value: 0 on success or errno on failure.
+ *
+ * NOTE: Always checks for, and rejects, '.' and '..'.
+ */
+int
+zfs_dirent_lock(zfs_dirlock_t **dlpp, znode_t *dzp, char *name, znode_t **zpp,
+ int flag)
+{
+ zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
+ zfs_dirlock_t *dl;
+ uint64_t zoid;
+ int error;
+ vnode_t *vp;
+
+ *zpp = NULL;
+ *dlpp = NULL;
+
+ /*
+ * Verify that we are not trying to lock '.', '..', or '.zfs'
+ */
+ if (name[0] == '.' &&
+ (name[1] == '\0' || (name[1] == '.' && name[2] == '\0')) ||
+ zfs_has_ctldir(dzp) && strcmp(name, ZFS_CTLDIR_NAME) == 0)
+ return (EEXIST);
+
+ /*
+ * Wait until there are no locks on this name.
+ */
+ rw_enter(&dzp->z_name_lock, RW_READER);
+ mutex_enter(&dzp->z_lock);
+ for (;;) {
+ if (dzp->z_unlinked) {
+ mutex_exit(&dzp->z_lock);
+ rw_exit(&dzp->z_name_lock);
+ return (ENOENT);
+ }
+ for (dl = dzp->z_dirlocks; dl != NULL; dl = dl->dl_next)
+ if (strcmp(name, dl->dl_name) == 0)
+ break;
+ if (dl == NULL) {
+ /*
+ * Allocate a new dirlock and add it to the list.
+ */
+ dl = kmem_alloc(sizeof (zfs_dirlock_t), KM_SLEEP);
+ cv_init(&dl->dl_cv, NULL, CV_DEFAULT, NULL);
+ dl->dl_name = name;
+ dl->dl_sharecnt = 0;
+ dl->dl_namesize = 0;
+ dl->dl_dzp = dzp;
+ dl->dl_next = dzp->z_dirlocks;
+ dzp->z_dirlocks = dl;
+ break;
+ }
+ if ((flag & ZSHARED) && dl->dl_sharecnt != 0)
+ break;
+ cv_wait(&dl->dl_cv, &dzp->z_lock);
+ }
+
+ if ((flag & ZSHARED) && ++dl->dl_sharecnt > 1 && dl->dl_namesize == 0) {
+ /*
+ * We're the second shared reference to dl. Make a copy of
+ * dl_name in case the first thread goes away before we do.
+ * Note that we initialize the new name before storing its
+ * pointer into dl_name, because the first thread may load
+ * dl->dl_name at any time. He'll either see the old value,
+ * which is his, or the new shared copy; either is OK.
+ */
+ dl->dl_namesize = strlen(dl->dl_name) + 1;
+ name = kmem_alloc(dl->dl_namesize, KM_SLEEP);
+ bcopy(dl->dl_name, name, dl->dl_namesize);
+ dl->dl_name = name;
+ }
+
+ mutex_exit(&dzp->z_lock);
+
+ /*
+ * We have a dirlock on the name. (Note that it is the dirlock,
+ * not the dzp's z_lock, that protects the name in the zap object.)
+ * See if there's an object by this name; if so, put a hold on it.
+ */
+ if (flag & ZXATTR) {
+ zoid = dzp->z_phys->zp_xattr;
+ error = (zoid == 0 ? ENOENT : 0);
+ } else {
+ vp = dnlc_lookup(ZTOV(dzp), name);
+ if (vp == DNLC_NO_VNODE) {
+ VN_RELE(vp);
+ error = ENOENT;
+ } else if (vp) {
+ if (flag & ZNEW) {
+ zfs_dirent_unlock(dl);
+ VN_RELE(vp);
+ return (EEXIST);
+ }
+ *dlpp = dl;
+ *zpp = VTOZ(vp);
+ return (0);
+ } else {
+ error = zap_lookup(zfsvfs->z_os, dzp->z_id, name,
+ 8, 1, &zoid);
+ zoid = ZFS_DIRENT_OBJ(zoid);
+ if (error == ENOENT)
+ dnlc_update(ZTOV(dzp), name, DNLC_NO_VNODE);
+ }
+ }
+ if (error) {
+ if (error != ENOENT || (flag & ZEXISTS)) {
+ zfs_dirent_unlock(dl);
+ return (error);
+ }
+ } else {
+ if (flag & ZNEW) {
+ zfs_dirent_unlock(dl);
+ return (EEXIST);
+ }
+ error = zfs_zget(zfsvfs, zoid, zpp);
+ if (error) {
+ zfs_dirent_unlock(dl);
+ return (error);
+ }
+ if (!(flag & ZXATTR))
+ dnlc_update(ZTOV(dzp), name, ZTOV(*zpp));
+ }
+
+ *dlpp = dl;
+
+ return (0);
+}
+
+/*
+ * Unlock this directory entry and wake anyone who was waiting for it.
+ */
+void
+zfs_dirent_unlock(zfs_dirlock_t *dl)
+{
+ znode_t *dzp = dl->dl_dzp;
+ zfs_dirlock_t **prev_dl, *cur_dl;
+
+ mutex_enter(&dzp->z_lock);
+ rw_exit(&dzp->z_name_lock);
+ if (dl->dl_sharecnt > 1) {
+ dl->dl_sharecnt--;
+ mutex_exit(&dzp->z_lock);
+ return;
+ }
+ prev_dl = &dzp->z_dirlocks;
+ while ((cur_dl = *prev_dl) != dl)
+ prev_dl = &cur_dl->dl_next;
+ *prev_dl = dl->dl_next;
+ cv_broadcast(&dl->dl_cv);
+ mutex_exit(&dzp->z_lock);
+
+ if (dl->dl_namesize != 0)
+ kmem_free(dl->dl_name, dl->dl_namesize);
+ cv_destroy(&dl->dl_cv);
+ kmem_free(dl, sizeof (*dl));
+}
+
+/*
+ * Look up an entry in a directory.
+ *
+ * NOTE: '.' and '..' are handled as special cases because
+ * no directory entries are actually stored for them. If this is
+ * the root of a filesystem, then '.zfs' is also treated as a
+ * special pseudo-directory.
+ */
+int
+zfs_dirlook(znode_t *dzp, char *name, vnode_t **vpp)
+{
+ zfs_dirlock_t *dl;
+ znode_t *zp;
+ int error = 0;
+
+ if (name[0] == 0 || (name[0] == '.' && name[1] == 0)) {
+ *vpp = ZTOV(dzp);
+ VN_HOLD(*vpp);
+ } else if (name[0] == '.' && name[1] == '.' && name[2] == 0) {
+ zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
+ /*
+ * If we are a snapshot mounted under .zfs, return
+ * the vp for the snapshot directory.
+ */
+ if (dzp->z_phys->zp_parent == dzp->z_id &&
+ zfsvfs->z_parent != zfsvfs) {
+ error = zfsctl_root_lookup(zfsvfs->z_parent->z_ctldir,
+ "snapshot", vpp, NULL, 0, NULL, kcred);
+ return (error);
+ }
+ rw_enter(&dzp->z_parent_lock, RW_READER);
+ error = zfs_zget(zfsvfs, dzp->z_phys->zp_parent, &zp);
+ if (error == 0)
+ *vpp = ZTOV(zp);
+ rw_exit(&dzp->z_parent_lock);
+ } else if (zfs_has_ctldir(dzp) && strcmp(name, ZFS_CTLDIR_NAME) == 0) {
+ *vpp = zfsctl_root(dzp);
+ } else {
+ error = zfs_dirent_lock(&dl, dzp, name, &zp, ZEXISTS | ZSHARED);
+ if (error == 0) {
+ *vpp = ZTOV(zp);
+ zfs_dirent_unlock(dl);
+ dzp->z_zn_prefetch = B_TRUE; /* enable prefetching */
+ }
+ }
+
+ return (error);
+}
+
+static char *
+zfs_unlinked_hexname(char namebuf[17], uint64_t x)
+{
+ char *name = &namebuf[16];
+ const char digits[16] = "0123456789abcdef";
+
+ *name = '\0';
+ do {
+ *--name = digits[x & 0xf];
+ x >>= 4;
+ } while (x != 0);
+
+ return (name);
+}
+
+/*
+ * unlinked Set (formerly known as the "delete queue") Error Handling
+ *
+ * When dealing with the unlinked set, we dmu_tx_hold_zap(), but we
+ * don't specify the name of the entry that we will be manipulating. We
+ * also fib and say that we won't be adding any new entries to the
+ * unlinked set, even though we might (this is to lower the minimum file
+ * size that can be deleted in a full filesystem). So on the small
+ * chance that the nlink list is using a fat zap (ie. has more than
+ * 2000 entries), we *may* not pre-read a block that's needed.
+ * Therefore it is remotely possible for some of the assertions
+ * regarding the unlinked set below to fail due to i/o error. On a
+ * nondebug system, this will result in the space being leaked.
+ */
+void
+zfs_unlinked_add(znode_t *zp, dmu_tx_t *tx)
+{
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ char obj_name[17];
+ int error;
+
+ ASSERT(zp->z_unlinked);
+ ASSERT3U(zp->z_phys->zp_links, ==, 0);
+
+ error = zap_add(zfsvfs->z_os, zfsvfs->z_unlinkedobj,
+ zfs_unlinked_hexname(obj_name, zp->z_id), 8, 1, &zp->z_id, tx);
+ ASSERT3U(error, ==, 0);
+}
+
+/*
+ * Clean up any znodes that had no links when we either crashed or
+ * (force) umounted the file system.
+ */
+void
+zfs_unlinked_drain(zfsvfs_t *zfsvfs)
+{
+ zap_cursor_t zc;
+ zap_attribute_t zap;
+ dmu_object_info_t doi;
+ znode_t *zp;
+ int error;
+
+ /*
+ * Interate over the contents of the unlinked set.
+ */
+ for (zap_cursor_init(&zc, zfsvfs->z_os, zfsvfs->z_unlinkedobj);
+ zap_cursor_retrieve(&zc, &zap) == 0;
+ zap_cursor_advance(&zc)) {
+
+ /*
+ * See what kind of object we have in list
+ */
+
+ error = dmu_object_info(zfsvfs->z_os,
+ zap.za_first_integer, &doi);
+ if (error != 0)
+ continue;
+
+ ASSERT((doi.doi_type == DMU_OT_PLAIN_FILE_CONTENTS) ||
+ (doi.doi_type == DMU_OT_DIRECTORY_CONTENTS));
+ /*
+ * We need to re-mark these list entries for deletion,
+ * so we pull them back into core and set zp->z_unlinked.
+ */
+ error = zfs_zget(zfsvfs, zap.za_first_integer, &zp);
+
+ /*
+ * We may pick up znodes that are already marked for deletion.
+ * This could happen during the purge of an extended attribute
+ * directory. All we need to do is skip over them, since they
+ * are already in the system marked z_unlinked.
+ */
+ if (error != 0)
+ continue;
+
+ zp->z_unlinked = B_TRUE;
+ VN_RELE(ZTOV(zp));
+ }
+ zap_cursor_fini(&zc);
+}
+
+/*
+ * Delete the entire contents of a directory. Return a count
+ * of the number of entries that could not be deleted.
+ *
+ * NOTE: this function assumes that the directory is inactive,
+ * so there is no need to lock its entries before deletion.
+ * Also, it assumes the directory contents is *only* regular
+ * files.
+ */
+static int
+zfs_purgedir(znode_t *dzp)
+{
+ zap_cursor_t zc;
+ zap_attribute_t zap;
+ znode_t *xzp;
+ dmu_tx_t *tx;
+ zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
+ zfs_dirlock_t dl;
+ int skipped = 0;
+ int error;
+
+ for (zap_cursor_init(&zc, zfsvfs->z_os, dzp->z_id);
+ (error = zap_cursor_retrieve(&zc, &zap)) == 0;
+ zap_cursor_advance(&zc)) {
+ error = zfs_zget(zfsvfs,
+ ZFS_DIRENT_OBJ(zap.za_first_integer), &xzp);
+ ASSERT3U(error, ==, 0);
+
+ ASSERT((ZTOV(xzp)->v_type == VREG) ||
+ (ZTOV(xzp)->v_type == VLNK));
+
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_bonus(tx, dzp->z_id);
+ dmu_tx_hold_zap(tx, dzp->z_id, FALSE, zap.za_name);
+ dmu_tx_hold_bonus(tx, xzp->z_id);
+ dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, FALSE, NULL);
+ error = dmu_tx_assign(tx, TXG_WAIT);
+ if (error) {
+ dmu_tx_abort(tx);
+ VN_RELE(ZTOV(xzp));
+ skipped += 1;
+ continue;
+ }
+ bzero(&dl, sizeof (dl));
+ dl.dl_dzp = dzp;
+ dl.dl_name = zap.za_name;
+
+ error = zfs_link_destroy(&dl, xzp, tx, 0, NULL);
+ ASSERT3U(error, ==, 0);
+ dmu_tx_commit(tx);
+
+ VN_RELE(ZTOV(xzp));
+ }
+ zap_cursor_fini(&zc);
+ ASSERT(error == ENOENT);
+ return (skipped);
+}
+
+void
+zfs_rmnode(znode_t *zp)
+{
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ objset_t *os = zfsvfs->z_os;
+ znode_t *xzp = NULL;
+ char obj_name[17];
+ dmu_tx_t *tx;
+ uint64_t acl_obj;
+ int error;
+ int vfslocked;
+
+ vfslocked = VFS_LOCK_GIANT(zfsvfs->z_vfs);
+
+ ASSERT(zp->z_phys->zp_links == 0);
+
+ /*
+ * If this is an attribute directory, purge its contents.
+ */
+ if (ZTOV(zp) != NULL && ZTOV(zp)->v_type == VDIR &&
+ (zp->z_phys->zp_flags & ZFS_XATTR)) {
+ if (zfs_purgedir(zp) != 0) {
+ /*
+ * Not enough space to delete some xattrs.
+ * Leave it on the unlinked set.
+ */
+ VFS_UNLOCK_GIANT(vfslocked);
+ return;
+ }
+ }
+
+ /*
+ * If the file has extended attributes, we're going to unlink
+ * the xattr dir.
+ */
+ if (zp->z_phys->zp_xattr) {
+ error = zfs_zget(zfsvfs, zp->z_phys->zp_xattr, &xzp);
+ ASSERT(error == 0);
+ }
+
+ acl_obj = zp->z_phys->zp_acl.z_acl_extern_obj;
+
+ /*
+ * Set up the transaction.
+ */
+ tx = dmu_tx_create(os);
+ dmu_tx_hold_free(tx, zp->z_id, 0, DMU_OBJECT_END);
+ dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, FALSE, NULL);
+ if (xzp) {
+ dmu_tx_hold_bonus(tx, xzp->z_id);
+ dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, TRUE, NULL);
+ }
+ if (acl_obj)
+ dmu_tx_hold_free(tx, acl_obj, 0, DMU_OBJECT_END);
+ error = dmu_tx_assign(tx, TXG_WAIT);
+ if (error) {
+ /*
+ * Not enough space to delete the file. Leave it in the
+ * unlinked set, leaking it until the fs is remounted (at
+ * which point we'll call zfs_unlinked_drain() to process it).
+ */
+ dmu_tx_abort(tx);
+ VFS_UNLOCK_GIANT(vfslocked);
+ return;
+ }
+
+ if (xzp) {
+ dmu_buf_will_dirty(xzp->z_dbuf, tx);
+ mutex_enter(&xzp->z_lock);
+ xzp->z_unlinked = B_TRUE; /* mark xzp for deletion */
+ xzp->z_phys->zp_links = 0; /* no more links to it */
+ mutex_exit(&xzp->z_lock);
+ zfs_unlinked_add(xzp, tx);
+ }
+
+ /* Remove this znode from the unlinked set */
+ error = zap_remove(os, zfsvfs->z_unlinkedobj,
+ zfs_unlinked_hexname(obj_name, zp->z_id), tx);
+ ASSERT3U(error, ==, 0);
+
+ zfs_znode_delete(zp, tx);
+
+ dmu_tx_commit(tx);
+
+ if (xzp)
+ VN_RELE(ZTOV(xzp));
+ VFS_UNLOCK_GIANT(vfslocked);
+}
+
+/*
+ * Link zp into dl. Can only fail if zp has been unlinked.
+ */
+int
+zfs_link_create(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag)
+{
+ znode_t *dzp = dl->dl_dzp;
+ vnode_t *vp = ZTOV(zp);
+ uint64_t value;
+ int zp_is_dir = (vp->v_type == VDIR);
+ int error;
+
+ dmu_buf_will_dirty(zp->z_dbuf, tx);
+ mutex_enter(&zp->z_lock);
+
+ if (!(flag & ZRENAMING)) {
+ if (zp->z_unlinked) { /* no new links to unlinked zp */
+ ASSERT(!(flag & (ZNEW | ZEXISTS)));
+ mutex_exit(&zp->z_lock);
+ return (ENOENT);
+ }
+ zp->z_phys->zp_links++;
+ }
+ zp->z_phys->zp_parent = dzp->z_id; /* dzp is now zp's parent */
+
+ if (!(flag & ZNEW))
+ zfs_time_stamper_locked(zp, STATE_CHANGED, tx);
+ mutex_exit(&zp->z_lock);
+
+ dmu_buf_will_dirty(dzp->z_dbuf, tx);
+ mutex_enter(&dzp->z_lock);
+ dzp->z_phys->zp_size++; /* one dirent added */
+ dzp->z_phys->zp_links += zp_is_dir; /* ".." link from zp */
+ zfs_time_stamper_locked(dzp, CONTENT_MODIFIED, tx);
+ mutex_exit(&dzp->z_lock);
+
+ /*
+ * MacOS X will fill in the 4-bit object type here.
+ */
+ value = ZFS_DIRENT_MAKE(IFTODT(zp->z_phys->zp_mode), zp->z_id);
+ error = zap_add(zp->z_zfsvfs->z_os, dzp->z_id, dl->dl_name,
+ 8, 1, &value, tx);
+ ASSERT(error == 0);
+
+ dnlc_update(ZTOV(dzp), dl->dl_name, vp);
+
+ return (0);
+}
+
+/*
+ * Unlink zp from dl, and mark zp for deletion if this was the last link.
+ * Can fail if zp is a mount point (EBUSY) or a non-empty directory (EEXIST).
+ * If 'unlinkedp' is NULL, we put unlinked znodes on the unlinked list.
+ * If it's non-NULL, we use it to indicate whether the znode needs deletion,
+ * and it's the caller's job to do it.
+ */
+int
+zfs_link_destroy(zfs_dirlock_t *dl, znode_t *zp, dmu_tx_t *tx, int flag,
+ boolean_t *unlinkedp)
+{
+ znode_t *dzp = dl->dl_dzp;
+ vnode_t *vp = ZTOV(zp);
+ int zp_is_dir = (vp->v_type == VDIR);
+ boolean_t unlinked = B_FALSE;
+ int error;
+
+ dnlc_remove(ZTOV(dzp), dl->dl_name);
+
+ if (!(flag & ZRENAMING)) {
+ dmu_buf_will_dirty(zp->z_dbuf, tx);
+
+ if (vn_vfswlock(vp)) /* prevent new mounts on zp */
+ return (EBUSY);
+
+ if (vn_ismntpt(vp)) { /* don't remove mount point */
+ vn_vfsunlock(vp);
+ return (EBUSY);
+ }
+
+ mutex_enter(&zp->z_lock);
+ if (zp_is_dir && !zfs_dirempty(zp)) { /* dir not empty */
+ mutex_exit(&zp->z_lock);
+ vn_vfsunlock(vp);
+ return (ENOTEMPTY);
+ }
+ if (zp->z_phys->zp_links <= zp_is_dir) {
+ zfs_panic_recover("zfs: link count on vnode %p is %u, "
+ "should be at least %u", zp->z_vnode,
+ (int)zp->z_phys->zp_links,
+ zp_is_dir + 1);
+ zp->z_phys->zp_links = zp_is_dir + 1;
+ }
+ if (--zp->z_phys->zp_links == zp_is_dir) {
+ zp->z_unlinked = B_TRUE;
+ zp->z_phys->zp_links = 0;
+ unlinked = B_TRUE;
+ } else {
+ zfs_time_stamper_locked(zp, STATE_CHANGED, tx);
+ }
+ mutex_exit(&zp->z_lock);
+ vn_vfsunlock(vp);
+ }
+
+ dmu_buf_will_dirty(dzp->z_dbuf, tx);
+ mutex_enter(&dzp->z_lock);
+ dzp->z_phys->zp_size--; /* one dirent removed */
+ dzp->z_phys->zp_links -= zp_is_dir; /* ".." link from zp */
+ zfs_time_stamper_locked(dzp, CONTENT_MODIFIED, tx);
+ mutex_exit(&dzp->z_lock);
+
+ error = zap_remove(zp->z_zfsvfs->z_os, dzp->z_id, dl->dl_name, tx);
+ ASSERT(error == 0);
+
+ if (unlinkedp != NULL)
+ *unlinkedp = unlinked;
+ else if (unlinked)
+ zfs_unlinked_add(zp, tx);
+
+ return (0);
+}
+
+/*
+ * Indicate whether the directory is empty. Works with or without z_lock
+ * held, but can only be consider a hint in the latter case. Returns true
+ * if only "." and ".." remain and there's no work in progress.
+ */
+boolean_t
+zfs_dirempty(znode_t *dzp)
+{
+ return (dzp->z_phys->zp_size == 2 && dzp->z_dirlocks == 0);
+}
+
+int
+zfs_make_xattrdir(znode_t *zp, vattr_t *vap, vnode_t **xvpp, cred_t *cr)
+{
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ znode_t *xzp;
+ dmu_tx_t *tx;
+ uint64_t xoid;
+ int error;
+
+ *xvpp = NULL;
+
+ if (error = zfs_zaccess(zp, ACE_WRITE_NAMED_ATTRS, cr))
+ return (error);
+
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_bonus(tx, zp->z_id);
+ dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT)
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ return (error);
+ }
+ zfs_mknode(zp, vap, &xoid, tx, cr, IS_XATTR, &xzp, 0);
+ ASSERT(xzp->z_id == xoid);
+ ASSERT(xzp->z_phys->zp_parent == zp->z_id);
+ dmu_buf_will_dirty(zp->z_dbuf, tx);
+ zp->z_phys->zp_xattr = xoid;
+
+ (void) zfs_log_create(zfsvfs->z_log, tx, TX_MKXATTR, zp, xzp, "");
+ dmu_tx_commit(tx);
+
+ *xvpp = ZTOV(xzp);
+
+ return (0);
+}
+
+/*
+ * Return a znode for the extended attribute directory for zp.
+ * ** If the directory does not already exist, it is created **
+ *
+ * IN: zp - znode to obtain attribute directory from
+ * cr - credentials of caller
+ * flags - flags from the VOP_LOOKUP call
+ *
+ * OUT: xzpp - pointer to extended attribute znode
+ *
+ * RETURN: 0 on success
+ * error number on failure
+ */
+int
+zfs_get_xattrdir(znode_t *zp, vnode_t **xvpp, cred_t *cr, int flags)
+{
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ znode_t *xzp;
+ zfs_dirlock_t *dl;
+ vattr_t va;
+ int error;
+top:
+ error = zfs_dirent_lock(&dl, zp, "", &xzp, ZXATTR);
+ if (error)
+ return (error);
+
+ if (xzp != NULL) {
+ *xvpp = ZTOV(xzp);
+ zfs_dirent_unlock(dl);
+ return (0);
+ }
+
+ ASSERT(zp->z_phys->zp_xattr == 0);
+
+#ifdef TODO
+ if (!(flags & CREATE_XATTR_DIR)) {
+ zfs_dirent_unlock(dl);
+ return (ENOENT);
+ }
+#endif
+
+ if (zfsvfs->z_vfs->vfs_flag & VFS_RDONLY) {
+ zfs_dirent_unlock(dl);
+ return (EROFS);
+ }
+
+ /*
+ * The ability to 'create' files in an attribute
+ * directory comes from the write_xattr permission on the base file.
+ *
+ * The ability to 'search' an attribute directory requires
+ * read_xattr permission on the base file.
+ *
+ * Once in a directory the ability to read/write attributes
+ * is controlled by the permissions on the attribute file.
+ */
+ va.va_mask = AT_TYPE | AT_MODE | AT_UID | AT_GID;
+ va.va_type = VDIR;
+ va.va_mode = S_IFDIR | S_ISVTX | 0777;
+ va.va_uid = (uid_t)zp->z_phys->zp_uid;
+ va.va_gid = (gid_t)zp->z_phys->zp_gid;
+
+ error = zfs_make_xattrdir(zp, &va, xvpp, cr);
+ zfs_dirent_unlock(dl);
+
+ if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT) {
+ /* NB: we already did dmu_tx_wait() if necessary */
+ goto top;
+ }
+
+ return (error);
+}
+
+/*
+ * Decide whether it is okay to remove within a sticky directory.
+ *
+ * In sticky directories, write access is not sufficient;
+ * you can remove entries from a directory only if:
+ *
+ * you own the directory,
+ * you own the entry,
+ * the entry is a plain file and you have write access,
+ * or you are privileged (checked in secpolicy...).
+ *
+ * The function returns 0 if remove access is granted.
+ */
+int
+zfs_sticky_remove_access(znode_t *zdp, znode_t *zp, cred_t *cr)
+{
+ uid_t uid;
+
+ if (zdp->z_zfsvfs->z_assign >= TXG_INITIAL) /* ZIL replay */
+ return (0);
+
+ if ((zdp->z_phys->zp_mode & S_ISVTX) == 0 ||
+ (uid = crgetuid(cr)) == zdp->z_phys->zp_uid ||
+ uid == zp->z_phys->zp_uid ||
+ (ZTOV(zp)->v_type == VREG &&
+ zfs_zaccess(zp, ACE_WRITE_DATA, cr) == 0))
+ return (0);
+ else
+ return (secpolicy_vnode_remove(cr));
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_fm.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_fm.c
new file mode 100644
index 0000000..01c632e
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_fm.c
@@ -0,0 +1,334 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/spa.h>
+#include <sys/spa_impl.h>
+#include <sys/vdev.h>
+#include <sys/vdev_impl.h>
+#include <sys/zio.h>
+
+#include <sys/fm/fs/zfs.h>
+#include <sys/fm/protocol.h>
+#include <sys/fm/util.h>
+
+#ifdef _KERNEL
+/* Including sys/bus.h is just too hard, so I declare what I need here. */
+extern void devctl_notify(const char *__system, const char *__subsystem,
+ const char *__type, const char *__data);
+#endif
+
+/*
+ * This general routine is responsible for generating all the different ZFS
+ * ereports. The payload is dependent on the class, and which arguments are
+ * supplied to the function:
+ *
+ * EREPORT POOL VDEV IO
+ * block X X X
+ * data X X
+ * device X X
+ * pool X
+ *
+ * If we are in a loading state, all errors are chained together by the same
+ * SPA-wide ENA.
+ *
+ * For isolated I/O requests, we get the ENA from the zio_t. The propagation
+ * gets very complicated due to RAID-Z, gang blocks, and vdev caching. We want
+ * to chain together all ereports associated with a logical piece of data. For
+ * read I/Os, there are basically three 'types' of I/O, which form a roughly
+ * layered diagram:
+ *
+ * +---------------+
+ * | Aggregate I/O | No associated logical data or device
+ * +---------------+
+ * |
+ * V
+ * +---------------+ Reads associated with a piece of logical data.
+ * | Read I/O | This includes reads on behalf of RAID-Z,
+ * +---------------+ mirrors, gang blocks, retries, etc.
+ * |
+ * V
+ * +---------------+ Reads associated with a particular device, but
+ * | Physical I/O | no logical data. Issued as part of vdev caching
+ * +---------------+ and I/O aggregation.
+ *
+ * Note that 'physical I/O' here is not the same terminology as used in the rest
+ * of ZIO. Typically, 'physical I/O' simply means that there is no attached
+ * blockpointer. But I/O with no associated block pointer can still be related
+ * to a logical piece of data (i.e. RAID-Z requests).
+ *
+ * Purely physical I/O always have unique ENAs. They are not related to a
+ * particular piece of logical data, and therefore cannot be chained together.
+ * We still generate an ereport, but the DE doesn't correlate it with any
+ * logical piece of data. When such an I/O fails, the delegated I/O requests
+ * will issue a retry, which will trigger the 'real' ereport with the correct
+ * ENA.
+ *
+ * We keep track of the ENA for a ZIO chain through the 'io_logical' member.
+ * When a new logical I/O is issued, we set this to point to itself. Child I/Os
+ * then inherit this pointer, so that when it is first set subsequent failures
+ * will use the same ENA. If a physical I/O is issued (by passing the
+ * ZIO_FLAG_NOBOOKMARK flag), then this pointer is reset, guaranteeing that a
+ * unique ENA will be generated. For an aggregate I/O, this pointer is set to
+ * NULL, and no ereport will be generated (since it doesn't actually correspond
+ * to any particular device or piece of data).
+ */
+void
+zfs_ereport_post(const char *subclass, spa_t *spa, vdev_t *vd, zio_t *zio,
+ uint64_t stateoroffset, uint64_t size)
+{
+#ifdef _KERNEL
+ char buf[1024];
+ struct sbuf sb;
+ struct timespec ts;
+
+ /*
+ * If we are doing a spa_tryimport(), ignore errors.
+ */
+ if (spa->spa_load_state == SPA_LOAD_TRYIMPORT)
+ return;
+
+ /*
+ * If we are in the middle of opening a pool, and the previous attempt
+ * failed, don't bother logging any new ereports - we're just going to
+ * get the same diagnosis anyway.
+ */
+ if (spa->spa_load_state != SPA_LOAD_NONE &&
+ spa->spa_last_open_failed)
+ return;
+
+ /*
+ * Ignore any errors from I/Os that we are going to retry anyway - we
+ * only generate errors from the final failure.
+ */
+ if (zio && zio_should_retry(zio))
+ return;
+
+ /*
+ * If this is not a read or write zio, ignore the error. This can occur
+ * if the DKIOCFLUSHWRITECACHE ioctl fails.
+ */
+ if (zio && zio->io_type != ZIO_TYPE_READ &&
+ zio->io_type != ZIO_TYPE_WRITE)
+ return;
+
+ nanotime(&ts);
+
+ sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN);
+ sbuf_printf(&sb, "time=%ju.%ld", (uintmax_t)ts.tv_sec, ts.tv_nsec);
+
+ /*
+ * Serialize ereport generation
+ */
+ mutex_enter(&spa->spa_errlist_lock);
+
+#if 0
+ /*
+ * Determine the ENA to use for this event. If we are in a loading
+ * state, use a SPA-wide ENA. Otherwise, if we are in an I/O state, use
+ * a root zio-wide ENA. Otherwise, simply use a unique ENA.
+ */
+ if (spa->spa_load_state != SPA_LOAD_NONE) {
+#if 0
+ if (spa->spa_ena == 0)
+ spa->spa_ena = fm_ena_generate(0, FM_ENA_FMT1);
+#endif
+ ena = spa->spa_ena;
+ } else if (zio != NULL && zio->io_logical != NULL) {
+#if 0
+ if (zio->io_logical->io_ena == 0)
+ zio->io_logical->io_ena =
+ fm_ena_generate(0, FM_ENA_FMT1);
+#endif
+ ena = zio->io_logical->io_ena;
+ } else {
+#if 0
+ ena = fm_ena_generate(0, FM_ENA_FMT1);
+#else
+ ena = 0;
+#endif
+ }
+#endif
+
+ /*
+ * Construct the full class, detector, and other standard FMA fields.
+ */
+ sbuf_printf(&sb, " ereport_version=%u", FM_EREPORT_VERSION);
+ sbuf_printf(&sb, " class=%s.%s", ZFS_ERROR_CLASS, subclass);
+
+ sbuf_printf(&sb, " zfs_scheme_version=%u", FM_ZFS_SCHEME_VERSION);
+
+ /*
+ * Construct the per-ereport payload, depending on which parameters are
+ * passed in.
+ */
+
+ /*
+ * Generic payload members common to all ereports.
+ *
+ * The direct reference to spa_name is used rather than spa_name()
+ * because of the asynchronous nature of the zio pipeline. spa_name()
+ * asserts that the config lock is held in some form. This is always
+ * the case in I/O context, but because the check for RW_WRITER compares
+ * against 'curthread', we may be in an asynchronous context and blow
+ * this assert. Rather than loosen this assert, we acknowledge that all
+ * contexts in which this function is called (pool open, I/O) are safe,
+ * and dereference the name directly.
+ */
+ sbuf_printf(&sb, " %s=%s", FM_EREPORT_PAYLOAD_ZFS_POOL, spa->spa_name);
+ sbuf_printf(&sb, " %s=%ju", FM_EREPORT_PAYLOAD_ZFS_POOL_GUID,
+ spa_guid(spa));
+ sbuf_printf(&sb, " %s=%u", FM_EREPORT_PAYLOAD_ZFS_POOL_CONTEXT,
+ spa->spa_load_state);
+
+ if (vd != NULL) {
+ vdev_t *pvd = vd->vdev_parent;
+
+ sbuf_printf(&sb, " %s=%ju", FM_EREPORT_PAYLOAD_ZFS_VDEV_GUID,
+ vd->vdev_guid);
+ sbuf_printf(&sb, " %s=%s", FM_EREPORT_PAYLOAD_ZFS_VDEV_TYPE,
+ vd->vdev_ops->vdev_op_type);
+ if (vd->vdev_path)
+ sbuf_printf(&sb, " %s=%s",
+ FM_EREPORT_PAYLOAD_ZFS_VDEV_PATH, vd->vdev_path);
+ if (vd->vdev_devid)
+ sbuf_printf(&sb, " %s=%s",
+ FM_EREPORT_PAYLOAD_ZFS_VDEV_DEVID, vd->vdev_devid);
+
+ if (pvd != NULL) {
+ sbuf_printf(&sb, " %s=%ju",
+ FM_EREPORT_PAYLOAD_ZFS_PARENT_GUID, pvd->vdev_guid);
+ sbuf_printf(&sb, " %s=%s",
+ FM_EREPORT_PAYLOAD_ZFS_PARENT_TYPE,
+ pvd->vdev_ops->vdev_op_type);
+ if (pvd->vdev_path)
+ sbuf_printf(&sb, " %s=%s",
+ FM_EREPORT_PAYLOAD_ZFS_PARENT_PATH,
+ pvd->vdev_path);
+ if (pvd->vdev_devid)
+ sbuf_printf(&sb, " %s=%s",
+ FM_EREPORT_PAYLOAD_ZFS_PARENT_DEVID,
+ pvd->vdev_devid);
+ }
+ }
+
+ if (zio != NULL) {
+ /*
+ * Payload common to all I/Os.
+ */
+ sbuf_printf(&sb, " %s=%u", FM_EREPORT_PAYLOAD_ZFS_ZIO_ERR,
+ zio->io_error);
+
+ /*
+ * If the 'size' parameter is non-zero, it indicates this is a
+ * RAID-Z or other I/O where the physical offset and length are
+ * provided for us, instead of within the zio_t.
+ */
+ if (vd != NULL) {
+ if (size) {
+ sbuf_printf(&sb, " %s=%ju",
+ FM_EREPORT_PAYLOAD_ZFS_ZIO_OFFSET,
+ stateoroffset);
+ sbuf_printf(&sb, " %s=%ju",
+ FM_EREPORT_PAYLOAD_ZFS_ZIO_SIZE, size);
+ } else {
+ sbuf_printf(&sb, " %s=%ju",
+ FM_EREPORT_PAYLOAD_ZFS_ZIO_OFFSET,
+ zio->io_offset);
+ sbuf_printf(&sb, " %s=%ju",
+ FM_EREPORT_PAYLOAD_ZFS_ZIO_SIZE,
+ zio->io_size);
+ }
+ }
+
+ /*
+ * Payload for I/Os with corresponding logical information.
+ */
+ if (zio->io_logical != NULL) {
+ sbuf_printf(&sb, " %s=%ju",
+ FM_EREPORT_PAYLOAD_ZFS_ZIO_OBJECT,
+ zio->io_logical->io_bookmark.zb_object);
+ sbuf_printf(&sb, " %s=%ju",
+ FM_EREPORT_PAYLOAD_ZFS_ZIO_LEVEL,
+ zio->io_logical->io_bookmark.zb_level);
+ sbuf_printf(&sb, " %s=%ju",
+ FM_EREPORT_PAYLOAD_ZFS_ZIO_BLKID,
+ zio->io_logical->io_bookmark.zb_blkid);
+ }
+ } else if (vd != NULL) {
+ /*
+ * If we have a vdev but no zio, this is a device fault, and the
+ * 'stateoroffset' parameter indicates the previous state of the
+ * vdev.
+ */
+ sbuf_printf(&sb, " %s=%ju", FM_EREPORT_PAYLOAD_ZFS_PREV_STATE,
+ stateoroffset);
+ }
+ mutex_exit(&spa->spa_errlist_lock);
+
+ sbuf_finish(&sb);
+ devctl_notify("ZFS", spa->spa_name, subclass, sbuf_data(&sb));
+ if (sbuf_overflowed(&sb))
+ printf("ZFS WARNING: sbuf overflowed\n");
+ sbuf_delete(&sb);
+#endif
+}
+
+/*
+ * The 'resource.fs.zfs.ok' event is an internal signal that the associated
+ * resource (pool or disk) has been identified by ZFS as healthy. This will
+ * then trigger the DE to close the associated case, if any.
+ */
+void
+zfs_post_ok(spa_t *spa, vdev_t *vd)
+{
+#ifdef _KERNEL
+ char buf[1024];
+ char class[64];
+ struct sbuf sb;
+ struct timespec ts;
+
+ nanotime(&ts);
+
+ sbuf_new(&sb, buf, sizeof(buf), SBUF_FIXEDLEN);
+ sbuf_printf(&sb, "time=%ju.%ld", (uintmax_t)ts.tv_sec, ts.tv_nsec);
+
+ snprintf(class, sizeof(class), "%s.%s.%s", FM_RSRC_RESOURCE,
+ ZFS_ERROR_CLASS, FM_RESOURCE_OK);
+ sbuf_printf(&sb, " %s=%hhu", FM_VERSION, FM_RSRC_VERSION);
+ sbuf_printf(&sb, " %s=%s", FM_CLASS, class);
+ sbuf_printf(&sb, " %s=%ju", FM_EREPORT_PAYLOAD_ZFS_POOL_GUID,
+ spa_guid(spa));
+ if (vd)
+ sbuf_printf(&sb, " %s=%ju", FM_EREPORT_PAYLOAD_ZFS_VDEV_GUID,
+ vd->vdev_guid);
+ sbuf_finish(&sb);
+ devctl_notify("ZFS", spa->spa_name, class, sbuf_data(&sb));
+ if (sbuf_overflowed(&sb))
+ printf("ZFS WARNING: sbuf overflowed\n");
+ sbuf_delete(&sb);
+#endif
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
new file mode 100644
index 0000000..c9424be
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_ioctl.c
@@ -0,0 +1,1826 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/conf.h>
+#include <sys/kernel.h>
+#include <sys/lock.h>
+#include <sys/malloc.h>
+#include <sys/mutex.h>
+#include <sys/proc.h>
+#include <sys/errno.h>
+#include <sys/uio.h>
+#include <sys/buf.h>
+#include <sys/file.h>
+#include <sys/kmem.h>
+#include <sys/conf.h>
+#include <sys/cmn_err.h>
+#include <sys/stat.h>
+#include <sys/zfs_ioctl.h>
+#include <sys/zap.h>
+#include <sys/spa.h>
+#include <sys/spa_impl.h>
+#include <sys/vdev.h>
+#include <sys/vdev_impl.h>
+#include <sys/dmu.h>
+#include <sys/dsl_dir.h>
+#include <sys/dsl_dataset.h>
+#include <sys/dsl_prop.h>
+#include <sys/sunddi.h>
+#include <sys/policy.h>
+#include <sys/zone.h>
+#include <sys/nvpair.h>
+#include <sys/mount.h>
+#include <sys/taskqueue.h>
+#include <sys/sdt.h>
+#include <sys/varargs.h>
+#include <sys/fs/zfs.h>
+#include <sys/zfs_ctldir.h>
+#include <sys/zvol.h>
+
+#include "zfs_namecheck.h"
+#include "zfs_prop.h"
+
+CTASSERT(sizeof(zfs_cmd_t) <= PAGE_SIZE);
+
+static struct cdev *zfsdev;
+
+extern void zfs_init(void);
+extern void zfs_fini(void);
+
+typedef int zfs_ioc_func_t(zfs_cmd_t *);
+typedef int zfs_secpolicy_func_t(const char *, cred_t *);
+
+typedef struct zfs_ioc_vec {
+ zfs_ioc_func_t *zvec_func;
+ zfs_secpolicy_func_t *zvec_secpolicy;
+ enum {
+ no_name,
+ pool_name,
+ dataset_name
+ } zvec_namecheck;
+} zfs_ioc_vec_t;
+
+/* _NOTE(PRINTFLIKE(4)) - this is printf-like, but lint is too whiney */
+void
+__dprintf(const char *file, const char *func, int line, const char *fmt, ...)
+{
+ const char *newfile;
+ char buf[256];
+ va_list adx;
+
+ /*
+ * Get rid of annoying "../common/" prefix to filename.
+ */
+ newfile = strrchr(file, '/');
+ if (newfile != NULL) {
+ newfile = newfile + 1; /* Get rid of leading / */
+ } else {
+ newfile = file;
+ }
+
+ va_start(adx, fmt);
+ (void) vsnprintf(buf, sizeof (buf), fmt, adx);
+ va_end(adx);
+
+ /*
+ * To get this data, use the zfs-dprintf probe as so:
+ * dtrace -q -n 'zfs-dprintf \
+ * /stringof(arg0) == "dbuf.c"/ \
+ * {printf("%s: %s", stringof(arg1), stringof(arg3))}'
+ * arg0 = file name
+ * arg1 = function name
+ * arg2 = line number
+ * arg3 = message
+ */
+ DTRACE_PROBE4(zfs__dprintf,
+ char *, newfile, char *, func, int, line, char *, buf);
+}
+
+/*
+ * Policy for top-level read operations (list pools). Requires no privileges,
+ * and can be used in the local zone, as there is no associated dataset.
+ */
+/* ARGSUSED */
+static int
+zfs_secpolicy_none(const char *unused1, cred_t *cr)
+{
+ return (0);
+}
+
+/*
+ * Policy for dataset read operations (list children, get statistics). Requires
+ * no privileges, but must be visible in the local zone.
+ */
+/* ARGSUSED */
+static int
+zfs_secpolicy_read(const char *dataset, cred_t *cr)
+{
+ if (INGLOBALZONE(curproc) ||
+ zone_dataset_visible(dataset, NULL))
+ return (0);
+
+ return (ENOENT);
+}
+
+static int
+zfs_dozonecheck(const char *dataset, cred_t *cr)
+{
+ uint64_t zoned;
+ int writable = 1;
+
+ /*
+ * The dataset must be visible by this zone -- check this first
+ * so they don't see EPERM on something they shouldn't know about.
+ */
+ if (!INGLOBALZONE(curproc) &&
+ !zone_dataset_visible(dataset, &writable))
+ return (ENOENT);
+
+ if (dsl_prop_get_integer(dataset, "jailed", &zoned, NULL))
+ return (ENOENT);
+
+ if (INGLOBALZONE(curproc)) {
+ /*
+ * If the fs is zoned, only root can access it from the
+ * global zone.
+ */
+ if (secpolicy_zfs(cr) && zoned)
+ return (EPERM);
+ } else {
+ /*
+ * If we are in a local zone, the 'zoned' property must be set.
+ */
+ if (!zoned)
+ return (EPERM);
+
+ /* must be writable by this zone */
+ if (!writable)
+ return (EPERM);
+ }
+ return (0);
+}
+
+/*
+ * Policy for dataset write operations (create children, set properties, etc).
+ * Requires SYS_MOUNT privilege, and must be writable in the local zone.
+ */
+int
+zfs_secpolicy_write(const char *dataset, cred_t *cr)
+{
+ int error;
+
+ if (error = zfs_dozonecheck(dataset, cr))
+ return (error);
+
+ return (secpolicy_zfs(cr));
+}
+
+/*
+ * Policy for operations that want to write a dataset's parent:
+ * create, destroy, snapshot, clone, restore.
+ */
+static int
+zfs_secpolicy_parent(const char *dataset, cred_t *cr)
+{
+ char parentname[MAXNAMELEN];
+ char *cp;
+
+ /*
+ * Remove the @bla or /bla from the end of the name to get the parent.
+ */
+ (void) strncpy(parentname, dataset, sizeof (parentname));
+ cp = strrchr(parentname, '@');
+ if (cp != NULL) {
+ cp[0] = '\0';
+ } else {
+ cp = strrchr(parentname, '/');
+ if (cp == NULL)
+ return (ENOENT);
+ cp[0] = '\0';
+
+ }
+
+ return (zfs_secpolicy_write(parentname, cr));
+}
+
+/*
+ * Policy for pool operations - create/destroy pools, add vdevs, etc. Requires
+ * SYS_CONFIG privilege, which is not available in a local zone.
+ */
+/* ARGSUSED */
+static int
+zfs_secpolicy_config(const char *unused, cred_t *cr)
+{
+ if (secpolicy_sys_config(cr, B_FALSE) != 0)
+ return (EPERM);
+
+ return (0);
+}
+
+/*
+ * Policy for fault injection. Requires all privileges.
+ */
+/* ARGSUSED */
+static int
+zfs_secpolicy_inject(const char *unused, cred_t *cr)
+{
+ return (secpolicy_zinject(cr));
+}
+
+/*
+ * Policy for dataset backup operations (sendbackup).
+ * Requires SYS_MOUNT privilege, and must be writable in the local zone.
+ */
+static int
+zfs_secpolicy_operator(const char *dataset, cred_t *cr)
+{
+ int writable = 1;
+
+ if (!INGLOBALZONE(curproc) && !zone_dataset_visible(dataset, &writable))
+ return (ENOENT);
+ if (secpolicy_zfs(cr) != 0 && !groupmember(GID_OPERATOR, cr))
+ return (EPERM);
+ return (0);
+}
+
+/*
+ * Returns the nvlist as specified by the user in the zfs_cmd_t.
+ */
+static int
+get_nvlist(zfs_cmd_t *zc, nvlist_t **nvp)
+{
+ char *packed;
+ size_t size;
+ int error;
+ nvlist_t *config = NULL;
+
+ /*
+ * Read in and unpack the user-supplied nvlist.
+ */
+ if ((size = zc->zc_nvlist_src_size) == 0)
+ return (EINVAL);
+
+ packed = kmem_alloc(size, KM_SLEEP);
+
+ if ((error = xcopyin((void *)(uintptr_t)zc->zc_nvlist_src, packed,
+ size)) != 0) {
+ kmem_free(packed, size);
+ return (error);
+ }
+
+ if ((error = nvlist_unpack(packed, size, &config, 0)) != 0) {
+ kmem_free(packed, size);
+ return (error);
+ }
+
+ kmem_free(packed, size);
+
+ *nvp = config;
+ return (0);
+}
+
+static int
+put_nvlist(zfs_cmd_t *zc, nvlist_t *nvl)
+{
+ char *packed = NULL;
+ size_t size;
+ int error;
+
+ VERIFY(nvlist_size(nvl, &size, NV_ENCODE_NATIVE) == 0);
+
+ if (size > zc->zc_nvlist_dst_size) {
+ /*
+ * Solaris returns ENOMEM here, because even if an error is
+ * returned from an ioctl(2), new zc_nvlist_dst_size will be
+ * passed to the userland. This is not the case for FreeBSD.
+ * We need to return 0, so the kernel will copy the
+ * zc_nvlist_dst_size back and the userland can discover that a
+ * bigger buffer is needed.
+ */
+ error = 0;
+ } else {
+ VERIFY(nvlist_pack(nvl, &packed, &size, NV_ENCODE_NATIVE,
+ KM_SLEEP) == 0);
+ error = xcopyout(packed, (void *)(uintptr_t)zc->zc_nvlist_dst,
+ size);
+ kmem_free(packed, size);
+ }
+
+ zc->zc_nvlist_dst_size = size;
+ return (error);
+}
+
+static int
+zfs_ioc_pool_create(zfs_cmd_t *zc)
+{
+ int error;
+ nvlist_t *config;
+
+ if ((error = get_nvlist(zc, &config)) != 0)
+ return (error);
+
+ error = spa_create(zc->zc_name, config, zc->zc_value[0] == '\0' ?
+ NULL : zc->zc_value);
+
+ nvlist_free(config);
+
+ return (error);
+}
+
+static int
+zfs_ioc_pool_destroy(zfs_cmd_t *zc)
+{
+ return (spa_destroy(zc->zc_name));
+}
+
+static int
+zfs_ioc_pool_import(zfs_cmd_t *zc)
+{
+ int error;
+ nvlist_t *config;
+ uint64_t guid;
+
+ if ((error = get_nvlist(zc, &config)) != 0)
+ return (error);
+
+ if (nvlist_lookup_uint64(config, ZPOOL_CONFIG_POOL_GUID, &guid) != 0 ||
+ guid != zc->zc_guid)
+ error = EINVAL;
+ else
+ error = spa_import(zc->zc_name, config,
+ zc->zc_value[0] == '\0' ? NULL : zc->zc_value);
+
+ nvlist_free(config);
+
+ return (error);
+}
+
+static int
+zfs_ioc_pool_export(zfs_cmd_t *zc)
+{
+ return (spa_export(zc->zc_name, NULL));
+}
+
+static int
+zfs_ioc_pool_configs(zfs_cmd_t *zc)
+{
+ nvlist_t *configs;
+ int error;
+
+ if ((configs = spa_all_configs(&zc->zc_cookie)) == NULL)
+ return (EEXIST);
+
+ error = put_nvlist(zc, configs);
+
+ nvlist_free(configs);
+
+ return (error);
+}
+
+static int
+zfs_ioc_pool_stats(zfs_cmd_t *zc)
+{
+ nvlist_t *config;
+ int error;
+ int ret = 0;
+
+ error = spa_get_stats(zc->zc_name, &config, zc->zc_value,
+ sizeof (zc->zc_value));
+
+ if (config != NULL) {
+ ret = put_nvlist(zc, config);
+ nvlist_free(config);
+
+ /*
+ * The config may be present even if 'error' is non-zero.
+ * In this case we return success, and preserve the real errno
+ * in 'zc_cookie'.
+ */
+ zc->zc_cookie = error;
+ } else {
+ ret = error;
+ }
+
+ return (ret);
+}
+
+/*
+ * Try to import the given pool, returning pool stats as appropriate so that
+ * user land knows which devices are available and overall pool health.
+ */
+static int
+zfs_ioc_pool_tryimport(zfs_cmd_t *zc)
+{
+ nvlist_t *tryconfig, *config;
+ int error;
+
+ if ((error = get_nvlist(zc, &tryconfig)) != 0)
+ return (error);
+
+ config = spa_tryimport(tryconfig);
+
+ nvlist_free(tryconfig);
+
+ if (config == NULL)
+ return (EINVAL);
+
+ error = put_nvlist(zc, config);
+ nvlist_free(config);
+
+ return (error);
+}
+
+static int
+zfs_ioc_pool_scrub(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int error;
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+
+ error = spa_scrub(spa, zc->zc_cookie, B_FALSE);
+
+ spa_close(spa, FTAG);
+
+ return (error);
+}
+
+static int
+zfs_ioc_pool_freeze(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int error;
+
+ error = spa_open(zc->zc_name, &spa, FTAG);
+ if (error == 0) {
+ spa_freeze(spa);
+ spa_close(spa, FTAG);
+ }
+ return (error);
+}
+
+static int
+zfs_ioc_pool_upgrade(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int error;
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+
+ spa_upgrade(spa);
+
+ spa_close(spa, FTAG);
+
+ return (error);
+}
+
+static int
+zfs_ioc_pool_get_history(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ char *hist_buf;
+ uint64_t size;
+ int error;
+
+ if ((size = zc->zc_history_len) == 0)
+ return (EINVAL);
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+
+ if (spa_version(spa) < ZFS_VERSION_ZPOOL_HISTORY) {
+ spa_close(spa, FTAG);
+ return (ENOTSUP);
+ }
+
+ hist_buf = kmem_alloc(size, KM_SLEEP);
+ if ((error = spa_history_get(spa, &zc->zc_history_offset,
+ &zc->zc_history_len, hist_buf)) == 0) {
+ error = xcopyout(hist_buf, (char *)(uintptr_t)zc->zc_history,
+ zc->zc_history_len);
+ }
+
+ spa_close(spa, FTAG);
+ kmem_free(hist_buf, size);
+ return (error);
+}
+
+static int
+zfs_ioc_pool_log_history(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ char *history_str = NULL;
+ size_t size;
+ int error;
+
+ size = zc->zc_history_len;
+ if (size == 0 || size > HIS_MAX_RECORD_LEN)
+ return (EINVAL);
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+
+ if (spa_version(spa) < ZFS_VERSION_ZPOOL_HISTORY) {
+ spa_close(spa, FTAG);
+ return (ENOTSUP);
+ }
+
+ /* add one for the NULL delimiter */
+ size++;
+ history_str = kmem_alloc(size, KM_SLEEP);
+ if ((error = xcopyin((void *)(uintptr_t)zc->zc_history, history_str,
+ size)) != 0) {
+ spa_close(spa, FTAG);
+ kmem_free(history_str, size);
+ return (error);
+ }
+ history_str[size - 1] = '\0';
+
+ error = spa_history_log(spa, history_str, zc->zc_history_offset);
+
+ spa_close(spa, FTAG);
+ kmem_free(history_str, size);
+
+ return (error);
+}
+
+static int
+zfs_ioc_dsobj_to_dsname(zfs_cmd_t *zc)
+{
+ int error;
+
+ if (error = dsl_dsobj_to_dsname(zc->zc_name, zc->zc_obj, zc->zc_value))
+ return (error);
+
+ return (0);
+}
+
+static int
+zfs_ioc_obj_to_path(zfs_cmd_t *zc)
+{
+ objset_t *osp;
+ int error;
+
+ if ((error = dmu_objset_open(zc->zc_name, DMU_OST_ZFS,
+ DS_MODE_NONE | DS_MODE_READONLY, &osp)) != 0)
+ return (error);
+
+ error = zfs_obj_to_path(osp, zc->zc_obj, zc->zc_value,
+ sizeof (zc->zc_value));
+ dmu_objset_close(osp);
+
+ return (error);
+}
+
+static int
+zfs_ioc_vdev_add(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int error;
+ nvlist_t *config;
+
+ error = spa_open(zc->zc_name, &spa, FTAG);
+ if (error != 0)
+ return (error);
+
+ /*
+ * A root pool with concatenated devices is not supported.
+ * Thus, can not add a device to a root pool with one device.
+ */
+ if (spa->spa_root_vdev->vdev_children == 1 && spa->spa_bootfs != 0) {
+ spa_close(spa, FTAG);
+ return (EDOM);
+ }
+
+ if ((error = get_nvlist(zc, &config)) == 0) {
+ error = spa_vdev_add(spa, config);
+ nvlist_free(config);
+ }
+
+ spa_close(spa, FTAG);
+ return (error);
+}
+
+static int
+zfs_ioc_vdev_remove(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int error;
+
+ error = spa_open(zc->zc_name, &spa, FTAG);
+ if (error != 0)
+ return (error);
+ error = spa_vdev_remove(spa, zc->zc_guid, B_FALSE);
+ spa_close(spa, FTAG);
+ return (error);
+}
+
+static int
+zfs_ioc_vdev_online(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int error;
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+ error = vdev_online(spa, zc->zc_guid);
+ spa_close(spa, FTAG);
+ return (error);
+}
+
+static int
+zfs_ioc_vdev_offline(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int istmp = zc->zc_cookie;
+ int error;
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+ error = vdev_offline(spa, zc->zc_guid, istmp);
+ spa_close(spa, FTAG);
+ return (error);
+}
+
+static int
+zfs_ioc_vdev_attach(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int replacing = zc->zc_cookie;
+ nvlist_t *config;
+ int error;
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+
+ if ((error = get_nvlist(zc, &config)) == 0) {
+ error = spa_vdev_attach(spa, zc->zc_guid, config, replacing);
+ nvlist_free(config);
+ }
+
+ spa_close(spa, FTAG);
+ return (error);
+}
+
+static int
+zfs_ioc_vdev_detach(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int error;
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+
+ error = spa_vdev_detach(spa, zc->zc_guid, B_FALSE);
+
+ spa_close(spa, FTAG);
+ return (error);
+}
+
+static int
+zfs_ioc_vdev_setpath(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ char *path = zc->zc_value;
+ uint64_t guid = zc->zc_guid;
+ int error;
+
+ error = spa_open(zc->zc_name, &spa, FTAG);
+ if (error != 0)
+ return (error);
+
+ error = spa_vdev_setpath(spa, guid, path);
+ spa_close(spa, FTAG);
+ return (error);
+}
+
+static int
+zfs_ioc_objset_stats(zfs_cmd_t *zc)
+{
+ objset_t *os = NULL;
+ int error;
+ nvlist_t *nv;
+
+retry:
+ error = dmu_objset_open(zc->zc_name, DMU_OST_ANY,
+ DS_MODE_STANDARD | DS_MODE_READONLY, &os);
+ if (error != 0) {
+ /*
+ * This is ugly: dmu_objset_open() can return EBUSY if
+ * the objset is held exclusively. Fortunately this hold is
+ * only for a short while, so we retry here.
+ * This avoids user code having to handle EBUSY,
+ * for example for a "zfs list".
+ */
+ if (error == EBUSY) {
+ delay(1);
+ goto retry;
+ }
+ return (error);
+ }
+
+ dmu_objset_fast_stat(os, &zc->zc_objset_stats);
+
+ if (zc->zc_nvlist_dst != 0 &&
+ (error = dsl_prop_get_all(os, &nv)) == 0) {
+ dmu_objset_stats(os, nv);
+ /*
+ * NB: zvol_get_stats() will read the objset contents,
+ * which we aren't supposed to do with a
+ * DS_MODE_STANDARD open, because it could be
+ * inconsistent. So this is a bit of a workaround...
+ */
+ if (!zc->zc_objset_stats.dds_inconsistent &&
+ dmu_objset_type(os) == DMU_OST_ZVOL)
+ VERIFY(zvol_get_stats(os, nv) == 0);
+ error = put_nvlist(zc, nv);
+ nvlist_free(nv);
+ }
+
+ spa_altroot(dmu_objset_spa(os), zc->zc_value, sizeof (zc->zc_value));
+
+ dmu_objset_close(os);
+ if (error == ENOMEM)
+ error = 0;
+ return (error);
+}
+
+static int
+zfs_ioc_dataset_list_next(zfs_cmd_t *zc)
+{
+ objset_t *os;
+ int error;
+ char *p;
+
+retry:
+ error = dmu_objset_open(zc->zc_name, DMU_OST_ANY,
+ DS_MODE_STANDARD | DS_MODE_READONLY, &os);
+ if (error != 0) {
+ /*
+ * This is ugly: dmu_objset_open() can return EBUSY if
+ * the objset is held exclusively. Fortunately this hold is
+ * only for a short while, so we retry here.
+ * This avoids user code having to handle EBUSY,
+ * for example for a "zfs list".
+ */
+ if (error == EBUSY) {
+ delay(1);
+ goto retry;
+ }
+ if (error == ENOENT)
+ error = ESRCH;
+ return (error);
+ }
+
+ p = strrchr(zc->zc_name, '/');
+ if (p == NULL || p[1] != '\0')
+ (void) strlcat(zc->zc_name, "/", sizeof (zc->zc_name));
+ p = zc->zc_name + strlen(zc->zc_name);
+
+ do {
+ error = dmu_dir_list_next(os,
+ sizeof (zc->zc_name) - (p - zc->zc_name), p,
+ NULL, &zc->zc_cookie);
+ if (error == ENOENT)
+ error = ESRCH;
+ } while (error == 0 && !INGLOBALZONE(curproc) &&
+ !zone_dataset_visible(zc->zc_name, NULL));
+
+ /*
+ * If it's a hidden dataset (ie. with a '$' in its name), don't
+ * try to get stats for it. Userland will skip over it.
+ */
+ if (error == 0 && strchr(zc->zc_name, '$') == NULL)
+ error = zfs_ioc_objset_stats(zc); /* fill in the stats */
+
+ dmu_objset_close(os);
+ return (error);
+}
+
+static int
+zfs_ioc_snapshot_list_next(zfs_cmd_t *zc)
+{
+ objset_t *os;
+ int error;
+
+retry:
+ error = dmu_objset_open(zc->zc_name, DMU_OST_ANY,
+ DS_MODE_STANDARD | DS_MODE_READONLY, &os);
+ if (error != 0) {
+ /*
+ * This is ugly: dmu_objset_open() can return EBUSY if
+ * the objset is held exclusively. Fortunately this hold is
+ * only for a short while, so we retry here.
+ * This avoids user code having to handle EBUSY,
+ * for example for a "zfs list".
+ */
+ if (error == EBUSY) {
+ delay(1);
+ goto retry;
+ }
+ if (error == ENOENT)
+ error = ESRCH;
+ return (error);
+ }
+
+ /*
+ * A dataset name of maximum length cannot have any snapshots,
+ * so exit immediately.
+ */
+ if (strlcat(zc->zc_name, "@", sizeof (zc->zc_name)) >= MAXNAMELEN) {
+ dmu_objset_close(os);
+ return (ESRCH);
+ }
+
+ error = dmu_snapshot_list_next(os,
+ sizeof (zc->zc_name) - strlen(zc->zc_name),
+ zc->zc_name + strlen(zc->zc_name), NULL, &zc->zc_cookie);
+ if (error == ENOENT)
+ error = ESRCH;
+
+ if (error == 0)
+ error = zfs_ioc_objset_stats(zc); /* fill in the stats */
+
+ dmu_objset_close(os);
+ return (error);
+}
+
+static int
+zfs_set_prop_nvlist(const char *name, dev_t dev, cred_t *cr, nvlist_t *nvl)
+{
+ nvpair_t *elem;
+ int error;
+ const char *propname;
+ zfs_prop_t prop;
+ uint64_t intval;
+ char *strval;
+ char buf[MAXNAMELEN];
+ const char *p;
+ spa_t *spa;
+
+ elem = NULL;
+ while ((elem = nvlist_next_nvpair(nvl, elem)) != NULL) {
+ propname = nvpair_name(elem);
+
+ if ((prop = zfs_name_to_prop(propname)) ==
+ ZFS_PROP_INVAL) {
+ /*
+ * If this is a user-defined property, it must be a
+ * string, and there is no further validation to do.
+ */
+ if (!zfs_prop_user(propname) ||
+ nvpair_type(elem) != DATA_TYPE_STRING)
+ return (EINVAL);
+
+ VERIFY(nvpair_value_string(elem, &strval) == 0);
+ error = dsl_prop_set(name, propname, 1,
+ strlen(strval) + 1, strval);
+ if (error == 0)
+ continue;
+ else
+ return (error);
+ }
+
+ /*
+ * Check permissions for special properties.
+ */
+ switch (prop) {
+ case ZFS_PROP_ZONED:
+ /*
+ * Disallow setting of 'zoned' from within a local zone.
+ */
+ if (!INGLOBALZONE(curproc))
+ return (EPERM);
+ break;
+
+ case ZFS_PROP_QUOTA:
+ if (error = zfs_dozonecheck(name, cr))
+ return (error);
+
+ if (!INGLOBALZONE(curproc)) {
+ uint64_t zoned;
+ char setpoint[MAXNAMELEN];
+ int dslen;
+ /*
+ * Unprivileged users are allowed to modify the
+ * quota on things *under* (ie. contained by)
+ * the thing they own.
+ */
+ if (dsl_prop_get_integer(name, "jailed", &zoned,
+ setpoint))
+ return (EPERM);
+ if (!zoned) /* this shouldn't happen */
+ return (EPERM);
+ dslen = strlen(name);
+ if (dslen <= strlen(setpoint))
+ return (EPERM);
+ }
+ break;
+
+ case ZFS_PROP_COMPRESSION:
+ /*
+ * If the user specified gzip compression, make sure
+ * the SPA supports it. We ignore any errors here since
+ * we'll catch them later.
+ */
+ if (nvpair_type(elem) == DATA_TYPE_UINT64 &&
+ nvpair_value_uint64(elem, &intval) == 0 &&
+ intval >= ZIO_COMPRESS_GZIP_1 &&
+ intval <= ZIO_COMPRESS_GZIP_9) {
+ if ((p = strchr(name, '/')) == NULL) {
+ p = name;
+ } else {
+ bcopy(name, buf, p - name);
+ buf[p - name] = '\0';
+ p = buf;
+ }
+
+ if (spa_open(p, &spa, FTAG) == 0) {
+ if (spa_version(spa) <
+ ZFS_VERSION_GZIP_COMPRESSION) {
+ spa_close(spa, FTAG);
+ return (ENOTSUP);
+ }
+
+ spa_close(spa, FTAG);
+ }
+ }
+ break;
+ }
+
+ switch (prop) {
+ case ZFS_PROP_QUOTA:
+ if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
+ (error = dsl_dir_set_quota(name,
+ intval)) != 0)
+ return (error);
+ break;
+
+ case ZFS_PROP_RESERVATION:
+ if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
+ (error = dsl_dir_set_reservation(name,
+ intval)) != 0)
+ return (error);
+ break;
+
+ case ZFS_PROP_VOLSIZE:
+ if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
+ (error = zvol_set_volsize(name, dev,
+ intval)) != 0)
+ return (error);
+ break;
+
+ case ZFS_PROP_VOLBLOCKSIZE:
+ if ((error = nvpair_value_uint64(elem, &intval)) != 0 ||
+ (error = zvol_set_volblocksize(name,
+ intval)) != 0)
+ return (error);
+ break;
+
+ default:
+ if (nvpair_type(elem) == DATA_TYPE_STRING) {
+ if (zfs_prop_get_type(prop) !=
+ prop_type_string)
+ return (EINVAL);
+ VERIFY(nvpair_value_string(elem, &strval) == 0);
+ if ((error = dsl_prop_set(name,
+ nvpair_name(elem), 1, strlen(strval) + 1,
+ strval)) != 0)
+ return (error);
+ } else if (nvpair_type(elem) == DATA_TYPE_UINT64) {
+ const char *unused;
+
+ VERIFY(nvpair_value_uint64(elem, &intval) == 0);
+
+ switch (zfs_prop_get_type(prop)) {
+ case prop_type_number:
+ break;
+ case prop_type_boolean:
+ if (intval > 1)
+ return (EINVAL);
+ break;
+ case prop_type_string:
+ return (EINVAL);
+ case prop_type_index:
+ if (zfs_prop_index_to_string(prop,
+ intval, &unused) != 0)
+ return (EINVAL);
+ break;
+ default:
+ cmn_err(CE_PANIC, "unknown property "
+ "type");
+ break;
+ }
+
+ if ((error = dsl_prop_set(name, propname,
+ 8, 1, &intval)) != 0)
+ return (error);
+ } else {
+ return (EINVAL);
+ }
+ break;
+ }
+ }
+
+ return (0);
+}
+
+static int
+zfs_ioc_set_prop(zfs_cmd_t *zc)
+{
+ nvlist_t *nvl;
+ int error;
+ zfs_prop_t prop;
+
+ /*
+ * If zc_value is set, then this is an attempt to inherit a value.
+ * Otherwise, zc_nvlist refers to a list of properties to set.
+ */
+ if (zc->zc_value[0] != '\0') {
+ if (!zfs_prop_user(zc->zc_value) &&
+ ((prop = zfs_name_to_prop(zc->zc_value)) ==
+ ZFS_PROP_INVAL ||
+ !zfs_prop_inheritable(prop)))
+ return (EINVAL);
+
+ return (dsl_prop_set(zc->zc_name, zc->zc_value, 0, 0, NULL));
+ }
+
+ if ((error = get_nvlist(zc, &nvl)) != 0)
+ return (error);
+
+ error = zfs_set_prop_nvlist(zc->zc_name, zc->zc_dev,
+ (cred_t *)(uintptr_t)zc->zc_cred, nvl);
+ nvlist_free(nvl);
+ return (error);
+}
+
+static int
+zfs_ioc_pool_set_props(zfs_cmd_t *zc)
+{
+ nvlist_t *nvl;
+ int error, reset_bootfs = 0;
+ uint64_t objnum;
+ zpool_prop_t prop;
+ nvpair_t *elem;
+ char *propname, *strval;
+ spa_t *spa;
+ vdev_t *rvdev;
+ char *vdev_type;
+ objset_t *os;
+
+ if ((error = get_nvlist(zc, &nvl)) != 0)
+ return (error);
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0) {
+ nvlist_free(nvl);
+ return (error);
+ }
+
+ if (spa_version(spa) < ZFS_VERSION_BOOTFS) {
+ nvlist_free(nvl);
+ spa_close(spa, FTAG);
+ return (ENOTSUP);
+ }
+
+ elem = NULL;
+ while ((elem = nvlist_next_nvpair(nvl, elem)) != NULL) {
+
+ propname = nvpair_name(elem);
+
+ if ((prop = zpool_name_to_prop(propname)) ==
+ ZFS_PROP_INVAL) {
+ nvlist_free(nvl);
+ spa_close(spa, FTAG);
+ return (EINVAL);
+ }
+
+ switch (prop) {
+ case ZFS_PROP_BOOTFS:
+ /*
+ * A bootable filesystem can not be on a RAIDZ pool
+ * nor a striped pool with more than 1 device.
+ */
+ rvdev = spa->spa_root_vdev;
+ vdev_type =
+ rvdev->vdev_child[0]->vdev_ops->vdev_op_type;
+ if (strcmp(vdev_type, VDEV_TYPE_RAIDZ) == 0 ||
+ (strcmp(vdev_type, VDEV_TYPE_MIRROR) != 0 &&
+ rvdev->vdev_children > 1)) {
+ error = ENOTSUP;
+ break;
+ }
+
+ reset_bootfs = 1;
+
+ VERIFY(nvpair_value_string(elem, &strval) == 0);
+ if (strval == NULL || strval[0] == '\0') {
+ objnum =
+ zfs_prop_default_numeric(ZFS_PROP_BOOTFS);
+ break;
+ }
+
+ if (error = dmu_objset_open(strval, DMU_OST_ZFS,
+ DS_MODE_STANDARD | DS_MODE_READONLY, &os))
+ break;
+ objnum = dmu_objset_id(os);
+ dmu_objset_close(os);
+ break;
+
+ default:
+ error = EINVAL;
+ }
+
+ if (error)
+ break;
+ }
+ if (error == 0) {
+ if (reset_bootfs) {
+ VERIFY(nvlist_remove(nvl,
+ zpool_prop_to_name(ZFS_PROP_BOOTFS),
+ DATA_TYPE_STRING) == 0);
+ VERIFY(nvlist_add_uint64(nvl,
+ zpool_prop_to_name(ZFS_PROP_BOOTFS), objnum) == 0);
+ }
+ error = spa_set_props(spa, nvl);
+ }
+
+ nvlist_free(nvl);
+ spa_close(spa, FTAG);
+
+ return (error);
+}
+
+static int
+zfs_ioc_pool_get_props(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int error;
+ nvlist_t *nvp = NULL;
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+
+ error = spa_get_props(spa, &nvp);
+
+ if (error == 0 && zc->zc_nvlist_dst != 0)
+ error = put_nvlist(zc, nvp);
+ else
+ error = EFAULT;
+
+ spa_close(spa, FTAG);
+
+ if (nvp)
+ nvlist_free(nvp);
+ return (error);
+}
+
+static int
+zfs_ioc_create_minor(zfs_cmd_t *zc)
+{
+ return (zvol_create_minor(zc->zc_name, zc->zc_dev));
+}
+
+static int
+zfs_ioc_remove_minor(zfs_cmd_t *zc)
+{
+ return (zvol_remove_minor(zc->zc_name));
+}
+
+/*
+ * Search the vfs list for a specified resource. Returns a pointer to it
+ * or NULL if no suitable entry is found. The caller of this routine
+ * is responsible for releasing the returned vfs pointer.
+ */
+static vfs_t *
+zfs_get_vfs(const char *resource)
+{
+ vfs_t *vfsp;
+
+ mtx_lock(&mountlist_mtx);
+ TAILQ_FOREACH(vfsp, &mountlist, mnt_list) {
+ if (strcmp(vfsp->mnt_stat.f_mntfromname, resource) == 0) {
+ VFS_HOLD(vfsp);
+ break;
+ }
+ }
+ mtx_unlock(&mountlist_mtx);
+ return (vfsp);
+}
+
+static void
+zfs_create_cb(objset_t *os, void *arg, dmu_tx_t *tx)
+{
+ zfs_create_data_t *zc = arg;
+
+ zfs_create_fs(os, (cred_t *)(uintptr_t)zc->zc_cred, tx);
+}
+
+static int
+zfs_ioc_create(zfs_cmd_t *zc)
+{
+ objset_t *clone;
+ int error = 0;
+ zfs_create_data_t cbdata = { 0 };
+ void (*cbfunc)(objset_t *os, void *arg, dmu_tx_t *tx);
+ dmu_objset_type_t type = zc->zc_objset_type;
+
+ switch (type) {
+
+ case DMU_OST_ZFS:
+ cbfunc = zfs_create_cb;
+ break;
+
+ case DMU_OST_ZVOL:
+ cbfunc = zvol_create_cb;
+ break;
+
+ default:
+ cbfunc = NULL;
+ }
+ if (strchr(zc->zc_name, '@'))
+ return (EINVAL);
+
+ if (zc->zc_nvlist_src != 0 &&
+ (error = get_nvlist(zc, &cbdata.zc_props)) != 0)
+ return (error);
+
+ cbdata.zc_cred = (cred_t *)(uintptr_t)zc->zc_cred;
+ cbdata.zc_dev = (dev_t)zc->zc_dev;
+
+ if (zc->zc_value[0] != '\0') {
+ /*
+ * We're creating a clone of an existing snapshot.
+ */
+ zc->zc_value[sizeof (zc->zc_value) - 1] = '\0';
+ if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0) {
+ nvlist_free(cbdata.zc_props);
+ return (EINVAL);
+ }
+
+ error = dmu_objset_open(zc->zc_value, type,
+ DS_MODE_STANDARD | DS_MODE_READONLY, &clone);
+ if (error) {
+ nvlist_free(cbdata.zc_props);
+ return (error);
+ }
+ error = dmu_objset_create(zc->zc_name, type, clone, NULL, NULL);
+ dmu_objset_close(clone);
+ } else {
+ if (cbfunc == NULL) {
+ nvlist_free(cbdata.zc_props);
+ return (EINVAL);
+ }
+
+ if (type == DMU_OST_ZVOL) {
+ uint64_t volsize, volblocksize;
+
+ if (cbdata.zc_props == NULL ||
+ nvlist_lookup_uint64(cbdata.zc_props,
+ zfs_prop_to_name(ZFS_PROP_VOLSIZE),
+ &volsize) != 0) {
+ nvlist_free(cbdata.zc_props);
+ return (EINVAL);
+ }
+
+ if ((error = nvlist_lookup_uint64(cbdata.zc_props,
+ zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE),
+ &volblocksize)) != 0 && error != ENOENT) {
+ nvlist_free(cbdata.zc_props);
+ return (EINVAL);
+ }
+
+ if (error != 0)
+ volblocksize = zfs_prop_default_numeric(
+ ZFS_PROP_VOLBLOCKSIZE);
+
+ if ((error = zvol_check_volblocksize(
+ volblocksize)) != 0 ||
+ (error = zvol_check_volsize(volsize,
+ volblocksize)) != 0) {
+ nvlist_free(cbdata.zc_props);
+ return (error);
+ }
+ }
+
+ error = dmu_objset_create(zc->zc_name, type, NULL, cbfunc,
+ &cbdata);
+ }
+
+ /*
+ * It would be nice to do this atomically.
+ */
+ if (error == 0) {
+ if ((error = zfs_set_prop_nvlist(zc->zc_name,
+ zc->zc_dev, (cred_t *)(uintptr_t)zc->zc_cred,
+ cbdata.zc_props)) != 0)
+ (void) dmu_objset_destroy(zc->zc_name);
+ }
+
+ nvlist_free(cbdata.zc_props);
+ return (error);
+}
+
+static int
+zfs_ioc_snapshot(zfs_cmd_t *zc)
+{
+ if (snapshot_namecheck(zc->zc_value, NULL, NULL) != 0)
+ return (EINVAL);
+ return (dmu_objset_snapshot(zc->zc_name,
+ zc->zc_value, zc->zc_cookie));
+}
+
+int
+zfs_unmount_snap(char *name, void *arg)
+{
+ char *snapname = arg;
+ char *cp;
+ vfs_t *vfsp = NULL;
+
+ /*
+ * Snapshots (which are under .zfs control) must be unmounted
+ * before they can be destroyed.
+ */
+
+ if (snapname) {
+ (void) strcat(name, "@");
+ (void) strcat(name, snapname);
+ vfsp = zfs_get_vfs(name);
+ cp = strchr(name, '@');
+ *cp = '\0';
+ } else if (strchr(name, '@')) {
+ vfsp = zfs_get_vfs(name);
+ }
+
+ if (vfsp) {
+ /*
+ * Always force the unmount for snapshots.
+ */
+ int flag = MS_FORCE;
+ int err;
+
+ if ((err = vn_vfswlock(vfsp->vfs_vnodecovered)) != 0) {
+ VFS_RELE(vfsp);
+ return (err);
+ }
+ VFS_RELE(vfsp);
+ mtx_lock(&Giant); /* dounmount() */
+ dounmount(vfsp, flag, curthread);
+ mtx_unlock(&Giant); /* dounmount() */
+ }
+ return (0);
+}
+
+static int
+zfs_ioc_destroy_snaps(zfs_cmd_t *zc)
+{
+ int err;
+
+ if (snapshot_namecheck(zc->zc_value, NULL, NULL) != 0)
+ return (EINVAL);
+ err = dmu_objset_find(zc->zc_name,
+ zfs_unmount_snap, zc->zc_value, DS_FIND_CHILDREN);
+ if (err)
+ return (err);
+ return (dmu_snapshots_destroy(zc->zc_name, zc->zc_value));
+}
+
+static int
+zfs_ioc_destroy(zfs_cmd_t *zc)
+{
+ if (strchr(zc->zc_name, '@') && zc->zc_objset_type == DMU_OST_ZFS) {
+ int err = zfs_unmount_snap(zc->zc_name, NULL);
+ if (err)
+ return (err);
+ }
+
+ return (dmu_objset_destroy(zc->zc_name));
+}
+
+static int
+zfs_ioc_rollback(zfs_cmd_t *zc)
+{
+ return (dmu_objset_rollback(zc->zc_name));
+}
+
+static int
+zfs_ioc_rename(zfs_cmd_t *zc)
+{
+ int recursive = zc->zc_cookie & 1;
+
+ zc->zc_value[sizeof (zc->zc_value) - 1] = '\0';
+ if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0)
+ return (EINVAL);
+
+ /*
+ * Unmount snapshot unless we're doing a recursive rename,
+ * in which case the dataset code figures out which snapshots
+ * to unmount.
+ */
+ if (!recursive && strchr(zc->zc_name, '@') != NULL &&
+ zc->zc_objset_type == DMU_OST_ZFS) {
+ int err = zfs_unmount_snap(zc->zc_name, NULL);
+ if (err)
+ return (err);
+ }
+
+ return (dmu_objset_rename(zc->zc_name, zc->zc_value, recursive));
+}
+
+static int
+zfs_ioc_recvbackup(zfs_cmd_t *zc)
+{
+ kthread_t *td = curthread;
+ struct file *fp;
+ int error;
+ offset_t new_off;
+
+ if (dataset_namecheck(zc->zc_value, NULL, NULL) != 0 ||
+ strchr(zc->zc_value, '@') == NULL)
+ return (EINVAL);
+
+ error = fget_read(td, zc->zc_cookie, &fp);
+ if (error)
+ return (error);
+
+ error = dmu_recvbackup(zc->zc_value, &zc->zc_begin_record,
+ &zc->zc_cookie, (boolean_t)zc->zc_guid, fp,
+ fp->f_offset);
+
+ new_off = fp->f_offset + zc->zc_cookie;
+ fp->f_offset = new_off;
+
+ fdrop(fp, td);
+ return (error);
+}
+
+static int
+zfs_ioc_sendbackup(zfs_cmd_t *zc)
+{
+ kthread_t *td = curthread;
+ struct file *fp;
+ objset_t *fromsnap = NULL;
+ objset_t *tosnap;
+ int error, fd;
+
+ error = dmu_objset_open(zc->zc_name, DMU_OST_ANY,
+ DS_MODE_STANDARD | DS_MODE_READONLY, &tosnap);
+ if (error)
+ return (error);
+
+ if (zc->zc_value[0] != '\0') {
+ char buf[MAXPATHLEN];
+ char *cp;
+
+ (void) strncpy(buf, zc->zc_name, sizeof (buf));
+ cp = strchr(buf, '@');
+ if (cp)
+ *(cp+1) = 0;
+ (void) strlcat(buf, zc->zc_value, sizeof (buf));
+ error = dmu_objset_open(buf, DMU_OST_ANY,
+ DS_MODE_STANDARD | DS_MODE_READONLY, &fromsnap);
+ if (error) {
+ dmu_objset_close(tosnap);
+ return (error);
+ }
+ }
+
+ fd = zc->zc_cookie;
+ error = fget_write(td, fd, &fp);
+ if (error) {
+ dmu_objset_close(tosnap);
+ if (fromsnap)
+ dmu_objset_close(fromsnap);
+ return (error);
+ }
+
+ error = dmu_sendbackup(tosnap, fromsnap, fp);
+
+ fdrop(fp, td);
+ if (fromsnap)
+ dmu_objset_close(fromsnap);
+ dmu_objset_close(tosnap);
+ return (error);
+}
+
+static int
+zfs_ioc_inject_fault(zfs_cmd_t *zc)
+{
+ int id, error;
+
+ error = zio_inject_fault(zc->zc_name, (int)zc->zc_guid, &id,
+ &zc->zc_inject_record);
+
+ if (error == 0)
+ zc->zc_guid = (uint64_t)id;
+
+ return (error);
+}
+
+static int
+zfs_ioc_clear_fault(zfs_cmd_t *zc)
+{
+ return (zio_clear_fault((int)zc->zc_guid));
+}
+
+static int
+zfs_ioc_inject_list_next(zfs_cmd_t *zc)
+{
+ int id = (int)zc->zc_guid;
+ int error;
+
+ error = zio_inject_list_next(&id, zc->zc_name, sizeof (zc->zc_name),
+ &zc->zc_inject_record);
+
+ zc->zc_guid = id;
+
+ return (error);
+}
+
+static int
+zfs_ioc_error_log(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ int error;
+ size_t count = (size_t)zc->zc_nvlist_dst_size;
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+
+ error = spa_get_errlog(spa, (void *)(uintptr_t)zc->zc_nvlist_dst,
+ &count);
+ if (error == 0)
+ zc->zc_nvlist_dst_size = count;
+ else
+ zc->zc_nvlist_dst_size = spa_get_errlog_size(spa);
+
+ spa_close(spa, FTAG);
+
+ return (error);
+}
+
+static int
+zfs_ioc_clear(zfs_cmd_t *zc)
+{
+ spa_t *spa;
+ vdev_t *vd;
+ int error;
+
+ if ((error = spa_open(zc->zc_name, &spa, FTAG)) != 0)
+ return (error);
+
+ spa_config_enter(spa, RW_WRITER, FTAG);
+
+ if (zc->zc_guid == 0) {
+ vd = NULL;
+ } else if ((vd = spa_lookup_by_guid(spa, zc->zc_guid)) == NULL) {
+ spa_config_exit(spa, FTAG);
+ spa_close(spa, FTAG);
+ return (ENODEV);
+ }
+
+ vdev_clear(spa, vd);
+
+ spa_config_exit(spa, FTAG);
+
+ spa_close(spa, FTAG);
+
+ return (0);
+}
+
+static int
+zfs_ioc_promote(zfs_cmd_t *zc)
+{
+ char *cp;
+
+ /*
+ * We don't need to unmount *all* the origin fs's snapshots, but
+ * it's easier.
+ */
+ cp = strchr(zc->zc_value, '@');
+ if (cp)
+ *cp = '\0';
+ (void) dmu_objset_find(zc->zc_value,
+ zfs_unmount_snap, NULL, DS_FIND_SNAPSHOTS);
+ return (dsl_dataset_promote(zc->zc_name));
+}
+
+static int
+zfs_ioc_jail(zfs_cmd_t *zc)
+{
+
+ return (zone_dataset_attach((cred_t *)(uintptr_t)zc->zc_cred,
+ zc->zc_name, (int)zc->zc_jailid));
+}
+
+static int
+zfs_ioc_unjail(zfs_cmd_t *zc)
+{
+
+ return (zone_dataset_detach((cred_t *)(uintptr_t)zc->zc_cred,
+ zc->zc_name, (int)zc->zc_jailid));
+}
+
+static zfs_ioc_vec_t zfs_ioc_vec[] = {
+ { zfs_ioc_pool_create, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_pool_destroy, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_pool_import, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_pool_export, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_pool_configs, zfs_secpolicy_none, no_name },
+ { zfs_ioc_pool_stats, zfs_secpolicy_read, pool_name },
+ { zfs_ioc_pool_tryimport, zfs_secpolicy_config, no_name },
+ { zfs_ioc_pool_scrub, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_pool_freeze, zfs_secpolicy_config, no_name },
+ { zfs_ioc_pool_upgrade, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_pool_get_history, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_pool_log_history, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_vdev_add, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_vdev_remove, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_vdev_online, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_vdev_offline, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_vdev_attach, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_vdev_detach, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_vdev_setpath, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_objset_stats, zfs_secpolicy_read, dataset_name },
+ { zfs_ioc_dataset_list_next, zfs_secpolicy_read, dataset_name },
+ { zfs_ioc_snapshot_list_next, zfs_secpolicy_read, dataset_name },
+ { zfs_ioc_set_prop, zfs_secpolicy_write, dataset_name },
+ { zfs_ioc_create_minor, zfs_secpolicy_config, dataset_name },
+ { zfs_ioc_remove_minor, zfs_secpolicy_config, dataset_name },
+ { zfs_ioc_create, zfs_secpolicy_parent, dataset_name },
+ { zfs_ioc_destroy, zfs_secpolicy_parent, dataset_name },
+ { zfs_ioc_rollback, zfs_secpolicy_write, dataset_name },
+ { zfs_ioc_rename, zfs_secpolicy_write, dataset_name },
+ { zfs_ioc_recvbackup, zfs_secpolicy_write, dataset_name },
+ { zfs_ioc_sendbackup, zfs_secpolicy_operator, dataset_name },
+ { zfs_ioc_inject_fault, zfs_secpolicy_inject, no_name },
+ { zfs_ioc_clear_fault, zfs_secpolicy_inject, no_name },
+ { zfs_ioc_inject_list_next, zfs_secpolicy_inject, no_name },
+ { zfs_ioc_error_log, zfs_secpolicy_inject, pool_name },
+ { zfs_ioc_clear, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_promote, zfs_secpolicy_write, dataset_name },
+ { zfs_ioc_destroy_snaps, zfs_secpolicy_write, dataset_name },
+ { zfs_ioc_snapshot, zfs_secpolicy_operator, dataset_name },
+ { zfs_ioc_dsobj_to_dsname, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_obj_to_path, zfs_secpolicy_config, no_name },
+ { zfs_ioc_pool_set_props, zfs_secpolicy_config, pool_name },
+ { zfs_ioc_pool_get_props, zfs_secpolicy_read, pool_name },
+ { zfs_ioc_jail, zfs_secpolicy_config, dataset_name },
+ { zfs_ioc_unjail, zfs_secpolicy_config, dataset_name }
+};
+
+static int
+zfsdev_ioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flag,
+ struct thread *td)
+{
+ zfs_cmd_t *zc = (void *)addr;
+ uint_t vec;
+ int error;
+
+ vec = ZFS_IOC(cmd);
+
+ if (vec >= sizeof (zfs_ioc_vec) / sizeof (zfs_ioc_vec[0]))
+ return (EINVAL);
+
+ zc->zc_cred = (uintptr_t)td->td_ucred;
+ zc->zc_dev = (uintptr_t)dev;
+ error = zfs_ioc_vec[vec].zvec_secpolicy(zc->zc_name, td->td_ucred);
+
+ /*
+ * Ensure that all pool/dataset names are valid before we pass down to
+ * the lower layers.
+ */
+ if (error == 0) {
+ zc->zc_name[sizeof (zc->zc_name) - 1] = '\0';
+ switch (zfs_ioc_vec[vec].zvec_namecheck) {
+ case pool_name:
+ if (pool_namecheck(zc->zc_name, NULL, NULL) != 0)
+ error = EINVAL;
+ break;
+
+ case dataset_name:
+ if (dataset_namecheck(zc->zc_name, NULL, NULL) != 0)
+ error = EINVAL;
+ break;
+
+ case no_name:
+ break;
+ }
+ }
+
+ if (error == 0)
+ error = zfs_ioc_vec[vec].zvec_func(zc);
+
+ return (error);
+}
+
+/*
+ * OK, so this is a little weird.
+ *
+ * /dev/zfs is the control node, i.e. minor 0.
+ * /dev/zvol/[r]dsk/pool/dataset are the zvols, minor > 0.
+ *
+ * /dev/zfs has basically nothing to do except serve up ioctls,
+ * so most of the standard driver entry points are in zvol.c.
+ */
+static struct cdevsw zfs_cdevsw = {
+ .d_version = D_VERSION,
+ .d_ioctl = zfsdev_ioctl,
+ .d_name = ZFS_DEV_NAME
+};
+
+static void
+zfsdev_init(void)
+{
+ zfsdev = make_dev(&zfs_cdevsw, 0x0, UID_ROOT, GID_OPERATOR, 0660,
+ ZFS_DEV_NAME);
+}
+
+static void
+zfsdev_fini(void)
+{
+ if (zfsdev != NULL)
+ destroy_dev(zfsdev);
+}
+
+static struct task zfs_start_task;
+static struct root_hold_token *zfs_root_token;
+
+static void
+zfs_start(void *context __unused, int pending __unused)
+{
+
+ zfsdev_init();
+ spa_init(FREAD | FWRITE);
+ zfs_init();
+ zvol_init();
+ printf("ZFS storage pool version " ZFS_VERSION_STRING "\n");
+ root_mount_rel(zfs_root_token);
+}
+
+static int
+zfs_modevent(module_t mod, int type, void *unused __unused)
+{
+ int error;
+
+ error = EOPNOTSUPP;
+ switch (type) {
+ case MOD_LOAD:
+ zfs_root_token = root_mount_hold("ZFS");
+ printf("WARNING: ZFS is considered to be an experimental "
+ "feature in FreeBSD.\n");
+ TASK_INIT(&zfs_start_task, 0, zfs_start, NULL);
+ taskqueue_enqueue(taskqueue_thread, &zfs_start_task);
+ error = 0;
+ break;
+ case MOD_UNLOAD:
+ if (spa_busy() || zfs_busy() || zvol_busy() ||
+ zio_injection_enabled) {
+ error = EBUSY;
+ break;
+ }
+ zvol_fini();
+ zfs_fini();
+ spa_fini();
+ zfsdev_fini();
+ error = 0;
+ break;
+ }
+ return (error);
+}
+
+static moduledata_t zfs_mod = {
+ "zfsctrl",
+ zfs_modevent,
+ 0
+};
+DECLARE_MODULE(zfsctrl, zfs_mod, SI_SUB_VFS, SI_ORDER_ANY);
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_log.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_log.c
new file mode 100644
index 0000000..dde9ec1
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_log.c
@@ -0,0 +1,349 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/sysmacros.h>
+#include <sys/cmn_err.h>
+#include <sys/kmem.h>
+#include <sys/file.h>
+#include <sys/vfs.h>
+#include <sys/zfs_znode.h>
+#include <sys/zfs_dir.h>
+#include <sys/zil.h>
+#include <sys/byteorder.h>
+#include <sys/policy.h>
+#include <sys/stat.h>
+#include <sys/acl.h>
+#include <sys/dmu.h>
+#include <sys/spa.h>
+
+/*
+ * All the functions in this file are used to construct the log entries
+ * to record transactions. They allocate * a intent log transaction
+ * structure (itx_t) and save within it all the information necessary to
+ * possibly replay the transaction. The itx is then assigned a sequence
+ * number and inserted in the in-memory list anchored in the zilog.
+ */
+
+/*
+ * zfs_log_create() is used to handle TX_CREATE, TX_MKDIR and TX_MKXATTR
+ * transactions.
+ */
+void
+zfs_log_create(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *dzp, znode_t *zp, char *name)
+{
+ itx_t *itx;
+ uint64_t seq;
+ lr_create_t *lr;
+ size_t namesize = strlen(name) + 1;
+
+ if (zilog == NULL)
+ return;
+
+ itx = zil_itx_create(txtype, sizeof (*lr) + namesize);
+ lr = (lr_create_t *)&itx->itx_lr;
+ lr->lr_doid = dzp->z_id;
+ lr->lr_foid = zp->z_id;
+ lr->lr_mode = zp->z_phys->zp_mode;
+ lr->lr_uid = zp->z_phys->zp_uid;
+ lr->lr_gid = zp->z_phys->zp_gid;
+ lr->lr_gen = zp->z_phys->zp_gen;
+ lr->lr_crtime[0] = zp->z_phys->zp_crtime[0];
+ lr->lr_crtime[1] = zp->z_phys->zp_crtime[1];
+ lr->lr_rdev = zp->z_phys->zp_rdev;
+ bcopy(name, (char *)(lr + 1), namesize);
+
+ seq = zil_itx_assign(zilog, itx, tx);
+ dzp->z_last_itx = seq;
+ zp->z_last_itx = seq;
+}
+
+/*
+ * zfs_log_remove() handles both TX_REMOVE and TX_RMDIR transactions.
+ */
+void
+zfs_log_remove(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *dzp, char *name)
+{
+ itx_t *itx;
+ uint64_t seq;
+ lr_remove_t *lr;
+ size_t namesize = strlen(name) + 1;
+
+ if (zilog == NULL)
+ return;
+
+ itx = zil_itx_create(txtype, sizeof (*lr) + namesize);
+ lr = (lr_remove_t *)&itx->itx_lr;
+ lr->lr_doid = dzp->z_id;
+ bcopy(name, (char *)(lr + 1), namesize);
+
+ seq = zil_itx_assign(zilog, itx, tx);
+ dzp->z_last_itx = seq;
+}
+
+/*
+ * zfs_log_link() handles TX_LINK transactions.
+ */
+void
+zfs_log_link(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *dzp, znode_t *zp, char *name)
+{
+ itx_t *itx;
+ uint64_t seq;
+ lr_link_t *lr;
+ size_t namesize = strlen(name) + 1;
+
+ if (zilog == NULL)
+ return;
+
+ itx = zil_itx_create(txtype, sizeof (*lr) + namesize);
+ lr = (lr_link_t *)&itx->itx_lr;
+ lr->lr_doid = dzp->z_id;
+ lr->lr_link_obj = zp->z_id;
+ bcopy(name, (char *)(lr + 1), namesize);
+
+ seq = zil_itx_assign(zilog, itx, tx);
+ dzp->z_last_itx = seq;
+ zp->z_last_itx = seq;
+}
+
+/*
+ * zfs_log_symlink() handles TX_SYMLINK transactions.
+ */
+void
+zfs_log_symlink(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *dzp, znode_t *zp, char *name, char *link)
+{
+ itx_t *itx;
+ uint64_t seq;
+ lr_create_t *lr;
+ size_t namesize = strlen(name) + 1;
+ size_t linksize = strlen(link) + 1;
+
+ if (zilog == NULL)
+ return;
+
+ itx = zil_itx_create(txtype, sizeof (*lr) + namesize + linksize);
+ lr = (lr_create_t *)&itx->itx_lr;
+ lr->lr_doid = dzp->z_id;
+ lr->lr_foid = zp->z_id;
+ lr->lr_mode = zp->z_phys->zp_mode;
+ lr->lr_uid = zp->z_phys->zp_uid;
+ lr->lr_gid = zp->z_phys->zp_gid;
+ lr->lr_gen = zp->z_phys->zp_gen;
+ lr->lr_crtime[0] = zp->z_phys->zp_crtime[0];
+ lr->lr_crtime[1] = zp->z_phys->zp_crtime[1];
+ bcopy(name, (char *)(lr + 1), namesize);
+ bcopy(link, (char *)(lr + 1) + namesize, linksize);
+
+ seq = zil_itx_assign(zilog, itx, tx);
+ dzp->z_last_itx = seq;
+ zp->z_last_itx = seq;
+}
+
+/*
+ * zfs_log_rename() handles TX_RENAME transactions.
+ */
+void
+zfs_log_rename(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *sdzp, char *sname, znode_t *tdzp, char *dname, znode_t *szp)
+{
+ itx_t *itx;
+ uint64_t seq;
+ lr_rename_t *lr;
+ size_t snamesize = strlen(sname) + 1;
+ size_t dnamesize = strlen(dname) + 1;
+
+ if (zilog == NULL)
+ return;
+
+ itx = zil_itx_create(txtype, sizeof (*lr) + snamesize + dnamesize);
+ lr = (lr_rename_t *)&itx->itx_lr;
+ lr->lr_sdoid = sdzp->z_id;
+ lr->lr_tdoid = tdzp->z_id;
+ bcopy(sname, (char *)(lr + 1), snamesize);
+ bcopy(dname, (char *)(lr + 1) + snamesize, dnamesize);
+
+ seq = zil_itx_assign(zilog, itx, tx);
+ sdzp->z_last_itx = seq;
+ tdzp->z_last_itx = seq;
+ szp->z_last_itx = seq;
+}
+
+/*
+ * zfs_log_write() handles TX_WRITE transactions.
+ */
+ssize_t zfs_immediate_write_sz = 32768;
+
+void
+zfs_log_write(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *zp, offset_t off, ssize_t len, int ioflag)
+{
+ itx_t *itx;
+ uint64_t seq;
+ lr_write_t *lr;
+ itx_wr_state_t write_state;
+ int err;
+
+ if (zilog == NULL || zp->z_unlinked)
+ return;
+
+ /*
+ * Writes are handled in three different ways:
+ *
+ * WR_INDIRECT:
+ * If the write is greater than zfs_immediate_write_sz then
+ * later *if* we need to log the write then dmu_sync() is used
+ * to immediately write the block and it's block pointer is put
+ * in the log record.
+ * WR_COPIED:
+ * If we know we'll immediately be committing the
+ * transaction (FDSYNC (O_DSYNC)), the we allocate a larger
+ * log record here for the data and copy the data in.
+ * WR_NEED_COPY:
+ * Otherwise we don't allocate a buffer, and *if* we need to
+ * flush the write later then a buffer is allocated and
+ * we retrieve the data using the dmu.
+ */
+ if (len > zfs_immediate_write_sz)
+ write_state = WR_INDIRECT;
+ else if (ioflag & FDSYNC)
+ write_state = WR_COPIED;
+ else
+ write_state = WR_NEED_COPY;
+
+ itx = zil_itx_create(txtype, sizeof (*lr) +
+ (write_state == WR_COPIED ? len : 0));
+ lr = (lr_write_t *)&itx->itx_lr;
+ if (write_state == WR_COPIED) {
+ err = dmu_read(zp->z_zfsvfs->z_os, zp->z_id, off, len, lr + 1);
+ if (err) {
+ kmem_free(itx, offsetof(itx_t, itx_lr) +
+ itx->itx_lr.lrc_reclen);
+ itx = zil_itx_create(txtype, sizeof (*lr));
+ lr = (lr_write_t *)&itx->itx_lr;
+ write_state = WR_NEED_COPY;
+ }
+ }
+
+ itx->itx_wr_state = write_state;
+ lr->lr_foid = zp->z_id;
+ lr->lr_offset = off;
+ lr->lr_length = len;
+ lr->lr_blkoff = 0;
+ BP_ZERO(&lr->lr_blkptr);
+
+ itx->itx_private = zp->z_zfsvfs;
+
+ itx->itx_sync = (zp->z_sync_cnt != 0);
+ seq = zil_itx_assign(zilog, itx, tx);
+ zp->z_last_itx = seq;
+}
+
+/*
+ * zfs_log_truncate() handles TX_TRUNCATE transactions.
+ */
+void
+zfs_log_truncate(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *zp, uint64_t off, uint64_t len)
+{
+ itx_t *itx;
+ uint64_t seq;
+ lr_truncate_t *lr;
+
+ if (zilog == NULL || zp->z_unlinked)
+ return;
+
+ itx = zil_itx_create(txtype, sizeof (*lr));
+ lr = (lr_truncate_t *)&itx->itx_lr;
+ lr->lr_foid = zp->z_id;
+ lr->lr_offset = off;
+ lr->lr_length = len;
+
+ itx->itx_sync = (zp->z_sync_cnt != 0);
+ seq = zil_itx_assign(zilog, itx, tx);
+ zp->z_last_itx = seq;
+}
+
+/*
+ * zfs_log_setattr() handles TX_SETATTR transactions.
+ */
+void
+zfs_log_setattr(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *zp, vattr_t *vap, uint_t mask_applied)
+{
+ itx_t *itx;
+ uint64_t seq;
+ lr_setattr_t *lr;
+
+ if (zilog == NULL || zp->z_unlinked)
+ return;
+
+ itx = zil_itx_create(txtype, sizeof (*lr));
+ lr = (lr_setattr_t *)&itx->itx_lr;
+ lr->lr_foid = zp->z_id;
+ lr->lr_mask = (uint64_t)mask_applied;
+ lr->lr_mode = (uint64_t)vap->va_mode;
+ lr->lr_uid = (uint64_t)vap->va_uid;
+ lr->lr_gid = (uint64_t)vap->va_gid;
+ lr->lr_size = (uint64_t)vap->va_size;
+ ZFS_TIME_ENCODE(&vap->va_atime, lr->lr_atime);
+ ZFS_TIME_ENCODE(&vap->va_mtime, lr->lr_mtime);
+
+ itx->itx_sync = (zp->z_sync_cnt != 0);
+ seq = zil_itx_assign(zilog, itx, tx);
+ zp->z_last_itx = seq;
+}
+
+/*
+ * zfs_log_acl() handles TX_ACL transactions.
+ */
+void
+zfs_log_acl(zilog_t *zilog, dmu_tx_t *tx, int txtype,
+ znode_t *zp, int aclcnt, ace_t *z_ace)
+{
+ itx_t *itx;
+ uint64_t seq;
+ lr_acl_t *lr;
+
+ if (zilog == NULL || zp->z_unlinked)
+ return;
+
+ itx = zil_itx_create(txtype, sizeof (*lr) + aclcnt * sizeof (ace_t));
+ lr = (lr_acl_t *)&itx->itx_lr;
+ lr->lr_foid = zp->z_id;
+ lr->lr_aclcnt = (uint64_t)aclcnt;
+ bcopy(z_ace, (ace_t *)(lr + 1), aclcnt * sizeof (ace_t));
+
+ itx->itx_sync = (zp->z_sync_cnt != 0);
+ seq = zil_itx_assign(zilog, itx, tx);
+ zp->z_last_itx = seq;
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c
new file mode 100644
index 0000000..0b600ef
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_replay.c
@@ -0,0 +1,430 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/sysmacros.h>
+#include <sys/cmn_err.h>
+#include <sys/kmem.h>
+#include <sys/file.h>
+#include <sys/fcntl.h>
+#include <sys/vfs.h>
+#include <sys/fs/zfs.h>
+#include <sys/zfs_znode.h>
+#include <sys/zfs_dir.h>
+#include <sys/zfs_acl.h>
+#include <sys/spa.h>
+#include <sys/zil.h>
+#include <sys/byteorder.h>
+#include <sys/stat.h>
+#include <sys/acl.h>
+#include <sys/atomic.h>
+#include <sys/cred.h>
+#include <sys/namei.h>
+
+/*
+ * Functions to replay ZFS intent log (ZIL) records
+ * The functions are called through a function vector (zfs_replay_vector)
+ * which is indexed by the transaction type.
+ */
+
+static void
+zfs_init_vattr(vattr_t *vap, uint64_t mask, uint64_t mode,
+ uint64_t uid, uint64_t gid, uint64_t rdev, uint64_t nodeid)
+{
+ VATTR_NULL(vap);
+ vap->va_mask = (uint_t)mask;
+ vap->va_type = IFTOVT(mode);
+ vap->va_mode = mode & MODEMASK;
+ vap->va_uid = (uid_t)uid;
+ vap->va_gid = (gid_t)gid;
+ vap->va_rdev = zfs_cmpldev(rdev);
+ vap->va_nodeid = nodeid;
+}
+
+/* ARGSUSED */
+static int
+zfs_replay_error(zfsvfs_t *zfsvfs, lr_t *lr, boolean_t byteswap)
+{
+ return (ENOTSUP);
+}
+
+static int
+zfs_replay_create(zfsvfs_t *zfsvfs, lr_create_t *lr, boolean_t byteswap)
+{
+ char *name = (char *)(lr + 1); /* name follows lr_create_t */
+ char *link; /* symlink content follows name */
+ znode_t *dzp;
+ vnode_t *vp = NULL;
+ vattr_t va;
+ struct componentname cn;
+ int error;
+
+ if (byteswap)
+ byteswap_uint64_array(lr, sizeof (*lr));
+
+ if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0)
+ return (error);
+
+ zfs_init_vattr(&va, AT_TYPE | AT_MODE | AT_UID | AT_GID,
+ lr->lr_mode, lr->lr_uid, lr->lr_gid, lr->lr_rdev, lr->lr_foid);
+
+ /*
+ * All forms of zfs create (create, mkdir, mkxattrdir, symlink)
+ * eventually end up in zfs_mknode(), which assigns the object's
+ * creation time and generation number. The generic VOP_CREATE()
+ * doesn't have either concept, so we smuggle the values inside
+ * the vattr's otherwise unused va_ctime and va_nblocks fields.
+ */
+ ZFS_TIME_DECODE(&va.va_ctime, lr->lr_crtime);
+ va.va_nblocks = lr->lr_gen;
+
+ cn.cn_nameptr = name;
+ cn.cn_cred = kcred;
+ cn.cn_thread = curthread;
+ cn.cn_flags = SAVENAME;
+
+ vn_lock(ZTOV(dzp), LK_EXCLUSIVE | LK_RETRY, curthread);
+ switch ((int)lr->lr_common.lrc_txtype) {
+ case TX_CREATE:
+ error = VOP_CREATE(ZTOV(dzp), &vp, &cn, &va);
+ break;
+ case TX_MKDIR:
+ error = VOP_MKDIR(ZTOV(dzp), &vp, &cn, &va);
+ break;
+ case TX_MKXATTR:
+ error = zfs_make_xattrdir(dzp, &va, &vp, kcred);
+ break;
+ case TX_SYMLINK:
+ link = name + strlen(name) + 1;
+ error = VOP_SYMLINK(ZTOV(dzp), &vp, &cn, &va, link);
+ break;
+ default:
+ error = ENOTSUP;
+ }
+ VOP_UNLOCK(ZTOV(dzp), 0, curthread);
+
+ if (error == 0 && vp != NULL) {
+ VOP_UNLOCK(vp, 0, curthread);
+ VN_RELE(vp);
+ }
+
+ VN_RELE(ZTOV(dzp));
+
+ return (error);
+}
+
+static int
+zfs_replay_remove(zfsvfs_t *zfsvfs, lr_remove_t *lr, boolean_t byteswap)
+{
+ char *name = (char *)(lr + 1); /* name follows lr_remove_t */
+ znode_t *dzp;
+ struct componentname cn;
+ vnode_t *vp;
+ int error;
+
+ if (byteswap)
+ byteswap_uint64_array(lr, sizeof (*lr));
+
+ if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0)
+ return (error);
+
+ bzero(&cn, sizeof(cn));
+ cn.cn_nameptr = name;
+ cn.cn_namelen = strlen(name);
+ cn.cn_nameiop = DELETE;
+ cn.cn_flags = ISLASTCN | SAVENAME;
+ cn.cn_lkflags = LK_EXCLUSIVE | LK_RETRY;
+ cn.cn_cred = kcred;
+ cn.cn_thread = curthread;
+ vn_lock(ZTOV(dzp), LK_EXCLUSIVE | LK_RETRY, curthread);
+ error = VOP_LOOKUP(ZTOV(dzp), &vp, &cn);
+ if (error != 0) {
+ VOP_UNLOCK(ZTOV(dzp), 0, curthread);
+ goto fail;
+ }
+
+ switch ((int)lr->lr_common.lrc_txtype) {
+ case TX_REMOVE:
+ error = VOP_REMOVE(ZTOV(dzp), vp, &cn);
+ break;
+ case TX_RMDIR:
+ error = VOP_RMDIR(ZTOV(dzp), vp, &cn);
+ break;
+ default:
+ error = ENOTSUP;
+ }
+ vput(vp);
+ VOP_UNLOCK(ZTOV(dzp), 0, curthread);
+fail:
+ VN_RELE(ZTOV(dzp));
+
+ return (error);
+}
+
+static int
+zfs_replay_link(zfsvfs_t *zfsvfs, lr_link_t *lr, boolean_t byteswap)
+{
+ char *name = (char *)(lr + 1); /* name follows lr_link_t */
+ znode_t *dzp, *zp;
+ struct componentname cn;
+ int error;
+
+ if (byteswap)
+ byteswap_uint64_array(lr, sizeof (*lr));
+
+ if ((error = zfs_zget(zfsvfs, lr->lr_doid, &dzp)) != 0)
+ return (error);
+
+ if ((error = zfs_zget(zfsvfs, lr->lr_link_obj, &zp)) != 0) {
+ VN_RELE(ZTOV(dzp));
+ return (error);
+ }
+
+ cn.cn_nameptr = name;
+ cn.cn_cred = kcred;
+ cn.cn_thread = curthread;
+ cn.cn_flags = SAVENAME;
+
+ vn_lock(ZTOV(dzp), LK_EXCLUSIVE | LK_RETRY, curthread);
+ vn_lock(ZTOV(zp), LK_EXCLUSIVE | LK_RETRY, curthread);
+ error = VOP_LINK(ZTOV(dzp), ZTOV(zp), &cn);
+ VOP_UNLOCK(ZTOV(zp), 0, curthread);
+ VOP_UNLOCK(ZTOV(dzp), 0, curthread);
+
+ VN_RELE(ZTOV(zp));
+ VN_RELE(ZTOV(dzp));
+
+ return (error);
+}
+
+static int
+zfs_replay_rename(zfsvfs_t *zfsvfs, lr_rename_t *lr, boolean_t byteswap)
+{
+ char *sname = (char *)(lr + 1); /* sname and tname follow lr_rename_t */
+ char *tname = sname + strlen(sname) + 1;
+ znode_t *sdzp, *tdzp;
+ struct componentname scn, tcn;
+ vnode_t *svp, *tvp;
+ kthread_t *td = curthread;
+ int error;
+
+ if (byteswap)
+ byteswap_uint64_array(lr, sizeof (*lr));
+
+ if ((error = zfs_zget(zfsvfs, lr->lr_sdoid, &sdzp)) != 0)
+ return (error);
+
+ if ((error = zfs_zget(zfsvfs, lr->lr_tdoid, &tdzp)) != 0) {
+ VN_RELE(ZTOV(sdzp));
+ return (error);
+ }
+
+ svp = tvp = NULL;
+
+ bzero(&scn, sizeof(scn));
+ scn.cn_nameptr = sname;
+ scn.cn_namelen = strlen(sname);
+ scn.cn_nameiop = DELETE;
+ scn.cn_flags = ISLASTCN | SAVENAME;
+ scn.cn_lkflags = LK_EXCLUSIVE | LK_RETRY;
+ scn.cn_cred = kcred;
+ scn.cn_thread = td;
+ vn_lock(ZTOV(sdzp), LK_EXCLUSIVE | LK_RETRY, td);
+ error = VOP_LOOKUP(ZTOV(sdzp), &svp, &scn);
+ VOP_UNLOCK(ZTOV(sdzp), 0, td);
+ if (error != 0)
+ goto fail;
+ VOP_UNLOCK(svp, 0, td);
+
+ bzero(&tcn, sizeof(tcn));
+ tcn.cn_nameptr = tname;
+ tcn.cn_namelen = strlen(tname);
+ tcn.cn_nameiop = RENAME;
+ tcn.cn_flags = ISLASTCN | SAVENAME;
+ tcn.cn_lkflags = LK_EXCLUSIVE | LK_RETRY;
+ tcn.cn_cred = kcred;
+ tcn.cn_thread = td;
+ vn_lock(ZTOV(tdzp), LK_EXCLUSIVE | LK_RETRY, td);
+ error = VOP_LOOKUP(ZTOV(tdzp), &tvp, &tcn);
+ if (error == EJUSTRETURN)
+ tvp = NULL;
+ else if (error != 0) {
+ VOP_UNLOCK(ZTOV(tdzp), 0, td);
+ goto fail;
+ }
+
+ error = VOP_RENAME(ZTOV(sdzp), svp, &scn, ZTOV(tdzp), tvp, &tcn);
+ return (error);
+fail:
+ if (svp != NULL)
+ vrele(svp);
+ if (tvp != NULL)
+ vrele(tvp);
+ VN_RELE(ZTOV(tdzp));
+ VN_RELE(ZTOV(sdzp));
+
+ return (error);
+}
+
+static int
+zfs_replay_write(zfsvfs_t *zfsvfs, lr_write_t *lr, boolean_t byteswap)
+{
+ char *data = (char *)(lr + 1); /* data follows lr_write_t */
+ znode_t *zp;
+ int error;
+ ssize_t resid;
+
+ if (byteswap)
+ byteswap_uint64_array(lr, sizeof (*lr));
+
+ if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) {
+ /*
+ * As we can log writes out of order, it's possible the
+ * file has been removed. In this case just drop the write
+ * and return success.
+ */
+ if (error == ENOENT)
+ error = 0;
+ return (error);
+ }
+
+ error = vn_rdwr(UIO_WRITE, ZTOV(zp), data, lr->lr_length,
+ lr->lr_offset, UIO_SYSSPACE, 0, RLIM64_INFINITY, kcred, &resid);
+
+ VN_RELE(ZTOV(zp));
+
+ return (error);
+}
+
+static int
+zfs_replay_truncate(zfsvfs_t *zfsvfs, lr_truncate_t *lr, boolean_t byteswap)
+{
+
+ ZFS_LOG(0, "Unexpected code path, report to pjd@FreeBSD.org");
+ return (EOPNOTSUPP);
+}
+
+static int
+zfs_replay_setattr(zfsvfs_t *zfsvfs, lr_setattr_t *lr, boolean_t byteswap)
+{
+ znode_t *zp;
+ vattr_t va;
+ vnode_t *vp;
+ int error;
+
+ if (byteswap)
+ byteswap_uint64_array(lr, sizeof (*lr));
+
+ if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) {
+ /*
+ * As we can log setattrs out of order, it's possible the
+ * file has been removed. In this case just drop the setattr
+ * and return success.
+ */
+ if (error == ENOENT)
+ error = 0;
+ return (error);
+ }
+
+ zfs_init_vattr(&va, lr->lr_mask, lr->lr_mode,
+ lr->lr_uid, lr->lr_gid, 0, lr->lr_foid);
+
+ va.va_size = lr->lr_size;
+ ZFS_TIME_DECODE(&va.va_atime, lr->lr_atime);
+ ZFS_TIME_DECODE(&va.va_mtime, lr->lr_mtime);
+
+ vp = ZTOV(zp);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread);
+ error = VOP_SETATTR(vp, &va, kcred, curthread);
+ VOP_UNLOCK(vp, 0, curthread);
+ VN_RELE(vp);
+
+ return (error);
+}
+
+static int
+zfs_replay_acl(zfsvfs_t *zfsvfs, lr_acl_t *lr, boolean_t byteswap)
+{
+ ace_t *ace = (ace_t *)(lr + 1); /* ace array follows lr_acl_t */
+#ifdef TODO
+ vsecattr_t vsa;
+#endif
+ znode_t *zp;
+ int error;
+
+ if (byteswap) {
+ byteswap_uint64_array(lr, sizeof (*lr));
+ zfs_ace_byteswap(ace, lr->lr_aclcnt);
+ }
+
+ if ((error = zfs_zget(zfsvfs, lr->lr_foid, &zp)) != 0) {
+ /*
+ * As we can log acls out of order, it's possible the
+ * file has been removed. In this case just drop the acl
+ * and return success.
+ */
+ if (error == ENOENT)
+ error = 0;
+ return (error);
+ }
+
+#ifdef TODO
+ bzero(&vsa, sizeof (vsa));
+ vsa.vsa_mask = VSA_ACE | VSA_ACECNT;
+ vsa.vsa_aclcnt = lr->lr_aclcnt;
+ vsa.vsa_aclentp = ace;
+
+ error = VOP_SETSECATTR(ZTOV(zp), &vsa, 0, kcred);
+#else
+ error = EOPNOTSUPP;
+#endif
+
+ VN_RELE(ZTOV(zp));
+
+ return (error);
+}
+
+/*
+ * Callback vectors for replaying records
+ */
+zil_replay_func_t *zfs_replay_vector[TX_MAX_TYPE] = {
+ zfs_replay_error, /* 0 no such transaction type */
+ zfs_replay_create, /* TX_CREATE */
+ zfs_replay_create, /* TX_MKDIR */
+ zfs_replay_create, /* TX_MKXATTR */
+ zfs_replay_create, /* TX_SYMLINK */
+ zfs_replay_remove, /* TX_REMOVE */
+ zfs_replay_remove, /* TX_RMDIR */
+ zfs_replay_link, /* TX_LINK */
+ zfs_replay_rename, /* TX_RENAME */
+ zfs_replay_write, /* TX_WRITE */
+ zfs_replay_truncate, /* TX_TRUNCATE */
+ zfs_replay_setattr, /* TX_SETATTR */
+ zfs_replay_acl, /* TX_ACL */
+};
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c
new file mode 100644
index 0000000..07ec0f6
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_rlock.c
@@ -0,0 +1,594 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * This file contains the code to implement file range locking in
+ * ZFS, although there isn't much specific to ZFS (all that comes to mind
+ * support for growing the blocksize).
+ *
+ * Interface
+ * ---------
+ * Defined in zfs_rlock.h but essentially:
+ * rl = zfs_range_lock(zp, off, len, lock_type);
+ * zfs_range_unlock(rl);
+ * zfs_range_reduce(rl, off, len);
+ *
+ * AVL tree
+ * --------
+ * An AVL tree is used to maintain the state of the existing ranges
+ * that are locked for exclusive (writer) or shared (reader) use.
+ * The starting range offset is used for searching and sorting the tree.
+ *
+ * Common case
+ * -----------
+ * The (hopefully) usual case is of no overlaps or contention for
+ * locks. On entry to zfs_lock_range() a rl_t is allocated; the tree
+ * searched that finds no overlap, and *this* rl_t is placed in the tree.
+ *
+ * Overlaps/Reference counting/Proxy locks
+ * ---------------------------------------
+ * The avl code only allows one node at a particular offset. Also it's very
+ * inefficient to search through all previous entries looking for overlaps
+ * (because the very 1st in the ordered list might be at offset 0 but
+ * cover the whole file).
+ * So this implementation uses reference counts and proxy range locks.
+ * Firstly, only reader locks use reference counts and proxy locks,
+ * because writer locks are exclusive.
+ * When a reader lock overlaps with another then a proxy lock is created
+ * for that range and replaces the original lock. If the overlap
+ * is exact then the reference count of the proxy is simply incremented.
+ * Otherwise, the proxy lock is split into smaller lock ranges and
+ * new proxy locks created for non overlapping ranges.
+ * The reference counts are adjusted accordingly.
+ * Meanwhile, the orginal lock is kept around (this is the callers handle)
+ * and its offset and length are used when releasing the lock.
+ *
+ * Thread coordination
+ * -------------------
+ * In order to make wakeups efficient and to ensure multiple continuous
+ * readers on a range don't starve a writer for the same range lock,
+ * two condition variables are allocated in each rl_t.
+ * If a writer (or reader) can't get a range it initialises the writer
+ * (or reader) cv; sets a flag saying there's a writer (or reader) waiting;
+ * and waits on that cv. When a thread unlocks that range it wakes up all
+ * writers then all readers before destroying the lock.
+ *
+ * Append mode writes
+ * ------------------
+ * Append mode writes need to lock a range at the end of a file.
+ * The offset of the end of the file is determined under the
+ * range locking mutex, and the lock type converted from RL_APPEND to
+ * RL_WRITER and the range locked.
+ *
+ * Grow block handling
+ * -------------------
+ * ZFS supports multiple block sizes currently upto 128K. The smallest
+ * block size is used for the file which is grown as needed. During this
+ * growth all other writers and readers must be excluded.
+ * So if the block size needs to be grown then the whole file is
+ * exclusively locked, then later the caller will reduce the lock
+ * range to just the range to be written using zfs_reduce_range.
+ */
+
+#include <sys/zfs_rlock.h>
+
+/*
+ * Check if a write lock can be grabbed, or wait and recheck until available.
+ */
+static void
+zfs_range_lock_writer(znode_t *zp, rl_t *new)
+{
+ avl_tree_t *tree = &zp->z_range_avl;
+ rl_t *rl;
+ avl_index_t where;
+ uint64_t end_size;
+ uint64_t off = new->r_off;
+ uint64_t len = new->r_len;
+
+ for (;;) {
+ /*
+ * Range locking is also used by zvol and uses a
+ * dummied up znode. However, for zvol, we don't need to
+ * append or grow blocksize, and besides we don't have
+ * a z_phys or z_zfsvfs - so skip that processing.
+ *
+ * Yes, this is ugly, and would be solved by not handling
+ * grow or append in range lock code. If that was done then
+ * we could make the range locking code generically available
+ * to other non-zfs consumers.
+ */
+ if (zp->z_vnode) { /* caller is ZPL */
+ /*
+ * If in append mode pick up the current end of file.
+ * This is done under z_range_lock to avoid races.
+ */
+ if (new->r_type == RL_APPEND)
+ new->r_off = zp->z_phys->zp_size;
+
+ /*
+ * If we need to grow the block size then grab the whole
+ * file range. This is also done under z_range_lock to
+ * avoid races.
+ */
+ end_size = MAX(zp->z_phys->zp_size, new->r_off + len);
+ if (end_size > zp->z_blksz && (!ISP2(zp->z_blksz) ||
+ zp->z_blksz < zp->z_zfsvfs->z_max_blksz)) {
+ new->r_off = 0;
+ new->r_len = UINT64_MAX;
+ }
+ }
+
+ /*
+ * First check for the usual case of no locks
+ */
+ if (avl_numnodes(tree) == 0) {
+ new->r_type = RL_WRITER; /* convert to writer */
+ avl_add(tree, new);
+ return;
+ }
+
+ /*
+ * Look for any locks in the range.
+ */
+ rl = avl_find(tree, new, &where);
+ if (rl)
+ goto wait; /* already locked at same offset */
+
+ rl = (rl_t *)avl_nearest(tree, where, AVL_AFTER);
+ if (rl && (rl->r_off < new->r_off + new->r_len))
+ goto wait;
+
+ rl = (rl_t *)avl_nearest(tree, where, AVL_BEFORE);
+ if (rl && rl->r_off + rl->r_len > new->r_off)
+ goto wait;
+
+ new->r_type = RL_WRITER; /* convert possible RL_APPEND */
+ avl_insert(tree, new, where);
+ return;
+wait:
+ if (!rl->r_write_wanted) {
+ cv_init(&rl->r_wr_cv, NULL, CV_DEFAULT, NULL);
+ rl->r_write_wanted = B_TRUE;
+ }
+ cv_wait(&rl->r_wr_cv, &zp->z_range_lock);
+
+ /* reset to original */
+ new->r_off = off;
+ new->r_len = len;
+ }
+}
+
+/*
+ * If this is an original (non-proxy) lock then replace it by
+ * a proxy and return the proxy.
+ */
+static rl_t *
+zfs_range_proxify(avl_tree_t *tree, rl_t *rl)
+{
+ rl_t *proxy;
+
+ if (rl->r_proxy)
+ return (rl); /* already a proxy */
+
+ ASSERT3U(rl->r_cnt, ==, 1);
+ ASSERT(rl->r_write_wanted == B_FALSE);
+ ASSERT(rl->r_read_wanted == B_FALSE);
+ avl_remove(tree, rl);
+ rl->r_cnt = 0;
+
+ /* create a proxy range lock */
+ proxy = kmem_alloc(sizeof (rl_t), KM_SLEEP);
+ proxy->r_off = rl->r_off;
+ proxy->r_len = rl->r_len;
+ proxy->r_cnt = 1;
+ proxy->r_type = RL_READER;
+ proxy->r_proxy = B_TRUE;
+ proxy->r_write_wanted = B_FALSE;
+ proxy->r_read_wanted = B_FALSE;
+ avl_add(tree, proxy);
+
+ return (proxy);
+}
+
+/*
+ * Split the range lock at the supplied offset
+ * returning the *front* proxy.
+ */
+static rl_t *
+zfs_range_split(avl_tree_t *tree, rl_t *rl, uint64_t off)
+{
+ rl_t *front, *rear;
+
+ ASSERT3U(rl->r_len, >, 1);
+ ASSERT3U(off, >, rl->r_off);
+ ASSERT3U(off, <, rl->r_off + rl->r_len);
+ ASSERT(rl->r_write_wanted == B_FALSE);
+ ASSERT(rl->r_read_wanted == B_FALSE);
+
+ /* create the rear proxy range lock */
+ rear = kmem_alloc(sizeof (rl_t), KM_SLEEP);
+ rear->r_off = off;
+ rear->r_len = rl->r_off + rl->r_len - off;
+ rear->r_cnt = rl->r_cnt;
+ rear->r_type = RL_READER;
+ rear->r_proxy = B_TRUE;
+ rear->r_write_wanted = B_FALSE;
+ rear->r_read_wanted = B_FALSE;
+
+ front = zfs_range_proxify(tree, rl);
+ front->r_len = off - rl->r_off;
+
+ avl_insert_here(tree, rear, front, AVL_AFTER);
+ return (front);
+}
+
+/*
+ * Create and add a new proxy range lock for the supplied range.
+ */
+static void
+zfs_range_new_proxy(avl_tree_t *tree, uint64_t off, uint64_t len)
+{
+ rl_t *rl;
+
+ ASSERT(len);
+ rl = kmem_alloc(sizeof (rl_t), KM_SLEEP);
+ rl->r_off = off;
+ rl->r_len = len;
+ rl->r_cnt = 1;
+ rl->r_type = RL_READER;
+ rl->r_proxy = B_TRUE;
+ rl->r_write_wanted = B_FALSE;
+ rl->r_read_wanted = B_FALSE;
+ avl_add(tree, rl);
+}
+
+static void
+zfs_range_add_reader(avl_tree_t *tree, rl_t *new, rl_t *prev, avl_index_t where)
+{
+ rl_t *next;
+ uint64_t off = new->r_off;
+ uint64_t len = new->r_len;
+
+ /*
+ * prev arrives either:
+ * - pointing to an entry at the same offset
+ * - pointing to the entry with the closest previous offset whose
+ * range may overlap with the new range
+ * - null, if there were no ranges starting before the new one
+ */
+ if (prev) {
+ if (prev->r_off + prev->r_len <= off) {
+ prev = NULL;
+ } else if (prev->r_off != off) {
+ /*
+ * convert to proxy if needed then
+ * split this entry and bump ref count
+ */
+ prev = zfs_range_split(tree, prev, off);
+ prev = AVL_NEXT(tree, prev); /* move to rear range */
+ }
+ }
+ ASSERT((prev == NULL) || (prev->r_off == off));
+
+ if (prev)
+ next = prev;
+ else
+ next = (rl_t *)avl_nearest(tree, where, AVL_AFTER);
+
+ if (next == NULL || off + len <= next->r_off) {
+ /* no overlaps, use the original new rl_t in the tree */
+ avl_insert(tree, new, where);
+ return;
+ }
+
+ if (off < next->r_off) {
+ /* Add a proxy for initial range before the overlap */
+ zfs_range_new_proxy(tree, off, next->r_off - off);
+ }
+
+ new->r_cnt = 0; /* will use proxies in tree */
+ /*
+ * We now search forward through the ranges, until we go past the end
+ * of the new range. For each entry we make it a proxy if it
+ * isn't already, then bump its reference count. If there's any
+ * gaps between the ranges then we create a new proxy range.
+ */
+ for (prev = NULL; next; prev = next, next = AVL_NEXT(tree, next)) {
+ if (off + len <= next->r_off)
+ break;
+ if (prev && prev->r_off + prev->r_len < next->r_off) {
+ /* there's a gap */
+ ASSERT3U(next->r_off, >, prev->r_off + prev->r_len);
+ zfs_range_new_proxy(tree, prev->r_off + prev->r_len,
+ next->r_off - (prev->r_off + prev->r_len));
+ }
+ if (off + len == next->r_off + next->r_len) {
+ /* exact overlap with end */
+ next = zfs_range_proxify(tree, next);
+ next->r_cnt++;
+ return;
+ }
+ if (off + len < next->r_off + next->r_len) {
+ /* new range ends in the middle of this block */
+ next = zfs_range_split(tree, next, off + len);
+ next->r_cnt++;
+ return;
+ }
+ ASSERT3U(off + len, >, next->r_off + next->r_len);
+ next = zfs_range_proxify(tree, next);
+ next->r_cnt++;
+ }
+
+ /* Add the remaining end range. */
+ zfs_range_new_proxy(tree, prev->r_off + prev->r_len,
+ (off + len) - (prev->r_off + prev->r_len));
+}
+
+/*
+ * Check if a reader lock can be grabbed, or wait and recheck until available.
+ */
+static void
+zfs_range_lock_reader(znode_t *zp, rl_t *new)
+{
+ avl_tree_t *tree = &zp->z_range_avl;
+ rl_t *prev, *next;
+ avl_index_t where;
+ uint64_t off = new->r_off;
+ uint64_t len = new->r_len;
+
+ /*
+ * Look for any writer locks in the range.
+ */
+retry:
+ prev = avl_find(tree, new, &where);
+ if (prev == NULL)
+ prev = (rl_t *)avl_nearest(tree, where, AVL_BEFORE);
+
+ /*
+ * Check the previous range for a writer lock overlap.
+ */
+ if (prev && (off < prev->r_off + prev->r_len)) {
+ if ((prev->r_type == RL_WRITER) || (prev->r_write_wanted)) {
+ if (!prev->r_read_wanted) {
+ cv_init(&prev->r_rd_cv, NULL, CV_DEFAULT, NULL);
+ prev->r_read_wanted = B_TRUE;
+ }
+ cv_wait(&prev->r_rd_cv, &zp->z_range_lock);
+ goto retry;
+ }
+ if (off + len < prev->r_off + prev->r_len)
+ goto got_lock;
+ }
+
+ /*
+ * Search through the following ranges to see if there's
+ * write lock any overlap.
+ */
+ if (prev)
+ next = AVL_NEXT(tree, prev);
+ else
+ next = (rl_t *)avl_nearest(tree, where, AVL_AFTER);
+ for (; next; next = AVL_NEXT(tree, next)) {
+ if (off + len <= next->r_off)
+ goto got_lock;
+ if ((next->r_type == RL_WRITER) || (next->r_write_wanted)) {
+ if (!next->r_read_wanted) {
+ cv_init(&next->r_rd_cv, NULL, CV_DEFAULT, NULL);
+ next->r_read_wanted = B_TRUE;
+ }
+ cv_wait(&next->r_rd_cv, &zp->z_range_lock);
+ goto retry;
+ }
+ if (off + len <= next->r_off + next->r_len)
+ goto got_lock;
+ }
+
+got_lock:
+ /*
+ * Add the read lock, which may involve splitting existing
+ * locks and bumping ref counts (r_cnt).
+ */
+ zfs_range_add_reader(tree, new, prev, where);
+}
+
+/*
+ * Lock a range (offset, length) as either shared (RL_READER)
+ * or exclusive (RL_WRITER). Returns the range lock structure
+ * for later unlocking or reduce range (if entire file
+ * previously locked as RL_WRITER).
+ */
+rl_t *
+zfs_range_lock(znode_t *zp, uint64_t off, uint64_t len, rl_type_t type)
+{
+ rl_t *new;
+
+ ASSERT(type == RL_READER || type == RL_WRITER || type == RL_APPEND);
+
+ new = kmem_alloc(sizeof (rl_t), KM_SLEEP);
+ new->r_zp = zp;
+ new->r_off = off;
+ new->r_len = len;
+ new->r_cnt = 1; /* assume it's going to be in the tree */
+ new->r_type = type;
+ new->r_proxy = B_FALSE;
+ new->r_write_wanted = B_FALSE;
+ new->r_read_wanted = B_FALSE;
+
+ mutex_enter(&zp->z_range_lock);
+ if (type == RL_READER) {
+ /*
+ * First check for the usual case of no locks
+ */
+ if (avl_numnodes(&zp->z_range_avl) == 0)
+ avl_add(&zp->z_range_avl, new);
+ else
+ zfs_range_lock_reader(zp, new);
+ } else
+ zfs_range_lock_writer(zp, new); /* RL_WRITER or RL_APPEND */
+ mutex_exit(&zp->z_range_lock);
+ return (new);
+}
+
+/*
+ * Unlock a reader lock
+ */
+static void
+zfs_range_unlock_reader(znode_t *zp, rl_t *remove)
+{
+ avl_tree_t *tree = &zp->z_range_avl;
+ rl_t *rl, *next;
+ uint64_t len;
+
+ /*
+ * The common case is when the remove entry is in the tree
+ * (cnt == 1) meaning there's been no other reader locks overlapping
+ * with this one. Otherwise the remove entry will have been
+ * removed from the tree and replaced by proxies (one or
+ * more ranges mapping to the entire range).
+ */
+ if (remove->r_cnt == 1) {
+ avl_remove(tree, remove);
+ if (remove->r_write_wanted)
+ cv_broadcast(&remove->r_wr_cv);
+ if (remove->r_read_wanted)
+ cv_broadcast(&remove->r_rd_cv);
+ } else {
+ ASSERT3U(remove->r_cnt, ==, 0);
+ ASSERT3U(remove->r_write_wanted, ==, 0);
+ ASSERT3U(remove->r_read_wanted, ==, 0);
+ /*
+ * Find start proxy representing this reader lock,
+ * then decrement ref count on all proxies
+ * that make up this range, freeing them as needed.
+ */
+ rl = avl_find(tree, remove, NULL);
+ ASSERT(rl);
+ ASSERT(rl->r_cnt);
+ ASSERT(rl->r_type == RL_READER);
+ for (len = remove->r_len; len != 0; rl = next) {
+ len -= rl->r_len;
+ if (len) {
+ next = AVL_NEXT(tree, rl);
+ ASSERT(next);
+ ASSERT(rl->r_off + rl->r_len == next->r_off);
+ ASSERT(next->r_cnt);
+ ASSERT(next->r_type == RL_READER);
+ }
+ rl->r_cnt--;
+ if (rl->r_cnt == 0) {
+ avl_remove(tree, rl);
+ if (rl->r_write_wanted)
+ cv_broadcast(&rl->r_wr_cv);
+ if (rl->r_read_wanted)
+ cv_broadcast(&rl->r_rd_cv);
+ kmem_free(rl, sizeof (rl_t));
+ }
+ }
+ }
+ kmem_free(remove, sizeof (rl_t));
+}
+
+/*
+ * Unlock range and destroy range lock structure.
+ */
+void
+zfs_range_unlock(rl_t *rl)
+{
+ znode_t *zp = rl->r_zp;
+
+ ASSERT(rl->r_type == RL_WRITER || rl->r_type == RL_READER);
+ ASSERT(rl->r_cnt == 1 || rl->r_cnt == 0);
+ ASSERT(!rl->r_proxy);
+
+ mutex_enter(&zp->z_range_lock);
+ if (rl->r_type == RL_WRITER) {
+ /* writer locks can't be shared or split */
+ avl_remove(&zp->z_range_avl, rl);
+ mutex_exit(&zp->z_range_lock);
+ if (rl->r_write_wanted) {
+ cv_broadcast(&rl->r_wr_cv);
+ cv_destroy(&rl->r_wr_cv);
+ }
+ if (rl->r_read_wanted) {
+ cv_broadcast(&rl->r_rd_cv);
+ cv_destroy(&rl->r_rd_cv);
+ }
+ kmem_free(rl, sizeof (rl_t));
+ } else {
+ /*
+ * lock may be shared, let zfs_range_unlock_reader()
+ * release the lock and free the rl_t
+ */
+ zfs_range_unlock_reader(zp, rl);
+ mutex_exit(&zp->z_range_lock);
+ }
+}
+
+/*
+ * Reduce range locked as RL_WRITER from whole file to specified range.
+ * Asserts the whole file is exclusivly locked and so there's only one
+ * entry in the tree.
+ */
+void
+zfs_range_reduce(rl_t *rl, uint64_t off, uint64_t len)
+{
+ znode_t *zp = rl->r_zp;
+
+ /* Ensure there are no other locks */
+ ASSERT(avl_numnodes(&zp->z_range_avl) == 1);
+ ASSERT(rl->r_off == 0);
+ ASSERT(rl->r_type == RL_WRITER);
+ ASSERT(!rl->r_proxy);
+ ASSERT3U(rl->r_len, ==, UINT64_MAX);
+ ASSERT3U(rl->r_cnt, ==, 1);
+
+ mutex_enter(&zp->z_range_lock);
+ rl->r_off = off;
+ rl->r_len = len;
+ mutex_exit(&zp->z_range_lock);
+ if (rl->r_write_wanted)
+ cv_broadcast(&rl->r_wr_cv);
+ if (rl->r_read_wanted)
+ cv_broadcast(&rl->r_rd_cv);
+}
+
+/*
+ * AVL comparison function used to order range locks
+ * Locks are ordered on the start offset of the range.
+ */
+int
+zfs_range_compare(const void *arg1, const void *arg2)
+{
+ const rl_t *rl1 = arg1;
+ const rl_t *rl2 = arg2;
+
+ if (rl1->r_off > rl2->r_off)
+ return (1);
+ if (rl1->r_off < rl2->r_off)
+ return (-1);
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
new file mode 100644
index 0000000..259b77c
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vfsops.c
@@ -0,0 +1,980 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/kernel.h>
+#include <sys/sysmacros.h>
+#include <sys/kmem.h>
+#include <sys/acl.h>
+#include <sys/vnode.h>
+#include <sys/vfs.h>
+#include <sys/mntent.h>
+#include <sys/mount.h>
+#include <sys/cmn_err.h>
+#include <sys/zfs_znode.h>
+#include <sys/zfs_dir.h>
+#include <sys/zil.h>
+#include <sys/fs/zfs.h>
+#include <sys/dmu.h>
+#include <sys/dsl_prop.h>
+#include <sys/dsl_dataset.h>
+#include <sys/spa.h>
+#include <sys/zap.h>
+#include <sys/varargs.h>
+#include <sys/policy.h>
+#include <sys/atomic.h>
+#include <sys/zfs_ioctl.h>
+#include <sys/zfs_ctldir.h>
+#include <sys/sunddi.h>
+#include <sys/dnlc.h>
+
+struct mtx zfs_debug_mtx;
+MTX_SYSINIT(zfs_debug_mtx, &zfs_debug_mtx, "zfs_debug", MTX_DEF);
+SYSCTL_NODE(_vfs, OID_AUTO, zfs, CTLFLAG_RW, 0, "ZFS file system");
+int zfs_debug_level = 0;
+TUNABLE_INT("vfs.zfs.debug", &zfs_debug_level);
+SYSCTL_INT(_vfs_zfs, OID_AUTO, debug, CTLFLAG_RW, &zfs_debug_level, 0,
+ "Debug level");
+
+static int zfs_mount(vfs_t *vfsp, kthread_t *td);
+static int zfs_umount(vfs_t *vfsp, int fflag, kthread_t *td);
+static int zfs_root(vfs_t *vfsp, int flags, vnode_t **vpp, kthread_t *td);
+static int zfs_statfs(vfs_t *vfsp, struct statfs *statp, kthread_t *td);
+static int zfs_vget(vfs_t *vfsp, ino_t ino, int flags, vnode_t **vpp);
+static int zfs_sync(vfs_t *vfsp, int waitfor, kthread_t *td);
+static int zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, vnode_t **vpp);
+static void zfs_objset_close(zfsvfs_t *zfsvfs);
+static void zfs_freevfs(vfs_t *vfsp);
+
+static struct vfsops zfs_vfsops = {
+ .vfs_mount = zfs_mount,
+ .vfs_unmount = zfs_umount,
+ .vfs_root = zfs_root,
+ .vfs_statfs = zfs_statfs,
+ .vfs_vget = zfs_vget,
+ .vfs_sync = zfs_sync,
+ .vfs_fhtovp = zfs_fhtovp,
+};
+
+VFS_SET(zfs_vfsops, zfs, VFCF_JAIL);
+
+/*
+ * We need to keep a count of active fs's.
+ * This is necessary to prevent our module
+ * from being unloaded after a umount -f
+ */
+static uint32_t zfs_active_fs_count = 0;
+
+/*ARGSUSED*/
+static int
+zfs_sync(vfs_t *vfsp, int waitfor, kthread_t *td)
+{
+
+ /*
+ * Data integrity is job one. We don't want a compromised kernel
+ * writing to the storage pool, so we never sync during panic.
+ */
+ if (panicstr)
+ return (0);
+
+ if (vfsp != NULL) {
+ /*
+ * Sync a specific filesystem.
+ */
+ zfsvfs_t *zfsvfs = vfsp->vfs_data;
+ int error;
+
+ error = vfs_stdsync(vfsp, waitfor, td);
+ if (error != 0)
+ return (error);
+
+ ZFS_ENTER(zfsvfs);
+ if (zfsvfs->z_log != NULL)
+ zil_commit(zfsvfs->z_log, UINT64_MAX, 0);
+ else
+ txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0);
+ ZFS_EXIT(zfsvfs);
+ } else {
+ /*
+ * Sync all ZFS filesystems. This is what happens when you
+ * run sync(1M). Unlike other filesystems, ZFS honors the
+ * request by waiting for all pools to commit all dirty data.
+ */
+ spa_sync_allpools();
+ }
+
+ return (0);
+}
+
+static void
+atime_changed_cb(void *arg, uint64_t newval)
+{
+ zfsvfs_t *zfsvfs = arg;
+
+ if (newval == TRUE) {
+ zfsvfs->z_atime = TRUE;
+ zfsvfs->z_vfs->vfs_flag &= ~MNT_NOATIME;
+ vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOATIME);
+ vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_ATIME, NULL, 0);
+ } else {
+ zfsvfs->z_atime = FALSE;
+ zfsvfs->z_vfs->vfs_flag |= MNT_NOATIME;
+ vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_ATIME);
+ vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOATIME, NULL, 0);
+ }
+}
+
+static void
+xattr_changed_cb(void *arg, uint64_t newval)
+{
+ zfsvfs_t *zfsvfs = arg;
+
+ if (newval == TRUE) {
+ /* XXX locking on vfs_flag? */
+#ifdef TODO
+ zfsvfs->z_vfs->vfs_flag |= VFS_XATTR;
+#endif
+ vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOXATTR);
+ vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_XATTR, NULL, 0);
+ } else {
+ /* XXX locking on vfs_flag? */
+#ifdef TODO
+ zfsvfs->z_vfs->vfs_flag &= ~VFS_XATTR;
+#endif
+ vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_XATTR);
+ vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOXATTR, NULL, 0);
+ }
+}
+
+static void
+blksz_changed_cb(void *arg, uint64_t newval)
+{
+ zfsvfs_t *zfsvfs = arg;
+
+ if (newval < SPA_MINBLOCKSIZE ||
+ newval > SPA_MAXBLOCKSIZE || !ISP2(newval))
+ newval = SPA_MAXBLOCKSIZE;
+
+ zfsvfs->z_max_blksz = newval;
+ zfsvfs->z_vfs->vfs_bsize = newval;
+}
+
+static void
+readonly_changed_cb(void *arg, uint64_t newval)
+{
+ zfsvfs_t *zfsvfs = arg;
+
+ if (newval) {
+ /* XXX locking on vfs_flag? */
+ zfsvfs->z_vfs->vfs_flag |= VFS_RDONLY;
+ vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_RW);
+ vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_RO, NULL, 0);
+ } else {
+ /* XXX locking on vfs_flag? */
+ zfsvfs->z_vfs->vfs_flag &= ~VFS_RDONLY;
+ vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_RO);
+ vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_RW, NULL, 0);
+ }
+}
+
+static void
+setuid_changed_cb(void *arg, uint64_t newval)
+{
+ zfsvfs_t *zfsvfs = arg;
+
+ if (newval == FALSE) {
+ zfsvfs->z_vfs->vfs_flag |= VFS_NOSETUID;
+ vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_SETUID);
+ vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOSETUID, NULL, 0);
+ } else {
+ zfsvfs->z_vfs->vfs_flag &= ~VFS_NOSETUID;
+ vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOSETUID);
+ vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_SETUID, NULL, 0);
+ }
+}
+
+static void
+exec_changed_cb(void *arg, uint64_t newval)
+{
+ zfsvfs_t *zfsvfs = arg;
+
+ if (newval == FALSE) {
+ zfsvfs->z_vfs->vfs_flag |= VFS_NOEXEC;
+ vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_EXEC);
+ vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_NOEXEC, NULL, 0);
+ } else {
+ zfsvfs->z_vfs->vfs_flag &= ~VFS_NOEXEC;
+ vfs_clearmntopt(zfsvfs->z_vfs, MNTOPT_NOEXEC);
+ vfs_setmntopt(zfsvfs->z_vfs, MNTOPT_EXEC, NULL, 0);
+ }
+}
+
+static void
+snapdir_changed_cb(void *arg, uint64_t newval)
+{
+ zfsvfs_t *zfsvfs = arg;
+
+ zfsvfs->z_show_ctldir = newval;
+}
+
+static void
+acl_mode_changed_cb(void *arg, uint64_t newval)
+{
+ zfsvfs_t *zfsvfs = arg;
+
+ zfsvfs->z_acl_mode = newval;
+}
+
+static void
+acl_inherit_changed_cb(void *arg, uint64_t newval)
+{
+ zfsvfs_t *zfsvfs = arg;
+
+ zfsvfs->z_acl_inherit = newval;
+}
+
+static int
+zfs_refresh_properties(vfs_t *vfsp)
+{
+ zfsvfs_t *zfsvfs = vfsp->vfs_data;
+
+ /*
+ * Remount operations default to "rw" unless "ro" is explicitly
+ * specified.
+ */
+ if (vfs_optionisset(vfsp, MNTOPT_RO, NULL)) {
+ readonly_changed_cb(zfsvfs, B_TRUE);
+ } else {
+ if (!dmu_objset_is_snapshot(zfsvfs->z_os))
+ readonly_changed_cb(zfsvfs, B_FALSE);
+ else if (vfs_optionisset(vfsp, MNTOPT_RW, NULL))
+ return (EROFS);
+ }
+
+ if (vfs_optionisset(vfsp, MNTOPT_NOSUID, NULL)) {
+ setuid_changed_cb(zfsvfs, B_FALSE);
+ } else {
+ if (vfs_optionisset(vfsp, MNTOPT_NOSETUID, NULL))
+ setuid_changed_cb(zfsvfs, B_FALSE);
+ else if (vfs_optionisset(vfsp, MNTOPT_SETUID, NULL))
+ setuid_changed_cb(zfsvfs, B_TRUE);
+ }
+
+ if (vfs_optionisset(vfsp, MNTOPT_NOEXEC, NULL))
+ exec_changed_cb(zfsvfs, B_FALSE);
+ else if (vfs_optionisset(vfsp, MNTOPT_EXEC, NULL))
+ exec_changed_cb(zfsvfs, B_TRUE);
+
+ if (vfs_optionisset(vfsp, MNTOPT_ATIME, NULL))
+ atime_changed_cb(zfsvfs, B_TRUE);
+ else if (vfs_optionisset(vfsp, MNTOPT_NOATIME, NULL))
+ atime_changed_cb(zfsvfs, B_FALSE);
+
+ if (vfs_optionisset(vfsp, MNTOPT_XATTR, NULL))
+ xattr_changed_cb(zfsvfs, B_TRUE);
+ else if (vfs_optionisset(vfsp, MNTOPT_NOXATTR, NULL))
+ xattr_changed_cb(zfsvfs, B_FALSE);
+
+ return (0);
+}
+
+static int
+zfs_register_callbacks(vfs_t *vfsp)
+{
+ struct dsl_dataset *ds = NULL;
+ objset_t *os = NULL;
+ zfsvfs_t *zfsvfs = NULL;
+ int readonly, do_readonly = FALSE;
+ int setuid, do_setuid = FALSE;
+ int exec, do_exec = FALSE;
+ int xattr, do_xattr = FALSE;
+ int error = 0;
+
+ ASSERT(vfsp);
+ zfsvfs = vfsp->vfs_data;
+ ASSERT(zfsvfs);
+ os = zfsvfs->z_os;
+
+ /*
+ * The act of registering our callbacks will destroy any mount
+ * options we may have. In order to enable temporary overrides
+ * of mount options, we stash away the current values and
+ * restore them after we register the callbacks.
+ */
+ if (vfs_optionisset(vfsp, MNTOPT_RO, NULL)) {
+ readonly = B_TRUE;
+ do_readonly = B_TRUE;
+ } else if (vfs_optionisset(vfsp, MNTOPT_RW, NULL)) {
+ readonly = B_FALSE;
+ do_readonly = B_TRUE;
+ }
+ if (vfs_optionisset(vfsp, MNTOPT_NOSUID, NULL)) {
+ setuid = B_FALSE;
+ do_setuid = B_TRUE;
+ } else {
+ if (vfs_optionisset(vfsp, MNTOPT_NOSETUID, NULL)) {
+ setuid = B_FALSE;
+ do_setuid = B_TRUE;
+ } else if (vfs_optionisset(vfsp, MNTOPT_SETUID, NULL)) {
+ setuid = B_TRUE;
+ do_setuid = B_TRUE;
+ }
+ }
+ if (vfs_optionisset(vfsp, MNTOPT_NOEXEC, NULL)) {
+ exec = B_FALSE;
+ do_exec = B_TRUE;
+ } else if (vfs_optionisset(vfsp, MNTOPT_EXEC, NULL)) {
+ exec = B_TRUE;
+ do_exec = B_TRUE;
+ }
+ if (vfs_optionisset(vfsp, MNTOPT_NOXATTR, NULL)) {
+ xattr = B_FALSE;
+ do_xattr = B_TRUE;
+ } else if (vfs_optionisset(vfsp, MNTOPT_XATTR, NULL)) {
+ xattr = B_TRUE;
+ do_xattr = B_TRUE;
+ }
+
+ /*
+ * Register property callbacks.
+ *
+ * It would probably be fine to just check for i/o error from
+ * the first prop_register(), but I guess I like to go
+ * overboard...
+ */
+ ds = dmu_objset_ds(os);
+ error = dsl_prop_register(ds, "atime", atime_changed_cb, zfsvfs);
+ error = error ? error : dsl_prop_register(ds,
+ "xattr", xattr_changed_cb, zfsvfs);
+ error = error ? error : dsl_prop_register(ds,
+ "recordsize", blksz_changed_cb, zfsvfs);
+ error = error ? error : dsl_prop_register(ds,
+ "readonly", readonly_changed_cb, zfsvfs);
+ error = error ? error : dsl_prop_register(ds,
+ "setuid", setuid_changed_cb, zfsvfs);
+ error = error ? error : dsl_prop_register(ds,
+ "exec", exec_changed_cb, zfsvfs);
+ error = error ? error : dsl_prop_register(ds,
+ "snapdir", snapdir_changed_cb, zfsvfs);
+ error = error ? error : dsl_prop_register(ds,
+ "aclmode", acl_mode_changed_cb, zfsvfs);
+ error = error ? error : dsl_prop_register(ds,
+ "aclinherit", acl_inherit_changed_cb, zfsvfs);
+ if (error)
+ goto unregister;
+
+ /*
+ * Invoke our callbacks to restore temporary mount options.
+ */
+ if (do_readonly)
+ readonly_changed_cb(zfsvfs, readonly);
+ if (do_setuid)
+ setuid_changed_cb(zfsvfs, setuid);
+ if (do_exec)
+ exec_changed_cb(zfsvfs, exec);
+ if (do_xattr)
+ xattr_changed_cb(zfsvfs, xattr);
+
+ return (0);
+
+unregister:
+ /*
+ * We may attempt to unregister some callbacks that are not
+ * registered, but this is OK; it will simply return ENOMSG,
+ * which we will ignore.
+ */
+ (void) dsl_prop_unregister(ds, "atime", atime_changed_cb, zfsvfs);
+ (void) dsl_prop_unregister(ds, "xattr", xattr_changed_cb, zfsvfs);
+ (void) dsl_prop_unregister(ds, "recordsize", blksz_changed_cb, zfsvfs);
+ (void) dsl_prop_unregister(ds, "readonly", readonly_changed_cb, zfsvfs);
+ (void) dsl_prop_unregister(ds, "setuid", setuid_changed_cb, zfsvfs);
+ (void) dsl_prop_unregister(ds, "exec", exec_changed_cb, zfsvfs);
+ (void) dsl_prop_unregister(ds, "snapdir", snapdir_changed_cb, zfsvfs);
+ (void) dsl_prop_unregister(ds, "aclmode", acl_mode_changed_cb, zfsvfs);
+ (void) dsl_prop_unregister(ds, "aclinherit", acl_inherit_changed_cb,
+ zfsvfs);
+ return (error);
+
+}
+
+static int
+zfs_domount(vfs_t *vfsp, char *osname, kthread_t *td)
+{
+ cred_t *cr = td->td_ucred;
+ uint64_t recordsize, readonly;
+ int error = 0;
+ int mode;
+ zfsvfs_t *zfsvfs;
+ znode_t *zp = NULL;
+
+ ASSERT(vfsp);
+ ASSERT(osname);
+
+ /*
+ * Initialize the zfs-specific filesystem structure.
+ * Should probably make this a kmem cache, shuffle fields,
+ * and just bzero up to z_hold_mtx[].
+ */
+ zfsvfs = kmem_zalloc(sizeof (zfsvfs_t), KM_SLEEP);
+ zfsvfs->z_vfs = vfsp;
+ zfsvfs->z_parent = zfsvfs;
+ zfsvfs->z_assign = TXG_NOWAIT;
+ zfsvfs->z_max_blksz = SPA_MAXBLOCKSIZE;
+ zfsvfs->z_show_ctldir = ZFS_SNAPDIR_VISIBLE;
+
+ mutex_init(&zfsvfs->z_znodes_lock, NULL, MUTEX_DEFAULT, NULL);
+ list_create(&zfsvfs->z_all_znodes, sizeof (znode_t),
+ offsetof(znode_t, z_link_node));
+ rw_init(&zfsvfs->z_um_lock, NULL, RW_DEFAULT, NULL);
+
+ if (error = dsl_prop_get_integer(osname, "recordsize", &recordsize,
+ NULL))
+ goto out;
+ zfsvfs->z_vfs->vfs_bsize = recordsize;
+
+ vfsp->vfs_data = zfsvfs;
+ vfsp->mnt_flag |= MNT_LOCAL;
+ vfsp->mnt_kern_flag |= MNTK_MPSAFE;
+ vfsp->mnt_kern_flag |= MNTK_LOOKUP_SHARED;
+
+ if (error = dsl_prop_get_integer(osname, "readonly", &readonly, NULL))
+ goto out;
+
+ if (readonly)
+ mode = DS_MODE_PRIMARY | DS_MODE_READONLY;
+ else
+ mode = DS_MODE_PRIMARY;
+
+ error = dmu_objset_open(osname, DMU_OST_ZFS, mode, &zfsvfs->z_os);
+ if (error == EROFS) {
+ mode = DS_MODE_PRIMARY | DS_MODE_READONLY;
+ error = dmu_objset_open(osname, DMU_OST_ZFS, mode,
+ &zfsvfs->z_os);
+ }
+
+ if (error)
+ goto out;
+
+ if (error = zfs_init_fs(zfsvfs, &zp, cr))
+ goto out;
+
+ if (dmu_objset_is_snapshot(zfsvfs->z_os)) {
+ uint64_t xattr;
+
+ ASSERT(mode & DS_MODE_READONLY);
+ atime_changed_cb(zfsvfs, B_FALSE);
+ readonly_changed_cb(zfsvfs, B_TRUE);
+ if (error = dsl_prop_get_integer(osname, "xattr", &xattr, NULL))
+ goto out;
+ xattr_changed_cb(zfsvfs, xattr);
+ zfsvfs->z_issnap = B_TRUE;
+ } else {
+ error = zfs_register_callbacks(vfsp);
+ if (error)
+ goto out;
+
+ zfs_unlinked_drain(zfsvfs);
+
+ /*
+ * Parse and replay the intent log.
+ */
+ zil_replay(zfsvfs->z_os, zfsvfs, &zfsvfs->z_assign,
+ zfs_replay_vector);
+
+ if (!zil_disable)
+ zfsvfs->z_log = zil_open(zfsvfs->z_os, zfs_get_data);
+ }
+
+ vfs_mountedfrom(vfsp, osname);
+
+ if (!zfsvfs->z_issnap)
+ zfsctl_create(zfsvfs);
+out:
+ if (error) {
+ if (zfsvfs->z_os)
+ dmu_objset_close(zfsvfs->z_os);
+ rw_destroy(&zfsvfs->z_um_lock);
+ mutex_destroy(&zfsvfs->z_znodes_lock);
+ kmem_free(zfsvfs, sizeof (zfsvfs_t));
+ } else {
+ atomic_add_32(&zfs_active_fs_count, 1);
+ }
+
+ return (error);
+
+}
+
+void
+zfs_unregister_callbacks(zfsvfs_t *zfsvfs)
+{
+ objset_t *os = zfsvfs->z_os;
+ struct dsl_dataset *ds;
+
+ /*
+ * Unregister properties.
+ */
+ if (!dmu_objset_is_snapshot(os)) {
+ ds = dmu_objset_ds(os);
+ VERIFY(dsl_prop_unregister(ds, "atime", atime_changed_cb,
+ zfsvfs) == 0);
+
+ VERIFY(dsl_prop_unregister(ds, "xattr", xattr_changed_cb,
+ zfsvfs) == 0);
+
+ VERIFY(dsl_prop_unregister(ds, "recordsize", blksz_changed_cb,
+ zfsvfs) == 0);
+
+ VERIFY(dsl_prop_unregister(ds, "readonly", readonly_changed_cb,
+ zfsvfs) == 0);
+
+ VERIFY(dsl_prop_unregister(ds, "setuid", setuid_changed_cb,
+ zfsvfs) == 0);
+
+ VERIFY(dsl_prop_unregister(ds, "exec", exec_changed_cb,
+ zfsvfs) == 0);
+
+ VERIFY(dsl_prop_unregister(ds, "snapdir", snapdir_changed_cb,
+ zfsvfs) == 0);
+
+ VERIFY(dsl_prop_unregister(ds, "aclmode", acl_mode_changed_cb,
+ zfsvfs) == 0);
+
+ VERIFY(dsl_prop_unregister(ds, "aclinherit",
+ acl_inherit_changed_cb, zfsvfs) == 0);
+ }
+}
+
+/*ARGSUSED*/
+static int
+zfs_mount(vfs_t *vfsp, kthread_t *td)
+{
+ char *from;
+ int error;
+
+ /*
+ * When doing a remount, we simply refresh our temporary properties
+ * according to those options set in the current VFS options.
+ */
+ if (vfsp->vfs_flag & MS_REMOUNT)
+ return (zfs_refresh_properties(vfsp));
+
+ if (vfs_getopt(vfsp->mnt_optnew, "from", (void **)&from, NULL))
+ return (EINVAL);
+
+ DROP_GIANT();
+ error = zfs_domount(vfsp, from, td);
+ PICKUP_GIANT();
+ return (error);
+}
+
+static int
+zfs_statfs(vfs_t *vfsp, struct statfs *statp, kthread_t *td)
+{
+ zfsvfs_t *zfsvfs = vfsp->vfs_data;
+ uint64_t refdbytes, availbytes, usedobjs, availobjs;
+
+ statp->f_version = STATFS_VERSION;
+
+ ZFS_ENTER(zfsvfs);
+
+ dmu_objset_space(zfsvfs->z_os,
+ &refdbytes, &availbytes, &usedobjs, &availobjs);
+
+ /*
+ * The underlying storage pool actually uses multiple block sizes.
+ * We report the fragsize as the smallest block size we support,
+ * and we report our blocksize as the filesystem's maximum blocksize.
+ */
+ statp->f_bsize = zfsvfs->z_vfs->vfs_bsize;
+ statp->f_iosize = zfsvfs->z_vfs->vfs_bsize;
+
+ /*
+ * The following report "total" blocks of various kinds in the
+ * file system, but reported in terms of f_frsize - the
+ * "fragment" size.
+ */
+
+ statp->f_blocks = (refdbytes + availbytes) / statp->f_bsize;
+ statp->f_bfree = availbytes / statp->f_bsize;
+ statp->f_bavail = statp->f_bfree; /* no root reservation */
+
+ /*
+ * statvfs() should really be called statufs(), because it assumes
+ * static metadata. ZFS doesn't preallocate files, so the best
+ * we can do is report the max that could possibly fit in f_files,
+ * and that minus the number actually used in f_ffree.
+ * For f_ffree, report the smaller of the number of object available
+ * and the number of blocks (each object will take at least a block).
+ */
+ statp->f_ffree = MIN(availobjs, statp->f_bfree);
+ statp->f_files = statp->f_ffree + usedobjs;
+
+ /*
+ * We're a zfs filesystem.
+ */
+ (void) strlcpy(statp->f_fstypename, "zfs", sizeof(statp->f_fstypename));
+
+ strlcpy(statp->f_mntfromname, vfsp->mnt_stat.f_mntfromname,
+ sizeof(statp->f_mntfromname));
+ strlcpy(statp->f_mntonname, vfsp->mnt_stat.f_mntonname,
+ sizeof(statp->f_mntonname));
+
+ statp->f_namemax = ZFS_MAXNAMELEN;
+
+ ZFS_EXIT(zfsvfs);
+ return (0);
+}
+
+static int
+zfs_root(vfs_t *vfsp, int flags, vnode_t **vpp, kthread_t *td)
+{
+ zfsvfs_t *zfsvfs = vfsp->vfs_data;
+ znode_t *rootzp;
+ int error;
+
+ ZFS_ENTER(zfsvfs);
+
+ error = zfs_zget(zfsvfs, zfsvfs->z_root, &rootzp);
+ if (error == 0) {
+ *vpp = ZTOV(rootzp);
+ error = vn_lock(*vpp, flags, td);
+ (*vpp)->v_vflag |= VV_ROOT;
+ }
+
+ ZFS_EXIT(zfsvfs);
+ return (error);
+}
+
+/*ARGSUSED*/
+static int
+zfs_umount(vfs_t *vfsp, int fflag, kthread_t *td)
+{
+ zfsvfs_t *zfsvfs = vfsp->vfs_data;
+ cred_t *cr = td->td_ucred;
+ int ret;
+
+ if ((ret = secpolicy_fs_unmount(cr, vfsp)) != 0)
+ return (ret);
+
+ (void) dnlc_purge_vfsp(vfsp, 0);
+
+ /*
+ * Unmount any snapshots mounted under .zfs before unmounting the
+ * dataset itself.
+ */
+ if (zfsvfs->z_ctldir != NULL) {
+ if ((ret = zfsctl_umount_snapshots(vfsp, fflag, cr)) != 0)
+ return (ret);
+ ret = vflush(vfsp, 0, 0, td);
+ ASSERT(ret == EBUSY);
+ if (!(fflag & MS_FORCE)) {
+ if (zfsvfs->z_ctldir->v_count > 1)
+ return (EBUSY);
+ ASSERT(zfsvfs->z_ctldir->v_count == 1);
+ }
+ zfsctl_destroy(zfsvfs);
+ ASSERT(zfsvfs->z_ctldir == NULL);
+ }
+
+ /*
+ * Flush all the files.
+ */
+ ret = vflush(vfsp, 1, (fflag & MS_FORCE) ? FORCECLOSE : 0, td);
+ if (ret != 0) {
+ if (!zfsvfs->z_issnap) {
+ zfsctl_create(zfsvfs);
+ ASSERT(zfsvfs->z_ctldir != NULL);
+ }
+ return (ret);
+ }
+
+ if (fflag & MS_FORCE) {
+ MNT_ILOCK(vfsp);
+ vfsp->mnt_kern_flag |= MNTK_UNMOUNTF;
+ MNT_IUNLOCK(vfsp);
+ zfsvfs->z_unmounted1 = B_TRUE;
+
+ /*
+ * Wait for all zfs threads to leave zfs.
+ * Grabbing a rwlock as reader in all vops and
+ * as writer here doesn't work because it too easy to get
+ * multiple reader enters as zfs can re-enter itself.
+ * This can lead to deadlock if there is an intervening
+ * rw_enter as writer.
+ * So a file system threads ref count (z_op_cnt) is used.
+ * A polling loop on z_op_cnt may seem inefficient, but
+ * - this saves all threads on exit from having to grab a
+ * mutex in order to cv_signal
+ * - only occurs on forced unmount in the rare case when
+ * there are outstanding threads within the file system.
+ */
+ while (zfsvfs->z_op_cnt) {
+ delay(1);
+ }
+ }
+
+ zfs_objset_close(zfsvfs);
+ VFS_RELE(vfsp);
+ zfs_freevfs(vfsp);
+
+ return (0);
+}
+
+static int
+zfs_vget(vfs_t *vfsp, ino_t ino, int flags, vnode_t **vpp)
+{
+ zfsvfs_t *zfsvfs = vfsp->vfs_data;
+ znode_t *zp;
+ int err;
+
+ ZFS_ENTER(zfsvfs);
+ err = zfs_zget(zfsvfs, ino, &zp);
+ if (err == 0 && zp->z_unlinked) {
+ VN_RELE(ZTOV(zp));
+ err = EINVAL;
+ }
+ if (err != 0)
+ *vpp = NULL;
+ else {
+ *vpp = ZTOV(zp);
+ vn_lock(*vpp, flags, curthread);
+ }
+ ZFS_EXIT(zfsvfs);
+ return (err);
+}
+
+static int
+zfs_fhtovp(vfs_t *vfsp, fid_t *fidp, vnode_t **vpp)
+{
+ kthread_t *td = curthread;
+ zfsvfs_t *zfsvfs = vfsp->vfs_data;
+ znode_t *zp;
+ uint64_t object = 0;
+ uint64_t fid_gen = 0;
+ uint64_t gen_mask;
+ uint64_t zp_gen;
+ int i, err;
+
+ *vpp = NULL;
+
+ ZFS_ENTER(zfsvfs);
+
+ if (fidp->fid_len == LONG_FID_LEN) {
+ zfid_long_t *zlfid = (zfid_long_t *)fidp;
+ uint64_t objsetid = 0;
+ uint64_t setgen = 0;
+
+ for (i = 0; i < sizeof (zlfid->zf_setid); i++)
+ objsetid |= ((uint64_t)zlfid->zf_setid[i]) << (8 * i);
+
+ for (i = 0; i < sizeof (zlfid->zf_setgen); i++)
+ setgen |= ((uint64_t)zlfid->zf_setgen[i]) << (8 * i);
+
+ ZFS_EXIT(zfsvfs);
+
+ err = zfsctl_lookup_objset(vfsp, objsetid, &zfsvfs);
+ if (err)
+ return (EINVAL);
+ ZFS_ENTER(zfsvfs);
+ }
+
+ if (fidp->fid_len == SHORT_FID_LEN || fidp->fid_len == LONG_FID_LEN) {
+ zfid_short_t *zfid = (zfid_short_t *)fidp;
+
+ for (i = 0; i < sizeof (zfid->zf_object); i++)
+ object |= ((uint64_t)zfid->zf_object[i]) << (8 * i);
+
+ for (i = 0; i < sizeof (zfid->zf_gen); i++)
+ fid_gen |= ((uint64_t)zfid->zf_gen[i]) << (8 * i);
+ } else {
+ ZFS_EXIT(zfsvfs);
+ return (EINVAL);
+ }
+
+ /* A zero fid_gen means we are in the .zfs control directories */
+ if (fid_gen == 0 &&
+ (object == ZFSCTL_INO_ROOT || object == ZFSCTL_INO_SNAPDIR)) {
+ *vpp = zfsvfs->z_ctldir;
+ ASSERT(*vpp != NULL);
+ if (object == ZFSCTL_INO_SNAPDIR) {
+ VERIFY(zfsctl_root_lookup(*vpp, "snapshot", vpp, NULL,
+ 0, NULL, NULL) == 0);
+ } else {
+ VN_HOLD(*vpp);
+ }
+ ZFS_EXIT(zfsvfs);
+ /* XXX: LK_RETRY? */
+ vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, td);
+ return (0);
+ }
+
+ gen_mask = -1ULL >> (64 - 8 * i);
+
+ dprintf("getting %llu [%u mask %llx]\n", object, fid_gen, gen_mask);
+ if (err = zfs_zget(zfsvfs, object, &zp)) {
+ ZFS_EXIT(zfsvfs);
+ return (err);
+ }
+ zp_gen = zp->z_phys->zp_gen & gen_mask;
+ if (zp_gen == 0)
+ zp_gen = 1;
+ if (zp->z_unlinked || zp_gen != fid_gen) {
+ dprintf("znode gen (%u) != fid gen (%u)\n", zp_gen, fid_gen);
+ VN_RELE(ZTOV(zp));
+ ZFS_EXIT(zfsvfs);
+ return (EINVAL);
+ }
+
+ *vpp = ZTOV(zp);
+ /* XXX: LK_RETRY? */
+ vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, td);
+ vnode_create_vobject(*vpp, zp->z_phys->zp_size, td);
+ ZFS_EXIT(zfsvfs);
+ return (0);
+}
+
+static void
+zfs_objset_close(zfsvfs_t *zfsvfs)
+{
+ znode_t *zp, *nextzp;
+ objset_t *os = zfsvfs->z_os;
+
+ /*
+ * For forced unmount, at this point all vops except zfs_inactive
+ * are erroring EIO. We need to now suspend zfs_inactive threads
+ * while we are freeing dbufs before switching zfs_inactive
+ * to use behaviour without a objset.
+ */
+ rw_enter(&zfsvfs->z_um_lock, RW_WRITER);
+
+ /*
+ * Release all holds on dbufs
+ * Note, although we have stopped all other vop threads and
+ * zfs_inactive(), the dmu can callback via znode_pageout_func()
+ * which can zfs_znode_free() the znode.
+ * So we lock z_all_znodes; search the list for a held
+ * dbuf; drop the lock (we know zp can't disappear if we hold
+ * a dbuf lock; then regrab the lock and restart.
+ */
+ mutex_enter(&zfsvfs->z_znodes_lock);
+ for (zp = list_head(&zfsvfs->z_all_znodes); zp; zp = nextzp) {
+ nextzp = list_next(&zfsvfs->z_all_znodes, zp);
+ if (zp->z_dbuf_held) {
+ /* dbufs should only be held when force unmounting */
+ zp->z_dbuf_held = 0;
+ mutex_exit(&zfsvfs->z_znodes_lock);
+ dmu_buf_rele(zp->z_dbuf, NULL);
+ /* Start again */
+ mutex_enter(&zfsvfs->z_znodes_lock);
+ nextzp = list_head(&zfsvfs->z_all_znodes);
+ }
+ }
+ mutex_exit(&zfsvfs->z_znodes_lock);
+
+ /*
+ * Unregister properties.
+ */
+ if (!dmu_objset_is_snapshot(os))
+ zfs_unregister_callbacks(zfsvfs);
+
+ /*
+ * Switch zfs_inactive to behaviour without an objset.
+ * It just tosses cached pages and frees the znode & vnode.
+ * Then re-enable zfs_inactive threads in that new behaviour.
+ */
+ zfsvfs->z_unmounted2 = B_TRUE;
+ rw_exit(&zfsvfs->z_um_lock); /* re-enable any zfs_inactive threads */
+
+ /*
+ * Close the zil. Can't close the zil while zfs_inactive
+ * threads are blocked as zil_close can call zfs_inactive.
+ */
+ if (zfsvfs->z_log) {
+ zil_close(zfsvfs->z_log);
+ zfsvfs->z_log = NULL;
+ }
+
+ /*
+ * Evict all dbufs so that cached znodes will be freed
+ */
+ if (dmu_objset_evict_dbufs(os, 1)) {
+ txg_wait_synced(dmu_objset_pool(zfsvfs->z_os), 0);
+ (void) dmu_objset_evict_dbufs(os, 0);
+ }
+
+ /*
+ * Finally close the objset
+ */
+ dmu_objset_close(os);
+}
+
+static void
+zfs_freevfs(vfs_t *vfsp)
+{
+ zfsvfs_t *zfsvfs = vfsp->vfs_data;
+ int i;
+
+ for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
+ mutex_destroy(&zfsvfs->z_hold_mtx[i]);
+ rw_destroy(&zfsvfs->z_um_lock);
+ mutex_destroy(&zfsvfs->z_znodes_lock);
+ kmem_free(zfsvfs, sizeof (zfsvfs_t));
+
+ atomic_add_32(&zfs_active_fs_count, -1);
+}
+
+void
+zfs_init(void)
+{
+
+ printf("ZFS filesystem version " ZFS_VERSION_STRING "\n");
+
+ /*
+ * Initialize .zfs directory structures
+ */
+ zfsctl_init();
+
+ /*
+ * Initialize znode cache, vnode ops, etc...
+ */
+ zfs_znode_init();
+}
+
+void
+zfs_fini(void)
+{
+ zfsctl_fini();
+ zfs_znode_fini();
+}
+
+int
+zfs_busy(void)
+{
+ return (zfs_active_fs_count != 0);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
new file mode 100644
index 0000000..20643f5
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_vnops.c
@@ -0,0 +1,3599 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Portions Copyright 2007 Jeremy Teo */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/systm.h>
+#include <sys/sysmacros.h>
+#include <sys/resource.h>
+#include <sys/vfs.h>
+#include <sys/vnode.h>
+#include <sys/file.h>
+#include <sys/stat.h>
+#include <sys/kmem.h>
+#include <sys/taskq.h>
+#include <sys/uio.h>
+#include <sys/atomic.h>
+#include <sys/namei.h>
+#include <sys/mman.h>
+#include <sys/cmn_err.h>
+#include <sys/errno.h>
+#include <sys/unistd.h>
+#include <sys/zfs_vfsops.h>
+#include <sys/zfs_dir.h>
+#include <sys/zfs_acl.h>
+#include <sys/zfs_ioctl.h>
+#include <sys/fs/zfs.h>
+#include <sys/dmu.h>
+#include <sys/spa.h>
+#include <sys/txg.h>
+#include <sys/dbuf.h>
+#include <sys/zap.h>
+#include <sys/dirent.h>
+#include <sys/policy.h>
+#include <sys/sunddi.h>
+#include <sys/filio.h>
+#include <sys/zfs_ctldir.h>
+#include <sys/dnlc.h>
+#include <sys/zfs_rlock.h>
+#include <sys/bio.h>
+#include <sys/buf.h>
+#include <sys/sf_buf.h>
+#include <sys/sched.h>
+
+/*
+ * Programming rules.
+ *
+ * Each vnode op performs some logical unit of work. To do this, the ZPL must
+ * properly lock its in-core state, create a DMU transaction, do the work,
+ * record this work in the intent log (ZIL), commit the DMU transaction,
+ * and wait the the intent log to commit if it's is a synchronous operation.
+ * Morover, the vnode ops must work in both normal and log replay context.
+ * The ordering of events is important to avoid deadlocks and references
+ * to freed memory. The example below illustrates the following Big Rules:
+ *
+ * (1) A check must be made in each zfs thread for a mounted file system.
+ * This is done avoiding races using ZFS_ENTER(zfsvfs).
+ * A ZFS_EXIT(zfsvfs) is needed before all returns.
+ *
+ * (2) VN_RELE() should always be the last thing except for zil_commit()
+ * (if necessary) and ZFS_EXIT(). This is for 3 reasons:
+ * First, if it's the last reference, the vnode/znode
+ * can be freed, so the zp may point to freed memory. Second, the last
+ * reference will call zfs_zinactive(), which may induce a lot of work --
+ * pushing cached pages (which acquires range locks) and syncing out
+ * cached atime changes. Third, zfs_zinactive() may require a new tx,
+ * which could deadlock the system if you were already holding one.
+ *
+ * (3) All range locks must be grabbed before calling dmu_tx_assign(),
+ * as they can span dmu_tx_assign() calls.
+ *
+ * (4) Always pass zfsvfs->z_assign as the second argument to dmu_tx_assign().
+ * In normal operation, this will be TXG_NOWAIT. During ZIL replay,
+ * it will be a specific txg. Either way, dmu_tx_assign() never blocks.
+ * This is critical because we don't want to block while holding locks.
+ * Note, in particular, that if a lock is sometimes acquired before
+ * the tx assigns, and sometimes after (e.g. z_lock), then failing to
+ * use a non-blocking assign can deadlock the system. The scenario:
+ *
+ * Thread A has grabbed a lock before calling dmu_tx_assign().
+ * Thread B is in an already-assigned tx, and blocks for this lock.
+ * Thread A calls dmu_tx_assign(TXG_WAIT) and blocks in txg_wait_open()
+ * forever, because the previous txg can't quiesce until B's tx commits.
+ *
+ * If dmu_tx_assign() returns ERESTART and zfsvfs->z_assign is TXG_NOWAIT,
+ * then drop all locks, call dmu_tx_wait(), and try again.
+ *
+ * (5) If the operation succeeded, generate the intent log entry for it
+ * before dropping locks. This ensures that the ordering of events
+ * in the intent log matches the order in which they actually occurred.
+ *
+ * (6) At the end of each vnode op, the DMU tx must always commit,
+ * regardless of whether there were any errors.
+ *
+ * (7) After dropping all locks, invoke zil_commit(zilog, seq, foid)
+ * to ensure that synchronous semantics are provided when necessary.
+ *
+ * In general, this is how things should be ordered in each vnode op:
+ *
+ * ZFS_ENTER(zfsvfs); // exit if unmounted
+ * top:
+ * zfs_dirent_lock(&dl, ...) // lock directory entry (may VN_HOLD())
+ * rw_enter(...); // grab any other locks you need
+ * tx = dmu_tx_create(...); // get DMU tx
+ * dmu_tx_hold_*(); // hold each object you might modify
+ * error = dmu_tx_assign(tx, zfsvfs->z_assign); // try to assign
+ * if (error) {
+ * rw_exit(...); // drop locks
+ * zfs_dirent_unlock(dl); // unlock directory entry
+ * VN_RELE(...); // release held vnodes
+ * if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT) {
+ * dmu_tx_wait(tx);
+ * dmu_tx_abort(tx);
+ * goto top;
+ * }
+ * dmu_tx_abort(tx); // abort DMU tx
+ * ZFS_EXIT(zfsvfs); // finished in zfs
+ * return (error); // really out of space
+ * }
+ * error = do_real_work(); // do whatever this VOP does
+ * if (error == 0)
+ * zfs_log_*(...); // on success, make ZIL entry
+ * dmu_tx_commit(tx); // commit DMU tx -- error or not
+ * rw_exit(...); // drop locks
+ * zfs_dirent_unlock(dl); // unlock directory entry
+ * VN_RELE(...); // release held vnodes
+ * zil_commit(zilog, seq, foid); // synchronous when necessary
+ * ZFS_EXIT(zfsvfs); // finished in zfs
+ * return (error); // done, report error
+ */
+/* ARGSUSED */
+static int
+zfs_open(vnode_t **vpp, int flag, cred_t *cr)
+{
+ znode_t *zp = VTOZ(*vpp);
+
+ /* Keep a count of the synchronous opens in the znode */
+ if (flag & (FSYNC | FDSYNC))
+ atomic_inc_32(&zp->z_sync_cnt);
+ return (0);
+}
+
+/* ARGSUSED */
+static int
+zfs_close(vnode_t *vp, int flag, int count, offset_t offset, cred_t *cr)
+{
+ znode_t *zp = VTOZ(vp);
+
+ /* Decrement the synchronous opens in the znode */
+ if (flag & (FSYNC | FDSYNC))
+ atomic_dec_32(&zp->z_sync_cnt);
+
+ /*
+ * Clean up any locks held by this process on the vp.
+ */
+ cleanlocks(vp, ddi_get_pid(), 0);
+ cleanshares(vp, ddi_get_pid());
+
+ return (0);
+}
+
+/*
+ * Lseek support for finding holes (cmd == _FIO_SEEK_HOLE) and
+ * data (cmd == _FIO_SEEK_DATA). "off" is an in/out parameter.
+ */
+static int
+zfs_holey(vnode_t *vp, u_long cmd, offset_t *off)
+{
+ znode_t *zp = VTOZ(vp);
+ uint64_t noff = (uint64_t)*off; /* new offset */
+ uint64_t file_sz;
+ int error;
+ boolean_t hole;
+
+ file_sz = zp->z_phys->zp_size;
+ if (noff >= file_sz) {
+ return (ENXIO);
+ }
+
+ if (cmd == _FIO_SEEK_HOLE)
+ hole = B_TRUE;
+ else
+ hole = B_FALSE;
+
+ error = dmu_offset_next(zp->z_zfsvfs->z_os, zp->z_id, hole, &noff);
+
+ /* end of file? */
+ if ((error == ESRCH) || (noff > file_sz)) {
+ /*
+ * Handle the virtual hole at the end of file.
+ */
+ if (hole) {
+ *off = file_sz;
+ return (0);
+ }
+ return (ENXIO);
+ }
+
+ if (noff < *off)
+ return (error);
+ *off = noff;
+ return (error);
+}
+
+/* ARGSUSED */
+static int
+zfs_ioctl(vnode_t *vp, u_long com, intptr_t data, int flag, cred_t *cred,
+ int *rvalp)
+{
+ offset_t off;
+ int error;
+ zfsvfs_t *zfsvfs;
+
+ switch (com) {
+ case _FIOFFS:
+ return (0);
+
+ /*
+ * The following two ioctls are used by bfu. Faking out,
+ * necessary to avoid bfu errors.
+ */
+ case _FIOGDIO:
+ case _FIOSDIO:
+ return (0);
+
+ case _FIO_SEEK_DATA:
+ case _FIO_SEEK_HOLE:
+ if (ddi_copyin((void *)data, &off, sizeof (off), flag))
+ return (EFAULT);
+
+ zfsvfs = VTOZ(vp)->z_zfsvfs;
+ ZFS_ENTER(zfsvfs);
+
+ /* offset parameter is in/out */
+ error = zfs_holey(vp, com, &off);
+ ZFS_EXIT(zfsvfs);
+ if (error)
+ return (error);
+ if (ddi_copyout(&off, (void *)data, sizeof (off), flag))
+ return (EFAULT);
+ return (0);
+ }
+ return (ENOTTY);
+}
+
+/*
+ * When a file is memory mapped, we must keep the IO data synchronized
+ * between the DMU cache and the memory mapped pages. What this means:
+ *
+ * On Write: If we find a memory mapped page, we write to *both*
+ * the page and the dmu buffer.
+ *
+ * NOTE: We will always "break up" the IO into PAGESIZE uiomoves when
+ * the file is memory mapped.
+ */
+static int
+mappedwrite(vnode_t *vp, int nbytes, uio_t *uio, dmu_tx_t *tx)
+{
+ znode_t *zp = VTOZ(vp);
+ objset_t *os = zp->z_zfsvfs->z_os;
+ vm_object_t obj;
+ vm_page_t m;
+ struct sf_buf *sf;
+ int64_t start, off;
+ int len = nbytes;
+ int error = 0;
+ uint64_t dirbytes;
+
+ ASSERT(vp->v_mount != NULL);
+ obj = vp->v_object;
+ ASSERT(obj != NULL);
+
+ start = uio->uio_loffset;
+ off = start & PAGEOFFSET;
+ dirbytes = 0;
+ VM_OBJECT_LOCK(obj);
+ for (start &= PAGEMASK; len > 0; start += PAGESIZE) {
+ uint64_t bytes = MIN(PAGESIZE - off, len);
+ uint64_t fsize;
+
+again:
+ if ((m = vm_page_lookup(obj, OFF_TO_IDX(start))) != NULL &&
+ vm_page_is_valid(m, (vm_offset_t)off, bytes)) {
+ uint64_t woff;
+ caddr_t va;
+
+ if (vm_page_sleep_if_busy(m, FALSE, "zfsmwb"))
+ goto again;
+ fsize = obj->un_pager.vnp.vnp_size;
+ vm_page_busy(m);
+ vm_page_lock_queues();
+ vm_page_undirty(m);
+ vm_page_unlock_queues();
+ VM_OBJECT_UNLOCK(obj);
+ if (dirbytes > 0) {
+ error = dmu_write_uio(os, zp->z_id, uio,
+ dirbytes, tx);
+ dirbytes = 0;
+ }
+ if (error == 0) {
+ sched_pin();
+ sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
+ va = (caddr_t)sf_buf_kva(sf);
+ woff = uio->uio_loffset - off;
+ error = uiomove(va + off, bytes, UIO_WRITE, uio);
+ /*
+ * The uiomove() above could have been partially
+ * successful, that's why we call dmu_write()
+ * below unconditionally. The page was marked
+ * non-dirty above and we would lose the changes
+ * without doing so. If the uiomove() failed
+ * entirely, well, we just write what we got
+ * before one more time.
+ */
+ dmu_write(os, zp->z_id, woff,
+ MIN(PAGESIZE, fsize - woff), va, tx);
+ sf_buf_free(sf);
+ sched_unpin();
+ }
+ VM_OBJECT_LOCK(obj);
+ vm_page_wakeup(m);
+ } else {
+ dirbytes += bytes;
+ }
+ len -= bytes;
+ off = 0;
+ if (error)
+ break;
+ }
+ VM_OBJECT_UNLOCK(obj);
+ if (error == 0 && dirbytes > 0)
+ error = dmu_write_uio(os, zp->z_id, uio, dirbytes, tx);
+ return (error);
+}
+
+/*
+ * When a file is memory mapped, we must keep the IO data synchronized
+ * between the DMU cache and the memory mapped pages. What this means:
+ *
+ * On Read: We "read" preferentially from memory mapped pages,
+ * else we default from the dmu buffer.
+ *
+ * NOTE: We will always "break up" the IO into PAGESIZE uiomoves when
+ * the file is memory mapped.
+ */
+static int
+mappedread(vnode_t *vp, int nbytes, uio_t *uio)
+{
+ znode_t *zp = VTOZ(vp);
+ objset_t *os = zp->z_zfsvfs->z_os;
+ vm_object_t obj;
+ vm_page_t m;
+ struct sf_buf *sf;
+ int64_t start, off;
+ caddr_t va;
+ int len = nbytes;
+ int error = 0;
+ uint64_t dirbytes;
+
+ ASSERT(vp->v_mount != NULL);
+ obj = vp->v_object;
+ ASSERT(obj != NULL);
+
+ start = uio->uio_loffset;
+ off = start & PAGEOFFSET;
+ dirbytes = 0;
+ VM_OBJECT_LOCK(obj);
+ for (start &= PAGEMASK; len > 0; start += PAGESIZE) {
+ uint64_t bytes = MIN(PAGESIZE - off, len);
+
+again:
+ if ((m = vm_page_lookup(obj, OFF_TO_IDX(start))) != NULL &&
+ vm_page_is_valid(m, (vm_offset_t)off, bytes)) {
+ if (vm_page_sleep_if_busy(m, FALSE, "zfsmrb"))
+ goto again;
+ vm_page_busy(m);
+ VM_OBJECT_UNLOCK(obj);
+ if (dirbytes > 0) {
+ error = dmu_read_uio(os, zp->z_id, uio,
+ dirbytes);
+ dirbytes = 0;
+ }
+ if (error == 0) {
+ sched_pin();
+ sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
+ va = (caddr_t)sf_buf_kva(sf);
+ error = uiomove(va + off, bytes, UIO_READ, uio);
+ sf_buf_free(sf);
+ sched_unpin();
+ }
+ VM_OBJECT_LOCK(obj);
+ vm_page_wakeup(m);
+ } else if (m != NULL && uio->uio_segflg == UIO_NOCOPY) {
+ /*
+ * The code below is here to make sendfile(2) work
+ * correctly with ZFS. As pointed out by ups@
+ * sendfile(2) should be changed to use VOP_GETPAGES(),
+ * but it pessimize performance of sendfile/UFS, that's
+ * why I handle this special case in ZFS code.
+ */
+ if (vm_page_sleep_if_busy(m, FALSE, "zfsmrb"))
+ goto again;
+ vm_page_busy(m);
+ VM_OBJECT_UNLOCK(obj);
+ if (dirbytes > 0) {
+ error = dmu_read_uio(os, zp->z_id, uio,
+ dirbytes);
+ dirbytes = 0;
+ }
+ if (error == 0) {
+ sched_pin();
+ sf = sf_buf_alloc(m, SFB_CPUPRIVATE);
+ va = (caddr_t)sf_buf_kva(sf);
+ error = dmu_read(os, zp->z_id, start + off,
+ bytes, (void *)(va + off));
+ sf_buf_free(sf);
+ sched_unpin();
+ }
+ VM_OBJECT_LOCK(obj);
+ vm_page_wakeup(m);
+ if (error == 0)
+ uio->uio_resid -= bytes;
+ } else {
+ dirbytes += bytes;
+ }
+ len -= bytes;
+ off = 0;
+ if (error)
+ break;
+ }
+ VM_OBJECT_UNLOCK(obj);
+ if (error == 0 && dirbytes > 0)
+ error = dmu_read_uio(os, zp->z_id, uio, dirbytes);
+ return (error);
+}
+
+offset_t zfs_read_chunk_size = 1024 * 1024; /* Tunable */
+
+/*
+ * Read bytes from specified file into supplied buffer.
+ *
+ * IN: vp - vnode of file to be read from.
+ * uio - structure supplying read location, range info,
+ * and return buffer.
+ * ioflag - SYNC flags; used to provide FRSYNC semantics.
+ * cr - credentials of caller.
+ *
+ * OUT: uio - updated offset and range, buffer filled.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Side Effects:
+ * vp - atime updated if byte count > 0
+ */
+/* ARGSUSED */
+static int
+zfs_read(vnode_t *vp, uio_t *uio, int ioflag, cred_t *cr, caller_context_t *ct)
+{
+ znode_t *zp = VTOZ(vp);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ objset_t *os = zfsvfs->z_os;
+ ssize_t n, nbytes;
+ int error;
+ rl_t *rl;
+
+ ZFS_ENTER(zfsvfs);
+
+ /*
+ * Validate file offset
+ */
+ if (uio->uio_loffset < (offset_t)0) {
+ ZFS_EXIT(zfsvfs);
+ return (EINVAL);
+ }
+
+ /*
+ * Fasttrack empty reads
+ */
+ if (uio->uio_resid == 0) {
+ ZFS_EXIT(zfsvfs);
+ return (0);
+ }
+
+ /*
+ * Check for mandatory locks
+ */
+ if (MANDMODE((mode_t)zp->z_phys->zp_mode)) {
+ if (error = chklock(vp, FREAD,
+ uio->uio_loffset, uio->uio_resid, uio->uio_fmode, ct)) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+ }
+
+ /*
+ * If we're in FRSYNC mode, sync out this znode before reading it.
+ */
+ if (ioflag & FRSYNC)
+ zil_commit(zfsvfs->z_log, zp->z_last_itx, zp->z_id);
+
+ /*
+ * Lock the range against changes.
+ */
+ rl = zfs_range_lock(zp, uio->uio_loffset, uio->uio_resid, RL_READER);
+
+ /*
+ * If we are reading past end-of-file we can skip
+ * to the end; but we might still need to set atime.
+ */
+ if (uio->uio_loffset >= zp->z_phys->zp_size) {
+ error = 0;
+ goto out;
+ }
+
+ ASSERT(uio->uio_loffset < zp->z_phys->zp_size);
+ n = MIN(uio->uio_resid, zp->z_phys->zp_size - uio->uio_loffset);
+
+ while (n > 0) {
+ nbytes = MIN(n, zfs_read_chunk_size -
+ P2PHASE(uio->uio_loffset, zfs_read_chunk_size));
+
+ if (vn_has_cached_data(vp))
+ error = mappedread(vp, nbytes, uio);
+ else
+ error = dmu_read_uio(os, zp->z_id, uio, nbytes);
+ if (error)
+ break;
+
+ n -= nbytes;
+ }
+
+out:
+ zfs_range_unlock(rl);
+
+ ZFS_ACCESSTIME_STAMP(zfsvfs, zp);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+}
+
+/*
+ * Fault in the pages of the first n bytes specified by the uio structure.
+ * 1 byte in each page is touched and the uio struct is unmodified.
+ * Any error will exit this routine as this is only a best
+ * attempt to get the pages resident. This is a copy of ufs_trans_touch().
+ */
+static void
+zfs_prefault_write(ssize_t n, struct uio *uio)
+{
+ struct iovec *iov;
+ ulong_t cnt, incr;
+ caddr_t p;
+
+ if (uio->uio_segflg != UIO_USERSPACE)
+ return;
+
+ iov = uio->uio_iov;
+
+ while (n) {
+ cnt = MIN(iov->iov_len, n);
+ if (cnt == 0) {
+ /* empty iov entry */
+ iov++;
+ continue;
+ }
+ n -= cnt;
+ /*
+ * touch each page in this segment.
+ */
+ p = iov->iov_base;
+ while (cnt) {
+ if (fubyte(p) == -1)
+ return;
+ incr = MIN(cnt, PAGESIZE);
+ p += incr;
+ cnt -= incr;
+ }
+ /*
+ * touch the last byte in case it straddles a page.
+ */
+ p--;
+ if (fubyte(p) == -1)
+ return;
+ iov++;
+ }
+}
+
+/*
+ * Write the bytes to a file.
+ *
+ * IN: vp - vnode of file to be written to.
+ * uio - structure supplying write location, range info,
+ * and data buffer.
+ * ioflag - IO_APPEND flag set if in append mode.
+ * cr - credentials of caller.
+ *
+ * OUT: uio - updated offset and range.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * vp - ctime|mtime updated if byte count > 0
+ */
+/* ARGSUSED */
+static int
+zfs_write(vnode_t *vp, uio_t *uio, int ioflag, cred_t *cr, caller_context_t *ct)
+{
+ znode_t *zp = VTOZ(vp);
+ rlim64_t limit = MAXOFFSET_T;
+ ssize_t start_resid = uio->uio_resid;
+ ssize_t tx_bytes;
+ uint64_t end_size;
+ dmu_tx_t *tx;
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ offset_t woff;
+ ssize_t n, nbytes;
+ rl_t *rl;
+ int max_blksz = zfsvfs->z_max_blksz;
+ int error;
+
+ /*
+ * Fasttrack empty write
+ */
+ n = start_resid;
+ if (n == 0)
+ return (0);
+
+ if (limit == RLIM64_INFINITY || limit > MAXOFFSET_T)
+ limit = MAXOFFSET_T;
+
+ ZFS_ENTER(zfsvfs);
+
+ /*
+ * Pre-fault the pages to ensure slow (eg NFS) pages
+ * don't hold up txg.
+ */
+ zfs_prefault_write(n, uio);
+
+ /*
+ * If in append mode, set the io offset pointer to eof.
+ */
+ if (ioflag & IO_APPEND) {
+ /*
+ * Range lock for a file append:
+ * The value for the start of range will be determined by
+ * zfs_range_lock() (to guarantee append semantics).
+ * If this write will cause the block size to increase,
+ * zfs_range_lock() will lock the entire file, so we must
+ * later reduce the range after we grow the block size.
+ */
+ rl = zfs_range_lock(zp, 0, n, RL_APPEND);
+ if (rl->r_len == UINT64_MAX) {
+ /* overlocked, zp_size can't change */
+ woff = uio->uio_loffset = zp->z_phys->zp_size;
+ } else {
+ woff = uio->uio_loffset = rl->r_off;
+ }
+ } else {
+ woff = uio->uio_loffset;
+ /*
+ * Validate file offset
+ */
+ if (woff < 0) {
+ ZFS_EXIT(zfsvfs);
+ return (EINVAL);
+ }
+
+ /*
+ * If we need to grow the block size then zfs_range_lock()
+ * will lock a wider range than we request here.
+ * Later after growing the block size we reduce the range.
+ */
+ rl = zfs_range_lock(zp, woff, n, RL_WRITER);
+ }
+
+ if (woff >= limit) {
+ zfs_range_unlock(rl);
+ ZFS_EXIT(zfsvfs);
+ return (EFBIG);
+ }
+
+ if ((woff + n) > limit || woff > (limit - n))
+ n = limit - woff;
+
+ /*
+ * Check for mandatory locks
+ */
+ if (MANDMODE((mode_t)zp->z_phys->zp_mode) &&
+ (error = chklock(vp, FWRITE, woff, n, uio->uio_fmode, ct)) != 0) {
+ zfs_range_unlock(rl);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+ end_size = MAX(zp->z_phys->zp_size, woff + n);
+
+ /*
+ * Write the file in reasonable size chunks. Each chunk is written
+ * in a separate transaction; this keeps the intent log records small
+ * and allows us to do more fine-grained space accounting.
+ */
+ while (n > 0) {
+ /*
+ * Start a transaction.
+ */
+ woff = uio->uio_loffset;
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_bonus(tx, zp->z_id);
+ dmu_tx_hold_write(tx, zp->z_id, woff, MIN(n, max_blksz));
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ if (error == ERESTART &&
+ zfsvfs->z_assign == TXG_NOWAIT) {
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ continue;
+ }
+ dmu_tx_abort(tx);
+ break;
+ }
+
+ /*
+ * If zfs_range_lock() over-locked we grow the blocksize
+ * and then reduce the lock range. This will only happen
+ * on the first iteration since zfs_range_reduce() will
+ * shrink down r_len to the appropriate size.
+ */
+ if (rl->r_len == UINT64_MAX) {
+ uint64_t new_blksz;
+
+ if (zp->z_blksz > max_blksz) {
+ ASSERT(!ISP2(zp->z_blksz));
+ new_blksz = MIN(end_size, SPA_MAXBLOCKSIZE);
+ } else {
+ new_blksz = MIN(end_size, max_blksz);
+ }
+ zfs_grow_blocksize(zp, new_blksz, tx);
+ zfs_range_reduce(rl, woff, n);
+ }
+
+ /*
+ * XXX - should we really limit each write to z_max_blksz?
+ * Perhaps we should use SPA_MAXBLOCKSIZE chunks?
+ */
+ nbytes = MIN(n, max_blksz - P2PHASE(woff, max_blksz));
+
+ if (woff + nbytes > zp->z_phys->zp_size)
+ vnode_pager_setsize(vp, woff + nbytes);
+
+ rw_enter(&zp->z_map_lock, RW_READER);
+
+ tx_bytes = uio->uio_resid;
+ if (vn_has_cached_data(vp)) {
+ rw_exit(&zp->z_map_lock);
+ error = mappedwrite(vp, nbytes, uio, tx);
+ } else {
+ error = dmu_write_uio(zfsvfs->z_os, zp->z_id,
+ uio, nbytes, tx);
+ rw_exit(&zp->z_map_lock);
+ }
+ tx_bytes -= uio->uio_resid;
+
+ /*
+ * If we made no progress, we're done. If we made even
+ * partial progress, update the znode and ZIL accordingly.
+ */
+ if (tx_bytes == 0) {
+ dmu_tx_commit(tx);
+ ASSERT(error != 0);
+ break;
+ }
+
+ /*
+ * Clear Set-UID/Set-GID bits on successful write if not
+ * privileged and at least one of the excute bits is set.
+ *
+ * It would be nice to to this after all writes have
+ * been done, but that would still expose the ISUID/ISGID
+ * to another app after the partial write is committed.
+ */
+ mutex_enter(&zp->z_acl_lock);
+ if ((zp->z_phys->zp_mode & (S_IXUSR | (S_IXUSR >> 3) |
+ (S_IXUSR >> 6))) != 0 &&
+ (zp->z_phys->zp_mode & (S_ISUID | S_ISGID)) != 0 &&
+ secpolicy_vnode_setid_retain(cr,
+ (zp->z_phys->zp_mode & S_ISUID) != 0 &&
+ zp->z_phys->zp_uid == 0) != 0) {
+ zp->z_phys->zp_mode &= ~(S_ISUID | S_ISGID);
+ }
+ mutex_exit(&zp->z_acl_lock);
+
+ /*
+ * Update time stamp. NOTE: This marks the bonus buffer as
+ * dirty, so we don't have to do it again for zp_size.
+ */
+ zfs_time_stamper(zp, CONTENT_MODIFIED, tx);
+
+ /*
+ * Update the file size (zp_size) if it has changed;
+ * account for possible concurrent updates.
+ */
+ while ((end_size = zp->z_phys->zp_size) < uio->uio_loffset)
+ (void) atomic_cas_64(&zp->z_phys->zp_size, end_size,
+ uio->uio_loffset);
+ zfs_log_write(zilog, tx, TX_WRITE, zp, woff, tx_bytes, ioflag);
+ dmu_tx_commit(tx);
+
+ if (error != 0)
+ break;
+ ASSERT(tx_bytes == nbytes);
+ n -= nbytes;
+ }
+
+ zfs_range_unlock(rl);
+
+ /*
+ * If we're in replay mode, or we made no progress, return error.
+ * Otherwise, it's at least a partial write, so it's successful.
+ */
+ if (zfsvfs->z_assign >= TXG_INITIAL || uio->uio_resid == start_resid) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ if (ioflag & (FSYNC | FDSYNC))
+ zil_commit(zilog, zp->z_last_itx, zp->z_id);
+
+ ZFS_EXIT(zfsvfs);
+ return (0);
+}
+
+void
+zfs_get_done(dmu_buf_t *db, void *vzgd)
+{
+ zgd_t *zgd = (zgd_t *)vzgd;
+ rl_t *rl = zgd->zgd_rl;
+ vnode_t *vp = ZTOV(rl->r_zp);
+ int vfslocked;
+
+ vfslocked = VFS_LOCK_GIANT(vp->v_vfsp);
+ dmu_buf_rele(db, vzgd);
+ zfs_range_unlock(rl);
+ VN_RELE(vp);
+ zil_add_vdev(zgd->zgd_zilog, DVA_GET_VDEV(BP_IDENTITY(zgd->zgd_bp)));
+ kmem_free(zgd, sizeof (zgd_t));
+ VFS_UNLOCK_GIANT(vfslocked);
+}
+
+/*
+ * Get data to generate a TX_WRITE intent log record.
+ */
+int
+zfs_get_data(void *arg, lr_write_t *lr, char *buf, zio_t *zio)
+{
+ zfsvfs_t *zfsvfs = arg;
+ objset_t *os = zfsvfs->z_os;
+ znode_t *zp;
+ uint64_t off = lr->lr_offset;
+ dmu_buf_t *db;
+ rl_t *rl;
+ zgd_t *zgd;
+ int dlen = lr->lr_length; /* length of user data */
+ int error = 0;
+
+ ASSERT(zio);
+ ASSERT(dlen != 0);
+
+ /*
+ * Nothing to do if the file has been removed
+ */
+ if (zfs_zget(zfsvfs, lr->lr_foid, &zp) != 0)
+ return (ENOENT);
+ if (zp->z_unlinked) {
+ VN_RELE(ZTOV(zp));
+ return (ENOENT);
+ }
+
+ /*
+ * Write records come in two flavors: immediate and indirect.
+ * For small writes it's cheaper to store the data with the
+ * log record (immediate); for large writes it's cheaper to
+ * sync the data and get a pointer to it (indirect) so that
+ * we don't have to write the data twice.
+ */
+ if (buf != NULL) { /* immediate write */
+ rl = zfs_range_lock(zp, off, dlen, RL_READER);
+ /* test for truncation needs to be done while range locked */
+ if (off >= zp->z_phys->zp_size) {
+ error = ENOENT;
+ goto out;
+ }
+ VERIFY(0 == dmu_read(os, lr->lr_foid, off, dlen, buf));
+ } else { /* indirect write */
+ uint64_t boff; /* block starting offset */
+
+ /*
+ * Have to lock the whole block to ensure when it's
+ * written out and it's checksum is being calculated
+ * that no one can change the data. We need to re-check
+ * blocksize after we get the lock in case it's changed!
+ */
+ for (;;) {
+ if (ISP2(zp->z_blksz)) {
+ boff = P2ALIGN_TYPED(off, zp->z_blksz,
+ uint64_t);
+ } else {
+ boff = 0;
+ }
+ dlen = zp->z_blksz;
+ rl = zfs_range_lock(zp, boff, dlen, RL_READER);
+ if (zp->z_blksz == dlen)
+ break;
+ zfs_range_unlock(rl);
+ }
+ /* test for truncation needs to be done while range locked */
+ if (off >= zp->z_phys->zp_size) {
+ error = ENOENT;
+ goto out;
+ }
+ zgd = (zgd_t *)kmem_alloc(sizeof (zgd_t), KM_SLEEP);
+ zgd->zgd_rl = rl;
+ zgd->zgd_zilog = zfsvfs->z_log;
+ zgd->zgd_bp = &lr->lr_blkptr;
+ VERIFY(0 == dmu_buf_hold(os, lr->lr_foid, boff, zgd, &db));
+ ASSERT(boff == db->db_offset);
+ lr->lr_blkoff = off - boff;
+ error = dmu_sync(zio, db, &lr->lr_blkptr,
+ lr->lr_common.lrc_txg, zfs_get_done, zgd);
+ ASSERT(error == EEXIST || lr->lr_length <= zp->z_blksz);
+ if (error == 0) {
+ zil_add_vdev(zfsvfs->z_log,
+ DVA_GET_VDEV(BP_IDENTITY(&lr->lr_blkptr)));
+ }
+ /*
+ * If we get EINPROGRESS, then we need to wait for a
+ * write IO initiated by dmu_sync() to complete before
+ * we can release this dbuf. We will finish everything
+ * up in the zfs_get_done() callback.
+ */
+ if (error == EINPROGRESS)
+ return (0);
+ dmu_buf_rele(db, zgd);
+ kmem_free(zgd, sizeof (zgd_t));
+ }
+out:
+ zfs_range_unlock(rl);
+ VN_RELE(ZTOV(zp));
+ return (error);
+}
+
+/*ARGSUSED*/
+static int
+zfs_access(vnode_t *vp, int mode, int flags, cred_t *cr)
+{
+ znode_t *zp = VTOZ(vp);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ int error;
+
+ ZFS_ENTER(zfsvfs);
+ error = zfs_zaccess_rwx(zp, mode, cr);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+}
+
+/*
+ * Lookup an entry in a directory, or an extended attribute directory.
+ * If it exists, return a held vnode reference for it.
+ *
+ * IN: dvp - vnode of directory to search.
+ * nm - name of entry to lookup.
+ * pnp - full pathname to lookup [UNUSED].
+ * flags - LOOKUP_XATTR set if looking for an attribute.
+ * rdir - root directory vnode [UNUSED].
+ * cr - credentials of caller.
+ *
+ * OUT: vpp - vnode of located entry, NULL if not found.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * NA
+ */
+/* ARGSUSED */
+static int
+zfs_lookup(vnode_t *dvp, char *nm, vnode_t **vpp, struct componentname *cnp,
+ int nameiop, cred_t *cr, kthread_t *td)
+{
+
+ znode_t *zdp = VTOZ(dvp);
+ zfsvfs_t *zfsvfs = zdp->z_zfsvfs;
+ int error;
+
+ ZFS_ENTER(zfsvfs);
+
+ *vpp = NULL;
+
+#ifdef TODO
+ if (flags & LOOKUP_XATTR) {
+ /*
+ * If the xattr property is off, refuse the lookup request.
+ */
+ if (!(zfsvfs->z_vfs->vfs_flag & VFS_XATTR)) {
+ ZFS_EXIT(zfsvfs);
+ return (EINVAL);
+ }
+
+ /*
+ * We don't allow recursive attributes..
+ * Maybe someday we will.
+ */
+ if (zdp->z_phys->zp_flags & ZFS_XATTR) {
+ ZFS_EXIT(zfsvfs);
+ return (EINVAL);
+ }
+
+ if (error = zfs_get_xattrdir(VTOZ(dvp), vpp, cr, flags)) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ /*
+ * Do we have permission to get into attribute directory?
+ */
+
+ if (error = zfs_zaccess(VTOZ(*vpp), ACE_EXECUTE, cr)) {
+ VN_RELE(*vpp);
+ }
+
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+#endif /* TODO */
+
+ if (dvp->v_type != VDIR) {
+ ZFS_EXIT(zfsvfs);
+ return (ENOTDIR);
+ }
+
+ /*
+ * Check accessibility of directory.
+ */
+
+ if (error = zfs_zaccess(zdp, ACE_EXECUTE, cr)) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ if ((error = zfs_dirlook(zdp, nm, vpp)) == 0) {
+
+ /*
+ * Convert device special files
+ */
+ if (IS_DEVVP(*vpp)) {
+ vnode_t *svp;
+
+ svp = specvp(*vpp, (*vpp)->v_rdev, (*vpp)->v_type, cr);
+ VN_RELE(*vpp);
+ if (svp == NULL)
+ error = ENOSYS;
+ else
+ *vpp = svp;
+ }
+ }
+
+ ZFS_EXIT(zfsvfs);
+
+ /* Translate errors and add SAVENAME when needed. */
+ if (cnp->cn_flags & ISLASTCN) {
+ switch (nameiop) {
+ case CREATE:
+ case RENAME:
+ if (error == ENOENT) {
+ error = EJUSTRETURN;
+ cnp->cn_flags |= SAVENAME;
+ break;
+ }
+ /* FALLTHROUGH */
+ case DELETE:
+ if (error == 0)
+ cnp->cn_flags |= SAVENAME;
+ break;
+ }
+ }
+ if (error == 0 && (nm[0] != '.' || nm[1] != '\0')) {
+ int ltype = 0;
+
+ if (cnp->cn_flags & ISDOTDOT) {
+ ltype = VOP_ISLOCKED(dvp, td);
+ VOP_UNLOCK(dvp, 0, td);
+ }
+ error = vn_lock(*vpp, cnp->cn_lkflags, td);
+ if (cnp->cn_flags & ISDOTDOT)
+ vn_lock(dvp, ltype | LK_RETRY, td);
+ if (error != 0) {
+ VN_RELE(*vpp);
+ *vpp = NULL;
+ return (error);
+ }
+ }
+
+#ifdef FREEBSD_NAMECACHE
+ /*
+ * Insert name into cache (as non-existent) if appropriate.
+ */
+ if (error == ENOENT && (cnp->cn_flags & MAKEENTRY) && nameiop != CREATE)
+ cache_enter(dvp, *vpp, cnp);
+ /*
+ * Insert name into cache if appropriate.
+ */
+ if (error == 0 && (cnp->cn_flags & MAKEENTRY)) {
+ if (!(cnp->cn_flags & ISLASTCN) ||
+ (nameiop != DELETE && nameiop != RENAME)) {
+ cache_enter(dvp, *vpp, cnp);
+ }
+ }
+#endif
+
+ return (error);
+}
+
+/*
+ * Attempt to create a new entry in a directory. If the entry
+ * already exists, truncate the file if permissible, else return
+ * an error. Return the vp of the created or trunc'd file.
+ *
+ * IN: dvp - vnode of directory to put new file entry in.
+ * name - name of new file entry.
+ * vap - attributes of new file.
+ * excl - flag indicating exclusive or non-exclusive mode.
+ * mode - mode to open file with.
+ * cr - credentials of caller.
+ * flag - large file flag [UNUSED].
+ *
+ * OUT: vpp - vnode of created or trunc'd entry.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * dvp - ctime|mtime updated if new entry created
+ * vp - ctime|mtime always, atime if new
+ */
+/* ARGSUSED */
+static int
+zfs_create(vnode_t *dvp, char *name, vattr_t *vap, int excl, int mode,
+ vnode_t **vpp, cred_t *cr, kthread_t *td)
+{
+ znode_t *zp, *dzp = VTOZ(dvp);
+ zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ objset_t *os = zfsvfs->z_os;
+ zfs_dirlock_t *dl;
+ dmu_tx_t *tx;
+ int error;
+ uint64_t zoid;
+
+ ZFS_ENTER(zfsvfs);
+
+top:
+ *vpp = NULL;
+
+ if ((vap->va_mode & VSVTX) && secpolicy_vnode_stky_modify(cr))
+ vap->va_mode &= ~VSVTX;
+
+ if (*name == '\0') {
+ /*
+ * Null component name refers to the directory itself.
+ */
+ VN_HOLD(dvp);
+ zp = dzp;
+ dl = NULL;
+ error = 0;
+ } else {
+ /* possible VN_HOLD(zp) */
+ if (error = zfs_dirent_lock(&dl, dzp, name, &zp, 0)) {
+ if (strcmp(name, "..") == 0)
+ error = EISDIR;
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+ }
+
+ zoid = zp ? zp->z_id : -1ULL;
+
+ if (zp == NULL) {
+ /*
+ * Create a new file object and update the directory
+ * to reference it.
+ */
+ if (error = zfs_zaccess(dzp, ACE_ADD_FILE, cr)) {
+ goto out;
+ }
+
+ /*
+ * We only support the creation of regular files in
+ * extended attribute directories.
+ */
+ if ((dzp->z_phys->zp_flags & ZFS_XATTR) &&
+ (vap->va_type != VREG)) {
+ error = EINVAL;
+ goto out;
+ }
+
+ tx = dmu_tx_create(os);
+ dmu_tx_hold_bonus(tx, DMU_NEW_OBJECT);
+ dmu_tx_hold_bonus(tx, dzp->z_id);
+ dmu_tx_hold_zap(tx, dzp->z_id, TRUE, name);
+ if (dzp->z_phys->zp_flags & ZFS_INHERIT_ACE)
+ dmu_tx_hold_write(tx, DMU_NEW_OBJECT,
+ 0, SPA_MAXBLOCKSIZE);
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ zfs_dirent_unlock(dl);
+ if (error == ERESTART &&
+ zfsvfs->z_assign == TXG_NOWAIT) {
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ goto top;
+ }
+ dmu_tx_abort(tx);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+ zfs_mknode(dzp, vap, &zoid, tx, cr, 0, &zp, 0);
+ ASSERT(zp->z_id == zoid);
+ (void) zfs_link_create(dl, zp, tx, ZNEW);
+ zfs_log_create(zilog, tx, TX_CREATE, dzp, zp, name);
+ dmu_tx_commit(tx);
+ } else {
+ /*
+ * A directory entry already exists for this name.
+ */
+ /*
+ * Can't truncate an existing file if in exclusive mode.
+ */
+ if (excl == EXCL) {
+ error = EEXIST;
+ goto out;
+ }
+ /*
+ * Can't open a directory for writing.
+ */
+ if ((ZTOV(zp)->v_type == VDIR) && (mode & S_IWRITE)) {
+ error = EISDIR;
+ goto out;
+ }
+ /*
+ * Verify requested access to file.
+ */
+ if (mode && (error = zfs_zaccess_rwx(zp, mode, cr))) {
+ goto out;
+ }
+
+ mutex_enter(&dzp->z_lock);
+ dzp->z_seq++;
+ mutex_exit(&dzp->z_lock);
+
+ /*
+ * Truncate regular files if requested.
+ */
+ if ((ZTOV(zp)->v_type == VREG) &&
+ (vap->va_mask & AT_SIZE) && (vap->va_size == 0)) {
+ error = zfs_freesp(zp, 0, 0, mode, TRUE);
+ if (error == ERESTART &&
+ zfsvfs->z_assign == TXG_NOWAIT) {
+ /* NB: we already did dmu_tx_wait() */
+ zfs_dirent_unlock(dl);
+ VN_RELE(ZTOV(zp));
+ goto top;
+ }
+ }
+ }
+out:
+
+ if (error == 0) {
+ *vpp = ZTOV(zp);
+ vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, td);
+ }
+
+ if (dl)
+ zfs_dirent_unlock(dl);
+
+ if (error) {
+ if (zp)
+ VN_RELE(ZTOV(zp));
+ } else {
+ *vpp = ZTOV(zp);
+ /*
+ * If vnode is for a device return a specfs vnode instead.
+ */
+ if (IS_DEVVP(*vpp)) {
+ struct vnode *svp;
+
+ svp = specvp(*vpp, (*vpp)->v_rdev, (*vpp)->v_type, cr);
+ VN_RELE(*vpp);
+ if (svp == NULL) {
+ error = ENOSYS;
+ }
+ *vpp = svp;
+ }
+ }
+
+ ZFS_EXIT(zfsvfs);
+ return (error);
+}
+
+/*
+ * Remove an entry from a directory.
+ *
+ * IN: dvp - vnode of directory to remove entry from.
+ * name - name of entry to remove.
+ * cr - credentials of caller.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * dvp - ctime|mtime
+ * vp - ctime (if nlink > 0)
+ */
+static int
+zfs_remove(vnode_t *dvp, char *name, cred_t *cr)
+{
+ znode_t *zp, *dzp = VTOZ(dvp);
+ znode_t *xzp = NULL;
+ vnode_t *vp;
+ zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ uint64_t acl_obj, xattr_obj;
+ zfs_dirlock_t *dl;
+ dmu_tx_t *tx;
+ boolean_t may_delete_now, delete_now = FALSE;
+ boolean_t unlinked;
+ int error;
+
+ ZFS_ENTER(zfsvfs);
+
+top:
+ /*
+ * Attempt to lock directory; fail if entry doesn't exist.
+ */
+ if (error = zfs_dirent_lock(&dl, dzp, name, &zp, ZEXISTS)) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ vp = ZTOV(zp);
+
+ if (error = zfs_zaccess_delete(dzp, zp, cr)) {
+ goto out;
+ }
+
+ /*
+ * Need to use rmdir for removing directories.
+ */
+ if (vp->v_type == VDIR) {
+ error = EPERM;
+ goto out;
+ }
+
+ vnevent_remove(vp);
+
+ dnlc_remove(dvp, name);
+
+ may_delete_now = FALSE;
+
+ /*
+ * We may delete the znode now, or we may put it in the unlinked set;
+ * it depends on whether we're the last link, and on whether there are
+ * other holds on the vnode. So we dmu_tx_hold() the right things to
+ * allow for either case.
+ */
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_zap(tx, dzp->z_id, FALSE, name);
+ dmu_tx_hold_bonus(tx, zp->z_id);
+ if (may_delete_now)
+ dmu_tx_hold_free(tx, zp->z_id, 0, DMU_OBJECT_END);
+
+ /* are there any extended attributes? */
+ if ((xattr_obj = zp->z_phys->zp_xattr) != 0) {
+ /* XXX - do we need this if we are deleting? */
+ dmu_tx_hold_bonus(tx, xattr_obj);
+ }
+
+ /* are there any additional acls */
+ if ((acl_obj = zp->z_phys->zp_acl.z_acl_extern_obj) != 0 &&
+ may_delete_now)
+ dmu_tx_hold_free(tx, acl_obj, 0, DMU_OBJECT_END);
+
+ /* charge as an update -- would be nice not to charge at all */
+ dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, FALSE, NULL);
+
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ zfs_dirent_unlock(dl);
+ VN_RELE(vp);
+ if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT) {
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ goto top;
+ }
+ dmu_tx_abort(tx);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ /*
+ * Remove the directory entry.
+ */
+ error = zfs_link_destroy(dl, zp, tx, 0, &unlinked);
+
+ if (error) {
+ dmu_tx_commit(tx);
+ goto out;
+ }
+
+ if (0 && unlinked) {
+ VI_LOCK(vp);
+ delete_now = may_delete_now &&
+ vp->v_count == 1 && !vn_has_cached_data(vp) &&
+ zp->z_phys->zp_xattr == xattr_obj &&
+ zp->z_phys->zp_acl.z_acl_extern_obj == acl_obj;
+ VI_UNLOCK(vp);
+ }
+
+ if (delete_now) {
+ if (zp->z_phys->zp_xattr) {
+ error = zfs_zget(zfsvfs, zp->z_phys->zp_xattr, &xzp);
+ ASSERT3U(error, ==, 0);
+ ASSERT3U(xzp->z_phys->zp_links, ==, 2);
+ dmu_buf_will_dirty(xzp->z_dbuf, tx);
+ mutex_enter(&xzp->z_lock);
+ xzp->z_unlinked = 1;
+ xzp->z_phys->zp_links = 0;
+ mutex_exit(&xzp->z_lock);
+ zfs_unlinked_add(xzp, tx);
+ zp->z_phys->zp_xattr = 0; /* probably unnecessary */
+ }
+ mutex_enter(&zp->z_lock);
+ VI_LOCK(vp);
+ vp->v_count--;
+ ASSERT3U(vp->v_count, ==, 0);
+ VI_UNLOCK(vp);
+ mutex_exit(&zp->z_lock);
+ zfs_znode_delete(zp, tx);
+ VFS_RELE(zfsvfs->z_vfs);
+ } else if (unlinked) {
+ zfs_unlinked_add(zp, tx);
+ }
+
+ zfs_log_remove(zilog, tx, TX_REMOVE, dzp, name);
+
+ dmu_tx_commit(tx);
+out:
+ zfs_dirent_unlock(dl);
+
+ if (!delete_now) {
+ VN_RELE(vp);
+ } else if (xzp) {
+ /* this rele delayed to prevent nesting transactions */
+ VN_RELE(ZTOV(xzp));
+ }
+
+ ZFS_EXIT(zfsvfs);
+ return (error);
+}
+
+/*
+ * Create a new directory and insert it into dvp using the name
+ * provided. Return a pointer to the inserted directory.
+ *
+ * IN: dvp - vnode of directory to add subdir to.
+ * dirname - name of new directory.
+ * vap - attributes of new directory.
+ * cr - credentials of caller.
+ *
+ * OUT: vpp - vnode of created directory.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * dvp - ctime|mtime updated
+ * vp - ctime|mtime|atime updated
+ */
+static int
+zfs_mkdir(vnode_t *dvp, char *dirname, vattr_t *vap, vnode_t **vpp, cred_t *cr)
+{
+ znode_t *zp, *dzp = VTOZ(dvp);
+ zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ zfs_dirlock_t *dl;
+ uint64_t zoid = 0;
+ dmu_tx_t *tx;
+ int error;
+
+ ASSERT(vap->va_type == VDIR);
+
+ ZFS_ENTER(zfsvfs);
+
+ if (dzp->z_phys->zp_flags & ZFS_XATTR) {
+ ZFS_EXIT(zfsvfs);
+ return (EINVAL);
+ }
+top:
+ *vpp = NULL;
+
+ /*
+ * First make sure the new directory doesn't exist.
+ */
+ if (error = zfs_dirent_lock(&dl, dzp, dirname, &zp, ZNEW)) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ if (error = zfs_zaccess(dzp, ACE_ADD_SUBDIRECTORY, cr)) {
+ zfs_dirent_unlock(dl);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ /*
+ * Add a new entry to the directory.
+ */
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_zap(tx, dzp->z_id, TRUE, dirname);
+ dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, FALSE, NULL);
+ if (dzp->z_phys->zp_flags & ZFS_INHERIT_ACE)
+ dmu_tx_hold_write(tx, DMU_NEW_OBJECT,
+ 0, SPA_MAXBLOCKSIZE);
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ zfs_dirent_unlock(dl);
+ if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT) {
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ goto top;
+ }
+ dmu_tx_abort(tx);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ /*
+ * Create new node.
+ */
+ zfs_mknode(dzp, vap, &zoid, tx, cr, 0, &zp, 0);
+
+ /*
+ * Now put new name in parent dir.
+ */
+ (void) zfs_link_create(dl, zp, tx, ZNEW);
+
+ *vpp = ZTOV(zp);
+
+ zfs_log_create(zilog, tx, TX_MKDIR, dzp, zp, dirname);
+ dmu_tx_commit(tx);
+
+ vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, curthread);
+
+ zfs_dirent_unlock(dl);
+
+ ZFS_EXIT(zfsvfs);
+ return (0);
+}
+
+/*
+ * Remove a directory subdir entry. If the current working
+ * directory is the same as the subdir to be removed, the
+ * remove will fail.
+ *
+ * IN: dvp - vnode of directory to remove from.
+ * name - name of directory to be removed.
+ * cwd - vnode of current working directory.
+ * cr - credentials of caller.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * dvp - ctime|mtime updated
+ */
+static int
+zfs_rmdir(vnode_t *dvp, char *name, vnode_t *cwd, cred_t *cr)
+{
+ znode_t *dzp = VTOZ(dvp);
+ znode_t *zp;
+ vnode_t *vp;
+ zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ zfs_dirlock_t *dl;
+ dmu_tx_t *tx;
+ int error;
+
+ ZFS_ENTER(zfsvfs);
+
+top:
+ zp = NULL;
+
+ /*
+ * Attempt to lock directory; fail if entry doesn't exist.
+ */
+ if (error = zfs_dirent_lock(&dl, dzp, name, &zp, ZEXISTS)) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ vp = ZTOV(zp);
+
+ if (error = zfs_zaccess_delete(dzp, zp, cr)) {
+ goto out;
+ }
+
+ if (vp->v_type != VDIR) {
+ error = ENOTDIR;
+ goto out;
+ }
+
+ if (vp == cwd) {
+ error = EINVAL;
+ goto out;
+ }
+
+ vnevent_rmdir(vp);
+
+ /*
+ * Grab a lock on the directory to make sure that noone is
+ * trying to add (or lookup) entries while we are removing it.
+ */
+ rw_enter(&zp->z_name_lock, RW_WRITER);
+
+ /*
+ * Grab a lock on the parent pointer to make sure we play well
+ * with the treewalk and directory rename code.
+ */
+ rw_enter(&zp->z_parent_lock, RW_WRITER);
+
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_zap(tx, dzp->z_id, FALSE, name);
+ dmu_tx_hold_bonus(tx, zp->z_id);
+ dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, FALSE, NULL);
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ rw_exit(&zp->z_parent_lock);
+ rw_exit(&zp->z_name_lock);
+ zfs_dirent_unlock(dl);
+ VN_RELE(vp);
+ if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT) {
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ goto top;
+ }
+ dmu_tx_abort(tx);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+#ifdef FREEBSD_NAMECACHE
+ cache_purge(dvp);
+#endif
+
+ error = zfs_link_destroy(dl, zp, tx, 0, NULL);
+
+ if (error == 0)
+ zfs_log_remove(zilog, tx, TX_RMDIR, dzp, name);
+
+ dmu_tx_commit(tx);
+
+ rw_exit(&zp->z_parent_lock);
+ rw_exit(&zp->z_name_lock);
+#ifdef FREEBSD_NAMECACHE
+ cache_purge(vp);
+#endif
+out:
+ zfs_dirent_unlock(dl);
+
+ VN_RELE(vp);
+
+ ZFS_EXIT(zfsvfs);
+ return (error);
+}
+
+/*
+ * Read as many directory entries as will fit into the provided
+ * buffer from the given directory cursor position (specified in
+ * the uio structure.
+ *
+ * IN: vp - vnode of directory to read.
+ * uio - structure supplying read location, range info,
+ * and return buffer.
+ * cr - credentials of caller.
+ *
+ * OUT: uio - updated offset and range, buffer filled.
+ * eofp - set to true if end-of-file detected.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * vp - atime updated
+ *
+ * Note that the low 4 bits of the cookie returned by zap is always zero.
+ * This allows us to use the low range for "special" directory entries:
+ * We use 0 for '.', and 1 for '..'. If this is the root of the filesystem,
+ * we use the offset 2 for the '.zfs' directory.
+ */
+/* ARGSUSED */
+static int
+zfs_readdir(vnode_t *vp, uio_t *uio, cred_t *cr, int *eofp, int *ncookies, u_long **cookies)
+{
+ znode_t *zp = VTOZ(vp);
+ iovec_t *iovp;
+ dirent64_t *odp;
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ objset_t *os;
+ caddr_t outbuf;
+ size_t bufsize;
+ zap_cursor_t zc;
+ zap_attribute_t zap;
+ uint_t bytes_wanted;
+ uint64_t offset; /* must be unsigned; checks for < 1 */
+ int local_eof;
+ int outcount;
+ int error;
+ uint8_t prefetch;
+ uint8_t type;
+ int ncooks;
+ u_long *cooks = NULL;
+
+ ZFS_ENTER(zfsvfs);
+
+ /*
+ * If we are not given an eof variable,
+ * use a local one.
+ */
+ if (eofp == NULL)
+ eofp = &local_eof;
+
+ /*
+ * Check for valid iov_len.
+ */
+ if (uio->uio_iov->iov_len <= 0) {
+ ZFS_EXIT(zfsvfs);
+ return (EINVAL);
+ }
+
+ /*
+ * Quit if directory has been removed (posix)
+ */
+ if ((*eofp = zp->z_unlinked) != 0) {
+ ZFS_EXIT(zfsvfs);
+ return (0);
+ }
+
+ error = 0;
+ os = zfsvfs->z_os;
+ offset = uio->uio_loffset;
+ prefetch = zp->z_zn_prefetch;
+
+ /*
+ * Initialize the iterator cursor.
+ */
+ if (offset <= 3) {
+ /*
+ * Start iteration from the beginning of the directory.
+ */
+ zap_cursor_init(&zc, os, zp->z_id);
+ } else {
+ /*
+ * The offset is a serialized cursor.
+ */
+ zap_cursor_init_serialized(&zc, os, zp->z_id, offset);
+ }
+
+ /*
+ * Get space to change directory entries into fs independent format.
+ */
+ iovp = uio->uio_iov;
+ bytes_wanted = iovp->iov_len;
+ if (uio->uio_segflg != UIO_SYSSPACE || uio->uio_iovcnt != 1) {
+ bufsize = bytes_wanted;
+ outbuf = kmem_alloc(bufsize, KM_SLEEP);
+ odp = (struct dirent64 *)outbuf;
+ } else {
+ bufsize = bytes_wanted;
+ odp = (struct dirent64 *)iovp->iov_base;
+ }
+
+ if (ncookies != NULL) {
+ /*
+ * Minimum entry size is dirent size and 1 byte for a file name.
+ */
+ ncooks = uio->uio_resid / (sizeof(struct dirent) - sizeof(((struct dirent *)NULL)->d_name) + 1);
+ cooks = malloc(ncooks * sizeof(u_long), M_TEMP, M_WAITOK);
+ *cookies = cooks;
+ *ncookies = ncooks;
+ }
+
+ /*
+ * Transform to file-system independent format
+ */
+ outcount = 0;
+ while (outcount < bytes_wanted) {
+ ino64_t objnum;
+ ushort_t reclen;
+
+ /*
+ * Special case `.', `..', and `.zfs'.
+ */
+ if (offset == 0) {
+ (void) strcpy(zap.za_name, ".");
+ objnum = zp->z_id;
+ type = DT_DIR;
+ } else if (offset == 1) {
+ (void) strcpy(zap.za_name, "..");
+ objnum = zp->z_phys->zp_parent;
+ type = DT_DIR;
+ } else if (offset == 2 && zfs_show_ctldir(zp)) {
+ (void) strcpy(zap.za_name, ZFS_CTLDIR_NAME);
+ objnum = ZFSCTL_INO_ROOT;
+ type = DT_DIR;
+ } else {
+ /*
+ * Grab next entry.
+ */
+ if (error = zap_cursor_retrieve(&zc, &zap)) {
+ if ((*eofp = (error == ENOENT)) != 0)
+ break;
+ else
+ goto update;
+ }
+
+ if (zap.za_integer_length != 8 ||
+ zap.za_num_integers != 1) {
+ cmn_err(CE_WARN, "zap_readdir: bad directory "
+ "entry, obj = %lld, offset = %lld\n",
+ (u_longlong_t)zp->z_id,
+ (u_longlong_t)offset);
+ error = ENXIO;
+ goto update;
+ }
+
+ objnum = ZFS_DIRENT_OBJ(zap.za_first_integer);
+ /*
+ * MacOS X can extract the object type here such as:
+ * uint8_t type = ZFS_DIRENT_TYPE(zap.za_first_integer);
+ */
+ type = ZFS_DIRENT_TYPE(zap.za_first_integer);
+ }
+ reclen = DIRENT64_RECLEN(strlen(zap.za_name));
+
+ /*
+ * Will this entry fit in the buffer?
+ */
+ if (outcount + reclen > bufsize) {
+ /*
+ * Did we manage to fit anything in the buffer?
+ */
+ if (!outcount) {
+ error = EINVAL;
+ goto update;
+ }
+ break;
+ }
+ /*
+ * Add this entry:
+ */
+ odp->d_ino = objnum;
+ odp->d_reclen = reclen;
+ odp->d_namlen = strlen(zap.za_name);
+ (void) strlcpy(odp->d_name, zap.za_name, odp->d_namlen + 1);
+ odp->d_type = type;
+ outcount += reclen;
+ odp = (dirent64_t *)((intptr_t)odp + reclen);
+
+ ASSERT(outcount <= bufsize);
+
+ /* Prefetch znode */
+ if (prefetch)
+ dmu_prefetch(os, objnum, 0, 0);
+
+ /*
+ * Move to the next entry, fill in the previous offset.
+ */
+ if (offset > 2 || (offset == 2 && !zfs_show_ctldir(zp))) {
+ zap_cursor_advance(&zc);
+ offset = zap_cursor_serialize(&zc);
+ } else {
+ offset += 1;
+ }
+
+ if (cooks != NULL) {
+ *cooks++ = offset;
+ ncooks--;
+ KASSERT(ncooks >= 0, ("ncookies=%d", ncooks));
+ }
+ }
+ zp->z_zn_prefetch = B_FALSE; /* a lookup will re-enable pre-fetching */
+
+ /* Subtract unused cookies */
+ if (ncookies != NULL)
+ *ncookies -= ncooks;
+
+ if (uio->uio_segflg == UIO_SYSSPACE && uio->uio_iovcnt == 1) {
+ iovp->iov_base += outcount;
+ iovp->iov_len -= outcount;
+ uio->uio_resid -= outcount;
+ } else if (error = uiomove(outbuf, (long)outcount, UIO_READ, uio)) {
+ /*
+ * Reset the pointer.
+ */
+ offset = uio->uio_loffset;
+ }
+
+update:
+ zap_cursor_fini(&zc);
+ if (uio->uio_segflg != UIO_SYSSPACE || uio->uio_iovcnt != 1)
+ kmem_free(outbuf, bufsize);
+
+ if (error == ENOENT)
+ error = 0;
+
+ ZFS_ACCESSTIME_STAMP(zfsvfs, zp);
+
+ uio->uio_loffset = offset;
+ ZFS_EXIT(zfsvfs);
+ if (error != 0 && cookies != NULL) {
+ free(*cookies, M_TEMP);
+ *cookies = NULL;
+ *ncookies = 0;
+ }
+ return (error);
+}
+
+static int
+zfs_fsync(vnode_t *vp, int syncflag, cred_t *cr)
+{
+ znode_t *zp = VTOZ(vp);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+
+ ZFS_ENTER(zfsvfs);
+ zil_commit(zfsvfs->z_log, zp->z_last_itx, zp->z_id);
+ ZFS_EXIT(zfsvfs);
+ return (0);
+}
+
+/*
+ * Get the requested file attributes and place them in the provided
+ * vattr structure.
+ *
+ * IN: vp - vnode of file.
+ * vap - va_mask identifies requested attributes.
+ * flags - [UNUSED]
+ * cr - credentials of caller.
+ *
+ * OUT: vap - attribute values.
+ *
+ * RETURN: 0 (always succeeds)
+ */
+/* ARGSUSED */
+static int
+zfs_getattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr)
+{
+ znode_t *zp = VTOZ(vp);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ znode_phys_t *pzp = zp->z_phys;
+ uint32_t blksize;
+ u_longlong_t nblocks;
+ int error;
+
+ ZFS_ENTER(zfsvfs);
+
+ /*
+ * Return all attributes. It's cheaper to provide the answer
+ * than to determine whether we were asked the question.
+ */
+ mutex_enter(&zp->z_lock);
+
+ vap->va_type = IFTOVT(pzp->zp_mode);
+ vap->va_mode = pzp->zp_mode & ~S_IFMT;
+ vap->va_uid = zp->z_phys->zp_uid;
+ vap->va_gid = zp->z_phys->zp_gid;
+ vap->va_nodeid = zp->z_id;
+ vap->va_nlink = MIN(pzp->zp_links, UINT32_MAX); /* nlink_t limit! */
+ vap->va_size = pzp->zp_size;
+ vap->va_fsid = vp->v_mount->mnt_stat.f_fsid.val[0];
+ vap->va_rdev = zfs_cmpldev(pzp->zp_rdev);
+ vap->va_seq = zp->z_seq;
+ vap->va_flags = 0; /* FreeBSD: Reset chflags(2) flags. */
+
+ ZFS_TIME_DECODE(&vap->va_atime, pzp->zp_atime);
+ ZFS_TIME_DECODE(&vap->va_mtime, pzp->zp_mtime);
+ ZFS_TIME_DECODE(&vap->va_ctime, pzp->zp_ctime);
+ ZFS_TIME_DECODE(&vap->va_birthtime, pzp->zp_crtime);
+
+ /*
+ * If ACL is trivial don't bother looking for ACE_READ_ATTRIBUTES.
+ * Also, if we are the owner don't bother, since owner should
+ * always be allowed to read basic attributes of file.
+ */
+ if (!(zp->z_phys->zp_flags & ZFS_ACL_TRIVIAL) &&
+ (zp->z_phys->zp_uid != crgetuid(cr))) {
+ if (error = zfs_zaccess(zp, ACE_READ_ATTRIBUTES, cr)) {
+ mutex_exit(&zp->z_lock);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+ }
+
+ mutex_exit(&zp->z_lock);
+
+ dmu_object_size_from_db(zp->z_dbuf, &blksize, &nblocks);
+ vap->va_blksize = blksize;
+ vap->va_bytes = nblocks << 9; /* nblocks * 512 */
+
+ if (zp->z_blksz == 0) {
+ /*
+ * Block size hasn't been set; suggest maximal I/O transfers.
+ */
+ vap->va_blksize = zfsvfs->z_max_blksz;
+ }
+
+ ZFS_EXIT(zfsvfs);
+ return (0);
+}
+
+/*
+ * Set the file attributes to the values contained in the
+ * vattr structure.
+ *
+ * IN: vp - vnode of file to be modified.
+ * vap - new attribute values.
+ * flags - ATTR_UTIME set if non-default time values provided.
+ * cr - credentials of caller.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * vp - ctime updated, mtime updated if size changed.
+ */
+/* ARGSUSED */
+static int
+zfs_setattr(vnode_t *vp, vattr_t *vap, int flags, cred_t *cr,
+ caller_context_t *ct)
+{
+ struct znode *zp = VTOZ(vp);
+ znode_phys_t *pzp = zp->z_phys;
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ dmu_tx_t *tx;
+ vattr_t oldva;
+ uint_t mask = vap->va_mask;
+ uint_t saved_mask;
+ int trim_mask = 0;
+ uint64_t new_mode;
+ znode_t *attrzp;
+ int need_policy = FALSE;
+ int err;
+
+ if (mask == 0)
+ return (0);
+
+ if (mask & AT_NOSET)
+ return (EINVAL);
+
+ if (mask & AT_SIZE && vp->v_type == VDIR)
+ return (EISDIR);
+
+ if (mask & AT_SIZE && vp->v_type != VREG && vp->v_type != VFIFO)
+ return (EINVAL);
+
+ ZFS_ENTER(zfsvfs);
+
+top:
+ attrzp = NULL;
+
+ if (zfsvfs->z_vfs->vfs_flag & VFS_RDONLY) {
+ ZFS_EXIT(zfsvfs);
+ return (EROFS);
+ }
+
+ /*
+ * First validate permissions
+ */
+
+ if (mask & AT_SIZE) {
+ err = zfs_zaccess(zp, ACE_WRITE_DATA, cr);
+ if (err) {
+ ZFS_EXIT(zfsvfs);
+ return (err);
+ }
+ /*
+ * XXX - Note, we are not providing any open
+ * mode flags here (like FNDELAY), so we may
+ * block if there are locks present... this
+ * should be addressed in openat().
+ */
+ do {
+ err = zfs_freesp(zp, vap->va_size, 0, 0, FALSE);
+ /* NB: we already did dmu_tx_wait() if necessary */
+ } while (err == ERESTART && zfsvfs->z_assign == TXG_NOWAIT);
+ if (err) {
+ ZFS_EXIT(zfsvfs);
+ return (err);
+ }
+ }
+
+ if (mask & (AT_ATIME|AT_MTIME))
+ need_policy = zfs_zaccess_v4_perm(zp, ACE_WRITE_ATTRIBUTES, cr);
+
+ if (mask & (AT_UID|AT_GID)) {
+ int idmask = (mask & (AT_UID|AT_GID));
+ int take_owner;
+ int take_group;
+
+ /*
+ * NOTE: even if a new mode is being set,
+ * we may clear S_ISUID/S_ISGID bits.
+ */
+
+ if (!(mask & AT_MODE))
+ vap->va_mode = pzp->zp_mode;
+
+ /*
+ * Take ownership or chgrp to group we are a member of
+ */
+
+ take_owner = (mask & AT_UID) && (vap->va_uid == crgetuid(cr));
+ take_group = (mask & AT_GID) && groupmember(vap->va_gid, cr);
+
+ /*
+ * If both AT_UID and AT_GID are set then take_owner and
+ * take_group must both be set in order to allow taking
+ * ownership.
+ *
+ * Otherwise, send the check through secpolicy_vnode_setattr()
+ *
+ */
+
+ if (((idmask == (AT_UID|AT_GID)) && take_owner && take_group) ||
+ ((idmask == AT_UID) && take_owner) ||
+ ((idmask == AT_GID) && take_group)) {
+ if (zfs_zaccess_v4_perm(zp, ACE_WRITE_OWNER, cr) == 0) {
+ /*
+ * Remove setuid/setgid for non-privileged users
+ */
+ secpolicy_setid_clear(vap, cr);
+ trim_mask = (mask & (AT_UID|AT_GID));
+ } else {
+ need_policy = TRUE;
+ }
+ } else {
+ need_policy = TRUE;
+ }
+ }
+
+ mutex_enter(&zp->z_lock);
+ oldva.va_mode = pzp->zp_mode;
+ oldva.va_uid = zp->z_phys->zp_uid;
+ oldva.va_gid = zp->z_phys->zp_gid;
+ mutex_exit(&zp->z_lock);
+
+ if (mask & AT_MODE) {
+ if (zfs_zaccess_v4_perm(zp, ACE_WRITE_ACL, cr) == 0) {
+ err = secpolicy_setid_setsticky_clear(vp, vap,
+ &oldva, cr);
+ if (err) {
+ ZFS_EXIT(zfsvfs);
+ return (err);
+ }
+ trim_mask |= AT_MODE;
+ } else {
+ need_policy = TRUE;
+ }
+ }
+
+ if (need_policy) {
+ /*
+ * If trim_mask is set then take ownership
+ * has been granted or write_acl is present and user
+ * has the ability to modify mode. In that case remove
+ * UID|GID and or MODE from mask so that
+ * secpolicy_vnode_setattr() doesn't revoke it.
+ */
+
+ if (trim_mask) {
+ saved_mask = vap->va_mask;
+ vap->va_mask &= ~trim_mask;
+
+ }
+ err = secpolicy_vnode_setattr(cr, vp, vap, &oldva, flags,
+ (int (*)(void *, int, cred_t *))zfs_zaccess_rwx, zp);
+ if (err) {
+ ZFS_EXIT(zfsvfs);
+ return (err);
+ }
+
+ if (trim_mask)
+ vap->va_mask |= saved_mask;
+ }
+
+ /*
+ * secpolicy_vnode_setattr, or take ownership may have
+ * changed va_mask
+ */
+ mask = vap->va_mask;
+
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_bonus(tx, zp->z_id);
+
+ if (mask & AT_MODE) {
+ uint64_t pmode = pzp->zp_mode;
+
+ new_mode = (pmode & S_IFMT) | (vap->va_mode & ~S_IFMT);
+
+ if (zp->z_phys->zp_acl.z_acl_extern_obj)
+ dmu_tx_hold_write(tx,
+ pzp->zp_acl.z_acl_extern_obj, 0, SPA_MAXBLOCKSIZE);
+ else
+ dmu_tx_hold_write(tx, DMU_NEW_OBJECT,
+ 0, ZFS_ACL_SIZE(MAX_ACL_SIZE));
+ }
+
+ if ((mask & (AT_UID | AT_GID)) && zp->z_phys->zp_xattr != 0) {
+ err = zfs_zget(zp->z_zfsvfs, zp->z_phys->zp_xattr, &attrzp);
+ if (err) {
+ dmu_tx_abort(tx);
+ ZFS_EXIT(zfsvfs);
+ return (err);
+ }
+ dmu_tx_hold_bonus(tx, attrzp->z_id);
+ }
+
+ err = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (err) {
+ if (attrzp)
+ VN_RELE(ZTOV(attrzp));
+ if (err == ERESTART && zfsvfs->z_assign == TXG_NOWAIT) {
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ goto top;
+ }
+ dmu_tx_abort(tx);
+ ZFS_EXIT(zfsvfs);
+ return (err);
+ }
+
+ dmu_buf_will_dirty(zp->z_dbuf, tx);
+
+ /*
+ * Set each attribute requested.
+ * We group settings according to the locks they need to acquire.
+ *
+ * Note: you cannot set ctime directly, although it will be
+ * updated as a side-effect of calling this function.
+ */
+
+ mutex_enter(&zp->z_lock);
+
+ if (mask & AT_MODE) {
+ err = zfs_acl_chmod_setattr(zp, new_mode, tx);
+ ASSERT3U(err, ==, 0);
+ }
+
+ if (attrzp)
+ mutex_enter(&attrzp->z_lock);
+
+ if (mask & AT_UID) {
+ zp->z_phys->zp_uid = (uint64_t)vap->va_uid;
+ if (attrzp) {
+ attrzp->z_phys->zp_uid = (uint64_t)vap->va_uid;
+ }
+ }
+
+ if (mask & AT_GID) {
+ zp->z_phys->zp_gid = (uint64_t)vap->va_gid;
+ if (attrzp)
+ attrzp->z_phys->zp_gid = (uint64_t)vap->va_gid;
+ }
+
+ if (attrzp)
+ mutex_exit(&attrzp->z_lock);
+
+ if (mask & AT_ATIME)
+ ZFS_TIME_ENCODE(&vap->va_atime, pzp->zp_atime);
+
+ if (mask & AT_MTIME)
+ ZFS_TIME_ENCODE(&vap->va_mtime, pzp->zp_mtime);
+
+ if (mask & AT_SIZE)
+ zfs_time_stamper_locked(zp, CONTENT_MODIFIED, tx);
+ else if (mask != 0)
+ zfs_time_stamper_locked(zp, STATE_CHANGED, tx);
+
+ if (mask != 0)
+ zfs_log_setattr(zilog, tx, TX_SETATTR, zp, vap, mask);
+
+ mutex_exit(&zp->z_lock);
+
+ if (attrzp)
+ VN_RELE(ZTOV(attrzp));
+
+ dmu_tx_commit(tx);
+
+ ZFS_EXIT(zfsvfs);
+ return (err);
+}
+
+typedef struct zfs_zlock {
+ krwlock_t *zl_rwlock; /* lock we acquired */
+ znode_t *zl_znode; /* znode we held */
+ struct zfs_zlock *zl_next; /* next in list */
+} zfs_zlock_t;
+
+/*
+ * Drop locks and release vnodes that were held by zfs_rename_lock().
+ */
+static void
+zfs_rename_unlock(zfs_zlock_t **zlpp)
+{
+ zfs_zlock_t *zl;
+
+ while ((zl = *zlpp) != NULL) {
+ if (zl->zl_znode != NULL)
+ VN_RELE(ZTOV(zl->zl_znode));
+ rw_exit(zl->zl_rwlock);
+ *zlpp = zl->zl_next;
+ kmem_free(zl, sizeof (*zl));
+ }
+}
+
+/*
+ * Search back through the directory tree, using the ".." entries.
+ * Lock each directory in the chain to prevent concurrent renames.
+ * Fail any attempt to move a directory into one of its own descendants.
+ * XXX - z_parent_lock can overlap with map or grow locks
+ */
+static int
+zfs_rename_lock(znode_t *szp, znode_t *tdzp, znode_t *sdzp, zfs_zlock_t **zlpp)
+{
+ zfs_zlock_t *zl;
+ znode_t *zp = tdzp;
+ uint64_t rootid = zp->z_zfsvfs->z_root;
+ uint64_t *oidp = &zp->z_id;
+ krwlock_t *rwlp = &szp->z_parent_lock;
+ krw_t rw = RW_WRITER;
+
+ /*
+ * First pass write-locks szp and compares to zp->z_id.
+ * Later passes read-lock zp and compare to zp->z_parent.
+ */
+ do {
+ if (!rw_tryenter(rwlp, rw)) {
+ /*
+ * Another thread is renaming in this path.
+ * Note that if we are a WRITER, we don't have any
+ * parent_locks held yet.
+ */
+ if (rw == RW_READER && zp->z_id > szp->z_id) {
+ /*
+ * Drop our locks and restart
+ */
+ zfs_rename_unlock(&zl);
+ *zlpp = NULL;
+ zp = tdzp;
+ oidp = &zp->z_id;
+ rwlp = &szp->z_parent_lock;
+ rw = RW_WRITER;
+ continue;
+ } else {
+ /*
+ * Wait for other thread to drop its locks
+ */
+ rw_enter(rwlp, rw);
+ }
+ }
+
+ zl = kmem_alloc(sizeof (*zl), KM_SLEEP);
+ zl->zl_rwlock = rwlp;
+ zl->zl_znode = NULL;
+ zl->zl_next = *zlpp;
+ *zlpp = zl;
+
+ if (*oidp == szp->z_id) /* We're a descendant of szp */
+ return (EINVAL);
+
+ if (*oidp == rootid) /* We've hit the top */
+ return (0);
+
+ if (rw == RW_READER) { /* i.e. not the first pass */
+ int error = zfs_zget(zp->z_zfsvfs, *oidp, &zp);
+ if (error)
+ return (error);
+ zl->zl_znode = zp;
+ }
+ oidp = &zp->z_phys->zp_parent;
+ rwlp = &zp->z_parent_lock;
+ rw = RW_READER;
+
+ } while (zp->z_id != sdzp->z_id);
+
+ return (0);
+}
+
+/*
+ * Move an entry from the provided source directory to the target
+ * directory. Change the entry name as indicated.
+ *
+ * IN: sdvp - Source directory containing the "old entry".
+ * snm - Old entry name.
+ * tdvp - Target directory to contain the "new entry".
+ * tnm - New entry name.
+ * cr - credentials of caller.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * sdvp,tdvp - ctime|mtime updated
+ */
+static int
+zfs_rename(vnode_t *sdvp, char *snm, vnode_t *tdvp, char *tnm, cred_t *cr)
+{
+ znode_t *tdzp, *szp, *tzp;
+ znode_t *sdzp = VTOZ(sdvp);
+ zfsvfs_t *zfsvfs = sdzp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ vnode_t *realvp;
+ zfs_dirlock_t *sdl, *tdl;
+ dmu_tx_t *tx;
+ zfs_zlock_t *zl;
+ int cmp, serr, terr, error;
+
+ ZFS_ENTER(zfsvfs);
+
+ /*
+ * Make sure we have the real vp for the target directory.
+ */
+ if (VOP_REALVP(tdvp, &realvp) == 0)
+ tdvp = realvp;
+
+ if (tdvp->v_vfsp != sdvp->v_vfsp) {
+ ZFS_EXIT(zfsvfs);
+ return (EXDEV);
+ }
+
+ tdzp = VTOZ(tdvp);
+top:
+ szp = NULL;
+ tzp = NULL;
+ zl = NULL;
+
+ /*
+ * This is to prevent the creation of links into attribute space
+ * by renaming a linked file into/outof an attribute directory.
+ * See the comment in zfs_link() for why this is considered bad.
+ */
+ if ((tdzp->z_phys->zp_flags & ZFS_XATTR) !=
+ (sdzp->z_phys->zp_flags & ZFS_XATTR)) {
+ ZFS_EXIT(zfsvfs);
+ return (EINVAL);
+ }
+
+ /*
+ * Lock source and target directory entries. To prevent deadlock,
+ * a lock ordering must be defined. We lock the directory with
+ * the smallest object id first, or if it's a tie, the one with
+ * the lexically first name.
+ */
+ if (sdzp->z_id < tdzp->z_id) {
+ cmp = -1;
+ } else if (sdzp->z_id > tdzp->z_id) {
+ cmp = 1;
+ } else {
+ cmp = strcmp(snm, tnm);
+ if (cmp == 0) {
+ /*
+ * POSIX: "If the old argument and the new argument
+ * both refer to links to the same existing file,
+ * the rename() function shall return successfully
+ * and perform no other action."
+ */
+ ZFS_EXIT(zfsvfs);
+ return (0);
+ }
+ }
+ if (cmp < 0) {
+ serr = zfs_dirent_lock(&sdl, sdzp, snm, &szp, ZEXISTS);
+ terr = zfs_dirent_lock(&tdl, tdzp, tnm, &tzp, 0);
+ } else {
+ terr = zfs_dirent_lock(&tdl, tdzp, tnm, &tzp, 0);
+ serr = zfs_dirent_lock(&sdl, sdzp, snm, &szp, ZEXISTS);
+ }
+
+ if (serr) {
+ /*
+ * Source entry invalid or not there.
+ */
+ if (!terr) {
+ zfs_dirent_unlock(tdl);
+ if (tzp)
+ VN_RELE(ZTOV(tzp));
+ }
+ if (strcmp(snm, ".") == 0 || strcmp(snm, "..") == 0)
+ serr = EINVAL;
+ ZFS_EXIT(zfsvfs);
+ return (serr);
+ }
+ if (terr) {
+ zfs_dirent_unlock(sdl);
+ VN_RELE(ZTOV(szp));
+ if (strcmp(tnm, "..") == 0)
+ terr = EINVAL;
+ ZFS_EXIT(zfsvfs);
+ return (terr);
+ }
+
+ /*
+ * Must have write access at the source to remove the old entry
+ * and write access at the target to create the new entry.
+ * Note that if target and source are the same, this can be
+ * done in a single check.
+ */
+
+ if (error = zfs_zaccess_rename(sdzp, szp, tdzp, tzp, cr))
+ goto out;
+
+ if (ZTOV(szp)->v_type == VDIR) {
+ /*
+ * Check to make sure rename is valid.
+ * Can't do a move like this: /usr/a/b to /usr/a/b/c/d
+ */
+ if (error = zfs_rename_lock(szp, tdzp, sdzp, &zl))
+ goto out;
+ }
+
+ /*
+ * Does target exist?
+ */
+ if (tzp) {
+ /*
+ * Source and target must be the same type.
+ */
+ if (ZTOV(szp)->v_type == VDIR) {
+ if (ZTOV(tzp)->v_type != VDIR) {
+ error = ENOTDIR;
+ goto out;
+ }
+ } else {
+ if (ZTOV(tzp)->v_type == VDIR) {
+ error = EISDIR;
+ goto out;
+ }
+ }
+ /*
+ * POSIX dictates that when the source and target
+ * entries refer to the same file object, rename
+ * must do nothing and exit without error.
+ */
+ if (szp->z_id == tzp->z_id) {
+ error = 0;
+ goto out;
+ }
+ }
+
+ vnevent_rename_src(ZTOV(szp));
+ if (tzp)
+ vnevent_rename_dest(ZTOV(tzp));
+
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_bonus(tx, szp->z_id); /* nlink changes */
+ dmu_tx_hold_bonus(tx, sdzp->z_id); /* nlink changes */
+ dmu_tx_hold_zap(tx, sdzp->z_id, FALSE, snm);
+ dmu_tx_hold_zap(tx, tdzp->z_id, TRUE, tnm);
+ if (sdzp != tdzp)
+ dmu_tx_hold_bonus(tx, tdzp->z_id); /* nlink changes */
+ if (tzp)
+ dmu_tx_hold_bonus(tx, tzp->z_id); /* parent changes */
+ dmu_tx_hold_zap(tx, zfsvfs->z_unlinkedobj, FALSE, NULL);
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ if (zl != NULL)
+ zfs_rename_unlock(&zl);
+ zfs_dirent_unlock(sdl);
+ zfs_dirent_unlock(tdl);
+ VN_RELE(ZTOV(szp));
+ if (tzp)
+ VN_RELE(ZTOV(tzp));
+ if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT) {
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ goto top;
+ }
+ dmu_tx_abort(tx);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ if (tzp) /* Attempt to remove the existing target */
+ error = zfs_link_destroy(tdl, tzp, tx, 0, NULL);
+
+ if (error == 0) {
+ error = zfs_link_create(tdl, szp, tx, ZRENAMING);
+ if (error == 0) {
+ error = zfs_link_destroy(sdl, szp, tx, ZRENAMING, NULL);
+ ASSERT(error == 0);
+ zfs_log_rename(zilog, tx, TX_RENAME, sdzp,
+ sdl->dl_name, tdzp, tdl->dl_name, szp);
+ }
+#ifdef FREEBSD_NAMECACHE
+ if (error == 0) {
+ cache_purge(sdvp);
+ cache_purge(tdvp);
+ }
+#endif
+ }
+
+ dmu_tx_commit(tx);
+out:
+ if (zl != NULL)
+ zfs_rename_unlock(&zl);
+
+ zfs_dirent_unlock(sdl);
+ zfs_dirent_unlock(tdl);
+
+ VN_RELE(ZTOV(szp));
+ if (tzp)
+ VN_RELE(ZTOV(tzp));
+
+ ZFS_EXIT(zfsvfs);
+
+ return (error);
+}
+
+/*
+ * Insert the indicated symbolic reference entry into the directory.
+ *
+ * IN: dvp - Directory to contain new symbolic link.
+ * link - Name for new symlink entry.
+ * vap - Attributes of new entry.
+ * target - Target path of new symlink.
+ * cr - credentials of caller.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * dvp - ctime|mtime updated
+ */
+static int
+zfs_symlink(vnode_t *dvp, vnode_t **vpp, char *name, vattr_t *vap, char *link, cred_t *cr, kthread_t *td)
+{
+ znode_t *zp, *dzp = VTOZ(dvp);
+ zfs_dirlock_t *dl;
+ dmu_tx_t *tx;
+ zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ uint64_t zoid;
+ int len = strlen(link);
+ int error;
+
+ ASSERT(vap->va_type == VLNK);
+
+ ZFS_ENTER(zfsvfs);
+top:
+ if (error = zfs_zaccess(dzp, ACE_ADD_FILE, cr)) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ if (len > MAXPATHLEN) {
+ ZFS_EXIT(zfsvfs);
+ return (ENAMETOOLONG);
+ }
+
+ /*
+ * Attempt to lock directory; fail if entry already exists.
+ */
+ if (error = zfs_dirent_lock(&dl, dzp, name, &zp, ZNEW)) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0, MAX(1, len));
+ dmu_tx_hold_bonus(tx, dzp->z_id);
+ dmu_tx_hold_zap(tx, dzp->z_id, TRUE, name);
+ if (dzp->z_phys->zp_flags & ZFS_INHERIT_ACE)
+ dmu_tx_hold_write(tx, DMU_NEW_OBJECT, 0, SPA_MAXBLOCKSIZE);
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ zfs_dirent_unlock(dl);
+ if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT) {
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ goto top;
+ }
+ dmu_tx_abort(tx);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ dmu_buf_will_dirty(dzp->z_dbuf, tx);
+
+ /*
+ * Create a new object for the symlink.
+ * Put the link content into bonus buffer if it will fit;
+ * otherwise, store it just like any other file data.
+ */
+ zoid = 0;
+ if (sizeof (znode_phys_t) + len <= dmu_bonus_max()) {
+ zfs_mknode(dzp, vap, &zoid, tx, cr, 0, &zp, len);
+ if (len != 0)
+ bcopy(link, zp->z_phys + 1, len);
+ } else {
+ dmu_buf_t *dbp;
+
+ zfs_mknode(dzp, vap, &zoid, tx, cr, 0, &zp, 0);
+
+ /*
+ * Nothing can access the znode yet so no locking needed
+ * for growing the znode's blocksize.
+ */
+ zfs_grow_blocksize(zp, len, tx);
+
+ VERIFY(0 == dmu_buf_hold(zfsvfs->z_os, zoid, 0, FTAG, &dbp));
+ dmu_buf_will_dirty(dbp, tx);
+
+ ASSERT3U(len, <=, dbp->db_size);
+ bcopy(link, dbp->db_data, len);
+ dmu_buf_rele(dbp, FTAG);
+ }
+ zp->z_phys->zp_size = len;
+
+ /*
+ * Insert the new object into the directory.
+ */
+ (void) zfs_link_create(dl, zp, tx, ZNEW);
+out:
+ if (error == 0) {
+ zfs_log_symlink(zilog, tx, TX_SYMLINK, dzp, zp, name, link);
+ *vpp = ZTOV(zp);
+ vn_lock(*vpp, LK_EXCLUSIVE | LK_RETRY, td);
+ }
+
+ dmu_tx_commit(tx);
+
+ zfs_dirent_unlock(dl);
+
+ ZFS_EXIT(zfsvfs);
+ return (error);
+}
+
+/*
+ * Return, in the buffer contained in the provided uio structure,
+ * the symbolic path referred to by vp.
+ *
+ * IN: vp - vnode of symbolic link.
+ * uoip - structure to contain the link path.
+ * cr - credentials of caller.
+ *
+ * OUT: uio - structure to contain the link path.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * vp - atime updated
+ */
+/* ARGSUSED */
+static int
+zfs_readlink(vnode_t *vp, uio_t *uio, cred_t *cr)
+{
+ znode_t *zp = VTOZ(vp);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ size_t bufsz;
+ int error;
+
+ ZFS_ENTER(zfsvfs);
+
+ bufsz = (size_t)zp->z_phys->zp_size;
+ if (bufsz + sizeof (znode_phys_t) <= zp->z_dbuf->db_size) {
+ error = uiomove(zp->z_phys + 1,
+ MIN((size_t)bufsz, uio->uio_resid), UIO_READ, uio);
+ } else {
+ dmu_buf_t *dbp;
+ error = dmu_buf_hold(zfsvfs->z_os, zp->z_id, 0, FTAG, &dbp);
+ if (error) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+ error = uiomove(dbp->db_data,
+ MIN((size_t)bufsz, uio->uio_resid), UIO_READ, uio);
+ dmu_buf_rele(dbp, FTAG);
+ }
+
+ ZFS_ACCESSTIME_STAMP(zfsvfs, zp);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+}
+
+/*
+ * Insert a new entry into directory tdvp referencing svp.
+ *
+ * IN: tdvp - Directory to contain new entry.
+ * svp - vnode of new entry.
+ * name - name of new entry.
+ * cr - credentials of caller.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ *
+ * Timestamps:
+ * tdvp - ctime|mtime updated
+ * svp - ctime updated
+ */
+/* ARGSUSED */
+static int
+zfs_link(vnode_t *tdvp, vnode_t *svp, char *name, cred_t *cr)
+{
+ znode_t *dzp = VTOZ(tdvp);
+ znode_t *tzp, *szp;
+ zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ zfs_dirlock_t *dl;
+ dmu_tx_t *tx;
+ vnode_t *realvp;
+ int error;
+
+ ASSERT(tdvp->v_type == VDIR);
+
+ ZFS_ENTER(zfsvfs);
+
+ if (VOP_REALVP(svp, &realvp) == 0)
+ svp = realvp;
+
+ if (svp->v_vfsp != tdvp->v_vfsp) {
+ ZFS_EXIT(zfsvfs);
+ return (EXDEV);
+ }
+
+ szp = VTOZ(svp);
+top:
+ /*
+ * We do not support links between attributes and non-attributes
+ * because of the potential security risk of creating links
+ * into "normal" file space in order to circumvent restrictions
+ * imposed in attribute space.
+ */
+ if ((szp->z_phys->zp_flags & ZFS_XATTR) !=
+ (dzp->z_phys->zp_flags & ZFS_XATTR)) {
+ ZFS_EXIT(zfsvfs);
+ return (EINVAL);
+ }
+
+ /*
+ * POSIX dictates that we return EPERM here.
+ * Better choices include ENOTSUP or EISDIR.
+ */
+ if (svp->v_type == VDIR) {
+ ZFS_EXIT(zfsvfs);
+ return (EPERM);
+ }
+
+ if ((uid_t)szp->z_phys->zp_uid != crgetuid(cr) &&
+ secpolicy_basic_link(cr) != 0) {
+ ZFS_EXIT(zfsvfs);
+ return (EPERM);
+ }
+
+ if (error = zfs_zaccess(dzp, ACE_ADD_FILE, cr)) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ /*
+ * Attempt to lock directory; fail if entry already exists.
+ */
+ if (error = zfs_dirent_lock(&dl, dzp, name, &tzp, ZNEW)) {
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_bonus(tx, szp->z_id);
+ dmu_tx_hold_zap(tx, dzp->z_id, TRUE, name);
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ zfs_dirent_unlock(dl);
+ if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT) {
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ goto top;
+ }
+ dmu_tx_abort(tx);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+ }
+
+ error = zfs_link_create(dl, szp, tx, 0);
+
+ if (error == 0)
+ zfs_log_link(zilog, tx, TX_LINK, dzp, szp, name);
+
+ dmu_tx_commit(tx);
+
+ zfs_dirent_unlock(dl);
+
+ ZFS_EXIT(zfsvfs);
+ return (error);
+}
+
+void
+zfs_inactive(vnode_t *vp, cred_t *cr)
+{
+ znode_t *zp = VTOZ(vp);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ int error;
+
+ rw_enter(&zfsvfs->z_um_lock, RW_READER);
+ if (zfsvfs->z_unmounted2) {
+ ASSERT(zp->z_dbuf_held == 0);
+
+ mutex_enter(&zp->z_lock);
+ VI_LOCK(vp);
+ vp->v_count = 0; /* count arrives as 1 */
+ VI_UNLOCK(vp);
+ if (zp->z_dbuf == NULL) {
+ mutex_exit(&zp->z_lock);
+ zfs_znode_free(zp);
+ } else {
+ mutex_exit(&zp->z_lock);
+ }
+ rw_exit(&zfsvfs->z_um_lock);
+ VFS_RELE(zfsvfs->z_vfs);
+ return;
+ }
+
+ if (zp->z_atime_dirty && zp->z_unlinked == 0) {
+ dmu_tx_t *tx = dmu_tx_create(zfsvfs->z_os);
+
+ dmu_tx_hold_bonus(tx, zp->z_id);
+ error = dmu_tx_assign(tx, TXG_WAIT);
+ if (error) {
+ dmu_tx_abort(tx);
+ } else {
+ dmu_buf_will_dirty(zp->z_dbuf, tx);
+ mutex_enter(&zp->z_lock);
+ zp->z_atime_dirty = 0;
+ mutex_exit(&zp->z_lock);
+ dmu_tx_commit(tx);
+ }
+ }
+
+ zfs_zinactive(zp);
+ rw_exit(&zfsvfs->z_um_lock);
+}
+
+CTASSERT(sizeof(struct zfid_short) <= sizeof(struct fid));
+CTASSERT(sizeof(struct zfid_long) <= sizeof(struct fid));
+
+static int
+zfs_fid(vnode_t *vp, fid_t *fidp)
+{
+ znode_t *zp = VTOZ(vp);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ uint32_t gen = (uint32_t)zp->z_phys->zp_gen;
+ uint64_t object = zp->z_id;
+ zfid_short_t *zfid;
+ int size, i;
+
+ ZFS_ENTER(zfsvfs);
+
+ size = (zfsvfs->z_parent != zfsvfs) ? LONG_FID_LEN : SHORT_FID_LEN;
+ fidp->fid_len = size;
+
+ zfid = (zfid_short_t *)fidp;
+
+ zfid->zf_len = size;
+
+ for (i = 0; i < sizeof (zfid->zf_object); i++)
+ zfid->zf_object[i] = (uint8_t)(object >> (8 * i));
+
+ /* Must have a non-zero generation number to distinguish from .zfs */
+ if (gen == 0)
+ gen = 1;
+ for (i = 0; i < sizeof (zfid->zf_gen); i++)
+ zfid->zf_gen[i] = (uint8_t)(gen >> (8 * i));
+
+ if (size == LONG_FID_LEN) {
+ uint64_t objsetid = dmu_objset_id(zfsvfs->z_os);
+ zfid_long_t *zlfid;
+
+ zlfid = (zfid_long_t *)fidp;
+
+ for (i = 0; i < sizeof (zlfid->zf_setid); i++)
+ zlfid->zf_setid[i] = (uint8_t)(objsetid >> (8 * i));
+
+ /* XXX - this should be the generation number for the objset */
+ for (i = 0; i < sizeof (zlfid->zf_setgen); i++)
+ zlfid->zf_setgen[i] = 0;
+ }
+
+ ZFS_EXIT(zfsvfs);
+ return (0);
+}
+
+static int
+zfs_pathconf(vnode_t *vp, int cmd, ulong_t *valp, cred_t *cr)
+{
+ znode_t *zp, *xzp;
+ zfsvfs_t *zfsvfs;
+ zfs_dirlock_t *dl;
+ int error;
+
+ switch (cmd) {
+ case _PC_LINK_MAX:
+ *valp = INT_MAX;
+ return (0);
+
+ case _PC_FILESIZEBITS:
+ *valp = 64;
+ return (0);
+
+#if 0
+ case _PC_XATTR_EXISTS:
+ zp = VTOZ(vp);
+ zfsvfs = zp->z_zfsvfs;
+ ZFS_ENTER(zfsvfs);
+ *valp = 0;
+ error = zfs_dirent_lock(&dl, zp, "", &xzp,
+ ZXATTR | ZEXISTS | ZSHARED);
+ if (error == 0) {
+ zfs_dirent_unlock(dl);
+ if (!zfs_dirempty(xzp))
+ *valp = 1;
+ VN_RELE(ZTOV(xzp));
+ } else if (error == ENOENT) {
+ /*
+ * If there aren't extended attributes, it's the
+ * same as having zero of them.
+ */
+ error = 0;
+ }
+ ZFS_EXIT(zfsvfs);
+ return (error);
+#endif
+
+ case _PC_ACL_EXTENDED:
+ *valp = 0; /* TODO */
+ return (0);
+
+ case _PC_MIN_HOLE_SIZE:
+ *valp = (int)SPA_MINBLOCKSIZE;
+ return (0);
+
+ default:
+ return (EOPNOTSUPP);
+ }
+}
+
+#ifdef TODO
+/*ARGSUSED*/
+static int
+zfs_getsecattr(vnode_t *vp, vsecattr_t *vsecp, int flag, cred_t *cr)
+{
+ znode_t *zp = VTOZ(vp);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ int error;
+
+ ZFS_ENTER(zfsvfs);
+ error = zfs_getacl(zp, vsecp, cr);
+ ZFS_EXIT(zfsvfs);
+
+ return (error);
+}
+#endif /* TODO */
+
+#ifdef TODO
+/*ARGSUSED*/
+static int
+zfs_setsecattr(vnode_t *vp, vsecattr_t *vsecp, int flag, cred_t *cr)
+{
+ znode_t *zp = VTOZ(vp);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ int error;
+
+ ZFS_ENTER(zfsvfs);
+ error = zfs_setacl(zp, vsecp, cr);
+ ZFS_EXIT(zfsvfs);
+ return (error);
+}
+#endif /* TODO */
+
+static int
+zfs_freebsd_open(ap)
+ struct vop_open_args /* {
+ struct vnode *a_vp;
+ int a_mode;
+ struct ucred *a_cred;
+ struct thread *a_td;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+ znode_t *zp = VTOZ(vp);
+ int error;
+
+ error = zfs_open(&vp, ap->a_mode, ap->a_cred);
+ if (error == 0)
+ vnode_create_vobject(vp, zp->z_phys->zp_size, ap->a_td);
+ return (error);
+}
+
+static int
+zfs_freebsd_close(ap)
+ struct vop_close_args /* {
+ struct vnode *a_vp;
+ int a_fflag;
+ struct ucred *a_cred;
+ struct thread *a_td;
+ } */ *ap;
+{
+
+ return (zfs_close(ap->a_vp, ap->a_fflag, 0, 0, ap->a_cred));
+}
+
+static int
+zfs_freebsd_ioctl(ap)
+ struct vop_ioctl_args /* {
+ struct vnode *a_vp;
+ u_long a_command;
+ caddr_t a_data;
+ int a_fflag;
+ struct ucred *cred;
+ struct thread *td;
+ } */ *ap;
+{
+
+ return (zfs_ioctl(ap->a_vp, ap->a_command, (intptr_t)ap->a_data,
+ ap->a_fflag, ap->a_cred, NULL));
+}
+
+static int
+zfs_freebsd_read(ap)
+ struct vop_read_args /* {
+ struct vnode *a_vp;
+ struct uio *a_uio;
+ int a_ioflag;
+ struct ucred *a_cred;
+ } */ *ap;
+{
+
+ return (zfs_read(ap->a_vp, ap->a_uio, ap->a_ioflag, ap->a_cred, NULL));
+}
+
+static int
+zfs_freebsd_write(ap)
+ struct vop_write_args /* {
+ struct vnode *a_vp;
+ struct uio *a_uio;
+ int a_ioflag;
+ struct ucred *a_cred;
+ } */ *ap;
+{
+
+ return (zfs_write(ap->a_vp, ap->a_uio, ap->a_ioflag, ap->a_cred, NULL));
+}
+
+static int
+zfs_freebsd_access(ap)
+ struct vop_access_args /* {
+ struct vnode *a_vp;
+ int a_mode;
+ struct ucred *a_cred;
+ struct thread *a_td;
+ } */ *ap;
+{
+
+ return (zfs_access(ap->a_vp, ap->a_mode, 0, ap->a_cred));
+}
+
+static int
+zfs_freebsd_lookup(ap)
+ struct vop_lookup_args /* {
+ struct vnode *a_dvp;
+ struct vnode **a_vpp;
+ struct componentname *a_cnp;
+ } */ *ap;
+{
+ struct componentname *cnp = ap->a_cnp;
+ char nm[NAME_MAX + 1];
+
+ ASSERT(cnp->cn_namelen < sizeof(nm));
+ strlcpy(nm, cnp->cn_nameptr, MIN(cnp->cn_namelen + 1, sizeof(nm)));
+
+ return (zfs_lookup(ap->a_dvp, nm, ap->a_vpp, cnp, cnp->cn_nameiop,
+ cnp->cn_cred, cnp->cn_thread));
+}
+
+static int
+zfs_freebsd_create(ap)
+ struct vop_create_args /* {
+ struct vnode *a_dvp;
+ struct vnode **a_vpp;
+ struct componentname *a_cnp;
+ struct vattr *a_vap;
+ } */ *ap;
+{
+ struct componentname *cnp = ap->a_cnp;
+ vattr_t *vap = ap->a_vap;
+ int mode;
+
+ ASSERT(cnp->cn_flags & SAVENAME);
+
+ vattr_init_mask(vap);
+ mode = vap->va_mode & ALLPERMS;
+
+ return (zfs_create(ap->a_dvp, cnp->cn_nameptr, vap, !EXCL, mode,
+ ap->a_vpp, cnp->cn_cred, cnp->cn_thread));
+}
+
+static int
+zfs_freebsd_remove(ap)
+ struct vop_remove_args /* {
+ struct vnode *a_dvp;
+ struct vnode *a_vp;
+ struct componentname *a_cnp;
+ } */ *ap;
+{
+
+ ASSERT(ap->a_cnp->cn_flags & SAVENAME);
+
+ return (zfs_remove(ap->a_dvp, ap->a_cnp->cn_nameptr,
+ ap->a_cnp->cn_cred));
+}
+
+static int
+zfs_freebsd_mkdir(ap)
+ struct vop_mkdir_args /* {
+ struct vnode *a_dvp;
+ struct vnode **a_vpp;
+ struct componentname *a_cnp;
+ struct vattr *a_vap;
+ } */ *ap;
+{
+ vattr_t *vap = ap->a_vap;
+
+ ASSERT(ap->a_cnp->cn_flags & SAVENAME);
+
+ vattr_init_mask(vap);
+
+ return (zfs_mkdir(ap->a_dvp, ap->a_cnp->cn_nameptr, vap, ap->a_vpp,
+ ap->a_cnp->cn_cred));
+}
+
+static int
+zfs_freebsd_rmdir(ap)
+ struct vop_rmdir_args /* {
+ struct vnode *a_dvp;
+ struct vnode *a_vp;
+ struct componentname *a_cnp;
+ } */ *ap;
+{
+ struct componentname *cnp = ap->a_cnp;
+
+ ASSERT(cnp->cn_flags & SAVENAME);
+
+ return (zfs_rmdir(ap->a_dvp, cnp->cn_nameptr, NULL, cnp->cn_cred));
+}
+
+static int
+zfs_freebsd_readdir(ap)
+ struct vop_readdir_args /* {
+ struct vnode *a_vp;
+ struct uio *a_uio;
+ struct ucred *a_cred;
+ int *a_eofflag;
+ int *a_ncookies;
+ u_long **a_cookies;
+ } */ *ap;
+{
+
+ return (zfs_readdir(ap->a_vp, ap->a_uio, ap->a_cred, ap->a_eofflag,
+ ap->a_ncookies, ap->a_cookies));
+}
+
+static int
+zfs_freebsd_fsync(ap)
+ struct vop_fsync_args /* {
+ struct vnode *a_vp;
+ int a_waitfor;
+ struct thread *a_td;
+ } */ *ap;
+{
+
+ vop_stdfsync(ap);
+ return (zfs_fsync(ap->a_vp, 0, ap->a_td->td_ucred));
+}
+
+static int
+zfs_freebsd_getattr(ap)
+ struct vop_getattr_args /* {
+ struct vnode *a_vp;
+ struct vattr *a_vap;
+ struct ucred *a_cred;
+ struct thread *a_td;
+ } */ *ap;
+{
+
+ return (zfs_getattr(ap->a_vp, ap->a_vap, 0, ap->a_cred));
+}
+
+static int
+zfs_freebsd_setattr(ap)
+ struct vop_setattr_args /* {
+ struct vnode *a_vp;
+ struct vattr *a_vap;
+ struct ucred *a_cred;
+ struct thread *a_td;
+ } */ *ap;
+{
+ vattr_t *vap = ap->a_vap;
+
+ /* No support for FreeBSD's chflags(2). */
+ if (vap->va_flags != VNOVAL)
+ return (EOPNOTSUPP);
+
+ vattr_init_mask(vap);
+ vap->va_mask &= ~AT_NOSET;
+
+ return (zfs_setattr(ap->a_vp, vap, 0, ap->a_cred, NULL));
+}
+
+static int
+zfs_freebsd_rename(ap)
+ struct vop_rename_args /* {
+ struct vnode *a_fdvp;
+ struct vnode *a_fvp;
+ struct componentname *a_fcnp;
+ struct vnode *a_tdvp;
+ struct vnode *a_tvp;
+ struct componentname *a_tcnp;
+ } */ *ap;
+{
+ vnode_t *fdvp = ap->a_fdvp;
+ vnode_t *fvp = ap->a_fvp;
+ vnode_t *tdvp = ap->a_tdvp;
+ vnode_t *tvp = ap->a_tvp;
+ int error;
+
+ ASSERT(ap->a_fcnp->cn_flags & SAVENAME);
+ ASSERT(ap->a_tcnp->cn_flags & SAVENAME);
+
+ error = zfs_rename(fdvp, ap->a_fcnp->cn_nameptr, tdvp,
+ ap->a_tcnp->cn_nameptr, ap->a_fcnp->cn_cred);
+
+ if (tdvp == tvp)
+ VN_RELE(tdvp);
+ else
+ VN_URELE(tdvp);
+ if (tvp)
+ VN_URELE(tvp);
+ VN_RELE(fdvp);
+ VN_RELE(fvp);
+
+ return (error);
+}
+
+static int
+zfs_freebsd_symlink(ap)
+ struct vop_symlink_args /* {
+ struct vnode *a_dvp;
+ struct vnode **a_vpp;
+ struct componentname *a_cnp;
+ struct vattr *a_vap;
+ char *a_target;
+ } */ *ap;
+{
+ struct componentname *cnp = ap->a_cnp;
+ vattr_t *vap = ap->a_vap;
+
+ ASSERT(cnp->cn_flags & SAVENAME);
+
+ vap->va_type = VLNK; /* FreeBSD: Syscall only sets va_mode. */
+ vattr_init_mask(vap);
+
+ return (zfs_symlink(ap->a_dvp, ap->a_vpp, cnp->cn_nameptr, vap,
+ ap->a_target, cnp->cn_cred, cnp->cn_thread));
+}
+
+static int
+zfs_freebsd_readlink(ap)
+ struct vop_readlink_args /* {
+ struct vnode *a_vp;
+ struct uio *a_uio;
+ struct ucred *a_cred;
+ } */ *ap;
+{
+
+ return (zfs_readlink(ap->a_vp, ap->a_uio, ap->a_cred));
+}
+
+static int
+zfs_freebsd_link(ap)
+ struct vop_link_args /* {
+ struct vnode *a_tdvp;
+ struct vnode *a_vp;
+ struct componentname *a_cnp;
+ } */ *ap;
+{
+ struct componentname *cnp = ap->a_cnp;
+
+ ASSERT(cnp->cn_flags & SAVENAME);
+
+ return (zfs_link(ap->a_tdvp, ap->a_vp, cnp->cn_nameptr, cnp->cn_cred));
+}
+
+static int
+zfs_freebsd_inactive(ap)
+ struct vop_inactive_args /* {
+ struct vnode *a_vp;
+ struct thread *a_td;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+
+ zfs_inactive(vp, ap->a_td->td_ucred);
+ return (0);
+}
+
+static int
+zfs_freebsd_reclaim(ap)
+ struct vop_reclaim_args /* {
+ struct vnode *a_vp;
+ struct thread *a_td;
+ } */ *ap;
+{
+ vnode_t *vp = ap->a_vp;
+ znode_t *zp = VTOZ(vp);
+ zfsvfs_t *zfsvfs;
+ int rele = 1;
+
+ ASSERT(zp != NULL);
+
+ /*
+ * Destroy the vm object and flush associated pages.
+ */
+ vnode_destroy_vobject(vp);
+
+ mutex_enter(&zp->z_lock);
+ ASSERT(zp->z_phys);
+ ASSERT(zp->z_dbuf_held);
+ zfsvfs = zp->z_zfsvfs;
+ if (!zp->z_unlinked) {
+ zp->z_dbuf_held = 0;
+ ZTOV(zp) = NULL;
+ mutex_exit(&zp->z_lock);
+ dmu_buf_rele(zp->z_dbuf, NULL);
+ } else {
+ mutex_exit(&zp->z_lock);
+ }
+ VI_LOCK(vp);
+ if (vp->v_count > 0)
+ rele = 0;
+ vp->v_data = NULL;
+ ASSERT(vp->v_holdcnt > 1);
+ vdropl(vp);
+ if (!zp->z_unlinked && rele)
+ VFS_RELE(zfsvfs->z_vfs);
+ return (0);
+}
+
+static int
+zfs_freebsd_fid(ap)
+ struct vop_fid_args /* {
+ struct vnode *a_vp;
+ struct fid *a_fid;
+ } */ *ap;
+{
+
+ return (zfs_fid(ap->a_vp, (void *)ap->a_fid));
+}
+
+static int
+zfs_freebsd_pathconf(ap)
+ struct vop_pathconf_args /* {
+ struct vnode *a_vp;
+ int a_name;
+ register_t *a_retval;
+ } */ *ap;
+{
+ ulong_t val;
+ int error;
+
+ error = zfs_pathconf(ap->a_vp, ap->a_name, &val, curthread->td_ucred);
+ if (error == 0)
+ *ap->a_retval = val;
+ else if (error == EOPNOTSUPP)
+ error = vop_stdpathconf(ap);
+ return (error);
+}
+
+/*
+ * Advisory record locking support
+ */
+static int
+zfs_freebsd_advlock(ap)
+ struct vop_advlock_args /* {
+ struct vnode *a_vp;
+ caddr_t a_id;
+ int a_op;
+ struct flock *a_fl;
+ int a_flags;
+ } */ *ap;
+{
+ znode_t *zp = VTOZ(ap->a_vp);
+
+ return (lf_advlock(ap, &(zp->z_lockf), zp->z_phys->zp_size));
+}
+
+struct vop_vector zfs_vnodeops;
+struct vop_vector zfs_fifoops;
+
+struct vop_vector zfs_vnodeops = {
+ .vop_default = &default_vnodeops,
+ .vop_inactive = zfs_freebsd_inactive,
+ .vop_reclaim = zfs_freebsd_reclaim,
+ .vop_access = zfs_freebsd_access,
+#ifdef FREEBSD_NAMECACHE
+ .vop_lookup = vfs_cache_lookup,
+ .vop_cachedlookup = zfs_freebsd_lookup,
+#else
+ .vop_lookup = zfs_freebsd_lookup,
+#endif
+ .vop_getattr = zfs_freebsd_getattr,
+ .vop_setattr = zfs_freebsd_setattr,
+ .vop_create = zfs_freebsd_create,
+ .vop_mknod = zfs_freebsd_create,
+ .vop_mkdir = zfs_freebsd_mkdir,
+ .vop_readdir = zfs_freebsd_readdir,
+ .vop_fsync = zfs_freebsd_fsync,
+ .vop_open = zfs_freebsd_open,
+ .vop_close = zfs_freebsd_close,
+ .vop_rmdir = zfs_freebsd_rmdir,
+ .vop_ioctl = zfs_freebsd_ioctl,
+ .vop_link = zfs_freebsd_link,
+ .vop_symlink = zfs_freebsd_symlink,
+ .vop_readlink = zfs_freebsd_readlink,
+ .vop_read = zfs_freebsd_read,
+ .vop_write = zfs_freebsd_write,
+ .vop_remove = zfs_freebsd_remove,
+ .vop_rename = zfs_freebsd_rename,
+ .vop_advlock = zfs_freebsd_advlock,
+ .vop_pathconf = zfs_freebsd_pathconf,
+ .vop_bmap = VOP_EOPNOTSUPP,
+ .vop_fid = zfs_freebsd_fid,
+};
+
+struct vop_vector zfs_fifoops = {
+ .vop_default = &fifo_specops,
+ .vop_fsync = VOP_PANIC,
+ .vop_access = zfs_freebsd_access,
+ .vop_getattr = zfs_freebsd_getattr,
+ .vop_inactive = zfs_freebsd_inactive,
+ .vop_read = VOP_PANIC,
+ .vop_reclaim = zfs_freebsd_reclaim,
+ .vop_setattr = zfs_freebsd_setattr,
+ .vop_write = VOP_PANIC,
+ .vop_fid = zfs_freebsd_fid,
+};
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
new file mode 100644
index 0000000..635c2c9
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zfs_znode.c
@@ -0,0 +1,1070 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Portions Copyright 2007 Jeremy Teo */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef _KERNEL
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/time.h>
+#include <sys/systm.h>
+#include <sys/sysmacros.h>
+#include <sys/resource.h>
+#include <sys/mntent.h>
+#include <sys/vfs.h>
+#include <sys/vnode.h>
+#include <sys/file.h>
+#include <sys/kmem.h>
+#include <sys/cmn_err.h>
+#include <sys/errno.h>
+#include <sys/unistd.h>
+#include <sys/atomic.h>
+#include <sys/zfs_dir.h>
+#include <sys/zfs_acl.h>
+#include <sys/zfs_ioctl.h>
+#include <sys/zfs_rlock.h>
+#include <sys/fs/zfs.h>
+#endif /* _KERNEL */
+
+#include <sys/dmu.h>
+#include <sys/refcount.h>
+#include <sys/stat.h>
+#include <sys/zap.h>
+#include <sys/zfs_znode.h>
+#include <sys/refcount.h>
+
+/*
+ * Functions needed for userland (ie: libzpool) are not put under
+ * #ifdef_KERNEL; the rest of the functions have dependencies
+ * (such as VFS logic) that will not compile easily in userland.
+ */
+#ifdef _KERNEL
+struct kmem_cache *znode_cache = NULL;
+
+/*ARGSUSED*/
+static void
+znode_pageout_func(dmu_buf_t *dbuf, void *user_ptr)
+{
+ znode_t *zp = user_ptr;
+ vnode_t *vp;
+
+ mutex_enter(&zp->z_lock);
+ vp = ZTOV(zp);
+ if (vp == NULL) {
+ mutex_exit(&zp->z_lock);
+ zfs_znode_free(zp);
+ } else if (vp->v_count == 0) {
+ ZTOV(zp) = NULL;
+ vhold(vp);
+ mutex_exit(&zp->z_lock);
+ vn_lock(vp, LK_EXCLUSIVE | LK_RETRY, curthread);
+ vrecycle(vp, curthread);
+ VOP_UNLOCK(vp, 0, curthread);
+ vdrop(vp);
+ zfs_znode_free(zp);
+ } else {
+ /* signal force unmount that this znode can be freed */
+ zp->z_dbuf = NULL;
+ mutex_exit(&zp->z_lock);
+ }
+}
+
+extern struct vop_vector zfs_vnodeops;
+extern struct vop_vector zfs_fifoops;
+
+/*
+ * XXX: We cannot use this function as a cache constructor, because
+ * there is one global cache for all file systems and we need
+ * to pass vfsp here, which is not possible, because argument
+ * 'cdrarg' is defined at kmem_cache_create() time.
+ */
+static int
+zfs_znode_cache_constructor(void *buf, void *cdrarg, int kmflags)
+{
+ znode_t *zp = buf;
+ vnode_t *vp;
+ vfs_t *vfsp = cdrarg;
+ int error;
+
+ if (cdrarg != NULL) {
+ error = getnewvnode("zfs", vfsp, &zfs_vnodeops, &vp);
+ ASSERT(error == 0);
+ zp->z_vnode = vp;
+ vp->v_data = (caddr_t)zp;
+ vhold(vp);
+ vp->v_vnlock->lk_flags |= LK_CANRECURSE;
+ vp->v_vnlock->lk_flags &= ~LK_NOSHARE;
+ } else {
+ zp->z_vnode = NULL;
+ }
+ mutex_init(&zp->z_lock, NULL, MUTEX_DEFAULT, NULL);
+ rw_init(&zp->z_map_lock, NULL, RW_DEFAULT, NULL);
+ rw_init(&zp->z_parent_lock, NULL, RW_DEFAULT, NULL);
+ rw_init(&zp->z_name_lock, NULL, RW_DEFAULT, NULL);
+ mutex_init(&zp->z_acl_lock, NULL, MUTEX_DEFAULT, NULL);
+
+ mutex_init(&zp->z_range_lock, NULL, MUTEX_DEFAULT, NULL);
+ avl_create(&zp->z_range_avl, zfs_range_compare,
+ sizeof (rl_t), offsetof(rl_t, r_node));
+
+ zp->z_dbuf_held = 0;
+ zp->z_dirlocks = 0;
+ zp->z_lockf = NULL;
+ return (0);
+}
+
+/*ARGSUSED*/
+static void
+zfs_znode_cache_destructor(void *buf, void *cdarg)
+{
+ znode_t *zp = buf;
+
+ ASSERT(zp->z_dirlocks == 0);
+ mutex_destroy(&zp->z_lock);
+ rw_destroy(&zp->z_map_lock);
+ rw_destroy(&zp->z_parent_lock);
+ rw_destroy(&zp->z_name_lock);
+ mutex_destroy(&zp->z_acl_lock);
+ mutex_destroy(&zp->z_range_lock);
+ avl_destroy(&zp->z_range_avl);
+
+ ASSERT(zp->z_dbuf_held == 0);
+}
+
+void
+zfs_znode_init(void)
+{
+ /*
+ * Initialize zcache
+ */
+ ASSERT(znode_cache == NULL);
+ znode_cache = kmem_cache_create("zfs_znode_cache",
+ sizeof (znode_t), 0, /* zfs_znode_cache_constructor */ NULL,
+ zfs_znode_cache_destructor, NULL, NULL, NULL, 0);
+}
+
+void
+zfs_znode_fini(void)
+{
+ /*
+ * Cleanup zcache
+ */
+ if (znode_cache)
+ kmem_cache_destroy(znode_cache);
+ znode_cache = NULL;
+}
+
+/*
+ * zfs_init_fs - Initialize the zfsvfs struct and the file system
+ * incore "master" object. Verify version compatibility.
+ */
+int
+zfs_init_fs(zfsvfs_t *zfsvfs, znode_t **zpp, cred_t *cr)
+{
+ objset_t *os = zfsvfs->z_os;
+ uint64_t version = ZPL_VERSION;
+ int i, error;
+ dmu_object_info_t doi;
+ uint64_t fsid_guid;
+
+ *zpp = NULL;
+
+ /*
+ * XXX - hack to auto-create the pool root filesystem at
+ * the first attempted mount.
+ */
+ if (dmu_object_info(os, MASTER_NODE_OBJ, &doi) == ENOENT) {
+ dmu_tx_t *tx = dmu_tx_create(os);
+
+ dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, TRUE, NULL); /* master */
+ dmu_tx_hold_zap(tx, DMU_NEW_OBJECT, TRUE, NULL); /* del queue */
+ dmu_tx_hold_bonus(tx, DMU_NEW_OBJECT); /* root node */
+ error = dmu_tx_assign(tx, TXG_WAIT);
+ ASSERT3U(error, ==, 0);
+ zfs_create_fs(os, cr, tx);
+ dmu_tx_commit(tx);
+ }
+
+ error = zap_lookup(os, MASTER_NODE_OBJ, ZPL_VERSION_OBJ, 8, 1,
+ &version);
+ if (error) {
+ return (error);
+ } else if (version != ZPL_VERSION) {
+ (void) printf("Mismatched versions: File system "
+ "is version %lld on-disk format, which is "
+ "incompatible with this software version %lld!",
+ (u_longlong_t)version, ZPL_VERSION);
+ return (ENOTSUP);
+ }
+
+ /*
+ * The fsid is 64 bits, composed of an 8-bit fs type, which
+ * separates our fsid from any other filesystem types, and a
+ * 56-bit objset unique ID. The objset unique ID is unique to
+ * all objsets open on this system, provided by unique_create().
+ * The 8-bit fs type must be put in the low bits of fsid[1]
+ * because that's where other Solaris filesystems put it.
+ */
+ fsid_guid = dmu_objset_fsid_guid(os);
+ ASSERT((fsid_guid & ~((1ULL<<56)-1)) == 0);
+ zfsvfs->z_vfs->vfs_fsid.val[0] = fsid_guid;
+ zfsvfs->z_vfs->vfs_fsid.val[1] = ((fsid_guid>>32) << 8) |
+ zfsvfs->z_vfs->mnt_vfc->vfc_typenum & 0xFF;
+
+ error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_ROOT_OBJ, 8, 1,
+ &zfsvfs->z_root);
+ if (error)
+ return (error);
+ ASSERT(zfsvfs->z_root != 0);
+
+ /*
+ * Create the per mount vop tables.
+ */
+
+ /*
+ * Initialize zget mutex's
+ */
+ for (i = 0; i != ZFS_OBJ_MTX_SZ; i++)
+ mutex_init(&zfsvfs->z_hold_mtx[i], NULL, MUTEX_DEFAULT, NULL);
+
+ error = zfs_zget(zfsvfs, zfsvfs->z_root, zpp);
+ if (error)
+ return (error);
+ ASSERT3U((*zpp)->z_id, ==, zfsvfs->z_root);
+
+ error = zap_lookup(os, MASTER_NODE_OBJ, ZFS_UNLINKED_SET, 8, 1,
+ &zfsvfs->z_unlinkedobj);
+ if (error)
+ return (error);
+
+ return (0);
+}
+
+/*
+ * define a couple of values we need available
+ * for both 64 and 32 bit environments.
+ */
+#ifndef NBITSMINOR64
+#define NBITSMINOR64 32
+#endif
+#ifndef MAXMAJ64
+#define MAXMAJ64 0xffffffffUL
+#endif
+#ifndef MAXMIN64
+#define MAXMIN64 0xffffffffUL
+#endif
+#ifndef major
+#define major(x) ((int)(((u_int)(x) >> 8)&0xff)) /* major number */
+#endif
+#ifndef minor
+#define minor(x) ((int)((x)&0xffff00ff)) /* minor number */
+#endif
+
+/*
+ * Create special expldev for ZFS private use.
+ * Can't use standard expldev since it doesn't do
+ * what we want. The standard expldev() takes a
+ * dev32_t in LP64 and expands it to a long dev_t.
+ * We need an interface that takes a dev32_t in ILP32
+ * and expands it to a long dev_t.
+ */
+static uint64_t
+zfs_expldev(dev_t dev)
+{
+ return (((uint64_t)major(dev) << NBITSMINOR64) | minor(dev));
+}
+/*
+ * Special cmpldev for ZFS private use.
+ * Can't use standard cmpldev since it takes
+ * a long dev_t and compresses it to dev32_t in
+ * LP64. We need to do a compaction of a long dev_t
+ * to a dev32_t in ILP32.
+ */
+dev_t
+zfs_cmpldev(uint64_t dev)
+{
+ return (makedev((dev >> NBITSMINOR64), (dev & MAXMIN64)));
+}
+
+/*
+ * Construct a new znode/vnode and intialize.
+ *
+ * This does not do a call to dmu_set_user() that is
+ * up to the caller to do, in case you don't want to
+ * return the znode
+ */
+static znode_t *
+zfs_znode_alloc(zfsvfs_t *zfsvfs, dmu_buf_t *db, uint64_t obj_num, int blksz)
+{
+ znode_t *zp;
+ vnode_t *vp;
+ int error;
+
+ zp = kmem_cache_alloc(znode_cache, KM_SLEEP);
+ zfs_znode_cache_constructor(zp, zfsvfs->z_vfs, 0);
+
+ ASSERT(zp->z_dirlocks == NULL);
+
+ zp->z_phys = db->db_data;
+ zp->z_zfsvfs = zfsvfs;
+ zp->z_unlinked = 0;
+ zp->z_atime_dirty = 0;
+ zp->z_dbuf_held = 0;
+ zp->z_mapcnt = 0;
+ zp->z_last_itx = 0;
+ zp->z_dbuf = db;
+ zp->z_id = obj_num;
+ zp->z_blksz = blksz;
+ zp->z_seq = 0x7A4653;
+ zp->z_sync_cnt = 0;
+
+ mutex_enter(&zfsvfs->z_znodes_lock);
+ list_insert_tail(&zfsvfs->z_all_znodes, zp);
+ mutex_exit(&zfsvfs->z_znodes_lock);
+
+ vp = ZTOV(zp);
+ if (vp == NULL)
+ return (zp);
+
+ error = insmntque(vp, zfsvfs->z_vfs);
+ KASSERT(error == 0, ("insmntque() failed: error %d", error));
+
+ vp->v_type = IFTOVT((mode_t)zp->z_phys->zp_mode);
+ switch (vp->v_type) {
+ case VDIR:
+ zp->z_zn_prefetch = B_TRUE; /* z_prefetch default is enabled */
+ break;
+ case VFIFO:
+ vp->v_op = &zfs_fifoops;
+ break;
+ }
+
+ return (zp);
+}
+
+static void
+zfs_znode_dmu_init(znode_t *zp)
+{
+ znode_t *nzp;
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ dmu_buf_t *db = zp->z_dbuf;
+
+ mutex_enter(&zp->z_lock);
+
+ nzp = dmu_buf_set_user_ie(db, zp, &zp->z_phys, znode_pageout_func);
+
+ /*
+ * there should be no
+ * concurrent zgets on this object.
+ */
+ ASSERT3P(nzp, ==, NULL);
+
+ /*
+ * Slap on VROOT if we are the root znode
+ */
+ if (zp->z_id == zfsvfs->z_root) {
+ ZTOV(zp)->v_flag |= VROOT;
+ }
+
+ ASSERT(zp->z_dbuf_held == 0);
+ zp->z_dbuf_held = 1;
+ VFS_HOLD(zfsvfs->z_vfs);
+ mutex_exit(&zp->z_lock);
+}
+
+/*
+ * Create a new DMU object to hold a zfs znode.
+ *
+ * IN: dzp - parent directory for new znode
+ * vap - file attributes for new znode
+ * tx - dmu transaction id for zap operations
+ * cr - credentials of caller
+ * flag - flags:
+ * IS_ROOT_NODE - new object will be root
+ * IS_XATTR - new object is an attribute
+ * IS_REPLAY - intent log replay
+ *
+ * OUT: oid - ID of created object
+ *
+ */
+void
+zfs_mknode(znode_t *dzp, vattr_t *vap, uint64_t *oid, dmu_tx_t *tx, cred_t *cr,
+ uint_t flag, znode_t **zpp, int bonuslen)
+{
+ dmu_buf_t *dbp;
+ znode_phys_t *pzp;
+ znode_t *zp;
+ zfsvfs_t *zfsvfs = dzp->z_zfsvfs;
+ timestruc_t now;
+ uint64_t gen;
+ int err;
+
+ ASSERT(vap && (vap->va_mask & (AT_TYPE|AT_MODE)) == (AT_TYPE|AT_MODE));
+
+ if (zfsvfs->z_assign >= TXG_INITIAL) { /* ZIL replay */
+ *oid = vap->va_nodeid;
+ flag |= IS_REPLAY;
+ now = vap->va_ctime; /* see zfs_replay_create() */
+ gen = vap->va_nblocks; /* ditto */
+ } else {
+ *oid = 0;
+ gethrestime(&now);
+ gen = dmu_tx_get_txg(tx);
+ }
+
+ /*
+ * Create a new DMU object.
+ */
+ /*
+ * There's currently no mechanism for pre-reading the blocks that will
+ * be to needed allocate a new object, so we accept the small chance
+ * that there will be an i/o error and we will fail one of the
+ * assertions below.
+ */
+ if (vap->va_type == VDIR) {
+ if (flag & IS_REPLAY) {
+ err = zap_create_claim(zfsvfs->z_os, *oid,
+ DMU_OT_DIRECTORY_CONTENTS,
+ DMU_OT_ZNODE, sizeof (znode_phys_t) + bonuslen, tx);
+ ASSERT3U(err, ==, 0);
+ } else {
+ *oid = zap_create(zfsvfs->z_os,
+ DMU_OT_DIRECTORY_CONTENTS,
+ DMU_OT_ZNODE, sizeof (znode_phys_t) + bonuslen, tx);
+ }
+ } else {
+ if (flag & IS_REPLAY) {
+ err = dmu_object_claim(zfsvfs->z_os, *oid,
+ DMU_OT_PLAIN_FILE_CONTENTS, 0,
+ DMU_OT_ZNODE, sizeof (znode_phys_t) + bonuslen, tx);
+ ASSERT3U(err, ==, 0);
+ } else {
+ *oid = dmu_object_alloc(zfsvfs->z_os,
+ DMU_OT_PLAIN_FILE_CONTENTS, 0,
+ DMU_OT_ZNODE, sizeof (znode_phys_t) + bonuslen, tx);
+ }
+ }
+ VERIFY(0 == dmu_bonus_hold(zfsvfs->z_os, *oid, NULL, &dbp));
+ dmu_buf_will_dirty(dbp, tx);
+
+ /*
+ * Initialize the znode physical data to zero.
+ */
+ ASSERT(dbp->db_size >= sizeof (znode_phys_t));
+ bzero(dbp->db_data, dbp->db_size);
+ pzp = dbp->db_data;
+
+ /*
+ * If this is the root, fix up the half-initialized parent pointer
+ * to reference the just-allocated physical data area.
+ */
+ if (flag & IS_ROOT_NODE) {
+ dzp->z_phys = pzp;
+ dzp->z_id = *oid;
+ }
+
+ /*
+ * If parent is an xattr, so am I.
+ */
+ if (dzp->z_phys->zp_flags & ZFS_XATTR)
+ flag |= IS_XATTR;
+
+ if (vap->va_type == VBLK || vap->va_type == VCHR) {
+ pzp->zp_rdev = zfs_expldev(vap->va_rdev);
+ }
+
+ if (vap->va_type == VDIR) {
+ pzp->zp_size = 2; /* contents ("." and "..") */
+ pzp->zp_links = (flag & (IS_ROOT_NODE | IS_XATTR)) ? 2 : 1;
+ }
+
+ pzp->zp_parent = dzp->z_id;
+ if (flag & IS_XATTR)
+ pzp->zp_flags |= ZFS_XATTR;
+
+ pzp->zp_gen = gen;
+
+ ZFS_TIME_ENCODE(&now, pzp->zp_crtime);
+ ZFS_TIME_ENCODE(&now, pzp->zp_ctime);
+
+ if (vap->va_mask & AT_ATIME) {
+ ZFS_TIME_ENCODE(&vap->va_atime, pzp->zp_atime);
+ } else {
+ ZFS_TIME_ENCODE(&now, pzp->zp_atime);
+ }
+
+ if (vap->va_mask & AT_MTIME) {
+ ZFS_TIME_ENCODE(&vap->va_mtime, pzp->zp_mtime);
+ } else {
+ ZFS_TIME_ENCODE(&now, pzp->zp_mtime);
+ }
+
+ pzp->zp_mode = MAKEIMODE(vap->va_type, vap->va_mode);
+ zp = zfs_znode_alloc(zfsvfs, dbp, *oid, 0);
+
+ zfs_perm_init(zp, dzp, flag, vap, tx, cr);
+
+ if (zpp) {
+ kmutex_t *hash_mtx = ZFS_OBJ_MUTEX(zp);
+
+ mutex_enter(hash_mtx);
+ zfs_znode_dmu_init(zp);
+ mutex_exit(hash_mtx);
+
+ *zpp = zp;
+ } else {
+ if (ZTOV(zp) != NULL)
+ ZTOV(zp)->v_count = 0;
+ dmu_buf_rele(dbp, NULL);
+ zfs_znode_free(zp);
+ }
+}
+
+int
+zfs_zget(zfsvfs_t *zfsvfs, uint64_t obj_num, znode_t **zpp)
+{
+ dmu_object_info_t doi;
+ dmu_buf_t *db;
+ znode_t *zp;
+ vnode_t *vp;
+ int err;
+
+ *zpp = NULL;
+
+ ZFS_OBJ_HOLD_ENTER(zfsvfs, obj_num);
+
+ err = dmu_bonus_hold(zfsvfs->z_os, obj_num, NULL, &db);
+ if (err) {
+ ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
+ return (err);
+ }
+
+ dmu_object_info_from_db(db, &doi);
+ if (doi.doi_bonus_type != DMU_OT_ZNODE ||
+ doi.doi_bonus_size < sizeof (znode_phys_t)) {
+ dmu_buf_rele(db, NULL);
+ ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
+ return (EINVAL);
+ }
+
+ ASSERT(db->db_object == obj_num);
+ ASSERT(db->db_offset == -1);
+ ASSERT(db->db_data != NULL);
+
+ zp = dmu_buf_get_user(db);
+
+ if (zp != NULL) {
+ mutex_enter(&zp->z_lock);
+
+ ASSERT3U(zp->z_id, ==, obj_num);
+ if (zp->z_unlinked) {
+ dmu_buf_rele(db, NULL);
+ mutex_exit(&zp->z_lock);
+ ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
+ return (ENOENT);
+ } else if (zp->z_dbuf_held) {
+ dmu_buf_rele(db, NULL);
+ } else {
+ zp->z_dbuf_held = 1;
+ VFS_HOLD(zfsvfs->z_vfs);
+ }
+
+ if (ZTOV(zp) != NULL)
+ VN_HOLD(ZTOV(zp));
+ else {
+ err = getnewvnode("zfs", zfsvfs->z_vfs, &zfs_vnodeops,
+ &zp->z_vnode);
+ ASSERT(err == 0);
+ vp = ZTOV(zp);
+ vp->v_data = (caddr_t)zp;
+ vhold(vp);
+ vp->v_vnlock->lk_flags |= LK_CANRECURSE;
+ vp->v_vnlock->lk_flags &= ~LK_NOSHARE;
+ vp->v_type = IFTOVT((mode_t)zp->z_phys->zp_mode);
+ if (vp->v_type == VDIR)
+ zp->z_zn_prefetch = B_TRUE; /* z_prefetch default is enabled */
+ err = insmntque(vp, zfsvfs->z_vfs);
+ KASSERT(err == 0, ("insmntque() failed: error %d", err));
+ }
+ mutex_exit(&zp->z_lock);
+ ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
+ *zpp = zp;
+ return (0);
+ }
+
+ /*
+ * Not found create new znode/vnode
+ */
+ zp = zfs_znode_alloc(zfsvfs, db, obj_num, doi.doi_data_block_size);
+ ASSERT3U(zp->z_id, ==, obj_num);
+ zfs_znode_dmu_init(zp);
+ ZFS_OBJ_HOLD_EXIT(zfsvfs, obj_num);
+ *zpp = zp;
+ return (0);
+}
+
+void
+zfs_znode_delete(znode_t *zp, dmu_tx_t *tx)
+{
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ int error;
+
+ ZFS_OBJ_HOLD_ENTER(zfsvfs, zp->z_id);
+ if (zp->z_phys->zp_acl.z_acl_extern_obj) {
+ error = dmu_object_free(zfsvfs->z_os,
+ zp->z_phys->zp_acl.z_acl_extern_obj, tx);
+ ASSERT3U(error, ==, 0);
+ }
+ error = dmu_object_free(zfsvfs->z_os, zp->z_id, tx);
+ ASSERT3U(error, ==, 0);
+ zp->z_dbuf_held = 0;
+ ZFS_OBJ_HOLD_EXIT(zfsvfs, zp->z_id);
+ dmu_buf_rele(zp->z_dbuf, NULL);
+}
+
+void
+zfs_zinactive(znode_t *zp)
+{
+ vnode_t *vp = ZTOV(zp);
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ uint64_t z_id = zp->z_id;
+
+ ASSERT(zp->z_dbuf_held && zp->z_phys);
+
+ /*
+ * Don't allow a zfs_zget() while were trying to release this znode
+ */
+ ZFS_OBJ_HOLD_ENTER(zfsvfs, z_id);
+
+ mutex_enter(&zp->z_lock);
+ VI_LOCK(vp);
+ if (vp->v_count > 0) {
+ /*
+ * If the hold count is greater than zero, somebody has
+ * obtained a new reference on this znode while we were
+ * processing it here, so we are done.
+ */
+ VI_UNLOCK(vp);
+ mutex_exit(&zp->z_lock);
+ ZFS_OBJ_HOLD_EXIT(zfsvfs, z_id);
+ return;
+ }
+ VI_UNLOCK(vp);
+
+ /*
+ * If this was the last reference to a file with no links,
+ * remove the file from the file system.
+ */
+ if (zp->z_unlinked) {
+ ZTOV(zp) = NULL;
+ mutex_exit(&zp->z_lock);
+ ZFS_OBJ_HOLD_EXIT(zfsvfs, z_id);
+ ASSERT(vp->v_count == 0);
+ vrecycle(vp, curthread);
+ zfs_rmnode(zp);
+ VFS_RELE(zfsvfs->z_vfs);
+ return;
+ }
+ ASSERT(zp->z_phys);
+ ASSERT(zp->z_dbuf_held);
+ mutex_exit(&zp->z_lock);
+ ZFS_OBJ_HOLD_EXIT(zfsvfs, z_id);
+}
+
+void
+zfs_znode_free(znode_t *zp)
+{
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+
+ mutex_enter(&zfsvfs->z_znodes_lock);
+ list_remove(&zfsvfs->z_all_znodes, zp);
+ mutex_exit(&zfsvfs->z_znodes_lock);
+
+ kmem_cache_free(znode_cache, zp);
+}
+
+void
+zfs_time_stamper_locked(znode_t *zp, uint_t flag, dmu_tx_t *tx)
+{
+ timestruc_t now;
+
+ ASSERT(MUTEX_HELD(&zp->z_lock));
+
+ gethrestime(&now);
+
+ if (tx) {
+ dmu_buf_will_dirty(zp->z_dbuf, tx);
+ zp->z_atime_dirty = 0;
+ zp->z_seq++;
+ } else {
+ zp->z_atime_dirty = 1;
+ }
+
+ if (flag & AT_ATIME)
+ ZFS_TIME_ENCODE(&now, zp->z_phys->zp_atime);
+
+ if (flag & AT_MTIME)
+ ZFS_TIME_ENCODE(&now, zp->z_phys->zp_mtime);
+
+ if (flag & AT_CTIME)
+ ZFS_TIME_ENCODE(&now, zp->z_phys->zp_ctime);
+}
+
+/*
+ * Update the requested znode timestamps with the current time.
+ * If we are in a transaction, then go ahead and mark the znode
+ * dirty in the transaction so the timestamps will go to disk.
+ * Otherwise, we will get pushed next time the znode is updated
+ * in a transaction, or when this znode eventually goes inactive.
+ *
+ * Why is this OK?
+ * 1 - Only the ACCESS time is ever updated outside of a transaction.
+ * 2 - Multiple consecutive updates will be collapsed into a single
+ * znode update by the transaction grouping semantics of the DMU.
+ */
+void
+zfs_time_stamper(znode_t *zp, uint_t flag, dmu_tx_t *tx)
+{
+ mutex_enter(&zp->z_lock);
+ zfs_time_stamper_locked(zp, flag, tx);
+ mutex_exit(&zp->z_lock);
+}
+
+/*
+ * Grow the block size for a file.
+ *
+ * IN: zp - znode of file to free data in.
+ * size - requested block size
+ * tx - open transaction.
+ *
+ * NOTE: this function assumes that the znode is write locked.
+ */
+void
+zfs_grow_blocksize(znode_t *zp, uint64_t size, dmu_tx_t *tx)
+{
+ int error;
+ u_longlong_t dummy;
+
+ if (size <= zp->z_blksz)
+ return;
+ /*
+ * If the file size is already greater than the current blocksize,
+ * we will not grow. If there is more than one block in a file,
+ * the blocksize cannot change.
+ */
+ if (zp->z_blksz && zp->z_phys->zp_size > zp->z_blksz)
+ return;
+
+ error = dmu_object_set_blocksize(zp->z_zfsvfs->z_os, zp->z_id,
+ size, 0, tx);
+ if (error == ENOTSUP)
+ return;
+ ASSERT3U(error, ==, 0);
+
+ /* What blocksize did we actually get? */
+ dmu_object_size_from_db(zp->z_dbuf, &zp->z_blksz, &dummy);
+}
+
+/*
+ * Free space in a file.
+ *
+ * IN: zp - znode of file to free data in.
+ * off - start of section to free.
+ * len - length of section to free (0 => to EOF).
+ * flag - current file open mode flags.
+ *
+ * RETURN: 0 if success
+ * error code if failure
+ */
+int
+zfs_freesp(znode_t *zp, uint64_t off, uint64_t len, int flag, boolean_t log)
+{
+ vnode_t *vp = ZTOV(zp);
+ dmu_tx_t *tx;
+ zfsvfs_t *zfsvfs = zp->z_zfsvfs;
+ zilog_t *zilog = zfsvfs->z_log;
+ rl_t *rl;
+ uint64_t end = off + len;
+ uint64_t size, new_blksz;
+ int error;
+
+ if (ZTOV(zp)->v_type == VFIFO)
+ return (0);
+
+ /*
+ * If we will change zp_size then lock the whole file,
+ * otherwise just lock the range being freed.
+ */
+ if (len == 0 || off + len > zp->z_phys->zp_size) {
+ rl = zfs_range_lock(zp, 0, UINT64_MAX, RL_WRITER);
+ } else {
+ rl = zfs_range_lock(zp, off, len, RL_WRITER);
+ /* recheck, in case zp_size changed */
+ if (off + len > zp->z_phys->zp_size) {
+ /* lost race: file size changed, lock whole file */
+ zfs_range_unlock(rl);
+ rl = zfs_range_lock(zp, 0, UINT64_MAX, RL_WRITER);
+ }
+ }
+
+ /*
+ * Nothing to do if file already at desired length.
+ */
+ size = zp->z_phys->zp_size;
+ if (len == 0 && size == off && off != 0) {
+ zfs_range_unlock(rl);
+ return (0);
+ }
+
+ tx = dmu_tx_create(zfsvfs->z_os);
+ dmu_tx_hold_bonus(tx, zp->z_id);
+ new_blksz = 0;
+ if (end > size &&
+ (!ISP2(zp->z_blksz) || zp->z_blksz < zfsvfs->z_max_blksz)) {
+ /*
+ * We are growing the file past the current block size.
+ */
+ if (zp->z_blksz > zp->z_zfsvfs->z_max_blksz) {
+ ASSERT(!ISP2(zp->z_blksz));
+ new_blksz = MIN(end, SPA_MAXBLOCKSIZE);
+ } else {
+ new_blksz = MIN(end, zp->z_zfsvfs->z_max_blksz);
+ }
+ dmu_tx_hold_write(tx, zp->z_id, 0, MIN(end, new_blksz));
+ } else if (off < size) {
+ /*
+ * If len == 0, we are truncating the file.
+ */
+ dmu_tx_hold_free(tx, zp->z_id, off, len ? len : DMU_OBJECT_END);
+ }
+
+ error = dmu_tx_assign(tx, zfsvfs->z_assign);
+ if (error) {
+ if (error == ERESTART && zfsvfs->z_assign == TXG_NOWAIT)
+ dmu_tx_wait(tx);
+ dmu_tx_abort(tx);
+ zfs_range_unlock(rl);
+ return (error);
+ }
+
+ if (new_blksz)
+ zfs_grow_blocksize(zp, new_blksz, tx);
+
+ if (end > size || len == 0)
+ zp->z_phys->zp_size = end;
+
+ if (off < size) {
+ objset_t *os = zfsvfs->z_os;
+ uint64_t rlen = len;
+
+ if (len == 0)
+ rlen = -1;
+ else if (end > size)
+ rlen = size - off;
+ VERIFY(0 == dmu_free_range(os, zp->z_id, off, rlen, tx));
+ }
+
+ if (log) {
+ zfs_time_stamper(zp, CONTENT_MODIFIED, tx);
+ zfs_log_truncate(zilog, tx, TX_TRUNCATE, zp, off, len);
+ }
+
+ zfs_range_unlock(rl);
+
+ dmu_tx_commit(tx);
+
+ /*
+ * Clear any mapped pages in the truncated region. This has to
+ * happen outside of the transaction to avoid the possibility of
+ * a deadlock with someone trying to push a page that we are
+ * about to invalidate.
+ */
+ rw_enter(&zp->z_map_lock, RW_WRITER);
+ if (end > size)
+ vnode_pager_setsize(vp, end);
+ else if (len == 0) {
+#if 0
+ error = vtruncbuf(vp, curthread->td_ucred, curthread, end, PAGE_SIZE);
+#else
+ error = vinvalbuf(vp, V_SAVE, curthread, 0, 0);
+ vnode_pager_setsize(vp, end);
+#endif
+ }
+ rw_exit(&zp->z_map_lock);
+
+ return (0);
+}
+
+void
+zfs_create_fs(objset_t *os, cred_t *cr, dmu_tx_t *tx)
+{
+ zfsvfs_t zfsvfs;
+ uint64_t moid, doid, roid = 0;
+ uint64_t version = ZPL_VERSION;
+ int error;
+ znode_t *rootzp = NULL;
+ vattr_t vattr;
+
+ /*
+ * First attempt to create master node.
+ */
+ /*
+ * In an empty objset, there are no blocks to read and thus
+ * there can be no i/o errors (which we assert below).
+ */
+ moid = MASTER_NODE_OBJ;
+ error = zap_create_claim(os, moid, DMU_OT_MASTER_NODE,
+ DMU_OT_NONE, 0, tx);
+ ASSERT(error == 0);
+
+ /*
+ * Set starting attributes.
+ */
+
+ error = zap_update(os, moid, ZPL_VERSION_OBJ, 8, 1, &version, tx);
+ ASSERT(error == 0);
+
+ /*
+ * Create a delete queue.
+ */
+ doid = zap_create(os, DMU_OT_UNLINKED_SET, DMU_OT_NONE, 0, tx);
+
+ error = zap_add(os, moid, ZFS_UNLINKED_SET, 8, 1, &doid, tx);
+ ASSERT(error == 0);
+
+ /*
+ * Create root znode. Create minimal znode/vnode/zfsvfs
+ * to allow zfs_mknode to work.
+ */
+ vattr.va_mask = AT_MODE|AT_UID|AT_GID|AT_TYPE;
+ vattr.va_type = VDIR;
+ vattr.va_mode = S_IFDIR|0755;
+ vattr.va_uid = UID_ROOT;
+ vattr.va_gid = GID_WHEEL;
+
+ rootzp = kmem_cache_alloc(znode_cache, KM_SLEEP);
+ zfs_znode_cache_constructor(rootzp, NULL, 0);
+ rootzp->z_zfsvfs = &zfsvfs;
+ rootzp->z_unlinked = 0;
+ rootzp->z_atime_dirty = 0;
+ rootzp->z_dbuf_held = 0;
+
+ bzero(&zfsvfs, sizeof (zfsvfs_t));
+
+ zfsvfs.z_os = os;
+ zfsvfs.z_assign = TXG_NOWAIT;
+ zfsvfs.z_parent = &zfsvfs;
+
+ mutex_init(&zfsvfs.z_znodes_lock, NULL, MUTEX_DEFAULT, NULL);
+ list_create(&zfsvfs.z_all_znodes, sizeof (znode_t),
+ offsetof(znode_t, z_link_node));
+
+ zfs_mknode(rootzp, &vattr, &roid, tx, cr, IS_ROOT_NODE, NULL, 0);
+ ASSERT3U(rootzp->z_id, ==, roid);
+ error = zap_add(os, moid, ZFS_ROOT_OBJ, 8, 1, &roid, tx);
+ ASSERT(error == 0);
+
+ mutex_destroy(&zfsvfs.z_znodes_lock);
+ kmem_cache_free(znode_cache, rootzp);
+}
+#endif /* _KERNEL */
+
+/*
+ * Given an object number, return its parent object number and whether
+ * or not the object is an extended attribute directory.
+ */
+static int
+zfs_obj_to_pobj(objset_t *osp, uint64_t obj, uint64_t *pobjp, int *is_xattrdir)
+{
+ dmu_buf_t *db;
+ dmu_object_info_t doi;
+ znode_phys_t *zp;
+ int error;
+
+ if ((error = dmu_bonus_hold(osp, obj, FTAG, &db)) != 0)
+ return (error);
+
+ dmu_object_info_from_db(db, &doi);
+ if (doi.doi_bonus_type != DMU_OT_ZNODE ||
+ doi.doi_bonus_size < sizeof (znode_phys_t)) {
+ dmu_buf_rele(db, FTAG);
+ return (EINVAL);
+ }
+
+ zp = db->db_data;
+ *pobjp = zp->zp_parent;
+ *is_xattrdir = ((zp->zp_flags & ZFS_XATTR) != 0) &&
+ S_ISDIR(zp->zp_mode);
+ dmu_buf_rele(db, FTAG);
+
+ return (0);
+}
+
+int
+zfs_obj_to_path(objset_t *osp, uint64_t obj, char *buf, int len)
+{
+ char *path = buf + len - 1;
+ int error;
+
+ *path = '\0';
+
+ for (;;) {
+ uint64_t pobj;
+ char component[MAXNAMELEN + 2];
+ size_t complen;
+ int is_xattrdir;
+
+ if ((error = zfs_obj_to_pobj(osp, obj, &pobj,
+ &is_xattrdir)) != 0)
+ break;
+
+ if (pobj == obj) {
+ if (path[0] != '/')
+ *--path = '/';
+ break;
+ }
+
+ component[0] = '/';
+ if (is_xattrdir) {
+ (void) sprintf(component + 1, "<xattrdir>");
+ } else {
+ error = zap_value_search(osp, pobj, obj, component + 1);
+ if (error != 0)
+ break;
+ }
+
+ complen = strlen(component);
+ path -= complen;
+ ASSERT(path >= buf);
+ bcopy(component, path, complen);
+ obj = pobj;
+ }
+
+ if (error == 0)
+ (void) memmove(buf, path, buf + len - path);
+ return (error);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zil.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zil.c
new file mode 100644
index 0000000..6e1d0a1
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zil.c
@@ -0,0 +1,1607 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/dmu.h>
+#include <sys/zap.h>
+#include <sys/arc.h>
+#include <sys/stat.h>
+#include <sys/resource.h>
+#include <sys/zil.h>
+#include <sys/zil_impl.h>
+#include <sys/dsl_dataset.h>
+#include <sys/vdev.h>
+#include <sys/dmu_tx.h>
+
+/*
+ * The zfs intent log (ZIL) saves transaction records of system calls
+ * that change the file system in memory with enough information
+ * to be able to replay them. These are stored in memory until
+ * either the DMU transaction group (txg) commits them to the stable pool
+ * and they can be discarded, or they are flushed to the stable log
+ * (also in the pool) due to a fsync, O_DSYNC or other synchronous
+ * requirement. In the event of a panic or power fail then those log
+ * records (transactions) are replayed.
+ *
+ * There is one ZIL per file system. Its on-disk (pool) format consists
+ * of 3 parts:
+ *
+ * - ZIL header
+ * - ZIL blocks
+ * - ZIL records
+ *
+ * A log record holds a system call transaction. Log blocks can
+ * hold many log records and the blocks are chained together.
+ * Each ZIL block contains a block pointer (blkptr_t) to the next
+ * ZIL block in the chain. The ZIL header points to the first
+ * block in the chain. Note there is not a fixed place in the pool
+ * to hold blocks. They are dynamically allocated and freed as
+ * needed from the blocks available. Figure X shows the ZIL structure:
+ */
+
+/*
+ * This global ZIL switch affects all pools
+ */
+int zil_disable = 0; /* disable intent logging */
+SYSCTL_DECL(_vfs_zfs);
+TUNABLE_INT("vfs.zfs.zil_disable", &zil_disable);
+SYSCTL_INT(_vfs_zfs, OID_AUTO, zil_disable, CTLFLAG_RW, &zil_disable, 0,
+ "Disable ZFS Intent Log (ZIL)");
+
+/*
+ * Tunable parameter for debugging or performance analysis. Setting
+ * zfs_nocacheflush will cause corruption on power loss if a volatile
+ * out-of-order write cache is enabled.
+ */
+boolean_t zfs_nocacheflush = B_FALSE;
+TUNABLE_INT("vfs.zfs.cache_flush_disable", &zfs_nocacheflush);
+SYSCTL_INT(_vfs_zfs, OID_AUTO, cache_flush_disable, CTLFLAG_RDTUN,
+ &zfs_nocacheflush, 0, "Disable cache flush");
+
+static kmem_cache_t *zil_lwb_cache;
+
+static int
+zil_dva_compare(const void *x1, const void *x2)
+{
+ const dva_t *dva1 = x1;
+ const dva_t *dva2 = x2;
+
+ if (DVA_GET_VDEV(dva1) < DVA_GET_VDEV(dva2))
+ return (-1);
+ if (DVA_GET_VDEV(dva1) > DVA_GET_VDEV(dva2))
+ return (1);
+
+ if (DVA_GET_OFFSET(dva1) < DVA_GET_OFFSET(dva2))
+ return (-1);
+ if (DVA_GET_OFFSET(dva1) > DVA_GET_OFFSET(dva2))
+ return (1);
+
+ return (0);
+}
+
+static void
+zil_dva_tree_init(avl_tree_t *t)
+{
+ avl_create(t, zil_dva_compare, sizeof (zil_dva_node_t),
+ offsetof(zil_dva_node_t, zn_node));
+}
+
+static void
+zil_dva_tree_fini(avl_tree_t *t)
+{
+ zil_dva_node_t *zn;
+ void *cookie = NULL;
+
+ while ((zn = avl_destroy_nodes(t, &cookie)) != NULL)
+ kmem_free(zn, sizeof (zil_dva_node_t));
+
+ avl_destroy(t);
+}
+
+static int
+zil_dva_tree_add(avl_tree_t *t, dva_t *dva)
+{
+ zil_dva_node_t *zn;
+ avl_index_t where;
+
+ if (avl_find(t, dva, &where) != NULL)
+ return (EEXIST);
+
+ zn = kmem_alloc(sizeof (zil_dva_node_t), KM_SLEEP);
+ zn->zn_dva = *dva;
+ avl_insert(t, zn, where);
+
+ return (0);
+}
+
+static zil_header_t *
+zil_header_in_syncing_context(zilog_t *zilog)
+{
+ return ((zil_header_t *)zilog->zl_header);
+}
+
+static void
+zil_init_log_chain(zilog_t *zilog, blkptr_t *bp)
+{
+ zio_cksum_t *zc = &bp->blk_cksum;
+
+ zc->zc_word[ZIL_ZC_GUID_0] = spa_get_random(-1ULL);
+ zc->zc_word[ZIL_ZC_GUID_1] = spa_get_random(-1ULL);
+ zc->zc_word[ZIL_ZC_OBJSET] = dmu_objset_id(zilog->zl_os);
+ zc->zc_word[ZIL_ZC_SEQ] = 1ULL;
+}
+
+/*
+ * Read a log block, make sure it's valid, and byteswap it if necessary.
+ */
+static int
+zil_read_log_block(zilog_t *zilog, const blkptr_t *bp, arc_buf_t **abufpp)
+{
+ blkptr_t blk = *bp;
+ zbookmark_t zb;
+ uint32_t aflags = ARC_WAIT;
+ int error;
+
+ zb.zb_objset = bp->blk_cksum.zc_word[ZIL_ZC_OBJSET];
+ zb.zb_object = 0;
+ zb.zb_level = -1;
+ zb.zb_blkid = bp->blk_cksum.zc_word[ZIL_ZC_SEQ];
+
+ *abufpp = NULL;
+
+ error = arc_read(NULL, zilog->zl_spa, &blk, byteswap_uint64_array,
+ arc_getbuf_func, abufpp, ZIO_PRIORITY_SYNC_READ, ZIO_FLAG_CANFAIL |
+ ZIO_FLAG_SPECULATIVE | ZIO_FLAG_SCRUB, &aflags, &zb);
+
+ if (error == 0) {
+ char *data = (*abufpp)->b_data;
+ uint64_t blksz = BP_GET_LSIZE(bp);
+ zil_trailer_t *ztp = (zil_trailer_t *)(data + blksz) - 1;
+ zio_cksum_t cksum = bp->blk_cksum;
+
+ /*
+ * Sequence numbers should be... sequential. The checksum
+ * verifier for the next block should be bp's checksum plus 1.
+ */
+ cksum.zc_word[ZIL_ZC_SEQ]++;
+
+ if (bcmp(&cksum, &ztp->zit_next_blk.blk_cksum, sizeof (cksum)))
+ error = ESTALE;
+ else if (BP_IS_HOLE(&ztp->zit_next_blk))
+ error = ENOENT;
+ else if (ztp->zit_nused > (blksz - sizeof (zil_trailer_t)))
+ error = EOVERFLOW;
+
+ if (error) {
+ VERIFY(arc_buf_remove_ref(*abufpp, abufpp) == 1);
+ *abufpp = NULL;
+ }
+ }
+
+ dprintf("error %d on %llu:%llu\n", error, zb.zb_objset, zb.zb_blkid);
+
+ return (error);
+}
+
+/*
+ * Parse the intent log, and call parse_func for each valid record within.
+ * Return the highest sequence number.
+ */
+uint64_t
+zil_parse(zilog_t *zilog, zil_parse_blk_func_t *parse_blk_func,
+ zil_parse_lr_func_t *parse_lr_func, void *arg, uint64_t txg)
+{
+ const zil_header_t *zh = zilog->zl_header;
+ uint64_t claim_seq = zh->zh_claim_seq;
+ uint64_t seq = 0;
+ uint64_t max_seq = 0;
+ blkptr_t blk = zh->zh_log;
+ arc_buf_t *abuf;
+ char *lrbuf, *lrp;
+ zil_trailer_t *ztp;
+ int reclen, error;
+
+ if (BP_IS_HOLE(&blk))
+ return (max_seq);
+
+ /*
+ * Starting at the block pointed to by zh_log we read the log chain.
+ * For each block in the chain we strongly check that block to
+ * ensure its validity. We stop when an invalid block is found.
+ * For each block pointer in the chain we call parse_blk_func().
+ * For each record in each valid block we call parse_lr_func().
+ * If the log has been claimed, stop if we encounter a sequence
+ * number greater than the highest claimed sequence number.
+ */
+ zil_dva_tree_init(&zilog->zl_dva_tree);
+ for (;;) {
+ seq = blk.blk_cksum.zc_word[ZIL_ZC_SEQ];
+
+ if (claim_seq != 0 && seq > claim_seq)
+ break;
+
+ ASSERT(max_seq < seq);
+ max_seq = seq;
+
+ error = zil_read_log_block(zilog, &blk, &abuf);
+
+ if (parse_blk_func != NULL)
+ parse_blk_func(zilog, &blk, arg, txg);
+
+ if (error)
+ break;
+
+ lrbuf = abuf->b_data;
+ ztp = (zil_trailer_t *)(lrbuf + BP_GET_LSIZE(&blk)) - 1;
+ blk = ztp->zit_next_blk;
+
+ if (parse_lr_func == NULL) {
+ VERIFY(arc_buf_remove_ref(abuf, &abuf) == 1);
+ continue;
+ }
+
+ for (lrp = lrbuf; lrp < lrbuf + ztp->zit_nused; lrp += reclen) {
+ lr_t *lr = (lr_t *)lrp;
+ reclen = lr->lrc_reclen;
+ ASSERT3U(reclen, >=, sizeof (lr_t));
+ parse_lr_func(zilog, lr, arg, txg);
+ }
+ VERIFY(arc_buf_remove_ref(abuf, &abuf) == 1);
+ }
+ zil_dva_tree_fini(&zilog->zl_dva_tree);
+
+ return (max_seq);
+}
+
+/* ARGSUSED */
+static void
+zil_claim_log_block(zilog_t *zilog, blkptr_t *bp, void *tx, uint64_t first_txg)
+{
+ spa_t *spa = zilog->zl_spa;
+ int err;
+
+ /*
+ * Claim log block if not already committed and not already claimed.
+ */
+ if (bp->blk_birth >= first_txg &&
+ zil_dva_tree_add(&zilog->zl_dva_tree, BP_IDENTITY(bp)) == 0) {
+ err = zio_wait(zio_claim(NULL, spa, first_txg, bp, NULL, NULL));
+ ASSERT(err == 0);
+ }
+}
+
+static void
+zil_claim_log_record(zilog_t *zilog, lr_t *lrc, void *tx, uint64_t first_txg)
+{
+ if (lrc->lrc_txtype == TX_WRITE) {
+ lr_write_t *lr = (lr_write_t *)lrc;
+ zil_claim_log_block(zilog, &lr->lr_blkptr, tx, first_txg);
+ }
+}
+
+/* ARGSUSED */
+static void
+zil_free_log_block(zilog_t *zilog, blkptr_t *bp, void *tx, uint64_t claim_txg)
+{
+ zio_free_blk(zilog->zl_spa, bp, dmu_tx_get_txg(tx));
+}
+
+static void
+zil_free_log_record(zilog_t *zilog, lr_t *lrc, void *tx, uint64_t claim_txg)
+{
+ /*
+ * If we previously claimed it, we need to free it.
+ */
+ if (claim_txg != 0 && lrc->lrc_txtype == TX_WRITE) {
+ lr_write_t *lr = (lr_write_t *)lrc;
+ blkptr_t *bp = &lr->lr_blkptr;
+ if (bp->blk_birth >= claim_txg &&
+ !zil_dva_tree_add(&zilog->zl_dva_tree, BP_IDENTITY(bp))) {
+ (void) arc_free(NULL, zilog->zl_spa,
+ dmu_tx_get_txg(tx), bp, NULL, NULL, ARC_WAIT);
+ }
+ }
+}
+
+/*
+ * Create an on-disk intent log.
+ */
+static void
+zil_create(zilog_t *zilog)
+{
+ const zil_header_t *zh = zilog->zl_header;
+ lwb_t *lwb;
+ uint64_t txg = 0;
+ dmu_tx_t *tx = NULL;
+ blkptr_t blk;
+ int error = 0;
+
+ /*
+ * Wait for any previous destroy to complete.
+ */
+ txg_wait_synced(zilog->zl_dmu_pool, zilog->zl_destroy_txg);
+
+ ASSERT(zh->zh_claim_txg == 0);
+ ASSERT(zh->zh_replay_seq == 0);
+
+ blk = zh->zh_log;
+
+ /*
+ * If we don't already have an initial log block, allocate one now.
+ */
+ if (BP_IS_HOLE(&blk)) {
+ tx = dmu_tx_create(zilog->zl_os);
+ (void) dmu_tx_assign(tx, TXG_WAIT);
+ dsl_dataset_dirty(dmu_objset_ds(zilog->zl_os), tx);
+ txg = dmu_tx_get_txg(tx);
+
+ error = zio_alloc_blk(zilog->zl_spa, ZIL_MIN_BLKSZ, &blk,
+ NULL, txg);
+
+ if (error == 0)
+ zil_init_log_chain(zilog, &blk);
+ }
+
+ /*
+ * Allocate a log write buffer (lwb) for the first log block.
+ */
+ if (error == 0) {
+ lwb = kmem_cache_alloc(zil_lwb_cache, KM_SLEEP);
+ lwb->lwb_zilog = zilog;
+ lwb->lwb_blk = blk;
+ lwb->lwb_nused = 0;
+ lwb->lwb_sz = BP_GET_LSIZE(&lwb->lwb_blk);
+ lwb->lwb_buf = zio_buf_alloc(lwb->lwb_sz);
+ lwb->lwb_max_txg = txg;
+ lwb->lwb_zio = NULL;
+
+ mutex_enter(&zilog->zl_lock);
+ list_insert_tail(&zilog->zl_lwb_list, lwb);
+ mutex_exit(&zilog->zl_lock);
+ }
+
+ /*
+ * If we just allocated the first log block, commit our transaction
+ * and wait for zil_sync() to stuff the block poiner into zh_log.
+ * (zh is part of the MOS, so we cannot modify it in open context.)
+ */
+ if (tx != NULL) {
+ dmu_tx_commit(tx);
+ txg_wait_synced(zilog->zl_dmu_pool, txg);
+ }
+
+ ASSERT(bcmp(&blk, &zh->zh_log, sizeof (blk)) == 0);
+}
+
+/*
+ * In one tx, free all log blocks and clear the log header.
+ * If keep_first is set, then we're replaying a log with no content.
+ * We want to keep the first block, however, so that the first
+ * synchronous transaction doesn't require a txg_wait_synced()
+ * in zil_create(). We don't need to txg_wait_synced() here either
+ * when keep_first is set, because both zil_create() and zil_destroy()
+ * will wait for any in-progress destroys to complete.
+ */
+void
+zil_destroy(zilog_t *zilog, boolean_t keep_first)
+{
+ const zil_header_t *zh = zilog->zl_header;
+ lwb_t *lwb;
+ dmu_tx_t *tx;
+ uint64_t txg;
+
+ /*
+ * Wait for any previous destroy to complete.
+ */
+ txg_wait_synced(zilog->zl_dmu_pool, zilog->zl_destroy_txg);
+
+ if (BP_IS_HOLE(&zh->zh_log))
+ return;
+
+ tx = dmu_tx_create(zilog->zl_os);
+ (void) dmu_tx_assign(tx, TXG_WAIT);
+ dsl_dataset_dirty(dmu_objset_ds(zilog->zl_os), tx);
+ txg = dmu_tx_get_txg(tx);
+
+ mutex_enter(&zilog->zl_lock);
+
+ ASSERT3U(zilog->zl_destroy_txg, <, txg);
+ zilog->zl_destroy_txg = txg;
+ zilog->zl_keep_first = keep_first;
+
+ if (!list_is_empty(&zilog->zl_lwb_list)) {
+ ASSERT(zh->zh_claim_txg == 0);
+ ASSERT(!keep_first);
+ while ((lwb = list_head(&zilog->zl_lwb_list)) != NULL) {
+ list_remove(&zilog->zl_lwb_list, lwb);
+ if (lwb->lwb_buf != NULL)
+ zio_buf_free(lwb->lwb_buf, lwb->lwb_sz);
+ zio_free_blk(zilog->zl_spa, &lwb->lwb_blk, txg);
+ kmem_cache_free(zil_lwb_cache, lwb);
+ }
+ } else {
+ if (!keep_first) {
+ (void) zil_parse(zilog, zil_free_log_block,
+ zil_free_log_record, tx, zh->zh_claim_txg);
+ }
+ }
+ mutex_exit(&zilog->zl_lock);
+
+ dmu_tx_commit(tx);
+
+ if (keep_first) /* no need to wait in this case */
+ return;
+
+ txg_wait_synced(zilog->zl_dmu_pool, txg);
+ ASSERT(BP_IS_HOLE(&zh->zh_log));
+}
+
+int
+zil_claim(char *osname, void *txarg)
+{
+ dmu_tx_t *tx = txarg;
+ uint64_t first_txg = dmu_tx_get_txg(tx);
+ zilog_t *zilog;
+ zil_header_t *zh;
+ objset_t *os;
+ int error;
+
+ error = dmu_objset_open(osname, DMU_OST_ANY, DS_MODE_STANDARD, &os);
+ if (error) {
+ cmn_err(CE_WARN, "can't process intent log for %s", osname);
+ return (0);
+ }
+
+ zilog = dmu_objset_zil(os);
+ zh = zil_header_in_syncing_context(zilog);
+
+ /*
+ * Claim all log blocks if we haven't already done so, and remember
+ * the highest claimed sequence number. This ensures that if we can
+ * read only part of the log now (e.g. due to a missing device),
+ * but we can read the entire log later, we will not try to replay
+ * or destroy beyond the last block we successfully claimed.
+ */
+ ASSERT3U(zh->zh_claim_txg, <=, first_txg);
+ if (zh->zh_claim_txg == 0 && !BP_IS_HOLE(&zh->zh_log)) {
+ zh->zh_claim_txg = first_txg;
+ zh->zh_claim_seq = zil_parse(zilog, zil_claim_log_block,
+ zil_claim_log_record, tx, first_txg);
+ dsl_dataset_dirty(dmu_objset_ds(os), tx);
+ }
+
+ ASSERT3U(first_txg, ==, (spa_last_synced_txg(zilog->zl_spa) + 1));
+ dmu_objset_close(os);
+ return (0);
+}
+
+void
+zil_add_vdev(zilog_t *zilog, uint64_t vdev)
+{
+ zil_vdev_t *zv, *new;
+ uint64_t bmap_sz = sizeof (zilog->zl_vdev_bmap) << 3;
+ uchar_t *cp;
+
+ if (zfs_nocacheflush)
+ return;
+
+ if (vdev < bmap_sz) {
+ cp = zilog->zl_vdev_bmap + (vdev / 8);
+ atomic_or_8(cp, 1 << (vdev % 8));
+ } else {
+ /*
+ * insert into ordered list
+ */
+ mutex_enter(&zilog->zl_lock);
+ for (zv = list_head(&zilog->zl_vdev_list); zv != NULL;
+ zv = list_next(&zilog->zl_vdev_list, zv)) {
+ if (zv->vdev == vdev) {
+ /* duplicate found - just return */
+ mutex_exit(&zilog->zl_lock);
+ return;
+ }
+ if (zv->vdev > vdev) {
+ /* insert before this entry */
+ new = kmem_alloc(sizeof (zil_vdev_t),
+ KM_SLEEP);
+ new->vdev = vdev;
+ list_insert_before(&zilog->zl_vdev_list,
+ zv, new);
+ mutex_exit(&zilog->zl_lock);
+ return;
+ }
+ }
+ /* ran off end of list, insert at the end */
+ ASSERT(zv == NULL);
+ new = kmem_alloc(sizeof (zil_vdev_t), KM_SLEEP);
+ new->vdev = vdev;
+ list_insert_tail(&zilog->zl_vdev_list, new);
+ mutex_exit(&zilog->zl_lock);
+ }
+}
+
+/* start an async flush of the write cache for this vdev */
+void
+zil_flush_vdev(spa_t *spa, uint64_t vdev, zio_t **zio)
+{
+ vdev_t *vd;
+
+ if (*zio == NULL)
+ *zio = zio_root(spa, NULL, NULL, ZIO_FLAG_CANFAIL);
+
+ vd = vdev_lookup_top(spa, vdev);
+ ASSERT(vd);
+
+ (void) zio_nowait(zio_ioctl(*zio, spa, vd, DKIOCFLUSHWRITECACHE,
+ NULL, NULL, ZIO_PRIORITY_NOW,
+ ZIO_FLAG_CANFAIL | ZIO_FLAG_DONT_RETRY));
+}
+
+void
+zil_flush_vdevs(zilog_t *zilog)
+{
+ zil_vdev_t *zv;
+ zio_t *zio = NULL;
+ spa_t *spa = zilog->zl_spa;
+ uint64_t vdev;
+ uint8_t b;
+ int i, j;
+
+ ASSERT(zilog->zl_writer);
+
+ for (i = 0; i < sizeof (zilog->zl_vdev_bmap); i++) {
+ b = zilog->zl_vdev_bmap[i];
+ if (b == 0)
+ continue;
+ for (j = 0; j < 8; j++) {
+ if (b & (1 << j)) {
+ vdev = (i << 3) + j;
+ zil_flush_vdev(spa, vdev, &zio);
+ }
+ }
+ zilog->zl_vdev_bmap[i] = 0;
+ }
+
+ while ((zv = list_head(&zilog->zl_vdev_list)) != NULL) {
+ zil_flush_vdev(spa, zv->vdev, &zio);
+ list_remove(&zilog->zl_vdev_list, zv);
+ kmem_free(zv, sizeof (zil_vdev_t));
+ }
+ /*
+ * Wait for all the flushes to complete. Not all devices actually
+ * support the DKIOCFLUSHWRITECACHE ioctl, so it's OK if it fails.
+ */
+ if (zio)
+ (void) zio_wait(zio);
+}
+
+/*
+ * Function called when a log block write completes
+ */
+static void
+zil_lwb_write_done(zio_t *zio)
+{
+ lwb_t *lwb = zio->io_private;
+ zilog_t *zilog = lwb->lwb_zilog;
+
+ /*
+ * Now that we've written this log block, we have a stable pointer
+ * to the next block in the chain, so it's OK to let the txg in
+ * which we allocated the next block sync.
+ */
+ txg_rele_to_sync(&lwb->lwb_txgh);
+
+ zio_buf_free(lwb->lwb_buf, lwb->lwb_sz);
+ mutex_enter(&zilog->zl_lock);
+ lwb->lwb_buf = NULL;
+ if (zio->io_error) {
+ zilog->zl_log_error = B_TRUE;
+ mutex_exit(&zilog->zl_lock);
+ return;
+ }
+ mutex_exit(&zilog->zl_lock);
+}
+
+/*
+ * Initialize the io for a log block.
+ *
+ * Note, we should not initialize the IO until we are about
+ * to use it, since zio_rewrite() does a spa_config_enter().
+ */
+static void
+zil_lwb_write_init(zilog_t *zilog, lwb_t *lwb)
+{
+ zbookmark_t zb;
+
+ zb.zb_objset = lwb->lwb_blk.blk_cksum.zc_word[ZIL_ZC_OBJSET];
+ zb.zb_object = 0;
+ zb.zb_level = -1;
+ zb.zb_blkid = lwb->lwb_blk.blk_cksum.zc_word[ZIL_ZC_SEQ];
+
+ if (zilog->zl_root_zio == NULL) {
+ zilog->zl_root_zio = zio_root(zilog->zl_spa, NULL, NULL,
+ ZIO_FLAG_CANFAIL);
+ }
+ if (lwb->lwb_zio == NULL) {
+ lwb->lwb_zio = zio_rewrite(zilog->zl_root_zio, zilog->zl_spa,
+ ZIO_CHECKSUM_ZILOG, 0, &lwb->lwb_blk, lwb->lwb_buf,
+ lwb->lwb_sz, zil_lwb_write_done, lwb,
+ ZIO_PRIORITY_LOG_WRITE, ZIO_FLAG_MUSTSUCCEED, &zb);
+ }
+}
+
+/*
+ * Start a log block write and advance to the next log block.
+ * Calls are serialized.
+ */
+static lwb_t *
+zil_lwb_write_start(zilog_t *zilog, lwb_t *lwb)
+{
+ lwb_t *nlwb;
+ zil_trailer_t *ztp = (zil_trailer_t *)(lwb->lwb_buf + lwb->lwb_sz) - 1;
+ spa_t *spa = zilog->zl_spa;
+ blkptr_t *bp = &ztp->zit_next_blk;
+ uint64_t txg;
+ uint64_t zil_blksz;
+ int error;
+
+ ASSERT(lwb->lwb_nused <= ZIL_BLK_DATA_SZ(lwb));
+
+ /*
+ * Allocate the next block and save its address in this block
+ * before writing it in order to establish the log chain.
+ * Note that if the allocation of nlwb synced before we wrote
+ * the block that points at it (lwb), we'd leak it if we crashed.
+ * Therefore, we don't do txg_rele_to_sync() until zil_lwb_write_done().
+ */
+ txg = txg_hold_open(zilog->zl_dmu_pool, &lwb->lwb_txgh);
+ txg_rele_to_quiesce(&lwb->lwb_txgh);
+
+ /*
+ * Pick a ZIL blocksize. We request a size that is the
+ * maximum of the previous used size, the current used size and
+ * the amount waiting in the queue.
+ */
+ zil_blksz = MAX(zilog->zl_prev_used,
+ zilog->zl_cur_used + sizeof (*ztp));
+ zil_blksz = MAX(zil_blksz, zilog->zl_itx_list_sz + sizeof (*ztp));
+ zil_blksz = P2ROUNDUP_TYPED(zil_blksz, ZIL_MIN_BLKSZ, uint64_t);
+ if (zil_blksz > ZIL_MAX_BLKSZ)
+ zil_blksz = ZIL_MAX_BLKSZ;
+
+ BP_ZERO(bp);
+ /* pass the old blkptr in order to spread log blocks across devs */
+ error = zio_alloc_blk(spa, zil_blksz, bp, &lwb->lwb_blk, txg);
+ if (error) {
+ dmu_tx_t *tx = dmu_tx_create_assigned(zilog->zl_dmu_pool, txg);
+
+ /*
+ * We dirty the dataset to ensure that zil_sync() will
+ * be called to remove this lwb from our zl_lwb_list.
+ * Failing to do so, may leave an lwb with a NULL lwb_buf
+ * hanging around on the zl_lwb_list.
+ */
+ dsl_dataset_dirty(dmu_objset_ds(zilog->zl_os), tx);
+ dmu_tx_commit(tx);
+
+ /*
+ * Since we've just experienced an allocation failure so we
+ * terminate the current lwb and send it on its way.
+ */
+ ztp->zit_pad = 0;
+ ztp->zit_nused = lwb->lwb_nused;
+ ztp->zit_bt.zbt_cksum = lwb->lwb_blk.blk_cksum;
+ zio_nowait(lwb->lwb_zio);
+
+ /*
+ * By returning NULL the caller will call tx_wait_synced()
+ */
+ return (NULL);
+ }
+
+ ASSERT3U(bp->blk_birth, ==, txg);
+ ztp->zit_pad = 0;
+ ztp->zit_nused = lwb->lwb_nused;
+ ztp->zit_bt.zbt_cksum = lwb->lwb_blk.blk_cksum;
+ bp->blk_cksum = lwb->lwb_blk.blk_cksum;
+ bp->blk_cksum.zc_word[ZIL_ZC_SEQ]++;
+
+ /*
+ * Allocate a new log write buffer (lwb).
+ */
+ nlwb = kmem_cache_alloc(zil_lwb_cache, KM_SLEEP);
+
+ nlwb->lwb_zilog = zilog;
+ nlwb->lwb_blk = *bp;
+ nlwb->lwb_nused = 0;
+ nlwb->lwb_sz = BP_GET_LSIZE(&nlwb->lwb_blk);
+ nlwb->lwb_buf = zio_buf_alloc(nlwb->lwb_sz);
+ nlwb->lwb_max_txg = txg;
+ nlwb->lwb_zio = NULL;
+
+ /*
+ * Put new lwb at the end of the log chain
+ */
+ mutex_enter(&zilog->zl_lock);
+ list_insert_tail(&zilog->zl_lwb_list, nlwb);
+ mutex_exit(&zilog->zl_lock);
+
+ /* Record the vdev for later flushing */
+ zil_add_vdev(zilog, DVA_GET_VDEV(BP_IDENTITY(&(lwb->lwb_blk))));
+
+ /*
+ * kick off the write for the old log block
+ */
+ dprintf_bp(&lwb->lwb_blk, "lwb %p txg %llu: ", lwb, txg);
+ ASSERT(lwb->lwb_zio);
+ zio_nowait(lwb->lwb_zio);
+
+ return (nlwb);
+}
+
+static lwb_t *
+zil_lwb_commit(zilog_t *zilog, itx_t *itx, lwb_t *lwb)
+{
+ lr_t *lrc = &itx->itx_lr; /* common log record */
+ lr_write_t *lr = (lr_write_t *)lrc;
+ uint64_t txg = lrc->lrc_txg;
+ uint64_t reclen = lrc->lrc_reclen;
+ uint64_t dlen;
+
+ if (lwb == NULL)
+ return (NULL);
+ ASSERT(lwb->lwb_buf != NULL);
+
+ if (lrc->lrc_txtype == TX_WRITE && itx->itx_wr_state == WR_NEED_COPY)
+ dlen = P2ROUNDUP_TYPED(
+ lr->lr_length, sizeof (uint64_t), uint64_t);
+ else
+ dlen = 0;
+
+ zilog->zl_cur_used += (reclen + dlen);
+
+ zil_lwb_write_init(zilog, lwb);
+
+ /*
+ * If this record won't fit in the current log block, start a new one.
+ */
+ if (lwb->lwb_nused + reclen + dlen > ZIL_BLK_DATA_SZ(lwb)) {
+ lwb = zil_lwb_write_start(zilog, lwb);
+ if (lwb == NULL)
+ return (NULL);
+ zil_lwb_write_init(zilog, lwb);
+ ASSERT(lwb->lwb_nused == 0);
+ if (reclen + dlen > ZIL_BLK_DATA_SZ(lwb)) {
+ txg_wait_synced(zilog->zl_dmu_pool, txg);
+ return (lwb);
+ }
+ }
+
+ /*
+ * Update the lrc_seq, to be log record sequence number. See zil.h
+ * Then copy the record to the log buffer.
+ */
+ lrc->lrc_seq = ++zilog->zl_lr_seq; /* we are single threaded */
+ bcopy(lrc, lwb->lwb_buf + lwb->lwb_nused, reclen);
+
+ /*
+ * If it's a write, fetch the data or get its blkptr as appropriate.
+ */
+ if (lrc->lrc_txtype == TX_WRITE) {
+ if (txg > spa_freeze_txg(zilog->zl_spa))
+ txg_wait_synced(zilog->zl_dmu_pool, txg);
+ if (itx->itx_wr_state != WR_COPIED) {
+ char *dbuf;
+ int error;
+
+ /* alignment is guaranteed */
+ lr = (lr_write_t *)(lwb->lwb_buf + lwb->lwb_nused);
+ if (dlen) {
+ ASSERT(itx->itx_wr_state == WR_NEED_COPY);
+ dbuf = lwb->lwb_buf + lwb->lwb_nused + reclen;
+ lr->lr_common.lrc_reclen += dlen;
+ } else {
+ ASSERT(itx->itx_wr_state == WR_INDIRECT);
+ dbuf = NULL;
+ }
+ error = zilog->zl_get_data(
+ itx->itx_private, lr, dbuf, lwb->lwb_zio);
+ if (error) {
+ ASSERT(error == ENOENT || error == EEXIST ||
+ error == EALREADY);
+ return (lwb);
+ }
+ }
+ }
+
+ lwb->lwb_nused += reclen + dlen;
+ lwb->lwb_max_txg = MAX(lwb->lwb_max_txg, txg);
+ ASSERT3U(lwb->lwb_nused, <=, ZIL_BLK_DATA_SZ(lwb));
+ ASSERT3U(P2PHASE(lwb->lwb_nused, sizeof (uint64_t)), ==, 0);
+
+ return (lwb);
+}
+
+itx_t *
+zil_itx_create(int txtype, size_t lrsize)
+{
+ itx_t *itx;
+
+ lrsize = P2ROUNDUP_TYPED(lrsize, sizeof (uint64_t), size_t);
+
+ itx = kmem_alloc(offsetof(itx_t, itx_lr) + lrsize, KM_SLEEP);
+ itx->itx_lr.lrc_txtype = txtype;
+ itx->itx_lr.lrc_reclen = lrsize;
+ itx->itx_lr.lrc_seq = 0; /* defensive */
+
+ return (itx);
+}
+
+uint64_t
+zil_itx_assign(zilog_t *zilog, itx_t *itx, dmu_tx_t *tx)
+{
+ uint64_t seq;
+
+ ASSERT(itx->itx_lr.lrc_seq == 0);
+
+ mutex_enter(&zilog->zl_lock);
+ list_insert_tail(&zilog->zl_itx_list, itx);
+ zilog->zl_itx_list_sz += itx->itx_lr.lrc_reclen;
+ itx->itx_lr.lrc_txg = dmu_tx_get_txg(tx);
+ itx->itx_lr.lrc_seq = seq = ++zilog->zl_itx_seq;
+ mutex_exit(&zilog->zl_lock);
+
+ return (seq);
+}
+
+/*
+ * Free up all in-memory intent log transactions that have now been synced.
+ */
+static void
+zil_itx_clean(zilog_t *zilog)
+{
+ uint64_t synced_txg = spa_last_synced_txg(zilog->zl_spa);
+ uint64_t freeze_txg = spa_freeze_txg(zilog->zl_spa);
+ list_t clean_list;
+ itx_t *itx;
+
+ list_create(&clean_list, sizeof (itx_t), offsetof(itx_t, itx_node));
+
+ mutex_enter(&zilog->zl_lock);
+ /* wait for a log writer to finish walking list */
+ while (zilog->zl_writer) {
+ cv_wait(&zilog->zl_cv_writer, &zilog->zl_lock);
+ }
+
+ /*
+ * Move the sync'd log transactions to a separate list so we can call
+ * kmem_free without holding the zl_lock.
+ *
+ * There is no need to set zl_writer as we don't drop zl_lock here
+ */
+ while ((itx = list_head(&zilog->zl_itx_list)) != NULL &&
+ itx->itx_lr.lrc_txg <= MIN(synced_txg, freeze_txg)) {
+ list_remove(&zilog->zl_itx_list, itx);
+ zilog->zl_itx_list_sz -= itx->itx_lr.lrc_reclen;
+ list_insert_tail(&clean_list, itx);
+ }
+ cv_broadcast(&zilog->zl_cv_writer);
+ mutex_exit(&zilog->zl_lock);
+
+ /* destroy sync'd log transactions */
+ while ((itx = list_head(&clean_list)) != NULL) {
+ list_remove(&clean_list, itx);
+ kmem_free(itx, offsetof(itx_t, itx_lr)
+ + itx->itx_lr.lrc_reclen);
+ }
+ list_destroy(&clean_list);
+}
+
+/*
+ * If there are any in-memory intent log transactions which have now been
+ * synced then start up a taskq to free them.
+ */
+void
+zil_clean(zilog_t *zilog)
+{
+ itx_t *itx;
+
+ mutex_enter(&zilog->zl_lock);
+ itx = list_head(&zilog->zl_itx_list);
+ if ((itx != NULL) &&
+ (itx->itx_lr.lrc_txg <= spa_last_synced_txg(zilog->zl_spa))) {
+ (void) taskq_dispatch(zilog->zl_clean_taskq,
+ (void (*)(void *))zil_itx_clean, zilog, TQ_NOSLEEP);
+ }
+ mutex_exit(&zilog->zl_lock);
+}
+
+void
+zil_commit_writer(zilog_t *zilog, uint64_t seq, uint64_t foid)
+{
+ uint64_t txg;
+ uint64_t reclen;
+ uint64_t commit_seq = 0;
+ itx_t *itx, *itx_next = (itx_t *)-1;
+ lwb_t *lwb;
+ spa_t *spa;
+
+ zilog->zl_writer = B_TRUE;
+ zilog->zl_root_zio = NULL;
+ spa = zilog->zl_spa;
+
+ if (zilog->zl_suspend) {
+ lwb = NULL;
+ } else {
+ lwb = list_tail(&zilog->zl_lwb_list);
+ if (lwb == NULL) {
+ /*
+ * Return if there's nothing to flush before we
+ * dirty the fs by calling zil_create()
+ */
+ if (list_is_empty(&zilog->zl_itx_list)) {
+ zilog->zl_writer = B_FALSE;
+ return;
+ }
+ mutex_exit(&zilog->zl_lock);
+ zil_create(zilog);
+ mutex_enter(&zilog->zl_lock);
+ lwb = list_tail(&zilog->zl_lwb_list);
+ }
+ }
+
+ /* Loop through in-memory log transactions filling log blocks. */
+ DTRACE_PROBE1(zil__cw1, zilog_t *, zilog);
+ for (;;) {
+ /*
+ * Find the next itx to push:
+ * Push all transactions related to specified foid and all
+ * other transactions except TX_WRITE, TX_TRUNCATE,
+ * TX_SETATTR and TX_ACL for all other files.
+ */
+ if (itx_next != (itx_t *)-1)
+ itx = itx_next;
+ else
+ itx = list_head(&zilog->zl_itx_list);
+ for (; itx != NULL; itx = list_next(&zilog->zl_itx_list, itx)) {
+ if (foid == 0) /* push all foids? */
+ break;
+ if (itx->itx_sync) /* push all O_[D]SYNC */
+ break;
+ switch (itx->itx_lr.lrc_txtype) {
+ case TX_SETATTR:
+ case TX_WRITE:
+ case TX_TRUNCATE:
+ case TX_ACL:
+ /* lr_foid is same offset for these records */
+ if (((lr_write_t *)&itx->itx_lr)->lr_foid
+ != foid) {
+ continue; /* skip this record */
+ }
+ }
+ break;
+ }
+ if (itx == NULL)
+ break;
+
+ reclen = itx->itx_lr.lrc_reclen;
+ if ((itx->itx_lr.lrc_seq > seq) &&
+ ((lwb == NULL) || (lwb->lwb_nused == 0) ||
+ (lwb->lwb_nused + reclen > ZIL_BLK_DATA_SZ(lwb)))) {
+ break;
+ }
+
+ /*
+ * Save the next pointer. Even though we soon drop
+ * zl_lock all threads that may change the list
+ * (another writer or zil_itx_clean) can't do so until
+ * they have zl_writer.
+ */
+ itx_next = list_next(&zilog->zl_itx_list, itx);
+ list_remove(&zilog->zl_itx_list, itx);
+ mutex_exit(&zilog->zl_lock);
+ txg = itx->itx_lr.lrc_txg;
+ ASSERT(txg);
+
+ if (txg > spa_last_synced_txg(spa) ||
+ txg > spa_freeze_txg(spa))
+ lwb = zil_lwb_commit(zilog, itx, lwb);
+ kmem_free(itx, offsetof(itx_t, itx_lr)
+ + itx->itx_lr.lrc_reclen);
+ mutex_enter(&zilog->zl_lock);
+ zilog->zl_itx_list_sz -= reclen;
+ }
+ DTRACE_PROBE1(zil__cw2, zilog_t *, zilog);
+ /* determine commit sequence number */
+ itx = list_head(&zilog->zl_itx_list);
+ if (itx)
+ commit_seq = itx->itx_lr.lrc_seq;
+ else
+ commit_seq = zilog->zl_itx_seq;
+ mutex_exit(&zilog->zl_lock);
+
+ /* write the last block out */
+ if (lwb != NULL && lwb->lwb_zio != NULL)
+ lwb = zil_lwb_write_start(zilog, lwb);
+
+ zilog->zl_prev_used = zilog->zl_cur_used;
+ zilog->zl_cur_used = 0;
+
+ /*
+ * Wait if necessary for the log blocks to be on stable storage.
+ */
+ if (zilog->zl_root_zio) {
+ DTRACE_PROBE1(zil__cw3, zilog_t *, zilog);
+ (void) zio_wait(zilog->zl_root_zio);
+ DTRACE_PROBE1(zil__cw4, zilog_t *, zilog);
+ if (!zfs_nocacheflush)
+ zil_flush_vdevs(zilog);
+ }
+
+ if (zilog->zl_log_error || lwb == NULL) {
+ zilog->zl_log_error = 0;
+ txg_wait_synced(zilog->zl_dmu_pool, 0);
+ }
+
+ mutex_enter(&zilog->zl_lock);
+ zilog->zl_writer = B_FALSE;
+
+ ASSERT3U(commit_seq, >=, zilog->zl_commit_seq);
+ zilog->zl_commit_seq = commit_seq;
+}
+
+/*
+ * Push zfs transactions to stable storage up to the supplied sequence number.
+ * If foid is 0 push out all transactions, otherwise push only those
+ * for that file or might have been used to create that file.
+ */
+void
+zil_commit(zilog_t *zilog, uint64_t seq, uint64_t foid)
+{
+ if (zilog == NULL || seq == 0)
+ return;
+
+ mutex_enter(&zilog->zl_lock);
+
+ seq = MIN(seq, zilog->zl_itx_seq); /* cap seq at largest itx seq */
+
+ while (zilog->zl_writer) {
+ cv_wait(&zilog->zl_cv_writer, &zilog->zl_lock);
+ if (seq < zilog->zl_commit_seq) {
+ mutex_exit(&zilog->zl_lock);
+ return;
+ }
+ }
+ zil_commit_writer(zilog, seq, foid); /* drops zl_lock */
+ /* wake up others waiting on the commit */
+ cv_broadcast(&zilog->zl_cv_writer);
+ mutex_exit(&zilog->zl_lock);
+}
+
+/*
+ * Called in syncing context to free committed log blocks and update log header.
+ */
+void
+zil_sync(zilog_t *zilog, dmu_tx_t *tx)
+{
+ zil_header_t *zh = zil_header_in_syncing_context(zilog);
+ uint64_t txg = dmu_tx_get_txg(tx);
+ spa_t *spa = zilog->zl_spa;
+ lwb_t *lwb;
+
+ mutex_enter(&zilog->zl_lock);
+
+ ASSERT(zilog->zl_stop_sync == 0);
+
+ zh->zh_replay_seq = zilog->zl_replay_seq[txg & TXG_MASK];
+
+ if (zilog->zl_destroy_txg == txg) {
+ blkptr_t blk = zh->zh_log;
+
+ ASSERT(list_head(&zilog->zl_lwb_list) == NULL);
+ ASSERT(spa_sync_pass(spa) == 1);
+
+ bzero(zh, sizeof (zil_header_t));
+ bzero(zilog->zl_replay_seq, sizeof (zilog->zl_replay_seq));
+
+ if (zilog->zl_keep_first) {
+ /*
+ * If this block was part of log chain that couldn't
+ * be claimed because a device was missing during
+ * zil_claim(), but that device later returns,
+ * then this block could erroneously appear valid.
+ * To guard against this, assign a new GUID to the new
+ * log chain so it doesn't matter what blk points to.
+ */
+ zil_init_log_chain(zilog, &blk);
+ zh->zh_log = blk;
+ }
+ }
+
+ for (;;) {
+ lwb = list_head(&zilog->zl_lwb_list);
+ if (lwb == NULL) {
+ mutex_exit(&zilog->zl_lock);
+ return;
+ }
+ zh->zh_log = lwb->lwb_blk;
+ if (lwb->lwb_buf != NULL || lwb->lwb_max_txg > txg)
+ break;
+ list_remove(&zilog->zl_lwb_list, lwb);
+ zio_free_blk(spa, &lwb->lwb_blk, txg);
+ kmem_cache_free(zil_lwb_cache, lwb);
+
+ /*
+ * If we don't have anything left in the lwb list then
+ * we've had an allocation failure and we need to zero
+ * out the zil_header blkptr so that we don't end
+ * up freeing the same block twice.
+ */
+ if (list_head(&zilog->zl_lwb_list) == NULL)
+ BP_ZERO(&zh->zh_log);
+ }
+ mutex_exit(&zilog->zl_lock);
+}
+
+void
+zil_init(void)
+{
+ zil_lwb_cache = kmem_cache_create("zil_lwb_cache",
+ sizeof (struct lwb), 0, NULL, NULL, NULL, NULL, NULL, 0);
+}
+
+void
+zil_fini(void)
+{
+ kmem_cache_destroy(zil_lwb_cache);
+}
+
+zilog_t *
+zil_alloc(objset_t *os, zil_header_t *zh_phys)
+{
+ zilog_t *zilog;
+
+ zilog = kmem_zalloc(sizeof (zilog_t), KM_SLEEP);
+
+ zilog->zl_header = zh_phys;
+ zilog->zl_os = os;
+ zilog->zl_spa = dmu_objset_spa(os);
+ zilog->zl_dmu_pool = dmu_objset_pool(os);
+ zilog->zl_destroy_txg = TXG_INITIAL - 1;
+
+ mutex_init(&zilog->zl_lock, NULL, MUTEX_DEFAULT, NULL);
+ cv_init(&zilog->zl_cv_writer, NULL, CV_DEFAULT, NULL);
+ cv_init(&zilog->zl_cv_suspend, NULL, CV_DEFAULT, NULL);
+
+ list_create(&zilog->zl_itx_list, sizeof (itx_t),
+ offsetof(itx_t, itx_node));
+
+ list_create(&zilog->zl_lwb_list, sizeof (lwb_t),
+ offsetof(lwb_t, lwb_node));
+
+ list_create(&zilog->zl_vdev_list, sizeof (zil_vdev_t),
+ offsetof(zil_vdev_t, vdev_seq_node));
+
+ return (zilog);
+}
+
+void
+zil_free(zilog_t *zilog)
+{
+ lwb_t *lwb;
+ zil_vdev_t *zv;
+
+ zilog->zl_stop_sync = 1;
+
+ while ((lwb = list_head(&zilog->zl_lwb_list)) != NULL) {
+ list_remove(&zilog->zl_lwb_list, lwb);
+ if (lwb->lwb_buf != NULL)
+ zio_buf_free(lwb->lwb_buf, lwb->lwb_sz);
+ kmem_cache_free(zil_lwb_cache, lwb);
+ }
+ list_destroy(&zilog->zl_lwb_list);
+
+ while ((zv = list_head(&zilog->zl_vdev_list)) != NULL) {
+ list_remove(&zilog->zl_vdev_list, zv);
+ kmem_free(zv, sizeof (zil_vdev_t));
+ }
+ list_destroy(&zilog->zl_vdev_list);
+
+ ASSERT(list_head(&zilog->zl_itx_list) == NULL);
+ list_destroy(&zilog->zl_itx_list);
+ cv_destroy(&zilog->zl_cv_suspend);
+ cv_destroy(&zilog->zl_cv_writer);
+ mutex_destroy(&zilog->zl_lock);
+
+ kmem_free(zilog, sizeof (zilog_t));
+}
+
+/*
+ * return true if the initial log block is not valid
+ */
+static int
+zil_empty(zilog_t *zilog)
+{
+ const zil_header_t *zh = zilog->zl_header;
+ arc_buf_t *abuf = NULL;
+
+ if (BP_IS_HOLE(&zh->zh_log))
+ return (1);
+
+ if (zil_read_log_block(zilog, &zh->zh_log, &abuf) != 0)
+ return (1);
+
+ VERIFY(arc_buf_remove_ref(abuf, &abuf) == 1);
+ return (0);
+}
+
+/*
+ * Open an intent log.
+ */
+zilog_t *
+zil_open(objset_t *os, zil_get_data_t *get_data)
+{
+ zilog_t *zilog = dmu_objset_zil(os);
+
+ zilog->zl_get_data = get_data;
+ zilog->zl_clean_taskq = taskq_create("zil_clean", 1, minclsyspri,
+ 2, 2, TASKQ_PREPOPULATE);
+
+ return (zilog);
+}
+
+/*
+ * Close an intent log.
+ */
+void
+zil_close(zilog_t *zilog)
+{
+ /*
+ * If the log isn't already committed, mark the objset dirty
+ * (so zil_sync() will be called) and wait for that txg to sync.
+ */
+ if (!zil_is_committed(zilog)) {
+ uint64_t txg;
+ dmu_tx_t *tx = dmu_tx_create(zilog->zl_os);
+ (void) dmu_tx_assign(tx, TXG_WAIT);
+ dsl_dataset_dirty(dmu_objset_ds(zilog->zl_os), tx);
+ txg = dmu_tx_get_txg(tx);
+ dmu_tx_commit(tx);
+ txg_wait_synced(zilog->zl_dmu_pool, txg);
+ }
+
+ taskq_destroy(zilog->zl_clean_taskq);
+ zilog->zl_clean_taskq = NULL;
+ zilog->zl_get_data = NULL;
+
+ zil_itx_clean(zilog);
+ ASSERT(list_head(&zilog->zl_itx_list) == NULL);
+}
+
+/*
+ * Suspend an intent log. While in suspended mode, we still honor
+ * synchronous semantics, but we rely on txg_wait_synced() to do it.
+ * We suspend the log briefly when taking a snapshot so that the snapshot
+ * contains all the data it's supposed to, and has an empty intent log.
+ */
+int
+zil_suspend(zilog_t *zilog)
+{
+ const zil_header_t *zh = zilog->zl_header;
+
+ mutex_enter(&zilog->zl_lock);
+ if (zh->zh_claim_txg != 0) { /* unplayed log */
+ mutex_exit(&zilog->zl_lock);
+ return (EBUSY);
+ }
+ if (zilog->zl_suspend++ != 0) {
+ /*
+ * Someone else already began a suspend.
+ * Just wait for them to finish.
+ */
+ while (zilog->zl_suspending)
+ cv_wait(&zilog->zl_cv_suspend, &zilog->zl_lock);
+ ASSERT(BP_IS_HOLE(&zh->zh_log));
+ mutex_exit(&zilog->zl_lock);
+ return (0);
+ }
+ zilog->zl_suspending = B_TRUE;
+ mutex_exit(&zilog->zl_lock);
+
+ zil_commit(zilog, UINT64_MAX, 0);
+
+ /*
+ * Wait for any in-flight log writes to complete.
+ */
+ mutex_enter(&zilog->zl_lock);
+ while (zilog->zl_writer)
+ cv_wait(&zilog->zl_cv_writer, &zilog->zl_lock);
+ mutex_exit(&zilog->zl_lock);
+
+ zil_destroy(zilog, B_FALSE);
+
+ mutex_enter(&zilog->zl_lock);
+ ASSERT(BP_IS_HOLE(&zh->zh_log));
+ zilog->zl_suspending = B_FALSE;
+ cv_broadcast(&zilog->zl_cv_suspend);
+ mutex_exit(&zilog->zl_lock);
+
+ return (0);
+}
+
+void
+zil_resume(zilog_t *zilog)
+{
+ mutex_enter(&zilog->zl_lock);
+ ASSERT(zilog->zl_suspend != 0);
+ zilog->zl_suspend--;
+ mutex_exit(&zilog->zl_lock);
+}
+
+typedef struct zil_replay_arg {
+ objset_t *zr_os;
+ zil_replay_func_t **zr_replay;
+ void *zr_arg;
+ uint64_t *zr_txgp;
+ boolean_t zr_byteswap;
+ char *zr_lrbuf;
+} zil_replay_arg_t;
+
+static void
+zil_replay_log_record(zilog_t *zilog, lr_t *lr, void *zra, uint64_t claim_txg)
+{
+ zil_replay_arg_t *zr = zra;
+ const zil_header_t *zh = zilog->zl_header;
+ uint64_t reclen = lr->lrc_reclen;
+ uint64_t txtype = lr->lrc_txtype;
+ char *name;
+ int pass, error, sunk;
+
+ if (zilog->zl_stop_replay)
+ return;
+
+ if (lr->lrc_txg < claim_txg) /* already committed */
+ return;
+
+ if (lr->lrc_seq <= zh->zh_replay_seq) /* already replayed */
+ return;
+
+ /*
+ * Make a copy of the data so we can revise and extend it.
+ */
+ bcopy(lr, zr->zr_lrbuf, reclen);
+
+ /*
+ * The log block containing this lr may have been byteswapped
+ * so that we can easily examine common fields like lrc_txtype.
+ * However, the log is a mix of different data types, and only the
+ * replay vectors know how to byteswap their records. Therefore, if
+ * the lr was byteswapped, undo it before invoking the replay vector.
+ */
+ if (zr->zr_byteswap)
+ byteswap_uint64_array(zr->zr_lrbuf, reclen);
+
+ /*
+ * If this is a TX_WRITE with a blkptr, suck in the data.
+ */
+ if (txtype == TX_WRITE && reclen == sizeof (lr_write_t)) {
+ lr_write_t *lrw = (lr_write_t *)lr;
+ blkptr_t *wbp = &lrw->lr_blkptr;
+ uint64_t wlen = lrw->lr_length;
+ char *wbuf = zr->zr_lrbuf + reclen;
+
+ if (BP_IS_HOLE(wbp)) { /* compressed to a hole */
+ bzero(wbuf, wlen);
+ } else {
+ /*
+ * A subsequent write may have overwritten this block,
+ * in which case wbp may have been been freed and
+ * reallocated, and our read of wbp may fail with a
+ * checksum error. We can safely ignore this because
+ * the later write will provide the correct data.
+ */
+ zbookmark_t zb;
+
+ zb.zb_objset = dmu_objset_id(zilog->zl_os);
+ zb.zb_object = lrw->lr_foid;
+ zb.zb_level = -1;
+ zb.zb_blkid = lrw->lr_offset / BP_GET_LSIZE(wbp);
+
+ (void) zio_wait(zio_read(NULL, zilog->zl_spa,
+ wbp, wbuf, BP_GET_LSIZE(wbp), NULL, NULL,
+ ZIO_PRIORITY_SYNC_READ,
+ ZIO_FLAG_CANFAIL | ZIO_FLAG_SPECULATIVE, &zb));
+ (void) memmove(wbuf, wbuf + lrw->lr_blkoff, wlen);
+ }
+ }
+
+ /*
+ * We must now do two things atomically: replay this log record,
+ * and update the log header to reflect the fact that we did so.
+ * We use the DMU's ability to assign into a specific txg to do this.
+ */
+ for (pass = 1, sunk = B_FALSE; /* CONSTANTCONDITION */; pass++) {
+ uint64_t replay_txg;
+ dmu_tx_t *replay_tx;
+
+ replay_tx = dmu_tx_create(zr->zr_os);
+ error = dmu_tx_assign(replay_tx, TXG_WAIT);
+ if (error) {
+ dmu_tx_abort(replay_tx);
+ break;
+ }
+
+ replay_txg = dmu_tx_get_txg(replay_tx);
+
+ if (txtype == 0 || txtype >= TX_MAX_TYPE) {
+ error = EINVAL;
+ } else {
+ /*
+ * On the first pass, arrange for the replay vector
+ * to fail its dmu_tx_assign(). That's the only way
+ * to ensure that those code paths remain well tested.
+ */
+ *zr->zr_txgp = replay_txg - (pass == 1);
+ error = zr->zr_replay[txtype](zr->zr_arg, zr->zr_lrbuf,
+ zr->zr_byteswap);
+ *zr->zr_txgp = TXG_NOWAIT;
+ }
+
+ if (error == 0) {
+ dsl_dataset_dirty(dmu_objset_ds(zr->zr_os), replay_tx);
+ zilog->zl_replay_seq[replay_txg & TXG_MASK] =
+ lr->lrc_seq;
+ }
+
+ dmu_tx_commit(replay_tx);
+
+ if (!error)
+ return;
+
+ /*
+ * The DMU's dnode layer doesn't see removes until the txg
+ * commits, so a subsequent claim can spuriously fail with
+ * EEXIST. So if we receive any error other than ERESTART
+ * we try syncing out any removes then retrying the
+ * transaction.
+ */
+ if (error != ERESTART && !sunk) {
+ txg_wait_synced(spa_get_dsl(zilog->zl_spa), 0);
+ sunk = B_TRUE;
+ continue; /* retry */
+ }
+
+ if (error != ERESTART)
+ break;
+
+ if (pass != 1)
+ txg_wait_open(spa_get_dsl(zilog->zl_spa),
+ replay_txg + 1);
+
+ dprintf("pass %d, retrying\n", pass);
+ }
+
+ ASSERT(error && error != ERESTART);
+ name = kmem_alloc(MAXNAMELEN, KM_SLEEP);
+ dmu_objset_name(zr->zr_os, name);
+ cmn_err(CE_WARN, "ZFS replay transaction error %d, "
+ "dataset %s, seq 0x%llx, txtype %llu\n",
+ error, name, (u_longlong_t)lr->lrc_seq, (u_longlong_t)txtype);
+ zilog->zl_stop_replay = 1;
+ kmem_free(name, MAXNAMELEN);
+}
+
+/* ARGSUSED */
+static void
+zil_incr_blks(zilog_t *zilog, blkptr_t *bp, void *arg, uint64_t claim_txg)
+{
+ zilog->zl_replay_blks++;
+}
+
+/*
+ * If this dataset has a non-empty intent log, replay it and destroy it.
+ */
+void
+zil_replay(objset_t *os, void *arg, uint64_t *txgp,
+ zil_replay_func_t *replay_func[TX_MAX_TYPE])
+{
+ zilog_t *zilog = dmu_objset_zil(os);
+ const zil_header_t *zh = zilog->zl_header;
+ zil_replay_arg_t zr;
+
+ if (zil_empty(zilog)) {
+ zil_destroy(zilog, B_TRUE);
+ return;
+ }
+ //printf("ZFS: Replaying ZIL on %s...\n", os->os->os_spa->spa_name);
+
+ zr.zr_os = os;
+ zr.zr_replay = replay_func;
+ zr.zr_arg = arg;
+ zr.zr_txgp = txgp;
+ zr.zr_byteswap = BP_SHOULD_BYTESWAP(&zh->zh_log);
+ zr.zr_lrbuf = kmem_alloc(2 * SPA_MAXBLOCKSIZE, KM_SLEEP);
+
+ /*
+ * Wait for in-progress removes to sync before starting replay.
+ */
+ txg_wait_synced(zilog->zl_dmu_pool, 0);
+
+ zilog->zl_stop_replay = 0;
+ zilog->zl_replay_time = lbolt;
+ ASSERT(zilog->zl_replay_blks == 0);
+ (void) zil_parse(zilog, zil_incr_blks, zil_replay_log_record, &zr,
+ zh->zh_claim_txg);
+ kmem_free(zr.zr_lrbuf, 2 * SPA_MAXBLOCKSIZE);
+
+ zil_destroy(zilog, B_FALSE);
+ //printf("ZFS: Replay of ZIL on %s finished.\n", os->os->os_spa->spa_name);
+}
+
+/*
+ * Report whether all transactions are committed
+ */
+int
+zil_is_committed(zilog_t *zilog)
+{
+ lwb_t *lwb;
+ int ret;
+
+ mutex_enter(&zilog->zl_lock);
+ while (zilog->zl_writer)
+ cv_wait(&zilog->zl_cv_writer, &zilog->zl_lock);
+
+ /* recent unpushed intent log transactions? */
+ if (!list_is_empty(&zilog->zl_itx_list)) {
+ ret = B_FALSE;
+ goto out;
+ }
+
+ /* intent log never used? */
+ lwb = list_head(&zilog->zl_lwb_list);
+ if (lwb == NULL) {
+ ret = B_TRUE;
+ goto out;
+ }
+
+ /*
+ * more than 1 log buffer means zil_sync() hasn't yet freed
+ * entries after a txg has committed
+ */
+ if (list_next(&zilog->zl_lwb_list, lwb)) {
+ ret = B_FALSE;
+ goto out;
+ }
+
+ ASSERT(zil_empty(zilog));
+ ret = B_TRUE;
+out:
+ cv_broadcast(&zilog->zl_cv_writer);
+ mutex_exit(&zilog->zl_lock);
+ return (ret);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zio.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zio.c
new file mode 100644
index 0000000..0f5d4fb
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zio.c
@@ -0,0 +1,1861 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/fm/fs/zfs.h>
+#include <sys/spa.h>
+#include <sys/txg.h>
+#include <sys/spa_impl.h>
+#include <sys/vdev_impl.h>
+#include <sys/zio_impl.h>
+#include <sys/zio_compress.h>
+#include <sys/zio_checksum.h>
+
+/*
+ * ==========================================================================
+ * I/O priority table
+ * ==========================================================================
+ */
+uint8_t zio_priority_table[ZIO_PRIORITY_TABLE_SIZE] = {
+ 0, /* ZIO_PRIORITY_NOW */
+ 0, /* ZIO_PRIORITY_SYNC_READ */
+ 0, /* ZIO_PRIORITY_SYNC_WRITE */
+ 6, /* ZIO_PRIORITY_ASYNC_READ */
+ 4, /* ZIO_PRIORITY_ASYNC_WRITE */
+ 4, /* ZIO_PRIORITY_FREE */
+ 0, /* ZIO_PRIORITY_CACHE_FILL */
+ 0, /* ZIO_PRIORITY_LOG_WRITE */
+ 10, /* ZIO_PRIORITY_RESILVER */
+ 20, /* ZIO_PRIORITY_SCRUB */
+};
+
+/*
+ * ==========================================================================
+ * I/O type descriptions
+ * ==========================================================================
+ */
+char *zio_type_name[ZIO_TYPES] = {
+ "null", "read", "write", "free", "claim", "ioctl" };
+
+/* At or above this size, force gang blocking - for testing */
+uint64_t zio_gang_bang = SPA_MAXBLOCKSIZE + 1;
+
+/* Force an allocation failure when non-zero */
+uint16_t zio_zil_fail_shift = 0;
+
+typedef struct zio_sync_pass {
+ int zp_defer_free; /* defer frees after this pass */
+ int zp_dontcompress; /* don't compress after this pass */
+ int zp_rewrite; /* rewrite new bps after this pass */
+} zio_sync_pass_t;
+
+zio_sync_pass_t zio_sync_pass = {
+ 1, /* zp_defer_free */
+ 4, /* zp_dontcompress */
+ 1, /* zp_rewrite */
+};
+
+/*
+ * ==========================================================================
+ * I/O kmem caches
+ * ==========================================================================
+ */
+kmem_cache_t *zio_cache;
+#ifdef ZIO_USE_UMA
+kmem_cache_t *zio_buf_cache[SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT];
+kmem_cache_t *zio_data_buf_cache[SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT];
+#endif
+
+#ifdef _KERNEL
+extern vmem_t *zio_alloc_arena;
+#endif
+
+void
+zio_init(void)
+{
+#ifdef ZIO_USE_UMA
+ size_t c;
+#endif
+#if 0
+ vmem_t *data_alloc_arena = NULL;
+
+#ifdef _KERNEL
+ data_alloc_arena = zio_alloc_arena;
+#endif
+#endif
+
+ zio_cache = kmem_cache_create("zio_cache", sizeof (zio_t), 0,
+ NULL, NULL, NULL, NULL, NULL, 0);
+
+#ifdef ZIO_USE_UMA
+ /*
+ * For small buffers, we want a cache for each multiple of
+ * SPA_MINBLOCKSIZE. For medium-size buffers, we want a cache
+ * for each quarter-power of 2. For large buffers, we want
+ * a cache for each multiple of PAGESIZE.
+ */
+ for (c = 0; c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT; c++) {
+ size_t size = (c + 1) << SPA_MINBLOCKSHIFT;
+ size_t p2 = size;
+ size_t align = 0;
+
+ while (p2 & (p2 - 1))
+ p2 &= p2 - 1;
+
+ if (size <= 4 * SPA_MINBLOCKSIZE) {
+ align = SPA_MINBLOCKSIZE;
+ } else if (P2PHASE(size, PAGESIZE) == 0) {
+ align = PAGESIZE;
+ } else if (P2PHASE(size, p2 >> 2) == 0) {
+ align = p2 >> 2;
+ }
+
+ if (align != 0) {
+ char name[36];
+ (void) sprintf(name, "zio_buf_%lu", (ulong_t)size);
+ zio_buf_cache[c] = kmem_cache_create(name, size,
+ align, NULL, NULL, NULL, NULL, NULL, KMC_NODEBUG);
+
+ (void) sprintf(name, "zio_data_buf_%lu", (ulong_t)size);
+ zio_data_buf_cache[c] = kmem_cache_create(name, size,
+ align, NULL, NULL, NULL, NULL, data_alloc_arena,
+ KMC_NODEBUG);
+
+ dprintf("creating cache for size %5lx align %5lx\n",
+ size, align);
+ }
+ }
+
+ while (--c != 0) {
+ ASSERT(zio_buf_cache[c] != NULL);
+ if (zio_buf_cache[c - 1] == NULL)
+ zio_buf_cache[c - 1] = zio_buf_cache[c];
+
+ ASSERT(zio_data_buf_cache[c] != NULL);
+ if (zio_data_buf_cache[c - 1] == NULL)
+ zio_data_buf_cache[c - 1] = zio_data_buf_cache[c];
+ }
+#endif
+
+ zio_inject_init();
+}
+
+void
+zio_fini(void)
+{
+#ifdef ZIO_USE_UMA
+ size_t c;
+ kmem_cache_t *last_cache = NULL;
+ kmem_cache_t *last_data_cache = NULL;
+
+ for (c = 0; c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT; c++) {
+ if (zio_buf_cache[c] != last_cache) {
+ last_cache = zio_buf_cache[c];
+ kmem_cache_destroy(zio_buf_cache[c]);
+ }
+ zio_buf_cache[c] = NULL;
+
+ if (zio_data_buf_cache[c] != last_data_cache) {
+ last_data_cache = zio_data_buf_cache[c];
+ kmem_cache_destroy(zio_data_buf_cache[c]);
+ }
+ zio_data_buf_cache[c] = NULL;
+ }
+#endif
+
+ kmem_cache_destroy(zio_cache);
+
+ zio_inject_fini();
+}
+
+/*
+ * ==========================================================================
+ * Allocate and free I/O buffers
+ * ==========================================================================
+ */
+
+/*
+ * Use zio_buf_alloc to allocate ZFS metadata. This data will appear in a
+ * crashdump if the kernel panics, so use it judiciously. Obviously, it's
+ * useful to inspect ZFS metadata, but if possible, we should avoid keeping
+ * excess / transient data in-core during a crashdump.
+ */
+void *
+zio_buf_alloc(size_t size)
+{
+#ifdef ZIO_USE_UMA
+ size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;
+
+ ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
+
+ return (kmem_cache_alloc(zio_buf_cache[c], KM_SLEEP));
+#else
+ return (kmem_alloc(size, KM_SLEEP));
+#endif
+}
+
+/*
+ * Use zio_data_buf_alloc to allocate data. The data will not appear in a
+ * crashdump if the kernel panics. This exists so that we will limit the amount
+ * of ZFS data that shows up in a kernel crashdump. (Thus reducing the amount
+ * of kernel heap dumped to disk when the kernel panics)
+ */
+void *
+zio_data_buf_alloc(size_t size)
+{
+#ifdef ZIO_USE_UMA
+ size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;
+
+ ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
+
+ return (kmem_cache_alloc(zio_data_buf_cache[c], KM_SLEEP));
+#else
+ return (kmem_alloc(size, KM_SLEEP));
+#endif
+}
+
+void
+zio_buf_free(void *buf, size_t size)
+{
+#ifdef ZIO_USE_UMA
+ size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;
+
+ ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
+
+ kmem_cache_free(zio_buf_cache[c], buf);
+#else
+ kmem_free(buf, size);
+#endif
+}
+
+void
+zio_data_buf_free(void *buf, size_t size)
+{
+#ifdef ZIO_USE_UMA
+ size_t c = (size - 1) >> SPA_MINBLOCKSHIFT;
+
+ ASSERT(c < SPA_MAXBLOCKSIZE >> SPA_MINBLOCKSHIFT);
+
+ kmem_cache_free(zio_data_buf_cache[c], buf);
+#else
+ kmem_free(buf, size);
+#endif
+}
+
+/*
+ * ==========================================================================
+ * Push and pop I/O transform buffers
+ * ==========================================================================
+ */
+static void
+zio_push_transform(zio_t *zio, void *data, uint64_t size, uint64_t bufsize)
+{
+ zio_transform_t *zt = kmem_alloc(sizeof (zio_transform_t), KM_SLEEP);
+
+ zt->zt_data = data;
+ zt->zt_size = size;
+ zt->zt_bufsize = bufsize;
+
+ zt->zt_next = zio->io_transform_stack;
+ zio->io_transform_stack = zt;
+
+ zio->io_data = data;
+ zio->io_size = size;
+}
+
+static void
+zio_pop_transform(zio_t *zio, void **data, uint64_t *size, uint64_t *bufsize)
+{
+ zio_transform_t *zt = zio->io_transform_stack;
+
+ *data = zt->zt_data;
+ *size = zt->zt_size;
+ *bufsize = zt->zt_bufsize;
+
+ zio->io_transform_stack = zt->zt_next;
+ kmem_free(zt, sizeof (zio_transform_t));
+
+ if ((zt = zio->io_transform_stack) != NULL) {
+ zio->io_data = zt->zt_data;
+ zio->io_size = zt->zt_size;
+ }
+}
+
+static void
+zio_clear_transform_stack(zio_t *zio)
+{
+ void *data;
+ uint64_t size, bufsize;
+
+ ASSERT(zio->io_transform_stack != NULL);
+
+ zio_pop_transform(zio, &data, &size, &bufsize);
+ while (zio->io_transform_stack != NULL) {
+ zio_buf_free(data, bufsize);
+ zio_pop_transform(zio, &data, &size, &bufsize);
+ }
+}
+
+/*
+ * ==========================================================================
+ * Create the various types of I/O (read, write, free)
+ * ==========================================================================
+ */
+static zio_t *
+zio_create(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
+ void *data, uint64_t size, zio_done_func_t *done, void *private,
+ zio_type_t type, int priority, int flags, uint8_t stage, uint32_t pipeline)
+{
+ zio_t *zio;
+
+ ASSERT3U(size, <=, SPA_MAXBLOCKSIZE);
+ ASSERT(P2PHASE(size, SPA_MINBLOCKSIZE) == 0);
+
+ zio = kmem_cache_alloc(zio_cache, KM_SLEEP);
+ bzero(zio, sizeof (zio_t));
+ zio->io_parent = pio;
+ zio->io_spa = spa;
+ zio->io_txg = txg;
+ if (bp != NULL) {
+ zio->io_bp = bp;
+ zio->io_bp_copy = *bp;
+ zio->io_bp_orig = *bp;
+ }
+ zio->io_done = done;
+ zio->io_private = private;
+ zio->io_type = type;
+ zio->io_priority = priority;
+ zio->io_stage = stage;
+ zio->io_pipeline = pipeline;
+ zio->io_async_stages = ZIO_ASYNC_PIPELINE_STAGES;
+ zio->io_timestamp = lbolt64;
+ zio->io_flags = flags;
+ mutex_init(&zio->io_lock, NULL, MUTEX_DEFAULT, NULL);
+ cv_init(&zio->io_cv, NULL, CV_DEFAULT, NULL);
+ zio_push_transform(zio, data, size, size);
+
+ /*
+ * Note on config lock:
+ *
+ * If CONFIG_HELD is set, then the caller already has the config
+ * lock, so we don't need it for this io.
+ *
+ * We set CONFIG_GRABBED to indicate that we have grabbed the
+ * config lock on behalf of this io, so it should be released
+ * in zio_done.
+ *
+ * Unless CONFIG_HELD is set, we will grab the config lock for
+ * any top-level (parent-less) io, *except* NULL top-level ios.
+ * The NULL top-level ios rarely have any children, so we delay
+ * grabbing the lock until the first child is added (but it is
+ * still grabbed on behalf of the top-level i/o, so additional
+ * children don't need to also grab it). This greatly reduces
+ * contention on the config lock.
+ */
+ if (pio == NULL) {
+ if (type != ZIO_TYPE_NULL &&
+ !(flags & ZIO_FLAG_CONFIG_HELD)) {
+ spa_config_enter(zio->io_spa, RW_READER, zio);
+ zio->io_flags |= ZIO_FLAG_CONFIG_GRABBED;
+ }
+ zio->io_root = zio;
+ } else {
+ zio->io_root = pio->io_root;
+ if (!(flags & ZIO_FLAG_NOBOOKMARK))
+ zio->io_logical = pio->io_logical;
+ mutex_enter(&pio->io_lock);
+ if (pio->io_parent == NULL &&
+ pio->io_type == ZIO_TYPE_NULL &&
+ !(pio->io_flags & ZIO_FLAG_CONFIG_GRABBED) &&
+ !(pio->io_flags & ZIO_FLAG_CONFIG_HELD)) {
+ pio->io_flags |= ZIO_FLAG_CONFIG_GRABBED;
+ spa_config_enter(zio->io_spa, RW_READER, pio);
+ }
+ if (stage < ZIO_STAGE_READY)
+ pio->io_children_notready++;
+ pio->io_children_notdone++;
+ zio->io_sibling_next = pio->io_child;
+ zio->io_sibling_prev = NULL;
+ if (pio->io_child != NULL)
+ pio->io_child->io_sibling_prev = zio;
+ pio->io_child = zio;
+ zio->io_ndvas = pio->io_ndvas;
+ mutex_exit(&pio->io_lock);
+ }
+
+ return (zio);
+}
+
+zio_t *
+zio_null(zio_t *pio, spa_t *spa, zio_done_func_t *done, void *private,
+ int flags)
+{
+ zio_t *zio;
+
+ zio = zio_create(pio, spa, 0, NULL, NULL, 0, done, private,
+ ZIO_TYPE_NULL, ZIO_PRIORITY_NOW, flags, ZIO_STAGE_OPEN,
+ ZIO_WAIT_FOR_CHILDREN_PIPELINE);
+
+ return (zio);
+}
+
+zio_t *
+zio_root(spa_t *spa, zio_done_func_t *done, void *private, int flags)
+{
+ return (zio_null(NULL, spa, done, private, flags));
+}
+
+zio_t *
+zio_read(zio_t *pio, spa_t *spa, blkptr_t *bp, void *data,
+ uint64_t size, zio_done_func_t *done, void *private,
+ int priority, int flags, zbookmark_t *zb)
+{
+ zio_t *zio;
+
+ ASSERT3U(size, ==, BP_GET_LSIZE(bp));
+
+ zio = zio_create(pio, spa, bp->blk_birth, bp, data, size, done, private,
+ ZIO_TYPE_READ, priority, flags | ZIO_FLAG_USER,
+ ZIO_STAGE_OPEN, ZIO_READ_PIPELINE);
+ zio->io_bookmark = *zb;
+
+ zio->io_logical = zio;
+
+ /*
+ * Work off our copy of the bp so the caller can free it.
+ */
+ zio->io_bp = &zio->io_bp_copy;
+
+ if (BP_GET_COMPRESS(bp) != ZIO_COMPRESS_OFF) {
+ uint64_t csize = BP_GET_PSIZE(bp);
+ void *cbuf = zio_buf_alloc(csize);
+
+ zio_push_transform(zio, cbuf, csize, csize);
+ zio->io_pipeline |= 1U << ZIO_STAGE_READ_DECOMPRESS;
+ }
+
+ if (BP_IS_GANG(bp)) {
+ uint64_t gsize = SPA_GANGBLOCKSIZE;
+ void *gbuf = zio_buf_alloc(gsize);
+
+ zio_push_transform(zio, gbuf, gsize, gsize);
+ zio->io_pipeline |= 1U << ZIO_STAGE_READ_GANG_MEMBERS;
+ }
+
+ return (zio);
+}
+
+zio_t *
+zio_write(zio_t *pio, spa_t *spa, int checksum, int compress, int ncopies,
+ uint64_t txg, blkptr_t *bp, void *data, uint64_t size,
+ zio_done_func_t *ready, zio_done_func_t *done, void *private, int priority,
+ int flags, zbookmark_t *zb)
+{
+ zio_t *zio;
+
+ ASSERT(checksum >= ZIO_CHECKSUM_OFF &&
+ checksum < ZIO_CHECKSUM_FUNCTIONS);
+
+ ASSERT(compress >= ZIO_COMPRESS_OFF &&
+ compress < ZIO_COMPRESS_FUNCTIONS);
+
+ zio = zio_create(pio, spa, txg, bp, data, size, done, private,
+ ZIO_TYPE_WRITE, priority, flags | ZIO_FLAG_USER,
+ ZIO_STAGE_OPEN, ZIO_WRITE_PIPELINE);
+
+ zio->io_ready = ready;
+
+ zio->io_bookmark = *zb;
+
+ zio->io_logical = zio;
+
+ zio->io_checksum = checksum;
+ zio->io_compress = compress;
+ zio->io_ndvas = ncopies;
+
+ if (compress != ZIO_COMPRESS_OFF)
+ zio->io_async_stages |= 1U << ZIO_STAGE_WRITE_COMPRESS;
+
+ if (bp->blk_birth != txg) {
+ /* XXX the bp usually (always?) gets re-zeroed later */
+ BP_ZERO(bp);
+ BP_SET_LSIZE(bp, size);
+ BP_SET_PSIZE(bp, size);
+ } else {
+ /* Make sure someone doesn't change their mind on overwrites */
+ ASSERT(MIN(zio->io_ndvas + BP_IS_GANG(bp),
+ spa_max_replication(spa)) == BP_GET_NDVAS(bp));
+ }
+
+ return (zio);
+}
+
+zio_t *
+zio_rewrite(zio_t *pio, spa_t *spa, int checksum,
+ uint64_t txg, blkptr_t *bp, void *data, uint64_t size,
+ zio_done_func_t *done, void *private, int priority, int flags,
+ zbookmark_t *zb)
+{
+ zio_t *zio;
+
+ zio = zio_create(pio, spa, txg, bp, data, size, done, private,
+ ZIO_TYPE_WRITE, priority, flags | ZIO_FLAG_USER,
+ ZIO_STAGE_OPEN, ZIO_REWRITE_PIPELINE);
+
+ zio->io_bookmark = *zb;
+ zio->io_checksum = checksum;
+ zio->io_compress = ZIO_COMPRESS_OFF;
+
+ if (pio != NULL)
+ ASSERT3U(zio->io_ndvas, <=, BP_GET_NDVAS(bp));
+
+ return (zio);
+}
+
+static zio_t *
+zio_write_allocate(zio_t *pio, spa_t *spa, int checksum,
+ uint64_t txg, blkptr_t *bp, void *data, uint64_t size,
+ zio_done_func_t *done, void *private, int priority, int flags)
+{
+ zio_t *zio;
+
+ BP_ZERO(bp);
+ BP_SET_LSIZE(bp, size);
+ BP_SET_PSIZE(bp, size);
+ BP_SET_COMPRESS(bp, ZIO_COMPRESS_OFF);
+
+ zio = zio_create(pio, spa, txg, bp, data, size, done, private,
+ ZIO_TYPE_WRITE, priority, flags,
+ ZIO_STAGE_OPEN, ZIO_WRITE_ALLOCATE_PIPELINE);
+
+ zio->io_checksum = checksum;
+ zio->io_compress = ZIO_COMPRESS_OFF;
+
+ return (zio);
+}
+
+zio_t *
+zio_free(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
+ zio_done_func_t *done, void *private)
+{
+ zio_t *zio;
+
+ ASSERT(!BP_IS_HOLE(bp));
+
+ if (txg == spa->spa_syncing_txg &&
+ spa->spa_sync_pass > zio_sync_pass.zp_defer_free) {
+ bplist_enqueue_deferred(&spa->spa_sync_bplist, bp);
+ return (zio_null(pio, spa, NULL, NULL, 0));
+ }
+
+ zio = zio_create(pio, spa, txg, bp, NULL, 0, done, private,
+ ZIO_TYPE_FREE, ZIO_PRIORITY_FREE, ZIO_FLAG_USER,
+ ZIO_STAGE_OPEN, ZIO_FREE_PIPELINE);
+
+ zio->io_bp = &zio->io_bp_copy;
+
+ return (zio);
+}
+
+zio_t *
+zio_claim(zio_t *pio, spa_t *spa, uint64_t txg, blkptr_t *bp,
+ zio_done_func_t *done, void *private)
+{
+ zio_t *zio;
+
+ /*
+ * A claim is an allocation of a specific block. Claims are needed
+ * to support immediate writes in the intent log. The issue is that
+ * immediate writes contain committed data, but in a txg that was
+ * *not* committed. Upon opening the pool after an unclean shutdown,
+ * the intent log claims all blocks that contain immediate write data
+ * so that the SPA knows they're in use.
+ *
+ * All claims *must* be resolved in the first txg -- before the SPA
+ * starts allocating blocks -- so that nothing is allocated twice.
+ */
+ ASSERT3U(spa->spa_uberblock.ub_rootbp.blk_birth, <, spa_first_txg(spa));
+ ASSERT3U(spa_first_txg(spa), <=, txg);
+
+ zio = zio_create(pio, spa, txg, bp, NULL, 0, done, private,
+ ZIO_TYPE_CLAIM, ZIO_PRIORITY_NOW, 0,
+ ZIO_STAGE_OPEN, ZIO_CLAIM_PIPELINE);
+
+ zio->io_bp = &zio->io_bp_copy;
+
+ return (zio);
+}
+
+zio_t *
+zio_ioctl(zio_t *pio, spa_t *spa, vdev_t *vd, int cmd,
+ zio_done_func_t *done, void *private, int priority, int flags)
+{
+ zio_t *zio;
+ int c;
+
+ if (vd->vdev_children == 0) {
+ zio = zio_create(pio, spa, 0, NULL, NULL, 0, done, private,
+ ZIO_TYPE_IOCTL, priority, flags,
+ ZIO_STAGE_OPEN, ZIO_IOCTL_PIPELINE);
+
+ zio->io_vd = vd;
+ zio->io_cmd = cmd;
+ } else {
+ zio = zio_null(pio, spa, NULL, NULL, flags);
+
+ for (c = 0; c < vd->vdev_children; c++)
+ zio_nowait(zio_ioctl(zio, spa, vd->vdev_child[c], cmd,
+ done, private, priority, flags));
+ }
+
+ return (zio);
+}
+
+static void
+zio_phys_bp_init(vdev_t *vd, blkptr_t *bp, uint64_t offset, uint64_t size,
+ int checksum)
+{
+ ASSERT(vd->vdev_children == 0);
+
+ ASSERT(size <= SPA_MAXBLOCKSIZE);
+ ASSERT(P2PHASE(size, SPA_MINBLOCKSIZE) == 0);
+ ASSERT(P2PHASE(offset, SPA_MINBLOCKSIZE) == 0);
+
+ ASSERT(offset + size <= VDEV_LABEL_START_SIZE ||
+ offset >= vd->vdev_psize - VDEV_LABEL_END_SIZE);
+ ASSERT3U(offset + size, <=, vd->vdev_psize);
+
+ BP_ZERO(bp);
+
+ BP_SET_LSIZE(bp, size);
+ BP_SET_PSIZE(bp, size);
+
+ BP_SET_CHECKSUM(bp, checksum);
+ BP_SET_COMPRESS(bp, ZIO_COMPRESS_OFF);
+ BP_SET_BYTEORDER(bp, ZFS_HOST_BYTEORDER);
+
+ if (checksum != ZIO_CHECKSUM_OFF)
+ ZIO_SET_CHECKSUM(&bp->blk_cksum, offset, 0, 0, 0);
+}
+
+zio_t *
+zio_read_phys(zio_t *pio, vdev_t *vd, uint64_t offset, uint64_t size,
+ void *data, int checksum, zio_done_func_t *done, void *private,
+ int priority, int flags)
+{
+ zio_t *zio;
+ blkptr_t blk;
+
+ zio_phys_bp_init(vd, &blk, offset, size, checksum);
+
+ zio = zio_create(pio, vd->vdev_spa, 0, &blk, data, size, done, private,
+ ZIO_TYPE_READ, priority, flags | ZIO_FLAG_PHYSICAL,
+ ZIO_STAGE_OPEN, ZIO_READ_PHYS_PIPELINE);
+
+ zio->io_vd = vd;
+ zio->io_offset = offset;
+
+ /*
+ * Work off our copy of the bp so the caller can free it.
+ */
+ zio->io_bp = &zio->io_bp_copy;
+
+ return (zio);
+}
+
+zio_t *
+zio_write_phys(zio_t *pio, vdev_t *vd, uint64_t offset, uint64_t size,
+ void *data, int checksum, zio_done_func_t *done, void *private,
+ int priority, int flags)
+{
+ zio_block_tail_t *zbt;
+ void *wbuf;
+ zio_t *zio;
+ blkptr_t blk;
+
+ zio_phys_bp_init(vd, &blk, offset, size, checksum);
+
+ zio = zio_create(pio, vd->vdev_spa, 0, &blk, data, size, done, private,
+ ZIO_TYPE_WRITE, priority, flags | ZIO_FLAG_PHYSICAL,
+ ZIO_STAGE_OPEN, ZIO_WRITE_PHYS_PIPELINE);
+
+ zio->io_vd = vd;
+ zio->io_offset = offset;
+
+ zio->io_bp = &zio->io_bp_copy;
+ zio->io_checksum = checksum;
+
+ if (zio_checksum_table[checksum].ci_zbt) {
+ /*
+ * zbt checksums are necessarily destructive -- they modify
+ * one word of the write buffer to hold the verifier/checksum.
+ * Therefore, we must make a local copy in case the data is
+ * being written to multiple places.
+ */
+ wbuf = zio_buf_alloc(size);
+ bcopy(data, wbuf, size);
+ zio_push_transform(zio, wbuf, size, size);
+
+ zbt = (zio_block_tail_t *)((char *)wbuf + size) - 1;
+ zbt->zbt_cksum = blk.blk_cksum;
+ }
+
+ return (zio);
+}
+
+/*
+ * Create a child I/O to do some work for us. It has no associated bp.
+ */
+zio_t *
+zio_vdev_child_io(zio_t *zio, blkptr_t *bp, vdev_t *vd, uint64_t offset,
+ void *data, uint64_t size, int type, int priority, int flags,
+ zio_done_func_t *done, void *private)
+{
+ uint32_t pipeline = ZIO_VDEV_CHILD_PIPELINE;
+ zio_t *cio;
+
+ if (type == ZIO_TYPE_READ && bp != NULL) {
+ /*
+ * If we have the bp, then the child should perform the
+ * checksum and the parent need not. This pushes error
+ * detection as close to the leaves as possible and
+ * eliminates redundant checksums in the interior nodes.
+ */
+ pipeline |= 1U << ZIO_STAGE_CHECKSUM_VERIFY;
+ zio->io_pipeline &= ~(1U << ZIO_STAGE_CHECKSUM_VERIFY);
+ }
+
+ cio = zio_create(zio, zio->io_spa, zio->io_txg, bp, data, size,
+ done, private, type, priority,
+ (zio->io_flags & ZIO_FLAG_VDEV_INHERIT) | ZIO_FLAG_CANFAIL | flags,
+ ZIO_STAGE_VDEV_IO_START - 1, pipeline);
+
+ cio->io_vd = vd;
+ cio->io_offset = offset;
+
+ return (cio);
+}
+
+/*
+ * ==========================================================================
+ * Initiate I/O, either sync or async
+ * ==========================================================================
+ */
+int
+zio_wait(zio_t *zio)
+{
+ int error;
+
+ ASSERT(zio->io_stage == ZIO_STAGE_OPEN);
+
+ zio->io_waiter = curthread;
+
+ zio_next_stage_async(zio);
+
+ mutex_enter(&zio->io_lock);
+ while (zio->io_stalled != ZIO_STAGE_DONE)
+ cv_wait(&zio->io_cv, &zio->io_lock);
+ mutex_exit(&zio->io_lock);
+
+ error = zio->io_error;
+ cv_destroy(&zio->io_cv);
+ mutex_destroy(&zio->io_lock);
+ kmem_cache_free(zio_cache, zio);
+
+ return (error);
+}
+
+void
+zio_nowait(zio_t *zio)
+{
+ zio_next_stage_async(zio);
+}
+
+/*
+ * ==========================================================================
+ * I/O pipeline interlocks: parent/child dependency scoreboarding
+ * ==========================================================================
+ */
+static void
+zio_wait_for_children(zio_t *zio, uint32_t stage, uint64_t *countp)
+{
+ mutex_enter(&zio->io_lock);
+ if (*countp == 0) {
+ ASSERT(zio->io_stalled == 0);
+ mutex_exit(&zio->io_lock);
+ zio_next_stage(zio);
+ } else {
+ zio->io_stalled = stage;
+ mutex_exit(&zio->io_lock);
+ }
+}
+
+static void
+zio_notify_parent(zio_t *zio, uint32_t stage, uint64_t *countp)
+{
+ zio_t *pio = zio->io_parent;
+
+ mutex_enter(&pio->io_lock);
+ if (pio->io_error == 0 && !(zio->io_flags & ZIO_FLAG_DONT_PROPAGATE))
+ pio->io_error = zio->io_error;
+ if (--*countp == 0 && pio->io_stalled == stage) {
+ pio->io_stalled = 0;
+ mutex_exit(&pio->io_lock);
+ zio_next_stage_async(pio);
+ } else {
+ mutex_exit(&pio->io_lock);
+ }
+}
+
+static void
+zio_wait_children_ready(zio_t *zio)
+{
+ zio_wait_for_children(zio, ZIO_STAGE_WAIT_CHILDREN_READY,
+ &zio->io_children_notready);
+}
+
+void
+zio_wait_children_done(zio_t *zio)
+{
+ zio_wait_for_children(zio, ZIO_STAGE_WAIT_CHILDREN_DONE,
+ &zio->io_children_notdone);
+}
+
+static void
+zio_ready(zio_t *zio)
+{
+ zio_t *pio = zio->io_parent;
+
+ if (zio->io_ready)
+ zio->io_ready(zio);
+
+ if (pio != NULL)
+ zio_notify_parent(zio, ZIO_STAGE_WAIT_CHILDREN_READY,
+ &pio->io_children_notready);
+
+ if (zio->io_bp)
+ zio->io_bp_copy = *zio->io_bp;
+
+ zio_next_stage(zio);
+}
+
+static void
+zio_done(zio_t *zio)
+{
+ zio_t *pio = zio->io_parent;
+ spa_t *spa = zio->io_spa;
+ blkptr_t *bp = zio->io_bp;
+ vdev_t *vd = zio->io_vd;
+
+ ASSERT(zio->io_children_notready == 0);
+ ASSERT(zio->io_children_notdone == 0);
+
+ if (bp != NULL) {
+ ASSERT(bp->blk_pad[0] == 0);
+ ASSERT(bp->blk_pad[1] == 0);
+ ASSERT(bp->blk_pad[2] == 0);
+ ASSERT(bcmp(bp, &zio->io_bp_copy, sizeof (blkptr_t)) == 0);
+ if (zio->io_type == ZIO_TYPE_WRITE && !BP_IS_HOLE(bp) &&
+ !(zio->io_flags & ZIO_FLAG_IO_REPAIR)) {
+ ASSERT(!BP_SHOULD_BYTESWAP(bp));
+ if (zio->io_ndvas != 0)
+ ASSERT3U(zio->io_ndvas, <=, BP_GET_NDVAS(bp));
+ ASSERT(BP_COUNT_GANG(bp) == 0 ||
+ (BP_COUNT_GANG(bp) == BP_GET_NDVAS(bp)));
+ }
+ }
+
+ if (vd != NULL)
+ vdev_stat_update(zio);
+
+ if (zio->io_error) {
+ /*
+ * If this I/O is attached to a particular vdev,
+ * generate an error message describing the I/O failure
+ * at the block level. We ignore these errors if the
+ * device is currently unavailable.
+ */
+ if (zio->io_error != ECKSUM && vd != NULL && !vdev_is_dead(vd))
+ zfs_ereport_post(FM_EREPORT_ZFS_IO,
+ zio->io_spa, vd, zio, 0, 0);
+
+ if ((zio->io_error == EIO ||
+ !(zio->io_flags & ZIO_FLAG_SPECULATIVE)) &&
+ zio->io_logical == zio) {
+ /*
+ * For root I/O requests, tell the SPA to log the error
+ * appropriately. Also, generate a logical data
+ * ereport.
+ */
+ spa_log_error(zio->io_spa, zio);
+
+ zfs_ereport_post(FM_EREPORT_ZFS_DATA,
+ zio->io_spa, NULL, zio, 0, 0);
+ }
+
+ /*
+ * For I/O requests that cannot fail, panic appropriately.
+ */
+ if (!(zio->io_flags & ZIO_FLAG_CANFAIL)) {
+ char *blkbuf;
+
+ blkbuf = kmem_alloc(BP_SPRINTF_LEN, KM_NOSLEEP);
+ if (blkbuf) {
+ sprintf_blkptr(blkbuf, BP_SPRINTF_LEN,
+ bp ? bp : &zio->io_bp_copy);
+ }
+ panic("ZFS: %s (%s on %s off %llx: zio %p %s): error "
+ "%d", zio->io_error == ECKSUM ?
+ "bad checksum" : "I/O failure",
+ zio_type_name[zio->io_type],
+ vdev_description(vd),
+ (u_longlong_t)zio->io_offset,
+ zio, blkbuf ? blkbuf : "", zio->io_error);
+ }
+ }
+ zio_clear_transform_stack(zio);
+
+ if (zio->io_done)
+ zio->io_done(zio);
+
+ ASSERT(zio->io_delegate_list == NULL);
+ ASSERT(zio->io_delegate_next == NULL);
+
+ if (pio != NULL) {
+ zio_t *next, *prev;
+
+ mutex_enter(&pio->io_lock);
+ next = zio->io_sibling_next;
+ prev = zio->io_sibling_prev;
+ if (next != NULL)
+ next->io_sibling_prev = prev;
+ if (prev != NULL)
+ prev->io_sibling_next = next;
+ if (pio->io_child == zio)
+ pio->io_child = next;
+ mutex_exit(&pio->io_lock);
+
+ zio_notify_parent(zio, ZIO_STAGE_WAIT_CHILDREN_DONE,
+ &pio->io_children_notdone);
+ }
+
+ /*
+ * Note: this I/O is now done, and will shortly be freed, so there is no
+ * need to clear this (or any other) flag.
+ */
+ if (zio->io_flags & ZIO_FLAG_CONFIG_GRABBED)
+ spa_config_exit(spa, zio);
+
+ if (zio->io_waiter != NULL) {
+ mutex_enter(&zio->io_lock);
+ ASSERT(zio->io_stage == ZIO_STAGE_DONE);
+ zio->io_stalled = zio->io_stage;
+ cv_broadcast(&zio->io_cv);
+ mutex_exit(&zio->io_lock);
+ } else {
+ cv_destroy(&zio->io_cv);
+ mutex_destroy(&zio->io_lock);
+ kmem_cache_free(zio_cache, zio);
+ }
+}
+
+/*
+ * ==========================================================================
+ * Compression support
+ * ==========================================================================
+ */
+static void
+zio_write_compress(zio_t *zio)
+{
+ int compress = zio->io_compress;
+ blkptr_t *bp = zio->io_bp;
+ void *cbuf;
+ uint64_t lsize = zio->io_size;
+ uint64_t csize = lsize;
+ uint64_t cbufsize = 0;
+ int pass;
+
+ if (bp->blk_birth == zio->io_txg) {
+ /*
+ * We're rewriting an existing block, which means we're
+ * working on behalf of spa_sync(). For spa_sync() to
+ * converge, it must eventually be the case that we don't
+ * have to allocate new blocks. But compression changes
+ * the blocksize, which forces a reallocate, and makes
+ * convergence take longer. Therefore, after the first
+ * few passes, stop compressing to ensure convergence.
+ */
+ pass = spa_sync_pass(zio->io_spa);
+ if (pass > zio_sync_pass.zp_dontcompress)
+ compress = ZIO_COMPRESS_OFF;
+ } else {
+ ASSERT(BP_IS_HOLE(bp));
+ pass = 1;
+ }
+
+ if (compress != ZIO_COMPRESS_OFF)
+ if (!zio_compress_data(compress, zio->io_data, zio->io_size,
+ &cbuf, &csize, &cbufsize))
+ compress = ZIO_COMPRESS_OFF;
+
+ if (compress != ZIO_COMPRESS_OFF && csize != 0)
+ zio_push_transform(zio, cbuf, csize, cbufsize);
+
+ /*
+ * The final pass of spa_sync() must be all rewrites, but the first
+ * few passes offer a trade-off: allocating blocks defers convergence,
+ * but newly allocated blocks are sequential, so they can be written
+ * to disk faster. Therefore, we allow the first few passes of
+ * spa_sync() to reallocate new blocks, but force rewrites after that.
+ * There should only be a handful of blocks after pass 1 in any case.
+ */
+ if (bp->blk_birth == zio->io_txg && BP_GET_PSIZE(bp) == csize &&
+ pass > zio_sync_pass.zp_rewrite) {
+ ASSERT(csize != 0);
+ BP_SET_LSIZE(bp, lsize);
+ BP_SET_COMPRESS(bp, compress);
+ zio->io_pipeline = ZIO_REWRITE_PIPELINE;
+ } else {
+ if (bp->blk_birth == zio->io_txg)
+ BP_ZERO(bp);
+ if (csize == 0) {
+ BP_ZERO(bp);
+ zio->io_pipeline = ZIO_WAIT_FOR_CHILDREN_PIPELINE;
+ } else {
+ ASSERT3U(BP_GET_NDVAS(bp), ==, 0);
+ BP_SET_LSIZE(bp, lsize);
+ BP_SET_PSIZE(bp, csize);
+ BP_SET_COMPRESS(bp, compress);
+ zio->io_pipeline = ZIO_WRITE_ALLOCATE_PIPELINE;
+ }
+ }
+
+ zio_next_stage(zio);
+}
+
+static void
+zio_read_decompress(zio_t *zio)
+{
+ blkptr_t *bp = zio->io_bp;
+ void *data;
+ uint64_t size;
+ uint64_t bufsize;
+ int compress = BP_GET_COMPRESS(bp);
+
+ ASSERT(compress != ZIO_COMPRESS_OFF);
+
+ zio_pop_transform(zio, &data, &size, &bufsize);
+
+ if (zio_decompress_data(compress, data, size,
+ zio->io_data, zio->io_size))
+ zio->io_error = EIO;
+
+ zio_buf_free(data, bufsize);
+
+ zio_next_stage(zio);
+}
+
+/*
+ * ==========================================================================
+ * Gang block support
+ * ==========================================================================
+ */
+static void
+zio_gang_pipeline(zio_t *zio)
+{
+ /*
+ * By default, the pipeline assumes that we're dealing with a gang
+ * block. If we're not, strip out any gang-specific stages.
+ */
+ if (!BP_IS_GANG(zio->io_bp))
+ zio->io_pipeline &= ~ZIO_GANG_STAGES;
+
+ zio_next_stage(zio);
+}
+
+static void
+zio_gang_byteswap(zio_t *zio)
+{
+ ASSERT(zio->io_size == SPA_GANGBLOCKSIZE);
+
+ if (BP_SHOULD_BYTESWAP(zio->io_bp))
+ byteswap_uint64_array(zio->io_data, zio->io_size);
+}
+
+static void
+zio_get_gang_header(zio_t *zio)
+{
+ blkptr_t *bp = zio->io_bp;
+ uint64_t gsize = SPA_GANGBLOCKSIZE;
+ void *gbuf = zio_buf_alloc(gsize);
+
+ ASSERT(BP_IS_GANG(bp));
+
+ zio_push_transform(zio, gbuf, gsize, gsize);
+
+ zio_nowait(zio_create(zio, zio->io_spa, bp->blk_birth, bp, gbuf, gsize,
+ NULL, NULL, ZIO_TYPE_READ, zio->io_priority,
+ zio->io_flags & ZIO_FLAG_GANG_INHERIT,
+ ZIO_STAGE_OPEN, ZIO_READ_PIPELINE));
+
+ zio_wait_children_done(zio);
+}
+
+static void
+zio_read_gang_members(zio_t *zio)
+{
+ zio_gbh_phys_t *gbh;
+ uint64_t gsize, gbufsize, loff, lsize;
+ int i;
+
+ ASSERT(BP_IS_GANG(zio->io_bp));
+
+ zio_gang_byteswap(zio);
+ zio_pop_transform(zio, (void **)&gbh, &gsize, &gbufsize);
+
+ for (loff = 0, i = 0; loff != zio->io_size; loff += lsize, i++) {
+ blkptr_t *gbp = &gbh->zg_blkptr[i];
+ lsize = BP_GET_PSIZE(gbp);
+
+ ASSERT(BP_GET_COMPRESS(gbp) == ZIO_COMPRESS_OFF);
+ ASSERT3U(lsize, ==, BP_GET_LSIZE(gbp));
+ ASSERT3U(loff + lsize, <=, zio->io_size);
+ ASSERT(i < SPA_GBH_NBLKPTRS);
+ ASSERT(!BP_IS_HOLE(gbp));
+
+ zio_nowait(zio_read(zio, zio->io_spa, gbp,
+ (char *)zio->io_data + loff, lsize, NULL, NULL,
+ zio->io_priority, zio->io_flags & ZIO_FLAG_GANG_INHERIT,
+ &zio->io_bookmark));
+ }
+
+ zio_buf_free(gbh, gbufsize);
+ zio_wait_children_done(zio);
+}
+
+static void
+zio_rewrite_gang_members(zio_t *zio)
+{
+ zio_gbh_phys_t *gbh;
+ uint64_t gsize, gbufsize, loff, lsize;
+ int i;
+
+ ASSERT(BP_IS_GANG(zio->io_bp));
+ ASSERT3U(zio->io_size, ==, SPA_GANGBLOCKSIZE);
+
+ zio_gang_byteswap(zio);
+ zio_pop_transform(zio, (void **)&gbh, &gsize, &gbufsize);
+
+ ASSERT(gsize == gbufsize);
+
+ for (loff = 0, i = 0; loff != zio->io_size; loff += lsize, i++) {
+ blkptr_t *gbp = &gbh->zg_blkptr[i];
+ lsize = BP_GET_PSIZE(gbp);
+
+ ASSERT(BP_GET_COMPRESS(gbp) == ZIO_COMPRESS_OFF);
+ ASSERT3U(lsize, ==, BP_GET_LSIZE(gbp));
+ ASSERT3U(loff + lsize, <=, zio->io_size);
+ ASSERT(i < SPA_GBH_NBLKPTRS);
+ ASSERT(!BP_IS_HOLE(gbp));
+
+ zio_nowait(zio_rewrite(zio, zio->io_spa, zio->io_checksum,
+ zio->io_txg, gbp, (char *)zio->io_data + loff, lsize,
+ NULL, NULL, zio->io_priority, zio->io_flags,
+ &zio->io_bookmark));
+ }
+
+ zio_push_transform(zio, gbh, gsize, gbufsize);
+ zio_wait_children_ready(zio);
+}
+
+static void
+zio_free_gang_members(zio_t *zio)
+{
+ zio_gbh_phys_t *gbh;
+ uint64_t gsize, gbufsize;
+ int i;
+
+ ASSERT(BP_IS_GANG(zio->io_bp));
+
+ zio_gang_byteswap(zio);
+ zio_pop_transform(zio, (void **)&gbh, &gsize, &gbufsize);
+
+ for (i = 0; i < SPA_GBH_NBLKPTRS; i++) {
+ blkptr_t *gbp = &gbh->zg_blkptr[i];
+
+ if (BP_IS_HOLE(gbp))
+ continue;
+ zio_nowait(zio_free(zio, zio->io_spa, zio->io_txg,
+ gbp, NULL, NULL));
+ }
+
+ zio_buf_free(gbh, gbufsize);
+ zio_next_stage(zio);
+}
+
+static void
+zio_claim_gang_members(zio_t *zio)
+{
+ zio_gbh_phys_t *gbh;
+ uint64_t gsize, gbufsize;
+ int i;
+
+ ASSERT(BP_IS_GANG(zio->io_bp));
+
+ zio_gang_byteswap(zio);
+ zio_pop_transform(zio, (void **)&gbh, &gsize, &gbufsize);
+
+ for (i = 0; i < SPA_GBH_NBLKPTRS; i++) {
+ blkptr_t *gbp = &gbh->zg_blkptr[i];
+ if (BP_IS_HOLE(gbp))
+ continue;
+ zio_nowait(zio_claim(zio, zio->io_spa, zio->io_txg,
+ gbp, NULL, NULL));
+ }
+
+ zio_buf_free(gbh, gbufsize);
+ zio_next_stage(zio);
+}
+
+static void
+zio_write_allocate_gang_member_done(zio_t *zio)
+{
+ zio_t *pio = zio->io_parent;
+ dva_t *cdva = zio->io_bp->blk_dva;
+ dva_t *pdva = pio->io_bp->blk_dva;
+ uint64_t asize;
+ int d;
+
+ ASSERT3U(pio->io_ndvas, ==, zio->io_ndvas);
+ ASSERT3U(BP_GET_NDVAS(zio->io_bp), <=, BP_GET_NDVAS(pio->io_bp));
+ ASSERT3U(zio->io_ndvas, <=, BP_GET_NDVAS(zio->io_bp));
+ ASSERT3U(pio->io_ndvas, <=, BP_GET_NDVAS(pio->io_bp));
+
+ mutex_enter(&pio->io_lock);
+ for (d = 0; d < BP_GET_NDVAS(pio->io_bp); d++) {
+ ASSERT(DVA_GET_GANG(&pdva[d]));
+ asize = DVA_GET_ASIZE(&pdva[d]);
+ asize += DVA_GET_ASIZE(&cdva[d]);
+ DVA_SET_ASIZE(&pdva[d], asize);
+ }
+ mutex_exit(&pio->io_lock);
+}
+
+static void
+zio_write_allocate_gang_members(zio_t *zio)
+{
+ blkptr_t *bp = zio->io_bp;
+ dva_t *dva = bp->blk_dva;
+ spa_t *spa = zio->io_spa;
+ zio_gbh_phys_t *gbh;
+ uint64_t txg = zio->io_txg;
+ uint64_t resid = zio->io_size;
+ uint64_t maxalloc = P2ROUNDUP(zio->io_size >> 1, SPA_MINBLOCKSIZE);
+ uint64_t gsize, loff, lsize;
+ uint32_t gbps_left;
+ int ndvas = zio->io_ndvas;
+ int gbh_ndvas = MIN(ndvas + 1, spa_max_replication(spa));
+ int error;
+ int i, d;
+
+ gsize = SPA_GANGBLOCKSIZE;
+ gbps_left = SPA_GBH_NBLKPTRS;
+
+ error = metaslab_alloc(spa, gsize, bp, gbh_ndvas, txg, NULL, B_FALSE);
+ if (error == ENOSPC)
+ panic("can't allocate gang block header");
+ ASSERT(error == 0);
+
+ for (d = 0; d < gbh_ndvas; d++)
+ DVA_SET_GANG(&dva[d], 1);
+
+ bp->blk_birth = txg;
+
+ gbh = zio_buf_alloc(gsize);
+ bzero(gbh, gsize);
+
+ /* We need to test multi-level gang blocks */
+ if (maxalloc >= zio_gang_bang && (lbolt & 0x1) == 0)
+ maxalloc = MAX(maxalloc >> 2, SPA_MINBLOCKSIZE);
+
+ for (loff = 0, i = 0; loff != zio->io_size;
+ loff += lsize, resid -= lsize, gbps_left--, i++) {
+ blkptr_t *gbp = &gbh->zg_blkptr[i];
+ dva = gbp->blk_dva;
+
+ ASSERT(gbps_left != 0);
+ maxalloc = MIN(maxalloc, resid);
+
+ while (resid <= maxalloc * gbps_left) {
+ error = metaslab_alloc(spa, maxalloc, gbp, ndvas,
+ txg, bp, B_FALSE);
+ if (error == 0)
+ break;
+ ASSERT3U(error, ==, ENOSPC);
+ if (maxalloc == SPA_MINBLOCKSIZE)
+ panic("really out of space");
+ maxalloc = P2ROUNDUP(maxalloc >> 1, SPA_MINBLOCKSIZE);
+ }
+
+ if (resid <= maxalloc * gbps_left) {
+ lsize = maxalloc;
+ BP_SET_LSIZE(gbp, lsize);
+ BP_SET_PSIZE(gbp, lsize);
+ BP_SET_COMPRESS(gbp, ZIO_COMPRESS_OFF);
+ gbp->blk_birth = txg;
+ zio_nowait(zio_rewrite(zio, spa,
+ zio->io_checksum, txg, gbp,
+ (char *)zio->io_data + loff, lsize,
+ zio_write_allocate_gang_member_done, NULL,
+ zio->io_priority, zio->io_flags,
+ &zio->io_bookmark));
+ } else {
+ lsize = P2ROUNDUP(resid / gbps_left, SPA_MINBLOCKSIZE);
+ ASSERT(lsize != SPA_MINBLOCKSIZE);
+ zio_nowait(zio_write_allocate(zio, spa,
+ zio->io_checksum, txg, gbp,
+ (char *)zio->io_data + loff, lsize,
+ zio_write_allocate_gang_member_done, NULL,
+ zio->io_priority, zio->io_flags));
+ }
+ }
+
+ ASSERT(resid == 0 && loff == zio->io_size);
+
+ zio->io_pipeline |= 1U << ZIO_STAGE_GANG_CHECKSUM_GENERATE;
+
+ zio_push_transform(zio, gbh, gsize, gsize);
+ /*
+ * As much as we'd like this to be zio_wait_children_ready(),
+ * updating our ASIZE doesn't happen until the io_done callback,
+ * so we have to wait for that to finish in order for our BP
+ * to be stable.
+ */
+ zio_wait_children_done(zio);
+}
+
+/*
+ * ==========================================================================
+ * Allocate and free blocks
+ * ==========================================================================
+ */
+static void
+zio_dva_allocate(zio_t *zio)
+{
+ blkptr_t *bp = zio->io_bp;
+ int error;
+
+ ASSERT(BP_IS_HOLE(bp));
+ ASSERT3U(BP_GET_NDVAS(bp), ==, 0);
+ ASSERT3U(zio->io_ndvas, >, 0);
+ ASSERT3U(zio->io_ndvas, <=, spa_max_replication(zio->io_spa));
+
+ /* For testing, make some blocks above a certain size be gang blocks */
+ if (zio->io_size >= zio_gang_bang && (lbolt & 0x3) == 0) {
+ zio_write_allocate_gang_members(zio);
+ return;
+ }
+
+ ASSERT3U(zio->io_size, ==, BP_GET_PSIZE(bp));
+
+ error = metaslab_alloc(zio->io_spa, zio->io_size, bp, zio->io_ndvas,
+ zio->io_txg, NULL, B_FALSE);
+
+ if (error == 0) {
+ bp->blk_birth = zio->io_txg;
+ } else if (error == ENOSPC) {
+ if (zio->io_size == SPA_MINBLOCKSIZE)
+ panic("really, truly out of space");
+ zio_write_allocate_gang_members(zio);
+ return;
+ } else {
+ zio->io_error = error;
+ }
+ zio_next_stage(zio);
+}
+
+static void
+zio_dva_free(zio_t *zio)
+{
+ blkptr_t *bp = zio->io_bp;
+
+ metaslab_free(zio->io_spa, bp, zio->io_txg, B_FALSE);
+
+ BP_ZERO(bp);
+
+ zio_next_stage(zio);
+}
+
+static void
+zio_dva_claim(zio_t *zio)
+{
+ zio->io_error = metaslab_claim(zio->io_spa, zio->io_bp, zio->io_txg);
+
+ zio_next_stage(zio);
+}
+
+/*
+ * ==========================================================================
+ * Read and write to physical devices
+ * ==========================================================================
+ */
+
+static void
+zio_vdev_io_start(zio_t *zio)
+{
+ vdev_t *vd = zio->io_vd;
+ vdev_t *tvd = vd ? vd->vdev_top : NULL;
+ blkptr_t *bp = zio->io_bp;
+ uint64_t align;
+
+ if (vd == NULL) {
+ /* The mirror_ops handle multiple DVAs in a single BP */
+ vdev_mirror_ops.vdev_op_io_start(zio);
+ return;
+ }
+
+ align = 1ULL << tvd->vdev_ashift;
+
+ if (zio->io_retries == 0 && vd == tvd)
+ zio->io_flags |= ZIO_FLAG_FAILFAST;
+
+ if (!(zio->io_flags & ZIO_FLAG_PHYSICAL) &&
+ vd->vdev_children == 0) {
+ zio->io_flags |= ZIO_FLAG_PHYSICAL;
+ zio->io_offset += VDEV_LABEL_START_SIZE;
+ }
+
+ if (P2PHASE(zio->io_size, align) != 0) {
+ uint64_t asize = P2ROUNDUP(zio->io_size, align);
+ char *abuf = zio_buf_alloc(asize);
+ ASSERT(vd == tvd);
+ if (zio->io_type == ZIO_TYPE_WRITE) {
+ bcopy(zio->io_data, abuf, zio->io_size);
+ bzero(abuf + zio->io_size, asize - zio->io_size);
+ }
+ zio_push_transform(zio, abuf, asize, asize);
+ ASSERT(!(zio->io_flags & ZIO_FLAG_SUBBLOCK));
+ zio->io_flags |= ZIO_FLAG_SUBBLOCK;
+ }
+
+ ASSERT(P2PHASE(zio->io_offset, align) == 0);
+ ASSERT(P2PHASE(zio->io_size, align) == 0);
+ ASSERT(bp == NULL ||
+ P2ROUNDUP(ZIO_GET_IOSIZE(zio), align) == zio->io_size);
+ ASSERT(zio->io_type != ZIO_TYPE_WRITE || (spa_mode & FWRITE));
+
+ vdev_io_start(zio);
+
+ /* zio_next_stage_async() gets called from io completion interrupt */
+}
+
+static void
+zio_vdev_io_done(zio_t *zio)
+{
+ if (zio->io_vd == NULL)
+ /* The mirror_ops handle multiple DVAs in a single BP */
+ vdev_mirror_ops.vdev_op_io_done(zio);
+ else
+ vdev_io_done(zio);
+}
+
+/* XXPOLICY */
+boolean_t
+zio_should_retry(zio_t *zio)
+{
+ vdev_t *vd = zio->io_vd;
+
+ if (zio->io_error == 0)
+ return (B_FALSE);
+ if (zio->io_delegate_list != NULL)
+ return (B_FALSE);
+ if (vd && vd != vd->vdev_top)
+ return (B_FALSE);
+ if (zio->io_flags & ZIO_FLAG_DONT_RETRY)
+ return (B_FALSE);
+ if (zio->io_retries > 0)
+ return (B_FALSE);
+
+ return (B_TRUE);
+}
+
+static void
+zio_vdev_io_assess(zio_t *zio)
+{
+ vdev_t *vd = zio->io_vd;
+ vdev_t *tvd = vd ? vd->vdev_top : NULL;
+
+ ASSERT(zio->io_vsd == NULL);
+
+ if (zio->io_flags & ZIO_FLAG_SUBBLOCK) {
+ void *abuf;
+ uint64_t asize;
+ ASSERT(vd == tvd);
+ zio_pop_transform(zio, &abuf, &asize, &asize);
+ if (zio->io_type == ZIO_TYPE_READ)
+ bcopy(abuf, zio->io_data, zio->io_size);
+ zio_buf_free(abuf, asize);
+ zio->io_flags &= ~ZIO_FLAG_SUBBLOCK;
+ }
+
+ if (zio_injection_enabled && !zio->io_error)
+ zio->io_error = zio_handle_fault_injection(zio, EIO);
+
+ /*
+ * If the I/O failed, determine whether we should attempt to retry it.
+ */
+ /* XXPOLICY */
+ if (zio_should_retry(zio)) {
+ ASSERT(tvd == vd);
+
+ zio->io_retries++;
+ zio->io_error = 0;
+ zio->io_flags &= ZIO_FLAG_VDEV_INHERIT |
+ ZIO_FLAG_CONFIG_GRABBED;
+ /* XXPOLICY */
+ zio->io_flags &= ~ZIO_FLAG_FAILFAST;
+ zio->io_flags |= ZIO_FLAG_DONT_CACHE;
+ zio->io_stage = ZIO_STAGE_VDEV_IO_START - 1;
+
+ dprintf("retry #%d for %s to %s offset %llx\n",
+ zio->io_retries, zio_type_name[zio->io_type],
+ vdev_description(vd), zio->io_offset);
+
+ zio_next_stage_async(zio);
+ return;
+ }
+
+ if (zio->io_error != 0 && zio->io_error != ECKSUM &&
+ !(zio->io_flags & ZIO_FLAG_SPECULATIVE) && vd) {
+ /*
+ * Poor man's hotplug support. Even if we're done retrying this
+ * I/O, try to reopen the vdev to see if it's still attached.
+ * To avoid excessive thrashing, we only try it once a minute.
+ * This also has the effect of detecting when missing devices
+ * have come back, by polling the device once a minute.
+ *
+ * We need to do this asynchronously because we can't grab
+ * all the necessary locks way down here.
+ */
+ if (gethrtime() - vd->vdev_last_try > 60ULL * NANOSEC) {
+ vd->vdev_last_try = gethrtime();
+ tvd->vdev_reopen_wanted = 1;
+ spa_async_request(vd->vdev_spa, SPA_ASYNC_REOPEN);
+ }
+ }
+
+ zio_next_stage(zio);
+}
+
+void
+zio_vdev_io_reissue(zio_t *zio)
+{
+ ASSERT(zio->io_stage == ZIO_STAGE_VDEV_IO_START);
+ ASSERT(zio->io_error == 0);
+
+ zio->io_stage--;
+}
+
+void
+zio_vdev_io_redone(zio_t *zio)
+{
+ ASSERT(zio->io_stage == ZIO_STAGE_VDEV_IO_DONE);
+
+ zio->io_stage--;
+}
+
+void
+zio_vdev_io_bypass(zio_t *zio)
+{
+ ASSERT(zio->io_stage == ZIO_STAGE_VDEV_IO_START);
+ ASSERT(zio->io_error == 0);
+
+ zio->io_flags |= ZIO_FLAG_IO_BYPASS;
+ zio->io_stage = ZIO_STAGE_VDEV_IO_ASSESS - 1;
+}
+
+/*
+ * ==========================================================================
+ * Generate and verify checksums
+ * ==========================================================================
+ */
+static void
+zio_checksum_generate(zio_t *zio)
+{
+ int checksum = zio->io_checksum;
+ blkptr_t *bp = zio->io_bp;
+
+ ASSERT3U(zio->io_size, ==, BP_GET_PSIZE(bp));
+
+ BP_SET_CHECKSUM(bp, checksum);
+ BP_SET_BYTEORDER(bp, ZFS_HOST_BYTEORDER);
+
+ zio_checksum(checksum, &bp->blk_cksum, zio->io_data, zio->io_size);
+
+ zio_next_stage(zio);
+}
+
+static void
+zio_gang_checksum_generate(zio_t *zio)
+{
+ zio_cksum_t zc;
+ zio_gbh_phys_t *gbh = zio->io_data;
+
+ ASSERT(BP_IS_GANG(zio->io_bp));
+ ASSERT3U(zio->io_size, ==, SPA_GANGBLOCKSIZE);
+
+ zio_set_gang_verifier(zio, &gbh->zg_tail.zbt_cksum);
+
+ zio_checksum(ZIO_CHECKSUM_GANG_HEADER, &zc, zio->io_data, zio->io_size);
+
+ zio_next_stage(zio);
+}
+
+static void
+zio_checksum_verify(zio_t *zio)
+{
+ if (zio->io_bp != NULL) {
+ zio->io_error = zio_checksum_error(zio);
+ if (zio->io_error && !(zio->io_flags & ZIO_FLAG_SPECULATIVE))
+ zfs_ereport_post(FM_EREPORT_ZFS_CHECKSUM,
+ zio->io_spa, zio->io_vd, zio, 0, 0);
+ }
+
+ zio_next_stage(zio);
+}
+
+/*
+ * Called by RAID-Z to ensure we don't compute the checksum twice.
+ */
+void
+zio_checksum_verified(zio_t *zio)
+{
+ zio->io_pipeline &= ~(1U << ZIO_STAGE_CHECKSUM_VERIFY);
+}
+
+/*
+ * Set the external verifier for a gang block based on stuff in the bp
+ */
+void
+zio_set_gang_verifier(zio_t *zio, zio_cksum_t *zcp)
+{
+ blkptr_t *bp = zio->io_bp;
+
+ zcp->zc_word[0] = DVA_GET_VDEV(BP_IDENTITY(bp));
+ zcp->zc_word[1] = DVA_GET_OFFSET(BP_IDENTITY(bp));
+ zcp->zc_word[2] = bp->blk_birth;
+ zcp->zc_word[3] = 0;
+}
+
+/*
+ * ==========================================================================
+ * Define the pipeline
+ * ==========================================================================
+ */
+typedef void zio_pipe_stage_t(zio_t *zio);
+
+static void
+zio_badop(zio_t *zio)
+{
+ panic("Invalid I/O pipeline stage %u for zio %p", zio->io_stage, zio);
+}
+
+zio_pipe_stage_t *zio_pipeline[ZIO_STAGE_DONE + 2] = {
+ zio_badop,
+ zio_wait_children_ready,
+ zio_write_compress,
+ zio_checksum_generate,
+ zio_gang_pipeline,
+ zio_get_gang_header,
+ zio_rewrite_gang_members,
+ zio_free_gang_members,
+ zio_claim_gang_members,
+ zio_dva_allocate,
+ zio_dva_free,
+ zio_dva_claim,
+ zio_gang_checksum_generate,
+ zio_ready,
+ zio_vdev_io_start,
+ zio_vdev_io_done,
+ zio_vdev_io_assess,
+ zio_wait_children_done,
+ zio_checksum_verify,
+ zio_read_gang_members,
+ zio_read_decompress,
+ zio_done,
+ zio_badop
+};
+
+/*
+ * Move an I/O to the next stage of the pipeline and execute that stage.
+ * There's no locking on io_stage because there's no legitimate way for
+ * multiple threads to be attempting to process the same I/O.
+ */
+void
+zio_next_stage(zio_t *zio)
+{
+ uint32_t pipeline = zio->io_pipeline;
+
+ ASSERT(!MUTEX_HELD(&zio->io_lock));
+
+ if (zio->io_error) {
+ dprintf("zio %p vdev %s offset %llx stage %d error %d\n",
+ zio, vdev_description(zio->io_vd),
+ zio->io_offset, zio->io_stage, zio->io_error);
+ if (((1U << zio->io_stage) & ZIO_VDEV_IO_PIPELINE) == 0)
+ pipeline &= ZIO_ERROR_PIPELINE_MASK;
+ }
+
+ while (((1U << ++zio->io_stage) & pipeline) == 0)
+ continue;
+
+ ASSERT(zio->io_stage <= ZIO_STAGE_DONE);
+ ASSERT(zio->io_stalled == 0);
+
+ /*
+ * See the comment in zio_next_stage_async() about per-CPU taskqs.
+ */
+ if (((1U << zio->io_stage) & zio->io_async_stages) &&
+ (zio->io_stage == ZIO_STAGE_WRITE_COMPRESS) &&
+ !(zio->io_flags & ZIO_FLAG_METADATA)) {
+ taskq_t *tq = zio->io_spa->spa_zio_issue_taskq[zio->io_type];
+ (void) taskq_dispatch(tq,
+ (task_func_t *)zio_pipeline[zio->io_stage], zio, TQ_SLEEP);
+ } else {
+ zio_pipeline[zio->io_stage](zio);
+ }
+}
+
+void
+zio_next_stage_async(zio_t *zio)
+{
+ taskq_t *tq;
+ uint32_t pipeline = zio->io_pipeline;
+
+ ASSERT(!MUTEX_HELD(&zio->io_lock));
+
+ if (zio->io_error) {
+ dprintf("zio %p vdev %s offset %llx stage %d error %d\n",
+ zio, vdev_description(zio->io_vd),
+ zio->io_offset, zio->io_stage, zio->io_error);
+ if (((1U << zio->io_stage) & ZIO_VDEV_IO_PIPELINE) == 0)
+ pipeline &= ZIO_ERROR_PIPELINE_MASK;
+ }
+
+ while (((1U << ++zio->io_stage) & pipeline) == 0)
+ continue;
+
+ ASSERT(zio->io_stage <= ZIO_STAGE_DONE);
+ ASSERT(zio->io_stalled == 0);
+
+ /*
+ * For performance, we'll probably want two sets of task queues:
+ * per-CPU issue taskqs and per-CPU completion taskqs. The per-CPU
+ * part is for read performance: since we have to make a pass over
+ * the data to checksum it anyway, we want to do this on the same CPU
+ * that issued the read, because (assuming CPU scheduling affinity)
+ * that thread is probably still there. Getting this optimization
+ * right avoids performance-hostile cache-to-cache transfers.
+ *
+ * Note that having two sets of task queues is also necessary for
+ * correctness: if all of the issue threads get bogged down waiting
+ * for dependent reads (e.g. metaslab freelist) to complete, then
+ * there won't be any threads available to service I/O completion
+ * interrupts.
+ */
+ if ((1U << zio->io_stage) & zio->io_async_stages) {
+ if (zio->io_stage < ZIO_STAGE_VDEV_IO_DONE)
+ tq = zio->io_spa->spa_zio_issue_taskq[zio->io_type];
+ else
+ tq = zio->io_spa->spa_zio_intr_taskq[zio->io_type];
+ (void) taskq_dispatch(tq,
+ (task_func_t *)zio_pipeline[zio->io_stage], zio, TQ_SLEEP);
+ } else {
+ zio_pipeline[zio->io_stage](zio);
+ }
+}
+
+static boolean_t
+zio_alloc_should_fail(void)
+{
+ static uint16_t allocs = 0;
+
+ return (P2PHASE(allocs++, 1U<<zio_zil_fail_shift) == 0);
+}
+
+/*
+ * Try to allocate an intent log block. Return 0 on success, errno on failure.
+ */
+int
+zio_alloc_blk(spa_t *spa, uint64_t size, blkptr_t *new_bp, blkptr_t *old_bp,
+ uint64_t txg)
+{
+ int error;
+
+ spa_config_enter(spa, RW_READER, FTAG);
+
+ if (zio_zil_fail_shift && zio_alloc_should_fail()) {
+ spa_config_exit(spa, FTAG);
+ return (ENOSPC);
+ }
+
+ /*
+ * We were passed the previous log blocks dva_t in bp->blk_dva[0].
+ */
+ error = metaslab_alloc(spa, size, new_bp, 1, txg, old_bp, B_TRUE);
+
+ if (error == 0) {
+ BP_SET_LSIZE(new_bp, size);
+ BP_SET_PSIZE(new_bp, size);
+ BP_SET_COMPRESS(new_bp, ZIO_COMPRESS_OFF);
+ BP_SET_CHECKSUM(new_bp, ZIO_CHECKSUM_ZILOG);
+ BP_SET_TYPE(new_bp, DMU_OT_INTENT_LOG);
+ BP_SET_LEVEL(new_bp, 0);
+ BP_SET_BYTEORDER(new_bp, ZFS_HOST_BYTEORDER);
+ new_bp->blk_birth = txg;
+ }
+
+ spa_config_exit(spa, FTAG);
+
+ return (error);
+}
+
+/*
+ * Free an intent log block. We know it can't be a gang block, so there's
+ * nothing to do except metaslab_free() it.
+ */
+void
+zio_free_blk(spa_t *spa, blkptr_t *bp, uint64_t txg)
+{
+ ASSERT(!BP_IS_GANG(bp));
+
+ spa_config_enter(spa, RW_READER, FTAG);
+
+ metaslab_free(spa, bp, txg, B_FALSE);
+
+ spa_config_exit(spa, FTAG);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zio_checksum.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zio_checksum.c
new file mode 100644
index 0000000..f0d9a14
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zio_checksum.c
@@ -0,0 +1,172 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/spa.h>
+#include <sys/zio.h>
+#include <sys/zio_checksum.h>
+
+/*
+ * Checksum vectors.
+ *
+ * In the SPA, everything is checksummed. We support checksum vectors
+ * for three distinct reasons:
+ *
+ * 1. Different kinds of data need different levels of protection.
+ * For SPA metadata, we always want a very strong checksum.
+ * For user data, we let users make the trade-off between speed
+ * and checksum strength.
+ *
+ * 2. Cryptographic hash and MAC algorithms are an area of active research.
+ * It is likely that in future hash functions will be at least as strong
+ * as current best-of-breed, and may be substantially faster as well.
+ * We want the ability to take advantage of these new hashes as soon as
+ * they become available.
+ *
+ * 3. If someone develops hardware that can compute a strong hash quickly,
+ * we want the ability to take advantage of that hardware.
+ *
+ * Of course, we don't want a checksum upgrade to invalidate existing
+ * data, so we store the checksum *function* in five bits of the DVA.
+ * This gives us room for up to 32 different checksum functions.
+ *
+ * When writing a block, we always checksum it with the latest-and-greatest
+ * checksum function of the appropriate strength. When reading a block,
+ * we compare the expected checksum against the actual checksum, which we
+ * compute via the checksum function specified in the DVA encoding.
+ */
+
+/*ARGSUSED*/
+static void
+zio_checksum_off(const void *buf, uint64_t size, zio_cksum_t *zcp)
+{
+ ZIO_SET_CHECKSUM(zcp, 0, 0, 0, 0);
+}
+
+zio_checksum_info_t zio_checksum_table[ZIO_CHECKSUM_FUNCTIONS] = {
+ {{NULL, NULL}, 0, 0, "inherit"},
+ {{NULL, NULL}, 0, 0, "on"},
+ {{zio_checksum_off, zio_checksum_off}, 0, 0, "off"},
+ {{zio_checksum_SHA256, zio_checksum_SHA256}, 1, 1, "label"},
+ {{zio_checksum_SHA256, zio_checksum_SHA256}, 1, 1, "gang_header"},
+ {{fletcher_2_native, fletcher_2_byteswap}, 0, 1, "zilog"},
+ {{fletcher_2_native, fletcher_2_byteswap}, 0, 0, "fletcher2"},
+ {{fletcher_4_native, fletcher_4_byteswap}, 1, 0, "fletcher4"},
+ {{zio_checksum_SHA256, zio_checksum_SHA256}, 1, 0, "SHA256"},
+};
+
+uint8_t
+zio_checksum_select(uint8_t child, uint8_t parent)
+{
+ ASSERT(child < ZIO_CHECKSUM_FUNCTIONS);
+ ASSERT(parent < ZIO_CHECKSUM_FUNCTIONS);
+ ASSERT(parent != ZIO_CHECKSUM_INHERIT && parent != ZIO_CHECKSUM_ON);
+
+ if (child == ZIO_CHECKSUM_INHERIT)
+ return (parent);
+
+ if (child == ZIO_CHECKSUM_ON)
+ return (ZIO_CHECKSUM_ON_VALUE);
+
+ return (child);
+}
+
+/*
+ * Generate the checksum.
+ */
+void
+zio_checksum(uint_t checksum, zio_cksum_t *zcp, void *data, uint64_t size)
+{
+ zio_block_tail_t *zbt = (zio_block_tail_t *)((char *)data + size) - 1;
+ zio_checksum_info_t *ci = &zio_checksum_table[checksum];
+ zio_cksum_t zbt_cksum;
+
+ ASSERT(checksum < ZIO_CHECKSUM_FUNCTIONS);
+ ASSERT(ci->ci_func[0] != NULL);
+
+ if (ci->ci_zbt) {
+ *zcp = zbt->zbt_cksum;
+ zbt->zbt_magic = ZBT_MAGIC;
+ ci->ci_func[0](data, size, &zbt_cksum);
+ zbt->zbt_cksum = zbt_cksum;
+ } else {
+ ci->ci_func[0](data, size, zcp);
+ }
+}
+
+int
+zio_checksum_error(zio_t *zio)
+{
+ blkptr_t *bp = zio->io_bp;
+ zio_cksum_t zc = bp->blk_cksum;
+ uint_t checksum = BP_IS_GANG(bp) ? ZIO_CHECKSUM_GANG_HEADER :
+ BP_GET_CHECKSUM(bp);
+ int byteswap = BP_SHOULD_BYTESWAP(bp);
+ void *data = zio->io_data;
+ uint64_t size = ZIO_GET_IOSIZE(zio);
+ zio_block_tail_t *zbt = (zio_block_tail_t *)((char *)data + size) - 1;
+ zio_checksum_info_t *ci = &zio_checksum_table[checksum];
+ zio_cksum_t actual_cksum, expected_cksum;
+
+ if (checksum >= ZIO_CHECKSUM_FUNCTIONS || ci->ci_func[0] == NULL)
+ return (EINVAL);
+
+ if (ci->ci_zbt) {
+ if (checksum == ZIO_CHECKSUM_GANG_HEADER)
+ zio_set_gang_verifier(zio, &zc);
+
+ if (zbt->zbt_magic == BSWAP_64(ZBT_MAGIC)) {
+ expected_cksum = zbt->zbt_cksum;
+ byteswap_uint64_array(&expected_cksum,
+ sizeof (zio_cksum_t));
+ zbt->zbt_cksum = zc;
+ byteswap_uint64_array(&zbt->zbt_cksum,
+ sizeof (zio_cksum_t));
+ ci->ci_func[1](data, size, &actual_cksum);
+ zbt->zbt_cksum = expected_cksum;
+ byteswap_uint64_array(&zbt->zbt_cksum,
+ sizeof (zio_cksum_t));
+ } else {
+ expected_cksum = zbt->zbt_cksum;
+ zbt->zbt_cksum = zc;
+ ci->ci_func[0](data, size, &actual_cksum);
+ zbt->zbt_cksum = expected_cksum;
+ }
+ zc = expected_cksum;
+ } else {
+ ASSERT(!BP_IS_GANG(bp));
+ ci->ci_func[byteswap](data, size, &actual_cksum);
+ }
+
+ if (!ZIO_CHECKSUM_EQUAL(actual_cksum, zc))
+ return (ECKSUM);
+
+ if (zio_injection_enabled && !zio->io_error)
+ return (zio_handle_fault_injection(zio, ECKSUM));
+
+ return (0);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zio_compress.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zio_compress.c
new file mode 100644
index 0000000..c563be4
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zio_compress.c
@@ -0,0 +1,148 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/zfs_context.h>
+#include <sys/compress.h>
+#include <sys/spa.h>
+#include <sys/zio.h>
+#include <sys/zio_compress.h>
+
+/*
+ * Compression vectors.
+ */
+
+zio_compress_info_t zio_compress_table[ZIO_COMPRESS_FUNCTIONS] = {
+ {NULL, NULL, 0, "inherit"},
+ {NULL, NULL, 0, "on"},
+ {NULL, NULL, 0, "uncompressed"},
+ {lzjb_compress, lzjb_decompress, 0, "lzjb"},
+ {NULL, NULL, 0, "empty"},
+ {gzip_compress, gzip_decompress, 1, "gzip-1"},
+ {gzip_compress, gzip_decompress, 2, "gzip-2"},
+ {gzip_compress, gzip_decompress, 3, "gzip-3"},
+ {gzip_compress, gzip_decompress, 4, "gzip-4"},
+ {gzip_compress, gzip_decompress, 5, "gzip-5"},
+ {gzip_compress, gzip_decompress, 6, "gzip-6"},
+ {gzip_compress, gzip_decompress, 7, "gzip-7"},
+ {gzip_compress, gzip_decompress, 8, "gzip-8"},
+ {gzip_compress, gzip_decompress, 9, "gzip-9"},
+};
+
+uint8_t
+zio_compress_select(uint8_t child, uint8_t parent)
+{
+ ASSERT(child < ZIO_COMPRESS_FUNCTIONS);
+ ASSERT(parent < ZIO_COMPRESS_FUNCTIONS);
+ ASSERT(parent != ZIO_COMPRESS_INHERIT && parent != ZIO_COMPRESS_ON);
+
+ if (child == ZIO_COMPRESS_INHERIT)
+ return (parent);
+
+ if (child == ZIO_COMPRESS_ON)
+ return (ZIO_COMPRESS_ON_VALUE);
+
+ return (child);
+}
+
+int
+zio_compress_data(int cpfunc, void *src, uint64_t srcsize, void **destp,
+ uint64_t *destsizep, uint64_t *destbufsizep)
+{
+ uint64_t *word, *word_end;
+ uint64_t ciosize, gapsize, destbufsize;
+ zio_compress_info_t *ci = &zio_compress_table[cpfunc];
+ char *dest;
+ uint_t allzero;
+
+ ASSERT((uint_t)cpfunc < ZIO_COMPRESS_FUNCTIONS);
+ ASSERT((uint_t)cpfunc == ZIO_COMPRESS_EMPTY || ci->ci_compress != NULL);
+
+ /*
+ * If the data is all zeroes, we don't even need to allocate
+ * a block for it. We indicate this by setting *destsizep = 0.
+ */
+ allzero = 1;
+ word = src;
+ word_end = (uint64_t *)(uintptr_t)((uintptr_t)word + srcsize);
+ while (word < word_end) {
+ if (*word++ != 0) {
+ allzero = 0;
+ break;
+ }
+ }
+ if (allzero) {
+ *destp = NULL;
+ *destsizep = 0;
+ *destbufsizep = 0;
+ return (1);
+ }
+
+ if (cpfunc == ZIO_COMPRESS_EMPTY)
+ return (0);
+
+ /* Compress at least 12.5% */
+ destbufsize = P2ALIGN(srcsize - (srcsize >> 3), SPA_MINBLOCKSIZE);
+ if (destbufsize == 0)
+ return (0);
+ dest = zio_buf_alloc(destbufsize);
+
+ ciosize = ci->ci_compress(src, dest, (size_t)srcsize,
+ (size_t)destbufsize, ci->ci_level);
+ if (ciosize > destbufsize) {
+ zio_buf_free(dest, destbufsize);
+ return (0);
+ }
+
+ /* Cool. We compressed at least as much as we were hoping to. */
+
+ /* For security, make sure we don't write random heap crap to disk */
+ gapsize = P2ROUNDUP(ciosize, SPA_MINBLOCKSIZE) - ciosize;
+ if (gapsize != 0) {
+ bzero(dest + ciosize, gapsize);
+ ciosize += gapsize;
+ }
+
+ ASSERT3U(ciosize, <=, destbufsize);
+ ASSERT(P2PHASE(ciosize, SPA_MINBLOCKSIZE) == 0);
+ *destp = dest;
+ *destsizep = ciosize;
+ *destbufsizep = destbufsize;
+
+ return (1);
+}
+
+int
+zio_decompress_data(int cpfunc, void *src, uint64_t srcsize,
+ void *dest, uint64_t destsize)
+{
+ zio_compress_info_t *ci = &zio_compress_table[cpfunc];
+
+ ASSERT((uint_t)cpfunc < ZIO_COMPRESS_FUNCTIONS);
+
+ return (ci->ci_decompress(src, dest, srcsize, destsize, ci->ci_level));
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zio_inject.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zio_inject.c
new file mode 100644
index 0000000..4cada09
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zio_inject.c
@@ -0,0 +1,315 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * ZFS fault injection
+ *
+ * To handle fault injection, we keep track of a series of zinject_record_t
+ * structures which describe which logical block(s) should be injected with a
+ * fault. These are kept in a global list. Each record corresponds to a given
+ * spa_t and maintains a special hold on the spa_t so that it cannot be deleted
+ * or exported while the injection record exists.
+ *
+ * Device level injection is done using the 'zi_guid' field. If this is set, it
+ * means that the error is destined for a particular device, not a piece of
+ * data.
+ *
+ * This is a rather poor data structure and algorithm, but we don't expect more
+ * than a few faults at any one time, so it should be sufficient for our needs.
+ */
+
+#include <sys/arc.h>
+#include <sys/zio_impl.h>
+#include <sys/zfs_ioctl.h>
+#include <sys/spa_impl.h>
+#include <sys/vdev_impl.h>
+
+uint32_t zio_injection_enabled;
+
+typedef struct inject_handler {
+ int zi_id;
+ spa_t *zi_spa;
+ zinject_record_t zi_record;
+ list_node_t zi_link;
+} inject_handler_t;
+
+static list_t inject_handlers;
+static krwlock_t inject_lock;
+static int inject_next_id = 1;
+
+/*
+ * Returns true if the given record matches the I/O in progress.
+ */
+static boolean_t
+zio_match_handler(zbookmark_t *zb, uint64_t type,
+ zinject_record_t *record, int error)
+{
+ /*
+ * Check for a match against the MOS, which is based on type
+ */
+ if (zb->zb_objset == 0 && record->zi_objset == 0 &&
+ record->zi_object == 0) {
+ if (record->zi_type == DMU_OT_NONE ||
+ type == record->zi_type)
+ return (record->zi_freq == 0 ||
+ spa_get_random(100) < record->zi_freq);
+ else
+ return (B_FALSE);
+ }
+
+ /*
+ * Check for an exact match.
+ */
+ if (zb->zb_objset == record->zi_objset &&
+ zb->zb_object == record->zi_object &&
+ zb->zb_level == record->zi_level &&
+ zb->zb_blkid >= record->zi_start &&
+ zb->zb_blkid <= record->zi_end &&
+ error == record->zi_error)
+ return (record->zi_freq == 0 ||
+ spa_get_random(100) < record->zi_freq);
+
+ return (B_FALSE);
+}
+
+/*
+ * Determine if the I/O in question should return failure. Returns the errno
+ * to be returned to the caller.
+ */
+int
+zio_handle_fault_injection(zio_t *zio, int error)
+{
+ int ret = 0;
+ inject_handler_t *handler;
+
+ /*
+ * Ignore I/O not associated with any logical data.
+ */
+ if (zio->io_logical == NULL)
+ return (0);
+
+ /*
+ * Currently, we only support fault injection on reads.
+ */
+ if (zio->io_type != ZIO_TYPE_READ)
+ return (0);
+
+ rw_enter(&inject_lock, RW_READER);
+
+ for (handler = list_head(&inject_handlers); handler != NULL;
+ handler = list_next(&inject_handlers, handler)) {
+
+ /* Ignore errors not destined for this pool */
+ if (zio->io_spa != handler->zi_spa)
+ continue;
+
+ /* Ignore device errors */
+ if (handler->zi_record.zi_guid != 0)
+ continue;
+
+ /* If this handler matches, return EIO */
+ if (zio_match_handler(&zio->io_logical->io_bookmark,
+ zio->io_bp ? BP_GET_TYPE(zio->io_bp) : DMU_OT_NONE,
+ &handler->zi_record, error)) {
+ ret = error;
+ break;
+ }
+ }
+
+ rw_exit(&inject_lock);
+
+ return (ret);
+}
+
+int
+zio_handle_device_injection(vdev_t *vd, int error)
+{
+ inject_handler_t *handler;
+ int ret = 0;
+
+ rw_enter(&inject_lock, RW_READER);
+
+ for (handler = list_head(&inject_handlers); handler != NULL;
+ handler = list_next(&inject_handlers, handler)) {
+
+ if (vd->vdev_guid == handler->zi_record.zi_guid) {
+ if (handler->zi_record.zi_error == error) {
+ /*
+ * For a failed open, pretend like the device
+ * has gone away.
+ */
+ if (error == ENXIO)
+ vd->vdev_stat.vs_aux =
+ VDEV_AUX_OPEN_FAILED;
+ ret = error;
+ break;
+ }
+ if (handler->zi_record.zi_error == ENXIO) {
+ ret = EIO;
+ break;
+ }
+ }
+ }
+
+ rw_exit(&inject_lock);
+
+ return (ret);
+}
+
+/*
+ * Create a new handler for the given record. We add it to the list, adding
+ * a reference to the spa_t in the process. We increment zio_injection_enabled,
+ * which is the switch to trigger all fault injection.
+ */
+int
+zio_inject_fault(char *name, int flags, int *id, zinject_record_t *record)
+{
+ inject_handler_t *handler;
+ int error;
+ spa_t *spa;
+
+ /*
+ * If this is pool-wide metadata, make sure we unload the corresponding
+ * spa_t, so that the next attempt to load it will trigger the fault.
+ * We call spa_reset() to unload the pool appropriately.
+ */
+ if (flags & ZINJECT_UNLOAD_SPA)
+ if ((error = spa_reset(name)) != 0)
+ return (error);
+
+ if (!(flags & ZINJECT_NULL)) {
+ /*
+ * spa_inject_ref() will add an injection reference, which will
+ * prevent the pool from being removed from the namespace while
+ * still allowing it to be unloaded.
+ */
+ if ((spa = spa_inject_addref(name)) == NULL)
+ return (ENOENT);
+
+ handler = kmem_alloc(sizeof (inject_handler_t), KM_SLEEP);
+
+ rw_enter(&inject_lock, RW_WRITER);
+
+ *id = handler->zi_id = inject_next_id++;
+ handler->zi_spa = spa;
+ handler->zi_record = *record;
+ list_insert_tail(&inject_handlers, handler);
+ atomic_add_32(&zio_injection_enabled, 1);
+
+ rw_exit(&inject_lock);
+ }
+
+ /*
+ * Flush the ARC, so that any attempts to read this data will end up
+ * going to the ZIO layer. Note that this is a little overkill, but
+ * we don't have the necessary ARC interfaces to do anything else, and
+ * fault injection isn't a performance critical path.
+ */
+ if (flags & ZINJECT_FLUSH_ARC)
+ arc_flush();
+
+ return (0);
+}
+
+/*
+ * Returns the next record with an ID greater than that supplied to the
+ * function. Used to iterate over all handlers in the system.
+ */
+int
+zio_inject_list_next(int *id, char *name, size_t buflen,
+ zinject_record_t *record)
+{
+ inject_handler_t *handler;
+ int ret;
+
+ mutex_enter(&spa_namespace_lock);
+ rw_enter(&inject_lock, RW_READER);
+
+ for (handler = list_head(&inject_handlers); handler != NULL;
+ handler = list_next(&inject_handlers, handler))
+ if (handler->zi_id > *id)
+ break;
+
+ if (handler) {
+ *record = handler->zi_record;
+ *id = handler->zi_id;
+ (void) strncpy(name, spa_name(handler->zi_spa), buflen);
+ ret = 0;
+ } else {
+ ret = ENOENT;
+ }
+
+ rw_exit(&inject_lock);
+ mutex_exit(&spa_namespace_lock);
+
+ return (ret);
+}
+
+/*
+ * Clear the fault handler with the given identifier, or return ENOENT if none
+ * exists.
+ */
+int
+zio_clear_fault(int id)
+{
+ inject_handler_t *handler;
+ int ret;
+
+ rw_enter(&inject_lock, RW_WRITER);
+
+ for (handler = list_head(&inject_handlers); handler != NULL;
+ handler = list_next(&inject_handlers, handler))
+ if (handler->zi_id == id)
+ break;
+
+ if (handler == NULL) {
+ ret = ENOENT;
+ } else {
+ list_remove(&inject_handlers, handler);
+ spa_inject_delref(handler->zi_spa);
+ kmem_free(handler, sizeof (inject_handler_t));
+ atomic_add_32(&zio_injection_enabled, -1);
+ ret = 0;
+ }
+
+ rw_exit(&inject_lock);
+
+ return (ret);
+}
+
+void
+zio_inject_init(void)
+{
+ list_create(&inject_handlers, sizeof (inject_handler_t),
+ offsetof(inject_handler_t, zi_link));
+}
+
+void
+zio_inject_fini(void)
+{
+ list_destroy(&inject_handlers);
+}
diff --git a/sys/contrib/opensolaris/uts/common/fs/zfs/zvol.c b/sys/contrib/opensolaris/uts/common/fs/zfs/zvol.c
new file mode 100644
index 0000000..c6aa07b
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/fs/zfs/zvol.c
@@ -0,0 +1,801 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (c) 2006 Pawel Jakub Dawidek <pjd@FreeBSD.org>
+ * All rights reserved.
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * ZFS volume emulation driver.
+ *
+ * Makes a DMU object look like a volume of arbitrary size, up to 2^64 bytes.
+ * Volumes are accessed through the symbolic links named:
+ *
+ * /dev/zvol/dsk/<pool_name>/<dataset_name>
+ * /dev/zvol/rdsk/<pool_name>/<dataset_name>
+ *
+ * These links are created by the ZFS-specific devfsadm link generator.
+ * Volumes are persistent through reboot. No user command needs to be
+ * run before opening and using a device.
+ */
+
+#include <sys/types.h>
+#include <sys/param.h>
+#include <sys/kernel.h>
+#include <sys/errno.h>
+#include <sys/uio.h>
+#include <sys/bio.h>
+#include <sys/buf.h>
+#include <sys/kmem.h>
+#include <sys/conf.h>
+#include <sys/cmn_err.h>
+#include <sys/stat.h>
+#include <sys/zap.h>
+#include <sys/spa.h>
+#include <sys/zio.h>
+#include <sys/dsl_prop.h>
+#include <sys/dkio.h>
+#include <sys/byteorder.h>
+#include <sys/sunddi.h>
+#include <sys/dirent.h>
+#include <sys/policy.h>
+#include <sys/fs/zfs.h>
+#include <sys/zfs_ioctl.h>
+#include <sys/zil.h>
+#include <sys/refcount.h>
+#include <sys/zfs_znode.h>
+#include <sys/zfs_rlock.h>
+#include <geom/geom.h>
+
+#include "zfs_namecheck.h"
+
+struct g_class zfs_zvol_class = {
+ .name = "ZFS::ZVOL",
+ .version = G_VERSION,
+};
+
+DECLARE_GEOM_CLASS(zfs_zvol_class, zfs_zvol);
+
+#define ZVOL_OBJ 1ULL
+#define ZVOL_ZAP_OBJ 2ULL
+
+static uint32_t zvol_minors;
+
+/*
+ * The in-core state of each volume.
+ */
+typedef struct zvol_state {
+ char zv_name[MAXPATHLEN]; /* pool/dd name */
+ uint64_t zv_volsize; /* amount of space we advertise */
+ uint64_t zv_volblocksize; /* volume block size */
+ struct g_provider *zv_provider; /* GEOM provider */
+ uint8_t zv_min_bs; /* minimum addressable block shift */
+ uint8_t zv_readonly; /* hard readonly; like write-protect */
+ objset_t *zv_objset; /* objset handle */
+ uint32_t zv_mode; /* DS_MODE_* flags at open time */
+ uint32_t zv_total_opens; /* total open count */
+ zilog_t *zv_zilog; /* ZIL handle */
+ uint64_t zv_txg_assign; /* txg to assign during ZIL replay */
+ znode_t zv_znode; /* for range locking */
+ int zv_state;
+ struct bio_queue_head zv_queue;
+ struct mtx zv_queue_mtx; /* zv_queue mutex */
+} zvol_state_t;
+
+/*
+ * zvol maximum transfer in one DMU tx.
+ */
+int zvol_maxphys = DMU_MAX_ACCESS/2;
+
+static int zvol_get_data(void *arg, lr_write_t *lr, char *buf, zio_t *zio);
+
+int
+zvol_check_volsize(uint64_t volsize, uint64_t blocksize)
+{
+ if (volsize == 0)
+ return (EINVAL);
+
+ if (volsize % blocksize != 0)
+ return (EINVAL);
+
+#ifdef _ILP32
+ if (volsize - 1 > SPEC_MAXOFFSET_T)
+ return (EOVERFLOW);
+#endif
+ return (0);
+}
+
+int
+zvol_check_volblocksize(uint64_t volblocksize)
+{
+ if (volblocksize < SPA_MINBLOCKSIZE ||
+ volblocksize > SPA_MAXBLOCKSIZE ||
+ !ISP2(volblocksize))
+ return (EDOM);
+
+ return (0);
+}
+
+static void
+zvol_readonly_changed_cb(void *arg, uint64_t newval)
+{
+ zvol_state_t *zv = arg;
+
+ zv->zv_readonly = (uint8_t)newval;
+}
+
+int
+zvol_get_stats(objset_t *os, nvlist_t *nv)
+{
+ int error;
+ dmu_object_info_t doi;
+ uint64_t val;
+
+
+ error = zap_lookup(os, ZVOL_ZAP_OBJ, "size", 8, 1, &val);
+ if (error)
+ return (error);
+
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_VOLSIZE, val);
+
+ error = dmu_object_info(os, ZVOL_OBJ, &doi);
+
+ if (error == 0) {
+ dsl_prop_nvlist_add_uint64(nv, ZFS_PROP_VOLBLOCKSIZE,
+ doi.doi_data_block_size);
+ }
+
+ return (error);
+}
+
+static zvol_state_t *
+zvol_minor_lookup(const char *name)
+{
+ struct g_provider *pp;
+ struct g_geom *gp;
+
+ g_topology_assert();
+
+ LIST_FOREACH(gp, &zfs_zvol_class.geom, geom) {
+ LIST_FOREACH(pp, &gp->provider, provider) {
+ if (strcmp(pp->name + sizeof(ZVOL_DEV_DIR), name) == 0)
+ return (pp->private);
+ }
+ }
+
+ return (NULL);
+}
+
+static int
+zvol_access(struct g_provider *pp, int acr, int acw, int ace)
+{
+ zvol_state_t *zv;
+
+ g_topology_assert();
+
+ zv = pp->private;
+ if (zv == NULL) {
+ if (acr <= 0 && acw <= 0 && ace <= 0)
+ return (0);
+ return (pp->error);
+ }
+
+ ASSERT(zv->zv_objset != NULL);
+
+ if (acw > 0 && (zv->zv_readonly || (zv->zv_mode & DS_MODE_READONLY)))
+ return (EROFS);
+
+ zv->zv_total_opens += acr + acw + ace;
+
+ return (0);
+}
+
+/*
+ * zvol_log_write() handles synchronous writes using TX_WRITE ZIL transactions.
+ *
+ * We store data in the log buffers if it's small enough.
+ * Otherwise we will later flush the data out via dmu_sync().
+ */
+ssize_t zvol_immediate_write_sz = 32768;
+
+static void
+zvol_log_write(zvol_state_t *zv, dmu_tx_t *tx, offset_t off, ssize_t len)
+{
+ uint32_t blocksize = zv->zv_volblocksize;
+ lr_write_t *lr;
+
+ while (len) {
+ ssize_t nbytes = MIN(len, blocksize - P2PHASE(off, blocksize));
+ itx_t *itx = zil_itx_create(TX_WRITE, sizeof (*lr));
+
+ itx->itx_wr_state =
+ len > zvol_immediate_write_sz ? WR_INDIRECT : WR_NEED_COPY;
+ itx->itx_private = zv;
+ lr = (lr_write_t *)&itx->itx_lr;
+ lr->lr_foid = ZVOL_OBJ;
+ lr->lr_offset = off;
+ lr->lr_length = nbytes;
+ lr->lr_blkoff = off - P2ALIGN_TYPED(off, blocksize, uint64_t);
+ BP_ZERO(&lr->lr_blkptr);
+
+ (void) zil_itx_assign(zv->zv_zilog, itx, tx);
+ len -= nbytes;
+ off += nbytes;
+ }
+}
+
+static void
+zvol_start(struct bio *bp)
+{
+ zvol_state_t *zv;
+
+ switch (bp->bio_cmd) {
+ case BIO_READ:
+ case BIO_WRITE:
+ case BIO_FLUSH:
+ zv = bp->bio_to->private;
+ ASSERT(zv != NULL);
+ mtx_lock(&zv->zv_queue_mtx);
+ bioq_insert_tail(&zv->zv_queue, bp);
+ wakeup_one(&zv->zv_queue);
+ mtx_unlock(&zv->zv_queue_mtx);
+ break;
+ case BIO_DELETE:
+ case BIO_GETATTR:
+ default:
+ g_io_deliver(bp, EOPNOTSUPP);
+ break;
+ }
+}
+
+static void
+zvol_serve_one(zvol_state_t *zv, struct bio *bp)
+{
+ uint64_t off, volsize;
+ size_t size, resid;
+ char *addr;
+ objset_t *os;
+ rl_t *rl;
+ int error = 0;
+ boolean_t reading;
+
+ off = bp->bio_offset;
+ volsize = zv->zv_volsize;
+
+ os = zv->zv_objset;
+ ASSERT(os != NULL);
+
+ addr = bp->bio_data;
+ resid = bp->bio_length;
+
+ error = 0;
+
+ /*
+ * There must be no buffer changes when doing a dmu_sync() because
+ * we can't change the data whilst calculating the checksum.
+ * A better approach than a per zvol rwlock would be to lock ranges.
+ */
+ reading = (bp->bio_cmd == BIO_READ);
+ rl = zfs_range_lock(&zv->zv_znode, off, resid,
+ reading ? RL_READER : RL_WRITER);
+
+ while (resid != 0 && off < volsize) {
+
+ size = MIN(resid, zvol_maxphys); /* zvol_maxphys per tx */
+
+ if (size > volsize - off) /* don't write past the end */
+ size = volsize - off;
+
+ if (reading) {
+ error = dmu_read(os, ZVOL_OBJ, off, size, addr);
+ } else {
+ dmu_tx_t *tx = dmu_tx_create(os);
+ dmu_tx_hold_write(tx, ZVOL_OBJ, off, size);
+ error = dmu_tx_assign(tx, TXG_WAIT);
+ if (error) {
+ dmu_tx_abort(tx);
+ } else {
+ dmu_write(os, ZVOL_OBJ, off, size, addr, tx);
+ zvol_log_write(zv, tx, off, size);
+ dmu_tx_commit(tx);
+ }
+ }
+ if (error)
+ break;
+ off += size;
+ addr += size;
+ resid -= size;
+ }
+ zfs_range_unlock(rl);
+
+ bp->bio_completed = bp->bio_length - resid;
+ if (bp->bio_completed < bp->bio_length)
+ bp->bio_error = (off > volsize ? EINVAL : error);
+
+ /*
+ * XXX: We are devilering here?
+ * Looks like I don't understand something here, but I was sure it was
+ * an async request.
+ */
+ g_io_deliver(bp, bp->bio_error);
+}
+
+static void
+zvol_worker(void *arg)
+{
+ zvol_state_t *zv;
+ struct bio *bp;
+
+ zv = arg;
+ for (;;) {
+ mtx_lock(&zv->zv_queue_mtx);
+ bp = bioq_takefirst(&zv->zv_queue);
+ if (bp == NULL) {
+ if (zv->zv_state == 1) {
+ zv->zv_state = 2;
+ wakeup(&zv->zv_state);
+ mtx_unlock(&zv->zv_queue_mtx);
+ kthread_exit(0);
+ }
+ msleep(&zv->zv_queue, &zv->zv_queue_mtx, PRIBIO | PDROP,
+ "zvol:io", 0);
+ continue;
+ }
+ mtx_unlock(&zv->zv_queue_mtx);
+ if (bp->bio_cmd == BIO_FLUSH) {
+ zil_commit(zv->zv_zilog, UINT64_MAX, ZVOL_OBJ);
+ g_io_deliver(bp, 0);
+ } else {
+ zvol_serve_one(zv, bp);
+ }
+ }
+}
+
+void
+zvol_create_cb(objset_t *os, void *arg, dmu_tx_t *tx)
+{
+ zfs_create_data_t *zc = arg;
+ int error;
+ uint64_t volblocksize, volsize;
+
+ VERIFY(nvlist_lookup_uint64(zc->zc_props,
+ zfs_prop_to_name(ZFS_PROP_VOLSIZE), &volsize) == 0);
+ if (nvlist_lookup_uint64(zc->zc_props,
+ zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE), &volblocksize) != 0)
+ volblocksize = zfs_prop_default_numeric(ZFS_PROP_VOLBLOCKSIZE);
+
+ /*
+ * These properites must be removed from the list so the generic
+ * property setting step won't apply to them.
+ */
+ VERIFY(nvlist_remove_all(zc->zc_props,
+ zfs_prop_to_name(ZFS_PROP_VOLSIZE)) == 0);
+ (void) nvlist_remove_all(zc->zc_props,
+ zfs_prop_to_name(ZFS_PROP_VOLBLOCKSIZE));
+
+ error = dmu_object_claim(os, ZVOL_OBJ, DMU_OT_ZVOL, volblocksize,
+ DMU_OT_NONE, 0, tx);
+ ASSERT(error == 0);
+
+ error = zap_create_claim(os, ZVOL_ZAP_OBJ, DMU_OT_ZVOL_PROP,
+ DMU_OT_NONE, 0, tx);
+ ASSERT(error == 0);
+
+ error = zap_update(os, ZVOL_ZAP_OBJ, "size", 8, 1, &volsize, tx);
+ ASSERT(error == 0);
+}
+
+/*
+ * Replay a TX_WRITE ZIL transaction that didn't get committed
+ * after a system failure
+ */
+static int
+zvol_replay_write(zvol_state_t *zv, lr_write_t *lr, boolean_t byteswap)
+{
+ objset_t *os = zv->zv_objset;
+ char *data = (char *)(lr + 1); /* data follows lr_write_t */
+ uint64_t off = lr->lr_offset;
+ uint64_t len = lr->lr_length;
+ dmu_tx_t *tx;
+ int error;
+
+ if (byteswap)
+ byteswap_uint64_array(lr, sizeof (*lr));
+
+ tx = dmu_tx_create(os);
+ dmu_tx_hold_write(tx, ZVOL_OBJ, off, len);
+ error = dmu_tx_assign(tx, zv->zv_txg_assign);
+ if (error) {
+ dmu_tx_abort(tx);
+ } else {
+ dmu_write(os, ZVOL_OBJ, off, len, data, tx);
+ dmu_tx_commit(tx);
+ }
+
+ return (error);
+}
+
+/* ARGSUSED */
+static int
+zvol_replay_err(zvol_state_t *zv, lr_t *lr, boolean_t byteswap)
+{
+ return (ENOTSUP);
+}
+
+/*
+ * Callback vectors for replaying records.
+ * Only TX_WRITE is needed for zvol.
+ */
+zil_replay_func_t *zvol_replay_vector[TX_MAX_TYPE] = {
+ zvol_replay_err, /* 0 no such transaction type */
+ zvol_replay_err, /* TX_CREATE */
+ zvol_replay_err, /* TX_MKDIR */
+ zvol_replay_err, /* TX_MKXATTR */
+ zvol_replay_err, /* TX_SYMLINK */
+ zvol_replay_err, /* TX_REMOVE */
+ zvol_replay_err, /* TX_RMDIR */
+ zvol_replay_err, /* TX_LINK */
+ zvol_replay_err, /* TX_RENAME */
+ zvol_replay_write, /* TX_WRITE */
+ zvol_replay_err, /* TX_TRUNCATE */
+ zvol_replay_err, /* TX_SETATTR */
+ zvol_replay_err, /* TX_ACL */
+};
+
+/*
+ * Create a minor node for the specified volume.
+ */
+int
+zvol_create_minor(const char *name, dev_t dev)
+{
+ struct g_provider *pp;
+ struct g_geom *gp;
+ zvol_state_t *zv;
+ objset_t *os;
+ dmu_object_info_t doi;
+ uint64_t volsize;
+ int ds_mode = DS_MODE_PRIMARY;
+ int error;
+
+ DROP_GIANT();
+ g_topology_lock();
+
+ if ((zv = zvol_minor_lookup(name)) != NULL) {
+ error = EEXIST;
+ goto end;
+ }
+
+ if (strchr(name, '@') != 0)
+ ds_mode |= DS_MODE_READONLY;
+
+ error = dmu_objset_open(name, DMU_OST_ZVOL, ds_mode, &os);
+ if (error)
+ goto end;
+
+ g_topology_unlock();
+ PICKUP_GIANT();
+ error = zap_lookup(os, ZVOL_ZAP_OBJ, "size", 8, 1, &volsize);
+ DROP_GIANT();
+ g_topology_lock();
+ if (error) {
+ dmu_objset_close(os);
+ goto end;
+ }
+
+ gp = g_new_geomf(&zfs_zvol_class, "zfs::zvol::%s", name);
+ gp->start = zvol_start;
+ gp->access = zvol_access;
+ pp = g_new_providerf(gp, "%s/%s", ZVOL_DEV_DIR, name);
+ pp->mediasize = volsize;
+ pp->sectorsize = DEV_BSIZE;
+
+ zv = kmem_zalloc(sizeof(*zv), KM_SLEEP);
+ (void) strcpy(zv->zv_name, name);
+ zv->zv_min_bs = DEV_BSHIFT;
+ zv->zv_provider = pp;
+ zv->zv_volsize = pp->mediasize;
+ zv->zv_objset = os;
+ zv->zv_mode = ds_mode;
+ zv->zv_zilog = zil_open(os, zvol_get_data);
+ mutex_init(&zv->zv_znode.z_range_lock, NULL, MUTEX_DEFAULT, NULL);
+ avl_create(&zv->zv_znode.z_range_avl, zfs_range_compare,
+ sizeof (rl_t), offsetof(rl_t, r_node));
+
+
+ /* get and cache the blocksize */
+ error = dmu_object_info(os, ZVOL_OBJ, &doi);
+ ASSERT(error == 0);
+ zv->zv_volblocksize = doi.doi_data_block_size;
+
+ zil_replay(os, zv, &zv->zv_txg_assign, zvol_replay_vector);
+
+ /* XXX this should handle the possible i/o error */
+ VERIFY(dsl_prop_register(dmu_objset_ds(zv->zv_objset),
+ "readonly", zvol_readonly_changed_cb, zv) == 0);
+
+ pp->private = zv;
+ g_error_provider(pp, 0);
+
+ bioq_init(&zv->zv_queue);
+ mtx_init(&zv->zv_queue_mtx, "zvol", NULL, MTX_DEF);
+ zv->zv_state = 0;
+ kthread_create(zvol_worker, zv, NULL, 0, 0, "zvol:worker %s", pp->name);
+
+ zvol_minors++;
+end:
+ g_topology_unlock();
+ PICKUP_GIANT();
+
+ return (error);
+}
+
+/*
+ * Remove minor node for the specified volume.
+ */
+int
+zvol_remove_minor(const char *name)
+{
+ struct g_provider *pp;
+ zvol_state_t *zv;
+ int error = 0;
+
+ DROP_GIANT();
+ g_topology_lock();
+
+ if ((zv = zvol_minor_lookup(name)) == NULL) {
+ error = ENXIO;
+ goto end;
+ }
+
+ if (zv->zv_total_opens != 0) {
+ error = EBUSY;
+ goto end;
+ }
+
+ VERIFY(dsl_prop_unregister(dmu_objset_ds(zv->zv_objset),
+ "readonly", zvol_readonly_changed_cb, zv) == 0);
+
+ mtx_lock(&zv->zv_queue_mtx);
+ zv->zv_state = 1;
+ wakeup_one(&zv->zv_queue);
+ while (zv->zv_state != 2)
+ msleep(&zv->zv_state, &zv->zv_queue_mtx, 0, "zvol:w", 0);
+ mtx_unlock(&zv->zv_queue_mtx);
+ mtx_destroy(&zv->zv_queue_mtx);
+
+ pp = zv->zv_provider;
+ pp->private = NULL;
+ g_wither_geom(pp->geom, ENXIO);
+
+ zil_close(zv->zv_zilog);
+ zv->zv_zilog = NULL;
+ dmu_objset_close(zv->zv_objset);
+ zv->zv_objset = NULL;
+ avl_destroy(&zv->zv_znode.z_range_avl);
+ mutex_destroy(&zv->zv_znode.z_range_lock);
+
+ kmem_free(zv, sizeof(*zv));
+
+ zvol_minors--;
+end:
+ g_topology_unlock();
+ PICKUP_GIANT();
+
+ return (error);
+}
+
+int
+zvol_set_volsize(const char *name, dev_t dev, uint64_t volsize)
+{
+ zvol_state_t *zv;
+ dmu_tx_t *tx;
+ int error;
+ dmu_object_info_t doi;
+
+ DROP_GIANT();
+ g_topology_lock();
+
+ if ((zv = zvol_minor_lookup(name)) == NULL) {
+ error = ENXIO;
+ goto end;
+ }
+
+ if ((error = dmu_object_info(zv->zv_objset, ZVOL_OBJ, &doi)) != 0 ||
+ (error = zvol_check_volsize(volsize,
+ doi.doi_data_block_size)) != 0) {
+ goto end;
+ }
+
+ if (zv->zv_readonly || (zv->zv_mode & DS_MODE_READONLY)) {
+ error = EROFS;
+ goto end;
+ }
+
+ tx = dmu_tx_create(zv->zv_objset);
+ dmu_tx_hold_zap(tx, ZVOL_ZAP_OBJ, TRUE, NULL);
+ dmu_tx_hold_free(tx, ZVOL_OBJ, volsize, DMU_OBJECT_END);
+ error = dmu_tx_assign(tx, TXG_WAIT);
+ if (error) {
+ dmu_tx_abort(tx);
+ goto end;
+ }
+
+ error = zap_update(zv->zv_objset, ZVOL_ZAP_OBJ, "size", 8, 1,
+ &volsize, tx);
+ if (error == 0) {
+ error = dmu_free_range(zv->zv_objset, ZVOL_OBJ, volsize,
+ DMU_OBJECT_END, tx);
+ }
+
+ dmu_tx_commit(tx);
+
+ if (error == 0) {
+ zv->zv_volsize = volsize;
+ zv->zv_provider->mediasize = volsize; /* XXX: Not supported. */
+ }
+end:
+ g_topology_unlock();
+ PICKUP_GIANT();
+
+ return (error);
+}
+
+int
+zvol_set_volblocksize(const char *name, uint64_t volblocksize)
+{
+ zvol_state_t *zv;
+ dmu_tx_t *tx;
+ int error;
+
+ DROP_GIANT();
+ g_topology_lock();
+
+ if ((zv = zvol_minor_lookup(name)) == NULL) {
+ error = ENXIO;
+ goto end;
+ }
+
+ if (zv->zv_readonly || (zv->zv_mode & DS_MODE_READONLY)) {
+ error = EROFS;
+ goto end;
+ }
+
+ tx = dmu_tx_create(zv->zv_objset);
+ dmu_tx_hold_bonus(tx, ZVOL_OBJ);
+ error = dmu_tx_assign(tx, TXG_WAIT);
+ if (error) {
+ dmu_tx_abort(tx);
+ } else {
+ error = dmu_object_set_blocksize(zv->zv_objset, ZVOL_OBJ,
+ volblocksize, 0, tx);
+ if (error == ENOTSUP)
+ error = EBUSY;
+ dmu_tx_commit(tx);
+ /* XXX: Not supported. */
+#if 0
+ if (error == 0)
+ zv->zv_provider->sectorsize = zc->zc_volblocksize;
+#endif
+ }
+end:
+ g_topology_unlock();
+ PICKUP_GIANT();
+
+ return (error);
+}
+
+void
+zvol_get_done(dmu_buf_t *db, void *vzgd)
+{
+ zgd_t *zgd = (zgd_t *)vzgd;
+ rl_t *rl = zgd->zgd_rl;
+
+ dmu_buf_rele(db, vzgd);
+ zfs_range_unlock(rl);
+ zil_add_vdev(zgd->zgd_zilog, DVA_GET_VDEV(BP_IDENTITY(zgd->zgd_bp)));
+ kmem_free(zgd, sizeof (zgd_t));
+}
+
+/*
+ * Get data to generate a TX_WRITE intent log record.
+ */
+static int
+zvol_get_data(void *arg, lr_write_t *lr, char *buf, zio_t *zio)
+{
+ zvol_state_t *zv = arg;
+ objset_t *os = zv->zv_objset;
+ dmu_buf_t *db;
+ rl_t *rl;
+ zgd_t *zgd;
+ uint64_t boff; /* block starting offset */
+ int dlen = lr->lr_length; /* length of user data */
+ int error;
+
+ ASSERT(zio);
+ ASSERT(dlen != 0);
+
+ /*
+ * Write records come in two flavors: immediate and indirect.
+ * For small writes it's cheaper to store the data with the
+ * log record (immediate); for large writes it's cheaper to
+ * sync the data and get a pointer to it (indirect) so that
+ * we don't have to write the data twice.
+ */
+ if (buf != NULL) /* immediate write */
+ return (dmu_read(os, ZVOL_OBJ, lr->lr_offset, dlen, buf));
+
+ zgd = (zgd_t *)kmem_alloc(sizeof (zgd_t), KM_SLEEP);
+ zgd->zgd_zilog = zv->zv_zilog;
+ zgd->zgd_bp = &lr->lr_blkptr;
+
+ /*
+ * Lock the range of the block to ensure that when the data is
+ * written out and it's checksum is being calculated that no other
+ * thread can change the block.
+ */
+ boff = P2ALIGN_TYPED(lr->lr_offset, zv->zv_volblocksize, uint64_t);
+ rl = zfs_range_lock(&zv->zv_znode, boff, zv->zv_volblocksize,
+ RL_READER);
+ zgd->zgd_rl = rl;
+
+ VERIFY(0 == dmu_buf_hold(os, ZVOL_OBJ, lr->lr_offset, zgd, &db));
+ error = dmu_sync(zio, db, &lr->lr_blkptr,
+ lr->lr_common.lrc_txg, zvol_get_done, zgd);
+ if (error == 0)
+ zil_add_vdev(zv->zv_zilog,
+ DVA_GET_VDEV(BP_IDENTITY(&lr->lr_blkptr)));
+ /*
+ * If we get EINPROGRESS, then we need to wait for a
+ * write IO initiated by dmu_sync() to complete before
+ * we can release this dbuf. We will finish everything
+ * up in the zvol_get_done() callback.
+ */
+ if (error == EINPROGRESS)
+ return (0);
+ dmu_buf_rele(db, zgd);
+ zfs_range_unlock(rl);
+ kmem_free(zgd, sizeof (zgd_t));
+ return (error);
+}
+
+int
+zvol_busy(void)
+{
+ return (zvol_minors != 0);
+}
+
+void
+zvol_init(void)
+{
+ ZFS_LOG(1, "ZVOL Initialized.");
+}
+
+void
+zvol_fini(void)
+{
+ ZFS_LOG(1, "ZVOL Deinitialized.");
+}
diff --git a/sys/contrib/opensolaris/uts/common/os/callb.c b/sys/contrib/opensolaris/uts/common/os/callb.c
new file mode 100644
index 0000000..9bfae13
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/os/callb.c
@@ -0,0 +1,363 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/sysmacros.h>
+#include <sys/systm.h>
+#include <sys/proc.h>
+#include <sys/mutex.h>
+#include <sys/condvar.h>
+#include <sys/callb.h>
+#include <sys/kmem.h>
+#include <sys/cmn_err.h>
+#include <sys/debug.h>
+#include <sys/kobj.h>
+#include <sys/systm.h> /* for delay() */
+#include <sys/taskq.h> /* For TASKQ_NAMELEN */
+#include <sys/kernel.h>
+
+#define CB_MAXNAME TASKQ_NAMELEN
+
+/*
+ * The callb mechanism provides generic event scheduling/echoing.
+ * A callb function is registered and called on behalf of the event.
+ */
+typedef struct callb {
+ struct callb *c_next; /* next in class or on freelist */
+ kthread_id_t c_thread; /* ptr to caller's thread struct */
+ char c_flag; /* info about the callb state */
+ uchar_t c_class; /* this callb's class */
+ kcondvar_t c_done_cv; /* signal callb completion */
+ boolean_t (*c_func)(); /* cb function: returns true if ok */
+ void *c_arg; /* arg to c_func */
+ char c_name[CB_MAXNAME+1]; /* debug:max func name length */
+} callb_t;
+
+/*
+ * callb c_flag bitmap definitions
+ */
+#define CALLB_FREE 0x0
+#define CALLB_TAKEN 0x1
+#define CALLB_EXECUTING 0x2
+
+/*
+ * Basic structure for a callb table.
+ * All callbs are organized into different class groups described
+ * by ct_class array.
+ * The callbs within a class are single-linked and normally run by a
+ * serial execution.
+ */
+typedef struct callb_table {
+ kmutex_t ct_lock; /* protect all callb states */
+ callb_t *ct_freelist; /* free callb structures */
+ int ct_busy; /* != 0 prevents additions */
+ kcondvar_t ct_busy_cv; /* to wait for not busy */
+ int ct_ncallb; /* num of callbs allocated */
+ callb_t *ct_first_cb[NCBCLASS]; /* ptr to 1st callb in a class */
+} callb_table_t;
+
+int callb_timeout_sec = CPR_KTHREAD_TIMEOUT_SEC;
+
+static callb_id_t callb_add_common(boolean_t (*)(void *, int),
+ void *, int, char *, kthread_id_t);
+
+static callb_table_t callb_table; /* system level callback table */
+static callb_table_t *ct = &callb_table;
+static kmutex_t callb_safe_mutex;
+callb_cpr_t callb_cprinfo_safe = {
+ &callb_safe_mutex, CALLB_CPR_ALWAYS_SAFE, 0, 0, 0 };
+
+/*
+ * Init all callb tables in the system.
+ */
+void
+callb_init(void *dummy __unused)
+{
+ callb_table.ct_busy = 0; /* mark table open for additions */
+ mutex_init(&callb_safe_mutex, NULL, MUTEX_DEFAULT, NULL);
+ mutex_init(&callb_table.ct_lock, NULL, MUTEX_DEFAULT, NULL);
+}
+
+void
+callb_fini(void *dummy __unused)
+{
+ callb_t *cp;
+
+ mutex_enter(&ct->ct_lock);
+ while ((cp = ct->ct_freelist) != NULL) {
+ ct->ct_freelist = cp->c_next;
+ ct->ct_ncallb--;
+ kmem_free(cp, sizeof (callb_t));
+ }
+ ASSERT(ct->ct_ncallb == 0);
+ mutex_exit(&ct->ct_lock);
+ mutex_destroy(&callb_safe_mutex);
+ mutex_destroy(&callb_table.ct_lock);
+}
+
+/*
+ * callout_add() is called to register func() be called later.
+ */
+static callb_id_t
+callb_add_common(boolean_t (*func)(void *arg, int code),
+ void *arg, int class, char *name, kthread_id_t t)
+{
+ callb_t *cp;
+
+ ASSERT(class < NCBCLASS);
+
+ mutex_enter(&ct->ct_lock);
+ while (ct->ct_busy)
+ cv_wait(&ct->ct_busy_cv, &ct->ct_lock);
+ if ((cp = ct->ct_freelist) == NULL) {
+ ct->ct_ncallb++;
+ cp = (callb_t *)kmem_zalloc(sizeof (callb_t), KM_SLEEP);
+ }
+ ct->ct_freelist = cp->c_next;
+ cp->c_thread = t;
+ cp->c_func = func;
+ cp->c_arg = arg;
+ cp->c_class = (uchar_t)class;
+ cp->c_flag |= CALLB_TAKEN;
+#ifdef DEBUG
+ if (strlen(name) > CB_MAXNAME)
+ cmn_err(CE_WARN, "callb_add: name of callback function '%s' "
+ "too long -- truncated to %d chars",
+ name, CB_MAXNAME);
+#endif
+ (void) strncpy(cp->c_name, name, CB_MAXNAME);
+ cp->c_name[CB_MAXNAME] = '\0';
+
+ /*
+ * Insert the new callb at the head of its class list.
+ */
+ cp->c_next = ct->ct_first_cb[class];
+ ct->ct_first_cb[class] = cp;
+
+ mutex_exit(&ct->ct_lock);
+ return ((callb_id_t)cp);
+}
+
+/*
+ * The default function to add an entry to the callback table. Since
+ * it uses curthread as the thread identifier to store in the table,
+ * it should be used for the normal case of a thread which is calling
+ * to add ITSELF to the table.
+ */
+callb_id_t
+callb_add(boolean_t (*func)(void *arg, int code),
+ void *arg, int class, char *name)
+{
+ return (callb_add_common(func, arg, class, name, curthread));
+}
+
+/*
+ * A special version of callb_add() above for use by threads which
+ * might be adding an entry to the table on behalf of some other
+ * thread (for example, one which is constructed but not yet running).
+ * In this version the thread id is an argument.
+ */
+callb_id_t
+callb_add_thread(boolean_t (*func)(void *arg, int code),
+ void *arg, int class, char *name, kthread_id_t t)
+{
+ return (callb_add_common(func, arg, class, name, t));
+}
+
+/*
+ * callout_delete() is called to remove an entry identified by id
+ * that was originally placed there by a call to callout_add().
+ * return -1 if fail to delete a callb entry otherwise return 0.
+ */
+int
+callb_delete(callb_id_t id)
+{
+ callb_t **pp;
+ callb_t *me = (callb_t *)id;
+
+ mutex_enter(&ct->ct_lock);
+
+ for (;;) {
+ pp = &ct->ct_first_cb[me->c_class];
+ while (*pp != NULL && *pp != me)
+ pp = &(*pp)->c_next;
+
+#ifdef DEBUG
+ if (*pp != me) {
+ cmn_err(CE_WARN, "callb delete bogus entry 0x%p",
+ (void *)me);
+ mutex_exit(&ct->ct_lock);
+ return (-1);
+ }
+#endif /* DEBUG */
+
+ /*
+ * It is not allowed to delete a callb in the middle of
+ * executing otherwise, the callb_execute() will be confused.
+ */
+ if (!(me->c_flag & CALLB_EXECUTING))
+ break;
+
+ cv_wait(&me->c_done_cv, &ct->ct_lock);
+ }
+ /* relink the class list */
+ *pp = me->c_next;
+
+ /* clean up myself and return the free callb to the head of freelist */
+ me->c_flag = CALLB_FREE;
+ me->c_next = ct->ct_freelist;
+ ct->ct_freelist = me;
+
+ mutex_exit(&ct->ct_lock);
+ return (0);
+}
+
+/*
+ * class: indicates to execute all callbs in the same class;
+ * code: optional argument for the callb functions.
+ * return: = 0: success
+ * != 0: ptr to string supplied when callback was registered
+ */
+void *
+callb_execute_class(int class, int code)
+{
+ callb_t *cp;
+ void *ret = NULL;
+
+ ASSERT(class < NCBCLASS);
+
+ mutex_enter(&ct->ct_lock);
+
+ for (cp = ct->ct_first_cb[class];
+ cp != NULL && ret == 0; cp = cp->c_next) {
+ while (cp->c_flag & CALLB_EXECUTING)
+ cv_wait(&cp->c_done_cv, &ct->ct_lock);
+ /*
+ * cont if the callb is deleted while we're sleeping
+ */
+ if (cp->c_flag == CALLB_FREE)
+ continue;
+ cp->c_flag |= CALLB_EXECUTING;
+
+#ifdef CALLB_DEBUG
+ printf("callb_execute: name=%s func=%p arg=%p\n",
+ cp->c_name, (void *)cp->c_func, (void *)cp->c_arg);
+#endif /* CALLB_DEBUG */
+
+ mutex_exit(&ct->ct_lock);
+ /* If callback function fails, pass back client's name */
+ if (!(*cp->c_func)(cp->c_arg, code))
+ ret = cp->c_name;
+ mutex_enter(&ct->ct_lock);
+
+ cp->c_flag &= ~CALLB_EXECUTING;
+ cv_broadcast(&cp->c_done_cv);
+ }
+ mutex_exit(&ct->ct_lock);
+ return (ret);
+}
+
+/*
+ * callers make sure no recursive entries to this func.
+ * dp->cc_lockp is registered by callb_add to protect callb_cpr_t structure.
+ *
+ * When calling to stop a kernel thread (code == CB_CODE_CPR_CHKPT) we
+ * use a cv_timedwait() in case the kernel thread is blocked.
+ *
+ * Note that this is a generic callback handler for daemon CPR and
+ * should NOT be changed to accommodate any specific requirement in a daemon.
+ * Individual daemons that require changes to the handler shall write
+ * callback routines in their own daemon modules.
+ */
+boolean_t
+callb_generic_cpr(void *arg, int code)
+{
+ callb_cpr_t *cp = (callb_cpr_t *)arg;
+ clock_t ret = 0; /* assume success */
+
+ mutex_enter(cp->cc_lockp);
+
+ switch (code) {
+ case CB_CODE_CPR_CHKPT:
+ cp->cc_events |= CALLB_CPR_START;
+ while (!(cp->cc_events & CALLB_CPR_SAFE))
+ /* cv_timedwait() returns -1 if it times out. */
+ if ((ret = cv_timedwait(&cp->cc_callb_cv,
+ cp->cc_lockp,
+ callb_timeout_sec * hz)) == -1)
+ break;
+ break;
+
+ case CB_CODE_CPR_RESUME:
+ cp->cc_events &= ~CALLB_CPR_START;
+ cv_signal(&cp->cc_stop_cv);
+ break;
+ }
+ mutex_exit(cp->cc_lockp);
+ return (ret != -1);
+}
+
+/*
+ * The generic callback function associated with kernel threads which
+ * are always considered safe.
+ */
+/* ARGSUSED */
+boolean_t
+callb_generic_cpr_safe(void *arg, int code)
+{
+ return (B_TRUE);
+}
+/*
+ * Prevent additions to callback table.
+ */
+void
+callb_lock_table(void)
+{
+ mutex_enter(&ct->ct_lock);
+ ASSERT(ct->ct_busy == 0);
+ ct->ct_busy = 1;
+ mutex_exit(&ct->ct_lock);
+}
+
+/*
+ * Allow additions to callback table.
+ */
+void
+callb_unlock_table(void)
+{
+ mutex_enter(&ct->ct_lock);
+ ASSERT(ct->ct_busy != 0);
+ ct->ct_busy = 0;
+ cv_broadcast(&ct->ct_busy_cv);
+ mutex_exit(&ct->ct_lock);
+}
+
+SYSINIT(sol_callb, SI_SUB_DRIVERS, SI_ORDER_FIRST, callb_init, NULL)
+SYSUNINIT(sol_callb, SI_SUB_DRIVERS, SI_ORDER_FIRST, callb_fini, NULL);
diff --git a/sys/contrib/opensolaris/uts/common/os/list.c b/sys/contrib/opensolaris/uts/common/os/list.c
new file mode 100644
index 0000000..f9b6fcb
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/os/list.c
@@ -0,0 +1,193 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Generic doubly-linked list implementation
+ */
+
+#include <sys/list.h>
+#include <sys/list_impl.h>
+#include <sys/types.h>
+#include <sys/sysmacros.h>
+#include <sys/debug.h>
+
+#define list_d2l(a, obj) ((list_node_t *)(((char *)obj) + (a)->list_offset))
+#define list_object(a, node) ((void *)(((char *)node) - (a)->list_offset))
+#define list_empty(a) ((a)->list_head.list_next == &(a)->list_head)
+
+#define list_insert_after_node(list, node, object) { \
+ list_node_t *lnew = list_d2l(list, object); \
+ lnew->list_prev = node; \
+ lnew->list_next = node->list_next; \
+ node->list_next->list_prev = lnew; \
+ node->list_next = lnew; \
+}
+
+#define list_insert_before_node(list, node, object) { \
+ list_node_t *lnew = list_d2l(list, object); \
+ lnew->list_next = node; \
+ lnew->list_prev = node->list_prev; \
+ node->list_prev->list_next = lnew; \
+ node->list_prev = lnew; \
+}
+
+void
+list_create(list_t *list, size_t size, size_t offset)
+{
+ ASSERT(list);
+ ASSERT(size > 0);
+ ASSERT(size >= offset + sizeof (list_node_t));
+
+ list->list_size = size;
+ list->list_offset = offset;
+ list->list_head.list_next = list->list_head.list_prev =
+ &list->list_head;
+}
+
+void
+list_destroy(list_t *list)
+{
+ list_node_t *node = &list->list_head;
+
+ ASSERT(list);
+ ASSERT(list->list_head.list_next == node);
+ ASSERT(list->list_head.list_prev == node);
+
+ node->list_next = node->list_prev = NULL;
+}
+
+void
+list_insert_after(list_t *list, void *object, void *nobject)
+{
+ list_node_t *lold = list_d2l(list, object);
+ list_insert_after_node(list, lold, nobject);
+}
+
+void
+list_insert_before(list_t *list, void *object, void *nobject)
+{
+ list_node_t *lold = list_d2l(list, object);
+ list_insert_before_node(list, lold, nobject)
+}
+
+void
+list_insert_head(list_t *list, void *object)
+{
+ list_node_t *lold = &list->list_head;
+ list_insert_after_node(list, lold, object);
+}
+
+void
+list_insert_tail(list_t *list, void *object)
+{
+ list_node_t *lold = &list->list_head;
+ list_insert_before_node(list, lold, object);
+}
+
+void
+list_remove(list_t *list, void *object)
+{
+ list_node_t *lold = list_d2l(list, object);
+ ASSERT(!list_empty(list));
+ lold->list_prev->list_next = lold->list_next;
+ lold->list_next->list_prev = lold->list_prev;
+ lold->list_next = lold->list_prev = NULL;
+}
+
+void *
+list_head(list_t *list)
+{
+ if (list_empty(list))
+ return (NULL);
+ return (list_object(list, list->list_head.list_next));
+}
+
+void *
+list_tail(list_t *list)
+{
+ if (list_empty(list))
+ return (NULL);
+ return (list_object(list, list->list_head.list_prev));
+}
+
+void *
+list_next(list_t *list, void *object)
+{
+ list_node_t *node = list_d2l(list, object);
+
+ if (node->list_next != &list->list_head)
+ return (list_object(list, node->list_next));
+
+ return (NULL);
+}
+
+void *
+list_prev(list_t *list, void *object)
+{
+ list_node_t *node = list_d2l(list, object);
+
+ if (node->list_prev != &list->list_head)
+ return (list_object(list, node->list_prev));
+
+ return (NULL);
+}
+
+/*
+ * Insert src list after dst list. Empty src list thereafter.
+ */
+void
+list_move_tail(list_t *dst, list_t *src)
+{
+ list_node_t *dstnode = &dst->list_head;
+ list_node_t *srcnode = &src->list_head;
+
+ ASSERT(dst->list_size == src->list_size);
+ ASSERT(dst->list_offset == src->list_offset);
+
+ if (list_empty(src))
+ return;
+
+ dstnode->list_prev->list_next = srcnode->list_next;
+ srcnode->list_next->list_prev = dstnode->list_prev;
+ dstnode->list_prev = srcnode->list_prev;
+ srcnode->list_prev->list_next = dstnode;
+
+ /* empty src list */
+ srcnode->list_next = srcnode->list_prev = srcnode;
+}
+
+int
+list_link_active(list_node_t *link)
+{
+ return (link->list_next != NULL);
+}
+
+int
+list_is_empty(list_t *list)
+{
+ return (list_empty(list));
+}
diff --git a/sys/contrib/opensolaris/uts/common/os/nvpair_alloc_system.c b/sys/contrib/opensolaris/uts/common/os/nvpair_alloc_system.c
new file mode 100644
index 0000000..3682853
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/os/nvpair_alloc_system.c
@@ -0,0 +1,63 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/nvpair.h>
+
+static void *
+nv_alloc_sys(nv_alloc_t *nva, size_t size)
+{
+ return (kmem_alloc(size, (int)(uintptr_t)nva->nva_arg));
+}
+
+/*ARGSUSED*/
+static void
+nv_free_sys(nv_alloc_t *nva, void *buf, size_t size)
+{
+ kmem_free(buf, size);
+}
+
+static const nv_alloc_ops_t system_ops = {
+ NULL, /* nv_ao_init() */
+ NULL, /* nv_ao_fini() */
+ nv_alloc_sys, /* nv_ao_alloc() */
+ nv_free_sys, /* nv_ao_free() */
+ NULL /* nv_ao_reset() */
+};
+
+nv_alloc_t nv_alloc_sleep_def = {
+ &system_ops,
+ (void *)KM_SLEEP
+};
+
+nv_alloc_t nv_alloc_nosleep_def = {
+ &system_ops,
+ (void *)KM_NOSLEEP
+};
+
+nv_alloc_t *nv_alloc_sleep = &nv_alloc_sleep_def;
+nv_alloc_t *nv_alloc_nosleep = &nv_alloc_nosleep_def;
diff --git a/sys/contrib/opensolaris/uts/common/os/taskq.c b/sys/contrib/opensolaris/uts/common/os/taskq.c
new file mode 100644
index 0000000..220f080
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/os/taskq.c
@@ -0,0 +1,1020 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Kernel task queues: general-purpose asynchronous task scheduling.
+ *
+ * A common problem in kernel programming is the need to schedule tasks
+ * to be performed later, by another thread. There are several reasons
+ * you may want or need to do this:
+ *
+ * (1) The task isn't time-critical, but your current code path is.
+ *
+ * (2) The task may require grabbing locks that you already hold.
+ *
+ * (3) The task may need to block (e.g. to wait for memory), but you
+ * cannot block in your current context.
+ *
+ * (4) Your code path can't complete because of some condition, but you can't
+ * sleep or fail, so you queue the task for later execution when condition
+ * disappears.
+ *
+ * (5) You just want a simple way to launch multiple tasks in parallel.
+ *
+ * Task queues provide such a facility. In its simplest form (used when
+ * performance is not a critical consideration) a task queue consists of a
+ * single list of tasks, together with one or more threads to service the
+ * list. There are some cases when this simple queue is not sufficient:
+ *
+ * (1) The task queues are very hot and there is a need to avoid data and lock
+ * contention over global resources.
+ *
+ * (2) Some tasks may depend on other tasks to complete, so they can't be put in
+ * the same list managed by the same thread.
+ *
+ * (3) Some tasks may block for a long time, and this should not block other
+ * tasks in the queue.
+ *
+ * To provide useful service in such cases we define a "dynamic task queue"
+ * which has an individual thread for each of the tasks. These threads are
+ * dynamically created as they are needed and destroyed when they are not in
+ * use. The API for managing task pools is the same as for managing task queues
+ * with the exception of a taskq creation flag TASKQ_DYNAMIC which tells that
+ * dynamic task pool behavior is desired.
+ *
+ * Dynamic task queues may also place tasks in the normal queue (called "backing
+ * queue") when task pool runs out of resources. Users of task queues may
+ * disallow such queued scheduling by specifying TQ_NOQUEUE in the dispatch
+ * flags.
+ *
+ * The backing task queue is also used for scheduling internal tasks needed for
+ * dynamic task queue maintenance.
+ *
+ * INTERFACES:
+ *
+ * taskq_t *taskq_create(name, nthreads, pri_t pri, minalloc, maxall, flags);
+ *
+ * Create a taskq with specified properties.
+ * Possible 'flags':
+ *
+ * TASKQ_DYNAMIC: Create task pool for task management. If this flag is
+ * specified, 'nthreads' specifies the maximum number of threads in
+ * the task queue. Task execution order for dynamic task queues is
+ * not predictable.
+ *
+ * If this flag is not specified (default case) a
+ * single-list task queue is created with 'nthreads' threads
+ * servicing it. Entries in this queue are managed by
+ * taskq_ent_alloc() and taskq_ent_free() which try to keep the
+ * task population between 'minalloc' and 'maxalloc', but the
+ * latter limit is only advisory for TQ_SLEEP dispatches and the
+ * former limit is only advisory for TQ_NOALLOC dispatches. If
+ * TASKQ_PREPOPULATE is set in 'flags', the taskq will be
+ * prepopulated with 'minalloc' task structures.
+ *
+ * Since non-DYNAMIC taskqs are queues, tasks are guaranteed to be
+ * executed in the order they are scheduled if nthreads == 1.
+ * If nthreads > 1, task execution order is not predictable.
+ *
+ * TASKQ_PREPOPULATE: Prepopulate task queue with threads.
+ * Also prepopulate the task queue with 'minalloc' task structures.
+ *
+ * TASKQ_CPR_SAFE: This flag specifies that users of the task queue will
+ * use their own protocol for handling CPR issues. This flag is not
+ * supported for DYNAMIC task queues.
+ *
+ * The 'pri' field specifies the default priority for the threads that
+ * service all scheduled tasks.
+ *
+ * void taskq_destroy(tap):
+ *
+ * Waits for any scheduled tasks to complete, then destroys the taskq.
+ * Caller should guarantee that no new tasks are scheduled in the closing
+ * taskq.
+ *
+ * taskqid_t taskq_dispatch(tq, func, arg, flags):
+ *
+ * Dispatches the task "func(arg)" to taskq. The 'flags' indicates whether
+ * the caller is willing to block for memory. The function returns an
+ * opaque value which is zero iff dispatch fails. If flags is TQ_NOSLEEP
+ * or TQ_NOALLOC and the task can't be dispatched, taskq_dispatch() fails
+ * and returns (taskqid_t)0.
+ *
+ * ASSUMES: func != NULL.
+ *
+ * Possible flags:
+ * TQ_NOSLEEP: Do not wait for resources; may fail.
+ *
+ * TQ_NOALLOC: Do not allocate memory; may fail. May only be used with
+ * non-dynamic task queues.
+ *
+ * TQ_NOQUEUE: Do not enqueue a task if it can't dispatch it due to
+ * lack of available resources and fail. If this flag is not
+ * set, and the task pool is exhausted, the task may be scheduled
+ * in the backing queue. This flag may ONLY be used with dynamic
+ * task queues.
+ *
+ * NOTE: This flag should always be used when a task queue is used
+ * for tasks that may depend on each other for completion.
+ * Enqueueing dependent tasks may create deadlocks.
+ *
+ * TQ_SLEEP: May block waiting for resources. May still fail for
+ * dynamic task queues if TQ_NOQUEUE is also specified, otherwise
+ * always succeed.
+ *
+ * NOTE: Dynamic task queues are much more likely to fail in
+ * taskq_dispatch() (especially if TQ_NOQUEUE was specified), so it
+ * is important to have backup strategies handling such failures.
+ *
+ * void taskq_wait(tq):
+ *
+ * Waits for all previously scheduled tasks to complete.
+ *
+ * NOTE: It does not stop any new task dispatches.
+ * Do NOT call taskq_wait() from a task: it will cause deadlock.
+ *
+ * void taskq_suspend(tq)
+ *
+ * Suspend all task execution. Tasks already scheduled for a dynamic task
+ * queue will still be executed, but all new scheduled tasks will be
+ * suspended until taskq_resume() is called.
+ *
+ * int taskq_suspended(tq)
+ *
+ * Returns 1 if taskq is suspended and 0 otherwise. It is intended to
+ * ASSERT that the task queue is suspended.
+ *
+ * void taskq_resume(tq)
+ *
+ * Resume task queue execution.
+ *
+ * int taskq_member(tq, thread)
+ *
+ * Returns 1 if 'thread' belongs to taskq 'tq' and 0 otherwise. The
+ * intended use is to ASSERT that a given function is called in taskq
+ * context only.
+ *
+ * system_taskq
+ *
+ * Global system-wide dynamic task queue for common uses. It may be used by
+ * any subsystem that needs to schedule tasks and does not need to manage
+ * its own task queues. It is initialized quite early during system boot.
+ *
+ * IMPLEMENTATION.
+ *
+ * This is schematic representation of the task queue structures.
+ *
+ * taskq:
+ * +-------------+
+ * |tq_lock | +---< taskq_ent_free()
+ * +-------------+ |
+ * |... | | tqent: tqent:
+ * +-------------+ | +------------+ +------------+
+ * | tq_freelist |-->| tqent_next |--> ... ->| tqent_next |
+ * +-------------+ +------------+ +------------+
+ * |... | | ... | | ... |
+ * +-------------+ +------------+ +------------+
+ * | tq_task | |
+ * | | +-------------->taskq_ent_alloc()
+ * +--------------------------------------------------------------------------+
+ * | | | tqent tqent |
+ * | +---------------------+ +--> +------------+ +--> +------------+ |
+ * | | ... | | | func, arg | | | func, arg | |
+ * +>+---------------------+ <---|-+ +------------+ <---|-+ +------------+ |
+ * | tq_taskq.tqent_next | ----+ | | tqent_next | --->+ | | tqent_next |--+
+ * +---------------------+ | +------------+ ^ | +------------+
+ * +-| tq_task.tqent_prev | +--| tqent_prev | | +--| tqent_prev | ^
+ * | +---------------------+ +------------+ | +------------+ |
+ * | |... | | ... | | | ... | |
+ * | +---------------------+ +------------+ | +------------+ |
+ * | ^ | |
+ * | | | |
+ * +--------------------------------------+--------------+ TQ_APPEND() -+
+ * | | |
+ * |... | taskq_thread()-----+
+ * +-------------+
+ * | tq_buckets |--+-------> [ NULL ] (for regular task queues)
+ * +-------------+ |
+ * | DYNAMIC TASK QUEUES:
+ * |
+ * +-> taskq_bucket[nCPU] taskq_bucket_dispatch()
+ * +-------------------+ ^
+ * +--->| tqbucket_lock | |
+ * | +-------------------+ +--------+ +--------+
+ * | | tqbucket_freelist |-->| tqent |-->...| tqent | ^
+ * | +-------------------+<--+--------+<--...+--------+ |
+ * | | ... | | thread | | thread | |
+ * | +-------------------+ +--------+ +--------+ |
+ * | +-------------------+ |
+ * taskq_dispatch()--+--->| tqbucket_lock | TQ_APPEND()------+
+ * TQ_HASH() | +-------------------+ +--------+ +--------+
+ * | | tqbucket_freelist |-->| tqent |-->...| tqent |
+ * | +-------------------+<--+--------+<--...+--------+
+ * | | ... | | thread | | thread |
+ * | +-------------------+ +--------+ +--------+
+ * +---> ...
+ *
+ *
+ * Task queues use tq_task field to link new entry in the queue. The queue is a
+ * circular doubly-linked list. Entries are put in the end of the list with
+ * TQ_APPEND() and processed from the front of the list by taskq_thread() in
+ * FIFO order. Task queue entries are cached in the free list managed by
+ * taskq_ent_alloc() and taskq_ent_free() functions.
+ *
+ * All threads used by task queues mark t_taskq field of the thread to
+ * point to the task queue.
+ *
+ * Dynamic Task Queues Implementation.
+ *
+ * For a dynamic task queues there is a 1-to-1 mapping between a thread and
+ * taskq_ent_structure. Each entry is serviced by its own thread and each thread
+ * is controlled by a single entry.
+ *
+ * Entries are distributed over a set of buckets. To avoid using modulo
+ * arithmetics the number of buckets is 2^n and is determined as the nearest
+ * power of two roundown of the number of CPUs in the system. Tunable
+ * variable 'taskq_maxbuckets' limits the maximum number of buckets. Each entry
+ * is attached to a bucket for its lifetime and can't migrate to other buckets.
+ *
+ * Entries that have scheduled tasks are not placed in any list. The dispatch
+ * function sets their "func" and "arg" fields and signals the corresponding
+ * thread to execute the task. Once the thread executes the task it clears the
+ * "func" field and places an entry on the bucket cache of free entries pointed
+ * by "tqbucket_freelist" field. ALL entries on the free list should have "func"
+ * field equal to NULL. The free list is a circular doubly-linked list identical
+ * in structure to the tq_task list above, but entries are taken from it in LIFO
+ * order - the last freed entry is the first to be allocated. The
+ * taskq_bucket_dispatch() function gets the most recently used entry from the
+ * free list, sets its "func" and "arg" fields and signals a worker thread.
+ *
+ * After executing each task a per-entry thread taskq_d_thread() places its
+ * entry on the bucket free list and goes to a timed sleep. If it wakes up
+ * without getting new task it removes the entry from the free list and destroys
+ * itself. The thread sleep time is controlled by a tunable variable
+ * `taskq_thread_timeout'.
+ *
+ * There is various statistics kept in the bucket which allows for later
+ * analysis of taskq usage patterns. Also, a global copy of taskq creation and
+ * death statistics is kept in the global taskq data structure. Since thread
+ * creation and death happen rarely, updating such global data does not present
+ * a performance problem.
+ *
+ * NOTE: Threads are not bound to any CPU and there is absolutely no association
+ * between the bucket and actual thread CPU, so buckets are used only to
+ * split resources and reduce resource contention. Having threads attached
+ * to the CPU denoted by a bucket may reduce number of times the job
+ * switches between CPUs.
+ *
+ * Current algorithm creates a thread whenever a bucket has no free
+ * entries. It would be nice to know how many threads are in the running
+ * state and don't create threads if all CPUs are busy with existing
+ * tasks, but it is unclear how such strategy can be implemented.
+ *
+ * Currently buckets are created statically as an array attached to task
+ * queue. On some system with nCPUs < max_ncpus it may waste system
+ * memory. One solution may be allocation of buckets when they are first
+ * touched, but it is not clear how useful it is.
+ *
+ * SUSPEND/RESUME implementation.
+ *
+ * Before executing a task taskq_thread() (executing non-dynamic task
+ * queues) obtains taskq's thread lock as a reader. The taskq_suspend()
+ * function gets the same lock as a writer blocking all non-dynamic task
+ * execution. The taskq_resume() function releases the lock allowing
+ * taskq_thread to continue execution.
+ *
+ * For dynamic task queues, each bucket is marked as TQBUCKET_SUSPEND by
+ * taskq_suspend() function. After that taskq_bucket_dispatch() always
+ * fails, so that taskq_dispatch() will either enqueue tasks for a
+ * suspended backing queue or fail if TQ_NOQUEUE is specified in dispatch
+ * flags.
+ *
+ * NOTE: taskq_suspend() does not immediately block any tasks already
+ * scheduled for dynamic task queues. It only suspends new tasks
+ * scheduled after taskq_suspend() was called.
+ *
+ * taskq_member() function works by comparing a thread t_taskq pointer with
+ * the passed thread pointer.
+ *
+ * LOCKS and LOCK Hierarchy:
+ *
+ * There are two locks used in task queues.
+ *
+ * 1) Task queue structure has a lock, protecting global task queue state.
+ *
+ * 2) Each per-CPU bucket has a lock for bucket management.
+ *
+ * If both locks are needed, task queue lock should be taken only after bucket
+ * lock.
+ *
+ * DEBUG FACILITIES.
+ *
+ * For DEBUG kernels it is possible to induce random failures to
+ * taskq_dispatch() function when it is given TQ_NOSLEEP argument. The value of
+ * taskq_dmtbf and taskq_smtbf tunables control the mean time between induced
+ * failures for dynamic and static task queues respectively.
+ *
+ * Setting TASKQ_STATISTIC to 0 will disable per-bucket statistics.
+ *
+ * TUNABLES
+ *
+ * system_taskq_size - Size of the global system_taskq.
+ * This value is multiplied by nCPUs to determine
+ * actual size.
+ * Default value: 64
+ *
+ * taskq_thread_timeout - Maximum idle time for taskq_d_thread()
+ * Default value: 5 minutes
+ *
+ * taskq_maxbuckets - Maximum number of buckets in any task queue
+ * Default value: 128
+ *
+ * taskq_search_depth - Maximum # of buckets searched for a free entry
+ * Default value: 4
+ *
+ * taskq_dmtbf - Mean time between induced dispatch failures
+ * for dynamic task queues.
+ * Default value: UINT_MAX (no induced failures)
+ *
+ * taskq_smtbf - Mean time between induced dispatch failures
+ * for static task queues.
+ * Default value: UINT_MAX (no induced failures)
+ *
+ * CONDITIONAL compilation.
+ *
+ * TASKQ_STATISTIC - If set will enable bucket statistic (default).
+ *
+ */
+
+#include <sys/taskq_impl.h>
+#include <sys/proc.h>
+#include <sys/kmem.h>
+#include <sys/callb.h>
+#include <sys/systm.h>
+#include <sys/cmn_err.h>
+#include <sys/debug.h>
+#include <sys/sysmacros.h>
+#include <sys/sdt.h>
+#include <sys/mutex.h>
+#include <sys/kernel.h>
+#include <sys/limits.h>
+
+static kmem_cache_t *taskq_ent_cache, *taskq_cache;
+
+/* Global system task queue for common use */
+taskq_t *system_taskq;
+
+/*
+ * Maxmimum number of entries in global system taskq is
+ * system_taskq_size * max_ncpus
+ */
+#define SYSTEM_TASKQ_SIZE 1
+int system_taskq_size = SYSTEM_TASKQ_SIZE;
+
+/*
+ * Dynamic task queue threads that don't get any work within
+ * taskq_thread_timeout destroy themselves
+ */
+#define TASKQ_THREAD_TIMEOUT (60 * 5)
+int taskq_thread_timeout = TASKQ_THREAD_TIMEOUT;
+
+#define TASKQ_MAXBUCKETS 128
+int taskq_maxbuckets = TASKQ_MAXBUCKETS;
+
+/*
+ * When a bucket has no available entries another buckets are tried.
+ * taskq_search_depth parameter limits the amount of buckets that we search
+ * before failing. This is mostly useful in systems with many CPUs where we may
+ * spend too much time scanning busy buckets.
+ */
+#define TASKQ_SEARCH_DEPTH 4
+int taskq_search_depth = TASKQ_SEARCH_DEPTH;
+
+/*
+ * Hashing function: mix various bits of x. May be pretty much anything.
+ */
+#define TQ_HASH(x) ((x) ^ ((x) >> 11) ^ ((x) >> 17) ^ ((x) ^ 27))
+
+/*
+ * We do not create any new threads when the system is low on memory and start
+ * throttling memory allocations. The following macro tries to estimate such
+ * condition.
+ */
+#define ENOUGH_MEMORY() (freemem > throttlefree)
+
+/*
+ * Static functions.
+ */
+static taskq_t *taskq_create_common(const char *, int, int, pri_t, int,
+ int, uint_t);
+static void taskq_thread(void *);
+static int taskq_constructor(void *, void *, int);
+static void taskq_destructor(void *, void *);
+static int taskq_ent_constructor(void *, void *, int);
+static void taskq_ent_destructor(void *, void *);
+static taskq_ent_t *taskq_ent_alloc(taskq_t *, int);
+static void taskq_ent_free(taskq_t *, taskq_ent_t *);
+
+/*
+ * Collect per-bucket statistic when TASKQ_STATISTIC is defined.
+ */
+#define TASKQ_STATISTIC 1
+
+#if TASKQ_STATISTIC
+#define TQ_STAT(b, x) b->tqbucket_stat.x++
+#else
+#define TQ_STAT(b, x)
+#endif
+
+/*
+ * Random fault injection.
+ */
+uint_t taskq_random;
+uint_t taskq_dmtbf = UINT_MAX; /* mean time between injected failures */
+uint_t taskq_smtbf = UINT_MAX; /* mean time between injected failures */
+
+/*
+ * TQ_NOSLEEP dispatches on dynamic task queues are always allowed to fail.
+ *
+ * TQ_NOSLEEP dispatches on static task queues can't arbitrarily fail because
+ * they could prepopulate the cache and make sure that they do not use more
+ * then minalloc entries. So, fault injection in this case insures that
+ * either TASKQ_PREPOPULATE is not set or there are more entries allocated
+ * than is specified by minalloc. TQ_NOALLOC dispatches are always allowed
+ * to fail, but for simplicity we treat them identically to TQ_NOSLEEP
+ * dispatches.
+ */
+#ifdef DEBUG
+#define TASKQ_D_RANDOM_DISPATCH_FAILURE(tq, flag) \
+ taskq_random = (taskq_random * 2416 + 374441) % 1771875;\
+ if ((flag & TQ_NOSLEEP) && \
+ taskq_random < 1771875 / taskq_dmtbf) { \
+ return (NULL); \
+ }
+
+#define TASKQ_S_RANDOM_DISPATCH_FAILURE(tq, flag) \
+ taskq_random = (taskq_random * 2416 + 374441) % 1771875;\
+ if ((flag & (TQ_NOSLEEP | TQ_NOALLOC)) && \
+ (!(tq->tq_flags & TASKQ_PREPOPULATE) || \
+ (tq->tq_nalloc > tq->tq_minalloc)) && \
+ (taskq_random < (1771875 / taskq_smtbf))) { \
+ mutex_exit(&tq->tq_lock); \
+ return ((taskqid_t)0); \
+ }
+#else
+#define TASKQ_S_RANDOM_DISPATCH_FAILURE(tq, flag)
+#define TASKQ_D_RANDOM_DISPATCH_FAILURE(tq, flag)
+#endif
+
+#define IS_EMPTY(l) (((l).tqent_prev == (l).tqent_next) && \
+ ((l).tqent_prev == &(l)))
+
+/*
+ * Append `tqe' in the end of the doubly-linked list denoted by l.
+ */
+#define TQ_APPEND(l, tqe) { \
+ tqe->tqent_next = &l; \
+ tqe->tqent_prev = l.tqent_prev; \
+ tqe->tqent_next->tqent_prev = tqe; \
+ tqe->tqent_prev->tqent_next = tqe; \
+}
+
+/*
+ * Schedule a task specified by func and arg into the task queue entry tqe.
+ */
+#define TQ_ENQUEUE(tq, tqe, func, arg) { \
+ ASSERT(MUTEX_HELD(&tq->tq_lock)); \
+ TQ_APPEND(tq->tq_task, tqe); \
+ tqe->tqent_func = (func); \
+ tqe->tqent_arg = (arg); \
+ tq->tq_tasks++; \
+ if (tq->tq_tasks - tq->tq_executed > tq->tq_maxtasks) \
+ tq->tq_maxtasks = tq->tq_tasks - tq->tq_executed; \
+ cv_signal(&tq->tq_dispatch_cv); \
+ DTRACE_PROBE2(taskq__enqueue, taskq_t *, tq, taskq_ent_t *, tqe); \
+}
+
+/*
+ * Do-nothing task which may be used to prepopulate thread caches.
+ */
+/*ARGSUSED*/
+void
+nulltask(void *unused)
+{
+}
+
+
+/*ARGSUSED*/
+static int
+taskq_constructor(void *buf, void *cdrarg, int kmflags)
+{
+ taskq_t *tq = buf;
+
+ bzero(tq, sizeof (taskq_t));
+
+ mutex_init(&tq->tq_lock, NULL, MUTEX_DEFAULT, NULL);
+ rw_init(&tq->tq_threadlock, NULL, RW_DEFAULT, NULL);
+ cv_init(&tq->tq_dispatch_cv, NULL, CV_DEFAULT, NULL);
+ cv_init(&tq->tq_wait_cv, NULL, CV_DEFAULT, NULL);
+
+ tq->tq_task.tqent_next = &tq->tq_task;
+ tq->tq_task.tqent_prev = &tq->tq_task;
+
+ return (0);
+}
+
+/*ARGSUSED*/
+static void
+taskq_destructor(void *buf, void *cdrarg)
+{
+ taskq_t *tq = buf;
+
+ mutex_destroy(&tq->tq_lock);
+ rw_destroy(&tq->tq_threadlock);
+ cv_destroy(&tq->tq_dispatch_cv);
+ cv_destroy(&tq->tq_wait_cv);
+}
+
+/*ARGSUSED*/
+static int
+taskq_ent_constructor(void *buf, void *cdrarg, int kmflags)
+{
+ taskq_ent_t *tqe = buf;
+
+ tqe->tqent_thread = NULL;
+ cv_init(&tqe->tqent_cv, NULL, CV_DEFAULT, NULL);
+
+ return (0);
+}
+
+/*ARGSUSED*/
+static void
+taskq_ent_destructor(void *buf, void *cdrarg)
+{
+ taskq_ent_t *tqe = buf;
+
+ ASSERT(tqe->tqent_thread == NULL);
+ cv_destroy(&tqe->tqent_cv);
+}
+
+/*
+ * Create global system dynamic task queue.
+ */
+void
+system_taskq_init(void)
+{
+ system_taskq = taskq_create_common("system_taskq", 0,
+ system_taskq_size * max_ncpus, minclsyspri, 4, 512,
+ TASKQ_PREPOPULATE);
+}
+
+void
+system_taskq_fini(void)
+{
+ taskq_destroy(system_taskq);
+}
+
+static void
+taskq_init(void *dummy __unused)
+{
+ taskq_ent_cache = kmem_cache_create("taskq_ent_cache",
+ sizeof (taskq_ent_t), 0, taskq_ent_constructor,
+ taskq_ent_destructor, NULL, NULL, NULL, 0);
+ taskq_cache = kmem_cache_create("taskq_cache", sizeof (taskq_t),
+ 0, taskq_constructor, taskq_destructor, NULL, NULL, NULL, 0);
+ system_taskq_init();
+}
+
+static void
+taskq_fini(void *dummy __unused)
+{
+ system_taskq_fini();
+ kmem_cache_destroy(taskq_cache);
+ kmem_cache_destroy(taskq_ent_cache);
+}
+
+/*
+ * taskq_ent_alloc()
+ *
+ * Allocates a new taskq_ent_t structure either from the free list or from the
+ * cache. Returns NULL if it can't be allocated.
+ *
+ * Assumes: tq->tq_lock is held.
+ */
+static taskq_ent_t *
+taskq_ent_alloc(taskq_t *tq, int flags)
+{
+ int kmflags = (flags & TQ_NOSLEEP) ? KM_NOSLEEP : KM_SLEEP;
+
+ taskq_ent_t *tqe;
+
+ ASSERT(MUTEX_HELD(&tq->tq_lock));
+
+ /*
+ * TQ_NOALLOC allocations are allowed to use the freelist, even if
+ * we are below tq_minalloc.
+ */
+ if ((tqe = tq->tq_freelist) != NULL &&
+ ((flags & TQ_NOALLOC) || tq->tq_nalloc >= tq->tq_minalloc)) {
+ tq->tq_freelist = tqe->tqent_next;
+ } else {
+ if (flags & TQ_NOALLOC)
+ return (NULL);
+
+ mutex_exit(&tq->tq_lock);
+ if (tq->tq_nalloc >= tq->tq_maxalloc) {
+ if (kmflags & KM_NOSLEEP) {
+ mutex_enter(&tq->tq_lock);
+ return (NULL);
+ }
+ /*
+ * We don't want to exceed tq_maxalloc, but we can't
+ * wait for other tasks to complete (and thus free up
+ * task structures) without risking deadlock with
+ * the caller. So, we just delay for one second
+ * to throttle the allocation rate.
+ */
+ delay(hz);
+ }
+ tqe = kmem_cache_alloc(taskq_ent_cache, kmflags);
+ mutex_enter(&tq->tq_lock);
+ if (tqe != NULL)
+ tq->tq_nalloc++;
+ }
+ return (tqe);
+}
+
+/*
+ * taskq_ent_free()
+ *
+ * Free taskq_ent_t structure by either putting it on the free list or freeing
+ * it to the cache.
+ *
+ * Assumes: tq->tq_lock is held.
+ */
+static void
+taskq_ent_free(taskq_t *tq, taskq_ent_t *tqe)
+{
+ ASSERT(MUTEX_HELD(&tq->tq_lock));
+
+ if (tq->tq_nalloc <= tq->tq_minalloc) {
+ tqe->tqent_next = tq->tq_freelist;
+ tq->tq_freelist = tqe;
+ } else {
+ tq->tq_nalloc--;
+ mutex_exit(&tq->tq_lock);
+ kmem_cache_free(taskq_ent_cache, tqe);
+ mutex_enter(&tq->tq_lock);
+ }
+}
+
+/*
+ * Dispatch a task.
+ *
+ * Assumes: func != NULL
+ *
+ * Returns: NULL if dispatch failed.
+ * non-NULL if task dispatched successfully.
+ * Actual return value is the pointer to taskq entry that was used to
+ * dispatch a task. This is useful for debugging.
+ */
+/* ARGSUSED */
+taskqid_t
+taskq_dispatch(taskq_t *tq, task_func_t func, void *arg, uint_t flags)
+{
+ taskq_ent_t *tqe = NULL;
+
+ ASSERT(tq != NULL);
+ ASSERT(func != NULL);
+ ASSERT(!(tq->tq_flags & TASKQ_DYNAMIC));
+
+ /*
+ * TQ_NOQUEUE flag can't be used with non-dynamic task queues.
+ */
+ ASSERT(! (flags & TQ_NOQUEUE));
+
+ /*
+ * Enqueue the task to the underlying queue.
+ */
+ mutex_enter(&tq->tq_lock);
+
+ TASKQ_S_RANDOM_DISPATCH_FAILURE(tq, flags);
+
+ if ((tqe = taskq_ent_alloc(tq, flags)) == NULL) {
+ mutex_exit(&tq->tq_lock);
+ return ((taskqid_t)NULL);
+ }
+ TQ_ENQUEUE(tq, tqe, func, arg);
+ mutex_exit(&tq->tq_lock);
+ return ((taskqid_t)tqe);
+}
+
+/*
+ * Wait for all pending tasks to complete.
+ * Calling taskq_wait from a task will cause deadlock.
+ */
+void
+taskq_wait(taskq_t *tq)
+{
+
+ mutex_enter(&tq->tq_lock);
+ while (tq->tq_task.tqent_next != &tq->tq_task || tq->tq_active != 0)
+ cv_wait(&tq->tq_wait_cv, &tq->tq_lock);
+ mutex_exit(&tq->tq_lock);
+}
+
+/*
+ * Suspend execution of tasks.
+ *
+ * Tasks in the queue part will be suspended immediately upon return from this
+ * function. Pending tasks in the dynamic part will continue to execute, but all
+ * new tasks will be suspended.
+ */
+void
+taskq_suspend(taskq_t *tq)
+{
+ rw_enter(&tq->tq_threadlock, RW_WRITER);
+
+ /*
+ * Mark task queue as being suspended. Needed for taskq_suspended().
+ */
+ mutex_enter(&tq->tq_lock);
+ ASSERT(!(tq->tq_flags & TASKQ_SUSPENDED));
+ tq->tq_flags |= TASKQ_SUSPENDED;
+ mutex_exit(&tq->tq_lock);
+}
+
+/*
+ * returns: 1 if tq is suspended, 0 otherwise.
+ */
+int
+taskq_suspended(taskq_t *tq)
+{
+ return ((tq->tq_flags & TASKQ_SUSPENDED) != 0);
+}
+
+/*
+ * Resume taskq execution.
+ */
+void
+taskq_resume(taskq_t *tq)
+{
+ ASSERT(RW_WRITE_HELD(&tq->tq_threadlock));
+
+ mutex_enter(&tq->tq_lock);
+ ASSERT(tq->tq_flags & TASKQ_SUSPENDED);
+ tq->tq_flags &= ~TASKQ_SUSPENDED;
+ mutex_exit(&tq->tq_lock);
+
+ rw_exit(&tq->tq_threadlock);
+}
+
+/*
+ * Worker thread for processing task queue.
+ */
+static void
+taskq_thread(void *arg)
+{
+ taskq_t *tq = arg;
+ taskq_ent_t *tqe;
+ callb_cpr_t cprinfo;
+ hrtime_t start, end;
+
+ CALLB_CPR_INIT(&cprinfo, &tq->tq_lock, callb_generic_cpr, tq->tq_name);
+
+ mutex_enter(&tq->tq_lock);
+ while (tq->tq_flags & TASKQ_ACTIVE) {
+ if ((tqe = tq->tq_task.tqent_next) == &tq->tq_task) {
+ if (--tq->tq_active == 0)
+ cv_broadcast(&tq->tq_wait_cv);
+ if (tq->tq_flags & TASKQ_CPR_SAFE) {
+ cv_wait(&tq->tq_dispatch_cv, &tq->tq_lock);
+ } else {
+ CALLB_CPR_SAFE_BEGIN(&cprinfo);
+ cv_wait(&tq->tq_dispatch_cv, &tq->tq_lock);
+ CALLB_CPR_SAFE_END(&cprinfo, &tq->tq_lock);
+ }
+ tq->tq_active++;
+ continue;
+ }
+ tqe->tqent_prev->tqent_next = tqe->tqent_next;
+ tqe->tqent_next->tqent_prev = tqe->tqent_prev;
+ mutex_exit(&tq->tq_lock);
+
+ rw_enter(&tq->tq_threadlock, RW_READER);
+ start = gethrtime();
+ DTRACE_PROBE2(taskq__exec__start, taskq_t *, tq,
+ taskq_ent_t *, tqe);
+ tqe->tqent_func(tqe->tqent_arg);
+ DTRACE_PROBE2(taskq__exec__end, taskq_t *, tq,
+ taskq_ent_t *, tqe);
+ end = gethrtime();
+ rw_exit(&tq->tq_threadlock);
+
+ mutex_enter(&tq->tq_lock);
+ tq->tq_totaltime += end - start;
+ tq->tq_executed++;
+
+ taskq_ent_free(tq, tqe);
+ }
+ tq->tq_nthreads--;
+ cv_broadcast(&tq->tq_wait_cv);
+ ASSERT(!(tq->tq_flags & TASKQ_CPR_SAFE));
+ CALLB_CPR_EXIT(&cprinfo);
+ thread_exit();
+}
+
+/*
+ * Taskq creation. May sleep for memory.
+ * Always use automatically generated instances to avoid kstat name space
+ * collisions.
+ */
+
+taskq_t *
+taskq_create(const char *name, int nthreads, pri_t pri, int minalloc,
+ int maxalloc, uint_t flags)
+{
+ return taskq_create_common(name, 0, nthreads, pri, minalloc,
+ maxalloc, flags | TASKQ_NOINSTANCE);
+}
+
+static taskq_t *
+taskq_create_common(const char *name, int instance, int nthreads, pri_t pri,
+ int minalloc, int maxalloc, uint_t flags)
+{
+ taskq_t *tq = kmem_cache_alloc(taskq_cache, KM_SLEEP);
+ uint_t ncpus = ((boot_max_ncpus == -1) ? max_ncpus : boot_max_ncpus);
+ uint_t bsize; /* # of buckets - always power of 2 */
+
+ ASSERT(instance == 0);
+ ASSERT(flags == TASKQ_PREPOPULATE | TASKQ_NOINSTANCE);
+
+ /*
+ * TASKQ_CPR_SAFE and TASKQ_DYNAMIC flags are mutually exclusive.
+ */
+ ASSERT((flags & (TASKQ_DYNAMIC | TASKQ_CPR_SAFE)) !=
+ ((TASKQ_DYNAMIC | TASKQ_CPR_SAFE)));
+
+ ASSERT(tq->tq_buckets == NULL);
+
+ bsize = 1 << (highbit(ncpus) - 1);
+ ASSERT(bsize >= 1);
+ bsize = MIN(bsize, taskq_maxbuckets);
+
+ tq->tq_maxsize = nthreads;
+
+ (void) strncpy(tq->tq_name, name, TASKQ_NAMELEN + 1);
+ tq->tq_name[TASKQ_NAMELEN] = '\0';
+ /* Make sure the name conforms to the rules for C indentifiers */
+ strident_canon(tq->tq_name, TASKQ_NAMELEN);
+
+ tq->tq_flags = flags | TASKQ_ACTIVE;
+ tq->tq_active = nthreads;
+ tq->tq_nthreads = nthreads;
+ tq->tq_minalloc = minalloc;
+ tq->tq_maxalloc = maxalloc;
+ tq->tq_nbuckets = bsize;
+ tq->tq_pri = pri;
+
+ if (flags & TASKQ_PREPOPULATE) {
+ mutex_enter(&tq->tq_lock);
+ while (minalloc-- > 0)
+ taskq_ent_free(tq, taskq_ent_alloc(tq, TQ_SLEEP));
+ mutex_exit(&tq->tq_lock);
+ }
+
+ if (nthreads == 1) {
+ tq->tq_thread = thread_create(NULL, 0, taskq_thread, tq,
+ 0, NULL, TS_RUN, pri);
+ } else {
+ kthread_t **tpp = kmem_alloc(sizeof (kthread_t *) * nthreads,
+ KM_SLEEP);
+
+ tq->tq_threadlist = tpp;
+
+ mutex_enter(&tq->tq_lock);
+ while (nthreads-- > 0) {
+ *tpp = thread_create(NULL, 0, taskq_thread, tq,
+ 0, NULL, TS_RUN, pri);
+ tpp++;
+ }
+ mutex_exit(&tq->tq_lock);
+ }
+
+ return (tq);
+}
+
+/*
+ * taskq_destroy().
+ *
+ * Assumes: by the time taskq_destroy is called no one will use this task queue
+ * in any way and no one will try to dispatch entries in it.
+ */
+void
+taskq_destroy(taskq_t *tq)
+{
+ taskq_bucket_t *b = tq->tq_buckets;
+ int bid = 0;
+
+ ASSERT(! (tq->tq_flags & TASKQ_CPR_SAFE));
+
+ /*
+ * Wait for any pending entries to complete.
+ */
+ taskq_wait(tq);
+
+ mutex_enter(&tq->tq_lock);
+ ASSERT((tq->tq_task.tqent_next == &tq->tq_task) &&
+ (tq->tq_active == 0));
+
+ if ((tq->tq_nthreads > 1) && (tq->tq_threadlist != NULL))
+ kmem_free(tq->tq_threadlist, sizeof (kthread_t *) *
+ tq->tq_nthreads);
+
+ tq->tq_flags &= ~TASKQ_ACTIVE;
+ cv_broadcast(&tq->tq_dispatch_cv);
+ while (tq->tq_nthreads != 0)
+ cv_wait(&tq->tq_wait_cv, &tq->tq_lock);
+
+ tq->tq_minalloc = 0;
+ while (tq->tq_nalloc != 0)
+ taskq_ent_free(tq, taskq_ent_alloc(tq, TQ_SLEEP));
+
+ mutex_exit(&tq->tq_lock);
+
+ /*
+ * Mark each bucket as closing and wakeup all sleeping threads.
+ */
+ for (; (b != NULL) && (bid < tq->tq_nbuckets); b++, bid++) {
+ taskq_ent_t *tqe;
+
+ mutex_enter(&b->tqbucket_lock);
+
+ b->tqbucket_flags |= TQBUCKET_CLOSE;
+ /* Wakeup all sleeping threads */
+
+ for (tqe = b->tqbucket_freelist.tqent_next;
+ tqe != &b->tqbucket_freelist; tqe = tqe->tqent_next)
+ cv_signal(&tqe->tqent_cv);
+
+ ASSERT(b->tqbucket_nalloc == 0);
+
+ /*
+ * At this point we waited for all pending jobs to complete (in
+ * both the task queue and the bucket and no new jobs should
+ * arrive. Wait for all threads to die.
+ */
+ while (b->tqbucket_nfree > 0)
+ cv_wait(&b->tqbucket_cv, &b->tqbucket_lock);
+ mutex_exit(&b->tqbucket_lock);
+ mutex_destroy(&b->tqbucket_lock);
+ cv_destroy(&b->tqbucket_cv);
+ }
+
+ if (tq->tq_buckets != NULL) {
+ ASSERT(tq->tq_flags & TASKQ_DYNAMIC);
+ kmem_free(tq->tq_buckets,
+ sizeof (taskq_bucket_t) * tq->tq_nbuckets);
+
+ /* Cleanup fields before returning tq to the cache */
+ tq->tq_buckets = NULL;
+ tq->tq_tcreates = 0;
+ tq->tq_tdeaths = 0;
+ } else {
+ ASSERT(!(tq->tq_flags & TASKQ_DYNAMIC));
+ }
+
+ tq->tq_totaltime = 0;
+ tq->tq_tasks = 0;
+ tq->tq_maxtasks = 0;
+ tq->tq_executed = 0;
+ kmem_cache_free(taskq_cache, tq);
+}
+
+SYSINIT(sol_taskq, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, taskq_init, NULL)
+SYSUNINIT(sol_taskq, SI_SUB_DRIVERS, SI_ORDER_MIDDLE, taskq_fini, NULL);
diff --git a/sys/contrib/opensolaris/uts/common/rpc/xdr.c b/sys/contrib/opensolaris/uts/common/rpc/xdr.c
new file mode 100644
index 0000000..65b73b6
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/rpc/xdr.c
@@ -0,0 +1,671 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * Portions of this source code were derived from Berkeley 4.3 BSD
+ * under license from the Regents of the University of California.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * xdr.c, generic XDR routines implementation.
+ * These are the "generic" xdr routines used to serialize and de-serialize
+ * most common data items. See xdr.h for more info on the interface to
+ * xdr.
+ */
+
+#include <sys/param.h>
+#include <sys/cmn_err.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+
+#include <rpc/types.h>
+#include <rpc/xdr.h>
+
+#pragma weak xdr_int32_t = xdr_int
+#pragma weak xdr_uint32_t = xdr_u_int
+#pragma weak xdr_int64_t = xdr_longlong_t
+#pragma weak xdr_uint64_t = xdr_u_longlong_t
+
+#if !defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
+#error "Exactly one of _BIG_ENDIAN or _LITTLE_ENDIAN must be defined"
+#elif defined(_BIG_ENDIAN) && defined(_LITTLE_ENDIAN)
+#error "Only one of _BIG_ENDIAN or _LITTLE_ENDIAN may be defined"
+#endif
+
+/*
+ * constants specific to the xdr "protocol"
+ */
+#define XDR_FALSE ((int32_t)0)
+#define XDR_TRUE ((int32_t)1)
+#define LASTUNSIGNED ((uint_t)0-1)
+
+/*
+ * for unit alignment
+ */
+static char xdr_zero[BYTES_PER_XDR_UNIT] = { 0, 0, 0, 0 };
+
+/*
+ * Free a data structure using XDR
+ * Not a filter, but a convenient utility nonetheless
+ */
+void
+xdr_free(xdrproc_t proc, char *objp)
+{
+ XDR x;
+
+ x.x_op = XDR_FREE;
+ (*proc)(&x, objp);
+}
+
+/*
+ * XDR nothing
+ */
+bool_t
+xdr_void(void)
+{
+ return (TRUE);
+}
+
+/*
+ * XDR integers
+ *
+ * PSARC 2003/523 Contract Private Interface
+ * xdr_int
+ * Changes must be reviewed by Solaris File Sharing
+ * Changes must be communicated to contract-2003-523@sun.com
+ */
+bool_t
+xdr_int(XDR *xdrs, int *ip)
+{
+ if (xdrs->x_op == XDR_ENCODE)
+ return (XDR_PUTINT32(xdrs, ip));
+
+ if (xdrs->x_op == XDR_DECODE)
+ return (XDR_GETINT32(xdrs, ip));
+
+ if (xdrs->x_op == XDR_FREE)
+ return (TRUE);
+
+#ifdef DEBUG
+ printf("xdr_int: FAILED\n");
+#endif
+ return (FALSE);
+}
+
+/*
+ * XDR unsigned integers
+ *
+ * PSARC 2003/523 Contract Private Interface
+ * xdr_u_int
+ * Changes must be reviewed by Solaris File Sharing
+ * Changes must be communicated to contract-2003-523@sun.com
+ */
+bool_t
+xdr_u_int(XDR *xdrs, uint_t *up)
+{
+ if (xdrs->x_op == XDR_ENCODE)
+ return (XDR_PUTINT32(xdrs, (int32_t *)up));
+
+ if (xdrs->x_op == XDR_DECODE)
+ return (XDR_GETINT32(xdrs, (int32_t *)up));
+
+ if (xdrs->x_op == XDR_FREE)
+ return (TRUE);
+
+#ifdef DEBUG
+ printf("xdr_int: FAILED\n");
+#endif
+ return (FALSE);
+}
+
+
+#if defined(_ILP32)
+/*
+ * xdr_long and xdr_u_long for binary compatability on ILP32 kernels.
+ *
+ * No prototypes since new code should not be using these interfaces.
+ */
+bool_t
+xdr_long(XDR *xdrs, long *ip)
+{
+ return (xdr_int(xdrs, (int *)ip));
+}
+
+bool_t
+xdr_u_long(XDR *xdrs, unsigned long *up)
+{
+ return (xdr_u_int(xdrs, (uint_t *)up));
+}
+#endif /* _ILP32 */
+
+
+/*
+ * XDR long long integers
+ */
+bool_t
+xdr_longlong_t(XDR *xdrs, longlong_t *hp)
+{
+ if (xdrs->x_op == XDR_ENCODE) {
+#if defined(_LITTLE_ENDIAN)
+ if (XDR_PUTINT32(xdrs, (int32_t *)((char *)hp +
+ BYTES_PER_XDR_UNIT)) == TRUE) {
+ return (XDR_PUTINT32(xdrs, (int32_t *)hp));
+ }
+#elif defined(_BIG_ENDIAN)
+ if (XDR_PUTINT32(xdrs, (int32_t *)hp) == TRUE) {
+ return (XDR_PUTINT32(xdrs, (int32_t *)((char *)hp +
+ BYTES_PER_XDR_UNIT)));
+ }
+#endif
+ return (FALSE);
+
+ }
+ if (xdrs->x_op == XDR_DECODE) {
+#if defined(_LITTLE_ENDIAN)
+ if (XDR_GETINT32(xdrs, (int32_t *)((char *)hp +
+ BYTES_PER_XDR_UNIT)) == TRUE) {
+ return (XDR_GETINT32(xdrs, (int32_t *)hp));
+ }
+#elif defined(_BIG_ENDIAN)
+ if (XDR_GETINT32(xdrs, (int32_t *)hp) == TRUE) {
+ return (XDR_GETINT32(xdrs, (int32_t *)((char *)hp +
+ BYTES_PER_XDR_UNIT)));
+ }
+#endif
+ return (FALSE);
+ }
+ return (TRUE);
+}
+
+/*
+ * XDR unsigned long long integers
+ */
+bool_t
+xdr_u_longlong_t(XDR *xdrs, u_longlong_t *hp)
+{
+
+ if (xdrs->x_op == XDR_ENCODE) {
+#if defined(_LITTLE_ENDIAN)
+ if (XDR_PUTINT32(xdrs, (int32_t *)((char *)hp +
+ BYTES_PER_XDR_UNIT)) == TRUE) {
+ return (XDR_PUTINT32(xdrs, (int32_t *)hp));
+ }
+#elif defined(_BIG_ENDIAN)
+ if (XDR_PUTINT32(xdrs, (int32_t *)hp) == TRUE) {
+ return (XDR_PUTINT32(xdrs, (int32_t *)((char *)hp +
+ BYTES_PER_XDR_UNIT)));
+ }
+#endif
+ return (FALSE);
+
+ }
+ if (xdrs->x_op == XDR_DECODE) {
+#if defined(_LITTLE_ENDIAN)
+ if (XDR_GETINT32(xdrs, (int32_t *)((char *)hp +
+ BYTES_PER_XDR_UNIT)) == TRUE) {
+ return (XDR_GETINT32(xdrs, (int32_t *)hp));
+ }
+#elif defined(_BIG_ENDIAN)
+ if (XDR_GETINT32(xdrs, (int32_t *)hp) == TRUE) {
+ return (XDR_GETINT32(xdrs, (int32_t *)((char *)hp +
+ BYTES_PER_XDR_UNIT)));
+ }
+#endif
+ return (FALSE);
+ }
+ return (TRUE);
+}
+
+/*
+ * XDR short integers
+ */
+bool_t
+xdr_short(XDR *xdrs, short *sp)
+{
+ int32_t l;
+
+ switch (xdrs->x_op) {
+
+ case XDR_ENCODE:
+ l = (int32_t)*sp;
+ return (XDR_PUTINT32(xdrs, &l));
+
+ case XDR_DECODE:
+ if (!XDR_GETINT32(xdrs, &l))
+ return (FALSE);
+ *sp = (short)l;
+ return (TRUE);
+
+ case XDR_FREE:
+ return (TRUE);
+ }
+ return (FALSE);
+}
+
+/*
+ * XDR unsigned short integers
+ */
+bool_t
+xdr_u_short(XDR *xdrs, ushort_t *usp)
+{
+ uint32_t l;
+
+ switch (xdrs->x_op) {
+
+ case XDR_ENCODE:
+ l = (uint32_t)*usp;
+ return (XDR_PUTINT32(xdrs, (int32_t *)&l));
+
+ case XDR_DECODE:
+ if (!XDR_GETINT32(xdrs, (int32_t *)&l)) {
+#ifdef DEBUG
+ printf("xdr_u_short: decode FAILED\n");
+#endif
+ return (FALSE);
+ }
+ *usp = (ushort_t)l;
+ return (TRUE);
+
+ case XDR_FREE:
+ return (TRUE);
+ }
+#ifdef DEBUG
+ printf("xdr_u_short: bad op FAILED\n");
+#endif
+ return (FALSE);
+}
+
+
+/*
+ * XDR a char
+ */
+bool_t
+xdr_char(XDR *xdrs, char *cp)
+{
+ int i;
+
+ i = (*cp);
+ if (!xdr_int(xdrs, &i)) {
+ return (FALSE);
+ }
+ *cp = (char)i;
+ return (TRUE);
+}
+
+/*
+ * XDR booleans
+ *
+ * PSARC 2003/523 Contract Private Interface
+ * xdr_bool
+ * Changes must be reviewed by Solaris File Sharing
+ * Changes must be communicated to contract-2003-523@sun.com
+ */
+bool_t
+xdr_bool(XDR *xdrs, bool_t *bp)
+{
+ int32_t i32b;
+
+ switch (xdrs->x_op) {
+
+ case XDR_ENCODE:
+ i32b = *bp ? XDR_TRUE : XDR_FALSE;
+ return (XDR_PUTINT32(xdrs, &i32b));
+
+ case XDR_DECODE:
+ if (!XDR_GETINT32(xdrs, &i32b)) {
+#ifdef DEBUG
+ printf("xdr_bool: decode FAILED\n");
+#endif
+ return (FALSE);
+ }
+ *bp = (i32b == XDR_FALSE) ? FALSE : TRUE;
+ return (TRUE);
+
+ case XDR_FREE:
+ return (TRUE);
+ }
+#ifdef DEBUG
+ printf("xdr_bool: bad op FAILED\n");
+#endif
+ return (FALSE);
+}
+
+/*
+ * XDR enumerations
+ *
+ * PSARC 2003/523 Contract Private Interface
+ * xdr_enum
+ * Changes must be reviewed by Solaris File Sharing
+ * Changes must be communicated to contract-2003-523@sun.com
+ */
+#ifndef lint
+enum sizecheck { SIZEVAL } sizecheckvar; /* used to find the size of */
+ /* an enum */
+#endif
+bool_t
+xdr_enum(XDR *xdrs, enum_t *ep)
+{
+#ifndef lint
+ /*
+ * enums are treated as ints
+ */
+ if (sizeof (sizecheckvar) == sizeof (int32_t)) {
+ return (xdr_int(xdrs, (int32_t *)ep));
+ } else if (sizeof (sizecheckvar) == sizeof (short)) {
+ return (xdr_short(xdrs, (short *)ep));
+ } else {
+ return (FALSE);
+ }
+#else
+ (void) (xdr_short(xdrs, (short *)ep));
+ return (xdr_int(xdrs, (int32_t *)ep));
+#endif
+}
+
+/*
+ * XDR opaque data
+ * Allows the specification of a fixed size sequence of opaque bytes.
+ * cp points to the opaque object and cnt gives the byte length.
+ *
+ * PSARC 2003/523 Contract Private Interface
+ * xdr_opaque
+ * Changes must be reviewed by Solaris File Sharing
+ * Changes must be communicated to contract-2003-523@sun.com
+ */
+bool_t
+xdr_opaque(XDR *xdrs, caddr_t cp, const uint_t cnt)
+{
+ uint_t rndup;
+ static char crud[BYTES_PER_XDR_UNIT];
+
+ /*
+ * if no data we are done
+ */
+ if (cnt == 0)
+ return (TRUE);
+
+ /*
+ * round byte count to full xdr units
+ */
+ rndup = cnt % BYTES_PER_XDR_UNIT;
+ if (rndup != 0)
+ rndup = BYTES_PER_XDR_UNIT - rndup;
+
+ if (xdrs->x_op == XDR_DECODE) {
+ if (!XDR_GETBYTES(xdrs, cp, cnt)) {
+#ifdef DEBUG
+ printf("xdr_opaque: decode FAILED\n");
+#endif
+ return (FALSE);
+ }
+ if (rndup == 0)
+ return (TRUE);
+ return (XDR_GETBYTES(xdrs, (caddr_t)crud, rndup));
+ }
+
+ if (xdrs->x_op == XDR_ENCODE) {
+ if (!XDR_PUTBYTES(xdrs, cp, cnt)) {
+#ifdef DEBUG
+ printf("xdr_opaque: encode FAILED\n");
+#endif
+ return (FALSE);
+ }
+ if (rndup == 0)
+ return (TRUE);
+ return (XDR_PUTBYTES(xdrs, xdr_zero, rndup));
+ }
+
+ if (xdrs->x_op == XDR_FREE)
+ return (TRUE);
+
+#ifdef DEBUG
+ printf("xdr_opaque: bad op FAILED\n");
+#endif
+ return (FALSE);
+}
+
+/*
+ * XDR counted bytes
+ * *cpp is a pointer to the bytes, *sizep is the count.
+ * If *cpp is NULL maxsize bytes are allocated
+ *
+ * PSARC 2003/523 Contract Private Interface
+ * xdr_bytes
+ * Changes must be reviewed by Solaris File Sharing
+ * Changes must be communicated to contract-2003-523@sun.com
+ */
+bool_t
+xdr_bytes(XDR *xdrs, char **cpp, uint_t *sizep, const uint_t maxsize)
+{
+ char *sp = *cpp; /* sp is the actual string pointer */
+ uint_t nodesize;
+
+ /*
+ * first deal with the length since xdr bytes are counted
+ */
+ if (!xdr_u_int(xdrs, sizep)) {
+#ifdef DEBUG
+ printf("xdr_bytes: size FAILED\n");
+#endif
+ return (FALSE);
+ }
+ nodesize = *sizep;
+ if ((nodesize > maxsize) && (xdrs->x_op != XDR_FREE)) {
+#ifdef DEBUG
+ printf("xdr_bytes: bad size (%d) FAILED (%d max)\n",
+ nodesize, maxsize);
+#endif
+ return (FALSE);
+ }
+
+ /*
+ * now deal with the actual bytes
+ */
+ switch (xdrs->x_op) {
+ case XDR_DECODE:
+ if (nodesize == 0)
+ return (TRUE);
+ if (sp == NULL)
+ *cpp = sp = (char *)mem_alloc(nodesize);
+ /* FALLTHROUGH */
+
+ case XDR_ENCODE:
+ return (xdr_opaque(xdrs, sp, nodesize));
+
+ case XDR_FREE:
+ if (sp != NULL) {
+ mem_free(sp, nodesize);
+ *cpp = NULL;
+ }
+ return (TRUE);
+ }
+#ifdef DEBUG
+ printf("xdr_bytes: bad op FAILED\n");
+#endif
+ return (FALSE);
+}
+
+/*
+ * Implemented here due to commonality of the object.
+ */
+bool_t
+xdr_netobj(XDR *xdrs, struct netobj *np)
+{
+ return (xdr_bytes(xdrs, &np->n_bytes, &np->n_len, MAX_NETOBJ_SZ));
+}
+
+/*
+ * XDR a descriminated union
+ * Support routine for discriminated unions.
+ * You create an array of xdrdiscrim structures, terminated with
+ * an entry with a null procedure pointer. The routine gets
+ * the discriminant value and then searches the array of xdrdiscrims
+ * looking for that value. It calls the procedure given in the xdrdiscrim
+ * to handle the discriminant. If there is no specific routine a default
+ * routine may be called.
+ * If there is no specific or default routine an error is returned.
+ */
+bool_t
+xdr_union(XDR *xdrs, enum_t *dscmp, char *unp,
+ const struct xdr_discrim *choices, const xdrproc_t dfault)
+{
+ enum_t dscm;
+
+ /*
+ * we deal with the discriminator; it's an enum
+ */
+ if (!xdr_enum(xdrs, dscmp)) {
+#ifdef DEBUG
+ printf("xdr_enum: dscmp FAILED\n");
+#endif
+ return (FALSE);
+ }
+ dscm = *dscmp;
+
+ /*
+ * search choices for a value that matches the discriminator.
+ * if we find one, execute the xdr routine for that value.
+ */
+ for (; choices->proc != NULL_xdrproc_t; choices++) {
+ if (choices->value == dscm)
+ return ((*(choices->proc))(xdrs, unp, LASTUNSIGNED));
+ }
+
+ /*
+ * no match - execute the default xdr routine if there is one
+ */
+ return ((dfault == NULL_xdrproc_t) ? FALSE :
+ (*dfault)(xdrs, unp, LASTUNSIGNED));
+}
+
+
+/*
+ * Non-portable xdr primitives.
+ * Care should be taken when moving these routines to new architectures.
+ */
+
+
+/*
+ * XDR null terminated ASCII strings
+ * xdr_string deals with "C strings" - arrays of bytes that are
+ * terminated by a NULL character. The parameter cpp references a
+ * pointer to storage; If the pointer is null, then the necessary
+ * storage is allocated. The last parameter is the max allowed length
+ * of the string as specified by a protocol.
+ */
+bool_t
+xdr_string(XDR *xdrs, char **cpp, const uint_t maxsize)
+{
+ char *sp = *cpp; /* sp is the actual string pointer */
+ uint_t size;
+ uint_t nodesize;
+
+ /*
+ * first deal with the length since xdr strings are counted-strings
+ */
+ switch (xdrs->x_op) {
+ case XDR_FREE:
+ if (sp == NULL)
+ return (TRUE); /* already free */
+ /* FALLTHROUGH */
+ case XDR_ENCODE:
+ size = (sp != NULL) ? (uint_t)strlen(sp) : 0;
+ break;
+ case XDR_DECODE:
+ break;
+ }
+ if (!xdr_u_int(xdrs, &size)) {
+#ifdef DEBUG
+ printf("xdr_string: size FAILED\n");
+#endif
+ return (FALSE);
+ }
+ if (size > maxsize) {
+#ifdef DEBUG
+ printf("xdr_string: bad size FAILED\n");
+#endif
+ return (FALSE);
+ }
+ nodesize = size + 1;
+
+ /*
+ * now deal with the actual bytes
+ */
+ switch (xdrs->x_op) {
+ case XDR_DECODE:
+ if (nodesize == 0)
+ return (TRUE);
+ if (sp == NULL)
+ sp = (char *)mem_alloc(nodesize);
+ sp[size] = 0;
+ if (!xdr_opaque(xdrs, sp, size)) {
+ /*
+ * free up memory if allocated here
+ */
+ if (*cpp == NULL) {
+ mem_free(sp, nodesize);
+ }
+ return (FALSE);
+ }
+ if (strlen(sp) != size) {
+ if (*cpp == NULL) {
+ mem_free(sp, nodesize);
+ }
+ return (FALSE);
+ }
+ *cpp = sp;
+ return (TRUE);
+
+ case XDR_ENCODE:
+ return (xdr_opaque(xdrs, sp, size));
+
+ case XDR_FREE:
+ mem_free(sp, nodesize);
+ *cpp = NULL;
+ return (TRUE);
+ }
+#ifdef DEBUG
+ printf("xdr_string: bad op FAILED\n");
+#endif
+ return (FALSE);
+}
+
+/*
+ * Wrapper for xdr_string that can be called directly from
+ * routines like clnt_call
+ */
+bool_t
+xdr_wrapstring(XDR *xdrs, char **cpp)
+{
+ if (xdr_string(xdrs, cpp, LASTUNSIGNED))
+ return (TRUE);
+ return (FALSE);
+}
diff --git a/sys/contrib/opensolaris/uts/common/rpc/xdr.h b/sys/contrib/opensolaris/uts/common/rpc/xdr.h
new file mode 100644
index 0000000..c8eb419
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/rpc/xdr.h
@@ -0,0 +1,605 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ *
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+/*
+ * Portions of this source code were derived from Berkeley
+ * 4.3 BSD under license from the Regents of the University of
+ * California.
+ */
+
+/*
+ * xdr.h, External Data Representation Serialization Routines.
+ *
+ */
+
+#ifndef _RPC_XDR_H
+#define _RPC_XDR_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/byteorder.h> /* For all ntoh* and hton*() kind of macros */
+#include <rpc/types.h> /* For all ntoh* and hton*() kind of macros */
+#ifndef _KERNEL
+#include <stdio.h> /* defines FILE *, used in ANSI C function prototypes */
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * XDR provides a conventional way for converting between C data
+ * types and an external bit-string representation. Library supplied
+ * routines provide for the conversion on built-in C data types. These
+ * routines and utility routines defined here are used to help implement
+ * a type encode/decode routine for each user-defined type.
+ *
+ * Each data type provides a single procedure which takes two arguments:
+ *
+ * bool_t
+ * xdrproc(xdrs, argresp)
+ * XDR *xdrs;
+ * <type> *argresp;
+ *
+ * xdrs is an instance of a XDR handle, to which or from which the data
+ * type is to be converted. argresp is a pointer to the structure to be
+ * converted. The XDR handle contains an operation field which indicates
+ * which of the operations (ENCODE, DECODE * or FREE) is to be performed.
+ *
+ * XDR_DECODE may allocate space if the pointer argresp is null. This
+ * data can be freed with the XDR_FREE operation.
+ *
+ * We write only one procedure per data type to make it easy
+ * to keep the encode and decode procedures for a data type consistent.
+ * In many cases the same code performs all operations on a user defined type,
+ * because all the hard work is done in the component type routines.
+ * decode as a series of calls on the nested data types.
+ */
+
+/*
+ * Xdr operations. XDR_ENCODE causes the type to be encoded into the
+ * stream. XDR_DECODE causes the type to be extracted from the stream.
+ * XDR_FREE can be used to release the space allocated by an XDR_DECODE
+ * request.
+ */
+enum xdr_op {
+ XDR_ENCODE = 0,
+ XDR_DECODE = 1,
+ XDR_FREE = 2
+};
+
+/*
+ * This is the number of bytes per unit of external data.
+ */
+#define BYTES_PER_XDR_UNIT (4)
+#define RNDUP(x) ((((x) + BYTES_PER_XDR_UNIT - 1) / BYTES_PER_XDR_UNIT) \
+ * BYTES_PER_XDR_UNIT)
+
+/*
+ * The XDR handle.
+ * Contains operation which is being applied to the stream,
+ * an operations vector for the paticular implementation (e.g. see xdr_mem.c),
+ * and two private fields for the use of the particular impelementation.
+ *
+ * PSARC 2003/523 Contract Private Interface
+ * XDR
+ * Changes must be reviewed by Solaris File Sharing
+ * Changes must be communicated to contract-2003-523@sun.com
+ */
+typedef struct XDR {
+ enum xdr_op x_op; /* operation; fast additional param */
+ struct xdr_ops *x_ops;
+ caddr_t x_public; /* users' data */
+ caddr_t x_private; /* pointer to private data */
+ caddr_t x_base; /* private used for position info */
+ int x_handy; /* extra private word */
+} XDR;
+
+/*
+ * PSARC 2003/523 Contract Private Interface
+ * xdr_ops
+ * Changes must be reviewed by Solaris File Sharing
+ * Changes must be communicated to contract-2003-523@sun.com
+ */
+struct xdr_ops {
+#ifdef __STDC__
+#if !defined(_KERNEL)
+ bool_t (*x_getlong)(struct XDR *, long *);
+ /* get a long from underlying stream */
+ bool_t (*x_putlong)(struct XDR *, long *);
+ /* put a long to " */
+#endif /* KERNEL */
+ bool_t (*x_getbytes)(struct XDR *, caddr_t, int);
+ /* get some bytes from " */
+ bool_t (*x_putbytes)(struct XDR *, caddr_t, int);
+ /* put some bytes to " */
+ uint_t (*x_getpostn)(struct XDR *);
+ /* returns bytes off from beginning */
+ bool_t (*x_setpostn)(struct XDR *, uint_t);
+ /* lets you reposition the stream */
+ rpc_inline_t *(*x_inline)(struct XDR *, int);
+ /* buf quick ptr to buffered data */
+ void (*x_destroy)(struct XDR *);
+ /* free privates of this xdr_stream */
+ bool_t (*x_control)(struct XDR *, int, void *);
+#if defined(_LP64) || defined(_KERNEL)
+ bool_t (*x_getint32)(struct XDR *, int32_t *);
+ /* get a int from underlying stream */
+ bool_t (*x_putint32)(struct XDR *, int32_t *);
+ /* put an int to " */
+#endif /* _LP64 || _KERNEL */
+#else
+#if !defined(_KERNEL)
+ bool_t (*x_getlong)(); /* get a long from underlying stream */
+ bool_t (*x_putlong)(); /* put a long to " */
+#endif /* KERNEL */
+ bool_t (*x_getbytes)(); /* get some bytes from " */
+ bool_t (*x_putbytes)(); /* put some bytes to " */
+ uint_t (*x_getpostn)(); /* returns bytes off from beginning */
+ bool_t (*x_setpostn)(); /* lets you reposition the stream */
+ rpc_inline_t *(*x_inline)();
+ /* buf quick ptr to buffered data */
+ void (*x_destroy)(); /* free privates of this xdr_stream */
+ bool_t (*x_control)();
+#if defined(_LP64) || defined(_KERNEL)
+ bool_t (*x_getint32)();
+ bool_t (*x_putint32)();
+#endif /* _LP64 || defined(_KERNEL) */
+#endif
+};
+
+/*
+ * Operations defined on a XDR handle
+ *
+ * XDR *xdrs;
+ * long *longp;
+ * caddr_t addr;
+ * uint_t len;
+ * uint_t pos;
+ */
+#if !defined(_KERNEL)
+#define XDR_GETLONG(xdrs, longp) \
+ (*(xdrs)->x_ops->x_getlong)(xdrs, longp)
+#define xdr_getlong(xdrs, longp) \
+ (*(xdrs)->x_ops->x_getlong)(xdrs, longp)
+
+#define XDR_PUTLONG(xdrs, longp) \
+ (*(xdrs)->x_ops->x_putlong)(xdrs, longp)
+#define xdr_putlong(xdrs, longp) \
+ (*(xdrs)->x_ops->x_putlong)(xdrs, longp)
+#endif /* KERNEL */
+
+
+#if !defined(_LP64) && !defined(_KERNEL)
+
+/*
+ * For binary compatability on ILP32 we do not change the shape
+ * of the XDR structure and the GET/PUTINT32 functions just use
+ * the get/putlong vectors which operate on identically-sized
+ * units of data.
+ */
+
+#define XDR_GETINT32(xdrs, int32p) \
+ (*(xdrs)->x_ops->x_getlong)(xdrs, (long *)int32p)
+#define xdr_getint32(xdrs, int32p) \
+ (*(xdrs)->x_ops->x_getlong)(xdrs, (long *)int32p)
+
+#define XDR_PUTINT32(xdrs, int32p) \
+ (*(xdrs)->x_ops->x_putlong)(xdrs, (long *)int32p)
+#define xdr_putint32(xdrs, int32p) \
+ (*(xdrs)->x_ops->x_putlong)(xdrs, (long *)int32p)
+
+#else /* !_LP64 && !_KERNEL */
+
+#define XDR_GETINT32(xdrs, int32p) \
+ (*(xdrs)->x_ops->x_getint32)(xdrs, int32p)
+#define xdr_getint32(xdrs, int32p) \
+ (*(xdrs)->x_ops->x_getint32)(xdrs, int32p)
+
+#define XDR_PUTINT32(xdrs, int32p) \
+ (*(xdrs)->x_ops->x_putint32)(xdrs, int32p)
+#define xdr_putint32(xdrs, int32p) \
+ (*(xdrs)->x_ops->x_putint32)(xdrs, int32p)
+
+#endif /* !_LP64 && !_KERNEL */
+
+#define XDR_GETBYTES(xdrs, addr, len) \
+ (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len)
+#define xdr_getbytes(xdrs, addr, len) \
+ (*(xdrs)->x_ops->x_getbytes)(xdrs, addr, len)
+
+#define XDR_PUTBYTES(xdrs, addr, len) \
+ (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len)
+#define xdr_putbytes(xdrs, addr, len) \
+ (*(xdrs)->x_ops->x_putbytes)(xdrs, addr, len)
+
+#define XDR_GETPOS(xdrs) \
+ (*(xdrs)->x_ops->x_getpostn)(xdrs)
+#define xdr_getpos(xdrs) \
+ (*(xdrs)->x_ops->x_getpostn)(xdrs)
+
+#define XDR_SETPOS(xdrs, pos) \
+ (*(xdrs)->x_ops->x_setpostn)(xdrs, pos)
+#define xdr_setpos(xdrs, pos) \
+ (*(xdrs)->x_ops->x_setpostn)(xdrs, pos)
+
+#define XDR_INLINE(xdrs, len) \
+ (*(xdrs)->x_ops->x_inline)(xdrs, len)
+#define xdr_inline(xdrs, len) \
+ (*(xdrs)->x_ops->x_inline)(xdrs, len)
+
+#define XDR_DESTROY(xdrs) \
+ (*(xdrs)->x_ops->x_destroy)(xdrs)
+#define xdr_destroy(xdrs) \
+ (*(xdrs)->x_ops->x_destroy)(xdrs)
+
+#define XDR_CONTROL(xdrs, req, op) \
+ (*(xdrs)->x_ops->x_control)(xdrs, req, op)
+#define xdr_control(xdrs, req, op) \
+ (*(xdrs)->x_ops->x_control)(xdrs, req, op)
+
+/*
+ * Support struct for discriminated unions.
+ * You create an array of xdrdiscrim structures, terminated with
+ * a entry with a null procedure pointer. The xdr_union routine gets
+ * the discriminant value and then searches the array of structures
+ * for a matching value. If a match is found the associated xdr routine
+ * is called to handle that part of the union. If there is
+ * no match, then a default routine may be called.
+ * If there is no match and no default routine it is an error.
+ */
+
+
+/*
+ * A xdrproc_t exists for each data type which is to be encoded or decoded.
+ *
+ * The second argument to the xdrproc_t is a pointer to an opaque pointer.
+ * The opaque pointer generally points to a structure of the data type
+ * to be decoded. If this pointer is 0, then the type routines should
+ * allocate dynamic storage of the appropriate size and return it.
+ * bool_t (*xdrproc_t)(XDR *, void *);
+ */
+#ifdef __cplusplus
+typedef bool_t (*xdrproc_t)(XDR *, void *);
+#else
+#ifdef __STDC__
+typedef bool_t (*xdrproc_t)(); /* For Backward compatibility */
+#else
+typedef bool_t (*xdrproc_t)();
+#endif
+#endif
+
+#define NULL_xdrproc_t ((xdrproc_t)0)
+
+#if defined(_LP64) || defined(_I32LPx)
+#define xdr_rpcvers(xdrs, versp) xdr_u_int(xdrs, versp)
+#define xdr_rpcprog(xdrs, progp) xdr_u_int(xdrs, progp)
+#define xdr_rpcproc(xdrs, procp) xdr_u_int(xdrs, procp)
+#define xdr_rpcprot(xdrs, protp) xdr_u_int(xdrs, protp)
+#define xdr_rpcport(xdrs, portp) xdr_u_int(xdrs, portp)
+#else
+#define xdr_rpcvers(xdrs, versp) xdr_u_long(xdrs, versp)
+#define xdr_rpcprog(xdrs, progp) xdr_u_long(xdrs, progp)
+#define xdr_rpcproc(xdrs, procp) xdr_u_long(xdrs, procp)
+#define xdr_rpcprot(xdrs, protp) xdr_u_long(xdrs, protp)
+#define xdr_rpcport(xdrs, portp) xdr_u_long(xdrs, portp)
+#endif
+
+struct xdr_discrim {
+ int value;
+ xdrproc_t proc;
+};
+
+/*
+ * In-line routines for fast encode/decode of primitve data types.
+ * Caveat emptor: these use single memory cycles to get the
+ * data from the underlying buffer, and will fail to operate
+ * properly if the data is not aligned. The standard way to use these
+ * is to say:
+ * if ((buf = XDR_INLINE(xdrs, count)) == NULL)
+ * return (FALSE);
+ * <<< macro calls >>>
+ * where ``count'' is the number of bytes of data occupied
+ * by the primitive data types.
+ *
+ * N.B. and frozen for all time: each data type here uses 4 bytes
+ * of external representation.
+ */
+
+#define IXDR_GET_INT32(buf) ((int32_t)ntohl((uint32_t)*(buf)++))
+#define IXDR_PUT_INT32(buf, v) (*(buf)++ = (int32_t)htonl((uint32_t)v))
+#define IXDR_GET_U_INT32(buf) ((uint32_t)IXDR_GET_INT32(buf))
+#define IXDR_PUT_U_INT32(buf, v) IXDR_PUT_INT32((buf), ((int32_t)(v)))
+
+#if !defined(_KERNEL) && !defined(_LP64)
+
+#define IXDR_GET_LONG(buf) ((long)ntohl((ulong_t)*(buf)++))
+#define IXDR_PUT_LONG(buf, v) (*(buf)++ = (long)htonl((ulong_t)v))
+#define IXDR_GET_U_LONG(buf) ((ulong_t)IXDR_GET_LONG(buf))
+#define IXDR_PUT_U_LONG(buf, v) IXDR_PUT_LONG((buf), ((long)(v)))
+
+#define IXDR_GET_BOOL(buf) ((bool_t)IXDR_GET_LONG(buf))
+#define IXDR_GET_ENUM(buf, t) ((t)IXDR_GET_LONG(buf))
+#define IXDR_GET_SHORT(buf) ((short)IXDR_GET_LONG(buf))
+#define IXDR_GET_U_SHORT(buf) ((ushort_t)IXDR_GET_LONG(buf))
+
+#define IXDR_PUT_BOOL(buf, v) IXDR_PUT_LONG((buf), ((long)(v)))
+#define IXDR_PUT_ENUM(buf, v) IXDR_PUT_LONG((buf), ((long)(v)))
+#define IXDR_PUT_SHORT(buf, v) IXDR_PUT_LONG((buf), ((long)(v)))
+#define IXDR_PUT_U_SHORT(buf, v) IXDR_PUT_LONG((buf), ((long)(v)))
+
+#else
+
+#define IXDR_GET_BOOL(buf) ((bool_t)IXDR_GET_INT32(buf))
+#define IXDR_GET_ENUM(buf, t) ((t)IXDR_GET_INT32(buf))
+#define IXDR_GET_SHORT(buf) ((short)IXDR_GET_INT32(buf))
+#define IXDR_GET_U_SHORT(buf) ((ushort_t)IXDR_GET_INT32(buf))
+
+#define IXDR_PUT_BOOL(buf, v) IXDR_PUT_INT32((buf), ((int)(v)))
+#define IXDR_PUT_ENUM(buf, v) IXDR_PUT_INT32((buf), ((int)(v)))
+#define IXDR_PUT_SHORT(buf, v) IXDR_PUT_INT32((buf), ((int)(v)))
+#define IXDR_PUT_U_SHORT(buf, v) IXDR_PUT_INT32((buf), ((int)(v)))
+
+#endif
+
+#ifndef _LITTLE_ENDIAN
+#define IXDR_GET_HYPER(buf, v) { \
+ *((int32_t *)(&v)) = ntohl(*(uint32_t *)buf++); \
+ *((int32_t *)(((char *)&v) + BYTES_PER_XDR_UNIT)) \
+ = ntohl(*(uint32_t *)buf++); \
+ }
+#define IXDR_PUT_HYPER(buf, v) { \
+ *(buf)++ = (int32_t)htonl(*(uint32_t *) \
+ ((char *)&v)); \
+ *(buf)++ = \
+ (int32_t)htonl(*(uint32_t *)(((char *)&v) \
+ + BYTES_PER_XDR_UNIT)); \
+ }
+#else
+
+#define IXDR_GET_HYPER(buf, v) { \
+ *((int32_t *)(((char *)&v) + \
+ BYTES_PER_XDR_UNIT)) \
+ = ntohl(*(uint32_t *)buf++); \
+ *((int32_t *)(&v)) = \
+ ntohl(*(uint32_t *)buf++); \
+ }
+
+#define IXDR_PUT_HYPER(buf, v) { \
+ *(buf)++ = \
+ (int32_t)htonl(*(uint32_t *)(((char *)&v) + \
+ BYTES_PER_XDR_UNIT)); \
+ *(buf)++ = \
+ (int32_t)htonl(*(uint32_t *)((char *)&v)); \
+ }
+#endif
+#define IXDR_GET_U_HYPER(buf, v) IXDR_GET_HYPER(buf, v)
+#define IXDR_PUT_U_HYPER(buf, v) IXDR_PUT_HYPER(buf, v)
+
+
+/*
+ * These are the "generic" xdr routines.
+ */
+#ifdef __STDC__
+extern bool_t xdr_void(void);
+extern bool_t xdr_int(XDR *, int *);
+extern bool_t xdr_u_int(XDR *, uint_t *);
+extern bool_t xdr_long(XDR *, long *);
+extern bool_t xdr_u_long(XDR *, ulong_t *);
+extern bool_t xdr_short(XDR *, short *);
+extern bool_t xdr_u_short(XDR *, ushort_t *);
+extern bool_t xdr_bool(XDR *, bool_t *);
+extern bool_t xdr_enum(XDR *, enum_t *);
+extern bool_t xdr_array(XDR *, caddr_t *, uint_t *, const uint_t,
+ const uint_t, const xdrproc_t);
+extern bool_t xdr_bytes(XDR *, char **, uint_t *, const uint_t);
+extern bool_t xdr_opaque(XDR *, caddr_t, const uint_t);
+extern bool_t xdr_string(XDR *, char **, const uint_t);
+extern bool_t xdr_union(XDR *, enum_t *, char *,
+ const struct xdr_discrim *, const xdrproc_t);
+extern unsigned int xdr_sizeof(xdrproc_t, void *);
+
+extern bool_t xdr_hyper(XDR *, longlong_t *);
+extern bool_t xdr_longlong_t(XDR *, longlong_t *);
+extern bool_t xdr_u_hyper(XDR *, u_longlong_t *);
+extern bool_t xdr_u_longlong_t(XDR *, u_longlong_t *);
+
+extern bool_t xdr_char(XDR *, char *);
+extern bool_t xdr_wrapstring(XDR *, char **);
+extern bool_t xdr_reference(XDR *, caddr_t *, uint_t, const xdrproc_t);
+extern bool_t xdr_pointer(XDR *, char **, uint_t, const xdrproc_t);
+extern void xdr_free(xdrproc_t, char *);
+extern bool_t xdr_time_t(XDR *, time_t *);
+
+extern bool_t xdr_int8_t(XDR *, int8_t *);
+extern bool_t xdr_uint8_t(XDR *, uint8_t *);
+extern bool_t xdr_int16_t(XDR *, int16_t *);
+extern bool_t xdr_uint16_t(XDR *, uint16_t *);
+extern bool_t xdr_int32_t(XDR *, int32_t *);
+extern bool_t xdr_uint32_t(XDR *, uint32_t *);
+#if defined(_INT64_TYPE)
+extern bool_t xdr_int64_t(XDR *, int64_t *);
+extern bool_t xdr_uint64_t(XDR *, uint64_t *);
+#endif
+
+#ifndef _KERNEL
+extern bool_t xdr_u_char(XDR *, uchar_t *);
+extern bool_t xdr_vector(XDR *, char *, const uint_t, const uint_t, const
+xdrproc_t);
+extern bool_t xdr_float(XDR *, float *);
+extern bool_t xdr_double(XDR *, double *);
+extern bool_t xdr_quadruple(XDR *, long double *);
+#endif /* !_KERNEL */
+#else
+extern bool_t xdr_void();
+extern bool_t xdr_int();
+extern bool_t xdr_u_int();
+extern bool_t xdr_long();
+extern bool_t xdr_u_long();
+extern bool_t xdr_short();
+extern bool_t xdr_u_short();
+extern bool_t xdr_bool();
+extern bool_t xdr_enum();
+extern bool_t xdr_array();
+extern bool_t xdr_bytes();
+extern bool_t xdr_opaque();
+extern bool_t xdr_string();
+extern bool_t xdr_union();
+
+extern bool_t xdr_hyper();
+extern bool_t xdr_longlong_t();
+extern bool_t xdr_u_hyper();
+extern bool_t xdr_u_longlong_t();
+extern bool_t xdr_char();
+extern bool_t xdr_reference();
+extern bool_t xdr_pointer();
+extern void xdr_free();
+extern bool_t xdr_wrapstring();
+extern bool_t xdr_time_t();
+
+extern bool_t xdr_int8_t();
+extern bool_t xdr_uint8_t();
+extern bool_t xdr_int16_t();
+extern bool_t xdr_uint16_t();
+extern bool_t xdr_int32_t();
+extern bool_t xdr_uint32_t();
+#if defined(_INT64_TYPE)
+extern bool_t xdr_int64_t();
+extern bool_t xdr_uint64_t();
+#endif
+
+#ifndef _KERNEL
+extern bool_t xdr_u_char();
+extern bool_t xdr_vector();
+extern bool_t xdr_float();
+extern bool_t xdr_double();
+extern bool_t xdr_quadruple();
+#endif /* !_KERNEL */
+#endif
+
+/*
+ * Common opaque bytes objects used by many rpc protocols;
+ * declared here due to commonality.
+ */
+#define MAX_NETOBJ_SZ 1024
+struct netobj {
+ uint_t n_len;
+ char *n_bytes;
+};
+typedef struct netobj netobj;
+
+#ifdef __STDC__
+extern bool_t xdr_netobj(XDR *, netobj *);
+#else
+extern bool_t xdr_netobj();
+#endif
+
+/*
+ * These are XDR control operators
+ */
+
+#define XDR_GET_BYTES_AVAIL 1
+
+struct xdr_bytesrec {
+ bool_t xc_is_last_record;
+ size_t xc_num_avail;
+};
+
+typedef struct xdr_bytesrec xdr_bytesrec;
+
+/*
+ * These are the request arguments to XDR_CONTROL.
+ *
+ * XDR_PEEK - returns the contents of the next XDR unit on the XDR stream.
+ * XDR_SKIPBYTES - skips the next N bytes in the XDR stream.
+ * XDR_RDMAGET - for xdr implementation over RDMA, gets private flags from
+ * the XDR stream being moved over RDMA
+ * XDR_RDMANOCHUNK - for xdr implementaion over RDMA, sets private flags in
+ * the XDR stream moving over RDMA.
+ */
+#ifdef _KERNEL
+#define XDR_PEEK 2
+#define XDR_SKIPBYTES 3
+#define XDR_RDMAGET 4
+#define XDR_RDMASET 5
+#endif
+
+/*
+ * These are the public routines for the various implementations of
+ * xdr streams.
+ */
+#ifndef _KERNEL
+#ifdef __STDC__
+extern void xdrmem_create(XDR *, const caddr_t, const uint_t, const enum
+xdr_op);
+ /* XDR using memory buffers */
+extern void xdrrec_create(XDR *, const uint_t, const uint_t, const caddr_t,
+int (*) (void *, caddr_t, int), int (*) (void *, caddr_t, int));
+/* XDR pseudo records for tcp */
+extern bool_t xdrrec_endofrecord(XDR *, bool_t);
+/* make end of xdr record */
+extern bool_t xdrrec_skiprecord(XDR *);
+/* move to beginning of next record */
+extern bool_t xdrrec_eof(XDR *);
+extern uint_t xdrrec_readbytes(XDR *, caddr_t, uint_t);
+/* true if no more input */
+#else
+extern void xdrmem_create();
+extern void xdrstdio_create();
+extern void xdrrec_create();
+extern bool_t xdrrec_endofrecord();
+extern bool_t xdrrec_skiprecord();
+extern bool_t xdrrec_eof();
+extern uint_t xdrrec_readbytes();
+#endif
+#else
+
+extern void xdrmem_create(XDR *, caddr_t, uint_t, enum xdr_op);
+
+extern struct xdr_ops xdrmblk_ops;
+
+struct rpc_msg;
+extern bool_t xdr_callmsg(XDR *, struct rpc_msg *);
+extern bool_t xdr_replymsg_body(XDR *, struct rpc_msg *);
+extern bool_t xdr_replymsg_hdr(XDR *, struct rpc_msg *);
+
+#include <sys/malloc.h>
+#ifdef mem_alloc
+#undef mem_alloc
+#define mem_alloc(size) malloc((size), M_TEMP, M_WAITOK | M_ZERO)
+#endif
+#ifdef mem_free
+#undef mem_free
+#define mem_free(ptr, size) free((ptr), M_TEMP)
+#endif
+
+#endif /* !_KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* !_RPC_XDR_H */
diff --git a/sys/contrib/opensolaris/uts/common/rpc/xdr_array.c b/sys/contrib/opensolaris/uts/common/rpc/xdr_array.c
new file mode 100644
index 0000000..3711e53
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/rpc/xdr_array.c
@@ -0,0 +1,123 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * Portions of this source code were derived from Berkeley 4.3 BSD
+ * under license from the Regents of the University of California.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * xdr_array.c, Generic XDR routines impelmentation.
+ * These are the "non-trivial" xdr primitives used to serialize and de-serialize
+ * arrays. See xdr.h for more info on the interface to xdr.
+ */
+
+#include <sys/param.h>
+#include <sys/cmn_err.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+
+#include <rpc/types.h>
+#include <rpc/xdr.h>
+
+#define LASTUNSIGNED ((uint_t)0-1)
+
+/*
+ * XDR an array of arbitrary elements
+ * *addrp is a pointer to the array, *sizep is the number of elements.
+ * If addrp is NULL (*sizep * elsize) bytes are allocated.
+ * elsize is the size (in bytes) of each element, and elproc is the
+ * xdr procedure to call to handle each element of the array.
+ */
+bool_t
+xdr_array(XDR *xdrs, caddr_t *addrp, uint_t *sizep, const uint_t maxsize,
+ const uint_t elsize, const xdrproc_t elproc)
+{
+ uint_t i;
+ caddr_t target = *addrp;
+ uint_t c; /* the actual element count */
+ bool_t stat = TRUE;
+ uint_t nodesize;
+
+ /* like strings, arrays are really counted arrays */
+ if (!xdr_u_int(xdrs, sizep)) {
+#ifdef DEBUG
+ printf("xdr_array: size FAILED\n");
+#endif
+ return (FALSE);
+ }
+ c = *sizep;
+ if ((c > maxsize || LASTUNSIGNED / elsize < c) &&
+ xdrs->x_op != XDR_FREE) {
+#ifdef DEBUG
+ printf("xdr_array: bad size FAILED\n");
+#endif
+ return (FALSE);
+ }
+ nodesize = c * elsize;
+
+ /*
+ * if we are deserializing, we may need to allocate an array.
+ * We also save time by checking for a null array if we are freeing.
+ */
+ if (target == NULL)
+ switch (xdrs->x_op) {
+ case XDR_DECODE:
+ if (c == 0)
+ return (TRUE);
+ *addrp = target = (char *)mem_alloc(nodesize);
+ bzero(target, nodesize);
+ break;
+
+ case XDR_FREE:
+ return (TRUE);
+
+ case XDR_ENCODE:
+ break;
+ }
+
+ /*
+ * now we xdr each element of array
+ */
+ for (i = 0; (i < c) && stat; i++) {
+ stat = (*elproc)(xdrs, target, LASTUNSIGNED);
+ target += elsize;
+ }
+
+ /*
+ * the array may need freeing
+ */
+ if (xdrs->x_op == XDR_FREE) {
+ mem_free(*addrp, nodesize);
+ *addrp = NULL;
+ }
+ return (stat);
+}
diff --git a/sys/contrib/opensolaris/uts/common/rpc/xdr_mem.c b/sys/contrib/opensolaris/uts/common/rpc/xdr_mem.c
new file mode 100644
index 0000000..32ff32d
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/rpc/xdr_mem.c
@@ -0,0 +1,209 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * Portions of this source code were derived from Berkeley 4.3 BSD
+ * under license from the Regents of the University of California.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * xdr_mem.c, XDR implementation using memory buffers.
+ *
+ * If you have some data to be interpreted as external data representation
+ * or to be converted to external data representation in a memory buffer,
+ * then this is the package for you.
+ */
+
+#include <sys/param.h>
+#include <sys/types.h>
+#include <sys/systm.h>
+
+#include <rpc/types.h>
+#include <rpc/xdr.h>
+
+static struct xdr_ops *xdrmem_ops(void);
+
+/*
+ * The procedure xdrmem_create initializes a stream descriptor for a
+ * memory buffer.
+ */
+void
+xdrmem_create(XDR *xdrs, caddr_t addr, uint_t size, enum xdr_op op)
+{
+ xdrs->x_op = op;
+ xdrs->x_ops = xdrmem_ops();
+ xdrs->x_private = xdrs->x_base = addr;
+ xdrs->x_handy = size;
+ xdrs->x_public = NULL;
+}
+
+/* ARGSUSED */
+static void
+xdrmem_destroy(XDR *xdrs)
+{
+}
+
+static bool_t
+xdrmem_getint32(XDR *xdrs, int32_t *int32p)
+{
+ if ((xdrs->x_handy -= (int)sizeof (int32_t)) < 0)
+ return (FALSE);
+ /* LINTED pointer alignment */
+ *int32p = (int32_t)ntohl((uint32_t)(*((int32_t *)(xdrs->x_private))));
+ xdrs->x_private += sizeof (int32_t);
+ return (TRUE);
+}
+
+static bool_t
+xdrmem_putint32(XDR *xdrs, int32_t *int32p)
+{
+ if ((xdrs->x_handy -= (int)sizeof (int32_t)) < 0)
+ return (FALSE);
+ /* LINTED pointer alignment */
+ *(int32_t *)xdrs->x_private = (int32_t)htonl((uint32_t)(*int32p));
+ xdrs->x_private += sizeof (int32_t);
+ return (TRUE);
+}
+
+static bool_t
+xdrmem_getbytes(XDR *xdrs, caddr_t addr, int len)
+{
+ if ((xdrs->x_handy -= len) < 0)
+ return (FALSE);
+ bcopy(xdrs->x_private, addr, len);
+ xdrs->x_private += len;
+ return (TRUE);
+}
+
+static bool_t
+xdrmem_putbytes(XDR *xdrs, caddr_t addr, int len)
+{
+ if ((xdrs->x_handy -= len) < 0)
+ return (FALSE);
+ bcopy(addr, xdrs->x_private, len);
+ xdrs->x_private += len;
+ return (TRUE);
+}
+
+static uint_t
+xdrmem_getpos(XDR *xdrs)
+{
+ return ((uint_t)((uintptr_t)xdrs->x_private - (uintptr_t)xdrs->x_base));
+}
+
+static bool_t
+xdrmem_setpos(XDR *xdrs, uint_t pos)
+{
+ caddr_t newaddr = xdrs->x_base + pos;
+ caddr_t lastaddr = xdrs->x_private + xdrs->x_handy;
+ ptrdiff_t diff;
+
+ if (newaddr > lastaddr)
+ return (FALSE);
+ xdrs->x_private = newaddr;
+ diff = lastaddr - newaddr;
+ xdrs->x_handy = (int)diff;
+ return (TRUE);
+}
+
+static rpc_inline_t *
+xdrmem_inline(XDR *xdrs, int len)
+{
+ rpc_inline_t *buf = NULL;
+
+ if (xdrs->x_handy >= len) {
+ xdrs->x_handy -= len;
+ /* LINTED pointer alignment */
+ buf = (rpc_inline_t *)xdrs->x_private;
+ xdrs->x_private += len;
+ }
+ return (buf);
+}
+
+static bool_t
+xdrmem_control(XDR *xdrs, int request, void *info)
+{
+ xdr_bytesrec *xptr;
+ int32_t *int32p;
+ int len;
+
+ switch (request) {
+
+ case XDR_GET_BYTES_AVAIL:
+ xptr = (xdr_bytesrec *)info;
+ xptr->xc_is_last_record = TRUE;
+ xptr->xc_num_avail = xdrs->x_handy;
+ return (TRUE);
+
+ case XDR_PEEK:
+ /*
+ * Return the next 4 byte unit in the XDR stream.
+ */
+ if (xdrs->x_handy < sizeof (int32_t))
+ return (FALSE);
+ int32p = (int32_t *)info;
+ *int32p = (int32_t)ntohl((uint32_t)
+ (*((int32_t *)(xdrs->x_private))));
+ return (TRUE);
+
+ case XDR_SKIPBYTES:
+ /*
+ * Skip the next N bytes in the XDR stream.
+ */
+ int32p = (int32_t *)info;
+ len = RNDUP((int)(*int32p));
+ if ((xdrs->x_handy -= len) < 0)
+ return (FALSE);
+ xdrs->x_private += len;
+ return (TRUE);
+
+ }
+ return (FALSE);
+}
+
+static struct xdr_ops *
+xdrmem_ops(void)
+{
+ static struct xdr_ops ops;
+
+ if (ops.x_getint32 == NULL) {
+ ops.x_getbytes = xdrmem_getbytes;
+ ops.x_putbytes = xdrmem_putbytes;
+ ops.x_getpostn = xdrmem_getpos;
+ ops.x_setpostn = xdrmem_setpos;
+ ops.x_inline = xdrmem_inline;
+ ops.x_destroy = xdrmem_destroy;
+ ops.x_control = xdrmem_control;
+ ops.x_getint32 = xdrmem_getint32;
+ ops.x_putint32 = xdrmem_putint32;
+ }
+ return (&ops);
+}
diff --git a/sys/contrib/opensolaris/uts/common/sys/asm_linkage.h b/sys/contrib/opensolaris/uts/common/sys/asm_linkage.h
new file mode 100644
index 0000000..b2a3c16
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/asm_linkage.h
@@ -0,0 +1,110 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _IA32_SYS_ASM_LINKAGE_H
+#define _IA32_SYS_ASM_LINKAGE_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _ASM /* The remainder of this file is only for assembly files */
+
+/*
+ * make annoying differences in assembler syntax go away
+ */
+
+#if defined(__i386__) || defined(__amd64__)
+
+#define ASM_ENTRY_ALIGN 16
+
+/*
+ * ENTRY provides the standard procedure entry code and an easy way to
+ * insert the calls to mcount for profiling. ENTRY_NP is identical, but
+ * never calls mcount.
+ */
+#define ENTRY(x) \
+ .text; \
+ .align ASM_ENTRY_ALIGN; \
+ .globl x; \
+ .type x, @function; \
+x:
+
+/*
+ * ALTENTRY provides for additional entry points.
+ */
+#define ALTENTRY(x) \
+ .globl x; \
+ .type x, @function; \
+x:
+
+/*
+ * SET_SIZE trails a function and set the size for the ELF symbol table.
+ */
+#define SET_SIZE(x) \
+ .size x, [.-x]
+
+#elif defined(__sparc64__)
+
+/*
+ * ENTRY provides the standard procedure entry code and an easy way to
+ * insert the calls to mcount for profiling. ENTRY_NP is identical, but
+ * never calls mcount.
+ */
+#define ENTRY(x) \
+ .section ".text"; \
+ .align 4; \
+ .global x; \
+ .type x, @function; \
+x:
+
+/*
+ * ALTENTRY provides for additional entry points.
+ */
+#define ALTENTRY(x) \
+ .global x; \
+ .type x, @function; \
+x:
+
+/*
+ * SET_SIZE trails a function and set the size for the ELF symbol table.
+ */
+#define SET_SIZE(x) \
+ .size x, (.-x)
+
+#else
+
+#error Unsupported architecture.
+
+#endif
+
+#endif /* _ASM */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _IA32_SYS_ASM_LINKAGE_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/avl.h b/sys/contrib/opensolaris/uts/common/sys/avl.h
new file mode 100644
index 0000000..bf9af89
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/avl.h
@@ -0,0 +1,298 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _AVL_H
+#define _AVL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * This is a private header file. Applications should not directly include
+ * this file.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/avl_impl.h>
+
+/*
+ * This is a generic implemenatation of AVL trees for use in the Solaris kernel.
+ * The interfaces provide an efficient way of implementing an ordered set of
+ * data structures.
+ *
+ * AVL trees provide an alternative to using an ordered linked list. Using AVL
+ * trees will usually be faster, however they requires more storage. An ordered
+ * linked list in general requires 2 pointers in each data structure. The
+ * AVL tree implementation uses 3 pointers. The following chart gives the
+ * approximate performance of operations with the different approaches:
+ *
+ * Operation Link List AVL tree
+ * --------- -------- --------
+ * lookup O(n) O(log(n))
+ *
+ * insert 1 node constant constant
+ *
+ * delete 1 node constant between constant and O(log(n))
+ *
+ * delete all nodes O(n) O(n)
+ *
+ * visit the next
+ * or prev node constant between constant and O(log(n))
+ *
+ *
+ * The data structure nodes are anchored at an "avl_tree_t" (the equivalent
+ * of a list header) and the individual nodes will have a field of
+ * type "avl_node_t" (corresponding to list pointers).
+ *
+ * The type "avl_index_t" is used to indicate a position in the list for
+ * certain calls.
+ *
+ * The usage scenario is generally:
+ *
+ * 1. Create the list/tree with: avl_create()
+ *
+ * followed by any mixture of:
+ *
+ * 2a. Insert nodes with: avl_add(), or avl_find() and avl_insert()
+ *
+ * 2b. Visited elements with:
+ * avl_first() - returns the lowest valued node
+ * avl_last() - returns the highest valued node
+ * AVL_NEXT() - given a node go to next higher one
+ * AVL_PREV() - given a node go to previous lower one
+ *
+ * 2c. Find the node with the closest value either less than or greater
+ * than a given value with avl_nearest().
+ *
+ * 2d. Remove individual nodes from the list/tree with avl_remove().
+ *
+ * and finally when the list is being destroyed
+ *
+ * 3. Use avl_destroy_nodes() to quickly process/free up any remaining nodes.
+ * Note that once you use avl_destroy_nodes(), you can no longer
+ * use any routine except avl_destroy_nodes() and avl_destoy().
+ *
+ * 4. Use avl_destroy() to destroy the AVL tree itself.
+ *
+ * Any locking for multiple thread access is up to the user to provide, just
+ * as is needed for any linked list implementation.
+ */
+
+
+/*
+ * Type used for the root of the AVL tree.
+ */
+typedef struct avl_tree avl_tree_t;
+
+/*
+ * The data nodes in the AVL tree must have a field of this type.
+ */
+typedef struct avl_node avl_node_t;
+
+/*
+ * An opaque type used to locate a position in the tree where a node
+ * would be inserted.
+ */
+typedef uintptr_t avl_index_t;
+
+
+/*
+ * Direction constants used for avl_nearest().
+ */
+#define AVL_BEFORE (0)
+#define AVL_AFTER (1)
+
+
+
+/*
+ * Prototypes
+ *
+ * Where not otherwise mentioned, "void *" arguments are a pointer to the
+ * user data structure which must contain a field of type avl_node_t.
+ *
+ * Also assume the user data structures looks like:
+ * stuct my_type {
+ * ...
+ * avl_node_t my_link;
+ * ...
+ * };
+ */
+
+/*
+ * Initialize an AVL tree. Arguments are:
+ *
+ * tree - the tree to be initialized
+ * compar - function to compare two nodes, it must return exactly: -1, 0, or +1
+ * -1 for <, 0 for ==, and +1 for >
+ * size - the value of sizeof(struct my_type)
+ * offset - the value of OFFSETOF(struct my_type, my_link)
+ */
+extern void avl_create(avl_tree_t *tree,
+ int (*compar) (const void *, const void *), size_t size, size_t offset);
+
+
+/*
+ * Find a node with a matching value in the tree. Returns the matching node
+ * found. If not found, it returns NULL and then if "where" is not NULL it sets
+ * "where" for use with avl_insert() or avl_nearest().
+ *
+ * node - node that has the value being looked for
+ * where - position for use with avl_nearest() or avl_insert(), may be NULL
+ */
+extern void *avl_find(avl_tree_t *tree, void *node, avl_index_t *where);
+
+/*
+ * Insert a node into the tree.
+ *
+ * node - the node to insert
+ * where - position as returned from avl_find()
+ */
+extern void avl_insert(avl_tree_t *tree, void *node, avl_index_t where);
+
+/*
+ * Insert "new_data" in "tree" in the given "direction" either after
+ * or before the data "here".
+ *
+ * This might be usefull for avl clients caching recently accessed
+ * data to avoid doing avl_find() again for insertion.
+ *
+ * new_data - new data to insert
+ * here - existing node in "tree"
+ * direction - either AVL_AFTER or AVL_BEFORE the data "here".
+ */
+extern void avl_insert_here(avl_tree_t *tree, void *new_data, void *here,
+ int direction);
+
+
+/*
+ * Return the first or last valued node in the tree. Will return NULL
+ * if the tree is empty.
+ *
+ */
+extern void *avl_first(avl_tree_t *tree);
+extern void *avl_last(avl_tree_t *tree);
+
+
+/*
+ * Return the next or previous valued node in the tree.
+ * AVL_NEXT() will return NULL if at the last node.
+ * AVL_PREV() will return NULL if at the first node.
+ *
+ * node - the node from which the next or previous node is found
+ */
+#define AVL_NEXT(tree, node) avl_walk(tree, node, AVL_AFTER)
+#define AVL_PREV(tree, node) avl_walk(tree, node, AVL_BEFORE)
+
+
+/*
+ * Find the node with the nearest value either greater or less than
+ * the value from a previous avl_find(). Returns the node or NULL if
+ * there isn't a matching one.
+ *
+ * where - position as returned from avl_find()
+ * direction - either AVL_BEFORE or AVL_AFTER
+ *
+ * EXAMPLE get the greatest node that is less than a given value:
+ *
+ * avl_tree_t *tree;
+ * struct my_data look_for_value = {....};
+ * struct my_data *node;
+ * struct my_data *less;
+ * avl_index_t where;
+ *
+ * node = avl_find(tree, &look_for_value, &where);
+ * if (node != NULL)
+ * less = AVL_PREV(tree, node);
+ * else
+ * less = avl_nearest(tree, where, AVL_BEFORE);
+ */
+extern void *avl_nearest(avl_tree_t *tree, avl_index_t where, int direction);
+
+
+/*
+ * Add a single node to the tree.
+ * The node must not be in the tree, and it must not
+ * compare equal to any other node already in the tree.
+ *
+ * node - the node to add
+ */
+extern void avl_add(avl_tree_t *tree, void *node);
+
+
+/*
+ * Remove a single node from the tree. The node must be in the tree.
+ *
+ * node - the node to remove
+ */
+extern void avl_remove(avl_tree_t *tree, void *node);
+
+
+/*
+ * Return the number of nodes in the tree
+ */
+extern ulong_t avl_numnodes(avl_tree_t *tree);
+
+
+/*
+ * Used to destroy any remaining nodes in a tree. The cookie argument should
+ * be initialized to NULL before the first call. Returns a node that has been
+ * removed from the tree and may be free()'d. Returns NULL when the tree is
+ * empty.
+ *
+ * Once you call avl_destroy_nodes(), you can only continuing calling it and
+ * finally avl_destroy(). No other AVL routines will be valid.
+ *
+ * cookie - a "void *" used to save state between calls to avl_destroy_nodes()
+ *
+ * EXAMPLE:
+ * avl_tree_t *tree;
+ * struct my_data *node;
+ * void *cookie;
+ *
+ * cookie = NULL;
+ * while ((node = avl_destroy_nodes(tree, &cookie)) != NULL)
+ * free(node);
+ * avl_destroy(tree);
+ */
+extern void *avl_destroy_nodes(avl_tree_t *tree, void **cookie);
+
+
+/*
+ * Final destroy of an AVL tree. Arguments are:
+ *
+ * tree - the empty tree to destroy
+ */
+extern void avl_destroy(avl_tree_t *tree);
+
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _AVL_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/avl_impl.h b/sys/contrib/opensolaris/uts/common/sys/avl_impl.h
new file mode 100644
index 0000000..620685f
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/avl_impl.h
@@ -0,0 +1,164 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _AVL_IMPL_H
+#define _AVL_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * This is a private header file. Applications should not directly include
+ * this file.
+ */
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * generic AVL tree implementation for kernel use
+ *
+ * There are 5 pieces of information stored for each node in an AVL tree
+ *
+ * pointer to less than child
+ * pointer to greater than child
+ * a pointer to the parent of this node
+ * an indication [0/1] of which child I am of my parent
+ * a "balance" (-1, 0, +1) indicating which child tree is taller
+ *
+ * Since they only need 3 bits, the last two fields are packed into the
+ * bottom bits of the parent pointer on 64 bit machines to save on space.
+ */
+
+#ifndef _LP64
+
+struct avl_node {
+ struct avl_node *avl_child[2]; /* left/right children */
+ struct avl_node *avl_parent; /* this node's parent */
+ unsigned short avl_child_index; /* my index in parent's avl_child[] */
+ short avl_balance; /* balance value: -1, 0, +1 */
+};
+
+#define AVL_XPARENT(n) ((n)->avl_parent)
+#define AVL_SETPARENT(n, p) ((n)->avl_parent = (p))
+
+#define AVL_XCHILD(n) ((n)->avl_child_index)
+#define AVL_SETCHILD(n, c) ((n)->avl_child_index = (unsigned short)(c))
+
+#define AVL_XBALANCE(n) ((n)->avl_balance)
+#define AVL_SETBALANCE(n, b) ((n)->avl_balance = (short)(b))
+
+#else /* _LP64 */
+
+/*
+ * for 64 bit machines, avl_pcb contains parent pointer, balance and child_index
+ * values packed in the following manner:
+ *
+ * |63 3| 2 |1 0 |
+ * |-------------------------------------|-----------------|-------------|
+ * | avl_parent hi order bits | avl_child_index | avl_balance |
+ * | | | + 1 |
+ * |-------------------------------------|-----------------|-------------|
+ *
+ */
+struct avl_node {
+ struct avl_node *avl_child[2]; /* left/right children nodes */
+ uintptr_t avl_pcb; /* parent, child_index, balance */
+};
+
+/*
+ * macros to extract/set fields in avl_pcb
+ *
+ * pointer to the parent of the current node is the high order bits
+ */
+#define AVL_XPARENT(n) ((struct avl_node *)((n)->avl_pcb & ~7))
+#define AVL_SETPARENT(n, p) \
+ ((n)->avl_pcb = (((n)->avl_pcb & 7) | (uintptr_t)(p)))
+
+/*
+ * index of this node in its parent's avl_child[]: bit #2
+ */
+#define AVL_XCHILD(n) (((n)->avl_pcb >> 2) & 1)
+#define AVL_SETCHILD(n, c) \
+ ((n)->avl_pcb = (uintptr_t)(((n)->avl_pcb & ~4) | ((c) << 2)))
+
+/*
+ * balance indication for a node, lowest 2 bits. A valid balance is
+ * -1, 0, or +1, and is encoded by adding 1 to the value to get the
+ * unsigned values of 0, 1, 2.
+ */
+#define AVL_XBALANCE(n) ((int)(((n)->avl_pcb & 3) - 1))
+#define AVL_SETBALANCE(n, b) \
+ ((n)->avl_pcb = (uintptr_t)((((n)->avl_pcb & ~3) | ((b) + 1))))
+
+#endif /* _LP64 */
+
+
+
+/*
+ * switch between a node and data pointer for a given tree
+ * the value of "o" is tree->avl_offset
+ */
+#define AVL_NODE2DATA(n, o) ((void *)((uintptr_t)(n) - (o)))
+#define AVL_DATA2NODE(d, o) ((struct avl_node *)((uintptr_t)(d) + (o)))
+
+
+
+/*
+ * macros used to create/access an avl_index_t
+ */
+#define AVL_INDEX2NODE(x) ((avl_node_t *)((x) & ~1))
+#define AVL_INDEX2CHILD(x) ((x) & 1)
+#define AVL_MKINDEX(n, c) ((avl_index_t)(n) | (c))
+
+
+/*
+ * The tree structure. The fields avl_root, avl_compar, and avl_offset come
+ * first since they are needed for avl_find(). We want them to fit into
+ * a single 64 byte cache line to make avl_find() as fast as possible.
+ */
+struct avl_tree {
+ struct avl_node *avl_root; /* root node in tree */
+ int (*avl_compar)(const void *, const void *);
+ size_t avl_offset; /* offsetof(type, avl_link_t field) */
+ ulong_t avl_numnodes; /* number of nodes in the tree */
+ size_t avl_size; /* sizeof user type struct */
+};
+
+
+/*
+ * This will only by used via AVL_NEXT() or AVL_PREV()
+ */
+extern void *avl_walk(struct avl_tree *, void *, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _AVL_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/bitmap.h b/sys/contrib/opensolaris/uts/common/sys/bitmap.h
new file mode 100644
index 0000000..d0dd12b
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/bitmap.h
@@ -0,0 +1,194 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+#ifndef _SYS_BITMAP_H
+#define _SYS_BITMAP_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/feature_tests.h>
+#if defined(__GNUC__) && defined(_ASM_INLINES) && \
+ (defined(__i386) || defined(__amd64))
+#include <asm/bitmap.h>
+#endif
+
+/*
+ * Operations on bitmaps of arbitrary size
+ * A bitmap is a vector of 1 or more ulong_t's.
+ * The user of the package is responsible for range checks and keeping
+ * track of sizes.
+ */
+
+#ifdef _LP64
+#define BT_ULSHIFT 6 /* log base 2 of BT_NBIPUL, to extract word index */
+#define BT_ULSHIFT32 5 /* log base 2 of BT_NBIPUL, to extract word index */
+#else
+#define BT_ULSHIFT 5 /* log base 2 of BT_NBIPUL, to extract word index */
+#endif
+
+#define BT_NBIPUL (1 << BT_ULSHIFT) /* n bits per ulong_t */
+#define BT_ULMASK (BT_NBIPUL - 1) /* to extract bit index */
+
+#ifdef _LP64
+#define BT_NBIPUL32 (1 << BT_ULSHIFT32) /* n bits per ulong_t */
+#define BT_ULMASK32 (BT_NBIPUL32 - 1) /* to extract bit index */
+#define BT_ULMAXMASK 0xffffffffffffffff /* used by bt_getlowbit */
+#else
+#define BT_ULMAXMASK 0xffffffff
+#endif
+
+/*
+ * bitmap is a ulong_t *, bitindex an index_t
+ *
+ * The macros BT_WIM and BT_BIW internal; there is no need
+ * for users of this package to use them.
+ */
+
+/*
+ * word in map
+ */
+#define BT_WIM(bitmap, bitindex) \
+ ((bitmap)[(bitindex) >> BT_ULSHIFT])
+/*
+ * bit in word
+ */
+#define BT_BIW(bitindex) \
+ (1UL << ((bitindex) & BT_ULMASK))
+
+#ifdef _LP64
+#define BT_WIM32(bitmap, bitindex) \
+ ((bitmap)[(bitindex) >> BT_ULSHIFT32])
+
+#define BT_BIW32(bitindex) \
+ (1UL << ((bitindex) & BT_ULMASK32))
+#endif
+
+/*
+ * These are public macros
+ *
+ * BT_BITOUL == n bits to n ulong_t's
+ */
+#define BT_BITOUL(nbits) \
+ (((nbits) + BT_NBIPUL - 1l) / BT_NBIPUL)
+#define BT_SIZEOFMAP(nbits) \
+ (BT_BITOUL(nbits) * sizeof (ulong_t))
+#define BT_TEST(bitmap, bitindex) \
+ ((BT_WIM((bitmap), (bitindex)) & BT_BIW(bitindex)) ? 1 : 0)
+#define BT_SET(bitmap, bitindex) \
+ { BT_WIM((bitmap), (bitindex)) |= BT_BIW(bitindex); }
+#define BT_CLEAR(bitmap, bitindex) \
+ { BT_WIM((bitmap), (bitindex)) &= ~BT_BIW(bitindex); }
+
+#ifdef _LP64
+#define BT_BITOUL32(nbits) \
+ (((nbits) + BT_NBIPUL32 - 1l) / BT_NBIPUL32)
+#define BT_SIZEOFMAP32(nbits) \
+ (BT_BITOUL32(nbits) * sizeof (uint_t))
+#define BT_TEST32(bitmap, bitindex) \
+ ((BT_WIM32((bitmap), (bitindex)) & BT_BIW32(bitindex)) ? 1 : 0)
+#define BT_SET32(bitmap, bitindex) \
+ { BT_WIM32((bitmap), (bitindex)) |= BT_BIW32(bitindex); }
+#define BT_CLEAR32(bitmap, bitindex) \
+ { BT_WIM32((bitmap), (bitindex)) &= ~BT_BIW32(bitindex); }
+#endif /* _LP64 */
+
+
+/*
+ * BIT_ONLYONESET is a private macro not designed for bitmaps of
+ * arbitrary size. u must be an unsigned integer/long. It returns
+ * true if one and only one bit is set in u.
+ */
+#define BIT_ONLYONESET(u) \
+ ((((u) == 0) ? 0 : ((u) & ((u) - 1)) == 0))
+
+#if defined(_KERNEL) && !defined(_ASM)
+#include <sys/atomic.h>
+
+/*
+ * return next available bit index from map with specified number of bits
+ */
+extern index_t bt_availbit(ulong_t *bitmap, size_t nbits);
+/*
+ * find the highest order bit that is on, and is within or below
+ * the word specified by wx
+ */
+extern int bt_gethighbit(ulong_t *mapp, int wx);
+extern int bt_range(ulong_t *bitmap, size_t *pos1, size_t *pos2,
+ size_t end_pos);
+/*
+ * Find highest and lowest one bit set.
+ * Returns bit number + 1 of bit that is set, otherwise returns 0.
+ * Low order bit is 0, high order bit is 31.
+ */
+extern int highbit(ulong_t);
+extern int lowbit(ulong_t);
+extern int bt_getlowbit(ulong_t *bitmap, size_t start, size_t stop);
+extern void bt_copy(ulong_t *, ulong_t *, ulong_t);
+
+/*
+ * find the parity
+ */
+extern int odd_parity(ulong_t);
+
+/*
+ * Atomically set/clear bits
+ * Atomic exclusive operations will set "result" to "-1"
+ * if the bit is already set/cleared. "result" will be set
+ * to 0 otherwise.
+ */
+#define BT_ATOMIC_SET(bitmap, bitindex) \
+ { atomic_or_long(&(BT_WIM(bitmap, bitindex)), BT_BIW(bitindex)); }
+#define BT_ATOMIC_CLEAR(bitmap, bitindex) \
+ { atomic_and_long(&(BT_WIM(bitmap, bitindex)), ~BT_BIW(bitindex)); }
+
+#define BT_ATOMIC_SET_EXCL(bitmap, bitindex, result) \
+ { result = atomic_set_long_excl(&(BT_WIM(bitmap, bitindex)), \
+ (bitindex) % BT_NBIPUL); }
+#define BT_ATOMIC_CLEAR_EXCL(bitmap, bitindex, result) \
+ { result = atomic_clear_long_excl(&(BT_WIM(bitmap, bitindex)), \
+ (bitindex) % BT_NBIPUL); }
+
+/*
+ * Extracts bits between index h (high, inclusive) and l (low, exclusive) from
+ * u, which must be an unsigned integer.
+ */
+#define BITX(u, h, l) (((u) >> (l)) & ((1LU << ((h) - (l) + 1LU)) - 1LU))
+
+#endif /* _KERNEL && !_ASM */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_BITMAP_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/byteorder.h b/sys/contrib/opensolaris/uts/common/sys/byteorder.h
new file mode 100644
index 0000000..b80a0f0
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/byteorder.h
@@ -0,0 +1,137 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * University Copyright- Copyright (c) 1982, 1986, 1988
+ * The Regents of the University of California
+ * All Rights Reserved
+ *
+ * University Acknowledgment- Portions of this document are derived from
+ * software developed by the University of California, Berkeley, and its
+ * contributors.
+ */
+
+#ifndef _SYS_BYTEORDER_H
+#define _SYS_BYTEORDER_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/isa_defs.h>
+#include <sys/int_types.h>
+
+#if defined(__GNUC__) && defined(_ASM_INLINES) && \
+ (defined(__i386) || defined(__amd64))
+#include <asm/byteorder.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * macros for conversion between host and (internet) network byte order
+ */
+
+#if defined(_BIG_ENDIAN) && !defined(ntohl) && !defined(__lint)
+/* big-endian */
+#define ntohl(x) (x)
+#define ntohs(x) (x)
+#define htonl(x) (x)
+#define htons(x) (x)
+
+#elif !defined(ntohl) /* little-endian */
+
+#ifndef _IN_PORT_T
+#define _IN_PORT_T
+typedef uint16_t in_port_t;
+#endif
+
+#ifndef _IN_ADDR_T
+#define _IN_ADDR_T
+typedef uint32_t in_addr_t;
+#endif
+
+#if !defined(_XPG4_2) || defined(__EXTENSIONS__) || defined(_XPG5)
+extern uint32_t htonl(uint32_t);
+extern uint16_t htons(uint16_t);
+extern uint32_t ntohl(uint32_t);
+extern uint16_t ntohs(uint16_t);
+#else
+extern in_addr_t htonl(in_addr_t);
+extern in_port_t htons(in_port_t);
+extern in_addr_t ntohl(in_addr_t);
+extern in_port_t ntohs(in_port_t);
+#endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) || defined(_XPG5) */
+#endif
+
+#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
+
+/*
+ * Macros to reverse byte order
+ */
+#define BSWAP_8(x) ((x) & 0xff)
+#define BSWAP_16(x) ((BSWAP_8(x) << 8) | BSWAP_8((x) >> 8))
+#define BSWAP_32(x) ((BSWAP_16(x) << 16) | BSWAP_16((x) >> 16))
+#define BSWAP_64(x) ((BSWAP_32(x) << 32) | BSWAP_32((x) >> 32))
+
+#define BMASK_8(x) ((x) & 0xff)
+#define BMASK_16(x) ((x) & 0xffff)
+#define BMASK_32(x) ((x) & 0xffffffff)
+#define BMASK_64(x) (x)
+
+/*
+ * Macros to convert from a specific byte order to/from native byte order
+ */
+#ifdef _BIG_ENDIAN
+#define BE_8(x) BMASK_8(x)
+#define BE_16(x) BMASK_16(x)
+#define BE_32(x) BMASK_32(x)
+#define BE_64(x) BMASK_64(x)
+#define LE_8(x) BSWAP_8(x)
+#define LE_16(x) BSWAP_16(x)
+#define LE_32(x) BSWAP_32(x)
+#define LE_64(x) BSWAP_64(x)
+#else
+#define LE_8(x) BMASK_8(x)
+#define LE_16(x) BMASK_16(x)
+#define LE_32(x) BMASK_32(x)
+#define LE_64(x) BMASK_64(x)
+#define BE_8(x) BSWAP_8(x)
+#define BE_16(x) BSWAP_16(x)
+#define BE_32(x) BSWAP_32(x)
+#define BE_64(x) BSWAP_64(x)
+#endif
+
+#endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_BYTEORDER_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/callb.h b/sys/contrib/opensolaris/uts/common/sys/callb.h
new file mode 100644
index 0000000..b12b2e2
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/callb.h
@@ -0,0 +1,214 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_CALLB_H
+#define _SYS_CALLB_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/t_lock.h>
+#include <sys/thread.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * definitions of callback classes (c_class)
+ *
+ * Callbacks belong in the same class if (1) their callback routines
+ * do the same kind of processing (ideally, using the same callback function)
+ * and (2) they can/should be executed at the same time in a cpr
+ * suspend/resume operation.
+ *
+ * Note: The DAEMON class, in particular, is for stopping kernel threads
+ * and nothing else. The CALLB_* macros below should be used to deal
+ * with kernel threads, and the callback function should be callb_generic_cpr.
+ * Another idiosyncrasy of the DAEMON class is that if a suspend operation
+ * fails, some of the callback functions may be called with the RESUME
+ * code which were never called with SUSPEND. Not a problem currently,
+ * but see bug 4201851.
+ */
+#define CB_CL_CPR_DAEMON 0
+#define CB_CL_CPR_VM 1
+#define CB_CL_CPR_CALLOUT 2
+#define CB_CL_CPR_OBP 3
+#define CB_CL_CPR_FB 4
+#define CB_CL_PANIC 5
+#define CB_CL_CPR_RPC 6
+#define CB_CL_CPR_PROMPRINTF 7
+#define CB_CL_UADMIN 8
+#define CB_CL_CPR_PM 9
+#define CB_CL_HALT 10
+#define CB_CL_CPR_DMA 11
+#define CB_CL_CPR_POST_USER 12
+#define CB_CL_UADMIN_PRE_VFS 13
+#define CB_CL_MDBOOT CB_CL_UADMIN
+#define CB_CL_ENTER_DEBUGGER 14
+#define CB_CL_CPR_POST_KERNEL 15
+#define NCBCLASS 16 /* CHANGE ME if classes are added/removed */
+
+/*
+ * CB_CL_CPR_DAEMON class specific definitions are given below:
+ */
+
+/*
+ * code for CPR callb_execute_class
+ */
+#define CB_CODE_CPR_CHKPT 0
+#define CB_CODE_CPR_RESUME 1
+
+typedef void * callb_id_t;
+/*
+ * Per kernel thread structure for CPR daemon callbacks.
+ * Must be protected by either a existing lock in the daemon or
+ * a new lock created for such a purpose.
+ */
+typedef struct callb_cpr {
+ kmutex_t *cc_lockp; /* lock to protect this struct */
+ char cc_events; /* various events for CPR */
+ callb_id_t cc_id; /* callb id address */
+ kcondvar_t cc_callb_cv; /* cv for callback waiting */
+ kcondvar_t cc_stop_cv; /* cv to checkpoint block */
+} callb_cpr_t;
+
+/*
+ * cc_events definitions
+ */
+#define CALLB_CPR_START 1 /* a checkpoint request's started */
+#define CALLB_CPR_SAFE 2 /* thread is safe for CPR */
+#define CALLB_CPR_ALWAYS_SAFE 4 /* thread is ALWAYS safe for CPR */
+
+/*
+ * Used when checking that all kernel threads are stopped.
+ */
+#define CALLB_MAX_RETRY 3 /* when waiting for kthread to sleep */
+#define CALLB_THREAD_DELAY 10 /* ticks allowed to reach sleep */
+#define CPR_KTHREAD_TIMEOUT_SEC 90 /* secs before callback times out -- */
+ /* due to pwr mgmt of disks, make -- */
+ /* big enough for worst spinup time */
+
+#ifdef _KERNEL
+/*
+ *
+ * CALLB_CPR_INIT macro is used by kernel threads to add their entry to
+ * the callback table and perform other initialization. It automatically
+ * adds the thread as being in the callback class CB_CL_CPR_DAEMON.
+ *
+ * cp - ptr to the callb_cpr_t structure for this kernel thread
+ *
+ * lockp - pointer to mutex protecting the callb_cpr_t stuct
+ *
+ * func - pointer to the callback function for this kernel thread.
+ * It has the prototype boolean_t <func>(void *arg, int code)
+ * where: arg - ptr to the callb_cpr_t structure
+ * code - not used for this type of callback
+ * returns: B_TRUE if successful; B_FALSE if unsuccessful.
+ *
+ * name - a string giving the name of the kernel thread
+ *
+ * Note: lockp is the lock to protect the callb_cpr_t (cp) structure
+ * later on. No lock held is needed for this initialization.
+ */
+#define CALLB_CPR_INIT(cp, lockp, func, name) { \
+ bzero((caddr_t)(cp), sizeof (callb_cpr_t)); \
+ (cp)->cc_lockp = lockp; \
+ (cp)->cc_id = callb_add(func, (void *)(cp), \
+ CB_CL_CPR_DAEMON, name); \
+ }
+
+#ifndef __lock_lint
+#define CALLB_CPR_ASSERT(cp) ASSERT(MUTEX_HELD((cp)->cc_lockp));
+#else
+#define CALLB_CPR_ASSERT(cp)
+#endif
+/*
+ * Some threads (like the idle threads) do not adhere to the callback
+ * protocol and are always considered safe. Such threads must never exit.
+ * They register their presence by calling this macro during their
+ * initialization.
+ *
+ * Args:
+ * t - thread pointer of the client kernel thread
+ * name - a string giving the name of the kernel thread
+ */
+#define CALLB_CPR_INIT_SAFE(t, name) { \
+ (void) callb_add_thread(callb_generic_cpr_safe, \
+ (void *) &callb_cprinfo_safe, CB_CL_CPR_DAEMON, \
+ name, t); \
+ }
+/*
+ * The lock to protect cp's content must be held before
+ * calling the following two macros.
+ *
+ * Any code region between CALLB_CPR_SAFE_BEGIN and CALLB_CPR_SAFE_END
+ * is safe for checkpoint/resume.
+ */
+#define CALLB_CPR_SAFE_BEGIN(cp) { \
+ CALLB_CPR_ASSERT(cp) \
+ (cp)->cc_events |= CALLB_CPR_SAFE; \
+ if ((cp)->cc_events & CALLB_CPR_START) \
+ cv_signal(&(cp)->cc_callb_cv); \
+ }
+#define CALLB_CPR_SAFE_END(cp, lockp) { \
+ CALLB_CPR_ASSERT(cp) \
+ while ((cp)->cc_events & CALLB_CPR_START) \
+ cv_wait(&(cp)->cc_stop_cv, lockp); \
+ (cp)->cc_events &= ~CALLB_CPR_SAFE; \
+ }
+/*
+ * cv_destroy is nop right now but may be needed in the future.
+ */
+#define CALLB_CPR_EXIT(cp) { \
+ CALLB_CPR_ASSERT(cp) \
+ (cp)->cc_events |= CALLB_CPR_SAFE; \
+ if ((cp)->cc_events & CALLB_CPR_START) \
+ cv_signal(&(cp)->cc_callb_cv); \
+ mutex_exit((cp)->cc_lockp); \
+ (void) callb_delete((cp)->cc_id); \
+ cv_destroy(&(cp)->cc_callb_cv); \
+ cv_destroy(&(cp)->cc_stop_cv); \
+ }
+
+extern callb_cpr_t callb_cprinfo_safe;
+extern callb_id_t callb_add(boolean_t (*)(void *, int), void *, int, char *);
+extern callb_id_t callb_add_thread(boolean_t (*)(void *, int),
+ void *, int, char *, kthread_id_t);
+extern int callb_delete(callb_id_t);
+extern void callb_execute(callb_id_t, int);
+extern void *callb_execute_class(int, int);
+extern boolean_t callb_generic_cpr(void *, int);
+extern boolean_t callb_generic_cpr_safe(void *, int);
+extern boolean_t callb_is_stopped(kthread_id_t, caddr_t *);
+extern void callb_lock_table(void);
+extern void callb_unlock_table(void);
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_CALLB_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/ccompile.h b/sys/contrib/opensolaris/uts/common/sys/ccompile.h
new file mode 100644
index 0000000..c9857b08
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/ccompile.h
@@ -0,0 +1,127 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_CCOMPILE_H
+#define _SYS_CCOMPILE_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * This file contains definitions designed to enable different compilers
+ * to be used harmoniously on Solaris systems.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Allow for version tests for compiler bugs and features.
+ */
+#if defined(__GNUC__)
+#define __GNUC_VERSION \
+ (__GNUC__ * 10000 + __GNUC_MINOR__ * 100 + __GNUC_PATCHLEVEL__)
+#else
+#define __GNUC_VERSION 0
+#endif
+
+#if defined(__ATTRIBUTE_IMPLEMENTED) || defined(__GNUC__)
+
+/*
+ * analogous to lint's PRINTFLIKEn
+ */
+#define __sun_attr___PRINTFLIKE__(__n) \
+ __attribute__((__format__(printf, __n, (__n)+1)))
+#define __sun_attr___VPRINTFLIKE__(__n) \
+ __attribute__((__format__(printf, __n, 0)))
+
+/*
+ * Handle the kernel printf routines that can take '%b' too
+ */
+#if __GNUC_VERSION < 30402
+/*
+ * XX64 at least this doesn't work correctly yet with 3.4.1 anyway!
+ */
+#define __sun_attr___KPRINTFLIKE__ __sun_attr___PRINTFLIKE__
+#define __sun_attr___KVPRINTFLIKE__ __sun_attr___VPRINTFLIKE__
+#else
+#define __sun_attr___KPRINTFLIKE__(__n) \
+ __attribute__((__format__(cmn_err, __n, (__n)+1)))
+#define __sun_attr___KVPRINTFLIKE__(__n) \
+ __attribute__((__format__(cmn_err, __n, 0)))
+#endif
+
+/*
+ * This one's pretty obvious -- the function never returns
+ */
+#define __sun_attr___noreturn__ __attribute__((__noreturn__))
+
+
+/*
+ * This is an appropriate label for functions that do not
+ * modify their arguments, e.g. strlen()
+ */
+#define __sun_attr___pure__ __attribute__((__pure__))
+
+/*
+ * This is a stronger form of __pure__. Can be used for functions
+ * that do not modify their arguments and don't depend on global
+ * memory.
+ */
+#define __sun_attr___const__ __attribute__((__const__))
+
+/*
+ * structure packing like #pragma pack(1)
+ */
+#define __sun_attr___packed__ __attribute__((__packed__))
+
+#define ___sun_attr_inner(__a) __sun_attr_##__a
+#define __sun_attr__(__a) ___sun_attr_inner __a
+
+#else /* __ATTRIBUTE_IMPLEMENTED || __GNUC__ */
+
+#define __sun_attr__(__a)
+
+#endif /* __ATTRIBUTE_IMPLEMENTED || __GNUC__ */
+
+/*
+ * Shorthand versions for readability
+ */
+
+#define __PRINTFLIKE(__n) __sun_attr__((__PRINTFLIKE__(__n)))
+#define __VPRINTFLIKE(__n) __sun_attr__((__VPRINTFLIKE__(__n)))
+#define __KPRINTFLIKE(__n) __sun_attr__((__KPRINTFLIKE__(__n)))
+#define __KVPRINTFLIKE(__n) __sun_attr__((__KVPRINTFLIKE__(__n)))
+#define __NORETURN __sun_attr__((__noreturn__))
+#define __CONST __sun_attr__((__const__))
+#define __PURE __sun_attr__((__pure__))
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_CCOMPILE_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/compress.h b/sys/contrib/opensolaris/uts/common/sys/compress.h
new file mode 100644
index 0000000..3d79d95
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/compress.h
@@ -0,0 +1,46 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (c) 1998 by Sun Microsystems, Inc.
+ * All rights reserved.
+ */
+
+#ifndef _SYS_COMPRESS_H
+#define _SYS_COMPRESS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+extern size_t compress(void *, void *, size_t);
+extern size_t decompress(void *, void *, size_t, size_t);
+extern uint32_t checksum32(void *, size_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_COMPRESS_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/cred.h b/sys/contrib/opensolaris/uts/common/sys/cred.h
new file mode 100644
index 0000000..c1400b8
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/cred.h
@@ -0,0 +1,154 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * Portions of this source code were derived from Berkeley 4.3 BSD
+ * under license from the Regents of the University of California.
+ */
+
+#ifndef _SYS_CRED_H
+#define _SYS_CRED_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The credential is an opaque kernel private data structure defined in
+ * <sys/cred_impl.h>.
+ */
+
+typedef struct cred cred_t;
+
+#ifdef _KERNEL
+
+#define CRED() curthread->t_cred
+
+struct proc; /* cred.h is included in proc.h */
+struct prcred;
+
+struct auditinfo_addr; /* cred.h is included in audit.h */
+
+extern int ngroups_max;
+/*
+ * kcred is used when you need all privileges.
+ */
+extern struct cred *kcred;
+
+extern void cred_init(void);
+extern void crhold(cred_t *);
+extern void crfree(cred_t *);
+extern cred_t *cralloc(void); /* all but ref uninitialized */
+extern cred_t *crget(void); /* initialized */
+extern cred_t *crcopy(cred_t *);
+extern void crcopy_to(cred_t *, cred_t *);
+extern cred_t *crdup(cred_t *);
+extern void crdup_to(cred_t *, cred_t *);
+extern cred_t *crgetcred(void);
+extern void crset(struct proc *, cred_t *);
+extern int groupmember(gid_t, const cred_t *);
+extern int supgroupmember(gid_t, const cred_t *);
+extern int hasprocperm(const cred_t *, const cred_t *);
+extern int prochasprocperm(struct proc *, struct proc *, const cred_t *);
+extern int crcmp(const cred_t *, const cred_t *);
+extern cred_t *zone_kcred(void);
+
+extern uid_t crgetuid(const cred_t *);
+extern uid_t crgetruid(const cred_t *);
+extern uid_t crgetsuid(const cred_t *);
+extern gid_t crgetgid(const cred_t *);
+extern gid_t crgetrgid(const cred_t *);
+extern gid_t crgetsgid(const cred_t *);
+extern zoneid_t crgetzoneid(const cred_t *);
+extern projid_t crgetprojid(const cred_t *);
+
+
+extern const struct auditinfo_addr *crgetauinfo(const cred_t *);
+extern struct auditinfo_addr *crgetauinfo_modifiable(cred_t *);
+
+extern uint_t crgetref(const cred_t *);
+
+extern const gid_t *crgetgroups(const cred_t *);
+
+extern int crgetngroups(const cred_t *);
+
+/*
+ * Sets real, effective and/or saved uid/gid;
+ * -1 argument accepted as "no change".
+ */
+extern int crsetresuid(cred_t *, uid_t, uid_t, uid_t);
+extern int crsetresgid(cred_t *, gid_t, gid_t, gid_t);
+
+/*
+ * Sets real, effective and saved uids/gids all to the same
+ * values. Both values must be non-negative and <= MAXUID
+ */
+extern int crsetugid(cred_t *, uid_t, gid_t);
+
+extern int crsetgroups(cred_t *, int, gid_t *);
+
+/*
+ * Private interface for setting zone association of credential.
+ */
+struct zone;
+extern void crsetzone(cred_t *, struct zone *);
+extern struct zone *crgetzone(const cred_t *);
+
+/*
+ * Private interface for setting project id in credential.
+ */
+extern void crsetprojid(cred_t *, projid_t);
+
+/*
+ * Private interface for nfs.
+ */
+extern cred_t *crnetadjust(cred_t *);
+
+/*
+ * Private interface for procfs.
+ */
+extern void cred2prcred(const cred_t *, struct prcred *);
+
+/*
+ * Private interfaces for Rampart Trusted Solaris.
+ */
+struct ts_label_s;
+extern struct ts_label_s *crgetlabel(const cred_t *);
+extern boolean_t crisremote(const cred_t *);
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_CRED_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/debug.h b/sys/contrib/opensolaris/uts/common/sys/debug.h
new file mode 100644
index 0000000..c87c884
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/debug.h
@@ -0,0 +1,129 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+#ifndef _SYS_DEBUG_H
+#define _SYS_DEBUG_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * ASSERT(ex) causes a panic or debugger entry if expression ex is not
+ * true. ASSERT() is included only for debugging, and is a no-op in
+ * production kernels. VERIFY(ex), on the other hand, behaves like
+ * ASSERT and is evaluated on both debug and non-debug kernels.
+ */
+
+#if defined(__STDC__)
+extern int assfail(const char *, const char *, int);
+#define VERIFY(EX) ((void)((EX) || assfail(#EX, __FILE__, __LINE__)))
+#if DEBUG
+#define ASSERT(EX) VERIFY(EX)
+#else
+#define ASSERT(x) ((void)0)
+#endif
+#else /* defined(__STDC__) */
+extern int assfail();
+#define VERIFY(EX) ((void)((EX) || assfail("EX", __FILE__, __LINE__)))
+#if DEBUG
+#define ASSERT(EX) VERIFY(EX)
+#else
+#define ASSERT(x) ((void)0)
+#endif
+#endif /* defined(__STDC__) */
+
+/*
+ * Assertion variants sensitive to the compilation data model
+ */
+#if defined(_LP64)
+#define ASSERT64(x) ASSERT(x)
+#define ASSERT32(x)
+#else
+#define ASSERT64(x)
+#define ASSERT32(x) ASSERT(x)
+#endif
+
+/*
+ * ASSERT3() behaves like ASSERT() except that it is an explicit conditional,
+ * and prints out the values of the left and right hand expressions as part of
+ * the panic message to ease debugging. The three variants imply the type
+ * of their arguments. ASSERT3S() is for signed data types, ASSERT3U() is
+ * for unsigned, and ASSERT3P() is for pointers. The VERIFY3*() macros
+ * have the same relationship as above.
+ */
+extern void assfail3(const char *, uintmax_t, const char *, uintmax_t,
+ const char *, int);
+#define VERIFY3_IMPL(LEFT, OP, RIGHT, TYPE) do { \
+ const TYPE __left = (TYPE)(LEFT); \
+ const TYPE __right = (TYPE)(RIGHT); \
+ if (!(__left OP __right)) \
+ assfail3(#LEFT " " #OP " " #RIGHT, \
+ (uintmax_t)__left, #OP, (uintmax_t)__right, \
+ __FILE__, __LINE__); \
+_NOTE(CONSTCOND) } while (0)
+
+#define VERIFY3S(x, y, z) VERIFY3_IMPL(x, y, z, int64_t)
+#define VERIFY3U(x, y, z) VERIFY3_IMPL(x, y, z, uint64_t)
+#define VERIFY3P(x, y, z) VERIFY3_IMPL(x, y, z, uintptr_t)
+#if DEBUG
+#define ASSERT3S(x, y, z) VERIFY3S(x, y, z)
+#define ASSERT3U(x, y, z) VERIFY3U(x, y, z)
+#define ASSERT3P(x, y, z) VERIFY3P(x, y, z)
+#else
+#define ASSERT3S(x, y, z) ((void)0)
+#define ASSERT3U(x, y, z) ((void)0)
+#define ASSERT3P(x, y, z) ((void)0)
+#endif
+
+#ifdef _KERNEL
+
+extern void abort_sequence_enter(char *);
+extern void debug_enter(char *);
+
+#endif /* _KERNEL */
+
+#if defined(DEBUG) && !defined(__sun)
+/* CSTYLED */
+#define STATIC
+#else
+/* CSTYLED */
+#define STATIC static
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DEBUG_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/dkio.h b/sys/contrib/opensolaris/uts/common/sys/dkio.h
new file mode 100644
index 0000000..b0ddd07
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/dkio.h
@@ -0,0 +1,477 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DKIO_H
+#define _SYS_DKIO_H
+
+#pragma ident "%Z%%M% %I% %E% SMI" /* SunOS-4.0 5.19 */
+
+#include <sys/dklabel.h> /* Needed for NDKMAP define */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Structures and definitions for disk io control commands
+ */
+
+/*
+ * Structures used as data by ioctl calls.
+ */
+
+#define DK_DEVLEN 16 /* device name max length, including */
+ /* unit # & NULL (ie - "xyc1") */
+
+/*
+ * Used for controller info
+ */
+struct dk_cinfo {
+ char dki_cname[DK_DEVLEN]; /* controller name (no unit #) */
+ ushort_t dki_ctype; /* controller type */
+ ushort_t dki_flags; /* flags */
+ ushort_t dki_cnum; /* controller number */
+ uint_t dki_addr; /* controller address */
+ uint_t dki_space; /* controller bus type */
+ uint_t dki_prio; /* interrupt priority */
+ uint_t dki_vec; /* interrupt vector */
+ char dki_dname[DK_DEVLEN]; /* drive name (no unit #) */
+ uint_t dki_unit; /* unit number */
+ uint_t dki_slave; /* slave number */
+ ushort_t dki_partition; /* partition number */
+ ushort_t dki_maxtransfer; /* max. transfer size in DEV_BSIZE */
+};
+
+/*
+ * Controller types
+ */
+#define DKC_UNKNOWN 0
+#define DKC_CDROM 1 /* CD-ROM, SCSI or otherwise */
+#define DKC_WDC2880 2
+#define DKC_XXX_0 3 /* unassigned */
+#define DKC_XXX_1 4 /* unassigned */
+#define DKC_DSD5215 5
+#define DKC_ACB4000 7
+#define DKC_MD21 8
+#define DKC_XXX_2 9 /* unassigned */
+#define DKC_NCRFLOPPY 10
+#define DKC_SMSFLOPPY 12
+#define DKC_SCSI_CCS 13 /* SCSI CCS compatible */
+#define DKC_INTEL82072 14 /* native floppy chip */
+#define DKC_MD 16 /* meta-disk (virtual-disk) driver */
+#define DKC_INTEL82077 19 /* 82077 floppy disk controller */
+#define DKC_DIRECT 20 /* Intel direct attached device i.e. IDE */
+#define DKC_PCMCIA_MEM 21 /* PCMCIA memory disk-like type */
+#define DKC_PCMCIA_ATA 22 /* PCMCIA AT Attached type */
+
+/*
+ * Sun reserves up through 1023
+ */
+
+#define DKC_CUSTOMER_BASE 1024
+
+/*
+ * Flags
+ */
+#define DKI_BAD144 0x01 /* use DEC std 144 bad sector fwding */
+#define DKI_MAPTRK 0x02 /* controller does track mapping */
+#define DKI_FMTTRK 0x04 /* formats only full track at a time */
+#define DKI_FMTVOL 0x08 /* formats only full volume at a time */
+#define DKI_FMTCYL 0x10 /* formats only full cylinders at a time */
+#define DKI_HEXUNIT 0x20 /* unit number is printed as 3 hex digits */
+#define DKI_PCMCIA_PFD 0x40 /* PCMCIA pseudo-floppy memory card */
+
+/*
+ * Used for all partitions
+ */
+struct dk_allmap {
+ struct dk_map dka_map[NDKMAP];
+};
+
+#if defined(_SYSCALL32)
+struct dk_allmap32 {
+ struct dk_map32 dka_map[NDKMAP];
+};
+#endif /* _SYSCALL32 */
+
+/*
+ * Definition of a disk's geometry
+ */
+struct dk_geom {
+ unsigned short dkg_ncyl; /* # of data cylinders */
+ unsigned short dkg_acyl; /* # of alternate cylinders */
+ unsigned short dkg_bcyl; /* cyl offset (for fixed head area) */
+ unsigned short dkg_nhead; /* # of heads */
+ unsigned short dkg_obs1; /* obsolete */
+ unsigned short dkg_nsect; /* # of data sectors per track */
+ unsigned short dkg_intrlv; /* interleave factor */
+ unsigned short dkg_obs2; /* obsolete */
+ unsigned short dkg_obs3; /* obsolete */
+ unsigned short dkg_apc; /* alternates per cyl (SCSI only) */
+ unsigned short dkg_rpm; /* revolutions per minute */
+ unsigned short dkg_pcyl; /* # of physical cylinders */
+ unsigned short dkg_write_reinstruct; /* # sectors to skip, writes */
+ unsigned short dkg_read_reinstruct; /* # sectors to skip, reads */
+ unsigned short dkg_extra[7]; /* for compatible expansion */
+};
+
+/*
+ * These defines are for historic compatibility with old drivers.
+ */
+#define dkg_bhead dkg_obs1 /* used to be head offset */
+#define dkg_gap1 dkg_obs2 /* used to be gap1 */
+#define dkg_gap2 dkg_obs3 /* used to be gap2 */
+
+/*
+ * Disk io control commands
+ * Warning: some other ioctls with the DIOC prefix exist elsewhere.
+ * The Generic DKIOC numbers are from 0 - 50.
+ * The Floppy Driver uses 51 - 100.
+ * The Hard Disk (except SCSI) 101 - 106. (these are obsolete)
+ * The CDROM Driver 151 - 200.
+ * The USCSI ioctl 201 - 250.
+ */
+#define DKIOC (0x04 << 8)
+
+/*
+ * The following ioctls are generic in nature and need to be
+ * suported as appropriate by all disk drivers
+ */
+#define DKIOCGGEOM (DKIOC|1) /* Get geometry */
+#define DKIOCINFO (DKIOC|3) /* Get info */
+#define DKIOCEJECT (DKIOC|6) /* Generic 'eject' */
+#define DKIOCGVTOC (DKIOC|11) /* Get VTOC */
+#define DKIOCSVTOC (DKIOC|12) /* Set VTOC & Write to Disk */
+
+/*
+ * Disk Cache Controls. These ioctls should be supported by
+ * all disk drivers.
+ *
+ * DKIOCFLUSHWRITECACHE when used from user-mode ignores the ioctl
+ * argument, but it should be passed as NULL to allow for future
+ * reinterpretation. From user-mode, this ioctl request is synchronous.
+ *
+ * When invoked from within the kernel, the arg can be NULL to indicate
+ * a synchronous request or can be the address of a struct dk_callback
+ * to request an asynchronous callback when the flush request is complete.
+ * In this case, the flag to the ioctl must include FKIOCTL and the
+ * dkc_callback field of the pointed to struct must be non-null or the
+ * request is made synchronously.
+ *
+ * In the callback case: if the ioctl returns 0, a callback WILL be performed.
+ * If the ioctl returns non-zero, a callback will NOT be performed.
+ * NOTE: In some cases, the callback may be done BEFORE the ioctl call
+ * returns. The caller's locking strategy should be prepared for this case.
+ */
+#define DKIOCFLUSHWRITECACHE (DKIOC|34) /* flush cache to phys medium */
+
+struct dk_callback {
+ void (*dkc_callback)(void *dkc_cookie, int error);
+ void *dkc_cookie;
+};
+
+#define DKIOCGETWCE (DKIOC|36) /* Get current write cache */
+ /* enablement status */
+#define DKIOCSETWCE (DKIOC|37) /* Enable/Disable write cache */
+
+/*
+ * The following ioctls are used by Sun drivers to communicate
+ * with their associated format routines. Support of these ioctls
+ * is not required of foreign drivers
+ */
+#define DKIOCSGEOM (DKIOC|2) /* Set geometry */
+#define DKIOCSAPART (DKIOC|4) /* Set all partitions */
+#define DKIOCGAPART (DKIOC|5) /* Get all partitions */
+#define DKIOCG_PHYGEOM (DKIOC|32) /* get physical geometry */
+#define DKIOCG_VIRTGEOM (DKIOC|33) /* get virtual geometry */
+
+/*
+ * The following ioctl's are removable media support
+ */
+#define DKIOCLOCK (DKIOC|7) /* Generic 'lock' */
+#define DKIOCUNLOCK (DKIOC|8) /* Generic 'unlock' */
+#define DKIOCSTATE (DKIOC|13) /* Inquire insert/eject state */
+#define DKIOCREMOVABLE (DKIOC|16) /* is media removable */
+
+
+/*
+ * ioctl for hotpluggable devices
+ */
+#define DKIOCHOTPLUGGABLE (DKIOC|35) /* is hotpluggable */
+
+/*
+ * Ioctl to force driver to re-read the alternate partition and rebuild
+ * the internal defect map.
+ */
+#define DKIOCADDBAD (DKIOC|20) /* Re-read the alternate map (IDE) */
+#define DKIOCGETDEF (DKIOC|21) /* read defect list (IDE) */
+
+/*
+ * Used by applications to get disk defect information from IDE
+ * drives.
+ */
+#ifdef _SYSCALL32
+struct defect_header32 {
+ int head;
+ caddr32_t buffer;
+};
+#endif /* _SYSCALL32 */
+
+struct defect_header {
+ int head;
+ caddr_t buffer;
+};
+
+#define DKIOCPARTINFO (DKIOC|22) /* Get partition or slice parameters */
+
+/*
+ * Used by applications to get partition or slice information
+ */
+#ifdef _SYSCALL32
+struct part_info32 {
+ daddr32_t p_start;
+ int p_length;
+};
+#endif /* _SYSCALL32 */
+
+struct part_info {
+ daddr_t p_start;
+ int p_length;
+};
+
+/* The following ioctls are for Optical Memory Device */
+#define DKIOC_EBP_ENABLE (DKIOC|40) /* enable by pass erase on write */
+#define DKIOC_EBP_DISABLE (DKIOC|41) /* disable by pass erase on write */
+
+/*
+ * This state enum is the argument passed to the DKIOCSTATE ioctl.
+ */
+enum dkio_state { DKIO_NONE, DKIO_EJECTED, DKIO_INSERTED, DKIO_DEV_GONE };
+
+#define DKIOCGMEDIAINFO (DKIOC|42) /* get information about the media */
+
+/*
+ * ioctls to read/write mboot info.
+ */
+#define DKIOCGMBOOT (DKIOC|43) /* get mboot info */
+#define DKIOCSMBOOT (DKIOC|44) /* set mboot info */
+
+/*
+ * ioctl to get the device temperature.
+ */
+#define DKIOCGTEMPERATURE (DKIOC|45) /* get temperature */
+
+/*
+ * Used for providing the temperature.
+ */
+
+struct dk_temperature {
+ uint_t dkt_flags; /* Flags */
+ short dkt_cur_temp; /* Current disk temperature */
+ short dkt_ref_temp; /* reference disk temperature */
+};
+
+#define DKT_BYPASS_PM 0x1
+#define DKT_INVALID_TEMP 0xFFFF
+
+
+/*
+ * Used for Media info or the current profile info
+ */
+struct dk_minfo {
+ uint_t dki_media_type; /* Media type or profile info */
+ uint_t dki_lbsize; /* Logical blocksize of media */
+ diskaddr_t dki_capacity; /* Capacity as # of dki_lbsize blks */
+};
+
+/*
+ * Media types or profiles known
+ */
+#define DK_UNKNOWN 0x00 /* Media inserted - type unknown */
+
+
+/*
+ * SFF 8090 Specification Version 3, media types 0x01 - 0xfffe are retained to
+ * maintain compatibility with SFF8090. The following define the
+ * optical media type.
+ */
+#define DK_REMOVABLE_DISK 0x02 /* Removable Disk */
+#define DK_MO_ERASABLE 0x03 /* MO Erasable */
+#define DK_MO_WRITEONCE 0x04 /* MO Write once */
+#define DK_AS_MO 0x05 /* AS MO */
+#define DK_CDROM 0x08 /* CDROM */
+#define DK_CDR 0x09 /* CD-R */
+#define DK_CDRW 0x0A /* CD-RW */
+#define DK_DVDROM 0x10 /* DVD-ROM */
+#define DK_DVDR 0x11 /* DVD-R */
+#define DK_DVDRAM 0x12 /* DVD_RAM or DVD-RW */
+
+/*
+ * Media types for other rewritable magnetic media
+ */
+#define DK_FIXED_DISK 0x10001 /* Fixed disk SCSI or otherwise */
+#define DK_FLOPPY 0x10002 /* Floppy media */
+#define DK_ZIP 0x10003 /* IOMEGA ZIP media */
+#define DK_JAZ 0x10004 /* IOMEGA JAZ media */
+
+#define DKIOCSETEFI (DKIOC|17) /* Set EFI info */
+#define DKIOCGETEFI (DKIOC|18) /* Get EFI info */
+
+#define DKIOCPARTITION (DKIOC|9) /* Get partition info */
+
+/*
+ * Ioctls to get/set volume capabilities related to Logical Volume Managers.
+ * They include the ability to get/set capabilities and to issue a read to a
+ * specific underlying device of a replicated device.
+ */
+
+#define DKIOCGETVOLCAP (DKIOC | 25) /* Get volume capabilities */
+#define DKIOCSETVOLCAP (DKIOC | 26) /* Set volume capabilities */
+#define DKIOCDMR (DKIOC | 27) /* Issue a directed read */
+
+typedef uint_t volcapinfo_t;
+
+typedef uint_t volcapset_t;
+
+#define DKV_ABR_CAP 0x00000001 /* Support Appl.Based Recovery */
+#define DKV_DMR_CAP 0x00000002 /* Support Directed Mirror Read */
+
+typedef struct volcap {
+ volcapinfo_t vc_info; /* Capabilities available */
+ volcapset_t vc_set; /* Capabilities set */
+} volcap_t;
+
+#define VOL_SIDENAME 256
+
+typedef struct vol_directed_rd {
+ int vdr_flags;
+ offset_t vdr_offset;
+ size_t vdr_nbytes;
+ size_t vdr_bytesread;
+ void *vdr_data;
+ int vdr_side;
+ char vdr_side_name[VOL_SIDENAME];
+} vol_directed_rd_t;
+
+#define DKV_SIDE_INIT (-1)
+#define DKV_DMR_NEXT_SIDE 0x00000001
+#define DKV_DMR_DONE 0x00000002
+#define DKV_DMR_ERROR 0x00000004
+#define DKV_DMR_SUCCESS 0x00000008
+#define DKV_DMR_SHORT 0x00000010
+
+#ifdef _MULTI_DATAMODEL
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack(4)
+#endif
+typedef struct vol_directed_rd32 {
+ int32_t vdr_flags;
+ offset_t vdr_offset; /* 64-bit element on 32-bit alignment */
+ size32_t vdr_nbytes;
+ size32_t vdr_bytesread;
+ caddr32_t vdr_data;
+ int32_t vdr_side;
+ char vdr_side_name[VOL_SIDENAME];
+} vol_directed_rd32_t;
+#if _LONG_LONG_ALIGNMENT == 8 && _LONG_LONG_ALIGNMENT_32 == 4
+#pragma pack()
+#endif
+#endif /* _MULTI_DATAMODEL */
+
+/*
+ * The ioctl is used to fetch disk's device type, vendor ID,
+ * model number/product ID, firmware revision and serial number together.
+ *
+ * Currently there are two device types - DKD_ATA_TYPE which means the
+ * disk is driven by cmdk/ata or dad/uata driver, and DKD_SCSI_TYPE
+ * which means the disk is driven by sd/scsi hba driver.
+ */
+#define DKIOC_GETDISKID (DKIOC|46)
+
+/* These two labels are for dkd_dtype of dk_disk_id_t */
+#define DKD_ATA_TYPE 0x01 /* ATA disk or legacy mode SATA disk */
+#define DKD_SCSI_TYPE 0x02 /* SCSI disk or native mode SATA disk */
+
+#define DKD_ATA_MODEL 40 /* model number length */
+#define DKD_ATA_FWVER 8 /* firmware revision length */
+#define DKD_ATA_SERIAL 20 /* serial number length */
+
+#define DKD_SCSI_VENDOR 8 /* vendor ID length */
+#define DKD_SCSI_PRODUCT 16 /* product ID length */
+#define DKD_SCSI_REVLEVEL 4 /* revision level length */
+#define DKD_SCSI_SERIAL 12 /* serial number length */
+
+/*
+ * The argument type for DKIOC_GETDISKID ioctl.
+ */
+typedef struct dk_disk_id {
+ uint_t dkd_dtype;
+ union {
+ struct {
+ char dkd_amodel[DKD_ATA_MODEL]; /* 40 bytes */
+ char dkd_afwver[DKD_ATA_FWVER]; /* 8 bytes */
+ char dkd_aserial[DKD_ATA_SERIAL]; /* 20 bytes */
+ } ata_disk_id;
+ struct {
+ char dkd_svendor[DKD_SCSI_VENDOR]; /* 8 bytes */
+ char dkd_sproduct[DKD_SCSI_PRODUCT]; /* 16 bytes */
+ char dkd_sfwver[DKD_SCSI_REVLEVEL]; /* 4 bytes */
+ char dkd_sserial[DKD_SCSI_SERIAL]; /* 12 bytes */
+ } scsi_disk_id;
+ } disk_id;
+} dk_disk_id_t;
+
+/*
+ * The ioctl is used to update the firmware of device.
+ */
+#define DKIOC_UPDATEFW (DKIOC|47)
+
+/* The argument type for DKIOC_UPDATEFW ioctl */
+typedef struct dk_updatefw {
+ caddr_t dku_ptrbuf; /* pointer to firmware buf */
+ uint_t dku_size; /* firmware buf length */
+ uint8_t dku_type; /* firmware update type */
+} dk_updatefw_t;
+
+#ifdef _SYSCALL32
+typedef struct dk_updatefw_32 {
+ caddr32_t dku_ptrbuf; /* pointer to firmware buf */
+ uint_t dku_size; /* firmware buf length */
+ uint8_t dku_type; /* firmware update type */
+} dk_updatefw_32_t;
+#endif /* _SYSCALL32 */
+
+/*
+ * firmware update type - temporary or permanent use
+ */
+#define FW_TYPE_TEMP 0x0 /* temporary use */
+#define FW_TYPE_PERM 0x1 /* permanent use */
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DKIO_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/dklabel.h b/sys/contrib/opensolaris/uts/common/sys/dklabel.h
new file mode 100644
index 0000000..92cb47a
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/dklabel.h
@@ -0,0 +1,268 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 1990-2002 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_DKLABEL_H
+#define _SYS_DKLABEL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/isa_defs.h>
+#include <sys/types32.h>
+#include <sys/isa_defs.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Miscellaneous defines
+ */
+#define DKL_MAGIC 0xDABE /* magic number */
+#define FKL_MAGIC 0xff /* magic number for DOS floppies */
+
+#if defined(_SUNOS_VTOC_16)
+#define NDKMAP 16 /* # of logical partitions */
+#define DK_LABEL_LOC 1 /* location of disk label */
+#elif defined(_SUNOS_VTOC_8)
+#define NDKMAP 8 /* # of logical partitions */
+#define DK_LABEL_LOC 0 /* location of disk label */
+#else
+#error "No VTOC format defined."
+#endif
+
+#define LEN_DKL_ASCII 128 /* length of dkl_asciilabel */
+#define LEN_DKL_VVOL 8 /* length of v_volume */
+#define DK_LABEL_SIZE 512 /* size of disk label */
+#define DK_MAX_BLOCKS 0x7fffffff /* max # of blocks handled */
+
+/*
+ * Reserve two cylinders on SCSI disks.
+ * One is for the backup disk label and the other is for the deviceid.
+ *
+ * IPI disks only reserve one cylinder, but they will go away soon.
+ * CDROMs do not reserve any cylinders.
+ */
+#define DK_ACYL 2
+
+/*
+ * Format of a Sun disk label.
+ * Resides in cylinder 0, head 0, sector 0.
+ *
+ * sizeof (struct dk_label) should be 512 (the current sector size),
+ * but should the sector size increase, this structure should remain
+ * at the beginning of the sector.
+ */
+
+/*
+ * partition headers: section 1
+ * Returned in struct dk_allmap by ioctl DKIOC[SG]APART (dkio(7I))
+ */
+struct dk_map {
+ daddr_t dkl_cylno; /* starting cylinder */
+ daddr_t dkl_nblk; /* number of blocks; if == 0, */
+ /* partition is undefined */
+};
+
+/*
+ * partition headers: section 1
+ * Fixed size for on-disk dk_label
+ */
+struct dk_map32 {
+ daddr32_t dkl_cylno; /* starting cylinder */
+ daddr32_t dkl_nblk; /* number of blocks; if == 0, */
+ /* partition is undefined */
+};
+
+/*
+ * partition headers: section 2,
+ * brought over from AT&T SVr4 vtoc structure.
+ */
+struct dk_map2 {
+ uint16_t p_tag; /* ID tag of partition */
+ uint16_t p_flag; /* permission flag */
+};
+
+struct dkl_partition {
+ uint16_t p_tag; /* ID tag of partition */
+ uint16_t p_flag; /* permision flags */
+ daddr32_t p_start; /* start sector no of partition */
+ int32_t p_size; /* # of blocks in partition */
+};
+
+
+/*
+ * VTOC inclusions from AT&T SVr4
+ * Fixed sized types for on-disk VTOC
+ */
+
+struct dk_vtoc {
+#if defined(_SUNOS_VTOC_16)
+ uint32_t v_bootinfo[3]; /* info for mboot (unsupported) */
+ uint32_t v_sanity; /* to verify vtoc sanity */
+ uint32_t v_version; /* layout version */
+ char v_volume[LEN_DKL_VVOL]; /* volume name */
+ uint16_t v_sectorsz; /* sector size in bytes */
+ uint16_t v_nparts; /* number of partitions */
+ uint32_t v_reserved[10]; /* free space */
+ struct dkl_partition v_part[NDKMAP]; /* partition headers */
+ time32_t timestamp[NDKMAP]; /* partition timestamp (unsupported) */
+ char v_asciilabel[LEN_DKL_ASCII]; /* for compatibility */
+#elif defined(_SUNOS_VTOC_8)
+ uint32_t v_version; /* layout version */
+ char v_volume[LEN_DKL_VVOL]; /* volume name */
+ uint16_t v_nparts; /* number of partitions */
+ struct dk_map2 v_part[NDKMAP]; /* partition hdrs, sec 2 */
+ uint32_t v_bootinfo[3]; /* info needed by mboot */
+ uint32_t v_sanity; /* to verify vtoc sanity */
+ uint32_t v_reserved[10]; /* free space */
+ time32_t v_timestamp[NDKMAP]; /* partition timestamp */
+#else
+#error "No VTOC format defined."
+#endif
+};
+
+/*
+ * define the amount of disk label padding needed to make
+ * the entire structure occupy 512 bytes.
+ */
+#if defined(_SUNOS_VTOC_16)
+#define LEN_DKL_PAD (DK_LABEL_SIZE - \
+ ((sizeof (struct dk_vtoc) + \
+ (4 * sizeof (uint32_t)) + \
+ (12 * sizeof (uint16_t)) + \
+ (2 * (sizeof (uint16_t))))))
+#elif defined(_SUNOS_VTOC_8)
+#define LEN_DKL_PAD (DK_LABEL_SIZE \
+ - ((LEN_DKL_ASCII) + \
+ (sizeof (struct dk_vtoc)) + \
+ (sizeof (struct dk_map32) * NDKMAP) + \
+ (14 * (sizeof (uint16_t))) + \
+ (2 * (sizeof (uint16_t)))))
+#else
+#error "No VTOC format defined."
+#endif
+
+
+struct dk_label {
+#if defined(_SUNOS_VTOC_16)
+ struct dk_vtoc dkl_vtoc; /* vtoc inclusions from AT&T SVr4 */
+ uint32_t dkl_pcyl; /* # of physical cylinders */
+ uint32_t dkl_ncyl; /* # of data cylinders */
+ uint16_t dkl_acyl; /* # of alternate cylinders */
+ uint16_t dkl_bcyl; /* cyl offset (for fixed head area) */
+ uint32_t dkl_nhead; /* # of heads */
+ uint32_t dkl_nsect; /* # of data sectors per track */
+ uint16_t dkl_intrlv; /* interleave factor */
+ uint16_t dkl_skew; /* skew factor */
+ uint16_t dkl_apc; /* alternates per cyl (SCSI only) */
+ uint16_t dkl_rpm; /* revolutions per minute */
+ uint16_t dkl_write_reinstruct; /* # sectors to skip, writes */
+ uint16_t dkl_read_reinstruct; /* # sectors to skip, reads */
+ uint16_t dkl_extra[4]; /* for compatible expansion */
+ char dkl_pad[LEN_DKL_PAD]; /* unused part of 512 bytes */
+#elif defined(_SUNOS_VTOC_8)
+ char dkl_asciilabel[LEN_DKL_ASCII]; /* for compatibility */
+ struct dk_vtoc dkl_vtoc; /* vtoc inclusions from AT&T SVr4 */
+ uint16_t dkl_write_reinstruct; /* # sectors to skip, writes */
+ uint16_t dkl_read_reinstruct; /* # sectors to skip, reads */
+ char dkl_pad[LEN_DKL_PAD]; /* unused part of 512 bytes */
+ uint16_t dkl_rpm; /* rotations per minute */
+ uint16_t dkl_pcyl; /* # physical cylinders */
+ uint16_t dkl_apc; /* alternates per cylinder */
+ uint16_t dkl_obs1; /* obsolete */
+ uint16_t dkl_obs2; /* obsolete */
+ uint16_t dkl_intrlv; /* interleave factor */
+ uint16_t dkl_ncyl; /* # of data cylinders */
+ uint16_t dkl_acyl; /* # of alternate cylinders */
+ uint16_t dkl_nhead; /* # of heads in this partition */
+ uint16_t dkl_nsect; /* # of 512 byte sectors per track */
+ uint16_t dkl_obs3; /* obsolete */
+ uint16_t dkl_obs4; /* obsolete */
+ struct dk_map32 dkl_map[NDKMAP]; /* logical partition headers */
+#else
+#error "No VTOC format defined."
+#endif
+ uint16_t dkl_magic; /* identifies this label format */
+ uint16_t dkl_cksum; /* xor checksum of sector */
+};
+
+#if defined(_SUNOS_VTOC_16)
+#define dkl_asciilabel dkl_vtoc.v_asciilabel
+#define v_timestamp timestamp
+
+#elif defined(_SUNOS_VTOC_8)
+
+/*
+ * These defines are for historic compatibility with old drivers.
+ */
+#define dkl_gap1 dkl_obs1 /* used to be gap1 */
+#define dkl_gap2 dkl_obs2 /* used to be gap2 */
+#define dkl_bhead dkl_obs3 /* used to be label head offset */
+#define dkl_ppart dkl_obs4 /* used to by physical partition */
+#else
+#error "No VTOC format defined."
+#endif
+
+struct fk_label { /* DOS floppy label */
+ uchar_t fkl_type;
+ uchar_t fkl_magich;
+ uchar_t fkl_magicl;
+ uchar_t filler;
+};
+
+/*
+ * Layout of stored fabricated device id (on-disk)
+ */
+#define DK_DEVID_BLKSIZE (512)
+#define DK_DEVID_SIZE (DK_DEVID_BLKSIZE - ((sizeof (uchar_t) * 7)))
+#define DK_DEVID_REV_MSB (0)
+#define DK_DEVID_REV_LSB (1)
+
+struct dk_devid {
+ uchar_t dkd_rev_hi; /* revision (MSB) */
+ uchar_t dkd_rev_lo; /* revision (LSB) */
+ uchar_t dkd_flags; /* flags (not used yet) */
+ uchar_t dkd_devid[DK_DEVID_SIZE]; /* devid stored here */
+ uchar_t dkd_checksum3; /* checksum (MSB) */
+ uchar_t dkd_checksum2;
+ uchar_t dkd_checksum1;
+ uchar_t dkd_checksum0; /* checksum (LSB) */
+};
+
+#define DKD_GETCHKSUM(dkd) ((dkd)->dkd_checksum3 << 24) + \
+ ((dkd)->dkd_checksum2 << 16) + \
+ ((dkd)->dkd_checksum1 << 8) + \
+ ((dkd)->dkd_checksum0)
+
+#define DKD_FORMCHKSUM(c, dkd) (dkd)->dkd_checksum3 = hibyte(hiword((c))); \
+ (dkd)->dkd_checksum2 = lobyte(hiword((c))); \
+ (dkd)->dkd_checksum1 = hibyte(loword((c))); \
+ (dkd)->dkd_checksum0 = lobyte(loword((c)));
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_DKLABEL_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/errorq.h b/sys/contrib/opensolaris/uts/common/sys/errorq.h
new file mode 100644
index 0000000..971b19e
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/errorq.h
@@ -0,0 +1,83 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _ERRORQ_H
+#define _ERRORQ_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/nvpair.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct errorq errorq_t;
+typedef struct errorq_elem errorq_elem_t;
+typedef void (*errorq_func_t)(void *, const void *, const errorq_elem_t *);
+
+/*
+ * Public flags for errorq_create(): bit range 0-15
+ */
+#define ERRORQ_VITAL 0x0001 /* drain queue automatically on system reset */
+
+/*
+ * Public flags for errorq_dispatch():
+ */
+#define ERRORQ_ASYNC 0 /* schedule async queue drain for caller */
+#define ERRORQ_SYNC 1 /* do not schedule drain; caller will drain */
+
+#ifdef _KERNEL
+
+extern errorq_t *errorq_create(const char *, errorq_func_t, void *,
+ ulong_t, size_t, uint_t, uint_t);
+
+extern errorq_t *errorq_nvcreate(const char *, errorq_func_t, void *,
+ ulong_t, size_t, uint_t, uint_t);
+
+extern void errorq_destroy(errorq_t *);
+extern void errorq_dispatch(errorq_t *, const void *, size_t, uint_t);
+extern void errorq_drain(errorq_t *);
+extern void errorq_init(void);
+extern void errorq_panic(void);
+extern errorq_elem_t *errorq_reserve(errorq_t *);
+extern void errorq_commit(errorq_t *, errorq_elem_t *, uint_t);
+extern void errorq_cancel(errorq_t *, errorq_elem_t *);
+extern nvlist_t *errorq_elem_nvl(errorq_t *, const errorq_elem_t *);
+extern nv_alloc_t *errorq_elem_nva(errorq_t *, const errorq_elem_t *);
+extern void *errorq_elem_dup(errorq_t *, const errorq_elem_t *,
+ errorq_elem_t **);
+extern void errorq_dump();
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ERRORQ_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/feature_tests.h b/sys/contrib/opensolaris/uts/common/sys/feature_tests.h
new file mode 100644
index 0000000..bb79cb8
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/feature_tests.h
@@ -0,0 +1,397 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_FEATURE_TESTS_H
+#define _SYS_FEATURE_TESTS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/ccompile.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Values of _POSIX_C_SOURCE
+ *
+ * undefined not a POSIX compilation
+ * 1 POSIX.1-1990 compilation
+ * 2 POSIX.2-1992 compilation
+ * 199309L POSIX.1b-1993 compilation (Real Time)
+ * 199506L POSIX.1c-1995 compilation (POSIX Threads)
+ * 200112L POSIX.1-2001 compilation (Austin Group Revision)
+ */
+#if defined(_POSIX_SOURCE) && !defined(_POSIX_C_SOURCE)
+#define _POSIX_C_SOURCE 1
+#endif
+
+/*
+ * The feature test macros __XOPEN_OR_POSIX, _STRICT_STDC, and _STDC_C99
+ * are Sun implementation specific macros created in order to compress
+ * common standards specified feature test macros for easier reading.
+ * These macros should not be used by the application developer as
+ * unexpected results may occur. Instead, the user should reference
+ * standards(5) for correct usage of the standards feature test macros.
+ *
+ * __XOPEN_OR_POSIX Used in cases where a symbol is defined by both
+ * X/Open or POSIX or in the negative, when neither
+ * X/Open or POSIX defines a symbol.
+ *
+ * _STRICT_STDC __STDC__ is specified by the C Standards and defined
+ * by the compiler. For Sun compilers the value of
+ * __STDC__ is either 1, 0, or not defined based on the
+ * compilation mode (see cc(1)). When the value of
+ * __STDC__ is 1 and in the absence of any other feature
+ * test macros, the namespace available to the application
+ * is limited to only those symbols defined by the C
+ * Standard. _STRICT_STDC provides a more readable means
+ * of identifying symbols defined by the standard, or in
+ * the negative, symbols that are extensions to the C
+ * Standard. See additional comments for GNU C differences.
+ *
+ * _STDC_C99 __STDC_VERSION__ is specified by the C standards and
+ * defined by the compiler and indicates the version of
+ * the C standard. A value of 199901L indicates a
+ * compiler that complies with ISO/IEC 9899:1999, other-
+ * wise known as the C99 standard.
+ */
+
+#if defined(_XOPEN_SOURCE) || defined(_POSIX_C_SOURCE)
+#define __XOPEN_OR_POSIX
+#endif
+
+/*
+ * ISO/IEC 9899:1990 and it's revision, ISO/IEC 9899:1999 specify the
+ * following predefined macro name:
+ *
+ * __STDC__ The integer constant 1, intended to indicate a conforming
+ * implementation.
+ *
+ * Furthermore, a strictly conforming program shall use only those features
+ * of the language and library specified in these standards. A conforming
+ * implementation shall accept any strictly conforming program.
+ *
+ * Based on these requirements, Sun's C compiler defines __STDC__ to 1 for
+ * strictly conforming environments and __STDC__ to 0 for environments that
+ * use ANSI C semantics but allow extensions to the C standard. For non-ANSI
+ * C semantics, Sun's C compiler does not define __STDC__.
+ *
+ * The GNU C project interpretation is that __STDC__ should always be defined
+ * to 1 for compilation modes that accept ANSI C syntax regardless of whether
+ * or not extensions to the C standard are used. Violations of conforming
+ * behavior are conditionally flagged as warnings via the use of the
+ * -pedantic option. In addition to defining __STDC__ to 1, the GNU C
+ * compiler also defines __STRICT_ANSI__ as a means of specifying strictly
+ * conforming environments using the -ansi or -std=<standard> options.
+ *
+ * In the absence of any other compiler options, Sun and GNU set the value
+ * of __STDC__ as follows when using the following options:
+ *
+ * Value of __STDC__ __STRICT_ANSI__
+ *
+ * cc -Xa (default) 0 undefined
+ * cc -Xt (transitional) 0 undefined
+ * cc -Xc (strictly conforming) 1 undefined
+ * cc -Xs (K&R C) undefined undefined
+ *
+ * gcc (default) 1 undefined
+ * gcc -ansi, -std={c89, c99,...) 1 defined
+ * gcc -traditional (K&R) undefined undefined
+ *
+ * The default compilation modes for Sun C compilers versus GNU C compilers
+ * results in a differing value for __STDC__ which results in a more
+ * restricted namespace when using Sun compilers. To allow both GNU and Sun
+ * interpretations to peacefully co-exist, we use the following Sun
+ * implementation _STRICT_STDC_ macro:
+ */
+
+#if (__STDC__ - 0 == 1 && !defined(__GNUC__)) || \
+ (defined(__GNUC__) && defined(__STRICT_ANSI__))
+#define _STRICT_STDC
+#else
+#undef _STRICT_STDC
+#endif
+
+/*
+ * Compiler complies with ISO/IEC 9899:1999
+ */
+
+#if __STDC_VERSION__ - 0 >= 199901L
+#ifndef _STDC_C99
+#define _STDC_C99
+#endif
+#endif
+
+/*
+ * Large file interfaces:
+ *
+ * _LARGEFILE_SOURCE
+ * 1 large file-related additions to POSIX
+ * interfaces requested (fseeko, etc.)
+ * _LARGEFILE64_SOURCE
+ * 1 transitional large-file-related interfaces
+ * requested (seek64, stat64, etc.)
+ *
+ * The corresponding announcement macros are respectively:
+ * _LFS_LARGEFILE
+ * _LFS64_LARGEFILE
+ * (These are set in <unistd.h>.)
+ *
+ * Requesting _LARGEFILE64_SOURCE implies requesting _LARGEFILE_SOURCE as
+ * well.
+ *
+ * The large file interfaces are made visible regardless of the initial values
+ * of the feature test macros under certain circumstances:
+ * - If no explicit standards-conforming environment is requested (neither
+ * of _POSIX_SOURCE nor _XOPEN_SOURCE is defined and the value of
+ * __STDC__ does not imply standards conformance).
+ * - Extended system interfaces are explicitly requested (__EXTENSIONS__
+ * is defined).
+ * - Access to in-kernel interfaces is requested (_KERNEL or _KMEMUSER is
+ * defined). (Note that this dependency is an artifact of the current
+ * kernel implementation and may change in future releases.)
+ */
+#if (!defined(_STRICT_STDC) && !defined(__XOPEN_OR_POSIX)) || \
+ defined(_KERNEL) || defined(_KMEMUSER) || \
+ defined(__EXTENSIONS__)
+#undef _LARGEFILE64_SOURCE
+#define _LARGEFILE64_SOURCE 1
+#endif
+#if _LARGEFILE64_SOURCE - 0 == 1
+#undef _LARGEFILE_SOURCE
+#define _LARGEFILE_SOURCE 1
+#endif
+
+/*
+ * Large file compilation environment control:
+ *
+ * The setting of _FILE_OFFSET_BITS controls the size of various file-related
+ * types and governs the mapping between file-related source function symbol
+ * names and the corresponding binary entry points.
+ *
+ * In the 32-bit environment, the default value is 32; if not set, set it to
+ * the default here, to simplify tests in other headers.
+ *
+ * In the 64-bit compilation environment, the only value allowed is 64.
+ */
+#if defined(_LP64)
+#ifndef _FILE_OFFSET_BITS
+#define _FILE_OFFSET_BITS 64
+#endif
+#if _FILE_OFFSET_BITS - 0 != 64
+#error "invalid _FILE_OFFSET_BITS value specified"
+#endif
+#else /* _LP64 */
+#ifndef _FILE_OFFSET_BITS
+#define _FILE_OFFSET_BITS 32
+#endif
+#if _FILE_OFFSET_BITS - 0 != 32 && _FILE_OFFSET_BITS - 0 != 64
+#error "invalid _FILE_OFFSET_BITS value specified"
+#endif
+#endif /* _LP64 */
+
+/*
+ * Use of _XOPEN_SOURCE
+ *
+ * The following X/Open specifications are supported:
+ *
+ * X/Open Portability Guide, Issue 3 (XPG3)
+ * X/Open CAE Specification, Issue 4 (XPG4)
+ * X/Open CAE Specification, Issue 4, Version 2 (XPG4v2)
+ * X/Open CAE Specification, Issue 5 (XPG5)
+ * Open Group Technical Standard, Issue 6 (XPG6), also referred to as
+ * IEEE Std. 1003.1-2001 and ISO/IEC 9945:2002.
+ *
+ * XPG4v2 is also referred to as UNIX 95 (SUS or SUSv1).
+ * XPG5 is also referred to as UNIX 98 or the Single Unix Specification,
+ * Version 2 (SUSv2)
+ * XPG6 is the result of a merge of the X/Open and POSIX specifications
+ * and as such is also referred to as IEEE Std. 1003.1-2001 in
+ * addition to UNIX 03 and SUSv3.
+ *
+ * When writing a conforming X/Open application, as per the specification
+ * requirements, the appropriate feature test macros must be defined at
+ * compile time. These are as follows. For more info, see standards(5).
+ *
+ * Feature Test Macro Specification
+ * ------------------------------------------------ -------------
+ * _XOPEN_SOURCE XPG3
+ * _XOPEN_SOURCE && _XOPEN_VERSION = 4 XPG4
+ * _XOPEN_SOURCE && _XOPEN_SOURCE_EXTENDED = 1 XPG4v2
+ * _XOPEN_SOURCE = 500 XPG5
+ * _XOPEN_SOURCE = 600 (or POSIX_C_SOURCE=200112L) XPG6
+ *
+ * In order to simplify the guards within the headers, the following
+ * implementation private test macros have been created. Applications
+ * must NOT use these private test macros as unexpected results will
+ * occur.
+ *
+ * Note that in general, the use of these private macros is cumulative.
+ * For example, the use of _XPG3 with no other restrictions on the X/Open
+ * namespace will make the symbols visible for XPG3 through XPG6
+ * compilation environments. The use of _XPG4_2 with no other X/Open
+ * namespace restrictions indicates that the symbols were introduced in
+ * XPG4v2 and are therefore visible for XPG4v2 through XPG6 compilation
+ * environments, but not for XPG3 or XPG4 compilation environments.
+ *
+ * _XPG3 X/Open Portability Guide, Issue 3 (XPG3)
+ * _XPG4 X/Open CAE Specification, Issue 4 (XPG4)
+ * _XPG4_2 X/Open CAE Specification, Issue 4, Version 2 (XPG4v2/UNIX 95/SUS)
+ * _XPG5 X/Open CAE Specification, Issue 5 (XPG5/UNIX 98/SUSv2)
+ * _XPG6 Open Group Technical Standard, Issue 6 (XPG6/UNIX 03/SUSv3)
+ */
+
+/* X/Open Portability Guide, Issue 3 */
+#if defined(_XOPEN_SOURCE) && (_XOPEN_SOURCE - 0 < 500) && \
+ (_XOPEN_VERSION - 0 < 4) && !defined(_XOPEN_SOURCE_EXTENDED)
+#define _XPG3
+/* X/Open CAE Specification, Issue 4 */
+#elif (defined(_XOPEN_SOURCE) && _XOPEN_VERSION - 0 == 4)
+#define _XPG4
+#define _XPG3
+/* X/Open CAE Specification, Issue 4, Version 2 */
+#elif (defined(_XOPEN_SOURCE) && _XOPEN_SOURCE_EXTENDED - 0 == 1)
+#define _XPG4_2
+#define _XPG4
+#define _XPG3
+/* X/Open CAE Specification, Issue 5 */
+#elif (_XOPEN_SOURCE - 0 == 500)
+#define _XPG5
+#define _XPG4_2
+#define _XPG4
+#define _XPG3
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 199506L
+/* Open Group Technical Standard , Issue 6 */
+#elif (_XOPEN_SOURCE - 0 == 600) || (_POSIX_C_SOURCE - 0 == 200112L)
+#define _XPG6
+#define _XPG5
+#define _XPG4_2
+#define _XPG4
+#define _XPG3
+#undef _POSIX_C_SOURCE
+#define _POSIX_C_SOURCE 200112L
+#undef _XOPEN_SOURCE
+#define _XOPEN_SOURCE 600
+#endif
+
+/*
+ * _XOPEN_VERSION is defined by the X/Open specifications and is not
+ * normally defined by the application, except in the case of an XPG4
+ * application. On the implementation side, _XOPEN_VERSION defined with
+ * the value of 3 indicates an XPG3 application. _XOPEN_VERSION defined
+ * with the value of 4 indicates an XPG4 or XPG4v2 (UNIX 95) application.
+ * _XOPEN_VERSION defined with a value of 500 indicates an XPG5 (UNIX 98)
+ * application and with a value of 600 indicates an XPG6 (UNIX 03)
+ * application. The appropriate version is determined by the use of the
+ * feature test macros described earlier. The value of _XOPEN_VERSION
+ * defaults to 3 otherwise indicating support for XPG3 applications.
+ */
+#ifndef _XOPEN_VERSION
+#ifdef _XPG6
+#define _XOPEN_VERSION 600
+#elif defined(_XPG5)
+#define _XOPEN_VERSION 500
+#elif defined(_XPG4_2)
+#define _XOPEN_VERSION 4
+#else
+#define _XOPEN_VERSION 3
+#endif
+#endif
+
+/*
+ * ANSI C and ISO 9899:1990 say the type long long doesn't exist in strictly
+ * conforming environments. ISO 9899:1999 says it does.
+ *
+ * The presence of _LONGLONG_TYPE says "long long exists" which is therefore
+ * defined in all but strictly conforming environments that disallow it.
+ */
+#if !defined(_STDC_C99) && defined(_STRICT_STDC) && !defined(__GNUC__)
+/*
+ * Resist attempts to force the definition of long long in this case.
+ */
+#if defined(_LONGLONG_TYPE)
+#error "No long long in strictly conforming ANSI C & 1990 ISO C environments"
+#endif
+#else
+#if !defined(_LONGLONG_TYPE)
+#define _LONGLONG_TYPE
+#endif
+#endif
+
+/*
+ * It is invalid to compile an XPG3, XPG4, XPG4v2, or XPG5 application
+ * using c99. The same is true for POSIX.1-1990, POSIX.2-1992, POSIX.1b,
+ * and POSIX.1c applications. Likewise, it is invalid to compile an XPG6
+ * or a POSIX.1-2001 application with anything other than a c99 or later
+ * compiler. Therefore, we force an error in both cases.
+ */
+#if defined(_STDC_C99) && (defined(__XOPEN_OR_POSIX) && !defined(_XPG6))
+#error "Compiler or options invalid for pre-UNIX 03 X/Open applications \
+ and pre-2001 POSIX applications"
+#elif !defined(_STDC_C99) && \
+ (defined(__XOPEN_OR_POSIX) && defined(_XPG6))
+#error "Compiler or options invalid; UNIX 03 and POSIX.1-2001 applications \
+ require the use of c99"
+#endif
+
+/*
+ * The following macro defines a value for the ISO C99 restrict
+ * keyword so that _RESTRICT_KYWD resolves to "restrict" if
+ * an ISO C99 compiler is used and "" (null string) if any other
+ * compiler is used. This allows for the use of single prototype
+ * declarations regardless of compiler version.
+ */
+#if (defined(__STDC__) && defined(_STDC_C99))
+#define _RESTRICT_KYWD restrict
+#else
+#define _RESTRICT_KYWD
+#endif
+
+/*
+ * The following macro indicates header support for the ANSI C++
+ * standard. The ISO/IEC designation for this is ISO/IEC FDIS 14882.
+ */
+#define _ISO_CPP_14882_1998
+
+/*
+ * The following macro indicates header support for the C99 standard,
+ * ISO/IEC 9899:1999, Programming Languages - C.
+ */
+#define _ISO_C_9899_1999
+
+/*
+ * The following macro indicates header support for DTrace. The value is an
+ * integer that corresponds to the major version number for DTrace.
+ */
+#define _DTRACE_VERSION 1
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_FEATURE_TESTS_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/fm/fs/zfs.h b/sys/contrib/opensolaris/uts/common/sys/fm/fs/zfs.h
new file mode 100644
index 0000000..aa5c7ee
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/fm/fs/zfs.h
@@ -0,0 +1,75 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_FM_FS_ZFS_H
+#define _SYS_FM_FS_ZFS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZFS_ERROR_CLASS "fs.zfs"
+
+#define FM_EREPORT_ZFS_CHECKSUM "checksum"
+#define FM_EREPORT_ZFS_IO "io"
+#define FM_EREPORT_ZFS_DATA "data"
+#define FM_EREPORT_ZFS_POOL "zpool"
+#define FM_EREPORT_ZFS_DEVICE_UNKNOWN "vdev.unknown"
+#define FM_EREPORT_ZFS_DEVICE_OPEN_FAILED "vdev.open_failed"
+#define FM_EREPORT_ZFS_DEVICE_CORRUPT_DATA "vdev.corrupt_data"
+#define FM_EREPORT_ZFS_DEVICE_NO_REPLICAS "vdev.no_replicas"
+#define FM_EREPORT_ZFS_DEVICE_BAD_GUID_SUM "vdev.bad_guid_sum"
+#define FM_EREPORT_ZFS_DEVICE_TOO_SMALL "vdev.too_small"
+#define FM_EREPORT_ZFS_DEVICE_BAD_LABEL "vdev.bad_label"
+
+#define FM_EREPORT_PAYLOAD_ZFS_POOL "pool"
+#define FM_EREPORT_PAYLOAD_ZFS_POOL_GUID "pool_guid"
+#define FM_EREPORT_PAYLOAD_ZFS_POOL_CONTEXT "pool_context"
+#define FM_EREPORT_PAYLOAD_ZFS_VDEV_GUID "vdev_guid"
+#define FM_EREPORT_PAYLOAD_ZFS_VDEV_TYPE "vdev_type"
+#define FM_EREPORT_PAYLOAD_ZFS_VDEV_PATH "vdev_path"
+#define FM_EREPORT_PAYLOAD_ZFS_VDEV_DEVID "vdev_devid"
+#define FM_EREPORT_PAYLOAD_ZFS_PARENT_GUID "parent_guid"
+#define FM_EREPORT_PAYLOAD_ZFS_PARENT_TYPE "parent_type"
+#define FM_EREPORT_PAYLOAD_ZFS_PARENT_PATH "parent_path"
+#define FM_EREPORT_PAYLOAD_ZFS_PARENT_DEVID "parent_devid"
+#define FM_EREPORT_PAYLOAD_ZFS_ZIO_OBJSET "zio_objset"
+#define FM_EREPORT_PAYLOAD_ZFS_ZIO_OBJECT "zio_object"
+#define FM_EREPORT_PAYLOAD_ZFS_ZIO_LEVEL "zio_level"
+#define FM_EREPORT_PAYLOAD_ZFS_ZIO_BLKID "zio_blkid"
+#define FM_EREPORT_PAYLOAD_ZFS_ZIO_ERR "zio_err"
+#define FM_EREPORT_PAYLOAD_ZFS_ZIO_OFFSET "zio_offset"
+#define FM_EREPORT_PAYLOAD_ZFS_ZIO_SIZE "zio_size"
+#define FM_EREPORT_PAYLOAD_ZFS_PREV_STATE "prev_state"
+
+#define FM_RESOURCE_OK "ok"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_FM_FS_ZFS_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/fm/protocol.h b/sys/contrib/opensolaris/uts/common/sys/fm/protocol.h
new file mode 100644
index 0000000..a9980fe
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/fm/protocol.h
@@ -0,0 +1,301 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_FM_PROTOCOL_H
+#define _SYS_FM_PROTOCOL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifdef _KERNEL
+#include <sys/varargs.h>
+#include <sys/nvpair.h>
+#else
+#include <libnvpair.h>
+#include <stdarg.h>
+#endif
+
+/* FM common member names */
+#define FM_CLASS "class"
+#define FM_VERSION "version"
+
+/* FM event class values */
+#define FM_EREPORT_CLASS "ereport"
+#define FM_FAULT_CLASS "fault"
+#define FM_RSRC_CLASS "resource"
+#define FM_LIST_EVENT "list"
+
+/* FM list.* event class values */
+#define FM_LIST_SUSPECT_CLASS FM_LIST_EVENT ".suspect"
+#define FM_LIST_ISOLATED_CLASS FM_LIST_EVENT ".isolated"
+#define FM_LIST_REPAIRED_CLASS FM_LIST_EVENT ".repaired"
+
+/* ereport class subcategory values */
+#define FM_ERROR_CPU "cpu"
+#define FM_ERROR_IO "io"
+
+/* ereport version and payload member names */
+#define FM_EREPORT_VERS0 0
+#define FM_EREPORT_VERSION FM_EREPORT_VERS0
+
+/* ereport payload member names */
+#define FM_EREPORT_DETECTOR "detector"
+#define FM_EREPORT_ENA "ena"
+
+/* list.* event payload member names */
+#define FM_LIST_EVENT_SIZE "list-sz"
+
+/* list.suspect, isolated, and repaired versions and payload member names */
+#define FM_SUSPECT_UUID "uuid"
+#define FM_SUSPECT_DIAG_CODE "code"
+#define FM_SUSPECT_DIAG_TIME "diag-time"
+#define FM_SUSPECT_DE "de"
+#define FM_SUSPECT_FAULT_LIST "fault-list"
+#define FM_SUSPECT_FAULT_SZ "fault-list-sz"
+#define FM_SUSPECT_FAULT_STATUS "fault-status"
+#define FM_SUSPECT_MESSAGE "message"
+
+#define FM_SUSPECT_VERS0 0
+#define FM_SUSPECT_VERSION FM_SUSPECT_VERS0
+
+/* fault event versions and payload member names */
+#define FM_FAULT_VERS0 0
+#define FM_FAULT_VERSION FM_FAULT_VERS0
+
+#define FM_FAULT_ASRU "asru"
+#define FM_FAULT_FRU "fru"
+#define FM_FAULT_FRU_LABEL "fru-label"
+#define FM_FAULT_CERTAINTY "certainty"
+#define FM_FAULT_RESOURCE "resource"
+#define FM_FAULT_LOCATION "location"
+
+/* resource event versions and payload member names */
+#define FM_RSRC_VERS0 0
+#define FM_RSRC_VERSION FM_RSRC_VERS0
+#define FM_RSRC_RESOURCE "resource"
+
+/* resource.fm.asru.* payload member names */
+#define FM_RSRC_ASRU_UUID "uuid"
+#define FM_RSRC_ASRU_CODE "code"
+#define FM_RSRC_ASRU_FAULTY "faulty"
+#define FM_RSRC_ASRU_UNUSABLE "unusable"
+#define FM_RSRC_ASRU_EVENT "event"
+
+/* resource.fm.xprt.* versions and payload member names */
+#define FM_RSRC_XPRT_VERS0 0
+#define FM_RSRC_XPRT_VERSION FM_RSRC_XPRT_VERS0
+#define FM_RSRC_XPRT_UUID "uuid"
+#define FM_RSRC_XPRT_SUBCLASS "subclass"
+
+/*
+ * FM ENA Format Macros
+ */
+#define ENA_FORMAT_MASK 0x3
+#define ENA_FORMAT(ena) ((ena) & ENA_FORMAT_MASK)
+
+/* ENA format types */
+#define FM_ENA_FMT0 0
+#define FM_ENA_FMT1 1
+#define FM_ENA_FMT2 2
+
+/* Format 1 */
+#define ENA_FMT1_GEN_MASK 0x00000000000003FCull
+#define ENA_FMT1_ID_MASK 0xFFFFFFFFFFFFFC00ull
+#define ENA_FMT1_CPUID_MASK 0x00000000000FFC00ull
+#define ENA_FMT1_TIME_MASK 0xFFFFFFFFFFF00000ull
+#define ENA_FMT1_GEN_SHFT 2
+#define ENA_FMT1_ID_SHFT 10
+#define ENA_FMT1_CPUID_SHFT ENA_FMT1_ID_SHFT
+#define ENA_FMT1_TIME_SHFT 20
+
+/* Format 2 */
+#define ENA_FMT2_GEN_MASK 0x00000000000003FCull
+#define ENA_FMT2_ID_MASK 0xFFFFFFFFFFFFFC00ull
+#define ENA_FMT2_TIME_MASK ENA_FMT2_ID_MASK
+#define ENA_FMT2_GEN_SHFT 2
+#define ENA_FMT2_ID_SHFT 10
+#define ENA_FMT2_TIME_SHFT ENA_FMT2_ID_SHFT
+
+/* Common FMRI type names */
+#define FM_FMRI_AUTHORITY "authority"
+#define FM_FMRI_SCHEME "scheme"
+#define FM_FMRI_SVC_AUTHORITY "svc-authority"
+
+/* FMRI authority-type member names */
+#define FM_FMRI_AUTH_CHASSIS "chassis-id"
+#define FM_FMRI_AUTH_PRODUCT "product-id"
+#define FM_FMRI_AUTH_DOMAIN "domain-id"
+#define FM_FMRI_AUTH_SERVER "server-id"
+#define FM_FMRI_AUTH_HOST "host-id"
+
+#define FM_AUTH_VERS0 0
+#define FM_FMRI_AUTH_VERSION FM_AUTH_VERS0
+
+/* scheme name values */
+#define FM_FMRI_SCHEME_FMD "fmd"
+#define FM_FMRI_SCHEME_DEV "dev"
+#define FM_FMRI_SCHEME_HC "hc"
+#define FM_FMRI_SCHEME_SVC "svc"
+#define FM_FMRI_SCHEME_CPU "cpu"
+#define FM_FMRI_SCHEME_MEM "mem"
+#define FM_FMRI_SCHEME_MOD "mod"
+#define FM_FMRI_SCHEME_PKG "pkg"
+#define FM_FMRI_SCHEME_LEGACY "legacy-hc"
+#define FM_FMRI_SCHEME_ZFS "zfs"
+
+/* Scheme versions */
+#define FMD_SCHEME_VERSION0 0
+#define FM_FMD_SCHEME_VERSION FMD_SCHEME_VERSION0
+#define DEV_SCHEME_VERSION0 0
+#define FM_DEV_SCHEME_VERSION DEV_SCHEME_VERSION0
+#define FM_HC_VERS0 0
+#define FM_HC_SCHEME_VERSION FM_HC_VERS0
+#define CPU_SCHEME_VERSION0 0
+#define CPU_SCHEME_VERSION1 1
+#define FM_CPU_SCHEME_VERSION CPU_SCHEME_VERSION1
+#define MEM_SCHEME_VERSION0 0
+#define FM_MEM_SCHEME_VERSION MEM_SCHEME_VERSION0
+#define MOD_SCHEME_VERSION0 0
+#define FM_MOD_SCHEME_VERSION MOD_SCHEME_VERSION0
+#define PKG_SCHEME_VERSION0 0
+#define FM_PKG_SCHEME_VERSION PKG_SCHEME_VERSION0
+#define LEGACY_SCHEME_VERSION0 0
+#define FM_LEGACY_SCHEME_VERSION LEGACY_SCHEME_VERSION0
+#define ZFS_SCHEME_VERSION0 0
+#define FM_ZFS_SCHEME_VERSION ZFS_SCHEME_VERSION0
+
+/* hc scheme member names */
+#define FM_FMRI_HC_SERIAL_ID "serial"
+#define FM_FMRI_HC_PART "part"
+#define FM_FMRI_HC_REVISION "revision"
+#define FM_FMRI_HC_ROOT "hc-root"
+#define FM_FMRI_HC_LIST_SZ "hc-list-sz"
+#define FM_FMRI_HC_LIST "hc-list"
+#define FM_FMRI_HC_SPECIFIC "hc-specific"
+
+/* hc-list version and member names */
+#define FM_FMRI_HC_NAME "hc-name"
+#define FM_FMRI_HC_ID "hc-id"
+
+#define HC_LIST_VERSION0 0
+#define FM_HC_LIST_VERSION HC_LIST_VERSION0
+
+/* hc-specific member names */
+#define FM_FMRI_HC_SPECIFIC_OFFSET "offset"
+
+/* fmd module scheme member names */
+#define FM_FMRI_FMD_NAME "mod-name"
+#define FM_FMRI_FMD_VERSION "mod-version"
+
+/* dev scheme member names */
+#define FM_FMRI_DEV_ID "devid"
+#define FM_FMRI_DEV_PATH "device-path"
+
+/* pkg scheme member names */
+#define FM_FMRI_PKG_BASEDIR "pkg-basedir"
+#define FM_FMRI_PKG_INST "pkg-inst"
+#define FM_FMRI_PKG_VERSION "pkg-version"
+
+/* svc scheme member names */
+#define FM_FMRI_SVC_NAME "service-name"
+#define FM_FMRI_SVC_VERSION "service-version"
+#define FM_FMRI_SVC_INSTANCE "instance"
+#define FM_FMRI_SVC_CONTRACT_ID "contract-id"
+
+/* svc-authority member names */
+#define FM_FMRI_SVC_AUTH_SCOPE "scope"
+#define FM_FMRI_SVC_AUTH_SYSTEM_FQN "system-FQN"
+
+/* cpu scheme member names */
+#define FM_FMRI_CPU_ID "cpuid"
+#define FM_FMRI_CPU_SERIAL_ID "serial"
+#define FM_FMRI_CPU_MASK "cpumask"
+#define FM_FMRI_CPU_VID "cpuvid"
+#define FM_FMRI_CPU_CPUFRU "cpufru"
+
+/* legacy-hc scheme member names */
+#define FM_FMRI_LEGACY_HC "component"
+#define FM_FMRI_LEGACY_HC_PREFIX FM_FMRI_SCHEME_HC":///" \
+ FM_FMRI_LEGACY_HC"="
+
+/* mem scheme member names */
+#define FM_FMRI_MEM_UNUM "unum"
+#define FM_FMRI_MEM_SERIAL_ID "serial"
+#define FM_FMRI_MEM_PHYSADDR "physaddr"
+#define FM_FMRI_MEM_MEMCONFIG "memconfig"
+#define FM_FMRI_MEM_OFFSET "offset"
+
+/* mod scheme member names */
+#define FM_FMRI_MOD_PKG "mod-pkg"
+#define FM_FMRI_MOD_NAME "mod-name"
+#define FM_FMRI_MOD_ID "mod-id"
+#define FM_FMRI_MOD_DESC "mod-desc"
+
+/* zfs scheme member names */
+#define FM_FMRI_ZFS_POOL "pool"
+#define FM_FMRI_ZFS_VDEV "vdev"
+
+extern nv_alloc_t *fm_nva_xcreate(char *, size_t);
+extern void fm_nva_xdestroy(nv_alloc_t *);
+
+extern nvlist_t *fm_nvlist_create(nv_alloc_t *);
+extern void fm_nvlist_destroy(nvlist_t *, int);
+
+#define FM_NVA_FREE 0 /* free allocator on nvlist_destroy */
+#define FM_NVA_RETAIN 1 /* keep allocator on nvlist_destroy */
+
+extern void fm_ereport_set(nvlist_t *, int, const char *, uint64_t,
+ const nvlist_t *, ...);
+extern void fm_payload_set(nvlist_t *, ...);
+extern int i_fm_payload_set(nvlist_t *, const char *, va_list);
+extern void fm_fmri_hc_set(nvlist_t *, int, const nvlist_t *, nvlist_t *,
+ int, ...);
+extern void fm_fmri_dev_set(nvlist_t *, int, const nvlist_t *, const char *,
+ const char *);
+extern void fm_fmri_de_set(nvlist_t *, int, const nvlist_t *, const char *);
+extern void fm_fmri_cpu_set(nvlist_t *, int, const nvlist_t *, uint32_t,
+ uint8_t *, const char *);
+extern void fm_fmri_mem_set(nvlist_t *, int, const nvlist_t *, const char *,
+ const char *, uint64_t);
+extern void fm_authority_set(nvlist_t *, int, const char *, const char *,
+ const char *, const char *);
+extern void fm_fmri_zfs_set(nvlist_t *, int, uint64_t, uint64_t);
+
+extern uint64_t fm_ena_increment(uint64_t);
+extern uint64_t fm_ena_generate(uint64_t, uchar_t);
+extern uint64_t fm_ena_generation_get(uint64_t);
+extern uchar_t fm_ena_format_get(uint64_t);
+extern uint64_t fm_ena_id_get(uint64_t);
+extern uint64_t fm_ena_time_get(uint64_t);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_FM_PROTOCOL_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/fm/util.h b/sys/contrib/opensolaris/uts/common/sys/fm/util.h
new file mode 100644
index 0000000..f65e0ab4
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/fm/util.h
@@ -0,0 +1,103 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2006 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_FM_UTIL_H
+#define _SYS_FM_UTIL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/nvpair.h>
+#include <sys/errorq.h>
+
+/*
+ * Shared user/kernel definitions for class length, error channel name,
+ * and kernel event publisher string.
+ */
+#define FM_MAX_CLASS 100
+#define FM_ERROR_CHAN "com.sun:fm:error"
+#define FM_PUB "fm"
+
+/*
+ * ereport dump device transport support
+ *
+ * Ereports are written out to the dump device at a proscribed offset from the
+ * end, similar to in-transit log messages. The ereports are represented as a
+ * erpt_dump_t header followed by ed_size bytes of packed native nvlist data.
+ *
+ * NOTE: All of these constants and the header must be defined so they have the
+ * same representation for *both* 32-bit and 64-bit producers and consumers.
+ */
+#define ERPT_MAGIC 0xf00d4eddU
+#define ERPT_MAX_ERRS 16
+#define ERPT_DATA_SZ (6 * 1024)
+#define ERPT_EVCH_MAX 256
+#define ERPT_HIWAT 64
+
+typedef struct erpt_dump {
+ uint32_t ed_magic; /* ERPT_MAGIC or zero to indicate end */
+ uint32_t ed_chksum; /* checksum32() of packed nvlist data */
+ uint32_t ed_size; /* ereport (nvl) fixed buf size */
+ uint32_t ed_pad; /* reserved for future use */
+ hrtime_t ed_hrt_nsec; /* hrtime of this ereport */
+ hrtime_t ed_hrt_base; /* hrtime sample corresponding to ed_tod_base */
+ struct {
+ uint64_t sec; /* seconds since gettimeofday() Epoch */
+ uint64_t nsec; /* nanoseconds past ed_tod_base.sec */
+ } ed_tod_base;
+} erpt_dump_t;
+
+#ifdef _KERNEL
+#include <sys/systm.h>
+
+#define FM_STK_DEPTH 20 /* maximum stack depth */
+#define FM_SYM_SZ 64 /* maximum symbol size */
+#define FM_ERR_PIL 2 /* PIL for ereport_errorq drain processing */
+
+#define FM_EREPORT_PAYLOAD_NAME_STACK "stack"
+
+extern errorq_t *ereport_errorq;
+extern void *ereport_dumpbuf;
+extern size_t ereport_dumplen;
+
+extern void fm_init(void);
+extern void fm_nvprint(nvlist_t *);
+extern void fm_panic(const char *, ...);
+extern void fm_banner(void);
+
+extern void fm_ereport_dump(void);
+extern void fm_ereport_post(nvlist_t *, int);
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_FM_UTIL_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/fs/zfs.h b/sys/contrib/opensolaris/uts/common/sys/fs/zfs.h
new file mode 100644
index 0000000..bcf8594
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/fs/zfs.h
@@ -0,0 +1,437 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_FS_ZFS_H
+#define _SYS_FS_ZFS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/ioccom.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Types and constants shared between userland and the kernel.
+ */
+
+/*
+ * Each dataset can be one of the following types. These constants can be
+ * combined into masks that can be passed to various functions.
+ */
+typedef enum {
+ ZFS_TYPE_FILESYSTEM = 0x1,
+ ZFS_TYPE_SNAPSHOT = 0x2,
+ ZFS_TYPE_VOLUME = 0x4,
+ ZFS_TYPE_POOL = 0x8
+} zfs_type_t;
+
+#define ZFS_TYPE_ANY \
+ (ZFS_TYPE_FILESYSTEM | ZFS_TYPE_VOLUME | ZFS_TYPE_SNAPSHOT)
+
+/*
+ * Properties are identified by these constants and must be added to the
+ * end of this list to ensure that external conumsers are not affected
+ * by the change. The property list also determines how 'zfs get' will
+ * display them. If you make any changes to this list, be sure to update
+ * the property table in usr/src/common/zfs/zfs_prop.c.
+ */
+typedef enum {
+ ZFS_PROP_CONT = -2,
+ ZFS_PROP_INVAL = -1,
+ ZFS_PROP_TYPE,
+ ZFS_PROP_CREATION,
+ ZFS_PROP_USED,
+ ZFS_PROP_AVAILABLE,
+ ZFS_PROP_REFERENCED,
+ ZFS_PROP_COMPRESSRATIO,
+ ZFS_PROP_MOUNTED,
+ ZFS_PROP_ORIGIN,
+ ZFS_PROP_QUOTA,
+ ZFS_PROP_RESERVATION,
+ ZFS_PROP_VOLSIZE,
+ ZFS_PROP_VOLBLOCKSIZE,
+ ZFS_PROP_RECORDSIZE,
+ ZFS_PROP_MOUNTPOINT,
+ ZFS_PROP_SHARENFS,
+ ZFS_PROP_CHECKSUM,
+ ZFS_PROP_COMPRESSION,
+ ZFS_PROP_ATIME,
+ ZFS_PROP_DEVICES,
+ ZFS_PROP_EXEC,
+ ZFS_PROP_SETUID,
+ ZFS_PROP_READONLY,
+ ZFS_PROP_ZONED,
+ ZFS_PROP_SNAPDIR,
+ ZFS_PROP_ACLMODE,
+ ZFS_PROP_ACLINHERIT,
+ ZFS_PROP_CREATETXG, /* not exposed to the user */
+ ZFS_PROP_NAME, /* not exposed to the user */
+ ZFS_PROP_CANMOUNT,
+ ZFS_PROP_SHAREISCSI,
+ ZFS_PROP_ISCSIOPTIONS, /* not exposed to the user */
+ ZFS_PROP_XATTR,
+ ZFS_PROP_NUMCLONES, /* not exposed to the user */
+ ZFS_PROP_COPIES,
+ ZFS_PROP_BOOTFS
+} zfs_prop_t;
+
+typedef zfs_prop_t zpool_prop_t;
+
+#define ZFS_PROP_VALUE "value"
+#define ZFS_PROP_SOURCE "source"
+
+typedef enum {
+ ZFS_SRC_NONE = 0x1,
+ ZFS_SRC_DEFAULT = 0x2,
+ ZFS_SRC_TEMPORARY = 0x4,
+ ZFS_SRC_LOCAL = 0x8,
+ ZFS_SRC_INHERITED = 0x10
+} zfs_source_t;
+
+#define ZFS_SRC_ALL 0x1f
+
+/*
+ * The following functions are shared between libzfs and the kernel.
+ */
+zfs_prop_t zfs_name_to_prop(const char *);
+zpool_prop_t zpool_name_to_prop(const char *);
+boolean_t zfs_prop_user(const char *);
+int zfs_prop_readonly(zfs_prop_t);
+const char *zfs_prop_default_string(zfs_prop_t);
+const char *zfs_prop_to_name(zfs_prop_t);
+const char *zpool_prop_to_name(zfs_prop_t);
+uint64_t zfs_prop_default_numeric(zfs_prop_t);
+int zfs_prop_inheritable(zfs_prop_t);
+int zfs_prop_string_to_index(zfs_prop_t, const char *, uint64_t *);
+int zfs_prop_index_to_string(zfs_prop_t, uint64_t, const char **);
+
+/*
+ * Property Iterator
+ */
+typedef zfs_prop_t (*zfs_prop_f)(zfs_prop_t, void *);
+typedef zfs_prop_f zpool_prop_f;
+extern zfs_prop_t zfs_prop_iter(zfs_prop_f, void *, boolean_t);
+extern zpool_prop_t zpool_prop_iter(zpool_prop_f, void *, boolean_t);
+
+/*
+ * On-disk version number.
+ */
+#define ZFS_VERSION_1 1ULL
+#define ZFS_VERSION_2 2ULL
+#define ZFS_VERSION_3 3ULL
+#define ZFS_VERSION_4 4ULL
+#define ZFS_VERSION_5 5ULL
+#define ZFS_VERSION_6 6ULL
+/*
+ * When bumping up ZFS_VERSION, make sure GRUB ZFS understand the on-disk
+ * format change. Go to usr/src/grub/grub-0.95/stage2/{zfs-include/, fsys_zfs*},
+ * and do the appropriate changes.
+ */
+#define ZFS_VERSION ZFS_VERSION_6
+#define ZFS_VERSION_STRING "6"
+
+/*
+ * Symbolic names for the changes that caused a ZFS_VERSION switch.
+ * Used in the code when checking for presence or absence of a feature.
+ * Feel free to define multiple symbolic names for each version if there
+ * were multiple changes to on-disk structures during that version.
+ *
+ * NOTE: When checking the current ZFS_VERSION in your code, be sure
+ * to use spa_version() since it reports the version of the
+ * last synced uberblock. Checking the in-flight version can
+ * be dangerous in some cases.
+ */
+#define ZFS_VERSION_INITIAL ZFS_VERSION_1
+#define ZFS_VERSION_DITTO_BLOCKS ZFS_VERSION_2
+#define ZFS_VERSION_SPARES ZFS_VERSION_3
+#define ZFS_VERSION_RAID6 ZFS_VERSION_3
+#define ZFS_VERSION_BPLIST_ACCOUNT ZFS_VERSION_3
+#define ZFS_VERSION_RAIDZ_DEFLATE ZFS_VERSION_3
+#define ZFS_VERSION_DNODE_BYTES ZFS_VERSION_3
+#define ZFS_VERSION_ZPOOL_HISTORY ZFS_VERSION_4
+#define ZFS_VERSION_GZIP_COMPRESSION ZFS_VERSION_5
+#define ZFS_VERSION_BOOTFS ZFS_VERSION_6
+
+/*
+ * The following are configuration names used in the nvlist describing a pool's
+ * configuration.
+ */
+#define ZPOOL_CONFIG_VERSION "version"
+#define ZPOOL_CONFIG_POOL_NAME "name"
+#define ZPOOL_CONFIG_POOL_STATE "state"
+#define ZPOOL_CONFIG_POOL_TXG "txg"
+#define ZPOOL_CONFIG_POOL_GUID "pool_guid"
+#define ZPOOL_CONFIG_CREATE_TXG "create_txg"
+#define ZPOOL_CONFIG_TOP_GUID "top_guid"
+#define ZPOOL_CONFIG_VDEV_TREE "vdev_tree"
+#define ZPOOL_CONFIG_TYPE "type"
+#define ZPOOL_CONFIG_CHILDREN "children"
+#define ZPOOL_CONFIG_ID "id"
+#define ZPOOL_CONFIG_GUID "guid"
+#define ZPOOL_CONFIG_PATH "path"
+#define ZPOOL_CONFIG_DEVID "devid"
+#define ZPOOL_CONFIG_METASLAB_ARRAY "metaslab_array"
+#define ZPOOL_CONFIG_METASLAB_SHIFT "metaslab_shift"
+#define ZPOOL_CONFIG_ASHIFT "ashift"
+#define ZPOOL_CONFIG_ASIZE "asize"
+#define ZPOOL_CONFIG_DTL "DTL"
+#define ZPOOL_CONFIG_STATS "stats"
+#define ZPOOL_CONFIG_WHOLE_DISK "whole_disk"
+#define ZPOOL_CONFIG_OFFLINE "offline"
+#define ZPOOL_CONFIG_ERRCOUNT "error_count"
+#define ZPOOL_CONFIG_NOT_PRESENT "not_present"
+#define ZPOOL_CONFIG_SPARES "spares"
+#define ZPOOL_CONFIG_IS_SPARE "is_spare"
+#define ZPOOL_CONFIG_NPARITY "nparity"
+#define ZPOOL_CONFIG_HOSTID "hostid"
+#define ZPOOL_CONFIG_HOSTNAME "hostname"
+#define ZPOOL_CONFIG_TIMESTAMP "timestamp" /* not stored on disk */
+
+#define VDEV_TYPE_ROOT "root"
+#define VDEV_TYPE_MIRROR "mirror"
+#define VDEV_TYPE_REPLACING "replacing"
+#define VDEV_TYPE_RAIDZ "raidz"
+#define VDEV_TYPE_DISK "disk"
+#define VDEV_TYPE_FILE "file"
+#define VDEV_TYPE_MISSING "missing"
+#define VDEV_TYPE_SPARE "spare"
+
+/*
+ * This is needed in userland to report the minimum necessary device size.
+ */
+#define SPA_MINDEVSIZE (64ULL << 20)
+
+/*
+ * The location of the pool configuration repository, shared between kernel and
+ * userland.
+ */
+#define ZPOOL_CACHE_DIR "/boot/zfs"
+#define ZPOOL_CACHE_FILE "zpool.cache"
+#define ZPOOL_CACHE_TMP ".zpool.cache"
+
+#define ZPOOL_CACHE ZPOOL_CACHE_DIR "/" ZPOOL_CACHE_FILE
+
+/*
+ * vdev states are ordered from least to most healthy.
+ * A vdev that's CANT_OPEN or below is considered unusable.
+ */
+typedef enum vdev_state {
+ VDEV_STATE_UNKNOWN = 0, /* Uninitialized vdev */
+ VDEV_STATE_CLOSED, /* Not currently open */
+ VDEV_STATE_OFFLINE, /* Not allowed to open */
+ VDEV_STATE_CANT_OPEN, /* Tried to open, but failed */
+ VDEV_STATE_DEGRADED, /* Replicated vdev with unhealthy kids */
+ VDEV_STATE_HEALTHY /* Presumed good */
+} vdev_state_t;
+
+/*
+ * vdev aux states. When a vdev is in the CANT_OPEN state, the aux field
+ * of the vdev stats structure uses these constants to distinguish why.
+ */
+typedef enum vdev_aux {
+ VDEV_AUX_NONE, /* no error */
+ VDEV_AUX_OPEN_FAILED, /* ldi_open_*() or vn_open() failed */
+ VDEV_AUX_CORRUPT_DATA, /* bad label or disk contents */
+ VDEV_AUX_NO_REPLICAS, /* insufficient number of replicas */
+ VDEV_AUX_BAD_GUID_SUM, /* vdev guid sum doesn't match */
+ VDEV_AUX_TOO_SMALL, /* vdev size is too small */
+ VDEV_AUX_BAD_LABEL, /* the label is OK but invalid */
+ VDEV_AUX_VERSION_NEWER, /* on-disk version is too new */
+ VDEV_AUX_VERSION_OLDER, /* on-disk version is too old */
+ VDEV_AUX_SPARED /* hot spare used in another pool */
+} vdev_aux_t;
+
+/*
+ * pool state. The following states are written to disk as part of the normal
+ * SPA lifecycle: ACTIVE, EXPORTED, DESTROYED, SPARE. The remaining states are
+ * software abstractions used at various levels to communicate pool state.
+ */
+typedef enum pool_state {
+ POOL_STATE_ACTIVE = 0, /* In active use */
+ POOL_STATE_EXPORTED, /* Explicitly exported */
+ POOL_STATE_DESTROYED, /* Explicitly destroyed */
+ POOL_STATE_SPARE, /* Reserved for hot spare use */
+ POOL_STATE_UNINITIALIZED, /* Internal spa_t state */
+ POOL_STATE_UNAVAIL, /* Internal libzfs state */
+ POOL_STATE_POTENTIALLY_ACTIVE /* Internal libzfs state */
+} pool_state_t;
+
+/*
+ * Scrub types.
+ */
+typedef enum pool_scrub_type {
+ POOL_SCRUB_NONE,
+ POOL_SCRUB_RESILVER,
+ POOL_SCRUB_EVERYTHING,
+ POOL_SCRUB_TYPES
+} pool_scrub_type_t;
+
+/*
+ * ZIO types. Needed to interpret vdev statistics below.
+ */
+typedef enum zio_type {
+ ZIO_TYPE_NULL = 0,
+ ZIO_TYPE_READ,
+ ZIO_TYPE_WRITE,
+ ZIO_TYPE_FREE,
+ ZIO_TYPE_CLAIM,
+ ZIO_TYPE_IOCTL,
+ ZIO_TYPES
+} zio_type_t;
+
+/*
+ * Vdev statistics. Note: all fields should be 64-bit because this
+ * is passed between kernel and userland as an nvlist uint64 array.
+ */
+typedef struct vdev_stat {
+ hrtime_t vs_timestamp; /* time since vdev load */
+ uint64_t vs_state; /* vdev state */
+ uint64_t vs_aux; /* see vdev_aux_t */
+ uint64_t vs_alloc; /* space allocated */
+ uint64_t vs_space; /* total capacity */
+ uint64_t vs_dspace; /* deflated capacity */
+ uint64_t vs_rsize; /* replaceable dev size */
+ uint64_t vs_ops[ZIO_TYPES]; /* operation count */
+ uint64_t vs_bytes[ZIO_TYPES]; /* bytes read/written */
+ uint64_t vs_read_errors; /* read errors */
+ uint64_t vs_write_errors; /* write errors */
+ uint64_t vs_checksum_errors; /* checksum errors */
+ uint64_t vs_self_healed; /* self-healed bytes */
+ uint64_t vs_scrub_type; /* pool_scrub_type_t */
+ uint64_t vs_scrub_complete; /* completed? */
+ uint64_t vs_scrub_examined; /* bytes examined; top */
+ uint64_t vs_scrub_repaired; /* bytes repaired; leaf */
+ uint64_t vs_scrub_errors; /* errors during scrub */
+ uint64_t vs_scrub_start; /* UTC scrub start time */
+ uint64_t vs_scrub_end; /* UTC scrub end time */
+} vdev_stat_t;
+
+#define ZFS_DRIVER "zfs"
+#define ZFS_DEV_NAME "zfs"
+#define ZFS_DEV "/dev/" ZFS_DEV_NAME
+
+/*
+ * zvol paths. Irritatingly, the devfsadm interfaces want all these
+ * paths without the /dev prefix, but for some things, we want the
+ * /dev prefix. Below are the names without /dev.
+ */
+#define ZVOL_DEV_DIR "zvol"
+
+/*
+ * And here are the things we need with /dev, etc. in front of them.
+ */
+#define ZVOL_PSEUDO_DEV "/devices/pseudo/zvol@0:"
+#define ZVOL_FULL_DEV_DIR "/dev/" ZVOL_DEV_DIR
+
+#define ZVOL_PROP_NAME "name"
+
+/*
+ * /dev/zfs ioctl numbers.
+ */
+typedef unsigned long zfs_ioc_t;
+
+#define ZFS_IOC(ioreq) ((ioreq) & 0xff)
+
+#define ZFS_IOC_POOL_CREATE _IOWR('Z', 0, struct zfs_cmd)
+#define ZFS_IOC_POOL_DESTROY _IOWR('Z', 1, struct zfs_cmd)
+#define ZFS_IOC_POOL_IMPORT _IOWR('Z', 2, struct zfs_cmd)
+#define ZFS_IOC_POOL_EXPORT _IOWR('Z', 3, struct zfs_cmd)
+#define ZFS_IOC_POOL_CONFIGS _IOWR('Z', 4, struct zfs_cmd)
+#define ZFS_IOC_POOL_STATS _IOWR('Z', 5, struct zfs_cmd)
+#define ZFS_IOC_POOL_TRYIMPORT _IOWR('Z', 6, struct zfs_cmd)
+#define ZFS_IOC_POOL_SCRUB _IOWR('Z', 7, struct zfs_cmd)
+#define ZFS_IOC_POOL_FREEZE _IOWR('Z', 8, struct zfs_cmd)
+#define ZFS_IOC_POOL_UPGRADE _IOWR('Z', 9, struct zfs_cmd)
+#define ZFS_IOC_POOL_GET_HISTORY _IOWR('Z', 10, struct zfs_cmd)
+#define ZFS_IOC_POOL_LOG_HISTORY _IOWR('Z', 11, struct zfs_cmd)
+#define ZFS_IOC_VDEV_ADD _IOWR('Z', 12, struct zfs_cmd)
+#define ZFS_IOC_VDEV_REMOVE _IOWR('Z', 13, struct zfs_cmd)
+#define ZFS_IOC_VDEV_ONLINE _IOWR('Z', 14, struct zfs_cmd)
+#define ZFS_IOC_VDEV_OFFLINE _IOWR('Z', 15, struct zfs_cmd)
+#define ZFS_IOC_VDEV_ATTACH _IOWR('Z', 16, struct zfs_cmd)
+#define ZFS_IOC_VDEV_DETACH _IOWR('Z', 17, struct zfs_cmd)
+#define ZFS_IOC_VDEV_SETPATH _IOWR('Z', 18, struct zfs_cmd)
+#define ZFS_IOC_OBJSET_STATS _IOWR('Z', 19, struct zfs_cmd)
+#define ZFS_IOC_DATASET_LIST_NEXT _IOWR('Z', 20, struct zfs_cmd)
+#define ZFS_IOC_SNAPSHOT_LIST_NEXT _IOWR('Z', 21, struct zfs_cmd)
+#define ZFS_IOC_SET_PROP _IOWR('Z', 22, struct zfs_cmd)
+#define ZFS_IOC_CREATE_MINOR _IOWR('Z', 23, struct zfs_cmd)
+#define ZFS_IOC_REMOVE_MINOR _IOWR('Z', 24, struct zfs_cmd)
+#define ZFS_IOC_CREATE _IOWR('Z', 25, struct zfs_cmd)
+#define ZFS_IOC_DESTROY _IOWR('Z', 26, struct zfs_cmd)
+#define ZFS_IOC_ROLLBACK _IOWR('Z', 27, struct zfs_cmd)
+#define ZFS_IOC_RENAME _IOWR('Z', 28, struct zfs_cmd)
+#define ZFS_IOC_RECVBACKUP _IOWR('Z', 29, struct zfs_cmd)
+#define ZFS_IOC_SENDBACKUP _IOWR('Z', 30, struct zfs_cmd)
+#define ZFS_IOC_INJECT_FAULT _IOWR('Z', 31, struct zfs_cmd)
+#define ZFS_IOC_CLEAR_FAULT _IOWR('Z', 32, struct zfs_cmd)
+#define ZFS_IOC_INJECT_LIST_NEXT _IOWR('Z', 33, struct zfs_cmd)
+#define ZFS_IOC_ERROR_LOG _IOWR('Z', 34, struct zfs_cmd)
+#define ZFS_IOC_CLEAR _IOWR('Z', 35, struct zfs_cmd)
+#define ZFS_IOC_PROMOTE _IOWR('Z', 36, struct zfs_cmd)
+#define ZFS_IOC_DESTROY_SNAPS _IOWR('Z', 37, struct zfs_cmd)
+#define ZFS_IOC_SNAPSHOT _IOWR('Z', 38, struct zfs_cmd)
+#define ZFS_IOC_DSOBJ_TO_DSNAME _IOWR('Z', 39, struct zfs_cmd)
+#define ZFS_IOC_OBJ_TO_PATH _IOWR('Z', 40, struct zfs_cmd)
+#define ZFS_IOC_POOL_SET_PROPS _IOWR('Z', 41, struct zfs_cmd)
+#define ZFS_IOC_POOL_GET_PROPS _IOWR('Z', 42, struct zfs_cmd)
+#define ZFS_IOC_JAIL _IOWR('Z', 43, struct zfs_cmd)
+#define ZFS_IOC_UNJAIL _IOWR('Z', 44, struct zfs_cmd)
+
+/*
+ * Internal SPA load state. Used by FMA diagnosis engine.
+ */
+typedef enum {
+ SPA_LOAD_NONE, /* no load in progress */
+ SPA_LOAD_OPEN, /* normal open */
+ SPA_LOAD_IMPORT, /* import in progress */
+ SPA_LOAD_TRYIMPORT /* tryimport in progress */
+} spa_load_state_t;
+
+/*
+ * Bookmark name values.
+ */
+#define ZPOOL_ERR_LIST "error list"
+#define ZPOOL_ERR_DATASET "dataset"
+#define ZPOOL_ERR_OBJECT "object"
+
+#define HIS_MAX_RECORD_LEN (MAXPATHLEN + MAXPATHLEN + 1)
+
+/*
+ * The following are names used in the nvlist describing
+ * the pool's history log.
+ */
+#define ZPOOL_HIST_RECORD "history record"
+#define ZPOOL_HIST_TIME "history time"
+#define ZPOOL_HIST_CMD "history command"
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_FS_ZFS_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/gfs.h b/sys/contrib/opensolaris/uts/common/sys/gfs.h
new file mode 100644
index 0000000..8e70f29
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/gfs.h
@@ -0,0 +1,139 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_GFS_H
+#define _SYS_GFS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/vnode.h>
+#include <sys/mutex.h>
+#include <sys/dirent.h>
+#include <sys/uio.h>
+#include <sys/list.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define GFS_CACHE_VNODE 0x1
+
+typedef struct gfs_dirent {
+ char *gfse_name; /* entry name */
+ vnode_t *(*gfse_ctor)(vnode_t *); /* constructor */
+ int gfse_flags; /* flags */
+ list_node_t gfse_link; /* dynamic list */
+ vnode_t *gfse_vnode; /* cached vnode */
+} gfs_dirent_t;
+
+typedef enum gfs_type {
+ GFS_DIR,
+ GFS_FILE
+} gfs_type_t;
+
+typedef struct gfs_file {
+ vnode_t *gfs_vnode; /* current vnode */
+ vnode_t *gfs_parent; /* parent vnode */
+ size_t gfs_size; /* size of private data structure */
+ gfs_type_t gfs_type; /* type of vnode */
+ int gfs_index; /* index in parent dir */
+ ino64_t gfs_ino; /* inode for this vnode */
+} gfs_file_t;
+
+typedef int (*gfs_readdir_cb)(vnode_t *, struct dirent64 *, int *, offset_t *,
+ offset_t *, void *);
+typedef int (*gfs_lookup_cb)(vnode_t *, const char *, vnode_t **, ino64_t *);
+typedef ino64_t (*gfs_inode_cb)(vnode_t *, int);
+
+typedef struct gfs_dir {
+ gfs_file_t gfsd_file; /* generic file attributes */
+ gfs_dirent_t *gfsd_static; /* statically defined entries */
+ int gfsd_nstatic; /* # static entries */
+ kmutex_t gfsd_lock; /* protects entries */
+ int gfsd_maxlen; /* maximum name length */
+ gfs_readdir_cb gfsd_readdir; /* readdir() callback */
+ gfs_lookup_cb gfsd_lookup; /* lookup() callback */
+ gfs_inode_cb gfsd_inode; /* get an inode number */
+} gfs_dir_t;
+
+struct vfs;
+
+extern vnode_t *gfs_file_create(size_t, vnode_t *, vfs_t *, vnodeops_t *);
+extern vnode_t *gfs_dir_create(size_t, vnode_t *, vfs_t *, vnodeops_t *,
+ gfs_dirent_t *, gfs_inode_cb, int, gfs_readdir_cb, gfs_lookup_cb);
+extern vnode_t *gfs_root_create(size_t, vfs_t *, vnodeops_t *, ino64_t,
+ gfs_dirent_t *, gfs_inode_cb, int, gfs_readdir_cb, gfs_lookup_cb);
+extern vnode_t *gfs_root_create_file(size_t, struct vfs *, vnodeops_t *,
+ ino64_t);
+
+extern void *gfs_file_inactive(vnode_t *);
+extern void *gfs_dir_inactive(vnode_t *);
+
+extern int gfs_dir_lookup(vnode_t *, const char *, vnode_t **);
+extern int gfs_dir_readdir(vnode_t *, uio_t *, int *, int *, u_long **, void *);
+
+#define gfs_dir_lock(gd) mutex_enter(&(gd)->gfsd_lock)
+#define gfs_dir_unlock(gd) mutex_exit(&(gd)->gfsd_lock)
+
+#define gfs_file_parent(vp) (((gfs_file_t *)(vp)->v_data)->gfs_parent)
+
+#define gfs_file_index(vp) (((gfs_file_t *)(vp)->v_data)->gfs_index)
+#define gfs_file_set_index(vp, idx) \
+ (((gfs_file_t *)(vp)->v_data)->gfs_index = (idx))
+
+#define gfs_file_inode(vp) (((gfs_file_t *)(vp)->v_data)->gfs_ino)
+#define gfs_file_set_inode(vp, ino) \
+ (((gfs_file_t *)(vp)->v_data)->gfs_ino = (ino))
+
+typedef struct gfs_readdir_state {
+ struct dirent64 *grd_dirent; /* directory entry buffer */
+ size_t grd_namlen; /* max file name length */
+ size_t grd_ureclen; /* exported record size */
+ ssize_t grd_oresid; /* original uio_resid */
+ ino64_t grd_parent; /* inode of parent */
+ ino64_t grd_self; /* inode of self */
+} gfs_readdir_state_t;
+
+extern int gfs_readdir_init(gfs_readdir_state_t *, int, int, uio_t *, ino64_t,
+ ino64_t);
+extern int gfs_readdir_emit(gfs_readdir_state_t *, uio_t *, offset_t, ino64_t,
+ const char *, int *, u_long **);
+extern int gfs_readdir_pred(gfs_readdir_state_t *, uio_t *, offset_t *, int *,
+ u_long **);
+extern int gfs_readdir_fini(gfs_readdir_state_t *, int, int *, int);
+
+extern int gfs_lookup_dot(vnode_t **, vnode_t *, vnode_t *, const char *);
+
+extern int gfs_vop_readdir(struct vop_readdir_args *);
+extern int gfs_vop_inactive(struct vop_inactive_args *);
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_GFS_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/isa_defs.h b/sys/contrib/opensolaris/uts/common/sys/isa_defs.h
new file mode 100644
index 0000000..08fcbd0
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/isa_defs.h
@@ -0,0 +1,479 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_ISA_DEFS_H
+#define _SYS_ISA_DEFS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * This header file serves to group a set of well known defines and to
+ * set these for each instruction set architecture. These defines may
+ * be divided into two groups; characteristics of the processor and
+ * implementation choices for Solaris on a processor.
+ *
+ * Processor Characteristics:
+ *
+ * _LITTLE_ENDIAN / _BIG_ENDIAN:
+ * The natural byte order of the processor. A pointer to an int points
+ * to the least/most significant byte of that int.
+ *
+ * _STACK_GROWS_UPWARD / _STACK_GROWS_DOWNWARD:
+ * The processor specific direction of stack growth. A push onto the
+ * stack increases/decreases the stack pointer, so it stores data at
+ * successively higher/lower addresses. (Stackless machines ignored
+ * without regrets).
+ *
+ * _LONG_LONG_HTOL / _LONG_LONG_LTOH:
+ * A pointer to a long long points to the most/least significant long
+ * within that long long.
+ *
+ * _BIT_FIELDS_HTOL / _BIT_FIELDS_LTOH:
+ * The C compiler assigns bit fields from the high/low to the low/high end
+ * of an int (most to least significant vs. least to most significant).
+ *
+ * _IEEE_754:
+ * The processor (or supported implementations of the processor)
+ * supports the ieee-754 floating point standard. No other floating
+ * point standards are supported (or significant). Any other supported
+ * floating point formats are expected to be cased on the ISA processor
+ * symbol.
+ *
+ * _CHAR_IS_UNSIGNED / _CHAR_IS_SIGNED:
+ * The C Compiler implements objects of type `char' as `unsigned' or
+ * `signed' respectively. This is really an implementation choice of
+ * the compiler writer, but it is specified in the ABI and tends to
+ * be uniform across compilers for an instruction set architecture.
+ * Hence, it has the properties of a processor characteristic.
+ *
+ * _CHAR_ALIGNMENT / _SHORT_ALIGNMENT / _INT_ALIGNMENT / _LONG_ALIGNMENT /
+ * _LONG_LONG_ALIGNMENT / _DOUBLE_ALIGNMENT / _LONG_DOUBLE_ALIGNMENT /
+ * _POINTER_ALIGNMENT / _FLOAT_ALIGNMENT:
+ * The ABI defines alignment requirements of each of the primitive
+ * object types. Some, if not all, may be hardware requirements as
+ * well. The values are expressed in "byte-alignment" units.
+ *
+ * _MAX_ALIGNMENT:
+ * The most stringent alignment requirement as specified by the ABI.
+ * Equal to the maximum of all the above _XXX_ALIGNMENT values.
+ *
+ * _ALIGNMENT_REQUIRED:
+ * True or false (1 or 0) whether or not the hardware requires the ABI
+ * alignment.
+ *
+ * _LONG_LONG_ALIGNMENT_32
+ * The 32-bit ABI supported by a 64-bit kernel may have different
+ * alignment requirements for primitive object types. The value of this
+ * identifier is expressed in "byte-alignment" units.
+ *
+ * _HAVE_CPUID_INSN
+ * This indicates that the architecture supports the 'cpuid'
+ * instruction as defined by Intel. (Intel allows other vendors
+ * to extend the instruction for their own purposes.)
+ *
+ *
+ * Implementation Choices:
+ *
+ * _ILP32 / _LP64:
+ * This specifies the compiler data type implementation as specified in
+ * the relevant ABI. The choice between these is strongly influenced
+ * by the underlying hardware, but is not absolutely tied to it.
+ * Currently only two data type models are supported:
+ *
+ * _ILP32:
+ * Int/Long/Pointer are 32 bits. This is the historical UNIX
+ * and Solaris implementation. Due to its historical standing,
+ * this is the default case.
+ *
+ * _LP64:
+ * Long/Pointer are 64 bits, Int is 32 bits. This is the chosen
+ * implementation for 64-bit ABIs such as SPARC V9.
+ *
+ * _I32LPx:
+ * A compilation environment where 'int' is 32-bit, and
+ * longs and pointers are simply the same size.
+ *
+ * In all cases, Char is 8 bits and Short is 16 bits.
+ *
+ * _SUNOS_VTOC_8 / _SUNOS_VTOC_16 / _SVR4_VTOC_16:
+ * This specifies the form of the disk VTOC (or label):
+ *
+ * _SUNOS_VTOC_8:
+ * This is a VTOC form which is upwardly compatible with the
+ * SunOS 4.x disk label and allows 8 partitions per disk.
+ *
+ * _SUNOS_VTOC_16:
+ * In this format the incore vtoc image matches the ondisk
+ * version. It allows 16 slices per disk, and is not
+ * compatible with the SunOS 4.x disk label.
+ *
+ * Note that these are not the only two VTOC forms possible and
+ * additional forms may be added. One possible form would be the
+ * SVr4 VTOC form. The symbol for that is reserved now, although
+ * it is not implemented.
+ *
+ * _SVR4_VTOC_16:
+ * This VTOC form is compatible with the System V Release 4
+ * VTOC (as implemented on the SVr4 Intel and 3b ports) with
+ * 16 partitions per disk.
+ *
+ *
+ * _DMA_USES_PHYSADDR / _DMA_USES_VIRTADDR
+ * This describes the type of addresses used by system DMA:
+ *
+ * _DMA_USES_PHYSADDR:
+ * This type of DMA, used in the x86 implementation,
+ * requires physical addresses for DMA buffers. The 24-bit
+ * addresses used by some legacy boards is the source of the
+ * "low-memory" (<16MB) requirement for some devices using DMA.
+ *
+ * _DMA_USES_VIRTADDR:
+ * This method of DMA allows the use of virtual addresses for
+ * DMA transfers.
+ *
+ * _FIRMWARE_NEEDS_FDISK / _NO_FDISK_PRESENT
+ * This indicates the presence/absence of an fdisk table.
+ *
+ * _FIRMWARE_NEEDS_FDISK
+ * The fdisk table is required by system firmware. If present,
+ * it allows a disk to be subdivided into multiple fdisk
+ * partitions, each of which is equivalent to a separate,
+ * virtual disk. This enables the co-existence of multiple
+ * operating systems on a shared hard disk.
+ *
+ * _NO_FDISK_PRESENT
+ * If the fdisk table is absent, it is assumed that the entire
+ * media is allocated for a single operating system.
+ *
+ * _HAVE_TEM_FIRMWARE
+ * Defined if this architecture has the (fallback) option of
+ * using prom_* calls for doing I/O if a suitable kernel driver
+ * is not available to do it.
+ *
+ * _DONT_USE_1275_GENERIC_NAMES
+ * Controls whether or not device tree node names should
+ * comply with the IEEE 1275 "Generic Names" Recommended
+ * Practice. With _DONT_USE_GENERIC_NAMES, device-specific
+ * names identifying the particular device will be used.
+ *
+ * __i386_COMPAT
+ * This indicates whether the i386 ABI is supported as a *non-native*
+ * mode for the platform. When this symbol is defined:
+ * - 32-bit xstat-style system calls are enabled
+ * - 32-bit xmknod-style system calls are enabled
+ * - 32-bit system calls use i386 sizes -and- alignments
+ *
+ * Note that this is NOT defined for the i386 native environment!
+ *
+ * __x86
+ * This is ONLY a synonym for defined(__i386) || defined(__amd64)
+ * which is useful only insofar as these two architectures share
+ * common attributes. Analogous to __sparc.
+ *
+ * _PSM_MODULES
+ * This indicates whether or not the implementation uses PSM
+ * modules for processor support, reading /etc/mach from inside
+ * the kernel to extract a list.
+ *
+ * _RTC_CONFIG
+ * This indicates whether or not the implementation uses /etc/rtc_config
+ * to configure the real-time clock in the kernel.
+ *
+ * _UNIX_KRTLD
+ * This indicates that the implementation uses a dynamically
+ * linked unix + krtld to form the core kernel image at boot
+ * time, or (in the absence of this symbol) a prelinked kernel image.
+ */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * The following set of definitions characterize Solaris on AMD's
+ * 64-bit systems.
+ */
+#if defined(__x86_64) || defined(__amd64)
+
+#if !defined(__amd64)
+#define __amd64 /* preferred guard */
+#endif
+
+#if !defined(__x86)
+#define __x86
+#endif
+
+/*
+ * Define the appropriate "processor characteristics"
+ */
+#define _LITTLE_ENDIAN
+#define _STACK_GROWS_DOWNWARD
+#define _LONG_LONG_LTOH
+#define _BIT_FIELDS_LTOH
+#define _IEEE_754
+#define _CHAR_IS_SIGNED
+#define _BOOL_ALIGNMENT 1
+#define _CHAR_ALIGNMENT 1
+#define _SHORT_ALIGNMENT 2
+#define _INT_ALIGNMENT 4
+#define _FLOAT_ALIGNMENT 4
+#define _FLOAT_COMPLEX_ALIGNMENT 4
+#define _LONG_ALIGNMENT 8
+#define _LONG_LONG_ALIGNMENT 8
+#define _DOUBLE_ALIGNMENT 8
+#define _DOUBLE_COMPLEX_ALIGNMENT 8
+#define _LONG_DOUBLE_ALIGNMENT 16
+#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16
+#define _POINTER_ALIGNMENT 8
+#define _MAX_ALIGNMENT 16
+#define _ALIGNMENT_REQUIRED 1
+
+/*
+ * Different alignment constraints for the i386 ABI in compatibility mode
+ */
+#define _LONG_LONG_ALIGNMENT_32 4
+
+/*
+ * Define the appropriate "implementation choices".
+ */
+#if !defined(_LP64)
+#define _LP64
+#endif
+#if !defined(_I32LPx) && defined(_KERNEL)
+#define _I32LPx
+#endif
+#define _MULTI_DATAMODEL
+#define _SUNOS_VTOC_16
+#define _DMA_USES_PHYSADDR
+#define _FIRMWARE_NEEDS_FDISK
+#define __i386_COMPAT
+#define _PSM_MODULES
+#define _RTC_CONFIG
+#define _DONT_USE_1275_GENERIC_NAMES
+#define _HAVE_CPUID_INSN
+
+/*
+ * The feature test macro __i386 is generic for all processors implementing
+ * the Intel 386 instruction set or a superset of it. Specifically, this
+ * includes all members of the 386, 486, and Pentium family of processors.
+ */
+#elif defined(__i386) || defined(__i386__)
+
+#if !defined(__i386)
+#define __i386
+#endif
+
+#if !defined(__x86)
+#define __x86
+#endif
+
+/*
+ * Define the appropriate "processor characteristics"
+ */
+#define _LITTLE_ENDIAN
+#define _STACK_GROWS_DOWNWARD
+#define _LONG_LONG_LTOH
+#define _BIT_FIELDS_LTOH
+#define _IEEE_754
+#define _CHAR_IS_SIGNED
+#define _BOOL_ALIGNMENT 1
+#define _CHAR_ALIGNMENT 1
+#define _SHORT_ALIGNMENT 2
+#define _INT_ALIGNMENT 4
+#define _FLOAT_ALIGNMENT 4
+#define _FLOAT_COMPLEX_ALIGNMENT 4
+#define _LONG_ALIGNMENT 4
+#define _LONG_LONG_ALIGNMENT 4
+#define _DOUBLE_ALIGNMENT 4
+#define _DOUBLE_COMPLEX_ALIGNMENT 4
+#define _LONG_DOUBLE_ALIGNMENT 4
+#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 4
+#define _POINTER_ALIGNMENT 4
+#define _MAX_ALIGNMENT 4
+#define _ALIGNMENT_REQUIRED 0
+
+#define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT
+
+/*
+ * Define the appropriate "implementation choices".
+ */
+#define _ILP32
+#if !defined(_I32LPx) && defined(_KERNEL)
+#define _I32LPx
+#endif
+#define _SUNOS_VTOC_16
+#define _DMA_USES_PHYSADDR
+#define _FIRMWARE_NEEDS_FDISK
+#define _PSM_MODULES
+#define _RTC_CONFIG
+#define _DONT_USE_1275_GENERIC_NAMES
+#define _HAVE_CPUID_INSN
+
+/*
+ * The following set of definitions characterize the Solaris on SPARC systems.
+ *
+ * The symbol __sparc indicates any of the SPARC family of processor
+ * architectures. This includes SPARC V7, SPARC V8 and SPARC V9.
+ *
+ * The symbol __sparcv8 indicates the 32-bit SPARC V8 architecture as defined
+ * by Version 8 of the SPARC Architecture Manual. (SPARC V7 is close enough
+ * to SPARC V8 for the former to be subsumed into the latter definition.)
+ *
+ * The symbol __sparcv9 indicates the 64-bit SPARC V9 architecture as defined
+ * by Version 9 of the SPARC Architecture Manual.
+ *
+ * The symbols __sparcv8 and __sparcv9 are mutually exclusive, and are only
+ * relevant when the symbol __sparc is defined.
+ */
+/*
+ * XXX Due to the existence of 5110166, "defined(__sparcv9)" needs to be added
+ * to support backwards builds. This workaround should be removed in s10_71.
+ */
+#elif defined(__sparc) || defined(__sparcv9) || defined(__sparc__)
+#if !defined(__sparc)
+#define __sparc
+#endif
+
+/*
+ * You can be 32-bit or 64-bit, but not both at the same time.
+ */
+#if defined(__sparcv8) && defined(__sparcv9)
+#error "SPARC Versions 8 and 9 are mutually exclusive choices"
+#endif
+
+/*
+ * Existing compilers do not set __sparcv8. Years will transpire before
+ * the compilers can be depended on to set the feature test macro. In
+ * the interim, we'll set it here on the basis of historical behaviour;
+ * if you haven't asked for SPARC V9, then you must've meant SPARC V8.
+ */
+#if !defined(__sparcv9) && !defined(__sparcv8)
+#define __sparcv8
+#endif
+
+/*
+ * Define the appropriate "processor characteristics" shared between
+ * all Solaris on SPARC systems.
+ */
+#define _BIG_ENDIAN
+#define _STACK_GROWS_DOWNWARD
+#define _LONG_LONG_HTOL
+#define _BIT_FIELDS_HTOL
+#define _IEEE_754
+#define _CHAR_IS_SIGNED
+#define _BOOL_ALIGNMENT 1
+#define _CHAR_ALIGNMENT 1
+#define _SHORT_ALIGNMENT 2
+#define _INT_ALIGNMENT 4
+#define _FLOAT_ALIGNMENT 4
+#define _FLOAT_COMPLEX_ALIGNMENT 4
+#define _LONG_LONG_ALIGNMENT 8
+#define _DOUBLE_ALIGNMENT 8
+#define _DOUBLE_COMPLEX_ALIGNMENT 8
+#define _ALIGNMENT_REQUIRED 1
+
+/*
+ * Define the appropriate "implementation choices" shared between versions.
+ */
+#define _SUNOS_VTOC_8
+#define _DMA_USES_VIRTADDR
+#define _NO_FDISK_PRESENT
+#define _HAVE_TEM_FIRMWARE
+#define _UNIX_KRTLD
+
+/*
+ * The following set of definitions characterize the implementation of
+ * 32-bit Solaris on SPARC V8 systems.
+ */
+#if defined(__sparcv8)
+
+/*
+ * Define the appropriate "processor characteristics"
+ */
+#define _LONG_ALIGNMENT 4
+#define _LONG_DOUBLE_ALIGNMENT 8
+#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 8
+#define _POINTER_ALIGNMENT 4
+#define _MAX_ALIGNMENT 8
+
+#define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGNMENT
+
+/*
+ * Define the appropriate "implementation choices"
+ */
+#define _ILP32
+#if !defined(_I32LPx) && defined(_KERNEL)
+#define _I32LPx
+#endif
+
+/*
+ * The following set of definitions characterize the implementation of
+ * 64-bit Solaris on SPARC V9 systems.
+ */
+#elif defined(__sparcv9)
+
+/*
+ * Define the appropriate "processor characteristics"
+ */
+#define _LONG_ALIGNMENT 8
+#define _LONG_DOUBLE_ALIGNMENT 16
+#define _LONG_DOUBLE_COMPLEX_ALIGNMENT 16
+#define _POINTER_ALIGNMENT 8
+#define _MAX_ALIGNMENT 16
+
+#define _LONG_LONG_ALIGNMENT_32 _LONG_LONG_ALIGMENT
+
+/*
+ * Define the appropriate "implementation choices"
+ */
+#if !defined(_LP64)
+#define _LP64
+#endif
+#if !defined(_I32LPx)
+#define _I32LPx
+#endif
+#define _MULTI_DATAMODEL
+
+#else
+#error "unknown SPARC version"
+#endif
+
+/*
+ * #error is strictly ansi-C, but works as well as anything for K&R systems.
+ */
+#else
+#error "ISA not supported"
+#endif
+
+#if defined(_ILP32) && defined(_LP64)
+#error "Both _ILP32 and _LP64 are defined"
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_ISA_DEFS_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/list.h b/sys/contrib/opensolaris/uts/common/sys/list.h
new file mode 100644
index 0000000..7e9d9aa
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/list.h
@@ -0,0 +1,63 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_LIST_H
+#define _SYS_LIST_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/list_impl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef struct list_node list_node_t;
+typedef struct list list_t;
+
+void list_create(list_t *, size_t, size_t);
+void list_destroy(list_t *);
+
+void list_insert_after(list_t *, void *, void *);
+void list_insert_before(list_t *, void *, void *);
+void list_insert_head(list_t *, void *);
+void list_insert_tail(list_t *, void *);
+void list_remove(list_t *, void *);
+void list_move_tail(list_t *, list_t *);
+
+void *list_head(list_t *);
+void *list_tail(list_t *);
+void *list_next(list_t *, void *);
+void *list_prev(list_t *, void *);
+
+int list_link_active(list_node_t *);
+int list_is_empty(list_t *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_LIST_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/list_impl.h b/sys/contrib/opensolaris/uts/common/sys/list_impl.h
new file mode 100644
index 0000000..9c42f88
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/list_impl.h
@@ -0,0 +1,53 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_LIST_IMPL_H
+#define _SYS_LIST_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+struct list_node {
+ struct list_node *list_next;
+ struct list_node *list_prev;
+};
+
+struct list {
+ size_t list_size;
+ size_t list_offset;
+ struct list_node list_head;
+};
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_LIST_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/note.h b/sys/contrib/opensolaris/uts/common/sys/note.h
new file mode 100644
index 0000000..2cb7fd8
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/note.h
@@ -0,0 +1,56 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (c) 1994 by Sun Microsystems, Inc.
+ */
+
+/*
+ * sys/note.h: interface for annotating source with info for tools
+ *
+ * This is the underlying interface; NOTE (/usr/include/note.h) is the
+ * preferred interface, but all exported header files should include this
+ * file directly and use _NOTE so as not to take "NOTE" from the user's
+ * namespace. For consistency, *all* kernel source should use _NOTE.
+ *
+ * By default, annotations expand to nothing. This file implements
+ * that. Tools using annotations will interpose a different version
+ * of this file that will expand annotations as needed.
+ */
+
+#ifndef _SYS_NOTE_H
+#define _SYS_NOTE_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _NOTE
+#define _NOTE(s)
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_NOTE_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/nvpair.h b/sys/contrib/opensolaris/uts/common/sys/nvpair.h
new file mode 100644
index 0000000..306e30f
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/nvpair.h
@@ -0,0 +1,260 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_NVPAIR_H
+#define _SYS_NVPAIR_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/time.h>
+#include <sys/errno.h>
+
+#if defined(_KERNEL) && !defined(_BOOT)
+#include <sys/kmem.h>
+#endif
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+typedef enum {
+ DATA_TYPE_UNKNOWN = 0,
+ DATA_TYPE_BOOLEAN,
+ DATA_TYPE_BYTE,
+ DATA_TYPE_INT16,
+ DATA_TYPE_UINT16,
+ DATA_TYPE_INT32,
+ DATA_TYPE_UINT32,
+ DATA_TYPE_INT64,
+ DATA_TYPE_UINT64,
+ DATA_TYPE_STRING,
+ DATA_TYPE_BYTE_ARRAY,
+ DATA_TYPE_INT16_ARRAY,
+ DATA_TYPE_UINT16_ARRAY,
+ DATA_TYPE_INT32_ARRAY,
+ DATA_TYPE_UINT32_ARRAY,
+ DATA_TYPE_INT64_ARRAY,
+ DATA_TYPE_UINT64_ARRAY,
+ DATA_TYPE_STRING_ARRAY,
+ DATA_TYPE_HRTIME,
+ DATA_TYPE_NVLIST,
+ DATA_TYPE_NVLIST_ARRAY,
+ DATA_TYPE_BOOLEAN_VALUE,
+ DATA_TYPE_INT8,
+ DATA_TYPE_UINT8,
+ DATA_TYPE_BOOLEAN_ARRAY,
+ DATA_TYPE_INT8_ARRAY,
+ DATA_TYPE_UINT8_ARRAY
+} data_type_t;
+
+typedef struct nvpair {
+ int32_t nvp_size; /* size of this nvpair */
+ int16_t nvp_name_sz; /* length of name string */
+ int16_t nvp_reserve; /* not used */
+ int32_t nvp_value_elem; /* number of elements for array types */
+ data_type_t nvp_type; /* type of value */
+ /* name string */
+ /* aligned ptr array for string arrays */
+ /* aligned array of data for value */
+} nvpair_t;
+
+/* nvlist header */
+typedef struct nvlist {
+ int32_t nvl_version;
+ uint32_t nvl_nvflag; /* persistent flags */
+ uint64_t nvl_priv; /* ptr to private data if not packed */
+ uint32_t nvl_flag;
+ int32_t nvl_pad; /* currently not used, for alignment */
+} nvlist_t;
+
+/* nvp implementation version */
+#define NV_VERSION 0
+
+/* nvlist pack encoding */
+#define NV_ENCODE_NATIVE 0
+#define NV_ENCODE_XDR 1
+
+/* nvlist persistent unique name flags, stored in nvl_nvflags */
+#define NV_UNIQUE_NAME 0x1
+#define NV_UNIQUE_NAME_TYPE 0x2
+
+/* nvlist lookup pairs related flags */
+#define NV_FLAG_NOENTOK 0x1
+
+/* convenience macros */
+#define NV_ALIGN(x) (((ulong_t)(x) + 7ul) & ~7ul)
+#define NV_ALIGN4(x) (((x) + 3) & ~3)
+
+#define NVP_SIZE(nvp) ((nvp)->nvp_size)
+#define NVP_NAME(nvp) ((char *)(nvp) + sizeof (nvpair_t))
+#define NVP_TYPE(nvp) ((nvp)->nvp_type)
+#define NVP_NELEM(nvp) ((nvp)->nvp_value_elem)
+#define NVP_VALUE(nvp) ((char *)(nvp) + NV_ALIGN(sizeof (nvpair_t) \
+ + (nvp)->nvp_name_sz))
+
+#define NVL_VERSION(nvl) ((nvl)->nvl_version)
+#define NVL_SIZE(nvl) ((nvl)->nvl_size)
+#define NVL_FLAG(nvl) ((nvl)->nvl_flag)
+
+/* NV allocator framework */
+typedef struct nv_alloc_ops nv_alloc_ops_t;
+
+typedef struct nv_alloc {
+ const nv_alloc_ops_t *nva_ops;
+ void *nva_arg;
+} nv_alloc_t;
+
+struct nv_alloc_ops {
+ int (*nv_ao_init)(nv_alloc_t *, __va_list);
+ void (*nv_ao_fini)(nv_alloc_t *);
+ void *(*nv_ao_alloc)(nv_alloc_t *, size_t);
+ void (*nv_ao_free)(nv_alloc_t *, void *, size_t);
+ void (*nv_ao_reset)(nv_alloc_t *);
+};
+
+extern const nv_alloc_ops_t *nv_fixed_ops;
+extern nv_alloc_t *nv_alloc_nosleep;
+
+#if defined(_KERNEL) && !defined(_BOOT)
+extern nv_alloc_t *nv_alloc_sleep;
+#endif
+
+int nv_alloc_init(nv_alloc_t *, const nv_alloc_ops_t *, /* args */ ...);
+void nv_alloc_reset(nv_alloc_t *);
+void nv_alloc_fini(nv_alloc_t *);
+
+/* list management */
+int nvlist_alloc(nvlist_t **, uint_t, int);
+void nvlist_free(nvlist_t *);
+int nvlist_size(nvlist_t *, size_t *, int);
+int nvlist_pack(nvlist_t *, char **, size_t *, int, int);
+int nvlist_unpack(char *, size_t, nvlist_t **, int);
+int nvlist_dup(nvlist_t *, nvlist_t **, int);
+int nvlist_merge(nvlist_t *, nvlist_t *, int);
+
+int nvlist_xalloc(nvlist_t **, uint_t, nv_alloc_t *);
+int nvlist_xpack(nvlist_t *, char **, size_t *, int, nv_alloc_t *);
+int nvlist_xunpack(char *, size_t, nvlist_t **, nv_alloc_t *);
+int nvlist_xdup(nvlist_t *, nvlist_t **, nv_alloc_t *);
+nv_alloc_t *nvlist_lookup_nv_alloc(nvlist_t *);
+
+int nvlist_add_nvpair(nvlist_t *, nvpair_t *);
+int nvlist_add_boolean(nvlist_t *, const char *);
+int nvlist_add_boolean_value(nvlist_t *, const char *, boolean_t);
+int nvlist_add_byte(nvlist_t *, const char *, uchar_t);
+int nvlist_add_int8(nvlist_t *, const char *, int8_t);
+int nvlist_add_uint8(nvlist_t *, const char *, uint8_t);
+int nvlist_add_int16(nvlist_t *, const char *, int16_t);
+int nvlist_add_uint16(nvlist_t *, const char *, uint16_t);
+int nvlist_add_int32(nvlist_t *, const char *, int32_t);
+int nvlist_add_uint32(nvlist_t *, const char *, uint32_t);
+int nvlist_add_int64(nvlist_t *, const char *, int64_t);
+int nvlist_add_uint64(nvlist_t *, const char *, uint64_t);
+int nvlist_add_string(nvlist_t *, const char *, const char *);
+int nvlist_add_nvlist(nvlist_t *, const char *, nvlist_t *);
+int nvlist_add_boolean_array(nvlist_t *, const char *, boolean_t *, uint_t);
+int nvlist_add_byte_array(nvlist_t *, const char *, uchar_t *, uint_t);
+int nvlist_add_int8_array(nvlist_t *, const char *, int8_t *, uint_t);
+int nvlist_add_uint8_array(nvlist_t *, const char *, uint8_t *, uint_t);
+int nvlist_add_int16_array(nvlist_t *, const char *, int16_t *, uint_t);
+int nvlist_add_uint16_array(nvlist_t *, const char *, uint16_t *, uint_t);
+int nvlist_add_int32_array(nvlist_t *, const char *, int32_t *, uint_t);
+int nvlist_add_uint32_array(nvlist_t *, const char *, uint32_t *, uint_t);
+int nvlist_add_int64_array(nvlist_t *, const char *, int64_t *, uint_t);
+int nvlist_add_uint64_array(nvlist_t *, const char *, uint64_t *, uint_t);
+int nvlist_add_string_array(nvlist_t *, const char *, char *const *, uint_t);
+int nvlist_add_nvlist_array(nvlist_t *, const char *, nvlist_t **, uint_t);
+int nvlist_add_hrtime(nvlist_t *, const char *, hrtime_t);
+
+int nvlist_remove(nvlist_t *, const char *, data_type_t);
+int nvlist_remove_all(nvlist_t *, const char *);
+
+int nvlist_lookup_boolean(nvlist_t *, const char *);
+int nvlist_lookup_boolean_value(nvlist_t *, const char *, boolean_t *);
+int nvlist_lookup_byte(nvlist_t *, const char *, uchar_t *);
+int nvlist_lookup_int8(nvlist_t *, const char *, int8_t *);
+int nvlist_lookup_uint8(nvlist_t *, const char *, uint8_t *);
+int nvlist_lookup_int16(nvlist_t *, const char *, int16_t *);
+int nvlist_lookup_uint16(nvlist_t *, const char *, uint16_t *);
+int nvlist_lookup_int32(nvlist_t *, const char *, int32_t *);
+int nvlist_lookup_uint32(nvlist_t *, const char *, uint32_t *);
+int nvlist_lookup_int64(nvlist_t *, const char *, int64_t *);
+int nvlist_lookup_uint64(nvlist_t *, const char *, uint64_t *);
+int nvlist_lookup_string(nvlist_t *, const char *, char **);
+int nvlist_lookup_nvlist(nvlist_t *, const char *, nvlist_t **);
+int nvlist_lookup_boolean_array(nvlist_t *, const char *,
+ boolean_t **, uint_t *);
+int nvlist_lookup_byte_array(nvlist_t *, const char *, uchar_t **, uint_t *);
+int nvlist_lookup_int8_array(nvlist_t *, const char *, int8_t **, uint_t *);
+int nvlist_lookup_uint8_array(nvlist_t *, const char *, uint8_t **, uint_t *);
+int nvlist_lookup_int16_array(nvlist_t *, const char *, int16_t **, uint_t *);
+int nvlist_lookup_uint16_array(nvlist_t *, const char *, uint16_t **, uint_t *);
+int nvlist_lookup_int32_array(nvlist_t *, const char *, int32_t **, uint_t *);
+int nvlist_lookup_uint32_array(nvlist_t *, const char *, uint32_t **, uint_t *);
+int nvlist_lookup_int64_array(nvlist_t *, const char *, int64_t **, uint_t *);
+int nvlist_lookup_uint64_array(nvlist_t *, const char *, uint64_t **, uint_t *);
+int nvlist_lookup_string_array(nvlist_t *, const char *, char ***, uint_t *);
+int nvlist_lookup_nvlist_array(nvlist_t *, const char *,
+ nvlist_t ***, uint_t *);
+int nvlist_lookup_hrtime(nvlist_t *, const char *, hrtime_t *);
+int nvlist_lookup_pairs(nvlist_t *nvl, int, ...);
+
+/* processing nvpair */
+nvpair_t *nvlist_next_nvpair(nvlist_t *nvl, nvpair_t *);
+char *nvpair_name(nvpair_t *);
+data_type_t nvpair_type(nvpair_t *);
+int nvpair_value_boolean_value(nvpair_t *, boolean_t *);
+int nvpair_value_byte(nvpair_t *, uchar_t *);
+int nvpair_value_int8(nvpair_t *, int8_t *);
+int nvpair_value_uint8(nvpair_t *, uint8_t *);
+int nvpair_value_int16(nvpair_t *, int16_t *);
+int nvpair_value_uint16(nvpair_t *, uint16_t *);
+int nvpair_value_int32(nvpair_t *, int32_t *);
+int nvpair_value_uint32(nvpair_t *, uint32_t *);
+int nvpair_value_int64(nvpair_t *, int64_t *);
+int nvpair_value_uint64(nvpair_t *, uint64_t *);
+int nvpair_value_string(nvpair_t *, char **);
+int nvpair_value_nvlist(nvpair_t *, nvlist_t **);
+int nvpair_value_boolean_array(nvpair_t *, boolean_t **, uint_t *);
+int nvpair_value_byte_array(nvpair_t *, uchar_t **, uint_t *);
+int nvpair_value_int8_array(nvpair_t *, int8_t **, uint_t *);
+int nvpair_value_uint8_array(nvpair_t *, uint8_t **, uint_t *);
+int nvpair_value_int16_array(nvpair_t *, int16_t **, uint_t *);
+int nvpair_value_uint16_array(nvpair_t *, uint16_t **, uint_t *);
+int nvpair_value_int32_array(nvpair_t *, int32_t **, uint_t *);
+int nvpair_value_uint32_array(nvpair_t *, uint32_t **, uint_t *);
+int nvpair_value_int64_array(nvpair_t *, int64_t **, uint_t *);
+int nvpair_value_uint64_array(nvpair_t *, uint64_t **, uint_t *);
+int nvpair_value_string_array(nvpair_t *, char ***, uint_t *);
+int nvpair_value_nvlist_array(nvpair_t *, nvlist_t ***, uint_t *);
+int nvpair_value_hrtime(nvpair_t *, hrtime_t *);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_NVPAIR_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/nvpair_impl.h b/sys/contrib/opensolaris/uts/common/sys/nvpair_impl.h
new file mode 100644
index 0000000..f12dbbf
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/nvpair_impl.h
@@ -0,0 +1,73 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _NVPAIR_IMPL_H
+#define _NVPAIR_IMPL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/nvpair.h>
+
+/*
+ * The structures here provided for information and debugging purposes only
+ * may be changed in the future.
+ */
+
+/*
+ * implementation linked list for pre-packed data
+ */
+typedef struct i_nvp i_nvp_t;
+
+struct i_nvp {
+ union {
+ uint64_t _nvi_align; /* ensure alignment */
+ struct {
+ i_nvp_t *_nvi_next; /* pointer to next nvpair */
+ i_nvp_t *_nvi_prev; /* pointer to prev nvpair */
+ } _nvi;
+ } _nvi_un;
+ nvpair_t nvi_nvp; /* nvpair */
+};
+#define nvi_next _nvi_un._nvi._nvi_next
+#define nvi_prev _nvi_un._nvi._nvi_prev
+
+typedef struct {
+ i_nvp_t *nvp_list; /* linked list of nvpairs */
+ i_nvp_t *nvp_last; /* last nvpair */
+ i_nvp_t *nvp_curr; /* current walker nvpair */
+ nv_alloc_t *nvp_nva; /* pluggable allocator */
+ uint32_t nvp_stat; /* internal state */
+} nvpriv_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _NVPAIR_IMPL_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/processor.h b/sys/contrib/opensolaris/uts/common/sys/processor.h
new file mode 100644
index 0000000..063f7dacb
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/processor.h
@@ -0,0 +1,146 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T
+ * All Rights Reserved
+ *
+ */
+
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_PROCESSOR_H
+#define _SYS_PROCESSOR_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/procset.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Definitions for p_online, processor_info & lgrp system calls.
+ */
+
+/*
+ * Type for an lgrpid
+ */
+typedef uint16_t lgrpid_t;
+
+/*
+ * Type for processor name (CPU number).
+ */
+typedef int processorid_t;
+typedef int chipid_t;
+
+/*
+ * Flags and return values for p_online(2), and pi_state for processor_info(2).
+ * These flags are *not* for in-kernel examination of CPU states.
+ * See <sys/cpuvar.h> for appropriate informational functions.
+ */
+#define P_OFFLINE 0x0001 /* processor is offline, as quiet as possible */
+#define P_ONLINE 0x0002 /* processor is online */
+#define P_STATUS 0x0003 /* value passed to p_online to request status */
+#define P_FAULTED 0x0004 /* processor is offline, in faulted state */
+#define P_POWEROFF 0x0005 /* processor is powered off */
+#define P_NOINTR 0x0006 /* processor is online, but no I/O interrupts */
+#define P_SPARE 0x0007 /* processor is offline, can be reactivated */
+#define P_BAD P_FAULTED /* unused but defined by USL */
+#define P_FORCED 0x10000000 /* force processor offline */
+
+/*
+ * String names for processor states defined above.
+ */
+#define PS_OFFLINE "off-line"
+#define PS_ONLINE "on-line"
+#define PS_FAULTED "faulted"
+#define PS_POWEROFF "powered-off"
+#define PS_NOINTR "no-intr"
+#define PS_SPARE "spare"
+
+/*
+ * Structure filled in by processor_info(2).
+ *
+ * The string fields are guaranteed to contain a NULL.
+ *
+ * The pi_fputypes field contains a (possibly empty) comma-separated
+ * list of floating point identifier strings.
+ */
+#define PI_TYPELEN 16 /* max size of CPU type string */
+#define PI_FPUTYPE 32 /* max size of FPU types string */
+
+typedef struct {
+ int pi_state; /* processor state, see above */
+ char pi_processor_type[PI_TYPELEN]; /* ASCII CPU type */
+ char pi_fputypes[PI_FPUTYPE]; /* ASCII FPU types */
+ int pi_clock; /* CPU clock freq in MHz */
+} processor_info_t;
+
+/*
+ * Binding values for processor_bind(2)
+ */
+#define PBIND_NONE -1 /* LWP/thread is not bound */
+#define PBIND_QUERY -2 /* don't set, just return the binding */
+
+/*
+ * User-level system call interface prototypes
+ */
+#ifndef _KERNEL
+#ifdef __STDC__
+
+extern int p_online(processorid_t processorid, int flag);
+extern int processor_info(processorid_t processorid,
+ processor_info_t *infop);
+extern int processor_bind(idtype_t idtype, id_t id,
+ processorid_t processorid, processorid_t *obind);
+extern processorid_t getcpuid(void);
+extern lgrpid_t gethomelgroup(void);
+
+#else
+
+extern int p_online();
+extern int processor_info();
+extern int processor_bind();
+extern processorid_t getcpuid();
+extern lgrpid_t gethomelgroup();
+
+#endif /* __STDC__ */
+
+#else /* _KERNEL */
+
+/*
+ * Internal interface prototypes
+ */
+extern int p_online_internal(processorid_t, int, int *);
+
+#endif /* !_KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_PROCESSOR_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/procset.h b/sys/contrib/opensolaris/uts/common/sys/procset.h
new file mode 100644
index 0000000..c3b5867
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/procset.h
@@ -0,0 +1,160 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+#ifndef _SYS_PROCSET_H
+#define _SYS_PROCSET_H
+
+#pragma ident "%Z%%M% %I% %E% SMI" /* SVr4.0 1.6 */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#include <sys/feature_tests.h>
+#include <sys/types.h>
+#include <sys/signal.h>
+
+/*
+ * This file defines the data needed to specify a set of
+ * processes. These types are used by the sigsend, sigsendset,
+ * priocntl, priocntlset, waitid, evexit, and evexitset system
+ * calls.
+ */
+#define P_INITPID 1
+#define P_INITUID 0
+#define P_INITPGID 0
+
+
+/*
+ * The following defines the values for an identifier type. It
+ * specifies the interpretation of an id value. An idtype and
+ * id together define a simple set of processes.
+ */
+typedef enum
+#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
+ idtype /* pollutes XPG4.2 namespace */
+#endif
+ {
+ P_PID, /* A process identifier. */
+ P_PPID, /* A parent process identifier. */
+ P_PGID, /* A process group (job control group) */
+ /* identifier. */
+ P_SID, /* A session identifier. */
+ P_CID, /* A scheduling class identifier. */
+ P_UID, /* A user identifier. */
+ P_GID, /* A group identifier. */
+ P_ALL, /* All processes. */
+ P_LWPID, /* An LWP identifier. */
+ P_TASKID, /* A task identifier. */
+ P_PROJID, /* A project identifier. */
+ P_POOLID, /* A pool identifier. */
+ P_ZONEID, /* A zone identifier. */
+ P_CTID, /* A (process) contract identifier. */
+ P_CPUID, /* CPU identifier. */
+ P_PSETID /* Processor set identifier */
+} idtype_t;
+
+
+/*
+ * The following defines the operations which can be performed to
+ * combine two simple sets of processes to form another set of
+ * processes.
+ */
+#if !defined(_XPG4_2) || defined(__EXTENSIONS__)
+typedef enum idop {
+ POP_DIFF, /* Set difference. The processes which */
+ /* are in the left operand set and not */
+ /* in the right operand set. */
+ POP_AND, /* Set disjunction. The processes */
+ /* which are in both the left and right */
+ /* operand sets. */
+ POP_OR, /* Set conjunction. The processes */
+ /* which are in either the left or the */
+ /* right operand sets (or both). */
+ POP_XOR /* Set exclusive or. The processes */
+ /* which are in either the left or */
+ /* right operand sets but not in both. */
+} idop_t;
+
+
+/*
+ * The following structure is used to define a set of processes.
+ * The set is defined in terms of two simple sets of processes
+ * and an operator which operates on these two operand sets.
+ */
+typedef struct procset {
+ idop_t p_op; /* The operator connection the */
+ /* following two operands each */
+ /* of which is a simple set of */
+ /* processes. */
+
+ idtype_t p_lidtype;
+ /* The type of the left operand */
+ /* simple set. */
+ id_t p_lid; /* The id of the left operand. */
+
+ idtype_t p_ridtype;
+ /* The type of the right */
+ /* operand simple set. */
+ id_t p_rid; /* The id of the right operand. */
+} procset_t;
+
+/*
+ * The following macro can be used to initialize a procset_t
+ * structure.
+ */
+#define setprocset(psp, op, ltype, lid, rtype, rid) \
+ (psp)->p_op = (op); \
+ (psp)->p_lidtype = (ltype); \
+ (psp)->p_lid = (lid); \
+ (psp)->p_ridtype = (rtype); \
+ (psp)->p_rid = (rid);
+
+#endif /* !defined(_XPG4_2) || defined(__EXTENSIONS__) */
+
+#ifdef _KERNEL
+
+struct proc;
+
+extern int dotoprocs(procset_t *, int (*)(), char *);
+extern int dotolwp(procset_t *, int (*)(), char *);
+extern int procinset(struct proc *, procset_t *);
+extern int sigsendproc(struct proc *, sigsend_t *);
+extern int sigsendset(procset_t *, sigsend_t *);
+extern boolean_t cur_inset_only(procset_t *);
+extern id_t getmyid(idtype_t);
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_PROCSET_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/sdt.h b/sys/contrib/opensolaris/uts/common/sys/sdt.h
new file mode 100644
index 0000000..da695c9
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/sdt.h
@@ -0,0 +1,176 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SDT_H
+#define _SYS_SDT_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _KERNEL
+
+#define DTRACE_PROBE(provider, name) { \
+ extern void __dtrace_##provider##___##name(void); \
+ __dtrace_##provider##___##name(); \
+}
+
+#define DTRACE_PROBE1(provider, name, arg1) { \
+ extern void __dtrace_##provider##___##name(unsigned long); \
+ __dtrace_##provider##___##name((unsigned long)arg1); \
+}
+
+#define DTRACE_PROBE2(provider, name, arg1, arg2) { \
+ extern void __dtrace_##provider##___##name(unsigned long, \
+ unsigned long); \
+ __dtrace_##provider##___##name((unsigned long)arg1, \
+ (unsigned long)arg2); \
+}
+
+#define DTRACE_PROBE3(provider, name, arg1, arg2, arg3) { \
+ extern void __dtrace_##provider##___##name(unsigned long, \
+ unsigned long, unsigned long); \
+ __dtrace_##provider##___##name((unsigned long)arg1, \
+ (unsigned long)arg2, (unsigned long)arg3); \
+}
+
+#define DTRACE_PROBE4(provider, name, arg1, arg2, arg3, arg4) { \
+ extern void __dtrace_##provider##___##name(unsigned long, \
+ unsigned long, unsigned long, unsigned long); \
+ __dtrace_##provider##___##name((unsigned long)arg1, \
+ (unsigned long)arg2, (unsigned long)arg3, \
+ (unsigned long)arg4); \
+}
+
+#define DTRACE_PROBE5(provider, name, arg1, arg2, arg3, arg4, arg5) { \
+ extern void __dtrace_##provider##___##name(unsigned long, \
+ unsigned long, unsigned long, unsigned long, unsigned long);\
+ __dtrace_##provider##___##name((unsigned long)arg1, \
+ (unsigned long)arg2, (unsigned long)arg3, \
+ (unsigned long)arg4, (unsigned long)arg5); \
+}
+
+#else /* _KERNEL */
+
+#define DTRACE_PROBE(name) { \
+ extern void __dtrace_probe_##name(void); \
+ __dtrace_probe_##name(); \
+}
+
+#define DTRACE_PROBE1(name, type1, arg1) { \
+ extern void __dtrace_probe_##name(uintptr_t); \
+ __dtrace_probe_##name((uintptr_t)(arg1)); \
+}
+
+#define DTRACE_PROBE2(name, type1, arg1, type2, arg2) { \
+ extern void __dtrace_probe_##name(uintptr_t, uintptr_t); \
+ __dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2)); \
+}
+
+#define DTRACE_PROBE3(name, type1, arg1, type2, arg2, type3, arg3) { \
+ extern void __dtrace_probe_##name(uintptr_t, uintptr_t, uintptr_t); \
+ __dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2), \
+ (uintptr_t)(arg3)); \
+}
+
+#define DTRACE_PROBE4(name, type1, arg1, type2, arg2, \
+ type3, arg3, type4, arg4) { \
+ extern void __dtrace_probe_##name(uintptr_t, uintptr_t, \
+ uintptr_t, uintptr_t); \
+ __dtrace_probe_##name((uintptr_t)(arg1), (uintptr_t)(arg2), \
+ (uintptr_t)(arg3), (uintptr_t)(arg4)); \
+}
+
+#define DTRACE_SCHED(name) \
+ DTRACE_PROBE(__sched_##name);
+
+#define DTRACE_SCHED1(name, type1, arg1) \
+ DTRACE_PROBE1(__sched_##name, type1, arg1);
+
+#define DTRACE_SCHED2(name, type1, arg1, type2, arg2) \
+ DTRACE_PROBE2(__sched_##name, type1, arg1, type2, arg2);
+
+#define DTRACE_SCHED3(name, type1, arg1, type2, arg2, type3, arg3) \
+ DTRACE_PROBE3(__sched_##name, type1, arg1, type2, arg2, type3, arg3);
+
+#define DTRACE_SCHED4(name, type1, arg1, type2, arg2, \
+ type3, arg3, type4, arg4) \
+ DTRACE_PROBE4(__sched_##name, type1, arg1, type2, arg2, \
+ type3, arg3, type4, arg4);
+
+#define DTRACE_PROC(name) \
+ DTRACE_PROBE(__proc_##name);
+
+#define DTRACE_PROC1(name, type1, arg1) \
+ DTRACE_PROBE1(__proc_##name, type1, arg1);
+
+#define DTRACE_PROC2(name, type1, arg1, type2, arg2) \
+ DTRACE_PROBE2(__proc_##name, type1, arg1, type2, arg2);
+
+#define DTRACE_PROC3(name, type1, arg1, type2, arg2, type3, arg3) \
+ DTRACE_PROBE3(__proc_##name, type1, arg1, type2, arg2, type3, arg3);
+
+#define DTRACE_PROC4(name, type1, arg1, type2, arg2, \
+ type3, arg3, type4, arg4) \
+ DTRACE_PROBE4(__proc_##name, type1, arg1, type2, arg2, \
+ type3, arg3, type4, arg4);
+
+#define DTRACE_IO(name) \
+ DTRACE_PROBE(__io_##name);
+
+#define DTRACE_IO1(name, type1, arg1) \
+ DTRACE_PROBE1(__io_##name, type1, arg1);
+
+#define DTRACE_IO2(name, type1, arg1, type2, arg2) \
+ DTRACE_PROBE2(__io_##name, type1, arg1, type2, arg2);
+
+#define DTRACE_IO3(name, type1, arg1, type2, arg2, type3, arg3) \
+ DTRACE_PROBE3(__io_##name, type1, arg1, type2, arg2, type3, arg3);
+
+#define DTRACE_IO4(name, type1, arg1, type2, arg2, \
+ type3, arg3, type4, arg4) \
+ DTRACE_PROBE4(__io_##name, type1, arg1, type2, arg2, \
+ type3, arg3, type4, arg4);
+
+#define DTRACE_SYSEVENT2(name, type1, arg1, type2, arg2) \
+ DTRACE_PROBE2(__sysevent_##name, type1, arg1, type2, arg2);
+
+#endif /* _KERNEL */
+
+extern const char *sdt_prefix;
+
+typedef struct sdt_probedesc {
+ char *sdpd_name; /* name of this probe */
+ unsigned long sdpd_offset; /* offset of call in text */
+ struct sdt_probedesc *sdpd_next; /* next static probe */
+} sdt_probedesc_t;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SDT_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/synch.h b/sys/contrib/opensolaris/uts/common/sys/synch.h
new file mode 100644
index 0000000..8f52d72
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/synch.h
@@ -0,0 +1,161 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2003 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SYNCH_H
+#define _SYS_SYNCH_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifndef _ASM
+#include <sys/types.h>
+#include <sys/int_types.h>
+#endif /* _ASM */
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef _ASM
+/*
+ * Thread and LWP mutexes have the same type
+ * definitions.
+ *
+ * NOTE:
+ *
+ * POSIX requires that <pthread.h> define the structures pthread_mutex_t
+ * and pthread_cond_t. Although these structures are identical to mutex_t
+ * (lwp_mutex_t) and cond_t (lwp_cond_t), defined here, a typedef of these
+ * types would require including <synch.h> in <pthread.h>, pulling in
+ * non-posix symbols/constants, violating POSIX namespace restrictions. Hence,
+ * pthread_mutex_t/pthread_cond_t have been redefined (in <sys/types.h>).
+ * Any modifications done to mutex_t/lwp_mutex_t or cond_t/lwp_cond_t must
+ * also be done to pthread_mutex_t/pthread_cond_t.
+ */
+typedef struct _lwp_mutex {
+ struct {
+ uint16_t flag1;
+ uint8_t flag2;
+ uint8_t ceiling;
+ union {
+ uint16_t bcptype;
+ struct {
+ uint8_t count_type1;
+ uint8_t count_type2;
+ } mtype_rcount;
+ } mbcp_type_un;
+ uint16_t magic;
+ } flags;
+ union {
+ struct {
+ uint8_t pad[8];
+ } lock64;
+ struct {
+ uint32_t ownerpid;
+ uint32_t lockword;
+ } lock32;
+ upad64_t owner64;
+ } lock;
+ upad64_t data;
+} lwp_mutex_t;
+
+/*
+ * Thread and LWP condition variables have the same
+ * type definition.
+ * NOTE:
+ * The layout of the following structure should be kept in sync with the
+ * layout of pthread_cond_t in sys/types.h. See NOTE above for lwp_mutex_t.
+ */
+typedef struct _lwp_cond {
+ struct {
+ uint8_t flag[4];
+ uint16_t type;
+ uint16_t magic;
+ } flags;
+ upad64_t data;
+} lwp_cond_t;
+
+/*
+ * LWP semaphores
+ */
+typedef struct _lwp_sema {
+ uint32_t count; /* semaphore count */
+ uint16_t type;
+ uint16_t magic;
+ uint8_t flags[8]; /* last byte reserved for waiters */
+ upad64_t data; /* optional data */
+} lwp_sema_t;
+
+/*
+ * Thread and LWP rwlocks have the same type definition.
+ * NOTE: The layout of this structure should be kept in sync with the layout
+ * of the correponding structure of pthread_rwlock_t in sys/types.h.
+ * Also, because we have to deal with C++, there is an identical structure
+ * for rwlock_t in head/sync.h that we cannot change.
+ */
+typedef struct _lwp_rwlock {
+ int32_t readers; /* -1 == writer else # of readers */
+ uint16_t type;
+ uint16_t magic;
+ lwp_mutex_t mutex; /* used to indicate ownership */
+ lwp_cond_t readercv; /* unused */
+ lwp_cond_t writercv; /* unused */
+} lwp_rwlock_t;
+
+#endif /* _ASM */
+/*
+ * Definitions of synchronization types.
+ */
+#define USYNC_THREAD 0x00 /* private to a process */
+#define USYNC_PROCESS 0x01 /* shared by processes */
+
+/* Keep the following 3 fields in sync with pthread.h */
+#define LOCK_NORMAL 0x00 /* same as USYNC_THREAD */
+#define LOCK_ERRORCHECK 0x02 /* error check lock */
+#define LOCK_RECURSIVE 0x04 /* recursive lock */
+
+#define USYNC_PROCESS_ROBUST 0x08 /* shared by processes robustly */
+
+/* Keep the following 5 fields in sync with pthread.h */
+
+#define LOCK_PRIO_NONE 0x00
+#define LOCK_PRIO_INHERIT 0x10
+#define LOCK_PRIO_PROTECT 0x20
+#define LOCK_STALL_NP 0x00
+#define LOCK_ROBUST_NP 0x40
+
+/*
+ * lwp_mutex_t flags
+ */
+#define LOCK_OWNERDEAD 0x1
+#define LOCK_NOTRECOVERABLE 0x2
+#define LOCK_INITED 0x4
+#define LOCK_UNMAPPED 0x8
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SYNCH_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/sysevent.h b/sys/contrib/opensolaris/uts/common/sys/sysevent.h
new file mode 100644
index 0000000..0a61e41
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/sysevent.h
@@ -0,0 +1,227 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SYSEVENT_H
+#define _SYS_SYSEVENT_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/nvpair.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef NULL
+#if defined(_LP64) && !defined(__cplusplus)
+#define NULL 0L
+#else
+#define NULL 0
+#endif
+#endif
+
+/* Internal registration class and subclass */
+#define EC_ALL "register_all_classes"
+#define EC_SUB_ALL "register_all_subclasses"
+
+/*
+ * Event allocation/enqueuing sleep/nosleep flags
+ */
+#define SE_SLEEP 0
+#define SE_NOSLEEP 1
+
+/* Framework error codes */
+#define SE_EINVAL 1 /* Invalid argument */
+#define SE_ENOMEM 2 /* Unable to allocate memory */
+#define SE_EQSIZE 3 /* Maximum event q size exceeded */
+#define SE_EFAULT 4 /* Copy fault */
+#define SE_NOTFOUND 5 /* Attribute not found */
+#define SE_NO_TRANSPORT 6 /* sysevent transport down */
+
+/* Internal data types */
+
+#define SE_DATA_TYPE_BYTE DATA_TYPE_BYTE
+#define SE_DATA_TYPE_INT16 DATA_TYPE_INT16
+#define SE_DATA_TYPE_UINT16 DATA_TYPE_UINT16
+#define SE_DATA_TYPE_INT32 DATA_TYPE_INT32
+#define SE_DATA_TYPE_UINT32 DATA_TYPE_UINT32
+#define SE_DATA_TYPE_INT64 DATA_TYPE_INT64
+#define SE_DATA_TYPE_UINT64 DATA_TYPE_UINT64
+#define SE_DATA_TYPE_STRING DATA_TYPE_STRING
+#define SE_DATA_TYPE_BYTES DATA_TYPE_BYTE_ARRAY
+#define SE_DATA_TYPE_TIME DATA_TYPE_HRTIME
+
+#define SE_KERN_PID 0
+
+#define SUNW_VENDOR "SUNW"
+#define SE_USR_PUB "usr:"
+#define SE_KERN_PUB "kern:"
+#define SUNW_KERN_PUB SUNW_VENDOR":"SE_KERN_PUB
+#define SUNW_USR_PUB SUNW_VENDOR":"SE_USR_PUB
+
+/*
+ * Event header and attribute value limits
+ */
+#define MAX_ATTR_NAME 1024
+#define MAX_STRING_SZ 1024
+#define MAX_BYTE_ARRAY 1024
+
+#define MAX_CLASS_LEN 64
+#define MAX_SUBCLASS_LEN 64
+#define MAX_PUB_LEN 128
+#define MAX_CHNAME_LEN 128
+#define MAX_SUBID_LEN 16
+
+/*
+ * Limit for the event payload size
+ */
+#define MAX_EV_SIZE_LEN (SHRT_MAX/4)
+
+/* Opaque sysevent_t data type */
+typedef void *sysevent_t;
+
+/* Opaque channel bind data type */
+typedef void evchan_t;
+
+/* sysevent attribute list */
+typedef nvlist_t sysevent_attr_list_t;
+
+/* sysevent attribute name-value pair */
+typedef nvpair_t sysevent_attr_t;
+
+/* Unique event identifier */
+typedef struct sysevent_id {
+ uint64_t eid_seq;
+ hrtime_t eid_ts;
+} sysevent_id_t;
+
+/* Event attribute value structures */
+typedef struct sysevent_bytes {
+ int32_t size;
+ uchar_t *data;
+} sysevent_bytes_t;
+
+typedef struct sysevent_value {
+ int32_t value_type; /* data type */
+ union {
+ uchar_t sv_byte;
+ int16_t sv_int16;
+ uint16_t sv_uint16;
+ int32_t sv_int32;
+ uint32_t sv_uint32;
+ int64_t sv_int64;
+ uint64_t sv_uint64;
+ hrtime_t sv_time;
+ char *sv_string;
+ sysevent_bytes_t sv_bytes;
+ } value;
+} sysevent_value_t;
+
+/*
+ * The following flags determine the memory allocation semantics to use for
+ * kernel event buffer allocation by userland and kernel versions of
+ * sysevent_evc_publish().
+ *
+ * EVCH_SLEEP and EVCH_NOSLEEP respectively map to KM_SLEEP and KM_NOSLEEP.
+ * EVCH_TRYHARD is a kernel-only publish flag that allow event allocation
+ * routines to use use alternate kmem caches in situations where free memory
+ * may be low. Kernel callers of sysevent_evc_publish() must set flags to
+ * one of EVCH_SLEEP, EVCH_NOSLEEP or EVCH_TRYHARD. Userland callers of
+ * sysevent_evc_publish() must set flags to one of EVCH_SLEEP or EVCH_NOSLEEP.
+ *
+ * EVCH_QWAIT determines whether or not we should wait for slots in the event
+ * queue at publication time. EVCH_QWAIT may be used by kernel and userland
+ * publishers and must be used in conjunction with any of one of EVCH_SLEEP,
+ * EVCH_NOSLEEP or EVCH_TRYHARD (kernel-only).
+ */
+
+#define EVCH_NOSLEEP 0x0001 /* No sleep on kmem_alloc() */
+#define EVCH_SLEEP 0x0002 /* Sleep on kmem_alloc() */
+#define EVCH_TRYHARD 0x0004 /* May use alternate kmem cache for alloc */
+#define EVCH_QWAIT 0x0008 /* Wait for slot in event queue */
+
+/*
+ * Meaning of flags for subscribe/unsubscribe. Bits 0 to 7 are dedicated to
+ * the consolidation private interface.
+ */
+#define EVCH_SUB_KEEP 0x0001
+#define EVCH_ALLSUB "all_subs"
+
+/*
+ * Meaning of flags parameter of channel bind function
+ */
+#define EVCH_CREAT 0x0001 /* Create a channel if not present */
+#define EVCH_HOLD_PEND 0x0002
+#define EVCH_B_FLAGS 0x0003 /* All valid bits */
+
+/*
+ * Meaning of commands of evc_control function
+ */
+#define EVCH_GET_CHAN_LEN_MAX 1 /* Get event queue length limit */
+#define EVCH_GET_CHAN_LEN 2 /* Get event queue length */
+#define EVCH_SET_CHAN_LEN 3 /* Set event queue length */
+#define EVCH_CMD_LAST EVCH_SET_CHAN_LEN /* Last command */
+
+/*
+ * Event channel interface definitions
+ */
+int sysevent_evc_bind(const char *, evchan_t **, uint32_t);
+void sysevent_evc_unbind(evchan_t *);
+int sysevent_evc_subscribe(evchan_t *, const char *, const char *,
+ int (*)(sysevent_t *, void *), void *, uint32_t);
+void sysevent_evc_unsubscribe(evchan_t *, const char *);
+int sysevent_evc_publish(evchan_t *, const char *, const char *,
+ const char *, const char *, nvlist_t *, uint32_t);
+int sysevent_evc_control(evchan_t *, int, ...);
+
+#ifdef _KERNEL
+
+/*
+ * Kernel log_event interfaces.
+ */
+int log_sysevent(sysevent_t *, int, sysevent_id_t *);
+
+sysevent_t *sysevent_alloc(char *, char *, char *, int);
+void sysevent_free(sysevent_t *);
+int sysevent_add_attr(sysevent_attr_list_t **, char *, sysevent_value_t *, int);
+void sysevent_free_attr(sysevent_attr_list_t *);
+int sysevent_attach_attributes(sysevent_t *, sysevent_attr_list_t *);
+void sysevent_detach_attributes(sysevent_t *);
+char *sysevent_get_class_name(sysevent_t *);
+char *sysevent_get_subclass_name(sysevent_t *);
+uint64_t sysevent_get_seq(sysevent_t *);
+void sysevent_get_time(sysevent_t *, hrtime_t *);
+size_t sysevent_get_size(sysevent_t *);
+char *sysevent_get_pub(sysevent_t *);
+int sysevent_get_attr_list(sysevent_t *, nvlist_t **);
+
+#endif /* _KERNEL */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SYSEVENT_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/sysmacros.h b/sys/contrib/opensolaris/uts/common/sys/sysmacros.h
new file mode 100644
index 0000000..d772084
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/sysmacros.h
@@ -0,0 +1,287 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/* Copyright (c) 1984, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+
+/*
+ * Copyright 2004 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_SYSMACROS_H
+#define _SYS_SYSMACROS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/param.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Some macros for units conversion
+ */
+/*
+ * Disk blocks (sectors) and bytes.
+ */
+#define dtob(DD) ((DD) << DEV_BSHIFT)
+#define btod(BB) (((BB) + DEV_BSIZE - 1) >> DEV_BSHIFT)
+#define btodt(BB) ((BB) >> DEV_BSHIFT)
+#define lbtod(BB) (((offset_t)(BB) + DEV_BSIZE - 1) >> DEV_BSHIFT)
+
+/* common macros */
+#ifndef MIN
+#define MIN(a, b) ((a) < (b) ? (a) : (b))
+#endif
+#ifndef MAX
+#define MAX(a, b) ((a) < (b) ? (b) : (a))
+#endif
+#ifndef ABS
+#define ABS(a) ((a) < 0 ? -(a) : (a))
+#endif
+
+#ifdef _KERNEL
+
+/*
+ * Convert a single byte to/from binary-coded decimal (BCD).
+ */
+extern unsigned char byte_to_bcd[256];
+extern unsigned char bcd_to_byte[256];
+
+#define BYTE_TO_BCD(x) byte_to_bcd[(x) & 0xff]
+#define BCD_TO_BYTE(x) bcd_to_byte[(x) & 0xff]
+
+#endif /* _KERNEL */
+
+/*
+ * WARNING: The device number macros defined here should not be used by device
+ * drivers or user software. Device drivers should use the device functions
+ * defined in the DDI/DKI interface (see also ddi.h). Application software
+ * should make use of the library routines available in makedev(3). A set of
+ * new device macros are provided to operate on the expanded device number
+ * format supported in SVR4. Macro versions of the DDI device functions are
+ * provided for use by kernel proper routines only. Macro routines bmajor(),
+ * major(), minor(), emajor(), eminor(), and makedev() will be removed or
+ * their definitions changed at the next major release following SVR4.
+ */
+
+#define O_BITSMAJOR 7 /* # of SVR3 major device bits */
+#define O_BITSMINOR 8 /* # of SVR3 minor device bits */
+#define O_MAXMAJ 0x7f /* SVR3 max major value */
+#define O_MAXMIN 0xff /* SVR3 max minor value */
+
+
+#define L_BITSMAJOR32 14 /* # of SVR4 major device bits */
+#define L_BITSMINOR32 18 /* # of SVR4 minor device bits */
+#define L_MAXMAJ32 0x3fff /* SVR4 max major value */
+#define L_MAXMIN32 0x3ffff /* MAX minor for 3b2 software drivers. */
+ /* For 3b2 hardware devices the minor is */
+ /* restricted to 256 (0-255) */
+
+#ifdef _LP64
+#define L_BITSMAJOR 32 /* # of major device bits in 64-bit Solaris */
+#define L_BITSMINOR 32 /* # of minor device bits in 64-bit Solaris */
+#define L_MAXMAJ 0xfffffffful /* max major value */
+#define L_MAXMIN 0xfffffffful /* max minor value */
+#else
+#define L_BITSMAJOR L_BITSMAJOR32
+#define L_BITSMINOR L_BITSMINOR32
+#define L_MAXMAJ L_MAXMAJ32
+#define L_MAXMIN L_MAXMIN32
+#endif
+
+#ifdef _KERNEL
+
+/* major part of a device internal to the kernel */
+
+#define major(x) (major_t)((((unsigned)(x)) >> O_BITSMINOR) & O_MAXMAJ)
+#define bmajor(x) (major_t)((((unsigned)(x)) >> O_BITSMINOR) & O_MAXMAJ)
+
+/* get internal major part of expanded device number */
+
+#define getmajor(x) (major_t)((((dev_t)(x)) >> L_BITSMINOR) & L_MAXMAJ)
+
+/* minor part of a device internal to the kernel */
+
+#define minor(x) (minor_t)((x) & O_MAXMIN)
+
+/* get internal minor part of expanded device number */
+
+#define getminor(x) (minor_t)((x) & L_MAXMIN)
+
+#else
+
+/* major part of a device external from the kernel (same as emajor below) */
+
+#define major(x) (major_t)((((unsigned)(x)) >> O_BITSMINOR) & O_MAXMAJ)
+
+/* minor part of a device external from the kernel (same as eminor below) */
+
+#define minor(x) (minor_t)((x) & O_MAXMIN)
+
+#endif /* _KERNEL */
+
+/* create old device number */
+
+#define makedev(x, y) (unsigned short)(((x) << O_BITSMINOR) | ((y) & O_MAXMIN))
+
+/* make an new device number */
+
+#define makedevice(x, y) (dev_t)(((dev_t)(x) << L_BITSMINOR) | ((y) & L_MAXMIN))
+
+
+/*
+ * emajor() allows kernel/driver code to print external major numbers
+ * eminor() allows kernel/driver code to print external minor numbers
+ */
+
+#define emajor(x) \
+ (major_t)(((unsigned int)(x) >> O_BITSMINOR) > O_MAXMAJ) ? \
+ NODEV : (((unsigned int)(x) >> O_BITSMINOR) & O_MAXMAJ)
+
+#define eminor(x) \
+ (minor_t)((x) & O_MAXMIN)
+
+/*
+ * get external major and minor device
+ * components from expanded device number
+ */
+#define getemajor(x) (major_t)((((dev_t)(x) >> L_BITSMINOR) > L_MAXMAJ) ? \
+ NODEV : (((dev_t)(x) >> L_BITSMINOR) & L_MAXMAJ))
+#define geteminor(x) (minor_t)((x) & L_MAXMIN)
+
+/*
+ * These are versions of the kernel routines for compressing and
+ * expanding long device numbers that don't return errors.
+ */
+#if (L_BITSMAJOR32 == L_BITSMAJOR) && (L_BITSMINOR32 == L_BITSMINOR)
+
+#define DEVCMPL(x) (x)
+#define DEVEXPL(x) (x)
+
+#else
+
+#define DEVCMPL(x) \
+ (dev32_t)((((x) >> L_BITSMINOR) > L_MAXMAJ32 || \
+ ((x) & L_MAXMIN) > L_MAXMIN32) ? NODEV32 : \
+ ((((x) >> L_BITSMINOR) << L_BITSMINOR32) | ((x) & L_MAXMIN32)))
+
+#define DEVEXPL(x) \
+ (((x) == NODEV32) ? NODEV : \
+ makedevice(((x) >> L_BITSMINOR32) & L_MAXMAJ32, (x) & L_MAXMIN32))
+
+#endif /* L_BITSMAJOR32 ... */
+
+/* convert to old (SVR3.2) dev format */
+
+#define cmpdev(x) \
+ (o_dev_t)((((x) >> L_BITSMINOR) > O_MAXMAJ || \
+ ((x) & L_MAXMIN) > O_MAXMIN) ? NODEV : \
+ ((((x) >> L_BITSMINOR) << O_BITSMINOR) | ((x) & O_MAXMIN)))
+
+/* convert to new (SVR4) dev format */
+
+#define expdev(x) \
+ (dev_t)(((dev_t)(((x) >> O_BITSMINOR) & O_MAXMAJ) << L_BITSMINOR) | \
+ ((x) & O_MAXMIN))
+
+/*
+ * Macro for checking power of 2 address alignment.
+ */
+#define IS_P2ALIGNED(v, a) ((((uintptr_t)(v)) & ((uintptr_t)(a) - 1)) == 0)
+
+/*
+ * Macros for counting and rounding.
+ */
+#define howmany(x, y) (((x)+((y)-1))/(y))
+#define roundup(x, y) ((((x)+((y)-1))/(y))*(y))
+
+/*
+ * Macro to determine if value is a power of 2
+ */
+#define ISP2(x) (((x) & ((x) - 1)) == 0)
+
+/*
+ * Macros for various sorts of alignment and rounding when the alignment
+ * is known to be a power of 2.
+ */
+#define P2ALIGN(x, align) ((x) & -(align))
+#define P2PHASE(x, align) ((x) & ((align) - 1))
+#define P2NPHASE(x, align) (-(x) & ((align) - 1))
+#define P2ROUNDUP(x, align) (-(-(x) & -(align)))
+#define P2END(x, align) (-(~(x) & -(align)))
+#define P2PHASEUP(x, align, phase) ((phase) - (((phase) - (x)) & -(align)))
+#define P2CROSS(x, y, align) (((x) ^ (y)) > (align) - 1)
+/*
+ * Determine whether two numbers have the same high-order bit.
+ */
+#define P2SAMEHIGHBIT(x, y) (((x) ^ (y)) < ((x) & (y)))
+
+/*
+ * Typed version of the P2* macros. These macros should be used to ensure
+ * that the result is correctly calculated based on the data type of (x),
+ * which is passed in as the last argument, regardless of the data
+ * type of the alignment. For example, if (x) is of type uint64_t,
+ * and we want to round it up to a page boundary using "PAGESIZE" as
+ * the alignment, we can do either
+ * P2ROUNDUP(x, (uint64_t)PAGESIZE)
+ * or
+ * P2ROUNDUP_TYPED(x, PAGESIZE, uint64_t)
+ */
+#define P2ALIGN_TYPED(x, align, type) \
+ ((type)(x) & -(type)(align))
+#define P2PHASE_TYPED(x, align, type) \
+ ((type)(x) & ((type)(align) - 1))
+#define P2NPHASE_TYPED(x, align, type) \
+ (-(type)(x) & ((type)(align) - 1))
+#define P2ROUNDUP_TYPED(x, align, type) \
+ (-(-(type)(x) & -(type)(align)))
+#define P2END_TYPED(x, align, type) \
+ (-(~(type)(x) & -(type)(align)))
+#define P2PHASEUP_TYPED(x, align, phase, type) \
+ ((type)(phase) - (((type)(phase) - (type)(x)) & -(type)(align)))
+#define P2CROSS_TYPED(x, y, align, type) \
+ (((type)(x) ^ (type)(y)) > (type)(align) - 1)
+#define P2SAMEHIGHBIT_TYPED(x, y, type) \
+ (((type)(x) ^ (type)(y)) < ((type)(x) & (type)(y)))
+
+/*
+ * Macros to atomically increment/decrement a variable. mutex and var
+ * must be pointers.
+ */
+#define INCR_COUNT(var, mutex) mutex_enter(mutex), (*(var))++, mutex_exit(mutex)
+#define DECR_COUNT(var, mutex) mutex_enter(mutex), (*(var))--, mutex_exit(mutex)
+
+#if defined(_KERNEL) && !defined(_KMEMUSER) && !defined(offsetof)
+
+/* avoid any possibility of clashing with <stddef.h> version */
+
+#define offsetof(s, m) ((size_t)(&(((s *)0)->m)))
+#endif
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_SYSMACROS_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/vfs.h b/sys/contrib/opensolaris/uts/common/sys/vfs.h
new file mode 100644
index 0000000..0834cf1
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/vfs.h
@@ -0,0 +1,569 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* Copyright (c) 1983, 1984, 1985, 1986, 1987, 1988, 1989 AT&T */
+/* All Rights Reserved */
+
+/*
+ * Portions of this source code were derived from Berkeley 4.3 BSD
+ * under license from the Regents of the University of California.
+ */
+
+#ifndef _SYS_VFS_H
+#define _SYS_VFS_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/t_lock.h>
+#include <sys/cred.h>
+#include <sys/vnode.h>
+#include <sys/statvfs.h>
+#include <sys/refstr.h>
+#include <sys/avl.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * Data associated with mounted file systems.
+ */
+
+/*
+ * Operations vector. This is used internal to the kernel; file systems
+ * supply their list of operations via vfs_setfsops().
+ */
+
+typedef struct vfsops vfsops_t;
+
+/*
+ * File system identifier. Should be unique (at least per machine).
+ */
+typedef struct {
+ int val[2]; /* file system id type */
+} fsid_t;
+
+/*
+ * File identifier. Should be unique per filesystem on a single
+ * machine. This is typically called by a stateless file server
+ * in order to generate "file handles".
+ *
+ * Do not change the definition of struct fid ... fid_t without
+ * letting the CacheFS group know about it! They will have to do at
+ * least two things, in the same change that changes this structure:
+ * 1. change CFSVERSION in usr/src/uts/common/sys/fs/cachefs_fs.h
+ * 2. put the old version # in the canupgrade array
+ * in cachfs_upgrade() in usr/src/cmd/fs.d/cachefs/fsck/fsck.c
+ * This is necessary because CacheFS stores FIDs on disk.
+ *
+ * Many underlying file systems cast a struct fid into other
+ * file system dependent structures which may require 4 byte alignment.
+ * Because a fid starts with a short it may not be 4 byte aligned, the
+ * fid_pad will force the alignment.
+ */
+#define MAXFIDSZ 64
+#define OLD_MAXFIDSZ 16
+
+typedef struct fid {
+ union {
+ long fid_pad;
+ struct {
+ ushort_t len; /* length of data in bytes */
+ char data[MAXFIDSZ]; /* data (variable len) */
+ } _fid;
+ } un;
+} fid_t;
+
+#ifdef _SYSCALL32
+/*
+ * Solaris 64 - use old-style cache format with 32-bit aligned fid for on-disk
+ * struct compatibility.
+ */
+typedef struct fid32 {
+ union {
+ int32_t fid_pad;
+ struct {
+ uint16_t len; /* length of data in bytes */
+ char data[MAXFIDSZ]; /* data (variable len) */
+ } _fid;
+ } un;
+} fid32_t;
+#else /* not _SYSCALL32 */
+#define fid32 fid
+typedef fid_t fid32_t;
+#endif /* _SYSCALL32 */
+
+#define fid_len un._fid.len
+#define fid_data un._fid.data
+
+/*
+ * Structure defining a mount option for a filesystem.
+ * option names are found in mntent.h
+ */
+typedef struct mntopt {
+ char *mo_name; /* option name */
+ char **mo_cancel; /* list of options cancelled by this one */
+ char *mo_arg; /* argument string for this option */
+ int mo_flags; /* flags for this mount option */
+ void *mo_data; /* filesystem specific data */
+} mntopt_t;
+
+/*
+ * Flags that apply to mount options
+ */
+
+#define MO_SET 0x01 /* option is set */
+#define MO_NODISPLAY 0x02 /* option not listed in mnttab */
+#define MO_HASVALUE 0x04 /* option takes a value */
+#define MO_IGNORE 0x08 /* option ignored by parser */
+#define MO_DEFAULT MO_SET /* option is on by default */
+#define MO_TAG 0x10 /* flags a tag set by user program */
+#define MO_EMPTY 0x20 /* empty space in option table */
+
+#define VFS_NOFORCEOPT 0x01 /* honor MO_IGNORE (don't set option) */
+#define VFS_DISPLAY 0x02 /* Turn off MO_NODISPLAY bit for opt */
+#define VFS_NODISPLAY 0x04 /* Turn on MO_NODISPLAY bit for opt */
+#define VFS_CREATEOPT 0x08 /* Create the opt if it's not there */
+
+/*
+ * Structure holding mount option strings for the mounted file system.
+ */
+typedef struct mntopts {
+ uint_t mo_count; /* number of entries in table */
+ mntopt_t *mo_list; /* list of mount options */
+} mntopts_t;
+
+/*
+ * The kstat structures associated with the vopstats are kept in an
+ * AVL tree. This is to avoid the case where a file system does not
+ * use a unique fsid_t for each vfs (e.g., namefs). In order to do
+ * this, we need a structure that the AVL tree can use that also
+ * references the kstat.
+ * Note that the vks_fsid is generated from the value reported by
+ * VFS_STATVFS().
+ */
+typedef struct vskstat_anchor {
+ avl_node_t vsk_node; /* Required for use by AVL routines */
+ kstat_t *vsk_ksp; /* kstat structure for vopstats */
+ ulong_t vsk_fsid; /* fsid associated w/this FS */
+} vsk_anchor_t;
+
+extern avl_tree_t vskstat_tree;
+extern kmutex_t vskstat_tree_lock;
+
+/*
+ * Structure per mounted file system. Each mounted file system has
+ * an array of operations and an instance record.
+ *
+ * The file systems are kept on a doubly linked circular list headed by
+ * "rootvfs".
+ * File system implementations should not access this list;
+ * it's intended for use only in the kernel's vfs layer.
+ *
+ * Each zone also has its own list of mounts, containing filesystems mounted
+ * somewhere within the filesystem tree rooted at the zone's rootpath. The
+ * list is doubly linked to match the global list.
+ *
+ * mnttab locking: the in-kernel mnttab uses the vfs_mntpt, vfs_resource and
+ * vfs_mntopts fields in the vfs_t. mntpt and resource are refstr_ts that
+ * are set at mount time and can only be modified during a remount.
+ * It is safe to read these fields if you can prevent a remount on the vfs,
+ * or through the convenience funcs vfs_getmntpoint() and vfs_getresource().
+ * The mntopts field may only be accessed through the provided convenience
+ * functions, as it is protected by the vfs list lock. Modifying a mount
+ * option requires grabbing the vfs list write lock, which can be a very
+ * high latency lock.
+ */
+struct zone; /* from zone.h */
+struct fem_head; /* from fem.h */
+
+/*
+ * Private vfs data, NOT to be used by a file system implementation.
+ */
+typedef struct vfs_impl {
+ struct fem_head *vi_femhead; /* fs monitoring */
+ /*
+ * Support for statistics on the vnode operations
+ */
+ vsk_anchor_t *vi_vskap; /* anchor for vopstats' kstat */
+ vopstats_t *vi_fstypevsp; /* ptr to per-fstype vopstats */
+ vopstats_t vi_vopstats; /* per-mount vnode op stats */
+} vfs_impl_t;
+
+typedef struct vfs {
+ struct vfs *vfs_next; /* next VFS in VFS list */
+ struct vfs *vfs_prev; /* prev VFS in VFS list */
+
+/* vfs_op should not be used directly. Accessor functions are provided */
+ vfsops_t *vfs_op; /* operations on VFS */
+
+ struct vnode *vfs_vnodecovered; /* vnode mounted on */
+ uint_t vfs_flag; /* flags */
+ uint_t vfs_bsize; /* native block size */
+ int vfs_fstype; /* file system type index */
+ fsid_t vfs_fsid; /* file system id */
+ void *vfs_data; /* private data */
+ dev_t vfs_dev; /* device of mounted VFS */
+ ulong_t vfs_bcount; /* I/O count (accounting) */
+ struct vfs *vfs_list; /* sync list pointer */
+ struct vfs *vfs_hash; /* hash list pointer */
+ ksema_t vfs_reflock; /* mount/unmount/sync lock */
+ uint_t vfs_count; /* vfs reference count */
+ mntopts_t vfs_mntopts; /* options mounted with */
+ refstr_t *vfs_resource; /* mounted resource name */
+ refstr_t *vfs_mntpt; /* mount point name */
+ time_t vfs_mtime; /* time we were mounted */
+ vfs_impl_t *vfs_implp; /* impl specific data */
+ /*
+ * Zones support. Note that the zone that "owns" the mount isn't
+ * necessarily the same as the zone in which the zone is visible.
+ * That is, vfs_zone and (vfs_zone_next|vfs_zone_prev) may refer to
+ * different zones.
+ */
+ struct zone *vfs_zone; /* zone that owns the mount */
+ struct vfs *vfs_zone_next; /* next VFS visible in zone */
+ struct vfs *vfs_zone_prev; /* prev VFS visible in zone */
+} vfs_t;
+
+#define vfs_femhead vfs_implp->vi_femhead
+#define vfs_vskap vfs_implp->vi_vskap
+#define vfs_fstypevsp vfs_implp->vi_fstypevsp
+#define vfs_vopstats vfs_implp->vi_vopstats
+
+/*
+ * VFS flags.
+ */
+#define VFS_RDONLY 0x01 /* read-only vfs */
+#define VFS_NOMNTTAB 0x02 /* vfs not seen in mnttab */
+#define VFS_NOSETUID 0x08 /* setuid disallowed */
+#define VFS_REMOUNT 0x10 /* modify mount options only */
+#define VFS_NOTRUNC 0x20 /* does not truncate long file names */
+#define VFS_UNLINKABLE 0x40 /* unlink(2) can be applied to root */
+#define VFS_PXFS 0x80 /* clustering: global fs proxy vfs */
+#define VFS_UNMOUNTED 0x100 /* file system has been unmounted */
+#define VFS_NBMAND 0x200 /* allow non-blocking mandatory locks */
+#define VFS_XATTR 0x400 /* fs supports extended attributes */
+#define VFS_NODEVICES 0x800 /* device-special files disallowed */
+#define VFS_NOEXEC 0x1000 /* executables disallowed */
+#define VFS_STATS 0x2000 /* file system can collect stats */
+
+#define VFS_NORESOURCE "unspecified_resource"
+#define VFS_NOMNTPT "unspecified_mountpoint"
+
+/*
+ * Argument structure for mount(2).
+ *
+ * Flags are defined in <sys/mount.h>.
+ *
+ * Note that if the MS_SYSSPACE bit is set in flags, the pointer fields in
+ * this structure are to be interpreted as kernel addresses. File systems
+ * should be prepared for this possibility.
+ */
+struct mounta {
+ char *spec;
+ char *dir;
+ int flags;
+ char *fstype;
+ char *dataptr;
+ int datalen;
+ char *optptr;
+ int optlen;
+};
+
+/*
+ * Reasons for calling the vfs_mountroot() operation.
+ */
+enum whymountroot { ROOT_INIT, ROOT_REMOUNT, ROOT_UNMOUNT};
+typedef enum whymountroot whymountroot_t;
+
+/*
+ * Reasons for calling the VFS_VNSTATE():
+ */
+enum vntrans {
+ VNTRANS_EXISTS,
+ VNTRANS_IDLED,
+ VNTRANS_RECLAIMED,
+ VNTRANS_DESTROYED
+};
+typedef enum vntrans vntrans_t;
+
+/*
+ * VFS_OPS defines all the vfs operations. It is used to define
+ * the vfsops structure (below) and the fs_func_p union (vfs_opreg.h).
+ */
+#define VFS_OPS \
+ int (*vfs_mount)(vfs_t *, vnode_t *, struct mounta *, cred_t *); \
+ int (*vfs_unmount)(vfs_t *, int, cred_t *); \
+ int (*vfs_root)(vfs_t *, vnode_t **); \
+ int (*vfs_statvfs)(vfs_t *, statvfs64_t *); \
+ int (*vfs_sync)(vfs_t *, short, cred_t *); \
+ int (*vfs_vget)(vfs_t *, vnode_t **, fid_t *); \
+ int (*vfs_mountroot)(vfs_t *, enum whymountroot); \
+ void (*vfs_freevfs)(vfs_t *); \
+ int (*vfs_vnstate)(vfs_t *, vnode_t *, vntrans_t) /* NB: No ";" */
+
+/*
+ * Operations supported on virtual file system.
+ */
+struct vfsops {
+ VFS_OPS; /* Signature of all vfs operations (vfsops) */
+};
+
+extern int fsop_mount(vfs_t *, vnode_t *, struct mounta *, cred_t *);
+extern int fsop_unmount(vfs_t *, int, cred_t *);
+extern int fsop_root(vfs_t *, vnode_t **);
+extern int fsop_statfs(vfs_t *, statvfs64_t *);
+extern int fsop_sync(vfs_t *, short, cred_t *);
+extern int fsop_vget(vfs_t *, vnode_t **, fid_t *);
+extern int fsop_mountroot(vfs_t *, enum whymountroot);
+extern void fsop_freefs(vfs_t *);
+extern int fsop_sync_by_kind(int, short, cred_t *);
+extern int fsop_vnstate(vfs_t *, vnode_t *, vntrans_t);
+
+#define VFS_MOUNT(vfsp, mvp, uap, cr) fsop_mount(vfsp, mvp, uap, cr)
+#define VFS_UNMOUNT(vfsp, flag, cr) fsop_unmount(vfsp, flag, cr)
+#define VFS_ROOT(vfsp, vpp) fsop_root(vfsp, vpp)
+#define VFS_STATVFS(vfsp, sp) fsop_statfs(vfsp, sp)
+#define VFS_SYNC(vfsp, flag, cr) fsop_sync(vfsp, flag, cr)
+#define VFS_VGET(vfsp, vpp, fidp) fsop_vget(vfsp, vpp, fidp)
+#define VFS_MOUNTROOT(vfsp, init) fsop_mountroot(vfsp, init)
+#define VFS_FREEVFS(vfsp) fsop_freefs(vfsp)
+#define VFS_VNSTATE(vfsp, vn, ns) fsop_vnstate(vfsp, vn, ns)
+
+#define VFSNAME_MOUNT "mount"
+#define VFSNAME_UNMOUNT "unmount"
+#define VFSNAME_ROOT "root"
+#define VFSNAME_STATVFS "statvfs"
+#define VFSNAME_SYNC "sync"
+#define VFSNAME_VGET "vget"
+#define VFSNAME_MOUNTROOT "mountroot"
+#define VFSNAME_FREEVFS "freevfs"
+#define VFSNAME_VNSTATE "vnstate"
+/*
+ * Filesystem type switch table.
+ */
+
+typedef struct vfssw {
+ char *vsw_name; /* type name -- max len _ST_FSTYPSZ */
+ int (*vsw_init) (int, char *);
+ /* init routine (for non-loadable fs only) */
+ int vsw_flag; /* flags */
+ mntopts_t vsw_optproto; /* mount options table prototype */
+ uint_t vsw_count; /* count of references */
+ kmutex_t vsw_lock; /* lock to protect vsw_count */
+ vfsops_t vsw_vfsops; /* filesystem operations vector */
+} vfssw_t;
+
+/*
+ * Filesystem type definition record. All file systems must export a record
+ * of this type through their modlfs structure.
+ */
+
+typedef struct vfsdef_v3 {
+ int def_version; /* structure version, must be first */
+ char *name; /* filesystem type name */
+ int (*init) (int, char *); /* init routine */
+ int flags; /* filesystem flags */
+ mntopts_t *optproto; /* mount options table prototype */
+} vfsdef_v3;
+
+typedef struct vfsdef_v3 vfsdef_t;
+
+enum {
+ VFSDEF_VERSION = 3
+};
+
+/*
+ * flags for vfssw and vfsdef
+ */
+#define VSW_HASPROTO 0x01 /* struct has a mount options prototype */
+#define VSW_CANRWRO 0x02 /* file system can transition from rw to ro */
+#define VSW_CANREMOUNT 0x04 /* file system supports remounts */
+#define VSW_NOTZONESAFE 0x08 /* zone_enter(2) should fail for these files */
+#define VSW_VOLATILEDEV 0x10 /* vfs_dev can change each time fs is mounted */
+#define VSW_STATS 0x20 /* file system can collect stats */
+
+#define VSW_INSTALLED 0x8000 /* this vsw is associated with a file system */
+
+#if defined(_KERNEL)
+/*
+ * Public operations.
+ */
+struct umounta;
+struct statvfsa;
+struct fstatvfsa;
+
+void vfs_freevfsops(vfsops_t *);
+int vfs_freevfsops_by_type(int);
+void vfs_setops(vfs_t *, vfsops_t *);
+vfsops_t *vfs_getops(vfs_t *vfsp);
+int vfs_matchops(vfs_t *, vfsops_t *);
+int vfs_can_sync(vfs_t *vfsp);
+void vfs_init(vfs_t *vfsp, vfsops_t *, void *);
+void vfsimpl_setup(vfs_t *vfsp);
+void vfsimpl_teardown(vfs_t *vfsp);
+void vn_exists(vnode_t *);
+void vn_idle(vnode_t *);
+void vn_reclaim(vnode_t *);
+void vn_invalid(vnode_t *);
+
+int rootconf(void);
+int svm_rootconf(void);
+int domount(char *, struct mounta *, vnode_t *, struct cred *,
+ struct vfs **);
+int dounmount(struct vfs *, int, cred_t *);
+int vfs_lock(struct vfs *);
+int vfs_rlock(struct vfs *);
+void vfs_lock_wait(struct vfs *);
+void vfs_rlock_wait(struct vfs *);
+void vfs_unlock(struct vfs *);
+int vfs_lock_held(struct vfs *);
+struct _kthread *vfs_lock_owner(struct vfs *);
+void sync(void);
+void vfs_sync(int);
+void vfs_mountroot(void);
+void vfs_add(vnode_t *, struct vfs *, int);
+void vfs_remove(struct vfs *);
+
+/* The following functions are not for general use by filesystems */
+
+void vfs_createopttbl(mntopts_t *, const char *);
+void vfs_copyopttbl(const mntopts_t *, mntopts_t *);
+void vfs_mergeopttbl(const mntopts_t *, const mntopts_t *, mntopts_t *);
+void vfs_freeopttbl(mntopts_t *);
+void vfs_parsemntopts(mntopts_t *, char *, int);
+int vfs_buildoptionstr(const mntopts_t *, char *, int);
+struct mntopt *vfs_hasopt(const mntopts_t *, const char *);
+void vfs_mnttab_modtimeupd(void);
+
+void vfs_clearmntopt(struct vfs *, const char *);
+void vfs_setmntopt(struct vfs *, const char *, const char *, int);
+void vfs_setresource(struct vfs *, const char *);
+void vfs_setmntpoint(struct vfs *, const char *);
+refstr_t *vfs_getresource(const struct vfs *);
+refstr_t *vfs_getmntpoint(const struct vfs *);
+int vfs_optionisset(const struct vfs *, const char *, char **);
+int vfs_settag(uint_t, uint_t, const char *, const char *, cred_t *);
+int vfs_clrtag(uint_t, uint_t, const char *, const char *, cred_t *);
+void vfs_syncall(void);
+void vfs_syncprogress(void);
+void vfsinit(void);
+void vfs_unmountall(void);
+void vfs_make_fsid(fsid_t *, dev_t, int);
+void vfs_addmip(dev_t, struct vfs *);
+void vfs_delmip(struct vfs *);
+int vfs_devismounted(dev_t);
+int vfs_devmounting(dev_t, struct vfs *);
+int vfs_opsinuse(vfsops_t *);
+struct vfs *getvfs(fsid_t *);
+struct vfs *vfs_dev2vfsp(dev_t);
+struct vfs *vfs_mntpoint2vfsp(const char *);
+struct vfssw *allocate_vfssw(char *);
+struct vfssw *vfs_getvfssw(char *);
+struct vfssw *vfs_getvfsswbyname(char *);
+struct vfssw *vfs_getvfsswbyvfsops(vfsops_t *);
+void vfs_refvfssw(struct vfssw *);
+void vfs_unrefvfssw(struct vfssw *);
+uint_t vf_to_stf(uint_t);
+void vfs_mnttab_modtime(timespec_t *);
+void vfs_mnttab_poll(timespec_t *, struct pollhead **);
+
+void vfs_list_lock(void);
+void vfs_list_read_lock(void);
+void vfs_list_unlock(void);
+void vfs_list_add(struct vfs *);
+void vfs_list_remove(struct vfs *);
+void vfs_hold(vfs_t *vfsp);
+void vfs_rele(vfs_t *vfsp);
+void fs_freevfs(vfs_t *);
+void vfs_root_redev(vfs_t *vfsp, dev_t ndev, int fstype);
+
+int vfs_zone_change_safe(vfs_t *);
+
+#define VFSHASH(maj, min) (((int)((maj)+(min))) & (vfshsz - 1))
+#define VFS_ON_LIST(vfsp) \
+ ((vfsp)->vfs_next != (vfsp) && (vfsp)->vfs_next != NULL)
+
+/*
+ * Globals.
+ */
+
+extern struct vfssw vfssw[]; /* table of filesystem types */
+extern krwlock_t vfssw_lock;
+extern char rootfstype[]; /* name of root fstype */
+extern const int nfstype; /* # of elements in vfssw array */
+extern vfsops_t *EIO_vfsops; /* operations for vfs being torn-down */
+
+/*
+ * The following variables are private to the the kernel's vfs layer. File
+ * system implementations should not access them.
+ */
+extern struct vfs *rootvfs; /* ptr to root vfs structure */
+typedef struct {
+ struct vfs *rvfs_head; /* head vfs in chain */
+ kmutex_t rvfs_lock; /* mutex protecting this chain */
+ uint32_t rvfs_len; /* length of this chain */
+} rvfs_t;
+extern rvfs_t *rvfs_list;
+extern int vfshsz; /* # of elements in rvfs_head array */
+extern const mntopts_t vfs_mntopts; /* globally recognized options */
+
+#endif /* defined(_KERNEL) */
+
+#define VFS_HOLD(vfsp) { \
+ vfs_hold(vfsp); \
+}
+
+#define VFS_RELE(vfsp) { \
+ vfs_rele(vfsp); \
+}
+
+#define VFS_INIT(vfsp, op, data) { \
+ vfs_init((vfsp), (op), (data)); \
+ vfsimpl_setup((vfsp)); \
+}
+
+
+#define VFS_INSTALLED(vfsswp) (((vfsswp)->vsw_flag & VSW_INSTALLED) != 0)
+#define ALLOCATED_VFSSW(vswp) ((vswp)->vsw_name[0] != '\0')
+#define RLOCK_VFSSW() (rw_enter(&vfssw_lock, RW_READER))
+#define RUNLOCK_VFSSW() (rw_exit(&vfssw_lock))
+#define WLOCK_VFSSW() (rw_enter(&vfssw_lock, RW_WRITER))
+#define WUNLOCK_VFSSW() (rw_exit(&vfssw_lock))
+#define VFSSW_LOCKED() (RW_LOCK_HELD(&vfssw_lock))
+#define VFSSW_WRITE_LOCKED() (RW_WRITE_HELD(&vfssw_lock))
+/*
+ * VFS_SYNC flags.
+ */
+#define SYNC_ATTR 0x01 /* sync attributes only */
+#define SYNC_CLOSE 0x02 /* close open file */
+#define SYNC_ALL 0x04 /* force to sync all fs */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_VFS_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/vmem.h b/sys/contrib/opensolaris/uts/common/sys/vmem.h
new file mode 100644
index 0000000..1cd2f30
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/vmem.h
@@ -0,0 +1,142 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License, Version 1.0 only
+ * (the "License"). You may not use this file except in compliance
+ * with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+/*
+ * Copyright 2005 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _SYS_VMEM_H
+#define _SYS_VMEM_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+
+/*
+ * Per-allocation flags
+ */
+#define VM_SLEEP 0x00000000 /* same as KM_SLEEP */
+#define VM_NOSLEEP 0x00000001 /* same as KM_NOSLEEP */
+#define VM_PANIC 0x00000002 /* same as KM_PANIC */
+#define VM_PUSHPAGE 0x00000004 /* same as KM_PUSHPAGE */
+#define VM_KMFLAGS 0x000000ff /* flags that must match KM_* flags */
+
+#define VM_BESTFIT 0x00000100
+#define VM_FIRSTFIT 0x00000200
+#define VM_NEXTFIT 0x00000400
+
+/*
+ * The following flags are restricted for use only within the kernel.
+ * VM_MEMLOAD is for use by the HAT to avoid infinite recursion.
+ * VM_NORELOC is used by the kernel when static VA->PA mappings are required.
+ */
+#define VM_MEMLOAD 0x00000800
+#define VM_NORELOC 0x00001000
+/*
+ * VM_ABORT requests that vmem_alloc() *ignore* the VM_SLEEP/VM_NOSLEEP flags
+ * and forgo reaping if the allocation or attempted import, fails. This
+ * flag is a segkmem-specific flag, and should not be used by anyone else.
+ */
+#define VM_ABORT 0x00002000
+
+#define VM_FLAGS 0x0000FFFF
+
+/*
+ * Arena creation flags
+ */
+#define VMC_POPULATOR 0x00010000
+#define VMC_NO_QCACHE 0x00020000 /* cannot use quantum caches */
+#define VMC_IDENTIFIER 0x00040000 /* not backed by memory */
+/*
+ * internal use only; the import function uses the vmem_ximport_t interface
+ * and may increase the request size if it so desires
+ */
+#define VMC_XALLOC 0x00080000
+#define VMC_FLAGS 0xFFFF0000
+
+/*
+ * Public segment types
+ */
+#define VMEM_ALLOC 0x01
+#define VMEM_FREE 0x02
+
+/*
+ * Implementation-private segment types
+ */
+#define VMEM_SPAN 0x10
+#define VMEM_ROTOR 0x20
+#define VMEM_WALKER 0x40
+
+/*
+ * VMEM_REENTRANT indicates to vmem_walk() that the callback routine may
+ * call back into the arena being walked, so vmem_walk() must drop the
+ * arena lock before each callback. The caveat is that since the arena
+ * isn't locked, its state can change. Therefore it is up to the callback
+ * routine to handle cases where the segment isn't of the expected type.
+ * For example, we use this to walk heap_arena when generating a crash dump;
+ * see segkmem_dump() for sample usage.
+ */
+#define VMEM_REENTRANT 0x80000000
+
+typedef struct vmem vmem_t;
+typedef void *(vmem_alloc_t)(vmem_t *, size_t, int);
+typedef void (vmem_free_t)(vmem_t *, void *, size_t);
+
+/*
+ * Alternate import style; the requested size is passed in a pointer,
+ * which can be increased by the import function if desired.
+ */
+typedef void *(vmem_ximport_t)(vmem_t *, size_t *, int);
+
+#ifdef _KERNEL
+extern vmem_t *vmem_init(const char *, void *, size_t, size_t,
+ vmem_alloc_t *, vmem_free_t *);
+extern void vmem_update(void *);
+extern int vmem_is_populator();
+extern size_t vmem_seg_size;
+#endif
+
+extern vmem_t *vmem_create(const char *, void *, size_t, size_t,
+ vmem_alloc_t *, vmem_free_t *, vmem_t *, size_t, int);
+extern vmem_t *vmem_xcreate(const char *, void *, size_t, size_t,
+ vmem_ximport_t *, vmem_free_t *, vmem_t *, size_t, int);
+extern void vmem_destroy(vmem_t *);
+extern void *vmem_alloc(vmem_t *, size_t, int);
+extern void *vmem_xalloc(vmem_t *, size_t, size_t, size_t, size_t,
+ void *, void *, int);
+extern void vmem_free(vmem_t *, void *, size_t);
+extern void vmem_xfree(vmem_t *, void *, size_t);
+extern void *vmem_add(vmem_t *, void *, size_t, int);
+extern int vmem_contains(vmem_t *, void *, size_t);
+extern void vmem_walk(vmem_t *, int, void (*)(void *, void *, size_t), void *);
+extern size_t vmem_size(vmem_t *, int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _SYS_VMEM_H */
diff --git a/sys/contrib/opensolaris/uts/common/sys/zmod.h b/sys/contrib/opensolaris/uts/common/sys/zmod.h
new file mode 100644
index 0000000..ba02672
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/sys/zmod.h
@@ -0,0 +1,68 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _ZMOD_H
+#define _ZMOD_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * zmod - RFC-1950-compatible decompression routines
+ *
+ * This file provides the public interfaces to zmod, an in-kernel RFC 1950
+ * decompression library. More information about the implementation of these
+ * interfaces can be found in the usr/src/uts/common/zmod/ directory.
+ */
+
+#define Z_OK 0
+#define Z_STREAM_END 1
+#define Z_NEED_DICT 2
+#define Z_ERRNO (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR (-3)
+#define Z_MEM_ERROR (-4)
+#define Z_BUF_ERROR (-5)
+#define Z_VERSION_ERROR (-6)
+
+#define Z_NO_COMPRESSION 0
+#define Z_BEST_SPEED 1
+#define Z_BEST_COMPRESSION 9
+#define Z_DEFAULT_COMPRESSION (-1)
+
+extern int z_uncompress(void *, size_t *, const void *, size_t);
+extern int z_compress(void *, size_t *, const void *, size_t);
+extern int z_compress_level(void *, size_t *, const void *, size_t, int);
+extern const char *z_strerror(int);
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZMOD_H */
diff --git a/sys/contrib/opensolaris/uts/common/zmod/adler32.c b/sys/contrib/opensolaris/uts/common/zmod/adler32.c
new file mode 100644
index 0000000..59d8463
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/adler32.c
@@ -0,0 +1,149 @@
+/* adler32.c -- compute the Adler-32 checksum of a data stream
+ * Copyright (C) 1995-2004 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#define ZLIB_INTERNAL
+#include "zlib.h"
+
+#define BASE 65521UL /* largest prime smaller than 65536 */
+#define NMAX 5552
+/* NMAX is the largest n such that 255n(n+1)/2 + (n+1)(BASE-1) <= 2^32-1 */
+
+#define DO1(buf,i) {adler += (buf)[i]; sum2 += adler;}
+#define DO2(buf,i) DO1(buf,i); DO1(buf,i+1);
+#define DO4(buf,i) DO2(buf,i); DO2(buf,i+2);
+#define DO8(buf,i) DO4(buf,i); DO4(buf,i+4);
+#define DO16(buf) DO8(buf,0); DO8(buf,8);
+
+/* use NO_DIVIDE if your processor does not do division in hardware */
+#ifdef NO_DIVIDE
+# define MOD(a) \
+ do { \
+ if (a >= (BASE << 16)) a -= (BASE << 16); \
+ if (a >= (BASE << 15)) a -= (BASE << 15); \
+ if (a >= (BASE << 14)) a -= (BASE << 14); \
+ if (a >= (BASE << 13)) a -= (BASE << 13); \
+ if (a >= (BASE << 12)) a -= (BASE << 12); \
+ if (a >= (BASE << 11)) a -= (BASE << 11); \
+ if (a >= (BASE << 10)) a -= (BASE << 10); \
+ if (a >= (BASE << 9)) a -= (BASE << 9); \
+ if (a >= (BASE << 8)) a -= (BASE << 8); \
+ if (a >= (BASE << 7)) a -= (BASE << 7); \
+ if (a >= (BASE << 6)) a -= (BASE << 6); \
+ if (a >= (BASE << 5)) a -= (BASE << 5); \
+ if (a >= (BASE << 4)) a -= (BASE << 4); \
+ if (a >= (BASE << 3)) a -= (BASE << 3); \
+ if (a >= (BASE << 2)) a -= (BASE << 2); \
+ if (a >= (BASE << 1)) a -= (BASE << 1); \
+ if (a >= BASE) a -= BASE; \
+ } while (0)
+# define MOD4(a) \
+ do { \
+ if (a >= (BASE << 4)) a -= (BASE << 4); \
+ if (a >= (BASE << 3)) a -= (BASE << 3); \
+ if (a >= (BASE << 2)) a -= (BASE << 2); \
+ if (a >= (BASE << 1)) a -= (BASE << 1); \
+ if (a >= BASE) a -= BASE; \
+ } while (0)
+#else
+# define MOD(a) a %= BASE
+# define MOD4(a) a %= BASE
+#endif
+
+/* ========================================================================= */
+uLong ZEXPORT adler32(adler, buf, len)
+ uLong adler;
+ const Bytef *buf;
+ uInt len;
+{
+ unsigned long sum2;
+ unsigned n;
+
+ /* split Adler-32 into component sums */
+ sum2 = (adler >> 16) & 0xffff;
+ adler &= 0xffff;
+
+ /* in case user likes doing a byte at a time, keep it fast */
+ if (len == 1) {
+ adler += buf[0];
+ if (adler >= BASE)
+ adler -= BASE;
+ sum2 += adler;
+ if (sum2 >= BASE)
+ sum2 -= BASE;
+ return adler | (sum2 << 16);
+ }
+
+ /* initial Adler-32 value (deferred check for len == 1 speed) */
+ if (buf == Z_NULL)
+ return 1L;
+
+ /* in case short lengths are provided, keep it somewhat fast */
+ if (len < 16) {
+ while (len--) {
+ adler += *buf++;
+ sum2 += adler;
+ }
+ if (adler >= BASE)
+ adler -= BASE;
+ MOD4(sum2); /* only added so many BASE's */
+ return adler | (sum2 << 16);
+ }
+
+ /* do length NMAX blocks -- requires just one modulo operation */
+ while (len >= NMAX) {
+ len -= NMAX;
+ n = NMAX / 16; /* NMAX is divisible by 16 */
+ do {
+ DO16(buf); /* 16 sums unrolled */
+ buf += 16;
+ } while (--n);
+ MOD(adler);
+ MOD(sum2);
+ }
+
+ /* do remaining bytes (less than NMAX, still just one modulo) */
+ if (len) { /* avoid modulos if none remaining */
+ while (len >= 16) {
+ len -= 16;
+ DO16(buf);
+ buf += 16;
+ }
+ while (len--) {
+ adler += *buf++;
+ sum2 += adler;
+ }
+ MOD(adler);
+ MOD(sum2);
+ }
+
+ /* return recombined sums */
+ return adler | (sum2 << 16);
+}
+
+/* ========================================================================= */
+uLong ZEXPORT adler32_combine(adler1, adler2, len2)
+ uLong adler1;
+ uLong adler2;
+ z_off_t len2;
+{
+ unsigned long sum1;
+ unsigned long sum2;
+ unsigned rem;
+
+ /* the derivation of this formula is left as an exercise for the reader */
+ rem = (unsigned)(len2 % BASE);
+ sum1 = adler1 & 0xffff;
+ sum2 = rem * sum1;
+ MOD(sum2);
+ sum1 += (adler2 & 0xffff) + BASE - 1;
+ sum2 += ((adler1 >> 16) & 0xffff) + ((adler2 >> 16) & 0xffff) + BASE - rem;
+ if (sum1 > BASE) sum1 -= BASE;
+ if (sum1 > BASE) sum1 -= BASE;
+ if (sum2 > (BASE << 1)) sum2 -= (BASE << 1);
+ if (sum2 > BASE) sum2 -= BASE;
+ return sum1 | (sum2 << 16);
+}
diff --git a/sys/contrib/opensolaris/uts/common/zmod/crc32.c b/sys/contrib/opensolaris/uts/common/zmod/crc32.c
new file mode 100644
index 0000000..61ad581
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/crc32.c
@@ -0,0 +1,428 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* crc32.c -- compute the CRC-32 of a data stream
+ * Copyright (C) 1995-2005 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ *
+ * Thanks to Rodney Brown <rbrown64@csc.com.au> for his contribution of faster
+ * CRC methods: exclusive-oring 32 bits of data at a time, and pre-computing
+ * tables for updating the shift register in one step with three exclusive-ors
+ * instead of four steps with four exclusive-ors. This results in about a
+ * factor of two increase in speed on a Power PC G4 (PPC7455) using gcc -O3.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ Note on the use of DYNAMIC_CRC_TABLE: there is no mutex or semaphore
+ protection on the static variables used to control the first-use generation
+ of the crc tables. Therefore, if you #define DYNAMIC_CRC_TABLE, you should
+ first call get_crc_table() to initialize the tables before allowing more than
+ one thread to use crc32().
+ */
+
+#ifdef MAKECRCH
+# include <stdio.h>
+# ifndef DYNAMIC_CRC_TABLE
+# define DYNAMIC_CRC_TABLE
+# endif /* !DYNAMIC_CRC_TABLE */
+#endif /* MAKECRCH */
+
+#include "zutil.h" /* for STDC and FAR definitions */
+
+#define local static
+
+/* Find a four-byte integer type for crc32_little() and crc32_big(). */
+#ifndef NOBYFOUR
+# ifdef STDC /* need ANSI C limits.h to determine sizes */
+# include <limits.h>
+# define BYFOUR
+# if (UINT_MAX == 0xffffffffUL)
+ typedef unsigned int u4;
+# else
+# if (ULONG_MAX == 0xffffffffUL)
+ typedef unsigned long u4;
+# else
+# if (USHRT_MAX == 0xffffffffUL)
+ typedef unsigned short u4;
+# else
+# undef BYFOUR /* can't find a four-byte integer type! */
+# endif
+# endif
+# endif
+# endif /* STDC */
+#endif /* !NOBYFOUR */
+
+/* Definitions for doing the crc four data bytes at a time. */
+#ifdef BYFOUR
+# define REV(w) (((w)>>24)+(((w)>>8)&0xff00)+ \
+ (((w)&0xff00)<<8)+(((w)&0xff)<<24))
+ local unsigned long crc32_little OF((unsigned long,
+ const unsigned char FAR *, unsigned));
+ local unsigned long crc32_big OF((unsigned long,
+ const unsigned char FAR *, unsigned));
+# define TBLS 8
+#else
+# define TBLS 1
+#endif /* BYFOUR */
+
+/* Local functions for crc concatenation */
+local unsigned long gf2_matrix_times OF((unsigned long *mat,
+ unsigned long vec));
+local void gf2_matrix_square OF((unsigned long *square, unsigned long *mat));
+
+#ifdef DYNAMIC_CRC_TABLE
+
+local volatile int crc_table_empty = 1;
+local unsigned long FAR crc_table[TBLS][256];
+local void make_crc_table OF((void));
+#ifdef MAKECRCH
+ local void write_table OF((FILE *, const unsigned long FAR *));
+#endif /* MAKECRCH */
+/*
+ Generate tables for a byte-wise 32-bit CRC calculation on the polynomial:
+ x^32+x^26+x^23+x^22+x^16+x^12+x^11+x^10+x^8+x^7+x^5+x^4+x^2+x+1.
+
+ Polynomials over GF(2) are represented in binary, one bit per coefficient,
+ with the lowest powers in the most significant bit. Then adding polynomials
+ is just exclusive-or, and multiplying a polynomial by x is a right shift by
+ one. If we call the above polynomial p, and represent a byte as the
+ polynomial q, also with the lowest power in the most significant bit (so the
+ byte 0xb1 is the polynomial x^7+x^3+x+1), then the CRC is (q*x^32) mod p,
+ where a mod b means the remainder after dividing a by b.
+
+ This calculation is done using the shift-register method of multiplying and
+ taking the remainder. The register is initialized to zero, and for each
+ incoming bit, x^32 is added mod p to the register if the bit is a one (where
+ x^32 mod p is p+x^32 = x^26+...+1), and the register is multiplied mod p by
+ x (which is shifting right by one and adding x^32 mod p if the bit shifted
+ out is a one). We start with the highest power (least significant bit) of
+ q and repeat for all eight bits of q.
+
+ The first table is simply the CRC of all possible eight bit values. This is
+ all the information needed to generate CRCs on data a byte at a time for all
+ combinations of CRC register values and incoming bytes. The remaining tables
+ allow for word-at-a-time CRC calculation for both big-endian and little-
+ endian machines, where a word is four bytes.
+*/
+local void make_crc_table()
+{
+ unsigned long c;
+ int n, k;
+ unsigned long poly; /* polynomial exclusive-or pattern */
+ /* terms of polynomial defining this crc (except x^32): */
+ static volatile int first = 1; /* flag to limit concurrent making */
+ static const unsigned char p[] = {0,1,2,4,5,7,8,10,11,12,16,22,23,26};
+
+ /* See if another task is already doing this (not thread-safe, but better
+ than nothing -- significantly reduces duration of vulnerability in
+ case the advice about DYNAMIC_CRC_TABLE is ignored) */
+ if (first) {
+ first = 0;
+
+ /* make exclusive-or pattern from polynomial (0xedb88320UL) */
+ poly = 0UL;
+ for (n = 0; n < sizeof(p)/sizeof(unsigned char); n++)
+ poly |= 1UL << (31 - p[n]);
+
+ /* generate a crc for every 8-bit value */
+ for (n = 0; n < 256; n++) {
+ c = (unsigned long)n;
+ for (k = 0; k < 8; k++)
+ c = c & 1 ? poly ^ (c >> 1) : c >> 1;
+ crc_table[0][n] = c;
+ }
+
+#ifdef BYFOUR
+ /* generate crc for each value followed by one, two, and three zeros,
+ and then the byte reversal of those as well as the first table */
+ for (n = 0; n < 256; n++) {
+ c = crc_table[0][n];
+ crc_table[4][n] = REV(c);
+ for (k = 1; k < 4; k++) {
+ c = crc_table[0][c & 0xff] ^ (c >> 8);
+ crc_table[k][n] = c;
+ crc_table[k + 4][n] = REV(c);
+ }
+ }
+#endif /* BYFOUR */
+
+ crc_table_empty = 0;
+ }
+ else { /* not first */
+ /* wait for the other guy to finish (not efficient, but rare) */
+ while (crc_table_empty)
+ ;
+ }
+
+#ifdef MAKECRCH
+ /* write out CRC tables to crc32.h */
+ {
+ FILE *out;
+
+ out = fopen("crc32.h", "w");
+ if (out == NULL) return;
+ fprintf(out, "/* crc32.h -- tables for rapid CRC calculation\n");
+ fprintf(out, " * Generated automatically by crc32.c\n */\n\n");
+ fprintf(out, "local const unsigned long FAR ");
+ fprintf(out, "crc_table[TBLS][256] =\n{\n {\n");
+ write_table(out, crc_table[0]);
+# ifdef BYFOUR
+ fprintf(out, "#ifdef BYFOUR\n");
+ for (k = 1; k < 8; k++) {
+ fprintf(out, " },\n {\n");
+ write_table(out, crc_table[k]);
+ }
+ fprintf(out, "#endif\n");
+# endif /* BYFOUR */
+ fprintf(out, " }\n};\n");
+ fclose(out);
+ }
+#endif /* MAKECRCH */
+}
+
+#ifdef MAKECRCH
+local void write_table(out, table)
+ FILE *out;
+ const unsigned long FAR *table;
+{
+ int n;
+
+ for (n = 0; n < 256; n++)
+ fprintf(out, "%s0x%08lxUL%s", n % 5 ? "" : " ", table[n],
+ n == 255 ? "\n" : (n % 5 == 4 ? ",\n" : ", "));
+}
+#endif /* MAKECRCH */
+
+#else /* !DYNAMIC_CRC_TABLE */
+/* ========================================================================
+ * Tables of CRC-32s of all single-byte values, made by make_crc_table().
+ */
+#include "crc32.h"
+#endif /* DYNAMIC_CRC_TABLE */
+
+/* =========================================================================
+ * This function can be used by asm versions of crc32()
+ */
+const unsigned long FAR * ZEXPORT get_crc_table()
+{
+#ifdef DYNAMIC_CRC_TABLE
+ if (crc_table_empty)
+ make_crc_table();
+#endif /* DYNAMIC_CRC_TABLE */
+ return (const unsigned long FAR *)crc_table;
+}
+
+/* ========================================================================= */
+#define DO1 crc = crc_table[0][((int)crc ^ (*buf++)) & 0xff] ^ (crc >> 8)
+#define DO8 DO1; DO1; DO1; DO1; DO1; DO1; DO1; DO1
+
+/* ========================================================================= */
+unsigned long ZEXPORT crc32(crc, buf, len)
+ unsigned long crc;
+ const unsigned char FAR *buf;
+ unsigned len;
+{
+ if (buf == Z_NULL) return 0UL;
+
+#ifdef DYNAMIC_CRC_TABLE
+ if (crc_table_empty)
+ make_crc_table();
+#endif /* DYNAMIC_CRC_TABLE */
+
+#ifdef BYFOUR
+ if (sizeof(void *) == sizeof(ptrdiff_t)) {
+ u4 endian;
+
+ endian = 1;
+ if (*((unsigned char *)(&endian)))
+ return crc32_little(crc, buf, len);
+ else
+ return crc32_big(crc, buf, len);
+ }
+#endif /* BYFOUR */
+ crc = crc ^ 0xffffffffUL;
+ while (len >= 8) {
+ DO8;
+ len -= 8;
+ }
+ if (len) do {
+ DO1;
+ } while (--len);
+ return crc ^ 0xffffffffUL;
+}
+
+#ifdef BYFOUR
+
+/* ========================================================================= */
+#define DOLIT4 c ^= *buf4++; \
+ c = crc_table[3][c & 0xff] ^ crc_table[2][(c >> 8) & 0xff] ^ \
+ crc_table[1][(c >> 16) & 0xff] ^ crc_table[0][c >> 24]
+#define DOLIT32 DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4; DOLIT4
+
+/* ========================================================================= */
+local unsigned long crc32_little(crc, buf, len)
+ unsigned long crc;
+ const unsigned char FAR *buf;
+ unsigned len;
+{
+ register u4 c;
+ register const u4 FAR *buf4;
+
+ c = (u4)crc;
+ c = ~c;
+ while (len && ((ptrdiff_t)buf & 3)) {
+ c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
+ len--;
+ }
+
+ buf4 = (const u4 FAR *)(const void FAR *)buf;
+ while (len >= 32) {
+ DOLIT32;
+ len -= 32;
+ }
+ while (len >= 4) {
+ DOLIT4;
+ len -= 4;
+ }
+ buf = (const unsigned char FAR *)buf4;
+
+ if (len) do {
+ c = crc_table[0][(c ^ *buf++) & 0xff] ^ (c >> 8);
+ } while (--len);
+ c = ~c;
+ return (unsigned long)c;
+}
+
+/* ========================================================================= */
+#define DOBIG4 c ^= *++buf4; \
+ c = crc_table[4][c & 0xff] ^ crc_table[5][(c >> 8) & 0xff] ^ \
+ crc_table[6][(c >> 16) & 0xff] ^ crc_table[7][c >> 24]
+#define DOBIG32 DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4; DOBIG4
+
+/* ========================================================================= */
+local unsigned long crc32_big(crc, buf, len)
+ unsigned long crc;
+ const unsigned char FAR *buf;
+ unsigned len;
+{
+ register u4 c;
+ register const u4 FAR *buf4;
+
+ c = REV((u4)crc);
+ c = ~c;
+ while (len && ((ptrdiff_t)buf & 3)) {
+ c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
+ len--;
+ }
+
+ buf4 = (const u4 FAR *)(const void FAR *)buf;
+ buf4--;
+ while (len >= 32) {
+ DOBIG32;
+ len -= 32;
+ }
+ while (len >= 4) {
+ DOBIG4;
+ len -= 4;
+ }
+ buf4++;
+ buf = (const unsigned char FAR *)buf4;
+
+ if (len) do {
+ c = crc_table[4][(c >> 24) ^ *buf++] ^ (c << 8);
+ } while (--len);
+ c = ~c;
+ return (unsigned long)(REV(c));
+}
+
+#endif /* BYFOUR */
+
+#define GF2_DIM 32 /* dimension of GF(2) vectors (length of CRC) */
+
+/* ========================================================================= */
+local unsigned long gf2_matrix_times(mat, vec)
+ unsigned long *mat;
+ unsigned long vec;
+{
+ unsigned long sum;
+
+ sum = 0;
+ while (vec) {
+ if (vec & 1)
+ sum ^= *mat;
+ vec >>= 1;
+ mat++;
+ }
+ return sum;
+}
+
+/* ========================================================================= */
+local void gf2_matrix_square(square, mat)
+ unsigned long *square;
+ unsigned long *mat;
+{
+ int n;
+
+ for (n = 0; n < GF2_DIM; n++)
+ square[n] = gf2_matrix_times(mat, mat[n]);
+}
+
+/* ========================================================================= */
+uLong ZEXPORT crc32_combine(crc1, crc2, len2)
+ uLong crc1;
+ uLong crc2;
+ z_off_t len2;
+{
+ int n;
+ unsigned long row;
+ unsigned long even[GF2_DIM]; /* even-power-of-two zeros operator */
+ unsigned long odd[GF2_DIM]; /* odd-power-of-two zeros operator */
+
+ /* degenerate case */
+ if (len2 == 0)
+ return crc1;
+
+ /* put operator for one zero bit in odd */
+ odd[0] = 0xedb88320UL; /* CRC-32 polynomial */
+ row = 1;
+ for (n = 1; n < GF2_DIM; n++) {
+ odd[n] = row;
+ row <<= 1;
+ }
+
+ /* put operator for two zero bits in even */
+ gf2_matrix_square(even, odd);
+
+ /* put operator for four zero bits in odd */
+ gf2_matrix_square(odd, even);
+
+ /* apply len2 zeros to crc1 (first square will put the operator for one
+ zero byte, eight zero bits, in even) */
+ do {
+ /* apply zeros operator for this bit of len2 */
+ gf2_matrix_square(even, odd);
+ if (len2 & 1)
+ crc1 = gf2_matrix_times(even, crc1);
+ len2 >>= 1;
+
+ /* if no more bits set, then done */
+ if (len2 == 0)
+ break;
+
+ /* another iteration of the loop with odd and even swapped */
+ gf2_matrix_square(odd, even);
+ if (len2 & 1)
+ crc1 = gf2_matrix_times(odd, crc1);
+ len2 >>= 1;
+
+ /* if no more bits set, then done */
+ } while (len2 != 0);
+
+ /* return combined crc */
+ crc1 ^= crc2;
+ return crc1;
+}
diff --git a/sys/contrib/opensolaris/uts/common/zmod/crc32.h b/sys/contrib/opensolaris/uts/common/zmod/crc32.h
new file mode 100644
index 0000000..495c83e
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/crc32.h
@@ -0,0 +1,443 @@
+/* crc32.h -- tables for rapid CRC calculation
+ * Generated automatically by crc32.c
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+local const unsigned long FAR crc_table[TBLS][256] =
+{
+ {
+ 0x00000000UL, 0x77073096UL, 0xee0e612cUL, 0x990951baUL, 0x076dc419UL,
+ 0x706af48fUL, 0xe963a535UL, 0x9e6495a3UL, 0x0edb8832UL, 0x79dcb8a4UL,
+ 0xe0d5e91eUL, 0x97d2d988UL, 0x09b64c2bUL, 0x7eb17cbdUL, 0xe7b82d07UL,
+ 0x90bf1d91UL, 0x1db71064UL, 0x6ab020f2UL, 0xf3b97148UL, 0x84be41deUL,
+ 0x1adad47dUL, 0x6ddde4ebUL, 0xf4d4b551UL, 0x83d385c7UL, 0x136c9856UL,
+ 0x646ba8c0UL, 0xfd62f97aUL, 0x8a65c9ecUL, 0x14015c4fUL, 0x63066cd9UL,
+ 0xfa0f3d63UL, 0x8d080df5UL, 0x3b6e20c8UL, 0x4c69105eUL, 0xd56041e4UL,
+ 0xa2677172UL, 0x3c03e4d1UL, 0x4b04d447UL, 0xd20d85fdUL, 0xa50ab56bUL,
+ 0x35b5a8faUL, 0x42b2986cUL, 0xdbbbc9d6UL, 0xacbcf940UL, 0x32d86ce3UL,
+ 0x45df5c75UL, 0xdcd60dcfUL, 0xabd13d59UL, 0x26d930acUL, 0x51de003aUL,
+ 0xc8d75180UL, 0xbfd06116UL, 0x21b4f4b5UL, 0x56b3c423UL, 0xcfba9599UL,
+ 0xb8bda50fUL, 0x2802b89eUL, 0x5f058808UL, 0xc60cd9b2UL, 0xb10be924UL,
+ 0x2f6f7c87UL, 0x58684c11UL, 0xc1611dabUL, 0xb6662d3dUL, 0x76dc4190UL,
+ 0x01db7106UL, 0x98d220bcUL, 0xefd5102aUL, 0x71b18589UL, 0x06b6b51fUL,
+ 0x9fbfe4a5UL, 0xe8b8d433UL, 0x7807c9a2UL, 0x0f00f934UL, 0x9609a88eUL,
+ 0xe10e9818UL, 0x7f6a0dbbUL, 0x086d3d2dUL, 0x91646c97UL, 0xe6635c01UL,
+ 0x6b6b51f4UL, 0x1c6c6162UL, 0x856530d8UL, 0xf262004eUL, 0x6c0695edUL,
+ 0x1b01a57bUL, 0x8208f4c1UL, 0xf50fc457UL, 0x65b0d9c6UL, 0x12b7e950UL,
+ 0x8bbeb8eaUL, 0xfcb9887cUL, 0x62dd1ddfUL, 0x15da2d49UL, 0x8cd37cf3UL,
+ 0xfbd44c65UL, 0x4db26158UL, 0x3ab551ceUL, 0xa3bc0074UL, 0xd4bb30e2UL,
+ 0x4adfa541UL, 0x3dd895d7UL, 0xa4d1c46dUL, 0xd3d6f4fbUL, 0x4369e96aUL,
+ 0x346ed9fcUL, 0xad678846UL, 0xda60b8d0UL, 0x44042d73UL, 0x33031de5UL,
+ 0xaa0a4c5fUL, 0xdd0d7cc9UL, 0x5005713cUL, 0x270241aaUL, 0xbe0b1010UL,
+ 0xc90c2086UL, 0x5768b525UL, 0x206f85b3UL, 0xb966d409UL, 0xce61e49fUL,
+ 0x5edef90eUL, 0x29d9c998UL, 0xb0d09822UL, 0xc7d7a8b4UL, 0x59b33d17UL,
+ 0x2eb40d81UL, 0xb7bd5c3bUL, 0xc0ba6cadUL, 0xedb88320UL, 0x9abfb3b6UL,
+ 0x03b6e20cUL, 0x74b1d29aUL, 0xead54739UL, 0x9dd277afUL, 0x04db2615UL,
+ 0x73dc1683UL, 0xe3630b12UL, 0x94643b84UL, 0x0d6d6a3eUL, 0x7a6a5aa8UL,
+ 0xe40ecf0bUL, 0x9309ff9dUL, 0x0a00ae27UL, 0x7d079eb1UL, 0xf00f9344UL,
+ 0x8708a3d2UL, 0x1e01f268UL, 0x6906c2feUL, 0xf762575dUL, 0x806567cbUL,
+ 0x196c3671UL, 0x6e6b06e7UL, 0xfed41b76UL, 0x89d32be0UL, 0x10da7a5aUL,
+ 0x67dd4accUL, 0xf9b9df6fUL, 0x8ebeeff9UL, 0x17b7be43UL, 0x60b08ed5UL,
+ 0xd6d6a3e8UL, 0xa1d1937eUL, 0x38d8c2c4UL, 0x4fdff252UL, 0xd1bb67f1UL,
+ 0xa6bc5767UL, 0x3fb506ddUL, 0x48b2364bUL, 0xd80d2bdaUL, 0xaf0a1b4cUL,
+ 0x36034af6UL, 0x41047a60UL, 0xdf60efc3UL, 0xa867df55UL, 0x316e8eefUL,
+ 0x4669be79UL, 0xcb61b38cUL, 0xbc66831aUL, 0x256fd2a0UL, 0x5268e236UL,
+ 0xcc0c7795UL, 0xbb0b4703UL, 0x220216b9UL, 0x5505262fUL, 0xc5ba3bbeUL,
+ 0xb2bd0b28UL, 0x2bb45a92UL, 0x5cb36a04UL, 0xc2d7ffa7UL, 0xb5d0cf31UL,
+ 0x2cd99e8bUL, 0x5bdeae1dUL, 0x9b64c2b0UL, 0xec63f226UL, 0x756aa39cUL,
+ 0x026d930aUL, 0x9c0906a9UL, 0xeb0e363fUL, 0x72076785UL, 0x05005713UL,
+ 0x95bf4a82UL, 0xe2b87a14UL, 0x7bb12baeUL, 0x0cb61b38UL, 0x92d28e9bUL,
+ 0xe5d5be0dUL, 0x7cdcefb7UL, 0x0bdbdf21UL, 0x86d3d2d4UL, 0xf1d4e242UL,
+ 0x68ddb3f8UL, 0x1fda836eUL, 0x81be16cdUL, 0xf6b9265bUL, 0x6fb077e1UL,
+ 0x18b74777UL, 0x88085ae6UL, 0xff0f6a70UL, 0x66063bcaUL, 0x11010b5cUL,
+ 0x8f659effUL, 0xf862ae69UL, 0x616bffd3UL, 0x166ccf45UL, 0xa00ae278UL,
+ 0xd70dd2eeUL, 0x4e048354UL, 0x3903b3c2UL, 0xa7672661UL, 0xd06016f7UL,
+ 0x4969474dUL, 0x3e6e77dbUL, 0xaed16a4aUL, 0xd9d65adcUL, 0x40df0b66UL,
+ 0x37d83bf0UL, 0xa9bcae53UL, 0xdebb9ec5UL, 0x47b2cf7fUL, 0x30b5ffe9UL,
+ 0xbdbdf21cUL, 0xcabac28aUL, 0x53b39330UL, 0x24b4a3a6UL, 0xbad03605UL,
+ 0xcdd70693UL, 0x54de5729UL, 0x23d967bfUL, 0xb3667a2eUL, 0xc4614ab8UL,
+ 0x5d681b02UL, 0x2a6f2b94UL, 0xb40bbe37UL, 0xc30c8ea1UL, 0x5a05df1bUL,
+ 0x2d02ef8dUL
+#ifdef BYFOUR
+ },
+ {
+ 0x00000000UL, 0x191b3141UL, 0x32366282UL, 0x2b2d53c3UL, 0x646cc504UL,
+ 0x7d77f445UL, 0x565aa786UL, 0x4f4196c7UL, 0xc8d98a08UL, 0xd1c2bb49UL,
+ 0xfaefe88aUL, 0xe3f4d9cbUL, 0xacb54f0cUL, 0xb5ae7e4dUL, 0x9e832d8eUL,
+ 0x87981ccfUL, 0x4ac21251UL, 0x53d92310UL, 0x78f470d3UL, 0x61ef4192UL,
+ 0x2eaed755UL, 0x37b5e614UL, 0x1c98b5d7UL, 0x05838496UL, 0x821b9859UL,
+ 0x9b00a918UL, 0xb02dfadbUL, 0xa936cb9aUL, 0xe6775d5dUL, 0xff6c6c1cUL,
+ 0xd4413fdfUL, 0xcd5a0e9eUL, 0x958424a2UL, 0x8c9f15e3UL, 0xa7b24620UL,
+ 0xbea97761UL, 0xf1e8e1a6UL, 0xe8f3d0e7UL, 0xc3de8324UL, 0xdac5b265UL,
+ 0x5d5daeaaUL, 0x44469febUL, 0x6f6bcc28UL, 0x7670fd69UL, 0x39316baeUL,
+ 0x202a5aefUL, 0x0b07092cUL, 0x121c386dUL, 0xdf4636f3UL, 0xc65d07b2UL,
+ 0xed705471UL, 0xf46b6530UL, 0xbb2af3f7UL, 0xa231c2b6UL, 0x891c9175UL,
+ 0x9007a034UL, 0x179fbcfbUL, 0x0e848dbaUL, 0x25a9de79UL, 0x3cb2ef38UL,
+ 0x73f379ffUL, 0x6ae848beUL, 0x41c51b7dUL, 0x58de2a3cUL, 0xf0794f05UL,
+ 0xe9627e44UL, 0xc24f2d87UL, 0xdb541cc6UL, 0x94158a01UL, 0x8d0ebb40UL,
+ 0xa623e883UL, 0xbf38d9c2UL, 0x38a0c50dUL, 0x21bbf44cUL, 0x0a96a78fUL,
+ 0x138d96ceUL, 0x5ccc0009UL, 0x45d73148UL, 0x6efa628bUL, 0x77e153caUL,
+ 0xbabb5d54UL, 0xa3a06c15UL, 0x888d3fd6UL, 0x91960e97UL, 0xded79850UL,
+ 0xc7cca911UL, 0xece1fad2UL, 0xf5facb93UL, 0x7262d75cUL, 0x6b79e61dUL,
+ 0x4054b5deUL, 0x594f849fUL, 0x160e1258UL, 0x0f152319UL, 0x243870daUL,
+ 0x3d23419bUL, 0x65fd6ba7UL, 0x7ce65ae6UL, 0x57cb0925UL, 0x4ed03864UL,
+ 0x0191aea3UL, 0x188a9fe2UL, 0x33a7cc21UL, 0x2abcfd60UL, 0xad24e1afUL,
+ 0xb43fd0eeUL, 0x9f12832dUL, 0x8609b26cUL, 0xc94824abUL, 0xd05315eaUL,
+ 0xfb7e4629UL, 0xe2657768UL, 0x2f3f79f6UL, 0x362448b7UL, 0x1d091b74UL,
+ 0x04122a35UL, 0x4b53bcf2UL, 0x52488db3UL, 0x7965de70UL, 0x607eef31UL,
+ 0xe7e6f3feUL, 0xfefdc2bfUL, 0xd5d0917cUL, 0xcccba03dUL, 0x838a36faUL,
+ 0x9a9107bbUL, 0xb1bc5478UL, 0xa8a76539UL, 0x3b83984bUL, 0x2298a90aUL,
+ 0x09b5fac9UL, 0x10aecb88UL, 0x5fef5d4fUL, 0x46f46c0eUL, 0x6dd93fcdUL,
+ 0x74c20e8cUL, 0xf35a1243UL, 0xea412302UL, 0xc16c70c1UL, 0xd8774180UL,
+ 0x9736d747UL, 0x8e2de606UL, 0xa500b5c5UL, 0xbc1b8484UL, 0x71418a1aUL,
+ 0x685abb5bUL, 0x4377e898UL, 0x5a6cd9d9UL, 0x152d4f1eUL, 0x0c367e5fUL,
+ 0x271b2d9cUL, 0x3e001cddUL, 0xb9980012UL, 0xa0833153UL, 0x8bae6290UL,
+ 0x92b553d1UL, 0xddf4c516UL, 0xc4eff457UL, 0xefc2a794UL, 0xf6d996d5UL,
+ 0xae07bce9UL, 0xb71c8da8UL, 0x9c31de6bUL, 0x852aef2aUL, 0xca6b79edUL,
+ 0xd37048acUL, 0xf85d1b6fUL, 0xe1462a2eUL, 0x66de36e1UL, 0x7fc507a0UL,
+ 0x54e85463UL, 0x4df36522UL, 0x02b2f3e5UL, 0x1ba9c2a4UL, 0x30849167UL,
+ 0x299fa026UL, 0xe4c5aeb8UL, 0xfdde9ff9UL, 0xd6f3cc3aUL, 0xcfe8fd7bUL,
+ 0x80a96bbcUL, 0x99b25afdUL, 0xb29f093eUL, 0xab84387fUL, 0x2c1c24b0UL,
+ 0x350715f1UL, 0x1e2a4632UL, 0x07317773UL, 0x4870e1b4UL, 0x516bd0f5UL,
+ 0x7a468336UL, 0x635db277UL, 0xcbfad74eUL, 0xd2e1e60fUL, 0xf9ccb5ccUL,
+ 0xe0d7848dUL, 0xaf96124aUL, 0xb68d230bUL, 0x9da070c8UL, 0x84bb4189UL,
+ 0x03235d46UL, 0x1a386c07UL, 0x31153fc4UL, 0x280e0e85UL, 0x674f9842UL,
+ 0x7e54a903UL, 0x5579fac0UL, 0x4c62cb81UL, 0x8138c51fUL, 0x9823f45eUL,
+ 0xb30ea79dUL, 0xaa1596dcUL, 0xe554001bUL, 0xfc4f315aUL, 0xd7626299UL,
+ 0xce7953d8UL, 0x49e14f17UL, 0x50fa7e56UL, 0x7bd72d95UL, 0x62cc1cd4UL,
+ 0x2d8d8a13UL, 0x3496bb52UL, 0x1fbbe891UL, 0x06a0d9d0UL, 0x5e7ef3ecUL,
+ 0x4765c2adUL, 0x6c48916eUL, 0x7553a02fUL, 0x3a1236e8UL, 0x230907a9UL,
+ 0x0824546aUL, 0x113f652bUL, 0x96a779e4UL, 0x8fbc48a5UL, 0xa4911b66UL,
+ 0xbd8a2a27UL, 0xf2cbbce0UL, 0xebd08da1UL, 0xc0fdde62UL, 0xd9e6ef23UL,
+ 0x14bce1bdUL, 0x0da7d0fcUL, 0x268a833fUL, 0x3f91b27eUL, 0x70d024b9UL,
+ 0x69cb15f8UL, 0x42e6463bUL, 0x5bfd777aUL, 0xdc656bb5UL, 0xc57e5af4UL,
+ 0xee530937UL, 0xf7483876UL, 0xb809aeb1UL, 0xa1129ff0UL, 0x8a3fcc33UL,
+ 0x9324fd72UL
+ },
+ {
+ 0x00000000UL, 0x01c26a37UL, 0x0384d46eUL, 0x0246be59UL, 0x0709a8dcUL,
+ 0x06cbc2ebUL, 0x048d7cb2UL, 0x054f1685UL, 0x0e1351b8UL, 0x0fd13b8fUL,
+ 0x0d9785d6UL, 0x0c55efe1UL, 0x091af964UL, 0x08d89353UL, 0x0a9e2d0aUL,
+ 0x0b5c473dUL, 0x1c26a370UL, 0x1de4c947UL, 0x1fa2771eUL, 0x1e601d29UL,
+ 0x1b2f0bacUL, 0x1aed619bUL, 0x18abdfc2UL, 0x1969b5f5UL, 0x1235f2c8UL,
+ 0x13f798ffUL, 0x11b126a6UL, 0x10734c91UL, 0x153c5a14UL, 0x14fe3023UL,
+ 0x16b88e7aUL, 0x177ae44dUL, 0x384d46e0UL, 0x398f2cd7UL, 0x3bc9928eUL,
+ 0x3a0bf8b9UL, 0x3f44ee3cUL, 0x3e86840bUL, 0x3cc03a52UL, 0x3d025065UL,
+ 0x365e1758UL, 0x379c7d6fUL, 0x35dac336UL, 0x3418a901UL, 0x3157bf84UL,
+ 0x3095d5b3UL, 0x32d36beaUL, 0x331101ddUL, 0x246be590UL, 0x25a98fa7UL,
+ 0x27ef31feUL, 0x262d5bc9UL, 0x23624d4cUL, 0x22a0277bUL, 0x20e69922UL,
+ 0x2124f315UL, 0x2a78b428UL, 0x2bbade1fUL, 0x29fc6046UL, 0x283e0a71UL,
+ 0x2d711cf4UL, 0x2cb376c3UL, 0x2ef5c89aUL, 0x2f37a2adUL, 0x709a8dc0UL,
+ 0x7158e7f7UL, 0x731e59aeUL, 0x72dc3399UL, 0x7793251cUL, 0x76514f2bUL,
+ 0x7417f172UL, 0x75d59b45UL, 0x7e89dc78UL, 0x7f4bb64fUL, 0x7d0d0816UL,
+ 0x7ccf6221UL, 0x798074a4UL, 0x78421e93UL, 0x7a04a0caUL, 0x7bc6cafdUL,
+ 0x6cbc2eb0UL, 0x6d7e4487UL, 0x6f38fadeUL, 0x6efa90e9UL, 0x6bb5866cUL,
+ 0x6a77ec5bUL, 0x68315202UL, 0x69f33835UL, 0x62af7f08UL, 0x636d153fUL,
+ 0x612bab66UL, 0x60e9c151UL, 0x65a6d7d4UL, 0x6464bde3UL, 0x662203baUL,
+ 0x67e0698dUL, 0x48d7cb20UL, 0x4915a117UL, 0x4b531f4eUL, 0x4a917579UL,
+ 0x4fde63fcUL, 0x4e1c09cbUL, 0x4c5ab792UL, 0x4d98dda5UL, 0x46c49a98UL,
+ 0x4706f0afUL, 0x45404ef6UL, 0x448224c1UL, 0x41cd3244UL, 0x400f5873UL,
+ 0x4249e62aUL, 0x438b8c1dUL, 0x54f16850UL, 0x55330267UL, 0x5775bc3eUL,
+ 0x56b7d609UL, 0x53f8c08cUL, 0x523aaabbUL, 0x507c14e2UL, 0x51be7ed5UL,
+ 0x5ae239e8UL, 0x5b2053dfUL, 0x5966ed86UL, 0x58a487b1UL, 0x5deb9134UL,
+ 0x5c29fb03UL, 0x5e6f455aUL, 0x5fad2f6dUL, 0xe1351b80UL, 0xe0f771b7UL,
+ 0xe2b1cfeeUL, 0xe373a5d9UL, 0xe63cb35cUL, 0xe7fed96bUL, 0xe5b86732UL,
+ 0xe47a0d05UL, 0xef264a38UL, 0xeee4200fUL, 0xeca29e56UL, 0xed60f461UL,
+ 0xe82fe2e4UL, 0xe9ed88d3UL, 0xebab368aUL, 0xea695cbdUL, 0xfd13b8f0UL,
+ 0xfcd1d2c7UL, 0xfe976c9eUL, 0xff5506a9UL, 0xfa1a102cUL, 0xfbd87a1bUL,
+ 0xf99ec442UL, 0xf85cae75UL, 0xf300e948UL, 0xf2c2837fUL, 0xf0843d26UL,
+ 0xf1465711UL, 0xf4094194UL, 0xf5cb2ba3UL, 0xf78d95faUL, 0xf64fffcdUL,
+ 0xd9785d60UL, 0xd8ba3757UL, 0xdafc890eUL, 0xdb3ee339UL, 0xde71f5bcUL,
+ 0xdfb39f8bUL, 0xddf521d2UL, 0xdc374be5UL, 0xd76b0cd8UL, 0xd6a966efUL,
+ 0xd4efd8b6UL, 0xd52db281UL, 0xd062a404UL, 0xd1a0ce33UL, 0xd3e6706aUL,
+ 0xd2241a5dUL, 0xc55efe10UL, 0xc49c9427UL, 0xc6da2a7eUL, 0xc7184049UL,
+ 0xc25756ccUL, 0xc3953cfbUL, 0xc1d382a2UL, 0xc011e895UL, 0xcb4dafa8UL,
+ 0xca8fc59fUL, 0xc8c97bc6UL, 0xc90b11f1UL, 0xcc440774UL, 0xcd866d43UL,
+ 0xcfc0d31aUL, 0xce02b92dUL, 0x91af9640UL, 0x906dfc77UL, 0x922b422eUL,
+ 0x93e92819UL, 0x96a63e9cUL, 0x976454abUL, 0x9522eaf2UL, 0x94e080c5UL,
+ 0x9fbcc7f8UL, 0x9e7eadcfUL, 0x9c381396UL, 0x9dfa79a1UL, 0x98b56f24UL,
+ 0x99770513UL, 0x9b31bb4aUL, 0x9af3d17dUL, 0x8d893530UL, 0x8c4b5f07UL,
+ 0x8e0de15eUL, 0x8fcf8b69UL, 0x8a809decUL, 0x8b42f7dbUL, 0x89044982UL,
+ 0x88c623b5UL, 0x839a6488UL, 0x82580ebfUL, 0x801eb0e6UL, 0x81dcdad1UL,
+ 0x8493cc54UL, 0x8551a663UL, 0x8717183aUL, 0x86d5720dUL, 0xa9e2d0a0UL,
+ 0xa820ba97UL, 0xaa6604ceUL, 0xaba46ef9UL, 0xaeeb787cUL, 0xaf29124bUL,
+ 0xad6fac12UL, 0xacadc625UL, 0xa7f18118UL, 0xa633eb2fUL, 0xa4755576UL,
+ 0xa5b73f41UL, 0xa0f829c4UL, 0xa13a43f3UL, 0xa37cfdaaUL, 0xa2be979dUL,
+ 0xb5c473d0UL, 0xb40619e7UL, 0xb640a7beUL, 0xb782cd89UL, 0xb2cddb0cUL,
+ 0xb30fb13bUL, 0xb1490f62UL, 0xb08b6555UL, 0xbbd72268UL, 0xba15485fUL,
+ 0xb853f606UL, 0xb9919c31UL, 0xbcde8ab4UL, 0xbd1ce083UL, 0xbf5a5edaUL,
+ 0xbe9834edUL
+ },
+ {
+ 0x00000000UL, 0xb8bc6765UL, 0xaa09c88bUL, 0x12b5afeeUL, 0x8f629757UL,
+ 0x37def032UL, 0x256b5fdcUL, 0x9dd738b9UL, 0xc5b428efUL, 0x7d084f8aUL,
+ 0x6fbde064UL, 0xd7018701UL, 0x4ad6bfb8UL, 0xf26ad8ddUL, 0xe0df7733UL,
+ 0x58631056UL, 0x5019579fUL, 0xe8a530faUL, 0xfa109f14UL, 0x42acf871UL,
+ 0xdf7bc0c8UL, 0x67c7a7adUL, 0x75720843UL, 0xcdce6f26UL, 0x95ad7f70UL,
+ 0x2d111815UL, 0x3fa4b7fbUL, 0x8718d09eUL, 0x1acfe827UL, 0xa2738f42UL,
+ 0xb0c620acUL, 0x087a47c9UL, 0xa032af3eUL, 0x188ec85bUL, 0x0a3b67b5UL,
+ 0xb28700d0UL, 0x2f503869UL, 0x97ec5f0cUL, 0x8559f0e2UL, 0x3de59787UL,
+ 0x658687d1UL, 0xdd3ae0b4UL, 0xcf8f4f5aUL, 0x7733283fUL, 0xeae41086UL,
+ 0x525877e3UL, 0x40edd80dUL, 0xf851bf68UL, 0xf02bf8a1UL, 0x48979fc4UL,
+ 0x5a22302aUL, 0xe29e574fUL, 0x7f496ff6UL, 0xc7f50893UL, 0xd540a77dUL,
+ 0x6dfcc018UL, 0x359fd04eUL, 0x8d23b72bUL, 0x9f9618c5UL, 0x272a7fa0UL,
+ 0xbafd4719UL, 0x0241207cUL, 0x10f48f92UL, 0xa848e8f7UL, 0x9b14583dUL,
+ 0x23a83f58UL, 0x311d90b6UL, 0x89a1f7d3UL, 0x1476cf6aUL, 0xaccaa80fUL,
+ 0xbe7f07e1UL, 0x06c36084UL, 0x5ea070d2UL, 0xe61c17b7UL, 0xf4a9b859UL,
+ 0x4c15df3cUL, 0xd1c2e785UL, 0x697e80e0UL, 0x7bcb2f0eUL, 0xc377486bUL,
+ 0xcb0d0fa2UL, 0x73b168c7UL, 0x6104c729UL, 0xd9b8a04cUL, 0x446f98f5UL,
+ 0xfcd3ff90UL, 0xee66507eUL, 0x56da371bUL, 0x0eb9274dUL, 0xb6054028UL,
+ 0xa4b0efc6UL, 0x1c0c88a3UL, 0x81dbb01aUL, 0x3967d77fUL, 0x2bd27891UL,
+ 0x936e1ff4UL, 0x3b26f703UL, 0x839a9066UL, 0x912f3f88UL, 0x299358edUL,
+ 0xb4446054UL, 0x0cf80731UL, 0x1e4da8dfUL, 0xa6f1cfbaUL, 0xfe92dfecUL,
+ 0x462eb889UL, 0x549b1767UL, 0xec277002UL, 0x71f048bbUL, 0xc94c2fdeUL,
+ 0xdbf98030UL, 0x6345e755UL, 0x6b3fa09cUL, 0xd383c7f9UL, 0xc1366817UL,
+ 0x798a0f72UL, 0xe45d37cbUL, 0x5ce150aeUL, 0x4e54ff40UL, 0xf6e89825UL,
+ 0xae8b8873UL, 0x1637ef16UL, 0x048240f8UL, 0xbc3e279dUL, 0x21e91f24UL,
+ 0x99557841UL, 0x8be0d7afUL, 0x335cb0caUL, 0xed59b63bUL, 0x55e5d15eUL,
+ 0x47507eb0UL, 0xffec19d5UL, 0x623b216cUL, 0xda874609UL, 0xc832e9e7UL,
+ 0x708e8e82UL, 0x28ed9ed4UL, 0x9051f9b1UL, 0x82e4565fUL, 0x3a58313aUL,
+ 0xa78f0983UL, 0x1f336ee6UL, 0x0d86c108UL, 0xb53aa66dUL, 0xbd40e1a4UL,
+ 0x05fc86c1UL, 0x1749292fUL, 0xaff54e4aUL, 0x322276f3UL, 0x8a9e1196UL,
+ 0x982bbe78UL, 0x2097d91dUL, 0x78f4c94bUL, 0xc048ae2eUL, 0xd2fd01c0UL,
+ 0x6a4166a5UL, 0xf7965e1cUL, 0x4f2a3979UL, 0x5d9f9697UL, 0xe523f1f2UL,
+ 0x4d6b1905UL, 0xf5d77e60UL, 0xe762d18eUL, 0x5fdeb6ebUL, 0xc2098e52UL,
+ 0x7ab5e937UL, 0x680046d9UL, 0xd0bc21bcUL, 0x88df31eaUL, 0x3063568fUL,
+ 0x22d6f961UL, 0x9a6a9e04UL, 0x07bda6bdUL, 0xbf01c1d8UL, 0xadb46e36UL,
+ 0x15080953UL, 0x1d724e9aUL, 0xa5ce29ffUL, 0xb77b8611UL, 0x0fc7e174UL,
+ 0x9210d9cdUL, 0x2aacbea8UL, 0x38191146UL, 0x80a57623UL, 0xd8c66675UL,
+ 0x607a0110UL, 0x72cfaefeUL, 0xca73c99bUL, 0x57a4f122UL, 0xef189647UL,
+ 0xfdad39a9UL, 0x45115eccUL, 0x764dee06UL, 0xcef18963UL, 0xdc44268dUL,
+ 0x64f841e8UL, 0xf92f7951UL, 0x41931e34UL, 0x5326b1daUL, 0xeb9ad6bfUL,
+ 0xb3f9c6e9UL, 0x0b45a18cUL, 0x19f00e62UL, 0xa14c6907UL, 0x3c9b51beUL,
+ 0x842736dbUL, 0x96929935UL, 0x2e2efe50UL, 0x2654b999UL, 0x9ee8defcUL,
+ 0x8c5d7112UL, 0x34e11677UL, 0xa9362eceUL, 0x118a49abUL, 0x033fe645UL,
+ 0xbb838120UL, 0xe3e09176UL, 0x5b5cf613UL, 0x49e959fdUL, 0xf1553e98UL,
+ 0x6c820621UL, 0xd43e6144UL, 0xc68bceaaUL, 0x7e37a9cfUL, 0xd67f4138UL,
+ 0x6ec3265dUL, 0x7c7689b3UL, 0xc4caeed6UL, 0x591dd66fUL, 0xe1a1b10aUL,
+ 0xf3141ee4UL, 0x4ba87981UL, 0x13cb69d7UL, 0xab770eb2UL, 0xb9c2a15cUL,
+ 0x017ec639UL, 0x9ca9fe80UL, 0x241599e5UL, 0x36a0360bUL, 0x8e1c516eUL,
+ 0x866616a7UL, 0x3eda71c2UL, 0x2c6fde2cUL, 0x94d3b949UL, 0x090481f0UL,
+ 0xb1b8e695UL, 0xa30d497bUL, 0x1bb12e1eUL, 0x43d23e48UL, 0xfb6e592dUL,
+ 0xe9dbf6c3UL, 0x516791a6UL, 0xccb0a91fUL, 0x740cce7aUL, 0x66b96194UL,
+ 0xde0506f1UL
+ },
+ {
+ 0x00000000UL, 0x96300777UL, 0x2c610eeeUL, 0xba510999UL, 0x19c46d07UL,
+ 0x8ff46a70UL, 0x35a563e9UL, 0xa395649eUL, 0x3288db0eUL, 0xa4b8dc79UL,
+ 0x1ee9d5e0UL, 0x88d9d297UL, 0x2b4cb609UL, 0xbd7cb17eUL, 0x072db8e7UL,
+ 0x911dbf90UL, 0x6410b71dUL, 0xf220b06aUL, 0x4871b9f3UL, 0xde41be84UL,
+ 0x7dd4da1aUL, 0xebe4dd6dUL, 0x51b5d4f4UL, 0xc785d383UL, 0x56986c13UL,
+ 0xc0a86b64UL, 0x7af962fdUL, 0xecc9658aUL, 0x4f5c0114UL, 0xd96c0663UL,
+ 0x633d0ffaUL, 0xf50d088dUL, 0xc8206e3bUL, 0x5e10694cUL, 0xe44160d5UL,
+ 0x727167a2UL, 0xd1e4033cUL, 0x47d4044bUL, 0xfd850dd2UL, 0x6bb50aa5UL,
+ 0xfaa8b535UL, 0x6c98b242UL, 0xd6c9bbdbUL, 0x40f9bcacUL, 0xe36cd832UL,
+ 0x755cdf45UL, 0xcf0dd6dcUL, 0x593dd1abUL, 0xac30d926UL, 0x3a00de51UL,
+ 0x8051d7c8UL, 0x1661d0bfUL, 0xb5f4b421UL, 0x23c4b356UL, 0x9995bacfUL,
+ 0x0fa5bdb8UL, 0x9eb80228UL, 0x0888055fUL, 0xb2d90cc6UL, 0x24e90bb1UL,
+ 0x877c6f2fUL, 0x114c6858UL, 0xab1d61c1UL, 0x3d2d66b6UL, 0x9041dc76UL,
+ 0x0671db01UL, 0xbc20d298UL, 0x2a10d5efUL, 0x8985b171UL, 0x1fb5b606UL,
+ 0xa5e4bf9fUL, 0x33d4b8e8UL, 0xa2c90778UL, 0x34f9000fUL, 0x8ea80996UL,
+ 0x18980ee1UL, 0xbb0d6a7fUL, 0x2d3d6d08UL, 0x976c6491UL, 0x015c63e6UL,
+ 0xf4516b6bUL, 0x62616c1cUL, 0xd8306585UL, 0x4e0062f2UL, 0xed95066cUL,
+ 0x7ba5011bUL, 0xc1f40882UL, 0x57c40ff5UL, 0xc6d9b065UL, 0x50e9b712UL,
+ 0xeab8be8bUL, 0x7c88b9fcUL, 0xdf1ddd62UL, 0x492dda15UL, 0xf37cd38cUL,
+ 0x654cd4fbUL, 0x5861b24dUL, 0xce51b53aUL, 0x7400bca3UL, 0xe230bbd4UL,
+ 0x41a5df4aUL, 0xd795d83dUL, 0x6dc4d1a4UL, 0xfbf4d6d3UL, 0x6ae96943UL,
+ 0xfcd96e34UL, 0x468867adUL, 0xd0b860daUL, 0x732d0444UL, 0xe51d0333UL,
+ 0x5f4c0aaaUL, 0xc97c0dddUL, 0x3c710550UL, 0xaa410227UL, 0x10100bbeUL,
+ 0x86200cc9UL, 0x25b56857UL, 0xb3856f20UL, 0x09d466b9UL, 0x9fe461ceUL,
+ 0x0ef9de5eUL, 0x98c9d929UL, 0x2298d0b0UL, 0xb4a8d7c7UL, 0x173db359UL,
+ 0x810db42eUL, 0x3b5cbdb7UL, 0xad6cbac0UL, 0x2083b8edUL, 0xb6b3bf9aUL,
+ 0x0ce2b603UL, 0x9ad2b174UL, 0x3947d5eaUL, 0xaf77d29dUL, 0x1526db04UL,
+ 0x8316dc73UL, 0x120b63e3UL, 0x843b6494UL, 0x3e6a6d0dUL, 0xa85a6a7aUL,
+ 0x0bcf0ee4UL, 0x9dff0993UL, 0x27ae000aUL, 0xb19e077dUL, 0x44930ff0UL,
+ 0xd2a30887UL, 0x68f2011eUL, 0xfec20669UL, 0x5d5762f7UL, 0xcb676580UL,
+ 0x71366c19UL, 0xe7066b6eUL, 0x761bd4feUL, 0xe02bd389UL, 0x5a7ada10UL,
+ 0xcc4add67UL, 0x6fdfb9f9UL, 0xf9efbe8eUL, 0x43beb717UL, 0xd58eb060UL,
+ 0xe8a3d6d6UL, 0x7e93d1a1UL, 0xc4c2d838UL, 0x52f2df4fUL, 0xf167bbd1UL,
+ 0x6757bca6UL, 0xdd06b53fUL, 0x4b36b248UL, 0xda2b0dd8UL, 0x4c1b0aafUL,
+ 0xf64a0336UL, 0x607a0441UL, 0xc3ef60dfUL, 0x55df67a8UL, 0xef8e6e31UL,
+ 0x79be6946UL, 0x8cb361cbUL, 0x1a8366bcUL, 0xa0d26f25UL, 0x36e26852UL,
+ 0x95770cccUL, 0x03470bbbUL, 0xb9160222UL, 0x2f260555UL, 0xbe3bbac5UL,
+ 0x280bbdb2UL, 0x925ab42bUL, 0x046ab35cUL, 0xa7ffd7c2UL, 0x31cfd0b5UL,
+ 0x8b9ed92cUL, 0x1daede5bUL, 0xb0c2649bUL, 0x26f263ecUL, 0x9ca36a75UL,
+ 0x0a936d02UL, 0xa906099cUL, 0x3f360eebUL, 0x85670772UL, 0x13570005UL,
+ 0x824abf95UL, 0x147ab8e2UL, 0xae2bb17bUL, 0x381bb60cUL, 0x9b8ed292UL,
+ 0x0dbed5e5UL, 0xb7efdc7cUL, 0x21dfdb0bUL, 0xd4d2d386UL, 0x42e2d4f1UL,
+ 0xf8b3dd68UL, 0x6e83da1fUL, 0xcd16be81UL, 0x5b26b9f6UL, 0xe177b06fUL,
+ 0x7747b718UL, 0xe65a0888UL, 0x706a0fffUL, 0xca3b0666UL, 0x5c0b0111UL,
+ 0xff9e658fUL, 0x69ae62f8UL, 0xd3ff6b61UL, 0x45cf6c16UL, 0x78e20aa0UL,
+ 0xeed20dd7UL, 0x5483044eUL, 0xc2b30339UL, 0x612667a7UL, 0xf71660d0UL,
+ 0x4d476949UL, 0xdb776e3eUL, 0x4a6ad1aeUL, 0xdc5ad6d9UL, 0x660bdf40UL,
+ 0xf03bd837UL, 0x53aebca9UL, 0xc59ebbdeUL, 0x7fcfb247UL, 0xe9ffb530UL,
+ 0x1cf2bdbdUL, 0x8ac2bacaUL, 0x3093b353UL, 0xa6a3b424UL, 0x0536d0baUL,
+ 0x9306d7cdUL, 0x2957de54UL, 0xbf67d923UL, 0x2e7a66b3UL, 0xb84a61c4UL,
+ 0x021b685dUL, 0x942b6f2aUL, 0x37be0bb4UL, 0xa18e0cc3UL, 0x1bdf055aUL,
+ 0x8def022dUL
+ },
+ {
+ 0x00000000UL, 0x41311b19UL, 0x82623632UL, 0xc3532d2bUL, 0x04c56c64UL,
+ 0x45f4777dUL, 0x86a75a56UL, 0xc796414fUL, 0x088ad9c8UL, 0x49bbc2d1UL,
+ 0x8ae8effaUL, 0xcbd9f4e3UL, 0x0c4fb5acUL, 0x4d7eaeb5UL, 0x8e2d839eUL,
+ 0xcf1c9887UL, 0x5112c24aUL, 0x1023d953UL, 0xd370f478UL, 0x9241ef61UL,
+ 0x55d7ae2eUL, 0x14e6b537UL, 0xd7b5981cUL, 0x96848305UL, 0x59981b82UL,
+ 0x18a9009bUL, 0xdbfa2db0UL, 0x9acb36a9UL, 0x5d5d77e6UL, 0x1c6c6cffUL,
+ 0xdf3f41d4UL, 0x9e0e5acdUL, 0xa2248495UL, 0xe3159f8cUL, 0x2046b2a7UL,
+ 0x6177a9beUL, 0xa6e1e8f1UL, 0xe7d0f3e8UL, 0x2483dec3UL, 0x65b2c5daUL,
+ 0xaaae5d5dUL, 0xeb9f4644UL, 0x28cc6b6fUL, 0x69fd7076UL, 0xae6b3139UL,
+ 0xef5a2a20UL, 0x2c09070bUL, 0x6d381c12UL, 0xf33646dfUL, 0xb2075dc6UL,
+ 0x715470edUL, 0x30656bf4UL, 0xf7f32abbUL, 0xb6c231a2UL, 0x75911c89UL,
+ 0x34a00790UL, 0xfbbc9f17UL, 0xba8d840eUL, 0x79dea925UL, 0x38efb23cUL,
+ 0xff79f373UL, 0xbe48e86aUL, 0x7d1bc541UL, 0x3c2ade58UL, 0x054f79f0UL,
+ 0x447e62e9UL, 0x872d4fc2UL, 0xc61c54dbUL, 0x018a1594UL, 0x40bb0e8dUL,
+ 0x83e823a6UL, 0xc2d938bfUL, 0x0dc5a038UL, 0x4cf4bb21UL, 0x8fa7960aUL,
+ 0xce968d13UL, 0x0900cc5cUL, 0x4831d745UL, 0x8b62fa6eUL, 0xca53e177UL,
+ 0x545dbbbaUL, 0x156ca0a3UL, 0xd63f8d88UL, 0x970e9691UL, 0x5098d7deUL,
+ 0x11a9ccc7UL, 0xd2fae1ecUL, 0x93cbfaf5UL, 0x5cd76272UL, 0x1de6796bUL,
+ 0xdeb55440UL, 0x9f844f59UL, 0x58120e16UL, 0x1923150fUL, 0xda703824UL,
+ 0x9b41233dUL, 0xa76bfd65UL, 0xe65ae67cUL, 0x2509cb57UL, 0x6438d04eUL,
+ 0xa3ae9101UL, 0xe29f8a18UL, 0x21cca733UL, 0x60fdbc2aUL, 0xafe124adUL,
+ 0xeed03fb4UL, 0x2d83129fUL, 0x6cb20986UL, 0xab2448c9UL, 0xea1553d0UL,
+ 0x29467efbUL, 0x687765e2UL, 0xf6793f2fUL, 0xb7482436UL, 0x741b091dUL,
+ 0x352a1204UL, 0xf2bc534bUL, 0xb38d4852UL, 0x70de6579UL, 0x31ef7e60UL,
+ 0xfef3e6e7UL, 0xbfc2fdfeUL, 0x7c91d0d5UL, 0x3da0cbccUL, 0xfa368a83UL,
+ 0xbb07919aUL, 0x7854bcb1UL, 0x3965a7a8UL, 0x4b98833bUL, 0x0aa99822UL,
+ 0xc9fab509UL, 0x88cbae10UL, 0x4f5def5fUL, 0x0e6cf446UL, 0xcd3fd96dUL,
+ 0x8c0ec274UL, 0x43125af3UL, 0x022341eaUL, 0xc1706cc1UL, 0x804177d8UL,
+ 0x47d73697UL, 0x06e62d8eUL, 0xc5b500a5UL, 0x84841bbcUL, 0x1a8a4171UL,
+ 0x5bbb5a68UL, 0x98e87743UL, 0xd9d96c5aUL, 0x1e4f2d15UL, 0x5f7e360cUL,
+ 0x9c2d1b27UL, 0xdd1c003eUL, 0x120098b9UL, 0x533183a0UL, 0x9062ae8bUL,
+ 0xd153b592UL, 0x16c5f4ddUL, 0x57f4efc4UL, 0x94a7c2efUL, 0xd596d9f6UL,
+ 0xe9bc07aeUL, 0xa88d1cb7UL, 0x6bde319cUL, 0x2aef2a85UL, 0xed796bcaUL,
+ 0xac4870d3UL, 0x6f1b5df8UL, 0x2e2a46e1UL, 0xe136de66UL, 0xa007c57fUL,
+ 0x6354e854UL, 0x2265f34dUL, 0xe5f3b202UL, 0xa4c2a91bUL, 0x67918430UL,
+ 0x26a09f29UL, 0xb8aec5e4UL, 0xf99fdefdUL, 0x3accf3d6UL, 0x7bfde8cfUL,
+ 0xbc6ba980UL, 0xfd5ab299UL, 0x3e099fb2UL, 0x7f3884abUL, 0xb0241c2cUL,
+ 0xf1150735UL, 0x32462a1eUL, 0x73773107UL, 0xb4e17048UL, 0xf5d06b51UL,
+ 0x3683467aUL, 0x77b25d63UL, 0x4ed7facbUL, 0x0fe6e1d2UL, 0xccb5ccf9UL,
+ 0x8d84d7e0UL, 0x4a1296afUL, 0x0b238db6UL, 0xc870a09dUL, 0x8941bb84UL,
+ 0x465d2303UL, 0x076c381aUL, 0xc43f1531UL, 0x850e0e28UL, 0x42984f67UL,
+ 0x03a9547eUL, 0xc0fa7955UL, 0x81cb624cUL, 0x1fc53881UL, 0x5ef42398UL,
+ 0x9da70eb3UL, 0xdc9615aaUL, 0x1b0054e5UL, 0x5a314ffcUL, 0x996262d7UL,
+ 0xd85379ceUL, 0x174fe149UL, 0x567efa50UL, 0x952dd77bUL, 0xd41ccc62UL,
+ 0x138a8d2dUL, 0x52bb9634UL, 0x91e8bb1fUL, 0xd0d9a006UL, 0xecf37e5eUL,
+ 0xadc26547UL, 0x6e91486cUL, 0x2fa05375UL, 0xe836123aUL, 0xa9070923UL,
+ 0x6a542408UL, 0x2b653f11UL, 0xe479a796UL, 0xa548bc8fUL, 0x661b91a4UL,
+ 0x272a8abdUL, 0xe0bccbf2UL, 0xa18dd0ebUL, 0x62defdc0UL, 0x23efe6d9UL,
+ 0xbde1bc14UL, 0xfcd0a70dUL, 0x3f838a26UL, 0x7eb2913fUL, 0xb924d070UL,
+ 0xf815cb69UL, 0x3b46e642UL, 0x7a77fd5bUL, 0xb56b65dcUL, 0xf45a7ec5UL,
+ 0x370953eeUL, 0x763848f7UL, 0xb1ae09b8UL, 0xf09f12a1UL, 0x33cc3f8aUL,
+ 0x72fd2493UL
+ },
+ {
+ 0x00000000UL, 0x376ac201UL, 0x6ed48403UL, 0x59be4602UL, 0xdca80907UL,
+ 0xebc2cb06UL, 0xb27c8d04UL, 0x85164f05UL, 0xb851130eUL, 0x8f3bd10fUL,
+ 0xd685970dUL, 0xe1ef550cUL, 0x64f91a09UL, 0x5393d808UL, 0x0a2d9e0aUL,
+ 0x3d475c0bUL, 0x70a3261cUL, 0x47c9e41dUL, 0x1e77a21fUL, 0x291d601eUL,
+ 0xac0b2f1bUL, 0x9b61ed1aUL, 0xc2dfab18UL, 0xf5b56919UL, 0xc8f23512UL,
+ 0xff98f713UL, 0xa626b111UL, 0x914c7310UL, 0x145a3c15UL, 0x2330fe14UL,
+ 0x7a8eb816UL, 0x4de47a17UL, 0xe0464d38UL, 0xd72c8f39UL, 0x8e92c93bUL,
+ 0xb9f80b3aUL, 0x3cee443fUL, 0x0b84863eUL, 0x523ac03cUL, 0x6550023dUL,
+ 0x58175e36UL, 0x6f7d9c37UL, 0x36c3da35UL, 0x01a91834UL, 0x84bf5731UL,
+ 0xb3d59530UL, 0xea6bd332UL, 0xdd011133UL, 0x90e56b24UL, 0xa78fa925UL,
+ 0xfe31ef27UL, 0xc95b2d26UL, 0x4c4d6223UL, 0x7b27a022UL, 0x2299e620UL,
+ 0x15f32421UL, 0x28b4782aUL, 0x1fdeba2bUL, 0x4660fc29UL, 0x710a3e28UL,
+ 0xf41c712dUL, 0xc376b32cUL, 0x9ac8f52eUL, 0xada2372fUL, 0xc08d9a70UL,
+ 0xf7e75871UL, 0xae591e73UL, 0x9933dc72UL, 0x1c259377UL, 0x2b4f5176UL,
+ 0x72f11774UL, 0x459bd575UL, 0x78dc897eUL, 0x4fb64b7fUL, 0x16080d7dUL,
+ 0x2162cf7cUL, 0xa4748079UL, 0x931e4278UL, 0xcaa0047aUL, 0xfdcac67bUL,
+ 0xb02ebc6cUL, 0x87447e6dUL, 0xdefa386fUL, 0xe990fa6eUL, 0x6c86b56bUL,
+ 0x5bec776aUL, 0x02523168UL, 0x3538f369UL, 0x087faf62UL, 0x3f156d63UL,
+ 0x66ab2b61UL, 0x51c1e960UL, 0xd4d7a665UL, 0xe3bd6464UL, 0xba032266UL,
+ 0x8d69e067UL, 0x20cbd748UL, 0x17a11549UL, 0x4e1f534bUL, 0x7975914aUL,
+ 0xfc63de4fUL, 0xcb091c4eUL, 0x92b75a4cUL, 0xa5dd984dUL, 0x989ac446UL,
+ 0xaff00647UL, 0xf64e4045UL, 0xc1248244UL, 0x4432cd41UL, 0x73580f40UL,
+ 0x2ae64942UL, 0x1d8c8b43UL, 0x5068f154UL, 0x67023355UL, 0x3ebc7557UL,
+ 0x09d6b756UL, 0x8cc0f853UL, 0xbbaa3a52UL, 0xe2147c50UL, 0xd57ebe51UL,
+ 0xe839e25aUL, 0xdf53205bUL, 0x86ed6659UL, 0xb187a458UL, 0x3491eb5dUL,
+ 0x03fb295cUL, 0x5a456f5eUL, 0x6d2fad5fUL, 0x801b35e1UL, 0xb771f7e0UL,
+ 0xeecfb1e2UL, 0xd9a573e3UL, 0x5cb33ce6UL, 0x6bd9fee7UL, 0x3267b8e5UL,
+ 0x050d7ae4UL, 0x384a26efUL, 0x0f20e4eeUL, 0x569ea2ecUL, 0x61f460edUL,
+ 0xe4e22fe8UL, 0xd388ede9UL, 0x8a36abebUL, 0xbd5c69eaUL, 0xf0b813fdUL,
+ 0xc7d2d1fcUL, 0x9e6c97feUL, 0xa90655ffUL, 0x2c101afaUL, 0x1b7ad8fbUL,
+ 0x42c49ef9UL, 0x75ae5cf8UL, 0x48e900f3UL, 0x7f83c2f2UL, 0x263d84f0UL,
+ 0x115746f1UL, 0x944109f4UL, 0xa32bcbf5UL, 0xfa958df7UL, 0xcdff4ff6UL,
+ 0x605d78d9UL, 0x5737bad8UL, 0x0e89fcdaUL, 0x39e33edbUL, 0xbcf571deUL,
+ 0x8b9fb3dfUL, 0xd221f5ddUL, 0xe54b37dcUL, 0xd80c6bd7UL, 0xef66a9d6UL,
+ 0xb6d8efd4UL, 0x81b22dd5UL, 0x04a462d0UL, 0x33cea0d1UL, 0x6a70e6d3UL,
+ 0x5d1a24d2UL, 0x10fe5ec5UL, 0x27949cc4UL, 0x7e2adac6UL, 0x494018c7UL,
+ 0xcc5657c2UL, 0xfb3c95c3UL, 0xa282d3c1UL, 0x95e811c0UL, 0xa8af4dcbUL,
+ 0x9fc58fcaUL, 0xc67bc9c8UL, 0xf1110bc9UL, 0x740744ccUL, 0x436d86cdUL,
+ 0x1ad3c0cfUL, 0x2db902ceUL, 0x4096af91UL, 0x77fc6d90UL, 0x2e422b92UL,
+ 0x1928e993UL, 0x9c3ea696UL, 0xab546497UL, 0xf2ea2295UL, 0xc580e094UL,
+ 0xf8c7bc9fUL, 0xcfad7e9eUL, 0x9613389cUL, 0xa179fa9dUL, 0x246fb598UL,
+ 0x13057799UL, 0x4abb319bUL, 0x7dd1f39aUL, 0x3035898dUL, 0x075f4b8cUL,
+ 0x5ee10d8eUL, 0x698bcf8fUL, 0xec9d808aUL, 0xdbf7428bUL, 0x82490489UL,
+ 0xb523c688UL, 0x88649a83UL, 0xbf0e5882UL, 0xe6b01e80UL, 0xd1dadc81UL,
+ 0x54cc9384UL, 0x63a65185UL, 0x3a181787UL, 0x0d72d586UL, 0xa0d0e2a9UL,
+ 0x97ba20a8UL, 0xce0466aaUL, 0xf96ea4abUL, 0x7c78ebaeUL, 0x4b1229afUL,
+ 0x12ac6fadUL, 0x25c6adacUL, 0x1881f1a7UL, 0x2feb33a6UL, 0x765575a4UL,
+ 0x413fb7a5UL, 0xc429f8a0UL, 0xf3433aa1UL, 0xaafd7ca3UL, 0x9d97bea2UL,
+ 0xd073c4b5UL, 0xe71906b4UL, 0xbea740b6UL, 0x89cd82b7UL, 0x0cdbcdb2UL,
+ 0x3bb10fb3UL, 0x620f49b1UL, 0x55658bb0UL, 0x6822d7bbUL, 0x5f4815baUL,
+ 0x06f653b8UL, 0x319c91b9UL, 0xb48adebcUL, 0x83e01cbdUL, 0xda5e5abfUL,
+ 0xed3498beUL
+ },
+ {
+ 0x00000000UL, 0x6567bcb8UL, 0x8bc809aaUL, 0xeeafb512UL, 0x5797628fUL,
+ 0x32f0de37UL, 0xdc5f6b25UL, 0xb938d79dUL, 0xef28b4c5UL, 0x8a4f087dUL,
+ 0x64e0bd6fUL, 0x018701d7UL, 0xb8bfd64aUL, 0xddd86af2UL, 0x3377dfe0UL,
+ 0x56106358UL, 0x9f571950UL, 0xfa30a5e8UL, 0x149f10faUL, 0x71f8ac42UL,
+ 0xc8c07bdfUL, 0xada7c767UL, 0x43087275UL, 0x266fcecdUL, 0x707fad95UL,
+ 0x1518112dUL, 0xfbb7a43fUL, 0x9ed01887UL, 0x27e8cf1aUL, 0x428f73a2UL,
+ 0xac20c6b0UL, 0xc9477a08UL, 0x3eaf32a0UL, 0x5bc88e18UL, 0xb5673b0aUL,
+ 0xd00087b2UL, 0x6938502fUL, 0x0c5fec97UL, 0xe2f05985UL, 0x8797e53dUL,
+ 0xd1878665UL, 0xb4e03addUL, 0x5a4f8fcfUL, 0x3f283377UL, 0x8610e4eaUL,
+ 0xe3775852UL, 0x0dd8ed40UL, 0x68bf51f8UL, 0xa1f82bf0UL, 0xc49f9748UL,
+ 0x2a30225aUL, 0x4f579ee2UL, 0xf66f497fUL, 0x9308f5c7UL, 0x7da740d5UL,
+ 0x18c0fc6dUL, 0x4ed09f35UL, 0x2bb7238dUL, 0xc518969fUL, 0xa07f2a27UL,
+ 0x1947fdbaUL, 0x7c204102UL, 0x928ff410UL, 0xf7e848a8UL, 0x3d58149bUL,
+ 0x583fa823UL, 0xb6901d31UL, 0xd3f7a189UL, 0x6acf7614UL, 0x0fa8caacUL,
+ 0xe1077fbeUL, 0x8460c306UL, 0xd270a05eUL, 0xb7171ce6UL, 0x59b8a9f4UL,
+ 0x3cdf154cUL, 0x85e7c2d1UL, 0xe0807e69UL, 0x0e2fcb7bUL, 0x6b4877c3UL,
+ 0xa20f0dcbUL, 0xc768b173UL, 0x29c70461UL, 0x4ca0b8d9UL, 0xf5986f44UL,
+ 0x90ffd3fcUL, 0x7e5066eeUL, 0x1b37da56UL, 0x4d27b90eUL, 0x284005b6UL,
+ 0xc6efb0a4UL, 0xa3880c1cUL, 0x1ab0db81UL, 0x7fd76739UL, 0x9178d22bUL,
+ 0xf41f6e93UL, 0x03f7263bUL, 0x66909a83UL, 0x883f2f91UL, 0xed589329UL,
+ 0x546044b4UL, 0x3107f80cUL, 0xdfa84d1eUL, 0xbacff1a6UL, 0xecdf92feUL,
+ 0x89b82e46UL, 0x67179b54UL, 0x027027ecUL, 0xbb48f071UL, 0xde2f4cc9UL,
+ 0x3080f9dbUL, 0x55e74563UL, 0x9ca03f6bUL, 0xf9c783d3UL, 0x176836c1UL,
+ 0x720f8a79UL, 0xcb375de4UL, 0xae50e15cUL, 0x40ff544eUL, 0x2598e8f6UL,
+ 0x73888baeUL, 0x16ef3716UL, 0xf8408204UL, 0x9d273ebcUL, 0x241fe921UL,
+ 0x41785599UL, 0xafd7e08bUL, 0xcab05c33UL, 0x3bb659edUL, 0x5ed1e555UL,
+ 0xb07e5047UL, 0xd519ecffUL, 0x6c213b62UL, 0x094687daUL, 0xe7e932c8UL,
+ 0x828e8e70UL, 0xd49eed28UL, 0xb1f95190UL, 0x5f56e482UL, 0x3a31583aUL,
+ 0x83098fa7UL, 0xe66e331fUL, 0x08c1860dUL, 0x6da63ab5UL, 0xa4e140bdUL,
+ 0xc186fc05UL, 0x2f294917UL, 0x4a4ef5afUL, 0xf3762232UL, 0x96119e8aUL,
+ 0x78be2b98UL, 0x1dd99720UL, 0x4bc9f478UL, 0x2eae48c0UL, 0xc001fdd2UL,
+ 0xa566416aUL, 0x1c5e96f7UL, 0x79392a4fUL, 0x97969f5dUL, 0xf2f123e5UL,
+ 0x05196b4dUL, 0x607ed7f5UL, 0x8ed162e7UL, 0xebb6de5fUL, 0x528e09c2UL,
+ 0x37e9b57aUL, 0xd9460068UL, 0xbc21bcd0UL, 0xea31df88UL, 0x8f566330UL,
+ 0x61f9d622UL, 0x049e6a9aUL, 0xbda6bd07UL, 0xd8c101bfUL, 0x366eb4adUL,
+ 0x53090815UL, 0x9a4e721dUL, 0xff29cea5UL, 0x11867bb7UL, 0x74e1c70fUL,
+ 0xcdd91092UL, 0xa8beac2aUL, 0x46111938UL, 0x2376a580UL, 0x7566c6d8UL,
+ 0x10017a60UL, 0xfeaecf72UL, 0x9bc973caUL, 0x22f1a457UL, 0x479618efUL,
+ 0xa939adfdUL, 0xcc5e1145UL, 0x06ee4d76UL, 0x6389f1ceUL, 0x8d2644dcUL,
+ 0xe841f864UL, 0x51792ff9UL, 0x341e9341UL, 0xdab12653UL, 0xbfd69aebUL,
+ 0xe9c6f9b3UL, 0x8ca1450bUL, 0x620ef019UL, 0x07694ca1UL, 0xbe519b3cUL,
+ 0xdb362784UL, 0x35999296UL, 0x50fe2e2eUL, 0x99b95426UL, 0xfcdee89eUL,
+ 0x12715d8cUL, 0x7716e134UL, 0xce2e36a9UL, 0xab498a11UL, 0x45e63f03UL,
+ 0x208183bbUL, 0x7691e0e3UL, 0x13f65c5bUL, 0xfd59e949UL, 0x983e55f1UL,
+ 0x2106826cUL, 0x44613ed4UL, 0xaace8bc6UL, 0xcfa9377eUL, 0x38417fd6UL,
+ 0x5d26c36eUL, 0xb389767cUL, 0xd6eecac4UL, 0x6fd61d59UL, 0x0ab1a1e1UL,
+ 0xe41e14f3UL, 0x8179a84bUL, 0xd769cb13UL, 0xb20e77abUL, 0x5ca1c2b9UL,
+ 0x39c67e01UL, 0x80fea99cUL, 0xe5991524UL, 0x0b36a036UL, 0x6e511c8eUL,
+ 0xa7166686UL, 0xc271da3eUL, 0x2cde6f2cUL, 0x49b9d394UL, 0xf0810409UL,
+ 0x95e6b8b1UL, 0x7b490da3UL, 0x1e2eb11bUL, 0x483ed243UL, 0x2d596efbUL,
+ 0xc3f6dbe9UL, 0xa6916751UL, 0x1fa9b0ccUL, 0x7ace0c74UL, 0x9461b966UL,
+ 0xf10605deUL
+#endif
+ }
+};
diff --git a/sys/contrib/opensolaris/uts/common/zmod/deflate.c b/sys/contrib/opensolaris/uts/common/zmod/deflate.c
new file mode 100644
index 0000000..7847e40
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/deflate.c
@@ -0,0 +1,1742 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* deflate.c -- compress data using the deflation algorithm
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * ALGORITHM
+ *
+ * The "deflation" process depends on being able to identify portions
+ * of the input text which are identical to earlier input (within a
+ * sliding window trailing behind the input currently being processed).
+ *
+ * The most straightforward technique turns out to be the fastest for
+ * most input files: try all possible matches and select the longest.
+ * The key feature of this algorithm is that insertions into the string
+ * dictionary are very simple and thus fast, and deletions are avoided
+ * completely. Insertions are performed at each input character, whereas
+ * string matches are performed only when the previous match ends. So it
+ * is preferable to spend more time in matches to allow very fast string
+ * insertions and avoid deletions. The matching algorithm for small
+ * strings is inspired from that of Rabin & Karp. A brute force approach
+ * is used to find longer strings when a small match has been found.
+ * A similar algorithm is used in comic (by Jan-Mark Wams) and freeze
+ * (by Leonid Broukhis).
+ * A previous version of this file used a more sophisticated algorithm
+ * (by Fiala and Greene) which is guaranteed to run in linear amortized
+ * time, but has a larger average cost, uses more memory and is patented.
+ * However the F&G algorithm may be faster for some highly redundant
+ * files if the parameter max_chain_length (described below) is too large.
+ *
+ * ACKNOWLEDGEMENTS
+ *
+ * The idea of lazy evaluation of matches is due to Jan-Mark Wams, and
+ * I found it in 'freeze' written by Leonid Broukhis.
+ * Thanks to many people for bug reports and testing.
+ *
+ * REFERENCES
+ *
+ * Deutsch, L.P.,"DEFLATE Compressed Data Format Specification".
+ * Available in http://www.ietf.org/rfc/rfc1951.txt
+ *
+ * A description of the Rabin and Karp algorithm is given in the book
+ * "Algorithms" by R. Sedgewick, Addison-Wesley, p252.
+ *
+ * Fiala,E.R., and Greene,D.H.
+ * Data Compression with Finite Windows, Comm.ACM, 32,4 (1989) 490-595
+ *
+ */
+
+#include "deflate.h"
+
+static const char deflate_copyright[] =
+ " deflate 1.2.3 Copyright 1995-2005 Jean-loup Gailly ";
+/*
+ If you use the zlib library in a product, an acknowledgment is welcome
+ in the documentation of your product. If for some reason you cannot
+ include such an acknowledgment, I would appreciate that you keep this
+ copyright string in the executable of your product.
+ */
+
+/* ===========================================================================
+ * Function prototypes.
+ */
+typedef enum {
+ need_more, /* block not completed, need more input or more output */
+ block_done, /* block flush performed */
+ finish_started, /* finish started, need only more output at next deflate */
+ finish_done /* finish done, accept no more input or output */
+} block_state;
+
+typedef block_state (*compress_func) OF((deflate_state *s, int flush));
+/* Compression function. Returns the block state after the call. */
+
+local void fill_window OF((deflate_state *s));
+local block_state deflate_stored OF((deflate_state *s, int flush));
+local block_state deflate_fast OF((deflate_state *s, int flush));
+#ifndef FASTEST
+local block_state deflate_slow OF((deflate_state *s, int flush));
+#endif
+local void lm_init OF((deflate_state *s));
+local void putShortMSB OF((deflate_state *s, uInt b));
+local void flush_pending OF((z_streamp strm));
+local int read_buf OF((z_streamp strm, Bytef *buf, unsigned size));
+#ifndef FASTEST
+#ifdef ASMV
+ void match_init OF((void)); /* asm code initialization */
+ uInt longest_match OF((deflate_state *s, IPos cur_match));
+#else
+local uInt longest_match OF((deflate_state *s, IPos cur_match));
+#endif
+#endif
+local uInt longest_match_fast OF((deflate_state *s, IPos cur_match));
+
+#ifdef DEBUG
+local void check_match OF((deflate_state *s, IPos start, IPos match,
+ int length));
+#endif
+
+/* ===========================================================================
+ * Local data
+ */
+
+#define NIL 0
+/* Tail of hash chains */
+
+#ifndef TOO_FAR
+# define TOO_FAR 4096
+#endif
+/* Matches of length 3 are discarded if their distance exceeds TOO_FAR */
+
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+/* Minimum amount of lookahead, except at the end of the input file.
+ * See deflate.c for comments about the MIN_MATCH+1.
+ */
+
+/* Values for max_lazy_match, good_match and max_chain_length, depending on
+ * the desired pack level (0..9). The values given below have been tuned to
+ * exclude worst case performance for pathological files. Better values may be
+ * found for specific files.
+ */
+typedef struct config_s {
+ ush good_length; /* reduce lazy search above this match length */
+ ush max_lazy; /* do not perform lazy search above this match length */
+ ush nice_length; /* quit search above this match length */
+ ush max_chain;
+ compress_func func;
+} config;
+
+#ifdef FASTEST
+local const config configuration_table[2] = {
+/* good lazy nice chain */
+/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
+/* 1 */ {4, 4, 8, 4, deflate_fast}}; /* max speed, no lazy matches */
+#else
+local const config configuration_table[10] = {
+/* good lazy nice chain */
+/* 0 */ {0, 0, 0, 0, deflate_stored}, /* store only */
+/* 1 */ {4, 4, 8, 4, deflate_fast}, /* max speed, no lazy matches */
+/* 2 */ {4, 5, 16, 8, deflate_fast},
+/* 3 */ {4, 6, 32, 32, deflate_fast},
+
+/* 4 */ {4, 4, 16, 16, deflate_slow}, /* lazy matches */
+/* 5 */ {8, 16, 32, 32, deflate_slow},
+/* 6 */ {8, 16, 128, 128, deflate_slow},
+/* 7 */ {8, 32, 128, 256, deflate_slow},
+/* 8 */ {32, 128, 258, 1024, deflate_slow},
+/* 9 */ {32, 258, 258, 4096, deflate_slow}}; /* max compression */
+#endif
+
+/* Note: the deflate() code requires max_lazy >= MIN_MATCH and max_chain >= 4
+ * For deflate_fast() (levels <= 3) good is ignored and lazy has a different
+ * meaning.
+ */
+
+#define EQUAL 0
+/* result of memcmp for equal strings */
+
+#ifndef NO_DUMMY_DECL
+struct static_tree_desc_s {int dummy;}; /* for buggy compilers */
+#endif
+
+/* ===========================================================================
+ * Update a hash value with the given input byte
+ * IN assertion: all calls to to UPDATE_HASH are made with consecutive
+ * input characters, so that a running hash key can be computed from the
+ * previous key instead of complete recalculation each time.
+ */
+#define UPDATE_HASH(s,h,c) (h = (((h)<<s->hash_shift) ^ (c)) & s->hash_mask)
+
+
+/* ===========================================================================
+ * Insert string str in the dictionary and set match_head to the previous head
+ * of the hash chain (the most recent string with same hash key). Return
+ * the previous length of the hash chain.
+ * If this file is compiled with -DFASTEST, the compression level is forced
+ * to 1, and no hash chains are maintained.
+ * IN assertion: all calls to to INSERT_STRING are made with consecutive
+ * input characters and the first MIN_MATCH bytes of str are valid
+ * (except for the last MIN_MATCH-1 bytes of the input file).
+ */
+#ifdef FASTEST
+#define INSERT_STRING(s, str, match_head) \
+ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+ match_head = s->head[s->ins_h], \
+ s->head[s->ins_h] = (Pos)(str))
+#else
+#define INSERT_STRING(s, str, match_head) \
+ (UPDATE_HASH(s, s->ins_h, s->window[(str) + (MIN_MATCH-1)]), \
+ match_head = s->prev[(str) & s->w_mask] = s->head[s->ins_h], \
+ s->head[s->ins_h] = (Pos)(str))
+#endif
+
+/* ===========================================================================
+ * Initialize the hash table (avoiding 64K overflow for 16 bit systems).
+ * prev[] will be initialized on the fly.
+ */
+#define CLEAR_HASH(s) \
+ s->head[s->hash_size-1] = NIL; \
+ (void) zmemzero((Bytef *)s->head, \
+ (unsigned)(s->hash_size-1)*sizeof(*s->head));
+
+/* ========================================================================= */
+int ZEXPORT deflateInit_(strm, level, version, stream_size)
+ z_streamp strm;
+ int level;
+ const char *version;
+ int stream_size;
+{
+ return deflateInit2_(strm, level, Z_DEFLATED, MAX_WBITS, DEF_MEM_LEVEL,
+ Z_DEFAULT_STRATEGY, version, stream_size);
+ /* To do: ignore strm->next_in if we use it as window */
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateInit2_(strm, level, method, windowBits, memLevel, strategy,
+ version, stream_size)
+ z_streamp strm;
+ int level;
+ int method;
+ int windowBits;
+ int memLevel;
+ int strategy;
+ const char *version;
+ int stream_size;
+{
+ deflate_state *s;
+ int wrap = 1;
+ static const char my_version[] = ZLIB_VERSION;
+
+ ushf *overlay;
+ /* We overlay pending_buf and d_buf+l_buf. This works since the average
+ * output size for (length,distance) codes is <= 24 bits.
+ */
+
+ if (version == Z_NULL || version[0] != my_version[0] ||
+ stream_size != sizeof(z_stream)) {
+ return Z_VERSION_ERROR;
+ }
+ if (strm == Z_NULL) return Z_STREAM_ERROR;
+
+ strm->msg = Z_NULL;
+ if (strm->zalloc == (alloc_func)0) {
+ strm->zalloc = zcalloc;
+ strm->opaque = (voidpf)0;
+ }
+ if (strm->zfree == (free_func)0) strm->zfree = zcfree;
+
+#ifdef FASTEST
+ if (level != 0) level = 1;
+#else
+ if (level == Z_DEFAULT_COMPRESSION) level = 6;
+#endif
+
+ if (windowBits < 0) { /* suppress zlib wrapper */
+ wrap = 0;
+ windowBits = -windowBits;
+ }
+#ifdef GZIP
+ else if (windowBits > 15) {
+ wrap = 2; /* write gzip wrapper instead */
+ windowBits -= 16;
+ }
+#endif
+ if (memLevel < 1 || memLevel > MAX_MEM_LEVEL || method != Z_DEFLATED ||
+ windowBits < 8 || windowBits > 15 || level < 0 || level > 9 ||
+ strategy < 0 || strategy > Z_FIXED) {
+ return Z_STREAM_ERROR;
+ }
+ if (windowBits == 8) windowBits = 9; /* until 256-byte window bug fixed */
+ s = (deflate_state *) ZALLOC(strm, 1, sizeof(deflate_state));
+ if (s == Z_NULL) return Z_MEM_ERROR;
+ strm->state = (struct internal_state FAR *)s;
+ s->strm = strm;
+
+ s->wrap = wrap;
+ s->gzhead = Z_NULL;
+ s->w_bits = windowBits;
+ s->w_size = 1 << s->w_bits;
+ s->w_mask = s->w_size - 1;
+
+ s->hash_bits = memLevel + 7;
+ s->hash_size = 1 << s->hash_bits;
+ s->hash_mask = s->hash_size - 1;
+ s->hash_shift = ((s->hash_bits+MIN_MATCH-1)/MIN_MATCH);
+
+ s->window = (Bytef *) ZALLOC(strm, s->w_size, 2*sizeof(Byte));
+ s->prev = (Posf *) ZALLOC(strm, s->w_size, sizeof(Pos));
+ s->head = (Posf *) ZALLOC(strm, s->hash_size, sizeof(Pos));
+
+ s->lit_bufsize = 1 << (memLevel + 6); /* 16K elements by default */
+
+ overlay = (ushf *) ZALLOC(strm, s->lit_bufsize, sizeof(ush)+2);
+ s->pending_buf = (uchf *) overlay;
+ s->pending_buf_size = (ulg)s->lit_bufsize * (sizeof(ush)+2L);
+
+ if (s->window == Z_NULL || s->prev == Z_NULL || s->head == Z_NULL ||
+ s->pending_buf == Z_NULL) {
+ s->status = FINISH_STATE;
+ strm->msg = (char*)ERR_MSG(Z_MEM_ERROR);
+ (void) deflateEnd (strm);
+ return Z_MEM_ERROR;
+ }
+ s->d_buf = overlay + s->lit_bufsize/sizeof(ush);
+ s->l_buf = s->pending_buf + (1+sizeof(ush))*s->lit_bufsize;
+
+ s->level = level;
+ s->strategy = strategy;
+ s->method = (Byte)method;
+
+ return deflateReset(strm);
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateSetDictionary (strm, dictionary, dictLength)
+ z_streamp strm;
+ const Bytef *dictionary;
+ uInt dictLength;
+{
+ deflate_state *s;
+ uInt length = dictLength;
+ uInt n;
+ IPos hash_head = 0;
+
+ if (strm == Z_NULL || strm->state == Z_NULL || dictionary == Z_NULL ||
+ strm->state->wrap == 2 ||
+ (strm->state->wrap == 1 && strm->state->status != INIT_STATE))
+ return Z_STREAM_ERROR;
+
+ s = strm->state;
+ if (s->wrap)
+ strm->adler = adler32(strm->adler, dictionary, dictLength);
+
+ if (length < MIN_MATCH) return Z_OK;
+ if (length > MAX_DIST(s)) {
+ length = MAX_DIST(s);
+ dictionary += dictLength - length; /* use the tail of the dictionary */
+ }
+ (void) zmemcpy(s->window, dictionary, length);
+ s->strstart = length;
+ s->block_start = (long)length;
+
+ /* Insert all strings in the hash table (except for the last two bytes).
+ * s->lookahead stays null, so s->ins_h will be recomputed at the next
+ * call of fill_window.
+ */
+ s->ins_h = s->window[0];
+ UPDATE_HASH(s, s->ins_h, s->window[1]);
+ for (n = 0; n <= length - MIN_MATCH; n++) {
+ INSERT_STRING(s, n, hash_head);
+ }
+ if (hash_head) hash_head = 0; /* to make compiler happy */
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateReset (strm)
+ z_streamp strm;
+{
+ deflate_state *s;
+
+ if (strm == Z_NULL || strm->state == Z_NULL ||
+ strm->zalloc == (alloc_func)0 || strm->zfree == (free_func)0) {
+ return Z_STREAM_ERROR;
+ }
+
+ strm->total_in = strm->total_out = 0;
+ strm->msg = Z_NULL; /* use zfree if we ever allocate msg dynamically */
+ strm->data_type = Z_UNKNOWN;
+
+ s = (deflate_state *)strm->state;
+ s->pending = 0;
+ s->pending_out = s->pending_buf;
+
+ if (s->wrap < 0) {
+ s->wrap = -s->wrap; /* was made negative by deflate(..., Z_FINISH); */
+ }
+ s->status = s->wrap ? INIT_STATE : BUSY_STATE;
+ strm->adler =
+#ifdef GZIP
+ s->wrap == 2 ? crc32(0L, Z_NULL, 0) :
+#endif
+ adler32(0L, Z_NULL, 0);
+ s->last_flush = Z_NO_FLUSH;
+
+ _tr_init(s);
+ lm_init(s);
+
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateSetHeader (strm, head)
+ z_streamp strm;
+ gz_headerp head;
+{
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ if (strm->state->wrap != 2) return Z_STREAM_ERROR;
+ strm->state->gzhead = head;
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflatePrime (strm, bits, value)
+ z_streamp strm;
+ int bits;
+ int value;
+{
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ strm->state->bi_valid = bits;
+ strm->state->bi_buf = (ush)(value & ((1 << bits) - 1));
+ return Z_OK;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateParams(strm, level, strategy)
+ z_streamp strm;
+ int level;
+ int strategy;
+{
+ deflate_state *s;
+ compress_func func;
+ int err = Z_OK;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ s = strm->state;
+
+#ifdef FASTEST
+ if (level != 0) level = 1;
+#else
+ if (level == Z_DEFAULT_COMPRESSION) level = 6;
+#endif
+ if (level < 0 || level > 9 || strategy < 0 || strategy > Z_FIXED) {
+ return Z_STREAM_ERROR;
+ }
+ func = configuration_table[s->level].func;
+
+ if (func != configuration_table[level].func && strm->total_in != 0) {
+ /* Flush the last buffer: */
+ err = deflate(strm, Z_PARTIAL_FLUSH);
+ }
+ if (s->level != level) {
+ s->level = level;
+ s->max_lazy_match = configuration_table[level].max_lazy;
+ s->good_match = configuration_table[level].good_length;
+ s->nice_match = configuration_table[level].nice_length;
+ s->max_chain_length = configuration_table[level].max_chain;
+ }
+ s->strategy = strategy;
+ return err;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateTune(strm, good_length, max_lazy, nice_length, max_chain)
+ z_streamp strm;
+ int good_length;
+ int max_lazy;
+ int nice_length;
+ int max_chain;
+{
+ deflate_state *s;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ s = strm->state;
+ s->good_match = good_length;
+ s->max_lazy_match = max_lazy;
+ s->nice_match = nice_length;
+ s->max_chain_length = max_chain;
+ return Z_OK;
+}
+
+/* =========================================================================
+ * For the default windowBits of 15 and memLevel of 8, this function returns
+ * a close to exact, as well as small, upper bound on the compressed size.
+ * They are coded as constants here for a reason--if the #define's are
+ * changed, then this function needs to be changed as well. The return
+ * value for 15 and 8 only works for those exact settings.
+ *
+ * For any setting other than those defaults for windowBits and memLevel,
+ * the value returned is a conservative worst case for the maximum expansion
+ * resulting from using fixed blocks instead of stored blocks, which deflate
+ * can emit on compressed data for some combinations of the parameters.
+ *
+ * This function could be more sophisticated to provide closer upper bounds
+ * for every combination of windowBits and memLevel, as well as wrap.
+ * But even the conservative upper bound of about 14% expansion does not
+ * seem onerous for output buffer allocation.
+ */
+uLong ZEXPORT deflateBound(strm, sourceLen)
+ z_streamp strm;
+ uLong sourceLen;
+{
+ deflate_state *s;
+ uLong destLen;
+
+ /* conservative upper bound */
+ destLen = sourceLen +
+ ((sourceLen + 7) >> 3) + ((sourceLen + 63) >> 6) + 11;
+
+ /* if can't get parameters, return conservative bound */
+ if (strm == Z_NULL || strm->state == Z_NULL)
+ return destLen;
+
+ /* if not default parameters, return conservative bound */
+ s = strm->state;
+ if (s->w_bits != 15 || s->hash_bits != 8 + 7)
+ return destLen;
+
+ /* default settings: return tight bound for that case */
+ return compressBound(sourceLen);
+}
+
+/* =========================================================================
+ * Put a short in the pending buffer. The 16-bit value is put in MSB order.
+ * IN assertion: the stream state is correct and there is enough room in
+ * pending_buf.
+ */
+local void putShortMSB (s, b)
+ deflate_state *s;
+ uInt b;
+{
+ put_byte(s, (Byte)(b >> 8));
+ put_byte(s, (Byte)(b & 0xff));
+}
+
+/* =========================================================================
+ * Flush as much pending output as possible. All deflate() output goes
+ * through this function so some applications may wish to modify it
+ * to avoid allocating a large strm->next_out buffer and copying into it.
+ * (See also read_buf()).
+ */
+local void flush_pending(strm)
+ z_streamp strm;
+{
+ unsigned len = strm->state->pending;
+
+ if (len > strm->avail_out) len = strm->avail_out;
+ if (len == 0) return;
+
+ zmemcpy(strm->next_out, strm->state->pending_out, len);
+ strm->next_out += len;
+ strm->state->pending_out += len;
+ strm->total_out += len;
+ strm->avail_out -= len;
+ strm->state->pending -= len;
+ if (strm->state->pending == 0) {
+ strm->state->pending_out = strm->state->pending_buf;
+ }
+}
+
+/* ========================================================================= */
+int ZEXPORT deflate (strm, flush)
+ z_streamp strm;
+ int flush;
+{
+ int old_flush; /* value of flush param for previous deflate call */
+ deflate_state *s;
+
+ if (strm == Z_NULL || strm->state == Z_NULL ||
+ flush > Z_FINISH || flush < 0) {
+ return Z_STREAM_ERROR;
+ }
+ s = strm->state;
+
+ if (strm->next_out == Z_NULL ||
+ (strm->next_in == Z_NULL && strm->avail_in != 0) ||
+ (s->status == FINISH_STATE && flush != Z_FINISH)) {
+ ERR_RETURN(strm, Z_STREAM_ERROR);
+ }
+ if (strm->avail_out == 0) ERR_RETURN(strm, Z_BUF_ERROR);
+
+ s->strm = strm; /* just in case */
+ old_flush = s->last_flush;
+ s->last_flush = flush;
+
+ /* Write the header */
+ if (s->status == INIT_STATE) {
+#ifdef GZIP
+ if (s->wrap == 2) {
+ strm->adler = crc32(0L, Z_NULL, 0);
+ put_byte(s, 31);
+ put_byte(s, 139);
+ put_byte(s, 8);
+ if (s->gzhead == NULL) {
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, 0);
+ put_byte(s, s->level == 9 ? 2 :
+ (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
+ 4 : 0));
+ put_byte(s, OS_CODE);
+ s->status = BUSY_STATE;
+ }
+ else {
+ put_byte(s, (s->gzhead->text ? 1 : 0) +
+ (s->gzhead->hcrc ? 2 : 0) +
+ (s->gzhead->extra == Z_NULL ? 0 : 4) +
+ (s->gzhead->name == Z_NULL ? 0 : 8) +
+ (s->gzhead->comment == Z_NULL ? 0 : 16)
+ );
+ put_byte(s, (Byte)(s->gzhead->time & 0xff));
+ put_byte(s, (Byte)((s->gzhead->time >> 8) & 0xff));
+ put_byte(s, (Byte)((s->gzhead->time >> 16) & 0xff));
+ put_byte(s, (Byte)((s->gzhead->time >> 24) & 0xff));
+ put_byte(s, s->level == 9 ? 2 :
+ (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2 ?
+ 4 : 0));
+ put_byte(s, s->gzhead->os & 0xff);
+ if (s->gzhead->extra != NULL) {
+ put_byte(s, s->gzhead->extra_len & 0xff);
+ put_byte(s, (s->gzhead->extra_len >> 8) & 0xff);
+ }
+ if (s->gzhead->hcrc)
+ strm->adler = crc32(strm->adler, s->pending_buf,
+ s->pending);
+ s->gzindex = 0;
+ s->status = EXTRA_STATE;
+ }
+ }
+ else
+#endif
+ {
+ uInt header = (Z_DEFLATED + ((s->w_bits-8)<<4)) << 8;
+ uInt level_flags;
+
+ if (s->strategy >= Z_HUFFMAN_ONLY || s->level < 2)
+ level_flags = 0;
+ else if (s->level < 6)
+ level_flags = 1;
+ else if (s->level == 6)
+ level_flags = 2;
+ else
+ level_flags = 3;
+ header |= (level_flags << 6);
+ if (s->strstart != 0) header |= PRESET_DICT;
+ header += 31 - (header % 31);
+
+ s->status = BUSY_STATE;
+ putShortMSB(s, header);
+
+ /* Save the adler32 of the preset dictionary: */
+ if (s->strstart != 0) {
+ putShortMSB(s, (uInt)(strm->adler >> 16));
+ putShortMSB(s, (uInt)(strm->adler & 0xffff));
+ }
+ strm->adler = adler32(0L, Z_NULL, 0);
+ }
+ }
+#ifdef GZIP
+ if (s->status == EXTRA_STATE) {
+ if (s->gzhead->extra != NULL) {
+ uInt beg = s->pending; /* start of bytes to update crc */
+
+ while (s->gzindex < (s->gzhead->extra_len & 0xffff)) {
+ if (s->pending == s->pending_buf_size) {
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ flush_pending(strm);
+ beg = s->pending;
+ if (s->pending == s->pending_buf_size)
+ break;
+ }
+ put_byte(s, s->gzhead->extra[s->gzindex]);
+ s->gzindex++;
+ }
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ if (s->gzindex == s->gzhead->extra_len) {
+ s->gzindex = 0;
+ s->status = NAME_STATE;
+ }
+ }
+ else
+ s->status = NAME_STATE;
+ }
+ if (s->status == NAME_STATE) {
+ if (s->gzhead->name != NULL) {
+ uInt beg = s->pending; /* start of bytes to update crc */
+ int val;
+
+ do {
+ if (s->pending == s->pending_buf_size) {
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ flush_pending(strm);
+ beg = s->pending;
+ if (s->pending == s->pending_buf_size) {
+ val = 1;
+ break;
+ }
+ }
+ val = s->gzhead->name[s->gzindex++];
+ put_byte(s, val);
+ } while (val != 0);
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ if (val == 0) {
+ s->gzindex = 0;
+ s->status = COMMENT_STATE;
+ }
+ }
+ else
+ s->status = COMMENT_STATE;
+ }
+ if (s->status == COMMENT_STATE) {
+ if (s->gzhead->comment != NULL) {
+ uInt beg = s->pending; /* start of bytes to update crc */
+ int val;
+
+ do {
+ if (s->pending == s->pending_buf_size) {
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ flush_pending(strm);
+ beg = s->pending;
+ if (s->pending == s->pending_buf_size) {
+ val = 1;
+ break;
+ }
+ }
+ val = s->gzhead->comment[s->gzindex++];
+ put_byte(s, val);
+ } while (val != 0);
+ if (s->gzhead->hcrc && s->pending > beg)
+ strm->adler = crc32(strm->adler, s->pending_buf + beg,
+ s->pending - beg);
+ if (val == 0)
+ s->status = HCRC_STATE;
+ }
+ else
+ s->status = HCRC_STATE;
+ }
+ if (s->status == HCRC_STATE) {
+ if (s->gzhead->hcrc) {
+ if (s->pending + 2 > s->pending_buf_size)
+ flush_pending(strm);
+ if (s->pending + 2 <= s->pending_buf_size) {
+ put_byte(s, (Byte)(strm->adler & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
+ strm->adler = crc32(0L, Z_NULL, 0);
+ s->status = BUSY_STATE;
+ }
+ }
+ else
+ s->status = BUSY_STATE;
+ }
+#endif
+
+ /* Flush as much pending output as possible */
+ if (s->pending != 0) {
+ flush_pending(strm);
+ if (strm->avail_out == 0) {
+ /* Since avail_out is 0, deflate will be called again with
+ * more output space, but possibly with both pending and
+ * avail_in equal to zero. There won't be anything to do,
+ * but this is not an error situation so make sure we
+ * return OK instead of BUF_ERROR at next call of deflate:
+ */
+ s->last_flush = -1;
+ return Z_OK;
+ }
+
+ /* Make sure there is something to do and avoid duplicate consecutive
+ * flushes. For repeated and useless calls with Z_FINISH, we keep
+ * returning Z_STREAM_END instead of Z_BUF_ERROR.
+ */
+ } else if (strm->avail_in == 0 && flush <= old_flush &&
+ flush != Z_FINISH) {
+ ERR_RETURN(strm, Z_BUF_ERROR);
+ }
+
+ /* User must not provide more input after the first FINISH: */
+ if (s->status == FINISH_STATE && strm->avail_in != 0) {
+ ERR_RETURN(strm, Z_BUF_ERROR);
+ }
+
+ /* Start a new block or continue the current one.
+ */
+ if (strm->avail_in != 0 || s->lookahead != 0 ||
+ (flush != Z_NO_FLUSH && s->status != FINISH_STATE)) {
+ block_state bstate;
+
+ bstate = (*(configuration_table[s->level].func))(s, flush);
+
+ if (bstate == finish_started || bstate == finish_done) {
+ s->status = FINISH_STATE;
+ }
+ if (bstate == need_more || bstate == finish_started) {
+ if (strm->avail_out == 0) {
+ s->last_flush = -1; /* avoid BUF_ERROR next call, see above */
+ }
+ return Z_OK;
+ /* If flush != Z_NO_FLUSH && avail_out == 0, the next call
+ * of deflate should use the same flush parameter to make sure
+ * that the flush is complete. So we don't have to output an
+ * empty block here, this will be done at next call. This also
+ * ensures that for a very small output buffer, we emit at most
+ * one empty block.
+ */
+ }
+ if (bstate == block_done) {
+ if (flush == Z_PARTIAL_FLUSH) {
+ _tr_align(s);
+ } else { /* FULL_FLUSH or SYNC_FLUSH */
+ _tr_stored_block(s, (char*)0, 0L, 0);
+ /* For a full flush, this empty block will be recognized
+ * as a special marker by inflate_sync().
+ */
+ if (flush == Z_FULL_FLUSH) {
+ CLEAR_HASH(s); /* forget history */
+ }
+ }
+ flush_pending(strm);
+ if (strm->avail_out == 0) {
+ s->last_flush = -1; /* avoid BUF_ERROR at next call, see above */
+ return Z_OK;
+ }
+ }
+ }
+ Assert(strm->avail_out > 0, "bug2");
+
+ if (flush != Z_FINISH) return Z_OK;
+ if (s->wrap <= 0) return Z_STREAM_END;
+
+ /* Write the trailer */
+#ifdef GZIP
+ if (s->wrap == 2) {
+ put_byte(s, (Byte)(strm->adler & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 8) & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 16) & 0xff));
+ put_byte(s, (Byte)((strm->adler >> 24) & 0xff));
+ put_byte(s, (Byte)(strm->total_in & 0xff));
+ put_byte(s, (Byte)((strm->total_in >> 8) & 0xff));
+ put_byte(s, (Byte)((strm->total_in >> 16) & 0xff));
+ put_byte(s, (Byte)((strm->total_in >> 24) & 0xff));
+ }
+ else
+#endif
+ {
+ putShortMSB(s, (uInt)(strm->adler >> 16));
+ putShortMSB(s, (uInt)(strm->adler & 0xffff));
+ }
+ flush_pending(strm);
+ /* If avail_out is zero, the application will call deflate again
+ * to flush the rest.
+ */
+ if (s->wrap > 0) s->wrap = -s->wrap; /* write the trailer only once! */
+ return s->pending != 0 ? Z_OK : Z_STREAM_END;
+}
+
+/* ========================================================================= */
+int ZEXPORT deflateEnd (strm)
+ z_streamp strm;
+{
+ int status;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+
+ status = strm->state->status;
+ if (status != INIT_STATE &&
+ status != EXTRA_STATE &&
+ status != NAME_STATE &&
+ status != COMMENT_STATE &&
+ status != HCRC_STATE &&
+ status != BUSY_STATE &&
+ status != FINISH_STATE) {
+ return Z_STREAM_ERROR;
+ }
+
+ /* Deallocate in reverse order of allocations: */
+ TRY_FREE(strm, strm->state->pending_buf);
+ TRY_FREE(strm, strm->state->head);
+ TRY_FREE(strm, strm->state->prev);
+ TRY_FREE(strm, strm->state->window);
+
+ ZFREE(strm, strm->state);
+ strm->state = Z_NULL;
+
+ return status == BUSY_STATE ? Z_DATA_ERROR : Z_OK;
+}
+
+/* =========================================================================
+ * Copy the source state to the destination state.
+ * To simplify the source, this is not supported for 16-bit MSDOS (which
+ * doesn't have enough memory anyway to duplicate compression states).
+ */
+int ZEXPORT deflateCopy (dest, source)
+ z_streamp dest;
+ z_streamp source;
+{
+#ifdef MAXSEG_64K
+ return Z_STREAM_ERROR;
+#else
+ deflate_state *ds;
+ deflate_state *ss;
+ ushf *overlay;
+
+
+ if (source == Z_NULL || dest == Z_NULL || source->state == Z_NULL) {
+ return Z_STREAM_ERROR;
+ }
+
+ ss = source->state;
+
+ zmemcpy(dest, source, sizeof(z_stream));
+
+ ds = (deflate_state *) ZALLOC(dest, 1, sizeof(deflate_state));
+ if (ds == Z_NULL) return Z_MEM_ERROR;
+ dest->state = (struct internal_state FAR *) ds;
+ zmemcpy(ds, ss, sizeof(deflate_state));
+ ds->strm = dest;
+
+ ds->window = (Bytef *) ZALLOC(dest, ds->w_size, 2*sizeof(Byte));
+ ds->prev = (Posf *) ZALLOC(dest, ds->w_size, sizeof(Pos));
+ ds->head = (Posf *) ZALLOC(dest, ds->hash_size, sizeof(Pos));
+ overlay = (ushf *) ZALLOC(dest, ds->lit_bufsize, sizeof(ush)+2);
+ ds->pending_buf = (uchf *) overlay;
+
+ if (ds->window == Z_NULL || ds->prev == Z_NULL || ds->head == Z_NULL ||
+ ds->pending_buf == Z_NULL) {
+ deflateEnd (dest);
+ return Z_MEM_ERROR;
+ }
+ /* following zmemcpy do not work for 16-bit MSDOS */
+ zmemcpy(ds->window, ss->window, ds->w_size * 2 * sizeof(Byte));
+ zmemcpy(ds->prev, ss->prev, ds->w_size * sizeof(Pos));
+ zmemcpy(ds->head, ss->head, ds->hash_size * sizeof(Pos));
+ zmemcpy(ds->pending_buf, ss->pending_buf, (uInt)ds->pending_buf_size);
+
+ ds->pending_out = ds->pending_buf + (ss->pending_out - ss->pending_buf);
+ ds->d_buf = overlay + ds->lit_bufsize/sizeof(ush);
+ ds->l_buf = ds->pending_buf + (1+sizeof(ush))*ds->lit_bufsize;
+
+ ds->l_desc.dyn_tree = ds->dyn_ltree;
+ ds->d_desc.dyn_tree = ds->dyn_dtree;
+ ds->bl_desc.dyn_tree = ds->bl_tree;
+
+ return Z_OK;
+#endif /* MAXSEG_64K */
+}
+
+/* ===========================================================================
+ * Read a new buffer from the current input stream, update the adler32
+ * and total number of bytes read. All deflate() input goes through
+ * this function so some applications may wish to modify it to avoid
+ * allocating a large strm->next_in buffer and copying from it.
+ * (See also flush_pending()).
+ */
+local int read_buf(strm, buf, size)
+ z_streamp strm;
+ Bytef *buf;
+ unsigned size;
+{
+ unsigned len = strm->avail_in;
+
+ if (len > size) len = size;
+ if (len == 0) return 0;
+
+ strm->avail_in -= len;
+
+ if (strm->state->wrap == 1) {
+ strm->adler = adler32(strm->adler, strm->next_in, len);
+ }
+#ifdef GZIP
+ else if (strm->state->wrap == 2) {
+ strm->adler = crc32(strm->adler, strm->next_in, len);
+ }
+#endif
+ zmemcpy(buf, strm->next_in, len);
+ strm->next_in += len;
+ strm->total_in += len;
+
+ return (int)len;
+}
+
+/* ===========================================================================
+ * Initialize the "longest match" routines for a new zlib stream
+ */
+local void lm_init (s)
+ deflate_state *s;
+{
+ s->window_size = (ulg)2L*s->w_size;
+
+ CLEAR_HASH(s);
+
+ /* Set the default configuration parameters:
+ */
+ s->max_lazy_match = configuration_table[s->level].max_lazy;
+ s->good_match = configuration_table[s->level].good_length;
+ s->nice_match = configuration_table[s->level].nice_length;
+ s->max_chain_length = configuration_table[s->level].max_chain;
+
+ s->strstart = 0;
+ s->block_start = 0L;
+ s->lookahead = 0;
+ s->match_length = s->prev_length = MIN_MATCH-1;
+ s->match_available = 0;
+ s->ins_h = 0;
+#ifndef FASTEST
+#ifdef ASMV
+ match_init(); /* initialize the asm code */
+#endif
+#endif
+}
+
+#ifndef FASTEST
+/* ===========================================================================
+ * Set match_start to the longest match starting at the given string and
+ * return its length. Matches shorter or equal to prev_length are discarded,
+ * in which case the result is equal to prev_length and match_start is
+ * garbage.
+ * IN assertions: cur_match is the head of the hash chain for the current
+ * string (strstart) and its distance is <= MAX_DIST, and prev_length >= 1
+ * OUT assertion: the match length is not greater than s->lookahead.
+ */
+#ifndef ASMV
+/* For 80x86 and 680x0, an optimized version will be provided in match.asm or
+ * match.S. The code will be functionally equivalent.
+ */
+local uInt longest_match(s, cur_match)
+ deflate_state *s;
+ IPos cur_match; /* current match */
+{
+ unsigned chain_length = s->max_chain_length;/* max hash chain length */
+ register Bytef *scan = s->window + s->strstart; /* current string */
+ register Bytef *match; /* matched string */
+ register int len; /* length of current match */
+ int best_len = s->prev_length; /* best match length so far */
+ int nice_match = s->nice_match; /* stop if match long enough */
+ IPos limit = s->strstart > (IPos)MAX_DIST(s) ?
+ s->strstart - (IPos)MAX_DIST(s) : NIL;
+ /* Stop when cur_match becomes <= limit. To simplify the code,
+ * we prevent matches with the string of window index 0.
+ */
+ Posf *prev = s->prev;
+ uInt wmask = s->w_mask;
+
+#ifdef UNALIGNED_OK
+ /* Compare two bytes at a time. Note: this is not always beneficial.
+ * Try with and without -DUNALIGNED_OK to check.
+ */
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH - 1;
+ register ush scan_start = *(ushf*)scan;
+ register ush scan_end = *(ushf*)(scan+best_len-1);
+#else
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+ register Byte scan_end1 = scan[best_len-1];
+ register Byte scan_end = scan[best_len];
+#endif
+
+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+ * It is easy to get rid of this optimization if necessary.
+ */
+ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+ /* Do not waste too much time if we already have a good match: */
+ if (s->prev_length >= s->good_match) {
+ chain_length >>= 2;
+ }
+ /* Do not look for matches beyond the end of the input. This is necessary
+ * to make deflate deterministic.
+ */
+ if ((uInt)nice_match > s->lookahead) nice_match = s->lookahead;
+
+ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+ do {
+ Assert(cur_match < s->strstart, "no future");
+ match = s->window + cur_match;
+
+ /* Skip to next match if the match length cannot increase
+ * or if the match length is less than 2. Note that the checks below
+ * for insufficient lookahead only occur occasionally for performance
+ * reasons. Therefore uninitialized memory will be accessed, and
+ * conditional jumps will be made that depend on those values.
+ * However the length of the match is limited to the lookahead, so
+ * the output of deflate is not affected by the uninitialized values.
+ */
+#if (defined(UNALIGNED_OK) && MAX_MATCH == 258)
+ /* This code assumes sizeof(unsigned short) == 2. Do not use
+ * UNALIGNED_OK if your compiler uses a different size.
+ */
+ if (*(ushf*)(match+best_len-1) != scan_end ||
+ *(ushf*)match != scan_start) continue;
+
+ /* It is not necessary to compare scan[2] and match[2] since they are
+ * always equal when the other bytes match, given that the hash keys
+ * are equal and that HASH_BITS >= 8. Compare 2 bytes at a time at
+ * strstart+3, +5, ... up to strstart+257. We check for insufficient
+ * lookahead only every 4th comparison; the 128th check will be made
+ * at strstart+257. If MAX_MATCH-2 is not a multiple of 8, it is
+ * necessary to put more guard bytes at the end of the window, or
+ * to check more often for insufficient lookahead.
+ */
+ Assert(scan[2] == match[2], "scan[2]?");
+ scan++, match++;
+ do {
+ } while (*(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ *(ushf*)(scan+=2) == *(ushf*)(match+=2) &&
+ scan < strend);
+ /* The funny "do {}" generates better code on most compilers */
+
+ /* Here, scan <= window+strstart+257 */
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+ if (*scan == *match) scan++;
+
+ len = (MAX_MATCH - 1) - (int)(strend-scan);
+ scan = strend - (MAX_MATCH-1);
+
+#else /* UNALIGNED_OK */
+
+ if (match[best_len] != scan_end ||
+ match[best_len-1] != scan_end1 ||
+ *match != *scan ||
+ *++match != scan[1]) continue;
+
+ /* The check at best_len-1 can be removed because it will be made
+ * again later. (This heuristic is not always a win.)
+ * It is not necessary to compare scan[2] and match[2] since they
+ * are always equal when the other bytes match, given that
+ * the hash keys are equal and that HASH_BITS >= 8.
+ */
+ scan += 2, match++;
+ Assert(*scan == *match, "match[2]?");
+
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
+
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+ len = MAX_MATCH - (int)(strend - scan);
+ scan = strend - MAX_MATCH;
+
+#endif /* UNALIGNED_OK */
+
+ if (len > best_len) {
+ s->match_start = cur_match;
+ best_len = len;
+ if (len >= nice_match) break;
+#ifdef UNALIGNED_OK
+ scan_end = *(ushf*)(scan+best_len-1);
+#else
+ scan_end1 = scan[best_len-1];
+ scan_end = scan[best_len];
+#endif
+ }
+ } while ((cur_match = prev[cur_match & wmask]) > limit
+ && --chain_length != 0);
+
+ if ((uInt)best_len <= s->lookahead) return (uInt)best_len;
+ return s->lookahead;
+}
+#endif /* ASMV */
+#endif /* FASTEST */
+
+/* ---------------------------------------------------------------------------
+ * Optimized version for level == 1 or strategy == Z_RLE only
+ */
+local uInt longest_match_fast(s, cur_match)
+ deflate_state *s;
+ IPos cur_match; /* current match */
+{
+ register Bytef *scan = s->window + s->strstart; /* current string */
+ register Bytef *match; /* matched string */
+ register int len; /* length of current match */
+ register Bytef *strend = s->window + s->strstart + MAX_MATCH;
+
+ /* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
+ * It is easy to get rid of this optimization if necessary.
+ */
+ Assert(s->hash_bits >= 8 && MAX_MATCH == 258, "Code too clever");
+
+ Assert((ulg)s->strstart <= s->window_size-MIN_LOOKAHEAD, "need lookahead");
+
+ Assert(cur_match < s->strstart, "no future");
+
+ match = s->window + cur_match;
+
+ /* Return failure if the match length is less than 2:
+ */
+ if (match[0] != scan[0] || match[1] != scan[1]) return MIN_MATCH-1;
+
+ /* The check at best_len-1 can be removed because it will be made
+ * again later. (This heuristic is not always a win.)
+ * It is not necessary to compare scan[2] and match[2] since they
+ * are always equal when the other bytes match, given that
+ * the hash keys are equal and that HASH_BITS >= 8.
+ */
+ scan += 2, match += 2;
+ Assert(*scan == *match, "match[2]?");
+
+ /* We check for insufficient lookahead only every 8th comparison;
+ * the 256th check will be made at strstart+258.
+ */
+ do {
+ } while (*++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ *++scan == *++match && *++scan == *++match &&
+ scan < strend);
+
+ Assert(scan <= s->window+(unsigned)(s->window_size-1), "wild scan");
+
+ len = MAX_MATCH - (int)(strend - scan);
+
+ if (len < MIN_MATCH) return MIN_MATCH - 1;
+
+ s->match_start = cur_match;
+ return (uInt)len <= s->lookahead ? (uInt)len : s->lookahead;
+}
+
+#ifdef DEBUG
+/* ===========================================================================
+ * Check that the match at match_start is indeed a match.
+ */
+local void check_match(s, start, match, length)
+ deflate_state *s;
+ IPos start, match;
+ int length;
+{
+ /* check that the match is indeed a match */
+ if (zmemcmp(s->window + match,
+ s->window + start, length) != EQUAL) {
+ fprintf(stderr, " start %u, match %u, length %d\n",
+ start, match, length);
+ do {
+ fprintf(stderr, "%c%c", s->window[match++], s->window[start++]);
+ } while (--length != 0);
+ z_error("invalid match");
+ }
+ if (z_verbose > 1) {
+ fprintf(stderr,"\\[%d,%d]", start-match, length);
+ do { putc(s->window[start++], stderr); } while (--length != 0);
+ }
+}
+#else
+# define check_match(s, start, match, length)
+#endif /* DEBUG */
+
+/* ===========================================================================
+ * Fill the window when the lookahead becomes insufficient.
+ * Updates strstart and lookahead.
+ *
+ * IN assertion: lookahead < MIN_LOOKAHEAD
+ * OUT assertions: strstart <= window_size-MIN_LOOKAHEAD
+ * At least one byte has been read, or avail_in == 0; reads are
+ * performed for at least two bytes (required for the zip translate_eol
+ * option -- not supported here).
+ */
+local void fill_window(s)
+ deflate_state *s;
+{
+ register unsigned n, m;
+ register Posf *p;
+ unsigned more; /* Amount of free space at the end of the window. */
+ uInt wsize = s->w_size;
+
+ do {
+ more = (unsigned)(s->window_size -(ulg)s->lookahead -(ulg)s->strstart);
+
+ /* Deal with !@#$% 64K limit: */
+ if (sizeof(int) <= 2) {
+ if (more == 0 && s->strstart == 0 && s->lookahead == 0) {
+ more = wsize;
+
+ } else if (more == (unsigned)(-1)) {
+ /* Very unlikely, but possible on 16 bit machine if
+ * strstart == 0 && lookahead == 1 (input done a byte at time)
+ */
+ more--;
+ }
+ }
+
+ /* If the window is almost full and there is insufficient lookahead,
+ * move the upper half to the lower one to make room in the upper half.
+ */
+ if (s->strstart >= wsize+MAX_DIST(s)) {
+
+ zmemcpy(s->window, s->window+wsize, (unsigned)wsize);
+ s->match_start -= wsize;
+ s->strstart -= wsize; /* we now have strstart >= MAX_DIST */
+ s->block_start -= (long) wsize;
+
+ /* Slide the hash table (could be avoided with 32 bit values
+ at the expense of memory usage). We slide even when level == 0
+ to keep the hash table consistent if we switch back to level > 0
+ later. (Using level 0 permanently is not an optimal usage of
+ zlib, so we don't care about this pathological case.)
+ */
+ /* %%% avoid this when Z_RLE */
+ n = s->hash_size;
+ p = &s->head[n];
+ do {
+ m = *--p;
+ *p = (Pos)(m >= wsize ? m-wsize : NIL);
+ } while (--n);
+
+ n = wsize;
+#ifndef FASTEST
+ p = &s->prev[n];
+ do {
+ m = *--p;
+ *p = (Pos)(m >= wsize ? m-wsize : NIL);
+ /* If n is not on any hash chain, prev[n] is garbage but
+ * its value will never be used.
+ */
+ } while (--n);
+#endif
+ more += wsize;
+ }
+ if (s->strm->avail_in == 0) return;
+
+ /* If there was no sliding:
+ * strstart <= WSIZE+MAX_DIST-1 && lookahead <= MIN_LOOKAHEAD - 1 &&
+ * more == window_size - lookahead - strstart
+ * => more >= window_size - (MIN_LOOKAHEAD-1 + WSIZE + MAX_DIST-1)
+ * => more >= window_size - 2*WSIZE + 2
+ * In the BIG_MEM or MMAP case (not yet supported),
+ * window_size == input_size + MIN_LOOKAHEAD &&
+ * strstart + s->lookahead <= input_size => more >= MIN_LOOKAHEAD.
+ * Otherwise, window_size == 2*WSIZE so more >= 2.
+ * If there was sliding, more >= WSIZE. So in all cases, more >= 2.
+ */
+ Assert(more >= 2, "more < 2");
+
+ n = read_buf(s->strm, s->window + s->strstart + s->lookahead, more);
+ s->lookahead += n;
+
+ /* Initialize the hash value now that we have some input: */
+ if (s->lookahead >= MIN_MATCH) {
+ s->ins_h = s->window[s->strstart];
+ UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+#if MIN_MATCH != 3
+ Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+ }
+ /* If the whole input has less than MIN_MATCH bytes, ins_h is garbage,
+ * but this is not important since only literal bytes will be emitted.
+ */
+
+ } while (s->lookahead < MIN_LOOKAHEAD && s->strm->avail_in != 0);
+}
+
+/* ===========================================================================
+ * Flush the current block, with given end-of-file flag.
+ * IN assertion: strstart is set to the end of the current match.
+ */
+#define FLUSH_BLOCK_ONLY(s, eof) { \
+ _tr_flush_block(s, (s->block_start >= 0L ? \
+ (charf *)&s->window[(unsigned)s->block_start] : \
+ (charf *)Z_NULL), \
+ (ulg)((long)s->strstart - s->block_start), \
+ (eof)); \
+ s->block_start = s->strstart; \
+ flush_pending(s->strm); \
+ Tracev((stderr,"[FLUSH]")); \
+}
+
+/* Same but force premature exit if necessary. */
+#define FLUSH_BLOCK(s, eof) { \
+ FLUSH_BLOCK_ONLY(s, eof); \
+ if (s->strm->avail_out == 0) return (eof) ? finish_started : need_more; \
+}
+
+/* ===========================================================================
+ * Copy without compression as much as possible from the input stream, return
+ * the current block state.
+ * This function does not insert new strings in the dictionary since
+ * uncompressible data is probably not useful. This function is used
+ * only for the level=0 compression option.
+ * NOTE: this function should be optimized to avoid extra copying from
+ * window to pending_buf.
+ */
+local block_state deflate_stored(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ /* Stored blocks are limited to 0xffff bytes, pending_buf is limited
+ * to pending_buf_size, and each stored block has a 5 byte header:
+ */
+ ulg max_block_size = 0xffff;
+ ulg max_start;
+
+ if (max_block_size > s->pending_buf_size - 5) {
+ max_block_size = s->pending_buf_size - 5;
+ }
+
+ /* Copy as much as possible from input to output: */
+ for (;;) {
+ /* Fill the window as much as possible: */
+ if (s->lookahead <= 1) {
+
+ Assert(s->strstart < s->w_size+MAX_DIST(s) ||
+ s->block_start >= (long)s->w_size, "slide too late");
+
+ fill_window(s);
+ if (s->lookahead == 0 && flush == Z_NO_FLUSH) return need_more;
+
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+ Assert(s->block_start >= 0L, "block gone");
+
+ s->strstart += s->lookahead;
+ s->lookahead = 0;
+
+ /* Emit a stored block if pending_buf will be full: */
+ max_start = s->block_start + max_block_size;
+ if (s->strstart == 0 || (ulg)s->strstart >= max_start) {
+ /* strstart == 0 is possible when wraparound on 16-bit machine */
+ s->lookahead = (uInt)(s->strstart - max_start);
+ s->strstart = (uInt)max_start;
+ FLUSH_BLOCK(s, 0);
+ }
+ /* Flush if we may have to slide, otherwise block_start may become
+ * negative and the data will be gone:
+ */
+ if (s->strstart - (uInt)s->block_start >= MAX_DIST(s)) {
+ FLUSH_BLOCK(s, 0);
+ }
+ }
+ FLUSH_BLOCK(s, flush == Z_FINISH);
+ return flush == Z_FINISH ? finish_done : block_done;
+}
+
+/* ===========================================================================
+ * Compress as much as possible from the input stream, return the current
+ * block state.
+ * This function does not perform lazy evaluation of matches and inserts
+ * new strings in the dictionary only for unmatched strings or for short
+ * matches. It is used only for the fast compression options.
+ */
+local block_state deflate_fast(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ IPos hash_head = NIL; /* head of the hash chain */
+ int bflush; /* set if current block must be flushed */
+
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the next match, plus MIN_MATCH bytes to insert the
+ * string following the next match.
+ */
+ if (s->lookahead < MIN_LOOKAHEAD) {
+ fill_window(s);
+ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* Insert the string window[strstart .. strstart+2] in the
+ * dictionary, and set hash_head to the head of the hash chain:
+ */
+ if (s->lookahead >= MIN_MATCH) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+
+ /* Find the longest match, discarding those <= prev_length.
+ * At this point we have always match_length < MIN_MATCH
+ */
+ if (hash_head != NIL && s->strstart - hash_head <= MAX_DIST(s)) {
+ /* To simplify the code, we prevent matches with the string
+ * of window index 0 (in particular we have to avoid a match
+ * of the string with itself at the start of the input file).
+ */
+#ifdef FASTEST
+ if ((s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) ||
+ (s->strategy == Z_RLE && s->strstart - hash_head == 1)) {
+ s->match_length = longest_match_fast (s, hash_head);
+ }
+#else
+ if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) {
+ s->match_length = longest_match (s, hash_head);
+ } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) {
+ s->match_length = longest_match_fast (s, hash_head);
+ }
+#endif
+ /* longest_match() or longest_match_fast() sets match_start */
+ }
+ if (s->match_length >= MIN_MATCH) {
+ check_match(s, s->strstart, s->match_start, s->match_length);
+
+ _tr_tally_dist(s, s->strstart - s->match_start,
+ s->match_length - MIN_MATCH, bflush);
+
+ s->lookahead -= s->match_length;
+
+ /* Insert new strings in the hash table only if the match length
+ * is not too large. This saves time but degrades compression.
+ */
+#ifndef FASTEST
+ if (s->match_length <= s->max_insert_length &&
+ s->lookahead >= MIN_MATCH) {
+ s->match_length--; /* string at strstart already in table */
+ do {
+ s->strstart++;
+ INSERT_STRING(s, s->strstart, hash_head);
+ /* strstart never exceeds WSIZE-MAX_MATCH, so there are
+ * always MIN_MATCH bytes ahead.
+ */
+ } while (--s->match_length != 0);
+ s->strstart++;
+ } else
+#endif
+ {
+ s->strstart += s->match_length;
+ s->match_length = 0;
+ s->ins_h = s->window[s->strstart];
+ UPDATE_HASH(s, s->ins_h, s->window[s->strstart+1]);
+#if MIN_MATCH != 3
+ Call UPDATE_HASH() MIN_MATCH-3 more times
+#endif
+ /* If lookahead < MIN_MATCH, ins_h is garbage, but it does not
+ * matter since it will be recomputed at next deflate call.
+ */
+ }
+ } else {
+ /* No match, output a literal byte */
+ Tracevv((stderr,"%c", s->window[s->strstart]));
+ _tr_tally_lit (s, s->window[s->strstart], bflush);
+ s->lookahead--;
+ s->strstart++;
+ }
+ if (bflush) FLUSH_BLOCK(s, 0);
+ }
+ FLUSH_BLOCK(s, flush == Z_FINISH);
+ return flush == Z_FINISH ? finish_done : block_done;
+}
+
+#ifndef FASTEST
+/* ===========================================================================
+ * Same as above, but achieves better compression. We use a lazy
+ * evaluation for matches: a match is finally adopted only if there is
+ * no better match at the next window position.
+ */
+local block_state deflate_slow(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ IPos hash_head = NIL; /* head of hash chain */
+ int bflush; /* set if current block must be flushed */
+
+ /* Process the input block. */
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the next match, plus MIN_MATCH bytes to insert the
+ * string following the next match.
+ */
+ if (s->lookahead < MIN_LOOKAHEAD) {
+ fill_window(s);
+ if (s->lookahead < MIN_LOOKAHEAD && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* Insert the string window[strstart .. strstart+2] in the
+ * dictionary, and set hash_head to the head of the hash chain:
+ */
+ if (s->lookahead >= MIN_MATCH) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+
+ /* Find the longest match, discarding those <= prev_length.
+ */
+ s->prev_length = s->match_length, s->prev_match = s->match_start;
+ s->match_length = MIN_MATCH-1;
+
+ if (hash_head != NIL && s->prev_length < s->max_lazy_match &&
+ s->strstart - hash_head <= MAX_DIST(s)) {
+ /* To simplify the code, we prevent matches with the string
+ * of window index 0 (in particular we have to avoid a match
+ * of the string with itself at the start of the input file).
+ */
+ if (s->strategy != Z_HUFFMAN_ONLY && s->strategy != Z_RLE) {
+ s->match_length = longest_match (s, hash_head);
+ } else if (s->strategy == Z_RLE && s->strstart - hash_head == 1) {
+ s->match_length = longest_match_fast (s, hash_head);
+ }
+ /* longest_match() or longest_match_fast() sets match_start */
+
+ if (s->match_length <= 5 && (s->strategy == Z_FILTERED
+#if TOO_FAR <= 32767
+ || (s->match_length == MIN_MATCH &&
+ s->strstart - s->match_start > TOO_FAR)
+#endif
+ )) {
+
+ /* If prev_match is also MIN_MATCH, match_start is garbage
+ * but we will ignore the current match anyway.
+ */
+ s->match_length = MIN_MATCH-1;
+ }
+ }
+ /* If there was a match at the previous step and the current
+ * match is not better, output the previous match:
+ */
+ if (s->prev_length >= MIN_MATCH && s->match_length <= s->prev_length) {
+ uInt max_insert = s->strstart + s->lookahead - MIN_MATCH;
+ /* Do not insert strings in hash table beyond this. */
+
+ check_match(s, s->strstart-1, s->prev_match, s->prev_length);
+
+ _tr_tally_dist(s, s->strstart -1 - s->prev_match,
+ s->prev_length - MIN_MATCH, bflush);
+
+ /* Insert in hash table all strings up to the end of the match.
+ * strstart-1 and strstart are already inserted. If there is not
+ * enough lookahead, the last two strings are not inserted in
+ * the hash table.
+ */
+ s->lookahead -= s->prev_length-1;
+ s->prev_length -= 2;
+ do {
+ if (++s->strstart <= max_insert) {
+ INSERT_STRING(s, s->strstart, hash_head);
+ }
+ } while (--s->prev_length != 0);
+ s->match_available = 0;
+ s->match_length = MIN_MATCH-1;
+ s->strstart++;
+
+ if (bflush) FLUSH_BLOCK(s, 0);
+
+ } else if (s->match_available) {
+ /* If there was no match at the previous position, output a
+ * single literal. If there was a match but the current match
+ * is longer, truncate the previous match to a single literal.
+ */
+ Tracevv((stderr,"%c", s->window[s->strstart-1]));
+ _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+ if (bflush) {
+ FLUSH_BLOCK_ONLY(s, 0);
+ }
+ s->strstart++;
+ s->lookahead--;
+ if (s->strm->avail_out == 0) return need_more;
+ } else {
+ /* There is no previous match to compare with, wait for
+ * the next step to decide.
+ */
+ s->match_available = 1;
+ s->strstart++;
+ s->lookahead--;
+ }
+ }
+ Assert (flush != Z_NO_FLUSH, "no flush?");
+ if (s->match_available) {
+ Tracevv((stderr,"%c", s->window[s->strstart-1]));
+ _tr_tally_lit(s, s->window[s->strstart-1], bflush);
+ s->match_available = 0;
+ }
+ FLUSH_BLOCK(s, flush == Z_FINISH);
+ return flush == Z_FINISH ? finish_done : block_done;
+}
+#endif /* FASTEST */
+
+#if 0
+/* ===========================================================================
+ * For Z_RLE, simply look for runs of bytes, generate matches only of distance
+ * one. Do not maintain a hash table. (It will be regenerated if this run of
+ * deflate switches away from Z_RLE.)
+ */
+local block_state deflate_rle(s, flush)
+ deflate_state *s;
+ int flush;
+{
+ int bflush; /* set if current block must be flushed */
+ uInt run; /* length of run */
+ uInt max; /* maximum length of run */
+ uInt prev; /* byte at distance one to match */
+ Bytef *scan; /* scan for end of run */
+
+ for (;;) {
+ /* Make sure that we always have enough lookahead, except
+ * at the end of the input file. We need MAX_MATCH bytes
+ * for the longest encodable run.
+ */
+ if (s->lookahead < MAX_MATCH) {
+ fill_window(s);
+ if (s->lookahead < MAX_MATCH && flush == Z_NO_FLUSH) {
+ return need_more;
+ }
+ if (s->lookahead == 0) break; /* flush the current block */
+ }
+
+ /* See how many times the previous byte repeats */
+ run = 0;
+ if (s->strstart > 0) { /* if there is a previous byte, that is */
+ max = s->lookahead < MAX_MATCH ? s->lookahead : MAX_MATCH;
+ scan = s->window + s->strstart - 1;
+ prev = *scan++;
+ do {
+ if (*scan++ != prev)
+ break;
+ } while (++run < max);
+ }
+
+ /* Emit match if have run of MIN_MATCH or longer, else emit literal */
+ if (run >= MIN_MATCH) {
+ check_match(s, s->strstart, s->strstart - 1, run);
+ _tr_tally_dist(s, 1, run - MIN_MATCH, bflush);
+ s->lookahead -= run;
+ s->strstart += run;
+ } else {
+ /* No match, output a literal byte */
+ Tracevv((stderr,"%c", s->window[s->strstart]));
+ _tr_tally_lit (s, s->window[s->strstart], bflush);
+ s->lookahead--;
+ s->strstart++;
+ }
+ if (bflush) FLUSH_BLOCK(s, 0);
+ }
+ FLUSH_BLOCK(s, flush == Z_FINISH);
+ return flush == Z_FINISH ? finish_done : block_done;
+}
+#endif
diff --git a/sys/contrib/opensolaris/uts/common/zmod/deflate.h b/sys/contrib/opensolaris/uts/common/zmod/deflate.h
new file mode 100644
index 0000000..d01a3c1
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/deflate.h
@@ -0,0 +1,331 @@
+/* deflate.h -- internal compression state
+ * Copyright (C) 1995-2004 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+#ifndef _DEFLATE_H
+#define _DEFLATE_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "zutil.h"
+
+/* define NO_GZIP when compiling if you want to disable gzip header and
+ trailer creation by deflate(). NO_GZIP would be used to avoid linking in
+ the crc code when it is not needed. For shared libraries, gzip encoding
+ should be left enabled. */
+#ifndef NO_GZIP
+# define GZIP
+#endif
+
+/* ===========================================================================
+ * Internal compression state.
+ */
+
+#define LENGTH_CODES 29
+/* number of length codes, not counting the special END_BLOCK code */
+
+#define LITERALS 256
+/* number of literal bytes 0..255 */
+
+#define L_CODES (LITERALS+1+LENGTH_CODES)
+/* number of Literal or Length codes, including the END_BLOCK code */
+
+#define D_CODES 30
+/* number of distance codes */
+
+#define BL_CODES 19
+/* number of codes used to transfer the bit lengths */
+
+#define HEAP_SIZE (2*L_CODES+1)
+/* maximum heap size */
+
+#define MAX_BITS 15
+/* All codes must not exceed MAX_BITS bits */
+
+#define INIT_STATE 42
+#define EXTRA_STATE 69
+#define NAME_STATE 73
+#define COMMENT_STATE 91
+#define HCRC_STATE 103
+#define BUSY_STATE 113
+#define FINISH_STATE 666
+/* Stream status */
+
+
+/* Data structure describing a single value and its code string. */
+typedef struct ct_data_s {
+ union {
+ ush freq; /* frequency count */
+ ush code; /* bit string */
+ } fc;
+ union {
+ ush dad; /* father node in Huffman tree */
+ ush len; /* length of bit string */
+ } dl;
+} FAR ct_data;
+
+#define Freq fc.freq
+#define Code fc.code
+#define Dad dl.dad
+#define Len dl.len
+
+typedef struct static_tree_desc_s static_tree_desc;
+
+typedef struct tree_desc_s {
+ ct_data *dyn_tree; /* the dynamic tree */
+ int max_code; /* largest code with non zero frequency */
+ static_tree_desc *stat_desc; /* the corresponding static tree */
+} FAR tree_desc;
+
+typedef ush Pos;
+typedef Pos FAR Posf;
+typedef unsigned IPos;
+
+/* A Pos is an index in the character window. We use short instead of int to
+ * save space in the various tables. IPos is used only for parameter passing.
+ */
+
+typedef struct internal_state {
+ z_streamp strm; /* pointer back to this zlib stream */
+ int status; /* as the name implies */
+ Bytef *pending_buf; /* output still pending */
+ ulg pending_buf_size; /* size of pending_buf */
+ Bytef *pending_out; /* next pending byte to output to the stream */
+ uInt pending; /* nb of bytes in the pending buffer */
+ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
+ gz_headerp gzhead; /* gzip header information to write */
+ uInt gzindex; /* where in extra, name, or comment */
+ Byte method; /* STORED (for zip only) or DEFLATED */
+ int last_flush; /* value of flush param for previous deflate call */
+
+ /* used by deflate.c: */
+
+ uInt w_size; /* LZ77 window size (32K by default) */
+ uInt w_bits; /* log2(w_size) (8..16) */
+ uInt w_mask; /* w_size - 1 */
+
+ Bytef *window;
+ /* Sliding window. Input bytes are read into the second half of the window,
+ * and move to the first half later to keep a dictionary of at least wSize
+ * bytes. With this organization, matches are limited to a distance of
+ * wSize-MAX_MATCH bytes, but this ensures that IO is always
+ * performed with a length multiple of the block size. Also, it limits
+ * the window size to 64K, which is quite useful on MSDOS.
+ * To do: use the user input buffer as sliding window.
+ */
+
+ ulg window_size;
+ /* Actual size of window: 2*wSize, except when the user input buffer
+ * is directly used as sliding window.
+ */
+
+ Posf *prev;
+ /* Link to older string with same hash index. To limit the size of this
+ * array to 64K, this link is maintained only for the last 32K strings.
+ * An index in this array is thus a window index modulo 32K.
+ */
+
+ Posf *head; /* Heads of the hash chains or NIL. */
+
+ uInt ins_h; /* hash index of string to be inserted */
+ uInt hash_size; /* number of elements in hash table */
+ uInt hash_bits; /* log2(hash_size) */
+ uInt hash_mask; /* hash_size-1 */
+
+ uInt hash_shift;
+ /* Number of bits by which ins_h must be shifted at each input
+ * step. It must be such that after MIN_MATCH steps, the oldest
+ * byte no longer takes part in the hash key, that is:
+ * hash_shift * MIN_MATCH >= hash_bits
+ */
+
+ long block_start;
+ /* Window position at the beginning of the current output block. Gets
+ * negative when the window is moved backwards.
+ */
+
+ uInt match_length; /* length of best match */
+ IPos prev_match; /* previous match */
+ int match_available; /* set if previous match exists */
+ uInt strstart; /* start of string to insert */
+ uInt match_start; /* start of matching string */
+ uInt lookahead; /* number of valid bytes ahead in window */
+
+ uInt prev_length;
+ /* Length of the best match at previous step. Matches not greater than this
+ * are discarded. This is used in the lazy match evaluation.
+ */
+
+ uInt max_chain_length;
+ /* To speed up deflation, hash chains are never searched beyond this
+ * length. A higher limit improves compression ratio but degrades the
+ * speed.
+ */
+
+ uInt max_lazy_match;
+ /* Attempt to find a better match only when the current match is strictly
+ * smaller than this value. This mechanism is used only for compression
+ * levels >= 4.
+ */
+# define max_insert_length max_lazy_match
+ /* Insert new strings in the hash table only if the match length is not
+ * greater than this length. This saves time but degrades compression.
+ * max_insert_length is used only for compression levels <= 3.
+ */
+
+ int level; /* compression level (1..9) */
+ int strategy; /* favor or force Huffman coding*/
+
+ uInt good_match;
+ /* Use a faster search when the previous match is longer than this */
+
+ int nice_match; /* Stop searching when current match exceeds this */
+
+ /* used by trees.c: */
+ /* Didn't use ct_data typedef below to supress compiler warning */
+ struct ct_data_s dyn_ltree[HEAP_SIZE]; /* literal and length tree */
+ struct ct_data_s dyn_dtree[2*D_CODES+1]; /* distance tree */
+ struct ct_data_s bl_tree[2*BL_CODES+1]; /* Huffman tree for bit lengths */
+
+ struct tree_desc_s l_desc; /* desc. for literal tree */
+ struct tree_desc_s d_desc; /* desc. for distance tree */
+ struct tree_desc_s bl_desc; /* desc. for bit length tree */
+
+ ush bl_count[MAX_BITS+1];
+ /* number of codes at each bit length for an optimal tree */
+
+ int heap[2*L_CODES+1]; /* heap used to build the Huffman trees */
+ int heap_len; /* number of elements in the heap */
+ int heap_max; /* element of largest frequency */
+ /* The sons of heap[n] are heap[2*n] and heap[2*n+1]. heap[0] is not used.
+ * The same heap array is used to build all trees.
+ */
+
+ uch depth[2*L_CODES+1];
+ /* Depth of each subtree used as tie breaker for trees of equal frequency
+ */
+
+ uchf *l_buf; /* buffer for literals or lengths */
+
+ uInt lit_bufsize;
+ /* Size of match buffer for literals/lengths. There are 4 reasons for
+ * limiting lit_bufsize to 64K:
+ * - frequencies can be kept in 16 bit counters
+ * - if compression is not successful for the first block, all input
+ * data is still in the window so we can still emit a stored block even
+ * when input comes from standard input. (This can also be done for
+ * all blocks if lit_bufsize is not greater than 32K.)
+ * - if compression is not successful for a file smaller than 64K, we can
+ * even emit a stored file instead of a stored block (saving 5 bytes).
+ * This is applicable only for zip (not gzip or zlib).
+ * - creating new Huffman trees less frequently may not provide fast
+ * adaptation to changes in the input data statistics. (Take for
+ * example a binary file with poorly compressible code followed by
+ * a highly compressible string table.) Smaller buffer sizes give
+ * fast adaptation but have of course the overhead of transmitting
+ * trees more frequently.
+ * - I can't count above 4
+ */
+
+ uInt last_lit; /* running index in l_buf */
+
+ ushf *d_buf;
+ /* Buffer for distances. To simplify the code, d_buf and l_buf have
+ * the same number of elements. To use different lengths, an extra flag
+ * array would be necessary.
+ */
+
+ ulg opt_len; /* bit length of current block with optimal trees */
+ ulg static_len; /* bit length of current block with static trees */
+ uInt matches; /* number of string matches in current block */
+ int last_eob_len; /* bit length of EOB code for last block */
+
+#ifdef DEBUG
+ ulg compressed_len; /* total bit length of compressed file mod 2^32 */
+ ulg bits_sent; /* bit length of compressed data sent mod 2^32 */
+#endif
+
+ ush bi_buf;
+ /* Output buffer. bits are inserted starting at the bottom (least
+ * significant bits).
+ */
+ int bi_valid;
+ /* Number of valid bits in bi_buf. All bits above the last valid bit
+ * are always zero.
+ */
+
+} FAR deflate_state;
+
+/* Output a byte on the stream.
+ * IN assertion: there is enough room in pending_buf.
+ */
+#define put_byte(s, c) {s->pending_buf[s->pending++] = (c);}
+
+
+#define MIN_LOOKAHEAD (MAX_MATCH+MIN_MATCH+1)
+/* Minimum amount of lookahead, except at the end of the input file.
+ * See deflate.c for comments about the MIN_MATCH+1.
+ */
+
+#define MAX_DIST(s) ((s)->w_size-MIN_LOOKAHEAD)
+/* In order to simplify the code, particularly on 16 bit machines, match
+ * distances are limited to MAX_DIST instead of WSIZE.
+ */
+
+ /* in trees.c */
+void _tr_init OF((deflate_state *s));
+int _tr_tally OF((deflate_state *s, unsigned dist, unsigned lc));
+void _tr_flush_block OF((deflate_state *s, charf *buf, ulg stored_len,
+ int eof));
+void _tr_align OF((deflate_state *s));
+void _tr_stored_block OF((deflate_state *s, charf *buf, ulg stored_len,
+ int eof));
+
+#define d_code(dist) \
+ ((dist) < 256 ? _dist_code[dist] : _dist_code[256+((dist)>>7)])
+/* Mapping from a distance to a distance code. dist is the distance - 1 and
+ * must not have side effects. _dist_code[256] and _dist_code[257] are never
+ * used.
+ */
+
+#ifndef DEBUG
+/* Inline versions of _tr_tally for speed: */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+ extern uch _length_code[];
+ extern uch _dist_code[];
+#else
+ extern const uch _length_code[];
+ extern const uch _dist_code[];
+#endif
+
+# define _tr_tally_lit(s, c, flush) \
+ { uch cc = (c); \
+ s->d_buf[s->last_lit] = 0; \
+ s->l_buf[s->last_lit++] = cc; \
+ s->dyn_ltree[cc].Freq++; \
+ flush = (s->last_lit == s->lit_bufsize-1); \
+ }
+# define _tr_tally_dist(s, distance, length, flush) \
+ { uch len = (length); \
+ ush dist = (distance); \
+ s->d_buf[s->last_lit] = dist; \
+ s->l_buf[s->last_lit++] = len; \
+ dist--; \
+ s->dyn_ltree[_length_code[len]+LITERALS+1].Freq++; \
+ s->dyn_dtree[d_code(dist)].Freq++; \
+ flush = (s->last_lit == s->lit_bufsize-1); \
+ }
+#else
+# define _tr_tally_lit(s, c, flush) flush = _tr_tally(s, 0, c)
+# define _tr_tally_dist(s, distance, length, flush) \
+ flush = _tr_tally(s, distance, length)
+#endif
+
+#endif /* _DEFLATE_H */
diff --git a/sys/contrib/opensolaris/uts/common/zmod/inffast.c b/sys/contrib/opensolaris/uts/common/zmod/inffast.c
new file mode 100644
index 0000000..a6dcf3f
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/inffast.c
@@ -0,0 +1,320 @@
+/* inffast.c -- fast decoding
+ * Copyright (C) 1995-2004 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+#ifndef ASMINF
+
+/* Allow machine dependent optimization for post-increment or pre-increment.
+ Based on testing to date,
+ Pre-increment preferred for:
+ - PowerPC G3 (Adler)
+ - MIPS R5000 (Randers-Pehrson)
+ Post-increment preferred for:
+ - none
+ No measurable difference:
+ - Pentium III (Anderson)
+ - M68060 (Nikl)
+ */
+#ifdef POSTINC
+# define OFF 0
+# define PUP(a) *(a)++
+#else
+# define OFF 1
+# define PUP(a) *++(a)
+#endif
+
+/*
+ Decode literal, length, and distance codes and write out the resulting
+ literal and match bytes until either not enough input or output is
+ available, an end-of-block is encountered, or a data error is encountered.
+ When large enough input and output buffers are supplied to inflate(), for
+ example, a 16K input buffer and a 64K output buffer, more than 95% of the
+ inflate execution time is spent in this routine.
+
+ Entry assumptions:
+
+ state->mode == LEN
+ strm->avail_in >= 6
+ strm->avail_out >= 258
+ start >= strm->avail_out
+ state->bits < 8
+
+ On return, state->mode is one of:
+
+ LEN -- ran out of enough output space or enough available input
+ TYPE -- reached end of block code, inflate() to interpret next block
+ BAD -- error in block data
+
+ Notes:
+
+ - The maximum input bits used by a length/distance pair is 15 bits for the
+ length code, 5 bits for the length extra, 15 bits for the distance code,
+ and 13 bits for the distance extra. This totals 48 bits, or six bytes.
+ Therefore if strm->avail_in >= 6, then there is enough input to avoid
+ checking for available input while decoding.
+
+ - The maximum bytes that a single length/distance pair can output is 258
+ bytes, which is the maximum length that can be coded. inflate_fast()
+ requires strm->avail_out >= 258 for each loop to avoid checking for
+ output space.
+ */
+void inflate_fast(strm, start)
+z_streamp strm;
+unsigned start; /* inflate()'s starting value for strm->avail_out */
+{
+ struct inflate_state FAR *state;
+ unsigned char FAR *in; /* local strm->next_in */
+ unsigned char FAR *last; /* while in < last, enough input available */
+ unsigned char FAR *out; /* local strm->next_out */
+ unsigned char FAR *beg; /* inflate()'s initial strm->next_out */
+ unsigned char FAR *end; /* while out < end, enough space available */
+#ifdef INFLATE_STRICT
+ unsigned dmax; /* maximum distance from zlib header */
+#endif
+ unsigned wsize; /* window size or zero if not using window */
+ unsigned whave; /* valid bytes in the window */
+ unsigned write; /* window write index */
+ unsigned char FAR *window; /* allocated sliding window, if wsize != 0 */
+ unsigned long hold; /* local strm->hold */
+ unsigned bits; /* local strm->bits */
+ code const FAR *lcode; /* local strm->lencode */
+ code const FAR *dcode; /* local strm->distcode */
+ unsigned lmask; /* mask for first level of length codes */
+ unsigned dmask; /* mask for first level of distance codes */
+ code this; /* retrieved table entry */
+ unsigned op; /* code bits, operation, extra bits, or */
+ /* window position, window bytes to copy */
+ unsigned len; /* match length, unused bytes */
+ unsigned dist; /* match distance */
+ unsigned char FAR *from; /* where to copy match from */
+
+ /* copy state to local variables */
+ state = (struct inflate_state FAR *)strm->state;
+ in = strm->next_in - OFF;
+ last = in + (strm->avail_in - 5);
+ out = strm->next_out - OFF;
+ beg = out - (start - strm->avail_out);
+ end = out + (strm->avail_out - 257);
+#ifdef INFLATE_STRICT
+ dmax = state->dmax;
+#endif
+ wsize = state->wsize;
+ whave = state->whave;
+ write = state->write;
+ window = state->window;
+ hold = state->hold;
+ bits = state->bits;
+ lcode = state->lencode;
+ dcode = state->distcode;
+ lmask = (1U << state->lenbits) - 1;
+ dmask = (1U << state->distbits) - 1;
+
+ /* decode literals and length/distances until end-of-block or not enough
+ input data or output space */
+ do {
+ if (bits < 15) {
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ }
+ this = lcode[hold & lmask];
+ dolen:
+ op = (unsigned)(this.bits);
+ hold >>= op;
+ bits -= op;
+ op = (unsigned)(this.op);
+ if (op == 0) { /* literal */
+ Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
+ "inflate: literal '%c'\n" :
+ "inflate: literal 0x%02x\n", this.val));
+ PUP(out) = (unsigned char)(this.val);
+ }
+ else if (op & 16) { /* length base */
+ len = (unsigned)(this.val);
+ op &= 15; /* number of extra bits */
+ if (op) {
+ if (bits < op) {
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ }
+ len += (unsigned)hold & ((1U << op) - 1);
+ hold >>= op;
+ bits -= op;
+ }
+ Tracevv((stderr, "inflate: length %u\n", len));
+ if (bits < 15) {
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ }
+ this = dcode[hold & dmask];
+ dodist:
+ op = (unsigned)(this.bits);
+ hold >>= op;
+ bits -= op;
+ op = (unsigned)(this.op);
+ if (op & 16) { /* distance base */
+ dist = (unsigned)(this.val);
+ op &= 15; /* number of extra bits */
+ if (bits < op) {
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ if (bits < op) {
+ hold += (unsigned long)(PUP(in)) << bits;
+ bits += 8;
+ }
+ }
+ dist += (unsigned)hold & ((1U << op) - 1);
+#ifdef INFLATE_STRICT
+ if (dist > dmax) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ hold >>= op;
+ bits -= op;
+ Tracevv((stderr, "inflate: distance %u\n", dist));
+ op = (unsigned)(out - beg); /* max distance in output */
+ if (dist > op) { /* see if copy from window */
+ op = dist - op; /* distance back in window */
+ if (op > whave) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+ from = window - OFF;
+ if (write == 0) { /* very common case */
+ from += wsize - op;
+ if (op < len) { /* some from window */
+ len -= op;
+ do {
+ PUP(out) = PUP(from);
+ } while (--op);
+ from = out - dist; /* rest from output */
+ }
+ }
+ else if (write < op) { /* wrap around window */
+ from += wsize + write - op;
+ op -= write;
+ if (op < len) { /* some from end of window */
+ len -= op;
+ do {
+ PUP(out) = PUP(from);
+ } while (--op);
+ from = window - OFF;
+ if (write < len) { /* some from start of window */
+ op = write;
+ len -= op;
+ do {
+ PUP(out) = PUP(from);
+ } while (--op);
+ from = out - dist; /* rest from output */
+ }
+ }
+ }
+ else { /* contiguous in window */
+ from += write - op;
+ if (op < len) { /* some from window */
+ len -= op;
+ do {
+ PUP(out) = PUP(from);
+ } while (--op);
+ from = out - dist; /* rest from output */
+ }
+ }
+ while (len > 2) {
+ PUP(out) = PUP(from);
+ PUP(out) = PUP(from);
+ PUP(out) = PUP(from);
+ len -= 3;
+ }
+ if (len) {
+ PUP(out) = PUP(from);
+ if (len > 1)
+ PUP(out) = PUP(from);
+ }
+ }
+ else {
+ from = out - dist; /* copy direct from output */
+ do { /* minimum length is three */
+ PUP(out) = PUP(from);
+ PUP(out) = PUP(from);
+ PUP(out) = PUP(from);
+ len -= 3;
+ } while (len > 2);
+ if (len) {
+ PUP(out) = PUP(from);
+ if (len > 1)
+ PUP(out) = PUP(from);
+ }
+ }
+ }
+ else if ((op & 64) == 0) { /* 2nd level distance code */
+ this = dcode[this.val + (hold & ((1U << op) - 1))];
+ goto dodist;
+ }
+ else {
+ strm->msg = (char *)"invalid distance code";
+ state->mode = BAD;
+ break;
+ }
+ }
+ else if ((op & 64) == 0) { /* 2nd level length code */
+ this = lcode[this.val + (hold & ((1U << op) - 1))];
+ goto dolen;
+ }
+ else if (op & 32) { /* end-of-block */
+ Tracevv((stderr, "inflate: end of block\n"));
+ state->mode = TYPE;
+ break;
+ }
+ else {
+ strm->msg = (char *)"invalid literal/length code";
+ state->mode = BAD;
+ break;
+ }
+ } while (in < last && out < end);
+
+ /* return unused bytes (on entry, bits < 8, so in won't go too far back) */
+ len = bits >> 3;
+ in -= len;
+ bits -= len << 3;
+ hold &= (1U << bits) - 1;
+
+ /* update state and return */
+ strm->next_in = in + OFF;
+ strm->next_out = out + OFF;
+ strm->avail_in = (unsigned)(in < last ? 5 + (last - in) : 5 - (in - last));
+ strm->avail_out = (unsigned)(out < end ?
+ 257 + (end - out) : 257 - (out - end));
+ state->hold = hold;
+ state->bits = bits;
+ return;
+}
+
+/*
+ inflate_fast() speedups that turned out slower (on a PowerPC G3 750CXe):
+ - Using bit fields for code structure
+ - Different op definition to avoid & for extra bits (do & for table bits)
+ - Three separate decoding do-loops for direct, window, and write == 0
+ - Special case for distance > 1 copies to do overlapped load and store copy
+ - Explicit branch predictions (based on measured branch probabilities)
+ - Deferring match copy and interspersed it with decoding subsequent codes
+ - Swapping literal/length else
+ - Swapping window/direct else
+ - Larger unrolled copy loops (three is about right)
+ - Moving len -= 3 statement into middle of loop
+ */
+
+#endif /* !ASMINF */
diff --git a/sys/contrib/opensolaris/uts/common/zmod/inffast.h b/sys/contrib/opensolaris/uts/common/zmod/inffast.h
new file mode 100644
index 0000000..2d214ef
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/inffast.h
@@ -0,0 +1,13 @@
+/* inffast.h -- header to use inffast.c
+ * Copyright (C) 1995-2003 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+void inflate_fast OF((z_streamp strm, unsigned start));
diff --git a/sys/contrib/opensolaris/uts/common/zmod/inffixed.h b/sys/contrib/opensolaris/uts/common/zmod/inffixed.h
new file mode 100644
index 0000000..ed55df8
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/inffixed.h
@@ -0,0 +1,96 @@
+ /* inffixed.h -- table for decoding fixed codes
+ * Generated automatically by makefixed().
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+ /* WARNING: this file should *not* be used by applications. It
+ is part of the implementation of the compression library and
+ is subject to change. Applications should only use zlib.h.
+ */
+
+ static const code lenfix[512] = {
+ {96,7,0},{0,8,80},{0,8,16},{20,8,115},{18,7,31},{0,8,112},{0,8,48},
+ {0,9,192},{16,7,10},{0,8,96},{0,8,32},{0,9,160},{0,8,0},{0,8,128},
+ {0,8,64},{0,9,224},{16,7,6},{0,8,88},{0,8,24},{0,9,144},{19,7,59},
+ {0,8,120},{0,8,56},{0,9,208},{17,7,17},{0,8,104},{0,8,40},{0,9,176},
+ {0,8,8},{0,8,136},{0,8,72},{0,9,240},{16,7,4},{0,8,84},{0,8,20},
+ {21,8,227},{19,7,43},{0,8,116},{0,8,52},{0,9,200},{17,7,13},{0,8,100},
+ {0,8,36},{0,9,168},{0,8,4},{0,8,132},{0,8,68},{0,9,232},{16,7,8},
+ {0,8,92},{0,8,28},{0,9,152},{20,7,83},{0,8,124},{0,8,60},{0,9,216},
+ {18,7,23},{0,8,108},{0,8,44},{0,9,184},{0,8,12},{0,8,140},{0,8,76},
+ {0,9,248},{16,7,3},{0,8,82},{0,8,18},{21,8,163},{19,7,35},{0,8,114},
+ {0,8,50},{0,9,196},{17,7,11},{0,8,98},{0,8,34},{0,9,164},{0,8,2},
+ {0,8,130},{0,8,66},{0,9,228},{16,7,7},{0,8,90},{0,8,26},{0,9,148},
+ {20,7,67},{0,8,122},{0,8,58},{0,9,212},{18,7,19},{0,8,106},{0,8,42},
+ {0,9,180},{0,8,10},{0,8,138},{0,8,74},{0,9,244},{16,7,5},{0,8,86},
+ {0,8,22},{64,8,0},{19,7,51},{0,8,118},{0,8,54},{0,9,204},{17,7,15},
+ {0,8,102},{0,8,38},{0,9,172},{0,8,6},{0,8,134},{0,8,70},{0,9,236},
+ {16,7,9},{0,8,94},{0,8,30},{0,9,156},{20,7,99},{0,8,126},{0,8,62},
+ {0,9,220},{18,7,27},{0,8,110},{0,8,46},{0,9,188},{0,8,14},{0,8,142},
+ {0,8,78},{0,9,252},{96,7,0},{0,8,81},{0,8,17},{21,8,131},{18,7,31},
+ {0,8,113},{0,8,49},{0,9,194},{16,7,10},{0,8,97},{0,8,33},{0,9,162},
+ {0,8,1},{0,8,129},{0,8,65},{0,9,226},{16,7,6},{0,8,89},{0,8,25},
+ {0,9,146},{19,7,59},{0,8,121},{0,8,57},{0,9,210},{17,7,17},{0,8,105},
+ {0,8,41},{0,9,178},{0,8,9},{0,8,137},{0,8,73},{0,9,242},{16,7,4},
+ {0,8,85},{0,8,21},{16,8,258},{19,7,43},{0,8,117},{0,8,53},{0,9,202},
+ {17,7,13},{0,8,101},{0,8,37},{0,9,170},{0,8,5},{0,8,133},{0,8,69},
+ {0,9,234},{16,7,8},{0,8,93},{0,8,29},{0,9,154},{20,7,83},{0,8,125},
+ {0,8,61},{0,9,218},{18,7,23},{0,8,109},{0,8,45},{0,9,186},{0,8,13},
+ {0,8,141},{0,8,77},{0,9,250},{16,7,3},{0,8,83},{0,8,19},{21,8,195},
+ {19,7,35},{0,8,115},{0,8,51},{0,9,198},{17,7,11},{0,8,99},{0,8,35},
+ {0,9,166},{0,8,3},{0,8,131},{0,8,67},{0,9,230},{16,7,7},{0,8,91},
+ {0,8,27},{0,9,150},{20,7,67},{0,8,123},{0,8,59},{0,9,214},{18,7,19},
+ {0,8,107},{0,8,43},{0,9,182},{0,8,11},{0,8,139},{0,8,75},{0,9,246},
+ {16,7,5},{0,8,87},{0,8,23},{64,8,0},{19,7,51},{0,8,119},{0,8,55},
+ {0,9,206},{17,7,15},{0,8,103},{0,8,39},{0,9,174},{0,8,7},{0,8,135},
+ {0,8,71},{0,9,238},{16,7,9},{0,8,95},{0,8,31},{0,9,158},{20,7,99},
+ {0,8,127},{0,8,63},{0,9,222},{18,7,27},{0,8,111},{0,8,47},{0,9,190},
+ {0,8,15},{0,8,143},{0,8,79},{0,9,254},{96,7,0},{0,8,80},{0,8,16},
+ {20,8,115},{18,7,31},{0,8,112},{0,8,48},{0,9,193},{16,7,10},{0,8,96},
+ {0,8,32},{0,9,161},{0,8,0},{0,8,128},{0,8,64},{0,9,225},{16,7,6},
+ {0,8,88},{0,8,24},{0,9,145},{19,7,59},{0,8,120},{0,8,56},{0,9,209},
+ {17,7,17},{0,8,104},{0,8,40},{0,9,177},{0,8,8},{0,8,136},{0,8,72},
+ {0,9,241},{16,7,4},{0,8,84},{0,8,20},{21,8,227},{19,7,43},{0,8,116},
+ {0,8,52},{0,9,201},{17,7,13},{0,8,100},{0,8,36},{0,9,169},{0,8,4},
+ {0,8,132},{0,8,68},{0,9,233},{16,7,8},{0,8,92},{0,8,28},{0,9,153},
+ {20,7,83},{0,8,124},{0,8,60},{0,9,217},{18,7,23},{0,8,108},{0,8,44},
+ {0,9,185},{0,8,12},{0,8,140},{0,8,76},{0,9,249},{16,7,3},{0,8,82},
+ {0,8,18},{21,8,163},{19,7,35},{0,8,114},{0,8,50},{0,9,197},{17,7,11},
+ {0,8,98},{0,8,34},{0,9,165},{0,8,2},{0,8,130},{0,8,66},{0,9,229},
+ {16,7,7},{0,8,90},{0,8,26},{0,9,149},{20,7,67},{0,8,122},{0,8,58},
+ {0,9,213},{18,7,19},{0,8,106},{0,8,42},{0,9,181},{0,8,10},{0,8,138},
+ {0,8,74},{0,9,245},{16,7,5},{0,8,86},{0,8,22},{64,8,0},{19,7,51},
+ {0,8,118},{0,8,54},{0,9,205},{17,7,15},{0,8,102},{0,8,38},{0,9,173},
+ {0,8,6},{0,8,134},{0,8,70},{0,9,237},{16,7,9},{0,8,94},{0,8,30},
+ {0,9,157},{20,7,99},{0,8,126},{0,8,62},{0,9,221},{18,7,27},{0,8,110},
+ {0,8,46},{0,9,189},{0,8,14},{0,8,142},{0,8,78},{0,9,253},{96,7,0},
+ {0,8,81},{0,8,17},{21,8,131},{18,7,31},{0,8,113},{0,8,49},{0,9,195},
+ {16,7,10},{0,8,97},{0,8,33},{0,9,163},{0,8,1},{0,8,129},{0,8,65},
+ {0,9,227},{16,7,6},{0,8,89},{0,8,25},{0,9,147},{19,7,59},{0,8,121},
+ {0,8,57},{0,9,211},{17,7,17},{0,8,105},{0,8,41},{0,9,179},{0,8,9},
+ {0,8,137},{0,8,73},{0,9,243},{16,7,4},{0,8,85},{0,8,21},{16,8,258},
+ {19,7,43},{0,8,117},{0,8,53},{0,9,203},{17,7,13},{0,8,101},{0,8,37},
+ {0,9,171},{0,8,5},{0,8,133},{0,8,69},{0,9,235},{16,7,8},{0,8,93},
+ {0,8,29},{0,9,155},{20,7,83},{0,8,125},{0,8,61},{0,9,219},{18,7,23},
+ {0,8,109},{0,8,45},{0,9,187},{0,8,13},{0,8,141},{0,8,77},{0,9,251},
+ {16,7,3},{0,8,83},{0,8,19},{21,8,195},{19,7,35},{0,8,115},{0,8,51},
+ {0,9,199},{17,7,11},{0,8,99},{0,8,35},{0,9,167},{0,8,3},{0,8,131},
+ {0,8,67},{0,9,231},{16,7,7},{0,8,91},{0,8,27},{0,9,151},{20,7,67},
+ {0,8,123},{0,8,59},{0,9,215},{18,7,19},{0,8,107},{0,8,43},{0,9,183},
+ {0,8,11},{0,8,139},{0,8,75},{0,9,247},{16,7,5},{0,8,87},{0,8,23},
+ {64,8,0},{19,7,51},{0,8,119},{0,8,55},{0,9,207},{17,7,15},{0,8,103},
+ {0,8,39},{0,9,175},{0,8,7},{0,8,135},{0,8,71},{0,9,239},{16,7,9},
+ {0,8,95},{0,8,31},{0,9,159},{20,7,99},{0,8,127},{0,8,63},{0,9,223},
+ {18,7,27},{0,8,111},{0,8,47},{0,9,191},{0,8,15},{0,8,143},{0,8,79},
+ {0,9,255}
+ };
+
+ static const code distfix[32] = {
+ {16,5,1},{23,5,257},{19,5,17},{27,5,4097},{17,5,5},{25,5,1025},
+ {21,5,65},{29,5,16385},{16,5,3},{24,5,513},{20,5,33},{28,5,8193},
+ {18,5,9},{26,5,2049},{22,5,129},{64,5,0},{16,5,2},{23,5,385},
+ {19,5,25},{27,5,6145},{17,5,7},{25,5,1537},{21,5,97},{29,5,24577},
+ {16,5,4},{24,5,769},{20,5,49},{28,5,12289},{18,5,13},{26,5,3073},
+ {22,5,193},{64,5,0}
+ };
diff --git a/sys/contrib/opensolaris/uts/common/zmod/inflate.c b/sys/contrib/opensolaris/uts/common/zmod/inflate.c
new file mode 100644
index 0000000..023e7a1
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/inflate.c
@@ -0,0 +1,1395 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* inflate.c -- zlib decompression
+ * Copyright (C) 1995-2005 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * Change history:
+ *
+ * 1.2.beta0 24 Nov 2002
+ * - First version -- complete rewrite of inflate to simplify code, avoid
+ * creation of window when not needed, minimize use of window when it is
+ * needed, make inffast.c even faster, implement gzip decoding, and to
+ * improve code readability and style over the previous zlib inflate code
+ *
+ * 1.2.beta1 25 Nov 2002
+ * - Use pointers for available input and output checking in inffast.c
+ * - Remove input and output counters in inffast.c
+ * - Change inffast.c entry and loop from avail_in >= 7 to >= 6
+ * - Remove unnecessary second byte pull from length extra in inffast.c
+ * - Unroll direct copy to three copies per loop in inffast.c
+ *
+ * 1.2.beta2 4 Dec 2002
+ * - Change external routine names to reduce potential conflicts
+ * - Correct filename to inffixed.h for fixed tables in inflate.c
+ * - Make hbuf[] unsigned char to match parameter type in inflate.c
+ * - Change strm->next_out[-state->offset] to *(strm->next_out - state->offset)
+ * to avoid negation problem on Alphas (64 bit) in inflate.c
+ *
+ * 1.2.beta3 22 Dec 2002
+ * - Add comments on state->bits assertion in inffast.c
+ * - Add comments on op field in inftrees.h
+ * - Fix bug in reuse of allocated window after inflateReset()
+ * - Remove bit fields--back to byte structure for speed
+ * - Remove distance extra == 0 check in inflate_fast()--only helps for lengths
+ * - Change post-increments to pre-increments in inflate_fast(), PPC biased?
+ * - Add compile time option, POSTINC, to use post-increments instead (Intel?)
+ * - Make MATCH copy in inflate() much faster for when inflate_fast() not used
+ * - Use local copies of stream next and avail values, as well as local bit
+ * buffer and bit count in inflate()--for speed when inflate_fast() not used
+ *
+ * 1.2.beta4 1 Jan 2003
+ * - Split ptr - 257 statements in inflate_table() to avoid compiler warnings
+ * - Move a comment on output buffer sizes from inffast.c to inflate.c
+ * - Add comments in inffast.c to introduce the inflate_fast() routine
+ * - Rearrange window copies in inflate_fast() for speed and simplification
+ * - Unroll last copy for window match in inflate_fast()
+ * - Use local copies of window variables in inflate_fast() for speed
+ * - Pull out common write == 0 case for speed in inflate_fast()
+ * - Make op and len in inflate_fast() unsigned for consistency
+ * - Add FAR to lcode and dcode declarations in inflate_fast()
+ * - Simplified bad distance check in inflate_fast()
+ * - Added inflateBackInit(), inflateBack(), and inflateBackEnd() in new
+ * source file infback.c to provide a call-back interface to inflate for
+ * programs like gzip and unzip -- uses window as output buffer to avoid
+ * window copying
+ *
+ * 1.2.beta5 1 Jan 2003
+ * - Improved inflateBack() interface to allow the caller to provide initial
+ * input in strm.
+ * - Fixed stored blocks bug in inflateBack()
+ *
+ * 1.2.beta6 4 Jan 2003
+ * - Added comments in inffast.c on effectiveness of POSTINC
+ * - Typecasting all around to reduce compiler warnings
+ * - Changed loops from while (1) or do {} while (1) to for (;;), again to
+ * make compilers happy
+ * - Changed type of window in inflateBackInit() to unsigned char *
+ *
+ * 1.2.beta7 27 Jan 2003
+ * - Changed many types to unsigned or unsigned short to avoid warnings
+ * - Added inflateCopy() function
+ *
+ * 1.2.0 9 Mar 2003
+ * - Changed inflateBack() interface to provide separate opaque descriptors
+ * for the in() and out() functions
+ * - Changed inflateBack() argument and in_func typedef to swap the length
+ * and buffer address return values for the input function
+ * - Check next_in and next_out for Z_NULL on entry to inflate()
+ *
+ * The history for versions after 1.2.0 are in ChangeLog in zlib distribution.
+ */
+
+#include "zutil.h"
+#include "inftrees.h"
+#include "inflate.h"
+#include "inffast.h"
+
+#ifdef MAKEFIXED
+# ifndef BUILDFIXED
+# define BUILDFIXED
+# endif
+#endif
+
+/* function prototypes */
+local void fixedtables OF((struct inflate_state FAR *state));
+local int updatewindow OF((z_streamp strm, unsigned out));
+#ifdef BUILDFIXED
+ void makefixed OF((void));
+#endif
+local unsigned syncsearch OF((unsigned FAR *have, unsigned char FAR *buf,
+ unsigned len));
+
+int ZEXPORT inflateReset(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ strm->total_in = strm->total_out = state->total = 0;
+ strm->msg = Z_NULL;
+ strm->adler = 1; /* to support ill-conceived Java test suite */
+ state->mode = HEAD;
+ state->last = 0;
+ state->havedict = 0;
+ state->dmax = 32768U;
+ state->head = Z_NULL;
+ state->wsize = 0;
+ state->whave = 0;
+ state->write = 0;
+ state->hold = 0;
+ state->bits = 0;
+ state->lencode = state->distcode = state->next = state->codes;
+ Tracev((stderr, "inflate: reset\n"));
+ return Z_OK;
+}
+
+int ZEXPORT inflatePrime(strm, bits, value)
+z_streamp strm;
+int bits;
+int value;
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (bits > 16 || state->bits + bits > 32) return Z_STREAM_ERROR;
+ value &= (1L << bits) - 1;
+ state->hold += value << state->bits;
+ state->bits += bits;
+ return Z_OK;
+}
+
+int ZEXPORT inflateInit2_(strm, windowBits, version, stream_size)
+z_streamp strm;
+int windowBits;
+const char *version;
+int stream_size;
+{
+ struct inflate_state FAR *state;
+
+ if (version == Z_NULL || version[0] != ZLIB_VERSION[0] ||
+ stream_size != (int)(sizeof(z_stream)))
+ return Z_VERSION_ERROR;
+ if (strm == Z_NULL) return Z_STREAM_ERROR;
+ strm->msg = Z_NULL; /* in case we return an error */
+ if (strm->zalloc == (alloc_func)0) {
+ strm->zalloc = zcalloc;
+ strm->opaque = (voidpf)0;
+ }
+ if (strm->zfree == (free_func)0) strm->zfree = zcfree;
+ state = (struct inflate_state FAR *)
+ ZALLOC(strm, 1, sizeof(struct inflate_state));
+ if (state == Z_NULL) return Z_MEM_ERROR;
+ Tracev((stderr, "inflate: allocated\n"));
+ strm->state = (struct internal_state FAR *)state;
+ if (windowBits < 0) {
+ state->wrap = 0;
+ windowBits = -windowBits;
+ }
+ else {
+ state->wrap = (windowBits >> 4) + 1;
+#ifdef GUNZIP
+ if (windowBits < 48) windowBits &= 15;
+#endif
+ }
+ if (windowBits < 8 || windowBits > 15) {
+ ZFREE(strm, state);
+ strm->state = Z_NULL;
+ return Z_STREAM_ERROR;
+ }
+ state->wbits = (unsigned)windowBits;
+ state->window = Z_NULL;
+ return inflateReset(strm);
+}
+
+int ZEXPORT inflateInit_(strm, version, stream_size)
+z_streamp strm;
+const char *version;
+int stream_size;
+{
+ return inflateInit2_(strm, DEF_WBITS, version, stream_size);
+}
+
+/*
+ Return state with length and distance decoding tables and index sizes set to
+ fixed code decoding. Normally this returns fixed tables from inffixed.h.
+ If BUILDFIXED is defined, then instead this routine builds the tables the
+ first time it's called, and returns those tables the first time and
+ thereafter. This reduces the size of the code by about 2K bytes, in
+ exchange for a little execution time. However, BUILDFIXED should not be
+ used for threaded applications, since the rewriting of the tables and virgin
+ may not be thread-safe.
+ */
+local void fixedtables(state)
+struct inflate_state FAR *state;
+{
+#ifdef BUILDFIXED
+ static int virgin = 1;
+ static code *lenfix, *distfix;
+ static code fixed[544];
+
+ /* build fixed huffman tables if first call (may not be thread safe) */
+ if (virgin) {
+ unsigned sym, bits;
+ static code *next;
+
+ /* literal/length table */
+ sym = 0;
+ while (sym < 144) state->lens[sym++] = 8;
+ while (sym < 256) state->lens[sym++] = 9;
+ while (sym < 280) state->lens[sym++] = 7;
+ while (sym < 288) state->lens[sym++] = 8;
+ next = fixed;
+ lenfix = next;
+ bits = 9;
+ inflate_table(LENS, state->lens, 288, &(next), &(bits), state->work);
+
+ /* distance table */
+ sym = 0;
+ while (sym < 32) state->lens[sym++] = 5;
+ distfix = next;
+ bits = 5;
+ inflate_table(DISTS, state->lens, 32, &(next), &(bits), state->work);
+
+ /* do this just once */
+ virgin = 0;
+ }
+#else /* !BUILDFIXED */
+# include "inffixed.h"
+#endif /* BUILDFIXED */
+ state->lencode = lenfix;
+ state->lenbits = 9;
+ state->distcode = distfix;
+ state->distbits = 5;
+}
+
+#ifdef MAKEFIXED
+#include <stdio.h>
+
+/*
+ Write out the inffixed.h that is #include'd above. Defining MAKEFIXED also
+ defines BUILDFIXED, so the tables are built on the fly. makefixed() writes
+ those tables to stdout, which would be piped to inffixed.h. A small program
+ can simply call makefixed to do this:
+
+ void makefixed(void);
+
+ int main(void)
+ {
+ makefixed();
+ return 0;
+ }
+
+ Then that can be linked with zlib built with MAKEFIXED defined and run:
+
+ a.out > inffixed.h
+ */
+void makefixed()
+{
+ unsigned low, size;
+ struct inflate_state state;
+
+ fixedtables(&state);
+ puts(" /* inffixed.h -- table for decoding fixed codes");
+ puts(" * Generated automatically by makefixed().");
+ puts(" */");
+ puts("");
+ puts(" /* WARNING: this file should *not* be used by applications.");
+ puts(" It is part of the implementation of this library and is");
+ puts(" subject to change. Applications should only use zlib.h.");
+ puts(" */");
+ puts("");
+ size = 1U << 9;
+ printf(" static const code lenfix[%u] = {", size);
+ low = 0;
+ for (;;) {
+ if ((low % 7) == 0) printf("\n ");
+ printf("{%u,%u,%d}", state.lencode[low].op, state.lencode[low].bits,
+ state.lencode[low].val);
+ if (++low == size) break;
+ putchar(',');
+ }
+ puts("\n };");
+ size = 1U << 5;
+ printf("\n static const code distfix[%u] = {", size);
+ low = 0;
+ for (;;) {
+ if ((low % 6) == 0) printf("\n ");
+ printf("{%u,%u,%d}", state.distcode[low].op, state.distcode[low].bits,
+ state.distcode[low].val);
+ if (++low == size) break;
+ putchar(',');
+ }
+ puts("\n };");
+}
+#endif /* MAKEFIXED */
+
+/*
+ Update the window with the last wsize (normally 32K) bytes written before
+ returning. If window does not exist yet, create it. This is only called
+ when a window is already in use, or when output has been written during this
+ inflate call, but the end of the deflate stream has not been reached yet.
+ It is also called to create a window for dictionary data when a dictionary
+ is loaded.
+
+ Providing output buffers larger than 32K to inflate() should provide a speed
+ advantage, since only the last 32K of output is copied to the sliding window
+ upon return from inflate(), and since all distances after the first 32K of
+ output will fall in the output data, making match copies simpler and faster.
+ The advantage may be dependent on the size of the processor's data caches.
+ */
+local int updatewindow(strm, out)
+z_streamp strm;
+unsigned out;
+{
+ struct inflate_state FAR *state;
+ unsigned copy, dist;
+
+ state = (struct inflate_state FAR *)strm->state;
+
+ /* if it hasn't been done already, allocate space for the window */
+ if (state->window == Z_NULL) {
+ state->window = (unsigned char FAR *)
+ ZALLOC(strm, 1U << state->wbits,
+ sizeof(unsigned char));
+ if (state->window == Z_NULL) return 1;
+ }
+
+ /* if window not in use yet, initialize */
+ if (state->wsize == 0) {
+ state->wsize = 1U << state->wbits;
+ state->write = 0;
+ state->whave = 0;
+ }
+
+ /* copy state->wsize or less output bytes into the circular window */
+ copy = out - strm->avail_out;
+ if (copy >= state->wsize) {
+ zmemcpy(state->window, strm->next_out - state->wsize, state->wsize);
+ state->write = 0;
+ state->whave = state->wsize;
+ }
+ else {
+ dist = state->wsize - state->write;
+ if (dist > copy) dist = copy;
+ zmemcpy(state->window + state->write, strm->next_out - copy, dist);
+ copy -= dist;
+ if (copy) {
+ zmemcpy(state->window, strm->next_out - copy, copy);
+ state->write = copy;
+ state->whave = state->wsize;
+ }
+ else {
+ state->write += dist;
+ if (state->write == state->wsize) state->write = 0;
+ if (state->whave < state->wsize) state->whave += dist;
+ }
+ }
+ return 0;
+}
+
+/* Macros for inflate(): */
+
+/* check function to use adler32() for zlib or crc32() for gzip */
+#ifdef GUNZIP
+# define UPDATE(check, buf, len) \
+ (state->flags ? crc32(check, buf, len) : adler32(check, buf, len))
+#else
+# define UPDATE(check, buf, len) adler32(check, buf, len)
+#endif
+
+/* check macros for header crc */
+#ifdef GUNZIP
+# define CRC2(check, word) \
+ do { \
+ hbuf[0] = (unsigned char)(word); \
+ hbuf[1] = (unsigned char)((word) >> 8); \
+ check = crc32(check, hbuf, 2); \
+ } while (0)
+
+# define CRC4(check, word) \
+ do { \
+ hbuf[0] = (unsigned char)(word); \
+ hbuf[1] = (unsigned char)((word) >> 8); \
+ hbuf[2] = (unsigned char)((word) >> 16); \
+ hbuf[3] = (unsigned char)((word) >> 24); \
+ check = crc32(check, hbuf, 4); \
+ } while (0)
+#endif
+
+/* Load registers with state in inflate() for speed */
+#define LOAD() \
+ do { \
+ put = strm->next_out; \
+ left = strm->avail_out; \
+ next = strm->next_in; \
+ have = strm->avail_in; \
+ hold = state->hold; \
+ bits = state->bits; \
+ } while (0)
+
+/* Restore state from registers in inflate() */
+#define RESTORE() \
+ do { \
+ strm->next_out = put; \
+ strm->avail_out = left; \
+ strm->next_in = next; \
+ strm->avail_in = have; \
+ state->hold = hold; \
+ state->bits = bits; \
+ } while (0)
+
+/* Clear the input bit accumulator */
+#define INITBITS() \
+ do { \
+ hold = 0; \
+ bits = 0; \
+ } while (0)
+
+/* Get a byte of input into the bit accumulator, or return from inflate()
+ if there is no input available. */
+#define PULLBYTE() \
+ do { \
+ if (have == 0) goto inf_leave; \
+ have--; \
+ hold += (unsigned long)(*next++) << bits; \
+ bits += 8; \
+ } while (0)
+
+/* Assure that there are at least n bits in the bit accumulator. If there is
+ not enough available input to do that, then return from inflate(). */
+#define NEEDBITS(n) \
+ do { \
+ while (bits < (unsigned)(n)) \
+ PULLBYTE(); \
+ } while (0)
+
+/* Return the low n bits of the bit accumulator (n < 16) */
+#define BITS(n) \
+ ((unsigned)hold & ((1U << (n)) - 1))
+
+/* Remove n bits from the bit accumulator */
+#define DROPBITS(n) \
+ do { \
+ hold >>= (n); \
+ bits -= (unsigned)(n); \
+ } while (0)
+
+/* Remove zero to seven bits as needed to go to a byte boundary */
+#define BYTEBITS() \
+ do { \
+ hold >>= bits & 7; \
+ bits -= bits & 7; \
+ } while (0)
+
+/* Reverse the bytes in a 32-bit value */
+#define REVERSE(q) \
+ ((((q) >> 24) & 0xff) + (((q) >> 8) & 0xff00) + \
+ (((q) & 0xff00) << 8) + (((q) & 0xff) << 24))
+
+/*
+ inflate() uses a state machine to process as much input data and generate as
+ much output data as possible before returning. The state machine is
+ structured roughly as follows:
+
+ for (;;) switch (state) {
+ ...
+ case STATEn:
+ if (not enough input data or output space to make progress)
+ return;
+ ... make progress ...
+ state = STATEm;
+ break;
+ ...
+ }
+
+ so when inflate() is called again, the same case is attempted again, and
+ if the appropriate resources are provided, the machine proceeds to the
+ next state. The NEEDBITS() macro is usually the way the state evaluates
+ whether it can proceed or should return. NEEDBITS() does the return if
+ the requested bits are not available. The typical use of the BITS macros
+ is:
+
+ NEEDBITS(n);
+ ... do something with BITS(n) ...
+ DROPBITS(n);
+
+ where NEEDBITS(n) either returns from inflate() if there isn't enough
+ input left to load n bits into the accumulator, or it continues. BITS(n)
+ gives the low n bits in the accumulator. When done, DROPBITS(n) drops
+ the low n bits off the accumulator. INITBITS() clears the accumulator
+ and sets the number of available bits to zero. BYTEBITS() discards just
+ enough bits to put the accumulator on a byte boundary. After BYTEBITS()
+ and a NEEDBITS(8), then BITS(8) would return the next byte in the stream.
+
+ NEEDBITS(n) uses PULLBYTE() to get an available byte of input, or to return
+ if there is no input available. The decoding of variable length codes uses
+ PULLBYTE() directly in order to pull just enough bytes to decode the next
+ code, and no more.
+
+ Some states loop until they get enough input, making sure that enough
+ state information is maintained to continue the loop where it left off
+ if NEEDBITS() returns in the loop. For example, want, need, and keep
+ would all have to actually be part of the saved state in case NEEDBITS()
+ returns:
+
+ case STATEw:
+ while (want < need) {
+ NEEDBITS(n);
+ keep[want++] = BITS(n);
+ DROPBITS(n);
+ }
+ state = STATEx;
+ case STATEx:
+
+ As shown above, if the next state is also the next case, then the break
+ is omitted.
+
+ A state may also return if there is not enough output space available to
+ complete that state. Those states are copying stored data, writing a
+ literal byte, and copying a matching string.
+
+ When returning, a "goto inf_leave" is used to update the total counters,
+ update the check value, and determine whether any progress has been made
+ during that inflate() call in order to return the proper return code.
+ Progress is defined as a change in either strm->avail_in or strm->avail_out.
+ When there is a window, goto inf_leave will update the window with the last
+ output written. If a goto inf_leave occurs in the middle of decompression
+ and there is no window currently, goto inf_leave will create one and copy
+ output to the window for the next call of inflate().
+
+ In this implementation, the flush parameter of inflate() only affects the
+ return code (per zlib.h). inflate() always writes as much as possible to
+ strm->next_out, given the space available and the provided input--the effect
+ documented in zlib.h of Z_SYNC_FLUSH. Furthermore, inflate() always defers
+ the allocation of and copying into a sliding window until necessary, which
+ provides the effect documented in zlib.h for Z_FINISH when the entire input
+ stream available. So the only thing the flush parameter actually does is:
+ when flush is set to Z_FINISH, inflate() cannot return Z_OK. Instead it
+ will return Z_BUF_ERROR if it has not reached the end of the stream.
+ */
+
+int ZEXPORT inflate(strm, flush)
+z_streamp strm;
+int flush;
+{
+ struct inflate_state FAR *state;
+ unsigned char FAR *next; /* next input */
+ unsigned char FAR *put; /* next output */
+ unsigned have, left; /* available input and output */
+ unsigned long hold; /* bit buffer */
+ unsigned bits; /* bits in bit buffer */
+ unsigned in, out; /* save starting available input and output */
+ unsigned copy; /* number of stored or match bytes to copy */
+ unsigned char FAR *from; /* where to copy match bytes from */
+ code this; /* current decoding table entry */
+ code last; /* parent table entry */
+ unsigned len; /* length to copy for repeats, bits to drop */
+ int ret; /* return code */
+#ifdef GUNZIP
+ unsigned char hbuf[4]; /* buffer for gzip header crc calculation */
+#endif
+ static const unsigned short order[19] = /* permutation of code lengths */
+ {16, 17, 18, 0, 8, 7, 9, 6, 10, 5, 11, 4, 12, 3, 13, 2, 14, 1, 15};
+
+ if (strm == Z_NULL || strm->state == Z_NULL || strm->next_out == Z_NULL ||
+ (strm->next_in == Z_NULL && strm->avail_in != 0))
+ return Z_STREAM_ERROR;
+
+ state = (struct inflate_state FAR *)strm->state;
+ if (state->mode == TYPE) state->mode = TYPEDO; /* skip check */
+ LOAD();
+ in = have;
+ out = left;
+ ret = Z_OK;
+ for (;;)
+ switch (state->mode) {
+ case HEAD:
+ if (state->wrap == 0) {
+ state->mode = TYPEDO;
+ break;
+ }
+ NEEDBITS(16);
+#ifdef GUNZIP
+ if ((state->wrap & 2) && hold == 0x8b1f) { /* gzip header */
+ state->check = crc32(0L, Z_NULL, 0);
+ CRC2(state->check, hold);
+ INITBITS();
+ state->mode = FLAGS;
+ break;
+ }
+ state->flags = 0; /* expect zlib header */
+ if (state->head != Z_NULL)
+ state->head->done = -1;
+ if (!(state->wrap & 1) || /* check if zlib header allowed */
+#else
+ if (
+#endif
+ ((BITS(8) << 8) + (hold >> 8)) % 31) {
+ strm->msg = (char *)"incorrect header check";
+ state->mode = BAD;
+ break;
+ }
+ if (BITS(4) != Z_DEFLATED) {
+ strm->msg = (char *)"unknown compression method";
+ state->mode = BAD;
+ break;
+ }
+ DROPBITS(4);
+ len = BITS(4) + 8;
+ if (len > state->wbits) {
+ strm->msg = (char *)"invalid window size";
+ state->mode = BAD;
+ break;
+ }
+ state->dmax = 1U << len;
+ Tracev((stderr, "inflate: zlib header ok\n"));
+ strm->adler = state->check = adler32(0L, Z_NULL, 0);
+ state->mode = hold & 0x200 ? DICTID : TYPE;
+ INITBITS();
+ break;
+#ifdef GUNZIP
+ case FLAGS:
+ NEEDBITS(16);
+ state->flags = (int)(hold);
+ if ((state->flags & 0xff) != Z_DEFLATED) {
+ strm->msg = (char *)"unknown compression method";
+ state->mode = BAD;
+ break;
+ }
+ if (state->flags & 0xe000) {
+ strm->msg = (char *)"unknown header flags set";
+ state->mode = BAD;
+ break;
+ }
+ if (state->head != Z_NULL)
+ state->head->text = (int)((hold >> 8) & 1);
+ if (state->flags & 0x0200) CRC2(state->check, hold);
+ INITBITS();
+ state->mode = TIME;
+ /*FALLTHRU*/
+ case TIME:
+ NEEDBITS(32);
+ if (state->head != Z_NULL)
+ state->head->time = hold;
+ if (state->flags & 0x0200) CRC4(state->check, hold);
+ INITBITS();
+ state->mode = OS;
+ /*FALLTHRU*/
+ case OS:
+ NEEDBITS(16);
+ if (state->head != Z_NULL) {
+ state->head->xflags = (int)(hold & 0xff);
+ state->head->os = (int)(hold >> 8);
+ }
+ if (state->flags & 0x0200) CRC2(state->check, hold);
+ INITBITS();
+ state->mode = EXLEN;
+ /*FALLTHRU*/
+ case EXLEN:
+ if (state->flags & 0x0400) {
+ NEEDBITS(16);
+ state->length = (unsigned)(hold);
+ if (state->head != Z_NULL)
+ state->head->extra_len = (unsigned)hold;
+ if (state->flags & 0x0200) CRC2(state->check, hold);
+ INITBITS();
+ }
+ else if (state->head != Z_NULL)
+ state->head->extra = Z_NULL;
+ state->mode = EXTRA;
+ /*FALLTHRU*/
+ case EXTRA:
+ if (state->flags & 0x0400) {
+ copy = state->length;
+ if (copy > have) copy = have;
+ if (copy) {
+ if (state->head != Z_NULL &&
+ state->head->extra != Z_NULL) {
+ len = state->head->extra_len - state->length;
+ zmemcpy(state->head->extra + len, next,
+ len + copy > state->head->extra_max ?
+ state->head->extra_max - len : copy);
+ }
+ if (state->flags & 0x0200)
+ state->check = crc32(state->check, next, copy);
+ have -= copy;
+ next += copy;
+ state->length -= copy;
+ }
+ if (state->length) goto inf_leave;
+ }
+ state->length = 0;
+ state->mode = NAME;
+ /*FALLTHRU*/
+ case NAME:
+ if (state->flags & 0x0800) {
+ if (have == 0) goto inf_leave;
+ copy = 0;
+ do {
+ len = (unsigned)(next[copy++]);
+ if (state->head != Z_NULL &&
+ state->head->name != Z_NULL &&
+ state->length < state->head->name_max)
+ state->head->name[state->length++] = len;
+ } while (len && copy < have);
+ if (state->flags & 0x0200)
+ state->check = crc32(state->check, next, copy);
+ have -= copy;
+ next += copy;
+ if (len) goto inf_leave;
+ }
+ else if (state->head != Z_NULL)
+ state->head->name = Z_NULL;
+ state->length = 0;
+ state->mode = COMMENT;
+ /*FALLTHRU*/
+ case COMMENT:
+ if (state->flags & 0x1000) {
+ if (have == 0) goto inf_leave;
+ copy = 0;
+ do {
+ len = (unsigned)(next[copy++]);
+ if (state->head != Z_NULL &&
+ state->head->comment != Z_NULL &&
+ state->length < state->head->comm_max)
+ state->head->comment[state->length++] = len;
+ } while (len && copy < have);
+ if (state->flags & 0x0200)
+ state->check = crc32(state->check, next, copy);
+ have -= copy;
+ next += copy;
+ if (len) goto inf_leave;
+ }
+ else if (state->head != Z_NULL)
+ state->head->comment = Z_NULL;
+ state->mode = HCRC;
+ /*FALLTHRU*/
+ case HCRC:
+ if (state->flags & 0x0200) {
+ NEEDBITS(16);
+ if (hold != (state->check & 0xffff)) {
+ strm->msg = (char *)"header crc mismatch";
+ state->mode = BAD;
+ break;
+ }
+ INITBITS();
+ }
+ if (state->head != Z_NULL) {
+ state->head->hcrc = (int)((state->flags >> 9) & 1);
+ state->head->done = 1;
+ }
+ strm->adler = state->check = crc32(0L, Z_NULL, 0);
+ state->mode = TYPE;
+ break;
+#endif
+ case DICTID:
+ NEEDBITS(32);
+ strm->adler = state->check = REVERSE(hold);
+ INITBITS();
+ state->mode = DICT;
+ /*FALLTHRU*/
+ case DICT:
+ if (state->havedict == 0) {
+ RESTORE();
+ return Z_NEED_DICT;
+ }
+ strm->adler = state->check = adler32(0L, Z_NULL, 0);
+ state->mode = TYPE;
+ /*FALLTHRU*/
+ case TYPE:
+ if (flush == Z_BLOCK) goto inf_leave;
+ /*FALLTHRU*/
+ case TYPEDO:
+ if (state->last) {
+ BYTEBITS();
+ state->mode = CHECK;
+ break;
+ }
+ NEEDBITS(3);
+ state->last = BITS(1);
+ DROPBITS(1);
+ switch (BITS(2)) {
+ case 0: /* stored block */
+ Tracev((stderr, "inflate: stored block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = STORED;
+ break;
+ case 1: /* fixed block */
+ fixedtables(state);
+ Tracev((stderr, "inflate: fixed codes block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = LEN; /* decode codes */
+ break;
+ case 2: /* dynamic block */
+ Tracev((stderr, "inflate: dynamic codes block%s\n",
+ state->last ? " (last)" : ""));
+ state->mode = TABLE;
+ break;
+ case 3:
+ strm->msg = (char *)"invalid block type";
+ state->mode = BAD;
+ }
+ DROPBITS(2);
+ break;
+ case STORED:
+ BYTEBITS(); /* go to byte boundary */
+ NEEDBITS(32);
+ if ((hold & 0xffff) != ((hold >> 16) ^ 0xffff)) {
+ strm->msg = (char *)"invalid stored block lengths";
+ state->mode = BAD;
+ break;
+ }
+ state->length = (unsigned)hold & 0xffff;
+ Tracev((stderr, "inflate: stored length %u\n",
+ state->length));
+ INITBITS();
+ state->mode = COPY;
+ /*FALLTHRU*/
+ case COPY:
+ copy = state->length;
+ if (copy) {
+ if (copy > have) copy = have;
+ if (copy > left) copy = left;
+ if (copy == 0) goto inf_leave;
+ zmemcpy(put, next, copy);
+ have -= copy;
+ next += copy;
+ left -= copy;
+ put += copy;
+ state->length -= copy;
+ break;
+ }
+ Tracev((stderr, "inflate: stored end\n"));
+ state->mode = TYPE;
+ break;
+ case TABLE:
+ NEEDBITS(14);
+ state->nlen = BITS(5) + 257;
+ DROPBITS(5);
+ state->ndist = BITS(5) + 1;
+ DROPBITS(5);
+ state->ncode = BITS(4) + 4;
+ DROPBITS(4);
+#ifndef PKZIP_BUG_WORKAROUND
+ if (state->nlen > 286 || state->ndist > 30) {
+ strm->msg = (char *)"too many length or distance symbols";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ Tracev((stderr, "inflate: table sizes ok\n"));
+ state->have = 0;
+ state->mode = LENLENS;
+ /*FALLTHRU*/
+ case LENLENS:
+ while (state->have < state->ncode) {
+ NEEDBITS(3);
+ state->lens[order[state->have++]] = (unsigned short)BITS(3);
+ DROPBITS(3);
+ }
+ while (state->have < 19)
+ state->lens[order[state->have++]] = 0;
+ state->next = state->codes;
+ state->lencode = (code const FAR *)(state->next);
+ state->lenbits = 7;
+ ret = inflate_table(CODES, state->lens, 19, &(state->next),
+ &(state->lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid code lengths set";
+ state->mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: code lengths ok\n"));
+ state->have = 0;
+ state->mode = CODELENS;
+ /*FALLTHRU*/
+ case CODELENS:
+ while (state->have < state->nlen + state->ndist) {
+ for (;;) {
+ this = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(this.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (this.val < 16) {
+ NEEDBITS(this.bits);
+ DROPBITS(this.bits);
+ state->lens[state->have++] = this.val;
+ }
+ else {
+ if (this.val == 16) {
+ NEEDBITS(this.bits + 2);
+ DROPBITS(this.bits);
+ if (state->have == 0) {
+ strm->msg = (char *)"invalid bit length repeat";
+ state->mode = BAD;
+ break;
+ }
+ len = state->lens[state->have - 1];
+ copy = 3 + BITS(2);
+ DROPBITS(2);
+ }
+ else if (this.val == 17) {
+ NEEDBITS(this.bits + 3);
+ DROPBITS(this.bits);
+ len = 0;
+ copy = 3 + BITS(3);
+ DROPBITS(3);
+ }
+ else {
+ NEEDBITS(this.bits + 7);
+ DROPBITS(this.bits);
+ len = 0;
+ copy = 11 + BITS(7);
+ DROPBITS(7);
+ }
+ if (state->have + copy > state->nlen + state->ndist) {
+ strm->msg = (char *)"invalid bit length repeat";
+ state->mode = BAD;
+ break;
+ }
+ while (copy--)
+ state->lens[state->have++] = (unsigned short)len;
+ }
+ }
+
+ /* handle error breaks in while */
+ if (state->mode == BAD) break;
+
+ /* build code tables */
+ state->next = state->codes;
+ state->lencode = (code const FAR *)(state->next);
+ state->lenbits = 9;
+ ret = inflate_table(LENS, state->lens, state->nlen, &(state->next),
+ &(state->lenbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid literal/lengths set";
+ state->mode = BAD;
+ break;
+ }
+ state->distcode = (code const FAR *)(state->next);
+ state->distbits = 6;
+ ret = inflate_table(DISTS, state->lens + state->nlen, state->ndist,
+ &(state->next), &(state->distbits), state->work);
+ if (ret) {
+ strm->msg = (char *)"invalid distances set";
+ state->mode = BAD;
+ break;
+ }
+ Tracev((stderr, "inflate: codes ok\n"));
+ state->mode = LEN;
+ /*FALLTHRU*/
+ case LEN:
+ if (have >= 6 && left >= 258) {
+ RESTORE();
+ inflate_fast(strm, out);
+ LOAD();
+ break;
+ }
+ for (;;) {
+ this = state->lencode[BITS(state->lenbits)];
+ if ((unsigned)(this.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if (this.op && (this.op & 0xf0) == 0) {
+ last = this;
+ for (;;) {
+ this = state->lencode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + this.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ }
+ DROPBITS(this.bits);
+ state->length = (unsigned)this.val;
+ if ((int)(this.op) == 0) {
+ Tracevv((stderr, this.val >= 0x20 && this.val < 0x7f ?
+ "inflate: literal '%c'\n" :
+ "inflate: literal 0x%02x\n", this.val));
+ state->mode = LIT;
+ break;
+ }
+ if (this.op & 32) {
+ Tracevv((stderr, "inflate: end of block\n"));
+ state->mode = TYPE;
+ break;
+ }
+ if (this.op & 64) {
+ strm->msg = (char *)"invalid literal/length code";
+ state->mode = BAD;
+ break;
+ }
+ state->extra = (unsigned)(this.op) & 15;
+ state->mode = LENEXT;
+ /*FALLTHRU*/
+ case LENEXT:
+ if (state->extra) {
+ NEEDBITS(state->extra);
+ state->length += BITS(state->extra);
+ DROPBITS(state->extra);
+ }
+ Tracevv((stderr, "inflate: length %u\n", state->length));
+ state->mode = DIST;
+ /*FALLTHRU*/
+ case DIST:
+ for (;;) {
+ this = state->distcode[BITS(state->distbits)];
+ if ((unsigned)(this.bits) <= bits) break;
+ PULLBYTE();
+ }
+ if ((this.op & 0xf0) == 0) {
+ last = this;
+ for (;;) {
+ this = state->distcode[last.val +
+ (BITS(last.bits + last.op) >> last.bits)];
+ if ((unsigned)(last.bits + this.bits) <= bits) break;
+ PULLBYTE();
+ }
+ DROPBITS(last.bits);
+ }
+ DROPBITS(this.bits);
+ if (this.op & 64) {
+ strm->msg = (char *)"invalid distance code";
+ state->mode = BAD;
+ break;
+ }
+ state->offset = (unsigned)this.val;
+ state->extra = (unsigned)(this.op) & 15;
+ state->mode = DISTEXT;
+ /*FALLTHRU*/
+ case DISTEXT:
+ if (state->extra) {
+ NEEDBITS(state->extra);
+ state->offset += BITS(state->extra);
+ DROPBITS(state->extra);
+ }
+#ifdef INFLATE_STRICT
+ if (state->offset > state->dmax) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+#endif
+ if (state->offset > state->whave + out - left) {
+ strm->msg = (char *)"invalid distance too far back";
+ state->mode = BAD;
+ break;
+ }
+ Tracevv((stderr, "inflate: distance %u\n", state->offset));
+ state->mode = MATCH;
+ /*FALLTHRU*/
+ case MATCH:
+ if (left == 0) goto inf_leave;
+ copy = out - left;
+ if (state->offset > copy) { /* copy from window */
+ copy = state->offset - copy;
+ if (copy > state->write) {
+ copy -= state->write;
+ from = state->window + (state->wsize - copy);
+ }
+ else
+ from = state->window + (state->write - copy);
+ if (copy > state->length) copy = state->length;
+ }
+ else { /* copy from output */
+ from = put - state->offset;
+ copy = state->length;
+ }
+ if (copy > left) copy = left;
+ left -= copy;
+ state->length -= copy;
+ do {
+ *put++ = *from++;
+ } while (--copy);
+ if (state->length == 0) state->mode = LEN;
+ break;
+ case LIT:
+ if (left == 0) goto inf_leave;
+ *put++ = (unsigned char)(state->length);
+ left--;
+ state->mode = LEN;
+ break;
+ case CHECK:
+ if (state->wrap) {
+ NEEDBITS(32);
+ out -= left;
+ strm->total_out += out;
+ state->total += out;
+ if (out)
+ strm->adler = state->check =
+ UPDATE(state->check, put - out, out);
+ out = left;
+ if ((
+#ifdef GUNZIP
+ state->flags ? hold :
+#endif
+ REVERSE(hold)) != state->check) {
+ strm->msg = (char *)"incorrect data check";
+ state->mode = BAD;
+ break;
+ }
+ INITBITS();
+ Tracev((stderr, "inflate: check matches trailer\n"));
+ }
+#ifdef GUNZIP
+ state->mode = LENGTH;
+ /*FALLTHRU*/
+ case LENGTH:
+ if (state->wrap && state->flags) {
+ NEEDBITS(32);
+ if (hold != (state->total & 0xffffffffUL)) {
+ strm->msg = (char *)"incorrect length check";
+ state->mode = BAD;
+ break;
+ }
+ INITBITS();
+ Tracev((stderr, "inflate: length matches trailer\n"));
+ }
+#endif
+ state->mode = DONE;
+ /*FALLTHRU*/
+ case DONE:
+ ret = Z_STREAM_END;
+ goto inf_leave;
+ case BAD:
+ ret = Z_DATA_ERROR;
+ goto inf_leave;
+ case MEM:
+ return Z_MEM_ERROR;
+ case SYNC:
+ default:
+ return Z_STREAM_ERROR;
+ }
+
+ /*
+ Return from inflate(), updating the total counts and the check value.
+ If there was no progress during the inflate() call, return a buffer
+ error. Call updatewindow() to create and/or update the window state.
+ Note: a memory error from inflate() is non-recoverable.
+ */
+ inf_leave:
+ RESTORE();
+ if (state->wsize || (state->mode < CHECK && out != strm->avail_out))
+ if (updatewindow(strm, out)) {
+ state->mode = MEM;
+ return Z_MEM_ERROR;
+ }
+ in -= strm->avail_in;
+ out -= strm->avail_out;
+ strm->total_in += in;
+ strm->total_out += out;
+ state->total += out;
+ if (state->wrap && out)
+ strm->adler = state->check =
+ UPDATE(state->check, strm->next_out - out, out);
+ strm->data_type = state->bits + (state->last ? 64 : 0) +
+ (state->mode == TYPE ? 128 : 0);
+ if (((in == 0 && out == 0) || flush == Z_FINISH) && ret == Z_OK)
+ ret = Z_BUF_ERROR;
+ return ret;
+}
+
+int ZEXPORT inflateEnd(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+ if (strm == Z_NULL || strm->state == Z_NULL || strm->zfree == (free_func)0)
+ return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (state->window != Z_NULL) ZFREE(strm, state->window);
+ ZFREE(strm, strm->state);
+ strm->state = Z_NULL;
+ Tracev((stderr, "inflate: end\n"));
+ return Z_OK;
+}
+
+int ZEXPORT inflateSetDictionary(strm, dictionary, dictLength)
+z_streamp strm;
+const Bytef *dictionary;
+uInt dictLength;
+{
+ struct inflate_state FAR *state;
+ unsigned long id;
+
+ /* check state */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (state->wrap != 0 && state->mode != DICT)
+ return Z_STREAM_ERROR;
+
+ /* check for correct dictionary id */
+ if (state->mode == DICT) {
+ id = adler32(0L, Z_NULL, 0);
+ id = adler32(id, dictionary, dictLength);
+ if (id != state->check)
+ return Z_DATA_ERROR;
+ }
+
+ /* copy dictionary to window */
+ if (updatewindow(strm, strm->avail_out)) {
+ state->mode = MEM;
+ return Z_MEM_ERROR;
+ }
+ if (dictLength > state->wsize) {
+ zmemcpy(state->window, dictionary + dictLength - state->wsize,
+ state->wsize);
+ state->whave = state->wsize;
+ }
+ else {
+ zmemcpy(state->window + state->wsize - dictLength, dictionary,
+ dictLength);
+ state->whave = dictLength;
+ }
+ state->havedict = 1;
+ Tracev((stderr, "inflate: dictionary set\n"));
+ return Z_OK;
+}
+
+int ZEXPORT inflateGetHeader(strm, head)
+z_streamp strm;
+gz_headerp head;
+{
+ struct inflate_state FAR *state;
+
+ /* check state */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if ((state->wrap & 2) == 0) return Z_STREAM_ERROR;
+
+ /* save header structure */
+ state->head = head;
+ head->done = 0;
+ return Z_OK;
+}
+
+/*
+ Search buf[0..len-1] for the pattern: 0, 0, 0xff, 0xff. Return when found
+ or when out of input. When called, *have is the number of pattern bytes
+ found in order so far, in 0..3. On return *have is updated to the new
+ state. If on return *have equals four, then the pattern was found and the
+ return value is how many bytes were read including the last byte of the
+ pattern. If *have is less than four, then the pattern has not been found
+ yet and the return value is len. In the latter case, syncsearch() can be
+ called again with more data and the *have state. *have is initialized to
+ zero for the first call.
+ */
+local unsigned syncsearch(have, buf, len)
+unsigned FAR *have;
+unsigned char FAR *buf;
+unsigned len;
+{
+ unsigned got;
+ unsigned next;
+
+ got = *have;
+ next = 0;
+ while (next < len && got < 4) {
+ if ((int)(buf[next]) == (got < 2 ? 0 : 0xff))
+ got++;
+ else if (buf[next])
+ got = 0;
+ else
+ got = 4 - got;
+ next++;
+ }
+ *have = got;
+ return next;
+}
+
+int ZEXPORT inflateSync(strm)
+z_streamp strm;
+{
+ unsigned len; /* number of bytes to look at or looked at */
+ unsigned long in, out; /* temporary to save total_in and total_out */
+ unsigned char buf[4]; /* to restore bit buffer to byte string */
+ struct inflate_state FAR *state;
+
+ /* check parameters */
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ if (strm->avail_in == 0 && state->bits < 8) return Z_BUF_ERROR;
+
+ /* if first time, start search in bit buffer */
+ if (state->mode != SYNC) {
+ state->mode = SYNC;
+ state->hold <<= state->bits & 7;
+ state->bits -= state->bits & 7;
+ len = 0;
+ while (state->bits >= 8) {
+ buf[len++] = (unsigned char)(state->hold);
+ state->hold >>= 8;
+ state->bits -= 8;
+ }
+ state->have = 0;
+ (void) syncsearch(&(state->have), buf, len);
+ }
+
+ /* search available input */
+ len = syncsearch(&(state->have), strm->next_in, strm->avail_in);
+ strm->avail_in -= len;
+ strm->next_in += len;
+ strm->total_in += len;
+
+ /* return no joy or set up to restart inflate() on a new block */
+ if (state->have != 4) return Z_DATA_ERROR;
+ in = strm->total_in; out = strm->total_out;
+ (void) inflateReset(strm);
+ strm->total_in = in; strm->total_out = out;
+ state->mode = TYPE;
+ return Z_OK;
+}
+
+/*
+ Returns true if inflate is currently at the end of a block generated by
+ Z_SYNC_FLUSH or Z_FULL_FLUSH. This function is used by one PPP
+ implementation to provide an additional safety check. PPP uses
+ Z_SYNC_FLUSH but removes the length bytes of the resulting empty stored
+ block. When decompressing, PPP checks that at the end of input packet,
+ inflate is waiting for these length bytes.
+ */
+int ZEXPORT inflateSyncPoint(strm)
+z_streamp strm;
+{
+ struct inflate_state FAR *state;
+
+ if (strm == Z_NULL || strm->state == Z_NULL) return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)strm->state;
+ return state->mode == STORED && state->bits == 0;
+}
+
+int ZEXPORT inflateCopy(dest, source)
+z_streamp dest;
+z_streamp source;
+{
+ struct inflate_state FAR *state;
+ struct inflate_state FAR *copy;
+ unsigned char FAR *window;
+ unsigned wsize;
+
+ /* check input */
+ if (dest == Z_NULL || source == Z_NULL || source->state == Z_NULL ||
+ source->zalloc == (alloc_func)0 || source->zfree == (free_func)0)
+ return Z_STREAM_ERROR;
+ state = (struct inflate_state FAR *)source->state;
+
+ /* allocate space */
+ copy = (struct inflate_state FAR *)
+ ZALLOC(source, 1, sizeof(struct inflate_state));
+ if (copy == Z_NULL) return Z_MEM_ERROR;
+ window = Z_NULL;
+ if (state->window != Z_NULL) {
+ window = (unsigned char FAR *)
+ ZALLOC(source, 1U << state->wbits, sizeof(unsigned char));
+ if (window == Z_NULL) {
+ ZFREE(source, copy);
+ return Z_MEM_ERROR;
+ }
+ }
+
+ /* copy state */
+ zmemcpy(dest, source, sizeof(z_stream));
+ zmemcpy(copy, state, sizeof(struct inflate_state));
+ if (state->lencode >= state->codes &&
+ state->lencode <= state->codes + ENOUGH - 1) {
+ copy->lencode = copy->codes + (state->lencode - state->codes);
+ copy->distcode = copy->codes + (state->distcode - state->codes);
+ }
+ copy->next = copy->codes + (state->next - state->codes);
+ if (window != Z_NULL) {
+ wsize = 1U << state->wbits;
+ zmemcpy(window, state->window, wsize);
+ }
+ copy->window = window;
+ dest->state = (struct internal_state FAR *)copy;
+ return Z_OK;
+}
diff --git a/sys/contrib/opensolaris/uts/common/zmod/inflate.h b/sys/contrib/opensolaris/uts/common/zmod/inflate.h
new file mode 100644
index 0000000..4d28b22
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/inflate.h
@@ -0,0 +1,117 @@
+/* inflate.h -- internal inflate state definition
+ * Copyright (C) 1995-2004 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* define NO_GZIP when compiling if you want to disable gzip header and
+ trailer decoding by inflate(). NO_GZIP would be used to avoid linking in
+ the crc code when it is not needed. For shared libraries, gzip decoding
+ should be left enabled. */
+#ifndef NO_GZIP
+# define GUNZIP
+#endif
+
+/* Possible inflate modes between inflate() calls */
+typedef enum {
+ HEAD, /* i: waiting for magic header */
+ FLAGS, /* i: waiting for method and flags (gzip) */
+ TIME, /* i: waiting for modification time (gzip) */
+ OS, /* i: waiting for extra flags and operating system (gzip) */
+ EXLEN, /* i: waiting for extra length (gzip) */
+ EXTRA, /* i: waiting for extra bytes (gzip) */
+ NAME, /* i: waiting for end of file name (gzip) */
+ COMMENT, /* i: waiting for end of comment (gzip) */
+ HCRC, /* i: waiting for header crc (gzip) */
+ DICTID, /* i: waiting for dictionary check value */
+ DICT, /* waiting for inflateSetDictionary() call */
+ TYPE, /* i: waiting for type bits, including last-flag bit */
+ TYPEDO, /* i: same, but skip check to exit inflate on new block */
+ STORED, /* i: waiting for stored size (length and complement) */
+ COPY, /* i/o: waiting for input or output to copy stored block */
+ TABLE, /* i: waiting for dynamic block table lengths */
+ LENLENS, /* i: waiting for code length code lengths */
+ CODELENS, /* i: waiting for length/lit and distance code lengths */
+ LEN, /* i: waiting for length/lit code */
+ LENEXT, /* i: waiting for length extra bits */
+ DIST, /* i: waiting for distance code */
+ DISTEXT, /* i: waiting for distance extra bits */
+ MATCH, /* o: waiting for output space to copy string */
+ LIT, /* o: waiting for output space to write literal */
+ CHECK, /* i: waiting for 32-bit check value */
+ LENGTH, /* i: waiting for 32-bit length (gzip) */
+ DONE, /* finished check, done -- remain here until reset */
+ BAD, /* got a data error -- remain here until reset */
+ MEM, /* got an inflate() memory error -- remain here until reset */
+ SYNC /* looking for synchronization bytes to restart inflate() */
+} inflate_mode;
+
+/*
+ State transitions between above modes -
+
+ (most modes can go to the BAD or MEM mode -- not shown for clarity)
+
+ Process header:
+ HEAD -> (gzip) or (zlib)
+ (gzip) -> FLAGS -> TIME -> OS -> EXLEN -> EXTRA -> NAME
+ NAME -> COMMENT -> HCRC -> TYPE
+ (zlib) -> DICTID or TYPE
+ DICTID -> DICT -> TYPE
+ Read deflate blocks:
+ TYPE -> STORED or TABLE or LEN or CHECK
+ STORED -> COPY -> TYPE
+ TABLE -> LENLENS -> CODELENS -> LEN
+ Read deflate codes:
+ LEN -> LENEXT or LIT or TYPE
+ LENEXT -> DIST -> DISTEXT -> MATCH -> LEN
+ LIT -> LEN
+ Process trailer:
+ CHECK -> LENGTH -> DONE
+ */
+
+/* state maintained between inflate() calls. Approximately 7K bytes. */
+struct inflate_state {
+ inflate_mode mode; /* current inflate mode */
+ int last; /* true if processing last block */
+ int wrap; /* bit 0 true for zlib, bit 1 true for gzip */
+ int havedict; /* true if dictionary provided */
+ int flags; /* gzip header method and flags (0 if zlib) */
+ unsigned dmax; /* zlib header max distance (INFLATE_STRICT) */
+ unsigned long check; /* protected copy of check value */
+ unsigned long total; /* protected copy of output count */
+ gz_headerp head; /* where to save gzip header information */
+ /* sliding window */
+ unsigned wbits; /* log base 2 of requested window size */
+ unsigned wsize; /* window size or zero if not using window */
+ unsigned whave; /* valid bytes in the window */
+ unsigned write; /* window write index */
+ unsigned char FAR *window; /* allocated sliding window, if needed */
+ /* bit accumulator */
+ unsigned long hold; /* input bit accumulator */
+ unsigned bits; /* number of bits in "in" */
+ /* for string and stored block copying */
+ unsigned length; /* literal or length of data to copy */
+ unsigned offset; /* distance back to copy string from */
+ /* for table and code decoding */
+ unsigned extra; /* extra bits needed */
+ /* fixed and dynamic code tables */
+ code const FAR *lencode; /* starting table for length/literal codes */
+ code const FAR *distcode; /* starting table for distance codes */
+ unsigned lenbits; /* index bits for lencode */
+ unsigned distbits; /* index bits for distcode */
+ /* dynamic table building */
+ unsigned ncode; /* number of code length code lengths */
+ unsigned nlen; /* number of length code lengths */
+ unsigned ndist; /* number of distance code lengths */
+ unsigned have; /* number of code lengths in lens[] */
+ code FAR *next; /* next available space in codes[] */
+ unsigned short lens[320]; /* temporary storage for code lengths */
+ unsigned short work[288]; /* work area for code table building */
+ code codes[ENOUGH]; /* space for code tables */
+};
diff --git a/sys/contrib/opensolaris/uts/common/zmod/inftrees.c b/sys/contrib/opensolaris/uts/common/zmod/inftrees.c
new file mode 100644
index 0000000..2d37167
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/inftrees.c
@@ -0,0 +1,331 @@
+/* inftrees.c -- generate Huffman trees for efficient decoding
+ * Copyright (C) 1995-2005 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "zutil.h"
+#include "inftrees.h"
+
+#define MAXBITS 15
+
+static const char inflate_copyright[] =
+ " inflate 1.2.3 Copyright 1995-2005 Mark Adler ";
+/*
+ If you use the zlib library in a product, an acknowledgment is welcome
+ in the documentation of your product. If for some reason you cannot
+ include such an acknowledgment, I would appreciate that you keep this
+ copyright string in the executable of your product.
+ */
+
+/*
+ Build a set of tables to decode the provided canonical Huffman code.
+ The code lengths are lens[0..codes-1]. The result starts at *table,
+ whose indices are 0..2^bits-1. work is a writable array of at least
+ lens shorts, which is used as a work area. type is the type of code
+ to be generated, CODES, LENS, or DISTS. On return, zero is success,
+ -1 is an invalid code, and +1 means that ENOUGH isn't enough. table
+ on return points to the next available entry's address. bits is the
+ requested root table index bits, and on return it is the actual root
+ table index bits. It will differ if the request is greater than the
+ longest code or if it is less than the shortest code.
+ */
+int inflate_table(type, lens, codes, table, bits, work)
+codetype type;
+unsigned short FAR *lens;
+unsigned codes;
+code FAR * FAR *table;
+unsigned FAR *bits;
+unsigned short FAR *work;
+{
+ unsigned len; /* a code's length in bits */
+ unsigned sym; /* index of code symbols */
+ unsigned min, max; /* minimum and maximum code lengths */
+ unsigned root; /* number of index bits for root table */
+ unsigned curr; /* number of index bits for current table */
+ unsigned drop; /* code bits to drop for sub-table */
+ int left; /* number of prefix codes available */
+ unsigned used; /* code entries in table used */
+ unsigned huff; /* Huffman code */
+ unsigned incr; /* for incrementing code, index */
+ unsigned fill; /* index for replicating entries */
+ unsigned low; /* low bits for current root entry */
+ unsigned mask; /* mask for low root bits */
+ code this; /* table entry for duplication */
+ code FAR *next; /* next available space in table */
+ const unsigned short FAR *base; /* base value table to use */
+ const unsigned short FAR *extra; /* extra bits table to use */
+ int end; /* use base and extra for symbol > end */
+ unsigned short count[MAXBITS+1]; /* number of codes of each length */
+ unsigned short offs[MAXBITS+1]; /* offsets in table for each length */
+ static const unsigned short lbase[31] = { /* Length codes 257..285 base */
+ 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31,
+ 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0};
+ static const unsigned short lext[31] = { /* Length codes 257..285 extra */
+ 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18,
+ 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 201, 196};
+ static const unsigned short dbase[32] = { /* Distance codes 0..29 base */
+ 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193,
+ 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145,
+ 8193, 12289, 16385, 24577, 0, 0};
+ static const unsigned short dext[32] = { /* Distance codes 0..29 extra */
+ 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22,
+ 23, 23, 24, 24, 25, 25, 26, 26, 27, 27,
+ 28, 28, 29, 29, 64, 64};
+
+ /*
+ Process a set of code lengths to create a canonical Huffman code. The
+ code lengths are lens[0..codes-1]. Each length corresponds to the
+ symbols 0..codes-1. The Huffman code is generated by first sorting the
+ symbols by length from short to long, and retaining the symbol order
+ for codes with equal lengths. Then the code starts with all zero bits
+ for the first code of the shortest length, and the codes are integer
+ increments for the same length, and zeros are appended as the length
+ increases. For the deflate format, these bits are stored backwards
+ from their more natural integer increment ordering, and so when the
+ decoding tables are built in the large loop below, the integer codes
+ are incremented backwards.
+
+ This routine assumes, but does not check, that all of the entries in
+ lens[] are in the range 0..MAXBITS. The caller must assure this.
+ 1..MAXBITS is interpreted as that code length. zero means that that
+ symbol does not occur in this code.
+
+ The codes are sorted by computing a count of codes for each length,
+ creating from that a table of starting indices for each length in the
+ sorted table, and then entering the symbols in order in the sorted
+ table. The sorted table is work[], with that space being provided by
+ the caller.
+
+ The length counts are used for other purposes as well, i.e. finding
+ the minimum and maximum length codes, determining if there are any
+ codes at all, checking for a valid set of lengths, and looking ahead
+ at length counts to determine sub-table sizes when building the
+ decoding tables.
+ */
+
+ /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */
+ for (len = 0; len <= MAXBITS; len++)
+ count[len] = 0;
+ for (sym = 0; sym < codes; sym++)
+ count[lens[sym]]++;
+
+ /* bound code lengths, force root to be within code lengths */
+ root = *bits;
+ for (max = MAXBITS; max >= 1; max--)
+ if (count[max] != 0) break;
+ if (root > max) root = max;
+ if (max == 0) { /* no symbols to code at all */
+ this.op = (unsigned char)64; /* invalid code marker */
+ this.bits = (unsigned char)1;
+ this.val = (unsigned short)0;
+ *(*table)++ = this; /* make a table to force an error */
+ *(*table)++ = this;
+ *bits = 1;
+ return 0; /* no symbols, but wait for decoding to report error */
+ }
+ for (min = 1; min <= MAXBITS; min++)
+ if (count[min] != 0) break;
+ if (root < min) root = min;
+
+ /* check for an over-subscribed or incomplete set of lengths */
+ left = 1;
+ for (len = 1; len <= MAXBITS; len++) {
+ left <<= 1;
+ left -= count[len];
+ if (left < 0) return -1; /* over-subscribed */
+ }
+ if (left > 0 && (type == CODES || max != 1))
+ return -1; /* incomplete set */
+
+ /* generate offsets into symbol table for each length for sorting */
+ offs[1] = 0;
+ for (len = 1; len < MAXBITS; len++)
+ offs[len + 1] = offs[len] + count[len];
+
+ /* sort symbols by length, by symbol order within each length */
+ for (sym = 0; sym < codes; sym++)
+ if (lens[sym] != 0) work[offs[lens[sym]]++] = (unsigned short)sym;
+
+ /*
+ Create and fill in decoding tables. In this loop, the table being
+ filled is at next and has curr index bits. The code being used is huff
+ with length len. That code is converted to an index by dropping drop
+ bits off of the bottom. For codes where len is less than drop + curr,
+ those top drop + curr - len bits are incremented through all values to
+ fill the table with replicated entries.
+
+ root is the number of index bits for the root table. When len exceeds
+ root, sub-tables are created pointed to by the root entry with an index
+ of the low root bits of huff. This is saved in low to check for when a
+ new sub-table should be started. drop is zero when the root table is
+ being filled, and drop is root when sub-tables are being filled.
+
+ When a new sub-table is needed, it is necessary to look ahead in the
+ code lengths to determine what size sub-table is needed. The length
+ counts are used for this, and so count[] is decremented as codes are
+ entered in the tables.
+
+ used keeps track of how many table entries have been allocated from the
+ provided *table space. It is checked when a LENS table is being made
+ against the space in *table, ENOUGH, minus the maximum space needed by
+ the worst case distance code, MAXD. This should never happen, but the
+ sufficiency of ENOUGH has not been proven exhaustively, hence the check.
+ This assumes that when type == LENS, bits == 9.
+
+ sym increments through all symbols, and the loop terminates when
+ all codes of length max, i.e. all codes, have been processed. This
+ routine permits incomplete codes, so another loop after this one fills
+ in the rest of the decoding tables with invalid code markers.
+ */
+
+ /* set up for code type */
+ switch (type) {
+ case CODES:
+ base = extra = work; /* dummy value--not used */
+ end = 19;
+ break;
+ case LENS:
+ base = lbase;
+ base -= 257;
+ extra = lext;
+ extra -= 257;
+ end = 256;
+ break;
+ default: /* DISTS */
+ base = dbase;
+ extra = dext;
+ end = -1;
+ }
+
+ /* initialize state for loop */
+ huff = 0; /* starting code */
+ sym = 0; /* starting code symbol */
+ len = min; /* starting code length */
+ next = *table; /* current table to fill in */
+ curr = root; /* current table index bits */
+ drop = 0; /* current bits to drop from code for index */
+ low = (unsigned)(-1); /* trigger new sub-table when len > root */
+ used = 1U << root; /* use root table entries */
+ mask = used - 1; /* mask for comparing low */
+
+ /* check available table space */
+ if (type == LENS && used >= ENOUGH - MAXD)
+ return 1;
+
+ /* process all codes and make table entries */
+ for (;;) {
+ /* create table entry */
+ this.bits = (unsigned char)(len - drop);
+ if ((int)(work[sym]) < end) {
+ this.op = (unsigned char)0;
+ this.val = work[sym];
+ }
+ else if ((int)(work[sym]) > end) {
+ this.op = (unsigned char)(extra[work[sym]]);
+ this.val = base[work[sym]];
+ }
+ else {
+ this.op = (unsigned char)(32 + 64); /* end of block */
+ this.val = 0;
+ }
+
+ /* replicate for those indices with low len bits equal to huff */
+ incr = 1U << (len - drop);
+ fill = 1U << curr;
+ min = fill; /* save offset to next table */
+ do {
+ fill -= incr;
+ next[(huff >> drop) + fill] = this;
+ } while (fill != 0);
+
+ /* backwards increment the len-bit code huff */
+ incr = 1U << (len - 1);
+ while (huff & incr)
+ incr >>= 1;
+ if (incr != 0) {
+ huff &= incr - 1;
+ huff += incr;
+ }
+ else
+ huff = 0;
+
+ /* go to next symbol, update count, len */
+ sym++;
+ if (--(count[len]) == 0) {
+ if (len == max) break;
+ len = lens[work[sym]];
+ }
+
+ /* create new sub-table if needed */
+ if (len > root && (huff & mask) != low) {
+ /* if first time, transition to sub-tables */
+ if (drop == 0)
+ drop = root;
+
+ /* increment past last table */
+ next += min; /* here min is 1 << curr */
+
+ /* determine length of next table */
+ curr = len - drop;
+ left = (int)(1 << curr);
+ while (curr + drop < max) {
+ left -= count[curr + drop];
+ if (left <= 0) break;
+ curr++;
+ left <<= 1;
+ }
+
+ /* check for enough space */
+ used += 1U << curr;
+ if (type == LENS && used >= ENOUGH - MAXD)
+ return 1;
+
+ /* point entry in root table to sub-table */
+ low = huff & mask;
+ (*table)[low].op = (unsigned char)curr;
+ (*table)[low].bits = (unsigned char)root;
+ (*table)[low].val = (unsigned short)(next - *table);
+ }
+ }
+
+ /*
+ Fill in rest of table for incomplete codes. This loop is similar to the
+ loop above in incrementing huff for table indices. It is assumed that
+ len is equal to curr + drop, so there is no loop needed to increment
+ through high index bits. When the current sub-table is filled, the loop
+ drops back to the root table to fill in any remaining entries there.
+ */
+ this.op = (unsigned char)64; /* invalid code marker */
+ this.bits = (unsigned char)(len - drop);
+ this.val = (unsigned short)0;
+ while (huff != 0) {
+ /* when done with sub-table, drop back to root table */
+ if (drop != 0 && (huff & mask) != low) {
+ drop = 0;
+ len = root;
+ next = *table;
+ this.bits = (unsigned char)len;
+ }
+
+ /* put invalid code marker in table */
+ next[huff >> drop] = this;
+
+ /* backwards increment the len-bit code huff */
+ incr = 1U << (len - 1);
+ while (huff & incr)
+ incr >>= 1;
+ if (incr != 0) {
+ huff &= incr - 1;
+ huff += incr;
+ }
+ else
+ huff = 0;
+ }
+
+ /* set return parameters */
+ *table += used;
+ *bits = root;
+ return 0;
+}
diff --git a/sys/contrib/opensolaris/uts/common/zmod/inftrees.h b/sys/contrib/opensolaris/uts/common/zmod/inftrees.h
new file mode 100644
index 0000000..546e8c0
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/inftrees.h
@@ -0,0 +1,57 @@
+/* inftrees.h -- header to use inftrees.c
+ * Copyright (C) 1995-2005 Mark Adler
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+/* Structure for decoding tables. Each entry provides either the
+ information needed to do the operation requested by the code that
+ indexed that table entry, or it provides a pointer to another
+ table that indexes more bits of the code. op indicates whether
+ the entry is a pointer to another table, a literal, a length or
+ distance, an end-of-block, or an invalid code. For a table
+ pointer, the low four bits of op is the number of index bits of
+ that table. For a length or distance, the low four bits of op
+ is the number of extra bits to get after the code. bits is
+ the number of bits in this code or part of the code to drop off
+ of the bit buffer. val is the actual byte to output in the case
+ of a literal, the base length or distance, or the offset from
+ the current table to the next table. Each entry is four bytes. */
+typedef struct {
+ unsigned char op; /* operation, extra bits, table bits */
+ unsigned char bits; /* bits in this part of the code */
+ unsigned short val; /* offset in table or code value */
+} code;
+
+/* op values as set by inflate_table():
+ 00000000 - literal
+ 0000tttt - table link, tttt != 0 is the number of table index bits
+ 0001eeee - length or distance, eeee is the number of extra bits
+ 01100000 - end of block
+ 01000000 - invalid code
+ */
+
+/* Maximum size of dynamic tree. The maximum found in a long but non-
+ exhaustive search was 1444 code structures (852 for length/literals
+ and 592 for distances, the latter actually the result of an
+ exhaustive search). The true maximum is not known, but the value
+ below is more than safe. */
+#define ENOUGH 2048
+#define MAXD 592
+
+/* Type of code to build for inftable() */
+typedef enum {
+ CODES,
+ LENS,
+ DISTS
+} codetype;
+
+extern int inflate_table OF((codetype type, unsigned short FAR *lens,
+ unsigned codes, code FAR * FAR *table,
+ unsigned FAR *bits, unsigned short FAR *work));
diff --git a/sys/contrib/opensolaris/uts/common/zmod/trees.c b/sys/contrib/opensolaris/uts/common/zmod/trees.c
new file mode 100644
index 0000000..ce0cebc
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/trees.c
@@ -0,0 +1,1219 @@
+/* trees.c -- output deflated data using Huffman coding
+ * Copyright (C) 1995-2005 Jean-loup Gailly
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+/*
+ * ALGORITHM
+ *
+ * The "deflation" process uses several Huffman trees. The more
+ * common source values are represented by shorter bit sequences.
+ *
+ * Each code tree is stored in a compressed form which is itself
+ * a Huffman encoding of the lengths of all the code strings (in
+ * ascending order by source values). The actual code strings are
+ * reconstructed from the lengths in the inflate process, as described
+ * in the deflate specification.
+ *
+ * REFERENCES
+ *
+ * Deutsch, L.P.,"'Deflate' Compressed Data Format Specification".
+ * Available in ftp.uu.net:/pub/archiving/zip/doc/deflate-1.1.doc
+ *
+ * Storer, James A.
+ * Data Compression: Methods and Theory, pp. 49-50.
+ * Computer Science Press, 1988. ISBN 0-7167-8156-5.
+ *
+ * Sedgewick, R.
+ * Algorithms, p290.
+ * Addison-Wesley, 1983. ISBN 0-201-06672-6.
+ */
+
+/* #define GEN_TREES_H */
+
+#include "deflate.h"
+
+#ifdef DEBUG
+# include <ctype.h>
+#endif
+
+/* ===========================================================================
+ * Constants
+ */
+
+#define MAX_BL_BITS 7
+/* Bit length codes must not exceed MAX_BL_BITS bits */
+
+#define END_BLOCK 256
+/* end of block literal code */
+
+#define REP_3_6 16
+/* repeat previous bit length 3-6 times (2 bits of repeat count) */
+
+#define REPZ_3_10 17
+/* repeat a zero length 3-10 times (3 bits of repeat count) */
+
+#define REPZ_11_138 18
+/* repeat a zero length 11-138 times (7 bits of repeat count) */
+
+local const int extra_lbits[LENGTH_CODES] /* extra bits for each length code */
+ = {0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0};
+
+local const int extra_dbits[D_CODES] /* extra bits for each distance code */
+ = {0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13};
+
+local const int extra_blbits[BL_CODES]/* extra bits for each bit length code */
+ = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7};
+
+local const uch bl_order[BL_CODES]
+ = {16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15};
+/* The lengths of the bit length codes are sent in order of decreasing
+ * probability, to avoid transmitting the lengths for unused bit length codes.
+ */
+
+#define Buf_size (8 * 2*sizeof(char))
+/* Number of bits used within bi_buf. (bi_buf might be implemented on
+ * more than 16 bits on some systems.)
+ */
+
+/* ===========================================================================
+ * Local data. These are initialized only once.
+ */
+
+#define DIST_CODE_LEN 512 /* see definition of array dist_code below */
+
+#if defined(GEN_TREES_H) || !defined(STDC)
+/* non ANSI compilers may not accept trees.h */
+
+local ct_data static_ltree[L_CODES+2];
+/* The static literal tree. Since the bit lengths are imposed, there is no
+ * need for the L_CODES extra codes used during heap construction. However
+ * The codes 286 and 287 are needed to build a canonical tree (see _tr_init
+ * below).
+ */
+
+local ct_data static_dtree[D_CODES];
+/* The static distance tree. (Actually a trivial tree since all codes use
+ * 5 bits.)
+ */
+
+uch _dist_code[DIST_CODE_LEN];
+/* Distance codes. The first 256 values correspond to the distances
+ * 3 .. 258, the last 256 values correspond to the top 8 bits of
+ * the 15 bit distances.
+ */
+
+uch _length_code[MAX_MATCH-MIN_MATCH+1];
+/* length code for each normalized match length (0 == MIN_MATCH) */
+
+local int base_length[LENGTH_CODES];
+/* First normalized length for each code (0 = MIN_MATCH) */
+
+local int base_dist[D_CODES];
+/* First normalized distance for each code (0 = distance of 1) */
+
+#else
+# include "trees.h"
+#endif /* GEN_TREES_H */
+
+struct static_tree_desc_s {
+ const ct_data *static_tree; /* static tree or NULL */
+ const intf *extra_bits; /* extra bits for each code or NULL */
+ int extra_base; /* base index for extra_bits */
+ int elems; /* max number of elements in the tree */
+ int max_length; /* max bit length for the codes */
+};
+
+local static_tree_desc static_l_desc =
+{static_ltree, extra_lbits, LITERALS+1, L_CODES, MAX_BITS};
+
+local static_tree_desc static_d_desc =
+{static_dtree, extra_dbits, 0, D_CODES, MAX_BITS};
+
+local static_tree_desc static_bl_desc =
+{(const ct_data *)0, extra_blbits, 0, BL_CODES, MAX_BL_BITS};
+
+/* ===========================================================================
+ * Local (static) routines in this file.
+ */
+
+local void tr_static_init OF((void));
+local void init_block OF((deflate_state *s));
+local void pqdownheap OF((deflate_state *s, ct_data *tree, int k));
+local void gen_bitlen OF((deflate_state *s, tree_desc *desc));
+local void gen_codes OF((ct_data *tree, int max_code, ushf *bl_count));
+local void build_tree OF((deflate_state *s, tree_desc *desc));
+local void scan_tree OF((deflate_state *s, ct_data *tree, int max_code));
+local void send_tree OF((deflate_state *s, ct_data *tree, int max_code));
+local int build_bl_tree OF((deflate_state *s));
+local void send_all_trees OF((deflate_state *s, int lcodes, int dcodes,
+ int blcodes));
+local void compress_block OF((deflate_state *s, ct_data *ltree,
+ ct_data *dtree));
+local void set_data_type OF((deflate_state *s));
+local unsigned bi_reverse OF((unsigned value, int length));
+local void bi_windup OF((deflate_state *s));
+local void bi_flush OF((deflate_state *s));
+local void copy_block OF((deflate_state *s, charf *buf, unsigned len,
+ int header));
+
+#ifdef GEN_TREES_H
+local void gen_trees_header OF((void));
+#endif
+
+#ifndef DEBUG
+# define send_code(s, c, tree) send_bits(s, tree[c].Code, tree[c].Len)
+ /* Send a code of the given tree. c and tree must not have side effects */
+
+#else /* DEBUG */
+# define send_code(s, c, tree) \
+ { if (z_verbose>2) fprintf(stderr,"\ncd %3d ",(c)); \
+ send_bits(s, tree[c].Code, tree[c].Len); }
+#endif
+
+/* ===========================================================================
+ * Output a short LSB first on the stream.
+ * IN assertion: there is enough room in pendingBuf.
+ */
+#define put_short(s, w) { \
+ put_byte(s, (uch)((w) & 0xff)); \
+ put_byte(s, (uch)((ush)(w) >> 8)); \
+}
+
+/* ===========================================================================
+ * Send a value on a given number of bits.
+ * IN assertion: length <= 16 and value fits in length bits.
+ */
+#ifdef DEBUG
+local void send_bits OF((deflate_state *s, int value, int length));
+
+local void send_bits(s, value, length)
+ deflate_state *s;
+ int value; /* value to send */
+ int length; /* number of bits */
+{
+ Tracevv((stderr," l %2d v %4x ", length, value));
+ Assert(length > 0 && length <= 15, "invalid length");
+ s->bits_sent += (ulg)length;
+
+ /* If not enough room in bi_buf, use (valid) bits from bi_buf and
+ * (16 - bi_valid) bits from value, leaving (width - (16-bi_valid))
+ * unused bits in value.
+ */
+ if (s->bi_valid > (int)Buf_size - length) {
+ s->bi_buf |= (value << s->bi_valid);
+ put_short(s, s->bi_buf);
+ s->bi_buf = (ush)value >> (Buf_size - s->bi_valid);
+ s->bi_valid += length - Buf_size;
+ } else {
+ s->bi_buf |= value << s->bi_valid;
+ s->bi_valid += length;
+ }
+}
+#else /* !DEBUG */
+
+#define send_bits(s, value, length) \
+{ int len = length;\
+ if (s->bi_valid > (int)Buf_size - len) {\
+ int val = value;\
+ s->bi_buf |= (val << s->bi_valid);\
+ put_short(s, s->bi_buf);\
+ s->bi_buf = (ush)val >> (Buf_size - s->bi_valid);\
+ s->bi_valid += len - Buf_size;\
+ } else {\
+ s->bi_buf |= (value) << s->bi_valid;\
+ s->bi_valid += len;\
+ }\
+}
+#endif /* DEBUG */
+
+
+/* the arguments must not have side effects */
+
+/* ===========================================================================
+ * Initialize the various 'constant' tables.
+ */
+local void tr_static_init()
+{
+#if defined(GEN_TREES_H) || !defined(STDC)
+ static int static_init_done = 0;
+ int n; /* iterates over tree elements */
+ int bits; /* bit counter */
+ int length; /* length value */
+ int code; /* code value */
+ int dist; /* distance index */
+ ush bl_count[MAX_BITS+1];
+ /* number of codes at each bit length for an optimal tree */
+
+ if (static_init_done) return;
+
+ /* For some embedded targets, global variables are not initialized: */
+ static_l_desc.static_tree = static_ltree;
+ static_l_desc.extra_bits = extra_lbits;
+ static_d_desc.static_tree = static_dtree;
+ static_d_desc.extra_bits = extra_dbits;
+ static_bl_desc.extra_bits = extra_blbits;
+
+ /* Initialize the mapping length (0..255) -> length code (0..28) */
+ length = 0;
+ for (code = 0; code < LENGTH_CODES-1; code++) {
+ base_length[code] = length;
+ for (n = 0; n < (1<<extra_lbits[code]); n++) {
+ _length_code[length++] = (uch)code;
+ }
+ }
+ Assert (length == 256, "tr_static_init: length != 256");
+ /* Note that the length 255 (match length 258) can be represented
+ * in two different ways: code 284 + 5 bits or code 285, so we
+ * overwrite length_code[255] to use the best encoding:
+ */
+ _length_code[length-1] = (uch)code;
+
+ /* Initialize the mapping dist (0..32K) -> dist code (0..29) */
+ dist = 0;
+ for (code = 0 ; code < 16; code++) {
+ base_dist[code] = dist;
+ for (n = 0; n < (1<<extra_dbits[code]); n++) {
+ _dist_code[dist++] = (uch)code;
+ }
+ }
+ Assert (dist == 256, "tr_static_init: dist != 256");
+ dist >>= 7; /* from now on, all distances are divided by 128 */
+ for ( ; code < D_CODES; code++) {
+ base_dist[code] = dist << 7;
+ for (n = 0; n < (1<<(extra_dbits[code]-7)); n++) {
+ _dist_code[256 + dist++] = (uch)code;
+ }
+ }
+ Assert (dist == 256, "tr_static_init: 256+dist != 512");
+
+ /* Construct the codes of the static literal tree */
+ for (bits = 0; bits <= MAX_BITS; bits++) bl_count[bits] = 0;
+ n = 0;
+ while (n <= 143) static_ltree[n++].Len = 8, bl_count[8]++;
+ while (n <= 255) static_ltree[n++].Len = 9, bl_count[9]++;
+ while (n <= 279) static_ltree[n++].Len = 7, bl_count[7]++;
+ while (n <= 287) static_ltree[n++].Len = 8, bl_count[8]++;
+ /* Codes 286 and 287 do not exist, but we must include them in the
+ * tree construction to get a canonical Huffman tree (longest code
+ * all ones)
+ */
+ gen_codes((ct_data *)static_ltree, L_CODES+1, bl_count);
+
+ /* The static distance tree is trivial: */
+ for (n = 0; n < D_CODES; n++) {
+ static_dtree[n].Len = 5;
+ static_dtree[n].Code = bi_reverse((unsigned)n, 5);
+ }
+ static_init_done = 1;
+
+# ifdef GEN_TREES_H
+ gen_trees_header();
+# endif
+#endif /* defined(GEN_TREES_H) || !defined(STDC) */
+}
+
+/* ===========================================================================
+ * Genererate the file trees.h describing the static trees.
+ */
+#ifdef GEN_TREES_H
+# ifndef DEBUG
+# include <stdio.h>
+# endif
+
+# define SEPARATOR(i, last, width) \
+ ((i) == (last)? "\n};\n\n" : \
+ ((i) % (width) == (width)-1 ? ",\n" : ", "))
+
+void gen_trees_header()
+{
+ FILE *header = fopen("trees.h", "w");
+ int i;
+
+ Assert (header != NULL, "Can't open trees.h");
+ fprintf(header,
+ "/* header created automatically with -DGEN_TREES_H */\n\n");
+
+ fprintf(header, "local const ct_data static_ltree[L_CODES+2] = {\n");
+ for (i = 0; i < L_CODES+2; i++) {
+ fprintf(header, "{{%3u},{%3u}}%s", static_ltree[i].Code,
+ static_ltree[i].Len, SEPARATOR(i, L_CODES+1, 5));
+ }
+
+ fprintf(header, "local const ct_data static_dtree[D_CODES] = {\n");
+ for (i = 0; i < D_CODES; i++) {
+ fprintf(header, "{{%2u},{%2u}}%s", static_dtree[i].Code,
+ static_dtree[i].Len, SEPARATOR(i, D_CODES-1, 5));
+ }
+
+ fprintf(header, "const uch _dist_code[DIST_CODE_LEN] = {\n");
+ for (i = 0; i < DIST_CODE_LEN; i++) {
+ fprintf(header, "%2u%s", _dist_code[i],
+ SEPARATOR(i, DIST_CODE_LEN-1, 20));
+ }
+
+ fprintf(header, "const uch _length_code[MAX_MATCH-MIN_MATCH+1]= {\n");
+ for (i = 0; i < MAX_MATCH-MIN_MATCH+1; i++) {
+ fprintf(header, "%2u%s", _length_code[i],
+ SEPARATOR(i, MAX_MATCH-MIN_MATCH, 20));
+ }
+
+ fprintf(header, "local const int base_length[LENGTH_CODES] = {\n");
+ for (i = 0; i < LENGTH_CODES; i++) {
+ fprintf(header, "%1u%s", base_length[i],
+ SEPARATOR(i, LENGTH_CODES-1, 20));
+ }
+
+ fprintf(header, "local const int base_dist[D_CODES] = {\n");
+ for (i = 0; i < D_CODES; i++) {
+ fprintf(header, "%5u%s", base_dist[i],
+ SEPARATOR(i, D_CODES-1, 10));
+ }
+
+ fclose(header);
+}
+#endif /* GEN_TREES_H */
+
+/* ===========================================================================
+ * Initialize the tree data structures for a new zlib stream.
+ */
+void _tr_init(s)
+ deflate_state *s;
+{
+ tr_static_init();
+
+ s->l_desc.dyn_tree = s->dyn_ltree;
+ s->l_desc.stat_desc = &static_l_desc;
+
+ s->d_desc.dyn_tree = s->dyn_dtree;
+ s->d_desc.stat_desc = &static_d_desc;
+
+ s->bl_desc.dyn_tree = s->bl_tree;
+ s->bl_desc.stat_desc = &static_bl_desc;
+
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+ s->last_eob_len = 8; /* enough lookahead for inflate */
+#ifdef DEBUG
+ s->compressed_len = 0L;
+ s->bits_sent = 0L;
+#endif
+
+ /* Initialize the first block of the first file: */
+ init_block(s);
+}
+
+/* ===========================================================================
+ * Initialize a new block.
+ */
+local void init_block(s)
+ deflate_state *s;
+{
+ int n; /* iterates over tree elements */
+
+ /* Initialize the trees. */
+ for (n = 0; n < L_CODES; n++) s->dyn_ltree[n].Freq = 0;
+ for (n = 0; n < D_CODES; n++) s->dyn_dtree[n].Freq = 0;
+ for (n = 0; n < BL_CODES; n++) s->bl_tree[n].Freq = 0;
+
+ s->dyn_ltree[END_BLOCK].Freq = 1;
+ s->opt_len = s->static_len = 0L;
+ s->last_lit = s->matches = 0;
+}
+
+#define SMALLEST 1
+/* Index within the heap array of least frequent node in the Huffman tree */
+
+
+/* ===========================================================================
+ * Remove the smallest element from the heap and recreate the heap with
+ * one less element. Updates heap and heap_len.
+ */
+#define pqremove(s, tree, top) \
+{\
+ top = s->heap[SMALLEST]; \
+ s->heap[SMALLEST] = s->heap[s->heap_len--]; \
+ pqdownheap(s, tree, SMALLEST); \
+}
+
+/* ===========================================================================
+ * Compares to subtrees, using the tree depth as tie breaker when
+ * the subtrees have equal frequency. This minimizes the worst case length.
+ */
+#define smaller(tree, n, m, depth) \
+ (tree[n].Freq < tree[m].Freq || \
+ (tree[n].Freq == tree[m].Freq && depth[n] <= depth[m]))
+
+/* ===========================================================================
+ * Restore the heap property by moving down the tree starting at node k,
+ * exchanging a node with the smallest of its two sons if necessary, stopping
+ * when the heap property is re-established (each father smaller than its
+ * two sons).
+ */
+local void pqdownheap(s, tree, k)
+ deflate_state *s;
+ ct_data *tree; /* the tree to restore */
+ int k; /* node to move down */
+{
+ int v = s->heap[k];
+ int j = k << 1; /* left son of k */
+ while (j <= s->heap_len) {
+ /* Set j to the smallest of the two sons: */
+ if (j < s->heap_len &&
+ smaller(tree, s->heap[j+1], s->heap[j], s->depth)) {
+ j++;
+ }
+ /* Exit if v is smaller than both sons */
+ if (smaller(tree, v, s->heap[j], s->depth)) break;
+
+ /* Exchange v with the smallest son */
+ s->heap[k] = s->heap[j]; k = j;
+
+ /* And continue down the tree, setting j to the left son of k */
+ j <<= 1;
+ }
+ s->heap[k] = v;
+}
+
+/* ===========================================================================
+ * Compute the optimal bit lengths for a tree and update the total bit length
+ * for the current block.
+ * IN assertion: the fields freq and dad are set, heap[heap_max] and
+ * above are the tree nodes sorted by increasing frequency.
+ * OUT assertions: the field len is set to the optimal bit length, the
+ * array bl_count contains the frequencies for each bit length.
+ * The length opt_len is updated; static_len is also updated if stree is
+ * not null.
+ */
+local void gen_bitlen(s, desc)
+ deflate_state *s;
+ tree_desc *desc; /* the tree descriptor */
+{
+ ct_data *tree = desc->dyn_tree;
+ int max_code = desc->max_code;
+ const ct_data *stree = desc->stat_desc->static_tree;
+ const intf *extra = desc->stat_desc->extra_bits;
+ int base = desc->stat_desc->extra_base;
+ int max_length = desc->stat_desc->max_length;
+ int h; /* heap index */
+ int n, m; /* iterate over the tree elements */
+ int bits; /* bit length */
+ int xbits; /* extra bits */
+ ush f; /* frequency */
+ int overflow = 0; /* number of elements with bit length too large */
+
+ for (bits = 0; bits <= MAX_BITS; bits++) s->bl_count[bits] = 0;
+
+ /* In a first pass, compute the optimal bit lengths (which may
+ * overflow in the case of the bit length tree).
+ */
+ tree[s->heap[s->heap_max]].Len = 0; /* root of the heap */
+
+ for (h = s->heap_max+1; h < HEAP_SIZE; h++) {
+ n = s->heap[h];
+ bits = tree[tree[n].Dad].Len + 1;
+ if (bits > max_length) bits = max_length, overflow++;
+ tree[n].Len = (ush)bits;
+ /* We overwrite tree[n].Dad which is no longer needed */
+
+ if (n > max_code) continue; /* not a leaf node */
+
+ s->bl_count[bits]++;
+ xbits = 0;
+ if (n >= base) xbits = extra[n-base];
+ f = tree[n].Freq;
+ s->opt_len += (ulg)f * (bits + xbits);
+ if (stree) s->static_len += (ulg)f * (stree[n].Len + xbits);
+ }
+ if (overflow == 0) return;
+
+ Trace((stderr,"\nbit length overflow\n"));
+ /* This happens for example on obj2 and pic of the Calgary corpus */
+
+ /* Find the first bit length which could increase: */
+ do {
+ bits = max_length-1;
+ while (s->bl_count[bits] == 0) bits--;
+ s->bl_count[bits]--; /* move one leaf down the tree */
+ s->bl_count[bits+1] += 2; /* move one overflow item as its brother */
+ s->bl_count[max_length]--;
+ /* The brother of the overflow item also moves one step up,
+ * but this does not affect bl_count[max_length]
+ */
+ overflow -= 2;
+ } while (overflow > 0);
+
+ /* Now recompute all bit lengths, scanning in increasing frequency.
+ * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all
+ * lengths instead of fixing only the wrong ones. This idea is taken
+ * from 'ar' written by Haruhiko Okumura.)
+ */
+ for (bits = max_length; bits != 0; bits--) {
+ n = s->bl_count[bits];
+ while (n != 0) {
+ m = s->heap[--h];
+ if (m > max_code) continue;
+ if ((unsigned) tree[m].Len != (unsigned) bits) {
+ Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits));
+ s->opt_len += ((long)bits - (long)tree[m].Len)
+ *(long)tree[m].Freq;
+ tree[m].Len = (ush)bits;
+ }
+ n--;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Generate the codes for a given tree and bit counts (which need not be
+ * optimal).
+ * IN assertion: the array bl_count contains the bit length statistics for
+ * the given tree and the field len is set for all tree elements.
+ * OUT assertion: the field code is set for all tree elements of non
+ * zero code length.
+ */
+local void gen_codes (tree, max_code, bl_count)
+ ct_data *tree; /* the tree to decorate */
+ int max_code; /* largest code with non zero frequency */
+ ushf *bl_count; /* number of codes at each bit length */
+{
+ ush next_code[MAX_BITS+1]; /* next code value for each bit length */
+ ush code = 0; /* running code value */
+ int bits; /* bit index */
+ int n; /* code index */
+
+ /* The distribution counts are first used to generate the code values
+ * without bit reversal.
+ */
+ for (bits = 1; bits <= MAX_BITS; bits++) {
+ next_code[bits] = code = (code + bl_count[bits-1]) << 1;
+ }
+ /* Check that the bit counts in bl_count are consistent. The last code
+ * must be all ones.
+ */
+ Assert (code + bl_count[MAX_BITS]-1 == (1<<MAX_BITS)-1,
+ "inconsistent bit counts");
+ Tracev((stderr,"\ngen_codes: max_code %d ", max_code));
+
+ for (n = 0; n <= max_code; n++) {
+ int len = tree[n].Len;
+ if (len == 0) continue;
+ /* Now reverse the bits */
+ tree[n].Code = bi_reverse(next_code[len]++, len);
+
+ Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ",
+ n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1));
+ }
+}
+
+/* ===========================================================================
+ * Construct one Huffman tree and assigns the code bit strings and lengths.
+ * Update the total bit length for the current block.
+ * IN assertion: the field freq is set for all tree elements.
+ * OUT assertions: the fields len and code are set to the optimal bit length
+ * and corresponding code. The length opt_len is updated; static_len is
+ * also updated if stree is not null. The field max_code is set.
+ */
+local void build_tree(s, desc)
+ deflate_state *s;
+ tree_desc *desc; /* the tree descriptor */
+{
+ ct_data *tree = desc->dyn_tree;
+ const ct_data *stree = desc->stat_desc->static_tree;
+ int elems = desc->stat_desc->elems;
+ int n, m; /* iterate over heap elements */
+ int max_code = -1; /* largest code with non zero frequency */
+ int node; /* new node being created */
+
+ /* Construct the initial heap, with least frequent element in
+ * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1].
+ * heap[0] is not used.
+ */
+ s->heap_len = 0, s->heap_max = HEAP_SIZE;
+
+ for (n = 0; n < elems; n++) {
+ if (tree[n].Freq != 0) {
+ s->heap[++(s->heap_len)] = max_code = n;
+ s->depth[n] = 0;
+ } else {
+ tree[n].Len = 0;
+ }
+ }
+
+ /* The pkzip format requires that at least one distance code exists,
+ * and that at least one bit should be sent even if there is only one
+ * possible code. So to avoid special checks later on we force at least
+ * two codes of non zero frequency.
+ */
+ while (s->heap_len < 2) {
+ node = s->heap[++(s->heap_len)] = (max_code < 2 ? ++max_code : 0);
+ tree[node].Freq = 1;
+ s->depth[node] = 0;
+ s->opt_len--; if (stree) s->static_len -= stree[node].Len;
+ /* node is 0 or 1 so it does not have extra bits */
+ }
+ desc->max_code = max_code;
+
+ /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree,
+ * establish sub-heaps of increasing lengths:
+ */
+ for (n = s->heap_len/2; n >= 1; n--) pqdownheap(s, tree, n);
+
+ /* Construct the Huffman tree by repeatedly combining the least two
+ * frequent nodes.
+ */
+ node = elems; /* next internal node of the tree */
+ do {
+ pqremove(s, tree, n); /* n = node of least frequency */
+ m = s->heap[SMALLEST]; /* m = node of next least frequency */
+
+ s->heap[--(s->heap_max)] = n; /* keep the nodes sorted by frequency */
+ s->heap[--(s->heap_max)] = m;
+
+ /* Create a new node father of n and m */
+ tree[node].Freq = tree[n].Freq + tree[m].Freq;
+ s->depth[node] = (uch)((s->depth[n] >= s->depth[m] ?
+ s->depth[n] : s->depth[m]) + 1);
+ tree[n].Dad = tree[m].Dad = (ush)node;
+#ifdef DUMP_BL_TREE
+ if (tree == s->bl_tree) {
+ fprintf(stderr,"\nnode %d(%d), sons %d(%d) %d(%d)",
+ node, tree[node].Freq, n, tree[n].Freq, m, tree[m].Freq);
+ }
+#endif
+ /* and insert the new node in the heap */
+ s->heap[SMALLEST] = node++;
+ pqdownheap(s, tree, SMALLEST);
+
+ } while (s->heap_len >= 2);
+
+ s->heap[--(s->heap_max)] = s->heap[SMALLEST];
+
+ /* At this point, the fields freq and dad are set. We can now
+ * generate the bit lengths.
+ */
+ gen_bitlen(s, (tree_desc *)desc);
+
+ /* The field len is now set, we can generate the bit codes */
+ gen_codes ((ct_data *)tree, max_code, s->bl_count);
+}
+
+/* ===========================================================================
+ * Scan a literal or distance tree to determine the frequencies of the codes
+ * in the bit length tree.
+ */
+local void scan_tree (s, tree, max_code)
+ deflate_state *s;
+ ct_data *tree; /* the tree to be scanned */
+ int max_code; /* and its largest code of non zero frequency */
+{
+ int n; /* iterates over all tree elements */
+ int prevlen = -1; /* last emitted length */
+ int curlen; /* length of current code */
+ int nextlen = tree[0].Len; /* length of next code */
+ int count = 0; /* repeat count of the current code */
+ int max_count = 7; /* max repeat count */
+ int min_count = 4; /* min repeat count */
+
+ if (nextlen == 0) max_count = 138, min_count = 3;
+ tree[max_code+1].Len = (ush)0xffff; /* guard */
+
+ for (n = 0; n <= max_code; n++) {
+ curlen = nextlen; nextlen = tree[n+1].Len;
+ if (++count < max_count && curlen == nextlen) {
+ continue;
+ } else if (count < min_count) {
+ s->bl_tree[curlen].Freq += count;
+ } else if (curlen != 0) {
+ if (curlen != prevlen) s->bl_tree[curlen].Freq++;
+ s->bl_tree[REP_3_6].Freq++;
+ } else if (count <= 10) {
+ s->bl_tree[REPZ_3_10].Freq++;
+ } else {
+ s->bl_tree[REPZ_11_138].Freq++;
+ }
+ count = 0; prevlen = curlen;
+ if (nextlen == 0) {
+ max_count = 138, min_count = 3;
+ } else if (curlen == nextlen) {
+ max_count = 6, min_count = 3;
+ } else {
+ max_count = 7, min_count = 4;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Send a literal or distance tree in compressed form, using the codes in
+ * bl_tree.
+ */
+local void send_tree (s, tree, max_code)
+ deflate_state *s;
+ ct_data *tree; /* the tree to be scanned */
+ int max_code; /* and its largest code of non zero frequency */
+{
+ int n; /* iterates over all tree elements */
+ int prevlen = -1; /* last emitted length */
+ int curlen; /* length of current code */
+ int nextlen = tree[0].Len; /* length of next code */
+ int count = 0; /* repeat count of the current code */
+ int max_count = 7; /* max repeat count */
+ int min_count = 4; /* min repeat count */
+
+ /* tree[max_code+1].Len = -1; */ /* guard already set */
+ if (nextlen == 0) max_count = 138, min_count = 3;
+
+ for (n = 0; n <= max_code; n++) {
+ curlen = nextlen; nextlen = tree[n+1].Len;
+ if (++count < max_count && curlen == nextlen) {
+ continue;
+ } else if (count < min_count) {
+ do { send_code(s, curlen, s->bl_tree); } while (--count != 0);
+
+ } else if (curlen != 0) {
+ if (curlen != prevlen) {
+ send_code(s, curlen, s->bl_tree); count--;
+ }
+ Assert(count >= 3 && count <= 6, " 3_6?");
+ send_code(s, REP_3_6, s->bl_tree); send_bits(s, count-3, 2);
+
+ } else if (count <= 10) {
+ send_code(s, REPZ_3_10, s->bl_tree); send_bits(s, count-3, 3);
+
+ } else {
+ send_code(s, REPZ_11_138, s->bl_tree); send_bits(s, count-11, 7);
+ }
+ count = 0; prevlen = curlen;
+ if (nextlen == 0) {
+ max_count = 138, min_count = 3;
+ } else if (curlen == nextlen) {
+ max_count = 6, min_count = 3;
+ } else {
+ max_count = 7, min_count = 4;
+ }
+ }
+}
+
+/* ===========================================================================
+ * Construct the Huffman tree for the bit lengths and return the index in
+ * bl_order of the last bit length code to send.
+ */
+local int build_bl_tree(s)
+ deflate_state *s;
+{
+ int max_blindex; /* index of last bit length code of non zero freq */
+
+ /* Determine the bit length frequencies for literal and distance trees */
+ scan_tree(s, (ct_data *)s->dyn_ltree, s->l_desc.max_code);
+ scan_tree(s, (ct_data *)s->dyn_dtree, s->d_desc.max_code);
+
+ /* Build the bit length tree: */
+ build_tree(s, (tree_desc *)(&(s->bl_desc)));
+ /* opt_len now includes the length of the tree representations, except
+ * the lengths of the bit lengths codes and the 5+5+4 bits for the counts.
+ */
+
+ /* Determine the number of bit length codes to send. The pkzip format
+ * requires that at least 4 bit length codes be sent. (appnote.txt says
+ * 3 but the actual value used is 4.)
+ */
+ for (max_blindex = BL_CODES-1; max_blindex >= 3; max_blindex--) {
+ if (s->bl_tree[bl_order[max_blindex]].Len != 0) break;
+ }
+ /* Update opt_len to include the bit length tree and counts */
+ s->opt_len += 3*(max_blindex+1) + 5+5+4;
+ Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld",
+ s->opt_len, s->static_len));
+
+ return max_blindex;
+}
+
+/* ===========================================================================
+ * Send the header for a block using dynamic Huffman trees: the counts, the
+ * lengths of the bit length codes, the literal tree and the distance tree.
+ * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4.
+ */
+local void send_all_trees(s, lcodes, dcodes, blcodes)
+ deflate_state *s;
+ int lcodes, dcodes, blcodes; /* number of codes for each tree */
+{
+ int rank; /* index in bl_order */
+
+ Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes");
+ Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES,
+ "too many codes");
+ Tracev((stderr, "\nbl counts: "));
+ send_bits(s, lcodes-257, 5); /* not +255 as stated in appnote.txt */
+ send_bits(s, dcodes-1, 5);
+ send_bits(s, blcodes-4, 4); /* not -3 as stated in appnote.txt */
+ for (rank = 0; rank < blcodes; rank++) {
+ Tracev((stderr, "\nbl code %2d ", bl_order[rank]));
+ send_bits(s, s->bl_tree[bl_order[rank]].Len, 3);
+ }
+ Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent));
+
+ send_tree(s, (ct_data *)s->dyn_ltree, lcodes-1); /* literal tree */
+ Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent));
+
+ send_tree(s, (ct_data *)s->dyn_dtree, dcodes-1); /* distance tree */
+ Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent));
+}
+
+/* ===========================================================================
+ * Send a stored block
+ */
+void _tr_stored_block(s, buf, stored_len, eof)
+ deflate_state *s;
+ charf *buf; /* input block */
+ ulg stored_len; /* length of input block */
+ int eof; /* true if this is the last block for a file */
+{
+ send_bits(s, (STORED_BLOCK<<1)+eof, 3); /* send block type */
+#ifdef DEBUG
+ s->compressed_len = (s->compressed_len + 3 + 7) & (ulg)~7L;
+ s->compressed_len += (stored_len + 4) << 3;
+#endif
+ copy_block(s, buf, (unsigned)stored_len, 1); /* with header */
+}
+
+/* ===========================================================================
+ * Send one empty static block to give enough lookahead for inflate.
+ * This takes 10 bits, of which 7 may remain in the bit buffer.
+ * The current inflate code requires 9 bits of lookahead. If the
+ * last two codes for the previous block (real code plus EOB) were coded
+ * on 5 bits or less, inflate may have only 5+3 bits of lookahead to decode
+ * the last real code. In this case we send two empty static blocks instead
+ * of one. (There are no problems if the previous block is stored or fixed.)
+ * To simplify the code, we assume the worst case of last real code encoded
+ * on one bit only.
+ */
+void _tr_align(s)
+ deflate_state *s;
+{
+ send_bits(s, STATIC_TREES<<1, 3);
+ send_code(s, END_BLOCK, static_ltree);
+#ifdef DEBUG
+ s->compressed_len += 10L; /* 3 for block type, 7 for EOB */
+#endif
+ bi_flush(s);
+ /* Of the 10 bits for the empty block, we have already sent
+ * (10 - bi_valid) bits. The lookahead for the last real code (before
+ * the EOB of the previous block) was thus at least one plus the length
+ * of the EOB plus what we have just sent of the empty static block.
+ */
+ if (1 + s->last_eob_len + 10 - s->bi_valid < 9) {
+ send_bits(s, STATIC_TREES<<1, 3);
+ send_code(s, END_BLOCK, static_ltree);
+#ifdef DEBUG
+ s->compressed_len += 10L;
+#endif
+ bi_flush(s);
+ }
+ s->last_eob_len = 7;
+}
+
+/* ===========================================================================
+ * Determine the best encoding for the current block: dynamic trees, static
+ * trees or store, and output the encoded block to the zip file.
+ */
+void _tr_flush_block(s, buf, stored_len, eof)
+ deflate_state *s;
+ charf *buf; /* input block, or NULL if too old */
+ ulg stored_len; /* length of input block */
+ int eof; /* true if this is the last block for a file */
+{
+ ulg opt_lenb, static_lenb; /* opt_len and static_len in bytes */
+ int max_blindex = 0; /* index of last bit length code of non zero freq */
+
+ /* Build the Huffman trees unless a stored block is forced */
+ if (s->level > 0) {
+
+ /* Check if the file is binary or text */
+ if (stored_len > 0 && s->strm->data_type == Z_UNKNOWN)
+ set_data_type(s);
+
+ /* Construct the literal and distance trees */
+ build_tree(s, (tree_desc *)(&(s->l_desc)));
+ Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len,
+ s->static_len));
+
+ build_tree(s, (tree_desc *)(&(s->d_desc)));
+ Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len,
+ s->static_len));
+ /* At this point, opt_len and static_len are the total bit lengths of
+ * the compressed block data, excluding the tree representations.
+ */
+
+ /* Build the bit length tree for the above two trees, and get the index
+ * in bl_order of the last bit length code to send.
+ */
+ max_blindex = build_bl_tree(s);
+
+ /* Determine the best encoding. Compute the block lengths in bytes. */
+ opt_lenb = (s->opt_len+3+7)>>3;
+ static_lenb = (s->static_len+3+7)>>3;
+
+ Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ",
+ opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len,
+ s->last_lit));
+
+ if (static_lenb <= opt_lenb) opt_lenb = static_lenb;
+
+ } else {
+ Assert(buf != (char*)0, "lost buf");
+ opt_lenb = static_lenb = stored_len + 5; /* force a stored block */
+ }
+
+#ifdef FORCE_STORED
+ if (buf != (char*)0) { /* force stored block */
+#else
+ if (stored_len+4 <= opt_lenb && buf != (char*)0) {
+ /* 4: two words for the lengths */
+#endif
+ /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE.
+ * Otherwise we can't have processed more than WSIZE input bytes since
+ * the last block flush, because compression would have been
+ * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to
+ * transform a block into a stored block.
+ */
+ _tr_stored_block(s, buf, stored_len, eof);
+
+#ifdef FORCE_STATIC
+ } else if (static_lenb >= 0) { /* force static trees */
+#else
+ } else if (s->strategy == Z_FIXED || static_lenb == opt_lenb) {
+#endif
+ send_bits(s, (STATIC_TREES<<1)+eof, 3);
+ compress_block(s, (ct_data *)static_ltree, (ct_data *)static_dtree);
+#ifdef DEBUG
+ s->compressed_len += 3 + s->static_len;
+#endif
+ } else {
+ send_bits(s, (DYN_TREES<<1)+eof, 3);
+ send_all_trees(s, s->l_desc.max_code+1, s->d_desc.max_code+1,
+ max_blindex+1);
+ compress_block(s, (ct_data *)s->dyn_ltree, (ct_data *)s->dyn_dtree);
+#ifdef DEBUG
+ s->compressed_len += 3 + s->opt_len;
+#endif
+ }
+ Assert (s->compressed_len == s->bits_sent, "bad compressed size");
+ /* The above check is made mod 2^32, for files larger than 512 MB
+ * and uLong implemented on 32 bits.
+ */
+ init_block(s);
+
+ if (eof) {
+ bi_windup(s);
+#ifdef DEBUG
+ s->compressed_len += 7; /* align on byte boundary */
+#endif
+ }
+ Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3,
+ s->compressed_len-7*eof));
+}
+
+/* ===========================================================================
+ * Save the match info and tally the frequency counts. Return true if
+ * the current block must be flushed.
+ */
+int _tr_tally (s, dist, lc)
+ deflate_state *s;
+ unsigned dist; /* distance of matched string */
+ unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */
+{
+ s->d_buf[s->last_lit] = (ush)dist;
+ s->l_buf[s->last_lit++] = (uch)lc;
+ if (dist == 0) {
+ /* lc is the unmatched char */
+ s->dyn_ltree[lc].Freq++;
+ } else {
+ s->matches++;
+ /* Here, lc is the match length - MIN_MATCH */
+ dist--; /* dist = match distance - 1 */
+ Assert((ush)dist < (ush)MAX_DIST(s) &&
+ (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) &&
+ (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match");
+
+ s->dyn_ltree[_length_code[lc]+LITERALS+1].Freq++;
+ s->dyn_dtree[d_code(dist)].Freq++;
+ }
+
+#ifdef TRUNCATE_BLOCK
+ /* Try to guess if it is profitable to stop the current block here */
+ if ((s->last_lit & 0x1fff) == 0 && s->level > 2) {
+ /* Compute an upper bound for the compressed length */
+ ulg out_length = (ulg)s->last_lit*8L;
+ ulg in_length = (ulg)((long)s->strstart - s->block_start);
+ int dcode;
+ for (dcode = 0; dcode < D_CODES; dcode++) {
+ out_length += (ulg)s->dyn_dtree[dcode].Freq *
+ (5L+extra_dbits[dcode]);
+ }
+ out_length >>= 3;
+ Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ",
+ s->last_lit, in_length, out_length,
+ 100L - out_length*100L/in_length));
+ if (s->matches < s->last_lit/2 && out_length < in_length/2) return 1;
+ }
+#endif
+ return (s->last_lit == s->lit_bufsize-1);
+ /* We avoid equality with lit_bufsize because of wraparound at 64K
+ * on 16 bit machines and because stored blocks are restricted to
+ * 64K-1 bytes.
+ */
+}
+
+/* ===========================================================================
+ * Send the block data compressed using the given Huffman trees
+ */
+local void compress_block(s, ltree, dtree)
+ deflate_state *s;
+ ct_data *ltree; /* literal tree */
+ ct_data *dtree; /* distance tree */
+{
+ unsigned dist; /* distance of matched string */
+ int lc; /* match length or unmatched char (if dist == 0) */
+ unsigned lx = 0; /* running index in l_buf */
+ unsigned code; /* the code to send */
+ int extra; /* number of extra bits to send */
+
+ if (s->last_lit != 0) do {
+ dist = s->d_buf[lx];
+ lc = s->l_buf[lx++];
+ if (dist == 0) {
+ send_code(s, lc, ltree); /* send a literal byte */
+ Tracecv(isgraph(lc), (stderr," '%c' ", lc));
+ } else {
+ /* Here, lc is the match length - MIN_MATCH */
+ code = _length_code[lc];
+ send_code(s, code+LITERALS+1, ltree); /* send the length code */
+ extra = extra_lbits[code];
+ if (extra != 0) {
+ lc -= base_length[code];
+ send_bits(s, lc, extra); /* send the extra length bits */
+ }
+ dist--; /* dist is now the match distance - 1 */
+ code = d_code(dist);
+ Assert (code < D_CODES, "bad d_code");
+
+ send_code(s, code, dtree); /* send the distance code */
+ extra = extra_dbits[code];
+ if (extra != 0) {
+ dist -= base_dist[code];
+ send_bits(s, dist, extra); /* send the extra distance bits */
+ }
+ } /* literal or match pair ? */
+
+ /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */
+ Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx,
+ "pendingBuf overflow");
+
+ } while (lx < s->last_lit);
+
+ send_code(s, END_BLOCK, ltree);
+ s->last_eob_len = ltree[END_BLOCK].Len;
+}
+
+/* ===========================================================================
+ * Set the data type to BINARY or TEXT, using a crude approximation:
+ * set it to Z_TEXT if all symbols are either printable characters (33 to 255)
+ * or white spaces (9 to 13, or 32); or set it to Z_BINARY otherwise.
+ * IN assertion: the fields Freq of dyn_ltree are set.
+ */
+local void set_data_type(s)
+ deflate_state *s;
+{
+ int n;
+
+ for (n = 0; n < 9; n++)
+ if (s->dyn_ltree[n].Freq != 0)
+ break;
+ if (n == 9)
+ for (n = 14; n < 32; n++)
+ if (s->dyn_ltree[n].Freq != 0)
+ break;
+ s->strm->data_type = (n == 32) ? Z_TEXT : Z_BINARY;
+}
+
+/* ===========================================================================
+ * Reverse the first len bits of a code, using straightforward code (a faster
+ * method would use a table)
+ * IN assertion: 1 <= len <= 15
+ */
+local unsigned bi_reverse(code, len)
+ unsigned code; /* the value to invert */
+ int len; /* its bit length */
+{
+ register unsigned res = 0;
+ do {
+ res |= code & 1;
+ code >>= 1, res <<= 1;
+ } while (--len > 0);
+ return res >> 1;
+}
+
+/* ===========================================================================
+ * Flush the bit buffer, keeping at most 7 bits in it.
+ */
+local void bi_flush(s)
+ deflate_state *s;
+{
+ if (s->bi_valid == 16) {
+ put_short(s, s->bi_buf);
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+ } else if (s->bi_valid >= 8) {
+ put_byte(s, (Byte)s->bi_buf);
+ s->bi_buf >>= 8;
+ s->bi_valid -= 8;
+ }
+}
+
+/* ===========================================================================
+ * Flush the bit buffer and align the output on a byte boundary
+ */
+local void bi_windup(s)
+ deflate_state *s;
+{
+ if (s->bi_valid > 8) {
+ put_short(s, s->bi_buf);
+ } else if (s->bi_valid > 0) {
+ put_byte(s, (Byte)s->bi_buf);
+ }
+ s->bi_buf = 0;
+ s->bi_valid = 0;
+#ifdef DEBUG
+ s->bits_sent = (s->bits_sent+7) & ~7;
+#endif
+}
+
+/* ===========================================================================
+ * Copy a stored block, storing first the length and its
+ * one's complement if requested.
+ */
+local void copy_block(s, buf, len, header)
+ deflate_state *s;
+ charf *buf; /* the input data */
+ unsigned len; /* its length */
+ int header; /* true if block header must be written */
+{
+ bi_windup(s); /* align on byte boundary */
+ s->last_eob_len = 8; /* enough lookahead for inflate */
+
+ if (header) {
+ put_short(s, (ush)len);
+ put_short(s, (ush)~len);
+#ifdef DEBUG
+ s->bits_sent += 2*16;
+#endif
+ }
+#ifdef DEBUG
+ s->bits_sent += (ulg)len<<3;
+#endif
+ while (len--) {
+ put_byte(s, *buf++);
+ }
+}
diff --git a/sys/contrib/opensolaris/uts/common/zmod/zconf.h b/sys/contrib/opensolaris/uts/common/zmod/zconf.h
new file mode 100644
index 0000000..ccce7b2
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/zconf.h
@@ -0,0 +1,117 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#ifndef _ZCONF_H
+#define _ZCONF_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/types.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/*
+ * We don't want to turn on zlib's debugging.
+ */
+#undef DEBUG
+
+/*
+ * We define our own memory allocation and deallocation routines that use kmem.
+ */
+#define MY_ZCALLOC
+
+/*
+ * We don't define HAVE_MEMCPY here, but do in zutil.c, and implement our
+ * our versions of zmemcpy(), zmemzero(), and zmemcmp().
+ */
+
+/*
+ * We have a sufficiently capable compiler as to not need zlib's compiler hack.
+ */
+#define NO_DUMMY_DECL
+
+#define compressBound(len) (len + (len >> 12) + (len >> 14) + 11)
+
+#define z_off_t off_t
+#define OF(p) p
+#define ZEXTERN extern
+#define ZEXPORT
+#define ZEXPORTVA
+#define FAR
+
+#define deflateInit_ z_deflateInit_
+#define deflate z_deflate
+#define deflateEnd z_deflateEnd
+#define inflateInit_ z_inflateInit_
+#define inflate z_inflate
+#define inflateEnd z_inflateEnd
+#define deflateInit2_ z_deflateInit2_
+#define deflateSetDictionary z_deflateSetDictionary
+#define deflateCopy z_deflateCopy
+#define deflateReset z_deflateReset
+#define deflateParams z_deflateParams
+#define deflateBound z_deflateBound
+#define deflatePrime z_deflatePrime
+#define inflateInit2_ z_inflateInit2_
+#define inflateSetDictionary z_inflateSetDictionary
+#define inflateSync z_inflateSync
+#define inflateSyncPoint z_inflateSyncPoint
+#define inflateCopy z_inflateCopy
+#define inflateReset z_inflateReset
+#define inflateBack z_inflateBack
+#define inflateBackEnd z_inflateBackEnd
+#define compress zz_compress
+#define compress2 zz_compress2
+#define uncompress zz_uncompress
+#define adler32 z_adler32
+#define crc32 z_crc32
+#define get_crc_table z_get_crc_table
+#define zError z_zError
+
+#define MAX_MEM_LEVEL 9
+#define MAX_WBITS 15
+
+typedef unsigned char Byte;
+typedef unsigned int uInt;
+typedef unsigned long uLong;
+typedef Byte Bytef;
+typedef char charf;
+typedef int intf;
+typedef uInt uIntf;
+typedef uLong uLongf;
+typedef void *voidpc;
+typedef void *voidpf;
+typedef void *voidp;
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZCONF_H */
diff --git a/sys/contrib/opensolaris/uts/common/zmod/zlib.h b/sys/contrib/opensolaris/uts/common/zmod/zlib.h
new file mode 100644
index 0000000..9b971a0
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/zlib.h
@@ -0,0 +1,1359 @@
+/* zlib.h -- interface of the 'zlib' general purpose compression library
+ version 1.2.3, July 18th, 2005
+
+ Copyright (C) 1995-2005 Jean-loup Gailly and Mark Adler
+
+ This software is provided 'as-is', without any express or implied
+ warranty. In no event will the authors be held liable for any damages
+ arising from the use of this software.
+
+ Permission is granted to anyone to use this software for any purpose,
+ including commercial applications, and to alter it and redistribute it
+ freely, subject to the following restrictions:
+
+ 1. The origin of this software must not be misrepresented; you must not
+ claim that you wrote the original software. If you use this software
+ in a product, an acknowledgment in the product documentation would be
+ appreciated but is not required.
+ 2. Altered source versions must be plainly marked as such, and must not be
+ misrepresented as being the original software.
+ 3. This notice may not be removed or altered from any source distribution.
+
+ Jean-loup Gailly Mark Adler
+ jloup@gzip.org madler@alumni.caltech.edu
+
+
+ The data format used by the zlib library is described by RFCs (Request for
+ Comments) 1950 to 1952 in the files http://www.ietf.org/rfc/rfc1950.txt
+ (zlib format), rfc1951.txt (deflate format) and rfc1952.txt (gzip format).
+*/
+
+#ifndef _ZLIB_H
+#define _ZLIB_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "zconf.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#define ZLIB_VERSION "1.2.3"
+#define ZLIB_VERNUM 0x1230
+
+/*
+ The 'zlib' compression library provides in-memory compression and
+ decompression functions, including integrity checks of the uncompressed
+ data. This version of the library supports only one compression method
+ (deflation) but other algorithms will be added later and will have the same
+ stream interface.
+
+ Compression can be done in a single step if the buffers are large
+ enough (for example if an input file is mmap'ed), or can be done by
+ repeated calls of the compression function. In the latter case, the
+ application must provide more input and/or consume the output
+ (providing more output space) before each call.
+
+ The compressed data format used by default by the in-memory functions is
+ the zlib format, which is a zlib wrapper documented in RFC 1950, wrapped
+ around a deflate stream, which is itself documented in RFC 1951.
+
+ The library also supports reading and writing files in gzip (.gz) format
+ with an interface similar to that of stdio using the functions that start
+ with "gz". The gzip format is different from the zlib format. gzip is a
+ gzip wrapper, documented in RFC 1952, wrapped around a deflate stream.
+
+ This library can optionally read and write gzip streams in memory as well.
+
+ The zlib format was designed to be compact and fast for use in memory
+ and on communications channels. The gzip format was designed for single-
+ file compression on file systems, has a larger header than zlib to maintain
+ directory information, and uses a different, slower check method than zlib.
+
+ The library does not install any signal handler. The decoder checks
+ the consistency of the compressed data, so the library should never
+ crash even in case of corrupted input.
+*/
+
+typedef voidpf (*alloc_func) OF((voidpf opaque, uInt items, uInt size));
+typedef void (*free_func) OF((voidpf opaque, voidpf address));
+
+struct internal_state;
+
+typedef struct z_stream_s {
+ Bytef *next_in; /* next input byte */
+ uInt avail_in; /* number of bytes available at next_in */
+ uLong total_in; /* total nb of input bytes read so far */
+
+ Bytef *next_out; /* next output byte should be put there */
+ uInt avail_out; /* remaining free space at next_out */
+ uLong total_out; /* total nb of bytes output so far */
+
+ char *msg; /* last error message, NULL if no error */
+ struct internal_state FAR *state; /* not visible by applications */
+
+ alloc_func zalloc; /* used to allocate the internal state */
+ free_func zfree; /* used to free the internal state */
+ voidpf opaque; /* private data object passed to zalloc and zfree */
+
+ int data_type; /* best guess about the data type: binary or text */
+ uLong adler; /* adler32 value of the uncompressed data */
+ uLong reserved; /* reserved for future use */
+} z_stream;
+
+typedef z_stream FAR *z_streamp;
+
+/*
+ gzip header information passed to and from zlib routines. See RFC 1952
+ for more details on the meanings of these fields.
+*/
+typedef struct gz_header_s {
+ int text; /* true if compressed data believed to be text */
+ uLong time; /* modification time */
+ int xflags; /* extra flags (not used when writing a gzip file) */
+ int os; /* operating system */
+ Bytef *extra; /* pointer to extra field or Z_NULL if none */
+ uInt extra_len; /* extra field length (valid if extra != Z_NULL) */
+ uInt extra_max; /* space at extra (only when reading header) */
+ Bytef *name; /* pointer to zero-terminated file name or Z_NULL */
+ uInt name_max; /* space at name (only when reading header) */
+ Bytef *comment; /* pointer to zero-terminated comment or Z_NULL */
+ uInt comm_max; /* space at comment (only when reading header) */
+ int hcrc; /* true if there was or will be a header crc */
+ int done; /* true when done reading gzip header (not used
+ when writing a gzip file) */
+} gz_header;
+
+typedef gz_header FAR *gz_headerp;
+
+/*
+ The application must update next_in and avail_in when avail_in has
+ dropped to zero. It must update next_out and avail_out when avail_out
+ has dropped to zero. The application must initialize zalloc, zfree and
+ opaque before calling the init function. All other fields are set by the
+ compression library and must not be updated by the application.
+
+ The opaque value provided by the application will be passed as the first
+ parameter for calls of zalloc and zfree. This can be useful for custom
+ memory management. The compression library attaches no meaning to the
+ opaque value.
+
+ zalloc must return Z_NULL if there is not enough memory for the object.
+ If zlib is used in a multi-threaded application, zalloc and zfree must be
+ thread safe.
+
+ On 16-bit systems, the functions zalloc and zfree must be able to allocate
+ exactly 65536 bytes, but will not be required to allocate more than this
+ if the symbol MAXSEG_64K is defined (see zconf.h). WARNING: On MSDOS,
+ pointers returned by zalloc for objects of exactly 65536 bytes *must*
+ have their offset normalized to zero. The default allocation function
+ provided by this library ensures this (see zutil.c). To reduce memory
+ requirements and avoid any allocation of 64K objects, at the expense of
+ compression ratio, compile the library with -DMAX_WBITS=14 (see zconf.h).
+
+ The fields total_in and total_out can be used for statistics or
+ progress reports. After compression, total_in holds the total size of
+ the uncompressed data and may be saved for use in the decompressor
+ (particularly if the decompressor wants to decompress everything in
+ a single step).
+*/
+
+ /* constants */
+
+#define Z_NO_FLUSH 0
+#define Z_PARTIAL_FLUSH 1 /* will be removed, use Z_SYNC_FLUSH instead */
+#define Z_SYNC_FLUSH 2
+#define Z_FULL_FLUSH 3
+#define Z_FINISH 4
+#define Z_BLOCK 5
+/* Allowed flush values; see deflate() and inflate() below for details */
+
+#define Z_OK 0
+#define Z_STREAM_END 1
+#define Z_NEED_DICT 2
+#define Z_ERRNO (-1)
+#define Z_STREAM_ERROR (-2)
+#define Z_DATA_ERROR (-3)
+#define Z_MEM_ERROR (-4)
+#define Z_BUF_ERROR (-5)
+#define Z_VERSION_ERROR (-6)
+/* Return codes for the compression/decompression functions. Negative
+ * values are errors, positive values are used for special but normal events.
+ */
+
+#define Z_NO_COMPRESSION 0
+#define Z_BEST_SPEED 1
+#define Z_BEST_COMPRESSION 9
+#define Z_DEFAULT_COMPRESSION (-1)
+/* compression levels */
+
+#define Z_FILTERED 1
+#define Z_HUFFMAN_ONLY 2
+#define Z_RLE 3
+#define Z_FIXED 4
+#define Z_DEFAULT_STRATEGY 0
+/* compression strategy; see deflateInit2() below for details */
+
+#define Z_BINARY 0
+#define Z_TEXT 1
+#define Z_ASCII Z_TEXT /* for compatibility with 1.2.2 and earlier */
+#define Z_UNKNOWN 2
+/* Possible values of the data_type field (though see inflate()) */
+
+#define Z_DEFLATED 8
+/* The deflate compression method (the only one supported in this version) */
+
+#define Z_NULL 0 /* for initializing zalloc, zfree, opaque */
+
+#define zlib_version zlibVersion()
+/* for compatibility with versions < 1.0.2 */
+
+ /* basic functions */
+
+ZEXTERN const char * ZEXPORT zlibVersion OF((void));
+/* The application can compare zlibVersion and ZLIB_VERSION for consistency.
+ If the first character differs, the library code actually used is
+ not compatible with the zlib.h header file used by the application.
+ This check is automatically made by deflateInit and inflateInit.
+ */
+
+/*
+ZEXTERN int ZEXPORT deflateInit OF((z_streamp strm, int level));
+
+ Initializes the internal stream state for compression. The fields
+ zalloc, zfree and opaque must be initialized before by the caller.
+ If zalloc and zfree are set to Z_NULL, deflateInit updates them to
+ use default allocation functions.
+
+ The compression level must be Z_DEFAULT_COMPRESSION, or between 0 and 9:
+ 1 gives best speed, 9 gives best compression, 0 gives no compression at
+ all (the input data is simply copied a block at a time).
+ Z_DEFAULT_COMPRESSION requests a default compromise between speed and
+ compression (currently equivalent to level 6).
+
+ deflateInit returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if level is not a valid compression level,
+ Z_VERSION_ERROR if the zlib library version (zlib_version) is incompatible
+ with the version assumed by the caller (ZLIB_VERSION).
+ msg is set to null if there is no error message. deflateInit does not
+ perform any compression: this will be done by deflate().
+*/
+
+
+ZEXTERN int ZEXPORT deflate OF((z_streamp strm, int flush));
+/*
+ deflate compresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce some
+ output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. deflate performs one or both of the
+ following actions:
+
+ - Compress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in and avail_in are updated and
+ processing will resume at this point for the next call of deflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. This action is forced if the parameter flush is non zero.
+ Forcing flush frequently degrades the compression ratio, so this parameter
+ should be set only when necessary (in interactive applications).
+ Some output may be provided even if flush is not set.
+
+ Before the call of deflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating avail_in or avail_out accordingly; avail_out
+ should never be zero before the call. The application can consume the
+ compressed output when it wants, for example when the output buffer is full
+ (avail_out == 0), or after each call of deflate(). If deflate returns Z_OK
+ and with zero avail_out, it must be called again after making room in the
+ output buffer because there might be more output pending.
+
+ Normally the parameter flush is set to Z_NO_FLUSH, which allows deflate to
+ decide how much data to accumualte before producing output, in order to
+ maximize compression.
+
+ If the parameter flush is set to Z_SYNC_FLUSH, all pending output is
+ flushed to the output buffer and the output is aligned on a byte boundary, so
+ that the decompressor can get all input data available so far. (In particular
+ avail_in is zero after the call if enough output space has been provided
+ before the call.) Flushing may degrade compression for some compression
+ algorithms and so it should be used only when necessary.
+
+ If flush is set to Z_FULL_FLUSH, all output is flushed as with
+ Z_SYNC_FLUSH, and the compression state is reset so that decompression can
+ restart from this point if previous compressed data has been damaged or if
+ random access is desired. Using Z_FULL_FLUSH too often can seriously degrade
+ compression.
+
+ If deflate returns with avail_out == 0, this function must be called again
+ with the same value of the flush parameter and more output space (updated
+ avail_out), until the flush is complete (deflate returns with non-zero
+ avail_out). In the case of a Z_FULL_FLUSH or Z_SYNC_FLUSH, make sure that
+ avail_out is greater than six to avoid repeated flush markers due to
+ avail_out == 0 on return.
+
+ If the parameter flush is set to Z_FINISH, pending input is processed,
+ pending output is flushed and deflate returns with Z_STREAM_END if there
+ was enough output space; if deflate returns with Z_OK, this function must be
+ called again with Z_FINISH and more output space (updated avail_out) but no
+ more input data, until it returns with Z_STREAM_END or an error. After
+ deflate has returned Z_STREAM_END, the only possible operations on the
+ stream are deflateReset or deflateEnd.
+
+ Z_FINISH can be used immediately after deflateInit if all the compression
+ is to be done in a single step. In this case, avail_out must be at least
+ the value returned by deflateBound (see below). If deflate does not return
+ Z_STREAM_END, then it must be called again as described above.
+
+ deflate() sets strm->adler to the adler32 checksum of all input read
+ so far (that is, total_in bytes).
+
+ deflate() may update strm->data_type if it can make a good guess about
+ the input data type (Z_BINARY or Z_TEXT). In doubt, the data is considered
+ binary. This field is only for information purposes and does not affect
+ the compression algorithm in any manner.
+
+ deflate() returns Z_OK if some progress has been made (more input
+ processed or more output produced), Z_STREAM_END if all input has been
+ consumed and all output has been produced (only when flush is set to
+ Z_FINISH), Z_STREAM_ERROR if the stream state was inconsistent (for example
+ if next_in or next_out was NULL), Z_BUF_ERROR if no progress is possible
+ (for example avail_in or avail_out was zero). Note that Z_BUF_ERROR is not
+ fatal, and deflate() can be called again with more input and more output
+ space to continue compressing.
+*/
+
+
+ZEXTERN int ZEXPORT deflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ deflateEnd returns Z_OK if success, Z_STREAM_ERROR if the
+ stream state was inconsistent, Z_DATA_ERROR if the stream was freed
+ prematurely (some input or output was discarded). In the error case,
+ msg may be set but then points to a static string (which must not be
+ deallocated).
+*/
+
+
+/*
+ZEXTERN int ZEXPORT inflateInit OF((z_streamp strm));
+
+ Initializes the internal stream state for decompression. The fields
+ next_in, avail_in, zalloc, zfree and opaque must be initialized before by
+ the caller. If next_in is not Z_NULL and avail_in is large enough (the exact
+ value depends on the compression method), inflateInit determines the
+ compression method from the zlib header and allocates all data structures
+ accordingly; otherwise the allocation will be deferred to the first call of
+ inflate. If zalloc and zfree are set to Z_NULL, inflateInit updates them to
+ use default allocation functions.
+
+ inflateInit returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_VERSION_ERROR if the zlib library version is incompatible with the
+ version assumed by the caller. msg is set to null if there is no error
+ message. inflateInit does not perform any decompression apart from reading
+ the zlib header if present: this will be done by inflate(). (So next_in and
+ avail_in may be modified, but next_out and avail_out are unchanged.)
+*/
+
+
+ZEXTERN int ZEXPORT inflate OF((z_streamp strm, int flush));
+/*
+ inflate decompresses as much data as possible, and stops when the input
+ buffer becomes empty or the output buffer becomes full. It may introduce
+ some output latency (reading input without producing any output) except when
+ forced to flush.
+
+ The detailed semantics are as follows. inflate performs one or both of the
+ following actions:
+
+ - Decompress more input starting at next_in and update next_in and avail_in
+ accordingly. If not all input can be processed (because there is not
+ enough room in the output buffer), next_in is updated and processing
+ will resume at this point for the next call of inflate().
+
+ - Provide more output starting at next_out and update next_out and avail_out
+ accordingly. inflate() provides as much output as possible, until there
+ is no more input data or no more space in the output buffer (see below
+ about the flush parameter).
+
+ Before the call of inflate(), the application should ensure that at least
+ one of the actions is possible, by providing more input and/or consuming
+ more output, and updating the next_* and avail_* values accordingly.
+ The application can consume the uncompressed output when it wants, for
+ example when the output buffer is full (avail_out == 0), or after each
+ call of inflate(). If inflate returns Z_OK and with zero avail_out, it
+ must be called again after making room in the output buffer because there
+ might be more output pending.
+
+ The flush parameter of inflate() can be Z_NO_FLUSH, Z_SYNC_FLUSH,
+ Z_FINISH, or Z_BLOCK. Z_SYNC_FLUSH requests that inflate() flush as much
+ output as possible to the output buffer. Z_BLOCK requests that inflate() stop
+ if and when it gets to the next deflate block boundary. When decoding the
+ zlib or gzip format, this will cause inflate() to return immediately after
+ the header and before the first block. When doing a raw inflate, inflate()
+ will go ahead and process the first block, and will return when it gets to
+ the end of that block, or when it runs out of data.
+
+ The Z_BLOCK option assists in appending to or combining deflate streams.
+ Also to assist in this, on return inflate() will set strm->data_type to the
+ number of unused bits in the last byte taken from strm->next_in, plus 64
+ if inflate() is currently decoding the last block in the deflate stream,
+ plus 128 if inflate() returned immediately after decoding an end-of-block
+ code or decoding the complete header up to just before the first byte of the
+ deflate stream. The end-of-block will not be indicated until all of the
+ uncompressed data from that block has been written to strm->next_out. The
+ number of unused bits may in general be greater than seven, except when
+ bit 7 of data_type is set, in which case the number of unused bits will be
+ less than eight.
+
+ inflate() should normally be called until it returns Z_STREAM_END or an
+ error. However if all decompression is to be performed in a single step
+ (a single call of inflate), the parameter flush should be set to
+ Z_FINISH. In this case all pending input is processed and all pending
+ output is flushed; avail_out must be large enough to hold all the
+ uncompressed data. (The size of the uncompressed data may have been saved
+ by the compressor for this purpose.) The next operation on this stream must
+ be inflateEnd to deallocate the decompression state. The use of Z_FINISH
+ is never required, but can be used to inform inflate that a faster approach
+ may be used for the single inflate() call.
+
+ In this implementation, inflate() always flushes as much output as
+ possible to the output buffer, and always uses the faster approach on the
+ first call. So the only effect of the flush parameter in this implementation
+ is on the return value of inflate(), as noted below, or when it returns early
+ because Z_BLOCK is used.
+
+ If a preset dictionary is needed after this call (see inflateSetDictionary
+ below), inflate sets strm->adler to the adler32 checksum of the dictionary
+ chosen by the compressor and returns Z_NEED_DICT; otherwise it sets
+ strm->adler to the adler32 checksum of all output produced so far (that is,
+ total_out bytes) and returns Z_OK, Z_STREAM_END or an error code as described
+ below. At the end of the stream, inflate() checks that its computed adler32
+ checksum is equal to that saved by the compressor and returns Z_STREAM_END
+ only if the checksum is correct.
+
+ inflate() will decompress and check either zlib-wrapped or gzip-wrapped
+ deflate data. The header type is detected automatically. Any information
+ contained in the gzip header is not retained, so applications that need that
+ information should instead use raw inflate, see inflateInit2() below, or
+ inflateBack() and perform their own processing of the gzip header and
+ trailer.
+
+ inflate() returns Z_OK if some progress has been made (more input processed
+ or more output produced), Z_STREAM_END if the end of the compressed data has
+ been reached and all uncompressed output has been produced, Z_NEED_DICT if a
+ preset dictionary is needed at this point, Z_DATA_ERROR if the input data was
+ corrupted (input stream not conforming to the zlib format or incorrect check
+ value), Z_STREAM_ERROR if the stream structure was inconsistent (for example
+ if next_in or next_out was NULL), Z_MEM_ERROR if there was not enough memory,
+ Z_BUF_ERROR if no progress is possible or if there was not enough room in the
+ output buffer when Z_FINISH is used. Note that Z_BUF_ERROR is not fatal, and
+ inflate() can be called again with more input and more output space to
+ continue decompressing. If Z_DATA_ERROR is returned, the application may then
+ call inflateSync() to look for a good compression block if a partial recovery
+ of the data is desired.
+*/
+
+
+ZEXTERN int ZEXPORT inflateEnd OF((z_streamp strm));
+/*
+ All dynamically allocated data structures for this stream are freed.
+ This function discards any unprocessed input and does not flush any
+ pending output.
+
+ inflateEnd returns Z_OK if success, Z_STREAM_ERROR if the stream state
+ was inconsistent. In the error case, msg may be set but then points to a
+ static string (which must not be deallocated).
+*/
+
+ /* Advanced functions */
+
+/*
+ The following functions are needed only in some special applications.
+*/
+
+/*
+ZEXTERN int ZEXPORT deflateInit2 OF((z_streamp strm,
+ int level,
+ int method,
+ int windowBits,
+ int memLevel,
+ int strategy));
+
+ This is another version of deflateInit with more compression options. The
+ fields next_in, zalloc, zfree and opaque must be initialized before by
+ the caller.
+
+ The method parameter is the compression method. It must be Z_DEFLATED in
+ this version of the library.
+
+ The windowBits parameter is the base two logarithm of the window size
+ (the size of the history buffer). It should be in the range 8..15 for this
+ version of the library. Larger values of this parameter result in better
+ compression at the expense of memory usage. The default value is 15 if
+ deflateInit is used instead.
+
+ windowBits can also be -8..-15 for raw deflate. In this case, -windowBits
+ determines the window size. deflate() will then generate raw deflate data
+ with no zlib header or trailer, and will not compute an adler32 check value.
+
+ windowBits can also be greater than 15 for optional gzip encoding. Add
+ 16 to windowBits to write a simple gzip header and trailer around the
+ compressed data instead of a zlib wrapper. The gzip header will have no
+ file name, no extra data, no comment, no modification time (set to zero),
+ no header crc, and the operating system will be set to 255 (unknown). If a
+ gzip stream is being written, strm->adler is a crc32 instead of an adler32.
+
+ The memLevel parameter specifies how much memory should be allocated
+ for the internal compression state. memLevel=1 uses minimum memory but
+ is slow and reduces compression ratio; memLevel=9 uses maximum memory
+ for optimal speed. The default value is 8. See zconf.h for total memory
+ usage as a function of windowBits and memLevel.
+
+ The strategy parameter is used to tune the compression algorithm. Use the
+ value Z_DEFAULT_STRATEGY for normal data, Z_FILTERED for data produced by a
+ filter (or predictor), Z_HUFFMAN_ONLY to force Huffman encoding only (no
+ string match), or Z_RLE to limit match distances to one (run-length
+ encoding). Filtered data consists mostly of small values with a somewhat
+ random distribution. In this case, the compression algorithm is tuned to
+ compress them better. The effect of Z_FILTERED is to force more Huffman
+ coding and less string matching; it is somewhat intermediate between
+ Z_DEFAULT and Z_HUFFMAN_ONLY. Z_RLE is designed to be almost as fast as
+ Z_HUFFMAN_ONLY, but give better compression for PNG image data. The strategy
+ parameter only affects the compression ratio but not the correctness of the
+ compressed output even if it is not set appropriately. Z_FIXED prevents the
+ use of dynamic Huffman codes, allowing for a simpler decoder for special
+ applications.
+
+ deflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as an invalid
+ method). msg is set to null if there is no error message. deflateInit2 does
+ not perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the compression dictionary from the given byte sequence
+ without producing any compressed output. This function must be called
+ immediately after deflateInit, deflateInit2 or deflateReset, before any
+ call of deflate. The compressor and decompressor must use exactly the same
+ dictionary (see inflateSetDictionary).
+
+ The dictionary should consist of strings (byte sequences) that are likely
+ to be encountered later in the data to be compressed, with the most commonly
+ used strings preferably put towards the end of the dictionary. Using a
+ dictionary is most useful when the data to be compressed is short and can be
+ predicted with good accuracy; the data can then be compressed better than
+ with the default empty dictionary.
+
+ Depending on the size of the compression data structures selected by
+ deflateInit or deflateInit2, a part of the dictionary may in effect be
+ discarded, for example if the dictionary is larger than the window size in
+ deflate or deflate2. Thus the strings most likely to be useful should be
+ put at the end of the dictionary, not at the front. In addition, the
+ current implementation of deflate will use at most the window size minus
+ 262 bytes of the provided dictionary.
+
+ Upon return of this function, strm->adler is set to the adler32 value
+ of the dictionary; the decompressor may later use this value to determine
+ which dictionary has been used by the compressor. (The adler32 value
+ applies to the whole dictionary even if only a subset of the dictionary is
+ actually used by the compressor.) If a raw deflate was requested, then the
+ adler32 value is not computed and strm->adler is not set.
+
+ deflateSetDictionary returns Z_OK if success, or Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent (for example if deflate has already been called for this stream
+ or if the compression method is bsort). deflateSetDictionary does not
+ perform any compression: this will be done by deflate().
+*/
+
+ZEXTERN int ZEXPORT deflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when several compression strategies will be
+ tried, for example when there are several ways of pre-processing the input
+ data with a filter. The streams that will be discarded should then be freed
+ by calling deflateEnd. Note that deflateCopy duplicates the internal
+ compression state which can be quite large, so this strategy is slow and
+ can consume lots of memory.
+
+ deflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT deflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to deflateEnd followed by deflateInit,
+ but does not free and reallocate all the internal compression state.
+ The stream will keep the same compression level and any other attributes
+ that may have been set by deflateInit2.
+
+ deflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT deflateParams OF((z_streamp strm,
+ int level,
+ int strategy));
+/*
+ Dynamically update the compression level and compression strategy. The
+ interpretation of level and strategy is as in deflateInit2. This can be
+ used to switch between compression and straight copy of the input data, or
+ to switch to a different kind of input data requiring a different
+ strategy. If the compression level is changed, the input available so far
+ is compressed with the old level (and may be flushed); the new level will
+ take effect only at the next call of deflate().
+
+ Before the call of deflateParams, the stream state must be set as for
+ a call of deflate(), since the currently available input may have to
+ be compressed and flushed. In particular, strm->avail_out must be non-zero.
+
+ deflateParams returns Z_OK if success, Z_STREAM_ERROR if the source
+ stream state was inconsistent or if a parameter was invalid, Z_BUF_ERROR
+ if strm->avail_out was zero.
+*/
+
+ZEXTERN int ZEXPORT deflateTune OF((z_streamp strm,
+ int good_length,
+ int max_lazy,
+ int nice_length,
+ int max_chain));
+/*
+ Fine tune deflate's internal compression parameters. This should only be
+ used by someone who understands the algorithm used by zlib's deflate for
+ searching for the best matching string, and even then only by the most
+ fanatic optimizer trying to squeeze out the last compressed bit for their
+ specific input data. Read the deflate.c source code for the meaning of the
+ max_lazy, good_length, nice_length, and max_chain parameters.
+
+ deflateTune() can be called after deflateInit() or deflateInit2(), and
+ returns Z_OK on success, or Z_STREAM_ERROR for an invalid deflate stream.
+ */
+
+ZEXTERN uLong ZEXPORT deflateBound OF((z_streamp strm,
+ uLong sourceLen));
+/*
+ deflateBound() returns an upper bound on the compressed size after
+ deflation of sourceLen bytes. It must be called after deflateInit()
+ or deflateInit2(). This would be used to allocate an output buffer
+ for deflation in a single pass, and so would be called before deflate().
+*/
+
+ZEXTERN int ZEXPORT deflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ deflatePrime() inserts bits in the deflate output stream. The intent
+ is that this function is used to start off the deflate output with the
+ bits leftover from a previous deflate stream when appending to it. As such,
+ this function can only be used for raw deflate, and must be used before the
+ first deflate() call after a deflateInit2() or deflateReset(). bits must be
+ less than or equal to 16, and that many of the least significant bits of
+ value will be inserted in the output.
+
+ deflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT deflateSetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ deflateSetHeader() provides gzip header information for when a gzip
+ stream is requested by deflateInit2(). deflateSetHeader() may be called
+ after deflateInit2() or deflateReset() and before the first call of
+ deflate(). The text, time, os, extra field, name, and comment information
+ in the provided gz_header structure are written to the gzip header (xflag is
+ ignored -- the extra flags are set according to the compression level). The
+ caller must assure that, if not Z_NULL, name and comment are terminated with
+ a zero byte, and that if extra is not Z_NULL, that extra_len bytes are
+ available there. If hcrc is true, a gzip header crc is included. Note that
+ the current versions of the command-line version of gzip (up through version
+ 1.3.x) do not support header crc's, and will report that it is a "multi-part
+ gzip file" and give up.
+
+ If deflateSetHeader is not used, the default gzip header has text false,
+ the time set to zero, and os set to 255, with no extra, name, or comment
+ fields. The gzip header is returned to the default state by deflateReset().
+
+ deflateSetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateInit2 OF((z_streamp strm,
+ int windowBits));
+
+ This is another version of inflateInit with an extra parameter. The
+ fields next_in, avail_in, zalloc, zfree and opaque must be initialized
+ before by the caller.
+
+ The windowBits parameter is the base two logarithm of the maximum window
+ size (the size of the history buffer). It should be in the range 8..15 for
+ this version of the library. The default value is 15 if inflateInit is used
+ instead. windowBits must be greater than or equal to the windowBits value
+ provided to deflateInit2() while compressing, or it must be equal to 15 if
+ deflateInit2() was not used. If a compressed stream with a larger window
+ size is given as input, inflate() will return with the error code
+ Z_DATA_ERROR instead of trying to allocate a larger window.
+
+ windowBits can also be -8..-15 for raw inflate. In this case, -windowBits
+ determines the window size. inflate() will then process raw deflate data,
+ not looking for a zlib or gzip header, not generating a check value, and not
+ looking for any check values for comparison at the end of the stream. This
+ is for use with other formats that use the deflate compressed data format
+ such as zip. Those formats provide their own check values. If a custom
+ format is developed using the raw deflate format for compressed data, it is
+ recommended that a check value such as an adler32 or a crc32 be applied to
+ the uncompressed data as is done in the zlib, gzip, and zip formats. For
+ most applications, the zlib format should be used as is. Note that comments
+ above on the use in deflateInit2() applies to the magnitude of windowBits.
+
+ windowBits can also be greater than 15 for optional gzip decoding. Add
+ 32 to windowBits to enable zlib and gzip decoding with automatic header
+ detection, or add 16 to decode only the gzip format (the zlib format will
+ return a Z_DATA_ERROR). If a gzip stream is being decoded, strm->adler is
+ a crc32 instead of an adler32.
+
+ inflateInit2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_STREAM_ERROR if a parameter is invalid (such as a null strm). msg
+ is set to null if there is no error message. inflateInit2 does not perform
+ any decompression apart from reading the zlib header if present: this will
+ be done by inflate(). (So next_in and avail_in may be modified, but next_out
+ and avail_out are unchanged.)
+*/
+
+ZEXTERN int ZEXPORT inflateSetDictionary OF((z_streamp strm,
+ const Bytef *dictionary,
+ uInt dictLength));
+/*
+ Initializes the decompression dictionary from the given uncompressed byte
+ sequence. This function must be called immediately after a call of inflate,
+ if that call returned Z_NEED_DICT. The dictionary chosen by the compressor
+ can be determined from the adler32 value returned by that call of inflate.
+ The compressor and decompressor must use exactly the same dictionary (see
+ deflateSetDictionary). For raw inflate, this function can be called
+ immediately after inflateInit2() or inflateReset() and before any call of
+ inflate() to set the dictionary. The application must insure that the
+ dictionary that was used for compression is provided.
+
+ inflateSetDictionary returns Z_OK if success, Z_STREAM_ERROR if a
+ parameter is invalid (such as NULL dictionary) or the stream state is
+ inconsistent, Z_DATA_ERROR if the given dictionary doesn't match the
+ expected one (incorrect adler32 value). inflateSetDictionary does not
+ perform any decompression: this will be done by subsequent calls of
+ inflate().
+*/
+
+ZEXTERN int ZEXPORT inflateSync OF((z_streamp strm));
+/*
+ Skips invalid compressed data until a full flush point (see above the
+ description of deflate with Z_FULL_FLUSH) can be found, or until all
+ available input is skipped. No output is provided.
+
+ inflateSync returns Z_OK if a full flush point has been found, Z_BUF_ERROR
+ if no more input was provided, Z_DATA_ERROR if no flush point has been found,
+ or Z_STREAM_ERROR if the stream structure was inconsistent. In the success
+ case, the application may save the current current value of total_in which
+ indicates where valid compressed data was found. In the error case, the
+ application may repeatedly call inflateSync, providing more input each time,
+ until success or end of the input data.
+*/
+
+ZEXTERN int ZEXPORT inflateCopy OF((z_streamp dest,
+ z_streamp source));
+/*
+ Sets the destination stream as a complete copy of the source stream.
+
+ This function can be useful when randomly accessing a large stream. The
+ first pass through the stream can periodically record the inflate state,
+ allowing restarting inflate at those points when randomly accessing the
+ stream.
+
+ inflateCopy returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_STREAM_ERROR if the source stream state was inconsistent
+ (such as zalloc being NULL). msg is left unchanged in both source and
+ destination.
+*/
+
+ZEXTERN int ZEXPORT inflateReset OF((z_streamp strm));
+/*
+ This function is equivalent to inflateEnd followed by inflateInit,
+ but does not free and reallocate all the internal decompression state.
+ The stream will keep attributes that may have been set by inflateInit2.
+
+ inflateReset returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent (such as zalloc or state being NULL).
+*/
+
+ZEXTERN int ZEXPORT inflatePrime OF((z_streamp strm,
+ int bits,
+ int value));
+/*
+ This function inserts bits in the inflate input stream. The intent is
+ that this function is used to start inflating at a bit position in the
+ middle of a byte. The provided bits will be used before any bytes are used
+ from next_in. This function should only be used with raw inflate, and
+ should be used before the first inflate() call after inflateInit2() or
+ inflateReset(). bits must be less than or equal to 16, and that many of the
+ least significant bits of value will be inserted in the input.
+
+ inflatePrime returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+ZEXTERN int ZEXPORT inflateGetHeader OF((z_streamp strm,
+ gz_headerp head));
+/*
+ inflateGetHeader() requests that gzip header information be stored in the
+ provided gz_header structure. inflateGetHeader() may be called after
+ inflateInit2() or inflateReset(), and before the first call of inflate().
+ As inflate() processes the gzip stream, head->done is zero until the header
+ is completed, at which time head->done is set to one. If a zlib stream is
+ being decoded, then head->done is set to -1 to indicate that there will be
+ no gzip header information forthcoming. Note that Z_BLOCK can be used to
+ force inflate() to return immediately after header processing is complete
+ and before any actual data is decompressed.
+
+ The text, time, xflags, and os fields are filled in with the gzip header
+ contents. hcrc is set to true if there is a header CRC. (The header CRC
+ was valid if done is set to one.) If extra is not Z_NULL, then extra_max
+ contains the maximum number of bytes to write to extra. Once done is true,
+ extra_len contains the actual extra field length, and extra contains the
+ extra field, or that field truncated if extra_max is less than extra_len.
+ If name is not Z_NULL, then up to name_max characters are written there,
+ terminated with a zero unless the length is greater than name_max. If
+ comment is not Z_NULL, then up to comm_max characters are written there,
+ terminated with a zero unless the length is greater than comm_max. When
+ any of extra, name, or comment are not Z_NULL and the respective field is
+ not present in the header, then that field is set to Z_NULL to signal its
+ absence. This allows the use of deflateSetHeader() with the returned
+ structure to duplicate the header. However if those fields are set to
+ allocated memory, then the application will need to save those pointers
+ elsewhere so that they can be eventually freed.
+
+ If inflateGetHeader is not used, then the header information is simply
+ discarded. The header is always checked for validity, including the header
+ CRC if present. inflateReset() will reset the process to discard the header
+ information. The application would need to call inflateGetHeader() again to
+ retrieve the header from the next gzip stream.
+
+ inflateGetHeader returns Z_OK if success, or Z_STREAM_ERROR if the source
+ stream state was inconsistent.
+*/
+
+/*
+ZEXTERN int ZEXPORT inflateBackInit OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window));
+
+ Initialize the internal stream state for decompression using inflateBack()
+ calls. The fields zalloc, zfree and opaque in strm must be initialized
+ before the call. If zalloc and zfree are Z_NULL, then the default library-
+ derived memory allocation routines are used. windowBits is the base two
+ logarithm of the window size, in the range 8..15. window is a caller
+ supplied buffer of that size. Except for special applications where it is
+ assured that deflate was used with small window sizes, windowBits must be 15
+ and a 32K byte window must be supplied to be able to decompress general
+ deflate streams.
+
+ See inflateBack() for the usage of these routines.
+
+ inflateBackInit will return Z_OK on success, Z_STREAM_ERROR if any of
+ the paramaters are invalid, Z_MEM_ERROR if the internal state could not
+ be allocated, or Z_VERSION_ERROR if the version of the library does not
+ match the version of the header file.
+*/
+
+typedef unsigned (*in_func) OF((void FAR *, unsigned char FAR * FAR *));
+typedef int (*out_func) OF((void FAR *, unsigned char FAR *, unsigned));
+
+ZEXTERN int ZEXPORT inflateBack OF((z_streamp strm,
+ in_func in, void FAR *in_desc,
+ out_func out, void FAR *out_desc));
+/*
+ inflateBack() does a raw inflate with a single call using a call-back
+ interface for input and output. This is more efficient than inflate() for
+ file i/o applications in that it avoids copying between the output and the
+ sliding window by simply making the window itself the output buffer. This
+ function trusts the application to not change the output buffer passed by
+ the output function, at least until inflateBack() returns.
+
+ inflateBackInit() must be called first to allocate the internal state
+ and to initialize the state with the user-provided window buffer.
+ inflateBack() may then be used multiple times to inflate a complete, raw
+ deflate stream with each call. inflateBackEnd() is then called to free
+ the allocated state.
+
+ A raw deflate stream is one with no zlib or gzip header or trailer.
+ This routine would normally be used in a utility that reads zip or gzip
+ files and writes out uncompressed files. The utility would decode the
+ header and process the trailer on its own, hence this routine expects
+ only the raw deflate stream to decompress. This is different from the
+ normal behavior of inflate(), which expects either a zlib or gzip header and
+ trailer around the deflate stream.
+
+ inflateBack() uses two subroutines supplied by the caller that are then
+ called by inflateBack() for input and output. inflateBack() calls those
+ routines until it reads a complete deflate stream and writes out all of the
+ uncompressed data, or until it encounters an error. The function's
+ parameters and return types are defined above in the in_func and out_func
+ typedefs. inflateBack() will call in(in_desc, &buf) which should return the
+ number of bytes of provided input, and a pointer to that input in buf. If
+ there is no input available, in() must return zero--buf is ignored in that
+ case--and inflateBack() will return a buffer error. inflateBack() will call
+ out(out_desc, buf, len) to write the uncompressed data buf[0..len-1]. out()
+ should return zero on success, or non-zero on failure. If out() returns
+ non-zero, inflateBack() will return with an error. Neither in() nor out()
+ are permitted to change the contents of the window provided to
+ inflateBackInit(), which is also the buffer that out() uses to write from.
+ The length written by out() will be at most the window size. Any non-zero
+ amount of input may be provided by in().
+
+ For convenience, inflateBack() can be provided input on the first call by
+ setting strm->next_in and strm->avail_in. If that input is exhausted, then
+ in() will be called. Therefore strm->next_in must be initialized before
+ calling inflateBack(). If strm->next_in is Z_NULL, then in() will be called
+ immediately for input. If strm->next_in is not Z_NULL, then strm->avail_in
+ must also be initialized, and then if strm->avail_in is not zero, input will
+ initially be taken from strm->next_in[0 .. strm->avail_in - 1].
+
+ The in_desc and out_desc parameters of inflateBack() is passed as the
+ first parameter of in() and out() respectively when they are called. These
+ descriptors can be optionally used to pass any information that the caller-
+ supplied in() and out() functions need to do their job.
+
+ On return, inflateBack() will set strm->next_in and strm->avail_in to
+ pass back any unused input that was provided by the last in() call. The
+ return values of inflateBack() can be Z_STREAM_END on success, Z_BUF_ERROR
+ if in() or out() returned an error, Z_DATA_ERROR if there was a format
+ error in the deflate stream (in which case strm->msg is set to indicate the
+ nature of the error), or Z_STREAM_ERROR if the stream was not properly
+ initialized. In the case of Z_BUF_ERROR, an input or output error can be
+ distinguished using strm->next_in which will be Z_NULL only if in() returned
+ an error. If strm->next is not Z_NULL, then the Z_BUF_ERROR was due to
+ out() returning non-zero. (in() will always be called before out(), so
+ strm->next_in is assured to be defined if out() returns non-zero.) Note
+ that inflateBack() cannot return Z_OK.
+*/
+
+ZEXTERN int ZEXPORT inflateBackEnd OF((z_streamp strm));
+/*
+ All memory allocated by inflateBackInit() is freed.
+
+ inflateBackEnd() returns Z_OK on success, or Z_STREAM_ERROR if the stream
+ state was inconsistent.
+*/
+
+ZEXTERN uLong ZEXPORT zlibCompileFlags OF((void));
+/* Return flags indicating compile-time options.
+
+ Type sizes, two bits each, 00 = 16 bits, 01 = 32, 10 = 64, 11 = other:
+ 1.0: size of uInt
+ 3.2: size of uLong
+ 5.4: size of voidpf (pointer)
+ 7.6: size of z_off_t
+
+ Compiler, assembler, and debug options:
+ 8: DEBUG
+ 9: ASMV or ASMINF -- use ASM code
+ 10: ZLIB_WINAPI -- exported functions use the WINAPI calling convention
+ 11: 0 (reserved)
+
+ One-time table building (smaller code, but not thread-safe if true):
+ 12: BUILDFIXED -- build static block decoding tables when needed
+ 13: DYNAMIC_CRC_TABLE -- build CRC calculation tables when needed
+ 14,15: 0 (reserved)
+
+ Library content (indicates missing functionality):
+ 16: NO_GZCOMPRESS -- gz* functions cannot compress (to avoid linking
+ deflate code when not needed)
+ 17: NO_GZIP -- deflate can't write gzip streams, and inflate can't detect
+ and decode gzip streams (to avoid linking crc code)
+ 18-19: 0 (reserved)
+
+ Operation variations (changes in library functionality):
+ 20: PKZIP_BUG_WORKAROUND -- slightly more permissive inflate
+ 21: FASTEST -- deflate algorithm with only one, lowest compression level
+ 22,23: 0 (reserved)
+
+ The sprintf variant used by gzprintf (zero is best):
+ 24: 0 = vs*, 1 = s* -- 1 means limited to 20 arguments after the format
+ 25: 0 = *nprintf, 1 = *printf -- 1 means gzprintf() not secure!
+ 26: 0 = returns value, 1 = void -- 1 means inferred string length returned
+
+ Remainder:
+ 27-31: 0 (reserved)
+ */
+
+
+ /* utility functions */
+
+/*
+ The following utility functions are implemented on top of the
+ basic stream-oriented functions. To simplify the interface, some
+ default options are assumed (compression level and memory usage,
+ standard memory allocation functions). The source code of these
+ utility functions can easily be modified if you need special options.
+*/
+
+ZEXTERN int ZEXPORT compress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Compresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be at least the value returned
+ by compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+ This function can be used to compress a whole file at once if the
+ input file is mmap'ed.
+ compress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer.
+*/
+
+ZEXTERN int ZEXPORT compress2 OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen,
+ int level));
+/*
+ Compresses the source buffer into the destination buffer. The level
+ parameter has the same meaning as in deflateInit. sourceLen is the byte
+ length of the source buffer. Upon entry, destLen is the total size of the
+ destination buffer, which must be at least the value returned by
+ compressBound(sourceLen). Upon exit, destLen is the actual size of the
+ compressed buffer.
+
+ compress2 returns Z_OK if success, Z_MEM_ERROR if there was not enough
+ memory, Z_BUF_ERROR if there was not enough room in the output buffer,
+ Z_STREAM_ERROR if the level parameter is invalid.
+*/
+
+ZEXTERN uLong ZEXPORT compressBound OF((uLong sourceLen));
+/*
+ compressBound() returns an upper bound on the compressed size after
+ compress() or compress2() on sourceLen bytes. It would be used before
+ a compress() or compress2() call to allocate the destination buffer.
+*/
+
+ZEXTERN int ZEXPORT uncompress OF((Bytef *dest, uLongf *destLen,
+ const Bytef *source, uLong sourceLen));
+/*
+ Decompresses the source buffer into the destination buffer. sourceLen is
+ the byte length of the source buffer. Upon entry, destLen is the total
+ size of the destination buffer, which must be large enough to hold the
+ entire uncompressed data. (The size of the uncompressed data must have
+ been saved previously by the compressor and transmitted to the decompressor
+ by some mechanism outside the scope of this compression library.)
+ Upon exit, destLen is the actual size of the compressed buffer.
+ This function can be used to decompress a whole file at once if the
+ input file is mmap'ed.
+
+ uncompress returns Z_OK if success, Z_MEM_ERROR if there was not
+ enough memory, Z_BUF_ERROR if there was not enough room in the output
+ buffer, or Z_DATA_ERROR if the input data was corrupted or incomplete.
+*/
+
+
+typedef voidp gzFile;
+
+ZEXTERN gzFile ZEXPORT gzopen OF((const char *path, const char *mode));
+/*
+ Opens a gzip (.gz) file for reading or writing. The mode parameter
+ is as in fopen ("rb" or "wb") but can also include a compression level
+ ("wb9") or a strategy: 'f' for filtered data as in "wb6f", 'h' for
+ Huffman only compression as in "wb1h", or 'R' for run-length encoding
+ as in "wb1R". (See the description of deflateInit2 for more information
+ about the strategy parameter.)
+
+ gzopen can be used to read a file which is not in gzip format; in this
+ case gzread will directly read from the file without decompression.
+
+ gzopen returns NULL if the file could not be opened or if there was
+ insufficient memory to allocate the (de)compression state; errno
+ can be checked to distinguish the two cases (if errno is zero, the
+ zlib error is Z_MEM_ERROR). */
+
+ZEXTERN gzFile ZEXPORT gzdopen OF((int fd, const char *mode));
+/*
+ gzdopen() associates a gzFile with the file descriptor fd. File
+ descriptors are obtained from calls like open, dup, creat, pipe or
+ fileno (in the file has been previously opened with fopen).
+ The mode parameter is as in gzopen.
+ The next call of gzclose on the returned gzFile will also close the
+ file descriptor fd, just like fclose(fdopen(fd), mode) closes the file
+ descriptor fd. If you want to keep fd open, use gzdopen(dup(fd), mode).
+ gzdopen returns NULL if there was insufficient memory to allocate
+ the (de)compression state.
+*/
+
+ZEXTERN int ZEXPORT gzsetparams OF((gzFile file, int level, int strategy));
+/*
+ Dynamically update the compression level or strategy. See the description
+ of deflateInit2 for the meaning of these parameters.
+ gzsetparams returns Z_OK if success, or Z_STREAM_ERROR if the file was not
+ opened for writing.
+*/
+
+ZEXTERN int ZEXPORT gzread OF((gzFile file, voidp buf, unsigned len));
+/*
+ Reads the given number of uncompressed bytes from the compressed file.
+ If the input file was not in gzip format, gzread copies the given number
+ of bytes into the buffer.
+ gzread returns the number of uncompressed bytes actually read (0 for
+ end of file, -1 for error). */
+
+ZEXTERN int ZEXPORT gzwrite OF((gzFile file,
+ voidpc buf, unsigned len));
+/*
+ Writes the given number of uncompressed bytes into the compressed file.
+ gzwrite returns the number of uncompressed bytes actually written
+ (0 in case of error).
+*/
+
+ZEXTERN int ZEXPORTVA gzprintf OF((gzFile file, const char *format, ...));
+/*
+ Converts, formats, and writes the args to the compressed file under
+ control of the format string, as in fprintf. gzprintf returns the number of
+ uncompressed bytes actually written (0 in case of error). The number of
+ uncompressed bytes written is limited to 4095. The caller should assure that
+ this limit is not exceeded. If it is exceeded, then gzprintf() will return
+ return an error (0) with nothing written. In this case, there may also be a
+ buffer overflow with unpredictable consequences, which is possible only if
+ zlib was compiled with the insecure functions sprintf() or vsprintf()
+ because the secure snprintf() or vsnprintf() functions were not available.
+*/
+
+ZEXTERN int ZEXPORT gzputs OF((gzFile file, const char *s));
+/*
+ Writes the given null-terminated string to the compressed file, excluding
+ the terminating null character.
+ gzputs returns the number of characters written, or -1 in case of error.
+*/
+
+ZEXTERN char * ZEXPORT gzgets OF((gzFile file, char *buf, int len));
+/*
+ Reads bytes from the compressed file until len-1 characters are read, or
+ a newline character is read and transferred to buf, or an end-of-file
+ condition is encountered. The string is then terminated with a null
+ character.
+ gzgets returns buf, or Z_NULL in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzputc OF((gzFile file, int c));
+/*
+ Writes c, converted to an unsigned char, into the compressed file.
+ gzputc returns the value that was written, or -1 in case of error.
+*/
+
+ZEXTERN int ZEXPORT gzgetc OF((gzFile file));
+/*
+ Reads one byte from the compressed file. gzgetc returns this byte
+ or -1 in case of end of file or error.
+*/
+
+ZEXTERN int ZEXPORT gzungetc OF((int c, gzFile file));
+/*
+ Push one character back onto the stream to be read again later.
+ Only one character of push-back is allowed. gzungetc() returns the
+ character pushed, or -1 on failure. gzungetc() will fail if a
+ character has been pushed but not read yet, or if c is -1. The pushed
+ character will be discarded if the stream is repositioned with gzseek()
+ or gzrewind().
+*/
+
+ZEXTERN int ZEXPORT gzflush OF((gzFile file, int flush));
+/*
+ Flushes all pending output into the compressed file. The parameter
+ flush is as in the deflate() function. The return value is the zlib
+ error number (see function gzerror below). gzflush returns Z_OK if
+ the flush parameter is Z_FINISH and all output could be flushed.
+ gzflush should be called only when strictly necessary because it can
+ degrade compression.
+*/
+
+ZEXTERN z_off_t ZEXPORT gzseek OF((gzFile file,
+ z_off_t offset, int whence));
+/*
+ Sets the starting position for the next gzread or gzwrite on the
+ given compressed file. The offset represents a number of bytes in the
+ uncompressed data stream. The whence parameter is defined as in lseek(2);
+ the value SEEK_END is not supported.
+ If the file is opened for reading, this function is emulated but can be
+ extremely slow. If the file is opened for writing, only forward seeks are
+ supported; gzseek then compresses a sequence of zeroes up to the new
+ starting position.
+
+ gzseek returns the resulting offset location as measured in bytes from
+ the beginning of the uncompressed stream, or -1 in case of error, in
+ particular if the file is opened for writing and the new starting position
+ would be before the current position.
+*/
+
+ZEXTERN int ZEXPORT gzrewind OF((gzFile file));
+/*
+ Rewinds the given file. This function is supported only for reading.
+
+ gzrewind(file) is equivalent to (int)gzseek(file, 0L, SEEK_SET)
+*/
+
+ZEXTERN z_off_t ZEXPORT gztell OF((gzFile file));
+/*
+ Returns the starting position for the next gzread or gzwrite on the
+ given compressed file. This position represents a number of bytes in the
+ uncompressed data stream.
+
+ gztell(file) is equivalent to gzseek(file, 0L, SEEK_CUR)
+*/
+
+ZEXTERN int ZEXPORT gzeof OF((gzFile file));
+/*
+ Returns 1 when EOF has previously been detected reading the given
+ input stream, otherwise zero.
+*/
+
+ZEXTERN int ZEXPORT gzdirect OF((gzFile file));
+/*
+ Returns 1 if file is being read directly without decompression, otherwise
+ zero.
+*/
+
+ZEXTERN int ZEXPORT gzclose OF((gzFile file));
+/*
+ Flushes all pending output if necessary, closes the compressed file
+ and deallocates all the (de)compression state. The return value is the zlib
+ error number (see function gzerror below).
+*/
+
+ZEXTERN const char * ZEXPORT gzerror OF((gzFile file, int *errnum));
+/*
+ Returns the error message for the last error which occurred on the
+ given compressed file. errnum is set to zlib error number. If an
+ error occurred in the file system and not in the compression library,
+ errnum is set to Z_ERRNO and the application may consult errno
+ to get the exact error code.
+*/
+
+ZEXTERN void ZEXPORT gzclearerr OF((gzFile file));
+/*
+ Clears the error and end-of-file flags for file. This is analogous to the
+ clearerr() function in stdio. This is useful for continuing to read a gzip
+ file that is being written concurrently.
+*/
+
+ /* checksum functions */
+
+/*
+ These functions are not related to compression but are exported
+ anyway because they might be useful in applications using the
+ compression library.
+*/
+
+ZEXTERN uLong ZEXPORT adler32 OF((uLong adler, const Bytef *buf, uInt len));
+/*
+ Update a running Adler-32 checksum with the bytes buf[0..len-1] and
+ return the updated checksum. If buf is NULL, this function returns
+ the required initial value for the checksum.
+ An Adler-32 checksum is almost as reliable as a CRC32 but can be computed
+ much faster. Usage example:
+
+ uLong adler = adler32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ adler = adler32(adler, buffer, length);
+ }
+ if (adler != original_adler) error();
+*/
+
+ZEXTERN uLong ZEXPORT adler32_combine OF((uLong adler1, uLong adler2,
+ z_off_t len2));
+/*
+ Combine two Adler-32 checksums into one. For two sequences of bytes, seq1
+ and seq2 with lengths len1 and len2, Adler-32 checksums were calculated for
+ each, adler1 and adler2. adler32_combine() returns the Adler-32 checksum of
+ seq1 and seq2 concatenated, requiring only adler1, adler2, and len2.
+*/
+
+ZEXTERN uLong ZEXPORT crc32 OF((uLong crc, const Bytef *buf, uInt len));
+/*
+ Update a running CRC-32 with the bytes buf[0..len-1] and return the
+ updated CRC-32. If buf is NULL, this function returns the required initial
+ value for the for the crc. Pre- and post-conditioning (one's complement) is
+ performed within this function so it shouldn't be done by the application.
+ Usage example:
+
+ uLong crc = crc32(0L, Z_NULL, 0);
+
+ while (read_buffer(buffer, length) != EOF) {
+ crc = crc32(crc, buffer, length);
+ }
+ if (crc != original_crc) error();
+*/
+
+ZEXTERN uLong ZEXPORT crc32_combine OF((uLong crc1, uLong crc2, z_off_t len2));
+
+/*
+ Combine two CRC-32 check values into one. For two sequences of bytes,
+ seq1 and seq2 with lengths len1 and len2, CRC-32 check values were
+ calculated for each, crc1 and crc2. crc32_combine() returns the CRC-32
+ check value of seq1 and seq2 concatenated, requiring only crc1, crc2, and
+ len2.
+*/
+
+
+ /* various hacks, don't look :) */
+
+/* deflateInit and inflateInit are macros to allow checking the zlib version
+ * and the compiler's view of z_stream:
+ */
+ZEXTERN int ZEXPORT deflateInit_ OF((z_streamp strm, int level,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateInit_ OF((z_streamp strm,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT deflateInit2_ OF((z_streamp strm, int level, int method,
+ int windowBits, int memLevel,
+ int strategy, const char *version,
+ int stream_size));
+ZEXTERN int ZEXPORT inflateInit2_ OF((z_streamp strm, int windowBits,
+ const char *version, int stream_size));
+ZEXTERN int ZEXPORT inflateBackInit_ OF((z_streamp strm, int windowBits,
+ unsigned char FAR *window,
+ const char *version,
+ int stream_size));
+#define deflateInit(strm, level) \
+ deflateInit_((strm), (level), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit(strm) \
+ inflateInit_((strm), ZLIB_VERSION, sizeof(z_stream))
+#define deflateInit2(strm, level, method, windowBits, memLevel, strategy) \
+ deflateInit2_((strm),(level),(method),(windowBits),(memLevel),\
+ (strategy), ZLIB_VERSION, sizeof(z_stream))
+#define inflateInit2(strm, windowBits) \
+ inflateInit2_((strm), (windowBits), ZLIB_VERSION, sizeof(z_stream))
+#define inflateBackInit(strm, windowBits, window) \
+ inflateBackInit_((strm), (windowBits), (window), \
+ ZLIB_VERSION, sizeof(z_stream))
+
+
+#if !defined(_ZUTIL_H) && !defined(NO_DUMMY_DECL)
+ struct internal_state {int dummy;}; /* hack for buggy compilers */
+#endif
+
+ZEXTERN const char * ZEXPORT zError OF((int));
+ZEXTERN int ZEXPORT inflateSyncPoint OF((z_streamp z));
+ZEXTERN const uLongf * ZEXPORT get_crc_table OF((void));
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif /* _ZLIB_H */
diff --git a/sys/contrib/opensolaris/uts/common/zmod/zmod.c b/sys/contrib/opensolaris/uts/common/zmod/zmod.c
new file mode 100644
index 0000000..2627239
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/zmod.c
@@ -0,0 +1,109 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/types.h>
+#include <sys/zmod.h>
+
+#include "zlib.h"
+
+/*
+ * Uncompress the buffer 'src' into the buffer 'dst'. The caller must store
+ * the expected decompressed data size externally so it can be passed in.
+ * The resulting decompressed size is then returned through dstlen. This
+ * function return Z_OK on success, or another error code on failure.
+ */
+int
+z_uncompress(void *dst, size_t *dstlen, const void *src, size_t srclen)
+{
+ z_stream zs;
+ int err;
+
+ bzero(&zs, sizeof (zs));
+ zs.next_in = (uchar_t *)src;
+ zs.avail_in = srclen;
+ zs.next_out = dst;
+ zs.avail_out = *dstlen;
+
+ if ((err = inflateInit(&zs)) != Z_OK)
+ return (err);
+
+ if ((err = inflate(&zs, Z_FINISH)) != Z_STREAM_END) {
+ (void) inflateEnd(&zs);
+ return (err == Z_OK ? Z_BUF_ERROR : err);
+ }
+
+ *dstlen = zs.total_out;
+ return (inflateEnd(&zs));
+}
+
+int
+z_compress_level(void *dst, size_t *dstlen, const void *src, size_t srclen,
+ int level)
+{
+
+ z_stream zs;
+ int err;
+
+ bzero(&zs, sizeof (zs));
+ zs.next_in = (uchar_t *)src;
+ zs.avail_in = srclen;
+ zs.next_out = dst;
+ zs.avail_out = *dstlen;
+
+ if ((err = deflateInit(&zs, level)) != Z_OK)
+ return (err);
+
+ if ((err = deflate(&zs, Z_FINISH)) != Z_STREAM_END) {
+ (void) deflateEnd(&zs);
+ return (err == Z_OK ? Z_BUF_ERROR : err);
+ }
+
+ *dstlen = zs.total_out;
+ return (deflateEnd(&zs));
+}
+
+int
+z_compress(void *dst, size_t *dstlen, const void *src, size_t srclen)
+{
+ return (z_compress_level(dst, dstlen, src, srclen,
+ Z_DEFAULT_COMPRESSION));
+}
+
+/*
+ * Convert a zlib error code into a string error message.
+ */
+const char *
+z_strerror(int err)
+{
+ int i = Z_NEED_DICT - err;
+
+ if (i < 0 || i > Z_NEED_DICT - Z_VERSION_ERROR)
+ return ("unknown error");
+
+ return (zError(err));
+}
diff --git a/sys/contrib/opensolaris/uts/common/zmod/zmod_subr.c b/sys/contrib/opensolaris/uts/common/zmod/zmod_subr.c
new file mode 100644
index 0000000..0542712
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/zmod_subr.c
@@ -0,0 +1,84 @@
+/*
+ * CDDL HEADER START
+ *
+ * The contents of this file are subject to the terms of the
+ * Common Development and Distribution License (the "License").
+ * You may not use this file except in compliance with the License.
+ *
+ * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
+ * or http://www.opensolaris.org/os/licensing.
+ * See the License for the specific language governing permissions
+ * and limitations under the License.
+ *
+ * When distributing Covered Code, include this CDDL HEADER in each
+ * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
+ * If applicable, add the following below this CDDL HEADER, with the
+ * fields enclosed by brackets "[]" replaced with your own identifying
+ * information: Portions Copyright [yyyy] [name of copyright owner]
+ *
+ * CDDL HEADER END
+ */
+
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include <sys/systm.h>
+#include <sys/cmn_err.h>
+#include <sys/kobj.h>
+
+struct zchdr {
+ uint_t zch_magic;
+ uint_t zch_size;
+};
+
+#define ZCH_MAGIC 0x3cc13cc1
+
+/*ARGSUSED*/
+void *
+zcalloc(void *opaque, uint_t items, uint_t size)
+{
+ size_t nbytes = sizeof (struct zchdr) + items * size;
+ struct zchdr *z = kobj_zalloc(nbytes, KM_NOWAIT|KM_TMP);
+
+ if (z == NULL)
+ return (NULL);
+
+ z->zch_magic = ZCH_MAGIC;
+ z->zch_size = nbytes;
+
+ return (z + 1);
+}
+
+/*ARGSUSED*/
+void
+zcfree(void *opaque, void *ptr)
+{
+ struct zchdr *z = ((struct zchdr *)ptr) - 1;
+
+ if (z->zch_magic != ZCH_MAGIC)
+ panic("zcfree region corrupt: hdr=%p ptr=%p", (void *)z, ptr);
+
+ kobj_free(z, z->zch_size);
+}
+
+void
+zmemcpy(void *dest, const void *source, uint_t len)
+{
+ bcopy(source, dest, len);
+}
+
+int
+zmemcmp(const void *s1, const void *s2, uint_t len)
+{
+ return (bcmp(s1, s2, len));
+}
+
+void
+zmemzero(void *dest, uint_t len)
+{
+ bzero(dest, len);
+}
diff --git a/sys/contrib/opensolaris/uts/common/zmod/zutil.c b/sys/contrib/opensolaris/uts/common/zmod/zutil.c
new file mode 100644
index 0000000..7d46e30
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/zutil.c
@@ -0,0 +1,324 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* zutil.c -- target dependent utility functions for the compression library
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#include "zutil.h"
+
+#ifndef NO_DUMMY_DECL
+struct internal_state {int dummy;}; /* for buggy compilers */
+#endif
+
+const char * const z_errmsg[10] = {
+"need dictionary", /* Z_NEED_DICT 2 */
+"stream end", /* Z_STREAM_END 1 */
+"", /* Z_OK 0 */
+"file error", /* Z_ERRNO (-1) */
+"stream error", /* Z_STREAM_ERROR (-2) */
+"data error", /* Z_DATA_ERROR (-3) */
+"insufficient memory", /* Z_MEM_ERROR (-4) */
+"buffer error", /* Z_BUF_ERROR (-5) */
+"incompatible version",/* Z_VERSION_ERROR (-6) */
+""};
+
+
+const char * ZEXPORT zlibVersion()
+{
+ return ZLIB_VERSION;
+}
+
+uLong ZEXPORT zlibCompileFlags()
+{
+ uLong flags;
+
+ flags = 0;
+ switch (sizeof(uInt)) {
+ case 2: break;
+ case 4: flags += 1; break;
+ case 8: flags += 2; break;
+ default: flags += 3;
+ }
+ switch (sizeof(uLong)) {
+ case 2: break;
+ case 4: flags += 1 << 2; break;
+ case 8: flags += 2 << 2; break;
+ default: flags += 3 << 2;
+ }
+ switch (sizeof(voidpf)) {
+ case 2: break;
+ case 4: flags += 1 << 4; break;
+ case 8: flags += 2 << 4; break;
+ default: flags += 3 << 4;
+ }
+ switch (sizeof(z_off_t)) {
+ case 2: break;
+ case 4: flags += 1 << 6; break;
+ case 8: flags += 2 << 6; break;
+ default: flags += 3 << 6;
+ }
+#ifdef DEBUG
+ flags += 1 << 8;
+#endif
+#if defined(ASMV) || defined(ASMINF)
+ flags += 1 << 9;
+#endif
+#ifdef ZLIB_WINAPI
+ flags += 1 << 10;
+#endif
+#ifdef BUILDFIXED
+ flags += 1 << 12;
+#endif
+#ifdef DYNAMIC_CRC_TABLE
+ flags += 1 << 13;
+#endif
+#ifdef NO_GZCOMPRESS
+ flags += 1L << 16;
+#endif
+#ifdef NO_GZIP
+ flags += 1L << 17;
+#endif
+#ifdef PKZIP_BUG_WORKAROUND
+ flags += 1L << 20;
+#endif
+#ifdef FASTEST
+ flags += 1L << 21;
+#endif
+#ifdef STDC
+# ifdef NO_vsnprintf
+ flags += 1L << 25;
+# ifdef HAS_vsprintf_void
+ flags += 1L << 26;
+# endif
+# else
+# ifdef HAS_vsnprintf_void
+ flags += 1L << 26;
+# endif
+# endif
+#else
+ flags += 1L << 24;
+# ifdef NO_snprintf
+ flags += 1L << 25;
+# ifdef HAS_sprintf_void
+ flags += 1L << 26;
+# endif
+# else
+# ifdef HAS_snprintf_void
+ flags += 1L << 26;
+# endif
+# endif
+#endif
+ return flags;
+}
+
+#ifdef DEBUG
+
+# ifndef verbose
+# define verbose 0
+# endif
+int z_verbose = verbose;
+
+void z_error (m)
+ char *m;
+{
+ fprintf(stderr, "%s\n", m);
+ exit(1);
+}
+#endif
+
+/* exported to allow conversion of error code to string for compress() and
+ * uncompress()
+ */
+const char * ZEXPORT zError(err)
+ int err;
+{
+ return ERR_MSG(err);
+}
+
+#if defined(_WIN32_WCE)
+ /* The Microsoft C Run-Time Library for Windows CE doesn't have
+ * errno. We define it as a global variable to simplify porting.
+ * Its value is always 0 and should not be used.
+ */
+ int errno = 0;
+#endif
+
+#define HAVE_MEMCPY
+#ifndef HAVE_MEMCPY
+
+void zmemcpy(dest, source, len)
+ Bytef* dest;
+ const Bytef* source;
+ uInt len;
+{
+ if (len == 0) return;
+ do {
+ *dest++ = *source++; /* ??? to be unrolled */
+ } while (--len != 0);
+}
+
+int zmemcmp(s1, s2, len)
+ const Bytef* s1;
+ const Bytef* s2;
+ uInt len;
+{
+ uInt j;
+
+ for (j = 0; j < len; j++) {
+ if (s1[j] != s2[j]) return 2*(s1[j] > s2[j])-1;
+ }
+ return 0;
+}
+
+void zmemzero(dest, len)
+ Bytef* dest;
+ uInt len;
+{
+ if (len == 0) return;
+ do {
+ *dest++ = 0; /* ??? to be unrolled */
+ } while (--len != 0);
+}
+#endif
+
+
+#ifdef SYS16BIT
+
+#ifdef __TURBOC__
+/* Turbo C in 16-bit mode */
+
+# define MY_ZCALLOC
+
+/* Turbo C malloc() does not allow dynamic allocation of 64K bytes
+ * and farmalloc(64K) returns a pointer with an offset of 8, so we
+ * must fix the pointer. Warning: the pointer must be put back to its
+ * original form in order to free it, use zcfree().
+ */
+
+#define MAX_PTR 10
+/* 10*64K = 640K */
+
+local int next_ptr = 0;
+
+typedef struct ptr_table_s {
+ voidpf org_ptr;
+ voidpf new_ptr;
+} ptr_table;
+
+local ptr_table table[MAX_PTR];
+/* This table is used to remember the original form of pointers
+ * to large buffers (64K). Such pointers are normalized with a zero offset.
+ * Since MSDOS is not a preemptive multitasking OS, this table is not
+ * protected from concurrent access. This hack doesn't work anyway on
+ * a protected system like OS/2. Use Microsoft C instead.
+ */
+
+voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+ voidpf buf = opaque; /* just to make some compilers happy */
+ ulg bsize = (ulg)items*size;
+
+ /* If we allocate less than 65520 bytes, we assume that farmalloc
+ * will return a usable pointer which doesn't have to be normalized.
+ */
+ if (bsize < 65520L) {
+ buf = farmalloc(bsize);
+ if (*(ush*)&buf != 0) return buf;
+ } else {
+ buf = farmalloc(bsize + 16L);
+ }
+ if (buf == NULL || next_ptr >= MAX_PTR) return NULL;
+ table[next_ptr].org_ptr = buf;
+
+ /* Normalize the pointer to seg:0 */
+ *((ush*)&buf+1) += ((ush)((uch*)buf-0) + 15) >> 4;
+ *(ush*)&buf = 0;
+ table[next_ptr++].new_ptr = buf;
+ return buf;
+}
+
+void zcfree (voidpf opaque, voidpf ptr)
+{
+ int n;
+ if (*(ush*)&ptr != 0) { /* object < 64K */
+ farfree(ptr);
+ return;
+ }
+ /* Find the original pointer */
+ for (n = 0; n < next_ptr; n++) {
+ if (ptr != table[n].new_ptr) continue;
+
+ farfree(table[n].org_ptr);
+ while (++n < next_ptr) {
+ table[n-1] = table[n];
+ }
+ next_ptr--;
+ return;
+ }
+ ptr = opaque; /* just to make some compilers happy */
+ Assert(0, "zcfree: ptr not found");
+}
+
+#endif /* __TURBOC__ */
+
+
+#ifdef M_I86
+/* Microsoft C in 16-bit mode */
+
+# define MY_ZCALLOC
+
+#if (!defined(_MSC_VER) || (_MSC_VER <= 600))
+# define _halloc halloc
+# define _hfree hfree
+#endif
+
+voidpf zcalloc (voidpf opaque, unsigned items, unsigned size)
+{
+ if (opaque) opaque = 0; /* to make compiler happy */
+ return _halloc((long)items, size);
+}
+
+void zcfree (voidpf opaque, voidpf ptr)
+{
+ if (opaque) opaque = 0; /* to make compiler happy */
+ _hfree(ptr);
+}
+
+#endif /* M_I86 */
+
+#endif /* SYS16BIT */
+
+
+#ifndef MY_ZCALLOC /* Any system without a special alloc function */
+
+#ifndef STDC
+extern voidp malloc OF((uInt size));
+extern voidp calloc OF((uInt items, uInt size));
+extern void free OF((voidpf ptr));
+#endif
+
+voidpf zcalloc (opaque, items, size)
+ voidpf opaque;
+ unsigned items;
+ unsigned size;
+{
+ if (opaque) items += size - size; /* make compiler happy */
+ return sizeof(uInt) > 2 ? (voidpf)malloc(items * size) :
+ (voidpf)calloc(items, size);
+}
+
+void zcfree (opaque, ptr)
+ voidpf opaque;
+ voidpf ptr;
+{
+ free(ptr);
+ if (opaque) return; /* make compiler happy */
+}
+
+#endif /* MY_ZCALLOC */
diff --git a/sys/contrib/opensolaris/uts/common/zmod/zutil.h b/sys/contrib/opensolaris/uts/common/zmod/zutil.h
new file mode 100644
index 0000000..1d02c1d
--- /dev/null
+++ b/sys/contrib/opensolaris/uts/common/zmod/zutil.h
@@ -0,0 +1,274 @@
+/*
+ * Copyright 2007 Sun Microsystems, Inc. All rights reserved.
+ * Use is subject to license terms.
+ */
+
+/* zutil.h -- internal interface and configuration of the compression library
+ * Copyright (C) 1995-2005 Jean-loup Gailly.
+ * For conditions of distribution and use, see copyright notice in zlib.h
+ */
+
+/* WARNING: this file should *not* be used by applications. It is
+ part of the implementation of the compression library and is
+ subject to change. Applications should only use zlib.h.
+ */
+
+#ifndef _ZUTIL_H
+#define _ZUTIL_H
+
+#pragma ident "%Z%%M% %I% %E% SMI"
+
+#define ZLIB_INTERNAL
+#include "zlib.h"
+
+#ifdef STDC
+# ifndef _WIN32_WCE
+# include <stddef.h>
+# endif
+# include <string.h>
+# include <stdlib.h>
+#endif
+#ifdef NO_ERRNO_H
+# ifdef _WIN32_WCE
+ /* The Microsoft C Run-Time Library for Windows CE doesn't have
+ * errno. We define it as a global variable to simplify porting.
+ * Its value is always 0 and should not be used. We rename it to
+ * avoid conflict with other libraries that use the same workaround.
+ */
+# define errno z_errno
+# endif
+ extern int errno;
+#else
+# ifndef _WIN32_WCE
+# include <sys/errno.h>
+# endif
+#endif
+
+#ifndef local
+# define local static
+#endif
+/* compile with -Dlocal if your debugger can't find static symbols */
+
+typedef unsigned char uch;
+typedef uch FAR uchf;
+typedef unsigned short ush;
+typedef ush FAR ushf;
+typedef unsigned long ulg;
+
+extern const char * const z_errmsg[10]; /* indexed by 2-zlib_error */
+/* (size given to avoid silly warnings with Visual C++) */
+
+#define ERR_MSG(err) z_errmsg[Z_NEED_DICT-(err)]
+
+#define ERR_RETURN(strm,err) \
+ return (strm->msg = (char*)ERR_MSG(err), (err))
+/* To be used only when the state is known to be valid */
+
+ /* common constants */
+
+#ifndef DEF_WBITS
+# define DEF_WBITS MAX_WBITS
+#endif
+/* default windowBits for decompression. MAX_WBITS is for compression only */
+
+#if MAX_MEM_LEVEL >= 8
+# define DEF_MEM_LEVEL 8
+#else
+# define DEF_MEM_LEVEL MAX_MEM_LEVEL
+#endif
+/* default memLevel */
+
+#define STORED_BLOCK 0
+#define STATIC_TREES 1
+#define DYN_TREES 2
+/* The three kinds of block type */
+
+#define MIN_MATCH 3
+#define MAX_MATCH 258
+/* The minimum and maximum match lengths */
+
+#define PRESET_DICT 0x20 /* preset dictionary flag in zlib header */
+
+ /* target dependencies */
+
+#if defined(MSDOS) || (defined(WINDOWS) && !defined(WIN32))
+# define OS_CODE 0x00
+# if defined(__TURBOC__) || defined(__BORLANDC__)
+# if(__STDC__ == 1) && (defined(__LARGE__) || defined(__COMPACT__))
+ /* Allow compilation with ANSI keywords only enabled */
+ void _Cdecl farfree( void *block );
+ void *_Cdecl farmalloc( unsigned long nbytes );
+# else
+# include <alloc.h>
+# endif
+# else /* MSC or DJGPP */
+# include <malloc.h>
+# endif
+#endif
+
+#ifdef AMIGA
+# define OS_CODE 0x01
+#endif
+
+#if defined(VAXC) || defined(VMS)
+# define OS_CODE 0x02
+# define F_OPEN(name, mode) \
+ fopen((name), (mode), "mbc=60", "ctx=stm", "rfm=fix", "mrs=512")
+#endif
+
+#if defined(ATARI) || defined(atarist)
+# define OS_CODE 0x05
+#endif
+
+#ifdef OS2
+# define OS_CODE 0x06
+# ifdef M_I86
+ #include <malloc.h>
+# endif
+#endif
+
+#if defined(MACOS) || defined(TARGET_OS_MAC)
+# define OS_CODE 0x07
+# if defined(__MWERKS__) && __dest_os != __be_os && __dest_os != __win32_os
+# include <unix.h> /* for fdopen */
+# else
+# ifndef fdopen
+# define fdopen(fd,mode) NULL /* No fdopen() */
+# endif
+# endif
+#endif
+
+#ifdef TOPS20
+# define OS_CODE 0x0a
+#endif
+
+#ifdef WIN32
+# ifndef __CYGWIN__ /* Cygwin is Unix, not Win32 */
+# define OS_CODE 0x0b
+# endif
+#endif
+
+#ifdef __50SERIES /* Prime/PRIMOS */
+# define OS_CODE 0x0f
+#endif
+
+#if defined(_BEOS_) || defined(RISCOS)
+# define fdopen(fd,mode) NULL /* No fdopen() */
+#endif
+
+#if (defined(_MSC_VER) && (_MSC_VER > 600))
+# if defined(_WIN32_WCE)
+# define fdopen(fd,mode) NULL /* No fdopen() */
+# ifndef _PTRDIFF_T_DEFINED
+ typedef int ptrdiff_t;
+# define _PTRDIFF_T_DEFINED
+# endif
+# else
+# define fdopen(fd,type) _fdopen(fd,type)
+# endif
+#endif
+
+ /* common defaults */
+
+#ifndef OS_CODE
+# define OS_CODE 0x03 /* assume Unix */
+#endif
+
+#ifndef F_OPEN
+# define F_OPEN(name, mode) fopen((name), (mode))
+#endif
+
+ /* functions */
+
+#if defined(STDC99) || (defined(__TURBOC__) && __TURBOC__ >= 0x550)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+#if defined(__CYGWIN__)
+# ifndef HAVE_VSNPRINTF
+# define HAVE_VSNPRINTF
+# endif
+#endif
+#ifndef HAVE_VSNPRINTF
+# ifdef MSDOS
+ /* vsnprintf may exist on some MS-DOS compilers (DJGPP?),
+ but for now we just assume it doesn't. */
+# define NO_vsnprintf
+# endif
+# ifdef __TURBOC__
+# define NO_vsnprintf
+# endif
+# ifdef WIN32
+ /* In Win32, vsnprintf is available as the "non-ANSI" _vsnprintf. */
+# if !defined(vsnprintf) && !defined(NO_vsnprintf)
+# define vsnprintf _vsnprintf
+# endif
+# endif
+# ifdef __SASC
+# define NO_vsnprintf
+# endif
+#endif
+#ifdef VMS
+# define NO_vsnprintf
+#endif
+
+#if defined(pyr)
+# define NO_MEMCPY
+#endif
+#if defined(SMALL_MEDIUM) && !defined(_MSC_VER) && !defined(__SC__)
+ /* Use our own functions for small and medium model with MSC <= 5.0.
+ * You may have to use the same strategy for Borland C (untested).
+ * The __SC__ check is for Symantec.
+ */
+# define NO_MEMCPY
+#endif
+#if defined(STDC) && !defined(HAVE_MEMCPY) && !defined(NO_MEMCPY)
+# define HAVE_MEMCPY
+#endif
+#ifdef HAVE_MEMCPY
+# ifdef SMALL_MEDIUM /* MSDOS small or medium model */
+# define zmemcpy _fmemcpy
+# define zmemcmp _fmemcmp
+# define zmemzero(dest, len) _fmemset(dest, 0, len)
+# else
+# define zmemcpy memcpy
+# define zmemcmp memcmp
+# define zmemzero(dest, len) memset(dest, 0, len)
+# endif
+#else
+ extern void zmemcpy OF((void* dest, const void* source, uInt len));
+ extern int zmemcmp OF((const void* s1, const void* s2, uInt len));
+ extern void zmemzero OF((void* dest, uInt len));
+#endif
+
+/* Diagnostic functions */
+#ifdef DEBUG
+# include <stdio.h>
+ extern int z_verbose;
+ extern void z_error OF((char *m));
+# define Assert(cond,msg) {if(!(cond)) z_error(msg);}
+# define Trace(x) {if (z_verbose>=0) fprintf x ;}
+# define Tracev(x) {if (z_verbose>0) fprintf x ;}
+# define Tracevv(x) {if (z_verbose>1) fprintf x ;}
+# define Tracec(c,x) {if (z_verbose>0 && (c)) fprintf x ;}
+# define Tracecv(c,x) {if (z_verbose>1 && (c)) fprintf x ;}
+#else
+# define Assert(cond,msg)
+# define Trace(x)
+# define Tracev(x)
+# define Tracevv(x)
+# define Tracec(c,x)
+# define Tracecv(c,x)
+#endif
+
+
+voidpf zcalloc OF((voidpf opaque, unsigned items, unsigned size));
+void zcfree OF((voidpf opaque, voidpf ptr));
+
+#define ZALLOC(strm, items, size) \
+ (*((strm)->zalloc))((strm)->opaque, (items), (size))
+#define ZFREE(strm, addr) (*((strm)->zfree))((strm)->opaque, (voidpf)(addr))
+#define TRY_FREE(s, p) {if (p) ZFREE(s, p);}
+
+#endif /* _ZUTIL_H */
diff --git a/sys/contrib/pf/net/if_pflog.c b/sys/contrib/pf/net/if_pflog.c
index 561a2f6..6ddf212 100644
--- a/sys/contrib/pf/net/if_pflog.c
+++ b/sys/contrib/pf/net/if_pflog.c
@@ -1,4 +1,6 @@
-/* $OpenBSD: if_pflog.c,v 1.22 2006/12/15 09:31:20 otto Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: if_pflog.c,v 1.12 2004/05/19 17:50:51 dhartmei Exp $ */
+
/*
* The authors of this code are John Ioannidis (ji@tla.org),
* Angelos D. Keromytis (kermit@csd.uch.gr) and
@@ -33,17 +35,49 @@
* PURPOSE.
*/
+#ifdef __FreeBSD__
+#include "opt_inet.h"
+#include "opt_inet6.h"
+#endif
+
+#ifndef __FreeBSD__
#include "bpfilter.h"
#include "pflog.h"
+#elif __FreeBSD__ >= 5
+#include "opt_bpf.h"
+#include "opt_pf.h"
+
+#ifdef DEV_BPF
+#define NBPFILTER DEV_BPF
+#else
+#define NBPFILTER 0
+#endif
+
+#ifdef DEV_PFLOG
+#define NPFLOG DEV_PFLOG
+#else
+#define NPFLOG 0
+#endif
+
+#endif
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/mbuf.h>
-#include <sys/proc.h>
#include <sys/socket.h>
+#ifdef __FreeBSD__
+#include <sys/kernel.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <sys/sockio.h>
+#else
#include <sys/ioctl.h>
+#endif
#include <net/if.h>
+#if defined(__FreeBSD__)
+#include <net/if_clone.h>
+#endif
#include <net/if_types.h>
#include <net/route.h>
#include <net/bpf.h>
@@ -55,6 +89,10 @@
#include <netinet/ip.h>
#endif
+#ifdef __FreeBSD__
+#include <machine/in_cksum.h>
+#endif
+
#ifdef INET6
#ifndef INET
#include <netinet/in.h>
@@ -65,6 +103,10 @@
#include <net/pfvar.h>
#include <net/if_pflog.h>
+#ifdef __FreeBSD__
+#define PFLOGNAME "pflog"
+#endif
+
#define PFLOGMTU (32768 + MHLEN + MLEN)
#ifdef PFLOGDEBUG
@@ -73,91 +115,115 @@
#define DPRINTF(x)
#endif
+#ifndef __FreeBSD__
+struct pflog_softc pflogif[NPFLOG];
+#endif
+
+#ifdef __FreeBSD__
+static void pflog_clone_destroy(struct ifnet *);
+static int pflog_clone_create(struct if_clone *, int, caddr_t);
+#else
void pflogattach(int);
+#endif
int pflogoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
struct rtentry *);
int pflogioctl(struct ifnet *, u_long, caddr_t);
+void pflogrtrequest(int, struct rtentry *, struct sockaddr *);
void pflogstart(struct ifnet *);
-int pflog_clone_create(struct if_clone *, int);
-int pflog_clone_destroy(struct ifnet *);
-
-LIST_HEAD(, pflog_softc) pflogif_list;
-struct if_clone pflog_cloner =
- IF_CLONE_INITIALIZER("pflog", pflog_clone_create, pflog_clone_destroy);
-
-struct ifnet *pflogifs[PFLOGIFS_MAX]; /* for fast access */
+#ifndef __FreeBSD__
extern int ifqmaxlen;
+#endif
-void
-pflogattach(int npflog)
+#ifdef __FreeBSD__
+static MALLOC_DEFINE(M_PFLOG, PFLOGNAME, "Packet Filter Logging Interface");
+static LIST_HEAD(pflog_list, pflog_softc) pflog_list;
+#define SCP2IFP(sc) ((sc)->sc_ifp)
+IFC_SIMPLE_DECLARE(pflog, 1);
+
+static void
+pflog_clone_destroy(struct ifnet *ifp)
{
- int i;
- LIST_INIT(&pflogif_list);
- for (i = 0; i < PFLOGIFS_MAX; i++)
- pflogifs[i] = NULL;
- (void) pflog_clone_create(&pflog_cloner, 0);
- if_clone_attach(&pflog_cloner);
+ struct pflog_softc *sc;
+
+ sc = ifp->if_softc;
+
+ /*
+ * Does we really need this?
+ */
+ IF_DRAIN(&ifp->if_snd);
+
+ bpfdetach(ifp);
+ if_detach(ifp);
+ if_free(ifp);
+ LIST_REMOVE(sc, sc_next);
+ free(sc, M_PFLOG);
}
-int
+static int
+#ifdef __FreeBSD__
+pflog_clone_create(struct if_clone *ifc, int unit, caddr_t params)
+#else
pflog_clone_create(struct if_clone *ifc, int unit)
+#endif
{
+ struct pflog_softc *sc;
struct ifnet *ifp;
- struct pflog_softc *pflogif;
- int s;
- if (unit >= PFLOGIFS_MAX)
- return (EINVAL);
-
- if ((pflogif = malloc(sizeof(*pflogif), M_DEVBUF, M_NOWAIT)) == NULL)
- return (ENOMEM);
- bzero(pflogif, sizeof(*pflogif));
+ MALLOC(sc, struct pflog_softc *, sizeof(*sc), M_PFLOG, M_WAITOK|M_ZERO);
+ ifp = sc->sc_ifp = if_alloc(IFT_PFLOG);
+ if (ifp == NULL) {
+ free(sc, M_PFLOG);
+ return (ENOSPC);
+ }
- pflogif->sc_unit = unit;
- ifp = &pflogif->sc_if;
- snprintf(ifp->if_xname, sizeof ifp->if_xname, "pflog%d", unit);
- ifp->if_softc = pflogif;
+ if_initname(ifp, ifc->ifc_name, unit);
ifp->if_mtu = PFLOGMTU;
ifp->if_ioctl = pflogioctl;
ifp->if_output = pflogoutput;
ifp->if_start = pflogstart;
- ifp->if_type = IFT_PFLOG;
ifp->if_snd.ifq_maxlen = ifqmaxlen;
ifp->if_hdrlen = PFLOG_HDRLEN;
+ ifp->if_softc = sc;
if_attach(ifp);
- if_alloc_sadl(ifp);
+ LIST_INSERT_HEAD(&pflog_list, sc, sc_next);
#if NBPFILTER > 0
- bpfattach(&pflogif->sc_if.if_bpf, ifp, DLT_PFLOG, PFLOG_HDRLEN);
+ bpfattach(ifp, DLT_PFLOG, PFLOG_HDRLEN);
#endif
- s = splnet();
- LIST_INSERT_HEAD(&pflogif_list, pflogif, sc_list);
- pflogifs[unit] = ifp;
- splx(s);
-
return (0);
}
-
-int
-pflog_clone_destroy(struct ifnet *ifp)
+#else /* !__FreeBSD__ */
+void
+pflogattach(int npflog)
{
- struct pflog_softc *pflogif = ifp->if_softc;
- int s;
-
- s = splnet();
- pflogifs[pflogif->sc_unit] = NULL;
- LIST_REMOVE(pflogif, sc_list);
- splx(s);
+ struct ifnet *ifp;
+ int i;
+
+ bzero(pflogif, sizeof(pflogif));
+
+ for (i = 0; i < NPFLOG; i++) {
+ ifp = &pflogif[i].sc_if;
+ snprintf(ifp->if_xname, sizeof ifp->if_xname, "pflog%d", i);
+ ifp->if_softc = &pflogif[i];
+ ifp->if_mtu = PFLOGMTU;
+ ifp->if_ioctl = pflogioctl;
+ ifp->if_output = pflogoutput;
+ ifp->if_start = pflogstart;
+ ifp->if_type = IFT_PFLOG;
+ ifp->if_snd.ifq_maxlen = ifqmaxlen;
+ ifp->if_hdrlen = PFLOG_HDRLEN;
+ if_attach(ifp);
+ if_alloc_sadl(ifp);
#if NBPFILTER > 0
- bpfdetach(ifp);
+ bpfattach(&pflogif[i].sc_if.if_bpf, ifp, DLT_PFLOG,
+ PFLOG_HDRLEN);
#endif
- if_detach(ifp);
- free(pflogif, M_DEVBUF);
- return (0);
+ }
}
+#endif /* __FreeBSD__ */
/*
* Start output on the pflog interface.
@@ -166,18 +232,32 @@ void
pflogstart(struct ifnet *ifp)
{
struct mbuf *m;
+#ifndef __FreeBSD__
int s;
+#endif
for (;;) {
- s = splnet();
+#ifdef __FreeBSD__
+ IF_LOCK(&ifp->if_snd);
+ _IF_DROP(&ifp->if_snd);
+ _IF_DEQUEUE(&ifp->if_snd, m);
+ if (m == NULL) {
+ IF_UNLOCK(&ifp->if_snd);
+ return;
+ }
+ else
+ m_freem(m);
+ IF_UNLOCK(&ifp->if_snd);
+#else
+ s = splimp();
IF_DROP(&ifp->if_snd);
IF_DEQUEUE(&ifp->if_snd, m);
splx(s);
-
if (m == NULL)
return;
else
m_freem(m);
+#endif
}
}
@@ -190,6 +270,14 @@ pflogoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
}
/* ARGSUSED */
+void
+pflogrtrequest(int cmd, struct rtentry *rt, struct sockaddr *sa)
+{
+ if (rt)
+ rt->rt_rmx.rmx_mtu = PFLOGMTU;
+}
+
+/* ARGSUSED */
int
pflogioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
{
@@ -198,10 +286,17 @@ pflogioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
case SIOCAIFADDR:
case SIOCSIFDSTADDR:
case SIOCSIFFLAGS:
+#ifdef __FreeBSD__
+ if (ifp->if_flags & IFF_UP)
+ ifp->if_drv_flags |= IFF_DRV_RUNNING;
+ else
+ ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+#else
if (ifp->if_flags & IFF_UP)
ifp->if_flags |= IFF_RUNNING;
else
ifp->if_flags &= ~IFF_RUNNING;
+#endif
break;
default:
return (EINVAL);
@@ -213,18 +308,18 @@ pflogioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
int
pflog_packet(struct pfi_kif *kif, struct mbuf *m, sa_family_t af, u_int8_t dir,
u_int8_t reason, struct pf_rule *rm, struct pf_rule *am,
- struct pf_ruleset *ruleset, struct pf_pdesc *pd)
+ struct pf_ruleset *ruleset)
{
#if NBPFILTER > 0
struct ifnet *ifn;
struct pfloghdr hdr;
+#ifndef __FreeBSD__
+ struct mbuf m1;
+#endif
- if (kif == NULL || m == NULL || rm == NULL || pd == NULL)
+ if (kif == NULL || m == NULL || rm == NULL)
return (-1);
- if ((ifn = pflogifs[rm->logif]) == NULL || !ifn->if_bpf)
- return (0);
-
bzero(&hdr, sizeof(hdr));
hdr.length = PFLOG_REAL_HDRLEN;
hdr.af = af;
@@ -242,17 +337,6 @@ pflog_packet(struct pfi_kif *kif, struct mbuf *m, sa_family_t af, u_int8_t dir,
strlcpy(hdr.ruleset, ruleset->anchor->name,
sizeof(hdr.ruleset));
}
- if (rm->log & PF_LOG_SOCKET_LOOKUP && !pd->lookup.done)
- pd->lookup.done = pf_socket_lookup(dir, pd);
- if (pd->lookup.done > 0) {
- hdr.uid = pd->lookup.uid;
- hdr.pid = pd->lookup.pid;
- } else {
- hdr.uid = UID_MAX;
- hdr.pid = NO_PID;
- }
- hdr.rule_uid = rm->cuid;
- hdr.rule_pid = rm->cpid;
hdr.dir = dir;
#ifdef INET
@@ -265,11 +349,66 @@ pflog_packet(struct pfi_kif *kif, struct mbuf *m, sa_family_t af, u_int8_t dir,
}
#endif /* INET */
- ifn->if_opackets++;
- ifn->if_obytes += m->m_pkthdr.len;
- bpf_mtap_hdr(ifn->if_bpf, (char *)&hdr, PFLOG_HDRLEN, m,
- BPF_DIRECTION_OUT);
+#ifndef __FreeBSD__
+ m1.m_next = m;
+ m1.m_len = PFLOG_HDRLEN;
+ m1.m_data = (char *) &hdr;
+#endif
+
+#ifdef __FreeBSD__
+ KASSERT((!LIST_EMPTY(&pflog_list)), ("pflog: no interface"));
+ ifn = SCP2IFP(LIST_FIRST(&pflog_list));
+ BPF_MTAP2(ifn, &hdr, sizeof(hdr), m);
+#else
+ ifn = &(pflogif[0].sc_if);
+
+ if (ifn->if_bpf)
+ bpf_mtap(ifn->if_bpf, &m1);
+#endif
#endif
return (0);
}
+
+#ifdef __FreeBSD__
+static int
+pflog_modevent(module_t mod, int type, void *data)
+{
+ int error = 0;
+
+ switch (type) {
+ case MOD_LOAD:
+ LIST_INIT(&pflog_list);
+ if_clone_attach(&pflog_cloner);
+ PF_LOCK();
+ pflog_packet_ptr = pflog_packet;
+ PF_UNLOCK();
+ break;
+
+ case MOD_UNLOAD:
+ PF_LOCK();
+ pflog_packet_ptr = NULL;
+ PF_UNLOCK();
+ if_clone_detach(&pflog_cloner);
+ break;
+
+ default:
+ error = EINVAL;
+ break;
+ }
+
+ return error;
+}
+
+static moduledata_t pflog_mod = {
+ "pflog",
+ pflog_modevent,
+ 0
+};
+
+#define PFLOG_MODVER 1
+
+DECLARE_MODULE(pflog, pflog_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY);
+MODULE_VERSION(pflog, PFLOG_MODVER);
+MODULE_DEPEND(pflog, pf, PF_MODVER, PF_MODVER, PF_MODVER);
+#endif /* __FreeBSD__ */
diff --git a/sys/contrib/pf/net/if_pflog.h b/sys/contrib/pf/net/if_pflog.h
index e9e0b01..4e160a7 100644
--- a/sys/contrib/pf/net/if_pflog.h
+++ b/sys/contrib/pf/net/if_pflog.h
@@ -1,4 +1,6 @@
-/* $OpenBSD: if_pflog.h,v 1.14 2006/10/25 11:27:01 henning Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: if_pflog.h,v 1.11 2004/05/19 17:50:51 dhartmei Exp $ */
+
/*
* Copyright 2001 Niels Provos <provos@citi.umich.edu>
* All rights reserved.
@@ -27,12 +29,13 @@
#ifndef _NET_IF_PFLOG_H_
#define _NET_IF_PFLOG_H_
-#define PFLOGIFS_MAX 16
-
struct pflog_softc {
- struct ifnet sc_if; /* the interface */
- int sc_unit;
- LIST_ENTRY(pflog_softc) sc_list;
+#ifdef __FreeBSD__
+ struct ifnet *sc_ifp; /* the interface */
+ LIST_ENTRY(pflog_softc) sc_next;
+#else
+ struct ifnet sc_if; /* the interface */
+#endif
};
#define PFLOG_RULESET_NAME_SIZE 16
@@ -46,10 +49,6 @@ struct pfloghdr {
char ruleset[PFLOG_RULESET_NAME_SIZE];
u_int32_t rulenr;
u_int32_t subrulenr;
- uid_t uid;
- pid_t pid;
- uid_t rule_uid;
- pid_t rule_pid;
u_int8_t dir;
u_int8_t pad[3];
};
@@ -71,10 +70,25 @@ struct old_pfloghdr {
#ifdef _KERNEL
+#ifdef __FreeBSD__
+struct pf_rule;
+struct pf_ruleset;
+struct pfi_kif;
+
+typedef int pflog_packet_t(struct pfi_kif *, struct mbuf *, sa_family_t,
+ u_int8_t, u_int8_t, struct pf_rule *, struct pf_rule *,
+ struct pf_ruleset *);
+extern pflog_packet_t *pflog_packet_ptr;
+#define PFLOG_PACKET(i,x,a,b,c,d,e,f,g) do { \
+ if (pflog_packet_ptr != NULL) \
+ pflog_packet_ptr(i,a,b,c,d,e,f,g); \
+} while (0)
+#else
#if NPFLOG > 0
-#define PFLOG_PACKET(i,x,a,b,c,d,e,f,g,h) pflog_packet(i,a,b,c,d,e,f,g,h)
+#define PFLOG_PACKET(i,x,a,b,c,d,e,f,g) pflog_packet(i,a,b,c,d,e,f,g)
#else
-#define PFLOG_PACKET(i,x,a,b,c,d,e,f,g,h) ((void)0)
+#define PFLOG_PACKET(i,x,a,b,c,d,e,f,g) ((void)0)
#endif /* NPFLOG > 0 */
+#endif /* __FreeBSD__ */
#endif /* _KERNEL */
#endif /* _NET_IF_PFLOG_H_ */
diff --git a/sys/contrib/pf/net/if_pfsync.c b/sys/contrib/pf/net/if_pfsync.c
index 1106339..0f5c344 100644
--- a/sys/contrib/pf/net/if_pfsync.c
+++ b/sys/contrib/pf/net/if_pfsync.c
@@ -1,4 +1,5 @@
-/* $OpenBSD: if_pfsync.c,v 1.73 2006/11/16 13:13:38 henning Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: if_pfsync.c,v 1.46 2005/02/20 15:58:38 mcbride Exp $ */
/*
* Copyright (c) 2002 Michael Shalayeff
@@ -26,27 +27,67 @@
* THE POSSIBILITY OF SUCH DAMAGE.
*/
+#ifdef __FreeBSD__
+#include "opt_inet.h"
+#include "opt_inet6.h"
+#endif
+
+#ifndef __FreeBSD__
+#include "bpfilter.h"
+#include "pfsync.h"
+#elif __FreeBSD__ >= 5
+#include "opt_bpf.h"
+#include "opt_pf.h"
+
+#ifdef DEV_BPF
+#define NBPFILTER DEV_BPF
+#else
+#define NBPFILTER 0
+#endif
+
+#ifdef DEV_PFSYNC
+#define NPFSYNC DEV_PFSYNC
+#else
+#define NPFSYNC 0
+#endif
+
+#endif
#include <sys/param.h>
+#ifdef __FreeBSD__
+#include <sys/priv.h>
+#endif
#include <sys/proc.h>
#include <sys/systm.h>
#include <sys/time.h>
#include <sys/mbuf.h>
#include <sys/socket.h>
+#include <sys/kernel.h>
+#ifdef __FreeBSD__
+#include <sys/endian.h>
+#include <sys/malloc.h>
+#include <sys/module.h>
+#include <sys/sockio.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <sys/sysctl.h>
+#else
#include <sys/ioctl.h>
#include <sys/timeout.h>
-#include <sys/kernel.h>
+#endif
#include <net/if.h>
+#if defined(__FreeBSD__)
+#include <net/if_clone.h>
+#endif
#include <net/if_types.h>
#include <net/route.h>
#include <net/bpf.h>
-#include <netinet/in.h>
-#include <netinet/if_ether.h>
#include <netinet/tcp.h>
#include <netinet/tcp_seq.h>
#ifdef INET
+#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/in_var.h>
#include <netinet/ip.h>
@@ -54,19 +95,32 @@
#endif
#ifdef INET6
+#ifndef INET
+#include <netinet/in.h>
+#endif
#include <netinet6/nd6.h>
#endif /* INET6 */
+#ifdef __FreeBSD__
+#include "opt_carp.h"
+#ifdef DEV_CARP
+#define NCARP 1
+#else
+#define NCARP 0
+#endif
+#else
#include "carp.h"
+#endif
#if NCARP > 0
-#include <netinet/ip_carp.h>
+extern int carp_suppress_preempt;
#endif
#include <net/pfvar.h>
#include <net/if_pfsync.h>
-#include "bpfilter.h"
-#include "pfsync.h"
+#ifdef __FreeBSD__
+#define PFSYNCNAME "pfsync"
+#endif
#define PFSYNC_MINMTU \
(sizeof(struct pfsync_header) + sizeof(struct pf_state))
@@ -78,17 +132,32 @@ int pfsyncdebug;
#define DPRINTF(x)
#endif
-struct pfsync_softc *pfsyncif = NULL;
-struct pfsyncstats pfsyncstats;
+#ifndef __FreeBSD__
+struct pfsync_softc pfsyncif;
+#endif
+struct pfsyncstats pfsyncstats;
+#ifdef __FreeBSD__
+SYSCTL_DECL(_net_inet_pfsync);
+SYSCTL_STRUCT(_net_inet_pfsync, 0, stats, CTLFLAG_RW,
+ &pfsyncstats, pfsyncstats,
+ "PFSYNC statistics (struct pfsyncstats, net/if_pfsync.h)");
+/*
+ * Locking notes:
+ * Whenever we really touch/look at the state table we have to hold the
+ * PF_LOCK. Functions that do just the interface handling, grab the per
+ * softc lock instead.
+ *
+ */
+
+static void pfsync_clone_destroy(struct ifnet *);
+static int pfsync_clone_create(struct if_clone *, int, caddr_t params);
+static void pfsync_senddef(void *);
+#else
void pfsyncattach(int);
-int pfsync_clone_create(struct if_clone *, int);
-int pfsync_clone_destroy(struct ifnet *);
+#endif
void pfsync_setmtu(struct pfsync_softc *, int);
-int pfsync_alloc_scrub_memory(struct pfsync_state_peer *,
- struct pf_state_peer *);
-int pfsync_insert_net_state(struct pfsync_state *, u_int8_t);
-void pfsync_update_net_tdb(struct pfsync_tdb *);
+int pfsync_insert_net_state(struct pfsync_state *);
int pfsyncoutput(struct ifnet *, struct mbuf *, struct sockaddr *,
struct rtentry *);
int pfsyncioctl(struct ifnet *, u_long, caddr_t);
@@ -97,89 +166,160 @@ void pfsyncstart(struct ifnet *);
struct mbuf *pfsync_get_mbuf(struct pfsync_softc *, u_int8_t, void **);
int pfsync_request_update(struct pfsync_state_upd *, struct in_addr *);
int pfsync_sendout(struct pfsync_softc *);
-int pfsync_tdb_sendout(struct pfsync_softc *);
-int pfsync_sendout_mbuf(struct pfsync_softc *, struct mbuf *);
void pfsync_timeout(void *);
-void pfsync_tdb_timeout(void *);
void pfsync_send_bus(struct pfsync_softc *, u_int8_t);
void pfsync_bulk_update(void *);
void pfsync_bulkfail(void *);
+#ifdef __FreeBSD__
+static void pfsync_ifdetach(void *, struct ifnet *);
+#endif
int pfsync_sync_ok;
+#ifndef __FreeBSD__
extern int ifqmaxlen;
+extern struct timeval time;
+extern struct timeval mono_time;
+extern int hz;
+#endif
-struct if_clone pfsync_cloner =
- IF_CLONE_INITIALIZER("pfsync", pfsync_clone_create, pfsync_clone_destroy);
+#ifdef __FreeBSD__
+static MALLOC_DEFINE(M_PFSYNC, PFSYNCNAME, "Packet Filter State Sync. Interface");
+static LIST_HEAD(pfsync_list, pfsync_softc) pfsync_list;
+#define SCP2IFP(sc) ((sc)->sc_ifp)
+IFC_SIMPLE_DECLARE(pfsync, 1);
-void
-pfsyncattach(int npfsync)
+static void
+pfsync_clone_destroy(struct ifnet *ifp)
{
- if_clone_attach(&pfsync_cloner);
+ struct pfsync_softc *sc;
+
+ sc = ifp->if_softc;
+#ifdef __FreeBSD__
+ EVENTHANDLER_DEREGISTER(ifnet_departure_event, sc->sc_detachtag);
+#endif
+ callout_stop(&sc->sc_tmo);
+ callout_stop(&sc->sc_bulk_tmo);
+ callout_stop(&sc->sc_bulkfail_tmo);
+
+ callout_stop(&sc->sc_send_tmo);
+
+#if NBPFILTER > 0
+ bpfdetach(ifp);
+#endif
+ if_detach(ifp);
+ if_free(ifp);
+ LIST_REMOVE(sc, sc_next);
+ free(sc->sc_imo.imo_membership, M_PFSYNC);
+ free(sc, M_PFSYNC);
}
-int
+
+static int
+#ifdef __FreeBSD__
+pfsync_clone_create(struct if_clone *ifc, int unit, caddr_t params)
+#else
pfsync_clone_create(struct if_clone *ifc, int unit)
+#endif
{
+ struct pfsync_softc *sc;
struct ifnet *ifp;
- if (unit != 0)
- return (EINVAL);
+ MALLOC(sc, struct pfsync_softc *, sizeof(*sc), M_PFSYNC,
+ M_WAITOK|M_ZERO);
+ ifp = sc->sc_ifp = if_alloc(IFT_PFSYNC);
+ if (ifp == NULL) {
+ free(sc, M_PFSYNC);
+ return (ENOSPC);
+ }
+
+#ifdef __FreeBSD__
+ sc->sc_detachtag = EVENTHANDLER_REGISTER(ifnet_departure_event,
+ pfsync_ifdetach, sc, EVENTHANDLER_PRI_ANY);
+ if (sc->sc_detachtag == NULL) {
+ if_free(ifp);
+ free(sc, M_PFSYNC);
+ return (ENOSPC);
+ }
+#endif
pfsync_sync_ok = 1;
- if ((pfsyncif = malloc(sizeof(*pfsyncif), M_DEVBUF, M_NOWAIT)) == NULL)
- return (ENOMEM);
- bzero(pfsyncif, sizeof(*pfsyncif));
- pfsyncif->sc_mbuf = NULL;
- pfsyncif->sc_mbuf_net = NULL;
- pfsyncif->sc_mbuf_tdb = NULL;
- pfsyncif->sc_statep.s = NULL;
- pfsyncif->sc_statep_net.s = NULL;
- pfsyncif->sc_statep_tdb.t = NULL;
- pfsyncif->sc_maxupdates = 128;
- pfsyncif->sc_sync_peer.s_addr = INADDR_PFSYNC_GROUP;
- pfsyncif->sc_sendaddr.s_addr = INADDR_PFSYNC_GROUP;
- pfsyncif->sc_ureq_received = 0;
- pfsyncif->sc_ureq_sent = 0;
- pfsyncif->sc_bulk_send_next = NULL;
- pfsyncif->sc_bulk_terminator = NULL;
- ifp = &pfsyncif->sc_if;
- snprintf(ifp->if_xname, sizeof ifp->if_xname, "pfsync%d", unit);
- ifp->if_softc = pfsyncif;
+ sc->sc_mbuf = NULL;
+ sc->sc_mbuf_net = NULL;
+ sc->sc_statep.s = NULL;
+ sc->sc_statep_net.s = NULL;
+ sc->sc_maxupdates = 128;
+ sc->sc_sync_peer.s_addr = htonl(INADDR_PFSYNC_GROUP);
+ sc->sc_sendaddr.s_addr = htonl(INADDR_PFSYNC_GROUP);
+ sc->sc_ureq_received = 0;
+ sc->sc_ureq_sent = 0;
+ sc->sc_imo.imo_membership = (struct in_multi **)malloc(
+ (sizeof(struct in_multi *) * IP_MIN_MEMBERSHIPS), M_PFSYNC,
+ M_WAITOK);
+ sc->sc_imo.imo_max_memberships = IP_MIN_MEMBERSHIPS;
+
+ ifp = SCP2IFP(sc);
+ if_initname(ifp, ifc->ifc_name, unit);
ifp->if_ioctl = pfsyncioctl;
ifp->if_output = pfsyncoutput;
ifp->if_start = pfsyncstart;
- ifp->if_type = IFT_PFSYNC;
ifp->if_snd.ifq_maxlen = ifqmaxlen;
ifp->if_hdrlen = PFSYNC_HDRLEN;
- pfsync_setmtu(pfsyncif, ETHERMTU);
- timeout_set(&pfsyncif->sc_tmo, pfsync_timeout, pfsyncif);
- timeout_set(&pfsyncif->sc_tdb_tmo, pfsync_tdb_timeout, pfsyncif);
- timeout_set(&pfsyncif->sc_bulk_tmo, pfsync_bulk_update, pfsyncif);
- timeout_set(&pfsyncif->sc_bulkfail_tmo, pfsync_bulkfail, pfsyncif);
+ ifp->if_baudrate = IF_Mbps(100);
+ ifp->if_softc = sc;
+ pfsync_setmtu(sc, MCLBYTES);
+ callout_init(&sc->sc_tmo, NET_CALLOUT_MPSAFE);
+ callout_init(&sc->sc_bulk_tmo, NET_CALLOUT_MPSAFE);
+ callout_init(&sc->sc_bulkfail_tmo, NET_CALLOUT_MPSAFE);
+ callout_init(&sc->sc_send_tmo, NET_CALLOUT_MPSAFE);
+ sc->sc_ifq.ifq_maxlen = ifqmaxlen;
+ mtx_init(&sc->sc_ifq.ifq_mtx, ifp->if_xname, "pfsync send queue",
+ MTX_DEF);
if_attach(ifp);
- if_alloc_sadl(ifp);
-
-#if NCARP > 0
- if_addgroup(ifp, "carp");
-#endif
+ LIST_INSERT_HEAD(&pfsync_list, sc, sc_next);
#if NBPFILTER > 0
- bpfattach(&pfsyncif->sc_if.if_bpf, ifp, DLT_PFSYNC, PFSYNC_HDRLEN);
+ bpfattach(ifp, DLT_PFSYNC, PFSYNC_HDRLEN);
#endif
return (0);
}
-
-int
-pfsync_clone_destroy(struct ifnet *ifp)
+#else /* !__FreeBSD__ */
+void
+pfsyncattach(int npfsync)
{
+ struct ifnet *ifp;
+
+ pfsync_sync_ok = 1;
+ bzero(&pfsyncif, sizeof(pfsyncif));
+ pfsyncif.sc_mbuf = NULL;
+ pfsyncif.sc_mbuf_net = NULL;
+ pfsyncif.sc_statep.s = NULL;
+ pfsyncif.sc_statep_net.s = NULL;
+ pfsyncif.sc_maxupdates = 128;
+ pfsyncif.sc_sync_peer.s_addr = INADDR_PFSYNC_GROUP;
+ pfsyncif.sc_sendaddr.s_addr = INADDR_PFSYNC_GROUP;
+ pfsyncif.sc_ureq_received = 0;
+ pfsyncif.sc_ureq_sent = 0;
+ ifp = &pfsyncif.sc_if;
+ strlcpy(ifp->if_xname, "pfsync0", sizeof ifp->if_xname);
+ ifp->if_softc = &pfsyncif;
+ ifp->if_ioctl = pfsyncioctl;
+ ifp->if_output = pfsyncoutput;
+ ifp->if_start = pfsyncstart;
+ ifp->if_type = IFT_PFSYNC;
+ ifp->if_snd.ifq_maxlen = ifqmaxlen;
+ ifp->if_hdrlen = PFSYNC_HDRLEN;
+ pfsync_setmtu(&pfsyncif, MCLBYTES);
+ timeout_set(&pfsyncif.sc_tmo, pfsync_timeout, &pfsyncif);
+ timeout_set(&pfsyncif.sc_bulk_tmo, pfsync_bulk_update, &pfsyncif);
+ timeout_set(&pfsyncif.sc_bulkfail_tmo, pfsync_bulkfail, &pfsyncif);
+ if_attach(ifp);
+ if_alloc_sadl(ifp);
+
#if NBPFILTER > 0
- bpfdetach(ifp);
+ bpfattach(&pfsyncif.sc_if.if_bpf, ifp, DLT_PFSYNC, PFSYNC_HDRLEN);
#endif
- if_detach(ifp);
- free(pfsyncif, M_DEVBUF);
- pfsyncif = NULL;
- return (0);
}
+#endif
/*
* Start output on the pfsync interface.
@@ -187,11 +327,17 @@ pfsync_clone_destroy(struct ifnet *ifp)
void
pfsyncstart(struct ifnet *ifp)
{
+#ifdef __FreeBSD__
+ IF_LOCK(&ifp->if_snd);
+ _IF_DROP(&ifp->if_snd);
+ _IF_DRAIN(&ifp->if_snd);
+ IF_UNLOCK(&ifp->if_snd);
+#else
struct mbuf *m;
int s;
for (;;) {
- s = splnet();
+ s = splimp();
IF_DROP(&ifp->if_snd);
IF_DEQUEUE(&ifp->if_snd, m);
splx(s);
@@ -201,36 +347,26 @@ pfsyncstart(struct ifnet *ifp)
else
m_freem(m);
}
+#endif
}
int
-pfsync_alloc_scrub_memory(struct pfsync_state_peer *s,
- struct pf_state_peer *d)
-{
- if (s->scrub.scrub_flag && d->scrub == NULL) {
- d->scrub = pool_get(&pf_state_scrub_pl, PR_NOWAIT);
- if (d->scrub == NULL)
- return (ENOMEM);
- bzero(d->scrub, sizeof(*d->scrub));
- }
-
- return (0);
-}
-
-int
-pfsync_insert_net_state(struct pfsync_state *sp, u_int8_t chksum_flag)
+pfsync_insert_net_state(struct pfsync_state *sp)
{
struct pf_state *st = NULL;
struct pf_rule *r = NULL;
struct pfi_kif *kif;
+#ifdef __FreeBSD__
+ PF_ASSERT(MA_OWNED);
+#endif
if (sp->creatorid == 0 && pf_status.debug >= PF_DEBUG_MISC) {
printf("pfsync_insert_net_state: invalid creator id:"
" %08x\n", ntohl(sp->creatorid));
return (EINVAL);
}
- kif = pfi_kif_get(sp->ifname);
+ kif = pfi_lookup_create(sp->ifname);
if (kif == NULL) {
if (pf_status.debug >= PF_DEBUG_MISC)
printf("pfsync_insert_net_state: "
@@ -240,33 +376,19 @@ pfsync_insert_net_state(struct pfsync_state *sp, u_int8_t chksum_flag)
}
/*
- * If the ruleset checksums match, it's safe to associate the state
- * with the rule of that number.
+ * Just use the default rule until we have infrastructure to find the
+ * best matching rule.
*/
- if (sp->rule != htonl(-1) && sp->anchor == htonl(-1) && chksum_flag)
- r = pf_main_ruleset.rules[
- PF_RULESET_FILTER].active.ptr_array[ntohl(sp->rule)];
- else
- r = &pf_default_rule;
+ r = &pf_default_rule;
if (!r->max_states || r->states < r->max_states)
st = pool_get(&pf_state_pl, PR_NOWAIT);
if (st == NULL) {
- pfi_kif_unref(kif, PFI_KIF_REF_NONE);
+ pfi_maybe_destroy(kif);
return (ENOMEM);
}
bzero(st, sizeof(*st));
- /* allocate memory for scrub info */
- if (pfsync_alloc_scrub_memory(&sp->src, &st->src) ||
- pfsync_alloc_scrub_memory(&sp->dst, &st->dst)) {
- pfi_kif_unref(kif, PFI_KIF_REF_NONE);
- if (st->src.scrub)
- pool_put(&pf_state_scrub_pl, st->src.scrub);
- pool_put(&pf_state_pl, st);
- return (ENOMEM);
- }
-
st->rule.ptr = r;
/* XXX get pointers to nat_rule and anchor */
@@ -296,14 +418,11 @@ pfsync_insert_net_state(struct pfsync_state *sp, u_int8_t chksum_flag)
st->creatorid = sp->creatorid;
st->sync_flags = PFSTATE_FROMSYNC;
+
if (pf_insert_state(kif, st)) {
- pfi_kif_unref(kif, PFI_KIF_REF_NONE);
+ pfi_maybe_destroy(kif);
/* XXX when we have nat_rule/anchors, use STATE_DEC_COUNTERS */
r->states--;
- if (st->dst.scrub)
- pool_put(&pf_state_scrub_pl, st->dst.scrub);
- if (st->src.scrub)
- pool_put(&pf_state_scrub_pl, st->src.scrub);
pool_put(&pf_state_pl, st);
return (EINVAL);
}
@@ -312,29 +431,34 @@ pfsync_insert_net_state(struct pfsync_state *sp, u_int8_t chksum_flag)
}
void
+#ifdef __FreeBSD__
+pfsync_input(struct mbuf *m, __unused int off)
+#else
pfsync_input(struct mbuf *m, ...)
+#endif
{
struct ip *ip = mtod(m, struct ip *);
struct pfsync_header *ph;
- struct pfsync_softc *sc = pfsyncif;
- struct pf_state *st;
- struct pf_state_cmp key;
+#ifdef __FreeBSD__
+ struct pfsync_softc *sc = LIST_FIRST(&pfsync_list);
+#else
+ struct pfsync_softc *sc = &pfsyncif;
+#endif
+ struct pf_state *st, key;
struct pfsync_state *sp;
struct pfsync_state_upd *up;
struct pfsync_state_del *dp;
struct pfsync_state_clr *cp;
struct pfsync_state_upd_req *rup;
struct pfsync_state_bus *bus;
- struct pfsync_tdb *pt;
struct in_addr src;
struct mbuf *mp;
int iplen, action, error, i, s, count, offp, sfail, stale = 0;
- u_int8_t chksum_flag = 0;
pfsyncstats.pfsyncs_ipackets++;
/* verify that we have a sync interface configured */
- if (!sc || !sc->sc_sync_ifp || !pf_status.running)
+ if (!sc->sc_sync_ifp || !pf_status.running) /* XXX PF_LOCK? */
goto done;
/* verify that the packet came in on the right interface */
@@ -383,9 +507,6 @@ pfsync_input(struct mbuf *m, ...)
/* Cheaper to grab this now than having to mess with mbufs later */
src = ip->ip_src;
- if (!bcmp(&ph->pf_chksum, &pf_status.pf_chksum, PF_MD5_DIGEST_LENGTH))
- chksum_flag++;
-
switch (action) {
case PFSYNC_ACT_CLR: {
struct pf_state *nexts;
@@ -400,30 +521,43 @@ pfsync_input(struct mbuf *m, ...)
creatorid = cp->creatorid;
s = splsoftnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
if (cp->ifname[0] == '\0') {
for (st = RB_MIN(pf_state_tree_id, &tree_id);
st; st = nexts) {
- nexts = RB_NEXT(pf_state_tree_id, &tree_id, st);
+ nexts = RB_NEXT(pf_state_tree_id, &tree_id, st);
if (st->creatorid == creatorid) {
- st->sync_flags |= PFSTATE_FROMSYNC;
- pf_unlink_state(st);
+ st->timeout = PFTM_PURGE;
+ pf_purge_expired_state(st);
}
}
} else {
- if ((kif = pfi_kif_get(cp->ifname)) == NULL) {
+ kif = pfi_lookup_if(cp->ifname);
+ if (kif == NULL) {
+ if (pf_status.debug >= PF_DEBUG_MISC)
+ printf("pfsync_input: PFSYNC_ACT_CLR "
+ "bad interface: %s\n", cp->ifname);
splx(s);
- return;
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
+ goto done;
}
for (st = RB_MIN(pf_state_tree_lan_ext,
&kif->pfik_lan_ext); st; st = nexts) {
nexts = RB_NEXT(pf_state_tree_lan_ext,
&kif->pfik_lan_ext, st);
if (st->creatorid == creatorid) {
- st->sync_flags |= PFSTATE_FROMSYNC;
- pf_unlink_state(st);
+ st->timeout = PFTM_PURGE;
+ pf_purge_expired_state(st);
}
}
}
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
break;
@@ -436,6 +570,9 @@ pfsync_input(struct mbuf *m, ...)
}
s = splsoftnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
for (i = 0, sp = (struct pfsync_state *)(mp->m_data + offp);
i < count; i++, sp++) {
/* check for invalid values */
@@ -451,15 +588,20 @@ pfsync_input(struct mbuf *m, ...)
continue;
}
- if ((error = pfsync_insert_net_state(sp,
- chksum_flag))) {
+ if ((error = pfsync_insert_net_state(sp))) {
if (error == ENOMEM) {
splx(s);
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
goto done;
}
continue;
}
}
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
break;
case PFSYNC_ACT_UPD:
@@ -470,6 +612,9 @@ pfsync_input(struct mbuf *m, ...)
}
s = splsoftnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
for (i = 0, sp = (struct pfsync_state *)(mp->m_data + offp);
i < count; i++, sp++) {
int flags = PFSYNC_FLAG_STALE;
@@ -491,7 +636,7 @@ pfsync_input(struct mbuf *m, ...)
st = pf_find_state_byid(&key);
if (st == NULL) {
/* insert the update */
- if (pfsync_insert_net_state(sp, chksum_flag))
+ if (pfsync_insert_net_state(sp))
pfsyncstats.pfsyncs_badstate++;
continue;
}
@@ -530,7 +675,7 @@ pfsync_input(struct mbuf *m, ...)
*/
if (st->src.state > sp->src.state)
sfail = 5;
- else if (st->dst.state > sp->dst.state)
+ else if ( st->dst.state > sp->dst.state)
sfail = 6;
}
if (sfail) {
@@ -540,7 +685,11 @@ pfsync_input(struct mbuf *m, ...)
"creatorid: %08x\n",
(sfail < 7 ? "ignoring"
: "partial"), sfail,
+#ifdef __FreeBSD__
+ (unsigned long long)be64toh(st->id),
+#else
betoh64(st->id),
+#endif
ntohl(st->creatorid));
pfsyncstats.pfsyncs_badstate++;
@@ -555,7 +704,6 @@ pfsync_input(struct mbuf *m, ...)
}
continue;
}
- pfsync_alloc_scrub_memory(&sp->dst, &st->dst);
pf_state_peer_ntoh(&sp->src, &st->src);
pf_state_peer_ntoh(&sp->dst, &st->dst);
st->expire = ntohl(sp->expire) + time_second;
@@ -563,6 +711,9 @@ pfsync_input(struct mbuf *m, ...)
}
if (stale && sc->sc_mbuf != NULL)
pfsync_sendout(sc);
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
break;
/*
@@ -577,6 +728,9 @@ pfsync_input(struct mbuf *m, ...)
}
s = splsoftnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
for (i = 0, sp = (struct pfsync_state *)(mp->m_data + offp);
i < count; i++, sp++) {
bcopy(sp->id, &key.id, sizeof(key.id));
@@ -587,9 +741,13 @@ pfsync_input(struct mbuf *m, ...)
pfsyncstats.pfsyncs_badstate++;
continue;
}
+ st->timeout = PFTM_PURGE;
st->sync_flags |= PFSTATE_FROMSYNC;
- pf_unlink_state(st);
+ pf_purge_expired_state(st);
}
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
break;
case PFSYNC_ACT_UPD_C: {
@@ -602,6 +760,9 @@ pfsync_input(struct mbuf *m, ...)
}
s = splsoftnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
for (i = 0, up = (struct pfsync_state_upd *)(mp->m_data + offp);
i < count; i++, up++) {
/* check for invalid values */
@@ -665,7 +826,11 @@ pfsync_input(struct mbuf *m, ...)
printf("pfsync: ignoring stale update "
"(%d) id: %016llx "
"creatorid: %08x\n", sfail,
+#ifdef __FreeBSD__
+ (unsigned long long)be64toh(st->id),
+#else
betoh64(st->id),
+#endif
ntohl(st->creatorid));
pfsyncstats.pfsyncs_badstate++;
@@ -681,7 +846,6 @@ pfsync_input(struct mbuf *m, ...)
PFSYNC_FLAG_STALE);
continue;
}
- pfsync_alloc_scrub_memory(&up->dst, &st->dst);
pf_state_peer_ntoh(&up->src, &st->src);
pf_state_peer_ntoh(&up->dst, &st->dst);
st->expire = ntohl(up->expire) + time_second;
@@ -689,6 +853,9 @@ pfsync_input(struct mbuf *m, ...)
}
if ((update_requested || stale) && sc->sc_mbuf)
pfsync_sendout(sc);
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
break;
}
@@ -700,6 +867,9 @@ pfsync_input(struct mbuf *m, ...)
}
s = splsoftnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
for (i = 0, dp = (struct pfsync_state_del *)(mp->m_data + offp);
i < count; i++, dp++) {
bcopy(dp->id, &key.id, sizeof(key.id));
@@ -710,9 +880,13 @@ pfsync_input(struct mbuf *m, ...)
pfsyncstats.pfsyncs_badstate++;
continue;
}
+ st->timeout = PFTM_PURGE;
st->sync_flags |= PFSTATE_FROMSYNC;
- pf_unlink_state(st);
+ pf_purge_expired_state(st);
}
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
break;
case PFSYNC_ACT_INS_F:
@@ -727,6 +901,9 @@ pfsync_input(struct mbuf *m, ...)
}
s = splsoftnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
if (sc->sc_mbuf != NULL)
pfsync_sendout(sc);
for (i = 0,
@@ -737,15 +914,17 @@ pfsync_input(struct mbuf *m, ...)
if (key.id == 0 && key.creatorid == 0) {
sc->sc_ureq_received = time_uptime;
- if (sc->sc_bulk_send_next == NULL)
- sc->sc_bulk_send_next =
- TAILQ_FIRST(&state_list);
- sc->sc_bulk_terminator = sc->sc_bulk_send_next;
if (pf_status.debug >= PF_DEBUG_MISC)
printf("pfsync: received "
"bulk update request\n");
pfsync_send_bus(sc, PFSYNC_BUS_START);
+#ifdef __FreeBSD__
+ callout_reset(&sc->sc_bulk_tmo, 1 * hz,
+ pfsync_bulk_update,
+ LIST_FIRST(&pfsync_list));
+#else
timeout_add(&sc->sc_bulk_tmo, 1 * hz);
+#endif
} else {
st = pf_find_state_byid(&key);
if (st == NULL) {
@@ -759,6 +938,9 @@ pfsync_input(struct mbuf *m, ...)
}
if (sc->sc_mbuf != NULL)
pfsync_sendout(sc);
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
break;
case PFSYNC_ACT_BUS:
@@ -774,9 +956,16 @@ pfsync_input(struct mbuf *m, ...)
bus = (struct pfsync_state_bus *)(mp->m_data + offp);
switch (bus->status) {
case PFSYNC_BUS_START:
+#ifdef __FreeBSD__
+ callout_reset(&sc->sc_bulkfail_tmo,
+ pf_pool_limits[PF_LIMIT_STATES].limit /
+ (PFSYNC_BULKPACKETS * sc->sc_maxcount),
+ pfsync_bulkfail, LIST_FIRST(&pfsync_list));
+#else
timeout_add(&sc->sc_bulkfail_tmo,
pf_pool_limits[PF_LIMIT_STATES].limit /
(PFSYNC_BULKPACKETS * sc->sc_maxcount));
+#endif
if (pf_status.debug >= PF_DEBUG_MISC)
printf("pfsync: received bulk "
"update start\n");
@@ -787,10 +976,14 @@ pfsync_input(struct mbuf *m, ...)
/* that's it, we're happy */
sc->sc_ureq_sent = 0;
sc->sc_bulk_tries = 0;
+#ifdef __FreeBSD__
+ callout_stop(&sc->sc_bulkfail_tmo);
+#else
timeout_del(&sc->sc_bulkfail_tmo);
-#if NCARP > 0
+#endif
+#if NCARP > 0 /* XXX_IMPORT */
if (!pfsync_sync_ok)
- carp_group_demote_adj(&sc->sc_if, -1);
+ carp_suppress_preempt--;
#endif
pfsync_sync_ok = 1;
if (pf_status.debug >= PF_DEBUG_MISC)
@@ -804,18 +997,6 @@ pfsync_input(struct mbuf *m, ...)
break;
}
break;
- case PFSYNC_ACT_TDB_UPD:
- if ((mp = m_pulldown(m, iplen + sizeof(*ph),
- count * sizeof(*pt), &offp)) == NULL) {
- pfsyncstats.pfsyncs_badlen++;
- return;
- }
- s = splsoftnet();
- for (i = 0, pt = (struct pfsync_tdb *)(mp->m_data + offp);
- i < count; i++, pt++)
- pfsync_update_net_tdb(pt);
- splx(s);
- break;
}
done:
@@ -835,7 +1016,9 @@ pfsyncoutput(struct ifnet *ifp, struct mbuf *m, struct sockaddr *dst,
int
pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
{
+#ifndef __FreeBSD__
struct proc *p = curproc;
+#endif
struct pfsync_softc *sc = ifp->if_softc;
struct ifreq *ifr = (struct ifreq *)data;
struct ip_moptions *imo = &sc->sc_imo;
@@ -848,10 +1031,17 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
case SIOCAIFADDR:
case SIOCSIFDSTADDR:
case SIOCSIFFLAGS:
+#ifdef __FreeBSD__
+ if (ifp->if_flags & IFF_UP)
+ ifp->if_drv_flags |= IFF_DRV_RUNNING;
+ else
+ ifp->if_drv_flags &= ~IFF_DRV_RUNNING;
+#else
if (ifp->if_flags & IFF_UP)
ifp->if_flags |= IFF_RUNNING;
else
ifp->if_flags &= ~IFF_RUNNING;
+#endif
break;
case SIOCSIFMTU:
if (ifr->ifr_mtu < PFSYNC_MINMTU)
@@ -859,12 +1049,22 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
if (ifr->ifr_mtu > MCLBYTES)
ifr->ifr_mtu = MCLBYTES;
s = splnet();
- if (ifr->ifr_mtu < ifp->if_mtu)
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
+ if (ifr->ifr_mtu < ifp->if_mtu) {
pfsync_sendout(sc);
+ }
pfsync_setmtu(sc, ifr->ifr_mtu);
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
break;
case SIOCGETPFSYNC:
+#ifdef __FreeBSD__
+ /* XXX: read unlocked */
+#endif
bzero(&pfsyncr, sizeof(pfsyncr));
if (sc->sc_sync_ifp)
strlcpy(pfsyncr.pfsyncr_syncdev,
@@ -875,19 +1075,31 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
return (error);
break;
case SIOCSETPFSYNC:
+#ifdef __FreeBSD__
+ if ((error = priv_check(curthread, PRIV_NETINET_PF)) != 0)
+#else
if ((error = suser(p, p->p_acflag)) != 0)
+#endif
return (error);
if ((error = copyin(ifr->ifr_data, &pfsyncr, sizeof(pfsyncr))))
return (error);
if (pfsyncr.pfsyncr_syncpeer.s_addr == 0)
+#ifdef __FreeBSD__
+ sc->sc_sync_peer.s_addr = htonl(INADDR_PFSYNC_GROUP);
+#else
sc->sc_sync_peer.s_addr = INADDR_PFSYNC_GROUP;
+#endif
else
sc->sc_sync_peer.s_addr =
pfsyncr.pfsyncr_syncpeer.s_addr;
if (pfsyncr.pfsyncr_maxupdates > 255)
return (EINVAL);
+#ifdef __FreeBSD__
+ callout_drain(&sc->sc_send_tmo);
+ PF_LOCK();
+#endif
sc->sc_maxupdates = pfsyncr.pfsyncr_maxupdates;
if (pfsyncr.pfsyncr_syncdev[0] == 0) {
@@ -904,21 +1116,36 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
in_delmulti(imo->imo_membership[--imo->imo_num_memberships]);
imo->imo_multicast_ifp = NULL;
}
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
break;
}
- if ((sifp = ifunit(pfsyncr.pfsyncr_syncdev)) == NULL)
+ if ((sifp = ifunit(pfsyncr.pfsyncr_syncdev)) == NULL) {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
return (EINVAL);
+ }
s = splnet();
+#ifdef __FreeBSD__
+ if (sifp->if_mtu < SCP2IFP(sc)->if_mtu ||
+#else
if (sifp->if_mtu < sc->sc_if.if_mtu ||
+#endif
(sc->sc_sync_ifp != NULL &&
sifp->if_mtu < sc->sc_sync_ifp->if_mtu) ||
sifp->if_mtu < MCLBYTES - sizeof(struct ip))
pfsync_sendout(sc);
sc->sc_sync_ifp = sifp;
+#ifdef __FreeBSD__
+ pfsync_setmtu(sc, SCP2IFP(sc)->if_mtu);
+#else
pfsync_setmtu(sc, sc->sc_if.if_mtu);
+#endif
if (imo->imo_num_memberships > 0) {
in_delmulti(imo->imo_membership[--imo->imo_num_memberships]);
@@ -926,16 +1153,27 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
}
if (sc->sc_sync_ifp &&
+#ifdef __FreeBSD__
+ sc->sc_sync_peer.s_addr == htonl(INADDR_PFSYNC_GROUP)) {
+#else
sc->sc_sync_peer.s_addr == INADDR_PFSYNC_GROUP) {
+#endif
struct in_addr addr;
if (!(sc->sc_sync_ifp->if_flags & IFF_MULTICAST)) {
sc->sc_sync_ifp = NULL;
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
return (EADDRNOTAVAIL);
}
-
+#ifdef __FreeBSD__
+ PF_UNLOCK(); /* addmulti mallocs w/ WAITOK */
+ addr.s_addr = htonl(INADDR_PFSYNC_GROUP);
+#else
addr.s_addr = INADDR_PFSYNC_GROUP;
+#endif
if ((imo->imo_membership[0] =
in_addmulti(&addr, sc->sc_sync_ifp)) == NULL) {
@@ -947,27 +1185,45 @@ pfsyncioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
imo->imo_multicast_ifp = sc->sc_sync_ifp;
imo->imo_multicast_ttl = PFSYNC_DFLTTL;
imo->imo_multicast_loop = 0;
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
}
if (sc->sc_sync_ifp ||
+#ifdef __FreeBSD__
+ sc->sc_sendaddr.s_addr != htonl(INADDR_PFSYNC_GROUP)) {
+#else
sc->sc_sendaddr.s_addr != INADDR_PFSYNC_GROUP) {
+#endif
/* Request a full state table update. */
sc->sc_ureq_sent = time_uptime;
#if NCARP > 0
if (pfsync_sync_ok)
- carp_group_demote_adj(&sc->sc_if, 1);
+ carp_suppress_preempt++;
#endif
pfsync_sync_ok = 0;
if (pf_status.debug >= PF_DEBUG_MISC)
printf("pfsync: requesting bulk update\n");
+#ifdef __FreeBSD__
+ callout_reset(&sc->sc_bulkfail_tmo, 5 * hz,
+ pfsync_bulkfail, LIST_FIRST(&pfsync_list));
+#else
timeout_add(&sc->sc_bulkfail_tmo, 5 * hz);
+#endif
error = pfsync_request_update(NULL, NULL);
if (error == ENOMEM) {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
return (ENOMEM);
}
pfsync_sendout(sc);
}
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
break;
@@ -993,8 +1249,13 @@ pfsync_setmtu(struct pfsync_softc *sc, int mtu_req)
sizeof(struct pfsync_state);
if (sc->sc_maxcount > 254)
sc->sc_maxcount = 254;
+#ifdef __FreeBSD__
+ SCP2IFP(sc)->if_mtu = sizeof(struct pfsync_header) +
+ sc->sc_maxcount * sizeof(struct pfsync_state);
+#else
sc->sc_if.if_mtu = sizeof(struct pfsync_header) +
sc->sc_maxcount * sizeof(struct pfsync_state);
+#endif
}
struct mbuf *
@@ -1004,9 +1265,16 @@ pfsync_get_mbuf(struct pfsync_softc *sc, u_int8_t action, void **sp)
struct mbuf *m;
int len;
+#ifdef __FreeBSD__
+ PF_ASSERT(MA_OWNED);
+#endif
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == NULL) {
+#ifdef __FreeBSD__
+ SCP2IFP(sc)->if_oerrors++;
+#else
sc->sc_if.if_oerrors++;
+#endif
return (NULL);
}
@@ -1031,10 +1299,6 @@ pfsync_get_mbuf(struct pfsync_softc *sc, u_int8_t action, void **sp)
len = sizeof(struct pfsync_header) +
sizeof(struct pfsync_state_bus);
break;
- case PFSYNC_ACT_TDB_UPD:
- len = (sc->sc_maxcount * sizeof(struct pfsync_tdb)) +
- sizeof(struct pfsync_header);
- break;
default:
len = (sc->sc_maxcount * sizeof(struct pfsync_state)) +
sizeof(struct pfsync_header);
@@ -1045,7 +1309,11 @@ pfsync_get_mbuf(struct pfsync_softc *sc, u_int8_t action, void **sp)
MCLGET(m, M_DONTWAIT);
if ((m->m_flags & M_EXT) == 0) {
m_free(m);
+#ifdef __FreeBSD__
+ SCP2IFP(sc)->if_oerrors++;
+#else
sc->sc_if.if_oerrors++;
+#endif
return (NULL);
}
m->m_data += (MCLBYTES - len) &~ (sizeof(long) - 1);
@@ -1059,23 +1327,26 @@ pfsync_get_mbuf(struct pfsync_softc *sc, u_int8_t action, void **sp)
h->af = 0;
h->count = 0;
h->action = action;
- if (action != PFSYNC_ACT_TDB_UPD)
- bcopy(&pf_status.pf_chksum, &h->pf_chksum,
- PF_MD5_DIGEST_LENGTH);
*sp = (void *)((char *)h + PFSYNC_HDRLEN);
- if (action == PFSYNC_ACT_TDB_UPD)
- timeout_add(&sc->sc_tdb_tmo, hz);
- else
- timeout_add(&sc->sc_tmo, hz);
+#ifdef __FreeBSD__
+ callout_reset(&sc->sc_tmo, hz, pfsync_timeout,
+ LIST_FIRST(&pfsync_list));
+#else
+ timeout_add(&sc->sc_tmo, hz);
+#endif
return (m);
}
int
pfsync_pack_state(u_int8_t action, struct pf_state *st, int flags)
{
- struct ifnet *ifp = NULL;
- struct pfsync_softc *sc = pfsyncif;
+#ifdef __FreeBSD__
+ struct ifnet *ifp = SCP2IFP(LIST_FIRST(&pfsync_list));
+#else
+ struct ifnet *ifp = &pfsyncif.sc_if;
+#endif
+ struct pfsync_softc *sc = ifp->if_softc;
struct pfsync_header *h, *h_net;
struct pfsync_state *sp = NULL;
struct pfsync_state_upd *up = NULL;
@@ -1085,16 +1356,19 @@ pfsync_pack_state(u_int8_t action, struct pf_state *st, int flags)
int s, ret = 0;
u_int8_t i = 255, newaction = 0;
- if (sc == NULL)
- return (0);
- ifp = &sc->sc_if;
-
+#ifdef __FreeBSD__
+ PF_ASSERT(MA_OWNED);
+#endif
/*
* If a packet falls in the forest and there's nobody around to
* hear, does it make a sound?
*/
if (ifp->if_bpf == NULL && sc->sc_sync_ifp == NULL &&
+#ifdef __FreeBSD__
+ sc->sc_sync_peer.s_addr == htonl(INADDR_PFSYNC_GROUP)) {
+#else
sc->sc_sync_peer.s_addr == INADDR_PFSYNC_GROUP) {
+#endif
/* Don't leave any stale pfsync packets hanging around. */
if (sc->sc_mbuf != NULL) {
m_freem(sc->sc_mbuf);
@@ -1151,6 +1425,8 @@ pfsync_pack_state(u_int8_t action, struct pf_state *st, int flags)
secs = time_second;
st->pfsync_time = time_uptime;
+ TAILQ_REMOVE(&state_updates, st, u.s.entry_updates);
+ TAILQ_INSERT_TAIL(&state_updates, st, u.s.entry_updates);
if (sp == NULL) {
/* not a "duplicate" update */
@@ -1172,10 +1448,10 @@ pfsync_pack_state(u_int8_t action, struct pf_state *st, int flags)
bcopy(&st->rt_addr, &sp->rt_addr, sizeof(sp->rt_addr));
sp->creation = htonl(secs - st->creation);
- pf_state_counter_hton(st->packets[0], sp->packets[0]);
- pf_state_counter_hton(st->packets[1], sp->packets[1]);
- pf_state_counter_hton(st->bytes[0], sp->bytes[0]);
- pf_state_counter_hton(st->bytes[1], sp->bytes[1]);
+ sp->packets[0] = htonl(st->packets[0]);
+ sp->packets[1] = htonl(st->packets[1]);
+ sp->bytes[0] = htonl(st->bytes[0]);
+ sp->bytes[1] = htonl(st->bytes[1]);
if ((r = st->rule.ptr) == NULL)
sp->rule = htonl(-1);
else
@@ -1274,16 +1550,19 @@ pfsync_pack_state(u_int8_t action, struct pf_state *st, int flags)
int
pfsync_request_update(struct pfsync_state_upd *up, struct in_addr *src)
{
- struct ifnet *ifp = NULL;
+#ifdef __FreeBSD__
+ struct ifnet *ifp = SCP2IFP(LIST_FIRST(&pfsync_list));
+#else
+ struct ifnet *ifp = &pfsyncif.sc_if;
+#endif
struct pfsync_header *h;
- struct pfsync_softc *sc = pfsyncif;
+ struct pfsync_softc *sc = ifp->if_softc;
struct pfsync_state_upd_req *rup;
int ret = 0;
- if (sc == NULL)
- return (0);
-
- ifp = &sc->sc_if;
+#ifdef __FreeBSD__
+ PF_ASSERT(MA_OWNED);
+#endif
if (sc->sc_mbuf == NULL) {
if ((sc->sc_mbuf = pfsync_get_mbuf(sc, PFSYNC_ACT_UREQ,
(void *)&sc->sc_statep.s)) == NULL)
@@ -1320,16 +1599,19 @@ pfsync_request_update(struct pfsync_state_upd *up, struct in_addr *src)
int
pfsync_clear_states(u_int32_t creatorid, char *ifname)
{
- struct ifnet *ifp = NULL;
- struct pfsync_softc *sc = pfsyncif;
+#ifdef __FreeBSD__
+ struct ifnet *ifp = SCP2IFP(LIST_FIRST(&pfsync_list));
+#else
+ struct ifnet *ifp = &pfsyncif.sc_if;
+#endif
+ struct pfsync_softc *sc = ifp->if_softc;
struct pfsync_state_clr *cp;
int s, ret;
- if (sc == NULL)
- return (0);
-
- ifp = &sc->sc_if;
s = splnet();
+#ifdef __FreeBSD__
+ PF_ASSERT(MA_OWNED);
+#endif
if (sc->sc_mbuf != NULL)
pfsync_sendout(sc);
if ((sc->sc_mbuf = pfsync_get_mbuf(sc, PFSYNC_ACT_CLR,
@@ -1355,18 +1637,13 @@ pfsync_timeout(void *v)
int s;
s = splnet();
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
pfsync_sendout(sc);
- splx(s);
-}
-
-void
-pfsync_tdb_timeout(void *v)
-{
- struct pfsync_softc *sc = v;
- int s;
-
- s = splnet();
- pfsync_tdb_sendout(sc);
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
splx(s);
}
@@ -1376,6 +1653,9 @@ pfsync_send_bus(struct pfsync_softc *sc, u_int8_t status)
{
struct pfsync_state_bus *bus;
+#ifdef __FreeBSD__
+ PF_ASSERT(MA_OWNED);
+#endif
if (sc->sc_mbuf != NULL)
pfsync_sendout(sc);
@@ -1398,6 +1678,9 @@ pfsync_bulk_update(void *v)
int s, i = 0;
struct pf_state *state;
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
s = splnet();
if (sc->sc_mbuf != NULL)
pfsync_sendout(sc);
@@ -1406,43 +1689,44 @@ pfsync_bulk_update(void *v)
* Grab at most PFSYNC_BULKPACKETS worth of states which have not
* been sent since the latest request was made.
*/
- state = sc->sc_bulk_send_next;
- if (state)
- do {
- /* send state update if syncable and not already sent */
- if (!state->sync_flags
- && state->timeout < PFTM_MAX
- && state->pfsync_time <= sc->sc_ureq_received) {
+ while ((state = TAILQ_FIRST(&state_updates)) != NULL &&
+ ++i < (sc->sc_maxcount * PFSYNC_BULKPACKETS)) {
+ if (state->pfsync_time > sc->sc_ureq_received) {
+ /* we're done */
+ pfsync_send_bus(sc, PFSYNC_BUS_END);
+ sc->sc_ureq_received = 0;
+#ifdef __FreeBSD__
+ callout_stop(&sc->sc_bulk_tmo);
+#else
+ timeout_del(&sc->sc_bulk_tmo);
+#endif
+ if (pf_status.debug >= PF_DEBUG_MISC)
+ printf("pfsync: bulk update complete\n");
+ break;
+ } else {
+ /* send an update and move to end of list */
+ if (!state->sync_flags)
pfsync_pack_state(PFSYNC_ACT_UPD, state, 0);
- i++;
- }
-
- /* figure next state to send */
- state = TAILQ_NEXT(state, u.s.entry_list);
-
- /* wrap to start of list if we hit the end */
- if (!state)
- state = TAILQ_FIRST(&state_list);
- } while (i < sc->sc_maxcount * PFSYNC_BULKPACKETS &&
- state != sc->sc_bulk_terminator);
-
- if (!state || state == sc->sc_bulk_terminator) {
- /* we're done */
- pfsync_send_bus(sc, PFSYNC_BUS_END);
- sc->sc_ureq_received = 0;
- sc->sc_bulk_send_next = NULL;
- sc->sc_bulk_terminator = NULL;
- timeout_del(&sc->sc_bulk_tmo);
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync: bulk update complete\n");
- } else {
- /* look again for more in a bit */
- timeout_add(&sc->sc_bulk_tmo, 1);
- sc->sc_bulk_send_next = state;
+ state->pfsync_time = time_uptime;
+ TAILQ_REMOVE(&state_updates, state, u.s.entry_updates);
+ TAILQ_INSERT_TAIL(&state_updates, state,
+ u.s.entry_updates);
+
+ /* look again for more in a bit */
+#ifdef __FreeBSD__
+ callout_reset(&sc->sc_bulk_tmo, 1, pfsync_timeout,
+ LIST_FIRST(&pfsync_list));
+#else
+ timeout_add(&sc->sc_bulk_tmo, 1);
+#endif
+ }
}
if (sc->sc_mbuf != NULL)
pfsync_sendout(sc);
splx(s);
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
}
void
@@ -1451,9 +1735,17 @@ pfsync_bulkfail(void *v)
struct pfsync_softc *sc = v;
int s, error;
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
if (sc->sc_bulk_tries++ < PFSYNC_MAX_BULKTRIES) {
/* Try again in a bit */
+#ifdef __FreeBSD__
+ callout_reset(&sc->sc_bulkfail_tmo, 5 * hz, pfsync_bulkfail,
+ LIST_FIRST(&pfsync_list));
+#else
timeout_add(&sc->sc_bulkfail_tmo, 5 * hz);
+#endif
s = splnet();
error = pfsync_request_update(NULL, NULL);
if (error == ENOMEM) {
@@ -1469,26 +1761,43 @@ pfsync_bulkfail(void *v)
sc->sc_bulk_tries = 0;
#if NCARP > 0
if (!pfsync_sync_ok)
- carp_group_demote_adj(&sc->sc_if, -1);
+ carp_suppress_preempt--;
#endif
pfsync_sync_ok = 1;
if (pf_status.debug >= PF_DEBUG_MISC)
printf("pfsync: failed to receive "
"bulk update status\n");
+#ifdef __FreeBSD__
+ callout_stop(&sc->sc_bulkfail_tmo);
+#else
timeout_del(&sc->sc_bulkfail_tmo);
+#endif
}
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
}
/* This must be called in splnet() */
int
-pfsync_sendout(struct pfsync_softc *sc)
+pfsync_sendout(sc)
+ struct pfsync_softc *sc;
{
#if NBPFILTER > 0
- struct ifnet *ifp = &sc->sc_if;
+# ifdef __FreeBSD__
+ struct ifnet *ifp = SCP2IFP(sc);
+# else
+ struct ifnet *ifp = &sc->if_sc;
+# endif
#endif
struct mbuf *m;
+#ifdef __FreeBSD__
+ PF_ASSERT(MA_OWNED);
+ callout_stop(&sc->sc_tmo);
+#else
timeout_del(&sc->sc_tmo);
+#endif
if (sc->sc_mbuf == NULL)
return (0);
@@ -1496,9 +1805,16 @@ pfsync_sendout(struct pfsync_softc *sc)
sc->sc_mbuf = NULL;
sc->sc_statep.s = NULL;
+#ifdef __FreeBSD__
+ KASSERT(m != NULL, ("pfsync_sendout: null mbuf"));
+#endif
#if NBPFILTER > 0
+#ifdef __FreeBSD__
+ BPF_MTAP(ifp, m);
+#else
if (ifp->if_bpf)
- bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
+ bpf_mtap(ifp->if_bpf, m);
+#endif
#endif
if (sc->sc_mbuf_net) {
@@ -1508,41 +1824,15 @@ pfsync_sendout(struct pfsync_softc *sc)
sc->sc_statep_net.s = NULL;
}
- return pfsync_sendout_mbuf(sc, m);
-}
-
-int
-pfsync_tdb_sendout(struct pfsync_softc *sc)
-{
-#if NBPFILTER > 0
- struct ifnet *ifp = &sc->sc_if;
-#endif
- struct mbuf *m;
-
- timeout_del(&sc->sc_tdb_tmo);
-
- if (sc->sc_mbuf_tdb == NULL)
- return (0);
- m = sc->sc_mbuf_tdb;
- sc->sc_mbuf_tdb = NULL;
- sc->sc_statep_tdb.t = NULL;
-
-#if NBPFILTER > 0
- if (ifp->if_bpf)
- bpf_mtap(ifp->if_bpf, m, BPF_DIRECTION_OUT);
+#ifdef __FreeBSD__
+ if (sc->sc_sync_ifp ||
+ sc->sc_sync_peer.s_addr != htonl(INADDR_PFSYNC_GROUP)) {
+#else
+ if (sc->sc_sync_ifp ||sc->sc_sync_peer.s_addr != INADDR_PFSYNC_GROUP) {
#endif
+ struct ip *ip;
+ struct sockaddr sa;
- return pfsync_sendout_mbuf(sc, m);
-}
-
-int
-pfsync_sendout_mbuf(struct pfsync_softc *sc, struct mbuf *m)
-{
- struct sockaddr sa;
- struct ip *ip;
-
- if (sc->sc_sync_ifp ||
- sc->sc_sync_peer.s_addr != INADDR_PFSYNC_GROUP) {
M_PREPEND(m, sizeof(struct ip), M_DONTWAIT);
if (m == NULL) {
pfsyncstats.pfsyncs_onomem++;
@@ -1552,9 +1842,17 @@ pfsync_sendout_mbuf(struct pfsync_softc *sc, struct mbuf *m)
ip->ip_v = IPVERSION;
ip->ip_hl = sizeof(*ip) >> 2;
ip->ip_tos = IPTOS_LOWDELAY;
+#ifdef __FreeBSD__
+ ip->ip_len = m->m_pkthdr.len;
+#else
ip->ip_len = htons(m->m_pkthdr.len);
+#endif
ip->ip_id = htons(ip_randomid());
+#ifdef __FreeBSD__
+ ip->ip_off = IP_DF;
+#else
ip->ip_off = htons(IP_DF);
+#endif
ip->ip_ttl = PFSYNC_DFLTTL;
ip->ip_p = IPPROTO_PFSYNC;
ip->ip_sum = 0;
@@ -1562,168 +1860,118 @@ pfsync_sendout_mbuf(struct pfsync_softc *sc, struct mbuf *m)
bzero(&sa, sizeof(sa));
ip->ip_src.s_addr = INADDR_ANY;
+#ifdef __FreeBSD__
+ if (sc->sc_sendaddr.s_addr == htonl(INADDR_PFSYNC_GROUP))
+#else
if (sc->sc_sendaddr.s_addr == INADDR_PFSYNC_GROUP)
+#endif
m->m_flags |= M_MCAST;
ip->ip_dst = sc->sc_sendaddr;
sc->sc_sendaddr.s_addr = sc->sc_sync_peer.s_addr;
pfsyncstats.pfsyncs_opackets++;
-
+#ifdef __FreeBSD__
+ if (!IF_HANDOFF(&sc->sc_ifq, m, NULL))
+ pfsyncstats.pfsyncs_oerrors++;
+ callout_reset(&sc->sc_send_tmo, 1, pfsync_senddef, sc);
+#else
if (ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_imo, NULL))
pfsyncstats.pfsyncs_oerrors++;
+#endif
} else
m_freem(m);
return (0);
}
-/* Update an in-kernel tdb. Silently fail if no tdb is found. */
-void
-pfsync_update_net_tdb(struct pfsync_tdb *pt)
+#ifdef __FreeBSD__
+static void
+pfsync_ifdetach(void *arg, struct ifnet *ifp)
{
- struct tdb *tdb;
- int s;
-
- /* check for invalid values */
- if (ntohl(pt->spi) <= SPI_RESERVED_MAX ||
- (pt->dst.sa.sa_family != AF_INET &&
- pt->dst.sa.sa_family != AF_INET6))
- goto bad;
-
- s = spltdb();
- tdb = gettdb(pt->spi, &pt->dst, pt->sproto);
- if (tdb) {
- pt->rpl = ntohl(pt->rpl);
- pt->cur_bytes = betoh64(pt->cur_bytes);
-
- /* Neither replay nor byte counter should ever decrease. */
- if (pt->rpl < tdb->tdb_rpl ||
- pt->cur_bytes < tdb->tdb_cur_bytes) {
- splx(s);
- goto bad;
- }
+ struct pfsync_softc *sc = (struct pfsync_softc *)arg;
+ struct ip_moptions *imo;
- tdb->tdb_rpl = pt->rpl;
- tdb->tdb_cur_bytes = pt->cur_bytes;
+ if (sc == NULL || sc->sc_sync_ifp != ifp)
+ return; /* not for us; unlocked read */
+
+ PF_LOCK();
+
+ /* Deal with a member interface going away from under us. */
+ sc->sc_sync_ifp = NULL;
+ if (sc->sc_mbuf_net != NULL) {
+ m_freem(sc->sc_mbuf_net);
+ sc->sc_mbuf_net = NULL;
+ sc->sc_statep_net.s = NULL;
}
- splx(s);
- return;
-
- bad:
- if (pf_status.debug >= PF_DEBUG_MISC)
- printf("pfsync_insert: PFSYNC_ACT_TDB_UPD: "
- "invalid value\n");
- pfsyncstats.pfsyncs_badstate++;
- return;
+ imo = &sc->sc_imo;
+ if (imo->imo_num_memberships > 0) {
+ KASSERT(imo->imo_num_memberships == 1,
+ ("%s: imo_num_memberships != 1", __func__));
+ /*
+ * Our event handler is always called after protocol
+ * domains have been detached from the underlying ifnet.
+ * Do not call in_delmulti(); we held a single reference
+ * which the protocol domain has purged in in_purgemaddrs().
+ */
+ imo->imo_membership[--imo->imo_num_memberships] = NULL;
+ imo->imo_multicast_ifp = NULL;
+ }
+
+ PF_UNLOCK();
}
-/* One of our local tdbs have been updated, need to sync rpl with others */
-int
-pfsync_update_tdb(struct tdb *tdb, int output)
+static void
+pfsync_senddef(void *arg)
{
- struct ifnet *ifp = NULL;
- struct pfsync_softc *sc = pfsyncif;
- struct pfsync_header *h;
- struct pfsync_tdb *pt = NULL;
- int s, i, ret;
-
- if (sc == NULL)
- return (0);
+ struct pfsync_softc *sc = (struct pfsync_softc *)arg;
+ struct mbuf *m;
- ifp = &sc->sc_if;
- if (ifp->if_bpf == NULL && sc->sc_sync_ifp == NULL &&
- sc->sc_sync_peer.s_addr == INADDR_PFSYNC_GROUP) {
- /* Don't leave any stale pfsync packets hanging around. */
- if (sc->sc_mbuf_tdb != NULL) {
- m_freem(sc->sc_mbuf_tdb);
- sc->sc_mbuf_tdb = NULL;
- sc->sc_statep_tdb.t = NULL;
+ for(;;) {
+ IF_DEQUEUE(&sc->sc_ifq, m);
+ if (m == NULL)
+ break;
+ /* Deal with a member interface going away from under us. */
+ if (sc->sc_sync_ifp == NULL) {
+ pfsyncstats.pfsyncs_oerrors++;
+ m_freem(m);
+ continue;
}
- return (0);
+ if (ip_output(m, NULL, NULL, IP_RAWOUTPUT, &sc->sc_imo, NULL))
+ pfsyncstats.pfsyncs_oerrors++;
}
+}
- s = splnet();
- if (sc->sc_mbuf_tdb == NULL) {
- if ((sc->sc_mbuf_tdb = pfsync_get_mbuf(sc, PFSYNC_ACT_TDB_UPD,
- (void *)&sc->sc_statep_tdb.t)) == NULL) {
- splx(s);
- return (ENOMEM);
- }
- h = mtod(sc->sc_mbuf_tdb, struct pfsync_header *);
- } else {
- h = mtod(sc->sc_mbuf_tdb, struct pfsync_header *);
- if (h->action != PFSYNC_ACT_TDB_UPD) {
- /*
- * XXX will never happen as long as there's
- * only one "TDB action".
- */
- pfsync_tdb_sendout(sc);
- sc->sc_mbuf_tdb = pfsync_get_mbuf(sc,
- PFSYNC_ACT_TDB_UPD, (void *)&sc->sc_statep_tdb.t);
- if (sc->sc_mbuf_tdb == NULL) {
- splx(s);
- return (ENOMEM);
- }
- h = mtod(sc->sc_mbuf_tdb, struct pfsync_header *);
- } else if (sc->sc_maxupdates) {
- /*
- * If it's an update, look in the packet to see if
- * we already have an update for the state.
- */
- struct pfsync_tdb *u =
- (void *)((char *)h + PFSYNC_HDRLEN);
-
- for (i = 0; !pt && i < h->count; i++) {
- if (tdb->tdb_spi == u->spi &&
- tdb->tdb_sproto == u->sproto &&
- !bcmp(&tdb->tdb_dst, &u->dst,
- SA_LEN(&u->dst.sa))) {
- pt = u;
- pt->updates++;
- }
- u++;
- }
- }
- }
+static int
+pfsync_modevent(module_t mod, int type, void *data)
+{
+ int error = 0;
- if (pt == NULL) {
- /* not a "duplicate" update */
- pt = sc->sc_statep_tdb.t++;
- sc->sc_mbuf_tdb->m_pkthdr.len =
- sc->sc_mbuf_tdb->m_len += sizeof(struct pfsync_tdb);
- h->count++;
- bzero(pt, sizeof(*pt));
+ switch (type) {
+ case MOD_LOAD:
+ LIST_INIT(&pfsync_list);
+ if_clone_attach(&pfsync_cloner);
+ break;
+
+ case MOD_UNLOAD:
+ if_clone_detach(&pfsync_cloner);
+ break;
- pt->spi = tdb->tdb_spi;
- memcpy(&pt->dst, &tdb->tdb_dst, sizeof pt->dst);
- pt->sproto = tdb->tdb_sproto;
+ default:
+ error = EINVAL;
+ break;
}
- /*
- * When a failover happens, the master's rpl is probably above
- * what we see here (we may be up to a second late), so
- * increase it a bit for outbound tdbs to manage most such
- * situations.
- *
- * For now, just add an offset that is likely to be larger
- * than the number of packets we can see in one second. The RFC
- * just says the next packet must have a higher seq value.
- *
- * XXX What is a good algorithm for this? We could use
- * a rate-determined increase, but to know it, we would have
- * to extend struct tdb.
- * XXX pt->rpl can wrap over MAXINT, but if so the real tdb
- * will soon be replaced anyway. For now, just don't handle
- * this edge case.
- */
-#define RPL_INCR 16384
- pt->rpl = htonl(tdb->tdb_rpl + (output ? RPL_INCR : 0));
- pt->cur_bytes = htobe64(tdb->tdb_cur_bytes);
+ return error;
+}
- if (h->count == sc->sc_maxcount ||
- (sc->sc_maxupdates && (pt->updates >= sc->sc_maxupdates)))
- ret = pfsync_tdb_sendout(sc);
+static moduledata_t pfsync_mod = {
+ "pfsync",
+ pfsync_modevent,
+ 0
+};
- splx(s);
- return (ret);
-}
+#define PFSYNC_MODVER 1
+
+DECLARE_MODULE(pfsync, pfsync_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_ANY);
+MODULE_VERSION(pfsync, PFSYNC_MODVER);
+#endif /* __FreeBSD__ */
diff --git a/sys/contrib/pf/net/if_pfsync.h b/sys/contrib/pf/net/if_pfsync.h
index 5ed465e..77ef3a5 100644
--- a/sys/contrib/pf/net/if_pfsync.h
+++ b/sys/contrib/pf/net/if_pfsync.h
@@ -1,4 +1,5 @@
-/* $OpenBSD: if_pfsync.h,v 1.30 2006/10/31 14:49:01 henning Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: if_pfsync.h,v 1.19 2005/01/20 17:47:38 mcbride Exp $ */
/*
* Copyright (c) 2001 Michael Shalayeff
@@ -35,7 +36,6 @@
struct pfsync_state_scrub {
u_int16_t pfss_flags;
u_int8_t pfss_ttl; /* stashed TTL */
-#define PFSYNC_SCRUB_FLAG_VALID 0x01
u_int8_t scrub_flag;
u_int32_t pfss_ts_mod; /* timestamp modulation */
} __packed;
@@ -55,7 +55,8 @@ struct pfsync_state_peer {
u_int16_t mss; /* Maximum segment size option */
u_int8_t state; /* active state level */
u_int8_t wscale; /* window scaling factor */
- u_int8_t pad[6];
+ u_int8_t scrub_flag;
+ u_int8_t pad[5];
} __packed;
struct pfsync_state {
@@ -72,8 +73,8 @@ struct pfsync_state {
u_int32_t nat_rule;
u_int32_t creation;
u_int32_t expire;
- u_int32_t packets[2][2];
- u_int32_t bytes[2][2];
+ u_int32_t packets[2];
+ u_int32_t bytes[2];
u_int32_t creatorid;
sa_family_t af;
u_int8_t proto;
@@ -88,16 +89,6 @@ struct pfsync_state {
#define PFSYNC_FLAG_COMPRESS 0x01
#define PFSYNC_FLAG_STALE 0x02
-struct pfsync_tdb {
- u_int32_t spi;
- union sockaddr_union dst;
- u_int32_t rpl;
- u_int64_t cur_bytes;
- u_int8_t sproto;
- u_int8_t updates;
- u_int8_t pad[2];
-} __packed;
-
struct pfsync_state_upd {
u_int32_t id[2];
struct pfsync_state_peer src;
@@ -153,45 +144,52 @@ union sc_statep {
struct pfsync_state_upd_req *r;
};
-union sc_tdb_statep {
- struct pfsync_tdb *t;
-};
-
extern int pfsync_sync_ok;
struct pfsync_softc {
+#ifdef __FreeBSD__
+ struct ifnet *sc_ifp;
+#else
struct ifnet sc_if;
+#endif
struct ifnet *sc_sync_ifp;
struct ip_moptions sc_imo;
+#ifdef __FreeBSD__
+ struct callout sc_tmo;
+ struct callout sc_bulk_tmo;
+ struct callout sc_bulkfail_tmo;
+#else
struct timeout sc_tmo;
- struct timeout sc_tdb_tmo;
struct timeout sc_bulk_tmo;
struct timeout sc_bulkfail_tmo;
+#endif
struct in_addr sc_sync_peer;
struct in_addr sc_sendaddr;
struct mbuf *sc_mbuf; /* current cumulative mbuf */
struct mbuf *sc_mbuf_net; /* current cumulative mbuf */
- struct mbuf *sc_mbuf_tdb; /* dito for TDB updates */
+#ifdef __FreeBSD__
+ struct ifqueue sc_ifq;
+ struct callout sc_send_tmo;
+#endif
union sc_statep sc_statep;
union sc_statep sc_statep_net;
- union sc_tdb_statep sc_statep_tdb;
u_int32_t sc_ureq_received;
u_int32_t sc_ureq_sent;
- struct pf_state *sc_bulk_send_next;
- struct pf_state *sc_bulk_terminator;
int sc_bulk_tries;
int sc_maxcount; /* number of states in mtu */
int sc_maxupdates; /* number of updates/state */
+#ifdef __FreeBSD__
+ LIST_ENTRY(pfsync_softc) sc_next;
+ eventhandler_tag sc_detachtag;
+#endif
};
-
-extern struct pfsync_softc *pfsyncif;
#endif
struct pfsync_header {
u_int8_t version;
-#define PFSYNC_VERSION 3
+#define PFSYNC_VERSION 2
u_int8_t af;
u_int8_t action;
#define PFSYNC_ACT_CLR 0 /* clear all states */
@@ -204,10 +202,8 @@ struct pfsync_header {
#define PFSYNC_ACT_DEL_F 7 /* delete fragments */
#define PFSYNC_ACT_UREQ 8 /* request "uncompressed" state */
#define PFSYNC_ACT_BUS 9 /* Bulk Update Status */
-#define PFSYNC_ACT_TDB_UPD 10 /* TDB replay counter update */
-#define PFSYNC_ACT_MAX 11
+#define PFSYNC_ACT_MAX 10
u_int8_t count;
- u_int8_t pf_chksum[PF_MD5_DIGEST_LENGTH];
} __packed;
#define PFSYNC_BULKPACKETS 1 /* # of packets per timeout */
@@ -216,7 +212,7 @@ struct pfsync_header {
#define PFSYNC_ACTIONS \
"CLR ST", "INS ST", "UPD ST", "DEL ST", \
"UPD ST COMP", "DEL ST COMP", "INS FR", "DEL FR", \
- "UPD REQ", "BLK UPD STAT", "TDB UPD"
+ "UPD REQ", "BLK UPD STAT"
#define PFSYNC_DFLTTL 255
@@ -250,6 +246,10 @@ struct pfsyncreq {
int pfsyncr_authlevel;
};
+#ifdef __FreeBSD__
+#define SIOCSETPFSYNC _IOW('i', 247, struct ifreq)
+#define SIOCGETPFSYNC _IOWR('i', 248, struct ifreq)
+#endif
#define pf_state_peer_hton(s,d) do { \
(d)->seqlo = htonl((s)->seqlo); \
@@ -259,13 +259,6 @@ struct pfsyncreq {
(d)->mss = htons((s)->mss); \
(d)->state = (s)->state; \
(d)->wscale = (s)->wscale; \
- if ((s)->scrub) { \
- (d)->scrub.pfss_flags = \
- htons((s)->scrub->pfss_flags & PFSS_TIMESTAMP); \
- (d)->scrub.pfss_ttl = (s)->scrub->pfss_ttl; \
- (d)->scrub.pfss_ts_mod = htonl((s)->scrub->pfss_ts_mod);\
- (d)->scrub.scrub_flag = PFSYNC_SCRUB_FLAG_VALID; \
- } \
} while (0)
#define pf_state_peer_ntoh(s,d) do { \
@@ -276,13 +269,6 @@ struct pfsyncreq {
(d)->mss = ntohs((s)->mss); \
(d)->state = (s)->state; \
(d)->wscale = (s)->wscale; \
- if ((s)->scrub.scrub_flag == PFSYNC_SCRUB_FLAG_VALID && \
- (d)->scrub != NULL) { \
- (d)->scrub->pfss_flags = \
- ntohs((s)->scrub.pfss_flags) & PFSS_TIMESTAMP; \
- (d)->scrub->pfss_ttl = (s)->scrub.pfss_ttl; \
- (d)->scrub->pfss_ts_mod = ntohl((s)->scrub.pfss_ts_mod);\
- } \
} while (0)
#define pf_state_host_hton(s,d) do { \
@@ -295,19 +281,12 @@ struct pfsyncreq {
(d)->port = (s)->port; \
} while (0)
-#define pf_state_counter_hton(s,d) do { \
- d[0] = htonl((s>>32)&0xffffffff); \
- d[1] = htonl(s&0xffffffff); \
-} while (0)
-
-#define pf_state_counter_ntoh(s,d) do { \
- d = ntohl(s[0]); \
- d = d<<32; \
- d += ntohl(s[1]); \
-} while (0)
-
#ifdef _KERNEL
+#ifdef __FreeBSD__
+void pfsync_input(struct mbuf *, __unused int);
+#else
void pfsync_input(struct mbuf *, ...);
+#endif
int pfsync_clear_states(u_int32_t, char *);
int pfsync_pack_state(u_int8_t, struct pf_state *, int);
#define pfsync_insert_state(st) do { \
@@ -315,8 +294,7 @@ int pfsync_pack_state(u_int8_t, struct pf_state *, int);
(st->proto == IPPROTO_PFSYNC)) \
st->sync_flags |= PFSTATE_NOSYNC; \
else if (!st->sync_flags) \
- pfsync_pack_state(PFSYNC_ACT_INS, (st), \
- PFSYNC_FLAG_COMPRESS); \
+ pfsync_pack_state(PFSYNC_ACT_INS, (st), 1); \
st->sync_flags &= ~PFSTATE_FROMSYNC; \
} while (0)
#define pfsync_update_state(st) do { \
@@ -329,8 +307,8 @@ int pfsync_pack_state(u_int8_t, struct pf_state *, int);
if (!st->sync_flags) \
pfsync_pack_state(PFSYNC_ACT_DEL, (st), \
PFSYNC_FLAG_COMPRESS); \
+ st->sync_flags &= ~PFSTATE_FROMSYNC; \
} while (0)
-int pfsync_update_tdb(struct tdb *, int);
#endif
#endif /* _NET_IF_PFSYNC_H_ */
diff --git a/sys/contrib/pf/net/pf.c b/sys/contrib/pf/net/pf.c
index 793dc34..282cbb5 100644
--- a/sys/contrib/pf/net/pf.c
+++ b/sys/contrib/pf/net/pf.c
@@ -1,4 +1,5 @@
-/* $OpenBSD: pf.c,v 1.527 2007/02/22 15:23:23 pyr Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: pf.c,v 1.483 2005/03/15 17:38:43 dhartmei Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -35,9 +36,39 @@
*
*/
+#ifdef __FreeBSD__
+#include "opt_inet.h"
+#include "opt_inet6.h"
+#endif
+
+#ifdef __FreeBSD__
+#include "opt_mac.h"
+#include "opt_bpf.h"
+#include "opt_pf.h"
+
+#ifdef DEV_BPF
+#define NBPFILTER DEV_BPF
+#else
+#define NBPFILTER 0
+#endif
+
+#ifdef DEV_PFLOG
+#define NPFLOG DEV_PFLOG
+#else
+#define NPFLOG 0
+#endif
+
+#ifdef DEV_PFSYNC
+#define NPFSYNC DEV_PFSYNC
+#else
+#define NPFSYNC 0
+#endif
+
+#else
#include "bpfilter.h"
#include "pflog.h"
#include "pfsync.h"
+#endif
#include <sys/param.h>
#include <sys/systm.h>
@@ -47,15 +78,17 @@
#include <sys/socketvar.h>
#include <sys/kernel.h>
#include <sys/time.h>
+#ifdef __FreeBSD__
+#include <sys/sysctl.h>
+#include <sys/endian.h>
+#else
#include <sys/pool.h>
-#include <sys/proc.h>
-#include <sys/rwlock.h>
+#endif
#include <net/if.h>
#include <net/if_types.h>
#include <net/bpf.h>
#include <net/route.h>
-#include <net/radix_mpath.h>
#include <netinet/in.h>
#include <netinet/in_var.h>
@@ -73,7 +106,9 @@
#include <netinet/icmp_var.h>
#include <netinet/if_ether.h>
+#ifndef __FreeBSD__
#include <dev/rndvar.h>
+#endif
#include <net/pfvar.h>
#include <net/if_pflog.h>
@@ -86,8 +121,20 @@
#include <netinet/in_pcb.h>
#include <netinet/icmp6.h>
#include <netinet6/nd6.h>
+#ifdef __FreeBSD__
+#include <netinet6/ip6_var.h>
+#include <netinet6/in6_pcb.h>
+#endif
#endif /* INET6 */
+#ifdef __FreeBSD__
+#include <machine/in_cksum.h>
+#include <sys/limits.h>
+#include <sys/ucred.h>
+#include <security/mac/mac_framework.h>
+
+extern int ip_optcopy(struct ip *, struct ip *);
+#endif
#define DPFPRINTF(n, x) if (pf_status.debug >= (n)) printf x
@@ -95,6 +142,8 @@
* Global variables
*/
+struct pf_anchor_global pf_anchors;
+struct pf_ruleset pf_main_ruleset;
struct pf_altqqueue pf_altqs[2];
struct pf_palist pf_pabuf;
struct pf_altqqueue *pf_altqs_active;
@@ -106,6 +155,12 @@ u_int32_t ticket_altqs_inactive;
int altqs_inactive_open;
u_int32_t ticket_pabuf;
+#ifdef __FreeBSD__
+struct callout pf_expire_to; /* expire timeout */
+#else
+struct timeout pf_expire_to; /* expire timeout */
+#endif
+
struct pf_anchor_stackframe {
struct pf_ruleset *rs;
struct pf_rule *r;
@@ -113,8 +168,13 @@ struct pf_anchor_stackframe {
struct pf_anchor *child;
} pf_anchor_stack[64];
+#ifdef __FreeBSD__
+uma_zone_t pf_src_tree_pl, pf_rule_pl;
+uma_zone_t pf_state_pl, pf_altq_pl, pf_pooladdr_pl;
+#else
struct pool pf_src_tree_pl, pf_rule_pl;
struct pool pf_state_pl, pf_altq_pl, pf_pooladdr_pl;
+#endif
void pf_print_host(struct pf_addr *, u_int16_t, u_int8_t);
@@ -126,8 +186,6 @@ int pf_check_threshold(struct pf_threshold *);
void pf_change_ap(struct pf_addr *, u_int16_t *,
u_int16_t *, u_int16_t *, struct pf_addr *,
u_int16_t, u_int8_t, sa_family_t);
-int pf_modulate_sack(struct mbuf *, int, struct pf_pdesc *,
- struct tcphdr *, struct pf_state_peer *);
#ifdef INET6
void pf_change_a6(struct pf_addr *, u_int16_t *,
struct pf_addr *, u_int8_t);
@@ -136,11 +194,16 @@ void pf_change_icmp(struct pf_addr *, u_int16_t *,
struct pf_addr *, struct pf_addr *, u_int16_t,
u_int16_t *, u_int16_t *, u_int16_t *,
u_int16_t *, u_int8_t, sa_family_t);
+#ifdef __FreeBSD__
+void pf_send_tcp(struct mbuf *,
+ const struct pf_rule *, sa_family_t,
+#else
void pf_send_tcp(const struct pf_rule *, sa_family_t,
+#endif
const struct pf_addr *, const struct pf_addr *,
u_int16_t, u_int16_t, u_int32_t, u_int32_t,
u_int8_t, u_int16_t, u_int16_t, u_int8_t, int,
- u_int16_t, struct ether_header *, struct ifnet *);
+ struct ether_header *, struct ifnet *);
void pf_send_icmp(struct mbuf *, u_int8_t, u_int8_t,
sa_family_t, struct pf_rule *);
struct pf_rule *pf_match_translation(struct pf_pdesc *, struct mbuf *,
@@ -155,11 +218,21 @@ struct pf_rule *pf_get_translation(struct pf_pdesc *, struct mbuf *,
int pf_test_tcp(struct pf_rule **, struct pf_state **,
int, struct pfi_kif *, struct mbuf *, int,
void *, struct pf_pdesc *, struct pf_rule **,
+#ifdef __FreeBSD__
+ struct pf_ruleset **, struct ifqueue *,
+ struct inpcb *);
+#else
struct pf_ruleset **, struct ifqueue *);
+#endif
int pf_test_udp(struct pf_rule **, struct pf_state **,
int, struct pfi_kif *, struct mbuf *, int,
void *, struct pf_pdesc *, struct pf_rule **,
+#ifdef __FreeBSD__
+ struct pf_ruleset **, struct ifqueue *,
+ struct inpcb *);
+#else
struct pf_ruleset **, struct ifqueue *);
+#endif
int pf_test_icmp(struct pf_rule **, struct pf_state **,
int, struct pfi_kif *, struct mbuf *, int,
void *, struct pf_pdesc *, struct pf_rule **,
@@ -183,11 +256,9 @@ int pf_test_state_icmp(struct pf_state **, int,
void *, struct pf_pdesc *, u_short *);
int pf_test_state_other(struct pf_state **, int,
struct pfi_kif *, struct pf_pdesc *);
+struct pf_tag *pf_get_tag(struct mbuf *);
int pf_match_tag(struct mbuf *, struct pf_rule *,
- struct pf_mtag *, int *);
-int pf_step_out_of_anchor(int *, struct pf_ruleset **,
- int, struct pf_rule **, struct pf_rule **,
- int *);
+ struct pf_tag **, int *);
void pf_hash(struct pf_addr *, struct pf_addr *,
struct pf_poolhashkey *, sa_family_t);
int pf_map_addr(u_int8_t, struct pf_rule *,
@@ -198,12 +269,16 @@ int pf_get_sport(sa_family_t, u_int8_t, struct pf_rule *,
struct pf_addr *, u_int16_t*, u_int16_t, u_int16_t,
struct pf_src_node **);
void pf_route(struct mbuf **, struct pf_rule *, int,
- struct ifnet *, struct pf_state *,
- struct pf_pdesc *);
+ struct ifnet *, struct pf_state *);
void pf_route6(struct mbuf **, struct pf_rule *, int,
- struct ifnet *, struct pf_state *,
- struct pf_pdesc *);
-int pf_socket_lookup(int, struct pf_pdesc *);
+ struct ifnet *, struct pf_state *);
+#ifdef __FreeBSD__
+int pf_socket_lookup(uid_t *, gid_t *,
+ int, struct pf_pdesc *, struct inpcb *);
+#else
+int pf_socket_lookup(uid_t *, gid_t *,
+ int, struct pf_pdesc *);
+#endif
u_int8_t pf_get_wscale(struct mbuf *, int, u_int16_t,
sa_family_t);
u_int16_t pf_get_mss(struct mbuf *, int, u_int16_t,
@@ -216,21 +291,24 @@ int pf_check_proto_cksum(struct mbuf *, int, int,
u_int8_t, sa_family_t);
int pf_addr_wrap_neq(struct pf_addr_wrap *,
struct pf_addr_wrap *);
+static int pf_add_mbuf_tag(struct mbuf *, u_int);
struct pf_state *pf_find_state_recurse(struct pfi_kif *,
- struct pf_state_cmp *, u_int8_t);
+ struct pf_state *, u_int8_t);
int pf_src_connlimit(struct pf_state **);
int pf_check_congestion(struct ifqueue *);
-extern struct pool pfr_ktable_pl;
-extern struct pool pfr_kentry_pl;
+#ifdef __FreeBSD__
+int in4_cksum(struct mbuf *m, u_int8_t nxt, int off, int len);
+
+struct pf_pool_limit pf_pool_limits[PF_LIMIT_MAX];
+#else
struct pf_pool_limit pf_pool_limits[PF_LIMIT_MAX] = {
{ &pf_state_pl, PFSTATE_HIWAT },
{ &pf_src_tree_pl, PFSNODE_HIWAT },
- { &pf_frent_pl, PFFRAG_FRENT_HIWAT },
- { &pfr_ktable_pl, PFR_KTABLE_HIWAT },
- { &pfr_kentry_pl, PFR_KENTRY_HIWAT }
+ { &pf_frent_pl, PFFRAG_FRENT_HIWAT }
};
+#endif
#define STATE_LOOKUP() \
do { \
@@ -260,8 +338,9 @@ struct pf_pool_limit pf_pool_limits[PF_LIMIT_MAX] = {
(s)->lan.addr.addr32[3] != (s)->gwy.addr.addr32[3])) || \
(s)->lan.port != (s)->gwy.port
-#define BOUND_IFACE(r, k) \
- ((r)->rule_flag & PFRULE_IFBOUND) ? (k) : pfi_all
+#define BOUND_IFACE(r, k) (((r)->rule_flag & PFRULE_IFBOUND) ? (k) : \
+ ((r)->rule_flag & PFRULE_GRBOUND) ? (k)->pfik_parent : \
+ (k)->pfik_parent->pfik_parent)
#define STATE_INC_COUNTERS(s) \
do { \
@@ -281,6 +360,7 @@ struct pf_pool_limit pf_pool_limits[PF_LIMIT_MAX] = {
s->rule.ptr->states--; \
} while (0)
+#ifndef __FreeBSD__
static __inline int pf_src_compare(struct pf_src_node *, struct pf_src_node *);
static __inline int pf_state_compare_lan_ext(struct pf_state *,
struct pf_state *);
@@ -288,11 +368,22 @@ static __inline int pf_state_compare_ext_gwy(struct pf_state *,
struct pf_state *);
static __inline int pf_state_compare_id(struct pf_state *,
struct pf_state *);
+static __inline int pf_anchor_compare(struct pf_anchor *, struct pf_anchor *);
+#else
+static int pf_src_compare(struct pf_src_node *, struct pf_src_node *);
+static int pf_state_compare_lan_ext(struct pf_state *,
+ struct pf_state *);
+static int pf_state_compare_ext_gwy(struct pf_state *,
+ struct pf_state *);
+static int pf_state_compare_id(struct pf_state *,
+ struct pf_state *);
+static int pf_anchor_compare(struct pf_anchor *, struct pf_anchor *);
+#endif
struct pf_src_tree tree_src_tracking;
struct pf_state_tree_id tree_id;
-struct pf_state_queue state_list;
+struct pf_state_queue state_updates;
RB_GENERATE(pf_src_tree, pf_src_node, entry, pf_src_compare);
RB_GENERATE(pf_state_tree_lan_ext, pf_state,
@@ -301,8 +392,14 @@ RB_GENERATE(pf_state_tree_ext_gwy, pf_state,
u.s.entry_ext_gwy, pf_state_compare_ext_gwy);
RB_GENERATE(pf_state_tree_id, pf_state,
u.s.entry_id, pf_state_compare_id);
+RB_GENERATE(pf_anchor_global, pf_anchor, entry_global, pf_anchor_compare);
+RB_GENERATE(pf_anchor_node, pf_anchor, entry_node, pf_anchor_compare);
+#ifdef __FreeBSD__
+static int
+#else
static __inline int
+#endif
pf_src_compare(struct pf_src_node *a, struct pf_src_node *b)
{
int diff;
@@ -346,7 +443,11 @@ pf_src_compare(struct pf_src_node *a, struct pf_src_node *b)
return (0);
}
+#ifdef __FreeBSD__
+static int
+#else
static __inline int
+#endif
pf_state_compare_lan_ext(struct pf_state *a, struct pf_state *b)
{
int diff;
@@ -414,7 +515,11 @@ pf_state_compare_lan_ext(struct pf_state *a, struct pf_state *b)
return (0);
}
+#ifdef __FreeBSD__
+static int
+#else
static __inline int
+#endif
pf_state_compare_ext_gwy(struct pf_state *a, struct pf_state *b)
{
int diff;
@@ -482,7 +587,11 @@ pf_state_compare_ext_gwy(struct pf_state *a, struct pf_state *b)
return (0);
}
+#ifdef __FreeBSD__
+static int
+#else
static __inline int
+#endif
pf_state_compare_id(struct pf_state *a, struct pf_state *b)
{
if (a->id > b->id)
@@ -497,6 +606,18 @@ pf_state_compare_id(struct pf_state *a, struct pf_state *b)
return (0);
}
+#ifdef __FreeBSD__
+static int
+#else
+static __inline int
+#endif
+pf_anchor_compare(struct pf_anchor *a, struct pf_anchor *b)
+{
+ int c = strcmp(a->path, b->path);
+
+ return (c ? (c < 0 ? -1 : 1) : 0);
+}
+
#ifdef INET6
void
pf_addrcpy(struct pf_addr *dst, struct pf_addr *src, sa_family_t af)
@@ -518,14 +639,14 @@ pf_addrcpy(struct pf_addr *dst, struct pf_addr *src, sa_family_t af)
#endif /* INET6 */
struct pf_state *
-pf_find_state_byid(struct pf_state_cmp *key)
+pf_find_state_byid(struct pf_state *key)
{
pf_status.fcounters[FCNT_STATE_SEARCH]++;
- return (RB_FIND(pf_state_tree_id, &tree_id, (struct pf_state *)key));
+ return (RB_FIND(pf_state_tree_id, &tree_id, key));
}
struct pf_state *
-pf_find_state_recurse(struct pfi_kif *kif, struct pf_state_cmp *key, u_int8_t tree)
+pf_find_state_recurse(struct pfi_kif *kif, struct pf_state *key, u_int8_t tree)
{
struct pf_state *s;
@@ -533,20 +654,20 @@ pf_find_state_recurse(struct pfi_kif *kif, struct pf_state_cmp *key, u_int8_t tr
switch (tree) {
case PF_LAN_EXT:
- if ((s = RB_FIND(pf_state_tree_lan_ext, &kif->pfik_lan_ext,
- (struct pf_state *)key)) != NULL)
- return (s);
- if ((s = RB_FIND(pf_state_tree_lan_ext, &pfi_all->pfik_lan_ext,
- (struct pf_state *)key)) != NULL)
- return (s);
+ for (; kif != NULL; kif = kif->pfik_parent) {
+ s = RB_FIND(pf_state_tree_lan_ext,
+ &kif->pfik_lan_ext, key);
+ if (s != NULL)
+ return (s);
+ }
return (NULL);
case PF_EXT_GWY:
- if ((s = RB_FIND(pf_state_tree_ext_gwy, &kif->pfik_ext_gwy,
- (struct pf_state *)key)) != NULL)
- return (s);
- if ((s = RB_FIND(pf_state_tree_ext_gwy, &pfi_all->pfik_ext_gwy,
- (struct pf_state *)key)) != NULL)
- return (s);
+ for (; kif != NULL; kif = kif->pfik_parent) {
+ s = RB_FIND(pf_state_tree_ext_gwy,
+ &kif->pfik_ext_gwy, key);
+ if (s != NULL)
+ return (s);
+ }
return (NULL);
default:
panic("pf_find_state_recurse");
@@ -554,7 +675,7 @@ pf_find_state_recurse(struct pfi_kif *kif, struct pf_state_cmp *key, u_int8_t tr
}
struct pf_state *
-pf_find_state_all(struct pf_state_cmp *key, u_int8_t tree, int *more)
+pf_find_state_all(struct pf_state *key, u_int8_t tree, int *more)
{
struct pf_state *s, *ss = NULL;
struct pfi_kif *kif;
@@ -565,7 +686,7 @@ pf_find_state_all(struct pf_state_cmp *key, u_int8_t tree, int *more)
case PF_LAN_EXT:
TAILQ_FOREACH(kif, &pfi_statehead, pfik_w_states) {
s = RB_FIND(pf_state_tree_lan_ext,
- &kif->pfik_lan_ext, (struct pf_state *)key);
+ &kif->pfik_lan_ext, key);
if (s == NULL)
continue;
if (more == NULL)
@@ -577,7 +698,7 @@ pf_find_state_all(struct pf_state_cmp *key, u_int8_t tree, int *more)
case PF_EXT_GWY:
TAILQ_FOREACH(kif, &pfi_statehead, pfik_w_states) {
s = RB_FIND(pf_state_tree_ext_gwy,
- &kif->pfik_ext_gwy, (struct pf_state *)key);
+ &kif->pfik_ext_gwy, key);
if (s == NULL)
continue;
if (more == NULL)
@@ -628,7 +749,9 @@ pf_src_connlimit(struct pf_state **state)
int bad = 0;
(*state)->src_node->conn++;
- (*state)->src.tcp_est = 1;
+#ifdef __FreeBSD__
+ (*state)->local_flags |= PFSTATE_SRC_CONN;
+#endif
pf_add_threshold(&(*state)->src_node->conn_rate);
if ((*state)->rule.ptr->max_src_conn &&
@@ -831,9 +954,16 @@ pf_insert_state(struct pfi_kif *kif, struct pf_state *state)
}
if (RB_INSERT(pf_state_tree_id, &tree_id, state) != NULL) {
if (pf_status.debug >= PF_DEBUG_MISC) {
+#ifdef __FreeBSD__
+ printf("pf: state insert failed: "
+ "id: %016llx creatorid: %08x",
+ (long long)be64toh(state->id),
+ ntohl(state->creatorid));
+#else
printf("pf: state insert failed: "
"id: %016llx creatorid: %08x",
betoh64(state->id), ntohl(state->creatorid));
+#endif
if (state->sync_flags & PFSTATE_FROMSYNC)
printf(" (from sync)");
printf("\n");
@@ -842,10 +972,11 @@ pf_insert_state(struct pfi_kif *kif, struct pf_state *state)
RB_REMOVE(pf_state_tree_ext_gwy, &kif->pfik_ext_gwy, state);
return (-1);
}
- TAILQ_INSERT_TAIL(&state_list, state, u.s.entry_list);
+ TAILQ_INSERT_HEAD(&state_updates, state, u.s.entry_updates);
+
pf_status.fcounters[FCNT_STATE_INSERT]++;
pf_status.states++;
- pfi_kif_ref(kif, PFI_KIF_REF_STATE);
+ pfi_attach_state(kif);
#if NPFSYNC
pfsync_insert_state(state);
#endif
@@ -853,28 +984,33 @@ pf_insert_state(struct pfi_kif *kif, struct pf_state *state)
}
void
-pf_purge_thread(void *v)
+pf_purge_timeout(void *arg)
{
- int nloops = 0, s;
-
- for (;;) {
- tsleep(pf_purge_thread, PWAIT, "pftm", 1 * hz);
-
- s = splsoftnet();
-
- /* process a fraction of the state table every second */
- pf_purge_expired_states(1 + (pf_status.states
- / pf_default_rule.timeout[PFTM_INTERVAL]));
+#ifdef __FreeBSD__
+ struct callout *to = arg;
+#else
+ struct timeout *to = arg;
+#endif
+ int s;
- /* purge other expired types every PFTM_INTERVAL seconds */
- if (++nloops >= pf_default_rule.timeout[PFTM_INTERVAL]) {
- pf_purge_expired_fragments();
- pf_purge_expired_src_nodes(0);
- nloops = 0;
- }
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
+ s = splsoftnet();
+ pf_purge_expired_states();
+ pf_purge_expired_fragments();
+ pf_purge_expired_src_nodes();
+ splx(s);
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
- splx(s);
- }
+#ifdef __FreeBSD__
+ callout_reset(to, pf_default_rule.timeout[PFTM_INTERVAL] * hz,
+ pf_purge_timeout, to);
+#else
+ timeout_add(to, pf_default_rule.timeout[PFTM_INTERVAL] * hz);
+#endif
}
u_int32_t
@@ -890,8 +1026,12 @@ pf_state_expires(const struct pf_state *state)
return (time_second);
if (state->timeout == PFTM_UNTIL_PACKET)
return (0);
- KASSERT(state->timeout != PFTM_UNLINKED);
+#ifdef __FreeBSD__
+ KASSERT((state->timeout < PFTM_MAX),
+ ("pf_state_expires: timeout > PFTM_MAX"));
+#else
KASSERT(state->timeout < PFTM_MAX);
+#endif
timeout = state->rule.ptr->timeout[state->timeout];
if (!timeout)
timeout = pf_default_rule.timeout[state->timeout];
@@ -915,21 +1055,14 @@ pf_state_expires(const struct pf_state *state)
}
void
-pf_purge_expired_src_nodes(int waslocked)
+pf_purge_expired_src_nodes(void)
{
struct pf_src_node *cur, *next;
- int locked = waslocked;
for (cur = RB_MIN(pf_src_tree, &tree_src_tracking); cur; cur = next) {
next = RB_NEXT(pf_src_tree, &tree_src_tracking, cur);
if (cur->states <= 0 && cur->expire <= time_second) {
- if (! locked) {
- rw_enter_write(&pf_consistency_lock);
- next = RB_NEXT(pf_src_tree,
- &tree_src_tracking, cur);
- locked = 1;
- }
if (cur->rule.ptr != NULL) {
cur->rule.ptr->src_nodes--;
if (cur->rule.ptr->states <= 0 &&
@@ -942,9 +1075,6 @@ pf_purge_expired_src_nodes(int waslocked)
pool_put(&pf_src_tree_pl, cur);
}
}
-
- if (locked && !waslocked)
- rw_exit_write(&pf_consistency_lock);
}
void
@@ -954,7 +1084,12 @@ pf_src_tree_remove_state(struct pf_state *s)
if (s->src_node != NULL) {
if (s->proto == IPPROTO_TCP) {
- if (s->src.tcp_est)
+#ifdef __FreeBSD__
+ if (s->local_flags & PFSTATE_SRC_CONN)
+#else
+ if (s->src.state == PF_TCPS_PROXY_DST ||
+ s->timeout >= PFTM_TCP_ESTABLISHED)
+#endif
--s->src_node->conn;
}
if (--s->src_node->states <= 0) {
@@ -977,42 +1112,33 @@ pf_src_tree_remove_state(struct pf_state *s)
s->src_node = s->nat_src_node = NULL;
}
-/* callers should be at splsoftnet */
void
-pf_unlink_state(struct pf_state *cur)
+pf_purge_expired_state(struct pf_state *cur)
{
- if (cur->src.state == PF_TCPS_PROXY_DST) {
+#ifdef __FreeBSD__
+ if (cur->local_flags & PFSTATE_EXPIRING)
+ return;
+ cur->local_flags |= PFSTATE_EXPIRING;
+#endif
+ if (cur->src.state == PF_TCPS_PROXY_DST)
+#ifdef __FreeBSD__
+ pf_send_tcp(NULL, cur->rule.ptr, cur->af,
+#else
pf_send_tcp(cur->rule.ptr, cur->af,
+#endif
&cur->ext.addr, &cur->lan.addr,
cur->ext.port, cur->lan.port,
cur->src.seqhi, cur->src.seqlo + 1,
- TH_RST|TH_ACK, 0, 0, 0, 1, cur->tag, NULL, NULL);
- }
+ TH_RST|TH_ACK, 0, 0, 0, 1, NULL, NULL);
RB_REMOVE(pf_state_tree_ext_gwy,
&cur->u.s.kif->pfik_ext_gwy, cur);
RB_REMOVE(pf_state_tree_lan_ext,
&cur->u.s.kif->pfik_lan_ext, cur);
RB_REMOVE(pf_state_tree_id, &tree_id, cur);
#if NPFSYNC
- if (cur->creatorid == pf_status.hostid)
- pfsync_delete_state(cur);
+ pfsync_delete_state(cur);
#endif
- cur->timeout = PFTM_UNLINKED;
pf_src_tree_remove_state(cur);
-}
-
-/* callers should be at splsoftnet and hold the
- * write_lock on pf_consistency_lock */
-void
-pf_free_state(struct pf_state *cur)
-{
-#if NPFSYNC
- if (pfsyncif != NULL &&
- (pfsyncif->sc_bulk_send_next == cur ||
- pfsyncif->sc_bulk_terminator == cur))
- return;
-#endif
- KASSERT(cur->timeout == PFTM_UNLINKED);
if (--cur->rule.ptr->states <= 0 &&
cur->rule.ptr->src_nodes <= 0)
pf_rm_rule(NULL, cur->rule.ptr);
@@ -1024,8 +1150,8 @@ pf_free_state(struct pf_state *cur)
if (--cur->anchor.ptr->states <= 0)
pf_rm_rule(NULL, cur->anchor.ptr);
pf_normalize_tcp_cleanup(cur);
- pfi_kif_unref(cur->u.s.kif, PFI_KIF_REF_STATE);
- TAILQ_REMOVE(&state_list, cur, u.s.entry_list);
+ pfi_detach_state(cur->u.s.kif);
+ TAILQ_REMOVE(&state_updates, cur, u.s.entry_updates);
if (cur->tag)
pf_tag_unref(cur->tag);
pool_put(&pf_state_pl, cur);
@@ -1034,44 +1160,16 @@ pf_free_state(struct pf_state *cur)
}
void
-pf_purge_expired_states(u_int32_t maxcheck)
+pf_purge_expired_states(void)
{
- static struct pf_state *cur = NULL;
- struct pf_state *next;
- int locked = 0;
-
- while (maxcheck--) {
- /* wrap to start of list when we hit the end */
- if (cur == NULL) {
- cur = TAILQ_FIRST(&state_list);
- if (cur == NULL)
- break; /* list empty */
- }
-
- /* get next state, as cur may get deleted */
- next = TAILQ_NEXT(cur, u.s.entry_list);
-
- if (cur->timeout == PFTM_UNLINKED) {
- /* free unlinked state */
- if (! locked) {
- rw_enter_write(&pf_consistency_lock);
- locked = 1;
- }
- pf_free_state(cur);
- } else if (pf_state_expires(cur) <= time_second) {
- /* unlink and free expired state */
- pf_unlink_state(cur);
- if (! locked) {
- rw_enter_write(&pf_consistency_lock);
- locked = 1;
- }
- pf_free_state(cur);
- }
- cur = next;
- }
+ struct pf_state *cur, *next;
- if (locked)
- rw_exit_write(&pf_consistency_lock);
+ for (cur = RB_MIN(pf_state_tree_id, &tree_id);
+ cur; cur = next) {
+ next = RB_NEXT(pf_state_tree_id, &tree_id, cur);
+ if (pf_state_expires(cur) <= time_second)
+ pf_purge_expired_state(cur);
+ }
}
int
@@ -1297,12 +1395,9 @@ pf_addr_wrap_neq(struct pf_addr_wrap *aw1, struct pf_addr_wrap *aw2)
case PF_ADDR_DYNIFTL:
return (aw1->p.dyn->pfid_kt != aw2->p.dyn->pfid_kt);
case PF_ADDR_NOROUTE:
- case PF_ADDR_URPFFAILED:
return (0);
case PF_ADDR_TABLE:
return (aw1->p.tbl != aw2->p.tbl);
- case PF_ADDR_RTLABEL:
- return (aw1->v.rtlabel != aw2->v.rtlabel);
default:
printf("invalid address type: %d\n", aw1->type);
return (1);
@@ -1417,7 +1512,7 @@ pf_change_icmp(struct pf_addr *ia, u_int16_t *ip, struct pf_addr *oa,
/* Change inner protocol port, fix inner protocol checksum. */
if (ip != NULL) {
u_int16_t oip = *ip;
- u_int32_t opc;
+ u_int32_t opc = 0; /* make the compiler happy */
if (pc != NULL)
opc = *pc;
@@ -1489,82 +1584,27 @@ pf_change_icmp(struct pf_addr *ia, u_int16_t *ip, struct pf_addr *oa,
}
}
-
-/*
- * Need to modulate the sequence numbers in the TCP SACK option
- * (credits to Krzysztof Pfaff for report and patch)
- */
-int
-pf_modulate_sack(struct mbuf *m, int off, struct pf_pdesc *pd,
- struct tcphdr *th, struct pf_state_peer *dst)
-{
- int hlen = (th->th_off << 2) - sizeof(*th), thoptlen = hlen;
- u_int8_t opts[MAX_TCPOPTLEN], *opt = opts;
- int copyback = 0, i, olen;
- struct sackblk sack;
-
-#define TCPOLEN_SACKLEN (TCPOLEN_SACK + 2)
- if (hlen < TCPOLEN_SACKLEN ||
- !pf_pull_hdr(m, off + sizeof(*th), opts, hlen, NULL, NULL, pd->af))
- return 0;
-
- while (hlen >= TCPOLEN_SACKLEN) {
- olen = opt[1];
- switch (*opt) {
- case TCPOPT_EOL: /* FALLTHROUGH */
- case TCPOPT_NOP:
- opt++;
- hlen--;
- break;
- case TCPOPT_SACK:
- if (olen > hlen)
- olen = hlen;
- if (olen >= TCPOLEN_SACKLEN) {
- for (i = 2; i + TCPOLEN_SACK <= olen;
- i += TCPOLEN_SACK) {
- memcpy(&sack, &opt[i], sizeof(sack));
- pf_change_a(&sack.start, &th->th_sum,
- htonl(ntohl(sack.start) -
- dst->seqdiff), 0);
- pf_change_a(&sack.end, &th->th_sum,
- htonl(ntohl(sack.end) -
- dst->seqdiff), 0);
- memcpy(&opt[i], &sack, sizeof(sack));
- }
- copyback = 1;
- }
- /* FALLTHROUGH */
- default:
- if (olen < 2)
- olen = 2;
- hlen -= olen;
- opt += olen;
- }
- }
-
- if (copyback)
- m_copyback(m, off + sizeof(*th), thoptlen, opts);
- return (copyback);
-}
-
void
+#ifdef __FreeBSD__
+pf_send_tcp(struct mbuf *replyto, const struct pf_rule *r, sa_family_t af,
+#else
pf_send_tcp(const struct pf_rule *r, sa_family_t af,
+#endif
const struct pf_addr *saddr, const struct pf_addr *daddr,
u_int16_t sport, u_int16_t dport, u_int32_t seq, u_int32_t ack,
u_int8_t flags, u_int16_t win, u_int16_t mss, u_int8_t ttl, int tag,
- u_int16_t rtag, struct ether_header *eh, struct ifnet *ifp)
+ struct ether_header *eh, struct ifnet *ifp)
{
struct mbuf *m;
- int len, tlen;
+ int len = 0, tlen; /* make the compiler happy */
#ifdef INET
- struct ip *h;
+ struct ip *h = NULL; /* make the compiler happy */
#endif /* INET */
#ifdef INET6
- struct ip6_hdr *h6;
+ struct ip6_hdr *h6 = NULL; /* make the compiler happy */
#endif /* INET6 */
- struct tcphdr *th;
- char *opt;
- struct pf_mtag *pf_mtag;
+ struct tcphdr *th = NULL; /* make the compiler happy */
+ char *opt;
/* maximum segment size tcp option */
tlen = sizeof(struct tcphdr);
@@ -1588,24 +1628,44 @@ pf_send_tcp(const struct pf_rule *r, sa_family_t af,
m = m_gethdr(M_DONTWAIT, MT_HEADER);
if (m == NULL)
return;
- if ((pf_mtag = pf_get_mtag(m)) == NULL) {
- m_freem(m);
- return;
- }
- if (tag)
- pf_mtag->flags |= PF_TAG_GENERATED;
-
- pf_mtag->tag = rtag;
-
- if (r != NULL && r->rtableid >= 0)
- pf_mtag->rtableid = r->rtableid;
+#ifdef __FreeBSD__
+#ifdef MAC
+ if (replyto)
+ mac_create_mbuf_netlayer(replyto, m);
+ else
+ mac_create_mbuf_from_firewall(m);
+#else
+ (void)replyto;
+#endif
+#endif
+ if (tag) {
+#ifdef __FreeBSD__
+ m->m_flags |= M_SKIP_FIREWALL;
+#else
+ struct m_tag *mtag;
+ mtag = m_tag_get(PACKET_TAG_PF_GENERATED, 0, M_NOWAIT);
+ if (mtag == NULL) {
+ m_freem(m);
+ return;
+ }
+ m_tag_prepend(m, mtag);
+#endif
+ }
#ifdef ALTQ
if (r != NULL && r->qid) {
- pf_mtag->qid = r->qid;
- /* add hints for ecn */
- pf_mtag->af = af;
- pf_mtag->hdr = mtod(m, struct ip *);
+ struct m_tag *mtag;
+ struct altq_tag *atag;
+
+ mtag = m_tag_get(PACKET_TAG_PF_QID, sizeof(*atag), M_NOWAIT);
+ if (mtag != NULL) {
+ atag = (struct altq_tag *)(mtag + 1);
+ atag->qid = r->qid;
+ /* add hints for ecn */
+ atag->af = af;
+ atag->hdr = mtod(m, struct ip *);
+ m_tag_prepend(m, mtag);
+ }
}
#endif /* ALTQ */
m->m_data += max_linkhdr;
@@ -1668,13 +1728,25 @@ pf_send_tcp(const struct pf_rule *r, sa_family_t af,
h->ip_v = 4;
h->ip_hl = sizeof(*h) >> 2;
h->ip_tos = IPTOS_LOWDELAY;
- h->ip_len = htons(len);
+#ifdef __FreeBSD__
+ h->ip_off = path_mtu_discovery ? IP_DF : 0;
+ h->ip_len = len;
+#else
h->ip_off = htons(ip_mtudisc ? IP_DF : 0);
+ h->ip_len = htons(len);
+#endif
h->ip_ttl = ttl ? ttl : ip_defttl;
h->ip_sum = 0;
if (eh == NULL) {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
ip_output(m, (void *)NULL, (void *)NULL, 0,
(void *)NULL, (void *)NULL);
+ PF_LOCK();
+#else /* ! __FreeBSD__ */
+ ip_output(m, (void *)NULL, (void *)NULL, 0,
+ (void *)NULL, (void *)NULL);
+#endif
} else {
struct route ro;
struct rtentry rt;
@@ -1691,8 +1763,16 @@ pf_send_tcp(const struct pf_rule *r, sa_family_t af,
bcopy(eh->ether_dhost, e->ether_shost, ETHER_ADDR_LEN);
bcopy(eh->ether_shost, e->ether_dhost, ETHER_ADDR_LEN);
e->ether_type = eh->ether_type;
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+ /* XXX_IMPORT: later */
+ ip_output(m, (void *)NULL, &ro, 0,
+ (void *)NULL, (void *)NULL);
+ PF_LOCK();
+#else /* ! __FreeBSD__ */
ip_output(m, (void *)NULL, &ro, IP_ROUTETOETHER,
(void *)NULL, (void *)NULL);
+#endif
}
break;
#endif /* INET */
@@ -1705,7 +1785,13 @@ pf_send_tcp(const struct pf_rule *r, sa_family_t af,
h6->ip6_vfc |= IPV6_VERSION;
h6->ip6_hlim = IPV6_DEFHLIM;
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+ ip6_output(m, NULL, NULL, 0, NULL, NULL, NULL);
+ PF_LOCK();
+#else
ip6_output(m, NULL, NULL, 0, NULL, NULL);
+#endif
break;
#endif /* INET6 */
}
@@ -1715,36 +1801,72 @@ void
pf_send_icmp(struct mbuf *m, u_int8_t type, u_int8_t code, sa_family_t af,
struct pf_rule *r)
{
- struct pf_mtag *pf_mtag;
+#ifdef ALTQ
+ struct m_tag *mtag;
+#endif
struct mbuf *m0;
+#ifdef __FreeBSD__
+ struct ip *ip;
+#endif
+#ifdef __FreeBSD__
+ m0 = m_copypacket(m, M_DONTWAIT);
+ if (m0 == NULL)
+ return;
+ m0->m_flags |= M_SKIP_FIREWALL;
+#else
+ mtag = m_tag_get(PACKET_TAG_PF_GENERATED, 0, M_NOWAIT);
+ if (mtag == NULL)
+ return;
m0 = m_copy(m, 0, M_COPYALL);
-
- if ((pf_mtag = pf_get_mtag(m0)) == NULL)
+ if (m0 == NULL) {
+ m_tag_free(mtag);
return;
- pf_mtag->flags |= PF_TAG_GENERATED;
-
- if (r->rtableid >= 0)
- pf_mtag->rtableid = r->rtableid;
+ }
+ m_tag_prepend(m0, mtag);
+#endif
#ifdef ALTQ
if (r->qid) {
- pf_mtag->qid = r->qid;
- /* add hints for ecn */
- pf_mtag->af = af;
- pf_mtag->hdr = mtod(m0, struct ip *);
+ struct altq_tag *atag;
+
+ mtag = m_tag_get(PACKET_TAG_PF_QID, sizeof(*atag), M_NOWAIT);
+ if (mtag != NULL) {
+ atag = (struct altq_tag *)(mtag + 1);
+ atag->qid = r->qid;
+ /* add hints for ecn */
+ atag->af = af;
+ atag->hdr = mtod(m0, struct ip *);
+ m_tag_prepend(m0, mtag);
+ }
}
#endif /* ALTQ */
switch (af) {
#ifdef INET
case AF_INET:
+#ifdef __FreeBSD__
+ /* icmp_error() expects host byte ordering */
+ ip = mtod(m0, struct ip *);
+ NTOHS(ip->ip_len);
+ NTOHS(ip->ip_off);
+ PF_UNLOCK();
icmp_error(m0, type, code, 0, 0);
+ PF_LOCK();
+#else
+ icmp_error(m0, type, code, 0, (void *)NULL);
+#endif
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
icmp6_error(m0, type, code, 0);
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
break;
#endif /* INET6 */
}
@@ -1847,71 +1969,58 @@ pf_match_gid(u_int8_t op, gid_t a1, gid_t a2, gid_t g)
return (pf_match(op, a1, a2, g));
}
-struct pf_mtag *
-pf_find_mtag(struct mbuf *m)
+struct pf_tag *
+pf_get_tag(struct mbuf *m)
{
struct m_tag *mtag;
- if ((mtag = m_tag_find(m, PACKET_TAG_PF, NULL)) == NULL)
+ if ((mtag = m_tag_find(m, PACKET_TAG_PF_TAG, NULL)) != NULL)
+ return ((struct pf_tag *)(mtag + 1));
+ else
return (NULL);
-
- return ((struct pf_mtag *)(mtag + 1));
-}
-
-struct pf_mtag *
-pf_get_mtag(struct mbuf *m)
-{
- struct m_tag *mtag;
-
- if ((mtag = m_tag_find(m, PACKET_TAG_PF, NULL)) == NULL) {
- mtag = m_tag_get(PACKET_TAG_PF, sizeof(struct pf_mtag),
- M_NOWAIT);
- if (mtag == NULL)
- return (NULL);
- bzero(mtag + 1, sizeof(struct pf_mtag));
- m_tag_prepend(m, mtag);
- }
-
- return ((struct pf_mtag *)(mtag + 1));
}
int
-pf_match_tag(struct mbuf *m, struct pf_rule *r, struct pf_mtag *pf_mtag,
- int *tag)
+pf_match_tag(struct mbuf *m, struct pf_rule *r, struct pf_tag **pftag, int *tag)
{
- if (*tag == -1)
- *tag = pf_mtag->tag;
+ if (*tag == -1) { /* find mbuf tag */
+ *pftag = pf_get_tag(m);
+ if (*pftag != NULL)
+ *tag = (*pftag)->tag;
+ else
+ *tag = 0;
+ }
return ((!r->match_tag_not && r->match_tag == *tag) ||
(r->match_tag_not && r->match_tag != *tag));
}
int
-pf_tag_packet(struct mbuf *m, struct pf_mtag *pf_mtag, int tag, int rtableid)
+pf_tag_packet(struct mbuf *m, struct pf_tag *pftag, int tag)
{
- if (tag <= 0 && rtableid < 0)
+ struct m_tag *mtag;
+
+ if (tag <= 0)
return (0);
- if (pf_mtag == NULL)
- if ((pf_mtag = pf_get_mtag(m)) == NULL)
+ if (pftag == NULL) {
+ mtag = m_tag_get(PACKET_TAG_PF_TAG, sizeof(*pftag), M_NOWAIT);
+ if (mtag == NULL)
return (1);
- if (tag > 0)
- pf_mtag->tag = tag;
- if (rtableid >= 0)
- pf_mtag->rtableid = rtableid;
+ ((struct pf_tag *)(mtag + 1))->tag = tag;
+ m_tag_prepend(m, mtag);
+ } else
+ pftag->tag = tag;
return (0);
}
static void
pf_step_into_anchor(int *depth, struct pf_ruleset **rs, int n,
- struct pf_rule **r, struct pf_rule **a, int *match)
+ struct pf_rule **r, struct pf_rule **a)
{
struct pf_anchor_stackframe *f;
- (*r)->anchor->match = 0;
- if (match)
- *match = 0;
if (*depth >= sizeof(pf_anchor_stack) /
sizeof(pf_anchor_stack[0])) {
printf("pf_step_into_anchor: stack overflow\n");
@@ -1938,23 +2047,17 @@ pf_step_into_anchor(int *depth, struct pf_ruleset **rs, int n,
*r = TAILQ_FIRST((*rs)->rules[n].active.ptr);
}
-int
+static void
pf_step_out_of_anchor(int *depth, struct pf_ruleset **rs, int n,
- struct pf_rule **r, struct pf_rule **a, int *match)
+ struct pf_rule **r, struct pf_rule **a)
{
struct pf_anchor_stackframe *f;
- int quick = 0;
do {
if (*depth <= 0)
break;
f = pf_anchor_stack + *depth - 1;
if (f->parent != NULL && f->child != NULL) {
- if (f->child->match ||
- (match != NULL && *match)) {
- f->r->anchor->match = 1;
- *match = 0;
- }
f->child = RB_NEXT(pf_anchor_node, f->parent, f->child);
if (f->child != NULL) {
*rs = &f->child->ruleset;
@@ -1969,12 +2072,8 @@ pf_step_out_of_anchor(int *depth, struct pf_ruleset **rs, int n,
if (*depth == 0 && a != NULL)
*a = NULL;
*rs = f->rs;
- if (f->r->anchor->match || (match != NULL && *match))
- quick = f->r->quick;
*r = TAILQ_NEXT(f->r, entries);
} while (*r == NULL);
-
- return (quick);
}
#ifdef INET6
@@ -2278,7 +2377,7 @@ pf_get_sport(sa_family_t af, u_int8_t proto, struct pf_rule *r,
struct pf_addr *naddr, u_int16_t *nport, u_int16_t low, u_int16_t high,
struct pf_src_node **sn)
{
- struct pf_state_cmp key;
+ struct pf_state key;
struct pf_addr init_addr;
u_int16_t cut;
@@ -2370,8 +2469,8 @@ pf_match_translation(struct pf_pdesc *pd, struct mbuf *m, int off,
{
struct pf_rule *r, *rm = NULL;
struct pf_ruleset *ruleset = NULL;
+ struct pf_tag *pftag = NULL;
int tag = -1;
- int rtableid = -1;
int asd = 0;
r = TAILQ_FIRST(pf_main_ruleset.rules[rs_num].active.ptr);
@@ -2389,7 +2488,8 @@ pf_match_translation(struct pf_pdesc *pd, struct mbuf *m, int off,
}
r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
+ if (r->kif != NULL &&
+ (r->kif != kif && r->kif != kif->pfik_parent) == !r->ifnot)
r = r->skip[PF_SKIP_IFP].ptr;
else if (r->direction && r->direction != direction)
r = r->skip[PF_SKIP_DIR].ptr;
@@ -2397,8 +2497,7 @@ pf_match_translation(struct pf_pdesc *pd, struct mbuf *m, int off,
r = r->skip[PF_SKIP_AF].ptr;
else if (r->proto && r->proto != pd->proto)
r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&src->addr, saddr, pd->af,
- src->neg, kif))
+ else if (PF_MISMATCHAW(&src->addr, saddr, pd->af, src->neg))
r = r->skip[src == &r->src ? PF_SKIP_SRC_ADDR :
PF_SKIP_DST_ADDR].ptr;
else if (src->port_op && !pf_match_port(src->port_op,
@@ -2406,16 +2505,15 @@ pf_match_translation(struct pf_pdesc *pd, struct mbuf *m, int off,
r = r->skip[src == &r->src ? PF_SKIP_SRC_PORT :
PF_SKIP_DST_PORT].ptr;
else if (dst != NULL &&
- PF_MISMATCHAW(&dst->addr, daddr, pd->af, dst->neg, NULL))
+ PF_MISMATCHAW(&dst->addr, daddr, pd->af, dst->neg))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
- else if (xdst != NULL && PF_MISMATCHAW(xdst, daddr, pd->af,
- 0, NULL))
+ else if (xdst != NULL && PF_MISMATCHAW(xdst, daddr, pd->af, 0))
r = TAILQ_NEXT(r, entries);
else if (dst != NULL && dst->port_op &&
!pf_match_port(dst->port_op, dst->port[0],
dst->port[1], dport))
r = r->skip[PF_SKIP_DST_PORT].ptr;
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
+ else if (r->match_tag && !pf_match_tag(m, r, &pftag, &tag))
r = TAILQ_NEXT(r, entries);
else if (r->os_fingerprint != PF_OSFP_ANY && (pd->proto !=
IPPROTO_TCP || !pf_osfp_match(pf_osfp_fingerprint(pd, m,
@@ -2424,19 +2522,15 @@ pf_match_translation(struct pf_pdesc *pd, struct mbuf *m, int off,
else {
if (r->tag)
tag = r->tag;
- if (r->rtableid >= 0)
- rtableid = r->rtableid;
if (r->anchor == NULL) {
rm = r;
} else
- pf_step_into_anchor(&asd, &ruleset, rs_num,
- &r, NULL, NULL);
+ pf_step_into_anchor(&asd, &ruleset, rs_num, &r, NULL);
}
if (r == NULL)
- pf_step_out_of_anchor(&asd, &ruleset, rs_num, &r,
- NULL, NULL);
+ pf_step_out_of_anchor(&asd, &ruleset, rs_num, &r, NULL);
}
- if (pf_tag_packet(m, pd->pf_mtag, tag, rtableid))
+ if (pf_tag_packet(m, pftag, tag))
return (NULL);
if (rm != NULL && (rm->action == PF_NONAT ||
rm->action == PF_NORDR || rm->action == PF_NOBINAT))
@@ -2596,35 +2690,56 @@ pf_get_translation(struct pf_pdesc *pd, struct mbuf *m, int off, int direction,
}
int
-pf_socket_lookup(int direction, struct pf_pdesc *pd)
+#ifdef __FreeBSD__
+pf_socket_lookup(uid_t *uid, gid_t *gid, int direction, struct pf_pdesc *pd,
+ struct inpcb *inp_arg)
+#else
+pf_socket_lookup(uid_t *uid, gid_t *gid, int direction, struct pf_pdesc *pd)
+#endif
{
struct pf_addr *saddr, *daddr;
u_int16_t sport, dport;
+#ifdef __FreeBSD__
+ struct inpcbinfo *pi;
+#else
struct inpcbtable *tb;
+#endif
struct inpcb *inp;
- if (pd == NULL)
- return (-1);
- pd->lookup.uid = UID_MAX;
- pd->lookup.gid = GID_MAX;
- pd->lookup.pid = NO_PID;
+ *uid = UID_MAX;
+ *gid = GID_MAX;
+#ifdef __FreeBSD__
+ if (inp_arg != NULL) {
+ INP_LOCK_ASSERT(inp_arg);
+ if (inp_arg->inp_socket) {
+ *uid = inp_arg->inp_socket->so_cred->cr_uid;
+ *gid = inp_arg->inp_socket->so_cred->cr_groups[0];
+ return (1);
+ } else
+ return (0);
+ }
+#endif
switch (pd->proto) {
case IPPROTO_TCP:
- if (pd->hdr.tcp == NULL)
- return (-1);
sport = pd->hdr.tcp->th_sport;
dport = pd->hdr.tcp->th_dport;
+#ifdef __FreeBSD__
+ pi = &tcbinfo;
+#else
tb = &tcbtable;
+#endif
break;
case IPPROTO_UDP:
- if (pd->hdr.udp == NULL)
- return (-1);
sport = pd->hdr.udp->uh_sport;
dport = pd->hdr.udp->uh_dport;
+#ifdef __FreeBSD__
+ pi = &udbinfo;
+#else
tb = &udbtable;
+#endif
break;
default:
- return (-1);
+ return (0);
}
if (direction == PF_IN) {
saddr = pd->src;
@@ -2641,32 +2756,72 @@ pf_socket_lookup(int direction, struct pf_pdesc *pd)
switch (pd->af) {
#ifdef INET
case AF_INET:
+#ifdef __FreeBSD__
+ INP_INFO_RLOCK(pi); /* XXX LOR */
+ inp = in_pcblookup_hash(pi, saddr->v4, sport, daddr->v4,
+ dport, 0, NULL);
+ if (inp == NULL) {
+ inp = in_pcblookup_hash(pi, saddr->v4, sport,
+ daddr->v4, dport, INPLOOKUP_WILDCARD, NULL);
+ if(inp == NULL) {
+ INP_INFO_RUNLOCK(pi);
+ return (0);
+ }
+ }
+#else
inp = in_pcbhashlookup(tb, saddr->v4, sport, daddr->v4, dport);
if (inp == NULL) {
inp = in_pcblookup_listen(tb, daddr->v4, dport, 0);
if (inp == NULL)
- return (-1);
+ return (0);
}
+#endif
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
+#ifdef __FreeBSD__
+ INP_INFO_RLOCK(pi);
+ inp = in6_pcblookup_hash(pi, &saddr->v6, sport,
+ &daddr->v6, dport, 0, NULL);
+ if (inp == NULL) {
+ inp = in6_pcblookup_hash(pi, &saddr->v6, sport,
+ &daddr->v6, dport, INPLOOKUP_WILDCARD, NULL);
+ if (inp == NULL) {
+ INP_INFO_RUNLOCK(pi);
+ return (0);
+ }
+ }
+#else
inp = in6_pcbhashlookup(tb, &saddr->v6, sport, &daddr->v6,
dport);
if (inp == NULL) {
inp = in6_pcblookup_listen(tb, &daddr->v6, dport, 0);
if (inp == NULL)
- return (-1);
+ return (0);
}
+#endif
break;
#endif /* INET6 */
default:
- return (-1);
+ return (0);
}
- pd->lookup.uid = inp->inp_socket->so_euid;
- pd->lookup.gid = inp->inp_socket->so_egid;
- pd->lookup.pid = inp->inp_socket->so_cpid;
+#ifdef __FreeBSD__
+ INP_LOCK(inp);
+ if ((inp->inp_socket == NULL) || (inp->inp_socket->so_cred == NULL)) {
+ INP_UNLOCK(inp);
+ INP_INFO_RUNLOCK(pi);
+ return (0);
+ }
+ *uid = inp->inp_socket->so_cred->cr_uid;
+ *gid = inp->inp_socket->so_cred->cr_groups[0];
+ INP_UNLOCK(inp);
+ INP_INFO_RUNLOCK(pi);
+#else
+ *uid = inp->inp_socket->so_euid;
+ *gid = inp->inp_socket->so_egid;
+#endif
return (1);
}
@@ -2760,7 +2915,7 @@ pf_calc_mss(struct pf_addr *addr, sa_family_t af, u_int16_t offer)
struct route_in6 ro6;
#endif /* INET6 */
struct rtentry *rt = NULL;
- int hlen;
+ int hlen = 0; /* make the compiler happy */
u_int16_t mss = tcp_mssdflt;
switch (af) {
@@ -2772,7 +2927,15 @@ pf_calc_mss(struct pf_addr *addr, sa_family_t af, u_int16_t offer)
dst->sin_family = AF_INET;
dst->sin_len = sizeof(*dst);
dst->sin_addr = addr->v4;
+#ifdef __FreeBSD__
+#ifdef RTF_PRCLONING
+ rtalloc_ign(&ro, (RTF_CLONING | RTF_PRCLONING));
+#else /* !RTF_PRCLONING */
+ rtalloc_ign(&ro, RTF_CLONING);
+#endif
+#else /* ! __FreeBSD__ */
rtalloc_noclone(&ro, NO_CLONING);
+#endif
rt = ro.ro_rt;
break;
#endif /* INET */
@@ -2784,7 +2947,16 @@ pf_calc_mss(struct pf_addr *addr, sa_family_t af, u_int16_t offer)
dst6->sin6_family = AF_INET6;
dst6->sin6_len = sizeof(*dst6);
dst6->sin6_addr = addr->v6;
+#ifdef __FreeBSD__
+#ifdef RTF_PRCLONING
+ rtalloc_ign((struct route *)&ro6,
+ (RTF_CLONING | RTF_PRCLONING));
+#else /* !RTF_PRCLONING */
+ rtalloc_ign((struct route *)&ro6, RTF_CLONING);
+#endif
+#else /* ! __FreeBSD__ */
rtalloc_noclone((struct route *)&ro6, NO_CLONING);
+#endif
rt = ro6.ro_rt;
break;
#endif /* INET6 */
@@ -2829,29 +3001,43 @@ pf_set_rt_ifp(struct pf_state *s, struct pf_addr *saddr)
int
pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
struct pfi_kif *kif, struct mbuf *m, int off, void *h,
+#ifdef __FreeBSD__
+ struct pf_pdesc *pd, struct pf_rule **am, struct pf_ruleset **rsm,
+ struct ifqueue *ifq, struct inpcb *inp)
+#else
struct pf_pdesc *pd, struct pf_rule **am, struct pf_ruleset **rsm,
struct ifqueue *ifq)
+#endif
{
struct pf_rule *nr = NULL;
struct pf_addr *saddr = pd->src, *daddr = pd->dst;
struct tcphdr *th = pd->hdr.tcp;
u_int16_t bport, nport = 0;
sa_family_t af = pd->af;
+ int lookup = -1;
+ uid_t uid;
+ gid_t gid;
struct pf_rule *r, *a = NULL;
struct pf_ruleset *ruleset = NULL;
struct pf_src_node *nsn = NULL;
u_short reason;
int rewrite = 0;
- int tag = -1, rtableid = -1;
+ struct pf_tag *pftag = NULL;
+ int tag = -1;
u_int16_t mss = tcp_mssdflt;
int asd = 0;
- int match = 0;
if (pf_check_congestion(ifq)) {
REASON_SET(&reason, PFRES_CONGEST);
return (PF_DROP);
}
+#if defined(__FreeBSD__) && defined(PF_MPSAFE_UGID)
+ PF_UNLOCK();
+ lookup = pf_socket_lookup(&uid, &gid, direction, pd, inp);
+ PF_LOCK();
+#endif
+
r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_FILTER].active.ptr);
if (direction == PF_OUT) {
@@ -2886,7 +3072,8 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
while (r != NULL) {
r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
+ if (r->kif != NULL &&
+ (r->kif != kif && r->kif != kif->pfik_parent) == !r->ifnot)
r = r->skip[PF_SKIP_IFP].ptr;
else if (r->direction && r->direction != direction)
r = r->skip[PF_SKIP_DIR].ptr;
@@ -2894,37 +3081,43 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
r = r->skip[PF_SKIP_AF].ptr;
else if (r->proto && r->proto != IPPROTO_TCP)
r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, saddr, af,
- r->src.neg, kif))
+ else if (PF_MISMATCHAW(&r->src.addr, saddr, af, r->src.neg))
r = r->skip[PF_SKIP_SRC_ADDR].ptr;
else if (r->src.port_op && !pf_match_port(r->src.port_op,
r->src.port[0], r->src.port[1], th->th_sport))
r = r->skip[PF_SKIP_SRC_PORT].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, daddr, af,
- r->dst.neg, NULL))
+ else if (PF_MISMATCHAW(&r->dst.addr, daddr, af, r->dst.neg))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
else if (r->dst.port_op && !pf_match_port(r->dst.port_op,
r->dst.port[0], r->dst.port[1], th->th_dport))
r = r->skip[PF_SKIP_DST_PORT].ptr;
- else if (r->tos && !(r->tos == pd->tos))
+ else if (r->tos && !(r->tos & pd->tos))
r = TAILQ_NEXT(r, entries);
else if (r->rule_flag & PFRULE_FRAGMENT)
r = TAILQ_NEXT(r, entries);
else if ((r->flagset & th->th_flags) != r->flags)
r = TAILQ_NEXT(r, entries);
- else if (r->uid.op && (pd->lookup.done || (pd->lookup.done =
- pf_socket_lookup(direction, pd), 1)) &&
+ else if (r->uid.op && (lookup != -1 || (lookup =
+#ifdef __FreeBSD__
+ pf_socket_lookup(&uid, &gid, direction, pd, inp), 1)) &&
+#else
+ pf_socket_lookup(&uid, &gid, direction, pd), 1)) &&
+#endif
!pf_match_uid(r->uid.op, r->uid.uid[0], r->uid.uid[1],
- pd->lookup.uid))
+ uid))
r = TAILQ_NEXT(r, entries);
- else if (r->gid.op && (pd->lookup.done || (pd->lookup.done =
- pf_socket_lookup(direction, pd), 1)) &&
+ else if (r->gid.op && (lookup != -1 || (lookup =
+#ifdef __FreeBSD__
+ pf_socket_lookup(&uid, &gid, direction, pd, inp), 1)) &&
+#else
+ pf_socket_lookup(&uid, &gid, direction, pd), 1)) &&
+#endif
!pf_match_gid(r->gid.op, r->gid.gid[0], r->gid.gid[1],
- pd->lookup.gid))
+ gid))
r = TAILQ_NEXT(r, entries);
else if (r->prob && r->prob <= arc4random())
r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
+ else if (r->match_tag && !pf_match_tag(m, r, &pftag, &tag))
r = TAILQ_NEXT(r, entries);
else if (r->os_fingerprint != PF_OSFP_ANY && !pf_osfp_match(
pf_osfp_fingerprint(pd, m, off, th), r->os_fingerprint))
@@ -2932,10 +3125,7 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
else {
if (r->tag)
tag = r->tag;
- if (r->rtableid >= 0)
- rtableid = r->rtableid;
if (r->anchor == NULL) {
- match = 1;
*rm = r;
*am = a;
*rsm = ruleset;
@@ -2944,11 +3134,11 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
r = TAILQ_NEXT(r, entries);
} else
pf_step_into_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match);
+ PF_RULESET_FILTER, &r, &a);
}
- if (r == NULL && pf_step_out_of_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match))
- break;
+ if (r == NULL)
+ pf_step_out_of_anchor(&asd, &ruleset,
+ PF_RULESET_FILTER, &r, &a);
}
r = *rm;
a = *am;
@@ -2956,11 +3146,10 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
REASON_SET(&reason, PFRES_MATCH);
- if (r->log || (nr != NULL && nr->natpass && nr->log)) {
+ if (r->log) {
if (rewrite)
- m_copyback(m, off, sizeof(*th), th);
- PFLOG_PACKET(kif, h, m, af, direction, reason, r->log ? r : nr,
- a, ruleset, pd);
+ m_copyback(m, off, sizeof(*th), (caddr_t)th);
+ PFLOG_PACKET(kif, h, m, af, direction, reason, r, a, ruleset);
}
if ((r->action == PF_DROP) &&
@@ -2988,10 +3177,14 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
ack++;
if (th->th_flags & TH_FIN)
ack++;
+#ifdef __FreeBSD__
+ pf_send_tcp(m, r, af, pd->dst,
+#else
pf_send_tcp(r, af, pd->dst,
+#endif
pd->src, th->th_dport, th->th_sport,
ntohl(th->th_ack), ack, TH_RST|TH_ACK, 0, 0,
- r->return_ttl, 1, 0, pd->eh, kif->pfik_ifp);
+ r->return_ttl, 1, pd->eh, kif->pfik_ifp);
} else if ((af == AF_INET) && r->return_icmp)
pf_send_icmp(m, r->return_icmp >> 8,
r->return_icmp & 255, af, r);
@@ -3003,7 +3196,7 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
if (r->action == PF_DROP)
return (PF_DROP);
- if (pf_tag_packet(m, pd->pf_mtag, tag, rtableid)) {
+ if (pf_tag_packet(m, pftag, tag)) {
REASON_SET(&reason, PFRES_MEMORY);
return (PF_DROP);
}
@@ -3023,7 +3216,7 @@ pf_test_tcp(struct pf_rule **rm, struct pf_state **sm, int direction,
REASON_SET(&reason, PFRES_MAXSTATES);
goto cleanup;
}
- /* src node for filter rule */
+ /* src node for flter rule */
if ((r->rule_flag & PFRULE_SRCTRACK ||
r->rpool.opts & PF_POOL_STICKYADDR) &&
pf_insert_src_node(&sn, r, saddr, af) != 0) {
@@ -3063,9 +3256,7 @@ cleanup:
s->anchor.ptr = a;
STATE_INC_COUNTERS(s);
s->allow_opts = r->allow_opts;
- s->log = r->log & PF_LOG_ALL;
- if (nr != NULL)
- s->log |= nr->log & PF_LOG_ALL;
+ s->log = r->log & 2;
s->proto = IPPROTO_TCP;
s->direction = direction;
s->af = af;
@@ -3100,8 +3291,7 @@ cleanup:
if ((th->th_flags & (TH_SYN|TH_ACK)) == TH_SYN &&
r->keep_state == PF_STATE_MODULATE) {
/* Generate sequence number modulator */
- while ((s->src.seqdiff =
- tcp_rndiss_next() - s->src.seqlo) == 0)
+ while ((s->src.seqdiff = htonl(arc4random())) == 0)
;
pf_change_a(&th->th_seq, &th->th_sum,
htonl(s->src.seqlo + s->src.seqdiff), 0);
@@ -3192,9 +3382,13 @@ cleanup:
mss = pf_calc_mss(saddr, af, mss);
mss = pf_calc_mss(daddr, af, mss);
s->src.mss = mss;
+#ifdef __FreeBSD__
+ pf_send_tcp(NULL, r, af, daddr, saddr, th->th_dport,
+#else
pf_send_tcp(r, af, daddr, saddr, th->th_dport,
+#endif
th->th_sport, s->src.seqhi, ntohl(th->th_seq) + 1,
- TH_SYN|TH_ACK, 0, s->src.mss, 0, 1, 0, NULL, NULL);
+ TH_SYN|TH_ACK, 0, s->src.mss, 0, 1, NULL, NULL);
REASON_SET(&reason, PFRES_SYNPROXY);
return (PF_SYNPROXY_DROP);
}
@@ -3202,7 +3396,7 @@ cleanup:
/* copy back packet headers if we performed NAT operations */
if (rewrite)
- m_copyback(m, off, sizeof(*th), th);
+ m_copyback(m, off, sizeof(*th), (caddr_t)th);
return (PF_PASS);
}
@@ -3210,28 +3404,42 @@ cleanup:
int
pf_test_udp(struct pf_rule **rm, struct pf_state **sm, int direction,
struct pfi_kif *kif, struct mbuf *m, int off, void *h,
+#ifdef __FreeBSD__
+ struct pf_pdesc *pd, struct pf_rule **am, struct pf_ruleset **rsm,
+ struct ifqueue *ifq, struct inpcb *inp)
+#else
struct pf_pdesc *pd, struct pf_rule **am, struct pf_ruleset **rsm,
struct ifqueue *ifq)
+#endif
{
struct pf_rule *nr = NULL;
struct pf_addr *saddr = pd->src, *daddr = pd->dst;
struct udphdr *uh = pd->hdr.udp;
u_int16_t bport, nport = 0;
sa_family_t af = pd->af;
+ int lookup = -1;
+ uid_t uid;
+ gid_t gid;
struct pf_rule *r, *a = NULL;
struct pf_ruleset *ruleset = NULL;
struct pf_src_node *nsn = NULL;
u_short reason;
int rewrite = 0;
- int tag = -1, rtableid = -1;
+ struct pf_tag *pftag = NULL;
+ int tag = -1;
int asd = 0;
- int match = 0;
if (pf_check_congestion(ifq)) {
REASON_SET(&reason, PFRES_CONGEST);
return (PF_DROP);
}
+#if defined(__FreeBSD__) && defined(PF_MPSAFE_UGID)
+ PF_UNLOCK();
+ lookup = pf_socket_lookup(&uid, &gid, direction, pd, inp);
+ PF_LOCK();
+#endif
+
r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_FILTER].active.ptr);
if (direction == PF_OUT) {
@@ -3266,7 +3474,8 @@ pf_test_udp(struct pf_rule **rm, struct pf_state **sm, int direction,
while (r != NULL) {
r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
+ if (r->kif != NULL &&
+ (r->kif != kif && r->kif != kif->pfik_parent) == !r->ifnot)
r = r->skip[PF_SKIP_IFP].ptr;
else if (r->direction && r->direction != direction)
r = r->skip[PF_SKIP_DIR].ptr;
@@ -3274,45 +3483,48 @@ pf_test_udp(struct pf_rule **rm, struct pf_state **sm, int direction,
r = r->skip[PF_SKIP_AF].ptr;
else if (r->proto && r->proto != IPPROTO_UDP)
r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, saddr, af,
- r->src.neg, kif))
+ else if (PF_MISMATCHAW(&r->src.addr, saddr, af, r->src.neg))
r = r->skip[PF_SKIP_SRC_ADDR].ptr;
else if (r->src.port_op && !pf_match_port(r->src.port_op,
r->src.port[0], r->src.port[1], uh->uh_sport))
r = r->skip[PF_SKIP_SRC_PORT].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, daddr, af,
- r->dst.neg, NULL))
+ else if (PF_MISMATCHAW(&r->dst.addr, daddr, af, r->dst.neg))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
else if (r->dst.port_op && !pf_match_port(r->dst.port_op,
r->dst.port[0], r->dst.port[1], uh->uh_dport))
r = r->skip[PF_SKIP_DST_PORT].ptr;
- else if (r->tos && !(r->tos == pd->tos))
+ else if (r->tos && !(r->tos & pd->tos))
r = TAILQ_NEXT(r, entries);
else if (r->rule_flag & PFRULE_FRAGMENT)
r = TAILQ_NEXT(r, entries);
- else if (r->uid.op && (pd->lookup.done || (pd->lookup.done =
- pf_socket_lookup(direction, pd), 1)) &&
+ else if (r->uid.op && (lookup != -1 || (lookup =
+#ifdef __FreeBSD__
+ pf_socket_lookup(&uid, &gid, direction, pd, inp), 1)) &&
+#else
+ pf_socket_lookup(&uid, &gid, direction, pd), 1)) &&
+#endif
!pf_match_uid(r->uid.op, r->uid.uid[0], r->uid.uid[1],
- pd->lookup.uid))
+ uid))
r = TAILQ_NEXT(r, entries);
- else if (r->gid.op && (pd->lookup.done || (pd->lookup.done =
- pf_socket_lookup(direction, pd), 1)) &&
+ else if (r->gid.op && (lookup != -1 || (lookup =
+#ifdef __FreeBSD__
+ pf_socket_lookup(&uid, &gid, direction, pd, inp), 1)) &&
+#else
+ pf_socket_lookup(&uid, &gid, direction, pd), 1)) &&
+#endif
!pf_match_gid(r->gid.op, r->gid.gid[0], r->gid.gid[1],
- pd->lookup.gid))
+ gid))
r = TAILQ_NEXT(r, entries);
else if (r->prob && r->prob <= arc4random())
r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
+ else if (r->match_tag && !pf_match_tag(m, r, &pftag, &tag))
r = TAILQ_NEXT(r, entries);
else if (r->os_fingerprint != PF_OSFP_ANY)
r = TAILQ_NEXT(r, entries);
else {
if (r->tag)
tag = r->tag;
- if (r->rtableid >= 0)
- rtableid = r->rtableid;
if (r->anchor == NULL) {
- match = 1;
*rm = r;
*am = a;
*rsm = ruleset;
@@ -3321,11 +3533,11 @@ pf_test_udp(struct pf_rule **rm, struct pf_state **sm, int direction,
r = TAILQ_NEXT(r, entries);
} else
pf_step_into_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match);
+ PF_RULESET_FILTER, &r, &a);
}
- if (r == NULL && pf_step_out_of_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match))
- break;
+ if (r == NULL)
+ pf_step_out_of_anchor(&asd, &ruleset,
+ PF_RULESET_FILTER, &r, &a);
}
r = *rm;
a = *am;
@@ -3333,11 +3545,10 @@ pf_test_udp(struct pf_rule **rm, struct pf_state **sm, int direction,
REASON_SET(&reason, PFRES_MATCH);
- if (r->log || (nr != NULL && nr->natpass && nr->log)) {
+ if (r->log) {
if (rewrite)
- m_copyback(m, off, sizeof(*uh), uh);
- PFLOG_PACKET(kif, h, m, af, direction, reason, r->log ? r : nr,
- a, ruleset, pd);
+ m_copyback(m, off, sizeof(*uh), (caddr_t)uh);
+ PFLOG_PACKET(kif, h, m, af, direction, reason, r, a, ruleset);
}
if ((r->action == PF_DROP) &&
@@ -3366,7 +3577,7 @@ pf_test_udp(struct pf_rule **rm, struct pf_state **sm, int direction,
if (r->action == PF_DROP)
return (PF_DROP);
- if (pf_tag_packet(m, pd->pf_mtag, tag, rtableid)) {
+ if (pf_tag_packet(m, pftag, tag)) {
REASON_SET(&reason, PFRES_MEMORY);
return (PF_DROP);
}
@@ -3382,7 +3593,7 @@ pf_test_udp(struct pf_rule **rm, struct pf_state **sm, int direction,
REASON_SET(&reason, PFRES_MAXSTATES);
goto cleanup;
}
- /* src node for filter rule */
+ /* src node for flter rule */
if ((r->rule_flag & PFRULE_SRCTRACK ||
r->rpool.opts & PF_POOL_STICKYADDR) &&
pf_insert_src_node(&sn, r, saddr, af) != 0) {
@@ -3422,9 +3633,7 @@ cleanup:
s->anchor.ptr = a;
STATE_INC_COUNTERS(s);
s->allow_opts = r->allow_opts;
- s->log = r->log & PF_LOG_ALL;
- if (nr != NULL)
- s->log |= nr->log & PF_LOG_ALL;
+ s->log = r->log & 2;
s->proto = IPPROTO_UDP;
s->direction = direction;
s->af = af;
@@ -3484,7 +3693,7 @@ cleanup:
/* copy back packet headers if we performed NAT operations */
if (rewrite)
- m_copyback(m, off, sizeof(*uh), uh);
+ m_copyback(m, off, sizeof(*uh), (caddr_t)uh);
return (PF_PASS);
}
@@ -3501,16 +3710,17 @@ pf_test_icmp(struct pf_rule **rm, struct pf_state **sm, int direction,
struct pf_ruleset *ruleset = NULL;
struct pf_src_node *nsn = NULL;
u_short reason;
- u_int16_t icmpid, bport, nport = 0;
+ u_int16_t icmpid = 0, bport, nport = 0;
sa_family_t af = pd->af;
- u_int8_t icmptype, icmpcode;
+ u_int8_t icmptype = 0; /* make the compiler happy */
+ u_int8_t icmpcode = 0; /* make the compiler happy */
int state_icmp = 0;
- int tag = -1, rtableid = -1;
+ struct pf_tag *pftag = NULL;
+ int tag = -1;
#ifdef INET6
int rewrite = 0;
#endif /* INET6 */
int asd = 0;
- int match = 0;
if (pf_check_congestion(ifq)) {
REASON_SET(&reason, PFRES_CONGEST);
@@ -3564,7 +3774,8 @@ pf_test_icmp(struct pf_rule **rm, struct pf_state **sm, int direction,
pd->hdr.icmp->icmp_cksum = pf_cksum_fixup(
pd->hdr.icmp->icmp_cksum, icmpid, nport, 0);
pd->hdr.icmp->icmp_id = nport;
- m_copyback(m, off, ICMP_MINLEN, pd->hdr.icmp);
+ m_copyback(m, off, ICMP_MINLEN,
+ (caddr_t)pd->hdr.icmp);
break;
#endif /* INET */
#ifdef INET6
@@ -3609,7 +3820,8 @@ pf_test_icmp(struct pf_rule **rm, struct pf_state **sm, int direction,
while (r != NULL) {
r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
+ if (r->kif != NULL &&
+ (r->kif != kif && r->kif != kif->pfik_parent) == !r->ifnot)
r = r->skip[PF_SKIP_IFP].ptr;
else if (r->direction && r->direction != direction)
r = r->skip[PF_SKIP_DIR].ptr;
@@ -3617,33 +3829,28 @@ pf_test_icmp(struct pf_rule **rm, struct pf_state **sm, int direction,
r = r->skip[PF_SKIP_AF].ptr;
else if (r->proto && r->proto != pd->proto)
r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, saddr, af,
- r->src.neg, kif))
+ else if (PF_MISMATCHAW(&r->src.addr, saddr, af, r->src.neg))
r = r->skip[PF_SKIP_SRC_ADDR].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, daddr, af,
- r->dst.neg, NULL))
+ else if (PF_MISMATCHAW(&r->dst.addr, daddr, af, r->dst.neg))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
else if (r->type && r->type != icmptype + 1)
r = TAILQ_NEXT(r, entries);
else if (r->code && r->code != icmpcode + 1)
r = TAILQ_NEXT(r, entries);
- else if (r->tos && !(r->tos == pd->tos))
+ else if (r->tos && !(r->tos & pd->tos))
r = TAILQ_NEXT(r, entries);
else if (r->rule_flag & PFRULE_FRAGMENT)
r = TAILQ_NEXT(r, entries);
else if (r->prob && r->prob <= arc4random())
r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
+ else if (r->match_tag && !pf_match_tag(m, r, &pftag, &tag))
r = TAILQ_NEXT(r, entries);
else if (r->os_fingerprint != PF_OSFP_ANY)
r = TAILQ_NEXT(r, entries);
else {
if (r->tag)
tag = r->tag;
- if (r->rtableid >= 0)
- rtableid = r->rtableid;
if (r->anchor == NULL) {
- match = 1;
*rm = r;
*am = a;
*rsm = ruleset;
@@ -3652,11 +3859,11 @@ pf_test_icmp(struct pf_rule **rm, struct pf_state **sm, int direction,
r = TAILQ_NEXT(r, entries);
} else
pf_step_into_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match);
+ PF_RULESET_FILTER, &r, &a);
}
- if (r == NULL && pf_step_out_of_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match))
- break;
+ if (r == NULL)
+ pf_step_out_of_anchor(&asd, &ruleset,
+ PF_RULESET_FILTER, &r, &a);
}
r = *rm;
a = *am;
@@ -3664,20 +3871,19 @@ pf_test_icmp(struct pf_rule **rm, struct pf_state **sm, int direction,
REASON_SET(&reason, PFRES_MATCH);
- if (r->log || (nr != NULL && nr->natpass && nr->log)) {
+ if (r->log) {
#ifdef INET6
if (rewrite)
m_copyback(m, off, sizeof(struct icmp6_hdr),
- pd->hdr.icmp6);
+ (caddr_t)pd->hdr.icmp6);
#endif /* INET6 */
- PFLOG_PACKET(kif, h, m, af, direction, reason, r->log ? r : nr,
- a, ruleset, pd);
+ PFLOG_PACKET(kif, h, m, af, direction, reason, r, a, ruleset);
}
if (r->action != PF_PASS)
return (PF_DROP);
- if (pf_tag_packet(m, pd->pf_mtag, tag, rtableid)) {
+ if (pf_tag_packet(m, pftag, tag)) {
REASON_SET(&reason, PFRES_MEMORY);
return (PF_DROP);
}
@@ -3693,7 +3899,7 @@ pf_test_icmp(struct pf_rule **rm, struct pf_state **sm, int direction,
REASON_SET(&reason, PFRES_MAXSTATES);
goto cleanup;
}
- /* src node for filter rule */
+ /* src node for flter rule */
if ((r->rule_flag & PFRULE_SRCTRACK ||
r->rpool.opts & PF_POOL_STICKYADDR) &&
pf_insert_src_node(&sn, r, saddr, af) != 0) {
@@ -3733,9 +3939,7 @@ cleanup:
s->anchor.ptr = a;
STATE_INC_COUNTERS(s);
s->allow_opts = r->allow_opts;
- s->log = r->log & PF_LOG_ALL;
- if (nr != NULL)
- s->log |= nr->log & PF_LOG_ALL;
+ s->log = r->log & 2;
s->proto = pd->proto;
s->direction = direction;
s->af = af;
@@ -3795,7 +3999,7 @@ cleanup:
/* copy back packet headers if we performed IPv6 NAT operations */
if (rewrite)
m_copyback(m, off, sizeof(struct icmp6_hdr),
- pd->hdr.icmp6);
+ (caddr_t)pd->hdr.icmp6);
#endif /* INET6 */
return (PF_PASS);
@@ -3813,9 +4017,9 @@ pf_test_other(struct pf_rule **rm, struct pf_state **sm, int direction,
struct pf_addr *saddr = pd->src, *daddr = pd->dst;
sa_family_t af = pd->af;
u_short reason;
- int tag = -1, rtableid = -1;
+ struct pf_tag *pftag = NULL;
+ int tag = -1;
int asd = 0;
- int match = 0;
if (pf_check_congestion(ifq)) {
REASON_SET(&reason, PFRES_CONGEST);
@@ -3872,7 +4076,8 @@ pf_test_other(struct pf_rule **rm, struct pf_state **sm, int direction,
while (r != NULL) {
r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
+ if (r->kif != NULL &&
+ (r->kif != kif && r->kif != kif->pfik_parent) == !r->ifnot)
r = r->skip[PF_SKIP_IFP].ptr;
else if (r->direction && r->direction != direction)
r = r->skip[PF_SKIP_DIR].ptr;
@@ -3880,29 +4085,24 @@ pf_test_other(struct pf_rule **rm, struct pf_state **sm, int direction,
r = r->skip[PF_SKIP_AF].ptr;
else if (r->proto && r->proto != pd->proto)
r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, pd->src, af,
- r->src.neg, kif))
+ else if (PF_MISMATCHAW(&r->src.addr, pd->src, af, r->src.neg))
r = r->skip[PF_SKIP_SRC_ADDR].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, pd->dst, af,
- r->dst.neg, NULL))
+ else if (PF_MISMATCHAW(&r->dst.addr, pd->dst, af, r->dst.neg))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
- else if (r->tos && !(r->tos == pd->tos))
+ else if (r->tos && !(r->tos & pd->tos))
r = TAILQ_NEXT(r, entries);
else if (r->rule_flag & PFRULE_FRAGMENT)
r = TAILQ_NEXT(r, entries);
else if (r->prob && r->prob <= arc4random())
r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
+ else if (r->match_tag && !pf_match_tag(m, r, &pftag, &tag))
r = TAILQ_NEXT(r, entries);
else if (r->os_fingerprint != PF_OSFP_ANY)
r = TAILQ_NEXT(r, entries);
else {
if (r->tag)
tag = r->tag;
- if (r->rtableid >= 0)
- rtableid = r->rtableid;
if (r->anchor == NULL) {
- match = 1;
*rm = r;
*am = a;
*rsm = ruleset;
@@ -3911,11 +4111,11 @@ pf_test_other(struct pf_rule **rm, struct pf_state **sm, int direction,
r = TAILQ_NEXT(r, entries);
} else
pf_step_into_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match);
+ PF_RULESET_FILTER, &r, &a);
}
- if (r == NULL && pf_step_out_of_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match))
- break;
+ if (r == NULL)
+ pf_step_out_of_anchor(&asd, &ruleset,
+ PF_RULESET_FILTER, &r, &a);
}
r = *rm;
a = *am;
@@ -3923,9 +4123,8 @@ pf_test_other(struct pf_rule **rm, struct pf_state **sm, int direction,
REASON_SET(&reason, PFRES_MATCH);
- if (r->log || (nr != NULL && nr->natpass && nr->log))
- PFLOG_PACKET(kif, h, m, af, direction, reason, r->log ? r : nr,
- a, ruleset, pd);
+ if (r->log)
+ PFLOG_PACKET(kif, h, m, af, direction, reason, r, a, ruleset);
if ((r->action == PF_DROP) &&
((r->rule_flag & PFRULE_RETURNICMP) ||
@@ -3964,7 +4163,7 @@ pf_test_other(struct pf_rule **rm, struct pf_state **sm, int direction,
if (r->action != PF_PASS)
return (PF_DROP);
- if (pf_tag_packet(m, pd->pf_mtag, tag, rtableid)) {
+ if (pf_tag_packet(m, pftag, tag)) {
REASON_SET(&reason, PFRES_MEMORY);
return (PF_DROP);
}
@@ -3980,7 +4179,7 @@ pf_test_other(struct pf_rule **rm, struct pf_state **sm, int direction,
REASON_SET(&reason, PFRES_MAXSTATES);
goto cleanup;
}
- /* src node for filter rule */
+ /* src node for flter rule */
if ((r->rule_flag & PFRULE_SRCTRACK ||
r->rpool.opts & PF_POOL_STICKYADDR) &&
pf_insert_src_node(&sn, r, saddr, af) != 0) {
@@ -4020,9 +4219,7 @@ cleanup:
s->anchor.ptr = a;
STATE_INC_COUNTERS(s);
s->allow_opts = r->allow_opts;
- s->log = r->log & PF_LOG_ALL;
- if (nr != NULL)
- s->log |= nr->log & PF_LOG_ALL;
+ s->log = r->log & 2;
s->proto = pd->proto;
s->direction = direction;
s->af = af;
@@ -4082,14 +4279,15 @@ pf_test_fragment(struct pf_rule **rm, int direction, struct pfi_kif *kif,
struct pf_ruleset *ruleset = NULL;
sa_family_t af = pd->af;
u_short reason;
+ struct pf_tag *pftag = NULL;
int tag = -1;
int asd = 0;
- int match = 0;
r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_FILTER].active.ptr);
while (r != NULL) {
r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
+ if (r->kif != NULL &&
+ (r->kif != kif && r->kif != kif->pfik_parent) == !r->ifnot)
r = r->skip[PF_SKIP_IFP].ptr;
else if (r->direction && r->direction != direction)
r = r->skip[PF_SKIP_DIR].ptr;
@@ -4097,13 +4295,11 @@ pf_test_fragment(struct pf_rule **rm, int direction, struct pfi_kif *kif,
r = r->skip[PF_SKIP_AF].ptr;
else if (r->proto && r->proto != pd->proto)
r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, pd->src, af,
- r->src.neg, kif))
+ else if (PF_MISMATCHAW(&r->src.addr, pd->src, af, r->src.neg))
r = r->skip[PF_SKIP_SRC_ADDR].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, pd->dst, af,
- r->dst.neg, NULL))
+ else if (PF_MISMATCHAW(&r->dst.addr, pd->dst, af, r->dst.neg))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
- else if (r->tos && !(r->tos == pd->tos))
+ else if (r->tos && !(r->tos & pd->tos))
r = TAILQ_NEXT(r, entries);
else if (r->src.port_op || r->dst.port_op ||
r->flagset || r->type || r->code ||
@@ -4111,11 +4307,10 @@ pf_test_fragment(struct pf_rule **rm, int direction, struct pfi_kif *kif,
r = TAILQ_NEXT(r, entries);
else if (r->prob && r->prob <= arc4random())
r = TAILQ_NEXT(r, entries);
- else if (r->match_tag && !pf_match_tag(m, r, pd->pf_mtag, &tag))
+ else if (r->match_tag && !pf_match_tag(m, r, &pftag, &tag))
r = TAILQ_NEXT(r, entries);
else {
if (r->anchor == NULL) {
- match = 1;
*rm = r;
*am = a;
*rsm = ruleset;
@@ -4124,11 +4319,11 @@ pf_test_fragment(struct pf_rule **rm, int direction, struct pfi_kif *kif,
r = TAILQ_NEXT(r, entries);
} else
pf_step_into_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match);
+ PF_RULESET_FILTER, &r, &a);
}
- if (r == NULL && pf_step_out_of_anchor(&asd, &ruleset,
- PF_RULESET_FILTER, &r, &a, &match))
- break;
+ if (r == NULL)
+ pf_step_out_of_anchor(&asd, &ruleset,
+ PF_RULESET_FILTER, &r, &a);
}
r = *rm;
a = *am;
@@ -4137,13 +4332,12 @@ pf_test_fragment(struct pf_rule **rm, int direction, struct pfi_kif *kif,
REASON_SET(&reason, PFRES_MATCH);
if (r->log)
- PFLOG_PACKET(kif, h, m, af, direction, reason, r, a, ruleset,
- pd);
+ PFLOG_PACKET(kif, h, m, af, direction, reason, r, a, ruleset);
if (r->action != PF_PASS)
return (PF_DROP);
- if (pf_tag_packet(m, pd->pf_mtag, tag, -1)) {
+ if (pf_tag_packet(m, pftag, tag)) {
REASON_SET(&reason, PFRES_MEMORY);
return (PF_DROP);
}
@@ -4156,7 +4350,7 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
struct mbuf *m, int off, void *h, struct pf_pdesc *pd,
u_short *reason)
{
- struct pf_state_cmp key;
+ struct pf_state key;
struct tcphdr *th = pd->hdr.tcp;
u_int16_t win = ntohs(th->th_win);
u_int32_t ack, end, seq, orig_seq;
@@ -4199,11 +4393,15 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
REASON_SET(reason, PFRES_SYNPROXY);
return (PF_DROP);
}
+#ifdef __FreeBSD__
+ pf_send_tcp(NULL, (*state)->rule.ptr, pd->af, pd->dst,
+#else
pf_send_tcp((*state)->rule.ptr, pd->af, pd->dst,
+#endif
pd->src, th->th_dport, th->th_sport,
(*state)->src.seqhi, ntohl(th->th_seq) + 1,
TH_SYN|TH_ACK, 0, (*state)->src.mss, 0, 1,
- 0, NULL, NULL);
+ NULL, NULL);
REASON_SET(reason, PFRES_SYNPROXY);
return (PF_SYNPROXY_DROP);
} else if (!(th->th_flags & TH_ACK) ||
@@ -4238,10 +4436,15 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
(*state)->src.max_win = MAX(ntohs(th->th_win), 1);
if ((*state)->dst.seqhi == 1)
(*state)->dst.seqhi = htonl(arc4random());
+#ifdef __FreeBSD__
+ pf_send_tcp(NULL, (*state)->rule.ptr, pd->af,
+ &src->addr,
+#else
pf_send_tcp((*state)->rule.ptr, pd->af, &src->addr,
+#endif
&dst->addr, src->port, dst->port,
(*state)->dst.seqhi, 0, TH_SYN, 0,
- (*state)->src.mss, 0, 0, (*state)->tag, NULL, NULL);
+ (*state)->src.mss, 0, 0, NULL, NULL);
REASON_SET(reason, PFRES_SYNPROXY);
return (PF_SYNPROXY_DROP);
} else if (((th->th_flags & (TH_SYN|TH_ACK)) !=
@@ -4252,16 +4455,25 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
} else {
(*state)->dst.max_win = MAX(ntohs(th->th_win), 1);
(*state)->dst.seqlo = ntohl(th->th_seq);
+#ifdef __FreeBSD__
+ pf_send_tcp(NULL, (*state)->rule.ptr, pd->af, pd->dst,
+#else
pf_send_tcp((*state)->rule.ptr, pd->af, pd->dst,
+#endif
pd->src, th->th_dport, th->th_sport,
ntohl(th->th_ack), ntohl(th->th_seq) + 1,
TH_ACK, (*state)->src.max_win, 0, 0, 0,
- (*state)->tag, NULL, NULL);
+ NULL, NULL);
+#ifdef __FreeBSD__
+ pf_send_tcp(NULL, (*state)->rule.ptr, pd->af,
+ &src->addr,
+#else
pf_send_tcp((*state)->rule.ptr, pd->af, &src->addr,
+#endif
&dst->addr, src->port, dst->port,
(*state)->src.seqhi + 1, (*state)->src.seqlo + 1,
TH_ACK, (*state)->dst.max_win, 0, 0, 1,
- 0, NULL, NULL);
+ NULL, NULL);
(*state)->src.seqdiff = (*state)->dst.seqhi -
(*state)->src.seqlo;
(*state)->dst.seqdiff = (*state)->src.seqhi -
@@ -4304,7 +4516,7 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
/* Deferred generation of sequence number modulator */
if (dst->seqdiff && !src->seqdiff) {
- while ((src->seqdiff = tcp_rndiss_next() - seq) == 0)
+ while ((src->seqdiff = htonl(arc4random())) == 0)
;
ack = ntohl(th->th_ack) - dst->seqdiff;
pf_change_a(&th->th_seq, &th->th_sum, htonl(seq +
@@ -4393,25 +4605,6 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
ackskew = dst->seqlo - ack;
-
- /*
- * Need to demodulate the sequence numbers in any TCP SACK options
- * (Selective ACK). We could optionally validate the SACK values
- * against the current ACK window, either forwards or backwards, but
- * I'm not confident that SACK has been implemented properly
- * everywhere. It wouldn't surprise me if several stacks accidently
- * SACK too far backwards of previously ACKed data. There really aren't
- * any security implications of bad SACKing unless the target stack
- * doesn't validate the option length correctly. Someone trying to
- * spoof into a TCP connection won't bother blindly sending SACK
- * options anyway.
- */
- if (dst->seqdiff && (th->th_off << 2) > sizeof(struct tcphdr)) {
- if (pf_modulate_sack(m, off, pd, th, dst))
- copyback = 1;
- }
-
-
#define MAXACKWINDOW (0xffff + 1500) /* 1500 is an arbitrary fudge factor */
if (SEQ_GEQ(src->seqhi, end) &&
/* Last octet inside other's window space */
@@ -4422,8 +4615,8 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
(ackskew <= (MAXACKWINDOW << sws)) &&
/* Acking not more than one window forward */
((th->th_flags & TH_RST) == 0 || orig_seq == src->seqlo ||
- (orig_seq == src->seqlo + 1) || (pd->flags & PFDESC_IP_REAS) == 0)) {
- /* Require an exact/+1 sequence match on resets when possible */
+ (pd->flags & PFDESC_IP_REAS) == 0)) {
+ /* Require an exact sequence match on resets when possible */
if (dst->scrub || src->scrub) {
if (pf_normalize_tcp_stateful(m, off, pd, reason, th,
@@ -4469,8 +4662,8 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
if (src->state >= TCPS_FIN_WAIT_2 &&
dst->state >= TCPS_FIN_WAIT_2)
(*state)->timeout = PFTM_TCP_CLOSED;
- else if (src->state >= TCPS_CLOSING &&
- dst->state >= TCPS_CLOSING)
+ else if (src->state >= TCPS_FIN_WAIT_2 ||
+ dst->state >= TCPS_FIN_WAIT_2)
(*state)->timeout = PFTM_TCP_FIN_WAIT;
else if (src->state < TCPS_ESTABLISHED ||
dst->state < TCPS_ESTABLISHED)
@@ -4516,10 +4709,9 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
printf("pf: loose state match: ");
pf_print_state(*state);
pf_print_flags(th->th_flags);
- printf(" seq=%u (%u) ack=%u len=%u ackskew=%d "
- "pkts=%llu:%llu\n", seq, orig_seq, ack, pd->p_len,
- ackskew, (*state)->packets[0],
- (*state)->packets[1]);
+ printf(" seq=%u ack=%u len=%u ackskew=%d pkts=%d:%d\n",
+ seq, ack, pd->p_len, ackskew,
+ (*state)->packets[0], (*state)->packets[1]);
}
if (dst->scrub || src->scrub) {
@@ -4556,11 +4748,15 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
(*state)->src.state == TCPS_SYN_SENT) {
/* Send RST for state mismatches during handshake */
if (!(th->th_flags & TH_RST))
+#ifdef __FreeBSD__
+ pf_send_tcp(m, (*state)->rule.ptr, pd->af,
+#else
pf_send_tcp((*state)->rule.ptr, pd->af,
+#endif
pd->dst, pd->src, th->th_dport,
th->th_sport, ntohl(th->th_ack), 0,
TH_RST, 0, 0,
- (*state)->rule.ptr->return_ttl, 1, 0,
+ (*state)->rule.ptr->return_ttl, 1,
pd->eh, kif->pfik_ifp);
src->seqlo = 0;
src->seqhi = 1;
@@ -4569,9 +4765,8 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
printf("pf: BAD state: ");
pf_print_state(*state);
pf_print_flags(th->th_flags);
- printf(" seq=%u (%u) ack=%u len=%u ackskew=%d "
- "pkts=%llu:%llu dir=%s,%s\n",
- seq, orig_seq, ack, pd->p_len, ackskew,
+ printf(" seq=%u ack=%u len=%u ackskew=%d pkts=%d:%d "
+ "dir=%s,%s\n", seq, ack, pd->p_len, ackskew,
(*state)->packets[0], (*state)->packets[1],
direction == PF_IN ? "in" : "out",
direction == (*state)->direction ? "fwd" : "rev");
@@ -4600,10 +4795,10 @@ pf_test_state_tcp(struct pf_state **state, int direction, struct pfi_kif *kif,
pf_change_ap(pd->dst, &th->th_dport, pd->ip_sum,
&th->th_sum, &(*state)->lan.addr,
(*state)->lan.port, 0, pd->af);
- m_copyback(m, off, sizeof(*th), th);
+ m_copyback(m, off, sizeof(*th), (caddr_t)th);
} else if (copyback) {
/* Copyback sequence modulation or stateful scrub changes */
- m_copyback(m, off, sizeof(*th), th);
+ m_copyback(m, off, sizeof(*th), (caddr_t)th);
}
return (PF_PASS);
@@ -4614,7 +4809,7 @@ pf_test_state_udp(struct pf_state **state, int direction, struct pfi_kif *kif,
struct mbuf *m, int off, void *h, struct pf_pdesc *pd)
{
struct pf_state_peer *src, *dst;
- struct pf_state_cmp key;
+ struct pf_state key;
struct udphdr *uh = pd->hdr.udp;
key.af = pd->af;
@@ -4664,7 +4859,7 @@ pf_test_state_udp(struct pf_state **state, int direction, struct pfi_kif *kif,
pf_change_ap(pd->dst, &uh->uh_dport, pd->ip_sum,
&uh->uh_sum, &(*state)->lan.addr,
(*state)->lan.port, 1, pd->af);
- m_copyback(m, off, sizeof(*uh), uh);
+ m_copyback(m, off, sizeof(*uh), (caddr_t)uh);
}
return (PF_PASS);
@@ -4675,10 +4870,10 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
struct mbuf *m, int off, void *h, struct pf_pdesc *pd, u_short *reason)
{
struct pf_addr *saddr = pd->src, *daddr = pd->dst;
- u_int16_t icmpid, *icmpsum;
- u_int8_t icmptype;
+ u_int16_t icmpid = 0; /* make the compiler happy */
+ u_int16_t *icmpsum = NULL; /* make the compiler happy */
+ u_int8_t icmptype = 0; /* make the compiler happy */
int state_icmp = 0;
- struct pf_state_cmp key;
switch (pd->proto) {
#ifdef INET
@@ -4716,6 +4911,8 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
* ICMP query/reply message not related to a TCP/UDP packet.
* Search for an ICMP state.
*/
+ struct pf_state key;
+
key.af = pd->af;
key.proto = pd->proto;
if (direction == PF_IN) {
@@ -4751,7 +4948,7 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
pd->hdr.icmp->icmp_id =
(*state)->gwy.port;
m_copyback(m, off, ICMP_MINLEN,
- pd->hdr.icmp);
+ (caddr_t)pd->hdr.icmp);
break;
#endif /* INET */
#ifdef INET6
@@ -4761,7 +4958,7 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
&(*state)->gwy.addr, 0);
m_copyback(m, off,
sizeof(struct icmp6_hdr),
- pd->hdr.icmp6);
+ (caddr_t)pd->hdr.icmp6);
break;
#endif /* INET6 */
}
@@ -4779,7 +4976,7 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
pd->hdr.icmp->icmp_id =
(*state)->lan.port;
m_copyback(m, off, ICMP_MINLEN,
- pd->hdr.icmp);
+ (caddr_t)pd->hdr.icmp);
break;
#endif /* INET */
#ifdef INET6
@@ -4789,7 +4986,7 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
&(*state)->lan.addr, 0);
m_copyback(m, off,
sizeof(struct icmp6_hdr),
- pd->hdr.icmp6);
+ (caddr_t)pd->hdr.icmp6);
break;
#endif /* INET6 */
}
@@ -4812,8 +5009,8 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
struct ip6_hdr h2_6;
int terminal = 0;
#endif /* INET6 */
- int ipoff2;
- int off2;
+ int ipoff2 = 0; /* make the compiler happy */
+ int off2 = 0; /* make the compiler happy */
pd2.af = pd->af;
switch (pd->af) {
@@ -4907,6 +5104,7 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
case IPPROTO_TCP: {
struct tcphdr th;
u_int32_t seq;
+ struct pf_state key;
struct pf_state_peer *src, *dst;
u_int8_t dws;
int copyback = 0;
@@ -5000,22 +5198,22 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
#ifdef INET
case AF_INET:
m_copyback(m, off, ICMP_MINLEN,
- pd->hdr.icmp);
+ (caddr_t)pd->hdr.icmp);
m_copyback(m, ipoff2, sizeof(h2),
- &h2);
+ (caddr_t)&h2);
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
m_copyback(m, off,
sizeof(struct icmp6_hdr),
- pd->hdr.icmp6);
+ (caddr_t)pd->hdr.icmp6);
m_copyback(m, ipoff2, sizeof(h2_6),
- &h2_6);
+ (caddr_t)&h2_6);
break;
#endif /* INET6 */
}
- m_copyback(m, off2, 8, &th);
+ m_copyback(m, off2, 8, (caddr_t)&th);
}
return (PF_PASS);
@@ -5023,6 +5221,7 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
}
case IPPROTO_UDP: {
struct udphdr uh;
+ struct pf_state key;
if (!pf_pull_hdr(m, off2, &uh, sizeof(uh),
NULL, reason, pd2.af)) {
@@ -5066,21 +5265,23 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
#ifdef INET
case AF_INET:
m_copyback(m, off, ICMP_MINLEN,
- pd->hdr.icmp);
- m_copyback(m, ipoff2, sizeof(h2), &h2);
+ (caddr_t)pd->hdr.icmp);
+ m_copyback(m, ipoff2, sizeof(h2),
+ (caddr_t)&h2);
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
m_copyback(m, off,
sizeof(struct icmp6_hdr),
- pd->hdr.icmp6);
+ (caddr_t)pd->hdr.icmp6);
m_copyback(m, ipoff2, sizeof(h2_6),
- &h2_6);
+ (caddr_t)&h2_6);
break;
#endif /* INET6 */
}
- m_copyback(m, off2, sizeof(uh), &uh);
+ m_copyback(m, off2, sizeof(uh),
+ (caddr_t)&uh);
}
return (PF_PASS);
@@ -5089,6 +5290,7 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
#ifdef INET
case IPPROTO_ICMP: {
struct icmp iih;
+ struct pf_state key;
if (!pf_pull_hdr(m, off2, &iih, ICMP_MINLEN,
NULL, reason, pd2.af)) {
@@ -5128,9 +5330,12 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
pd2.ip_sum, icmpsum,
pd->ip_sum, 0, AF_INET);
}
- m_copyback(m, off, ICMP_MINLEN, pd->hdr.icmp);
- m_copyback(m, ipoff2, sizeof(h2), &h2);
- m_copyback(m, off2, ICMP_MINLEN, &iih);
+ m_copyback(m, off, ICMP_MINLEN,
+ (caddr_t)pd->hdr.icmp);
+ m_copyback(m, ipoff2, sizeof(h2),
+ (caddr_t)&h2);
+ m_copyback(m, off2, ICMP_MINLEN,
+ (caddr_t)&iih);
}
return (PF_PASS);
@@ -5140,6 +5345,7 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
#ifdef INET6
case IPPROTO_ICMPV6: {
struct icmp6_hdr iih;
+ struct pf_state key;
if (!pf_pull_hdr(m, off2, &iih,
sizeof(struct icmp6_hdr), NULL, reason, pd2.af)) {
@@ -5180,10 +5386,11 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
pd->ip_sum, 0, AF_INET6);
}
m_copyback(m, off, sizeof(struct icmp6_hdr),
- pd->hdr.icmp6);
- m_copyback(m, ipoff2, sizeof(h2_6), &h2_6);
+ (caddr_t)pd->hdr.icmp6);
+ m_copyback(m, ipoff2, sizeof(h2_6),
+ (caddr_t)&h2_6);
m_copyback(m, off2, sizeof(struct icmp6_hdr),
- &iih);
+ (caddr_t)&iih);
}
return (PF_PASS);
@@ -5191,6 +5398,8 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
}
#endif /* INET6 */
default: {
+ struct pf_state key;
+
key.af = pd2.af;
key.proto = pd2.proto;
if (direction == PF_IN) {
@@ -5225,17 +5434,18 @@ pf_test_state_icmp(struct pf_state **state, int direction, struct pfi_kif *kif,
#ifdef INET
case AF_INET:
m_copyback(m, off, ICMP_MINLEN,
- pd->hdr.icmp);
- m_copyback(m, ipoff2, sizeof(h2), &h2);
+ (caddr_t)pd->hdr.icmp);
+ m_copyback(m, ipoff2, sizeof(h2),
+ (caddr_t)&h2);
break;
#endif /* INET */
#ifdef INET6
case AF_INET6:
m_copyback(m, off,
sizeof(struct icmp6_hdr),
- pd->hdr.icmp6);
+ (caddr_t)pd->hdr.icmp6);
m_copyback(m, ipoff2, sizeof(h2_6),
- &h2_6);
+ (caddr_t)&h2_6);
break;
#endif /* INET6 */
}
@@ -5253,7 +5463,7 @@ pf_test_state_other(struct pf_state **state, int direction, struct pfi_kif *kif,
struct pf_pdesc *pd)
{
struct pf_state_peer *src, *dst;
- struct pf_state_cmp key;
+ struct pf_state key;
key.af = pd->af;
key.proto = pd->proto;
@@ -5381,24 +5591,16 @@ pf_pull_hdr(struct mbuf *m, int off, void *p, int len,
}
int
-pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *kif)
+pf_routable(struct pf_addr *addr, sa_family_t af)
{
struct sockaddr_in *dst;
- int ret = 1;
- int check_mpath;
- extern int ipmultipath;
#ifdef INET6
- extern int ip6_multipath;
struct sockaddr_in6 *dst6;
struct route_in6 ro;
#else
struct route ro;
#endif
- struct radix_node *rn;
- struct rtentry *rt;
- struct ifnet *ifp;
- check_mpath = 0;
bzero(&ro, sizeof(ro));
switch (af) {
case AF_INET:
@@ -5406,8 +5608,6 @@ pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *kif)
dst->sin_family = AF_INET;
dst->sin_len = sizeof(*dst);
dst->sin_addr = addr->v4;
- if (ipmultipath)
- check_mpath = 1;
break;
#ifdef INET6
case AF_INET6:
@@ -5415,50 +5615,28 @@ pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *kif)
dst6->sin6_family = AF_INET6;
dst6->sin6_len = sizeof(*dst6);
dst6->sin6_addr = addr->v6;
- if (ip6_multipath)
- check_mpath = 1;
break;
#endif /* INET6 */
default:
return (0);
}
- /* Skip checks for ipsec interfaces */
- if (kif != NULL && kif->pfik_ifp->if_type == IFT_ENC)
- goto out;
-
+#ifdef __FreeBSD__
+#ifdef RTF_PRCLONING
+ rtalloc_ign((struct route *)&ro, (RTF_CLONING | RTF_PRCLONING));
+#else /* !RTF_PRCLONING */
+ rtalloc_ign((struct route *)&ro, RTF_CLONING);
+#endif
+#else /* ! __FreeBSD__ */
rtalloc_noclone((struct route *)&ro, NO_CLONING);
+#endif
if (ro.ro_rt != NULL) {
- /* No interface given, this is a no-route check */
- if (kif == NULL)
- goto out;
-
- if (kif->pfik_ifp == NULL) {
- ret = 0;
- goto out;
- }
-
- /* Perform uRPF check if passed input interface */
- ret = 0;
- rn = (struct radix_node *)ro.ro_rt;
- do {
- rt = (struct rtentry *)rn;
- if (rt->rt_ifp->if_type == IFT_CARP)
- ifp = rt->rt_ifp->if_carpdev;
- else
- ifp = rt->rt_ifp;
-
- if (kif->pfik_ifp == ifp)
- ret = 1;
- rn = rn_mpath_next(rn);
- } while (check_mpath == 1 && rn != NULL && ret == 0);
- } else
- ret = 0;
-out:
- if (ro.ro_rt != NULL)
RTFREE(ro.ro_rt);
- return (ret);
+ return (1);
+ }
+
+ return (0);
}
int
@@ -5493,11 +5671,23 @@ pf_rtlabel_match(struct pf_addr *addr, sa_family_t af, struct pf_addr_wrap *aw)
return (0);
}
+#ifdef __FreeBSD__
+# ifdef RTF_PRCLONING
+ rtalloc_ign((struct route *)&ro, (RTF_CLONING|RTF_PRCLONING));
+# else /* !RTF_PRCLONING */
+ rtalloc_ign((struct route *)&ro, RTF_CLONING);
+# endif
+#else /* ! __FreeBSD__ */
rtalloc_noclone((struct route *)&ro, NO_CLONING);
+#endif
if (ro.ro_rt != NULL) {
+#ifdef __FreeBSD__
+ /* XXX_IMPORT: later */
+#else
if (ro.ro_rt->rt_labelid == aw->v.rtlabel)
ret = 1;
+#endif
RTFREE(ro.ro_rt);
}
@@ -5505,35 +5695,53 @@ pf_rtlabel_match(struct pf_addr *addr, sa_family_t af, struct pf_addr_wrap *aw)
}
#ifdef INET
+
void
pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
- struct pf_state *s, struct pf_pdesc *pd)
+ struct pf_state *s)
{
struct mbuf *m0, *m1;
+ struct m_tag *mtag;
struct route iproute;
- struct route *ro = NULL;
+ struct route *ro = NULL; /* XXX: was uninitialized */
struct sockaddr_in *dst;
struct ip *ip;
struct ifnet *ifp = NULL;
struct pf_addr naddr;
struct pf_src_node *sn = NULL;
int error = 0;
-#ifdef IPSEC
- struct m_tag *mtag;
-#endif /* IPSEC */
+#ifdef __FreeBSD__
+ int sw_csum;
+#endif
if (m == NULL || *m == NULL || r == NULL ||
(dir != PF_IN && dir != PF_OUT) || oifp == NULL)
panic("pf_route: invalid parameters");
- if (pd->pf_mtag->routed++ > 3) {
- m0 = *m;
- *m = NULL;
- goto bad;
+ if ((mtag = m_tag_find(*m, PACKET_TAG_PF_ROUTED, NULL)) == NULL) {
+ if ((mtag = m_tag_get(PACKET_TAG_PF_ROUTED, 1, M_NOWAIT)) ==
+ NULL) {
+ m0 = *m;
+ *m = NULL;
+ goto bad;
+ }
+ *(char *)(mtag + 1) = 1;
+ m_tag_prepend(*m, mtag);
+ } else {
+ if (*(char *)(mtag + 1) > 3) {
+ m0 = *m;
+ *m = NULL;
+ goto bad;
+ }
+ (*(char *)(mtag + 1))++;
}
if (r->rt == PF_DUPTO) {
+#ifdef __FreeBSD__
+ if ((m0 = m_dup(*m, M_DONTWAIT)) == NULL)
+#else
if ((m0 = m_copym2(*m, 0, M_COPYALL, M_NOWAIT)) == NULL)
+#endif
return;
} else {
if ((r->rt == PF_REPLYTO) == (r->direction == dir))
@@ -5592,10 +5800,22 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
goto bad;
if (oifp != ifp) {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+ if (pf_test(PF_OUT, ifp, &m0, NULL, NULL) != PF_PASS) {
+ PF_LOCK();
+ goto bad;
+ } else if (m0 == NULL) {
+ PF_LOCK();
+ goto done;
+ }
+ PF_LOCK();
+#else
if (pf_test(PF_OUT, ifp, &m0, NULL) != PF_PASS)
goto bad;
else if (m0 == NULL)
goto done;
+#endif
if (m0->m_len < sizeof(struct ip)) {
DPFPRINTF(PF_DEBUG_URGENT,
("pf_route: m0->m_len < sizeof(struct ip)\n"));
@@ -5604,6 +5824,47 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
ip = mtod(m0, struct ip *);
}
+#ifdef __FreeBSD__
+ /* Copied from FreeBSD 5.1-CURRENT ip_output. */
+ m0->m_pkthdr.csum_flags |= CSUM_IP;
+ sw_csum = m0->m_pkthdr.csum_flags & ~ifp->if_hwassist;
+ if (sw_csum & CSUM_DELAY_DATA) {
+ /*
+ * XXX: in_delayed_cksum assumes HBO for ip->ip_len (at least)
+ */
+ NTOHS(ip->ip_len);
+ NTOHS(ip->ip_off); /* XXX: needed? */
+ in_delayed_cksum(m0);
+ HTONS(ip->ip_len);
+ HTONS(ip->ip_off);
+ sw_csum &= ~CSUM_DELAY_DATA;
+ }
+ m0->m_pkthdr.csum_flags &= ifp->if_hwassist;
+
+ if (ntohs(ip->ip_len) <= ifp->if_mtu ||
+ (ifp->if_hwassist & CSUM_FRAGMENT &&
+ ((ip->ip_off & htons(IP_DF)) == 0))) {
+ /*
+ * ip->ip_len = htons(ip->ip_len);
+ * ip->ip_off = htons(ip->ip_off);
+ */
+ ip->ip_sum = 0;
+ if (sw_csum & CSUM_DELAY_IP) {
+ /* From KAME */
+ if (ip->ip_v == IPVERSION &&
+ (ip->ip_hl << 2) == sizeof(*ip)) {
+ ip->ip_sum = in_cksum_hdr(ip);
+ } else {
+ ip->ip_sum = in_cksum(m0, ip->ip_hl << 2);
+ }
+ }
+ PF_UNLOCK();
+ error = (*ifp->if_output)(ifp, m0, sintosa(dst), ro->ro_rt);
+ PF_LOCK();
+ goto done;
+ }
+
+#else
/* Copied from ip_output. */
#ifdef IPSEC
/*
@@ -5619,38 +5880,38 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
#endif /* IPSEC */
/* Catch routing changes wrt. hardware checksumming for TCP or UDP. */
- if (m0->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT) {
+ if (m0->m_pkthdr.csum & M_TCPV4_CSUM_OUT) {
if (!(ifp->if_capabilities & IFCAP_CSUM_TCPv4) ||
ifp->if_bridge != NULL) {
in_delayed_cksum(m0);
- m0->m_pkthdr.csum_flags &= ~M_TCPV4_CSUM_OUT; /* Clear */
+ m0->m_pkthdr.csum &= ~M_TCPV4_CSUM_OUT; /* Clear */
}
- } else if (m0->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT) {
+ } else if (m0->m_pkthdr.csum & M_UDPV4_CSUM_OUT) {
if (!(ifp->if_capabilities & IFCAP_CSUM_UDPv4) ||
ifp->if_bridge != NULL) {
in_delayed_cksum(m0);
- m0->m_pkthdr.csum_flags &= ~M_UDPV4_CSUM_OUT; /* Clear */
+ m0->m_pkthdr.csum &= ~M_UDPV4_CSUM_OUT; /* Clear */
}
}
if (ntohs(ip->ip_len) <= ifp->if_mtu) {
if ((ifp->if_capabilities & IFCAP_CSUM_IPv4) &&
ifp->if_bridge == NULL) {
- m0->m_pkthdr.csum_flags |= M_IPV4_CSUM_OUT;
+ m0->m_pkthdr.csum |= M_IPV4_CSUM_OUT;
ipstat.ips_outhwcsum++;
} else {
ip->ip_sum = 0;
ip->ip_sum = in_cksum(m0, ip->ip_hl << 2);
}
/* Update relevant hardware checksum stats for TCP/UDP */
- if (m0->m_pkthdr.csum_flags & M_TCPV4_CSUM_OUT)
+ if (m0->m_pkthdr.csum & M_TCPV4_CSUM_OUT)
tcpstat.tcps_outhwcsum++;
- else if (m0->m_pkthdr.csum_flags & M_UDPV4_CSUM_OUT)
+ else if (m0->m_pkthdr.csum & M_UDPV4_CSUM_OUT)
udpstat.udps_outhwcsum++;
error = (*ifp->if_output)(ifp, m0, sintosa(dst), NULL);
goto done;
}
-
+#endif
/*
* Too large for interface; fragment if possible.
* Must be able to put at least 8 bytes per fragment.
@@ -5658,27 +5919,57 @@ pf_route(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
if (ip->ip_off & htons(IP_DF)) {
ipstat.ips_cantfrag++;
if (r->rt != PF_DUPTO) {
+#ifdef __FreeBSD__
+ /* icmp_error() expects host byte ordering */
+ NTOHS(ip->ip_len);
+ NTOHS(ip->ip_off);
+ PF_UNLOCK();
icmp_error(m0, ICMP_UNREACH, ICMP_UNREACH_NEEDFRAG, 0,
ifp->if_mtu);
+ PF_LOCK();
+#else
+ icmp_error(m0, ICMP_UNREACH, ICMP_UNREACH_NEEDFRAG, 0,
+ ifp);
+#endif
goto done;
} else
goto bad;
}
m1 = m0;
+#ifdef __FreeBSD__
+ /*
+ * XXX: is cheaper + less error prone than own function
+ */
+ NTOHS(ip->ip_len);
+ NTOHS(ip->ip_off);
+ error = ip_fragment(ip, &m0, ifp->if_mtu, ifp->if_hwassist, sw_csum);
+#else
error = ip_fragment(m0, ifp, ifp->if_mtu);
+#endif
if (error) {
+#ifndef __FreeBSD__ /* ip_fragment does not do m_freem() on FreeBSD */
m0 = NULL;
+#endif
goto bad;
}
for (m0 = m1; m0; m0 = m1) {
m1 = m0->m_nextpkt;
m0->m_nextpkt = 0;
+#ifdef __FreeBSD__
+ if (error == 0) {
+ PF_UNLOCK();
+ error = (*ifp->if_output)(ifp, m0, sintosa(dst),
+ NULL);
+ PF_LOCK();
+ } else
+#else
if (error == 0)
error = (*ifp->if_output)(ifp, m0, sintosa(dst),
NULL);
else
+#endif
m_freem(m0);
}
@@ -5701,9 +5992,10 @@ bad:
#ifdef INET6
void
pf_route6(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
- struct pf_state *s, struct pf_pdesc *pd)
+ struct pf_state *s)
{
struct mbuf *m0;
+ struct m_tag *mtag;
struct route_in6 ip6route;
struct route_in6 *ro;
struct sockaddr_in6 *dst;
@@ -5717,14 +6009,30 @@ pf_route6(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
(dir != PF_IN && dir != PF_OUT) || oifp == NULL)
panic("pf_route6: invalid parameters");
- if (pd->pf_mtag->routed++ > 3) {
- m0 = *m;
- *m = NULL;
- goto bad;
+ if ((mtag = m_tag_find(*m, PACKET_TAG_PF_ROUTED, NULL)) == NULL) {
+ if ((mtag = m_tag_get(PACKET_TAG_PF_ROUTED, 1, M_NOWAIT)) ==
+ NULL) {
+ m0 = *m;
+ *m = NULL;
+ goto bad;
+ }
+ *(char *)(mtag + 1) = 1;
+ m_tag_prepend(*m, mtag);
+ } else {
+ if (*(char *)(mtag + 1) > 3) {
+ m0 = *m;
+ *m = NULL;
+ goto bad;
+ }
+ (*(char *)(mtag + 1))++;
}
if (r->rt == PF_DUPTO) {
+#ifdef __FreeBSD__
+ if ((m0 = m_dup(*m, M_DONTWAIT)) == NULL)
+#else
if ((m0 = m_copym2(*m, 0, M_COPYALL, M_NOWAIT)) == NULL)
+#endif
return;
} else {
if ((r->rt == PF_REPLYTO) == (r->direction == dir))
@@ -5746,10 +6054,20 @@ pf_route6(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
dst->sin6_len = sizeof(*dst);
dst->sin6_addr = ip6->ip6_dst;
- /* Cheat. XXX why only in the v6 case??? */
+ /* Cheat. */
if (r->rt == PF_FASTROUTE) {
- pd->pf_mtag->flags |= PF_TAG_GENERATED;
+#ifdef __FreeBSD__
+ m0->m_flags |= M_SKIP_FIREWALL;
+ PF_UNLOCK();
+ ip6_output(m0, NULL, NULL, 0, NULL, NULL, NULL);
+ PF_LOCK();
+#else
+ mtag = m_tag_get(PACKET_TAG_PF_GENERATED, 0, M_NOWAIT);
+ if (mtag == NULL)
+ goto bad;
+ m_tag_prepend(m0, mtag);
ip6_output(m0, NULL, NULL, 0, NULL, NULL);
+#endif
return;
}
@@ -5775,10 +6093,22 @@ pf_route6(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
goto bad;
if (oifp != ifp) {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+ if (pf_test6(PF_OUT, ifp, &m0, NULL, NULL) != PF_PASS) {
+ PF_LOCK();
+ goto bad;
+ } else if (m0 == NULL) {
+ PF_LOCK();
+ goto done;
+ }
+ PF_LOCK();
+#else
if (pf_test6(PF_OUT, ifp, &m0, NULL) != PF_PASS)
goto bad;
else if (m0 == NULL)
goto done;
+#endif
if (m0->m_len < sizeof(struct ip6_hdr)) {
DPFPRINTF(PF_DEBUG_URGENT,
("pf_route6: m0->m_len < sizeof(struct ip6_hdr)\n"));
@@ -5791,15 +6121,29 @@ pf_route6(struct mbuf **m, struct pf_rule *r, int dir, struct ifnet *oifp,
* If the packet is too large for the outgoing interface,
* send back an icmp6 error.
*/
- if (IN6_IS_SCOPE_EMBED(&dst->sin6_addr))
+ if (IN6_IS_ADDR_LINKLOCAL(&dst->sin6_addr))
dst->sin6_addr.s6_addr16[1] = htons(ifp->if_index);
if ((u_long)m0->m_pkthdr.len <= ifp->if_mtu) {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
error = nd6_output(ifp, ifp, m0, dst, NULL);
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
} else {
in6_ifstat_inc(ifp, ifs6_in_toobig);
+#ifdef __FreeBSD__
+ if (r->rt != PF_DUPTO) {
+ PF_UNLOCK();
+ icmp6_error(m0, ICMP6_PACKET_TOO_BIG, 0, ifp->if_mtu);
+ PF_LOCK();
+ } else
+#else
if (r->rt != PF_DUPTO)
icmp6_error(m0, ICMP6_PACKET_TOO_BIG, 0, ifp->if_mtu);
else
+#endif
goto bad;
}
@@ -5815,6 +6159,131 @@ bad:
#endif /* INET6 */
+#ifdef __FreeBSD__
+/*
+ * FreeBSD supports cksum offloads for the following drivers.
+ * em(4), fxp(4), ixgb(4), lge(4), ndis(4), nge(4), re(4),
+ * ti(4), txp(4), xl(4)
+ *
+ * CSUM_DATA_VALID | CSUM_PSEUDO_HDR :
+ * network driver performed cksum including pseudo header, need to verify
+ * csum_data
+ * CSUM_DATA_VALID :
+ * network driver performed cksum, needs to additional pseudo header
+ * cksum computation with partial csum_data(i.e. lack of H/W support for
+ * pseudo header, for instance hme(4), sk(4) and possibly gem(4))
+ *
+ * After validating the cksum of packet, set both flag CSUM_DATA_VALID and
+ * CSUM_PSEUDO_HDR in order to avoid recomputation of the cksum in upper
+ * TCP/UDP layer.
+ * Also, set csum_data to 0xffff to force cksum validation.
+ */
+int
+pf_check_proto_cksum(struct mbuf *m, int off, int len, u_int8_t p, sa_family_t af)
+{
+ u_int16_t sum = 0;
+ int hw_assist = 0;
+ struct ip *ip;
+
+ if (off < sizeof(struct ip) || len < sizeof(struct udphdr))
+ return (1);
+ if (m->m_pkthdr.len < off + len)
+ return (1);
+
+ switch (p) {
+ case IPPROTO_TCP:
+ if (m->m_pkthdr.csum_flags & CSUM_DATA_VALID) {
+ if (m->m_pkthdr.csum_flags & CSUM_PSEUDO_HDR) {
+ sum = m->m_pkthdr.csum_data;
+ } else {
+ ip = mtod(m, struct ip *);
+ sum = in_pseudo(ip->ip_src.s_addr,
+ ip->ip_dst.s_addr, htonl((u_short)len +
+ m->m_pkthdr.csum_data + IPPROTO_TCP));
+ }
+ sum ^= 0xffff;
+ ++hw_assist;
+ }
+ break;
+ case IPPROTO_UDP:
+ if (m->m_pkthdr.csum_flags & CSUM_DATA_VALID) {
+ if (m->m_pkthdr.csum_flags & CSUM_PSEUDO_HDR) {
+ sum = m->m_pkthdr.csum_data;
+ } else {
+ ip = mtod(m, struct ip *);
+ sum = in_pseudo(ip->ip_src.s_addr,
+ ip->ip_dst.s_addr, htonl((u_short)len +
+ m->m_pkthdr.csum_data + IPPROTO_UDP));
+ }
+ sum ^= 0xffff;
+ ++hw_assist;
+ }
+ break;
+ case IPPROTO_ICMP:
+#ifdef INET6
+ case IPPROTO_ICMPV6:
+#endif /* INET6 */
+ break;
+ default:
+ return (1);
+ }
+
+ if (!hw_assist) {
+ switch (af) {
+ case AF_INET:
+ if (p == IPPROTO_ICMP) {
+ if (m->m_len < off)
+ return (1);
+ m->m_data += off;
+ m->m_len -= off;
+ sum = in_cksum(m, len);
+ m->m_data -= off;
+ m->m_len += off;
+ } else {
+ if (m->m_len < sizeof(struct ip))
+ return (1);
+ sum = in4_cksum(m, p, off, len);
+ }
+ break;
+#ifdef INET6
+ case AF_INET6:
+ if (m->m_len < sizeof(struct ip6_hdr))
+ return (1);
+ sum = in6_cksum(m, p, off, len);
+ break;
+#endif /* INET6 */
+ default:
+ return (1);
+ }
+ }
+ if (sum) {
+ switch (p) {
+ case IPPROTO_TCP:
+ tcpstat.tcps_rcvbadsum++;
+ break;
+ case IPPROTO_UDP:
+ udpstat.udps_badsum++;
+ break;
+ case IPPROTO_ICMP:
+ icmpstat.icps_checksum++;
+ break;
+#ifdef INET6
+ case IPPROTO_ICMPV6:
+ icmp6stat.icp6s_checksum++;
+ break;
+#endif /* INET6 */
+ }
+ return (1);
+ } else {
+ if (p == IPPROTO_TCP || p == IPPROTO_UDP) {
+ m->m_pkthdr.csum_flags |=
+ (CSUM_DATA_VALID | CSUM_PSEUDO_HDR);
+ m->m_pkthdr.csum_data = 0xffff;
+ }
+ }
+ return (0);
+}
+#else
/*
* check protocol (tcp/udp/icmp/icmp6) checksum and set mbuf flag
* off is the offset where the protocol header starts
@@ -5846,9 +6315,9 @@ pf_check_proto_cksum(struct mbuf *m, int off, int len, u_int8_t p,
default:
return (1);
}
- if (m->m_pkthdr.csum_flags & flag_ok)
+ if (m->m_pkthdr.csum & flag_ok)
return (0);
- if (m->m_pkthdr.csum_flags & flag_bad)
+ if (m->m_pkthdr.csum & flag_bad)
return (1);
if (off < sizeof(struct ip) || len < sizeof(struct udphdr))
return (1);
@@ -5883,7 +6352,7 @@ pf_check_proto_cksum(struct mbuf *m, int off, int len, u_int8_t p,
return (1);
}
if (sum) {
- m->m_pkthdr.csum_flags |= flag_bad;
+ m->m_pkthdr.csum |= flag_bad;
switch (p) {
case IPPROTO_TCP:
tcpstat.tcps_rcvbadsum++;
@@ -5902,54 +6371,91 @@ pf_check_proto_cksum(struct mbuf *m, int off, int len, u_int8_t p,
}
return (1);
}
- m->m_pkthdr.csum_flags |= flag_ok;
+ m->m_pkthdr.csum |= flag_ok;
+ return (0);
+}
+#endif
+
+static int
+pf_add_mbuf_tag(struct mbuf *m, u_int tag)
+{
+ struct m_tag *mtag;
+
+ if (m_tag_find(m, tag, NULL) != NULL)
+ return (0);
+ mtag = m_tag_get(tag, 0, M_NOWAIT);
+ if (mtag == NULL)
+ return (1);
+ m_tag_prepend(m, mtag);
return (0);
}
#ifdef INET
int
+#ifdef __FreeBSD__
+pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
+ struct ether_header *eh, struct inpcb *inp)
+#else
pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
struct ether_header *eh)
+#endif
{
struct pfi_kif *kif;
u_short action, reason = 0, log = 0;
struct mbuf *m = *m0;
- struct ip *h;
+ struct ip *h = NULL; /* make the compiler happy */
struct pf_rule *a = NULL, *r = &pf_default_rule, *tr, *nr;
struct pf_state *s = NULL;
struct pf_ruleset *ruleset = NULL;
struct pf_pdesc pd;
int off, dirndx, pqid = 0;
- if (!pf_status.running)
- return (PF_PASS);
-
- memset(&pd, 0, sizeof(pd));
- if ((pd.pf_mtag = pf_get_mtag(m)) == NULL) {
- DPFPRINTF(PF_DEBUG_URGENT,
- ("pf_test: pf_get_mtag returned NULL\n"));
- return (PF_DROP);
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
+ if (!pf_status.running ||
+#ifdef __FreeBSD__
+ (m->m_flags & M_SKIP_FIREWALL)) {
+ PF_UNLOCK();
+#else
+ (m_tag_find(m, PACKET_TAG_PF_GENERATED, NULL) != NULL)) {
+#endif
+ return (PF_PASS);
}
- if (pd.pf_mtag->flags & PF_TAG_GENERATED)
- return (PF_PASS);
+#ifdef __FreeBSD__
+ /* XXX_IMPORT: later */
+#else
if (ifp->if_type == IFT_CARP && ifp->if_carpdev)
ifp = ifp->if_carpdev;
+#endif
- kif = (struct pfi_kif *)ifp->if_pf_kif;
+ kif = pfi_index2kif[ifp->if_index];
if (kif == NULL) {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
DPFPRINTF(PF_DEBUG_URGENT,
("pf_test: kif == NULL, if_xname %s\n", ifp->if_xname));
return (PF_DROP);
}
- if (kif->pfik_flags & PFI_IFLAG_SKIP)
+ if (kif->pfik_flags & PFI_IFLAG_SKIP) {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
return (PF_PASS);
+ }
+#ifdef __FreeBSD__
+ M_ASSERTPKTHDR(m);
+#else
#ifdef DIAGNOSTIC
if ((m->m_flags & M_PKTHDR) == 0)
panic("non-M_PKTHDR is passed to pf_test");
#endif /* DIAGNOSTIC */
+#endif /* __FreeBSD__ */
+ memset(&pd, 0, sizeof(pd));
if (m->m_pkthdr.len < (int)sizeof(*h)) {
action = PF_DROP;
REASON_SET(&reason, PFRES_SHORT);
@@ -6003,7 +6509,6 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
}
if (dir == PF_IN && pf_check_proto_cksum(m, off,
ntohs(h->ip_len) - off, IPPROTO_TCP, AF_INET)) {
- REASON_SET(&reason, PFRES_PROTCKSUM);
action = PF_DROP;
goto done;
}
@@ -6023,8 +6528,13 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
+#ifdef __FreeBSD__
+ action = pf_test_tcp(&r, &s, dir, kif,
+ m, off, h, &pd, &a, &ruleset, NULL, inp);
+#else
action = pf_test_tcp(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ipintrq);
+#endif
break;
}
@@ -6040,14 +6550,12 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
if (dir == PF_IN && uh.uh_sum && pf_check_proto_cksum(m,
off, ntohs(h->ip_len) - off, IPPROTO_UDP, AF_INET)) {
action = PF_DROP;
- REASON_SET(&reason, PFRES_PROTCKSUM);
goto done;
}
if (uh.uh_dport == 0 ||
ntohs(uh.uh_ulen) > m->m_pkthdr.len - off ||
ntohs(uh.uh_ulen) < sizeof(struct udphdr)) {
action = PF_DROP;
- REASON_SET(&reason, PFRES_SHORT);
goto done;
}
action = pf_test_state_udp(&s, dir, kif, m, off, h, &pd);
@@ -6059,8 +6567,13 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
+#ifdef __FreeBSD__
+ action = pf_test_udp(&r, &s, dir, kif,
+ m, off, h, &pd, &a, &ruleset, NULL, inp);
+#else
action = pf_test_udp(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ipintrq);
+#endif
break;
}
@@ -6076,7 +6589,6 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
if (dir == PF_IN && pf_check_proto_cksum(m, off,
ntohs(h->ip_len) - off, IPPROTO_ICMP, AF_INET)) {
action = PF_DROP;
- REASON_SET(&reason, PFRES_PROTCKSUM);
goto done;
}
action = pf_test_state_icmp(&s, dir, kif, m, off, h, &pd,
@@ -6089,8 +6601,13 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
+#ifdef __FreeBSD__
+ action = pf_test_icmp(&r, &s, dir, kif,
+ m, off, h, &pd, &a, &ruleset, NULL);
+#else
action = pf_test_icmp(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ipintrq);
+#endif
break;
}
@@ -6104,8 +6621,13 @@ pf_test(int dir, struct ifnet *ifp, struct mbuf **m0,
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
+#ifdef __FreeBSD__
+ action = pf_test_other(&r, &s, dir, kif, m, off, h,
+ &pd, &a, &ruleset, NULL);
+#else
action = pf_test_other(&r, &s, dir, kif, m, off, h,
&pd, &a, &ruleset, &ipintrq);
+#endif
break;
}
@@ -6119,18 +6641,26 @@ done:
("pf: dropping packet with ip options\n"));
}
- if ((s && s->tag) || r->rtableid)
- pf_tag_packet(m, pd.pf_mtag, s ? s->tag : 0, r->rtableid);
+ if (s && s->tag)
+ pf_tag_packet(m, pf_get_tag(m), s->tag);
#ifdef ALTQ
if (action == PF_PASS && r->qid) {
- if (pqid || (pd.tos & IPTOS_LOWDELAY))
- pd.pf_mtag->qid = r->pqid;
- else
- pd.pf_mtag->qid = r->qid;
- /* add hints for ecn */
- pd.pf_mtag->af = AF_INET;
- pd.pf_mtag->hdr = h;
+ struct m_tag *mtag;
+ struct altq_tag *atag;
+
+ mtag = m_tag_get(PACKET_TAG_PF_QID, sizeof(*atag), M_NOWAIT);
+ if (mtag != NULL) {
+ atag = (struct altq_tag *)(mtag + 1);
+ if (pqid || pd.tos == IPTOS_LOWDELAY)
+ atag->qid = r->pqid;
+ else
+ atag->qid = r->qid;
+ /* add hints for ecn */
+ atag->af = AF_INET;
+ atag->hdr = h;
+ m_tag_prepend(m, mtag);
+ }
}
#endif /* ALTQ */
@@ -6143,48 +6673,41 @@ done:
pd.proto == IPPROTO_UDP) && s != NULL && s->nat_rule.ptr != NULL &&
(s->nat_rule.ptr->action == PF_RDR ||
s->nat_rule.ptr->action == PF_BINAT) &&
- (ntohl(pd.dst->v4.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET)
- pd.pf_mtag->flags |= PF_TAG_TRANSLATE_LOCALHOST;
-
- if (log) {
- struct pf_rule *lr;
-
- if (s != NULL && s->nat_rule.ptr != NULL &&
- s->nat_rule.ptr->log & PF_LOG_ALL)
- lr = s->nat_rule.ptr;
- else
- lr = r;
- PFLOG_PACKET(kif, h, m, AF_INET, dir, reason, lr, a, ruleset,
- &pd);
+ (ntohl(pd.dst->v4.s_addr) >> IN_CLASSA_NSHIFT) == IN_LOOPBACKNET &&
+ pf_add_mbuf_tag(m, PACKET_TAG_PF_TRANSLATE_LOCALHOST)) {
+ action = PF_DROP;
+ REASON_SET(&reason, PFRES_MEMORY);
}
+ if (log)
+ PFLOG_PACKET(kif, h, m, AF_INET, dir, reason, r, a, ruleset);
+
kif->pfik_bytes[0][dir == PF_OUT][action != PF_PASS] += pd.tot_len;
kif->pfik_packets[0][dir == PF_OUT][action != PF_PASS]++;
if (action == PF_PASS || r->action == PF_DROP) {
- dirndx = (dir == PF_OUT);
- r->packets[dirndx]++;
- r->bytes[dirndx] += pd.tot_len;
+ r->packets++;
+ r->bytes += pd.tot_len;
if (a != NULL) {
- a->packets[dirndx]++;
- a->bytes[dirndx] += pd.tot_len;
+ a->packets++;
+ a->bytes += pd.tot_len;
}
if (s != NULL) {
+ dirndx = (dir == s->direction) ? 0 : 1;
+ s->packets[dirndx]++;
+ s->bytes[dirndx] += pd.tot_len;
if (s->nat_rule.ptr != NULL) {
- s->nat_rule.ptr->packets[dirndx]++;
- s->nat_rule.ptr->bytes[dirndx] += pd.tot_len;
+ s->nat_rule.ptr->packets++;
+ s->nat_rule.ptr->bytes += pd.tot_len;
}
if (s->src_node != NULL) {
- s->src_node->packets[dirndx]++;
- s->src_node->bytes[dirndx] += pd.tot_len;
+ s->src_node->packets++;
+ s->src_node->bytes += pd.tot_len;
}
if (s->nat_src_node != NULL) {
- s->nat_src_node->packets[dirndx]++;
- s->nat_src_node->bytes[dirndx] += pd.tot_len;
+ s->nat_src_node->packets++;
+ s->nat_src_node->bytes += pd.tot_len;
}
- dirndx = (dir == s->direction) ? 0 : 1;
- s->packets[dirndx]++;
- s->bytes[dirndx] += pd.tot_len;
}
tr = r;
nr = (s != NULL) ? s->nat_rule.ptr : pd.nat_rule;
@@ -6229,7 +6752,11 @@ done:
action = PF_PASS;
} else if (r->rt)
/* pf_route can free the mbuf causing *m0 to become NULL */
- pf_route(m0, r, dir, ifp, s, &pd);
+ pf_route(m0, r, dir, ifp, s);
+
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
return (action);
}
@@ -6237,48 +6764,71 @@ done:
#ifdef INET6
int
+#ifdef __FreeBSD__
+pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
+ struct ether_header *eh, struct inpcb *inp)
+#else
pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
struct ether_header *eh)
+#endif
{
struct pfi_kif *kif;
u_short action, reason = 0, log = 0;
- struct mbuf *m = *m0, *n = NULL;
- struct ip6_hdr *h;
+ struct mbuf *m = *m0;
+ struct ip6_hdr *h = NULL; /* make the compiler happy */
struct pf_rule *a = NULL, *r = &pf_default_rule, *tr, *nr;
struct pf_state *s = NULL;
struct pf_ruleset *ruleset = NULL;
struct pf_pdesc pd;
- int off, terminal = 0, dirndx;
+ int off, terminal = 0, dirndx, rh_cnt = 0;
- if (!pf_status.running)
- return (PF_PASS);
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
- memset(&pd, 0, sizeof(pd));
- if ((pd.pf_mtag = pf_get_mtag(m)) == NULL) {
- DPFPRINTF(PF_DEBUG_URGENT,
- ("pf_test6: pf_get_mtag returned NULL\n"));
- return (PF_DROP);
- }
- if (pd.pf_mtag->flags & PF_TAG_GENERATED)
+ if (!pf_status.running ||
+#ifdef __FreeBSD__
+ (m->m_flags & M_SKIP_FIREWALL)) {
+ PF_UNLOCK();
+#else
+ (m_tag_find(m, PACKET_TAG_PF_GENERATED, NULL) != NULL)) {
+#endif
return (PF_PASS);
+ }
+#ifdef __FreeBSD__
+ /* XXX_IMPORT: later */
+#else
if (ifp->if_type == IFT_CARP && ifp->if_carpdev)
ifp = ifp->if_carpdev;
+#endif
- kif = (struct pfi_kif *)ifp->if_pf_kif;
+ kif = pfi_index2kif[ifp->if_index];
if (kif == NULL) {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
DPFPRINTF(PF_DEBUG_URGENT,
("pf_test6: kif == NULL, if_xname %s\n", ifp->if_xname));
return (PF_DROP);
}
- if (kif->pfik_flags & PFI_IFLAG_SKIP)
+ if (kif->pfik_flags & PFI_IFLAG_SKIP) {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
return (PF_PASS);
+ }
+#ifdef __FreeBSD__
+ M_ASSERTPKTHDR(m);
+#else
#ifdef DIAGNOSTIC
if ((m->m_flags & M_PKTHDR) == 0)
panic("non-M_PKTHDR is passed to pf_test6");
#endif /* DIAGNOSTIC */
+#endif
+ memset(&pd, 0, sizeof(pd));
if (m->m_pkthdr.len < (int)sizeof(*h)) {
action = PF_DROP;
REASON_SET(&reason, PFRES_SHORT);
@@ -6327,62 +6877,33 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
goto done;
case IPPROTO_ROUTING: {
struct ip6_rthdr rthdr;
- struct ip6_rthdr0 rthdr0;
- struct in6_addr finaldst;
- struct ip6_hdr *ip6;
+ if (rh_cnt++) {
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("pf: IPv6 more than one rthdr\n"));
+ action = PF_DROP;
+ REASON_SET(&reason, PFRES_IPOPTIONS);
+ log = 1;
+ goto done;
+ }
if (!pf_pull_hdr(m, off, &rthdr, sizeof(rthdr), NULL,
&reason, pd.af)) {
DPFPRINTF(PF_DEBUG_MISC,
("pf: IPv6 short rthdr\n"));
action = PF_DROP;
+ REASON_SET(&reason, PFRES_SHORT);
log = 1;
goto done;
}
if (rthdr.ip6r_type == IPV6_RTHDR_TYPE_0) {
- if (!pf_pull_hdr(m, off, &rthdr0,
- sizeof(rthdr0), NULL, &reason, pd.af)) {
- DPFPRINTF(PF_DEBUG_MISC,
- ("pf: IPv6 short rthdr0\n"));
- action = PF_DROP;
- log = 1;
- goto done;
- }
- if (rthdr0.ip6r0_segleft != 0) {
- if (!pf_pull_hdr(m, off +
- sizeof(rthdr0) +
- rthdr0.ip6r0_len * 8 -
- sizeof(finaldst), &finaldst,
- sizeof(finaldst), NULL,
- &reason, pd.af)) {
- DPFPRINTF(PF_DEBUG_MISC,
- ("pf: IPv6 short rthdr0\n"));
- action = PF_DROP;
- log = 1;
- goto done;
- }
-
- n = m_copym(m, 0, M_COPYALL, M_DONTWAIT);
- if (!n) {
- DPFPRINTF(PF_DEBUG_MISC,
- ("pf: mbuf shortage\n"));
- action = PF_DROP;
- log = 1;
- goto done;
- }
- n = m_pullup(n, sizeof(struct ip6_hdr));
- if (!n) {
- DPFPRINTF(PF_DEBUG_MISC,
- ("pf: mbuf shortage\n"));
- action = PF_DROP;
- log = 1;
- goto done;
- }
- ip6 = mtod(n, struct ip6_hdr *);
- ip6->ip6_dst = finaldst;
- }
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("pf: IPv6 rthdr0\n"));
+ action = PF_DROP;
+ REASON_SET(&reason, PFRES_IPOPTIONS);
+ log = 1;
+ goto done;
}
- /* FALLTHROUGH */
+ /* fallthrough */
}
case IPPROTO_AH:
case IPPROTO_HOPOPTS:
@@ -6412,10 +6933,6 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
}
} while (!terminal);
- /* if there's no routing header, use unmodified mbuf for checksumming */
- if (!n)
- n = m;
-
switch (pd.proto) {
case IPPROTO_TCP: {
@@ -6427,7 +6944,7 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
log = action != PF_PASS;
goto done;
}
- if (dir == PF_IN && pf_check_proto_cksum(n, off,
+ if (dir == PF_IN && pf_check_proto_cksum(m, off,
ntohs(h->ip6_plen) - (off - sizeof(struct ip6_hdr)),
IPPROTO_TCP, AF_INET6)) {
action = PF_DROP;
@@ -6448,8 +6965,13 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
+#ifdef __FreeBSD__
+ action = pf_test_tcp(&r, &s, dir, kif,
+ m, off, h, &pd, &a, &ruleset, NULL, inp);
+#else
action = pf_test_tcp(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ip6intrq);
+#endif
break;
}
@@ -6462,7 +6984,7 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
log = action != PF_PASS;
goto done;
}
- if (dir == PF_IN && uh.uh_sum && pf_check_proto_cksum(n,
+ if (dir == PF_IN && uh.uh_sum && pf_check_proto_cksum(m,
off, ntohs(h->ip6_plen) - (off - sizeof(struct ip6_hdr)),
IPPROTO_UDP, AF_INET6)) {
action = PF_DROP;
@@ -6473,7 +6995,6 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
ntohs(uh.uh_ulen) > m->m_pkthdr.len - off ||
ntohs(uh.uh_ulen) < sizeof(struct udphdr)) {
action = PF_DROP;
- REASON_SET(&reason, PFRES_SHORT);
goto done;
}
action = pf_test_state_udp(&s, dir, kif, m, off, h, &pd);
@@ -6485,8 +7006,13 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
+#ifdef __FreeBSD__
+ action = pf_test_udp(&r, &s, dir, kif,
+ m, off, h, &pd, &a, &ruleset, NULL, inp);
+#else
action = pf_test_udp(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ip6intrq);
+#endif
break;
}
@@ -6499,7 +7025,7 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
log = action != PF_PASS;
goto done;
}
- if (dir == PF_IN && pf_check_proto_cksum(n, off,
+ if (dir == PF_IN && pf_check_proto_cksum(m, off,
ntohs(h->ip6_plen) - (off - sizeof(struct ip6_hdr)),
IPPROTO_ICMPV6, AF_INET6)) {
action = PF_DROP;
@@ -6516,8 +7042,13 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
+#ifdef __FreeBSD__
+ action = pf_test_icmp(&r, &s, dir, kif,
+ m, off, h, &pd, &a, &ruleset, NULL);
+#else
action = pf_test_icmp(&r, &s, dir, kif,
m, off, h, &pd, &a, &ruleset, &ip6intrq);
+#endif
break;
}
@@ -6531,31 +7062,47 @@ pf_test6(int dir, struct ifnet *ifp, struct mbuf **m0,
a = s->anchor.ptr;
log = s->log;
} else if (s == NULL)
+#ifdef __FreeBSD__
+ action = pf_test_other(&r, &s, dir, kif, m, off, h,
+ &pd, &a, &ruleset, NULL);
+#else
action = pf_test_other(&r, &s, dir, kif, m, off, h,
&pd, &a, &ruleset, &ip6intrq);
+#endif
break;
}
done:
- if (n != m) {
- m_freem(n);
- n = NULL;
+ /* handle dangerous IPv6 extension headers. */
+ if (action == PF_PASS && rh_cnt &&
+ !((s && s->allow_opts) || r->allow_opts)) {
+ action = PF_DROP;
+ REASON_SET(&reason, PFRES_IPOPTIONS);
+ log = 1;
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("pf: dropping packet with dangerous v6 headers\n"));
}
- /* XXX handle IPv6 options, if not allowed. not implemented. */
-
- if ((s && s->tag) || r->rtableid)
- pf_tag_packet(m, pd.pf_mtag, s ? s->tag : 0, r->rtableid);
+ if (s && s->tag)
+ pf_tag_packet(m, pf_get_tag(m), s->tag);
#ifdef ALTQ
if (action == PF_PASS && r->qid) {
- if (pd.tos & IPTOS_LOWDELAY)
- pd.pf_mtag->qid = r->pqid;
- else
- pd.pf_mtag->qid = r->qid;
- /* add hints for ecn */
- pd.pf_mtag->af = AF_INET6;
- pd.pf_mtag->hdr = h;
+ struct m_tag *mtag;
+ struct altq_tag *atag;
+
+ mtag = m_tag_get(PACKET_TAG_PF_QID, sizeof(*atag), M_NOWAIT);
+ if (mtag != NULL) {
+ atag = (struct altq_tag *)(mtag + 1);
+ if (pd.tos == IPTOS_LOWDELAY)
+ atag->qid = r->pqid;
+ else
+ atag->qid = r->qid;
+ /* add hints for ecn */
+ atag->af = AF_INET6;
+ atag->hdr = h;
+ m_tag_prepend(m, mtag);
+ }
}
#endif /* ALTQ */
@@ -6563,48 +7110,41 @@ done:
pd.proto == IPPROTO_UDP) && s != NULL && s->nat_rule.ptr != NULL &&
(s->nat_rule.ptr->action == PF_RDR ||
s->nat_rule.ptr->action == PF_BINAT) &&
- IN6_IS_ADDR_LOOPBACK(&pd.dst->v6))
- pd.pf_mtag->flags |= PF_TAG_TRANSLATE_LOCALHOST;
-
- if (log) {
- struct pf_rule *lr;
-
- if (s != NULL && s->nat_rule.ptr != NULL &&
- s->nat_rule.ptr->log & PF_LOG_ALL)
- lr = s->nat_rule.ptr;
- else
- lr = r;
- PFLOG_PACKET(kif, h, m, AF_INET6, dir, reason, lr, a, ruleset,
- &pd);
+ IN6_IS_ADDR_LOOPBACK(&pd.dst->v6) &&
+ pf_add_mbuf_tag(m, PACKET_TAG_PF_TRANSLATE_LOCALHOST)) {
+ action = PF_DROP;
+ REASON_SET(&reason, PFRES_MEMORY);
}
+ if (log)
+ PFLOG_PACKET(kif, h, m, AF_INET6, dir, reason, r, a, ruleset);
+
kif->pfik_bytes[1][dir == PF_OUT][action != PF_PASS] += pd.tot_len;
kif->pfik_packets[1][dir == PF_OUT][action != PF_PASS]++;
if (action == PF_PASS || r->action == PF_DROP) {
- dirndx = (dir == PF_OUT);
- r->packets[dirndx]++;
- r->bytes[dirndx] += pd.tot_len;
+ r->packets++;
+ r->bytes += pd.tot_len;
if (a != NULL) {
- a->packets[dirndx]++;
- a->bytes[dirndx] += pd.tot_len;
+ a->packets++;
+ a->bytes += pd.tot_len;
}
if (s != NULL) {
+ dirndx = (dir == s->direction) ? 0 : 1;
+ s->packets[dirndx]++;
+ s->bytes[dirndx] += pd.tot_len;
if (s->nat_rule.ptr != NULL) {
- s->nat_rule.ptr->packets[dirndx]++;
- s->nat_rule.ptr->bytes[dirndx] += pd.tot_len;
+ s->nat_rule.ptr->packets++;
+ s->nat_rule.ptr->bytes += pd.tot_len;
}
if (s->src_node != NULL) {
- s->src_node->packets[dirndx]++;
- s->src_node->bytes[dirndx] += pd.tot_len;
+ s->src_node->packets++;
+ s->src_node->bytes += pd.tot_len;
}
if (s->nat_src_node != NULL) {
- s->nat_src_node->packets[dirndx]++;
- s->nat_src_node->bytes[dirndx] += pd.tot_len;
+ s->nat_src_node->packets++;
+ s->nat_src_node->bytes += pd.tot_len;
}
- dirndx = (dir == s->direction) ? 0 : 1;
- s->packets[dirndx]++;
- s->bytes[dirndx] += pd.tot_len;
}
tr = r;
nr = (s != NULL) ? s->nat_rule.ptr : pd.nat_rule;
@@ -6649,8 +7189,11 @@ done:
action = PF_PASS;
} else if (r->rt)
/* pf_route6 can free the mbuf causing *m0 to become NULL */
- pf_route6(m0, r, dir, ifp, s, &pd);
+ pf_route6(m0, r, dir, ifp, s);
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
return (action);
}
#endif /* INET6 */
@@ -6658,8 +7201,13 @@ done:
int
pf_check_congestion(struct ifqueue *ifq)
{
+#ifdef __FreeBSD__
+ /* XXX_IMPORT: later */
+ return (0);
+#else
if (ifq->ifq_congestion)
return (1);
else
return (0);
+#endif
}
diff --git a/sys/contrib/pf/net/pf_if.c b/sys/contrib/pf/net/pf_if.c
index 6a15a89..8e35070 100644
--- a/sys/contrib/pf/net/pf_if.c
+++ b/sys/contrib/pf/net/pf_if.c
@@ -1,8 +1,7 @@
-/* $OpenBSD: pf_if.c,v 1.46 2006/12/13 09:01:59 itojun Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: pf_if.c,v 1.23 2004/12/22 17:17:55 dhartmei Exp $ */
/*
- * Copyright 2005 Henning Brauer <henning@openbsd.org>
- * Copyright 2005 Ryan McBride <mcbride@openbsd.org>
* Copyright (c) 2001 Daniel Hartmeier
* Copyright (c) 2003 Cedric Berger
* All rights reserved.
@@ -32,14 +31,24 @@
* POSSIBILITY OF SUCH DAMAGE.
*/
+#if defined(__FreeBSD__)
+#include "opt_inet.h"
+#include "opt_inet6.h"
+#endif
+
#include <sys/param.h>
#include <sys/systm.h>
+#ifdef __FreeBSD__
+#include <sys/malloc.h>
+#endif
#include <sys/mbuf.h>
#include <sys/filio.h>
#include <sys/socket.h>
#include <sys/socketvar.h>
#include <sys/kernel.h>
+#ifndef __FreeBSD__
#include <sys/device.h>
+#endif
#include <sys/time.h>
#include <net/if.h>
@@ -57,273 +66,440 @@
#include <netinet/ip6.h>
#endif /* INET6 */
-struct pfi_kif *pfi_all = NULL;
+#define ACCEPT_FLAGS(oklist) \
+ do { \
+ if ((flags & ~(oklist)) & \
+ PFI_FLAG_ALLMASK) \
+ return (EINVAL); \
+ } while (0)
+
+#define senderr(e) do { rv = (e); goto _bad; } while (0)
+
+struct pfi_kif **pfi_index2kif;
+struct pfi_kif *pfi_self, *pfi_dummy;
+int pfi_indexlim;
+struct pfi_ifhead pfi_ifs;
struct pfi_statehead pfi_statehead;
+int pfi_ifcnt;
+#ifdef __FreeBSD__
+uma_zone_t pfi_addr_pl;
+#else
struct pool pfi_addr_pl;
-struct pfi_ifhead pfi_ifs;
+#endif
long pfi_update = 1;
struct pfr_addr *pfi_buffer;
int pfi_buffer_cnt;
int pfi_buffer_max;
+#ifdef __FreeBSD__
+eventhandler_tag pfi_clone_cookie = NULL;
+eventhandler_tag pfi_attach_cookie = NULL;
+eventhandler_tag pfi_detach_cookie = NULL;
+#endif
-void pfi_kif_update(struct pfi_kif *);
-void pfi_dynaddr_update(struct pfi_dynaddr *dyn);
+void pfi_dynaddr_update(void *);
+void pfi_kifaddr_update(void *);
void pfi_table_update(struct pfr_ktable *, struct pfi_kif *,
int, int);
-void pfi_kifaddr_update(void *);
void pfi_instance_add(struct ifnet *, int, int);
void pfi_address_add(struct sockaddr *, int, int);
int pfi_if_compare(struct pfi_kif *, struct pfi_kif *);
-int pfi_skip_if(const char *, struct pfi_kif *);
+struct pfi_kif *pfi_if_create(const char *, struct pfi_kif *, int);
+void pfi_copy_group(char *, const char *, int);
+void pfi_newgroup(const char *, int);
+int pfi_skip_if(const char *, struct pfi_kif *, int);
int pfi_unmask(void *);
+void pfi_dohooks(struct pfi_kif *);
+#ifdef __FreeBSD__
+void pfi_kifaddr_update_event(void *, struct ifnet *);
+void pfi_attach_clone_event(void * __unused, struct if_clone *);
+void pfi_attach_ifnet_event(void * __unused, struct ifnet *);
+void pfi_detach_ifnet_event(void * __unused, struct ifnet *);
+#endif
RB_PROTOTYPE(pfi_ifhead, pfi_kif, pfik_tree, pfi_if_compare);
RB_GENERATE(pfi_ifhead, pfi_kif, pfik_tree, pfi_if_compare);
#define PFI_BUFFER_MAX 0x10000
+#ifdef __FreeBSD__
+MALLOC_DEFINE(PFI_MTYPE, "pf_if", "pf interface table");
+#else
#define PFI_MTYPE M_IFADDR
+#endif
void
pfi_initialize(void)
{
- if (pfi_all != NULL) /* already initialized */
+#ifdef __FreeBSD__
+ struct ifnet *ifp;
+#endif
+
+ if (pfi_self != NULL) /* already initialized */
return;
TAILQ_INIT(&pfi_statehead);
+#ifndef __FreeBSD__
pool_init(&pfi_addr_pl, sizeof(struct pfi_dynaddr), 0, 0, 0,
"pfiaddrpl", &pool_allocator_nointr);
+#endif
pfi_buffer_max = 64;
pfi_buffer = malloc(pfi_buffer_max * sizeof(*pfi_buffer),
PFI_MTYPE, M_WAITOK);
-
- if ((pfi_all = pfi_kif_get(IFG_ALL)) == NULL)
- panic("pfi_kif_get for pfi_all failed");
+ pfi_self = pfi_if_create("self", NULL, PFI_IFLAG_GROUP);
+#ifdef __FreeBSD__
+ /* XXX_IMPORT */
+ PF_LOCK();
+ IFNET_RLOCK();
+ TAILQ_FOREACH(ifp, &ifnet, if_link) {
+ IFNET_RUNLOCK();
+ pfi_attach_ifnet(ifp);
+ IFNET_RLOCK();
+ }
+ IFNET_RUNLOCK();
+ PF_UNLOCK();
+ pfi_dummy = pfi_if_create("notyet", pfi_self,
+ PFI_IFLAG_GROUP | PFI_IFLAG_DYNAMIC);
+ pfi_attach_cookie = EVENTHANDLER_REGISTER(ifnet_arrival_event,
+ pfi_attach_ifnet_event, NULL, EVENTHANDLER_PRI_ANY);
+ pfi_detach_cookie = EVENTHANDLER_REGISTER(ifnet_departure_event,
+ pfi_detach_ifnet_event, NULL, EVENTHANDLER_PRI_ANY);
+ pfi_clone_cookie = EVENTHANDLER_REGISTER(if_clone_event,
+ pfi_attach_clone_event, NULL, EVENTHANDLER_PRI_ANY);
+#endif
}
-struct pfi_kif *
-pfi_kif_get(const char *kif_name)
+#ifdef __FreeBSD__
+void
+pfi_cleanup(void)
{
- struct pfi_kif *kif;
- struct pfi_kif_cmp s;
-
- bzero(&s, sizeof(s));
- strlcpy(s.pfik_name, kif_name, sizeof(s.pfik_name));
- if ((kif = RB_FIND(pfi_ifhead, &pfi_ifs, (struct pfi_kif *)&s)) != NULL)
- return (kif);
-
- /* create new one */
- if ((kif = malloc(sizeof(*kif), PFI_MTYPE, M_DONTWAIT)) == NULL)
- return (NULL);
+ struct pfi_kif *p, key;
+ struct ifnet *ifp;
+
+ PF_ASSERT(MA_OWNED);
+
+ PF_UNLOCK();
+ EVENTHANDLER_DEREGISTER(ifnet_arrival_event, pfi_attach_cookie);
+ EVENTHANDLER_DEREGISTER(ifnet_departure_event, pfi_detach_cookie);
+ EVENTHANDLER_DEREGISTER(if_clone_event, pfi_clone_cookie);
+ PF_LOCK();
+
+ IFNET_RLOCK();
+ /* release PFI_IFLAG_INSTANCE */
+ TAILQ_FOREACH(ifp, &ifnet, if_link) {
+ strlcpy(key.pfik_name, ifp->if_xname, sizeof(key.pfik_name));
+ p = RB_FIND(pfi_ifhead, &pfi_ifs, &key);
+ if (p != NULL) {
+ IFNET_RUNLOCK();
+ pfi_detach_ifnet(ifp);
+ IFNET_RLOCK();
+ }
+ }
+ IFNET_RUNLOCK();
- bzero(kif, sizeof(*kif));
- strlcpy(kif->pfik_name, kif_name, sizeof(kif->pfik_name));
- kif->pfik_tzero = time_second;
- TAILQ_INIT(&kif->pfik_dynaddrs);
+ /* XXX clear all other interface group */
+ while ((p = RB_MIN(pfi_ifhead, &pfi_ifs))) {
+ RB_REMOVE(pfi_ifhead, &pfi_ifs, p);
- RB_INSERT(pfi_ifhead, &pfi_ifs, kif);
- return (kif);
+ free(p->pfik_ah_head, PFI_MTYPE);
+ free(p, PFI_MTYPE);
+ }
+ free(pfi_index2kif, PFI_MTYPE);
+ free(pfi_buffer, PFI_MTYPE);
+ pfi_index2kif = NULL;
+ pfi_buffer = NULL;
+ pfi_self = NULL;
}
+/*
+ * Wrapper functions for FreeBSD eventhandler
+ */
void
-pfi_kif_ref(struct pfi_kif *kif, enum pfi_kif_refs what)
+pfi_kifaddr_update_event(void *arg, struct ifnet *ifp)
{
- switch (what) {
- case PFI_KIF_REF_RULE:
- kif->pfik_rules++;
- break;
- case PFI_KIF_REF_STATE:
- if (!kif->pfik_states++)
- TAILQ_INSERT_TAIL(&pfi_statehead, kif, pfik_w_states);
- break;
- default:
- panic("pfi_kif_ref with unknown type");
- }
+ struct pfi_kif *p = arg;
+
+ PF_LOCK();
+ /*
+ * Check to see if it is 'our' interface as we do not have per
+ * interface hooks and thus get an update for every interface.
+ */
+ if (p && p->pfik_ifp == ifp)
+ pfi_kifaddr_update(p);
+ PF_UNLOCK();
}
void
-pfi_kif_unref(struct pfi_kif *kif, enum pfi_kif_refs what)
+pfi_attach_clone_event(void *arg __unused, struct if_clone *ifc)
{
- if (kif == NULL)
- return;
-
- switch (what) {
- case PFI_KIF_REF_NONE:
- break;
- case PFI_KIF_REF_RULE:
- if (kif->pfik_rules <= 0) {
- printf("pfi_kif_unref: rules refcount <= 0\n");
- return;
- }
- kif->pfik_rules--;
- break;
- case PFI_KIF_REF_STATE:
- if (kif->pfik_states <= 0) {
- printf("pfi_kif_unref: state refcount <= 0\n");
- return;
- }
- if (!--kif->pfik_states)
- TAILQ_REMOVE(&pfi_statehead, kif, pfik_w_states);
- break;
- default:
- panic("pfi_kif_unref with unknown type");
- }
-
- if (kif->pfik_ifp != NULL || kif->pfik_group != NULL || kif == pfi_all)
- return;
-
- if (kif->pfik_rules || kif->pfik_states)
- return;
-
- RB_REMOVE(pfi_ifhead, &pfi_ifs, kif);
- free(kif, PFI_MTYPE);
+ PF_LOCK();
+ pfi_attach_clone(ifc);
+ PF_UNLOCK();
}
-int
-pfi_kif_match(struct pfi_kif *rule_kif, struct pfi_kif *packet_kif)
+void
+pfi_attach_ifnet_event(void *arg __unused, struct ifnet *ifp)
{
- struct ifg_list *p;
-
- if (rule_kif == NULL || rule_kif == packet_kif)
- return (1);
+ PF_LOCK();
+ pfi_attach_ifnet(ifp);
+ PF_UNLOCK();
+}
- if (rule_kif->pfik_group != NULL)
- TAILQ_FOREACH(p, &packet_kif->pfik_ifp->if_groups, ifgl_next)
- if (p->ifgl_group == rule_kif->pfik_group)
- return (1);
+void
+pfi_detach_ifnet_event(void *arg __unused, struct ifnet *ifp)
+{
+ PF_LOCK();
+ pfi_detach_ifnet(ifp);
+ PF_UNLOCK();
+}
+#endif /* __FreeBSD__ */
- return (0);
+void
+pfi_attach_clone(struct if_clone *ifc)
+{
+ pfi_initialize();
+ pfi_newgroup(ifc->ifc_name, PFI_IFLAG_CLONABLE);
}
void
pfi_attach_ifnet(struct ifnet *ifp)
{
- struct pfi_kif *kif;
- int s;
+ struct pfi_kif *p, *q, key;
+ int s;
+#ifdef __FreeBSD__
+ int realname;
+#endif
pfi_initialize();
s = splsoftnet();
pfi_update++;
- if ((kif = pfi_kif_get(ifp->if_xname)) == NULL)
- panic("pfi_kif_get failed");
-
- kif->pfik_ifp = ifp;
- ifp->if_pf_kif = (caddr_t)kif;
-
- if ((kif->pfik_ah_cookie = hook_establish(ifp->if_addrhooks, 1,
- pfi_kifaddr_update, kif)) == NULL)
- panic("pfi_attach_ifnet: cannot allocate '%s' address hook",
- ifp->if_xname);
-
- pfi_kif_update(kif);
+ if (ifp->if_index >= pfi_indexlim) {
+ /*
+ * grow pfi_index2kif, similar to ifindex2ifnet code in if.c
+ */
+ size_t m, n, oldlim;
+ struct pfi_kif **mp, **np;
+
+ oldlim = pfi_indexlim;
+ if (pfi_indexlim == 0)
+ pfi_indexlim = 64;
+ while (ifp->if_index >= pfi_indexlim)
+ pfi_indexlim <<= 1;
+
+ m = oldlim * sizeof(struct pfi_kif *);
+ mp = pfi_index2kif;
+ n = pfi_indexlim * sizeof(struct pfi_kif *);
+#ifdef __FreeBSD__
+ np = malloc(n, PFI_MTYPE, M_NOWAIT);
+#else
+ np = malloc(n, PFI_MTYPE, M_DONTWAIT);
+#endif
+ if (np == NULL)
+ panic("pfi_attach_ifnet: "
+ "cannot allocate translation table");
+ bzero(np, n);
+ if (mp != NULL)
+ bcopy(mp, np, m);
+ pfi_index2kif = np;
+ if (mp != NULL)
+ free(mp, PFI_MTYPE);
+ }
+ strlcpy(key.pfik_name, ifp->if_xname, sizeof(key.pfik_name));
+ p = RB_FIND(pfi_ifhead, &pfi_ifs, &key);
+#ifdef __FreeBSD__
+ /* some additional trickery for placeholders */
+ if ((p == NULL) || (p->pfik_parent == pfi_dummy)) {
+ /* are we looking at a renamed instance or not? */
+ pfi_copy_group(key.pfik_name, ifp->if_xname,
+ sizeof(key.pfik_name));
+ realname = (strncmp(key.pfik_name, ifp->if_dname,
+ sizeof(key.pfik_name)) == 0);
+ /* add group */
+ /* we can change if_xname, hence use if_dname as group id */
+ pfi_copy_group(key.pfik_name, ifp->if_dname,
+ sizeof(key.pfik_name));
+ q = RB_FIND(pfi_ifhead, &pfi_ifs, &key);
+ if (q == NULL)
+ q = pfi_if_create(key.pfik_name, pfi_self,
+ PFI_IFLAG_GROUP|PFI_IFLAG_DYNAMIC);
+ else if (q->pfik_parent == pfi_dummy) {
+ q->pfik_parent = pfi_self;
+ q->pfik_flags = (PFI_IFLAG_GROUP | PFI_IFLAG_DYNAMIC);
+ }
+ if (q == NULL)
+ panic("pfi_attach_ifnet: "
+ "cannot allocate '%s' group", key.pfik_name);
+
+ /* add/modify interface */
+ if (p == NULL)
+ p = pfi_if_create(ifp->if_xname, q, PFI_IFLAG_INSTANCE |
+ (realname?0:PFI_IFLAG_PLACEHOLDER));
+ else {
+ /* remove from the dummy group */
+ /* XXX: copy stats? We should not have any!!! */
+ pfi_dummy->pfik_delcnt++;
+ TAILQ_REMOVE(&pfi_dummy->pfik_grouphead, p,
+ pfik_instances);
+ /* move to the right group */
+ p->pfik_parent = q;
+ q->pfik_addcnt++;
+ TAILQ_INSERT_TAIL(&q->pfik_grouphead, p,
+ pfik_instances);
+ if (realname)
+ p->pfik_flags &= ~PFI_IFLAG_PLACEHOLDER;
+ p->pfik_flags |= PFI_IFLAG_INSTANCE;
+ }
+ if (p == NULL)
+ panic("pfi_attach_ifnet: "
+ "cannot allocate '%s' interface", ifp->if_xname);
+#else
+ if (p == NULL) {
+ /* add group */
+ pfi_copy_group(key.pfik_name, ifp->if_xname,
+ sizeof(key.pfik_name));
+ q = RB_FIND(pfi_ifhead, &pfi_ifs, &key);
+ if (q == NULL)
+ q = pfi_if_create(key.pfik_name, pfi_self, PFI_IFLAG_GROUP);
+ else if (q->pfik_parent == pfi_dummy) {
+ q->pfik_parent = pfi_self;
+ q->pfik_flags = (PFI_IFLAG_GROUP | PFI_IFLAG_DYNAMIC);
+ }
+ if (q == NULL)
+ panic("pfi_attach_ifnet: "
+ "cannot allocate '%s' group", key.pfik_name);
+
+ /* add interface */
+ p = pfi_if_create(ifp->if_xname, q, PFI_IFLAG_INSTANCE);
+ if (p == NULL)
+ panic("pfi_attach_ifnet: "
+ "cannot allocate '%s' interface", ifp->if_xname);
+#endif
+ } else
+ q = p->pfik_parent;
+ p->pfik_ifp = ifp;
+ p->pfik_flags |= PFI_IFLAG_ATTACHED;
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+ p->pfik_ah_cookie = EVENTHANDLER_REGISTER(ifaddr_event,
+ pfi_kifaddr_update_event, p, EVENTHANDLER_PRI_ANY);
+ PF_LOCK();
+#else
+ p->pfik_ah_cookie =
+ hook_establish(ifp->if_addrhooks, 1, pfi_kifaddr_update, p);
+#endif
+ pfi_index2kif[ifp->if_index] = p;
+ pfi_dohooks(p);
splx(s);
}
void
pfi_detach_ifnet(struct ifnet *ifp)
{
- int s;
- struct pfi_kif *kif;
+ struct pfi_kif *p, *q, key;
+ int s;
- if ((kif = (struct pfi_kif *)ifp->if_pf_kif) == NULL)
- return;
+ strlcpy(key.pfik_name, ifp->if_xname, sizeof(key.pfik_name));
s = splsoftnet();
pfi_update++;
- hook_disestablish(ifp->if_addrhooks, kif->pfik_ah_cookie);
- pfi_kif_update(kif);
-
- kif->pfik_ifp = NULL;
- ifp->if_pf_kif = NULL;
- pfi_kif_unref(kif, PFI_KIF_REF_NONE);
+ p = RB_FIND(pfi_ifhead, &pfi_ifs, &key);
+ if (p == NULL) {
+ printf("pfi_detach_ifnet: cannot find %s", ifp->if_xname);
+ splx(s);
+ return;
+ }
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+ EVENTHANDLER_DEREGISTER(ifaddr_event, p->pfik_ah_cookie);
+ PF_LOCK();
+#else
+ hook_disestablish(p->pfik_ifp->if_addrhooks, p->pfik_ah_cookie);
+#endif
+ q = p->pfik_parent;
+ p->pfik_ifp = NULL;
+ p->pfik_flags &= ~PFI_IFLAG_ATTACHED;
+ pfi_index2kif[ifp->if_index] = NULL;
+ pfi_dohooks(p);
+ pfi_maybe_destroy(p);
splx(s);
}
-void
-pfi_attach_ifgroup(struct ifg_group *ifg)
+struct pfi_kif *
+pfi_lookup_create(const char *name)
{
- struct pfi_kif *kif;
+ struct pfi_kif *p, *q, key;
int s;
- pfi_initialize();
s = splsoftnet();
- pfi_update++;
- if ((kif = pfi_kif_get(ifg->ifg_group)) == NULL)
- panic("pfi_kif_get failed");
+ p = pfi_lookup_if(name);
+ if (p == NULL) {
+ pfi_copy_group(key.pfik_name, name, sizeof(key.pfik_name));
+ q = pfi_lookup_if(key.pfik_name);
+#ifdef __FreeBSD__
+ /* XXX_IMPORT */
+ if ((q != NULL) && (q->pfik_parent != pfi_dummy))
+ p = pfi_if_create(name, q, PFI_IFLAG_INSTANCE);
+ else {
+ if (pfi_dummy == NULL)
+ panic("no 'notyet' dummy group");
+ p = pfi_if_create(name, pfi_dummy,
+ PFI_IFLAG_PLACEHOLDER);
+ }
+#else
+ if (q == NULL) {
+ pfi_newgroup(key.pfik_name, PFI_IFLAG_DYNAMIC);
+ q = pfi_lookup_if(key.pfik_name);
+ }
+ p = pfi_lookup_if(name);
+ if (p == NULL && q != NULL)
+ p = pfi_if_create(name, q, PFI_IFLAG_INSTANCE);
+#endif
+ }
+ splx(s);
+ return (p);
+}
- kif->pfik_group = ifg;
- ifg->ifg_pf_kif = (caddr_t)kif;
+struct pfi_kif *
+pfi_attach_rule(const char *name)
+{
+ struct pfi_kif *p;
- splx(s);
+ p = pfi_lookup_create(name);
+ if (p != NULL)
+ p->pfik_rules++;
+ return (p);
}
void
-pfi_detach_ifgroup(struct ifg_group *ifg)
+pfi_detach_rule(struct pfi_kif *p)
{
- int s;
- struct pfi_kif *kif;
-
- if ((kif = (struct pfi_kif *)ifg->ifg_pf_kif) == NULL)
+ if (p == NULL)
return;
-
- s = splsoftnet();
- pfi_update++;
-
- kif->pfik_group = NULL;
- ifg->ifg_pf_kif = NULL;
- pfi_kif_unref(kif, PFI_KIF_REF_NONE);
- splx(s);
+ if (p->pfik_rules > 0)
+ p->pfik_rules--;
+ else
+ printf("pfi_detach_rule: reference count at 0\n");
+ pfi_maybe_destroy(p);
}
void
-pfi_group_change(const char *group)
+pfi_attach_state(struct pfi_kif *p)
{
- struct pfi_kif *kif;
- int s;
-
- s = splsoftnet();
- pfi_update++;
- if ((kif = pfi_kif_get(group)) == NULL)
- panic("pfi_kif_get failed");
-
- pfi_kif_update(kif);
-
- splx(s);
+ if (!p->pfik_states++)
+ TAILQ_INSERT_TAIL(&pfi_statehead, p, pfik_w_states);
}
-int
-pfi_match_addr(struct pfi_dynaddr *dyn, struct pf_addr *a, sa_family_t af)
+void
+pfi_detach_state(struct pfi_kif *p)
{
- switch (af) {
-#ifdef INET
- case AF_INET:
- switch (dyn->pfid_acnt4) {
- case 0:
- return (0);
- case 1:
- return (PF_MATCHA(0, &dyn->pfid_addr4,
- &dyn->pfid_mask4, a, AF_INET));
- default:
- return (pfr_match_addr(dyn->pfid_kt, a, AF_INET));
- }
- break;
-#endif /* INET */
-#ifdef INET6
- case AF_INET6:
- switch (dyn->pfid_acnt6) {
- case 0:
- return (0);
- case 1:
- return (PF_MATCHA(0, &dyn->pfid_addr6,
- &dyn->pfid_mask6, a, AF_INET6));
- default:
- return (pfr_match_addr(dyn->pfid_kt, a, AF_INET6));
- }
- break;
-#endif /* INET6 */
- default:
- return (0);
+ if (p == NULL)
+ return;
+ if (p->pfik_states <= 0) {
+ printf("pfi_detach_state: reference count <= 0\n");
+ return;
}
+ if (!--p->pfik_states)
+ TAILQ_REMOVE(&pfi_statehead, p, pfik_w_states);
+ pfi_maybe_destroy(p);
}
int
@@ -336,20 +512,15 @@ pfi_dynaddr_setup(struct pf_addr_wrap *aw, sa_family_t af)
if (aw->type != PF_ADDR_DYNIFTL)
return (0);
- if ((dyn = pool_get(&pfi_addr_pl, PR_NOWAIT)) == NULL)
+ dyn = pool_get(&pfi_addr_pl, PR_NOWAIT);
+ if (dyn == NULL)
return (1);
bzero(dyn, sizeof(*dyn));
s = splsoftnet();
- if (!strcmp(aw->v.ifname, "self"))
- dyn->pfid_kif = pfi_kif_get(IFG_ALL);
- else
- dyn->pfid_kif = pfi_kif_get(aw->v.ifname);
- if (dyn->pfid_kif == NULL) {
- rv = 1;
- goto _bad;
- }
- pfi_kif_ref(dyn->pfid_kif, PFI_KIF_REF_RULE);
+ dyn->pfid_kif = pfi_attach_rule(aw->v.ifname);
+ if (dyn->pfid_kif == NULL)
+ senderr(1);
dyn->pfid_net = pfi_unmask(&aw->v.a.mask);
if (af == AF_INET && dyn->pfid_net == 32)
@@ -366,23 +537,24 @@ pfi_dynaddr_setup(struct pf_addr_wrap *aw, sa_family_t af)
if (dyn->pfid_net != 128)
snprintf(tblname + strlen(tblname),
sizeof(tblname) - strlen(tblname), "/%d", dyn->pfid_net);
- if ((ruleset = pf_find_or_create_ruleset(PF_RESERVED_ANCHOR)) == NULL) {
- rv = 1;
- goto _bad;
- }
+ ruleset = pf_find_or_create_ruleset(PF_RESERVED_ANCHOR);
+ if (ruleset == NULL)
+ senderr(1);
- if ((dyn->pfid_kt = pfr_attach_table(ruleset, tblname)) == NULL) {
- rv = 1;
- goto _bad;
- }
+ dyn->pfid_kt = pfr_attach_table(ruleset, tblname);
+ if (dyn->pfid_kt == NULL)
+ senderr(1);
dyn->pfid_kt->pfrkt_flags |= PFR_TFLAG_ACTIVE;
dyn->pfid_iflags = aw->iflags;
dyn->pfid_af = af;
+ dyn->pfid_hook_cookie = hook_establish(dyn->pfid_kif->pfik_ah_head, 1,
+ pfi_dynaddr_update, dyn);
+ if (dyn->pfid_hook_cookie == NULL)
+ senderr(1);
- TAILQ_INSERT_TAIL(&dyn->pfid_kif->pfik_dynaddrs, dyn, entry);
aw->p.dyn = dyn;
- pfi_kif_update(dyn->pfid_kif);
+ pfi_dynaddr_update(aw->p.dyn);
splx(s);
return (0);
@@ -392,32 +564,16 @@ _bad:
if (ruleset != NULL)
pf_remove_if_empty_ruleset(ruleset);
if (dyn->pfid_kif != NULL)
- pfi_kif_unref(dyn->pfid_kif, PFI_KIF_REF_RULE);
+ pfi_detach_rule(dyn->pfid_kif);
pool_put(&pfi_addr_pl, dyn);
splx(s);
return (rv);
}
void
-pfi_kif_update(struct pfi_kif *kif)
-{
- struct ifg_list *ifgl;
- struct pfi_dynaddr *p;
-
- /* update all dynaddr */
- TAILQ_FOREACH(p, &kif->pfik_dynaddrs, entry)
- pfi_dynaddr_update(p);
-
- /* again for all groups kif is member of */
- if (kif->pfik_ifp != NULL)
- TAILQ_FOREACH(ifgl, &kif->pfik_ifp->if_groups, ifgl_next)
- pfi_kif_update((struct pfi_kif *)
- ifgl->ifgl_group->ifg_pf_kif);
-}
-
-void
-pfi_dynaddr_update(struct pfi_dynaddr *dyn)
+pfi_dynaddr_update(void *p)
{
+ struct pfi_dynaddr *dyn = (struct pfi_dynaddr *)p;
struct pfi_kif *kif;
struct pfr_ktable *kt;
@@ -426,7 +582,6 @@ pfi_dynaddr_update(struct pfi_dynaddr *dyn)
kif = dyn->pfid_kif;
kt = dyn->pfid_kt;
-
if (kt->pfrkt_larg != pfi_update) {
/* this table needs to be brought up-to-date */
pfi_table_update(kt, kif, dyn->pfid_net, dyn->pfid_iflags);
@@ -439,18 +594,28 @@ void
pfi_table_update(struct pfr_ktable *kt, struct pfi_kif *kif, int net, int flags)
{
int e, size2 = 0;
- struct ifg_member *ifgm;
+ struct pfi_kif *p;
+ struct pfr_table t;
+ if ((kif->pfik_flags & PFI_IFLAG_INSTANCE) && kif->pfik_ifp == NULL) {
+ pfr_clr_addrs(&kt->pfrkt_t, NULL, 0);
+ return;
+ }
pfi_buffer_cnt = 0;
-
- if (kif->pfik_ifp != NULL)
+ if ((kif->pfik_flags & PFI_IFLAG_INSTANCE))
pfi_instance_add(kif->pfik_ifp, net, flags);
- else if (kif->pfik_group != NULL)
- TAILQ_FOREACH(ifgm, &kif->pfik_group->ifg_members, ifgm_next)
- pfi_instance_add(ifgm->ifgm_ifp, net, flags);
-
- if ((e = pfr_set_addrs(&kt->pfrkt_t, pfi_buffer, pfi_buffer_cnt, &size2,
- NULL, NULL, NULL, 0, PFR_TFLAG_ALLMASK)))
+ else if (strcmp(kif->pfik_name, "self")) {
+ TAILQ_FOREACH(p, &kif->pfik_grouphead, pfik_instances)
+ pfi_instance_add(p->pfik_ifp, net, flags);
+ } else {
+ RB_FOREACH(p, pfi_ifhead, &pfi_ifs)
+ if (p->pfik_flags & PFI_IFLAG_INSTANCE)
+ pfi_instance_add(p->pfik_ifp, net, flags);
+ }
+ t = kt->pfrkt_t;
+ t.pfrt_flags = 0;
+ if ((e = pfr_set_addrs(&t, pfi_buffer, pfi_buffer_cnt, &size2,
+ NULL, NULL, NULL, 0)))
printf("pfi_table_update: cannot set %d new addresses "
"into table %s: %d\n", pfi_buffer_cnt, kt->pfrkt_name, e);
}
@@ -470,6 +635,18 @@ pfi_instance_add(struct ifnet *ifp, int net, int flags)
af = ia->ifa_addr->sa_family;
if (af != AF_INET && af != AF_INET6)
continue;
+#ifdef __FreeBSD__
+ /*
+ * XXX: For point-to-point interfaces, (ifname:0) and IPv4,
+ * jump over addresses without a proper route to work
+ * around a problem with ppp not fully removing the
+ * address used during IPCP.
+ */
+ if ((ifp->if_flags & IFF_POINTOPOINT) &&
+ !(ia->ifa_flags & IFA_ROUTE) &&
+ (flags & PFI_AFLAG_NOALIAS) && (af == AF_INET))
+ continue;
+#endif
if ((flags & PFI_AFLAG_BROADCAST) && af == AF_INET6)
continue;
if ((flags & PFI_AFLAG_BROADCAST) &&
@@ -494,12 +671,13 @@ pfi_instance_add(struct ifnet *ifp, int net, int flags)
got6 = 1;
net2 = net;
if (net2 == 128 && (flags & PFI_AFLAG_NETWORK)) {
- if (af == AF_INET)
+ if (af == AF_INET) {
net2 = pfi_unmask(&((struct sockaddr_in *)
ia->ifa_netmask)->sin_addr);
- else if (af == AF_INET6)
+ } else if (af == AF_INET6) {
net2 = pfi_unmask(&((struct sockaddr_in6 *)
ia->ifa_netmask)->sin6_addr);
+ }
}
if (af == AF_INET && net2 > 32)
net2 = 32;
@@ -526,8 +704,13 @@ pfi_address_add(struct sockaddr *sa, int af, int net)
pfi_buffer_cnt, PFI_BUFFER_MAX);
return;
}
+#ifdef __FreeBSD__
+ p = malloc(new_max * sizeof(*pfi_buffer), PFI_MTYPE,
+ M_NOWAIT);
+#else
p = malloc(new_max * sizeof(*pfi_buffer), PFI_MTYPE,
M_DONTWAIT);
+#endif
if (p == NULL) {
printf("pfi_address_add: no memory to grow buffer "
"(%d/%d)\n", pfi_buffer_cnt, PFI_BUFFER_MAX);
@@ -547,9 +730,9 @@ pfi_address_add(struct sockaddr *sa, int af, int net)
p->pfra_net = net;
if (af == AF_INET)
p->pfra_ip4addr = ((struct sockaddr_in *)sa)->sin_addr;
- else if (af == AF_INET6) {
+ if (af == AF_INET6) {
p->pfra_ip6addr = ((struct sockaddr_in6 *)sa)->sin6_addr;
- if (IN6_IS_SCOPE_EMBED(&p->pfra_ip6addr))
+ if (IN6_IS_ADDR_LINKLOCAL(&p->pfra_ip6addr))
p->pfra_ip6addr.s6_addr16[1] = 0;
}
/* mask network address bits */
@@ -569,8 +752,9 @@ pfi_dynaddr_remove(struct pf_addr_wrap *aw)
return;
s = splsoftnet();
- TAILQ_REMOVE(&aw->p.dyn->pfid_kif->pfik_dynaddrs, aw->p.dyn, entry);
- pfi_kif_unref(aw->p.dyn->pfid_kif, PFI_KIF_REF_RULE);
+ hook_disestablish(aw->p.dyn->pfid_kif->pfik_ah_head,
+ aw->p.dyn->pfid_hook_cookie);
+ pfi_detach_rule(aw->p.dyn->pfid_kif);
aw->p.dyn->pfid_kif = NULL;
pfr_detach_table(aw->p.dyn->pfid_kt);
aw->p.dyn->pfid_kt = NULL;
@@ -591,12 +775,11 @@ pfi_dynaddr_copyout(struct pf_addr_wrap *aw)
void
pfi_kifaddr_update(void *v)
{
- int s;
- struct pfi_kif *kif = (struct pfi_kif *)v;
+ int s;
s = splsoftnet();
pfi_update++;
- pfi_kif_update(kif);
+ pfi_dohooks(v);
splx(s);
}
@@ -606,16 +789,149 @@ pfi_if_compare(struct pfi_kif *p, struct pfi_kif *q)
return (strncmp(p->pfik_name, q->pfik_name, IFNAMSIZ));
}
+struct pfi_kif *
+pfi_if_create(const char *name, struct pfi_kif *q, int flags)
+{
+ struct pfi_kif *p;
+
+#ifdef __FreeBSD__
+ p = malloc(sizeof(*p), PFI_MTYPE, M_NOWAIT);
+#else
+ p = malloc(sizeof(*p), PFI_MTYPE, M_DONTWAIT);
+#endif
+ if (p == NULL)
+ return (NULL);
+ bzero(p, sizeof(*p));
+#ifdef __FreeBSD__
+ p->pfik_ah_head = malloc(sizeof(*p->pfik_ah_head), PFI_MTYPE,
+ M_NOWAIT);
+#else
+ p->pfik_ah_head = malloc(sizeof(*p->pfik_ah_head), PFI_MTYPE,
+ M_DONTWAIT);
+#endif
+ if (p->pfik_ah_head == NULL) {
+ free(p, PFI_MTYPE);
+ return (NULL);
+ }
+ bzero(p->pfik_ah_head, sizeof(*p->pfik_ah_head));
+ TAILQ_INIT(p->pfik_ah_head);
+ TAILQ_INIT(&p->pfik_grouphead);
+ strlcpy(p->pfik_name, name, sizeof(p->pfik_name));
+ RB_INIT(&p->pfik_lan_ext);
+ RB_INIT(&p->pfik_ext_gwy);
+ p->pfik_flags = flags;
+ p->pfik_parent = q;
+#ifdef __FreeBSD__
+ /*
+ * It seems that the value of time_second is in unintialzied state when
+ * pf sets interface statistics clear time in boot phase if pf was
+ * statically linked to kernel. Instead of setting the bogus time value
+ * have pfi_get_ifaces handle this case. In pfi_get_ifaces it uses
+ * boottime.tv_sec if it sees the time is 0.
+ */
+ p->pfik_tzero = time_second > 1 ? time_second : 0;
+#else
+ p->pfik_tzero = time_second;
+#endif
+
+ RB_INSERT(pfi_ifhead, &pfi_ifs, p);
+ if (q != NULL) {
+ q->pfik_addcnt++;
+ TAILQ_INSERT_TAIL(&q->pfik_grouphead, p, pfik_instances);
+ }
+ pfi_ifcnt++;
+ return (p);
+}
+
+int
+pfi_maybe_destroy(struct pfi_kif *p)
+{
+ int i, j, k, s;
+ struct pfi_kif *q = p->pfik_parent;
+
+#ifdef __FreeBSD__
+ if ((p->pfik_flags & (PFI_IFLAG_ATTACHED | PFI_IFLAG_GROUP)) ||
+ ((p->pfik_rules > 0 || p->pfik_states > 0) &&
+ (p->pfik_flags & PFI_IFLAG_PLACEHOLDER) == 0))
+#else
+ if ((p->pfik_flags & (PFI_IFLAG_ATTACHED | PFI_IFLAG_GROUP)) ||
+ p->pfik_rules > 0 || p->pfik_states > 0)
+#endif
+ return (0);
+
+ s = splsoftnet();
+ if (q != NULL) {
+ for (i = 0; i < 2; i++)
+ for (j = 0; j < 2; j++)
+ for (k = 0; k < 2; k++) {
+ q->pfik_bytes[i][j][k] +=
+ p->pfik_bytes[i][j][k];
+ q->pfik_packets[i][j][k] +=
+ p->pfik_packets[i][j][k];
+#ifdef __FreeBSD__
+ /* clear stats in case we return to the dummy group */
+ p->pfik_bytes[i][j][k] = 0;
+ p->pfik_packets[i][j][k] = 0;
+#endif
+ }
+ q->pfik_delcnt++;
+ TAILQ_REMOVE(&q->pfik_grouphead, p, pfik_instances);
+ }
+#ifdef __FreeBSD__
+ if (p->pfik_rules > 0 || p->pfik_states > 0) {
+ /* move back to the dummy group */
+ p->pfik_parent = pfi_dummy;
+ p->pfik_flags &= ~PFI_IFLAG_INSTANCE;
+ pfi_dummy->pfik_addcnt++;
+ TAILQ_INSERT_TAIL(&pfi_dummy->pfik_grouphead, p,
+ pfik_instances);
+ return (0);
+ }
+#endif
+ pfi_ifcnt--;
+ RB_REMOVE(pfi_ifhead, &pfi_ifs, p);
+ splx(s);
+
+ free(p->pfik_ah_head, PFI_MTYPE);
+ free(p, PFI_MTYPE);
+ return (1);
+}
+
+void
+pfi_copy_group(char *p, const char *q, int m)
+{
+ while (m > 1 && *q && !(*q >= '0' && *q <= '9')) {
+ *p++ = *q++;
+ m--;
+ }
+ if (m > 0)
+ *p++ = '\0';
+}
+
+void
+pfi_newgroup(const char *name, int flags)
+{
+ struct pfi_kif *p;
+
+ p = pfi_lookup_if(name);
+ if (p == NULL)
+ p = pfi_if_create(name, pfi_self, PFI_IFLAG_GROUP);
+ if (p == NULL) {
+ printf("pfi_newgroup: cannot allocate '%s' group", name);
+ return;
+ }
+ p->pfik_flags |= flags;
+}
+
void
pfi_fill_oldstatus(struct pf_status *pfs)
{
- struct pfi_kif *p;
- struct pfi_kif_cmp key;
- int i, j, k, s;
+ struct pfi_kif *p, key;
+ int i, j, k, s;
strlcpy(key.pfik_name, pfs->ifname, sizeof(key.pfik_name));
s = splsoftnet();
- p = RB_FIND(pfi_ifhead, &pfi_ifs, (struct pfi_kif *)&key);
+ p = RB_FIND(pfi_ifhead, &pfi_ifs, &key);
if (p == NULL) {
splx(s);
return;
@@ -634,46 +950,92 @@ pfi_fill_oldstatus(struct pf_status *pfs)
}
int
-pfi_clr_istats(const char *name)
+pfi_clr_istats(const char *name, int *nzero, int flags)
{
struct pfi_kif *p;
- int s;
+ int n = 0, s;
+ long tzero = time_second;
+ ACCEPT_FLAGS(PFI_FLAG_GROUP|PFI_FLAG_INSTANCE);
s = splsoftnet();
RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
- if (pfi_skip_if(name, p))
+ if (pfi_skip_if(name, p, flags))
continue;
bzero(p->pfik_packets, sizeof(p->pfik_packets));
bzero(p->pfik_bytes, sizeof(p->pfik_bytes));
- p->pfik_tzero = time_second;
+ p->pfik_tzero = tzero;
+ n++;
}
splx(s);
+ if (nzero != NULL)
+ *nzero = n;
+ return (0);
+}
+int
+pfi_set_flags(const char *name, int flags)
+{
+ struct pfi_kif *p;
+ int s;
+
+ if (flags & ~PFI_IFLAG_SETABLE_MASK)
+ return (EINVAL);
+
+ s = splsoftnet();
+ RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
+ if (pfi_skip_if(name, p, PFI_FLAG_GROUP|PFI_FLAG_INSTANCE))
+ continue;
+ p->pfik_flags |= flags;
+ }
+ splx(s);
return (0);
}
int
-pfi_get_ifaces(const char *name, struct pfi_kif *buf, int *size)
+pfi_clear_flags(const char *name, int flags)
+{
+ struct pfi_kif *p;
+ int s;
+
+ if (flags & ~PFI_IFLAG_SETABLE_MASK)
+ return (EINVAL);
+
+ s = splsoftnet();
+ RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
+ if (pfi_skip_if(name, p, PFI_FLAG_GROUP|PFI_FLAG_INSTANCE))
+ continue;
+ p->pfik_flags &= ~flags;
+ }
+ splx(s);
+ return (0);
+}
+
+int
+pfi_get_ifaces(const char *name, struct pfi_if *buf, int *size, int flags)
{
- struct pfi_kif *p, *nextp;
+ struct pfi_kif *p;
int s, n = 0;
+#ifdef __FreeBSD__
+ int ec;
+#endif
+ ACCEPT_FLAGS(PFI_FLAG_GROUP|PFI_FLAG_INSTANCE);
s = splsoftnet();
- for (p = RB_MIN(pfi_ifhead, &pfi_ifs); p; p = nextp) {
- nextp = RB_NEXT(pfi_ifhead, &pfi_ifs, p);
- if (pfi_skip_if(name, p))
+ RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
+ if (pfi_skip_if(name, p, flags))
continue;
if (*size > n++) {
if (!p->pfik_tzero)
p->pfik_tzero = time_second;
- pfi_kif_ref(p, PFI_KIF_REF_RULE);
+#ifdef __FreeBSD__
+ PF_COPYOUT(p, buf++, sizeof(*buf), ec);
+ if (ec) {
+#else
if (copyout(p, buf++, sizeof(*buf))) {
- pfi_kif_unref(p, PFI_KIF_REF_RULE);
+#endif
splx(s);
return (EFAULT);
}
- nextp = RB_NEXT(pfi_ifhead, &pfi_ifs, p);
- pfi_kif_unref(p, PFI_KIF_REF_RULE);
}
}
splx(s);
@@ -681,11 +1043,25 @@ pfi_get_ifaces(const char *name, struct pfi_kif *buf, int *size)
return (0);
}
+struct pfi_kif *
+pfi_lookup_if(const char *name)
+{
+ struct pfi_kif *p, key;
+
+ strlcpy(key.pfik_name, name, sizeof(key.pfik_name));
+ p = RB_FIND(pfi_ifhead, &pfi_ifs, &key);
+ return (p);
+}
+
int
-pfi_skip_if(const char *filter, struct pfi_kif *p)
+pfi_skip_if(const char *filter, struct pfi_kif *p, int f)
{
int n;
+ if ((p->pfik_flags & PFI_IFLAG_GROUP) && !(f & PFI_FLAG_GROUP))
+ return (1);
+ if ((p->pfik_flags & PFI_IFLAG_INSTANCE) && !(f & PFI_FLAG_INSTANCE))
+ return (1);
if (filter == NULL || !*filter)
return (0);
if (!strcmp(p->pfik_name, filter))
@@ -700,38 +1076,6 @@ pfi_skip_if(const char *filter, struct pfi_kif *p)
return (p->pfik_name[n] < '0' || p->pfik_name[n] > '9');
}
-int
-pfi_set_flags(const char *name, int flags)
-{
- struct pfi_kif *p;
- int s;
-
- s = splsoftnet();
- RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
- if (pfi_skip_if(name, p))
- continue;
- p->pfik_flags |= flags;
- }
- splx(s);
- return (0);
-}
-
-int
-pfi_clear_flags(const char *name, int flags)
-{
- struct pfi_kif *p;
- int s;
-
- s = splsoftnet();
- RB_FOREACH(p, pfi_ifhead, &pfi_ifs) {
- if (pfi_skip_if(name, p))
- continue;
- p->pfik_flags &= ~flags;
- }
- splx(s);
- return (0);
-}
-
/* from pf_print_state.c */
int
pfi_unmask(void *addr)
@@ -752,3 +1096,44 @@ pfi_unmask(void *addr)
return (b);
}
+void
+pfi_dohooks(struct pfi_kif *p)
+{
+ for (; p != NULL; p = p->pfik_parent)
+ dohooks(p->pfik_ah_head, 0);
+}
+
+int
+pfi_match_addr(struct pfi_dynaddr *dyn, struct pf_addr *a, sa_family_t af)
+{
+ switch (af) {
+#ifdef INET
+ case AF_INET:
+ switch (dyn->pfid_acnt4) {
+ case 0:
+ return (0);
+ case 1:
+ return (PF_MATCHA(0, &dyn->pfid_addr4,
+ &dyn->pfid_mask4, a, AF_INET));
+ default:
+ return (pfr_match_addr(dyn->pfid_kt, a, AF_INET));
+ }
+ break;
+#endif /* INET */
+#ifdef INET6
+ case AF_INET6:
+ switch (dyn->pfid_acnt6) {
+ case 0:
+ return (0);
+ case 1:
+ return (PF_MATCHA(0, &dyn->pfid_addr6,
+ &dyn->pfid_mask6, a, AF_INET6));
+ default:
+ return (pfr_match_addr(dyn->pfid_kt, a, AF_INET6));
+ }
+ break;
+#endif /* INET6 */
+ default:
+ return (0);
+ }
+}
diff --git a/sys/contrib/pf/net/pf_ioctl.c b/sys/contrib/pf/net/pf_ioctl.c
index 5694717..ddb2fec 100644
--- a/sys/contrib/pf/net/pf_ioctl.c
+++ b/sys/contrib/pf/net/pf_ioctl.c
@@ -1,4 +1,6 @@
-/* $OpenBSD: pf_ioctl.c,v 1.175 2007/02/26 22:47:43 deraadt Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: pf_ioctl.c,v 1.139 2005/03/03 07:13:39 dhartmei Exp $ */
+/* add: $OpenBSD: pf_ioctl.c,v 1.168 2006/07/21 01:21:17 dhartmei Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -35,7 +37,38 @@
*
*/
+#ifdef __FreeBSD__
+#include "opt_inet.h"
+#include "opt_inet6.h"
+#endif
+
+#ifdef __FreeBSD__
+#include "opt_bpf.h"
+#include "opt_pf.h"
+
+#ifdef DEV_BPF
+#define NBPFILTER DEV_BPF
+#else
+#define NBPFILTER 0
+#endif
+
+#ifdef DEV_PFLOG
+#define NPFLOG DEV_PFLOG
+#else
+#define NPFLOG 0
+#endif
+
+#ifdef DEV_PFSYNC
+#define NPFSYNC DEV_PFSYNC
+#else
+#define NPFSYNC 0
+#endif
+
+#else
+#include "bpfilter.h"
+#include "pflog.h"
#include "pfsync.h"
+#endif
#include <sys/param.h>
#include <sys/systm.h>
@@ -46,13 +79,15 @@
#include <sys/socketvar.h>
#include <sys/kernel.h>
#include <sys/time.h>
+#include <sys/malloc.h>
+#ifdef __FreeBSD__
+#include <sys/module.h>
+#include <sys/conf.h>
+#include <sys/proc.h>
+#else
#include <sys/timeout.h>
#include <sys/pool.h>
-#include <sys/proc.h>
-#include <sys/malloc.h>
-#include <sys/kthread.h>
-#include <sys/rwlock.h>
-#include <uvm/uvm_extern.h>
+#endif
#include <net/if.h>
#include <net/if_types.h>
@@ -65,17 +100,18 @@
#include <netinet/ip_var.h>
#include <netinet/ip_icmp.h>
+#ifndef __FreeBSD__
#include <dev/rndvar.h>
-#include <crypto/md5.h>
+#endif
#include <net/pfvar.h>
#if NPFSYNC > 0
#include <net/if_pfsync.h>
#endif /* NPFSYNC > 0 */
-#if NPFLOG > 0
+#ifdef __FreeBSD__
#include <net/if_pflog.h>
-#endif /* NPFLOG > 0 */
+#endif
#ifdef INET6
#include <netinet/ip6.h>
@@ -86,16 +122,39 @@
#include <altq/altq.h>
#endif
+#ifdef __FreeBSD__
+#include <sys/limits.h>
+#include <sys/lock.h>
+#include <sys/mutex.h>
+#include <net/pfil.h>
+#endif /* __FreeBSD__ */
+
+#ifdef __FreeBSD__
+void init_zone_var(void);
+void cleanup_pf_zone(void);
+int pfattach(void);
+#else
void pfattach(int);
-void pf_thread_create(void *);
int pfopen(dev_t, int, int, struct proc *);
int pfclose(dev_t, int, int, struct proc *);
+#endif
struct pf_pool *pf_get_pool(char *, u_int32_t, u_int8_t, u_int32_t,
u_int8_t, u_int8_t, u_int8_t);
+int pf_get_ruleset_number(u_int8_t);
+void pf_init_ruleset(struct pf_ruleset *);
+int pf_anchor_setup(struct pf_rule *,
+ const struct pf_ruleset *, const char *);
+int pf_anchor_copyout(const struct pf_ruleset *,
+ const struct pf_rule *, struct pfioc_rule *);
+void pf_anchor_remove(struct pf_rule *);
void pf_mv_pool(struct pf_palist *, struct pf_palist *);
void pf_empty_pool(struct pf_palist *);
-int pfioctl(dev_t, u_long, caddr_t, int, struct proc *);
+#ifdef __FreeBSD__
+int pfioctl(struct cdev *, u_long, caddr_t, int, struct thread *);
+#else
+int pfioctl(struct cdev *, u_long, caddr_t, int, struct proc *);
+#endif
#ifdef ALTQ
int pf_begin_altq(u_int32_t *);
int pf_rollback_altq(u_int32_t);
@@ -105,13 +164,15 @@ int pf_disable_altq(struct pf_altq *);
#endif /* ALTQ */
int pf_begin_rules(u_int32_t *, int, const char *);
int pf_rollback_rules(u_int32_t, int, char *);
-int pf_setup_pfsync_matching(struct pf_ruleset *);
-void pf_hash_rule(MD5_CTX *, struct pf_rule *);
-void pf_hash_rule_addr(MD5_CTX *, struct pf_rule_addr *);
int pf_commit_rules(u_int32_t, int, char *);
+#ifdef __FreeBSD__
+extern struct callout pf_expire_to;
+#else
+extern struct timeout pf_expire_to;
+#endif
+
struct pf_rule pf_default_rule;
-struct rwlock pf_consistency_lock = RWLOCK_INITIALIZER;
#ifdef ALTQ
static int pf_altq_running;
#endif
@@ -123,15 +184,194 @@ TAILQ_HEAD(pf_tags, pf_tagname) pf_tags = TAILQ_HEAD_INITIALIZER(pf_tags),
#if (PF_QNAME_SIZE != PF_TAG_NAME_SIZE)
#error PF_QNAME_SIZE must be equal to PF_TAG_NAME_SIZE
#endif
-u_int16_t tagname2tag(struct pf_tags *, char *);
-void tag2tagname(struct pf_tags *, u_int16_t, char *);
-void tag_unref(struct pf_tags *, u_int16_t);
+static u_int16_t tagname2tag(struct pf_tags *, char *);
+static void tag2tagname(struct pf_tags *, u_int16_t, char *);
+static void tag_unref(struct pf_tags *, u_int16_t);
int pf_rtlabel_add(struct pf_addr_wrap *);
void pf_rtlabel_remove(struct pf_addr_wrap *);
void pf_rtlabel_copyout(struct pf_addr_wrap *);
#define DPFPRINTF(n, x) if (pf_status.debug >= (n)) printf x
+
+#ifdef __FreeBSD__
+static struct cdev *pf_dev;
+
+/*
+ * XXX - These are new and need to be checked when moveing to a new version
+ */
+static void pf_clear_states(void);
+static int pf_clear_tables(void);
+static void pf_clear_srcnodes(void);
+/*
+ * XXX - These are new and need to be checked when moveing to a new version
+ */
+
+/*
+ * Wrapper functions for pfil(9) hooks
+ */
+static int pf_check_in(void *arg, struct mbuf **m, struct ifnet *ifp,
+ int dir, struct inpcb *inp);
+static int pf_check_out(void *arg, struct mbuf **m, struct ifnet *ifp,
+ int dir, struct inpcb *inp);
+#ifdef INET6
+static int pf_check6_in(void *arg, struct mbuf **m, struct ifnet *ifp,
+ int dir, struct inpcb *inp);
+static int pf_check6_out(void *arg, struct mbuf **m, struct ifnet *ifp,
+ int dir, struct inpcb *inp);
+#endif
+
+static int hook_pf(void);
+static int dehook_pf(void);
+static int shutdown_pf(void);
+static int pf_load(void);
+static int pf_unload(void);
+
+static struct cdevsw pf_cdevsw = {
+ .d_ioctl = pfioctl,
+ .d_name = PF_NAME,
+ .d_version = D_VERSION,
+};
+
+static volatile int pf_pfil_hooked = 0;
+struct mtx pf_task_mtx;
+pflog_packet_t *pflog_packet_ptr = NULL;
+
+void
+init_pf_mutex(void)
+{
+ mtx_init(&pf_task_mtx, "pf task mtx", NULL, MTX_DEF);
+}
+
+void
+destroy_pf_mutex(void)
+{
+ mtx_destroy(&pf_task_mtx);
+}
+
+void
+init_zone_var(void)
+{
+ pf_src_tree_pl = pf_rule_pl = NULL;
+ pf_state_pl = pf_altq_pl = pf_pooladdr_pl = NULL;
+ pf_frent_pl = pf_frag_pl = pf_cache_pl = pf_cent_pl = NULL;
+ pf_state_scrub_pl = NULL;
+ pfr_ktable_pl = pfr_kentry_pl = NULL;
+}
+
+void
+cleanup_pf_zone(void)
+{
+ UMA_DESTROY(pf_src_tree_pl);
+ UMA_DESTROY(pf_rule_pl);
+ UMA_DESTROY(pf_state_pl);
+ UMA_DESTROY(pf_altq_pl);
+ UMA_DESTROY(pf_pooladdr_pl);
+ UMA_DESTROY(pf_frent_pl);
+ UMA_DESTROY(pf_frag_pl);
+ UMA_DESTROY(pf_cache_pl);
+ UMA_DESTROY(pf_cent_pl);
+ UMA_DESTROY(pfr_ktable_pl);
+ UMA_DESTROY(pfr_kentry_pl2);
+ UMA_DESTROY(pfr_kentry_pl);
+ UMA_DESTROY(pf_state_scrub_pl);
+ UMA_DESTROY(pfi_addr_pl);
+}
+
+int
+pfattach(void)
+{
+ u_int32_t *my_timeout = pf_default_rule.timeout;
+ int error = 1;
+
+ do {
+ UMA_CREATE(pf_src_tree_pl,struct pf_src_node, "pfsrctrpl");
+ UMA_CREATE(pf_rule_pl, struct pf_rule, "pfrulepl");
+ UMA_CREATE(pf_state_pl, struct pf_state, "pfstatepl");
+ UMA_CREATE(pf_altq_pl, struct pf_altq, "pfaltqpl");
+ UMA_CREATE(pf_pooladdr_pl, struct pf_pooladdr, "pfpooladdrpl");
+ UMA_CREATE(pfr_ktable_pl, struct pfr_ktable, "pfrktable");
+ UMA_CREATE(pfr_kentry_pl, struct pfr_kentry, "pfrkentry");
+ UMA_CREATE(pfr_kentry_pl2, struct pfr_kentry, "pfrkentry2");
+ UMA_CREATE(pf_frent_pl, struct pf_frent, "pffrent");
+ UMA_CREATE(pf_frag_pl, struct pf_fragment, "pffrag");
+ UMA_CREATE(pf_cache_pl, struct pf_fragment, "pffrcache");
+ UMA_CREATE(pf_cent_pl, struct pf_frcache, "pffrcent");
+ UMA_CREATE(pf_state_scrub_pl, struct pf_state_scrub,
+ "pfstatescrub");
+ UMA_CREATE(pfi_addr_pl, struct pfi_dynaddr, "pfiaddrpl");
+ error = 0;
+ } while(0);
+ if (error) {
+ cleanup_pf_zone();
+ return (error);
+ }
+ pfr_initialize();
+ pfi_initialize();
+ if ( (error = pf_osfp_initialize()) ) {
+ cleanup_pf_zone();
+ pf_osfp_cleanup();
+ return (error);
+ }
+
+ pf_pool_limits[PF_LIMIT_STATES].pp = pf_state_pl;
+ pf_pool_limits[PF_LIMIT_STATES].limit = PFSTATE_HIWAT;
+ pf_pool_limits[PF_LIMIT_SRC_NODES].pp = pf_src_tree_pl;
+ pf_pool_limits[PF_LIMIT_SRC_NODES].limit = PFSNODE_HIWAT;
+ pf_pool_limits[PF_LIMIT_FRAGS].pp = pf_frent_pl;
+ pf_pool_limits[PF_LIMIT_FRAGS].limit = PFFRAG_FRENT_HIWAT;
+ uma_zone_set_max(pf_pool_limits[PF_LIMIT_STATES].pp,
+ pf_pool_limits[PF_LIMIT_STATES].limit);
+
+ RB_INIT(&tree_src_tracking);
+ RB_INIT(&pf_anchors);
+ pf_init_ruleset(&pf_main_ruleset);
+ TAILQ_INIT(&pf_altqs[0]);
+ TAILQ_INIT(&pf_altqs[1]);
+ TAILQ_INIT(&pf_pabuf);
+ pf_altqs_active = &pf_altqs[0];
+ pf_altqs_inactive = &pf_altqs[1];
+ TAILQ_INIT(&state_updates);
+
+ /* default rule should never be garbage collected */
+ pf_default_rule.entries.tqe_prev = &pf_default_rule.entries.tqe_next;
+ pf_default_rule.action = PF_PASS;
+ pf_default_rule.nr = -1;
+
+ /* initialize default timeouts */
+ my_timeout[PFTM_TCP_FIRST_PACKET] = PFTM_TCP_FIRST_PACKET_VAL;
+ my_timeout[PFTM_TCP_OPENING] = PFTM_TCP_OPENING_VAL;
+ my_timeout[PFTM_TCP_ESTABLISHED] = PFTM_TCP_ESTABLISHED_VAL;
+ my_timeout[PFTM_TCP_CLOSING] = PFTM_TCP_CLOSING_VAL;
+ my_timeout[PFTM_TCP_FIN_WAIT] = PFTM_TCP_FIN_WAIT_VAL;
+ my_timeout[PFTM_TCP_CLOSED] = PFTM_TCP_CLOSED_VAL;
+ my_timeout[PFTM_UDP_FIRST_PACKET] = PFTM_UDP_FIRST_PACKET_VAL;
+ my_timeout[PFTM_UDP_SINGLE] = PFTM_UDP_SINGLE_VAL;
+ my_timeout[PFTM_UDP_MULTIPLE] = PFTM_UDP_MULTIPLE_VAL;
+ my_timeout[PFTM_ICMP_FIRST_PACKET] = PFTM_ICMP_FIRST_PACKET_VAL;
+ my_timeout[PFTM_ICMP_ERROR_REPLY] = PFTM_ICMP_ERROR_REPLY_VAL;
+ my_timeout[PFTM_OTHER_FIRST_PACKET] = PFTM_OTHER_FIRST_PACKET_VAL;
+ my_timeout[PFTM_OTHER_SINGLE] = PFTM_OTHER_SINGLE_VAL;
+ my_timeout[PFTM_OTHER_MULTIPLE] = PFTM_OTHER_MULTIPLE_VAL;
+ my_timeout[PFTM_FRAG] = PFTM_FRAG_VAL;
+ my_timeout[PFTM_INTERVAL] = PFTM_INTERVAL_VAL;
+ my_timeout[PFTM_SRC_NODE] = PFTM_SRC_NODE_VAL;
+ my_timeout[PFTM_TS_DIFF] = PFTM_TS_DIFF_VAL;
+
+ callout_init(&pf_expire_to, NET_CALLOUT_MPSAFE);
+ callout_reset(&pf_expire_to, my_timeout[PFTM_INTERVAL] * hz,
+ pf_purge_timeout, &pf_expire_to);
+
+ pf_normalize_init();
+ bzero(&pf_status, sizeof(pf_status));
+ pf_pfil_hooked = 0;
+
+ /* XXX do our best to avoid a conflict */
+ pf_status.hostid = arc4random();
+
+ return (error);
+}
+#else /* !__FreeBSD__ */
void
pfattach(int num)
{
@@ -154,10 +394,6 @@ pfattach(int num)
pool_sethardlimit(pf_pool_limits[PF_LIMIT_STATES].pp,
pf_pool_limits[PF_LIMIT_STATES].limit, NULL, 0);
- if (ctob(physmem) <= 100*1024*1024)
- pf_pool_limits[PF_LIMIT_TABLE_ENTRIES].limit =
- PFR_KENTRY_HIWAT_SMALL;
-
RB_INIT(&tree_src_tracking);
RB_INIT(&pf_anchors);
pf_init_ruleset(&pf_main_ruleset);
@@ -166,13 +402,12 @@ pfattach(int num)
TAILQ_INIT(&pf_pabuf);
pf_altqs_active = &pf_altqs[0];
pf_altqs_inactive = &pf_altqs[1];
- TAILQ_INIT(&state_list);
+ TAILQ_INIT(&state_updates);
/* default rule should never be garbage collected */
pf_default_rule.entries.tqe_prev = &pf_default_rule.entries.tqe_next;
pf_default_rule.action = PF_PASS;
pf_default_rule.nr = -1;
- pf_default_rule.rtableid = -1;
/* initialize default timeouts */
timeout[PFTM_TCP_FIRST_PACKET] = PFTM_TCP_FIRST_PACKET_VAL;
@@ -193,8 +428,9 @@ pfattach(int num)
timeout[PFTM_INTERVAL] = PFTM_INTERVAL_VAL;
timeout[PFTM_SRC_NODE] = PFTM_SRC_NODE_VAL;
timeout[PFTM_TS_DIFF] = PFTM_TS_DIFF_VAL;
- timeout[PFTM_ADAPTIVE_START] = PFSTATE_ADAPT_START;
- timeout[PFTM_ADAPTIVE_END] = PFSTATE_ADAPT_END;
+
+ timeout_set(&pf_expire_to, pf_purge_timeout, &pf_expire_to);
+ timeout_add(&pf_expire_to, timeout[PFTM_INTERVAL] * hz);
pf_normalize_init();
bzero(&pf_status, sizeof(pf_status));
@@ -202,20 +438,10 @@ pfattach(int num)
/* XXX do our best to avoid a conflict */
pf_status.hostid = arc4random();
-
- /* require process context to purge states, so perform in a thread */
- kthread_create_deferred(pf_thread_create, NULL);
-}
-
-void
-pf_thread_create(void *v)
-{
- if (kthread_create(pf_purge_thread, NULL, NULL, "pfpurge"))
- panic("pfpurge thread");
}
int
-pfopen(dev_t dev, int flags, int fmt, struct proc *p)
+pfopen(struct cdev *dev, int flags, int fmt, struct proc *p)
{
if (minor(dev) >= 1)
return (ENXIO);
@@ -223,12 +449,13 @@ pfopen(dev_t dev, int flags, int fmt, struct proc *p)
}
int
-pfclose(dev_t dev, int flags, int fmt, struct proc *p)
+pfclose(struct cdev *dev, int flags, int fmt, struct proc *p)
{
if (minor(dev) >= 1)
return (ENXIO);
return (0);
}
+#endif /* __FreeBSD__ */
struct pf_pool *
pf_get_pool(char *anchor, u_int32_t ticket, u_int8_t rule_action,
@@ -274,6 +501,312 @@ pf_get_pool(char *anchor, u_int32_t ticket, u_int8_t rule_action,
return (&rule->rpool);
}
+int
+pf_get_ruleset_number(u_int8_t action)
+{
+ switch (action) {
+ case PF_SCRUB:
+ case PF_NOSCRUB:
+ return (PF_RULESET_SCRUB);
+ break;
+ case PF_PASS:
+ case PF_DROP:
+ return (PF_RULESET_FILTER);
+ break;
+ case PF_NAT:
+ case PF_NONAT:
+ return (PF_RULESET_NAT);
+ break;
+ case PF_BINAT:
+ case PF_NOBINAT:
+ return (PF_RULESET_BINAT);
+ break;
+ case PF_RDR:
+ case PF_NORDR:
+ return (PF_RULESET_RDR);
+ break;
+ default:
+ return (PF_RULESET_MAX);
+ break;
+ }
+}
+
+void
+pf_init_ruleset(struct pf_ruleset *ruleset)
+{
+ int i;
+
+ memset(ruleset, 0, sizeof(struct pf_ruleset));
+ for (i = 0; i < PF_RULESET_MAX; i++) {
+ TAILQ_INIT(&ruleset->rules[i].queues[0]);
+ TAILQ_INIT(&ruleset->rules[i].queues[1]);
+ ruleset->rules[i].active.ptr = &ruleset->rules[i].queues[0];
+ ruleset->rules[i].inactive.ptr = &ruleset->rules[i].queues[1];
+ }
+}
+
+struct pf_anchor *
+pf_find_anchor(const char *path)
+{
+ static struct pf_anchor key;
+
+ memset(&key, 0, sizeof(key));
+ strlcpy(key.path, path, sizeof(key.path));
+ return (RB_FIND(pf_anchor_global, &pf_anchors, &key));
+}
+
+struct pf_ruleset *
+pf_find_ruleset(const char *path)
+{
+ struct pf_anchor *anchor;
+
+ while (*path == '/')
+ path++;
+ if (!*path)
+ return (&pf_main_ruleset);
+ anchor = pf_find_anchor(path);
+ if (anchor == NULL)
+ return (NULL);
+ else
+ return (&anchor->ruleset);
+}
+
+struct pf_ruleset *
+pf_find_or_create_ruleset(const char *path)
+{
+ static char p[MAXPATHLEN];
+ char *q = NULL, *r; /* make the compiler happy */
+ struct pf_ruleset *ruleset;
+ struct pf_anchor *anchor = NULL, *dup, *parent = NULL;
+
+ while (*path == '/')
+ path++;
+ ruleset = pf_find_ruleset(path);
+ if (ruleset != NULL)
+ return (ruleset);
+ strlcpy(p, path, sizeof(p));
+#ifdef __FreeBSD__
+ while (parent == NULL && (q = rindex(p, '/')) != NULL) {
+#else
+ while (parent == NULL && (q = strrchr(p, '/')) != NULL) {
+#endif
+ *q = 0;
+ if ((ruleset = pf_find_ruleset(p)) != NULL) {
+ parent = ruleset->anchor;
+ break;
+ }
+ }
+ if (q == NULL)
+ q = p;
+ else
+ q++;
+ strlcpy(p, path, sizeof(p));
+ if (!*q)
+ return (NULL);
+#ifdef __FreeBSD__
+ while ((r = index(q, '/')) != NULL || *q) {
+#else
+ while ((r = strchr(q, '/')) != NULL || *q) {
+#endif
+ if (r != NULL)
+ *r = 0;
+ if (!*q || strlen(q) >= PF_ANCHOR_NAME_SIZE ||
+ (parent != NULL && strlen(parent->path) >=
+ MAXPATHLEN - PF_ANCHOR_NAME_SIZE - 1))
+ return (NULL);
+ anchor = (struct pf_anchor *)malloc(sizeof(*anchor), M_TEMP,
+ M_NOWAIT);
+ if (anchor == NULL)
+ return (NULL);
+ memset(anchor, 0, sizeof(*anchor));
+ RB_INIT(&anchor->children);
+ strlcpy(anchor->name, q, sizeof(anchor->name));
+ if (parent != NULL) {
+ strlcpy(anchor->path, parent->path,
+ sizeof(anchor->path));
+ strlcat(anchor->path, "/", sizeof(anchor->path));
+ }
+ strlcat(anchor->path, anchor->name, sizeof(anchor->path));
+ if ((dup = RB_INSERT(pf_anchor_global, &pf_anchors, anchor)) !=
+ NULL) {
+ printf("pf_find_or_create_ruleset: RB_INSERT1 "
+ "'%s' '%s' collides with '%s' '%s'\n",
+ anchor->path, anchor->name, dup->path, dup->name);
+ free(anchor, M_TEMP);
+ return (NULL);
+ }
+ if (parent != NULL) {
+ anchor->parent = parent;
+ if ((dup = RB_INSERT(pf_anchor_node, &parent->children,
+ anchor)) != NULL) {
+ printf("pf_find_or_create_ruleset: "
+ "RB_INSERT2 '%s' '%s' collides with "
+ "'%s' '%s'\n", anchor->path, anchor->name,
+ dup->path, dup->name);
+ RB_REMOVE(pf_anchor_global, &pf_anchors,
+ anchor);
+ free(anchor, M_TEMP);
+ return (NULL);
+ }
+ }
+ pf_init_ruleset(&anchor->ruleset);
+ anchor->ruleset.anchor = anchor;
+ parent = anchor;
+ if (r != NULL)
+ q = r + 1;
+ else
+ *q = 0;
+ }
+ return (&anchor->ruleset);
+}
+
+void
+pf_remove_if_empty_ruleset(struct pf_ruleset *ruleset)
+{
+ struct pf_anchor *parent;
+ int i;
+
+ while (ruleset != NULL) {
+ if (ruleset == &pf_main_ruleset || ruleset->anchor == NULL ||
+ !RB_EMPTY(&ruleset->anchor->children) ||
+ ruleset->anchor->refcnt > 0 || ruleset->tables > 0 ||
+ ruleset->topen)
+ return;
+ for (i = 0; i < PF_RULESET_MAX; ++i)
+ if (!TAILQ_EMPTY(ruleset->rules[i].active.ptr) ||
+ !TAILQ_EMPTY(ruleset->rules[i].inactive.ptr) ||
+ ruleset->rules[i].inactive.open)
+ return;
+ RB_REMOVE(pf_anchor_global, &pf_anchors, ruleset->anchor);
+ if ((parent = ruleset->anchor->parent) != NULL)
+ RB_REMOVE(pf_anchor_node, &parent->children,
+ ruleset->anchor);
+ free(ruleset->anchor, M_TEMP);
+ if (parent == NULL)
+ return;
+ ruleset = &parent->ruleset;
+ }
+}
+
+int
+pf_anchor_setup(struct pf_rule *r, const struct pf_ruleset *s,
+ const char *name)
+{
+ static char *p, path[MAXPATHLEN];
+ struct pf_ruleset *ruleset;
+
+ r->anchor = NULL;
+ r->anchor_relative = 0;
+ r->anchor_wildcard = 0;
+ if (!name[0])
+ return (0);
+ if (name[0] == '/')
+ strlcpy(path, name + 1, sizeof(path));
+ else {
+ /* relative path */
+ r->anchor_relative = 1;
+ if (s->anchor == NULL || !s->anchor->path[0])
+ path[0] = 0;
+ else
+ strlcpy(path, s->anchor->path, sizeof(path));
+ while (name[0] == '.' && name[1] == '.' && name[2] == '/') {
+ if (!path[0]) {
+ printf("pf_anchor_setup: .. beyond root\n");
+ return (1);
+ }
+#ifdef __FreeBSD__
+ if ((p = rindex(path, '/')) != NULL)
+#else
+ if ((p = strrchr(path, '/')) != NULL)
+#endif
+ *p = 0;
+ else
+ path[0] = 0;
+ r->anchor_relative++;
+ name += 3;
+ }
+ if (path[0])
+ strlcat(path, "/", sizeof(path));
+ strlcat(path, name, sizeof(path));
+ }
+#ifdef __FreeBSD__
+ if ((p = rindex(path, '/')) != NULL && !strcmp(p, "/*")) {
+#else
+ if ((p = strrchr(path, '/')) != NULL && !strcmp(p, "/*")) {
+#endif
+ r->anchor_wildcard = 1;
+ *p = 0;
+ }
+ ruleset = pf_find_or_create_ruleset(path);
+ if (ruleset == NULL || ruleset->anchor == NULL) {
+ printf("pf_anchor_setup: ruleset\n");
+ return (1);
+ }
+ r->anchor = ruleset->anchor;
+ r->anchor->refcnt++;
+ return (0);
+}
+
+int
+pf_anchor_copyout(const struct pf_ruleset *rs, const struct pf_rule *r,
+ struct pfioc_rule *pr)
+{
+ pr->anchor_call[0] = 0;
+ if (r->anchor == NULL)
+ return (0);
+ if (!r->anchor_relative) {
+ strlcpy(pr->anchor_call, "/", sizeof(pr->anchor_call));
+ strlcat(pr->anchor_call, r->anchor->path,
+ sizeof(pr->anchor_call));
+ } else {
+ char a[MAXPATHLEN], b[MAXPATHLEN], *p;
+ int i;
+
+ if (rs->anchor == NULL)
+ a[0] = 0;
+ else
+ strlcpy(a, rs->anchor->path, sizeof(a));
+ strlcpy(b, r->anchor->path, sizeof(b));
+ for (i = 1; i < r->anchor_relative; ++i) {
+#ifdef __FreeBSD__
+ if ((p = rindex(a, '/')) == NULL)
+#else
+ if ((p = strrchr(a, '/')) == NULL)
+#endif
+ p = a;
+ *p = 0;
+ strlcat(pr->anchor_call, "../",
+ sizeof(pr->anchor_call));
+ }
+ if (strncmp(a, b, strlen(a))) {
+ printf("pf_anchor_copyout: '%s' '%s'\n", a, b);
+ return (1);
+ }
+ if (strlen(b) > strlen(a))
+ strlcat(pr->anchor_call, b + (a[0] ? strlen(a) + 1 : 0),
+ sizeof(pr->anchor_call));
+ }
+ if (r->anchor_wildcard)
+ strlcat(pr->anchor_call, pr->anchor_call[0] ? "/*" : "*",
+ sizeof(pr->anchor_call));
+ return (0);
+}
+
+void
+pf_anchor_remove(struct pf_rule *r)
+{
+ if (r->anchor == NULL)
+ return;
+ if (r->anchor->refcnt <= 0) {
+ printf("pf_anchor_remove: broken refcount");
+ r->anchor = NULL;
+ return;
+ }
+ if (!--r->anchor->refcnt)
+ pf_remove_if_empty_ruleset(&r->anchor->ruleset);
+ r->anchor = NULL;
+}
+
void
pf_mv_pool(struct pf_palist *poola, struct pf_palist *poolb)
{
@@ -293,7 +826,7 @@ pf_empty_pool(struct pf_palist *poola)
while ((empty_pool_pa = TAILQ_FIRST(poola)) != NULL) {
pfi_dynaddr_remove(&empty_pool_pa->addr);
pf_tbladdr_remove(&empty_pool_pa->addr);
- pfi_kif_unref(empty_pool_pa->kif, PFI_KIF_REF_RULE);
+ pfi_detach_rule(empty_pool_pa->kif);
TAILQ_REMOVE(poola, empty_pool_pa, entries);
pool_put(&pf_pooladdr_pl, empty_pool_pa);
}
@@ -339,13 +872,13 @@ pf_rm_rule(struct pf_rulequeue *rulequeue, struct pf_rule *rule)
if (rule->overload_tbl)
pfr_detach_table(rule->overload_tbl);
}
- pfi_kif_unref(rule->kif, PFI_KIF_REF_RULE);
+ pfi_detach_rule(rule->kif);
pf_anchor_remove(rule);
pf_empty_pool(&rule->rpool.list);
pool_put(&pf_rule_pl, rule);
}
-u_int16_t
+static u_int16_t
tagname2tag(struct pf_tags *head, char *tagname)
{
struct pf_tagname *tag, *p = NULL;
@@ -390,7 +923,7 @@ tagname2tag(struct pf_tags *head, char *tagname)
return (tag->tag);
}
-void
+static void
tag2tagname(struct pf_tags *head, u_int16_t tagid, char *p)
{
struct pf_tagname *tag;
@@ -402,7 +935,7 @@ tag2tagname(struct pf_tags *head, u_int16_t tagid, char *p)
}
}
-void
+static void
tag_unref(struct pf_tags *head, u_int16_t tag)
{
struct pf_tagname *p, *next;
@@ -431,7 +964,7 @@ pf_tagname2tag(char *tagname)
void
pf_tag2tagname(u_int16_t tagid, char *p)
{
- tag2tagname(&pf_tags, tagid, p);
+ return (tag2tagname(&pf_tags, tagid, p));
}
void
@@ -449,28 +982,42 @@ pf_tag_ref(u_int16_t tag)
void
pf_tag_unref(u_int16_t tag)
{
- tag_unref(&pf_tags, tag);
+ return (tag_unref(&pf_tags, tag));
}
int
pf_rtlabel_add(struct pf_addr_wrap *a)
{
+#ifdef __FreeBSD__
+ /* XXX_IMPORT: later */
+ return (0);
+#else
if (a->type == PF_ADDR_RTLABEL &&
(a->v.rtlabel = rtlabel_name2id(a->v.rtlabelname)) == 0)
return (-1);
return (0);
+#endif
}
void
pf_rtlabel_remove(struct pf_addr_wrap *a)
{
+#ifdef __FreeBSD__
+ /* XXX_IMPORT: later */
+#else
if (a->type == PF_ADDR_RTLABEL)
rtlabel_unref(a->v.rtlabel);
+#endif
}
void
pf_rtlabel_copyout(struct pf_addr_wrap *a)
{
+#ifdef __FreeBSD__
+ /* XXX_IMPORT: later */
+ if (a->type == PF_ADDR_RTLABEL && a->v.rtlabel)
+ strlcpy(a->v.rtlabelname, "?", sizeof(a->v.rtlabelname));
+#else
const char *name;
if (a->type == PF_ADDR_RTLABEL && a->v.rtlabel) {
@@ -481,6 +1028,7 @@ pf_rtlabel_copyout(struct pf_addr_wrap *a)
strlcpy(a->v.rtlabelname, name,
sizeof(a->v.rtlabelname));
}
+#endif
}
#ifdef ALTQ
@@ -493,13 +1041,13 @@ pf_qname2qid(char *qname)
void
pf_qid2qname(u_int32_t qid, char *p)
{
- tag2tagname(&pf_qids, (u_int16_t)qid, p);
+ return (tag2tagname(&pf_qids, (u_int16_t)qid, p));
}
void
pf_qid_unref(u_int32_t qid)
{
- tag_unref(&pf_qids, (u_int16_t)qid);
+ return (tag_unref(&pf_qids, (u_int16_t)qid));
}
int
@@ -618,8 +1166,14 @@ pf_enable_altq(struct pf_altq *altq)
if (error == 0 && ifp != NULL && ALTQ_IS_ENABLED(&ifp->if_snd)) {
tb.rate = altq->ifbandwidth;
tb.depth = altq->tbrsize;
- s = splnet();
+ s = splimp();
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
error = tbr_set(&ifp->if_snd, &tb);
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
splx(s);
}
@@ -648,8 +1202,14 @@ pf_disable_altq(struct pf_altq *altq)
if (error == 0) {
/* clear tokenbucket regulator */
tb.rate = 0;
- s = splnet();
+ s = splimp();
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
error = tbr_set(&ifp->if_snd, &tb);
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
splx(s);
}
@@ -668,10 +1228,8 @@ pf_begin_rules(u_int32_t *ticket, int rs_num, const char *anchor)
rs = pf_find_or_create_ruleset(anchor);
if (rs == NULL)
return (EINVAL);
- while ((rule = TAILQ_FIRST(rs->rules[rs_num].inactive.ptr)) != NULL) {
+ while ((rule = TAILQ_FIRST(rs->rules[rs_num].inactive.ptr)) != NULL)
pf_rm_rule(rs->rules[rs_num].inactive.ptr, rule);
- rs->rules[rs_num].inactive.rcount--;
- }
*ticket = ++rs->rules[rs_num].inactive.ticket;
rs->rules[rs_num].inactive.open = 1;
return (0);
@@ -689,105 +1247,19 @@ pf_rollback_rules(u_int32_t ticket, int rs_num, char *anchor)
if (rs == NULL || !rs->rules[rs_num].inactive.open ||
rs->rules[rs_num].inactive.ticket != ticket)
return (0);
- while ((rule = TAILQ_FIRST(rs->rules[rs_num].inactive.ptr)) != NULL) {
+ while ((rule = TAILQ_FIRST(rs->rules[rs_num].inactive.ptr)) != NULL)
pf_rm_rule(rs->rules[rs_num].inactive.ptr, rule);
- rs->rules[rs_num].inactive.rcount--;
- }
rs->rules[rs_num].inactive.open = 0;
return (0);
}
-#define PF_MD5_UPD(st, elm) \
- MD5Update(ctx, (u_int8_t *) &(st)->elm, sizeof((st)->elm))
-
-#define PF_MD5_UPD_STR(st, elm) \
- MD5Update(ctx, (u_int8_t *) (st)->elm, strlen((st)->elm))
-
-#define PF_MD5_UPD_HTONL(st, elm, stor) do { \
- (stor) = htonl((st)->elm); \
- MD5Update(ctx, (u_int8_t *) &(stor), sizeof(u_int32_t));\
-} while (0)
-
-#define PF_MD5_UPD_HTONS(st, elm, stor) do { \
- (stor) = htons((st)->elm); \
- MD5Update(ctx, (u_int8_t *) &(stor), sizeof(u_int16_t));\
-} while (0)
-
-void
-pf_hash_rule_addr(MD5_CTX *ctx, struct pf_rule_addr *pfr)
-{
- PF_MD5_UPD(pfr, addr.type);
- switch (pfr->addr.type) {
- case PF_ADDR_DYNIFTL:
- PF_MD5_UPD(pfr, addr.v.ifname);
- PF_MD5_UPD(pfr, addr.iflags);
- break;
- case PF_ADDR_TABLE:
- PF_MD5_UPD(pfr, addr.v.tblname);
- break;
- case PF_ADDR_ADDRMASK:
- /* XXX ignore af? */
- PF_MD5_UPD(pfr, addr.v.a.addr.addr32);
- PF_MD5_UPD(pfr, addr.v.a.mask.addr32);
- break;
- case PF_ADDR_RTLABEL:
- PF_MD5_UPD(pfr, addr.v.rtlabelname);
- break;
- }
-
- PF_MD5_UPD(pfr, port[0]);
- PF_MD5_UPD(pfr, port[1]);
- PF_MD5_UPD(pfr, neg);
- PF_MD5_UPD(pfr, port_op);
-}
-
-void
-pf_hash_rule(MD5_CTX *ctx, struct pf_rule *rule)
-{
- u_int16_t x;
- u_int32_t y;
-
- pf_hash_rule_addr(ctx, &rule->src);
- pf_hash_rule_addr(ctx, &rule->dst);
- PF_MD5_UPD_STR(rule, label);
- PF_MD5_UPD_STR(rule, ifname);
- PF_MD5_UPD_STR(rule, match_tagname);
- PF_MD5_UPD_HTONS(rule, match_tag, x); /* dup? */
- PF_MD5_UPD_HTONL(rule, os_fingerprint, y);
- PF_MD5_UPD_HTONL(rule, prob, y);
- PF_MD5_UPD_HTONL(rule, uid.uid[0], y);
- PF_MD5_UPD_HTONL(rule, uid.uid[1], y);
- PF_MD5_UPD(rule, uid.op);
- PF_MD5_UPD_HTONL(rule, gid.gid[0], y);
- PF_MD5_UPD_HTONL(rule, gid.gid[1], y);
- PF_MD5_UPD(rule, gid.op);
- PF_MD5_UPD_HTONL(rule, rule_flag, y);
- PF_MD5_UPD(rule, action);
- PF_MD5_UPD(rule, direction);
- PF_MD5_UPD(rule, af);
- PF_MD5_UPD(rule, quick);
- PF_MD5_UPD(rule, ifnot);
- PF_MD5_UPD(rule, match_tag_not);
- PF_MD5_UPD(rule, natpass);
- PF_MD5_UPD(rule, keep_state);
- PF_MD5_UPD(rule, proto);
- PF_MD5_UPD(rule, type);
- PF_MD5_UPD(rule, code);
- PF_MD5_UPD(rule, flags);
- PF_MD5_UPD(rule, flagset);
- PF_MD5_UPD(rule, allow_opts);
- PF_MD5_UPD(rule, rt);
- PF_MD5_UPD(rule, tos);
-}
-
int
pf_commit_rules(u_int32_t ticket, int rs_num, char *anchor)
{
struct pf_ruleset *rs;
- struct pf_rule *rule, **old_array;
+ struct pf_rule *rule;
struct pf_rulequeue *old_rules;
- int s, error;
- u_int32_t old_rcount;
+ int s;
if (rs_num < 0 || rs_num >= PF_RULESET_MAX)
return (EINVAL);
@@ -796,97 +1268,46 @@ pf_commit_rules(u_int32_t ticket, int rs_num, char *anchor)
ticket != rs->rules[rs_num].inactive.ticket)
return (EBUSY);
- /* Calculate checksum for the main ruleset */
- if (rs == &pf_main_ruleset) {
- error = pf_setup_pfsync_matching(rs);
- if (error != 0)
- return (error);
- }
-
/* Swap rules, keep the old. */
s = splsoftnet();
old_rules = rs->rules[rs_num].active.ptr;
- old_rcount = rs->rules[rs_num].active.rcount;
- old_array = rs->rules[rs_num].active.ptr_array;
-
rs->rules[rs_num].active.ptr =
rs->rules[rs_num].inactive.ptr;
- rs->rules[rs_num].active.ptr_array =
- rs->rules[rs_num].inactive.ptr_array;
- rs->rules[rs_num].active.rcount =
- rs->rules[rs_num].inactive.rcount;
rs->rules[rs_num].inactive.ptr = old_rules;
- rs->rules[rs_num].inactive.ptr_array = old_array;
- rs->rules[rs_num].inactive.rcount = old_rcount;
-
rs->rules[rs_num].active.ticket =
rs->rules[rs_num].inactive.ticket;
pf_calc_skip_steps(rs->rules[rs_num].active.ptr);
-
/* Purge the old rule list. */
while ((rule = TAILQ_FIRST(old_rules)) != NULL)
pf_rm_rule(old_rules, rule);
- if (rs->rules[rs_num].inactive.ptr_array)
- free(rs->rules[rs_num].inactive.ptr_array, M_TEMP);
- rs->rules[rs_num].inactive.ptr_array = NULL;
- rs->rules[rs_num].inactive.rcount = 0;
rs->rules[rs_num].inactive.open = 0;
pf_remove_if_empty_ruleset(rs);
splx(s);
return (0);
}
+#ifdef __FreeBSD__
int
-pf_setup_pfsync_matching(struct pf_ruleset *rs)
-{
- MD5_CTX ctx;
- struct pf_rule *rule;
- int rs_cnt;
- u_int8_t digest[PF_MD5_DIGEST_LENGTH];
-
- MD5Init(&ctx);
- for (rs_cnt = 0; rs_cnt < PF_RULESET_MAX; rs_cnt++) {
- /* XXX PF_RULESET_SCRUB as well? */
- if (rs_cnt == PF_RULESET_SCRUB)
- continue;
-
- if (rs->rules[rs_cnt].inactive.ptr_array)
- free(rs->rules[rs_cnt].inactive.ptr_array, M_TEMP);
- rs->rules[rs_cnt].inactive.ptr_array = NULL;
-
- if (rs->rules[rs_cnt].inactive.rcount) {
- rs->rules[rs_cnt].inactive.ptr_array =
- malloc(sizeof(caddr_t) *
- rs->rules[rs_cnt].inactive.rcount,
- M_TEMP, M_NOWAIT);
-
- if (!rs->rules[rs_cnt].inactive.ptr_array)
- return (ENOMEM);
- }
-
- TAILQ_FOREACH(rule, rs->rules[rs_cnt].inactive.ptr,
- entries) {
- pf_hash_rule(&ctx, rule);
- (rs->rules[rs_cnt].inactive.ptr_array)[rule->nr] = rule;
- }
- }
-
- MD5Final(digest, &ctx);
- memcpy(pf_status.pf_chksum, digest, sizeof(pf_status.pf_chksum));
- return (0);
-}
-
+pfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct thread *td)
+#else
int
-pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
+pfioctl(struct cdev *dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
+#endif
{
struct pf_pooladdr *pa = NULL;
struct pf_pool *pool = NULL;
+#ifndef __FreeBSD__
int s;
+#endif
int error = 0;
/* XXX keep in sync with switch() below */
+#ifdef __FreeBSD__
+ if (securelevel_gt(td->td_ucred, 2))
+#else
if (securelevel > 1)
+#endif
switch (cmd) {
case DIOCGETRULES:
case DIOCGETRULE:
@@ -922,6 +1343,10 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
case DIOCGETSRCNODES:
case DIOCCLRSRCNODES:
case DIOCIGETIFACES:
+ case DIOCICLRISTATS:
+#ifdef __FreeBSD__
+ case DIOCGIFSPEED:
+#endif
case DIOCSETIFFLAG:
case DIOCCLRIFFLAG:
break;
@@ -940,6 +1365,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (!(flags & FWRITE))
switch (cmd) {
case DIOCGETRULES:
+ case DIOCGETRULE:
case DIOCGETADDRS:
case DIOCGETADDR:
case DIOCGETSTATE:
@@ -952,7 +1378,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
case DIOCGETQSTATS:
case DIOCGETRULESETS:
case DIOCGETRULESET:
- case DIOCNATLOOK:
case DIOCRGETTABLES:
case DIOCRGETTSTATS:
case DIOCRGETADDRS:
@@ -961,6 +1386,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
case DIOCOSFPGET:
case DIOCGETSRCNODES:
case DIOCIGETIFACES:
+#ifdef __FreeBSD__
+ case DIOCGIFSPEED:
+#endif
break;
case DIOCRCLRTABLES:
case DIOCRADDTABLES:
@@ -972,31 +1400,34 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
case DIOCRSETADDRS:
case DIOCRSETTFLAGS:
if (((struct pfioc_table *)addr)->pfrio_flags &
- PFR_FLAG_DUMMY) {
- flags |= FWRITE; /* need write lock for dummy */
+ PFR_FLAG_DUMMY)
break; /* dummy operation ok */
- }
return (EACCES);
- case DIOCGETRULE:
- if (((struct pfioc_rule *)addr)->action == PF_GET_CLR_CNTR)
- return (EACCES);
- break;
default:
return (EACCES);
}
- if (flags & FWRITE)
- rw_enter_write(&pf_consistency_lock);
- else
- rw_enter_read(&pf_consistency_lock);
-
+#ifdef __FreeBSD__
+ PF_LOCK();
+#else
s = splsoftnet();
+#endif
switch (cmd) {
case DIOCSTART:
if (pf_status.running)
error = EEXIST;
else {
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+ error = hook_pf();
+ PF_LOCK();
+ if (error) {
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("pf: pfil registeration fail\n"));
+ break;
+ }
+#endif
pf_status.running = 1;
pf_status.since = time_second;
if (pf_status.stateid == 0) {
@@ -1012,6 +1443,16 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = ENOENT;
else {
pf_status.running = 0;
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+ error = dehook_pf();
+ PF_LOCK();
+ if (error) {
+ pf_status.running = 1;
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("pf: pfil unregisteration failed\n"));
+ }
+#endif
pf_status.since = time_second;
DPFPRINTF(PF_DEBUG_MISC, ("pf: stopped\n"));
}
@@ -1040,10 +1481,20 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
break;
}
if (pr->ticket != ruleset->rules[rs_num].inactive.ticket) {
+#ifdef __FreeBSD__
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("ticket: %d != [%d]%d\n", pr->ticket, rs_num,
+ ruleset->rules[rs_num].inactive.ticket));
+#endif
error = EBUSY;
break;
}
if (pr->pool_ticket != ticket_pabuf) {
+#ifdef __FreeBSD__
+ DPFPRINTF(PF_DEBUG_MISC,
+ ("pool_ticket: %d != %d\n", pr->pool_ticket,
+ ticket_pabuf));
+#endif
error = EBUSY;
break;
}
@@ -1053,8 +1504,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
break;
}
bcopy(&pr->rule, rule, sizeof(struct pf_rule));
- rule->cuid = p->p_cred->p_ruid;
- rule->cpid = p->p_pid;
rule->anchor = NULL;
rule->kif = NULL;
TAILQ_INIT(&rule->rpool.list);
@@ -1083,18 +1532,14 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
else
rule->nr = 0;
if (rule->ifname[0]) {
- rule->kif = pfi_kif_get(rule->ifname);
+ rule->kif = pfi_attach_rule(rule->ifname);
if (rule->kif == NULL) {
pool_put(&pf_rule_pl, rule);
error = EINVAL;
break;
}
- pfi_kif_ref(rule->kif, PFI_KIF_REF_RULE);
}
- if (rule->rtableid > 0 && !rtable_exists(rule->rtableid))
- error = EBUSY;
-
#ifdef ALTQ
/* set queue IDs */
if (rule->qname[0] != 0) {
@@ -1117,10 +1562,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EBUSY;
if (rule->rt && !rule->direction)
error = EINVAL;
-#if NPFLOG > 0
- if (rule->logif >= PFLOGIFS_MAX)
- error = EINVAL;
-#endif
if (pf_rtlabel_add(&rule->src.addr) ||
pf_rtlabel_add(&rule->dst.addr))
error = EBUSY;
@@ -1159,11 +1600,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
break;
}
rule->rpool.cur = TAILQ_FIRST(&rule->rpool.list);
- rule->evaluations = rule->packets[0] = rule->packets[1] =
- rule->bytes[0] = rule->bytes[1] = 0;
+ rule->evaluations = rule->packets = rule->bytes = 0;
TAILQ_INSERT_TAIL(ruleset->rules[rs_num].inactive.ptr,
rule, entries);
- ruleset->rules[rs_num].inactive.rcount++;
break;
}
@@ -1239,12 +1678,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
else
pr->rule.skip[i].nr =
rule->skip[i].ptr->nr;
-
- if (pr->action == PF_GET_CLR_CNTR) {
- rule->evaluations = 0;
- rule->packets[0] = rule->packets[1] = 0;
- rule->bytes[0] = rule->bytes[1] = 0;
- }
break;
}
@@ -1300,8 +1733,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
break;
}
bcopy(&pcr->rule, newrule, sizeof(struct pf_rule));
- newrule->cuid = p->p_cred->p_ruid;
- newrule->cpid = p->p_pid;
TAILQ_INIT(&newrule->rpool.list);
/* initialize refcounting */
newrule->states = 0;
@@ -1321,20 +1752,15 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
#endif /* INET6 */
if (newrule->ifname[0]) {
- newrule->kif = pfi_kif_get(newrule->ifname);
+ newrule->kif = pfi_attach_rule(newrule->ifname);
if (newrule->kif == NULL) {
pool_put(&pf_rule_pl, newrule);
error = EINVAL;
break;
}
- pfi_kif_ref(newrule->kif, PFI_KIF_REF_RULE);
} else
newrule->kif = NULL;
- if (newrule->rtableid > 0 &&
- !rtable_exists(newrule->rtableid))
- error = EBUSY;
-
#ifdef ALTQ
/* set queue IDs */
if (newrule->qname[0] != 0) {
@@ -1400,9 +1826,8 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
break;
}
newrule->rpool.cur = TAILQ_FIRST(&newrule->rpool.list);
- newrule->evaluations = 0;
- newrule->packets[0] = newrule->packets[1] = 0;
- newrule->bytes[0] = newrule->bytes[1] = 0;
+ newrule->evaluations = newrule->packets = 0;
+ newrule->bytes = 0;
}
pf_empty_pool(&pf_pabuf);
@@ -1425,10 +1850,9 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
}
- if (pcr->action == PF_CHANGE_REMOVE) {
+ if (pcr->action == PF_CHANGE_REMOVE)
pf_rm_rule(ruleset->rules[rs_num].active.ptr, oldrule);
- ruleset->rules[rs_num].active.rcount--;
- } else {
+ else {
if (oldrule == NULL)
TAILQ_INSERT_TAIL(
ruleset->rules[rs_num].active.ptr,
@@ -1440,7 +1864,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
TAILQ_INSERT_AFTER(
ruleset->rules[rs_num].active.ptr,
oldrule, newrule, entries);
- ruleset->rules[rs_num].active.rcount++;
}
nr = 0;
@@ -1457,24 +1880,23 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
case DIOCCLRSTATES: {
- struct pf_state *state, *nexts;
+ struct pf_state *state;
struct pfioc_state_kill *psk = (struct pfioc_state_kill *)addr;
int killed = 0;
- for (state = RB_MIN(pf_state_tree_id, &tree_id); state;
- state = nexts) {
- nexts = RB_NEXT(pf_state_tree_id, &tree_id, state);
-
+ RB_FOREACH(state, pf_state_tree_id, &tree_id) {
if (!psk->psk_ifname[0] || !strcmp(psk->psk_ifname,
state->u.s.kif->pfik_name)) {
+ state->timeout = PFTM_PURGE;
#if NPFSYNC
/* don't send out individual delete messages */
state->sync_flags = PFSTATE_NOSYNC;
#endif
- pf_unlink_state(state);
killed++;
}
}
+ pf_purge_expired_states();
+ pf_status.states = 0;
psk->psk_af = killed;
#if NPFSYNC
pfsync_clear_states(pf_status.hostid, psk->psk_ifname);
@@ -1483,52 +1905,37 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
case DIOCKILLSTATES: {
- struct pf_state *state, *nexts;
- struct pf_state_host *src, *dst;
+ struct pf_state *state;
struct pfioc_state_kill *psk = (struct pfioc_state_kill *)addr;
int killed = 0;
- for (state = RB_MIN(pf_state_tree_id, &tree_id); state;
- state = nexts) {
- nexts = RB_NEXT(pf_state_tree_id, &tree_id, state);
-
- if (state->direction == PF_OUT) {
- src = &state->lan;
- dst = &state->ext;
- } else {
- src = &state->ext;
- dst = &state->lan;
- }
+ RB_FOREACH(state, pf_state_tree_id, &tree_id) {
if ((!psk->psk_af || state->af == psk->psk_af)
&& (!psk->psk_proto || psk->psk_proto ==
state->proto) &&
PF_MATCHA(psk->psk_src.neg,
&psk->psk_src.addr.v.a.addr,
&psk->psk_src.addr.v.a.mask,
- &src->addr, state->af) &&
+ &state->lan.addr, state->af) &&
PF_MATCHA(psk->psk_dst.neg,
&psk->psk_dst.addr.v.a.addr,
&psk->psk_dst.addr.v.a.mask,
- &dst->addr, state->af) &&
+ &state->ext.addr, state->af) &&
(psk->psk_src.port_op == 0 ||
pf_match_port(psk->psk_src.port_op,
psk->psk_src.port[0], psk->psk_src.port[1],
- src->port)) &&
+ state->lan.port)) &&
(psk->psk_dst.port_op == 0 ||
pf_match_port(psk->psk_dst.port_op,
psk->psk_dst.port[0], psk->psk_dst.port[1],
- dst->port)) &&
+ state->ext.port)) &&
(!psk->psk_ifname[0] || !strcmp(psk->psk_ifname,
state->u.s.kif->pfik_name))) {
-#if NPFSYNC > 0
- /* send immediate delete of state */
- pfsync_delete_state(state);
- state->sync_flags |= PFSTATE_NOSYNC;
-#endif
- pf_unlink_state(state);
+ state->timeout = PFTM_PURGE;
killed++;
}
}
+ pf_purge_expired_states();
psk->psk_af = killed;
break;
}
@@ -1548,7 +1955,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = ENOMEM;
break;
}
- kif = pfi_kif_get(ps->state.u.ifname);
+ kif = pfi_lookup_create(ps->state.u.ifname);
if (kif == NULL) {
pool_put(&pf_state_pl, state);
error = ENOENT;
@@ -1566,7 +1973,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
state->bytes[0] = state->bytes[1] = 0;
if (pf_insert_state(kif, state)) {
- pfi_kif_unref(kif, PFI_KIF_REF_NONE);
+ pfi_maybe_destroy(kif);
pool_put(&pf_state_pl, state);
error = ENOMEM;
}
@@ -1577,7 +1984,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
struct pfioc_state *ps = (struct pfioc_state *)addr;
struct pf_state *state;
u_int32_t nr;
- int secs;
nr = 0;
RB_FOREACH(state, pf_state_tree_id, &tree_id) {
@@ -1589,19 +1995,15 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EBUSY;
break;
}
- secs = time_second;
- bcopy(state, &ps->state, sizeof(ps->state));
- strlcpy(ps->state.u.ifname, state->u.s.kif->pfik_name,
- sizeof(ps->state.u.ifname));
+ bcopy(state, &ps->state, sizeof(struct pf_state));
ps->state.rule.nr = state->rule.ptr->nr;
ps->state.nat_rule.nr = (state->nat_rule.ptr == NULL) ?
-1 : state->nat_rule.ptr->nr;
ps->state.anchor.nr = (state->anchor.ptr == NULL) ?
-1 : state->anchor.ptr->nr;
- ps->state.creation = secs - ps->state.creation;
ps->state.expire = pf_state_expires(state);
- if (ps->state.expire > secs)
- ps->state.expire -= secs;
+ if (ps->state.expire > time_second)
+ ps->state.expire -= time_second;
else
ps->state.expire = 0;
break;
@@ -1610,57 +2012,52 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
case DIOCGETSTATES: {
struct pfioc_states *ps = (struct pfioc_states *)addr;
struct pf_state *state;
- struct pf_state *p, *pstore;
+ struct pf_state *p, pstore;
+ struct pfi_kif *kif;
u_int32_t nr = 0;
int space = ps->ps_len;
if (space == 0) {
- nr = pf_status.states;
+ TAILQ_FOREACH(kif, &pfi_statehead, pfik_w_states)
+ nr += kif->pfik_states;
ps->ps_len = sizeof(struct pf_state) * nr;
break;
}
- pstore = malloc(sizeof(*pstore), M_TEMP, M_WAITOK);
-
p = ps->ps_states;
-
- state = TAILQ_FIRST(&state_list);
- while (state) {
- if (state->timeout != PFTM_UNLINKED) {
+ TAILQ_FOREACH(kif, &pfi_statehead, pfik_w_states)
+ RB_FOREACH(state, pf_state_tree_ext_gwy,
+ &kif->pfik_ext_gwy) {
int secs = time_second;
if ((nr+1) * sizeof(*p) > (unsigned)ps->ps_len)
break;
- bcopy(state, pstore, sizeof(*pstore));
- strlcpy(pstore->u.ifname,
- state->u.s.kif->pfik_name,
- sizeof(pstore->u.ifname));
- pstore->rule.nr = state->rule.ptr->nr;
- pstore->nat_rule.nr = (state->nat_rule.ptr ==
+ bcopy(state, &pstore, sizeof(pstore));
+ strlcpy(pstore.u.ifname, kif->pfik_name,
+ sizeof(pstore.u.ifname));
+ pstore.rule.nr = state->rule.ptr->nr;
+ pstore.nat_rule.nr = (state->nat_rule.ptr ==
NULL) ? -1 : state->nat_rule.ptr->nr;
- pstore->anchor.nr = (state->anchor.ptr ==
+ pstore.anchor.nr = (state->anchor.ptr ==
NULL) ? -1 : state->anchor.ptr->nr;
- pstore->creation = secs - pstore->creation;
- pstore->expire = pf_state_expires(state);
- if (pstore->expire > secs)
- pstore->expire -= secs;
+ pstore.creation = secs - pstore.creation;
+ pstore.expire = pf_state_expires(state);
+ if (pstore.expire > secs)
+ pstore.expire -= secs;
else
- pstore->expire = 0;
- error = copyout(pstore, p, sizeof(*p));
- if (error) {
- free(pstore, M_TEMP);
+ pstore.expire = 0;
+#ifdef __FreeBSD__
+ PF_COPYOUT(&pstore, p, sizeof(*p), error);
+#else
+ error = copyout(&pstore, p, sizeof(*p));
+#endif
+ if (error)
goto fail;
- }
p++;
nr++;
}
- state = TAILQ_NEXT(state, u.s.entry_list);
- }
-
ps->ps_len = sizeof(struct pf_state) * nr;
-
- free(pstore, M_TEMP);
break;
}
@@ -1690,16 +2087,16 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
bzero(pf_status.counters, sizeof(pf_status.counters));
bzero(pf_status.fcounters, sizeof(pf_status.fcounters));
bzero(pf_status.scounters, sizeof(pf_status.scounters));
- pf_status.since = time_second;
if (*pf_status.ifname)
- pfi_clr_istats(pf_status.ifname);
+ pfi_clr_istats(pf_status.ifname, NULL,
+ PFI_FLAG_INSTANCE);
break;
}
case DIOCNATLOOK: {
struct pfioc_natlook *pnl = (struct pfioc_natlook *)addr;
struct pf_state *state;
- struct pf_state_cmp key;
+ struct pf_state key;
int m = 0, direction = pnl->direction;
key.af = pnl->af;
@@ -1708,9 +2105,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if (!pnl->proto ||
PF_AZERO(&pnl->saddr, pnl->af) ||
PF_AZERO(&pnl->daddr, pnl->af) ||
- ((pnl->proto == IPPROTO_TCP ||
- pnl->proto == IPPROTO_UDP) &&
- (!pnl->dport || !pnl->sport)))
+ !pnl->dport || !pnl->sport)
error = EINVAL;
else {
/*
@@ -1766,11 +2161,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
goto fail;
}
old = pf_default_rule.timeout[pt->timeout];
- if (pt->timeout == PFTM_INTERVAL && pt->seconds == 0)
- pt->seconds = 1;
pf_default_rule.timeout[pt->timeout] = pt->seconds;
- if (pt->timeout == PFTM_INTERVAL && pt->seconds < old)
- wakeup(pf_purge_thread);
pt->seconds = old;
break;
}
@@ -1806,11 +2197,15 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EINVAL;
goto fail;
}
+#ifdef __FreeBSD__
+ uma_zone_set_max(pf_pool_limits[pl->index].pp, pl->limit);
+#else
if (pool_sethardlimit(pf_pool_limits[pl->index].pp,
pl->limit, NULL, 0) != 0) {
error = EBUSY;
goto fail;
}
+#endif
old_limit = pf_pool_limits[pl->index].limit;
pf_pool_limits[pl->index].limit = pl->limit;
pl->limit = old_limit;
@@ -1825,18 +2220,35 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
case DIOCCLRRULECTRS: {
- /* obsoleted by DIOCGETRULE with action=PF_GET_CLR_CNTR */
struct pf_ruleset *ruleset = &pf_main_ruleset;
struct pf_rule *rule;
TAILQ_FOREACH(rule,
- ruleset->rules[PF_RULESET_FILTER].active.ptr, entries) {
- rule->evaluations = 0;
- rule->packets[0] = rule->packets[1] = 0;
- rule->bytes[0] = rule->bytes[1] = 0;
- }
+ ruleset->rules[PF_RULESET_FILTER].active.ptr, entries)
+ rule->evaluations = rule->packets =
+ rule->bytes = 0;
+ break;
+ }
+
+#ifdef __FreeBSD__
+ case DIOCGIFSPEED: {
+ struct pf_ifspeed *psp = (struct pf_ifspeed *)addr;
+ struct pf_ifspeed ps;
+ struct ifnet *ifp;
+
+ if (psp->ifname[0] != 0) {
+ /* Can we completely trust user-land? */
+ strlcpy(ps.ifname, psp->ifname, IFNAMSIZ);
+ ifp = ifunit(ps.ifname);
+ if (ifp != NULL)
+ psp->baudrate = ifp->if_baudrate;
+ else
+ error = EINVAL;
+ } else
+ error = EINVAL;
break;
}
+#endif /* __FreeBSD__ */
#ifdef ALTQ
case DIOCSTARTALTQ: {
@@ -1907,7 +2319,13 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
}
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
error = altq_add(altq);
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
if (error) {
pool_put(&pf_altq_pl, altq);
break;
@@ -1978,7 +2396,13 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = EBUSY;
break;
}
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#endif
error = altq_getqstats(altq, pq->buf, &nbytes);
+#ifdef __FreeBSD__
+ PF_LOCK();
+#endif
if (error == 0) {
pq->scheduler = altq->scheduler;
pq->nbytes = nbytes;
@@ -2027,17 +2451,16 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
bcopy(&pp->addr, pa, sizeof(struct pf_pooladdr));
if (pa->ifname[0]) {
- pa->kif = pfi_kif_get(pa->ifname);
+ pa->kif = pfi_attach_rule(pa->ifname);
if (pa->kif == NULL) {
pool_put(&pf_pooladdr_pl, pa);
error = EINVAL;
break;
}
- pfi_kif_ref(pa->kif, PFI_KIF_REF_RULE);
}
if (pfi_dynaddr_setup(&pa->addr, pp->af)) {
pfi_dynaddr_remove(&pa->addr);
- pfi_kif_unref(pa->kif, PFI_KIF_REF_RULE);
+ pfi_detach_rule(pa->kif);
pool_put(&pf_pooladdr_pl, pa);
error = EINVAL;
break;
@@ -2137,19 +2560,18 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
#endif /* INET6 */
if (newpa->ifname[0]) {
- newpa->kif = pfi_kif_get(newpa->ifname);
+ newpa->kif = pfi_attach_rule(newpa->ifname);
if (newpa->kif == NULL) {
pool_put(&pf_pooladdr_pl, newpa);
error = EINVAL;
break;
}
- pfi_kif_ref(newpa->kif, PFI_KIF_REF_RULE);
} else
newpa->kif = NULL;
if (pfi_dynaddr_setup(&newpa->addr, pca->af) ||
pf_tbladdr_setup(ruleset, &newpa->addr)) {
pfi_dynaddr_remove(&newpa->addr);
- pfi_kif_unref(newpa->kif, PFI_KIF_REF_RULE);
+ pfi_detach_rule(newpa->kif);
pool_put(&pf_pooladdr_pl, newpa);
error = EINVAL;
break;
@@ -2178,7 +2600,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
TAILQ_REMOVE(&pool->list, oldpa, entries);
pfi_dynaddr_remove(&oldpa->addr);
pf_tbladdr_remove(&oldpa->addr);
- pfi_kif_unref(oldpa->kif, PFI_KIF_REF_RULE);
+ pfi_detach_rule(oldpa->kif);
pool_put(&pf_pooladdr_pl, oldpa);
} else {
if (oldpa == NULL)
@@ -2388,7 +2810,7 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
error = pfr_set_addrs(&io->pfrio_table, io->pfrio_buffer,
io->pfrio_size, &io->pfrio_size2, &io->pfrio_nadd,
&io->pfrio_ndel, &io->pfrio_nchange, io->pfrio_flags |
- PFR_FLAG_USERIOCTL, 0);
+ PFR_FLAG_USERIOCTL);
break;
}
@@ -2468,203 +2890,171 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
case DIOCXBEGIN: {
- struct pfioc_trans *io = (struct pfioc_trans *)addr;
- struct pfioc_trans_e *ioe;
- struct pfr_table *table;
- int i;
+ struct pfioc_trans *io = (struct pfioc_trans *)
+ addr;
+ static struct pfioc_trans_e ioe;
+ static struct pfr_table table;
+ int i;
- if (io->esize != sizeof(*ioe)) {
+ if (io->esize != sizeof(ioe)) {
error = ENODEV;
goto fail;
}
- ioe = (struct pfioc_trans_e *)malloc(sizeof(*ioe),
- M_TEMP, M_WAITOK);
- table = (struct pfr_table *)malloc(sizeof(*table),
- M_TEMP, M_WAITOK);
for (i = 0; i < io->size; i++) {
- if (copyin(io->array+i, ioe, sizeof(*ioe))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+#ifdef __FreeBSD__
+ PF_COPYIN(io->array+i, &ioe, sizeof(ioe), error);
+ if (error) {
+#else
+ if (copyin(io->array+i, &ioe, sizeof(ioe))) {
+#endif
error = EFAULT;
goto fail;
}
- switch (ioe->rs_num) {
+ switch (ioe.rs_num) {
#ifdef ALTQ
case PF_RULESET_ALTQ:
- if (ioe->anchor[0]) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ if (ioe.anchor[0]) {
error = EINVAL;
goto fail;
}
- if ((error = pf_begin_altq(&ioe->ticket))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ if ((error = pf_begin_altq(&ioe.ticket)))
goto fail;
- }
break;
#endif /* ALTQ */
case PF_RULESET_TABLE:
- bzero(table, sizeof(*table));
- strlcpy(table->pfrt_anchor, ioe->anchor,
- sizeof(table->pfrt_anchor));
- if ((error = pfr_ina_begin(table,
- &ioe->ticket, NULL, 0))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ bzero(&table, sizeof(table));
+ strlcpy(table.pfrt_anchor, ioe.anchor,
+ sizeof(table.pfrt_anchor));
+ if ((error = pfr_ina_begin(&table,
+ &ioe.ticket, NULL, 0)))
goto fail;
- }
break;
default:
- if ((error = pf_begin_rules(&ioe->ticket,
- ioe->rs_num, ioe->anchor))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ if ((error = pf_begin_rules(&ioe.ticket,
+ ioe.rs_num, ioe.anchor)))
goto fail;
- }
break;
}
- if (copyout(ioe, io->array+i, sizeof(io->array[i]))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+#ifdef __FreeBSD__
+ PF_COPYOUT(&ioe, io->array+i, sizeof(io->array[i]),
+ error);
+ if (error) {
+#else
+ if (copyout(&ioe, io->array+i, sizeof(io->array[i]))) {
+#endif
error = EFAULT;
goto fail;
}
}
- free(table, M_TEMP);
- free(ioe, M_TEMP);
break;
}
case DIOCXROLLBACK: {
- struct pfioc_trans *io = (struct pfioc_trans *)addr;
- struct pfioc_trans_e *ioe;
- struct pfr_table *table;
- int i;
+ struct pfioc_trans *io = (struct pfioc_trans *)
+ addr;
+ static struct pfioc_trans_e ioe;
+ static struct pfr_table table;
+ int i;
- if (io->esize != sizeof(*ioe)) {
+ if (io->esize != sizeof(ioe)) {
error = ENODEV;
goto fail;
}
- ioe = (struct pfioc_trans_e *)malloc(sizeof(*ioe),
- M_TEMP, M_WAITOK);
- table = (struct pfr_table *)malloc(sizeof(*table),
- M_TEMP, M_WAITOK);
for (i = 0; i < io->size; i++) {
- if (copyin(io->array+i, ioe, sizeof(*ioe))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+#ifdef __FreeBSD__
+ PF_COPYIN(io->array+i, &ioe, sizeof(ioe), error);
+ if (error) {
+#else
+ if (copyin(io->array+i, &ioe, sizeof(ioe))) {
+#endif
error = EFAULT;
goto fail;
}
- switch (ioe->rs_num) {
+ switch (ioe.rs_num) {
#ifdef ALTQ
case PF_RULESET_ALTQ:
- if (ioe->anchor[0]) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ if (ioe.anchor[0]) {
error = EINVAL;
goto fail;
}
- if ((error = pf_rollback_altq(ioe->ticket))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ if ((error = pf_rollback_altq(ioe.ticket)))
goto fail; /* really bad */
- }
break;
#endif /* ALTQ */
case PF_RULESET_TABLE:
- bzero(table, sizeof(*table));
- strlcpy(table->pfrt_anchor, ioe->anchor,
- sizeof(table->pfrt_anchor));
- if ((error = pfr_ina_rollback(table,
- ioe->ticket, NULL, 0))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ bzero(&table, sizeof(table));
+ strlcpy(table.pfrt_anchor, ioe.anchor,
+ sizeof(table.pfrt_anchor));
+ if ((error = pfr_ina_rollback(&table,
+ ioe.ticket, NULL, 0)))
goto fail; /* really bad */
- }
break;
default:
- if ((error = pf_rollback_rules(ioe->ticket,
- ioe->rs_num, ioe->anchor))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ if ((error = pf_rollback_rules(ioe.ticket,
+ ioe.rs_num, ioe.anchor)))
goto fail; /* really bad */
- }
break;
}
}
- free(table, M_TEMP);
- free(ioe, M_TEMP);
break;
}
case DIOCXCOMMIT: {
- struct pfioc_trans *io = (struct pfioc_trans *)addr;
- struct pfioc_trans_e *ioe;
- struct pfr_table *table;
- struct pf_ruleset *rs;
- int i;
-
- if (io->esize != sizeof(*ioe)) {
+ struct pfioc_trans *io = (struct pfioc_trans *)
+ addr;
+ static struct pfioc_trans_e ioe;
+ static struct pfr_table table;
+ struct pf_ruleset *rs;
+ int i;
+
+ if (io->esize != sizeof(ioe)) {
error = ENODEV;
goto fail;
}
- ioe = (struct pfioc_trans_e *)malloc(sizeof(*ioe),
- M_TEMP, M_WAITOK);
- table = (struct pfr_table *)malloc(sizeof(*table),
- M_TEMP, M_WAITOK);
/* first makes sure everything will succeed */
for (i = 0; i < io->size; i++) {
- if (copyin(io->array+i, ioe, sizeof(*ioe))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+#ifdef __FreeBSD__
+ PF_COPYIN(io->array+i, &ioe, sizeof(ioe), error);
+ if (error) {
+#else
+ if (copyin(io->array+i, &ioe, sizeof(ioe))) {
+#endif
error = EFAULT;
goto fail;
}
- switch (ioe->rs_num) {
+ switch (ioe.rs_num) {
#ifdef ALTQ
case PF_RULESET_ALTQ:
- if (ioe->anchor[0]) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ if (ioe.anchor[0]) {
error = EINVAL;
goto fail;
}
- if (!altqs_inactive_open || ioe->ticket !=
+ if (!altqs_inactive_open || ioe.ticket !=
ticket_altqs_inactive) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
error = EBUSY;
goto fail;
}
break;
#endif /* ALTQ */
case PF_RULESET_TABLE:
- rs = pf_find_ruleset(ioe->anchor);
- if (rs == NULL || !rs->topen || ioe->ticket !=
+ rs = pf_find_ruleset(ioe.anchor);
+ if (rs == NULL || !rs->topen || ioe.ticket !=
rs->tticket) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
error = EBUSY;
goto fail;
}
break;
default:
- if (ioe->rs_num < 0 || ioe->rs_num >=
+ if (ioe.rs_num < 0 || ioe.rs_num >=
PF_RULESET_MAX) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
error = EINVAL;
goto fail;
}
- rs = pf_find_ruleset(ioe->anchor);
+ rs = pf_find_ruleset(ioe.anchor);
if (rs == NULL ||
- !rs->rules[ioe->rs_num].inactive.open ||
- rs->rules[ioe->rs_num].inactive.ticket !=
- ioe->ticket) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ !rs->rules[ioe.rs_num].inactive.open ||
+ rs->rules[ioe.rs_num].inactive.ticket !=
+ ioe.ticket) {
error = EBUSY;
goto fail;
}
@@ -2673,51 +3063,44 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
}
/* now do the commit - no errors should happen here */
for (i = 0; i < io->size; i++) {
- if (copyin(io->array+i, ioe, sizeof(*ioe))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+#ifdef __FreeBSD__
+ PF_COPYIN(io->array+i, &ioe, sizeof(ioe), error);
+ if (error) {
+#else
+ if (copyin(io->array+i, &ioe, sizeof(ioe))) {
+#endif
error = EFAULT;
goto fail;
}
- switch (ioe->rs_num) {
+ switch (ioe.rs_num) {
#ifdef ALTQ
case PF_RULESET_ALTQ:
- if ((error = pf_commit_altq(ioe->ticket))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ if ((error = pf_commit_altq(ioe.ticket)))
goto fail; /* really bad */
- }
break;
#endif /* ALTQ */
case PF_RULESET_TABLE:
- bzero(table, sizeof(*table));
- strlcpy(table->pfrt_anchor, ioe->anchor,
- sizeof(table->pfrt_anchor));
- if ((error = pfr_ina_commit(table, ioe->ticket,
- NULL, NULL, 0))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ bzero(&table, sizeof(table));
+ strlcpy(table.pfrt_anchor, ioe.anchor,
+ sizeof(table.pfrt_anchor));
+ if ((error = pfr_ina_commit(&table, ioe.ticket,
+ NULL, NULL, 0)))
goto fail; /* really bad */
- }
break;
default:
- if ((error = pf_commit_rules(ioe->ticket,
- ioe->rs_num, ioe->anchor))) {
- free(table, M_TEMP);
- free(ioe, M_TEMP);
+ if ((error = pf_commit_rules(ioe.ticket,
+ ioe.rs_num, ioe.anchor)))
goto fail; /* really bad */
- }
break;
}
}
- free(table, M_TEMP);
- free(ioe, M_TEMP);
break;
}
case DIOCGETSRCNODES: {
struct pfioc_src_nodes *psn = (struct pfioc_src_nodes *)addr;
- struct pf_src_node *n, *p, *pstore;
+ struct pf_src_node *n;
+ struct pf_src_node *p, pstore;
u_int32_t nr = 0;
int space = psn->psn_len;
@@ -2728,8 +3111,6 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
break;
}
- pstore = malloc(sizeof(*pstore), M_TEMP, M_WAITOK);
-
p = psn->psn_src_nodes;
RB_FOREACH(n, pf_src_tree, &tree_src_tracking) {
int secs = time_second, diff;
@@ -2737,35 +3118,35 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
if ((nr + 1) * sizeof(*p) > (unsigned)psn->psn_len)
break;
- bcopy(n, pstore, sizeof(*pstore));
+ bcopy(n, &pstore, sizeof(pstore));
if (n->rule.ptr != NULL)
- pstore->rule.nr = n->rule.ptr->nr;
- pstore->creation = secs - pstore->creation;
- if (pstore->expire > secs)
- pstore->expire -= secs;
+ pstore.rule.nr = n->rule.ptr->nr;
+ pstore.creation = secs - pstore.creation;
+ if (pstore.expire > secs)
+ pstore.expire -= secs;
else
- pstore->expire = 0;
+ pstore.expire = 0;
/* adjust the connection rate estimate */
diff = secs - n->conn_rate.last;
if (diff >= n->conn_rate.seconds)
- pstore->conn_rate.count = 0;
+ pstore.conn_rate.count = 0;
else
- pstore->conn_rate.count -=
+ pstore.conn_rate.count -=
n->conn_rate.count * diff /
n->conn_rate.seconds;
- error = copyout(pstore, p, sizeof(*p));
- if (error) {
- free(pstore, M_TEMP);
+#ifdef __FreeBSD__
+ PF_COPYOUT(&pstore, p, sizeof(*p), error);
+#else
+ error = copyout(&pstore, p, sizeof(*p));
+#endif
+ if (error)
goto fail;
- }
p++;
nr++;
}
psn->psn_len = sizeof(struct pf_src_node) * nr;
-
- free(pstore, M_TEMP);
break;
}
@@ -2781,50 +3162,11 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
n->expire = 1;
n->states = 0;
}
- pf_purge_expired_src_nodes(1);
+ pf_purge_expired_src_nodes();
pf_status.src_nodes = 0;
break;
}
- case DIOCKILLSRCNODES: {
- struct pf_src_node *sn;
- struct pf_state *s;
- struct pfioc_src_node_kill *psnk = \
- (struct pfioc_src_node_kill *) addr;
- int killed = 0;
-
- RB_FOREACH(sn, pf_src_tree, &tree_src_tracking) {
- if (PF_MATCHA(psnk->psnk_src.neg, \
- &psnk->psnk_src.addr.v.a.addr, \
- &psnk->psnk_src.addr.v.a.mask, \
- &sn->addr, sn->af) &&
- PF_MATCHA(psnk->psnk_dst.neg, \
- &psnk->psnk_dst.addr.v.a.addr, \
- &psnk->psnk_dst.addr.v.a.mask, \
- &sn->raddr, sn->af)) {
- /* Handle state to src_node linkage */
- if (sn->states != 0) {
- RB_FOREACH(s, pf_state_tree_id,
- &tree_id) {
- if (s->src_node == sn)
- s->src_node = NULL;
- if (s->nat_src_node == sn)
- s->nat_src_node = NULL;
- }
- sn->states = 0;
- }
- sn->expire = 1;
- killed++;
- }
- }
-
- if (killed > 0)
- pf_purge_expired_src_nodes(1);
-
- psnk->psnk_af = killed;
- break;
- }
-
case DIOCSETHOSTID: {
u_int32_t *hostid = (u_int32_t *)addr;
@@ -2842,12 +3184,20 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
case DIOCIGETIFACES: {
struct pfioc_iface *io = (struct pfioc_iface *)addr;
- if (io->pfiio_esize != sizeof(struct pfi_kif)) {
+ if (io->pfiio_esize != sizeof(struct pfi_if)) {
error = ENODEV;
break;
}
error = pfi_get_ifaces(io->pfiio_name, io->pfiio_buffer,
- &io->pfiio_size);
+ &io->pfiio_size, io->pfiio_flags);
+ break;
+ }
+
+ case DIOCICLRISTATS: {
+ struct pfioc_iface *io = (struct pfioc_iface *)addr;
+
+ error = pfi_clr_istats(io->pfiio_name, &io->pfiio_nzero,
+ io->pfiio_flags);
break;
}
@@ -2870,10 +3220,405 @@ pfioctl(dev_t dev, u_long cmd, caddr_t addr, int flags, struct proc *p)
break;
}
fail:
+#ifdef __FreeBSD__
+ PF_UNLOCK();
+#else
splx(s);
- if (flags & FWRITE)
- rw_exit_write(&pf_consistency_lock);
- else
- rw_exit_read(&pf_consistency_lock);
+#endif
return (error);
}
+
+#ifdef __FreeBSD__
+/*
+ * XXX - Check for version missmatch!!!
+ */
+static void
+pf_clear_states(void)
+{
+ struct pf_state *state;
+
+ RB_FOREACH(state, pf_state_tree_id, &tree_id) {
+ state->timeout = PFTM_PURGE;
+#if NPFSYNC
+ /* don't send out individual delete messages */
+ state->sync_flags = PFSTATE_NOSYNC;
+#endif
+ }
+ pf_purge_expired_states();
+ pf_status.states = 0;
+#if 0 /* NPFSYNC */
+/*
+ * XXX This is called on module unload, we do not want to sync that over? */
+ */
+ pfsync_clear_states(pf_status.hostid, psk->psk_ifname);
+#endif
+}
+
+static int
+pf_clear_tables(void)
+{
+ struct pfioc_table io;
+ int error;
+
+ bzero(&io, sizeof(io));
+
+ error = pfr_clr_tables(&io.pfrio_table, &io.pfrio_ndel,
+ io.pfrio_flags);
+
+ return (error);
+}
+
+static void
+pf_clear_srcnodes(void)
+{
+ struct pf_src_node *n;
+ struct pf_state *state;
+
+ RB_FOREACH(state, pf_state_tree_id, &tree_id) {
+ state->src_node = NULL;
+ state->nat_src_node = NULL;
+ }
+ RB_FOREACH(n, pf_src_tree, &tree_src_tracking) {
+ n->expire = 1;
+ n->states = 0;
+ }
+ pf_purge_expired_src_nodes();
+ pf_status.src_nodes = 0;
+}
+/*
+ * XXX - Check for version missmatch!!!
+ */
+
+/*
+ * Duplicate pfctl -Fa operation to get rid of as much as we can.
+ */
+static int
+shutdown_pf(void)
+{
+ int error = 0;
+ u_int32_t t[5];
+ char nn = '\0';
+
+ callout_stop(&pf_expire_to);
+
+ pf_status.running = 0;
+ do {
+ if ((error = pf_begin_rules(&t[0], PF_RULESET_SCRUB, &nn))
+ != 0) {
+ DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: SCRUB\n"));
+ break;
+ }
+ if ((error = pf_begin_rules(&t[1], PF_RULESET_FILTER, &nn))
+ != 0) {
+ DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: FILTER\n"));
+ break; /* XXX: rollback? */
+ }
+ if ((error = pf_begin_rules(&t[2], PF_RULESET_NAT, &nn))
+ != 0) {
+ DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: NAT\n"));
+ break; /* XXX: rollback? */
+ }
+ if ((error = pf_begin_rules(&t[3], PF_RULESET_BINAT, &nn))
+ != 0) {
+ DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: BINAT\n"));
+ break; /* XXX: rollback? */
+ }
+ if ((error = pf_begin_rules(&t[4], PF_RULESET_RDR, &nn))
+ != 0) {
+ DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: RDR\n"));
+ break; /* XXX: rollback? */
+ }
+
+ /* XXX: these should always succeed here */
+ pf_commit_rules(t[0], PF_RULESET_SCRUB, &nn);
+ pf_commit_rules(t[1], PF_RULESET_FILTER, &nn);
+ pf_commit_rules(t[2], PF_RULESET_NAT, &nn);
+ pf_commit_rules(t[3], PF_RULESET_BINAT, &nn);
+ pf_commit_rules(t[4], PF_RULESET_RDR, &nn);
+
+ if ((error = pf_clear_tables()) != 0)
+ break;
+
+#ifdef ALTQ
+ if ((error = pf_begin_altq(&t[0])) != 0) {
+ DPFPRINTF(PF_DEBUG_MISC, ("shutdown_pf: ALTQ\n"));
+ break;
+ }
+ pf_commit_altq(t[0]);
+#endif
+
+ pf_clear_states();
+
+ pf_clear_srcnodes();
+
+ /* status does not use malloced mem so no need to cleanup */
+ /* fingerprints and interfaces have thier own cleanup code */
+ } while(0);
+
+ return (error);
+}
+
+static int
+pf_check_in(void *arg, struct mbuf **m, struct ifnet *ifp, int dir,
+ struct inpcb *inp)
+{
+ /*
+ * XXX Wed Jul 9 22:03:16 2003 UTC
+ * OpenBSD has changed its byte ordering convention on ip_len/ip_off
+ * in network stack. OpenBSD's network stack have converted
+ * ip_len/ip_off to host byte order frist as FreeBSD.
+ * Now this is not true anymore , so we should convert back to network
+ * byte order.
+ */
+ struct ip *h = NULL;
+ int chk;
+
+ if ((*m)->m_pkthdr.len >= (int)sizeof(struct ip)) {
+ /* if m_pkthdr.len is less than ip header, pf will handle. */
+ h = mtod(*m, struct ip *);
+ HTONS(h->ip_len);
+ HTONS(h->ip_off);
+ }
+ chk = pf_test(PF_IN, ifp, m, NULL, inp);
+ if (chk && *m) {
+ m_freem(*m);
+ *m = NULL;
+ }
+ if (*m != NULL) {
+ /* pf_test can change ip header location */
+ h = mtod(*m, struct ip *);
+ NTOHS(h->ip_len);
+ NTOHS(h->ip_off);
+ }
+ return chk;
+}
+
+static int
+pf_check_out(void *arg, struct mbuf **m, struct ifnet *ifp, int dir,
+ struct inpcb *inp)
+{
+ /*
+ * XXX Wed Jul 9 22:03:16 2003 UTC
+ * OpenBSD has changed its byte ordering convention on ip_len/ip_off
+ * in network stack. OpenBSD's network stack have converted
+ * ip_len/ip_off to host byte order frist as FreeBSD.
+ * Now this is not true anymore , so we should convert back to network
+ * byte order.
+ */
+ struct ip *h = NULL;
+ int chk;
+
+ /* We need a proper CSUM befor we start (s. OpenBSD ip_output) */
+ if ((*m)->m_pkthdr.csum_flags & CSUM_DELAY_DATA) {
+ in_delayed_cksum(*m);
+ (*m)->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
+ }
+ if ((*m)->m_pkthdr.len >= (int)sizeof(*h)) {
+ /* if m_pkthdr.len is less than ip header, pf will handle. */
+ h = mtod(*m, struct ip *);
+ HTONS(h->ip_len);
+ HTONS(h->ip_off);
+ }
+ chk = pf_test(PF_OUT, ifp, m, NULL, inp);
+ if (chk && *m) {
+ m_freem(*m);
+ *m = NULL;
+ }
+ if (*m != NULL) {
+ /* pf_test can change ip header location */
+ h = mtod(*m, struct ip *);
+ NTOHS(h->ip_len);
+ NTOHS(h->ip_off);
+ }
+ return chk;
+}
+
+#ifdef INET6
+static int
+pf_check6_in(void *arg, struct mbuf **m, struct ifnet *ifp, int dir,
+ struct inpcb *inp)
+{
+ /*
+ * IPv6 is not affected by ip_len/ip_off byte order changes.
+ */
+ int chk;
+
+ /*
+ * In case of loopback traffic IPv6 uses the real interface in
+ * order to support scoped addresses. In order to support stateful
+ * filtering we have change this to lo0 as it is the case in IPv4.
+ */
+ chk = pf_test6(PF_IN, (*m)->m_flags & M_LOOP ? &loif[0] : ifp, m,
+ NULL, inp);
+ if (chk && *m) {
+ m_freem(*m);
+ *m = NULL;
+ }
+ return chk;
+}
+
+static int
+pf_check6_out(void *arg, struct mbuf **m, struct ifnet *ifp, int dir,
+ struct inpcb *inp)
+{
+ /*
+ * IPv6 does not affected ip_len/ip_off byte order changes.
+ */
+ int chk;
+
+ /* We need a proper CSUM befor we start (s. OpenBSD ip_output) */
+ if ((*m)->m_pkthdr.csum_flags & CSUM_DELAY_DATA) {
+ in_delayed_cksum(*m);
+ (*m)->m_pkthdr.csum_flags &= ~CSUM_DELAY_DATA;
+ }
+ chk = pf_test6(PF_OUT, ifp, m, NULL, inp);
+ if (chk && *m) {
+ m_freem(*m);
+ *m = NULL;
+ }
+ return chk;
+}
+#endif /* INET6 */
+
+static int
+hook_pf(void)
+{
+ struct pfil_head *pfh_inet;
+#ifdef INET6
+ struct pfil_head *pfh_inet6;
+#endif
+
+ PF_ASSERT(MA_NOTOWNED);
+
+ if (pf_pfil_hooked)
+ return (0);
+
+ pfh_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET);
+ if (pfh_inet == NULL)
+ return (ESRCH); /* XXX */
+ pfil_add_hook(pf_check_in, NULL, PFIL_IN | PFIL_WAITOK, pfh_inet);
+ pfil_add_hook(pf_check_out, NULL, PFIL_OUT | PFIL_WAITOK, pfh_inet);
+#ifdef INET6
+ pfh_inet6 = pfil_head_get(PFIL_TYPE_AF, AF_INET6);
+ if (pfh_inet6 == NULL) {
+ pfil_remove_hook(pf_check_in, NULL, PFIL_IN | PFIL_WAITOK,
+ pfh_inet);
+ pfil_remove_hook(pf_check_out, NULL, PFIL_OUT | PFIL_WAITOK,
+ pfh_inet);
+ return (ESRCH); /* XXX */
+ }
+ pfil_add_hook(pf_check6_in, NULL, PFIL_IN | PFIL_WAITOK, pfh_inet6);
+ pfil_add_hook(pf_check6_out, NULL, PFIL_OUT | PFIL_WAITOK, pfh_inet6);
+#endif
+
+ pf_pfil_hooked = 1;
+ return (0);
+}
+
+static int
+dehook_pf(void)
+{
+ struct pfil_head *pfh_inet;
+#ifdef INET6
+ struct pfil_head *pfh_inet6;
+#endif
+
+ PF_ASSERT(MA_NOTOWNED);
+
+ if (pf_pfil_hooked == 0)
+ return (0);
+
+ pfh_inet = pfil_head_get(PFIL_TYPE_AF, AF_INET);
+ if (pfh_inet == NULL)
+ return (ESRCH); /* XXX */
+ pfil_remove_hook(pf_check_in, NULL, PFIL_IN | PFIL_WAITOK,
+ pfh_inet);
+ pfil_remove_hook(pf_check_out, NULL, PFIL_OUT | PFIL_WAITOK,
+ pfh_inet);
+#ifdef INET6
+ pfh_inet6 = pfil_head_get(PFIL_TYPE_AF, AF_INET6);
+ if (pfh_inet6 == NULL)
+ return (ESRCH); /* XXX */
+ pfil_remove_hook(pf_check6_in, NULL, PFIL_IN | PFIL_WAITOK,
+ pfh_inet6);
+ pfil_remove_hook(pf_check6_out, NULL, PFIL_OUT | PFIL_WAITOK,
+ pfh_inet6);
+#endif
+
+ pf_pfil_hooked = 0;
+ return (0);
+}
+
+static int
+pf_load(void)
+{
+ init_zone_var();
+ init_pf_mutex();
+ pf_dev = make_dev(&pf_cdevsw, 0, 0, 0, 0600, PF_NAME);
+ if (pfattach() < 0) {
+ destroy_dev(pf_dev);
+ destroy_pf_mutex();
+ return (ENOMEM);
+ }
+ return (0);
+}
+
+static int
+pf_unload(void)
+{
+ int error = 0;
+
+ PF_LOCK();
+ pf_status.running = 0;
+ PF_UNLOCK();
+ error = dehook_pf();
+ if (error) {
+ /*
+ * Should not happen!
+ * XXX Due to error code ESRCH, kldunload will show
+ * a message like 'No such process'.
+ */
+ printf("%s : pfil unregisteration fail\n", __FUNCTION__);
+ return error;
+ }
+ PF_LOCK();
+ shutdown_pf();
+ pfi_cleanup();
+ pf_osfp_flush();
+ pf_osfp_cleanup();
+ cleanup_pf_zone();
+ PF_UNLOCK();
+ destroy_dev(pf_dev);
+ destroy_pf_mutex();
+ return error;
+}
+
+static int
+pf_modevent(module_t mod, int type, void *data)
+{
+ int error = 0;
+
+ switch(type) {
+ case MOD_LOAD:
+ error = pf_load();
+ break;
+
+ case MOD_UNLOAD:
+ error = pf_unload();
+ break;
+ default:
+ error = EINVAL;
+ break;
+ }
+ return error;
+}
+
+static moduledata_t pf_mod = {
+ "pf",
+ pf_modevent,
+ 0
+};
+
+DECLARE_MODULE(pf, pf_mod, SI_SUB_PROTO_IFATTACHDOMAIN, SI_ORDER_FIRST);
+MODULE_VERSION(pf, PF_MODVER);
+#endif /* __FreeBSD__ */
diff --git a/sys/contrib/pf/net/pf_norm.c b/sys/contrib/pf/net/pf_norm.c
index df339ae..0153644 100644
--- a/sys/contrib/pf/net/pf_norm.c
+++ b/sys/contrib/pf/net/pf_norm.c
@@ -1,4 +1,6 @@
-/* $OpenBSD: pf_norm.c,v 1.107 2006/04/16 00:59:52 pascoe Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: pf_norm.c,v 1.97 2004/09/21 16:59:12 aaron Exp $ */
+/* add: $OpenBSD: pf_norm.c,v 1.106 2006/03/25 20:55:24 dhartmei Exp $ */
/*
* Copyright 2001 Niels Provos <provos@citi.umich.edu>
@@ -25,7 +27,18 @@
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/
+#ifdef __FreeBSD__
+#include "opt_inet.h"
+#include "opt_inet6.h"
+#include "opt_pf.h"
+#ifdef DEV_PFLOG
+#define NPFLOG DEV_PFLOG
+#else
+#define NPFLOG 0
+#endif
+#else
#include "pflog.h"
+#endif
#include <sys/param.h>
#include <sys/systm.h>
@@ -35,9 +48,11 @@
#include <sys/socket.h>
#include <sys/kernel.h>
#include <sys/time.h>
+#ifndef __FreeBSD__
#include <sys/pool.h>
#include <dev/rndvar.h>
+#endif
#include <net/if.h>
#include <net/if_types.h>
#include <net/bpf.h>
@@ -60,6 +75,9 @@
#include <net/pfvar.h>
+#ifndef __FreeBSD__
+#include <inttypes.h>
+
struct pf_frent {
LIST_ENTRY(pf_frent) fr_next;
struct ip *fr_ip;
@@ -71,12 +89,14 @@ struct pf_frcache {
uint16_t fr_off;
uint16_t fr_end;
};
+#endif
#define PFFRAG_SEENLAST 0x0001 /* Seen the last fragment for this */
#define PFFRAG_NOBUFFER 0x0002 /* Non-buffering fragment cache */
#define PFFRAG_DROP 0x0004 /* Drop all fragments */
#define BUFFER_FRAGMENTS(fr) (!((fr)->fr_flags & PFFRAG_NOBUFFER))
+#ifndef __FreeBSD__
struct pf_fragment {
RB_ENTRY(pf_fragment) fr_entry;
TAILQ_ENTRY(pf_fragment) frag_next;
@@ -94,12 +114,18 @@ struct pf_fragment {
LIST_HEAD(pf_cacheq, pf_frcache) fru_cache; /* non-buf */
} fr_u;
};
+#endif
TAILQ_HEAD(pf_fragqueue, pf_fragment) pf_fragqueue;
TAILQ_HEAD(pf_cachequeue, pf_fragment) pf_cachequeue;
+#ifndef __FreeBSD__
static __inline int pf_frag_compare(struct pf_fragment *,
struct pf_fragment *);
+#else
+static int pf_frag_compare(struct pf_fragment *,
+ struct pf_fragment *);
+#endif
RB_HEAD(pf_frag_tree, pf_fragment) pf_frag_tree, pf_cache_tree;
RB_PROTOTYPE(pf_frag_tree, pf_fragment, fr_entry, pf_frag_compare);
RB_GENERATE(pf_frag_tree, pf_fragment, fr_entry, pf_frag_compare);
@@ -125,13 +151,28 @@ int pf_normalize_tcpopt(struct pf_rule *, struct mbuf *,
} while(0)
/* Globals */
+#ifdef __FreeBSD__
+uma_zone_t pf_frent_pl, pf_frag_pl, pf_cache_pl, pf_cent_pl;
+uma_zone_t pf_state_scrub_pl;
+#else
struct pool pf_frent_pl, pf_frag_pl, pf_cache_pl, pf_cent_pl;
struct pool pf_state_scrub_pl;
+#endif
int pf_nfrents, pf_ncache;
void
pf_normalize_init(void)
{
+#ifdef __FreeBSD__
+ /*
+ * XXX
+ * No high water mark support(It's hint not hard limit).
+ * uma_zone_set_max(pf_frag_pl, PFFRAG_FRAG_HIWAT);
+ */
+ uma_zone_set_max(pf_frent_pl, PFFRAG_FRENT_HIWAT);
+ uma_zone_set_max(pf_cache_pl, PFFRAG_FRCACHE_HIWAT);
+ uma_zone_set_max(pf_cent_pl, PFFRAG_FRCENT_HIWAT);
+#else
pool_init(&pf_frent_pl, sizeof(struct pf_frent), 0, 0, 0, "pffrent",
NULL);
pool_init(&pf_frag_pl, sizeof(struct pf_fragment), 0, 0, 0, "pffrag",
@@ -147,12 +188,17 @@ pf_normalize_init(void)
pool_sethardlimit(&pf_frent_pl, PFFRAG_FRENT_HIWAT, NULL, 0);
pool_sethardlimit(&pf_cache_pl, PFFRAG_FRCACHE_HIWAT, NULL, 0);
pool_sethardlimit(&pf_cent_pl, PFFRAG_FRCENT_HIWAT, NULL, 0);
+#endif
TAILQ_INIT(&pf_fragqueue);
TAILQ_INIT(&pf_cachequeue);
}
+#ifdef __FreeBSD__
+static int
+#else
static __inline int
+#endif
pf_frag_compare(struct pf_fragment *a, struct pf_fragment *b)
{
int diff;
@@ -180,7 +226,12 @@ pf_purge_expired_fragments(void)
pf_default_rule.timeout[PFTM_FRAG];
while ((frag = TAILQ_LAST(&pf_fragqueue, pf_fragqueue)) != NULL) {
+#ifdef __FreeBSD__
+ KASSERT((BUFFER_FRAGMENTS(frag)),
+ ("BUFFER_FRAGMENTS(frag) == 0: %s", __FUNCTION__));
+#else
KASSERT(BUFFER_FRAGMENTS(frag));
+#endif
if (frag->fr_timeout > expire)
break;
@@ -189,14 +240,26 @@ pf_purge_expired_fragments(void)
}
while ((frag = TAILQ_LAST(&pf_cachequeue, pf_cachequeue)) != NULL) {
+#ifdef __FreeBSD__
+ KASSERT((!BUFFER_FRAGMENTS(frag)),
+ ("BUFFER_FRAGMENTS(frag) != 0: %s", __FUNCTION__));
+#else
KASSERT(!BUFFER_FRAGMENTS(frag));
+#endif
if (frag->fr_timeout > expire)
break;
DPFPRINTF(("expiring %d(%p)\n", frag->fr_id, frag));
pf_free_fragment(frag);
+#ifdef __FreeBSD__
+ KASSERT((TAILQ_EMPTY(&pf_cachequeue) ||
+ TAILQ_LAST(&pf_cachequeue, pf_cachequeue) != frag),
+ ("!(TAILQ_EMPTY() || TAILQ_LAST() == farg): %s",
+ __FUNCTION__));
+#else
KASSERT(TAILQ_EMPTY(&pf_cachequeue) ||
TAILQ_LAST(&pf_cachequeue, pf_cachequeue) != frag);
+#endif
}
}
@@ -255,9 +318,17 @@ pf_free_fragment(struct pf_fragment *frag)
frcache = LIST_FIRST(&frag->fr_cache)) {
LIST_REMOVE(frcache, fr_next);
+#ifdef __FreeBSD__
+ KASSERT((LIST_EMPTY(&frag->fr_cache) ||
+ LIST_FIRST(&frag->fr_cache)->fr_off >
+ frcache->fr_end),
+ ("! (LIST_EMPTY() || LIST_FIRST()->fr_off >"
+ " frcache->fr_end): %s", __FUNCTION__));
+#else
KASSERT(LIST_EMPTY(&frag->fr_cache) ||
LIST_FIRST(&frag->fr_cache)->fr_off >
frcache->fr_end);
+#endif
pool_put(&pf_cent_pl, frcache);
pf_ncache--;
@@ -330,7 +401,12 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
u_int16_t ip_len = ntohs(ip->ip_len) - ip->ip_hl * 4;
u_int16_t max = ip_len + off;
+#ifdef __FreeBSD__
+ KASSERT((*frag == NULL || BUFFER_FRAGMENTS(*frag)),
+ ("! (*frag == NULL || BUFFER_FRAGMENTS(*frag)): %s", __FUNCTION__));
+#else
KASSERT(*frag == NULL || BUFFER_FRAGMENTS(*frag));
+#endif
/* Strip off ip header */
m->m_data += hlen;
@@ -373,7 +449,12 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
frep = frea;
}
+#ifdef __FreeBSD__
+ KASSERT((frep != NULL || frea != NULL),
+ ("!(frep != NULL || frea != NULL): %s", __FUNCTION__));;
+#else
KASSERT(frep != NULL || frea != NULL);
+#endif
if (frep != NULL &&
FR_IP_OFF(frep) + ntohs(frep->fr_ip->ip_len) - frep->fr_ip->ip_hl *
@@ -412,7 +493,7 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
break;
}
- /* This fragment is completely overlapped, lose it */
+ /* This fragment is completely overlapped, loose it */
next = LIST_NEXT(frea, fr_next);
m_freem(frea->fr_m);
LIST_REMOVE(frea, fr_next);
@@ -458,7 +539,11 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
/* We have all the data */
frent = LIST_FIRST(&(*frag)->fr_queue);
+#ifdef __FreeBSD__
+ KASSERT((frent != NULL), ("frent == NULL: %s", __FUNCTION__));
+#else
KASSERT(frent != NULL);
+#endif
if ((frent->fr_ip->ip_hl << 2) + off > IP_MAXPACKET) {
DPFPRINTF(("drop: too big: %d\n", off));
pf_free_fragment(*frag);
@@ -481,8 +566,17 @@ pf_reassemble(struct mbuf **m0, struct pf_fragment **frag,
m2 = frent->fr_m;
pool_put(&pf_frent_pl, frent);
pf_nfrents--;
+#ifdef __FreeBSD__
+ m->m_pkthdr.csum_flags &= m2->m_pkthdr.csum_flags;
+ m->m_pkthdr.csum_data += m2->m_pkthdr.csum_data;
+#endif
m_cat(m, m2);
}
+#ifdef __FreeBSD__
+ while (m->m_pkthdr.csum_data & 0xffff0000)
+ m->m_pkthdr.csum_data = (m->m_pkthdr.csum_data & 0xffff) +
+ (m->m_pkthdr.csum_data >> 16);
+#endif
ip->ip_src = (*frag)->fr_src;
ip->ip_dst = (*frag)->fr_dst;
@@ -527,7 +621,12 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
u_int16_t max = ip_len + off;
int hosed = 0;
+#ifdef __FreeBSD__
+ KASSERT((*frag == NULL || !BUFFER_FRAGMENTS(*frag)),
+ ("!(*frag == NULL || !BUFFER_FRAGMENTS(*frag)): %s", __FUNCTION__));
+#else
KASSERT(*frag == NULL || !BUFFER_FRAGMENTS(*frag));
+#endif
/* Create a new range queue for this packet */
if (*frag == NULL) {
@@ -580,7 +679,12 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
frp = fra;
}
+#ifdef __FreeBSD__
+ KASSERT((frp != NULL || fra != NULL),
+ ("!(frp != NULL || fra != NULL): %s", __FUNCTION__));
+#else
KASSERT(frp != NULL || fra != NULL);
+#endif
if (frp != NULL) {
int precut;
@@ -622,10 +726,24 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
* than this mbuf magic. For my next trick,
* I'll pull a rabbit out of my laptop.
*/
+#ifdef __FreeBSD__
+ *m0 = m_dup(m, M_DONTWAIT);
+#else
*m0 = m_copym2(m, 0, h->ip_hl << 2, M_NOWAIT);
+#endif
if (*m0 == NULL)
goto no_mem;
+#ifdef __FreeBSD__
+ /* From KAME Project : We have missed this! */
+ m_adj(*m0, (h->ip_hl << 2) -
+ (*m0)->m_pkthdr.len);
+
+ KASSERT(((*m0)->m_next == NULL),
+ ("(*m0)->m_next != NULL: %s",
+ __FUNCTION__));
+#else
KASSERT((*m0)->m_next == NULL);
+#endif
m_adj(m, precut + (h->ip_hl << 2));
m_cat(*m0, m);
m = *m0;
@@ -640,9 +758,15 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
h = mtod(m, struct ip *);
-
+#ifdef __FreeBSD__
+ KASSERT(((int)m->m_len ==
+ ntohs(h->ip_len) - precut),
+ ("m->m_len != ntohs(h->ip_len) - precut: %s",
+ __FUNCTION__));
+#else
KASSERT((int)m->m_len ==
ntohs(h->ip_len) - precut);
+#endif
h->ip_off = htons(ntohs(h->ip_off) +
(precut >> 3));
h->ip_len = htons(ntohs(h->ip_len) - precut);
@@ -698,8 +822,14 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
m->m_pkthdr.len = plen;
}
h = mtod(m, struct ip *);
+#ifdef __FreeBSD__
+ KASSERT(((int)m->m_len == ntohs(h->ip_len) - aftercut),
+ ("m->m_len != ntohs(h->ip_len) - aftercut: %s",
+ __FUNCTION__));
+#else
KASSERT((int)m->m_len ==
ntohs(h->ip_len) - aftercut);
+#endif
h->ip_len = htons(ntohs(h->ip_len) - aftercut);
} else {
hosed++;
@@ -737,7 +867,12 @@ pf_fragcache(struct mbuf **m0, struct ip *h, struct pf_fragment **frag, int mff,
} else if (frp && fra->fr_off <= frp->fr_end) {
/* Need to merge in a modified 'frp' */
+#ifdef __FreeBSD__
+ KASSERT((cur == NULL), ("cur != NULL: %s",
+ __FUNCTION__));
+#else
KASSERT(cur == NULL);
+#endif
DPFPRINTF(("fragcache[%d]: adjacent(merge "
"%d-%d) %d-%d (%d-%d)\n",
h->ip_id, frp->fr_off, frp->fr_end, off,
@@ -831,7 +966,8 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_SCRUB].active.ptr);
while (r != NULL) {
r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
+ if (r->kif != NULL &&
+ (r->kif != kif && r->kif != kif->pfik_parent) == !r->ifnot)
r = r->skip[PF_SKIP_IFP].ptr;
else if (r->direction && r->direction != dir)
r = r->skip[PF_SKIP_DIR].ptr;
@@ -840,23 +976,19 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
else if (r->proto && r->proto != h->ip_p)
r = r->skip[PF_SKIP_PROTO].ptr;
else if (PF_MISMATCHAW(&r->src.addr,
- (struct pf_addr *)&h->ip_src.s_addr, AF_INET,
- r->src.neg, kif))
+ (struct pf_addr *)&h->ip_src.s_addr, AF_INET, r->src.neg))
r = r->skip[PF_SKIP_SRC_ADDR].ptr;
else if (PF_MISMATCHAW(&r->dst.addr,
- (struct pf_addr *)&h->ip_dst.s_addr, AF_INET,
- r->dst.neg, NULL))
+ (struct pf_addr *)&h->ip_dst.s_addr, AF_INET, r->dst.neg))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
else
break;
}
- if (r == NULL || r->action == PF_NOSCRUB)
+ if (r == NULL)
return (PF_PASS);
- else {
- r->packets[dir == PF_OUT]++;
- r->bytes[dir == PF_OUT] += pd->tot_len;
- }
+ else
+ r->packets++;
/* Check for illegal packets */
if (hlen < (int)sizeof(struct ip))
@@ -929,18 +1061,6 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
if (m == NULL)
return (PF_DROP);
- /* use mtag from concatenated mbuf chain */
- pd->pf_mtag = pf_find_mtag(m);
-#ifdef DIAGNOSTIC
- if (pd->pf_mtag == NULL) {
- printf("%s: pf_find_mtag returned NULL(1)\n", __func__);
- if ((pd->pf_mtag = pf_get_mtag(m)) == NULL) {
- m_freem(m);
- *m0 = NULL;
- goto no_mem;
- }
- }
-#endif
if (frag != NULL && (frag->fr_flags & PFFRAG_DROP))
goto drop;
@@ -949,13 +1069,15 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
/* non-buffering fragment cache (drops or masks overlaps) */
int nomem = 0;
- if (dir == PF_OUT && pd->pf_mtag->flags & PF_TAG_FRAGCACHE) {
- /*
- * Already passed the fragment cache in the
- * input direction. If we continued, it would
- * appear to be a dup and would be dropped.
- */
- goto fragment_pass;
+ if (dir == PF_OUT) {
+ if (m_tag_find(m, PACKET_TAG_PF_FRAGCACHE, NULL) !=
+ NULL) {
+ /* Already passed the fragment cache in the
+ * input direction. If we continued, it would
+ * appear to be a dup and would be dropped.
+ */
+ goto fragment_pass;
+ }
}
frag = pf_find_fragment(h, &pf_cache_tree);
@@ -976,21 +1098,14 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
goto drop;
}
- /* use mtag from copied and trimmed mbuf chain */
- pd->pf_mtag = pf_find_mtag(m);
-#ifdef DIAGNOSTIC
- if (pd->pf_mtag == NULL) {
- printf("%s: pf_find_mtag returned NULL(2)\n", __func__);
- if ((pd->pf_mtag = pf_get_mtag(m)) == NULL) {
- m_freem(m);
- *m0 = NULL;
+ if (dir == PF_IN) {
+ struct m_tag *mtag;
+
+ mtag = m_tag_get(PACKET_TAG_PF_FRAGCACHE, 0, M_NOWAIT);
+ if (mtag == NULL)
goto no_mem;
- }
+ m_tag_prepend(m, mtag);
}
-#endif
- if (dir == PF_IN)
- pd->pf_mtag->flags |= PF_TAG_FRAGCACHE;
-
if (frag != NULL && (frag->fr_flags & PFFRAG_DROP))
goto drop;
goto fragment_pass;
@@ -1039,13 +1154,13 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
no_mem:
REASON_SET(reason, PFRES_MEMORY);
if (r != NULL && r->log)
- PFLOG_PACKET(kif, h, m, AF_INET, dir, *reason, r, NULL, NULL, pd);
+ PFLOG_PACKET(kif, h, m, AF_INET, dir, *reason, r, NULL, NULL);
return (PF_DROP);
drop:
REASON_SET(reason, PFRES_NORM);
if (r != NULL && r->log)
- PFLOG_PACKET(kif, h, m, AF_INET, dir, *reason, r, NULL, NULL, pd);
+ PFLOG_PACKET(kif, h, m, AF_INET, dir, *reason, r, NULL, NULL);
return (PF_DROP);
bad:
@@ -1057,7 +1172,7 @@ pf_normalize_ip(struct mbuf **m0, int dir, struct pfi_kif *kif, u_short *reason,
REASON_SET(reason, PFRES_FRAG);
if (r != NULL && r->log)
- PFLOG_PACKET(kif, h, m, AF_INET, dir, *reason, r, NULL, NULL, pd);
+ PFLOG_PACKET(kif, h, m, AF_INET, dir, *reason, r, NULL, NULL);
return (PF_DROP);
}
@@ -1085,7 +1200,8 @@ pf_normalize_ip6(struct mbuf **m0, int dir, struct pfi_kif *kif,
r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_SCRUB].active.ptr);
while (r != NULL) {
r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
+ if (r->kif != NULL &&
+ (r->kif != kif && r->kif != kif->pfik_parent) == !r->ifnot)
r = r->skip[PF_SKIP_IFP].ptr;
else if (r->direction && r->direction != dir)
r = r->skip[PF_SKIP_DIR].ptr;
@@ -1096,23 +1212,19 @@ pf_normalize_ip6(struct mbuf **m0, int dir, struct pfi_kif *kif,
r = r->skip[PF_SKIP_PROTO].ptr;
#endif
else if (PF_MISMATCHAW(&r->src.addr,
- (struct pf_addr *)&h->ip6_src, AF_INET6,
- r->src.neg, kif))
+ (struct pf_addr *)&h->ip6_src, AF_INET6, r->src.neg))
r = r->skip[PF_SKIP_SRC_ADDR].ptr;
else if (PF_MISMATCHAW(&r->dst.addr,
- (struct pf_addr *)&h->ip6_dst, AF_INET6,
- r->dst.neg, NULL))
+ (struct pf_addr *)&h->ip6_dst, AF_INET6, r->dst.neg))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
else
break;
}
- if (r == NULL || r->action == PF_NOSCRUB)
+ if (r == NULL)
return (PF_PASS);
- else {
- r->packets[dir == PF_OUT]++;
- r->bytes[dir == PF_OUT] += pd->tot_len;
- }
+ else
+ r->packets++;
/* Check for illegal packets */
if (sizeof(struct ip6_hdr) + IPV6_MAXPACKET < m->m_pkthdr.len)
@@ -1224,19 +1336,19 @@ pf_normalize_ip6(struct mbuf **m0, int dir, struct pfi_kif *kif,
shortpkt:
REASON_SET(reason, PFRES_SHORT);
if (r != NULL && r->log)
- PFLOG_PACKET(kif, h, m, AF_INET6, dir, *reason, r, NULL, NULL, pd);
+ PFLOG_PACKET(kif, h, m, AF_INET6, dir, *reason, r, NULL, NULL);
return (PF_DROP);
drop:
REASON_SET(reason, PFRES_NORM);
if (r != NULL && r->log)
- PFLOG_PACKET(kif, h, m, AF_INET6, dir, *reason, r, NULL, NULL, pd);
+ PFLOG_PACKET(kif, h, m, AF_INET6, dir, *reason, r, NULL, NULL);
return (PF_DROP);
badfrag:
REASON_SET(reason, PFRES_FRAG);
if (r != NULL && r->log)
- PFLOG_PACKET(kif, h, m, AF_INET6, dir, *reason, r, NULL, NULL, pd);
+ PFLOG_PACKET(kif, h, m, AF_INET6, dir, *reason, r, NULL, NULL);
return (PF_DROP);
}
#endif /* INET6 */
@@ -1255,7 +1367,8 @@ pf_normalize_tcp(int dir, struct pfi_kif *kif, struct mbuf *m, int ipoff,
r = TAILQ_FIRST(pf_main_ruleset.rules[PF_RULESET_SCRUB].active.ptr);
while (r != NULL) {
r->evaluations++;
- if (pfi_kif_match(r->kif, kif) == r->ifnot)
+ if (r->kif != NULL &&
+ (r->kif != kif && r->kif != kif->pfik_parent) == !r->ifnot)
r = r->skip[PF_SKIP_IFP].ptr;
else if (r->direction && r->direction != dir)
r = r->skip[PF_SKIP_DIR].ptr;
@@ -1263,14 +1376,12 @@ pf_normalize_tcp(int dir, struct pfi_kif *kif, struct mbuf *m, int ipoff,
r = r->skip[PF_SKIP_AF].ptr;
else if (r->proto && r->proto != pd->proto)
r = r->skip[PF_SKIP_PROTO].ptr;
- else if (PF_MISMATCHAW(&r->src.addr, pd->src, af,
- r->src.neg, kif))
+ else if (PF_MISMATCHAW(&r->src.addr, pd->src, af, r->src.neg))
r = r->skip[PF_SKIP_SRC_ADDR].ptr;
else if (r->src.port_op && !pf_match_port(r->src.port_op,
r->src.port[0], r->src.port[1], th->th_sport))
r = r->skip[PF_SKIP_SRC_PORT].ptr;
- else if (PF_MISMATCHAW(&r->dst.addr, pd->dst, af,
- r->dst.neg, NULL))
+ else if (PF_MISMATCHAW(&r->dst.addr, pd->dst, af, r->dst.neg))
r = r->skip[PF_SKIP_DST_ADDR].ptr;
else if (r->dst.port_op && !pf_match_port(r->dst.port_op,
r->dst.port[0], r->dst.port[1], th->th_dport))
@@ -1287,10 +1398,8 @@ pf_normalize_tcp(int dir, struct pfi_kif *kif, struct mbuf *m, int ipoff,
if (rm == NULL || rm->action == PF_NOSCRUB)
return (PF_PASS);
- else {
- r->packets[dir == PF_OUT]++;
- r->bytes[dir == PF_OUT] += pd->tot_len;
- }
+ else
+ r->packets++;
if (rm->rule_flag & PFRULE_REASSEMBLE_TCP)
pd->flags |= PFDESC_TCP_NORM;
@@ -1345,14 +1454,14 @@ pf_normalize_tcp(int dir, struct pfi_kif *kif, struct mbuf *m, int ipoff,
/* copy back packet headers if we sanitized */
if (rewrite)
- m_copyback(m, off, sizeof(*th), th);
+ m_copyback(m, off, sizeof(*th), (caddr_t)th);
return (PF_PASS);
tcp_drop:
REASON_SET(&reason, PFRES_NORM);
if (rm != NULL && r->log)
- PFLOG_PACKET(kif, h, m, AF_INET, dir, reason, r, NULL, NULL, pd);
+ PFLOG_PACKET(kif, h, m, AF_INET, dir, reason, r, NULL, NULL);
return (PF_DROP);
}
@@ -1364,7 +1473,12 @@ pf_normalize_tcp_init(struct mbuf *m, int off, struct pf_pdesc *pd,
u_int8_t hdr[60];
u_int8_t *opt;
+#ifdef __FreeBSD__
+ KASSERT((src->scrub == NULL),
+ ("pf_normalize_tcp_init: src->scrub != NULL"));
+#else
KASSERT(src->scrub == NULL);
+#endif
src->scrub = pool_get(&pf_state_scrub_pl, PR_NOWAIT);
if (src->scrub == NULL)
@@ -1463,7 +1577,12 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
int copyback = 0;
int got_ts = 0;
+#ifdef __FreeBSD__
+ KASSERT((src->scrub || dst->scrub),
+ ("pf_normalize_tcp_statefull: src->scrub && dst->scrub!"));
+#else
KASSERT(src->scrub || dst->scrub);
+#endif
/*
* Enforce the minimum TTL seen for this connection. Negate a common
@@ -1687,6 +1806,19 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
/* Calculate max ticks since the last timestamp */
#define TS_MAXFREQ 1100 /* RFC max TS freq of 1Khz + 10% skew */
#define TS_MICROSECS 1000000 /* microseconds per second */
+#ifdef __FreeBSD__
+#ifndef timersub
+#define timersub(tvp, uvp, vvp) \
+ do { \
+ (vvp)->tv_sec = (tvp)->tv_sec - (uvp)->tv_sec; \
+ (vvp)->tv_usec = (tvp)->tv_usec - (uvp)->tv_usec; \
+ if ((vvp)->tv_usec < 0) { \
+ (vvp)->tv_sec--; \
+ (vvp)->tv_usec += 1000000; \
+ } \
+ } while (0)
+#endif
+#endif
timersub(&uptime, &src->scrub->pfss_last, &delta_ts);
tsval_from_last = (delta_ts.tv_sec + ts_fudge) * TS_MAXFREQ;
tsval_from_last += delta_ts.tv_usec / (TS_MICROSECS/TS_MAXFREQ);
@@ -1711,6 +1843,18 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
tsval_from_last) ? '1' : ' ',
SEQ_GT(tsecr, dst->scrub->pfss_tsval) ? '2' : ' ',
SEQ_LT(tsecr, dst->scrub->pfss_tsval0)? '3' : ' '));
+#ifdef __FreeBSD__
+ DPFPRINTF((" tsval: %u tsecr: %u +ticks: %u "
+ "idle: %jus %lums\n",
+ tsval, tsecr, tsval_from_last,
+ (uintmax_t)delta_ts.tv_sec,
+ delta_ts.tv_usec / 1000));
+ DPFPRINTF((" src->tsval: %u tsecr: %u\n",
+ src->scrub->pfss_tsval, src->scrub->pfss_tsecr));
+ DPFPRINTF((" dst->tsval: %u tsecr: %u tsval0: %u"
+ "\n", dst->scrub->pfss_tsval,
+ dst->scrub->pfss_tsecr, dst->scrub->pfss_tsval0));
+#else
DPFPRINTF((" tsval: %lu tsecr: %lu +ticks: %lu "
"idle: %lus %lums\n",
tsval, tsecr, tsval_from_last, delta_ts.tv_sec,
@@ -1720,6 +1864,7 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
DPFPRINTF((" dst->tsval: %lu tsecr: %lu tsval0: %lu"
"\n", dst->scrub->pfss_tsval,
dst->scrub->pfss_tsecr, dst->scrub->pfss_tsval0));
+#endif
if (pf_status.debug >= PF_DEBUG_MISC) {
pf_print_state(state);
pf_print_flags(th->th_flags);
@@ -1786,7 +1931,7 @@ pf_normalize_tcp_stateful(struct mbuf *m, int off, struct pf_pdesc *pd,
* timestamps. And require all data packets to contain a timestamp
* if the first does. PAWS implicitly requires that all data packets be
* timestamped. But I think there are middle-man devices that hijack
- * TCP streams immediately after the 3whs and don't timestamp their
+ * TCP streams immedietly after the 3whs and don't timestamp their
* packets (seen in a WWW accelerator or cache).
*/
if (pd->p_len > 0 && src->scrub && (src->scrub->pfss_flags &
diff --git a/sys/contrib/pf/net/pf_osfp.c b/sys/contrib/pf/net/pf_osfp.c
index 15dca8e..ce1efee 100644
--- a/sys/contrib/pf/net/pf_osfp.c
+++ b/sys/contrib/pf/net/pf_osfp.c
@@ -1,4 +1,5 @@
-/* $OpenBSD: pf_osfp.c,v 1.12 2006/12/13 18:14:10 itojun Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: pf_osfp.c,v 1.10 2004/04/09 19:30:41 frantzen Exp $ */
/*
* Copyright (c) 2003 Mike Frantzen <frantzen@w4g.org>
@@ -32,17 +33,19 @@
#include <net/if.h>
#include <net/pfvar.h>
+#ifdef INET6
#include <netinet/ip6.h>
-#ifdef _KERNEL
-#include <netinet6/in6_var.h>
-#endif
-
+#endif /* INET6 */
#ifdef _KERNEL
# define DPFPRINTF(format, x...) \
if (pf_status.debug >= PF_DEBUG_NOISY) \
printf(format , ##x)
+#ifdef __FreeBSD__
+typedef uma_zone_t pool_t;
+#else
typedef struct pool pool_t;
+#endif
#else
/* Userland equivalents so we can lend code to tcpdump et al. */
@@ -52,12 +55,15 @@ typedef struct pool pool_t;
# include <stdio.h>
# include <stdlib.h>
# include <string.h>
-# include <netdb.h>
# define pool_t int
# define pool_get(pool, flags) malloc(*(pool))
# define pool_put(pool, item) free(item)
# define pool_init(pool, size, a, ao, f, m, p) (*(pool)) = (size)
+# ifdef __FreeBSD__
+# define NTOHS(x) (x) = ntohs((u_int16_t)(x))
+# endif
+
# ifdef PFDEBUG
# include <sys/stdarg.h>
# define DPFPRINTF(format, x...) fprintf(stderr, format , ##x)
@@ -89,96 +95,38 @@ pf_osfp_fingerprint(struct pf_pdesc *pd, struct mbuf *m, int off,
const struct tcphdr *tcp)
{
struct ip *ip;
- struct ip6_hdr *ip6;
char hdr[60];
- if ((pd->af != PF_INET && pd->af != PF_INET6) ||
- pd->proto != IPPROTO_TCP || (tcp->th_off << 2) < sizeof(*tcp))
+ /* XXX don't have a fingerprint database for IPv6 :-( */
+ if (pd->af != PF_INET || pd->proto != IPPROTO_TCP || (tcp->th_off << 2)
+ < sizeof(*tcp))
return (NULL);
- if (pd->af == PF_INET) {
- ip = mtod(m, struct ip *);
- ip6 = (struct ip6_hdr *)NULL;
- } else {
- ip = (struct ip *)NULL;
- ip6 = mtod(m, struct ip6_hdr *);
- }
- if (!pf_pull_hdr(m, off, hdr, tcp->th_off << 2, NULL, NULL,
- pd->af)) return (NULL);
+ ip = mtod(m, struct ip *);
+ if (!pf_pull_hdr(m, off, hdr, tcp->th_off << 2, NULL, NULL, pd->af))
+ return (NULL);
- return (pf_osfp_fingerprint_hdr(ip, ip6, (struct tcphdr *)hdr));
+ return (pf_osfp_fingerprint_hdr(ip, (struct tcphdr *)hdr));
}
#endif /* _KERNEL */
struct pf_osfp_enlist *
-pf_osfp_fingerprint_hdr(const struct ip *ip, const struct ip6_hdr *ip6, const struct tcphdr *tcp)
+pf_osfp_fingerprint_hdr(const struct ip *ip, const struct tcphdr *tcp)
{
struct pf_os_fingerprint fp, *fpresult;
int cnt, optlen = 0;
const u_int8_t *optp;
-#ifdef _KERNEL
- char srcname[128];
-#else
- char srcname[NI_MAXHOST];
-#endif
- if ((tcp->th_flags & (TH_SYN|TH_ACK)) != TH_SYN)
+ if ((tcp->th_flags & (TH_SYN|TH_ACK)) != TH_SYN || (ip->ip_off &
+ htons(IP_OFFMASK)))
return (NULL);
- if (ip) {
- if ((ip->ip_off & htons(IP_OFFMASK)) != 0)
- return (NULL);
- }
memset(&fp, 0, sizeof(fp));
- if (ip) {
-#ifndef _KERNEL
- struct sockaddr_in sin;
-#endif
-
- fp.fp_psize = ntohs(ip->ip_len);
- fp.fp_ttl = ip->ip_ttl;
- if (ip->ip_off & htons(IP_DF))
- fp.fp_flags |= PF_OSFP_DF;
-#ifdef _KERNEL
- strlcpy(srcname, inet_ntoa(ip->ip_src), sizeof(srcname));
-#else
- memset(&sin, 0, sizeof(sin));
- sin.sin_family = AF_INET;
- sin.sin_len = sizeof(struct sockaddr_in);
- sin.sin_addr = ip->ip_src;
- (void)getnameinfo((struct sockaddr *)&sin,
- sizeof(struct sockaddr_in), srcname, sizeof(srcname),
- NULL, 0, NI_NUMERICHOST);
-#endif
- }
-#ifdef INET6
- else if (ip6) {
-#ifndef _KERNEL
- struct sockaddr_in6 sin6;
-#endif
-
- /* jumbo payload? */
- fp.fp_psize = sizeof(struct ip6_hdr) + ntohs(ip6->ip6_plen);
- fp.fp_ttl = ip6->ip6_hlim;
+ fp.fp_psize = ntohs(ip->ip_len);
+ fp.fp_ttl = ip->ip_ttl;
+ if (ip->ip_off & htons(IP_DF))
fp.fp_flags |= PF_OSFP_DF;
- fp.fp_flags |= PF_OSFP_INET6;
-#ifdef _KERNEL
- strlcpy(srcname, ip6_sprintf((struct in6_addr *)&ip6->ip6_src),
- sizeof(srcname));
-#else
- memset(&sin6, 0, sizeof(sin6));
- sin6.sin6_family = AF_INET6;
- sin6.sin6_len = sizeof(struct sockaddr_in6);
- sin6.sin6_addr = ip6->ip6_src;
- (void)getnameinfo((struct sockaddr *)&sin6,
- sizeof(struct sockaddr_in6), srcname, sizeof(srcname),
- NULL, 0, NI_NUMERICHOST);
-#endif
- }
-#endif
- else
- return (NULL);
fp.fp_wsize = ntohs(tcp->th_win);
@@ -241,7 +189,7 @@ pf_osfp_fingerprint_hdr(const struct ip *ip, const struct ip6_hdr *ip6, const st
DPFPRINTF("fingerprinted %s:%d %d:%d:%d:%d:%llx (%d) "
"(TS=%s,M=%s%d,W=%s%d)\n",
- srcname, ntohs(tcp->th_sport),
+ inet_ntoa(ip->ip_src), ntohs(tcp->th_sport),
fp.fp_wsize, fp.fp_ttl, (fp.fp_flags & PF_OSFP_DF) != 0,
fp.fp_psize, (long long int)fp.fp_tcpopts, fp.fp_optcnt,
(fp.fp_flags & PF_OSFP_TS0) ? "0" : "",
@@ -289,16 +237,47 @@ pf_osfp_match(struct pf_osfp_enlist *list, pf_osfp_t os)
}
/* Initialize the OS fingerprint system */
+#ifdef __FreeBSD__
+int
+#else
void
+#endif
pf_osfp_initialize(void)
{
+#if defined(__FreeBSD__) && defined(_KERNEL)
+ int error = ENOMEM;
+
+ do {
+ pf_osfp_entry_pl = pf_osfp_pl = NULL;
+ UMA_CREATE(pf_osfp_entry_pl, struct pf_osfp_entry, "pfospfen");
+ UMA_CREATE(pf_osfp_pl, struct pf_os_fingerprint, "pfosfp");
+ error = 0;
+ } while(0);
+#else
pool_init(&pf_osfp_entry_pl, sizeof(struct pf_osfp_entry), 0, 0, 0,
"pfosfpen", &pool_allocator_nointr);
pool_init(&pf_osfp_pl, sizeof(struct pf_os_fingerprint), 0, 0, 0,
"pfosfp", &pool_allocator_nointr);
+#endif
SLIST_INIT(&pf_osfp_list);
+#ifdef __FreeBSD__
+#ifdef _KERNEL
+ return (error);
+#else
+ return (0);
+#endif
+#endif
}
+#if defined(__FreeBSD__) && (_KERNEL)
+void
+pf_osfp_cleanup(void)
+{
+ UMA_DESTROY(pf_osfp_entry_pl);
+ UMA_DESTROY(pf_osfp_pl);
+}
+#endif
+
/* Flush the fingerprint list */
void
pf_osfp_flush(void)
diff --git a/sys/contrib/pf/net/pf_subr.c b/sys/contrib/pf/net/pf_subr.c
new file mode 100644
index 0000000..3de2924
--- /dev/null
+++ b/sys/contrib/pf/net/pf_subr.c
@@ -0,0 +1,127 @@
+/* $FreeBSD$ */
+/* from $OpenBSD: kern_subr.c,v 1.26 2003/10/31 11:10:41 markus Exp $ */
+/* $NetBSD: kern_subr.c,v 1.15 1996/04/09 17:21:56 ragge Exp $ */
+
+/*
+ * Copyright (c) 1982, 1986, 1991, 1993
+ * The Regents of the University of California. All rights reserved.
+ * (c) UNIX System Laboratories, Inc.
+ * All or some portions of this file are derived from material licensed
+ * to the University of California by American Telephone and Telegraph
+ * Co. or Unix System Laboratories, Inc. and are reproduced herein with
+ * the permission of UNIX System Laboratories, Inc.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. Neither the name of the University nor the names of its contributors
+ * may be used to endorse or promote products derived from this software
+ * without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * @(#)kern_subr.c 8.3 (Berkeley) 1/21/94
+ */
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/socket.h>
+#include <sys/socketvar.h>
+#include <sys/proc.h>
+#include <sys/malloc.h>
+#include <sys/queue.h>
+#include <sys/kernel.h>
+#include <sys/resourcevar.h>
+
+#include <net/if.h>
+
+#include <netinet/in.h>
+#include <netinet/in_var.h>
+
+#include <net/pfvar.h>
+
+/*
+ * This implements additional functions used by pf which can not be ported
+ * easyly. At this point it boils down to mostly the Net/OpenBSD hook
+ * implementation.
+ *
+ * BEWARE: this is not locked! Required locking is done by the caller.
+ */
+
+void *
+hook_establish(struct hook_desc_head *head, int tail, void (*fn)(void *),
+ void *arg)
+{
+ struct hook_desc *hdp;
+
+ hdp = (struct hook_desc *)malloc(sizeof (*hdp), M_DEVBUF, M_NOWAIT);
+ if (hdp == NULL)
+ return (NULL);
+
+ hdp->hd_fn = fn;
+ hdp->hd_arg = arg;
+ if (tail)
+ TAILQ_INSERT_TAIL(head, hdp, hd_list);
+ else
+ TAILQ_INSERT_HEAD(head, hdp, hd_list);
+
+ return (hdp);
+}
+
+void
+hook_disestablish(struct hook_desc_head *head, void *vhook)
+{
+ struct hook_desc *hdp;
+
+#ifdef DIAGNOSTIC
+ for (hdp = TAILQ_FIRST(head); hdp != NULL;
+ hdp = TAILQ_NEXT(hdp, hd_list))
+ if (hdp == vhook)
+ break;
+ if (hdp == NULL)
+ panic("hook_disestablish: hook not established");
+#endif
+ hdp = vhook;
+ TAILQ_REMOVE(head, hdp, hd_list);
+ free(hdp, M_DEVBUF);
+}
+
+/*
+ * Run hooks. Startup hooks are invoked right after scheduler_start but
+ * before root is mounted. Shutdown hooks are invoked immediately before the
+ * system is halted or rebooted, i.e. after file systems unmounted,
+ * after crash dump done, etc.
+ */
+void
+dohooks(struct hook_desc_head *head, int flags)
+{
+ struct hook_desc *hdp;
+
+ if ((flags & HOOK_REMOVE) == 0) {
+ TAILQ_FOREACH(hdp, head, hd_list) {
+ (*hdp->hd_fn)(hdp->hd_arg);
+ }
+ } else {
+ while ((hdp = TAILQ_FIRST(head)) != NULL) {
+ TAILQ_REMOVE(head, hdp, hd_list);
+ (*hdp->hd_fn)(hdp->hd_arg);
+ if ((flags & HOOK_FREE) != 0)
+ free(hdp, M_DEVBUF);
+ }
+ }
+}
diff --git a/sys/contrib/pf/net/pf_table.c b/sys/contrib/pf/net/pf_table.c
index a79ed37..033616e 100644
--- a/sys/contrib/pf/net/pf_table.c
+++ b/sys/contrib/pf/net/pf_table.c
@@ -1,4 +1,5 @@
-/* $OpenBSD: pf_table.c,v 1.68 2006/05/02 10:08:45 dhartmei Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: pf_table.c,v 1.62 2004/12/07 18:02:04 mcbride Exp $ */
/*
* Copyright (c) 2002 Cedric Berger
@@ -30,16 +31,27 @@
*
*/
+#ifdef __FreeBSD__
+#include "opt_inet.h"
+#include "opt_inet6.h"
+#endif
+
#include <sys/param.h>
#include <sys/systm.h>
#include <sys/socket.h>
#include <sys/mbuf.h>
#include <sys/kernel.h>
+#ifdef __FreeBSD__
+#include <sys/malloc.h>
+#endif
#include <net/if.h>
#include <net/route.h>
#include <netinet/in.h>
+#ifndef __FreeBSD__
#include <netinet/ip_ipsp.h>
+#endif
+
#include <net/pfvar.h>
#define ACCEPT_FLAGS(oklist) \
@@ -49,6 +61,43 @@
return (EINVAL); \
} while (0)
+#ifdef __FreeBSD__
+static inline int
+_copyin(const void *uaddr, void *kaddr, size_t len)
+{
+ int r;
+
+ PF_UNLOCK();
+ r = copyin(uaddr, kaddr, len);
+ PF_LOCK();
+
+ return (r);
+}
+
+static inline int
+_copyout(const void *uaddr, void *kaddr, size_t len)
+{
+ int r;
+
+ PF_UNLOCK();
+ r = copyout(uaddr, kaddr, len);
+ PF_LOCK();
+
+ return (r);
+}
+
+#define COPYIN(from, to, size) \
+ ((flags & PFR_FLAG_USERIOCTL) ? \
+ _copyin((from), (to), (size)) : \
+ (bcopy((from), (to), (size)), 0))
+
+#define COPYOUT(from, to, size) \
+ ((flags & PFR_FLAG_USERIOCTL) ? \
+ _copyout((from), (to), (size)) : \
+ (bcopy((from), (to), (size)), 0))
+
+#else
+
#define COPYIN(from, to, size) \
((flags & PFR_FLAG_USERIOCTL) ? \
copyin((from), (to), (size)) : \
@@ -59,6 +108,8 @@
copyout((from), (to), (size)) : \
(bcopy((from), (to), (size)), 0))
+#endif
+
#define FILLIN_SIN(sin, addr) \
do { \
(sin).sin_len = sizeof(sin); \
@@ -123,9 +174,15 @@ struct pfr_walktree {
#define senderr(e) do { rv = (e); goto _bad; } while (0)
+#ifdef __FreeBSD__
+uma_zone_t pfr_ktable_pl;
+uma_zone_t pfr_kentry_pl;
+uma_zone_t pfr_kentry_pl2;
+#else
struct pool pfr_ktable_pl;
struct pool pfr_kentry_pl;
struct pool pfr_kentry_pl2;
+#endif
struct sockaddr_in pfr_sin;
struct sockaddr_in6 pfr_sin6;
union sockaddr_union pfr_mask;
@@ -188,12 +245,14 @@ int pfr_ktable_cnt;
void
pfr_initialize(void)
{
+#ifndef __FreeBSD__
pool_init(&pfr_ktable_pl, sizeof(struct pfr_ktable), 0, 0, 0,
"pfrktable", &pool_allocator_oldnointr);
pool_init(&pfr_kentry_pl, sizeof(struct pfr_kentry), 0, 0, 0,
"pfrkentry", &pool_allocator_oldnointr);
pool_init(&pfr_kentry_pl2, sizeof(struct pfr_kentry), 0, 0, 0,
"pfrkentry2", NULL);
+#endif
pfr_sin.sin_len = sizeof(pfr_sin);
pfr_sin.sin_family = AF_INET;
@@ -221,6 +280,7 @@ pfr_clr_addrs(struct pfr_table *tbl, int *ndel, int flags)
pfr_enqueue_addrs(kt, &workq, ndel, 0);
if (!(flags & PFR_FLAG_DUMMY)) {
+ s = 0;
if (flags & PFR_FLAG_ATOMIC)
s = splsoftnet();
pfr_remove_kentries(kt, &workq);
@@ -243,7 +303,7 @@ pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
struct pfr_kentryworkq workq;
struct pfr_kentry *p, *q;
struct pfr_addr ad;
- int i, rv, s, xadd = 0;
+ int i, rv, s = 0, xadd = 0;
long tzero = time_second;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
@@ -287,9 +347,10 @@ pfr_add_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
xadd++;
}
}
- if (flags & PFR_FLAG_FEEDBACK)
+ if (flags & PFR_FLAG_FEEDBACK) {
if (COPYOUT(&ad, addr+i, sizeof(ad)))
senderr(EFAULT);
+ }
}
pfr_clean_node_mask(tmpkt, &workq);
if (!(flags & PFR_FLAG_DUMMY)) {
@@ -321,7 +382,7 @@ pfr_del_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
struct pfr_kentryworkq workq;
struct pfr_kentry *p;
struct pfr_addr ad;
- int i, rv, s, xdel = 0, log = 1;
+ int i, rv, s = 0, xdel = 0, log = 1;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
@@ -404,19 +465,17 @@ _bad:
int
pfr_set_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int size,
- int *size2, int *nadd, int *ndel, int *nchange, int flags,
- u_int32_t ignore_pfrt_flags)
+ int *size2, int *nadd, int *ndel, int *nchange, int flags)
{
struct pfr_ktable *kt, *tmpkt;
struct pfr_kentryworkq addq, delq, changeq;
struct pfr_kentry *p, *q;
struct pfr_addr ad;
- int i, rv, s, xadd = 0, xdel = 0, xchange = 0;
+ int i, rv, s = 0, xadd = 0, xdel = 0, xchange = 0;
long tzero = time_second;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
- if (pfr_validate_table(tbl, ignore_pfrt_flags, flags &
- PFR_FLAG_USERIOCTL))
+ if (pfr_validate_table(tbl, 0, flags & PFR_FLAG_USERIOCTL))
return (EINVAL);
kt = pfr_lookup_table(tbl);
if (kt == NULL || !(kt->pfrkt_flags & PFR_TFLAG_ACTIVE))
@@ -578,9 +637,18 @@ pfr_get_addrs(struct pfr_table *tbl, struct pfr_addr *addr, int *size,
w.pfrw_addr = addr;
w.pfrw_free = kt->pfrkt_cnt;
w.pfrw_flags = flags;
+#ifdef __FreeBSD__
+ rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
+#else
rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
+#endif
if (!rv)
+#ifdef __FreeBSD__
+ rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree,
+ &w);
+#else
rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
+#endif
if (rv)
return (rv);
@@ -600,7 +668,7 @@ pfr_get_astats(struct pfr_table *tbl, struct pfr_astats *addr, int *size,
struct pfr_ktable *kt;
struct pfr_walktree w;
struct pfr_kentryworkq workq;
- int rv, s;
+ int rv, s = 0;
long tzero = time_second;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC); /* XXX PFR_FLAG_CLSTATS disabled */
@@ -621,9 +689,18 @@ pfr_get_astats(struct pfr_table *tbl, struct pfr_astats *addr, int *size,
w.pfrw_flags = flags;
if (flags & PFR_FLAG_ATOMIC)
s = splsoftnet();
+#ifdef __FreeBSD__
+ rv = kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
+#else
rv = rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
+#endif
if (!rv)
+#ifdef __FreeBSD__
+ rv = kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree,
+ &w);
+#else
rv = rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
+#endif
if (!rv && (flags & PFR_FLAG_CLSTATS)) {
pfr_enqueue_addrs(kt, &workq, NULL, 0);
pfr_clstats_kentries(&workq, tzero, 0);
@@ -650,7 +727,7 @@ pfr_clr_astats(struct pfr_table *tbl, struct pfr_addr *addr, int size,
struct pfr_kentryworkq workq;
struct pfr_kentry *p;
struct pfr_addr ad;
- int i, rv, s, xzero = 0;
+ int i, rv, s = 0, xzero = 0;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_FEEDBACK);
if (pfr_validate_table(tbl, 0, 0))
@@ -738,10 +815,20 @@ pfr_enqueue_addrs(struct pfr_ktable *kt, struct pfr_kentryworkq *workq,
w.pfrw_op = sweep ? PFRW_SWEEP : PFRW_ENQUEUE;
w.pfrw_workq = workq;
if (kt->pfrkt_ip4 != NULL)
+#ifdef __FreeBSD__
+ if (kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree,
+ &w))
+#else
if (rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w))
+#endif
printf("pfr_enqueue_addrs: IPv4 walktree failed.\n");
if (kt->pfrkt_ip6 != NULL)
+#ifdef __FreeBSD__
+ if (kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree,
+ &w))
+#else
if (rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w))
+#endif
printf("pfr_enqueue_addrs: IPv6 walktree failed.\n");
if (naddr != NULL)
*naddr = w.pfrw_cnt;
@@ -754,9 +841,17 @@ pfr_mark_addrs(struct pfr_ktable *kt)
bzero(&w, sizeof(w));
w.pfrw_op = PFRW_MARK;
+#ifdef __FreeBSD__
+ if (kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w))
+#else
if (rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w))
+#endif
printf("pfr_mark_addrs: IPv4 walktree failed.\n");
+#ifdef __FreeBSD__
+ if (kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w))
+#else
if (rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w))
+#endif
printf("pfr_mark_addrs: IPv6 walktree failed.\n");
}
@@ -765,7 +860,7 @@ struct pfr_kentry *
pfr_lookup_addr(struct pfr_ktable *kt, struct pfr_addr *ad, int exact)
{
union sockaddr_union sa, mask;
- struct radix_node_head *head;
+ struct radix_node_head *head = NULL; /* make the compiler happy */
struct pfr_kentry *ke;
int s;
@@ -780,7 +875,13 @@ pfr_lookup_addr(struct pfr_ktable *kt, struct pfr_addr *ad, int exact)
if (ADDR_NETWORK(ad)) {
pfr_prepare_network(&mask, ad->pfra_af, ad->pfra_net);
s = splsoftnet(); /* rn_lookup makes use of globals */
+#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
+ RADIX_NODE_HEAD_LOCK(head);
+#endif
ke = (struct pfr_kentry *)rn_lookup(&sa, &mask, head);
+#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
+ RADIX_NODE_HEAD_UNLOCK(head);
+#endif
splx(s);
if (ke && KENTRY_RNF_ROOT(ke))
ke = NULL;
@@ -968,7 +1069,7 @@ pfr_route_kentry(struct pfr_ktable *kt, struct pfr_kentry *ke)
{
union sockaddr_union mask;
struct radix_node *rn;
- struct radix_node_head *head;
+ struct radix_node_head *head = NULL; /* make the compiler happy */
int s;
bzero(ke->pfrke_node, sizeof(ke->pfrke_node));
@@ -978,11 +1079,17 @@ pfr_route_kentry(struct pfr_ktable *kt, struct pfr_kentry *ke)
head = kt->pfrkt_ip6;
s = splsoftnet();
+#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
+ RADIX_NODE_HEAD_LOCK(head);
+#endif
if (KENTRY_NETWORK(ke)) {
pfr_prepare_network(&mask, ke->pfrke_af, ke->pfrke_net);
rn = rn_addroute(&ke->pfrke_sa, &mask, head, ke->pfrke_node);
} else
rn = rn_addroute(&ke->pfrke_sa, NULL, head, ke->pfrke_node);
+#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
+ RADIX_NODE_HEAD_UNLOCK(head);
+#endif
splx(s);
return (rn == NULL ? -1 : 0);
@@ -993,7 +1100,7 @@ pfr_unroute_kentry(struct pfr_ktable *kt, struct pfr_kentry *ke)
{
union sockaddr_union mask;
struct radix_node *rn;
- struct radix_node_head *head;
+ struct radix_node_head *head = NULL; /* make the compiler happy */
int s;
if (ke->pfrke_af == AF_INET)
@@ -1002,11 +1109,25 @@ pfr_unroute_kentry(struct pfr_ktable *kt, struct pfr_kentry *ke)
head = kt->pfrkt_ip6;
s = splsoftnet();
+#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
+ RADIX_NODE_HEAD_LOCK(head);
+#endif
if (KENTRY_NETWORK(ke)) {
pfr_prepare_network(&mask, ke->pfrke_af, ke->pfrke_net);
+#ifdef __FreeBSD__
+ rn = rn_delete(&ke->pfrke_sa, &mask, head);
+#else
rn = rn_delete(&ke->pfrke_sa, &mask, head, NULL);
+#endif
} else
+#ifdef __FreeBSD__
+ rn = rn_delete(&ke->pfrke_sa, NULL, head);
+#else
rn = rn_delete(&ke->pfrke_sa, NULL, head, NULL);
+#endif
+#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
+ RADIX_NODE_HEAD_UNLOCK(head);
+#endif
splx(s);
if (rn == NULL) {
@@ -1115,7 +1236,7 @@ pfr_clr_tables(struct pfr_table *filter, int *ndel, int flags)
{
struct pfr_ktableworkq workq;
struct pfr_ktable *p;
- int s, xdel = 0;
+ int s = 0, xdel = 0;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ALLRSETS);
if (pfr_fix_anchor(filter->pfrt_anchor))
@@ -1152,7 +1273,7 @@ pfr_add_tables(struct pfr_table *tbl, int size, int *nadd, int flags)
{
struct pfr_ktableworkq addq, changeq;
struct pfr_ktable *p, *q, *r, key;
- int i, rv, s, xadd = 0;
+ int i, rv, s = 0, xadd = 0;
long tzero = time_second;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
@@ -1232,7 +1353,7 @@ pfr_del_tables(struct pfr_table *tbl, int size, int *ndel, int flags)
{
struct pfr_ktableworkq workq;
struct pfr_ktable *p, *q, key;
- int i, s, xdel = 0;
+ int i, s = 0, xdel = 0;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
SLIST_INIT(&workq);
@@ -1306,7 +1427,7 @@ pfr_get_tstats(struct pfr_table *filter, struct pfr_tstats *tbl, int *size,
{
struct pfr_ktable *p;
struct pfr_ktableworkq workq;
- int s, n, nn;
+ int s = 0, n, nn;
long tzero = time_second;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC|PFR_FLAG_ALLRSETS);
@@ -1331,7 +1452,8 @@ pfr_get_tstats(struct pfr_table *filter, struct pfr_tstats *tbl, int *size,
if (!(flags & PFR_FLAG_ATOMIC))
s = splsoftnet();
if (COPYOUT(&p->pfrkt_ts, tbl++, sizeof(*tbl))) {
- splx(s);
+ if (!(flags & PFR_FLAG_ATOMIC))
+ splx(s);
return (EFAULT);
}
if (!(flags & PFR_FLAG_ATOMIC))
@@ -1356,7 +1478,7 @@ pfr_clr_tstats(struct pfr_table *tbl, int size, int *nzero, int flags)
{
struct pfr_ktableworkq workq;
struct pfr_ktable *p, key;
- int i, s, xzero = 0;
+ int i, s = 0, xzero = 0;
long tzero = time_second;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY+PFR_FLAG_ADDRSTOO);
@@ -1390,7 +1512,7 @@ pfr_set_tflags(struct pfr_table *tbl, int size, int setflag, int clrflag,
{
struct pfr_ktableworkq workq;
struct pfr_ktable *p, *q, key;
- int i, s, xchange = 0, xdel = 0;
+ int i, s = 0, xchange = 0, xdel = 0;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
if ((setflag & ~PFR_TFLAG_USRMASK) ||
@@ -1609,7 +1731,7 @@ pfr_ina_commit(struct pfr_table *trs, u_int32_t ticket, int *nadd,
struct pfr_ktable *p, *q;
struct pfr_ktableworkq workq;
struct pf_ruleset *rs;
- int s, xadd = 0, xchange = 0;
+ int s = 0, xadd = 0, xchange = 0;
long tzero = time_second;
ACCEPT_FLAGS(PFR_FLAG_ATOMIC+PFR_FLAG_DUMMY);
@@ -1927,10 +2049,21 @@ pfr_destroy_ktable(struct pfr_ktable *kt, int flushaddr)
pfr_clean_node_mask(kt, &addrq);
pfr_destroy_kentries(&addrq);
}
+#if defined(__FreeBSD__) && (__FreeBSD_version >= 500100)
+ if (kt->pfrkt_ip4 != NULL) {
+ RADIX_NODE_HEAD_DESTROY(kt->pfrkt_ip4);
+ free((caddr_t)kt->pfrkt_ip4, M_RTABLE);
+ }
+ if (kt->pfrkt_ip6 != NULL) {
+ RADIX_NODE_HEAD_DESTROY(kt->pfrkt_ip6);
+ free((caddr_t)kt->pfrkt_ip6, M_RTABLE);
+ }
+#else
if (kt->pfrkt_ip4 != NULL)
free((caddr_t)kt->pfrkt_ip4, M_RTABLE);
if (kt->pfrkt_ip6 != NULL)
free((caddr_t)kt->pfrkt_ip6, M_RTABLE);
+#endif
if (kt->pfrkt_shadow != NULL)
pfr_destroy_ktable(kt->pfrkt_shadow, flushaddr);
if (kt->pfrkt_rs != NULL) {
@@ -2049,7 +2182,7 @@ pfr_attach_table(struct pf_ruleset *rs, char *name)
bzero(&tbl, sizeof(tbl));
strlcpy(tbl.pfrt_name, name, sizeof(tbl.pfrt_name));
if (ac != NULL)
- strlcpy(tbl.pfrt_anchor, ac->path, sizeof(tbl.pfrt_anchor));
+ strlcpy(tbl.pfrt_anchor, ac->name, sizeof(tbl.pfrt_anchor));
kt = pfr_lookup_table(&tbl);
if (kt == NULL) {
kt = pfr_create_ktable(&tbl, time_second, 1);
@@ -2085,12 +2218,13 @@ pfr_detach_table(struct pfr_ktable *kt)
pfr_setflags_ktable(kt, kt->pfrkt_flags&~PFR_TFLAG_REFERENCED);
}
+
int
pfr_pool_get(struct pfr_ktable *kt, int *pidx, struct pf_addr *counter,
struct pf_addr **raddr, struct pf_addr **rmask, sa_family_t af)
{
- struct pfr_kentry *ke, *ke2;
- struct pf_addr *addr;
+ struct pfr_kentry *ke, *ke2 = NULL;
+ struct pf_addr *addr = NULL;
union sockaddr_union mask;
int idx = -1, use_counter = 0;
@@ -2180,12 +2314,20 @@ pfr_kentry_byidx(struct pfr_ktable *kt, int idx, int af)
switch (af) {
#ifdef INET
case AF_INET:
+#ifdef __FreeBSD__
+ kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
+#else
rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
+#endif
return (w.pfrw_kentry);
#endif /* INET */
#ifdef INET6
case AF_INET6:
+#ifdef __FreeBSD__
+ kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
+#else
rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
+#endif
return (w.pfrw_kentry);
#endif /* INET6 */
default:
@@ -2207,8 +2349,16 @@ pfr_dynaddr_update(struct pfr_ktable *kt, struct pfi_dynaddr *dyn)
dyn->pfid_acnt4 = 0;
dyn->pfid_acnt6 = 0;
if (!dyn->pfid_af || dyn->pfid_af == AF_INET)
+#ifdef __FreeBSD__
+ kt->pfrkt_ip4->rnh_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
+#else
rn_walktree(kt->pfrkt_ip4, pfr_walktree, &w);
+#endif
if (!dyn->pfid_af || dyn->pfid_af == AF_INET6)
+#ifdef __FreeBSD__
+ kt->pfrkt_ip6->rnh_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
+#else
rn_walktree(kt->pfrkt_ip6, pfr_walktree, &w);
+#endif
splx(s);
}
diff --git a/sys/contrib/pf/net/pfvar.h b/sys/contrib/pf/net/pfvar.h
index d650f79..f741130 100644
--- a/sys/contrib/pf/net/pfvar.h
+++ b/sys/contrib/pf/net/pfvar.h
@@ -1,4 +1,5 @@
-/* $OpenBSD: pfvar.h,v 1.244 2007/02/23 21:31:51 deraadt Exp $ */
+/* $FreeBSD$ */
+/* $OpenBSD: pfvar.h,v 1.213 2005/03/03 07:13:39 dhartmei Exp $ */
/*
* Copyright (c) 2001 Daniel Hartmeier
@@ -37,26 +38,30 @@
#include <sys/types.h>
#include <sys/queue.h>
#include <sys/tree.h>
-#include <sys/rwlock.h>
#include <net/radix.h>
#include <net/route.h>
+#ifdef __FreeBSD__
+#include <net/if_clone.h>
+#include <vm/uma.h>
+#else
#include <netinet/ip_ipsp.h>
+#endif
+
+#ifdef __FreeBSD__
+#include <netinet/in.h>
+#endif
+
#include <netinet/tcp_fsm.h>
struct ip;
-struct ip6_hdr;
+#ifdef __FreeBSD__
+struct inpcb;
+#endif
#define PF_TCPS_PROXY_SRC ((TCP_NSTATES)+0)
#define PF_TCPS_PROXY_DST ((TCP_NSTATES)+1)
-#define PF_MD5_DIGEST_LENGTH 16
-#ifdef MD5_DIGEST_LENGTH
-#if PF_MD5_DIGEST_LENGTH != MD5_DIGEST_LENGTH
-#error
-#endif
-#endif
-
enum { PF_INOUT, PF_IN, PF_OUT };
enum { PF_LAN_EXT, PF_EXT_GWY, PF_ID };
enum { PF_PASS, PF_DROP, PF_SCRUB, PF_NOSCRUB, PF_NAT, PF_NONAT,
@@ -69,8 +74,6 @@ enum { PF_DEBUG_NONE, PF_DEBUG_URGENT, PF_DEBUG_MISC, PF_DEBUG_NOISY };
enum { PF_CHANGE_NONE, PF_CHANGE_ADD_HEAD, PF_CHANGE_ADD_TAIL,
PF_CHANGE_ADD_BEFORE, PF_CHANGE_ADD_AFTER,
PF_CHANGE_REMOVE, PF_CHANGE_GET_TICKET };
-enum { PF_GET_NONE, PF_GET_CLR_CNTR };
-
/*
* Note about PFTM_*: real indices into pf_rule.timeout[] come before
* PFTM_MAX, special cases afterwards. See pf_state_expires().
@@ -82,8 +85,7 @@ enum { PFTM_TCP_FIRST_PACKET, PFTM_TCP_OPENING, PFTM_TCP_ESTABLISHED,
PFTM_OTHER_FIRST_PACKET, PFTM_OTHER_SINGLE,
PFTM_OTHER_MULTIPLE, PFTM_FRAG, PFTM_INTERVAL,
PFTM_ADAPTIVE_START, PFTM_ADAPTIVE_END, PFTM_SRC_NODE,
- PFTM_TS_DIFF, PFTM_MAX, PFTM_PURGE, PFTM_UNLINKED,
- PFTM_UNTIL_PACKET };
+ PFTM_TS_DIFF, PFTM_MAX, PFTM_PURGE, PFTM_UNTIL_PACKET };
/* PFTM default values */
#define PFTM_TCP_FIRST_PACKET_VAL 120 /* First TCP packet */
@@ -106,22 +108,17 @@ enum { PFTM_TCP_FIRST_PACKET, PFTM_TCP_OPENING, PFTM_TCP_ESTABLISHED,
#define PFTM_TS_DIFF_VAL 30 /* Allowed TS diff */
enum { PF_NOPFROUTE, PF_FASTROUTE, PF_ROUTETO, PF_DUPTO, PF_REPLYTO };
-enum { PF_LIMIT_STATES, PF_LIMIT_SRC_NODES, PF_LIMIT_FRAGS,
- PF_LIMIT_TABLES, PF_LIMIT_TABLE_ENTRIES, PF_LIMIT_MAX };
+enum { PF_LIMIT_STATES, PF_LIMIT_SRC_NODES, PF_LIMIT_FRAGS, PF_LIMIT_MAX };
#define PF_POOL_IDMASK 0x0f
enum { PF_POOL_NONE, PF_POOL_BITMASK, PF_POOL_RANDOM,
PF_POOL_SRCHASH, PF_POOL_ROUNDROBIN };
enum { PF_ADDR_ADDRMASK, PF_ADDR_NOROUTE, PF_ADDR_DYNIFTL,
- PF_ADDR_TABLE, PF_ADDR_RTLABEL, PF_ADDR_URPFFAILED };
+ PF_ADDR_TABLE, PF_ADDR_RTLABEL };
#define PF_POOL_TYPEMASK 0x0f
#define PF_POOL_STICKYADDR 0x20
#define PF_WSCALE_FLAG 0x80
#define PF_WSCALE_MASK 0x0f
-#define PF_LOG 0x01
-#define PF_LOG_ALL 0x02
-#define PF_LOG_SOCKET_LOOKUP 0x04
-
struct pf_addr {
union {
struct in_addr v4;
@@ -153,6 +150,9 @@ struct pf_addr_wrap {
} a;
char ifname[IFNAMSIZ];
char tblname[PF_TABLE_NAME_SIZE];
+#ifdef __FreeBSD__
+#define RTLABEL_LEN 32
+#endif
char rtlabelname[RTLABEL_LEN];
u_int32_t rtlabel;
} v;
@@ -169,25 +169,100 @@ struct pf_addr_wrap {
#ifdef _KERNEL
struct pfi_dynaddr {
- TAILQ_ENTRY(pfi_dynaddr) entry;
- struct pf_addr pfid_addr4;
- struct pf_addr pfid_mask4;
- struct pf_addr pfid_addr6;
- struct pf_addr pfid_mask6;
- struct pfr_ktable *pfid_kt;
- struct pfi_kif *pfid_kif;
- void *pfid_hook_cookie;
- int pfid_net; /* mask or 128 */
- int pfid_acnt4; /* address count IPv4 */
- int pfid_acnt6; /* address count IPv6 */
- sa_family_t pfid_af; /* rule af */
- u_int8_t pfid_iflags; /* PFI_AFLAG_* */
+ struct pf_addr pfid_addr4;
+ struct pf_addr pfid_mask4;
+ struct pf_addr pfid_addr6;
+ struct pf_addr pfid_mask6;
+ struct pfr_ktable *pfid_kt;
+ struct pfi_kif *pfid_kif;
+ void *pfid_hook_cookie;
+ int pfid_net; /* optional mask, or 128 */
+ int pfid_acnt4; /* address count, IPv4 */
+ int pfid_acnt6; /* address count, IPv6 */
+ sa_family_t pfid_af; /* rule address family */
+ u_int8_t pfid_iflags; /* PFI_AFLAG_* */
};
/*
* Address manipulation macros
*/
+#ifdef __FreeBSD__
+#define splsoftnet() splnet()
+
+#define HTONL(x) (x) = htonl((__uint32_t)(x))
+#define HTONS(x) (x) = htons((__uint16_t)(x))
+#define NTOHL(x) (x) = ntohl((__uint32_t)(x))
+#define NTOHS(x) (x) = ntohs((__uint16_t)(x))
+
+#define PF_NAME "pf"
+
+#define PR_NOWAIT M_NOWAIT
+#define pool_get(p, f) uma_zalloc(*(p), (f))
+#define pool_put(p, o) uma_zfree(*(p), (o))
+
+#define UMA_CREATE(var, type, desc) \
+ var = uma_zcreate(desc, sizeof(type), \
+ NULL, NULL, NULL, NULL, UMA_ALIGN_PTR, 0); \
+ if (var == NULL) break
+#define UMA_DESTROY(var) \
+ if(var) uma_zdestroy(var)
+
+extern struct mtx pf_task_mtx;
+
+#define PF_ASSERT(h) mtx_assert(&pf_task_mtx, (h))
+
+#define PF_LOCK() do { \
+ PF_ASSERT(MA_NOTOWNED); \
+ mtx_lock(&pf_task_mtx); \
+} while(0)
+#define PF_UNLOCK() do { \
+ PF_ASSERT(MA_OWNED); \
+ mtx_unlock(&pf_task_mtx); \
+} while(0)
+
+#define PF_COPYIN(uaddr, kaddr, len, r) do { \
+ PF_UNLOCK(); \
+ r = copyin((uaddr), (kaddr), (len)); \
+ PF_LOCK(); \
+} while(0)
+
+#define PF_COPYOUT(kaddr, uaddr, len, r) do { \
+ PF_UNLOCK(); \
+ r = copyout((kaddr), (uaddr), (len)); \
+ PF_LOCK(); \
+} while(0)
+
+extern void init_pf_mutex(void);
+extern void destroy_pf_mutex(void);
+
+#define PF_MODVER 1
+#define PFLOG_MODVER 1
+#define PFSYNC_MODVER 1
+
+#define PFLOG_MINVER 1
+#define PFLOG_PREFVER PFLOG_MODVER
+#define PFLOG_MAXVER 1
+#define PFSYNC_MINVER 1
+#define PFSYNC_PREFVER PFSYNC_MODVER
+#define PFSYNC_MAXVER 1
+
+/* prototyped for pf_subr.c */
+struct hook_desc {
+ TAILQ_ENTRY(hook_desc) hd_list;
+ void (*hd_fn)(void *);
+ void *hd_arg;
+};
+TAILQ_HEAD(hook_desc_head, hook_desc);
+
+void *hook_establish(struct hook_desc_head *, int, void (*)(void *), void *);
+void hook_disestablish(struct hook_desc_head *, void *);
+void dohooks(struct hook_desc_head *, int);
+
+#define HOOK_REMOVE 0x01
+#define HOOK_FREE 0x02
+#endif /* __FreeBSD__ */
+
#ifdef INET
#ifndef INET6
#define PF_INET_ONLY
@@ -317,26 +392,23 @@ struct pfi_dynaddr {
#endif /* PF_INET6_ONLY */
#endif /* PF_INET_INET6 */
-#define PF_MISMATCHAW(aw, x, af, neg, ifp) \
- ( \
- (((aw)->type == PF_ADDR_NOROUTE && \
- pf_routable((x), (af), NULL)) || \
- (((aw)->type == PF_ADDR_URPFFAILED && (ifp) != NULL && \
- pf_routable((x), (af), (ifp))) || \
- ((aw)->type == PF_ADDR_RTLABEL && \
- !pf_rtlabel_match((x), (af), (aw))) || \
- ((aw)->type == PF_ADDR_TABLE && \
- !pfr_match_addr((aw)->p.tbl, (x), (af))) || \
- ((aw)->type == PF_ADDR_DYNIFTL && \
- !pfi_match_addr((aw)->p.dyn, (x), (af))) || \
- ((aw)->type == PF_ADDR_ADDRMASK && \
- !PF_AZERO(&(aw)->v.a.mask, (af)) && \
- !PF_MATCHA(0, &(aw)->v.a.addr, \
- &(aw)->v.a.mask, (x), (af))))) != \
- (neg) \
+#define PF_MISMATCHAW(aw, x, af, neg) \
+ ( \
+ (((aw)->type == PF_ADDR_NOROUTE && \
+ pf_routable((x), (af))) || \
+ ((aw)->type == PF_ADDR_RTLABEL && \
+ !pf_rtlabel_match((x), (af), (aw))) || \
+ ((aw)->type == PF_ADDR_TABLE && \
+ !pfr_match_addr((aw)->p.tbl, (x), (af))) || \
+ ((aw)->type == PF_ADDR_DYNIFTL && \
+ !pfi_match_addr((aw)->p.dyn, (x), (af))) || \
+ ((aw)->type == PF_ADDR_ADDRMASK && \
+ !PF_AZERO(&(aw)->v.a.mask, (af)) && \
+ !PF_MATCHA(0, &(aw)->v.a.addr, \
+ &(aw)->v.a.mask, (x), (af)))) != \
+ (neg) \
)
-
struct pf_rule_uid {
uid_t uid[2];
u_int8_t op;
@@ -454,7 +526,6 @@ struct pf_os_fingerprint {
#define PF_OSFP_MSS_DC 0x0800 /* TCP MSS dont-care */
#define PF_OSFP_DF 0x1000 /* IPv4 don't fragment bit */
#define PF_OSFP_TS0 0x2000 /* Zero timestamp */
-#define PF_OSFP_INET6 0x4000 /* IPv6 */
u_int8_t fp_optcnt; /* TCP option count */
u_int8_t fp_wscale; /* TCP window scaling */
u_int8_t fp_ttl; /* IPv4 TTL */
@@ -510,11 +581,11 @@ struct pf_rule {
union pf_rule_ptr skip[PF_SKIP_COUNT];
#define PF_RULE_LABEL_SIZE 64
char label[PF_RULE_LABEL_SIZE];
-#define PF_QNAME_SIZE 64
+#define PF_QNAME_SIZE 16
char ifname[IFNAMSIZ];
char qname[PF_QNAME_SIZE];
char pqname[PF_QNAME_SIZE];
-#define PF_TAG_NAME_SIZE 64
+#define PF_TAG_NAME_SIZE 16
char tagname[PF_TAG_NAME_SIZE];
char match_tagname[PF_TAG_NAME_SIZE];
@@ -524,8 +595,8 @@ struct pf_rule {
struct pf_pool rpool;
u_int64_t evaluations;
- u_int64_t packets[2];
- u_int64_t bytes[2];
+ u_int64_t packets;
+ u_int64_t bytes;
struct pfi_kif *kif;
struct pf_anchor *anchor;
@@ -533,7 +604,6 @@ struct pf_rule {
pf_osfp_t os_fingerprint;
- int rtableid;
u_int32_t timeout[PFTM_MAX];
u_int32_t states;
u_int32_t max_states;
@@ -550,8 +620,6 @@ struct pf_rule {
u_int32_t rt_listid;
u_int32_t nr;
u_int32_t prob;
- uid_t cuid;
- pid_t cpid;
u_int16_t return_icmp;
u_int16_t return_icmp6;
@@ -566,7 +634,6 @@ struct pf_rule {
u_int8_t action;
u_int8_t direction;
u_int8_t log;
- u_int8_t logif;
u_int8_t quick;
u_int8_t ifnot;
u_int8_t match_tag_not;
@@ -614,10 +681,9 @@ struct pf_rule {
/* rule flags again */
#define PFRULE_IFBOUND 0x00010000 /* if-bound */
+#define PFRULE_GRBOUND 0x00020000 /* group-bound */
#define PFSTATE_HIWAT 10000 /* default state table size */
-#define PFSTATE_ADAPT_START 6000 /* default adaptive timeout start */
-#define PFSTATE_ADAPT_END 12000 /* default adaptive timeout end */
struct pf_threshold {
@@ -635,8 +701,8 @@ struct pf_src_node {
struct pf_addr raddr;
union pf_rule_ptr rule;
struct pfi_kif *kif;
- u_int64_t bytes[2];
- u_int64_t packets[2];
+ u_int32_t bytes;
+ u_int32_t packets;
u_int32_t states;
u_int32_t conn;
struct pf_threshold conn_rate;
@@ -678,53 +744,26 @@ struct pf_state_peer {
u_int8_t state; /* active state level */
u_int8_t wscale; /* window scaling factor */
u_int16_t mss; /* Maximum segment size option */
- u_int8_t tcp_est; /* Did we reach TCPS_ESTABLISHED */
struct pf_state_scrub *scrub; /* state is scrubbed */
- u_int8_t pad[3];
};
TAILQ_HEAD(pf_state_queue, pf_state);
-/* keep synced with struct pf_state, used in RB_FIND */
-struct pf_state_cmp {
- u_int64_t id;
- u_int32_t creatorid;
- struct pf_state_host lan;
- struct pf_state_host gwy;
- struct pf_state_host ext;
- sa_family_t af;
- u_int8_t proto;
- u_int8_t direction;
- u_int8_t pad;
-};
-
struct pf_state {
u_int64_t id;
- u_int32_t creatorid;
- struct pf_state_host lan;
- struct pf_state_host gwy;
- struct pf_state_host ext;
- sa_family_t af;
- u_int8_t proto;
- u_int8_t direction;
- u_int8_t pad;
- u_int8_t log;
- u_int8_t allow_opts;
- u_int8_t timeout;
- u_int8_t sync_flags;
-#define PFSTATE_NOSYNC 0x01
-#define PFSTATE_FROMSYNC 0x02
-#define PFSTATE_STALE 0x04
union {
struct {
RB_ENTRY(pf_state) entry_lan_ext;
RB_ENTRY(pf_state) entry_ext_gwy;
RB_ENTRY(pf_state) entry_id;
- TAILQ_ENTRY(pf_state) entry_list;
+ TAILQ_ENTRY(pf_state) entry_updates;
struct pfi_kif *kif;
} s;
char ifname[IFNAMSIZ];
} u;
+ struct pf_state_host lan;
+ struct pf_state_host gwy;
+ struct pf_state_host ext;
struct pf_state_peer src;
struct pf_state_peer dst;
union pf_rule_ptr rule;
@@ -734,12 +773,30 @@ struct pf_state {
struct pfi_kif *rt_kif;
struct pf_src_node *src_node;
struct pf_src_node *nat_src_node;
- u_int64_t packets[2];
- u_int64_t bytes[2];
u_int32_t creation;
u_int32_t expire;
u_int32_t pfsync_time;
+ u_int32_t packets[2];
+ u_int32_t bytes[2];
+ u_int32_t creatorid;
u_int16_t tag;
+ sa_family_t af;
+ u_int8_t proto;
+ u_int8_t direction;
+ u_int8_t log;
+ u_int8_t allow_opts;
+ u_int8_t timeout;
+ u_int8_t sync_flags;
+#define PFSTATE_NOSYNC 0x01
+#define PFSTATE_FROMSYNC 0x02
+#define PFSTATE_STALE 0x04
+#ifdef __FreeBSD__
+ u_int8_t local_flags;
+#define PFSTATE_EXPIRING 0x01
+#define PFSTATE_SRC_CONN 0x02
+#else
+ u_int8_t pad;
+#endif
};
TAILQ_HEAD(pf_rulequeue, pf_rule);
@@ -751,8 +808,6 @@ struct pf_ruleset {
struct pf_rulequeue queues[2];
struct {
struct pf_rulequeue *ptr;
- struct pf_rule **ptr_array;
- u_int32_t rcount;
u_int32_t ticket;
int open;
} active, inactive;
@@ -774,7 +829,6 @@ struct pf_anchor {
char path[MAXPATHLEN];
struct pf_ruleset ruleset;
int refcnt; /* anchor rules */
- int match;
};
RB_PROTOTYPE(pf_anchor_global, pf_anchor, entry_global, pf_anchor_compare);
RB_PROTOTYPE(pf_anchor_node, pf_anchor, entry_node, pf_anchor_compare);
@@ -841,6 +895,15 @@ struct pfr_tstats {
#define pfrts_name pfrts_t.pfrt_name
#define pfrts_flags pfrts_t.pfrt_flags
+#ifndef _SOCKADDR_UNION_DEFINED
+#define _SOCKADDR_UNION_DEFINED
+union sockaddr_union {
+ struct sockaddr sa;
+ struct sockaddr_in sin;
+ struct sockaddr_in6 sin6;
+};
+#endif /* _SOCKADDR_UNION_DEFINED */
+
SLIST_HEAD(pfr_kentryworkq, pfr_kentry);
struct pfr_kentry {
struct radix_node pfrke_node[2];
@@ -891,47 +954,56 @@ RB_HEAD(pf_state_tree_ext_gwy, pf_state);
RB_PROTOTYPE(pf_state_tree_ext_gwy, pf_state,
u.s.entry_ext_gwy, pf_state_compare_ext_gwy);
-TAILQ_HEAD(pfi_statehead, pfi_kif);
-RB_HEAD(pfi_ifhead, pfi_kif);
-
-/* keep synced with pfi_kif, used in RB_FIND */
-struct pfi_kif_cmp {
- char pfik_name[IFNAMSIZ];
+struct pfi_if {
+ char pfif_name[IFNAMSIZ];
+ u_int64_t pfif_packets[2][2][2];
+ u_int64_t pfif_bytes[2][2][2];
+ u_int64_t pfif_addcnt;
+ u_int64_t pfif_delcnt;
+ long pfif_tzero;
+ int pfif_states;
+ int pfif_rules;
+ int pfif_flags;
};
+TAILQ_HEAD(pfi_grouphead, pfi_kif);
+TAILQ_HEAD(pfi_statehead, pfi_kif);
+RB_HEAD(pfi_ifhead, pfi_kif);
struct pfi_kif {
- char pfik_name[IFNAMSIZ];
+ struct pfi_if pfik_if;
RB_ENTRY(pfi_kif) pfik_tree;
- u_int64_t pfik_packets[2][2][2];
- u_int64_t pfik_bytes[2][2][2];
- u_int32_t pfik_tzero;
- int pfik_flags;
struct pf_state_tree_lan_ext pfik_lan_ext;
struct pf_state_tree_ext_gwy pfik_ext_gwy;
+ struct pfi_grouphead pfik_grouphead;
+ TAILQ_ENTRY(pfi_kif) pfik_instances;
TAILQ_ENTRY(pfi_kif) pfik_w_states;
+ struct hook_desc_head *pfik_ah_head;
void *pfik_ah_cookie;
+ struct pfi_kif *pfik_parent;
struct ifnet *pfik_ifp;
- struct ifg_group *pfik_group;
int pfik_states;
int pfik_rules;
- TAILQ_HEAD(, pfi_dynaddr) pfik_dynaddrs;
};
-
-enum pfi_kif_refs {
- PFI_KIF_REF_NONE,
- PFI_KIF_REF_STATE,
- PFI_KIF_REF_RULE
-};
-
+#define pfik_name pfik_if.pfif_name
+#define pfik_packets pfik_if.pfif_packets
+#define pfik_bytes pfik_if.pfif_bytes
+#define pfik_tzero pfik_if.pfif_tzero
+#define pfik_flags pfik_if.pfif_flags
+#define pfik_addcnt pfik_if.pfif_addcnt
+#define pfik_delcnt pfik_if.pfif_delcnt
+#define pfik_states pfik_if.pfif_states
+#define pfik_rules pfik_if.pfif_rules
+
+#define PFI_IFLAG_GROUP 0x0001 /* group of interfaces */
+#define PFI_IFLAG_INSTANCE 0x0002 /* single instance */
+#define PFI_IFLAG_CLONABLE 0x0010 /* clonable group */
+#define PFI_IFLAG_DYNAMIC 0x0020 /* dynamic group */
+#define PFI_IFLAG_ATTACHED 0x0040 /* interface attached */
#define PFI_IFLAG_SKIP 0x0100 /* skip filtering on interface */
+#define PFI_IFLAG_SETABLE_MASK 0x0100 /* setable via DIOC{SET,CLR}IFFLAG */
+#define PFI_IFLAG_PLACEHOLDER 0x8000 /* placeholder group/interface */
struct pf_pdesc {
- struct {
- int done;
- uid_t uid;
- gid_t gid;
- pid_t pid;
- } lookup;
u_int64_t tot_len; /* Make Mickey money */
union {
struct tcphdr *tcp;
@@ -949,7 +1021,6 @@ struct pf_pdesc {
struct pf_addr *dst;
struct ether_header
*eh;
- struct pf_mtag *pf_mtag;
u_int16_t *ip_sum;
u_int32_t p_len; /* total length of payload */
u_int16_t flags; /* Let SCRUB trigger behavior in
@@ -1090,7 +1161,6 @@ struct pf_status {
u_int32_t debug;
u_int32_t hostid;
char ifname[IFNAMSIZ];
- u_int8_t pf_chksum[PF_MD5_DIGEST_LENGTH];
};
struct cbq_opts {
@@ -1153,20 +1223,6 @@ struct pf_altq {
u_int32_t qid; /* return value */
};
-#define PF_TAG_GENERATED 0x01
-#define PF_TAG_FRAGCACHE 0x02
-#define PF_TAG_TRANSLATE_LOCALHOST 0x04
-
-struct pf_mtag {
- void *hdr; /* saved hdr pos in mbuf, for ECN */
- u_int rtableid; /* alternate routing table id */
- u_int32_t qid; /* queue id */
- u_int16_t tag; /* tag id */
- u_int8_t flags;
- u_int8_t routed;
- sa_family_t af; /* for ECN */
-};
-
struct pf_tag {
u_int16_t tag; /* tag id */
};
@@ -1183,10 +1239,6 @@ struct pf_tagname {
#define PFFRAG_FRCENT_HIWAT 50000 /* Number of fragment cache entries */
#define PFFRAG_FRCACHE_HIWAT 10000 /* Number of fragment descriptors */
-#define PFR_KTABLE_HIWAT 1000 /* Number of tables */
-#define PFR_KENTRY_HIWAT 200000 /* Number of table entries */
-#define PFR_KENTRY_HIWAT_SMALL 100000 /* Number of table entries (tiny hosts) */
-
/*
* ioctl parameter structures
*/
@@ -1232,13 +1284,6 @@ struct pfioc_state {
struct pf_state state;
};
-struct pfioc_src_node_kill {
- /* XXX returns the number of src nodes killed in psnk_af */
- sa_family_t psnk_af;
- struct pf_rule_addr psnk_src;
- struct pf_rule_addr psnk_dst;
-};
-
struct pfioc_state_kill {
/* XXX returns the number of states killed in psk_af */
sa_family_t psk_af;
@@ -1346,6 +1391,11 @@ struct pfioc_table {
#define pfrio_setflag pfrio_size2
#define pfrio_clrflag pfrio_nadd
+
+#define PFI_FLAG_GROUP 0x0001 /* gets groups of interfaces */
+#define PFI_FLAG_INSTANCE 0x0002 /* gets single interfaces */
+#define PFI_FLAG_ALLMASK 0x0003
+
struct pfioc_iface {
char pfiio_name[IFNAMSIZ];
void *pfiio_buffer;
@@ -1424,9 +1474,16 @@ struct pfioc_iface {
#define DIOCCLRSRCNODES _IO('D', 85)
#define DIOCSETHOSTID _IOWR('D', 86, u_int32_t)
#define DIOCIGETIFACES _IOWR('D', 87, struct pfioc_iface)
+#define DIOCICLRISTATS _IOWR('D', 88, struct pfioc_iface)
#define DIOCSETIFFLAG _IOWR('D', 89, struct pfioc_iface)
#define DIOCCLRIFFLAG _IOWR('D', 90, struct pfioc_iface)
-#define DIOCKILLSRCNODES _IOWR('D', 91, struct pfioc_src_node_kill)
+#ifdef __FreeBSD__
+struct pf_ifspeed {
+ char ifname[IFNAMSIZ];
+ u_int32_t baudrate;
+};
+#define DIOCGIFSPEED _IOWR('D', 91, struct pf_ifspeed)
+#endif
#ifdef _KERNEL
RB_HEAD(pf_src_tree, pf_src_node);
@@ -1437,13 +1494,16 @@ RB_HEAD(pf_state_tree_id, pf_state);
RB_PROTOTYPE(pf_state_tree_id, pf_state,
entry_id, pf_state_compare_id);
extern struct pf_state_tree_id tree_id;
-extern struct pf_state_queue state_list;
+extern struct pf_state_queue state_updates;
+extern struct pf_anchor_global pf_anchors;
+extern struct pf_ruleset pf_main_ruleset;
TAILQ_HEAD(pf_poolqueue, pf_pool);
extern struct pf_poolqueue pf_pools[2];
TAILQ_HEAD(pf_altqqueue, pf_altq);
extern struct pf_altqqueue pf_altqs[2];
extern struct pf_palist pf_pabuf;
+extern struct pfi_kif **pfi_index2kif;
extern u_int32_t ticket_altqs_active;
extern u_int32_t ticket_altqs_inactive;
@@ -1458,25 +1518,38 @@ extern int pf_tbladdr_setup(struct pf_ruleset *,
extern void pf_tbladdr_remove(struct pf_addr_wrap *);
extern void pf_tbladdr_copyout(struct pf_addr_wrap *);
extern void pf_calc_skip_steps(struct pf_rulequeue *);
+#ifdef __FreeBSD__
+extern uma_zone_t pf_src_tree_pl, pf_rule_pl;
+extern uma_zone_t pf_state_pl, pf_altq_pl, pf_pooladdr_pl;
+extern uma_zone_t pfr_ktable_pl, pfr_kentry_pl, pfr_kentry_pl2;
+extern uma_zone_t pf_cache_pl, pf_cent_pl;
+extern uma_zone_t pf_state_scrub_pl;
+extern uma_zone_t pfi_addr_pl;
+#else
extern struct pool pf_src_tree_pl, pf_rule_pl;
extern struct pool pf_state_pl, pf_altq_pl, pf_pooladdr_pl;
extern struct pool pf_state_scrub_pl;
-extern void pf_purge_thread(void *);
-extern void pf_purge_expired_src_nodes(int);
-extern void pf_purge_expired_states(u_int32_t);
-extern void pf_unlink_state(struct pf_state *);
-extern void pf_free_state(struct pf_state *);
+#endif
+extern void pf_purge_timeout(void *);
+extern void pf_purge_expired_src_nodes(void);
+extern void pf_purge_expired_states(void);
+extern void pf_purge_expired_state(struct pf_state *);
extern int pf_insert_state(struct pfi_kif *,
struct pf_state *);
extern int pf_insert_src_node(struct pf_src_node **,
struct pf_rule *, struct pf_addr *,
sa_family_t);
void pf_src_tree_remove_state(struct pf_state *);
-extern struct pf_state *pf_find_state_byid(struct pf_state_cmp *);
-extern struct pf_state *pf_find_state_all(struct pf_state_cmp *key,
+extern struct pf_state *pf_find_state_byid(struct pf_state *);
+extern struct pf_state *pf_find_state_all(struct pf_state *key,
u_int8_t tree, int *more);
extern void pf_print_state(struct pf_state *);
extern void pf_print_flags(u_int8_t);
+extern struct pf_anchor *pf_find_anchor(const char *);
+extern struct pf_ruleset *pf_find_ruleset(const char *);
+extern struct pf_ruleset *pf_find_or_create_ruleset(const char *);
+extern void pf_remove_if_empty_ruleset(
+ struct pf_ruleset *);
extern u_int16_t pf_cksum_fixup(u_int16_t, u_int16_t, u_int16_t,
u_int8_t);
@@ -1488,11 +1561,21 @@ void pf_rm_rule(struct pf_rulequeue *,
struct pf_rule *);
#ifdef INET
+#ifdef __FreeBSD__
+int pf_test(int, struct ifnet *, struct mbuf **, struct ether_header *,
+ struct inpcb *);
+#else
int pf_test(int, struct ifnet *, struct mbuf **, struct ether_header *);
+#endif
#endif /* INET */
#ifdef INET6
+#ifdef __FreeBSD__
+int pf_test6(int, struct ifnet *, struct mbuf **, struct ether_header *,
+ struct inpcb *);
+#else
int pf_test6(int, struct ifnet *, struct mbuf **, struct ether_header *);
+#endif
void pf_poolmask(struct pf_addr *, struct pf_addr*,
struct pf_addr *, struct pf_addr *, u_int8_t);
void pf_addr_inc(struct pf_addr *, sa_family_t);
@@ -1502,8 +1585,7 @@ void *pf_pull_hdr(struct mbuf *, int, void *, int, u_short *, u_short *,
sa_family_t);
void pf_change_a(void *, u_int16_t *, u_int32_t, u_int8_t);
int pflog_packet(struct pfi_kif *, struct mbuf *, sa_family_t, u_int8_t,
- u_int8_t, struct pf_rule *, struct pf_rule *, struct pf_ruleset *,
- struct pf_pdesc *);
+ u_int8_t, struct pf_rule *, struct pf_rule *, struct pf_ruleset *);
int pf_match_addr(u_int8_t, struct pf_addr *, struct pf_addr *,
struct pf_addr *, sa_family_t);
int pf_match(u_int8_t, u_int32_t, u_int32_t, u_int32_t);
@@ -1527,9 +1609,8 @@ int pf_normalize_tcp_stateful(struct mbuf *, int, struct pf_pdesc *,
u_int32_t
pf_state_expires(const struct pf_state *);
void pf_purge_expired_fragments(void);
-int pf_routable(struct pf_addr *addr, sa_family_t af, struct pfi_kif *);
+int pf_routable(struct pf_addr *addr, sa_family_t af);
int pf_rtlabel_match(struct pf_addr *, sa_family_t, struct pf_addr_wrap *);
-int pf_socket_lookup(int, struct pf_pdesc *);
void pfr_initialize(void);
int pfr_match_addr(struct pfr_ktable *, struct pf_addr *, sa_family_t);
void pfr_update_stats(struct pfr_ktable *, struct pf_addr *, sa_family_t,
@@ -1554,7 +1635,7 @@ int pfr_add_addrs(struct pfr_table *, struct pfr_addr *, int, int *,
int pfr_del_addrs(struct pfr_table *, struct pfr_addr *, int, int *,
int);
int pfr_set_addrs(struct pfr_table *, struct pfr_addr *, int, int *,
- int *, int *, int *, int, u_int32_t);
+ int *, int *, int *, int);
int pfr_get_addrs(struct pfr_table *, struct pfr_addr *, int *, int);
int pfr_get_astats(struct pfr_table *, struct pfr_astats *, int *, int);
int pfr_clr_astats(struct pfr_table *, struct pfr_addr *, int, int *,
@@ -1567,44 +1648,49 @@ int pfr_ina_commit(struct pfr_table *, u_int32_t, int *, int *, int);
int pfr_ina_define(struct pfr_table *, struct pfr_addr *, int, int *,
int *, u_int32_t, int);
-extern struct pfi_statehead pfi_statehead;
-extern struct pfi_kif *pfi_all;
-
void pfi_initialize(void);
-struct pfi_kif *pfi_kif_get(const char *);
-void pfi_kif_ref(struct pfi_kif *, enum pfi_kif_refs);
-void pfi_kif_unref(struct pfi_kif *, enum pfi_kif_refs);
-int pfi_kif_match(struct pfi_kif *, struct pfi_kif *);
+#ifdef __FreeBSD__
+void pfi_cleanup(void);
+#endif
+void pfi_attach_clone(struct if_clone *);
void pfi_attach_ifnet(struct ifnet *);
void pfi_detach_ifnet(struct ifnet *);
-void pfi_attach_ifgroup(struct ifg_group *);
-void pfi_detach_ifgroup(struct ifg_group *);
-void pfi_group_change(const char *);
-int pfi_match_addr(struct pfi_dynaddr *, struct pf_addr *,
- sa_family_t);
+struct pfi_kif *pfi_lookup_create(const char *);
+struct pfi_kif *pfi_lookup_if(const char *);
+int pfi_maybe_destroy(struct pfi_kif *);
+struct pfi_kif *pfi_attach_rule(const char *);
+void pfi_detach_rule(struct pfi_kif *);
+void pfi_attach_state(struct pfi_kif *);
+void pfi_detach_state(struct pfi_kif *);
int pfi_dynaddr_setup(struct pf_addr_wrap *, sa_family_t);
-void pfi_dynaddr_remove(struct pf_addr_wrap *);
void pfi_dynaddr_copyout(struct pf_addr_wrap *);
+void pfi_dynaddr_remove(struct pf_addr_wrap *);
void pfi_fill_oldstatus(struct pf_status *);
-int pfi_clr_istats(const char *);
-int pfi_get_ifaces(const char *, struct pfi_kif *, int *);
+int pfi_clr_istats(const char *, int *, int);
+int pfi_get_ifaces(const char *, struct pfi_if *, int *, int);
int pfi_set_flags(const char *, int);
int pfi_clear_flags(const char *, int);
+int pfi_match_addr(struct pfi_dynaddr *, struct pf_addr *,
+ sa_family_t);
-u_int16_t pf_tagname2tag(char *);
-void pf_tag2tagname(u_int16_t, char *);
-void pf_tag_ref(u_int16_t);
-void pf_tag_unref(u_int16_t);
-int pf_tag_packet(struct mbuf *, struct pf_mtag *, int, int);
-u_int32_t pf_qname2qid(char *);
-void pf_qid2qname(u_int32_t, char *);
-void pf_qid_unref(u_int32_t);
-struct pf_mtag *pf_find_mtag(struct mbuf *);
-struct pf_mtag *pf_get_mtag(struct mbuf *);
+extern struct pfi_statehead pfi_statehead;
+
+u_int16_t pf_tagname2tag(char *);
+void pf_tag2tagname(u_int16_t, char *);
+void pf_tag_ref(u_int16_t);
+void pf_tag_unref(u_int16_t);
+int pf_tag_packet(struct mbuf *, struct pf_tag *, int);
+u_int32_t pf_qname2qid(char *);
+void pf_qid2qname(u_int32_t, char *);
+void pf_qid_unref(u_int32_t);
extern struct pf_status pf_status;
+
+#ifdef __FreeBSD__
+extern uma_zone_t pf_frent_pl, pf_frag_pl;
+#else
extern struct pool pf_frent_pl, pf_frag_pl;
-extern struct rwlock pf_consistency_lock;
+#endif
struct pf_pool_limit {
void *pp;
@@ -1612,30 +1698,37 @@ struct pf_pool_limit {
};
extern struct pf_pool_limit pf_pool_limits[PF_LIMIT_MAX];
-#endif /* _KERNEL */
+#ifdef __FreeBSD__
+struct pf_frent {
+ LIST_ENTRY(pf_frent) fr_next;
+ struct ip *fr_ip;
+ struct mbuf *fr_m;
+};
-extern struct pf_anchor_global pf_anchors;
-extern struct pf_anchor pf_main_anchor;
-#define pf_main_ruleset pf_main_anchor.ruleset
-
-/* these ruleset functions can be linked into userland programs (pfctl) */
-int pf_get_ruleset_number(u_int8_t);
-void pf_init_ruleset(struct pf_ruleset *);
-int pf_anchor_setup(struct pf_rule *,
- const struct pf_ruleset *, const char *);
-int pf_anchor_copyout(const struct pf_ruleset *,
- const struct pf_rule *, struct pfioc_rule *);
-void pf_anchor_remove(struct pf_rule *);
-void pf_remove_if_empty_ruleset(struct pf_ruleset *);
-struct pf_anchor *pf_find_anchor(const char *);
-struct pf_ruleset *pf_find_ruleset(const char *);
-struct pf_ruleset *pf_find_or_create_ruleset(const char *);
-void pf_rs_initialize(void);
+struct pf_frcache {
+ LIST_ENTRY(pf_frcache) fr_next;
+ uint16_t fr_off;
+ uint16_t fr_end;
+};
-#ifdef _KERNEL
-int pf_anchor_copyout(const struct pf_ruleset *,
- const struct pf_rule *, struct pfioc_rule *);
-void pf_anchor_remove(struct pf_rule *);
+struct pf_fragment {
+ RB_ENTRY(pf_fragment) fr_entry;
+ TAILQ_ENTRY(pf_fragment) frag_next;
+ struct in_addr fr_src;
+ struct in_addr fr_dst;
+ u_int8_t fr_p; /* protocol of this fragment */
+ u_int8_t fr_flags; /* status flags */
+ u_int16_t fr_id; /* fragment id for reassemble */
+ u_int16_t fr_max; /* fragment data max */
+ u_int32_t fr_timeout;
+#define fr_queue fr_u.fru_queue
+#define fr_cache fr_u.fru_cache
+ union {
+ LIST_HEAD(pf_fragq, pf_frent) fru_queue; /* buffering */
+ LIST_HEAD(pf_cacheq, pf_frcache) fru_cache; /* non-buf */
+ } fr_u;
+};
+#endif /* (__FreeBSD__) */
#endif /* _KERNEL */
@@ -1647,11 +1740,15 @@ struct pf_osfp_enlist *
const struct tcphdr *);
#endif /* _KERNEL */
struct pf_osfp_enlist *
- pf_osfp_fingerprint_hdr(const struct ip *, const struct ip6_hdr *,
- const struct tcphdr *);
+ pf_osfp_fingerprint_hdr(const struct ip *, const struct tcphdr *);
void pf_osfp_flush(void);
int pf_osfp_get(struct pf_osfp_ioctl *);
+#ifdef __FreeBSD__
+int pf_osfp_initialize(void);
+void pf_osfp_cleanup(void);
+#else
void pf_osfp_initialize(void);
+#endif
int pf_osfp_match(struct pf_osfp_enlist *, pf_osfp_t);
struct pf_os_fingerprint *
pf_osfp_validate(void);
diff --git a/sys/contrib/pf/netinet/in4_cksum.c b/sys/contrib/pf/netinet/in4_cksum.c
index 1c40f2e..24a04d0 100644
--- a/sys/contrib/pf/netinet/in4_cksum.c
+++ b/sys/contrib/pf/netinet/in4_cksum.c
@@ -1,3 +1,4 @@
+/* $FreeBSD$ */
/* $OpenBSD: in4_cksum.c,v 1.7 2003/06/02 23:28:13 millert Exp $ */
/* $KAME: in4_cksum.c,v 1.10 2001/11/30 10:06:15 itojun Exp $ */
/* $NetBSD: in_cksum.c,v 1.13 1996/10/13 02:03:03 christos Exp $ */
@@ -63,52 +64,37 @@
*/
#include <sys/param.h>
-#include <sys/mbuf.h>
#include <sys/systm.h>
-#include <sys/socket.h>
-#include <net/route.h>
+#include <sys/mbuf.h>
+
#include <netinet/in.h>
#include <netinet/in_systm.h>
#include <netinet/ip.h>
#include <netinet/ip_var.h>
-/*
- * Checksum routine for Internet Protocol family headers (Portable Version).
- * This is only for IPv4 pseudo header checksum.
- * No need to clear non-pseudo-header fields in IPv4 header.
- * len is for actual payload size, and does not include IPv4 header and
- * skipped header chain (off + len should be equal to the whole packet).
- *
- * This routine is very heavily used in the network
- * code and should be modified for each CPU to be as fast as possible.
- */
+#include <machine/in_cksum.h>
#define ADDCARRY(x) (x > 65535 ? x -= 65535 : x)
#define REDUCE {l_util.l = sum; sum = l_util.s[0] + l_util.s[1]; ADDCARRY(sum);}
+int in4_cksum(struct mbuf *, u_int8_t, int, int);
+
int
-in4_cksum(m, nxt, off, len)
- struct mbuf *m;
- u_int8_t nxt;
- int off, len;
+in4_cksum(struct mbuf *m, u_int8_t nxt, int off, int len)
{
- u_int16_t *w;
- int sum = 0;
- int mlen = 0;
- int byte_swapped = 0;
union {
struct ipovly ipov;
u_int16_t w[10];
} u;
union {
- u_int8_t c[2];
- u_int16_t s;
- } s_util;
- union {
u_int16_t s[2];
u_int32_t l;
} l_util;
+ u_int16_t *w;
+ int psum;
+ int sum = 0;
+
if (nxt != 0) {
/* pseudo header */
if (off < sizeof(struct ipovly))
@@ -126,94 +112,9 @@ in4_cksum(m, nxt, off, len)
sum += w[5]; sum += w[6]; sum += w[7]; sum += w[8]; sum += w[9];
}
- /* skip unnecessary part */
- while (m && off > 0) {
- if (m->m_len > off)
- break;
- off -= m->m_len;
- m = m->m_next;
- }
-
- for (;m && len; m = m->m_next) {
- if (m->m_len == 0)
- continue;
- w = (u_int16_t *)(mtod(m, caddr_t) + off);
- if (mlen == -1) {
- /*
- * The first byte of this mbuf is the continuation
- * of a word spanning between this mbuf and the
- * last mbuf.
- *
- * s_util.c[0] is already saved when scanning previous
- * mbuf.
- */
- s_util.c[1] = *(u_int8_t *)w;
- sum += s_util.s;
- w = (u_int16_t *)((u_int8_t *)w + 1);
- mlen = m->m_len - off - 1;
- len--;
- } else
- mlen = m->m_len - off;
- off = 0;
- if (len < mlen)
- mlen = len;
- len -= mlen;
- /*
- * Force to even boundary.
- */
- if ((1 & (long) w) && (mlen > 0)) {
- REDUCE;
- sum <<= 8;
- s_util.c[0] = *(u_int8_t *)w;
- w = (u_int16_t *)((int8_t *)w + 1);
- mlen--;
- byte_swapped = 1;
- }
- /*
- * Unroll the loop to make overhead from
- * branches &c small.
- */
- while ((mlen -= 32) >= 0) {
- sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
- sum += w[4]; sum += w[5]; sum += w[6]; sum += w[7];
- sum += w[8]; sum += w[9]; sum += w[10]; sum += w[11];
- sum += w[12]; sum += w[13]; sum += w[14]; sum += w[15];
- w += 16;
- }
- mlen += 32;
- while ((mlen -= 8) >= 0) {
- sum += w[0]; sum += w[1]; sum += w[2]; sum += w[3];
- w += 4;
- }
- mlen += 8;
- if (mlen == 0 && byte_swapped == 0)
- continue;
- REDUCE;
- while ((mlen -= 2) >= 0) {
- sum += *w++;
- }
- if (byte_swapped) {
- REDUCE;
- sum <<= 8;
- byte_swapped = 0;
- if (mlen == -1) {
- s_util.c[1] = *(u_int8_t *)w;
- sum += s_util.s;
- mlen = 0;
- } else
- mlen = -1;
- } else if (mlen == -1)
- s_util.c[0] = *(u_int8_t *)w;
- }
- if (len)
- printf("cksum4: out of data\n");
- if (mlen == -1) {
- /* The last mbuf has odd # of bytes. Follow the
- standard (the odd byte may be shifted left by 8 bits
- or not as determined by endian-ness of the machine) */
- s_util.c[1] = 0;
- sum += s_util.s;
- }
+ psum = in_cksum_skip(m, len + off, off);
+ psum = ~psum & 0xffff;
+ sum += psum;
REDUCE;
return (~sum & 0xffff);
}
OpenPOWER on IntegriCloud